ZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCA3OTNjYmY0Li5lNTg0ZmZiIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC04MSw2ICs4MSw3IEBACiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X3htbHBhcnNlckAxLjAuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X3NvZnRfKikKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvdm5kay9saWJzdGFnZWZyaWdodF9zb2Z0XyopCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlnKikKIAogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCmRpZmYgLS1naXQgYS9hcGV4L0FuZHJvaWQuYnAgYi9hcGV4L0FuZHJvaWQuYnAKaW5kZXggNTc1NjAzZi4uMGE5NTUxZCAxMDA2NDQKLS0tIGEvYXBleC9BbmRyb2lkLmJwCisrKyBiL2FwZXgvQW5kcm9pZC5icApAQCAtMTIsMjUgKzEyLDkzIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorYXBleF9kZWZhdWx0cyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIiwKKyAgICBqYXZhX2xpYnM6IFsidXBkYXRhYmxlLW1lZGlhIl0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorICAgIG11bHRpbGliOiB7CisgICAgICAgIGZpcnN0OiB7CisgICAgICAgICAgICAvLyBFeHRyYWN0b3IgcHJvY2VzcyBydW5zIG9ubHkgd2l0aCB0aGUgcHJpbWFyeSBBQkkuCisgICAgICAgICAgICBuYXRpdmVfc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAvLyBFeHRyYWN0b3IgcGx1Z2lucworICAgICAgICAgICAgICAgICJsaWJhYWNleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJhbXJleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJmbGFjZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibWlkaWV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm1rdmV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm1wM2V4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm1wNGV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm1wZWcyZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlib2dnZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlid2F2ZXh0cmFjdG9yIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGJvdGg6IHsKKyAgICAgICAgICAgIG5hdGl2ZV9zaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgIC8vIE1lZGlhUGxheWVyMgorICAgICAgICAgICAgICAgICJsaWJtZWRpYTJfam5pIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgfSwKKyAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5rZXkiLAorICAgIGNlcnRpZmljYXRlOiAiOmNvbS5hbmRyb2lkLm1lZGlhLmNlcnRpZmljYXRlIiwKKworICAgIC8vIFVzZSBhIGN1c3RvbSBBbmRyb2lkTWFuaWZlc3QueG1sIHVzZWQgZm9yIEFQSSB0YXJnZXRpbmcuCisgICAgYW5kcm9pZE1hbmlmZXN0OiAiOmNvbS5hbmRyb2lkLm1lZGlhLWFuZHJvaWRNYW5pZmVzdCIsCit9CisKIGFwZXggewogICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYSIsCiAgICAgbWFuaWZlc3Q6ICJtYW5pZmVzdC5qc29uIiwKLSAgICBuYXRpdmVfc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgLy8gRXh0cmFjdG9yIHBsdWdpbnMKLSAgICAgICAgImxpYmFhY2V4dHJhY3RvciIsCi0gICAgICAgICJsaWJhbXJleHRyYWN0b3IiLAotICAgICAgICAibGliZmxhY2V4dHJhY3RvciIsCi0gICAgICAgICJsaWJtaWRpZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1rdmV4dHJhY3RvciIsCi0gICAgICAgICJsaWJtcDNleHRyYWN0b3IiLAotICAgICAgICAibGlibXA0ZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1wZWcyZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm9nZ2V4dHJhY3RvciIsCi0gICAgICAgICJsaWJ3YXZleHRyYWN0b3IiLAotICAgICAgICAvLyBNZWRpYVBsYXllcjIKLSAgICAgICAgImxpYm1lZGlhMl9qbmkiLAorICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIl0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLWFuZHJvaWRNYW5pZmVzdCIsCisgICAgc3JjczogWyJBbmRyb2lkTWFuaWZlc3QtbWVkaWEueG1sIl0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtYW5kcm9pZE1hbmlmZXN0IiwKKyAgICBzcmNzOiBbIkFuZHJvaWRNYW5pZmVzdC1zd2NvZGVjLnhtbCJdLAorfQorCithcGV4X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1kZWZhdWx0cyIsCisgICAgYmluYXJpZXM6IFsKKyAgICAgICAgIm1lZGlhc3djb2RlYyIsCiAgICAgXSwKLSAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5rZXkiLAorICAgIHByZWJ1aWx0czogWworICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMucmMiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1sZC5jb25maWcudHh0IiwKKyAgICAgICAgIm1lZGlhc3djb2RlYy5wb2xpY3kiLAorICAgIF0sCisgICAgdXNlX3ZlbmRvcjogdHJ1ZSwKKyAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmtleSIsCisgICAgY2VydGlmaWNhdGU6ICI6Y29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5jZXJ0aWZpY2F0ZSIsCisKKyAgICAvLyBVc2UgYSBjdXN0b20gQW5kcm9pZE1hbmlmZXN0LnhtbCB1c2VkIGZvciBBUEkgdGFyZ2V0aW5nLgorICAgIGFuZHJvaWRNYW5pZmVzdDogIjpjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWFuZHJvaWRNYW5pZmVzdCIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbWVkaWFzd2NvZGVjLnJjIiwKKyAgICBzcmM6ICJtZWRpYXN3Y29kZWMucmMiLAorICAgIGZpbGVuYW1lOiAiaW5pdC5yYyIsCisgICAgaW5zdGFsbGFibGU6IGZhbHNlLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWxkLmNvbmZpZy50eHQiLAorICAgIHNyYzogImxkLmNvbmZpZy50eHQiLAorICAgIGZpbGVuYW1lOiAibGQuY29uZmlnLnR4dCIsCisgICAgaW5zdGFsbGFibGU6IGZhbHNlLAorfQorCithcGV4IHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgbWFuaWZlc3Q6ICJtYW5pZmVzdF9jb2RlYy5qc29uIiwKKyAgICBkZWZhdWx0czogWyJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWRlZmF1bHRzIl0sCiB9CiAKIGFwZXhfa2V5IHsKQEAgLTM4LDMgKzEwNiwxOSBAQAogICAgIHB1YmxpY19rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5hdmJwdWJrZXkiLAogICAgIHByaXZhdGVfa2V5OiAiY29tLmFuZHJvaWQubWVkaWEucGVtIiwKIH0KKworYXBleF9rZXkgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmtleSIsCisgICAgcHVibGljX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuYXZicHVia2V5IiwKKyAgICBwcml2YXRlX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGVtIiwKK30KKworYW5kcm9pZF9hcHBfY2VydGlmaWNhdGUgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5jZXJ0aWZpY2F0ZSIsCisgICAgY2VydGlmaWNhdGU6ICJjb20uYW5kcm9pZC5tZWRpYSIsCit9CisKK2FuZHJvaWRfYXBwX2NlcnRpZmljYXRlIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5jZXJ0aWZpY2F0ZSIsCisgICAgY2VydGlmaWNhdGU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKK30KZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZE1hbmlmZXN0LW1lZGlhLnhtbCBiL2FwZXgvQW5kcm9pZE1hbmlmZXN0LW1lZGlhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QzZjNhCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9BbmRyb2lkTWFuaWZlc3QtbWVkaWEueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhIj4KKyAgPCEtLSBBUEVYIGRvZXMgbm90IGhhdmUgY2xhc3Nlcy5kZXggLS0+CisgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIiAvPgorICA8dXNlcy1zZGsKKyAgICAgIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjgiCisgICAgICBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI4IgorICAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZE1hbmlmZXN0LXN3Y29kZWMueG1sIGIvYXBleC9BbmRyb2lkTWFuaWZlc3Qtc3djb2RlYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyMGRjMAotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvQW5kcm9pZE1hbmlmZXN0LXN3Y29kZWMueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiPgorICA8IS0tIEFQRVggZG9lcyBub3QgaGF2ZSBjbGFzc2VzLmRleCAtLT4KKyAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiIC8+CisgIDx1c2VzLXNkaworICAgICAgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyOCIKKyAgICAgIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjgiCisgIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wazggYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBrOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY3NDFlCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wazgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5hdmJwdWJrZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1OTcyMwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5hdmJwdWJrZXkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3OWNkMwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wZW0KQEAgLTAsMCArMSw1MSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJSktnSUJBQUtDQWdFQXZCNmxPRUVPUjU4S01jRmxheUVaanNYdVBnY2ZIaS9PUHhjdmZwaUdMQ3BPY0szbAorT1BDaFdVdkRSY0lITUI3Qk8rQ3NmeHMwSGdzSHZ2WmZOeW9OSW05OVdjakZiYm9pTzdXckJCQXJJc3pQcjE0WAorY2ZZMk54elQ5TEJqK0VxQW5iZEwrNE9RVzEvbnBMSE5FMHF0RGN4TDcxaXBialN1S05iNThFOXFHTDBLd3ZrUworZnd3dWVXaisrYmcvaXo3ZHEwbXo3aUtwbnhZc2NObTRSaEpqcWNHMlVzbWc0RWpocjhoNVVtT1VtVEpiT2JDLwordnpDbFhRcWVldXpTOE5UdEdWZ1EvQ0k5Z0MyV045dXBxMnAvMlQ3UDRVM28zQ1d2Qnl0VW9MS1IwVXlDODNleQorUzhYSmdPYTQydVdSM1QvZUpPSTFaUzRINlNyZzFvMlhDOFliOEVwckZJL05NNi8rLzVEWC9GZ0RpbXNzbEFQNgorUXE0K3BTdGU5di9GaldHcXk3UUJRYWVmRlJHUnVTNjN4SGNTWmhYQzlKMkNGZG54bzgrNjVRVDhyNHlmUUVlaQorQXgvMFE5NHlCN1ZJTDFwSUp4SEVvbktqdGQzaUtkRkVLUXpBREozZWRzbXRIeWJFUmRKS0N4Y205UUlyRENzQworNFlWVDluWDBPb0M5UkQ1ZDVFVkQ3VzVJNmVFblJ1NmlncktJS2dVVnBwZVlGUU5aRCtvK2VpTkphNHlvZ2dSbAoraDhzVDAveExLak1SeEFRN2ZhZmkxaitMQjJPN1VnSm1JRERBbmlkcThBb3o3aDNwTmkxMzlyTldyak5md2h1cworbk1jWnZMOWRUVnYyNkpXZUVTSFAvekFmQVg3ajFyZmtEd1IwMm9jUkxxdXdFVXMxK1VIQTI3V2kxYk1DQXdFQQorQVFLQ0FnQU8zUFQ4M3RiNy9hcldoNHMxemFXeFRCNG90SE5XOVR2OGJCNktpQTZCeXMzcnhUR0pNQ252WGpjTgorZWVrTGVrS1dNb2d1ZXIzQmFlbXd3dEovRDBsK1lRU3NaVnFEOHVMbGlOTDhQVExMU3hkVnFiOThkNUdOQlRBUgorOHlYUzVrQUhOZ1pBMXdJKzFmTDlaamJud1V5dS9HYzdmK3ZURTBKM1k1VFgwYzUyS2VtQndpQWQvWjVtWlU5UAorOTZpOW5iZng0cDdldjhwYkVXdHRkeVpDRXczZ3liZFlEeW93emxGV2pDWlp4aGhsaWo3KzdlSVlmd1Z4dG5jVAorQzBjWFZCdHZseSt3WEJ3ejFtWTUvNWNHUGlIZnprQ3FjbmRsZld5NHlrbWpjTGhvcXZ6bHM1MVlzMFhhYzJCRAorbTBQTkVWREI1VVdHdXY1UkE5eEQxMmdKdkJ0VTNEN2dnTXc2QzVSY1hKVCtqU1ltU0Z0RDJrbFdpK0l0OEEvTgorSHY0MnNvS3NrdDZKcVlBV0UxY3ZKM1BFcUg5QVNFSk5xMlIwWi9QbXVNMDAwVUp5elU5S0lkM1NOd2pYQTFYYworS245aFJnYTR1ZjllbEhUamtURHQ3OS84K1h2N2hqZXI5c0YvUy9ucDdnMDRyVWpJV2t1RmtDLzdOSzJ0UVNoMQorbWxqVjFzRDlTRjREUGZWSzc1THdKSmFRVWxJN1R0R2Q1S0o3Rnpad3ZiK3c4T0RycFczaGt0NkZjSTZLd0UvYQorUVQxVDJaOURrblhKU1lOZFdHcmo2dk1Ic1lNaXl6OElkQUhTQ3JPQjZlWENReHBpdGJuNlc3MVJhdzdmOVVhWgorVkRLNUFoVFU0OTNoa0dqMW5vNGNKd2VjWEluTWlnZy9jNHl3azJJYmg2SVY4TzBua1FLQ0FRRUEyK2RRUTBJRgordnZWZ21RMld4SEJEN00ybWJPeWY0M1lCWTZLYTZvUEJOR1BWcFpFOFg4TG9UYXZRTFYrU2dDa0g4VDZnWTdYUworNUw0WmUwSkZ4ZnVhMG8xcm02K0wyWHJPeDVGL0EyWTQwWWNQY2xFaWs1aDF3b1N3SC9KMWlIR2lFaFk4TnFldQorOUdDdmpRb2prZ1h4L1JuM056K2xwdlozMjlPM0g4NVJXV0dGMGw2MFJ3TE9raWcwWndVYjYxOXQ4YWZmbUdJbAorc3hkRHYybmZ5N090Slg4aUdEdWE3S2Y2NGR2VldRS0t0QUNXa0FScmxrY1dYM3VvRVN4a3BTRHh1ZSt6N25kSAorbzd1SExmTThUeCtSbitRdllXdVJXNVRQTGJFRE1iSVlyWDY1SVN0MnIvVDd2LzA0WGRBQzhZcENRUnl0bHFQSQorZnBEbTE1aHR5SEJpelFLQ0FRRUEydis1b3RSb1k1NkpkdUlTYVZHbHNKL0lidkt6REFJeVdtTTE0RXBSQ1I1RQorbHUrTXBUY1JBaUZRQWJIR1hyMXRNbFRGZFZGRDA5MFdBeklLYUt0QURGVkxYb2JJSGVHc3BuUkNxNU9wVnA5VworUnZMdFZ3THhmbEhBYzJ5TjkvTE50bkJxSFVndCtTMDFMQlBFbHliZEdIUVJUdHFBS1hoa3AzMXNNMjFPMzRHbworUHJpL0l4Z3VwV3h5a01hVzQ0S2lnMUNyNURLdmM4Y3dVc0d1eURkSm04b0JRZU5QVE1XcVNuWHRxb1RXU2FZZworMmt4aU1URm9rcmtTWGd1ZmI4d25nNk9YdC9RZWx5d3JoRzNoQXNsZFBPM0dkS2lkRFN4aFdaU2dwVVhYRmRBWAoreTRHTzBJY1JKQkYvV0p0WVRZdFIrbDg0blFBMi8xWWU0dWpGbFQwYWZ3S0NBUUVBbVhyWHBTbTJjdkkyQ256VworaHFKSWRrV09hNlczYm4xVk9PSXJ0NVJmeTU0R1pubDRwdW1WVTJpZ2NwcXEySEpLemRERkJ2TEhqOGt5WmJuNgora3RVcDJOekZoeks5cS91dnlOQSswdk9Nb29qZWVnNHcwTXp2RytXYU82SHc4RnRISDlLUEVpSjAxTEdLdFNpbgorYk9walhDQzhUNzVIY3NIQkpCZWZUejZqdm50M2VEMkxHNmpVM21QYk55LzByWkc4WFphcVUyUGxKaHNOdU5JLworVmFCQkw5T015MWNHcVRnUXZZUytZbEtJMWxzMnVxdXJINGJjRWFadnhoU3k1aUdaTlFvZERrb0lJVG5vZm1TdQorNmhhQmdCUTJFWXVQTjFra1JLS3dOUVkxZlJuZVFrMWdtQ3luYlBkaVdPK3Vya0N1UDEyeHRscjN1NGFNNTFyRworL01lYjNRS0NBUUVBMTJTeFptOVhoTE9ITElCSjc0QTRZTEdtNTBpWnhYUGJwbjd4bkhvN25hWkJlOXA4RUh0SworcFRleWd4Z2dyVW5PUHJTVnlUOTJZTWlRUC9CVndJQythK0x3VURac1dNZC9rZS9ES3hIK2VZNFp3NHBtMlMreAorNmJYcWZSd0Z2aHIzTFRyL2czRmNsamxhbE5HVWg3M1hzNWRrOXBOOWZreEZZMTYrcnc0UmgwNzA5VXVyNG82RQorUW51WmFyK0g1SmkxMGtYajZudlhpUjRlYnliRUMzUWxWNjZrOGZMcUtlNDRBU2hmNjFqZmtteHMzNGhGQTNFLworRXlBbjZvdXY4cnR2R2RBckJ1aDV0ZUhobzB5WEJMQ2NuYktYZ0dIZXBmaENmMkxwWmVSOUdaMGo2aXF4Rm5QaAorN2dHdnFLeVJleU5PSzl5L3g5dFFQRzZ0eml0M09jTnhiUUtDQVFFQXVEaGVET1NrWFBvcFhNdkxBS09IQklkWgorcmJRN29GVERIdDU5Z2J1Y003VTgvbDJZdGF4dUtPUUZCTG56UWEvYW1Ja2tydGtsWXdPc3o4RTI0ZDdObTM5dworeWtMSHdYMFhybWpBbTZNNFhLbUR2NjZhK2tTblNWNkxFYktaZGp2WFAwMkRWK3RHZVo1VnNuTnZKRHF1eE1zRAorZnZSVHNwQjhqOENwVTk2c3pla3hsL3RDUmhxYmR3LzRrVlRTajVCRisrT2FSUmNKckF5ajFCMnFmMXluQVpFMQorZ1V2VlBrRVlhOTE0emNyeGc5WElYVDRNN3lxQjdpOEtKZWdPdE90Y1dqSjd1VGlQKzYzOEF2eWdKTE1KblNyVgorK0hqRlpXRzZQOWJ0Wm1MSFNFQlJ2d0dPQWlscDBxZWpYbzg2NmwwZm1ubEd5N2VoS3o4dTNQenZubFBZalE9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wazggYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGs4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTQyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGs4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy54NTA5LnBlbSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I5YjRmCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLng1MDkucGVtCkBAIC0wLDAgKzEsMzQgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRjNqQ0NBOGFnQXdJQkFnSUpBSU03MkpwRDR2NlhNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0NNUXN3Q1FZRAorVlFRR0V3SlZVekVUTUJFR0ExVUVDQXdLUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlRXOTFiblJoYVc0ZworVm1sbGR6RVFNQTRHQTFVRUNnd0hRVzVrY205cFpERVFNQTRHQTFVRUN3d0hRVzVrY205cFpERWlNQ0FHQTFVRQorQXd3WlkyOXRMbUZ1WkhKdmFXUXViV1ZrYVdFdWMzZGpiMlJsWXpBZ0Z3MHhPVEF5TVRFd01qRXhNVEZhR0E4MAorTnpVM01ERXdOekF5TVRFeE1Wb3dnWUl4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eQorYm1saE1SWXdGQVlEVlFRSERBMU5iM1Z1ZEdGcGJpQldhV1YzTVJBd0RnWURWUVFLREFkQmJtUnliMmxrTVJBdworRGdZRFZRUUxEQWRCYm1SeWIybGtNU0l3SUFZRFZRUUREQmxqYjIwdVlXNWtjbTlwWkM1dFpXUnBZUzV6ZDJOdgorWkdWak1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBc3FYRTBBSVdwTFc5VGdxMgorblFHcGg3S1o2TDJROW94dmlxQ1ZIeElhUHFmaE0yU3dUYnljQURJUWVxcnJsUnhoZGRWa2pMdU1Va0phN21ldgorZkVSbWdwaU9mblBJbEdLNlBUczJnbGpDa3NrWmhGM2JnZmV5dUh0MHRzWU8rVWFOOE1Wb1pENy9RZGlFNDZ3MgorT01EQ2xHMVVxZ2lxT0JoTFRFTi9jSFhPYm5VaWlWWFVZcU44YVlaZjZMNkZzM3lRaTJaWmdmYnhUVkZld3FkdgorYUxMT3FDWW5WWVhaSCtaeGJYRVNBME0rV1hLZ1JLc1lUajJHWXMzZWtvMXJGaTRZNnVIVkx4NDV5YW9UNXUvaQorU3hQRWtvY3lNQ0t2R0pXdTRYbFNPZDNFalNPTWFxQ09ZVnlHTHhkbG5RV1FVN1BaRHFCU0owU3lzV2dwRkhwQgorSTE1YzJqaFJkWE9DZlE5WnREZlBaa0UwYTJBOGtKREFvRjFtelRwNkl2QkFXVXNsNW5IUHc1Q1drRnBOYWQvaAordHFxR0NTY1diaUtadXZyUTQvUlFObTNmMUsrbXhYOVRyakZpZ3BxTk82ZDRwR0FvMWZhNnNIUjN4V1B3L215cQoraDVaSmpWblhVNVlxNjRTNHhXT3NzZmpwT2c3UmZOdXZ6dWszb2szTVlzMW1ieDN2aFpPajVrbTFmM3FyZ1g5YworbVhqWW55WEQwakpCbTR1QUpXWExkSzlQbFp2bFhienRNQ3pZajgzMklvNHBGTEN0U3hrelg3NXQxZW0zNk52MAorbU5wNk50U1N5NlNGU3E4bDdJc1hWMkZOeVVpeUhXeFMvVVFtOHBZZzVRNWRXSHZFRUY3OFA2bFYwd1JhNkZRbAorQkJTZ3BxVEFJMDkyS0lqRER0QjdHUUNnVjVFQ0F3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZBRklkRlRERURmdAorZXdTU0FTN0ZhM09aNVRYek1COEdBMVVkSXdRWU1CYUFGQUZJZEZUREVEZnRld1NTQVM3RmEzT1o1VFh6TUE4RworQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQzVlM3pYeXRoSkNHbXoxRm1BVgorOFkvVUkrR2xnNkcweC9rMDRXYVJHMERQTExqbEoxRjBMTTEvSVJlQlNnWGNZQUwwQ0FnUHljZi9yR1BPZ01GbQordFF4WXlqQlV4S2RqcElxVTVESm9WMWZlYW5HdmVJUnB0bzFZUktOZ0h1ekc5clpHUjRBZ1BudDZYNFl4bHEwNAorbEk3UXBXYWRYZTFteUFSSmhqM25pU05ZOSsyd0VJbmt4NFp1Q08xTHRJR3FuYmRjOGpROFlvVnFJRTVONGt1TQorY2N5UFlnc2RBQnRvcGJqTjkycnVldThzZkY4UjZST3krdE5nYjZPanBBQWV2dG5CZloyTFhxZk9iS2lySENLKworazZ3NFdTQjFVVW9aM1hnejhzSnRYZ29rdlllSW5rTjh0SHVUYWdIWVUyVlFUY0EwcmRCR01OLzFPbGpKcFdsTgorMFVVcTRmQVlVNmNONGxIeHIyTE05SWY0V3ZBemRMQVd2YUlackRxYVU0aS96WVQ5bDZyUjRsQzJLVzNFSFdvdgorblBYZmdFSko4QVAxaVJHaWJ2ZXczaTNTQjZYVFdGUVlUVUlCZUpmRHovS0RYUWFiUCt5elhXSVNkWkNVTVVweAorZitSYXFzYjVNb0thSmRWZ25TTDBtQnVuakN5SkR6emczNEo3b0d4Ni9CbndvaU9yd0xONFFhejVVOGpiclBTeAorcDlMZmxlQ2NPN1pkZUU4R0txeDBYMVQ0ZDd0cmFkdG14T1M4SXdyNG5pc2trSEdSa3pvenZWdnV5R0ttb04yaworMTYyVmZqcStkZGo3cUVwU2gzQlM2aEhVK3ZsTWJDOUwwdHJHeFB4RkVBSERyd3UwS3dHTmR1VGtpdS8zanZmQgorSlRnSDhQOW1EMWxvWXhSZG8rdmV0OGVRCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLng1MDkucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzkwOGZhCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS54NTA5LnBlbQpAQCAtMCwwICsxLDMzIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZ6RENDQTdTZ0F3SUJBZ0lKQU8wNURCQnVzYWFMTUEwR0NTcUdTSWIzRFFFQkN3VUFNSG94Q3pBSkJnTlYKK0JBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SWXdGQVlEVlFRSERBMU5iM1Z1ZEdGcGJpQlcKK2FXVjNNUkF3RGdZRFZRUUtEQWRCYm1SeWIybGtNUkF3RGdZRFZRUUxEQWRCYm1SeWIybGtNUm93R0FZRFZRUUQKK0RCRmpiMjB1WVc1a2NtOXBaQzV0WldScFlUQWdGdzB4T1RBeE1qVXhOekUzTVRkYUdBODBOelUyTVRJeU1URTMKK01UY3hOMW93ZWpFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ01Da05oYkdsbWIzSnVhV0V4RmpBVUJnTlYKK0JBY01EVTF2ZFc1MFlXbHVJRlpwWlhjeEVEQU9CZ05WQkFvTUIwRnVaSEp2YVdReEVEQU9CZ05WQkFzTUIwRnUKK1pISnZhV1F4R2pBWUJnTlZCQU1NRVdOdmJTNWhibVJ5YjJsa0xtMWxaR2xoTUlJQ0lqQU5CZ2txaGtpRzl3MEIKK0FRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQW1Oa1Z4VWJwL2JMYmVHYnZLcVlYendCeWNTRHBtT2hoLy8vbE5HWVEKKy9BTVVEMHE2RWFaelUyYmQ0YUwwck9HcWZvWWxoS2Qwa01WbU1VbWZkRTlPREFmS3hsZUVlRWFSbDJHSlM4YTkKK0FCaTc3MGwzR0hiQjJ4TUkyc0VXZU9EOXhzUEZGNitCeVBabW9VdU5oTXI0cFViWHNEcEUzaDhsanJnWEh0SWcKK2JoN29mYnZkZHJ1d0JWMGxTMWs5T1o5alBWR2hFS2tKbmhnUWE2N2N3Z2RqaXpBTWJJMERjejlndE1NYXdzRGoKK1oyYVFkMXIrdnhnaDEvWGtJL05NbVhDbkcyRVJ5dFhjSmVDNVM0Z0V0SGZUVFBvUDBGdVZnU0I2eTZkYWxNdVoKK0YwTkJadzhNdmdkeTNRSmlwMHVOYTM2SjYzQ01aS1RKV2JUZGxGcFBMMmhrMFBnYVl2amU4QzVYdGs1Mjgyd1QKK2RNb2NjOG4yeklYYnpiblNYR3ZqY05aaWIzUGZ1NTVZVW5YNmVUcVoxQnhsSjBGSFpBc0M0cXVGRldYeFlCWUQKK0xDUm9OTkZFdElEUXB1dnVIRjJEdUhORFVMcEFRankyeTYrN2VvdDBLRXNWb0RtWjRIOEJwdUFWVnUyU3hZTmIKK2dZZmxSOVNtTTB0bVllQWNSVDQ4cTN4cm9jR3lFSE1xdmdRUlVwUGZ2Y3QvOGw4eFZjRHpPSS9zSlZEcW1Zek0KK3UwQ2ozZmtTeXBHREpPTUYvZXNGU21Wdm9JMDF0UzdrYU5TNXZ2dEtZaWIvL3hxS1JDOWYwZENzR2ZGTG51VUsKK280S1liWVdZd015SnFFZC81L1p2WHlLSVBBRWVKTDE3NEw5K3dUa2MzY1Fwb0J3Sk40dCsyRTVNbmhPRXE2ZG8KKzVMMENBd0VBQWFOVE1GRXdIUVlEVlIwT0JCWUVGSGpOSy9HWmtvMVJkWnArOGlhdldYTDV4ejl3TUI4R0ExVWQKK0l3UVlNQmFBRkhqTksvR1prbzFSZFpwKzhpYXZXWEw1eHo5d01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUoKK0tvWklodmNOQVFFTEJRQURnZ0lCQUNtUFFNa3N1THJOVjF2Ykk0NFMxZjcwSTBGSGRCeGNoRkdCMzl6dUxiY24KK1NzWW9tL0xQdFlKaUQwRGw0YkI0ZWIrWm54a1FQMlhlUDZweWNtVUgyajFFV2V4Rnd2ZFV2bGZlOFF6K3dBZWMKK2FwNEF4aVg0WjJLZTJpdllvdElaRlVIZFpPTGtYMjBqczhXZXgxbXpZNDNNTFFuNUFQbDlnSzFWWlR4RGdnZVIKK0VPYkgxUytKVmpHd1FxWVpqMmU2Z05aSDM0UTI1TlE2OThSTDg1R0RrWXRTSVNBaWZKdGFKc1UvQjN2S204MkkKK2s5eE1pQ29vQ0g2YlJkR0hHMWp6ZTRTUnBpZGp4RW04Y3hraWFRYWdmY3VYZUNMemlYSnIzcUFNS1lpRVk2YnAKKzArYkFxQ3QzUzhPcnJOM1JRWmZRcm5sd2l0c00xakpKLytDK1dvRGc0ZVk1QUZyWERMdk5lS2gxcU8vZjh4disKK2ZDWGtRUGNWVnBoTGZSSDlveE5yU2dPV0JQNS9xSURINHMxWVVMOWx1R1Q2SCswOGRsdWUzUmtiekRiQnFzUXUKKzdmUS9CYnJJRy9HdVZLZ3lFTSthN0M5Z3Y3emM4NllsdWVWWUpFeXhLaWRubjdSeE9xeURCcXl5ZlhBM3p2bWUKK1Jybzd4SXJNSFBMN051M0FXandqWHpicC93MHordEVGUHNmVkIrT09IS3NXUGNVRzBIVVRKR2t5ZU8vdUhSak4KK3FQRWtrZjdCSEhVTzRWMmdqT0lkQ3NFTHhLd0hmN3ZzWlRPazQwRVY3NTFmWjdGREhNcjFlZGRRa2dINGVxQWIKK0RCNzl1UCtTTGZVbys0Mm40cTZlTW1vcXc4ZDc2YkJYUm9VaElvL01zNHNlYmhWMHNSdEFTNjdPUWlvYzlVVWcKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvbGQuY29uZmlnLnR4dCBiL2FwZXgvbGQuY29uZmlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQyMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC9sZC5jb25maWcudHh0CkBAIC0wLDAgKzEsNzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgQmlvbmljIGxvYWRlciBjb25maWcgZmlsZSBmb3IgdGhlIG1lZGlhIHN3Y29kZWMgQVBFWC4KKyMKKyMgVGhlcmUgYXJlIG5vIHZlcnNpb25lZCBBUEVYIHBhdGhzIGhlcmUgLSB0aGlzIEFQRVggbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQKKyMgaGF2aW5nIHNldmVyYWwgdmVyc2lvbnMgbW91bnRlZC4KKworZGlyLnN3Y29kZWMgPSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi8KKworW3N3Y29kZWNdCithZGRpdGlvbmFsLm5hbWVzcGFjZXMgPSBwbGF0Zm9ybQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICJkZWZhdWx0IiBuYW1lc3BhY2UKKyMKKyMgVGhpcyBuYW1lc3BhY2UgaXMgZm9yIHRoZSBiaW5hcmllcyBhbmQgbGlicmFyaWVzIG9uIHRoZSBzd2NvZGVjIEFQRVguCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK25hbWVzcGFjZS5kZWZhdWx0Lmlzb2xhdGVkID0gdHJ1ZQorbmFtZXNwYWNlLmRlZmF1bHQudmlzaWJsZSA9IHRydWUKKworbmFtZXNwYWNlLmRlZmF1bHQuc2VhcmNoLnBhdGhzICAgICAgPSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLyR7TElCfQorbmFtZXNwYWNlLmRlZmF1bHQuYXNhbi5zZWFyY2gucGF0aHMgPSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLyR7TElCfQorCisjIEtlZXAgdGhlIGJlbG93IGluIHN5bmMgd2l0aCAic3BoYWwiIG5hbWVzcGFjZSBpbiBzeXN0ZW0ncyAvZXRjL2xkLmNvbmZpZy50eHQKKyMgQ29kZWMyIGhhcyBkZXBlbmRlbmNpZXMgb24gc29tZSBTUC1oYWxzIChlZy4gYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wKQorIyBUaGVzZSBhcmUgZGxvcGVuJ2VkIGJ5IGxpYnZuZGtzdXBwb3J0LnNvLgorbmFtZXNwYWNlLmRlZmF1bHQuc2VhcmNoLnBhdGhzICs9IC9vZG0vJHtMSUJ9CituYW1lc3BhY2UuZGVmYXVsdC5zZWFyY2gucGF0aHMgKz0gL3ZlbmRvci8ke0xJQn0KKworbmFtZXNwYWNlLmRlZmF1bHQucGVybWl0dGVkLnBhdGhzICA9IC9vZG0vJHtMSUJ9CituYW1lc3BhY2UuZGVmYXVsdC5wZXJtaXR0ZWQucGF0aHMgKz0gL3ZlbmRvci8ke0xJQn0KK25hbWVzcGFjZS5kZWZhdWx0LnBlcm1pdHRlZC5wYXRocyArPSAvdmVuZG9yLyR7TElCfS9odworbmFtZXNwYWNlLmRlZmF1bHQucGVybWl0dGVkLnBhdGhzICs9IC9zeXN0ZW0vdmVuZG9yLyR7TElCfQorCituYW1lc3BhY2UuZGVmYXVsdC5hc2FuLnNlYXJjaC5wYXRocyArPSAvZGF0YS9hc2FuL29kbS8ke0xJQn0KK25hbWVzcGFjZS5kZWZhdWx0LmFzYW4uc2VhcmNoLnBhdGhzICs9ICAgICAgICAgICAvb2RtLyR7TElCfQorbmFtZXNwYWNlLmRlZmF1bHQuYXNhbi5zZWFyY2gucGF0aHMgKz0gL2RhdGEvYXNhbi92ZW5kb3IvJHtMSUJ9CituYW1lc3BhY2UuZGVmYXVsdC5hc2FuLnNlYXJjaC5wYXRocyArPSAgICAgICAgICAgL3ZlbmRvci8ke0xJQn0KKworbmFtZXNwYWNlLmRlZmF1bHQuYXNhbi5wZXJtaXR0ZWQucGF0aHMgID0gL2RhdGEvYXNhbi9vZG0vJHtMSUJ9CituYW1lc3BhY2UuZGVmYXVsdC5hc2FuLnBlcm1pdHRlZC5wYXRocyArPSAgICAgICAgICAgL29kbS8ke0xJQn0KK25hbWVzcGFjZS5kZWZhdWx0LmFzYW4ucGVybWl0dGVkLnBhdGhzICs9IC9kYXRhL2FzYW4vdmVuZG9yLyR7TElCfQorbmFtZXNwYWNlLmRlZmF1bHQuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC92ZW5kb3IvJHtMSUJ9CisKK25hbWVzcGFjZS5kZWZhdWx0LmxpbmtzID0gcGxhdGZvcm0KKworIyBUT0RPOiByZXBsYWNlIHRoZSBmb2xsb3dpbmcgd2hlbiBhcGV4IGhhcyBhIHdheSB0byBhdXRvLWdlbmVyYXRlIHRoaXMgbGlzdAorIyBuYW1lc3BhY2UuZGVmYXVsdC5saW5rLnBsYXRmb3JtLnNoYXJlZF9saWJzICA9ICVMTE5ES19MSUJSQVJJRVMlCisjIG5hbWVzcGFjZS5kZWZhdWx0LmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgKz0gJVNBTklUSVpFUl9SVU5USU1FX0xJQlJBUklFUyUKK25hbWVzcGFjZS5kZWZhdWx0LmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgPSBsaWJFR0wuc286bGliR0xFU3YxX0NNLnNvOmxpYkdMRVN2Mi5zbzpsaWJHTEVTdjMuc286bGliUlMuc286bGliYW5kcm9pZF9uZXQuc286bGliYy5zbzpsaWJjbGFuZ19ydC5hc2FuLWFhcmNoNjQtYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5hc2FuLWFybS1hbmRyb2lkLnNvOmxpYmNsYW5nX3J0Lmh3YXNhbi1hYXJjaDY0LWFuZHJvaWQuc286bGliY2xhbmdfcnQuYXNhbi1pNjg2LWFuZHJvaWQuc286bGliY2xhbmdfcnQuYXNhbi14ODZfNjQtYW5kcm9pZC5zbzpsaWJkbC5zbzpsaWJmdDIuc286bGlibG9nLnNvOmxpYm0uc286bGlibWVkaWFuZGsuc286bGlibmF0aXZld2luZG93LnNvOmxpYm5ldXJhbG5ldHdvcmtzLnNvOmxpYnN5bmMuc286bGlidm5ka3N1cHBvcnQuc286bGlidnVsa2FuLnNvCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgInBsYXRmb3JtIiBuYW1lc3BhY2UKKyMKKyMgVGhpcyBuYW1lc3BhY2UgaXMgZm9yIGxpbmtpbmcgdG8gTExOREsgYW5kIEFTQU4gbGlicmFyaWVzIG9uIHRoZSBzeXN0ZW0uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK25hbWVzcGFjZS5wbGF0Zm9ybS5pc29sYXRlZCA9IHRydWUKKworbmFtZXNwYWNlLnBsYXRmb3JtLnNlYXJjaC5wYXRocyA9IC9zeXN0ZW0vJHtMSUJ9CituYW1lc3BhY2UucGxhdGZvcm0uYXNhbi5zZWFyY2gucGF0aHMgPSAvZGF0YS9hc2FuL3N5c3RlbS8ke0xJQn0KKworIyAvc3lzdGVtL2xpYi9saWJjLnNvLCBldGMgYXJlIHN5bWxpbmtzIHRvIC9hcGV4L2NvbS5hbmRyb2lkLmxpYi9saWIvYmlvbmljL2xpYmMuc28sIGV0Yy4KKyMgQWRkIC9hcGV4Ly4uLiBwYXQgdG8gdGhlIHBlcm1pdHRlZCBwYXRocyBiZWNhdXNlIGxpbmtlciB1c2VzIHJlYWxwYXRoKDMpCisjIHRvIGNoZWNrIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSBsaWIuIFdlIGNvdWxkIGFkZCB0aGlzIHRvIHNlYXJjaC5wYXRocworIyBpbnN0ZWFkIGJ1dCB0aGF0IG1ha2VzIHRoZSByZXNvbHV0aW9uIG9mIGJpb25pYyBsaWJzIGJlIGRlcGVuZGVudCBvbgorIyB0aGUgb3JkZXIgb2YgL3N5c3RlbS9saWIgYW5kIC9hcGV4Ly4uLiBpbiBzZWFyY2gucGF0aHMuIElmIC9hcGV4Ly4uLgorIyBpcyBhZnRlciAvc3lzdGVtL2xpYiwgdGhlbiAvYXBleC8uLi4gaXMgbmV2ZXIgdHJpZWQgYmVjYXVzZSBsaWJjLnNvCisjIGlzIGFsd2F5cyBmb3VuZCBpbiAvc3lzdGVtL2xpYiBidXQgZmFpbHMgdG8gcGFzcyB0aGUgYWNjZXNzaWJpbGl0eSB0ZXN0CisjIGJlY2F1c2Ugb2YgaXRzIHJlYWxwYXRoLiAgSXQncyBiZXR0ZXIgdG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXJpbmcgaWYKKyMgcG9zc2libGUuCituYW1lc3BhY2UucGxhdGZvcm0ucGVybWl0dGVkLnBhdGhzID0gL2FwZXgvY29tLmFuZHJvaWQucnVudGltZS8ke0xJQn0vYmlvbmljCituYW1lc3BhY2UucGxhdGZvcm0uYXNhbi5wZXJtaXR0ZWQucGF0aHMgPSAvYXBleC9jb20uYW5kcm9pZC5ydW50aW1lLyR7TElCfS9iaW9uaWMKZGlmZiAtLWdpdCBhL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbiBiL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmJjZWVjCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgInZlcnNpb24iOiAxCit9CmRpZmYgLS1naXQgYS9hcGV4L21lZGlhc3djb2RlYy5yYyBiL2FwZXgvbWVkaWFzd2NvZGVjLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzQ4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhc3djb2RlYy5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgbWVkaWEuc3djb2RlYyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi9tZWRpYXN3Y29kZWMKKyAgICBjbGFzcyBtYWluCisgICAgdXNlciBtZWRpYWNvZGVjCisgICAgZ3JvdXAgY2FtZXJhIGRybXJwYyBtZWRpYWRybQorICAgIG92ZXJyaWRlCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icCBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMWNlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCithcGV4IHsKKyAgICBuYW1lOiAidGVzdF9jb20uYW5kcm9pZC5tZWRpYSIsCisgICAgbWFuaWZlc3Q6ICJ0ZXN0X21hbmlmZXN0Lmpzb24iLAorICAgIGZpbGVfY29udGV4dHM6ICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiXSwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKK2FwZXggeworICAgIG5hbWU6ICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIG1hbmlmZXN0OiAidGVzdF9tYW5pZmVzdF9jb2RlYy5qc29uIiwKKyAgICBmaWxlX2NvbnRleHRzOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1kZWZhdWx0cyJdLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KZGlmZiAtLWdpdCBhL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0Lmpzb24gYi9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODFmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICJ2ZXJzaW9uIjogMgorfQpkaWZmIC0tZ2l0IGEvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbiBiL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0X2NvZGVjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1NjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0X2NvZGVjLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAidmVyc2lvbiI6IDIKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLmJwIGIvY2FtZXJhL0FuZHJvaWQuYnAKaW5kZXggMjRiMzkxOC4uMjE1ODhkNCAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL0FuZHJvaWQuYnAKQEAgLTQzLDYgKzQzLDcgQEAKICAgICAgICAgIklDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcCIsCiAgICAgICAgICJjYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCIsCiAgICAgICAgICJjYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIiwKKyAgICAgICAgImNhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwIiwKICAgICAgICAgImNhbWVyYTIvU3VibWl0SW5mby5jcHAiLAogICAgICAgICAiQ2FtZXJhQmFzZS5jcHAiLAogICAgICAgICAiQ2FtZXJhVXRpbHMuY3BwIiwKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IGUxNDNlMDUuLjkyZmU4NGIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtMjIsNyArMjIsNiBAQAogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgotI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDA5LDYgKzQwOCw3OSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYU1ldGFkYXRhOjpyZW1vdmVQZXJtaXNzaW9uRW50cmllcyhtZXRhZGF0YV92ZW5kb3JfaWRfdCB2ZW5kb3JJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkKSB7CisgICAgdWludDMyX3QgdGFnQ291bnQgPSAwOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzVG9SZW1vdmU7CisKKyAgICBpZiAodGFnc1JlbW92ZWQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZUYWdzID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIGlmICgobnVsbHB0ciA9PSB2VGFncy5nZXQoKSkgfHwgKDAgPj0gdlRhZ3MtPmdldFRhZ0NvdW50KCkpKSB7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gY2FjaGUgPQorICAgICAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRHbG9iYWxWZW5kb3JUYWdDYWNoZSgpOworICAgICAgICBpZiAoY2FjaGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIGNhY2hlLT5nZXRWZW5kb3JUYWdEZXNjcmlwdG9yKHZlbmRvcklkLCAmdlRhZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChudWxscHRyICE9IHZUYWdzLmdldCgpKSAmJiAodlRhZ3MtPmdldFRhZ0NvdW50KCkgPiAwKSkgeworICAgICAgICB0YWdDb3VudCA9IHZUYWdzLT5nZXRUYWdDb3VudCgpOworICAgICAgICB1aW50MzJfdCAqdmVuZG9yVGFncyA9IG5ldyB1aW50MzJfdFt0YWdDb3VudF07CisgICAgICAgIGlmIChudWxscHRyID09IHZlbmRvclRhZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgdlRhZ3MtPmdldFRhZ0FycmF5KHZlbmRvclRhZ3MpOworCisgICAgICAgIHRhZ3NUb1JlbW92ZS5yZXNlcnZlKHRhZ0NvdW50KTsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLmluc2VydCh0YWdzVG9SZW1vdmUuYmVnaW4oKSwgdmVuZG9yVGFncywgdmVuZG9yVGFncyArIHRhZ0NvdW50KTsKKworICAgICAgICBkZWxldGUgW10gdmVuZG9yVGFnczsKKyAgICAgICAgdGFnQ291bnQgPSAwOworICAgIH0KKworICAgIGF1dG8gdGFnc05lZWRpbmdQZXJtaXNzaW9uID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9wZXJtaXNzaW9uX25lZWRlZCgmdGFnQ291bnQpOworICAgIGlmICh0YWdDb3VudCA+IDApIHsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLnJlc2VydmUodGFnc1RvUmVtb3ZlLmNhcGFjaXR5KCkgKyB0YWdDb3VudCk7CisgICAgICAgIHRhZ3NUb1JlbW92ZS5pbnNlcnQodGFnc1RvUmVtb3ZlLmVuZCgpLCB0YWdzTmVlZGluZ1Blcm1pc3Npb24sCisgICAgICAgICAgICAgICAgdGFnc05lZWRpbmdQZXJtaXNzaW9uICsgdGFnQ291bnQpOworICAgIH0KKworICAgIHRhZ3NSZW1vdmVkLT5yZXNlcnZlKHRhZ3NUb1JlbW92ZS5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiB0YWdzVG9SZW1vdmUpIHsKKyAgICAgICAgaWYgKGV4aXN0cyhpdCkpIHsKKyAgICAgICAgICAgIGF1dG8gcmMgPSBlcmFzZShpdCk7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBlcmFzZSB0YWc6ICV4IiwgX19mdW5jX18sIGl0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YWdzUmVtb3ZlZC0+cHVzaF9iYWNrKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgYXZhaWxhYmxlIGNoYXJhY3RlcnN0aWNzIGFjY29yZGluZ2x5CisgICAgaWYgKGV4aXN0cyhBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gY3VycmVudEtleXM7CisKKyAgICAgICAgc3RkOjpzb3J0KHRhZ3NSZW1vdmVkLT5iZWdpbigpLCB0YWdzUmVtb3ZlZC0+ZW5kKCkpOworICAgICAgICBhdXRvIGtleXMgPSBmaW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpOworICAgICAgICBjdXJyZW50S2V5cy5yZXNlcnZlKGtleXMuY291bnQpOworICAgICAgICBjdXJyZW50S2V5cy5pbnNlcnQoY3VycmVudEtleXMuZW5kKCksIGtleXMuZGF0YS5pMzIsIGtleXMuZGF0YS5pMzIgKyBrZXlzLmNvdW50KTsKKyAgICAgICAgc3RkOjpzb3J0KGN1cnJlbnRLZXlzLmJlZ2luKCksIGN1cnJlbnRLZXlzLmVuZCgpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBuZXdLZXlzKGtleXMuY291bnQpOworICAgICAgICBhdXRvIGVuZCA9IHN0ZDo6c2V0X2RpZmZlcmVuY2UoY3VycmVudEtleXMuYmVnaW4oKSwgY3VycmVudEtleXMuZW5kKCksIHRhZ3NSZW1vdmVkLT5iZWdpbigpLAorICAgICAgICAgICAgICAgIHRhZ3NSZW1vdmVkLT5lbmQoKSwgbmV3S2V5cy5iZWdpbigpKTsKKyAgICAgICAgbmV3S2V5cy5yZXNpemUoZW5kIC0gbmV3S2V5cy5iZWdpbigpKTsKKworICAgICAgICB1cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUywgbmV3S2V5cy5kYXRhKCksIG5ld0tleXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHZvaWQgQ2FtZXJhTWV0YWRhdGE6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKICAgICBkdW1wX2luZGVudGVkX2NhbWVyYV9tZXRhZGF0YShtQnVmZmVyLCBmZCwgdmVyYm9zaXR5LCBpbmRlbnRhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvT1dORVJTIGIvY2FtZXJhL09XTkVSUwppbmRleCAxOGFjZmVlLi5kNmI5NWRhIDEwMDY0NAotLS0gYS9jYW1lcmEvT1dORVJTCisrKyBiL2NhbWVyYS9PV05FUlMKQEAgLTEsNiArMSw4IEBACi1jeWNoZW5AZ29vZ2xlLmNvbQogZXBlZXZAZ29vZ2xlLmNvbQogZXRhbHZhbGFAZ29vZ2xlLmNvbQoramNob3dkaGFyeUBnb29nbGUuY29tCiBzaHV6aGVud2FuZ0Bnb29nbGUuY29tCiB5aW5jaGlheWVoQGdvb2dsZS5jb20KKyMgYmFja3VwIG93bmVyCitjeWNoZW5AZ29vZ2xlLmNvbQogemhpanVuaGVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCmluZGV4IGE4NmNjODcuLmQ3MTNkMmQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAorKysgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKQEAgLTMxNSw2ICszMTUsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NzaXplX3QgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0U2VjdGlvbkluZGV4KHVpbnQzMl90IHRhZykgY29uc3QgeworICAgIHJldHVybiBtVGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7Cit9CisKIHZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3QgewogCiAgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKQEAgLTQwNyw2ICs0MTEsMTEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8bWV0YWRhdGFfdmVuZG9yX2lkX3QsIHNwPGFuZHJvaWQ6OlZlbmRvclRhZ0Rlc2NyaXB0b3I+PiAmCisgICAgICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldFZlbmRvcklkc0FuZFRhZ0Rlc2NyaXB0b3JzKCkgeworICAgIHJldHVybiBtVmVuZG9yTWFwOworfQorCiBpbnQgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRUYWdDb3VudChtZXRhZGF0YV92ZW5kb3JfaWRfdCBpZCkgY29uc3QgewogICAgIGludCByZXQgPSAwOwogICAgIGF1dG8gZGVzYyA9IG1WZW5kb3JNYXAuZmluZChpZCk7CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKaW5kZXggOWMwZjI4Yi4uM2U4OTkyYSAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICoKICAgICAgKiBBbHNvIHJldHVybnMgdGhlIHNldCBvZiBjdXJyZW50bHkta25vd24gY2FtZXJhIElEcyBhbmQgc3RhdGUgb2YgZWFjaCBkZXZpY2UuCiAgICAgICogQWRkaW5nIGEgbGlzdGVuZXIgd2lsbCB0cmlnZ2VyIHRoZSB0b3JjaCBzdGF0dXMgbGlzdGVuZXIgdG8gZmlyZSBmb3IgYWxsCi0gICAgICogZGV2aWNlcyB0aGF0IGhhdmUgYSBmbGFzaCB1bml0CisgICAgICogZGV2aWNlcyB0aGF0IGhhdmUgYSBmbGFzaCB1bml0LgogICAgICAqLwogICAgIENhbWVyYVN0YXR1c1tdIGFkZExpc3RlbmVyKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIpOwogCkBAIC0xNDksOCArMTQ5LDEwIEBACiAgICAgY29uc3QgaW50IEFQSV9WRVJTSU9OXzEgPSAxOwogICAgIGNvbnN0IGludCBBUElfVkVSU0lPTl8yID0gMjsKIAotICAgIC8vIERldGVybWluZXMgaWYgYSBwYXJ0aWN1bGFyIEFQSSB2ZXJzaW9uIGlzIHN1cHBvcnRlZCBkaXJlY3RseQorICAgIC8vIERldGVybWluZXMgaWYgYSBwYXJ0aWN1bGFyIEFQSSB2ZXJzaW9uIGlzIHN1cHBvcnRlZCBkaXJlY3RseSBmb3IgYSBjYW1lcmFJZC4KICAgICBib29sZWFuIHN1cHBvcnRzQ2FtZXJhQXBpKFN0cmluZyBjYW1lcmFJZCwgaW50IGFwaVZlcnNpb24pOworICAgIC8vIERldGVybWluZXMgaWYgYSBjYW1lcmFJZCBpcyBhIGhpZGRlbiBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAgICBib29sZWFuIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoU3RyaW5nIGNhbWVyYUlkKTsKIAogICAgIHZvaWQgc2V0VG9yY2hNb2RlKFN0cmluZyBjYW1lcmFJZCwgYm9vbGVhbiBlbmFibGVkLCBJQmluZGVyIGNsaWVudEJpbmRlcik7CiAKQEAgLTE2MCw2ICsxNjIsMjggQEAKICAgICAgKiBDYWxsZXJzIHJlcXVpcmUgdGhlIGFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIHBlcm1pc3Npb24uCiAgICAgICovCiAgICAgY29uc3QgaW50IEVWRU5UX05PTkUgPSAwOwotICAgIGNvbnN0IGludCBFVkVOVF9VU0VSX1NXSVRDSEVEID0gMTsKKyAgICBjb25zdCBpbnQgRVZFTlRfVVNFUl9TV0lUQ0hFRCA9IDE7IC8vIFRoZSBhcmd1bWVudCBpcyB0aGUgc2V0IG9mIG5ldyBmb3JlZ3JvdW5kIHVzZXIgSURzLgogICAgIG9uZXdheSB2b2lkIG5vdGlmeVN5c3RlbUV2ZW50KGludCBldmVudElkLCBpbiBpbnRbXSBhcmdzKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2Ugb2YgYSBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzIGNoYW5nZS4gTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20KKyAgICAgKiBhIHByaXZpbGVnZWQgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIG5ld1N0YXRlIGlzIGEgYml0ZmllbGQgY29uc2lzdGluZyBvZiBERVZJQ0VfU1RBVEVfKiB2YWx1ZXMgY29tYmluZWQgdG9nZXRoZXIuIFZhbGlkIHN0YXRlCisgICAgICogY29tYmluYXRpb25zIGFyZSBkZXZpY2Utc3BlY2lmaWMuIEF0IGRldmljZSBzdGFydHVwLCB0aGUgY2FtZXJhIHNlcnZpY2Ugd2lsbCBhc3N1bWUgdGhlIGRldmljZQorICAgICAqIHN0YXRlIGlzIE5PUk1BTCB1bnRpbCBvdGhlcndpc2Ugbm90aWZpZWQuCisgICAgICoKKyAgICAgKiBDYWxsZXJzIHJlcXVpcmUgdGhlIGFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIHBlcm1pc3Npb24uCisgICAgICovCisgICAgb25ld2F5IHZvaWQgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobG9uZyBuZXdTdGF0ZSk7CisKKyAgICAvLyBCaXRmaWVsZCBjb25zdGFudHMgZm9yIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlCisgICAgLy8gQWxsIGJpdHMgPj0gMzIgYXJlIGZvciBjdXN0b20gdmVuZG9yIHN0YXRlcworICAgIC8vIFdyaXR0ZW4gYXMgaW50cyBzaW5jZSBBSURMIGRvZXMgbm90IHN1cHBvcnQgbG9uZyBjb25zdGFudHMuCisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9OT1JNQUwgPSAwOworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfQkFDS19DT1ZFUkVEID0gMTsKKyAgICBjb25zdCBpbnQgREVWSUNFX1NUQVRFX0ZST05UX0NPVkVSRUQgPSAyOworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfRk9MREVEID0gNDsKKyAgICBjb25zdCBpbnQgREVWSUNFX1NUQVRFX0xBU1RfRlJBTUVXT1JLX0JJVCA9IDB4ODAwMDAwMDA7IC8vIDEgPDwgMzE7CisKIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwKaW5kZXggZjg3MWNlNC4uZTlkY2JkYiAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwKQEAgLTc2LDQgKzc2LDExIEBACiAgICAgY29uc3QgaW50IFRPUkNIX1NUQVRVU19VTktOT1dOID0gLTE7CiAKICAgICBvbmV3YXkgdm9pZCBvblRvcmNoU3RhdHVzQ2hhbmdlZChpbnQgc3RhdHVzLCBTdHJpbmcgY2FtZXJhSWQpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHJlZ2lzdGVyZWQgY2xpZW50cyBhYm91dCBjYW1lcmEgYWNjZXNzIHByaW9yaXR5IGNoYW5nZXMuCisgICAgICogQ2xpZW50cyB3aGljaCB3ZXJlIHByZXZpb3VzbHkgdW5hYmxlIHRvIG9wZW4gYSBjZXJ0YWluIGNhbWVyYSBkZXZpY2UKKyAgICAgKiBjYW4gcmV0cnkgYWZ0ZXIgcmVjZWl2aW5nIHRoaXMgY2FsbGJhY2suCisgICAgICovCisgICAgb25ld2F5IHZvaWQgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpOwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAppbmRleCA0Y2VkMDhjLi40OWRmZGU4IDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbApAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuaW1wbC5DYW1lcmFNZXRhZGF0YU5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLk91dHB1dENvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5TZXNzaW9uQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIudXRpbHMuU3VibWl0SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKIApAQCAtODMsNiArODQsMTYgQEAKICAgICAgKi8KICAgICB2b2lkIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwgaW4gQ2FtZXJhTWV0YWRhdGFOYXRpdmUgc2Vzc2lvblBhcmFtcyk7CiAKKyAgICAvKioKKyAgICAgICogQ2hlY2sgd2hldGhlciBhIHBhcnRpY3VsYXIgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGhhcyBjYW1lcmEgZGV2aWNlCisgICAgICAqIHN1cHBvcnQuCisgICAgICAqCisgICAgICAqIEBwYXJhbSBzZXNzaW9uQ29uZmlndXJhdGlvbiBTcGVjaWZpYyBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gdG8gYmUgdmVyaWZpZWQuCisgICAgICAqIEByZXR1cm4gdHJ1ZSAgLSBpbiBjYXNlIHRoZSBzdHJlYW0gY29tYmluYXRpb24gaXMgc3VwcG9ydGVkLgorICAgICAgKiAgICAgICAgIGZhbHNlIC0gaW4gY2FzZSB0aGVyZSBpcyBubyBkZXZpY2Ugc3VwcG9ydC4KKyAgICAgICovCisgICAgYm9vbGVhbiBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGluIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWd1cmF0aW9uKTsKKwogICAgIHZvaWQgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCk7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmYxNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXM7CisKKy8qKiBAaGlkZSAqLworcGFyY2VsYWJsZSBTZXNzaW9uQ29uZmlndXJhdGlvbiBjcHBfaGVhZGVyICJjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oIjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKaW5kZXggZmViMDRjMi4uNGU5YjI3ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKQEAgLTE2NywxNCArMTY3LDI0IEBACiB9CiAKIE91dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwgaW50IHJvdGF0aW9uLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGh5c2ljYWxJZCwKICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCwgYm9vbCBpc1NoYXJlZCkgewogICAgIG1HYnBzLnB1c2hfYmFjayhnYnApOwogICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgIG1TdXJmYWNlU2V0SUQgPSBzdXJmYWNlU2V0SUQ7CiAgICAgbUlzRGVmZXJyZWQgPSBmYWxzZTsKICAgICBtSXNTaGFyZWQgPSBpc1NoYXJlZDsKKyAgICBtUGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsSWQ7CiB9CiAKK091dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiYgZ2JwcywKKyAgICBpbnQgcm90YXRpb24sIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc3VyZmFjZVNldElELCAgaW50IHN1cmZhY2VUeXBlLAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpc1NoYXJlZCkKKyAgOiBtR2JwcyhnYnBzKSwgbVJvdGF0aW9uKHJvdGF0aW9uKSwgbVN1cmZhY2VTZXRJRChzdXJmYWNlU2V0SUQpLCBtU3VyZmFjZVR5cGUoc3VyZmFjZVR5cGUpLAorICAgIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwgbUlzRGVmZXJyZWQoZmFsc2UpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLAorICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHsgfQorCiBzdGF0dXNfdCBPdXRwdXRDb25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CiAKICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzMWEzMwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJTZXNzaW9uQ29uZmlndXJhdGlvbiIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IFNlc3Npb25Db25maWd1cmF0aW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGludCBvcGVyYXRpbmdNb2RlID0gMDsKKworICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJm9wZXJhdGluZ01vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG9wZXJhdGluZyBtb2RlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaW5wdXRXaWR0aCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRXaWR0aCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW5wdXQgd2lkdGggZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBpbnB1dEhlaWdodCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRIZWlnaHQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGlucHV0IGhlaWdodCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGlucHV0Rm9ybWF0ID0gLTE7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRGb3JtYXQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGlucHV0IGZvcm1hdCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0U3RyZWFtczsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJm91dHB1dFN0cmVhbXMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG91dHB1dCBjb25maWd1cmF0aW9ucyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbU9wZXJhdGluZ01vZGUgPSBvcGVyYXRpbmdNb2RlOworICAgIG1JbnB1dFdpZHRoID0gaW5wdXRXaWR0aDsKKyAgICBtSW5wdXRIZWlnaHQgPSBpbnB1dEhlaWdodDsKKyAgICBtSW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKKyAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IG91dHB1dFN0cmVhbXMpIHsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7CisgICAgfQorCisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworCisgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1PcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dFdpZHRoKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dEhlaWdodCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtSW5wdXRGb3JtYXQpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihtT3V0cHV0U3RyZWFtcyk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6b3V0cHV0c0VxdWFsKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+JiBvdGhlck91dHB1dFN0cmVhbXMgPQorICAgICAgICAgICAgb3RoZXIuZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKworICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgIT0gIG90aGVyT3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW1zW2ldICE9IG90aGVyT3V0cHV0U3RyZWFtc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb246Om91dHB1dHNMZXNzVGhhbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiYgb3RoZXJPdXRwdXRTdHJlYW1zID0KKyAgICAgICAgICAgIG90aGVyLmdldE91dHB1dENvbmZpZ3VyYXRpb25zKCk7CisKKyAgICBpZiAobU91dHB1dFN0cmVhbXMuc2l6ZSgpICE9ICBvdGhlck91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBtT3V0cHV0U3RyZWFtcy5zaXplKCkgPCBvdGhlck91dHB1dFN0cmVhbXMuc2l6ZSgpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW1zW2ldICE9IG90aGVyT3V0cHV0U3RyZWFtc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zW2ldIDwgb3RoZXJPdXRwdXRTdHJlYW1zW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjA2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY2FtZXJhc2VydmVyIiwKKworICAgIHNyY3M6IFsibWFpbl9jYW1lcmFzZXJ2ZXIuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY2FtZXJhc2VydmljZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiY2FtZXJhc2VydmVyLnJjIl0sCisKKyAgICB2aW50Zl9mcmFnbWVudHM6IFsKKyAgICAgICAgIm1hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tayBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjOTRlNi4uMDAwMDAwMAotLS0gYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCW1haW5fY2FtZXJhc2VydmVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjYW1lcmFzZXJ2aWNlIFwKLQlsaWJsb2cgXAotCWxpYnV0aWxzIFwKLQlsaWJ1aSBcCi0JbGliZ3VpIFwKLQlsaWJiaW5kZXIgXAotCWxpYmhpZGx0cmFuc3BvcnQgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMgotCi1MT0NBTF9NT0RVTEU6PSBjYW1lcmFzZXJ2ZXIKLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKLQotTE9DQUxfSU5JVF9SQyA6PSBjYW1lcmFzZXJ2ZXIucmMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21haW5fY2FtZXJhc2VydmVyLmNwcCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCmluZGV4IDM5NzI0MzYuLjUzYjNkODQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCkBAIC0yNiw4ICsyNiw5IEBACiB7CiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCi0gICAgLy8gU2V0IDMgdGhyZWFkcyBmb3IgSElETCBjYWxscwotICAgIGhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDMsIC8qd2lsbGpvaW4qLyBmYWxzZSk7CisgICAgLy8gU2V0IDUgdGhyZWFkcyBmb3IgSElETCBjYWxscy4gTm93IGNhbWVyYXNlcnZlciB3aWxsIHNlcnZlIEhJREwgY2FsbHMgaW4KKyAgICAvLyBhZGRpdGlvbiB0byBjb25zdW1pbmcgdGhlbSBmcm9tIHRoZSBDYW1lcmEgSEFMIGFzIHdlbGwuCisgICAgaGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNSwgLyp3aWxsam9pbiovIGZhbHNlKTsKIAogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFjNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwKQEAgLTAsMCArMSwxMSBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KKyAgICA8aGFsPgorICAgICAgICA8bmFtZT5hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlPC9uYW1lPgorICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgPGludGVyZmFjZT4KKyAgICAgICAgICAgIDxuYW1lPklDYW1lcmFTZXJ2aWNlPC9uYW1lPgorICAgICAgICAgICAgPGluc3RhbmNlPmRlZmF1bHQ8L2luc3RhbmNlPgorICAgICAgICA8L2ludGVyZmFjZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCmluZGV4IGQyODQ0NzcuLjg0NGJiODAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xNzAsNiArMTcxLDEyIEBACiAgICAgc3RhdHVzX3QgZXJhc2UodWludDMyX3QgdGFnKTsKIAogICAgIC8qKgorICAgICAqIFJlbW92ZSBtZXRhZGF0YSBlbnRyaWVzIHRoYXQgbmVlZCBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkIC8qb3V0Ki8pOworCisgICAgLyoqCiAgICAgICogU3dhcCB0aGUgdW5kZXJseWluZyBjYW1lcmEgbWV0YWRhdGEgYmV0d2VlbiB0aGlzIGFuZCB0aGUgb3RoZXIKICAgICAgKiBtZXRhZGF0YSBvYmplY3QuCiAgICAgICovCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaAppbmRleCA5MDRmYmEyLi42ZjU1ODkwIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKQEAgLTk5LDYgKzk5LDExIEBACiAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3Q7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBTZWN0aW9uIGZvciBjb3JyZXNwb25kaW5nIHRhZy4KKyAgICAgICAgICovCisgICAgICAgIHNzaXplX3QgZ2V0U2VjdGlvbkluZGV4KHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFJlYWQgdmFsdWVzIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIHBhcmNlbC4KICAgICAgICAgICoKICAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCkBAIC0yMDYsNiArMjExLDkgQEAKICAgICAgKi8KICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0OwogCisgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gJgorICAgICAgICAgICAgZ2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gbVZlbmRvck1hcDsKICAgICBzdHJ1Y3QgdmVuZG9yX3RhZ19jYWNoZV9vcHMgbVZlbmRvckNhY2hlT3BzOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCmluZGV4IGE4MGY0NGIuLjk1YzRmMzkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKQEAgLTY1LDggKzY1LDE1IEBACiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBhbmRyb2lkOjpQYXJjZWwmIHBhcmNlbCk7CiAKICAgICBPdXRwdXRDb25maWd1cmF0aW9uKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGludCByb3RhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELCBib29sIGlzU2hhcmVkID0gZmFsc2UpOwogCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGdicHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRpb24sIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VUeXBlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1VOS05PV04sIGludCB3aWR0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gMCwgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKTsKKwogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAoIG1Sb3RhdGlvbiA9PSBvdGhlci5tUm90YXRpb24gJiYKICAgICAgICAgICAgICAgICBtU3VyZmFjZVNldElEID09IG90aGVyLm1TdXJmYWNlU2V0SUQgJiYKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Mjg4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYTIgeworbmFtZXNwYWNlIHBhcmFtcyB7CisKK2NsYXNzIE91dHB1dENvbmZpZ3VyYXRpb247CisKK2NsYXNzIFNlc3Npb25Db25maWd1cmF0aW9uIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIGdldE91dHB1dENvbmZpZ3VyYXRpb25zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXM7CisgICAgfQorCisgICAgaW50IGdldElucHV0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtSW5wdXRXaWR0aDsgfQorICAgIGludCBnZXRJbnB1dEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEhlaWdodDsgfQorICAgIGludCBnZXRJbnB1dEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEZvcm1hdDsgfQorICAgIGludCBnZXRPcGVyYXRpbmdNb2RlKCkgY29uc3QgeyByZXR1cm4gbU9wZXJhdGluZ01vZGU7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisKKyAgICBTZXNzaW9uQ29uZmlndXJhdGlvbigpIDoKKyAgICAgICAgICAgIG1JbnB1dFdpZHRoKDApLAorICAgICAgICAgICAgbUlucHV0SGVpZ2h0KDApLAorICAgICAgICAgICAgbUlucHV0Rm9ybWF0KC0xKSwKKyAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlKC0xKSB7fQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBwYXJjZWwpIHsKKyAgICAgICAgcmVhZEZyb21QYXJjZWwoJnBhcmNlbCk7CisgICAgfQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oaW50IGlucHV0V2lkdGgsIGludCBpbnB1dEhlaWdodCwgaW50IGlucHV0Rm9ybWF0LCBpbnQgb3BlcmF0aW5nTW9kZSkgOgorICAgICAgICBtSW5wdXRXaWR0aChpbnB1dFdpZHRoKSwgbUlucHV0SGVpZ2h0KGlucHV0SGVpZ2h0KSwgbUlucHV0Rm9ybWF0KGlucHV0Rm9ybWF0KSwKKyAgICAgICAgbU9wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSkge30KKworICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKG91dHB1dHNFcXVhbChvdGhlcikgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCA9PSBvdGhlci5tSW5wdXRXaWR0aCAmJgorICAgICAgICAgICAgICAgIG1JbnB1dEhlaWdodCA9PSBvdGhlci5tSW5wdXRIZWlnaHQgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQgPT0gb3RoZXIubUlucHV0Rm9ybWF0ICYmCisgICAgICAgICAgICAgICAgbU9wZXJhdGluZ01vZGUgPT0gb3RoZXIubU9wZXJhdGluZ01vZGUpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1JbnB1dFdpZHRoICE9IG90aGVyLm1JbnB1dFdpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0V2lkdGggPCBvdGhlci5tSW5wdXRXaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRIZWlnaHQgIT0gb3RoZXIubUlucHV0SGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0SGVpZ2h0IDwgb3RoZXIubUlucHV0SGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dEZvcm1hdCAhPSBvdGhlci5tSW5wdXRGb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5wdXRGb3JtYXQgPCBvdGhlci5tSW5wdXRGb3JtYXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU9wZXJhdGluZ01vZGUgIT0gb3RoZXIubU9wZXJhdGluZ01vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtT3BlcmF0aW5nTW9kZSA8IG90aGVyLm1PcGVyYXRpbmdNb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG91dHB1dHNMZXNzVGhhbihvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKKyAgICB9CisKKyAgICBib29sIG91dHB1dHNFcXVhbChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OworICAgIGJvb2wgb3V0cHV0c0xlc3NUaGFuKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3Q7CisgICAgdm9pZCBhZGRPdXRwdXRDb25maWd1cmF0aW9uKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJmNvbmZpZykgeworICAgICAgICBtT3V0cHV0U3RyZWFtcy5wdXNoX2JhY2soY29uZmlnKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiBtT3V0cHV0U3RyZWFtczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCwgbUlucHV0SGVpZ2h0LCBtSW5wdXRGb3JtYXQsIG1PcGVyYXRpbmdNb2RlOworfTsKK30gLy8gbmFtZXNwYWNlIHBhcmFtcworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMgorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6U2Vzc2lvbkNvbmZpZ3VyYXRpb247CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9BbmRyb2lkLmJwIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCmluZGV4IDk3Y2Y2YmYuLmQ5NmY0MDMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKQEAgLTMwLDMgKzMwLDEyNSBAQAogICAgIHNyY3M6IFsiaW5jbHVkZS9jYW1lcmEvKiovKi5oIl0sCiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY2FtZXJhMm5kayIsCisgICAgc3JjczogWworICAgICAgICAiTmRrQ2FtZXJhTWFuYWdlci5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYURldmljZS5jcHAiLAorICAgICAgICAiTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5IChcImRlZmF1bHRcIikpKSIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAibGliY2FtZXJhMm5kay5tYXAudHh0IiwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmEybmRrX3ZlbmRvciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAiLAorICAgICAgICAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIiwKKyAgICAgICAgImltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFEZXZpY2UuY3BwIiwKKyAgICAgICAgIk5ka0NhcHR1cmVSZXF1ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJpbXBsIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAtaGVscGVyIiwKKyAgICAgICAgImxpYmFyZWN0IiwKKyAgICBdLAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHBkazogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFJbWFnZVJlYWRlclZlbmRvclRlc3QiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbIm5ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhMm5ka192ZW5kb3IiLAorICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wLWhlbHBlciIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvQW5kcm9pZC5tayBiL2NhbWVyYS9uZGsvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhZGRmMS4uMDAwMDAwMAotLS0gYS9jYW1lcmEvbmRrL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksIHRydWUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFNYW5hZ2VyLmNwcCAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYU1ldGFkYXRhLmNwcCAgICAgICAgICBcCi0gICAgTmRrQ2FtZXJhRGV2aWNlLmNwcCAgICAgICAgICAgIFwKLSAgICBOZGtDYXB0dXJlUmVxdWVzdC5jcHAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCAgICBcCi0gICAgaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAgICAgICAgIFwKLSAgICBpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAgICAgICAgXAotICAgIGltcGwvQUNhbWVyYURldmljZS5jcHAgICAgICAgICBcCi0gICAgaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYTJuZGsKLQotTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLUQgRVhQT1JUPSdfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpJwotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9MREZMQUdTICs9IC1XbCwtLXZlcnNpb24tc2NyaXB0PSQoTE9DQUxfUEFUSCkvbGliY2FtZXJhMm5kay5tYXAudHh0Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJndWkgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAotICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliY2FtZXJhX21ldGFkYXRhIFwKLSAgICBsaWJtZWRpYW5kawotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCmluZGV4IGZkOTUyOTYuLjFhYzg0ODIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CiAjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAorI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIEVYUE9SVApAQCAtNzgsMTEgKzgwLDM5IEBACiAKICAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIHNlc3Npb24tPmNhcHR1cmUoY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZSgKKyAgICAgICAgICAgIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmUoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0cyA9PSBudWxscHRyIHx8IG51bVJlcXVlc3RzIDwgMSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBzZXNzaW9uICVwLCBudW1SZXF1ZXN0ICVkLCByZXF1ZXN0cyAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXNzaW9uLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOworICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKKyAgICB9CisKKyAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZSgKKyAgICAgICAgICAgIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOwogfQogCiBFWFBPUlQKQEAgLTk5LDcgKzEyOSw5IEBACiAKICAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgICAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwogICAgIH0KIApAQCAtMTA3LDYgKzEzOSwzMCBAQAogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIgfHwgcmVxdWVzdHMgPT0gbnVsbHB0ciB8fCBudW1SZXF1ZXN0cyA8IDEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW52YWxpZCBpbnB1dDogc2Vzc2lvbiAlcCwgbnVtUmVxdWVzdCAlZCwgcmVxdWVzdHMgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vzc2lvbiwgbnVtUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPnNldFJlcGVhdGluZ1JlcXVlc3QobGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CisKK0VYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDgxMmEzMTIuLjA5Yjg1ZDUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKQEAgLTI0LDcgKzI0LDE1IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgogI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK2Jvb2wgYXJlV2luZG93VHlwZXNFcXVhbChBQ2FtZXJhV2luZG93VHlwZSAqYSwgQUNhbWVyYVdpbmRvd1R5cGUgKmIpIHsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisgICAgcmV0dXJuIHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGEsIGIpOworI2Vsc2UKKyAgICByZXR1cm4gYSA9PSBiOworI2VuZGlmCit9CiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY2xvc2UoQUNhbWVyYURldmljZSogZGV2aWNlKSB7CkBAIC03MCw3ICs3OCwzNCBAQAogICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIHRlbXBsYXRlIElEICVkIiwgX19GVU5DVElPTl9fLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCByZXF1ZXN0KTsKKyAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBudWxscHRyIC8qcGh5c2ljYWxJZExpc3QqLywgcmVxdWVzdCk7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzKAorICAgICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICBjb25zdCBBQ2FtZXJhSWRMaXN0KiBwaHlzaWNhbENhbWVyYUlkTGlzdCwKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyIHx8IHJlcXVlc3QgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbENhbWVyYUlkTGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgZGV2aWNlICVwIHJlcXVlc3QgJXAsIHBoeXNpY2FsQ2FtZXJhSWRMaXN0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZSwgcmVxdWVzdCwgcGh5c2ljYWxDYW1lcmFJZExpc3QpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgVEVNUExBVEVfUFJFVklFVzoKKyAgICAgICAgY2FzZSBURU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICBjYXNlIFRFTVBMQVRFX1JFQ09SRDoKKyAgICAgICAgY2FzZSBURU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgY2FzZSBURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICBjYXNlIFRFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIHRlbXBsYXRlIElEICVkIiwgX19GVU5DVElPTl9fLCB0ZW1wbGF0ZUlkKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBwaHlzaWNhbENhbWVyYUlkTGlzdCwgcmVxdWVzdCk7CiB9CiAKIEVYUE9SVApAQCAtOTYsNyArMTMxLDcgQEAKIAogRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0KSB7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICh3aW5kb3cgPT0gbnVsbHB0ciB8fCBvdXQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTEwOSw3ICsxNDQsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IG91dCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTIxLDggKzE1NiwyMiBAQAogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUoCisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsCisgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmICh3aW5kb3cgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbElkID09IG51bGxwdHIgfHwgb3V0ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIHBoeXNpY2FsSWQgJXAsIG91dCAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3aW5kb3csIHBoeXNpY2FsSWQsIG91dCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICAqb3V0ID0gbmV3IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCh3aW5kb3csIGZhbHNlLCBwaHlzaWNhbElkKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dCwKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93KSB7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3cpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICgod2luZG93ID09IG51bGxwdHIpIHx8IChvdXQgPT0gbnVsbHB0cikpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMzQsNyArMTgzLDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG91dC0+bVdpbmRvdyA9PSB3aW5kb3cpIHsKKyAgICBpZiAoYXJlV2luZG93VHlwZXNFcXVhbChvdXQtPm1XaW5kb3csIHdpbmRvdykpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gYWRkIHRoZSBzYW1lIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKQEAgLTE0Nyw3ICsxOTYsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0LAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTE1OSw3ICsyMDgsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAob3V0LT5tV2luZG93ID09IHdpbmRvdykgeworICAgIGlmIChhcmVXaW5kb3dUeXBlc0VxdWFsKG91dC0+bVdpbmRvdywgd2luZG93KSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byByZW1vdmUgdGhlIHNhbWUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggNjBiNDc2My4uMjNkMDFlZiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwCkBAIC0yMiw5ICsyMiwxNSBAQAogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgotI2luY2x1ZGUgImltcGwvQUNhbWVyYU1hbmFnZXIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIgorI2Vsc2UKKyNpbmNsdWRlICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjZW5kaWYKKyNpbmNsdWRlICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKIAogRVhQT1JUCiBBQ2FtZXJhTWFuYWdlciogQUNhbWVyYU1hbmFnZXJfY3JlYXRlKCkgewpAQCAtOTksNiArMTA1LDYwIEBACiB9CiAKIEVYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX3JlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgQUNhbWVyYU1hbmFnZXIqIC8qbWFuYWdlciovLCBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgY2FsbGJhY2sgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgaWYgKChjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYVVuYXZhaWxhYmxlID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoY2FsbGJhY2stPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISBjYWxsYmFjayAlcCwgIgorICAgICAgICAgICAgICAgICJvbkNhbWVyYUF2YWlsYWJsZSAlcCwgb25DYW1lcmFVbmF2YWlsYWJsZSAlcCBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkICVwIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGJhY2ssCisgICAgICAgICAgICAgICBjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlLAorICAgICAgICAgICAgICAgY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYVVuYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgYXV0byByZXNlcnZlZEVudHJpZXNDb3VudCA9IHNpemVvZihjYWxsYmFjay0+cmVzZXJ2ZWQpIC8gc2l6ZW9mKGNhbGxiYWNrLT5yZXNlcnZlZFswXSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNlcnZlZEVudHJpZXNDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChjYWxsYmFjay0+cmVzZXJ2ZWRbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISBjYWxsYmFjayByZXNlcnZlZCBlbnRyaWVzIG11c3QgYmUgc2V0IHRvIE5VTEwiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICB9CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soY2FsbGJhY2spOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcl91bnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgQUNhbWVyYU1hbmFnZXIqIC8qbWFuYWdlciovLCBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgY2FsbGJhY2sgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgaWYgKChjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYVVuYXZhaWxhYmxlID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoY2FsbGJhY2stPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISBjYWxsYmFjayAlcCwgIgorICAgICAgICAgICAgICAgICJvbkNhbWVyYUF2YWlsYWJsZSAlcCwgb25DYW1lcmFVbmF2YWlsYWJsZSAlcCBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkICVwIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGJhY2ssCisgICAgICAgICAgICAgICBjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlLAorICAgICAgICAgICAgICAgY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYVVuYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS51bnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjayhjYWxsYmFjayk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK0VYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKICAgICAgICAgQUNhbWVyYU1hbmFnZXIqIG1nciwgY29uc3QgY2hhciogY2FtZXJhSWQsIEFDYW1lcmFNZXRhZGF0YSoqIGNoYXJzKXsKICAgICBBVFJBQ0VfQ0FMTCgpOwpAQCAtMTA3LDcgKzE2NywxNCBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbWdyLCBjYW1lcmFJZCwgY2hhcnMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9Ci0gICAgcmV0dXJuIG1nci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCBjaGFycyk7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBzcENoYXJzOworICAgIGNhbWVyYV9zdGF0dXNfdCBzdGF0dXMgPSBtZ3ItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnNwQ2hhcnMpOworICAgIGlmIChzdGF0dXMgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzcENoYXJzLT5pbmNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MpOworICAgICpjaGFycyA9IHNwQ2hhcnMuZ2V0KCk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKIEVYUE9SVApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCA2NWRlODFmLi45YTM5ZWQ4IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtNTcsMTMgKzU3LDMyIEBACiAgICAgICAgIEFMT0dFKCIlczogc3JjIGlzIG51bGwhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIHJldHVybiBuZXcgQUNhbWVyYU1ldGFkYXRhKCpzcmMpOworICAgIEFDYW1lcmFNZXRhZGF0YSogY29weSA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoKnNyYyk7CisgICAgY29weS0+aW5jU3Ryb25nKCh2b2lkKikgQUNhbWVyYU1ldGFkYXRhX2NvcHkpOworICAgIHJldHVybiBjb3B5OwogfQogCiBFWFBPUlQKIHZvaWQgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoQUNhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKG1ldGFkYXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgZGVsZXRlIG1ldGFkYXRhOworICAgICAgICBtZXRhZGF0YS0+ZGVjU3Ryb25nKCh2b2lkKikgQUNhbWVyYU1ldGFkYXRhX2ZyZWUpOwogICAgIH0KIH0KKworRVhQT1JUCitib29sIEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYShjb25zdCBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhLAorICAgICAgICAvKm91dCovc2l6ZV90KiBudW1QaHlzaWNhbENhbWVyYXMsIC8qb3V0Ki9jb25zdCBjaGFyKmNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChudW1QaHlzaWNhbENhbWVyYXMgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbENhbWVyYUlkcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbnB1dDogbnVtUGh5c2ljYWxDYW1lcmFzICVwLCBwaHlzaWNhbENhbWVyYUlkcyAlcCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbnVtUGh5c2ljYWxDYW1lcmFzLCBwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHN0YXRpY01ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0OiBzdGF0aWNNZXRhZGF0YSBpcyBudWxsLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGljTWV0YWRhdGEtPmlzTG9naWNhbE11bHRpQ2FtZXJhKG51bVBoeXNpY2FsQ2FtZXJhcywgcGh5c2ljYWxDYW1lcmFJZHMpOworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAgYi9jYW1lcmEvbmRrL05ka0NhcHR1cmVSZXF1ZXN0LmNwcAppbmRleCBhYzE4NTZiLi44N2RlNGE5IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhcHR1cmVSZXF1ZXN0LmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhcHR1cmVSZXF1ZXN0LmNwcApAQCAtMjcsNyArMjcsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93LCBBQ2FtZXJhT3V0cHV0VGFyZ2V0Kiogb3V0KSB7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIEFDYW1lcmFPdXRwdXRUYXJnZXQqKiBvdXQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICh3aW5kb3cgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnB1dCB3aW5kb3cgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CkBAIC05OCw2ICs5OCwyNyBAQAogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeV9waHlzaWNhbENhbWVyYSgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXEsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsCisgICAgICAgIHVpbnQzMl90IHRhZywgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5KiBlbnRyeSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHJlcSA9PSBudWxscHRyIHx8IGVudHJ5ID09IG51bGxwdHIgfHwgcGh5c2ljYWxJZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgcmVxICVwLCB0YWcgMHgleCwgZW50cnkgJXAsIHBoeXNpY2FsSWQgJXAiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXEsIHRhZywgZW50cnksIHBoeXNpY2FsSWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvJiBwaHlzaWNhbFNldHRpbmdzID0gcmVxLT5waHlzaWNhbFNldHRpbmdzLmZpbmQocGh5c2ljYWxJZCk7CisgICAgaWYgKHBoeXNpY2FsU2V0dGluZ3MgPT0gcmVxLT5waHlzaWNhbFNldHRpbmdzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgbWV0YWRhdGEgZm9yIHBoeXNpY2FsIGNhbWVyYSBpZCAgJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcGh5c2ljYWxJZCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIHJldHVybiBwaHlzaWNhbFNldHRpbmdzLT5zZWNvbmQtPmdldENvbnN0RW50cnkodGFnLCBlbnRyeSk7Cit9CisKK0VYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9nZXRBbGxUYWdzKAogICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcSwgLypvdXQqL2ludDMyX3QqIG51bVRhZ3MsIC8qb3V0Ki9jb25zdCB1aW50MzJfdCoqIHRhZ3MpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwpAQCAtMTMxLDEzICsxNTIsNDIgQEAKIAogI3VuZGVmIFNFVF9FTlRSWQogCisjZGVmaW5lIFNFVF9QSFlTSUNBTF9FTlRSWShOQU1FLE5ES19UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorRVhQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfIyNOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxLCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgTkRLX1RZUEUqIGRhdGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVFJBQ0VfQ0FMTCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJlcSA9PSBudWxscHRyIHx8IChjb3VudCA+IDAgJiYgZGF0YSA9PSBudWxscHRyKSB8fCBwaHlzaWNhbElkID09IG51bGxwdHIpIHsgICAgXAorICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIHJlcSAlcCwgdGFnIDB4JXgsIGNvdW50ICVkLCBkYXRhIDB4JXAsIHBoeXNpY2FsSWQgJXAiLCBcCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcSwgdGFnLCBjb3VudCwgZGF0YSwgcGh5c2ljYWxJZCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJlcS0+cGh5c2ljYWxTZXR0aW5ncy5maW5kKHBoeXNpY2FsSWQpID09IHJlcS0+cGh5c2ljYWxTZXR0aW5ncy5lbmQoKSkgeyAgICAgICAgXAorICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIG1ldGFkYXRhIGZvciBwaHlzaWNhbCBjYW1lcmEgaWQgJXMiLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcGh5c2ljYWxJZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmVxLT5waHlzaWNhbFNldHRpbmdzW3BoeXNpY2FsSWRdLT51cGRhdGUodGFnLCBjb3VudCwgZGF0YSk7ICAgICAgICAgICAgICAgICBcCit9CisKK1NFVF9QSFlTSUNBTF9FTlRSWSh1OCx1aW50OF90KQorU0VUX1BIWVNJQ0FMX0VOVFJZKGkzMixpbnQzMl90KQorU0VUX1BIWVNJQ0FMX0VOVFJZKGZsb2F0LGZsb2F0KQorU0VUX1BIWVNJQ0FMX0VOVFJZKGRvdWJsZSxkb3VibGUpCitTRVRfUEhZU0lDQUxfRU5UUlkoaTY0LGludDY0X3QpCitTRVRfUEhZU0lDQUxfRU5UUlkocmF0aW9uYWwsQUNhbWVyYU1ldGFkYXRhX3JhdGlvbmFsKQorCisjdW5kZWYgU0VUX1BIWVNJQ0FMX0VOVFJZCisKIEVYUE9SVAogdm9pZCBBQ2FwdHVyZVJlcXVlc3RfZnJlZShBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChyZXF1ZXN0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkZWxldGUgcmVxdWVzdC0+c2V0dGluZ3M7CisgICAgcmVxdWVzdC0+c2V0dGluZ3MuY2xlYXIoKTsKKyAgICByZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzLmNsZWFyKCk7CiAgICAgZGVsZXRlIHJlcXVlc3QtPnRhcmdldHM7CiAgICAgZGVsZXRlIHJlcXVlc3Q7CiAgICAgcmV0dXJuOwpAQCAtMTc0LDYgKzIyNCw5IEBACiAKICAgICBBQ2FwdHVyZVJlcXVlc3QqIHBSZXF1ZXN0ID0gbmV3IEFDYXB0dXJlUmVxdWVzdCgpOwogICAgIHBSZXF1ZXN0LT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoKihzcmMtPnNldHRpbmdzKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IHNyYy0+cGh5c2ljYWxTZXR0aW5ncykgeworICAgICAgICBwUmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5nc1tlbnRyeS5maXJzdF0gPSBuZXcgQUNhbWVyYU1ldGFkYXRhKCooZW50cnkuc2Vjb25kKSk7CisgICAgfQogICAgIHBSZXF1ZXN0LT50YXJnZXRzICA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOwogICAgICoocFJlcXVlc3QtPnRhcmdldHMpICA9ICooc3JjLT50YXJnZXRzKTsKICAgICBwUmVxdWVzdC0+Y29udGV4dCA9IHNyYy0+Y29udGV4dDsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKaW5kZXggZjYwZTVmZC4uZDZmMTQxMiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKIAogQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjp+QUNhbWVyYUNhcHR1cmVTZXNzaW9uKCkgewogICAgIEFMT0dWKCJ+QUNhbWVyYUNhcHR1cmVTZXNzaW9uOiAlcCBub3RpZnkgZGV2aWNlIGVuZCBvZiBsaWZlIiwgdGhpcyk7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ICE9IG51bGxwdHIgJiYgIWRldi0+aXNDbG9zZWQoKSkgewogICAgICAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CiAgICAgICAgIHsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgbUNsb3NlZEJ5QXBwID0gdHJ1ZTsKICAgICB9CiAKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgIT0gbnVsbHB0cikgewogICAgICAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CiAgICAgfQpAQCAtNzMsNyArNzMsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6c3RvcFJlcGVhdGluZygpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtOTEsNyArOTEsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6YWJvcnRDYXB0dXJlcygpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTA3LDQ5ICsxMDcsOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWNhbWVyYV9zdGF0dXNfdAotQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpzZXRSZXBlYXRpbmdSZXF1ZXN0KAotICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAotICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAotICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwotICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwotICAgIH0KLQotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQ7Ci0gICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXNzaW9uTG9jayk7Ci0gICAgICAgIHJldCA9IGRldi0+c2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICAgICAgdGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKLSAgICB9Ci0gICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1jYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpjYXB0dXJlKAotICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAotICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAotICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwotICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwotICAgIH0KLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OwotICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwotICAgICAgICByZXQgPSBkZXYtPmNhcHR1cmVMb2NrZWQodGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKLSAgICB9Ci0gICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKLSAgICByZXR1cm4gcmV0OwotfQotCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTE2OCw3ICsxMjcsNyBAQAogQUNhbWVyYURldmljZSoKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Z2V0RGV2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xODIsOSArMTQxLDkgQEAKICAgICBtSXNDbG9zZWQgPSB0cnVlOwogfQogCi1zcDxDYW1lcmFEZXZpY2U+CitzcDxhY2FtOjpDYW1lcmFEZXZpY2U+CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmdldERldmljZVNwKCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKICAgICBpZiAoZGV2aWNlID09IG51bGxwdHIgfHwgZGV2aWNlLT5pc0Nsb3NlZCgpKSB7CiAgICAgICAgIEFMT0dXKCJEZXZpY2UgaXMgY2xvc2VkIGJ1dCBzZXNzaW9uICVkIGlzIG5vdCBub3RpZmllZCIsIG1JZCk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IGEyMDY4ZTcuLjA4YTkyMjYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTE3LDE1ICsxNywyMiBAQAogI2RlZmluZSBfQUNBTUVSQV9DQVBUVVJFX1NFU1NJT05fSAogCiAjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgiCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oIgorI2Vsc2UKICNpbmNsdWRlICJBQ2FtZXJhRGV2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IHsKLSAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UpIDoKLSAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSB7fTsKKyAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogcGh5c2ljYWxDYW1lcmFJZCA9ICIiKSA6CisgICAgICAgICAgICBtV2luZG93KHdpbmRvdyksIG1Jc1NoYXJlZChpc1NoYXJlZCksIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHt9OwogCiAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0JiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OwpAQCAtNDAsMTEgKzQ3LDEzIEBACiAgICAgICAgIHJldHVybiBtV2luZG93ID4gb3RoZXIubVdpbmRvdzsKICAgICB9CiAKLSAgICBBTmF0aXZlV2luZG93KiBtV2luZG93OwotICAgIHN0ZDo6c2V0PEFOYXRpdmVXaW5kb3cgKj4gbVNoYXJlZFdpbmRvd3M7CisgICAgQUNhbWVyYVdpbmRvd1R5cGUqIG1XaW5kb3c7CisgICAgc3RkOjpzZXQ8QUNhbWVyYVdpbmRvd1R5cGUgKj4gbVNoYXJlZFdpbmRvd3M7CiAgICAgYm9vbCAgICAgICAgICAgbUlzU2hhcmVkOwogICAgIGludCAgICAgICAgICAgIG1Sb3RhdGlvbiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7CisgICAgc3RkOjpzdHJpbmcgbVBoeXNpY2FsQ2FtZXJhSWQ7CiB9OworI2VuZGlmCiAKIHN0cnVjdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgewogICAgIHN0ZDo6c2V0PEFDYXB0dXJlU2Vzc2lvbk91dHB1dD4gbU91dHB1dHM7CkBAIC02MCw3ICs2OSw3IEBACiAgICAgICAgICAgICBpbnQgaWQsCiAgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCiAgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICAgICAgQ2FtZXJhRGV2aWNlKiBkZXZpY2UpIDoKKyAgICAgICAgICAgIGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZSogZGV2aWNlKSA6CiAgICAgICAgICAgICBtSWQoaWQpLCBtT3V0cHV0KCpvdXRwdXRzKSwgbVVzZXJTZXNzaW9uQ2FsbGJhY2soKmNiKSwKICAgICAgICAgICAgIG1EZXZpY2UoZGV2aWNlKSB7fQogCkBAIC04MiwxMyArOTEsMTUgQEAKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBhYm9ydENhcHR1cmVzKCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0KAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IGNhcHR1cmUoCi0gICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAogICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOwogCkBAIC05NywxOCArMTA4LDE4IEBACiAgICAgQUNhbWVyYURldmljZSogZ2V0RGV2aWNlKCk7CiAKICAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhRGV2aWNlOworICAgIGZyaWVuZCBjbGFzcyBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U7CiAKICAgICAvLyBDbG9zZSBzZXNzaW9uIGJlY2F1c2UgYXBwIGNsb3NlIGNhbWVyYSBkZXZpY2UsIGNhbWVyYSBkZXZpY2UgZ290IEVSUk9SX0RJU0NPTk5FQ1RFRCwKICAgICAvLyBvciBhIG5ldyBzZXNzaW9uIGlzIHJlcGxhY2luZyB0aGlzIHNlc3Npb24uCiAgICAgdm9pZCBjbG9zZUJ5RGV2aWNlKCk7CiAKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGdldERldmljZVNwKCk7CisgICAgc3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlPiBnZXREZXZpY2VTcCgpOwogCiAgICAgY29uc3QgaW50IG1JZDsKICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgbU91dHB1dDsKICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MgbVVzZXJTZXNzaW9uQ2FsbGJhY2s7Ci0gICAgY29uc3Qgd3A8Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIGNvbnN0IHdwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gbURldmljZTsKICAgICBib29sICBtSXNDbG9zZWQgPSBmYWxzZTsKICAgICBib29sICBtQ2xvc2VkQnlBcHAgPSBmYWxzZTsKICAgICBNdXRleCBtU2Vzc2lvbkxvY2s7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YmY4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlVmVuZG9yLmluYyIKKyNlbHNlCisjaW5jbHVkZSAiQUNhbWVyYURldmljZS5pbmMiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnNldFJlcGVhdGluZ1JlcXVlc3QoCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OworICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOworICAgICAgICByZXQgPSBkZXYtPnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgICAgIHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CisgICAgfQorICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpjYXB0dXJlKAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorICAgIGNhbWVyYV9zdGF0dXNfdCByZXQ7CisgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXNzaW9uTG9jayk7CisgICAgICAgIHJldCA9IGRldi0+Y2FwdHVyZUxvY2tlZCh0aGlzLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworICAgIH0KKyAgICBkZXYtPnVubG9ja0RldmljZSgpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKaW5kZXggZmZhYmY3Yi4uNWU0ZmNkMCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMjAsMTYgKzIwLDE3IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgotI2luY2x1ZGUgPGNhbWVyYTIvU3VibWl0SW5mby5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSAiQUNhbWVyYURldmljZS5oIgogI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgogI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgogI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKIC8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NvbnRleHRLZXkgICAgICAgID0gIkNvbnRleHQiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRGV2aWNlS2V5ICAgICAgICAgPSAiRGV2aWNlIjsKQEAgLTM5LDYgKzQwLDcgQEAKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVSZXF1ZXN0S2V5ID0gIkNhcHR1cmVSZXF1ZXN0IjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1RpbWVTdGFtcEtleSAgICAgID0gIlRpbWVTdGFtcCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVzdWx0S2V5ICA9ICJDYXB0dXJlUmVzdWx0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSA9ICJQaHlzaWNhbENhcHR1cmVSZXN1bHQiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZUZhaWx1cmVLZXkgPSAiQ2FwdHVyZUZhaWx1cmUiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprU2VxdWVuY2VJZEtleSAgICAgPSAiU2VxdWVuY2VJZCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtGcmFtZU51bWJlcktleSAgICA9ICJGcmFtZU51bWJlciI7CkBAIC01MCwxMSArNTIsMTEgQEAKIENhbWVyYURldmljZTo6Q2FtZXJhRGV2aWNlKAogICAgICAgICBjb25zdCBjaGFyKiBpZCwKICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAorICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAogICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKSA6CiAgICAgICAgIG1DYW1lcmFJZChpZCksCiAgICAgICAgIG1BcHBDYWxsYmFja3MoKmNiKSwKLSAgICAgICAgbUNoYXJzKHN0ZDo6bW92ZShjaGFycykpLAorICAgICAgICBtQ2hhcnMoY2hhcnMpLAogICAgICAgICBtU2VydmljZUNhbGxiYWNrKG5ldyBTZXJ2aWNlQ2FsbGJhY2sodGhpcykpLAogICAgICAgICBtV3JhcHBlcih3cmFwcGVyKSwKICAgICAgICAgbUluRXJyb3IoZmFsc2UpLApAQCAtNzQsNyArNzYsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CiAgICAgfQotICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcihpZCk7CiAgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOwogCiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhID0gbUNoYXJzLT5nZXRJbnRlcm5hbERhdGEoKTsKQEAgLTk1LDYgKzk3LDE0IEBACiAgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVswXSA9IGVudHJ5LmRhdGEuaTMyWzBdOwogICAgICAgICBtU2hhZGluZ01hcFNpemVbMV0gPSBlbnRyeS5kYXRhLmkzMlsxXTsKICAgICB9CisKKyAgICBzaXplX3QgcGh5c2ljYWxJZENudCA9IDA7CisgICAgY29uc3QgY2hhcipjb25zdCogcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgaWYgKG1DaGFycy0+aXNMb2dpY2FsTXVsdGlDYW1lcmEoJnBoeXNpY2FsSWRDbnQsICZwaHlzaWNhbENhbWVyYUlkcykpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbElkQ250OyBpKyspIHsKKyAgICAgICAgICAgIG1QaHlzaWNhbElkcy5wdXNoX2JhY2socGh5c2ljYWxDYW1lcmFJZHNbaV0pOworICAgICAgICB9CisgICAgfQogfQogCiAvLyBEZXZpY2UgY2xvc2UgaW1wbGVtZW50YWl0b24KQEAgLTEyNyw4ICsxMzcsMjkgQEAKIGNhbWVyYV9zdGF0dXNfdAogQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsSWRMaXN0LAogICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKworICAgIGlmIChwaHlzaWNhbElkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChwaHlzaWNhbElkTGlzdC0+bnVtQ2FtZXJhcyA+IHN0YXRpY19jYXN0PGludD4obVBoeXNpY2FsSWRzLnNpemUoKSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGh5c2ljYWxJZExpc3Qgc2l6ZSAlZCBleGNlZWRzIG51bWJlciBvZiBhdmFpbGFibGUgcGh5c2ljYWwgY2FtZXJhcyAlenUiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBoeXNpY2FsSWRMaXN0LT5udW1DYW1lcmFzLCBtUGh5c2ljYWxJZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IHBoeXNpY2FsSWRMaXN0LT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwaHlzaWNhbElkTGlzdC0+Y2FtZXJhSWRzW2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHBoeXNpY2FsSWQgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QaHlzaWNhbElkcy5lbmQoKSA9PSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbElkcy5iZWdpbigpLCBtUGh5c2ljYWxJZHMuZW5kKCksIHBoeXNpY2FsSWRMaXN0LT5jYW1lcmFJZHNbaV0pKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHBoeXNpY2FsSWQgJXMhIiwgX19GVU5DVElPTl9fLCBwaHlzaWNhbElkTGlzdC0+Y2FtZXJhSWRzW2ldKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTE0OSw2ICsxODAsMTIgQEAKICAgICB9CiAgICAgQUNhcHR1cmVSZXF1ZXN0KiBvdXRSZXEgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CiAgICAgb3V0UmVxLT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEocmF3UmVxdWVzdC5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIGlmIChwaHlzaWNhbElkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IHBoeXNpY2FsSWRMaXN0LT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIG91dFJlcS0+cGh5c2ljYWxTZXR0aW5ncy5lbXBsYWNlKHBoeXNpY2FsSWRMaXN0LT5jYW1lcmFJZHNbaV0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoKihvdXRSZXEtPnNldHRpbmdzKSkpOworICAgICAgICB9CisgICAgfQogICAgIG91dFJlcS0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKICAgICAqcmVxdWVzdCA9IG91dFJlcTsKICAgICByZXR1cm4gQUNBTUVSQV9PSzsKQEAgLTE5MCwxMDYgKzIyNyw2IEBACiAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKLWNhbWVyYV9zdGF0dXNfdAotQ2FtZXJhRGV2aWNlOjpjYXB0dXJlTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKLX0KLQotY2FtZXJhX3N0YXR1c190Ci1DYW1lcmFEZXZpY2U6OnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOwotfQotCi1jYW1lcmFfc3RhdHVzX3QKLUNhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKLSAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgewotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKLSAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZwotICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7Ci0gICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzVjsKLSAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgewotICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOwotICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RzW2ldLCByZXEpOwotICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcS0+bVN1cmZhY2VMaXN0LmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2soKihyZXEuZ2V0KCkpKTsKLSAgICAgICAgcmVxdWVzdHNWLnB1c2hfYmFjayhyZXEpOwotICAgIH0KLQotICAgIGlmIChpc1JlcGVhdGluZykgewotICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0OwotICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBpbmZvOwotICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywgJmluZm8pOwotICAgIGludCBzZXF1ZW5jZUlkID0gaW5mby5tUmVxdWVzdElkOwotICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5tTGFzdEZyYW1lTnVtYmVyOwotICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgewotICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKLSAgICB9Ci0KLSAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOwotICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOwotCi0gICAgaWYgKGlzUmVwZWF0aW5nKSB7Ci0gICAgICAgIC8vIHN0b3BSZXBlYXRpbmcgYWJvdmUgc2hvdWxkIGhhdmUgY2xlYW51cCByZXBlYXRpbmcgc2VxdWVuY2UgaWQKLSAgICAgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgewotICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKLSAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7Ci0gICAgfQotCi0gICAgaWYgKG1JZGxlKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwotICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKLSAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7Ci0gICAgfQotICAgIG1JZGxlID0gZmFsc2U7Ci0gICAgbUJ1c3lTZXNzaW9uID0gc2Vzc2lvbjsKLQotICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0KLSAgICByZXR1cm4gQUNBTUVSQV9PSzsKLX0KLQogY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCkgewogICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKQEAgLTMyNSw4ICsyNjIsOSBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwKLSAgICAgICAgICAgIHRydWUpOworICAgIFN0cmluZzE2IHBoeXNpY2FsSWQxNihvdXRwdXQtPm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCisgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwgdHJ1ZSk7CiAKICAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC0+bVNoYXJlZFdpbmRvd3MpIHsKICAgICAgICAgcmV0ID0gZ2V0SUdCUGZyb21BbncoYW53LCBpR0JQKTsKQEAgLTM3Miw4ICszMTAsMTIgQEAKICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpIHsKICAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OwogICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXEobmV3IENhcHR1cmVSZXF1ZXN0KCkpOwotICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtzdGQ6OnN0cmluZyhtQ2FtZXJhSWQuc3RyaW5nKCkpLAorICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtnZXRJZCgpLAogICAgICAgICAgICAgcmVxdWVzdC0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpfSk7CisgICAgZm9yIChhdXRvJiBlbnRyeSA6IHJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5wdXNoX2JhY2soe2VudHJ5LmZpcnN0LAorICAgICAgICAgICAgICAgIGVudHJ5LnNlY29uZC0+Z2V0SW50ZXJuYWxEYXRhKCl9KTsKKyAgICB9CiAgICAgcmVxLT5tSXNSZXByb2Nlc3MgPSBmYWxzZTsgLy8gTkRLIGRvZXMgbm90IHN1cHBvcnQgcmVwcm9jZXNzaW5nIHlldAogICAgIHJlcS0+bUNvbnRleHQgPSByZXF1ZXN0LT5jb250ZXh0OwogICAgIHJlcS0+bVN1cmZhY2VDb252ZXJ0ZWQgPSB0cnVlOyAvLyBzZXQgdG8gdHJ1ZSwgYW5kIGZpbGwgaW4gc3RyZWFtL3N1cmZhY2UgaWR4IHRvIHNwZWVkIHVwIElQQwpAQCAtNDE3LDEwICszNTksMTcgQEAKIH0KIAogQUNhcHR1cmVSZXF1ZXN0KgotQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSkgeworQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZUlkKSB7CiAgICAgQUNhcHR1cmVSZXF1ZXN0KiBwUmVxdWVzdCA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKLSAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MuYmVnaW4oKS0+c2V0dGluZ3M7Ci0gICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIGZvciAoYXV0byYgZW50cnkgOiByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIGNsb25lID0gZW50cnkuc2V0dGluZ3M7CisgICAgICAgIGlmIChlbnRyeS5pZCA9PSBkZXZpY2VJZCkgeworICAgICAgICAgICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3MuZW1wbGFjZShlbnRyeS5pZCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpKTsKKyAgICAgICAgfQorICAgIH0KICAgICBwUmVxdWVzdC0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcS0+bVN1cmZhY2VMaXN0LnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihyZXEtPm1TdXJmYWNlTGlzdFtpXS5nZXQoKSk7CkBAIC00MzYsNyArMzg1LDggQEAKICAgICBpZiAocmVxID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkZWxldGUgcmVxLT5zZXR0aW5nczsKKyAgICByZXEtPnNldHRpbmdzLmNsZWFyKCk7CisgICAgcmVxLT5waHlzaWNhbFNldHRpbmdzLmNsZWFyKCk7CiAgICAgZGVsZXRlIHJlcS0+dGFyZ2V0czsKICAgICBkZWxldGUgcmVxOwogfQpAQCAtNjQwLDggKzU5MCw5IEBACiAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQorICAgICAgICBTdHJpbmcxNiBwaHlzaWNhbElkMTYob3V0Q29uZmlnLm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uLAorICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwgb3V0Q29uZmlnLm1Jc1NoYXJlZCkpKTsKICAgICB9CiAgICAgYXV0byBhZGRTZXQgPSBvdXRwdXRTZXQ7CkBAIC04MjksNyArNzgwLDcgQEAKICAgICBpZiAoZXJyb3JDb2RlID09IGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSKSB7CiAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSByZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdCA9Ci0gICAgICAgICAgICAgICAgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgICAgICAgICBjYmgubU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgICAgIGF1dG8gb3V0cHV0UGFpckl0ID0gbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQoc3RyZWFtSWQpOwogICAgICAgICBpZiAob3V0cHV0UGFpckl0ID09IG1Db25maWd1cmVkT3V0cHV0cy5lbmQoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CkBAIC04NDYsNyArNzk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJZCgpLCBhbncsIGZyYW1lTnVtYmVyKTsKIAogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3QsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uQnVmZmVyTG9zdCk7CiAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CkBAIC04NTgsNyArODA5LDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIEhhbmRsZSBvdGhlciBjYXB0dXJlIGZhaWx1cmVzCiAgICAgICAgIC8vIEZpcmUgY2FwdHVyZSBmYWlsdXJlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZSByZWdpc3RlcmVkCi0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRXJyb3IgPSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRXJyb3IgPSBjYmgubU9uQ2FwdHVyZUZhaWxlZDsKICAgICAgICAgc3A8Q2FtZXJhQ2FwdHVyZUZhaWx1cmU+IGZhaWx1cmUobmV3IENhbWVyYUNhcHR1cmVGYWlsdXJlKCkpOwogICAgICAgICBmYWlsdXJlLT5mcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwogICAgICAgICAvLyBUT0RPOiByZWZpbmUgdGhpcyB3aGVuIGltcGxlbWVudGluZyBmbHVzaApAQCAtODY4LDcgKzgxOSw3IEBACiAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQpOwogCiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlRmFpbCwgbUhhbmRsZXIpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25FcnJvcik7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CkBAIC04ODIsNiArODMzLDkgQEAKICAgICByZXR1cm47CiB9CiAKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIYW5kbGVyOjpDYWxsYmFja0hhbmRsZXIoY29uc3QgY2hhciogaWQpIDogbUlkKGlkKSB7Cit9CisKIHZvaWQgQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKQEAgLTg5MCw2ICs4NDQsNyBAQAogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CkBAIC05NjAsNiArOTE1LDcgQEAKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgpAQCAtOTc3LDYgKzkzMyw3IEBACiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCAmb2JqKTsKQEAgLTEwMjAsNyArOTc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgdGltZXN0YW1wISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBtSWQpOwogICAgICAgICAgICAgICAgICAgICAoKm9uU3RhcnQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA0MywxMSArMTAwMCw2OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KHN0YXRpY19jYXN0PEFDYW1lcmFNZXRhZGF0YSo+KG9iai5nZXQoKSkpOwotICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIG1JZCk7CiAgICAgICAgICAgICAgICAgICAgICgqb25SZXN1bHQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHJlc3VsdC5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgbG9naWNhbENhbWVyYSBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdC0+bVBoeXNpY2FsUmVzdWx0SW5mbzsKKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPEFDYW1lcmFNZXRhZGF0YT4+IHBoeXNpY2FsTWV0YWRhdGFDb3B5OworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkOChwaHlzaWNhbFJlc3VsdEluZm9baV0ubVBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKHBoeXNpY2FsSWQ4LmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxSZXN1bHQtPm1GcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gbWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5LnB1c2hfYmFjayhtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBtSWQpOworICAgICAgICAgICAgICAgICAgICAoKm9uUmVzdWx0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCByZXN1bHQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKSwgcGh5c2ljYWxDYW1lcmFJZFB0cnMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOwpAQCAtMTA2OSw3ICsxMDg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KG9iai5nZXQoKSkpOwogICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUqIGZhaWx1cmUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KGZhaWx1cmVTcC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKICAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGZhaWx1cmUpOwogICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExNDYsNyArMTE2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIG1JZCk7CiAgICAgICAgICAgICAgICAgICAgICgqb25CdWZmZXJMb3N0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCBhbncsIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTU4LDEyICsxMTczLDM0IEBACiB9CiAKIENhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAotICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKLSAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCi0gICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgotICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAotICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksIG1DYWxsYmFja3MoZmlsbENiKGNicykpIHt9CisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MoY2JzKTsKKworICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25DYXB0dXJlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVDb21wbGV0ZWQ7CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKSA6CisgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAorICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sodHJ1ZSkgeworICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGxjYnMpOworCisgICAgaWYgKGxjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IGxjYnMtPm9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgfQorfQogCiB2b2lkCiBDYW1lcmFEZXZpY2U6OmNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgKQEAgLTExODAsOSArMTIxNyw5IEBACiAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOwogICAgICAgICAvLyBzZW5kIHNlcSBhYm9ydGVkIGNhbGxiYWNrCiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxQWJvcnQsIG1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CiAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0gZWxzZSB7CkBAIC0xMjMwLDkgKzEyNjcsOSBAQAogICAgICAgICAgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZXJhc2UoY2JJdCk7CiAgICAgICAgICAgICAvLyBzZW5kIHNlcSBjb21wbGV0ZSBjYWxsYmFjawogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTZXFFbmQsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOwotICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGxhc3RGcmFtZU51bWJlcik7CiAKQEAgLTEzODksNyArMTQyNiw3IEBACiAgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKICAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewogICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7Ci0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tT25DYXB0dXJlU3RhcnRlZDsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xMzk4LDcgKzE0MzUsNyBAQAogICAgICAgICB9CiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTdGFydCwgZGV2LT5tSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKQEAgLTE0MTMsNyArMTQ1MCw2IEBACiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgewotICAgICh2b2lkKSBwaHlzaWNhbFJlc3VsdEluZm9zOwogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogCiAgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKQEAgLTE0NDksOSArMTQ4NSw2IEBACiAgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKICAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewogICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7Ci0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0ID0gaXNQYXJ0aWFsUmVzdWx0ID8KLSAgICAgICAgICAgICAgICBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVQcm9ncmVzc2VkIDoKLSAgICAgICAgICAgICAgICBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVDb21wbGV0ZWQ7CiAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKICAgICAgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLApAQCAtMTQ2MSwxMyArMTQ5NCwyNyBAQAogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CiAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KG5ldyBBQ2FtZXJhTWV0YWRhdGEoCiAgICAgICAgICAgICAgICAgbWV0YWRhdGFDb3B5LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKSk7CisgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ocGh5c2ljYWxSZXN1bHRJbmZvcywgZnJhbWVOdW1iZXIpKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVJlc3VsdCwgZGV2LT5tSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoCisgICAgICAgICAgICAgICAgY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayA/IGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQgOiBrV2hhdENhcHR1cmVSZXN1bHQsCisgICAgICAgICAgICAgICAgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblJlc3VsdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVzdWx0S2V5LCByZXN1bHQpOworICAgICAgICBpZiAoaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkNhcHR1cmVQcm9ncmVzc2VkKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXksIHBoeXNpY2FsUmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZUNvbXBsZXRlZCk7CisgICAgICAgIH0KICAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAKQEAgLTE1MTMsNSArMTU2MCw1IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotCit9IC8vIG5hbWVzcGFjZSBhY2FtCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAppbmRleCAxMzY5MTQ4Li4xMDNlZmQ1IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTQxLDE0ICs0MiwyNSBAQAogI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CiAKIC8vIFdyYXAgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHNvIGl0IGNhbiBiZSByZWYtY291bnRlZAogc3RydWN0IENhbWVyYUNhcHR1cmVGYWlsdXJlIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUge307CiAKKy8vIFdyYXAgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBzbyB0aGF0IGl0IGNhbiBiZSByZWYtY291bnRlZAorc3RydWN0IEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8oY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIGluZm8sCisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyKSA6CisgICAgICAgIG1QaHlzaWNhbFJlc3VsdEluZm8oaW5mbyksIG1GcmFtZU51bWJlcihmcmFtZU51bWJlcikge30KKworICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IG1QaHlzaWNhbFJlc3VsdEluZm87CisgICAgaW50NjRfdCBtRnJhbWVOdW1iZXI7Cit9OworCiBjbGFzcyBDYW1lcmFEZXZpY2UgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CiAgIHB1YmxpYzoKICAgICBDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCisgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAogICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcik7CiAgICAgfkNhbWVyYURldmljZSgpOwogCkBAIC01Niw2ICs2OCw3IEBACiAKICAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCiAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsSWRMaXN0LAogICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3Q7CiAKICAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVNlc3Npb24oCkBAIC0xMDgsMTkgKzEyMSwyMiBAQAogICAgIGNhbWVyYV9zdGF0dXNfdCB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CiAKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IGNhcHR1cmVMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBzdWJtaXRSZXF1ZXN0c0xvY2tlZCgKICAgICAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvdXQqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQsCiAgICAgICAgICAgICBib29sIGlzUmVwZWF0aW5nKTsKQEAgLTEzMCw3ICsxNDYsOCBAQAogICAgIGNhbWVyYV9zdGF0dXNfdCBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBzcDxDYXB0dXJlUmVxdWVzdD4mIG91dFJlcSk7CiAKLSAgICBzdGF0aWMgQUNhcHR1cmVSZXF1ZXN0KiBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSk7CisgICAgc3RhdGljIEFDYXB0dXJlUmVxdWVzdCogYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlSWQpOwogICAgIHN0YXRpYyB2b2lkIGZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0Kik7CiAKICAgICAvLyBvbmx5IEZvciBzZXNzaW9uIHRvIGhvbGQgZGV2aWNlIGxvY2sKQEAgLTE1Niw3ICsxNzMsNyBAQAogICAgIG11dGFibGUgTXV0ZXggbURldmljZUxvY2s7CiAgICAgY29uc3QgU3RyaW5nOCBtQ2FtZXJhSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgSUQKICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1BcHBDYWxsYmFja3M7IC8vIENhbGxiYWNrIHRvIGFwcAotICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IG1DaGFyczsgICAgLy8gQ2FtZXJhIGNoYXJhY3RlcmlzdGljcworICAgIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIGNoYXJhY3RlcmlzdGljcwogICAgIGNvbnN0IHNwPFNlcnZpY2VDYWxsYmFjaz4gbVNlcnZpY2VDYWxsYmFjazsKICAgICBBQ2FtZXJhRGV2aWNlKiBtV3JhcHBlcjsKIApAQCAtMTkxLDYgKzIwOCw3IEBACiAgICAgICAgIC8vIENhcHR1cmUgY2FsbGJhY2tzCiAgICAgICAgIGtXaGF0Q2FwdHVyZVN0YXJ0LCAgICAgLy8gb25DYXB0dXJlU3RhcnRlZAogICAgICAgICBrV2hhdENhcHR1cmVSZXN1bHQsICAgIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQsIG9uQ2FwdHVyZUNvbXBsZXRlZAorICAgICAgICBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0LCAvLyBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZUZhaWwsICAgICAgLy8gb25DYXB0dXJlRmFpbGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUVuZCwgICAgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKICAgICAgICAga1doYXRDYXB0dXJlU2VxQWJvcnQsICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKQEAgLTIwNiw2ICsyMjQsNyBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZVJlcXVlc3RLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtUaW1lU3RhbXBLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVzdWx0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZUZhaWx1cmVLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXF1ZW5jZUlkS2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRnJhbWVOdW1iZXJLZXk7CkBAIC0yMTMsOSArMjMyLDExIEBACiAKICAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDYWxsYmFja0hhbmRsZXIoY29uc3QgY2hhciogaWQpOwogICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKIAogICAgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgbUlkOwogICAgICAgICAvLyBUaGlzIGhhbmRsZXIgd2lsbCBjYWNoZSBhbGwgY2FwdHVyZSBzZXNzaW9uIHNwIHVudGlsIGtXaGF0Q2xlYW5VcFNlc3Npb25zCiAgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGUgbGFzdCBzZXNzaW9uIHJlZmVyZW5jZSBpcyBhbHdheXMKICAgICAgICAgLy8gYmVpbmcgcmVtb3ZlZCBpbiBjYWxsYmFjayB0aHJlYWQgd2l0aG91dCBob2xkaW5nIGNhbWVyYSBkZXZpY2UgbG9jawpAQCAtMjQ0LDE5ICsyNjUsNDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicyk7CisgICAgICAgIENhbGxiYWNrSG9sZGVyKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicyk7CiAKLSAgICAgICAgc3RhdGljIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIGZpbGxDYigKLSAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSB7CisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICB2b2lkIGluaXRDYXB0dXJlQ2FsbGJhY2tzKFQqIGNicykgeworICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gbnVsbHB0cjsKICAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiAqY2JzOworICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gY2JzLT5vbkNhcHR1cmVTdGFydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gY2JzLT5vbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVGYWlsZWQgPSBjYnMtPm9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IGNicy0+b25DYXB0dXJlQnVmZmVyTG9zdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB7IG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIgfTsKICAgICAgICAgfQotCiAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICBtU2Vzc2lvbjsKICAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IG1SZXF1ZXN0czsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgbUNhbGxiYWNrczsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKKworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBtT25DYXB0dXJlRmFpbGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBtT25DYXB0dXJlQnVmZmVyTG9zdDsKICAgICB9OwogICAgIC8vIHNlcXVlbmNlIGlkIC0+IGNhbGxiYWNrcyBtYXAKICAgICBzdGQ6Om1hcDxpbnQsIENhbGxiYWNrSG9sZGVyPiBtU2VxdWVuY2VDYWxsYmFja01hcDsKQEAgLTI4Myw5ICszMzEsMTEgQEAKICAgICAvLyBNaXNjIHZhcmlhYmxlcwogICAgIGludDMyX3QgbVNoYWRpbmdNYXBTaXplWzJdOyAgIC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCiAgICAgaW50MzJfdCBtUGFydGlhbFJlc3VsdENvdW50OyAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsSWRzOyAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgogCiB9OwogCit9IC8vIG5hbWVzcGFjZSBhY2FtOwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogLyoqCkBAIC0yOTQsOCArMzQ0LDggQEAKICAqLwogc3RydWN0IEFDYW1lcmFEZXZpY2UgewogICAgIEFDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKLSAgICAgICAgICAgIG1EZXZpY2UobmV3IENhbWVyYURldmljZShpZCwgY2IsIHN0ZDo6bW92ZShjaGFycyksIHRoaXMpKSB7fQorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycykgOgorICAgICAgICAgICAgbURldmljZShuZXcgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlKGlkLCBjYiwgY2hhcnMsIHRoaXMpKSB7fQogCiAgICAgfkFDYW1lcmFEZXZpY2UoKSB7fTsKIApAQCAtMzA2LDggKzM1Niw5IEBACiAKICAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCiAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAogICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3QgewotICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVJlcXVlc3QodGVtcGxhdGVJZCwgcmVxdWVzdCk7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBwaHlzaWNhbENhbWVyYUlkTGlzdCwgcmVxdWVzdCk7CiAgICAgfQogCiAgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKApAQCAtMzMxLDcgKzM4Miw3IEBACiAgICAgfQogCiAgIHByaXZhdGU6Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gbURldmljZTsKIH07CiAKICNlbmRpZiAvLyBfQUNBTUVSQV9ERVZJQ0VfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzUzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5pbmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAiQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2FwdHVyZUxvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkLAorICAgICAgICBib29sIGlzUmVwZWF0aW5nKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCBjYXB0dXJlIHJlcXVlc3QgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIEZvcm0gdHdvIHZlY3RvcnMgb2YgY2FwdHVyZSByZXF1ZXN0LCBvbmUgZm9yIGludGVybmFsIHRyYWNraW5nCisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0TGlzdDsKKyAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdHNWOworICAgIHJlcXVlc3RzVi5zZXRDYXBhY2l0eShudW1SZXF1ZXN0cyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZXF1ZXN0czsgaSsrKSB7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXE7CisgICAgICAgIHJldCA9IGFsbG9jYXRlQ2FwdHVyZVJlcXVlc3QocmVxdWVzdHNbaV0sIHJlcSk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNvbnZlcnQgY2FwdHVyZSByZXF1ZXN0IHRvIGludGVybmFsIGZvcm1hdCBmYWlsdXJlISByZXQgJWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVxLT5tU3VyZmFjZUxpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIkNhcHR1cmUgcmVxdWVzdCB3aXRob3V0IG91dHB1dCB0YXJnZXQgY2Fubm90IGJlIHN1Ym1pdHRlZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjaygqKHJlcS5nZXQoKSkpOworICAgICAgICByZXF1ZXN0c1YucHVzaF9iYWNrKHJlcSk7CisgICAgfQorCisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZW1vdGVSZXQ7CisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvIGluZm87CisgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+c3VibWl0UmVxdWVzdExpc3QocmVxdWVzdExpc3QsIGlzUmVwZWF0aW5nLCAmaW5mbyk7CisgICAgaW50IHNlcXVlbmNlSWQgPSBpbmZvLm1SZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSBpbmZvLm1MYXN0RnJhbWVOdW1iZXI7CisgICAgaWYgKHNlcXVlbmNlSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IHJlcXVlc3QgcmVtb3RlIGZhaWx1cmU6IHJldCAlZCIsIGdldElkKCksIHNlcXVlbmNlSWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIENhbGxiYWNrSG9sZGVyIGNiSG9sZGVyKHNlc3Npb24sIHJlcXVlc3RzViwgaXNSZXBlYXRpbmcsIGNicyk7CisgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGNiSG9sZGVyKSk7CisKKyAgICBpZiAoaXNSZXBlYXRpbmcpIHsKKyAgICAgICAgLy8gc3RvcFJlcGVhdGluZyBhYm92ZSBzaG91bGQgaGF2ZSBjbGVhbnVwIHJlcGVhdGluZyBzZXF1ZW5jZSBpZAorICAgICAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgfQorICAgICAgICBtUmVwZWF0aW5nU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICB9CisKKyAgICBpZiAobUlkbGUpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgbUlkbGUgPSBmYWxzZTsKKyAgICBtQnVzeVNlc3Npb24gPSBzZXNzaW9uOworCisgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCBjNTlkMGU3Li45ZDQwZmQ3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTI2LDkgKzI2LDEwIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0gewogLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucwogY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbWVyYUlkS2V5ICAgPSAiQ2FtZXJhSWQiOwogY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbGxiYWNrRnBLZXkgPSAiQ2FsbGJhY2tGcCI7CkBAIC0xOTIsNiArMTkzLDIwIEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDYWxsYmFjayBjYihjYWxsYmFjayk7CisgICAgbUNhbGxiYWNrcy5pbnNlcnQoY2IpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnVucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIENhbGxiYWNrIGNiKGNhbGxiYWNrKTsKKyAgICBtQ2FsbGJhY2tzLmVyYXNlKGNiKTsKK30KKwogdm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpyZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAogICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTI4OCwxMiArMzAzLDQwIEBACiAgICAgICAgICAgICAoKmNiKShjb250ZXh0LCBjYW1lcmFJZC5jX3N0cigpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTZW5kU2luZ2xlQWNjZXNzQ2FsbGJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0FjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkQ2FsbGJhY2sgY2I7CisgICAgICAgICAgICB2b2lkKiBjb250ZXh0OworICAgICAgICAgICAgQVN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmY2IpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIGNhbGxiYWNrIGZwISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpjYikoY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKSB7CisgICAgc3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gY20gPSBtQ2FtZXJhTWFuYWdlci5wcm9tb3RlKCk7CisgICAgaWYgKGNtICE9IG51bGxwdHIpIHsKKyAgICAgICAgY20tPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGRlbGl2ZXIgY2FtZXJhIGFjY2VzcyBwcmlvcml0eSBjYWxsYmFjay4gR2xvYmFsIGNhbWVyYSBtYW5hZ2VyIGRpZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uU3RhdHVzQ2hhbmdlZCgKICAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCkgewogICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOwpAQCAtMzA1LDYgKzM0OCwxOSBAQAogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChhdXRvIGNiIDogbUNhbGxiYWNrcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUFjY2Vzc0NhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0FjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkQ2FsbGJhY2sgY2JGcCA9IGNiLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQ7CisgICAgICAgIGlmIChjYkZwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2JGcCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiLm1Db250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6Om9uU3RhdHVzQ2hhbmdlZCgKICAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTM0NSw2ICs0MDEsNyBAQAogICAgIH0KIH0KIAorfSAvLyBuYW1lc3BhY2UgYWNhbQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAvKioKQEAgLTQwMiw3ICs0NTksNyBAQAogfQogCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgY29uc3QgY2hhciAqY2FtZXJhSWRTdHIsIEFDYW1lcmFNZXRhZGF0YSAqKmNoYXJhY3RlcmlzdGljcykgeworICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZFN0ciwgc3A8QUNhbWVyYU1ldGFkYXRhPiogY2hhcmFjdGVyaXN0aWNzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKQEAgLTQzNywxOCArNDk0LDE2IEBACiAgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLAogICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBvdXREZXZpY2UpIHsKLSAgICBBQ2FtZXJhTWV0YWRhdGEqIHJhd0NoYXJzOwotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsICZyYXdDaGFycyk7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFyczsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmY2hhcnMpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBjYW1lcmEgJXMuIGVyciAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwgcmV0KTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQotICAgIHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKHJhd0NoYXJzKTsKLSAgICByYXdDaGFycyA9IG51bGxwdHI7CiAKLSAgICBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UgPSBuZXcgQUNhbWVyYURldmljZShjYW1lcmFJZCwgY2FsbGJhY2ssIHN0ZDo6bW92ZShjaGFycykpOworICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgY2hhcnMpOwogCiAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOwogICAgIGlmIChjcyA9PSBudWxscHRyKSB7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCmluZGV4IGNjNDJmNzcuLjhjMWRhMzYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bWFwPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CiAKIC8qKgogICogUGVyLXByb2Nlc3Mgc2luZ2xldG9uIGluc3RhbmNlIG9mIENhbWVyYU1hbmdlci4gU2hhcmVkIGJ5IGFsbCBBQ2FtZXJhTWFuYWdlcgpAQCAtNTMsNiArNTQsMTEgQEAKICAgICB2b2lkIHVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spOwogCisgICAgdm9pZCByZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spOworICAgIHZvaWQgdW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spOworCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGNhbWVyYSBJRHMgdGhhdCBzdXBwb3J0IGNhbWVyYTIKICAgICAgKi8KQEAgLTg1LDYgKzkxLDggQEAKICAgICAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAgICAgfQogCisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpOworCiAgICAgICBwcml2YXRlOgogICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKICAgICB9OwpAQCAtOTUsMTEgKzEwMywxOSBAQAogICAgICAgICBleHBsaWNpdCBDYWxsYmFjayhjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSA6CiAgICAgICAgICAgICBtQXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYUF2YWlsYWJsZSksCiAgICAgICAgICAgICBtVW5hdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZChudWxscHRyKSwKICAgICAgICAgICAgIG1Db250ZXh0KGNhbGxiYWNrLT5jb250ZXh0KSB7fQogCisgICAgICAgIGV4cGxpY2l0IENhbGxiYWNrKGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgOgorICAgICAgICAgICAgbUF2YWlsYWJsZShjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlKSwKKyAgICAgICAgICAgIG1VbmF2YWlsYWJsZShjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZChjYWxsYmFjay0+b25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCksCisgICAgICAgICAgICBtQ29udGV4dChjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLmNvbnRleHQpIHt9CisKICAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gKG1BdmFpbGFibGUgPT0gb3RoZXIubUF2YWlsYWJsZSAmJgogICAgICAgICAgICAgICAgICAgICBtVW5hdmFpbGFibGUgPT0gb3RoZXIubVVuYXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NQcmlvcml0eUNoYW5nZWQgPT0gb3RoZXIubUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZCAmJgogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dCA9PSBvdGhlci5tQ29udGV4dCk7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CkBAIC0xMDgsNiArMTI0LDkgQEAKICAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG90aGVyLm1Db250ZXh0KSByZXR1cm4gbUNvbnRleHQgPCBvdGhlci5tQ29udGV4dDsKKyAgICAgICAgICAgIGlmIChtQWNjZXNzUHJpb3JpdHlDaGFuZ2VkICE9IG90aGVyLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZCA8IG90aGVyLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZSAhPSBvdGhlci5tQXZhaWxhYmxlKSByZXR1cm4gbUF2YWlsYWJsZSA8IG90aGVyLm1BdmFpbGFibGU7CiAgICAgICAgICAgICByZXR1cm4gbVVuYXZhaWxhYmxlIDwgb3RoZXIubVVuYXZhaWxhYmxlOwogICAgICAgICB9CkBAIC0xMTYsMTMgKzEzNSwxNSBAQAogICAgICAgICB9CiAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1BdmFpbGFibGU7CiAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1VbmF2YWlsYWJsZTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQWNjZXNzUHJpb3JpdGllc0NoYW5nZWRDYWxsYmFjayBtQWNjZXNzUHJpb3JpdHlDaGFuZ2VkOwogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKICAgICB9OwogICAgIHN0ZDo6c2V0PENhbGxiYWNrPiBtQ2FsbGJhY2tzOwogCiAgICAgLy8gZGVmaW5pdGlvbiBvZiBoYW5kbGVyIGFuZCBtZXNzYWdlCiAgICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrCisgICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLAorICAgICAgICBrV2hhdFNlbmRTaW5nbGVBY2Nlc3NDYWxsYmFjaywKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FtZXJhSWRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OwpAQCAtMTM1LDYgKzE1Niw3IEBACiAgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKICAgICBzcDxBTG9vcGVyPiAgICAgICAgIG1DYkxvb3BlcjsgLy8gTG9vcGVyIHRocmVhZCB3aGVyZSBjYWxsYmFja3MgYWN0dWFsbHkgaGFwcGVuIG9uCiAKKyAgICB2b2lkIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKTsKICAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlZChpbnQzMl90IHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOwogICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGludDMyX3Qgc3RhdHVzLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CiAgICAgLy8gVXRpbHMgZm9yIHN0YXR1cwpAQCAtMTcyLDYgKzE5NCw3IEBACiAgICAgfkNhbWVyYU1hbmFnZXJHbG9iYWwoKTsKIH07CiAKK30gLy8gbmFtZXNwYWNlIGFjYW07CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOwogCiAvKioKQEAgLTE4MCwxMyArMjAzLDEzIEBACiAgKi8KIHN0cnVjdCBBQ2FtZXJhTWFuYWdlciB7CiAgICAgQUNhbWVyYU1hbmFnZXIoKSA6Ci0gICAgICAgICAgICBtR2xvYmFsTWFuYWdlcigmKGFuZHJvaWQ6OkNhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkpKSB7fQorICAgICAgICAgICAgbUdsb2JhbE1hbmFnZXIoJihhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpKSkge30KICAgICB+QUNhbWVyYU1hbmFnZXIoKTsKICAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqKiBjYW1lcmFJZExpc3QpOwogICAgIHN0YXRpYyB2b2lkICAgICBkZWxldGVDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCogY2FtZXJhSWRMaXN0KTsKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZCwgQUNhbWVyYU1ldGFkYXRhICoqY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBhbmRyb2lkOjpzcDxBQ2FtZXJhTWV0YWRhdGE+KiBjaGFyYWN0ZXJpc3RpY3MpOwogICAgIGNhbWVyYV9zdGF0dXNfdCBvcGVuQ2FtZXJhKGNvbnN0IGNoYXIqIGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogZGV2aWNlKTsKQEAgLTE5Niw3ICsyMTksNyBAQAogICAgICAgICBrQ2FtZXJhSWRMaXN0Tm90SW5pdCA9IC0xCiAgICAgfTsKICAgICBhbmRyb2lkOjpNdXRleCAgICAgICAgIG1Mb2NrOwotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkNhbWVyYU1hbmFnZXJHbG9iYWw+IG1HbG9iYWxNYW5hZ2VyOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw+IG1HbG9iYWxNYW5hZ2VyOwogfTsKIAogI2VuZGlmIC8vX0FDQU1FUkFfTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IDlkMzQxYWUuLmQ4MzJkZWIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC0zNiw2ICszNiwxMCBAQAogICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyk7CiAgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TKTsKICAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TKTsKKyAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyk7CiAgICAgfQogICAgIC8vIFRPRE86IGZpbHRlciByZXF1ZXN0L3Jlc3VsdCBrZXlzCiB9CkBAIC01MCw2ICs1NCw3IEBACiAgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUkVBRF9TRU5TT1JfU0VUVElOR1M6CiAgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQlVSU1RfQ0FQVFVSRToKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ERVBUSF9PVVRQVVQ6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkE6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ZVVZfUkVQUk9DRVNTSU5HOgogICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1BSSVZBVEVfUkVQUk9DRVNTSU5HOgpAQCAtNzksMTEgKzg0LDQyIEBACiAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CiAgICAgICAgIGlmIChpc05ka1N1cHBvcnRlZENhcGFiaWxpdHkoY2FwYWJpbGl0eSkpIHsKICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpOworCisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkgeworICAgICAgICAgICAgICAgIGRlcml2ZVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgbURhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpOwogfQogCit2b2lkCitBQ2FtZXJhTWV0YWRhdGE6OmRlcml2ZVBoeXNpY2FsQ2FtZXJhSWRzKCkgeworICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBlbnRyeTsKKyAgICBhdXRvIHJldCA9IGdldENvbnN0RW50cnkoQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMsICZlbnRyeSk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogR2V0IEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTIGtleSBmYWlsZWQuIHJldCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCogaWRzID0gZW50cnkuZGF0YS51ODsKKyAgICBzaXplX3Qgc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgeworICAgICAgICBpZiAoaWRzW2ldID09ICdcMCcpIHsKKyAgICAgICAgICAgIGlmIChzdGFydCAhPSBpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRWYWx1ZXMucHVzaF9iYWNrKFN0cmluZzgoKGNvbnN0IGNoYXIgKilpZHMrc3RhcnQpKTsKKyAgICAgICAgICAgICAgICBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkVmFsdWVzLmJhY2soKS5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCA9IGkrMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpIDwgMikgeworICAgICAgICBBTE9HVygiJXM6IExvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZSBvbmx5IGhhcyAlenUgcGh5c2ljYWwgY2FtZXJhcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpKTsKKyAgICB9Cit9CiAKIHZvaWQKIEFDYW1lcmFNZXRhZGF0YTo6ZmlsdGVyRHVyYXRpb25zKHVpbnQzMl90IHRhZykgewpAQCAtMTQyLDYgKzE3OCwyNiBAQAogICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZHVyYXRpb24pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9IRUlDOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlCiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtvd24gdGFnIDB4JXgiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CkBAIC0yMjgsNiArMjg0LDU2IEBACiAgICAgICAgICAgICAgICAgZmlsdGVyZWREZXB0aFN0cmVhbUNvbmZpZ3MpOwogICAgIH0KIAorICAgIGVudHJ5ID0gbURhdGEuZmluZChBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBWZWN0b3I8aW50MzJfdD4gZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlnczsKKyAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnNldENhcGFjaXR5KGVudHJ5LmNvdW50KTsKKworICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IHdpZHRoID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgaWYgKGlzSW5wdXQgPT0gQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCkgeworICAgICAgICAgICAgLy8gSGlkZSBpbnB1dCBzdHJlYW1zCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUcmFuc2xhdGUgSEFMIGZvcm1hdHMgdG8gTkRLIGZvcm1hdAorICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9IRUlDOworICAgICAgICB9CisKKyAgICAgICAgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnB1c2hfYmFjayhpc0lucHV0KTsKKyAgICB9CisgICAgbURhdGEudXBkYXRlKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMsIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3MpOworCisgICAgZW50cnkgPSBtRGF0YS5maW5kKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBWZWN0b3I8aW50MzJfdD4gZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzOworICAgIGZpbHRlcmVkRHluYW1pY0RlcHRoU3RyZWFtQ29uZmlncy5zZXRDYXBhY2l0eShlbnRyeS5jb3VudCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IHdpZHRoID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgaWYgKGlzSW5wdXQgPT0gQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQpIHsKKyAgICAgICAgICAgIC8vIEhpZGUgaW5wdXQgc3RyZWFtcworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gVHJhbnNsYXRlIEhBTCBmb3JtYXRzIHRvIE5ESyBmb3JtYXQKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzsKKyAgICAgICAgfQorCisgICAgICAgIGZpbHRlcmVkRHluYW1pY0RlcHRoU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgIGZpbHRlcmVkRHluYW1pY0RlcHRoU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzLnB1c2hfYmFjayhpc0lucHV0KTsKKyAgICB9CisgICAgbURhdGEudXBkYXRlKEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzKTsKIH0KIAogYm9vbApAQCAtMzIyLDYgKzQyOCwyNyBAQAogICAgIHJldHVybiBtRGF0YTsKIH0KIAorYm9vbAorQUNhbWVyYU1ldGFkYXRhOjppc0xvZ2ljYWxNdWx0aUNhbWVyYShzaXplX3QqIGNvdW50LCBjb25zdCBjaGFyKmNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpIGNvbnN0IHsKKyAgICBpZiAobVR5cGUgIT0gQUNNX0NIQVJBQ1RFUklTVElDUykgeworICAgICAgICBBTE9HRSgiJXMgbXVzdCBiZSBjYWxsZWQgZm9yIGEgc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGNvdW50ID09IG51bGxwdHIgfHwgcGh5c2ljYWxDYW1lcmFJZHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQgY291bnQ6ICVwLCBwaHlzaWNhbENhbWVyYUlkczogJXAiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY291bnQsIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpID49IDIpIHsKKyAgICAgICAgKmNvdW50ID0gbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKTsKKyAgICAgICAgKnBoeXNpY2FsQ2FtZXJhSWRzID0gbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRzLmRhdGEoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCiAvLyBUT0RPOiBzb21lIG9mIGtleSBiZWxvdyBzaG91bGQgYmUgaGlkZGVuIGZyb20gdXNlcgogLy8gZXg6IEFDQU1FUkFfUkVRVUVTVF9JRCBhbmQgQUNBTUVSQV9SRVBST0NFU1NfRUZGRUNUSVZFX0VYUE9TVVJFX0ZBQ1RPUgogLypAT35AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH4KQEAgLTQ0Myw3ICs1NzAsMTAgQEAKICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19NQVhfSElTVE9HUkFNX0NPVU5ULAogICAgIEFORFJPSURfU1RBVElTVElDU19JTkZPX01BWF9TSEFSUE5FU1NfTUFQX1ZBTFVFLAogICAgIEFORFJPSURfU1RBVElTVElDU19JTkZPX1NIQVJQTkVTU19NQVBfU0laRSwKKyAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT04sCiAgICAgQU5EUk9JRF9ERVBUSF9NQVhfREVQVEhfU0FNUExFUywKKyAgICBBTkRST0lEX0hFSUNfSU5GT19TVVBQT1JURUQsCisgICAgQU5EUk9JRF9IRUlDX0lORk9fTUFYX0pQRUdfQVBQX1NFR01FTlRTX0NPVU5ULAogfSk7CiAKIC8qfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH4KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaAppbmRleCBlNzZiODBjLi4zZDg5NWNiIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oCkBAIC0xNywxMiArMTcsMTkgQEAKICNkZWZpbmUgX0FDQU1FUkFfTUVUQURBVEFfSAogCiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgordXNpbmcgQ2FtZXJhTWV0YWRhdGEgPSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6Q2FtZXJhTWV0YWRhdGE7CisjZWxzZQogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaD4KIApAQCAtNTksNiArNjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jb25zdCB1aW50MzJfdCoqIHRhZ3MpIGNvbnN0OwogCiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGdldEludGVybmFsRGF0YSgpIGNvbnN0OworICAgIGJvb2wgaXNMb2dpY2FsTXVsdGlDYW1lcmEoc2l6ZV90KiBjb3VudCwgY29uc3QgY2hhciogY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgY29uc3Q7CiAKICAgcHJpdmF0ZToKIApAQCAtNjgsNiArNzYsNyBAQAogICAgIHZvaWQgZmlsdGVyVW5zdXBwb3J0ZWRGZWF0dXJlcygpOyAvLyBIaWRlIGZlYXR1cmVzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IE5ESwogICAgIHZvaWQgZmlsdGVyU3RyZWFtQ29uZmlndXJhdGlvbnMoKTsgLy8gSGlkZSBpbnB1dCBzdHJlYW1zLCB0cmFuc2xhdGUgaGFsIGZvcm1hdCB0byBOREsgZm9ybWF0cwogICAgIHZvaWQgZmlsdGVyRHVyYXRpb25zKHVpbnQzMl90IHRhZyk7IC8vIHRyYW5zbGF0ZSBoYWwgZm9ybWF0IHRvIE5ESyBmb3JtYXRzCisgICAgdm9pZCBkZXJpdmVQaHlzaWNhbENhbWVyYUlkcygpOyAvLyBEZXJpdmUgYXJyYXkgb2YgcGh5c2ljYWwgaWRzLgogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJOQUxfVCwgdHlwZW5hbWUgTkRLX1Q+CiAgICAgY2FtZXJhX3N0YXR1c190IHVwZGF0ZUltcGwodWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgTkRLX1QqIGRhdGEpIHsKQEAgLTEwNiw2ICsxMTUsOSBAQAogICAgIGNvbnN0IEFDQU1FUkFfTUVUQURBVEFfVFlQRSBtVHlwZTsKIAogICAgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHNTeXN0ZW1UYWdzOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkczsKKyAgICBzdGQ6OnZlY3RvcjxTdHJpbmc4PiBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZFZhbHVlczsKIH07CiAKICNlbmRpZiAvLyBfQUNBTUVSQV9NRVRBREFUQV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmgKaW5kZXggMDZiMmNjMy4uMmZmY2FmZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaApAQCAtMTgsMTEgKzE4LDE1IEBACiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaD4KICNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oIgorI2Vsc2UKIHN0cnVjdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0IHsKLSAgICBleHBsaWNpdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CisgICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChBQ2FtZXJhV2luZG93VHlwZSogd2luZG93KSA6IG1XaW5kb3cod2luZG93KSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtV2luZG93ID09IG90aGVyLm1XaW5kb3c7CkBAIC0zNyw4ICs0MSw5IEBACiAgICAgICAgIHJldHVybiBtV2luZG93ID4gb3RoZXIubVdpbmRvdzsKICAgICB9CiAKLSAgICBBTmF0aXZlV2luZG93KiBtV2luZG93OworICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBtV2luZG93OwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldHMgewogICAgIHN0ZDo6c2V0PEFDYW1lcmFPdXRwdXRUYXJnZXQ+IG1PdXRwdXRzOwpAQCAtNTUsNyArNjAsOCBAQAogICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKICAgICB9CiAKLSAgICBBQ2FtZXJhTWV0YWRhdGEqICAgICAgc2V0dGluZ3M7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBzZXR0aW5nczsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPEFDYW1lcmFNZXRhZGF0YT4+IHBoeXNpY2FsU2V0dGluZ3M7CiAgICAgQUNhbWVyYU91dHB1dFRhcmdldHMqIHRhcmdldHM7CiAgICAgdm9pZCogICAgICAgICAgICAgICAgIGNvbnRleHQ7CiB9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IDVlMGRiNjAuLmQxM2E4MTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTM1LDEwICszNSwxMCBAQAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka0NhbWVyYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrQ2FtZXJhTWV0YWRhdGEuaCIKICNpbmNsdWRlICJOZGtDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgIk5ka0NhbWVyYVdpbmRvd1R5cGUuaCIKIAogI2lmbmRlZiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSAogI2RlZmluZSBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSApAQCAtMjQ2LDcgKzI0Niw3IEBACiAgKi8KIHR5cGVkZWYgdm9pZCAoKkFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCkoCiAgICAgICAgIHZvaWQqIGNvbnRleHQsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKLSAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBBTmF0aXZlV2luZG93KiB3aW5kb3csIGludDY0X3QgZnJhbWVOdW1iZXIpOworICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGludDY0X3QgZnJhbWVOdW1iZXIpOwogCiB0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyB7CiAgICAgLy8vIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQuCkBAIC02NDMsNiArNjQzLDEwMyBAQAogICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorLyoqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiBmaW5hbCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayB3aXRoIGxvZ2ljYWwgbXVsdGktY2FtZXJhIHN1cHBvcnQuCisgKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBmaW5hbCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCwgd2l0aAorICogYWRkZWQgYWJpbGl0eSB0byByZXR1cm4gcGh5c2ljYWwgY2FtZXJhIHJlc3VsdCBtZXRhZGF0YSB3aXRoaW4gYSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqCisgKiBGb3IgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBJZCBhbmQgcmVzdWx0IG1ldGFkYXRhCisgKiBvZiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmFzLCB3aGljaCB0aGUgY29ycmVzcG9uZGluZyBjYXB0dXJlIHJlcXVlc3QgY29udGFpbnMgdGFyZ2V0cyBmb3IuCisgKiBJZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGRvZXNuJ3QgY29udGFpbiB0YXJnZXRzIHNwZWNpZmljIHRvIGFueSBwaHlzaWNhbCBjYW1lcmEsIG9yIHRoZSBjdXJyZW50CisgKiBjYW1lcmEgZGV2aWNlIGlzbid0IGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHBoeXNpY2FsUmVzdWx0Q291bnQgd2lsbCBiZSAwLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IFRoZSBvcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0IHByb3ZpZGVkIGJ5IHVzZXIgaW4KKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc30uCisgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgY2FtZXJhIGNhcHR1cmUgc2Vzc2lvbiBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSByZXF1ZXN0IFRoZSBjYXB0dXJlIHJlcXVlc3Qgb2YgaW50ZXJlc3QuIE5vdGUgdGhhdCB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIGEgY29weSBvZgorICogICAgICAgICAgICAgICAgY2FwdHVyZSByZXF1ZXN0IHNlbnQgYnkgYXBwbGljYXRpb24sIHNvIHRoZSBhZGRyZXNzIGlzIGRpZmZlcmVudCB0byB3aGF0CisgKiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzZW50IGJ1dCB0aGUgY29udGVudCB3aWxsIG1hdGNoLiBUaGlzIHJlcXVlc3Qgd2lsbCBiZSBmcmVlZCBieQorICogICAgICAgICAgICAgICAgZnJhbWV3b3JrIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY2FsbGJhY2sgcmV0dXJucy4KKyAqIEBwYXJhbSByZXN1bHQgVGhlIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHJlcG9ydGVkIGJ5IGNhbWVyYSBkZXZpY2UuIFRoZSBtZW1vcnkgaXMgbWFuYWdlZCBieQorICogICAgICAgICAgICAgICAgY2FtZXJhIGZyYW1ld29yay4gRG8gbm90IGFjY2VzcyB0aGlzIHBvaW50ZXIgYWZ0ZXIgdGhpcyBjYWxsYmFjayByZXR1cm5zLgorICogQHBhcmFtIHBoeXNpY2FsUmVzdWx0Q291bnQgVGhlIG51bWJlciBvZiBwaHlzaWNhbCBjYW1lcmEgcmVzdWx0IG1ldGFkYXRhCisgKiBAcGFyYW0gcGh5c2ljYWxDYW1lcmFJZHMgVGhlIGFycmF5IG9mIHBoeXNpY2FsIGNhbWVyYSBJRHMgb24gd2hpY2ggdGhlCisgKiAgICAgICAgICAgICAgICBwaHlzaWNhbCByZXN1bHQgbWV0YWRhdGEgYXJlIHJlcG9ydGVkLgorICogQHBhcmFtIHBoeXNpY2FsUmVzdWx0cyBUaGUgYXJyYXkgb2YgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgcmVwb3J0ZWQgYnkgdGhlCisgKiAgICAgICAgICAgICAgICBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlcy4KKyAqLwordHlwZWRlZiB2b2lkICgqQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCkoCisgICAgICAgIHZvaWQqIGNvbnRleHQsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBBQ2FtZXJhTWV0YWRhdGEqIHJlc3VsdCwKKyAgICAgICAgc2l6ZV90IHBoeXNpY2FsUmVzdWx0Q291bnQsIGNvbnN0IGNoYXIqKiBwaHlzaWNhbENhbWVyYUlkcywKKyAgICAgICAgY29uc3QgQUNhbWVyYU1ldGFkYXRhKiogcGh5c2ljYWxSZXN1bHRzKTsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzLAorICogd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgYW4gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCBjYWxsYmFjayBpcworICogdXNlZCwgaW5zdGVhZCBvZiBvbkNhcHR1cmVDb21wbGV0ZWQsIHRvIHN1cHBvcnQgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MgeworICAgIC8qKgorICAgICAqIFNhbWUgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MKKyAgICAgKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0ICAgICAgICAgb25DYXB0dXJlU3RhcnRlZDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCAgICAgICAgb25DYXB0dXJlUHJvZ3Jlc3NlZDsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gYW4gaW1hZ2UgY2FwdHVyZSBoYXMgZnVsbHkgY29tcGxldGVkIGFuZCBhbGwgdGhlCisgICAgICogcmVzdWx0IG1ldGFkYXRhIGlzIGF2YWlsYWJsZS4gRm9yIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHRoaXMgY2FsbGJhY2sKKyAgICAgKiBhbHNvIHJldHVybnMgdGhlIHJlc3VsdCBtZXRhZGF0YSBmb3IgYWxsIHBoeXNpY2FsIGNhbWVyYXMgYmVpbmcKKyAgICAgKiBleHBsaWNpdGx5IHJlcXVlc3RlZCBvbi4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgY2FsbGJhY2sgd2lsbCBhbHdheXMgZmlyZSBhZnRlciB0aGUgbGFzdCB7QGxpbmsgb25DYXB0dXJlUHJvZ3Jlc3NlZH07CisgICAgICogaW4gb3RoZXIgd29yZHMsIG5vIG1vcmUgcGFydGlhbCByZXN1bHRzIHdpbGwgYmUgZGVsaXZlcmVkIG9uY2UgdGhlIGNvbXBsZXRlZCByZXN1bHQKKyAgICAgKiBpcyBhdmFpbGFibGUuPC9wPgorICAgICAqCisgICAgICogPHA+Rm9yIHBlcmZvcm1hbmNlLWludGVuc2l2ZSB1c2UtY2FzZXMgd2hlcmUgbGF0ZW5jeSBpcyBhIGZhY3RvciwgY29uc2lkZXIKKyAgICAgKiB1c2luZyB7QGxpbmsgb25DYXB0dXJlUHJvZ3Jlc3NlZH0gaW5zdGVhZC48L3A+CisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIEFDYXB0dXJlUmVxdWVzdCBwb2ludGVyIGluIHRoZSBjYWxsYmFjayB3aWxsIG5vdCBtYXRjaCB3aGF0IGFwcGxpY2F0aW9uIGhhcworICAgICAqIHN1Ym1pdHRlZCwgYnV0IHRoZSBjb250ZW50cyB0aGUgQUNhcHR1cmVSZXF1ZXN0IHdpbGwgbWF0Y2ggd2hhdCBhcHBsaWNhdGlvbiBzdWJtaXR0ZWQuPC9wPgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MKKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCAgICAgICAgb25DYXB0dXJlRmFpbGVkOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VFbmQgICBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCAgICBvbkNhcHR1cmVCdWZmZXJMb3N0OworfSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmUsIHdpdGggYWRkZWQKKyAqIHN1cHBvcnQgZm9yIGxvZ2ljYWwgbXVsdGktY2FtZXJhIHdoZXJlIHRoZSBjYXB0dXJlIGNhbGxiYWNrcyBzdXBwb3J0cyByZXN1bHQgbWV0YWRhdGEgZm9yCisgKiBwaHlzaWNhbCBjYW1lcmFzLgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZSgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdCwgd2l0aCBhZGRlZAorICogc3VwcG9ydCBmb3IgbG9naWNhbCBtdWx0aS1jYW1lcmEgd2hlcmUgdGhlIGNhcHR1cmUgY2FsbGJhY2tzIHN1cHBvcnRzIHJlc3VsdCBtZXRhZGF0YSBmb3IKKyAqIHBoeXNpY2FsIGNhbWVyYXMuCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQU1FUkFfQ0FQVFVSRV9TRVNTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCmluZGV4IDdjMTNiMzQuLmNlZGY4M2EgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaApAQCAtMzQsMTAgKzM0LDEwIEBACiAgKi8KICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka0NhbWVyYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJOZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorI2luY2x1ZGUgIk5ka0NhbWVyYVdpbmRvd1R5cGUuaCIKIAogI2lmbmRlZiBfTkRLX0NBTUVSQV9ERVZJQ0VfSAogI2RlZmluZSBfTkRLX0NBTUVSQV9ERVZJQ0VfSApAQCAtNTMsNiArNTMsMTcgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYURldmljZSBBQ2FtZXJhRGV2aWNlOwogCisvKioKKyAqIFN0cnVjdCB0byBob2xkIGxpc3Qgb2YgY2FtZXJhIGRldmljZSBJZHMuIFRoaXMgY2FuIHJlZmVyIHRvIGVpdGhlciB0aGUgSWRzCisgKiBvZiBjb25uZWN0ZWQgY2FtZXJhIGRldmljZXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhSWRMaXN0fSwKKyAqIG9yIHRoZSBwaHlzaWNhbCBjYW1lcmEgSWRzIHBhc3NlZCBpbnRvCisgKiB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICovCit0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhSWRMaXN0IHsKKyAgICBpbnQgbnVtQ2FtZXJhczsgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgY2FtZXJhIGRldmljZSBJZHMKKyAgICBjb25zdCBjaGFyKiogY2FtZXJhSWRzOyAgLy8vPCBsaXN0IG9mIGNhbWVyYSBkZXZpY2UgSWRzCit9IEFDYW1lcmFJZExpc3Q7CisKIC8vLyBFbnVtIGZvciBBQ2FtZXJhRGV2aWNlX0Vycm9yU3RhdGVDYWxsYmFjayBlcnJvciBjb2RlCiBlbnVtIHsKICAgICAvKioKQEAgLTM0NSw3ICszNTYsNyBAQAogICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkCiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogRnJlZSBhIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBvYmplY3QuCkBAIC02OTQsNyArNzA1LDcgQEAKICAqIEBzZWUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZAogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIEFkZCBhIG5hdGl2ZSB3aW5kb3cgdG8gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KQEAgLTcxMiw3ICs3MjMsNyBAQAogICogICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cgKmFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUgKmFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBSZW1vdmUgYSBuYXRpdmUgd2luZG93IGZyb20gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KQEAgLTcyOCw3ICs3MzksNyBAQAogICogICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBDcmVhdGUgYSBuZXcgY2FtZXJhIGNhcHR1cmUgc2Vzc2lvbiBzaW1pbGFyIHRvIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9ufS4gVGhpcwpAQCAtNzY1LDYgKzc3Niw3NyBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDcmVhdGUgYSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0IHVzZWQgZm9yIHN0cmVhbWluZyBmcm9tIGEgcGh5c2ljYWwKKyAqIGNhbWVyYSBhcyBwYXJ0IG9mIGEgbG9naWNhbCBjYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlRoZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgaXMgdXNlZCBpbiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZH0gbWV0aG9kIHRvIGFkZAorICogYW4gb3V0cHV0IHtAbGluayBBTmF0aXZlV2luZG93fSB0byBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIuIFVzZQorICoge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlfSB0byBmcmVlIHRoZSBvYmplY3QgYW5kIGl0cyBtZW1vcnkgYWZ0ZXIgYXBwbGljYXRpb24gbm8gbG9uZ2VyCisgKiBuZWVkcyB0aGUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dH0uPC9wPgorICoKKyAqIEBwYXJhbSBhbncgdGhlIHtAbGluayBBTmF0aXZlV2luZG93fSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9CisgKiBAcGFyYW0gcGh5c2ljYWxJZCB0aGUgSWQgb2YgdGhlIHBoeXNpY2FsIGNhbWVyYSB0aGlzIG91dHB1dCBpcyBhc3NvY2lhdGVkCisgKiAgICAgICAgICAgICAgICAgIHdpdGguCisgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dH0gd2lsbCBiZSBzdG9yZWQgaGVyZSBpZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGwgc3VjY2VlZHMuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLiBUaGUgY3JlYXRlZCBjb250YWluZXIgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCBpbiB0aGUgb3V0cHV0IGFyZ3VtZW50LjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgYW53LCBwaHlzaWNhbElkIG9yIG91dHB1dCBpcyBOVUxMLjwvbGk+PC91bD4KKyAqCisgKiBAc2VlIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQKKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSgKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudywgY29uc3QgY2hhciogcGh5c2ljYWxJZCwKKyAgICAgICAgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBDcmVhdGUgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBBQ2FwdHVyZVJlcXVlc3QgZm9yIGNhcHR1cmluZyBpbWFnZXMsIGluaXRpYWxpemVkIHdpdGggdGVtcGxhdGUKKyAqIGZvciBhIHRhcmdldCB1c2UgY2FzZSwgd2l0aCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IHBoeXNpY2FsIGNhbWVyYSBzZXR0aW5ncy4KKyAqCisgKiA8cD5UaGUgc2V0dGluZ3MgYXJlIGNob3NlbiB0byBiZSB0aGUgYmVzdCBvcHRpb25zIGZvciB0aGlzIGNhbWVyYSBkZXZpY2UsCisgKiBzbyBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gcmV1c2UgdGhlIHNhbWUgcmVxdWVzdCBmb3IgYSBkaWZmZXJlbnQgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogPHA+Tm90ZSB0aGF0IGZvciBhbGwga2V5cyBpbiBwaHlzaWNhbCBjYW1lcmEgc2V0dGluZ3MsIG9ubHkgdGhlIGtleXMKKyAqIGFkdmVydGlzZWQgaW4gQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTIGFyZQorICogYXBwbGljYWJsZS4gQWxsIG90aGVyIGtleXMgYXJlIGlnbm9yZWQgYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSBkZXZpY2UgdGhlIGNhbWVyYSBkZXZpY2Ugb2YgaW50ZXJlc3QKKyAqIEBwYXJhbSB0ZW1wbGF0ZUlkIHRoZSB0eXBlIG9mIGNhcHR1cmUgcmVxdWVzdCB0byBiZSBjcmVhdGVkLgorICogICAgICAgIFNlZSB7QGxpbmsgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkTGlzdCBUaGUgbGlzdCBvZiBwaHlzaWNhbCBjYW1lcmEgSWRzIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAqICAgICAgICBjdXN0b21pemUgdGhlIHJlcXVlc3QgZm9yIGEgc3BlY2lmaWMgcGh5c2ljYWwgY2FtZXJhLgorICogQHBhcmFtIHJlcXVlc3QgdGhlIG91dHB1dCByZXF1ZXN0IHdpbGwgYmUgc3RvcmVkIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4gVGhlIGNyZWF0ZWQgY2FwdHVyZSByZXF1ZXN0IHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgaW4gcmVxdWVzdCBhcmd1bWVudC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGRldmljZSwgcGh5c2ljYWxJZExpc3QsIG9yIHJlcXVlc3QgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB0ZW1wbGF0ZUlkIGlzIHVuZGVmaW5lZCBvciBjYW1lcmEgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgdGVtcGxhdGUsIG9yIGlmIHNvbWUgSWRzIGluIHBoeXNpY2FsSWRMaXN0IGlzbid0IGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBwaHlzaWNhbCBjYW1lcmEgYmFja2luZyB0aGUgY3VycmVudCBjYW1lcmEgZGV2aWNlLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEfSBpZiB0aGUgY2FtZXJhIGRldmljZSBpcyBjbG9zZWQuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0V9IGlmIHRoZSBjYW1lcmEgZGV2aWNlIGVuY291bnRlcnMgZmF0YWwgZXJyb3IuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFfSBpZiB0aGUgY2FtZXJhIHNlcnZpY2UgZW5jb3VudGVycyBmYXRhbCBlcnJvci48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfVU5LTk9XTn0gaWYgdGhlIG1ldGhvZCBmYWlscyBmb3Igc29tZSBvdGhlciByZWFzb25zLjwvbGk+PC91bD4KKyAqCisgKiBAc2VlIFRFTVBMQVRFX1BSRVZJRVcKKyAqIEBzZWUgVEVNUExBVEVfUkVDT1JECisgKiBAc2VlIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUKKyAqIEBzZWUgVEVNUExBVEVfVklERU9fU05BUFNIT1QKKyAqIEBzZWUgVEVNUExBVEVfTUFOVUFMCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkcygKKyAgICAgICAgY29uc3QgQUNhbWVyYURldmljZSogZGV2aWNlLCBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxJZExpc3QsCisgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9ERVZJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaAppbmRleCBlYTc2NzM4Li4xMzZhNDk3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaApAQCAtNzQsMTIgKzc0LDYgQEAKICAqLwogdm9pZCBBQ2FtZXJhTWFuYWdlcl9kZWxldGUoQUNhbWVyYU1hbmFnZXIqIG1hbmFnZXIpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKLS8vLyBTdHJ1Y3QgdG8gaG9sZCBsaXN0IG9mIGNhbWVyYSBkZXZpY2VzCi10eXBlZGVmIHN0cnVjdCBBQ2FtZXJhSWRMaXN0IHsKLSAgICBpbnQgbnVtQ2FtZXJhczsgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgY29ubmVjdGVkIGNhbWVyYSBkZXZpY2VzCi0gICAgY29uc3QgY2hhcioqIGNhbWVyYUlkczsgIC8vLzwgbGlzdCBvZiBpZGVudGlmaWVyIG9mIGNvbm5lY3RlZCBjYW1lcmEgZGV2aWNlcwotfSBBQ2FtZXJhSWRMaXN0OwotCiAvKioKICAqIENyZWF0ZSBhIGxpc3Qgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBjYW1lcmEgZGV2aWNlcywgaW5jbHVkaW5nCiAgKiBjYW1lcmFzIHRoYXQgbWF5IGJlIGluIHVzZSBieSBvdGhlciBjYW1lcmEgQVBJIGNsaWVudHMuCkBAIC0yNzgsNiArMjcyLDEwNSBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBEZWZpbml0aW9uIG9mIGNhbWVyYSBhY2Nlc3MgcGVybWlzc2lvbiBjaGFuZ2UgY2FsbGJhY2suCisgKgorICogPHA+Tm90aWZpY2F0aW9uIHRoYXQgY2FtZXJhIGFjY2VzcyBwcmlvcml0aWVzIGhhdmUgY2hhbmdlZCBhbmQgdGhlIGNhbWVyYSBtYXkKKyAqIG5vdyBiZSBvcGVuYWJsZS4gQW4gYXBwbGljYXRpb24gdGhhdCB3YXMgcHJldmlvdXNseSBkZW5pZWQgY2FtZXJhIGFjY2VzcyBkdWUgdG8KKyAqIGEgaGlnaGVyLXByaW9yaXR5IHVzZXIgYWxyZWFkeSB1c2luZyB0aGUgY2FtZXJhLCBvciB0aGF0IHdhcyBkaXNjb25uZWN0ZWQgZnJvbSBhbgorICogYWN0aXZlIGNhbWVyYSBzZXNzaW9uIGR1ZSB0byBhIGhpZ2hlci1wcmlvcml0eSB1c2VyIHRyeWluZyB0byBvcGVuIHRoZSBjYW1lcmEsCisgKiBzaG91bGQgdHJ5IHRvIG9wZW4gdGhlIGNhbWVyYSBhZ2FpbiBpZiBpdCBzdGlsbCB3YW50cyB0byB1c2UgaXQuICBOb3RlIHRoYXQKKyAqIG11bHRpcGxlIGFwcGxpY2F0aW9ucyBtYXkgcmVjZWl2ZSB0aGlzIGNhbGxiYWNrIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCBvbmx5IG9uZSBvZgorICogdGhlbSB3aWxsIHN1Y2NlZWQgaW4gb3BlbmluZyB0aGUgY2FtZXJhIGluIHByYWN0aWNlLCBkZXBlbmRpbmcgb24gZXhhY3QgYWNjZXNzCisgKiBwcmlvcml0eSBsZXZlbHMgYW5kIHRpbWluZy4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIGluIGNhc2VzIHdoZXJlIG11bHRpcGxlCisgKiBhcHBsaWNhdGlvbnMgbWF5IGJlIGluIHRoZSByZXN1bWVkIHN0YXRlIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGUgdXNlciBzd2l0Y2hlcworICogZm9jdXMgYmV0d2VlbiB0aGVtLCBvciBpZiB0aGUgY3VycmVudCBjYW1lcmEtdXNpbmcgYXBwbGljYXRpb24gbW92ZXMgYmV0d2VlbgorICogZnVsbC1zY3JlZW4gYW5kIFBpY3R1cmUtaW4tUGljdHVyZSAoUGlQKSBzdGF0ZXMuIEluIHN1Y2ggY2FzZXMsIHRoZSBjYW1lcmEKKyAqIGF2YWlsYWJsZS91bmF2YWlsYWJsZSBjYWxsYmFja3Mgd2lsbCBub3QgYmUgaW52b2tlZCwgYnV0IGFub3RoZXIgYXBwbGljYXRpb24gbWF5CisgKiBub3cgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgZm9yIGNhbWVyYSBhY2Nlc3MgdGhhbiB0aGUgY3VycmVudCBjYW1lcmEtdXNpbmcKKyAqIGFwcGxpY2F0aW9uLjwvcD4KKworICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQgcHJvdmlkZWQgYnkgdXNlciBpbgorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUxpc3RlbmVyfS4KKyAqLwordHlwZWRlZiB2b2lkICgqQUNhbWVyYU1hbmFnZXJfQWNjZXNzUHJpb3JpdGllc0NoYW5nZWRDYWxsYmFjaykodm9pZCogY29udGV4dCk7CisKKy8qKgorICogQSBsaXN0ZW5lciBmb3IgY2FtZXJhIGRldmljZXMgYmVjb21pbmcgYXZhaWxhYmxlL3VuYXZhaWxhYmxlIHRvIG9wZW4gb3Igd2hlbgorICogdGhlIGNhbWVyYSBhY2Nlc3MgcGVybWlzc2lvbnMgY2hhbmdlLgorICoKKyAqIDxwPkNhbWVyYXMgYmVjb21lIGF2YWlsYWJsZSB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciBpbiB1c2UsIG9yIHdoZW4gYSBuZXcKKyAqIHJlbW92YWJsZSBjYW1lcmEgaXMgY29ubmVjdGVkLiBUaGV5IGJlY29tZSB1bmF2YWlsYWJsZSB3aGVuIHNvbWUKKyAqIGFwcGxpY2F0aW9uIG9yIHNlcnZpY2Ugc3RhcnRzIHVzaW5nIGEgY2FtZXJhLCBvciB3aGVuIGEgcmVtb3ZhYmxlIGNhbWVyYQorICogaXMgZGlzY29ubmVjdGVkLjwvcD4KKyAqCisgKiBAc2VlIEFDYW1lcmFNYW5hZ2VyX3JlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaworICovCit0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUxpc3RlbmVyIHsKKyAgICAvLy8KKyAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgYXZhaWxhYmlsaXR5Q2FsbGJhY2tzOworCisgICAgLy8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIGNhbWVyYSBhY2Nlc3MgcGVybWlzc2lvbiBjaGFuZ2UKKyAgICBBQ2FtZXJhTWFuYWdlcl9BY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZENhbGxiYWNrIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQ7CisKKyAgICAvLy8gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UsIHBsZWFzZSBlbnN1cmUgdGhhdCBhbGwgZW50cmllcyBhcmUgc2V0IHRvIE5VTEwKKyAgICB2b2lkICpyZXNlcnZlZFs2XTsKK30gQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3M7CisKKy8qKgorICogUmVnaXN0ZXIgY2FtZXJhIGV4dGVuZGVkIGF2YWlsYWJpbGl0eSBjYWxsYmFja3MuCisgKgorICogPHA+b25DYW1lcmFVbmF2YWlsYWJsZSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIGNhbWVyYSBkZXZpY2UgaXMgb3BlbmVkIGJ5IGFueSBjYW1lcmEgQVBJCisgKiBjbGllbnQuIE90aGVyIGNhbWVyYSBBUEkgY2xpZW50cyBtYXkgc3RpbGwgYmUgYWJsZSB0byBvcGVuIHN1Y2ggYSBjYW1lcmEgZGV2aWNlLCBldmljdGluZyB0aGUKKyAqIGV4aXN0aW5nIGNsaWVudCBpZiB0aGV5IGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGV4aXN0aW5nIGNsaWVudCBvZiBhIGNhbWVyYSBkZXZpY2UuCisgKiBTZWUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX29wZW5DYW1lcmF9IGZvciBtb3JlIGRldGFpbHMuPC9wPgorICoKKyAqIDxwPlRoZSBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgb24gYSBkZWRpY2F0ZWQgdGhyZWFkIHNoYXJlZCBhbW9uZyBhbGwgQUNhbWVyYU1hbmFnZXIKKyAqIGluc3RhbmNlcy48L3A+CisgKgorICogPHA+U2luY2UgdGhpcyBjYWxsYmFjayB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY2FtZXJhIHNlcnZpY2UsIHJlbWVtYmVyIHRvIHVucmVnaXN0ZXIgaXQKKyAqIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZDsgb3RoZXJ3aXNlIHRoZSBjYWxsYmFjayB3aWxsIGNvbnRpbnVlIHRvIHJlY2VpdmUgZXZlbnRzCisgKiBpbmRlZmluaXRlbHkgYW5kIGl0IG1heSBwcmV2ZW50IG90aGVyIHJlc291cmNlcyBmcm9tIGJlaW5nIHJlbGVhc2VkLiBTcGVjaWZpY2FsbHksIHRoZQorICogY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBpbmRlcGVuZGVudGx5IG9mIHRoZSBnZW5lcmFsIGFjdGl2aXR5IGxpZmVjeWNsZSBhbmQgaW5kZXBlbmRlbnRseQorICogb2YgdGhlIHN0YXRlIG9mIGluZGl2aWR1YWwgQUNhbWVyYU1hbmFnZXIgaW5zdGFuY2VzLjwvcD4KKyAqCisgKiBAcGFyYW0gbWFuYWdlciB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyfSBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSBjYWxsYmFjayB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzfSB0byBiZSByZWdpc3RlcmVkLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIG1hbmFnZXIgb3IgY2FsbGJhY2sgaXMgTlVMTCwgb3IKKyAqICAgICAgICAgICAgICAgICAge0FDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWR9CisgKiAgICAgICAgICAgICAgICAgIG9yIHtBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mjb25DYW1lcmFBdmFpbGFibGV9IG9yCisgKiAgICAgICAgICAgICAgICAgIHtBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mjb25DYW1lcmFVbmF2YWlsYWJsZX0gaXMgTlVMTC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogVW5yZWdpc3RlciBjYW1lcmEgZXh0ZW5kZWQgYXZhaWxhYmlsaXR5IGNhbGxiYWNrcy4KKyAqCisgKiA8cD5SZW1vdmluZyBhIGNhbGxiYWNrIHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZCBoYXMgbm8gZWZmZWN0LjwvcD4KKyAqCisgKiBAcGFyYW0gbWFuYWdlciB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyfSBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSBjYWxsYmFjayB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzfSB0byBiZSB1bnJlZ2lzdGVyZWQuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgY2FsbGJhY2ssCisgKiAgICAgICAgICAgICAgICAgIHtBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyNvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkfQorICogICAgICAgICAgICAgICAgICBvciB7QUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhQXZhaWxhYmxlfSBvcgorICogICAgICAgICAgICAgICAgICB7QUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhVW5hdmFpbGFibGV9IGlzIE5VTEwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXJfdW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX01BTkFHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCmluZGV4IDYxMWUyNzAuLjliYmZiODMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKQEAgLTIzMyw2ICsyMzMsMjggQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgY2FtZXJhIGlzIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICoKKyAqIDxwPiBDaGVjayB3aGV0aGVyIGEgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGJhc2VkIG9uIGl0cworICogc3RhdGljIG1ldGFkYXRhLiBJZiBpdCBpcywgYWxzbyByZXR1cm5zIGl0cyBwaHlzaWNhbCBzdWIgY2FtZXJhIElkcy48L3A+CisgKgorICogQHBhcmFtIHN0YXRpY01ldGFkYXRhIHRoZSBzdGF0aWMgbWV0YWRhdGEgb2YgdGhlIGNhbWVyYSBiZWluZyBjaGVja2VkLgorICogQHBhcmFtIG51bVBoeXNpY2FsQ2FtZXJhcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY2FtZXJhcy4KKyAqIEBwYXJhbSBwaHlzaWNhbENhbWVyYUlkcyByZXR1cm5zIHRoZSBhcnJheSBvZiBwaHlzaWNhbCBjYW1lcmEgSWRzIGJhY2tpbmcgdGhpcyBsb2dpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhIGRldmljZS4gTm90ZSB0aGF0IHRoaXMgcG9pbnRlciBpcyBvbmx5IHZhbGlkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgc3RhdGljTWV0YWRhdGEgb2JqZWN0LgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIGZhbHNlIG90aGVyd2lzZS4KKyAqLworYm9vbCBBQ2FtZXJhTWV0YWRhdGFfaXNMb2dpY2FsTXVsdGlDYW1lcmEoY29uc3QgQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNNZXRhZGF0YSwKKyAgICAgICAgLypvdXQqL3NpemVfdCogbnVtUGh5c2ljYWxDYW1lcmFzLCAvKm91dCovY29uc3QgY2hhciogY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykKKyAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQU1FUkFfTUVUQURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKaW5kZXggYTlhZjc3ZS4uYWNmNjk5OSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCkBAIC03MSw2ICs3MSw4IEBACiAgICAgQUNBTUVSQV9ERVBUSCwKICAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBLAogICAgIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OLAorICAgIEFDQU1FUkFfSEVJQywKKyAgICBBQ0FNRVJBX0hFSUNfSU5GTywKICAgICBBQ0FNRVJBX1NFQ1RJT05fQ09VTlQsCiAKICAgICBBQ0FNRVJBX1ZFTkRPUiA9IDB4ODAwMApAQCAtMTEyLDYgKzExNCw4IEBACiAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fU1RBUlQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE2LAorICAgIEFDQU1FUkFfSEVJQ19TVEFSVCAgICAgICAgICAgICA9IEFDQU1FUkFfSEVJQyAgICAgICAgICAgICAgPDwgMTYsCisgICAgQUNBTUVSQV9IRUlDX0lORk9fU1RBUlQgICAgICAgID0gQUNBTUVSQV9IRUlDX0lORk8gICAgICAgICA8PCAxNiwKICAgICBBQ0FNRVJBX1ZFTkRPUl9TVEFSVCAgICAgICAgICAgPSBBQ0FNRVJBX1ZFTkRPUiAgICAgICAgICAgIDw8IDE2CiB9IGFjYW1lcmFfbWV0YWRhdGFfc2VjdGlvbl9zdGFydF90OwogCkBAIC0xOTEyLDYgKzE5MTYsNyBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBpcyBhbHNvIHVzZWQgZm9yIEhFSUMgaW1hZ2UgY2FwdHVyZS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9KUEVHX0dQU19DT09SRElOQVRFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlWzNdCiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQsCkBAIC0xOTI3LDYgKzE5MzIsNyBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBpcyBhbHNvIHVzZWQgZm9yIEhFSUMgaW1hZ2UgY2FwdHVyZS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9KUEVHX0dQU19QUk9DRVNTSU5HX01FVEhPRCA9ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZQogICAgICAgICAgICAgQUNBTUVSQV9KUEVHX1NUQVJUICsgMSwKQEAgLTE5NDIsNiArMTk0OCw3IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCBmb3IgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfR1BTX1RJTUVTVEFNUCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQ2NAogICAgICAgICAgICAgQUNBTUVSQV9KUEVHX1NUQVJUICsgMiwKQEAgLTE5ODYsNiArMTk5MywxMCBAQAogICAgICAqIDwvY29kZT48L3ByZT4KICAgICAgKiA8cD5Gb3IgRVhURVJOQUwgY2FtZXJhcyB0aGUgc2Vuc29yIG9yaWVudGF0aW9uIHdpbGwgYWx3YXlzIGJlIHNldCB0byAwIGFuZCB0aGUgZmFjaW5nIHdpbGwKICAgICAgKiBhbHNvIGJlIHNldCB0byBFWFRFUk5BTC4gVGhlIGFib3ZlIGNvZGUgaXMgbm90IHJlbGV2YW50IGluIHN1Y2ggY2FzZS48L3A+CisgICAgICogPHA+VGhpcyB0YWcgaXMgYWxzbyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgSEVJQyBpbWFnZSBjYXB0dXJlLCBpbiB3aGljaAorICAgICAqIGNhc2UgdGhlIHJvdGF0aW9uIGlzIHJlZmxlY3RlZCBieQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuaHRtbCNUQUdfT1JJRU5UQVRJT04iPkVYSUYgb3JpZW50YXRpb24gZmxhZzwvYT4sIGFuZCBub3QgYnkKKyAgICAgKiByb3RhdGluZyB0aGUgaW1hZ2UgZGF0YSBpdHNlbGYuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9PUklFTlRBVElPTgogICAgICAqLwpAQCAtMjAwMyw3ICsyMDE0LDggQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCi0gICAgICogPHA+ODUtOTUgaXMgdHlwaWNhbCB1c2FnZSByYW5nZS48L3A+CisgICAgICogPHA+ODUtOTUgaXMgdHlwaWNhbCB1c2FnZSByYW5nZS4gVGhpcyB0YWcgaXMgYWxzbyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBxdWFsaXR5CisgICAgICogb2YgdGhlIEhFSUMgaW1hZ2UgY2FwdHVyZS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9KUEVHX1FVQUxJVFkgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZQogICAgICAgICAgICAgQUNBTUVSQV9KUEVHX1NUQVJUICsgNCwKQEAgLTIwMTksNiArMjAzMSw3IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCB0byBkZXNjcmliZSB0aGUgcXVhbGl0eSBvZiB0aGUgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfVEhVTUJOQUlMX1FVQUxJVFkgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlCiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyA1LApAQCAtMjA1NSw2ICsyMDY4LDEwIEBACiAgICAgICogICBvcmllbnRhdGlvbiBpcyByZXF1ZXN0ZWQuIExFR0FDWSBkZXZpY2Ugd2lsbCBhbHdheXMgcmVwb3J0IHVucm90YXRlZCB0aHVtYm5haWwKICAgICAgKiAgIHNpemUuPC9saT4KICAgICAgKiA8L3VsPgorICAgICAqIDxwPlRoZSB0YWcgaXMgYWxzbyB1c2VkIGFzIHRodW1ibmFpbCBzaXplIGZvciBIRUlDIGltYWdlIGZvcm1hdCBjYXB0dXJlLCBpbiB3aGljaCBjYXNlIHRoZQorICAgICAqIHRoZSB0aHVtYm5haWwgcm90YXRpb24gaXMgcmVmbGVjdGVkIGJ5CisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvRXhpZkludGVyZmFjZS5odG1sI1RBR19PUklFTlRBVElPTiI+RVhJRiBvcmllbnRhdGlvbiBmbGFnPC9hPiwgYW5kIG5vdCBieQorICAgICAqIHJvdGF0aW5nIHRoZSB0aHVtYm5haWwgZGF0YSBpdHNlbGYuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0pQRUdfT1JJRU5UQVRJT04KICAgICAgKi8KQEAgLTIwODgsNiArMjEwNSw3IEBACiAgICAgICogYW5kIHZpY2UgdmVyc2EuPC9saT4KICAgICAgKiA8bGk+QWxsIG5vbi08Y29kZT4oMCwgMCk8L2NvZGU+IHNpemVzIHdpbGwgaGF2ZSBub24temVybyB3aWR0aHMgYW5kIGhlaWdodHMuPC9saT4KICAgICAgKiA8L3VsPgorICAgICAqIDxwPlRoaXMgbGlzdCBpcyBhbHNvIHVzZWQgYXMgc3VwcG9ydGVkIHRodW1ibmFpbCBzaXplcyBmb3IgSEVJQyBpbWFnZSBmb3JtYXQgY2FwdHVyZS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKICAgICAgKi8KQEAgLTI3ODMsNyArMjgwMSw3IEBACiAgICAgICogICB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiBSQVcxMn0uPC9saT4KICAgICAgKiA8bGk+UHJvY2Vzc2VkIChidXQgbm90LXN0YWxsaW5nKTogYW55IG5vbi1SQVcgZm9ybWF0IHdpdGhvdXQgYSBzdGFsbCBkdXJhdGlvbi4gIFR5cGljYWxseQogICAgICAqICAge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggWVVWXzQyMF84ODh9LAotICAgICAqICAgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvZ3JhcGhpY3MvSW1hZ2VGb3JtYXQuaHRtbCNOVjIxIj5OVjIxPC9hPiwgb3IgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvZ3JhcGhpY3MvSW1hZ2VGb3JtYXQuaHRtbCNZVjEyIj5ZVjEyPC9hPi48L2xpPgorICAgICAqICAgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvZ3JhcGhpY3MvSW1hZ2VGb3JtYXQuaHRtbCNOVjIxIj5OVjIxPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvZ3JhcGhpY3MvSW1hZ2VGb3JtYXQuaHRtbCNZVjEyIj5ZVjEyPC9hPiwgb3Ige0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggWTh9IC48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKQEAgLTMwMjgsNiArMzA0NiwyOCBAQAogICAgICAqLwogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfU0VTU0lPTl9LRVlTID0gICAgICAgICAgICAgICAgICAgIC8vIGludDMyW25dCiAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfU1RBUlQgKyAxNiwKKyAgICAvKioKKyAgICAgKiA8cD5BIHN1YnNldCBvZiB0aGUgYXZhaWxhYmxlIHJlcXVlc3Qga2V5cyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGZvcgorICAgICAqIHBoeXNpY2FsIGRldmljZXMgYmFja2luZyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW25dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaXMgYSBzdWJzZXQgb2YgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMgd2hpY2ggY29udGFpbnMgYSBsaXN0CisgICAgICogb2Yga2V5cyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9DYXB0dXJlUmVxdWVzdC9CdWlsZGVyLmh0bWwjc2V0UGh5c2ljYWxDYW1lcmFLZXkiPkJ1aWxkZXIjc2V0UGh5c2ljYWxDYW1lcmFLZXk8L2E+LgorICAgICAqIFRoZSByZXNwZWN0aXZlIHZhbHVlIG9mIHN1Y2ggcmVxdWVzdCBrZXkgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvQ2FwdHVyZVJlcXVlc3QvQnVpbGRlci5odG1sI2dldFBoeXNpY2FsQ2FtZXJhS2V5Ij5CdWlsZGVyI2dldFBoeXNpY2FsQ2FtZXJhS2V5PC9hPi4gQ2FwdHVyZSByZXF1ZXN0cyB0aGF0IGNvbnRhaW4KKyAgICAgKiBpbmRpdmlkdWFsIHBoeXNpY2FsIGRldmljZSByZXF1ZXN0cyBtdXN0IGJlIGJ1aWx0IHZpYQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhRGV2aWNlLmh0bWwjY3JlYXRlQ2FwdHVyZVJlcXVlc3QoaW50LCI+U2V0KTwvYT4uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUworICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZUyA9ICAgIC8vIGludDMyW25dCisgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfU1RBUlQgKyAxNywKICAgICBBQ0FNRVJBX1JFUVVFU1RfRU5ELAogCiAgICAgLyoqCkBAIC0zMjUxLDYgKzMyOTEsNyBAQAogICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCB9PC9saT4KICAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfTwvbGk+CiAgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZOCB9PC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkFsbCBvdGhlciBmb3JtYXRzIG1heSBvciBtYXkgbm90IGhhdmUgYW4gYWxsb3dlZCBzdGFsbCBkdXJhdGlvbiBvbgogICAgICAqIGEgcGVyLWNhcGFiaWxpdHkgYmFzaXM7IHJlZmVyIHRvIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTCkBAIC0zMjg4LDYgKzMzMjksODEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1NDQUxFUl9DUk9QUElOR19UWVBFID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfY3JvcHBpbmdfdHlwZV90KQogICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxMywKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMgZm9yIGNvbW1vbiBjbGllbnQgdXNlIGNhc2VzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNV0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPk9wdGlvbmFsIHN1YnNldCBvZiB0aGUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyB0aGF0IGNvbnRhaW5zCisgICAgICogc2ltaWxhciB0dXBsZXMgbGlzdGVkIGFzCisgICAgICogKGkuZS4gd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBvdXRwdXQvaW5wdXQgc3RyZWFtLCB1c2VjYXNlIGJpdCBmaWVsZCkuCisgICAgICogQ2FtZXJhIGRldmljZXMgd2lsbCBiZSBhYmxlIHRvIHN1Z2dlc3QgcGFydGljdWxhciBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2hpY2ggYXJlCisgICAgICogcG93ZXIgYW5kIHBlcmZvcm1hbmNlIGVmZmljaWVudCBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAorICAgICAqIHJldHJpZXZpbmcgdGhlIHN1Z2dlc3Rpb25zIHNlZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwPC9hPi48L3A+CisgICAgICogPHA+VGhlIGRhdGEgcmVwcmVzZW50YXRpb24gaXMgaW50WzVdLCB3aGljaCBtYXBzIHRvCisgICAgICogKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLiBUaGUgYXJyYXkgY2FuIGJlCisgICAgICogcGFyc2VkIHVzaW5nIHRoZSBmb2xsb3dpbmcgcHNldWRvIGNvZGU6PC9wPgorICAgICAqIDxwPnN0cnVjdCBTdHJlYW1Db25maWd1cmF0aW9uIHsKKyAgICAgKiBpbnQzMl90IGZvcm1hdDsKKyAgICAgKiBpbnQzMl90IHdpZHRoOworICAgICAqIGludDMyX3QgaGVpZ2h0OworICAgICAqIGludDMyX3QgaXNJbnB1dDsgfTs8L3A+CisgICAgICogPHA+dm9pZCBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucygKKyAgICAgKiAgICAgaW50MzJfdCAqYXJyYXksIHNpemVfdCBjb3VudCwgaW50MzJfdCB1c2VjYXNlSWQsCisgICAgICogICAgIFZlY3RvciAmbHQ7IFN0cmVhbUNvbmZpZ3VyYXRpb24gJmd0OyAqIHNjcykgeworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDU7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMDsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMTsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMjsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVCA9IDQ7PC9wPgorICAgICAqIDxwcmU+PGNvZGU+Zm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBjb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgKiAgICAgaW50MzJfdCB3aWR0aCA9IGFycmF5W2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBoZWlnaHQgPSBhcnJheVtpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAqICAgICBpbnQzMl90IGZvcm1hdCA9IGFycmF5W2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICogICAgIGludDMyX3QgaXNJbnB1dCA9IGFycmF5W2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBzdXBwb3J0ZWRVc2VjYXNlcyA9IGFycmF5W2kgKyBTVFJFQU1fVVNFQ0FTRV9CSVRNQVBfT0ZGU0VUXTsKKyAgICAgKiAgICAgaWYgKHN1cHBvcnRlZFVzZWNhc2VzICZhbXA7ICgxICZsdDsmbHQ7IHVzZWNhc2VJZCkpIHsKKyAgICAgKiAgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb24gc2MgPSB7Zm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpc0lucHV0fTsKKyAgICAgKiAgICAgICAgIHNjcy0mZ3Q7YWRkKHNjKTsKKyAgICAgKiAgICAgfQorICAgICAqIH0KKyAgICAgKiA8L2NvZGU+PC9wcmU+CisgICAgICogPHA+fTwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuKjVdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190KQorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxNCwKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBtYXBwaW5ncyBvZiBpbWFnZSBmb3JtYXRzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGlzCisgICAgICogY2FtZXJhIGRldmljZSBmb3IgaW5wdXQgc3RyZWFtcywgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGlzIGEgcmVjb21tZW5kZWQgc3Vic2V0IG9mIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1hcHBpbmdzIGZvdW5kIGluCisgICAgICogYW5kcm9pZC5zY2FsZXIuYXZhaWxhYmxlSW5wdXRPdXRwdXRGb3JtYXRzTWFwLiBUaGUgc2FtZSByZXF1aXJlbWVudHMgYXBwbHkgaGVyZSBhcyB3ZWxsLgorICAgICAqIFRoZSBsaXN0IGhvd2V2ZXIgZG9lc24ndCBuZWVkIHRvIGNvbnRhaW4gYWxsIGF2YWlsYWJsZSBhbmQgc3VwcG9ydGVkIG1hcHBpbmdzLiBJbnN0ZWFkIG9mCisgICAgICogdGhpcyBkZXZlbG9wZXJzIG11c3QgbGlzdCBvbmx5IHJlY29tbWVuZGVkIGFuZCBlZmZpY2llbnQgZW50cmllcy4KKyAgICAgKiBJZiBzZXQsIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgWkVST19TSFVUVEVSX0xBRyByZWNvbW1lbmRlZCBzdHJlYW0KKyAgICAgKiBjb25maWd1cmF0aW9uIHNlZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwPC9hPi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX0lOUFVUX09VVFBVVF9GT1JNQVRTX01BUCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyCisgICAgICAgICAgICBBQ0FNRVJBX1NDQUxFUl9TVEFSVCArIDE1LAogICAgIEFDQU1FUkFfU0NBTEVSX0VORCwKIAogICAgIC8qKgpAQCAtMzQ0OCw2ICszNTY0LDggQEAKICAgICAgKiA8cD5Tb21lIGRldmljZXMgbWF5IGNob29zZSB0byBwcm92aWRlIGEgc2Vjb25kIHNldCBvZiBjYWxpYnJhdGlvbgogICAgICAqIGluZm9ybWF0aW9uIGZvciBpbXByb3ZlZCBxdWFsaXR5LCBpbmNsdWRpbmcKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDIgYW5kIGl0cyBjb3JyZXNwb25kaW5nIG1hdHJpY2VzLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTEKQEAgLTM0NzcsNiArMzU5NSw4IEBACiAgICAgICogPHA+SWYgdGhpcyBrZXkgaXMgcHJlc2VudCwgdGhlbiBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yLAogICAgICAqIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIsIGFuZAogICAgICAqIEFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMiB3aWxsIGFsc28gYmUgcHJlc2VudC48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yCkBAIC0zNTA0LDYgKzM2MjQsOCBAQAogICAgICAqIGNvbG9yc3BhY2UpIGludG8gdGhpcyBjYW1lcmEgZGV2aWNlJ3MgbmF0aXZlIHNlbnNvciBjb2xvcgogICAgICAqIHNwYWNlIHVuZGVyIHRoZSBmaXJzdCByZWZlcmVuY2UgaWxsdW1pbmFudAogICAgICAqIChBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEpLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogICAgICAqLwpAQCAtMzUzMSw2ICszNjUzLDggQEAKICAgICAgKiAoQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyKS48L3A+CiAgICAgICogPHA+VGhpcyBtYXRyaXggd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHNlY29uZCByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGlzIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCkBAIC0zNTU5LDYgKzM2ODMsOCBAQAogICAgICAqIGFuZCB0aGUgQ0lFIFhZWiBjb2xvcnNwYWNlIHdoZW4gY2FsY3VsYXRpbmcgdGhpcyB0cmFuc2Zvcm0gd2lsbAogICAgICAqIG1hdGNoIHRoZSBzdGFuZGFyZCB3aGl0ZSBwb2ludCBmb3IgdGhlIGZpcnN0IHJlZmVyZW5jZSBpbGx1bWluYW50CiAgICAgICogKGkuZS4gbm8gY2hyb21hdGljIGFkYXB0YXRpb24gd2lsbCBiZSBhcHBsaWVkIGJ5IHRoaXMgdHJhbnNmb3JtKS48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKICAgICAgKi8KQEAgLTM1ODksNiArMzcxNSw4IEBACiAgICAgICogKGkuZS4gbm8gY2hyb21hdGljIGFkYXB0YXRpb24gd2lsbCBiZSBhcHBsaWVkIGJ5IHRoaXMgdHJhbnNmb3JtKS48L3A+CiAgICAgICogPHA+VGhpcyBtYXRyaXggd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHNlY29uZCByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGlzIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCkBAIC0zNjE1LDYgKzM3NDMsOCBAQAogICAgICAqIHRoaXMgbWF0cml4IGlzIGNob3NlbiBzbyB0aGF0IHRoZSBzdGFuZGFyZCB3aGl0ZSBwb2ludCBmb3IgdGhpcyByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGluIHRoZSByZWZlcmVuY2Ugc2Vuc29yIGNvbG9yc3BhY2UgaXMgbWFwcGVkIHRvIEQ1MCBpbiB0aGUKICAgICAgKiBDSUUgWFlaIGNvbG9yc3BhY2UuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiAgICAgICovCkBAIC0zNjQzLDYgKzM3NzMsOCBAQAogICAgICAqIENJRSBYWVogY29sb3JzcGFjZS48L3A+CiAgICAgICogPHA+VGhpcyBtYXRyaXggd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHNlY29uZCByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGlzIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCkBAIC0zNjc1LDYgKzM4MDcsNyBAQAogICAgICAqIGxldmVsIHZhbHVlcy4gRm9yIHJhdyBjYXB0dXJlIGluIHBhcnRpY3VsYXIsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQogICAgICAqIHBpeGVscyBmcm9tIEFDQU1FUkFfU0VOU09SX09QVElDQUxfQkxBQ0tfUkVHSU9OUyB0byBjYWxjdWxhdGUgYmxhY2sKICAgICAgKiBsZXZlbCB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhIGRldmljZSwgYWxsIG9mIHRoZSAyeDIgY2hhbm5lbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlcy48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UCkBAIC0zNzY5LDYgKzM5MDIsOCBAQAogICAgICAqIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGUgcHJvdmlkZWQgY29sb3IgdHJhbnNmb3JtcyB3aGVuCiAgICAgICogcHJvY2Vzc2luZyByYXcgc2Vuc29yIGRhdGEuPC9wPgogICAgICAqIDxwPlRoZSBvcmRlciBvZiB0aGUgdmFsdWVzIGlzIFIsIEcsIEI7IHdoZXJlIFIgaXMgaW4gdGhlIGxvd2VzdCBpbmRleC48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfU0VOU09SX05FVVRSQUxfQ09MT1JfUE9JTlQgPSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGlvbmFsWzNdCiAgICAgICAgICAgICBBQ0FNRVJBX1NFTlNPUl9TVEFSVCArIDE4LApAQCAtMzc5OSw2ICszOTM0LDggQEAKICAgICAgKiB0aGF0IGNoYW5uZWwuPC9wPgogICAgICAqIDxwPkEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbm9pc2UgbW9kZWwgY2FuIGJlIGZvdW5kIGluIHRoZQogICAgICAqIEFkb2JlIERORyBzcGVjaWZpY2F0aW9uIGZvciB0aGUgTm9pc2VQcm9maWxlIHRhZy48L3A+CisgICAgICogPHA+Rm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIHRoZXJlIGlzIG9ubHkgb25lIGNvbG9yIGNoYW5uZWwuIFNvIHRoZSBub2lzZSBtb2RlbCBjb2VmZmljaWVudHMKKyAgICAgKiB3aWxsIG9ubHkgY29udGFpbiBvbmUgUyBhbmQgb25lIE8uPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAogICAgICAqLwpAQCAtMzg0NCw2ICszOTgxLDggQEAKICAgICAgKiA8bGk+UiAmZ3Q7IDEuMjAgd2lsbCByZXF1aXJlIHN0cm9uZyBzb2Z0d2FyZSBjb3JyZWN0aW9uIHRvIHByb2R1Y2UKICAgICAgKiBhIHVzdWFibGUgaW1hZ2UgKCZndDsyMCUgZGl2ZXJnZW5jZSkuPC9saT4KICAgICAgKiA8L3VsPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9HUkVFTl9TUExJVCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdAogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAyMiwKQEAgLTM5OTYsNiArNDEzNSw3IEBACiAgICAgICogbGF5b3V0IGtleSAoc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UKSwgaS5lLiB0aGUKICAgICAgKiBudGggdmFsdWUgZ2l2ZW4gY29ycmVzcG9uZHMgdG8gdGhlIGJsYWNrIGxldmVsIG9mZnNldCBmb3IgdGhlIG50aAogICAgICAqIGNvbG9yIGNoYW5uZWwgbGlzdGVkIGluIHRoZSBDRkEuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBhbGwgb2YgdGhlIDJ4MiBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWVzLjwvcD4KICAgICAgKiA8cD5UaGlzIGtleSB3aWxsIGJlIGF2YWlsYWJsZSBpZiBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgaXMgYXZhaWxhYmxlIG9yIHRoZQogICAgICAqIGNhbWVyYSBkZXZpY2UgYWR2ZXJ0aXNlcyB0aGlzIGtleSB2aWEge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMgfS48L3A+CiAgICAgICoKQEAgLTQwOTgsNyArNDIzOCw4IEBACiAgICAgLyoqCiAgICAgICogPHA+VGhlIGFycmFuZ2VtZW50IG9mIGNvbG9yIGZpbHRlcnMgb24gc2Vuc29yOwogICAgICAqIHJlcHJlc2VudHMgdGhlIGNvbG9ycyBpbiB0aGUgdG9wLWxlZnQgMngyIHNlY3Rpb24gb2YKLSAgICAgKiB0aGUgc2Vuc29yLCBpbiByZWFkaW5nIG9yZGVyLjwvcD4KKyAgICAgKiB0aGUgc2Vuc29yLCBpbiByZWFkaW5nIG9yZGVyLCBmb3IgYSBCYXllciBjYW1lcmEsIG9yIHRoZQorICAgICAqIGxpZ2h0IHNwZWN0cnVtIGl0IGNhcHR1cmVzIGZvciBNT05PQ0hST01FIGNhbWVyYS48L3A+CiAgICAgICoKICAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zZW5zb3JfaW5mb19jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdCk8L3A+CiAgICAgICoKQEAgLTQ1NjcsMTMgKzQ3MDgsMTMgQEAKICAgICAgKiAoeCx5KSDPtSAoMCAuLi4gTi0xLCAwIC4uLiBNLTEpIGlzIHRoZSB2YWx1ZSBvZiB0aGUgc2hhZGluZyBtYXAgYXQKICAgICAgKiBwaXhlbCAoICgoVy0xKS8oTi0xKSkgKiB4LCAoKEgtMSkvKE0tMSkpICogeSkgZm9yIHRoZSBmb3VyIGNvbG9yIGNoYW5uZWxzLgogICAgICAqIFRoZSBtYXAgaXMgYXNzdW1lZCB0byBiZSBiaWxpbmVhcmx5IGludGVycG9sYXRlZCBiZXR3ZWVuIHRoZSBzYW1wbGUgcG9pbnRzLjwvcD4KLSAgICAgKiA8cD5UaGUgY2hhbm5lbCBvcmRlciBpcyBbUiwgR2V2ZW4sIEdvZGQsIEJdLCB3aGVyZSBHZXZlbiBpcyB0aGUgZ3JlZW4KLSAgICAgKiBjaGFubmVsIGZvciB0aGUgZXZlbiByb3dzIG9mIGEgQmF5ZXIgcGF0dGVybiwgYW5kIEdvZGQgaXMgdGhlIG9kZCByb3dzLgorICAgICAqIDxwPkZvciBhIEJheWVyIGNhbWVyYSwgdGhlIGNoYW5uZWwgb3JkZXIgaXMgW1IsIEdldmVuLCBHb2RkLCBCXSwgd2hlcmUgR2V2ZW4gaXMKKyAgICAgKiB0aGUgZ3JlZW4gY2hhbm5lbCBmb3IgdGhlIGV2ZW4gcm93cyBvZiBhIEJheWVyIHBhdHRlcm4sIGFuZCBHb2RkIGlzIHRoZSBvZGQgcm93cy4KICAgICAgKiBUaGUgc2hhZGluZyBtYXAgaXMgc3RvcmVkIGluIGEgZnVsbHkgaW50ZXJsZWF2ZWQgZm9ybWF0LCBhbmQgaXRzIHNpemUKICAgICAgKiBpcyBwcm92aWRlZCBpbiB0aGUgY2FtZXJhIHN0YXRpYyBtZXRhZGF0YSBieSBBQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFLjwvcD4KICAgICAgKiA8cD5UaGUgc2hhZGluZyBtYXAgd2lsbCBnZW5lcmFsbHkgaGF2ZSBvbiB0aGUgb3JkZXIgb2YgMzAtNDAgcm93cyBhbmQgY29sdW1ucywKICAgICAgKiBhbmQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gNjR4NjQuPC9wPgotICAgICAqIDxwPkFzIGFuIGV4YW1wbGUsIGdpdmVuIGEgdmVyeSBzbWFsbCBtYXAgZGVmaW5lZCBhczo8L3A+CisgICAgICogPHA+QXMgYW4gZXhhbXBsZSwgZ2l2ZW4gYSB2ZXJ5IHNtYWxsIG1hcCBmb3IgYSBCYXllciBjYW1lcmEgZGVmaW5lZCBhczo8L3A+CiAgICAgICogPHByZT48Y29kZT5BQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFID0gWyA0LCAzIF0KICAgICAgKiBBQ0FNRVJBX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCA9CiAgICAgICogWyAxLjMsIDEuMiwgMS4xNSwgMS4yLCAgMS4yLCAxLjIsIDEuMTUsIDEuMiwKQEAgLTQ1OTMsNiArNDczNCwxNyBAQAogICAgICAqIGltYWdlIG9mIGEgZ3JheSB3YWxsICh1c2luZyBiaWN1YmljIGludGVycG9sYXRpb24gZm9yIHZpc3VhbCBxdWFsaXR5KQogICAgICAqIGFzIGNhcHR1cmVkIGJ5IHRoZSBzZW5zb3IgZ2l2ZXM6PC9wPgogICAgICAqIDxwPjxpbWcgYWx0PSJJbWFnZSBvZiBhIHVuaWZvcm0gd2hpdGUgd2FsbCAoaW52ZXJzZSBzaGFkaW5nIG1hcCkiIHNyYz0iLi4vaW1hZ2VzL2NhbWVyYTIvbWV0YWRhdGEvYW5kcm9pZC5zdGF0aXN0aWNzLmxlbnNTaGFkaW5nTWFwL2ludl9zaGFkaW5nLnBuZyIgLz48L3A+CisgICAgICogPHA+Rm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGFsbCBvZiB0aGUgMngyIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMuIEFuIGV4YW1wbGUKKyAgICAgKiBzaGFkaW5nIG1hcCBmb3Igc3VjaCBhIGNhbWVyYSBpcyBkZWZpbmVkIGFzOjwvcD4KKyAgICAgKiA8cHJlPjxjb2RlPkFDQU1FUkFfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUgPSBbIDQsIDMgXQorICAgICAqIEFDQU1FUkFfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQID0KKyAgICAgKiBbIDEuMywgMS4zLCAxLjMsIDEuMywgIDEuMiwgMS4yLCAxLjIsIDEuMiwKKyAgICAgKiAgICAgMS4xLCAxLjEsIDEuMSwgMS4xLCAgMS4zLCAxLjMsIDEuMywgMS4zLAorICAgICAqICAgMS4yLCAxLjIsIDEuMiwgMS4yLCAgMS4xLCAxLjEsIDEuMSwgMS4xLAorICAgICAqICAgICAxLjAsIDEuMCwgMS4wLCAxLjAsICAxLjIsIDEuMiwgMS4yLCAxLjIsCisgICAgICogICAxLjMsIDEuMywgMS4zLCAxLjMsICAgMS4yLCAxLjIsIDEuMiwgMS4yLAorICAgICAqICAgICAxLjIsIDEuMiwgMS4yLCAxLjIsICAxLjMsIDEuMywgMS4zLCAxLjMgXQorICAgICAqIDwvY29kZT48L3ByZT4KICAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIFJBVyBpbWFnZSBkYXRhIG1pZ2h0IGJlIHN1YmplY3QgdG8gbGVucyBzaGFkaW5nCiAgICAgICogY29ycmVjdGlvbiBub3QgcmVwb3J0ZWQgb24gdGhpcyBtYXAuIFF1ZXJ5CiAgICAgICogQUNBTUVSQV9TRU5TT1JfSU5GT19MRU5TX1NIQURJTkdfQVBQTElFRCB0byBzZWUgaWYgUkFXIGltYWdlIGRhdGEgaGFzIHN1YmplY3QKQEAgLTQ5MzYsOCArNTA4OCw4IEBACiAgICAgICogb2YgcG9pbnRzIGNhbiBiZSBsZXNzIHRoYW4gbWF4ICh0aGF0IGlzLCB0aGUgcmVxdWVzdCBkb2Vzbid0IGhhdmUgdG8KICAgICAgKiBhbHdheXMgcHJvdmlkZSBhIGN1cnZlIHdpdGggbnVtYmVyIG9mIHBvaW50cyBlcXVpdmFsZW50IHRvCiAgICAgICogQUNBTUVSQV9UT05FTUFQX01BWF9DVVJWRV9QT0lOVFMpLjwvcD4KLSAgICAgKiA8cD5Gb3IgZGV2aWNlcyB3aXRoIE1PTk9DSFJPTUUgY2FwYWJpbGl0eSwgb25seSByZWQgY2hhbm5lbCBpcyB1c2VkLiBHcmVlbiBhbmQgYmx1ZSBjaGFubmVscwotICAgICAqIGFyZSBpZ25vcmVkLjwvcD4KKyAgICAgKiA8cD5Gb3IgZGV2aWNlcyB3aXRoIE1PTk9DSFJPTUUgY2FwYWJpbGl0eSwgYWxsIHRocmVlIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBzZXQgb2YKKyAgICAgKiBjb250cm9sIHBvaW50cy48L3A+CiAgICAgICogPHA+QSBmZXcgZXhhbXBsZXMsIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGdyYXBoaWNhbCBtYXBwaW5nczsgdGhlc2UKICAgICAgKiBvbmx5IHNwZWNpZnkgdGhlIHJlZCBjaGFubmVsIGFuZCB0aGUgcHJlY2lzaW9uIGlzIGxpbWl0ZWQgdG8gNAogICAgICAqIGRpZ2l0cywgZm9yIGNvbmNpc2VuZXNzLjwvcD4KQEAgLTU0MTEsOSArNTU2MywxMjEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9kZXB0aF9pc19leGNsdXNpdmVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA0LAorICAgIC8qKgorICAgICAqIDxwPlJlY29tbWVuZGVkIGRlcHRoIHN0cmVhbSBjb25maWd1cmF0aW9ucyBmb3IgY29tbW9uIGNsaWVudCB1c2UgY2FzZXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbio1XTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5PcHRpb25hbCBzdWJzZXQgb2YgdGhlIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUyB0aGF0CisgICAgICogY29udGFpbnMgc2ltaWxhciB0dXBsZXMgbGlzdGVkIGFzCisgICAgICogKGkuZS4gd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBvdXRwdXQvaW5wdXQgc3RyZWFtLCB1c2VjYXNlIGJpdCBmaWVsZCkuCisgICAgICogQ2FtZXJhIGRldmljZXMgd2lsbCBiZSBhYmxlIHRvIHN1Z2dlc3QgcGFydGljdWxhciBkZXB0aCBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2hpY2ggYXJlCisgICAgICogcG93ZXIgYW5kIHBlcmZvcm1hbmNlIGVmZmljaWVudCBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAorICAgICAqIHJldHJpZXZpbmcgdGhlIHN1Z2dlc3Rpb25zIHNlZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwPC9hPi48L3A+CisgICAgICogPHA+Rm9yIGRhdGEgcmVwcmVzZW50YXRpb24gcGxlYXNlIHJlZmVyIHRvCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUzwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TCisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfUkVDT01NRU5ERURfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio1XQorICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDUsCisgICAgLyoqCisgICAgICogPHA+VGhlIGF2YWlsYWJsZSBkeW5hbWljIGRlcHRoIGRhdGFzcGFjZSBzdHJlYW0KKyAgICAgKiBjb25maWd1cmF0aW9ucyB0aGF0IHRoaXMgY2FtZXJhIGRldmljZSBzdXBwb3J0cworICAgICAqIChpLmUuIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgb3V0cHV0L2lucHV0IHN0cmVhbSkuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZXNlIGFyZSBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGZvciB1c2Ugd2l0aAorICAgICAqIGRhdGFTcGFjZSBEWU5BTUlDX0RFUFRILiBUaGUgY29uZmlndXJhdGlvbnMgYXJlCisgICAgICogbGlzdGVkIGFzIDxjb2RlPihmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0Pyk8L2NvZGU+IHR1cGxlcy48L3A+CisgICAgICogPHA+T25seSBkZXZpY2VzIHRoYXQgc3VwcG9ydCBkZXB0aCBvdXRwdXQgZm9yIGF0IGxlYXN0CisgICAgICogdGhlIEhBTF9QSVhFTF9GT1JNQVRfWTE2IGRlbnNlIGRlcHRoIG1hcCBhbG9uZyB3aXRoCisgICAgICogSEFMX1BJWEVMX0ZPUk1BVF9CTE9CIHdpdGggdGhlIHNhbWUgc2l6ZSBvciBzaXplIHdpdGgKKyAgICAgKiB0aGUgc2FtZSBhc3BlY3QgcmF0aW8gY2FuIGhhdmUgZHluYW1pYyBkZXB0aCBkYXRhc3BhY2UKKyAgICAgKiBzdHJlYW0gY29uZmlndXJhdGlvbi4gQUNBTUVSQV9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkUgYWxzbworICAgICAqIG5lZWRzIHRvIGJlIHNldCB0byBGQUxTRS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFCisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuKjRdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9hdmFpbGFibGVfZHluYW1pY19kZXB0aF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA2LAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBmb3JtYXQvc2l6ZSBjb21iaW5hdGlvbiBmb3IgZHluYW1pYyBkZXB0aCBvdXRwdXQgc3RyZWFtcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIGZyYW1lIGR1cmF0aW9uIHdoZW4gb25seSB0aGF0CisgICAgICogc3RyZWFtIGlzIGFjdGl2ZSwgd2l0aCBhbGwgcHJvY2Vzc2luZyAodHlwaWNhbGx5IGluIGFuZHJvaWQuKi5tb2RlKQorICAgICAqIHNldCB0byBlaXRoZXIgT0ZGIG9yIEZBU1QuPC9wPgorICAgICAqIDxwPldoZW4gbXVsdGlwbGUgc3RyZWFtcyBhcmUgdXNlZCBpbiBhIHJlcXVlc3QsIHRoZSBtaW5pbXVtIGZyYW1lCisgICAgICogZHVyYXRpb24gd2lsbCBiZSBtYXgoaW5kaXZpZHVhbCBzdHJlYW0gbWluIGR1cmF0aW9ucykuPC9wPgorICAgICAqIDxwPlRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIG9mIGEgc3RyZWFtIChvZiBhIHBhcnRpY3VsYXIgZm9ybWF0LCBzaXplKQorICAgICAqIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgc3RyZWFtIGlzIGlucHV0IG9yIG91dHB1dC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TID0gLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDcsCisgICAgLyoqCisgICAgICogPHA+VGhpcyBsaXN0cyB0aGUgbWF4aW11bSBzdGFsbCBkdXJhdGlvbiBmb3IgZWFjaAorICAgICAqIG91dHB1dCBmb3JtYXQvc2l6ZSBjb21iaW5hdGlvbiBmb3IgZHluYW1pYyBkZXB0aCBzdHJlYW1zLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0WzQqbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+QSBzdGFsbCBkdXJhdGlvbiBpcyBob3cgbXVjaCBleHRyYSB0aW1lIHdvdWxkIGdldCBhZGRlZAorICAgICAqIHRvIHRoZSBub3JtYWwgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBmb3IgYSByZXBlYXRpbmcgcmVxdWVzdAorICAgICAqIHRoYXQgaGFzIHN0cmVhbXMgd2l0aCBub24temVybyBzdGFsbC48L3A+CisgICAgICogPHA+QWxsIGR5bmFtaWMgZGVwdGggb3V0cHV0IHN0cmVhbXMgbWF5IGhhdmUgYSBub256ZXJvIHN0YWxsCisgICAgICogZHVyYXRpb24uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TID0gICAgIC8vIGludDY0WzQqbl0KKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA4LAogICAgIEFDQU1FUkFfREVQVEhfRU5ELAogCiAgICAgLyoqCisgICAgICogPHA+U3RyaW5nIGNvbnRhaW5pbmcgdGhlIGlkcyBvZiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmFzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGVbbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+Rm9yIGEgbG9naWNhbCBjYW1lcmEsIHRoaXMgaXMgY29uY2F0ZW5hdGlvbiBvZiBhbGwgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmEgSURzLgorICAgICAqIFRoZSBudWxsIHRlcm1pbmF0b3IgZm9yIHBoeXNpY2FsIGNhbWVyYSBJRCBtdXN0IGJlIHByZXNlcnZlZCBzbyB0aGF0IHRoZSB3aG9sZSBzdHJpbmcKKyAgICAgKiBjYW4gYmUgdG9rZW5pemVkIHVzaW5nICdcMCcgdG8gZ2VuZXJhdGUgbGlzdCBvZiBwaHlzaWNhbCBjYW1lcmEgSURzLjwvcD4KKyAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgaWYgdGhlIHBoeXNpY2FsIGNhbWVyYSBJRHMgb2YgdGhlIGxvZ2ljYWwgY2FtZXJhIGFyZSAiMiIgYW5kICIzIiwgdGhlCisgICAgICogdmFsdWUgb2YgdGhpcyB0YWcgd2lsbCBiZSBbJzInLCAnXDAnLCAnMycsICdcMCddLjwvcD4KKyAgICAgKiA8cD5UaGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNhbWVyYSBJRHMgbXVzdCBiZSBubyBsZXNzIHRoYW4gMi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMgPSAgICAgICAgICAgICAgICAgLy8gYnl0ZVtuXQorICAgICAgICAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TVEFSVCwKKyAgICAvKioKICAgICAgKiA8cD5UaGUgYWNjdXJhY3kgb2YgZnJhbWUgdGltZXN0YW1wIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHBoeXNpY2FsIGNhbWVyYXM8L3A+CiAgICAgICoKICAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlX3QpPC9wPgpAQCAtNTQzNCw2ICs1Njk4LDMyIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFID0gICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZV90KQogICAgICAgICAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TVEFSVCArIDEsCisgICAgLyoqCisgICAgICogPHA+U3RyaW5nIGNvbnRhaW5pbmcgdGhlIElEIG9mIHRoZSB1bmRlcmx5aW5nIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhbGxiYWNrczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgSUQgb2YgdGhlIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgdGhhdCdzIGJhY2tpbmcgdGhlIGxvZ2ljYWwgY2FtZXJhLiBBbGwgY2FtZXJhCisgICAgICogc3RyZWFtcyBhbmQgbWV0YWRhdGEgdGhhdCBhcmUgbm90IHBoeXNpY2FsIGNhbWVyYSBzcGVjaWZpYyB3aWxsIGJlIG9yaWdpbmF0aW5nIGZyb20gdGhpcworICAgICAqIHBoeXNpY2FsIGNhbWVyYS48L3A+CisgICAgICogPHA+Rm9yIGEgbG9naWNhbCBjYW1lcmEgbWFkZSB1cCBvZiBwaHlzaWNhbCBjYW1lcmFzIHdoZXJlIGVhY2ggY2FtZXJhJ3MgbGVuc2VzIGhhdmUKKyAgICAgKiBkaWZmZXJlbnQgY2hhcmFjdGVyaXN0aWNzLCB0aGUgY2FtZXJhIGRldmljZSBtYXkgY2hvb3NlIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSBwaHlzaWNhbAorICAgICAqIGNhbWVyYXMgd2hlbiBhcHBsaWNhdGlvbiBjaGFuZ2VzIEZPQ0FMX0xFTkdUSCBvciBTQ0FMRVJfQ1JPUF9SRUdJT04uCisgICAgICogQXQgdGhlIHRpbWUgb2YgbGVucyBzd2l0Y2gsIHRoaXMgcmVzdWx0IG1ldGFkYXRhIHJlZmxlY3RzIHRoZSBuZXcgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYQorICAgICAqIElELjwvcD4KKyAgICAgKiA8cD5UaGlzIGtleSB3aWxsIGJlIGF2YWlsYWJsZSBpZiB0aGUgY2FtZXJhIGRldmljZSBhZHZlcnRpc2VzIHRoaXMga2V5IHZpYSB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUyB9LgorICAgICAqIFdoZW4gYXZhaWxhYmxlLCB0aGlzIG11c3QgYmUgb25lIG9mIHZhbGlkIHBoeXNpY2FsIElEcyBiYWNraW5nIHRoaXMgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgICAgICogSWYgdGhpcyBrZXkgaXMgbm90IGF2YWlsYWJsZSBmb3IgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgdGhlIGNhbWVyYSBkZXZpY2UgaW1wbGVtZW50YXRpb24KKyAgICAgKiBtYXkgc3RpbGwgc3dpdGNoIGJldHdlZW4gZGlmZmVyZW50IGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmFzIGJhc2VkIG9uIHVzZSBjYXNlLCBidXQgdGhlCisgICAgICogY3VycmVudCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhIGluZm9ybWF0aW9uIHdvbid0IGJlIGF2YWlsYWJsZSB0byB0aGUgYXBwbGljYXRpb24uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfQUNUSVZFX1BIWVNJQ0FMX0lEID0gICAgICAgICAgIC8vIGJ5dGUKKyAgICAgICAgICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU1RBUlQgKyAyLAogICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfRU5ELAogCiAgICAgLyoqCkBAIC01NDU3LDggKzU3NDcsOCBAQAogICAgICAqIHdpbGwgbm90IHNsb3cgZG93biBjYXB0dXJlIHJhdGUgd2hlbiBhcHBseWluZyBjb3JyZWN0aW9uLiBGQVNUIG1heSBiZSB0aGUgc2FtZSBhcyBPRkYgaWYKICAgICAgKiBhbnkgY29ycmVjdGlvbiBhdCBhbGwgd291bGQgc2xvdyBkb3duIGNhcHR1cmUgcmF0ZS4gIEV2ZXJ5IG91dHB1dCBzdHJlYW0gd2lsbCBoYXZlIGEKICAgICAgKiBzaW1pbGFyIGFtb3VudCBvZiBlbmhhbmNlbWVudCBhcHBsaWVkLjwvcD4KLSAgICAgKiA8cD5UaGUgY29ycmVjdGlvbiBvbmx5IGFwcGxpZXMgdG8gcHJvY2Vzc2VkIG91dHB1dHMgc3VjaCBhcyBZVVYsIEpQRUcsIG9yIERFUFRIMTY7IGl0IGlzIG5vdAotICAgICAqIGFwcGxpZWQgdG8gYW55IFJBVyBvdXRwdXQuPC9wPgorICAgICAqIDxwPlRoZSBjb3JyZWN0aW9uIG9ubHkgYXBwbGllcyB0byBwcm9jZXNzZWQgb3V0cHV0cyBzdWNoIGFzIFlVViwgWTgsIEpQRUcsIG9yIERFUFRIMTY7IGl0IGlzCisgICAgICogbm90IGFwcGxpZWQgdG8gYW55IFJBVyBvdXRwdXQuPC9wPgogICAgICAqIDxwPlRoaXMgY29udHJvbCB3aWxsIGJlIG9uIGJ5IGRlZmF1bHQgb24gZGV2aWNlcyB0aGF0IHN1cHBvcnQgdGhpcyBjb250cm9sLiBBcHBsaWNhdGlvbnMKICAgICAgKiBkaXNhYmxpbmcgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIG5lZWQgdG8gcGF5IGV4dHJhIGF0dGVudGlvbiB3aXRoIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZgogICAgICAqIG1ldGVyaW5nIHJlZ2lvbnMsIGNyb3AgcmVnaW9uLCBhbmQgZmFjZSByZWN0YW5nbGVzLiBXaGVuIGRpc3RvcnRpb24gY29ycmVjdGlvbiBpcyBPRkYsCkBAIC01NTExLDYgKzU4MDEsODAgQEAKICAgICAgICAgICAgIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX1NUQVJUICsgMSwKICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9FTkQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgYXZhaWxhYmxlIEhFSUMgKElTTy9JRUMgMjMwMDgtMTIpIHN0cmVhbQorICAgICAqIGNvbmZpZ3VyYXRpb25zIHRoYXQgdGhpcyBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzCisgICAgICogKGkuZS4gZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBvdXRwdXQvaW5wdXQgc3RyZWFtKS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjRdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgY29uZmlndXJhdGlvbnMgYXJlIGxpc3RlZCBhcyA8Y29kZT4oZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dD8pPC9jb2RlPiB0dXBsZXMuPC9wPgorICAgICAqIDxwPklmIHRoZSBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIEhFSUMgaW1hZ2UgZm9ybWF0LCBpdCB3aWxsIHN1cHBvcnQgaWRlbnRpY2FsIHNldCBvZiBzdHJlYW0KKyAgICAgKiBjb21iaW5hdGlvbnMgaW52b2x2aW5nIEhFSUMgaW1hZ2UgZm9ybWF0LCBjb21wYXJlZCB0byB0aGUgY29tYmluYXRpb25zIGludm9sdmluZyBKUEVHCisgICAgICogaW1hZ2UgZm9ybWF0IGFzIHJlcXVpcmVkIGJ5IHRoZSBkZXZpY2UncyBoYXJkd2FyZSBsZXZlbCBhbmQgY2FwYWJpbGl0aWVzLjwvcD4KKyAgICAgKiA8cD5BbGwgdGhlIHN0YXRpYywgY29udHJvbCwgYW5kIGR5bmFtaWMgbWV0YWRhdGEgdGFncyByZWxhdGVkIHRvIEpQRUcgYXBwbHkgdG8gSEVJQyBmb3JtYXRzLgorICAgICAqIENvbmZpZ3VyaW5nIEpQRUcgYW5kIEhFSUMgc3RyZWFtcyBhdCB0aGUgc2FtZSB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQuPC9wPgorICAgICAqIDxwPkFsbCB0aGUgY29uZmlndXJhdGlvbiB0dXBsZXMgPGNvZGU+KGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgaW5wdXQ/KTwvY29kZT4gd2lsbCBjb250YWluCisgICAgICogQUlNQUdFX0ZPUk1BVF9IRUlDIGZvcm1hdCBhcyBPVVRQVVQgb25seS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUyA9ICAgICAgICAgLy8gaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnNfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfSEVJQ19TVEFSVCwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIEhFSUMgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBmcmFtZSBkdXJhdGlvbiB3aGVuIG9ubHkgdGhhdAorICAgICAqIHN0cmVhbSBpcyBhY3RpdmUsIHdpdGggYWxsIHByb2Nlc3NpbmcgKHR5cGljYWxseSBpbiBhbmRyb2lkLioubW9kZSkKKyAgICAgKiBzZXQgdG8gZWl0aGVyIE9GRiBvciBGQVNULjwvcD4KKyAgICAgKiA8cD5XaGVuIG11bHRpcGxlIHN0cmVhbXMgYXJlIHVzZWQgaW4gYSByZXF1ZXN0LCB0aGUgbWluaW11bSBmcmFtZQorICAgICAqIGR1cmF0aW9uIHdpbGwgYmUgbWF4KGluZGl2aWR1YWwgc3RyZWFtIG1pbiBkdXJhdGlvbnMpLjwvcD4KKyAgICAgKiA8cD5TZWUgQUNBTUVSQV9TRU5TT1JfRlJBTUVfRFVSQVRJT04gYW5kCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyBmb3IgbW9yZSBkZXRhaWxzIGFib3V0CisgICAgICogY2FsY3VsYXRpbmcgdGhlIG1heCBmcmFtZSByYXRlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRlJBTUVfRFVSQVRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUyA9ICAgICAgICAgICAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgKyAxLAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1heGltdW0gc3RhbGwgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBvdXRwdXQgZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIEhFSUMgc3RyZWFtcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkEgc3RhbGwgZHVyYXRpb24gaXMgaG93IG11Y2ggZXh0cmEgdGltZSB3b3VsZCBnZXQgYWRkZWQKKyAgICAgKiB0byB0aGUgbm9ybWFsIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEgcmVwZWF0aW5nIHJlcXVlc3QKKyAgICAgKiB0aGF0IGhhcyBzdHJlYW1zIHdpdGggbm9uLXplcm8gc3RhbGwuPC9wPgorICAgICAqIDxwPlRoaXMgZnVuY3Rpb25zIHNpbWlsYXJseSB0bworICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMgZm9yIEhFSUMKKyAgICAgKiBzdHJlYW1zLjwvcD4KKyAgICAgKiA8cD5BbGwgSEVJQyBvdXRwdXQgc3RyZWFtIGZvcm1hdHMgbWF5IGhhdmUgYSBub256ZXJvIHN0YWxsCisgICAgICogZHVyYXRpb24uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TCisgICAgICovCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUyA9ICAgICAgICAgICAgICAgLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9IRUlDX1NUQVJUICsgMiwKKyAgICBBQ0FNRVJBX0hFSUNfRU5ELAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfdGFnX3Q7CiAKIC8qKgpAQCAtNzAwNSw2ICs3MzY5LDEwIEBACiAgICAgICogPHA+SWYgdGhpcyBpcyBzdXBwb3J0ZWQsIGFuZHJvaWQuc2NhbGVyLnN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgd2lsbAogICAgICAqIGFkZGl0aW9uYWxseSByZXR1cm4gYSBtaW4gZnJhbWUgZHVyYXRpb24gdGhhdCBpcyBncmVhdGVyIHRoYW4KICAgICAgKiB6ZXJvIGZvciBlYWNoIHN1cHBvcnRlZCBzaXplLWZvcm1hdCBjb21iaW5hdGlvbi48L3A+CisgICAgICogPHA+Rm9yIGNhbWVyYSBkZXZpY2VzIHdpdGggTE9HSUNBTF9NVUxUSV9DQU1FUkEgY2FwYWJpbGl0eSwgd2hlbiB0aGUgdW5kZXJseWluZyBhY3RpdmUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgc3dpdGNoZXMsIGV4cG9zdXJlVGltZSwgc2Vuc2l0aXZpdHksIGFuZCBsZW5zIHByb3BlcnRpZXMgbWF5IGNoYW5nZQorICAgICAqIGV2ZW4gaWYgQUUvQUYgaXMgbG9ja2VkLiBIb3dldmVyLCB0aGUgb3ZlcmFsbCBhdXRvIGV4cG9zdXJlIGFuZCBhdXRvIGZvY3VzIGV4cGVyaWVuY2UKKyAgICAgKiBmb3IgdXNlcnMgd2lsbCBiZSBjb25zaXN0ZW50LiBSZWZlciB0byBMT0dJQ0FMX01VTFRJX0NBTUVSQSBjYXBhYmlsaXR5IGZvciBkZXRhaWxzLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9CTEFDS19MRVZFTF9MT0NLCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DSwpAQCAtNzA2MCw2ICs3NDI4LDEwIEBACiAgICAgICogd2lsbCBhY2N1cmF0ZWx5IHJlcG9ydCB0aGUgdmFsdWVzIGFwcGxpZWQgYnkgQVdCIGluIHRoZSByZXN1bHQuPC9wPgogICAgICAqIDxwPkEgZ2l2ZW4gY2FtZXJhIGRldmljZSBtYXkgYWxzbyBzdXBwb3J0IGFkZGl0aW9uYWwgcG9zdC1wcm9jZXNzaW5nCiAgICAgICogY29udHJvbHMsIGJ1dCB0aGlzIGNhcGFiaWxpdHkgb25seSBjb3ZlcnMgdGhlIGFib3ZlIGxpc3Qgb2YgY29udHJvbHMuPC9wPgorICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIExPR0lDQUxfTVVMVElfQ0FNRVJBIGNhcGFiaWxpdHksIHdoZW4gdW5kZXJseWluZyBhY3RpdmUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgc3dpdGNoZXMsIHRvbmVtYXAsIHdoaXRlIGJhbGFuY2UsIGFuZCBzaGFkaW5nIG1hcCBtYXkgY2hhbmdlIGV2ZW4gaWYKKyAgICAgKiBhd2IgaXMgbG9ja2VkLiBIb3dldmVyLCB0aGUgb3ZlcmFsbCBwb3N0LXByb2Nlc3NpbmcgZXhwZXJpZW5jZSBmb3IgdXNlcnMgd2lsbCBiZQorICAgICAqIGNvbnNpc3RlbnQuIFJlZmVyIHRvIExPR0lDQUxfTVVMVElfQ0FNRVJBIGNhcGFiaWxpdHkgZm9yIGRldGFpbHMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fQVZBSUxBQkxFX0FCRVJSQVRJT05fTU9ERVMKQEAgLTcxNDMsNyArNzUxNSw3IEBACiAgICAgICogY2FtZXJhIGRldmljZSBjYW4gY2FwdHVyZSB0aGlzIHNpemUgZm9yIGF0IGxlYXN0IDEwIGZyYW1lcyBwZXIgc2Vjb25kLiAgQWxzbyB0aGUKICAgICAgKiBBQ0FNRVJBX0NPTlRST0xfQUVfQVZBSUxBQkxFX1RBUkdFVF9GUFNfUkFOR0VTIGVudHJ5IGxpc3RzIGF0IGxlYXN0IG9uZSBGUFMgcmFuZ2Ugd2hlcmUKICAgICAgKiB0aGUgbWluaW11bSBGUFMgaXMgJmd0Oz0gMSAvIG1pbmltdW1GcmFtZUR1cmF0aW9uIGZvciB0aGUgbGFyZ2VzdCBZVVZfNDIwXzg4OCBzaXplLjwvcD4KLSAgICAgKiA8cD5JZiB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMCB9LCB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiB9LCB0aGVuIHRob3NlIGNhbiBhbHNvIGJlCisgICAgICogPHA+SWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggfSwgdGhlbiB0aG9zZSBjYW4gYWxzbyBiZQogICAgICAqIGNhcHR1cmVkIGF0IHRoZSBzYW1lIHJhdGUgYXMgdGhlIG1heGltdW0tc2l6ZSBZVVZfNDIwXzg4OCByZXNvbHV0aW9uIGlzLjwvcD4KICAgICAgKiA8cD5JbiBhZGRpdGlvbiwgdGhlIEFDQU1FUkFfU1lOQ19NQVhfTEFURU5DWSBmaWVsZCBpcyBndWFyYW50ZWQgdG8gaGF2ZSBhIHZhbHVlIGJldHdlZW4gMAogICAgICAqIGFuZCA0LCBpbmNsdXNpdmUuIEFDQU1FUkFfQ09OVFJPTF9BRV9MT0NLX0FWQUlMQUJMRSBhbmQgQUNBTUVSQV9DT05UUk9MX0FXQl9MT0NLX0FWQUlMQUJMRQpAQCAtNzE3Nyw4ICs3NTQ5LDggQEAKICAgICAgKiA8bGk+VGhlIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFIGVudHJ5IGlzIGxpc3RlZCBieSB0aGlzIGRldmljZS48L2xpPgogICAgICAqIDxsaT5BcyBvZiBBbmRyb2lkIFAsIHRoZSBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UgZW50cnkgaXMgbGlzdGVkIGJ5IHRoaXMgZGV2aWNlLjwvbGk+CiAgICAgICogPGxpPkEgTElNSVRFRCBjYW1lcmEgd2l0aCBvbmx5IHRoZSBERVBUSF9PVVRQVVQgY2FwYWJpbGl0eSBkb2VzIG5vdCBoYXZlIHRvIHN1cHBvcnQKLSAgICAgKiAgIG5vcm1hbCBZVVZfNDIwXzg4OCwgSlBFRywgYW5kIFBSSVYtZm9ybWF0IG91dHB1dHMuIEl0IG9ubHkgaGFzIHRvIHN1cHBvcnQgdGhlIERFUFRIMTYKLSAgICAgKiAgIGZvcm1hdC48L2xpPgorICAgICAqICAgbm9ybWFsIFlVVl80MjBfODg4LCBZOCwgSlBFRywgYW5kIFBSSVYtZm9ybWF0IG91dHB1dHMuIEl0IG9ubHkgaGFzIHRvIHN1cHBvcnQgdGhlCisgICAgICogICBERVBUSDE2IGZvcm1hdC48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPHA+R2VuZXJhbGx5LCBkZXB0aCBvdXRwdXQgb3BlcmF0ZXMgYXQgYSBzbG93ZXIgZnJhbWUgcmF0ZSB0aGFuIHN0YW5kYXJkIGNvbG9yIGNhcHR1cmUsCiAgICAgICogc28gdGhlIERFUFRIMTYgYW5kIERFUFRIX1BPSU5UX0NMT1VEIGZvcm1hdHMgd2lsbCBjb21tb25seSBoYXZlIGEgc3RhbGwgZHVyYXRpb24gdGhhdApAQCAtNzIwOSw4ICs3NTgxLDE0IEBACiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9USU9OX1RSQUNLSU5HICAgICAgICAgICA9IDEwLAogCiAgICAgLyoqCi0gICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBsb2dpY2FsIGNhbWVyYSBiYWNrZWQgYnkgdHdvIG9yIG1vcmUgcGh5c2ljYWwgY2FtZXJhcyB0aGF0IGFyZQotICAgICAqIGFsc28gZXhwb3NlZCB0byB0aGUgYXBwbGljYXRpb24uPC9wPgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGlzIGEgbG9naWNhbCBjYW1lcmEgYmFja2VkIGJ5IHR3byBvciBtb3JlIHBoeXNpY2FsIGNhbWVyYXMuIEluCisgICAgICogQVBJIGxldmVsIDI4LCB0aGUgcGh5c2ljYWwgY2FtZXJhcyBtdXN0IGFsc28gYmUgZXhwb3NlZCB0byB0aGUgYXBwbGljYXRpb24gdmlhCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjZ2V0Q2FtZXJhSWRMaXN0Ij5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYUlkTGlzdDwvYT4uIFN0YXJ0aW5nIGZyb20gQVBJCisgICAgICogbGV2ZWwgMjksIHNvbWUgb3IgYWxsIHBoeXNpY2FsIGNhbWVyYXMgbWF5IG5vdCBiZSBpbmRlcGVuZGVudGx5IGV4cG9zZWQgdG8gdGhlCisgICAgICogYXBwbGljYXRpb24sIGluIHdoaWNoIGNhc2UgdGhlIHBoeXNpY2FsIGNhbWVyYSBJRHMgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGluCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjZ2V0Q2FtZXJhSWRMaXN0Ij5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYUlkTGlzdDwvYT4uIEJ1dCB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBjYW4gc3RpbGwgcXVlcnkgdGhlIHBoeXNpY2FsIGNhbWVyYXMnIGNoYXJhY3RlcmlzdGljcyBieSBjYWxsaW5nCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIj5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvYT4uPC9wPgogICAgICAqIDxwPkNhbWVyYSBhcHBsaWNhdGlvbiBzaG91bGRuJ3QgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIGF0IG1vc3QgMSByZWFyIGNhbWVyYSBhbmQgMSBmcm9udAogICAgICAqIGNhbWVyYSBpbiB0aGUgc3lzdGVtLiBGb3IgYW4gYXBwbGljYXRpb24gdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGZyb250IGFuZCBiYWNrIGNhbWVyYXMsCiAgICAgICogdGhlIHJlY29tbWVuZGF0aW9uIGlzIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSBmaXJzdCByZWFyIGNhbWVyYSBhbmQgdGhlIGZpcnN0IGZyb250CkBAIC03MjMzLDcgKzc2MTEsNyBAQAogICAgICAqIDwvbGk+CiAgICAgICogPGxpPlRoZSBTRU5TT1JfSU5GT19USU1FU1RBTVBfU09VUkNFIG9mIHRoZSBsb2dpY2FsIGRldmljZSBhbmQgcGh5c2ljYWwgZGV2aWNlcyBtdXN0IGJlCiAgICAgICogICB0aGUgc2FtZS48L2xpPgotICAgICAqIDxsaT5UaGUgbG9naWNhbCBjYW1lcmEgZGV2aWNlIG11c3QgYmUgTElNSVRFRCBvciBoaWdoZXIgZGV2aWNlLjwvbGk+CisgICAgICogPGxpPlRoZSBsb2dpY2FsIGNhbWVyYSBtdXN0IGJlIExJTUlURUQgb3IgaGlnaGVyIGRldmljZS48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPHA+Qm90aCB0aGUgbG9naWNhbCBjYW1lcmEgZGV2aWNlIGFuZCBpdHMgdW5kZXJseWluZyBwaHlzaWNhbCBkZXZpY2VzIHN1cHBvcnQgdGhlCiAgICAgICogbWFuZGF0b3J5IHN0cmVhbSBjb21iaW5hdGlvbnMgcmVxdWlyZWQgZm9yIHRoZWlyIGRldmljZSBsZXZlbHMuPC9wPgpAQCAtNzI1MywyMiArNzYzMSwxMDggQEAKICAgICAgKiA8cD5Vc2luZyBwaHlzaWNhbCBzdHJlYW1zIGluIHBsYWNlIG9mIGEgbG9naWNhbCBzdHJlYW0gb2YgdGhlIHNhbWUgc2l6ZSBhbmQgZm9ybWF0IHdpbGwKICAgICAgKiBub3Qgc2xvdyBkb3duIHRoZSBmcmFtZSByYXRlIG9mIHRoZSBjYXB0dXJlLCBhcyBsb25nIGFzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uCiAgICAgICogb2YgdGhlIHBoeXNpY2FsIGFuZCBsb2dpY2FsIHN0cmVhbXMgYXJlIHRoZSBzYW1lLjwvcD4KKyAgICAgKiA8cD5BIGxvZ2ljYWwgY2FtZXJhIGRldmljZSdzIGR5bmFtaWMgbWV0YWRhdGEgbWF5IGNvbnRhaW4KKyAgICAgKiBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0FDVElWRV9QSFlTSUNBTF9JRCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBjdXJyZW50CisgICAgICogYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBJZC4gQW4gYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBpcyB0aGUgcGh5c2ljYWwgY2FtZXJhIGZyb20gd2hpY2gKKyAgICAgKiB0aGUgbG9naWNhbCBjYW1lcmEncyBtYWluIGltYWdlIGRhdGEgb3V0cHV0cyAoWVVWIG9yIFJBVykgYW5kIG1ldGFkYXRhIGNvbWUgZnJvbS4KKyAgICAgKiBJbiBhZGRpdGlvbiwgdGhpcyBzZXJ2ZXMgYXMgYW4gaW5kaWNhdGlvbiB3aGljaCBwaHlzaWNhbCBjYW1lcmEgaXMgdXNlZCB0byBvdXRwdXQgdG8KKyAgICAgKiBhIFJBVyBzdHJlYW0sIG9yIGluIGNhc2Ugb25seSBwaHlzaWNhbCBjYW1lcmFzIHN1cHBvcnQgUkFXLCB3aGljaCBwaHlzaWNhbCBSQVcgc3RyZWFtCisgICAgICogdGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXF1ZXN0LjwvcD4KKyAgICAgKiA8cD5Mb2dpY2FsIGNhbWVyYSdzIHN0YXRpYyBtZXRhZGF0YSB0YWdzIGJlbG93IGRlc2NyaWJlIHRoZSBkZWZhdWx0IGFjdGl2ZSBwaHlzaWNhbAorICAgICAqIGNhbWVyYS4gQW4gYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBpcyBkZWZhdWx0IGlmIGl0J3MgdXNlZCB3aGVuIGFwcGxpY2F0aW9uIGRpcmVjdGx5CisgICAgICogdXNlcyByZXF1ZXN0cyBidWlsdCBmcm9tIGEgdGVtcGxhdGUuIEFsbCB0ZW1wbGF0ZXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBzYW1lIGFjdGl2ZQorICAgICAqIHBoeXNpY2FsIGNhbWVyYS48L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX1NFTlNJVElWSVRZX1JBTkdFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQ8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX0VYUE9TVVJFX1RJTUVfUkFOR0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX01BWF9GUkFNRV9EVVJBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fV0hJVEVfTEVWRUw8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX0xFTlNfU0hBRElOR19BUFBMSUVEPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTI8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk48L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9NQVhfQU5BTE9HX1NFTlNJVElWSVRZPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQVZBSUxBQkxFX1RFU1RfUEFUVEVSTl9NT0RFUzwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19JTkZPX0hZUEVSRk9DQUxfRElTVEFOQ0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5GT19NSU5JTVVNX0ZPQ1VTX0RJU1RBTkNFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0lORk9fRk9DVVNfRElTVEFOQ0VfQ0FMSUJSQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19ESVNUT1JUSU9OPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPlRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSBjYXB0dXJlIHJlcXVlc3QgYW5kIHJlc3VsdCBtZXRhZGF0YSB0YWdzCisgICAgICogcmVxdWlyZWQgZm9yIGJhc2ljIGNhbWVyYSBmdW5jdGlvbmFsaXRpZXMgd2lsbCBiZSBzb2xlbHkgYmFzZWQgb24gdGhlCisgICAgICogbG9naWNhbCBjYW1lcmEgY2FwYWJpbHRpdHkuIE90aGVyIHJlcXVlc3QgYW5kIHJlc3VsdCBtZXRhZGF0YSB0YWdzLCBvbiB0aGUgb3RoZXIKKyAgICAgKiBoYW5kLCB3aWxsIGJlIGJhc2VkIG9uIGN1cnJlbnQgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYS4gRm9yIGV4YW1wbGUsIHRoZSBwaHlzaWNhbAorICAgICAqIGNhbWVyYXMnIHNlbnNvciBzZW5zaXRpdml0eSBhbmQgbGVucyBjYXBhYmlsaXR5IGNvdWxkIGJlIGRpZmZlcmVudCBmcm9tIGVhY2ggb3RoZXIuCisgICAgICogU28gd2hlbiB0aGUgYXBwbGljYXRpb24gbWFudWFsbHkgY29udHJvbHMgc2Vuc29yIGV4cG9zdXJlIHRpbWUvZ2Fpbiwgb3IgZG9lcyBtYW51YWwKKyAgICAgKiBmb2N1cyBjb250cm9sLCBpdCBtdXN0IGNoZWNrcyB0aGUgY3VycmVudCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhJ3MgZXhwb3N1cmUsIGdhaW4sCisgICAgICogYW5kIGZvY3VzIGRpc3RhbmNlIHJhbmdlLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19IWVBFUkZPQ0FMX0RJU1RBTkNFCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19NSU5JTVVNX0ZPQ1VTX0RJU1RBTkNFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9BQ1RJVkVfUEhZU0lDQUxfSUQKICAgICAgKiBAc2VlIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU0VOU09SX1NZTkNfVFlQRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQVZBSUxBQkxFX1RFU1RfUEFUVEVSTl9NT0RFUworICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRk9SV0FSRF9NQVRSSVgxCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDIKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0VYUE9TVVJFX1RJTUVfUkFOR0UKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fTEVOU19TSEFESU5HX0FQUExJRUQKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fTUFYX0ZSQU1FX0RVUkFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BIWVNJQ0FMX1NJWkUKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fU0VOU0lUSVZJVFlfUkFOR0UKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fV0hJVEVfTEVWRUwKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX01BWF9BTkFMT0dfU0VOU0lUSVZJVFkKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX09QVElDQUxfQkxBQ0tfUkVHSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDIKICAgICAgKi8KICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSAgICAgID0gMTEsCiAKICAgICAvKioKICAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIG1vbm9jaHJvbWUgY2FtZXJhIHRoYXQgZG9lc24ndCBjb250YWluIGEgY29sb3IgZmlsdGVyIGFycmF5LAotICAgICAqIGFuZCB0aGUgcGl4ZWwgdmFsdWVzIG9uIFUgYW5kIFYgcGxhbmVzIGFyZSBhbGwgMTI4LjwvcD4KKyAgICAgKiBhbmQgZm9yIFlVVl80MjBfODg4IHN0cmVhbSwgdGhlIHBpeGVsIHZhbHVlcyBvbiBVIGFuZCBWIHBsYW5lcyBhcmUgYWxsIDEyOC48L3A+CisgICAgICogPHA+QSBNT05PQ0hST01FIGNhbWVyYSBtdXN0IHN1cHBvcnQgdGhlIGd1YXJhbnRlZWQgc3RyZWFtIGNvbWJpbmF0aW9ucyByZXF1aXJlZCBmb3IKKyAgICAgKiBpdHMgZGV2aWNlIGxldmVsIGFuZCBjYXBhYmlsaXRpZXMuIEFkZGl0aW9uYWxseSwgaWYgdGhlIG1vbm9jaHJvbWUgY2FtZXJhIGRldmljZQorICAgICAqIHN1cHBvcnRzIFk4IGZvcm1hdCwgYWxsIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb24gcmVxdWlyZW1lbnRzIHJlbGF0ZWQgdG8ge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggWVVWXzQyMF84ODh9IGFwcGx5CisgICAgICogdG8ge0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggWTh9IGFzIHdlbGwuIFRoZXJlIGFyZSBubworICAgICAqIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb24gcmVxdWlyZW1lbnRzIHdpdGggcmVnYXJkIHRvCisgICAgICoge0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggWTh9IGZvciBCYXllciBjYW1lcmEgZGV2aWNlcy48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoZSBTRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQgb2YgYSBNT05PQ0hST01FCisgICAgICogY2FtZXJhIHdpbGwgYmUgZWl0aGVyIE1PTk8gb3IgTklSLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FICAgICAgICAgICAgICAgID0gMTIsCiAKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBjYXBhYmxlIG9mIHdyaXRpbmcgaW1hZ2UgZGF0YSBpbnRvIGEgcmVnaW9uIG9mIG1lbW9yeQorICAgICAqIGluYWNjZXNzaWJsZSB0byBBbmRyb2lkIHVzZXJzcGFjZSBvciB0aGUgQW5kcm9pZCBrZXJuZWwsIGFuZCBvbmx5IGFjY2Vzc2libGUgdG8KKyAgICAgKiB0cnVzdGVkIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgKFRFRSkuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NFQ1VSRV9JTUFHRV9EQVRBICAgICAgICAgPSAxMywKKwogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9jYXBhYmlsaXRpZXNfdDsKIAogCkBAIC03Mjk0LDYgKzc3NTgsODEgQEAKIAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfY3JvcHBpbmdfdHlwZV90OwogCisvLyBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnMgeworICAgIC8qKgorICAgICAqIDxwPlByZXZpZXcgbXVzdCBvbmx5IGluY2x1ZGUgbm9uLXN0YWxsaW5nIHByb2Nlc3NlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2l0aAorICAgICAqIG91dHB1dCBmb3JtYXRzIGxpa2UKKyAgICAgKiB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCB9LAorICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX1BSSVZBVEUgfSwgZXRjLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1BSRVZJRVcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MCwKKworICAgIC8qKgorICAgICAqIDxwPlZpZGVvIHJlY29yZCBtdXN0IGluY2x1ZGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHRoYXQgbWF0Y2ggdGhlIGFkdmVydGlzZWQKKyAgICAgKiBzdXBwb3J0ZWQgbWVkaWEgcHJvZmlsZXMgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sIj5DYW1jb3JkZXJQcm9maWxlPC9hPiB3aXRoCisgICAgICogSU1QTEVNRU5UQVRJT05fREVGSU5FRCBmb3JtYXQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUkVDT1JECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEsCisKKyAgICAvKioKKyAgICAgKiA8cD5WaWRlbyBzbmFwc2hvdCBtdXN0IGluY2x1ZGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGF0IGxlYXN0IGFzIGJpZyBhcworICAgICAqIHRoZSBtYXhpbXVtIFJFQ09SRCByZXNvbHV0aW9ucyBhbmQgb25seSB3aXRoCisgICAgICoge0BsaW5rIEFJTUFHRV9GT1JNQVRfSlBFRyBKUEVHIG91dHB1dCBmb3JtYXR9LgorICAgICAqIEFkZGl0aW9uYWxseSB0aGUgY29uZmlndXJhdGlvbnMgc2hvdWxkbid0IGNhdXNlIHByZXZpZXcgZ2xpdGNoZXMgYW5kIGFsc28gYmUgYWJsZSB0bworICAgICAqIHJ1biBhdCAzMCBmcHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfVklERU9fU05BUFNIT1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MiwKKworICAgIC8qKgorICAgICAqIDxwPlJlY29tbWVuZGVkIHNuYXBzaG90IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIHdpdGgKKyAgICAgKiBzaXplIGNsb3NlIHRvIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUgYW5kCisgICAgICoge0BsaW5rIEFJTUFHRV9GT1JNQVRfSlBFRyBKUEVHIG91dHB1dCBmb3JtYXR9LgorICAgICAqIFRha2luZyBpbnRvIGFjY291bnQgcmVzdHJpY3Rpb25zIG9uIGFzcGVjdCByYXRpbywgYWxpZ25tZW50IGV0Yy4gdGhlIGFyZWEgb2YgdGhlCisgICAgICogbWF4aW11bSBzdWdnZXN0ZWQgc2l6ZSBzaG91bGRu4oCZdCBiZSBsZXNzIHRoYW4gOTclIG9mIHRoZSBzZW5zb3IgYXJyYXkgc2l6ZSBhcmVhLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRQorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfU05BUFNIT1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MywKKworICAgIC8qKgorICAgICAqIDxwPklmIHN1cHBvcnRlZCwgcmVjb21tZW5kZWQgaW5wdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG11c3Qgb25seSBiZSBhZHZlcnRpc2VkIHdpdGgKKyAgICAgKiBaU0wgYWxvbmcgd2l0aCBvdGhlciBwcm9jZXNzZWQgYW5kL29yIHN0YWxsaW5nIG91dHB1dCBmb3JtYXRzLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1pTTCAgID0gMHg0LAorCisgICAgLyoqCisgICAgICogPHA+SWYgc3VwcG9ydGVkLCByZWNvbW1lbmRlZCByYXcgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG11c3Qgb25seSBpbmNsdWRlIFJBVyBiYXNlZAorICAgICAqIG91dHB1dCBmb3JtYXRzLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1JBVyAgID0gMHg1LAorCisgICAgLyoqCisgICAgICogPHA+SWYgc3VwcG9ydGVkLCB0aGUgcmVjb21tZW5kZWQgbG93IGxhdGVuY3kgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG11c3QgaGF2ZQorICAgICAqIGVuZC10by1lbmQgbGF0ZW5jeSB0aGF0IGRvZXMgbm90IGV4Y2VlZCAyMDAgbXMuIHVuZGVyIHN0YW5kYXJkIG9wZXJhdGluZyBjb25kaXRpb25zCisgICAgICogKHJlYXNvbmFibGUgbGlnaHQgbGV2ZWxzLCBub3QgbG9hZGVkIHN5c3RlbSkgYW5kIHVzaW5nIHRlbXBsYXRlCisgICAgICogVEVNUExBVEVfU1RJTExfQ0FQVFVSRS4gVGhpcyBpcyBwcmltYXJpbHkgZm9yIGxpc3RpbmcgY29uZmlndXJhdGlvbnMgZm9yIHRoZQorICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX0pQRUcgSlBFRyBvdXRwdXQgZm9ybWF0fQorICAgICAqIGhvd2V2ZXIgb3RoZXIgc3VwcG9ydGVkIG91dHB1dCBmb3JtYXRzIGNhbiBiZSBhZGRlZCBhcyB3ZWxsLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX0xPV19MQVRFTkNZX1NOQVBTSE9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDYsCisKKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1BVQkxJQ19FTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NywKKworICAgIC8qKgorICAgICAqIDxwPlZlbmRvciBkZWZpbmVkIHVzZSBjYXNlcy4gVGhlc2UgZGVwZW5kIG9uIHRoZSB2ZW5kb3IgaW1wbGVtZW50YXRpb24uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfVkVORE9SX1NUQVJUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE4LAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3Q7CisKIAogLy8gQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2Vuc29yX3JlZmVyZW5jZV9pbGx1bWluYW50MSB7CkBAIC03NDcwLDYgKzgwMDksMjEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9SR0IgICAgICAgICAgICAgICAgID0gNCwKIAorICAgIC8qKgorICAgICAqIDxwPlNlbnNvciBkb2Vzbid0IGhhdmUgYW55IEJheWVyIGNvbG9yIGZpbHRlci4KKyAgICAgKiBTdWNoIHNlbnNvciBjYXB0dXJlcyB2aXNpYmxlIGxpZ2h0IGluIG1vbm9jaHJvbWUuIFRoZSBleGFjdCB3ZWlnaHRpbmcgYW5kCisgICAgICogd2F2ZWxlbmd0aHMgY2FwdHVyZWQgaXMgbm90IHNwZWNpZmllZCwgYnV0IGdlbmVyYWxseSBvbmx5IGluY2x1ZGVzIHRoZSB2aXNpYmxlCisgICAgICogZnJlcXVlbmNpZXMuIFRoaXMgdmFsdWUgaW1wbGllcyBhIE1PTk9DSFJPTUUgY2FtZXJhLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9NT05PICAgICAgICAgICAgICAgID0gNSwKKworICAgIC8qKgorICAgICAqIDxwPlNlbnNvciBoYXMgYSBuZWFyIGluZnJhcmVkIGZpbHRlciBjYXB0dXJpbmcgbGlnaHQgd2l0aCB3YXZlbGVuZ3RoIGJldHdlZW4KKyAgICAgKiByb3VnaGx5IDc1MG5tIGFuZCAxNDAwbm0sIGFuZCB0aGUgc2FtZSBmaWx0ZXIgY292ZXJzIHRoZSB3aG9sZSBzZW5zb3IgYXJyYXkuIFRoaXMKKyAgICAgKiB2YWx1ZSBpbXBsaWVzIGEgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX05JUiAgICAgICAgICAgICAgICAgPSA2LAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NlbnNvcl9pbmZvX2NvbG9yX2ZpbHRlcl9hcnJhbmdlbWVudF90OwogCiAvLyBBQ0FNRVJBX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UKQEAgLTc4OTgsNiArODQ1MiwxNiBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2RlcHRoX2lzX2V4Y2x1c2l2ZV90OwogCisvLyBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9ucyB7CisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3Q7CisKIAogLy8gQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZSB7CkBAIC03OTQxLDYgKzg1MDUsMTYgQEAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGlzdG9ydGlvbl9jb3JyZWN0aW9uX21vZGVfdDsKIAogCisvLyBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnMgeworICAgIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKKworCisKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIAogX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhV2luZG93VHlwZS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmNjdlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhV2luZG93VHlwZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9OREtfQ0FNRVJBX1dJTkRPV19UWVBFX0gKKyNkZWZpbmUgX05ES19DQU1FUkFfV0lORE9XX1RZUEVfSAorCisvKioKKyAqIEBhZGR0b2dyb3VwIENhbWVyYQorICogQHsKKyAqLworCisvKioKKyAqIEBmaWxlIE5ka0NhbWVyYVdpbmRvd1R5cGUuaAorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworLyoqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgd2luZG93IHR5cGUgdXNlZCBieSBOREsgYW5kIHRoZSBWTkRLIHZhcmlhbnRzIG9mIHRoZQorICogY2FtZXJhMiBOREsuIFRoaXMgZW5hYmxlcyB1cyB0byBzaGFyZSB0aGUgYXBpIGRlZmluaXRpb24gaGVhZGVycyBhbmQgYXZvaWQKKyAqIGNvZGUgZHVwbGljYXRpb24gKHNpbmNlIHRoZSBWTkRLIHZhcmlhbnQgZG9lc24ndCB1c2UgQU5hdGl2ZVdpbmRvdyB1bmxpa2UgdGhlCisgKiBOREsgdmFyaWFudCkuCisgKi8KKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KK3R5cGVkZWYgbmF0aXZlX2hhbmRsZV90IEFDYW1lcmFXaW5kb3dUeXBlOworI2Vsc2UKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KK3R5cGVkZWYgQU5hdGl2ZVdpbmRvdyBBQ2FtZXJhV2luZG93VHlwZTsKKyNlbmRpZgorCisjZW5kaWYgLy9fTkRLX0NBTUVSQV9XSU5ET1dfVFlQRV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKaW5kZXggNTM0MGU3Ni4uZDNmODgyNiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaApAQCAtMzUsOSArMzUsOSBAQAogCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtDYW1lcmFFcnJvci5oIgogI2luY2x1ZGUgIk5ka0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiTmRrQ2FtZXJhV2luZG93VHlwZS5oIgogCiAjaWZuZGVmIF9OREtfQ0FQVFVSRV9SRVFVRVNUX0gKICNkZWZpbmUgX05ES19DQVBUVVJFX1JFUVVFU1RfSApAQCAtMTAxLDcgKzEwMSw3IEBACiAgKgogICogQHNlZSBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0CiAgKi8KLWNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShBTmF0aXZlV2luZG93KiB3aW5kb3csCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUoQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywKICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCkBAIC0zNTgsNiArMzU4LDIxOSBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBHZXQgYSBtZXRhZGF0YSBlbnRyeSBmcm9tIGlucHV0IHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgYmFja2luZyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9nZXRDb25zdEVudHJ5LCBleGNlcHQgdGhhdCBpZiB0aGUga2V5IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHJldHVybnMgdGhlIGVudHJ5IHNldCBieSBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfKiBjbGFzcyBvZgorICogZnVuY3Rpb25zIG9uIHRoZSBwYXJ0aWN1bGFyIHBoeXNpY2FsIGNhbWVyYS48L3A+CisgKgorICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IG9mIGludGVyZXN0IGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gcGh5c2ljYWxJZCBvbmUgb2YgdGhlIHBoeXNpY2FsIElkcyB1c2VkIHdoZW4gcmVxdWVzdCBpcyBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gdGFnIHRoZSBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgdGFnIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9CisgKiAgICAgICAgICAgIHRoYXQgaXMgc2V0IGJ5IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV8qIGNsYXNzIG9mIGZ1bmN0aW9ucy4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiBtZXRhZGF0YSwgcGh5c2ljYWxJZCwgb3IgZW50cnkgaXMgTlVMTCwKKyAqICAgICAgICAgcGh5c2ljYWxJZCBpcyBub3Qgb25lIG9mIHRoZSBJZHMgdXNlZCBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUKKyAqICAgICAgICAgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX01FVEFEQVRBX05PVF9GT1VORH0gaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBkb2VzIG5vdCBjb250YWluIGFuCisgKiAgICAgICAgICAgICBlbnRyeSBvZiBpbnB1dCB0YWcgdmFsdWUuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnlfcGh5c2ljYWxDYW1lcmEoCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkqIGVudHJ5KSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggdW5zaWduZWQgOCBiaXRzIGRhdGEgdHlwZSBmb3IKKyAqIGEgcGh5c2ljYWwgY2FtZXJhIGJhY2tpbmcgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfdTgsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3QgdW5zaWduZWQgOCBiaXRzLAorICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLCBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkCisgKiAgICAgICAgICAgICBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vCisgKiAgICAgICAgICAgICBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV91OCgKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCB1aW50OF90KiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggc2lnbmVkIDMyIGJpdHMgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfaTMyLCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCisgKiBzZXRzIHRoZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEgYmFja2luZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKiBJZiB7QGxpbmsgdGFnfSBpcyBub3QgY29udGFpbmVkIGluCisgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKKyAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgb25lIG9mIHRoZSBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgdGFncyBpbgorICogICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfS4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IG9yIHBoeXNpY2FsSWQgaXMgTlVMTCwgY291bnQgaXMKKyAqICAgICAgICAgICAgIGxhcmdlciB0aGFuIHplcm8gd2hpbGUgZGF0YSBpcyBOVUxMLCB0aGUgZGF0YSB0eXBlIG9mIHRoZSB0YWcgaXMgbm90IHNpZ25lZCAzMiBiaXRzLAorICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLCBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkCisgKiAgICAgICAgICAgICBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vCisgKiAgICAgICAgICAgICBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9pMzIoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgaW50MzJfdCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIGZsb2F0IGRhdGEgdHlwZSBmb3IKKyAqIGEgcGh5c2ljYWwgY2FtZXJhIG9mIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2Zsb2F0LCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCisgKiBzZXRzIHRoZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEgYmFja2luZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKiBJZiB7QGxpbmsgdGFnfSBpcyBub3QgY29udGFpbmVkIGluCisgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKKyAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgb25lIG9mIHRoZSBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgdGFncyBpbgorICogICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfS4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IG9yIHBoeXNpY2FsSWQgaXMgTlVMTCwgY291bnQgaXMKKyAqICAgICAgICAgICAgIGxhcmdlciB0aGFuIHplcm8gd2hpbGUgZGF0YSBpcyBOVUxMLCB0aGUgZGF0YSB0eXBlIG9mIHRoZSB0YWcgaXMgbm90IGZsb2F0LAorICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLCBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkCisgKiAgICAgICAgICAgICBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vCisgKiAgICAgICAgICAgICBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9mbG9hdCgKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCBmbG9hdCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIHNpZ25lZCA2NCBiaXRzIGRhdGEgdHlwZSBmb3IKKyAqIGEgcGh5c2ljYWwgY2FtZXJhIG9mIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2k2NCwgZXhjZXB0IHRoYXQgaWYge0BsaW5rIHRhZ30gaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogc2V0cyB0aGUgZW50cnkgZm9yIGEgcGFydGljdWxhciBwaHlzaWNhbCBzdWItY2FtZXJhIGJhY2tpbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICogSWYge0BsaW5rIHRhZ30gaXMgbm90IGNvbnRhaW5lZCBpbgorICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoZSBrZXkgd2lsbCBiZSBpZ25vcmVkCisgKiBieSB0aGUgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IG9mIGludGVyZXN0IGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gcGh5c2ljYWxJZCBvbmUgb2YgdGhlIHBoeXNpY2FsIElkcyB1c2VkIHdoZW4gcmVxdWVzdCBpcyBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gdGFnIG9uZSBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHRhZ3MgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30uCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBvciBwaHlzaWNhbElkIGlzIE5VTEwsIGNvdW50IGlzCisgKiAgICAgICAgICAgICBsYXJnZXIgdGhhbiB6ZXJvIHdoaWxlIGRhdGEgaXMgTlVMTCwgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdGFnIGlzIG5vdCBzaWduZWQgNjQgYml0cywKKyAqICAgICAgICAgICAgIHRoZSB0YWcgaXMgbm90IGNvbnRyb2xsYWJsZSBieSBhcHBsaWNhdGlvbiwgcGh5c2ljYWxJZCBpcyBub3Qgb25lIG9mIHRoZSBJZHMgdXNlZAorICogICAgICAgICAgICAgaW4gY3JlYXRpbmcgdGhlIHJlcXVlc3QsIG9yIGlmIHRoZSBjYXB0dXJlIHJlcXVlc3QgaXMgYSByZWd1bGFyIHJlcXVlc3Qgd2l0aCBubworICogICAgICAgICAgICAgcGh5c2ljYWwgSWRzIGF0IGFsbC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfaTY0KAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IGludDY0X3QqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBkb3VibGUgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZG91YmxlLCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCisgKiBzZXRzIHRoZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEgYmFja2luZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKiBJZiB7QGxpbmsgdGFnfSBpcyBub3QgY29udGFpbmVkIGluCisgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKKyAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgb25lIG9mIHRoZSBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgdGFncyBpbgorICogICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfS4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IG9yIHBoeXNpY2FsSWQgaXMgTlVMTCwgY291bnQgaXMKKyAqICAgICAgICAgICAgIGxhcmdlciB0aGFuIHplcm8gd2hpbGUgZGF0YSBpcyBOVUxMLCB0aGUgZGF0YSB0eXBlIG9mIHRoZSB0YWcgaXMgbm90IGRvdWJsZSwKKyAqICAgICAgICAgICAgIHRoZSB0YWcgaXMgbm90IGNvbnRyb2xsYWJsZSBieSBhcHBsaWNhdGlvbiwgcGh5c2ljYWxJZCBpcyBub3Qgb25lIG9mIHRoZSBJZHMgdXNlZAorICogICAgICAgICAgICAgaW4gY3JlYXRpbmcgdGhlIHJlcXVlc3QsIG9yIGlmIHRoZSBjYXB0dXJlIHJlcXVlc3QgaXMgYSByZWd1bGFyIHJlcXVlc3Qgd2l0aCBubworICogICAgICAgICAgICAgcGh5c2ljYWwgSWRzIGF0IGFsbC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfZG91YmxlKAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IGRvdWJsZSogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIHJhdGlvbmFsIGRhdGEgdHlwZSBmb3IKKyAqIGEgcGh5c2ljYWwgY2FtZXJhIG9mIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3JhdGlvbmFsLCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCisgKiBzZXRzIHRoZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEgYmFja2luZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKiBJZiB7QGxpbmsgdGFnfSBpcyBub3QgY29udGFpbmVkIGluCisgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKKyAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgb25lIG9mIHRoZSBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgdGFncyBpbgorICogICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfS4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IG9yIHBoeXNpY2FsSWQgaXMgTlVMTCwgY291bnQgaXMKKyAqICAgICAgICAgICAgIGxhcmdlciB0aGFuIHplcm8gd2hpbGUgZGF0YSBpcyBOVUxMLCB0aGUgZGF0YSB0eXBlIG9mIHRoZSB0YWcgaXMgbm90IHJhdGlvbmFsLAorICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLCBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkCisgKiAgICAgICAgICAgICBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vCisgKiAgICAgICAgICAgICBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9yYXRpb25hbCgKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCBBQ2FtZXJhTWV0YWRhdGFfcmF0aW9uYWwqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FQVFVSRV9SRVFVRVNUX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0IGIvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQKaW5kZXggYTI5ZTk2ZC4uOTQ2YTk4ZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQKKysrIGIvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQKQEAgLTIsMTMgKzIsMTYgQEAKICAgZ2xvYmFsOgogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9hYm9ydENhcHR1cmVzOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZTsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fZ2V0RGV2aWNlOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX3NldFJlcGVhdGluZ1JlcXVlc3Q7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYW1lcmFEZXZpY2VfY2xvc2U7CiAgICAgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdDsKKyAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkczsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbjsKICAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uV2l0aFNlc3Npb25QYXJhbWV0ZXJzOyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FtZXJhRGV2aWNlX2dldElkOwpAQCAtMjAsMTAgKzIzLDEzIEBACiAgICAgQUNhbWVyYU1hbmFnZXJfb3BlbkNhbWVyYTsKICAgICBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrOwogICAgIEFDYW1lcmFNYW5hZ2VyX3VucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjazsKKyAgICBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2s7ICMgaW50cm9kdWNlZD0yOQorICAgIEFDYW1lcmFNYW5hZ2VyX3VucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhTWV0YWRhdGFfY29weTsKICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZTsKICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0QWxsVGFnczsKICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeTsKKyAgICBBQ2FtZXJhTWV0YWRhdGFfaXNMb2dpY2FsTXVsdGlDYW1lcmE7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlOwogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZTsKICAgICBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0OwpAQCAtMzEsMTQgKzM3LDIxIEBACiAgICAgQUNhcHR1cmVSZXF1ZXN0X2ZyZWU7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2dldEFsbFRhZ3M7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnk7CisgICAgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnlfcGh5c2ljYWxDYW1lcmE7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9nZXRVc2VyQ29udGV4dDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3JlbW92ZVRhcmdldDsKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZG91YmxlOworICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9kb3VibGU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9mbG9hdDsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfZmxvYXQ7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pMzI7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2kzMjsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2k2NDsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfaTY0OyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcmF0aW9uYWw7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3JhdGlvbmFsOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfdTg7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3U4OyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0VXNlckNvbnRleHQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQ7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZTsKQEAgLTQ4LDYgKzYxLDcgQEAKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkOyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlOwogICBsb2NhbDoKICAgICAqOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFmOGMxCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7CisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KG5hdGl2ZV9oYW5kbGVfdCogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbENhbWVyYUlkID0gIiIpIDoKKyAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSwgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkge307CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobVdpbmRvdyA9PSBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93ICE9IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93IDwgb3RoZXIubVdpbmRvdzsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPiBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGFuZHJvaWQ6OmFjYW06OnV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG1XaW5kb3c7CisgICAgc3RkOjpzZXQ8YW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXI+IG1TaGFyZWRXaW5kb3dzOworICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKKyAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0ZDo6c3RyaW5nIG1QaHlzaWNhbENhbWVyYUlkOworfTsKKworCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOGEzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMCwwICsxLDE2MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFDYW1lcmFEZXZpY2VWZW5kb3IiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKworLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ29udGV4dEtleSAgICAgICAgPSAiQ29udGV4dCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtEZXZpY2VLZXkgICAgICAgICA9ICJEZXZpY2UiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRXJyb3JDb2RlS2V5ICAgICAgPSAiRXJyb3JDb2RlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhbGxiYWNrRnBLZXkgICAgID0gIkNhbGxiYWNrIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1Nlc3Npb25TcEtleSAgICAgID0gIlNlc3Npb25TcCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVxdWVzdEtleSA9ICJDYXB0dXJlUmVxdWVzdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtUaW1lU3RhbXBLZXkgICAgICA9ICJUaW1lU3RhbXAiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlc3VsdEtleSAgPSAiQ2FwdHVyZVJlc3VsdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXkgPSAiUGh5c2ljYWxDYXB0dXJlUmVzdWx0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVGYWlsdXJlS2V5ID0gIkNhcHR1cmVGYWlsdXJlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1NlcXVlbmNlSWRLZXkgICAgID0gIlNlcXVlbmNlSWQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRnJhbWVOdW1iZXJLZXkgICAgPSAiRnJhbWVOdW1iZXIiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQW53S2V5ICAgICAgICAgICAgPSAiQW53IjsKKworLyoqCisgKiBDYW1lcmFEZXZpY2UgSW1wbGVtZW50YXRpb24KKyAqLworQ2FtZXJhRGV2aWNlOjpDYW1lcmFEZXZpY2UoCisgICAgICAgIGNvbnN0IGNoYXIqIGlkLAorICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcikgOgorICAgICAgICBtQ2FtZXJhSWQoaWQpLAorICAgICAgICBtQXBwQ2FsbGJhY2tzKCpjYiksCisgICAgICAgIG1DaGFycyhzdGQ6Om1vdmUoY2hhcnMpKSwKKyAgICAgICAgbVNlcnZpY2VDYWxsYmFjayhuZXcgU2VydmljZUNhbGxiYWNrKHRoaXMpKSwKKyAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCisgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKKyAgICAgICAgbUVycm9yKEFDQU1FUkFfT0spLAorICAgICAgICBtSWRsZSh0cnVlKSwKKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uKG51bGxwdHIpIHsKKyAgICBtQ2xvc2luZyA9IGZhbHNlOworICAgIC8vIFNldHVwIGxvb3BlciB0aHJlYWQgdG8gcGVyZnJvbSBkZXZpY2UgY2FsbGJhY2tzIHRvIGFwcAorICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiQzJOLWRldi1sb29wZXIiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2JMb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgLypjYW5DYWxsSmF2YSovICAgICAgIHRydWUsCisgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IGNhbWVyYSBkZXZpY2UgY2FsbGJhY2sgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgIH0KKyAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKKyAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEgPSBtQ2hhcnMtPmdldEludGVybmFsRGF0YSgpOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICBpZiAoZW50cnkuY291bnQgIT0gMSkgeworICAgICAgICBBTE9HVygiJXM6IGJhZCBjb3VudCAlenUgZm9yIHBhcnRpYWwgcmVzdWx0IGNvdW50IiwgX19GVU5DVElPTl9fLCBlbnRyeS5jb3VudCk7CisgICAgICAgIG1QYXJ0aWFsUmVzdWx0Q291bnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIG1QYXJ0aWFsUmVzdWx0Q291bnQgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9CisKKyAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSk7CisgICAgaWYgKGVudHJ5LmNvdW50ICE9IDIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBiYWQgY291bnQgJXp1IGZvciBzaGFkaW5nIG1hcCBzaXplIiwgX19GVU5DVElPTl9fLCBlbnRyeS5jb3VudCk7CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVswXSA9IDA7CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVsxXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzBdID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVsxXSA9IGVudHJ5LmRhdGEuaTMyWzFdOworICAgIH0KK30KKworLy8gRGV2aWNlIGNsb3NlIGltcGxlbWVudGFpdG9uCitDYW1lcmFEZXZpY2U6On5DYW1lcmFEZXZpY2UoKSB7CisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gbUN1cnJlbnRTZXNzaW9uLnByb21vdGUoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgICAgIGlmICghaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgZGlzY29ubmVjdExvY2tlZChzZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworICAgICAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBtc2ctPnBvc3QoKTsKKyAgICBtc2cuY2xlYXIoKTsKKyAgICBzcDxBTWVzc2FnZT4gY2xlYW51cE1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENsZWFuVXBTZXNzaW9ucywgbUhhbmRsZXIpOworICAgIGNsZWFudXBNc2ctPnBvc3QoKTsKK30KKworLy8gVE9ETzogY2FjaGVkIGNyZWF0ZWQgcmVxdWVzdD8KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGEgcmF3UmVxdWVzdDsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KAorICAgICAgICB1dGlsczo6Y29udmVydFRvSGlkbCh0ZW1wbGF0ZUlkKSwKKyAgICAgICAgWyZzdGF0dXMsICZyYXdSZXF1ZXN0XShhdXRvIHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZtZXRhZGF0YSkgeworICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpOT19FUlJPUiAmJiB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKG1ldGFkYXRhLCAmcmF3UmVxdWVzdCkpIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZG4ndCBjcmVhdGUgZGVmYXVsdCByZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSBkZWZhdWx0IHJlcXVlc3QgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICB9CisgICAgQUNhcHR1cmVSZXF1ZXN0KiBvdXRSZXEgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CisgICAgb3V0UmVxLT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEocmF3UmVxdWVzdC5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIGlmIChwaHlzaWNhbENhbWVyYUlkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IHBoeXNpY2FsQ2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIG91dFJlcS0+cGh5c2ljYWxTZXR0aW5ncy5lbXBsYWNlKHBoeXNpY2FsQ2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoKihvdXRSZXEtPnNldHRpbmdzKSkpOworICAgICAgICB9CisgICAgfQorICAgIG91dFJlcS0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKKyAgICAqcmVxdWVzdCA9IG91dFJlcTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNyZWF0ZUNhcHR1cmVTZXNzaW9uKAorICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gY3VycmVudFNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChjdXJyZW50U2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIGN1cnJlbnRTZXNzaW9uLT5jbG9zZUJ5RGV2aWNlKCk7CisgICAgICAgIHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgbmV3IHNlc3Npb24KKyAgICByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWwgdG8gY3JlYXRlIG5ldyBzZXNzaW9uLiBjYW5ub3QgY29uZmlndXJlIHN0cmVhbXMiKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIG5ld1Nlc3Npb24gPSBuZXcgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKAorICAgICAgICAgICAgbU5leHRTZXNzaW9uSWQrKywgb3V0cHV0cywgY2FsbGJhY2tzLCB0aGlzKTsKKworICAgIC8vIHNldCBuZXcgc2Vzc2lvbiBhcyBjdXJyZW50IHNlc3Npb24KKyAgICBuZXdTZXNzaW9uLT5pbmNTdHJvbmcoKHZvaWQgKikgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbik7CisgICAgbUN1cnJlbnRTZXNzaW9uID0gbmV3U2Vzc2lvbjsKKyAgICBtRmx1c2hpbmcgPSBmYWxzZTsKKyAgICAqc2Vzc2lvbiA9IG5ld1Nlc3Npb247CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK3ZvaWQgQ2FtZXJhRGV2aWNlOjphZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShBQ2FwdHVyZVJlcXVlc3QgKmFDYXB0dXJlUmVxdWVzdCwKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXEpIHsKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YUNvcHkgPSBhQ2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqY2FtZXJhX21ldGFkYXRhID0gbWV0YWRhdGFDb3B5LmdldEFuZExvY2soKTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaENhbWVyYU1ldGFkYXRhOworICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKGNhbWVyYV9tZXRhZGF0YSwgJmhDYW1lcmFNZXRhZGF0YSk7CisgICAgbWV0YWRhdGFDb3B5LnVubG9jayhjYW1lcmFfbWV0YWRhdGEpOworICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucmVzaXplKDEpOworICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbMF0uc2V0dGluZ3MubWV0YWRhdGEoc3RkOjptb3ZlKGhDYW1lcmFNZXRhZGF0YSkpOworfQorCitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoIW91dHB1dC0+bUlzU2hhcmVkKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBvdXRwdXQgY29uZmlndXJhdGlvbiBpcyBub3Qgc2hhcmVkIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGludDMyX3Qgc3RyZWFtSWQgPSAtMTsKKyAgICBmb3IgKGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoa3ZQYWlyLnNlY29uZC5maXJzdCwgb3V0cHV0LT5tV2luZG93KSkgeworICAgICAgICAgICAgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RyZWFtSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogSW52YWxpZCBvdXRwdXQgY29uZmlndXJhdGlvbiIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciBvdXRDb25maWdXOworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gJm91dENvbmZpZyA9IG91dENvbmZpZ1cubU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgb3V0Q29uZmlnLnJvdGF0aW9uID0gdXRpbHM6OmNvbnZlcnRUb0hpZGwob3V0cHV0LT5tUm90YXRpb24pOworICAgIG91dENvbmZpZy53aW5kb3dHcm91cElkID0gLTE7IC8vIG5kayBkb2Vzbid0IHN1cHBvcnQgaW50ZXIgT3V0cHV0Q29uZmlndXJhdGlvbiBidWZmZXIgc2hhcmluZy4KKyAgICBvdXRDb25maWcud2luZG93SGFuZGxlcy5yZXNpemUob3V0cHV0LT5tU2hhcmVkV2luZG93cy5zaXplKCkgKyAxKTsKKyAgICBvdXRDb25maWcud2luZG93SGFuZGxlc1swXSA9IG91dHB1dC0+bVdpbmRvdzsKKyAgICBvdXRDb25maWcucGh5c2ljYWxDYW1lcmFJZCA9IG91dHB1dC0+bVBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgaW50IGkgPSAxOworICAgIGZvciAoYXV0byYgYW53IDogb3V0cHV0LT5tU2hhcmVkV2luZG93cykgeworICAgICAgICBvdXRDb25maWcud2luZG93SGFuZGxlc1tpKytdID0gYW53OworICAgIH0KKworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihzdHJlYW1JZCwgb3V0Q29uZmlnKTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiB1cGRhdGluZyBPdXRwdXRDb25maWd1cmF0aW9uOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgc3dpdGNoIChyZW1vdGVSZXQpIHsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpOT19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBpbnZhbGlkIG9wZXJhdGlvbiIsIGdldElkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIG91dHB1dCBzdXJmYWNlIGFscmVhZHkgZXhpc3RzIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBpbnZhbGlkIGlucHV0IGFyZ3VtZW50IiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byBhZGQgc2hhcmVkIG91dHB1dCIsIGdldElkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgbUNvbmZpZ3VyZWRPdXRwdXRzW3N0cmVhbUlkXSA9IHN0ZDo6bWFrZV9wYWlyKG91dHB1dC0+bVdpbmRvdywgb3V0Q29uZmlnVyk7CisKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmFsbG9jYXRlQ2FwdHVyZVJlcXVlc3RMb2NrZWQoCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgLypvdXQqL3NwPENhcHR1cmVSZXF1ZXN0PiAmb3V0UmVxKSB7CisgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcShuZXcgQ2FwdHVyZVJlcXVlc3QoKSk7CisgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUoMSArIHJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3Muc2l6ZSgpKTsKKworICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgYWxsb2NhdGVPbmVDYXB0dXJlUmVxdWVzdE1ldGFkYXRhKAorICAgICAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tpbmRleCsrXSwgbUNhbWVyYUlkLCByZXF1ZXN0LT5zZXR0aW5ncyk7CisKKyAgICBmb3IgKGF1dG8mIHBoeXNpY2FsRW50cnkgOiByZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzKSB7CisgICAgICAgIGFsbG9jYXRlT25lQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzW2luZGV4KytdLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsRW50cnkuZmlyc3QsIHBoeXNpY2FsRW50cnkuc2Vjb25kKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXF1ZXN0U3RyZWFtSWR4TGlzdDsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXF1ZXN0U3VyZmFjZUlkeExpc3Q7CisgICAgZm9yIChhdXRvIG91dHB1dFRhcmdldCA6IHJlcXVlc3QtPnRhcmdldHMtPm1PdXRwdXRzKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gb3V0cHV0VGFyZ2V0Lm1XaW5kb3c7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgcmVxLT5tU3VyZmFjZUxpc3QucHVzaF9iYWNrKGFudyk7CisgICAgICAgIC8vIGxvb2t1cCBzdHJlYW0vc3VyZmFjZSBJRAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICAgICAgaW50IHN0cmVhbUlkID0ga3ZQYWlyLmZpcnN0OworICAgICAgICAgICAgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXImIG91dENvbmZpZyA9IGt2UGFpci5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgY29uc3QgYXV0byYgd2luZG93SGFuZGxlcyA9IG91dENvbmZpZy5tT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzOworICAgICAgICAgICAgZm9yIChpbnQgc3VyZmFjZUlkID0gMDsgc3VyZmFjZUlkIDwgKGludCkgd2luZG93SGFuZGxlcy5zaXplKCk7IHN1cmZhY2VJZCsrKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdHdvIG5hdGl2ZSBoYW5kbGVzIGFyZSBlcXVpdmFsZW50LCBzbyBhcmUgdGhlaXIgc3VyZmFjZXMuCisgICAgICAgICAgICAgICAgaWYgKHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKHdpbmRvd0hhbmRsZXNbc3VyZmFjZUlkXS5nZXROYXRpdmVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFudykpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RyZWFtSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3VyZmFjZUlkeExpc3QucHVzaF9iYWNrKHN1cmZhY2VJZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmNvbmZpZ3VyZWQgb3V0cHV0IHRhcmdldCAlcCBpbiBjYXB0dXJlIHJlcXVlc3QhIiwgYW53KTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgfQorICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkcy5yZXNpemUocmVxdWVzdFN0cmVhbUlkeExpc3Quc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RTdHJlYW1JZHhMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkc1tpXS5zdHJlYW1JZCA9IHJlcXVlc3RTdHJlYW1JZHhMaXN0W2ldOworICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHNbaV0ud2luZG93SWQgPSByZXF1ZXN0U3VyZmFjZUlkeExpc3RbaV07CisgICAgfQorICAgIG91dFJlcSA9IHJlcTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwordm9pZCBDYW1lcmFEZXZpY2U6OmFsbG9jYXRlT25lQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YSgKKyAgICAgICAgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyYgY2FtZXJhU2V0dGluZ3MsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3A8QUNhbWVyYU1ldGFkYXRhPiYgbWV0YWRhdGEpIHsKKyAgICBjYW1lcmFTZXR0aW5ncy5pZCA9IGlkOworICAgIC8vIFRPRE86IERvIHdlIHJlYWxseSBuZWVkIHRvIGNvcHkgdGhlIG1ldGFkYXRhIGhlcmUgPworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhQ29weSA9IG1ldGFkYXRhLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqY2FtZXJhTWV0YWRhdGEgPSBtZXRhZGF0YUNvcHkuZ2V0QW5kTG9jaygpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoQ2FtZXJhTWV0YWRhdGE7CisgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwoY2FtZXJhTWV0YWRhdGEsICZoQ2FtZXJhTWV0YWRhdGEpOworICAgIG1ldGFkYXRhQ29weS51bmxvY2soY2FtZXJhTWV0YWRhdGEpOworICAgIGlmIChtZXRhZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChoQ2FtZXJhTWV0YWRhdGEuZGF0YSgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KGhDYW1lcmFNZXRhZGF0YS5kYXRhKCkpLAorICAgICAgICAgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5zaXplKCkpKSB7CisgICAgICAgICAgICAvLyBUaGUgbWV0YWRhdGEgZmllbGQgb2YgdGhlIHVuaW9uIHdvdWxkJ3ZlIGJlZW4gZGVzdHJ1Y3R1ZWQsIHNvIG5vIG5lZWQKKyAgICAgICAgICAgIC8vIHRvIHJlLXNpemUgaXQuCisgICAgICAgICAgICBjYW1lcmFTZXR0aW5ncy5zZXR0aW5ncy5mbXFNZXRhZGF0YVNpemUoaENhbWVyYU1ldGFkYXRhLnNpemUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRm1xIHdyaXRlIGNhcHR1cmUgcmVzdWx0IGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGh3YmluZGVyIik7CisgICAgICAgICAgICBjYW1lcmFTZXR0aW5ncy5zZXR0aW5ncy5tZXRhZGF0YShzdGQ6Om1vdmUoaENhbWVyYU1ldGFkYXRhKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworQUNhcHR1cmVSZXF1ZXN0KgorQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSwgY29uc3QgY2hhciogZGV2aWNlSWQpIHsKKyAgICBBQ2FwdHVyZVJlcXVlc3QqIHBSZXF1ZXN0ID0gbmV3IEFDYXB0dXJlUmVxdWVzdCgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQgPSByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzW2ldLmlkOworICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZTsKKyAgICAgICAgdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChyZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzW2ldLnNldHRpbmdzLm1ldGFkYXRhKCksICZjbG9uZSk7CisgICAgICAgIGlmIChpZCA9PSBkZXZpY2VJZCkgeworICAgICAgICAgICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3NbcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tpXS5pZF0gPQorICAgICAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcFJlcXVlc3QtPnRhcmdldHMgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcS0+bVN1cmZhY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gcmVxLT5tU3VyZmFjZUxpc3RbaV07CisgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQgb3V0cHV0VGFyZ2V0KGFudyk7CisgICAgICAgIHBSZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cy5pbnNlcnQob3V0cHV0VGFyZ2V0KTsKKyAgICB9CisgICAgcmV0dXJuIHBSZXF1ZXN0OworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OmZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0KiByZXEpIHsKKyAgICBpZiAocmVxID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXEtPnNldHRpbmdzLmNsZWFyKCk7CisgICAgZGVsZXRlIHJlcS0+dGFyZ2V0czsKKyAgICBkZWxldGUgcmVxOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6Om5vdGlmeVNlc3Npb25FbmRPZkxpZmVMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uKSB7CisgICAgaWYgKGlzQ2xvc2VkKCkpIHsKKyAgICAgICAgLy8gRGV2aWNlIGlzIGNsb3NpbmcgYWxyZWFkeS4gZG8gbm90aGluZworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DdXJyZW50U2Vzc2lvbiAhPSBzZXNzaW9uKSB7CisgICAgICAgIC8vIFNlc3Npb24gaGFzIGJlZW4gcmVwbGFjZWQgYnkgb3RoZXIgc2Vlc2lvbiBvciBkZXZpY2UgaXMgY2xvc2VkCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKworICAgIC8vIFNob3VsZCBub3QgaGFwcGVuCisgICAgaWYgKCFzZXNzaW9uLT5tSXNDbG9zZWQpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiB1bmNsb3NlZCBzZXNzaW9uICVwIHJlYWNoZXMgZW5kIG9mIGxpZmUhIiwgc2Vzc2lvbik7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBObyBuZXcgc2Vzc2lvbiwgdW5jb25maWd1cmUgbm93CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQobnVsbHB0ciwgbnVsbHB0cik7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJVbmNvbmZpZ3VyZSBzdHJlYW0gZmFpbGVkLiBEZXZpY2UgbWlnaHQgc3RpbGwgYmUgY29uZmlndXJlZCEgcmV0ICVkIiwgcmV0KTsKKyAgICB9Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6ZGlzY29ubmVjdExvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+JiBzZXNzaW9uKSB7CisgICAgaWYgKG1DbG9zaW5nLmV4Y2hhbmdlKHRydWUpKSB7CisgICAgICAgIC8vIEFscmVhZHkgY2xvc2luZywganVzdCByZXR1cm4KKyAgICAgICAgQUxPR1coIkNhbWVyYSBkZXZpY2UgJXMgaXMgYWxyZWFkeSBjbG9zaW5nLiIsIGdldElkKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1SZW1vdGUgIT0gbnVsbHB0cikgeworICAgICAgICBhdXRvIHJldCA9IG1SZW1vdGUtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHdoaWxlIGRpc2Nvbm5lY3RpbmcgZGV2aWNlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVJlbW90ZSA9IG51bGxwdHI7CisKKyAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIHNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICB9Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzdG9wUmVwZWF0aW5nTG9ja2VkKCkgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgaW50IHJlcGVhdGluZ1NlcXVlbmNlSWQgPSBtUmVwZWF0aW5nU2VxdWVuY2VJZDsKKyAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisKKyAgICAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXI7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgICAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPmNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZsYXN0RnJhbWVOdW1iZXJdKFN0YXR1cyBzLCBhdXRvIGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgIGxhc3RGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNhbmNlbCBhY3RpdmUgcmVwZWF0aW5nIHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQocmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpmbHVzaExvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgYWJvcnQgY2FwdHVyZXMgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24gd2lsbCBjbG9zZQorICAgIC8vIHByZXZpb3VzIG9uZSBhbmQgdGh1cyByZWplY3QgYW55IEFQSSBjYWxsIGZyb20gcHJldmlvdXMgc2Vzc2lvbi4KKyAgICAvLyBCdXQgc3RpbGwgZ29vZCB0byBjaGVjayBoZXJlIGluIGNhc2Ugc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuLgorICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gc2Vzc2lvbikgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHNlc3Npb24gJXAgaXMgbm90IGN1cnJlbnQgYWN0aXZlIHNlc3Npb24hIiwgZ2V0SWQoKSwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtRmx1c2hpbmcpIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSAlcyBpcyBhbHJlYWR5IGFib3J0aW5nIGNhcHR1cmVzIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOworICAgIH0KKworICAgIG1GbHVzaGluZyA9IHRydWU7CisKKyAgICAvLyBTZW5kIG9uQWN0aXZlIGNhbGxiYWNrIHRvIGd1YXJhbnRlZSB0aGVyZSBpcyBhbHdheXMgYWN0aXZlLT5yZWFkeSB0cmFuc2l0aW9uCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOworICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworCisgICAgLy8gSWYgZGV2aWNlIGlzIGFscmVhZHkgaWRsaW5nLCBzZW5kIGNhbGxiYWNrIGFuZCBleGl0IGVhcmx5CisgICAgaWYgKG1JZGxlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgbUZsdXNoaW5nID0gZmFsc2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOworICAgIH0KKworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyOworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5mbHVzaChbJnN0YXR1cywgJmxhc3RGcmFtZU51bWJlcl0oYXV0byBzLCBhdXRvIGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IEFib3J0IGNhcHR1cmVzIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CisgICAgfQorICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgY2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKG1SZXBlYXRpbmdTZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OndhaXRVbnRpbElkbGVMb2NrZWQoKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiV2FpdCB1bnRpbCBjYW1lcmEgJXMgaWRsZSBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyB3b24ndCBnbyB0byBpZGxlIHdoZW4gdGhlcmUgaXMgcmVwZWF0aW5nIHJlcXVlc3QhIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+d2FpdFVudGlsSWRsZSgpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIHdhaXRVbnRpbElkbGUgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zTG9ja2VkKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogb3V0cHV0cywKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycykgeworICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciBlbXB0eU91dHB1dDsKKyAgICBpZiAob3V0cHV0cyA9PSBudWxscHRyKSB7CisgICAgICAgIG91dHB1dHMgPSAmZW1wdHlPdXRwdXQ7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN0ZDo6c2V0PHN0ZDo6cGFpcjxuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyLCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcj4+IG91dHB1dFNldDsKKyAgICBmb3IgKGF1dG8gb3V0Q29uZmlnIDogb3V0cHV0cy0+bU91dHB1dHMpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSBvdXRDb25maWcubVdpbmRvdzsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIgb3V0Q29uZmlnSW5zZXJ0VzsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0Q29uZmlnSW5zZXJ0ID0gb3V0Q29uZmlnSW5zZXJ0Vy5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LnJvdGF0aW9uID0gdXRpbHM6OmNvbnZlcnRUb0hpZGwob3V0Q29uZmlnLm1Sb3RhdGlvbik7CisgICAgICAgIG91dENvbmZpZ0luc2VydC53aW5kb3dHcm91cElkID0gLTE7CisgICAgICAgIG91dENvbmZpZ0luc2VydC53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRDb25maWcubVNoYXJlZFdpbmRvd3Muc2l6ZSgpICsgMSk7CisgICAgICAgIG91dENvbmZpZ0luc2VydC53aW5kb3dIYW5kbGVzWzBdID0gYW53OworICAgICAgICBvdXRDb25maWdJbnNlcnQucGh5c2ljYWxDYW1lcmFJZCA9IG91dENvbmZpZy5tUGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciB3cmFwKGFudyk7CisgICAgICAgIG91dHB1dFNldC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYW53LCBvdXRDb25maWdJbnNlcnRXKSk7CisgICAgfQorICAgIHN0ZDo6c2V0PHN0ZDo6cGFpcjxuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyLCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcj4+IGFkZFNldCA9IG91dHB1dFNldDsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBkZWxldGVMaXN0OworCisgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHN0cmVhbXMgbmVlZCB0byBiZSBjcmVhdGVkLCB3aGljaCB0byBiZSBkZWxldGVkCisgICAgZm9yIChhdXRvJiBrdlBhaXIgOiBtQ29uZmlndXJlZE91dHB1dHMpIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgYXV0byYgb3V0cHV0UGFpciA9IGt2UGFpci5zZWNvbmQ7CisgICAgICAgIGlmIChvdXRwdXRTZXQuY291bnQob3V0cHV0UGFpcikpIHsKKyAgICAgICAgICAgIGRlbGV0ZUxpc3QucHVzaF9iYWNrKHN0cmVhbUlkKTsgLy8gTmVlZCB0byBkZWxldGUgYSBubyBsb25nZXIgbmVlZGVkIHN0cmVhbQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkU2V0LmVyYXNlKG91dHB1dFBhaXIpOyAgICAgICAgLy8gTm8gbmVlZCB0byBhZGQgYWxyZWFkeSBleGlzdGluZyBzdHJlYW0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgc3RvcCByZXBlYXRpbmcgZmFpbGVkLCByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHdhaXRVbnRpbElkbGVMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgd2FpdCB1bnRpbCBpZGxlIGZhaWxlZCwgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBTZW5kIG9uUmVhZHkgdG8gcHJldmlvdXMgc2Vzc2lvbgorICAgIC8vIEN1cnJlbnRTZXNzaW9uIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBjb25maWd1cmVTdHJlYW1Mb2NrZWQsIHNvIGhlcmUKKyAgICAvLyBtQ3VycmVudFNlc3Npb24gaXMgdGhlIHNlc3Npb24gdG8gYmUgcmVwbGFjZWQgYnkgYSBuZXcgc2Vzc2lvbgorICAgIGlmICghbUlkbGUgJiYgbUN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1CdXN5U2Vzc2lvbiAhPSBtQ3VycmVudFNlc3Npb24pIHsKKyAgICAgICAgICAgIEFMT0dFKCJDdXJyZW50IHNlc3Npb24gIT0gYnVzeSBzZXNzaW9uIik7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgfQorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBtQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBtQnVzeVNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgbUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vblJlYWR5KTsKKyAgICAgICAgbUJ1c3lTZXNzaW9uLmNsZWFyKCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBtSWRsZSA9IHRydWU7CisKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPmJlZ2luQ29uZmlndXJlKCk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpfHwgcmVtb3RlUmV0ICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgYmVnaW4gY29uZmlndXJlIGZhaWxlZCIsIGdldElkKCkpOworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChyZW1vdGVSZXQpOworICAgIH0KKworICAgIC8vIGRlbGV0ZSB0by1iZS1kZWxldGVkIHN0cmVhbXMKKyAgICBmb3IgKGF1dG8gc3RyZWFtSWQgOiBkZWxldGVMaXN0KSB7CisgICAgICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7CisgICAgICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCByZW1vdGVSZXQgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIHJlbW92ZSBzdHJlYW0gJWQiLCBnZXRJZCgpLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChyZW1vdGVSZXQpOworICAgICAgICB9CisgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5lcmFzZShzdHJlYW1JZCk7CisgICAgfQorCisgICAgLy8gYWRkIG5ldyBzdHJlYW1zCisgICAgZm9yIChhdXRvIG91dHB1dFBhaXIgOiBhZGRTZXQpIHsKKyAgICAgICAgaW50IHN0cmVhbUlkOworICAgICAgICBTdGF0dXMgc3RhdHVzOworICAgICAgICBhdXRvIHJldCA9IG1SZW1vdGUtPmNyZWF0ZVN0cmVhbShvdXRwdXRQYWlyLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzdHJlYW1JZF0oU3RhdHVzIHMsIGF1dG8gc3RyZWFtX2lkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQgPSBzdHJlYW1faWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byBjcmVhdGUgc3RyZWFtIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3RyZWFtSWQsIG91dHB1dFBhaXIpKTsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBwYXJhbXM7CisgICAgSENhbWVyYU1ldGFkYXRhIGhpZGxQYXJhbXM7CisgICAgaWYgKChzZXNzaW9uUGFyYW1ldGVycyAhPSBudWxscHRyKSAmJiAoc2Vzc2lvblBhcmFtZXRlcnMtPnNldHRpbmdzICE9IG51bGxwdHIpKSB7CisgICAgICAgIHBhcmFtcy5hcHBlbmQoc2Vzc2lvblBhcmFtZXRlcnMtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKSk7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpwYXJhbXNfbWV0YWRhdGEgPSBwYXJhbXMuZ2V0QW5kTG9jaygpOworICAgICAgICB1dGlsczo6Y29udmVydFRvSGlkbChwYXJhbXNfbWV0YWRhdGEsICZoaWRsUGFyYW1zKTsKKyAgICAgICAgcGFyYW1zLnVubG9jayhwYXJhbXNfbWV0YWRhdGEpOworICAgIH0KKyAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5lbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFLCBoaWRsUGFyYW1zKTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yOiBlbmRDb25maWd1cmUgZmFpbGVkICVzIiwgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpzZXRSZW1vdGVEZXZpY2Uoc3A8SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgbVJlbW90ZSA9IHJlbW90ZTsKK30KKworYm9vbAorQ2FtZXJhRGV2aWNlOjpzZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpIHsKKyAgICAgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgIEFMT0dFKCJtUmVtb3RlIG11c3Qgbm90IGJlIG51bGwgd2hpbGUgdHJ5aW5nIHRvIGZldGNoIG1ldGFkYXRhIHF1ZXVlcyIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+ICZyZXFRdWV1ZSA9IG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWU7CisgICAgICAgIGF1dG8gcmV0ID0KKyAgICAgICAgICAgIG1SZW1vdGUtPmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgICAgICAgICBbJnJlcVF1ZXVlXShjb25zdCBhdXRvICZtcURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxUXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPihtcURlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcVF1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVxUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFbXB0eSBmbXEgZnJvbSBjYW1lcmFzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcVF1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gZ2V0IGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSBxdWV1ZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmcmVzUXVldWUgPSBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgICAgIHJldCA9CisgICAgICAgICAgICAgICAgbVJlbW90ZS0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoCisgICAgICAgICAgICAgICAgICAgICAgICBbJnJlc1F1ZXVlXShjb25zdCBhdXRvICZtcURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVzdWx0TWV0YWRhdGFRdWV1ZT4obXFEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVtcHR5IGZtcSBmcm9tIGNhbWVyYXNlcnZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gZ2V0IGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKSBjb25zdCB7CisgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBkZXZpY2UgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBpZiAobUluRXJyb3IpIHsvLyB0cmlnZ2VyZWQgYnkgb25EZXZpY2VFcnJvcgorICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBkZXZpY2UgaGFzIGVuY291bnRlcmVkIGEgc2VyaW91cyBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBtRXJyb3I7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKGNhbWVyYV9zdGF0dXNfdCBlcnJvcikgeworICAgIG1JbkVycm9yID0gdHJ1ZTsKKyAgICBtRXJyb3IgPSBlcnJvcjsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6RnJhbWVOdW1iZXJUcmFja2VyOjp1cGRhdGVUcmFja2VyKGludDY0X3QgZnJhbWVOdW1iZXIsIGJvb2wgaXNFcnJvcikgeworICAgIEFMT0dWKCJ1cGRhdGVUcmFja2VyIGZyYW1lICUiIFBSSWQ2NCAiIGlzRXJyb3IgJWQiLCBmcmFtZU51bWJlciwgaXNFcnJvcik7CisgICAgaWYgKGlzRXJyb3IpIHsKKyAgICAgICAgbUZ1dHVyZUVycm9yU2V0Lmluc2VydChmcmFtZU51bWJlcik7CisgICAgfSBlbHNlIGlmIChmcmFtZU51bWJlciA8PSBtQ29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgQUxPR0UoIkZyYW1lIG51bWJlciAlIiBQUklkNjQgIiBkZWNyZWFzZWQhIGN1cnJlbnQgZm4gJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBtQ29tcGxldGVkRnJhbWVOdW1iZXIpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyYW1lTnVtYmVyICE9IG1Db21wbGV0ZWRGcmFtZU51bWJlciArIDEpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGcmFtZSBudW1iZXIgb3V0IG9mIG9yZGVyLiBFeHBlY3QgJSIgUFJJZDY0ICIgYnV0IGdldCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRGcmFtZU51bWJlciArIDEsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIC8vIERvIG5vdCBhc3NlcnQgYXMgaW4gamF2YSBpbXBsZW1lbnRhdGlvbgorICAgICAgICB9CisgICAgICAgIG1Db21wbGV0ZWRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgIH0KKyAgICB1cGRhdGUoKTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpGcmFtZU51bWJlclRyYWNrZXI6OnVwZGF0ZSgpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtRnV0dXJlRXJyb3JTZXQuYmVnaW4oKTsgaXQgIT0gbUZ1dHVyZUVycm9yU2V0LmVuZCgpOykgeworICAgICAgICBpbnQ2NF90IGVycm9yRnJhbWVOdW1iZXIgPSAqaXQ7CisgICAgICAgIGlmIChlcnJvckZyYW1lTnVtYmVyID09IG1Db21wbGV0ZWRGcmFtZU51bWJlciArIDEpIHsKKyAgICAgICAgICAgIG1Db21wbGV0ZWRGcmFtZU51bWJlcisrOworICAgICAgICAgICAgaXQgPSBtRnV0dXJlRXJyb3JTZXQuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgaWYgKGVycm9yRnJhbWVOdW1iZXIgPD0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgZGVhbCB3aXRoIGl0IGFueXdheQorICAgICAgICAgICAgQUxPR0UoIkNvbXBsZXRkIGZyYW1lIG51bWJlciBwYXNzZWQgdGhyb3VnaCBjdXJyZW50IGZyYW1lIG51bWJlciEiKTsKKyAgICAgICAgICAgIC8vIGVyYXNlIHRoZSBvbGQgZXJyb3Igc2luY2UgaXQncyBubyBsb25nZXIgdXNlZnVsCisgICAgICAgICAgICBpdCA9IG1GdXR1cmVFcnJvclNldC5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBOb3JtYWwgcmVxdWVzdHMgaGFzbid0IGNhdGNoZWQgdXAgZXJyb3IgZnJhbWVzLCBqdXN0IGJyZWFrCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiVXBkYXRlIGNvbXBsZXRlIGZyYW1lICUiIFBSSWQ2NCwgbUNvbXBsZXRlZEZyYW1lTnVtYmVyKTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpvbkNhcHR1cmVFcnJvckxvY2tlZCgKKyAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgaW50IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgaW50MzJfdCBidXJzdElkID0gcmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgYXV0byBpdCA9IG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ID09IG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGNhcHR1cmUgc2VxdWVuY2UgaW5kZXggJWQgbm90IGZvdW5kISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOworICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVyc3RJZCwgY2JoLm1SZXF1ZXN0cy5zaXplKCkpOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CisKKyAgICAvLyBIYW5kbGUgYnVmZmVyIGVycm9yCisgICAgaWYgKGVycm9yQ29kZSA9PSBFcnJvckNvZGU6OkNBTUVSQV9CVUZGRVIpIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3Qgb25CdWZmZXJMb3N0ID0KKyAgICAgICAgICAgICAgICBjYmgubU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgICAgIGF1dG8gb3V0cHV0UGFpckl0ID0gbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQoc3RyZWFtSWQpOworICAgICAgICBpZiAob3V0cHV0UGFpckl0ID09IG1Db25maWd1cmVkT3V0cHV0cy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGF1dG8mIHdpbmRvd0hhbmRsZXMgPSBvdXRwdXRQYWlySXQtPnNlY29uZC5zZWNvbmQubU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRIYW5kbGUgOiB3aW5kb3dIYW5kbGVzKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtQW5kV2luZG93SWQgOiByZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB3aW5kb3dJZCA9IHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOworICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXSxvdXRIYW5kbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHdpbmRvd0hhbmRsZXNbd2luZG93SWRdLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlcyBMb3N0IG91dHB1dCBidWZmZXIgZm9yIEFOVyAlcCBmcmFtZSAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgYW53LCBmcmFtZU51bWJlcik7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVCdWZmZXJMb3N0LCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkJ1ZmZlckxvc3QpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0Fud0tleSwgKHZvaWQqKSBhbncpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBIYW5kbGUgb3RoZXIgY2FwdHVyZSBmYWlsdXJlcworICAgICAgICAvLyBGaXJlIGNhcHR1cmUgZmFpbHVyZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUgcmVnaXN0ZXJlZAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBvbkVycm9yID0gY2JoLm1PbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgIHNwPENhbWVyYUNhcHR1cmVGYWlsdXJlPiBmYWlsdXJlKG5ldyBDYW1lcmFDYXB0dXJlRmFpbHVyZSgpKTsKKyAgICAgICAgZmFpbHVyZS0+ZnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgLy8gVE9ETzogcmVmaW5lIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcgZmx1c2gKKyAgICAgICAgZmFpbHVyZS0+cmVhc29uICAgICAgPSBDQVBUVVJFX0ZBSUxVUkVfUkVBU09OX0VSUk9SOworICAgICAgICBmYWlsdXJlLT5zZXF1ZW5jZUlkICA9IHNlcXVlbmNlSWQ7CisgICAgICAgIGZhaWx1cmUtPndhc0ltYWdlQ2FwdHVyZWQgPSAoZXJyb3JDb2RlID09IEVycm9yQ29kZTo6Q0FNRVJBX1JFU1VMVCk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVGYWlsLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCBmYWlsdXJlKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisKKyAgICAgICAgLy8gVXBkYXRlIHRyYWNrZXIKKyAgICAgICAgbUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL3RydWUpOworICAgICAgICBjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T25EaXNjb25uZWN0ZWQ6CisgICAgICAgIGNhc2Uga1doYXRPbkVycm9yOgorICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgICAgIEFMT0dWKCIlczogUmVjZWl2ZWQgbXNnICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrV2hhdENsZWFuVXBTZXNzaW9uczoKKyAgICAgICAgICAgIG1DYWNoZWRTZXNzaW9ucy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOkVycm9yOiB1bmtub3duIGRldmljZSBjYWxsYmFjayAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBDaGVjayB0aGUgY29tbW9uIHBhcnQgb2YgYWxsIG1lc3NhZ2UKKyAgICB2b2lkKiBjb250ZXh0OworICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbGxiYWNrIGNvbnRleHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRPbkRpc2Nvbm5lY3RlZDoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYURldmljZSogZGV2OworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKiopICZkZXYpOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBkZXYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZGV2aWNlIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2sgb25EaXNjb25uZWN0ZWQ7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkRpc2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBvbkRpc2Nvbm5lY3RlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbkRpc2Nvbm5lY3RlZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpvbkRpc2Nvbm5lY3RlZCkoY29udGV4dCwgZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRPbkVycm9yOgorICAgICAgICB7CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiBkZXY7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKikgJmRldik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IGRldiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBkZXZpY2UgcG9pbnRlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfRXJyb3JTdGF0ZUNhbGxiYWNrIG9uRXJyb3I7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkVycm9yKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIG9uRXJyb3IhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgZXJyb3JDb2RlOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQzMihrRXJyb3JDb2RlS2V5LCAmZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGVycm9yIGNvZGUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob25FcnJvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpvbkVycm9yKShjb250ZXh0LCBkZXYsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa1Nlc3Npb25TcEtleSwgJm9iaik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IG9iaiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXNzaW9uIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24oc3RhdGljX2Nhc3Q8QUNhbWVyYUNhcHR1cmVTZXNzaW9uKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UgPSBzZXNzaW9uLT5nZXREZXZpY2UoKTsKKyAgICAgICAgICAgIG1DYWNoZWRTZXNzaW9ucy5wdXNoKHNlc3Npb24pOworICAgICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RTcCA9IG51bGxwdHI7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlcXVlc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3AgPSBzdGF0aWNfY2FzdDxDYXB0dXJlUmVxdWVzdCo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2sgb25TdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc3RhdGUgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25TdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKCpvblN0YXRlKShjb250ZXh0LCBzZXNzaW9uLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG9uU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU3RhcnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgc3RhcnQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25TdGFydCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa1RpbWVTdGFtcEtleSwgJnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgdGltZXN0YW1wISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBkZXZpY2UtPmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAoKm9uU3RhcnQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25SZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgcmVzdWx0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQoc3RhdGljX2Nhc3Q8QUNhbWVyYU1ldGFkYXRhKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgZGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+JiBwaHlzaWNhbFJlc3VsdEluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0LT5tUGh5c2ljYWxSZXN1bHRJbmZvOworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8QUNhbWVyYU1ldGFkYXRhPj4gcGh5c2ljYWxNZXRhZGF0YUNvcHk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5wdXNoX2JhY2socGh5c2ljYWxSZXN1bHRJbmZvW2ldLnBoeXNpY2FsQ2FtZXJhSWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5waHlzaWNhbE1ldGFkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUudXBkYXRlKEFORFJPSURfU1lOQ19GUkFNRV9OVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbFJlc3VsdC0+bUZyYW1lTnVtYmVyLCAvKmRhdGFfY291bnQqLzEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBtZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YUNvcHkucHVzaF9iYWNrKG1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBkZXZpY2UtPmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAoKm9uUmVzdWx0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCByZXN1bHQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKSwgcGh5c2ljYWxDYW1lcmFJZFB0cnMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBvbkZhaWw7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uRmFpbCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBmYWlsIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uRmFpbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZUZhaWx1cmVLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbHVyZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPENhbWVyYUNhcHR1cmVGYWlsdXJlPiBmYWlsdXJlU3AoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhQ2FwdHVyZUZhaWx1cmUqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVGYWlsdXJlKiBmYWlsdXJlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUqPihmYWlsdXJlU3AuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIGRldmljZS0+Z2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICgqb25GYWlsKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCBmYWlsdXJlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBvblNlcUVuZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TZXFFbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNlcXVlbmNlIGVuZCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblNlcUVuZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IHNlcUlkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDMyKGtTZXF1ZW5jZUlkS2V5LCAmc2VxSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa0ZyYW1lTnVtYmVyS2V5LCAmZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TZXFFbmQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHNlcUlkLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG9uU2VxQWJvcnQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU2VxQWJvcnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNlcXVlbmNlIGVuZCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblNlcUFib3J0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50MzIoa1NlcXVlbmNlSWRLZXksICZzZXFJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKCpvblNlcUFib3J0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCBzZXFJZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3Qgb25CdWZmZXJMb3N0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkJ1ZmZlckxvc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGJ1ZmZlciBsb3N0IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uQnVmZmVyTG9zdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudzsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtBbndLZXksICh2b2lkKiopICZhbncpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIG5hdGl2ZV9oYW5kbGVfdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrRnJhbWVOdW1iZXJLZXksICZmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIGRldmljZS0+Z2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICgqb25CdWZmZXJMb3N0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCBhbncsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayhmYWxzZSkgeworICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGNicyk7CisKKyAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlQ29tcGxldGVkOworICAgIH0KK30KKworQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhsY2JzKTsKKworICAgIGlmIChsY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBsY2JzLT5vbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoCisgICAgY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQUxPR1YoIlJlcGVhdGluZyBzZXFJZCAlZCBsYXN0RnJhbWVOdW1lciAlIiBQUklkNjQsIHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciA9PSBOT19GUkFNRVNfQ0FQVFVSRUQpIHsKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSBjYWxsYmFjayBob2xkZXIgZnJvbSBjYWxsYmFjayBtYXAKKyAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gY2JJdC0+c2Vjb25kOworICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKKyAgICAgICAgLy8gc2VuZCBzZXEgYWJvcnRlZCBjYWxsYmFjaworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUFib3J0LCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAgdG8gdHJhY2sKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKworICAgICAgICAvLyBMYXN0IGZyYW1lIG1pZ2h0IGhhdmUgYXJyaXZlZC4gQ2hlY2sgbm93CisgICAgICAgIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6Y2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpIHsKKyAgICBpbnQ2NF90IGNvbXBsZXRlZEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyVHJhY2tlci5nZXRDb21wbGV0ZWRGcmFtZU51bWJlcigpOworICAgIGF1dG8gaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmVuZCgpKSB7CisgICAgICAgIGludCBzZXF1ZW5jZUlkID0gaXQtPmZpcnN0OworICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGJvb2wgc2VxQ29tcGxldGVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzQ2FsbGJhY2sgID0gdHJ1ZTsKKworICAgICAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhICVzIGNsb3NlZCB3aGlsZSBjaGVja2luZyBzZXF1ZW5jZSBjb21wbGV0ZSIsIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgY2FsbGJhY2sgZm9yIHRoaXMgc2VxdWVuY2UKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlIHdlIGFsd2F5cyByZWdpc3RlciBjYWxsYmFjayAod2l0aCBudWxscHRyIGluc2lkZSkKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgaGFzQ2FsbGJhY2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgPD0gY29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJzZXEgJWQgcmVhY2hlZCBsYXN0IGZyYW1lICUiIFBSSWQ2NCAiLCBjb21wbGV0ZWQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyLCBjb21wbGV0ZWRGcmFtZU51bWJlcik7CisgICAgICAgICAgICBzZXFDb21wbGV0ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcUNvbXBsZXRlZCAmJiBoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGNhbGxiYWNrIGhvbGRlciBmcm9tIGNhbGxiYWNrIG1hcAorICAgICAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9IGNiSXQtPnNlY29uZDsKKyAgICAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOworICAgICAgICAgICAgLy8gc2VuZCBzZXEgY29tcGxldGUgY2FsbGJhY2sKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxRW5kLCBtSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb24gc3AgYmVmb3JlIHdlIHNlbmQgb3V0IHRoZSBtZXNzYWdlCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ3VhcmFudGVlIHRoZSByYXJlIGNhc2Ugd2hlcmUgdGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkCisgICAgICAgICAgICAvLyBiZWZvcmUgY2JoIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBjYXVzaW5nIHdlIGNhbGwgdGhlIHNlc3Npb24KKyAgICAgICAgICAgIC8vIGRlc3RydWN0b3Igd2hpbGUgaG9sZGluZyBkZXZpY2UgbG9jaworICAgICAgICAgICAgY2JoLm1TZXNzaW9uLmNsZWFyKCk7CisgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gdHJhY2sgc2VxdWVuY2UgY29tcGxldGUgaWYgdGhlcmUgaXMgbm8gY2FsbGJhY2sgcmVnaXN0ZXJlZAorICAgICAgICBpZiAoc2VxQ29tcGxldGVkIHx8ICFoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgICogQ2FtZXJhIHNlcnZpY2UgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgKi8KK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkRldmljZUVycm9yKAorICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBBTE9HRCgiRGV2aWNlIGVycm9yIHJlY2VpdmVkLCBjb2RlICVkLCBmcmFtZSBudW1iZXIgJSIgUFJJZDY0ICIsIHJlcXVlc3QgSUQgJWQsIHN1YnNlcSBJRCAlZCIsCisgICAgICAgICAgICBlcnJvckNvZGUsIHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgcmVzdWx0RXh0cmFzLmJ1cnN0SWQpOworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBkZXYtPm1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfRElTQ09OTkVDVEVEOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBDYW1lcmEgaXMgZGlzY29ubmVjdGVkLCBjbG9zZSB0aGUgc2Vzc2lvbiBhbmQgZXhwZWN0IG5vIG1vcmUgY2FsbGJhY2tzCisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2LT5tQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9uRGlzY29ubmVjdGVkLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUFwcENhbGxiYWNrcy5vbkRpc2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBlcnJvciBmcm9tIGNhbWVyYSBkZXZpY2U6ICVkIiwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9ERVZJQ0U6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBlcnJvclZhbCA9IDo6RVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgICAgIC8vIFdlIGtlZXAgdGhpcyBzd2l0Y2ggc2luY2UgdGhpcyBibG9jayBtaWdodCBiZSBlbmNvdW50ZXJlZCB3aXRoCisgICAgICAgICAgICAvLyBtb3JlIHRoYW4ganVzdCAyIHN0YXRlcy4gVGhlIGRlZmF1bHQgZmFsbHRocm91Z2ggY291bGQgaGF2ZSB1cworICAgICAgICAgICAgLy8gaGFuZGxpbmcgbW9yZSB1bm1hdGNoZWQgZXJyb3IgY2FzZXMuCisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfREVWSUNFOgorICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRToKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JWYWwgPSA6OkVSUk9SX0NBTUVSQV9TRVJWSUNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9uRXJyb3IsIGRldi0+bUhhbmRsZXIpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBkZXYtPm1BcHBDYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKSBkZXYtPmdldFdyYXBwZXIoKSk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgZGV2LT5tQXBwQ2FsbGJhY2tzLm9uRXJyb3IpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrRXJyb3JDb2RlS2V5LCBlcnJvclZhbCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQ6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSOgorICAgICAgICAgICAgZGV2LT5vbkNhcHR1cmVFcnJvckxvY2tlZChlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uRGV2aWNlSWRsZSgpIHsKKyAgICBBTE9HVigiQ2FtZXJhIGlzIG5vdyBpZGxlIik7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpIHx8IGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGRldi0+bUlkbGUpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBpbiBpZGxlIHN0YXRlLiBQb3NzaWJseSBvdGhlciB0aHJlYWQgZGlkIHdhaXRVbnRpbElkbGUKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoZGV2LT5tQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgib25EZXZpY2VJZGxlIHNlbmRpbmcgc3RhdGUgY2IiKTsKKyAgICAgICAgaWYgKGRldi0+bUJ1c3lTZXNzaW9uICE9IGRldi0+bUN1cnJlbnRTZXNzaW9uKSB7CisgICAgICAgICAgICBBTE9HRSgiQ3VycmVudCBzZXNzaW9uICE9IGJ1c3kgc2Vzc2lvbiIpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBkZXYtPm1CdXN5U2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBkZXYtPm1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25SZWFkeSk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgc3AgZmlyc3Qgc28gdGhlIHNlc3Npb24gZGVzdHJ1Y3RvciBjYW4KKyAgICAgICAgLy8gb25seSBoYXBwZW4gb24gaGFuZGxlciB0aHJlYWQgKHdoZXJlIHdlIGRvbid0IGhvbGQgZGV2aWNlL3Nlc3Npb24gbG9jaykKKyAgICAgICAgZGV2LT5tQnVzeVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgZGV2LT5tSWRsZSA9IHRydWU7CisgICAgZGV2LT5tRmx1c2hpbmcgPSBmYWxzZTsKKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25DYXB0dXJlU3RhcnRlZCgKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPmlzQ2xvc2VkKCkgfHwgZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworCisgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOworICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVyc3RJZCwgY2JoLm1SZXF1ZXN0cy5zaXplKCkpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU3RhcnQsIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoa1RpbWVTdGFtcEtleSwgdGltZXN0YW1wKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uUmVzdWx0UmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgeworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworCisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgaW50MzJfdCBidXJzdElkID0gcmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgYm9vbCAgICBpc1BhcnRpYWxSZXN1bHQgPSAocmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA8IGRldi0+bVBhcnRpYWxSZXN1bHRDb3VudCk7CisKKyAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICBBTE9HVigiU2VxSWQgJWQgZnJhbWUgJSIgUFJJZDY0ICIgcmVzdWx0IGFycml2ZS4iLCBzZXF1ZW5jZUlkLCBmcmFtZU51bWJlcik7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gZGlzY29ubmVjdGVkCisgICAgfQorCisgICAgaWYgKGRldi0+aXNDbG9zZWQoKSkgeworICAgICAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICAgICAgZGV2LT5tRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovZmFsc2UpOworICAgICAgICB9CisgICAgICAgIC8vIGVhcmx5IHJldHVybiB0byBhdm9pZCBjYWxsYmFjayBzZW50IHRvIGNsb3NlZCBkZXZpY2VzCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGFDb3B5OworICAgIGNhbWVyYV9zdGF0dXNfdCBzdGF0dXMgPSByZWFkT25lUmVzdWx0TWV0YWRhdGEocmVzdWx0TWV0YWRhdGEsCisgICAgICAgICAgICBkZXYtPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS5nZXQoKSwgJm1ldGFkYXRhQ29weSk7CisgICAgaWYgKHN0YXR1cyAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogcmVzdWx0IG1ldGFkYXRhIGNvdWxkbid0IGJlIGNvbnZlcnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbWV0YWRhdGFDb3B5LnVwZGF0ZShBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFLCBkZXYtPm1TaGFkaW5nTWFwU2l6ZSwgLypkYXRhX2NvdW50Ki8yKTsKKyAgICBtZXRhZGF0YUNvcHkudXBkYXRlKEFORFJPSURfU1lOQ19GUkFNRV9OVU1CRVIsICZmcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKworICAgIGF1dG8gaXQgPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ICE9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZW5kKCkpIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CisgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidXJzdElkLCBjYmgubVJlcXVlc3RzLnNpemUoKSk7CisgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICB9CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQobmV3IEFDYW1lcmFNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICBtZXRhZGF0YUNvcHkucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+IGxvY2FsUGh5c2ljYWxSZXN1bHQ7CisgICAgICAgIGxvY2FsUGh5c2ljYWxSZXN1bHQucmVzaXplKHBoeXNpY2FsUmVzdWx0SW5mb3Muc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm9zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBsb2NhbFBoeXNpY2FsUmVzdWx0W2ldLnBoeXNpY2FsQ2FtZXJhSWQgPSBwaHlzaWNhbFJlc3VsdEluZm9zW2ldLnBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgICAgICBzdGF0dXMgPSByZWFkT25lUmVzdWx0TWV0YWRhdGEocGh5c2ljYWxSZXN1bHRJbmZvc1tpXS5waHlzaWNhbENhbWVyYU1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBkZXYtPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgJmxvY2FsUGh5c2ljYWxSZXN1bHRbaV0ucGh5c2ljYWxNZXRhZGF0YSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHBoeXNpY2FsIGNhbWVyYSByZXN1bHQgbWV0YWRhdGEgY291bGRuJ3QgYmUgY29udmVydGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8obG9jYWxQaHlzaWNhbFJlc3VsdCwgZnJhbWVOdW1iZXIpKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKAorICAgICAgICAgICAgICAgIGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sgPyBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0IDoga1doYXRDYXB0dXJlUmVzdWx0LAorICAgICAgICAgICAgICAgIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgcmVzdWx0KTsKKyAgICAgICAgaWYgKGlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlUHJvZ3Jlc3NlZCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjaykgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCk7CisgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCBwaHlzaWNhbFJlc3VsdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICB9CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorCisgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgZGV2LT5tRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovZmFsc2UpOworICAgICAgICBkZXYtPmNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoCisgICAgICAgIHVpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgeworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworCisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKworICAgIGludCByZXBlYXRpbmdTZXF1ZW5jZUlkID0gZGV2LT5tUmVwZWF0aW5nU2VxdWVuY2VJZDsKKyAgICBpZiAoc3RvcHBlZFNlcXVlbmNlSWQgPT0gcmVwZWF0aW5nU2VxdWVuY2VJZCkgeworICAgICAgICBkZXYtPm1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworICAgIH0KKworICAgIGRldi0+Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKHJlcGVhdGluZ1NlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6OnJlYWRPbmVSZXN1bHRNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIGZtcVNpemVPck1ldGFkYXRhLCBSZXN1bHRNZXRhZGF0YVF1ZXVlKiBtZXRhZGF0YVF1ZXVlLAorICAgICAgICBDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpIHsKKyAgICBpZiAobWV0YWRhdGFRdWV1ZSA9PSBudWxscHRyIHx8IG1ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGJvb2wgY29udmVydGVkOworICAgIEhDYW1lcmFNZXRhZGF0YSBoQ2FtZXJhTWV0YWRhdGE7CisgICAgaWYgKGZtcVNpemVPck1ldGFkYXRhLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Zm1xTWV0YWRhdGFTaXplKSB7CisgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5yZXNpemUoZm1xU2l6ZU9yTWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICBib29sIHJlYWQgPSBtZXRhZGF0YVF1ZXVlLT5yZWFkKAorICAgICAgICAgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5kYXRhKCksIGZtcVNpemVPck1ldGFkYXRhLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgaWYgKCFyZWFkKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FwdHVyZSByZXF1ZXN0IHNldHRpbmdzIGNvdWxkJ3QgYmUgcmVhZCBmcm9tIGZtcSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IERvIHdlIGFjdHVhbGx5IG5lZWQgdG8gY2xvbmUgaGVyZSA/CisgICAgICAgIGNvbnZlcnRlZCA9IHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQoaENhbWVyYU1ldGFkYXRhLCBtZXRhZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29udmVydGVkID0gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChmbXFTaXplT3JNZXRhZGF0YS5tZXRhZGF0YSgpLCBtZXRhZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnZlcnRlZCA/IEFDQU1FUkFfT0sgOiBBQ0FNRVJBX0VSUk9SX1VOS05PV047Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODA5MmZkCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0wLDAgKzEsNDE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0FDQU1FUkFfREVWSUNFX0gKKyNkZWZpbmUgX0FDQU1FUkFfREVWSUNFX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaD4KKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIElDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSUNhbWVyYURldmljZVVzZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgU3VibWl0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBFcnJvckNvZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkVycm9yQ29kZTsKK3VzaW5nIEZtcVNpemVPck1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpGbXFTaXplT3JNZXRhZGF0YTsKK3VzaW5nIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIHV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyOwordXNpbmcgdXRpbHM6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgdXRpbHM6Ok91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyOworCisvLyBXcmFwIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSBzbyBpdCBjYW4gYmUgcmVmLWNvdW50ZWQKK3N0cnVjdCBDYW1lcmFDYXB0dXJlRmFpbHVyZSA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHsgfTsKKworLy8gV3JhcCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIHNvIHRoYXQgaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsIHsKKyAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbENhbWVyYUlkOworICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsTWV0YWRhdGE7Cit9OworCitzdHJ1Y3QgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+JiBpbmZvLAorICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcikgOgorICAgICAgICBtUGh5c2ljYWxSZXN1bHRJbmZvKGluZm8pLCBtRnJhbWVOdW1iZXIoZnJhbWVOdW1iZXIpIHt9CisKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+IG1QaHlzaWNhbFJlc3VsdEluZm87CisgICAgaW50NjRfdCBtRnJhbWVOdW1iZXI7Cit9OworCitjbGFzcyBDYW1lcmFEZXZpY2UgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CisgIHB1YmxpYzoKKyAgICBDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIHdyYXBwZXIpOworICAgIH5DYW1lcmFEZXZpY2UoKTsKKworICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW1lcmFJZC5jX3N0cigpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAorICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3Q7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVNlc3Npb24oCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbik7CisKKyAgICAvLyBDYWxsYmFja3MgZnJvbSBjYW1lcmEgc2VydmljZQorICAgIGNsYXNzIFNlcnZpY2VDYWxsYmFjayA6IHB1YmxpYyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBTZXJ2aWNlQ2FsbGJhY2soQ2FtZXJhRGV2aWNlKiBkZXZpY2UpIDogbURldmljZShkZXZpY2UpIHt9CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25EZXZpY2VFcnJvcihFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvbkRldmljZUlkbGUoKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCkgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25SZXN1bHRSZWNlaXZlZChjb25zdCBGbXFTaXplT3JNZXRhZGF0YSYgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsUmVzdWx0SW5mb3MpIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKHVpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHN0b3BwZWRTZXF1ZW5jZUlkKSBvdmVycmlkZTsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNhbWVyYV9zdGF0dXNfdCByZWFkT25lUmVzdWx0TWV0YWRhdGEoY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIGZtcVNpemVPck1ldGFkYXRhLAorICAgICAgICAgICAgICAgIFJlc3VsdE1ldGFkYXRhUXVldWUqIG1ldGFkYXRhUXVldWUsIENhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSk7CisgICAgICAgIGNvbnN0IHdwPENhbWVyYURldmljZT4gbURldmljZTsKKyAgICB9OworICAgIGlubGluZSBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+IGdldFNlcnZpY2VDYWxsYmFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1TZXJ2aWNlQ2FsbGJhY2s7CisgICAgfTsKKworICAgIC8vIENhbWVyYSBkZXZpY2UgaXMgb25seSBmdW5jdGlvbmFsIGFmdGVyIHJlbW90ZSBiZWluZyBzZXQKKyAgICB2b2lkIHNldFJlbW90ZURldmljZShzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gcmVtb3RlKTsKKworICAgIGJvb2wgc2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKTsKKyAgICBpbmxpbmUgQUNhbWVyYURldmljZSogZ2V0V3JhcHBlcigpIGNvbnN0IHsgcmV0dXJuIG1XcmFwcGVyOyB9OworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKSBjb25zdDsKKworICAgIC8vIGRldmljZSBnb2VzIGludG8gZmF0YWwgZXJyb3Igc3RhdGUgYWZ0ZXIgdGhpcworICAgIHZvaWQgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoY2FtZXJhX3N0YXR1c190IGVycm9yKTsKKworICAgIHZvaWQgZGlzY29ubmVjdExvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+JiBzZXNzaW9uKTsgLy8gZGlzY29ubmVjdCBmcm9tIGNhbWVyYSBzZXJ2aWNlCisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc3RvcFJlcGVhdGluZ0xvY2tlZCgpOworCisgICAgY2FtZXJhX3N0YXR1c190IGZsdXNoTG9ja2VkKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiopOworCisgICAgY2FtZXJhX3N0YXR1c190IHdhaXRVbnRpbElkbGVMb2NrZWQoKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgY2FtZXJhX3N0YXR1c190IGNhcHR1cmVMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBjYW1lcmFfc3RhdHVzX3Qgc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAgICAgLypvdXQqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQsCisgICAgICAgICAgICBib29sIGlzUmVwZWF0aW5nKTsKKworICAgIHZvaWQgYWRkUmVxdWVzdFNldHRpbmdzTWV0YWRhdGEoQUNhcHR1cmVSZXF1ZXN0ICphQ2FwdHVyZVJlcXVlc3QsIHNwPENhcHR1cmVSZXF1ZXN0PiAmcmVxKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KTsKKworICAgIC8vIFNpbmNlIHRoaXMgd3JpdGVzIHRvIElDYW1lcmFEZXZpY2VVc2VyJ3MgZm1xLCBjbGllbnRzIG11c3QgdGFrZSBjYXJlIHRoYXQ6CisgICAgLy8gICBhKSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBzZXJpYWxseS4KKyAgICAvLyAgIGIpIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGFjY29yZGFuY2Ugd2l0aCBJQ2FtZXJhRGV2aWNlVXNlci5zdWJtaXRSZXF1ZXN0TGlzdCwKKyAgICAvLyAgICAgIG90aGVyd2lzZSwgdGhlIHdyb25nIGNhcHR1cmUgcmVxdWVzdCBtaWdodCBoYXZlIHRoZSB3cm9uZyBzZXR0aW5ncworICAgIC8vICAgICAgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0LgorICAgIGNhbWVyYV9zdGF0dXNfdCBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0TG9ja2VkKAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBzcDxDYXB0dXJlUmVxdWVzdD4mIG91dFJlcSk7CisgICAgdm9pZCBhbGxvY2F0ZU9uZUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGEoCisgICAgICAgICAgICBQaHlzaWNhbENhbWVyYVNldHRpbmdzJiBjYW1lcmFTZXR0aW5ncywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3A8QUNhbWVyYU1ldGFkYXRhPiYgbWV0YWRhdGEpOworCisgICAgc3RhdGljIEFDYXB0dXJlUmVxdWVzdCogYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEsIGNvbnN0IGNoYXIqIGRldmljZUlkKTsKKyAgICBzdGF0aWMgdm9pZCBmcmVlQUNhcHR1cmVSZXF1ZXN0KEFDYXB0dXJlUmVxdWVzdCopOworCisgICAgLy8gb25seSBGb3Igc2Vzc2lvbiB0byBob2xkIGRldmljZSBsb2NrCisgICAgLy8gQWx3YXlzIGdyYWIgZGV2aWNlIGxvY2sgYmVmb3JlIGdyYWJiaW5nIHNlc3Npb24gbG9jaworICAgIHZvaWQgbG9ja0RldmljZUZvclNlc3Npb25PcHMoKSBjb25zdCB7IG1EZXZpY2VMb2NrLmxvY2soKTsgfTsKKyAgICB2b2lkIHVubG9ja0RldmljZSgpIGNvbnN0IHsgbURldmljZUxvY2sudW5sb2NrKCk7IH07CisKKyAgICAvLyBGb3IgY2FwdHVyZSBzZXNzaW9uIHRvIG5vdGlmeSBpdHMgZW5kIG9mIGxpZmUKKyAgICB2b2lkIG5vdGlmeVNlc3Npb25FbmRPZkxpZmVMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zTG9ja2VkKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogb3V0cHV0cywKKyAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycyk7CisKKyAgICAvLyBJbnB1dCBtZXNzYWdlIHdpbGwgYmUgcG9zdGVkIGFuZCBjbGVhcmVkIGFmdGVyIHRoaXMgcmV0dXJucworICAgIHZvaWQgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKHNwPEFNZXNzYWdlPiYgbXNnKTsKKworICAgIG11dGFibGUgTXV0ZXggbURldmljZUxvY2s7CisgICAgY29uc3QgaGlkbF9zdHJpbmcgbUNhbWVyYUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIElECisgICAgY29uc3QgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBtQXBwQ2FsbGJhY2tzOyAvLyBDYWxsYmFjayB0byBhcHAKKyAgICBjb25zdCBzcDxBQ2FtZXJhTWV0YWRhdGE+IG1DaGFyczsgICAgLy8gQ2FtZXJhIGNoYXJhY3RlcmlzdGljcworICAgIGNvbnN0IHNwPFNlcnZpY2VDYWxsYmFjaz4gbVNlcnZpY2VDYWxsYmFjazsKKyAgICBBQ2FtZXJhRGV2aWNlKiBtV3JhcHBlcjsKKworICAgIC8vIHN0cmVhbSBpZCAtPiBwYWlyIG9mIChBQ2FtZXJhV2luZG93VHlwZSogZnJvbSBhcHBsaWNhdGlvbiwgT3V0cHV0Q29uZmlndXJhdGlvbiB1c2VkIGZvcgorICAgIC8vIGNhbWVyYSBzZXJ2aWNlKQorICAgIHN0ZDo6bWFwPGludCwgc3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gbUNvbmZpZ3VyZWRPdXRwdXRzOworCisgICAgLy8gVE9ETzogbWF5YmUgYSBib29sIHdpbGwgc3VmZmljZSBmb3Igc3luY2hyb25vdXMgaW1wbGVtZW50YXRpb24/CisgICAgc3RkOjphdG9taWNfYm9vbCBtQ2xvc2luZzsKKyAgICBpbmxpbmUgYm9vbCBpc0Nsb3NlZCgpIHsgcmV0dXJuIG1DbG9zaW5nOyB9CisKKyAgICBib29sIG1JbkVycm9yID0gZmFsc2U7CisgICAgY2FtZXJhX3N0YXR1c190IG1FcnJvciA9IEFDQU1FUkFfT0s7CisgICAgdm9pZCBvbkNhcHR1cmVFcnJvckxvY2tlZCgKKyAgICAgICAgICAgIEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOworCisgICAgYm9vbCBtSWRsZSA9IHRydWU7CisgICAgLy8gVGhpcyB3aWxsIGF2b2lkIGEgYnVzeSBzZXNzaW9uIGJlaW5nIGRlbGV0ZWQgYmVmb3JlIGl0J3MgYmFjayB0byBpZGxlIHN0YXRlCisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBtQnVzeVNlc3Npb247CisKKyAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gbVJlbW90ZTsKKworICAgIC8vIExvb3BlciB0aHJlYWQgdG8gaGFuZGxlIGNhbGxiYWNrIHRvIGFwcAorICAgIHNwPEFMb29wZXI+IG1DYkxvb3BlcjsKKyAgICAvLyBkZWZpbml0aW9uIG9mIGhhbmRsZXIgYW5kIG1lc3NhZ2UKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gRGV2aWNlIHN0YXRlIGNhbGxiYWNrcworICAgICAgICBrV2hhdE9uRGlzY29ubmVjdGVkLCAgIC8vIG9uRGlzY29ubmVjdGVkCisgICAgICAgIGtXaGF0T25FcnJvciwgICAgICAgICAgLy8gb25FcnJvcgorICAgICAgICAvLyBTZXNzaW9uIHN0YXRlIGNhbGxiYWNrcworICAgICAgICBrV2hhdFNlc3Npb25TdGF0ZUNiLCAgIC8vIG9uUmVhZHksIG9uQWN0aXZlCisgICAgICAgIC8vIENhcHR1cmUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0Q2FwdHVyZVN0YXJ0LCAgICAgLy8gb25DYXB0dXJlU3RhcnRlZAorICAgICAgICBrV2hhdENhcHR1cmVSZXN1bHQsICAgIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQsIG9uQ2FwdHVyZUNvbXBsZXRlZAorICAgICAgICBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0LCAvLyBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZUZhaWwsICAgICAgLy8gb25DYXB0dXJlRmFpbGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUVuZCwgICAgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlU2VxQWJvcnQsICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlQnVmZmVyTG9zdCwvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgICAgIC8vIEludGVybmFsIGNsZWFudXAKKyAgICAgICAga1doYXRDbGVhblVwU2Vzc2lvbnMgICAvLyBDbGVhbnVwIGNhY2hlZCBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtEZXZpY2VLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtFcnJvckNvZGVLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrU2Vzc2lvblNwS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZVJlcXVlc3RLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtUaW1lU3RhbXBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVzdWx0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZUZhaWx1cmVLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXF1ZW5jZUlkS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRnJhbWVOdW1iZXJLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtBbndLZXk7CisKKyAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgcHVibGljOgorICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gVGhpcyBoYW5kbGVyIHdpbGwgY2FjaGUgYWxsIGNhcHR1cmUgc2Vzc2lvbiBzcCB1bnRpbCBrV2hhdENsZWFuVXBTZXNzaW9ucworICAgICAgICAvLyBpcyBwcm9jZXNzZWQuIFRoaXMgaXMgdXNlZCB0byBndWFyYW50ZWUgdGhlIGxhc3Qgc2Vzc2lvbiByZWZlcmVuY2UgaXMgYWx3YXlzCisgICAgICAgIC8vIGJlaW5nIHJlbW92ZWQgaW4gY2FsbGJhY2sgdGhyZWFkIHdpdGhvdXQgaG9sZGluZyBjYW1lcmEgZGV2aWNlIGxvY2sKKyAgICAgICAgVmVjdG9yPHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4+IG1DYWNoZWRTZXNzaW9uczsKKyAgICB9OworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBDYXB0dXJlIHNlc3Npb24gcmVsYXRlZCBtZW1iZXJzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLy8gVGhlIGN1cnJlbnQgYWN0aXZlIHNlc3Npb24KKyAgICB3cDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1DdXJyZW50U2Vzc2lvbjsKKyAgICBib29sIG1GbHVzaGluZyA9IGZhbHNlOworCisgICAgaW50IG1OZXh0U2Vzc2lvbklkID0gMDsKKyAgICAvLyBUT0RPOiBtaWdodCBuZWVkIGFub3RoZXIgbG9vcGVyL2hhbmRsZXIgdG8gaGFuZGxlIGNhbGxiYWNrcyBmcm9tIHNlcnZpY2UKKworICAgIHN0YXRpYyBjb25zdCBpbnQgUkVRVUVTVF9JRF9OT05FID0gLTE7CisgICAgaW50IG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworCisgICAgLy8gc2VxdWVuY2UgaWQgLT4gbGFzdCBmcmFtZSBudW1iZXIgbWFwCisgICAgc3RkOjptYXA8aW50MzJfdCwgaW50NjRfdD4gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwOworCisgICAgc3RydWN0IENhbGxiYWNrSG9sZGVyIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiYgIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiYgIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKTsKKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUZhaWxlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlUHJvZ3Jlc3NlZCA9IGNicy0+b25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gY2JzLT5vbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBjYnMtPm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgbVNlc3Npb247CisgICAgICAgIFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+ICBtUmVxdWVzdHM7CisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNSZXBlYXRpbmc7CisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2s7CisKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0OworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG1PbkNhcHR1cmVTdGFydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgbU9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3QgbU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgfTsKKyAgICAvLyBzZXF1ZW5jZSBpZCAtPiBjYWxsYmFja3MgbWFwCisgICAgc3RkOjptYXA8aW50LCBDYWxsYmFja0hvbGRlcj4gbVNlcXVlbmNlQ2FsbGJhY2tNYXA7CisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBOT19GUkFNRVNfQ0FQVFVSRUQgPSAtMTsKKyAgICBjbGFzcyBGcmFtZU51bWJlclRyYWNrZXIgeworICAgICAgcHVibGljOgorICAgICAgICAvLyBUT0RPOiBDYWxsZWQgaW4gb25SZXN1bHRSZWNlaXZlZCBhbmQgb25DYXB0dXJlRXJyb3JMb2NrZWQKKyAgICAgICAgdm9pZCB1cGRhdGVUcmFja2VyKGludDY0X3QgZnJhbWVOdW1iZXIsIGJvb2wgaXNFcnJvcik7CisgICAgICAgIGlubGluZSBpbnQ2NF90IGdldENvbXBsZXRlZEZyYW1lTnVtYmVyKCkgeyByZXR1cm4gbUNvbXBsZXRlZEZyYW1lTnVtYmVyOyB9CisgICAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHVwZGF0ZSgpOworICAgICAgICB2b2lkIHVwZGF0ZUNvbXBsZXRlZEZyYW1lTnVtYmVyKGludDY0X3QgZnJhbWVOdW1iZXIpOworCisgICAgICAgIGludDY0X3QgbUNvbXBsZXRlZEZyYW1lTnVtYmVyID0gTk9fRlJBTUVTX0NBUFRVUkVEOworICAgICAgICBMaXN0PGludDY0X3Q+IG1Ta2lwcGVkRnJhbWVOdW1iZXJzOworICAgICAgICBzdGQ6OnNldDxpbnQ2NF90PiBtRnV0dXJlRXJyb3JTZXQ7CisgICAgfTsKKyAgICBGcmFtZU51bWJlclRyYWNrZXIgbUZyYW1lTnVtYmVyVHJhY2tlcjsKKworICAgIHZvaWQgY2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKGNvbnN0IGludCBzZXF1ZW5jZUlkLCBjb25zdCBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcik7CisgICAgdm9pZCBjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisKKyAgICAvLyBNaXNjIHZhcmlhYmxlcworICAgIGludDMyX3QgbVNoYWRpbmdNYXBTaXplWzJdOyAgIC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCisgICAgaW50MzJfdCBtUGFydGlhbFJlc3VsdENvdW50OyAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhY2FtOworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLyoqCisgKiBBQ2FtZXJhRGV2aWNlIG9wYXF1ZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogTGVhdmUgb3V0c2lkZSBvZiBhbmRyb2lkIG5hbWVzcGFjZSBiZWNhdXNlIGl0J3MgTkRLIHN0cnVjdAorICovCitzdHJ1Y3QgQUNhbWVyYURldmljZSB7CisgICAgQUNhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCisgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKSA6CisgICAgICAgICAgICBtRGV2aWNlKG5ldyBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2UoaWQsIGNiLCBzdGQ6Om1vdmUoY2hhcnMpLCB0aGlzKSkge30KKworICAgIH5BQ2FtZXJhRGV2aWNlKCkge307CisKKyAgICAvKioqKioqKioqKioqKioqKioqKgorICAgICAqIE5ESyBwdWJsaWMgQVBJcyAqCisgICAgICoqKioqKioqKioqKioqKioqKiovCisgICAgaW5saW5lIGNvbnN0IGNoYXIqIGdldElkKCkgY29uc3QgeyByZXR1cm4gbURldmljZS0+Z2V0SWQoKTsgfQorCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhSWRMaXN0KiBwaHlzaWNhbENhbWVyYUlkTGlzdCwKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KHRlbXBsYXRlSWQsIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LCByZXF1ZXN0KTsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVNlc3Npb24oCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVNlc3Npb24ob3V0cHV0cywgc2Vzc2lvblBhcmFtZXRlcnMsIGNhbGxiYWNrcywgc2Vzc2lvbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogRGV2aWNlIGludGVyYWwgQVBJcyAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlubGluZSBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+IGdldFNlcnZpY2VDYWxsYmFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmdldFNlcnZpY2VDYWxsYmFjaygpOworICAgIH07CisKKyAgICAvLyBDYW1lcmEgZGV2aWNlIGlzIG9ubHkgZnVuY3Rpb25hbCBhZnRlciByZW1vdGUgYmVpbmcgc2V0CisgICAgaW5saW5lIHZvaWQgc2V0UmVtb3RlRGV2aWNlKGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OklDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpIHsKKyAgICAgICAgbURldmljZS0+c2V0UmVtb3RlRGV2aWNlKHJlbW90ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIHNldERldmljZU1ldGFkYXRhUXVldWVzKCkgeworICAgICAgICByZXR1cm4gbURldmljZS0+c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworfTsKKworI2VuZGlmIC8vIF9BQ0FNRVJBX0RFVklDRV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlVmVuZG9yLmluYyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDVhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlVmVuZG9yLmluYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNhcHR1cmVMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi9mYWxzZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6c2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi90cnVlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvdXQqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQsCisgICAgICAgIGJvb2wgaXNSZXBlYXRpbmcpCit7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCBjYXB0dXJlIHJlcXVlc3QgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIEZvcm0gdHdvIHZlY3RvcnMgb2YgY2FwdHVyZSByZXF1ZXN0LCBvbmUgZm9yIGludGVybmFsIHRyYWNraW5nCisgICAgc3RkOjp2ZWN0b3I8ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7CisgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4gcmVxdWVzdHNWOworICAgIHJlcXVlc3RzVi5zZXRDYXBhY2l0eShudW1SZXF1ZXN0cyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZXF1ZXN0czsgaSsrKSB7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXE7CisgICAgICAgIHJldCA9IGFsbG9jYXRlQ2FwdHVyZVJlcXVlc3RMb2NrZWQocmVxdWVzdHNbaV0sIHJlcSk7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBzaW5jZSBhZnRlciBzdWJtaXRSZXF1ZXN0TGlzdCBpcyBjYWxsZWQsCisgICAgICAgIC8vIHRoZSByZXF1ZXN0IG1ldGFkYXRhIHF1ZXVlIG1pZ2h0IGhhdmUgcmVtb3ZlZCB0aGUgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIC8vIG1ldGFkYXRhLiBUaGVyZWZvcmUgd2Ugc2ltcGx5IGFkZCB0aGUgbWV0YWRhdGEgdG8gaXRzIHdyYXBwZXIgY2xhc3MsCisgICAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGJlIHJldHJpZXZlZCBsYXRlci4KKyAgICAgICAgYWRkUmVxdWVzdFNldHRpbmdzTWV0YWRhdGEocmVxdWVzdHNbaV0sIHJlcSk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNvbnZlcnQgY2FwdHVyZSByZXF1ZXN0IHRvIGludGVybmFsIGZvcm1hdCBmYWlsdXJlISByZXQgJWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FwdHVyZSByZXF1ZXN0IHdpdGhvdXQgb3V0cHV0IHRhcmdldCBjYW5ub3QgYmUgc3VibWl0dGVkISIpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdExpc3QucHVzaF9iYWNrKHV0aWxzOjpjb252ZXJ0VG9IaWRsKHJlcS5nZXQoKSkpOworICAgICAgICByZXF1ZXN0c1YucHVzaF9iYWNrKHJlcSk7CisgICAgfQorICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgU3VibWl0SW5mbyBpbmZvOworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5zdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmluZm9dKGF1dG8gcywgYXV0byAmc3VibWl0SW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHN1Ym1pdEluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBmb3Igc3VibWl0UmVxdWVzdExpc3QgY2FsbDogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICB9CisgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gaW5mby5yZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSBpbmZvLmxhc3RGcmFtZU51bWJlcjsKKyAgICBpZiAoc2VxdWVuY2VJZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgcmVxdWVzdCByZW1vdGUgZmFpbHVyZTogcmV0ICVkIiwgZ2V0SWQoKSwgc2VxdWVuY2VJZCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgQ2FsbGJhY2tIb2xkZXIgY2JIb2xkZXIoc2Vzc2lvbiwgcmVxdWVzdHNWLCBpc1JlcGVhdGluZywgY2JzKTsKKyAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgY2JIb2xkZXIpKTsKKyAgICBpZiAoaXNSZXBlYXRpbmcpIHsKKyAgICAgICAgLy8gc3RvcFJlcGVhdGluZyBhYm92ZSBzaG91bGQgaGF2ZSBjbGVhbnVwIHJlcGVhdGluZyBzZXF1ZW5jZSBpZAorICAgICAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgfQorICAgICAgICBtUmVwZWF0aW5nU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICB9CisKKyAgICBpZiAobUlkbGUpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgbUlkbGUgPSBmYWxzZTsKKyAgICBtQnVzeVNlc3Npb24gPSBzZXNzaW9uOworCisgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1ZWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDU5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYU1hbmFnZXJWZW5kb3IiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPFZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7Cit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9uczsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6aGVscGVyOjpWZW5kb3JUYWdEZXNjcmlwdG9yOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OlZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTsKKworLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucworY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbWVyYUlkS2V5ICAgPSAiQ2FtZXJhSWQiOworY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbGxiYWNrRnBLZXkgPSAiQ2FsbGJhY2tGcCI7Citjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ29udGV4dEtleSAgICA9ICJDYWxsYmFja0NvbnRleHQiOworTXV0ZXggICAgICAgICAgICAgICAgQ2FtZXJhTWFuYWdlckdsb2JhbDo6c0xvY2s7CitDYW1lcmFNYW5hZ2VyR2xvYmFsKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpzSW5zdGFuY2UgPSBudWxscHRyOworCisvKioKKyAqIFRoZSB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgY2xhc3MgdGhhdCB0YWtlcyBISURMIHZlbmRvciB0YWcgaW5mb3JtYXRpb24gYXMKKyAqIGlucHV0LiBOb3QgcGFydCBvZiB2ZW5kb3IgYXZhaWxhYmxlIFZlbmRvclRhZ0Rlc2NyaXB0b3IgY2xhc3MgYmVjYXVzZSB0aGF0IGNsYXNzIGlzIHVzZWQgYnkKKyAqIGRlZmF1bHQgSEFMIGltcGxlbWVudGF0aW9uIGNvZGUgYXMgd2VsbC4KKyAqLworY2xhc3MgSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3IgOiBwdWJsaWMgVmVuZG9yVGFnRGVzY3JpcHRvciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgZnJvbSB0aGUgSElETCBWZW5kb3JUYWdTZWN0aW9uCisgICAgICogdmVjdG9yLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbChjb25zdCBoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiYgdnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLyBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiAqZGVzY3JpcHRvcik7Cit9OworCitzdGF0dXNfdCBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKGNvbnN0IGhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+ICZ2dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+ICpkZXNjcmlwdG9yKSB7CisgICAgaW50IHRhZ0NvdW50ID0gMDsKKworICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7CisgICAgICAgIHRhZ0NvdW50ICs9IHZ0c1tzXS50YWdzLnNpemUoKTsKKyAgICB9CisKKyAgICBpZiAodGFnQ291bnQgPCAwIHx8IHRhZ0NvdW50ID4gSU5UMzJfTUFYKSB7CisgICAgICAgIEFMT0dFKCIlczogdGFnIGNvdW50ICVkIGZyb20gdmVuZG9yIHRhZyBzZWN0aW9ucyBpcyBpbnZhbGlkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50MzJfdD4gdGFnQXJyYXk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRih0YWdBcnJheS5yZXNpemUodGFnQ291bnQpICE9IHRhZ0NvdW50LAorICAgICAgICAgICAgIiVzOiB0b28gbWFueSAoJXUpIHZlbmRvciB0YWdzIGRlZmluZWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisKKyAgICBzcDxIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIGRlc2MtPm1UYWdDb3VudCA9IHRhZ0NvdW50OworCisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFN0cmluZzg+IHRhZ1RvU2VjdGlvbk1hcDsKKworICAgIGludCBpZHggPSAwOworICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7CisgICAgICAgIGNvbnN0IFZlbmRvclRhZ1NlY3Rpb24mIHNlY3Rpb24gPSB2dHNbc107CisgICAgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb25OYW1lID0gc2VjdGlvbi5zZWN0aW9uTmFtZS5jX3N0cigpOworICAgICAgICBpZiAoc2VjdGlvbk5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzZWN0aW9uIG5hbWUgZGVmaW5lZCBmb3IgdmVuZG9yIHRhZyBzZWN0aW9uICV6dS4iLCBfX0ZVTkNUSU9OX18sIHMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmc4IHNlY3Rpb25TdHJpbmcoc2VjdGlvbk5hbWUpOworICAgICAgICBkZXNjLT5tU2VjdGlvbnMuYWRkKHNlY3Rpb25TdHJpbmcpOworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2VjdGlvbi50YWdzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0YWcgPSBzZWN0aW9uLnRhZ3Nbal0udGFnSWQ7CisgICAgICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHZlbmRvciB0YWcgJWQgbm90IGluIHZlbmRvciB0YWcgc2VjdGlvbi4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFnQXJyYXkuZWRpdEl0ZW1BdChpZHgrKykgPSBzZWN0aW9uLnRhZ3Nbal0udGFnSWQ7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZ05hbWUgPSBzZWN0aW9uLnRhZ3Nbal0udGFnTmFtZS5jX3N0cigpOworICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gdGFnIG5hbWUgZGVmaW5lZCBmb3IgdmVuZG9yIHRhZyAlZC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2MtPm1UYWdUb05hbWVNYXAuYWRkKHRhZywgU3RyaW5nOCh0YWdOYW1lKSk7CisgICAgICAgICAgICB0YWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgICAgIGludCB0YWdUeXBlID0gKGludCkgc2VjdGlvbi50YWdzW2pdLnRhZ1R5cGU7CisgICAgICAgICAgICBpZiAodGFnVHlwZSA8IDAgfHwgdGFnVHlwZSA+PSBOVU1fVFlQRVMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjLT5tVGFnVG9UeXBlTWFwLmVtcGxhY2UodGFnLCB0YWdUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFnQXJyYXkuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgdGFnID0gdGFnQXJyYXlbaV07CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyA9IHRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworCisgICAgICAgIC8vIFNldCB1cCB0YWcgdG8gc2VjdGlvbiBpbmRleCBtYXAKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IGRlc2MtPm1TZWN0aW9ucy5pbmRleE9mKHNlY3Rpb25TdHJpbmcpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImluZGV4ICV6ZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIsIGluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKworICAgICAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICAqZGVzY3JpcHRvciA9IHN0ZDo6bW92ZShkZXNjKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK0NhbWVyYU1hbmFnZXJHbG9iYWwmCitDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woc0xvY2spOworICAgIENhbWVyYU1hbmFnZXJHbG9iYWwqIGluc3RhbmNlID0gc0luc3RhbmNlOworICAgIGlmIChpbnN0YW5jZSA9PSBudWxscHRyKSB7CisgICAgICAgIGluc3RhbmNlID0gbmV3IENhbWVyYU1hbmFnZXJHbG9iYWwoKTsKKyAgICAgICAgc0luc3RhbmNlID0gaW5zdGFuY2U7CisgICAgfQorICAgIHJldHVybiAqaW5zdGFuY2U7Cit9CisKK0NhbWVyYU1hbmFnZXJHbG9iYWw6On5DYW1lcmFNYW5hZ2VyR2xvYmFsKCkgeworICAgIC8vIGNsZWFyIHNJbnN0YW5jZSBzbyBuZXh0IGdldEluc3RhbmNlIGNhbGwga25vd3MgdG8gY3JlYXRlIGEgbmV3IG9uZQorICAgIE11dGV4OjpBdXRvbG9jayBfc2woc0xvY2spOworICAgIHNJbnN0YW5jZSA9IG51bGxwdHI7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUNhbWVyYVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtQ2FtZXJhU2VydmljZS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT5yZW1vdmVMaXN0ZW5lcihtQ2FtZXJhU2VydmljZUxpc3RlbmVyKTsKKyAgICB9CisgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKKyAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgIH0KKyAgICBtQ2JMb29wZXIuY2xlYXIoKTsKKyAgICBtSGFuZGxlci5jbGVhcigpOworICAgIG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY2xlYXIoKTsKKyAgICBtQ2FtZXJhU2VydmljZS5jbGVhcigpOworfQorCitzdGF0aWMgYm9vbCBpc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpIHsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJjb25maWcuZGlzYWJsZV9jYW1lcmFzZXJ2aWNlIiwgdmFsdWUsICIwIik7CisgICAgcmV0dXJuIChzdHJuY21wKHZhbHVlLCAiMCIsIDIpICE9IDAgJiYgc3RybmNhc2VjbXAodmFsdWUsICJmYWxzZSIsIDYpICE9IDApOworfQorCitib29sIENhbWVyYU1hbmFnZXJHbG9iYWw6OnNldHVwVmVuZG9yVGFncygpIHsKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU+IHRhZ0NhY2hlID0gbmV3IFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZSgpOworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgIHN0ZDo6dmVjdG9yPFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucz4gcHJvdmlkZXJJZHNBbmRWdHM7CisgICAgYXV0byByZW1vdGVSZXQgPSBtQ2FtZXJhU2VydmljZS0+Z2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnMoWyZzdGF0dXMsICZwcm92aWRlcklkc0FuZFZ0c10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byAmSWRzQW5kVnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJJZHNBbmRWdHMgPSBJZHNBbmRWdHM7IH0pOworCisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgVmVuZG9yVGFnU2VjdGlvbnMgJXMiLCByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBDb252ZXJ0IGVhY2ggcHJvdmlkZXJzIFZlbmRvclRhZ1NlY3Rpb25zIGludG8gYSBWZW5kb3JUYWdEZXNjcmlwdG9yIGFuZAorICAgIC8vIGFkZCBpdCB0byB0aGUgY2FjaGUKKyAgICBmb3IgKGF1dG8gJnByb3ZpZGVySWRBbmRWdHMgOiBwcm92aWRlcklkc0FuZFZ0cykgeworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiB2ZW5kb3JUYWdEZXNjcmlwdG9yOworICAgICAgICBpZiAoSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbChwcm92aWRlcklkQW5kVnRzLnZlbmRvclRhZ1NlY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVuZG9yVGFnRGVzY3JpcHRvcikgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29udmVydCBmcm9tIEhpZGw6IFZlbmRvclRhZ0Rlc2NyaXB0b3IiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0YWdDYWNoZS0+YWRkVmVuZG9yRGVzY3JpcHRvcihwcm92aWRlcklkQW5kVnRzLnByb3ZpZGVySWQsIHZlbmRvclRhZ0Rlc2NyaXB0b3IpOworICAgIH0KKyAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OnNldEFzR2xvYmFsVmVuZG9yVGFnQ2FjaGUodGFnQ2FjaGUpOworICAgIHJldHVybiB0cnVlOworfQorCitzcDxJQ2FtZXJhU2VydmljZT4gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0Q2FtZXJhU2VydmljZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQ2FtZXJhU2VydmljZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChpc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbWVyYVNlcnZpY2U7CisgICAgICAgIH0KKworICAgICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY2FtZXJhU2VydmljZUJpbmRlcjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgY2FtZXJhU2VydmljZUJpbmRlciA9IElDYW1lcmFTZXJ2aWNlOjpnZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBpZiAoY2FtZXJhU2VydmljZUJpbmRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZSBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7CisgICAgICAgICAgICB1c2xlZXAoa0NhbWVyYVNlcnZpY2VQb2xsRGVsYXkpOworICAgICAgICB9IHdoaWxlKHRydWUpOworICAgICAgICBpZiAobURlYXRoTm90aWZpZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmFTZXJ2aWNlQmluZGVyLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgMCk7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlID0gY2FtZXJhU2VydmljZUJpbmRlcjsKKworICAgICAgICAvLyBTZXR1cCBsb29wZXIgdGhyZWFkIHRvIHBlcmZyb20gYXZhaWxpYWJpbGl0eSBjYWxsYmFja3MKKyAgICAgICAgaWYgKG1DYkxvb3BlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiQzJOLW1nci1sb29wZXIiKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1DYkxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICAgICAgICAgIC8qcnVuT25DYWxsaW5nVGhyZWFkKi9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLypjYW5DYWxsSmF2YSovICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IGNhbWVyYSBzZXJ2aWNlIGxpc3RlbmVyIGxvb3BlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICAgICAgICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1IYW5kbGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYkxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlZ2lzdGVyIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIKKyAgICAgICAgaWYgKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IG5ldyBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgaGlkbF92ZWM8Q2FtZXJhU3RhdHVzQW5kSWQ+IGNhbWVyYVN0YXR1c2Vze307CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgICAgICBhdXRvIHJlbW90ZVJldCA9IG1DYW1lcmFTZXJ2aWNlLT5hZGRMaXN0ZW5lcihtQ2FtZXJhU2VydmljZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmNhbWVyYVN0YXR1c2VzXShTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byAmcmV0U3RhdHVzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFTdGF0dXNlcyA9IHJldFN0YXR1c2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFkZCBsaXN0ZW5lciB0byBjYW1lcmEgc2VydmljZSAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0dXAgdmVuZG9yIHRhZ3MKKyAgICAgICAgaWYgKCFzZXR1cFZlbmRvclRhZ3MoKSkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgdXAgdmVuZG9yIHRhZ3MiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBjIDogY2FtZXJhU3RhdHVzZXMpIHsKKyAgICAgICAgICAgIG9uU3RhdHVzQ2hhbmdlZExvY2tlZChjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbUNhbWVyYVNlcnZpY2U7Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6RGVhdGhOb3RpZmllcjo6c2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxJQmFzZT4gJndobykgeworICAgICh2b2lkKSBjb29raWU7CisgICAgKHZvaWQpIHdobzsKKyAgICBBTE9HRSgiQ2FtZXJhIHNlcnZpY2UgYmluZGVyRGllZCEiKTsKKyAgICBzcDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBjbSA9IG1DYW1lcmFNYW5hZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoY20gIT0gbnVsbHB0cikgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhjbS0+bUxvY2spOworICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBjbS0+bURldmljZVN0YXR1c01hcCkgeworICAgICAgICAgICAgQ2FtZXJhU3RhdHVzQW5kSWQgY2FtZXJhU3RhdHVzQW5kSWQ7CisgICAgICAgICAgICBjYW1lcmFTdGF0dXNBbmRJZC5jYW1lcmFJZCA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICBjYW1lcmFTdGF0dXNBbmRJZC5kZXZpY2VTdGF0dXMgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIGNtLT5vblN0YXR1c0NoYW5nZWRMb2NrZWQoY2FtZXJhU3RhdHVzQW5kSWQpOworICAgICAgICB9CisgICAgICAgIGNtLT5tQ2FtZXJhU2VydmljZS5jbGVhcigpOworICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBhZGRpbmcgcmUtY29ubmVjdCBjYWxsIGhlcmU/CisgICAgfQorfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIENhbGxiYWNrIGNiKGNhbGxiYWNrKTsKKyAgICBhdXRvIHBhaXIgPSBtQ2FsbGJhY2tzLmluc2VydChjYik7CisgICAgLy8gU2VuZCBpbml0aWFsIGNhbGxiYWNrcyBpZiBjYWxsYmFjayBpcyBuZXdseSByZWdpc3RlcmVkCisgICAgaWYgKHBhaXIuc2Vjb25kKSB7CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IG1EZXZpY2VTdGF0dXNNYXApIHsKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzID0gcGFpci5zZWNvbmQ7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU2luZ2xlQ2FsbGJhY2ssIG1IYW5kbGVyKTsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIGNiID0gaXNTdGF0dXNBdmFpbGFibGUoc3RhdHVzKSA/CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLT5vbkNhbWVyYUF2YWlsYWJsZSA6IGNhbGxiYWNrLT5vbkNhbWVyYVVuYXZhaWxhYmxlOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCAqKSBjYik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNhbGxiYWNrLT5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKGtDYW1lcmFJZEtleSwgQVN0cmluZyhjYW1lcmFJZC5jX3N0cigpKSk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjp1bnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIENhbGxiYWNrIGNiKGNhbGxiYWNrKTsKKyAgICBtQ2FsbGJhY2tzLmVyYXNlKGNiKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFJZExpc3Qoc3RkOjp2ZWN0b3I8aGlkbF9zdHJpbmc+KiBjYW1lcmFJZHMpIHsKKyAgICAvLyBFbnN1cmUgdGhhdCB3ZSBoYXZlIGluaXRpYWxpemVkL3JlZnJlc2hlZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZGV2aWNlcworICAgIGF1dG8gY3MgPSBnZXRDYW1lcmFTZXJ2aWNlKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIGZvcihhdXRvJiBkZXZpY2VTdGF0dXMgOiBtRGV2aWNlU3RhdHVzTWFwKSB7CisgICAgICAgIGlmIChkZXZpY2VTdGF0dXMuc2Vjb25kID09IENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9QUkVTRU5UIHx8CisgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzLnNlY29uZCA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19FTlVNRVJBVElORykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhSWRzLT5wdXNoX2JhY2soZGV2aWNlU3RhdHVzLmZpcnN0KTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6dmFsaWRTdGF0dXMoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQ6CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDoKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19FTlVNRVJBVElORzoKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfQVZBSUxBQkxFOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIENhbWVyYU1hbmFnZXJHbG9iYWw6OmlzU3RhdHVzQXZhaWxhYmxlKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1BSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Q2FsbGJhY2tIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTZW5kU2luZ2xlQ2FsbGJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIGNiOworICAgICAgICAgICAgdm9pZCogY29udGV4dDsKKyAgICAgICAgICAgIEFTdHJpbmcgY2FtZXJhSWQ7CisgICAgICAgICAgICBib29sIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJmNiKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbWVyYSBjYWxsYmFjayBmcCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ29udGV4dEtleSwgJmNvbnRleHQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FsbGJhY2sgY29udGV4dCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKGtDYW1lcmFJZEtleSwgJmNhbWVyYUlkKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbWVyYSBJRCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqY2IpKGNvbnRleHQsIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogdW5rbm93biBtZXNzYWdlIHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSB7CisgICAgc3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gY20gPSBtQ2FtZXJhTWFuYWdlci5wcm9tb3RlKCk7CisgICAgaWYgKGNtICE9IG51bGxwdHIpIHsKKyAgICAgICAgY20tPm9uU3RhdHVzQ2hhbmdlZChzdGF0dXNBbmRJZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBkZWxpdmVyIHN0YXR1cyBjaGFuZ2UuIEdsb2JhbCBjYW1lcmEgbWFuYWdlciBkaWVkIik7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6b25TdGF0dXNDaGFuZ2VkKAorICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG9uU3RhdHVzQ2hhbmdlZExvY2tlZChzdGF0dXNBbmRJZCk7Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6b25TdGF0dXNDaGFuZ2VkTG9ja2VkKAorICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIHsKKyAgICBoaWRsX3N0cmluZyBjYW1lcmFJZCA9IHN0YXR1c0FuZElkLmNhbWVyYUlkOworICAgIENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMgPSBzdGF0dXNBbmRJZC5kZXZpY2VTdGF0dXM7CisgICAgaWYgKCF2YWxpZFN0YXR1cyhzdGF0dXMpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGZpcnN0U3RhdHVzID0gKG1EZXZpY2VTdGF0dXNNYXAuY291bnQoY2FtZXJhSWQpID09IDApOworICAgIENhbWVyYURldmljZVN0YXR1cyBvbGRTdGF0dXMgPSBmaXJzdFN0YXR1cyA/CisgICAgICAgICAgICBzdGF0dXMgOiAvLyBmaXJzdCBzdGF0dXMKKyAgICAgICAgICAgIG1EZXZpY2VTdGF0dXNNYXBbY2FtZXJhSWRdOworCisgICAgaWYgKCFmaXJzdFN0YXR1cyAmJgorICAgICAgICAgICAgaXNTdGF0dXNBdmFpbGFibGUoc3RhdHVzKSA9PSBpc1N0YXR1c0F2YWlsYWJsZShvbGRTdGF0dXMpKSB7CisgICAgICAgIC8vIE5vIHN0YXR1cyB1cGRhdGUuIE5vIG5lZWQgdG8gc2VuZCBjYWxsYmFjaworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcworICAgIG1EZXZpY2VTdGF0dXNNYXBbY2FtZXJhSWRdID0gc3RhdHVzOworICAgIGZvciAoYXV0byBjYiA6IG1DYWxsYmFja3MpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTaW5nbGVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBjYkZwID0gaXNTdGF0dXNBdmFpbGFibGUoc3RhdHVzKSA/CisgICAgICAgICAgICAgICAgY2IubUF2YWlsYWJsZSA6IGNiLm1VbmF2YWlsYWJsZTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCAqKSBjYkZwKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYi5tQ29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0U3RyaW5nKGtDYW1lcmFJZEtleSwgQVN0cmluZyhjYW1lcmFJZC5jX3N0cigpKSk7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9QUkVTRU5UKSB7CisgICAgICAgIG1EZXZpY2VTdGF0dXNNYXAuZXJhc2UoY2FtZXJhSWQpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvKioKKyAqIEFDYW1lcmFNYW5nZXIgSW1wbGVtZW50YXRpb24KKyAqLworY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhTWFuYWdlcjo6Z2V0Q2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqKiBjYW1lcmFJZExpc3QpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3RkOjp2ZWN0b3I8aGlkbF9zdHJpbmc+IGlkTGlzdDsKKyAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYUlkTGlzdCgmaWRMaXN0KTsKKworICAgIGludCBudW1DYW1lcmFzID0gaWRMaXN0LnNpemUoKTsKKyAgICBBQ2FtZXJhSWRMaXN0ICpvdXQgPSBuZXcgQUNhbWVyYUlkTGlzdDsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBBTE9HRSgiQWxsb2NhdGUgbWVtb3J5IGZvciBBQ2FtZXJhSWRMaXN0IGZhaWxlZCEiKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgfQorICAgIG91dC0+bnVtQ2FtZXJhcyA9IG51bUNhbWVyYXM7CisgICAgb3V0LT5jYW1lcmFJZHMgPSBuZXcgY29uc3QgY2hhcipbbnVtQ2FtZXJhc107CisgICAgaWYgKCFvdXQtPmNhbWVyYUlkcykgeworICAgICAgICBBTE9HRSgiQWxsb2NhdGUgbWVtb3J5IGZvciBBQ2FtZXJhSWRMaXN0IGZhaWxlZCEiKTsKKyAgICAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KG91dCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX05PVF9FTk9VR0hfTUVNT1JZOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyKiBzcmMgPSBpZExpc3RbaV0uY19zdHIoKTsKKyAgICAgICAgc2l6ZV90IGRzdFNpemUgPSBzdHJsZW4oc3JjKSArIDE7CisgICAgICAgIGNoYXIqIGRzdCA9IG5ldyBjaGFyW2RzdFNpemVdOworICAgICAgICBpZiAoIWRzdCkgeworICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRlIG1lbW9yeSBmb3IgQUNhbWVyYUlkTGlzdCBmYWlsZWQhIik7CisgICAgICAgICAgICBkZWxldGVDYW1lcmFJZExpc3Qob3V0KTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX05PVF9FTk9VR0hfTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHN0cmxjcHkoZHN0LCBzcmMsIGRzdFNpemUpOworICAgICAgICBvdXQtPmNhbWVyYUlkc1tpXSA9IGRzdDsKKyAgICB9CisgICAgKmNhbWVyYUlkTGlzdCA9IG91dDsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwordm9pZAorQUNhbWVyYU1hbmFnZXI6OmRlbGV0ZUNhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiBjYW1lcmFJZExpc3QpIHsKKyAgICBpZiAoY2FtZXJhSWRMaXN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzOyBpICsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRlW10gY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHM7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGNhbWVyYUlkTGlzdDsKKyAgICB9Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZFN0ciwgc3A8QUNhbWVyYU1ldGFkYXRhPiAqY2hhcmFjdGVyaXN0aWNzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIGlmIChjcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IHJlYWNoIGNhbWVyYSBzZXJ2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorICAgIENhbWVyYU1ldGFkYXRhIHJhd01ldGFkYXRhOworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgIGF1dG8gc2VydmljZVJldCA9CisgICAgICAgIGNzLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZyYXdNZXRhZGF0YV0gKGF1dG8gcyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQobWV0YWRhdGEsICZyYXdNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZnJvbSBjYW1lcmEgc2VydmljZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsgLy8gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisgICAgfQorCisgICAgKmNoYXJhY3RlcmlzdGljcyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoCisgICAgICAgICAgICByYXdNZXRhZGF0YS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX0NIQVJBQ1RFUklTVElDUyk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQUNhbWVyYU1hbmFnZXI6Om9wZW5DYW1lcmEoCisgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLAorICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKKyAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBvdXREZXZpY2UpIHsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJhd0NoYXJzOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsICZyYXdDaGFycyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGNhbWVyYSAlcy4gZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLCByZXQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UgPSBuZXcgQUNhbWVyYURldmljZShjYW1lcmFJZCwgY2FsbGJhY2ssIHN0ZDo6bW92ZShyYXdDaGFycykpOworCisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CisgICAgaWYgKGNzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgcmVhY2ggY2FtZXJhIHNlcnZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisKKyAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrcyA9IGRldmljZS0+Z2V0U2VydmljZUNhbGxiYWNrKCk7CisgICAgc3A8SUNhbWVyYURldmljZVVzZXI+IGRldmljZVJlbW90ZTsKKworICAgIC8vIE5vIHdheSB0byBnZXQgcGFja2FnZSBuYW1lIGZyb20gbmF0aXZlLgorICAgIC8vIFNlbmQgYSB6ZXJvIGxlbmd0aCBwYWNrYWdlIG5hbWUgYW5kIGxldCBjYW1lcmEgc2VydmljZSBmaWd1cmUgaXQgb3V0IGZyb20gVUlECisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgYXV0byBzZXJ2aWNlUmV0ID0gY3MtPmNvbm5lY3REZXZpY2UoCisgICAgICAgICAgICBjYWxsYmFja3MsIGNhbWVyYUlkLCBbJnN0YXR1cywgJmRldmljZVJlbW90ZV0oYXV0byBzLCBhdXRvICZkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVJlbW90ZSA9IGRldmljZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IGNvbm5lY3QgY2FtZXJhIGRldmljZSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAvLyBUT0RPOiBDb252ZXJ0IHNlcnZpY2VSZXQgdG8gY2FtZXJhX3N0YXR1c190CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgIGlmIChkZXZpY2VSZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNvbm5lY3QgY2FtZXJhIGRldmljZSBmYWlsZWQhIHJlbW90ZSBkZXZpY2UgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorICAgIGRldmljZS0+c2V0UmVtb3RlRGV2aWNlKGRldmljZVJlbW90ZSk7CisgICAgZGV2aWNlLT5zZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgICpvdXREZXZpY2UgPSBkZXZpY2U7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK0FDYW1lcmFNYW5hZ2VyOjp+QUNhbWVyYU1hbmFnZXIoKSB7CisKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjkzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQUNBTUVSQV9NQU5BR0VSX0gKKyNkZWZpbmUgX0FDQU1FUkFfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKworI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBJQ2FtZXJhU2VydmljZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlOwordXNpbmcgQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwordXNpbmcgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOwordXNpbmcgU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBWZW5kb3JUYWdTZWN0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWdTZWN0aW9uOwordXNpbmcgVmVuZG9yVGFnID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWc7Cit1c2luZyBJQmFzZSA9IGFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7CisKKy8qKgorICogUGVyLXByb2Nlc3Mgc2luZ2xldG9uIGluc3RhbmNlIG9mIENhbWVyYU1hbmdlci4gU2hhcmVkIGJ5IGFsbCBBQ2FtZXJhTWFuYWdlcgorICogaW5zdGFuY2VzLiBDcmVhdGVkIHdoZW4gZmlyc3QgQUNhbWVyYU1hbmFnZXIgaXMgY3JlYXRlZCBhbmQgZGVzdHJveWVkIHdoZW4KKyAqIGFsbCBBQ2FtZXJhTWFuYWdlciBpbnN0YW5jZXMgYXJlIGRlbGV0ZWQuCisgKgorICogVE9ETzogbWF5YmUgQ2FtZXJhTWFuYWdlckdsb2JhbCBpcyBiZXR0ZXIgc3VpdGVkIGluIGxpYmNhbWVyYWNsaWVudD8KKyAqLworY2xhc3MgQ2FtZXJhTWFuYWdlckdsb2JhbCBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBDYW1lcmFNYW5hZ2VyR2xvYmFsJiBnZXRJbnN0YW5jZSgpOworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBnZXRDYW1lcmFTZXJ2aWNlKCk7CisKKyAgICB2b2lkIHJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spOworCisgICAgdm9pZCByZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogLypjYWxsYmFjayovKSB7fQorICAgIHZvaWQgdW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogLypjYWxsYmFjayovKSB7fQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGNhbWVyYSBJRHMgdGhhdCBzdXBwb3J0IGNhbWVyYTIKKyAgICAgKi8KKyAgICB2b2lkIGdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4gKmNhbWVyYUlkcyk7CisKKyAgcHJpdmF0ZToKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gbUNhbWVyYVNlcnZpY2U7CisgICAgY29uc3QgaW50ICAgICAgICAgIGtDYW1lcmFTZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCisgICAgTXV0ZXggICAgICAgICAgICAgIG1Mb2NrOworICAgIGNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgRGVhdGhOb3RpZmllcihDYW1lcmFNYW5hZ2VyR2xvYmFsKiBjbSkgOiBtQ2FtZXJhTWFuYWdlcihjbSkge30KKyAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8SUJhc2U+ICZ3aG8pOworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUNhbWVyYU1hbmFnZXI7CisgICAgfTsKKyAgICBzcDxEZWF0aE5vdGlmaWVyPiBtRGVhdGhOb3RpZmllcjsKKworICAgIGNsYXNzIENhbWVyYVNlcnZpY2VMaXN0ZW5lciBmaW5hbCA6IHB1YmxpYyBJQ2FtZXJhU2VydmljZUxpc3RlbmVyIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ2FtZXJhU2VydmljZUxpc3RlbmVyKENhbWVyYU1hbmFnZXJHbG9iYWwqIGNtKSA6IG1DYW1lcmFNYW5hZ2VyKGNtKSB7fQorICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgb3ZlcnJpZGU7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHdwPENhbWVyYU1hbmFnZXJHbG9iYWw+IG1DYW1lcmFNYW5hZ2VyOworICAgIH07CisgICAgc3A8Q2FtZXJhU2VydmljZUxpc3RlbmVyPiBtQ2FtZXJhU2VydmljZUxpc3RlbmVyOworCisgICAgLy8gV3JhcHBlciBvZiBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mgc28gd2UgY2FuIHN0b3JlIGl0IGluIHN0ZDo6c2V0CisgICAgc3RydWN0IENhbGxiYWNrIHsKKyAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2soY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgOgorICAgICAgICAgICAgbUF2YWlsYWJsZShjYWxsYmFjay0+b25DYW1lcmFBdmFpbGFibGUpLAorICAgICAgICAgICAgbVVuYXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYVVuYXZhaWxhYmxlKSwKKyAgICAgICAgICAgIG1Db250ZXh0KGNhbGxiYWNrLT5jb250ZXh0KSB7fQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIChtQXZhaWxhYmxlID09IG90aGVyLm1BdmFpbGFibGUgJiYKKyAgICAgICAgICAgICAgICAgICAgbVVuYXZhaWxhYmxlID09IG90aGVyLm1VbmF2YWlsYWJsZSAmJgorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dCA9PSBvdGhlci5tQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG90aGVyLm1Db250ZXh0KSByZXR1cm4gbUNvbnRleHQgPCBvdGhlci5tQ29udGV4dDsKKyAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlICE9IG90aGVyLm1BdmFpbGFibGUpIHJldHVybiBtQXZhaWxhYmxlIDwgb3RoZXIubUF2YWlsYWJsZTsKKyAgICAgICAgICAgIHJldHVybiBtVW5hdmFpbGFibGUgPCBvdGhlci5tVW5hdmFpbGFibGU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIgJiYgISgqdGhpcyA8IG90aGVyKSk7CisgICAgICAgIH0KKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgbUF2YWlsYWJsZTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgbVVuYXZhaWxhYmxlOworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKKyAgICB9OworICAgIHN0ZDo6c2V0PENhbGxiYWNrPiBtQ2FsbGJhY2tzOworCisgICAgLy8gZGVmaW5pdGlvbiBvZiBoYW5kbGVyIGFuZCBtZXNzYWdlCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbWVyYUlkS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FsbGJhY2tGcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHRLZXk7CisgICAgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKCkge30KKyAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgfTsKKyAgICBzcDxDYWxsYmFja0hhbmRsZXI+IG1IYW5kbGVyOworICAgIHNwPEFMb29wZXI+ICAgICAgICAgbUNiTG9vcGVyOyAvLyBMb29wZXIgdGhyZWFkIHdoZXJlIGNhbGxiYWNrcyBhY3R1YWxseSBoYXBwZW4gb24KKworICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkKGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCk7CisgICAgdm9pZCBvblN0YXR1c0NoYW5nZWRMb2NrZWQoY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKTsKKyAgICBib29sIHNldHVwVmVuZG9yVGFncygpOworCisgICAgLy8gVXRpbHMgZm9yIHN0YXR1cworICAgIHN0YXRpYyBib29sIHZhbGlkU3RhdHVzKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBib29sIGlzU3RhdHVzQXZhaWxhYmxlKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOworCisgICAgLy8gVGhlIHNvcnQgbG9naWMgbXVzdCBtYXRjaCB0aGUgbG9naWMgaW4KKyAgICAvLyBsaWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwOjpnZXRBUEkxQ29tcGF0aWJsZUNhbWVyYURldmljZUlkcworICAgIHN0cnVjdCBDYW1lcmFJZENvbXBhcmF0b3IgeworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgaGlkbF9zdHJpbmcmIGEsIGNvbnN0IGhpZGxfc3RyaW5nJiBiKSBjb25zdCB7CisgICAgICAgICAgICB1aW50MzJfdCBhVWludCA9IDAsIGJVaW50ID0gMDsKKyAgICAgICAgICAgIGJvb2wgYUlzVWludCA9IGJhc2U6OlBhcnNlVWludChhLmNfc3RyKCksICZhVWludCk7CisgICAgICAgICAgICBib29sIGJJc1VpbnQgPSBiYXNlOjpQYXJzZVVpbnQoYi5jX3N0cigpLCAmYlVpbnQpOworCisgICAgICAgICAgICAvLyBVaW50IGRldmljZSBJRHMgZmlyc3QKKyAgICAgICAgICAgIGlmIChhSXNVaW50ICYmIGJJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYVVpbnQgPCBiVWludDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYUlzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChiSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2ltcGxlIHN0cmluZyBjb21wYXJlIGlmIGJvdGggaWQgYXJlIG5vdCB1aW50CisgICAgICAgICAgICByZXR1cm4gYSA8IGI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTWFwIGNhbWVyYV9pZCAtPiBzdGF0dXMKKyAgICBzdGQ6Om1hcDxoaWRsX3N0cmluZywgQ2FtZXJhRGV2aWNlU3RhdHVzLCBDYW1lcmFJZENvbXBhcmF0b3I+IG1EZXZpY2VTdGF0dXNNYXA7CisKKyAgICAvLyBGb3IgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorICAgIHN0YXRpYyBNdXRleCBzTG9jazsKKyAgICBzdGF0aWMgQ2FtZXJhTWFuYWdlckdsb2JhbCogc0luc3RhbmNlOworICAgIENhbWVyYU1hbmFnZXJHbG9iYWwoKSB7fTsKKyAgICB+Q2FtZXJhTWFuYWdlckdsb2JhbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYWNhbTsKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8qKgorICogQUNhbWVyYU1hbmFnZXIgb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBMZWF2ZSBvdXRzaWRlIG9mIGFuZHJvaWQgbmFtZXNwYWNlIGJlY2F1c2UgaXQncyBOREsgc3RydWN0CisgKi8KK3N0cnVjdCBBQ2FtZXJhTWFuYWdlciB7CisgICAgQUNhbWVyYU1hbmFnZXIoKSA6CisgICAgICAgICAgICBtR2xvYmFsTWFuYWdlcigmKGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkpKSB7fQorICAgIH5BQ2FtZXJhTWFuYWdlcigpOworICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCk7CisgICAgc3RhdGljIHZvaWQgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiBjYW1lcmFJZExpc3QpOworCisgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBhbmRyb2lkOjpzcDxBQ2FtZXJhTWV0YWRhdGE+KiBjaGFyYWN0ZXJpc3RpY3MpOworCisgICAgY2FtZXJhX3N0YXR1c190IG9wZW5DYW1lcmEoY29uc3QgY2hhciogY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtDYW1lcmFJZExpc3ROb3RJbml0ID0gLTEKKyAgICB9OworICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgbUxvY2s7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUdsb2JhbE1hbmFnZXI7Cit9OworCisjZW5kaWYgLy9fQUNBTUVSQV9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2NzYxNQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RydWN0IEFDYW1lcmFPdXRwdXRUYXJnZXQgeworICAgIGV4cGxpY2l0IEFDYW1lcmFPdXRwdXRUYXJnZXQobmF0aXZlX2hhbmRsZV90KiB3aW5kb3cpIDogbVdpbmRvdyh3aW5kb3cpIHt9OworCisgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgIT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA8IG90aGVyLm1XaW5kb3c7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPiBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGFuZHJvaWQ6OmFjYW06OnV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG1XaW5kb3c7Cit9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMmQ0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFDYW1lcmFWZW5kb3JVdGlscyIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworbmFtZXNwYWNlIHV0aWxzIHsKKworLy8gQ29udmVydCBDYXB0dXJlUmVxdWVzdCB3cmFwcGFibGUgYnkgc3A8PiB0byBoaWRsIENhcHR1cmVSZXF1ZXN0LgorZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdAorY29udmVydFRvSGlkbChjb25zdCBDYXB0dXJlUmVxdWVzdCAqY2FwdHVyZVJlcXVlc3QpIHsKKyAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0IGhDYXB0dXJlUmVxdWVzdDsKKyAgICBoQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGNhcHR1cmVSZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKKyAgICBoQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzID0gY2FwdHVyZVJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHM7CisgICAgcmV0dXJuIGhDYXB0dXJlUmVxdWVzdDsKK30KKworSFJvdGF0aW9uIGNvbnZlcnRUb0hpZGwoaW50IHJvdGF0aW9uKSB7CisgICAgSFJvdGF0aW9uIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjA7CisgICAgc3dpdGNoKHJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fOTA6CisgICAgICAgICAgICBoUm90YXRpb24gPSBIUm90YXRpb246OlI5MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzI3MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjI3MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBoUm90YXRpb247Cit9CisKK2Jvb2wgY29udmVydEZyb21IaWRsQ2xvbmVkKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsIENhbWVyYU1ldGFkYXRhICpyYXdNZXRhZGF0YSkgeworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqYnVmZmVyID0gKGNhbWVyYV9tZXRhZGF0YV90KikobWV0YWRhdGEuZGF0YSgpKTsKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgIGludCByZXQgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAqcmF3TWV0YWRhdGEgPSBidWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gY2FsbGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KSB7CisgICAgaWYgKHNyYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IHNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc3JjKTsKKyAgICBkc3QtPnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QgKikgc3JjLCBzaXplKTsKKyAgICByZXR1cm47Cit9CisKK1RlbXBsYXRlSWQgY29udmVydFRvSGlkbChBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCkgeworICAgIHN3aXRjaCh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpTVElMTF9DQVBUVVJFOworICAgICAgICBjYXNlIFRFTVBMQVRFX1JFQ09SRDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpSRUNPUkQ7CisgICAgICAgIGNhc2UgVEVNUExBVEVfVklERU9fU05BUFNIT1Q6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6VklERU9fU05BUFNIT1Q7CisgICAgICAgIGNhc2UgVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpaRVJPX1NIVVRURVJfTEFHOworICAgICAgICBjYXNlIFRFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpNQU5VQUw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6UFJFVklFVzsKKyAgICB9Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBjb252ZXJ0RnJvbUhpZGwoU3RhdHVzIHN0YXR1cykgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBBQ0FNRVJBX09LOworICAgIHN3aXRjaChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpESVNDT05ORUNURUQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRToKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfTUFYX0NBTUVSQV9JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpERVBSRUNBVEVEX0hBTDoKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgcmVhY2ggaGVyZSBzaW5jZSB3ZSBmaWx0ZXJlZCBsZWdhY3kgSEFMcyBlYXJsaWVyCisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpESVNBQkxFRDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0FCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpQRVJNSVNTSU9OX0RFTklFRDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpIHsKKyAgICBpZiAobmgxLT5udW1GZHMgIT0wIHx8IG5oMi0+bnVtRmRzICE9MCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCB3aW5kb3cgbmF0aXZlIGhhbmRsZXMgYmVpbmcgY29tcGFyZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobmgxLT52ZXJzaW9uICE9IG5oMi0+dmVyc2lvbiB8fCBuaDEtPm51bUZkcyAhPSBuaDItPm51bUZkcyB8fAorICAgICAgICBuaDEtPm51bUludHMgIT0gbmgyLT5udW1JbnRzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuaDEtPm51bUludHM7IGkrKykgeworICAgICAgICBpZihuaDEtPmRhdGFbaV0gIT0gbmgyLT5kYXRhW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpIHsKKyAgICBpZiAoaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChuaDEsIG5oMikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobmgxLT5udW1JbnRzICE9IG5oMi0+bnVtSW50cykgeworICAgICAgICByZXR1cm4gbmgxLT5udW1JbnRzIDwgbmgyLT5udW1JbnRzOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmgxLT5udW1JbnRzOyBpKyspIHsKKyAgICAgICAgaWYgKG5oMS0+ZGF0YVtpXSAhPSBuaDItPmRhdGFbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBuaDEtPmRhdGFbaV0gPCBuaDItPmRhdGFbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlR3JlYXRlclRoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKSB7CisgICAgcmV0dXJuICFpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKG5oMSwgbmgyKSAmJiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChuaDEsIG5oMik7Cit9CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0VxdWFsKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMyKSB7CisgICAgaWYgKGhhbmRsZXMxLnNpemUoKSAhPSBoYW5kbGVzMi5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMxLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICghaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChoYW5kbGVzMVtpXSwgaGFuZGxlczJbaV0pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0xlc3NUaGFuKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+aGFuZGxlczIpIHsKKyAgICBpZiAoaGFuZGxlczEuc2l6ZSgpICE9IGhhbmRsZXMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gaGFuZGxlczEuc2l6ZSgpIDwgaGFuZGxlczIuc2l6ZSgpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMxLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlMSA9IGhhbmRsZXMxW2ldLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZTIgPSBoYW5kbGVzMltpXS5nZXROYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgaWYgKCFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGhhbmRsZTEsIGhhbmRsZTIpKSB7CisgICAgICAgICAgICByZXR1cm4gaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihoYW5kbGUxLCBoYW5kbGUyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjEwMDZkCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgorCisjaWZuZGVmIENBTUVSQV9OREtfVkVORE9SX0gKKyNkZWZpbmUgQ0FNRVJBX05ES19WRU5ET1JfSAorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIENhbWVyYU1ldGFkYXRhID0gaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhbWVyYU1ldGFkYXRhICA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBUZW1wbGF0ZUlkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpUZW1wbGF0ZUlkOwordXNpbmcgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIEhSb3RhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb247Cit1c2luZyBPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOworCisvLyBVdGlsaXR5IGNsYXNzIHNvIHRoYXQgQ2FwdHVyZVJlcXVlc3QgY2FuIGJlIHN0b3JlZCBieSBzcDw+CitzdHJ1Y3QgQ2FwdHVyZVJlcXVlc3QgOiBwdWJsaWMgUmVmQmFzZSB7CisgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgbUNhcHR1cmVSZXF1ZXN0OworICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QgKj4gbVN1cmZhY2VMaXN0OworICAvL1BoeXNpY2FsIGNhbWVyYSBzZXR0aW5ncyBtZXRhZGF0YSBpcyBzdG9yZWQgaGVyZSwgc2luY2UgdGhlIGNhcHR1cmUgcmVxdWVzdAorICAvL21pZ2h0IG5vdCBjb250YWluIGl0LiBUaGF0J3Mgc2luY2UsIGZtcSBtaWdodCBoYXZlIGNvbnN1bWVkIGl0LgorICBoaWRsX3ZlYzxQaHlzaWNhbENhbWVyYVNldHRpbmdzPiBtUGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK307CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0VxdWFsKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+aGFuZGxlczIpOworCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNMZXNzVGhhbihoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPmhhbmRsZXMyKTsKKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMik7CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpOworCisvLyBDb252ZW5pZW5jZSB3cmFwcGVyIG92ZXIgaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbiBhbmQgaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbAorYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUdyZWF0ZXJUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMik7CisKKy8vIFV0aWxpdHkgY2xhc3Mgc28gdGhlIG5hdGl2ZV9oYW5kbGVfdCBjYW4gYmUgY29tcGFyZWQgd2l0aCAgaXRzIGNvbnRlbnRzIGluc3RlYWQKKy8vIG9mIGp1c3QgcmF3IHBvaW50ZXIgY29tcGFyaXNvbnMuCitzdHJ1Y3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciB7CisgICAgbmF0aXZlX2hhbmRsZV90ICptV2luZG93ID0gbnVsbHB0cjsKKworICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIobmF0aXZlX2hhbmRsZV90ICpuaCkgOiBtV2luZG93KG5oKSB7IH0KKworICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBvcGVyYXRvciBuYXRpdmVfaGFuZGxlX3QgKigpIGNvbnN0IHsgcmV0dXJuIG1XaW5kb3c7IH0KKworICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVHcmVhdGVyVGhhbihtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKK307CisKKy8vIFdyYXBwZXIgYXJvdW5kIE91dHB1dENvbmZpZ3VyYXRpb24uIFRoaXMgaXMgbmVlZGVkIHNpbmNlIEhJREwKKy8vIE91dHB1dENvbmZpZ3VyYXRpb24gaXMgYXV0by1nZW5lcmF0ZWQgYW5kIG1hcmtlZCBmaW5hbC4gVGhlcmVmb3JlLCBvcGVyYXRvcgorLy8gb3ZlcmxvYWRzIG91dHNpZGUgdGhlIGNsYXNzLCB3aWxsIG5vdCBnZXQgcGlja2VkIGJ5IGNsYW5nIHdoaWxlIHRyeWluZyB0bworLy8gc3RvcmUgT3V0cHV0Q29uZmlndXJhdGlvbiBpbiBtYXBzL3NldHMuCitzdHJ1Y3QgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIgeworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gbU91dHB1dENvbmZpZ3VyYXRpb247CisKKyAgICBvcGVyYXRvciBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICYoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyKE91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICA6IG1PdXRwdXRDb25maWd1cmF0aW9uKChvdXRwdXRDb25maWd1cmF0aW9uKSkgeyB9CisKKyAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJnNlbGYgPSBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgcmV0dXJuIHNlbGYucm90YXRpb24gPT0gb3RoZXIucm90YXRpb24gJiYgc2VsZi53aW5kb3dHcm91cElkID09IG90aGVyLndpbmRvd0dyb3VwSWQgJiYKKyAgICAgICAgICAgICAgICBzZWxmLnBoeXNpY2FsQ2FtZXJhSWQgPT0gb3RoZXIucGh5c2ljYWxDYW1lcmFJZCAmJiBzZWxmLndpZHRoID09IG90aGVyLndpZHRoICYmCisgICAgICAgICAgICAgICAgc2VsZi5oZWlnaHQgPT0gb3RoZXIuaGVpZ2h0ICYmIHNlbGYuaXNEZWZlcnJlZCA9PSBvdGhlci5pc0RlZmVycmVkICYmCisgICAgICAgICAgICAgICAgYXJlV2luZG93TmF0aXZlSGFuZGxlc0VxdWFsKHNlbGYud2luZG93SGFuZGxlcywgb3RoZXIud2luZG93SGFuZGxlcyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZzZWxmID0gbU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgICAgIGlmIChzZWxmLndpbmRvd0dyb3VwSWQgIT0gb3RoZXIud2luZG93R3JvdXBJZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYud2luZG93R3JvdXBJZCA8IG90aGVyLndpbmRvd0dyb3VwSWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi53aWR0aCAhPSBvdGhlci53aWR0aCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYud2lkdGggPCBvdGhlci53aWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLmhlaWdodCAhPSBvdGhlci5oZWlnaHQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmhlaWdodCA8IG90aGVyLmhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLnJvdGF0aW9uICE9IG90aGVyLnJvdGF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlbGYucm90YXRpb24pIDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG90aGVyLnJvdGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLmlzRGVmZXJyZWQgIT0gb3RoZXIuaXNEZWZlcnJlZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYuaXNEZWZlcnJlZCA8IG90aGVyLmlzRGVmZXJyZWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5waHlzaWNhbENhbWVyYUlkICE9IG90aGVyLnBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBoeXNpY2FsQ2FtZXJhSWQgPCBvdGhlci5waHlzaWNhbENhbWVyYUlkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzTGVzc1RoYW4oc2VsZi53aW5kb3dIYW5kbGVzLCBvdGhlci53aW5kb3dIYW5kbGVzKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKCp0aGlzICE9IG90aGVyKSAmJiAhKCp0aGlzIDwgb3RoZXIpOworICAgIH0KK307CisKKy8vIENvbnZlcnQgQ2FwdHVyZVJlcXVlc3Qgd3JhcHBhYmxlIGJ5IHNwPD4gdG8gaGlkbCBDYXB0dXJlUmVxdWVzdC4KK2ZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBDYXB0dXJlUmVxdWVzdCAqY2FwdHVyZVJlcXVlc3QpOworCitIUm90YXRpb24gY29udmVydFRvSGlkbChpbnQgcm90YXRpb24pOworCitib29sIGNvbnZlcnRGcm9tSGlkbENsb25lZChjb25zdCBIQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhLCBDYW1lcmFNZXRhZGF0YSAqcmF3TWV0YWRhdGEpOworCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpOworCitUZW1wbGF0ZUlkIGNvbnZlcnRUb0hpZGwoQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQpOworCitjYW1lcmFfc3RhdHVzX3QgY29udmVydEZyb21IaWRsKFN0YXR1cyBzdGF0dXMpOworCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0FNRVJBX05ES19WRU5ET1JfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTg5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKQEAgLTAsMCArMSw4MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFJbWFnZVJlYWRlclZlbmRvclRlc3QiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFFcnJvci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2VSZWFkZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPFZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga0R1bW15RmVuY2VGZCA9IC0xOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhcHR1cmVXYWl0VXMgPSAxMDAgKiAxMDAwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhcHR1cmVXYWl0UmV0cnkgPSAxMDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VIZWlnaHQgPSA0ODA7CitzdGF0aWMgY29uc3RleHByIGludCBrVGVzdEltYWdlRm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4ODsKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OlZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTsKKworY2xhc3MgQ2FtZXJhSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBDYW1lcmFIZWxwZXIoY29uc3QgY2hhciogaWQsIEFDYW1lcmFNYW5hZ2VyICptYW5hZ2VyKSA6CisgICAgICAgICAgICBtSW1nUmVhZGVyQW53KG51bGxwdHIpLCBtQ2FtZXJhSWQoaWQpLCBtQ2FtZXJhTWFuYWdlcihtYW5hZ2VyKSB7fQorICAgIH5DYW1lcmFIZWxwZXIoKSB7IGNsb3NlQ2FtZXJhKCk7IH0KKworICAgIHN0cnVjdCBQaHlzaWNhbEltZ1JlYWRlckluZm8geworICAgICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudzsKKyAgICB9OworICAgIGludCBpbml0Q2FtZXJhKG5hdGl2ZV9oYW5kbGVfdCogaW1nUmVhZGVyQW53LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxJbWdSZWFkZXJJbmZvPiYgcGh5c2ljYWxJbWdSZWFkZXJzLAorICAgICAgICAgICAgYm9vbCB1c2VQaHlzaWNhbFNldHRpbmdzKSB7CisgICAgICAgIGlmIChpbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBpbml0aWFsaXplIGNhbWVyYSBiZWZvcmUgaW1hZ2UgcmVhZGVyIGdldCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUlzQ2FtZXJhUmVhZHkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbml0Q2FtZXJhIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgbUltZ1JlYWRlckFudyA9IGltZ1JlYWRlckFudzsKKworICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9vcGVuQ2FtZXJhKG1DYW1lcmFNYW5hZ2VyLCBtQ2FtZXJhSWQsICZtRGV2aWNlQ2IsICZtRGV2aWNlKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbURldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gY2FtZXJhLCByZXQ9JWQsIG1EZXZpY2U9JXAuIiwgcmV0LCBtRGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSgmbU91dHB1dHMpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKG1JbWdSZWFkZXJBbncsICZtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZChtT3V0cHV0cywgbUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IGlkUG9pbnRlckxpc3Q7CisgICAgICAgIGZvciAoYXV0byYgcGh5c2ljYWxTdHJlYW0gOiBwaHlzaWNhbEltZ1JlYWRlcnMpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogc2Vzc2lvbk91dHB1dCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUocGh5c2ljYWxTdHJlYW0uYW53LAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFN0cmVhbS5waHlzaWNhbENhbWVyYUlkLCAmc2Vzc2lvbk91dHB1dCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uUGh5c2ljYWxPdXRwdXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZChtT3V0cHV0cywgc2Vzc2lvbk91dHB1dCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV4dHJhT3V0cHV0cy5wdXNoX2JhY2soc2Vzc2lvbk91dHB1dCk7CisgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBhdCBtb3N0IG9uZSBwaHlzaWNhbCBzdHJlYW0gcGVyIHBoeXNpY2FsIGNhbWVyYS4KKyAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUlkcy5wdXNoX2JhY2socGh5c2ljYWxTdHJlYW0ucGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgICAgICBpZFBvaW50ZXJMaXN0LnB1c2hfYmFjayhwaHlzaWNhbFN0cmVhbS5waHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgfQorICAgICAgICBBQ2FtZXJhSWRMaXN0IGNhbWVyYUlkTGlzdDsKKyAgICAgICAgY2FtZXJhSWRMaXN0Lm51bUNhbWVyYXMgPSBpZFBvaW50ZXJMaXN0LnNpemUoKTsKKyAgICAgICAgY2FtZXJhSWRMaXN0LmNhbWVyYUlkcyA9IGlkUG9pbnRlckxpc3QuZGF0YSgpOworCisgICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24obURldmljZSwgbU91dHB1dHMsICZtU2Vzc2lvbkNiLCAmbVNlc3Npb24pOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24gZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgaWYgKHVzZVBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzKG1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUsICZjYW1lcmFJZExpc3QsICZtU3RpbGxSZXF1ZXN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3QobURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJm1TdGlsbFJlcXVlc3QpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKG1JbWdSZWFkZXJBbncsICZtUmVxSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQobVN0aWxsUmVxdWVzdCwgbVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbFN0cmVhbSA6IHBoeXNpY2FsSW1nUmVhZGVycykgeworICAgICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCogb3V0cHV0VGFyZ2V0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKHBoeXNpY2FsU3RyZWFtLmFudywgJm91dHB1dFRhcmdldCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQobVN0aWxsUmVxdWVzdCwgb3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVxRXh0cmFPdXRwdXRzLnB1c2hfYmFjayhvdXRwdXRUYXJnZXQpOworICAgICAgICB9CisKKyAgICAgICAgbUlzQ2FtZXJhUmVhZHkgPSB0cnVlOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKworICAgIGJvb2wgaXNDYW1lcmFSZWFkeSgpIHsgcmV0dXJuIG1Jc0NhbWVyYVJlYWR5OyB9CisKKyAgICB2b2lkIGNsb3NlQ2FtZXJhKCkgeworICAgICAgICAvLyBEZXN0cm95IGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBpZiAobVJlcUltZ1JlYWRlck91dHB1dCkgeworICAgICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldF9mcmVlKG1SZXFJbWdSZWFkZXJPdXRwdXQpOworICAgICAgICAgICAgbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvJiBvdXRwdXRUYXJnZXQgOiBtUmVxRXh0cmFPdXRwdXRzKSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUob3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBtUmVxRXh0cmFPdXRwdXRzLmNsZWFyKCk7CisgICAgICAgIGlmIChtU3RpbGxSZXF1ZXN0KSB7CisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3RfZnJlZShtU3RpbGxSZXF1ZXN0KTsKKyAgICAgICAgICAgIG1TdGlsbFJlcXVlc3QgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIERlc3Ryb3kgY2FwdHVyZSBzZXNzaW9uCisgICAgICAgIGlmIChtU2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2xvc2UobVNlc3Npb24pOworICAgICAgICAgICAgbVNlc3Npb24gPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtSW1nUmVhZGVyT3V0cHV0KSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZShtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgICAgIG1JbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byYgZXh0cmFPdXRwdXQgOiBtRXh0cmFPdXRwdXRzKSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZShleHRyYU91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgbUV4dHJhT3V0cHV0cy5jbGVhcigpOworICAgICAgICBpZiAobU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9mcmVlKG1PdXRwdXRzKTsKKyAgICAgICAgICAgIG1PdXRwdXRzID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBEZXN0cm95IGNhbWVyYSBkZXZpY2UKKyAgICAgICAgaWYgKG1EZXZpY2UpIHsKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfY2xvc2UobURldmljZSk7CisgICAgICAgICAgICBtRGV2aWNlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBtSXNDYW1lcmFSZWFkeSA9IGZhbHNlOworICAgIH0KKworICAgIGludCB0YWtlUGljdHVyZSgpIHsKKyAgICAgICAgaW50IHNlcUlkOworICAgICAgICByZXR1cm4gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmUobVNlc3Npb24sICZtQ2FwdHVyZUNhbGxiYWNrcywgMSwgJm1TdGlsbFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VxSWQpOworICAgIH0KKworICAgIGludCB0YWtlTG9naWNhbENhbWVyYVBpY3R1cmUoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmUobVNlc3Npb24sICZtTG9naWNhbENhcHR1cmVDYWxsYmFja3MsCisgICAgICAgICAgICAgICAgMSwgJm1TdGlsbFJlcXVlc3QsICZzZXFJZCk7CisgICAgfQorCisgICAgYm9vbCBjaGVja0NhbGxiYWNrcyhpbnQgcGljdHVyZUNvdW50KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIGlmIChtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQgIT0gcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICBBTE9HRSgiQ29tcGxldGVkIGNhcHR1cmUgY2FsbGFiYWNrIGNvdW50IG5vdCBhcyBleHBlY3RlZC4gZXhwZWN0ZWQgJWQgYWN0dWFsICVkIiwKKyAgICAgICAgICAgICAgICAgIHBpY3R1cmVDb3VudCwgbUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkRldmljZURpc2Nvbm5lY3RlZCh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhRGV2aWNlKiAvKmRldmljZSovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25EZXZpY2VFcnJvcih2b2lkKiAvKm9iaiovLCBBQ2FtZXJhRGV2aWNlKiAvKmRldmljZSovLCBpbnQgLyplcnJvckNvZGUqLykge30KKworICAgIHN0YXRpYyB2b2lkIG9uU2Vzc2lvbkNsb3NlZCh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uUmVhZHkodm9pZCogLypvYmoqLywgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiAvKnNlc3Npb24qLykge30KKworICAgIHN0YXRpYyB2b2lkIG9uU2Vzc2lvbkFjdGl2ZSh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICBwcml2YXRlOgorICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbURldmljZUNie3RoaXMsIG9uRGV2aWNlRGlzY29ubmVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRGV2aWNlRXJyb3J9OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyBtU2Vzc2lvbkNieworICAgICAgICB0aGlzLCBvblNlc3Npb25DbG9zZWQsIG9uU2Vzc2lvblJlYWR5LCBvblNlc3Npb25BY3RpdmV9OworCisgICAgbmF0aXZlX2hhbmRsZV90KiBtSW1nUmVhZGVyQW53ID0gbnVsbHB0cjsgIC8vIG5vdCBvd25lZCBieSB1cy4KKworICAgIC8vIENhbWVyYSBkZXZpY2UKKyAgICBBQ2FtZXJhRGV2aWNlKiBtRGV2aWNlID0gbnVsbHB0cjsKKyAgICAvLyBDYXB0dXJlIHNlc3Npb24KKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG1PdXRwdXRzID0gbnVsbHB0cjsKKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG1JbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworICAgIHN0ZDo6dmVjdG9yPEFDYXB0dXJlU2Vzc2lvbk91dHB1dCo+IG1FeHRyYU91dHB1dHM7CisKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIG1TZXNzaW9uID0gbnVsbHB0cjsKKyAgICAvLyBDYXB0dXJlIHJlcXVlc3QKKyAgICBBQ2FwdHVyZVJlcXVlc3QqIG1TdGlsbFJlcXVlc3QgPSBudWxscHRyOworICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQqIG1SZXFJbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworICAgIHN0ZDo6dmVjdG9yPEFDYW1lcmFPdXRwdXRUYXJnZXQqPiBtUmVxRXh0cmFPdXRwdXRzOworCisgICAgYm9vbCBtSXNDYW1lcmFSZWFkeSA9IGZhbHNlOworICAgIGNvbnN0IGNoYXIqIG1DYW1lcmFJZDsKKyAgICBBQ2FtZXJhTWFuYWdlciogbUNhbWVyYU1hbmFnZXI7CisgICAgaW50IG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCA9IDA7CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgbUNhcHR1cmVDYWxsYmFja3MgPSB7CisgICAgICAgIC8vIFRPRE86IEFkZCB0ZXN0cyBmb3Igb3RoZXIgY2FsbGJhY2tzCisgICAgICAgIHRoaXMsIC8vIGNvbnRleHQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU3RhcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkCisgICAgICAgIFtdKHZvaWQqIGN0eCAsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqLCBBQ2FwdHVyZVJlcXVlc3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSAqKSB7CisgICAgICAgICAgICBDYW1lcmFIZWxwZXIgKmNoID0gc3RhdGljX2Nhc3Q8Q2FtZXJhSGVscGVyICo+KGN0eCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhjaC0+bU11dGV4KTsKKyAgICAgICAgICAgIGNoLT5tQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQrKzsKKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlRmFpbGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgfTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxDYW1lcmFJZHM7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyBtTG9naWNhbENhcHR1cmVDYWxsYmFja3MgPSB7CisgICAgICAgIC8vIFRPRE86IEFkZCB0ZXN0cyBmb3Igb3RoZXIgY2FsbGJhY2tzCisgICAgICAgIHRoaXMsIC8vIGNvbnRleHQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU3RhcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkCisgICAgICAgIFtdKHZvaWQqIGN0eCAsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqLCBBQ2FwdHVyZVJlcXVlc3QgKiwKKyAgICAgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWV0YWRhdGEgKiwgc2l6ZV90IHBoeXNpY2FsUmVzdWx0Q291bnQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIHBoeXNpY2FsQ2FtZXJhSWRzLCBjb25zdCBBQ2FtZXJhTWV0YWRhdGEqKiBwaHlzaWNhbFJlc3VsdHMpIHsKKyAgICAgICAgICAgIENhbWVyYUhlbHBlciAqY2ggPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWxwZXIgKj4oY3R4KTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgQVNTRVJUX0VRKHBoeXNpY2FsUmVzdWx0Q291bnQsIGNoLT5tUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocGh5c2ljYWxDYW1lcmFJZHNbaV0gIT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocGh5c2ljYWxSZXN1bHRzW2ldICE9IG51bGxwdHIpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShzdGQ6OmZpbmQoY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxDYW1lcmFJZHNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5lbmQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgZnJhbWVOdW1iZXIgYW5kIHNlbnNvclRpbWVzdGFtcCBleGlzdCBpbiBwaHlzaWNhbAorICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBtZXRhZGF0YQorICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBlbnRyeTsKKyAgICAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0c1tpXSwgQUNBTUVSQV9TWU5DX0ZSQU1FX05VTUJFUiwgJmVudHJ5KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW50cnkuY291bnQsIDEpOworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRzW2ldLCBBQ0FNRVJBX1NFTlNPUl9USU1FU1RBTVAsICZlbnRyeSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGVudHJ5LmNvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoLT5tQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQrKzsKKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlRmFpbGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgfTsKK307CisKK2NsYXNzIEltYWdlUmVhZGVyVGVzdENhc2UgeworICAgcHVibGljOgorICAgIEltYWdlUmVhZGVyVGVzdENhc2UoaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc3luYykKKyAgICAgICAgOiBtV2lkdGgod2lkdGgpLAorICAgICAgICAgIG1IZWlnaHQoaGVpZ2h0KSwKKyAgICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgICAgbVVzYWdlKHVzYWdlKSwKKyAgICAgICAgICBtTWF4SW1hZ2VzKG1heEltYWdlcyksCisgICAgICAgICAgbUFzeW5jKGFzeW5jKSB7fQorCisgICAgfkltYWdlUmVhZGVyVGVzdENhc2UoKSB7CisgICAgICAgIGlmIChtSW1nUmVhZGVyQW53KSB7CisgICAgICAgICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlKG1JbWdSZWFkZXIpOworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjYWxsIG5hdGl2ZV9oYW5kbGVfdF9yZWxlYXNlIG9uIGltYWdlUmVhZGVyQW53CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgaW5pdEltYWdlUmVhZGVyKCkgeworICAgICAgICBpZiAobUltZ1JlYWRlciAhPSBudWxscHRyIHx8IG1JbWdSZWFkZXJBbncgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCByZS1pbml0YWxpemUgaW1hZ2UgcmVhZGVyLCBtSW1nUmVhZGVyPSVwLCBtSW1nUmVhZGVyQW53PSVwIiwgbUltZ1JlYWRlciwKKyAgICAgICAgICAgICAgICAgIG1JbWdSZWFkZXJBbncpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZSgKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1Vc2FnZSwgbU1heEltYWdlcywgJm1JbWdSZWFkZXIpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtSW1nUmVhZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIG5ldyBBSW1hZ2VSZWFkZXIsIHJldD0lZCwgbUltZ1JlYWRlcj0lcCIsIHJldCwgbUltZ1JlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0SW1hZ2VMaXN0ZW5lcihtSW1nUmVhZGVyLCAmbVJlYWRlckF2YWlsYWJsZUNiKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGltYWdlIGF2YWlsYWJsZSBsaXN0ZW5lciwgcmV0PSVkLiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcihtSW1nUmVhZGVyLCAmbVJlYWRlckRldGFjaGVkQ2IpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgYnVmZmVyIGRldGFjaGluZyBsaXN0ZW5lciwgcmV0PSVkLiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZShtSW1nUmVhZGVyLCAmbUltZ1JlYWRlckFudyk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1JbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgbmF0aXZlX2hhbmRsZV90IGZyb20gQUltYWdlUmVhZGVyLCByZXQ9JWQsIG1JbWdSZWFkZXJBbnc9JXAuIiwgcmV0LAorICAgICAgICAgICAgICAgICAgbUltZ1JlYWRlckFudyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGdldE5hdGl2ZVdpbmRvdygpIHsgcmV0dXJuIG1JbWdSZWFkZXJBbnc7IH0KKworICAgIGludCBnZXRBY3F1aXJlZEltYWdlQ291bnQoKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHJldHVybiBtQWNxdWlyZWRJbWFnZUNvdW50OworICAgIH0KKworICAgIHZvaWQgSGFuZGxlSW1hZ2VBdmFpbGFibGUoQUltYWdlUmVhZGVyKiByZWFkZXIpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgICAgICBBSW1hZ2UqIG91dEltYWdlID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0OworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBBSW1hZ2Ugd2lsbCBiZSBkZWxldGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBnb2VzIG91dCBvZgorICAgICAgICAvLyBzY29wZS4KKyAgICAgICAgYXV0byBpbWFnZURlbGV0ZXIgPSBbdGhpc10oQUltYWdlKiBpbWcpIHsKKyAgICAgICAgICAgIGlmIChtQXN5bmMpIHsKKyAgICAgICAgICAgICAgICBBSW1hZ2VfZGVsZXRlQXN5bmMoaW1nLCBrRHVtbXlGZW5jZUZkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUltYWdlX2RlbGV0ZShpbWcpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUltYWdlLCBkZWNsdHlwZShpbWFnZURlbGV0ZXIpPiBpbWcobnVsbHB0ciwgaW1hZ2VEZWxldGVyKTsKKworICAgICAgICBpZiAobUFzeW5jKSB7CisgICAgICAgICAgICBpbnQgb3V0RmVuY2VGZCA9IDA7CisgICAgICAgICAgICAvLyBWZXJpdHkgdGhhdCBvdXRGZW5jZUZkJ3MgdmFsdWUgd2lsbCBiZSBjaGFuZ2VkIGJ5CisgICAgICAgICAgICAvLyBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jLgorICAgICAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2VBc3luYyhyZWFkZXIsICZvdXRJbWFnZSwgJm91dEZlbmNlRmQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0SW1hZ2UgPT0gbnVsbHB0ciB8fCBvdXRGZW5jZUZkID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFjcXVpcmUgaW1hZ2UsIHJldD0lZCwgb3V0SWFtZ2U9JXAsIG91dEZlbmNlRmQ9JWQuIiwgcmV0LCBvdXRJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRGZW5jZUZkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UocmVhZGVyLCAmb3V0SW1hZ2UpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0SW1hZ2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBpbWFnZSwgcmV0PSVkLCBvdXRJYW1nZT0lcC4iLCByZXQsIG91dEltYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICB9CisKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyKiBvdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0SGFyZHdhcmVCdWZmZXIoaW1nLmdldCgpLCAmb3V0QnVmZmVyKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZCB0byBnZXQgaGFyZHdhcmUgYnVmZmVyLCByZXQ9JWQsIG91dEJ1ZmZlcj0lcC4iLCByZXQsIG91dEJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBObyBuZWVkIHRvIHJlbGVhc2UgQUhhcmR3YXJlQnVmZmVyLCBzaW5jZSB3ZSBkb24ndCBhY3F1aXJlIGFkZGl0aW9uYWwKKyAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGl0LgorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBvdXREZXNjOworICAgICAgICBBSGFyZHdhcmVCdWZmZXJfZGVzY3JpYmUob3V0QnVmZmVyLCAmb3V0RGVzYyk7CisgICAgICAgIGludDMyX3QgaW1hZ2VXaWR0aCA9IDA7CisgICAgICAgIGludDMyX3QgaW1hZ2VIZWlnaHQgPSAwOworICAgICAgICBpbnQzMl90IGJ1ZmZlcldpZHRoID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ob3V0RGVzYy53aWR0aCk7CisgICAgICAgIGludDMyX3QgYnVmZmVySGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ob3V0RGVzYy5oZWlnaHQpOworCisgICAgICAgIEFJbWFnZV9nZXRXaWR0aChvdXRJbWFnZSwgJmltYWdlV2lkdGgpOworICAgICAgICBBSW1hZ2VfZ2V0SGVpZ2h0KG91dEltYWdlLCAmaW1hZ2VIZWlnaHQpOworICAgICAgICBpZiAoaW1hZ2VXaWR0aCAhPSBtV2lkdGggfHwgaW1hZ2VIZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk1pc21hdGNoZWQgb3V0cHV0IGltYWdlIGRpbWVuc2lvbjogZXhwZWN0ZWQ9JWR4JWQsIGFjdHVhbD0lZHglZCIsIG1XaWR0aCwKKyAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCQV84ODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCWF84ODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCXzg4OCB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQl81NjUgfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JBX0ZQMTYgfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1k4KSB7CisgICAgICAgICAgICAvLyBDaGVjayBvdXRwdXQgYnVmZmVyIGRpbWVuc2lvbiBmb3IgY2VydGFpbiBmb3JtYXRzLiBEb24ndCBkbyB0aGlzIGZvciBibG9iIGJhc2VkCisgICAgICAgICAgICAvLyBmb3JtYXRzLgorICAgICAgICAgICAgaWYgKGJ1ZmZlcldpZHRoICE9IG1XaWR0aCB8fCBidWZmZXJIZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNaXNtYXRjaGVkIG91dHB1dCBidWZmZXIgZGltZW5zaW9uOiBleHBlY3RlZD0lZHglZCwgYWN0dWFsPSVkeCVkIiwgbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgob3V0RGVzYy51c2FnZSAmIG1Vc2FnZSkgIT0gbVVzYWdlKSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzbWF0Y2hlZCBvdXRwdXQgYnVmZmVyIHVzYWdlOiBhY3R1YWwgKCUiIFBSSXU2NCAiKSwgZXhwZWN0ZWQgKCUiIFBSSXU2NCAiKSIsCisgICAgICAgICAgICAgICAgICBvdXREZXNjLnVzYWdlLCBtVXNhZ2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCogZGF0YSA9IG51bGxwdHI7CisgICAgICAgIGludCBkYXRhTGVuZ3RoID0gMDsKKyAgICAgICAgcmV0ID0gQUltYWdlX2dldFBsYW5lRGF0YShpbWcuZ2V0KCksIDAsICZkYXRhLCAmZGF0YUxlbmd0aCk7CisgICAgICAgIGlmIChtVXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4pIHsKKyAgICAgICAgICAgIC8vIFdoZW4gd2UgaGF2ZSBDUFVfUkVBRF9PRlRFTiB1c2FnZSBiaXRzLCB3ZSBjYW4gbG9jayB0aGUgaW1hZ2UuCisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBkYXRhID09IG51bGxwdHIgfHwgZGF0YUxlbmd0aCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFjY2VzcyBDUFUgZGF0YSwgcmV0PSVkLCBkYXRhPSVwLCBkYXRhTGVuZ3RoPSVkIiwgcmV0LCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX0lNR1JFQURFUl9DQU5OT1RfTE9DS19JTUFHRSB8fCBkYXRhICE9IG51bGxwdHIgfHwgZGF0YUxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGFjY2VzcyBDUFUgZGF0YSwgcmV0PSVkLCBkYXRhPSVwLCBkYXRhTGVuZ3RoPSVkIiwgcmV0LAorICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBPbmx5IGluY3JlYXNlIG1BY3F1aXJlZEltYWdlQ291bnQgaWYgYWxsIGNoZWNrcyBwYXNzLgorICAgICAgICBtQWNxdWlyZWRJbWFnZUNvdW50Kys7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25JbWFnZUF2YWlsYWJsZSh2b2lkKiBvYmosIEFJbWFnZVJlYWRlciogcmVhZGVyKSB7CisgICAgICAgIEltYWdlUmVhZGVyVGVzdENhc2UqIHRoaXogPSByZWludGVycHJldF9jYXN0PEltYWdlUmVhZGVyVGVzdENhc2UqPihvYmopOworICAgICAgICB0aGl6LT5IYW5kbGVJbWFnZUF2YWlsYWJsZShyZWFkZXIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkCisgICAgb25CdWZmZXJSZW1vdmVkKHZvaWQqIC8qb2JqKi8sIEFJbWFnZVJlYWRlciogLypyZWFkZXIqLywgQUhhcmR3YXJlQnVmZmVyKiAvKmJ1ZmZlciovKSB7CisgICAgICAgIC8vIE5vLW9wLCBqdXN0IHRvIGNoZWNrIHRoZSBsaXN0ZW5lciBjYW4gYmUgc2V0IHByb3Blcmx5LgorICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisgICAgaW50MzJfdCBtRm9ybWF0OworICAgIHVpbnQ2NF90IG1Vc2FnZTsKKyAgICBpbnQzMl90IG1NYXhJbWFnZXM7CisgICAgYm9vbCBtQXN5bmM7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBpbnQgbUFjcXVpcmVkSW1hZ2VDb3VudHswfTsKKworICAgIEFJbWFnZVJlYWRlciogbUltZ1JlYWRlciA9IG51bGxwdHI7CisgICAgbmF0aXZlX2hhbmRsZV90KiBtSW1nUmVhZGVyQW53ID0gbnVsbHB0cjsKKworICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIG1SZWFkZXJBdmFpbGFibGVDYnt0aGlzLCBvbkltYWdlQXZhaWxhYmxlfTsKKyAgICBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyIG1SZWFkZXJEZXRhY2hlZENie3RoaXMsIG9uQnVmZmVyUmVtb3ZlZH07Cit9OworCisKK2NsYXNzIEFJbWFnZVJlYWRlclZlbmRvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gQUNhbWVyYU1hbmFnZXJfY3JlYXRlKCk7CisgICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBBQ2FtZXJhTWFuYWdlci4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFJZExpc3QobUNhbWVyYU1hbmFnZXIsICZtQ2FtZXJhSWRMaXN0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBjYW1lcmFJZExpc3Q6IHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogQWRkIG1vcmUgcmlnb3JvdXMgdGVzdHMgZm9yIHZlbmRvciB0YWdzCisgICAgICAgIEFTU0VSVF9ORShWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldEdsb2JhbFZlbmRvclRhZ0NhY2hlKCksIG51bGxwdHIpOworICAgICAgICBpZiAobUNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhcyA8IDEpIHsKKyAgICAgICAgICAgIEFMT0dXKCJEZXZpY2UgaGFzIG5vIGNhbWVyYSBvbiBib2FyZC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBEZXN0cm95IGNhbWVyYSBtYW5hZ2VyCisgICAgICAgIGlmIChtQ2FtZXJhSWRMaXN0KSB7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9kZWxldGVDYW1lcmFJZExpc3QobUNhbWVyYUlkTGlzdCk7CisgICAgICAgICAgICBtQ2FtZXJhSWRMaXN0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNhbWVyYU1hbmFnZXIpIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZShtQ2FtZXJhTWFuYWdlcik7CisgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIHRha2VQaWN0dXJlcyhjb25zdCBjaGFyKiBpZCwgdWludDY0X3QgcmVhZGVyVXNhZ2UsIGludCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICBib29sIHJlYWRlckFzeW5jLCBpbnQgcGljdHVyZUNvdW50KSB7CisgICAgICAgIGludCByZXQgPSAwOworCisgICAgICAgIEltYWdlUmVhZGVyVGVzdENhc2UgdGVzdENhc2UoCisgICAgICAgICAgICAgICAga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0LCBrVGVzdEltYWdlRm9ybWF0LCByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgIHJlYWRlckFzeW5jKTsKKyAgICAgICAgcmV0ID0gdGVzdENhc2UuaW5pdEltYWdlUmVhZGVyKCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgSW1hZ2VSZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYUhlbHBlciBjYW1lcmFIZWxwZXIoaWQsIG1DYW1lcmFNYW5hZ2VyKTsKKyAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLmluaXRDYW1lcmEodGVzdENhc2UuZ2V0TmF0aXZlV2luZG93KCksCisgICAgICAgICAgICAgICAge30vKnBoeXNpY2FsSW1hZ2VSZWFkZXJzKi8sIGZhbHNlLyp1c2VQaHlzaWNhbFNldHRpbmdzKi8pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGNhbWVyYSBoZWxwZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2FtZXJhSGVscGVyLmlzQ2FtZXJhUmVhZHkoKSkgeworICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBpcyBub3QgcmVhZHkgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbi4gSXQncyBlaXRoZXIgZHVlIHRvIGNhbWVyYSAiCisgICAgICAgICAgICAgICAgICAib24gYm9hcmQgbGFja3MgQkFDS1dBUkRTX0NPTVBBVElCTEUgY2FwYWJpbGl0eSBvciB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgIgorICAgICAgICAgICAgICAgICAgImNhbWVyYSBvbiBib2FyZC4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VQaWN0dXJlKCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gdGFrZSBwaWN0dXJlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2xlZXAgdW50aWwgYWxsIGNhcHR1cmUgZmluaXNoZWQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2FwdHVyZVdhaXRSZXRyeSAqIHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICB1c2xlZXAoa0NhcHR1cmVXYWl0VXMpOworICAgICAgICAgICAgaWYgKHRlc3RDYXNlLmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJTZXNzaW9uIHRha2UgfiVkIG1zIHRvIGNhcHR1cmUgJWQgaW1hZ2VzIiwgaSAqIGtDYXB0dXJlV2FpdFVzIC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlQ291bnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0Q2FzZS5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSA9PSBwaWN0dXJlQ291bnQgJiYKKyAgICAgICAgICAgICAgICBjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KTsKKyAgICB9CisKKyAgICBib29sIHRlc3RUYWtlUGljdHVyZXNOYXRpdmUoY29uc3QgY2hhciogaWQpIHsKKyAgICAgICAgZm9yIChhdXRvJiByZWFkZXJVc2FnZSA6CisgICAgICAgICAgICAge0FIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTn0pIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgcmVhZGVyTWF4SW1hZ2VzIDogezEsIDQsIDh9KSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiByZWFkZXJBc3luYyA6IHt0cnVlLCBmYWxzZX0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBwaWN0dXJlQ291bnQgOiB7MSwgNCwgOH0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFrZVBpY3R1cmVzKGlkLCByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJUZXN0IHRha2VQaWN0dXJlcyBmYWlsZWQgZm9yIHRlc3QgY2FzZSB1c2FnZT0lIiBQUkl1NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBtYXhJbWFnZXM9JWQsIGFzeW5jPSVkLCBwaWN0dXJlQ291bnQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsIHJlYWRlckFzeW5jLCBwaWN0dXJlQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBDYW1lcmEgbWFuYWdlcgorICAgIEFDYW1lcmFNYW5hZ2VyKiBtQ2FtZXJhTWFuYWdlciA9IG51bGxwdHI7CisgICAgQUNhbWVyYUlkTGlzdCogbUNhbWVyYUlkTGlzdCA9IG51bGxwdHI7CisKKyAgICBib29sIGlzQ2FwYWJpbGl0eVN1cHBvcnRlZChBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY0luZm8sCisgICAgICAgICAgICBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9jYXBhYmlsaXRpZXNfdCBjYXApIHsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeSgKKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLCBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUywgJmVudHJ5KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLnU4W2ldID09IGNhcCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGlzU2l6ZVN1cHBvcnRlZEZvckZvcm1hdChBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY0luZm8sCisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeShzdGF0aWNJbmZvLAorICAgICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMsICZlbnRyeSk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS5pMzJbaV0gPT0gZm9ybWF0ICYmCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2krM10gPT0gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSsxXSA9PSB3aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMltpKzJdID09IGhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGZpbmRDYW5kaWRhdGVMb2dpY2FsQ2FtZXJhKGNvbnN0IGNoYXIgKipjYW1lcmFJZCwKKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YSoqIHN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+KiBjYW5kaWRhdGVQaHlzaWNhbElkcykgeworICAgICAgICAvLyBGaW5kIGZpcnN0IGF2YWlsYWJsZSBsb2dpY2FsIGNhbWVyYQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DYW1lcmFJZExpc3QtPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIsIG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXSwgc3RhdGljTWV0YWRhdGEpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgQUNBTUVSQV9PSyk7CisgICAgICAgICAgICBBU1NFUlRfTkUoKnN0YXRpY01ldGFkYXRhLCBudWxscHRyKTsKKworICAgICAgICAgICAgaWYgKCFpc0NhcGFiaWxpdHlTdXBwb3J0ZWQoKnN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkpIHsKKyAgICAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZSgqc3RhdGljTWV0YWRhdGEpOworICAgICAgICAgICAgICAgICpzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIHJldHVybmVkIHBoeXNpY2FsIGNhbWVyYSBJZHMgYXJlIHZhbGlkCisgICAgICAgICAgICBzaXplX3QgcGh5c2ljYWxDYW1lcmFJZENudCA9IDA7CisgICAgICAgICAgICBjb25zdCBjaGFyKmNvbnN0KiBwaHlzaWNhbENhbWVyYUlkcyA9IG51bGxwdHI7CisgICAgICAgICAgICBib29sIGlzTG9naWNhbENhbWVyYSA9IEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYSgqc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbENhbWVyYUlkQ250LCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXNMb2dpY2FsQ2FtZXJhKTsKKyAgICAgICAgICAgIEFTU0VSVF9HRShwaHlzaWNhbENhbWVyYUlkQ250LCAyKTsKKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YSogcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICBjYW5kaWRhdGVQaHlzaWNhbElkcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGh5c2ljYWxDYW1lcmFJZENudCAmJiBjYW5kaWRhdGVQaHlzaWNhbElkcy0+c2l6ZSgpIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0dUKHN0cmxlbihwaHlzaWNhbENhbWVyYUlkc1tqXSksIDApOworICAgICAgICAgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLCBwaHlzaWNhbENhbWVyYUlkc1tqXSwgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShyZXQsIEFDQU1FUkFfT0spOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShwaHlzaWNhbENhbWVyYU1ldGFkYXRhLCBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1NpemVTdXBwb3J0ZWRGb3JGb3JtYXQocGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwga1Rlc3RJbWFnZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0SW1hZ2VXaWR0aCwga1Rlc3RJbWFnZUhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlUGh5c2ljYWxJZHMtPnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5zaXplKCkgPT0gMikgeworICAgICAgICAgICAgICAgICpjYW1lcmFJZCA9IG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKCpzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgKnN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqY2FtZXJhSWQgPSBudWxscHRyOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdm9pZCB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKGJvb2wgdXNlUGh5c2ljYWxTZXR0aW5ncykgeworICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCA9IG51bGxwdHI7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEgPSBudWxscHRyOworICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZHM7CisKKyAgICAgICAgZmluZENhbmRpZGF0ZUxvZ2ljYWxDYW1lcmEoJmNhbWVyYUlkLCAmc3RhdGljTWV0YWRhdGEsICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIGlmIChjYW1lcmFJZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBDb3VsZG4ndCBmaW5kIGxvZ2ljYWwgY2FtZXJhIHRvIHRlc3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlc3Qgc3RyZWFtaW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYQorICAgICAgICB1aW50NjRfdCByZWFkZXJVc2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTjsKKyAgICAgICAgaW50MzJfdCByZWFkZXJNYXhJbWFnZXMgPSA4OworICAgICAgICBib29sIHJlYWRlckFzeW5jID0gZmFsc2U7CisgICAgICAgIGNvbnN0IGludCBwaWN0dXJlQ291bnQgPSA2OworICAgICAgICBzdGQ6OnZlY3RvcjxJbWFnZVJlYWRlclRlc3RDYXNlKj4gdGVzdENhc2VzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSogdGVzdENhc2UgPSBuZXcgSW1hZ2VSZWFkZXJUZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICAgICAga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0LCBrVGVzdEltYWdlRm9ybWF0LCByZWFkZXJVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyTWF4SW1hZ2VzLCByZWFkZXJBc3luYyk7CisgICAgICAgICAgICBBU1NFUlRfRVEodGVzdENhc2UtPmluaXRJbWFnZVJlYWRlcigpLCAwKTsKKyAgICAgICAgICAgIHRlc3RDYXNlcy5wdXNoX2JhY2sodGVzdENhc2UpOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhSGVscGVyIGNhbWVyYUhlbHBlcihjYW1lcmFJZCwgbUNhbWVyYU1hbmFnZXIpOworICAgICAgICBzdGQ6OnZlY3RvcjxDYW1lcmFIZWxwZXI6OlBoeXNpY2FsSW1nUmVhZGVySW5mbz4gcGh5c2ljYWxJbWdSZWFkZXJJbmZvOworICAgICAgICBwaHlzaWNhbEltZ1JlYWRlckluZm8ucHVzaF9iYWNrKHtwaHlzaWNhbENhbWVyYUlkc1swXSwgdGVzdENhc2VzWzFdLT5nZXROYXRpdmVXaW5kb3coKX0pOworICAgICAgICBwaHlzaWNhbEltZ1JlYWRlckluZm8ucHVzaF9iYWNrKHtwaHlzaWNhbENhbWVyYUlkc1sxXSwgdGVzdENhc2VzWzJdLT5nZXROYXRpdmVXaW5kb3coKX0pOworCisgICAgICAgIGludCByZXQgPSBjYW1lcmFIZWxwZXIuaW5pdENhbWVyYSh0ZXN0Q2FzZXNbMF0tPmdldE5hdGl2ZVdpbmRvdygpLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsSW1nUmVhZGVySW5mbywgdXNlUGh5c2ljYWxTZXR0aW5ncyk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIDApOworCisgICAgICAgIGlmICghY2FtZXJhSGVscGVyLmlzQ2FtZXJhUmVhZHkoKSkgeworICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBpcyBub3QgcmVhZHkgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbi4gSXQncyBlaXRoZXIgZHVlIHRvIGNhbWVyYSAiCisgICAgICAgICAgICAgICAgICAib24gYm9hcmQgbGFja3MgQkFDS1dBUkRTX0NPTVBBVElCTEUgY2FwYWJpbGl0eSBvciB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgIgorICAgICAgICAgICAgICAgICAgImNhbWVyYSBvbiBib2FyZC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlTG9naWNhbENhbWVyYVBpY3R1cmUoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShyZXQsIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2xlZXAgdW50aWwgYWxsIGNhcHR1cmUgZmluaXNoZWQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2FwdHVyZVdhaXRSZXRyeSAqIHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICB1c2xlZXAoa0NhcHR1cmVXYWl0VXMpOworICAgICAgICAgICAgaWYgKHRlc3RDYXNlc1swXS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlNlc3Npb24gdGFrZSB+JWQgbXMgdG8gY2FwdHVyZSAlZCBpbWFnZXMiLCBpICoga0NhcHR1cmVXYWl0VXMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKHRlc3RDYXNlc1swXS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCksIHBpY3R1cmVDb3VudCk7CisgICAgICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZXNbMV0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgICAgICBBU1NFUlRfRVEodGVzdENhc2VzWzJdLT5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSwgcGljdHVyZUNvdW50KTsKKyAgICAgICAgQVNTRVJUX1RSVUUoY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzKHBpY3R1cmVDb3VudCkpOworCisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKHN0YXRpY01ldGFkYXRhKTsKKyAgICB9Cit9OworCitURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgQ3JlYXRlV2luZG93TmF0aXZlSGFuZGxlKSB7CisgICAgLy8gV2UgYWx3YXlzIHVzZSB0aGUgZmlyc3QgY2FtZXJhLgorICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkID0gbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzWzBdOworICAgIEFTU0VSVF9UUlVFKGNhbWVyYUlkICE9IG51bGxwdHIpOworCisgICAgQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLCBjYW1lcmFJZCwgJnN0YXRpY01ldGFkYXRhKTsKKyAgICBBU1NFUlRfRVEocmV0LCBBQ0FNRVJBX09LKTsKKyAgICBBU1NFUlRfTkUoc3RhdGljTWV0YWRhdGEsIG51bGxwdHIpOworCisgICAgYm9vbCBpc0JDID0gaXNDYXBhYmlsaXR5U3VwcG9ydGVkKHN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQkFDS1dBUkRfQ09NUEFUSUJMRSk7CisKKyAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShzdGF0aWNNZXRhZGF0YSk7CisKKyAgICBpZiAoIWlzQkMpIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IEJBQ0tXQVJEX0NPTVBBVElCTEUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0VGFrZVBpY3R1cmVzTmF0aXZlKGNhbWVyYUlkKSk7Cit9CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LCBMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0pIHsKKyAgICB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKGZhbHNlLyp1c2VQaHlzaWNhbFNldHRpbmdzKi8pOworICAgIHRlc3RMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0odHJ1ZS8qdXNlUGh5c2ljYWxTZXR0aW5ncyovKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tayBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDY1OTQ4NGYuLmU1YzE2MzEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw4IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcCBcCiAJQ2FtZXJhQmluZGVyVGVzdHMuY3BwIFwKLQlDYW1lcmFaU0xUZXN0cy5jcHAKKwlDYW1lcmFaU0xUZXN0cy5jcHAgXAorCUNhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmxvZyBcCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAppbmRleCAxZGU3MDEzLi44ZmUwMjlhIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KQEAgLTQwLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KIAogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KQEAgLTU1LDYgKzU3LDggQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VEZWZhdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI7CiAKICNkZWZpbmUgQVNTRVJUX05PVF9OVUxMKHgpIFwKICAgICBBU1NFUlRfVFJVRSgoeCkgIT0gbnVsbHB0cikKQEAgLTg2LDYgKzkwLDExIEBACiAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9OwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCkgeworICAgICAgICAvLyBObyBvcAorICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorCiAgICAgYm9vbCB3YWl0Rm9yTnVtQ2FtZXJhcyhzaXplX3QgbnVtKSBjb25zdCB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIApAQCAtNDc2LDcgKzQ4NSw4IEBACiAKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZShuZXcgU3VyZmFjZShnYlByb2R1Y2VyLCAvKmNvbnRyb2xsZWRCeUFwcCovZmFsc2UpKTsKIAotICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dChnYlByb2R1Y2VyLCAvKnJvdGF0aW9uKi8wKTsKKyAgICAgICAgU3RyaW5nMTYgbm9QaHlzaWNhbElkOworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dChnYlByb2R1Y2VyLCAvKnJvdGF0aW9uKi8wLCBub1BoeXNpY2FsSWQpOwogCiAgICAgICAgIC8vIENhbiB3ZSBjb25maWd1cmU/CiAgICAgICAgIHJlcyA9IGRldmljZS0+YmVnaW5Db25maWd1cmUoKTsKQEAgLTQ5MCw2ICs1MDAsMTkgQEAKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogICAgICAgICBFWFBFQ1RfRkFMU0UoY2FsbGJhY2tzLT5oYWRFcnJvcigpKTsKIAorICAgICAgICAvLyBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gbXVzdCBhbHNvIGJlIHN1cHBvcnRlZCBpbiB0aGlzIGNhc2UKKyAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gc2Vzc2lvbkNvbmZpZ3VyYXRpb24gPSB7IC8qaW5wdXRXaWR0aCovIDAsIC8qaW5wdXRIZWlnaHQqLzAsCisgICAgICAgICAgICAgICAgLyppbnB1dEZvcm1hdCovIC0xLCBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFfTsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWRkT3V0cHV0Q29uZmlndXJhdGlvbihvdXRwdXQpOworICAgICAgICBib29sIHF1ZXJ5U3RhdHVzOworICAgICAgICByZXMgPSBkZXZpY2UtPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoc2Vzc2lvbkNvbmZpZ3VyYXRpb24sICZxdWVyeVN0YXR1cyk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAocmVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpID09IElDYW1lcmFTZXJ2aWNlRGVmYXVsdDo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04pKQorICAgICAgICAgICAgICAgIDw8IHJlczsKKyAgICAgICAgaWYgKHJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHF1ZXJ5U3RhdHVzKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIENhbiB3ZSBtYWtlIHJlcXVlc3RzPwogICAgICAgICBDYW1lcmFNZXRhZGF0YSByZXF1ZXN0VGVtcGxhdGU7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoLypwcmV2aWV3IHRlbXBsYXRlKi8xLApkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWQyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24iCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOworCitjbGFzcyBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisKKyAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uKCkgOiBudW1DYW1lcmFzKDApe30KKyAgICAvL0d0ZXN0IGludGVyZmFjZQorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQzMl90IG51bUNhbWVyYXM7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IG1DYW1lcmFTZXJ2aWNlOworfTsKKwordm9pZCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uOjpTZXRVcCgpIHsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIHJjOworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNhbWVyYSIpKTsKKyAgICBtQ2FtZXJhU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFTZXJ2aWNlPihiaW5kZXIpOworICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldE51bWJlck9mQ2FtZXJhcygKKyAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6Q0FNRVJBX1RZUEVfQUxMLCAmbnVtQ2FtZXJhcyk7CisgICAgRVhQRUNUX1RSVUUocmMuaXNPaygpKTsKK30KKwordm9pZCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uOjpUZWFyRG93bigpIHsKKyAgICBtQ2FtZXJhU2VydmljZS5jbGVhcigpOworfQorCisvLyBSZXZva2luZyBhbmQgYWNxdWlyaW5nIHBlcm1pc3Npb25zIGF1dG9tYXRpY2FsbHkgbWlnaHQgbm90IGJlIHBvc3NpYmxlLgorLy8gVGVzdCB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgcmVtb3ZhbCBvZiBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIG5lZWRpbmcKKy8vIGEgY2FtZXJhIHBlcm1pc3Npb24uCitURVNUX0YoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbiwgVGVzdENhbWVyYVBlcm1pc3Npb24pIHsKKyAgICBmb3IgKGludDMyX3QgY2FtZXJhSWQgPSAwOyBjYW1lcmFJZCA8IG51bUNhbWVyYXM7IGNhbWVyYUlkKyspIHsKKworICAgICAgICBTdHJpbmcxNiBjYW1lcmFJZFN0ciA9IFN0cmluZzE2KFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCkpOworICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGF1dG8gcmMgPSBtQ2FtZXJhU2VydmljZS0+c3VwcG9ydHNDYW1lcmFBcGkoY2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpBUElfVkVSU0lPTl8yLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICBFWFBFQ1RfVFJVRShyYy5pc09rKCkpOworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzTmVlZGluZ1Blcm1pc3Npb247CisgICAgICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwgJm1ldGFkYXRhKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocmMuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1ldGFkYXRhLmlzRW1wdHkoKSk7CisgICAgICAgIEVYUEVDVF9FUShtZXRhZGF0YS5yZW1vdmVQZXJtaXNzaW9uRW50cmllcyhDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQsCisgICAgICAgICAgICAgICAgICAgICZ0YWdzTmVlZGluZ1Blcm1pc3Npb24pLCBOT19FUlJPUik7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcyA9CisgICAgICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoMCA8IGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5jb3VudCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGF2YWlsYWJsZUtleXM7CisgICAgICAgIGF2YWlsYWJsZUtleXMucmVzZXJ2ZShhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworICAgICAgICBhdmFpbGFibGVLZXlzLmluc2VydChhdmFpbGFibGVLZXlzLmJlZ2luKCksIGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5kYXRhLmkzMiwKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuZGF0YS5pMzIgKyBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0byAma2V5IDogdGFnc05lZWRpbmdQZXJtaXNzaW9uKSB7CisgICAgICAgICAgICBBU1NFUlRfRkFMU0UobWV0YWRhdGEuZXhpc3RzKGtleSkpOworICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChhdmFpbGFibGVLZXlzLmJlZ2luKCksIGF2YWlsYWJsZUtleXMuZW5kKCksIGtleSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpdCA9PSBhdmFpbGFibGVLZXlzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IGI3Mzk1MWYuLmMzNjE2OTAgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtODYsNiArODYsNyBAQAogdXNpbmcgYW5kcm9pZDo6SU5GT19GT1JNQVRfQ0hBTkdFRDsKIHVzaW5nIGFuZHJvaWQ6OklORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRDsKIHVzaW5nIGFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OOwordXNpbmcgYW5kcm9pZDo6TkFNRV9OT1RfRk9VTkQ7CiB1c2luZyBhbmRyb2lkOjpOT19FUlJPUjsKIHVzaW5nIGFuZHJvaWQ6OlVOS05PV05fRVJST1I7CiAKQEAgLTEwMiw3ICsxMDMsNyBAQAogc3RhdGljIGJvb2wgZ01vbm90b25pY1RpbWUgPSBmYWxzZTsgICAgIC8vIHVzZSBzeXN0ZW0gbW9ub3RvbmljIHRpbWUgZm9yIHRpbWVzdGFtcHMKIHN0YXRpYyBib29sIGdQZXJzaXN0ZW50U3VyZmFjZSA9IGZhbHNlOyAvLyB1c2UgcGVyc2lzdGVudCBzdXJmYWNlCiBzdGF0aWMgZW51bSB7Ci0gICAgRk9STUFUX01QNCwgRk9STUFUX0gyNjQsIEZPUk1BVF9GUkFNRVMsIEZPUk1BVF9SQVdfRlJBTUVTCisgICAgRk9STUFUX01QNCwgRk9STUFUX0gyNjQsIEZPUk1BVF9XRUJNLCBGT1JNQVRfM0dQUCwgRk9STUFUX0ZSQU1FUywgRk9STUFUX1JBV19GUkFNRVMKIH0gZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9NUDQ7ICAgICAgICAgICAvLyBkYXRhIGZvcm1hdCBmb3Igb3V0cHV0CiBzdGF0aWMgQVN0cmluZyBnQ29kZWNOYW1lID0gIiI7ICAgICAgICAgLy8gY29kZWMgbmFtZSBvdmVycmlkZQogc3RhdGljIGJvb2wgZ1NpemVTcGVjaWZpZWQgPSBmYWxzZTsgICAgIC8vIHdhcyBzaXplIGV4cGxpY2l0bHkgcmVxdWVzdGVkPwpAQCAtMTkxLDcgKzE5Miw3IEBACiAgICAgZm9ybWF0LT5zZXRGbG9hdCgiZnJhbWUtcmF0ZSIsIGRpc3BsYXlGcHMpOwogICAgIGZvcm1hdC0+c2V0SW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCAxMCk7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXIgPSBuZXcgYW5kcm9pZDo6QUxvb3BlcjsKICAgICBsb29wZXItPnNldE5hbWUoInNjcmVlbnJlY29yZF9sb29wZXIiKTsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAgICAgQUxPR1YoIkNyZWF0aW5nIGNvZGVjIik7CkBAIC0yNjQsMTAgKzI2NSwxMCBAQAogCiAgICAgLy8gU2V0IHRoZSByZWdpb24gb2YgdGhlIGxheWVyIHN0YWNrIHdlJ3JlIGludGVyZXN0ZWQgaW4sIHdoaWNoIGluIG91cgogICAgIC8vIGNhc2UgaXMgImFsbCBvZiBpdCIuCi0gICAgUmVjdCBsYXllclN0YWNrUmVjdChtYWluRHB5SW5mby53LCBtYWluRHB5SW5mby5oKTsKKyAgICBSZWN0IGxheWVyU3RhY2tSZWN0KG1haW5EcHlJbmZvLnZpZXdwb3J0VywgbWFpbkRweUluZm8udmlld3BvcnRIKTsKIAogICAgIC8vIFdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgZGlzcGxheS4KLSAgICBmbG9hdCBkaXNwbGF5QXNwZWN0ID0gKGZsb2F0KSBtYWluRHB5SW5mby5oIC8gKGZsb2F0KSBtYWluRHB5SW5mby53OworICAgIGZsb2F0IGRpc3BsYXlBc3BlY3QgPSAoZmxvYXQpIG1haW5EcHlJbmZvLnZpZXdwb3J0SCAvIChmbG9hdCkgbWFpbkRweUluZm8udmlld3BvcnRXOwogCiAKICAgICAvLyBTZXQgdGhlIHdheSB3ZSBtYXAgdGhlIG91dHB1dCBvbnRvIHRoZSBkaXNwbGF5IHN1cmZhY2UgKHdoaWNoIHdpbGwKQEAgLTM0NCwyMiArMzQ1LDYgQEAKIH0KIAogLyoKLSAqIFNldCB0aGUgbWFpbiBkaXNwbGF5IHdpZHRoIGFuZCBoZWlnaHQgdG8gdGhlIGFjdHVhbCB3aWR0aCBhbmQgaGVpZ2h0Ci0gKi8KLXN0YXRpYyBzdGF0dXNfdCBnZXRBY3R1YWxEaXNwbGF5U2l6ZShjb25zdCBzcDxJQmluZGVyPiYgbWFpbkRweSwgRGlzcGxheUluZm8qIG1haW5EcHlJbmZvKSB7Ci0gICAgUmVjdCB2aWV3cG9ydDsKLSAgICBzdGF0dXNfdCBlcnIgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlWaWV3cG9ydChtYWluRHB5LCAmdmlld3BvcnQpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIGdldCBkaXNwbGF5IHZpZXdwb3J0XG4iKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgbWFpbkRweUluZm8tPncgPSB2aWV3cG9ydC53aWR0aCgpOwotICAgIG1haW5EcHlJbmZvLT5oID0gdmlld3BvcnQuaGVpZ2h0KCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qCiAgKiBSdW5zIHRoZSBNZWRpYUNvZGVjIGVuY29kZXIsIHNlbmRpbmcgdGhlIG91dHB1dCB0byB0aGUgTWVkaWFNdXhlci4gIFRoZQogICogaW5wdXQgZnJhbWVzIGFyZSBjb21pbmcgZnJvbSB0aGUgdmlydHVhbCBkaXNwbGF5IGFzIGZhc3QgYXMgU3VyZmFjZUZsaW5nZXIKICAqIHdhbnRzIHRvIHNlbmQgdGhlbS4KQEAgLTQyOSwyMiArNDE0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWZ1bCBzdHVmZiBpcyBoYXJkIHRvIGdldCBhdCB3aXRob3V0IGEgRGFsdmlrIFZNLgogICAgICAgICAgICAgICAgICAgICBlcnIgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKG1haW5EcHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1haW5EcHlJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZ2V0QWN0dWFsRGlzcGxheVNpemUobWFpbkRweSwgJm1haW5EcHlJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gc2V0IGFjdHVhbCBkaXNwbGF5IHNpemVcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiAhPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvcmllbnRhdGlvbiBjaGFuZ2VkLCBub3cgJWQiLCBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbiB0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlQcm9qZWN0aW9uKHQsIHZpcnR1YWxEcHksIG1haW5EcHlJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmFwcGx5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldERpc3BsYXlJbmZvKG1haW4pIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWVudGF0aW9uICE9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgib3JpZW50YXRpb24gY2hhbmdlZCwgbm93ICVkIiwgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbiB0OworICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheVByb2plY3Rpb24odCwgdmlydHVhbERweSwgbWFpbkRweUluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgdC5hcHBseSgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtNjA5LDggKzU4NiwxMiBAQAogICAgIHNlbGYtPnN0YXJ0VGhyZWFkUG9vbCgpOwogCiAgICAgLy8gR2V0IG1haW4gZGlzcGxheSBwYXJhbWV0ZXJzLgotICAgIHNwPElCaW5kZXI+IG1haW5EcHkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAotICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6ZURpc3BsYXlJZE1haW4pOworICAgIGNvbnN0IHNwPElCaW5kZXI+IG1haW5EcHkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgaWYgKG1haW5EcHkgPT0gbnVsbHB0cikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBubyBkaXNwbGF5XG4iKTsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKwogICAgIERpc3BsYXlJbmZvIG1haW5EcHlJbmZvOwogICAgIGVyciA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8obWFpbkRweSwgJm1haW5EcHlJbmZvKTsKICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CkBAIC02MTgsMjUgKzU5OSwxOSBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGVyciA9IGdldEFjdHVhbERpc3BsYXlTaXplKG1haW5EcHksICZtYWluRHB5SW5mbyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gc2V0IGFjdHVhbCBkaXNwbGF5IHNpemVcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQogICAgIGlmIChnVmVyYm9zZSkgewogICAgICAgICBwcmludGYoIk1haW4gZGlzcGxheSBpcyAlZHglZCBAJS4yZmZwcyAob3JpZW50YXRpb249JXUpXG4iLAotICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLncsIG1haW5EcHlJbmZvLmgsIG1haW5EcHlJbmZvLmZwcywKKyAgICAgICAgICAgICAgICBtYWluRHB5SW5mby52aWV3cG9ydFcsIG1haW5EcHlJbmZvLnZpZXdwb3J0SCwgbWFpbkRweUluZm8uZnBzLAogICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogCiAgICAgLy8gRW5jb2RlciBjYW4ndCB0YWtlIG9kZCBudW1iZXIgYXMgY29uZmlnCiAgICAgaWYgKGdWaWRlb1dpZHRoID09IDApIHsKLSAgICAgICAgZ1ZpZGVvV2lkdGggPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby53KTsKKyAgICAgICAgZ1ZpZGVvV2lkdGggPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby52aWV3cG9ydFcpOwogICAgIH0KICAgICBpZiAoZ1ZpZGVvSGVpZ2h0ID09IDApIHsKLSAgICAgICAgZ1ZpZGVvSGVpZ2h0ID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8uaCk7CisgICAgICAgIGdWaWRlb0hlaWdodCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLnZpZXdwb3J0SCk7CiAgICAgfQogCiAgICAgLy8gQ29uZmlndXJlIGFuZCBzdGFydCB0aGUgZW5jb2Rlci4KQEAgLTcxNCw3ICs2ODksOSBAQAogICAgIHNwPE1lZGlhTXV4ZXI+IG11eGVyID0gTlVMTDsKICAgICBGSUxFKiByYXdGcCA9IE5VTEw7CiAgICAgc3dpdGNoIChnT3V0cHV0Rm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgRk9STUFUX01QNDogeworICAgICAgICBjYXNlIEZPUk1BVF9NUDQ6CisgICAgICAgIGNhc2UgRk9STUFUX1dFQk06CisgICAgICAgIGNhc2UgRk9STUFUXzNHUFA6IHsKICAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBtdXhlci4gIFdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIENTRCBibG9iIGZyb20gdGhlIGVuY29kZXIKICAgICAgICAgICAgIC8vIGJlZm9yZSB3ZSBjYW4gc3RhcnQgaXQuCiAgICAgICAgICAgICBlcnIgPSB1bmxpbmsoZmlsZU5hbWUpOwpAQCAtNzI3LDcgKzcwNCwxMyBAQAogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGNvdWxkbid0IG9wZW4gZmlsZVxuIik7CiAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfTVBFR180KTsKKyAgICAgICAgICAgIGlmIChnT3V0cHV0Rm9ybWF0ID09IEZPUk1BVF9NUDQpIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGdPdXRwdXRGb3JtYXQgPT0gRk9STUFUX1dFQk0pIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX1dFQk0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgICAgICBpZiAoZ1JvdGF0ZSkgewogICAgICAgICAgICAgICAgIG11eGVyLT5zZXRPcmllbnRhdGlvbkhpbnQoOTApOyAgLy8gVE9ETzogZG9lcyB0aGlzIGRvIGFueXRoaW5nPwpAQCAtMTA0Nyw2ICsxMDMwLDEwIEBACiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9NUDQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJoMjY0IikgPT0gMCkgewogICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfSDI2NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIndlYm0iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9XRUJNOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiM2dwcCIpID09IDApIHsKKyAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUXzNHUFA7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJmcmFtZXMiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9GUkFNRVM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJyYXctZnJhbWVzIikgPT0gMCkgewpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDdhMTAzMDIuLjZlYjJlOWYgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTgsNyArOCw3IEBACiAgICAgICAgIFNpbmVTb3VyY2UuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9vbXggbGlibWVkaWFleHRyYWN0b3IgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYnV0aWxzIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlianBlZyBsaWJ1aSBsaWJndWkgbGliY3V0aWxzIGxpYmxvZyBcCiAgICAgICAgIGxpYmhpZGxiYXNlIFwKICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIFwKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgcmVjb3JkLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3IgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAgIHJlY29yZHZpZGVvLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3IgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICAgIGF1ZGlvbG9vcC5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXApAQCAtMTExLDcgKzExMSw3IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnVpIGxpYmd1aSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlibWVkaWEgbGliY3V0aWxzIGxpYm1lZGlhZXh0cmFjdG9yCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlibWVkaWEgbGliY3V0aWxzCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXApAQCAtMjAzLDcgKzIwMyw3IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJjdXRpbHMgbGliYyBsaWJtZWRpYWV4dHJhY3RvcgorICAgICAgICBsaWJjdXRpbHMgbGliYwogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKaW5kZXggOTgwZDFkMi4uZTVhNDMzNyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiAgICAgQ0hFQ0soIXN0YXRlQnlUcmFjay5pc0VtcHR5KCkpOwogCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgaW50NjRfdCBzdGFydFRpbWVSZW5kZXIgPSAtMTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKyAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewogICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlQXQoaSk7CkBAIC00MDAsNyArNDAwLDcgQEAKIAogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKIAotICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIHNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlciA9IG5ldyBhbmRyb2lkOjpBTG9vcGVyOwogICAgIGxvb3Blci0+c3RhcnQoKTsKIAogICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQ7CkBAIC00MTEsMTAgKzQxMSwxMiBAQAogICAgICAgICBjb21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7CiAgICAgICAgIENIRUNLX0VRKGNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKIAotICAgICAgICBzcDxJQmluZGVyPiBkaXNwbGF5KFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QnVpbHRJbkRpc3BsYXkoCi0gICAgICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6ZURpc3BsYXlJZE1haW4pKTsKKyAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4gZGlzcGxheSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJuYWxEaXNwbGF5VG9rZW4oKTsKKyAgICAgICAgQ0hFQ0soZGlzcGxheSAhPSBudWxscHRyKTsKKwogICAgICAgICBEaXNwbGF5SW5mbyBpbmZvOwotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKTsKKyAgICAgICAgQ0hFQ0tfRVEoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyksIE5PX0VSUk9SKTsKKwogICAgICAgICBzc2l6ZV90IGRpc3BsYXlXaWR0aCA9IGluZm8udzsKICAgICAgICAgc3NpemVfdCBkaXNwbGF5SGVpZ2h0ID0gaW5mby5oOwogCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwCmluZGV4IDYzMGRlMjUuLjJjZjY5NTUgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwCkBAIC0zMTAsNyArMzEwLDcgQEAKIH0KIAogc3RhdGljIGludCBkZWNvZGUoCi0gICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgIGNvbnN0IHNwPGFuZHJvaWQ6OkFMb29wZXI+ICZsb29wZXIsCiAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICBib29sIHJlbmRlclN1cmZhY2UsCkBAIC00NjUsNyArNDY1LDcgQEAKICAgICBmaWx0ZXJTdGF0ZS0+bVNpZ25hbGxlZElucHV0RU9TID0gZmFsc2U7CiAgICAgZmlsdGVyU3RhdGUtPm1TYXdPdXRwdXRFT1MgPSBmYWxzZTsKIAotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpOwogICAgIGludDY0X3Qgc3RhcnRUaW1lUmVuZGVyID0gLTE7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewpAQCAtNjQzLDcgKzY0Myw3IEBACiAgICAgICAgICAgICAgICAgdXNlVGltZXN0YW1wLCAmc3RhcnRUaW1lUmVuZGVyKTsKICAgICB9CiAKLSAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisgICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KGkpOwpAQCAtNzM3LDcgKzczNyw3IEBACiAKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKLSAgICBhbmRyb2lkOjpzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXIgPSBuZXcgYW5kcm9pZDo6QUxvb3BlcjsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAKICAgICBhbmRyb2lkOjpzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50OwpAQCAtNzQ4LDEwICs3NDgsMTIgQEAKICAgICAgICAgY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSk7CiAKLSAgICAgICAgYW5kcm9pZDo6c3A8SUJpbmRlcj4gZGlzcGxheShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAotICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CisKICAgICAgICAgRGlzcGxheUluZm8gaW5mbzsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyk7CisgICAgICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pLCBOT19FUlJPUik7CisKICAgICAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBpbmZvLnc7CiAgICAgICAgIHNzaXplX3QgZGlzcGxheUhlaWdodCA9IGluZm8uaDsKIApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCmluZGV4IDQ0YjAwMTUuLjk1YTE2ZjMgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTI4LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKaW5kZXggMDMxMTY3Ny4uYmYzNmJlMCAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC00Nyw5ICs0NiwxMSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgpAQCAtNzgsNiArNzksNyBAQAogc3RhdGljIGJvb2wgZ1BsYXliYWNrQXVkaW87CiBzdGF0aWMgYm9vbCBnV3JpdGVNUDQ7CiBzdGF0aWMgYm9vbCBnRGlzcGxheUhpc3RvZ3JhbTsKK3N0YXRpYyBib29sIGdWZXJib3NlID0gZmFsc2U7CiBzdGF0aWMgYm9vbCBzaG93UHJvZ3Jlc3MgPSB0cnVlOwogc3RhdGljIFN0cmluZzggZ1dyaXRlTVA0RmlsZW5hbWU7CiBzdGF0aWMgU3RyaW5nOCBnQ29tcG9uZW50TmFtZU92ZXJyaWRlOwpAQCAtMTU5LDYgKzE2MSwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJzYW1wbGUgZm9ybWF0OiAlc1xuIiwgbWV0YS50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICB9CisKICAgICAgICAgQ0hFQ0tfRVEoCiAgICAgICAgICAgICAgICAgZndyaXRlKChjb25zdCB1aW50OF90ICopbWJ1Zi0+ZGF0YSgpICsgbWJ1Zi0+cmFuZ2Vfb2Zmc2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgIDEsCkBAIC0yMTgsMTEgKzIyNSwxNSBAQAogICAgICAgICBwbGF5ZXItPnNldFNvdXJjZShyYXdTb3VyY2UpOwogICAgICAgICByYXdTb3VyY2UuY2xlYXIoKTsKIAotICAgICAgICBwbGF5ZXItPnN0YXJ0KHRydWUgLyogc291cmNlQWxyZWFkeVN0YXJ0ZWQgKi8pOworICAgICAgICBlcnIgPSBwbGF5ZXItPnN0YXJ0KHRydWUgLyogc291cmNlQWxyZWFkeVN0YXJ0ZWQgKi8pOwogCi0gICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwotICAgICAgICB3aGlsZSAoIXBsYXllci0+cmVhY2hlZEVPUygmZmluYWxTdGF0dXMpKSB7Ci0gICAgICAgICAgICB1c2xlZXAoMTAwMDAwbGwpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKKyAgICAgICAgICAgIHdoaWxlICghcGxheWVyLT5yZWFjaGVkRU9TKCZmaW5hbFN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDAwbGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gc3RhcnQgcGxheWJhY2sgZXJyPSVkICgweCUwOHgpXG4iLCBlcnIsIGVycik7CiAgICAgICAgIH0KIAogICAgICAgICBkZWxldGUgcGxheWVyOwpAQCAtMzQ4LDcgKzM1OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBkZWNvZGVUaW1lc1VzLnB1c2goZGVsYXlEZWNvZGVVcyk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzcyAmJiAobisrICUgMTYpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIlbGQgc2FtcGxlIGZvcm1hdDogJXNcbiIsIG51bUZyYW1lcywgbWV0YS50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd1Byb2dyZXNzICYmIChuKysgJSAxNikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTc5LDEyICs1OTMsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQ0hFQ0soYnVmZmVyICE9IE5VTEwpOworCiAgICAgICAgICAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ0hFQ0soYnVmZmVyICE9IE5VTEwpOwotCiAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIH0KQEAgLTYxNSw3ICs2MjksNyBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1sKGlzdCkgY29tcG9uZW50c1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLW0gbWF4LW51bWJlci1vZi1mcmFtZXMtdG8tZGVjb2RlIGluIGVhY2ggcGFzc1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWIgYnVnIHRvIHJlcHJvZHVjZVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXAocm9maWxlcykgZHVtcCBkZWNvZGVyIHByb2ZpbGVzIHN1cHBvcnRlZFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWkobmZvKSBkdW1wIGNvZGVjIGluZm8gKHByb2ZpbGVzIGFuZCBjb2xvciBmb3JtYXRzIHN1cHBvcnRlZCwgZGV0YWlscylcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10KGh1bWJuYWlsKSBleHRyYWN0IHZpZGVvIHRodW1ibmFpbCBvciBhbGJ1bSBhcnRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1zKG9mdHdhcmUpIHByZWZlciBzb2Z0d2FyZSBjb2RlY1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXIoaGFyZHdhcmUpIGZvcmNlIHRvIHVzZSBoYXJkd2FyZSBjb2RlY1xuIik7CkBAIC02MzAsNTUgKzY0NCwxMzQgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtVCBhbGxvY2F0ZSBidWZmZXJzIGZyb20gYSBzdXJmYWNlIHRleHR1cmVcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1kKHVtcCkgb3V0cHV0X2ZpbGVuYW1lIChyYXcgc3RyZWFtIGRhdGEgdG8gYSBmaWxlKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLUQodW1wKSBvdXRwdXRfZmlsZW5hbWUgKGRlY29kZWQgUENNIGRhdGEgdG8gYSBmaWxlKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXYgYmUgbW9yZSB2ZXJib3NlXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgZHVtcENvZGVjUHJvZmlsZXMoYm9vbCBxdWVyeURlY29kZXJzKSB7Ci0gICAgY29uc3QgY2hhciAqa01pbWVUeXBlc1tdID0gewotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LAotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLAotICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDCi0gICAgfTsKLQotICAgIGNvbnN0IGNoYXIgKmNvZGVjVHlwZSA9IHF1ZXJ5RGVjb2RlcnM/ICJkZWNvZGVyIiA6ICJlbmNvZGVyIjsKLSAgICBwcmludGYoIiVzIHByb2ZpbGVzOlxuIiwgY29kZWNUeXBlKTsKK3N0YXRpYyB2b2lkIGR1bXBDb2RlY0RldGFpbHMoYm9vbCBxdWVyeURlY29kZXJzKSB7CisgICAgY29uc3QgY2hhciAqY29kZWNUeXBlID0gcXVlcnlEZWNvZGVycz8gIkRlY29kZXIiIDogIkVuY29kZXIiOworICAgIHByaW50ZigiXG4lcyBpbmZvcyBieSBtZWRpYSB0eXBlczpcbiIKKyAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iLCBjb2RlY1R5cGUpOwogCiAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CiAgICAgc2l6ZV90IG51bUNvZGVjcyA9IGxpc3QtPmNvdW50Q29kZWNzKCk7CiAKLSAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHNpemVvZihrTWltZVR5cGVzKSAvIHNpemVvZihrTWltZVR5cGVzWzBdKTsgKytrKSB7Ci0gICAgICAgIHByaW50ZigidHlwZSAnJXMnOlxuIiwga01pbWVUeXBlc1trXSk7CisgICAgLy8gZ2F0aGVyIGFsbCBtZWRpYSB0eXBlcyBzdXBwb3J0ZWQgYnkgY29kZWMgY2xhc3MsIGFuZCBsaW5rIHRvIGNvZGVjcyB0aGF0IHN1cHBvcnQgdGhlbQorICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+PiBhbGxNZWRpYVR5cGVzOworICAgIGZvciAoc2l6ZV90IGNvZGVjX2l4ID0gMDsgY29kZWNfaXggPCBudW1Db2RlY3M7ICsrY29kZWNfaXgpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oY29kZWNfaXgpOworICAgICAgICBpZiAoaW5mby0+aXNFbmNvZGVyKCkgPT0gIXF1ZXJ5RGVjb2RlcnMpIHsKKyAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBzdXBwb3J0ZWRNZWRpYVR5cGVzOworICAgICAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmc3VwcG9ydGVkTWVkaWFUeXBlcyk7CisgICAgICAgICAgICBpZiAoIXN1cHBvcnRlZE1lZGlhVHlwZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJ3YXJuaW5nOiAlcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBtZWRpYSB0eXBlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBBU3RyaW5nICZtZWRpYVR5cGUgOiBzdXBwb3J0ZWRNZWRpYVR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGxNZWRpYVR5cGVzLmluZGV4T2ZLZXkobWVkaWFUeXBlKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1lZGlhVHlwZXMuYWRkKG1lZGlhVHlwZSwgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4oKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWxsTWVkaWFUeXBlcy5lZGl0VmFsdWVGb3IobWVkaWFUeXBlKS5hZGQoaW5mbyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBudW1Db2RlY3M7ICsraW5kZXgpIHsKLSAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChpbmZvID09IE5VTEwgfHwgaW5mby0+aXNFbmNvZGVyKCkgIT0gIXF1ZXJ5RGVjb2RlcnMpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPSBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3Ioa01pbWVUeXBlc1trXSk7CisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgYm9vbD4gdmlzaXRlZENvZGVjczsKKyAgICBmb3IgKHNpemVfdCB0eXBlX2l4ID0gMDsgdHlwZV9peCA8IGFsbE1lZGlhVHlwZXMuc2l6ZSgpOyArK3R5cGVfaXgpIHsKKyAgICAgICAgY29uc3QgQVN0cmluZyAmbWVkaWFUeXBlID0gYWxsTWVkaWFUeXBlcy5rZXlBdCh0eXBlX2l4KTsKKyAgICAgICAgcHJpbnRmKCJcbk1lZGlhIHR5cGUgJyVzJzpcbiIsIG1lZGlhVHlwZS5jX3N0cigpKTsKKworICAgICAgICBmb3IgKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbyA6IGFsbE1lZGlhVHlwZXMudmFsdWVBdCh0eXBlX2l4KSkgeworICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9IGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtZWRpYVR5cGUuY19zdHIoKSk7CiAgICAgICAgICAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJ3YXJuaW5nOiAlcyBkb2VzIG5vdCBoYXZlIGNhcGFiaWxpdGllcyBmb3IgdHlwZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENvZGVjTmFtZSgpLCBtZWRpYVR5cGUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludGYoIiAgJXMgJyVzJyBzdXBwb3J0cyAiLAorICAgICAgICAgICAgcHJpbnRmKCIgICVzIFwiJXNcIiBzdXBwb3J0c1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNUeXBlLCBpbmZvLT5nZXRDb2RlY05hbWUoKSk7CiAKLSAgICAgICAgICAgIFZlY3RvcjxNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsPiBwcm9maWxlTGV2ZWxzOwotICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygmcHJvZmlsZUxldmVscyk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZUxldmVscy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHByaW50ZigiTk9USElORy5cbiIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYXV0byBwcmludExpc3QgPSBbXShjb25zdCBjaGFyICp0eXBlLCBjb25zdCBWZWN0b3I8QVN0cmluZz4gJnZhbHVlcyl7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgJXM6IFsiLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHZhbHVlcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuICAgICAgJXMlcyIsIHZhbHVlc1tqXS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPT0gdmFsdWVzLnNpemUoKSAtIDEgPyAiICIgOiAiLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGYoIl1cbiIpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKHZpc2l0ZWRDb2RlY3MuaW5kZXhPZktleShpbmZvLT5nZXRDb2RlY05hbWUoKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgdmlzaXRlZENvZGVjcy5hZGQoaW5mby0+Z2V0Q29kZWNOYW1lKCksIHRydWUpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGFsaWFzZXM7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldEFsaWFzZXMoJmFsaWFzZXMpOworICAgICAgICAgICAgICAgICAgICAvLyBxdW90ZSBhbGlhcworICAgICAgICAgICAgICAgICAgICBmb3IgKEFTdHJpbmcgJmFsaWFzIDogYWxpYXNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMuaW5zZXJ0KCJcIiIsIDEsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMuYXBwZW5kKCciJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRMaXN0KCJhbGlhc2VzIiwgYWxpYXNlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXR0cnMgPSBpbmZvLT5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBsaXN0OworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCJlbmNvZGVyOiAlZCIsICEhKGF0dHJzICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNFbmNvZGVyKSkpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCJ2ZW5kb3I6ICVkIiwgISEoYXR0cnMgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1ZlbmRvcikpKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50Zigic29mdHdhcmUtb25seTogJWQiLCAhIShhdHRycyAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzU29mdHdhcmVPbmx5KSkpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCJody1hY2NlbGVyYXRlZDogJWQiLCAhIShhdHRycyAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRMaXN0KEFTdHJpbmdQcmludGYoImF0dHJpYnV0ZXM6ICUjeCIsIGF0dHJzKS5jX3N0cigpLCBsaXN0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICBvd25lcjogXCIlc1wiXG4iLCBpbmZvLT5nZXRPd25lck5hbWUoKSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgcmFuazogJXVcbiIsIGluZm8tPmdldFJhbmsoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiICAgIGFsaWFzZXMsIGF0dHJpYnV0ZXMsIG93bmVyLCByYW5rOiBzZWUgYWJvdmVcbiIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHByb2ZpbGVMZXZlbHMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsICZwcm9maWxlTGV2ZWwgPSBwcm9maWxlTGV2ZWxzW2pdOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBsaXN0OworICAgICAgICAgICAgICAgIFZlY3RvcjxNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsPiBwcm9maWxlTGV2ZWxzOworICAgICAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoJnByb2ZpbGVMZXZlbHMpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgTWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbCAmcGwgOiBwcm9maWxlTGV2ZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5pY2VQcm9maWxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX0FVRElPX0FBQykgICA/IGFzU3RyaW5nX0FBQ09iamVjdChwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fTVBFRzIpID8gYXNTdHJpbmdfTVBFRzJQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19IMjYzKSAgPyBhc1N0cmluZ19IMjYzUHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fTVBFRzQpID8gYXNTdHJpbmdfTVBFRzRQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19BVkMpICAgPyBhc1N0cmluZ19BVkNQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDgpICAgPyBhc1N0cmluZ19WUDhQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19IRVZDKSAgPyBhc1N0cmluZ19IRVZDUHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fVlA5KSAgID8gYXNTdHJpbmdfVlA5UHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fQVYxKSAgID8gYXNTdHJpbmdfQVYxUHJvZmlsZShwbC5tUHJvZmlsZSkgOiI/PyI7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5pY2VMZXZlbCA9CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHMikgPyBhc1N0cmluZ19NUEVHMkxldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fSDI2MykgID8gYXNTdHJpbmdfSDI2M0xldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fTVBFRzQpID8gYXNTdHJpbmdfTVBFRzRMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0FWQykgICA/IGFzU3RyaW5nX0FWQ0xldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fVlA4KSAgID8gYXNTdHJpbmdfVlA4TGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19IRVZDKSAgPyBhc1N0cmluZ19IRVZDVGllckxldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fVlA5KSAgID8gYXNTdHJpbmdfVlA5TGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19BVjEpICAgPyBhc1N0cmluZ19BVjFMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICI/PyI7CiAKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzJXUvJXUiLCBqID4gMCA/ICIsICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbC5tUHJvZmlsZSwgcHJvZmlsZUxldmVsLm1MZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoIiUgNXUvJSA1dSAoJXMvJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbC5tUHJvZmlsZSwgcGwubUxldmVsLCBuaWNlUHJvZmlsZSwgbmljZUxldmVsKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50TGlzdCgicHJvZmlsZS9sZXZlbHMiLCBsaXN0KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBsaXN0OworICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gY29sb3JzOworICAgICAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZENvbG9yRm9ybWF0cygmY29sb3JzKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvbG9yIDogY29sb3JzKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoIiUjeCAoJXMpIiwgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmdfQ29sb3JGb3JtYXQoKGludDMyX3QpY29sb3IpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50TGlzdCgiY29sb3JzIiwgbGlzdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaW50ZigiICAgIGRldGFpbHM6ICVzXG4iLCBjYXBzLT5nZXREZXRhaWxzKCktPmRlYnVnU3RyaW5nKDYpLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNjg4LDcgKzc4MSw3IEBACiAKICAgICBib29sIGF1ZGlvT25seSA9IGZhbHNlOwogICAgIGJvb2wgbGlzdENvbXBvbmVudHMgPSBmYWxzZTsKLSAgICBib29sIGR1bXBQcm9maWxlcyA9IGZhbHNlOworICAgIGJvb2wgZHVtcENvZGVjSW5mbyA9IGZhbHNlOwogICAgIGJvb2wgZXh0cmFjdFRodW1ibmFpbCA9IGZhbHNlOwogICAgIGJvb2wgc2Vla1Rlc3QgPSBmYWxzZTsKICAgICBib29sIHVzZVN1cmZhY2VBbGxvYyA9IGZhbHNlOwpAQCAtNzA1LDEwICs3OTgsMTAgQEAKICAgICBnV3JpdGVNUDQgPSBmYWxzZTsKICAgICBnRGlzcGxheUhpc3RvZ3JhbSA9IGZhbHNlOwogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyOworICAgIHNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlcjsKIAogICAgIGludCByZXM7Ci0gICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhcW46bG06YjpwdHNyb3c6a046eFNUZDpEOiIpKSA+PSAwKSB7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgInZoYXFuOmxtOmI6aXRzcm93OmtOOnhTVGQ6RDoiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CkBAIC03NzgsOSArODcxLDkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkdW1wUHJvZmlsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGR1bXBDb2RlY0luZm8gPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC04MzIsNiArOTI1LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdWZXJib3NlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC05MTUsOSArMTAxNCw5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGlmIChkdW1wUHJvZmlsZXMpIHsKLSAgICAgICAgZHVtcENvZGVjUHJvZmlsZXModHJ1ZSAvKiBxdWVyeURlY29kZXJzICovKTsKLSAgICAgICAgZHVtcENvZGVjUHJvZmlsZXMoZmFsc2UgLyogcXVlcnlEZWNvZGVycyAqLyk7CisgICAgaWYgKGR1bXBDb2RlY0luZm8pIHsKKyAgICAgICAgZHVtcENvZGVjRGV0YWlscyh0cnVlIC8qIHF1ZXJ5RGVjb2RlcnMgKi8pOworICAgICAgICBkdW1wQ29kZWNEZXRhaWxzKGZhbHNlIC8qIHF1ZXJ5RGVjb2RlcnMgKi8pOwogICAgIH0KIAogICAgIGlmIChsaXN0Q29tcG9uZW50cykgewpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCmluZGV4IGIwMTk5ZDguLjM1YmRiYzAgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTMyLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIApAQCAtMzE4LDEwICszMTgsMTIgQEAKICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKICAgICBDSEVDS19FUShjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CiAKLSAgICBzcDxJQmluZGVyPiBkaXNwbGF5KFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QnVpbHRJbkRpc3BsYXkoCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplRGlzcGxheUlkTWFpbikpOworICAgIGNvbnN0IHNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgQ0hFQ0soZGlzcGxheSAhPSBudWxscHRyKTsKKwogICAgIERpc3BsYXlJbmZvIGluZm87Ci0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyk7CisgICAgQ0hFQ0tfRVEoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyksIE5PX0VSUk9SKTsKKwogICAgIHNzaXplX3QgZGlzcGxheVdpZHRoID0gaW5mby53OwogICAgIHNzaXplX3QgZGlzcGxheUhlaWdodCA9IGluZm8uaDsKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcCBiL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKaW5kZXggZjczNDkwNS4uYWVjNTk1OSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcAorKysgYi9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCkBAIC03OSwxMiArNzksMTIgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y29uc3VtZVJpZ2h0cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIHJldHVybiBvbkNvbnN1bWVSaWdodHModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OnNldFBsYXliYWNrU3RhdHVzKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgcmV0dXJuIG9uU2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiB9CiAKQEAgLTEyMCw3ICsxMjAsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAogICAgIGlmICghbWltZSB8fCBtaW1lWzBdID09ICdcMCcpIHsKQEAgLTEzMSw3ICsxMzEsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgaWYgKCFtaW1lIHx8IG1pbWVbMF0gPT0gJ1wwJykgewogICAgICAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHVyaSk7CkBAIC0xMzksMzMgKzEzOSwzMyBAQAogICAgIHJldHVybiBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgdXJpLCBtaW1lKTsKIH0KIAotc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3N0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZiwgbWltZVR5cGUpOwogfQogCi1zdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgcmV0dXJuIG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgcmV0dXJuIG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6ZGVjcnlwdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICByZXR1cm4gb25EZWNyeXB0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIHJldHVybiBvbkZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOwogfQogCiBzc2l6ZV90IERybUVuZ2luZUJhc2U6OnByZWFkKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICByZXR1cm4gb25QcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDQ0Zjk4ZGQuLmE2ZDMzYjAgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTM5LDcgKzM5LDcgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdGF0aWMgdm9pZCB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoCi0gICAgICAgIGNvbnN0IERlY3J5cHRIYW5kbGUqIGhhbmRsZSwgUGFyY2VsKiBkYXRhKSB7CisgICAgICAgIGNvbnN0IHNwPERlY3J5cHRIYW5kbGU+JiBoYW5kbGUsIFBhcmNlbCogZGF0YSkgewogICAgIGRhdGEtPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0SWQpOwogICAgIGRhdGEtPndyaXRlU3RyaW5nOChoYW5kbGUtPm1pbWVUeXBlKTsKICAgICBkYXRhLT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOwpAQCAtNjcsNyArNjcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUsIGNvbnN0IFBhcmNlbCYgZGF0YSkgeworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgaGFuZGxlLCBjb25zdCBQYXJjZWwmIGRhdGEpIHsKICAgICBpZiAoMCA9PSBkYXRhLmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC05OSw3ICs5OSw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjbGVhckRlY3J5cHRIYW5kbGUoRGVjcnlwdEhhbmRsZSogaGFuZGxlKSB7CitzdGF0aWMgdm9pZCBjbGVhckRlY3J5cHRIYW5kbGUoc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSkgewogICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDE0LDcgKzQxNCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgQUxPR1YoImNvbnN1bWVSaWdodHMiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTQzMSw3ICs0MzEsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBBTE9HVigic2V0UGxheWJhY2tTdGF0dXMiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTYwMyw3ICs2MDMsNyBAQAogICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKIH0KIAotRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC02MjEsNyArNjIxLDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CkBAIC02MjksNyArNjI5LDcgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKICAgICBBTE9HVigiRW50ZXJpbmcgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uOiBtaW1lPSVzIiwgbWltZT8gbWltZTogIk5VTEwiKTsKQEAgLTY0Niw3ICs2NDYsNyBAQAogCiAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fREVDUllQVF9TRVNTSU9OX0ZST01fVVJJLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKQEAgLTY1Niw3ICs2NTYsNyBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTY3Myw3ICs2NzMsNyBAQAogCiAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fREVDUllQVF9TRVNTSU9OX0ZPUl9TVFJFQU1JTkcsIGRhdGEsICZyZXBseSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgewogICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwpAQCAtNjgzLDcgKzY4Myw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIEFMT0dWKCJjbG9zZURlY3J5cHRTZXNzaW9uIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC02OTgsNyArNjk4LDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICBBTE9HVigiaW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNzE4LDcgKzcxOCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmRlY3J5cHQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgQUxPR1YoImRlY3J5cHQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC03NTQsNyArNzU0LDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgQUxPR1YoImZpbmFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTc3MCw3ICs3NzAsNyBAQAogfQogCiBzc2l6ZV90IEJwRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIEFMT0dWKCJyZWFkIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtMTEyOCwxNiArMTEyOCwxNiBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgYWN0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgY29uc3QgYm9vbCByZXNlcnZlID0gc3RhdGljX2Nhc3Q8Ym9vbD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBjb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCAmaGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOworICAgICAgICAgICAgPSBjb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBoYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CiAKQEAgLTExNDgsMTYgKzExNDgsMTYgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IHBsYXliYWNrU3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgY29uc3QgaW50NjRfdCBwb3NpdGlvbiA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBzZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgJmhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgID0gc2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsIGhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KIApAQCAtMTMyOSwxMyArMTMyOSwxMyBAQAogICAgICAgICBjb25zdCBvZmY2NF90IGxlbmd0aCA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgIGNvbnN0IFN0cmluZzggbWltZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlCiAgICAgICAgICAgICA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZmQsIG9mZnNldCwgbGVuZ3RoLCBtaW1lLnN0cmluZygpKTsKIAotICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKLSAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKKyAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CisgICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLmdldCgpLCByZXBseSk7CiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KQEAgLTEzNDksMTMgKzEzNDksMTMgQEAKICAgICAgICAgY29uc3QgU3RyaW5nOCB1cmkgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAgICAgICAgIGNvbnN0IFN0cmluZzggbWltZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaS5zdHJpbmcoKSwgbWltZS5zdHJpbmcoKSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLnN0cmluZygpLCBtaW1lLnN0cmluZygpKTsKIAotICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKLSAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKKyAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CisgICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLmdldCgpLCByZXBseSk7CiAKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwotICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk5VTEwgZGVjcnlwdEhhbmRsZSBpcyByZXR1cm5lZCIpOwogICAgICAgICB9CkBAIC0xMzczLDEzICsxMzczLDEyIEBACiAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSk7CiAgICAgICAgIGNvbnN0IFN0cmluZzggbWltZVR5cGUoZGF0YS5yZWFkU3RyaW5nOCgpKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGJ1ZiwgbWltZVR5cGUpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGJ1ZiwgbWltZVR5cGUpOwogCiAgICAgICAgIGlmIChoYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwogICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBkZWxldGUgaGFuZGxlOwotICAgICAgICAgICAgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk5VTEwgZGVjcnlwdEhhbmRsZSBpcyByZXR1cm5lZCIpOwogICAgICAgICB9CkBAIC0xMzkzLDcgKzEzOTIsNyBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGhhbmRsZSk7CkBAIC0xNDA4LDggKzE0MDcsOCBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgZGVjcnlwdFVuaXRJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKQEAgLTE0MTcsMTcgKzE0MTYsMTcgQEAKICAgICAgICAgY29uc3QgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChidWZmZXJTaXplID4gZGF0YS5kYXRhQXZhaWwoKSkgewogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoQkFEX1ZBTFVFKTsKLSAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICAgICAgfQogICAgICAgICBEcm1CdWZmZXIqIGhlYWRlckluZm8gPSBOVUxMOwogICAgICAgICBoZWFkZXJJbmZvID0gbmV3IERybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSksIGJ1ZmZlclNpemUpOwogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBpbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsICZoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgICAgICAgICAgPSBpbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgZGVsZXRlIGhlYWRlckluZm87IGhlYWRlckluZm8gPSBOVUxMOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KQEAgLTE0MzksOCArMTQzOCw4IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGU7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgZGVjcnlwdFVuaXRJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGRlY0J1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTQ1MCw3ICsxNDQ5LDcgQEAKICAgICAgICAgICAgIGRlY0J1ZmZlclNpemUgPiBNQVhfQklOREVSX1RSQU5TQUNUSU9OX1NJWkUpIHsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNDcwLDcgKzE0NjksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCi0gICAgICAgICAgICA9IGRlY3J5cHQodW5pcXVlSWQsICZoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgJmRlY0J1ZmZlciwgSVYpOworICAgICAgICAgICAgPSBkZWNyeXB0KHVuaXF1ZUlkLCBoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgJmRlY0J1ZmZlciwgSVYpOwogCiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKQEAgLTE0ODAsNyArMTQ3OSw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGUoZGVjQnVmZmVyLT5kYXRhLCBzaXplKTsKICAgICAgICAgfQogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBlbmNCdWZmZXI7IGVuY0J1ZmZlciA9IE5VTEw7CiAgICAgICAgIGRlbGV0ZSBkZWNCdWZmZXI7IGRlY0J1ZmZlciA9IE5VTEw7CiAgICAgICAgIGRlbGV0ZSBbXSBidWZmZXI7IGJ1ZmZlciA9IE5VTEw7CkBAIC0xNDk1LDEzICsxNDk0LDEzIEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCi0gICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsICZoYW5kbGUsIGRhdGEucmVhZEludDMyKCkpOworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBmaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBoYW5kbGUsIGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQogCkBAIC0xNTEyLDggKzE1MTEsOCBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCB1aW50MzJfdCBudW1CeXRlcyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChudW1CeXRlcyA+IE1BWF9CSU5ERVJfVFJBTlNBQ1RJT05fU0laRSkgewpAQCAtMTUyNCwxMyArMTUyMywxMyBAQAogCiAgICAgICAgIGNvbnN0IG9mZjY0X3Qgb2Zmc2V0ID0gZGF0YS5yZWFkSW50NjQoKTsKIAotICAgICAgICBzc2l6ZV90IHJlc3VsdCA9IHByZWFkKHVuaXF1ZUlkLCAmaGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICBzc2l6ZV90IHJlc3VsdCA9IHByZWFkKHVuaXF1ZUlkLCBoYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgIGlmICgwIDwgcmVzdWx0KSB7CiAgICAgICAgICAgICByZXBseS0+d3JpdGUoYnVmZmVyLCByZXN1bHQpOwogICAgICAgICB9CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgZGVsZXRlIFtdIGJ1ZmZlciwgYnVmZmVyID0gTlVMTDsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAppbmRleCA0MTcxMDdmLi43M2YxMWE0IDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKQEAgLTU5LDEwICs1OSwxMSBAQAogCiAgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CiAKLSAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sCisgICAgICAgICAgICBib29sIHJlc2VydmUpOwogCiAgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgYm9vbCB2YWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTgwLDI3ICs4MSwyOCBAQAogICAgIERybVN1cHBvcnRJbmZvKiBnZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpOwogCiAgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKTsKIAogICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCiBwcm90ZWN0ZWQ6CkBAIC0yNjUsNyArMjY3LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CiAKICAgICAvKioKQEAgLTI4MCw3ICsyODIsOCBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbikgPSAwOwogCiAgICAgLyoqCiAgICAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KQEAgLTM4MSw3ICszODQsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCkgPSAwOwogCiAgICAgLyoqCkBAIC0zOTgsNyArNDAxLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgaW50IC8qIGZkICovLCBvZmY2NF90IC8qIG9mZnNldCAqLywgb2ZmNjRfdCAvKiBsZW5ndGggKi8sCiAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBtaW1lICovKSB7CiAKQEAgLTQxNSw3ICs0MTgsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkpID0gMDsKIAogICAgIC8qKgpAQCAtNDMwLDcgKzQzMyw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIHVyaSAqLywgY29uc3QgY2hhciogLyogbWltZSAqLykgewogCiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKQEAgLTQ0Nyw3ICs0NTAsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIC8qIGJ1ZiAqLywKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qIG1pbWVUeXBlICovKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKQEAgLTQ2MSw3ICs0NjQsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKQEAgLTQ3Myw3ICs0NzYsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOwogCiAgICAgLyoqCkBAIC00OTMsNyArNDk2LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCiAgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CiAKICAgICAvKioKQEAgLTUwNiw3ICs1MDksNyBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCkBAIC01MTksNyArNTIyLDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAppbmRleCBhY2M4ZWQ5Li4xODM3YTExIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBJbmZvcm1zIHRoZSBEUk0gRW5naW5lIGFib3V0IHRoZSBwbGF5YmFjayBhY3Rpb25zIHBlcmZvcm1lZCBvbiB0aGUgRFJNIGZpbGVzLgpAQCAtMjIzLDcgKzIyMyw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pID0gMDsKIAogICAgIC8qKgpAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCiAgICAgLyoqCkBAIC0zNDIsNyArMzQyLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCiAgICAgLyoqCkBAIC0zNTUsNyArMzU1LDcgQEAKICAgICAgKiBAcmV0dXJuCiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOwogCiAgICAgLyoqCkBAIC0zNjYsNyArMzY2LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKQEAgLTM3OCw3ICszNzgsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSA9IDA7CiAKICAgICAvKioKQEAgLTM5OCw3ICszOTgsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOwogCiAgICAgLyoqCkBAIC00MTEsNyArNDExLDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKIAogICAgIC8qKgogICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KQEAgLTQyNCw3ICs0MjQsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCmluZGV4IDAzNzZiNDkuLjgzNmFlMGEgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTExNSwxMCArMTE1LDExIEBACiAgICAgdmlydHVhbCBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywKKyAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pID0gMDsKIAogICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKQEAgLTEzOCwyOCArMTM5LDI4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbygKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSkgPSAwOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSA9IDA7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLG9mZjY0X3Qgb2Zmc2V0KSA9IDA7CiB9OwogCkBAIC0yMDMsMTAgKzIwNCwxMCBAQAogICAgIHZpcnR1YWwgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC0yMjUsMjggKzIyNiwyOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiB9OwogCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAppbmRleCBiZjA0YTg5Li5hZmJjYjM5IDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKQEAgLTI2Nyw3ICsyNjcsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpjb25zdW1lUmlnaHRzKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTI3OCw3ICsyNzgsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0zOTYsMTUgKzM5NiwxNSBAQAogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKLSAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewpAQCAtNDIwLDE5ICs0MjAsMTkgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgewotICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICB9CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQ0OCwyMCArNDQ4LDIwIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIEFMT0dWKCJEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb246IG5vIGNhcGFibGUgcGx1Zy1pbiBmb3VuZCIpOwogICAgIH0KICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKLSAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewpAQCAtNDc3LDIwICs0NzcsMTkgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgewotICAgICAgICBkZWxldGUgaGFuZGxlOwotICAgICAgICBoYW5kbGUgPSBOVUxMOworICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgQUxPR1YoIkRybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbm8gY2FwYWJsZSBwbHVnLWluIGZvdW5kIik7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXI6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtRGVjcnlwdFNlc3Npb25NYXAudmFsdWVGb3IoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgcmVzdWx0ID0gZHJtRW5naW5lLT5jbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKLSAgICAgICAgaWYgKERSTV9OT19FUlJPUiA9PSByZXN1bHQpIHsKKyAgICAgICAgaWYgKERSTV9OT19FUlJPUiA9PSByZXN1bHQgJiYgTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgICAgICBtRGVjcnlwdFNlc3Npb25NYXAucmVtb3ZlSXRlbShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwogICAgICAgICB9CiAgICAgfQpAQCAtNDk4LDcgKzQ5Nyw4IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC01MDgsNyArNTA4LDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyOjpkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogCkBAIC01MjIsNyArNTIyLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTUzMiw3ICs1MzIsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXNzaXplX3QgRHJtTWFuYWdlcjo6cHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3NpemVfdCBEcm1NYW5hZ2VyOjpwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIHNzaXplX3QgcmVzdWx0ID0gREVDUllQVF9GSUxFX0VSUk9SOwogCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oCmluZGV4IGU3Y2RkMzYuLjI2MjIyYmMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oCkBAIC04OSwxMCArODksMTEgQEAKIAogICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC0xMDksMjUgKzExMCwyNiBAQAogCiAgICAgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIHZvaWQgb25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCBkYWQ1OTliLi4yNjAwYTJjIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtNTgsMjIgKzU4LDI2IEBACiAgICAgcmV0dXJuIGRybV9wZXJtX2xhYmVsc1tpbmRleF07CiB9CiAKLWJvb2wgRHJtTWFuYWdlclNlcnZpY2U6OnNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGRybV9wZXJtX3QgcGVybSkgeworYm9vbCBEcm1NYW5hZ2VyU2VydmljZTo6c2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgY29uc3QgY2hhciogc3NpZCwgZHJtX3Blcm1fdCBwZXJtKSB7CiAgICAgaWYgKHNlbGludXhfZW5hYmxlZCA8PSAwKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIGNoYXIgKnNjdHg7CisgICAgY2hhciAqc2N0eCA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqc2VsaW51eF9jbGFzcyA9ICJkcm1zZXJ2aWNlIjsKICAgICBjb25zdCBjaGFyICpzdHJfcGVybSA9IGdldF9wZXJtX2xhYmVsKHBlcm0pOwogCi0gICAgaWYgKGdldHBpZGNvbihzcGlkLCAmc2N0eCkgIT0gMCkgewotICAgICAgICBBTE9HRSgiU0VMaW51eDogZ2V0cGlkY29uKHBpZD0lZCkgZmFpbGVkLlxuIiwgc3BpZCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3NpZCA9PSBOVUxMKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTIxMDM1MDQyIik7CisKKyAgICAgICAgaWYgKGdldHBpZGNvbihzcGlkLCAmc2N0eCkgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlNFTGludXg6IGdldHBpZGNvbihwaWQ9JWQpIGZhaWxlZC5cbiIsIHNwaWQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgfQogCi0gICAgYm9vbCBhbGxvd2VkID0gKHNlbGludXhfY2hlY2tfYWNjZXNzKHNjdHgsIGRybXNlcnZlcl9jb250ZXh0LCBzZWxpbnV4X2NsYXNzLAotICAgICAgICAgICAgc3RyX3Blcm0sIE5VTEwpID09IDApOworICAgIGJvb2wgYWxsb3dlZCA9IChzZWxpbnV4X2NoZWNrX2FjY2Vzcyhzc2lkID8gc3NpZCA6IHNjdHgsIGRybXNlcnZlcl9jb250ZXh0LAorICAgICAgICAgICAgc2VsaW51eF9jbGFzcywgc3RyX3Blcm0sIE5VTEwpID09IDApOwogICAgIGZyZWVjb24oc2N0eCk7CiAKICAgICByZXR1cm4gYWxsb3dlZDsKQEAgLTg2LDEwICs5MCwxMSBAQAogICAgIElQQ1RocmVhZFN0YXRlKiBpcGNTdGF0ZSA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CiAgICAgdWlkX3QgdWlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdVaWQoKTsKICAgICBwaWRfdCBzcGlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBjaGFyKiBzc2lkID0gaXBjU3RhdGUtPmdldENhbGxpbmdTaWQoKTsKIAogICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdHJ1c3RlZFVpZHMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKHRydXN0ZWRVaWRzW2ldID09IHVpZCkgewotICAgICAgICAgICAgcmV0dXJuIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHNwaWQsIHBlcm0pOworICAgICAgICAgICAgcmV0dXJuIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHNwaWQsIHNzaWQsIHBlcm0pOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKQEAgLTk3LDcgKzEwMiw5IEBACiAKIHZvaWQgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgewogICAgIEFMT0dWKCJpbnN0YW50aWF0ZSIpOwotICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKFN0cmluZzE2KCJkcm0uZHJtTWFuYWdlciIpLCBuZXcgRHJtTWFuYWdlclNlcnZpY2UoKSk7CisgICAgc3A8RHJtTWFuYWdlclNlcnZpY2U+IHNlcnZpY2UgPSBuZXcgRHJtTWFuYWdlclNlcnZpY2UoKTsKKyAgICBzZXJ2aWNlLT5zZXRSZXF1ZXN0aW5nU2lkKHRydWUpOworICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKFN0cmluZzE2KCJkcm0uZHJtTWFuYWdlciIpLCBzZXJ2aWNlKTsKIAogICAgIGlmICgwID49IHRydXN0ZWRVaWRzLnNpemUoKSkgewogICAgICAgICAvLyBUT0RPCkBAIC0yMDYsNyArMjEzLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGNvbnN1bWVSaWdodHMiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoQ09OU1VNRV9SSUdIVFMpKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTIxNSw3ICsyMjIsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIHNldFBsYXliYWNrU3RhdHVzIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKFNFVF9QTEFZQkFDS19TVEFUVVMpKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTI2Miw3ICsyNjksNyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlci0+Z2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsIGxlbmd0aCwgZHJtU3VwcG9ydEluZm9BcnJheSk7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CiAgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoT1BFTl9ERUNSWVBUX1NFU1NJT04pKSB7CkBAIC0yNzIsNyArMjc5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIHdpdGggdXJpIik7CiAgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoT1BFTl9ERUNSWVBUX1NFU1NJT04pKSB7CkBAIC0yODIsNyArMjg5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIGZvciBzdHJlYW1pbmciKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI5Miw3ICsyOTksNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgY2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChDTE9TRV9ERUNSWVBUX1NFU1NJT04pKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTMwMCw3ICszMDcsNyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlci0+Y2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIEFMT0dWKCJFbnRlcmluZyBpbml0aWFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoSU5JVElBTElaRV9ERUNSWVBUX1VOSVQpKSB7CkBAIC0zMTAsNyArMzE3LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmRlY3J5cHQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGRlY3J5cHQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoREVDUllQVCkpIHsKQEAgLTMyMCw3ICszMjcsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGZpbmFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoRklOQUxJWkVfREVDUllQVF9VTklUKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CkBAIC0zMjgsNyArMzM1LDcgQEAKICAgICByZXR1cm4gbURybU1hbmFnZXItPmZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOwogfQogCi1zc2l6ZV90IERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzc2l6ZV90IERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIEFMT0dWKCJFbnRlcmluZyBwcmVhZCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChQUkVBRCkpIHsKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaAppbmRleCA0NWNlZTJlLi4yZTI3YTNjIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oCkBAIC02MCw3ICs2MCw3IEBACiAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3Blcm1fbGFiZWwoZHJtX3Blcm1fdCBwZXJtKTsKIAotICAgIHN0YXRpYyBib29sIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGRybV9wZXJtX3QgcGVybSk7CisgICAgc3RhdGljIGJvb2wgc2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgY29uc3QgY2hhciogc3NpZCwgZHJtX3Blcm1fdCBwZXJtKTsKIAogICAgIHN0YXRpYyBib29sIGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoZHJtX3Blcm1fdCBwZXJtKTsKIApAQCAtOTUsMTAgKzk1LDExIEBACiAKICAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLAogICAgICAgICAgICAgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTExNSwyNiArMTE2LDI3IEBACiAKICAgICBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciAqbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKaW5kZXggYzA0N2ViMS4uYjBhNDQxYiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgYWN0aW9uLCByZXNlcnZlKTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE5NCw3ICsxOTQsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0yNjcsNyArMjY3LDcgQEAKIHNwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJDbGllbnRJbXBsOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoTlVMTCAhPSB1cmkpIHsKICAgICAgICAgaGFuZGxlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+b3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmksIG1pbWUpOwogICAgIH0KQEAgLTI4NCw3ICsyODQsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjk1LDcgKzI5NSw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGhlYWRlckluZm8pKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGVuY0J1ZmZlcikKICAgICAgICAgJiYgKE5VTEwgIT0gZGVjQnVmZmVyKSAmJiAoTlVMTCAhPSAqZGVjQnVmZmVyKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5kZWNyeXB0KAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgICAgIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC0zMTksNyArMzE5LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMzI5LDcgKzMyOSw3IEBACiAgICAgc3NpemVfdCByZXRDb2RlID0gSU5WQUxJRF9WQUxVRTsKICAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYgKE5VTEwgIT0gYnVmZmVyKSAmJiAoMCA8IG51bUJ5dGVzKSkgewogICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+cHJlYWQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiAgICAgfQogICAgIHJldHVybiByZXRDb2RlOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCmluZGV4IGE1NzFiM2EuLmI2MmRkYjkgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKQEAgLTE5OCw3ICsxOTgsNyBAQAogICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICovCiBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2VydmUpOwogCkBAIC0yMTUsMTIgKzIxNSwxMiBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIHN0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKTsKICNlbHNlCiBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uKTsKICNlbmRpZgpAQCAtMzMwLDExICszMzAsMTEgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CiAjZWxzZQogc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKICNlbmRpZgogCkBAIC0zNDgsNyArMzQ4LDcgQEAKICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgKi8KIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSk7CiAKIC8qKgpAQCAtMzYwLDcgKzM2MCw3IEBACiAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgKi8KIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCiAvKioKICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50LgpAQCAtMzczLDcgKzM3Myw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICovCiBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKQEAgLTM5NCw3ICszOTQsNyBAQAogICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICovCiBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogZGVjQnVmZmVyKTsKQEAgLTQxNiw3ICs0MTYsNyBAQAogICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAogICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICovCi1zdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAogICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKQEAgLTQzMCw3ICs0MzAsNyBAQAogICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAqLwogc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAogLyoqCkBAIC00NDUsNyArNDQ1LDcgQEAKICAqIEByZXR2YWwgLTEgRmFpbHVyZS4KICAqLwogc3NpemVfdCBvblJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgdm9pZCogcEJ1ZmZlciwKICAgICAgICAgICAgICAgIGludCBudW1CeXRlcyk7CiAKQEAgLTQ2MywxMiArNDYzLDEyIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogb2ZmNjRfdCBvbkxzZWVrKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgIGludCB3aGVuY2UpOwogI2Vsc2UKIG9mZl90IG9uTHNlZWsoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKICNlbmRpZgpAQCAtNDg2LDEzICs0ODYsMTMgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOwogI2Vsc2UKIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKaW5kZXggNzNlZWE4OS4uNzY5ZGUwYyAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCkBAIC0yOTQsNyArMjk0LDcgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25Db25zdW1lUmlnaHRzKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhY3Rpb24gKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKiByZXNlcnZlICovKSB7CiAgICAgLy8gTm8gcmlnaHRzIGNvbnN1bXB0aW9uCkBAIC0zNzIsMTEgKzM3MiwxMyBAQAogfQogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKLXN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludDY0X3QgLyogcG9zaXRpb24gKi8pIHsKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLAorICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLAorICAgICAgICBpbnQ2NF90IC8qIHBvc2l0aW9uICovKSB7CiAjZWxzZQotc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywgaW50IC8qIHBvc2l0aW9uICovKSB7CitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywgaW50IC8qIHBvc2l0aW9uICovKSB7CiAjZW5kaWYKICAgICAvLyBOb3QgdXNlZAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzIik7CkBAIC00NzAsMTMgKzQ3MiwxMyBAQAogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCAvKiBsZW5ndGggKi8pIHsKICNlbHNlCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGxlbmd0aCAqLykgewpAQCAtNDg3LDcgKzQ4OSw3IEBACiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIik7CiAKICAgICBpZiAoKC0xIDwgZmQpICYmCi0gICAgICAgIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmCisgICAgICAgIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmCiAgICAgICAgICghZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkpIHsKICAgICAgICAgZmlsZURlc2MgPSBkdXAoZmQpOwogICAgIH0gZWxzZSB7CkBAIC01MzMsMTIgKzUzNSwxMiBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBjb25zdCBjaGFyIGZpbGVUYWcgW10gPSAiZmlsZTovLyI7CiAKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIE5VTEwgIT0gdXJpICYmIHN0cmxlbih1cmkpID4gc2l6ZW9mKGZpbGVUYWcpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBOVUxMICE9IHVyaSAmJiBzdHJsZW4odXJpKSA+IHNpemVvZihmaWxlVGFnKSkgewogICAgICAgICBTdHJpbmc4IHVyaVRhZyA9IFN0cmluZzgodXJpKTsKICAgICAgICAgdXJpVGFnLnRvTG93ZXIoKTsKIApAQCAtNTYyLDExICs1NjQsMTEgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uIik7CiAKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKICAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgaWYgKE5VTEwgIT0gc2Vzc2lvbiAmJiBzZXNzaW9uLT5maWxlRGVzYyA+IC0xKSB7CiAgICAgICAgICAgICBGd2RMb2NrRmlsZV9kZXRhY2goc2Vzc2lvbi0+ZmlsZURlc2MpOwpAQCAtNTc2LDcgKzU3OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgewogICAgICAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvOwogICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwpAQCAtNTg0LDkgKzU4Niw3IEBACiAKICAgICAgICAgZGVjcnlwdEhhbmRsZS0+Y29weUNvbnRyb2xWZWN0b3IuY2xlYXIoKTsKICAgICAgICAgZGVjcnlwdEhhbmRsZS0+ZXh0ZW5kZWREYXRhLmNsZWFyKCk7Ci0KLSAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGU7Ci0gICAgICAgIGRlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgICAgICBkZWNyeXB0SGFuZGxlLmNsZWFyKCk7CiAgICAgfQogCiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbiBFeGl0Iik7CkBAIC01OTQsNyArNTk0LDcgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGRlY3J5cHRVbml0SWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIC8qIGhlYWRlckluZm8gKi8pIHsKICAgICBBTE9HRSgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBEUk0gc2NoZW1lIik7CkBAIC02MDMsNyArNjAzLDcgQEAKIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0KAogICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgaW50IC8qIGRlY3J5cHRVbml0SWQgKi8sCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIC8qIGVuY0J1ZmZlciAqLywKICAgICAgICAgICAgIERybUJ1ZmZlcioqIC8qIGRlY0J1ZmZlciAqLywKQEAgLTYxMyw3ICs2MTMsNyBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQoaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGRlY3J5cHRVbml0SWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBlbmNCdWZmZXIgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogLyogZGVjQnVmZmVyICovKSB7CkBAIC02MjIsMTkgKzYyMiwxOSBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGRlY3J5cHRVbml0SWQgKi8pIHsKICAgICBBTE9HRSgiRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgRFJNIHNjaGVtZSIpOwogICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKIH0KIAogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblJlYWQoaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJ5dGVzKSB7CiAgICAgc3NpemVfdCBzaXplID0gLTE7CiAKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJgogICAgICAgICBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICYmCiAgICAgICAgIE5VTEwgIT0gYnVmZmVyICYmCiAgICAgICAgIG51bUJ5dGVzID4gLTEpIHsKQEAgLTY1NCwxNSArNjU0LDE1IEBACiB9CiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQotb2ZmNjRfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK29mZjY0X3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7CiAjZWxzZQotb2ZmX3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitvZmZfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCAvKiB1bmlxdWVJZCAqLywgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkgewogI2VuZGlmCiAgICAgb2ZmX3Qgb2ZmdmFsID0gLTE7CiAKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKICAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgaWYgKE5VTEwgIT0gc2Vzc2lvbiAmJiBzZXNzaW9uLT5maWxlRGVzYyA+IC0xKSB7CiAgICAgICAgICAgICBvZmZ2YWwgPSBGd2RMb2NrRmlsZV9sc2VlayhzZXNzaW9uLT5maWxlRGVzYywgb2Zmc2V0LCB3aGVuY2UpOwpAQCAtNjc1LDEzICs2NzUsMTMgQEAKIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKICNlbHNlCiBzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KSB7CkBAIC02OTAsNyArNjkwLDcgQEAKIAogICAgIERlY29kZVNlc3Npb24qIGRlY29kZXJTZXNzaW9uID0gTlVMTDsKIAotICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgorICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJgogICAgICAgICAoTlVMTCAhPSAoZGVjb2RlclNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpKSAmJgogICAgICAgICAoTlVMTCAhPSBidWZmZXIpICYmCiAgICAgICAgIChudW1CeXRlcyA+IC0xKSAmJgpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmgKaW5kZXggN2I2NmRjNy4uNGFiNTI3MiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCkBAIC01MywxMCArNTMsMTEgQEAKIAogICAgIGludCBvbkNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CiAKLSAgICBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgYm9vbCBvblZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtNzQsMjYgKzc1LDI1IEBACiAgICAgRHJtU3VwcG9ydEluZm8qIG9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKIAogICAgIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgb2ZmNjRfdCBsZW5ndGgpOwogCiAgICAgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGNvbnN0IGNoYXIqIHVyaSk7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBjb25zdCBjaGFyKiB1cmkpOwogCi0gICAgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwotCi1wcml2YXRlOgotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbkltcGwoKTsKIH07CiAKIH07CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwCmluZGV4IGQ3ZjJkMjguLjBmYTM0NzggMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwCkBAIC0xODMsMTMgKzE4MywxMyBAQAogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLyphY3Rpb24qLywgYm9vbCAvKnJlc2VydmUqLykgeworICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLyphY3Rpb24qLywgYm9vbCAvKnJlc2VydmUqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Db25zdW1lUmlnaHRzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qcGxheWJhY2tTdGF0dXMqLywgaW50NjRfdCAvKnBvc2l0aW9uKi8pIHsKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qcGxheWJhY2tTdGF0dXMqLywgaW50NjRfdCAvKnBvc2l0aW9uKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0UGxheWJhY2tTdGF0dXMoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CkBAIC0yMzYsNyArMjM2LDggQEAKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgLypmZCovLCBvZmY2NF90IC8qb2Zmc2V0Ki8sIG9mZjY0X3QgLypsZW5ndGgqLykgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IC8qZmQqLywgb2ZmNjRfdCAvKm9mZnNldCovLAorICAgICAgICAgICAgb2ZmNjRfdCAvKmxlbmd0aCovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CiAKICNpZmRlZiBFTkFCTEVfUEFTU1RIUlVfREVDUllQVElPTgpAQCAtMjQ2LDM2ICsyNDcsMzggQEAKICAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICNlbHNlCi0gICAgKHZvaWQpKGRlY3J5cHRIYW5kbGUpOyAvLyB1bnVzZWQKKyAgICAodm9pZCkoZGVjcnlwdEhhbmRsZS5nZXQoKSk7IC8vIHVudXNlZAogI2VuZGlmCiAKICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCAvKnVuaXF1ZUlkKi8sIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBjb25zdCBjaGFyKiAvKnVyaSovKSB7CisgICAgICAgICAgICBpbnQgLyp1bmlxdWVJZCovLCBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGNvbnN0IGNoYXIqIC8qdXJpKi8pIHsKICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiB9CiAKLXN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7Ci0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKICAgICAgICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbzsgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlOyBkZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICAgICAgZGVjcnlwdEhhbmRsZS5jbGVhcigpOwogICAgIH0KICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywKLSAgICAgICAgICAgIGludCAvKmRlY3J5cHRVbml0SWQqLywgY29uc3QgRHJtQnVmZmVyKiAvKmhlYWRlckluZm8qLykgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLAorICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogLypoZWFkZXJJbmZvKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sCi0gICAgICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogLypJViovKSB7CitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLAorICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsCisgICAgICAgIERybUJ1ZmZlciogLypJViovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkRlY3J5cHQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIC8qKgogICAgICAqIEFzIGEgd29ya2Fyb3VuZCBpbXBsZW1lbnRhdGlvbiBwYXNzdGhydSB3b3VsZCBjb3B5IHRoZSBnaXZlbgpAQCAtMjk2LDEyICsyOTksMTIgQEAKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKmRlY3J5cHRVbml0SWQqLykgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKmRlY3J5cHRVbml0SWQqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25GaW5hbGl6ZURlY3J5cHRVbml0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCi1zc2l6ZV90IERybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sCitzc2l6ZV90IERybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLAogICAgICAgICAgICAgdm9pZCogLypidWZmZXIqLywgc3NpemVfdCAvKm51bUJ5dGVzKi8sIG9mZjY0X3QgLypvZmZzZXQqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCmluZGV4IDkxZDFmN2UuLjAxZWZiMjIgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCkBAIC0yNywxMSArMjcsMTEgQEAKICAgICAgICAgImxpYm1lZGlhZHJtbWV0cmljc19saXRlIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLApAQCAtNTksMTMgKzU5LDExIEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAotICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcAppbmRleCAzMDM1YzVhLi40ZGRhNWQ3IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcApAQCAtMzAsMTYgKzMwLDE2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9DcnlwdG9IYWwuaD4KIAordXNpbmcgZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Cit1c2luZyBkcm06OlYxXzA6Ok1vZGU7Cit1c2luZyBkcm06OlYxXzA6OlBhdHRlcm47Cit1c2luZyBkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpTdWJTYW1wbGU7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6QnVmZmVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpNb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpQYXR0ZXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3ViU2FtcGxlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7CkBAIC01MCw2ICs1MCw3IEBACiB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTWFuYWdlcjsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNzYsNiArNzcsMTggQEAKICAgICB9CiB9CiAKK3N0YXRpYyBzdGF0dXNfdCB0b1N0YXR1c1RfMV8yKFN0YXR1c19WMV8yIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU7OworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpKTsKKyAgICB9Cit9CiAKIHN0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZ2ZWN0b3IpIHsKICAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CkBAIC0xOTYsNiArMjA5LDkgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CiAgICAgICAgICAgICBtUGx1Z2luID0gbWFrZUNyeXB0b1BsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxNiw2ICsyMzIsNyBAQAogICAgIH0KIAogICAgIG1QbHVnaW4uY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMzg5LDIxICs0MDYsMzMgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgIHVpbnQzMl90IGJ5dGVzV3JpdHRlbiA9IDA7CiAKLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmRlY3J5cHQoc2VjdXJlLCB0b0hpZGxBcnJheTE2KGtleUlkKSwgdG9IaWRsQXJyYXkxNihpdiksIGhNb2RlLAotICAgICAgICAgICAgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOwotICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKIAotICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgZXJyID0gREVBRF9PQkpFQ1Q7CisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5kZWNyeXB0XzFfMihzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwKKyAgICAgICAgICAgICAgICBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUXzFfMihzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPmRlY3J5cHQoc2VjdXJlLCB0b0hpZGxBcnJheTE2KGtleUlkKSwgdG9IaWRsQXJyYXkxNihpdiksCisgICAgICAgICAgICAgICAgaE1vZGUsIGhQYXR0ZXJuLCBoU3ViU2FtcGxlcywgaFNvdXJjZSwgb2Zmc2V0LCBoRGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKICAgICB9CiAKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKICAgICB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCmluZGV4IGNmMDg2MTAuLjU4ODhhZjAgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCkBAIC0yMyw4ICsyMyw4IEBACiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMi9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9FdmVudE1ldHJpYy5oPgpAQCAtNDEsMTQgKzQxLDE2IEBACiAKIHVzaW5nIGRybTo6VjFfMDo6S2V5ZWRWZWN0b3I7CiB1c2luZyBkcm06OlYxXzA6OktleVN0YXR1c1R5cGU7Cit1c2luZyBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKLXVzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOzsKIHVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7CiB1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3BJZDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIGRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTZXRJZDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC01OSw2ICs2MSwxMCBAQAogdXNpbmcgOjphbmRyb2lkOjpvczo6UGVyc2lzdGFibGVCdW5kbGU7CiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogCit0eXBlZGVmIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGUgS2V5UmVxdWVzdFR5cGVfVjFfMTsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6SGRjcExldmVsIEhkY3BMZXZlbF9WMV8yOworCiBuYW1lc3BhY2UgewogCiAvLyBUaGlzIGNvbnN0YW50IGNvcnJlc3BvbmRzIHRvIHRoZSBQUk9QRVJUWV9ERVZJQ0VfVU5JUVVFX0lEIGNvbnN0YW50CkBAIC0xMzksMjYgKzE0NSw1NSBAQAogICAgIH0KIH0KIAotc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbCBsZXZlbCkgeworc3RhdGljIFNlY3VyaXR5TGV2ZWwgdG9IaWRsU2VjdXJpdHlMZXZlbChEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKICAgICBzd2l0Y2gobGV2ZWwpIHsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9OT05FOgorICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9ERUNPREU7CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG86CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOworICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERTsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9BTEw7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgfQorfQorCitzdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZSgKKyAgICAgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGUpIHsKKyAgICBzd2l0Y2gobGljZW5zZVN0YXRlKSB7CisgICAgY2FzZSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVXNhYmxlOworICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlUmVsZWFzZWQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbF9WMV8yIGxldmVsKSB7CisgICAgc3dpdGNoKGxldmVsKSB7CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT05FOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vbmU7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjE6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMToKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMTsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMjoKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyXzE6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMl8xOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzE7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMjoKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyXzI6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMjsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9OT19PVVRQVVQ6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMl8zOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzM7CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT19PVVRQVVQ6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTm9PdXRwdXQ7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CiAgICAgfQogfQotCi0KIHN0YXRpYyA6OktleWVkVmVjdG9yIHRvSGlkbEtleWVkVmVjdG9yKGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JgogICAgICAgICBrZXllZFZlY3RvcikgewogICAgIHN0ZDo6dmVjdG9yPEtleVZhbHVlPiBzdGRLZXllZFZlY3RvcjsKQEAgLTE5OSw2ICsyMzQsMTUgQEAKICAgICByZXR1cm4gc2VjdXJlU3RvcElkczsKIH0KIAorc3RhdGljIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiB0b0tleVNldElkcyhjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mCisgICAgICAgIGhLZXlTZXRJZHMpIHsKKyAgICBMaXN0PFZlY3Rvcjx1aW50OF90Pj4ga2V5U2V0SWRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaEtleVNldElkcy5zaXplKCk7IGkrKykgeworICAgICAgICBrZXlTZXRJZHMucHVzaF9iYWNrKHRvVmVjdG9yKGhLZXlTZXRJZHNbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIGtleVNldElkczsKK30KKwogc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVChTdGF0dXMgc3RhdHVzKSB7CiAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICBjYXNlIFN0YXR1czo6T0s6CkBAIC0yMTcsNyArMjYxLDcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFN0YXR1czo6RVJST1JfRFJNX0lOVkFMSURfU1RBVEU6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fVEFNUEVSX0RFVEVDVEVEOworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOVkFMSURfU1RBVEU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgU3RhdHVzOjpCQURfVkFMVUU6CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yMzgsNiArMjgyLDE5IEBACiAgICAgfQogfQogCitzdGF0aWMgc3RhdHVzX3QgdG9TdGF0dXNUXzFfMihTdGF0dXNfVjFfMiBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT047CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cykpOworICAgIH0KK30KKwogCiBNdXRleCBEcm1IYWw6Om1Mb2NrOwogCkBAIC0yOTcsMzkgKzM1NCw1MSBAQAogCiAgICAgc2V0TGlzdGVuZXIoTlVMTCk7CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7Ci0KLSAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFtUGx1Z2luVjFfMi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1QbHVnaW4gIT0gTlVMTCkgewogICAgICAgICBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKE5VTEwpLmlzT2soKSkgewogICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOwogICAgICAgICB9CiAgICAgfQogICAgIG1QbHVnaW4uY2xlYXIoKTsKICAgICBtUGx1Z2luVjFfMS5jbGVhcigpOworICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CiB9CiAKIFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IERybUhhbDo6bWFrZURybUZhY3RvcmllcygpIHsKICAgICBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBmYWN0b3JpZXM7CiAKLSAgICBhdXRvIG1hbmFnZXIgPSBoYXJkd2FyZTo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgYXV0byBtYW5hZ2VyID0gaGFyZHdhcmU6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjFfMigpOwogCiAgICAgaWYgKG1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKKyAgICAgICAgbWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzA6OklEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMCBJRHJtRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICApOwotICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKKyAgICAgICAgbWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzE6OklEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMSBJRHJtRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC01MDEsMzIgKzU3MCw4MCBAQAogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKLWJvb2wgRHJtSGFsOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CitSZXR1cm48dm9pZD4gRHJtSGFsOjpzZW5kU2Vzc2lvbkxvc3RTdGF0ZSgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgewogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIFBhcmNlbCBvYmo7CisgICAgICAgIHdyaXRlQnl0ZUFycmF5KG9iaiwgc2Vzc2lvbklkKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOworICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50U2Vzc2lvbkxvc3RTdGF0ZSwgMCwgJm9iaik7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK3N0YXR1c190IERybUhhbDo6bWF0Y2hNaW1lVHlwZUFuZFNlY3VyaXR5TGV2ZWwoY29uc3Qgc3A8SURybUZhY3Rvcnk+ICZmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCkgeworICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworCisgICAgLy8gaGFuZGxlIGRlZmF1bHQgdmFsdWUgY2FzZXMKKyAgICBpZiAobGV2ZWwgPT0gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd24pIHsKKyAgICAgICAgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKQorICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVUeXBlKQorICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFjdG9yeS0+aXNDb250ZW50VHlwZVN1cHBvcnRlZChtaW1lVHlwZS5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAobWltZVR5cGUgPT0gIiIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxkcm06OlYxXzI6OklEcm1GYWN0b3J5PiBmYWN0b3J5VjFfMiA9IGRybTo6VjFfMjo6SURybUZhY3Rvcnk6OmNhc3RGcm9tKGZhY3RvcnkpOworICAgIGlmIChmYWN0b3J5VjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9IGVsc2UgeworICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWN0b3J5VjFfMi0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRfMV8yKHV1aWQsCisgICAgICAgICAgICAgICAgbWltZVR5cGUuc3RyaW5nKCksIHRvSGlkbFNlY3VyaXR5TGV2ZWwobGV2ZWwpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KK30KKworc3RhdHVzX3QgRHJtSGFsOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgZm9yIChzc2l6ZV90IGkgPSBtRmFjdG9yaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewotICAgICAgICAgICAgaWYgKG1pbWVUeXBlICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ29udGVudFR5cGVTdXBwb3J0ZWQobWltZVR5cGUuc3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hNaW1lVHlwZUFuZFNlY3VyaXR5TGV2ZWwobUZhY3Rvcmllc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgdXVpZCwgbWltZVR5cGUsIGxldmVsLCBpc1N1cHBvcnRlZCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgRHJtSGFsOjpjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzc2l6ZV90IGkgPSBtRmFjdG9yaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewotICAgICAgICAgICAgbVBsdWdpbiA9IG1ha2VEcm1QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgYXBwUGFja2FnZU5hbWUpOwotICAgICAgICAgICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgICAgICAgICAgYXV0byBwbHVnaW4gPSBtYWtlRHJtUGx1Z2luKG1GYWN0b3JpZXNbaV0sIHV1aWQsIGFwcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChwbHVnaW4gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1QbHVnaW4gPSBwbHVnaW47CiAgICAgICAgICAgICAgICAgbVBsdWdpblYxXzEgPSBkcm06OlYxXzE6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8yID0gZHJtOjpWMV8yOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTUzNCwxMyArNjUxLDIyIEBACiAgICAgaWYgKG1QbHVnaW4gPT0gTlVMTCkgewogICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKKyAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgICAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFtUGx1Z2luVjFfMi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgbVBsdWdpbi5jbGVhcigpOworICAgICAgICAgICAgbVBsdWdpblYxXzEuY2xlYXIoKTsKKyAgICAgICAgICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CiAKKwogICAgIHJldHVybiBtSW5pdENoZWNrOwogfQogCkBAIC01NTQsMzAgKzY4MCwxNSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgSU5JVF9DSEVDSygpOwogCi0gICAgU2VjdXJpdHlMZXZlbCBoU2VjdXJpdHlMZXZlbDsKKyAgICBTZWN1cml0eUxldmVsIGhTZWN1cml0eUxldmVsID0gdG9IaWRsU2VjdXJpdHlMZXZlbChsZXZlbCk7CiAgICAgYm9vbCBzZXRTZWN1cml0eUxldmVsID0gdHJ1ZTsKIAotICAgIHN3aXRjaChsZXZlbCkgewotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOgotICAgICAgICBoU2VjdXJpdHlMZXZlbCA9IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlRGVjb2RlOgotICAgICAgICBoU2VjdXJpdHlMZXZlbCA9IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9ERUNPREU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlQ3J5cHRvOgotICAgICAgICBoU2VjdXJpdHlMZXZlbCA9IFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9DUllQVE87Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOgotICAgICAgICBoU2VjdXJpdHlMZXZlbCA9IFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9ERUNPREU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlQWxsOgotICAgICAgICBoU2VjdXJpdHlMZXZlbCA9IFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9BTEw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbE1heDoKKyAgICBpZiAobGV2ZWwgPT0gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbE1heCkgewogICAgICAgICBzZXRTZWN1cml0eUxldmVsID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaFNlY3VyaXR5TGV2ZWwgPT0gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgICAgICB9CiAgICAgfQogCiAgICAgc3RhdHVzX3QgIGVyciA9IFVOS05PV05fRVJST1I7CkBAIC02NTcsNiArNzY4LDM5IEBACiAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogfQogCitzdGF0aWMgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSB0b0tleVJlcXVlc3RUeXBlKAorICAgICAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSkgeworICAgIHN3aXRjaCAoa2V5UmVxdWVzdFR5cGUpIHsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpSRUxFQVNFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Vbmtub3duOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSB0b0tleVJlcXVlc3RUeXBlXzFfMSgKKyAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSkgeworICAgIHN3aXRjaCAoa2V5UmVxdWVzdFR5cGUpIHsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpOT05FOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX05vbmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVUERBVEU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVXBkYXRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gdG9LZXlSZXF1ZXN0VHlwZShzdGF0aWNfY2FzdDxLZXlSZXF1ZXN0VHlwZT4oa2V5UmVxdWVzdFR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwogc3RhdHVzX3QgRHJtSGFsOjpnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmluaXREYXRhLCBTdHJpbmc4IGNvbnN0ICZtaW1lVHlwZSwKICAgICAgICAgRHJtUGx1Z2luOjpLZXlUeXBlIGtleVR5cGUsIEtleWVkVmVjdG9yPFN0cmluZzgsCkBAIC02ODMsNzMgKzgyNyw1MSBAQAogICAgIDo6S2V5ZWRWZWN0b3IgaE9wdGlvbmFsUGFyYW1ldGVycyA9IHRvSGlkbEtleWVkVmVjdG9yKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwogCi0gICAgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPQotICAgICAgICAgICAgbVBsdWdpblYxXzEtPmdldEtleVJlcXVlc3RfMV8xKAorICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0S2V5UmVxdWVzdF8xXzIoCisgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksCisgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsIGhPcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBoS2V5UmVxdWVzdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUXzFfMihzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEtleVJlcXVlc3RfMV8xKAogICAgICAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoaW5pdERhdGEpLAogICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoaEtleVJlcXVlc3RUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpSRU5FV0FMOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6Tk9ORToKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX05vbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpVUERBVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9VcGRhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldEtleVJlcXVlc3QodG9IaWRsVmVjKHNlc3Npb25JZCksCi0gICAgICAgICAgICB0b0hpZGxWZWMoaW5pdERhdGEpLCB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKLQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhLZXlSZXF1ZXN0VHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU6OklOSVRJQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOjpSRUxFQVNFOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBoS2V5UmVxdWVzdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlXzFfMShoS2V5UmVxdWVzdFR5cGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRLZXlSZXF1ZXN0KAorICAgICAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoaW5pdERhdGEpLAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZSBoS2V5UmVxdWVzdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQogCiAgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKICAgICBrZXlSZXF1ZXN0VGltZXIuU2V0QXR0cmlidXRlKGVycik7CkBAIC04MzEsMTggKzk1MywzMyBAQAogICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CiAKLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3Zpc2lvblJlcXVlc3QoCi0gICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0UHJvdmlzaW9uUmVxdWVzdF8xXzIoCisgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGNlcnRUeXBlKSwgdG9IaWRsU3RyaW5nKGNlcnRBdXRob3JpdHkpLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7CisgICAgICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCgKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgIH0KIAogICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiAgICAgbU1ldHJpY3MubUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyLkluY3JlbWVudChlcnIpOwpAQCAtOTg4LDIyICsxMTI1LDMxIEBACiAgICAgfQogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CiAKLSAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCiAgICAgKmNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CiAgICAgKm1heCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CiAKLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRIZGNwTGV2ZWxzKAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbCYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsJiBoTWF4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpjb25uZWN0ZWQgPSB0b0hkY3BMZXZlbChoQ29ubmVjdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0SGRjcExldmVsc18xXzIoCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgY29uc3QgSGRjcExldmVsX1YxXzImIGhDb25uZWN0ZWQsIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoTWF4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwoaENvbm5lY3RlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqbWF4ID0gdG9IZGNwTGV2ZWwoaE1heCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUXzFfMihzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEhkY3BMZXZlbHMoCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbCYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsJiBoTWF4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoQ29ubmVjdGVkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqbWF4ID0gdG9IZGNwTGV2ZWwoc3RhdGljX2Nhc3Q8SGRjcExldmVsX1YxXzI+KGhNYXgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQogCiAgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiB9CkBAIC0xMDY1LDYgKzEyMTEsNzMgQEAKICAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKIH0KIAorc3RhdHVzX3QgRHJtSGFsOjpnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJmtleVNldElkcykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPEtleVNldElkPiYgaEtleVNldElkcykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZHMgPSB0b0tleVNldElkcyhoS2V5U2V0SWRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgKTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OnJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW5WMV8yLT5yZW1vdmVPZmZsaW5lTGljZW5zZSh0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKHRvSGlkbFZlYyhrZXlTZXRJZCksCisgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBoTGljZW5zZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpsaWNlbnNlU3RhdGUgPSB0b09mZmxpbmVMaWNlbnNlU3RhdGUoaExpY2Vuc2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKwogc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKG5hbWUsIHZhbHVlKTsKQEAgLTEzNDMsMjIgKzE1NTYsMjIgQEAKIAogdm9pZCBEcm1IYWw6OnJlcG9ydEZyYW1ld29ya01ldHJpY3MoKSBjb25zdAogewotICAgIE1lZGlhQW5hbHl0aWNzSXRlbSBpdGVtKCJtZWRpYWRybSIpOwotICAgIGl0ZW0uZ2VuZXJhdGVTZXNzaW9uSUQoKTsKLSAgICBpdGVtLnNldFBrZ05hbWUobU1ldHJpY3MuR2V0QXBwUGFja2FnZU5hbWUoKS5jX3N0cigpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBpdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJtZWRpYWRybSIpKTsKKyAgICBpdGVtLT5nZW5lcmF0ZVNlc3Npb25JRCgpOworICAgIGl0ZW0tPnNldFBrZ05hbWUobU1ldHJpY3MuR2V0QXBwUGFja2FnZU5hbWUoKS5jX3N0cigpKTsKICAgICBTdHJpbmc4IHZlbmRvcjsKICAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcik7CiAgICAgaWYgKHJlc3VsdCAhPSBPSykgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB2ZW5kb3IgZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaXRlbS5zZXRDU3RyaW5nKCJ2ZW5kb3IiLCB2ZW5kb3IuY19zdHIoKSk7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoInZlbmRvciIsIHZlbmRvci5jX3N0cigpKTsKICAgICB9CiAgICAgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbik7CiAgICAgaWYgKHJlc3VsdCAhPSBPSykgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkZXNjcmlwdGlvbiBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKICAgICB9IGVsc2UgewotICAgICAgICBpdGVtLnNldENTdHJpbmcoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24uY19zdHIoKSk7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24uY19zdHIoKSk7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZE1ldHJpY3M7CkBAIC0xMzY5LDkgKzE1ODIsOSBAQAogICAgIHN0ZDo6c3RyaW5nIGI2NEVuY29kZWRNZXRyaWNzID0gdG9CYXNlNjRTdHJpbmdOb1BhZChzZXJpYWxpemVkTWV0cmljcy5kYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSk7CiAgICAgaWYgKCFiNjRFbmNvZGVkTWV0cmljcy5lbXB0eSgpKSB7Ci0gICAgICAgIGl0ZW0uc2V0Q1N0cmluZygic2VyaWFsaXplZF9tZXRyaWNzIiwgYjY0RW5jb2RlZE1ldHJpY3MuY19zdHIoKSk7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoInNlcmlhbGl6ZWRfbWV0cmljcyIsIGI2NEVuY29kZWRNZXRyaWNzLmNfc3RyKCkpOwogICAgIH0KLSAgICBpZiAoIWl0ZW0uc2VsZnJlY29yZCgpKSB7CisgICAgaWYgKCFpdGVtLT5zZWxmcmVjb3JkKCkpIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZWxmIHJlY29yZCBmcmFtZXdvcmsgbWV0cmljcyIpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcCBiL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcAppbmRleCA1MDk5NjFmLi41MTI3NGQxIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCkBAIC02MSw3ICs2MSwxMCBAQAogICAgIEdFVF9OVU1CRVJfT0ZfU0VTU0lPTlMsCiAgICAgR0VUX1NFQ1VSSVRZX0xFVkVMLAogICAgIFJFTU9WRV9TRUNVUkVfU1RPUCwKLSAgICBHRVRfU0VDVVJFX1NUT1BfSURTCisgICAgR0VUX1NFQ1VSRV9TVE9QX0lEUywKKyAgICBHRVRfT0ZGTElORV9MSUNFTlNFX0tFWVNFVF9JRFMsCisgICAgUkVNT1ZFX09GRkxJTkVfTElDRU5TRSwKKyAgICBHRVRfT0ZGTElORV9MSUNFTlNFX1NUQVRFCiB9OwogCiBzdHJ1Y3QgQnBEcm0gOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURybT4gewpAQCAtODAsMTggKzgzLDIyIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLCBib29sICppc1N1cHBvcnRlZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlKHV1aWQsIDE2KTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgobWltZVR5cGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobGV2ZWwpOworCiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJU19DUllQVE9fU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQ6IGJpbmRlciBjYWxsIGZhaWxlZDogJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQorICAgICAgICAqaXNTdXBwb3J0ZWQgPSBzdGF0aWNfY2FzdDxib29sPihyZXBseS5yZWFkSW50MzIoKSk7CiAKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpICE9IDA7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLApAQCAtMTIwLDExICsxMjcsMTEgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCiAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2VjdXJpdHlMZXZlbCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihsZXZlbCk7CiAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewpAQCAtMzc2LDYgKzM4Myw1MiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09GRkxJTkVfTElDRU5TRV9LRVlTRVRfSURTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAga2V5U2V0SWRzLmNsZWFyKCk7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwga2V5U2V0SWQpOworICAgICAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayhrZXlTZXRJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0IHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT0ZGTElORV9MSUNFTlNFX1NUQVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpsaWNlbnNlU3RhdGUgPSBzdGF0aWNfY2FzdDxEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGU+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0IHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTcxOSw3ICs3NzIsMTIgQEAKICAgICAgICAgICAgIHVpbnQ4X3QgdXVpZFsxNl07CiAgICAgICAgICAgICBkYXRhLnJlYWQodXVpZCwgc2l6ZW9mKHV1aWQpKTsKICAgICAgICAgICAgIFN0cmluZzggbWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSkpOworICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpTZWN1cml0eUxldmVsPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGJvb2wgaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVUeXBlLCBsZXZlbCwgJmlzU3VwcG9ydGVkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzU3VwcG9ydGVkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIApAQCAtOTgwLDYgKzEwMzgsNDUgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgR0VUX09GRkxJTkVfTElDRU5TRV9LRVlTRVRfSURTOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgTGlzdDxWZWN0b3I8dWludDhfdD4gPiBrZXlTZXRJZHM7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhrZXlTZXRJZHMpOworICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0ga2V5U2V0SWRzLnNpemUoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvdW50KTsKKyAgICAgICAgICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID46Oml0ZXJhdG9yIGl0ZXIgPSBrZXlTZXRJZHMuYmVnaW4oKTsKKyAgICAgICAgICAgIHdoaWxlKGl0ZXIgIT0ga2V5U2V0SWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBpdGVyLT5zaXplKCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKGl0ZXItPmFycmF5KCksIGl0ZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgaXRlcisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVNT1ZFX09GRkxJTkVfTElDRU5TRToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZDsKKyAgICAgICAgICAgIHJlYWRWZWN0b3IoZGF0YSwga2V5U2V0SWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVtb3ZlT2ZmbGluZUxpY2Vuc2Uoa2V5U2V0SWQpKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZDsKKyAgICAgICAgICAgIHJlYWRWZWN0b3IoZGF0YSwga2V5U2V0SWQpOworICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHN0YXRlOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShrZXlTZXRJZCwgJnN0YXRlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZT4oc3RhdGUpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEdFVF9QUk9QRVJUWV9TVFJJTkc6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKaW5kZXggNWNiNDhiZi4uOGNkNmY5NiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcApAQCAtMzQsMTcgKzM0LDE3IEBACiBzdGF0dXNfdCByZXBvcnRWZW5kb3JNZXRyaWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRyaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSkgewotICAgIE1lZGlhQW5hbHl0aWNzSXRlbSBhbmFseXRpY3NJdGVtKG5hbWUuY19zdHIoKSk7Ci0gICAgYW5hbHl0aWNzSXRlbS5nZW5lcmF0ZVNlc3Npb25JRCgpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUFuYWx5dGljc0l0ZW0+IGFuYWx5dGljc0l0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUobmFtZS5jX3N0cigpKSk7CisgICAgYW5hbHl0aWNzSXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKIAogICAgIHN0ZDo6c3RyaW5nIGFwcF9wYWNrYWdlX25hbWUoYXBwUGFja2FnZU5hbWUuY19zdHIoKSwgYXBwUGFja2FnZU5hbWUuc2l6ZSgpKTsKLSAgICBhbmFseXRpY3NJdGVtLnNldFBrZ05hbWUoYXBwX3BhY2thZ2VfbmFtZSk7CisgICAgYW5hbHl0aWNzSXRlbS0+c2V0UGtnTmFtZShhcHBfcGFja2FnZV9uYW1lKTsKICAgICBpZiAobWV0cmljcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIGFuYWx5dGljc0l0ZW0uc2V0Q1N0cmluZyhrU2VyaWFsaXplZE1ldHJpY3NGaWVsZCwgbWV0cmljcy5jX3N0cigpKTsKKyAgICAgICAgYW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrU2VyaWFsaXplZE1ldHJpY3NGaWVsZCwgbWV0cmljcy5jX3N0cigpKTsKICAgICB9CiAKLSAgICBpZiAoIWFuYWx5dGljc0l0ZW0uc2VsZnJlY29yZCgpKSB7Ci0gICAgICBBTE9HRSgic2VsZnJlY29yZCgpIHJldHVybmVkIGZhbHNlLiBzZXNzaW9JZCAlIiBQUklkNjQsIGFuYWx5dGljc0l0ZW0uZ2V0U2Vzc2lvbklEKCkpOworICAgIGlmICghYW5hbHl0aWNzSXRlbS0+c2VsZnJlY29yZCgpKSB7CisgICAgICBBTE9HRSgic2VsZnJlY29yZCgpIHJldHVybmVkIGZhbHNlLiBzZXNzaW9JZCAlIiBQUklkNjQsIGFuYWx5dGljc0l0ZW0tPmdldFNlc3Npb25JRCgpKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDc2Mjg5NjguLjllMDExNWUgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJtZWRpYWRybS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xNyw2ICsxNyw3IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yIiwKICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCmluZGV4IDE1NThlOGIuLmJmMzUyMjQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKQEAgLTY1LDcgKzY1LDIwIEBACiAgICAgKnBsdWdpbiA9IG5ldyBDbGVhcktleUNhc1BsdWdpbihhcHBEYXRhLCBjYWxsYmFjayk7CiAgICAgcmV0dXJuIE9LOwogfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0dXNfdCBDbGVhcktleUNhc0ZhY3Rvcnk6OmNyZWF0ZVBsdWdpbigKKyAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCisgICAgICAgIHZvaWQgKmFwcERhdGEsCisgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IGNhbGxiYWNrLAorICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIHsKKyAgICBpZiAoIWlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpwbHVnaW4gPSBuZXcgQ2xlYXJLZXlDYXNQbHVnaW4oYXBwRGF0YSwgY2FsbGJhY2spOworICAgIHJldHVybiBPSzsKK30KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiBib29sIENsZWFyS2V5RGVzY3JhbWJsZXJGYWN0b3J5Ojppc1N5c3RlbUlkU3VwcG9ydGVkKAogICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCkgY29uc3QgewogICAgIHJldHVybiBDQV9zeXN0ZW1faWQgPT0gc0NsZWFyS2V5U3lzdGVtSWQ7CkBAIC04NCw3ICs5NywxMyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogQ2xlYXJLZXlDYXNQbHVnaW46OkNsZWFyS2V5Q2FzUGx1Z2luKAogICAgICAgICB2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjaykKLSAgICA6IG1DYWxsYmFjayhjYWxsYmFjayksIG1BcHBEYXRhKGFwcERhdGEpIHsKKyAgICA6IG1DYWxsYmFjayhjYWxsYmFjayksIG1DYWxsYmFja0V4dChOVUxMKSwgbUFwcERhdGEoYXBwRGF0YSkgeworICAgIEFMT0dWKCJDVE9SIik7Cit9CisKK0NsZWFyS2V5Q2FzUGx1Z2luOjpDbGVhcktleUNhc1BsdWdpbigKKyAgICAgICAgdm9pZCAqYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2spCisgICAgOiBtQ2FsbGJhY2soTlVMTCksIG1DYWxsYmFja0V4dChjYWxsYmFjayksIG1BcHBEYXRhKGFwcERhdGEpIHsKICAgICBBTE9HVigiQ1RPUiIpOwogfQogCkBAIC0xNjcsMTEgKzE4NiwzMCBAQAogICAgIC8vIEVjaG8gdGhlIHJlY2VpdmVkIGV2ZW50IHRvIHRoZSBjYWxsYmFjay4KICAgICAvLyBDbGVhciBrZXkgcGx1Z2luIGRvZXNuJ3QgdXNlIGFueSBldmVudCwgZWNobydpbmcgZm9yIHRlc3Rpbmcgb25seS4KICAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgbUNhbGxiYWNrKCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksIGV2ZW50RGF0YS5zaXplKCkpOworICAgICAgICBtQ2FsbGJhY2soKHZvaWQqKW1BcHBEYXRhLCBldmVudCwgYXJnLCAodWludDhfdCopZXZlbnREYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLnNpemUoKSk7CisgICAgfSBlbHNlIGlmIChtQ2FsbGJhY2tFeHQgIT0gTlVMTCkgeworICAgICAgICBtQ2FsbGJhY2tFeHQoKHZvaWQqKW1BcHBEYXRhLCBldmVudCwgYXJnLCAodWludDhfdCopZXZlbnREYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLnNpemUoKSwgTlVMTCk7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2xlYXJLZXlDYXNQbHVnaW46OnNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLCBpbnQzMl90IGV2ZW50LAorICAgICAgICBpbnQgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIHsKKyAgICBBTE9HVigic2VuZFNlc3Npb25FdmVudDogc2Vzc2lvbklkPSVzLCBldmVudD0lZCwgYXJnPSVkIiwKKyAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpLCBldmVudCwgYXJnKTsKKyAgICAvLyBFY2hvIHRoZSByZWNlaXZlZCBldmVudCB0byB0aGUgY2FsbGJhY2suCisgICAgLy8gQ2xlYXIga2V5IHBsdWdpbiBkb2Vzbid0IHVzZSBhbnkgZXZlbnQsIGVjaG8naW5nIGZvciB0ZXN0aW5nIG9ubHkuCisgICAgaWYgKG1DYWxsYmFja0V4dCAhPSBOVUxMKSB7CisgICAgICAgIG1DYWxsYmFja0V4dCgodm9pZCopbUFwcERhdGEsIGV2ZW50LCBhcmcsICh1aW50OF90KilldmVudERhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuc2l6ZSgpLCAmc2Vzc2lvbklkKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENsZWFyS2V5Q2FzUGx1Z2luOjpwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSB7CiAgICAgQUxPR1YoInByb3Zpc2lvbjogcHJvdmlzaW9uU3RyaW5nPSVzIiwgc3RyLnN0cmluZygpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtS2V5RmV0Y2hlckxvY2spOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uaCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmgKaW5kZXggMzg5ZTE3Mi4uZjQ4ZDViMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uaAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oCkBAIC00Nyw2ICs0NywxMSBAQAogICAgICAgICAgICAgdm9pZCAqYXBwRGF0YSwKICAgICAgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICAgICAgdm9pZCAqYXBwRGF0YSwKKyAgICAgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IGNhbGxiYWNrLAorICAgICAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIENsZWFyS2V5RGVzY3JhbWJsZXJGYWN0b3J5IDogcHVibGljIERlc2NyYW1ibGVyRmFjdG9yeSB7CkBAIC02Myw2ICs2OCw3IEBACiBjbGFzcyBDbGVhcktleUNhc1BsdWdpbiA6IHB1YmxpYyBDYXNQbHVnaW4gewogcHVibGljOgogICAgIENsZWFyS2V5Q2FzUGx1Z2luKHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBDbGVhcktleUNhc1BsdWdpbih2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjayk7CiAgICAgdmlydHVhbCB+Q2xlYXJLZXlDYXNQbHVnaW4oKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJpdmF0ZURhdGEoCkBAIC04NSw2ICs5MSwxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VuZEV2ZW50KAogICAgICAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IENhc0RhdGEgJmV2ZW50RGF0YSkgb3ZlcnJpZGU7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVmcmVzaEVudGl0bGVtZW50cygKQEAgLTk0LDYgKzEwNCw3IEBACiAgICAgTXV0ZXggbUtleUZldGNoZXJMb2NrOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxLZXlGZXRjaGVyPiBtS2V5RmV0Y2hlcjsKICAgICBDYXNQbHVnaW5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgbUNhbGxiYWNrRXh0OwogICAgIHZvaWQqIG1BcHBEYXRhOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKaW5kZXggODQwNGE4My4uMjk2NDc5MSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCkBAIC02MCw2ICs2MCwxOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTW9ja0Nhc0ZhY3Rvcnk6OmNyZWF0ZVBsdWdpbigKKyAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCisgICAgICAgIHZvaWQqIC8qYXBwRGF0YSovLAorICAgICAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCAvKmNhbGxiYWNrKi8sCisgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgeworICAgIGlmICghaXNTeXN0ZW1JZFN1cHBvcnRlZChDQV9zeXN0ZW1faWQpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKnBsdWdpbiA9IG5ldyBNb2NrQ2FzUGx1Z2luKCk7CisgICAgcmV0dXJuIE9LOworfQorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIGJvb2wgTW9ja0Rlc2NyYW1ibGVyRmFjdG9yeTo6aXNTeXN0ZW1JZFN1cHBvcnRlZChpbnQzMl90IENBX3N5c3RlbV9pZCkgY29uc3QgewpAQCAtMTcwLDYgKzE4MywxNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTW9ja0Nhc1BsdWdpbjo6c2VuZFNlc3Npb25FdmVudCgKKyAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGludDMyX3QgZXZlbnQsCisgICAgICAgIGludCAvKmFyZyovLCBjb25zdCBDYXNEYXRhJiAvKmV2ZW50RGF0YSovKSB7CisgICAgQUxPR1YoInNlbmRTZXNzaW9uRXZlbnQ6IHNlc3Npb25JZD0lcywgZXZlbnQ9JWQiLAorICAgICAgICAgIGFycmF5VG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSwgZXZlbnQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgTW9ja0Nhc1BsdWdpbjo6cHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgewogICAgIEFMT0dWKCJwcm92aXNpb246IHByb3Zpc2lvblN0cmluZz0lcyIsIHN0ci5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaAppbmRleCA4MTA2OTkwLi43NGI1NDBjIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaApAQCAtNDIsNiArNDIsMTEgQEAKICAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCiAgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCisgICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKKyAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCisgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaywKKyAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBNb2NrRGVzY3JhbWJsZXJGYWN0b3J5IDogcHVibGljIERlc2NyYW1ibGVyRmFjdG9yeSB7CkBAIC04MCw3ICs4NSwxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VuZEV2ZW50KAogICAgICAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IENhc0RhdGEgJmV2ZW50RGF0YSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb3Zpc2lvbihjb25zdCBTdHJpbmc4ICZzdHIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VuZFNlc3Npb25FdmVudCgKKyAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IENhc0RhdGEgJmV2ZW50RGF0YSkgb3ZlcnJpZGU7CisKKyAgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVmcmVzaEVudGl0bGVtZW50cygKICAgICAgICAgICAgIGludDMyX3QgcmVmcmVzaFR5cGUsIGNvbnN0IENhc0RhdGEgJnJlZnJlc2hEYXRhKSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCmluZGV4IDkzYzY0M2IuLmQ0OGIwYTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcApAQCAtMjcsNCArMjcsMTggQEAKICAgICByZXR1cm4gbWVtY21wKCh2b2lkICopbGhzLmFycmF5KCksICh2b2lkICopcmhzLmFycmF5KCksIHJocy5zaXplKCkpIDwgMDsKIH0KIAorc3RkOjpzdHJpbmcgQnl0ZUFycmF5VG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCogaW5fYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0hleENoYXJzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKKyAgICAvLyBFYWNoIGlucHV0IGJ5dGUgY3JlYXRlcyB0d28gb3V0cHV0IGhleCBjaGFyYWN0ZXJzLgorICAgIHN0ZDo6c3RyaW5nIG91dF9idWZmZXIobGVuZ3RoICogMiwgJ1wwJyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIGNoYXIgYnl0ZSA9IGluX2J1ZmZlcltpXTsKKyAgICAgICAgb3V0X2J1ZmZlclsoaSAqIDIpXSA9IGtIZXhDaGFyc1soYnl0ZSA+PiA0KSAmIDB4Zl07CisgICAgICAgIG91dF9idWZmZXJbKGkgKiAyKSArIDFdID0ga0hleENoYXJzW2J5dGUgJiAweGZdOworICAgIH0KKyAgICByZXR1cm4gb3V0X2J1ZmZlcjsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmgKaW5kZXggMjU0MzEyNC4uYWE1NzFjMCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oCkBAIC0xNywxNCArMTcsMTYgQEAKICNpZm5kZWYgQ0xFQVJLRVlfVVRJTFNfSF8KICNkZWZpbmUgQ0xFQVJLRVlfVVRJTFNfSF8KIAorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gQWRkIGEgY29tcGFyaXNvbiBvcGVyYXRvciBmb3IgdGhpcyBWZWN0b3Igc3BlY2lhbGl6YXRpb24gc28gdGhhdCBpdCBjYW4gYmUKIC8vIHVzZWQgYXMgYSBrZXkgaW4gYSBLZXllZFZlY3Rvci4KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQogYm9vbCBvcGVyYXRvcjwoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsaHMsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmcmhzKTsKIAorc3RkOjpzdHJpbmcgQnl0ZUFycmF5VG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCogaW5fYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAKaW5kZXggMmZjZTA3OTAuLjBhYzg3OWMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAKQEAgLTI2LDcgKzI2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3ViU2FtcGxlOwpAQCAtNzksNyArNzksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCmluZGV4IDM0MWQ0ZjYuLmU5MWU5MTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKQEAgLTE0LDggKzE0LDggQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAotY2NfYmluYXJ5IHsKLSAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkiLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJjbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIiwKICAgICB2ZW5kb3I6IHRydWUsCiAKICAgICBzcmNzOiBbCkBAIC0yNSwyMyArMjUsMjQgQEAKICAgICAgICAgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAiLAogICAgICAgICAiQ3J5cHRvRmFjdG9yeS5jcHAiLAogICAgICAgICAiQ3J5cHRvUGx1Z2luLmNwcCIsCisgICAgICAgICJEZXZpY2VGaWxlcy5jcHAiLAogICAgICAgICAiRHJtRmFjdG9yeS5jcHAiLAogICAgICAgICAiRHJtUGx1Z2luLmNwcCIsCiAgICAgICAgICJJbml0RGF0YVBhcnNlci5jcHAiLAogICAgICAgICAiSnNvbldlYktleS5jcHAiLAorICAgICAgICAiTWVtb3J5RmlsZVN5c3RlbS5jcHAiLAogICAgICAgICAiU2Vzc2lvbi5jcHAiLAogICAgICAgICAiU2Vzc2lvbkxpYnJhcnkuY3BwIiwKLSAgICAgICAgInNlcnZpY2UuY3BwIiwKICAgICBdLAogCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAogCiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLSAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjIl0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3J5cHRvIiwKQEAgLTQ5LDExICs1MCwxMyBAQAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJjbGVhcmtleWNvbW1vbiIsCisgICAgICAgICJsaWJjbGVhcmtleWRldmljZWZpbGVzLXByb3RvcyIsCiAgICAgICAgICJsaWJqc21uIiwKICAgICBdLAogCkBAIC02NSw0ICs2OCwyNiBAQAogICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAogICAgIH0sCiB9CitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmNsZWFya2V5ZGV2aWNlZmlsZXMtcHJvdG9zIiwKKyAgICB2ZW5kb3I6IHRydWUsCiAKKyAgICBwcm90bzogeworICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCisgICAgc3JjczogWyJwcm90b3MvRGV2aWNlRmlsZXMucHJvdG8iXSwKK30KK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5IiwKKyAgICBkZWZhdWx0czogWyJjbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJzZXJ2aWNlLmNwcCJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMiXSwKK30KK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkiLAorICAgIG92ZXJyaWRlczogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleSJdLAorICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInNlcnZpY2VMYXp5LmNwcCJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYyJdLAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCmluZGV4IGMyZWQ3NTEuLjY1N2E0MmYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHNwPEJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nICZzKSB7CkBAIC0xNjksNyArMTY5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcAppbmRleCBlNThmNThhLi43NWY4Mzk1IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBCdWZmZXI6OkJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpCkBAIC00Nyw3ICs0Nyw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKaW5kZXggMWJhNWM2YS4uMTQxMGQ3NyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogZXh0ZXJuICJDIiB7CkBAIC0zOCw3ICszOCw3IEBACiB9IC8vIGV4dGVybiAiQyIKIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCmluZGV4IDA4NDhjZWYuLjJhNDhkYjYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcApAQCAtMjcsNyArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogUmV0dXJuPGJvb2w+IENyeXB0b0ZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKApAQCAtNjAsNyArNjAsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCmluZGV4IGYzM2Y5NGUuLjIzYTM1ZTUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6QnVmZmVyVHlwZTsKQEAgLTQyLDEwICs0Miw0MiBAQAogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKK1JldHVybjx2b2lkPiBDcnlwdG9QbHVnaW46OmRlY3J5cHQoCisgICAgYm9vbCBzZWN1cmUsCisgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIGtleUlkLAorICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiBpdiwKKyAgICBNb2RlIG1vZGUsCisgICAgY29uc3QgUGF0dGVybiYgcGF0dGVybiwKKyAgICBjb25zdCBoaWRsX3ZlYzxTdWJTYW1wbGU+JiBzdWJTYW1wbGVzLAorICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciYgc291cmNlLAorICAgIHVpbnQ2NF90IG9mZnNldCwKKyAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCisgICAgZGVjcnlwdF9jYiBfaGlkbF9jYikgeworCisgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOworICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOworICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOworCisgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gZGVjcnlwdF8xXzIoCisgICAgICBzZWN1cmUsIGtleUlkLCBpdiwgbW9kZSwgcGF0dGVybiwgc3ViU2FtcGxlcywgc291cmNlLCBvZmZzZXQsIGRlc3RpbmF0aW9uLAorICAgICAgWyZdKFN0YXR1c19WMV8yIGhTdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7CisgICAgICAgIHN0YXR1cyA9IHRvU3RhdHVzXzFfMChoU3RhdHVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKKyAgICAgICAgICBkZXRhaWxlZEVycm9yID0gaERldGFpbGVkRXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICApOworCisgIHN0YXR1cyA9IGhSZXN1bHQuaXNPaygpID8gc3RhdHVzIDogU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgX2hpZGxfY2Ioc3RhdHVzLCBieXRlc1dyaXR0ZW4sIGRldGFpbGVkRXJyb3IpOworICByZXR1cm4gVm9pZCgpOworfQorCiAvLyBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlcyBmb3IgZXJyb3IgY29kZSBhbmQgcG9zaXRpdmUgdmFsdWVzIGZvciB0aGUgc2l6ZSBvZgogLy8gZGVjcnlwdGVkIGRhdGEuICBJbiB0aGVvcnksIHRoZSBvdXRwdXQgc2l6ZSBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIGlucHV0CiAvLyBzaXplLCBidXQgaW4gcHJhY3RpY2UgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBmb3IgQUVTLUNUUi4KLVJldHVybjx2b2lkPiBDcnlwdG9QbHVnaW46OmRlY3J5cHQoCitSZXR1cm48dm9pZD4gQ3J5cHRvUGx1Z2luOjpkZWNyeXB0XzFfMigKICAgICAgICAgYm9vbCBzZWN1cmUsCiAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lEX1NJWkU+JiBrZXlJZCwKICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSVZfU0laRT4mIGl2LApAQCAtNTUsMTcgKzg3LDE3IEBACiAgICAgICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciYgc291cmNlLAogICAgICAgICB1aW50NjRfdCBvZmZzZXQsCiAgICAgICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyJiBkZXN0aW5hdGlvbiwKLSAgICAgICAgZGVjcnlwdF9jYiBfaGlkbF9jYikgeworICAgICAgICBkZWNyeXB0XzFfMl9jYiBfaGlkbF9jYikgewogICAgIFVOVVNFRChwYXR0ZXJuKTsKIAogICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgIlNlY3VyZSBkZWNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBDbGVhcktleS4iKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKICAgICBpZiAobVNoYXJlZEJ1ZmZlck1hcC5maW5kKHNvdXJjZS5idWZmZXJJZCkgPT0gbVNoYXJlZEJ1ZmZlck1hcC5lbmQoKSkgewotICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKICAgICAgICAgICAgICAgICJzb3VyY2UgZGVjcnlwdCBidWZmZXIgYmFzZSBub3Qgc2V0Iik7CiAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KQEAgLTczLDcgKzEwNSw3IEBACiAgICAgaWYgKGRlc3RpbmF0aW9uLnR5cGUgPT0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSkgewogICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBkZXN0ID0gZGVzdGluYXRpb24ubm9uc2VjdXJlTWVtb3J5OwogICAgICAgaWYgKG1TaGFyZWRCdWZmZXJNYXAuZmluZChkZXN0LmJ1ZmZlcklkKSA9PSBtU2hhcmVkQnVmZmVyTWFwLmVuZCgpKSB7Ci0gICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKICAgICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGRlY3J5cHQgYnVmZmVyIGJhc2Ugbm90IHNldCIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgfQpAQCAtODEsMTIgKzExMywxMiBAQAogCiAgICAgc3A8SU1lbW9yeT4gc291cmNlQmFzZSA9IG1TaGFyZWRCdWZmZXJNYXBbc291cmNlLmJ1ZmZlcklkXTsKICAgICBpZiAoc291cmNlQmFzZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJzb3VyY2UgaXMgYSBudWxscHRyIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgInNvdXJjZSBpcyBhIG51bGxwdHIiKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKICAgICBpZiAoc291cmNlLm9mZnNldCArIG9mZnNldCArIHNvdXJjZS5zaXplID4gc291cmNlQmFzZS0+Z2V0U2l6ZSgpKSB7Ci0gICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKQEAgLTk4LDEyICsxMzAsMTIgQEAKICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBkZXN0QnVmZmVyID0gZGVzdGluYXRpb24ubm9uc2VjdXJlTWVtb3J5OwogICAgICAgICBzcDxJTWVtb3J5PiBkZXN0QmFzZSA9IG1TaGFyZWRCdWZmZXJNYXBbZGVzdEJ1ZmZlci5idWZmZXJJZF07CiAgICAgICAgIGlmIChkZXN0QmFzZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiZGVzdGluYXRpb24gaXMgYSBudWxscHRyIik7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJkZXN0aW5hdGlvbiBpcyBhIG51bGxwdHIiKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZGVzdEJ1ZmZlci5vZmZzZXQgKyBkZXN0QnVmZmVyLnNpemUgPiBkZXN0QmFzZS0+Z2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiaW52YWxpZCBidWZmZXIgc2l6ZSIpOworICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0UsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CiAgICAgICAgIGRlc3RQdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KGJhc2UgKyBkZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnkub2Zmc2V0KTsKQEAgLTEyOCw3ICsxNjAsNyBAQAogCiAgICAgaWYgKG1vZGUgPT0gTW9kZTo6VU5FTkNSWVBURUQpIHsKICAgICAgICAgaWYgKGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzKSB7Ci0gICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkIHN1YnNhbXBsZXMgZm91bmQgaW4gYWxsZWdlZGx5IHVuZW5jcnlwdGVkIGRhdGEuIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CkBAIC0xNDQsMjIgKzE3NiwyMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2Zmc2V0KSwgIiIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6T0ssIHN0YXRpY19jYXN0PHNzaXplX3Q+KG9mZnNldCksICIiKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTW9kZTo6QUVTX0NUUikgewogICAgICAgICBzaXplX3QgYnl0ZXNEZWNyeXB0ZWQ7Ci0gICAgICAgIFN0YXR1cyByZXMgPSBtU2Vzc2lvbi0+ZGVjcnlwdChrZXlJZC5kYXRhKCksIGl2LmRhdGEoKSwgc3JjUHRyLAorICAgICAgICBTdGF0dXNfVjFfMiByZXMgPSBtU2Vzc2lvbi0+ZGVjcnlwdChrZXlJZC5kYXRhKCksIGl2LmRhdGEoKSwgc3JjUHRyLAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihkZXN0UHRyKSwgdG9WZWN0b3Ioc3ViU2FtcGxlcyksICZieXRlc0RlY3J5cHRlZCk7Ci0gICAgICAgIGlmIChyZXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4oYnl0ZXNEZWNyeXB0ZWQpLCAiIik7CisgICAgICAgIGlmIChyZXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6T0ssIHN0YXRpY19jYXN0PHNzaXplX3Q+KGJ5dGVzRGVjcnlwdGVkKSwgIiIpOwogICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0RFQ1JZUFQsIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlcyksCi0gICAgICAgICAgICAgICAgICAgICJEZWNyeXB0aW9uIEVycm9yIik7CisgICAgICAgICAgICBfaGlkbF9jYihyZXMsIDAsICJEZWNyeXB0aW9uIEVycm9yIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgICJTZWxlY3RlZCBlbmNyeXB0aW9uIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgQ2xlYXJLZXkgRFJNIFBsdWdpbi4iKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CkBAIC0xNzksNyArMjEwLDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNWI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwCkBAIC0wLDAgKzEsMjUyIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJEZXZpY2VGaWxlcy5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCisvLyBQcm90b2J1ZiBnZW5lcmF0ZWQgY2xhc3Nlcy4KK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpPZmZsaW5lRmlsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpIYXNoZWRGaWxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkxpY2Vuc2U7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZV9MaWNlbnNlU3RhdGVfQUNUSVZFOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkxpY2Vuc2VfTGljZW5zZVN0YXRlX1JFTEVBU0lORzsKKworbmFtZXNwYWNlIHsKK2NvbnN0IGNoYXIga0xpY2Vuc2VGaWxlTmFtZUV4dFtdID0gIi5saWMiOworCitib29sIEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEsIHN0ZDo6c3RyaW5nKiBoYXNoKSB7CisgICAgaWYgKCFoYXNoKSByZXR1cm4gZmFsc2U7CisKKyAgICBoYXNoLT5yZXNpemUoU0hBMjU2X0RJR0VTVF9MRU5HVEgpOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihkYXRhLmRhdGEoKSk7CisgICAgdW5zaWduZWQgY2hhciogb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oJigqaGFzaClbMF0pOworICAgIFNIQTI1NihpbnB1dCwgZGF0YS5zaXplKCksIG91dHB1dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitib29sIERldmljZUZpbGVzOjpTdG9yZUxpY2Vuc2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlIHN0YXRlLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGljZW5zZVJlc3BvbnNlKSB7CisKKyAgICBPZmZsaW5lRmlsZSBmaWxlOworICAgIGZpbGUuc2V0X3R5cGUoT2ZmbGluZUZpbGU6OkxJQ0VOU0UpOworICAgIGZpbGUuc2V0X3ZlcnNpb24oT2ZmbGluZUZpbGU6OlZFUlNJT05fMSk7CisKKyAgICBMaWNlbnNlKiBsaWNlbnNlID0gZmlsZS5tdXRhYmxlX2xpY2Vuc2UoKTsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZUFjdGl2ZToKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkUpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtMaWNlbnNlU3RhdGVSZWxlYXNpbmc6CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfc3RhdGUoTGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HKTsKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9saWNlbnNlKGxpY2Vuc2VSZXNwb25zZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJTdG9yZUxpY2Vuc2U6IFVua25vd24gbGljZW5zZSBzdGF0ZTogJXUiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEZpbGU7CisgICAgZmlsZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZEZpbGUpOworCisgICAgcmV0dXJuIFN0b3JlRmlsZVdpdGhIYXNoKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCwgc2VyaWFsaXplZEZpbGUpOworfQorCitib29sIERldmljZUZpbGVzOjpTdG9yZUZpbGVXaXRoSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkRmlsZSkgeworICAgIHN0ZDo6c3RyaW5nIGhhc2g7CisgICAgaWYgKCFIYXNoKHNlcmlhbGl6ZWRGaWxlLCAmaGFzaCkpIHsKKyAgICAgICAgQUxPR0UoIlN0b3JlRmlsZVdpdGhIYXNoOiBGYWlsZWQgdG8gY29tcHV0ZSBoYXNoIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBIYXNoZWRGaWxlIGhhc2hGaWxlOworICAgIGhhc2hGaWxlLnNldF9maWxlKHNlcmlhbGl6ZWRGaWxlKTsKKyAgICBoYXNoRmlsZS5zZXRfaGFzaChoYXNoKTsKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZTsKKyAgICBoYXNoRmlsZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZEhhc2hGaWxlKTsKKworICAgIHJldHVybiBTdG9yZUZpbGVSYXcoZmlsZU5hbWUsIHNlcmlhbGl6ZWRIYXNoRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVJhdyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkSGFzaEZpbGUpIHsKKyAgICBNZW1vcnlGaWxlU3lzdGVtOjpNZW1vcnlGaWxlIG1lbUZpbGU7CisgICAgbWVtRmlsZS5zZXRGaWxlTmFtZShmaWxlTmFtZSk7CisgICAgbWVtRmlsZS5zZXRDb250ZW50KHNlcmlhbGl6ZWRIYXNoRmlsZSk7CisgICAgbWVtRmlsZS5zZXRGaWxlU2l6ZShzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKTsKKyAgICBzaXplX3QgbGVuID0gbUZpbGVIYW5kbGUuV3JpdGUoZmlsZU5hbWUsIG1lbUZpbGUpOworCisgICAgaWYgKGxlbiAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJTdG9yZUZpbGVSYXc6IEZhaWxlZCB0byB3cml0ZSAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRCgiU3RvcmVGaWxlUmF3OiBleHBlY3RlZD0lemQsIGFjdHVhbD0lenUiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBsZW4pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR0QoIlN0b3JlRmlsZVJhdzogd3JvdGUgJXp1IGJ5dGVzIHRvICVzIiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJldHJpZXZlTGljZW5zZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSogc3RhdGUsIHN0ZDo6c3RyaW5nKiBvZmZsaW5lTGljZW5zZSkgeworCisgICAgT2ZmbGluZUZpbGUgZmlsZTsKKyAgICBpZiAoIVJldHJpZXZlSGFzaGVkRmlsZShrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQsICZmaWxlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGZpbGUudHlwZSgpICE9IE9mZmxpbmVGaWxlOjpMSUNFTlNFKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IEludmFsaWQgZmlsZSB0eXBlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlsZS52ZXJzaW9uKCkgIT0gT2ZmbGluZUZpbGU6OlZFUlNJT05fMSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBJbnZhbGlkIGZpbGUgdmVyc2lvbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFmaWxlLmhhc19saWNlbnNlKCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogTGljZW5zZSBub3QgcHJlc2VudCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTGljZW5zZSBsaWNlbnNlID0gZmlsZS5saWNlbnNlKCk7CisgICAgc3dpdGNoIChsaWNlbnNlLnN0YXRlKCkpIHsKKyAgICAgICAgY2FzZSBMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkU6CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlQWN0aXZlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HOgorICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlJldHJpZXZlTGljZW5zZTogVW5yZWNvZ25pemVkIGxpY2Vuc2Ugc3RhdGU6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAga0xpY2Vuc2VTdGF0ZVVua25vd24pOworICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZVVua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKm9mZmxpbmVMaWNlbnNlID0gbGljZW5zZS5saWNlbnNlKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkRlbGV0ZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUZpbGUoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0KTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RGVsZXRlQWxsTGljZW5zZXMoKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUFsbEZpbGVzKCk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkxpY2Vuc2VFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkZpbGVFeGlzdHMoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0KTsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IERldmljZUZpbGVzOjpMaXN0TGljZW5zZXMoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpY2Vuc2VzID0gbUZpbGVIYW5kbGUuTGlzdEZpbGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaWNlbnNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzdGQ6OnN0cmluZyYgbGljZW5zZSA9IGxpY2Vuc2VzW2ldOworICAgICAgICBsaWNlbnNlID0gbGljZW5zZS5zdWJzdHIoMCwgbGljZW5zZS5zaXplKCkgLSBzdHJsZW4oa0xpY2Vuc2VGaWxlTmFtZUV4dCkpOworICAgIH0KKyAgICByZXR1cm4gbGljZW5zZXM7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJldHJpZXZlSGFzaGVkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIE9mZmxpbmVGaWxlKiBkZVNlcmlhbGl6ZWRGaWxlKSB7CisgICAgaWYgKCFkZVNlcmlhbGl6ZWRGaWxlKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGludmFsaWQgZmlsZSBwYXJhbWV0ZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghRmlsZUV4aXN0cyhmaWxlTmFtZSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogJXMgZG9lcyBub3QgZXhpc3QiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNzaXplX3QgYnl0ZXMgPSBHZXRGaWxlU2l6ZShmaWxlTmFtZSk7CisgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogaW52YWxpZCBmaWxlIHNpemU6ICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycnVwdGVkIGZpbGUgc28gdGhlIGNhbGxlciB3aWxsIG5vdCBnZXQgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBmaWxlIHJlcGVhdGVkbHksIGNhdXNpbmcgdGhlIHN5c3RlbSB0byBzdGFsbC4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGU7CisgICAgc2VyaWFsaXplZEhhc2hGaWxlLnJlc2l6ZShieXRlcyk7CisgICAgYnl0ZXMgPSBtRmlsZUhhbmRsZS5SZWFkKGZpbGVOYW1lLCAmc2VyaWFsaXplZEhhc2hGaWxlKTsKKworICAgIGlmIChieXRlcyAhPSBzdGF0aWNfY2FzdDxzc2l6ZV90PihzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBGYWlsZWQgdG8gcmVhZCBmcm9tICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGV4cGVjdGVkOiAlemQsIGFjdHVhbDogJXpkIiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgYnl0ZXMpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGNvcnJ1cHRlZCBmaWxlIHNvIHRoZSBjYWxsZXIgd2lsbCBub3QgZ2V0IHRoZSBzYW1lIGVycm9yCisgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgZmlsZSByZXBlYXRlZGx5LCBjYXVzaW5nIHRoZSBzeXN0ZW0gdG8gc3RhbGwuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoIlJldHJpZXZlSGFzaGVkRmlsZTogcmVhZCAlemQgZnJvbSAlcyIsIGJ5dGVzLCBmaWxlTmFtZS5jX3N0cigpKTsKKworICAgIEhhc2hlZEZpbGUgaGFzaEZpbGU7CisgICAgaWYgKCFoYXNoRmlsZS5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZEhhc2hGaWxlKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBVbmFibGUgdG8gcGFyc2UgaGFzaCBmaWxlIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgaGFzaDsKKyAgICBpZiAoIUhhc2goaGFzaEZpbGUuZmlsZSgpLCAmaGFzaCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogSGFzaCBjb21wdXRhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChoYXNoICE9IGhhc2hGaWxlLmhhc2goKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBIYXNoIG1pc21hdGNoIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFkZVNlcmlhbGl6ZWRGaWxlLT5QYXJzZUZyb21TdHJpbmcoaGFzaEZpbGUuZmlsZSgpKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBVbmFibGUgdG8gcGFyc2UgZmlsZSIpOworICAgICAgICAvLyBSZW1vdmUgY29ycnVwdCBmaWxlLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERldmljZUZpbGVzOjpGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5GaWxlRXhpc3RzKGZpbGVOYW1lKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlRmlsZShmaWxlTmFtZSk7Cit9CisKK3NzaXplX3QgRGV2aWNlRmlsZXM6OkdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5HZXRGaWxlU2l6ZShmaWxlTmFtZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcAppbmRleCA3NzU1N2Y5Li45ZmI1YmJlIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAKQEAgLTMwLDEwICszMCwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogCiBSZXR1cm48Ym9vbD4gRHJtRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoCkBAIC00MSw2ICs0MiwxMyBAQAogICAgIHJldHVybiBjbGVhcmtleWRybTo6aXNDbGVhcktleVVVSUQodXVpZC5kYXRhKCkpOwogfQogCitSZXR1cm48Ym9vbD4gRHJtRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRfMV8yKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKKyAgICByZXR1cm4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkgJiYgaXNDb250ZW50VHlwZVN1cHBvcnRlZChtaW1lVHlwZSkgJiYKKyAgICAgICAgICAgIGxldmVsID09IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87Cit9CisKIFJldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSkgewogICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBtaW1lVHlwZXMgaGFuZGVkIGJ5IEluaXREYXRhUGFyc2VyLgogICAgIHJldHVybiBtaW1lVHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUgfHwKQEAgLTcxLDcgKzc5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAppbmRleCAzYjYxMDg1Li5kN2RhY2I4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCkBAIC0yNSwxMSArMjUsMTUgQEAKICNpbmNsdWRlICJDbGVhcktleURybVByb3BlcnRpZXMuaCIKICNpbmNsdWRlICJTZXNzaW9uLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnQuaCIKKyNpbmNsdWRlICJVdGlscy5oIgogCiBuYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcga0tleVNldElkUHJlZml4KCJja2lkIik7Citjb25zdCBpbnQga0tleVNldElkTGVuZ3RoID0gMTY7CiBjb25zdCBpbnQga1NlY3VyZVN0b3BJZFN0YXJ0ID0gMTAwOworY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmVMaWNlbnNlKCJcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwiIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtPZmZsaW5lKCJPZmZsaW5lIik7Citjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5TGljZW5zZSgiXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIiIpOwogY29uc3Qgc3RkOjpzdHJpbmcga1RydWUoIlRydWUiKTsKIAogY29uc3Qgc3RkOjpzdHJpbmcga1F1ZXJ5S2V5TGljZW5zZVR5cGUoIkxpY2Vuc2VUeXBlIik7CkBAIC01NCwxOCArNTgsMzEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKK0tleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGVfVjFfMChLZXlSZXF1ZXN0VHlwZV9WMV8xIGtleVJlcXVlc3RUeXBlKSB7CisgIHN3aXRjaCAoa2V5UmVxdWVzdFR5cGUpIHsKKyAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6Ok5PTkU6CisgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVUERBVEU6CisgICAgICByZXR1cm4gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxLZXlSZXF1ZXN0VHlwZT4oa2V5UmVxdWVzdFR5cGUpOworICB9Cit9CisKIERybVBsdWdpbjo6RHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKICAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpLAogICAgICAgICAgIG1PcGVuU2Vzc2lvbk9rQ291bnQoMCksCiAgICAgICAgICAgbUNsb3NlU2Vzc2lvbk9rQ291bnQoMCksCiAgICAgICAgICAgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50KDApLAotICAgICAgICAgIG1OZXh0U2VjdXJlU3RvcElkKGtTZWN1cmVTdG9wSWRTdGFydCkgeworICAgICAgICAgIG1OZXh0U2VjdXJlU3RvcElkKGtTZWN1cmVTdG9wSWRTdGFydCksCisgICAgICAgICAgbU1vY2tFcnJvcihTdGF0dXNfVjFfMjo6T0spIHsKICAgICBtUGxheVBvbGljeS5jbGVhcigpOwogICAgIGluaXRQcm9wZXJ0aWVzKCk7CiAgICAgbVNlY3VyZVN0b3BzLmNsZWFyKCk7CisgICAgbVJlbGVhc2VLZXlzTWFwLmNsZWFyKCk7CisgICAgc3RkOjpzcmFuZChzdGQ6OnRpbWUobnVsbHB0cikpOwogfQogCiB2b2lkIERybVBsdWdpbjo6aW5pdFByb3BlcnRpZXMoKSB7CkBAIC03NSw2ICs5Miw3IEBACiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba1BsdWdpbkRlc2NyaXB0aW9uS2V5XSA9IGtQbHVnaW5EZXNjcmlwdGlvblZhbHVlOwogICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tBbGdvcml0aG1zS2V5XSA9IGtBbGdvcml0aG1zVmFsdWU7CiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba0xpc3RlbmVyVGVzdFN1cHBvcnRLZXldID0ga0xpc3RlbmVyVGVzdFN1cHBvcnRWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trRHJtRXJyb3JUZXN0S2V5XSA9IGtEcm1FcnJvclRlc3RWYWx1ZTsKIAogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlVmVjdG9yOwogICAgIHZhbHVlVmVjdG9yLmNsZWFyKCk7CkBAIC0xMDMsNiArMTIxLDcgQEAKIAogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6b3BlblNlc3Npb24ob3BlblNlc3Npb25fY2IgX2hpZGxfY2IpIHsKICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CisgICAgcHJvY2Vzc01vY2tFcnJvcihzZXNzaW9uKTsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQgPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKIAogICAgIFN0YXR1cyBzdGF0dXMgPSBzZXRTZWN1cml0eUxldmVsKHNlc3Npb25JZCwgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTyk7CkBAIC0xMTQsNiArMTMzLDcgQEAKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46Om9wZW5TZXNzaW9uXzFfMShTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCiAgICAgICAgIG9wZW5TZXNzaW9uXzFfMV9jYiBfaGlkbF9jYikgewogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBwcm9jZXNzTW9ja0Vycm9yKHNlc3Npb24pOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOwogCiAgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBzZWN1cml0eUxldmVsKTsKQEAgLTEyOSw2ICsxNDksMTAgQEAKIAogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNlc3Npb25JZCkpOwogICAgIGlmIChzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIGlmIChzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKSAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIHNlbmRTZXNzaW9uTG9zdFN0YXRlKHNlc3Npb25JZCk7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfQogICAgICAgICBtQ2xvc2VTZXNzaW9uT2tDb3VudCsrOwogICAgICAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOwogICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKQEAgLTEzNywzNSArMTYxLDc1IEBACiAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKIH0KIAotU3RhdHVzIERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCitTdGF0dXNfVjFfMiBEcm1QbHVnaW46OmdldEtleVJlcXVlc3RDb21tb24oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKICAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnJlcXVlc3QsCi0gICAgICAgIEtleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSAqa2V5UmVxdWVzdFR5cGUsCiAgICAgICAgIHN0ZDo6c3RyaW5nICpkZWZhdWx0VXJsKSB7CiAgICAgICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOwogCisgICAgLy8gR2V0S2V5UmVxdWVzdE9mZmxpbmVLZXlUeXBlTm90U3VwcG9ydGVkKCkgaW4gdnRzIDEuMCBhbmQgMS4xIGV4cGVjdHMKKyAgICAvLyBLZXlUeXBlOjpPRkZMSU5FIHRvIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSBpbiBjbGVhcmtleSBwbHVnaW4uCisgICAgLy8gVGhvc2UgdGVzdHMgcGFzcyBpbiBhbiBlbXB0eSBpbml0RGF0YSwgd2UgdXNlIHRoZSBlbXB0eSBpbml0RGF0YSB0bworICAgIC8vIHNpZ25hbCBzdWNoIHNwZWNpZmljIHVzZSBjYXNlLgorICAgIGlmIChrZXlUeXBlID09IEtleVR5cGU6Ok9GRkxJTkUgJiYgMCA9PSBpbml0RGF0YS5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKICAgICAqZGVmYXVsdFVybCA9ICIiOwotICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CiAgICAgKnJlcXVlc3QgPSBzdGQ6OnZlY3Rvcjx1aW50OF90PigpOwogCi0gICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgIChrZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORyAmJgorICAgICAgICAgICAga2V5VHlwZSAhPSBLZXlUeXBlOjpPRkZMSU5FICYmCisgICAgICAgICAgICBrZXlUeXBlICE9IEtleVR5cGU6OlJFTEVBU0UpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6QkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmIChrZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY29wZUlkID0gdG9WZWN0b3Ioc2NvcGUpOworICAgIHNwPFNlc3Npb24+IHNlc3Npb247CisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6U1RSRUFNSU5HIHx8IGtleVR5cGUgPT0gS2V5VHlwZTo6T0ZGTElORSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQoc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbi0+Z2V0TW9ja0Vycm9yKCkgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi0+Z2V0TW9ja0Vycm9yKCk7CisgICAgICAgIH0KKworICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpJTklUSUFMOwogICAgIH0KIAotICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNjb3BlKSk7Ci0gICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7Ci0gICAgfQorICAgIFN0YXR1c19WMV8yIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1c19WMV8yPigKKyAgICAgICAgICAgIHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCByZXF1ZXN0KSk7CiAKLSAgICBTdGF0dXMgc3RhdHVzID0gc2Vzc2lvbi0+Z2V0S2V5UmVxdWVzdChpbml0RGF0YSwgbWltZVR5cGUsIHJlcXVlc3QpOwotICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOworICAgIGlmIChrZXlUeXBlID09IEtleVR5cGU6OlJFTEVBU0UpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQoc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmVxdWVzdFN0cmluZyhyZXF1ZXN0LT5iZWdpbigpLCByZXF1ZXN0LT5lbmQoKSk7CisgICAgICAgIGlmIChyZXF1ZXN0U3RyaW5nLmZpbmQoa09mZmxpbmVMaWNlbnNlKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZW1wdHlSZXNwb25zZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleVNldElkU3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICAgICAgICAgIGlmICghbUZpbGVIYW5kbGUuU3RvcmVMaWNlbnNlKGtleVNldElkU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgZW1wdHlSZXNwb25zZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiUHJvYmxlbSByZWxlYXNpbmcgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUmVsZWFzZUtleXNNYXAuZmluZChrZXlTZXRJZFN0cmluZykgPT0gbVJlbGVhc2VLZXlzTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgICAgICAgICAgICAgIG1SZWxlYXNlS2V5c01hcFtrZXlTZXRJZFN0cmluZ10gPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koImtleSBpcyBpbiB1c2UsIGlnbm9yZSByZWxlYXNlIHJlcXVlc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJPZmZsaW5lIGxpY2Vuc2Ugbm90IGZvdW5kLCBub3RoaW5nIHRvIHJlbGVhc2UiKTsKKyAgICAgICAgfQorICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpSRUxFQVNFOworICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNzgsMTUgKzI0MiwxNSBAQAogICAgICAgICBnZXRLZXlSZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CiAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKLSAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVTktOT1dOOwogICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoIiIpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKICAgICAgICAgICAgIHNjb3BlLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgICZyZXF1ZXN0LCAma2V5UmVxdWVzdFR5cGUsICZkZWZhdWx0VXJsKTsKIAotICAgIF9oaWRsX2NiKHN0YXR1cywgdG9IaWRsVmVjKHJlcXVlc3QpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZT4oa2V5UmVxdWVzdFR5cGUpLAorICAgIF9oaWRsX2NiKHRvU3RhdHVzXzFfMChzdGF0dXMpLCB0b0hpZGxWZWMocmVxdWVzdCksCisgICAgICAgICAgICB0b0tleVJlcXVlc3RUeXBlX1YxXzAoa2V5UmVxdWVzdFR5cGUpLAogICAgICAgICAgICAgaGlkbF9zdHJpbmcoZGVmYXVsdFVybCkpOwogICAgIHJldHVybiBWb2lkKCk7CiB9CkBAIC0yMDAsMTAgKzI2NCwzMSBAQAogICAgICAgICBnZXRLZXlSZXF1ZXN0XzFfMV9jYiBfaGlkbF9jYikgewogICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOwogCi0gICAgS2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKICAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VXJsKCIiKTsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OwotICAgIFN0YXR1cyBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAorICAgIFN0YXR1c19WMV8yIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCisgICAgICAgICAgICBzY29wZSwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAmcmVxdWVzdCwgJmtleVJlcXVlc3RUeXBlLCAmZGVmYXVsdFVybCk7CisKKyAgICBfaGlkbF9jYih0b1N0YXR1c18xXzAoc3RhdHVzKSwgdG9IaWRsVmVjKHJlcXVlc3QpLAorICAgICAgICAgICAga2V5UmVxdWVzdFR5cGUsIGhpZGxfc3RyaW5nKGRlZmF1bHRVcmwpKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzJfY2IgX2hpZGxfY2IpIHsKKyAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKKworICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVTktOT1dOOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoIiIpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7CisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKICAgICAgICAgICAgIHNjb3BlLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgICZyZXF1ZXN0LCAma2V5UmVxdWVzdFR5cGUsICZkZWZhdWx0VXJsKTsKIApAQCAtMjI3LDYgKzMxMiwzMCBAQAogICAgIG1QbGF5UG9saWN5LnB1c2hfYmFjayhwb2xpY3kpOwogfQogCitib29sIERybVBsdWdpbjo6bWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCkgeworICAgIGlmICgha2V5U2V0SWQpIHsKKyAgICAgICAgQUxPR0UoImtleVNldElkIGRlc3RpbmF0aW9uIG5vdCBwcm92aWRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtzaWQoa0tleVNldElkUHJlZml4LmJlZ2luKCksIGtLZXlTZXRJZFByZWZpeC5lbmQoKSk7CisgICAga3NpZC5yZXNpemUoa0tleVNldElkTGVuZ3RoKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByYW5kb21EYXRhKChrS2V5U2V0SWRMZW5ndGggLSBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSAvIDIsIDApOworCisgICAgd2hpbGUgKGtleVNldElkLT5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoYXV0byBpdHIgPSByYW5kb21EYXRhLmJlZ2luKCk7IGl0ciAhPSByYW5kb21EYXRhLmVuZCgpOyArK2l0cikgeworICAgICAgICAgICAgKml0ciA9IHN0ZDo6cmFuZCgpICUgMHhmZjsKKyAgICAgICAgfQorICAgICAgICAqa2V5U2V0SWQgPSBrS2V5U2V0SWRQcmVmaXggKyBCeXRlQXJyYXlUb0hleFN0cmluZygKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYW5kb21EYXRhLmRhdGEoKSksIHJhbmRvbURhdGEuc2l6ZSgpKTsKKyAgICAgICAgaWYgKG1GaWxlSGFuZGxlLkxpY2Vuc2VFeGlzdHMoKmtleVNldElkKSkgeworICAgICAgICAgICAgLy8gY29sbGlzaW9uLCByZWdlbmVyYXRlCisgICAgICAgICAgICBBTE9HVigiUmV0cnkgZ2VuZXJhdGluZyBLZXlTZXRJZCIpOworICAgICAgICAgICAga2V5U2V0SWQtPmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OnByb3ZpZGVLZXlSZXNwb25zZSgKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzcG9uc2UsCkBAIC0yMzcsMjIgKzM0Niw2MCBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAotICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNjb3BlKSk7CisgICAgc3RkOjpzdHJpbmcgcmVzcG9uc2VTdHJpbmcoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyZXNwb25zZS5kYXRhKCkpLCByZXNwb25zZS5zaXplKCkpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjb3BlSWQgPSB0b1ZlY3RvcihzY29wZSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgIHN0ZDo6c3RyaW5nIGtleVNldElkOworCisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgYm9vbCBpc09mZmxpbmVMaWNlbnNlID0gcmVzcG9uc2VTdHJpbmcuZmluZChrT2ZmbGluZUxpY2Vuc2UpICE9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgIGJvb2wgaXNSZWxlYXNlID0gKG1lbWNtcChzY29wZUlkLmRhdGEoKSwga0tleVNldElkUHJlZml4LmRhdGEoKSwga0tleVNldElkUHJlZml4LnNpemUoKSkgPT0gMCk7CisgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICBrZXlTZXRJZC5hc3NpZ24oc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKworICAgICAgICBhdXRvIGl0ZXIgPSBtUmVsZWFzZUtleXNNYXAuZmluZChzdGQ6OnN0cmluZyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSkpOworICAgICAgICBpZiAoaXRlciAhPSBtUmVsZWFzZUtleXNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHNlc3Npb25JZC5hc3NpZ24oaXRlci0+c2Vjb25kLmJlZ2luKCksIGl0ZXItPnNlY29uZC5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzZXNzaW9uSWQuYXNzaWduKHNjb3BlSWQuYmVnaW4oKSwgc2NvcGVJZC5lbmQoKSk7CisgICAgICAgIC8vIG5vbiBvZmZsaW5lIGxpY2Vuc2UgcmV0dXJucyBlbXB0eSBrZXlTZXRJZAorICAgICAgICBrZXlTZXRJZC5jbGVhcigpOworICAgIH0KKworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCwgaGlkbF92ZWM8dWludDhfdD4oKSk7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQotCiAgICAgc2V0UGxheVBvbGljeSgpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOwotICAgIGtleVNldElkLmNsZWFyKCk7CiAKLSAgICBTdGF0dXMgc3RhdHVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOwogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAvLyBUZXN0IGNhbGxpbmcgQU1lZGlhRHJtIGxpc3RlbmVycy4KLSAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIHRvVmVjdG9yKHNjb3BlKSwgdG9WZWN0b3Ioc2NvcGUpKTsKKyAgICAgICAgaWYgKGlzT2ZmbGluZUxpY2Vuc2UpIHsKKyAgICAgICAgICAgIGlmIChpc1JlbGVhc2UpIHsKKyAgICAgICAgICAgICAgICBtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGtleVNldElkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFtYWtlS2V5U2V0SWQoJmtleVNldElkKSkgeworICAgICAgICAgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgc2VuZEV4cGlyYXRpb25VcGRhdGUodG9WZWN0b3Ioc2NvcGUpLCAxMDApOworICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVzcG9uc2UuYmVnaW4oKSwgcmVzcG9uc2UuZW5kKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGVzdCBjYWxsaW5nIEFNZWRpYURybSBsaXN0ZW5lcnMuCisgICAgICAgIHNlbmRFdmVudChFdmVudFR5cGU6OlZFTkRPUl9ERUZJTkVELCBzZXNzaW9uSWQsIHNlc3Npb25JZCk7CisKKyAgICAgICAgc2VuZEV4cGlyYXRpb25VcGRhdGUoc2Vzc2lvbklkLCAxMDApOwogCiAgICAgICAgIHN0ZDo6dmVjdG9yPEtleVN0YXR1cz4ga2V5c1N0YXR1czsKICAgICAgICAgS2V5U3RhdHVzIGtleVN0YXR1czsKQEAgLTI2NywxNiArNDE0LDUxIEBACiAgICAgICAgIGtleVN0YXR1cy50eXBlID0gVjFfMDo6S2V5U3RhdHVzVHlwZTo6RVhQSVJFRDsKICAgICAgICAga2V5c1N0YXR1cy5wdXNoX2JhY2soa2V5U3RhdHVzKTsKIAotICAgICAgICBzZW5kS2V5c0NoYW5nZSh0b1ZlY3RvcihzY29wZSksIGtleXNTdGF0dXMsIHRydWUpOworICAgICAgICBzZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleXNTdGF0dXMsIHRydWUpOworCisgICAgICAgIGluc3RhbGxTZWN1cmVTdG9wKHNlc3Npb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInByb3ZpZGVLZXlSZXNwb25zZSByZXR1cm5zIGVycm9yPSVkIiwgc3RhdHVzKTsKICAgICB9CiAKLSAgICBpbnN0YWxsU2VjdXJlU3RvcChzY29wZSk7Ci0KLSAgICAvLyBSZXR1cm5zIHN0YXR1cyBhbmQgZW1wdHkga2V5U2V0SWQKLSAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhrZXlTZXRJZCkpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkVmVjKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhrZXlTZXRJZFZlYykpOwogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6cmVzdG9yZUtleXMoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleVNldElkLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBEZXZpY2VGaWxlczo6TGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgb2ZmbGluZUxpY2Vuc2U7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgICAgICBpZiAoIW1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZShzdGQ6OnN0cmluZyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSksCisgICAgICAgICAgICAgICAgJmxpY2Vuc2VTdGF0ZSwgJm9mZmxpbmVMaWNlbnNlKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXN0b3JlIG9mZmxpbmUgbGljZW5zZSIpOworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVVbmtub3duID09IGxpY2Vuc2VTdGF0ZSB8fAorICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nID09IGxpY2Vuc2VTdGF0ZSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgbGljZW5zZSBzdGF0ZT0lZCIsIGxpY2Vuc2VTdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNlc3Npb25JZCkpOworICAgICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KG9mZmxpbmVMaWNlbnNlLmJlZ2luKCksCisgICAgICAgICAgICAgICAgb2ZmbGluZUxpY2Vuc2UuZW5kKCkpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUga2V5cyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7Cit9CisKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFByb3BlcnR5U3RyaW5nKAogICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgcHJvcGVydHlOYW1lLCBnZXRQcm9wZXJ0eVN0cmluZ19jYiBfaGlkbF9jYikgewogICAgIHN0ZDo6c3RyaW5nIG5hbWUocHJvcGVydHlOYW1lLmNfc3RyKCkpOwpAQCAtMjkyLDYgKzQ3NCw4IEBACiAgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0FsZ29yaXRobXNLZXldOwogICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSkgewogICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tMaXN0ZW5lclRlc3RTdXBwb3J0S2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0RybUVycm9yVGVzdEtleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gc3RyaW5nIHByb3BlcnR5ICVzIiwgbmFtZS5jX3N0cigpKTsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgIiIpOwpAQCAtMzM2LDYgKzUyMCwyMCBAQAogICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CiAgICAgfQogCisgICAgaWYgKG5hbWUgPT0ga0RybUVycm9yVGVzdEtleSkgeworICAgICAgICBpZiAodmFsdWUgPT0ga1Jlc291cmNlQ29udGVudGlvblZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IGtMb3N0U3RhdGVWYWx1ZSkgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IGtGcmFtZVRvb0xhcmdlVmFsdWUpIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBrSW52YWxpZFN0YXRlVmFsdWUpICB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tleV0gPSBzdGQ6OnN0cmluZyh2YWx1ZS5jX3N0cigpKTsKICAgICByZXR1cm4gU3RhdHVzOjpPSzsKIH0KQEAgLTM0Niw2ICs1NDQsOSBAQAogICAgaWYgKG5hbWUgPT0ga0RldmljZUlkS2V5KSB7CiAgICAgICBBTE9HRCgiQ2Fubm90IHNldCBpbW11dGFibGUgcHJvcGVydHk6ICVzIiwgbmFtZS5jX3N0cigpKTsKICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgIH0gZWxzZSBpZiAobmFtZSA9PSBrQ2xpZW50SWRLZXkpIHsKKyAgICAgICBtQnl0ZUFycmF5UHJvcGVydGllc1trQ2xpZW50SWRLZXldID0gdG9WZWN0b3IodmFsdWUpOworICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOwogICAgfQogCiAgICAvLyBTZXR0aW5nIG9mIHVuZGVmaW5lZCBwcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQKQEAgLTQ4Myw2ICs2ODQsNjAgQEAKICAgICByZXR1cm4gVm9pZCgpOwogfQogCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhnZXRPZmZsaW5lTGljZW5zZUtleVNldElkc19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaWNlbnNlTmFtZXMgPSBtRmlsZUhhbmRsZS5MaXN0TGljZW5zZXMoKTsKKyAgICBzdGQ6OnZlY3RvcjxLZXlTZXRJZD4ga2V5U2V0SWRzOworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICBfaGlkbF9jYih0b1N0YXR1c18xXzAobU1vY2tFcnJvciksIGtleVNldElkcyk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgbmFtZSA6IGxpY2Vuc2VOYW1lcykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCkpOworICAgICAgICBrZXlTZXRJZHMucHVzaF9iYWNrKGtleVNldElkKTsKKyAgICB9CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywga2V5U2V0SWRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6cmVtb3ZlT2ZmbGluZUxpY2Vuc2UoY29uc3QgS2V5U2V0SWQmIGtleVNldElkKSB7CisgICAgaWYgKG1Nb2NrRXJyb3IgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgIHJldHVybiB0b1N0YXR1c18xXzAobU1vY2tFcnJvcik7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGxpY2Vuc2VOYW1lKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICBpZiAobUZpbGVIYW5kbGUuRGVsZXRlTGljZW5zZShsaWNlbnNlTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShjb25zdCBLZXlTZXRJZCYga2V5U2V0SWQsCisgICAgICAgIGdldE9mZmxpbmVMaWNlbnNlU3RhdGVfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlOworICAgIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZTsKKyAgICBpZiAobU1vY2tFcnJvciAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgX2hpZGxfY2IodG9TdGF0dXNfMV8wKG1Nb2NrRXJyb3IpLCBPZmZsaW5lTGljZW5zZVN0YXRlOjpVTktOT1dOKTsKKyAgICB9IGVsc2UgaWYgKG1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZShsaWNlbnNlTmFtZSwgJnN0YXRlLCAmbGljZW5zZSkpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVTQUJMRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVVbmtub3duOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBoTGljZW5zZVN0YXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTik7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BzKGdldFNlY3VyZVN0b3BzX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjp2ZWN0b3I8U2VjdXJlU3RvcD4gc3RvcHM7CiAgICAgZm9yIChhdXRvIGl0ciA9IG1TZWN1cmVTdG9wcy5iZWdpbigpOyBpdHIgIT0gbVNlY3VyZVN0b3BzLmVuZCgpOyArK2l0cikgewpAQCAtNTg1LDcgKzg0MCw3IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBWMV8yCiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCmluZGV4IGUyYmI2NTEuLjhlYmI0MmIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0zMSw3ICszMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBuYW1lc3BhY2UgewpAQCAtNDUsMjEgKzQ1LDIyIEBACiB9CiAKIFN0YXR1cyBJbml0RGF0YVBhcnNlcjo6cGFyc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgewogICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUga2V5IElEcwogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiBrZXlJZHM7CiAKLSAgICBpZiAodHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0KSB7CisgICAgaWYgKG1pbWVUeXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUgfHwKKyAgICAgICAgbWltZVR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdCkgewogICAgICAgICBTdGF0dXMgcmVzID0gcGFyc2VQc3NoKGluaXREYXRhLCAma2V5SWRzKTsKICAgICAgICAgaWYgKHJlcyAhPSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQpIHsKKyAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrV2VibUF1ZGlvTWltZVR5cGUgfHwKKyAgICAgICAgbWltZVR5cGUgPT0ga1dlYm1Jbml0RGF0YUZvcm1hdCkgewogICAgICAgICAvLyBXZWJNICJpbml0IGRhdGEiIGlzIGp1c3QgYSBzaW5nbGUga2V5IElECiAgICAgICAgIGlmIChpbml0RGF0YS5zaXplKCkgIT0ga0tleUlkU2l6ZSkgewogICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CkBAIC02OSw4ICs3MCwxMiBAQAogICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKICAgICB9CiAKKyAgICBpZiAoa2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpSRUxFQVNFKSB7CisgICAgICAgIC8vIHJlc3RvcmUga2V5CisgICAgfQorCiAgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QKLSAgICBzdGQ6OnN0cmluZyByZXF1ZXN0SnNvbiA9IGdlbmVyYXRlUmVxdWVzdChrZXlJZHMpOworICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleVR5cGUsIGtleUlkcyk7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdEpzb25WZWMgPSBTdHJUb1ZlY3RvcihyZXF1ZXN0SnNvbik7CiAKICAgICBsaWNlbnNlUmVxdWVzdC0+Y2xlYXIoKTsKQEAgLTEzMSw5ICsxMzYsMTEgQEAKICAgICByZXR1cm4gU3RhdHVzOjpPSzsKIH0KIAotc3RkOjpzdHJpbmcgSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcykgeworc3RkOjpzdHJpbmcgSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChWMV8wOjpLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKSB7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcga1JlcXVlc3RQcmVmaXgoIntcImtpZHNcIjpbIik7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcga1JlcXVlc3RTdWZmaXgoIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5U2Vzc2lvbigiXSxcInR5cGVcIjpcInRlbXBvcmFyeVwifSIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtQZXJzaXN0ZW50U2Vzc2lvbigiXSxcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwifSIpOwogCiAgICAgc3RkOjpzdHJpbmcgcmVxdWVzdChrUmVxdWVzdFByZWZpeCk7CiAgICAgc3RkOjpzdHJpbmcgZW5jb2RlZElkOwpAQCAtMTQ3LDcgKzE1NCwxMiBAQAogICAgICAgICByZXF1ZXN0LmFwcGVuZChlbmNvZGVkSWQpOwogICAgICAgICByZXF1ZXN0LnB1c2hfYmFjaygnXCInKTsKICAgICB9Ci0gICAgcmVxdWVzdC5hcHBlbmQoa1JlcXVlc3RTdWZmaXgpOworICAgIGlmIChrZXlUeXBlID09IFYxXzA6OktleVR5cGU6OlNUUkVBTUlORykgeworICAgICAgICByZXF1ZXN0LmFwcGVuZChrVGVtcG9yYXJ5U2Vzc2lvbik7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IFYxXzA6OktleVR5cGU6Ok9GRkxJTkUgfHwKKyAgICAgICAgICAgICAgICAgICBrZXlUeXBlID09IFYxXzA6OktleVR5cGU6OlJFTEVBU0UpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKGtQZXJzaXN0ZW50U2Vzc2lvbik7CisgICAgfQogCiAgICAgLy8gQW5kcm9pZCdzIEJhc2U2NCBlbmNvZGVyIHByb2R1Y2VzIHBhZGRpbmcuIEVNRSBmb3JiaWRzIHBhZGRpbmcuCiAgICAgY29uc3QgY2hhciBrQmFzZTY0UGFkZGluZyA9ICc9JzsKQEAgLTE1Nyw3ICsxNjksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAKaW5kZXggY2NjYjQxZS4uZDkzNzc3ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCkBAIC0yMiwxOCArMjIsMjEgQEAKICNpbmNsdWRlICJCYXNlNjQuaCIKIAogbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtCYXNlNjRQYWRkaW5nKCI9Iik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5c1RhZygia2V5cyIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleVR5cGVUYWcoImt0eSIpOwotY29uc3Qgc3RkOjpzdHJpbmcga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlUYWcoImsiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlJZFRhZygia2lkIik7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQmFzZTY0UGFkZGluZygiPSIpOworY29uc3Qgc3RkOjpzdHJpbmcga01lZGlhU2Vzc2lvblR5cGUoInR5cGUiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtQZXJzaXN0ZW50TGljZW5zZVNlc3Npb24oInBlcnNpc3RlbnQtbGljZW5zZSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlU2Vzc2lvbigidGVtcG9yYXJ5Iik7CiB9CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIEpzb25XZWJLZXk6Okpzb25XZWJLZXkoKSB7CkBAIC0yNjgsNyArMjcxLDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2QwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiTWVtb3J5RmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3N0ZDo6c3RyaW5nIE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc2l6ZV90IGluZGV4ID0gcGF0aC5maW5kX2xhc3Rfb2YoIi8iKTsKKyAgICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKGluZGV4KzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KK30KKworYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKTsKK30KKworc3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlc3VsdC0+c2Vjb25kLmdldEZpbGVTaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHNpemUgZm9yICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBNZW1vcnlGaWxlU3lzdGVtOjpMaXN0RmlsZXMoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpc3Q7CisgICAgZm9yIChjb25zdCBhdXRvJiBmaWxlbmFtZSA6IG1NZW1vcnlGaWxlU3lzdGVtKSB7CisgICAgICAgIGxpc3QucHVzaF9iYWNrKGZpbGVuYW1lLmZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogYnVmZmVyKSB7CisgICAgc3RkOjpzdHJpbmcga2V5ID0gR2V0RmlsZU5hbWUocGF0aCk7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGtleSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGUgPSByZXN1bHQtPnNlY29uZC5nZXRDb250ZW50KCk7CisgICAgICAgIGJ1ZmZlci0+YXNzaWduKHNlcmlhbGl6ZWRIYXNoRmlsZSk7CisgICAgICAgIHJldHVybiBidWZmZXItPnNpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZnJvbSAlcyIsIHBhdGguY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgY29uc3QgTWVtb3J5RmlsZSYgbWVtb3J5RmlsZSkgeworICAgIHN0ZDo6c3RyaW5nIGtleSA9IEdldEZpbGVOYW1lKHBhdGgpOworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2Uoa2V5KTsKKyAgICB9CisgICAgbU1lbW9yeUZpbGVTeXN0ZW0uaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgTWVtb3J5RmlsZT4oa2V5LCBtZW1vcnlGaWxlKSk7CisgICAgcmV0dXJuIG1lbW9yeUZpbGUuZ2V0RmlsZVNpemUoKTsKK30KKworYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgeworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICBtTWVtb3J5RmlsZVN5c3RlbS5lcmFzZShyZXN1bHQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgbGljZW5zZSB0byByZW1vdmU6ICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlQWxsRmlsZXMoKSB7CisgICAgbU1lbW9yeUZpbGVTeXN0ZW0uY2xlYXIoKTsKKyAgICByZXR1cm4gbU1lbW9yeUZpbGVTeXN0ZW0uZW1wdHkoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwCmluZGV4IDA3YzkyNjkuLmE5ZDcwMTYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcApAQCAtMjgsNyArMjgsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKQEAgLTQyLDkgKzQyLDEwIEBACiBTdGF0dXMgU2Vzc2lvbjo6Z2V0S2V5UmVxdWVzdCgKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0IHsKICAgICBJbml0RGF0YVBhcnNlciBwYXJzZXI7Ci0gICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbml0RGF0YSwgbWltZVR5cGUsIGtleVJlcXVlc3QpOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBrZXlSZXF1ZXN0KTsKIH0KIAogU3RhdHVzIFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpIHsKQEAgLTY3LDI5ICs2OCwzNCBAQAogICAgIH0KIH0KIAotU3RhdHVzIFNlc3Npb246OmRlY3J5cHQoCitTdGF0dXNfVjFfMiBTZXNzaW9uOjpkZWNyeXB0KAogICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNyY1B0ciwKICAgICAgICAgdWludDhfdCogZGVzdFB0ciwgY29uc3Qgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdWJTYW1wbGVzLAogICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOwogCisgICAgaWYgKGdldE1vY2tFcnJvcigpICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICByZXR1cm4gZ2V0TW9ja0Vycm9yKCk7CisgICAgfQorCiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWRWZWN0b3I7CiAgICAga2V5SWRWZWN0b3IuY2xlYXIoKTsKICAgICBrZXlJZFZlY3Rvci5pbnNlcnQoa2V5SWRWZWN0b3IuZW5kKCksIGtleUlkLCBrZXlJZCArIGtCbG9ja1NpemUpOwogICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+OjppdGVyYXRvciBpdHI7CiAgICAgaXRyID0gbUtleU1hcC5maW5kKGtleUlkVmVjdG9yKTsKICAgICBpZiAoaXRyID09IG1LZXlNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CiAgICAgfQogCiAgICAgQWVzQ3RyRGVjcnlwdG9yIGRlY3J5cHRvcjsKLSAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoCisgICAgU3RhdHVzIHN0YXR1cyA9IGRlY3J5cHRvci5kZWNyeXB0KAogICAgICAgICAgICAgaXRyLT5zZWNvbmQgLyprZXkqLywgaXYsIHNyY1B0ciwgZGVzdFB0ciwgc3ViU2FtcGxlcywKICAgICAgICAgICAgIHN1YlNhbXBsZXMuc2l6ZSgpLCBieXRlc0RlY3J5cHRlZE91dCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1c19WMV8yPihzdGF0dXMpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcAppbmRleCBiNDMxOWU2Li45OWZiMzBmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC01OSw3ICs1OSw4IEBACiAKICAgICBtU2Vzc2lvbnMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwKICAgICAgICAgICAgIHNwPFNlc3Npb24+ID4oc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKSk7Ci0gICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9IG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOwogICAgIGlmIChpdHIgIT0gbVNlc3Npb25zLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBpdHItPnNlY29uZDsKICAgICB9IGVsc2UgewpAQCAtNzAsNyArNzEsOCBAQAogc3A8U2Vzc2lvbj4gU2Vzc2lvbkxpYnJhcnk6OmZpbmRTZXNzaW9uKAogICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7Ci0gICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9IG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOwogICAgIGlmIChpdHIgIT0gbVNlc3Npb25zLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBpdHItPnNlY29uZDsKICAgICB9IGVsc2UgewpAQCAtODQsNyArODYsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTg1NmEuLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LWhhbC0xLTEgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkKLSAgICBjbGFzcyBoYWwKLSAgICB1c2VyIG1lZGlhCi0gICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KLSAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZkM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCkBAIC0wLDAgKzEsMTQgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1oYWwtMS0yIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMTo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjI6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBkaXNhYmxlZAorICAgIG9uZXNob3QKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTY2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCkBAIC0wLDAgKzEsMTIgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1oYWwtMS0yIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMTo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjI6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKaW5kZXggMGM3ZWYyMC4uNzIxZjRjMCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7CkBAIC00Miw3ICs0Miw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCmluZGV4IDRhMzg1YmQuLmVjMzBjYzEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmgKQEAgLTI1LDcgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CkBAIC0zOCw3ICszOCw3IEBACiB2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcgKm91dCk7CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKaW5kZXggNWJiYjI4YS4uYzQ5N2UzNyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpzcDsKQEAgLTU0LDcgKzU0LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKaW5kZXggZDY1YjI1Yy4uYjgzY2U2OSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaApAQCAtMjIsMzAgKzIyLDQwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvcktleSgidmVuZG9yIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvclZhbHVlKCJHb29nbGUiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvbktleSgidmVyc2lvbiIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uVmFsdWUoIjEuMSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uVmFsdWUoIjEuMiIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQbHVnaW5EZXNjcmlwdGlvbktleSgiZGVzY3JpcHRpb24iKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FsZ29yaXRobXNLZXkoImFsZ29yaXRobXMiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWxnb3JpdGhtc1ZhbHVlKCIiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSgibGlzdGVuZXJUZXN0U3VwcG9ydCIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMaXN0ZW5lclRlc3RTdXBwb3J0VmFsdWUoInRydWUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRHJtRXJyb3JUZXN0S2V5KCJkcm1FcnJvclRlc3QiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRHJtRXJyb3JUZXN0VmFsdWUoIiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSgicmVzb3VyY2VDb250ZW50aW9uIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0xvc3RTdGF0ZVZhbHVlKCJsb3N0U3RhdGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRnJhbWVUb29MYXJnZVZhbHVlKCJmcmFtZVRvb0xhcmdlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ludmFsaWRTdGF0ZVZhbHVlKCJpbnZhbGlkU3RhdGUiKTsKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEZXZpY2VJZEtleSgiZGV2aWNlSWQiKTsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtUZXN0RGV2aWNlSWREYXRhW10gPQogICAgICAgICB7MHgwLCAweDEsIDB4MiwgMHgzLCAweDQsIDB4NSwgMHg2LCAweDcsCiAgICAgICAgICAweDgsIDB4OSwgMHhhLCAweGIsIDB4YywgMHhkLCAweGUsIDB4Zn07CisKKy8vIHNldHRhYmxlIGJ5dGUgYXJyYXkgcHJvcGVydHkKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQ2xpZW50SWRLZXkoImNsaWVudElkIik7CisKIC8vIFRPRE8gc3R1YiBvdXQgbWV0cmljcyBmb3IgbncKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTWV0cmljc0tleSgibWV0cmljcyIpOwogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01ldHJpY3NEYXRhW10gPSB7IDAgfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCmluZGV4IDQ2Y2I1ZTQuLjAzYzQzNGUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaApAQCAtMTcsMTcgKzE3LDE4IEBACiAjaWZuZGVmIENMRUFSS0VZX01BQ1JPU19IXwogI2RlZmluZSBDTEVBUktFWV9NQUNST1NfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi90eXBlcy5oPgogCiAjaW5jbHVkZSA8bWFwPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiAKIGNvbnN0IHVpbnQ4X3Qga0Jsb2NrU2l6ZSA9IDE2OyAvL0FFU19CTE9DS19TSVpFOwpAQCAtNDcsNyArNDgsNyBAQAogICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlOwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCmluZGV4IDk5NTIwMjcuLjYzNjhmM2QgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKQEAgLTE3LDE3ICsxNywxNyBAQAogI2lmbmRlZiBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXwogI2RlZmluZSBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1GYWN0b3J5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklEcm1GYWN0b3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SURybUZhY3Rvcnk7CiAKIGV4dGVybiAiQyIgewogICAgIElEcm1GYWN0b3J5KiBjcmVhdGVEcm1GYWN0b3J5KCk7CkBAIC0zNSw3ICszNSw3IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBWMV8yCiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaAppbmRleCAxNzVhYjc2Li4yMDNiYjJkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKQEAgLTE4LDE3ICsxOCwxNyBAQAogI2RlZmluZSBDTEVBUktFWV9DUllQVE9fRkFDVE9SWV9IXwogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b0ZhY3RvcnkuaD4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC01Miw3ICs1Miw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCmluZGV4IDZhNzM4MDYuLjg2ODBmMGMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXwogI2RlZmluZSBDTEVBUktFWV9DUllQVE9fUExVR0lOX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvUGx1Z2luLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgogCiAjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgpAQCAtMzIsMTYgKzMyLDE3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpNb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpQYXR0ZXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3ViU2FtcGxlOworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6Ok1vZGU7Cit1c2luZyBkcm06OlYxXzA6OlBhdHRlcm47Cit1c2luZyBkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpTdWJTYW1wbGU7CisKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTEsNyArNTIsOSBAQAogdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7CiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogCi1zdHJ1Y3QgQ3J5cHRvUGx1Z2luIDogcHVibGljIElDcnlwdG9QbHVnaW4gewordHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKKworc3RydWN0IENyeXB0b1BsdWdpbiA6IHB1YmxpYyBkcm06OlYxXzI6OklDcnlwdG9QbHVnaW4gewogICAgIGV4cGxpY2l0IENyeXB0b1BsdWdpbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSB7CiAgICAgICAgIG1Jbml0U3RhdHVzID0gc2V0TWVkaWFEcm1TZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgfQpAQCAtODAsNiArODMsMTggQEAKICAgICAgICAgICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyJiBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgIGRlY3J5cHRfY2IgX2hpZGxfY2IpOwogCisgICAgUmV0dXJuPHZvaWQ+IGRlY3J5cHRfMV8yKAorICAgICAgICAgICAgYm9vbCBzZWN1cmUsCisgICAgICAgICAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIEtFWV9JRF9TSVpFPiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIEtFWV9JVl9TSVpFPiYgaXYsCisgICAgICAgICAgICBNb2RlIG1vZGUsCisgICAgICAgICAgICBjb25zdCBQYXR0ZXJuJiBwYXR0ZXJuLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U3ViU2FtcGxlPiYgc3ViU2FtcGxlcywKKyAgICAgICAgICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciYgc291cmNlLAorICAgICAgICAgICAgdWludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgZGVjcnlwdF8xXzJfY2IgX2hpZGxfY2IpOworCiAgICAgUmV0dXJuPHZvaWQ+IHNldFNoYXJlZEJ1ZmZlckJhc2UoY29uc3QgaGlkbF9tZW1vcnkmIGJhc2UsCiAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJJZCk7CiAKQEAgLTk2LDcgKzExMSw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTRhZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmgKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworI2lmbmRlZiBDTEVBUktFWV9ERVZJQ0VfRklMRVNfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfREVWSUNFX0ZJTEVTX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInByb3Rvcy9EZXZpY2VGaWxlcy5wYi5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJNZW1vcnlGaWxlU3lzdGVtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK2NsYXNzIERldmljZUZpbGVzIHsKKyBwdWJsaWM6CisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAga0xpY2Vuc2VTdGF0ZVVua25vd24sCisgICAgICAgIGtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgIGtMaWNlbnNlU3RhdGVSZWxlYXNpbmcsCisgICAgfSBMaWNlbnNlU3RhdGU7CisKKyAgICBEZXZpY2VGaWxlcygpIHt9OworICAgIHZpcnR1YWwgfkRldmljZUZpbGVzKCkge307CisKKyAgICB2aXJ0dWFsIGJvb2wgU3RvcmVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlIHN0YXRlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleVJlc3BvbnNlKTsKKworICAgIHZpcnR1YWwgYm9vbCBSZXRyaWV2ZUxpY2Vuc2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3NldF9pZCwgTGljZW5zZVN0YXRlKiBzdGF0ZSwgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKTsKKworICAgIHZpcnR1YWwgYm9vbCBMaWNlbnNlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBMaXN0TGljZW5zZXMoKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBEZWxldGVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlQWxsTGljZW5zZXMoKTsKKworIHByaXZhdGU6CisgICAgYm9vbCBGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSBjb25zdDsKKyAgICBzc2l6ZV90IEdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgYm9vbCBSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSk7CisKKyAgICBib29sIFJldHJpZXZlSGFzaGVkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIE9mZmxpbmVGaWxlKiBkZVNlcmlhbGl6ZWRGaWxlKTsKKyAgICBib29sIFN0b3JlRmlsZVJhdyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkRmlsZSk7CisgICAgYm9vbCBTdG9yZUZpbGVXaXRoSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkRmlsZSk7CisKKyAgICBNZW1vcnlGaWxlU3lzdGVtIG1GaWxlSGFuZGxlOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERldmljZUZpbGVzKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJLRVlfREVWSUNFX0ZJTEVTX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaAppbmRleCA2ZjU4MTk1Li40Y2E4NTZkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKQEAgLTE3LDE1ICsxNywxNSBAQAogI2lmbmRlZiBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXwogI2RlZmluZSBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgogCiAjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwpAQCAtMzksNiArMzksMTAgQEAKICAgICBSZXR1cm48Ym9vbD4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQpCiAgICAgICAgICAgICBvdmVycmlkZTsKIAorICAgIFJldHVybjxib29sPiBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIoY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eUxldmVsIGxldmVsKSBvdmVycmlkZTsKKwogICAgIFJldHVybjxib29sPiBpc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSkKICAgICAgICAgICAgIG92ZXJyaWRlOwogCkBAIC01Miw3ICs1Niw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCmluZGV4IGZiMDY5NWEuLmJhNWZhNjUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKQEAgLTE3LDMyICsxNyw0MiBAQAogI2lmbmRlZiBDTEVBUktFWV9EUk1fUExVR0lOX0hfCiAjZGVmaW5lIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbkxpc3RlbmVyLmg+CiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdGRpby5oPgogCisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorCisjaW5jbHVkZSAiRGV2aWNlRmlsZXMuaCIKICNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5VmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNlY3VyZVN0b3A7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNlY3VyZVN0b3BJZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2Vzc2lvbklkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtUGx1Z2luOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OkV2ZW50VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwordXNpbmcgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKK3VzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwordXNpbmcgZHJtOjpWMV8wOjpTZXNzaW9uSWQ7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6OklEcm1QbHVnaW47Cit1c2luZyBkcm06OlYxXzI6OktleVNldElkOwordXNpbmcgZHJtOjpWMV8yOjpPZmZsaW5lTGljZW5zZVN0YXRlOwogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwpAQCAtNTAsMTAgKzYwLDE1IEBACiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAordHlwZWRlZiBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIEtleVJlcXVlc3RUeXBlX1YxXzE7Cit0eXBlZGVmIGRybTo6VjFfMjo6SURybVBsdWdpbkxpc3RlbmVyIElEcm1QbHVnaW5MaXN0ZW5lcl9WMV8yOwordHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8yOjpIZGNwTGV2ZWwgSGRjcExldmVsX1YxXzI7CisKIHN0cnVjdCBEcm1QbHVnaW4gOiBwdWJsaWMgSURybVBsdWdpbiB7CiAgICAgZXhwbGljaXQgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSk7CiAKLSAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7fQorICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHsgbUZpbGVIYW5kbGUuRGVsZXRlQWxsTGljZW5zZXMoKTsgfQogCiAgICAgUmV0dXJuPHZvaWQ+IG9wZW5TZXNzaW9uKG9wZW5TZXNzaW9uX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKICAgICBSZXR1cm48dm9pZD4gb3BlblNlc3Npb25fMV8xKFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKQEAgLTc3LDYgKzkyLDE0IEBACiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICBnZXRLZXlSZXF1ZXN0XzFfMV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CiAKKyAgICBSZXR1cm48dm9pZD4gZ2V0S2V5UmVxdWVzdF8xXzIoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCisgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIGdldEtleVJlcXVlc3RfMV8yX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKwogICAgIFJldHVybjx2b2lkPiBwcm92aWRlS2V5UmVzcG9uc2UoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3BvbnNlLApAQCAtOTEsMTMgKzExNCw3IEBACiAKICAgICBSZXR1cm48U3RhdHVzPiByZXN0b3JlS2V5cygKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGtleVNldElkKSB7Ci0KLSAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlTZXRJZC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGtleVNldElkKSBvdmVycmlkZTsKIAogICAgIFJldHVybjx2b2lkPiBxdWVyeUtleVN0YXR1cygKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKQEAgLTExNSw2ICsxMzIsMTggQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKKyAgICBSZXR1cm48dm9pZD4gZ2V0UHJvdmlzaW9uUmVxdWVzdF8xXzIoCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjZXJ0aWZpY2F0ZVR5cGUsCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjZXJ0aWZpY2F0ZUF1dGhvcml0eSwKKyAgICAgICAgZ2V0UHJvdmlzaW9uUmVxdWVzdF8xXzJfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgVU5VU0VEKGNlcnRpZmljYXRlVHlwZSk7CisgICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZUF1dGhvcml0eSk7CisKKyAgICAgICAgaGlkbF9zdHJpbmcgZGVmYXVsdFVybDsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCBoaWRsX3ZlYzx1aW50OF90PigpLCBkZWZhdWx0VXJsKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKICAgICBSZXR1cm48dm9pZD4gcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzcG9uc2UsCiAgICAgICAgIHByb3ZpZGVQcm92aXNpb25SZXNwb25zZV9jYiBfaGlkbF9jYikgewpAQCAtMTM0LDYgKzE2MywxMyBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAorICAgIFJldHVybjx2b2lkPiBnZXRIZGNwTGV2ZWxzXzFfMihnZXRIZGNwTGV2ZWxzXzFfMl9jYiBfaGlkbF9jYikgeworICAgICAgICBIZGNwTGV2ZWxfVjFfMiBjb25uZWN0ZWRMZXZlbCA9IEhkY3BMZXZlbF9WMV8yOjpIRENQX05PTkU7CisgICAgICAgIEhkY3BMZXZlbF9WMV8yIG1heExldmVsID0gSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9fT1VUUFVUOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6T0ssIGNvbm5lY3RlZExldmVsLCBtYXhMZXZlbCk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCiAgICAgUmV0dXJuPHZvaWQ+IGdldE51bWJlck9mU2Vzc2lvbnMoZ2V0TnVtYmVyT2ZTZXNzaW9uc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CiAKICAgICBSZXR1cm48dm9pZD4gZ2V0U2VjdXJpdHlMZXZlbChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLApAQCAtMTQxLDYgKzE3NywxMyBAQAogCiAgICAgUmV0dXJuPHZvaWQ+IGdldE1ldHJpY3MoZ2V0TWV0cmljc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CiAKKyAgICBSZXR1cm48dm9pZD4gZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPFN0YXR1cz4gcmVtb3ZlT2ZmbGluZUxpY2Vuc2UoY29uc3QgS2V5U2V0SWQgJmtleVNldElkKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGNvbnN0IEtleVNldElkICZrZXlTZXRJZCwKKyAgICAgICAgICAgIGdldE9mZmxpbmVMaWNlbnNlU3RhdGVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCiAgICAgUmV0dXJuPHZvaWQ+IGdldFByb3BlcnR5U3RyaW5nKAogICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKICAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwpAQCAtMjQ4LDEyICsyOTEsMTcgQEAKIAogICAgIFJldHVybjx2b2lkPiBzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtUGx1Z2luTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgbUxpc3RlbmVyVjFfMiA9IElEcm1QbHVnaW5MaXN0ZW5lcl9WMV8yOjpjYXN0RnJvbShsaXN0ZW5lcik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfTsKIAotICAgIFJldHVybjx2b2lkPiBzZW5kRXZlbnQoRXZlbnRUeXBlIGV2ZW50VHlwZSwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KAorICAgICAgICAgICAgRXZlbnRUeXBlIGV2ZW50VHlwZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lclYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxpc3RlbmVyVjFfMi0+c2VuZEV2ZW50KGV2ZW50VHlwZSwgc2Vzc2lvbklkLCBkYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbUxpc3RlbmVyLT5zZW5kRXZlbnQoZXZlbnRUeXBlLCBzZXNzaW9uSWQsIGRhdGEpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CkBAIC0yNjEsOCArMzA5LDEyIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCi0gICAgUmV0dXJuPHZvaWQ+IHNlbmRFeHBpcmF0aW9uVXBkYXRlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGludDY0X3QgZXhwaXJ5VGltZUluTVMpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgUmV0dXJuPHZvaWQ+IHNlbmRFeHBpcmF0aW9uVXBkYXRlKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lclYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxpc3RlbmVyVjFfMi0+c2VuZEV4cGlyYXRpb25VcGRhdGUoc2Vzc2lvbklkLCBleHBpcnlUaW1lSW5NUyk7CisgICAgICAgIH0gZWxzZSBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1MaXN0ZW5lci0+c2VuZEV4cGlyYXRpb25VcGRhdGUoc2Vzc2lvbklkLCBleHBpcnlUaW1lSW5NUyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiTnVsbCBldmVudCBsaXN0ZW5lciwgZXZlbnQgbm90IHNlbnQiKTsKQEAgLTI3MCw5ICszMjIsMTIgQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKLSAgICBSZXR1cm48dm9pZD4gc2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICBSZXR1cm48dm9pZD4gc2VuZEtleXNDaGFuZ2UoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzPiYga2V5U3RhdHVzTGlzdCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJWMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lclYxXzItPnNlbmRLZXlzQ2hhbmdlKHNlc3Npb25JZCwga2V5U3RhdHVzTGlzdCwgaGFzTmV3VXNhYmxlS2V5KTsKKyAgICAgICAgfSBlbHNlIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbUxpc3RlbmVyLT5zZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3QsIGhhc05ld1VzYWJsZUtleSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiTnVsbCBldmVudCBsaXN0ZW5lciwgZXZlbnQgbm90IHNlbnQiKTsKQEAgLTI4MCw2ICszMzUsMTQgQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKKyAgICBSZXR1cm48dm9pZD4gc2VuZFNlc3Npb25Mb3N0U3RhdGUoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJWMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lclYxXzItPnNlbmRTZXNzaW9uTG9zdFN0YXRlKHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKICAgICBSZXR1cm48dm9pZD4gZ2V0U2VjdXJlU3RvcHMoZ2V0U2VjdXJlU3RvcHNfY2IgX2hpZGxfY2IpOwogCiAgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyZVN0b3AoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlY3VyZVN0b3BJZCwKQEAgLTMwMCwxOCArMzYzLDE5IEBACiBwcml2YXRlOgogICAgIHZvaWQgaW5pdFByb3BlcnRpZXMoKTsKICAgICB2b2lkIGluc3RhbGxTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworICAgIGJvb2wgbWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCk7CiAgICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7CiAKICAgICBSZXR1cm48U3RhdHVzPiBzZXRTZWN1cml0eUxldmVsKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCiAgICAgICAgICAgICBTZWN1cml0eUxldmVsIGxldmVsKTsKIAotICAgIFN0YXR1cyBnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICBTdGF0dXNfVjFfMiBnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKICAgICAgICAgICAgIEtleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnJlcXVlc3QsCi0gICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZSAqZ2V0S2V5UmVxdWVzdFR5cGUsCisgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xICpnZXRLZXlSZXF1ZXN0VHlwZSwKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpkZWZhdWx0VXJsKTsKIAogICAgIHN0cnVjdCBDbGVhcmtleVNlY3VyZVN0b3AgewpAQCAtMzIzLDE5ICszODcsMzEgQEAKICAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gbVBsYXlQb2xpY3k7CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtU3RyaW5nUHJvcGVydGllczsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4gPiBtQnl0ZUFycmF5UHJvcGVydGllczsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4gPiBtUmVsZWFzZUtleXNNYXA7CiAgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+IG1TZWN1cml0eUxldmVsOwogICAgIHNwPElEcm1QbHVnaW5MaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHNwPElEcm1QbHVnaW5MaXN0ZW5lcl9WMV8yPiBtTGlzdGVuZXJWMV8yOwogICAgIFNlc3Npb25MaWJyYXJ5ICptU2Vzc2lvbkxpYnJhcnk7CiAgICAgaW50NjRfdCBtT3BlblNlc3Npb25Pa0NvdW50OwogICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk9rQ291bnQ7CiAgICAgaW50NjRfdCBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQ7CiAgICAgdWludDMyX3QgbU5leHRTZWN1cmVTdG9wSWQ7CiAKKyAgICAvLyBzZXQgYnkgcHJvcGVydHkgdG8gbW9jayBlcnJvciBzY2VuYXJpb3MKKyAgICBTdGF0dXNfVjFfMiBtTW9ja0Vycm9yOworCisgICAgdm9pZCBwcm9jZXNzTW9ja0Vycm9yKGNvbnN0IHNwPFNlc3Npb24+ICZzZXNzaW9uKSB7CisgICAgICAgIHNlc3Npb24tPnNldE1vY2tFcnJvcihtTW9ja0Vycm9yKTsKKyAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpPSzsKKyAgICB9CisKKyAgICBEZXZpY2VGaWxlcyBtRmlsZUhhbmRsZTsKKwogICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl9BTkRfTkVXKERybVBsdWdpbik7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaAppbmRleCAzMTg5YzRhLi44ODlmNTExIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7CkBAIC0zNCw3ICszNCw4IEBACiAgICAgSW5pdERhdGFQYXJzZXIoKSB7fQogCiAgICAgU3RhdHVzIHBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KTsKIAogcHJpdmF0ZToKQEAgLTQzLDEyICs0NCwxMiBAQAogICAgIFN0YXR1cyBwYXJzZVBzc2goY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpOwogCi0gICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVSZXF1ZXN0KAorICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlUmVxdWVzdChWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcyk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKaW5kZXggNGFiMDM0Yy4uZTU3NDcwYyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oCkBAIC0yMyw3ICsyMyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBjbGFzcyBKc29uV2ViS2V5IHsKQEAgLTU0LDcgKzU0LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvTWVtb3J5RmlsZVN5c3RlbS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q5ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaApAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKy8vCisjaWZuZGVmIENMRUFSS0VZX01FTU9SWV9GSUxFX1NZU1RFTV9IXworI2RlZmluZSBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKKy8vIFVzaW5nIGFuZHJvaWQgZmlsZSBzeXN0ZW0gcmVxdWlyZXMgY2xlYXJrZXkgcGx1Z2luIHRvIHVwZGF0ZQorLy8gaXRzIHNlcG9saWN5LiBIb3dldmVyLCB3ZSBhcmUgdW5hYmxlIHRvIHVwZGF0ZSBzZXBvbGljeSBmb3IKKy8vIG9sZGVyIHZlbmRvciBwYXJ0aXRpb25zLiBUbyBwcm92aWRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksCisvLyBjbGVhcmtleSBwbHVnaW4gaW1wbGVtZW50cyBhIHZlcnkgc2ltcGxlIGZpbGUgc3lzdGVtIGluIG1lbW9yeS4KKy8vIFRoaXMgbWVtb3J5IGZpbGUgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZGlyZWN0b3J5IHN0cnVjdHVyZS4KK2NsYXNzIE1lbW9yeUZpbGVTeXN0ZW0geworIHB1YmxpYzoKKyAgICBzdHJ1Y3QgTWVtb3J5RmlsZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVOYW1lOyAgLy8gZXhjbHVkZXMgcGF0aAorICAgICAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgICAgICBzaXplX3QgZmlsZVNpemU7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0Q29udGVudCgpIGNvbnN0IHsgcmV0dXJuIGNvbnRlbnQ7IH0KKyAgICAgICAgc2l6ZV90IGdldEZpbGVTaXplKCkgY29uc3QgeyByZXR1cm4gZmlsZVNpemU7IH0KKyAgICAgICAgdm9pZCBzZXRDb250ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlKSB7IGNvbnRlbnQgPSBmaWxlOyB9CisgICAgICAgIHZvaWQgc2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsgZmlsZU5hbWUgPSBuYW1lOyB9CisgICAgICAgIHZvaWQgc2V0RmlsZVNpemUoc2l6ZV90IHNpemUpIHsKKyAgICAgICAgICAgIGNvbnRlbnQucmVzaXplKHNpemUpOyBmaWxlU2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgTWVtb3J5RmlsZVN5c3RlbSgpIHt9OworICAgIHZpcnR1YWwgfk1lbW9yeUZpbGVTeXN0ZW0oKSB7fTsKKworICAgIGJvb2wgRmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIHNzaXplX3QgR2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTGlzdEZpbGVzKCkgY29uc3Q7CisgICAgc2l6ZV90IFJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhOYW1lLCBzdGQ6OnN0cmluZyogYnVmZmVyKTsKKyAgICBib29sIFJlbW92ZUFsbEZpbGVzKCk7CisgICAgYm9vbCBSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSk7CisgICAgc2l6ZV90IFdyaXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoTmFtZSwgY29uc3QgTWVtb3J5RmlsZSYgbWVtb3J5RmlsZSk7CisKKyBwcml2YXRlOgorICAgIC8vIExpY2Vuc2UgZmlsZSBuYW1lIGlzIG1hZGUgdXAgb2YgYSB1bmlxdWUga2V5U2V0SWQsIHRoZXJlZm9yZSwKKyAgICAvLyB0aGUgZmlsZW5hbWUgY2FuIGJlIHVzZWQgYXMgdGhlIGtleSB0byBsb2NhdGUgbGljZW5zZXMgaW4gdGhlCisgICAgLy8gbWVtb3J5IGZpbGUgc3lzdGVtLgorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBNZW1vcnlGaWxlPiBtTWVtb3J5RmlsZVN5c3RlbTsKKworICAgIHN0ZDo6c3RyaW5nIEdldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZW1vcnlGaWxlU3lzdGVtKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaAppbmRleCBjZGRmY2E1Li5hMTU5ZTVhIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKQEAgLTI3LDQzICsyNyw1MyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOworCit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwogCiBjbGFzcyBTZXNzaW9uIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNlc3Npb24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKLSAgICAgICAgICAgIDogbVNlc3Npb25JZChzZXNzaW9uSWQpIHt9CisgICAgICAgIDogbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtTW9ja0Vycm9yKFN0YXR1c19WMV8yOjpPSykge30KICAgICB2aXJ0dWFsIH5TZXNzaW9uKCkge30KIAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9CiAKICAgICBTdGF0dXMgZ2V0S2V5UmVxdWVzdCgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBtaW1lVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0OwogCiAgICAgU3RhdHVzIHByb3ZpZGVLZXlSZXNwb25zZSgKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSk7CiAKLSAgICBTdGF0dXMgZGVjcnlwdCgKKyAgICBTdGF0dXNfVjFfMiBkZWNyeXB0KAogICAgICAgICAgICAgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB1aW50OF90KiBzcmNQdHIsCiAgICAgICAgICAgICB1aW50OF90KiBkc3RQdHIsIGNvbnN0IHN0ZDo6dmVjdG9yPFN1YlNhbXBsZT4gc3ViU2FtcGxlcywKICAgICAgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpOwogCisgICAgdm9pZCBzZXRNb2NrRXJyb3IoU3RhdHVzX1YxXzIgZXJyb3IpIHttTW9ja0Vycm9yID0gZXJyb3I7fQorICAgIFN0YXR1c19WMV8yIGdldE1vY2tFcnJvcigpIGNvbnN0IHtyZXR1cm4gbU1vY2tFcnJvcjt9CisKIHByaXZhdGU6CiAgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlc3Npb24pOwogCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKICAgICBLZXlNYXAgbUtleU1hcDsKICAgICBNdXRleCBtTWFwTG9jazsKKworICAgIC8vIEZvciBtb2NraW5nIGVycm9yIHJldHVybiBzY2VuYXJpb3MKKyAgICBTdGF0dXNfVjFfMiBtTW9ja0Vycm9yOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKaW5kZXggMzI2YTBjMS4uMWU1NjdiOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKQEAgLTI2LDcgKzI2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CkBAIC01OCw3ICs1OCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaAppbmRleCBjYzA2MzI5Li5iMGY4NjA3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKQEAgLTY4LDggKzY4LDE5IEBACiAgICAgcmV0dXJuIHZlYzsKIH0KIAoraW5saW5lIFN0YXR1cyB0b1N0YXR1c18xXzAoU3RhdHVzX1YxXzIgc3RhdHVzKSB7CisgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWToKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU6CisgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4oc3RhdHVzKTsKKyAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8gYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTExZjBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KQEAgLTAsMCArMSw0NyBAQAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGV2aWNlX2ZpbGVzLnByb3RvCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vICAgRm9ybWF0IG9mIHZhcmlvdXMgZmlsZXMgc3RvcmVkIGF0IHRoZSBkZXZpY2UuCisvLworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5kcm0uVjFfMi5jbGVhcmtleTsKKworLy8gbmVlZCB0aGlzIGlmIHdlIGFyZSB1c2luZyBsaWJwcm90b2J1Zi1jcHAtMi4zLjAtbGl0ZQorb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworbWVzc2FnZSBMaWNlbnNlIHsKKyAgZW51bSBMaWNlbnNlU3RhdGUgeworICAgIEFDVElWRSA9IDE7CisgICAgUkVMRUFTSU5HID0gMjsKKyAgfQorCisgIG9wdGlvbmFsIExpY2Vuc2VTdGF0ZSBzdGF0ZSA9IDE7CisgIG9wdGlvbmFsIGJ5dGVzIGxpY2Vuc2UgPSAyOworfQorCittZXNzYWdlIE9mZmxpbmVGaWxlIHsKKyAgZW51bSBGaWxlVHlwZSB7CisgICAgTElDRU5TRSA9IDE7CisgIH0KKworICBlbnVtIEZpbGVWZXJzaW9uIHsKKyAgICBWRVJTSU9OXzEgPSAxOworICB9CisKKyAgb3B0aW9uYWwgRmlsZVR5cGUgdHlwZSA9IDE7CisgIG9wdGlvbmFsIEZpbGVWZXJzaW9uIHZlcnNpb24gPSAyIFtkZWZhdWx0ID0gVkVSU0lPTl8xXTsKKyAgb3B0aW9uYWwgTGljZW5zZSBsaWNlbnNlID0gMzsKKworfQorCittZXNzYWdlIEhhc2hlZEZpbGUgeworICBvcHRpb25hbCBieXRlcyBmaWxlID0gMTsKKyAgLy8gQSByYXcgKG5vdCBoZXgtZW5jb2RlZCkgU0hBMjU2LCB0YWtlbiBvdmVyIHRoZSBieXRlcyBvZiAnZmlsZScuCisgIG9wdGlvbmFsIGJ5dGVzIGhhc2ggPSAyOworfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAKaW5kZXggNmE5N2I3Mi4uYjM5ZWEwMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCkBAIC0xMywzMiArMTMsMjQgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0jZGVmaW5lIExPR19UQUcgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IgotCiAjaW5jbHVkZSA8Q3J5cHRvRmFjdG9yeS5oPgogI2luY2x1ZGUgPERybUZhY3RvcnkuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbExhenlVdGlscy5oPgogI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7Ci0KK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SURybUZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwogCiBpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKLSAgICBBTE9HRCgiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkgc3RhcnRpbmcuLi4iKTsKLQotICAgIC8vIFRoZSBEUk0gSEFMIG1heSBjb21tdW5pY2F0ZSB0byBvdGhlciB2ZW5kb3IgY29tcG9uZW50cyB2aWEKLSAgICAvLyAvZGV2L3ZuZGJpbmRlcgotICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6aW5pdFdpdGhEcml2ZXIoIi9kZXYvdm5kYmluZGVyIik7Ci0KICAgICBzcDxJRHJtRmFjdG9yeT4gZHJtRmFjdG9yeSA9IG5ldyBEcm1GYWN0b3J5OwogICAgIHNwPElDcnlwdG9GYWN0b3J5PiBjcnlwdG9GYWN0b3J5ID0gbmV3IENyeXB0b0ZhY3Rvcnk7CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZUxhenkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlTGF6eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmZDg4MwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZUxhenkuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Q3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPERybUZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbExhenlVdGlscy5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6TGF6eVNlcnZpY2VSZWdpc3RyYXI7CisKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgeworICAgIHNwPElEcm1GYWN0b3J5PiBkcm1GYWN0b3J5ID0gbmV3IERybUZhY3Rvcnk7CisgICAgc3A8SUNyeXB0b0ZhY3Rvcnk+IGNyeXB0b0ZhY3RvcnkgPSBuZXcgQ3J5cHRvRmFjdG9yeTsKKworICAgIGNvbmZpZ3VyZVJwY1RocmVhZHBvb2woOCwgdHJ1ZSAvKiBjYWxsZXJXaWxsSm9pbiAqLyk7CisKKyAgICAvLyBTZXR1cCBod2JpbmRlciBzZXJ2aWNlCisgICAgTGF6eVNlcnZpY2VSZWdpc3RyYXIgc2VydmljZVJlZ2lzdHJhcjsKKworICAgIC8vIFNldHVwIGh3YmluZGVyIHNlcnZpY2UKKyAgICBDSEVDS19FUShzZXJ2aWNlUmVnaXN0cmFyLnJlZ2lzdGVyU2VydmljZShkcm1GYWN0b3J5LCAiY2xlYXJrZXkiKSwgYW5kcm9pZDo6Tk9fRVJST1IpCisgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgQ2xlYXJrZXkgRmFjdG9yeSBIQUwiOworICAgIENIRUNLX0VRKHNlcnZpY2VSZWdpc3RyYXIucmVnaXN0ZXJTZXJ2aWNlKGNyeXB0b0ZhY3RvcnksICJjbGVhcmtleSIpLCBhbmRyb2lkOjpOT19FUlJPUikKKyAgICAgICAgPDwgIkZhaWxlZCB0byByZWdpc3RlciBDbGVhcmtleSBDcnlwdG8gIEhBTCI7CisKKyAgICBqb2luUnBjVGhyZWFkcG9vbCgpOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjdiYTQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWU3Yzk5YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA1NTg2NTdlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTFhOTkyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwotI2RlZmluZSBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIG1hc3RlcmluZ19pbmRpY2F0aW9uIHsKLSAgICBNQVNURVJJTkdfTk9UX0lORElDQVRFRCwKLSAgICBNQVNURVJFRF9GT1JfU1RFUkVPLAotICAgIE1BU1RFUkVEX0ZPUl9TVVJST1VORCwKLSAgICBNQVNURVJFRF9GT1JfM0QsCi0gICAgTUFTVEVSRURfRk9SX0hFQURQSE9ORSwKLX07Ci0KLXN0cnVjdCBBdWRpb1ByZXNlbnRhdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBpbnQzMl90IG1QcmVzZW50YXRpb25JZDsKLSAgICBpbnQzMl90IG1Qcm9ncmFtSWQ7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhYmVsczsKLSAgICBTdHJpbmc4IG1MYW5ndWFnZTsKLSAgICBpbnQzMl90IG1NYXN0ZXJpbmdJbmRpY2F0aW9uOwotICAgIGJvb2wgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGU7Ci0gICAgYm9vbCBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlOwotICAgIGJvb2wgbURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGU7Ci0KLSAgICBBdWRpb1ByZXNlbnRhdGlvbigpIHsKLSAgICAgICAgbVByZXNlbnRhdGlvbklkID0gLTE7Ci0gICAgICAgIG1Qcm9ncmFtSWQgPSAtMTsKLSAgICAgICAgbUxhbmd1YWdlID0gIiI7Ci0gICAgICAgIG1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSSU5HX05PVF9JTkRJQ0FURUQ7Ci0gICAgICAgIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgICAgIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgbURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUgPSBmYWxzZTsKLSAgICB9Ci19OwotCi10eXBlZGVmIFZlY3RvcjxzcDxBdWRpb1ByZXNlbnRhdGlvbj4+IEF1ZGlvUHJlc2VudGF0aW9uczsKLQotY2xhc3MgQXVkaW9QcmVzZW50YXRpb25JbmZvIDogcHVibGljIFJlZkJhc2UgewotIHB1YmxpYzoKLSAgICBBdWRpb1ByZXNlbnRhdGlvbkluZm8oKTsKLQotICAgIH5BdWRpb1ByZXNlbnRhdGlvbkluZm8oKTsKLQotICAgIHZvaWQgYWRkUHJlc2VudGF0aW9uKHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBwcmVzZW50YXRpb24pOwotCi0gICAgc2l6ZV90IGNvdW50UHJlc2VudGF0aW9ucygpIGNvbnN0OwotCi0gICAgY29uc3Qgc3A8QXVkaW9QcmVzZW50YXRpb24+IGdldFByZXNlbnRhdGlvbihzaXplX3QgaW5kZXgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgICBBdWRpb1ByZXNlbnRhdGlvbnMgbVByZXNlbnRhdGlvbnM7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNmJmYWYxMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmQ2ZjFjOTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKaW5kZXggOTA1YmVjMS4uMTk4YjI3ZSAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCmluZGV4IDU0YzgwNDcuLmQyYWIyZjEgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0V2ZW50TG9nLmggYi9pbmNsdWRlL21lZGlhL0V2ZW50TG9nLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOWIyYzRiZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaCBiL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggZTJkZDA4Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmggYi9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmggYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDRiMzVmZTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjQ3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmgKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fQVBJX0hfCisjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fQVBJX0hfCisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4gLy8gZm9yIHN0YXR1c190CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorc3RydWN0IEFNZWRpYUZvcm1hdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFUcmFjazsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKKworZXh0ZXJuICJDIiB7CisKK3N0cnVjdCBDRGF0YVNvdXJjZSB7CisgICAgc3NpemVfdCAoKnJlYWRBdCkodm9pZCAqaGFuZGxlLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190ICgqZ2V0U2l6ZSkodm9pZCAqaGFuZGxlLCBvZmY2NF90ICpzaXplKTsKKyAgICB1aW50MzJfdCAoKmZsYWdzKSh2b2lkICpoYW5kbGUgKTsKKyAgICBib29sICgqZ2V0VXJpKSh2b2lkICpoYW5kbGUsIGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpOworICAgIHZvaWQgKmhhbmRsZTsKK307CisKK2VudW0gQ01lZGlhVHJhY2tSZWFkT3B0aW9ucyA6IHVpbnQzMl90IHsKKyAgICBTRUVLX1BSRVZJT1VTX1NZTkMgPSAwLAorICAgIFNFRUtfTkVYVF9TWU5DID0gMSwKKyAgICBTRUVLX0NMT1NFU1RfU1lOQyA9IDIsCisgICAgU0VFS19DTE9TRVNUID0gMywKKyAgICBTRUVLX0ZSQU1FX0lOREVYID0gNCwKKyAgICBTRUVLID0gOCwKKyAgICBOT05CTE9DS0lORyA9IDE2Cit9OworCisvKioKKyAqIG9ubHkgdXNlIENNZWRpYUJ1ZmZlciBhbGxvY2F0ZWQgZnJvbSB0aGUgQ01lZGlhQnVmZmVyR3JvdXAgdGhhdCBpcworICogcHJvdmlkZWQgdG8gQ01lZGlhVHJhY2s6OnN0YXJ0KCkKKyAqLworc3RydWN0IENNZWRpYUJ1ZmZlciB7CisgICAgdm9pZCAqaGFuZGxlOworICAgIHZvaWQgKCpyZWxlYXNlKSh2b2lkICpoYW5kbGUpOworICAgIHZvaWQqICgqZGF0YSkodm9pZCAqaGFuZGxlKTsKKyAgICBzaXplX3QgKCpzaXplKSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnJhbmdlX29mZnNldCkodm9pZCAqaGFuZGxlKTsKKyAgICBzaXplX3QgKCpyYW5nZV9sZW5ndGgpKHZvaWQgKmhhbmRsZSk7CisgICAgdm9pZCAoKnNldF9yYW5nZSkodm9pZCAqaGFuZGxlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKTsKKyAgICBBTWVkaWFGb3JtYXQqICgqbWV0YV9kYXRhKSh2b2lkICpoYW5kbGUpOworfTsKKworc3RydWN0IENNZWRpYUJ1ZmZlckdyb3VwIHsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgYm9vbCAoKmluaXQpKHZvaWQgKmhhbmRsZSwgc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KTsKKyAgICB2b2lkICgqYWRkX2J1ZmZlcikodm9pZCAqaGFuZGxlLCBzaXplX3Qgc2l6ZSk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCphY3F1aXJlX2J1ZmZlcikodm9pZCAqaGFuZGxlLAorICAgICAgICAgICAgQ01lZGlhQnVmZmVyICoqYnVmZmVyLCBib29sIG5vbkJsb2NraW5nLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSk7CisgICAgYm9vbCAoKmhhc19idWZmZXJzKSh2b2lkICpoYW5kbGUpOworfTsKKworc3RydWN0IENNZWRpYVRyYWNrIHsKKyAgICB2b2lkICpkYXRhOworICAgIHZvaWQgKCpmcmVlKSh2b2lkICpkYXRhKTsKKworICAgIG1lZGlhX3N0YXR1c190ICgqc3RhcnQpKHZvaWQgKmRhdGEsIENNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cCk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpzdG9wKSh2b2lkICpkYXRhKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmdldEZvcm1hdCkodm9pZCAqZGF0YSwgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOworICAgIG1lZGlhX3N0YXR1c190ICgqcmVhZCkodm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyICoqYnVmZmVyLCB1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcyk7CisgICAgYm9vbCAgICAgKCpzdXBwb3J0c05vbkJsb2NraW5nUmVhZCkodm9pZCAqZGF0YSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhRXh0cmFjdG9yIHsKKyAgICB2b2lkICpkYXRhOworCisgICAgdm9pZCAoKmZyZWUpKHZvaWQgKmRhdGEpOworICAgIHNpemVfdCAoKmNvdW50VHJhY2tzKSh2b2lkICpkYXRhKTsKKyAgICBDTWVkaWFUcmFjayogKCpnZXRUcmFjaykodm9pZCAqZGF0YSwgc2l6ZV90IGluZGV4KTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmdldFRyYWNrTWV0YURhdGEpKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgbWVkaWFfc3RhdHVzX3QgKCpnZXRNZXRhRGF0YSkodm9pZCAqZGF0YSwgQU1lZGlhRm9ybWF0ICptZXRhKTsKKyAgICB1aW50MzJfdCAoKmZsYWdzKSh2b2lkICpkYXRhKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnNldE1lZGlhQ2FzKSh2b2lkICpkYXRhLCBjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpOworICAgIGNvbnN0IGNoYXIgKiAoKm5hbWUpKHZvaWQgKmRhdGEpOworfTsKKwordHlwZWRlZiBDTWVkaWFFeHRyYWN0b3IqICgqQ3JlYXRvckZ1bmMpKENEYXRhU291cmNlICpzb3VyY2UsIHZvaWQgKm1ldGEpOwordHlwZWRlZiB2b2lkICgqRnJlZU1ldGFGdW5jKSh2b2lkICptZXRhKTsKKworLy8gVGhlIHNuaWZmZXIgY2FuIG9wdGlvbmFsbHkgZmlsbCBpbiBhbiBvcGFxdWUgb2JqZWN0LCAibWV0YSIsIHRoYXQgaGVscHMKKy8vIHRoZSBjb3JyZXNwb25kaW5nIGV4dHJhY3RvciBpbml0aWFsaXplIGl0cyBzdGF0ZSB3aXRob3V0IGR1cGxpY2F0aW5nCisvLyBlZmZvcnQgYWxyZWFkeSBleGVydGVkIGJ5IHRoZSBzbmlmZmVyLiBJZiAiZnJlZU1ldGEiIGlzIGdpdmVuLCBpdCB3aWxsIGJlCisvLyBjYWxsZWQgYWdhaW5zdCB0aGUgb3BhcXVlIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VkLgordHlwZWRlZiBDcmVhdG9yRnVuYyAoKlNuaWZmZXJGdW5jKSgKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHZvaWQgKiptZXRhLCBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKTsKKwordHlwZWRlZiBDTWVkaWFFeHRyYWN0b3IgQ01lZGlhRXh0cmFjdG9yOwordHlwZWRlZiBDcmVhdG9yRnVuYyBDcmVhdG9yRnVuYzsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgdWludDhfdCBiWzE2XTsKK30gbWVkaWFfdXVpZF90OworCitzdHJ1Y3QgRXh0cmFjdG9yRGVmIHsKKyAgICAvLyB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0cnVjdHVyZQorICAgIGNvbnN0IHVpbnQzMl90IGRlZl92ZXJzaW9uOworCisgICAgLy8gQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRyYWN0b3IuCisgICAgLy8gU2VlIGJlbG93IGZvciBhIGNvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSB0aGlzIGZyb20gYSBzdHJpbmcuCisgICAgbWVkaWFfdXVpZF90IGV4dHJhY3Rvcl91dWlkOworCisgICAgLy8gVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBleHRyYWN0b3IuIFdoZW4gdHdvIGV4dHJhY3RvcnMgd2l0aCB0aGUgc2FtZQorICAgIC8vIHV1aWQgYXJlIGVuY291bnRlcmVkLCB0aGUgb25lIHdpdGggdGhlIGxhcmdlc3QgdmVyc2lvbiBudW1iZXIgd2lsbAorICAgIC8vIGJlIHVzZWQuCisgICAgY29uc3QgdWludDMyX3QgZXh0cmFjdG9yX3ZlcnNpb247CisKKyAgICAvLyBhIGh1bWFuIHJlYWRhYmxlIG5hbWUKKyAgICBjb25zdCBjaGFyICpleHRyYWN0b3JfbmFtZTsKKworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIFNuaWZmZXJGdW5jIHNuaWZmOworICAgICAgICB9IHYyOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgU25pZmZlckZ1bmMgc25pZmY7CisgICAgICAgICAgICAvLyBhIE5VTEwgdGVybWluYXRlZCBsaXN0IG9mIGNvbnRhaW5lciBtaW1lIHR5cGVzIGFuZC9vciBmaWxlIGV4dGVuc2lvbnMKKyAgICAgICAgICAgIC8vIHRoYXQgdGhpcyBleHRyYWN0b3Igc3VwcG9ydHMKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzdXBwb3J0ZWRfdHlwZXM7CisgICAgICAgIH0gdjM7CisgICAgfSB1OworfTsKKworLy8gdGhlIEMrKyBiYXNlZCBBUEkgd2hpY2ggZmlyc3Qgc2hpcHBlZCBpbiBQIGFuZCBpcyBubyBsb25nZXIgc3VwcG9ydGVkCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTl9MRUdBQ1kgPSAxOworCisvLyB0aGUgZmlyc3QgQy9OREsgYmFzZWQgQVBJCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEgPSAyOworCisvLyB0aGUgc2Vjb25kIEMvTkRLIGJhc2VkIEFQSQorY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyID0gMzsKKworY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT04gPSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjI7CisKKy8vIGVhY2ggcGx1Z2luIGxpYnJhcnkgZXhwb3J0cyBvbmUgZnVuY3Rpb24gb2YgdGhpcyB0eXBlCit0eXBlZGVmIEV4dHJhY3RvckRlZiAoKkdldEV4dHJhY3RvckRlZikoKTsKKworfSAvLyBleHRlcm4gIkMiCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODZmMTc3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oCkBAIC0wLDAgKzEsNDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0hFTFBFUl9IXworCisjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fSEVMUEVSX0hfCisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitzdHJ1Y3QgTWVkaWFUcmFjazsKKworCitjbGFzcyBNZWRpYVRyYWNrSGVscGVyOworCitjbGFzcyBNZWRpYUJ1ZmZlckhlbHBlciB7Citwcml2YXRlOgorICAgIGZyaWVuZCBDTWVkaWFUcmFjayAqd3JhcChNZWRpYVRyYWNrSGVscGVyICopOworICAgIENNZWRpYUJ1ZmZlciAqbUJ1ZmZlcjsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckhlbHBlcihDTWVkaWFCdWZmZXIgKmJ1ZikgeworICAgICAgICBtQnVmZmVyID0gYnVmOworICAgIH0KKworICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVySGVscGVyKCkge30KKworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkKiBkYXRhKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+ZGF0YShtQnVmZmVyLT5oYW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5zaXplKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSB7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZShtQnVmZmVyLT5oYW5kbGUsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisgICAgdmlydHVhbCBBTWVkaWFGb3JtYXQgKm1ldGFfZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPm1ldGFfZGF0YShtQnVmZmVyLT5oYW5kbGUpOworICAgIH0KK307CisKK2NsYXNzIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgeworcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOworICAgIHN0ZDo6bWFwPENNZWRpYUJ1ZmZlciosIE1lZGlhQnVmZmVySGVscGVyKj4gbUJ1ZmZlckhlbHBlcnM7CitwdWJsaWM6CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlcihDTWVkaWFCdWZmZXJHcm91cCAqZ3JvdXApIHsKKyAgICAgICAgbUdyb3VwID0gZ3JvdXA7CisgICAgfQorICAgIH5NZWRpYUJ1ZmZlckdyb3VwSGVscGVyKCkgeworICAgICAgICAvLyBkZWxldGUgYWxsIGVudHJpZXMgaW4gbWFwCisgICAgICAgIEFMT0dWKCJidWZmZXJncm91cCAlcCBtYXAgaGFzICV6dSBlbnRyaWVzIiwgdGhpcywgbUJ1ZmZlckhlbHBlcnMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlckhlbHBlcnMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlckhlbHBlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgaW5pdChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQgPSAwKSB7CisgICAgICAgIHJldHVybiBtR3JvdXAtPmluaXQobUdyb3VwLT5oYW5kbGUsIGJ1ZmZlcnMsIGJ1ZmZlcl9zaXplLCBncm93dGhMaW1pdCk7CisgICAgfQorICAgIHZvaWQgYWRkX2J1ZmZlcihzaXplX3Qgc2l6ZSkgeworICAgICAgICBtR3JvdXAtPmFkZF9idWZmZXIobUdyb3VwLT5oYW5kbGUsIHNpemUpOworICAgIH0KKyAgICBtZWRpYV9zdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBib29sIG5vbkJsb2NraW5nID0gZmFsc2UsIHNpemVfdCByZXF1ZXN0ZWRTaXplID0gMCkgeworICAgICAgICBDTWVkaWFCdWZmZXIgKmJ1ZiA9IG51bGxwdHI7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldCA9CisgICAgICAgICAgICAgICAgbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcihtR3JvdXAtPmhhbmRsZSwgJmJ1Ziwgbm9uQmxvY2tpbmcsIHJlcXVlc3RlZFNpemUpOworICAgICAgICBpZiAocmV0ID09IEFNRURJQV9PSyAmJiBidWYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYXV0byBoZWxwZXIgPSBtQnVmZmVySGVscGVycy5maW5kKGJ1Zik7CisgICAgICAgICAgICBpZiAoaGVscGVyID09IG1CdWZmZXJIZWxwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIqIG5ld0hlbHBlciA9IG5ldyBNZWRpYUJ1ZmZlckhlbHBlcihidWYpOworICAgICAgICAgICAgICAgIG1CdWZmZXJIZWxwZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihidWYsIG5ld0hlbHBlcikpOworICAgICAgICAgICAgICAgICpidWZmZXIgPSBuZXdIZWxwZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBoZWxwZXItPnNlY29uZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpidWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGJvb2wgaGFzX2J1ZmZlcnMoKSB7CisgICAgICAgIHJldHVybiBtR3JvdXAtPmhhc19idWZmZXJzKG1Hcm91cC0+aGFuZGxlKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYVRyYWNrSGVscGVyIHsKK3B1YmxpYzoKKyAgICBNZWRpYVRyYWNrSGVscGVyKCkgOiBtQnVmZmVyR3JvdXAobnVsbHB0cikgeworICAgIH0KKyAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrSGVscGVyKCkgeworICAgICAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOworICAgIH0KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCkgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKmZvcm1hdCkgPSAwOworCisgICAgY2xhc3MgUmVhZE9wdGlvbnMgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBTZWVrTW9kZSA6IGludDMyX3QgeworICAgICAgICAgICAgU0VFS19QUkVWSU9VU19TWU5DLAorICAgICAgICAgICAgU0VFS19ORVhUX1NZTkMsCisgICAgICAgICAgICBTRUVLX0NMT1NFU1RfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVCwKKyAgICAgICAgICAgIFNFRUtfRlJBTUVfSU5ERVgsCisgICAgICAgIH07CisKKyAgICAgICAgUmVhZE9wdGlvbnModWludDMyX3Qgb3B0aW9ucywgaW50NjRfdCBzZWVrUG9zVXMpIHsKKyAgICAgICAgICAgIG1PcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgICAgIG1TZWVrUG9zVXMgPSBzZWVrUG9zVXM7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmICgobU9wdGlvbnMgJiBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnRpbWVfdXMgPSBtU2Vla1Bvc1VzOworICAgICAgICAgICAgKm1vZGUgPSAoU2Vla01vZGUpIChtT3B0aW9ucyAmIDcpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtT3B0aW9ucyAmIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6Ok5PTkJMT0NLSU5HOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdWludDMyX3QgbU9wdGlvbnM7CisgICAgICAgIGludDY0X3QgbVNlZWtQb3NVczsKKyAgICB9OworCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIGZhbHNlOyB9Citwcm90ZWN0ZWQ6CisgICAgZnJpZW5kIENNZWRpYVRyYWNrICp3cmFwKE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrKTsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICptQnVmZmVyR3JvdXA7Cit9OworCitpbmxpbmUgQ01lZGlhVHJhY2sgKndyYXAoTWVkaWFUcmFja0hlbHBlciAqdHJhY2spIHsKKyAgICBpZiAodHJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgQ01lZGlhVHJhY2sgKndyYXBwZXIgPSAoQ01lZGlhVHJhY2sqKSBtYWxsb2Moc2l6ZW9mKENNZWRpYVRyYWNrKSk7CisgICAgd3JhcHBlci0+ZGF0YSA9IHRyYWNrOworICAgIHdyYXBwZXItPmZyZWUgPSBbXSh2b2lkICpkYXRhKSAtPiB2b2lkIHsKKyAgICAgICAgZGVsZXRlIChNZWRpYVRyYWNrSGVscGVyKikoZGF0YSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zdGFydCA9IFtdKHZvaWQgKmRhdGEsIENNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cCkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICBpZiAoKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+bUJ1ZmZlckdyb3VwKSB7CisgICAgICAgICAgICAvLyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBoYW5kbGUgaXQgYW55d2F5CisgICAgICAgICAgICBkZWxldGUgKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+bUJ1ZmZlckdyb3VwOworICAgICAgICB9CisgICAgICAgICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPm1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyKGJ1ZmZlckdyb3VwKTsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPnN0YXJ0KCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zdG9wID0gW10odm9pZCAqZGF0YSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+c3RvcCgpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0Rm9ybWF0ID0gW10odm9pZCAqZGF0YSwgQU1lZGlhRm9ybWF0ICptZXRhKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5nZXRGb3JtYXQobWV0YSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5yZWFkID0gW10odm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyICoqYnVmZmVyLCAgdWludDMyX3Qgb3B0aW9ucywgaW50NjRfdCBzZWVrUG9zVXMpCisgICAgICAgICAgICAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zIG9wdHMob3B0aW9ucywgc2Vla1Bvc1VzKTsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZiA9IE5VTEw7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldCA9ICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPnJlYWQoJmJ1ZiwgJm9wdHMpOworICAgICAgICBpZiAocmV0ID09IEFNRURJQV9PSyAmJiBidWYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKmJ1ZmZlciA9IGJ1Zi0+bUJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH07CisgICAgd3JhcHBlci0+c3VwcG9ydHNOb25CbG9ja2luZ1JlYWQgPSBbXSh2b2lkICpkYXRhKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+c3VwcG9ydHNOb25CbG9ja2luZ1JlYWQoKTsKKyAgICB9OworICAgIHJldHVybiB3cmFwcGVyOworfQorCisKKy8vIGV4dHJhY3RvciBwbHVnaW5zIGNhbiBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzIHdoaWNoIGxvb2tzIHJlbWFya2FibHkKKy8vIGxpa2UgTWVkaWFFeHRyYWN0b3IgYW5kIGNhbiBiZSBlYXNpbHkgd3JhcHBlZCBpbiB0aGUgcmVxdWlyZWQgQyBBUEkKK2NsYXNzIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIoKSB7fQorICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCkgPSAwOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KSA9IDA7CisKKyAgICBlbnVtIEdldFRyYWNrTWV0YURhdGFGbGFncyB7CisgICAgICAgIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEgPSAxCisgICAgfTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzID0gMCkgPSAwOworCisgICAgLy8gUmV0dXJuIGNvbnRhaW5lciBzcGVjaWZpYyBtZXRhLWRhdGEuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtZXRhZGF0YSBvYmplY3QuCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpID0gMDsKKworICAgIGVudW0gRmxhZ3MgeworICAgICAgICBDQU5fU0VFS19CQUNLV0FSRCAgPSAxLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBiYWNrIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1NFRUtfRk9SV0FSRCAgID0gMiwgIC8vIHRoZSAic2VlayAxMHNlY3MgZm9yd2FyZCBidXR0b24iCisgICAgICAgIENBTl9QQVVTRSAgICAgICAgICA9IDQsCisgICAgICAgIENBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgorICAgIH07CisKKyAgICAvLyBJZiBzdWJjbGFzc2VzIGRvIF9ub3RfIG92ZXJyaWRlIHRoaXMsIHRoZSBkZWZhdWx0IGlzCisgICAgLy8gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0UKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0U7CisgICAgfTsKKworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIjx1bnNwZWNpZmllZD4iOyB9CisKK3Byb3RlY3RlZDoKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcigpIHt9CisKK3ByaXZhdGU6CisgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIoY29uc3QgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgJik7CisgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAmKTsKK307CisKK2lubGluZSBDTWVkaWFFeHRyYWN0b3IgKndyYXAoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgKmV4dHJhY3RvcikgeworICAgIENNZWRpYUV4dHJhY3RvciAqd3JhcHBlciA9IChDTWVkaWFFeHRyYWN0b3IqKSBtYWxsb2Moc2l6ZW9mKENNZWRpYUV4dHJhY3RvcikpOworICAgIHdyYXBwZXItPmRhdGEgPSBleHRyYWN0b3I7CisgICAgd3JhcHBlci0+ZnJlZSA9IFtdKHZvaWQgKmRhdGEpIC0+IHZvaWQgeworICAgICAgICBkZWxldGUgKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKikoZGF0YSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5jb3VudFRyYWNrcyA9IFtdKHZvaWQgKmRhdGEpIC0+IHNpemVfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+Y291bnRUcmFja3MoKTsKKyAgICB9OworICAgIHdyYXBwZXItPmdldFRyYWNrID0gW10odm9pZCAqZGF0YSwgc2l6ZV90IGluZGV4KSAtPiBDTWVkaWFUcmFjayogeworICAgICAgICByZXR1cm4gd3JhcCgoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+Z2V0VHJhY2soaW5kZXgpKTsKKyAgICB9OworICAgIHdyYXBwZXItPmdldFRyYWNrTWV0YURhdGEgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+Z2V0VHJhY2tNZXRhRGF0YShtZXRhLCBpbmRleCwgZmxhZ3MpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0TWV0YURhdGEgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5nZXRNZXRhRGF0YShtZXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPmZsYWdzID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhKSAtPiB1aW50MzJfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+ZmxhZ3MoKTsKKyAgICB9OworICAgIHdyYXBwZXItPnNldE1lZGlhQ2FzID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhLCBjb25zdCB1aW50OF90ICpjYXNUb2tlbiwgc2l6ZV90IHNpemUpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5zZXRNZWRpYUNhcyhjYXNUb2tlbiwgc2l6ZSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5uYW1lID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhKSAtPiBjb25zdCBjaGFyICogeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPm5hbWUoKTsKKyAgICB9OworICAgIHJldHVybiB3cmFwcGVyOworfQorCisvKiBhZGRzIHNvbWUgY29udmllbmNlIG1ldGhvZHMgKi8KK2NsYXNzIERhdGFTb3VyY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VIZWxwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICAgICAgbVNvdXJjZSA9IGNzb3VyY2U7CisgICAgfQorCisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUhlbHBlcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIHsKKyAgICAgICAgbVNvdXJjZSA9IHNvdXJjZS0+bVNvdXJjZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5EYXRhU291cmNlSGVscGVyKCkge30KKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQobVNvdXJjZS0+aGFuZGxlLCBvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKG1Tb3VyY2UtPmhhbmRsZSwgc2l6ZSk7CisgICAgfQorCisgICAgYm9vbCBnZXRVcmkoY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0VXJpKG1Tb3VyY2UtPmhhbmRsZSwgdXJpU3RyaW5nLCBidWZmZXJTaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+ZmxhZ3MobVNvdXJjZS0+aGFuZGxlKTsKKyAgICB9CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgorICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDhfdCBieXRlWzJdOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgYnl0ZSwgMikgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSAoYnl0ZVswXSA8PCA4KSB8IGJ5dGVbMV07CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50CisgICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbM107CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAzKSAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDE2KSB8IChieXRlWzFdIDw8IDgpIHwgYnl0ZVsyXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGdldFVJbnQzMihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQzMl90IHRtcDsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDQpICE9IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gbnRvaGwodG1wKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQ2NF90IHRtcDsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDgpICE9IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gKCh1aW50NjRfdCludG9obCh0bXAgJiAweGZmZmZmZmZmKSA8PCAzMikgfCBudG9obCh0bXAgPj4gMzIpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIHJlYWQgZWl0aGVyIGludDxOPiBvciBpbnQ8Mk4+IGludG8gYSB1aW50PDJOPl90LCBzaXplIGlzIHRoZSBpbnQgc2l6ZSBpbiBieXRlcy4KKyAgICBib29sIGdldFVJbnQxNlZhcihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVSW50MTYob2Zmc2V0LCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICB1aW50OF90IHRtcDsKKyAgICAgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCAxKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQzMihvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRtcDsKKyAgICAgICAgICAgIGlmIChnZXRVSW50MTYob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGlmIChzaXplID09IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVSW50NjQob2Zmc2V0LCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgICAgICBpZiAoZ2V0VUludDMyKG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQ0RhdGFTb3VyY2UgKm1Tb3VyY2U7Cit9OworCisKKworLy8gaGVscGVycyB0byBjcmVhdGUgYSBtZWRpYV91dWlkX3QgZnJvbSBhIHN0cmluZyBsaXRlcmFsCisKKy8vIHB1cnBvc2VseSBub3QgZGVmaW5lZCBhbnl3aGVyZSBzbyB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIGxpbmsgaWYKKy8vIGV4cHJlc3Npb25zIGJlbG93IGFyZSBub3QgZXZhbHVhdGVkIGF0IGNvbXBpbGUgdGltZQoraW50IGludmFsaWRfdXVpZF9zdHJpbmcoY29uc3QgY2hhciAqKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY29uc3RleHByIHVpbnQ4X3QgX2RpZ2l0QXRfKGNvbnN0IFQgKCZzKVtOXSwgY29uc3Qgc2l6ZV90IG4pIHsKKyAgICByZXR1cm4gc1tuXSA+PSAnMCcgJiYgc1tuXSA8PSAnOScgPyBzW25dIC0gJzAnCisgICAgICAgICAgICA6IHNbbl0gPj0gJ2EnICYmIHNbbl0gPD0gJ2YnID8gc1tuXSAtICdhJyArIDEwCisgICAgICAgICAgICAgICAgICAgIDogc1tuXSA+PSAnQScgJiYgc1tuXSA8PSAnRicgPyBzW25dIC0gJ0EnICsgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludmFsaWRfdXVpZF9zdHJpbmcoInV1aWQ6IGJhZCBkaWdpdHMiKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY29uc3RleHByIHVpbnQ4X3QgX2hleEJ5dGVBdF8oY29uc3QgVCAoJnMpW05dLCBzaXplX3QgbikgeworICAgIHJldHVybiAoX2RpZ2l0QXRfKHMsIG4pIDw8IDQpICsgX2RpZ2l0QXRfKHMsIG4gKyAxKTsKK30KKworY29uc3RleHByIGJvb2wgX2Fzc2VydElzRGFzaF8oY2hhciBjKSB7CisgICAgcmV0dXJuIGMgPT0gJy0nID8gdHJ1ZSA6IGludmFsaWRfdXVpZF9zdHJpbmcoIldyb25nIGZvcm1hdCIpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IE4+Citjb25zdGV4cHIgbWVkaWFfdXVpZF90IGNvbnN0VVVJRChjb25zdCBjaGFyICgmcykgW05dKSB7CisgICAgc3RhdGljX2Fzc2VydChOID09IDM3LCAidXVpZDogd3JvbmcgbGVuZ3RoIik7CisgICAgcmV0dXJuCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzhdKSwKKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMTNdKSwKKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMThdKSwKKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMjNdKSwKKyAgICAgICAgICAgIG1lZGlhX3V1aWRfdCB7eworICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDApLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDQpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDkpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDExKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE5KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyMSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjQpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI2KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyOCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzApLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDMyKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzNCksCisgICAgICAgICAgICB9fTsKK30KKy8vIENvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSBhIG1lZGlhX3V1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwsIHdoaWNoIHNob3VsZAorLy8gYmUgZm9ybWF0dGVkIGFzICIxMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODlhYmMiLCBhcyBnZW5lcmF0ZWQgYnkKKy8vIGUuZy4gaHR0cHM6Ly93d3cudXVpZGdlbmVyYXRvci5uZXQvIG9yIHRoZSAndXVpZGdlbicgbGludXggY29tbWFuZC4KKy8vIEhleCBkaWdpdHMgbWF5IGJlIHVwcGVyIG9yIGxvd2VyIGNhc2UuCisvLworLy8gVGhlIG1hY3JvIGNhbGwgaXMgb3RoZXJ3aXNlIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5CisvLyAoZS5nLiBVVUlEKCI3ZDYxMzg1OC01ODM3LTRhMzgtODRjNS0zMzJkMWNkZGVlMjciKSBpcyB0aGUgc2FtZSBhcworLy8gICAgICAge3sweDdkLCAweDYxLCAweDM4LCAweDU4LCAweDU4LCAweDM3LCAweDRhLCAweDM4LAorLy8gICAgICAgICAweDg0LCAweGM1LCAweDMzLCAweDJkLCAweDFjLCAweGRkLCAweGVlLCAweDI3fX0pCisKKyNkZWZpbmUgVVVJRChzdHIpIFtdeyBjb25zdGV4cHIgbWVkaWFfdXVpZF90IHV1aWQgPSBjb25zdFVVSUQoc3RyKTsgcmV0dXJuIHV1aWQ7IH0oKQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldHJpY3MuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41Zjc1N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldHJpY3MuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaAppbmRleCAyZTE0N2M0Li4zNGJmNjVkIDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA1YTYzMjg3YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmggYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNlYmEzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1NPVVJDRV9CQVNFX0hfCisKKyNkZWZpbmUgTUVESUFfU09VUkNFX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKK3N0cnVjdCBDTWVkaWFUcmFjazsKKworY2xhc3MgU291cmNlQmFzZUFsbG9jVHJhY2tlciB7CitwdWJsaWM6CisgICAgU291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgYWxsb2NhdGVkOiAlcCIsIHRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIH5Tb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgeworICAgICAgICBBTE9HRCgic291cmNlYmFzZSBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTWVkaWFUcmFjaworLy8gICAgOiBwdWJsaWMgU291cmNlQmFzZUFsbG9jVHJhY2tlcgoreworICAgIE1lZGlhVHJhY2soKTsKKworICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZHMgb24gdGhpcyBvYmplY3QsIGV4Y2VwdAorICAgIC8vIGdldEZvcm1hdCgpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvLyBBbnkgYmxvY2tpbmcgcmVhZCBjYWxsIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIHJlc3VsdCBvZiBOT19JTklULgorICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgYW55IG1ldGhvZHMgb3RoZXIgdGhhbiBzdGFydCBhZnRlciB0aGlzIGNhbGwKKyAgICAvLyByZXR1cm5zLiBBbnkgYnVmZmVycyB0aGUgb2JqZWN0IG1heSBiZSBob2xkaW5nIG9udG8gYXQgdGhlIHRpbWUgb2YKKyAgICAvLyB0aGUgc3RvcCgpIGNhbGwgYXJlIHJlbGVhc2VkLgorICAgIC8vIEFsc28sIGl0IGlzIGltcGVyYXRpdmUgdGhhdCBhbnkgYnVmZmVycyBvdXRwdXQgYnkgdGhpcyBvYmplY3QgYW5kCisgICAgLy8gaGVsZCBvbnRvIGJ5IGNhbGxlcnMgYmUgcmVsZWFzZWQgYmVmb3JlIGEgY2FsbCB0byBzdG9wKCkgISEhCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIG91dHB1dCBieSB0aGlzIG1lZGlhIHRyYWNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSA9IDA7CisKKyAgICAvLyBPcHRpb25zIHRoYXQgbW9kaWZ5IHJlYWQoKSBiZWhhdmlvdXIuIFRoZSBkZWZhdWx0IGlzIHRvCisgICAgLy8gYSkgbm90IHJlcXVlc3QgYSBzZWVrCisgICAgLy8gYikgbm90IGJlIGxhdGUsIGkuZS4gbGF0ZW5lc3NfdXMgPSAwCisgICAgc3RydWN0IFJlYWRPcHRpb25zIHsKKyAgICAgICAgZW51bSBTZWVrTW9kZSA6IGludDMyX3QgeworICAgICAgICAgICAgU0VFS19QUkVWSU9VU19TWU5DID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DLAorICAgICAgICAgICAgU0VFS19ORVhUX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMsCisgICAgICAgICAgICBTRUVLX0NMT1NFU1QgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QsCisgICAgICAgICAgICBTRUVLX0ZSQU1FX0lOREVYID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucygpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNldCBldmVyeXRoaW5nIGJhY2sgdG8gZGVmYXVsdHMuCisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBtT3B0aW9ucyA9IDA7CisgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IDA7CisgICAgICAgICAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DKTsKKyAgICAgICAgdm9pZCBjbGVhclNlZWtUbygpIHsKKyAgICAgICAgICAgIG1PcHRpb25zICY9IH5rU2Vla1RvX09wdGlvbjsKKyAgICAgICAgICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICAgICAgICAgIG1TZWVrTW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DOworICAgICAgICB9CisgICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdDsKKworICAgICAgICB2b2lkIHNldE5vbkJsb2NraW5nKCk7CisgICAgICAgIHZvaWQgY2xlYXJOb25CbG9ja2luZygpOworICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3Q7CisKKyAgICAgICAgLy8gVXNlZCB0byBjbGVhciBhbGwgbm9uLXBlcnNpc3RlbnQgb3B0aW9ucyBmb3IgbXVsdGlwbGUgYnVmZmVyIHJlYWRzLgorICAgICAgICB2b2lkIGNsZWFyTm9uUGVyc2lzdGVudCgpIHsKKyAgICAgICAgICAgIGNsZWFyU2Vla1RvKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGVudW0gT3B0aW9ucyB7CisgICAgICAgICAgICBrU2Vla1RvX09wdGlvbiAgICAgID0gMSwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKKyAgICAgICAgU2Vla01vZGUgbVNlZWtNb2RlOworICAgICAgICBib29sIG1Ob25CbG9ja2luZzsKKyAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAvLyBzZW50IHRocm91Z2ggQmluZGVyCisKKyAgICAvLyBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBvZiBkYXRhLiBDYWxsIGJsb2NrcyB1bnRpbCBhCisgICAgLy8gYnVmZmVyIGlzIGF2YWlsYWJsZSwgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgb2YgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCisgICAgLy8gaXMgcmVhY2hlZC4KKyAgICAvLyBFbmQgb2Ygc3RyZWFtIGlzIHNpZ25hbGxlZCBieSBhIHJlc3VsdCBvZiBFUlJPUl9FTkRfT0ZfU1RSRUFNLgorICAgIC8vIEEgcmVzdWx0IG9mIElORk9fRk9STUFUX0NIQU5HRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGZvcm1hdCBvZiB0aGlzCisgICAgLy8gTWVkaWFTb3VyY2UgaGFzIGNoYW5nZWQgbWlkLXN0cmVhbSwgdGhlIGNsaWVudCBjYW4gY29udGludWUgcmVhZGluZworICAgIC8vIGJ1dCBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGJ1ZmZlcnMgb2YgdGhlIG5ldyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgfHJlYWR8IHN1cHBvcnRzIG5vbmJsb2NraW5nIG9wdGlvbiwgb3RoZXJ3aXNlIGZhbHNlLgorICAgIC8vIHxyZWFkTXVsdGlwbGV8IGlmIHN1cHBvcnRlZCwgYWx3YXlzIGFsbG93cyB0aGUgbm9uYmxvY2tpbmcgb3B0aW9uLgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCB+TWVkaWFUcmFjaygpOworCitwcml2YXRlOgorICAgIE1lZGlhVHJhY2soY29uc3QgTWVkaWFUcmFjayAmKTsKKyAgICBNZWRpYVRyYWNrICZvcGVyYXRvcj0oY29uc3QgTWVkaWFUcmFjayAmKTsKK307CisKK2NsYXNzIE1lZGlhVHJhY2tDVW53cmFwcGVyIDogcHVibGljIE1lZGlhVHJhY2sgeworcHVibGljOgorICAgIHN0YXRpYyBNZWRpYVRyYWNrQ1Vud3JhcHBlciAqY3JlYXRlKENNZWRpYVRyYWNrICp3cmFwcGVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrQ1Vud3JhcHBlcigpOworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IE1lZGlhVHJhY2tDVW53cmFwcGVyKENNZWRpYVRyYWNrICp3cmFwcGVyKTsKKyAgICBDTWVkaWFUcmFjayAqd3JhcHBlcjsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfU09VUkNFX0JBU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaCBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmJiYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRVJST1JfUFJJVl9ICisjZGVmaW5lIF9OREtfTUVESUFfRVJST1JfUFJJVl9ICisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK21lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihhbmRyb2lkOjpzdGF0dXNfdCk7CisKK2FuZHJvaWQ6OnN0YXR1c190IHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190KTsKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRVJST1JfUFJJVl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oIGIvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmRhNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IEFNZWRpYUZvcm1hdCB7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QU1lc3NhZ2U+IG1Gb3JtYXQ7CisgICAgYW5kcm9pZDo6U3RyaW5nOCBtRGVidWc7CisgICAgYW5kcm9pZDo6S2V5ZWRWZWN0b3I8YW5kcm9pZDo6U3RyaW5nOCwgYW5kcm9pZDo6U3RyaW5nOD4gbVN0cmluZ0NhY2hlOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2coc3A8QU1lc3NhZ2U+ICopOwordm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHNwPEFNZXNzYWdlPiAqZGVzdCk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oIGIvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaAppbmRleCBlM2VmMTM0Li44NWUxN2Y5IDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaCBiL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhZGFhNDg5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCBjYTExOWQ1Li41ZjE5Zjc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTUzOCw2ICs1MzgsMTAgQEAKICAgICAgICAgbVRpbWVzdGFtcE11dGF0b3IucHVzaCh0aW1lc3RhbXApOwogICAgIH0KIAorICAgIHZpcnR1YWwgRXh0ZW5kZWRUaW1lc3RhbXAgZ2V0VGltZXN0YW1wKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRpbWVzdGFtcE11dGF0b3IubGFzdCgpOworICAgIH0KKwogICAgIC8vIEZsdXNoZXMgdGhlIHNoYXJlZCByaW5nIGJ1ZmZlciBpZiB0aGUgY2xpZW50IGhhZCByZXF1ZXN0ZWQgaXQgdXNpbmcgbVN0cmVhbWluZy5tRmx1c2guCiAgICAgLy8gSWYgZmx1c2ggb2NjdXJzIHRoZW46CiAgICAgLy8gICBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250LCBTZXJ2ZXJQcm94eTo6bUZsdXNoIGFuZCBTZXJ2ZXJQcm94eTo6bUZsdXNoZWQgd2lsbCBiZSBtb2RpZmllZApAQCAtNTUxLDYgKzU1NSw5IEBACiAgICAgLy8gVG90YWwgY291bnQgb2YgdGhlIG51bWJlciBvZiBmbHVzaGVkIGZyYW1lcyBzaW5jZSBjcmVhdGlvbiAobmV2ZXIgcmVzZXQpLgogICAgIHZpcnR1YWwgaW50NjRfdCAgICAgZnJhbWVzRmx1c2hlZCgpIGNvbnN0IHsgcmV0dXJuIG1GbHVzaGVkOyB9CiAKKyAgICAvLyBTYWZlIGZyYW1lcyByZWFkeSBxdWVyeSB3aXRoIG5vIHNpZGUgZWZmZWN0cy4KKyAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0ID0gMDsKKwogICAgIC8vIEdldCBkeW5hbWljIGJ1ZmZlciBzaXplIGZyb20gdGhlIHNoYXJlZCBjb250cm9sIGJsb2NrLgogICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkgY29uc3QgewogICAgICAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKChpbnQzMl90ICopJm1DYmxrLT5tQnVmZmVyU2l6ZUluRnJhbWVzKTsKQEAgLTU4OCw4ICs1OTUsNyBAQAogICAgIC8vIHdoaWNoIG1heSBpbmNsdWRlIG5vbi1jb250aWd1b3VzIGZyYW1lcwogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHkoKTsKIAotICAgIC8vIFNhZmUgZnJhbWVzIHJlYWR5IHF1ZXJ5IHVzZWQgYnkgZHVtcCgpIC0gdGhpcyBoYXMgbm8gc2lkZSBlZmZlY3RzLgotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Q7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCBvdmVycmlkZTsgLy8gZnJhbWVzIGF2YWlsYWJsZSB0byByZWFkIGJ5IHNlcnZlci4KIAogICAgIC8vIEN1cnJlbnRseSBBdWRpb0ZsaW5nZXIgd2lsbCBjYWxsIGZyYW1lc1JlYWR5KCkgZm9yIGEgZmFzdCB0cmFjayBmcm9tIHR3byB0aHJlYWRzOgogICAgIC8vIEZhc3RNaXhlciB0aHJlYWQsIGFuZCBub3JtYWwgbWl4ZXIgdGhyZWFkLiAgVGhpcyBpcyBkYW5nZXJvdXMsIGFzIHRoZSBwcm94eSBpcyBpbnRlbmRlZApAQCAtNjkzLDYgKzY5OSw4IEBACiAgICAgICAgIHJldHVybiBtQ2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOyAvLyBGb3IgY29tcGxldGVuZXNzIG9ubHk7IG1SZWFyIHdyaXR0ZW4gYnkgc2VydmVyLgogICAgIH0KIAorICAgIHNpemVfdCBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCBvdmVycmlkZTsgLy8gZnJhbWVzIGF2YWlsYWJsZSB0byByZWFkIGJ5IGNsaWVudC4KKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvUmVjb3JkU2VydmVyUHJveHkoKSB7IH0KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKaW5kZXggNWZkOGViMi4uYzM1N2NhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaApAQCAtNDAsNiArNDAsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOwogCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCmluZGV4IDdhMjllMzEuLjJlMmZmN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCkBAIC01Miw2ICs1Miw3IEBACiAKICAgICAgICAgICAgIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIAogICAgICAgICAgICAgLy8gQnBTb3VuZFRyaWdnZXJDbGllbnQKICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29nbml0aW9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KTsKZGlmZiAtLWdpdCBhL21lZGlhL09XTkVSUyBiL21lZGlhL09XTkVSUwppbmRleCAxZjY4N2EyLi4xZTJkMTIzIDEwMDY0NAotLS0gYS9tZWRpYS9PV05FUlMKKysrIGIvbWVkaWEvT1dORVJTCkBAIC0yLDggKzIsMTAgQEAKIGR3a2FuZ0Bnb29nbGUuY29tCiBlbGF1cmVudEBnb29nbGUuY29tCiBlc3NpY2tAZ29vZ2xlLmNvbQorZ2thc3RlbkBnb29nbGUuY29tCiBoa3VhbmdAZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQoramlhYmluQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQoga3JvY2FyZEBnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawppbmRleCA3MGMyODFhLi4xZjI0NDEzIDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKQEAgLTQsNyArNCw2IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJbWFpbl9hdWRpb3NlcnZlci5jcHAgXAotCS4uL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhYXVkaW9zZXJ2aWNlIFwKQEAgLTE3LDkgKzE2LDEyIEBACiAJbGliaHdiaW5kZXIgXAogCWxpYm1lZGlhIFwKIAlsaWJtZWRpYWxvZ3NlcnZpY2UgXAorCWxpYm1lZGlhdXRpbHMgXAogCWxpYm5iYWlvIFwKKwlsaWJuYmxvZyBcCiAJbGlic291bmR0cmlnZ2Vyc2VydmljZSBcCi0JbGlidXRpbHMKKwlsaWJ1dGlscyBcCisJbGlidmlicmF0b3IKIAogIyBUT0RPIG9ib2VzZXJ2aWNlIGlzIHRoZSBvbGQgZm9sZGVyIG5hbWUgZm9yIGFhdWRpb3NlcnZpY2UuIEl0IHdpbGwgYmUgY2hhbmdlZC4KIExPQ0FMX0NfSU5DTFVERVMgOj0gXApAQCAtNDAsOSArNDIsNiBAQAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCWV4dGVybmFsL3NvbmljIFwKIAotTE9DQUxfQUlETF9JTkNMVURFUyA6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbAotCiAjIElmIEFVRElPU0VSVkVSX01VTFRJTElCIGluIGRldmljZS5tayBpcyBub24tZW1wdHkgdGhlbiBpdCBpcyB1c2VkIHRvIGNvbnRyb2wKICMgdGhlIExPQ0FMX01VTFRJTElCIGZvciBhbGwgYXVkaW9zZXJ2ZXIgZXhjbHVzaXZlIGxpYnJhcmllcy4KICMgVGhpcyBpcyByZWxldmFudCBmb3IgNjQgYml0IGFyY2hpdGVjdHVyZXMgd2hlcmUgZWl0aGVyIG9yIGJvdGgKQEAgLTU0LDEzICs1Myw5IEBACiAjICAgYm90aCAgICB0byBidWlsZCBib3RoIDMyIGJpdCBhbmQgNjQgYml0IGxpYnJhcmllcywKICMgICAgICAgICAgIGFuZCB1c2UgcHJpbWFyeSB0YXJnZXQgYXJjaGl0ZWN0dXJlICgzMiBvciA2NCkgZm9yIGF1ZGlvc2VydmVyLgogIyAgIGZpcnN0ICAgdG8gYnVpbGQgbGlicmFyaWVzIGFuZCBhdWRpb3NlcnZlciBmb3IgdGhlIHByaW1hcnkgdGFyZ2V0IGFyY2hpdGVjdHVyZSBvbmx5LgotIyAgIDxlbXB0eT4gdG8gYnVpbGQgYm90aCAzMiBhbmQgNjQgYml0IGxpYnJhcmllcyBhbmQgMzIgYml0IGF1ZGlvc2VydmVyLgorIyAgIDxlbXB0eT4gdG8gYnVpbGQgYm90aCAzMiBhbmQgNjQgYml0IGxpYnJhcmllcyBhbmQgcHJpbWFyeSB0YXJnZXQgYXVkaW9zZXJ2ZXIuCiAKLWlmZXEgKCQoc3RyaXAgJChBVURJT1NFUlZFUl9NVUxUSUxJQikpLCkKLUxPQ0FMX01VTFRJTElCIDo9IDMyCi1lbHNlCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotZW5kaWYKIAogTE9DQUxfTU9EVUxFIDo9IGF1ZGlvc2VydmVyCiAKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKaW5kZXggMWYyZTgyZi4uZGZiMWEzZiAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKQEAgLTcsNiArNyw3IEBACiAgICAgaW9wcmlvIHJ0IDQKICAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzIC9kZXYvc3R1bmUvZm9yZWdyb3VuZC90YXNrcwogICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci5hdWRpby1oYWwtMi0wCisgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC00LTAtbXNkCiAgICAgIyBLZWVwIHRoZSBvcmlnaW5hbCBzZXJ2aWNlIG5hbWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2hlbiB1cGdyYWRpbmcKICAgICAjIE8tTVIxIGRldmljZXMgd2l0aCBmcmFtZXdvcmstb25seS4KICAgICBvbnJlc3RhcnQgcmVzdGFydCBhdWRpby1oYWwtMi0wCkBAIC0xNSwzICsxNiw2IEBACiAgICAgc3RvcCBhdWRpb3NlcnZlcgogb24gcHJvcGVydHk6dnRzLm5hdGl2ZV9zZXJ2ZXIub249MAogICAgIHN0YXJ0IGF1ZGlvc2VydmVyCisKK29uIGluaXQKKyAgICBta2RpciAvZGV2L3NvY2tldC9hdWRpb3NlcnZlciAwNzc1IGF1ZGlvc2VydmVyIGF1ZGlvc2VydmVyCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkZmMwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmNwcApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDb25uZWN0aW9uIgorCisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKyNpbmNsdWRlICJBY2Nlc3NvckltcGwuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZCgKKyAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChjb25uZWN0aW9uSWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgbUFjY2Vzc29ycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBhY2Nlc3NvcikpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OnJlbW92ZShpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtQWNjZXNzb3JzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgYXV0byBpdCA9IG1Db25uZWN0aW9uVG9Db29raWUuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQ29ubmVjdGlvblRvQ29va2llLmVuZCgpKSB7CisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoaXQpOworICAgICAgICBhdXRvIGNpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICAgICAgaWYgKGNpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgY2l0LT5zZWNvbmQuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChjaXQtPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGRDb29raWVUb0Nvbm5lY3Rpb24oCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChjb25uZWN0aW9uSWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ29ubmVjdGlvblRvQ29va2llLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGNvb2tpZSkpOworICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgaWYgKGl0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGl0LT5zZWNvbmQuaW5zZXJ0KGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIGNvb2tpZSwgc3RkOjpzZXQ8aW50NjRfdD57Y29ubmVjdGlvbklkfSkpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OnNlcnZpY2VEaWVkKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgKSB7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBjb25uZWN0aW9uc1RvQ2xvc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisKKyAgICAgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICAgICAgaWYgKGl0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gY29uSXQgPSBpdC0+c2Vjb25kLmJlZ2luKCk7IGNvbkl0ICE9IGl0LT5zZWNvbmQuZW5kKCk7ICsrY29uSXQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFjY2Vzc29ySXQgPSBtQWNjZXNzb3JzLmZpbmQoKmNvbkl0KTsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzb3JJdCAhPSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zVG9DbG9zZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmNvbkl0LCBhY2Nlc3Nvckl0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc29ycy5lcmFzZShhY2Nlc3Nvckl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZSgqY29uSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbm5lY3Rpb25zVG9DbG9zZS5zaXplKCkgPiAwKSB7CisgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gY29ubmVjdGlvbnNUb0Nsb3NlLmJlZ2luKCk7IGl0ICE9IGNvbm5lY3Rpb25zVG9DbG9zZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgYWNjZXNzb3IgPSBpdC0+c2Vjb25kLnByb21vdGUoKTsKKworICAgICAgICAgICAgaWYgKGFjY2Vzc29yKSB7CisgICAgICAgICAgICAgICAgYWNjZXNzb3ItPmNsb3NlKGl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbm5lY3Rpb24gJWxsZCBjbG9zZWQgb24gZGVhdGgiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK25hbWVzcGFjZSB7CitzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50ID0KKyAgICAgICAgbmV3IENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworfQorCitzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IEFjY2Vzc29yOjpnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKSB7CisgICAgcmV0dXJuIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yIGZvbGxvdy4KK1JldHVybjx2b2lkPiBBY2Nlc3Nvcjo6Y29ubmVjdChjb25uZWN0X2NiIF9oaWRsX2NiKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciogZm1xRGVzYzsKKworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBjb25uZWN0KCZjb25uZWN0aW9uLCAmY29ubmVjdGlvbklkLCAmZm1xRGVzYywgZmFsc2UpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb25JZCwgKmZtcURlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgbnVsbHB0ciwgLTFMTCwKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM8QnVmZmVyU3RhdHVzTWVzc2FnZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6aGFyZHdhcmU6OkdyYW50b3JEZXNjcmlwdG9yPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogbmhhbmRsZSAqLywgMCAvKiBzaXplICovKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0FjY2Vzc29yOjpBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICA6IG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0FjY2Vzc29yOjp+QWNjZXNzb3IoKSB7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIChib29sKW1JbXBsOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNvbm5lY3QoCisgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIsIGJvb2wgbG9jYWwpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jb25uZWN0KHRoaXMsIGNvbm5lY3Rpb24sIHBDb25uZWN0aW9uSWQsIGZtcURlc2NQdHIpOworICAgICAgICBpZiAoIWxvY2FsICYmIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IodGhpcyk7CisgICAgICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5hZGQoKnBDb25uZWN0aW9uSWQsIGFjY2Vzc29yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+cmVtb3ZlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEFjY2Vzc29yOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICB9Cit9CisKKy8vSUFjY2Vzc29yKiBISURMX0ZFVENIX0lBY2Nlc3Nvcihjb25zdCBjaGFyKiAvKiBuYW1lICovKSB7CisvLyAgICByZXR1cm4gbmV3IEFjY2Vzc29yKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4NmY3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmgKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQWNjZXNzb3IuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBBY2Nlc3NvcjsKK3N0cnVjdCBDb25uZWN0aW9uOworCisvKioKKyAqIFJlY2VpdmVzIGRlYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSByZW1vdGUgY29ubmVjdGlvbnMuCisgKiBPbiBkZWF0aCBub3RpZmljYXRpb25zLCB0aGUgY29ubmVjdGlvbnMgYXJlIGNsb3NlZCBhbmQgdXNlZCByZXNvdXJjZXMKKyAqIGFyZSByZWxlYXNlZC4KKyAqLworc3RydWN0IENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIG5ld2x5IGNvbm5lY3RlZCBjb25uZWN0aW9uIGZyb20gcmVtb3RlIHByb2Nlc3Nlcy4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChpbnQ2NF90IGNvbm5lY3Rpb25JZCwgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2b2lkIGFkZENvb2tpZVRvQ29ubmVjdGlvbih1aW50NjRfdCBjb29raWUsIGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgICAgICkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8aW50NjRfdD4+ICBtQ29va2llVG9Db25uZWN0aW9uczsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCB1aW50NjRfdD4gbUNvbm5lY3Rpb25Ub0Nvb2tpZTsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IG1BY2Nlc3NvcnM7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggZW5hYmxlcyBhIGJ1ZmZlciBwb29sIHRvIGNvbW11bmljYXRlIHdpdGggYnVmZmVyCisgKiBwb29sIGNsaWVudHMuIDE6MSBjb3JyZXNwb25kZW5zZSBob2xkcyBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIGFuIGFjY2Vzc29yLgorICovCitzdHJ1Y3QgQWNjZXNzb3IgOiBwdWJsaWMgSUFjY2Vzc29yIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggdXNlcyB0aGUgc3BlY2lmaWVkIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgYnVmZmVyIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3IuICovCisgICAgfkFjY2Vzc29yKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBhY2Nlc3NvciBpcyB2YWxpZC4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBBbGxvY2F0ZXMgYSBidWZmZXIgZnJvbSBhIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGNvbm5lY3Rpb24gaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIEZldGNoZXMgYSBidWZmZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgcmVjZWl2aW5nIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCB0aGUgaWQgb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIHRvIGJlIGZldGNoZWQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGZldGNoZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBmZXRjaGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBmZXRjaCgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGJ1ZmZlciBwb29sLiBUaGUgYnVmZmVyIHBvb2wgY2xpZW50IHVzZXMgdGhlCisgICAgICogY3JlYXRlZCBjb25uZWN0aW9uIGluIG9yZGVyIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGJ1ZmZlciBwb29sLiBBbgorICAgICAqIEZNUSBmb3IgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGlzIGFsc28gY3JlYXRlZCBmb3IgdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uICAgIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIHRoZSBpZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgRk1RIGRlc2NyaXB0b3IgZm9yIHNoYXJlZCBidWZmZXIgc3RhdHVzIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGxvY2FsICAgICAgICAgdHJ1ZSB3aGVuIGEgY29ubmVjdGlvbiByZXF1ZXN0IGNvbWVzIGZyb20gbG9jYWwgcHJvY2VzcywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBtYWRlLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIsIGJvb2wgbG9jYWwpOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb21zIHBlcmlvZGljIGNhY2hlCisgICAgICogY2xlYW5pbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGl0IGZyZWVzIGFsbCBidWZmZXJzIHdhaXRpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBoaWRsX2RlYXRoX3JlY2lwaWVudCBmb3IgcmVtb3RlIGNvbm5lY3Rpb24gZGVhdGguCisgICAgICovCisgICAgc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gZ2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExN2YxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5jcHAKQEAgLTAsMCArMSw1NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xBY2Nlc3NvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBY2Nlc3NvckltcGwuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworbmFtZXNwYWNlIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gNTAwMDAwOyAvLyBUT0RPIHR1bmUgMC41IHNlYworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrTG9nRHVyYXRpb25VcyA9IDUwMDAwMDA7IC8vIDUgc2VjcworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbiA9IDEwMjQqMTAyNCoxNTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbiA9IDQwOworfQorCisvLyBCdWZmZXIgc3RydWN0dXJlIGluIGJ1ZmZlcnBvb2wgcHJvY2Vzcworc3RydWN0IEludGVybmFsQnVmZmVyIHsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgc2l6ZV90IG1Pd25lckNvdW50OworICAgIHNpemVfdCBtVHJhbnNhY3Rpb25Db3VudDsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIGNvbnN0IHNpemVfdCBtQWxsb2NTaXplOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1Db25maWc7CisKKyAgICBJbnRlcm5hbEJ1ZmZlcigKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmFsbG9jQ29uZmlnKQorICAgICAgICAgICAgOiBtSWQoaWQpLCBtT3duZXJDb3VudCgwKSwgbVRyYW5zYWN0aW9uQ291bnQoMCksCisgICAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksIG1BbGxvY1NpemUoYWxsb2NTaXplKSwgbUNvbmZpZyhhbGxvY0NvbmZpZykge30KKworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24tPmhhbmRsZSgpOworICAgIH0KK307CisKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1cyB7CisgICAgVHJhbnNhY3Rpb25JZCBtSWQ7CisgICAgQnVmZmVySWQgbUJ1ZmZlcklkOworICAgIENvbm5lY3Rpb25JZCBtU2VuZGVyOworICAgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXI7CisgICAgQnVmZmVyU3RhdHVzIG1TdGF0dXM7CisgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgYm9vbCBtU2VuZGVyVmFsaWRhdGVkOworCisgICAgVHJhbnNhY3Rpb25TdGF0dXMoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgICAgICBtSWQgPSBtZXNzYWdlLnRyYW5zYWN0aW9uSWQ7CisgICAgICAgIG1CdWZmZXJJZCA9IG1lc3NhZ2UuYnVmZmVySWQ7CisgICAgICAgIG1TdGF0dXMgPSBtZXNzYWdlLm5ld1N0YXR1czsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8pIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2VuZGVyID0gLTFMTDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfTsKKworLy8gSGVscGVyIHRlbXBsYXRlIG1ldGhvZHMgZm9yIGhhbmRsaW5nIG1hcCBvZiBzZXQuCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBpbnNlcnQoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyID09IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBzdGQ6OnNldDxVPiB2YWx1ZVNldHt2YWx1ZX07CisgICAgICAgIG1hcE9mU2V0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5LCB2YWx1ZVNldCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKSAgPT0gaXRlci0+c2Vjb25kLmVuZCgpKSB7CisgICAgICAgIGl0ZXItPnNlY29uZC5pbnNlcnQodmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBlcmFzZShzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5lcmFzZSh2YWx1ZSkgPiAwKSB7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1hcE9mU2V0LT5lcmFzZShpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBjb250YWlucyhzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGF1dG8gc2V0SXRlciA9IGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHNldEl0ZXIgIT0gaXRlci0+c2Vjb25kLmVuZCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNQaWQgPSBnZXRwaWQoKTsKK3VpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzU2VxSWQgPSB0aW1lKG51bGxwdHIpOworCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKK0FjY2Vzc29yOjpJbXBsOjp+SW1wbCgpIHsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgICAgICBpZiAobmV3Q29ubmVjdGlvbikgeworICAgICAgICAgICAgQ29ubmVjdGlvbklkIGlkID0gKGludDY0X3Qpc1BpZCA8PCAzMiB8IHNTZXFJZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLm1PYnNlcnZlci5vcGVuKGlkLCBmbXFEZXNjUHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG5ld0Nvbm5lY3Rpb24tPmluaXRpYWxpemUoYWNjZXNzb3IsIGlkKTsKKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IG5ld0Nvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBpZDsKKyAgICAgICAgICAgICAgICArK3NTZXFJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmhhbmRsZUNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgbUJ1ZmZlclBvb2wubU9ic2VydmVyLmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgLy8gU2luY2UgY2xvc2UjIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGFsbCB3b3JrcyBhcmUgZmluaXNoZWQsIGl0IGlzIE9LIHRvCisgICAgLy8gZXZpY3QgdW51c2VkIGJ1ZmZlcnMuCisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCh0cnVlKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICBpZiAoIW1CdWZmZXJQb29sLmdldEZyZWVCdWZmZXIobUFsbG9jYXRvciwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKSkgeworICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IGFsbG9jOworICAgICAgICBzaXplX3QgYWxsb2NTaXplOworICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5hbGxvY2F0ZShwYXJhbXMsICZhbGxvYywgJmFsbG9jU2l6ZSk7CisgICAgICAgIGxvY2subG9jaygpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLmFkZE5ld0J1ZmZlcihhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjcmVhdGUgYSBidWZmZXIgJWQgOiAldSAlcCIsCisgICAgICAgICAgICAgIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LLCAqYnVmZmVySWQsICpoYW5kbGUpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIG93bkJ1ZmZlciBmYWlsdXJlCisgICAgICAgIG1CdWZmZXJQb29sLmhhbmRsZU93bkJ1ZmZlcihjb25uZWN0aW9uSWQsICpidWZmZXJJZCk7CisgICAgfQorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIGF1dG8gZm91bmQgPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZW5kKCkgJiYKKyAgICAgICAgICAgIGNvbnRhaW5zKCZtQnVmZmVyUG9vbC5tUGVuZGluZ1RyYW5zYWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCkpIHsKKyAgICAgICAgaWYgKGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1CdWZmZXJJZCA9PSBidWZmZXJJZCkgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g7CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ID0gbUJ1ZmZlclBvb2wubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoYnVmZmVySXQgIT0gbUJ1ZmZlclBvb2wubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tU3RhdHMub25CdWZmZXJGZXRjaGVkKCk7CisgICAgICAgICAgICAgICAgKmhhbmRsZSA9IGJ1ZmZlckl0LT5zZWNvbmQtPmhhbmRsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICAvLyB0cmFuc2FjdGlvbiB0aW1lb3V0LCBidWZmZXIgY2FjaGVpbmcgVFRMIGhhbmRsaW5nCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKGNsZWFyQ2FjaGUpOworfQorCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6QnVmZmVyUG9vbCgpCisgICAgOiBtVGltZXN0YW1wVXMoZ2V0VGltZXN0YW1wTm93KCkpLAorICAgICAgbUxhc3RDbGVhblVwVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1MYXN0TG9nVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1TZXEoMCkge30KKworCisvLyBTdGF0aXN0aWNzIGhlbHBlcgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2ludCBwZXJjZW50YWdlKFQgYmFzZSwgUyB0b3RhbCkgeworICAgIHJldHVybiBpbnQodG90YWwgPyAwLjUgKyAxMDAuICogc3RhdGljX2Nhc3Q8Uz4oYmFzZSkgLyB0b3RhbCA6IDApOworfQorCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6fkJ1ZmZlclBvb2woKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBBTE9HRCgiRGVzdHJ1Y3Rpb24gLSBidWZmZXJwb29sICVwICIKKyAgICAgICAgICAiY2FjaGVkOiAlenUvJXp1TSwgJXp1LyVkJSUgaW4gdXNlOyAiCisgICAgICAgICAgImFsbG9jczogJXp1LCAlZCUlIHJlY3ljbGVkOyAiCisgICAgICAgICAgInRyYW5zZmVyczogJXp1LCAlZCUlIHVuZmV0Y2VkIiwKKyAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCA+PiAyMCwKKyAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgcGVyY2VudGFnZShtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMsCisgICAgICAgICAgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsVHJhbnNmZXJzIC0gbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpKTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlT3duQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworCisgICAgYm9vbCBhZGRlZCA9IGluc2VydCgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGFkZGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50Kys7CisgICAgfQorICAgIGluc2VydCgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIHJldHVybiBhZGRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIEFMT0dWKCJyZWxlYXNlIGJ1ZmZlciAldSA6ICVkIiwgYnVmZmVySWQsIGRlbGV0ZWQpOworICAgIHJldHVybiBkZWxldGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGNvbXBsZXRlZCA9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZmluZCgKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGNvbXBsZXRlZCAhPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgY29tcGxldGVkCisgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZXJhc2UoY29tcGxldGVkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIHRoZSBidWZmZXIgc2hvdWxkIGV4aXN0IGFuZCBiZSBvd25lZC4KKyAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgIGlmIChidWZmZXJJdGVyID09IG1CdWZmZXJzLmVuZCgpIHx8CisgICAgICAgICAgICAhY29udGFpbnMoJm1Vc2luZ0J1ZmZlcnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyB0cmFuc2Zlcl9mcm9tIHdhcyByZWNlaXZlZCBlYXJsaWVyLgorICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gVE9ETzogdmVyaWZ5IHRoZXJlIGlzIHRhcmdldCBjb25uZWN0aW9uIElkCisgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkLAorICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kID09IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaXMgaXQgZmVhc2libGUgdG8gY2hlY2sgb3duZXJzaGlwIGhlcmU/CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICAgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICAgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1lc3NhZ2UuY29ubmVjdGlvbklkID09IGZvdW5kLT5zZWNvbmQtPm1SZWNlaXZlcikgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgaWYgKCFmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5uZXdTdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSykgeworICAgICAgICAgICAgICAgIGhhbmRsZU93bkJ1ZmZlcihtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwCisgICAgICAgICAgICAgICAgJiYgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoZm91bmQpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJ0cmFuc2ZlciBmaW5pc2hlZCAlbGx1ICV1IC0gJWQiLCAodW5zaWduZWQgbG9uZyBsb25nKW1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCwgZGVsZXRlZCk7CisgICAgICAgIHJldHVybiBkZWxldGVkOworICAgIH0KKyAgICBBTE9HVigidHJhbnNmZXIgbm90IGZvdW5kICVsbHUgJXUiLCAodW5zaWduZWQgbG9uZyBsb25nKW1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpIHsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiBtZXNzYWdlczsKKyAgICBtT2JzZXJ2ZXIuZ2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhtZXNzYWdlcyk7CisgICAgbVRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgZm9yIChCdWZmZXJTdGF0dXNNZXNzYWdlJiBtZXNzYWdlOiBtZXNzYWdlcykgeworICAgICAgICBib29sIHJldCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UubmV3U3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpVU0VEOgorICAgICAgICAgICAgICAgIC8vIG5vdCBoYXBwZW5pbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTzoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlclRvKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST006CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJGcm9tKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0xPU1Q6CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOgorICAgICAgICAgICAgICAgIC8vIG5vdCBoYXBwZW5pbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSzoKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUjoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlclJlc3VsdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IGZhbHNlKSB7CisgICAgICAgICAgICBBTE9HVygiYnVmZmVyIHN0YXR1cyBtZXNzYWdlIHByb2Nlc3NpbmcgZmFpbHVyZSAtIG1lc3NhZ2UgOiAlZCBjb25uZWN0aW9uIDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cywgKGxvbmcgbG9uZyltZXNzYWdlLmNvbm5lY3Rpb25JZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZXMuY2xlYXIoKTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIC8vIENsZWFuaW5nIGJ1ZmZlcnMKKyAgICBhdXRvIGJ1ZmZlcnMgPSBtVXNpbmdCdWZmZXJzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoYnVmZmVycyAhPSBtVXNpbmdCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgQnVmZmVySWQmIGJ1ZmZlcklkIDogYnVmZmVycy0+c2Vjb25kKSB7CisgICAgICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcmVlYnVmZmVyIGluc2VydCBmYWlsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVVzaW5nQnVmZmVycy5lcmFzZShidWZmZXJzKTsKKyAgICB9CisKKyAgICAvLyBDbGVhbmluZyB0cmFuc2FjdGlvbnMKKyAgICBhdXRvIHBlbmRpbmcgPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKHBlbmRpbmcgIT0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBUcmFuc2FjdGlvbklkJiB0cmFuc2FjdGlvbklkIDogcGVuZGluZy0+c2Vjb25kKSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoaXRlciAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpdGVyLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQodHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gaXRlci0+c2Vjb25kLT5tQnVmZmVySWQ7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcmVlYnVmZmVyIGluc2VydCBmYWlsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Z2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGF1dG8gYnVmZmVySXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBmb3IgKDtidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7ICsrYnVmZmVySXQpIHsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSAqYnVmZmVySXQ7CisgICAgICAgIGlmIChhbGxvY2F0b3ItPmNvbXBhdGlibGUocGFyYW1zLCBtQnVmZmVyc1tidWZmZXJJZF0tPm1Db25maWcpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIEJ1ZmZlcklkIGlkID0gKmJ1ZmZlckl0OworICAgICAgICBtRnJlZUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXQpOworICAgICAgICBtU3RhdHMub25CdWZmZXJSZWN5Y2xlZChtQnVmZmVyc1tpZF0tPm1BbGxvY1NpemUpOworICAgICAgICAqaGFuZGxlID0gbUJ1ZmZlcnNbaWRdLT5oYW5kbGUoKTsKKyAgICAgICAgKnBJZCA9IGlkOworICAgICAgICBBTE9HVigicmVjeWNsZSBhIGJ1ZmZlciAldSAlcCIsIGlkLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjphZGROZXdCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKworICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gbVNlcSsrOworICAgIGlmIChtU2VxID09IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgbVNlcSA9IDA7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8SW50ZXJuYWxCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGF1dG8gcmVzID0gbUJ1ZmZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoYnVmZmVyKSkpOworICAgICAgICBpZiAocmVzLnNlY29uZCkgeworICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyQWxsb2NhdGVkKGFsbG9jU2l6ZSk7CisgICAgICAgICAgICAqaGFuZGxlID0gYWxsb2MtPmhhbmRsZSgpOworICAgICAgICAgICAgKnBJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChjbGVhckNhY2hlIHx8IG1UaW1lc3RhbXBVcyA+IG1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzKSB7CisgICAgICAgIG1MYXN0Q2xlYW5VcFVzID0gbVRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVRpbWVzdGFtcFVzID4gbUxhc3RMb2dVcyArIGtMb2dEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtTGFzdExvZ1VzID0gbVRpbWVzdGFtcFVzOworICAgICAgICAgICAgQUxPR0QoImJ1ZmZlcnBvb2wgJXAgOiAlenUoJXp1IHNpemUpIHRvdGFsIGJ1ZmZlcnMgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1KCV6dSBzaXplKSB1c2VkIGJ1ZmZlcnMgLSAlenUvJXp1IChyZWN5Y2xlL2FsbG9jKSAtICIKKyAgICAgICAgICAgICAgICAgICIlenUvJXp1IChmZXRjaC90cmFuc2ZlcikiLAorICAgICAgICAgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1TaXplSW5Vc2UsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsUmVjeWNsZXMsIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7IGZyZWVJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWNsZWFyQ2FjaGUgJiYgbVN0YXRzLm1TaXplQ2FjaGVkIDwga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiBtQnVmZmVycy5zaXplKCkgPCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBpdCA9IG1CdWZmZXJzLmZpbmQoKmZyZWVJdCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJiBpdC0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdC0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmVyYXNlKGZyZWVJdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrZnJlZUl0OworICAgICAgICAgICAgICAgIEFMT0dXKCJidWZmZXJwb29sIGluY29uc2lzdGVudCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDRkYmYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SSU1QTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SSU1QTF9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RydWN0IEludGVybmFsQnVmZmVyOworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Iob3IgYSBidWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4pICovCitjbGFzcyBBY2Nlc3Nvcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICB+SW1wbCgpOworCisgICAgUmVzdWx0U3RhdHVzIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cik7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworcHJpdmF0ZToKKyAgICAvLyBDb25uZWN0aW9uSWQgPSBwaWQgOiAodGltZXN0YW1wX2NyZWF0ZWQgKyBzZXFJZCkKKyAgICAvLyBpbiBvcmRlciB0byBndWFyYW50ZWUgdW5pcXVlbmVzcyBmb3IgZWFjaCBjb25uZWN0aW9uCisgICAgc3RhdGljIHVpbnQzMl90IHNTZXFJZDsKKyAgICBzdGF0aWMgaW50MzJfdCBzUGlkOworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcy4gSGFuZGxlcyBidWZmZXIgYWxsb2NhdGlvbi9yZWN5Y2xpbmcuCisgICAgICogSGFuZGxlcyBidWZmZXIgdHJhbnNmZXIgYmV0d2VlbiBidWZmZXIgcG9vbCBjbGllbnRzLgorICAgICAqLworICAgIHN0cnVjdCBCdWZmZXJQb29sIHsKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RMb2dVczsKKyAgICAgICAgQnVmZmVySWQgbVNlcTsKKyAgICAgICAgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgbU9ic2VydmVyOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8QnVmZmVySWQ+PiBtVXNpbmdCdWZmZXJzOworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjpzZXQ8Q29ubmVjdGlvbklkPj4gbVVzaW5nQ29ubmVjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPj4gbVBlbmRpbmdUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIFRyYW5zYWN0aW9ucyBjb21wbGV0ZWQgYmVmb3JlIFRSQU5TRkVSX1RPIG1lc3NhZ2UgYXJyaXZhbC4KKyAgICAgICAgLy8gRmV0Y2ggZG9lcyBub3Qgb2NjdXIgZm9yIHRoZSB0cmFuc2FjdGlvbnMuCisgICAgICAgIC8vIE9ubHkgdHJhbnNhY3Rpb24gaWQgaXMga2VwdCBmb3IgdGhlIHRyYW5zYWN0aW9ucyBpbiBzaG9ydCBkdXJhdGlvbi4KKyAgICAgICAgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4gbUNvbXBsZXRlZFRyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gQ3VycmVudGx5IGFjdGl2ZShwZW5kaW5nKSB0cmFuc2F0aW9ucycgc3RhdHVzICYgaW5mb3JtYXRpb24uCisgICAgICAgIHN0ZDo6bWFwPFRyYW5zYWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2FjdGlvblN0YXR1cz4+CisgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIHN0ZDo6c2V0PEJ1ZmZlcklkPiBtRnJlZUJ1ZmZlcnM7CisKKyAgICAgICAgLy8vIEJ1ZmZlciBwb29sIHN0YXRpc3RpY3Mgd2hpY2ggdHJhY2tzIGFsbG9jYXRpb24gYW5kIHRyYW5zZmVyIHN0YXRpc3RpY3MuCisgICAgICAgIHN0cnVjdCBTdGF0cyB7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBvciBhdmFpbGFibGUgdG8gdXNlLgorICAgICAgICAgICAgLy8vIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVDYWNoZWQ7CisgICAgICAgICAgICAvLy8gIyBvZiBjYWNoZWQgYnVmZmVycyB3aGljaCBhcmUgdXNlZCBvciBhdmFpbGFibGUgdG8gdXNlLgorICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzQ2FjaGVkOworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSB1c2VkLiAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplSW5Vc2U7CisgICAgICAgICAgICAvLy8gIyBvZiBjdXJyZW50bHkgdXNlZCBidWZmZXJzCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNJblVzZTsKKworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgY2FsbGVkIG9uIGJ1ZmZlcnBvb2wuICgjIG9mIGZldGNoZWQgZnJvbSBCbG9ja1Bvb2wpCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsQWxsb2NhdGlvbnM7CisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyB0aGF0IHdlcmUgc2VydmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAgICAgICAgLy8vICgjIG9mIGFsbG9jYXRvciBhbGxvYyBwcmV2ZW50ZWQpCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsUmVjeWNsZXM7CisgICAgICAgICAgICAvLy8gIyBvZiBidWZmZXIgdHJhbnNmZXJzIGluaXRpYXRlZC4KKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlcnM7CisgICAgICAgICAgICAvLy8gIyBvZiB0cmFuc2ZlcnMgdGhhdCBoYWQgdG8gYmUgZmV0Y2hlZC4KKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxGZXRjaGVzOworCisgICAgICAgICAgICBTdGF0cygpCisgICAgICAgICAgICAgICAgOiBtU2l6ZUNhY2hlZCgwKSwgbUJ1ZmZlcnNDYWNoZWQoMCksIG1TaXplSW5Vc2UoMCksIG1CdWZmZXJzSW5Vc2UoMCksCisgICAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucygwKSwgbVRvdGFsUmVjeWNsZXMoMCksIG1Ub3RhbFRyYW5zZmVycygwKSwgbVRvdGFsRmV0Y2hlcygwKSB7fQorCisgICAgICAgICAgICAvLy8gQSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZCBvbiBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyQWxsb2NhdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQrKzsKKworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UrKzsKKworICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBldmljdGVkIGFuZCBkZXN0cm95ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRXZpY3RlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgLT0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyByZWN5Y2xlZCBvbiBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyUmVjeWNsZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UrKzsKKworICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKys7CisgICAgICAgICAgICAgICAgbVRvdGFsUmVjeWNsZXMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGF2YWlsYWJsZSB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJVbnVzZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgLT0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIHRyYW5zZmVyIGlzIGluaXRpYXRlZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJTZW50KCkgeworICAgICAgICAgICAgICAgIG1Ub3RhbFRyYW5zZmVycysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgZmV0Y2ggaXMgaW52b2tlZCBieSBhIGJ1ZmZlciB0cmFuc2Zlci4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJGZXRjaGVkKCkgeworICAgICAgICAgICAgICAgIG1Ub3RhbEZldGNoZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBtU3RhdHM7CisKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIEJ1ZmZlclBvb2woKTsKKworICAgICAgICAvKiogRGVzdHJveXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgfkJ1ZmZlclBvb2woKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIGFsbCBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgICAgICAqIEVhY2ggc3RhdHVzIG1lc3NhZ2UgaXMgaGFuZGxlZCBieSBtZXRob2RzIHdpdGggJ2hhbmRsZScgcHJlZml4LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyBvd25lZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIGlzIG93bmVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVPd25CdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIHJlbGVhc2VkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgb3duZXJzaGlwIGlzIHJlbGVhc2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVSZWxlYXNlQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHN0YXJ0IG1lc3NhZ2UgZnJvbSB0aGUgc2VuZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfdG8gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBiZWluZyBhY2tlZCBieSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl9mcm9tIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiByZXN1bHQgbWVzc2FnZSBmcm9tIHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRoZSBleGlzaXRuZyB0cmFuc2FjdGlvbiBpcyBmaW5pc2hlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBjb25uZWN0aW9uIGJlaW5nIGNsb3NlZCwgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQWxsIHRoZQorICAgICAgICAgKiBidWZmZXJzIGFuZCB0cmFuc2FjdGlvbnMgb3duZWQgYnkgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbGVhbmVkIHVwLgorICAgICAgICAgKiBUaGUgcmVsYXRlZCBGTVEgd2lsbCBiZSBjbGVhbmVkIHVwIHRvby4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRoZSBjb25uZWN0aW9uIGV4aXN0ZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWN5Y2xlcyBhIGV4aXN0aW5nIGZyZWUgYnVmZmVyIGlmIGl0IGlzIHBvc3NpYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIHRoZSBidWZmZXIgYWxsb2NhdG9yCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgaWQgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIGEgYnVmZmVyIGlzIHJlY3ljbGVkLCB7QGNvZGUgZmFsc2V9CisgICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBnZXRGcmVlQnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgQnVmZmVySWQgKnBJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgdG8gYnVmZmVycG9vbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jICAgICB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGFsbG9jU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBidWZmZXIgaWQgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgUmVzdWx0U3RhdHVzIGFkZE5ld0J1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb3JtcyBwZXJpb2RpYyBjYWNoZQorICAgICAgICAgKiBjbGVhbmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgICAgICBmcmllbmQgY2xhc3MgQWNjZXNzb3I6OkltcGw7CisgICAgfSBtQnVmZmVyUG9vbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSB1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SSU1QTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2VhNzBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiQWNjZXNzb3IuY3BwIiwKKyAgICAgICAgIkFjY2Vzc29ySW1wbC5jcHAiLAorICAgICAgICAiQnVmZmVyUG9vbENsaWVudC5jcHAiLAorICAgICAgICAiQnVmZmVyU3RhdHVzLmNwcCIsCisgICAgICAgICJDbGllbnRNYW5hZ2VyLmNwcCIsCisgICAgICAgICJDb25uZWN0aW9uLmNwcCIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTIwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApAQCAtMCwwICsxLDcwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENsaWVudCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVjZWl2ZVRpbWVvdXRVcyA9IDEwMDAwMDA7IC8vIDEwMG1zCitzdGF0aWMgY29uc3RleHByIGludCBrUG9zdE1heFJldHJ5ID0gMzsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtDYWNoZVR0bFVzID0gMTAwMDAwMDsgLy8gVE9ETzogdHVuZQorCitjbGFzcyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsCisgICAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4geworcHVibGljOgorICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIGJvb2wgaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZDsKKyAgICB9CisKKyAgICBib29sIGlzTG9jYWwoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQgJiYgbUxvY2FsOworICAgIH0KKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbklkOworICAgIH0KKworICAgIHNwPElBY2Nlc3Nvcj4gJmdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yOworICAgIH0KKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIHZvaWQgcG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgYm9vbCBwb3N0U2VuZCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7Citwcml2YXRlOgorCisgICAgYm9vbCBwb3N0UmVjZWl2ZSgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzKTsKKworICAgIGJvb2wgcG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKTsKKworICAgIHZvaWQgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKworICAgIGJvb2wgc3luY1JlbGVhc2VkKCk7CisKKyAgICB2b2lkIGV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIHN0cnVjdCBCbG9ja1Bvb2xEYXRhRHRvcjsKKyAgICBzdHJ1Y3QgQ2xpZW50QnVmZmVyOworCisgICAgYm9vbCBtTG9jYWw7CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3A8SUFjY2Vzc29yPiBtQWNjZXNzb3I7CisgICAgc3A8Q29ubmVjdGlvbj4gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICBzcDxJQ29ubmVjdGlvbj4gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgdWludDMyX3QgbVNlcUlkOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIGludDY0X3QgbUxhc3RFdmljdENhY2hlVXM7CisKKyAgICAvLyBDYWNoZWRCdWZmZXJzCisgICAgc3RydWN0IEJ1ZmZlckNhY2hlIHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgYm9vbCBtQ3JlYXRpbmc7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DcmVhdGVDdjsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxDbGllbnRCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgaW50IG1BY3RpdmU7CisgICAgICAgIGludDY0X3QgbUxhc3RDaGFuZ2VVczsKKworICAgICAgICBCdWZmZXJDYWNoZSgpIDogbUNyZWF0aW5nKGZhbHNlKSwgbUFjdGl2ZSgwKSwgbUxhc3RDaGFuZ2VVcyhnZXRUaW1lc3RhbXBOb3coKSkge30KKworICAgICAgICB2b2lkIGluY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgKyttQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkZWNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgIC0tbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorICAgIH0gbUNhY2hlOworCisgICAgLy8gRk1RIC0gcmVsZWFzZSBub3RpZmllcgorICAgIHN0cnVjdCB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIC8vIFRPRE86IHVzZSBvbmx5IG9uZSBsaXN0Pyh1c2luZyBvbmUgbGlzdCBtYXkgZGVhbHkgc2VuZGluZyBtZXNzYWdlcz8pCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2luZ0lkczsKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzZWRJZHM7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiBtU3RhdHVzQ2hhbm5lbDsKKyAgICB9IG1SZWxlYXNpbmc7CisKKyAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBkdXJpbmcgc3luY2hyb25pemF0aW9uIGZyb20gcmVtb3RlIHNpZGUuCisgICAgLy8gSW4gb3JkZXIgdG8gbWluaW1pemUgcmVtb3RlIGNhbGxzIGFuZCBsb2NraW5nIGR1cnRhaW9uLCB0aGlzIGxvY2sgaXMgaGVsZAorICAgIC8vIGJ5IGJlc3QgZWZmb3J0IGFwcHJvYWNoIHVzaW5nIHRyeV9sb2NrKCkuCisgICAgc3RkOjptdXRleCBtUmVtb3RlU3luY0xvY2s7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6QmxvY2tQb29sRGF0YUR0b3IgeworICAgIEJsb2NrUG9vbERhdGFEdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCkKKyAgICAgICAgICAgIDogbUltcGwoaW1wbCkge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sRGF0YSAqYnVmZmVyKSB7CisgICAgICAgIEJ1ZmZlcklkIGlkID0gYnVmZmVyLT5tSWQ7CisgICAgICAgIGRlbGV0ZSBidWZmZXI7CisKKyAgICAgICAgYXV0byBpbXBsID0gbUltcGwubG9jaygpOworICAgICAgICBpZiAoaW1wbCAmJiBpbXBsLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGltcGwtPnBvc3RCdWZmZXJSZWxlYXNlKGlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IG1JbXBsOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkNsaWVudEJ1ZmZlciB7Citwcml2YXRlOgorICAgIGJvb2wgbUludmFsaWRhdGVkOyAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICBpbnQ2NF90IG1FeHBpcmVVczsKKyAgICBib29sIG1IYXNDYWNoZTsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworICAgIHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbERhdGE+IG1DYWNoZTsKKworICAgIHZvaWQgdXBkYXRlRXhwaXJlKCkgeworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworcHVibGljOgorICAgIENsaWVudEJ1ZmZlcigKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGlkLCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgIDogbUludmFsaWRhdGVkKGZhbHNlKSwgbUhhc0NhY2hlKGZhbHNlKSwKKyAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLCBtSWQoaWQpLCBtSGFuZGxlKGhhbmRsZSkgeworICAgICAgICAodm9pZCltSW52YWxpZGF0ZWQ7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCisgICAgfkNsaWVudEJ1ZmZlcigpIHsKKyAgICAgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobUhhbmRsZSk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgZXhwaXJlKCkgY29uc3QgeworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICByZXR1cm4gbm93ID49IG1FeHBpcmVVczsKKyAgICB9CisKKyAgICBib29sIGhhc0NhY2hlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhhc0NhY2hlOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gZmV0Y2hDYWNoZShuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY2FjaGUgPSBtQ2FjaGUubG9jaygpOworICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY3JlYXRlQ2FjaGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlKSB7CisgICAgICAgIGlmICghbUhhc0NhY2hlKSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZXMgYSByYXcgcHRyIGluIG9yZGVyIHRvIGF2b2lkIHNlbmRpbmcgI3Bvc3RCdWZmZXJSZWxlYXNlCisgICAgICAgICAgICAvLyBmcm9tIGRlbGV0ZXIsIGluIGNhc2Ugb2YgbmF0aXZlX2hhbmRsZV9jbG9uZSBmYWlsdXJlLgorICAgICAgICAgICAgQnVmZmVyUG9vbERhdGEgKnB0ciA9IG5ldyBCdWZmZXJQb29sRGF0YShtQ29ubmVjdGlvbklkLCBtSWQpOworICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY2FjaGUocHRyLCBCbG9ja1Bvb2xEYXRhRHRvcihpbXBsKSk7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZSA9IGNhY2hlOworICAgICAgICAgICAgICAgICAgICBtSGFzQ2FjaGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBib29sIG9uQ2FjaGVSZWxlYXNlKCkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgbUNhY2hlIGlzIG5vdCB2YWxpZDsKKyAgICAgICAgICAgIHVwZGF0ZUV4cGlyZSgpOworICAgICAgICAgICAgbUhhc0NhY2hlID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsKKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKQorICAgIDogbUxvY2FsKHRydWUpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAqZm1xRGVzYzsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICAmbUxvY2FsQ29ubmVjdGlvbiwgJm1Db25uZWN0aW9uSWQsICZmbXFEZXNjLCB0cnVlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPigqZm1xRGVzYyk7CisgICAgICAgIG1WYWxpZCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgJiYKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5pc1ZhbGlkKCk7CisgICAgfQorfQorCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKQorICAgIDogbUxvY2FsKGZhbHNlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBib29sIHZhbGlkID0gZmFsc2U7CisgICAgc3A8SUNvbm5lY3Rpb24+JiBvdXRDb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkJiBpZCA9IG1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+JiBvdXRDaGFubmVsID0KKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWw7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICBbJnZhbGlkLCAmb3V0Q29ubmVjdGlvbiwgJmlkLCAmb3V0Q2hhbm5lbF0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgc3RhdHVzLCBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3ImIGRlc2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgICAgIGlkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsID0gc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPihkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dENoYW5uZWwgJiYgb3V0Q2hhbm5lbC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBtVmFsaWQgPSB0cmFuc1Jlc3VsdC5pc09rKCkgJiYgdmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoY2xlYXJDYWNoZSk7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IG1DYWNoZS5tTGFzdENoYW5nZVVzOworICAgICAgICBhY3RpdmUgPSBtQ2FjaGUubUFjdGl2ZSA+IDA7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBhY3RpdmU7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKCFtTG9jYWwgfHwgIW1Mb2NhbENvbm5lY3Rpb24gfHwgIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gYWxsb2NhdGVCdWZmZXJIYW5kbGUocGFyYW1zLCAmYnVmZmVySWQsICZoYW5kbGUpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBpdCBpcyByZWN5Y2xlZC4gKG5vdCBoYXZpbmcgYWN0aXZlIHJlZikKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoY2FjaGVJdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HVigiY2xpZW50IGNhY2hlIGNyZWF0aW9uIGZhaWx1cmUgJWQ6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgaGFuZGxlICE9IG51bGxwdHIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIHBvc3RCdWZmZXJSZWxlYXNlKGJ1ZmZlcklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cmVjZWl2ZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKCFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIGlmICh0aW1lc3RhbXBVcyAhPSAwKSB7CisgICAgICAgIHRpbWVzdGFtcFVzICs9IGtSZWNlaXZlVGltZW91dFVzOworICAgIH0KKyAgICBpZiAoIXBvc3RSZWNlaXZlKGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcykpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gY2FjaGVJdC0+c2Vjb25kLT5mZXRjaENhY2hlKHBIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0cmFuc2ZlciB0aW1lX291dAorICAgICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gcmVmZXJlbmNlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gY2FjaGVJdC0+c2Vjb25kLT5jcmVhdGVDYWNoZShzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSBjYWNoZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbUNhY2hlLm1DcmVhdGluZykgeworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZldGNoQnVmZmVySGFuZGxlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGJ1ZmZlcklkLCBzdGQ6Om1vdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi53YWl0KGxvY2spOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgYm9vbCBwb3N0ZWQgPSBwb3N0UmVjZWl2ZVJlc3VsdChidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA/IHRydWUgOiBmYWxzZSwgJm5lZWRzU3luYyk7CisgICAgQUxPR1YoImNsaWVudCByZWNlaXZlICVsbGQgLSAldSA6ICVzICglZCkiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICpidWZmZXIgPyAib2siIDogImZhaWwiLCBwb3N0ZWQpOworICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgaWYgKCFwb3N0ZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMucHVzaF9iYWNrKGJ1ZmZlcklkKTsKKyAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworfQorCisvLyBUT0RPOiByZXZpc2UgYWQtaG9jIHBvc3RpbmcgZGF0YSBzdHJ1Y3R1cmUKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICp0aW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICAqdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKSB8IG1TZXFJZCsrOworICAgICAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQsIHRhcmdldD8KKyAgICAgICAgcmV0ID0gIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTywgbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICByZWNlaXZlciwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgIG5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZSgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Bvc3RNYXhSZXRyeTsgKytpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID09IDAgfHwgbm93IDwgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00sCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQKKyAgICBib29sIHJldCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICByZXN1bHQgPyBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LIDogQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUiwKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgKm5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjp0cnlTeW5jRnJvbVJlbW90ZSgpIHsKKyAgICBpZiAobVJlbW90ZVN5bmNMb2NrLnRyeV9sb2NrKCkpIHsKKyAgICAgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICAgICBuZWVkc1N5bmMgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZHNTeW5jKSB7CisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMik7CisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQ7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBtUmVtb3RlQ29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBbXQorICAgICAgICAgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGVTeW5jTG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jaworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpzeW5jUmVsZWFzZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5zaXplKCkgPiAwKSB7CisgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgfQorICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAoQnVmZmVySWQmIGlkOiBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcykgeworICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWxlYXNlIGJ1ZmZlciAlbGxkIC0gJXUiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGlkKTsKKyAgICAgICAgICAgIGF1dG8gZm91bmQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChpZCk7CisgICAgICAgICAgICBpZiAoZm91bmQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kLT5zZWNvbmQtPm9uQ2FjaGVSZWxlYXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmRlY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4hCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSByZWxlYXNlIHN0YXR1cyBpbmNvbnNpdGVudCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4hCisgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHN0YXR1cyBpbmNvbnNpdGVudCEiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLmNsZWFyKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGlmIChub3cgPj0gbUxhc3RFdmljdENhY2hlVXMgKyBrQ2FjaGVUdGxVcyB8fCBjbGVhckNhY2hlKSB7CisgICAgICAgIHNpemVfdCBldmljdGVkID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSAmJiAoaXQtPnNlY29uZC0+ZXhwaXJlKCkgfHwgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgKytldmljdGVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjYWNoZSBjb3VudCAlbGxkIDogdG90YWwgJXp1LCBhY3RpdmUgJWQsIGV2aWN0ZWQgJXp1IiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBtQ2FjaGUubUJ1ZmZlcnMuc2l6ZSgpLCBtQ2FjaGUubUFjdGl2ZSwgZXZpY3RlZCk7CisgICAgICAgIG1MYXN0RXZpY3RDYWNoZVVzID0gbm93OworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUxvY2FsQ29ubmVjdGlvbi0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgcGFyYW1zLCBidWZmZXJJZCwgJmFsbG9jSGFuZGxlKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShhbGxvY0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNsaWVudCBhbGxvY2F0ZSByZXN1bHQgJWxsZCAlZCA6ICV1IGNsb25lICVwIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywKKyAgICAgICAgICAgICAgKmhhbmRsZSA/ICpidWZmZXJJZCA6IDAgLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgaWYgKG1Mb2NhbCkgeworICAgICAgICBjb25uZWN0aW9uID0gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gY29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmaGFuZGxlXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5idWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPyBzdGF0dXMgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIG1JbXBsID0gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihhY2Nlc3Nvcik7Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IpOworfQorCitCdWZmZXJQb29sQ2xpZW50Ojp+QnVmZmVyUG9vbENsaWVudCgpIHsKKyAgICAvLyBUT0RPOiBob3cgdG8gaGFuZGxlIG9ycGhhbmVkIGJ1ZmZlcnM/Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzVmFsaWQoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0xvY2FsKCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+aXNMb2NhbCgpOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoIWlzVmFsaWQoKSkgeworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSAwOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtSW1wbC0+aXNBY3RpdmUobGFzdFRyYW5zYWN0aW9uVXMsIGNsZWFyQ2FjaGUpOworfQorCitDb25uZWN0aW9uSWQgQnVmZmVyUG9vbENsaWVudDo6Z2V0Q29ubmVjdGlvbklkKCkgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6Z2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgICphY2Nlc3NvciA9IG1JbXBsLT5nZXRBY2Nlc3NvcigpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cmVjZWl2ZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50Ojpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gbUltcGwtPnBvc3RTZW5kKAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+bUlkLCByZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgICAgIHJldHVybiByZXN1bHQgPyBSZXN1bHRTdGF0dXM6Ok9LIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzdlZmVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQWNjZXNzb3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCisvKioKKyAqIEEgYnVmZmVyIHBvb2wgY2xpZW50IGZvciBhIGJ1ZmZlciBwb29sLiBGb3IgYSBzcGVjaWZpYyBidWZmZXIgcG9vbCwgYXQgbW9zdAorICogb25lIGJ1ZmZlciBwb29sIGNsaWVudCBleGlzdHMgcGVyIHByb2Nlc3MuIFRoaXMgY2xhc3Mgd2lsbCBub3QgYmUgZXhwb3NlZAorICogb3V0c2lkZS4gQSBidWZmZXIgcG9vbCBjbGllbnQgd2lsbCBiZSB1c2VkIHZpYSBDbGllbnRNYW5hZ2VyLgorICovCitjbGFzcyBCdWZmZXJQb29sQ2xpZW50IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgY2xpZW50IGZyb20gYSBsb2NhbCBidWZmZXIgcG9vbAorICAgICAqICh2aWEgQ2xpZW50TWFuYWdlciNjcmVhdGUpLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgY2xpZW50IGZyb20gYSByZW1vdGUgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjcmVnaXN0ZXJTZW5kZXIpLgorICAgICAqIE5vdGU6IEEgYnVmZmVyIHBvb2wgY2xpZW50IGNyZWF0ZWQgd2l0aCByZW1vdGUgYnVmZmVyIHBvb2wgY2Fubm90CisgICAgICogYWxsb2NhdGUgYSBidWZmZXIuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgY2xpZW50LiAqLworICAgIH5CdWZmZXJQb29sQ2xpZW50KCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICBib29sIGlzTG9jYWwoKTsKKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ2xpZW50TWFuYWdlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OWFiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuY3BwCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sU3RhdHVzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCkgeworICAgIGludDY0X3Qgc3RhbXA7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIC8vIFRPRE86IENMT0NLX01PTk9UT05JQ19DT0FSU0U/CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisgICAgc3RhbXAgPSB0cy50dl9uc2VjIC8gMTAwMDsKKyAgICBzdGFtcCArPSAodHMudHZfc2VjICogMTAwMDAwMExMKTsKKyAgICByZXR1cm4gc3RhbXA7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1FbGVtZW50c0luUXVldWUgPSAxMDI0KjE2Oworc3RhdGljIGNvbnN0ZXhwciBpbnQga01pbkVsZW1lbnRzVG9TeW5jSW5RdWV1ZSA9IDEyODsKKworUmVzdWx0U3RhdHVzIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpvcGVuKAorICAgICAgICBDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlkIGNvbGxpc2lvbiBsb2c/CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzUXVldWU+KGtOdW1FbGVtZW50c0luUXVldWUpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZm1xRGVzY1B0ciA9IHF1ZXVlLT5nZXREZXNjKCk7CisgICAgfQorICAgIGF1dG8gcmVzdWx0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5pbnNlcnQoCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihpZCwgc3RkOjptb3ZlKHF1ZXVlKSkpOworICAgIGlmICghcmVzdWx0LnNlY29uZCkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGlkKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgPT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lcmFzZShpZCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5iZWdpbigpOyBpdCAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gaXQtPnNlY29uZC0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgIHdoaWxlIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+cmVhZCgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiByZWFkcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZyAoc3B1cmlvdXMgY2xpZW50PykKKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHJlYWQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gaXQtPmZpcnN0OworICAgICAgICAgICAgbWVzc2FnZXMucHVzaF9iYWNrKG1lc3NhZ2UpOworICAgICAgICAgICAgLS1hdmFpbDsKKyAgICAgICAgfQorICAgIH0KK30KKworQnVmZmVyU3RhdHVzQ2hhbm5lbDo6QnVmZmVyU3RhdHVzQ2hhbm5lbCgKKyAgICAgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yICZmbXFEZXNjKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihmbXFEZXNjKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVZhbGlkICA9IHRydWU7CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlID0gc3RkOjptb3ZlKHF1ZXVlKTsKK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtVmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6bmVlZHNTeW5jKCkgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIHJldHVybiBhdmFpbCArIGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPCBrTnVtRWxlbWVudHNJblF1ZXVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCkgeworICAgIGlmIChtVmFsaWQgJiYgcGVuZGluZy5zaXplKCkgPiAwKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBhdmFpbCA9IHN0ZDo6bWluKGF2YWlsLCBwZW5kaW5nLnNpemUoKSk7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgYXZhaWw7ICsraSkgeworICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGluZz8KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICBwb3N0ZWQucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgQnVmZmVyU3RhdHVzIHN0YXR1cywgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBzaXplX3QgbnVtUGVuZGluZyA9IHBlbmRpbmcuc2l6ZSgpOworICAgICAgICBpZiAoYXZhaWwgPj0gbnVtUGVuZGluZyArIDEpIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgcmVsZWFzZSwgbWVzc2FnZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGVuZGluZzsgKytpKSB7CisgICAgICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgICAgIHJlbGVhc2UuYnVmZmVySWQgPSBpZDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJnJlbGVhc2UsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nPworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkID0gdGFyZ2V0SWQ7CisgICAgICAgICAgICAvLyBUT0RPIDogdGltZXNhdGFtcAorICAgICAgICAgICAgbWVzc2FnZS50aW1lc3RhbXBVcyA9IDA7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4YTkyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJTVEFUVVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJTVEFUVVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLyoqIFJldHVybnMgbW9ub3RvbmljIHRpbWVzdGFtcCBpbiBVcyBzaW5jZSBmaXhlZCBwb2ludCBpbiB0aW1lLiAqLworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKTsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2YgRk1RIGZvciBhIGJ1ZmZlciBwb29sLiBidWZmZXIgb3duZXJzaGlwL3N0YXR1cyBjaGFuZ2UKKyAqIG1lc3NhZ2VzIGFyZSBzZW50IHZpYSB0aGUgRk1RcyBmcm9tIHRoZSBjbGllbnRzLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNPYnNlcnZlciB7Citwcml2YXRlOgorICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPj4KKyAgICAgICAgICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXM7CisKK3B1YmxpYzoKKyAgICAvKiogQ3JlYXRlcyBhbiBGTVEgZm9yIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBkb3VibGUgcHRyIG9mIGNyZWF0ZWQgRk1RJ3MgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgRk1RIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBvcGVuKENvbm5lY3Rpb25JZCBpZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cik7CisKKyAgICAvKiogQ2xvc2VzIGFuIEZNUSBmb3IgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBzcGVjaWZpZWQgY2xpZW50LgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGlkKTsKKworICAgIC8qKiBSZXRyaWV2ZXMgYWxsIHBlbmRpbmcgRk1RIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgZnJvbSBjbGllbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VzICByZXRyaWV2ZWQgcGVuZGluZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIGdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKTsKK307CisKKy8qKgorICogQW4gRk1RIGZvciBhIGJ1ZmZlciBwb29sIGNsaWVudC4gQnVmZmVyIG93bmVyc2hpcC9zdGF0dXMgY2hhbmdlIG1lc3NhZ2VzCisgKiBhcmUgc2VudCB2aWEgdGhlIGZtcSB0byB0aGUgYnVmZmVyIHBvb2wuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c0NoYW5uZWwgeworcHJpdmF0ZToKKyAgICBib29sIG1WYWxpZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IG1CdWZmZXJTdGF0dXNRdWV1ZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRvIGFuIEZNUSBmcm9tIGEgZGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzYyAgIERlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqLworICAgIEJ1ZmZlclN0YXR1c0NoYW5uZWwoY29uc3QgUXVldWVEZXNjcmlwdG9yICZmbXFEZXNjKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5LiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIG5lZWRzIHRvIGJlIHN5bmNlZCBmcm9tIHRoZSBidWZmZXIgcG9vbCAqLworICAgIGJvb2wgbmVlZHNTeW5jKCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2UgdG8gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwZW5kaW5nICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBwb3N0ZWQgICAgICAgIHBvc3RlZCBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSByZWdhcmRpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIKKyAgICAgKiB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgYnVmZmVyIElkIG9mIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHN0YXR1cyAgICAgICAgbmV3IHN0YXR1cyBvZiB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0SWQgICAgICBjb25uZWN0aW9uIElkIG9mIHRoZSByZWNlaXZlcihvbmx5IHdoZW4gdGhlIHNlbmRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RzIGEgc3RhdHVzIG1lc3NhZ2UpLgorICAgICAqIEBwYXJhbSBwZW5kaW5nICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBwb3N0ZWQgICAgICAgIHBvc3RlZCBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIHNwZWNpZmllZCBtZXNzYWdlIGlzIHBvc3RlZCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgcG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJTVEFUVVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ2xpZW50TWFuYWdlci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9DbGllbnRNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2VhMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ2xpZW50TWFuYWdlci5jcHAKQEAgLTAsMCArMSw1MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sTWFuYWdlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVnaXN0ZXJUaW1lb3V0VXMgPSA1MDAwMDA7IC8vIDAuNSBzZWMKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiAxIHNlYyB0dW5lCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsaWVudFRpbWVvdXRVcyA9IDUwMDAwMDA7IC8vIFRPRE86IDUgc2VjcyB0dW5lCisKKy8qKgorICogVGhlIGhvbGRlciBvZiB0aGUgY29va2llIG9mIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAqIFRoZSBjb29raWUgaXMgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBmb3IgZWFjaCBJQ2xpZW50TWFuYWdlci4KKyAqIChUaGUgY29va2llIGlzIHVzZWQgdG8gbm90aWZ5IGRlYXRoIG9mIGNsaWVudHMgdG8gYnVmZmVycG9vbCBwcm9jZXNzLikKKyAqLworY2xhc3MgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvb2tpZSBob2xkZXIgZm9yIHJlbW90ZSBJQ2xpZW50TWFuYWdlcihzKS4KKyAgICAgKi8KKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgY29va2llIGZvciBhIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyICAgdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICogQHBhcmFtIGFkZGVkICAgICB0cnVlIHdoZW4gdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIgaXMgYWRkZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIG5ld2x5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGNvb2tpZSBmb3IgdGhlIHNwZWNpZmllZCBJQ2xpZW50TWFuYWdlci4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBnZXRDb29raWUoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLCBib29sICphZGRlZCk7CisKK3ByaXZhdGU6CisgICAgdWludDY0X3QgbVNlcUlkOworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQ2xpZW50TWFuYWdlcj4sIHVpbnQ2NF90Pj4gbU1hbmFnZXJzOworfTsKKworQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Q2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpIDogbVNlcUlkKDApe30KKwordWludDY0X3QgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Z2V0Q29va2llKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsCisgICAgICAgIGJvb2wgKmFkZGVkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byBpdCA9IG1NYW5hZ2Vycy5iZWdpbigpOyBpdCAhPSBtTWFuYWdlcnMuZW5kKCk7KSB7CisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiBrZXkgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlc0VxdWFsKGtleSwgbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAqYWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCA9IG1NYW5hZ2Vycy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDY0X3QgaWQgPSBtU2VxSWQrKzsKKyAgICAqYWRkZWQgPSB0cnVlOworICAgIG1NYW5hZ2Vycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobWFuYWdlciwgaWQpKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKK2NsYXNzIENsaWVudE1hbmFnZXI6OkltcGwgeworcHVibGljOgorICAgIEltcGwoKTsKKworICAgIC8vIEJuUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvLyBCcFJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKK3ByaXZhdGU6CisgICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCBkZWFkbG9jayBiZXR3ZWVuIG11bHRpcGxlIGxvY2tzLAorICAgIC8vIGFsd2F5cyBsb2NrIENsaWVudENhY2hlLmxvY2sgYmVmb3JlIGxvY2tpbmcgQWN0aXZlQ2xpZW50cy5sb2NrLgorICAgIHN0cnVjdCBDbGllbnRDYWNoZSB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgd2hpbGUgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUFjY2Vzc29yPiwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25uZWN0Q3Y7CisgICAgICAgIGJvb2wgbUNvbm5lY3Rpbmc7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisKKyAgICAgICAgQ2xpZW50Q2FjaGUoKSA6IG1Db25uZWN0aW5nKGZhbHNlKSwgbUxhc3RDbGVhblVwVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBBY3RpdmUgY2xpZW50cyB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHZpYSBDb25uZWN0aW9uSWQKKyAgICBzdHJ1Y3QgQWN0aXZlQ2xpZW50cyB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgIH0gbUFjdGl2ZTsKKworICAgIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgbVJlbW90ZUNsaWVudENvb2tpZXM7Cit9OworCitDbGllbnRNYW5hZ2VyOjpJbXBsOjpJbXBsKCkge30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgY2xlYW5VcCgpOworICAgIGludDY0X3QgdGltZW91dFVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrUmVnaXN0ZXJUaW1lb3V0VXM7CisgICAgZG8geworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gc0FjY2Vzc29yID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzQWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKHNBY2Nlc3NvciwgYWNjZXNzb3IpKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlLm1DbGllbnRzLmZpbmQoKnBDb25uZWN0aW9uSWQpICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlciBleGlzdGluZyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQ2FjaGUubUNvbm5lY3RpbmcpIHsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IHRydWU7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgUmVzdWx0U3RhdHVzIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3Nvcik7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmUubUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgbmV3IGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0aW5nID0gZmFsc2U7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBtQ2FjaGUubUNvbm5lY3RDdi53YWl0X2ZvcigKKyAgICAgICAgICAgICAgICBsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGtSZWdpc3RlclRpbWVvdXRVcykpOworICAgIH0gd2hpbGUgKGdldFRpbWVzdGFtcE5vdygpIDwgdGltZW91dFVzKTsKKyAgICAvLyBUT0RPOiByZXR1cm4gdGltZW91dCBlcnJvcgorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICBib29sIGxvY2FsID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoc2VuZGVySWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIGxvY2FsID0gaXQtPnNlY29uZC0+aXNMb2NhbCgpOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgcnMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IHJlY2VpdmVyLT5yZWdpc3RlclNlbmRlcigKKyAgICAgICAgICAgICAgICBhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICBbJnJzLCByZWNlaXZlcklkXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgICAgICAgICAgICAgICAgICBycyA9IHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgKnJlY2VpdmVySWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbCAmJiBycyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudCA9IEFjY2Vzc29yOjpnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKyAgICAgICAgICAgIGlmIChyZWNpcGllbnQpICB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCBkZWF0aCByZWNpcGllbnQgcmVnaXN0ZXJlZCAlbGxkIiwgKGxvbmcgbG9uZykqcmVjZWl2ZXJJZCk7CisgICAgICAgICAgICAgICAgYm9vbCBhZGRlZDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBjb29raWUgPSBtUmVtb3RlQ2xpZW50Q29va2llcy5nZXRDb29raWUocmVjZWl2ZXIsICZhZGRlZCk7CisgICAgICAgICAgICAgICAgcmVjaXBpZW50LT5hZGRDb29raWVUb0Nvbm5lY3Rpb24oY29va2llLCAqcmVjZWl2ZXJJZCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IHJlY2VpdmVyLT5saW5rVG9EZWF0aChyZWNpcGllbnQsIGNvb2tpZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByczsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNvbnN0IHNwPEFjY2Vzc29yPiBhY2Nlc3NvciA9IG5ldyBBY2Nlc3NvcihhbGxvY2F0b3IpOworICAgIGlmICghYWNjZXNzb3IgfHwgIWFjY2Vzc29yLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3Nvcik7CisgICAgaWYgKCFjbGllbnQgfHwgIWNsaWVudC0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICAvLyBTaW5jZSBhIG5ldyBidWZmZXJwb29sIGlzIGNyZWF0ZWQsIGV2aWN0IG1lbW9yaWVzIHdoaWNoIGFyZSB1c2VkIGJ5CisgICAgLy8gZXhpc3RpbmcgYnVmZmVycG9vbHMgYW5kIGNsaWVudHMuCisgICAgY2xlYW5VcCh0cnVlKTsKKyAgICB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBpbnNlcnQgZmFpbC4gKG1hbGxvYyBmYWlsKQorICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubU11dGV4KTsKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICBtQ2FjaGUubUNsaWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29yLCB3Y2xpZW50KSk7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgIG1BY3RpdmUubUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBjbGllbnQpKTsKKyAgICAgICAgfQorICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNvbklkOworICAgICAgICBBTE9HVigiY3JlYXRlIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sxKG1DYWNoZS5tTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIG1BY3RpdmUubUNsaWVudHMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgZm9yIChhdXRvIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBjaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGVhZCBjbGllbnQgY2FjaGVzCisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGNBY2Nlc3NvciA9IGNpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFjQWNjZXNzb3IgfHwgKGFjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChjQWNjZXNzb3IsIGFjY2Vzc29yKSkpIHsKKyAgICAgICAgICAgICAgICBjaXQgPSBtQ2FjaGUubUNsaWVudHMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2l0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkID0gYnVmZmVyLT5tQ29ubmVjdGlvbklkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmdldEFjY2Vzc29yKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBzcDxJQWNjZXNzb3I+ICphY2Nlc3NvcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5nZXRBY2Nlc3NvcihhY2Nlc3Nvcik7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGludDY0X3QgbGFzdFRyYW5zYWN0aW9uVXM7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sxKG1DYWNoZS5tTXV0ZXgpOworICAgIGlmIChjbGVhckNhY2hlIHx8IG1DYWNoZS5tTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcyA8IG5vdykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBpbnQgY2xlYW5lZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aXNBY3RpdmUoJmxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0VHJhbnNhY3Rpb25VcyArIGtDbGllbnRUaW1lb3V0VXMgPCBub3cpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgKytjbGVhbmVkOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrY2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCIjIG9mIGNsZWFuZWQgY29ubmVjdGlvbnM6ICVkIiwgY2xlYW5lZCk7CisgICAgICAgIG1DYWNoZS5tTGFzdENsZWFuVXBVcyA9IG5vdzsKKyAgICB9Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNsaWVudE1hbmFnZXIgZm9sbG93LgorUmV0dXJuPHZvaWQ+IENsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkID0gLTE7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIoYnVmZmVyUG9vbCwgJmNvbm5lY3Rpb25JZCk7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SLCAtMSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8vIE1ldGhvZHMgZm9yIGxvY2FsIHVzZS4KK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZTsKK3N0ZDo6bXV0ZXggQ2xpZW50TWFuYWdlcjo6c0luc3RhbmNlTG9jazsKKworc3A8Q2xpZW50TWFuYWdlcj4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0luc3RhbmNlTG9jayk7CisgICAgaWYgKCFzSW5zdGFuY2UpIHsKKyAgICAgICAgc0luc3RhbmNlID0gbmV3IENsaWVudE1hbmFnZXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KKworQ2xpZW50TWFuYWdlcjo6Q2xpZW50TWFuYWdlcigpIDogbUltcGwobmV3IEltcGwoKSkge30KKworQ2xpZW50TWFuYWdlcjo6fkNsaWVudE1hbmFnZXIoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jcmVhdGUoYWxsb2NhdG9yLCBwQ29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgc2VuZGVySWQsIHJlY2VpdmVySWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVjZWl2ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90KiB0aW1lc3RhbXBVcykgeworICAgIGlmIChtSW1wbCAmJiBidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6Y2xlYW5VcCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAodHJ1ZSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OGY1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDb25uZWN0aW9uOjpmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBpZiAoYnVmZmVySWQgIT0gU1lOQ19CVUZGRVJJRCkgeworICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzID0gbUFjY2Vzc29yLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBCdWZmZXJ7YnVmZmVySWQsIGhhbmRsZX0pOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXR1cywgQnVmZmVyezAsIG51bGxwdHJ9KTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitDb25uZWN0aW9uOjpDb25uZWN0aW9uKCkgOiBtSW5pdGlhbGl6ZWQoZmFsc2UpLCBtQ29ubmVjdGlvbklkKC0xTEwpIHt9CisKK0Nvbm5lY3Rpb246On5Db25uZWN0aW9uKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIG1BY2Nlc3Nvci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb246OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiYgYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICBtQWNjZXNzb3IgPSBhY2Nlc3NvcjsKKyAgICAgICAgbUNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBDb25uZWN0aW9uOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBDb25uZWN0aW9uOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIG1BY2Nlc3Nvci0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICB9Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlIGZvbGxvdy4KKworLy9JQ29ubmVjdGlvbiogSElETF9GRVRDSF9JQ29ubmVjdGlvbihjb25zdCBjaGFyKiAvKiBuYW1lICovKSB7CisvLyAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5Y2I2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ09OTkVDVElPTl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6QWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbm5lY3Rpb24gOiBwdWJsaWMgSUNvbm5lY3Rpb24geworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNvbm5lY3Rpb24gZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gUmVjeWNsZXMgYSBidWZmZXIgaWYKKyAgICAgKiBpdCBpcyBwb3NzaWJsZS4gVGhlIHJldHVybmVkIGJ1ZmZlciBjYW4gYmUgdHJhbnNmZXJyZWQgdG8gb3RoZXIgcmVtb3RlCisgICAgICogY2xpZW50cyhDb25uZWN0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgSWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb3JtcyBwZXJpb2RpYyBjYWNoZSBjbGVhbmluZworICAgICAqIGZyb20gYnVmZmVycG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgYnVmZmVycG9vbCBmcmVlcyBhbGwgYnVmZmVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgY29ubmVjdGlvbi4gKi8KKyAgICB+Q29ubmVjdGlvbigpOworCisgICAgLyoqIENyZWF0ZXMgYSBjb25uZWN0aW9uLiAqLworICAgIENvbm5lY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHdpdGggdGhlIHNwZWNpZmllZCBidWZmZXIgcG9vbCBhbmQgdGhlIGNvbm5lY3Rpb24gaWQuCisgICAgICogVGhlIGNvbm5lY3Rpb24gaWQgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgd2hvbGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc29yICAgICAgdGhlIHNwZWNpZmllZCBidWZmZXIgcG9vbC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBJZC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBTWU5DX0JVRkZFUklEID0gVUlOVDMyX01BWCwKKyAgICB9OworCitwcml2YXRlOgorICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIHNwPEFjY2Vzc29yPiBtQWNjZXNzb3I7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwZjAxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTFRZUEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTFRZUEVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworCitzdHJ1Y3QgQnVmZmVyUG9vbERhdGEgeworICAgIC8vIEZvciBsb2NhbCB1c2UsIHRvIHNwZWNpZnkgYSBidWZmZXJwb29sIChjbGllbnQgY29ubmVjdGlvbikgZm9yIGJ1ZmZlcnMuCisgICAgLy8gUmV0dXJuIHZhbHVlIGZyb20gY29ubmVjdCNJQWNjZXNzb3IoYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCkuCisgICAgaW50NjRfdCBtQ29ubmVjdGlvbklkOworICAgIC8vIEJ1ZmZlcklkCisgICAgdWludDMyX3QgbUlkOworCisgICAgQnVmZmVyUG9vbERhdGEoKSA6IG1Db25uZWN0aW9uSWQoMCksIG1JZCgwKSB7fQorCisgICAgQnVmZmVyUG9vbERhdGEoCisgICAgICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgaWQpCisgICAgICAgICAgICA6IG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgbUlkKGlkKSB7fQorCisgICAgfkJ1ZmZlclBvb2xEYXRhKCkge30KK307CisKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7CisKK3R5cGVkZWYgdWludDMyX3QgQnVmZmVySWQ7Cit0eXBlZGVmIHVpbnQ2NF90IFRyYW5zYWN0aW9uSWQ7Cit0eXBlZGVmIGludDY0X3QgQ29ubmVjdGlvbklkOworCitlbnVtIDogQ29ubmVjdGlvbklkIHsKKyAgICBJTlZBTElEX0NPTk5FQ1RJT05JRCA9IDAsCit9OworCit0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU8QnVmZmVyU3RhdHVzTWVzc2FnZSwga1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQnVmZmVyU3RhdHVzUXVldWU7Cit0eXBlZGVmIEJ1ZmZlclN0YXR1c1F1ZXVlOjpEZXNjcmlwdG9yIFF1ZXVlRGVzY3JpcHRvcjsKKworLyoqCisgKiBBbGxvY2F0aW9uIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitzdHJ1Y3QgQnVmZmVyUG9vbEFsbG9jYXRpb24geworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgeworICAgICAgICByZXR1cm4gbUhhbmRsZTsKKyAgICB9CisKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgOiBtSGFuZGxlKGhhbmRsZSkge30KKworICAgIH5CdWZmZXJQb29sQWxsb2NhdGlvbigpIHt9OworfTsKKworLyoqCisgKiBBbGxvY2F0b3Igd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworcHVibGljOgorCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYW4gYWxsb2NhdGlvbihidWZmZXIpIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIGFsbG9jICAgICBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHNpemUgb2YgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIG9mIGFuIG9sZCBhbGxvY2F0aW9uIGFyZQorICAgICAqIGNvbXBhdGlibGUgd2l0aCBuZXcgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTFRZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNTc3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DTElFTlRNQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ0xJRU5UTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJCdWZmZXJQb29sVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENsaWVudE1hbmFnZXIgOiBwdWJsaWMgSUNsaWVudE1hbmFnZXIgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNsaWVudE1hbmFnZXIgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiByZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqIEdldHMgYW4gaW5zdGFuY2UuICovCisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IGdldEluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbG9jYWwgY29ubmVjdGlvbiB3aXRoIGEgbmV3bHkgY3JlYXRlZCBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgICAgIGZvciBuZXcgYnVmZmVyIGFsbG9jYXRpb24uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgSWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbi4gVGhpcyBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbS13aWRlIHVuaXF1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBwb29sIGFuZCBhIGxvY2FsIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5CisgICAgICogICAgICAgICBjcmVhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjcmVhdGVkIGNvbm5lY3Rpb24gYXMgc2VuZGVyIGZvciByZW1vdGUgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlciAgICAgIFRoZSByZW1vdGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHNlbmRlcklkICAgICAgQSBsb2NhbCBjb25uZWN0aW9uIHdoaWNoIHdpbGwgc2VuZCBidWZmZXJzIHRvLgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIElkIG9mIHRoZSBjcmVhdGVkIHJlY2VpdmluZyBjb25uZWN0aW9uIG9uIHRoZSByZWNlaXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIG9uIHRoZQorICAgICAqICAgICAgICAgcmVjZWl2ZXIgcHJvY2Vzcy4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzZW5kZXIgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQUxSRUFEWV9FWElTVFMgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uIGlzIGFscmVhZHkgbWFkZS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgVGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyBhbGxvY2F0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFJlY2VpdmVzIGEgYnVmZmVyIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIFRoZSBpZCBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIFRoZSBpZCBmb3IgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgaXMgYmVpbmcgc2VudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSByZWNlaXZlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdG8gdGhlIGJ1ZmZlciBwb29sLiBTZW5kcyBhIGJ1ZmZlcgorICAgICAqIHRvIG90aGVyIHJlbW90ZSBjbGllbnRzKGNvbm5lY3Rpb24pIGFmdGVyIHRoaXMgY2FsbCBoYXMgYmVlbiBzdWNjZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBUaGUgaWQgb2YgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIHRvIHRyYW5zZmVyCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgSWQgb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciB0cmFuc2FjdGlvbiBpcyBiZWluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzZW5kaW5nIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgLyoqCisgICAgICogIFRpbWUgb3V0IGluYWN0aXZlIGxpbmdlcmluZyBjb25uZWN0aW9ucyBhbmQgY2xvc2UuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKCk7CisKKyAgICAvKiogRGVzdHJ1Y3RzIHRoZSBtYW5hZ2VyIG9mIGJ1ZmZlciBwb29sIGNsaWVudHMuICAqLworICAgIH5DbGllbnRNYW5hZ2VyKCk7Citwcml2YXRlOgorICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBzSW5zdGFuY2U7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggc0luc3RhbmNlTG9jazsKKworICAgIGNsYXNzIEltcGw7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworCisgICAgQ2xpZW50TWFuYWdlcigpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NMSUVOVE1BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVhNzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMV8wVGFyZ2V0U2luZ2xlVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJzaW5nbGUuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDEuMCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYxXzBUYXJnZXRNdWx0aVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAibXVsdGkuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDEuMCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzNlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTCkBAIC0wLDAgKzEsOSBAQAorIyBNZWRpYSB0ZWFtCitsYWpvc0Bnb29nbGUuY29tCitwYXdpbkBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KKworIyBWVFMgdGVhbQoreWltQGdvb2dsZS5jb20KK3podW95YW9AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNmN2VhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VuaW9uIFBhcmFtcyB7CisgIHN0cnVjdCB7CisgICAgdWludDMyX3QgY2FwYWNpdHk7CisgIH0gZGF0YTsKKyAgdWludDhfdCBhcnJheVswXTsKKyAgUGFyYW1zKCkgOiBkYXRhezB9IHt9CisgIFBhcmFtcyh1aW50MzJfdCBzaXplKQorICAgICAgOiBkYXRhe3NpemV9IHt9Cit9OworCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBIYW5kbGVBc2htZW0gOiBwdWJsaWMgbmF0aXZlX2hhbmRsZV90IHsKKyAgSGFuZGxlQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IHNpemUpCisgICAgOiBuYXRpdmVfaGFuZGxlX3QoY0hlYWRlciksCisgICAgbUZkc3sgYXNobWVtRmQgfSwKKyAgICBtSW50c3sgaW50IChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpYyB9IHt9CisKKyAgaW50IGFzaG1lbUZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQXNobWVtOyB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBzaXplX3QodW5zaWduZWQobUludHMubVNpemVMbykpCisgICAgICAgIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKG1JbnRzLm1TaXplSGkpKSA8PCAzMik7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pOworCitwcm90ZWN0ZWQ6CisgIHN0cnVjdCB7CisgICAgaW50IG1Bc2htZW07CisgIH0gbUZkczsKKyAgc3RydWN0IHsKKyAgICBpbnQgbVNpemVMbzsKKyAgICBpbnQgbVNpemVIaTsKKyAgICBpbnQgbU1hZ2ljOworICB9IG1JbnRzOworCitwcml2YXRlOgorICBlbnVtIHsKKyAgICBrTWFnaWMgPSAnYWhtXHgwMCcsCisgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgbnVtSW50cyA9IHNpemVvZihtSW50cykgLyBzaXplb2YoaW50KSwKKyAgICB2ZXJzaW9uID0gc2l6ZW9mKG5hdGl2ZV9oYW5kbGVfdCkKKyAgfTsKKyAgY29uc3Qgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCBjSGVhZGVyOworfTsKKworY29uc3QgbmF0aXZlX2hhbmRsZV90IEhhbmRsZUFzaG1lbTo6Y0hlYWRlciA9IHsKKyAgSGFuZGxlQXNobWVtOjp2ZXJzaW9uLAorICBIYW5kbGVBc2htZW06Om51bUZkcywKKyAgSGFuZGxlQXNobWVtOjpudW1JbnRzLAorICB7fQorfTsKKworYm9vbCBIYW5kbGVBc2htZW06OmlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3QgbykgeworICBpZiAoIW8gfHwgbWVtY21wKG8sICZjSGVhZGVyLCBzaXplb2YoY0hlYWRlcikpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihvKTsKKyAgcmV0dXJuIG90aGVyLT5tSW50cy5tTWFnaWMgPT0ga01hZ2ljOworfQorCitjbGFzcyBBbGxvY2F0aW9uQXNobWVtIHsKK3ByaXZhdGU6CisgIEFsbG9jYXRpb25Bc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3QgY2FwYWNpdHksIGJvb2wgcmVzKQorICAgIDogbUhhbmRsZShhc2htZW1GZCwgY2FwYWNpdHkpLAorICAgICAgbUluaXQocmVzKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBBbGxvY2F0aW9uQXNobWVtICpBbGxvYyhzaXplX3Qgc2l6ZSkgeworICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgY2hhciAqa0FsbG9jYXRpb25UYWcgPSAiYnVmZmVycG9vbF90ZXN0IjsKKyAgICBpbnQgYXNobWVtRmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbihrQWxsb2NhdGlvblRhZywgc2l6ZSk7CisgICAgcmV0dXJuIG5ldyBBbGxvY2F0aW9uQXNobWVtKGFzaG1lbUZkLCBzaXplLCBhc2htZW1GZCA+PSAwKTsKKyAgfQorCisgIH5BbGxvY2F0aW9uQXNobWVtKCkgeworICAgIGlmIChtSW5pdCkgeworICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZSgmbUhhbmRsZSk7CisgICAgfQorICB9CisKKyAgY29uc3QgSGFuZGxlQXNobWVtICpoYW5kbGUoKSB7CisgICAgcmV0dXJuICZtSGFuZGxlOworICB9CisKK3ByaXZhdGU6CisgIEhhbmRsZUFzaG1lbSBtSGFuZGxlOworICBib29sIG1Jbml0OworICAvLyBUT0RPOiBtYXBwaW5nIGFuZCBtYXAgZmQKK307CisKK3N0cnVjdCBBbGxvY2F0aW9uRHRvciB7CisgIEFsbG9jYXRpb25EdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiAmYWxsb2MpCisgICAgICA6IG1BbGxvYyhhbGxvYykge30KKworICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbEFsbG9jYXRpb24gKnBvb2xBbGxvYykgeyBkZWxldGUgcG9vbEFsbG9jOyB9CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+IG1BbGxvYzsKK307CisKK30KKworCitSZXN1bHRTdGF0dXMgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OmFsbG9jYXRlKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgc2l6ZV90ICphbGxvY1NpemUpIHsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtczsKKyAgbWVtY3B5KCZhc2htZW1QYXJhbXMsIHBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihQYXJhbXMpLCBwYXJhbXMuc2l6ZSgpKSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+IGFzaG1lbUFsbG9jID0KKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPigKKyAgICAgICAgICBBbGxvY2F0aW9uQXNobWVtOjpBbGxvYyhhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eSkpOworICBpZiAoYXNobWVtQWxsb2MpIHsKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGFzaG1lbUFsbG9jLT5oYW5kbGUoKSk7CisgICAgaWYgKHB0cikgeworICAgICAgKmFsbG9jID0gc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPihwdHIsIEFsbG9jYXRpb25EdG9yKGFzaG1lbUFsbG9jKSk7CisgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgKmFsbG9jU2l6ZSA9IGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5OworICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgfQorICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OmNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSB7CisgIHNpemVfdCBuZXdTaXplID0gbmV3UGFyYW1zLnNpemUoKTsKKyAgc2l6ZV90IG9sZFNpemUgPSBvbGRQYXJhbXMuc2l6ZSgpOworICBpZiAobmV3U2l6ZSA9PSBvbGRTaXplKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdTaXplOyArK2kpIHsKKyAgICAgIGlmIChuZXdQYXJhbXNbaV0gIT0gb2xkUGFyYW1zW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgby0+c2l6ZSgpOyArK2kpIHsKKyAgICAgIHB0cltpXSA9IHZhbDsKKyAgICB9CisgICAgbXVubWFwKHB0ciwgby0+c2l6ZSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgby0+c2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChwdHJbaV0gIT0gdmFsKSB7CisgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgbXVubWFwKHB0ciwgby0+c2l6ZSgpKTsKKyAgICByZXR1cm4gcmVzOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQga0FsbG9jYXRpb25TaXplID0gMTAyNCAqIDEwOworICBQYXJhbXMgYXNobWVtUGFyYW1zKGtBbGxvY2F0aW9uU2l6ZSk7CisKKyAgcGFyYW1zLT5hc3NpZ24oYXNobWVtUGFyYW1zLmFycmF5LCBhc2htZW1QYXJhbXMuYXJyYXkgKyBzaXplb2YoYXNobWVtUGFyYW1zKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2ZTVmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMV8wX0FMTE9DQVRPUl9ICisjZGVmaW5lIFZOREtfSElETF9CVUZGRVJQT09MX1YxXzBfQUxMT0NBVE9SX0gKKworI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yOworCisvLyBidWZmZXIgYWxsb2NhdG9yIGZvciB0aGUgdGVzdHMKK2NsYXNzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yIDogcHVibGljIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworIHB1YmxpYzoKKyAgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSB7fQorCisgIH5UZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIG92ZXJyaWRlIHt9CisKKyAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSBvdmVycmlkZTsKKworICBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIEZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKTsKKworICBzdGF0aWMgYm9vbCBWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKTsKKworfTsKKworLy8gcmV0cmlldmUgYnVmZmVyIGFsbG9jYXRvciBwYXJhbXRlcnMKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworI2VuZGlmICAvLyBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMV8wX0FMTE9DQVRPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzk2ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSB0eXBlcyBiZXR3ZWVuIHByb2Nlc3Nlcy4KK2VudW0gUGlwZUNvbW1hbmQgOiBpbnQzMl90IHsKKyAgICBJTklUX09LID0gMCwKKyAgICBJTklUX0VSUk9SLAorICAgIFNFTkQsCisgICAgUkVDRUlWRV9PSywKKyAgICBSRUNFSVZFX0VSUk9SLAorfTsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIGJldHdlZW4gcHJvY2Vzc2VzLgordW5pb24gUGlwZU1lc3NhZ2UgeworICAgIHN0cnVjdCAgeworICAgICAgICBpbnQzMl90IGNvbW1hbmQ7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgICAgIGludDY0X3QgIHRpbWVzdGFtcFVzOworICAgIH0gZGF0YTsKKyAgICBjaGFyIGFycmF5WzBdOworfTsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sTXVsdGlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtUmVjZWl2ZXJQaWQgPSAtMTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1Db21tYW5kUGlwZUZkcykgPT0gMCk7CisgICAgQVNTRVJUX1RSVUUocGlwZShtUmVzdWx0UGlwZUZkcykgPT0gMCk7CisKKyAgICBtUmVjZWl2ZXJQaWQgPSBmb3JrKCk7CisgICAgQVNTRVJUX1RSVUUobVJlY2VpdmVyUGlkID49IDApOworCisgICAgaWYgKG1SZWNlaXZlclBpZCA9PSAwKSB7CisgICAgICBkb1JlY2VpdmVyKCk7CisgICAgICAvLyBJbiBvcmRlciB0byBpZ25vcmUgZ3Rlc3QgYmVoYXZpb3VyLCB3YWl0IGZvciBiZWluZyBraWxsZWQgZnJvbQorICAgICAgLy8gdGVhckRvd24KKyAgICAgIHBhdXNlKCk7CisgICAgfQorCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobVJlY2VpdmVyUGlkID4gMCkgeworICAgICAga2lsbChtUmVjZWl2ZXJQaWQsIFNJR0tJTEwpOworICAgICAgaW50IHdzdGF0dXM7CisgICAgICB3YWl0KCZ3c3RhdHVzKTsKKyAgICB9CisKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIHBpZF90IG1SZWNlaXZlclBpZDsKKyAgaW50IG1Db21tYW5kUGlwZUZkc1syXTsKKyAgaW50IG1SZXN1bHRQaXBlRmRzWzJdOworCisgIGJvb2wgc2VuZE1lc3NhZ2UoaW50ICpwaXBlcywgY29uc3QgUGlwZU1lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gd3JpdGUocGlwZXNbMV0sIG1lc3NhZ2UuYXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIGJvb2wgcmVjZWl2ZU1lc3NhZ2UoaW50ICpwaXBlcywgUGlwZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gcmVhZChwaXBlc1swXSwgbWVzc2FnZS0+YXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgZG9SZWNlaXZlcigpIHsKKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDEsIGZhbHNlKTsKKyAgICBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoIW1NYW5hZ2VyKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJBc1NlcnZpY2UoKTsKKyAgICBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKworICAgIHJlY2VpdmVNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgJm1lc3NhZ2UpOworICAgIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmhhbmRsZSA9IG51bGxwdHI7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHJidWZmZXI7CisgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUoCisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkLCBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMsICZyaGFuZGxlLCAmcmJ1ZmZlcik7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCk7CisgICAgICBpZiAoc3RhdHVzICE9IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKCFUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJoYW5kbGUsIDB4NzcpKSB7CisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9FUlJPUjsKKyAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICB9Cit9OworCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdCBiZXR3ZWVuIHByb2Nlc3Nlcy4KK1RFU1RfRihCdWZmZXJwb29sTXVsdGlUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBQaXBlTWVzc2FnZSBtZXNzYWdlOworCisgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworCisgIGFuZHJvaWQ6OnNwPElDbGllbnRNYW5hZ2VyPiByZWNlaXZlciA9IElDbGllbnRNYW5hZ2VyOjpnZXRTZXJ2aWNlKCk7CisgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkOworICBBU1NFUlRfVFJVRSgoYm9vbClyZWNlaXZlcik7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBtQ29ubmVjdGlvbklkLCAmcmVjZWl2ZXJJZCk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgeworICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyOworICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICBpbnQ2NF90IHBvc3RVczsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisKKyAgICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZzaGFuZGxlLCAmc2J1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoc2hhbmRsZSwgMHg3NykpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpTRU5EOworICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCA9IHNidWZmZXItPm1JZDsKKyAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkID0gcmVjZWl2ZXJJZDsKKyAgICBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzID0gcG9zdFVzOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgIH0KKyAgRVhQRUNUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHNldGVudigiVFJFQkxFX1RFU1RJTkdfT1ZFUlJJREUiLCAidHJ1ZSIsIHRydWUpOworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL3NpbmdsZS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvc2luZ2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNlYjYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL3NpbmdsZS5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KK2NvbnN0ZXhwciBzdGF0aWMgaW50IGtOdW1BbGxvY2F0aW9uVGVzdCA9IDM7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciByZWN5Y2xpbmcgdGVzdC4KK2NvbnN0ZXhwciBzdGF0aWMgaW50IGtOdW1SZWN5Y2xlVGVzdCA9IDM7CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbFNpbmdsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihtTWFuYWdlciwgbUNvbm5lY3Rpb25JZCwgJm1SZWNlaXZlcklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUyAmJgorICAgICAgICAgICAgICAgIG1SZWNlaXZlcklkID09IG1Db25uZWN0aW9uSWQpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcklkOworCit9OworCisvLyBCdWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBlYWNoIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGRvbmUgc3VjY2Vzc2Z1bGx5IHdpdGgKKy8vIHVuaXF1ZSBidWZmZXIgaWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIEFsbG9jYXRlQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcltrTnVtQWxsb2NhdGlvblRlc3RdOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcltpXSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraikgeworICAgICAgQVNTRVJUX1RSVUUoYnVmZmVyW2ldLT5tSWQgIT0gYnVmZmVyW2pdLT5tSWQpOworICAgIH0KKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtQWxsb2NhdGlvblRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHJlY3ljbGUgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZGUtYWxsb2NhdGVkIGJ1ZmZlcnMgYXJlIHJlY3ljbGVkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBSZWN5Y2xlQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICBCdWZmZXJJZCBiaWRba051bVJlY3ljbGVUZXN0XTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIGJpZFtpXSA9IGJ1ZmZlci0+bUlkOworICB9CisgIGZvciAoaW50IGkgPSAxOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBBU1NFUlRfVFJVRShiaWRbaSAtIDFdID09IGJpZFtpXSk7CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bVJlY3ljbGVUZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBidWZmZXIgaXMgdHJhbnNmZXJyZWQgdG8gYW5vdGhlciBjbGllbnQgc3VjY2Vzc2Z1bGx5LgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlciwgcmJ1ZmZlcjsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqcmVjdkhhbmRsZSA9IG51bGxwdHI7CisKKyAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICBpbnQ2NF90IHBvc3RVczsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZzYnVmZmVyKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChhbGxvY0hhbmRsZSwgMHg3NykpOworICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQobVJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZShtUmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgc2J1ZmZlci0+bUlkLCBwb3N0VXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN2SGFuZGxlLCAmcmJ1ZmZlcik7CisgIEVYUEVDVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyZWN2SGFuZGxlLCAweDc3KSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiNDYwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmNwcApAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDb25uZWN0aW9uIgorCisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKyNpbmNsdWRlICJBY2Nlc3NvckltcGwuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZCgKKyAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChjb25uZWN0aW9uSWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgbUFjY2Vzc29ycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBhY2Nlc3NvcikpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OnJlbW92ZShpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtQWNjZXNzb3JzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgYXV0byBpdCA9IG1Db25uZWN0aW9uVG9Db29raWUuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQ29ubmVjdGlvblRvQ29va2llLmVuZCgpKSB7CisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoaXQpOworICAgICAgICBhdXRvIGNpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICAgICAgaWYgKGNpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgY2l0LT5zZWNvbmQuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChjaXQtPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGRDb29raWVUb0Nvbm5lY3Rpb24oCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChjb25uZWN0aW9uSWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ29ubmVjdGlvblRvQ29va2llLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGNvb2tpZSkpOworICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgaWYgKGl0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGl0LT5zZWNvbmQuaW5zZXJ0KGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIGNvb2tpZSwgc3RkOjpzZXQ8aW50NjRfdD57Y29ubmVjdGlvbklkfSkpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OnNlcnZpY2VEaWVkKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgKSB7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBjb25uZWN0aW9uc1RvQ2xvc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisKKyAgICAgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICAgICAgaWYgKGl0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gY29uSXQgPSBpdC0+c2Vjb25kLmJlZ2luKCk7IGNvbkl0ICE9IGl0LT5zZWNvbmQuZW5kKCk7ICsrY29uSXQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFjY2Vzc29ySXQgPSBtQWNjZXNzb3JzLmZpbmQoKmNvbkl0KTsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzb3JJdCAhPSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zVG9DbG9zZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmNvbkl0LCBhY2Nlc3Nvckl0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc29ycy5lcmFzZShhY2Nlc3Nvckl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZSgqY29uSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbm5lY3Rpb25zVG9DbG9zZS5zaXplKCkgPiAwKSB7CisgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gY29ubmVjdGlvbnNUb0Nsb3NlLmJlZ2luKCk7IGl0ICE9IGNvbm5lY3Rpb25zVG9DbG9zZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgYWNjZXNzb3IgPSBpdC0+c2Vjb25kLnByb21vdGUoKTsKKworICAgICAgICAgICAgaWYgKGFjY2Vzc29yKSB7CisgICAgICAgICAgICAgICAgYWNjZXNzb3ItPmNsb3NlKGl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbm5lY3Rpb24gJWxsZCBjbG9zZWQgb24gZGVhdGgiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK25hbWVzcGFjZSB7CitzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50ID0KKyAgICAgICAgbmV3IENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworfQorCitzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IEFjY2Vzc29yOjpnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKSB7CisgICAgcmV0dXJuIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OmNyZWF0ZUludmFsaWRhdG9yKCkgeworICAgIEFjY2Vzc29yOjpJbXBsOjpjcmVhdGVJbnZhbGlkYXRvcigpOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQWNjZXNzb3I6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXI+JiBvYnNlcnZlciwKKyAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIHNwPENvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICB1aW50MzJfdCBtc2dJZDsKKyAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiBmbXFEZXNjOworICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqIGludkRlc2M7CisKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gY29ubmVjdCgKKyAgICAgICAgICAgIG9ic2VydmVyLCBmYWxzZSwgJmNvbm5lY3Rpb24sICZjb25uZWN0aW9uSWQsICZtc2dJZCwgJmZtcURlc2MsICZpbnZEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uSWQsIG1zZ0lkLCAqZm1xRGVzYywgKmludkRlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgbnVsbHB0ciwgLTFMTCwgMCwKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM8QnVmZmVyU3RhdHVzTWVzc2FnZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6aGFyZHdhcmU6OkdyYW50b3JEZXNjcmlwdG9yPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogbmhhbmRsZSAqLywgMCAvKiBzaXplICovKSwKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclVuc3luYzxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpoYXJkd2FyZTo6R3JhbnRvckRlc2NyaXB0b3I+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBuaGFuZGxlICovLCAwIC8qIHNpemUgKi8pKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQWNjZXNzb3I6OkFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgIDogbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQWNjZXNzb3I6On5BY2Nlc3NvcigpIHsKK30KKworYm9vbCBBY2Nlc3Nvcjo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gKGJvb2wpbUltcGwgJiYgbUltcGwtPmlzVmFsaWQoKTsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpmbHVzaCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmZsdXNoKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaChjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlciwgYm9vbCBsb2NhbCwKKyAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y29ubmVjdCgKKyAgICAgICAgICAgICAgICB0aGlzLCBvYnNlcnZlciwgY29ubmVjdGlvbiwgcENvbm5lY3Rpb25JZCwgcE1zZ0lkLAorICAgICAgICAgICAgICAgIHN0YXR1c0Rlc2NQdHIsIGludkRlc2NQdHIpOworICAgICAgICBpZiAoIWxvY2FsICYmIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IodGhpcyk7CisgICAgICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5hZGQoKnBDb25uZWN0aW9uSWQsIGFjY2Vzc29yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+cmVtb3ZlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEFjY2Vzc29yOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICB9Cit9CisKKy8vSUFjY2Vzc29yKiBISURMX0ZFVENIX0lBY2Nlc3Nvcihjb25zdCBjaGFyKiAvKiBuYW1lICovKSB7CisvLyAgICByZXR1cm4gbmV3IEFjY2Vzc29yKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwMjUxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQWNjZXNzb3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lPYnNlcnZlci5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IEFjY2Vzc29yOworc3RydWN0IENvbm5lY3Rpb247CisKKy8qKgorICogUmVjZWl2ZXMgZGVhdGggbm90aWZpY2F0aW9ucyBmcm9tIHJlbW90ZSBjb25uZWN0aW9ucy4KKyAqIE9uIGRlYXRoIG5vdGlmaWNhdGlvbnMsIHRoZSBjb25uZWN0aW9ucyBhcmUgY2xvc2VkIGFuZCB1c2VkIHJlc291cmNlcworICogYXJlIHJlbGVhc2VkLgorICovCitzdHJ1Y3QgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50IDogcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbmV3bHkgY29ubmVjdGVkIGNvbm5lY3Rpb24gZnJvbSByZW1vdGUgcHJvY2Vzc2VzLgorICAgICAqLworICAgIHZvaWQgYWRkKGludDY0X3QgY29ubmVjdGlvbklkLCBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZvaWQgYWRkQ29va2llVG9Db25uZWN0aW9uKHVpbnQ2NF90IGNvb2tpZSwgaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAorICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxpbnQ2NF90Pj4gIG1Db29raWVUb0Nvbm5lY3Rpb25zOworICAgIHN0ZDo6bWFwPGludDY0X3QsIHVpbnQ2NF90PiBtQ29ubmVjdGlvblRvQ29va2llOworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gbUFjY2Vzc29yczsKK307CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCBlbmFibGVzIGEgYnVmZmVyIHBvb2wgdG8gY29tbXVuaWNhdGUgd2l0aCBidWZmZXIKKyAqIHBvb2wgY2xpZW50cy4gMToxIGNvcnJlc3BvbmRlbnNlIGhvbGRzIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgYW4gYWNjZXNzb3IuCisgKi8KK3N0cnVjdCBBY2Nlc3NvciA6IHB1YmxpYyBJQWNjZXNzb3IgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gY29ubmVjdChjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyPiYgb2JzZXJ2ZXIsIGNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIHVzZXMgdGhlIHNwZWNpZmllZCBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIGJ1ZmZlciBhbGxvY2F0b3IuCisgICAgICovCisgICAgZXhwbGljaXQgQWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yLiAqLworICAgIH5BY2Nlc3NvcigpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYWNjZXNzb3IgaXMgdmFsaWQuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogSW52YWxpZGF0ZXMgYWxsIGJ1ZmZlcnMgd2hpY2ggYXJlIG93bmVkIGJ5IGJ1ZmZlcnBvb2wgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goKTsKKworICAgIC8qKiBBbGxvY2F0ZXMgYSBidWZmZXIgZnJvbSBhIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGNvbm5lY3Rpb24gaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIEZldGNoZXMgYSBidWZmZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgcmVjZWl2aW5nIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCB0aGUgaWQgb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIHRvIGJlIGZldGNoZWQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGZldGNoZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBmZXRjaGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBmZXRjaCgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGJ1ZmZlciBwb29sLiBUaGUgYnVmZmVyIHBvb2wgY2xpZW50IHVzZXMgdGhlCisgICAgICogY3JlYXRlZCBjb25uZWN0aW9uIGluIG9yZGVyIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGJ1ZmZlciBwb29sLiBBbgorICAgICAqIEZNUSBmb3IgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGlzIGFsc28gY3JlYXRlZCBmb3IgdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYnNlcnZlciAgICAgIGNsaWVudCBvYnNlcnZlciBmb3IgYnVmZmVyIGludmFsaWRhdGlvbgorICAgICAqIEBwYXJhbSBsb2NhbCAgICAgICAgIHRydWUgd2hlbiBhIGNvbm5lY3Rpb24gcmVxdWVzdCBjb21lcyBmcm9tIGxvY2FsIHByb2Nlc3MsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uICAgIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIHRoZSBpZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIHBNc2dJZCAgICAgICAgdGhlIGlkIG9mIHRoZSByZWNlbnQgYnVmZmVyIHBvb2wgbWVzc2FnZQorICAgICAqIEBwYXJhbSBzdGF0dXNEZXNjUHRyIEZNUSBkZXNjcmlwdG9yIGZvciBzaGFyZWQgYnVmZmVyIHN0YXR1cyBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBpbnZEZXNjUHRyICAgIEZNUSBkZXNjcmlwdG9yIGZvciBidWZmZXIgaW52YWxpZGF0aW9uIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBmcm9tIGEgYnVmZmVyIHBvb2wgdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IG1hZGUuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+JiBvYnNlcnZlciwKKyAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb21zIHBlcmlvZGljIGNhY2hlCisgICAgICogY2xlYW5pbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGl0IGZyZWVzIGFsbCBidWZmZXJzIHdhaXRpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBoaWRsX2RlYXRoX3JlY2lwaWVudCBmb3IgcmVtb3RlIGNvbm5lY3Rpb24gZGVhdGguCisgICAgICovCisgICAgc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gZ2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVJbnZhbGlkYXRvcigpOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNjA5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuY3BwCkBAIC0wLDAgKzEsODU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQWNjZXNzb3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCituYW1lc3BhY2UgeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSA1MDAwMDA7IC8vIFRPRE8gdHVuZSAwLjUgc2VjCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtMb2dEdXJhdGlvblVzID0gNTAwMDAwMDsgLy8gNSBzZWNzCisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uID0gMTAyNCoxMDI0KjE1OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uID0gNDA7Cit9CisKKy8vIEJ1ZmZlciBzdHJ1Y3R1cmUgaW4gYnVmZmVycG9vbCBwcm9jZXNzCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXIgeworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBzaXplX3QgbU93bmVyQ291bnQ7CisgICAgc2l6ZV90IG1UcmFuc2FjdGlvbkNvdW50OworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgY29uc3Qgc2l6ZV90IG1BbGxvY1NpemU7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbUNvbmZpZzsKKyAgICBib29sIG1JbnZhbGlkYXRlZDsKKworICAgIEludGVybmFsQnVmZmVyKAorICAgICAgICAgICAgQnVmZmVySWQgaWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYWxsb2NDb25maWcpCisgICAgICAgICAgICA6IG1JZChpZCksIG1Pd25lckNvdW50KDApLCBtVHJhbnNhY3Rpb25Db3VudCgwKSwKKyAgICAgICAgICAgIG1BbGxvY2F0aW9uKGFsbG9jKSwgbUFsbG9jU2l6ZShhbGxvY1NpemUpLCBtQ29uZmlnKGFsbG9jQ29uZmlnKSwKKyAgICAgICAgICAgIG1JbnZhbGlkYXRlZChmYWxzZSkge30KKworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24tPmhhbmRsZSgpOworICAgIH0KKworICAgIHZvaWQgaW52YWxpZGF0ZSgpIHsKKyAgICAgICAgbUludmFsaWRhdGVkID0gdHJ1ZTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXMgeworICAgIFRyYW5zYWN0aW9uSWQgbUlkOworICAgIEJ1ZmZlcklkIG1CdWZmZXJJZDsKKyAgICBDb25uZWN0aW9uSWQgbVNlbmRlcjsKKyAgICBDb25uZWN0aW9uSWQgbVJlY2VpdmVyOworICAgIEJ1ZmZlclN0YXR1cyBtU3RhdHVzOworICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIGJvb2wgbVNlbmRlclZhbGlkYXRlZDsKKworICAgIFRyYW5zYWN0aW9uU3RhdHVzKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgbUlkID0gbWVzc2FnZS50cmFuc2FjdGlvbklkOworICAgICAgICBtQnVmZmVySWQgPSBtZXNzYWdlLmJ1ZmZlcklkOworICAgICAgICBtU3RhdHVzID0gbWVzc2FnZS5uZXdTdGF0dXM7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPKSB7CisgICAgICAgICAgICBtU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlbmRlciA9IC0xTEw7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIEhlbHBlciB0ZW1wbGF0ZSBtZXRob2RzIGZvciBoYW5kbGluZyBtYXAgb2Ygc2V0LgordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgaW5zZXJ0KHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciA9PSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzZXQ8VT4gdmFsdWVTZXR7dmFsdWV9OworICAgICAgICBtYXBPZlNldC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWVTZXQpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSkgID09IGl0ZXItPnNlY29uZC5lbmQoKSkgeworICAgICAgICBpdGVyLT5zZWNvbmQuaW5zZXJ0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgZXJhc2Uoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuZXJhc2UodmFsdWUpID4gMCkgeworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlci0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtYXBPZlNldC0+ZXJhc2UoaXRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgY29udGFpbnMoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBhdXRvIHNldEl0ZXIgPSBpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXRJdGVyICE9IGl0ZXItPnNlY29uZC5lbmQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzUGlkID0gZ2V0cGlkKCk7Cit1aW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1NlcUlkID0gdGltZShudWxscHRyKTsKKworQWNjZXNzb3I6OkltcGw6OkltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCitBY2Nlc3Nvcjo6SW1wbDo6fkltcGwoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIsCisgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cikgeworICAgIHNwPENvbm5lY3Rpb24+IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBpZCA9IChpbnQ2NF90KXNQaWQgPDwgMzIgfCBzU2VxSWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIub3BlbihpZCwgc3RhdHVzRGVzY1B0cik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBuZXdDb25uZWN0aW9uLT5pbml0aWFsaXplKGFjY2Vzc29yLCBpZCk7CisgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24gPSBuZXdDb25uZWN0aW9uOworICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gaWQ7CisgICAgICAgICAgICAgICAgKnBNc2dJZCA9IG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ubUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb25DaGFubmVsLmdldERlc2MoaW52RGVzY1B0cik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5vbkNvbm5lY3QoaWQsIG9ic2VydmVyKTsKKyAgICAgICAgICAgICAgICArK3NTZXFJZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgICAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgQUxPR1YoImNvbm5lY3Rpb24gY2xvc2UgJWxsZDogJXUiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCwgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5tSWQpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmhhbmRsZUNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgbUJ1ZmZlclBvb2wubU9ic2VydmVyLmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5vbkNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgLy8gU2luY2UgY2xvc2UjIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGFsbCB3b3JrcyBhcmUgZmluaXNoZWQsIGl0IGlzIE9LIHRvCisgICAgLy8gZXZpY3QgdW51c2VkIGJ1ZmZlcnMuCisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCh0cnVlKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICBpZiAoIW1CdWZmZXJQb29sLmdldEZyZWVCdWZmZXIobUFsbG9jYXRvciwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKSkgeworICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IGFsbG9jOworICAgICAgICBzaXplX3QgYWxsb2NTaXplOworICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5hbGxvY2F0ZShwYXJhbXMsICZhbGxvYywgJmFsbG9jU2l6ZSk7CisgICAgICAgIGxvY2subG9jaygpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLmFkZE5ld0J1ZmZlcihhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjcmVhdGUgYSBidWZmZXIgJWQgOiAldSAlcCIsCisgICAgICAgICAgICAgIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LLCAqYnVmZmVySWQsICpoYW5kbGUpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIG93bkJ1ZmZlciBmYWlsdXJlCisgICAgICAgIG1CdWZmZXJQb29sLmhhbmRsZU93bkJ1ZmZlcihjb25uZWN0aW9uSWQsICpidWZmZXJJZCk7CisgICAgfQorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIGF1dG8gZm91bmQgPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZW5kKCkgJiYKKyAgICAgICAgICAgIGNvbnRhaW5zKCZtQnVmZmVyUG9vbC5tUGVuZGluZ1RyYW5zYWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCkpIHsKKyAgICAgICAgaWYgKGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1CdWZmZXJJZCA9PSBidWZmZXJJZCkgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g7CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ID0gbUJ1ZmZlclBvb2wubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoYnVmZmVySXQgIT0gbUJ1ZmZlclBvb2wubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tU3RhdHMub25CdWZmZXJGZXRjaGVkKCk7CisgICAgICAgICAgICAgICAgKmhhbmRsZSA9IGJ1ZmZlckl0LT5zZWNvbmQtPmhhbmRsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICAvLyB0cmFuc2FjdGlvbiB0aW1lb3V0LCBidWZmZXIgY2FjaGVpbmcgVFRMIGhhbmRsaW5nCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKGNsZWFyQ2FjaGUpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpmbHVzaCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmZsdXNoKHNoYXJlZF9mcm9tX3RoaXMoKSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmhhbmRsZUludmFsaWRhdGVBY2soKSB7CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiBvYnNlcnZlcnM7CisgICAgdWludDMyX3QgaW52YWxpZGF0aW9uSWQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgICAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5vbkhhbmRsZUFjaygmb2JzZXJ2ZXJzLCAmaW52YWxpZGF0aW9uSWQpOworICAgIH0KKyAgICAvLyBEbyBub3QgaG9sZCBsb2NrIGZvciBzZW5kIGludmFsaWRhdGlvbnMKKyAgICBmb3IgKGF1dG8gaXQgPSBvYnNlcnZlcnMuYmVnaW4oKTsgaXQgIT0gb2JzZXJ2ZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAob2JzZXJ2ZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG9ic2VydmVyLT5vbk1lc3NhZ2UoaXQtPmZpcnN0LCBpbnZhbGlkYXRpb25JZCk7CisgICAgICAgICAgICAodm9pZCkgdHJhbnNSZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1CdWZmZXJQb29sLmlzVmFsaWQoKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6OkJ1ZmZlclBvb2woKQorICAgIDogbVRpbWVzdGFtcFVzKGdldFRpbWVzdGFtcE5vdygpKSwKKyAgICAgIG1MYXN0Q2xlYW5VcFVzKG1UaW1lc3RhbXBVcyksCisgICAgICBtTGFzdExvZ1VzKG1UaW1lc3RhbXBVcyksCisgICAgICBtU2VxKDApLAorICAgICAgbVN0YXJ0U2VxKDApIHsKKyAgICBtVmFsaWQgPSBtSW52YWxpZGF0aW9uQ2hhbm5lbC5pc1ZhbGlkKCk7Cit9CisKKworLy8gU3RhdGlzdGljcyBoZWxwZXIKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFM+CitpbnQgcGVyY2VudGFnZShUIGJhc2UsIFMgdG90YWwpIHsKKyAgICByZXR1cm4gaW50KHRvdGFsID8gMC41ICsgMTAwLiAqIHN0YXRpY19jYXN0PFM+KGJhc2UpIC8gdG90YWwgOiAwKTsKK30KKworc3RkOjphdG9taWM8c3RkOjp1aW50MzJfdD4gQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6c0ludlNlcUlkKDApOworCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6fkJ1ZmZlclBvb2woKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBBTE9HRCgiRGVzdHJ1Y3Rpb24gLSBidWZmZXJwb29sMiAlcCAiCisgICAgICAgICAgImNhY2hlZDogJXp1LyV6dU0sICV6dS8lZCUlIGluIHVzZTsgIgorICAgICAgICAgICJhbGxvY3M6ICV6dSwgJWQlJSByZWN5Y2xlZDsgIgorICAgICAgICAgICJ0cmFuc2ZlcnM6ICV6dSwgJWQlJSB1bmZldGNlZCIsCisgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQgPj4gMjAsCisgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIHBlcmNlbnRhZ2UobVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLCBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsVHJhbnNmZXJzLAorICAgICAgICAgIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFRyYW5zZmVycyAtIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25Db25uZWN0KAorICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4mIG9ic2VydmVyKSB7CisgICAgbUFja3NbY29uSWRdID0gbUludmFsaWRhdGlvbklkOyAvLyBzdGFydHMgZnJvbSBjdXJyZW50IGludmFsaWRhdGlvbklkCisgICAgbU9ic2VydmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIG9ic2VydmVyKSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25DbG9zZShDb25uZWN0aW9uSWQgY29uSWQpIHsKKyAgICBtQWNrcy5lcmFzZShjb25JZCk7CisgICAgbU9ic2VydmVycy5lcmFzZShjb25JZCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25BY2soCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCwKKyAgICAgICAgdWludDMyX3QgbXNnSWQpIHsKKyAgICBhdXRvIGl0ID0gbUFja3MuZmluZChjb25JZCk7CisgICAgaWYgKGl0ID09IG1BY2tzLmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCJBQ0sgZnJvbSBpbmNvbnNpc3RlbnQgY29ubmVjdGlvbiEgJWxsZCIsIChsb25nIGxvbmcpY29uSWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpc01lc3NhZ2VMYXRlcihtc2dJZCwgaXQtPnNlY29uZCkpIHsKKyAgICAgICAgbUFja3NbY29uSWRdID0gbXNnSWQ7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uQnVmZmVySW52YWxpZGF0ZWQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbVBlbmRpbmdzLmJlZ2luKCk7IGl0ICE9IG1QZW5kaW5ncy5lbmQoKTspIHsKKyAgICAgICAgaWYgKGl0LT5pc0ludmFsaWRhdGVkKGJ1ZmZlcklkKSkgeworICAgICAgICAgICAgdWludDMyX3QgbXNnSWQgPSAwOworICAgICAgICAgICAgaWYgKGl0LT5tTmVlZHNBY2spIHsKKyAgICAgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIGlmIChtc2dJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaGFwcGVucworICAgICAgICAgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5uZWwucG9zdEludmFsaWRhdGlvbihtc2dJZCwgaXQtPm1Gcm9tLCBpdC0+bVRvKTsKKyAgICAgICAgICAgIGl0ID0gbVBlbmRpbmdzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uSW52YWxpZGF0aW9uUmVxdWVzdCgKKyAgICAgICAgYm9vbCBuZWVkc0FjaywKKyAgICAgICAgdWludDMyX3QgZnJvbSwKKyAgICAgICAgdWludDMyX3QgdG8sCisgICAgICAgIHNpemVfdCBsZWZ0LAorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgICAgIHVpbnQzMl90IG1zZ0lkID0gMDsKKyAgICBpZiAobmVlZHNBY2spIHsKKyAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgaWYgKG1zZ0lkID09IDApIHsKKyAgICAgICAgICAgIC8vIHdyYXAgaGFwcGVucworICAgICAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiYnVmZmVycG9vbDIgaW52YWxpZGF0aW9uIHJlcXVlc3RlZCBhbmQgcXVldWVkIik7CisgICAgaWYgKGxlZnQgPT0gMCkgeworICAgICAgICBjaGFubmVsLnBvc3RJbnZhbGlkYXRpb24obXNnSWQsIGZyb20sIHRvKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBzZW5kaW5nIGhpbnQgbWVzc2FnZT8KKyAgICAgICAgQUxPR1YoImJ1ZmZlcnBvbzIgaW52YWxpZGF0aW9uIHJlcXVlc3RlZCBhbmQgcGVuZGluZyIpOworICAgICAgICBQZW5kaW5nIHBlbmRpbmcobmVlZHNBY2ssIGZyb20sIHRvLCBsZWZ0LCBpbXBsKTsKKyAgICAgICAgbVBlbmRpbmdzLnB1c2hfYmFjayhwZW5kaW5nKTsKKyAgICB9CisgICAgc0ludmFsaWRhdG9yLT5hZGRBY2Nlc3NvcihtSWQsIGltcGwpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uSGFuZGxlQWNrKAorICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+ICpvYnNlcnZlcnMsCisgICAgICAgIHVpbnQzMl90ICppbnZhbGlkYXRpb25JZCkgeworICAgIGlmIChtSW52YWxpZGF0aW9uSWQgIT0gMCkgeworICAgICAgICAqaW52YWxpZGF0aW9uSWQgPSBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgIHN0ZDo6c2V0PGludD4gZGVhZHM7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1BY2tzLmJlZ2luKCk7IGl0ICE9IG1BY2tzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZCAhPSBtSW52YWxpZGF0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+IG9ic2VydmVyID0gbU9ic2VydmVyc1tpdC0+Zmlyc3RdOworICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICBvYnNlcnZlcnMtPmVtcGxhY2UoaXQtPmZpcnN0LCBvYnNlcnZlcik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjb25uZWN0aW9uICVsbGQgd2lsbCBjYWxsIG9ic2VydmVyICgldTogJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpdC0+Zmlyc3QsIGl0LT5zZWNvbmQsIG1JbnZhbGlkYXRpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIE4uQjogb25NZXNzYWdlIHdpbGwgYmUgY2FsbGVkIGxhdGVyLiBpZ25vcmUgcG9zc2liaWxpdHkgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gb25NZXNzYWdlIyBvbmV3YXkgY2FsbCBiZWluZyBsb3N0LgorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kID0gbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJidWZmZXJwb29sMiBvYnNlcnZlciBkaWVkICVsbGQiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgIGRlYWRzLmluc2VydChpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVhZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZGVhZHMuYmVnaW4oKTsgaXQgIT0gZGVhZHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBvbkNsb3NlKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1QZW5kaW5ncy5zaXplKCkgPT0gMCkgeworICAgICAgICAvLyBBbGwgaW52YWxpZGF0aW9uIElkcyBhcmUgc3luY2VkIGFuZCBubyBtb3JlIHBlbmRpbmcgaW52YWxpZGF0aW9ucy4KKyAgICAgICAgc0ludmFsaWRhdG9yLT5kZWxBY2Nlc3NvcihtSWQpOworICAgIH0KK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlT3duQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworCisgICAgYm9vbCBhZGRlZCA9IGluc2VydCgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGFkZGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50Kys7CisgICAgfQorICAgIGluc2VydCgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIHJldHVybiBhZGRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFpdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKGJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICBBTE9HVigicmVsZWFzZSBidWZmZXIgJXUgOiAlZCIsIGJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICByZXR1cm4gZGVsZXRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBjb21wbGV0ZWQgPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmZpbmQoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChjb21wbGV0ZWQgIT0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBhbHJlYWR5IGNvbXBsZXRlZAorICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVyYXNlKGNvbXBsZXRlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyB0aGUgYnVmZmVyIHNob3VsZCBleGlzdCBhbmQgYmUgb3duZWQuCisgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICBpZiAoYnVmZmVySXRlciA9PSBtQnVmZmVycy5lbmQoKSB8fAorICAgICAgICAgICAgIWNvbnRhaW5zKCZtVXNpbmdCdWZmZXJzLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gdHJhbnNmZXJfZnJvbSB3YXMgcmVjZWl2ZWQgZWFybGllci4KKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIFRPRE86IHZlcmlmeSB0aGVyZSBpcyB0YXJnZXQgY29ubmVjdGlvbiBJZAorICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCA9PSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlzIGl0IGZlYXNpYmxlIHRvIGNoZWNrIG93bmVyc2hpcCBoZXJlPworICAgICAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtZXNzYWdlLmNvbm5lY3Rpb25JZCA9PSBmb3VuZC0+c2Vjb25kLT5tUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST007CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgIGlmICghZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UubmV3U3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0spIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPd25CdWZmZXIobWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMAorICAgICAgICAgICAgICAgICYmIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghYnVmZmVySXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChtZXNzYWdlLmJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShmb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInRyYW5zZmVyIGZpbmlzaGVkICVsbHUgJXUgLSAlZCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7CisgICAgfQorICAgIEFMT0dWKCJ0cmFuc2ZlciBub3QgZm91bmQgJWxsdSAldSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6cHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCkgeworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+IG1lc3NhZ2VzOworICAgIG1PYnNlcnZlci5nZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKG1lc3NhZ2VzKTsKKyAgICBtVGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBmb3IgKEJ1ZmZlclN0YXR1c01lc3NhZ2UmIG1lc3NhZ2U6IG1lc3NhZ2VzKSB7CisgICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZS5uZXdTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlVTRUQ6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyVG8obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTToKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlckZyb20obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfTE9TVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LOgorICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyUmVzdWx0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OklOVkFMSURBVElPTl9BQ0s6CisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkFjayhtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IGZhbHNlKSB7CisgICAgICAgICAgICBBTE9HVygiYnVmZmVyIHN0YXR1cyBtZXNzYWdlIHByb2Nlc3NpbmcgZmFpbHVyZSAtIG1lc3NhZ2UgOiAlZCBjb25uZWN0aW9uIDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cywgKGxvbmcgbG9uZyltZXNzYWdlLmNvbm5lY3Rpb25JZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZXMuY2xlYXIoKTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIC8vIENsZWFuaW5nIGJ1ZmZlcnMKKyAgICBhdXRvIGJ1ZmZlcnMgPSBtVXNpbmdCdWZmZXJzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoYnVmZmVycyAhPSBtVXNpbmdCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgQnVmZmVySWQmIGJ1ZmZlcklkIDogYnVmZmVycy0+c2Vjb25kKSB7CisgICAgICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcmVlYnVmZmVyIGluc2VydCBmYWlsCisgICAgICAgICAgICAgICAgICAgIGlmICghYnVmZmVySXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGJ1ZmZlckl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKGJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVVzaW5nQnVmZmVycy5lcmFzZShidWZmZXJzKTsKKyAgICB9CisKKyAgICAvLyBDbGVhbmluZyB0cmFuc2FjdGlvbnMKKyAgICBhdXRvIHBlbmRpbmcgPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKHBlbmRpbmcgIT0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBUcmFuc2FjdGlvbklkJiB0cmFuc2FjdGlvbklkIDogcGVuZGluZy0+c2Vjb25kKSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoaXRlciAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpdGVyLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQodHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gaXRlci0+c2Vjb25kLT5tQnVmZmVySWQ7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcmVlYnVmZmVyIGluc2VydCBmYWlsCisgICAgICAgICAgICAgICAgICAgIGlmICghYnVmZmVySXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGJ1ZmZlckl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKGJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Z2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGF1dG8gYnVmZmVySXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBmb3IgKDtidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7ICsrYnVmZmVySXQpIHsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSAqYnVmZmVySXQ7CisgICAgICAgIGlmIChhbGxvY2F0b3ItPmNvbXBhdGlibGUocGFyYW1zLCBtQnVmZmVyc1tidWZmZXJJZF0tPm1Db25maWcpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIEJ1ZmZlcklkIGlkID0gKmJ1ZmZlckl0OworICAgICAgICBtRnJlZUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXQpOworICAgICAgICBtU3RhdHMub25CdWZmZXJSZWN5Y2xlZChtQnVmZmVyc1tpZF0tPm1BbGxvY1NpemUpOworICAgICAgICAqaGFuZGxlID0gbUJ1ZmZlcnNbaWRdLT5oYW5kbGUoKTsKKyAgICAgICAgKnBJZCA9IGlkOworICAgICAgICBBTE9HVigicmVjeWNsZSBhIGJ1ZmZlciAldSAlcCIsIGlkLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjphZGROZXdCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKworICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gbVNlcSsrOworICAgIGlmIChtU2VxID09IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgbVNlcSA9IDA7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8SW50ZXJuYWxCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGF1dG8gcmVzID0gbUJ1ZmZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoYnVmZmVyKSkpOworICAgICAgICBpZiAocmVzLnNlY29uZCkgeworICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyQWxsb2NhdGVkKGFsbG9jU2l6ZSk7CisgICAgICAgICAgICAqaGFuZGxlID0gYWxsb2MtPmhhbmRsZSgpOworICAgICAgICAgICAgKnBJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChjbGVhckNhY2hlIHx8IG1UaW1lc3RhbXBVcyA+IG1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzKSB7CisgICAgICAgIG1MYXN0Q2xlYW5VcFVzID0gbVRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVRpbWVzdGFtcFVzID4gbUxhc3RMb2dVcyArIGtMb2dEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtTGFzdExvZ1VzID0gbVRpbWVzdGFtcFVzOworICAgICAgICAgICAgQUxPR0QoImJ1ZmZlcnBvb2wyICVwIDogJXp1KCV6dSBzaXplKSB0b3RhbCBidWZmZXJzIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dSglenUgc2l6ZSkgdXNlZCBidWZmZXJzIC0gJXp1LyV6dSAocmVjeWNsZS9hbGxvYykgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1LyV6dSAoZmV0Y2gvdHJhbnNmZXIpIiwKKyAgICAgICAgICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tU2l6ZUluVXNlLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIG1TdGF0cy5tU2l6ZUNhY2hlZCA8IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnMuc2l6ZSgpIDwga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2ZyZWVJdDsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbDIgaW5jb25zaXN0ZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjppbnZhbGlkYXRlKAorICAgICAgICBib29sIG5lZWRzQWNrLCBCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgaWYgKGlzQnVmZmVySW5SYW5nZShmcm9tLCB0bywgKmZyZWVJdCkpIHsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJiBpdC0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdC0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmVyYXNlKGZyZWVJdCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJidWZmZXJwb29sMiBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytmcmVlSXQ7CisgICAgfQorCisgICAgc2l6ZV90IGxlZnQgPSAwOworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpc0J1ZmZlckluUmFuZ2UoZnJvbSwgdG8sIGl0LT5maXJzdCkpIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICsrbGVmdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW52YWxpZGF0aW9uLm9uSW52YWxpZGF0aW9uUmVxdWVzdChuZWVkc0FjaywgZnJvbSwgdG8sIGxlZnQsIG1JbnZhbGlkYXRpb25DaGFubmVsLCBpbXBsKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Zmx1c2goY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIEJ1ZmZlcklkIGZyb20gPSBtU3RhcnRTZXE7CisgICAgQnVmZmVySWQgdG8gPSBtU2VxOworICAgIG1TdGFydFNlcSA9IG1TZXE7CisgICAgLy8gVE9ETzogbmVlZHNBY2sgcGFyYW1zIAorICAgIEFMT0dWKCJidWZmZXIgaW52YWxpZGF0aW9uIHJlcXVlc3QgYnA6JXUgJXUgJXUiLCBtSW52YWxpZGF0aW9uLm1JZCwgZnJvbSwgdG8pOworICAgIGlmIChmcm9tICE9IHRvKSB7CisgICAgICAgIGludmFsaWRhdGUodHJ1ZSwgZnJvbSwgdG8sIGltcGwpOworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6aW52YWxpZGF0b3JUaHJlYWQoCisgICAgICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+ICZhY2Nlc3NvcnMsCisgICAgICAgICAgICBzdGQ6Om11dGV4ICZtdXRleCwKKyAgICAgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlICZjdiwKKyAgICAgICAgICAgIGJvb2wgJnJlYWR5KSB7CisgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+IGNvcGllZDsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICAgICAgICAgIGlmICghcmVhZHkpIHsKKyAgICAgICAgICAgICAgICBjdi53YWl0KGxvY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29waWVkLmluc2VydChhY2Nlc3NvcnMuYmVnaW4oKSwgYWNjZXNzb3JzLmVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6Omxpc3Q8Q29ubmVjdGlvbklkPiBlcmFzZWQ7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvcGllZC5iZWdpbigpOyBpdCAhPSBjb3BpZWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gaW1wbCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgaWYgKCFpbXBsKSB7CisgICAgICAgICAgICAgICAgZXJhc2VkLnB1c2hfYmFjayhpdC0+Zmlyc3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbXBsLT5oYW5kbGVJbnZhbGlkYXRlQWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGVyYXNlZC5iZWdpbigpOyBpdCAhPSBlcmFzZWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3NvcnMuZXJhc2UoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZWFkeSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGRyYWluaW5nIGNwdS4KKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjpBY2Nlc3NvckludmFsaWRhdG9yKCkgOiBtUmVhZHkoZmFsc2UpIHsKKyAgICBzdGQ6OnRocmVhZCBpbnZhbGlkYXRvcigKKyAgICAgICAgICAgIGludmFsaWRhdG9yVGhyZWFkLAorICAgICAgICAgICAgc3RkOjpyZWYobUFjY2Vzc29ycyksCisgICAgICAgICAgICBzdGQ6OnJlZihtTXV0ZXgpLAorICAgICAgICAgICAgc3RkOjpyZWYobUN2KSwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1SZWFkeSkpOworICAgIGludmFsaWRhdG9yLmRldGFjaCgpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjphZGRBY2Nlc3NvcigKKyAgICAgICAgdWludDMyX3QgYWNjZXNzb3JJZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICBib29sIG5vdGlmeSA9IGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoYWNjZXNzb3JJZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBpZiAoIW1SZWFkeSkgeworICAgICAgICAgICAgbVJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUFjY2Vzc29ycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYWNjZXNzb3JJZCwgaW1wbCkpOworICAgICAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiBhZGRlZCBicDoldSAlZCIsIGFjY2Vzc29ySWQsIG5vdGlmeSk7CisgICAgfQorICAgIGxvY2sudW5sb2NrKCk7CisgICAgaWYgKG5vdGlmeSkgeworICAgICAgICBtQ3Yubm90aWZ5X29uZSgpOworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcjo6ZGVsQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShhY2Nlc3NvcklkKTsKKyAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiBkZWxldGVkIGJwOiV1IiwgYWNjZXNzb3JJZCk7CisgICAgaWYgKG1BY2Nlc3NvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgbVJlYWR5ID0gZmFsc2U7CisgICAgfQorfQorCitzdGQ6OnVuaXF1ZV9wdHI8QWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I+IEFjY2Vzc29yOjpJbXBsOjpzSW52YWxpZGF0b3I7CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNyZWF0ZUludmFsaWRhdG9yKCkgeworICAgIGlmICghc0ludmFsaWRhdG9yKSB7CisgICAgICAgIHNJbnZhbGlkYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I+KCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTcyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaApAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RydWN0IEludGVybmFsQnVmZmVyOworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Iob3IgYSBidWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4pICovCitjbGFzcyBBY2Nlc3Nvcjo6SW1wbAorICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QWNjZXNzb3I6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIH5JbXBsKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLAorICAgICAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cik7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgdm9pZCBoYW5kbGVJbnZhbGlkYXRlQWNrKCk7CisKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVJbnZhbGlkYXRvcigpOworCitwcml2YXRlOgorICAgIC8vIENvbm5lY3Rpb25JZCA9IHBpZCA6ICh0aW1lc3RhbXBfY3JlYXRlZCArIHNlcUlkKQorICAgIC8vIGluIG9yZGVyIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzIGZvciBlYWNoIGNvbm5lY3Rpb24KKyAgICBzdGF0aWMgdWludDMyX3Qgc1NlcUlkOworICAgIHN0YXRpYyBpbnQzMl90IHNQaWQ7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogSGFuZGxlcyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLiBIYW5kbGVzIGJ1ZmZlciBhbGxvY2F0aW9uL3JlY3ljbGluZy4KKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciB0cmFuc2ZlciBiZXR3ZWVuIGJ1ZmZlciBwb29sIGNsaWVudHMuCisgICAgICovCisgICAgc3RydWN0IEJ1ZmZlclBvb2wgeworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdExvZ1VzOworICAgICAgICBCdWZmZXJJZCBtU2VxOworICAgICAgICBCdWZmZXJJZCBtU3RhcnRTZXE7CisgICAgICAgIGJvb2wgbVZhbGlkOworICAgICAgICBCdWZmZXJTdGF0dXNPYnNlcnZlciBtT2JzZXJ2ZXI7CisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgbUludmFsaWRhdGlvbkNoYW5uZWw7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxCdWZmZXJJZD4+IG1Vc2luZ0J1ZmZlcnM7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnNldDxDb25uZWN0aW9uSWQ+PiBtVXNpbmdDb25uZWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+PiBtUGVuZGluZ1RyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gVHJhbnNhY3Rpb25zIGNvbXBsZXRlZCBiZWZvcmUgVFJBTlNGRVJfVE8gbWVzc2FnZSBhcnJpdmFsLgorICAgICAgICAvLyBGZXRjaCBkb2VzIG5vdCBvY2N1ciBmb3IgdGhlIHRyYW5zYWN0aW9ucy4KKyAgICAgICAgLy8gT25seSB0cmFuc2FjdGlvbiBpZCBpcyBrZXB0IGZvciB0aGUgdHJhbnNhY3Rpb25zIGluIHNob3J0IGR1cmF0aW9uLgorICAgICAgICBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPiBtQ29tcGxldGVkVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBDdXJyZW50bHkgYWN0aXZlKHBlbmRpbmcpIHRyYW5zYXRpb25zJyBzdGF0dXMgJiBpbmZvcm1hdGlvbi4KKyAgICAgICAgc3RkOjptYXA8VHJhbnNhY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPFRyYW5zYWN0aW9uU3RhdHVzPj4KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgc3RkOjpzZXQ8QnVmZmVySWQ+IG1GcmVlQnVmZmVyczsKKworICAgICAgICBzdHJ1Y3QgSW52YWxpZGF0aW9uIHsKKyAgICAgICAgICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxzdGQ6OnVpbnQzMl90PiBzSW52U2VxSWQ7CisKKyAgICAgICAgICAgIHN0cnVjdCBQZW5kaW5nIHsKKyAgICAgICAgICAgICAgICBib29sIG1OZWVkc0FjazsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtRnJvbTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtVG87CisgICAgICAgICAgICAgICAgc2l6ZV90IG1MZWZ0OworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+IG1JbXBsOworICAgICAgICAgICAgICAgIFBlbmRpbmcoYm9vbCBuZWVkc0FjaywgdWludDMyX3QgZnJvbSwgdWludDMyX3QgdG8sIHNpemVfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbU5lZWRzQWNrKG5lZWRzQWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyb20oZnJvbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ubyh0byksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0KGxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtSW1wbChpbXBsKQorICAgICAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgICAgICBib29sIGlzSW52YWxpZGF0ZWQodWludDMyX3QgYnVmZmVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzQnVmZmVySW5SYW5nZShtRnJvbSwgbVRvLCBidWZmZXJJZCkgJiYgLS1tTGVmdCA9PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxQZW5kaW5nPiBtUGVuZGluZ3M7CisgICAgICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHVpbnQzMl90PiBtQWNrczsKKyAgICAgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gbU9ic2VydmVyczsKKyAgICAgICAgICAgIHVpbnQzMl90IG1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgIHVpbnQzMl90IG1JZDsKKworICAgICAgICAgICAgSW52YWxpZGF0aW9uKCkgOiBtSW52YWxpZGF0aW9uSWQoMCksIG1JZChzSW52U2VxSWQuZmV0Y2hfYWRkKDEpKSB7fQorCisgICAgICAgICAgICB2b2lkIG9uQ29ubmVjdChDb25uZWN0aW9uSWQgY29uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgICAgICAgICAgdm9pZCBvbkNsb3NlKENvbm5lY3Rpb25JZCBjb25JZCk7CisKKyAgICAgICAgICAgIHZvaWQgb25BY2soQ29ubmVjdGlvbklkIGNvbklkLCB1aW50MzJfdCBtc2dJZCk7CisKKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJJbnZhbGlkYXRlZCgKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwpOworCisgICAgICAgICAgICB2b2lkIG9uSW52YWxpZGF0aW9uUmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc0FjaywgdWludDMyX3QgZnJvbSwgdWludDMyX3QgdG8sIHNpemVfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICAgICAgdm9pZCBvbkhhbmRsZUFjaygKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiAqb2JzZXJ2ZXJzLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqaW52YWxpZGF0aW9uSWQpOworICAgICAgICB9IG1JbnZhbGlkYXRpb247CisgICAgICAgIC8vLyBCdWZmZXIgcG9vbCBzdGF0aXN0aWNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uIGFuZCB0cmFuc2ZlciBzdGF0aXN0aWNzLgorICAgICAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIC8vLyAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplQ2FjaGVkOworICAgICAgICAgICAgLy8vICMgb2YgY2FjaGVkIGJ1ZmZlcnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0NhY2hlZDsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgdXNlZC4gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUluVXNlOworICAgICAgICAgICAgLy8vICMgb2YgY3VycmVudGx5IHVzZWQgYnVmZmVycworICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzSW5Vc2U7CisKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIGNhbGxlZCBvbiBidWZmZXJwb29sLiAoIyBvZiBmZXRjaGVkIGZyb20gQmxvY2tQb29sKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEFsbG9jYXRpb25zOworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgdGhhdCB3ZXJlIHNlcnZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIC8vLyAoIyBvZiBhbGxvY2F0b3IgYWxsb2MgcHJldmVudGVkKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFJlY3ljbGVzOworICAgICAgICAgICAgLy8vICMgb2YgYnVmZmVyIHRyYW5zZmVycyBpbml0aWF0ZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJzOworICAgICAgICAgICAgLy8vICMgb2YgdHJhbnNmZXJzIHRoYXQgaGFkIHRvIGJlIGZldGNoZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsRmV0Y2hlczsKKworICAgICAgICAgICAgU3RhdHMoKQorICAgICAgICAgICAgICAgIDogbVNpemVDYWNoZWQoMCksIG1CdWZmZXJzQ2FjaGVkKDApLCBtU2l6ZUluVXNlKDApLCBtQnVmZmVyc0luVXNlKDApLAorICAgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMoMCksIG1Ub3RhbFJlY3ljbGVzKDApLCBtVG90YWxUcmFuc2ZlcnMoMCksIG1Ub3RhbEZldGNoZXMoMCkge30KKworICAgICAgICAgICAgLy8vIEEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckFsbG9jYXRlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkKys7CisKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgZXZpY3RlZCBhbmQgZGVzdHJveWVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckV2aWN0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgcmVjeWNsZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclJlY3ljbGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgICAgIG1Ub3RhbFJlY3ljbGVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBhdmFpbGFibGUgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyVW51c2VkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciB0cmFuc2ZlciBpcyBpbml0aWF0ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyU2VudCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlcnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGZldGNoIGlzIGludm9rZWQgYnkgYSBidWZmZXIgdHJhbnNmZXIuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRmV0Y2hlZCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxGZXRjaGVzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gbVN0YXRzOworCisgICAgICAgIGJvb2wgaXNWYWxpZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGludmFsaWRhdGUoYm9vbCBuZWVkc0FjaywgQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICBzdGF0aWMgdm9pZCBjcmVhdGVJbnZhbGlkYXRvcigpOworCisgICAgcHVibGljOgorICAgICAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICBCdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqIERlc3Ryb3lzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBhbGwgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAgICAgKiBFYWNoIHN0YXR1cyBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgbWV0aG9kcyB3aXRoICdoYW5kbGUnIHByZWZpeC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgb3duZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBpcyBvd25lZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlT3duQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyByZWxlYXNlZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIG93bmVyc2hpcCBpcyByZWxlYXNlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlUmVsZWFzZUJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzdGFydCBtZXNzYWdlIGZyb20gdGhlIHNlbmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX3RvIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYmVpbmcgYWNrZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfZnJvbSBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gcmVzdWx0IG1lc3NhZ2UgZnJvbSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZXhpc2l0bmcgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgY29ubmVjdGlvbiBiZWluZyBjbG9zZWQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFsbCB0aGUKKyAgICAgICAgICogYnVmZmVycyBhbmQgdHJhbnNhY3Rpb25zIG93bmVkIGJ5IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cC4KKyAgICAgICAgICogVGhlIHJlbGF0ZWQgRk1RIHdpbGwgYmUgY2xlYW5lZCB1cCB0b28uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY29ubmVjdGlvbiBleGlzdGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjeWNsZXMgYSBleGlzdGluZyBmcmVlIGJ1ZmZlciBpZiBpdCBpcyBwb3NzaWJsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYnVmZmVyIGFsbG9jYXRvcgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGlkIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIGJ1ZmZlciBpcyByZWN5Y2xlZCwge0Bjb2RlIGZhbHNlfQorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgZ2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHRvIGJ1ZmZlcnBvb2wuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvYyAgICAgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBhbGxvY1NpemUgdGhlIHNpemUgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgYnVmZmVyIGlkIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIFJlc3VsdFN0YXR1cyBhZGROZXdCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgICAgICogY2xlYW5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIGludmFsaWRhdGUgYWxsIGN1cnJlbnQKKyAgICAgICAgICogZnJlZSBidWZmZXJzLiBBY3RpdmUgYnVmZmVycyBhcmUgaW52YWxpZGF0ZWQgYWZ0ZXIgYmVpbmcgaW5hY3RpdmUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBBY2Nlc3Nvcjo6SW1wbDsKKyAgICB9IG1CdWZmZXJQb29sOworCisgICAgc3RydWN0ICBBY2Nlc3NvckludmFsaWRhdG9yIHsKKyAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiBtQWNjZXNzb3JzOworICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUN2OworICAgICAgICBib29sIG1SZWFkeTsKKworICAgICAgICBBY2Nlc3NvckludmFsaWRhdG9yKCk7CisgICAgICAgIHZvaWQgYWRkQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworICAgICAgICB2b2lkIGRlbEFjY2Vzc29yKHVpbnQzMl90IGFjY2Vzc29ySWQpOworICAgIH07CisKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFjY2Vzc29ySW52YWxpZGF0b3I+IHNJbnZhbGlkYXRvcjsKKworICAgIHN0YXRpYyB2b2lkIGludmFsaWRhdG9yVGhyZWFkKAorICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+ICZhY2Nlc3NvcnMsCisgICAgICAgIHN0ZDo6bXV0ZXggJm11dGV4LAorICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSAmY3YsCisgICAgICAgIGJvb2wgJnJlYWR5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSB1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SSU1QTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzFhYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCisgICAgc3JjczogWworICAgICAgICAiQWNjZXNzb3IuY3BwIiwKKyAgICAgICAgIkFjY2Vzc29ySW1wbC5jcHAiLAorICAgICAgICAiQnVmZmVyUG9vbENsaWVudC5jcHAiLAorICAgICAgICAiQnVmZmVyU3RhdHVzLmNwcCIsCisgICAgICAgICJDbGllbnRNYW5hZ2VyLmNwcCIsCisgICAgICAgICJDb25uZWN0aW9uLmNwcCIsCisgICAgICAgICJPYnNlcnZlci5jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTA3ZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKQEAgLTAsMCArMSw4NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDbGllbnQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlY2VpdmVUaW1lb3V0VXMgPSAxMDAwMDAwOyAvLyAxMDBtcworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvc3RNYXhSZXRyeSA9IDM7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FjaGVUdGxVcyA9IDEwMDAwMDA7IC8vIFRPRE86IHR1bmUKKworY2xhc3MgQnVmZmVyUG9vbENsaWVudDo6SW1wbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIGJvb2wgaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZDsKKyAgICB9CisKKyAgICBib29sIGlzTG9jYWwoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQgJiYgbUxvY2FsOworICAgIH0KKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbklkOworICAgIH0KKworICAgIHNwPElBY2Nlc3Nvcj4gJmdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yOworICAgIH0KKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICB2b2lkIHJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSUQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIHZvaWQgcG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgYm9vbCBwb3N0U2VuZCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7Citwcml2YXRlOgorCisgICAgYm9vbCBwb3N0UmVjZWl2ZSgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzKTsKKworICAgIGJvb2wgcG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKTsKKworICAgIHZvaWQgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKworICAgIGJvb2wgc3luY1JlbGVhc2VkKHVpbnQzMl90IG1zZ0lkID0gMCk7CisKKyAgICB2b2lkIGV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgIHZvaWQgaW52YWxpZGF0ZUJ1ZmZlcihCdWZmZXJJZCBpZCk7CisKKyAgICB2b2lkIGludmFsaWRhdGVSYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0byk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29sRGF0YUR0b3I7CisgICAgc3RydWN0IENsaWVudEJ1ZmZlcjsKKworICAgIGJvb2wgbUxvY2FsOworICAgIGJvb2wgbVZhbGlkOworICAgIHNwPElBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIHNwPENvbm5lY3Rpb24+IG1Mb2NhbENvbm5lY3Rpb247CisgICAgc3A8SUNvbm5lY3Rpb24+IG1SZW1vdGVDb25uZWN0aW9uOworICAgIHVpbnQzMl90IG1TZXFJZDsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBpbnQ2NF90IG1MYXN0RXZpY3RDYWNoZVVzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4gbUludmFsaWRhdGlvbkxpc3RlbmVyOworCisgICAgLy8gQ2FjaGVkQnVmZmVycworICAgIHN0cnVjdCBCdWZmZXJDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIGJvb2wgbUNyZWF0aW5nOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3JlYXRlQ3Y7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50QnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIGludCBtQWN0aXZlOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2hhbmdlVXM7CisKKyAgICAgICAgQnVmZmVyQ2FjaGUoKSA6IG1DcmVhdGluZyhmYWxzZSksIG1BY3RpdmUoMCksIG1MYXN0Q2hhbmdlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisKKyAgICAgICAgdm9pZCBpbmNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgICsrbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZGVjQWN0aXZlX2woKSB7CisgICAgICAgICAgICAtLW1BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEZNUSAtIHJlbGVhc2Ugbm90aWZpZXIKKyAgICBzdHJ1Y3QgUmVsZWFzZUNhY2hlIHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9ubHkgb25lIGxpc3Q/KHVzaW5nIG9uZSBsaXN0IG1heSBkZWFseSBzZW5kaW5nIG1lc3NhZ2VzPykKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzaW5nSWRzOworICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNlZElkczsKKyAgICAgICAgdWludDMyX3QgbUludmFsaWRhdGVJZDsgLy8gVE9ETzogaW52YWxpZGF0aW9uIEFDSyB0byBidWZmZXJwb29sCisgICAgICAgIGJvb2wgbUludmFsaWRhdGVBY2s7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiBtU3RhdHVzQ2hhbm5lbDsKKworICAgICAgICBSZWxlYXNlQ2FjaGUoKSA6IG1JbnZhbGlkYXRlSWQoMCksIG1JbnZhbGlkYXRlQWNrKHRydWUpIHt9CisgICAgfSBtUmVsZWFzaW5nOworCisgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZHVyaW5nIHN5bmNocm9uaXphdGlvbiBmcm9tIHJlbW90ZSBzaWRlLgorICAgIC8vIEluIG9yZGVyIHRvIG1pbmltaXplIHJlbW90ZSBjYWxscyBhbmQgbG9ja2luZyBkdXJ0YWlvbiwgdGhpcyBsb2NrIGlzIGhlbGQKKyAgICAvLyBieSBiZXN0IGVmZm9ydCBhcHByb2FjaCB1c2luZyB0cnlfbG9jaygpLgorICAgIHN0ZDo6bXV0ZXggbVJlbW90ZVN5bmNMb2NrOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkJsb2NrUG9vbERhdGFEdG9yIHsKKyAgICBCbG9ja1Bvb2xEYXRhRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbERhdGEgKmJ1ZmZlcikgeworICAgICAgICBCdWZmZXJJZCBpZCA9IGJ1ZmZlci0+bUlkOworICAgICAgICBkZWxldGUgYnVmZmVyOworCisgICAgICAgIGF1dG8gaW1wbCA9IG1JbXBsLmxvY2soKTsKKyAgICAgICAgaWYgKGltcGwgJiYgaW1wbC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBpbXBsLT5wb3N0QnVmZmVyUmVsZWFzZShpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiBtSW1wbDsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpDbGllbnRCdWZmZXIgeworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1FeHBpcmVVczsKKyAgICBib29sIG1IYXNDYWNoZTsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworICAgIHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbERhdGE+IG1DYWNoZTsKKworICAgIHZvaWQgdXBkYXRlRXhwaXJlKCkgeworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworcHVibGljOgorICAgIENsaWVudEJ1ZmZlcigKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGlkLCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgIDogbUhhc0NhY2hlKGZhbHNlKSwgbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLAorICAgICAgICAgICAgICBtSWQoaWQpLCBtSGFuZGxlKGhhbmRsZSkgeworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworICAgIH5DbGllbnRCdWZmZXIoKSB7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG1IYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCdWZmZXJJZCBpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZSgpIGNvbnN0IHsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgcmV0dXJuIG5vdyA+PSBtRXhwaXJlVXM7CisgICAgfQorCisgICAgYm9vbCBoYXNDYWNoZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IYXNDYWNoZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGZldGNoQ2FjaGUobmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlID0gbUNhY2hlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAoIW1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gQWxsb2NhdGVzIGEgcmF3IHB0ciBpbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nICNwb3N0QnVmZmVyUmVsZWFzZQorICAgICAgICAgICAgLy8gZnJvbSBkZWxldGVyLCBpbiBjYXNlIG9mIG5hdGl2ZV9oYW5kbGVfY2xvbmUgZmFpbHVyZS4KKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhICpwdHIgPSBuZXcgQnVmZmVyUG9vbERhdGEobUNvbm5lY3Rpb25JZCwgbUlkKTsKKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlKHB0ciwgQmxvY2tQb29sRGF0YUR0b3IoaW1wbCkpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUgPSBjYWNoZTsKKyAgICAgICAgICAgICAgICAgICAgbUhhc0NhY2hlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBvbkNhY2hlUmVsZWFzZSgpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IG1DYWNoZSBpcyBub3QgdmFsaWQ7CisgICAgICAgICAgICB1cGRhdGVFeHBpcmUoKTsKKyAgICAgICAgICAgIG1IYXNDYWNoZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpCisgICAgOiBtTG9jYWwodHJ1ZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciAqc3RhdHVzRGVzYzsKKyAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICppbnZEZXNjOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIG9ic2VydmVyLCB0cnVlLAorICAgICAgICAgICAgJm1Mb2NhbENvbm5lY3Rpb24sICZtQ29ubmVjdGlvbklkLCAmbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkLAorICAgICAgICAgICAgJnN0YXR1c0Rlc2MsICZpbnZEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPigqc3RhdHVzRGVzYyk7CisgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4oKmludkRlc2MpOworICAgICAgICBtVmFsaWQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsICYmCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+aXNWYWxpZCgpICYmCisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyICYmCisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyLT5pc1ZhbGlkKCk7CisgICAgfQorfQorCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikKKyAgICA6IG1Mb2NhbChmYWxzZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgIHNwPElDb25uZWN0aW9uPiYgb3V0Q29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCYgaWQgPSBtQ29ubmVjdGlvbklkOworICAgIHVpbnQzMl90JiBvdXRNc2dJZCA9IG1SZWxlYXNpbmcubUludmFsaWRhdGVJZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4mIG91dENoYW5uZWwgPQorICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+JiBvdXRPYnNlcnZlciA9CisgICAgICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXI7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwKKyAgICAgICAgICAgIFsmdmFsaWQsICZvdXRDb25uZWN0aW9uLCAmaWQsICZvdXRNc2dJZCwgJm91dENoYW5uZWwsICZvdXRPYnNlcnZlcl0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgc3RhdHVzLCBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCB1aW50MzJfdCBtc2dJZCwKKyAgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yJiBzdGF0dXNEZXNjLAorICAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3ImIGludkRlc2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgICAgIGlkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgICAgICBvdXRNc2dJZCA9IG1zZ0lkOworICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsID0gc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPihzdGF0dXNEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0T2JzZXJ2ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPihpbnZEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dENoYW5uZWwgJiYgb3V0Q2hhbm5lbC0+aXNWYWxpZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRPYnNlcnZlciAmJiBvdXRPYnNlcnZlci0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBtVmFsaWQgPSB0cmFuc1Jlc3VsdC5pc09rKCkgJiYgdmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoY2xlYXJDYWNoZSk7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IG1DYWNoZS5tTGFzdENoYW5nZVVzOworICAgICAgICBhY3RpdmUgPSBtQ2FjaGUubUFjdGl2ZSA+IDA7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBhY3RpdmU7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtZXNzYWdlSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgIHN5bmNSZWxlYXNlZChtZXNzYWdlSWQpOworICAgIC8vIFRPRE86IGV2aWN0IGNhY2hlIHJlcXVpcmVkPworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Zmx1c2goKSB7CisgICAgaWYgKCFtTG9jYWwgfHwgIW1Mb2NhbENvbm5lY3Rpb24gfHwgIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIHJldHVybiBtTG9jYWxDb25uZWN0aW9uLT5mbHVzaCgpOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhbGxvY2F0ZUJ1ZmZlckhhbmRsZShwYXJhbXMsICZidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IGl0IGlzIHJlY3ljbGVkLiAobm90IGhhdmluZyBhY3RpdmUgcmVmKQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShjYWNoZUl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgY2FjaGUgY3JlYXRpb24gZmFpbHVyZSAlZDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBoYW5kbGUgIT0gbnVsbHB0ciwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgcG9zdEJ1ZmZlclJlbGVhc2UoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcFVzICE9IDApIHsKKyAgICAgICAgdGltZXN0YW1wVXMgKz0ga1JlY2VpdmVUaW1lb3V0VXM7CisgICAgfQorICAgIGlmICghcG9zdFJlY2VpdmUoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmZldGNoQ2FjaGUocEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zZmVyIHRpbWVfb3V0CisgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSByZWZlcmVuY2UgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIGNhY2hlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtQ2FjaGUubUNyZWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZmV0Y2hCdWZmZXJIYW5kbGUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoYnVmZmVySWQsIHN0ZDo6bW92ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2LndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICBib29sIHBvc3RlZCA9IHBvc3RSZWNlaXZlUmVzdWx0KGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID8gdHJ1ZSA6IGZhbHNlLCAmbmVlZHNTeW5jKTsKKyAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgJWxsZCAtICV1IDogJXMgKCVkKSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgKmJ1ZmZlciA/ICJvayIgOiAiZmFpbCIsIHBvc3RlZCk7CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICBpZiAoIXBvc3RlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5wdXNoX2JhY2soYnVmZmVySWQpOworICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7Cit9CisKKy8vIFRPRE86IHJldmlzZSBhZC1ob2MgcG9zdGluZyBkYXRhIHN0cnVjdHVyZQorYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICB7CisgICAgICAgIC8vIFRPRE86IGRvbid0IG5lZWQgdG8gY2FsbCBzeW5jUmVsZWFzZWQgZXZlcnkgdGltZQorICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICB9CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICp0aW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICAqdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKSB8IG1TZXFJZCsrOworICAgICAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQsIHRhcmdldD8KKyAgICAgICAgcmV0ID0gIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTywgbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICByZWNlaXZlciwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgIG5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZSgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Bvc3RNYXhSZXRyeTsgKytpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID09IDAgfHwgbm93IDwgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00sCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQKKyAgICBib29sIHJldCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICByZXN1bHQgPyBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LIDogQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUiwKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgKm5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjp0cnlTeW5jRnJvbVJlbW90ZSgpIHsKKyAgICBpZiAobVJlbW90ZVN5bmNMb2NrLnRyeV9sb2NrKCkpIHsKKyAgICAgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICAgICBuZWVkc1N5bmMgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZHNTeW5jKSB7CisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMik7CisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQ7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBtUmVtb3RlQ29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBbXQorICAgICAgICAgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGVTeW5jTG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jaworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpzeW5jUmVsZWFzZWQodWludDMyX3QgbWVzc2FnZUlkKSB7CisgICAgYm9vbCBjbGVhcmVkID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoQnVmZmVySWQmIGlkOiBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVsZWFzZSBidWZmZXIgJWxsZCAtICV1IiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGlkKTsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5vbkNhY2hlUmVsZWFzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuZGVjQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHJlbGVhc2Ugc3RhdHVzIGluY29uc2l0ZW50ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgc3RhdHVzIGluY29uc2l0ZW50ISIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuY2xlYXIoKTsKKyAgICAgICAgICAgIGNsZWFyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+IGludmFsaWRhdGlvbnM7CisgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyLT5nZXRJbnZhbGlkYXRpb25zKGludmFsaWRhdGlvbnMpOworICAgIHVpbnQzMl90IGxhc3RNc2dJZCA9IDA7CisgICAgaWYgKGludmFsaWRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKGF1dG8gaXQgPSBpbnZhbGlkYXRpb25zLmJlZ2luKCk7IGl0ICE9IGludmFsaWRhdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChpdC0+bWVzc2FnZUlkICE9IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0TXNnSWQgPSBpdC0+bWVzc2FnZUlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0LT5mcm9tQnVmZmVySWQgPT0gaXQtPnRvQnVmZmVySWQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJvbUJ1ZmZlcklkID0gVUlOVDMyX01BWAorICAgICAgICAgICAgICAgIGludmFsaWRhdGVCdWZmZXIoaXQtPmZyb21CdWZmZXJJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSYW5nZShpdC0+ZnJvbUJ1ZmZlcklkLCBpdC0+dG9CdWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaWYgKGxhc3RNc2dJZCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoaXNNZXNzYWdlTGF0ZXIobGFzdE1zZ0lkLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpKSB7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkID0gbGFzdE1zZ0lkOworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlSWQgIT0gMCkgeworICAgICAgICAgICAgLy8gbWVzc2FnZXMgYXJlIGRyYWluZWQuCisgICAgICAgICAgICBpZiAoaXNNZXNzYWdlTGF0ZXIobWVzc2FnZUlkLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpKSB7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkID0gbWVzc2FnZUlkOworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2sgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjaykgeworICAgICAgICAgICAgLy8gcG9zdCBBQ0sKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJJbnZhbGlkYXRlQWNrKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQsICZtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrKTsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgJWxsZCBpbnZhbGlkYXRlaW9uIGFjayAoJWQpICV1IiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjaywgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xlYXJlZDsKK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaWYgKG5vdyA+PSBtTGFzdEV2aWN0Q2FjaGVVcyArIGtDYWNoZVR0bFVzIHx8IGNsZWFyQ2FjaGUpIHsKKyAgICAgICAgc2l6ZV90IGV2aWN0ZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpICYmIChpdC0+c2Vjb25kLT5leHBpcmUoKSB8fCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICArK2V2aWN0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNhY2hlIGNvdW50ICVsbGQgOiB0b3RhbCAlenUsIGFjdGl2ZSAlZCwgZXZpY3RlZCAlenUiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIG1DYWNoZS5tQnVmZmVycy5zaXplKCksIG1DYWNoZS5tQWN0aXZlLCBldmljdGVkKTsKKyAgICAgICAgbUxhc3RFdmljdENhY2hlVXMgPSBub3c7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aW52YWxpZGF0ZUJ1ZmZlcihCdWZmZXJJZCBpZCkgeworICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGlkID09IGl0LT5zZWNvbmQtPmlkKCkpIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNhY2hlIGludmFsaWRhdGVkICVsbGQgOiBidWZmZXIgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5jb25zaXRlbnQgaW52YWxpZGF0aW9uICVsbGQgOiBhY3RpdmVyIGJ1ZmZlciEhICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsICh1bnNpZ25lZCBpbnQpaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppbnZhbGlkYXRlUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8pIHsKKyAgICBzaXplX3QgaW52YWxpZGF0ZWQgPSAwOworICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgQnVmZmVySWQgYmlkID0gaXQtPnNlY29uZC0+aWQoKTsKKyAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbSA8PSBiaWQgJiYgYmlkIDwgdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgKytpbnZhbGlkYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChmcm9tIDw9IGJpZCB8fCBiaWQgPCB0bykgeworICAgICAgICAgICAgICAgICAgICArK2ludmFsaWRhdGVkOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICArK2l0OworICAgIH0KKyAgICBBTE9HVigiY2FjaGUgaW52YWxpZGF0ZWQgJWxsZCA6ICMgb2YgaW52YWxpZGF0ZWQgJXp1IiwKKyAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGludmFsaWRhdGVkKTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUxvY2FsQ29ubmVjdGlvbi0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgcGFyYW1zLCBidWZmZXJJZCwgJmFsbG9jSGFuZGxlKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShhbGxvY0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNsaWVudCBhbGxvY2F0ZSByZXN1bHQgJWxsZCAlZCA6ICV1IGNsb25lICVwIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywKKyAgICAgICAgICAgICAgKmhhbmRsZSA/ICpidWZmZXJJZCA6IDAgLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgaWYgKG1Mb2NhbCkgeworICAgICAgICBjb25uZWN0aW9uID0gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gY29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmaGFuZGxlXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5idWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPyBzdGF0dXMgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IsIG9ic2VydmVyKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IsIG9ic2VydmVyKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6fkJ1ZmZlclBvb2xDbGllbnQoKSB7CisgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvcnBoYW5lZCBidWZmZXJzPworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNMb2NhbCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzTG9jYWwoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUltcGwtPmlzQWN0aXZlKGxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKTsKK30KKworQ29ubmVjdGlvbklkIEJ1ZmZlclBvb2xDbGllbnQ6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICAqYWNjZXNzb3IgPSBtSW1wbC0+Z2V0QWNjZXNzb3IoKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSWQpIHsKKyAgICBBTE9HVigiYnVmZmVycG9vbDIgY2xpZW50IHJlY3YgaW52ICV1IiwgbXNnSWQpOworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgbUltcGwtPnJlY2VpdmVJbnZhbGlkYXRpb24obXNnSWQpOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmZsdXNoKCkgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mbHVzaCgpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgYm9vbCByZXN1bHQgPSBtSW1wbC0+cG9zdFNlbmQoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5tSWQsIHJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA/IFJlc3VsdFN0YXR1czo6T0sgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDlhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MQ0xJRU5UX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lPYnNlcnZlci5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNvbm5lY3Rpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBjbGllbnQgZm9yIGEgYnVmZmVyIHBvb2wuIEZvciBhIHNwZWNpZmljIGJ1ZmZlciBwb29sLCBhdCBtb3N0CisgKiBvbmUgYnVmZmVyIHBvb2wgY2xpZW50IGV4aXN0cyBwZXIgcHJvY2Vzcy4gVGhpcyBjbGFzcyB3aWxsIG5vdCBiZSBleHBvc2VkCisgKiBvdXRzaWRlLiBBIGJ1ZmZlciBwb29sIGNsaWVudCB3aWxsIGJlIHVzZWQgdmlhIENsaWVudE1hbmFnZXIuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBjbGllbnQgZnJvbSBhIGxvY2FsIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI2NyZWF0ZSkuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgcmVtb3RlIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI3JlZ2lzdGVyU2VuZGVyKS4KKyAgICAgKiBOb3RlOiBBIGJ1ZmZlciBwb29sIGNsaWVudCBjcmVhdGVkIHdpdGggcmVtb3RlIGJ1ZmZlciBwb29sIGNhbm5vdAorICAgICAqIGFsbG9jYXRlIGEgYnVmZmVyLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgY2xpZW50LiAqLworICAgIH5CdWZmZXJQb29sQ2xpZW50KCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICBib29sIGlzTG9jYWwoKTsKKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgdm9pZCByZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkKTsKKworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ2xpZW50TWFuYWdlcjsKKyAgICBmcmllbmQgc3RydWN0IE9ic2VydmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzNzI2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5jcHAKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xTdGF0dXMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCkgeworICAgIGludDY0X3Qgc3RhbXA7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIC8vIFRPRE86IENMT0NLX01PTk9UT05JQ19DT0FSU0U/CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisgICAgc3RhbXAgPSB0cy50dl9uc2VjIC8gMTAwMDsKKyAgICBzdGFtcCArPSAodHMudHZfc2VjICogMTAwMDAwMExMKTsKKyAgICByZXR1cm4gc3RhbXA7Cit9CisKK2Jvb2wgaXNNZXNzYWdlTGF0ZXIodWludDMyX3QgY3VyTXNnSWQsIHVpbnQzMl90IHByZXZNc2dJZCkgeworICAgIHJldHVybiBjdXJNc2dJZCAhPSBwcmV2TXNnSWQgJiYgY3VyTXNnSWQgLSBwcmV2TXNnSWQgPCBwcmV2TXNnSWQgLSBjdXJNc2dJZDsKK30KKworYm9vbCBpc0J1ZmZlckluUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgaWYgKGZyb20gPCB0bykgeworICAgICAgICByZXR1cm4gZnJvbSA8PSBidWZmZXJJZCAmJiBidWZmZXJJZCA8IHRvOworICAgIH0gZWxzZSB7IC8vIHdyYXAgaGFwcGVucworICAgICAgICByZXR1cm4gZnJvbSA8PSBidWZmZXJJZCB8fCBidWZmZXJJZCA8IHRvOworICAgIH0KK30KKworc3RhdGljIGNvbnN0ZXhwciBpbnQga051bUVsZW1lbnRzSW5RdWV1ZSA9IDEwMjQqMTY7CitzdGF0aWMgY29uc3RleHByIGludCBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlID0gMTI4OworCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6Om9wZW4oCisgICAgICAgIENvbm5lY3Rpb25JZCBpZCwgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlkIGNvbGxpc2lvbiBsb2c/CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzUXVldWU+KGtOdW1FbGVtZW50c0luUXVldWUpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZm1xRGVzY1B0ciA9IHF1ZXVlLT5nZXREZXNjKCk7CisgICAgfQorICAgIGF1dG8gcmVzdWx0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5pbnNlcnQoCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihpZCwgc3RkOjptb3ZlKHF1ZXVlKSkpOworICAgIGlmICghcmVzdWx0LnNlY29uZCkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGlkKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgPT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lcmFzZShpZCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5iZWdpbigpOyBpdCAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gaXQtPnNlY29uZC0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgIHdoaWxlIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+cmVhZCgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiByZWFkcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZyAoc3B1cmlvdXMgY2xpZW50PykKKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHJlYWQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gaXQtPmZpcnN0OworICAgICAgICAgICAgbWVzc2FnZXMucHVzaF9iYWNrKG1lc3NhZ2UpOworICAgICAgICAgICAgLS1hdmFpbDsKKyAgICAgICAgfQorICAgIH0KK30KKworQnVmZmVyU3RhdHVzQ2hhbm5lbDo6QnVmZmVyU3RhdHVzQ2hhbm5lbCgKKyAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJTdGF0dXNRdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6Om5lZWRzU3luYygpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICByZXR1cm4gYXZhaWwgKyBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlIDwga051bUVsZW1lbnRzSW5RdWV1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmIHBlbmRpbmcuc2l6ZSgpID4gMCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgYXZhaWwgPSBzdGQ6Om1pbihhdmFpbCwgcGVuZGluZy5zaXplKCkpOworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGF2YWlsOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIHVpbnQzMl90IGludmFsaWRhdGVJZCwKKyAgICAgICAgYm9vbCAqaW52YWxpZGF0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmICEqaW52YWxpZGF0ZWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpJTlZBTElEQVRJT05fQUNLOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGludmFsaWRhdGVJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kaW5nPworICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmludmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgQnVmZmVyU3RhdHVzIHN0YXR1cywgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBzaXplX3QgbnVtUGVuZGluZyA9IHBlbmRpbmcuc2l6ZSgpOworICAgICAgICBpZiAoYXZhaWwgPj0gbnVtUGVuZGluZyArIDEpIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgcmVsZWFzZSwgbWVzc2FnZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGVuZGluZzsgKytpKSB7CisgICAgICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgICAgIHJlbGVhc2UuYnVmZmVySWQgPSBpZDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJnJlbGVhc2UsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nPworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkID0gdGFyZ2V0SWQ7CisgICAgICAgICAgICAvLyBUT0RPIDogdGltZXNhdGFtcAorICAgICAgICAgICAgbWVzc2FnZS50aW1lc3RhbXBVcyA9IDA7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgJmZtcURlc2MpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+KGZtcURlc2MpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVmFsaWQgID0gdHJ1ZTsKKyAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUgPSBzdGQ6Om1vdmUocXVldWUpOworICAgIC8vIGRyYWluIHByZXZpb3VzIG1lc3NhZ2VzCisgICAgc2l6ZV90IGF2YWlsID0gc3RkOjptaW4oCisgICAgICAgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmF2YWlsYWJsZVRvUmVhZCgpLCAoc2l6ZV90KSBrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiB0ZW1wKGF2YWlsKTsKKyAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+cmVhZCh0ZW1wLmRhdGEoKSwgYXZhaWwpOworICAgIH0KK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6Z2V0SW52YWxpZGF0aW9ucygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgLy8gVHJ5IHR3aWNlIGluIGNhc2Ugb2Ygb3ZlcmZsb3cuCisgICAgLy8gVE9ETzogaGFuZGxpbmcgb3ZlcmZsb3cgdGhvdWdoIGl0IG1heSBub3QgaGFwcGVuLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IHN0ZDo6bWluKAorICAgICAgICAgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+YXZhaWxhYmxlVG9SZWFkKCksIChzaXplX3QpIGtOdW1FbGVtZW50c0luUXVldWUpOworICAgICAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiB0ZW1wKGF2YWlsKTsKKyAgICAgICAgICAgIGlmIChtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPnJlYWQodGVtcC5kYXRhKCksIGF2YWlsKSkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnJlc2VydmUobWVzc2FnZXMuc2l6ZSgpICsgYXZhaWwpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHRlbXAuYmVnaW4oKTsgaXQgIT0gdGVtcC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2soKml0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKworQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6QnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCgpCisgICAgOiBtVmFsaWQodHJ1ZSksCisgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUoCisgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+KGtOdW1FbGVtZW50c0luUXVldWUsIHRydWUpKSB7CisgICAgaWYgKCFtQnVmZmVySW52YWxpZGF0aW9uUXVldWUgfHwgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgfQorfQorCitib29sIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjpnZXREZXNjKGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgKipmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+Z2V0RGVzYygpOworICAgIH0gZWxzZSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6cG9zdEludmFsaWRhdGlvbigKKyAgICAgICAgdWludDMyX3QgbXNnSWQsIEJ1ZmZlcklkIGZyb21JZCwgQnVmZmVySWQgdG9JZCkgeworICAgIEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZTsKKworICAgIG1lc3NhZ2UubWVzc2FnZUlkID0gbXNnSWQ7CisgICAgbWVzc2FnZS5mcm9tQnVmZmVySWQgPSBmcm9tSWQ7CisgICAgbWVzc2FnZS50b0J1ZmZlcklkID0gdG9JZDsKKyAgICAvLyBUT0RPOiBoYW5kbGUgZmFpbHVyZSAoaXQgZG9lcyBub3QgaGFwcGVuIG5vcm1hbGx5LikKKyAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPndyaXRlKCZtZXNzYWdlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjU4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8qKiBSZXR1cm5zIG1vbm90b25pYyB0aW1lc3RhbXAgaW4gVXMgc2luY2UgZml4ZWQgcG9pbnQgaW4gdGltZS4gKi8KK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCk7CisKK2Jvb2wgaXNNZXNzYWdlTGF0ZXIodWludDMyX3QgY3VyTXNnSWQsIHVpbnQzMl90IHByZXZNc2dJZCk7CisKK2Jvb2wgaXNCdWZmZXJJblJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuIGJ1ZmZlcgorICogb3duZXJzaGlwL3N0YXR1cyBjaGFuZ2UgbWVzc2FnZXMgYXJlIHNlbnQgdmlhIHRoZSBGTVFzIGZyb20gdGhlIGNsaWVudHMuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c09ic2VydmVyIHsKK3ByaXZhdGU6CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+PgorICAgICAgICAgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlczsKKworcHVibGljOgorICAgIC8qKiBDcmVhdGVzIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIEZNUSBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgb3BlbihDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKTsKKworICAgIC8qKiBDbG9zZXMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGlzIGNsb3NlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBpZCk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIEZNUSBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcyk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzCisgKiBjaGFuZ2UgbWVzc2FnZXMgYXJlIHNlbnQgdmlhIHRoZSBmbXEgdG8gdGhlIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNDaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBtQnVmZmVyU3RhdHVzUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YKKyAgICAgKiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzYyAgIERlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqLworICAgIEJ1ZmZlclN0YXR1c0NoYW5uZWwoY29uc3QgU3RhdHVzRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBib29sIG5lZWRzU3luYygpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgcmVsZWFzZSBtZXNzYWdlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyCisgICAgICogdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIGJ1ZmZlciBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIG5ldyBzdGF0dXMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHRhcmdldElkICAgICAgY29ubmVjdGlvbiBJZCBvZiB0aGUgcmVjZWl2ZXIob25seSB3aGVuIHRoZSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0cyBhIHN0YXR1cyBtZXNzYWdlKS4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpcyBwb3N0ZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciBpbnZhbGlhZGF0aW9uIG1lc3NnZSB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGludmFsaWRhdGVJZCAgaW52YWxpZGF0aW9uIGFjayB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaWYgaW52YWxpZGF0aW9uIGlkIGlzIHplcm8sIHRoZSBhY2sgd2lsbCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICogQHBhcmFtIGludmFsaWRhdGVkICAgc2V0cyB7QGNvZGUgdHJ1ZX0gb25seSB3aGVuIHRoZSBpbnZhbGlkYXRpb24gYWNrIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqLworICAgIHZvaWQgcG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgdWludDMyX3QgaW52YWxpZGF0ZUlkLAorICAgICAgICAgICAgYm9vbCAqaW52YWxpZGF0ZWQpOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZvciBhIGJ1ZmZlciBwb29sIGNsaWVudC4gQnVmZmVyIGludmFsaWRhdGlvbgorICogbWVzc2FnZXMgYXJlIHJlY2VpdmVkIHZpYSB0aGUgZm1xIGZyb20gdGhlIGJ1ZmZlciBwb29sLiBCdWZmZXIgaW52YWxpZGF0aW9uCisgKiBtZXNzYWdlcyBhcmUgaGFuZGxlZCBhcyBzb29uIGFzIHBvc3NpYmxlLgorICovCitjbGFzcyBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lciB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdG8gYSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmcm9tIGEgZGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzYyAgIERlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqLworICAgIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyKGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgJmZtcURlc2MpOworCisgICAgLyoqIFJldHJpZXZlcyBhbGwgcGVuZGluZyBidWZmZXIgaW52YWxpZGF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VzICByZXRyaWV2ZWQgcGVuZGluZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIGdldEludmFsaWRhdGlvbnMoc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gJm1lc3NhZ2VzKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2VzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuIEEgYnVmZmVyIHBvb2wgd2lsbCBzZW5kIGJ1ZmZlcgorICogaW52YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnRzIHZpYSB0aGUgRk1RLiBUaGUgRk1RIGlzIHNoYXJlZCBhbW9uZworICogYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZvciBhIGJ1ZmZlciBwb29sLgorICAgICAqLworICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2VzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGRlc2NyaXB0b3Igb2YgYSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUS4gdGhlIGRlc2NyaXB0b3IgbWF5CisgICAgICogYmUgcGFzc2VkIHRvIHRoZSBjbGllbnQgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24gaGFuZGxpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBkb3VibGUgcHRyIG9mIGNyZWF0ZWQgRk1RJ3MgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICB2b2lkIGdldERlc2MoY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAqKmZtcURlc2NQdHIpOworCisgICAgLyoqIFBvc3RzIGEgYnVmZmVyIGludmFsaWRhdGlvbiBmb3IgaW52YWxpZGF0ZWQgYnVmZmVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2dJZCAgICAgSW52YWxpZGF0aW9uIG1lc3NhZ2UgaWQgd2hpY2ggaXMgdXNlZCB3aGVuIGNsaWVudHMgc2VuZAorICAgICAqICAgICAgICAgICAgICAgICAgYWNrcyBiYWNrIHZpYSBCdWZmZXJTdGF0dXNNZXNzYWdlCisgICAgICogQHBhcmFtIGZyb21JZCAgICBUaGUgc3RhcnQgYnVmZmVyaWQgb2YgdGhlIGludmFsaWRhdGVkIGJ1ZmZlcnMoaW5jbHVzaXZlKQorICAgICAqIEBwYXJhbSB0b0lkICAgICAgVGhlIGVuZCBidWZmZXJJZCBvZiB0aGUgaW52YWxpZGF0ZWQgYnVmZmVycyhpbmNsdXNpdmUpCisgICAgICovCisgICAgdm9pZCBwb3N0SW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkLCBCdWZmZXJJZCBmcm9tSWQsIEJ1ZmZlcklkIHRvSWQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlNUQVRVU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9DbGllbnRNYW5hZ2VyLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0NsaWVudE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMWQzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9DbGllbnRNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDUzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xNYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisjaW5jbHVkZSAiT2JzZXJ2ZXIuaCIKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVnaXN0ZXJUaW1lb3V0VXMgPSA1MDAwMDA7IC8vIDAuNSBzZWMKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiAxIHNlYyB0dW5lCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsaWVudFRpbWVvdXRVcyA9IDUwMDAwMDA7IC8vIFRPRE86IDUgc2VjcyB0dW5lCisKKy8qKgorICogVGhlIGhvbGRlciBvZiB0aGUgY29va2llIG9mIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAqIFRoZSBjb29raWUgaXMgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBmb3IgZWFjaCBJQ2xpZW50TWFuYWdlci4KKyAqIChUaGUgY29va2llIGlzIHVzZWQgdG8gbm90aWZ5IGRlYXRoIG9mIGNsaWVudHMgdG8gYnVmZmVycG9vbCBwcm9jZXNzLikKKyAqLworY2xhc3MgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvb2tpZSBob2xkZXIgZm9yIHJlbW90ZSBJQ2xpZW50TWFuYWdlcihzKS4KKyAgICAgKi8KKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgY29va2llIGZvciBhIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyICAgdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICogQHBhcmFtIGFkZGVkICAgICB0cnVlIHdoZW4gdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIgaXMgYWRkZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIG5ld2x5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGNvb2tpZSBmb3IgdGhlIHNwZWNpZmllZCBJQ2xpZW50TWFuYWdlci4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBnZXRDb29raWUoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLCBib29sICphZGRlZCk7CisKK3ByaXZhdGU6CisgICAgdWludDY0X3QgbVNlcUlkOworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQ2xpZW50TWFuYWdlcj4sIHVpbnQ2NF90Pj4gbU1hbmFnZXJzOworfTsKKworQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Q2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpIDogbVNlcUlkKDApe30KKwordWludDY0X3QgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Z2V0Q29va2llKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsCisgICAgICAgIGJvb2wgKmFkZGVkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byBpdCA9IG1NYW5hZ2Vycy5iZWdpbigpOyBpdCAhPSBtTWFuYWdlcnMuZW5kKCk7KSB7CisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiBrZXkgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlc0VxdWFsKGtleSwgbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAqYWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCA9IG1NYW5hZ2Vycy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDY0X3QgaWQgPSBtU2VxSWQrKzsKKyAgICAqYWRkZWQgPSB0cnVlOworICAgIG1NYW5hZ2Vycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobWFuYWdlciwgaWQpKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKK2NsYXNzIENsaWVudE1hbmFnZXI6OkltcGwgeworcHVibGljOgorICAgIEltcGwoKTsKKworICAgIC8vIEJuUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvLyBCcFJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKK3ByaXZhdGU6CisgICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCBkZWFkbG9jayBiZXR3ZWVuIG11bHRpcGxlIGxvY2tzLAorICAgIC8vIGFsd2F5cyBsb2NrIENsaWVudENhY2hlLmxvY2sgYmVmb3JlIGxvY2tpbmcgQWN0aXZlQ2xpZW50cy5sb2NrLgorICAgIHN0cnVjdCBDbGllbnRDYWNoZSB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgd2hpbGUgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUFjY2Vzc29yPiwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25uZWN0Q3Y7CisgICAgICAgIGJvb2wgbUNvbm5lY3Rpbmc7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisKKyAgICAgICAgQ2xpZW50Q2FjaGUoKSA6IG1Db25uZWN0aW5nKGZhbHNlKSwgbUxhc3RDbGVhblVwVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBBY3RpdmUgY2xpZW50cyB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHZpYSBDb25uZWN0aW9uSWQKKyAgICBzdHJ1Y3QgQWN0aXZlQ2xpZW50cyB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgIH0gbUFjdGl2ZTsKKworICAgIHNwPE9ic2VydmVyPiBtT2JzZXJ2ZXI7CisKKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIG1SZW1vdGVDbGllbnRDb29raWVzOworfTsKKworQ2xpZW50TWFuYWdlcjo6SW1wbDo6SW1wbCgpCisgICAgOiBtT2JzZXJ2ZXIobmV3IE9ic2VydmVyKCkpIHt9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNsZWFuVXAoKTsKKyAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga1JlZ2lzdGVyVGltZW91dFVzOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IHNBY2Nlc3NvciA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc0FjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChzQWNjZXNzb3IsIGFjY2Vzc29yKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZS5tQ2xpZW50cy5maW5kKCpwQ29ubmVjdGlvbklkKSAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgZXhpc3RpbmcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbUNhY2hlLm1Db25uZWN0aW5nKSB7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSB0cnVlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IsIG1PYnNlcnZlcik7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgbU9ic2VydmVyLT5hZGRDbGllbnQoY29uSWQsIHdjbGllbnQpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IGZhbHNlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrUmVnaXN0ZXJUaW1lb3V0VXMpKTsKKyAgICB9IHdoaWxlIChnZXRUaW1lc3RhbXBOb3coKSA8IHRpbWVvdXRVcyk7CisgICAgLy8gVE9ETzogcmV0dXJuIHRpbWVvdXQgZXJyb3IKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgYm9vbCBsb2NhbCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKHNlbmRlcklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBsb2NhbCA9IGl0LT5zZWNvbmQtPmlzTG9jYWwoKTsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgICAgICAgICAgYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgWyZycywgcmVjZWl2ZXJJZF0oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICpyZWNlaXZlcklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWwgJiYgcnMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQgPSBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisgICAgICAgICAgICBpZiAocmVjaXBpZW50KSAgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgZGVhdGggcmVjaXBpZW50IHJlZ2lzdGVyZWQgJWxsZCIsIChsb25nIGxvbmcpKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGJvb2wgYWRkZWQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgY29va2llID0gbVJlbW90ZUNsaWVudENvb2tpZXMuZ2V0Q29va2llKHJlY2VpdmVyLCAmYWRkZWQpOworICAgICAgICAgICAgICAgIHJlY2lwaWVudC0+YWRkQ29va2llVG9Db25uZWN0aW9uKGNvb2tpZSwgKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGlmIChhZGRlZCkgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48Ym9vbD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+bGlua1RvRGVhdGgocmVjaXBpZW50LCBjb29raWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnM7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IgPSBuZXcgQWNjZXNzb3IoYWxsb2NhdG9yKTsKKyAgICBpZiAoIWFjY2Vzc29yIHx8ICFhY2Nlc3Nvci0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICAvLyBUT0RPOiBvYnNlcnZlciBpcyBsb2NhbC4gdXNlIGRpcmVjdCBjYWxsIGluc3RlYWQgb2YgaGlkbCBjYWxsLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3NvciwgbU9ic2VydmVyKTsKKyAgICBpZiAoIWNsaWVudCB8fCAhY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIC8vIFNpbmNlIGEgbmV3IGJ1ZmZlcnBvb2wgaXMgY3JlYXRlZCwgZXZpY3QgbWVtb3JpZXMgd2hpY2ggYXJlIHVzZWQgYnkKKyAgICAvLyBleGlzdGluZyBidWZmZXJwb29scyBhbmQgY2xpZW50cy4KKyAgICBjbGVhblVwKHRydWUpOworICAgIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgbU9ic2VydmVyLT5hZGRDbGllbnQoY29uSWQsIHdjbGllbnQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgQUxPR1YoImNyZWF0ZSBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbG9zaW5nID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvciB8fCAoYWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKGNBY2Nlc3NvciwgYWNjZXNzb3IpKSkgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2NrMi51bmxvY2soKTsKKyAgICAgICAgbG9jazEudW5sb2NrKCk7CisgICAgICAgIGNsb3NpbmctPmZsdXNoKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmZsdXNoKCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IGJ1ZmZlci0+bUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpnZXRBY2Nlc3NvcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Z2V0QWNjZXNzb3IoYWNjZXNzb3IpOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpbnQ2NF90IGxhc3RUcmFuc2FjdGlvblVzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtQ2FjaGUubUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMgPCBub3cpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgaW50IGNsZWFuZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzQWN0aXZlKCZsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFRyYW5zYWN0aW9uVXMgKyBrQ2xpZW50VGltZW91dFVzIDwgbm93KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICsrY2xlYW5lZDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2NpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiIyBvZiBjbGVhbmVkIGNvbm5lY3Rpb25zOiAlZCIsIGNsZWFuZWQpOworICAgICAgICBtQ2FjaGUubUxhc3RDbGVhblVwVXMgPSBub3c7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IC0xOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKGJ1ZmZlclBvb2wsICZjb25uZWN0aW9uSWQpOworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUiwgLTEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBNZXRob2RzIGZvciBsb2NhbCB1c2UuCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2U7CitzdGQ6Om11dGV4IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZUxvY2s7CisKK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNJbnN0YW5jZUxvY2spOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBDbGllbnRNYW5hZ2VyKCk7CisgICAgfQorICAgIEFjY2Vzc29yOjpjcmVhdGVJbnZhbGlkYXRvcigpOworICAgIHJldHVybiBzSW5zdGFuY2U7Cit9CisKK0NsaWVudE1hbmFnZXI6OkNsaWVudE1hbmFnZXIoKSA6IG1JbXBsKG5ldyBJbXBsKCkpIHt9CisKK0NsaWVudE1hbmFnZXI6On5DbGllbnRNYW5hZ2VyKCkgeworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y3JlYXRlKGFsbG9jYXRvciwgcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIHNlbmRlcklkLCByZWNlaXZlcklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Zmx1c2goY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZShjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCogdGltZXN0YW1wVXMpIHsKKyAgICBpZiAobUltcGwgJiYgYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OmNsZWFuVXAoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKHRydWUpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQwZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ29ubmVjdGlvbjo6ZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcklkICE9IFNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BY2Nlc3Nvci0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgQnVmZmVye2J1ZmZlcklkLCBoYW5kbGV9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIEJ1ZmZlcnswLCBudWxscHRyfSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQ29ubmVjdGlvbjo6Q29ubmVjdGlvbigpIDogbUluaXRpYWxpemVkKGZhbHNlKSwgbUNvbm5lY3Rpb25JZCgtMUxMKSB7fQorCitDb25uZWN0aW9uOjp+Q29ubmVjdGlvbigpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjppbml0aWFsaXplKAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4mIGFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbUFjY2Vzc29yID0gYWNjZXNzb3I7CisgICAgICAgIG1Db25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQ29ubmVjdGlvbjo6Zmx1c2goKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3Nvci0+Zmx1c2goKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDb25uZWN0aW9uOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBDb25uZWN0aW9uOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIG1BY2Nlc3Nvci0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICB9Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlIGZvbGxvdy4KKworLy9JQ29ubmVjdGlvbiogSElETF9GRVRDSF9JQ29ubmVjdGlvbihjb25zdCBjaGFyKiAvKiBuYW1lICovKSB7CisvLyAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwNzc0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ09OTkVDVElPTl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbm5lY3Rpb24gOiBwdWJsaWMgSUNvbm5lY3Rpb24geworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNvbm5lY3Rpb24gZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZXMgYWxsIGJ1ZmZlcnMgd2hpY2ggYXJlIGFjdGl2ZSBhbmQvb3IgYXJlIHJlYWR5IHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gUmVjeWNsZXMgYSBidWZmZXIgaWYKKyAgICAgKiBpdCBpcyBwb3NzaWJsZS4gVGhlIHJldHVybmVkIGJ1ZmZlciBjYW4gYmUgdHJhbnNmZXJyZWQgdG8gb3RoZXIgcmVtb3RlCisgICAgICogY2xpZW50cyhDb25uZWN0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgSWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb3JtcyBwZXJpb2RpYyBjYWNoZSBjbGVhbmluZworICAgICAqIGZyb20gYnVmZmVycG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgYnVmZmVycG9vbCBmcmVlcyBhbGwgYnVmZmVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgY29ubmVjdGlvbi4gKi8KKyAgICB+Q29ubmVjdGlvbigpOworCisgICAgLyoqIENyZWF0ZXMgYSBjb25uZWN0aW9uLiAqLworICAgIENvbm5lY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHdpdGggdGhlIHNwZWNpZmllZCBidWZmZXIgcG9vbCBhbmQgdGhlIGNvbm5lY3Rpb24gaWQuCisgICAgICogVGhlIGNvbm5lY3Rpb24gaWQgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgd2hvbGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc29yICAgICAgdGhlIHNwZWNpZmllZCBidWZmZXIgcG9vbC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBJZC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBTWU5DX0JVRkZFUklEID0gVUlOVDMyX01BWCwKKyAgICB9OworCitwcml2YXRlOgorICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIHNwPEFjY2Vzc29yPiBtQWNjZXNzb3I7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyMzE2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmNwcApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk9ic2VydmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworT2JzZXJ2ZXI6Ok9ic2VydmVyKCkgeworfQorCitPYnNlcnZlcjo6fk9ic2VydmVyKCkgeworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlciBmb2xsb3cuCitSZXR1cm48dm9pZD4gT2JzZXJ2ZXI6Om9uTWVzc2FnZShpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgbXNnSWQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGF1dG8gaXQgPSBtQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgIG1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBjbGllbnQtPnJlY2VpdmVJbnZhbGlkYXRpb24obXNnSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK3ZvaWQgT2JzZXJ2ZXI6OmFkZENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gJndjbGllbnQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgZm9yIChhdXRvIGl0ID0gbUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgIGlmICghaXQtPnNlY29uZC5sb2NrKCkgfHwgaXQtPmZpcnN0ID09IGNvbm5lY3Rpb25JZCkgeworICAgICAgICAgICAgaXQgPSBtQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorICAgIG1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIHdjbGllbnQpKTsKKworfQorCit2b2lkIE9ic2VydmVyOjpkZWxDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtQ2xpZW50cy5lcmFzZShjb25uZWN0aW9uSWQpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYmQ3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX09CU0VSVkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfT0JTRVJWRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IE9ic2VydmVyIDogcHVibGljIElPYnNlcnZlciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXIgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBvbk1lc3NhZ2UoaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IG1zZ0lkKSBvdmVycmlkZTsKKworICAgIH5PYnNlcnZlcigpOworCisgICAgdm9pZCBhZGRDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+ICZ3Y2xpZW50KTsKKworICAgIHZvaWQgZGVsQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCitwcml2YXRlOgorICAgIE9ic2VydmVyKCk7CisKKyAgICBmcmllbmQgc3RydWN0IENsaWVudE1hbmFnZXI7CisKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4gbUNsaWVudHM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfT0JTRVJWRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTA2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xUWVBFU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xUWVBFU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhIHsKKyAgICAvLyBGb3IgbG9jYWwgdXNlLCB0byBzcGVjaWZ5IGEgYnVmZmVycG9vbCAoY2xpZW50IGNvbm5lY3Rpb24pIGZvciBidWZmZXJzLgorICAgIC8vIFJldHVybiB2YWx1ZSBmcm9tIGNvbm5lY3QjSUFjY2Vzc29yKGFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjApLgorICAgIGludDY0X3QgbUNvbm5lY3Rpb25JZDsKKyAgICAvLyBCdWZmZXJJZAorICAgIHVpbnQzMl90IG1JZDsKKworICAgIEJ1ZmZlclBvb2xEYXRhKCkgOiBtQ29ubmVjdGlvbklkKDApLCBtSWQoMCkge30KKworICAgIEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGlkKQorICAgICAgICAgICAgOiBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCkge30KKworICAgIH5CdWZmZXJQb29sRGF0YSgpIHt9Cit9OworCituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1Vuc3luY2hyb25pemVkV3JpdGU7CisKK3R5cGVkZWYgdWludDMyX3QgQnVmZmVySWQ7Cit0eXBlZGVmIHVpbnQ2NF90IFRyYW5zYWN0aW9uSWQ7Cit0eXBlZGVmIGludDY0X3QgQ29ubmVjdGlvbklkOworCitlbnVtIDogQ29ubmVjdGlvbklkIHsKKyAgICBJTlZBTElEX0NPTk5FQ1RJT05JRCA9IDAsCit9OworCit0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU8QnVmZmVyU3RhdHVzTWVzc2FnZSwga1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQnVmZmVyU3RhdHVzUXVldWU7Cit0eXBlZGVmIEJ1ZmZlclN0YXR1c1F1ZXVlOjpEZXNjcmlwdG9yIFN0YXR1c0Rlc2NyaXB0b3I7CisKK3R5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlLCBrVW5zeW5jaHJvbml6ZWRXcml0ZT4KKyAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uUXVldWU7Cit0eXBlZGVmIEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOjpEZXNjcmlwdG9yIEludmFsaWRhdGlvbkRlc2NyaXB0b3I7CisKKy8qKgorICogQWxsb2NhdGlvbiB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworc3RydWN0IEJ1ZmZlclBvb2xBbGxvY2F0aW9uIHsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1IYW5kbGU7CisgICAgfQorCisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIDogbUhhbmRsZShoYW5kbGUpIHt9CisKKyAgICB+QnVmZmVyUG9vbEFsbG9jYXRpb24oKSB7fTsKK307CisKKy8qKgorICogQWxsb2NhdG9yIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGFuIGFsbG9jYXRpb24oYnVmZmVyKSBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBhbGxvYyAgICAgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGFsbG9jU2l6ZSBzaXplIG9mIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBvZiBhbiBvbGQgYWxsb2NhdGlvbiBhcmUKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggbmV3IGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xUWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTNjMzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ0xJRU5UTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NMSUVOVE1BTkFHRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAiQnVmZmVyUG9vbFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDbGllbnRNYW5hZ2VyIDogcHVibGljIElDbGllbnRNYW5hZ2VyIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKiBHZXRzIGFuIGluc3RhbmNlLiAqLworICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBnZXRJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxvY2FsIGNvbm5lY3Rpb24gd2l0aCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yICAgICBmb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIElkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24uIFRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0td2lkZSB1bmlxdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgcG9vbCBhbmQgYSBsb2NhbCBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseQorICAgICAqICAgICAgICAgY3JlYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY3JlYXRlZCBjb25uZWN0aW9uIGFzIHNlbmRlciBmb3IgcmVtb3RlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgICAgICBUaGUgcmVtb3RlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBzZW5kZXJJZCAgICAgIEEgbG9jYWwgY29ubmVjdGlvbiB3aGljaCB3aWxsIHNlbmQgYnVmZmVycyB0by4KKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBJZCBvZiB0aGUgY3JlYXRlZCByZWNlaXZpbmcgY29ubmVjdGlvbiBvbiB0aGUgcmVjZWl2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIHJlY2VpdmVyIHByb2Nlc3MuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGVyIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIEFMUkVBRFlfRVhJU1RTIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG1hZGUuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogRXZpY3RzIGNhY2hlZCBhbGxvY2F0aW9ucy4gSWYgaXQncyBsb2NhbCBjb25uZWN0aW9uLCByZWxlYXNlIHRoZQorICAgICAqIHByZXZpb3VzIGFsbG9jYXRpb25zIGFuZCBkbyBub3QgcmVjeWNsZSBjdXJyZW50IGFjdGl2ZSBhbGxvY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHJlc2V0dGVkLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIFRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlcyBhIGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBUaGUgaWQgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBUaGUgaWQgZm9yIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIGlzIGJlaW5nIHNlbnQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgcmVjZWl2ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyByZWNlaXZlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gU2VuZHMgYSBidWZmZXIKKyAgICAgKiB0byBvdGhlciByZW1vdGUgY2xpZW50cyhjb25uZWN0aW9uKSBhZnRlciB0aGlzIGNhbGwgaGFzIGJlZW4gc3VjY2VlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICB0byB0cmFuc2ZlcgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgdHJhbnNhY3Rpb24gaXMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGluZyBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIC8qKgorICAgICAqICBUaW1lIG91dCBpbmFjdGl2ZSBsaW5nZXJpbmcgY29ubmVjdGlvbnMgYW5kIGNsb3NlLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcCgpOworCisgICAgLyoqIERlc3RydWN0cyB0aGUgbWFuYWdlciBvZiBidWZmZXIgcG9vbCBjbGllbnRzLiAgKi8KKyAgICB+Q2xpZW50TWFuYWdlcigpOworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gc0luc3RhbmNlOworICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNJbnN0YW5jZUxvY2s7CisKKyAgICBjbGFzcyBJbXBsOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIENsaWVudE1hbmFnZXIoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DTElFTlRNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDRmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjJfMFRhcmdldFNpbmdsZVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAic2luZ2xlLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMl8wVGFyZ2V0TXVsdGlUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgIm11bHRpLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUwpAQCAtMCwwICsxLDkgQEAKKyMgTWVkaWEgdGVhbQorbGFqb3NAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQordGFrbGVlQGdvb2dsZS5jb20KK3dvbnNpa0Bnb29nbGUuY29tCisKKyMgVlRTIHRlYW0KK3lpbUBnb29nbGUuY29tCit6aHVveWFvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2Y3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1bmlvbiBQYXJhbXMgeworICBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGNhcGFjaXR5OworICB9IGRhdGE7CisgIHVpbnQ4X3QgYXJyYXlbMF07CisgIFBhcmFtcygpIDogZGF0YXswfSB7fQorICBQYXJhbXModWludDMyX3Qgc2l6ZSkKKyAgICAgIDogZGF0YXtzaXplfSB7fQorfTsKKworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgSGFuZGxlQXNobWVtIDogcHVibGljIG5hdGl2ZV9oYW5kbGVfdCB7CisgIEhhbmRsZUFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBzaXplKQorICAgIDogbmF0aXZlX2hhbmRsZV90KGNIZWFkZXIpLAorICAgIG1GZHN7IGFzaG1lbUZkIH0sCisgICAgbUludHN7IGludCAoc2l6ZSAmIDB4RkZGRkZGRkYpLCBpbnQoKHVpbnQ2NF90KHNpemUpID4+IDMyKSAmIDB4RkZGRkZGRkYpLCBrTWFnaWMgfSB7fQorCisgIGludCBhc2htZW1GZCgpIGNvbnN0IHsgcmV0dXJuIG1GZHMubUFzaG1lbTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKG1JbnRzLm1TaXplTG8pKQorICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKTsKKworcHJvdGVjdGVkOgorICBzdHJ1Y3QgeworICAgIGludCBtQXNobWVtOworICB9IG1GZHM7CisgIHN0cnVjdCB7CisgICAgaW50IG1TaXplTG87CisgICAgaW50IG1TaXplSGk7CisgICAgaW50IG1NYWdpYzsKKyAgfSBtSW50czsKKworcHJpdmF0ZToKKyAgZW51bSB7CisgICAga01hZ2ljID0gJ2FobVx4MDAnLAorICAgIG51bUZkcyA9IHNpemVvZihtRmRzKSAvIHNpemVvZihpbnQpLAorICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgdmVyc2lvbiA9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpCisgIH07CisgIGNvbnN0IHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QgY0hlYWRlcjsKK307CisKK2NvbnN0IG5hdGl2ZV9oYW5kbGVfdCBIYW5kbGVBc2htZW06OmNIZWFkZXIgPSB7CisgIEhhbmRsZUFzaG1lbTo6dmVyc2lvbiwKKyAgSGFuZGxlQXNobWVtOjpudW1GZHMsCisgIEhhbmRsZUFzaG1lbTo6bnVtSW50cywKKyAge30KK307CisKK2Jvb2wgSGFuZGxlQXNobWVtOjppc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pIHsKKyAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm90aGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4obyk7CisgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworY2xhc3MgQWxsb2NhdGlvbkFzaG1lbSB7Citwcml2YXRlOgorICBBbGxvY2F0aW9uQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IGNhcGFjaXR5LCBib29sIHJlcykKKyAgICA6IG1IYW5kbGUoYXNobWVtRmQsIGNhcGFjaXR5KSwKKyAgICAgIG1Jbml0KHJlcykge30KKworcHVibGljOgorICBzdGF0aWMgQWxsb2NhdGlvbkFzaG1lbSAqQWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGNvbnN0IGNoYXIgKmtBbGxvY2F0aW9uVGFnID0gImJ1ZmZlcnBvb2xfdGVzdCI7CisgICAgaW50IGFzaG1lbUZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oa0FsbG9jYXRpb25UYWcsIHNpemUpOworICAgIHJldHVybiBuZXcgQWxsb2NhdGlvbkFzaG1lbShhc2htZW1GZCwgc2l6ZSwgYXNobWVtRmQgPj0gMCk7CisgIH0KKworICB+QWxsb2NhdGlvbkFzaG1lbSgpIHsKKyAgICBpZiAobUluaXQpIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoJm1IYW5kbGUpOworICAgIH0KKyAgfQorCisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqaGFuZGxlKCkgeworICAgIHJldHVybiAmbUhhbmRsZTsKKyAgfQorCitwcml2YXRlOgorICBIYW5kbGVBc2htZW0gbUhhbmRsZTsKKyAgYm9vbCBtSW5pdDsKKyAgLy8gVE9ETzogbWFwcGluZyBhbmQgbWFwIGZkCit9OworCitzdHJ1Y3QgQWxsb2NhdGlvbkR0b3IgeworICBBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gJmFsbG9jKQorICAgICAgOiBtQWxsb2MoYWxsb2MpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBtQWxsb2M7Cit9OworCit9CisKKworUmVzdWx0U3RhdHVzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgIHNpemVfdCAqYWxsb2NTaXplKSB7CisgIFBhcmFtcyBhc2htZW1QYXJhbXM7CisgIG1lbWNweSgmYXNobWVtUGFyYW1zLCBwYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoUGFyYW1zKSwgcGFyYW1zLnNpemUoKSkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBhc2htZW1BbGxvYyA9CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4oCisgICAgICAgICAgQWxsb2NhdGlvbkFzaG1lbTo6QWxsb2MoYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHkpKTsKKyAgaWYgKGFzaG1lbUFsbG9jKSB7CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihhc2htZW1BbGxvYy0+aGFuZGxlKCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4ocHRyLCBBbGxvY2F0aW9uRHRvcihhc2htZW1BbGxvYykpOworICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICphbGxvY1NpemUgPSBhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eTsKKyAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICB9CisgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgeworICBzaXplX3QgbmV3U2l6ZSA9IG5ld1BhcmFtcy5zaXplKCk7CisgIHNpemVfdCBvbGRTaXplID0gb2xkUGFyYW1zLnNpemUoKTsKKyAgaWYgKG5ld1NpemUgPT0gb2xkU2l6ZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3U2l6ZTsgKytpKSB7CisgICAgICBpZiAobmV3UGFyYW1zW2ldICE9IG9sZFBhcmFtc1tpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBwdHJbaV0gPSB2YWw7CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBpZiAocHRyW2ldICE9IHZhbCkgeworICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGtBbGxvY2F0aW9uU2l6ZSA9IDEwMjQgKiAxMDsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtcyhrQWxsb2NhdGlvblNpemUpOworCisgIHBhcmFtcy0+YXNzaWduKGFzaG1lbVBhcmFtcy5hcnJheSwgYXNobWVtUGFyYW1zLmFycmF5ICsgc2l6ZW9mKGFzaG1lbVBhcmFtcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjgxZGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVk5ES19ISURMX0JVRkZFUlBPT0xfVjJfMF9BTExPQ0FUT1JfSAorI2RlZmluZSBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMl8wX0FMTE9DQVRPUl9ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcjsKKworLy8gYnVmZmVyIGFsbG9jYXRvciBmb3IgdGhlIHRlc3RzCitjbGFzcyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKKyBwdWJsaWM6CisgIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkge30KKworICB+VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSBvdmVycmlkZSB7fQorCisgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKKyAgc3RhdGljIGJvb2wgVmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKK307CisKKy8vIHJldHJpZXZlIGJ1ZmZlciBhbGxvY2F0b3IgcGFyYW10ZXJzCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyNlbmRpZiAgLy8gVk5ES19ISURMX0JVRkZFUlBPT0xfVjJfMF9BTExPQ0FUT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YjY5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgdHlwZXMgYmV0d2VlbiBwcm9jZXNzZXMuCitlbnVtIFBpcGVDb21tYW5kIDogaW50MzJfdCB7CisgICAgSU5JVF9PSyA9IDAsCisgICAgSU5JVF9FUlJPUiwKKyAgICBTRU5ELAorICAgIFJFQ0VJVkVfT0ssCisgICAgUkVDRUlWRV9FUlJPUiwKK307CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KK3VuaW9uIFBpcGVNZXNzYWdlIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgaW50MzJfdCBjb21tYW5kOworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBpbnQ2NF90ICB0aW1lc3RhbXBVczsKKyAgICB9IGRhdGE7CisgICAgY2hhciBhcnJheVswXTsKK307CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbE11bHRpVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbVJlY2VpdmVyUGlkID0gLTE7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgQVNTRVJUX1RSVUUocGlwZShtQ29tbWFuZFBpcGVGZHMpID09IDApOworICAgIEFTU0VSVF9UUlVFKHBpcGUobVJlc3VsdFBpcGVGZHMpID09IDApOworCisgICAgbVJlY2VpdmVyUGlkID0gZm9yaygpOworICAgIEFTU0VSVF9UUlVFKG1SZWNlaXZlclBpZCA+PSAwKTsKKworICAgIGlmIChtUmVjZWl2ZXJQaWQgPT0gMCkgeworICAgICAgZG9SZWNlaXZlcigpOworICAgICAgLy8gSW4gb3JkZXIgdG8gaWdub3JlIGd0ZXN0IGJlaGF2aW91ciwgd2FpdCBmb3IgYmVpbmcga2lsbGVkIGZyb20KKyAgICAgIC8vIHRlYXJEb3duCisgICAgICBwYXVzZSgpOworICAgIH0KKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1SZWNlaXZlclBpZCA+IDApIHsKKyAgICAgIGtpbGwobVJlY2VpdmVyUGlkLCBTSUdLSUxMKTsKKyAgICAgIGludCB3c3RhdHVzOworICAgICAgd2FpdCgmd3N0YXR1cyk7CisgICAgfQorCisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBwaWRfdCBtUmVjZWl2ZXJQaWQ7CisgIGludCBtQ29tbWFuZFBpcGVGZHNbMl07CisgIGludCBtUmVzdWx0UGlwZUZkc1syXTsKKworICBib29sIHNlbmRNZXNzYWdlKGludCAqcGlwZXMsIGNvbnN0IFBpcGVNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHdyaXRlKHBpcGVzWzFdLCBtZXNzYWdlLmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICBib29sIHJlY2VpdmVNZXNzYWdlKGludCAqcGlwZXMsIFBpcGVNZXNzYWdlICptZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHJlYWQocGlwZXNbMF0sIG1lc3NhZ2UtPmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICB2b2lkIGRvUmVjZWl2ZXIoKSB7CisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCgxLCBmYWxzZSk7CisgICAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKCFtTWFuYWdlcikgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyQXNTZXJ2aWNlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisKKyAgICByZWNlaXZlTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsICZtZXNzYWdlKTsKKyAgICB7CisgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJoYW5kbGUgPSBudWxscHRyOworICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiByYnVmZmVyOworICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCwgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzLCAmcmhhbmRsZSwgJnJidWZmZXIpOworICAgICAgbU1hbmFnZXItPmNsb3NlKG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQpOworICAgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmICghVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyaGFuZGxlLCAweDc3KSkgeworICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfRVJST1I7CisgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QgYmV0d2VlbiBwcm9jZXNzZXMuCitURVNUX0YoQnVmZmVycG9vbE11bHRpVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKworICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKKworICBhbmRyb2lkOjpzcDxJQ2xpZW50TWFuYWdlcj4gcmVjZWl2ZXIgPSBJQ2xpZW50TWFuYWdlcjo6Z2V0U2VydmljZSgpOworICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZDsKKyAgQVNTRVJUX1RSVUUoKGJvb2wpcmVjZWl2ZXIpOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgbUNvbm5lY3Rpb25JZCwgJnJlY2VpdmVySWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKnNoYW5kbGUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlcjsKKyAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgaW50NjRfdCBwb3N0VXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworCisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmc2hhbmRsZSwgJnNidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKHNoYW5kbGUsIDB4NzcpKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U0VORDsKKyAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQgPSBzYnVmZmVyLT5tSWQ7CisgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCA9IHJlY2VpdmVySWQ7CisgICAgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcyA9IHBvc3RVczsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICB9CisgIEVYUEVDVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBzZXRlbnYoIlRSRUJMRV9URVNUSU5HX09WRVJSSURFIiwgInRydWUiLCB0cnVlKTsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL3NpbmdsZS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2VkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtQWxsb2NhdGlvblRlc3QgPSAzOworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgcmVjeWNsaW5nIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtUmVjeWNsZVRlc3QgPSAzOworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xTaW5nbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobU1hbmFnZXIsIG1Db25uZWN0aW9uSWQsICZtUmVjZWl2ZXJJZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFMgJiYKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJJZCA9PSBtQ29ubmVjdGlvbklkKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXJJZDsKKworfTsKKworLy8gQnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZWFjaCBidWZmZXIgYWxsb2NhdGlvbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSB3aXRoCisvLyB1bmlxdWUgYnVmZmVyIGlkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBBbGxvY2F0ZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJba051bUFsbG9jYXRpb25UZXN0XTsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXJbaV0pOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwga051bUFsbG9jYXRpb25UZXN0OyArK2opIHsKKyAgICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcltpXS0+bUlkICE9IGJ1ZmZlcltqXS0+bUlkKTsKKyAgICB9CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bUFsbG9jYXRpb25UZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciByZWN5Y2xlIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGRlLWFsbG9jYXRlZCBidWZmZXJzIGFyZSByZWN5Y2xlZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgUmVjeWNsZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgQnVmZmVySWQgYmlkW2tOdW1SZWN5Y2xlVGVzdF07CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcjsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBiaWRbaV0gPSBidWZmZXItPm1JZDsKKyAgfQorICBmb3IgKGludCBpID0gMTsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgQVNTRVJUX1RSVUUoYmlkW2kgLSAxXSA9PSBiaWRbaV0pOworICB9CisgIEVYUEVDVF9UUlVFKGtOdW1SZWN5Y2xlVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgYnVmZmVyIGlzIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgY2xpZW50IHN1Y2Nlc3NmdWxseS4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXIsIHJidWZmZXI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBuYXRpdmVfaGFuZGxlX3QgKnJlY3ZIYW5kbGUgPSBudWxscHRyOworCisgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgaW50NjRfdCBwb3N0VXM7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2J1ZmZlcik7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoYWxsb2NIYW5kbGUsIDB4NzcpKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKG1SZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUobVJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHNidWZmZXItPm1JZCwgcG9zdFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdkhhbmRsZSwgJnJidWZmZXIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmVjdkhhbmRsZSwgMHg3NykpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsgYi9tZWRpYS9jb2RlYzIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ3MzlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0OCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBET0NVTUVOVEFUSU9OIEdFTkVSQVRJT04KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0MyX1JPT1QgOj0gJChjYWxsIG15LWRpcikKKworQzJfRE9DU19ST09UIDo9ICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9kb2NzL2NvZGVjMgorCitDMl9PVVRfVEVNUCA6PSAkKFBST0RVQ1RfT1VUKS9nZW4vRVRDL0NvZGVjMi1kb2NzX2ludGVybWVkaWF0ZXMKKworQzJfRE9YWSA6PSAkKG9yICQoc2hlbGwgY29tbWFuZCAtdiBkb3h5Z2VuKSxcCisJCSQoc2hlbGwgY29tbWFuZCAtdiAvQXBwbGljYXRpb25zL0RveHlnZW4uYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9kb3h5Z2VuKSkKKworLlBIT05ZOiBjaGVjay1kb3h5Z2VuCitjaGVjay1kb3h5Z2VuOgoraWZuZGVmIEMyX0RPWFkKKwkkKGVycm9yICdkb3h5Z2VuIGlzIG5vdCBhdmFpbGFibGUnKQorZW5kaWYKKworJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnOiAkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcKKwkjIG9ubHkgZG9jdW1lbnQgaW5jbHVkZSBkaXJlY3RvcnksIG5vIGludGVybmFsIHNlY3Rpb25zCisJc2VkICdzL1woXklOUFVUICo9LipcKS9cMWluY2x1ZGVcLy87IFwKKwlzL1woXklOVEVSTkFMX0RPQ1MgKj0gKlwpLiovXDFOTy87IFwKKwlzL1woXkVOQUJMRURfU0VDVElPTlMgKj0uKlwpSU5URVJOQUxcKC4qXCkuKi9cMVwyLzsgXAorCXM6XCheT1VUUFVUX0RJUkVDVE9SWSAqPSBcKW91dDpcMSckKE9VVF9ESVIpJzo7JyBcCisJCSQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZyA+ICRACisKKyQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnOiAkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcKKwlzZWQgJ3M6XCheT1VUUFVUX0RJUkVDVE9SWSAqPSBcKW91dFwoLipcKWFwaTpcMSckKE9VVF9ESVIpJ1wyaW50ZXJuYWw6OycgXAorCQkkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcgPiAkQAorCisuUEhPTlk6IGRvY3MtYXBpCitkb2NzLWFwaTogJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnIGNoZWNrLWRveHlnZW4KKwllY2hvIEFQSSBkb2NzIGFyZSBidWlsZGluZyBpbiAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJcm0gLXJmICQoQzJfRE9DU19ST09UKS9hcGkKKwlta2RpciAtcCAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJJChDMl9ET1hZKSAkKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWcKKworLlBIT05ZOiBkb2NzLWludGVybmFsCitkb2NzLWludGVybmFsOiAkKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZyBjaGVjay1kb3h5Z2VuCisJZWNobyBJbnRlcm5hbCBkb2NzIGFyZSBidWlsZGluZyBpbiAkKEMyX0RPQ1NfUk9PVCkvaW50ZXJuYWwKKwlybSAtcmYgJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJbWtkaXIgLXAgJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJJChDMl9ET1hZKSAkKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZworCisuUEhPTlk6IGRvY3MtYWxsCitkb2NzLWFsbDogZG9jcy1hcGkgZG9jcy1pbnRlcm5hbAorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoY2FsbCBteS1kaXIpKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWNhNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMlNvZnRBYWNEZWMuY3BwIiwKKyAgICAgICAgIkRyY1ByZXNNb2RlV3JhcC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliRnJhdW5ob2ZlckFBQyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hYWNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFhY0VuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDAwZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKQEAgLTAsMCArMSw5MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QWFjRGVjLmgiCisKKyNkZWZpbmUgRklMRVJFQURfTUFYX0xBWUVSUyAyCisKKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCAtMTYuMCAgLyogNjQqLTAuMjVkQiA9IC0xNiBkQiBiZWxvdyBmdWxsIHNjYWxlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCAgIDEuMCAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKDAuMjUpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICJhYWNfZHJjX2VuY190YXJnZXRfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VGRkVDVCAgICAgInJvLmFhY19kcmNfZWZmZWN0X3R5cGUiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFhYy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0QWFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoMnUpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgNzM1MCwgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDk2MDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFhY0Zvcm1hdCwgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX1JBVykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQWFjRm9ybWF0LCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19SQVcsIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFMKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQWFjRm9ybWF0KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEV9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0NvbXByZXNzTW9kZSwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EcmNDb21wcmVzc01vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9PRE1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0NvbXByZXNzTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjVGFyZ2V0UmVmTGV2ZWwsIEMyX1BBUkFNS0VZX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY1RhcmdldFJlZkxldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNUYXJnZXRSZWZMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRW5jVGFyZ2V0TGV2ZWwsIEMyX1BBUkFNS0VZX0RSQ19FTkNPREVEX1RBUkdFVF9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjRW5jVGFyZ2V0TGV2ZWwsIHZhbHVlKS5pblJhbmdlKC0zMS43NSwgMC4yNSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0VuY1RhcmdldExldmVsKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNCb29zdEZhY3RvciwgQzJfUEFSQU1LRVlfRFJDX0JPT1NUX0ZBQ1RPUikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNCb29zdEZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNCb29zdEZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQXR0ZW51YXRpb25GYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0F0dGVudWF0aW9uRmFjdG9yLCB2YWx1ZSkuaW5SYW5nZSgwLCAxLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0F0dGVudWF0aW9uRmFjdG9yKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNFZmZlY3RUeXBlLCBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjRWZmZWN0VHlwZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9PRE1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9PRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MQVRFX05JR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PSVNZX0VOVklST05NRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTE9XX1BMQVlCQUNLX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0RJQUxPR19FTkhBTkNFTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9HRU5FUkFMX0NPTVBSRVNTSU9OfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0VmZmVjdFR5cGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBib29sIGlzQWR0cygpIGNvbnN0IHsgcmV0dXJuIG1BYWNGb3JtYXQtPnZhbHVlID09IEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFM7IH0KKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIGludDMyX3QgZ2V0RHJjQ29tcHJlc3NNb2RlKCkgY29uc3QgeyByZXR1cm4gbURyY0NvbXByZXNzTW9kZS0+dmFsdWUgPT0gQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSA/IDEgOiAwOyB9CisgICAgaW50MzJfdCBnZXREcmNUYXJnZXRSZWZMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIChtRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlIDw9IDAgPyAtbURyY1RhcmdldFJlZkxldmVsLT52YWx1ZSAqIDQuICsgMC41IDogLTEpOyB9CisgICAgaW50MzJfdCBnZXREcmNFbmNUYXJnZXRMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIChtRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlIDw9IDAgPyAtbURyY0VuY1RhcmdldExldmVsLT52YWx1ZSAqIDQuICsgMC41IDogLTEpOyB9CisgICAgaW50MzJfdCBnZXREcmNCb29zdEZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1EcmNCb29zdEZhY3Rvci0+dmFsdWUgKiAxMjcuICsgMC41OyB9CisgICAgaW50MzJfdCBnZXREcmNBdHRlbnVhdGlvbkZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1EcmNBdHRlbnVhdGlvbkZhY3Rvci0+dmFsdWUgKiAxMjcuICsgMC41OyB9CisgICAgaW50MzJfdCBnZXREcmNFZmZlY3RUeXBlKCkgY29uc3QgeyByZXR1cm4gbURyY0VmZmVjdFR5cGUtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1BYWNGb3JtYXRJbmZvOjppbnB1dD4gbUFhY0Zvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0PiBtRHJjQ29tcHJlc3NNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOjppbnB1dD4gbURyY1RhcmdldFJlZkxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNFbmNUYXJnZXRMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzo6aW5wdXQ+IG1EcmNCb29zdEZhY3RvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQ+IG1EcmNBdHRlbnVhdGlvbkZhY3RvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dD4gbURyY0VmZmVjdFR5cGU7CisgICAgLy8gVE9ETyBBZGQgOiBDMlN0cmVhbUFhY1Nick1vZGVUdW5pbmcKK307CisKK0MyU29mdEFhY0RlYzo6QzJTb2Z0QWFjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1BQUNEZWNvZGVyKG51bGxwdHIpLAorICAgICAgbVN0cmVhbUluZm8obnVsbHB0ciksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcihudWxscHRyKSB7Cit9CisKK0MyU29mdEFhY0RlYzo6fkMyU29mdEFhY0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6b25TdG9wKCkgeworICAgIGRyYWluRGVjb2RlcigpOworICAgIC8vIHJlc2V0IHRoZSAiY29uZmlndXJlZCIgc3RhdGUKKyAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CisgICAgbUJ1ZmZlcnNJbmZvLmNsZWFyKCk7CisKKyAgICAvLyBUbyBtYWtlIHRoZSBjb2RlYyBiZWhhdmUgdGhlIHNhbWUgYmVmb3JlIGFuZCBhZnRlciBhIHJlc2V0LCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgdGhlCisgICAgLy8gc3RyZWFtaW5mbyBzdHJ1Y3QuIFRoaXMgZG9lcyB0aGF0OgorICAgIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlID0gMDsgLy8gVE9ETzogbVN0cmVhbUluZm8gaXMgcmVhZCBvbmx5CisKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBYWNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1BQUNEZWNvZGVyKSB7CisgICAgICAgIGFhY0RlY29kZXJfQ2xvc2UobUFBQ0RlY29kZXIpOworICAgICAgICBtQUFDRGVjb2RlciA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyKSB7CisgICAgICAgIGRlbGV0ZVtdIG1PdXRwdXREZWxheVJpbmdCdWZmZXI7CisgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIgPSBudWxscHRyOworICAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBBTE9HVigiaW5pdERlY29kZXIoKSIpOworICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgbUFBQ0RlY29kZXIgPSBhYWNEZWNvZGVyX09wZW4oVFRfTVA0X0FESUYsIC8qIG51bSBsYXllcnMgKi8gMSk7CisgICAgaWYgKG1BQUNEZWNvZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVN0cmVhbUluZm8gPSBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8obUFBQ0RlY29kZXIpOworICAgICAgICBpZiAobVN0cmVhbUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3RhdHVzID0gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUgPSAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQgKiBrTnVtRGVsYXlCbG9ja3NNYXg7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlciA9IG5ldyBzaG9ydFttT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZV07CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CisKKyAgICBpZiAobUFBQ0RlY29kZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUFDIGRlY29kZXIgaXMgbnVsbC4gVE9ETzogQ2FuIG5vdCBjYWxsIGFhY0RlY29kZXJfU2V0UGFyYW0gaW4gdGhlIGZvbGxvd2luZyBjb2RlIik7CisgICAgfQorCisgICAgLy9hYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX0xJTUlURVJfRU5BQkxFLCAwKTsKKworICAgIC8vaW5pdCBEUkMgd3JhcHBlcgorICAgIG1EcmNXcmFwLnNldERlY29kZXJIYW5kbGUobUFBQ0RlY29kZXIpOworICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworCisgICAgLy8gZm9yIHN0cmVhbXMgdGhhdCBjb250YWluIG1ldGFkYXRhLCB1c2UgdGhlIG1vYmlsZSBwcm9maWxlIERSQyBzZXR0aW5ncyB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBwbGF0Zm9ybSBwcm9wZXJ0aWVzCisgICAgLy8gVE9ETzogY2hhbmdlIHRoZSBEUkMgc2V0dGluZ3MgZGVwZW5kaW5nIG9uIGF1ZGlvIG91dHB1dCBkZXZpY2UgdHlwZSAoSERNSSwgbG9hZHNwZWFrZXIsIGhlYWRwaG9uZSkKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQKKyAgICBpbnQzMl90IHRhcmdldFJlZkxldmVsID0gbUludGYtPmdldERyY1RhcmdldFJlZkxldmVsKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgb2YgJWQiLCB0YXJnZXRSZWZMZXZlbCk7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VULCAodW5zaWduZWQpdGFyZ2V0UmVmTGV2ZWwpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IKKworICAgIGludDMyX3QgYXR0ZW51YXRpb25GYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQXR0ZW51YXRpb25GYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYXR0ZW51YXRpb24gZmFjdG9yIG9mICVkIiwgYXR0ZW51YXRpb25GYWN0b3IpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IsICh1bnNpZ25lZClhdHRlbnVhdGlvbkZhY3Rvcik7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SCisgICAgaW50MzJfdCBib29zdEZhY3RvciA9IG1JbnRmLT5nZXREcmNCb29zdEZhY3RvcigpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBib29zdCBmYWN0b3Igb2YgJWQiLCBib29zdEZhY3Rvcik7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SLCAodW5zaWduZWQpYm9vc3RGYWN0b3IpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZCisgICAgaW50MzJfdCBjb21wcmVzc01vZGUgPSBtSW50Zi0+Z2V0RHJjQ29tcHJlc3NNb2RlKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc3JpZWQgRFJDIGhlYXZ5IGNvbXByZXNzaW9uIHN3aXRjaCBvZiAlZCIsIGNvbXByZXNzTW9kZSk7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlksICh1bnNpZ25lZCljb21wcmVzc01vZGUpOworCisgICAgLy8gRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUCisgICAgaW50MzJfdCBlbmNUYXJnZXRMZXZlbCA9IG1JbnRmLT5nZXREcmNFbmNUYXJnZXRMZXZlbCgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBlbmNvZGVyLXNpZGUgRFJDIHJlZmVyZW5jZSBsZXZlbCBvZiAlZCIsIGVuY1RhcmdldExldmVsKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQsICh1bnNpZ25lZCllbmNUYXJnZXRMZXZlbCk7CisKKyAgICAvLyBBQUNfVU5JRFJDX1NFVF9FRkZFQ1QKKyAgICBpbnQzMl90IGVmZmVjdFR5cGUgPSBtSW50Zi0+Z2V0RHJjRWZmZWN0VHlwZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlICVkIiwgZWZmZWN0VHlwZSk7CisgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1VOSURSQ19TRVRfRUZGRUNULCBlZmZlY3RUeXBlKTsKKworICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBkZWNvZGVyIGNyZWF0ZXMgYSA1LjEgY2hhbm5lbCBkb3dubWl4IHNpZ25hbC4KKyAgICAvLyBGb3Igc2V2ZW4gYW5kIGVpZ2h0IGNoYW5uZWwgaW5wdXQgc3RyZWFtcywgZW5hYmxlIDYuMSBhbmQgNy4xIGNoYW5uZWwgb3V0cHV0CisgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTLCAtMSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitib29sIEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQzMl90IG51bVNhbXBsZXMpIHsKKyAgICBpZiAobnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgPCBudW1TYW1wbGVzKSB7CisgICAgICAgIEFMT0dFKCJSSU5HIEJVRkZFUiBXT1VMRCBPVkVSRkxPVyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgKyBudW1TYW1wbGVzIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplCisgICAgICAgICAgICAmJiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID4gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zICsgbnVtU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmFzdGVyIG1lbWNvcHkgbG9vcCB3aXRob3V0IGNoZWNrcywgaWYgdGhlIHByZWNvbmRpdGlvbnMgYWxsb3cgdGhpcworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zKytdID0gc2FtcGxlc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJzbG93IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcygpIik7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvc10gPSBzYW1wbGVzW2ldOworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zKys7CisgICAgICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgKz0gbnVtU2FtcGxlczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50MzJfdCBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50MzJfdCBudW1TYW1wbGVzKSB7CisKKyAgICBpZiAobnVtU2FtcGxlcyA+IG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQpIHsKKyAgICAgICAgQUxPR0UoIlJJTkcgQlVGRkVSIFdPVUxEIFVOREVSUlVOIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgKyBudW1TYW1wbGVzIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplCisgICAgICAgICAgICAmJiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIDwgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICsgbnVtU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmFzdGVyIG1lbWNvcHkgbG9vcCB3aXRob3V0IGNoZWNrcywgaWYgdGhlIHByZWNvbmRpdGlvbnMgYWxsb3cgdGhpcworICAgICAgICBpZiAoc2FtcGxlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcysrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICs9IG51bVNhbXBsZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJzbG93IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcygpIik7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2FtcGxlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3NdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MrKzsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgLT0gbnVtU2FtcGxlczsKKyAgICByZXR1cm4gbnVtU2FtcGxlczsKK30KKworaW50MzJfdCBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSB7CisgICAgcmV0dXJuIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQ7Cit9CisKK2ludDMyX3QgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSB7CisgICAgcmV0dXJuIG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplIC0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworfQorCit2b2lkIEMyU29mdEFhY0RlYzo6ZHJhaW5SaW5nQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgYm9vbCBlb3MpIHsKKyAgICB3aGlsZSAoIW1CdWZmZXJzSW5mby5lbXB0eSgpICYmIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKQorICAgICAgICAgICAgPj0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICBJbmZvICZvdXRJbmZvID0gbUJ1ZmZlcnNJbmZvLmZyb250KCk7CisgICAgICAgIEFMT0dWKCJvdXRJbmZvLmZyYW1lSW5kZXggPSAlIiBQUkl1NjQsIG91dEluZm8uZnJhbWVJbmRleCk7CisgICAgICAgIGludCBzYW1wbGVzaXplIF9fdW51c2VkID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgIGludCBhdmFpbGFibGUgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CisgICAgICAgIGludCBudW1GcmFtZXMgPSBvdXRJbmZvLmRlY29kZWRTaXplcy5zaXplKCk7CisgICAgICAgIGludCBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogKG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworICAgICAgICBpZiAoYXZhaWxhYmxlIDwgbnVtU2FtcGxlcykgeworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgPSBhdmFpbGFibGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlZCBzYW1wbGVzIGF2YWlsYWJsZSAoJWQpLCBvciAlZCBmcmFtZXMiLAorICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsIGF2YWlsYWJsZSwgbnVtRnJhbWVzKTsKKyAgICAgICAgQUxPR1YoImdldHRpbmcgJWQgZnJvbSByaW5nYnVmZmVyIiwgbnVtU2FtcGxlcyk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mKT4gZmlsbFdvcmsgPQorICAgICAgICAgICAgWyZibG9jaywgbnVtU2FtcGxlcywgcG9vbCwgdGhpc10oKQorICAgICAgICAgICAgICAgICAgICAtPiBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mKT4geworICAgICAgICAgICAgICAgIGF1dG8gZmlsbEVtcHR5V29yayA9IFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssIGMyX3N0YXR1c190IGVycikgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzOworICAgICAgICAgICAgICAgIGlmIChudW1TYW1wbGVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YmluZChmaWxsRW1wdHlXb3JrLCBfMSwgQzJfT0spOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCksIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBmZXRjaCBhIGxpbmVhciBibG9jayAoJWQpIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YmluZChmaWxsRW1wdHlXb3JrLCBfMSwgQzJfTk9fTUVNT1JZKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIElOVF9QQ00gKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8SU5UX1BDTSAqPih3Vmlldy5kYXRhKCkpOworICAgICAgICAgICAgICAgIGludDMyX3QgbnMgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKG91dEJ1ZmZlciwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgaWYgKG5zICE9IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBhIGNvbXBsZXRlIGZyYW1lIG9mIHNhbXBsZXMgYXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX0NPUlJVUFRFRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBbYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKV0oCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGEgJm91dHB1dCA9IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0oKTsKKworICAgICAgICBpZiAod29yayAmJiB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPT0gYzJfY250cjY0X3Qob3V0SW5mby5mcmFtZUluZGV4KSkgeworICAgICAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5pc2gob3V0SW5mby5mcmFtZUluZGV4LCBmaWxsV29yayk7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigib3V0IHRpbWVzdGFtcCAlIiBQUkl1NjQgIiAvICV1Iiwgb3V0SW5mby50aW1lc3RhbXAsIGJsb2NrID8gYmxvY2stPmNhcGFjaXR5KCkgOiAwKTsKKyAgICAgICAgbUJ1ZmZlcnNJbmZvLnBvcF9mcm9udCgpOworICAgIH0KK30KKwordm9pZCBDMlNvZnRBYWNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVUNIQVIqIGluQnVmZmVyW0ZJTEVSRUFEX01BWF9MQVlFUlNdOworICAgIFVJTlQgaW5CdWZmZXJMZW5ndGhbRklMRVJFQURfTUFYX0xBWUVSU10gPSB7MH07CisgICAgVUlOVCBieXRlc1ZhbGlkW0ZJTEVSRUFEX01BWF9MQVlFUlNdID0gezB9OworCisgICAgSU5UX1BDTSB0bXBPdXRCdWZmZXJbMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UXTsKKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IHNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB2aWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIHNpemUgPSB2aWV3LmNhcGFjaXR5KCk7CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisKKyAgICAvL1RPRE8KKyNpZiAwCisgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDAgJiYgIWNvZGVjQ29uZmlnKSB7CisgICAgICAgIEFMT0dXKCJmaXJzdCBidWZmZXIgc2hvdWxkIGhhdmUgRkxBR19DT0RFQ19DT05GSUcgc2V0Iik7CisgICAgICAgIGNvZGVjQ29uZmlnID0gdHJ1ZTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoY29kZWNDb25maWcgJiYgc2l6ZSA+IDB1KSB7CisgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgaW5CdWZmZXJbMF0gPSBjb25zdF9jYXN0PFVDSEFSICo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBzaXplOworCisgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPQorICAgICAgICAgICAgYWFjRGVjb2Rlcl9Db25maWdSYXcobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoKTsKKworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiYWFjRGVjb2Rlcl9Db25maWdSYXcgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEluZm8gaW5JbmZvOworICAgIGluSW5mby5mcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgaW5JbmZvLnRpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisgICAgaW5JbmZvLmJ1ZmZlclNpemUgPSBzaXplOworICAgIGluSW5mby5kZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoc2l6ZSA+IDB1KSB7CisgICAgICAgIEFMT0dWKCJzaXplID0gJXp1Iiwgc2l6ZSk7CisgICAgICAgIGlmIChtSW50Zi0+aXNBZHRzKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBhZHRzSGVhZGVyU2l6ZSA9IDA7CisgICAgICAgICAgICAvLyBza2lwIDMwIGJpdHMsIGFhY19mcmFtZV9sZW5ndGggZm9sbG93cy4KKyAgICAgICAgICAgIC8vIHNzc3Nzc3NzIHNzc3NpaWlwIHBwZmZmZlBjIGNjb2hDQ2xsIGxsbGxsbGxsIGxsbD8/Pz8/CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFkdHNIZWFkZXIgPSB2aWV3LmRhdGEoKSArIG9mZnNldDsKKworICAgICAgICAgICAgYm9vbCBzaWduYWxFcnJvciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHNpemUgPCA3KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGRhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZXZlbiB0aGUgQURUUyBoZWFkZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLiIsIHNpemUpOworICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBib29sIHByb3RlY3Rpb25BYnNlbnQgPSAoYWR0c0hlYWRlclsxXSAmIDEpOworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgYWFjX2ZyYW1lX2xlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgICgoYWR0c0hlYWRlclszXSAmIDMpIDw8IDExKQorICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzRdIDw8IDMpCisgICAgICAgICAgICAgICAgICAgIHwgKGFkdHNIZWFkZXJbNV0gPj4gNSk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IGFhY19mcmFtZV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYXVkaW8gZGF0YSBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlenUgYnl0ZXMsIGZyYW1lIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBBRFRTICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzICV1IGJ5dGVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZHRzSGVhZGVyU2l6ZSA9IChwcm90ZWN0aW9uQWJzZW50ID8gNyA6IDkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWFjX2ZyYW1lX2xlbmd0aCA8IGFkdHNIZWFkZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IGNvbnN0X2Nhc3Q8VUNIQVIgKj4oYWR0c0hlYWRlciArIGFkdHNIZWFkZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gYWFjX2ZyYW1lX2xlbmd0aCAtIGFkdHNIZWFkZXJTaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC09IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2lnbmFsRXJyb3IpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IGNvbnN0X2Nhc3Q8VUNIQVIgKj4odmlldy5kYXRhKCkgKyBvZmZzZXQpOworICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlsbCBhbmQgZGVjb2RlCisgICAgICAgIGJ5dGVzVmFsaWRbMF0gPSBpbkJ1ZmZlckxlbmd0aFswXTsKKworICAgICAgICBJTlQgcHJldlNhbXBsZVJhdGUgPSBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgSU5UIHByZXZOdW1DaGFubmVscyA9IG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgICAgICBhYWNEZWNvZGVyX0ZpbGwobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNWYWxpZCk7CisKKyAgICAgICAgLy8gcnVuIERSQyBjaGVjaworICAgICAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKyAgICAgICAgbURyY1dyYXAudXBkYXRlKCk7CisKKyAgICAgICAgVUlOVCBpbkJ1ZmZlclVzZWRMZW5ndGggPSBpbkJ1ZmZlckxlbmd0aFswXSAtIGJ5dGVzVmFsaWRbMF07CisgICAgICAgIHNpemUgLT0gaW5CdWZmZXJVc2VkTGVuZ3RoOworICAgICAgICBvZmZzZXQgKz0gaW5CdWZmZXJVc2VkTGVuZ3RoOworCisgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnI7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSA8CisgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBkZWNvZGU6IG5vdCBlbm91Z2ggc3BhY2UgbGVmdCBpbiByaW5nYnVmZmVyIik7CisgICAgICAgICAgICAgICAgLy8gZGlzY2FyZCBidWZmZXIKKyAgICAgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG51bUNvbnN1bWVkID0gbVN0cmVhbUluZm8tPm51bVRvdGFsQnl0ZXM7CisgICAgICAgICAgICBkZWNvZGVyRXJyID0gYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8pOworCisgICAgICAgICAgICBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzIC0gbnVtQ29uc3VtZWQ7CisKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbkluZm8uZGVjb2RlZFNpemVzLnB1c2hfYmFjayhudW1Db25zdW1lZCk7CisKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnl0ZXNWYWxpZFswXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImJ5dGVzVmFsaWRbMF0gIT0gMCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgbnVtT3V0Qnl0ZXMgPQorICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQUFDIGRlY29kZXIgcmV0dXJuZWQgZXJyb3IgMHglNC40eCwgc3Vic3RpdHV0aW5nIHNpbGVuY2UiLCBkZWNvZGVyRXJyKTsKKworICAgICAgICAgICAgICAgIG1lbXNldCh0bXBPdXRCdWZmZXIsIDAsIG51bU91dEJ5dGVzKTsgLy8gVE9ETzogY2hlY2sgZm9yIG92ZXJmbG93CisKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRGlzY2FyZCBpbnB1dCBidWZmZXIuCisgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CisKKyAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSLCAxKTsKKworICAgICAgICAgICAgICAgIC8vIEFmdGVyIGFuIGVycm9yLCByZXBsYWNlIGJ1ZmZlclNpemUgd2l0aCB0aGUgc3VtIG9mIHRoZQorICAgICAgICAgICAgICAgIC8vIGRlY29kZWRTaXplcyB0byByZXN5bmNocm9uaXplIHRoZSBpbi9vdXQgbGlzdHMuCisgICAgICAgICAgICAgICAgaW5JbmZvLmRlY29kZWRTaXplcy5wb3BfYmFjaygpOworICAgICAgICAgICAgICAgIGluSW5mby5idWZmZXJTaXplID0gc3RkOjphY2N1bXVsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmZvLmRlY29kZWRTaXplcy5iZWdpbigpLCBpbkluZm8uZGVjb2RlZFNpemVzLmVuZCgpLCAwKTsKKworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQUFDKy9lQUFDKyBzdHJlYW1zIGNhbiBiZSBzaWduYWxsZWQgaW4gdHdvIHdheXM6IGVpdGhlciBleHBsaWNpdGx5CisgICAgICAgICAgICAgKiBvciBpbXBsaWNpdGx5LCBhY2NvcmRpbmcgdG8gTVBFRzQgc3BlYy4gQUFDKy9lQUFDKyBpcyBhIGR1YWwKKyAgICAgICAgICAgICAqIHJhdGUgc3lzdGVtIGFuZCB0aGUgc2FtcGxpbmcgcmF0ZSBpbiB0aGUgZmluYWwgb3V0cHV0IGlzIGFjdHVhbGx5CisgICAgICAgICAgICAgKiBkb3VibGVkIGNvbXBhcmVkIHdpdGggdGhlIGNvcmUgQUFDIGRlY29kZXIgc2FtcGxpbmcgcmF0ZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBFeHBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZXhwbGljaXRseSBkZWZpbmluZyBTQlIgYXVkaW8gb2JqZWN0CisgICAgICAgICAgICAgKiB0eXBlIGluIHRoZSBiaXRzdHJlYW0uIEltcGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBlbWJlZGRpbmcKKyAgICAgICAgICAgICAqIFNCUiBjb250ZW50IGluIEFBQyBleHRlbnNpb24gcGF5bG9hZCBzcGVjaWZpYyB0byBTQlIsIGFuZCBoZW5jZQorICAgICAgICAgICAgICogcmVxdWlyZXMgYW4gQUFDIGRlY29kZXIgdG8gcGVyZm9ybSBwcmUtY2hlY2tzIG9uIGFjdHVhbCBhdWRpbyBmcmFtZXMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGh1cywgd2UgY291bGQgbm90IHNheSBmb3Igc3VyZSB3aGV0aGVyIGEgc3RyZWFtIGlzCisgICAgICAgICAgICAgKiBBQUMrL2VBQUMrIHVudGlsIHRoZSBmaXJzdCBkYXRhIGZyYW1lIGlzIGRlY29kZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgfHwgIW1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIC8vIGlmICgobUlucHV0QnVmZmVyQ291bnQgPiAyKSAmJiAobU91dHB1dEJ1ZmZlckNvdW50IDw9IDEpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJJbnZhbGlkIEFBQyBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAvLyBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICE9IHByZXZTYW1wbGVSYXRlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICE9IHByZXZOdW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJldlNhbXBsZVJhdGUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgIHByZXZOdW1DaGFubmVscywgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIGRvZXMgbm90IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdmFsdWVzIGFyZQorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBhbHRlcmVkIGR1cmluZyBjb25maWcuCisgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzaXplID0gJXp1Iiwgc2l6ZSk7CisgICAgICAgIH0gd2hpbGUgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSyk7CisgICAgfQorCisgICAgaW50MzJfdCBvdXRwdXREZWxheSA9IG1TdHJlYW1JbmZvLT5vdXRwdXREZWxheSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgIG1CdWZmZXJzSW5mby5wdXNoX2JhY2soc3RkOjptb3ZlKGluSW5mbykpOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgaWYgKCFlb3MgJiYgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPCBvdXRwdXREZWxheSkgeworICAgICAgICAvLyBkaXNjYXJkIG91dHB1dERlbGF5IGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICAgaW50MzJfdCB0b0NvbXBlbnNhdGUgPSBvdXRwdXREZWxheSAtIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICBpbnQzMl90IGRpc2NhcmQgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CisgICAgICAgIGlmIChkaXNjYXJkID4gdG9Db21wZW5zYXRlKSB7CisgICAgICAgICAgICBkaXNjYXJkID0gdG9Db21wZW5zYXRlOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgZGlzY2FyZGVkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhudWxscHRyLCBkaXNjYXJkKTsKKyAgICAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgKz0gZGlzY2FyZGVkOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHJhaW5SaW5nQnVmZmVyKHdvcmssIHBvb2wsIGZhbHNlIC8qIG5vdCBFT1MgKi8pOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKGRyYWluTW9kZSA9PSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MpOworCisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgZHJhaW5SaW5nQnVmZmVyKHdvcmssIHBvb2wsIGVvcyk7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGF1dG8gZmlsbEVtcHR5V29yayA9IFtdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICB9OworICAgICAgICB3aGlsZSAobUJ1ZmZlcnNJbmZvLnNpemUoKSA+IDF1KSB7CisgICAgICAgICAgICBmaW5pc2gobUJ1ZmZlcnNJbmZvLmZyb250KCkuZnJhbWVJbmRleCwgZmlsbEVtcHR5V29yayk7CisgICAgICAgICAgICBtQnVmZmVyc0luZm8ucG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdvcmsgJiYgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPT0gMHUpIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlcnNJbmZvLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgbUJ1ZmZlcnNJbmZvLmNsZWFyKCk7CisKKyAgICBpbnQgYXZhaWw7CisgICAgd2hpbGUgKChhdmFpbCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSkgPiAwKSB7CisgICAgICAgIGlmIChhdmFpbCA+IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGF2YWlsID0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IG5zID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhudWxscHRyLCBhdmFpbCk7CisgICAgICAgIGlmIChucyAhPSBhdmFpbCkgeworICAgICAgICAgICAgQUxPR1coIm5vdCBhIGNvbXBsZXRlIGZyYW1lIG9mIHNhbXBsZXMgYXZhaWxhYmxlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvczsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBYWNEZWM6OmRyYWluRGVjb2RlcigpIHsKKyAgICAvLyBmbHVzaCBkZWNvZGVyIHVudGlsIG91dHB1dERlbGF5IGlzIGNvbXBlbnNhdGVkCisgICAgd2hpbGUgKG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID4gMCkgeworICAgICAgICAvLyBhIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciBNQVhfQ0hBTk5FTF9DT1VOVCBjaGFubmVscyBvZiBkZWNvZGVkIEhFLUFBQworICAgICAgICBJTlRfUENNIHRtcE91dEJ1ZmZlclsyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlRdOworCisgICAgICAgIC8vIHJ1biBEUkMgY2hlY2sKKyAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOworCisgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPQorICAgICAgICAgICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0RFQ19GTFVTSCk7CisgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0RlY29kZUZyYW1lIGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICBpZiAodG1wT3V0QnVmZmVyU2FtcGxlcyA+IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkKSB7CisgICAgICAgICAgICB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsIHRtcE91dEJ1ZmZlclNhbXBsZXMpOworCisgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIC09IHRtcE91dEJ1ZmZlclNhbXBsZXM7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRBYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QWFjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEFhY0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBYWNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBYWNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVjMjllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQUFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQUFDX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCisjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKyNpbmNsdWRlICJEcmNQcmVzTW9kZVdyYXAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0QWFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFhY0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1EZWxheUJsb2Nrc01heCAgICAgID0gOCwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIEhBTkRMRV9BQUNERUNPREVSIG1BQUNEZWNvZGVyOworICAgIENTdHJlYW1JbmZvICptU3RyZWFtSW5mbzsKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKyAgICBzaXplX3QgbU91dHB1dEJ1ZmZlckNvdW50OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIHN0cnVjdCBJbmZvIHsKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7CisgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZGVjb2RlZFNpemVzOworICAgIH07CisgICAgc3RkOjpsaXN0PEluZm8+IG1CdWZmZXJzSW5mbzsKKworICAgIENEcmNQcmVzTW9kZVdyYXBwZXIgbURyY1dyYXA7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKKyAgICB2b2lkIGRyYWluRGVjb2RlcigpOworCisgICAgdm9pZCBkcmFpblJpbmdCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBib29sIGVvcyk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKy8vICAgICAgZGVsYXkgY29tcGVuc2F0aW9uCisgICAgYm9vbCBtRW5kT2ZJbnB1dDsKKyAgICBib29sIG1FbmRPZk91dHB1dDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgc2hvcnQgKm1PdXRwdXREZWxheVJpbmdCdWZmZXI7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvczsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQ7CisgICAgYm9vbCBvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50IG51bVNhbXBsZXMpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQUFDX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzdlNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAKQEAgLTAsMCArMSw2MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0VuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2luY2x1ZGUgIkMyU29mdEFhY0VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEFhY0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA2KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhCdWZTaXplQ2FsY3VsYXRvciwgbUNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxEfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhCdWZTaXplQ2FsY3VsYXRvcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiAmY2hhbm5lbENvdW50KSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDEwMjQgKiBzaXplb2Yoc2hvcnQpICogY2hhbm5lbENvdW50LnYudmFsdWU7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7Cit9OworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiOworCitDMlNvZnRBYWNFbmM6OkMyU29mdEFhY0VuYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQUFDRW5jb2RlcihudWxscHRyKSwKKyAgICAgIG1TQlJNb2RlKC0xKSwKKyAgICAgIG1TQlJSYXRpbygwKSwKKyAgICAgIG1BQUNQcm9maWxlKEFPVF9BQUNfTEMpLAorICAgICAgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSgwdSksCisgICAgICBtT3V0QnVmZmVyU2l6ZSgwdSksCisgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKKyAgICAgIG1JbnB1dFRpbWVTZXQoZmFsc2UpLAorICAgICAgbUlucHV0U2l6ZSgwKSwKKyAgICAgIG1JbnB1dFRpbWVVcygtMWxsKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtT3V0SW5kZXgoMHUpIHsKK30KKworQzJTb2Z0QWFjRW5jOjp+QzJTb2Z0QWFjRW5jKCkgeworICAgIG9uUmVzZXQoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdEVuY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK3N0YXR1c190IEMyU29mdEFhY0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNPcGVuKCZtQUFDRW5jb2RlciwgMCwgMCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IEFBQyBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gc2V0QXVkaW9QYXJhbXMoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpvblN0b3AoKSB7CisgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IGZhbHNlOworICAgIG1JbnB1dFRpbWVTZXQgPSBmYWxzZTsKKyAgICBtSW5wdXRTaXplID0gMHU7CisgICAgbUlucHV0VGltZVVzID0gLTFsbDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGFhY0VuY0Nsb3NlKCZtQUFDRW5jb2Rlcik7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRW5jOjpvblJlbGVhc2UoKSB7CisgICAgLy8gbm8tb3AKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKKyAgICBtSW5wdXRUaW1lU2V0ID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIENIQU5ORUxfTU9ERSBnZXRDaGFubmVsTW9kZSh1aW50MzJfdCBuQ2hhbm5lbHMpIHsKKyAgICBDSEFOTkVMX01PREUgY2hNb2RlID0gTU9ERV9JTlZBTElEOworICAgIHN3aXRjaCAobkNoYW5uZWxzKSB7CisgICAgICAgIGNhc2UgMTogY2hNb2RlID0gTU9ERV8xOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiBjaE1vZGUgPSBNT0RFXzI7IGJyZWFrOworICAgICAgICBjYXNlIDM6IGNoTW9kZSA9IE1PREVfMV8yOyBicmVhazsKKyAgICAgICAgY2FzZSA0OiBjaE1vZGUgPSBNT0RFXzFfMl8xOyBicmVhazsKKyAgICAgICAgY2FzZSA1OiBjaE1vZGUgPSBNT0RFXzFfMl8yOyBicmVhazsKKyAgICAgICAgY2FzZSA2OiBjaE1vZGUgPSBNT0RFXzFfMl8yXzE7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBjaE1vZGUgPSBNT0RFX0lOVkFMSUQ7CisgICAgfQorICAgIHJldHVybiBjaE1vZGU7Cit9CisKKy8vc3RhdGljIEFVRElPX09CSkVDVF9UWVBFIGdldEFPVEZyb21Qcm9maWxlKE9NWF9VMzIgcHJvZmlsZSkgeworLy8gICAgaWYgKHByb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdExDKSB7CisvLyAgICAgICAgcmV0dXJuIEFPVF9BQUNfTEM7CisvLyAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdEhFKSB7CisvLyAgICAgICAgcmV0dXJuIEFPVF9TQlI7CisvLyAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdEhFX1BTKSB7CisvLyAgICAgICAgcmV0dXJuIEFPVF9QUzsKKy8vICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0TEQpIHsKKy8vICAgICAgICByZXR1cm4gQU9UX0VSX0FBQ19MRDsKKy8vICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKSB7CisvLyAgICAgICAgcmV0dXJuIEFPVF9FUl9BQUNfRUxEOworLy8gICAgfSBlbHNlIHsKKy8vICAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQgQUFDIHByb2ZpbGUgLSBkZWZhdWx0aW5nIHRvIEFBQy1MQyIpOworLy8gICAgICAgIHJldHVybiBBT1RfQUFDX0xDOworLy8gICAgfQorLy99CisKK3N0YXR1c190IEMyU29mdEFhY0VuYzo6c2V0QXVkaW9QYXJhbXMoKSB7CisgICAgLy8gV2UgY2FsbCB0aGlzIHdoZW5ldmVyIHNhbXBsZSByYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsIGJpdHJhdGUgb3IgU0JSIG1vZGUgY2hhbmdlCisgICAgLy8gaW4gcmVwb25zZSB0byBzZXRQYXJhbWV0ZXIgY2FsbHMuCisKKyAgICBBTE9HVigic2V0QXVkaW9QYXJhbXM6ICV1IEh6LCAldSBjaGFubmVscywgJXUgYnBzLCAlaSBzYnIgbW9kZSwgJWkgc2JyIHJhdGlvIiwKKyAgICAgICAgIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCksIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSwgbUludGYtPmdldEJpdHJhdGUoKSwgbVNCUk1vZGUsIG1TQlJSYXRpbyk7CisKKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19BT1QsIG1BQUNQcm9maWxlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NBTVBMRVJBVEUsIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUsIG1JbnRmLT5nZXRCaXRyYXRlKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0NIQU5ORUxNT0RFLAorICAgICAgICAgICAgZ2V0Q2hhbm5lbE1vZGUobUludGYtPmdldENoYW5uZWxDb3VudCgpKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfVFJBTlNNVVgsIFRUX01QNF9SQVcpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1TQlJNb2RlICE9IC0xICYmIG1BQUNQcm9maWxlID09IEFPVF9FUl9BQUNfRUxEKSB7CisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NCUl9NT0RFLCBtU0JSTW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU0JSIHJhdGlvIHBhcmFtZXRlciBjb25maWd1cmF0aW9uczoKKyAgICAgICAwOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2hlcmVpbiBTQlIgcmF0aW8gaXMgY29uZmlndXJlZCBkZXBlbmRpbmcgb24gYXVkaW8gb2JqZWN0IHR5cGUgYnkKKyAgICAgICAgICB0aGUgRkRLLgorICAgICAgIDE6IERvd25zYW1wbGVkIFNCUiAoZGVmYXVsdCBmb3IgRUxEKQorICAgICAgIDI6IER1YWxyYXRlIFNCUiAoZGVmYXVsdCBmb3IgSEUtQUFDKQorICAgICAqLworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NCUl9SQVRJTywgbVNCUlJhdGlvKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBYWNFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworCisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworCisgICAgaWYgKCFtU2VudENvZGVjU3BlY2lmaWNEYXRhKSB7CisgICAgICAgIC8vIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gb3V0cHV0IGlzIHRoZSBjb2RlYyBzcGVjaWZpYworICAgICAgICAvLyBkYXRhLgorCisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jRW5jb2RlKG1BQUNFbmNvZGVyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKSkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGVuY29kZXIgZm9yIHByb2ZpbGUgLyBzYW1wbGUtcmF0ZSAvIGJpdC1yYXRlIC8gY2hhbm5lbHMiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBiaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGUoKTsKKyAgICAgICAgdWludDMyX3QgYWN0dWFsQml0UmF0ZSA9IGFhY0VuY29kZXJfR2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19CSVRSQVRFKTsKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gYWN0dWFsQml0UmF0ZSkgeworICAgICAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBiaXRyYXRlICV1IHVuc3VwcG9ydGVkLCB1c2luZyAldSIsIGJpdHJhdGUsIGFjdHVhbEJpdFJhdGUpOworICAgICAgICB9CisKKyAgICAgICAgQUFDRU5DX0luZm9TdHJ1Y3QgZW5jSW5mbzsKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNJbmZvKG1BQUNFbmNvZGVyLCAmZW5jSW5mbykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IEFBQyBlbmNvZGVyIGluZm8iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKGVuY0luZm8uY29uZlNpemUsIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgZW5jSW5mby5jb25mQnVmLCBlbmNJbmZvLmNvbmZTaXplKTsKKyAgICAgICAgQUxPR1YoInB1dCBjc2QiKTsKKyNpZiBkZWZpbmVkKExPR19OREVCVUcpICYmICFMT0dfTkRFQlVHCisgICAgICAgIGhleGR1bXAoY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKTsKKyNlbmRpZgorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisKKyAgICAgICAgbU91dEJ1ZmZlclNpemUgPSBlbmNJbmZvLm1heE91dEJ1ZkJ5dGVzOworICAgICAgICBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0gZW5jSW5mby5mcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gdHJ1ZTsKKyAgICB9CisKKyAgICB1aW50OF90IHRlbXBbMV07CisgICAgQzJSZWFkVmlldyB2aWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHRlbXA7CisgICAgc2l6ZV90IGNhcGFjaXR5ID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgdmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBkYXRhID0gdmlldy5kYXRhKCk7CisgICAgICAgIGNhcGFjaXR5ID0gdmlldy5jYXBhY2l0eSgpOworICAgIH0KKyAgICBpZiAoIW1JbnB1dFRpbWVTZXQgJiYgY2FwYWNpdHkgPiAwKSB7CisgICAgICAgIG1JbnB1dFRpbWVVcyA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wOworICAgICAgICBtSW5wdXRUaW1lU2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtRnJhbWVzID0gKGNhcGFjaXR5ICsgbUlucHV0U2l6ZSArIChlb3MgPyBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gMSA6IDApKQorICAgICAgICAgICAgLyBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIEFMT0dWKCJjYXBhY2l0eSA9ICV6dTsgbUlucHV0U2l6ZSA9ICV6dTsgbnVtRnJhbWVzID0gJXp1IG1OdW1CeXRlc1BlcklucHV0RnJhbWUgPSAldSIsCisgICAgICAgICAgY2FwYWNpdHksIG1JbnB1dFNpemUsIG51bUZyYW1lcywgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV3JpdGVWaWV3PiB3VmlldzsKKyAgICB1aW50OF90ICpvdXRQdHIgPSB0ZW1wOworICAgIHNpemVfdCBvdXRBdmFpbGFibGUgPSAwdTsKKyAgICB1aW50NjRfdCBpbnB1dEluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisKKyAgICBBQUNFTkNfSW5BcmdzIGluYXJnczsKKyAgICBBQUNFTkNfT3V0QXJncyBvdXRhcmdzOworICAgIG1lbXNldCgmaW5hcmdzLCAwLCBzaXplb2YoaW5hcmdzKSk7CisgICAgbWVtc2V0KCZvdXRhcmdzLCAwLCBzaXplb2Yob3V0YXJncykpOworICAgIGluYXJncy5udW1JblNhbXBsZXMgPSBjYXBhY2l0eSAvIHNpemVvZihpbnQxNl90KTsKKworICAgIHZvaWQqIGluQnVmZmVyW10gICAgICAgID0geyAodW5zaWduZWQgY2hhciAqKWRhdGEgfTsKKyAgICBJTlQgICBpbkJ1ZmZlcklkc1tdICAgICA9IHsgSU5fQVVESU9fREFUQSB9OworICAgIElOVCAgIGluQnVmZmVyU2l6ZVtdICAgID0geyAoSU5UKWNhcGFjaXR5IH07CisgICAgSU5UICAgaW5CdWZmZXJFbFNpemVbXSAgPSB7IHNpemVvZihpbnQxNl90KSB9OworCisgICAgQUFDRU5DX0J1ZkRlc2MgaW5CdWZEZXNjOworICAgIGluQnVmRGVzYy5udW1CdWZzICAgICAgICAgICA9IHNpemVvZihpbkJ1ZmZlcikgLyBzaXplb2Yodm9pZCopOworICAgIGluQnVmRGVzYy5idWZzICAgICAgICAgICAgICA9ICh2b2lkKiopJmluQnVmZmVyOworICAgIGluQnVmRGVzYy5idWZmZXJJZGVudGlmaWVycyA9IGluQnVmZmVySWRzOworICAgIGluQnVmRGVzYy5idWZTaXplcyAgICAgICAgICA9IGluQnVmZmVyU2l6ZTsKKyAgICBpbkJ1ZkRlc2MuYnVmRWxTaXplcyAgICAgICAgPSBpbkJ1ZmZlckVsU2l6ZTsKKworICAgIHZvaWQqIG91dEJ1ZmZlcltdICAgICAgID0geyBvdXRQdHIgfTsKKyAgICBJTlQgICBvdXRCdWZmZXJJZHNbXSAgICA9IHsgT1VUX0JJVFNUUkVBTV9EQVRBIH07CisgICAgSU5UICAgb3V0QnVmZmVyU2l6ZVtdICAgPSB7IDAgfTsKKyAgICBJTlQgICBvdXRCdWZmZXJFbFNpemVbXSA9IHsgc2l6ZW9mKFVDSEFSKSB9OworCisgICAgQUFDRU5DX0J1ZkRlc2Mgb3V0QnVmRGVzYzsKKyAgICBvdXRCdWZEZXNjLm51bUJ1ZnMgICAgICAgICAgID0gc2l6ZW9mKG91dEJ1ZmZlcikgLyBzaXplb2Yodm9pZCopOworICAgIG91dEJ1ZkRlc2MuYnVmcyAgICAgICAgICAgICAgPSAodm9pZCoqKSZvdXRCdWZmZXI7CisgICAgb3V0QnVmRGVzYy5idWZmZXJJZGVudGlmaWVycyA9IG91dEJ1ZmZlcklkczsKKyAgICBvdXRCdWZEZXNjLmJ1ZlNpemVzICAgICAgICAgID0gb3V0QnVmZmVyU2l6ZTsKKyAgICBvdXRCdWZEZXNjLmJ1ZkVsU2l6ZXMgICAgICAgID0gb3V0QnVmZmVyRWxTaXplOworCisgICAgQUFDRU5DX0VSUk9SIGVuY29kZXJFcnIgPSBBQUNFTkNfT0s7CisKKyAgICBjbGFzcyBGaWxsV29yayB7CisgICAgcHVibGljOgorICAgICAgICBGaWxsV29yayh1aW50MzJfdCBmbGFncywgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgICAgICAgICA6IG1GbGFncyhmbGFncyksIG1PcmRpbmFsKG9yZGluYWwpLCBtQnVmZmVyKGJ1ZmZlcikgeworICAgICAgICB9CisgICAgICAgIH5GaWxsV29yaygpID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCltRmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSBtT3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKG1CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCA9ICVsbGQsIGluZGV4ID0gJWxsZCwgdy8lcyBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgbU9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbU9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPyAiIiA6ICJvIik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCBtT3JkaW5hbDsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyOworICAgIH07CisKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG91dE9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgd2hpbGUgKGVuY29kZXJFcnIgPT0gQUFDRU5DX09LICYmIGluYXJncy5udW1JblNhbXBsZXMgPiAwKSB7CisgICAgICAgIGlmIChudW1GcmFtZXMgJiYgIWJsb2NrKSB7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRCdWZmZXJTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmYWlsZWQgOiBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd1ZpZXcucmVzZXQobmV3IEMyV3JpdGVWaWV3KGJsb2NrLT5tYXAoKS5nZXQoKSkpOworICAgICAgICAgICAgb3V0UHRyID0gd1ZpZXctPmRhdGEoKTsKKyAgICAgICAgICAgIG91dEF2YWlsYWJsZSA9IHdWaWV3LT5zaXplKCk7CisgICAgICAgICAgICAtLW51bUZyYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmb3V0YXJncywgMCwgc2l6ZW9mKG91dGFyZ3MpKTsKKworICAgICAgICBvdXRCdWZmZXJbMF0gPSBvdXRQdHI7CisgICAgICAgIG91dEJ1ZmZlclNpemVbMF0gPSBvdXRBdmFpbGFibGU7CisKKyAgICAgICAgZW5jb2RlckVyciA9IGFhY0VuY0VuY29kZShtQUFDRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGFyZ3MpOworCisgICAgICAgIGlmIChlbmNvZGVyRXJyID09IEFBQ0VOQ19PSykgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgICAgICAgICAgICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUlucHV0VGltZVVzOworICAgICAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvdXRhcmdzLm51bU91dEJ5dGVzID4gMCkgeworICAgICAgICAgICAgICAgIG1JbnB1dFNpemUgPSAwOworICAgICAgICAgICAgICAgIGludCBjb25zdW1lZCA9IChjYXBhY2l0eSAvIHNpemVvZihpbnQxNl90KSkgLSBpbmFyZ3MubnVtSW5TYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICArIG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgICAgIG1JbnB1dFRpbWVVcyA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICArIChjb25zdW1lZCAqIDEwMDAwMDBsbCAvIGNoYW5uZWxDb3VudCAvIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0YXJncy5udW1PdXRCeXRlcyk7CisjaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRworICAgICAgICAgICAgICAgIGhleGR1bXAob3V0UHRyLCBzdGQ6Om1pbihvdXRhcmdzLm51bU91dEJ5dGVzLCAyNTYpKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIG91dFB0ciA9IHRlbXA7CisgICAgICAgICAgICAgICAgb3V0QXZhaWxhYmxlID0gMDsKKyAgICAgICAgICAgICAgICBibG9jay5yZXNldCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRTaXplICs9IG91dGFyZ3MubnVtSW5TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3V0YXJncy5udW1JblNhbXBsZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSAoaW50MTZfdCAqKWluQnVmZmVyWzBdICsgb3V0YXJncy5udW1JblNhbXBsZXM7CisgICAgICAgICAgICAgICAgaW5CdWZmZXJTaXplWzBdIC09IG91dGFyZ3MubnVtSW5TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgICAgIGluYXJncy5udW1JblNhbXBsZXMgLT0gb3V0YXJncy5udW1JblNhbXBsZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImVuY29kZXJFcnIgPSAlZCBtSW5wdXRTaXplID0gJXp1IGluYXJncy5udW1JblNhbXBsZXMgPSAlZCwgbUlucHV0VGltZVVzID0gJWxsZCIsCisgICAgICAgICAgICAgIGVuY29kZXJFcnIsIG1JbnB1dFNpemUsIGluYXJncy5udW1JblNhbXBsZXMsIG1JbnB1dFRpbWVVcy5wZWVrbGwoKSk7CisgICAgfQorCisgICAgaWYgKGVvcyAmJiBpbkJ1ZmZlclNpemVbMF0gPiAwKSB7CisgICAgICAgIGlmIChudW1GcmFtZXMgJiYgIWJsb2NrKSB7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRCdWZmZXJTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmYWlsZWQgOiBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd1ZpZXcucmVzZXQobmV3IEMyV3JpdGVWaWV3KGJsb2NrLT5tYXAoKS5nZXQoKSkpOworICAgICAgICAgICAgb3V0UHRyID0gd1ZpZXctPmRhdGEoKTsKKyAgICAgICAgICAgIG91dEF2YWlsYWJsZSA9IHdWaWV3LT5zaXplKCk7CisgICAgICAgICAgICAtLW51bUZyYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmb3V0YXJncywgMCwgc2l6ZW9mKG91dGFyZ3MpKTsKKworICAgICAgICBvdXRCdWZmZXJbMF0gPSBvdXRQdHI7CisgICAgICAgIG91dEJ1ZmZlclNpemVbMF0gPSBvdXRBdmFpbGFibGU7CisKKyAgICAgICAgLy8gRmx1c2gKKyAgICAgICAgaW5hcmdzLm51bUluU2FtcGxlcyA9IC0xOworCisgICAgICAgICh2b2lkKWFhY0VuY0VuY29kZShtQUFDRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0YXJncyk7CisgICAgfQorCisgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtSW5wdXRUaW1lVXM7CisgICAgRmlsbFdvcmsoKEMyRnJhbWVEYXRhOjpmbGFnc190KShlb3MgPyBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNIDogMCksCisgICAgICAgICAgICAgb3V0T3JkaW5hbCwgYnVmZmVyKSh3b3JrKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgc3dpdGNoIChkcmFpbk1vZGUpIHsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfTk9fRU9TOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIE5PX0RSQUlOOgorICAgICAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgY2FzZSBEUkFJTl9DSEFJTjoKKyAgICAgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAodm9pZClwb29sOworICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKKyAgICBtSW5wdXRUaW1lU2V0ID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworCisgICAgLy8gVE9ETzogd2UgZG9uJ3QgaGF2ZSBhbnkgcGVuZGluZyB3b3JrIGF0IHRoaXMgdGltZSB0byBkcmFpbi4KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFhY0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBYWNFbmNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QWFjRW5jKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFhY0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFhY0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTM2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJhYWNlbmNfbGliLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QWFjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFhY0VuYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIEhBTkRMRV9BQUNFTkNPREVSIG1BQUNFbmNvZGVyOworCisgICAgaW50MzJfdCBtU0JSTW9kZTsKKyAgICBpbnQzMl90IG1TQlJSYXRpbzsKKyAgICBBVURJT19PQkpFQ1RfVFlQRSBtQUFDUHJvZmlsZTsKKyAgICBVSU5UIG1OdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgVUlOVCBtT3V0QnVmZmVyU2l6ZTsKKworICAgIGJvb2wgbVNlbnRDb2RlY1NwZWNpZmljRGF0YTsKKyAgICBib29sIG1JbnB1dFRpbWVTZXQ7CisgICAgc2l6ZV90IG1JbnB1dFNpemU7CisgICAgYzJfY250cjY0X3QgbUlucHV0VGltZVVzOworCisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbU91dEluZGV4OworCisgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgIHN0YXR1c190IHNldEF1ZGlvUGFyYW1zKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBYWNFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQUFDX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjlhZWJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5jcHAKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkRyY1ByZXNNb2RlV3JhcC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QWFjRHJjV3JhcHBlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLy8jZGVmaW5lIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworCisjZGVmaW5lIEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCA2NAorI2RlZmluZSBNQVhfVEFSR0VUX0xFVkVMIDQwCisKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OkNEcmNQcmVzTW9kZVdyYXBwZXIoKQoreworICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKworICAgIC8qIERhdGEgZnJvbSBzdHJlYW1JbmZvLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyBpbiB0aGUgYWFjIGRlY29kZXIgKi8KKyAgICBtU3RyZWFtUFJMID0gLTE7CisgICAgbVN0cmVhbURSQ1ByZXNNb2RlID0gLTE7CisgICAgbVN0cmVhbU5yQUFDQ2hhbiA9IDA7CisgICAgbVN0cmVhbU5yT3V0Q2hhbiA9IDA7CisKKyAgICAvKiBEZXNpcmVkIHZhbHVlcyAoc2V0IGJ5IHVzZXIpLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyBpbiB0aGUgYWFjIGRlY29kZXIgKi8KKyAgICBtRGVzVGFyZ2V0ID0gLTE7CisgICAgbURlc0F0dEZhY3RvciA9IDA7CisgICAgbURlc0Jvb3N0RmFjdG9yID0gMDsKKyAgICBtRGVzSGVhdnkgPSAwOworCisgICAgbUVuY29kZXJUYXJnZXQgPSAtMTsKKworICAgIC8qIFZhbHVlcyBmcm9tIGxhc3QgdGltZS4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIGRlc2lyZWQgdmFsdWVzICovCisgICAgbUxhc3RUYXJnZXQgPSAtMTsKKyAgICBtTGFzdEF0dEZhY3RvciA9IDA7CisgICAgbUxhc3RCb29zdEZhY3RvciA9IDA7CisgICAgbUxhc3RIZWF2eSA9IDA7Cit9CisKK0NEcmNQcmVzTW9kZVdyYXBwZXI6On5DRHJjUHJlc01vZGVXcmFwcGVyKCkKK3sKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c2V0RGVjb2RlckhhbmRsZShjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBoYW5kbGUpCit7CisgICAgbUhhbmRsZURlY29kZXIgPSBoYW5kbGU7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnN1Ym1pdFN0cmVhbURhdGEoQ1N0cmVhbUluZm8qIHBTdHJlYW1JbmZvKQoreworICAgIGFzc2VydChwU3RyZWFtSW5mbyk7CisKKyAgICBpZiAobVN0cmVhbVBSTCAhPSBwU3RyZWFtSW5mby0+ZHJjUHJvZ1JlZkxldikgeworICAgICAgICBtU3RyZWFtUFJMID0gcFN0cmVhbUluZm8tPmRyY1Byb2dSZWZMZXY7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBkcmNQcm9nUmVmTGV2IGlzICVkXG4iLCBtU3RyZWFtUFJMKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtRFJDUHJlc01vZGUgIT0gcFN0cmVhbUluZm8tPmRyY1ByZXNNb2RlKSB7CisgICAgICAgIG1TdHJlYW1EUkNQcmVzTW9kZSA9IHBTdHJlYW1JbmZvLT5kcmNQcmVzTW9kZTsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGRyY1ByZXNNb2RlIGlzICVkXG4iLCBtU3RyZWFtRFJDUHJlc01vZGUpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1OckFBQ0NoYW4gIT0gcFN0cmVhbUluZm8tPmFhY051bUNoYW5uZWxzKSB7CisgICAgICAgIG1TdHJlYW1OckFBQ0NoYW4gPSBwU3RyZWFtSW5mby0+YWFjTnVtQ2hhbm5lbHM7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBhYWNOdW1DaGFubmVscyBpcyAlZFxuIiwgbVN0cmVhbU5yQUFDQ2hhbik7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbU5yT3V0Q2hhbiAhPSBwU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgbVN0cmVhbU5yT3V0Q2hhbiA9IHBTdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IG51bUNoYW5uZWxzIGlzICVkXG4iLCBtU3RyZWFtTnJPdXRDaGFuKTsKKyNlbmRpZgorICAgIH0KKworCisKKyAgICBpZiAobVN0cmVhbU5yT3V0Q2hhbjxtU3RyZWFtTnJBQUNDaGFuKSB7CisgICAgICAgIG1Jc0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUlzRG93bm1peCAmJiAobVN0cmVhbU5yT3V0Q2hhbiA9PSAxKSkgeworICAgICAgICBtSXNNb25vRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzTW9ub0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUlzRG93bm1peCAmJiBtU3RyZWFtTnJPdXRDaGFuID09IDIpeworICAgICAgICBtSXNTdGVyZW9Eb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNTdGVyZW9Eb3dubWl4ID0gZmFsc2U7CisgICAgfQorCit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnNldFBhcmFtKGNvbnN0IERSQ19QUkVTX01PREVfV1JBUF9QQVJBTSBwYXJhbSwgY29uc3QgaW50IHZhbHVlKQoreworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVDoKKyAgICAgICAgbURlc1RhcmdldCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1I6CisgICAgICAgIG1EZXNBdHRGYWN0b3IgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1I6CisgICAgICAgIG1EZXNCb29zdEZhY3RvciA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZOgorICAgICAgICBtRGVzSGVhdnkgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQ6CisgICAgICAgIG1FbmNvZGVyVGFyZ2V0ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtRGF0YVVwZGF0ZSA9IHRydWU7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnVwZGF0ZSgpCit7CisgICAgLy8gR2V0IERhdGEgZnJvbSBEZWNvZGVyCisgICAgaW50IHByb2dSZWZMZXZlbCA9IG1TdHJlYW1QUkw7CisgICAgaW50IGRyY1ByZXNNb2RlID0gbVN0cmVhbURSQ1ByZXNNb2RlOworCisgICAgLy8gYnkgZGVmYXVsdCwgZG8gYXMgZGVzaXJlZAorICAgIGludCBuZXdUYXJnZXQgICAgICAgICA9IG1EZXNUYXJnZXQ7CisgICAgaW50IG5ld0F0dEZhY3RvciAgICAgID0gbURlc0F0dEZhY3RvcjsKKyAgICBpbnQgbmV3Qm9vc3RGYWN0b3IgICAgPSBtRGVzQm9vc3RGYWN0b3I7CisgICAgaW50IG5ld0hlYXZ5ICAgICAgICAgID0gbURlc0hlYXZ5OworCisgICAgaWYgKG1EYXRhVXBkYXRlKSB7CisgICAgICAgIC8vIHNhbml0eSBjaGVjaworICAgICAgICBpZiAobURlc1RhcmdldCA8IE1BWF9UQVJHRVRfTEVWRUwpeworICAgICAgICAgICAgbURlc1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7ICAvLyBsaW1pdCB0YXJnZXQgbGV2ZWwgdG8gLTEwIGRCIG9yIGJlbG93CisgICAgICAgICAgICBuZXdUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FbmNvZGVyVGFyZ2V0ICE9IC0xKSB7CisgICAgICAgICAgICBpZiAobURlc1RhcmdldDwxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgaWYgKChtSXNTdGVyZW9Eb3dubWl4ID09IGZhbHNlKSAmJiAobUlzTW9ub0Rvd25taXggPT0gZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0ZXJlbyBvciBtb25vIGRvd25taXhpbmcsIGNhbGN1bGF0ZWQgc2NhbGluZyBvZiBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGFzIGxpdHRsZSBjb21wcmVzc2lvbiBhcyBwb3NzaWJsZSAqLworICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAwOworICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PHByb2dSZWZMZXZlbCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5jb2RlclRhcmdldCA8IG1EZXNUYXJnZXQpIHsgLy8gaWYgbUVuY29kZXJUYXJnZXQgPiB0YXJnZXQgbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtRW5jb2RlclRhcmdldCA+IHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWxjRmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNhbGNGYWN0b3Jfbm9ybTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwLjBmIDwgY2FsY0ZhY3Rvcl9ub3JtIDwgMS4wZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNGYWN0b3Jfbm9ybSA9IChmbG9hdCkobURlc1RhcmdldCAtIHByb2dSZWZMZXZlbCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShtRW5jb2RlclRhcmdldCAtIHByb2dSZWZMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY0ZhY3RvciA9IChpbnQpKGNhbGNGYWN0b3Jfbm9ybSoxMjcuMGYpOyAvLyAwIDw9IGNhbGNGYWN0b3IgPCAxMjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjRmFjdG9yIGlzIHRoZSBsb3dlciBsaW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IChjYWxjRmFjdG9yPm5ld0F0dEZhY3RvcikgPyBjYWxjRmFjdG9yIDogbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBBdHRGYWN0b3Igd2lsbCBiZSBhbHdheXMgPSBjYWxjRmFjdG9yLCBhcyBpdCBpcyBzZXQgdG8gMCBiZWZvcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhcmdldCBsZXZlbCA+IG1FbmNvZGVyVGFyZ2V0ID4gUFJMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcmVzdHJpY3Rpb25zIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRhcmdldCBsZXZlbCA+IC0yMyBkQiBvciBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAobURlc1RhcmdldDw5MikgfHwgbUlzTW9ub0Rvd25taXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBwZXJmb3JtIGEgZG93bm1peCwgc28sIHdlIG5lZWQgYXQgbGVhc3QgZnVsbCBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEI6IGxpZ2h0IERSQyBvbmx5IG5lZWRlZCBpZiB3ZSBwZXJmb3JtIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gaGFuZGxlIG90aGVyIHVzZWQgZW5jb2RlciB0YXJnZXQgbGV2ZWxzCisKKyAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjazogRFJDIHByZXNlbnRhdGlvbiBtb2RlIGlzIG9ubHkgc3BlY2lmaWVkIGZvciBtYXguIDUuMSBjaGFubmVscworICAgICAgICAgICAgaWYgKG1TdHJlYW1OckFBQ0NoYW4gPiA2KSB7CisgICAgICAgICAgICAgICAgZHJjUHJlc01vZGUgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGRyY1ByZXNNb2RlKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBkZWZhdWx0OiAvLyBwcmVzZW50YXRpb24gbW9kZSBub3QgaW5kaWNhdGVkCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDwxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0ZXJlbyBvciBtb25vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtSXNTdGVyZW9Eb3dubWl4ID09IGZhbHNlKSAmJiAobUlzTW9ub0Rvd25taXggPT0gZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDxwcm9nUmVmTGV2ZWwpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OyAvLyBhdCBsZWFzdCwgdXNlIGxpZ2h0IGNvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcmVzdHJpY3Rpb25zIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRhcmdldCBsZXZlbCA+IC0yMyBkQiBvciBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKG1EZXNUYXJnZXQgPCA5MikgfHwgbUlzTW9ub0Rvd25taXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHBlcmZvcm0gYSBkb3dubWl4LCBzbywgd2UgbmVlZCBhdCBsZWFzdCBmdWxsIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFByZXNlbnRhdGlvbiBtb2RlIDEgYW5kIDIgYWNjb3JkaW5nIHRvIEVUU0kgVFMgMTAxIDE1NDoKKyAgICAgICAgICAgIC8vIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIChEVkIpOyBTcGVjaWZpY2F0aW9uIGZvciB0aGUgdXNlIG9mIFZpZGVvIGFuZCBBdWRpbyBDb2RpbmcKKyAgICAgICAgICAgIC8vIGluIEJyb2FkY2FzdGluZyBBcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlIE1QRUctMiBUcmFuc3BvcnQgU3RyZWFtLAorICAgICAgICAgICAgLy8gc2VjdGlvbiBDLjUuNC4sICJEZWNvZGluZyIsIGFuZCBUYWJsZSBDLjMzCisgICAgICAgICAgICAvLyBJU08gRFJDICAgICAgICAgICAgLT4gbmV3SGVhdnkgPSAwICAoVXNlIGxpZ2h0IGNvbXByZXNzaW9uLCBNUEVHLXN0eWxlKQorICAgICAgICAgICAgLy8gQ29tcHJlc3Npb25fdmFsdWUgIC0+IG5ld0hlYXZ5ID0gMSAgKFVzZSBoZWF2eSBjb21wcmVzc2lvbiwgRFZCLXN0eWxlKQorICAgICAgICAgICAgLy8gc2NhbGluZyByZXN0cmljdGVkIC0+IG5ld0F0dEZhY3RvciA9IDEyNworCisgICAgICAgICAgICBjYXNlIDE6IC8vIHByZXNlbnRhdGlvbiBtb2RlIDEsIExpZ2h0Oi0zMS9IZWF2eTotMjMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldCA8IDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdXAgdG8gLTIzIGRCCisgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOiAvLyBwcmVzZW50YXRpb24gbW9kZSAyLCBMaWdodDotMjMvSGVhdnk6LTIzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCAxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIHVwIHRvIC0yMyBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzTW9ub0Rvd25taXgpIHsgLy8gaWYgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9IC8vIHN3aXRjaCgpCisgICAgICAgIH0gLy8gaWYgKG1FbmNvZGVyVGFyZ2V0ICA9PSBHUE1fRU5DT0RFUl9UQVJHRVRfTEVWRUwpCisKKyAgICAgICAgLy8gc2FuaXR5IGFnYWluCisgICAgICAgIGlmIChuZXdIZWF2eSA9PSAxKSB7CisgICAgICAgICAgICBuZXdCb29zdEZhY3Rvcj0xMjc7IC8vIG5vdCByZWFsbHkgbmVlZGVkIGFzIHRoZSBzYW1lIHdvdWxkIGJlIGRvbmUgYnkgdGhlIGRlY29kZXIgYW55d2F5CisgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgIH0KKworICAgICAgICAvLyB1cGRhdGUgdGhlIGRlY29kZXIKKyAgICAgICAgaWYgKG5ld1RhcmdldCAhPSBtTGFzdFRhcmdldCkgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwsIG5ld1RhcmdldCk7CisgICAgICAgICAgICBtTGFzdFRhcmdldCA9IG5ld1RhcmdldDsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdUYXJnZXQgIT0gbURlc1RhcmdldCkKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCB0YXJnZXQgbGV2ZWwgdG8gJWQgKGZyb20gJWQpXG4iLCBuZXdUYXJnZXQsIG1EZXNUYXJnZXQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IHRhcmdldCBsZXZlbCB0byAlZFxuIiwgbmV3VGFyZ2V0KTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0F0dEZhY3RvciAhPSBtTGFzdEF0dEZhY3RvcikgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsIG5ld0F0dEZhY3Rvcik7CisgICAgICAgICAgICBtTGFzdEF0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdBdHRGYWN0b3IgIT0gbURlc0F0dEZhY3RvcikKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBhdHRlbnVhdGlvbiBmYWN0b3IgdG8gJWQgKGZyb20gJWQpXG4iLCBuZXdBdHRGYWN0b3IsIG1EZXNBdHRGYWN0b3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGF0dGVudWF0aW9uIGZhY3RvciB0byAlZFxuIiwgbmV3QXR0RmFjdG9yKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0Jvb3N0RmFjdG9yICE9IG1MYXN0Qm9vc3RGYWN0b3IpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfQk9PU1RfRkFDVE9SLCBuZXdCb29zdEZhY3Rvcik7CisgICAgICAgICAgICBtTGFzdEJvb3N0RmFjdG9yID0gbmV3Qm9vc3RGYWN0b3I7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3Qm9vc3RGYWN0b3IgIT0gbURlc0Jvb3N0RmFjdG9yKQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGJvb3N0IGZhY3RvciB0byAlZCAoZnJvbSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciwgbURlc0Jvb3N0RmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBib29zdCBmYWN0b3IgdG8gJWRcbiIsIG5ld0Jvb3N0RmFjdG9yKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0hlYXZ5ICE9IG1MYXN0SGVhdnkpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04sIG5ld0hlYXZ5KTsKKyAgICAgICAgICAgIG1MYXN0SGVhdnkgPSBuZXdIZWF2eTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdIZWF2eSAhPSBtRGVzSGVhdnkpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgaGVhdnkgY29tcHJlc3Npb24gdG8gJWQgKGZyb20gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnksIG1EZXNIZWF2eSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgaGVhdnkgY29tcHJlc3Npb24gdG8gJWRcbiIsIG5ld0hlYXZ5KTsKKyNlbmRpZgorICAgICAgICB9CisKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBjb25maWc6IHRndF9sZXY6ICUzZCwgY3V0OiAlM2QsIGJvb3N0OiAlM2QsIGhlYXZ5OiAlZFxuIiwgbmV3VGFyZ2V0LAorICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciwgbmV3Qm9vc3RGYWN0b3IsIG5ld0hlYXZ5KTsKKyNlbmRpZgorICAgICAgICBtRGF0YVVwZGF0ZSA9IGZhbHNlOworCisgICAgfSAvLyBpZiAobURhdGFVcGRhdGUpCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiNmNmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisKK3R5cGVkZWYgZW51bQoreworICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCAgICAgICAgID0gMHgwMDAwLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IgICAgID0gMHgwMDAxLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiAgID0gMHgwMDAyLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZICAgICAgICAgID0gMHgwMDAzLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVCAgICAgICAgID0gMHgwMDA0Cit9IERSQ19QUkVTX01PREVfV1JBUF9QQVJBTTsKKworCitjbGFzcyBDRHJjUHJlc01vZGVXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBDRHJjUHJlc01vZGVXcmFwcGVyKCk7CisgICAgfkNEcmNQcmVzTW9kZVdyYXBwZXIoKTsKKyAgICB2b2lkIHNldERlY29kZXJIYW5kbGUoY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgaGFuZGxlKTsKKyAgICB2b2lkIHNldFBhcmFtKGNvbnN0IERSQ19QUkVTX01PREVfV1JBUF9QQVJBTSBwYXJhbSwgY29uc3QgaW50IHZhbHVlKTsKKyAgICB2b2lkIHN1Ym1pdFN0cmVhbURhdGEoQ1N0cmVhbUluZm8qKTsKKyAgICB2b2lkIHVwZGF0ZSgpOworCitwcm90ZWN0ZWQ6CisgICAgSEFORExFX0FBQ0RFQ09ERVIgbUhhbmRsZURlY29kZXI7CisgICAgaW50IG1EZXNUYXJnZXQ7CisgICAgaW50IG1EZXNBdHRGYWN0b3I7CisgICAgaW50IG1EZXNCb29zdEZhY3RvcjsKKyAgICBpbnQgbURlc0hlYXZ5OworCisgICAgaW50IG1FbmNvZGVyVGFyZ2V0OworCisgICAgaW50IG1MYXN0VGFyZ2V0OworICAgIGludCBtTGFzdEF0dEZhY3RvcjsKKyAgICBpbnQgbUxhc3RCb29zdEZhY3RvcjsKKyAgICBpbnQgbUxhc3RIZWF2eTsKKworICAgIFNDSEFSIG1TdHJlYW1QUkw7CisgICAgU0NIQVIgbVN0cmVhbURSQ1ByZXNNb2RlOworICAgIElOVCBtU3RyZWFtTnJBQUNDaGFuOworICAgIElOVCBtU3RyZWFtTnJPdXRDaGFuOworCisgICAgYm9vbCBtSXNEb3dubWl4OworICAgIGJvb2wgbUlzTW9ub0Rvd25taXg7CisgICAgYm9vbCBtSXNTdGVyZW9Eb3dubWl4OworCisgICAgYm9vbCBtRGF0YVVwZGF0ZTsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjViYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQW5kcm9pZC5icApAQCAtMCwwICsxLDc3IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBbXJEZWMuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQU1STkIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBbXJEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBbXJOYkVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1yd2JlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtcldiRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWQ3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmNwcApAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBBTVJOQgorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBbXJOYkRlYyIKKyNlbHNlCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtcldiRGVjIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFtckRlYy5oIgorI2luY2x1ZGUgImdzbWFtcl9kZWMuaCIKKyNpbmNsdWRlICJwdmFtcndiZGVjb2Rlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBBTVJOQgorICBjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1ybmIuZGVjb2RlciI7CisjZWxzZQorICBjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1yd2IuZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0QW1yRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQgorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQgorI2VuZGlmCisgICAgICAgICAgICAgICAgKSkuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyNpZmRlZiBBTVJOQgorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg4MDAwKX0pCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCAxNjAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oMTYwMDApfSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorI2lmZGVmIEFNUk5CCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNDc1MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDc1MCwgMTIyMDApfSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjYwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjYwMCwgMjM4NTApfSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEFtckRlYzo6QzJTb2Z0QW1yRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1BbXJIYW5kbGUobnVsbHB0ciksCisgICAgICBtRGVjb2RlckJ1ZihudWxscHRyKSwKKyAgICAgIG1EZWNvZGVyQ29va2llKG51bGxwdHIpIHsKKyNpZmRlZiBBTVJOQgorICAgIG1Jc1dpZGUgPSBmYWxzZTsKKyNlbHNlCisgICAgbUlzV2lkZSA9IHRydWU7CisjZW5kaWYKK30KKworQzJTb2Z0QW1yRGVjOjp+QzJTb2Z0QW1yRGVjKCkgeworICAgICh2b2lkKW9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKCFtSXNXaWRlKSB7CisgICAgICAgIFNwZWVjaF9EZWNvZGVfRnJhbWVfcmVzZXQobUFtckhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHZEZWNvZGVyX0FtcldiX1Jlc2V0KG1BbXJIYW5kbGUsIDAgLyogcmVzZXRfYWxsICovKTsKKyAgICB9CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtckRlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRBbXJEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAoIW1Jc1dpZGUpIHsKKyAgICAgICAgaWYgKG1BbXJIYW5kbGUpIHsKKyAgICAgICAgICAgIEdTTURlY29kZUZyYW1lRXhpdCgmbUFtckhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgbUFtckhhbmRsZSA9IG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgICAgICAgICBmcmVlKG1EZWNvZGVyQnVmKTsKKyAgICAgICAgfQorICAgICAgICBtRGVjb2RlckJ1ZiA9IG51bGxwdHI7CisgICAgICAgIG1BbXJIYW5kbGUgPSBudWxscHRyOworICAgICAgICBtRGVjb2RlckNvb2tpZSA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRBbXJEZWM6OmluaXREZWNvZGVyKCkgeworICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICBpZiAoR1NNSW5pdERlY29kZSgmbUFtckhhbmRsZSwgKGludDhfdCAqKSJBTVJOQkRlY29kZXIiKSkKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IG1lbVJlcSA9IHB2RGVjb2Rlcl9BbXJXYk1lbVJlcXVpcmVtZW50cygpOworICAgICAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXEpOworICAgICAgICBpZiAobURlY29kZXJCdWYpIHsKKyAgICAgICAgICAgIHB2RGVjb2Rlcl9BbXJXYl9Jbml0KCZtQW1ySGFuZGxlLCBtRGVjb2RlckJ1ZiwgJm1EZWNvZGVyQ29va2llKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgc2l6ZV90IGdldEZyYW1lU2l6ZShib29sIGlzV2lkZSwgdW5zaWduZWQgRk0pIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZVNpemVOQlsxNl0gPSB7CisgICAgICAgIDEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMSwKKyAgICAgICAgNSwgNiwgNSwgNSwgLy8gU0lECisgICAgICAgIDAsIDAsIDAsIC8vIGZ1dHVyZSB1c2UKKyAgICAgICAgMCAvLyBubyBkYXRhCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZVNpemVXQlsxNl0gPSB7CisgICAgICAgIDE3LCAyMywgMzIsIDM2LCA0MCwgNDYsIDUwLCA1OCwgNjAsCisgICAgICAgIDUsIC8vIFNJRAorICAgICAgICAwLCAwLCAwLCAwLCAvLyBmdXR1cmUgdXNlCisgICAgICAgIDAsIC8vIHNwZWVjaCBsb3N0CisgICAgICAgIDAgLy8gbm8gZGF0YQorICAgIH07CisKKyAgICBpZiAoRk0gPiAxNSB8fCAoaXNXaWRlICYmIEZNID4gOSAmJiBGTSA8IDE0KSB8fCAoIWlzV2lkZSAmJiBGTSA+IDExICYmIEZNIDwgMTUpKSB7CisgICAgICAgIEFMT0dFKCJpbGxlZ2FsIEFNUiBmcmFtZSBtb2RlICVkIiwgRk0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gYWRkIDEgZm9yIGhlYWRlciBieXRlCisgICAgcmV0dXJuIChpc1dpZGUgPyBrRnJhbWVTaXplV0JbRk1dIDoga0ZyYW1lU2l6ZU5CW0ZNXSkgKyAxOworfQorCitzdGF0aWMgc3RhdHVzX3QgY2FsY3VsYXRlTnVtRnJhbWVzKGNvbnN0IHVpbnQ4ICppbnB1dCwgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiAqZnJhbWVTaXplTGlzdCwgYm9vbCBpc1dpZGUpIHsKKyAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IGluU2l6ZTspIHsKKyAgICAgICAgaW50MTZfdCBGTSA9ICgoaW5wdXRbMF0gPj4gMykgJiAweDBmKTsKKyAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShpc1dpZGUsIEZNKTsKKyAgICAgICAgaWYgKGZyYW1lU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGluU2l6ZSAtIGspID49IGZyYW1lU2l6ZSkgeworICAgICAgICAgICAgaW5wdXQgKz0gZnJhbWVTaXplOworICAgICAgICAgICAgayArPSBmcmFtZVNpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBicmVhazsKKyAgICAgICAgZnJhbWVTaXplTGlzdC0+cHVzaF9iYWNrKGZyYW1lU2l6ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBbXJEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGZyYW1lU2l6ZUxpc3Q7CisgICAgaWYgKE9LICE9IGNhbGN1bGF0ZU51bUZyYW1lcyhyVmlldy5kYXRhKCkgKyBpbk9mZnNldCwgaW5TaXplLCAmZnJhbWVTaXplTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1dpZGUpKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZnJhbWVTaXplTGlzdC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJpbnB1dCBzaXplIHNtYWxsZXIgdGhhbiBleHBlY3RlZCIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQxNl90IG91dFNhbXBsZXMgPSBtSXNXaWRlID8ga051bVNhbXBsZXNQZXJGcmFtZVdCIDoga051bVNhbXBsZXNQZXJGcmFtZU5COworICAgIHNpemVfdCBjYWxPdXRTaXplID0gb3V0U2FtcGxlcyAqIGZyYW1lU2l6ZUxpc3Quc2l6ZSgpICogc2l6ZW9mKGludDE2X3QpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhjYWxPdXRTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDE2X3QgKm91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPih3Vmlldy5kYXRhKCkpOworICAgIGF1dG8gaXQgPSBmcmFtZVNpemVMaXN0LmJlZ2luKCk7CisgICAgY29uc3QgdWludDhfdCAqaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoaXQgPT0gZnJhbWVTaXplTGlzdC5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdHJhaWxpbmcgYnl0ZXMsIGlnbm9yaW5nIHRoZW0iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGluUHRyICsgaW5Qb3MpOworICAgICAgICBpbnQxNl90IEZNID0gKCgqaW5wdXQgPj4gMykgJiAweDBmKTsKKyAgICAgICAgaWYgKCFtSXNXaWRlKSB7CisgICAgICAgICAgICBpbnQzMl90IG51bUJ5dGVzUmVhZCA9IEFNUkRlY29kZShtQW1ySGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZyYW1lX1R5cGVfM0dQUCkgRk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCArIDEsIG91dHB1dCwgTUlNRV9JRVRGKTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KG51bUJ5dGVzUmVhZCArIDEpICE9ICppdCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJwYW5pYywgcGFyc2VkIHNpemUgZG9lcyBub3QgbWF0Y2ggZGVjb2RlZCBzaXplIik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKEZNID49IDkpIHsKKyAgICAgICAgICAgICAgICAvLyBQcm9kdWNlIHNpbGVuY2UgaW5zdGVhZCBvZiBjb21mb3J0IG5vaXNlIGFuZCBmb3IKKyAgICAgICAgICAgICAgICAvLyBzcGVlY2ggbG9zdC9ubyBkYXRhLgorICAgICAgICAgICAgICAgIG1lbXNldChvdXRwdXQsIDAsIG91dFNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQxNl90IEZUOworICAgICAgICAgICAgICAgIFJYX1N0YXRlX3diIHJ4X3N0YXRlOworICAgICAgICAgICAgICAgIGludDE2X3QgbnVtUmVjU2FtcGxlczsKKworICAgICAgICAgICAgICAgIG1pbWVfdW5zb3J0aW5nKGNvbnN0X2Nhc3Q8dWludDhfdCAqPigmaW5wdXRbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dFNhbXBsZUJ1ZmZlciwgJkZULCAmRk0sIDEsICZyeF9zdGF0ZSk7CisgICAgICAgICAgICAgICAgcHZEZWNvZGVyX0FtcldiKEZNLCBtSW5wdXRTYW1wbGVCdWZmZXIsIG91dHB1dCwgJm51bVJlY1NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVyQnVmLCBGVCwgbURlY29kZXJDb29raWUpOworICAgICAgICAgICAgICAgIGlmIChudW1SZWNTYW1wbGVzICE9IG91dFNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlNhbXBsZSBvdXRwdXQgcGVyIGZyYW1lIGluY29ycmVjdCIpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRoZSAyIExTQnMgKDE0LWJpdCBvdXRwdXQpICovCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWNTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2ldICY9IDB4ZmZmQzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gKml0OworICAgICAgICBvdXRwdXQgKz0gb3V0U2FtcGxlczsKKyAgICAgICAgKytpdDsKKyAgICB9CisKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtckRlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFNUkRlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBTVJEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QW1yRGVjKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFtckRlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtckRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFNUkRlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFNUkRlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODQ0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0QW1yRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFtckRlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBbXJEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtU2FtcGxlc1BlckZyYW1lTkIgICA9IDE2MCwKKyAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZVdCICAgPSAzMjAsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9pZCAqbUFtckhhbmRsZTsKKyAgICB2b2lkICptRGVjb2RlckJ1ZjsKKyAgICBpbnQxNl90ICptRGVjb2RlckNvb2tpZTsKKworICAgIGludDE2X3QgbUlucHV0U2FtcGxlQnVmZmVyWzQ3N107CisKKyAgICBib29sIG1Jc1dpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFtckRlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNhYTdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcApAQCAtMCwwICsxLDM1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yTmJFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFtck5iRW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFtcm5iLmVuY29kZXIiOworCitjbGFzcyBDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCA4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNDc1MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDc1MCwgMTIyMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEFtck5iRW5jOjpDMlNvZnRBbXJOYkVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUVuY1N0YXRlKG51bGxwdHIpLAorICAgICAgbVNpZFN0YXRlKG51bGxwdHIpIHsKK30KKworQzJTb2Z0QW1yTmJFbmM6On5DMlNvZnRBbXJOYkVuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6Om9uSW5pdCgpIHsKKyAgICBib29sIGR0eF9lbmFibGUgPSBmYWxzZTsKKworICAgIGlmIChBTVJFbmNvZGVJbml0KCZtRW5jU3RhdGUsICZtU2lkU3RhdGUsIGR0eF9lbmFibGUpICE9IDApCisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgLy8gVE9ETzogZ2V0IG1vZGUgZGlyZWN0bHkgZnJvbSBjb25maWcKKyAgICBzd2l0Y2gobUludGYtPmdldEJpdHJhdGUoKSkgeworICAgICAgICBjYXNlIDQ3NTA6IG1Nb2RlID0gTVI0NzU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MTUwOiBtTW9kZSA9IE1SNTE1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTkwMDogbU1vZGUgPSBNUjU5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjcwMDogbU1vZGUgPSBNUjY3OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzQwMDogbU1vZGUgPSBNUjc0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzk1MDogbU1vZGUgPSBNUjc5NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwMjAwOiBtTW9kZSA9IE1SMTAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTIyMDA6IG1Nb2RlID0gTVIxMjI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogbU1vZGUgPSBNUjc5NTsKKyAgICB9CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yTmJFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUVuY1N0YXRlKSB7CisgICAgICAgIEFNUkVuY29kZUV4aXQoJm1FbmNTdGF0ZSwgJm1TaWRTdGF0ZSk7CisgICAgICAgIG1FbmNTdGF0ZSA9IG1TaWRTdGF0ZSA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6b25TdG9wKCkgeworICAgIGlmIChBTVJFbmNvZGVSZXNldChtRW5jU3RhdGUsIG1TaWRTdGF0ZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJOYkVuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yTmJFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IGtOdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUZpbGxlZExlbiArIGluU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gb3V0cHV0QmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmb3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBvdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDY0X3Qgb3V0VGltZVN0YW1wID0KKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgc2l6ZV90IG91dFBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgICAgIGludCB2YWxpZFNhbXBsZXMgPSBtRmlsbGVkTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAoKGluUG9zICsgKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSkgPD0gaW5TaXplKSB7CisgICAgICAgICAgICBtZW1jcHkobUlucHV0RnJhbWUgKyB2YWxpZFNhbXBsZXMsIGluUHRyICsgaW5Qb3MsCisgICAgICAgICAgICAgICAgICAgKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgICAgICAgICBpblBvcyArPSAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLCAoaW5TaXplIC0gaW5Qb3MpKTsKKyAgICAgICAgICAgIG1GaWxsZWRMZW4gKz0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgICAgIGluUG9zICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobUlucHV0RnJhbWUgKyB2YWxpZFNhbXBsZXMsIDAsIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgfSBlbHNlIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgRnJhbWVfVHlwZV8zR1BQIGZyYW1lVHlwZTsKKyAgICAgICAgaW50IG51bUVuY0J5dGVzID0gQU1SRW5jb2RlKG1FbmNTdGF0ZSwgbVNpZFN0YXRlLCBtTW9kZSwgbUlucHV0RnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Vmlldy5kYXRhKCkgKyBvdXRQb3MsICZmcmFtZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJfVFhfV01GKTsKKyAgICAgICAgaWYgKG51bUVuY0J5dGVzIDwgMCB8fCBudW1FbmNCeXRlcyA+ICgoaW50KW91dENhcGFjaXR5IC0gKGludClvdXRQb3MpKSB7CisgICAgICAgICAgICBBTE9HRSgiZW5jb2RlRnJhbWUgY2FsbCBmYWlsZWQsIHN0YXRlIFslZCAlenUgJXp1XSIsIG51bUVuY0J5dGVzLCBvdXRQb3MsIG91dENhcGFjaXR5KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29udmVydCBoZWFkZXIgYnl0ZSBmcm9tIFdNRiB0byBJRVRGIGZvcm1hdC4KKyAgICAgICAgaWYgKG51bUVuY0J5dGVzID4gMCkKKyAgICAgICAgICAgIHdWaWV3LmRhdGEoKVtvdXRQb3NdID0gKCh3Vmlldy5kYXRhKClbb3V0UG9zXSA8PCAzKSB8IDQpICYgMHg3YzsKKyAgICAgICAgb3V0UG9zICs9IG51bUVuY0J5dGVzOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBrTnVtU2FtcGxlc1BlckZyYW1lOworICAgICAgICBtRmlsbGVkTGVuID0gMDsKKyAgICB9CisgICAgQUxPR1YoImNhdXNhbCBzYW1wbGUgc2l6ZSAlZCIsIG1GaWxsZWRMZW4pOworICAgIGlmIChtSXNGaXJzdCAmJiBvdXRQb3MgIT0gMCkgeworICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIH0KKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChvdXRQb3MgIT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKHN0ZDo6bW92ZShvdXRwdXRCbG9jayksIDAsIG91dFBvcykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworCisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIGlmIChtRmlsbGVkTGVuKSBBTE9HVigiRGlzY2FyZGluZyB0cmFpbGluZyAlZCBieXRlcyIsIG1GaWxsZWRMZW4pOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgb25GbHVzaF9zbSgpOworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0QW1yTmJFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QW1yTmJFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdEFtck5iRW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtck5iRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtck5iRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBbXJOYkVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFtck5iRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjE0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQU1SX05CX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQU1SX05CX0VOQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImdzbWFtcl9lbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBbXJOYkVuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICBwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisgICAgQzJTb2Z0QW1yTmJFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBbXJOYkVuYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSBMX0ZSQU1FOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1CeXRlc1BlcklucHV0RnJhbWUgPSBrTnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpOworCisgICAgdm9pZCAqbUVuY1N0YXRlOworICAgIHZvaWQgKm1TaWRTdGF0ZTsKKyAgICBNb2RlIG1Nb2RlOworICAgIGJvb2wgbUlzRmlyc3Q7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisgICAgaW50MzJfdCBtRmlsbGVkTGVuOworICAgIGludDE2X3QgbUlucHV0RnJhbWVba051bVNhbXBsZXNQZXJGcmFtZV07CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBbXJOYkVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BTVJfTkJfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzljYjMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcApAQCAtMCwwICsxLDQzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yV2JFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBbXJXYkVuYy5oIgorI2luY2x1ZGUgImNtbk1lbW9yeS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJ3Yi5lbmNvZGVyIjsKKworY2xhc3MgQzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgMTYwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDE2MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjYwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjYwMCwgMjM4NTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEFtcldiRW5jOjpDMlNvZnRBbXJXYkVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUVuY29kZXJIYW5kbGUobnVsbHB0ciksCisgICAgICBtQXBpSGFuZGxlKG51bGxwdHIpLAorICAgICAgbU1lbU9wZXJhdG9yKG51bGxwdHIpIHsKK30KKworQzJTb2Z0QW1yV2JFbmM6On5DMlNvZnRBbXJXYkVuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yV2JFbmM6Om9uSW5pdCgpIHsKKyAgICAvLyBUT0RPOiBnZXQgbW9kZSBkaXJlY3RseSBmcm9tIGNvbmZpZworICAgIHN3aXRjaChtSW50Zi0+Z2V0Qml0cmF0ZSgpKSB7CisgICAgICAgIGNhc2UgNjYwMDogbU1vZGUgPSBWT0FNUldCX01ENjY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4ODUwOiBtTW9kZSA9IFZPQU1SV0JfTUQ4ODU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjY1MDogbU1vZGUgPSBWT0FNUldCX01EMTI2NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0MjUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxNDI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTU4NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDE1ODU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxODI1MDogbU1vZGUgPSBWT0FNUldCX01EMTgyNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE5ODUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxOTg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjMwNTA6IG1Nb2RlID0gVk9BTVJXQl9NRDIzMDU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyMzg1MDogbU1vZGUgPSBWT0FNUldCX01EMjM4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBtTW9kZSA9IFZPQU1SV0JfTUQyMzA1OworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RW5jb2RlcigpOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1FbmNvZGVySGFuZGxlKSB7CisgICAgICAgIENIRUNLX0VRKChWT19VMzIpVk9fRVJSX05PTkUsIG1BcGlIYW5kbGUtPlVuaW5pdChtRW5jb2RlckhhbmRsZSkpOworICAgICAgICBtRW5jb2RlckhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtQXBpSGFuZGxlKSB7CisgICAgICAgIGRlbGV0ZSBtQXBpSGFuZGxlOworICAgICAgICBtQXBpSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1NZW1PcGVyYXRvcikgeworICAgICAgICBkZWxldGUgbU1lbU9wZXJhdG9yOworICAgICAgICBtTWVtT3BlcmF0b3IgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yV2JFbmM6Om9uU3RvcCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzUGVyRnJhbWU7IGkrKykgeworICAgICAgICBtSW5wdXRGcmFtZVtpXSA9IDB4MDAwODsgLyogRUhGX01BU0sgKi8KKyAgICB9CisgICAgdWludDhfdCBvdXRCdWZmZXJba051bUJ5dGVzUGVySW5wdXRGcmFtZV07CisgICAgKHZvaWQpIGVuY29kZUlucHV0KG91dEJ1ZmZlciwga051bUJ5dGVzUGVySW5wdXRGcmFtZSk7CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yV2JFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXR1c190IEMyU29mdEFtcldiRW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBtQXBpSGFuZGxlID0gbmV3IFZPX0FVRElPX0NPREVDQVBJOworICAgIGlmICghbUFwaUhhbmRsZSkgcmV0dXJuIE5PX01FTU9SWTsKKworICAgIGlmIChWT19FUlJfTk9ORSAhPSB2b0dldEFNUldCRW5jQVBJKG1BcGlIYW5kbGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGFwaSBoYW5kbGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbU1lbU9wZXJhdG9yID0gbmV3IFZPX01FTV9PUEVSQVRPUjsKKyAgICBpZiAoIW1NZW1PcGVyYXRvcikgcmV0dXJuIE5PX01FTU9SWTsKKworICAgIG1NZW1PcGVyYXRvci0+QWxsb2MgPSBjbW5NZW1BbGxvYzsKKyAgICBtTWVtT3BlcmF0b3ItPkNvcHkgPSBjbW5NZW1Db3B5OworICAgIG1NZW1PcGVyYXRvci0+RnJlZSA9IGNtbk1lbUZyZWU7CisgICAgbU1lbU9wZXJhdG9yLT5TZXQgPSBjbW5NZW1TZXQ7CisgICAgbU1lbU9wZXJhdG9yLT5DaGVjayA9IGNtbk1lbUNoZWNrOworCisgICAgVk9fQ09ERUNfSU5JVF9VU0VSREFUQSB1c2VyRGF0YTsKKyAgICBtZW1zZXQoJnVzZXJEYXRhLCAwLCBzaXplb2YodXNlckRhdGEpKTsKKyAgICB1c2VyRGF0YS5tZW1mbGFnID0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUjsKKyAgICB1c2VyRGF0YS5tZW1EYXRhID0gKFZPX1BUUikgbU1lbU9wZXJhdG9yOworCisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPkluaXQoCisgICAgICAgICAgICAgICAgJm1FbmNvZGVySGFuZGxlLCBWT19BVURJT19Db2RpbmdBTVJXQiwgJnVzZXJEYXRhKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgQU1SV0IgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBWT0FNUldCRlJBTUVUWVBFIHR5cGUgPSBWT0FNUldCX1JGQzMyNjc7CisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPlNldFBhcmFtKAorICAgICAgICAgICAgICAgIG1FbmNvZGVySGFuZGxlLCBWT19QSURfQU1SV0JfRlJBTUVUWVBFLCAmdHlwZSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQU1SV0IgZW5jb2RlciBmcmFtZSB0eXBlIHRvICVkIiwgdHlwZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChWT19FUlJfTk9ORSAhPQorICAgICAgICAgICAgbUFwaUhhbmRsZS0+U2V0UGFyYW0oCisgICAgICAgICAgICAgICAgICAgIG1FbmNvZGVySGFuZGxlLCBWT19QSURfQU1SV0JfTU9ERSwgICZtTW9kZSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQU1SV0IgZW5jb2RlciBtb2RlIHRvICVkIiwgbU1vZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2ludCBDMlNvZnRBbXJXYkVuYzo6ZW5jb2RlSW5wdXQodWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBWT19DT0RFQ0JVRkZFUiBpbnB1dERhdGE7CisgICAgbWVtc2V0KCZpbnB1dERhdGEsIDAsIHNpemVvZihpbnB1dERhdGEpKTsKKyAgICBpbnB1dERhdGEuQnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgbUlucHV0RnJhbWU7CisgICAgaW5wdXREYXRhLkxlbmd0aCA9IGtOdW1CeXRlc1BlcklucHV0RnJhbWU7CisKKyAgICBDSEVDS19FUSgoVk9fVTMyKVZPX0VSUl9OT05FLAorICAgICAgICAgICAgIG1BcGlIYW5kbGUtPlNldElucHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJmlucHV0RGF0YSkpOworCisgICAgVk9fQVVESU9fT1VUUFVUSU5GTyBvdXRwdXRJbmZvOworICAgIG1lbXNldCgmb3V0cHV0SW5mbywgMCwgc2l6ZW9mKG91dHB1dEluZm8pKTsKKyAgICBWT19DT0RFQ0JVRkZFUiBvdXRwdXREYXRhOworICAgIG1lbXNldCgmb3V0cHV0RGF0YSwgMCwgc2l6ZW9mKG91dHB1dERhdGEpKTsKKyAgICBvdXRwdXREYXRhLkJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBvdXRwdXREYXRhLkxlbmd0aCA9IGxlbmd0aDsKKyAgICBWT19VMzIgcmV0ID0gbUFwaUhhbmRsZS0+R2V0T3V0cHV0RGF0YSgKKyAgICAgICAgICAgIG1FbmNvZGVySGFuZGxlLCAmb3V0cHV0RGF0YSwgJm91dHB1dEluZm8pOworICAgIGlmIChyZXQgIT0gVk9fRVJSX05PTkUgJiYgcmV0ICE9IFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpIHsKKyAgICAgICAgQUxPR0QoImVuY291bnRlcmVkIGVycm9yIGR1cmluZyBlbmNvZGUgY2FsbCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBvdXRwdXREYXRhLkxlbmd0aDsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yV2JFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0ga051bUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBvdXRDYXBhY2l0eSArPSBtRmlsbGVkTGVuICsgaW5TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBvdXRwdXRCbG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRDYXBhY2l0eSwgdXNhZ2UsICZvdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDY0X3Qgb3V0VGltZVN0YW1wID0KKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgc2l6ZV90IG91dFBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgICAgIGludCB2YWxpZFNhbXBsZXMgPSBtRmlsbGVkTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAoKGluUG9zICsgKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSkgPD0gaW5TaXplKSB7CisgICAgICAgICAgICBtZW1jcHkobUlucHV0RnJhbWUgKyB2YWxpZFNhbXBsZXMsIGluUHRyICsgaW5Qb3MsCisgICAgICAgICAgICAgICAgICAgKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgICAgICAgICBpblBvcyArPSAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLCAoaW5TaXplIC0gaW5Qb3MpKTsKKyAgICAgICAgICAgIG1GaWxsZWRMZW4gKz0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgICAgIGluUG9zICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobUlucHV0RnJhbWUgKyB2YWxpZFNhbXBsZXMsIDAsIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgfSBlbHNlIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludCBudW1FbmNCeXRlcyA9IGVuY29kZUlucHV0KCh3Vmlldy5kYXRhKCkgKyBvdXRQb3MpLCBvdXRDYXBhY2l0eSAtIG91dFBvcyk7CisgICAgICAgIGlmIChudW1FbmNCeXRlcyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJlbmNvZGVGcmFtZSBjYWxsIGZhaWxlZCwgc3RhdGUgWyVkICV6dSAlenVdIiwgbnVtRW5jQnl0ZXMsIG91dFBvcywgb3V0Q2FwYWNpdHkpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvdXRQb3MgKz0gbnVtRW5jQnl0ZXM7CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IGtOdW1TYW1wbGVzUGVyRnJhbWU7CisgICAgICAgIG1GaWxsZWRMZW4gPSAwOworICAgIH0KKyAgICBBTE9HVigiY2F1c2FsIHNhbXBsZSBzaXplICVkIiwgbUZpbGxlZExlbik7CisgICAgaWYgKG1Jc0ZpcnN0ICYmIG91dFBvcyAhPSAwKSB7CisgICAgICAgIG1Jc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgfQorICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgaWYgKG91dFBvcyAhPSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoc3RkOjptb3ZlKG91dHB1dEJsb2NrKSwgMCwgb3V0UG9zKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIGlmIChtRmlsbGVkTGVuKSBBTE9HVigiRGlzY2FyZGluZyB0cmFpbGluZyAlZCBieXRlcyIsIG1GaWxsZWRMZW4pOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yV2JFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgb25GbHVzaF9zbSgpOworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0QW1yV2JFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QW1yV2JFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdEFtcldiRW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtcldiRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtcldiRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBbXJXYkVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFtcldiRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzllOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQU1SX1dCX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQU1SX1dCX0VOQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgInZvQU1SV0IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBbXJXYkVuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisgICAgQzJTb2Z0QW1yV2JFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBbXJXYkVuYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAzMjA7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bUJ5dGVzUGVySW5wdXRGcmFtZSA9IGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICB2b2lkICptRW5jb2RlckhhbmRsZTsKKyAgICBWT19BVURJT19DT0RFQ0FQSSAqbUFwaUhhbmRsZTsKKyAgICBWT19NRU1fT1BFUkFUT1IgKm1NZW1PcGVyYXRvcjsKKyAgICBWT0FNUldCTU9ERSBtTW9kZTsKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIGludDMyX3QgbUZpbGxlZExlbjsKKyAgICBpbnQxNl90IG1JbnB1dEZyYW1lW2tOdW1TYW1wbGVzUGVyRnJhbWVdOworCisgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICBpbnQgZW5jb2RlSW5wdXQodWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW1yV2JFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX1dCX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmFiZjVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdjFkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFvbURlYy5jcHAiXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJhb20iXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGliYW9tLyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjYzJjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCkBAIC0wLDAgKzEsNzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBb21EZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFvbURlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hdjEuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdEFvbURlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgIGhlbHBlciwgQ09NUE9ORU5UX05BTUUsIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7ICAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8xfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zXzIsCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7CisgICAgICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPSBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgIHtDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpfSwgMHUsIDh1IC8qIGJpdERlcHRoICovLAorICAgICAgICAgICAgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiYgb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcigKKyAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4mIG1lLAorICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4mIHNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLgorICAgICAgICAvLyBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCA0MDk2dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCA0MDk2dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoCisgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4mIG1lLAorICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiYgbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1heFNpemUudi5oZWlnaHQgKyA2MykgLyA2NCkgKiAzMDcyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBnZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworfTsKKworQzJTb2Z0QW9tRGVjOjpDMlNvZnRBb21EZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpeworCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitDMlNvZnRBb21EZWM6On5DMlNvZnRBb21EZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFvbURlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBvbkZsdXNoX3NtKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGZsdXNoIGRlY29kZXIuIFRyeSB0byBoYXJkIHJlc2V0IGRlY29kZXIuIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgICh2b2lkKWluaXREZWNvZGVyKCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdEFvbURlYzo6b25SZWxlYXNlKCkgeworICAgIGRlc3Ryb3lEZWNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggYXYxIGRlY29kZXIuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgYW9tX2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB3aGlsZSAoYW9tX2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKSkgeworICAgIH0KKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIGludCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgaW50IGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gY3B1Q29yZUNvdW50OworfQorCitzdGF0dXNfdCBDMlNvZnRBb21EZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBtQ29kZWNDdHggPSBuZXcgYW9tX2NvZGVjX2N0eF90OworICAgIH0KKworICAgIGlmICghbUNvZGVjQ3R4KSB7CisgICAgICAgIEFMT0dFKCJtQ29kZWNDdHggaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGFvbV9jb2RlY19kZWNfY2ZnX3QgY2ZnOworICAgIG1lbXNldCgmY2ZnLCAwLCBzaXplb2YoYW9tX2NvZGVjX2RlY19jZmdfdCkpOworICAgIGNmZy50aHJlYWRzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisgICAgY2ZnLmFsbG93X2xvd2JpdGRlcHRoID0gMTsKKworICAgIGFvbV9jb2RlY19mbGFnc190IGZsYWdzOworICAgIG1lbXNldCgmZmxhZ3MsIDAsIHNpemVvZihhb21fY29kZWNfZmxhZ3NfdCkpOworCisgICAgYW9tX2NvZGVjX2Vycl90IGVycjsKKyAgICBpZiAoKGVyciA9IGFvbV9jb2RlY19kZWNfaW5pdChtQ29kZWNDdHgsIGFvbV9jb2RlY19hdjFfZHgoKSwgJmNmZywgMCkpKSB7CisgICAgICAgIEFMT0dFKCJhdjEgZGVjb2RlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gKCVkKSIsIGVycik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpkZXN0cm95RGVjb2RlcigpIHsKKyAgICBpZiAobUNvZGVjQ3R4KSB7CisgICAgICAgIGFvbV9jb2RlY19kZXN0cm95KG1Db2RlY0N0eCk7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDdHg7CisgICAgICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFvbURlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiYgYmxvY2spIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgIGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2ssIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXhdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCisgICAgICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKwordm9pZCBDMlNvZnRBb21EZWM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPQorICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGNvZGVjQ29uZmlnID0KKyAgICAgICAgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCk7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCk7CisgICAgaWYgKGluU2l6ZSkgeworICAgICAgICB1aW50OF90KiBiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIGludDMyX3QgZGVjb2RlVGltZSA9IDA7CisgICAgICAgIGludDMyX3QgZGVsYXkgPSAwOworCisgICAgICAgIERVTVBfVE9fRklMRShtT3V0RmlsZSwgYml0c3RyZWFtLCBpblNpemUpOworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisKKyAgICAgICAgYW9tX2NvZGVjX2Vycl90IGVyciA9CisgICAgICAgICAgICBhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgYml0c3RyZWFtLCBpblNpemUsICZmcmFtZUluZGV4KTsKKworICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU0ZCBkZWxheT0lNGRcbiIsIGRlY29kZVRpbWUsIGRlbGF5KTsKKworICAgICAgICBpZiAoZXJyICE9IEFPTV9DT0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoImF2MSBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUgZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBudWxscHRyLCAwLCBudWxscHRyKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBhdjEgZGVjb2Rlci4iKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgKHZvaWQpb3V0cHV0QnVmZmVyKHBvb2wsIHdvcmspOworCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWluU2l6ZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIHNpemVfdCBkc3RZU3RyaWRlID0gYWxpZ24od2lkdGgsIDE2KTsKKyAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBhbGlnbihkc3RZU3RyaWRlIC8gMiwgMTYpOworICAgIHVpbnQ4X3QqIGRzdFN0YXJ0ID0gZHN0OworCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMik7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OworICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7CisKKyAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7CisgICAgICAgIHNpemVfdCB4ID0gMDsKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworCisgICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOworCisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisgICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKKworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOworCisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICAgICAgdTAxID0gKnVTcmM7CisgICAgICAgICAgICB2MDEgPSAqdlNyYzsKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgc2l6ZV90IGRzdFlTaXplID0gZHN0U3RyaWRlICogaGVpZ2h0OworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFN0cmlkZSAvIDIsIDE2KTsKKyAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7CisgICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFN0cmlkZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7CisgICAgICAgICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7CisgICAgICAgICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7CisgICAgICAgIH0KKworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuOworfQorYm9vbCBDMlNvZnRBb21EZWM6Om91dHB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspCit7CisgICAgaWYgKCEod29yayAmJiBwb29sKSkgcmV0dXJuIGZhbHNlOworCisgICAgYW9tX2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICBhb21faW1hZ2VfdCogaW1nID0gYW9tX2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKTsKKworICAgIGlmICghaW1nKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaW1nLT5kX3cgIT0gbVdpZHRoIHx8IGltZy0+ZF9oICE9IG1IZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gaW1nLT5kX3c7CisgICAgICAgIG1IZWlnaHQgPSBpbWctPmRfaDsKKworICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0soaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMCB8fCBpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwMTYpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgaWYgKGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7CisKKyAgICAgICAgaWYgKGRlZmF1bHRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7CisgICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpLCBvdXQgZnJhbWVpbmRleCAlZCIsCisgICAgICAgICAgYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgIChpbnQpKihpbnQ2NF90KilpbWctPnVzZXJfcHJpdik7CisKKyAgICB1aW50OF90KiBkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IGltZy0+c3RyaWRlW0FPTV9QTEFORV9ZXTsKKyAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IGltZy0+c3RyaWRlW0FPTV9QTEFORV9VXTsKKyAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IGltZy0+c3RyaWRlW0FPTV9QTEFORV9WXTsKKworICAgIGlmIChpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1kgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKKworICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKG1XaWR0aCwgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdOworICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICBmaW5pc2hXb3JrKCooaW50NjRfdCopaW1nLT51c2VyX3ByaXYsIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOworICAgIGJsb2NrID0gbnVsbHB0cjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpkcmFpbkludGVybmFsKAorICAgIHVpbnQzMl90IGRyYWluTW9kZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggYXYxIGRlY29kZXIuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgd2hpbGUgKChvdXRwdXRCdWZmZXIocG9vbCwgd29yaykpKSB7CisgICAgfQorCisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MgJiYgd29yayAmJgorICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9PSAwdSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRBb21GYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CisgICBwdWJsaWM6CisgICAgQzJTb2Z0QW9tRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBb21EZWMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFvbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW9tRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW9tRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBb21GYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBb21GYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgyNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKyNpbmNsdWRlICJhb20vYW9tX2RlY29kZXIuaCIKKyNpbmNsdWRlICJhb20vYW9tZHguaCIKKworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFvbURlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBb21EZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW9tRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgb3ZlcnJpZGU7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBhb21fY29kZWNfY3R4X3QqIG1Db2RlY0N0eDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgICNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisgICAgY2hhciBtT3V0RmlsZVsyMDBdOworICAgICNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jayk7CisgICAgYm9vbCBvdXRwdXRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayk7CisKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBb21EZWMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggIi9kYXRhL2xvY2FsL3RtcC90ZW1wL2F2MSIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgIndlYm0iCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEggIi9kYXRhL2xvY2FsL3RtcC90ZW1wL2F2MSIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICJhdjEiCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJHRU5FUkFURV9GSUxFX05BTUVTIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsIG1UaW1lU3RhcnQudHZfc2VjLCBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl91c2VjLCBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobU91dEZpbGUsICIlc18lbGQuJWxkLiVzIiwgT1VUUFVUX0RVTVBfUEFUSCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgT1VUUFVUX0RVTVBfRVhUKTsgICAgICBcCisgICAgfQorCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUqIGZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiT3BlbmVkIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUqIGZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRHVtcCB0byBmaWxlISIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChpICE9IChpbnQpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICAgXAorICAgICAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgICAgICAgICBpZiAoZnAgIT0gTlVMTCkgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FWMV9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyMTQ0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXZjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJhdmNkZWMiXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QXZjRGVjLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvZGVjb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZW5jIl0sCisKKyAgICBzcmNzOiBbIkMyU29mdEF2Y0VuYy5jcHAiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2VuY29kZXIiLAorICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTBkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcApAQCAtMCwwICsxLDk4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBdmNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBdmNEZWMuaCIKKyNpbmNsdWRlICJpaDI2NGQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0QXZjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogUHJvcGVyIHN1cHBvcnQgZm9yIHJlb3JkZXIgZGVwdGguCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoOHUpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIGNvZGVkIGFuZCBvdXRwdXQgcGljdHVyZSBzaXplIGlzIHRoZSBzYW1lIGZvciB0aGlzIGNvZGVjCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDgwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8yKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzEsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMUIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzMsIEMyQ29uZmlnOjpMRVZFTF9BVkNfM18xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzQsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzUsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMgorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCA0MDgwdSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCA0MDgwdSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgMTUpIC8gMTYpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgMTUpIC8gMTYpICogMTkyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gdGFrZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHVuc3BlY2lmaWVkIGZpZWxkcywgYW5kIGNvZGVkIHZhbHVlcyBmb3Igc3BlY2lmaWVkIG9uZXMKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlID09IFJBTkdFX1VOU1BFQ0lGSUVEID8gZGVmLnYucmFuZ2UgOiBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllcyA9PSBQUklNQVJJRVNfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnByaW1hcmllcyA6IGNvZGVkLnYucHJpbWFyaWVzOworICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IGNvZGVkLnYudHJhbnNmZXIgPT0gVFJBTlNGRVJfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnRyYW5zZmVyIDogY29kZWQudi50cmFuc2ZlcjsKKyAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gY29kZWQudi5tYXRyaXggPT0gTUFUUklYX1VOU1BFQ0lGSUVEID8gZGVmLnYubWF0cml4IDogY29kZWQudi5tYXRyaXg7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db2xvckFzcGVjdHM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitzdGF0aWMgdm9pZCAqaXZkX2FsaWduZWRfbWFsbG9jKHZvaWQgKmN0eHQsIFdPUkQzMiBhbGlnbm1lbnQsIFdPUkQzMiBzaXplKSB7CisgICAgKHZvaWQpIGN0eHQ7CisgICAgcmV0dXJuIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGl2ZF9hbGlnbmVkX2ZyZWUodm9pZCAqY3R4dCwgdm9pZCAqbWVtKSB7CisgICAgKHZvaWQpIGN0eHQ7CisgICAgZnJlZShtZW0pOworfQorCitDMlNvZnRBdmNEZWM6OkMyU29mdEF2Y0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgbU91dEJ1ZmZlckZsdXNoKG51bGxwdHIpLAorICAgICAgbUl2Q29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgbVdpZHRoKDMyMCksCisgICAgICBtSGVpZ2h0KDI0MCksCisgICAgICBtSGVhZGVyRGVjb2RlZChmYWxzZSkgeworICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworfQorCitDMlNvZnRBdmNEZWM6On5DMlNvZnRBdmNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAoT0sgIT0gcmVzZXREZWNvZGVyKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZCkgZGVsZXRlRGVjb2RlcigpOworICAgIGlmIChtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShudWxscHRyLCBtT3V0QnVmZmVyRmx1c2gpOworICAgICAgICBtT3V0QnVmZmVyRmx1c2ggPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBtU3RyaWRlICogbUhlaWdodCAqIDMgLyAyOworICAgIG1PdXRCdWZmZXJGbHVzaCA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKG51bGxwdHIsIDEyOCwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBhbGxvY2F0ZSB0bXAgb3V0cHV0IGJ1ZmZlciAoZm9yIGZsdXNoKSBvZiBzaXplICV1ICIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworCisgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShudWxscHRyLCBtT3V0QnVmZmVyRmx1c2gpOworICAgICAgICBtT3V0QnVmZmVyRmx1c2ggPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpjcmVhdGVEZWNvZGVyKCkgeworICAgIGl2ZGV4dF9jcmVhdGVfaXBfdCBzX2NyZWF0ZV9pcDsKKyAgICBpdmRleHRfY3JlYXRlX29wX3Qgc19jcmVhdGVfb3A7CisKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jcmVhdGVfaXBfdCk7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0NSRUFURTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC51NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3JGb3JtYXQ7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucGZfYWxpZ25lZF9hbGxvYyA9IGl2ZF9hbGlnbmVkX21hbGxvYzsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2ZyZWUgPSBpdmRfYWxpZ25lZF9mcmVlOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnB2X21lbV9jdHh0ID0gbnVsbHB0cjsKKyAgICBzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jcmVhdGVfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2NyZWF0ZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbURlY0hhbmRsZSA9IChpdl9vYmpfdCopc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QucHZfaGFuZGxlOworICAgIG1EZWNIYW5kbGUtPnB2X2Z4bnMgPSAodm9pZCAqKWl2ZGVjX2FwaV9mdW5jdGlvbjsKKyAgICBtRGVjSGFuZGxlLT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXROdW1Db3JlcygpIHsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworCisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBtTnVtQ29yZXM7CisgICAgc19zZXRfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSkgeworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfc2V0X2R5bl9wYXJhbXNfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19zZXRfZHluX3BhcmFtc19vcDsKKworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3ZpZF9kZWNfbW9kZSA9IGRlY19tb2RlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9keW5fcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpnZXRWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiaXR0aWFtIGRlY29kZXIgdmVyc2lvbiBudW1iZXI6ICVzIiwKKyAgICAgICAgICAgICAgKGNoYXIgKikgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoT0sgIT0gY3JlYXRlRGVjb2RlcigpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBtTnVtQ29yZXMgPSBNSU4oZ2V0Q3B1Q29yZUNvdW50KCksIE1BWF9OVU1fQ09SRVMpOworICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAodm9pZCkgZ2V0VmVyc2lvbigpOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIEMyU29mdEF2Y0RlYzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpIHsKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICBzaXplX3QgbHVtYVNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKyAgICBzaXplX3QgY2hyb21hU2l6ZSA9IGx1bWFTaXplID4+IDI7CisKKyAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNvZGVfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisgICAgaWYgKGluQnVmZmVyKSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSB0c01hcmtlcjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGluQnVmZmVyLT5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gaW5TaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBudWxscHRyOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBsdW1hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gY2hyb21hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gY2hyb21hU2l6ZTsKKyAgICBpZiAob3V0QnVmZmVyKSB7CisgICAgICAgIGlmIChvdXRCdWZmZXItPndpZHRoKCkgPCBkaXNwbGF5U3RyaWRlIHx8IG91dEJ1ZmZlci0+aGVpZ2h0KCkgPCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGw6IHByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCV1eCV1KSIsCisgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPndpZHRoKCksIG91dEJ1ZmZlci0+aGVpZ2h0KCksIGRpc3BsYXlTdHJpZGUsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBtT3V0QnVmZmVyRmx1c2g7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemU7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemUgKyBjaHJvbWFTaXplOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDMlNvZnRBdmNEZWM6OmdldFZ1aVBhcmFtcygpIHsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3Qgc19nZXRfdnVpX3BhcmFtc19pcDsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3Qgc19nZXRfdnVpX3BhcmFtc19vcDsKKworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QpOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfc3ViX2NtZCA9CisgICAgICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKSBJSDI2NERfQ01EX0NUTF9HRVRfVlVJX1BBUkFNUzsKKyAgICBzX2dldF92dWlfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWdWlDb2xvckFzcGVjdHMgdnVpQ29sb3JBc3BlY3RzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX2NvbG91cl9wcmltYXJpZXM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV90ZnJfY2hhcnM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfbWF0cml4X2NvZWZmczsKKyAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV92aWRlb19mdWxsX3JhbmdlX2ZsYWc7CisKKyAgICAvLyBjb252ZXJ0IHZ1aSBhc3BlY3RzIHRvIEMyIHZhbHVlcyBpZiBjaGFuZ2VkCisgICAgaWYgKCEodnVpQ29sb3JBc3BlY3RzID09IG1CaXRzdHJlYW1Db2xvckFzcGVjdHMpKSB7CisgICAgICAgIG1CaXRzdHJlYW1Db2xvckFzcGVjdHMgPSB2dWlDb2xvckFzcGVjdHM7CisgICAgICAgIENvbG9yQXNwZWN0cyBzZkFzcGVjdHM7CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQgY29kZWRBc3BlY3RzID0geyAwdSB9OworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcywgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyLCB2dWlDb2xvckFzcGVjdHMuY29lZmZzLAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UsIHNmQXNwZWN0cyk7CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVByaW1hcmllcywgJmNvZGVkQXNwZWN0cy5wcmltYXJpZXMpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVJhbmdlLCAmY29kZWRBc3BlY3RzLnJhbmdlKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tTWF0cml4Q29lZmZzLCAmY29kZWRBc3BlY3RzLm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tVHJhbnNmZXIsICZjb2RlZEFzcGVjdHMudHJhbnNmZXIpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1JbnRmLT5jb25maWcoeyZjb2RlZEFzcGVjdHN9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworCisgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc19zZXRfZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnJlc2V0RGVjb2RlcigpIHsKKyAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19yZXNldF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19yZXNldF9vcDsKKworICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOworICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Jlc2V0X2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfcmVzZXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19yZXNldF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1TdHJpZGUgPSAwOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1IZWFkZXJEZWNvZGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpyZXNldFBsdWdpbigpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgeworICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfaXBfdCBzX2RlbGV0ZV9pcDsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wOworCisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9pcF90KTsKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0RFTEVURTsKKyAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX29wX3QpOworICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9vcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICAgIH0KKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1TdHJpZGUgIT0gQUxJR042NChtV2lkdGgpKSB7CisgICAgICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gbVN0cmlkZSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2sobVN0cmlkZSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1TdHJpZGUsIG1IZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogY2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/CisvLyBUT0RPOiBhbGxvdyBjb25maWd1cmF0aW9uIG9mIGNvbG9yIGZvcm1hdCBhbmQgdXNhZ2UgZm9yIGdyYXBoaWMgYnVmZmVycyBpbnN0ZWFkCisvLyAgICAgICBvZiBoYXJkIGNvZGluZyB0aGVtIHRvIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorLy8gVE9ETzogcGFzcyBjb2xvcmFzcGVjdHMgaW5mb3JtYXRpb24gdG8gc3VyZmFjZQorLy8gVE9ETzogdGVzdCBzdXBwb3J0IGZvciBkeW5hbWljIGNoYW5nZSBpbiByZXNvbHV0aW9uCisvLyBUT0RPOiB2ZXJpZnkgaWYgdGhlIGRlY29kZXIgc2VudCBiYWNrIGFsbCBmcmFtZXMKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBib29sIGhhc1BpY3R1cmUgPSBmYWxzZTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgeworICAgICAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZnNldCArIGluUG9zLCBpblNpemUgLSBpblBvcywgd29ya0luZGV4KSkgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmFsc2UgPT0gbUhlYWRlckRlY29kZWQpIHsKKyAgICAgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFdPUkQzMiBkZWxheTsKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOworICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCisgICAgICAgICAgICAgICAgICBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HRSgiYWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR1YoInJlc29sdXRpb24gY2hhbmdlZCIpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisKKyAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBuZXcgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICB9CisgICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgICAgIGlmIChtSGVhZGVyRGVjb2RlZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIG1IZWFkZXJEZWNvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR042NChzX2RlY29kZV9vcC51NF9waWNfd2QpLCBJVkRfREVDT0RFX0ZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9waWNfd2QgIT0gbVdpZHRoIHx8IHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKworICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICh2b2lkKWdldFZ1aVBhcmFtcygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKSB7CisgICAgICAgICAgICBBTE9HRCgiQnl0ZXMgY29uc3VtZWQgaXMgemVyby4gSWdub3JpbmcgcmVtYWluaW5nIGJ5dGVzIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykpIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9CisKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0QXZjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEF2Y0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEF2Y0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QXZjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyN2E5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXworCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaWgyNjRkX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfY3JlYXRlX2lwX3QgICAgICAgICAgICAgIGloMjY0ZF9jcmVhdGVfaXBfdAorI2RlZmluZSBpdmRleHRfY3JlYXRlX29wX3QgICAgICAgICAgICAgIGloMjY0ZF9jcmVhdGVfb3BfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX2lwX3QgICAgICAgICAgICAgIGloMjY0ZF9kZWxldGVfaXBfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX29wX3QgICAgICAgICAgICAgIGloMjY0ZF9kZWxldGVfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloMjY0ZF9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaWgyNjRkX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90ICBpaDI2NGRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90ICBpaDI2NGRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QKKyNkZWZpbmUgQUxJR042NCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyA2MykgPj4gNikgPDwgNikKKyNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIMjY0RF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvYXZjZF9pbnB1dCIKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgImgyNjQiCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplLCBtX29mZnNldClcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwgJiYgbV9vZmZzZXQgPT0gMCkgeyBcCisgICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgICAgICBpZiAoaSAhPSAoaW50KSBtX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAoZnAgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplLCBtX29mZnNldCkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKworY2xhc3MgQzJTb2Z0QXZjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKyAgICBDMlNvZnRBdmNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSk7CisgICAgdm9pZCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFZ1aVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzIGVudW0uIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGVudW0geworICAgICAgICBrTm90U3VwcG9ydGVkLAorICAgICAgICBrUHJlZmVyQml0c3RyZWFtLAorICAgICAgICBrUHJlZmVyQ29udGFpbmVyLAorICAgIH07CisKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRmx1c2g7CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yRm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtSGVhZGVyRGVjb2RlZDsKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEF2Y0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NTE5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApAQCAtMCwwICsxLDE1NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QXZjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgIkMyU29mdEF2Y0VuYy5oIgorI2luY2x1ZGUgImloMjY0ZS5oIgorI2luY2x1ZGUgImloMjY0ZV9lcnJvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEF2Y0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6R1JBUEhJQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDI1NjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyNTYwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUZyYW1lUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnRyYVJlZnJlc2gsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUludHJhUmVmcmVzaCwgbW9kZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0FSQklUUkFSWSB9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnRyYVJlZnJlc2gsIHBlcmlvZCkuYW55KCkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEludHJhUmVmcmVzaFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwgTEVWRUxfQVZDXzRfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFCLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ180XzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzUsCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSwgbUZyYW1lUmF0ZSwgbUJpdHJhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZzaXplLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiAmZnJhbWVSYXRlLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJmJpdHJhdGUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FOworICAgICAgICB9CisKKyAgICAgICAgc3RydWN0IExldmVsTGltaXRzIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsOworICAgICAgICAgICAgZmxvYXQgbWJzUGVyU2VjOworICAgICAgICAgICAgdWludDY0X3QgbWJzOworICAgICAgICAgICAgdWludDMyX3QgYml0cmF0ZTsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3RleHByIExldmVsTGltaXRzIGtMaW1pdHNbXSA9IHsKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzEsICAgICAxNDg1LCAgICA5OSwgICAgIDY0MDAwIH0sCisgICAgICAgICAgICAvLyBEZWNvZGVyIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSBsZXZlbCAxYi4KKyAgICAgICAgICAgIC8vIHsgTEVWRUxfQVZDXzFCLCAgICAxNDg1LCAgIDk5LCAgIDEyODAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8xLCAgIDMwMDAsICAgMzk2LCAgICAxOTIwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMiwgICA2MDAwLCAgIDM5NiwgICAgMzg0MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzMsICAxMTg4MCwgICAzOTYsICAgIDc2ODAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMiwgICAgMTE4ODAsICAgMzk2LCAgIDIwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzJfMSwgIDE5ODAwLCAgIDc5MiwgICA0MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzIsICAyMDI1MCwgIDE2MjAsICAgNDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMywgICAgNDA1MDAsICAxNjIwLCAgMTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzNfMSwgMTA4MDAwLCAgMzYwMCwgIDE0MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzIsIDIxNjAwMCwgIDUxMjAsICAyMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNCwgICAyNDU3NjAsICA4MTkyLCAgMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzRfMSwgMjQ1NzYwLCAgODE5MiwgIDUwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzIsIDUyMjI0MCwgIDg3MDQsICA1MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNSwgICA1ODk4MjQsIDIyMDgwLCAxMzUwMDAwMDAgfSwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50NjRfdCBtYnMgPSB1aW50NjRfdCgoc2l6ZS52LndpZHRoICsgMTUpIC8gMTYpICogKChzaXplLnYuaGVpZ2h0ICsgMTUpIC8gMTYpOworICAgICAgICBmbG9hdCBtYnNQZXJTZWMgPSBmbG9hdChtYnMpICogZnJhbWVSYXRlLnYudmFsdWU7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN1cHBsaWVkIGxldmVsIG1lZXRzIHRoZSBNQiAvIGJpdHJhdGUgcmVxdWlyZW1lbnRzLiBJZgorICAgICAgICAvLyBub3QsIHVwZGF0ZSB0aGUgbGV2ZWwgd2l0aCB0aGUgbG93ZXN0IGxldmVsIG1lZXRpbmcgdGhlIHJlcXVpcmVtZW50cy4KKworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIC8vIEJ5IGRlZmF1bHQgbmVlZHNVcGRhdGUgPSBmYWxzZSBpbiBjYXNlIHRoZSBzdXBwbGllZCBsZXZlbCBkb2VzIG1lZXQKKyAgICAgICAgLy8gdGhlIHJlcXVpcmVtZW50cy4gRm9yIExldmVsIDFiLCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgbGV2ZWwgYW55d2F5LAorICAgICAgICAvLyBzbyB3ZSBzZXQgaXQgdG8gdHJ1ZSBpbiB0aGF0IGNhc2UuCisgICAgICAgIGJvb2wgbmVlZHNVcGRhdGUgPSAobWUudi5sZXZlbCA9PSBMRVZFTF9BVkNfMUIpOworICAgICAgICBmb3IgKGNvbnN0IExldmVsTGltaXRzICZsaW1pdCA6IGtMaW1pdHMpIHsKKyAgICAgICAgICAgIGlmIChtYnMgPD0gbGltaXQubWJzICYmIG1ic1BlclNlYyA8PSBsaW1pdC5tYnNQZXJTZWMgJiYKKyAgICAgICAgICAgICAgICAgICAgYml0cmF0ZS52LnZhbHVlIDw9IGxpbWl0LmJpdHJhdGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsb3dlc3QgbGV2ZWwgdGhhdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLCBhbmQgaWYKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHNlZW4gdGhlIHN1cHBsaWVkIGxldmVsIHlldCwgdGhhdCBtZWFucyB3ZSBkb24ndAorICAgICAgICAgICAgICAgIC8vIG5lZWQgdGhlIHVwZGF0ZS4KKyAgICAgICAgICAgICAgICBpZiAobmVlZHNVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkdpdmVuIGxldmVsICV4IGRvZXMgbm90IGNvdmVyIGN1cnJlbnQgY29uZmlndXJhdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRqdXN0aW5nIHRvICV4IiwgbWUudi5sZXZlbCwgbGltaXQubGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IGxpbWl0LmxldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWUudi5sZXZlbCA9PSBsaW1pdC5sZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB3aGVuIHRoZSBsb3dlc3QgZmVhc2libGUgbGV2ZWwgaXMKKyAgICAgICAgICAgICAgICAvLyBmb3VuZC4gVGhlIGZhY3QgdGhhdCB3ZSdyZSBoZXJlIG1lYW5zIHRoYXQgb3VyIGxldmVsIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAvLyBtZWV0IHRoZSByZXF1aXJlbWVudCBhbmQgbmVlZHMgdG8gYmUgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgLy8gV2Ugc2V0IHRvIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBsZXZlbC4KKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfQVZDXzU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgSW50cmFSZWZyZXNoU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnBlcmlvZCA8IDEpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm1vZGUgPSBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRDsKKyAgICAgICAgICAgIG1lLnNldCgpLnBlcmlvZCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBvbmx5IHN1cHBvcnQgYXJiaXRyYXJ5IG1vZGUgKGN5Y2xpYyBpbiBvdXIgY2FzZSkKKyAgICAgICAgICAgIG1lLnNldCgpLm1vZGUgPSBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9BUkJJVFJBUlk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBJVl9QUk9GSUxFX1QgZ2V0UHJvZmlsZV9sKCkgY29uc3QgeworICAgICAgICBzd2l0Y2ggKG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORTogIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0FWQ19CQVNFTElORTogcmV0dXJuIElWX1BST0ZJTEVfQkFTRTsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0FWQ19NQUlOOiAgICAgcmV0dXJuIElWX1BST0ZJTEVfTUFJTjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgcHJvZmlsZTogJXgiLCBtUHJvZmlsZUxldmVsLT5wcm9maWxlKTsKKyAgICAgICAgICAgIHJldHVybiBJVl9QUk9GSUxFX0RFRkFVTFQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBVV09SRDMyIGdldExldmVsX2woKSBjb25zdCB7CisgICAgICAgIHN0cnVjdCBMZXZlbCB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBjMkxldmVsOworICAgICAgICAgICAgVVdPUkQzMiBhdmNMZXZlbDsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3RleHByIExldmVsIGxldmVsc1tdID0geworICAgICAgICAgICAgeyBMRVZFTF9BVkNfMSwgICAxMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMUIsICAgOSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8xLCAxMSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8yLCAxMiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8zLCAxMyB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMiwgICAyMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8xLCAyMSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8yLCAyMiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMywgICAzMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18xLCAzMSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18yLCAzMiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNCwgICA0MCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8xLCA0MSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8yLCA0MiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNSwgICA1MCB9LAorICAgICAgICB9OworICAgICAgICBmb3IgKGNvbnN0IExldmVsICZsZXZlbCA6IGxldmVscykgeworICAgICAgICAgICAgaWYgKG1Qcm9maWxlTGV2ZWwtPmxldmVsID09IGxldmVsLmMyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWwuYXZjTGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBsZXZlbDogJXgiLCBtUHJvZmlsZUxldmVsLT5sZXZlbCk7CisgICAgICAgIHJldHVybiA0MTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0U3luY0ZyYW1lUGVyaW9kX2woKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgIC8vIHVuc2FmZSBnZXR0ZXJzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gZ2V0SW50cmFSZWZyZXNoX2woKSBjb25zdCB7IHJldHVybiBtSW50cmFSZWZyZXNoOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gZ2V0UmVxdWVzdFN5bmNfbCgpIGNvbnN0IHsgcmV0dXJuIG1SZXF1ZXN0U3luYzsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IG1JbnRyYVJlZnJlc2g7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7Cit9OworCisjZGVmaW5lIGl2ZV9hcGlfZnVuY3Rpb24gIGloMjY0ZV9hcGlfZnVuY3Rpb24KKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmF2Yy5lbmNvZGVyIjsKKworbmFtZXNwYWNlIHsKKworLy8gRnJvbSBleHRlcm5hbC9saWJhdmMvZW5jb2Rlci9paDI2NGVfYml0c3RyZWFtLmgKK2NvbnN0ZXhwciB1aW50MzJfdCBNSU5fU1RSRUFNX1NJWkUgPSAweDgwMDsKKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0MyU29mdEF2Y0VuYzo6QzJTb2Z0QXZjRW5jKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgbUFWQ0VuY1Byb2ZpbGUoSVZfUFJPRklMRV9CQVNFKSwKKyAgICAgIG1BVkNFbmNMZXZlbCg0MSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAorICAgICAgbVNhd091dHB1dEVPUyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpLAorICAgICAgLy8gVE9ETzogb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgICBtT3V0QnVmZmVyU2l6ZSg1MjQyODgpIHsKKworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKKyAgICBpbml0RW5jUGFyYW1zKCk7Cit9CisKK0MyU29mdEF2Y0VuYzo6fkMyU29mdEF2Y0VuYygpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25TdG9wKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6Om9uUmVzZXQoKSB7CisgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX1JFU0VUPworICAgIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgaW5pdEVuY1BhcmFtcygpOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6b25SZWxlYXNlKCkgeworICAgIHJlbGVhc2VFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfRkxVU0g/CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkICBDMlNvZnRBdmNFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgbU51bU1lbVJlY29yZHMgPSBERUZBVUxUX01FTV9SRUNfQ05UOworICAgIG1IZWFkZXJHZW5lcmF0ZWQgPSAwOworICAgIG1OdW1Db3JlcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIG1BcmNoID0gREVGQVVMVF9BUkNIOworICAgIG1TbGljZU1vZGUgPSBERUZBVUxUX1NMSUNFX01PREU7CisgICAgbVNsaWNlUGFyYW0gPSBERUZBVUxUX1NMSUNFX1BBUkFNOworICAgIG1IYWxmUGVsRW5hYmxlID0gREVGQVVMVF9IUEVMOworICAgIG1JSW50ZXJ2YWwgPSBERUZBVUxUX0lfSU5URVJWQUw7CisgICAgbUlEUkludGVydmFsID0gREVGQVVMVF9JRFJfSU5URVJWQUw7CisgICAgbURpc2FibGVEZWJsa0xldmVsID0gREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMOworICAgIG1FbmFibGVGYXN0U2FkID0gREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQ7CisgICAgbUVuYWJsZUFsdFJlZiA9IERFRkFVTFRfRU5BQkxFX0FMVF9SRUY7CisgICAgbUVuY1NwZWVkID0gREVGQVVMVF9FTkNfU1BFRUQ7CisgICAgbUludHJhNHg0ID0gREVGQVVMVF9JTlRSQTR4NDsKKyAgICBtQ29uc3RyYWluZWRJbnRyYUZsYWcgPSBERUZBVUxUX0NPTlNUUkFJTkVEX0lOVFJBOworICAgIG1QU05SRW5hYmxlID0gREVGQVVMVF9QU05SX0VOQUJMRTsKKyAgICBtUmVjb25FbmFibGUgPSBERUZBVUxUX1JFQ09OX0VOQUJMRTsKKyAgICBtRW50cm9weU1vZGUgPSBERUZBVUxUX0VOVFJPUFlfTU9ERTsKKyAgICBtQmZyYW1lcyA9IERFRkFVTFRfQl9GUkFNRVM7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERpbWVuc2lvbnMoKSB7CisgICAgaXZlX2N0bF9zZXRfZGltZW5zaW9uc19pcF90IHNfZGltZW5zaW9uc19pcDsKKyAgICBpdmVfY3RsX3NldF9kaW1lbnNpb25zX29wX3Qgc19kaW1lbnNpb25zX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZGltZW5zaW9uc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZGltZW5zaW9uc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRElNRU5TSU9OUzsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIHNfZGltZW5zaW9uc19pcC51NF93ZCA9IG1TaXplLT53aWR0aDsKKworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kaW1lbnNpb25zX2lwX3QpOworICAgIHNfZGltZW5zaW9uc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGltZW5zaW9uc19pcCwgJnNfZGltZW5zaW9uc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIGRpbWVuc2lvbnMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGltZW5zaW9uc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldE51bUNvcmVzKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX251bV9jb3Jlc19pcDsKKyAgICBpdmVfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX251bV9jb3Jlc19vcDsKKyAgICBzX251bV9jb3Jlc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gTUlOKG1OdW1Db3JlcywgQ09ERUNfTUFYX0NPUkVTKTsKKyAgICBzX251bV9jb3Jlc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKyAgICBzX251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKworICAgIHNfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgIG1Db2RlY0N0eCwgKHZvaWQgKikgJnNfbnVtX2NvcmVzX2lwLCAodm9pZCAqKSAmc19udW1fY29yZXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9jZXNzb3IgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEZyYW1lUmF0ZSgpIHsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3Qgc19mcmFtZV9yYXRlX2lwOworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCBzX2ZyYW1lX3JhdGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19mcmFtZV9yYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19mcmFtZV9yYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVJBVEU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc3JjX2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGd0X2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3QpOworICAgIHNfZnJhbWVfcmF0ZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZnJhbWVfcmF0ZV9pcCwgJnNfZnJhbWVfcmF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIHJhdGUgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZnJhbWVfcmF0ZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldElwZVBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX2lwX3Qgc19pcGVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfb3BfdCBzX2lwZV9wYXJhbXNfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19pcGVfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19pcGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9JUEVfUEFSQU1TOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuYWJsZV9pbnRyYV80eDQgPSBtSW50cmE0eDQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuY19zcGVlZF9wcmVzZXQgPSBtRW5jU3BlZWQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2NvbnN0cmFpbmVkX2ludHJhX3ByZWQgPSBtQ29uc3RyYWluZWRJbnRyYUZsYWc7CisKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90KTsKKyAgICBzX2lwZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2lwZV9wYXJhbXNfaXAsICZzX2lwZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBpcGUgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2lwZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRCaXRSYXRlKCkgeworICAgIGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCBzX2JpdHJhdGVfaXA7CisgICAgaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90IHNfYml0cmF0ZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2JpdHJhdGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2JpdHJhdGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0JJVFJBVEU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGFyZ2V0X2JpdHJhdGUgPSBtQml0cmF0ZS0+dmFsdWU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2JpdHJhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19iaXRyYXRlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYml0cmF0ZV9pcF90KTsKKyAgICBzX2JpdHJhdGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9iaXRyYXRlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2JpdHJhdGVfaXAsICZzX2JpdHJhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBiaXQgcmF0ZSA9IDB4JXhcbiIsIHNfYml0cmF0ZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgZV9mcmFtZV90eXBlKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90IHNfZnJhbWVfdHlwZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3Qgc19mcmFtZV90eXBlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0ZSQU1FVFlQRTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC5lX2ZyYW1lX3R5cGUgPSBlX2ZyYW1lX3R5cGU7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV90eXBlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90KTsKKyAgICBzX2ZyYW1lX3R5cGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3R5cGVfaXAsICZzX2ZyYW1lX3R5cGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSB0eXBlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3R5cGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRRcCgpIHsKKyAgICBpdmVfY3RsX3NldF9xcF9pcF90IHNfcXBfaXA7CisgICAgaXZlX2N0bF9zZXRfcXBfb3BfdCBzX3FwX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfcXBfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3FwX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9RUDsKKworICAgIHNfcXBfaXAudTRfaV9xcCA9IERFRkFVTFRfSV9RUDsKKyAgICBzX3FwX2lwLnU0X2lfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9pX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF9wX3FwID0gREVGQVVMVF9QX1FQOworICAgIHNfcXBfaXAudTRfcF9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X2JfcXAgPSBERUZBVUxUX1BfUVA7CisgICAgc19xcF9pcC51NF9iX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfYl9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfcXBfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9xcF9pcF90KTsKKyAgICBzX3FwX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcXBfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcXBfaXAsICZzX3FwX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcXAgMHgleFxuIiwgc19xcF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEVuY01vZGUoSVZFX0VOQ19NT0RFX1QgZV9lbmNfbW9kZSkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90IHNfZW5jX21vZGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCBzX2VuY19tb2RlX29wOworCisgICAgc19lbmNfbW9kZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZW5jX21vZGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0VOQ19NT0RFOworCisgICAgc19lbmNfbW9kZV9pcC5lX2VuY19tb2RlID0gZV9lbmNfbW9kZTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90KTsKKyAgICBzX2VuY19tb2RlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jX21vZGVfaXAsICZzX2VuY19tb2RlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaW4gaGVhZGVyIGVuY29kZSBtb2RlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2VuY19tb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0VmJ2UGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfaXBfdCBzX3Zidl9pcDsKKyAgICBpdmVfY3RsX3NldF92YnZfcGFyYW1zX29wX3Qgc192YnZfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc192YnZfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Zidl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfVkJWX1BBUkFNUzsKKworICAgIHNfdmJ2X2lwLnU0X3Zidl9idWZfc2l6ZSA9IDA7CisgICAgc192YnZfaXAudTRfdmJ2X2J1ZmZlcl9kZWxheSA9IDEwMDA7CisKKyAgICBzX3Zidl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfdmJ2X2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfdmJ2X2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19pcF90KTsKKyAgICBzX3Zidl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfdmJ2X2lwLCAmc192YnZfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBWQlYgcGFyYW1zID0gMHgleFxuIiwgc192YnZfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRBaXJQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90IHNfYWlyX2lwOworICAgIGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCBzX2Fpcl9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2Fpcl9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfYWlyX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9BSVJfUEFSQU1TOworCisgICAgc19haXJfaXAuZV9haXJfbW9kZSA9CisgICAgICAgIChtSW50cmFSZWZyZXNoLT5tb2RlID09IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEIHx8IG1JbnRyYVJlZnJlc2gtPnBlcmlvZCA8IDEpCisgICAgICAgICAgICA/IElWRV9BSVJfTU9ERV9OT05FIDogSVZFX0FJUl9NT0RFX0NZQ0xJQzsKKyAgICBzX2Fpcl9pcC51NF9haXJfcmVmcmVzaF9wZXJpb2QgPSBtSW50cmFSZWZyZXNoLT5wZXJpb2Q7CisKKyAgICBzX2Fpcl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfYWlyX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYWlyX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90KTsKKyAgICBzX2Fpcl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfYWlyX2lwLCAmc19haXJfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBhaXIgcGFyYW1zID0gMHgleFxuIiwgc19haXJfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRNZVBhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfbWVfcGFyYW1zX2lwX3Qgc19tZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfbWVfcGFyYW1zX29wX3Qgc19tZV9wYXJhbXNfb3A7CisKKyAgICBzX21lX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfbWVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9NRV9QQVJBTVM7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfZmFzdF9zYWQgPSBtRW5hYmxlRmFzdFNhZDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfYWx0X3JlZiA9IG1FbmFibGVBbHRSZWY7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfaHBlbCA9IG1IYWxmUGVsRW5hYmxlOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9xcGVsID0gREVGQVVMVF9RUEVMOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X21lX3NwZWVkX3ByZXNldCA9IERFRkFVTFRfTUVfU1BFRUQ7CisgICAgc19tZV9wYXJhbXNfaXAudTRfc3JjaF9ybmdfeCA9IERFRkFVTFRfU1JDSF9STkdfWDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9zcmNoX3JuZ195ID0gREVGQVVMVF9TUkNIX1JOR19ZOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX21lX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X21lX3BhcmFtc19pcF90KTsKKyAgICBzX21lX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X21lX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19tZV9wYXJhbXNfaXAsICZzX21lX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IG1lIHBhcmFtcyA9IDB4JXhcbiIsIHNfbWVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0R29wUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3Qgc19nb3BfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCBzX2dvcF9wYXJhbXNfb3A7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0dPUF9QQVJBTVM7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaV9mcm1faW50ZXJ2YWwgPSBtSUludGVydmFsOworICAgIHNfZ29wX3BhcmFtc19pcC51NF9pZHJfZnJtX2ludGVydmFsID0gbUlEUkludGVydmFsOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfaXBfdCk7CisgICAgc19nb3BfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19nb3BfcGFyYW1zX2lwLCAmc19nb3BfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgR09QIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19nb3BfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0UHJvZmlsZVBhcmFtcygpIHsKKyAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90IHNfcHJvZmlsZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCBzX3Byb2ZpbGVfcGFyYW1zX29wOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1BST0ZJTEVfUEFSQU1TOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX3Byb2ZpbGUgPSBtSW50Zi0+Z2V0UHJvZmlsZV9sKCk7CisgICAgaWYgKHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9wcm9maWxlID09IElWX1BST0ZJTEVfQkFTRSkgeworICAgICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X2VudHJvcHlfY29kaW5nX21vZGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfZW50cm9weV9jb2RpbmdfbW9kZSA9IDE7CisgICAgfQorICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90KTsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCk7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19wcm9maWxlX3BhcmFtc19pcCwgJnNfcHJvZmlsZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9maWxlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERlYmxvY2tQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX2lwX3Qgc19kZWJsb2NrX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19vcF90IHNfZGVibG9ja19wYXJhbXNfb3A7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19kZWJsb2NrX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfREVCTE9DS19QQVJBTVM7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X2Rpc2FibGVfZGVibG9ja19sZXZlbCA9IG1EaXNhYmxlRGVibGtMZXZlbDsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19pcF90KTsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGVibG9ja19wYXJhbXNfaXAsICZzX2RlYmxvY2tfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBlbmFibGUvZGlzYWJsZSBkZWJsb2NrIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19kZWJsb2NrX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6bG9nVmVyc2lvbigpIHsKKyAgICBpdmVfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19jdGxfaXA7CisgICAgaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfY3RsX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgc19jdGxfaXAucHUxX3ZlcnNpb24gPSBhdTFfYnVmOworICAgIHNfY3RsX2lwLnU0X3ZlcnNpb25fYnVmc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSAmc19jdGxfaXAsICh2b2lkICopICZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgdmVyc2lvbjogMHgleCIsIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJJdHRpYW0gZW5jb2RlciB2ZXJzaW9uOiAlcyIsIChjaGFyICopc19jdGxfaXAucHUxX3ZlcnNpb24pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIFdPUkQzMiBsZXZlbDsKKworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBjMl9zdGF0dXNfdCBlcnJUeXBlID0gQzJfT0s7CisKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICAgICAgbUludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBtQVZDRW5jTGV2ZWwgPSBtSW50Zi0+Z2V0TGV2ZWxfbCgpOworICAgICAgICBtSUludGVydmFsID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZF9sKCk7CisgICAgICAgIG1JRFJJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgIH0KKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworCisgICAgbVN0cmlkZSA9IHdpZHRoOworCisgICAgLy8gVE9ETworICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQgPSBJVl9ZVVZfNDIwUDsKKworICAgIEFMT0dEKCJQYXJhbXMgd2lkdGggJWQgaGVpZ2h0ICVkIGxldmVsICVkIGNvbG9yRm9ybWF0ICVkIiwgd2lkdGgsCisgICAgICAgICAgICBoZWlnaHQsIG1BVkNFbmNMZXZlbCwgbUl2VmlkZW9Db2xvckZvcm1hdCk7CisKKyAgICAvKiBHZXR0aW5nIE51bWJlciBvZiBNZW1SZWNvcmRzICovCisgICAgeworICAgICAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfbnVtX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9udW1fbWVtX3JlY19vcF90KTsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG51bGxwdHIsICZzX251bV9tZW1fcmVjX2lwLCAmc19udW1fbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0IG51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorCisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0gc19udW1fbWVtX3JlY19vcC51NF9udW1fbWVtX3JlYzsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhcnJheSB0byBob2xkIG1lbW9yeSByZWNvcmRzICovCisgICAgaWYgKG1OdW1NZW1SZWNvcmRzID4gU0laRV9NQVggLyBzaXplb2YoaXZfbWVtX3JlY190KSkgeworICAgICAgICBBTE9HRSgicmVxdWVzdGVkIG1lbW9yeSBzaXplIGlzIHRvbyBiaWcuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIG1NZW1SZWNvcmRzID0gKGl2X21lbV9yZWNfdCAqKW1hbGxvYyhtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBpZiAobnVsbHB0ciA9PSBtTWVtUmVjb3JkcykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaG9sZCBtZW1vcnkgcmVjb3JkczogU2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IG51bGxwdHI7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSA9IDA7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50ID0gMDsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPmVfbWVtX3R5cGUgPSBJVl9OQV9NRU1fVFlQRTsKKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2V0dGluZyBNZW1SZWNvcmRzIEF0dHJpYnV0ZXMgKi8KKyAgICB7CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1fcmVjX2lwOworICAgICAgICBpdl9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX3JlY19vcDsKKworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9maWxsX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfd2QgPSB3aWR0aDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X2h0ID0gaGVpZ2h0OworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfbGV2ZWwgPSBtQVZDRW5jTGV2ZWw7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLmVfY29sb3JfZm9ybWF0ID0gREVGQVVMVF9JTlBfQ09MT1JfRk9STUFUOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfc3JjaF9ybmdfeCA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihudWxscHRyLCAmc19maWxsX21lbV9yZWNfaXAsICZzX2ZpbGxfbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiRmlsbCBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2ZpbGxfbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0aW5nIE1lbW9yeSBmb3IgTWVtIFJlY29yZHMgKi8KKyAgICB7CisgICAgICAgIFdPUkQzMiB0b3RhbF9zaXplOworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisgICAgICAgIHRvdGFsX3NpemUgPSAwOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZlX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50LCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtIHJlY29yZCBpZCAlenUgc2l6ZSAldVxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbF9zaXplICs9IHBzX21lbV9yZWMtPnU0X21lbV9zaXplOworCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb2RlYyBJbnN0YW5jZSBDcmVhdGlvbiAqLworICAgIHsKKyAgICAgICAgaXZlX2luaXRfaXBfdCBzX2luaXRfaXA7CisgICAgICAgIGl2ZV9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgICAgIG1Db2RlY0N0eCA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgICAgIG1Db2RlY0N0eC0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisgICAgICAgIG1Db2RlY0N0eC0+cHZfZnhucyA9ICh2b2lkICopaXZlX2FwaV9mdW5jdGlvbjsKKworICAgICAgICBzX2luaXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2luaXRfb3BfdCk7CisKKyAgICAgICAgc19pbml0X2lwLmVfY21kID0gSVZfQ01EX0lOSVQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3dkID0gd2lkdGg7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfaHQgPSBoZWlnaHQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKKyAgICAgICAgc19pbml0X2lwLmVfaW5wX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisKKyAgICAgICAgaWYgKG1SZWNvbkVuYWJsZSB8fCBtUFNOUkVuYWJsZSkgeworICAgICAgICAgICAgc19pbml0X2lwLnU0X2VuYWJsZV9yZWNvbiA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX2luaXRfaXAudTRfZW5hYmxlX3JlY29uID0gMDsKKyAgICAgICAgfQorICAgICAgICBzX2luaXRfaXAuZV9yZWNvbl9jb2xvcl9mbXQgPSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVDsKKyAgICAgICAgc19pbml0X2lwLmVfcmNfbW9kZSA9IERFRkFVTFRfUkNfTU9ERTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9mcmFtZXJhdGUgPSBERUZBVUxUX01BWF9GUkFNRVJBVEU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfYml0cmF0ZSA9IERFRkFVTFRfTUFYX0JJVFJBVEU7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fYmZyYW1lcyA9IG1CZnJhbWVzOworICAgICAgICBzX2luaXRfaXAuZV9jb250ZW50X3R5cGUgPSBJVl9QUk9HUkVTU0lWRTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CisgICAgICAgIHNfaW5pdF9pcC5lX3NsaWNlX21vZGUgPSBtU2xpY2VNb2RlOworICAgICAgICBzX2luaXRfaXAudTRfc2xpY2VfcGFyYW0gPSBtU2xpY2VQYXJhbTsKKyAgICAgICAgc19pbml0X2lwLmVfYXJjaCA9IG1BcmNoOworICAgICAgICBzX2luaXRfaXAuZV9zb2MgPSBERUZBVUxUX1NPQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfaW5pdF9pcCwgJnNfaW5pdF9vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5pdCBlbmNvZGVyIGZhaWxlZCA9IDB4JXhcbiIsIHNfaW5pdF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXQgQ29kZWMgVmVyc2lvbiAqLworICAgIGxvZ1ZlcnNpb24oKTsKKworICAgIC8qIHNldCBwcm9jZXNzb3IgZGV0YWlscyAqLworICAgIHNldE51bUNvcmVzKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBGcmFtZSBkaW1lbnNpb25zICovCisgICAgc2V0RGltZW5zaW9ucygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRnJhbWUgcmF0ZXMgKi8KKyAgICBzZXRGcmFtZVJhdGUoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IElQRSBQYXJhbXMgKi8KKyAgICBzZXRJcGVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEJpdHJhdGUgKi8KKyAgICBzZXRCaXRSYXRlKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBRUCAqLworICAgIHNldFFwKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBBSVIgcGFyYW1zICovCisgICAgc2V0QWlyUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBWQlYgcGFyYW1zICovCisgICAgc2V0VmJ2UGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBNb3Rpb24gZXN0aW1hdGlvbiBwYXJhbXMgKi8KKyAgICBzZXRNZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgR09QIHBhcmFtcyAqLworICAgIHNldEdvcFBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRGVibG9jayBwYXJhbXMgKi8KKyAgICBzZXREZWJsb2NrUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBQcm9maWxlIHBhcmFtcyAqLworICAgIHNldFByb2ZpbGVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IGluIEVuY29kZSBoZWFkZXIgbW9kZSAqLworICAgIHNldEVuY01vZGUoSVZFX0VOQ19NT0RFX0hFQURFUik7CisKKyAgICBBTE9HVigiaW5pdF9jb2RlYyBzdWNjZXNzZnVsbCIpOworCisgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gZmFsc2U7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnJlbGVhc2VFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1cyA9IElWX1NVQ0NFU1M7CisgICAgaXZfcmV0cmlldmVfbWVtX3JlY19pcF90IHNfcmV0cmlldmVfbWVtX2lwOworICAgIGl2X3JldHJpZXZlX21lbV9yZWNfb3BfdCBzX3JldHJpZXZlX21lbV9vcDsKKyAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzX3JldHJpZXZlX21lbV9pcC51NF9zaXplID0gc2l6ZW9mKGl2X3JldHJpZXZlX21lbV9yZWNfaXBfdCk7CisgICAgc19yZXRyaWV2ZV9tZW1fb3AudTRfc2l6ZSA9IHNpemVvZihpdl9yZXRyaWV2ZV9tZW1fcmVjX29wX3QpOworICAgIHNfcmV0cmlldmVfbWVtX2lwLmVfY21kID0gSVZfQ01EX1JFVFJJRVZFX01FTVJFQzsKKyAgICBzX3JldHJpZXZlX21lbV9pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcmV0cmlldmVfbWVtX2lwLCAmc19yZXRyaWV2ZV9tZW1fb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcmV0cmlldmUgbWVtb3J5IHJlY29yZHMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfcmV0cmlldmVfbWVtX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8qIEZyZWUgbWVtb3J5IHJlY29yZHMgKi8KKyAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzX3JldHJpZXZlX21lbV9vcC51NF9udW1fbWVtX3JlY19maWxsZWQ7IGkrKykgeworICAgICAgICBpZiAocHNfbWVtX3JlYykgaXZlX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibWVtb3J5IHJlY29yZCBpcyBudWxsLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBwc19tZW1fcmVjKys7CisgICAgfQorCisgICAgaWYgKG1NZW1SZWNvcmRzKSBmcmVlKG1NZW1SZWNvcmRzKTsKKworICAgIC8vIGNsZWFyIG90aGVyIHBvaW50ZXJzIGludG8gdGhlIHNwYWNlIGJlaW5nIGZyZWUoKWQKKyAgICBtQ29kZWNDdHggPSBudWxscHRyOworCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRFbmNvZGVBcmdzKAorICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCwKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgKmNvbnN0IGlucHV0LAorICAgICAgICB1aW50OF90ICpiYXNlLAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSB7CisgICAgaXZfcmF3X2J1Zl90ICpwc19pbnBfcmF3X2J1ZjsKKworICAgIHBzX2lucF9yYXdfYnVmID0gJnBzX2VuY29kZV9pcC0+c19pbnBfYnVmOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnB2X2J1ZiA9IGJhc2U7CisgICAgcHNfZW5jb2RlX2lwLT5zX291dF9idWYudTRfYnl0ZXMgPSAwOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnU0X2J1ZnNpemUgPSBjYXBhY2l0eTsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZlX3ZpZGVvX2VuY29kZV9pcF90KTsKKyAgICBwc19lbmNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZlX3ZpZGVvX2VuY29kZV9vcF90KTsKKworICAgIHBzX2VuY29kZV9pcC0+ZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0VOQ09ERTsKKyAgICBwc19lbmNvZGVfaXAtPnB2X2J1ZnMgPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+cHZfbWJfaW5mbyA9IG51bGxwdHI7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9waWNfaW5mbyA9IG51bGxwdHI7CisgICAgcHNfZW5jb2RlX2lwLT51NF9tYl9pbmZvX3R5cGUgPSAwOworICAgIHBzX2VuY29kZV9pcC0+dTRfcGljX2luZm9fdHlwZSA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9oaWdoID0gdGltZXN0YW1wID4+IDMyOworICAgIHBzX2VuY29kZV9pcC0+dTRfdGltZXN0YW1wX2xvdyA9IHRpbWVzdGFtcCAmIDB4RkZGRkZGRkY7CisgICAgcHNfZW5jb2RlX29wLT5zX291dF9idWYucHZfYnVmID0gbnVsbHB0cjsKKworICAgIC8qIEluaXRpYWxpemUgY29sb3IgZm9ybWF0cyAqLworICAgIG1lbXNldChwc19pbnBfcmF3X2J1ZiwgMCwgc2l6ZW9mKGl2X3Jhd19idWZfdCkpOworICAgIHBzX2lucF9yYXdfYnVmLT51NF9zaXplID0gc2l6ZW9mKGl2X3Jhd19idWZfdCk7CisgICAgcHNfaW5wX3Jhd19idWYtPmVfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKKyAgICBpZiAoaW5wdXQgPT0gbnVsbHB0cikgeworICAgICAgICBpZiAobVNhd0lucHV0RU9TKXsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+dTRfaXNfbGFzdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGlmIChpbnB1dC0+d2lkdGgoKSA8IG1TaXplLT53aWR0aCB8fAorICAgICAgICBpbnB1dC0+aGVpZ2h0KCkgPCBtU2l6ZS0+aGVpZ2h0KSB7CisgICAgICAgIC8qIEV4cGVjdCB3aWR0aCBoZWlnaHQgdG8gYmUgY29uZmlndXJlZCAqLworICAgICAgICBBTE9HVygidW5leHBlY3RlZCBDYXBhY2l0eSBBc3BlY3QgJWQoJWQpIHggJWQoJWQpIiwgaW5wdXQtPndpZHRoKCksCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgaW5wdXQtPmhlaWdodCgpLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIndpZHRoID0gJWQsIGhlaWdodCA9ICVkIiwgaW5wdXQtPndpZHRoKCksIGlucHV0LT5oZWlnaHQoKSk7CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IGlucHV0LT5sYXlvdXQoKTsKKyAgICB1aW50OF90ICp5UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QgKnVQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCAqdlBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKyAgICBpbnQzMl90IHlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgaW50MzJfdCB1U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgIGludDMyX3QgdlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvd0luYzsKKworICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgYWx3YXlzIGV2ZW4gKGFzIGJsb2NrIHNpemUgaXMgMTZ4MTYpCisgICAgQ0hFQ0tfRVEoKHdpZHRoICYgMXUpLCAwdSk7CisgICAgQ0hFQ0tfRVEoKGhlaWdodCAmIDF1KSwgMHUpOworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIEFMT0dWKCJ5UGxhbmVTaXplID0gJXp1IiwgeVBsYW5lU2l6ZSk7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB5U3RyaWRlIC8gMjsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVih5UGxhbmUsIHlTdHJpZGUsIGhlaWdodCwgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICppbnB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqaW5wdXQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgdVN0cmlkZSA9PSB2U3RyaWRlCisgICAgICAgICAgICAgICAgICAgICYmIHlTdHJpZGUgPT0gMiAqIHZTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSBhbHJlYWR5IHNldCB1cCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIE1lZGlhSW1hZ2UyIGltZyA9IENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKHdpZHRoLCBoZWlnaHQsIHlTdHJpZGUsIGhlaWdodCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICppbnB1dCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE6CisgICAgICAgICAgICBBTE9HRSgiWVVWQSBwbGFuZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgcGxhbmUgdHlwZTogJWQiLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN3aXRjaCAobUl2VmlkZW9Db2xvckZvcm1hdCkgeworICAgICAgICBjYXNlIElWX1lVVl80MjBQOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgaXMgc3VwcG9zZWQgdG8gYmUgY29uc3QgYnV0IEl0dGlhbSBBUEkgd2FudHMgYmFyZSBwb2ludGVyLgorICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzBdID0geVBsYW5lOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzFdID0gdVBsYW5lOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzJdID0gdlBsYW5lOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gaW5wdXQtPndpZHRoKCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzFdID0gaW5wdXQtPndpZHRoKCkgLyAyOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsyXSA9IGlucHV0LT53aWR0aCgpIC8gMjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IGlucHV0LT5oZWlnaHQoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMV0gPSBpbnB1dC0+aGVpZ2h0KCkgLyAyOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsyXSA9IGlucHV0LT5oZWlnaHQoKSAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMV0gPSB1U3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzJdID0gdlN0cmlkZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIySUxFOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSBwdTFfYnVmOworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IG1XaWR0aCAqIDI7CisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzBdID0gbUhlaWdodDsKKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IG1TdHJpZGUgKiAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9VVjoKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVlU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1sxXSA9IHVQbGFuZTsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IGlucHV0LT53aWR0aCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsxXSA9IGlucHV0LT53aWR0aCgpOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzBdID0gaW5wdXQtPmhlaWdodCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsxXSA9IGlucHV0LT5oZWlnaHQoKSAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMV0gPSB1U3RyaWRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CisgICAgdWludDY0X3QgdGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKG1Db2RlY0N0eCA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3aGlsZSAoIW1TYXdPdXRwdXRFT1MgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICBjMl9zdGF0dXNfdCBlcnJvcjsKKyAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3Qgc19lbmNvZGVfaXA7CisgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90IHNfZW5jb2RlX29wOworCisgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKKyAgICAgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWFkZXJMZW5ndGggPSBNSU5fU1RSRUFNX1NJWkU7CisgICAgICAgIHVpbnQ4X3QgaGVhZGVyW2tIZWFkZXJMZW5ndGhdOworICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICAgICAgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIG51bGxwdHIsIGhlYWRlciwga0hlYWRlckxlbmd0aCwgdGltZXN0YW1wKTsKKyAgICAgICAgaWYgKGVycm9yICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQ6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworCisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBoZWFkZXIgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiQnl0ZXMgR2VuZXJhdGVkIGluIGhlYWRlciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IHRydWU7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMsIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgaGVhZGVyLCBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisKKyAgICAgICAgRFVNUF9UT19GSUxFKAorICAgICAgICAgICAgICAgIG1PdXRGaWxlLCBjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworICAgIH0KKworICAgIC8vIGhhbmRsZSBkeW5hbWljIGNvbmZpZyBwYXJhbWV0ZXJzCisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IGludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBiaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IHJlcXVlc3RTeW5jID0gbUludGYtPmdldFJlcXVlc3RTeW5jX2woKTsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKworICAgICAgICBpZiAoYml0cmF0ZSAhPSBtQml0cmF0ZSkgeworICAgICAgICAgICAgbUJpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICAgICAgc2V0Qml0UmF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGludHJhUmVmcmVzaCAhPSBtSW50cmFSZWZyZXNoKSB7CisgICAgICAgICAgICBtSW50cmFSZWZyZXNoID0gaW50cmFSZWZyZXNoOworICAgICAgICAgICAgc2V0QWlyUGFyYW1zKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdFN5bmMgIT0gbVJlcXVlc3RTeW5jKSB7CisgICAgICAgICAgICAvLyB3ZSBjYW4gaGFuZGxlIElEUiBpbW1lZGlhdGVseQorICAgICAgICAgICAgaWYgKHJlcXVlc3RTeW5jLT52YWx1ZSkgeworICAgICAgICAgICAgICAgIC8vIHVuc2V0IHJlcXVlc3QKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCBjbGVhclN5bmMoMHUsIEMyX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7ICZjbGVhclN5bmMgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCJHb3Qgc3luYyByZXF1ZXN0Iik7CisgICAgICAgICAgICAgICAgc2V0RnJhbWVUeXBlKElWX0lEUl9GUkFNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVxdWVzdFN5bmMgPSByZXF1ZXN0U3luYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgbVNhd0lucHV0RU9TID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBJbiBub3JtYWwgbW9kZSwgc3RvcmUgaW5wdXRCdWZmZXJJbmZvIGFuZCB0aGlzIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgICB3aGVuIGVuY29kZXIgY29uc3VtZXMgdGhpcyBpbnB1dCAqLworICAgIC8vIGlmICghbUlucHV0RGF0YUlzTWV0YSAmJiAoaW5wdXRCdWZmZXJJbmZvICE9IE5VTEwpKSB7CisgICAgLy8gICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUl9IRUFERVJTOyBpKyspIHsKKyAgICAvLyAgICAgICAgIGlmIChOVUxMID09IG1JbnB1dEJ1ZmZlckluZm9baV0pIHsKKyAgICAvLyAgICAgICAgICAgICBtSW5wdXRCdWZmZXJJbmZvW2ldID0gaW5wdXRCdWZmZXJJbmZvOworICAgIC8vICAgICAgICAgICAgIGJyZWFrOworICAgIC8vICAgICAgICAgfQorICAgIC8vICAgICB9CisgICAgLy8gfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiB2aWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gaW5wdXRCdWZmZXI7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgaW5wdXRCdWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdOworICAgICAgICB2aWV3ID0gc3RkOjptYWtlX3NoYXJlZDxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpKTsKKyAgICAgICAgaWYgKHZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgdmlldy0+ZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisKKyAgICBkbyB7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRCdWZmZXJTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoIGxpbmVhciBibG9jayBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZXJyID0gJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICAgICAgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIHZpZXcuZ2V0KCksIHdWaWV3LmJhc2UoKSwgd1ZpZXcuY2FwYWNpdHkoKSwgdGltZXN0YW1wKTsKKyAgICAgICAgaWYgKGVycm9yICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQgOiAlZCIsIGVycm9yKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnJvcjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERVTVBfVE9fRklMRSgKKyAgICAgICAgLy8gICAgICAgICBtSW5GaWxlLCBzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF0sCisgICAgICAgIC8vICAgICAgICAgKG1IZWlnaHQgKiBtU3RyaWRlICogMyAvIDIpKTsKKworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKKyAgICAgICAgICogdG8gc3RhcnQgb2YgY3VycmVudCBkZWNvZGUoKSAqLworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisKKyAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoKHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSA9PSBJSDI2NEVfQklUU1RSRUFNX0JVRkZFUl9PVkVSRkxPVykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9HRVRCVUZJTkZPIGZvciBwcm9wZXIgbWF4IGlucHV0IHNpemU/CisgICAgICAgICAgICAgICAgbU91dEJ1ZmZlclNpemUgKj0gMjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgRnJhbWUgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSB3aGlsZSAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpOworCisgICAgLy8gSG9sZCBpbnB1dCBidWZmZXIgcmVmZXJlbmNlCisgICAgaWYgKGlucHV0QnVmZmVyKSB7CisgICAgICAgIG1CdWZmZXJzW3NfZW5jb2RlX2lwLnNfaW5wX2J1Zi5hcHZfYnVmc1swXV0gPSBpbnB1dEJ1ZmZlcjsKKyAgICB9CisKKyAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgLyogQ29tcHV0ZSB0aW1lIHRha2VuIGZvciBkZWNvZGUoKSAqLworICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgdGltZVRha2VuKTsKKworICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCB0aW1lVGFrZW4sIHRpbWVEZWxheSwKKyAgICAgICAgICAgIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisKKyAgICB2b2lkICpmcmVlZCA9IHNfZW5jb2RlX29wLnNfaW5wX2J1Zi5hcHZfYnVmc1swXTsKKyAgICAvKiBJZiBlbmNvZGVyIGZyZWVzIHVwIGFuIGlucHV0IGJ1ZmZlciwgbWFyayBpdCBhcyBmcmVlICovCisgICAgaWYgKGZyZWVkICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1CdWZmZXJzLmNvdW50KGZyZWVkKSA9PSAwdSkgeworICAgICAgICAgICAgQUxPR0QoImJ1ZmZlciBub3QgdHJhY2tlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVsZWFzZSBpbnB1dCBidWZmZXIgcmVmZXJlbmNlCisgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShmcmVlZCk7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lcmFzZShmcmVlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0KKyAgICAgICAgKCh1aW50NjRfdClzX2VuY29kZV9vcC51NF90aW1lc3RhbXBfaGlnaCA8PCAzMikgfCBzX2VuY29kZV9vcC51NF90aW1lc3RhbXBfbG93OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisKKyAgICBpZiAoc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKyAgICAgICAgaWYgKElWX0lEUl9GUkFNRSA9PSBzX2VuY29kZV9vcC51NF9lbmNvZGVkX2ZyYW1lX3R5cGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJRFIgZnJhbWUgcHJvZHVjZWQiKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMkNvbmZpZzo6U1lOQ19GUkFNRSkpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKworICAgIGlmIChzX2VuY29kZV9vcC51NF9pc19sYXN0KSB7CisgICAgICAgIC8vIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgbVNhd091dHB1dEVPUyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJj0gfk9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9GTFVTSD8KKyAgICAodm9pZClkcmFpbk1vZGU7CisgICAgKHZvaWQpcG9vbDsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKworY2xhc3MgQzJTb2Z0QXZjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEF2Y0VuY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEF2Y0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QXZjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzY2E2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaApAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVZDX0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2Mi5oIgorI2luY2x1ZGUgIml2ZTIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIENPREVDX01BWF9DT1JFUyAgICAgICAgICA0CisjZGVmaW5lIExFTl9TVEFUVVNfQlVGRkVSICAgICAgICAoMTAgICogMTAyNCkKKyNkZWZpbmUgTUFYX1ZCVl9CVUZGX1NJWkUgICAgICAgICgxMjAgKiAxNjM4NCkKKyNkZWZpbmUgTUFYX05VTV9JT19CVUZTICAgICAgICAgICAzCisKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVGX0ZSTSAgICAgICAgIDIKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVPUkRFUl9GUk0gICAgIDAKKyNkZWZpbmUgREVGQVVMVF9RUF9NSU4gICAgICAgICAgICAgIDEwCisjZGVmaW5lIERFRkFVTFRfUVBfTUFYICAgICAgICAgICAgICA0MAorI2RlZmluZSBERUZBVUxUX01BWF9CSVRSQVRFICAgICAgICAgMjAwMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YICAgIDI1NgorI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1kgICAgMjU2CisjZGVmaW5lIERFRkFVTFRfTUFYX0ZSQU1FUkFURSAgICAgICAxMjAwMDAKKyNkZWZpbmUgREVGQVVMVF9OVU1fQ09SRVMgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9OVU1fQ09SRVNfUFJFX0VOQyAgIDAKKyNkZWZpbmUgREVGQVVMVF9GUFMgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfRU5DX1NQRUVEICAgICAgICAgICBJVkVfTk9STUFMCisKKyNkZWZpbmUgREVGQVVMVF9NRU1fUkVDX0NOVCAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SRUNPTl9FTkFCTEUgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9DSEtTVU1fRU5BQkxFICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TVEFSVF9GUk0gICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9OVU1fRlJNUyAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgREVGQVVMVF9JTlBfQ09MT1JfRk9STUFUICAgICAgIElWX1lVVl80MjBTUF9WVQorI2RlZmluZSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVCAgICAgSVZfWVVWXzQyMFAKKyNkZWZpbmUgREVGQVVMVF9MT09QQkFDSyAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TUkNfRlJBTUVfUkFURSAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfVEdUX0ZSQU1FX1JBVEUgICAgICAzMAorI2RlZmluZSBERUZBVUxUX01BWF9XRCAgICAgICAgICAgICAgMTkyMAorI2RlZmluZSBERUZBVUxUX01BWF9IVCAgICAgICAgICAgICAgMTkyMAorI2RlZmluZSBERUZBVUxUX01BWF9MRVZFTCAgICAgICAgICAgNDEKKyNkZWZpbmUgREVGQVVMVF9TVFJJREUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9XRCAgICAgICAgICAgICAgICAgIDEyODAKKyNkZWZpbmUgREVGQVVMVF9IVCAgICAgICAgICAgICAgICAgIDcyMAorI2RlZmluZSBERUZBVUxUX1BTTlJfRU5BQkxFICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX01FX1NQRUVEICAgICAgICAgICAgMTAwCisjZGVmaW5lIERFRkFVTFRfRU5BQkxFX0ZBU1RfU0FEICAgICAwCisjZGVmaW5lIERFRkFVTFRfRU5BQkxFX0FMVF9SRUYgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUkNfTU9ERSAgICAgICAgICAgICBJVkVfUkNfU1RPUkFHRQorI2RlZmluZSBERUZBVUxUX0JJVFJBVEUgICAgICAgICAgICAgNjAwMDAwMAorI2RlZmluZSBERUZBVUxUX0lfUVAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgREVGQVVMVF9JX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfSV9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX1BfUVAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgREVGQVVMVF9QX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfUF9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX0JfUVAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgREVGQVVMVF9CX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfQl9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX0FJUiAgICAgICAgICAgICAgICAgSVZFX0FJUl9NT0RFX05PTkUKKyNkZWZpbmUgREVGQVVMVF9BSVJfUkVGUkVTSF9QRVJJT0QgIDMwCisjZGVmaW5lIERFRkFVTFRfU1JDSF9STkdfWCAgICAgICAgICA2NAorI2RlZmluZSBERUZBVUxUX1NSQ0hfUk5HX1kgICAgICAgICAgNDgKKyNkZWZpbmUgREVGQVVMVF9JX0lOVEVSVkFMICAgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfSURSX0lOVEVSVkFMICAgICAgICAxMDAwCisjZGVmaW5lIERFRkFVTFRfQl9GUkFNRVMgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfRElTQUJMRV9ERUJMS19MRVZFTCAwCisjZGVmaW5lIERFRkFVTFRfSFBFTCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfUVBFTCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfSTQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfRVBST0ZJTEUgICAgICAgICAgICBJVl9QUk9GSUxFX0JBU0UKKyNkZWZpbmUgREVGQVVMVF9FTlRST1BZX01PREUgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TTElDRV9NT0RFICAgICAgICAgIElWRV9TTElDRV9NT0RFX05PTkUKKyNkZWZpbmUgREVGQVVMVF9TTElDRV9QQVJBTSAgICAgICAgIDI1NgorI2RlZmluZSBERUZBVUxUX0FSQ0ggICAgICAgICAgICAgICAgQVJDSF9BUk1fQTlRCisjZGVmaW5lIERFRkFVTFRfU09DICAgICAgICAgICAgICAgICBTT0NfR0VORVJJQworI2RlZmluZSBERUZBVUxUX0lOVFJBNHg0ICAgICAgICAgICAgMAorI2RlZmluZSBTVFJMRU5HVEggICAgICAgICAgICAgICAgICAgNTAwCisjZGVmaW5lIERFRkFVTFRfQ09OU1RSQUlORURfSU5UUkEgICAwCisKKyNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikpPyAoYSkgOiAoYikKKyNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikpPyAoYSkgOiAoYikKKyNkZWZpbmUgQUxJR04xNih4KSAoKCgoeCkgKyAxNSkgPj4gNCkgPDwgNCkKKyNkZWZpbmUgQUxJR04xMjgoeCkgKCgoKHgpICsgMTI3KSA+PiA3KSA8PCA3KQorI2RlZmluZSBBTElHTjQwOTYoeCkgKCgoKHgpICsgNDA5NSkgPj4gMTIpIDw8IDEyKQorCisvKiogVXNlZCB0byByZW1vdmUgd2FybmluZ3MgYWJvdXQgdW51c2VkIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgVU5VU0VEKHgpICgodm9pZCkoeCkpCisKKy8qKiBHZXQgdGltZSAqLworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKKworLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2RlZmluZSBpdmVfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBzaXplKSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpCisjZGVmaW5lIGl2ZV9hbGlnbmVkX2ZyZWUoYnVmKSBmcmVlKGJ1ZikKKworc3RydWN0IEMyU29mdEF2Y0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBdmNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRW5jKCk7CisKK3ByaXZhdGU6CisgICAgLy8gT01YIGlucHV0IGJ1ZmZlcidzIHRpbWVzdGFtcCBhbmQgZmxhZ3MKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludDY0X3QgbVRpbWVVczsKKyAgICAgICAgaW50MzJfdCBtRmxhZ3M7CisgICAgfSBJbnB1dEJ1ZmZlckluZm87CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgaW50MzJfdCBtU3RyaWRlOworCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisgICAgY2hhciBtT3V0RmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisKKyAgICBJVl9QUk9GSUxFX1QgbUFWQ0VuY1Byb2ZpbGUgX191bnVzZWQ7CisgICAgV09SRDMyICAgbUFWQ0VuY0xldmVsOworICAgIGJvb2wgICAgIG1TdGFydGVkOworICAgIGJvb2wgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZDsKKworICAgIGJvb2wgICAgIG1TYXdJbnB1dEVPUzsKKyAgICBib29sICAgICBtU2F3T3V0cHV0RU9TOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sICAgICBtSW50cmE0eDQ7CisgICAgYm9vbCAgICAgbUVuYWJsZUZhc3RTYWQ7CisgICAgYm9vbCAgICAgbUVuYWJsZUFsdFJlZjsKKyAgICBib29sICAgICBtUmVjb25FbmFibGU7CisgICAgYm9vbCAgICAgbVBTTlJFbmFibGU7CisgICAgYm9vbCAgICAgbUVudHJvcHlNb2RlOworICAgIGJvb2wgICAgIG1Db25zdHJhaW5lZEludHJhRmxhZzsKKyAgICBJVkVfU1BFRURfQ09ORklHICAgICBtRW5jU3BlZWQ7CisKKyAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOyAgIC8vIE1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7ICAgICAgIC8vIE51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgY29kZWMKKyAgICBzaXplX3QgbU51bUNvcmVzOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcyB1c2VkIGJ5IHRoZSBjb2RlYworCisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IG1JbnRyYVJlZnJlc2g7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgdWludDMyX3QgbU91dEJ1ZmZlclNpemU7CisgICAgVVdPUkQzMiBtSGVhZGVyR2VuZXJhdGVkOworICAgIFVXT1JEMzIgbUJmcmFtZXM7CisgICAgSVZfQVJDSF9UIG1BcmNoOworICAgIElWRV9TTElDRV9NT0RFX1QgbVNsaWNlTW9kZTsKKyAgICBVV09SRDMyIG1TbGljZVBhcmFtOworICAgIGJvb2wgbUhhbGZQZWxFbmFibGU7CisgICAgVVdPUkQzMiBtSUludGVydmFsOworICAgIFVXT1JEMzIgbUlEUkludGVydmFsOworICAgIFVXT1JEMzIgbURpc2FibGVEZWJsa0xldmVsOworICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQgKiwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkICosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKworICAgIHZvaWQgaW5pdEVuY1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZUVuY29kZXIoKTsKKworICAgIGMyX3N0YXR1c190IHNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgIGVfZnJhbWVfdHlwZSk7CisgICAgYzJfc3RhdHVzX3Qgc2V0UXAoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpOworICAgIGMyX3N0YXR1c190IHNldERpbWVuc2lvbnMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIGMyX3N0YXR1c190IHNldEZyYW1lUmF0ZSgpOworICAgIGMyX3N0YXR1c190IHNldElwZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldEJpdFJhdGUoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRBaXJQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRNZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldEdvcFBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldFByb2ZpbGVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXREZWJsb2NrUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0VmJ2UGFyYW1zKCk7CisgICAgdm9pZCBsb2dWZXJzaW9uKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCAqcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICpjb25zdCBpbnB1dCwKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJhc2UsCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBdmNFbmMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL21lZGlhL2F2Y2VfaW5wdXQiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgInl1diIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAgICAiL3NkY2FyZC9tZWRpYS9hdmNlX291dHB1dCIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICAgICAiaDI2NCIKKworI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YTQ0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMjkgQEAKKy8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQorLy8gdXNlIGxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTaW1wbGVDMkNvbXBvbmVudC5jcHAiLAorICAgICAgICAiU2ltcGxlQzJJbnRlcmZhY2UuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgICAgICAibGlibG9nIiwgICAgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsIC8vIGZvciBJbWFnZUNvcHkKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgTXV0ZXhlZAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkgYXMgaXRzIHN0YWJpbGl0eSBpcyBub3QgZ3VhcmFudGVlZAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgICAgICAibGlibG9nIiwgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsIC8vIGZvciBJbWFnZUNvcHkKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgQ29sb3JVdGlscyBhbmQgTUlNRQorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIHNvZnR3YXJlIGNvZGVjIGltcGxlbWVudGF0aW9uCisvLyB0byBiZSB1c2VkIGJ5IGNvZGUgdW5kZXIgbWVkaWEvY29kZWNzLyogb25seQorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCisvLyBURU1QOiB1c2VkIGJ5IGNoZWV0czIgcHJvamVjdCAtIHJlbW92ZSB3aGVuIG5vIGxvbmdlciB1c2VkCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zaW1wbGVfY29tcG9uZW50IiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiU2ltcGxlQzJJbnRlcmZhY2UuY3BwIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZjFmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDYyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlQzJDb21wb25lbnQiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0ZDo6dW5pcXVlX3B0cjxDMldvcms+IFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OnBvcF9mcm9udCgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrID0gc3RkOjptb3ZlKG1RdWV1ZS5mcm9udCgpLndvcmspOworICAgIG1RdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICByZXR1cm4gd29yazsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpwdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaykgeworICAgIG1RdWV1ZS5wdXNoX2JhY2soeyBzdGQ6Om1vdmUod29yayksIE5PX0RSQUlOIH0pOworfQorCitib29sIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OmVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBtUXVldWUuZW1wdHkoKTsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpjbGVhcigpIHsKKyAgICBtUXVldWUuY2xlYXIoKTsKK30KKwordWludDMyX3QgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6ZHJhaW5Nb2RlKCkgY29uc3QgeworICAgIHJldHVybiBtUXVldWUuZnJvbnQoKS5kcmFpbk1vZGU7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6bWFya0RyYWluKHVpbnQzMl90IGRyYWluTW9kZSkgeworICAgIG1RdWV1ZS5wdXNoX2JhY2soeyBudWxscHRyLCBkcmFpbk1vZGUgfSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NpbXBsZUMyQ29tcG9uZW50OjpXb3JrSGFuZGxlcjo6V29ya0hhbmRsZXIoKSA6IG1SdW5uaW5nKGZhbHNlKSB7fQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrSGFuZGxlcjo6c2V0Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U2ltcGxlQzJDb21wb25lbnQ+ICZ0aGl6KSB7CisgICAgbVRoaXogPSB0aGl6OworfQorCitzdGF0aWMgdm9pZCBSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50MzJfdCAqZXJyID0gbnVsbHB0cikgeworICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlkOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SWQpKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2U7CisgICAgaWYgKGVycikgeworICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsICplcnIpOworICAgIH0KKyAgICByZXBseS0+cG9zdFJlcGx5KHJlcGx5SWQpOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2ltcGxlQzJDb21wb25lbnQ+IHRoaXogPSBtVGhpei5sb2NrKCk7CisgICAgaWYgKCF0aGl6KSB7CisgICAgICAgIEFMT0dEKCJjb21wb25lbnQgbm90IHlldCBzZXQ7IG1zZyA9ICVzIiwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJZDsKKyAgICAgICAgaWYgKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SWQpKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIEMyX0NPUlJVUFRFRCk7CisgICAgICAgICAgICByZXBseS0+cG9zdFJlcGx5KHJlcGx5SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRQcm9jZXNzOiB7CisgICAgICAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpei0+cHJvY2Vzc1F1ZXVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByb2Nlc3MsIHRoaXMpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIklnbm9yZSBwcm9jZXNzIG1lc3NhZ2UgYXMgd2UncmUgbm90IHJ1bm5pbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRJbml0OiB7CisgICAgICAgICAgICBpbnQzMl90IGVyciA9IHRoaXotPm9uSW5pdCgpOworICAgICAgICAgICAgUmVwbHkobXNnLCAmZXJyKTsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6IHsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CisgICAgICAgICAgICBpbnQzMl90IGVyciA9IHRoaXotPm9uU3RvcCgpOworICAgICAgICAgICAgUmVwbHkobXNnLCAmZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRSZXNldDogeworICAgICAgICAgICAgdGhpei0+b25SZXNldCgpOworICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIFJlcGx5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZTogeworICAgICAgICAgICAgdGhpei0+b25SZWxlYXNlKCk7CisgICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgUmVwbHkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgbXNnOiAlZCIsIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitjbGFzcyBTaW1wbGVDMkNvbXBvbmVudDo6QmxvY2tpbmdCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIEJsb2NraW5nQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGJhc2UpOiBtQmFzZXtiYXNlfSB7fQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQmFzZS0+Z2V0TG9jYWxJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQmFzZS0+Z2V0QWxsb2NhdG9ySWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4qIGJsb2NrKSB7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3RhdHVzID0gbUJhc2UtPmZldGNoTGluZWFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCBibG9jayk7CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyA9PSBDMl9CTE9DS0lORyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaENpcmN1bGFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDaXJjdWxhckJsb2NrPiogYmxvY2spIHsKKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQmFzZS0+ZmV0Y2hDaXJjdWxhckJsb2NrKGNhcGFjaXR5LCB1c2FnZSwgYmxvY2spOworICAgICAgICB9IHdoaWxlIChzdGF0dXMgPT0gQzJfQkxPQ0tJTkcpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiogYmxvY2spIHsKKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQmFzZS0+ZmV0Y2hHcmFwaGljQmxvY2sod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayk7CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyA9PSBDMl9CTE9DS0lORyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUJhc2U7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgRHVtbXlSZWFkVmlldyA6IHB1YmxpYyBDMlJlYWRWaWV3IHsKKyAgICBEdW1teVJlYWRWaWV3KCkgOiBDMlJlYWRWaWV3KEMyX05PX0lOSVQpIHt9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworU2ltcGxlQzJDb21wb25lbnQ6OlNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKQorICAgIDogbUR1bW15UmVhZFZpZXcoRHVtbXlSZWFkVmlldygpKSwKKyAgICAgIG1JbnRmKGludGYpLAorICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICBtSGFuZGxlcihuZXcgV29ya0hhbmRsZXIpIHsKKyAgICBtTG9vcGVyLT5zZXROYW1lKGludGYtPmdldE5hbWUoKS5jX3N0cigpKTsKKyAgICAodm9pZCltTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9WSURFTyk7Cit9CisKK1NpbXBsZUMyQ29tcG9uZW50Ojp+U2ltcGxlQzJDb21wb25lbnQoKSB7CisgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICh2b2lkKW1Mb29wZXItPnN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnNldExpc3RlbmVyX3ZiKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIHsKKyAgICBtSGFuZGxlci0+c2V0Q29tcG9uZW50KHNoYXJlZF9mcm9tX3RoaXMoKSk7CisKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICBpZiAoc3RhdGUtPm1TdGF0ZSA9PSBSVU5OSU5HKSB7CisgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfSBlbHNlIGlmICghbWF5QmxvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0ZS0+bUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgLy8gVE9ETzogd2FpdCBmb3IgbGlzdGVuZXIgY2hhbmdlIHRvIGhhdmUgdGFrZW4gcGxhY2UgYmVmb3JlIHJldHVybmluZworICAgIC8vIChlLmcuIGlmIHRoZXJlIGlzIGFuIG9uZ29pbmcgbGlzdGVuZXIgY2FsbGJhY2spCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6cXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAqIGNvbnN0IGl0ZW1zKSB7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIHF1ZXVlV2FzRW1wdHkgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZVdhc0VtcHR5ID0gcXVldWUtPmVtcHR5KCk7CisgICAgICAgIHdoaWxlICghaXRlbXMtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHF1ZXVlLT5wdXNoX2JhY2soc3RkOjptb3ZlKGl0ZW1zLT5mcm9udCgpKSk7CisgICAgICAgICAgICBpdGVtcy0+cG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHF1ZXVlV2FzRW1wdHkpIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRQcm9jZXNzLCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgeworICAgICh2b2lkKWl0ZW1zOworICAgIHJldHVybiBDMl9PTUlUVEVEOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6Zmx1c2hfc20oCisgICAgICAgIGZsdXNoX21vZGVfdCBmbHVzaE1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSB7CisgICAgKHZvaWQpZmx1c2hNb2RlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWUtPmluY0dlbmVyYXRpb24oKTsKKyAgICAgICAgLy8gVE9ETzogcXVldWUtPnNwbGljZWRCeShmbHVzaGVkV29yaywgZmx1c2hlZFdvcmstPmVuZCgpKTsKKyAgICAgICAgd2hpbGUgKCFxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayA9IHF1ZXVlLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICAgICAgZmx1c2hlZFdvcmstPnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIHdoaWxlICghcGVuZGluZy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgZmx1c2hlZFdvcmstPnB1c2hfYmFjayhzdGQ6Om1vdmUocGVuZGluZy0+YmVnaW4oKS0+c2Vjb25kKSk7CisgICAgICAgICAgICBwZW5kaW5nLT5lcmFzZShwZW5kaW5nLT5iZWdpbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmRyYWluX25iKGRyYWluX21vZGVfdCBkcmFpbk1vZGUpIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgcXVldWVXYXNFbXB0eSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlV2FzRW1wdHkgPSBxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgcXVldWUtPm1hcmtEcmFpbihkcmFpbk1vZGUpOworICAgIH0KKyAgICBpZiAocXVldWVXYXNFbXB0eSkgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFByb2Nlc3MsIG1IYW5kbGVyKSktPnBvc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzdGFydCgpIHsKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICBpZiAoc3RhdGUtPm1TdGF0ZSA9PSBSVU5OSU5HKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgfQorICAgIGJvb2wgbmVlZHNJbml0ID0gKHN0YXRlLT5tU3RhdGUgPT0gVU5JTklUSUFMSVpFRCk7CisgICAgc3RhdGUudW5sb2NrKCk7CisgICAgaWYgKG5lZWRzSW5pdCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0SW5pdCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgIENIRUNLKHJlcGx5LT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIChjMl9zdGF0dXNfdCllcnI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFN0YXJ0LCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorICAgIHN0YXRlLmxvY2soKTsKKyAgICBzdGF0ZS0+bVN0YXRlID0gUlVOTklORzsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzdG9wKCkgeworICAgIEFMT0dWKCJzdG9wIik7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+bVN0YXRlID0gU1RPUFBFRDsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWUtPmNsZWFyKCk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIHBlbmRpbmctPmNsZWFyKCk7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFN0b3AsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgaW50MzJfdCBlcnI7CisgICAgQ0hFQ0socmVwbHktPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIChjMl9zdGF0dXNfdCllcnI7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIEFMT0dWKCJyZXNldCIpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIHN0YXRlLT5tU3RhdGUgPSBVTklOSVRJQUxJWkVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+Y2xlYXIoKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgcGVuZGluZy0+Y2xlYXIoKTsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UmVzZXQsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6cmVsZWFzZSgpIHsKKyAgICBBTE9HVigicmVsZWFzZSIpOworICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFJlbGVhc2UsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IFNpbXBsZUMyQ29tcG9uZW50OjppbnRmKCkgeworICAgIHJldHVybiBtSW50ZjsKK30KKworbmFtZXNwYWNlIHsKKworc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB2ZWMoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHJldDsKKyAgICByZXQucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OmZpbmlzaCgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yaykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgaWYgKHBlbmRpbmctPmNvdW50KGZyYW1lSW5kZXgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGZyYW1lIGluZGV4OiAlIiBQUkl1NjQsIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmsgPSBzdGQ6Om1vdmUocGVuZGluZy0+YXQoZnJhbWVJbmRleCkpOworICAgICAgICBwZW5kaW5nLT5lcmFzZShmcmFtZUluZGV4KTsKKyAgICB9CisgICAgaWYgKHdvcmspIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gbUV4ZWNTdGF0ZS5sb2NrKCktPm1MaXN0ZW5lcjsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgICAgICBBTE9HVigicmV0dXJuaW5nIHBlbmRpbmcgd29yayIpOworICAgIH0KK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6Y2xvbmVBbmRTZW5kKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmY3VycmVudFdvcmssCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIGlmIChjdXJyZW50V29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID09IGZyYW1lSW5kZXgpIHsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSBjdXJyZW50V29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwgPSBjdXJyZW50V29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB9IGVsc2UgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgaWYgKHBlbmRpbmctPmNvdW50KGZyYW1lSW5kZXgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGZyYW1lIGluZGV4OiAlIiBQUkl1NjQsIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gcGVuZGluZy0+YXQoZnJhbWVJbmRleCktPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsID0gcGVuZGluZy0+YXQoZnJhbWVJbmRleCktPmlucHV0Lm9yZGluYWw7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICBpZiAod29yaykgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtRXhlY1N0YXRlLmxvY2soKS0+bUxpc3RlbmVyOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgIEFMT0dWKCJjbG9uZWQgYW5kIHNlbmRpbmcgd29yayIpOworICAgIH0KK30KKworYm9vbCBTaW1wbGVDMkNvbXBvbmVudDo6cHJvY2Vzc1F1ZXVlKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgdWludDY0X3QgZ2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IGRyYWluTW9kZTsKKyAgICBib29sIGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7CisgICAgYm9vbCBoYXNRdWV1ZWRXb3JrID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBnZW5lcmF0aW9uID0gcXVldWUtPmdlbmVyYXRpb24oKTsKKyAgICAgICAgZHJhaW5Nb2RlID0gcXVldWUtPmRyYWluTW9kZSgpOworICAgICAgICBpc0ZsdXNoUGVuZGluZyA9IHF1ZXVlLT5wb3BQZW5kaW5nRmx1c2goKTsKKyAgICAgICAgd29yayA9IHF1ZXVlLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgaGFzUXVldWVkV29yayA9ICFxdWV1ZS0+ZW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGlzRmx1c2hQZW5kaW5nKSB7CisgICAgICAgIEFMT0dWKCJwcm9jZXNzaW5nIHBlbmRpbmcgZmx1c2giKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gb25GbHVzaF9zbSgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiZmx1c2ggZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtT3V0cHV0QmxvY2tQb29sKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IFt0aGlzXSB7CisgICAgICAgICAgICAvLyBUT0RPOiBkb24ndCB1c2UgcXVlcnlfdmIKKyAgICAgICAgICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCBvdXRwdXRGb3JtYXQoMHUpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmKCktPnF1ZXJ5X3ZiKAorICAgICAgICAgICAgICAgICAgICB7ICZvdXRwdXRGb3JtYXQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgicXVlcnkgZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sSWQgPQorICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkdSQVBISUMKKyAgICAgICAgICAgICAgICAgICAgICAgID8gQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMKKyAgICAgICAgICAgICAgICAgICAgICAgIDogQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICAgICAgICAgIGlmIChwYXJhbXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0ICpvdXRwdXRQb29scyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQb29scyAmJiBvdXRwdXRQb29scy0+ZmxleENvdW50KCkgPj0gMSkgeworICAgICAgICAgICAgICAgICAgICBwb29sSWQgPSBvdXRwdXRQb29scy0+bS52YWx1ZXNbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGJsb2NrUG9vbDsKKyAgICAgICAgICAgIGVyciA9IEdldENvZGVjMkJsb2NrUG9vbChwb29sSWQsIHNoYXJlZF9mcm9tX3RoaXMoKSwgJmJsb2NrUG9vbCk7CisgICAgICAgICAgICBBTE9HRCgiVXNpbmcgb3V0cHV0IGJsb2NrIHBvb2wgd2l0aCBwb29sSUQgJWxsdSA9PiBnb3QgJWxsdSAtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwb29sSWQsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrUG9vbCA/IGJsb2NrUG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QmxvY2tQb29sID0gc3RkOjptYWtlX3NoYXJlZDxCbG9ja2luZ0Jsb2NrUG9vbD4oYmxvY2tQb29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0oKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkVycm9yX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF3b3JrKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGRyYWluKGRyYWluTW9kZSwgbU91dHB1dEJsb2NrUG9vbCk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25FcnJvcl9uYihzaGFyZWRfZnJvbV90aGlzKCksIGVycik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7CisgICAgfQorCisgICAgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHVwZGF0ZXM7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbTogd29yay0+aW5wdXQuY29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhwYXJhbS5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF1cGRhdGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGludGYoKS0+Y29uZmlnX3ZiKHVwZGF0ZXMsIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIEFMT0dEKCJhcHBsaWVkICV6dSBjb25maWdVcGRhdGVzID0+ICVzICglZCkiLCB1cGRhdGVzLnNpemUoKSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJzdGFydCBwcm9jZXNzaW5nIGZyYW1lICMlIiBQUkl1NjQsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAvLyBJZiBpbnB1dCBidWZmZXIgbGlzdCBpcyBub3QgZW1wdHksIGl0IG1lYW5zIHdlIGhhdmUgc29tZSBpbnB1dCB0byBwcm9jZXNzIG9uLgorICAgIC8vIEhvd2V2ZXIsIGlucHV0IGNvdWxkIGJlIGEgbnVsbCBidWZmZXIuIEluIHN1Y2ggY2FzZSwgY2xlYXIgdGhlIGJ1ZmZlciBsaXN0CisgICAgLy8gYmVmb3JlIG1ha2luZyBjYWxsIHRvIHByb2Nlc3MoKS4KKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSAmJiAhd29yay0+aW5wdXQuYnVmZmVyc1swXSkgeworICAgICAgICBBTE9HRCgiRW5jb3VudGVyZWQgbnVsbCBpbnB1dCBidWZmZXIuIENsZWFyaW5nIHRoZSBpbnB1dCBidWZmZXIiKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIH0KKyAgICBwcm9jZXNzKHdvcmssIG1PdXRwdXRCbG9ja1Bvb2wpOworICAgIEFMT0dWKCJwcm9jZXNzZWQgZnJhbWUgIyUiIFBSSXU2NCwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIGlmIChxdWV1ZS0+Z2VuZXJhdGlvbigpICE9IGdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgIEFMT0dEKCJ3b3JrIGZvcm0gb2xkIGdlbmVyYXRpb246IHdhcyAlIiBQUkl1NjQgIiBub3cgJSIgUFJJdTY0LAorICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+Z2VuZXJhdGlvbigpLCBnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIHF1ZXVlLnVubG9jaygpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxdWV1ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAod29yay0+d29ya2xldHNQcm9jZXNzZWQgIT0gMHUpIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgdGhpcyB3b3JrIik7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigicXVldWUgcGVuZGluZyB3b3JrIik7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gdW5leHBlY3RlZDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBpZiAocGVuZGluZy0+Y291bnQoZnJhbWVJbmRleCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQgPSBzdGQ6Om1vdmUocGVuZGluZy0+YXQoZnJhbWVJbmRleCkpOworICAgICAgICAgICAgICAgIHBlbmRpbmctPmVyYXNlKGZyYW1lSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpcGVuZGluZy0+aW5zZXJ0KHsgZnJhbWVJbmRleCwgc3RkOjptb3ZlKHdvcmspIH0pOworICAgICAgICB9CisgICAgICAgIGlmICh1bmV4cGVjdGVkKSB7CisgICAgICAgICAgICBBTE9HRCgidW5leHBlY3RlZCBwZW5kaW5nIHdvcmsiKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWQtPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh1bmV4cGVjdGVkKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykgeworICAgIHJldHVybiBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jay0+c2hhcmUob2Zmc2V0LCBzaXplLCA6OkMyRmVuY2UoKSkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaykgeworICAgIHJldHVybiBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLCBDMlJlY3QoYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywgY29uc3QgQzJSZWN0ICZjcm9wKSB7CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZShjcm9wLCA6OkMyRmVuY2UoKSkpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDlhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlQzJJbnRlcmZhY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vIHVzZSBNZWRpYURlZnMgaGVyZSB2cy4gTWVkaWFDb2RlY0NvbnN0YW50cyBhcyB0aGlzIGlzIG5vdCBNZWRpYUNvZGVjIHNwZWNpZmljL2RlcGVuZGVudAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIFNpbXBsZUludGVyZmFjZSAqLworCitTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6OkJhc2VQYXJhbXMoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJnJlZmxlY3RvciwKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwKKyAgICAgICAgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kLAorICAgICAgICBDMkNvbXBvbmVudDo6ZG9tYWluX3QgZG9tYWluLAorICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBhbGlhc2VzKQorICAgIDogQzJJbnRlcmZhY2VIZWxwZXIocmVmbGVjdG9yKSB7CisgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU5hbWUsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9OQU1FKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyQ29tcG9uZW50TmFtZVNldHRpbmc+KG5hbWUuY19zdHIoKSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBpZiAoYWxpYXNlcy5zaXplKCkpIHsKKyAgICAgICAgQzJTdHJpbmcgam9pbmVkOworICAgICAgICBmb3IgKGNvbnN0IEMyU3RyaW5nICZhbGlhcyA6IGFsaWFzZXMpIHsKKyAgICAgICAgICAgIGlmIChqb2luZWQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBqb2luZWQgKz0gIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgam9pbmVkICs9IGFsaWFzOworICAgICAgICB9CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWxpYXNlcywgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FMSUFTRVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc+KGpvaW5lZC5jX3N0cigpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUtpbmQsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9LSU5EKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEtpbmRTZXR0aW5nKGtpbmQpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obURvbWFpbiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0RPTUFJTikKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnREb21haW5TZXR0aW5nKGRvbWFpbikpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBzaW1wbGUgaW50ZXJmYWNlcyBoYXZlIHNpbmdsZSBzdHJlYW1zCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0U3RyZWFtQ291bnQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6OmlucHV0KDEpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dFN0cmVhbUNvdW50LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6b3V0cHV0KDEpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gc2V0IHVwIGJ1ZmZlciBmb3JtYXRzIGFuZCBhbGxvY2F0b3JzCisKKyAgICAvLyBkZWZhdWx0IHRvIGxpbmVhciBidWZmZXJzIGFuZCBubyBtZWRpYSB0eXBlCisgICAgQzJCdWZmZXJEYXRhOjp0eXBlX3QgcmF3QnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6TElORUFSOworICAgIEMyU3RyaW5nIHJhd01lZGlhVHlwZTsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCByYXdQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgIEMyQnVmZmVyRGF0YTo6dHlwZV90IGNvZGVkQnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6TElORUFSOworICAgIEMyQWxsb2NhdG9yOjppZF90IGNvZGVkQWxsb2NhdG9yID0gQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgY29kZWRQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworCisgICAgc3dpdGNoIChkb21haW4pIHsKKyAgICAgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOgorICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fVklERU86CisgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgZGVmaW5lIHJhdyBpbWFnZT8gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aW1lc3RhbXAgaGFuZGxpbmcKKyAgICAgICAgICAgIHJhd0J1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUM7CisgICAgICAgICAgICByYXdNZWRpYVR5cGUgPSBNRURJQV9NSU1FVFlQRV9WSURFT19SQVc7CisgICAgICAgICAgICByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUM7CisgICAgICAgICAgICByYXdQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU86CisgICAgICAgICAgICByYXdCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgICAgICAgICByYXdNZWRpYVR5cGUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CisgICAgICAgICAgICByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICAgICAgICAgIHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBib29sIGlzRW5jb2RlciA9IGtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKworICAgIC8vIGhhbmRsZSByYXcgZGVjb2RlcnMKKyAgICBpZiAobWVkaWFUeXBlID09IHJhd01lZGlhVHlwZSkgeworICAgICAgICBjb2RlZEJ1ZmZlclR5cGUgPSByYXdCdWZmZXJUeXBlOworICAgICAgICBjb2RlZEFsbG9jYXRvciA9IHJhd0FsbG9jYXRvcjsKKyAgICAgICAgY29kZWRQb29sSWQgPSByYXdQb29sSWQ7CisgICAgfQorCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgaXNFbmNvZGVyID8gcmF3QnVmZmVyVHlwZSA6IGNvZGVkQnVmZmVyVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBpc0VuY29kZXIgPyByYXdNZWRpYVR5cGUgOiBtZWRpYVR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgaXNFbmNvZGVyID8gY29kZWRCdWZmZXJUeXBlIDogcmF3QnVmZmVyVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBpc0VuY29kZXIgPyBtZWRpYVR5cGUgOiByYXdNZWRpYVR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgaW5wdXRBbGxvY2F0b3JzWzFdID0geyBpc0VuY29kZXIgPyByYXdBbGxvY2F0b3IgOiBjb2RlZEFsbG9jYXRvciB9OworICAgIEMyQWxsb2NhdG9yOjppZF90IG91dHB1dEFsbG9jYXRvcnNbMV0gPSB7IGlzRW5jb2RlciA/IGNvZGVkQWxsb2NhdG9yIDogcmF3QWxsb2NhdG9yIH07CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkc1sxXSA9IHsgaXNFbmNvZGVyID8gY29kZWRQb29sSWQgOiByYXdQb29sSWQgfTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEFsbG9jYXRvcnMsIEMyX1BBUkFNS0VZX0lOUFVUX0FMTE9DQVRPUlMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OkFsbG9jU2hhcmVkKGlucHV0QWxsb2NhdG9ycykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtSW5wdXRBbGxvY2F0b3JzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtSW5wdXRBbGxvY2F0b3JzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRBbGxvY2F0b3JzLCBDMl9QQVJBTUtFWV9PVVRQVVRfQUxMT0NBVE9SUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKG91dHB1dEFsbG9jYXRvcnMpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobU91dHB1dEFsbG9jYXRvcnMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRBbGxvY2F0b3JzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0UG9vbElkcywgQzJfUEFSQU1LRVlfT1VUUFVUX0JMT0NLX1BPT0xTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQob3V0cHV0UG9vbElkcykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtT3V0cHV0UG9vbElkcywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dFBvb2xJZHMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIGFkZCBzdGF0ZWxlc3MgcGFyYW1zCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN1YnNjcmliZWRQYXJhbUluZGljZXMsIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfUEFSQU1fSU5ESUNFUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgbS52YWx1ZXMpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8qIFRPRE8KKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1DdXJyZW50V29ya09yZGluYWwsIEMyX1BBUkFNS0VZX0NVUlJFTlRfV09SSykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJDdXJyZW50V29ya1R1bmluZygpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS50aW1lU3RhbXApLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS5mcmFtZUluZGV4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1DdXJyZW50V29ya09yZGluYWwsIG0uY3VzdG9tT3JkaW5hbCkuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMkN1cnJlbnRXb3JrVHVuaW5nPjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfTEFTVF9JTlBVVF9RVUVVRUQpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0KCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtTGFzdElucHV0UXVldWVkV29ya09yZGluYWwsIG0udGltZVN0YW1wKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5mcmFtZUluZGV4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIEMyX1BBUkFNS0VZX0xBU1RfT1VUUFVUX1FVRVVFRCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0KCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLnRpbWVTdGFtcCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6Om91dHB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJPdXRPZk1lbW9yeVR1bmluZz4gbU91dE9mTWVtb3J5OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6OmlucHV0PiBtSW5wdXRDb25maWdDb3VudGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRDb25maWdDb3VudGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbmZpZ0NvdW50ZXJUdW5pbmc+IG1EaXJlY3RDb25maWdDb3VudGVyOworCisgICAgKi8KK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vSW5wdXRMYXRlbmN5KCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0ZWRJbnB1dERlbGF5LCBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWV9SRVFVRVNUKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbElucHV0RGVsYXksIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9PdXRwdXRMYXRlbmN5KCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0ZWRPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9QaXBlbGluZUxhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZFBpcGVsaW5lRGVsYXksIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZygwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsUGlwZWxpbmVEZWxheSwgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZygwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1ByaXZhdGVCdWZmZXJzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcml2YXRlQWxsb2NhdG9ycywgQzJfUEFSQU1LRVlfUFJJVkFURV9BTExPQ0FUT1JTKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhQcml2YXRlQnVmZmVyQ291bnQsIEMyX1BBUkFNS0VZX01BWF9QUklWQVRFX0JVRkZFUl9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByaXZhdGVQb29sSWRzLCBDMl9QQVJBTUtFWV9QUklWQVRFX0JMT0NLX1BPT0xTKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vSW5wdXRSZWZlcmVuY2VzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFJlZmVyZW5jZUFnZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9BR0UpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRSZWZlcmVuY2VDb3VudCwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9PdXRwdXRSZWZlcmVuY2VzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhPdXRwdXRSZWZlcmVuY2VBZ2UsIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0FHRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4T3V0cHV0UmVmZXJlbmNlQ291bnQsIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9UaW1lU3RyZXRjaCgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtVGltZVN0cmV0Y2gsIEMyX1BBUkFNS0VZX1RJTUVfU1RSRVRDSCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZygxLmYpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCisvKgorICAgIENsaWVudHMgbmVlZCB0byBoYW5kbGUgdGhlIGZvbGxvd2luZyBiYXNlIHBhcmFtcyBkdWUgdG8gY3VzdG9tIGRlcGVuZGVuY3kuCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlMZXZlbFNldHRpbmc+IG1BcGlMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlGZWF0dXJlc1NldHRpbmc+IG1BcGlGZWF0dXJlczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZz4gbUF0dHJpYjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6aW5wdXQ+IG1TdWdnZXN0ZWRJbnB1dEJ1ZmZlckNvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6b3V0cHV0PiBtU3VnZ2VzdGVkT3V0cHV0QnVmZmVyQ291bnQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJUcmlwcGVkVHVuaW5nPiBtVHJpcHBlZDsKKworKi8KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzAyOWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmgKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNJTVBMRV9DMl9DT01QT05FTlRfSF8KKyNkZWZpbmUgU0lNUExFX0MyX0NPTVBPTkVOVF9IXworCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTaW1wbGVDMkNvbXBvbmVudAorICAgICAgICA6IHB1YmxpYyBDMkNvbXBvbmVudCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U2ltcGxlQzJDb21wb25lbnQ+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpOworICAgIHZpcnR1YWwgflNpbXBsZUMyQ29tcG9uZW50KCk7CisKKyAgICAvLyBDMkNvbXBvbmVudAorICAgIC8vIEZyb20gQzJDb21wb25lbnQKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHNldExpc3RlbmVyX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBmb3IgaGFuZGxlcgorICAgIGJvb2wgcHJvY2Vzc1F1ZXVlKCk7CisKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGludGVybmFsIHN0YXRlcyBvZiB0aGUgY29tcG9uZW50IGFjY29yZGluZyB0byB0aGUgY29uZmlnIHNldAorICAgICAqIGluIHRoZSBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0KCksIGJ1dCBvbmx5IGF0IHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9yCisgICAgICogYWZ0ZXIgcmVzZXQoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uSW5pdCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uU3RvcCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uUmVsZWFzZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgPSAwOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgZ2l2ZW4gd29yayBhbmQgZmluaXNoIHBlbmRpbmcgd29yayB1c2luZyBmaW5pc2goKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbixvdXRdICAgd29yayAgICB0aGUgd29yayB0byBwcm9jZXNzCisgICAgICogXHBhcmFtW2luXSAgICAgICBwb29sICAgIHRoZSBwb29sIHRvIHVzZSBmb3IgYWxsb2NhdGluZyBvdXRwdXQgYmxvY2tzLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEcmFpbiB0aGUgY29tcG9uZW50IGFuZCBmaW5pc2ggcGVuZGluZyB3b3JrIHVzaW5nIGZpbmlzaCgpLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGRyYWluTW9kZSAgIG1vZGUgb2YgZHJhaW4uCisgICAgICogXHBhcmFtW2luXSAgIHBvb2wgICAgICAgIHRoZSBwb29sIHRvIHVzZSBmb3IgYWxsb2NhdGluZyBvdXRwdXQgYmxvY2tzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIFRoZSBjb21wb25lbnQgaGFzIGRyYWluZWQgYWxsIHBlbmRpbmcgb3V0cHV0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsuCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgICAgIFVuc3VwcG9ydGVkIG1vZGUgKGUuZy4gRFJBSU5fQ0hBSU4pCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpID0gMDsKKworICAgIC8vIGZvciBkZXJpdmVkIGNsYXNzZXMKKyAgICAvKioKKyAgICAgKiBGaW5pc2ggcGVuZGluZyB3b3JrLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSB0aGUgcGVuZGluZyB3b3JrIGFjY29yZGluZyB0byB8ZnJhbWVJbmRleHwgYW5kCisgICAgICogZmVlZCB0aGUgd29yayBpbnRvIHxmaWxsV29ya3wgZnVuY3Rpb24uIHxmaWxsV29ya3wgbXVzdCBiZQorICAgICAqICJub24tYmxvY2tpbmciLiBPbmNlIHxmaWxsV29ya3wgcmV0dXJucyB0aGUgZmlsbGVkIHdvcmsgd2lsbCBiZSByZXR1cm5lZAorICAgICAqIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgZnJhbWVJbmRleCAgICB0aGUgaW5kZXggb2YgdGhlIHBlbmRpbmcgd29yaworICAgICAqIFxwYXJhbVtpbl0gICBmaWxsV29yayAgICAgIHRoZSBmdW5jdGlvbiB0byBmaWxsIHRoZSByZXRyaWV2ZWQgd29yay4KKyAgICAgKi8KKyAgICB2b2lkIGZpbmlzaCh1aW50NjRfdCBmcmFtZUluZGV4LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKTsKKworICAgIC8qKgorICAgICAqIENsb25lIHBlbmRpbmcgb3IgY3VycmVudCB3b3JrIGFuZCBzZW5kIHRoZSB3b3JrIGJhY2sgdG8gY2xpZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSBhbmQgY2xvbmUgdGhlIHBlbmRpbmcgb3IgY3VycmVudCB3b3JrIGFjY29yZGluZworICAgICAqIHRvIHxmcmFtZUluZGV4fCBhbmQgZmVlZCB0aGUgd29yayBpbnRvIHxmaWxsV29ya3wgZnVuY3Rpb24uIHxmaWxsV29ya3wKKyAgICAgKiBtdXN0IGJlICJub24tYmxvY2tpbmciLiBPbmNlIHxmaWxsV29ya3wgcmV0dXJucyB0aGUgZmlsbGVkIHdvcmsgd2lsbCBiZQorICAgICAqIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgZnJhbWVJbmRleCAgICB0aGUgaW5kZXggb2YgdGhlIHdvcmsKKyAgICAgKiBccGFyYW1baW5dICAgY3VycmVudFdvcmsgICB0aGUgY3VycmVudCB3b3JrIHVuZGVyIHByb2Nlc3NpbmcKKyAgICAgKiBccGFyYW1baW5dICAgZmlsbFdvcmsgICAgICB0aGUgZnVuY3Rpb24gdG8gZmlsbCB0aGUgcmV0cmlldmVkIHdvcmsuCisgICAgICovCisgICAgdm9pZCBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJmN1cnJlbnRXb3JrLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yayk7CisKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLAorICAgICAgICAgICAgY29uc3QgQzJSZWN0ICZjcm9wKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTk9fRFJBSU4gPSB+MHU7CisKKyAgICBDMlJlYWRWaWV3IG1EdW1teVJlYWRWaWV3OworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7CisKKyAgICBjbGFzcyBXb3JrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIGtXaGF0UHJvY2VzcywKKyAgICAgICAgICAgIGtXaGF0SW5pdCwKKyAgICAgICAgICAgIGtXaGF0U3RhcnQsCisgICAgICAgICAgICBrV2hhdFN0b3AsCisgICAgICAgICAgICBrV2hhdFJlc2V0LAorICAgICAgICAgICAga1doYXRSZWxlYXNlLAorICAgICAgICB9OworCisgICAgICAgIFdvcmtIYW5kbGVyKCk7CisgICAgICAgIH5Xb3JrSGFuZGxlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U2ltcGxlQzJDb21wb25lbnQ+ICZ0aGl6KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OndlYWtfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiBtVGhpejsKKyAgICAgICAgYm9vbCBtUnVubmluZzsKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIFVOSU5JVElBTElaRUQsCisgICAgICAgIFNUT1BQRUQsCisgICAgICAgIFJVTk5JTkcsCisgICAgfTsKKworICAgIHN0cnVjdCBFeGVjU3RhdGUgeworICAgICAgICBFeGVjU3RhdGUoKSA6IG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7fQorCisgICAgICAgIGludCBtU3RhdGU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICB9OworICAgIE11dGV4ZWQ8RXhlY1N0YXRlPiBtRXhlY1N0YXRlOworCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxXb3JrSGFuZGxlcj4gbUhhbmRsZXI7CisKKyAgICBjbGFzcyBXb3JrUXVldWUgeworICAgIHB1YmxpYzoKKyAgICAgICAgaW5saW5lIFdvcmtRdWV1ZSgpIDogbUZsdXNoKGZhbHNlKSwgbUdlbmVyYXRpb24oMHVsKSB7fQorCisgICAgICAgIGlubGluZSB1aW50NjRfdCBnZW5lcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUdlbmVyYXRpb247IH0KKyAgICAgICAgaW5saW5lIHZvaWQgaW5jR2VuZXJhdGlvbigpIHsgKyttR2VuZXJhdGlvbjsgbUZsdXNoID0gdHJ1ZTsgfQorCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHBvcF9mcm9udCgpOworICAgICAgICB2b2lkIHB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKTsKKyAgICAgICAgYm9vbCBlbXB0eSgpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUoKSBjb25zdDsKKyAgICAgICAgdm9pZCBtYXJrRHJhaW4odWludDMyX3QgZHJhaW5Nb2RlKTsKKyAgICAgICAgaW5saW5lIGJvb2wgcG9wUGVuZGluZ0ZsdXNoKCkgeworICAgICAgICAgICAgYm9vbCBmbHVzaCA9IG1GbHVzaDsKKyAgICAgICAgICAgIG1GbHVzaCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGZsdXNoOworICAgICAgICB9CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlOworICAgICAgICB9OworCisgICAgICAgIGJvb2wgbUZsdXNoOworICAgICAgICB1aW50NjRfdCBtR2VuZXJhdGlvbjsKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtUXVldWU7CisgICAgfTsKKyAgICBNdXRleGVkPFdvcmtRdWV1ZT4gbVdvcmtRdWV1ZTsKKworICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gUGVuZGluZ1dvcms7CisgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz4gbVBlbmRpbmdXb3JrOworCisgICAgY2xhc3MgQmxvY2tpbmdCbG9ja1Bvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJsb2NraW5nQmxvY2tQb29sPiBtT3V0cHV0QmxvY2tQb29sOworCisgICAgU2ltcGxlQzJDb21wb25lbnQoKSA9IGRlbGV0ZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU0lNUExFX0MyX0NPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDUxZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXworI2RlZmluZSBBTkRST0lEX1NJTVBMRV9DMl9JTlRFUkZBQ0VfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBXcmFwIGEgY29tbW9uIGludGVyZmFjZSBvYmplY3QgKHN1Y2ggYXMgQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UsIG9yIEMySW50ZXJmYWNlSGVscGVyIGludG8KKyAqIGEgQzJDb21wb25lbnRJbnRlcmZhY2UuCisgKgorICogXHBhcmFtIFQgY29tbW9uIGludGVyZmFjZSB0eXBlCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU2ltcGxlQzJJbnRlcmZhY2UgOiBwdWJsaWMgQzJDb21wb25lbnRJbnRlcmZhY2UgeworcHVibGljOgorICAgIFNpbXBsZUMySW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFQ+ICZpbXBsKQorICAgICAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgICAgIG1JZChpZCksCisgICAgICAgICAgbUltcGwoaW1wbCkgeworICAgIH0KKworICAgIH5TaW1wbGVDMkludGVyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vIEZyb20gQzJDb21wb25lbnRJbnRlcmZhY2UKKyAgICBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBjMl9ub2RlX2lkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtSWQ7IH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5KHN0YWNrUGFyYW1zLCBoZWFwUGFyYW1JbmRpY2VzLCBtYXlCbG9jaywgaGVhcFBhcmFtcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGNvbmZpZ192YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jb25maWcocGFyYW1zLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVUdW5uZWxfc20oYzJfbm9kZV9pZF90KSBvdmVycmlkZSB7IHJldHVybiBDMl9PTUlUVEVEOyB9CisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBtYXlCbG9jayk7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyU3RyaW5nIG1OYW1lOworICAgIGNvbnN0IGMyX25vZGVfaWRfdCBtSWQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFQ+IG1JbXBsOworfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzZXMgZm9yIGNvbW1vbiBpbnRlcmZhY2VzLgorICovCit0ZW1wbGF0ZTw+CitjbGFzcyBTaW1wbGVDMkludGVyZmFjZTx2b2lkPiB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQmFzZSBDb2RlYyAyLjAgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgYWxsIGNvbXBvbmVudHMuCisgICAgICovCisgICAgc3RydWN0IEJhc2VQYXJhbXMgOiBDMkludGVyZmFjZUhlbHBlciB7CisgICAgICAgIGV4cGxpY2l0IEJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyLAorICAgICAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50Ojpkb21haW5fdCBkb21haW4sCisgICAgICAgICAgICAgICAgQzJTdHJpbmcgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBhbGlhc2VzID0gc3RkOjp2ZWN0b3I8QzJTdHJpbmc+KCkpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBpbnB1dCBsYXRlbmN5LiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0IGFuZCBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQuCisgICAgICAgIHZvaWQgbm9JbnB1dExhdGVuY3koKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBoYXMgbm8gb3V0cHV0IGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6b3V0cHV0IGFuZCBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0LgorICAgICAgICB2b2lkIG5vT3V0cHV0TGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBwaXBlbGluZSBsYXRlbmN5LiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nIGFuZCBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcuCisgICAgICAgIHZvaWQgbm9QaXBlbGluZUxhdGVuY3koKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBoYXMgbm8gbmVlZCBmb3IgcHJpdmF0ZSBidWZmZXJzLiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJNYXhQcml2YXRlQnVmZmVyQ291bnRUdW5pbmcsIEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmcgYW5kCisgICAgICAgIC8vLyBDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nLgorICAgICAgICB2b2lkIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBob2xkcyBubyByZWZlcmVuY2VzIHRvIGlucHV0IGJ1ZmZlcnMuIE90aGVyd2lzZSwgY29tcG9uZW50CisgICAgICAgIC8vLyBtdXN0IGFkZCBzdXBwb3J0IGZvciBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6aW5wdXQgYW5kCisgICAgICAgIC8vLyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjppbnB1dC4KKyAgICAgICAgdm9pZCBub0lucHV0UmVmZXJlbmNlcygpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhvbGRzIG5vIHJlZmVyZW5jZXMgdG8gb3V0cHV0IGJ1ZmZlcnMuIE90aGVyd2lzZSwgY29tcG9uZW50CisgICAgICAgIC8vLyBtdXN0IGFkZCBzdXBwb3J0IGZvciBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6b3V0cHV0IGFuZAorICAgICAgICAvLy8gQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6b3V0cHV0LgorICAgICAgICB2b2lkIG5vT3V0cHV0UmVmZXJlbmNlcygpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGRvZXMgbm90IHN0cmV0Y2ggdGltZS4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmcuCisgICAgICAgIHZvaWQgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUxldmVsU2V0dGluZz4gbUFwaUxldmVsOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlGZWF0dXJlc1NldHRpbmc+IG1BcGlGZWF0dXJlczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUxldmVsU2V0dGluZz4gbVBsYXRmb3JtTGV2ZWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtRmVhdHVyZXNTZXR0aW5nPiBtUGxhdGZvcm1GZWF0dXJlczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnROYW1lU2V0dGluZz4gbU5hbWU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nPiBtQWxpYXNlczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50S2luZFNldHRpbmc+IG1LaW5kOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnREb21haW5TZXR0aW5nPiBtRG9tYWluOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZz4gbUF0dHJpYjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmc+IG1UaW1lU3RyZXRjaDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjppbnB1dD4gbVJlcXVlc3RlZElucHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdGVkT3V0cHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmc+IG1SZXF1ZXN0ZWRQaXBlbGluZURlbGF5OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQ+IG1BY3R1YWxJbnB1dERlbGF5OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dD4gbUFjdHVhbE91dHB1dERlbGF5OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nPiBtQWN0dWFsUGlwZWxpbmVEZWxheTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6OmlucHV0PiBtTWF4SW5wdXRSZWZlcmVuY2VBZ2U7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjppbnB1dD4gbU1heElucHV0UmVmZXJlbmNlQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6b3V0cHV0PiBtTWF4T3V0cHV0UmVmZXJlbmNlQWdlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6b3V0cHV0PiBtTWF4T3V0cHV0UmVmZXJlbmNlQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZz4gbU1heFByaXZhdGVCdWZmZXJDb3VudDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6OmlucHV0PiBtSW5wdXRTdHJlYW1Db3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRTdHJlYW1Db3VudDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPiBtU3Vic2NyaWJlZFBhcmFtSW5kaWNlczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dD4gbVN1Z2dlc3RlZElucHV0QnVmZmVyQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6b3V0cHV0PiBtU3VnZ2VzdGVkT3V0cHV0QnVmZmVyQ291bnQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ3VycmVudFdvcmtUdW5pbmc+IG1DdXJyZW50V29ya09yZGluYWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjppbnB1dD4gbUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0PiBtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dD4gbUlucHV0QWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dD4gbU91dHB1dEFsbG9jYXRvcnM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlByaXZhdGVBbGxvY2F0b3JzVHVuaW5nPiBtUHJpdmF0ZUFsbG9jYXRvcnM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRQb29sSWRzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQcml2YXRlQmxvY2tQb29sc1R1bmluZz4gbVByaXZhdGVQb29sSWRzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlRyaXBwZWRUdW5pbmc+IG1UcmlwcGVkOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJPdXRPZk1lbW9yeVR1bmluZz4gbU91dE9mTWVtb3J5OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjppbnB1dD4gbUlucHV0Q29uZmlnQ291bnRlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6Om91dHB1dD4gbU91dHB1dENvbmZpZ0NvdW50ZXI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbmZpZ0NvdW50ZXJUdW5pbmc+IG1EaXJlY3RDb25maWdDb3VudGVyOworICAgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordXNpbmcgU2ltcGxlSW50ZXJmYWNlID0gU2ltcGxlQzJJbnRlcmZhY2U8VD47CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLkFyZ3M+CitzdGQ6OnNoYXJlZF9wdHI8VD4gQWxsb2NTaGFyZWRTdHJpbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKHN0cikgKyAxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiByZXQgPSBUOjpBbGxvY1NoYXJlZChsZW4sIGFyZ3MuLi4pOworICAgIHN0cmNweShyZXQtPm0udmFsdWUsIHN0cik7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQXJncz4KK3N0ZDo6c2hhcmVkX3B0cjxUPiBBbGxvY1NoYXJlZFN0cmluZyhjb25zdCBBcmdzKCYuLi4gYXJncyksIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcmV0ID0gVDo6QWxsb2NTaGFyZWQoc3RyLmxlbmd0aCgpICsgMSwgYXJncy4uLik7CisgICAgc3RyY3B5KHJldC0+bS52YWx1ZSwgc3RyLmNfc3RyKCkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFNldHRlciB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgdHlwZTsKKworICAgIHN0YXRpYyBDMlIgTm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDx0eXBlPiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIHJldHVybiBtZS5GKG1lLnYudmFsdWUpLnZhbGlkYXRlUG9zc2libGUobWUudi52YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDx0eXBlPiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtZS52LmZsZXhDb3VudCgpOyArK2l4KSB7CisgICAgICAgICAgICByZXMucGx1cyhtZS5GKG1lLnYubS52YWx1ZXNbaXhdKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYubS52YWx1ZXNbaXhdKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFN0cmljdFZhbHVlV2l0aE5vRGVwcygKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBjb25zdCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZvbGQsCisgICAgICAgICAgICBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYudmFsdWUpLnN1cHBvcnRzTm93KG1lLnYudmFsdWUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IG9sZC52LnZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZS5GKG1lLnYudmFsdWUpLnZhbGlkYXRlUG9zc2libGUobWUudi52YWx1ZSk7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1NJTVBMRV9DMl9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWY2ODllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzYgQEAKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImNvZGVjMnBsYXkiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJjb2RlYzIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyY2Y1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAKQEAgLTAsMCArMSw0ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPHRocmVhZD4KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzIiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8Z3VpL0dMQ29uc3VtZXIuaD4KKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykKKyAgICAgICAgOiBDMkJ1ZmZlcih7IGJsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKSB9KSB7fQorfTsKKworY2xhc3MgTGlzdGVuZXI7CisKK2NsYXNzIFNpbXBsZVBsYXllciB7CitwdWJsaWM6CisgICAgU2ltcGxlUGxheWVyKCk7CisgICAgflNpbXBsZVBsYXllcigpOworCisgICAgdm9pZCBvbldvcmtEb25lKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpOworICAgIHZvaWQgb25UcmlwcGVkKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCk7CisgICAgdm9pZCBvbkVycm9yKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKTsKKworICAgIHZvaWQgcGxheShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgIHNwPElQcm9kdWNlckxpc3RlbmVyPiBtUHJvZHVjZXJMaXN0ZW5lcjsKKworICAgIHN0ZDo6YXRvbWljX2ludCBtTGluZWFyUG9vbElkOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NJb247CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjptdXRleCBtUHJvY2Vzc2VkTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUHJvY2Vzc2VkQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVByb2Nlc3NlZFdvcms7CisKKyAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKKyAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IG1Db21wb3NlckNsaWVudDsKKyAgICBzcDxTdXJmYWNlQ29udHJvbD4gbUNvbnRyb2w7Cit9OworCitjbGFzcyBMaXN0ZW5lciA6IHB1YmxpYyBDMkNvbXBvbmVudDo6TGlzdGVuZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IExpc3RlbmVyKFNpbXBsZVBsYXllciAqdGhpeikgOiBtVGhpcyh0aGl6KSB7fQorICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgIG1UaGlzLT5vbldvcmtEb25lKGNvbXBvbmVudCwgc3RkOjptb3ZlKHdvcmtJdGVtcykpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRoaXMtPm9uVHJpcHBlZChjb21wb25lbnQsIHNldHRpbmdSZXN1bHQpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRoaXMtPm9uRXJyb3IoY29tcG9uZW50LCBlcnJvckNvZGUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTaW1wbGVQbGF5ZXIgKiBjb25zdCBtVGhpczsKK307CisKKworU2ltcGxlUGxheWVyOjpTaW1wbGVQbGF5ZXIoKQorICAgIDogbUxpc3RlbmVyKG5ldyBMaXN0ZW5lcih0aGlzKSksCisgICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgRHVtbXlQcm9kdWNlckxpc3RlbmVyKSwKKyAgICAgIG1MaW5lYXJQb29sSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSwKKyAgICAgIG1Db21wb3NlckNsaWVudChuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50KSB7CisgICAgQ0hFQ0tfRVEobUNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZtQWxsb2NJb24pLCBDMl9PSyk7CisgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtQWxsb2NJb24sIG1MaW5lYXJQb29sSWQrKyk7CisKKyAgICBtQ29udHJvbCA9IG1Db21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKKyAgICAgICAgICAgIFN0cmluZzgoIkEgU3VyZmFjZSIpLAorICAgICAgICAgICAgMTI4MCwKKyAgICAgICAgICAgIDgwMCwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMik7CisgICAgICAgICAgICAvL1BJWEVMX0ZPUk1BVF9SR0JfNTY1KTsKKworICAgIENIRUNLKG1Db250cm9sICE9IG51bGxwdHIpOworICAgIENIRUNLKG1Db250cm9sLT5pc1ZhbGlkKCkpOworCisgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbnt9CisgICAgICAgICAgICAuc2V0TGF5ZXIobUNvbnRyb2wsIElOVF9NQVgpCisgICAgICAgICAgICAuc2hvdyhtQ29udHJvbCkKKyAgICAgICAgICAgIC5hcHBseSgpOworCisgICAgbVN1cmZhY2UgPSBtQ29udHJvbC0+Z2V0U3VyZmFjZSgpOworICAgIENIRUNLKG1TdXJmYWNlICE9IG51bGxwdHIpOworICAgIG1TdXJmYWNlLT5jb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NQVSwgbVByb2R1Y2VyTGlzdGVuZXIpOworfQorCitTaW1wbGVQbGF5ZXI6On5TaW1wbGVQbGF5ZXIoKSB7CisgICAgbUNvbXBvc2VyQ2xpZW50LT5kaXNwb3NlKCk7Cit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpvbldvcmtEb25lKAorICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSB7CisgICAgQUxPR1YoIlNpbXBsZVBsYXllcjo6b25Xb3JrRG9uZSIpOworICAgICh2b2lkKSBjb21wb25lbnQ7CisgICAgVUxvY2sgbChtUHJvY2Vzc2VkTG9jayk7CisgICAgZm9yIChhdXRvICYgaXRlbSA6IHdvcmtJdGVtcykgeworICAgICAgICBtUHJvY2Vzc2VkV29yay5wdXNoX2JhY2soc3RkOjptb3ZlKGl0ZW0pKTsKKyAgICB9CisgICAgbVByb2Nlc3NlZENvbmRpdGlvbi5ub3RpZnlfYWxsKCk7Cit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpvblRyaXBwZWQoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIHsKKyAgICAodm9pZCkgY29tcG9uZW50OworICAgICh2b2lkKSBzZXR0aW5nUmVzdWx0OworICAgIC8vIFRPRE8KK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6Om9uRXJyb3Ioc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpIHsKKyAgICAodm9pZCkgY29tcG9uZW50OworICAgICh2b2lkKSBlcnJvckNvZGU7CisgICAgLy8gVE9ETworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6cGxheShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBBTE9HVigiU2ltcGxlUGxheWVyOjpwbGF5Iik7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAodm9pZCkgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKHNvdXJjZS0+Z2V0Rm9ybWF0KCksICZmb3JtYXQpOworCisgICAgc3A8QUJ1ZmZlcj4gY3NkMCwgY3NkMTsKKyAgICBmb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0wIiwgJmNzZDApOworICAgIGZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnN0YXJ0KCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAic291cmNlIHJldHVybmVkIGVycm9yICVkICgweCUwOHgpXG4iLCBlcnIsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgKHZvaWQpc3RvcmUtPmNyZWF0ZUNvbXBvbmVudCgiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIsICZjb21wb25lbnQpOworCisgICAgKHZvaWQpY29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihtTGlzdGVuZXIsIEMyX0RPTlRfQkxPQ0spOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+IHBvb2xzID0KKyAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSh7ICh1aW50NjRfdClDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyB9KTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gcmVzdWx0OworICAgICh2b2lkKWNvbXBvbmVudC0+aW50ZigpLT5jb25maWdfdmIoe3Bvb2xzLmdldCgpfSwgQzJfRE9OVF9CTE9DSywgJnJlc3VsdCk7CisgICAgY29tcG9uZW50LT5zdGFydCgpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgfQorCisgICAgc3RkOjphdG9taWNfYm9vbCBydW5uaW5nKHRydWUpOworICAgIHN0ZDo6dGhyZWFkIHN1cmZhY2VUaHJlYWQoW3RoaXMsICZydW5uaW5nXSgpIHsKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmlnYnAgPSBtU3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgICAgICB3aGlsZSAocnVubmluZykgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVTG9jayBsKG1Qcm9jZXNzZWRMb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAobVByb2Nlc3NlZFdvcmsuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzc2VkQ29uZGl0aW9uLndhaXRfZm9yKGwsIDEwMG1zKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qcm9jZXNzZWRXb3JrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsuc3dhcChtUHJvY2Vzc2VkV29yay5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICBtUHJvY2Vzc2VkV29yay5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzbG90OworICAgICAgICAgICAgc3A8RmVuY2U+IGZlbmNlOworICAgICAgICAgICAgQUxPR1YoIlJlbmRlcjogRnJhbWUgIyVsbGQiLCB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJm91dHB1dCA9IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzWzBdOworICAgICAgICAgICAgaWYgKG91dHB1dCkgeworICAgICAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2sgPSBvdXRwdXQtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmdyYWxsb2NIYW5kbGUgPSBVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGJsb2NrLmhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIobmV3IEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBncmFsbG9jSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLmhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdClHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sud2lkdGgoKSkpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGdyYWxsb2NIYW5kbGUpOworCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gaWdicC0+YXR0YWNoQnVmZmVyKCZzbG90LCBidWZmZXIpOworCisgICAgICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBxYmkoCisgICAgICAgICAgICAgICAgICAgICAgICAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wICogMTAwMGxsKS5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVjdChibG9jay53aWR0aCgpLCBibG9jay5oZWlnaHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1csCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgRmVuY2U6Ok5PX0ZFTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgcWJvOworICAgICAgICAgICAgICAgIGVyciA9IGlnYnAtPnF1ZXVlQnVmZmVyKHNsb3QsIHFiaSwgJnFibyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicmVuZGVyIGxvb3AgZmluaXNoZWQiKTsKKyAgICB9KTsKKworICAgIGxvbmcgbnVtRnJhbWVzID0gMDsKKyAgICBtTGluZWFyUG9vbC5yZXNldChuZXcgQzJQb29sZWRCbG9ja1Bvb2wobUFsbG9jSW9uLCBtTGluZWFyUG9vbElkKyspKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAwdTsKKyAgICAgICAgdm9pZCAqZGF0YSA9IG51bGxwdHI7CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wID0gMHU7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkOworICAgICAgICBpZiAoY3NkMCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjc2QgPSBjc2QwOworICAgICAgICAgICAgY3NkMCA9IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoY3NkMSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjc2QgPSBjc2QxOworICAgICAgICAgICAgY3NkMSA9IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyID09IG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgIENIRUNLKG1ldGEuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wKSk7CisKKyAgICAgICAgICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIGRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjc2QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2l6ZSA9IGNzZC0+c2l6ZSgpOworICAgICAgICAgICAgZGF0YSA9IGNzZC0+ZGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICB3aGlsZSAoIXdvcmspIHsKKyAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCAxMDBtcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG51bUZyYW1lczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIG1MaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgJmJsb2NrKTsKKyAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlbGQgc2l6ZSA9ICV6dSIsIG51bUZyYW1lcywgc2l6ZSk7CisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBjb21wb25lbnQtPnF1ZXVlX25iKCZpdGVtcyk7CisKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgKytudW1GcmFtZXM7CisgICAgfQorICAgIEFMT0dWKCJtYWluIGxvb3AgZmluaXNoZWQiKTsKKyAgICBzb3VyY2UtPnN0b3AoKTsKKyAgICBydW5uaW5nLnN0b3JlKGZhbHNlKTsKKyAgICBzdXJmYWNlVGhyZWFkLmpvaW4oKTsKKworICAgIGNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgIHByaW50ZigiXG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3N0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKm1lKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW29wdGlvbnNdIFtpbnB1dF9maWxlbmFtZV1cbiIsIG1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtaChlbHApXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworCisgICAgaW50IHJlczsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaCIpKSA+PSAwKSB7CisgICAgICAgIHN3aXRjaCAocmVzKSB7CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGFyZ2MgLT0gb3B0aW5kOworICAgIGFyZ3YgKz0gb3B0aW5kOworCisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBTaW1wbGVQbGF5ZXIgcGxheWVyOworCisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjICYmIGVyciA9PSBPSzsgKytrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYXJndltrXTsKKworICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KKyAgICAgICAgICAgIERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKG51bGxwdHIgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGVuYW1lKTsKKworICAgICAgICBpZiAoc3RybmNhc2VjbXAoZmlsZW5hbWUsICJzaW5lOiIsIDUpICYmIGRhdGFTb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvcjxzcDxJTWVkaWFTb3VyY2U+ID4gbWVkaWFTb3VyY2VzOworICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOworCisgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUoZGF0YVNvdXJjZSk7CisKKyAgICAgICAgaWYgKGV4dHJhY3RvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjcmVhdGUgZXh0cmFjdG9yLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKKworICAgICAgICBpZiAobWV0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgaWYgKCFtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXh0cmFjdG9yIGRpZCBub3QgcHJvdmlkZSBNSU1FIHR5cGUuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbnVtVHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworCisgICAgICAgIHNpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSwgMCk7CisKKyAgICAgICAgICAgIGlmIChtZXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICBtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKworICAgICAgICAgICAgLy8gVE9ETzogYWxsb3dpbmcgQVZDIG9ubHkgZm9yIHRoZSB0aW1lIGJlaW5nCisgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby9hdmMiLCA5KSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZXRhID0gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gQVZDIHRyYWNrIGZvdW5kLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBtZWRpYVNvdXJjZSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisgICAgICAgIGlmIChtZWRpYVNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNraXAgTlVMTCB0cmFjayAlenUsIHRvdGFsIHRyYWNrcyAlenUuXG4iLCBpLCBudW1UcmFja3MpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcGxheWVyLnBsYXkobWVkaWFTb3VyY2UpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZWI1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsibGliRkxBQy1oZWFkZXJzIl0sCisKKyAgICBzcmNzOiBbIkMyU29mdEZsYWNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9mbGFjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRGbGFjRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliRkxBQyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjE0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRGbGFjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRGbGFjRGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdEZsYWNEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgNjU1MzUwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDc2ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgMjEwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjc2OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGNtRW5jb2RpbmdJbmZvLCBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6b3V0cHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgLy8gQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIGludDMyX3QgZ2V0UGNtRW5jb2RpbmdJbmZvKCkgY29uc3QgeyByZXR1cm4gbVBjbUVuY29kaW5nSW5mby0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6b3V0cHV0PiBtUGNtRW5jb2RpbmdJbmZvOworfTsKKworQzJTb2Z0RmxhY0RlYzo6QzJTb2Z0RmxhY0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRkxBQ0RlY29kZXIobnVsbHB0cikgeworfQorCitDMlNvZnRGbGFjRGVjOjp+QzJTb2Z0RmxhY0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgbUZMQUNEZWNvZGVyLT5mbHVzaCgpOworICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOworICAgIG1IYXNTdHJlYW1JbmZvID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRGbGFjRGVjOjpvblJlc2V0KCkgeworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRGbGFjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgIGlmIChtRkxBQ0RlY29kZXIpIGRlbGV0ZSBtRkxBQ0RlY29kZXI7CisgICAgbUZMQUNEZWNvZGVyID0gbnVsbHB0cjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXR1c190IEMyU29mdEZsYWNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChtRkxBQ0RlY29kZXIpIHsKKyAgICAgICAgZGVsZXRlIG1GTEFDRGVjb2RlcjsKKyAgICB9CisgICAgbUZMQUNEZWNvZGVyID0gRkxBQ0RlY29kZXI6OkNyZWF0ZSgpOworICAgIGlmICghbUZMQUNEZWNvZGVyKSB7CisgICAgICAgIEFMT0dFKCJpbml0RGVjb2RlcjogZmFpbGVkIHRvIGNyZWF0ZSBGTEFDRGVjb2RlciIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOworICAgIG1IYXNTdHJlYW1JbmZvID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKKy8vIChUT0RPKSBhZGQgbXVsdGlmcmFtZSBzdXBwb3J0LCBpbiBwbHVnaW4gYW5kIEZMQUNEZWNvZGVyLmNwcAordm9pZCBDMlNvZnRGbGFjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJiAhY29kZWNDb25maWcpIHsKKyAgICAgICAgQUxPR1YoIkZpcnN0IGZyYW1lIGhhcyB0byBpbmNsdWRlIGNvbmZpZ3VyYXRpb24sIGZvcmNpbmcgY29uZmlnIik7CisgICAgICAgIGNvZGVjQ29uZmlnID0gdHJ1ZTsKKyAgICB9CisKKyAgICB1aW50OF90ICppbnB1dCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPnBhcnNlTWV0YWRhdGEoaW5wdXQsIGluU2l6ZSk7CisgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LICYmIGRlY29kZXJFcnIgIT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJwcm9jZXNzOiBGTEFDRGVjb2RlciBwYXJzZU1ldGFEYXRhIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgQUxPR1YoInByb2Nlc3M6IHBhcnNlTWV0YWRhdGEgaXMgQmxvY2tpbmcsIENvbnRpbnVlICVkIiwgZGVjb2RlckVycik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RyZWFtSW5mbyA9IG1GTEFDRGVjb2Rlci0+Z2V0U3RyZWFtSW5mbygpOworICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlICYmIG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgJiYKKyAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby5jaGFubmVscykgeworICAgICAgICAgICAgICAgIG1IYXNTdHJlYW1JbmZvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oCisgICAgICAgICAgICAgICAgICAgIDB1LCBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygKKyAgICAgICAgICAgICAgICAgICAgMHUsIG1TdHJlYW1JbmZvLmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mb30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dEKCJwcm9jZXNzOiBkZWNvZGVyIGNvbmZpZ3VyYXRpb24gOiAlZCBIeiwgJWQgY2hhbm5lbHMsICVkIHNhbXBsZXMsIgorICAgICAgICAgICAgICAgICAgIiAlZCBibG9jayBzaXplIiwgbVN0cmVhbUluZm8uc2FtcGxlX3JhdGUsIG1TdHJlYW1JbmZvLmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgKGludCltU3RyZWFtSW5mby50b3RhbF9zYW1wbGVzLCBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYm9vbCBvdXRwdXRGbG9hdCA9IG1JbnRmLT5nZXRQY21FbmNvZGluZ0luZm8oKSA9PSBDMkNvbmZpZzo6UENNX0ZMT0FUOworICAgIGNvbnN0IHNpemVfdCBzYW1wbGVTaXplID0gb3V0cHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKHNob3J0KTsKKyAgICBzaXplX3Qgb3V0U2l6ZSA9IG1IYXNTdHJlYW1JbmZvID8KKyAgICAgICAgICAgIG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBtU3RyZWFtSW5mby5jaGFubmVscyAqIHNhbXBsZVNpemUKKyAgICAgICAgICA6IGtNYXhCbG9ja1NpemUgKiBGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzICogc2FtcGxlU2l6ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGluU2l6ZSwgd1ZpZXcuZGF0YSgpLCAmb3V0U2l6ZSwgb3V0cHV0RmxvYXQpOworICAgIGlmIChkZWNvZGVyRXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJwcm9jZXNzOiBGTEFDRGVjb2RlciBkZWNvZGVPbmVGcmFtZSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgQUxPR1YoIm91dCBidWZmZXIgYXR0ci4gc2l6ZSAlenUiLCBvdXRTaXplKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dFNpemUpKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKG1GTEFDRGVjb2RlcikgbUZMQUNEZWNvZGVyLT5mbHVzaCgpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRGbGFjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEZsYWNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0RmxhY0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RmxhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RmxhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRGbGFjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OTFiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfRkxBQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiRkxBQ0RlY29kZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0RmxhY0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRGbGFjRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga01heEJsb2NrU2l6ZSAgID0gNDA5NgorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIEZMQUNEZWNvZGVyICptRkxBQ0RlY29kZXI7CisgICAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfU3RyZWFtSW5mbyBtU3RyZWFtSW5mbzsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtSGFzU3RyZWFtSW5mbzsKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0RmxhY0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9GTEFDX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlMjU0MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEZsYWNFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRGbGFjRW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0RmxhY0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDY1NTM1MCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgMil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDc2ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgMjEwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgNDYwOCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGNtRW5jb2RpbmdJbmZvLCBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpQQ01fMTYpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBjbUVuY29kaW5nSW5mbywgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fMTYsCisgICAgICAgICAgICAgICAgICAgICAvLyBDMkNvbmZpZzo6UENNXzgsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNX0ZMT0FUfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1QY21FbmNvZGluZ0luZm8pPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIGludDMyX3QgZ2V0UGNtRW5jb2RpbmdJbmZvKCkgY29uc3QgeyByZXR1cm4gbVBjbUVuY29kaW5nSW5mby0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjppbnB1dD4gbVBjbUVuY29kaW5nSW5mbzsKK307Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZmxhYy5lbmNvZGVyIjsKKworQzJTb2Z0RmxhY0VuYzo6QzJTb2Z0RmxhY0VuYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRmxhY1N0cmVhbUVuY29kZXIobnVsbHB0ciksCisgICAgICBtSW5wdXRCdWZmZXJQY20zMihudWxscHRyKSB7Cit9CisKK0MyU29mdEZsYWNFbmM6On5DMlNvZnRGbGFjRW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpvbkluaXQoKSB7CisgICAgbUZsYWNTdHJlYW1FbmNvZGVyID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfbmV3KCk7CisgICAgaWYgKCFtRmxhY1N0cmVhbUVuY29kZXIpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICBtSW5wdXRCdWZmZXJQY20zMiA9IChGTEFDX19pbnQzMiopIG1hbGxvYygKKyAgICAgICAgICAgIGtJbkJsb2NrU2l6ZSAqIGtNYXhOdW1DaGFubmVscyAqIHNpemVvZihGTEFDX19pbnQzMikpOworICAgIGlmICghbUlucHV0QnVmZmVyUGNtMzIpIHJldHVybiBDMl9OT19NRU1PUlk7CisKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUNvbXByZXNzaW9uTGV2ZWwgPSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX0RFRkFVTFQ7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IGZhbHNlOworICAgIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID0gMDsKKyAgICBtSGVhZGVyT2Zmc2V0ID0gMDsKKyAgICBtV3JvdGVIZWFkZXIgPSBmYWxzZTsKKworICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0VuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRmxhY1N0cmVhbUVuY29kZXIpIHsKKyAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZGVsZXRlKG1GbGFjU3RyZWFtRW5jb2Rlcik7CisgICAgICAgIG1GbGFjU3RyZWFtRW5jb2RlciA9IG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKG1JbnB1dEJ1ZmZlclBjbTMyKSB7CisgICAgICAgIGZyZWUobUlucHV0QnVmZmVyUGNtMzIpOworICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIEMyU29mdEZsYWNFbmM6Om9uUmVzZXQoKSB7CisgICAgbUNvbXByZXNzaW9uTGV2ZWwgPSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX0RFRkFVTFQ7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisgICAgbUVuY29kZXJXcml0ZURhdGEgPSBmYWxzZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgbUhlYWRlck9mZnNldCA9IDA7CisgICAgbVdyb3RlSGVhZGVyID0gZmFsc2U7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBkcmFpbihEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBudWxscHRyKTsKKyAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSByZXR1cm4gc3RhdHVzOworCisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlndXJlRW5jb2RlcigpOworICAgIGlmIChlcnIgIT0gT0spIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworfQorCit2b2lkIEMyU29mdEZsYWNFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIGlmIChtSXNGaXJzdEZyYW1lICYmIGluU2l6ZSkgeworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgICAgICBtSXNGaXJzdEZyYW1lID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtV3JvdGVIZWFkZXIpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShtSGVhZGVyT2Zmc2V0LCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIG1IZWFkZXIsIG1IZWFkZXJPZmZzZXQpOworICAgICAgICBBTE9HVigicHV0IGNzZCwgJWQgYnl0ZXMiLCBtSGVhZGVyT2Zmc2V0KTsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisgICAgICAgIG1Xcm90ZUhlYWRlciA9IHRydWU7CisgICAgfQorCisgICAgY29uc3QgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworICAgIGNvbnN0IGJvb2wgaW5wdXRGbG9hdCA9IG1JbnRmLT5nZXRQY21FbmNvZGluZ0luZm8oKSA9PSBDMkNvbmZpZzo6UENNX0ZMT0FUOworICAgIGNvbnN0IHVuc2lnbmVkIHNhbXBsZVNpemUgPSBpbnB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCB1bnNpZ25lZCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzYW1wbGVTaXplOworICAgIGNvbnN0IHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxlUmF0ZTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IGluU2l6ZTsKKyAgICBvdXRDYXBhY2l0eSArPSBtQmxvY2tTaXplICogZnJhbWVTaXplOworCisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmbU91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gdHJ1ZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHByb2Nlc3NTaXplID0gTUlOKGtJbkJsb2NrU2l6ZSAqIGZyYW1lU2l6ZSwgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRGcmFtZXMgPSBwcm9jZXNzU2l6ZSAvIGZyYW1lU2l6ZTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dFNhbXBsZXMgPSBwcm9jZXNzU2l6ZSAvIHNhbXBsZVNpemU7CisKKyAgICAgICAgQUxPR1YoImFib3V0IHRvIGVuY29kZSAlenUgYnl0ZXMiLCBwcm9jZXNzU2l6ZSk7CisgICAgICAgIGlmIChpbnB1dEZsb2F0KSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqIGNvbnN0IHBjbUZsb2F0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPihpblB0ciArIGluUG9zKTsKKyAgICAgICAgICAgIG1lbWNweV90b19xOF8yM19mcm9tX2Zsb2F0X3dpdGhfY2xhbXAobUlucHV0QnVmZmVyUGNtMzIsIHBjbUZsb2F0LCBuYklucHV0U2FtcGxlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90ICogY29uc3QgcGNtMTYgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDE2X3QgKj4oaW5QdHIgKyBpblBvcyk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmJJbnB1dFNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyW2ldID0gKEZMQUNfX2ludDMyKSBwY20xNltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZMQUNfX2Jvb2wgb2sgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9wcm9jZXNzX2ludGVybGVhdmVkKAorICAgICAgICAgICAgICAgIG1GbGFjU3RyZWFtRW5jb2RlciwgbUlucHV0QnVmZmVyUGNtMzIsIG5iSW5wdXRGcmFtZXMpOworICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gcHJvY2Vzc1NpemU7CisgICAgfQorICAgIGlmIChlb3MgJiYgKEMyX09LICE9IGRyYWluKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCkpKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgZW5jb2RpbmciKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChtRW5jb2RlclJldHVybmVkTmJCeXRlcyAhPSAwKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKHN0ZDo6bW92ZShtT3V0cHV0QmxvY2spLCAwLCBtRW5jb2RlclJldHVybmVkTmJCeXRlcyk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJlbmNvZGVyIHByb2Nlc3NfaW50ZXJsZWF2ZWQgcmV0dXJuZWQgd2l0aG91dCBkYXRhIHRvIHdyaXRlIik7CisgICAgfQorICAgIG1PdXRwdXRCbG9jayA9IG51bGxwdHI7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9CisgICAgbUVuY29kZXJXcml0ZURhdGEgPSBmYWxzZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7Cit9CisKK0ZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBDMlNvZnRGbGFjRW5jOjpvbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUpIHsKKyAgICAodm9pZCkgY3VycmVudF9mcmFtZTsKKyAgICBBTE9HVigiJXMgKGJ5dGVzPSV6dSwgc2FtcGxlcz0ldSwgY3Vycl9mcmFtZT0ldSkiLCBfX2Z1bmNfXywgYnl0ZXMsIHNhbXBsZXMsCisgICAgICAgICAgY3VycmVudF9mcmFtZSk7CisKKyAgICBpZiAoc2FtcGxlcyA9PSAwKSB7CisgICAgICAgIEFMT0dJKCJzYXZpbmcgJXp1IGJ5dGVzIG9mIGhlYWRlciIsIGJ5dGVzKTsKKyAgICAgICAgbWVtY3B5KG1IZWFkZXIgKyBtSGVhZGVyT2Zmc2V0LCBidWZmZXIsIGJ5dGVzKTsKKyAgICAgICAgbUhlYWRlck9mZnNldCArPSBieXRlczsvLyB3aWxsIGNvbnRhaW4gaGVhZGVyIHNpemUgd2hlbiBmaW5pc2hlZCByZWNlaXZpbmcgaGVhZGVyCisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CisgICAgfQorCisgICAgaWYgKChzYW1wbGVzID09IDApIHx8ICFtRW5jb2RlcldyaXRlRGF0YSkgeworICAgICAgICAvLyBjYWxsZWQgYnkgdGhlIGVuY29kZXIgYmVjYXVzZSB0aGVyZSdzIGhlYWRlciBkYXRhIHRvIHNhdmUsIGJ1dCBpdCdzIG5vdCB0aGUgcm9sZQorICAgICAgICAvLyBvZiB0aGlzIGNvbXBvbmVudCAodW5sZXNzIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUiBpcyBkZWZpbmVkKQorICAgICAgICBBTE9HVigiaWdub3JpbmcgJXp1IGJ5dGVzIG9mIGhlYWRlciBkYXRhIChzYW1wbGVzPSVkKSIsIGJ5dGVzLCBzYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBlbmNvZGVkIGRhdGEKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgdWludDhfdCogb3V0RGF0YSA9IHdWaWV3LmRhdGEoKTsKKyAgICBBTE9HVigid3JpdGluZyAlenUgYnl0ZXMgb2YgZW5jb2RlZCBkYXRhIG9uIG91dHB1dCIsIGJ5dGVzKTsKKyAgICAvLyBpbmNyZW1lbnQgbVByb2Nlc3NlZFNhbXBsZXMgdG8gbWFpbnRhaW4gYXVkaW8gc3luY2hyb25pemF0aW9uIGR1cmluZworICAgIC8vIHBsYXkgYmFjaworICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IHNhbXBsZXM7CisgICAgaWYgKGJ5dGVzICsgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPiBtT3V0cHV0QmxvY2stPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggc3BhY2UgbGVmdCB0byB3cml0ZSBlbmNvZGVkIGRhdGEsIGRyb3BwaW5nICV6dSBieXRlcyIsIGJ5dGVzKTsKKyAgICAgICAgLy8gYSBmYXRhbCBlcnJvciB3b3VsZCBzdG9wIHRoZSBlbmNvZGluZworICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworICAgIH0KKyAgICBtZW1jcHkob3V0RGF0YSArIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzLCBidWZmZXIsIGJ5dGVzKTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyArPSBieXRlczsKKyAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworfQorCisKK3N0YXR1c190IEMyU29mdEZsYWNFbmM6OmNvbmZpZ3VyZUVuY29kZXIoKSB7CisgICAgQUxPR1YoIiVzIG51bUNoYW5uZWw9JWQsIHNhbXBsZVJhdGU9JWQiLCBfX2Z1bmNfXywgbUludGYtPmdldENoYW5uZWxDb3VudCgpLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKTsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgIW1GbGFjU3RyZWFtRW5jb2RlcikgeworICAgICAgICBBTE9HRSgiY2FuJ3QgY29uZmlndXJlIGVuY29kZXI6IG5vIGVuY29kZXIgb3IgaW52YWxpZCBzdGF0ZSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtSW50Zi0+Z2V0UGNtRW5jb2RpbmdJbmZvKCkgPT0gQzJDb25maWc6OlBDTV9GTE9BVDsKKyAgICBjb25zdCBpbnQgYml0c1BlclNhbXBsZSA9IGlucHV0RmxvYXQgPyAyNCA6IDE2OworICAgIEZMQUNfX2Jvb2wgb2sgPSB0cnVlOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NoYW5uZWxzKG1GbGFjU3RyZWFtRW5jb2RlciwgbUludGYtPmdldENoYW5uZWxDb3VudCgpKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9zYW1wbGVfcmF0ZShtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCkpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2JpdHNfcGVyX3NhbXBsZShtRmxhY1N0cmVhbUVuY29kZXIsIGJpdHNQZXJTYW1wbGUpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NvbXByZXNzaW9uX2xldmVsKG1GbGFjU3RyZWFtRW5jb2RlciwgbUNvbXByZXNzaW9uTGV2ZWwpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3ZlcmlmeShtRmxhY1N0cmVhbUVuY29kZXIsIGZhbHNlKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJ1bmtub3duIGVycm9yIHdoZW4gY29uZmlndXJpbmcgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBvayAmPSBGTEFDX19TVFJFQU1fRU5DT0RFUl9JTklUX1NUQVRVU19PSyA9PQorICAgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfaW5pdF9zdHJlYW0obUZsYWNTdHJlYW1FbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICBmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2sgICAgLyp3cml0ZV9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qc2Vla19jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qdGVsbF9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qbWV0YWRhdGFfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGhpcyAvKmNsaWVudF9kYXRhKi8pOworCisgICAgaWYgKCFvaykgeworICAgICAgICBBTE9HRSgidW5rbm93biBlcnJvciB3aGVuIGNvbmZpZ3VyaW5nIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUJsb2NrU2l6ZSA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9ibG9ja3NpemUobUZsYWNTdHJlYW1FbmNvZGVyKTsKKworICAgIEFMT0dWKCJlbmNvZGVyIHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkIik7CisgICAgcmV0dXJuIE9LOworfQorCitGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgQzJTb2Z0RmxhY0VuYzo6ZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqLAorICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpIHsKKyAgICByZXR1cm4gKChDMlNvZnRGbGFjRW5jKikgY2xpZW50X2RhdGEpLT5vbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICAgICAgYnVmZmVyLCBieXRlcywgc2FtcGxlcywgY3VycmVudF9mcmFtZSk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBzd2l0Y2ggKGRyYWluTW9kZSkgeworICAgICAgICBjYXNlIE5PX0RSQUlOOgorICAgICAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRFJBSU5fQ0hBSU46CisgICAgICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TOgorICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBmbGFnIGlzIG5vdCBiZWluZyBzZW50IGJhY2sgdG8gdGhlIGNsaWVudAorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gaXRlbXMgaW4gUGVuZGluZ1dvcmsgcXVldWUgYXMgYWxsIHRoZQorICAgICAgICAgICAgLy8gaW5wdXRzIGFyZSBiZWluZyBzZW50IGJhY2sgd2l0aCBlbXB0eXdvcmsgb3IgdmFsaWQgZW5jb2RlZCBkYXRhCisgICAgICAgICAgICAvLyBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfTk9fRU9TOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfZmluaXNoKG1GbGFjU3RyZWFtRW5jb2Rlcik7CisgICAgaWYgKCFvaykgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRGbGFjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEZsYWNFbmNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0RmxhY0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RmxhY0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEZsYWNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmMzA1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9GTEFDX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRkxBQ19FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJGTEFDL3N0cmVhbV9lbmNvZGVyLmgiCisKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NSU4gICAgIDAKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUIDUKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NQVggICAgIDgKKworI2RlZmluZSBGTEFDX0hFQURFUl9TSVpFICAgICAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRGbGFjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEZsYWNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0VuYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgc3RhdGljIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICplbmNvZGVyLCBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLCB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOworICAgIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBvbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBrSW5CbG9ja1NpemUgPSAxMTUyOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4TnVtQ2hhbm5lbHMgPSAyOworICAgIEZMQUNfX1N0cmVhbUVuY29kZXIqIG1GbGFjU3RyZWFtRW5jb2RlcjsKKyAgICBGTEFDX19pbnQzMiogbUlucHV0QnVmZmVyUGNtMzI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG1PdXRwdXRCbG9jazsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDMyX3QgbUNvbXByZXNzaW9uTGV2ZWw7CisgICAgdWludDMyX3QgbUJsb2NrU2l6ZTsKKyAgICBib29sIG1Jc0ZpcnN0RnJhbWU7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICAvLyBzaG91bGQgdGhlIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGNhbGxiYWNrIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwb3J0CisgICAgYm9vbCBtRW5jb2RlcldyaXRlRGF0YTsKKyAgICBzaXplX3QgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXM7CisgICAgdW5zaWduZWQgbUhlYWRlck9mZnNldDsKKyAgICBib29sIG1Xcm90ZUhlYWRlcjsKKyAgICBjaGFyIG1IZWFkZXJbRkxBQ19IRUFERVJfU0laRV07CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRGbGFjRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkZTY4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icApAQCAtMCwwICsxLDIzIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREFMQVciLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEc3MTFEZWMuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDRjYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcApAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RzcxMURlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0RzcxMURlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBBTEFXCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZzcxMS5hbGF3LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5nNzExLm1sYXcuZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0RzcxMURlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorI2lmZGVmIEFMQVcKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVworI2VuZGlmCisgICAgICAgICAgICAgICAgKSkuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgNDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5lcXVhbFRvKDY0MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0RzcxMURlYzo6QzJTb2Z0RzcxMURlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCkgeworfQorCitDMlNvZnRHNzExRGVjOjp+QzJTb2Z0RzcxMURlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6b25Jbml0KCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEc3MTFEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6b25SZWxlYXNlKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRHNzExRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBpbnQgb3V0U2l6ZSA9IGluU2l6ZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmlucHV0cHRyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDE2X3QgKm91dHB1dHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPih3Vmlldy5kYXRhKCkpOworCisjaWZkZWYgQUxBVworICAgIERlY29kZUFMYXcob3V0cHV0cHRyLCBpbnB1dHB0ciwgaW5TaXplKTsKKyNlbHNlCisgICAgRGVjb2RlTUxhdyhvdXRwdXRwdHIsIGlucHV0cHRyLCBpblNpemUpOworI2VuZGlmCisKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKyNpZmRlZiBBTEFXCit2b2lkIEMyU29mdEc3MTFEZWM6OkRlY29kZUFMYXcoCisgICAgICAgIGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgICBpblNpemUtLTsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBpeCA9IHggXiAweDU1OworICAgICAgICBpeCAmPSAweDdmOworCisgICAgICAgIGludDMyX3QgaWV4cCA9IGl4ID4+IDQ7CisgICAgICAgIGludDMyX3QgbWFudCA9IGl4ICYgMHgwZjsKKworICAgICAgICBpZiAoaWV4cCA+IDApIHsKKyAgICAgICAgICAgIG1hbnQgKz0gMTY7CisgICAgICAgIH0KKworICAgICAgICBtYW50ID0gKG1hbnQgPDwgNCkgKyA4OworCisgICAgICAgIGlmIChpZXhwID4gMSkgeworICAgICAgICAgICAgbWFudCA9IG1hbnQgPDwgKGlleHAgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKKyAgICB9Cit9CisjZWxzZQordm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVNTGF3KAorICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgaW5TaXplLS07CisgICAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICAgIGludDMyX3QgbWFudGlzc2EgPSB+eDsKKyAgICAgICAgaW50MzJfdCBleHBvbmVudCA9IChtYW50aXNzYSA+PiA0KSAmIDc7CisgICAgICAgIGludDMyX3Qgc2VnbWVudCA9IGV4cG9uZW50ICsgMTsKKyAgICAgICAgbWFudGlzc2EgJj0gMHgwZjsKKworICAgICAgICBpbnQzMl90IHN0ZXAgPSA0IDw8IHNlZ21lbnQ7CisKKyAgICAgICAgaW50MzJfdCBhYnMgPSAoMHg4MGwgPDwgZXhwb25lbnQpICsgc3RlcCAqIG1hbnRpc3NhICsgc3RlcCAvIDIgLSA0ICogMzM7CisKKyAgICAgICAgKm91dCsrID0gKHggPCAweDgwKSA/IC1hYnMgOiBhYnM7CisgICAgfQorfQorI2VuZGlmCisKK2NsYXNzIEMyU29mdEc3MTFEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RzcxMURlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRHNzExRGVjKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEc3MTFEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRHNzExRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RzcxMURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEc3MTFEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHNzExRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZThmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfRzcxMV9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEc3MTFEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RzcxMURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0RzcxMURlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisKKyNpZmRlZiBBTEFXCisgICAgdm9pZCBEZWNvZGVBTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworI2Vsc2UKKyAgICB2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisjZW5kaWYKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEc3MTFEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRzcxMV9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzMGMwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZ3NtZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRHc21EZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJnc20iXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkNDg4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRHc21EZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEdzbURlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5nc20uZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdEdzbURlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCAxMzIwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmVxdWFsVG8oMTMyMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAxMDI0IC8gTVNHU01fSU5fRlJNX1NaICogTVNHU01fSU5fRlJNX1NaKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRHc21EZWM6OkMyU29mdEdzbURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUdzbShudWxscHRyKSB7Cit9CisKK0MyU29mdEdzbURlYzo6fkMyU29mdEdzbURlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpvbkluaXQoKSB7CisgICAgaWYgKCFtR3NtKSBtR3NtID0gZ3NtX2NyZWF0ZSgpOworICAgIGlmICghbUdzbSkgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICBpbnQgbXNvcHQgPSAxOworICAgICh2b2lkKWdzbV9vcHRpb24obUdzbSwgR1NNX09QVF9XQVY0OSwgJm1zb3B0KTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUdzbSkgeworICAgICAgICBnc21fZGVzdHJveShtR3NtKTsKKyAgICAgICAgbUdzbSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmICghbUdzbSkgbUdzbSA9IGdzbV9jcmVhdGUoKTsKKyAgICBpZiAoIW1Hc20pIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgaW50IG1zb3B0ID0gMTsKKyAgICAodm9pZClnc21fb3B0aW9uKG1Hc20sIEdTTV9PUFRfV0FWNDksICZtc29wdCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRHc21EZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0R3NtRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1Hc20pIHsKKyAgICAgICAgZ3NtX2Rlc3Ryb3kobUdzbSk7CisgICAgICAgIG1Hc20gPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdGljIHNpemVfdCBkZWNvZGVHU00oZ3NtIGhhbmRsZSwgaW50MTZfdCAqb3V0LCBzaXplX3Qgb3V0Q2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHNpemVfdCBvdXRTaXplID0gMDsKKworICAgIGlmIChpblNpemUgJSBNU0dTTV9JTl9GUk1fU1ogPT0gMAorICAgICAgICAgICAgJiYgKGluU2l6ZSAvIE1TR1NNX0lOX0ZSTV9TWiAqIE1TR1NNX09VVF9GUk1fU1ogKiBzaXplb2YoKm91dCkKKyAgICAgICAgICAgICAgICAgICAgPD0gb3V0Q2FwYWNpdHkpKSB7CisgICAgICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICAgICAgICBnc21fZGVjb2RlKGhhbmRsZSwgaW4sIG91dCk7CisgICAgICAgICAgICBpbiArPSBGUkdTTV9JTl9GUk1fU1o7CisgICAgICAgICAgICBpblNpemUgLT0gRlJHU01fSU5fRlJNX1NaOworICAgICAgICAgICAgb3V0ICs9IEZSR1NNX09VVF9GUk1fU1o7CisgICAgICAgICAgICBvdXRTaXplICs9IEZSR1NNX09VVF9GUk1fU1o7CisKKyAgICAgICAgICAgIGdzbV9kZWNvZGUoaGFuZGxlLCBpbiwgb3V0KTsKKyAgICAgICAgICAgIGluICs9IEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xOworICAgICAgICAgICAgaW5TaXplIC09IEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xOworICAgICAgICAgICAgb3V0ICs9IEZSR1NNX09VVF9GUk1fU1o7CisgICAgICAgICAgICBvdXRTaXplICs9IEZSR1NNX09VVF9GUk1fU1o7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3V0U2l6ZSAqIHNpemVvZihpbnQxNl90KTsKK30KKwordm9pZCBDMlNvZnRHc21EZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSAoaW5TaXplIC8gTVNHU01fSU5fRlJNX1NaICkgKiBNU0dTTV9PVVRfRlJNX1NaICogc2l6ZW9mKGludDE2X3QpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRDYXBhY2l0eSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQxNl90ICpvdXRwdXQgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKyAgICB1aW50OF90ICppbnB1dCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgc2l6ZV90IG91dFNpemUgPSBkZWNvZGVHU00obUdzbSwgb3V0cHV0LCBvdXRDYXBhY2l0eSwgaW5wdXQsIGluU2l6ZSk7CisgICAgaWYgKCFvdXRTaXplKSB7CisgICAgICAgIEFMT0dFKCJlbmNvdW50ZXJlZCBpbXByb3BlciBpbnNpemUgb3Igb3V0c2l6ZSIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIm91dCBidWZmZXIgYXR0ci4gc2l6ZSAlenUiLCBvdXRTaXplKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dFNpemUpKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEdTTURlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRHU01EZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0R3NtRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRHc21EZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHc21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRHU01EZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHU01EZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjIwOWZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9HU01fREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9HU01fREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlICJnc20uaCIKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIEZSR1NNX0lOX0ZSTV9TWiAgICAgICAgICAgICAzMworI2RlZmluZSBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMSAgICAgMzIKKyNkZWZpbmUgRlJHU01fT1VUX0ZSTV9TWiAgICAgICAgICAgIDE2MAorI2RlZmluZSBNU0dTTV9JTl9GUk1fU1ogICAgICAgICAgICAgKEZSR1NNX0lOX0ZSTV9TWiArIEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xKQorI2RlZmluZSBNU0dTTV9PVVRfRlJNX1NaICAgICAgICAgICAgKEZSR1NNX09VVF9GUk1fU1ogKiAyKQorCitzdHJ1Y3QgQzJTb2Z0R3NtRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEdzbURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRHc21EZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGdzbSBtR3NtOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEdzbURlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9HU01fREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5YmQ3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icApAQCAtMCwwICsxLDI1IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEhldmNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJoZXZjZGVjIl0sCisKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oZXZjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRIZXZjRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliaGV2Y2VuYyJdLAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhkZGEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcApAQCAtMCwwICsxLDk4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SGV2Y0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEhldmNEZWMuaCIKKyNpbmNsdWRlICJpaGV2Y2RfY3hhLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmhldmMuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IFByb3BlciBzdXBwb3J0IGZvciByZW9yZGVyIGRlcHRoLgorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDh1KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZyhDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMywgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80LCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzUsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8yLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80XzEsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMSwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzIKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0gQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICB7QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKX0sIDB1LCA4dSAvKiBiaXREZXB0aCAqLywKKyAgICAgICAgICAgIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCA0MDk2dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCA0MDk2dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyh2b2lkICpjdHh0LCBXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgICh2b2lkKSBjdHh0OworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKmN0eHQsIHZvaWQgKm1lbSkgeworICAgICh2b2lkKSBjdHh0OworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0SGV2Y0RlYzo6QzJTb2Z0SGV2Y0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoKG51bGxwdHIpLAorICAgICAgICBtSXZDb2xvcmZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICAgIG1XaWR0aCgzMjApLAorICAgICAgICBtSGVpZ2h0KDI0MCksCisgICAgICAgIG1IZWFkZXJEZWNvZGVkKGZhbHNlKSB7Cit9CisKK0MyU29mdEhldmNEZWM6On5DMlNvZnRIZXZjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAoT0sgIT0gcmVzZXREZWNvZGVyKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodCAqIDMgLyAyOworICAgIG1PdXRCdWZmZXJGbHVzaCA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKG51bGxwdHIsIDEyOCwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBhbGxvY2F0ZSB0bXAgb3V0cHV0IGJ1ZmZlciAoZm9yIGZsdXNoKSBvZiBzaXplICV1ICIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworCisgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShudWxscHRyLCBtT3V0QnVmZmVyRmx1c2gpOworICAgICAgICBtT3V0QnVmZmVyRmx1c2ggPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6Y3JlYXRlRGVjb2RlcigpIHsKKyAgICBpdmRleHRfY3JlYXRlX2lwX3Qgc19jcmVhdGVfaXA7CisgICAgaXZkZXh0X2NyZWF0ZV9vcF90IHNfY3JlYXRlX29wOworCisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX2lwX3QpOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9DUkVBVEU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfYWxsb2MgPSBpdmRfYWxpZ25lZF9tYWxsb2M7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucGZfYWxpZ25lZF9mcmVlID0gaXZkX2FsaWduZWRfZnJlZTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wdl9tZW1fY3R4dCA9IG51bGxwdHI7CisgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2NyZWF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1EZWNIYW5kbGUgPSAoaXZfb2JqX3QqKXNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnB2X2hhbmRsZTsKKyAgICBtRGVjSGFuZGxlLT5wdl9meG5zID0gKHZvaWQgKilpdmRlY19hcGlfZnVuY3Rpb247CisgICAgbURlY0hhbmRsZS0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSkgeworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfc2V0X2R5bl9wYXJhbXNfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19zZXRfZHluX3BhcmFtc19vcDsKKworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3ZpZF9kZWNfbW9kZSA9IGRlY19tb2RlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9keW5fcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoT0sgIT0gY3JlYXRlRGVjb2RlcigpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBtTnVtQ29yZXMgPSBNSU4oZ2V0Q3B1Q29yZUNvdW50KCksIE1BWF9OVU1fQ09SRVMpOworICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAodm9pZCkgZ2V0VmVyc2lvbigpOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIEMyU29mdEhldmNEZWM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKSB7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgc2l6ZV90IGx1bWFTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisgICAgc2l6ZV90IGNocm9tYVNpemUgPSBsdW1hU2l6ZSA+PiAyOworCisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworICAgIGlmIChpbkJ1ZmZlcikgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbkJ1ZmZlci0+ZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IGluU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gbHVtYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IGNocm9tYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IGNocm9tYVNpemU7CisgICAgaWYgKG91dEJ1ZmZlcikgeworICAgICAgICBpZiAob3V0QnVmZmVyLT53aWR0aCgpIDwgZGlzcGxheVN0cmlkZSB8fCBvdXRCdWZmZXItPmhlaWdodCgpIDwgZGlzcGxheUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsOiBwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICgldXgldSkiLAorICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCgpLCBvdXRCdWZmZXItPmhlaWdodCgpLCBkaXNwbGF5U3RyaWRlLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gbU91dEJ1ZmZlckZsdXNoOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworICAgIHBzX2RlY29kZV9vcC0+dTRfb3V0cHV0X3ByZXNlbnQgPSAwOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQzJTb2Z0SGV2Y0RlYzo6Z2V0VnVpUGFyYW1zKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCBzX2dldF92dWlfcGFyYW1zX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCBzX2dldF92dWlfcGFyYW1zX29wOworCisgICAgc19nZXRfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCk7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9zdWJfY21kID0KKyAgICAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpIElIRVZDRF9DWEFfQ01EX0NUTF9HRVRfVlVJX1BBUkFNUzsKKyAgICBzX2dldF92dWlfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWdWlDb2xvckFzcGVjdHMgdnVpQ29sb3JBc3BlY3RzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX2NvbG91cl9wcmltYXJpZXM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfbWF0cml4X2NvZWZmaWNpZW50czsKKyAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV92aWRlb19mdWxsX3JhbmdlX2ZsYWc7CisKKyAgICAvLyBjb252ZXJ0IHZ1aSBhc3BlY3RzIHRvIEMyIHZhbHVlcyBpZiBjaGFuZ2VkCisgICAgaWYgKCEodnVpQ29sb3JBc3BlY3RzID09IG1CaXRzdHJlYW1Db2xvckFzcGVjdHMpKSB7CisgICAgICAgIG1CaXRzdHJlYW1Db2xvckFzcGVjdHMgPSB2dWlDb2xvckFzcGVjdHM7CisgICAgICAgIENvbG9yQXNwZWN0cyBzZkFzcGVjdHM7CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQgY29kZWRBc3BlY3RzID0geyAwdSB9OworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcywgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyLCB2dWlDb2xvckFzcGVjdHMuY29lZmZzLAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UsIHNmQXNwZWN0cyk7CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVByaW1hcmllcywgJmNvZGVkQXNwZWN0cy5wcmltYXJpZXMpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVJhbmdlLCAmY29kZWRBc3BlY3RzLnJhbmdlKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tTWF0cml4Q29lZmZzLCAmY29kZWRBc3BlY3RzLm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tVHJhbnNmZXIsICZjb2RlZEFzcGVjdHMudHJhbnNmZXIpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1JbnRmLT5jb25maWcoeyZjb2RlZEFzcGVjdHN9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXRGbHVzaE1vZGUoKSB7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfc2V0X2ZsdXNoX2lwOworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcDsKKworICAgIHNfc2V0X2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKKyAgICBzX3NldF9mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfc2V0X2ZsdXNoX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbVN0cmlkZSA9IDA7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUhlYWRlckRlY29kZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmRlbGV0ZURlY29kZXIoKSB7CisgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9pcF90IHNfZGVsZXRlX2lwOworICAgICAgICBpdmRleHRfZGVsZXRlX29wX3Qgc19kZWxldGVfb3A7CisKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX2lwX3QpOworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC5lX2NtZCA9IElWRF9DTURfREVMRVRFOworICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfb3BfdCk7CisgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX29wKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1TdHJpZGUgIT0gQUxJR042NChtV2lkdGgpKSB7CisgICAgICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gbVN0cmlkZSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2sobVN0cmlkZSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1TdHJpZGUsIG1IZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogY2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/CisvLyBUT0RPOiBhbGxvdyBjb25maWd1cmF0aW9uIG9mIGNvbG9yIGZvcm1hdCBhbmQgdXNhZ2UgZm9yIGdyYXBoaWMgYnVmZmVycyBpbnN0ZWFkCisvLyAgICAgICBvZiBoYXJkIGNvZGluZyB0aGVtIHRvIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorLy8gVE9ETzogcGFzcyBjb2xvcmFzcGVjdHMgaW5mb3JtYXRpb24gdG8gc3VyZmFjZQorLy8gVE9ETzogdGVzdCBzdXBwb3J0IGZvciBkeW5hbWljIGNoYW5nZSBpbiByZXNvbHV0aW9uCisvLyBUT0RPOiB2ZXJpZnkgaWYgdGhlIGRlY29kZXIgc2VudCBiYWNrIGFsbCBmcmFtZXMKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhbHNlID09IG1IZWFkZXJEZWNvZGVkKSB7CisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgfQorICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOworICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCisgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HRSgiYWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR1YoInJlc29sdXRpb24gY2hhbmdlZCIpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisKKyAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBuZXcgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICB9CisgICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgICAgIGlmIChtSGVhZGVyRGVjb2RlZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIG1IZWFkZXJEZWNvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR042NChzX2RlY29kZV9vcC51NF9waWNfd2QpLCBJVkRfREVDT0RFX0ZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9waWNfd2QgIT0gbVdpZHRoIHx8ICBzX2RlY29kZV9vcC51NF9waWNfaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAodm9pZCkgZ2V0VnVpUGFyYW1zKCk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gc19kZWNvZGVfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJCeXRlcyBjb25zdW1lZCBpcyB6ZXJvLiBJZ25vcmluZyByZW1haW5pbmcgYnl0ZXMiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaWYgKGhhc1BpY3R1cmUgJiYgKGluU2l6ZSAtIGluUG9zKSkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUgaW4gY3VycmVudCBhY2Nlc3MgbmFsLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFoYXNQaWN0dXJlKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0SGV2Y0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRIZXZjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0SGV2Y0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEhldmNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEhldmNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxMTFmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfSEVWQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGloZXZjZF9jeGFfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9jcmVhdGVfaXBfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9jcmVhdGVfaXBfdAorI2RlZmluZSBpdmRleHRfY3JlYXRlX29wX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfY3JlYXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9pcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2RlbGV0ZV9pcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfb3BfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9kZWxldGVfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QgIGloZXZjZF9jeGFfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90ICBpaGV2Y2RfY3hhX2N0bF9nZXRfdnVpX3BhcmFtc19vcF90CisjZGVmaW5lIEFMSUdONjQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgNjMpID4+IDYpIDw8IDYpCisjZGVmaW5lIE1BWF9OVU1fQ09SRVMgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSEVWQ0RfQ1hBX0NNRF9DVExfU0VUX05VTV9DT1JFUworI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgR0VUVElNRShhLCBiKSAgICAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoYSwgYik7CisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisKK3N0cnVjdCBDMlNvZnRIZXZjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEhldmNEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEhldmNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBjcmVhdGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpOworICAgIHN0YXR1c190IGdldFZlcnNpb24oKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgc2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpOworICAgIGJvb2wgZ2V0VnVpUGFyYW1zKCk7CisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIGNvbG9yQXNwZWN0cyBmdW5jdGlvbnMuIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGJvb2wgY29sb3JBc3BlY3RzRGlmZmVyKGNvbnN0IENvbG9yQXNwZWN0cyAmYSwgY29uc3QgQ29sb3JBc3BlY3RzICZiKTsKKyAgICB2b2lkIHVwZGF0ZUZpbmFsQ29sb3JBc3BlY3RzKAorICAgICAgICAgICAgY29uc3QgQ29sb3JBc3BlY3RzICZvdGhlckFzcGVjdHMsIGNvbnN0IENvbG9yQXNwZWN0cyAmcHJlZmVycmVkQXNwZWN0cyk7CisgICAgc3RhdHVzX3QgaGFuZGxlQ29sb3JBc3BlY3RzQ2hhbmdlKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOworICAgIHZvaWQgcmVzZXRQbHVnaW4oKTsKKyAgICBzdGF0dXNfdCBkZWxldGVEZWNvZGVyKCk7CisKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyBlbnVtLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBlbnVtIHsKKyAgICAgICAga05vdFN1cHBvcnRlZCwKKyAgICAgICAga1ByZWZlckJpdHN0cmVhbSwKKyAgICAgICAga1ByZWZlckNvbnRhaW5lciwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRmx1c2g7CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yZm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtSGVhZGVyRGVjb2RlZDsKKworICAgIC8vIENvbG9yIGFzcGVjdHMuIFRoZXNlIGFyZSBJU08gdmFsdWVzIGFuZCBhcmUgbWVhbnQgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gYXNwZWN0cyB0byBhdm9pZAorICAgIC8vIGNvbnZlcnRpbmcgdGhlbSB0byBDMiB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUKKyAgICBzdHJ1Y3QgVnVpQ29sb3JBc3BlY3RzIHsKKyAgICAgICAgdWludDhfdCBwcmltYXJpZXM7CisgICAgICAgIHVpbnQ4X3QgdHJhbnNmZXI7CisgICAgICAgIHVpbnQ4X3QgY29lZmZzOworICAgICAgICB1aW50OF90IGZ1bGxSYW5nZTsKKworICAgICAgICAvLyBkZWZhdWx0IGNvbG9yIGFzcGVjdHMKKyAgICAgICAgVnVpQ29sb3JBc3BlY3RzKCkKKyAgICAgICAgICAgIDogcHJpbWFyaWVzKDIpLCB0cmFuc2ZlcigyKSwgY29lZmZzKDIpLCBmdWxsUmFuZ2UoMCkgeyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1aUNvbG9yQXNwZWN0cyAmbykgeworICAgICAgICAgICAgcmV0dXJuIHByaW1hcmllcyA9PSBvLnByaW1hcmllcyAmJiB0cmFuc2ZlciA9PSBvLnRyYW5zZmVyICYmIGNvZWZmcyA9PSBvLmNvZWZmcworICAgICAgICAgICAgICAgICAgICAmJiBmdWxsUmFuZ2UgPT0gby5mdWxsUmFuZ2U7CisgICAgICAgIH0KKyAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CisKKyAgICAvLyBwcm9maWxlCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEhldmNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfSEVWQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDViNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwCkBAIC0wLDAgKzEsODEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIZXZjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdHRfdmlkZW9fYXBpLmgiCisjaW5jbHVkZSAiaWhldmNlX2FwaS5oIgorI2luY2x1ZGUgImloZXZjZV9wbHVnaW4uaCIKKyNpbmNsdWRlICJDMlNvZnRIZXZjRW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0SGV2Y0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6R1JBUEhJQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gbWF0Y2hlcyBzaXplIGxpbWl0cyBpbiBjb2RlYyBsaWJyYXJ5CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMzIwLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMTI4LCAxMDg4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMzAuKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBtYXRjaGVzIGxpbWl0cyBpbiBjb2RlYyBsaWJyYXJ5CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDA5NiwgMTIwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihCaXRyYXRlU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBtYXRjaGVzIGxldmVscyBhbGxvd2VkIHdpdGhpbiBjb2RlYyBsaWJyYXJ5CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfSEVWQ19NQUlOLCBMRVZFTF9IRVZDX01BSU5fMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5vbmVPZih7QzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEx9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgLm9uZU9mKHtMRVZFTF9IRVZDX01BSU5fMSwgTEVWRUxfSEVWQ19NQUlOXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0hFVkNfTUFJTl8yXzEsIExFVkVMX0hFVkNfTUFJTl8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9IRVZDX01BSU5fM18xLCBMRVZFTF9IRVZDX01BSU5fNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfSEVWQ19NQUlOXzRfMSwgTEVWRUxfSEVWQ19NQUlOXzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0hFVkNfTUFJTl81XzEsIExFVkVMX0hFVkNfTUFJTl81XzJ9KSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUsIG1GcmFtZVJhdGUsIG1CaXRyYXRlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RTeW5jLCBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCgwdSwgQzJfRkFMU0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVJlcXVlc3RTeW5jLCB2YWx1ZSkub25lT2YoeyBDMl9GQUxTRSwgQzJfVFJVRSB9KSB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVJlcXVlc3RTeW5jKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQoMHUsIDEwMDAwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYudmFsdWUgPCA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4mIG9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmc2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gJmZyYW1lUmF0ZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZiaXRyYXRlKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi5wcm9maWxlKS5zdXBwb3J0c0F0QWxsKG1lLnYucHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX0hFVkNfTUFJTjsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBMZXZlbExpbWl0cyB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbDsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNhbXBsZXNQZXJTZWM7CisgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVzOworICAgICAgICAgICAgdWludDMyX3QgYml0cmF0ZTsKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdGV4cHIgTGV2ZWxMaW1pdHMga0xpbWl0c1tdID0geworICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMSwgICAgICAgNTUyOTYwLCAgICAzNjg2NCwgICAgMTI4MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8yLCAgICAgIDM2ODY0MDAsICAgMTIyODgwLCAgIDE1MDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzJfMSwgICAgNzM3MjgwMCwgICAyNDU3NjAsICAgMzAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMywgICAgIDE2NTg4ODAwLCAgIDU1Mjk2MCwgICA2MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8zXzEsICAgMzMxNzc2MDAsICAgOTgzMDQwLCAgMTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzQsICAgICA2Njg0NjcyMCwgIDIyMjgyMjQsICAxMjAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNF8xLCAgMTMzNjkzNDQwLCAgMjIyODIyNCwgIDIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81LCAgICAyNjczODY4ODAsICA4OTEyODk2LCAgMjUwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzVfMSwgIDUzNDc3Mzc2MCwgIDg5MTI4OTYsICA0MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNV8yLCAxMDY5NTQ3NTIwLCAgODkxMjg5NiwgIDYwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82LCAgIDEwNjk1NDc1MjAsIDM1NjUxNTg0LCAgNjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzZfMSwgMjEzOTA5NTA0MCwgMzU2NTE1ODQsIDEyMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNl8yLCA0Mjc4MTkwMDgwLCAzNTY1MTU4NCwgMjQwMDAwMDAwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgdWludDY0X3Qgc2FtcGxlcyA9IHNpemUudi53aWR0aCAqIHNpemUudi5oZWlnaHQ7CisgICAgICAgIHVpbnQ2NF90IHNhbXBsZXNQZXJTZWMgPSBzYW1wbGVzICogZnJhbWVSYXRlLnYudmFsdWU7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN1cHBsaWVkIGxldmVsIG1lZXRzIHRoZSBNQiAvIGJpdHJhdGUgcmVxdWlyZW1lbnRzLiBJZgorICAgICAgICAvLyBub3QsIHVwZGF0ZSB0aGUgbGV2ZWwgd2l0aCB0aGUgbG93ZXN0IGxldmVsIG1lZXRpbmcgdGhlIHJlcXVpcmVtZW50cy4KKworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIC8vIEJ5IGRlZmF1bHQgbmVlZHNVcGRhdGUgPSBmYWxzZSBpbiBjYXNlIHRoZSBzdXBwbGllZCBsZXZlbCBkb2VzIG1lZXQKKyAgICAgICAgLy8gdGhlIHJlcXVpcmVtZW50cy4KKyAgICAgICAgYm9vbCBuZWVkc1VwZGF0ZSA9IGZhbHNlOworICAgICAgICBmb3IgKGNvbnN0IExldmVsTGltaXRzICZsaW1pdCA6IGtMaW1pdHMpIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVzIDw9IGxpbWl0LnNhbXBsZXMgJiYgc2FtcGxlc1BlclNlYyA8PSBsaW1pdC5zYW1wbGVzUGVyU2VjICYmCisgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUudi52YWx1ZSA8PSBsaW1pdC5iaXRyYXRlKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIHRoYXQgbWVldHMgdGhlIHJlcXVpcmVtZW50cywgYW5kIGlmCisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCBzZWVuIHRoZSBzdXBwbGllZCBsZXZlbCB5ZXQsIHRoYXQgbWVhbnMgd2UgZG9uJ3QKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRoZSB1cGRhdGUuCisgICAgICAgICAgICAgICAgaWYgKG5lZWRzVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJHaXZlbiBsZXZlbCAleCBkb2VzIG5vdCBjb3ZlciBjdXJyZW50IGNvbmZpZ3VyYXRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFkanVzdGluZyB0byAleCIsIG1lLnYubGV2ZWwsIGxpbWl0LmxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBsaW1pdC5sZXZlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lLnYubGV2ZWwgPT0gbGltaXQubGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBicmVhayBvdXQgb2YgdGhlIGxvb3Agd2hlbiB0aGUgbG93ZXN0IGZlYXNpYmxlIGxldmVsIGlzCisgICAgICAgICAgICAgICAgLy8gZm91bmQuIFRoZSBmYWN0IHRoYXQgd2UncmUgaGVyZSBtZWFucyB0aGF0IG91ciBsZXZlbCBkb2Vzbid0CisgICAgICAgICAgICAgICAgLy8gbWVldCB0aGUgcmVxdWlyZW1lbnQgYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIC8vIFdlIHNldCB0byB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgbGV2ZWwuCisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX0hFVkNfTUFJTl81XzI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBVV09SRDMyIGdldFByb2ZpbGVfbCgpIGNvbnN0IHsKKyAgICAgICAgc3dpdGNoIChtUHJvZmlsZUxldmVsLT5wcm9maWxlKSB7CisgICAgICAgIGNhc2UgUFJPRklMRV9IRVZDX01BSU46ICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgUFJPRklMRV9IRVZDX01BSU5fU1RJTEw6IHJldHVybiAxOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBwcm9maWxlOiAleCIsIG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBVV09SRDMyIGdldExldmVsX2woKSBjb25zdCB7CisgICAgICAgIHN0cnVjdCBMZXZlbCB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBjMkxldmVsOworICAgICAgICAgICAgVVdPUkQzMiBoZXZjTGV2ZWw7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0ZXhwciBMZXZlbCBsZXZlbHNbXSA9IHsKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzEsICAgIDMwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8yLCAgICA2MCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMl8xLCAgNjMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzMsICAgIDkwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8zXzEsICA5MyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNCwgICAxMjAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzRfMSwgMTIzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81LCAgIDE1MCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNV8xLCAxNTMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzVfMiwgMTU2IH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82LCAgIDE4MCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNl8xLCAxODMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzZfMiwgMTg2IH0sCisgICAgICAgIH07CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWwgJmxldmVsIDogbGV2ZWxzKSB7CisgICAgICAgICAgICBpZiAobVByb2ZpbGVMZXZlbC0+bGV2ZWwgPT0gbGV2ZWwuYzJMZXZlbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbC5oZXZjTGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBsZXZlbDogJXgiLCBtUHJvZmlsZUxldmVsLT5sZXZlbCk7CisgICAgICAgIHJldHVybiAxNTY7CisgICAgfQorICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZF9sKCkgY29uc3QgeworICAgICAgICBpZiAobVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPCAwIHx8CisgICAgICAgICAgICBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNpemU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gZ2V0RnJhbWVSYXRlX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVSYXRlOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQml0cmF0ZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBnZXRSZXF1ZXN0U3luY19sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJlcXVlc3RTeW5jOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworfTsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmhldmMuZW5jb2RlciI7CisKK3N0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMDsKKworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisKKyAgICBpZiAoY3B1Q29yZUNvdW50IDwgMSkKKyAgICAgICAgY3B1Q29yZUNvdW50ID0gMTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK0MyU29mdEhldmNFbmM6OkMyU29mdEhldmNFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtSXZWaWRlb0NvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1IZXZjRW5jUHJvZmlsZSgxKSwKKyAgICAgIG1IZXZjRW5jTGV2ZWwoMzApLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRFb3MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1Db2RlY0N0eChudWxscHRyKSB7CisgICAgLy8gSWYgZHVtcCBpcyBlbmFibGVkLCB0aGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitDMlNvZnRIZXZjRW5jOjp+QzJTb2Z0SGV2Y0VuYygpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpvbkluaXQoKSB7CisgICAgcmV0dXJuIGluaXRFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6Om9uU3RvcCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgcmV0dXJuIHJlbGVhc2VFbmNvZGVyKCk7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0VuYzo6b25SZXNldCgpIHsKKyAgICBvblN0b3AoKTsKKyAgICBpbml0RW5jb2RlcigpOworfQorCit2b2lkIEMyU29mdEhldmNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigiU2lnbmFsbGluZyBFT1MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICBtTnVtQ29yZXMgPSBzdGQ6Om1pbihHZXRDUFVDb3JlQ291bnQoKSwgKHNpemVfdCkgQ09ERUNfTUFYX0NPUkVTKTsKKyAgICBtZW1zZXQoJm1FbmNQYXJhbXMsIDAsIHNpemVvZihpaGV2Y2Vfc3RhdGljX2NmZ19wYXJhbXNfdCkpOworCisgICAgLy8gZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgSUhFVkNFX1BMVUdJTl9TVEFUVVNfVCBlcnIgPSBpaGV2Y2Vfc2V0X2RlZl9wYXJhbXMoJm1FbmNQYXJhbXMpOworICAgIGlmIChJSEVWQ0VfRU9LICE9IGVycikgeworICAgICAgICBBTE9HRSgiSEVWQyBkZWZhdWx0IGluaXQgZmFpbGVkIDogMHgleCIsIGVycik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgLy8gdXBkYXRlIGNvbmZpZ3VyYXRpb24KKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgbUVuY1BhcmFtcy5zX3NyY19wcm1zLmk0X2hlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgbUVuY1BhcmFtcy5zX3NyY19wcm1zLmk0X2ZybV9yYXRlX2Rlbm9tID0gMTAwMDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfZnJtX3JhdGVfbnVtID0KKyAgICAgICAgbUZyYW1lUmF0ZS0+dmFsdWUgKiBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfZnJtX3JhdGVfZGVub207CisgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X3F1YWxpdHlfcHJlc2V0ID0gSUhFVkNFX1FVQUxJVFlfUDU7CisgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF90Z3RfYml0cmF0ZVswXSA9CisgICAgICAgIG1CaXRyYXRlLT52YWx1ZTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3BlYWtfYml0cmF0ZVswXSA9CisgICAgICAgIG1CaXRyYXRlLT52YWx1ZSA8PCAxOworICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5pNF9jb2RlY19sZXZlbCA9IG1IZXZjRW5jTGV2ZWw7CisgICAgbUVuY1BhcmFtcy5zX2NvZGluZ190b29sc19wcm1zLmk0X21heF9pX29wZW5fZ29wX3BlcmlvZCA9IG1JRFJJbnRlcnZhbDsKKyAgICBtRW5jUGFyYW1zLnNfY29kaW5nX3Rvb2xzX3BybXMuaTRfbWF4X2NyYV9vcGVuX2dvcF9wZXJpb2QgPSBtSURSSW50ZXJ2YWw7CisgICAgbUl2VmlkZW9Db2xvckZvcm1hdCA9IElWX1lVVl80MjBQOworICAgIG1FbmNQYXJhbXMuc19tdWx0aV90aHJkX3BybXMuaTRfbWF4X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBtRW5jUGFyYW1zLnNfb3V0X3N0cm1fcHJtcy5pNF9jb2RlY19wcm9maWxlID0gbUhldmNFbmNQcm9maWxlOworICAgIG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9yYXRlX2NvbnRyb2xfbW9kZSA9IDI7CisgICAgbUVuY1BhcmFtcy5zX2xhcF9wcm1zLmk0X3JjX2xvb2tfYWhlYWRfcGljcyA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OnJlbGVhc2VFbmNvZGVyKCkgeworICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgaWYgKG1Db2RlY0N0eCkgeworICAgICAgICBJSEVWQ0VfUExVR0lOX1NUQVRVU19UIGVyciA9IGloZXZjZV9jbG9zZShtQ29kZWNDdHgpOworICAgICAgICBpZiAoSUhFVkNFX0VPSyAhPSBlcnIpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgICh2b2lkKWRyYWluTW9kZTsKKyAgICAodm9pZClwb29sOworICAgIHJldHVybiBDMl9PSzsKK30KK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIENIRUNLKCFtQ29kZWNDdHgpOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIG1TaXplID0gbUludGYtPmdldFNpemVfbCgpOworICAgICAgICBtQml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IG1JbnRmLT5nZXRGcmFtZVJhdGVfbCgpOworICAgICAgICBtSGV2Y0VuY1Byb2ZpbGUgPSBtSW50Zi0+Z2V0UHJvZmlsZV9sKCk7CisgICAgICAgIG1IZXZjRW5jTGV2ZWwgPSBtSW50Zi0+Z2V0TGV2ZWxfbCgpOworICAgICAgICBtSURSSW50ZXJ2YWwgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kX2woKTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBpbml0RW5jUGFyYW1zKCk7CisKKyAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIHBhcmFtcyA6IDB4JXgiLCBzdGF0dXMpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIElIRVZDRV9QTFVHSU5fU1RBVFVTX1QgZXJyID0gSUhFVkNFX0VPSzsKKyAgICBlcnIgPSBpaGV2Y2VfaW5pdCgmbUVuY1BhcmFtcywgJm1Db2RlY0N0eCk7CisgICAgaWYgKElIRVZDRV9FT0sgIT0gZXJyKSB7CisgICAgICAgIEFMT0dFKCJIRVZDIGVuY29kZXIgaW5pdCBmYWlsZWQgOiAweCV4IiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpzZXRFbmNvZGVBcmdzKGloZXZjZV9pbnBfYnVmX3QqIHBzX2VuY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyogY29uc3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIGloZXZjZV9zdGF0aWNfY2ZnX3BhcmFtc190KiBwYXJhbXMgPSAmbUVuY1BhcmFtczsKKyAgICBtZW1zZXQocHNfZW5jb2RlX2lwLCAwLCBzaXplb2YoKnBzX2VuY29kZV9pcCkpOworCisgICAgaWYgKCFpbnB1dCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgaWYgKGlucHV0LT53aWR0aCgpIDwgbVNpemUtPndpZHRoIHx8CisgICAgICAgIGlucHV0LT5oZWlnaHQoKSA8IG1TaXplLT5oZWlnaHQpIHsKKyAgICAgICAgLyogRXhwZWN0IHdpZHRoIGhlaWdodCB0byBiZSBjb25maWd1cmVkICovCisgICAgICAgIEFMT0dXKCJ1bmV4cGVjdGVkIENhcGFjaXR5IEFzcGVjdCAlZCglZCkgeCAlZCglZCkiLCBpbnB1dC0+d2lkdGgoKSwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBpbnB1dC0+aGVpZ2h0KCksIG1TaXplLT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0JiBsYXlvdXQgPSBpbnB1dC0+bGF5b3V0KCk7CisgICAgdWludDhfdCogeVBsYW5lID0KKyAgICAgICAgY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90KiB1UGxhbmUgPQorICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIHVpbnQ4X3QqIHZQbGFuZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisgICAgaW50MzJfdCB5U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOworICAgIGludDMyX3QgdVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKyAgICBpbnQzMl90IHZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb3dJbmM7CisKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworCisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIGV2ZW4KKyAgICBpZiAod2lkdGggJiAxdSB8fCBoZWlnaHQgJiAxdSkgeworICAgICAgICBBTE9HVygiaGVpZ2h0KCV1KSBhbmQgd2lkdGgoJXUpIG11c3QgYm90aCBiZSBldmVuIiwgaGVpZ2h0LCB3aWR0aCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IHlQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodDsKKworICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9CisgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB5U3RyaWRlIC8gMjsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVih5UGxhbmUsIHlTdHJpZGUsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKmlucHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CisgICAgICAgICAgICBpZiAoIUlzWVVWNDIwKCppbnB1dCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgaXMgbm90IFlVVjQyMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jb2xJbmMgPT0gMSAmJgorICAgICAgICAgICAgICAgIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxICYmCisgICAgICAgICAgICAgICAgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEgJiYKKyAgICAgICAgICAgICAgICB1U3RyaWRlID09IHZTdHJpZGUgJiYgeVN0cmlkZSA9PSAyICogdlN0cmlkZSkgeworICAgICAgICAgICAgICAgIC8vIEk0MjAgY29tcGF0aWJsZSAtIGFscmVhZHkgc2V0IHVwIGFib3ZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB5U3RyaWRlIC8gMjsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPQorICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPQorICAgICAgICAgICAgICAgIENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKHdpZHRoLCBoZWlnaHQsIHlTdHJpZGUsIGhlaWdodCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICppbnB1dCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOgorICAgICAgICAgICAgQUxPR0UoIllVVkEgcGxhbmUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1JdlZpZGVvQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwUDogeworICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIGlzIHN1cHBvc2VkIHRvIGJlIGNvbnN0IGJ1dCBJdHRpYW0gQVBJIHdhbnRzIGJhcmUKKyAgICAgICAgICAgIC8vIHBvaW50ZXIuCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzBdID0geVBsYW5lOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1sxXSA9IHVQbGFuZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMl0gPSB2UGxhbmU7CisKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzJdID0gdlN0cmlkZTsKKworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMF0gPSB5U3RyaWRlICogaGVpZ2h0OworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMV0gPSB1U3RyaWRlICogaGVpZ2h0ID4+IDE7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVsyXSA9IHZTdHJpZGUgKiBoZWlnaHQgPj4gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIySUxFOiB7CisgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1VWOgorICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9WVToKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMV0gPSB1UGxhbmU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzJdID0gbnVsbHB0cjsKKworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMF0gPSB5U3RyaWRlOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMV0gPSB1U3RyaWRlOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMl0gPSAwOworCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVswXSA9IHlTdHJpZGUgKiBoZWlnaHQ7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVsxXSA9IHVTdHJpZGUgKiBoZWlnaHQgPj4gMTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzJdID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcHNfZW5jb2RlX2lwLT5pNF9jdXJyX2JpdHJhdGUgPQorICAgICAgICBwYXJhbXMtPnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3RndF9iaXRyYXRlWzBdOworICAgIHBzX2VuY29kZV9pcC0+aTRfY3Vycl9wZWFrX2JpdHJhdGUgPQorICAgICAgICBwYXJhbXMtPnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3BlYWtfYml0cmF0ZVswXTsKKyAgICBwc19lbmNvZGVfaXAtPmk0X2N1cnJfcmF0ZV9mYWN0b3IgPSBwYXJhbXMtPnNfY29uZmlnX3BybXMuaTRfcmF0ZV9mYWN0b3I7CisgICAgcHNfZW5jb2RlX2lwLT51OF9wdHMgPSB0aW1lc3RhbXA7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEhldmNFbmM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgQUxPR0QoIlNpZ25hbGxlZCBFcnJvciAvIFNpZ25hbGxlZCBFb3MiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9PSzsKKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAorICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RhdHVzID0gaW5pdEVuY29kZXIoKTsKKyAgICAgICAgaWYgKEMyX09LICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIgOiAweCV4Iiwgc3RhdHVzKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBzdGF0dXM7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gdmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKSk7CisgICAgICAgIGlmICh2aWV3LT5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBlcnIgPSAlZCIsIHZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIElIRVZDRV9QTFVHSU5fU1RBVFVTX1QgZXJyID0gSUhFVkNFX0VPSzsKKworICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKKyAgICAgICAgaWhldmNlX291dF9idWZfdCBzX2hlYWRlcl9vcHt9OworICAgICAgICBlcnIgPSBpaGV2Y2VfZW5jb2RlX2hlYWRlcihtQ29kZWNDdHgsICZzX2hlYWRlcl9vcCk7CisgICAgICAgIGlmIChlcnIgPT0gSUhFVkNFX0VPSyAmJiBzX2hlYWRlcl9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICBzX2hlYWRlcl9vcC5pNF9ieXRlc19nZW5lcmF0ZWQsIDB1KTsKKyAgICAgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIHNfaGVhZGVyX29wLnB1MV9vdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgIHNfaGVhZGVyX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CisgICAgICAgICAgICBEVU1QX1RPX0ZJTEUobU91dEZpbGUsIGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY3NkKSk7CisgICAgICAgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghaW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpaGV2Y2VfaW5wX2J1Zl90IHNfZW5jb2RlX2lwe307CisgICAgaWhldmNlX291dF9idWZfdCBzX2VuY29kZV9vcHt9OworICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKworICAgIHN0YXR1cyA9IHNldEVuY29kZUFyZ3MoJnNfZW5jb2RlX2lwLCB2aWV3LmdldCgpLCB0aW1lc3RhbXApOworICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoInNldEVuY29kZUFyZ3MgZmFpbGVkIDogMHgleCIsIHN0YXR1cyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHN0YXR1czsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ2NF90IHRpbWVEZWxheSA9IDA7CisgICAgdWludDY0X3QgdGltZVRha2VuID0gMDsKKyAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisKKyAgICBpaGV2Y2VfaW5wX2J1Zl90KiBwc19lbmNvZGVfaXAgPSAoaW5wdXRCdWZmZXIpID8gJnNfZW5jb2RlX2lwIDogbnVsbHB0cjsKKworICAgIGVyciA9IGloZXZjZV9lbmNvZGUobUNvZGVjQ3R4LCBwc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisgICAgaWYgKElIRVZDRV9FT0sgIT0gZXJyKSB7CisgICAgICAgIEFMT0dFKCJFbmNvZGUgRnJhbWUgZmFpbGVkIDogMHgleCIsIGVycik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCisgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCB0aW1lVGFrZW4pOworCisgICAgQUxPR1YoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIChpbnQpdGltZVRha2VuLAorICAgICAgICAgIChpbnQpdGltZURlbGF5LCBzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOworCisgICAgaWYgKHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgICAgIHN0YXR1cyA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgaWYgKEMyX09LICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgMHgleCIsIHN0YXR1cyk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAoQzJfT0sgIT0gd1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCB3aXRoIHN0YXR1cyAweCV4Iiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkod1ZpZXcuZGF0YSgpLCBzX2VuY29kZV9vcC5wdTFfb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOworCisgICAgICAgIERVTVBfVE9fRklMRShtT3V0RmlsZSwgc19lbmNvZGVfb3AucHUxX291dHB1dF9idWYsCisgICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOworCisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHNfZW5jb2RlX29wLnU4X3B0czsKKyAgICAgICAgaWYgKHNfZW5jb2RlX29wLmk0X2lzX2tleV9mcmFtZSkgeworICAgICAgICAgICAgQUxPR1YoIklEUiBmcmFtZSBwcm9kdWNlZCIpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRJbmZvKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyQ29uZmlnOjpTWU5DX0ZSQU1FKSk7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRIZXZjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworICAgcHVibGljOgorICAgIEMyU29mdEhldmNFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRIZXZjRW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRIZXZjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgfkMyU29mdEhldmNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRIZXZjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTBiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfSEVWQ19FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfRU5DX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKiBHZXQgdGltZSAqLworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKQorCisvKiogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCAqLworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKyNkZWZpbmUgQ09ERUNfTUFYX0NPUkVTIDQKKworc3RydWN0IEMyU29mdEhldmNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0SGV2Y0VuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgb3ZlcnJpZGU7CisKKyAgIHByb3RlY3RlZDoKKyAgICB+QzJTb2Z0SGV2Y0VuYygpIG92ZXJyaWRlOworCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgaWhldmNlX3N0YXRpY19jZmdfcGFyYW1zX3QgbUVuY1BhcmFtczsKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIFVXT1JEMzIgbUlEUkludGVydmFsOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisgICAgVVdPUkQzMiBtSGV2Y0VuY1Byb2ZpbGU7CisgICAgVVdPUkQzMiBtSGV2Y0VuY0xldmVsOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQ7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIHZvaWQqIG1Db2RlY0N0eDsKKyAgICBNZW1vcnlCbG9ja1Bvb2wgbUNvbnZlcnNpb25CdWZmZXJzOworICAgIHN0ZDo6bWFwPHZvaWQqLCBNZW1vcnlCbG9jaz4gbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2U7CisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICAvLyBwcm9maWxlCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKworICAgIGMyX3N0YXR1c190IGluaXRFbmNQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IHJlbGVhc2VFbmNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jb2RlQXJncyhpaGV2Y2VfaW5wX2J1Zl90KiBwc19lbmNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3KiBjb25zdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCk7CisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0SGV2Y0VuYyk7Cit9OworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAiL2RhdGEvbG9jYWwvdG1wL2hldmMiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICJ5dXYiCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEggIi9kYXRhL2xvY2FsL3RtcC9oZXZjIgorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgImgyNjUiCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBTE9HRCgiR0VORVJBVEVfRklMRV9OQU1FUyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsIG1UaW1lU3RhcnQudHZfc2VjLCBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3VzZWMsIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobU91dEZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobU91dEZpbGUsICIlc18lbGQuJWxkLiVzIiwgT1VUUFVUX0RVTVBfUEFUSCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCBPVVRQVVRfRFVNUF9FWFQpOyAgICAgIFwKK30KKworI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFKiBmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgXAorICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJPcGVuZWQgZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUqIGZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiRHVtcCB0byBmaWxlISIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaSAhPSAoaW50KW1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICAgXAorICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX1NPRlRfSEVWQ19FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjY1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wM2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXAzRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbXAzZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjZkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcApAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXAzRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXAzRGVjLmgiCisjaW5jbHVkZSAicHZtcDNkZWNvZGVyX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5tcDMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdE1QMzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoezgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAyKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDIpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDMyMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE1QMzo6QzJTb2Z0TVAzKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db25maWcobnVsbHB0ciksCisgICAgICBtRGVjb2RlckJ1ZihudWxscHRyKSB7Cit9CisKK0MyU29mdE1QMzo6fkMyU29mdE1QMygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25TdG9wKCkgeworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBuZXh0IGJ1ZmZlciBvdXRwdXQgZG9lcyBub3Qgc3RpbGwKKyAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCisgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1QMzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRNUDM6Om9uUmVsZWFzZSgpIHsKKyAgICBtR2FwbGVzc0J5dGVzID0gZmFsc2U7CisgICAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgICAgIGZyZWUobURlY29kZXJCdWYpOworICAgICAgICBtRGVjb2RlckJ1ZiA9IG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKG1Db25maWcpIHsKKyAgICAgICAgZGVsZXRlIG1Db25maWc7CisgICAgICAgIG1Db25maWcgPSBudWxscHRyOworICAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0TVAzOjppbml0RGVjb2RlcigpIHsKKyAgICBtQ29uZmlnID0gbmV3IHRQVk1QM0RlY29kZXJFeHRlcm5hbHt9OworICAgIGlmICghbUNvbmZpZykgcmV0dXJuIE5PX01FTU9SWTsKKyAgICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0gZmxhdDsKKyAgICBtQ29uZmlnLT5jcmNFbmFibGVkID0gZmFsc2U7CisKKyAgICBzaXplX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOworICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgaWYgKCFtRGVjb2RlckJ1ZikgcmV0dXJuIE5PX01FTU9SWTsKKworICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtR2FwbGVzc0J5dGVzID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKworICAgIHJldHVybiBPSzsKK30KKworLyogVGhlIGJlbG93IGNvZGUgaXMgYm9ycm93ZWQgZnJvbSAuL3Rlc3QvbXAzcmVhZGVyLmNwcCAqLworc3RhdGljIGJvb2wgcGFyc2VNcDNIZWFkZXIodWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X3NhbXBsaW5nX3JhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2JpdHJhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9udW1fc2FtcGxlcyA9IG51bGxwdHIpIHsKKyAgICAqZnJhbWVfc2l6ZSA9IDA7CisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSAqb3V0X3NhbXBsaW5nX3JhdGUgPSAwOworICAgIGlmIChvdXRfY2hhbm5lbHMpICpvdXRfY2hhbm5lbHMgPSAwOworICAgIGlmIChvdXRfYml0cmF0ZSkgKm91dF9iaXRyYXRlID0gMDsKKyAgICBpZiAob3V0X251bV9zYW1wbGVzKSAqb3V0X251bV9zYW1wbGVzID0gMTE1MjsKKworICAgIGlmICgoaGVhZGVyICYgMHhmZmUwMDAwMCkgIT0gMHhmZmUwMDAwMCkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgdmVyc2lvbiA9IChoZWFkZXIgPj4gMTkpICYgMzsKKyAgICBpZiAodmVyc2lvbiA9PSAweDAxKSByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBsYXllciA9IChoZWFkZXIgPj4gMTcpICYgMzsKKyAgICBpZiAobGF5ZXIgPT0gMHgwMCkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgYml0cmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTIpICYgMHgwZjsKKyAgICBpZiAoYml0cmF0ZV9pbmRleCA9PSAwIHx8IGJpdHJhdGVfaW5kZXggPT0gMHgwZikgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgc2FtcGxpbmdfcmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTApICYgMzsKKyAgICBpZiAoc2FtcGxpbmdfcmF0ZV9pbmRleCA9PSAzKSByZXR1cm4gZmFsc2U7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTYW1wbGluZ1JhdGVWMVtdID0geyA0NDEwMCwgNDgwMDAsIDMyMDAwIH07CisgICAgaW50IHNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdSYXRlVjFbc2FtcGxpbmdfcmF0ZV9pbmRleF07CisgICAgaWYgKHZlcnNpb24gPT0gMiAvKiBWMiAqLykgeworICAgICAgICBzYW1wbGluZ19yYXRlIC89IDI7CisgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDAgLyogVjIuNSAqLykgeworICAgICAgICBzYW1wbGluZ19yYXRlIC89IDQ7CisgICAgfQorCisgICAgdW5zaWduZWQgcGFkZGluZyA9IChoZWFkZXIgPj4gOSkgJiAxOworCisgICAgaWYgKGxheWVyID09IDMpIHsgLy8gbGF5ZXIgSQorICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA2NCwgOTYsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4CisgICAgICAgIH07CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyNTYKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgYml0cmF0ZSA9ICh2ZXJzaW9uID09IDMgLyogVjEgKi8pID8ga0JpdHJhdGVWMVtiaXRyYXRlX2luZGV4IC0gMV0gOgorICAgICAgICAgICAgICAgIGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgfQorICAgICAgICAqZnJhbWVfc2l6ZSA9ICgxMjAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZykgKiA0OworICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMzg0OworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gbGF5ZXIgSUkgb3IgSUlJCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwyW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwzW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwCisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYyW10gPQorICAgICAgICB7CisgICAgICAgICAgICA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgYml0cmF0ZTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgYml0cmF0ZSA9IChsYXllciA9PSAyIC8qIEwyICovKSA/IGtCaXRyYXRlVjFMMltiaXRyYXRlX2luZGV4IC0gMV0gOgorICAgICAgICAgICAgICAgICAgICBrQml0cmF0ZVYxTDNbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIFYyIChvciAyLjUpCisgICAgICAgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisgICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDU3NiA6IDExNTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICAgICAgfSBlbHNlIHsgLy8gVjIgb3IgVjIuNQorICAgICAgICAgICAgc2l6ZV90IHRtcCA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDcyMDAwIDogMTQ0MDAwOworICAgICAgICAgICAgKmZyYW1lX3NpemUgPSB0bXAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpIHsKKyAgICAgICAgKm91dF9zYW1wbGluZ19yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKyAgICB9CisKKyAgICBpZiAob3V0X2NoYW5uZWxzKSB7CisgICAgICAgIGludCBjaGFubmVsX21vZGUgPSAoaGVhZGVyID4+IDYpICYgMzsKKworICAgICAgICAqb3V0X2NoYW5uZWxzID0gKGNoYW5uZWxfbW9kZSA9PSAzKSA/IDEgOiAyOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdWludDMyX3QgVTMyX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICAgIHJldHVybiBwdHJbMF0gPDwgMjQgfCBwdHJbMV0gPDwgMTYgfCBwdHJbMl0gPDwgOCB8IHB0clszXTsKK30KKworc3RhdGljIHN0YXR1c190IGNhbGN1bGF0ZU91dFNpemUodWludDggKmhlYWRlciwgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKmRlY29kZWRTaXplcykgeworICAgIHVpbnQzMl90IGNoYW5uZWxzOworICAgIHVpbnQzMl90IG51bVNhbXBsZXM7CisgICAgc2l6ZV90IGZyYW1lU2l6ZTsKKyAgICBzaXplX3QgdG90YWxJblNpemUgPSAwOworCisgICAgd2hpbGUgKHRvdGFsSW5TaXplICsgNCA8IGluU2l6ZSkgeworICAgICAgICBpZiAoIXBhcnNlTXAzSGVhZGVyKFUzMl9BVChoZWFkZXIgKyB0b3RhbEluU2l6ZSksICZmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJmNoYW5uZWxzLCBudWxscHRyLCAmbnVtU2FtcGxlcykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBwYXJzZSBtcDMgaGVhZGVyIGR1cmluZyBvdXRTaXplIGVzdGltYXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHRvdGFsSW5TaXplICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgZGVjb2RlZFNpemVzLT5wdXNoX2JhY2sobnVtU2FtcGxlcyAqIGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICB9CisKKyAgICBpZiAoZGVjb2RlZFNpemVzLT5lbXB0eSgpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogQ2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/IEFzIGluIHRoZSBjaGVjayBmb3IgdmFsaWRpdHkgb2YKKy8vICAgICAgIHdvcmssIHBvb2wgcHRyLCB3b3JrLT5pbnB1dC5idWZmZXJzLnNpemUoKSA9PSAxLCAuLi4KKy8vIFRPRE86IEJsaW5kIHJlbW92YWwgb2YgNTI5IHNhbXBsZXMgZnJvbSB0aGUgb3V0cHV0IG1heSBub3Qgd29yay4gQmVjYXVzZQorLy8gICAgICAgbXBlZyBsYXllciAxIGZyYW1lIHNpemUgaXMgMzg0IHNhbXBsZXMgcGVyIGZyYW1lLiBUaGlzIHNob3VsZCBpbnRyb2R1Y2UKKy8vICAgICAgIG5lZ2F0aXZlIHZhbHVlcyBhbmQgY2FuIGNhdXNlIFNFRyBmYXVsdHMuIFNvZnQgb214IG1wMyBwbHVnaW4gY2FuIGhhdmUKKy8vICAgICAgIHRoaXMgcHJvYmxlbSAoQ0hFQ0shKQordm9pZCBDMlNvZnRNUDM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5TaXplID09IDAgJiYgKCFtR2FwbGVzc0J5dGVzIHx8ICFlb3MpKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgaW50MzJfdCBudW1DaGFubmVscyA9IG1Db25maWctPm51bV9jaGFubmVsczsKKyAgICBzaXplX3QgY2FsT3V0U2l6ZTsKKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGRlY29kZWRTaXplczsKKyAgICBpZiAoaW5TaXplICYmIE9LICE9IGNhbGN1bGF0ZU91dFNpemUoY29uc3RfY2FzdDx1aW50OCAqPihyVmlldy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNpemUsICZkZWNvZGVkU2l6ZXMpKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYWxPdXRTaXplID0gc3RkOjphY2N1bXVsYXRlKGRlY29kZWRTaXplcy5iZWdpbigpLCBkZWNvZGVkU2l6ZXMuZW5kKCksIDApOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgY2FsT3V0U2l6ZSArPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FsT3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgb3V0U2l6ZSA9IDA7CisgICAgaW50IG91dE9mZnNldCA9IDA7CisgICAgYXV0byBpdCA9IGRlY29kZWRTaXplcy5iZWdpbigpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChpdCA9PSBkZWNvZGVkU2l6ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIGJ5dGVzLCBpZ25vcmluZyB0aGVtIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDggKj4oclZpZXcuZGF0YSgpICsgaW5Qb3MpOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7CisgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9IChjYWxPdXRTaXplIC0gb3V0U2l6ZSk7CisgICAgICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4gKHdWaWV3LmRhdGEoKSArIG91dFNpemUpOworCisgICAgICAgIEVSUk9SX0NPREUgZGVjb2RlckVycjsKKyAgICAgICAgaWYgKChkZWNvZGVyRXJyID0gcHZtcDNfZnJhbWVkZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKSkKKyAgICAgICAgICAgICAgICAhPSBOT19ERUNPRElOR19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIm1wMyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkIiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBOT19FTk9VR0hfTUFJTl9EQVRBX0VSUk9SCisgICAgICAgICAgICAgICAgICAgICYmIGRlY29kZXJFcnIgIT0gU0lERV9JTkZPX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGlzIGlzIHJlY292ZXJhYmxlLCBqdXN0IGlnbm9yZSB0aGUgY3VycmVudCBmcmFtZSBhbmQKKyAgICAgICAgICAgIC8vIHBsYXkgc2lsZW5jZSBpbnN0ZWFkLgorICAgICAgICAgICAgQUxPR1YoImlnbm9yaW5nIGVycm9yIGFuZCBzZW5kaW5nIHNpbGVuY2UiKTsKKyAgICAgICAgICAgIGlmIChtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9ICppdCAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldChtQ29uZmlnLT5wT3V0cHV0QnVmZmVyLCAwLCBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICB9IGVsc2UgaWYgKG1Db25maWctPnNhbXBsaW5nUmF0ZSAhPSBzYW1wbGluZ1JhdGUKKyAgICAgICAgICAgICAgICB8fCBtQ29uZmlnLT5udW1fY2hhbm5lbHMgIT0gbnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywgbUNvbmZpZy0+bnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1Db25maWctPnNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIG51bUNoYW5uZWxzID0gbUNvbmZpZy0+bnVtX2NoYW5uZWxzOworCisgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBudW1DaGFubmVscyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgqaXQgIT0gbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICBBTE9HRSgicGFuaWMsIHBhcnNlZCBzaXplIGRvZXMgbm90IG1hdGNoIGRlY29kZWQgc2l6ZSIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvdXRTaXplICs9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaW5Qb3MgKz0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoOworICAgICAgICBpdCsrOworICAgIH0KKyAgICBpZiAobUlzRmlyc3QpIHsKKyAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgbUdhcGxlc3NCeXRlcyA9IHRydWU7CisgICAgICAgIC8vIFRoZSBkZWNvZGVyIGRlbGF5IGlzIDUyOSBzYW1wbGVzLCBzbyB0cmltIHRoYXQgbWFueSBzYW1wbGVzIG9mZgorICAgICAgICAvLyB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IG91dHB1dCBidWZmZXIuIFRoaXMgZXNzZW50aWFsbHkgbWFrZXMgdGhpcworICAgICAgICAvLyBkZWNvZGVyIGhhdmUgemVybyBkZWxheSwgd2hpY2ggdGhlIHJlc3Qgb2YgdGhlIHBpcGVsaW5lIGFzc3VtZXMuCisgICAgICAgIG91dE9mZnNldCA9IGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGlmIChjYWxPdXRTaXplID49CisgICAgICAgICAgICBvdXRTaXplICsga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgIGlmICghbWVtc2V0KHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KHdWaWV3LmRhdGEoKSArIG91dFNpemUpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJBZGRpbmcgNTI5IHNhbXBsZXMgYXQgZW5kIik7CisgICAgICAgICAgICBtR2FwbGVzc0J5dGVzID0gZmFsc2U7CisgICAgICAgICAgICBvdXRTaXplICs9IGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3Qgb3V0VGltZVN0YW1wID0gbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBzYW1wbGluZ1JhdGU7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKChvdXRTaXplIC0gb3V0T2Zmc2V0KSAvIChudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkpOworICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkIHRpbWVzdGFtcCAldSIsIG91dE9mZnNldCwgb3V0U2l6ZSAtIG91dE9mZnNldCwKKyAgICAgICAgICAodWludDMyX3QpKG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXApKTsKKyAgICBkZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgb3V0T2Zmc2V0LCBvdXRTaXplIC0gb3V0T2Zmc2V0KSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdE1wM0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcDNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgbmV3IEMyU29mdE1QMyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1QMzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1QMzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNUDM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXAzRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXAzRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyYmRjNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfTVAzX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfTVAzX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitzdHJ1Y3QgdFBWTVAzRGVjb2RlckV4dGVybmFsOworCitib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X3NhbXBsaW5nX3JhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2NoYW5uZWxzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9iaXRyYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9udW1fc2FtcGxlcyA9IG51bGxwdHIpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRNUDMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TVAzKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE1QMygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1BWTVAzRGVjb2RlckRlbGF5ID0gNTI5IC8vIHNhbXBsZXMKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB0UFZNUDNEZWNvZGVyRXh0ZXJuYWwgKm1Db25maWc7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1HYXBsZXNzQnl0ZXM7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNUDMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfTVAzX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxZjBhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzJEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJtcGVnMmRlYyJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9kZWNvZGVyIiwKKyAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2NvbW1vbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTA2NzdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCkBAIC0wLDAgKzEsMTA2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXBlZzJEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcGVnMkRlYy5oIgorI2luY2x1ZGUgImltcGVnMmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgxNiwgMTkyMCwgNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDE2LCAxMDg4LCA0KSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMTkyMHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMTA4OHUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMQorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDM4NCk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyhXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKm1lbSkgeworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0TXBlZzJEZWM6OkMyU29mdE1wZWcyRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtTWVtUmVjb3JkcyhudWxscHRyKSwKKyAgICAgICAgbU91dEJ1ZmZlckRyYWluKG51bGxwdHIpLAorICAgICAgICBtSXZDb2xvcmZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICAgIG1XaWR0aCgzMjApLAorICAgICAgICBtSGVpZ2h0KDI0MCkgeworICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7Cit9CisKK0MyU29mdE1wZWcyRGVjOjp+QzJTb2Z0TXBlZzJEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWcyRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1PdXRCdWZmZXJEcmFpbik7CisgICAgICAgIG1PdXRCdWZmZXJEcmFpbiA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1NZW1SZWNvcmRzKTsKKyAgICAgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckRyYWluID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1PdXRCdWZmZXJEcmFpbik7CisgICAgICAgIG1PdXRCdWZmZXJEcmFpbiA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Z2V0TnVtTWVtUmVjb3JkcygpIHsKKyAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgaXZfbnVtX21lbV9yZWNfb3BfdCBzX251bV9tZW1fcmVjX29wOworCisgICAgc19udW1fbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfaXApOworICAgIHNfbnVtX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfR0VUX05VTV9NRU1fUkVDOworICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX29wKTsKKworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19udW1fbWVtX3JlY19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfbnVtX21lbV9yZWNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyBtZW0gcmVjb3JkczogMHgleCIsIHNfbnVtX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpmaWxsTWVtUmVjb3JkcygpIHsKKyAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWMgPSAoaXZfbWVtX3JlY190ICopIGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgIDEyOCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgaWYgKCFwc19tZW1fcmVjKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KHBzX21lbV9yZWMsIDAsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykKKyAgICAgICAgcHNfbWVtX3JlY1tpXS51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisgICAgbU1lbVJlY29yZHMgPSBwc19tZW1fcmVjOworCisgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1faXA7CisgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fb3A7CisKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICBzX2ZpbGxfbWVtX2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2ZpbGxfbWVtX2lwLmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfZmlsbF9tZW1faXAudTRfZGVpbnRlcmxhY2UgPSAxOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1fd2QgPSBtV2lkdGg7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX2h0ID0gbUhlaWdodDsKKyAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZmlsbF9tZW1faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2ZpbGxfbWVtX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGZpbGxpbmcgbWVtIHJlY29yZHM6IDB4JXgiLAorICAgICAgICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBDSEVDS19FUShtTnVtTWVtUmVjb3Jkcywgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9udW1fbWVtX3JlY19maWxsZWQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKywgcHNfbWVtX3JlYysrKSB7CisgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICBpZiAoIXBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbW9yeSByZWNvcmQgIyV6dSBvZiBzaXplICV1IiwKKyAgICAgICAgICAgICAgICAgIGksIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpjcmVhdGVEZWNvZGVyKCkgeworICAgIGl2ZGV4dF9pbml0X2lwX3Qgc19pbml0X2lwOworICAgIGl2ZGV4dF9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9pbml0X2lwX3QpOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9jbWQgPSAoSVZEX0FQSV9DT01NQU5EX1RZUEVfVClJVl9DTURfSU5JVDsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X2ZybV9tYXhfd2QgPSBtV2lkdGg7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X2h0ID0gbUhlaWdodDsKKyAgICBzX2luaXRfaXAudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfaW5pdF9pcC51NF9kZWludGVybGFjZSA9IDE7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3Jmb3JtYXQ7CisgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9pbml0X29wX3QpOworCisgICAgbURlY0hhbmRsZSA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2luaXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2luaXRfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfbnVtX2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcDsKKworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIHNfc2V0X251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gSVZEX0RFQ09ERV9GUkFNRTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Z2V0VmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19nZXRfdmVyc2lvbmluZm9faXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIml0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgIChjaGFyICopIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBnZXROdW1NZW1SZWNvcmRzKCk7CisgICAgaWYgKE9LICE9IHJldCkgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGZpbGxNZW1SZWNvcmRzKCk7CisgICAgaWYgKE9LICE9IHJldCkgcmV0dXJuIHJldDsKKworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworCisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRNcGVnMkRlYzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpIHsKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICBzaXplX3QgbHVtYVNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKyAgICBzaXplX3QgY2hyb21hU2l6ZSA9IGx1bWFTaXplID4+IDI7CisKKyAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNvZGVfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisgICAgaWYgKGluQnVmZmVyKSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSB0c01hcmtlcjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGluQnVmZmVyLT5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gaW5TaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBudWxscHRyOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBsdW1hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gY2hyb21hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gY2hyb21hU2l6ZTsKKyAgICBpZiAob3V0QnVmZmVyKSB7CisgICAgICAgIGlmIChvdXRCdWZmZXItPndpZHRoKCkgPCBkaXNwbGF5U3RyaWRlIHx8IG91dEJ1ZmZlci0+aGVpZ2h0KCkgPCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGw6IHByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCV1eCV1KSIsCisgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPndpZHRoKCksIG91dEJ1ZmZlci0+aGVpZ2h0KCksIGRpc3BsYXlTdHJpZGUsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBtT3V0QnVmZmVyRHJhaW47CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gbU91dEJ1ZmZlckRyYWluICsgbHVtYVNpemU7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gbU91dEJ1ZmZlckRyYWluICsgbHVtYVNpemUgKyBjaHJvbWFTaXplOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIEMyU29mdE1wZWcyRGVjOjpnZXRTZXFJbmZvKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3Qgc19jdGxfZ2V0X3NlcV9pbmZvX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX29wX3Qgc19jdGxfZ2V0X3NlcV9pbmZvX29wOworCisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9faXBfdCk7CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLmVfc3ViX2NtZCA9CisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSU1QRUcyRF9DTURfQ1RMX0dFVF9TRVFfSU5GTzsKKyAgICBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3RsX2dldF9zZXFfaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3RsX2dldF9zZXFfaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dXKCJFcnJvciBpbiBnZXR0aW5nIFNlcXVlbmNlIGluZm86IDB4JXgiLCBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWdWlDb2xvckFzcGVjdHMgdnVpQ29sb3JBc3BlY3RzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfbWF0cml4X2NvZWZmaWNpZW50czsKKyAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlID0gIGZhbHNlOyAgLy8gbXBlZzIgdmlkZW8gaGFzIGxpbWl0ZWQgcmFuZ2UuCisKKyAgICAvLyBjb252ZXJ0IHZ1aSBhc3BlY3RzIHRvIEMyIHZhbHVlcyBpZiBjaGFuZ2VkCisgICAgaWYgKCEodnVpQ29sb3JBc3BlY3RzID09IG1CaXRzdHJlYW1Db2xvckFzcGVjdHMpKSB7CisgICAgICAgIG1CaXRzdHJlYW1Db2xvckFzcGVjdHMgPSB2dWlDb2xvckFzcGVjdHM7CisgICAgICAgIENvbG9yQXNwZWN0cyBzZkFzcGVjdHM7CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQgY29kZWRBc3BlY3RzID0geyAwdSB9OworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcywgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyLCB2dWlDb2xvckFzcGVjdHMuY29lZmZzLAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UsIHNmQXNwZWN0cyk7CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVByaW1hcmllcywgJmNvZGVkQXNwZWN0cy5wcmltYXJpZXMpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVJhbmdlLCAmY29kZWRBc3BlY3RzLnJhbmdlKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tTWF0cml4Q29lZmZzLCAmY29kZWRBc3BlY3RzLm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tVHJhbnNmZXIsICZjb2RlZEFzcGVjdHMudHJhbnNmZXIpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1JbnRmLT5jb25maWcoeyZjb2RlZEFzcGVjdHN9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfcmVzZXRfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3A7CisKKyAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19yZXNldF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX3Jlc2V0X29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfcmVzZXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBtU3RyaWRlID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkZWxldGVEZWNvZGVyKCkgeworICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyssIHBzX21lbV9yZWMrKykgeworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU1lbVJlY29yZHMpOworICAgICAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgfQorICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6cmVJbml0RGVjb2RlcigpIHsKKyAgICBkZWxldGVEZWNvZGVyKCk7CisKKyAgICBzdGF0dXNfdCByZXQgPSBpbml0RGVjb2RlcigpOworICAgIGlmIChPSyAhPSByZXQpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIiKTsKKyAgICAgICAgZGVsZXRlRGVjb2RlcigpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtU3RyaWRlICE9IEFMSUdONjQobVdpZHRoKSkgeworICAgICAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IG1TdHJpZGUgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG1TdHJpZGUsIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtU3RyaWRlLCBtSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IGNhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPworLy8gVE9ETzogYWxsb3cgY29uZmlndXJhdGlvbiBvZiBjb2xvciBmb3JtYXQgYW5kIHVzYWdlIGZvciBncmFwaGljIGJ1ZmZlcnMgaW5zdGVhZAorLy8gICAgICAgb2YgaGFyZCBjb2RpbmcgdGhlbSB0byBIQUxfUElYRUxfRk9STUFUX1lWMTIKKy8vIFRPRE86IHBhc3MgY29sb3Jhc3BlY3RzIGluZm9ybWF0aW9uIHRvIHN1cmZhY2UKKy8vIFRPRE86IHRlc3Qgc3VwcG9ydCBmb3IgZHluYW1pYyBjaGFuZ2UgaW4gcmVzb2x1dGlvbgorLy8gVE9ETzogdmVyaWZ5IGlmIHRoZSBkZWNvZGVyIHNlbnQgYmFjayBhbGwgZnJhbWVzCit2b2lkIEMyU29mdE1wZWcyRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGJvb2wgaGFzUGljdHVyZSA9IGZhbHNlOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZnNldCArIGluUG9zLCBpblNpemUgLSBpblBvcywgd29ya0luZGV4KSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgaW5wdXQgZHVtcCBpcyBlbmFibGVkLCB0aGVuIHdyaXRlIHRvIGZpbGUKKyAgICAgICAgRFVNUF9UT19GSUxFKG1JbkZpbGUsIHNfZGVjb2RlX2lwLnB2X3N0cmVhbV9idWZmZXIsIHNfZGVjb2RlX2lwLnU0X251bV9CeXRlcyk7CisgICAgICAgIFdPUkQzMiBkZWxheTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQgIiwgZGVjb2RlVGltZSwgZGVsYXksCisgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIGlmIChJTVBFRzJEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMgPT0gc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSkgeworICAgICAgICAgICAgQUxPR1YoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIHNfZGVjb2RlX29wLnU0X3BpY193ZCwgc19kZWNvZGVfb3AudTRfcGljX2h0KTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisKKyAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBkZWNvZGVyOiBtV2lkdGggJWQgLCBtSGVpZ2h0ICVkICIsCisgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChPSyAhPSByZUluaXREZWNvZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlaW5pdGlhbGl6ZSBkZWNvZGVyIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR1YoInJlc29sdXRpb24gY2hhbmdlZCIpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfcGljX3dkICE9IG1XaWR0aCB8fCAgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIGRlY29kZXIgb3V0OiBtV2lkdGggJWQgLCBtSGVpZ2h0ICVkICIsCisgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAodm9pZCkgZ2V0U2VxSW5mbygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKworICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykgIT0gMCkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUgaW4gY3VycmVudCBhY2Nlc3MgbmFsLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFoYXNQaWN0dXJlKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRNcGVnMkRlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRNcGVnMkRlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWcyRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfTVBFRzJfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgIml2X2RhdGF0eXBlZGVmLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaW1wZWcyZF9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2luaXRfaXBfdCAgICAgICAgICAgICAgICBpbXBlZzJkX2luaXRfaXBfdAorI2RlZmluZSBpdmRleHRfaW5pdF9vcF90ICAgICAgICAgICAgICAgIGltcGVnMmRfaW5pdF9vcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCAgICAgICAgaW1wZWcyZF9maWxsX21lbV9yZWNfaXBfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX29wX3QgICAgICAgIGltcGVnMmRfZmlsbF9tZW1fcmVjX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpbXBlZzJkX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpbXBlZzJkX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9faXBfdCAgICBpbXBlZzJkX2N0bF9nZXRfc2VxX2luZm9faXBfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90ICAgIGltcGVnMmRfY3RsX2dldF9zZXFfaW5mb19vcF90CisjZGVmaW5lIEFMSUdONjQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgNjMpID4+IDYpIDw8IDYpCisjZGVmaW5lIE1BWF9OVU1fQ09SRVMgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJTVBFRzJEX0NNRF9DVExfU0VUX05VTV9DT1JFUworI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgR0VUVElNRShhLCBiKSAgICAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoYSwgYik7CisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICAgICAiL3NkY2FyZC9jbGlwcy9tcGVnMmRfaW5wdXQiCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJtMnYiCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQzMl90IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgICAgIGlmIChpICE9ICh1aW50MzJfdCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgIFwKKyAgICAgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpO1wKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyAgICAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorICAgICNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCitzdHJ1Y3QgQzJTb2Z0TXBlZzJEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzJEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnMkRlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIHN0YXR1c190IGdldE51bU1lbVJlY29yZHMoKTsKKyAgICBzdGF0dXNfdCBmaWxsTWVtUmVjb3JkcygpOworICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKTsKKyAgICBzdGF0dXNfdCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFNlcUluZm8oKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgdm9pZCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IGRlbGV0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CisKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyBlbnVtLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBlbnVtIHsKKyAgICAgICAga05vdFN1cHBvcnRlZCwKKyAgICAgICAga1ByZWZlckJpdHN0cmVhbSwKKyAgICAgICAga1ByZWZlckNvbnRhaW5lciwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRHJhaW47CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yZm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1wZWcyRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTRmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzREZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgICAgICItRE1QRUc0IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzRlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzRFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ETVBFRzQiLAorICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2gyNjNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0YTczMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCkBAIC0wLDAgKzEsNzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2lmZGVmIE1QRUc0CisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXBlZzREZWMiCisjZWxzZQorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdEgyNjNEZWMiCisjZW5kaWYKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXBlZzREZWMuaCIKKyNpbmNsdWRlICJtcDRkZWNfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIE1QRUc0Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXBlZzQuZGVjb2RlciI7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmgyNjMuZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0TXBlZzREZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MworI2VuZGlmCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IFByb3BlciBzdXBwb3J0IGZvciByZW9yZGVyIGRlcHRoLgorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDF1KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZyhDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAxNzYsIDE0NCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMTkyMCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDEwODgsIDIpLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAzNTIsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyODgsIDIpLAorI2VuZGlmCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmZGVmIE1QRUc0CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSDI2M19CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YyfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1fSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDE5MjAsIDEwODgpKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzUyLCAyODgpKQorI2VuZGlmCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMTkyMCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDEwODgsIDIpLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAzNTIsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyODgsIDIpLAorI2VuZGlmCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAxOTIwICogMTA4OCAqIDMgLyAyKSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzUyICogMjg4ICogMyAvIDIpKQorI2VuZGlmCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisjaWZkZWYgTVBFRzQKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDE5MjB1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDEwODh1KTsKKyNlbHNlCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAzNTJ1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDI4OHUpOworI2VuZGlmCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAxCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgMTUpIC8gMTYpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgMTUpIC8gMTYpICogMzg0KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldE1heFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbU1heFNpemUtPndpZHRoOyB9CisgICAgdWludDMyX3QgZ2V0TWF4SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbU1heFNpemUtPmhlaWdodDsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK0MyU29mdE1wZWc0RGVjOjpDMlNvZnRNcGVnNERlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgbU91dHB1dEJ1ZmZlcnt9LAorICAgICAgbUluaXRpYWxpemVkKGZhbHNlKSB7Cit9CisKK0MyU29mdE1wZWc0RGVjOjp+QzJTb2Z0TXBlZzREZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgICh2b2lkKW9uSW5pdCgpOworfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICAgICAgZGVsZXRlIG1EZWNIYW5kbGU7CisgICAgICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChQVl9UUlVFICE9IFBWUmVzZXRWaWRlb0RlY29kZXIobURlY0hhbmRsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6OmluaXREZWNvZGVyKCkgeworI2lmZGVmIE1QRUc0CisgICAgbUlzTXBlZzQgPSB0cnVlOworI2Vsc2UKKyAgICBtSXNNcGVnNCA9IGZhbHNlOworI2VuZGlmCisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIG1EZWNIYW5kbGUgPSBuZXcgdGFndmlkZW9EZWNDb250cm9sczsKKyAgICB9CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJtRGVjSGFuZGxlIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KG1EZWNIYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7CisKKyAgICAvKiBUT0RPOiBicmluZyB0aGVzZSB2YWx1ZXMgdG8gMzUyIGFuZCAyODguIEl0IGNhbm5vdCBiZSBkb25lIGFzIG9mIG5vdworICAgICAqIGJlY2F1c2UsIGgyNjMgZG9lc24ndCBzZWVtIHRvIGFsbG93IHBvcnQgcmVjb25maWd1cmF0aW9uLiBJbiBPTVgsIHRoZQorICAgICAqIHByb2JsZW0gb2YgbGFyZ2VyIHdpZHRoIGFuZCBoZWlnaHQgdGhhbiBkZWZhdWx0IHdpZHRoIGFuZCBoZWlnaHQgaXMKKyAgICAgKiBvdmVyY29tZSBieSBhZGFwdGl2ZVBsYXlCYWNrKCkgYXBpIGNhbGwuIFRoaXMgY2FsbCBnZXRzIHdpZHRoIGFuZCBoZWlnaHQKKyAgICAgKiBpbmZvcm1hdGlvbiBmcm9tIGV4dHJhY3Rvci4gU3VjaCBhIHRoaW5nIGlzIG5vdCBwb3NzaWJsZSBoZXJlLgorICAgICAqIFNvIHdlIGFyZSBjb25maWd1cmluZyB0byBsYXJnZXIgdmFsdWVzLiovCisgICAgbVdpZHRoID0gMTQwODsKKyAgICBtSGVpZ2h0ID0gMTE1MjsKKyAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyLCBpbmRleF0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgJiYKKyAgICAgICAgICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBtT3V0cHV0QnVmZmVyU2l6ZSA9IGFsaWduKG1JbnRmLT5nZXRNYXhXaWR0aCgpLCAxNikgKiBhbGlnbihtSW50Zi0+Z2V0TWF4SGVpZ2h0KCksIDE2KSAqIDMgLyAyOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gKHVpbnQ4X3QgKiltYWxsb2MobU91dHB1dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IGFsaWduKG1XaWR0aCwgMTYpIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhhbGlnbihtV2lkdGgsIDE2KSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCk7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYm9vbCBDMlNvZnRNcGVnNERlYzo6aGFuZGxlUmVzQ2hhbmdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQ7CisgICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobURlY0hhbmRsZSwgKGludDMyICopJmRpc3Bfd2lkdGgsIChpbnQzMiAqKSZkaXNwX2hlaWdodCk7CisKKyAgICB1aW50MzJfdCBidWZfd2lkdGgsIGJ1Zl9oZWlnaHQ7CisgICAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKG1EZWNIYW5kbGUsIChpbnQzMiAqKSZidWZfd2lkdGgsIChpbnQzMiAqKSZidWZfaGVpZ2h0KTsKKworICAgIENIRUNLX0xFKGRpc3Bfd2lkdGgsIGJ1Zl93aWR0aCk7CisgICAgQ0hFQ0tfTEUoZGlzcF9oZWlnaHQsIGJ1Zl9oZWlnaHQpOworCisgICAgQUxPR1YoImRpc3BsYXkgc2l6ZSAoJWR4JWQpLCBidWZmZXIgc2l6ZSAoJWR4JWQpIiwKKyAgICAgICAgICAgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQsIGJ1Zl93aWR0aCwgYnVmX2hlaWdodCk7CisKKyAgICBib29sIHJlc0NoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAoZGlzcF93aWR0aCAhPSBtV2lkdGggfHwgZGlzcF9oZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICBtV2lkdGggPSBkaXNwX3dpZHRoOworICAgICAgICBtSGVpZ2h0ID0gZGlzcF9oZWlnaHQ7CisgICAgICAgIHJlc0NoYW5nZWQgPSB0cnVlOworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgICAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1Jc01wZWc0KSB7CisgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisKKyAgICAgICAgICAgIHVpbnQ4X3QgKnZvbF9kYXRhWzFde307CisgICAgICAgICAgICBpbnQzMl90IHZvbF9zaXplID0gMDsKKworICAgICAgICAgICAgaWYgKCFQVkluaXRWaWRlb0RlY29kZXIoCisgICAgICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsIG1JbnRmLT5nZXRNYXhXaWR0aCgpLCBtSW50Zi0+Z2V0TWF4SGVpZ2h0KCksIEgyNjNfTU9ERSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gUFZJbml0VmlkZW9EZWNvZGVyIEgyNjNfTU9ERSB3aGlsZSByZXNDaGFuZ2VkIHdhcyBzZXQgdG8gdHJ1ZSIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiByZXNDaGFuZ2VkOworfQorCisvKiBUT0RPOiBjYW4gcmVtb3ZlIHRlbXBvcmFyeSBjb3B5IGFmdGVyIGxpYnJhcnkgc3VwcG9ydHMgd3JpdGluZyB0byBkaXNwbGF5CisgKiBidWZmZXIgWSwgVSBhbmQgViBwbGFuZSBwb2ludGVycyB1c2luZyBzdHJpZGUgaW5mby4gKi8KK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgc2l6ZV90IGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBhbGlnbihkc3RZU3RyaWRlIC8gMiwgMTYpOworICAgIHNpemVfdCBzcmNVVlN0cmlkZSA9IHNyY1lTdHJpZGUgLyAyOworICAgIHVpbnQ4X3QgKnNyY1N0YXJ0ID0gc3JjOworICAgIHVpbnQ4X3QgKmRzdFN0YXJ0ID0gZHN0OworICAgIHNpemVfdCB2U3RyaWRlID0gYWxpZ24oaGVpZ2h0LCAxNik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgICBzcmMgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKyAgICAvKiBVIGJ1ZmZlciAqLworICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGU7CisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICAvKiBWIGJ1ZmZlciAqLworICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGUgKiA1IC8gNDsKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgIHVpbnQzMl90ICpzdGFydF9jb2RlID0gKHVpbnQzMl90ICopYml0c3RyZWFtOworICAgIGJvb2wgdm9sSGVhZGVyID0gKnN0YXJ0X2NvZGUgPT0gMHhCMDAxMDAwMDsKKyAgICBpZiAodm9sSGVhZGVyKSB7CisgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgdWludDhfdCAqdm9sX2RhdGFbMV17fTsKKyAgICAgICAgaW50MzJfdCB2b2xfc2l6ZSA9IDA7CisKKyAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKyAgICAgICAgaWYgKGNvZGVjQ29uZmlnIHx8IHZvbEhlYWRlcikgeworICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBiaXRzdHJlYW07CisgICAgICAgICAgICB2b2xfc2l6ZSA9IGluU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBNUDREZWNvZGluZ01vZGUgbW9kZSA9IChtSXNNcGVnNCkgPyBNUEVHNF9NT0RFIDogSDI2M19NT0RFOworICAgICAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcigKKyAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLAorICAgICAgICAgICAgICAgIG1JbnRmLT5nZXRNYXhXaWR0aCgpLCBtSW50Zi0+Z2V0TWF4SGVpZ2h0KCksIG1vZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudD8iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgTVA0RGVjb2RpbmdNb2RlIGFjdHVhbE1vZGUgPSBQVkdldERlY0JpdHN0cmVhbU1vZGUobURlY0hhbmRsZSk7CisgICAgICAgIGlmIChtb2RlICE9IGFjdHVhbE1vZGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJEZWNvZGVkIG1vZGUgbm90IHNhbWUgYXMgYWN0dWFsIG1vZGUgb2YgdGhlIGRlY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBQVlNldFBvc3RQcm9jVHlwZShtRGVjSGFuZGxlLCAwKTsKKyAgICAgICAgaWYgKGhhbmRsZVJlc0NoYW5nZSh3b3JrKSkgeworICAgICAgICAgICAgQUxPR0koIlNldHRpbmcgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCk7CisgICAgICAgIGlmIChDMl9PSyAhPSBlcnIpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHlGcmFtZVNpemUgPSBzaXplb2YodWludDgpICogbURlY0hhbmRsZS0+c2l6ZTsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJTaXplIDwgeUZyYW1lU2l6ZSAqIDMgLyAyKXsKKyAgICAgICAgICAgIEFMT0dFKCJUb28gc21hbGwgb3V0cHV0IGJ1ZmZlcjogJXp1IGJ5dGVzIiwgbU91dHB1dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUZyYW1lc0NvbmZpZ3VyZWQpIHsKKyAgICAgICAgICAgIFBWU2V0UmVmZXJlbmNlWVVWKG1EZWNIYW5kbGUsbU91dHB1dEJ1ZmZlclsxXSk7CisgICAgICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIGhlYWRlciBjb250YWlucyBuZXcgaW5mbywgZS5nLiwgd2lkdGgvaGVpZ2h0LCBldGMuCisgICAgICAgIFZvcEhlYWRlckluZm8gaGVhZGVyX2luZm87CisgICAgICAgIHVpbnQzMl90IHVzZUV4dFRpbWVzdGFtcCA9IChpblBvcyA9PSAwKTsKKyAgICAgICAgaW50MzJfdCB0bXBJblNpemUgPSAoaW50MzJfdClpblNpemU7CisgICAgICAgIHVpbnQ4X3QgKmJpdHN0cmVhbVRtcCA9IGJpdHN0cmVhbTsKKyAgICAgICAgdWludDMyX3QgdGltZXN0YW1wID0gd29ya0luZGV4OworICAgICAgICBpZiAoUFZEZWNvZGVWb3BIZWFkZXIoCisgICAgICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsICZiaXRzdHJlYW1UbXAsICZ0aW1lc3RhbXAsICZ0bXBJblNpemUsCisgICAgICAgICAgICAgICAgICAgICZoZWFkZXJfaW5mbywgJnVzZUV4dFRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdKSAhPSBQVl9UUlVFKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2b3AgaGVhZGVyLiIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEgyNjMgZG9lc24ndCBoYXZlIFZPTCBoZWFkZXIsIHRoZSBmcmFtZSBzaXplIGluZm9ybWF0aW9uIGlzIGluIHNob3J0IGhlYWRlciwgaS5lLiB0aGUKKyAgICAgICAgLy8gZGVjb2RlciBtYXkgZGV0ZWN0IHNpemUgY2hhbmdlIGFmdGVyIFBWRGVjb2RlVm9wSGVhZGVyLgorICAgICAgICBib29sIHJlc0NoYW5nZSA9IGhhbmRsZVJlc0NoYW5nZSh3b3JrKTsKKyAgICAgICAgaWYgKG1Jc01wZWc0ICYmIHJlc0NoYW5nZSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChyZXNDaGFuZ2UpIHsKKyAgICAgICAgICAgIEFMT0dJKCJTZXR0aW5nIHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFBWRGVjb2RlVm9wQm9keShtRGVjSGFuZGxlLCAmdG1wSW5TaXplKSAhPSBQVl9UUlVFKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2aWRlbyBmcmFtZS4iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhbmRsZVJlc0NoYW5nZSh3b3JrKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgKm91dHB1dEJ1ZmZlclkgPSB3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICAodm9pZCljb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUob3V0cHV0QnVmZmVyWSwgbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZpZXcud2lkdGgoKSwgYWxpZ24obVdpZHRoLCAxNiksIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICAgICAgaW5Qb3MgKz0gaW5TaXplIC0gKHNpemVfdCl0bXBJblNpemU7CisgICAgICAgIGZpbmlzaFdvcmsod29ya0luZGV4LCB3b3JrKTsKKyAgICAgICAgKyttTnVtU2FtcGxlc091dHB1dDsKKyAgICAgICAgaWYgKGluU2l6ZSAtIGluUG9zICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRNcGVnNERlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcGVnNERlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdE1wZWc0RGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnNERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnNERlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzREZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnNERlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNmEwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfU09GVF9NUEVHNF9ERUNfSF8KKyNkZWZpbmUgQzJfU09GVF9NUEVHNF9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdE1wZWc0RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1wZWc0RGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzREZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgPSAyLAorICAgIH07CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBib29sIGhhbmRsZVJlc0NoYW5nZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dHB1dEJ1ZmZlcltrTnVtT3V0cHV0QnVmZmVyc107CisgICAgc2l6ZV90ICBtT3V0cHV0QnVmZmVyU2l6ZTsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1OdW1TYW1wbGVzT3V0cHV0OworCisgICAgYm9vbCBtSXNNcGVnNDsKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBib29sIG1GcmFtZXNDb25maWd1cmVkOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1wZWc0RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfU09GVF9NUEVHNF9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmYTU5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCkBAIC0wLDAgKzEsNjcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaWZkZWYgTVBFRzQKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcGVnNEVuYyIKKyNlbHNlCisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SDI2M0VuYyIKKyNlbmRpZgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcGVnNEVuYy5oIgorI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgTVBFRzQKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5tcGVnNC5lbmNvZGVyIjsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaDI2My5lbmNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkdSQVBISUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obVVzYWdlLCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQoMHUsIDE3NiwgMTQ0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgxNiwgMTc2LCAxNiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDE2LCAxNDQsIDE2KSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLm9uZU9mKHsxNzYsIDM1Mn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkub25lT2YoezE0NCwgMjg4fSksCisjZW5kaWYKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMTcuKSkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3JlIHJlc3RyaWN0aW9uPworICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIFNldHRlcjxkZWNsdHlwZSgqbUZyYW1lUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDA5NiwgMTIwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihCaXRyYXRlU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisjaWZkZWYgTVBFRzQKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX01QNFZfU0lNUExFLCBMRVZFTF9NUDRWXzIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9NUDRWX1NJTVBMRSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZWxzZQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfSDI2M19CQVNFTElORSwgTEVWRUxfSDI2M180NSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0gyNjNfQkFTRUxJTkUpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180NX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisgICAgfQorCisgICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYudmFsdWUgPD0gNDA5NikgeworICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSA0MDk2OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi5wcm9maWxlKS5zdXBwb3J0c0F0QWxsKG1lLnYucHJvZmlsZSkpIHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfTVA0Vl9TSU1QTEU7CisjZWxzZQorICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfSDI2M19CQVNFTElORTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmxldmVsKS5zdXBwb3J0c0F0QWxsKG1lLnYubGV2ZWwpKSB7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfTVA0Vl8yOworI2Vsc2UKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfSDI2M180NTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gZ2V0RnJhbWVSYXRlX2woKSBjb25zdCB7IHJldHVybiBtRnJhbWVSYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gZ2V0Qml0cmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGU7IH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2QoKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworfTsKKworQzJTb2Z0TXBlZzRFbmM6OkMyU29mdE1wZWc0RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtSGFuZGxlKG51bGxwdHIpLAorICAgICAgbUVuY1BhcmFtcyhudWxscHRyKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1PdXRCdWZmZXJTaXplKDUyNDI4OCkgeworfQorCitDMlNvZnRNcGVnNEVuYzo6fkMyU29mdE1wZWc0RW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6b25Jbml0KCkgeworI2lmZGVmIE1QRUc0CisgICAgbUVuY29kZU1vZGUgPSBDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTOworI2Vsc2UKKyAgICBtRW5jb2RlTW9kZSA9IEgyNjNfTU9ERTsKKyNlbmRpZgorICAgIGlmICghbUhhbmRsZSkgeworICAgICAgICBtSGFuZGxlID0gbmV3IHRhZ3ZpZGVvRW5jQ29udHJvbHM7CisgICAgfQorCisgICAgaWYgKCFtRW5jUGFyYW1zKSB7CisgICAgICAgIG1FbmNQYXJhbXMgPSBuZXcgdGFndmlkZW9FbmNPcHRpb25zOworICAgIH0KKworICAgIGlmICghKG1FbmNQYXJhbXMgJiYgbUhhbmRsZSkpIHJldHVybiBDMl9OT19NRU1PUlk7CisKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gaW5pdEVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6Om9uU3RvcCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgKHZvaWQpUFZDbGVhblVwVmlkZW9FbmNvZGVyKG1IYW5kbGUpOworICAgIH0KKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzRFbmM6Om9uUmVzZXQoKSB7CisgICAgb25TdG9wKCk7CisgICAgaW5pdEVuY29kZXIoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnNEVuYzo6b25SZWxlYXNlKCkgeworICAgIG9uU3RvcCgpOworICAgIGlmIChtRW5jUGFyYW1zKSB7CisgICAgICAgIGRlbGV0ZSBtRW5jUGFyYW1zOworICAgICAgICBtRW5jUGFyYW1zID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgZGVsZXRlIG1IYW5kbGU7CisgICAgICAgIG1IYW5kbGUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6aW5pdEVuY1BhcmFtcygpIHsKKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICBtZW1zZXQobUhhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRW5jQ29udHJvbHMpKTsKKyAgICB9IGVsc2UgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICBpZiAobUVuY1BhcmFtcykgeworICAgICAgICBtZW1zZXQobUVuY1BhcmFtcywgMCwgc2l6ZW9mKHRhZ3ZpZGVvRW5jT3B0aW9ucykpOworICAgIH0gZWxzZSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgaWYgKCFQVkdldERlZmF1bHRFbmNPcHRpb24obUVuY1BhcmFtcywgMCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgZGVmYXVsdCBlbmNvZGluZyBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgaWYgKG1GcmFtZVJhdGUtPnZhbHVlID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZyYW1lcmF0ZSBzaG91bGQgbm90IGJlIDAiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtRW5jUGFyYW1zLT5lbmNNb2RlID0gbUVuY29kZU1vZGU7CisgICAgbUVuY1BhcmFtcy0+ZW5jV2lkdGhbMF0gPSBtU2l6ZS0+d2lkdGg7CisgICAgbUVuY1BhcmFtcy0+ZW5jSGVpZ2h0WzBdID0gbVNpemUtPmhlaWdodDsKKyAgICBtRW5jUGFyYW1zLT5lbmNGcmFtZVJhdGVbMF0gPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKyAgICBtRW5jUGFyYW1zLT5yY1R5cGUgPSBWQlJfMTsKKyAgICBtRW5jUGFyYW1zLT52YnZEZWxheSA9IDUuMGY7CisgICAgbUVuY1BhcmFtcy0+cHJvZmlsZV9sZXZlbCA9IENPUkVfUFJPRklMRV9MRVZFTDI7CisgICAgbUVuY1BhcmFtcy0+cGFja2V0U2l6ZSA9IDMyOworICAgIG1FbmNQYXJhbXMtPnJ2bGNFbmFibGUgPSBQVl9PRkY7CisgICAgbUVuY1BhcmFtcy0+bnVtTGF5ZXJzID0gMTsKKyAgICBtRW5jUGFyYW1zLT50aW1lSW5jUmVzID0gMTAwMDsKKyAgICBtRW5jUGFyYW1zLT50aWNrUGVyU3JjID0gbUVuY1BhcmFtcy0+dGltZUluY1JlcyAvIChtRnJhbWVSYXRlLT52YWx1ZSArIDAuNSk7CisgICAgbUVuY1BhcmFtcy0+Yml0UmF0ZVswXSA9IG1CaXRyYXRlLT52YWx1ZTsKKyAgICBtRW5jUGFyYW1zLT5pUXVhbnRbMF0gPSAxNTsKKyAgICBtRW5jUGFyYW1zLT5wUXVhbnRbMF0gPSAxMjsKKyAgICBtRW5jUGFyYW1zLT5xdWFudFR5cGVbMF0gPSAwOworICAgIG1FbmNQYXJhbXMtPm5vRnJhbWVTa2lwcGVkID0gUFZfT0ZGOworCisgICAgLy8gUFYncyBNUEVHNCBlbmNvZGVyIHJlcXVpcmVzIHRoZSB2aWRlbyBkaW1lbnNpb24gb2YgbXVsdGlwbGUKKyAgICBpZiAobVNpemUtPndpZHRoICUgMTYgIT0gMCB8fCBtU2l6ZS0+aGVpZ2h0ICUgMTYgIT0gMCkgeworICAgICAgICBBTE9HRSgiVmlkZW8gZnJhbWUgc2l6ZSAlZHglZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYiLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIG1TaXplLT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFNldCBJRFIgZnJhbWUgcmVmcmVzaCBpbnRlcnZhbAorICAgIG1FbmNQYXJhbXMtPmludHJhUGVyaW9kID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpOworICAgIG1FbmNQYXJhbXMtPm51bUludHJhTUIgPSAwOworICAgIG1FbmNQYXJhbXMtPnNjZW5lRGV0ZWN0ID0gUFZfT047CisgICAgbUVuY1BhcmFtcy0+c2VhcmNoUmFuZ2UgPSAxNjsKKyAgICBtRW5jUGFyYW1zLT5tdjh4OEVuYWJsZSA9IFBWX09GRjsKKyAgICBtRW5jUGFyYW1zLT5nb2JIZWFkZXJJbnRlcnZhbCA9IDA7CisgICAgbUVuY1BhcmFtcy0+dXNlQUNQcmVkID0gUFZfT047CisgICAgbUVuY1BhcmFtcy0+aW50cmFEQ1ZsY1RoID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIG1TaXplID0gbUludGYtPmdldFNpemVfbCgpOworICAgICAgICBtQml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IG1JbnRmLT5nZXRGcmFtZVJhdGVfbCgpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbml0RW5jUGFyYW1zKCk7CisgICAgaWYgKEMyX09LICE9IGVycikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemVkIGVuY29kZXIgcGFyYW1zIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmICghUFZJbml0VmlkZW9FbmNvZGVyKG1IYW5kbGUsIG1FbmNQYXJhbXMpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZW5jb2RlciIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8vIDFzdCBidWZmZXIgZm9yIGNvZGVjIHNwZWNpZmljIGRhdGEKKyAgICBtTnVtSW5wdXRGcmFtZXMgPSAtMTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWc0RW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAgICBpZiAoIW1TdGFydGVkICYmIEMyX09LICE9IGluaXRFbmNvZGVyKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRCdWZmZXJTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDhfdCAqb3V0UHRyID0gKHVpbnQ4X3QgKil3Vmlldy5kYXRhKCk7CisgICAgaWYgKG1OdW1JbnB1dEZyYW1lcyA8IDApIHsKKyAgICAgICAgLy8gVGhlIHZlcnkgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBvdXRwdXQgaXMgdGhlIGNvZGVjIHNwZWNpZmljIGRhdGEuCisgICAgICAgIGludDMyX3Qgb3V0cHV0U2l6ZSA9IG1PdXRCdWZmZXJTaXplOworICAgICAgICBpZiAoIVBWR2V0Vm9sSGVhZGVyKG1IYW5kbGUsIG91dFB0ciwgJm91dHB1dFNpemUsIDApKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBWT0wgaGVhZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIkJ5dGVzIEdlbmVyYXRlZCBpbiBoZWFkZXIgJWRcbiIsIG91dHB1dFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUob3V0cHV0U2l6ZSwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBvdXRQdHIsIG91dHB1dFNpemUpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHJWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gaW5wdXRCdWZmZXI7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgaW5wdXRCdWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdOworICAgICAgICByVmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKSk7CisgICAgICAgIGlmIChyVmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCByVmlldy0+ZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy0+ZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDY0X3QgaW5wdXRUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayBpbkJ1ZmZlciA9IGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCk7CisgICAgaWYgKGluQnVmZmVyLndpZHRoKCkgPCBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5CdWZmZXIuaGVpZ2h0KCkgPCBtU2l6ZS0+aGVpZ2h0KSB7CisgICAgICAgIC8qIEV4cGVjdCB3aWR0aCBoZWlnaHQgdG8gYmUgY29uZmlndXJlZCAqLworICAgICAgICBBTE9HVygidW5leHBlY3RlZCBDYXBhY2l0eSBBc3BlY3QgJWQoJWQpIHggJWQoJWQpIiwgaW5CdWZmZXIud2lkdGgoKSwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBpbkJ1ZmZlci5oZWlnaHQoKSwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSByVmlldy0+bGF5b3V0KCk7CisgICAgdWludDhfdCAqeVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90ICp1UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXctPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIHVpbnQ4X3QgKnZQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisgICAgaW50MzJfdCB5U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOworICAgIGludDMyX3QgdVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKyAgICBpbnQzMl90IHZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb3dJbmM7CisgICAgdWludDMyX3Qgd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhbHdheXMgZXZlbiAoYXMgYmxvY2sgc2l6ZSBpcyAxNngxNikKKyAgICBDSEVDS19FUSgod2lkdGggJiAxdSksIDB1KTsKKyAgICBDSEVDS19FUSgoaGVpZ2h0ICYgMXUpLCAwdSk7CisgICAgc2l6ZV90IHlQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHdpZHRoIC8gMjsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVih5UGxhbmUsIHlTdHJpZGUsIGhlaWdodCwgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICpyVmlldy5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqclZpZXcpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiB1U3RyaWRlID09IHZTdHJpZGUKKyAgICAgICAgICAgICAgICAgICAgJiYgeVN0cmlkZSA9PSAyICogdlN0cmlkZSkgeworICAgICAgICAgICAgICAgIC8vIEk0MjAgY29tcGF0aWJsZSAtIHBsYW5lcyBhcmUgYWxyZWFkeSBzZXQgdXAgYWJvdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIE1lZGlhSW1hZ2UyIGltZyA9IENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSW1hZ2VDb3B5KGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqclZpZXcpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHdpZHRoIC8gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOgorICAgICAgICAgICAgQUxPR0UoIllVVkEgcGxhbmUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgcGxhbmUgdHlwZTogJWQiLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0hFQ0soTlVMTCAhPSB5UGxhbmUpOworICAgIC8qIEVuY29kZSBmcmFtZXMgKi8KKyAgICBWaWRlb0VuY0ZyYW1lSU8gdmluLCB2b3V0OworICAgIG1lbXNldCgmdmluLCAwLCBzaXplb2YodmluKSk7CisgICAgbWVtc2V0KCZ2b3V0LCAwLCBzaXplb2Yodm91dCkpOworICAgIHZpbi55Q2hhbiA9IHlQbGFuZTsKKyAgICB2aW4udUNoYW4gPSB1UGxhbmU7CisgICAgdmluLnZDaGFuID0gdlBsYW5lOworICAgIHZpbi50aW1lc3RhbXAgPSAoaW5wdXRUaW1lU3RhbXAgKyA1MDApIC8gMTAwMDsgIC8vIGluIG1zCisgICAgdmluLmhlaWdodCA9IGFsaWduKGhlaWdodCwgMTYpOworICAgIHZpbi5waXRjaCA9IGFsaWduKHdpZHRoLCAxNik7CisKKyAgICB1aW50MzJfdCBtb2RUaW1lTXMgPSAwOworICAgIGludDMyX3QgbkxheWVyID0gMDsKKyAgICBNUDRIaW50VHJhY2sgaGludFRyYWNrOworICAgIGludDMyX3Qgb3V0cHV0U2l6ZSA9IG1PdXRCdWZmZXJTaXplOworICAgIGlmICghUFZFbmNvZGVWaWRlb0ZyYW1lKG1IYW5kbGUsICZ2aW4sICZ2b3V0LCAmbW9kVGltZU1zLCBvdXRQdHIsICZvdXRwdXRTaXplLCAmbkxheWVyKSB8fAorICAgICAgICAhUFZHZXRIaW50VHJhY2sobUhhbmRsZSwgJmhpbnRUcmFjaykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUgb3IgZ2V0IGhpbnQgdHJhY2sgYXQgZnJhbWUgJSIgUFJJZDY0LCBtTnVtSW5wdXRGcmFtZXMpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIm91dHB1dFNpemUgZmlsbGVkIDogJWQiLCBvdXRwdXRTaXplKTsKKyAgICArK21OdW1JbnB1dEZyYW1lczsKKyAgICBDSEVDSyhOVUxMID09IFBWR2V0T3ZlcnJ1bkJ1ZmZlcihtSGFuZGxlKSk7CisKKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChvdXRwdXRTaXplKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRwdXRTaXplKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gaW5wdXRUaW1lU3RhbXA7CisgICAgICAgIGlmIChoaW50VHJhY2suQ29kZVR5cGUgPT0gMCkgeworICAgICAgICAgICAgYnVmZmVyLT5zZXRJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyQ29uZmlnOjpTWU5DX0ZSQU1FKSk7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfQorCisgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZXJhc2UoeVBsYW5lKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdE1wZWc0RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wZWc0RW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRNcGVnNEVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDYxZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9TT0ZUX01QRUc0X0VOQ19IX18KKyNkZWZpbmUgQzJfU09GVF9NUEVHNF9FTkNfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdE1wZWc0RW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1wZWc0RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNEVuYygpOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICB0YWd2aWRlb0VuY0NvbnRyb2xzICptSGFuZGxlOworICAgIHRhZ3ZpZGVvRW5jT3B0aW9ucyAgKm1FbmNQYXJhbXM7CisKKyAgICBib29sICAgICBtU3RhcnRlZDsKKyAgICBib29sICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRFcnJvcjsKKworICAgIHVpbnQzMl90IG1PdXRCdWZmZXJTaXplOworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKworICAgIGludDY0X3QgIG1OdW1JbnB1dEZyYW1lczsKKyAgICBNUDRFbmNvZGluZ01vZGUgbUVuY29kZU1vZGU7CisKKyAgICBNZW1vcnlCbG9ja1Bvb2wgbUNvbnZlcnNpb25CdWZmZXJzOworICAgIHN0ZDo6bWFwPHZvaWQgKiwgTWVtb3J5QmxvY2s+IG1Db252ZXJzaW9uQnVmZmVyc0luVXNlOworCisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNcGVnNEVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX1NPRlRfTVBFRzRfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDE0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRPcHVzRGVjLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlib3B1cyJdLAorfQorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9vcHVzZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRPcHVzRW5jLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlib3B1cyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjZDUzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE9wdXNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQzJTb2Z0T3B1c0RlYy5oIgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8b3B1cy5oPgorICAgICNpbmNsdWRlIDxvcHVzX211bHRpc3RyZWFtLmg+Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm9wdXMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdE9wdXNEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDQ4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDYwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDYwMDAsIDUxMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDk2MCAqIDYpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE9wdXNEZWM6OkMyU29mdE9wdXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY29kZXIobnVsbHB0cikgeworfQorCitDMlNvZnRPcHVzRGVjOjp+QzJTb2Z0T3B1c0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBudWxscHRyOworICAgIH0KKyAgICBtZW1zZXQoJm1IZWFkZXIsIDAsIHNpemVvZihtSGVhZGVyKSk7CisgICAgbUNvZGVjRGVsYXkgPSAwOworICAgIG1TZWVrUHJlUm9sbCA9IDA7CisgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSAwOworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRPcHVzRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBudWxscHRyOworICAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbWVtc2V0KCZtSGVhZGVyLCAwLCBzaXplb2YobUhlYWRlcikpOworICAgIG1Db2RlY0RlbGF5ID0gMDsKKyAgICBtU2Vla1ByZVJvbGwgPSAwOworICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLCBPUFVTX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtU2Vla1ByZVJvbGw7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQga1JhdGUgPSA0ODAwMDsKKworLy8gT3B1cyB1c2VzIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcsIGFuZCBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nIHNwZWNpZmllcworLy8gbWFwcGluZ3MgZm9yIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgVm9yYmlzIEkKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vd3d3LnhpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVscyA9IDg7CisKKy8vIE1heGltdW0gcGFja2V0IHNpemUgdXNlZCBpbiBYaXBoJ3Mgb3B1c2RlYy4KK3N0YXRpYyBjb25zdCBpbnQga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcyA9IDk2MCAqIDY7CisKKy8vIERlZmF1bHQgYXVkaW8gb3V0cHV0IGNoYW5uZWwgbGF5b3V0LiBVc2VkIHRvIGluaXRpYWxpemUgfHN0cmVhbV9tYXB8IGluCisvLyBPcHVzSGVhZGVyLCBhbmQgcGFzc2VkIHRvIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoKSB3aGVuIHRoZSBoZWFkZXIKKy8vIGRvZXMgbm90IGNvbnRhaW4gbWFwcGluZyBpbmZvcm1hdGlvbi4gVGhlIHZhbHVlcyBhcmUgdmFsaWQgb25seSBmb3IgbW9ubyBhbmQKKy8vIHN0ZXJlbyBvdXRwdXQ6IE9wdXMgc3RyZWFtcyB3aXRoIG1vcmUgdGhhbiAyIGNoYW5uZWxzIHJlcXVpcmUgYSBzdHJlYW0gbWFwLgorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCA9IDI7CitzdGF0aWMgY29uc3QgdWludDhfdCBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0W2tNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0XSA9IHsgMCwgMSB9OworCisKKy8vIENvbnZlcnQgbmFub3NlY29uZHMgdG8gbnVtYmVyIG9mIHNhbXBsZXMuCitzdGF0aWMgdWludDY0X3QgbnNfdG9fc2FtcGxlcyh1aW50NjRfdCBucywgaW50IHJhdGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihucykgKiByYXRlIC8gMTAwMDAwMDAwMDsKK30KKwordm9pZCBDMlNvZnRPcHVzRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPCAzKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBzaXplX3Qgb3B1c0hlYWRTaXplID0gMDsKKyAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gTlVMTDsKKyAgICAgICAgICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBOVUxMOworCisgICAgICAgICAgICBpZiAoIUdldE9wdXNIZWFkZXJCdWZmZXJzKGRhdGEsIGluU2l6ZSwgJm9wdXNIZWFkQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHVzSGVhZFNpemUsICZjb2RlY0RlbGF5QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIGVuY291bnRlcmVkIGVycm9yIGluIEdldE9wdXNIZWFkZXJCdWZmZXJzIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFQYXJzZU9wdXNIZWFkZXIoKHVpbnQ4X3QgKilvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplLCAmbUhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgUGFyc2luZyBPcHVzIEhlYWRlci4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX21hcHBpbmdba01heENoYW5uZWxzXSA9IHswfTsKKyAgICAgICAgICAgIGlmIChtSGVhZGVyLmNoYW5uZWxzIDw9IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuc3RyZWFtX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5udW1fc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLm51bV9jb3VwbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICghbURlY29kZXIgfHwgc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSBmYWlsZWQgc3RhdHVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfR0FJTihtSGVhZGVyLmdhaW5fZGIpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IE9QVVMgaGVhZGVyIGdhaW47IHN0YXR1cyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvZGVjRGVsYXlCdWYgJiYgY29kZWNEZWxheUJ1ZlNpemUgPT0gc2l6ZW9mKHVpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsdWUsIGNvZGVjRGVsYXlCdWYsIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gbnNfdG9fc2FtcGxlcyh2YWx1ZSwga1JhdGUpOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisgICAgICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZWVrUHJlUm9sbEJ1ZiAmJiBzZWVrUHJlUm9sbEJ1ZlNpemUgPT0gc2l6ZW9mKHVpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsdWUsIHNlZWtQcmVSb2xsQnVmLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGwgPSBuc190b19zYW1wbGVzKHZhbHVlLCBrUmF0ZSk7CisgICAgICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpblNpemUgPCA4KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIklucHV0IHNhbXBsZSBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZXMgPSBuc190b19zYW1wbGVzKCAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfY2FzdDx1aW50OF90ICo+IChkYXRhKSkpLCBrUmF0ZSk7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gc2FtcGxlczsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gc2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAzKSB7CisgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlcjogJWQgSHosICVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICBrUmF0ZSwgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGtSYXRlKTsKKyAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElnbm9yZSBDU0QgcmUtc3VibWlzc2lvbnMuCisgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdoZW4gc2Vla2luZyB0byB6ZXJvLCB8bUNvZGVjRGVsYXl8IHNhbXBsZXMgaGFzIHRvIGJlIGRpc2NhcmRlZAorICAgIC8vIGluc3RlYWQgb2YgfG1TZWVrUHJlUm9sbHwgc2FtcGxlcyAoYXMgd2Ugd291bGQgd2hlbiBzZWVraW5nIHRvIGFueQorICAgIC8vIG90aGVyIHRpbWVzdGFtcCkuCisgICAgaWYgKHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkgPT0gMCkgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgKiBrTWF4Q2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbnVtU2FtcGxlcyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAobnVtU2FtcGxlcyA8IDApIHsKKyAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkIG51bVNhbXBsZXMgJWQiLCBudW1TYW1wbGVzKTsKKyAgICAgICAgbnVtU2FtcGxlcyA9IDA7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IDApIHsKKyAgICAgICAgaWYgKG1TYW1wbGVzVG9EaXNjYXJkID4gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgLT0gbnVtU2FtcGxlczsKKyAgICAgICAgICAgIG51bVNhbXBsZXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtU2FtcGxlcyAtPSBtU2FtcGxlc1RvRGlzY2FyZDsKKyAgICAgICAgICAgIG91dE9mZnNldCA9IG1TYW1wbGVzVG9EaXNjYXJkICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci5jaGFubmVsczsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW1TYW1wbGVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXIuY2hhbm5lbHM7CisgICAgICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkICIsIG91dE9mZnNldCwgb3V0U2l6ZSk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdE9wdXNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0T3B1c0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRPcHVzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRPcHVzRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzE1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfT1BVU19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCBPcHVzTVNEZWNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRPcHVzRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE9wdXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciA9IDk2MCAqIDYKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBPcHVzTVNEZWNvZGVyICptRGVjb2RlcjsKKyAgICBPcHVzSGVhZGVyIG1IZWFkZXI7CisKKyAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRPcHVzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGIyNDQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApAQCAtMCwwICsxLDYzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0T3B1c0VuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorI2luY2x1ZGUgIkMyU29mdE9wdXNFbmMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVfRFVSQVRJT05fTVMgMjAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm9wdXMuZW5jb2RlciI7CisKK2NsYXNzIEMyU29mdE9wdXNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA4MDAwLCAxMjAwMCwgMTYwMDAsIDI0MDAwLCA0ODAwMH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCAxMjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDUwMCwgNTEyMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29tcGxleGl0eSwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0KDB1LCAxMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ29tcGxleGl0eSwgdmFsdWUpLmluUmFuZ2UoMSwgMTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1Db21wbGV4aXR5KT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzODQwKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENvbXBsZXhpdHkoKSBjb25zdCB7IHJldHVybiBtQ29tcGxleGl0eS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOjpvdXRwdXQ+IG1Db21wbGV4aXR5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE9wdXNFbmM6OkMyU29mdE9wdXNFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1PdXRwdXRCbG9jayhudWxscHRyKSwKKyAgICAgIG1FbmNvZGVyKG51bGxwdHIpLAorICAgICAgbUlucHV0QnVmZmVyUGNtMTYobnVsbHB0ciksCisgICAgICBtT3V0SW5kZXgoMHUpIHsKK30KKworQzJTb2Z0T3B1c0VuYzo6fkMyU29mdE9wdXNFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gaW5pdEVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6Y29uZmlndXJlRW5jb2RlcigpIHsKKyAgICB1bnNpZ25lZCBjaGFyIG1vbm9fbWFwcGluZ1syNTZdID0gezB9OworICAgIHVuc2lnbmVkIGNoYXIgc3RlcmVvX21hcHBpbmdbMjU2XSA9IHswLCAxfTsKKyAgICB1bnNpZ25lZCBjaGFyIHN1cnJvdW5kX21hcHBpbmdbMjU2XSA9IHswLCAxLCAyNTV9OworICAgIG1TYW1wbGVSYXRlID0gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworICAgIHVpbnQzMl90IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZSgpOworICAgIGludCBjb21wbGV4aXR5ID0gbUludGYtPmdldENvbXBsZXhpdHkoKTsKKyAgICBtTnVtU2FtcGxlc1BlckZyYW1lID0gbVNhbXBsZVJhdGUgLyAoMTAwMCAvIG1GcmFtZUR1cmF0aW9uTXMpOworICAgIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgPQorICAgICAgICBtQ2hhbm5lbENvdW50ICogbU51bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBpbnQgZXJyID0gQzJfT0s7CisKKyAgICB1bnNpZ25lZCBjaGFyKiBtYXBwaW5nOworICAgIGlmIChtQ2hhbm5lbENvdW50IDwgMikgeworICAgICAgICBtYXBwaW5nID0gbW9ub19tYXBwaW5nOworICAgIH0gZWxzZSBpZiAobUNoYW5uZWxDb3VudCA9PSAyKSB7CisgICAgICAgIG1hcHBpbmcgPSBzdGVyZW9fbWFwcGluZzsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXBwaW5nID0gc3Vycm91bmRfbWFwcGluZzsKKyAgICB9CisKKyAgICBpZiAobUVuY29kZXIgIT0gbnVsbHB0cikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfZGVzdHJveShtRW5jb2Rlcik7CisgICAgfQorCisgICAgbUVuY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3JlYXRlKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LAorICAgICAgICAxLCAxLCBtYXBwaW5nLCBPUFVTX0FQUExJQ0FUSU9OX0FVRElPLCAmZXJyKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgY3JlYXRlIGxpYm9wdXMgZW5jb2Rlci4gRXJyb3IgY29kZTogJWkiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8vIENvbXBsZXhpdHkKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bCgKKyAgICAgICAgICAgIG1FbmNvZGVyLCBPUFVTX1NFVF9DT01QTEVYSVRZKGNvbXBsZXhpdHkpKSAhPSBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGNvbXBsZXhpdHkiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBEVFgKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfRFRYKDApICE9IE9QVVNfT0spKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGR0eCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEFwcGxpY2F0aW9uCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsCisgICAgICAgICAgICBPUFVTX1NFVF9BUFBMSUNBVElPTihPUFVTX0FQUExJQ0FUSU9OX0FVRElPKSkgIT0gT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBhcHBsaWNhdGlvbiIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFNpZ25hbCB0eXBlCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX1NJR05BTChPUFVTX0FVVE8pKSAhPQorICAgICAgICBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHNpZ25hbCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFVuY29uc3RyYWluZWQgVkJSCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX1ZCUigwKSAhPSBPUFVTX09LKSkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCB2YnIgdHlwZSIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfVkJSX0NPTlNUUkFJTlQoMCkgIT0KKyAgICAgICAgICAgIE9QVVNfT0spKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHZiciBjb25zdHJhaW50Iik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQml0cmF0ZQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9CSVRSQVRFKGJpdHJhdGUpKSAhPQorICAgICAgICAgICAgT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBiaXRyYXRlIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gR2V0IGNvZGVjRGVsYXkKKyAgICBpbnQzMl90IGxvb2thaGVhZDsKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19HRVRfTE9PS0FIRUFEKCZsb29rYWhlYWQpKSAhPQorICAgICAgICAgICAgT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCBsb29rYWhlYWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgbUNvZGVjRGVsYXkgPSBsb29rYWhlYWQgKiAxMDAwMDAwMDAwbGwgLyBtU2FtcGxlUmF0ZTsKKworICAgIC8vIFNldCBzZWVrIHByZXJvbGwgdG8gODAgbXMKKyAgICBtU2Vla1ByZVJvbGwgPSA4MDAwMDAwMDsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSGVhZGVyR2VuZXJhdGVkID0gZmFsc2U7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUVuY29kZXJGbHVzaGVkID0gZmFsc2U7CisgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKyAgICBtRnJhbWVEdXJhdGlvbk1zID0gREVGQVVMVF9GUkFNRV9EVVJBVElPTl9NUzsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlclBjbTE2KSB7CisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTE2ID0KKyAgICAgICAgICAgIChpbnQxNl90KiltYWxsb2Moa0ZyYW1lU2l6ZSAqIGtNYXhOdW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgfQorICAgIGlmICghbUlucHV0QnVmZmVyUGNtMTYpIHJldHVybiBDMl9OT19NRU1PUlk7CisKKyAgICAvKiBEZWZhdWx0IENvbmZpZ3VyYXRpb25zICovCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gY29uZmlndXJlRW5jb2RlcigpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUVuY29kZXJGbHVzaGVkID0gZmFsc2U7CisgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisgICAgbUZpbGxlZExlbiA9IDA7CisgICAgaWYgKG1FbmNvZGVyKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiT1BVU19SRVNFVF9TVEFURSBmYWlsZWQgc3RhdHVzID0gJXMiLCBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PdXRwdXRCbG9jaykgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgbU91dHB1dEJsb2NrID0gbnVsbHB0cjsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRPcHVzRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdE9wdXNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBpZiAobUlucHV0QnVmZmVyUGNtMTYpIHsKKyAgICAgICAgZnJlZShtSW5wdXRCdWZmZXJQY20xNik7CisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTE2ID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1FbmNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9kZXN0cm95KG1FbmNvZGVyKTsKKyAgICAgICAgbUVuY29kZXIgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKKy8vIERyYWluIHRoZSBlbmNvZGVyIHRvIGdldCBsYXN0IGZyYW1lcyAoaWYgYW55KQoraW50IEMyU29mdE9wdXNFbmM6OmRyYWluRW5jb2Rlcih1aW50OF90KiBvdXRQdHIpIHsKKyAgICBtZW1zZXQoKHVpbnQ4X3QgKiltSW5wdXRCdWZmZXJQY20xNiArIG1GaWxsZWRMZW4sIDAsCisgICAgICAgIChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgIGludCBlbmNvZGVkQnl0ZXMgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZSgKKyAgICAgICAgbUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTE2LCBtTnVtU2FtcGxlc1BlckZyYW1lLCBvdXRQdHIsIGtNYXhQYXlsb2FkKTsKKyAgICBpZiAoZW5jb2RlZEJ5dGVzID4gbU91dHB1dEJsb2NrLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAlZCBieXRlcyIsCisgICAgICAgICAgICAgIG1CeXRlc0VuY29kZWQpOworICAgICAgICAvLyBhIGZhdGFsIGVycm9yIHdvdWxkIHN0b3AgdGhlIGVuY29kaW5nCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgQUxPR1YoImVuY29kZWQgJWkgT3B1cyBieXRlcyBmcm9tICV6dSBQQ00gYnl0ZXMiLCBlbmNvZGVkQnl0ZXMsCisgICAgICAgICAgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSk7CisgICAgbUVuY29kZXJGbHVzaGVkID0gdHJ1ZTsKKyAgICBtRmlsbGVkTGVuID0gMDsKKyAgICByZXR1cm4gZW5jb2RlZEJ5dGVzOworfQorCit2b2lkIEMyU29mdE9wdXNFbmM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0KKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIGlmICghbUVuY29kZXIpIHsKKyAgICAgICAgaWYgKGluaXRFbmNvZGVyKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbml0RW5jb2RlciBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUlzRmlyc3RGcmFtZSAmJiBpblNpemUgPiAwKSB7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgICAgIG1Jc0ZpcnN0RnJhbWUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soa01heFBheWxvYWQsIHVzYWdlLCAmbU91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgc2l6ZV90IHByb2Nlc3NTaXplID0gMDsKKyAgICBtQnl0ZXNFbmNvZGVkID0gMDsKKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSAwdTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICB1aW50NjRfdCBpbnB1dEluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgY29uc3QgdWludDhfdCogaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKworICAgIGNsYXNzIEZpbGxXb3JrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEZpbGxXb3JrKHVpbnQzMl90IGZsYWdzLCBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICAgICAgICAgIDogbUZsYWdzKGZsYWdzKSwgbU9yZGluYWwob3JkaW5hbCksIG1CdWZmZXIoYnVmZmVyKSB7CisgICAgICAgIH0KKyAgICAgICAgfkZpbGxXb3JrKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KW1GbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG1PcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgICAgICAgICAgaWYgKG1CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sobUJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigidGltZXN0YW1wID0gJWxsZCwgaW5kZXggPSAlbGxkLCB3LyVzIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA/ICIiIDogIm8iKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOworICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0IG1PcmRpbmFsOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3V0T3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICBpZiAoIW1IZWFkZXJHZW5lcmF0ZWQpIHsKKyAgICAgICAgdWludDhfdCBoZWFkZXJbQU9QVVNfVU5JRklFRF9DU0RfTUFYU0laRV07CisgICAgICAgIG1lbXNldChoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKyAgICAgICAgT3B1c0hlYWRlciBvcHVzSGVhZGVyOworICAgICAgICBvcHVzSGVhZGVyLmNoYW5uZWxzID0gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgb3B1c0hlYWRlci5udW1fc3RyZWFtcyA9IG1DaGFubmVsQ291bnQ7CisgICAgICAgIG9wdXNIZWFkZXIubnVtX2NvdXBsZWQgPSAwOworICAgICAgICBvcHVzSGVhZGVyLmNoYW5uZWxfbWFwcGluZyA9ICgobUNoYW5uZWxDb3VudCA+IDgpID8gMjU1IDogKG1DaGFubmVsQ291bnQgPiAyKSk7CisgICAgICAgIG9wdXNIZWFkZXIuZ2Fpbl9kYiA9IDA7CisgICAgICAgIG9wdXNIZWFkZXIuc2tpcF9zYW1wbGVzID0gMDsKKyAgICAgICAgaW50IGhlYWRlckxlbiA9IFdyaXRlT3B1c0hlYWRlcnMob3B1c0hlYWRlciwgbVNhbXBsZVJhdGUsIGhlYWRlciwKKyAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCBtQ29kZWNEZWxheSwgbVNlZWtQcmVSb2xsKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKGhlYWRlckxlbiwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHV0IGNzZCwgJWQgYnl0ZXMiLCBoZWFkZXJMZW4pOworICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBoZWFkZXIsIGhlYWRlckxlbik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKyAgICAgICAgbUhlYWRlckdlbmVyYXRlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgYnVmZmVyIHNpemUgd2hpY2ggaXMgbm90IGEgbXVsdGlwbGUgb2YgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSwgd2Ugd2lsbAorICAgICAqIGFjY3VtdWxhdGUgdGhlIGlucHV0IGFuZCBrZWVwIGl0LiBPbmNlIHRoZSBpbnB1dCBpcyBmaWxsZWQgd2l0aCBleHBlY3RlZCBudW1iZXIKKyAgICAgKiBvZiBieXRlcywgd2Ugd2lsbCBzZW5kIGl0IHRvIGVuY29kZXIuIG1GaWxsZWRMZW4gbWFuYWdlcyB0aGUgYnl0ZXMgb2YgaW5wdXQgeWV0CisgICAgICogdG8gYmUgcHJvY2Vzc2VkLiBUaGUgbmV4dCBjYWxsIHdpbGwgZmlsbCBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbgorICAgICAqIGJ5dGVzIHRvIGlucHV0IGFuZCBzZW5kIGl0IHRvIHRoZSBlbmNvZGVyLgorICAgICAqLworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90KiBwY21CeXRlcyA9IGluUHRyICsgaW5Qb3M7CisgICAgICAgIGludCBmaWxsZWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgcHJvY2Vzc1NpemUgPSBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbjsKKyAgICAgICAgICAgIG1CdWZmZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvY2Vzc1NpemUgPSBpblNpemUgLSBpblBvczsKKyAgICAgICAgICAgIG1CdWZmZXJBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQobUlucHV0QnVmZmVyUGNtMTYgKyBmaWxsZWRTYW1wbGVzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAobU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCB1bnNpZ25lZCBuSW5wdXRTYW1wbGVzID0gcHJvY2Vzc1NpemUgLyBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5JbnB1dFNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBkYXRhID0gcGNtQnl0ZXNbMiAqIGkgKyAxXSA8PCA4IHwgcGNtQnl0ZXNbMiAqIGldOworICAgICAgICAgICAgZGF0YSA9ICgoZGF0YSAmIDB4RkZGRikgXiAweDgwMDApIC0gMHg4MDAwOworICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMTZbaSArIGZpbGxlZFNhbXBsZXNdID0gZGF0YTsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBwcm9jZXNzU2l6ZTsKKyAgICAgICAgbUZpbGxlZExlbiArPSBwcm9jZXNzU2l6ZTsKKyAgICAgICAgaWYgKCFtQnVmZmVyQXZhaWxhYmxlKSBicmVhazsKKyAgICAgICAgdWludDhfdCogb3V0UHRyID0gd1ZpZXcuZGF0YSgpICsgbUJ5dGVzRW5jb2RlZDsKKyAgICAgICAgaW50IGVuY29kZWRCeXRlcyA9CisgICAgICAgICAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZShtRW5jb2RlciwgbUlucHV0QnVmZmVyUGNtMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU2FtcGxlc1BlckZyYW1lLCBvdXRQdHIsIGtNYXhQYXlsb2FkKTsKKyAgICAgICAgQUxPR1YoImVuY29kZWQgJWkgT3B1cyBieXRlcyBmcm9tICV6dSBQQ00gYnl0ZXMiLCBlbmNvZGVkQnl0ZXMsCisgICAgICAgICAgICAgIHByb2Nlc3NTaXplKTsKKworICAgICAgICBpZiAoZW5jb2RlZEJ5dGVzIDwgMCB8fCBlbmNvZGVkQnl0ZXMgPiBrTWF4UGF5bG9hZCkgeworICAgICAgICAgICAgQUxPR0UoIm9wdXNfZW5jb2RlIGZhaWxlZCwgZW5jb2RlZEJ5dGVzIDogJWQiLCBlbmNvZGVkQnl0ZXMpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICBpbnB1dEluZGV4LCB3b3JrLAorICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuY29kZWRCeXRlcyA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9CisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKG1PdXRwdXRCbG9jaywgbUJ5dGVzRW5jb2RlZCwgZW5jb2RlZEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICBtQnl0ZXNFbmNvZGVkICs9IGVuY29kZWRCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKGZpbGxlZFNhbXBsZXMgKyBuSW5wdXRTYW1wbGVzKTsKKyAgICAgICAgb3V0VGltZVN0YW1wID0KKyAgICAgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUNoYW5uZWxDb3VudCAvIG1TYW1wbGVSYXRlOworICAgICAgICBpZiAoKHByb2Nlc3NTaXplICsgbUZpbGxlZExlbikgPCBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lKQorICAgICAgICAgICAgbUVuY29kZXJGbHVzaGVkID0gdHJ1ZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorCisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBlb3MiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgIGlmICghbUVuY29kZXJGbHVzaGVkKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgICAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwgd29yaywKKyAgICAgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkcmFpbiB0aGUgZW5jb2RlciBmb3IgbGFzdCBidWZmZXIKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwocG9vbCwgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIH0KKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgICAgIEZpbGxXb3JrKChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkoZmxhZ3MpLCBvdXRPcmRpbmFsLCBidWZmZXIpKHdvcmspOworICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisgICAgbU91dHB1dEJsb2NrID0gbnVsbHB0cjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICBtQnl0ZXNFbmNvZGVkID0gMDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IG51bGxwdHI7CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soa01heFBheWxvYWQsIHVzYWdlLCAmbU91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBpbnQgZW5jQnl0ZXMgPSBkcmFpbkVuY29kZXIod1ZpZXcuZGF0YSgpKTsKKyAgICBpZiAoZW5jQnl0ZXMgPiAwKSBtQnl0ZXNFbmNvZGVkICs9IGVuY0J5dGVzOworICAgIGlmIChtQnl0ZXNFbmNvZGVkID4gMCkgeworICAgICAgICBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIobU91dHB1dEJsb2NrLCAwLCBtQnl0ZXNFbmNvZGVkKTsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC8gc2l6ZW9mKGludDE2X3QpKTsKKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIG1DaGFubmVsQ291bnQgLyBtU2FtcGxlUmF0ZTsKKyAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0KKyAgICAgICAgKEMyRnJhbWVEYXRhOjpmbGFnc190KShlb3MgPyBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNIDogMCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG91dE9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0T3B1c0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRPcHVzRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRPcHVzRW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRPcHVzRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE9wdXNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllNTI0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9PUFVTX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfT1BVU19FTkNfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2RlZmluZSBNSU4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCitzdHJ1Y3QgT3B1c01TRW5jb2RlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0T3B1c0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRPcHVzRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICAvKiBPUFVTX0ZSQU1FU0laRV8yMF9NUyAqLworICAgIGNvbnN0IGludCBrRnJhbWVTaXplID0gOTYwOworICAgIGNvbnN0IGludCBrTWF4UGF5bG9hZCA9IDQwMDA7CisgICAgY29uc3QgaW50IGtNYXhOdW1DaGFubmVscyA9IDg7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtT3V0cHV0QmxvY2s7CisKKyAgICBPcHVzTVNFbmNvZGVyKiBtRW5jb2RlcjsKKyAgICBpbnQxNl90KiBtSW5wdXRCdWZmZXJQY20xNjsKKworICAgIGJvb2wgbUhlYWRlckdlbmVyYXRlZDsKKyAgICBib29sIG1Jc0ZpcnN0RnJhbWU7CisgICAgYm9vbCBtRW5jb2RlckZsdXNoZWQ7CisgICAgYm9vbCBtQnVmZmVyQXZhaWxhYmxlOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICB1aW50MzJfdCBtQ2hhbm5lbENvdW50OworICAgIHVpbnQzMl90IG1GcmFtZUR1cmF0aW9uTXM7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICAvLyBDb2RlYyBkZWxheSBpbiBucworICAgIHVpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIC8vIFNlZWsgcHJlLXJvbGwgaW4gbnMKKyAgICB1aW50NjRfdCBtU2Vla1ByZVJvbGw7CisgICAgaW50IG1OdW1TYW1wbGVzUGVyRnJhbWU7CisgICAgaW50IG1CeXRlc0VuY29kZWQ7CisgICAgaW50MzJfdCBtRmlsbGVkTGVuOworICAgIHNpemVfdCBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1PdXRJbmRleDsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBpbnQgZHJhaW5FbmNvZGVyKHVpbnQ4X3QqIG91dFB0cik7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0T3B1c0VuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9PUFVTX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzk0NGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0UmF3RGVjLmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDJjYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFJhd0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0UmF3RGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnJhdy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0UmF3RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgMTkyMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCAxMDAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDY0ICogMTAyNCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGNtRW5jb2RpbmdJbmZvLCBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6b3V0cHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworCitDMlNvZnRSYXdEZWM6OkMyU29mdFJhd0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCkgeworfQorCitDMlNvZnRSYXdEZWM6On5DMlNvZnRSYXdEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25Jbml0KCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6b25SZWxlYXNlKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICBpZiAobVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0pOworICAgIH0KKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0UmF3RGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFJhd0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRSYXdEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFJhd0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFJhd0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmRlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0UmF3RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFJhd0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRSYXdEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0UmF3RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmNDg1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRWb3JiaXNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2b3JiaXNpZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzkzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcApAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0Vm9yYmlzRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWb3JiaXNEZWMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPFRyZW1vbG8vY29kZWNfaW50ZXJuYWwuaD4KKworICAgIGludCBfdm9yYmlzX3VucGFja19ib29rcyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2luZm8odm9yYmlzX2luZm8gKnZpLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworICAgIGludCBfdm9yYmlzX3VucGFja19jb21tZW50KHZvcmJpc19jb21tZW50ICp2YyxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMzIwMDAsIDUwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIgKiAyICogc2l6ZW9mKGludDE2X3QpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRWb3JiaXNEZWM6OkMyU29mdFZvcmJpc0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtU3RhdGUobnVsbHB0ciksCisgICAgICBtVmkobnVsbHB0cikgeworfQorCitDMlNvZnRWb3JiaXNEZWM6On5DMlNvZnRWb3JiaXNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobVZpKSB7CisgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgIG1WaSA9IG51bGxwdHI7CisgICAgfQorICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIChpbml0RGVjb2RlcigpID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQpOworfQorCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRWb3JiaXNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobVZpKSB7CisgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgIG1WaSA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1WaSA9IG5ldyB2b3JiaXNfaW5mb3t9OworICAgIGlmICghbVZpKSByZXR1cm4gTk9fTUVNT1JZOworICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisKKyAgICBtU3RhdGUgPSBuZXcgdm9yYmlzX2RzcF9zdGF0ZXt9OworICAgIGlmICghbVN0YXRlKSByZXR1cm4gTk9fTUVNT1JZOworICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKworICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1JbmZvVW5wYWNrZWQgPSBmYWxzZTsKKyAgICBtQm9va3NVbnBhY2tlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0Vm9yYmlzRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGlmIChtU3RhdGUpIHZvcmJpc19kc3BfcmVzdGFydChtU3RhdGUpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworc3RhdGljIHZvaWQgbWFrZUJpdFJlYWRlcigKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgIG9nZ19idWZmZXIgKmJ1Ziwgb2dnX3JlZmVyZW5jZSAqcmVmLCBvZ2dwYWNrX2J1ZmZlciAqYml0cykgeworICAgIGJ1Zi0+ZGF0YSA9ICh1aW50OF90ICopZGF0YTsKKyAgICBidWYtPnNpemUgPSBzaXplOworICAgIGJ1Zi0+cmVmY291bnQgPSAxOworICAgIGJ1Zi0+cHRyLm93bmVyID0gbnVsbHB0cjsKKworICAgIHJlZi0+YnVmZmVyID0gYnVmOworICAgIHJlZi0+YmVnaW4gPSAwOworICAgIHJlZi0+bGVuZ3RoID0gc2l6ZTsKKyAgICByZWYtPm5leHQgPSBudWxscHRyOworCisgICAgb2dncGFja19yZWFkaW5pdChiaXRzLCByZWYpOworfQorCisvLyAoQ0hFQ0shKSBtdWx0aWZyYW1lIGlzIHRyaWNreS4gZGVjb2RlIGNhbGwgZG9lc250IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisvLyBjb25zdW1lZCBieSB0aGUgY29tcG9uZW50LiBBbHNvIGl0IGlzIHVuY2xlYXIgd2h5IG51bVBhZ2VGcmFtZXMgaXMgYmVpbmcKKy8vIHRhZ2dlZCBhdCB0aGUgZW5kIG9mIGlucHV0IGJ1ZmZlcnMgZm9yIG5ldyBwYWdlcy4gUmVmZXIgbGluZXMgMjk3LTMwMCBpbgorLy8gU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgaW50MzJfdCBudW1DaGFubmVscyAgPSBtVmktPmNoYW5uZWxzOworICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlID0gbVZpLT5yYXRlOworICAgIGlmIChpblNpemUgPiA3ICYmICFtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgeworICAgICAgICBpZiAoKGRhdGFbMF0gIT0gMSkgJiYgKGRhdGFbMF0gIT0gNSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIHR5cGUgcmVjZWl2ZWQgJWQiLCBkYXRhWzBdKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisKKyAgICAgICAgLy8gc2tpcCA3IDx0eXBlICsgInZvcmJpcyI+IGJ5dGVzCisgICAgICAgIG1ha2VCaXRSZWFkZXIoKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgNywgaW5TaXplIC0gNywgJmJ1ZiwgJnJlZiwgJmJpdHMpOworICAgICAgICBpZiAoZGF0YVswXSA9PSAxKSB7CisgICAgICAgICAgICB2b3JiaXNfaW5mb19pbml0KG1WaSk7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKG1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIHVucGFja2luZyBpbmZvIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1WaS0+cmF0ZSAhPSBzYW1wbGluZ1JhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgbVZpLT5jaGFubmVscyAhPSBudW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ2b3JiaXM6IHJhdGUvY2hhbm5lbHMgY2hhbmdlZDogJWxkLyVkIiwgbVZpLT5yYXRlLCBtVmktPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBtVmktPmNoYW5uZWxzOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmZvVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtSW5mb1VucGFja2VkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkRhdGEgd2l0aCB0eXBlOjUgc2VudCBiZWZvcmUgc2VuZGluZyB0eXBlOjEiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcyhtVmksICZiaXRzKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSB1bnBhY2tpbmcgYm9va3MiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSB2b3JiaXNfZHNwX2luaXQobVN0YXRlLCBtVmkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIGRzcCBpbml0Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJvb2tzVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtSW5mb1VucGFja2VkIHx8ICFtQm9va3NVbnBhY2tlZCkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBDT0RFQ19DT05GSUcgZGF0YSBtSW5mb1VucGFja2VkOiAlZCBtQm9va3NVbnBhY2sgJWQiLCBtSW5mb1VucGFja2VkLCBtQm9va3NVbnBhY2tlZCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgbnVtUGFnZUZyYW1lcyA9IDA7CisgICAgaWYgKGluU2l6ZSA8IHNpemVvZihudW1QYWdlRnJhbWVzKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgaGVhZGVyIGhhcyBzaXplICV6dSwgZXhwZWN0ZWQgJXp1IiwgaW5TaXplLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtY3B5KCZudW1QYWdlRnJhbWVzLCBkYXRhICsgaW5TaXplIC0gc2l6ZW9mKG51bVBhZ2VGcmFtZXMpLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgIGluU2l6ZSAtPSBzaXplb2YobnVtUGFnZUZyYW1lcyk7CisgICAgaWYgKG51bVBhZ2VGcmFtZXMgPj0gMCkgeworICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VGcmFtZXM7CisgICAgfQorCisgICAgb2dnX2J1ZmZlciBidWY7CisgICAgYnVmLmRhdGEgPSBjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPihkYXRhKTsKKyAgICBidWYuc2l6ZSA9IGluU2l6ZTsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gYnVmLnNpemU7CisgICAgcmVmLm5leHQgPSBudWxscHRyOworCisgICAgb2dnX3BhY2tldCBwYWNrOworICAgIHBhY2sucGFja2V0ID0gJnJlZjsKKyAgICBwYWNrLmJ5dGVzID0gcmVmLmxlbmd0aDsKKyAgICBwYWNrLmJfb19zID0gMDsKKyAgICBwYWNrLmVfb19zID0gMDsKKyAgICBwYWNrLmdyYW51bGVwb3MgPSAwOworICAgIHBhY2sucGFja2V0bm8gPSAwOworCisgICAgc2l6ZV90IG1heFNhbXBsZXNJbkJ1ZmZlciA9IGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCAqIG1WaS0+Y2hhbm5lbHM7CisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0gIG1heFNhbXBsZXNJbkJ1ZmZlciAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bUZyYW1lcyA9IDA7CisgICAgaW50IHJldCA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOworICAgIGlmICgwICE9IHJldCkgeworICAgICAgICBBTE9HRCgidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQ7IGlnbm9yZWQiLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bUZyYW1lcyA9IHZvcmJpc19kc3BfcGNtb3V0KAorICAgICAgICAgICAgICAgIG1TdGF0ZSwgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckNoYW5uZWwpOworICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0QoInZvcmJpc19kc3BfcGNtb3V0IHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU51bUZyYW1lc0xlZnRPblBhZ2UgPj0gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzID4gbU51bUZyYW1lc0xlZnRPblBhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJkaXNjYXJkaW5nICVkIGZyYW1lcyBhdCBlbmQgb2YgcGFnZSIsIG51bUZyYW1lcyAtIG1OdW1GcmFtZXNMZWZ0T25QYWdlKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgICAgICB9CisgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlIC09IG51bUZyYW1lczsKKyAgICB9CisKKyAgICBpZiAobnVtRnJhbWVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbVZpLT5jaGFubmVsczsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdFZvcmJpc0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0Vm9yYmlzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY3MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB2b3JiaXNfZHNwX3N0YXRlOworc3RydWN0IHZvcmJpc19pbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWb3JiaXNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0Vm9yYmlzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZvcmJpc0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCA9IDgxOTIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9yYmlzX2RzcF9zdGF0ZSAqbVN0YXRlOworICAgIHZvcmJpc19pbmZvICptVmk7CisKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1JbmZvVW5wYWNrZWQ7CisgICAgYm9vbCBtQm9va3NVbnBhY2tlZDsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0Vm9yYmlzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZkMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDlkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFZQOSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdFZwOUVuYy5jcHAiLAorICAgICAgICAiQzJTb2Z0VnB4RW5jLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbIi1EVlA5Il0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA4ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0VnA4RW5jLmNwcCIsCisgICAgICAgICJDMlNvZnRWcHhFbmMuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlNzE3YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZwOEVuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcDhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA4LmVuY29kZXIiOworCitDMlNvZnRWcDhFbmM6OkMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IEMyU29mdFZweEVuYyhuYW1lLCBpZCwgaW50ZkltcGwpLCBtRENUUGFydGl0aW9ucygwKSwgbVByb2ZpbGUoMSkge30KKwordm9pZCBDMlNvZnRWcDhFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOF9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOEVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA4RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EQ1RQYXJ0aXRpb25zKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBkY3QgcGFydGl0aW9ucyBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgfQorICAgIHJldHVybiBjb2RlY19yZXR1cm47Cit9CisKK2NsYXNzIEMyU29mdFZwOEVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcDhFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZwOEVuYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZwOEVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZwOEVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNmYzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlA4X0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQOF9FTkNfSF9fCisKKyNpbmNsdWRlICJDMlNvZnRWcHhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBFeHBvc2VzIHZwOCBlbmNvZGVyIGFzIGEgYzIgQ29tcG9uZW50CisvLworLy8gSW4gYWRkaXRpb24gdG8gdGhlIGJhc2UgY2xhc3Mgc2V0dGluZ3MsIE9ubHkgZm9sbG93aW5nIGVuY29kZXIgc2V0dGluZ3MgYXJlCisvLyBhdmFpbGFibGU6CisvLyAgICAtIHRva2VuIHBhcnRpdGlvbmluZworc3RydWN0IEMyU29mdFZwOEVuYyA6IHB1YmxpYyBDMlNvZnRWcHhFbmMgeworICAgIEMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworIHByb3RlY3RlZDoKKyAgICAvLyBQb3B1bGF0ZXMgfG1Db2RlY0ludGVyZmFjZXwgd2l0aCBjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpOworCisgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpOworCisgICAgLy8gSW5pdGlhbGl6ZXMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZweF9jb2RlY19lcnJfdCBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKTsKKworIHByaXZhdGU6CisgICAgLy8gTWF4IHZhbHVlIHN1cHBvcnRlZCBmb3IgRENUIHBhcnRpdGlvbnMKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heERDVFBhcnRpdGlvbnMgPSAzOworCisgICAgLy8gdnA4IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCisgICAgLy8gdGhhdCBlbmFibGVzIHRva2VuIHBhcnRpdGlvbmluZyBvZgorICAgIC8vIHRoZSBzdHJlYW0gaW50byBzdWJzdHJlYW1zCisgICAgaW50MzJfdCBtRENUUGFydGl0aW9uczsKKworICAgIC8vIEMyIFByb2ZpbGUgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZwOEVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WUDhfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYxNzBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnA5RW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkMyU29mdFZwOUVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDkuZW5jb2RlciI7CisKK0MyU29mdFZwOUVuYzo6QzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogQzJTb2Z0VnB4RW5jKG5hbWUsIGlkLCBpbnRmSW1wbCksCisgICAgICBtUHJvZmlsZSgxKSwKKyAgICAgIG1MZXZlbCgwKSwKKyAgICAgIG1UaWxlQ29sdW1ucygwKSwKKyAgICAgIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcoZmFsc2UpIHsKK30KKwordm9pZCBDMlNvZnRWcDlFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOV9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOUVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA5RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2woCisgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9USUxFX0NPTFVNTlMsIG1UaWxlQ29sdW1ucyk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDlFX1NFVF9USUxFX0NPTFVNTlMgdG8gJWQuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBtVGlsZUNvbHVtbnMsIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKAorICAgICAgICAgICAgbUNvZGVjQ29udGV4dCwgVlA5RV9TRVRfRlJBTUVfUEFSQUxMRUxfREVDT0RJTkcsCisgICAgICAgICAgICBtRnJhbWVQYXJhbGxlbERlY29kaW5nKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX0ZSQU1FX1BBUkFMTEVMX0RFQ09ESU5HIHRvICVkLiIKKyAgICAgICAgICAgICAgInZweF9jb2RlY19jb250cm9sKCkgcmV0dXJuZWQgJWQiLCBtRnJhbWVQYXJhbGxlbERlY29kaW5nLAorICAgICAgICAgICAgICBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisgICAgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9ST1dfTVQsIDEpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfUk9XX01UIHRvIDEuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisKKyAgICAvLyBGb3IgVlA5LCB3ZSBhbHdheXMgc2V0IENQVV9VU0VEIHRvIDggKGJlY2F1c2UgdGhlIHJlYWx0aW1lIGRlZmF1bHQgaXMgMAorICAgIC8vIHdoaWNoIGlzIHRvbyBzbG93KS4KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsIFZQOEVfU0VUX0NQVVVTRUQsIDgpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA4RV9TRVRfQ1BVVVNFRCB0byA4LiB2cHhfY29kZWNfY29udHJvbCgpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICVkIiwgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorICAgIHJldHVybiBjb2RlY1JldHVybjsKK30KKworY2xhc3MgQzJTb2Z0VnA5RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZwOUVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnA5RW5jKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnA5RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA5RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZjhmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUDlfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlA5X0VOQ19IX18KKworI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV4cG9zZXMgdnA5IGVuY29kZXIgYXMgYSBjMiBDb21wb25lbnQKKy8vCisvLyBJbiBhZGRpdGlvbiB0byB0aGUgYmFzZSBjbGFzcyBzZXR0aW5ncywgT25seSBmb2xsb3dpbmcgZW5jb2RlciBzZXR0aW5ncyBhcmUKKy8vIGF2YWlsYWJsZToKKy8vICAgIC0gdGlsZSByb3dzCisvLyAgICAtIHRpbGUgY29sdW1ucworLy8gICAgLSBmcmFtZSBwYXJhbGxlbCBtb2RlCitzdHJ1Y3QgQzJTb2Z0VnA5RW5jIDogcHVibGljIEMyU29mdFZweEVuYyB7CisgICAgQzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgcHJvdGVjdGVkOgorICAgIC8vIFBvcHVsYXRlcyB8bUNvZGVjSW50ZXJmYWNlfCB3aXRoIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisKKyAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisKKyAgICAvLyBJbml0aWFsaXplcyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdnB4X2NvZGVjX2Vycl90IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworCisgcHJpdmF0ZToKKyAgICAvLyBDMiBQcm9maWxlICYgTGV2ZWwgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKyAgICBpbnQzMl90IG1MZXZlbCBfX3VudXNlZDsKKworICAgIGludDMyX3QgbVRpbGVDb2x1bW5zOworCisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbERlY29kaW5nOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnA5RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQOV9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMjBmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcApAQCAtMCwwICsxLDg1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnB4RGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcHhEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgVlA5Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA5LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDguZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0VnB4RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBWUDkKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4CisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBWUDkKKyAgICAgICAgLy8gVE9ETzogQWRkIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8ySERSID8/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzUpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV81LAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgbUhkcjEwUGx1c0luZm9JbnB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9JbnB1dCwgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb0lucHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvSW5wdXQsIG0udmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyMTBQbHVzSW5mb0lucHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb091dHB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgwKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb091dHB1dCkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyMTBQbHVzSW5mb091dHB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmIDAKKyAgICAgICAgLy8gc2FtcGxlIEJULjIwMjAgc3RhdGljIGluZm8KKyAgICAgICAgbUhkclN0YXRpY0luZm8gPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PigpOworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWFzdGVyaW5nID0geworICAgICAgICAgICAgLnJlZCAgID0geyAueCA9IDAuNzA4LCAgLnkgPSAwLjI5MiB9LAorICAgICAgICAgICAgLmdyZWVuID0geyAueCA9IDAuMTcwLCAgLnkgPSAwLjc5NyB9LAorICAgICAgICAgICAgLmJsdWUgID0geyAueCA9IDAuMTMxLCAgLnkgPSAwLjA0NiB9LAorICAgICAgICAgICAgLndoaXRlID0geyAueCA9IDAuMzEyNywgLnkgPSAwLjMyOTAgfSwKKyAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IDAuMSwKKyAgICAgICAgfTsKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heENsbCA9IDEwMDA7CisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhGYWxsID0gMTIwOworCisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhMdW1pbmFuY2UgPSAwOyAvLyBkaXNhYmxlIHN0YXRpYyBpbmZvCisKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCwgQzJDb2xvclh5U3RydWN0PigpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkclN0YXRpY0luZm8sIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobUhkclN0YXRpY0luZm8pCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUhkclN0YXRpY0luZm8sIG1hc3RlcmluZy5yZWQueCkuaW5SYW5nZSgwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyU3RhdGljSW5mb1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1VOVVNFRCwgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAyMDQ4dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAyMDQ4dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBnZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9JbnB1dFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisjaWZkZWYgVlA5CisjaWYgMAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4gbUhkclN0YXRpY0luZm87CisjZW5kaWYKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gbUhkcjEwUGx1c0luZm9JbnB1dDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+IG1IZHIxMFBsdXNJbmZvT3V0cHV0OworI2VuZGlmCit9OworCitDMlNvZnRWcHhEZWM6OkMyU29mdFZweERlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cikgeworfQorCitDMlNvZnRWcHhEZWM6On5DMlNvZnRWcHhEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKQorICAgIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiBUcnkgdG8gaGFyZCByZXNldCBkZWNvZGVyIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgICh2b2lkKWluaXREZWNvZGVyKCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6b25SZWxlYXNlKCkgeworICAgIGRlc3Ryb3lEZWNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUZyYW1lUGFyYWxsZWxNb2RlKSB7CisgICAgICAgIC8vIEZsdXNoIGRlY29kZXIgYnkgcGFzc2luZyBudWxscHRyIGRhdGEgcHRyIGFuZCAwIHNpemUuCisgICAgICAgIC8vIElkZWFsbHksIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuCisgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggb24yIGRlY29kZXIuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRHJvcCBhbGwgdGhlIGRlY29kZWQgZnJhbWVzIGluIGRlY29kZXIuCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB3aGlsZSAodnB4X2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKSkgeworICAgIH0KKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBpbnQgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGludCBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIGNwdUNvcmVDb3VudDsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBWUDkKKyAgICBtTW9kZSA9IE1PREVfVlA5OworI2Vsc2UKKyAgICBtTW9kZSA9IE1PREVfVlA4OworI2VuZGlmCisKKyAgICBtV2lkdGggPSAzMjA7CisgICAgbUhlaWdodCA9IDI0MDsKKyAgICBtRnJhbWVQYXJhbGxlbE1vZGUgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBtQ29kZWNDdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OworICAgIH0KKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBBTE9HRSgibUNvZGVjQ3R4IGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB2cHhfY29kZWNfZGVjX2NmZ190IGNmZzsKKyAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHZweF9jb2RlY19kZWNfY2ZnX3QpKTsKKyAgICBjZmcudGhyZWFkcyA9IEdldENQVUNvcmVDb3VudCgpOworCisgICAgdnB4X2NvZGVjX2ZsYWdzX3QgZmxhZ3M7CisgICAgbWVtc2V0KCZmbGFncywgMCwgc2l6ZW9mKHZweF9jb2RlY19mbGFnc190KSk7CisgICAgaWYgKG1GcmFtZVBhcmFsbGVsTW9kZSkgZmxhZ3MgfD0gVlBYX0NPREVDX1VTRV9GUkFNRV9USFJFQURJTkc7CisKKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2VycjsKKyAgICBpZiAoKHZweF9lcnIgPSB2cHhfY29kZWNfZGVjX2luaXQoCisgICAgICAgICAgICAgICAgIG1Db2RlY0N0eCwgbU1vZGUgPT0gTU9ERV9WUDggPyAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvIDogJnZweF9jb2RlY192cDlfZHhfYWxnbywKKyAgICAgICAgICAgICAgICAgJmNmZywgZmxhZ3MpKSkgeworICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGluaXRpYWxpemUuICglZCkiLCB2cHhfZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIGlmICAobUNvZGVjQ3R4KSB7CisgICAgICAgIHZweF9jb2RlY19kZXN0cm95KG1Db2RlY0N0eCk7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDdHg7CisgICAgICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4LCBpbnRmID0gdGhpcy0+bUludGZdKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgJiYKKyAgICAgICAgICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQgKmhkcjEwUGx1c0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6RnJvbShwYXJhbS5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IG91dFBhcmFtID0gQzJQYXJhbTo6Q29weUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXJhbS5nZXQoKSwgdHJ1ZSAvKm91dHB1dCovLCBwYXJhbS0+c3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBvdXRQYXJhbS5nZXQoKSB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpvdXRQYXJhbS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZpbmlzaFdvcms6IENvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9MCk7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgLy8gU29mdHdhcmUgVlA5IERlY29kZXIgZG9lcyBub3QgbmVlZCB0aGUgQ29kZWMgU3BlY2lmaWMgRGF0YSAoQ1NEKQorICAgIC8vIChzcGVjaWZpZWQgaW4gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdnA5L3Byb2ZpbGVzLykuIElnbm9yZSBpdCBpZgorICAgIC8vIGl0IHdhcyBwYXNzZWQuCisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIC8vIElnbm9yZSBDU0QgYnVmZmVyIGZvciBWUDkuCisgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1ZQOSkgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRvbGVyYXRlIHRoZSBDU0QgYnVmZmVyIGZvciBWUDguIFRoaXMgaXMgYSB3b3JrYXJvdW5kCisgICAgICAgICAgICAvLyBmb3IgYi8yODY4OTUzNi4gY29udGludWUKKyAgICAgICAgICAgIEFMT0dXKCJXQVJOSU5HOiBHb3QgQ1NEIGJ1ZmZlciBmb3IgVlA4LiBDb250aW51ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpOworCisgICAgaWYgKGluU2l6ZSkgeworICAgICAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKKyAgICAgICAgICAgICAgICBtQ29kZWNDdHgsIGJpdHN0cmVhbSwgaW5TaXplLCAmZnJhbWVJbmRleCwgMCk7CisgICAgICAgIGlmIChlcnIgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4gZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgICh2b2lkKW91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFpblNpemUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBzaXplX3QgZHN0WVN0cmlkZSA9IGFsaWduKHdpZHRoLCAxNik7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0WVN0cmlkZSAvIDIsIDE2KTsKKyAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OworICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7CisKKyAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7CisgICAgICAgIHNpemVfdCB4ID0gMDsKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworCisgICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOworCisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisgICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKKworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOworCisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICAgICAgdTAxID0gKnVTcmM7CisgICAgICAgICAgICB2MDEgPSAqdlNyYzsKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgc2l6ZV90IGRzdFlTaXplID0gZHN0U3RyaWRlICogaGVpZ2h0OworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFN0cmlkZSAvIDIsIDE2KTsKKyAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7CisgICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFN0cmlkZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7CisgICAgICAgICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7CisgICAgICAgICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7CisgICAgICAgIH0KKworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuOworfQorYm9vbCBDMlNvZnRWcHhEZWM6Om91dHB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspCit7CisgICAgaWYgKCEod29yayAmJiBwb29sKSkgcmV0dXJuIGZhbHNlOworCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB2cHhfaW1hZ2VfdCAqaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKTsKKworICAgIGlmICghaW1nKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaW1nLT5kX3cgIT0gbVdpZHRoIHx8IGltZy0+ZF9oICE9IG1IZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gaW1nLT5kX3c7CisgICAgICAgIG1IZWlnaHQgPSBpbWctPmRfaDsKKworICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICB9CisgICAgQ0hFQ0soaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMCB8fCBpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgaWYgKGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7CisKKyAgICAgICAgaWYgKGRlZmF1bHRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7CisgICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpLCBvdXQgZnJhbWVpbmRleCAlZCIsCisgICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwgKGludCkqKGludDY0X3QgKilpbWctPnVzZXJfcHJpdik7CisKKyAgICB1aW50OF90ICpkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CisgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07CisgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVl07CisKKyAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKCh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICB9CisgICAgZmluaXNoV29yaygqKGludDY0X3QgKilpbWctPnVzZXJfcHJpdiwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB3aGlsZSAoKG91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKSkpIHsKKyAgICB9CisKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyAmJgorICAgICAgICAgICAgd29yayAmJiB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9PSAwdSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdFZweEZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcHhGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZweERlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZweEZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZweEZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYzg0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgorI2luY2x1ZGUgInZweC92cDhkeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWcHhEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0VnB4RGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZweERlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBNT0RFX1ZQOCwKKyAgICAgICAgTU9ERV9WUDksCisgICAgfSBtTW9kZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdnB4X2NvZGVjX2N0eF90ICptQ29kZWNDdHg7CisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jayk7CisgICAgYm9vbCBvdXRwdXRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnB4RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwOWE4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwCkBAIC0wLDAgKzEsNjcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZweEVuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKworI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCisjaWZuZGVmIElOVDMyX01BWAorI2RlZmluZSBJTlQzMl9NQVggICAyMTQ3NDgzNjQ3CisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWYgMAorc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKyNlbmRpZgorCitDMlNvZnRWcHhFbmM6OkMyU29mdFZweEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDb250ZXh0KG51bGxwdHIpLAorICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbihudWxscHRyKSwKKyAgICAgIG1Db2RlY0ludGVyZmFjZShudWxscHRyKSwKKyAgICAgIG1TdHJpZGVBbGlnbigyKSwKKyAgICAgIG1Db2xvckZvcm1hdChWUFhfSU1HX0ZNVF9JNDIwKSwKKyAgICAgIG1CaXRyYXRlQ29udHJvbE1vZGUoVlBYX1ZCUiksCisgICAgICBtRXJyb3JSZXNpbGllbmNlKGZhbHNlKSwKKyAgICAgIG1NaW5RdWFudGl6ZXIoMCksCisgICAgICBtTWF4UXVhbnRpemVyKDApLAorICAgICAgbVRlbXBvcmFsTGF5ZXJzKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVyblR5cGUoVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGgoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuSWR4KDApLAorICAgICAgbUxhc3RUaW1lc3RhbXAoMHg3RkZGRkZGRkZGRkZGRkZGdWxsKSwKKyAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSB7CisgICAgbWVtc2V0KG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLCAwLCBzaXplb2YobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8pKTsKKyAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1swXSA9IDEwMDsKK30KKworQzJTb2Z0VnB4RW5jOjp+QzJTb2Z0VnB4RW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RW5jb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKwordm9pZCBDMlNvZnRWcHhFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUNvZGVjQ29udGV4dCkgeworICAgICAgICB2cHhfY29kZWNfZGVzdHJveShtQ29kZWNDb250ZXh0KTsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0NvbnRleHQ7CisgICAgICAgIG1Db2RlY0NvbnRleHQgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtQ29kZWNDb25maWd1cmF0aW9uKSB7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDb25maWd1cmF0aW9uOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyB0aGlzIG9uZSBpcyBub3QgYWxsb2NhdGVkIGJ5IHVzCisgICAgbUNvZGVjSW50ZXJmYWNlID0gbnVsbHB0cjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpvblN0b3AoKSB7CisgICAgb25SZWxlYXNlKCk7CisgICAgbUxhc3RUaW1lc3RhbXAgPSAweDdGRkZGRkZGRkZGRkZGRkZMTDsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdFZweEVuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjppbml0RW5jb2RlcigpIHsKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNfcmV0dXJuOworICAgIHN0YXR1c190IHJlc3VsdCA9IFVOS05PV05fRVJST1I7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtQml0cmF0ZU1vZGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZU1vZGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgbVJlcXVlc3RTeW5jID0gbUludGYtPmdldFJlcXVlc3RTeW5jX2woKTsKKyAgICAgICAgbVRlbXBvcmFsTGF5ZXJzID0gbUludGYtPmdldFRlbXBvcmFsTGF5ZXJzX2woKS0+bS5sYXllckNvdW50OworICAgIH0KKworICAgIHN3aXRjaCAobUJpdHJhdGVNb2RlLT52YWx1ZSkgeworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFOgorICAgICAgICAgICAgbUJpdHJhdGVDb250cm9sTW9kZSA9IFZQWF9WQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9DT05TVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1CaXRyYXRlQ29udHJvbE1vZGUgPSBWUFhfQ0JSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKTsKKyAgICBpZiAoIW1Db2RlY0ludGVyZmFjZSkgZ290byBDbGVhblVwOworCisgICAgQUxPR0QoIlZQeDogaW5pdEVuY29kZXIuIEJSTW9kZTogJXUuIFRTTGF5ZXJzOiAlenUuIEtGOiAldS4gUVA6ICV1IC0gJXUiLAorICAgICAgICAgICh1aW50MzJfdCltQml0cmF0ZUNvbnRyb2xNb2RlLCBtVGVtcG9yYWxMYXllcnMsIG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKSwKKyAgICAgICAgICBtTWluUXVhbnRpemVyLCBtTWF4UXVhbnRpemVyKTsKKworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24gPSBuZXcgdnB4X2NvZGVjX2VuY19jZmdfdDsKKyAgICBpZiAoIW1Db2RlY0NvbmZpZ3VyYXRpb24pIGdvdG8gQ2xlYW5VcDsKKyAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KG1Db2RlY0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3IgcG9wdWxhdGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHZweCBlbmNvZGVyLiIpOworICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z193ID0gbVNpemUtPndpZHRoOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfaCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy9tQ29kZWNDb25maWd1cmF0aW9uLT5nX3RocmVhZHMgPSBnZXRDcHVDb3JlQ291bnQoKTsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RocmVhZHMgPSAwOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gbUVycm9yUmVzaWxpZW5jZTsKKworICAgIC8vIHRpbWViYXNlIHVuaXQgaXMgbWljcm9zZWNvbmQKKyAgICAvLyBnX3RpbWViYXNlIGlzIGluIHNlY29uZHMgKGkuZS4gMS8xMDAwMDAwIHNlY29uZHMpCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aW1lYmFzZS5udW0gPSAxOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGltZWJhc2UuZGVuID0gMTAwMDAwMDsKKyAgICAvLyByY190YXJnZXRfYml0cmF0ZSBpcyBpbiBrYnBzLCBtQml0cmF0ZSBpbiBicHMKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9IChtQml0cmF0ZS0+dmFsdWUgKyA1MDApIC8gMTAwMDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19lbmRfdXNhZ2UgPSBtQml0cmF0ZUNvbnRyb2xNb2RlOworICAgIC8vIERpc2FibGUgZnJhbWUgZHJvcCAtIG5vdCBhbGxvd2VkIGluIE1lZGlhQ29kZWMgbm93LgorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2Ryb3BmcmFtZV90aHJlc2ggPSAwOworICAgIC8vIERpc2FibGUgbGFnZ2VkIGVuY29kaW5nLgorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfbGFnX2luX2ZyYW1lcyA9IDA7CisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICAvLyBEaXNhYmxlIHNwYXRpYWwgcmVzaXppbmcuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3Jlc2l6ZV9hbGxvd2VkID0gMDsKKyAgICAgICAgLy8gU2luZ2xlLXBhc3MgbW9kZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wYXNzID0gVlBYX1JDX09ORV9QQVNTOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0CisgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3VuZGVyc2hvb3RfcGN0ID0gMTAwOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfb3ZlcnNob290X3BjdCA9IDE1OworICAgICAgICAvLyBJbml0aWFsIHZhbHVlIG9mIHRoZSBidWZmZXIgbGV2ZWwgaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9pbml0aWFsX3N6ID0gNTAwOworICAgICAgICAvLyBBbW91bnQgb2YgZGF0YSB0aGF0IHRoZSBlbmNvZGVyIHNob3VsZCB0cnkgdG8gbWFpbnRhaW4gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9vcHRpbWFsX3N6ID0gNjAwOworICAgICAgICAvLyBUaGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgYnVmZmVyZWQgYnkgdGhlIGRlY29kaW5nCisgICAgICAgIC8vIGFwcGxpY2F0aW9uIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfc3ogPSAxMDAwOworICAgICAgICAvLyBFbmFibGUgZXJyb3IgcmVzaWxpZW5jZSAtIG5lZWRlZCBmb3IgcGFja2V0IGxvc3MuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gMTsKKyAgICAgICAgLy8gTWF4aW11bSBrZXkgZnJhbWUgaW50ZXJ2YWwgLSBmb3IgQ0JSIGJvb3N0IHRvIDMwMDAKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSAzMDAwOworICAgICAgICAvLyBFbmNvZGVyIGRldGVybWluZXMgb3B0aW1hbCBrZXkgZnJhbWUgcGxhY2VtZW50IGF1dG9tYXRpY2FsbHkuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKKyAgICB9CisKKyAgICAvLyBGcmFtZXMgdGVtcG9yYWwgcGF0dGVybiAtIGZvciBub3cgV2ViUlRDIGxpa2UgcGF0dGVybiBpcyBvbmx5IHN1cHBvcnRlZC4KKyAgICBzd2l0Y2ggKG1UZW1wb3JhbExheWVycykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsxXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsxXSA9IDE7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMV0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblszXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls1XSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls3XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMzsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzNdID0gMjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiV3JvbmcgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyAlenUiLCBtVGVtcG9yYWxMYXllcnMpOworICAgICAgICAgICAgZ290byBDbGVhblVwOworICAgIH0KKyAgICAvLyBTZXQgYml0cmF0ZSB2YWx1ZXMgZm9yIGVhY2ggbGF5ZXIKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnM7IGkrKykgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c190YXJnZXRfYml0cmF0ZVtpXSA9CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSAqCisgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSAvIDEwMDsKKyAgICB9CisgICAgaWYgKG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKSA+PSAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9taW5fZGlzdCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbW9kZSA9IFZQWF9LRl9BVVRPOworICAgIH0KKyAgICBpZiAobU1pblF1YW50aXplciA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWluX3F1YW50aXplciA9IG1NaW5RdWFudGl6ZXI7CisgICAgfQorICAgIGlmIChtTWF4UXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19tYXhfcXVhbnRpemVyID0gbU1heFF1YW50aXplcjsKKyAgICB9CisgICAgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKTsKKyAgICBtQ29kZWNDb250ZXh0ID0gbmV3IHZweF9jb2RlY19jdHhfdDsKKyAgICBpZiAoIW1Db2RlY0NvbnRleHQpIGdvdG8gQ2xlYW5VcDsKKyAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2luaXQobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgIC8vIGZsYWdzCisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluaXRpYWxpemluZyB2cHggZW5jb2RlciIpOworICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorCisgICAgLy8gRXh0cmEgQ0JSIHNldHRpbmdzCisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9TVEFUSUNfVEhSRVNIT0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiA9PSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJjX21heF9pbnRyYV90YXJnZXQgPQorICAgICAgICAgICAgICAgICh1aW50MzJfdCkobUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX29wdGltYWxfc3ogKiBtRnJhbWVSYXRlLT52YWx1ZSAvIDIwICsgMC41KTsKKyAgICAgICAgICAgIC8vIERvbid0IGdvIGJlbG93IDMgdGltZXMgcGVyIGZyYW1lIGJhbmR3aWR0aC4KKyAgICAgICAgICAgIGlmIChyY19tYXhfaW50cmFfdGFyZ2V0IDwgMzAwKSB7CisgICAgICAgICAgICAgICAgcmNfbWF4X2ludHJhX3RhcmdldCA9IDMwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuID09IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX0NQVVVTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIGNiciBwYXJhbWV0ZXJzIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICAgICAgICAgIGdvdG8gQ2xlYW5VcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvZGVjX3JldHVybiA9IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSBnb3RvIENsZWFuVXA7CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgICAgICBpZiAoKCh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCkgPgorICAgICAgICAgICAgKCh1aW50NjRfdClJTlQzMl9NQVggLyAzKSkgeworICAgICAgICAgICAgQUxPR0UoImIvMjU4MTI3OTQsIEJ1ZmZlciBzaXplIGlzIHRvbyBiaWcsIHdpZHRoPSV1LCBoZWlnaHQ9JXUuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUgPSAod2lkdGggKyBtU3RyaWRlQWxpZ24gLSAxKSAmIH4obVN0cmlkZUFsaWduIC0gMSk7CisgICAgICAgICAgICB1aW50MzJfdCB2c3RyaWRlID0gKGhlaWdodCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gTWVtb3J5QmxvY2s6OkFsbG9jYXRlKHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMik7CisgICAgICAgICAgICBpZiAoIW1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU51bUlucHV0RnJhbWVzID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitDbGVhblVwOgorICAgIG9uUmVsZWFzZSgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZweF9lbmNfZnJhbWVfZmxhZ3NfdCBDMlNvZnRWcHhFbmM6OmdldEVuY29kZUZsYWdzKCkgeworICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IDA7CisgICAgaWYgKG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPiAwKSB7CisgICAgICBpbnQgcGF0dGVybklkeCA9IG1UZW1wb3JhbFBhdHRlcm5JZHggJSBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworICAgICAgbVRlbXBvcmFsUGF0dGVybklkeCsrOworICAgICAgc3dpdGNoIChtVGVtcG9yYWxQYXR0ZXJuW3BhdHRlcm5JZHhdKSB7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0OgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVBbHRyZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZBbHRyZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbGw6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZsYWdzOworfQorCisvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgWVVWIGlucHV0IGNvbG9yIGZvcm1hdHMKKy8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBTVkMsIEFSRi4gU1ZDIGFuZCBBUkYgcmV0dXJucyBtdWx0aXBsZSBmcmFtZXMKKy8vIChoaWVyYXJjaGljYWwgLyBub3Nob3cpIGluIG9uZSBjYWxsLiBUaGVzZSBmcmFtZXMgc2hvdWxkIGJlIGNvbWJpbmVkIGluIHRvCisvLyBhIHNpbmdsZSBidWZmZXIgYW5kIHNlbnQgYmFjayB0byB0aGUgY2xpZW50Cit2b2lkIEMyU29mdFZweEVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5CisgICAgaWYgKCFtQ29kZWNDb250ZXh0ICYmIE9LICE9IGluaXRFbmNvZGVyKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHJWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gaW5wdXRCdWZmZXI7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgaW5wdXRCdWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdOworICAgICAgICByVmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAoclZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgclZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkVtcHR5IGlucHV0IEJ1ZmZlciIpOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrIGluQnVmZmVyID0KKyAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKTsKKyAgICBpZiAoaW5CdWZmZXIud2lkdGgoKSAhPSBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5CdWZmZXIuaGVpZ2h0KCkgIT0gbVNpemUtPmhlaWdodCkgeworICAgICAgICBBTE9HRSgidW5leHBlY3RlZCBJbnB1dCBidWZmZXIgYXR0cmlidXRlcyAlZCglZCkgeCAlZCglZCkiLAorICAgICAgICAgICAgICBpbkJ1ZmZlci53aWR0aCgpLCBtU2l6ZS0+d2lkdGgsIGluQnVmZmVyLmhlaWdodCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHZweF9pbWFnZV90IHJhd19mcmFtZTsKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gclZpZXctPmxheW91dCgpOworICAgIHVpbnQzMl90IHdpZHRoID0gclZpZXctPndpZHRoKCk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gclZpZXctPmhlaWdodCgpOworICAgIGlmICh3aWR0aCA+IDB4ODAwMCB8fCBoZWlnaHQgPiAweDgwMDApIHsKKyAgICAgICAgQUxPR0UoIkltYWdlIHRvbyBiaWc6ICV1IHggJXUiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQzMl90IHN0cmlkZSA9ICh3aWR0aCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICB1aW50MzJfdCB2c3RyaWRlID0gKGhlaWdodCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVihtQ29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIHN0cmlkZSwgdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCksICpyVmlldy5nZXQoKSk7CisgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyaWRlQWxpZ24sIG1Db252ZXJzaW9uQnVmZmVyLmRhdGEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqclZpZXcpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSB0aG91Z2ggd2l0aCBjdXN0b20gb2Zmc2V0IGFuZCBzdHJpZGUKKyAgICAgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmlkZUFsaWduLCAodWludDhfdCopclZpZXctPmRhdGEoKVswXSk7CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnBsYW5lc1sxXSA9ICh1aW50OF90KilyVmlldy0+ZGF0YSgpWzFdOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5wbGFuZXNbMl0gPSAodWludDhfdCopclZpZXctPmRhdGEoKVsyXTsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUuc3RyaWRlWzBdID0gbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0ucm93SW5jOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5zdHJpZGVbMV0gPSBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb3dJbmM7CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnN0cmlkZVsyXSA9IGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJvd0luYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgc3RyaWRlLCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpID49IHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkobUNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqclZpZXcpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIHN0cmlkZSwgdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJpZGVBbGlnbiwgKHVpbnQ4X3QqKXJWaWV3LT5kYXRhKClbMF0pOworICAgICAgICAgICAgICAgICAgICB2cHhfaW1nX3NldF9yZWN0KCZyYXdfZnJhbWUsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb252ZXJzaW9uIGJ1ZmZlciBpcyB0b28gc21hbGw6ICV1IHggJXUgZm9yICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCB2c3RyaWRlLCBtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSBnZXRFbmNvZGVGbGFncygpOworICAgIC8vIGhhbmRsZSBkeW5hbWljIGNvbmZpZyBwYXJhbWV0ZXJzCisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IGludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBiaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IHJlcXVlc3RTeW5jID0gbUludGYtPmdldFJlcXVlc3RTeW5jX2woKTsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKworICAgICAgICBpZiAoaW50cmFSZWZyZXNoICE9IG1JbnRyYVJlZnJlc2gpIHsKKyAgICAgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBpbnRyYVJlZnJlc2g7CisgICAgICAgICAgICBBTE9HVigiR290IG1JbnRyYVJlZnJlc2ggcmVxdWVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3RTeW5jICE9IG1SZXF1ZXN0U3luYykgeworICAgICAgICAgICAgLy8gd2UgY2FuIGhhbmRsZSBJRFIgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0U3luYy0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnNldCByZXF1ZXN0CisgICAgICAgICAgICAgICAgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQgY2xlYXJTeW5jKDB1LCBDMl9GQUxTRSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyAmY2xlYXJTeW5jIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiR290IHN5bmMgcmVxdWVzdCIpOworICAgICAgICAgICAgICAgIGZsYWdzIHw9IFZQWF9FRkxBR19GT1JDRV9LRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXF1ZXN0U3luYyA9IHJlcXVlc3RTeW5jOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gbUJpdHJhdGUpIHsKKyAgICAgICAgICAgIG1CaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlID0KKyAgICAgICAgICAgICAgICAobUJpdHJhdGUtPnZhbHVlICsgNTAwKSAvIDEwMDA7CisgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3QgcmVzID0gdnB4X2NvZGVjX2VuY19jb25maWdfc2V0KG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgidnB4IGVuY29kZXIgZmFpbGVkIHRvIHVwZGF0ZSBiaXRyYXRlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgdnB4X2NvZGVjX2Vycl90b19zdHJpbmcocmVzKSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3QgaW5wdXRUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgdWludDMyX3QgZnJhbWVEdXJhdGlvbjsKKyAgICBpZiAoaW5wdXRUaW1lU3RhbXAgPiBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KShpbnB1dFRpbWVTdGFtcCAtIG1MYXN0VGltZXN0YW1wKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVc2UgZGVmYXVsdCBvZiAzMCBmcHMgaW4gY2FzZSBvZiAwIGZyYW1lIHJhdGUuCisgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSA9IG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICBpZiAoZnJhbWVSYXRlIDwgMC4wMDEpIHsKKyAgICAgICAgICAgIGZyYW1lUmF0ZSA9IDMwOworICAgICAgICB9CisgICAgICAgIGZyYW1lRHVyYXRpb24gPSAodWludDMyX3QpKDEwMDAwMDAgLyBmcmFtZVJhdGUgKyAwLjUpOworICAgIH0KKyAgICBtTGFzdFRpbWVzdGFtcCA9IGlucHV0VGltZVN0YW1wOworCisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNvZGUobUNvZGVjQ29udGV4dCwgJnJhd19mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUR1cmF0aW9uLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFhfRExfUkVBTFRJTUUpOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJ2cHggZW5jb2RlciBmYWlsZWQgdG8gZW5jb2RlIGZyYW1lIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgcG9wdWxhdGVkID0gZmFsc2U7CisgICAgdnB4X2NvZGVjX2l0ZXJfdCBlbmNvZGVkX3BhY2tldF9pdGVyYXRvciA9IG51bGxwdHI7CisgICAgY29uc3QgdnB4X2NvZGVjX2N4X3BrdF90KiBlbmNvZGVkX3BhY2tldDsKKyAgICB3aGlsZSAoKGVuY29kZWRfcGFja2V0ID0gdnB4X2NvZGVjX2dldF9jeF9kYXRhKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCAmZW5jb2RlZF9wYWNrZXRfaXRlcmF0b3IpKSkgeworICAgICAgICBpZiAoZW5jb2RlZF9wYWNrZXQtPmtpbmQgPT0gVlBYX0NPREVDX0NYX0ZSQU1FX1BLVCkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5zeiwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbWNweSh3Vmlldy5kYXRhKCksIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLmJ1ZiwgZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuc3opOworICAgICAgICAgICAgKyttTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgICAgICAgIEFMT0dEKCJieXRlcyBnZW5lcmF0ZWQgJXp1IiwgZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuc3opOworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spOworICAgICAgICAgICAgaWYgKGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0tFWSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUucHRzOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHBvcHVsYXRlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXBvcHVsYXRlZCkgeworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTFhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUFhfRU5DX0hfXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgorI2luY2x1ZGUgInZweC92cHhfaW1hZ2UuaCIKKyNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUT0RPOiBUaGVzZSBkZWZzIHRha2VuIGZyb20gZGVwcmVjYXRlZCBPTVhfVmlkZW9FeHQuaC4gTW92ZSB0aGVzZSBkZWZpbml0aW9ucworLy8gdG8gYSBuZXcgaGVhZGVyIGZpbGUgYW5kIGluY2x1ZGUgaXQuCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgKi8KKyNkZWZpbmUgTUFYVEVNUE9SQUxMQVlFUlMgMworCisvKiogdGVtcG9yYWwgbGF5ZXIgcGF0dGVybnMgKi8KK3R5cGVkZWYgZW51bSBUZW1wb3JhbFBhdHRlcm5UeXBlIHsKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUgPSAwLAorICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDID0gMSwKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk1heCA9IDB4N0ZGRkZGRkYKK30gVGVtcG9yYWxQYXR0ZXJuVHlwZTsKKworLy8gQmFzZSBjbGFzcyBmb3IgYSBWUFggRW5jb2RlciBDb21wb25lbnQKKy8vCisvLyBPbmx5IGZvbGxvd2luZyBlbmNvZGVyIHNldHRpbmdzIGFyZSBhdmFpbGFibGUgKGNvZGVjIHNwZWNpZmljIHNldHRpbmdzIG1pZ2h0CisvLyBiZSBhdmFpbGFibGUgaW4gdGhlIHN1Yi1jbGFzc2VzKToKKy8vICAgIC0gdmlkZW8gcmVzb2x1dGlvbgorLy8gICAgLSB0YXJnZXQgYml0cmF0ZQorLy8gICAgLSByYXRlIGNvbnRyb2wgKGNvbnN0YW50IC8gdmFyaWFibGUpCisvLyAgICAtIGZyYW1lIHJhdGUKKy8vICAgIC0gZXJyb3IgcmVzaWxpZW5jZQorLy8gICAgLSByZWNvbnN0cnVjdGlvbiAmIGxvb3AgZmlsdGVycyAoZ19wcm9maWxlKQorLy8KKy8vIE9ubHkgZm9sbG93aW5nIGNvbG9yIGZvcm1hdHMgYXJlIHJlY29nbml6ZWQKKy8vICAgIC0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCCisvLyAgICAtIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkEKKy8vCisvLyBGb2xsb3dpbmcgc2V0dGluZ3MgYXJlIG5vdCBjb25maWd1cmFibGUgYnkgdGhlIGNsaWVudAorLy8gICAgLSBlbmNvZGluZyBkZWFkbGluZSBpcyByZWFsdGltZQorLy8gICAgLSBtdWx0aXRocmVhZGVkIGVuY29kaW5nIHV0aWxpemVzIGEgbnVtYmVyIG9mIHRocmVhZHMgZXF1YWwKKy8vIHRvIG9ubGluZSBjcHUncyBhdmFpbGFibGUKKy8vICAgIC0gdGhlIGFsZ29yaXRobSBpbnRlcmZhY2UgZm9yIGVuY29kZXIgaXMgZGVjaWRlZCBieSB0aGUgc3ViLWNsYXNzIGluIHVzZQorLy8gICAgLSBmcmFjdGlvbmFsIGJpdHMgb2YgZnJhbWUgcmF0ZSBpcyBkaXNjYXJkZWQKKy8vICAgIC0gdGltZXN0YW1wcyBhcmUgaW4gbWljcm9zZWNvbmRzLCB0aGVyZWZvcmUgZW5jb2RlciB0aW1lYmFzZSBpcyBmaXhlZAorLy8gdG8gMS8xMDAwMDAwCisKK3N0cnVjdCBDMlNvZnRWcHhFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0VnB4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlIGZpbmFsOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGUgZmluYWw7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlIGZpbmFsOworCisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZSBmaW5hbDsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlIGZpbmFsOworCisgcHJvdGVjdGVkOgorICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgICB2aXJ0dWFsIH5DMlNvZnRWcHhFbmMoKTsKKworICAgICAvLyBJbml0aWFsaXplcyB2cHggZW5jb2RlciB3aXRoIGF2YWlsYWJsZSBzZXR0aW5ncy4KKyAgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgICAvLyBQb3B1bGF0ZXMgbUNvZGVjSW50ZXJmYWNlIHdpdGggY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MuCisgICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBjb250cm9scy4KKyAgICAgdmlydHVhbCB2cHhfY29kZWNfZXJyX3Qgc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCkgPSAwOworCisgICAgIC8vIEdldCBjdXJyZW50IGVuY29kZSBmbGFncy4KKyAgICAgdmlydHVhbCB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZ2V0RW5jb2RlRmxhZ3MoKTsKKworICAgICBlbnVtIFRlbXBvcmFsUmVmZXJlbmNlcyB7CisgICAgICAgICAvLyBGb3IgMSBsYXllciBjYXNlOiByZWZlcmVuY2UgYWxsIChsYXN0LCBnb2xkZW4sIGFuZCBhbHQgcmVmKSwgYnV0IG9ubHkKKyAgICAgICAgIC8vIHVwZGF0ZSBsYXN0LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbCA9IDEyLAorICAgICAgICAgLy8gRmlyc3QgYmFzZSBsYXllciBmcmFtZSBmb3IgMyB0ZW1wb3JhbCBsYXllcnMsIHdoaWNoIHVwZGF0ZXMgbGFzdCBhbmQKKyAgICAgICAgIC8vIGdvbGRlbiB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWYgPSAxMSwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmID0gMTAsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmID0gOSwKKyAgICAgICAgIC8vIEJhc2UgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmID0gOCwKKyAgICAgICAgIC8vIEhpZ2hlc3QgZW5oYWNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gZ29sZGVuIHdpdGggYWx0IHJlZgorICAgICAgICAgLy8gZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZiA9IDcsCisgICAgICAgICAvLyBTZWNvbmQgbGF5ZXIgYW5kIGxhc3QgZnJhbWUgaW4gY3ljbGUsIGZvciAyIGxheWVycy4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZiA9IDYsCisgICAgICAgICAvLyBIaWdoZXN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZSA9IDUsCisgICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWYgPSA0LAorICAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgIC8vIHRoZSBzZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeSA9IDMsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbiA9IDIsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgICAvLyB0aGUgZmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeSA9IDEsCisgICAgICAgICAvLyBCYXNlIGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdCA9IDAsCisgICAgIH07CisgICAgIGVudW0geworICAgICAgICAga01heFRlbXBvcmFsUGF0dGVybiA9IDgKKyAgICAgfTsKKworICAgICAvLyB2cHggc3BlY2lmaWMgb3BhcXVlIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgICAgLy8gc3RvcmVzIGVuY29kZXIgc3RhdGUKKyAgICAgdnB4X2NvZGVjX2N0eF90KiBtQ29kZWNDb250ZXh0OworCisgICAgIC8vIHZweCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZSB0aGF0CisgICAgIC8vIHN0b3JlcyBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgdnB4X2NvZGVjX2VuY19jZmdfdCogbUNvZGVjQ29uZmlndXJhdGlvbjsKKworICAgICAvLyB2cHggc3BlY2lmaWMgcmVhZC1vbmx5IGRhdGEgc3RydWN0dXJlCisgICAgIC8vIHRoYXQgc3BlY2lmaWVzIGFsZ29yaXRobSBpbnRlcmZhY2UgKGUuZy4gdnA4KQorICAgICB2cHhfY29kZWNfaWZhY2VfdCogbUNvZGVjSW50ZXJmYWNlOworCisgICAgIC8vIGFsaWduIHN0cmlkZSB0byB0aGUgcG93ZXIgb2YgMgorICAgICBpbnQzMl90IG1TdHJpZGVBbGlnbjsKKworICAgICAvLyBDb2xvciBmb3JtYXQgZm9yIHRoZSBpbnB1dCBwb3J0CisgICAgIHZweF9pbWdfZm10X3QgbUNvbG9yRm9ybWF0OworCisgICAgIC8vIEJpdHJhdGUgY29udHJvbCBtb2RlLCBlaXRoZXIgY29uc3RhbnQgb3IgdmFyaWFibGUKKyAgICAgdnB4X3JjX21vZGUgbUJpdHJhdGVDb250cm9sTW9kZTsKKworICAgICAvLyBQYXJhbWV0ZXIgdGhhdCBkZW5vdGVzIHdoZXRoZXIgZXJyb3IgcmVzaWxpZW5jZQorICAgICAvLyBpcyBlbmFibGVkIGluIGVuY29kZXIKKyAgICAgYm9vbCBtRXJyb3JSZXNpbGllbmNlOworCisgICAgIC8vIE1pbmltdW0gKGJlc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NaW5RdWFudGl6ZXI7CisKKyAgICAgLy8gTWF4aW11bSAod29yc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NYXhRdWFudGl6ZXI7CisKKyAgICAgLy8gTnVtYmVyIG9mIGNvZGluZyB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgdXNlZC4KKyAgICAgc2l6ZV90IG1UZW1wb3JhbExheWVyczsKKworICAgICAvLyBUZW1wb3JhbCBsYXllciBiaXRyYXJlIHJhdGlvIGluIHBlcmNlbnRhZ2UKKyAgICAgdWludDMyX3QgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bTUFYVEVNUE9SQUxMQVlFUlNdOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gdHlwZQorICAgICBUZW1wb3JhbFBhdHRlcm5UeXBlIG1UZW1wb3JhbFBhdHRlcm5UeXBlOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gbGVuZ3RoCisgICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gY3VycmVudCBpbmRleAorICAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybklkeDsKKworICAgICAvLyBGcmFtZSB0eXBlIHRlbXBvcmFsIHBhdHRlcm4KKyAgICAgVGVtcG9yYWxSZWZlcmVuY2VzIG1UZW1wb3JhbFBhdHRlcm5ba01heFRlbXBvcmFsUGF0dGVybl07CisKKyAgICAgLy8gTGFzdCBpbnB1dCBidWZmZXIgdGltZXN0YW1wCisgICAgIHVpbnQ2NF90IG1MYXN0VGltZXN0YW1wOworCisgICAgIC8vIE51bWJlciBvZiBpbnB1dCBmcmFtZXMKKyAgICAgaW50NjRfdCBtTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgLy8gQ29udmVyc2lvbiBidWZmZXIgaXMgbmVlZGVkIHRvIGlucHV0IHRvCisgICAgIC8vIHl1djQyMCBwbGFuYXIgZm9ybWF0LgorICAgICBNZW1vcnlCbG9jayBtQ29udmVyc2lvbkJ1ZmZlcjsKKworICAgICAvLyBTaWduYWxsZWQgRU9TCisgICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgICAvLyBTaWduYWxsZWQgRXJyb3IKKyAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZweEVuYyk7Cit9OworCitjbGFzcyBDMlNvZnRWcHhFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpHUkFQSElDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorI2lmZGVmIFZQOQorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZU1vZGUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6QklUUkFURV9DT05TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUJpdHJhdGVNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZU1vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTGF5ZXJpbmcsIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoMHUsIDAsIDAsIDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5sYXllckNvdW50KS5pblJhbmdlKDAsIDQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmJMYXllckNvdW50KS5pblJhbmdlKDAsIDApLAorICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmJpdHJhdGVSYXRpb3MpLmluUmFuZ2UoMC4sIDEuKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTGF5ZXJpbmdTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCA0MDAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW50cmFSZWZyZXNoLCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9WUDlfMCwgTEVWRUxfVlA5XzRfMSkpCisgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgIFBST0ZJTEVfVlA5XzAKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgTEVWRUxfVlA5XzRfMSksCisgICAgICAgIH0pCisgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfVlA5XzA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfVlA5XzRfMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTGF5ZXJpbmdTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52Lm0ubGF5ZXJDb3VudCA+IDQpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm0ubGF5ZXJDb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgbWUuc2V0KCkubS5iTGF5ZXJDb3VudCA9IDA7CisgICAgICAgIC8vIGVuc3VyZSByYXRpb3MgYXJlIG1vbm90b25pYyBhbmQgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm0uYml0cmF0ZVJhdGlvc1tpeF0gPSBjMl9jbGFtcCgKKyAgICAgICAgICAgICAgICBpeCA+IDAgPyBtZS52Lm0uYml0cmF0ZVJhdGlvc1tpeCAtIDFdIDogMCwgbWUudi5tLmJpdHJhdGVSYXRpb3NbaXhdLCAxLik7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0koInNldHRpbmcgdGVtcG9yYWwgbGF5ZXJpbmcgJXUgKyAldSIsIG1lLnYubS5sYXllckNvdW50LCBtZS52Lm0uYkxheWVyQ291bnQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIHVuc2FmZSBnZXR0ZXJzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gZ2V0SW50cmFSZWZyZXNoX2woKSBjb25zdCB7IHJldHVybiBtSW50cmFSZWZyZXNoOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IGdldEJpdHJhdGVNb2RlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZU1vZGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdFN5bmM7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IGdldFRlbXBvcmFsTGF5ZXJzX2woKSBjb25zdCB7IHJldHVybiBtTGF5ZXJpbmc7IH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2QoKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gbUxheWVyaW5nOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZDU4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5NWNjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFhhYWNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJ4YWFjZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDczMGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApAQCAtMCwwICsxLDE2MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFhhYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0WGFhY0RlYy5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgLTE2LjAgICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMS4wICAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKDAuMjUpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1RfVFlQRSAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworI2RlZmluZSBSRVRVUk5fSUZfRkFUQUwocmV0dmFsLCBzdHIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJldHZhbCAmIElBX0ZBVEFMX0VSUk9SKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0UoIkVycm9yIGluICVzOiBSZXR1cm5lZDogJWQiLCBzdHIsIHJldHZhbCk7ICAgXAorICAgICAgICByZXR1cm4gcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmIChyZXR2YWwgIT0gSUFfTk9fRVJST1IpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR1coIldhcm5pbmcgaW4gJXM6IFJldHVybmVkOiAlZCIsIHN0ciwgcmV0dmFsKTsgXAorICAgIH0KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC54YWFjLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRYYWFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgNzM1MCwgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWFjRm9ybWF0LCBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1BYWNGb3JtYXRJbmZvOjppbnB1dCgwdSwgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BYWNGb3JtYXQsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX1JBVywgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUworICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1BYWNGb3JtYXQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNDb21wcmVzc01vZGUsIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjQ29tcHJlc3NNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNDb21wcmVzc01vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY1RhcmdldFJlZkxldmVsLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNUYXJnZXRSZWZMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjVGFyZ2V0UmVmTGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VuY1RhcmdldExldmVsLCBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0VuY1RhcmdldExldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFbmNUYXJnZXRMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQm9vc3RGYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQm9vc3RGYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQm9vc3RGYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0F0dGVudWF0aW9uRmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNBdHRlbnVhdGlvbkZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRWZmZWN0VHlwZSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0VmZmVjdFR5cGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT0lTWV9FTlZJUk9OTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9ESUFMT0dfRU5IQU5DRU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFZmZlY3RUeXBlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0FkdHMoKSBjb25zdCB7IHJldHVybiBtQWFjRm9ybWF0LT52YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgaW50MzJfdCBnZXREcmNDb21wcmVzc01vZGUoKSBjb25zdCB7IHJldHVybiBtRHJjQ29tcHJlc3NNb2RlLT52YWx1ZSA9PSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZID8gMSA6IDA7IH0KKyAgICBpbnQzMl90IGdldERyY1RhcmdldFJlZkxldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0VuY1RhcmdldExldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0Jvb3N0RmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0Jvb3N0RmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0F0dGVudWF0aW9uRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0F0dGVudWF0aW9uRmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0VmZmVjdFR5cGUoKSBjb25zdCB7IHJldHVybiBtRHJjRWZmZWN0VHlwZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0PiBtQWFjRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQ+IG1EcmNDb21wcmVzc01vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjVGFyZ2V0UmVmTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOjppbnB1dD4gbURyY0VuY1RhcmdldExldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dD4gbURyY0Jvb3N0RmFjdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOjppbnB1dD4gbURyY0F0dGVudWF0aW9uRmFjdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc6OmlucHV0PiBtRHJjRWZmZWN0VHlwZTsKKyAgICAvLyBUT0RPIEFkZCA6IEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZworfTsKKworQzJTb2Z0WGFhY0RlYzo6QzJTb2Z0WGFhY0RlYygKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtTXBlZ0REcmNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlcihudWxscHRyKSB7Cit9CisKK0MyU29mdFhhYWNEZWM6On5DMlNvZnRYYWFjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjpvbkluaXQoKSB7CisgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNDsKKyAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgIG1PdXRwdXRCdWZmZXIgPSBudWxscHRyOworICAgIG1TYW1wRnJlcSA9IDA7CisgICAgbU51bUNoYW5uZWxzID0gMDsKKyAgICBtUGNtV2RTeiA9IDA7CisgICAgbUNoYW5uZWxNYXNrID0gMDsKKyAgICBtTnVtT3V0Qnl0ZXMgPSAwOworICAgIG1DdXJGcmFtZUluZGV4ID0gMDsKKyAgICBtQ3VyVGltZXN0YW1wID0gMDsKKyAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtRFJDRmxhZyA9IDA7CisgICAgbU1wZWdERFJDUHJlc2VudCA9IDA7CisgICAgbU1lbW9yeVZlYy5jbGVhcigpOworICAgIG1EcmNNZW1vcnlWZWMuY2xlYXIoKTsKKworICAgIElBX0VSUk9SQ09ERSBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gSUFfTk9fRVJST1IgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKKworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjpvblN0b3AoKSB7CisgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNDsKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICAvLyByZXNldCB0aGUgImNvbmZpZ3VyZWQiIHN0YXRlCisgICAgbVNhbXBGcmVxID0gMDsKKyAgICBtTnVtQ2hhbm5lbHMgPSAwOworICAgIG1QY21XZFN6ID0gMDsKKyAgICBtQ2hhbm5lbE1hc2sgPSAwOworICAgIG1OdW1PdXRCeXRlcyA9IDA7CisgICAgbUN1ckZyYW1lSW5kZXggPSAwOworICAgIG1DdXJUaW1lc3RhbXAgPSAwOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbURSQ0ZsYWcgPSAwOworICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6b25SZWxlYXNlKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJDb2RlID0gZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyQ29kZSkgQUxPR0UoImRlSW5pdFhBQUNEZWNvZGVyKCkgZmFpbGVkICVkIiwgZXJyQ29kZSk7CisKKyAgICBlcnJDb2RlID0gZGVJbml0TVBFR0RERHJjKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVyckNvZGUpIEFMT0dFKCJkZUluaXRNUEVHREREcmMoKSBmYWlsZWQgJWQiLCBlcnJDb2RlKTsKKworICAgIGlmIChtT3V0cHV0RHJhaW5CdWZmZXIpIHsKKyAgICAgICAgZGVsZXRlW10gbU91dHB1dERyYWluQnVmZmVyOworICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXIgPSBudWxscHRyOworICAgIH0KK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIEFMT0dWKCJpbml0RGVjb2RlcigpIik7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBlcnJfY29kZSA9IGluaXRYQUFDRGVjb2RlcigpOworICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICBBTE9HRSgiaW5pdFhBQUNEZWNvZGVyIEZhaWxlZCIpOworICAgICAgICAvKiBDYWxsIGRlSW5pdCB0byBmcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgICAgIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoIW1PdXRwdXREcmFpbkJ1ZmZlcikgeworICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgY2hhcltrT3V0cHV0RHJhaW5CdWZmZXJTaXplXTsKKyAgICAgICAgaWYgKCFtT3V0cHV0RHJhaW5CdWZmZXIpIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisKKyAgICBlcnJfY29kZSA9IGluaXRYQUFDRHJjKCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgImluaXRYQUFDRHJjIik7CisKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRYYWFjRGVjOjpmaW5pc2hXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICBBTE9HVigibUN1ckZyYW1lSW5kZXggPSAlIiBQUkl1NjQsIG1DdXJGcmFtZUluZGV4KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZhaWxlZCA6IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGludDE2X3QqIG91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KHdWaWV3LmRhdGEoKSk7CisgICAgbWVtY3B5KG91dEJ1ZmZlciwgbU91dHB1dERyYWluQnVmZmVyLCBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyk7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spXSgKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID09IGMyX2NudHI2NF90KG1DdXJGcmFtZUluZGV4KSkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2gobUN1ckZyYW1lSW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9CisKKyAgICBBTE9HVigib3V0IHRpbWVzdGFtcCAlIiBQUkl1NjQgIiAvICV1IiwgbUN1clRpbWVzdGFtcCwgYmxvY2stPmNhcGFjaXR5KCkpOworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDhfdCogaW5CdWZmZXIgPSBudWxscHRyOworICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoID0gMDsKKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IHNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB2aWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIHNpemUgPSB2aWV3LmNhcGFjaXR5KCk7CisgICAgfQorICAgIGlmIChzaXplICYmIHZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB2aWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9CisgICAgICAgICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMHUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlbXB0eSBjb2RlYyBjb25maWciKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICBpbkJ1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBzaXplOworCisgICAgICAgIC8qIEdBIGhlYWRlciBjb25maWd1cmF0aW9uIHNlbnQgdG8gRGVjb2RlciEgKi8KKyAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICBBTE9HRSgiY29uZmlnWEFBQ0RlY29kZXIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DdXJGcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgbUN1clRpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIGNoYXIqIHRlbXBPdXRwdXREcmFpbkJ1ZmZlciA9IG1PdXRwdXREcmFpbkJ1ZmZlcjsKKyAgICB3aGlsZSAoc2l6ZSA+IDB1KSB7CisgICAgICAgIGlmICgoa091dHB1dERyYWluQnVmZmVyU2l6ZSAqIHNpemVvZihpbnQxNl90KSAtCisgICAgICAgICAgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MpIDwKKyAgICAgICAgICAgIChtT3V0cHV0RnJhbWVMZW5ndGggKiBzaXplb2YoaW50MTZfdCkgKiBtTnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZGVjb2RlOiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gRHJhaW5CdWZmZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImluQXR0cmlidXRlIHNpemUgPSAlenUiLCBzaXplKTsKKyAgICAgICAgaWYgKG1JbnRmLT5pc0FkdHMoKSkgeworICAgICAgICAgICAgQUxPR1YoIkFEVFMiKTsKKyAgICAgICAgICAgIHNpemVfdCBhZHRzSGVhZGVyU2l6ZSA9IDA7CisgICAgICAgICAgICAvLyBza2lwIDMwIGJpdHMsIGFhY19mcmFtZV9sZW5ndGggZm9sbG93cy4KKyAgICAgICAgICAgIC8vIHNzc3Nzc3NzIHNzc3NpaWlwIHBwZmZmZlBjIGNjb2hDQ2xsIGxsbGxsbGxsIGxsbD8/Pz8/CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFkdHNIZWFkZXIgPSB2aWV3LmRhdGEoKSArIG9mZnNldDsKKyAgICAgICAgICAgIGJvb2wgc2lnbmFsRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlenUgYnl0ZXMuIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJvb2wgcHJvdGVjdGlvbkFic2VudCA9IChhZHRzSGVhZGVyWzFdICYgMSk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgYWFjX2ZyYW1lX2xlbmd0aCA9ICgoYWR0c0hlYWRlclszXSAmIDMpIDw8IDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZHRzSGVhZGVyWzRdIDw8IDMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkdHNIZWFkZXJbNV0gPj4gNSk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IGFhY19mcmFtZV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYXVkaW8gZGF0YSBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLCBmcmFtZSBzaXplIGFjY29yZGluZyB0byB0aGUgQURUUyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIgaXMgJXUgYnl0ZXMuIiwgc2l6ZSwgYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZHRzSGVhZGVyU2l6ZSA9IChwcm90ZWN0aW9uQWJzZW50ID8gNyA6IDkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWFjX2ZyYW1lX2xlbmd0aCA8IGFkdHNIZWFkZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4oYWR0c0hlYWRlciArIGFkdHNIZWFkZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gYWFjX2ZyYW1lX2xlbmd0aCAtIGFkdHNIZWFkZXJTaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC09IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2lnbmFsRXJyb3IpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiTm9uIEFEVFMiKTsKKyAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgICAgIGluQnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90Kj4odmlldy5kYXRhKCkgKyBvZmZzZXQpOworICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgc2lnbmVkIGludCBwcmV2U2FtcGxlUmF0ZSA9IG1TYW1wRnJlcTsKKyAgICAgICAgc2lnbmVkIGludCBwcmV2TnVtQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7CisKKyAgICAgICAgLyogWEFBQyBkZWNvZGVyIGV4cGVjdHMgZmlyc3QgZnJhbWUgdG8gYmUgZmVkIHZpYSBjb25maWdYQUFDRGVjb2RlciBBUEkKKyAgICAgICAgICogd2hpY2ggc2hvdWxkIGluaXRpYWxpemUgdGhlIGNvZGVjLiBPbmNlIHRoaXMgc3RhdGUgaXMgcmVhY2hlZCwgY2FsbCB0aGUKKyAgICAgICAgICogZGVjb2RlWEFBQ1N0cmVhbSBBUEkgd2l0aCBzYW1lIGZyYW1lIHRvIGRlY29kZSEgKi8KKyAgICAgICAgaWYgKCFtSXNDb2RlY0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImNvbmZpZ1hBQUNEZWNvZGVyIEZhaWxlZCAyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG1TYW1wRnJlcSAhPSBwcmV2U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgICAgICAgICAobU51bUNoYW5uZWxzICE9IHByZXZOdW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJldlNhbXBsZVJhdGUsIG1TYW1wRnJlcSwgcHJldk51bUNoYW5uZWxzLCBtTnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBtU2FtcEZyZXEpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1OdW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2lnbmVkIGludCBieXRlc0NvbnN1bWVkID0gMDsKKyAgICAgICAgSUFfRVJST1JDT0RFIGVycm9yQ29kZSA9IElBX05PX0VSUk9SOworICAgICAgICBpZiAobUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGVycm9yQ29kZSA9IGRlY29kZVhBQUNTdHJlYW0oaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNDb25zdW1lZCwgJm1OdW1PdXRCeXRlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCkgeworICAgICAgICAgICAgQUxPR1coIkFzc3VtcHRpb24gdGhhdCBmaXJzdCBmcmFtZSBhZnRlciBoZWFkZXIgaW5pdGlhbGl6ZXMgZGVjb2RlciBGYWlsZWQhIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpemUgLT0gYnl0ZXNDb25zdW1lZDsKKyAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzQ29uc3VtZWQ7CisKKyAgICAgICAgaWYgKGluQnVmZmVyTGVuZ3RoICE9ICh1aW50MzJfdClieXRlc0NvbnN1bWVkKQorICAgICAgICAgICAgQUxPR1coIkFsbCBkYXRhIG5vdCBjb25zdW1lZCIpOworCisgICAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3IsIGRlY29kZXIgd291bGQgaGF2ZSBnaXZlbiBvdXQgZW1wdHkgYnVmZmVyICovCisgICAgICAgIGlmICgoSUFfTk9fRVJST1IgIT0gZXJyb3JDb2RlKSAmJiAoMCA9PSBtTnVtT3V0Qnl0ZXMpICYmIG1Jc0NvZGVjSW5pdGlhbGl6ZWQpCisgICAgICAgICAgICBtTnVtT3V0Qnl0ZXMgPSBtT3V0cHV0RnJhbWVMZW5ndGggKiAobVBjbVdkU3ogLyA4KSAqIG1OdW1DaGFubmVsczsKKworICAgICAgICBpZiAoIWJ5dGVzQ29uc3VtZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJieXRlc0NvbnN1bWVkID0gMCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHVpbnQzMl90KW1OdW1PdXRCeXRlcyA+CisgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggKiBzaXplb2YoaW50MTZfdCkgKiBtTnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJtTnVtT3V0Qnl0ZXMgPiBtT3V0cHV0RnJhbWVMZW5ndGggKiBzaXplb2YoaW50MTZfdCkgKiBtTnVtQ2hhbm5lbHMsIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmb3Igb3ZlcmZsb3csIEFTQU4KKyAgICAgICAgICAgIG1lbXNldChtT3V0cHV0QnVmZmVyLCAwLCBtTnVtT3V0Qnl0ZXMpOworCisgICAgICAgICAgICAvLyBEaXNjYXJkIGlucHV0IGJ1ZmZlci4KKyAgICAgICAgICAgIHNpemUgPSAwOworCisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkodGVtcE91dHB1dERyYWluQnVmZmVyLCBtT3V0cHV0QnVmZmVyLCBtTnVtT3V0Qnl0ZXMpOworICAgICAgICB0ZW1wT3V0cHV0RHJhaW5CdWZmZXIgKz0gbU51bU91dEJ5dGVzOworICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyArPSBtTnVtT3V0Qnl0ZXM7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zKSB7CisgICAgICAgIGZpbmlzaFdvcmsod29yaywgcG9vbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9CisgICAgaWYgKGVvcykgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6OmRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpjb25maWdmbHVzaERlY29kZSgpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGU7CisgICAgdWludDMyX3QgdWlfaW5pdF9kb25lOworICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoID0gODIwMzsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRkxVU0hfTUVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRkxVU0hfTUVNIik7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmZmVyTGVuZ3RoKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRkxVU0hfTUVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRkxVU0hfTUVNIik7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2luaXRfZG9uZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSIpOworCisgICAgaWYgKHVpX2luaXRfZG9uZSkgeworICAgICAgICBlcnJfY29kZSA9IGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgImdldFhBQUNTdHJlYW1JbmZvIik7CisgICAgICAgIEFMT0dWKCJGb3VuZCBDb2RlYyB3aXRoIGJlbG93IGNvbmZpZy0tLVxuc2FtcEZyZXEgJWRcbm51bUNoYW5uZWxzICVkXG5wY21XZFN6ICVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAorICAgICAgICAgICAgICAgbVNhbXBGcmVxLCBtTnVtQ2hhbm5lbHMsIG1QY21XZFN6LCBtQ2hhbm5lbE1hc2ssIG1PdXRwdXRGcmFtZUxlbmd0aCk7CisgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnZmx1c2hEZWNvZGUoKTsKKyAgICAgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gY29uZmlnZmx1c2hEZWNvZGU6IEVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICB9CisgICAgfQorICAgIGRyYWluRGVjb2RlcigpOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRyYWluRGVjb2RlcigpIHsKKyAgICAvKiBPdXRwdXQgZGVsYXkgY29tcGVuc2F0aW9uIGxvZ2ljIHNob3VsZCBzaXQgaGVyZS4gKi8KKyAgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUgYXMgWEFBQyBkZWNvZGVyIGRvZXMgbm90IGludHJvZHVjZSBvdXRwdXQgYnVmZmVyIGRlbGF5ICovCisKKyAgICByZXR1cm4gMDsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmluaXRYQUFDRGVjb2RlcigpIHsKKyAgICAvKiBGaXJzdCBwYXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogRXJyb3IgSGFuZGxlciBJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEdldCBMaWJyYXJ5IE5hbWUsIExpYnJhcnkgVmVyc2lvbiBhbmQgQVBJIFZlcnNpb24gKi8KKyAgICAvKiBJbml0aWFsaXplIEFQSSBzdHJ1Y3R1cmUgKyBEZWZhdWx0IGNvbmZpZyBzZXQgICAgICovCisgICAgLyogU2V0IGNvbmZpZyBwYXJhbXMgZnJvbSB1c2VyICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEluaXRpYWxpemUgbWVtb3J5IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBHZXQgbWVtb3J5IGluZm9ybWF0aW9uIGFuZCBhbGxvY2F0ZSBtZW1vcnkgICAgICAgICovCisKKyAgICBtSW5wdXRCdWZmZXJTaXplID0gMDsKKyAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgIG1PdXRwdXRCdWZmZXIgPSBudWxscHRyOworICAgIC8qIFByb2Nlc3Mgc3RydWN0IGluaXRpbmcgZW5kICovCisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBBUEkgc3RydWN0dXJlIGFuZCBzZXQgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0ICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBBUEkgc2l6ZSAqLworICAgIHVpbnQzMl90IHB1aV9hcGlfc2l6ZTsKKyAgICAvKiBHZXQgdGhlIEFQSSBzaXplICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB1aV9hcGlfc2l6ZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX0FQSV9TSVpFIik7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLworICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CisgICAgaWYgKCFtWGhlYWFjQ29kZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgcHVpX2FwaV9zaXplICsgNCA+PiAlZCBGYWlsZWQiLCBwdWlfYXBpX3NpemUgKyA0KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtTWVtb3J5VmVjLnB1c2gobVhoZWFhY0NvZGVjSGFuZGxlKTsKKworICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogR2V0IHRoZSBBUEkgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobnVsbHB0ciwgSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUsIDAsICZwdWlfYXBpX3NpemUpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCisgICAgbU1wZWdERHJjSGFuZGxlID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBpZiAoIW1NcGVnRERyY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibWFsbG9jIGZvciBwdWlfYXBpX3NpemUgKyA0ID4+ICVkIEZhaWxlZCIsIHB1aV9hcGlfc2l6ZSArIDQpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1NZW1vcnlWZWMucHVzaChtTXBlZ0REcmNIYW5kbGUpOworCisgICAgLyogU2V0IHRoZSBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TLCBudWxscHRyKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TIik7CisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogU2V0IGNvbmZpZyBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB1aW50MzJfdCB1aV9tcDRfZmxhZyA9IDE7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fSVNNUDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9tcDRfZmxhZyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9JU01QNCIpOworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEluaXRpYWxpemUgTWVtb3J5IGluZm8gdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgdWludDMyX3QgdWlfcHJvY19tZW1fdGFic19zaXplOworICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKyAgICAvKiBHZXQgbWVtb3J5IGluZm8gdGFibGVzIHNpemUgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKKworICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgaWYgKCFwdl9hbGxvY19wdHIpIHsKKyAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfcHJvY19tZW1fdGFic19zaXplICsgNCkgPSAlZCBmYWlsZWQhIiwgdWlfcHJvY19tZW1fdGFic19zaXplICsgNCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICAgICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2X2FsbG9jX3B0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBBUEksIHBvc3QgY29uZmlnLCBmaWxsIG1lbW9yeSB0YWJsZXMgICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBBbGxvY2F0ZSBNZW1vcnkgd2l0aCBpbmZvIGZyb20gbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCB0eXBlcyBvZiBtZW1vcmllcywgdGhhdCBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgKi8KKyAgICAvKiBwZXJzaXN0ZW50LHNjcmF0Y2gsaW5wdXQgYW5kIG91dHB1dCAqLworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGludCB1aV9zaXplID0gMCwgdWlfYWxpZ25tZW50ID0gMCwgdWlfdHlwZSA9IDA7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9zaXplKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9hbGlnbm1lbnQpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV90eXBlKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOworICAgICAgICBpZiAoIXB2X2FsbG9jX3B0cikgeworICAgICAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfc2l6ZSArIHVpX2FsaWdubWVudCkgPSAlZCBmYWlsZWQhIiwKKyAgICAgICAgICAgICAgICAgICB1aV9zaXplICsgdWlfYWxpZ25tZW50KTsKKyAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2X2FsbG9jX3B0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgICAgIGlmICh1aV90eXBlID09IElBX01FTVRZUEVfSU5QVVQpIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IChwV09SRDgpcHZfYWxsb2NfcHRyOworICAgICAgICAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IHVpX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVpX3R5cGUgPT0gSUFfTUVNVFlQRV9PVVRQVVQpCisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyID0gKHBXT1JEOClwdl9hbGxvY19wdHI7CisgICAgfQorICAgIC8qIEVuZCBmaXJzdCBwYXJ0ICovCisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEMyU29mdFhhYWNEZWM6OmluaXRYQUFDRHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIHVuc2lnbmVkIGludCB1aV9kcmNfdmFsOworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQKKyAgICBpbnQzMl90IHRhcmdldFJlZkxldmVsID0gbUludGYtPmdldERyY1RhcmdldFJlZkxldmVsKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgb2YgJWQiLCB0YXJnZXRSZWZMZXZlbCk7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpdGFyZ2V0UmVmTGV2ZWw7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCIpOworCisgICAgLyogVXNlIHVpX2RyY192YWwgZnJvbSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgb3IgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTAorICAgICAqIGZvciBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTIHRvbyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUywgJnVpX2RyY192YWwpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgaW50MzJfdCBhdHRlbnVhdGlvbkZhY3RvciA9IG1JbnRmLT5nZXREcmNBdHRlbnVhdGlvbkZhY3RvcigpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBhdHRlbnVhdGlvbiBmYWN0b3Igb2YgJWQiLCBhdHRlbnVhdGlvbkZhY3Rvcik7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpYXR0ZW51YXRpb25GYWN0b3I7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCIpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUgorICAgIGludDMyX3QgYm9vc3RGYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQm9vc3RGYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYm9vc3QgZmFjdG9yIG9mICVkIiwgYm9vc3RGYWN0b3IpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWJvb3N0RmFjdG9yOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0JPT1NUIik7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkKKyAgICBpbnQzMl90IGNvbXByZXNzTW9kZSA9IG1JbnRmLT5nZXREcmNDb21wcmVzc01vZGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzcmllZCBEUkMgaGVhdnkgY29tcHJlc3Npb24gc3dpdGNoIG9mICVkIiwgY29tcHJlc3NNb2RlKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludCljb21wcmVzc01vZGU7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0hFQVZZX0NPTVAiKTsKKworICAgIC8vIEFBQ19VTklEUkNfU0VUX0VGRkVDVAorICAgIGludDMyX3QgZWZmZWN0VHlwZSA9IG1JbnRmLT5nZXREcmNFZmZlY3RUeXBlKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIE1QRUctRCBEUkMgZWZmZWN0IHR5cGUgJWQiLCBlZmZlY3RUeXBlKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludCllZmZlY3RUeXBlOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFLCAmdWlfZHJjX3ZhbCk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRlSW5pdFhBQUNEZWNvZGVyKCkgeworICAgIEFMT0dWKCJkZUluaXRYQUFDRGVjb2RlciIpOworCisgICAgLyogRXJyb3IgY29kZSAqLworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworCisgICAgaWYgKG1YaGVhYWNDb2RlY0hhbmRsZSkgeworICAgICAgICAvKiBUZWxsIHRoYXQgdGhlIGlucHV0IGlzIG92ZXIgaW4gdGhpcyBidWZmZXIgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICB9CisKKyAgICAvKiBJcnJlc3BlY3RpdmUgb2YgZXJyb3IgcmV0dXJuZWQgaW4gSUFfQVBJX0NNRF9JTlBVVF9PVkVSLCBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1NZW1vcnlWZWMpIHsKKyAgICAgICAgaWYgKGJ1ZikgZnJlZShidWYpOworICAgIH0KKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gbnVsbHB0cjsKKworICAgIHJldHVybiBlcnJfY29kZTsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRlSW5pdE1QRUdERERyYygpIHsKKyAgICBBTE9HVigiZGVJbml0TVBFR0RERHJjIik7CisKKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1EcmNNZW1vcnlWZWMpIHsKKyAgICAgICAgaWYgKGJ1ZikgZnJlZShidWYpOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6Y29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKSB7CisgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLCBtSW5wdXRCdWZmZXJTaXplLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLyogQ29weSB0aGUgYnVmZmVyIHBhc3NlZCBieSBBbmRyb2lkIHBsdWdpbiB0byBjb2RlYyBpbnB1dCBidWZmZXIgKi8KKyAgICBtZW1jcHkobUlucHV0QnVmZmVyLCBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworCisgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZmZlckxlbmd0aCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTIik7CisKKyAgICBpZiAobUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkKSB7CisgICAgICAgIC8qIElmIGNvZGVjIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHRoZW4gR0EgaGVhZGVyIGlzIHBhc3NlZCBhZ2FpbiAqLworICAgICAgICAvKiBOZWVkIHRvIGNhbGwgdGhlIEZsdXNoIEFQSSBpbnN0ZWFkIG9mIElOSVRfUFJPQ0VTUyAqLworICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7IC8qIENvZGVjIG5lZWRzIHRvIGJlIFJlaW5pdGlhbGl6ZWQgYWZ0ZXIgZmx1c2ggKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0dBX0hEUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfR0FfSERSIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvY2VzcyAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX1BST0NFU1MiKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCB1aV9pbml0X2RvbmU7CisgICAgLyogQ2hlY2tpbmcgZm9yIGVuZCBvZiBpbml0aWFsaXphdGlvbiAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfaW5pdF9kb25lKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZIik7CisKKyAgICAvKiBIb3cgbXVjaCBidWZmZXIgaXMgdXNlZCBpbiBpbnB1dCBidWZmZXJzICovCisgICAgaW50MzJfdCBpX2J5dGVzX2NvbnN1bWVkOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NVUklEWF9JTlBVVF9CVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2J5dGVzX2NvbnN1bWVkKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiIpOworCisgICAgaWYgKHVpX2luaXRfZG9uZSkgeworICAgICAgICBlcnJfY29kZSA9IGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgImdldFhBQUNTdHJlYW1JbmZvIik7CisgICAgICAgIEFMT0dJKCJGb3VuZCBDb2RlYyB3aXRoIGJlbG93IGNvbmZpZy0tLVxuc2FtcEZyZXEgJWRcbm51bUNoYW5uZWxzICVkXG5wY21XZFN6ICVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAorICAgICAgICAgICAgICAgbVNhbXBGcmVxLCBtTnVtQ2hhbm5lbHMsIG1QY21XZFN6LCBtQ2hhbm5lbE1hc2ssIG1PdXRwdXRGcmFtZUxlbmd0aCk7CisgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgICAgIGVycl9jb2RlID0gY29uZmlnTVBFR0REcmMoKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiY29uZmlnTVBFR0REcmMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6aW5pdE1QRUdERERyYygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKFdPUkQzMikyOyBpKyspIHsKKyAgICAgICAgV09SRDMyIHVpX3NpemUsIHVpX2FsaWdubWVudCwgdWlfdHlwZTsKKyAgICAgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwgaSwgJnVpX3NpemUpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCwgaSwgJnVpX2FsaWdubWVudCk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICAgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRHJjTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCBpLCBwdl9hbGxvY19wdHIpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICB9CisKKyAgICBXT1JEMzIgdWlfc2l6ZTsKKyAgICB1aV9zaXplID0gODE5MiAqIDI7CisKKyAgICBtRHJjSW5CdWYgPSAoaW50OF90KiltZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICBpZiAobURyY0luQnVmID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNJbkJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMiwgbURyY0luQnVmKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICBtRHJjT3V0QnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNPdXRCdWYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLnB1c2gobURyY091dEJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMywgbURyY091dEJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQoraW50IEMyU29mdFhhYWNEZWM6OmNvbmZpZ01QRUdERHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIGludCBpX2VmZmVjdF90eXBlOworICAgIGludCBpX2xvdWRfbm9ybTsKKyAgICBpbnQgaV90YXJnZXRfbG91ZG5lc3M7CisgICAgdW5zaWduZWQgaW50IGlfc2JyX21vZGU7CisgICAgdWludDMyX3QgdWlfcHJvY19tZW1fdGFic19zaXplID0gMDsKKyAgICBwVk9JRCBwdl9hbGxvY19wdHIgPSBOVUxMOworCisgICAgLyogU2FtcGxpbmcgRnJlcXVlbmN5ICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX1NBTVBfRlJFUSwgJm1TYW1wRnJlcSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRIik7CisgICAgLyogVG90YWwgTnVtYmVyIG9mIENoYW5uZWxzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJm1OdW1DaGFubmVscyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisKKyAgICAvKiBQQ00gd29yZCBzaXplICAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiwgJm1QY21XZFN6KTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworCisgICAgLypTZXQgRWZmZWN0IFR5cGUqLworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSwgJmlfZWZmZWN0X3R5cGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgLypTZXQgdGFyZ2V0IGxvdWRuZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgLypTZXQgbG91ZF9ub3JtX2ZsYWcqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLCAmaV9zYnJfbW9kZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFIik7CisKKyAgICAvKiBHZXQgbWVtb3J5IGluZm8gdGFibGVzIHNpemUgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFIik7CisKKyAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1lbXNldChwdl9hbGxvY19wdHIsIDAsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZfYWxsb2NfcHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywgbnVsbHB0cik7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qIEZyZWUgYW55IG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCBmb3IgTVBFRyBEIERyYyBzbyBmYXIgKi8KKyAgICBkZUluaXRNUEVHREREcmMoKTsKKworICAgIGVycl9jb2RlID0gaW5pdE1QRUdERERyYygpOworICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICBBTE9HRSgiaW5pdE1QRUdERERyYyBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgZGVJbml0TVBFR0RERHJjKCk7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgICB9CisKKyAgICAvKiBEUkMgYnVmZmVycworICAgICAgICBidWZbMF0gLSBjb250YWlucyBleHRlbnNpb24gZWxlbWVudCBwYXkgbG9hZCBsb3VkbmVzcyByZWxhdGVkCisgICAgICAgIGJ1ZlsxXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkKi8KKyAgICB7CisgICAgICAgIFZPSUQqIHBfYXJyYXlbMl1bMTZdOworICAgICAgICBXT1JEMzIgaWk7CisgICAgICAgIFdPUkQzMiBidWZfc2l6ZXNbMl1bMTZdOworICAgICAgICBXT1JEMzIgbnVtX2VsZW1lbnRzOworICAgICAgICBXT1JEMzIgbnVtX2NvbmZpZ19leHQ7CisgICAgICAgIFdPUkQzMiBiaXRfc3RyX2ZtdCA9IDE7CisKKyAgICAgICAgV09SRDMyIHVvX251bV9jaGFuOworCisgICAgICAgIG1lbXNldChidWZfc2l6ZXMsIDAsIDMyICogc2l6ZW9mKFdPUkQzMikpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX0JVRl9TSVpFUywgJmJ1Zl9zaXplc1swXVswXSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX0JVRl9TSVpFUyIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX1BUUiwgJnBfYXJyYXkpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfRVhUX0VMRV9QVFIiKTsKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwgSUFfQ01EX1RZUEVfSU5JVF9TRVRfQlVGRl9QVFIsIG51bGxwdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX1NFVF9CVUZGX1BUUiIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fRUxFLCAmbnVtX2VsZW1lbnRzKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9FTEUiKTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfTlVNX0NPTkZJR19FWFQsICZudW1fY29uZmlnX2V4dCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fQ09ORklHX0VYVCIpOworCisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG51bV9jb25maWdfZXh0OyBpaSsrKSB7CisgICAgICAgICAgICAvKmNvcHkgbG91ZG5lc3MgYml0c3RyZWFtKi8KKyAgICAgICAgICAgIGlmIChidWZfc2l6ZXNbMF1baWldID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXlbMF1baWldLCBidWZfc2l6ZXNbMF1baWldKTsKKworICAgICAgICAgICAgICAgIC8qU2V0IGJpdHN0cmVhbV9zcGxpdF9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQsICZiaXRfc3RyX2ZtdCk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lMX0JTLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9zaXplc1swXVtpaV0pOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lMX0JTIik7CisKKyAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUxfQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQ1BZX0lMX0JTRl9CVUZGIik7CisKKyAgICAgICAgICAgICAgICBtRFJDRmxhZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBudW1fZWxlbWVudHM7IGlpKyspIHsKKyAgICAgICAgICAgIC8qY29weSBjb25maWcgYml0c3RyZWFtKi8KKyAgICAgICAgICAgIGlmIChidWZfc2l6ZXNbMV1baWldID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXlbMV1baWldLCBidWZfc2l6ZXNbMV1baWldKTsKKyAgICAgICAgICAgICAgICAvKiBTZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2Nlc3NlZCAqLworCisgICAgICAgICAgICAgICAgLypTZXQgYml0c3RyZWFtX3NwbGl0X2Zvcm1hdCAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lDX0JTLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9zaXplc1sxXVtpaV0pOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lDX0JTIik7CisKKyAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUNfQlNGX0JVRkYsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUNfQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgICAgIG1EUkNGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRFJDRmxhZyA9PSAxKSB7CisgICAgICAgICAgICBtTXBlZ0REUkNQcmVzZW50ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLypSZWFkIGludGVyZmFjZSBidWZmZXIgY29uZmlnIGZpbGUgYml0c3RyZWFtKi8KKyAgICAgICAgaWYgKG1NcGVnRERSQ1ByZXNlbnQgPT0gMSkgeworICAgICAgICAgICAgV09SRDMyIGludGVyZmFjZV9pc19wcmVzZW50ID0gMTsKKworICAgICAgICAgICAgaWYgKGlfc2JyX21vZGUgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpX3Nicl9tb2RlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMjA0ODsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlfc2JyX21vZGUgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSA0MDk2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSA0MDk2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9GUkFNRV9TSVpFLCAoV09SRDMyICopJm1PdXRwdXRGcmFtZUxlbmd0aCk7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9GUkFNRV9TSVpFIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9JTlRfUFJFU0VOVCwgJmludGVyZmFjZV9pc19wcmVzZW50KTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0lOVF9QUkVTRU5UIik7CisKKyAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSU5fQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSU5fQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTLCBudWxscHRyKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUyIpOworCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsICZ1b19udW1fY2hhbik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnJfY29kZTsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcykgeworICAgIGlmIChtSW5wdXRCdWZmZXJTaXplIDwgaW5CdWZmZXJMZW5ndGgpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25maWcgQUFDLCBpbnB1dCBidWZmZXIgc2l6ZSAlZCA8IGluQnVmZmVyTGVuZ3RoICVkIiwgbUlucHV0QnVmZmVyU2l6ZSwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIENvcHkgdGhlIGJ1ZmZlciBwYXNzZWQgYnkgQW5kcm9pZCBwbHVnaW4gdG8gY29kZWMgaW5wdXQgYnVmZmVyICovCisgICAgbWVtY3B5KG1JbnB1dEJ1ZmZlciwgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZmZXJMZW5ndGgpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9ET19FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSIpOworCisgICAgLyogQ2hlY2tpbmcgZm9yIGVuZCBvZiBwcm9jZXNzaW5nICovCisgICAgdWludDMyX3QgdWlfZXhlY19kb25lOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfRVhFQ1VURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRE9ORV9RVUVSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2V4ZWNfZG9uZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0RPTkVfUVVFUlkiKTsKKworICAgIGlmICh1aV9leGVjX2RvbmUgIT0gMSkgeworICAgICAgICBWT0lEKiBwX2FycmF5OyAgICAgICAgLy8gSVRUSUFNOmJ1ZmZlciB0byBoYW5kbGUgZ2FpbiBwYXlsb2FkCisgICAgICAgIFdPUkQzMiBidWZfc2l6ZSA9IDA7ICAvLyBJVFRJQU06Z2FpbiBwYXlsb2FkIGxlbmd0aAorICAgICAgICBXT1JEMzIgYml0X3N0cl9mbXQgPSAxOworICAgICAgICBXT1JEMzIgZ2Fpbl9zdHJlYW1fZmxhZyA9IDE7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9MRU4sICZidWZfc2l6ZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19HQUlOX1BBWUxPQURfTEVOIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9CVUYsICZwX2FycmF5KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9CVUYiKTsKKworICAgICAgICBpZiAoYnVmX3NpemUgPiAwKSB7CisgICAgICAgICAgICAvKlNldCBiaXRzdHJlYW1fc3BsaXRfZm9ybWF0ICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXksIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFU19CUywgMCwgJmJ1Zl9zaXplKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0dBSU5fU1RSRUFNX0ZMQUcsICZnYWluX3N0cmVhbV9mbGFnKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgbU1wZWdERFJDUHJlc2VudCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBIb3cgbXVjaCBidWZmZXIgaXMgdXNlZCBpbiBpbnB1dCBidWZmZXJzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNDb25zdW1lZCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX0NVUklEWF9JTlBVVF9CVUYiKTsKKworICAgIC8qIEdldCB0aGUgb3V0cHV0IGJ5dGVzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfT1VUUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCeXRlcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX09VVFBVVF9CWVRFUyIpOworCisgICAgaWYgKG1NcGVnRERSQ1ByZXNlbnQgPT0gMSkgeworICAgICAgICBtZW1jcHkobURyY0luQnVmLCBtT3V0cHV0QnVmZmVyLCAqb3V0Qnl0ZXMpOworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMsIDAsIG91dEJ5dGVzKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfRVhFQ1VURSwgSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSwgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0RPX0VYRUNVVEUiKTsKKworICAgICAgICBtZW1jcHkobU91dHB1dEJ1ZmZlciwgbURyY091dEJ1ZiwgKm91dEJ5dGVzKTsKKyAgICB9CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6Z2V0WEFBQ1N0cmVhbUluZm8oKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICAvKiBTYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2FtcEZyZXEpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRIik7CisKKyAgICAvKiBUb3RhbCBOdW1iZXIgb2YgQ2hhbm5lbHMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTnVtQ2hhbm5lbHMpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisgICAgaWYgKG1OdW1DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUENNIHdvcmQgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBjbVdkU3opOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1oiKTsKKyAgICBpZiAoKG1QY21XZFN6IC8gOCkgIT0gMikgeworICAgICAgICBBTE9HRSgiIE5vIG9mIGNoYW5uZWxzIGFyZSBtb3JlIHRoYW4gbWF4IGNoYW5uZWxzXG4iKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIGNoYW5uZWwgbWFzayB0byB0ZWxsIHRoZSBhcnJhbmdlbWVudCBvZiBjaGFubmVscyBpbiBiaXQgc3RyZWFtICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNoYW5uZWxNYXNrKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0NIQU5ORUxfTUFTSyIpOworCisgICAgLyogQ2hhbm5lbCBtb2RlIHRvIHRlbGwgTU9OTy9TVEVSRU8vRFVBTC1NT05PL05PTkVfT0ZfVEhFU0UgKi8KKyAgICB1aW50MzJfdCB1aV9jaGFubmVsX21vZGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfY2hhbm5lbF9tb2RlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0NIQU5ORUxfTU9ERSIpOworICAgIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMCkKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogTU9OT19PUl9QU1xuIik7CisgICAgZWxzZSBpZiAodWlfY2hhbm5lbF9tb2RlID09IDEpCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IFNURVJFT1xuIik7CisgICAgZWxzZSBpZiAodWlfY2hhbm5lbF9tb2RlID09IDIpCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IERVQUwtTU9OT1xuIik7CisgICAgZWxzZQorICAgICAgICBBTE9HVigiQ2hhbm5lbCBNb2RlOiBOT05FX09GX1RIRVNFIG9yIE1VTFRJQ0hBTk5FTFxuIik7CisKKyAgICAvKiBDaGFubmVsIG1vZGUgdG8gdGVsbCBTQlIgUFJFU0VOVC9OT1RfUFJFU0VOVCAqLworICAgIHVpbnQzMl90IHVpX3Nicl9tb2RlOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfc2JyX21vZGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUiKTsKKyAgICBpZiAodWlfc2JyX21vZGUgPT0gMCkKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBOT1RfUFJFU0VOVFxuIik7CisgICAgZWxzZSBpZiAodWlfc2JyX21vZGUgPT0gMSkKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBQUkVTRU5UXG4iKTsKKyAgICBlbHNlCisgICAgICAgIEFMT0dWKCJTQlIgTW9kZTogSUxMRUdBTFxuIik7CisKKyAgICAvKiBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0ICogKDEgKyBTQlJfTU9ERSkgZm9yIEFBQyAqLworICAgIC8qIEZvciBVU0FDIGl0IGNvdWxkIGJlIDEwMjQgKiAzICwgc3VwcG9ydCB0byBxdWVyeSAgKi8KKyAgICAvKiBub3QgeWV0IGFkZGVkIGluIGNvZGVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNCAqICgxICsgdWlfc2JyX21vZGUpOworICAgIEFMT0dJKCJtT3V0cHV0RnJhbWVMZW5ndGggJWQgdWlfc2JyX21vZGUgJWQiLCBtT3V0cHV0RnJhbWVMZW5ndGgsIHVpX3Nicl9tb2RlKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OnNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjUmVmTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNIZWF2eUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJFZmZlY3RUeXBlKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBpbnQzMl90IHVpX2RyY19lbmFibGUgPSAxOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FTkFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfZW5hYmxlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VOQUJMRSIpOworICAgIGlmIChkcmNDdXQgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19DVVQsICZkcmNDdXQpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCIpOworICAgIH0KKworICAgIGlmIChkcmNCb29zdCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkoCisgICAgICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QsICZkcmNCb29zdCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QiKTsKKyAgICB9CisKKyAgICBpZiAoZHJjUmVmTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCwgJmRyY1JlZkxldmVsKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMIik7CisgICAgfQorCisgICAgaWYgKGRyY1JlZkxldmVsICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUywgJmRyY1JlZkxldmVsKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworICAgIH0KKworICAgIGlmIChkcmNIZWF2eUNvbXByZXNzaW9uICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyY0hlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QIik7CisgICAgfQorCisgICAgZXJyX2NvZGUgPQorICAgICAgICBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSwgJmRyRWZmZWN0VHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICBpbnQzMl90IGlfZWZmZWN0X3R5cGUsIGlfdGFyZ2V0X2xvdWRuZXNzLCBpX2xvdWRfbm9ybTsKKyAgICAvKlNldCBFZmZlY3QgVHlwZSovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgZXJyX2NvZGUgPQorICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIC8qU2V0IHRhcmdldCBsb3VkbmVzcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTLCAmaV90YXJnZXRfbG91ZG5lc3MpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgLypTZXQgbG91ZF9ub3JtX2ZsYWcqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX0xPVURfTk9STSIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitjbGFzcyBDMlNvZnRYYWFjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFhhYWNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0WGFhY0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFhhYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFhhYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRYYWFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0WGFhY0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzg1NjdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9YQUFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfWEFBQ19ERUNfSF8KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaXhoZWFhY2RfdHlwZV9kZWYuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9lcnJvcl9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9lcnJvcl9oYW5kbGVyLmgiCisjaW5jbHVkZSAiaXhoZWFhY2RfYXBpY21kX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX21lbW9yeV9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9hYWNfY29uZmlnLmgiCisKKyNpbmNsdWRlICJpbXBkX2FwaWNtZF9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpbXBkX2RyY19jb25maWdfcGFyYW1zLmgiCisKKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKyNkZWZpbmUgTUFYX05VTV9CTE9DS1MgICAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGJsb2NrcyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisKK2V4dGVybiAiQyIgSUFfRVJST1JDT0RFIGl4aGVhYWNkX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsIHBWT0lEIHB2X3ZhbHVlKTsKK2V4dGVybiAiQyIgSUFfRVJST1JDT0RFIGlhX2RyY19kZWNfYXBpKHBWT0lEIHBfaWFfbW9kdWxlX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQzMiBpX2NtZCwgV09SRDMyIGlfaWR4LCBwVk9JRCBwdl92YWx1ZSk7CitleHRlcm4gIkMiICBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZ2V0X2NvbmZpZ19wYXJhbShwVk9JRCBwX2lhX3Byb2Nlc3NfYXBpX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXT1JEMzIgcGlfc2FtcF9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9udW1fY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXT1JEMzIgcGlfcGNtX3dkX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9jaGFubmVsX21hc2spOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRYYWFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFhhYWNEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFhhYWNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtPdXRwdXREcmFpbkJ1ZmZlclNpemUgICAgICA9IDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCAqIE1BWF9OVU1fQkxPQ0tTLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZvaWQqIG1YaGVhYWNDb2RlY0hhbmRsZTsKKyAgICB2b2lkKiBtTXBlZ0REcmNIYW5kbGU7CisgICAgdWludDMyX3QgbUlucHV0QnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCBtT3V0cHV0RnJhbWVMZW5ndGg7CisgICAgaW50OF90KiBtSW5wdXRCdWZmZXI7CisgICAgaW50OF90KiBtT3V0cHV0QnVmZmVyOworICAgIGludDMyX3QgbVNhbXBGcmVxOworICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworICAgIGludDMyX3QgbVBjbVdkU3o7CisgICAgaW50MzJfdCBtQ2hhbm5lbE1hc2s7CisgICAgaW50MzJfdCBtTnVtT3V0Qnl0ZXM7CisgICAgdWludDY0X3QgbUN1ckZyYW1lSW5kZXg7CisgICAgdWludDY0X3QgbUN1clRpbWVzdGFtcDsKKyAgICBib29sIG1Jc0NvZGVjSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQ7CisgICAgaW50OF90KiBtRHJjSW5CdWY7CisgICAgaW50OF90KiBtRHJjT3V0QnVmOworICAgIGludDMyX3QgbU1wZWdERFJDUHJlc2VudDsKKyAgICBpbnQzMl90IG1EUkNGbGFnOworCisgICAgVmVjdG9yPHZvaWQqPiBtTWVtb3J5VmVjOworICAgIFZlY3Rvcjx2b2lkKj4gbURyY01lbW9yeVZlYzsKKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudCBfX3VudXNlZDsKKyAgICBzaXplX3QgbU91dHB1dEJ1ZmZlckNvdW50IF9fdW51c2VkOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBjaGFyKiBtT3V0cHV0RHJhaW5CdWZmZXI7CisgICAgdWludDMyX3QgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3M7CisKKyAgICBJQV9FUlJPUkNPREUgaW5pdERlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgc2V0RHJjUGFyYW1ldGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CisgICAgSUFfRVJST1JDT0RFIGRyYWluRGVjb2RlcigpOworICAgIHZvaWQgZmluaXNoV29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCk7CisKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0TVBFR0RERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgaW50IGNvbmZpZ01QRUdERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcyk7CisgICAgSUFfRVJST1JDT0RFIGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgSUFfRVJST1JDT0RFIHNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY1JlZkxldmVsLCBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJFZmZlY3RUeXBlKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFhhYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX1hBQUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTg5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDggQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMiIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKKworICAgIHNyY3M6IFsiQzIuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogZmFsc2UsIC8vIHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogZmFsc2UsIC8vIHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvQzIuY3BwIGIvbWVkaWEvY29kZWMyL2NvcmUvQzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OWQ0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9DMi5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKy8qKgorICogVGhlcmUgaXMgbm90aGluZyBoZXJlIHlldC4gVGhpcyBsaWJyYXJ5IGlzIGJ1aWx0IHRvIHNlZSB3aGF0IHN5bWJvbHMgYW5kIG1ldGhvZHMgZ2V0CisgKiBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlIEFQSSBpbmNsdWRlIGZpbGVzLgorICoKKyAqIEdvaW5nIGZvcndhcmQsIHRoZSBDb2RlYzIgbGlicmFyeSB3aWxsIGNvbnRhaW4gdXRpbGl0eSBtZXRob2RzIHRoYXQgYXJlIHVzZWZ1bCBmb3IKKyAqIENvZGVjMiBjbGllbnRzLgorICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMi5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzQ2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyLmgKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX0hfCisjZGVmaW5lIEMyX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvKiogbmFub3NlY29uZHMgd2l0aCBhcmJpdHJhcnkgb3JpZ2luLiAqLwordHlwZWRlZiBpbnQ2NF90IGMyX25zZWNzX3Q7CisKKy8qKiBcbWFpbnBhZ2UgQ29kZWMyCisgKgorICogQ29kZWMyIGlzIGEgZ2VuZXJpYyBmcmFtZS1iYXNlZCBkYXRhIHByb2Nlc3NpbmcgQVBJLgorICoKKyAqIFRoZSBtZWRpYSBzdWJzeXN0ZW0gYWNjZXNzZXMgY29tcG9uZW50cyB2aWEgdGhlIFxyZWYgQVBJLgorICovCisKKy8qKiBcaW5ncm91cCBBUEkKKyAqCisgKiBUaGUgQ29kZWMyIEFQSSBkZWZpbmVzIHRoZSBvcGVyYXRpb24gb2YgZGF0YSBwcm9jZXNzaW5nIGNvbXBvbmVudHMgYW5kIHRoZWlyIGludGVyYWN0aW9uIHdpdGgKKyAqIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCisgKgorICogQ29kaW5nIENvbnZlbnRpb25zCisgKgorICogTWl0aWdhdGluZyBCaW5hcnkgQ29tcGF0aWJpbGl0eS4KKyAqCisgKiBXaGlsZSBmdWxsIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzIG5vdCBhIGdvYWwgb2YgdGhlIEFQSSAoZHVlIHRvIG91ciB1c2Ugb2YgU1RMKSwgd2UgdHJ5IHRvCisgKiBtaXRpZ2F0ZSBiaW5hcnkgYnJlYWtzIGJ5IGFkaGVyaW5nIHRvIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6CisgKgorICogLSBhdCBtb3N0IG9uZSB2dGFibGUgd2l0aCBwbGFjZWhvbGRlciB2aXJ0dWFsIG1ldGhvZHMKKyAqIC0gYWxsIG9wdGlvbmFsL3BsYWNlaG9sZGVyIHZpcnR1YWwgbWV0aG9kcyByZXR1cm5pbmcgYSBjMl9zdGF0dXNfdCwgd2l0aCBDMl9PTUlUVEVEIG5vdCByZXF1aXJpbmcKKyAqICAgYW55IHVwZGF0ZSB0byBpbnB1dC9vdXRwdXQgYXJndW1lbnRzLgorICogLSBsaW1pdGluZyBzeW1ib2wgZXhwb3J0IG9mIGlubGluZSBtZXRob2RzCisgKiAtIHVzZSBvZiBwaW1wbCAob3Igc2hhcmVkLXBpbXBsKQorICoKKyAqIE5hbWluZworICoKKyAqIC0gYWxsIGNsYXNzZXMgYW5kIHR5cGVzIHByZWZpeCB3aXRoIEMyCisgKiAtIGNsYXNzZXMgZm9yIGludGVybmFsIHVzZSBwcmVmaXggd2l0aCBfQzIKKyAqIC0gZW51bSB2YWx1ZXMgaW4gZ2xvYmFsIG5hbWVzcGFjZSBwcmVmaXggd2l0aCBDMl8gYWxsIGNhcHMKKyAqIC0gZW51bSB2YWx1ZXMgaW5zaWRlIGNsYXNzZXMgaGF2ZSBubyBDMl8gcHJlZml4IGFzIGNsYXNzIGFscmVhZHkgaGFzIGl0CisgKiAtIHN1cHBvcnRpbmcgdHdvIGtpbmRzIG9mIGVudW0gbmFtaW5nOiBhbGwtY2FwcyBhbmQga0NhbWVsQ2FzZQorICogXHRvZG8gcmV2aXNpdCBrQ2FtZWxDYXNlIGZvciBwYXJhbS10eXBlCisgKgorICogQXNwZWN0cworICoKKyAqIEFzcGVjdHMgZGVmaW5lIGNlcnRhaW4gY29tbW9uIGJlaGF2aW9yIGFjcm9zcyBhIGdyb3VwIG9mIG9iamVjdHMuCisgKiAtIGNsYXNzZXMgd2hvc2UgbmFtZSBtYXRjaGVzIF9DMi4qQXNwZWN0CisgKiAtIG9ubHkgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycworICogLSBubyBkZXNjdHJ1Y3RvciBhbmQgY29waWFibGUKKyAqIC0gYWxsIG1ldGhvZHMgYXJlIGlubGluZSBvciBzdGF0aWMgKHRoaXMgaXMgb3Bwb3NpdGUgb2YgdGhlIGludGVyZmFjZSBwYXJhZGlnbSB3aGVyZSBhbGwgbWV0aG9kcworICogICBhcmUgdmlydHVhbCwgd2hpY2ggd291bGQgbm90IHdvcmsgZHVlIHRvIHRoZSBhdCBtb3N0IG9uZSB2dGFibGUgcnVsZS4pCisgKiAtIG9ubHkgcHJpdmF0ZSB2YXJpYWJsZXMgKHRoaXMgcHJldmVudHMgc3ViY2xhc3NlcyBpbnRlcmZlcmluZyB3aXRoIHRoZSBhc3BlY3RzLikKKyAqLworCisvLy8gXGRlZmdyb3VwIHR5cGVzIENvbW1vbiBUeXBlcworLy8vIEB7CisKKy8qKgorICogQzJTdHJpbmc6IGJhc2ljIHN0cmluZyBpbXBsZW1lbnRhdGlvbgorICovCit0eXBlZGVmIHN0ZDo6c3RyaW5nIEMyU3RyaW5nOworCisvKioKKyAqIEMyU3RyaW5nTGl0ZXJhbDogYmFzaWMgc3RyaW5nIGxpdGVyYWwgaW1wbGVtZW50YXRpb24uCisgKiBcbm90ZSB0aGVzZSBhcmUgbmV2ZXIgb3duZWQgYnkgYW55IG9iamVjdCwgYW5kIGNhbiBvbmx5IHJlZmVyIHRvIEMgc3RyaW5nIGxpdGVyYWxzLgorICovCit0eXBlZGVmIGNvbnN0IGNoYXIgKkMyU3RyaW5nTGl0ZXJhbDsKKworLyoqCisgKiBjMl9zdGF0dXNfdDogc3RhdHVzIGNvZGVzIHVzZWQuCisgKi8KK2VudW0gYzJfc3RhdHVzX3QgOiBpbnQzMl90IHsKKy8qCisgKiBVc2UgUE9TSVggZXJybm8gY29uc3RhbnRzLgorICovCisgICAgQzJfT0sgICAgICAgID0gMCwgICAgICAgICAgICAvLy88IG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisKKyAgICAvLyBiYWQgaW5wdXQKKyAgICBDMl9CQURfVkFMVUUgPSBFSU5WQUwsICAgICAgIC8vLzwgYXJndW1lbnQgaGFzIGludmFsaWQgdmFsdWUgKHVzZXIgZXJyb3IpCisgICAgQzJfQkFEX0lOREVYID0gRU5YSU8sICAgICAgICAvLy88IGFyZ3VtZW50IHVzZXMgaW52YWxpZCBpbmRleCAodXNlciBlcnJvcikKKyAgICBDMl9DQU5OT1RfRE8gPSBFTk9UU1VQLCAgICAgIC8vLzwgYXJndW1lbnQvaW5kZXggaXMgdmFsaWQgYnV0IG5vdCBwb3NzaWJsZQorCisgICAgLy8gYmFkIHNlcXVlbmNpbmcgb2YgZXZlbnRzCisgICAgQzJfRFVQTElDQVRFID0gRUVYSVNULCAgICAgICAvLy88IG9iamVjdCBhbHJlYWR5IGV4aXN0cworICAgIEMyX05PVF9GT1VORCA9IEVOT0VOVCwgICAgICAgLy8vPCBvYmplY3Qgbm90IGZvdW5kCisgICAgQzJfQkFEX1NUQVRFID0gRVBFUk0sICAgICAgICAvLy88IG9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkIGluIHRoZSBjdXJyZW50IHN0YXRlCisgICAgQzJfQkxPQ0tJTkcgID0gRVdPVUxEQkxPQ0ssICAvLy88IG9wZXJhdGlvbiB3b3VsZCBibG9jayBidXQgYmxvY2tpbmcgaXMgbm90IHBlcm1pdHRlZAorICAgIEMyX0NBTkNFTEVEICA9IEVJTlRSLCAgICAgICAgLy8vPCBvcGVyYXRpb24gaW50ZXJydXB0ZWQvY2FuY2VsZWQKKworICAgIC8vIGJhZCBlbnZpcm9ubWVudAorICAgIEMyX05PX01FTU9SWSA9IEVOT01FTSwgICAgICAgLy8vPCBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBvcGVyYXRpb24KKyAgICBDMl9SRUZVU0VEICAgPSBFQUNDRVMsICAgICAgIC8vLzwgbWlzc2luZyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIG9wZXJhdGlvbgorCisgICAgQzJfVElNRURfT1VUID0gRVRJTUVET1VULCAgICAvLy88IG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIHdpdGhpbiB0aW1lb3V0CisKKyAgICAvLyBiYWQgdmVyc2lvbmluZworICAgIEMyX09NSVRURUQgICA9IEVOT1NZUywgICAgICAgLy8vPCBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkL3N1cHBvcnRlZCAob3B0aW9uYWwgb25seSkKKworICAgIC8vIHVua25vd24gZmF0YWwKKyAgICBDMl9DT1JSVVBURUQgPSBFRkFVTFQsICAgICAgIC8vLzwgc29tZSB1bmV4cGVjdGVkIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uCisgICAgQzJfTk9fSU5JVCAgID0gRU5PREVWLCAgICAgICAvLy88IHN0YXR1cyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQKK307CisKKy8qKgorICogVHlwZSB0aGF0IGRlc2NyaWJlcyB0aGUgZGVzaXJlZCBibG9ja2luZyBiZWhhdmlvciBmb3IgdmFyaWFibGUgYmxvY2tpbmcgY2FsbHMuIEJsb2NraW5nIGluIHRoaXMKKyAqIEFQSSBpcyB1c2VkIGluIGEgc29tZXdoYXQgbW9kaWZpZWQgbWVhbmluZyBzdWNoIHRoYXQgb3BlcmF0aW9ucyB0aGF0IG1lcmVseSB1cGRhdGUgdmFyaWFibGVzCisgKiBwcm90ZWN0ZWQgYnkgbXV0ZXhlcyBhcmUgc3RpbGwgY29uc2lkZXJlZCAibm9uLWJsb2NraW5nIiAoYWx3YXlzIHVzZWQgaW4gcXVvdGVzKS4KKyAqLworZW51bSBjMl9ibG9ja2luZ190IDogaW50MzJfdCB7CisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBTSEFMTCBiZSAibm9uLWJsb2NraW5nIi4gVGhpcyBtZWFucyB0aGF0IGl0IHNoYWxsIG5vdCBwZXJmb3JtIGFueSBmaWxlCisgICAgICogb3BlcmF0aW9ucywgb3IgY2FsbC93YWl0IG9uIG90aGVyIHByb2Nlc3Nlcy4gSXQgbWF5IHVzZSBhIHByb3RlY3RlZCByZWdpb24gYXMgbG9uZyBhcyB0aGUKKyAgICAgKiBtdXRleCBpcyBuZXZlciB1c2VkIHRvIHByb3RlY3QgY29kZSB0aGF0IGlzIG90aGVyd2lzZSAibWF5IGJsb2NrIi4KKyAgICAgKi8KKyAgICBDMl9ET05UX0JMT0NLID0gZmFsc2UsCisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBNQVkgYmUgdGVtcG9yYXJpbHkgYmxvY2tpbmcuCisgICAgICovCisgICAgQzJfTUFZX0JMT0NLID0gdHJ1ZSwKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIHV0aWxzIFV0aWxpdGllcworLy8vIEB7CisKKyNkZWZpbmUgQzJfRE9fTk9UX0NPUFkodHlwZSkgXAorICAgIHR5cGUmIG9wZXJhdG9yPShjb25zdCB0eXBlICYpID0gZGVsZXRlOyBcCisgICAgdHlwZShjb25zdCB0eXBlICYpID0gZGVsZXRlOyBcCisKKyNkZWZpbmUgQzJfREVGQVVMVF9NT1ZFKHR5cGUpIFwKKyAgICB0eXBlJiBvcGVyYXRvcj0odHlwZSAmJikgPSBkZWZhdWx0OyBcCisgICAgdHlwZSh0eXBlICYmKSA9IGRlZmF1bHQ7IFwKKworI2RlZmluZSBDMl9BTExPV19PVkVSRkxPVyBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKKyNkZWZpbmUgQzJfQ09OU1QgICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKQorI2RlZmluZSBDMl9ISURFICAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZGVmaW5lIEMyX0lOTElORSAgIGlubGluZSBDMl9ISURFCisjZGVmaW5lIEMyX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKGludGVybmFsX2xpbmthZ2UpKQorI2RlZmluZSBDMl9QQUNLICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkKKyNkZWZpbmUgQzJfUFVSRSAgICAgX19hdHRyaWJ1dGVfXygocHVyZSkpCisKKyNkZWZpbmUgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUpIFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gKCp0aGlzID09IG90aGVyKSB8fCAoKnRoaXMgPCBvdGhlcik7IH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPCBvdGhlcik7IH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA8IG90aGVyKSAmJiAhKCp0aGlzID09IG90aGVyKTsgfQorCisjZGVmaW5lIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCkgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPCBvdGhlci5maWVsZDsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPT0gb3RoZXIuZmllbGQ7IH0gXAorICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlKQorCisjZGVmaW5lIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCwgbWFzaykgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyBcCisgICAgICAgIHJldHVybiAoZmllbGQgJiBtYXNrKSA8IChvdGhlci5maWVsZCAmIChtYXNrKSk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIChmaWVsZCAmIG1hc2spID09IChvdGhlci5maWVsZCAmIChtYXNrKSk7IFwKKyAgICB9IFwKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlModHlwZSkKKworI2RlZmluZSBERUZJTkVfRU5VTV9PUEVSQVRPUlMoZXR5cGUpIFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yfChldHlwZSBhLCBldHlwZSBiKSB7IHJldHVybiAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSB8IHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgJm9wZXJhdG9yfD0oZXR5cGUgJmEsIGV0eXBlIGIpIHsgYSA9IChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIHwgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgcmV0dXJuIGE7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3ImKGV0eXBlIGEsIGV0eXBlIGIpIHsgcmV0dXJuIChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpICYgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSAmb3BlcmF0b3ImPShldHlwZSAmYSwgZXR5cGUgYikgeyBhID0gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgJiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyByZXR1cm4gYTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSBvcGVyYXRvcl4oZXR5cGUgYSwgZXR5cGUgYikgeyByZXR1cm4gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgXiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlICZvcGVyYXRvcl49KGV0eXBlICZhLCBldHlwZSBiKSB7IGEgPSAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSBeIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IHJldHVybiBhOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yfihldHlwZSBhKSB7IHJldHVybiAoZXR5cGUpKH5zdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkpOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEI+CitjbGFzcyBDMl9ISURFIGMyX2NudHJfdDsKKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8vLyBcZGVmZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKy8vLyBAeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyX0hJREUgX2MyX2NudHJfY29tcGF0X2hlbHBlciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFU+Ojp2YWx1ZT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBUIGdldChjb25zdCBVICZ2YWx1ZSkgeworICAgICAgICByZXR1cm4gVCh2YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwoc2l6ZW9mKFUpID49IHNpemVvZihUKSk+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgVCBnZXQoY29uc3QgYzJfY250cl90PFUsIHZvaWQ+ICZ2YWx1ZSkgeworICAgICAgICByZXR1cm4gVCh2YWx1ZS5tVmFsdWUpOworICAgIH0KK307CisKKy8vLyBAfQorCisvLy8gXGVuZGNvbmQKKworLyoqCisgKiBJbnRlZ3JhbCBjb3VudGVyIHR5cGUuCisgKgorICogVGhpcyBpcyBiYXNpY2FsbHkgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIE5FVkVSIGNoZWNrZWQgZm9yIG92ZXJmbG93L3VuZGVyZmxvdyAtIGFuZAorICogY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlIHJlZGVmaW5lZC4KKyAqCisgKiBcbm90ZSBDb21wYXJpc29uIG9mIGNvdW50ZXIgdHlwZXMgaXMgbm90IGZ1bGx5IHRyYW5zaXRpdmUsIGUuZy4KKyAqIGl0IGNvdWxkIGJlIHRoYXQgYSA+IGIgPiBjIGJ1dCBhICE+IGMuCisgKiBzdGQ6Omxlc3M8PiwgZ3JlYXRlcjw+LCBsZXNzX2VxdWFsPD4gYW5kIGdyZWF0ZXJfZXF1YWw8PiBzcGVjaWFsaXphdGlvbnMgeWllbGQgdG90YWwgb3JkZXJpbmcsCisgKiBidXQgbWF5IG5vdCBtYXRjaCBzZW1hbnRpYyBvcmRlcmluZyBvZiB0aGUgdmFsdWVzLgorICoKKyAqIFRlY2huaWNhbGx5OiBjb3VudGVyIHR5cGVzIHJlcHJlc2VudCBpbnRlZ2VyIHZhbHVlczogQSAqIDJeTiArIHZhbHVlLCB3aGVyZSBBIGNhbiBiZSBhcmJpdHJhcnkuCisgKiBUaGlzIG1ha2VzIGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiwgbXVsdGlwbGljYXRpb24gKGFzIHdlbGwgYXMgYml0d2lzZSBvcGVyYXRpb25zKSB3ZWxsIGRlZmluZWQuCisgKiBIb3dldmVyLCBkaXZpc2lvbiBpcyBpbiBnZW5lcmFsIG5vdCB3ZWxsIGRlZmluZWQsIGFzIHRoZSByZXN1bHQgbWF5IGRlcGVuZCBvbiBBLiBUaGlzIGlzIGFsc28KKyAqIHRydWUgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIGFuZCBib29sZWFuIGNvbnZlcnNpb24uCisgKgorICogRXZlbiB0aG91Z2ggd2VsbCBkZWZpbmVkLCBiaXR3aXNlIG9wZXJhdG9ycyBhcmUgbm90IGltcGxlbWVudGVkIGZvciBjb3VudGVyIHR5cGVzIGFzIHRoZXkgYXJlIG5vdAorICogbWVhbmluZ2Z1bC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAmJiBzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZT46OnR5cGU+CitjbGFzcyBDMl9ISURFIGMyX2NudHJfdCB7CisgICAgdXNpbmcgY29tcGF0ID0gX2MyX2NudHJfY29tcGF0X2hlbHBlcjxUPjsKKworICAgIFQgbVZhbHVlOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBIQUxGX1JBTkdFID0gVCh+MCkgXiAoVCh+MCkgPj4gMSk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGZyaWVuZCBzdHJ1Y3QgX2MyX2NudHJfY29tcGF0X2hlbHBlcjsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIEluaXRpYWxpemVkIGNvdW50ZXIgdG8gMC4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdCgpIDogbVZhbHVlKFQoMCkpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgZnJvbSBhIGNvbXBhdGlibGUgdHlwZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90KGNvbnN0IFUgJnZhbHVlKSA6IG1WYWx1ZShjb21wYXQ6OmdldCh2YWx1ZSkpIHt9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuZGVybHlpbmcgc2lnbmVkIHR5cGUuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGUgcGVlaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGU+KG1WYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVlayBhcyB1bmRlcmx5aW5nIHVuc2lnbmVkIHR5cGUuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBUIHBlZWt1KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgbG9uZyBsb25nIC0gZS5nLiBmb3IgcHJpbnRpbmcuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGxvbmcgbG9uZyBwZWVrbGwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobG9uZyBsb25nKW1WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuc2lnbmVkIGxvbmcgbG9uZyAtIGUuZy4gZm9yIHByaW50aW5nLgorICAgICAqLworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nIGxvbmcgcGVla3VsbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdG8gYSBzbWFsbGVyIGNvdW50ZXIgdHlwZS4gVGhpcyBpcyBhbHdheXMgc2FmZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPCBzaXplb2YoVCkpPjo6dHlwZT4KKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIGMyX2NudHJfdDxVPigpIHsKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxVPihtVmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFyaXRobWV0aWMgb3BlcmF0b3JzCisgICAgICovCisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKGF0dHJpYiwgb3AsIG9wX2Fzc2lnbikgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiYgb3BlcmF0b3Igb3BfYXNzaWduKGNvbnN0IFUgJnZhbHVlKSB7IFwKKyAgICAgICAgbVZhbHVlIG9wX2Fzc2lnbiBjb21wYXQ6OmdldCh2YWx1ZSk7IFwKKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgfSBcCisgICAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9ZGVjbHR5cGUoY29tcGF0OjpnZXQoVSgwKSkpPiBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKGNvbnN0IFUgJnZhbHVlKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxUPihtVmFsdWUgb3AgY29tcGF0OjpnZXQodmFsdWUpKTsgXAorICAgIH0gXAorICAgIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPCBzaXplb2YoVCkpPjo6dHlwZT4gXAorICAgIGF0dHJpYiBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxVPiBvcGVyYXRvciBvcChjb25zdCBjMl9jbnRyX3Q8VT4gJnZhbHVlKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxVPihVKG1WYWx1ZSkgb3AgdmFsdWUucGVla3UoKSk7IFwKKyAgICB9CisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoYXR0cmliLCBvcCkgXAorICAgIGF0dHJpYiBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxUPiBvcGVyYXRvciBvcCgpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG9wIG1WYWx1ZSk7IFwKKyAgICB9CisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChhdHRyaWIsIG9wKSBcCisgICAgYXR0cmliIGlubGluZSBjMl9jbnRyX3Q8VD4gJm9wZXJhdG9yIG9wKCkgeyBcCisgICAgICAgIG9wIG1WYWx1ZTsgXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9IFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiBvcGVyYXRvciBvcChpbnQpIHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQsIHZvaWQ+KG1WYWx1ZSBvcCk7IFwKKyAgICB9CisKKyAgICBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICssICs9KQorICAgIERFRklORV9DMl9DTlRSX0JJTkFSWV9PUChDMl9BTExPV19PVkVSRkxPVywgLSwgLT0pCisgICAgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAqLCAqPSkKKworICAgIERFRklORV9DMl9DTlRSX1VOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtKQorICAgIERFRklORV9DMl9DTlRSX1VOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCArKQorCisgICAgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChDMl9BTExPV19PVkVSRkxPVywgKyspCisgICAgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChDMl9BTExPV19PVkVSRkxPVywgLS0pCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdW5zaWduZWQ8VT46OnZhbHVlPjo6dHlwZT4KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yPDwoY29uc3QgVSAmdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxUPihtVmFsdWUgPDwgdmFsdWUpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxVPjo6dmFsdWU+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGMyX2NudHJfdDxUPiAmb3BlcmF0b3I8PD0oY29uc3QgVSAmdmFsdWUpIHsKKyAgICAgICAgbVZhbHVlIDw8PSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmlzb24gb3BlcmF0b3JzCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBUKG90aGVyLm1WYWx1ZSAtIG1WYWx1ZSkgPCBIQUxGX1JBTkdFOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gVChtVmFsdWUgLSBvdGhlci5tVmFsdWUpIDwgSEFMRl9SQU5HRTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVmFsdWUgPT0gb3RoZXIubVZhbHVlOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKnRoaXMgPD0gb3RoZXIgJiYgKnRoaXMgIT0gb3RoZXI7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqdGhpcyA+PSBvdGhlciAmJiAqdGhpcyAhPSBvdGhlcjsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KK2lubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yKyhjb25zdCBVICZhLCBjb25zdCBjMl9jbnRyX3Q8VD4gJmIpIHsKKyAgICByZXR1cm4gYiArIGE7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3ItKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBjMl9jbnRyX3Q8VD4oYSkgLSBiOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KK2lubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yKihjb25zdCBVICZhLCBjb25zdCBjMl9jbnRyX3Q8VD4gJmIpIHsKKyAgICByZXR1cm4gYiAqIGE7Cit9CisKK3R5cGVkZWYgYzJfY250cl90PHVpbnQzMl90PiBjMl9jbnRyMzJfdDsgLyoqIDMyLWJpdCBjb3VudGVyIHR5cGUgKi8KK3R5cGVkZWYgYzJfY250cl90PHVpbnQ2NF90PiBjMl9jbnRyNjRfdDsgLyoqIDY0LWJpdCBjb3VudGVyIHR5cGUgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8vLyBcZGVmZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKy8vLyBAeworCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUPiBzdHJ1Y3QgYzJfdHlwZXM7CisKKy8qKiBzcGVjaWFsaXphdGlvbiBmb3IgYSBzaW5nbGUgdHlwZSAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBjMl90eXBlczxUPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlIHdpZGVfdHlwZTsKKyAgICB0eXBlZGVmIHdpZGVfdHlwZSBuYXJyb3dfdHlwZTsKKyAgICB0eXBlZGVmIHdpZGVfdHlwZSBtaW5fdHlwZTsgLy8gdHlwZSBmb3IgbWluKFQuLi4pCit9OworCisvKiogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB0eXBlcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBjMl90eXBlczxULCBVPiB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA9PSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJtaXhpbmcgZmxvYXRpbmcgcG9pbnQgYW5kIG5vbi1mbG9hdGluZyBwb2ludCB0eXBlcyBpcyBkaXNhbGxvd2VkIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUgPT0gc3RkOjppc19zaWduZWQ8VT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIm1peGluZyBzaWduZWQgYW5kIHVuc2lnbmVkIHR5cGVzIGlzIGRpc2FsbG93ZWQiKTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpkZWNheTwKKyAgICAgICAgICAgIGRlY2x0eXBlKHRydWUgPyBzdGQ6OmRlY2x2YWw8VD4oKSA6IHN0ZDo6ZGVjbHZhbDxVPigpKT46OnR5cGUgd2lkZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpkZWNheTwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c2l6ZW9mKFQpIDwgc2l6ZW9mKFUpLCBULCBVPjo6dHlwZT46OnR5cGUgbmFycm93X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgc3RkOjppc19zaWduZWQ8VD46OnZhbHVlLCB3aWRlX3R5cGUsIG5hcnJvd190eXBlPjo6dHlwZSBtaW5fdHlwZTsKK307CisKKy8vLyBAfQorCisvLy8gXGVuZGNvbmQKKworLyoqCisgKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcy4gT25seSBzdXBwb3J0cyBzaW1pbGFyIGNsYXNzZXMsIHN1Y2ggYXM6CisgKiAtIGFsbCBmbG9hdGluZyBwb2ludAorICogLSBhbGwgdW5zaWduZWQvYWxsIHNpZ25lZAorICogLSBhbGwgcG9pbnRlcgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBWPgorc3RydWN0IGMyX3R5cGVzPFQsIFUsIFYuLi4+IHsKKyAgICAvKiogQ29tbW9uIHR5cGUgdGhhdCBhY2NvbW1vZGF0ZXMgYWxsIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlcy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUsIFYuLi4+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIC8qKiBOYXJyb3dlc3QgdHlwZSBvZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om5hcnJvd190eXBlLCBWLi4uPjo6bmFycm93X3R5cGUgbmFycm93X3R5cGU7CisgICAgLyoqIFR5cGUgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpbnB1dCBmb3IgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlcy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW5fdHlwZSwgVi4uLj46Om1pbl90eXBlIG1pbl90eXBlOworfTsKKworLyoqCisgKiAgXGluZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKyAqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdmFsdWVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIGMyX21heChjb25zdCBUIGEsIGNvbnN0IFUgYikgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7IHdpZGVfdHlwZSBhXyhhKSwgYl8oYik7IGFfID4gYl8gPyBhXyA6IGJfOyB9KTsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBhIGxpc3Qgb2YgInNpbWlsYXJseSB0eXBlZCIgdmFsdWVzLgorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN0ZDo6bWF4IHdoZXJlIHRoZSB0eXBlcyBkbyBub3QgaGF2ZSB0byBiZSBpZGVudGljYWwsIGFuZCB0aGUgc21hbGxlc3QKKyAqIHJlc3VsdGluZyB0eXBlIGlzIHVzZWQgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIGFyZ3VtZW50IHR5cGVzLgorICoKKyAqIFxub3RlIFZhbHVlIHR5cGVzIG11c3QgYmUgc2ltaWxhciwgZS5nLiBhbGwgZmxvYXRpbmcgcG9pbnQsIGFsbCBwb2ludGVycywgYWxsIHNpZ25lZCwgb3IgYWxsCisgKiB1bnNpZ25lZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBsYXJnZXN0IG9mIHRoZSBpbnB1dCBhcmd1bWVudHMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+Citjb25zdGV4cHIgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46OndpZGVfdHlwZSBjMl9tYXgoY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgLi4uIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFYuLi4+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeyB3aWRlX3R5cGUgYV8oYSksIGJfKGMyX21heChiLCBjLi4uKSk7IGFfID4gYl8gPyBhXyA6IGJfOyB9KTsKK30KKworLyoqCisgKiAgXGluZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKyAqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdmFsdWVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bWluX3R5cGUgYzJfbWluKGNvbnN0IFQgYSwgY29uc3QgVSBiKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsKKyAgICAgICAgd2lkZV90eXBlIGFfKGEpLCBiXyhiKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om1pbl90eXBlPihhXyA8IGJfID8gYV8gOiBiXyk7CisgICAgfSk7Cit9CisKKy8qKgorICogRmluZHMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYSBsaXN0IG9mICJzaW1pbGFybHkgdHlwZWQiIHZhbHVlcy4KKyAqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byBzdGQ6Om1pbiB3aGVyZSB0aGUgdHlwZXMgZG8gbm90IGhhdmUgdG8gYmUgaWRlbnRpY2FsLCBhbmQgdGhlIHNtYWxsZXN0CisgKiByZXN1bHRpbmcgdHlwZSBpcyB1c2VkIHRoYXQgYWNjb21tb2RhdGVzIHRoZSBhcmd1bWVudCB0eXBlcy4KKyAqCisgKiBcbm90ZSBWYWx1ZSB0eXBlcyBtdXN0IGJlIHNpbWlsYXIsIGUuZy4gYWxsIGZsb2F0aW5nIHBvaW50LCBhbGwgcG9pbnRlcnMsIGFsbCBzaWduZWQsIG9yIGFsbAorICogdW5zaWduZWQuCisgKgorICogQHJldHVybiB0aGUgc21hbGxlc3Qgb2YgdGhlIGlucHV0IGFyZ3VtZW50cy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVj4KK2NvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVLCBWLi4uPjo6bWluX3R5cGUgYzJfbWluKGNvbnN0IFQgYSwgY29uc3QgVSBiLCBjb25zdCBWIC4uLiBjKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxVLCBWLi4uPjo6bWluX3R5cGUgcmVzdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgcmVzdF90eXBlPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsKKyAgICAgICAgd2lkZV90eXBlIGFfKGEpLCBiXyhjMl9taW4oYiwgYy4uLikpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCByZXN0X3R5cGU+OjptaW5fdHlwZT4oYV8gPCBiXyA/IGFfIDogYl8pOworICAgIH0pOworfQorCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBWPjo6d2lkZV90eXBlIGMyX2NsYW1wKGNvbnN0IFQgYSwgY29uc3QgVSBiLCBjb25zdCBWIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFY+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGIpLCBjXyhjKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVj46OndpZGVfdHlwZT4oYl8gPCBhXyA/IGFfIDogYl8gPiBjXyA/IGNfIDogYl8pOworICAgIH0pOworfQorCisvLy8gQH0KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6bGVzczw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPCByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6bGVzc19lcXVhbDw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPD0gcmgucGVla3UoKTsKKyAgICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBzdGQ6OmdyZWF0ZXI8OjpjMl9jbnRyX3Q8VD4+IHsKKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcigpKGNvbnN0IDo6YzJfY250cl90PFQ+ICZsaCwgY29uc3QgOjpjMl9jbnRyX3Q8VD4gJnJoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaC5wZWVrdSgpID4gcmgucGVla3UoKTsKKyAgICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBzdGQ6OmdyZWF0ZXJfZXF1YWw8OjpjMl9jbnRyX3Q8VD4+IHsKKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcigpKGNvbnN0IDo6YzJfY250cl90PFQ+ICZsaCwgY29uc3QgOjpjMl9jbnRyX3Q8VD4gJnJoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaC5wZWVrdSgpID49IHJoLnBlZWt1KCk7CisgICAgfQorfTsKKworI2VuZGlmICAvLyBDMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzU4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmgKQEAgLTAsMCArMSwyMTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkJVRkZFUl9IXworI2RlZmluZSBDMkJVRkZFUl9IXworCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+IC8vIGZvciBDMkluZm8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQtQzJCdWZmZXIuaD4KKyNlbHNlCisKK3R5cGVkZWYgdm9pZCogQzJIYW5kbGU7CisKKyNlbmRpZgorCisvLy8gXGRlZmdyb3VwIGJ1ZmZlciBCdWZmZXJzCisvLy8gQHsKKworLy8vIFxkZWZncm91cCBidWZmZXJfc3luYyBTeW5jaHJvbml6YXRpb24KKy8vLyBAeworCisvKioKKyAqIFN5bmNocm9uaXphdGlvbiBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgZXZlbnQgYW5kIGZlbmNlIG9iamVjdHMuCisgKgorICogVGhlc2UgYXJlIGNyb3NzLXByb2Nlc3MgZXh0ZW5zaW9ucyBvZiBwcm9taXNlL2Z1dHVyZSBpbmZyYXN0cnVjdHVyZS4KKyAqIEV2ZW50cyBhcmUgYW5hbG9nb3VzIHRvIHN0ZDo6cHJvbWlzZTx2b2lkPiwgd2hlcmVhcyBmZW5jZXMgYXJlIHRvIHN0ZDo6c2hhcmVkX2Z1dHVyZTx2b2lkPi4KKyAqCisgKiBGZW5jZXMgYW5kIGV2ZW50cyBhcmUgc2hhcmVhYmxlL2NvcHlhYmxlLgorICoKKyAqIEZlbmNlcyBhcmUgdXNlZCBpbiB0d28gc2NlbmFyaW9zLCBhbmQgYWxsIGNvcGllZCBpbnN0YW5jZXMgcmVmZXIgdG8gdGhlIHNhbWUgZXZlbnQuCisgKiBcdG9kbyBkbyBldmVudHMgbmVlZCB0byBiZSBjb3B5YWJsZSBvciBzaG91bGQgdGhleSBiZSB1bmlxdWU/CisgKgorICogYWNxdWlyZSBzeW5jIGZlbmNlIG9iamVjdDogc2lnbmFsZWQgd2hlbiBpdCBpcyBzYWZlIGZvciB0aGUgY29tcG9uZW50IG9yIGNsaWVudCB0byBhY2Nlc3MKKyAqICh0aGUgY29udGVudHMgb2YpIGFuIG9iamVjdC4KKyAqCisgKiByZWxlYXNlIHN5bmMgZmVuY2Ugb2JqZWN0OiBcdG9kbworICoKKyAqIEZlbmNlcyBjYW4gYmUgYmFja2VkIGJ5IGhhcmR3YXJlLiBIYXJkd2FyZSBmZW5jZXMgYXJlIGd1YXJhbnRlZWQgdG8gc2lnbmFsIE5PIE1BVFRFUiBXSEFUIHdpdGhpbgorICogYSBzaG9ydCAocGxhdGZvcm0gc3BlY2lmaWMpIGFtb3VudCBvZiB0aW1lOyB0aGlzIGd1YXJhbnRlZSBpcyB1c3VhbGx5IGxlc3MgdGhhbiAxNSBtc2Vjcy4KKyAqLworCisvKioKKyAqIEZlbmNlIG9iamVjdCB1c2VkIGJ5IGNvbXBvbmVudHMgYW5kIHRoZSBmcmFtZXdvcmsuCisgKgorICogSW1wbGVtZW50cyB0aGUgd2FpdGluZyBmb3IgYW4gZXZlbnQsIGFuYWxvZ291cyB0byBhICdmdXR1cmUnLgorICoKKyAqIFRvIGJlIGltcGxlbWVudGVkIGJ5IHZlbmRvcnMgaWYgdXNpbmcgSFcgZmVuY2VzLgorICovCitjbGFzcyBDMkZlbmNlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBXYWl0cyBmb3IgYSBmZW5jZSB0byBiZSBzaWduYWxlZCB3aXRoIGEgdGltZW91dC4KKyAgICAgKgorICAgICAqIFx0b2RvIGEgbWVjaGFuaXNtIHRvIGNhbmNlbCBhIHdhaXQgLSBmb3Igbm93IHRoZSBvbmx5IHdheSB0byBkbyB0aGlzIGlzIHRvIGFiYW5kb24gdGhlCisgICAgICogZXZlbnQsIGJ1dCBmZW5jZXMgYXJlIHNoYXJlZCBzbyBjYW5jZWxpbmcgYSB3YWl0IHdpbGwgY2FuY2VsIGFsbCB3YWl0cy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB0aW1lb3V0TnMgICAgICAgICAgIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBuc2VjcworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZSBoYXMgYmVlbiBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgZmVuY2UgaGFzIG5vdCBiZWVuIHNpZ25hbGVkIHdpdGhpbiB0aGUgdGltZW91dAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UgaGFzIGJlZW4gYWJhbmRvbmVkIHdpdGhvdXQgYmVpbmcgc2lnbmFsZWQgKGl0IHdpbGwgbmV2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2lnbmFsZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gd2FpdCBmb3IgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHdhaXRpbmcgZm9yIHRoZSBmZW5jZSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCB3YWl0KGMyX25zZWNzX3QgdGltZW91dE5zKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgdGhpcyBmZW5jZSBpcyB2YWxpZCAoaWYgdGhlcmUgaXMgYSBjaGFuY2UgZm9yIGl0IHRvIGJlIHNpZ25hbGVkLikKKyAgICAgKiBBIGZlbmNlIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgY29udHJvbGluZyBldmVudCBpcyBkZXN0cm95ZWQgd2l0aG91dCBpdCBzaWduYWxpbmcgdGhlIGZlbmNlLgorICAgICAqCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgZmVuY2UgaXMgdmFsaWQKKyAgICAgKi8KKyAgICBib29sIHZhbGlkKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIHRoaXMgZmVuY2UgaGFzIGJlZW4gc2lnbmFsZWQgKGlzIHJlYWR5KS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gd2hldGhlciB0aGlzIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkCisgICAgICovCisgICAgYm9vbCByZWFkeSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIHRoaXMgZmVuY2UgaW4gYSBzZWxlY3Qgc3lzdGVtIGNhbGwuCisgICAgICogXG5vdGUgVGhlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvciwgaWYgdmFsaWQsIG11c3QgYmUgY2xvc2VkIGJ5IHRoZSBjYWxsZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGUuZy4gcG9sbCgpIHN5c3RlbSBjYWxscy4gVGhpcyBmaWxlIGJlY29tZXMgcmVhZGFibGUgKFBPTExJTikgd2hlbiB0aGUKKyAgICAgKiBmZW5jZSBpcyBzaWduYWxlZCwgYW5kIGJhZCAoUE9MTEVSUikgaWYgdGhlIGZlbmNlIGlzIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3IgcmVwcmVzZW50aW5nIHRoaXMgZmVuY2UgKHdpdGggb3duZXJzaGlwKSwgb3IgLTEgaWYgdGhlIGZlbmNlCisgICAgICogaGFzIGFscmVhZHkgYmVlbiBzaWduYWxlZCAoXHRvZG8gb3IgYWJhbmRvbmVkKS4KKyAgICAgKgorICAgICAqIFx0b2RvIHRoaXMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggZmVuY2VzIHVzZWQgYnkgZ3JhbGxvYworICAgICAqLworICAgIGludCBmZCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmVuY2UgaXMgYSBoYXJkd2FyZS1iYWNrZWQgZmVuY2UuCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBoYXJkd2FyZSBmZW5jZQorICAgICAqLworICAgIGJvb2wgaXNIVygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogTnVsbC1mZW5jZS4gQSBmZW5jZSB0aGF0IGhhcyBmaXJlZC4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJGZW5jZSgpIDogbUltcGwobnVsbHB0cikgeyB9CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgQzJGZW5jZShzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCk7CisgICAgZnJpZW5kIHN0cnVjdCBfQzJGZW5jZUZhY3Rvcnk7Cit9OworCisvKioKKyAqIEV2ZW50IG9iamVjdCB1c2VkIGJ5IGNvbXBvbmVudHMgYW5kIHRoZSBmcmFtZXdvcmsuCisgKgorICogSW1wbGVtZW50cyB0aGUgc2lnbmFsaW5nIG9mIGFuIGV2ZW50LCBhbmFsb2dvdXMgdG8gYSAncHJvbWlzZScuCisgKgorICogSGFyZHdhcmUgYmFja2VkIGV2ZW50cyBkbyBub3QgZ28gdGhyb3VnaCB0aGlzIG9iamVjdCwgYW5kIG11c3QgYmUgZXhwb3NlZCBkaXJlY3RseSBhcyBmZW5jZXMKKyAqIGJ5IHZlbmRvcnMuCisgKi8KK2NsYXNzIEMyRXZlbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBmZW5jZSBmb3IgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBDMkZlbmNlIGZlbmNlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIChhbGwpIGFzc29jaWF0ZWQgZmVuY2UocykuCisgICAgICogVGhpcyBoYXMgbm8gZWZmZWN0IG5vIGVmZmVjdCBpZiB0aGUgZXZlbnQgd2FzIGFscmVhZHkgc2lnbmFsZWQgb3IgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZShzKSB3ZXJlIHN1Y2Nlc3NmdWxseSBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gYWJhbmRvbmVkIG9yIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byBzaWduYWwgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHNpZ25hbGluZyB0aGUgZmVuY2UocykgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZmlyZSgpOworCisgICAgLyoqCisgICAgICogVHJpZ2dlciB0aGlzIGV2ZW50IGZyb20gdGhlIG1lcmdpbmcgb2YgdGhlIHN1cHBsaWVkIGZlbmNlcy4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgYmUKKyAgICAgKiBhYmFuZG9uZWQgaWYgYW55IG9mIHRoZXNlIGZlbmNlcyBoYXZlIGJlZW4gYWJhbmRvbmVkLCBhbmQgaXQgd2lsbCBiZSBmaXJlZCBpZiBhbGwgb2YgdGhlc2UKKyAgICAgKiBmZW5jZXMgaGF2ZSBiZWVuIHNpZ25hbGVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBtZXJnaW5nIHdhcyBzdWNjZXNzZnVsbHkgZG9uZQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBwZXJmb3JtIHRoZSBtZXJnaW5nCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZSBoYXZlIGFscmVhZHkgYmVlbiBtZXJnZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlIGhhdmUgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIG9yIGFiYW5kb25lZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgICAgICBubyBwZXJtaXNzaW9uIHRvIG1lcmdlIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBtZXJnaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBtZXJnZShzdGQ6OnZlY3RvcjxDMkZlbmNlPiBmZW5jZXMpOworCisgICAgLyoqCisgICAgICogQWJhbmRvbnMgdGhlIGV2ZW50IGFuZCBhbnkgYXNzb2NpYXRlZCBmZW5jZShzKS4KKyAgICAgKiBcbm90ZSBDYWxsIHRoaXMgdG8gZXhwbGljaXRseSBhYmFuZG9uIGFuIGV2ZW50IGJlZm9yZSBpdCBpcyBkZXN0cnVjdGVkIHRvIGF2b2lkIGEgd2FybmluZy4KKyAgICAgKgorICAgICAqIFRoaXMgaGFzIG5vIGVmZmVjdCBubyBlZmZlY3QgaWYgdGhlIGV2ZW50IHdhcyBhbHJlYWR5IHNpZ25hbGVkIG9yIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgZmVuY2Uocykgd2VyZSBzdWNjZXNzZnVsbHkgc2lnbmFsZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlKHMpIGhhdmUgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIG9yIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gYWJhbmRvbmVkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gYWJhbmRvbiB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2lnbmFsaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBhYmFuZG9uKCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvLy8gXGFkZHRvZ3JvdXAgYnVmX2ludGVybmFsIEludGVybmFsCisvLy8gQHsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBlbmNhcHN1bGF0ZSBhbiB1cGRhdGFibGUgc3RhdHVzIHZhbHVlLgorICovCitzdHJ1Y3QgX0MySW5uYXRlU3RhdHVzIHsKKyAgICBpbmxpbmUgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbVN0YXR1czsgfQorCitwcm90ZWN0ZWQ6CisgICAgX0MySW5uYXRlU3RhdHVzKGMyX3N0YXR1c190IHN0YXR1cykgOiBtU3RhdHVzKHN0YXR1cykgeyB9CisKKyAgICBjMl9zdGF0dXNfdCBtU3RhdHVzOyAvLyB0aGlzIHN0YXR1cyBpcyB1cGRhdGFibGUgYnkgdGhlIG9iamVjdAorfTsKKworLy8vIEB9CisKKy8qKgorICogVGhpcyBpcyBhIHV0aWxpdHkgdGVtcGxhdGUgZm9yIG9iamVjdHMgcHJvdGVjdGVkIGJ5IGFuIGFjcXVpcmUgZmVuY2UsIHNvIHRoYXQgZXJyb3JzIGR1cmluZworICogYWNxdWlyaW5nIHRoZSBvYmplY3QgYXJlIHByb3BhZ2F0ZWQgdG8gdGhlIG9iamVjdCBpdHNlbGYuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkFjcXVpcmFibGUgOiBwdWJsaWMgQzJGZW5jZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWNxdWlyZXMgdGhlIG9iamVjdCBwcm90ZWN0ZWQgYnkgYW4gYWNxdWlyZSBmZW5jZS4gQW55IGVycm9ycyBkdXJpbmcgdGhlIG1hcHBpbmcgd2lsbCBiZQorICAgICAqIHBhc3NlZCB0byB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogXHJldHVybiBhY3F1aXJlZCBvYmplY3QgcG90ZW50aWFsbHkgaW52YWxpZGF0ZWQgaWYgd2FpdGluZyBmb3IgdGhlIGZlbmNlIGZhaWxlZC4KKyAgICAgKi8KKyAgICBUIGdldCgpIHsKKyAgICAgICAgLy8gVE9ETzoKKyAgICAgICAgLy8gd2FpdCgpOworICAgICAgICByZXR1cm4gbVQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJBY3F1aXJhYmxlKGMyX3N0YXR1c190IGVycm9yLCBDMkZlbmNlIGZlbmNlLCBUIHQpIDogQzJGZW5jZShmZW5jZSksIG1Jbml0aWFsRXJyb3IoZXJyb3IpLCBtVCh0KSB7IH0KKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBtSW5pdGlhbEVycm9yOworICAgIFQgbVQ7IC8vIFRPRE86IG1vdmUgaW5zdGVhZCBvZiBjb3B5Cit9OworCisvLy8gQH0KKworLy8vIFxkZWZncm91cCBsaW5lYXIgTGluZWFyIERhdGEgQmxvY2tzCisvLy8gQHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIExJTkVBUiBBU1BFQ1RTLCBCTE9DS1MgQU5EIFZJRVdTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBCYXNpYyBzZWdtZW50IG1hdGggc3VwcG9ydC4KKyAqLworc3RydWN0IEMyU2VnbWVudCB7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIHVpbnQzMl90IHNpemU7CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCh1aW50MzJfdCBvZmZzZXRfLCB1aW50MzJfdCBzaXplXykKKyAgICAgICAgOiBvZmZzZXQob2Zmc2V0XyksCisgICAgICAgICAgc2l6ZShzaXplXykgeworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gc2l6ZSA9PSAwOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gb2Zmc2V0IDw9IH5zaXplOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzVmFsaWQoKSAmJiAhaXNFbXB0eSgpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhYm9vbCgqdGhpcyk7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgY29udGFpbnMoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICBpZiAoIWlzVmFsaWQoKSB8fCAhb3RoZXIuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0IDw9IG90aGVyLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAmJiBvZmZzZXQgKyBzaXplID49IG90aGVyLm9mZnNldCArIG90aGVyLnNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIW90aGVyLmlzVmFsaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPT0gb3RoZXIub2Zmc2V0ICYmIHNpemUgPT0gb3RoZXIuc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjb250YWlucyhvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjb250YWlucyhvdGhlcikgJiYgIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG90aGVyLmNvbnRhaW5zKCp0aGlzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG90aGVyLmNvbnRhaW5zKCp0aGlzKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG9mZnNldCArIHNpemU7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBpbnRlcnNlY3QoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KGMyX21heChvZmZzZXQsIG90aGVyLm9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKGVuZCgpLCBvdGhlci5lbmQoKSkgLSBjMl9tYXgob2Zmc2V0LCBvdGhlci5vZmZzZXQpKTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIGVuZCB0byBvZmZzZXQgaWYgaXQgb3ZlcmZsb3dzICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlNlZ21lbnQgbm9ybWFsaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KG9mZnNldCwgYzJfbWF4KG9mZnNldCwgZW5kKCkpIC0gb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIGVuZCB0byBtYXggaWYgaXQgb3ZlcmZsb3dzICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlNlZ21lbnQgc2F0dXJhdGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQob2Zmc2V0LCBjMl9taW4oc2l6ZSwgfm9mZnNldCkpOworICAgIH0KKworfTsKKworLyoqCisgKiBDb21tb24gYXNwZWN0IGZvciBhbGwgb2JqZWN0cyB0aGF0IGhhdmUgYSBsaW5lYXIgY2FwYWNpdHkuCisgKi8KK2NsYXNzIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKKy8vLyBcbmFtZSBMaW5lYXIgY2FwYWNpdHkgaW50ZXJmYWNlCisvLy8gQHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbUNhcGFjaXR5OyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIEMyU2VnbWVudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyU2VnbWVudCgwLCBtQ2FwYWNpdHkpOworICAgIH0KKworcHJvdGVjdGVkOgorCisjaWYgVUlOVFBUUl9NQVggPT0gMHhmZmZmZmZmZgorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHNpemVfdCkgPT0gc2l6ZW9mKHVpbnQzMl90KSwgInNpemVfdCBpcyB0b28gYmlnIik7CisjZWxzZQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHNpemVfdCkgPiBzaXplb2YodWludDMyX3QpLCAic2l6ZV90IGlzIHRvbyBzbWFsbCIpOworICAgIC8vIGV4cGxpY2l0bHkgZGlzYWJsZSBjb25zdHJ1Y3Rpb24gZnJvbSBzaXplX3QKKyAgICBpbmxpbmUgZXhwbGljaXQgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3Qoc2l6ZV90IGNhcGFjaXR5KSA9IGRlbGV0ZTsKKyNlbmRpZgorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCh1aW50MzJfdCBjYXBhY2l0eSkKKyAgICAgIDogbUNhcGFjaXR5KGNhcGFjaXR5KSB7IH0KKworICAgIGlubGluZSBleHBsaWNpdCBjb25zdGV4cHIgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKKyAgICAgICAgOiBtQ2FwYWNpdHkocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5jYXBhY2l0eSgpKSB7IH0KKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQ2FwYWNpdHk7CisvLy8gQH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGxpbmVhciByYW5nZSBpbnNpZGUgYSBsaW5lYXIgY2FwYWNpdHkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyTGluZWFyUmFuZ2VBc3BlY3QgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIExpbmVhciByYW5nZSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbU9mZnNldDsgfQorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgZW5kT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbU9mZnNldCArIG1TaXplOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJTZWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KG1PZmZzZXQsIG1TaXplKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gc3VicmFuZ2Ugb2YgY2FwYWNpdHkgWzAsIGNhcGFjaXR5XSAmIFtzaXplLCBzaXplICsgb2Zmc2V0XQorICAgIGlubGluZSBjb25zdGV4cHIgX0MyTGluZWFyUmFuZ2VBc3BlY3QodWludDMyX3QgY2FwYWNpdHlfLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjYXBhY2l0eV8pLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpLAorICAgICAgICAgIG1TaXplKGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjb3B5IGNvbnN0cnVjdG9yIChubyBlcnJvciBjaGVjaykKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZvdGhlcikKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChvdGhlci5jYXBhY2l0eSgpKSwKKyAgICAgICAgICBtT2Zmc2V0KG90aGVyLm9mZnNldCgpKSwKKyAgICAgICAgICBtU2l6ZShvdGhlci5zaXplKCkpIHsKKyAgICB9CisKKyAgICAvLyBwYXJlbnQgY2FwYWNpdHkgcmFuZ2UgWzAsIGNhcGFjaXR5XQorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoMCksCisgICAgICAgICAgbVNpemUoY2FwYWNpdHkoKSkgeworICAgIH0KKworICAgIC8vIHN1YnJhbmdlIG9mIHBhcmVudCBjYXBhY2l0eSBbMCwgY2FwYWNpdHldICYgW3NpemUsIHNpemUgKyBvZmZzZXRdCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpLAorICAgICAgICAgIG1TaXplKGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKKyAgICAvLyBzdWJzZWN0aW9uIG9mIHRoZSBwYXJlbnQncyBhbmQgW29mZnNldCwgb2Zmc2V0ICsgc2l6ZV0gcmFuZ2VzCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKGMyX21heChvZmZzZXQsIHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+b2Zmc2V0KCkpLCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoc3RkOjptaW4oYzJfbWluKHNpemUsIHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+c2l6ZSgpKSwgY2FwYWNpdHkoKSAtIG1PZmZzZXQpKSB7CisgICAgfQorCitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdCBjaGlsZFJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgKKyAgICAgICAgICAgIG1TaXplLAorICAgICAgICAgICAgYzJfbWluKGMyX21heChvZmZzZXQsIG1PZmZzZXQpLCBjYXBhY2l0eSgpKSAtIG1PZmZzZXQsCisgICAgICAgICAgICBjMl9taW4oYzJfbWluKHNpemUsIG1TaXplKSwgY2FwYWNpdHkoKSAtIGMyX21pbihjMl9tYXgob2Zmc2V0LCBtT2Zmc2V0KSwgY2FwYWNpdHkoKSkpKTsKKyAgICB9CisKKyAgICBmcmllbmQgY2xhc3MgX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdDsKKyAgICAvLyBpbnZhcmlhbnRzIDAgPD0gbU9mZnNldCA8PSBtT2Zmc2V0ICsgbVNpemUgPD0gY2FwYWNpdHkoKQorICAgIHVpbnQzMl90IG1PZmZzZXQ7CisgICAgdWludDMyX3QgbVNpemU7CisvLy8gQH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2FmZSByYW5nZSBjYWxjdWxhdGlvbnMgdXNpbmcgc2l6ZV90LXMuCisgKi8KK2NsYXNzIEMyTGluZWFyUmFuZ2UgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZShjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAmcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgmcGFyZW50LCBvZmZzZXQsIHNpemUpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlKGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KCZwYXJlbnQsIG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyTGluZWFyUmFuZ2UgaW50ZXJzZWN0KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkxpbmVhclJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2ltcGxlIGFuZCBzYWZlIGNhcGFjaXR5IGFuZCByYW5nZSBjb25zdHJ1Y3Rpb24uCisgKi8KK2NsYXNzIEMyTGluZWFyQ2FwYWNpdHkgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgQzJMaW5lYXJDYXBhY2l0eShzaXplX3QgY2FwYWNpdHkpCisgICAgICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoYzJfbWluKGNhcGFjaXR5LCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZSByYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJMaW5lYXJSYW5nZSgqdGhpcywgb2Zmc2V0LCBzaXplKTsKKyAgICB9Cit9OworCisvKioKKyAqIEFzcGVjdCBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYW4gZWRpdGFibGUgbGluZWFyIHJhbmdlLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworICAgIHVzaW5nIF9DMkxpbmVhclJhbmdlQXNwZWN0OjpfQzJMaW5lYXJSYW5nZUFzcGVjdDsKKworcHVibGljOgorLy8vIFxuYW1lIEVkaXRhYmxlIGxpbmVhciByYW5nZSBpbnRlcmZhY2UKKy8vLyBAeworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb2Zmc2V0IHRvIHxvZmZzZXR8LCB3aGlsZSB0cnlpbmcgdG8ga2VlcCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdW5jaGFuZ2VkIChlLmcuCisgICAgICogc2l6ZSB3aWxsIGdyb3cgaWYgb2Zmc2V0IGlzIGRlY3JlYXNlZCwgYW5kIG1heSBzaHJpbmsgaWYgb2Zmc2V0IGlzIGluY3JlYXNlZC4pIFJldHVybnMKKyAgICAgKiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gaWYgMCA8PSB8b2Zmc2V0fCA8PSBjYXBhY2l0eSgpLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlCisgICAgICogb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSBib29sIHNldE9mZnNldCh1aW50MzJfdCBvZmZzZXQpIHsKKyAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZmZzZXQgPiBtT2Zmc2V0ICsgbVNpemUpIHsKKyAgICAgICAgICAgIG1TaXplID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TaXplID0gbU9mZnNldCArIG1TaXplIC0gb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNpemUgdG8gfHNpemV8LiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0bworICAgICAqIGlmIDAgPD0gfHNpemV8IDw9IGNhcGFjaXR5KCkgLSBvZmZzZXQoKS4KKyAgICAgKgorICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZQorICAgICAqIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBzZXRTaXplKHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPiBjYXBhY2l0eSgpIC0gbU9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpemUgPSBzaXplOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvZmZzZXQgdG8gfG9mZnNldHwgd2l0aCBiZXN0IGVmZm9ydC4gU2FtZSBhcyBzZXRPZmZzZXQoKSBleGNlcHQgdGhhdCBvZmZzZXQgd2lsbAorICAgICAqIGJlIGNsYW1wZWQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKgorICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIChldmVuIHVzaW5nIGJlc3QgZWZmb3J0KSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nCisgICAgICogb24gdGhlIG9yZGVyIG9mIHRoZSBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0T2Zmc2V0X2JlKHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICAodm9pZClzZXRPZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNpemUgdG8gfHNpemV8IHdpdGggYmVzdCBlZmZvcnQuIFNhbWUgYXMgc2V0U2l6ZSgpIGV4Y2VwdCB0aGF0IHRoZSBzZWxlY3RlZCByZWdpb24KKyAgICAgKiB3aWxsIGJlIGNsYW1wZWQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eSAoZS5nLiBzaXplIGlzIGNsYW1wZWQgdG8gWzAsIGNhcGFjaXR5KCkgLSBvZmZzZXQoKV0pLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgKGV2ZW4gdXNpbmcgYmVzdCBlZmZvcnQpIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcKKyAgICAgKiBvbiB0aGUgb3JkZXIgb2YgdGhlIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRTaXplX2JlKHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgbVNpemUgPSBjMl9taW4oc2l6ZSwgY2FwYWNpdHkoKSAtIG1PZmZzZXQpOworICAgIH0KKy8vLyBAfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEFMTE9DQVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vIFxpbmdyb3VwIGFsbG9jYXRvciBBbGxvY2F0aW9uIGFuZCBtZW1vcnkgcGxhY2VtZW50CisvLy8gQHsKKworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uOworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbjsKKworLyoqCisgKiAgQWxsb2NhdG9ycyBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGFsbG9jYXRlIG1lbW9yeSAoYWxsb2NhdGlvbnMpIGZvciBidWZmZXJzLiBUaGV5IGNhbgorICogIHN1cHBvcnQgZWl0aGVyIDFEIG9yIDJEIGFsbG9jYXRpb25zLgorICoKKyAqICBcbm90ZSBJbiB0aGVvcnkgdGhleSBjb3VsZCBzdXBwb3J0IGJvdGgsIGJ1dCBpbiBwcmFjdGljZSwgd2Ugd2lsbCB1c2Ugb25seSBvbmUgb3IgdGhlIG90aGVyLgorICoKKyAqICBOZXZlciBjb25zdHJ1Y3RlZCBvbiBzdGFjay4KKyAqCisgKiAgQWxsb2NhdG9ycyBhcmUgcHJvdmlkZWQgYnkgdmVuZG9ycy4KKyAqLworY2xhc3MgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRvciBJRCB0eXBlLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDMyX3QgaWRfdDsKKyAgICBlbnVtIDogaWRfdCB7CisgICAgICAgIEJBRF9JRCA9IDB4QkFERCwgLy8gaW52YWxpZCBhbGxvY2F0b3IgSUQKKyAgICB9OworCisgICAgLyoqCisgICAgICogQWxsb2NhdGlvbiB0eXBlcy4gVGhpcyBpcyBhIGJpdG1hc2sgYW5kIGlzIHVzZWQgaW4gQzJBbGxvY2F0b3I6OkluZm8KKyAgICAgKiB0byBsaXN0IHRoZSBzdXBwb3J0ZWQgYWxsb2NhdGlvbiB0eXBlcyBvZiBhbiBhbGxvY2F0b3IuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIExJTkVBUiAgPSAxIDw8IDAsIC8vCisgICAgICAgIEdSQVBISUMgPSAxIDw8IDEsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uIGFib3V0IGFuIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEFsbG9jYXRvcnMgZG9uJ3QgaGF2ZSBhIHF1ZXJ5IEFQSSBzbyBhbGwgcXVlcmlhYmxlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlLgorICAgICAqLworICAgIHN0cnVjdCBUcmFpdHMgeworICAgICAgICBDMlN0cmluZyBuYW1lOyAgICAgICAgICAgICAgLy8vPCBhbGxvY2F0b3IgbmFtZQorICAgICAgICBpZF90IGlkOyAgICAgICAgICAgICAgICAgICAgLy8vPCBhbGxvY2F0b3IgSUQKKyAgICAgICAgdHlwZV90IHN1cHBvcnRlZFR5cGVzOyAgICAgIC8vLzwgc3VwcG9ydGVkIGFsbG9jYXRpb24gdHlwZXMKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtaW5pbXVtVXNhZ2U7IC8vLzwgdXNhZ2UgdGhhdCBpcyBtaW5pbWFsbHkgcmVxdWlyZWQgZm9yIGFsbG9jYXRpb25zCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgbWF4aW11bVVzYWdlOyAvLy88IHVzYWdlIHRoYXQgaXMgbWF4aW1hbGx5IGFsbG93ZWQgZm9yIGFsbG9jYXRpb25zCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yLgorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBhbGxvY2F0b3IuIFRoaXMgSUQgaXMgdXNlZCB0byBnZXQgdGhpcyBhbGxvY2F0b3IgZnJvbSB0aGUKKyAgICAgKiBhbGxvY2F0b3Igc3RvcmUsIGFuZCB0byBpZGVudGlmeSB0aGlzIGFsbG9jYXRvciBhY3Jvc3MgYWxsIHByb2Nlc3Nlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBhbGxvY2F0b3IuCisgICAgICovCisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIHRyYWl0cy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogQWxsb2NhdG9ycyBkb24ndCBoYXZlIGEgZnVsbC1mbGVkZ2VkIHF1ZXJ5IEFQSSwgb25seSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYWxsb2NhdG9yIGluZm9ybWF0aW9uCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSAxRCBhbGxvY2F0aW9uIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzCisgICAgICogc3RvcmVkIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgICAgIHRoZSBzaXplIG9mIHJlcXVlc3RlZCBhbGxvY2F0aW9uICh0aGUgYWxsb2NhdGlvbiBjb3VsZCBiZSBzbGlnaHRseQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxhcmdlciwgZS5nLiB0byBhY2NvdW50IGZvciBhbnkgc3lzdGVtLXJlcXVpcmVkIGFsaWdubWVudCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNob3VsZCBsYXlvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGNhcGFjaXR5IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpY3JlYXRlcyBhIDFEIGFsbG9jYXRpb24gZnJvbSBhIG5hdGl2ZSB8aGFuZGxlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlIGFsbG9jYXRpb24gaXMgc3RvcmVkCisgICAgICogaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICAgIHRoZSBoYW5kbGUgZm9yIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uLiBPbiBzdWNjZXNzLCB0aGUgYWxsb2NhdGlvbiB3aWxsCisgICAgICogICAgICAgICAgICAgICAgICAgIHRha2Ugb3duZXJzaGlwIG9mIHxoYW5kbGV8LgorICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHJlY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSByZWNyZWF0aW9uIHRpbWVkIG91dCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgaW52YWxpZCBoYW5kbGUgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDFEIGFsbG9jYXRpb25zCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIDJEIGFsbG9jYXRpb24gb2YgZ2l2ZW4gfHdpZHRofCwgfGhlaWdodHwsIHxmb3JtYXR8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLAorICAgICAqIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZCBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gd2lkdGggICAgICAgICB0aGUgd2lkdGggb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBoZWlnaHQgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBmb3JtYXQgICAgICAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFRoaXMgY291bGQgYmUgYSB2ZW5kb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3JtYXQuCisgICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFxub3RlIHRoYXQgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYWxsb2NhdGlvbiBtYXkgYmUgbGF0ZXIgdXNlZC9tYXBwZWQgd2l0aCBkaWZmZXJlbnQgdXNhZ2UuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIGFsbG9jYXRvciBzaG91bGQgbGF5b3V0IHRoZSBidWZmZXIgdG8gYmUgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBtdXN0IHN1cHBvcnQgYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOiBwcm90ZWN0ZWQgYnVmZmVycyBjYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gICAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGlvbiBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBhbGxvY2F0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCBfX3VudXNlZCwgdWludDMyX3QgaGVpZ2h0IF9fdW51c2VkLCB1aW50MzJfdCBmb3JtYXQgX191bnVzZWQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpY3JlYXRlcyBhIDJEIGFsbG9jYXRpb24gZnJvbSBhIG5hdGl2ZSBoYW5kbGUuICBJZiBzdWNjZXNzZnVsLCB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQKKyAgICAgKiBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgdGhlIGhhbmRsZSBmb3IgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24uIE9uIHN1Y2Nlc3MsIHRoZSBhbGxvY2F0aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGFrZSBvd25lcnNoaXAgb2YgfGhhbmRsZXwuCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgcmVjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIHJlY3JlYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMkQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgcmVjcmVhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcigpID0gZGVmYXVsdDsKK3Byb3RlY3RlZDoKKyAgICBDMkFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKKy8qKgorICogXGluZ3JvdXAgbGluZWFyIGFsbG9jYXRvcgorICogMUQgYWxsb2NhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2NsYXNzIEMyTGluZWFyQWxsb2NhdGlvbiA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyBhIHBvcnRpb24gb2YgYW4gYWxsb2NhdGlvbiBzdGFydGluZyBmcm9tIHxvZmZzZXR8IHdpdGggfHNpemV8IGludG8gbG9jYWwgcHJvY2VzcyBtZW1vcnkuCisgICAgICogU3RvcmVzIHRoZSBzdGFydGluZyBhZGRyZXNzIGludG8gfGFkZHJ8LCBvciBOVUxMIGlmIHRoZSBvcGVyYXRpb24gd2FzIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKiB8ZmVuY2V8IHdpbGwgY29udGFpbiBhbiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0LiBJZiBpdCBpcyBhbHJlYWR5CisgICAgICogc2FmZSB0byBhY2Nlc3MgdGhlIGJ1ZmZlciBjb250ZW50cywgdGhlbiBpdCB3aWxsIGNvbnRhaW4gYW4gZW1wdHkgKGFscmVhZHkgZmlyZWQpIGZlbmNlLgorICAgICAqCisgICAgICogXHBhcmFtIG9mZnNldCAgICAgICAgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIHBvcnRpb24gdG8gYmUgbWFwcGVkICh0aGlzIGRvZXMgbm90IGhhdmUgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBiZSBwYWdlIGFsaWduZWQpCisgICAgICogXHBhcmFtIHNpemUgICAgICAgICAgc2l6ZSBvZiB0aGUgcG9ydGlvbiB0byBiZSBtYXBwZWQgKHRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSBwYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgZGVzaXJlZCB1c2FnZS4gXHRvZG8gdGhpcyBtdXN0IGJlIGtTb2Z0d2FyZVJlYWQgYW5kL29yCisgICAgICogICAgICAgICAgICAgICAgICAgICAga1NvZnR3YXJlV3JpdGUuCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIG1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhbmQgYWNxdWlyZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmVuY2Ugb24gZmFpbHVyZS4gSWYgbnVsbCwgdGhlIG1hcHBpbmcgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCBwb3J0aW9uIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQuIE9uIGZhaWx1cmUsIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZS4KKyAgICAgKgorICAgICAqIFx0b2RvIE9ubHkgb25lIHBvcnRpb24gY2FuIGJlIG1hcHBlZCBhdCB0aGUgc2FtZSB0aW1lIC0gdGhpcyBpcyB0cnVlIGZvciBncmFsbG9jLCBidXQgdGhlcmUKKyAgICAgKiAgICAgICBpcyBubyBuZWVkIGZvciB0aGlzIGZvciAxRCBidWZmZXJzLgorICAgICAqIFx0b2RvIERvIHdlIG5lZWQgdG8gc3VwcG9ydCBzeW5jIG9wZXJhdGlvbiBhcyB3ZSBjb3VsZCBqdXN0IHdhaXQgZm9yIHRoZSBmZW5jZT8KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIG1hcCB0aGUgcG9ydGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgaWYgdGhlIGFsbG9jYXRpb24gaXMgYWxyZWFkeSBtYXBwZWQuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChvZmZzZXQvc2l6ZSkgYXJlIGludmFsaWQgb3Igb3V0c2lkZSB0aGUgYWxsb2NhdGlvbiwgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNhZ2UgZmxhZ3MgYXJlIGludmFsaWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovLAorICAgICAgICAgICAgdm9pZCAqKmFkZHIgLyogbm9ubnVsbCAqLykgPSAwOworCisgICAgLyoqCisgICAgICogVW5tYXBzIGEgcG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uIGF0IHxhZGRyfCB3aXRoIHxzaXplfC4gVGhlc2UgbXVzdCBiZSBwYXJhbWV0ZXJzIHByZXZpb3VzbHkKKyAgICAgKiBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHxtYXB8OyBvdGhlcndpc2UsIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBtYXBwZWQgcmVnaW9uCisgICAgICogXHBhcmFtIHNpemUgICAgICAgICAgc2l6ZSBvZiB0aGUgbWFwcGVkIHJlZ2lvbgorICAgICAqIFxwYXJhbSBmZW5jZSAgICAgICAgIGEgcG9pbnRlciB0byBhIGZlbmNlIG9iamVjdCBpZiBhbiBhc3luYyB1bm1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhIHJlbGVhc2UgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLCBvciBlbXB0eSBmZW5jZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9uIGZhaWx1cmUuIFRoaXMgZmVuY2Ugc2lnbmFscyB3aGVuIHRoZSBvcmlnaW5hbCBhbGxvY2F0aW9uIGNvbnRhaW5zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYWxsIGNoYW5nZXMgdGhhdCBoYXBwZW5lZCB0byB0aGUgbWFwcGVkIHJlZ2lvbi4gSWYgbnVsbCwgdGhlIHVubWFwcGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYWxsb2NhdGlvbiB3YXMgbm90IG1hcHBlZCBwcmV2aW91c2x5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChhZGRyL3NpemUpIGRvIG5vdCBjb3JyZXNwb25kIHRvIHByZXZpb3VzbHkgbWFwcGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcmVnaW9ucyAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byB1bm1hcCB0aGUgcG9ydGlvbiAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIElEIGZvciB0aGlzIGFsbG9jYXRpb24uIFRoaXMgaXMgdXNlZnVsIHRvIHB1dCB0aGUgaGFuZGxlIGludG8gY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRpb24gaGFuZGxlLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzYW1lIGFsbG9jYXRpb24gYXMgfG90aGVyfC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gXHRvZG8gc2hvdWxkIHdlIGxpbWl0IGFsbG9jYXRpb24gZGlyZWN0bHk/CisgICAgQzJMaW5lYXJBbGxvY2F0aW9uKHNpemVfdCBjYXBhY2l0eSkgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjMl9taW4oY2FwYWNpdHksIFVJTlQzMl9NQVgpKSB7fQorICAgIHZpcnR1YWwgfkMyTGluZWFyQWxsb2NhdGlvbigpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQ2lyY3VsYXJCbG9jazsKK2NsYXNzIEMyTGluZWFyQmxvY2s7CitjbGFzcyBDMkdyYXBoaWNCbG9jazsKKworLyoqCisgKiAgQmxvY2sgcG9vbHMgYXJlIHVzZWQgYnkgY29tcG9uZW50cyB0byBvYnRhaW4gb3V0cHV0IGJ1ZmZlcnMgaW4gYW4gZWZmaWNpZW50IHdheS4gVGhleSBjYW4KKyAqICBzdXBwb3J0IGVpdGhlciBsaW5lYXIgKDFEKSwgY2lyY3VsYXIgKDFEKSBvciBncmFwaGljICgyRCkgYmxvY2tzLgorICoKKyAqICBCbG9jayBwb29scyBkZWNvdXBsZSB0aGUgcmVjeWNsaW5nIG9mIG1lbW9yeS9hbGxvY2F0aW9ucyBmcm9tIHRoZSBjb21wb25lbnRzLiBUaGV5IGFyZSBtZWFudCB0bworICogIGJlIGFuIG9wYXF1ZSBzZXJ2aWNlICh0aGVyZSBhcmUgbm8gcHVibGljIEFQSXMgb3RoZXIgdGhhbiBvYnRhaW5pbmcgYmxvY2tzKSBwcm92aWRlZCBieSB0aGUKKyAqICBwbGF0Zm9ybS4gQmxvY2sgcG9vbHMgYXJlIGFsc28gbWVhbnQgdG8gZGVjb3VwbGUgYWxsb2NhdGlvbnMgZnJvbSBtZW1vcnkgdXNlZCBieSBidWZmZXJzLiBUaGlzCisgKiAgaXMgYWNjb21wbGlzaGVkIGJ5IGFsbG93aW5nIHBvb2xzIHRvIGFsbG90IG11bHRpcGxlIG1lbW9yeSAnYmxvY2tzJyBvbiBhIHNpbmdsZSBhbGxvY2F0aW9uLiBBcworICogIHRoZWlyIG5hbWUgc3VnZ2VzdCwgYmxvY2sgcG9vbHMgbWFpbnRhaW4gYSBwb29sIG9mIG1lbW9yeSBibG9ja3MuIFdoZW4gYSBjb21wb25lbnQgYXNrcyBmb3IKKyAqICBhIG1lbW9yeSBibG9jaywgcG9vbHMgd2lsbCB0cnkgdG8gcmV0dXJuIGEgZnJlZSBtZW1vcnkgYmxvY2sgYWxyZWFkeSBpbiB0aGUgcG9vbC4gSWYgbm8gc3VjaAorICogIGJsb2NrIGV4aXN0cywgdGhleSB3aWxsIGFsbG9jYXRlIG1lbW9yeSB1c2luZyB0aGUgYmFja2luZyBhbGxvY2F0b3IgYW5kIGFsbG90IGEgYmxvY2sgb24gdGhhdAorICogIGFsbG9jYXRpb24uIFdoZW4gYmxvY2tzIGFyZSBubyBsb25nZXIgdXNlZCBpbiB0aGUgc3lzdGVtLCB0aGV5IGFyZSByZWN5Y2xlZCBiYWNrIHRvIHRoZSBibG9jaworICogIHBvb2wgYW5kIGFyZSBhdmFpbGFibGUgYXMgZnJlZSBibG9ja3MuCisgKgorICogIE5ldmVyIGNvbnN0cnVjdGVkIG9uIHN0YWNrLgorICovCitjbGFzcyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQmxvY2sgcG9vbCBJRCB0eXBlLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDY0X3QgbG9jYWxfaWRfdDsKKworICAgIGVudW0gOiBsb2NhbF9pZF90IHsKKyAgICAgICAgQkFTSUNfTElORUFSID0gMCwgIC8vLzwgSUQgb2YgYmFzaWMgKHVub3B0aW1pemVkKSBibG9jayBwb29sIGZvciBmZXRjaGluZyAxRCBibG9ja3MKKyAgICAgICAgQkFTSUNfR1JBUEhJQyA9IDEsIC8vLzwgSUQgb2YgYmFzaWMgKHVub3B0aW1pemVkKSBibG9jayBwb29sIGZvciBmZXRjaGluZyAyRCBibG9ja3MKKyAgICAgICAgUExBVEZPUk1fU1RBUlQgPSAweDEwLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJRCBmb3IgdGhpcyBibG9jayBwb29sLiBUaGlzIElEIGlzIHVzZWQgdG8gZ2V0IHRoaXMgYmxvY2sgcG9vbCBmcm9tIHRoZSBwbGF0Zm9ybS4KKyAgICAgKiBJdCBpcyBvbmx5IHZhbGlkIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBsb2NhbCBJRCBmb3IgdGhpcyBibG9jayBwb29sLgorICAgICAqLworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIG9mIHRoaXMgYmxvY2sgcG9vbC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIG9mIHRoaXMgYmxvY2sgcG9vbC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIGxpbmVhciB3cml0ZWFibGUgYmxvY2sgb2YgZ2l2ZW4gfGNhcGFjaXR5fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlCisgICAgICogYmxvY2sgaXMgc3RvcmVkIGluIHxibG9ja3wuIE90aGVyd2lzZSwgfGJsb2NrfCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGNhcGFjaXR5IHRoZSBzaXplIG9mIHJlcXVlc3RlZCBibG9jay4KKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJsb2Nrcy9idWZmZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGJsb2NrICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgbGluZWFyIGJsb2NrcworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIGNpcmN1bGFyIHdyaXRlYWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLCB0aGUKKyAgICAgKiBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGNpcmN1bGFyIGJsb2NrLiAobm90ZTogdGhlIHNpemUgb2YgdGhlIG9idGFpbmVkCisgICAgICogICAgICAgICAgICAgICAgIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwgZS5nLiB0byBhY2NvbW1vZGF0ZSBhbnkgc3lzdGVtLXJlcXVpcmVkCisgICAgICogICAgICAgICAgICAgICAgIGFsaWdubWVudCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJsb2Nrcy9idWZmZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGJsb2NrICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgY2lyY3VsYXIgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQ2lyY3VsYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIDJEIGdyYXBoaWMgYmxvY2sgb2YgZ2l2ZW4gfHdpZHRofCwgfGhlaWdodHwsIHxmb3JtYXR8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLAorICAgICAqIHRoZSBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gd2lkdGggIHRoZSB3aWR0aCBvZiByZXF1ZXN0ZWQgYmxvY2sgKHRoZSBvYnRhaW5lZCBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsIGUuZy4KKyAgICAgKiAgICAgICAgICAgICAgIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZXF1ZXN0ZWQgYmxvY2sgKHRoZSBvYnRhaW5lZCBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsCisgICAgICogICAgICAgICAgICAgICBlLmcuIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBmb3JtYXQgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYmxvY2suIFRoaXMgY291bGQgYmUgYSB2ZW5kb3Igc3BlY2lmaWMgZm9ybWF0LgorICAgICAqIFxwYXJhbSB1c2FnZSAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLCBidXQgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246CisgICAgICogICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBpcyBibG9ja2VkCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgcG9vbCBkb2VzIG5vdCBzdXBwb3J0IDJEIGJsb2NrcworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoIF9fdW51c2VkLCB1aW50MzJfdCBoZWlnaHQgX191bnVzZWQsIHVpbnQzMl90IGZvcm1hdCBfX3VudXNlZCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgICpibG9jayA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyQmxvY2tQb29sKCkgPSBkZWZhdWx0OworcHJvdGVjdGVkOgorICAgIEMyQmxvY2tQb29sKCkgPSBkZWZhdWx0OworfTsKKworLy8vIEB9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEJMT0NLUworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKgorICogQmxvY2tzIGFyZSBzZWN0aW9ucyBvZiBhbGxvY2F0aW9ucy4gVGhleSBjYW4gYmUgZWl0aGVyIDFEIG9yIDJELgorICovCisKK2NsYXNzIEMyTGluZWFyQWxsb2NhdGlvbjsKKworLyoqCisgKiBBIDFEIGJsb2NrLgorICoKKyAqIFxub3RlIGNhcGFjaXR5KCkgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHVzZXJzIG9mIGJsb2NrczsgaW5zdGVhZCBzaXplKCkgaXMgdGhlIGNhcGFjaXR5IG9mIHRoZQorICogdXNhYmxlIHBvcnRpb24uIFVzZSBhbmQgb2Zmc2V0KCkgYW5kIHNpemUoKSBpZiBhY2Nlc3NpbmcgdGhlIGJsb2NrIGRpcmVjdGx5IHRocm91Z2ggaXRzIGhhbmRsZQorICogdG8gcmVwcmVzZW50IHRoZSBhbGxvdHRlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uIHRvIHRoaXMgYmxvY2suCisgKi8KK2NsYXNzIEMyQmxvY2sxRCA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBoYW5kbGUgZm9yIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIFxub3RlIHRoYXQgdGhlIGJsb2NrIGFuZCBpdHMgYmxvY2sgcG9vbCBoYXMgc2hhcmVkIG93bmVyc2hpcCBvZiB0aGUgaGFuZGxlCisgICAgICogICAgICAgYW5kIGlmIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBibG9jayBhcmUgcmVsZWFzZWQsIHRoZSB1bmRlcmx5aW5nIGJsb2NrCisgICAgICogICAgICAgYWxsb2NhdGlvbiBtYXkgZ2V0IHJldXNlZCBldmVuIGlmIGEgY2xpZW50IGtlZXBzIGEgY2xvbmUgb2YgdGhpcyBoYW5kbGUuCisgICAgICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgdGhhdCBjcmVhdGVkIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gZm9yIHRoaXMgYmxvY2suIFRoaXMKKyAgICAgKiBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaGFuZGxlLgorICAgICAqLworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIC8qKiBjb25zdHJ1Y3QgYSBibG9jay4gKi8KKyAgICBDMkJsb2NrMUQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSk7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIFJlYWQgdmlldyBwcm92aWRlcyByZWFkLW9ubHkgYWNjZXNzIGZvciBhIGxpbmVhciBtZW1vcnkgc2VnbWVudC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICovCitjbGFzcyBDMlJlYWRWaWV3IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvcnRpb24gb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogXHBhcmFtIG9mZnNldCAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSBjYXBhY2l0eSBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgIHZpZXcuCisgICAgICogXHBhcmFtIHNpemUgICAgdGhlIHNpemUgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgcmVtYWluaW5nIGRhdGEgZnJvbSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgdmlldworICAgICAqLworICAgIEMyUmVhZFZpZXcgc3ViVmlldyhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGVycm9yIGR1cmluZyB0aGUgY3JlYXRpb24vbWFwcGluZyBvZiB0aGlzIHZpZXcuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZXJyb3IoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIHRoaXMgdmlldy4gVGhpcyBzZXRzIGVycm9yIHRvIEMyX05PX0lOSVQuCisgICAgICovCisgICAgLy92b2lkIHJlbGVhc2UoKTsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgQzJSZWFkVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKTsKKyAgICBleHBsaWNpdCBDMlJlYWRWaWV3KGMyX3N0YXR1c190IGVycm9yKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgdWludDMyX3QgbU9mZnNldDsgLyoqPCBvZmZzZXQgaW50byB0aGUgbGluZWFyIGJsb2NrIGJhY2tpbmcgdGhpcyByZWFkIHZpZXcgKi8KK307CisKKy8qKgorICogV3JpdGUgdmlldyBwcm92aWRlcyByZWFkL3dyaXRlIGFjY2VzcyBmb3IgYSBsaW5lYXIgbWVtb3J5IHNlZ21lbnQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4gXHRvZG8gbW92YWJsZSBvbmx5PworICovCitjbGFzcyBDMldyaXRlVmlldyA6IHB1YmxpYyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTdGFydCBvZiB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgdWludDhfdCAqYmFzZSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBibG9jayBhdCB0aGUgY3VycmVudCBvZmZzZXQgb3IgbnVsbHB0ciBvbiBlcnJvci4KKyAgICAgKiAgICAgICAgIFRoaXMgcG9pbnRlciBpcyBvbmx5IHZhbGlkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhpcyB2aWV3IG9yIHVudGlsIGl0IGlzIHJlbGVhc2VkLgorICAgICAqLworICAgIHVpbnQ4X3QgKmRhdGEoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhpcyB2aWV3LiBUaGlzIHNldHMgZXJyb3IgdG8gQzJfTk9fSU5JVC4KKyAgICAgKi8KKyAgICAvL3ZvaWQgcmVsZWFzZSgpOworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMldyaXRlVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCk7CisgICAgZXhwbGljaXQgQzJXcml0ZVZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSBjb25zdGFudCAocmVhZC1vbmx5KSBsaW5lYXIgYmxvY2sgKHBvcnRpb24gb2YgYW4gYWxsb2NhdGlvbikgd2l0aCBhbiBhY3F1aXJlIGZlbmNlLgorICogQmxvY2tzIGFyZSB1bm1hcHBlZCB3aGVuIGNyZWF0ZWQsIGFuZCBjYW4gYmUgbWFwcGVkIGludG8gYSByZWFkIHZpZXcgb24gZGVtYW5kLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUgYW5kIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBhbGxvY2F0aW9uIHRoYXQgaXQgaXMgYmFzZWQgb24uCisgKi8KK2NsYXNzIEMyQ29uc3RMaW5lYXJCbG9jayA6IHB1YmxpYyBDMkJsb2NrMUQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHJlYWQgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiBtYXAoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNhcGFjaXR5IG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgYmxvY2suCisgICAgICogXHBhcmFtIHNpemUgICAgdGhlIHNpemUgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgcmVtYWluaW5nIGRhdGEgZnJvbSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGluZWFyIGJsb2NrIGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2sKKyAgICAgKi8KKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgc3ViQmxvY2soc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZSBmb3IgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBmZW5jZSB0aGF0IG11c3QgYmUgd2FpdGVkIG9uIGJlZm9yZSByZWFkaW5nIHRoZSBibG9jay4KKyAgICAgKi8KKyAgICBDMkZlbmNlIGZlbmNlKCkgY29uc3QgeyByZXR1cm4gbUZlbmNlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBDMkNvbnN0TGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSwgQzJGZW5jZSBtRmVuY2UpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIEMyRmVuY2UgbUZlbmNlOworfTsKKworLyoqCisgKiBMaW5lYXIgYmxvY2sgaXMgYSB3cml0ZWFibGUgMUQgYmxvY2suIE9uY2Ugd3JpdHRlbiwgaXQgY2FuIGJlIHNoYXJlZCBpbiB3aG9sZSBvciBpbiBwYXJ0cyB3aXRoCisgKiBjb25zdW1lcnMvcmVhZGVycyBhcyByZWFkLW9ubHkgY29uc3QgbGluZWFyIGJsb2NrKHMpLgorICovCitjbGFzcyBDMkxpbmVhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IG1hcCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2sgZm9yIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrOyBvcHRpb25hbGx5IHByb3RlY3RlZAorICAgICAqIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpczoKKyAgICAgKgorICAgICAqIDEpIHNoYXJlIHJlYWR5IGJsb2NrIGFmdGVyIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4gdGhpcyBjYXNlIG5vIGZlbmNlIHNoYWxsIGJlCisgICAgICogICAgc3VwcGxpZWQsIGFuZCB0aGUgYmxvY2sgc2hhbGwgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogMikgc2hhcmUgYmxvY2sgbWV0YWRhdGEgYmVmb3JlIGFjdHVhbGx5IChmaW5pc2hpbmcpIHdyaXRpbmcgdGhlIGRhdGEgaW50byB0aGUgYmxvY2suIEluCisgICAgICogICAgdGhpcyBjYXNlIGEgZmVuY2UgbXVzdCBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgKiAgICBUaGUgYmxvY2sgc2hhbGwgYmUgbW9kaWZpZWQgb25seSB1bnRpbCBmaXJpbmcgdGhlIGV2ZW50IGZvciB0aGUgZmVuY2UuCisgICAgICovCisgICAgQzJDb25zdExpbmVhckJsb2NrIHNoYXJlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlKTsKKworcHJvdGVjdGVkOgorICAgIEMyTGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSk7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKK307CisKKy8vLyBAfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQ0lSQ1VMQVIgQkxPQ0tTIEFORCBWSUVXUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLyBcZGVmZ3JvdXAgY2lyY3VsYXIgQ2lyY3VsYXIgYnVmZmVyIHN1cHBvcnQKKy8vLyBAeworCisvKioKKyAqIENpcmN1bGFyIGJsb2NrcyBjYW4gYmUgdXNlZCB0byBzaGFyZSBkYXRhIGJldHdlZW4gYSB3cml0ZXIgYW5kIGEgcmVhZGVyIChhbmQvb3Igb3RoZXIgY29uc3VtZXJzKS0KKyAqIGluIGEgbWVtb3J5LWVmZmljaWVudCB3YXkgYnkgcmV1c2luZyBhIHNlY3Rpb24gb2YgbWVtb3J5LiBDaXJjdWxhciBibG9ja3MgYXJlIGEgYml0IG1vcmUgY29tcGxleAorICogdGhhbiBzaW5nbGUgcmVhZGVyL3NpbmdsZSB3cml0ZXIgc2NoZW1lcyB0byBmYWNpbGl0YXRlIGJsb2NrLWJhc2VkIGNvbnN1bWluZyBvZiBkYXRhLgorICoKKyAqIFRoZXkgY2FuIG9wZXJhdGUgaW4gdHdvIG1vZGVzOgorICoKKyAqIDEpIG9uZSB3cml0ZXIgdGhhdCBjcmVhdGVzIGJsb2NrcyB0byBiZSBjb25zdW1lZCAodGhpcyBtb2RlbCBjYW4gYmUgdXNlZCBieSBjb21wb25lbnRzKQorICoKKyAqIDIpIG9uZSB3cml0ZXIgdGhhdCB3cml0ZXMgY29udGludW91c2x5LCBhbmQgb25lIHJlYWRlciB0aGF0IGNhbiBjcmVhdGVzIGJsb2NrcyB0byBiZSBjb25zdW1lZAorICogICAgYnkgZnVydGhlciByZWNpcGllbnRzICh0aGlzIG1vZGVsIGlzIHVzZWQgYnkgdGhlIGZyYW1ld29yaywgYW5kIGNhbm5vdCBiZSB1c2VkIGJ5IGNvbXBvbmVudHMuKQorICoKKyAqIENpcmN1bGFyIGJsb2NrcyBoYXZlIGZvdXIgc2VnbWVudHMgd2l0aCBydW5uaW5nIHBvaW50ZXJzOgorICogIC0gcmVzZXJ2ZWQ6IGRhdGEgcmVzZXJ2ZWQgYW5kIGF2YWlsYWJsZSBmb3IgdGhlIHdyaXRlcgorICogIC0gY29tbWl0dGVkOiBkYXRhIGNvbW1pdHRlZCBieSB0aGUgd3JpdGVyIGFuZCBhdmFpbGFibGUgdG8gdGhlIHJlYWRlciAoaWYgcHJlc2VudCkKKyAqICAtIHVzZWQ6IGRhdGEgdXNlZCBieSBjb25zdW1lcnMgKGlmIHByZXNlbnQpCisgKiAgLSBhdmFpbGFibGU6IHVudXNlZCBkYXRhIGF2YWlsYWJsZSB0byBiZSByZXNlcnZlZAorICovCitjbGFzcyBDMkNpcmN1bGFyQmxvY2sgOiBwdWJsaWMgQzJCbG9jazFEIHsKKyAgICAvLyBUT0RPOiBhZGQgbWV0aG9kcworCitwcml2YXRlOgorICAgIHNpemVfdCBtUmVzZXJ2ZWQgX191bnVzZWQ7ICAgLy8gZW5kIG9mIHJlc2VydmVkIHNlY3Rpb24KKyAgICBzaXplX3QgbUNvbW1pdHRlZCBfX3VudXNlZDsgIC8vIGVuZCBvZiBjb21taXR0ZWQgc2VjdGlvbgorICAgIHNpemVfdCBtVXNlZCBfX3VudXNlZDsgICAgICAgLy8gZW5kIG9mIHVzZWQgc2VjdGlvbgorICAgIHNpemVfdCBtRnJlZSBfX3VudXNlZDsgICAgICAgLy8gZW5kIG9mIGZyZWUgc2VjdGlvbgorfTsKKworY2xhc3MgX0MyQ2lyY3VsYXJCbG9ja1NlZ21lbnQgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGF2YWlsYWJsZSBzaXplIGZvciB0aGlzIHNlZ21lbnQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGN1cnJlbnRseSBhdmFpbGFibGUgc2l6ZSBmb3IgdGhpcyBzZWdtZW50CisgICAgICovCisgICAgc2l6ZV90IGF2YWlsYWJsZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVzZXJ2ZSBzb21lIHNwYWNlIGZvciB0aGlzIHNlZ21lbnQgZnJvbSBpdHMgY3VycmVudCBzdGFydC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIGRlc2lyZWQgc3BhY2UgaW4gYnl0ZXMKKyAgICAgKiBccGFyYW0gZmVuY2UgICBhIHBvaW50ZXIgdG8gYW4gYWNxdWlyZSBmZW5jZS4gSWYgbm9uLW51bGwsIHRoZSByZXNlcnZhdGlvbiBpcyBhc3luY2hyb25vdXMgYW5kCisgICAgICogICAgICAgICAgICAgIGEgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSB0aGF0IHdpbGwgYmUgc2lnbmFsZWQgd2hlbiB0aGUgcmVzZXJ2YXRpb24gaXMKKyAgICAgKiAgICAgICAgICAgICAgY29tcGxldGUuIElmIG51bGwsIHRoZSByZXNlcnZhdGlvbiBpcyBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgc3BhY2Ugd2FzIHN1Y2Nlc3NmdWxseSByZXNlcnZlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICB0aGUgc3BhY2UgcmVxdWVzdGVkIGNhbm5vdCBiZSByZXNlcnZlZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgcmVzZXJ2YXRpb24gdGltZWQgb3V0IFx0b2RvIHdoZW4/CisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVzZXJ2aW5nIHNwYWNlLiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCByZXNlcnZlKHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLyk7CisKKyAgICAvKioKKyAgICAgKiBBYmFuZG9ucyBhIHBvcnRpb24gb2YgdGhpcyBzZWdtZW50LiBUaGlzIHdpbGwgbW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kcyBpcyBvbmx5IGFsbG93ZWQgaWYgdGhpcyBzZWdtZW50IGlzIHByb2R1Y2luZyBibG9ja3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gc2l6ZSAgICBudW1iZXIgb2YgYnl0ZXMgdG8gYWJhbmRvbgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgYWJhbmRvbmVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGFiYW5kb25pbmcgdGhlIGRhdGEgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgYWJhbmRvbihzaXplX3Qgc2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBTaGFyZSBhIHBvcnRpb24gYXMgYmxvY2socykgd2l0aCBjb25zdW1lcnMgKHRoZXNlIGFyZSBtb3ZlZCB0byB0aGUgdXNlZCBzZWN0aW9uKS4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kcyBpcyBvbmx5IGFsbG93ZWQgaWYgdGhpcyBzZWdtZW50IGlzIHByb2R1Y2luZyBibG9ja3MuCisgICAgICogXG5vdGUgU2hhcmUgZG9lcyBub3QgbW92ZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50LiAoXHRvZG8gYWRkIGFiYW5kb24vb2Zmc2V0PykKKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBzaGFyZQorICAgICAqIFxwYXJhbSBmZW5jZSAgIGZlbmNlIHRvIGJlIHVzZWQgZm9yIHRoZSBzZWN0aW9uCisgICAgICogXHBhcmFtIGJsb2NrcyAgdmVjdG9yIHdoZXJlIHRoZSBibG9ja3Mgb2YgdGhlIHNlY3Rpb24gYXJlIGFwcGVuZGVkIHRvCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIHBvcnRpb24gd2FzIHN1Y2Nlc3NmdWxseSBzaGFyZWQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSAgICAgbm90IGVub3VnaCBtZW1vcnkgdG8gc2hhcmUgdGhlIHBvcnRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2hhcmluZyB0aGUgZGF0YSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBzaGFyZShzaXplX3Qgc2l6ZSwgQzJGZW5jZSBmZW5jZSwgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJlZ2lubmluZyBvZmZzZXQgb2YgdGhpcyBzZWdtZW50IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgY2lyY3VsYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJlZ2lubmluZyBvZmZzZXQKKyAgICAgKi8KKyAgICBzaXplX3QgYmVnaW4oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhpcyBzZWdtZW50IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgY2lyY3VsYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVuZCBvZmZzZXQKKyAgICAgKi8KKyAgICBzaXplX3QgZW5kKCk7Cit9OworCisvKioKKyAqIEEgY2lyY3VsYXIgd3JpdGUtdmlldyBpcyBhIGR5bmFtaWMgbWFwcGVkIHZpZXcgZm9yIGEgc2VnbWVudCBvZiBhIGNpcmN1bGFyIGJsb2NrLiBDYXJlIG11c3QgYmUKKyAqIHRha2VuIHdoZW4gdXNpbmcgdGhpcyB2aWV3IHNvIHRoYXQgb25seSB0aGUgc2VjdGlvbiBvd25lZCBieSB0aGUgc2VnbWVudCBpcyBtb2RpZmllZC4KKyAqLworY2xhc3MgQzJDaXJjdWxhcldyaXRlVmlldyA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogU3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJsb2NrLgorICAgICAqIFxub3RlIHRoZSBzZWdtZW50IGRvZXMgbm90IG93biB0aGlzIHBvaW50ZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjaXJjdWxhciBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqLworICAgIHVpbnQ4X3QgKmJhc2UoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworfTsKKworLyoqCisgKiBUaGUgd3JpdGVyIG9mIGEgY2lyY3VsYXIgYnVmZmVyLgorICoKKyAqIENhbiBjb21taXQgZGF0YSB0byBhIHJlYWRlciAobm90IHN1cHBvcnRlZCBmb3IgY29tcG9uZW50cykgT1Igc2hhcmUgZGF0YSBibG9ja3MgZGlyZWN0bHkgd2l0aCBhCisgKiBjb25zdW1lci4KKyAqCisgKiBJZiBhIGNvbXBvbmVudCBzdXBwb3J0cyBvdXRwdXR0aW5nIGRhdGEgaW50byBjaXJjdWxhciBidWZmZXJzLCBpdCBtdXN0IGFsbG9jYXRlIGEgY2lyY3VsYXIKKyAqIGJsb2NrIGFuZCB1c2UgYSBjaXJjdWxhciB3cml0ZXIuCisgKi8KK2NsYXNzIEMyQ2lyY3VsYXJXcml0ZXIgOiBwdWJsaWMgX0MyQ2lyY3VsYXJCbG9ja1NlZ21lbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbW1pdHMgYSBwb3J0aW9uIG9mIHRoaXMgc2VnbWVudCB0byB0aGUgbmV4dCBzZWdtZW50LiBUaGlzIG1vdmVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICogc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBjb21taXQgdG8gdGhlIG5leHQgc2VnbWVudAorICAgICAqIFxwYXJhbSBmZW5jZSAgIGZlbmNlIHVzZWQgZm9yIHRoZSBjb21taXQgKHRoZSBmZW5jZSBtdXN0IHNpZ25hbCBiZWZvcmUgdGhlIGRhdGEgaXMgY29tbWl0dGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGNvbW1pdChzaXplX3Qgc2l6ZSwgQzJGZW5jZSBmZW5jZSk7CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSB3cml0ZSB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB3cml0ZSB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMkNpcmN1bGFyV3JpdGVWaWV3PiBtYXAoKTsKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGdyYXBoaWMgR3JhcGhpYyBEYXRhIEJsb2NrcworLy8vIEB7CisKKy8qKgorICogQzJSZWN0OiByZWN0YW5nbGUgdHlwZSB3aXRoIG5vbi1uZWdhdGl2ZSBjb29yZGluYXRlcy4KKyAqCisgKiBcbm90ZSBUaGlzIHN0cnVjdCBoYXMgcHVibGljIGZpZWxkcyB3aXRob3V0IGdldHRlcnMvc2V0dGVycy4gQWxsIG1ldGhvZHMgYXJlIGlubGluZS4KKyAqLworc3RydWN0IEMyUmVjdCB7CisvLyBwdWJsaWM6CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGxlZnQ7CisgICAgdWludDMyX3QgdG9wOworCisgICAgY29uc3RleHByIGlubGluZSBDMlJlY3QoKQorICAgICAgICA6IEMyUmVjdCgwLCAwLCAwLCAwKSB7IH0KKworICAgIGNvbnN0ZXhwciBpbmxpbmUgQzJSZWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XykKKyAgICAgICAgOiBDMlJlY3Qod2lkdGhfLCBoZWlnaHRfLCAwLCAwKSB7IH0KKworICAgIGNvbnN0ZXhwciBDMlJlY3QgaW5saW5lIGF0KHVpbnQzMl90IGxlZnRfLCB1aW50MzJfdCB0b3BfKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3Qod2lkdGgsIGhlaWdodCwgbGVmdF8sIHRvcF8pOworICAgIH0KKworICAgIC8vIHV0aWxpdHkgbWV0aG9kcworCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA8PSB+d2lkdGggJiYgdG9wIDw9IH5oZWlnaHQ7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXNWYWxpZCgpICYmICFpc0VtcHR5KCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFib29sKCp0aGlzKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBjb250YWlucyhjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpIHx8ICFvdGhlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0IDw9IG90aGVyLmxlZnQgJiYgdG9wIDw9IG90aGVyLnRvcAorICAgICAgICAgICAgICAgICAgICAmJiBsZWZ0ICsgd2lkdGggPj0gb3RoZXIubGVmdCArIG90aGVyLndpZHRoCisgICAgICAgICAgICAgICAgICAgICYmIHRvcCArIGhlaWdodCA+PSBvdGhlci50b3AgKyBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIW90aGVyLmlzVmFsaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0ID09IG90aGVyLmxlZnQgJiYgdG9wID09IG90aGVyLnRvcAorICAgICAgICAgICAgICAgICAgICAmJiB3aWR0aCA9PSBvdGhlci53aWR0aCAmJiBoZWlnaHQgPT0gb3RoZXIuaGVpZ2h0OworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgcmlnaHQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0ICsgd2lkdGg7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGJvdHRvbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHRvcCArIGhlaWdodDsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGludGVyc2VjdChjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoYzJfbWluKHJpZ2h0KCksIG90aGVyLnJpZ2h0KCkpIC0gYzJfbWF4KGxlZnQsIG90aGVyLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihib3R0b20oKSwgb3RoZXIuYm90dG9tKCkpIC0gYzJfbWF4KHRvcCwgb3RoZXIudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICBjMl9tYXgobGVmdCwgb3RoZXIubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgYzJfbWF4KHRvcCwgb3RoZXIudG9wKSk7CisgICAgfQorCisgICAgLyoqIGNsYW1wcyByaWdodCBhbmQgYm90dG9tIHRvIHRvcCwgbGVmdCBpZiB0aGV5IG92ZXJmbG93ICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlJlY3Qgbm9ybWFsaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJSZWN0KGMyX21heChsZWZ0LCByaWdodCgpKSAtIGxlZnQsIGMyX21heCh0b3AsIGJvdHRvbSgpKSAtIHRvcCwgbGVmdCwgdG9wKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8vIG5vdGU6IHBvdGVudGlhbGx5IHVudXN1YWwgYXJndW1lbnQgb3JkZXIKKyAgICBjb25zdGV4cHIgaW5saW5lIEMyUmVjdCh1aW50MzJfdCB3aWR0aF8sIHVpbnQzMl90IGhlaWdodF8sIHVpbnQzMl90IGxlZnRfLCB1aW50MzJfdCB0b3BfKQorICAgICAgICA6IHdpZHRoKHdpZHRoXyksCisgICAgICAgICAgaGVpZ2h0KGhlaWdodF8pLAorICAgICAgICAgIGxlZnQobGVmdF8pLAorICAgICAgICAgIHRvcCh0b3BfKSB7IH0KK307CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIHdpZHRoIGFuZCBoZWlnaHQgKHBsYW5hciBjYXBhY2l0eSkuCisgKi8KK2NsYXNzIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0IHsKKy8vLyBcbmFtZSBQbGFuYXIgY2FwYWNpdHkgaW50ZXJmYWNlCisvLy8gQHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gX21XaWR0aDsgfQorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gX21IZWlnaHQ7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJSZWN0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJSZWN0KF9tV2lkdGgsIF9tSGVpZ2h0KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCisgICAgICA6IF9tV2lkdGgod2lkdGgpLCBfbUhlaWdodChoZWlnaHQpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdChjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9tV2lkdGgocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT53aWR0aCgpKSwKKyAgICAgICAgICBfbUhlaWdodChwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPmhlaWdodCgpKSB7IH0KKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBfbVdpZHRoOworICAgIHVpbnQzMl90IF9tSGVpZ2h0OworLy8vIEB9Cit9OworCisvKioKKyAqIEMyUGxhbmVJbmZvOiBpbmZvcm1hdGlvbiBvbiB0aGUgbGF5b3V0IG9mIGEgc2luZ2UgZmxleGlibGUgcGxhbmUuCisgKgorICogUHVibGljIGZpZWxkcyB3aXRob3V0IGdldHRlcnMvc2V0dGVycy4KKyAqLworc3RydWN0IEMyUGxhbmVJbmZvIHsKKy8vcHVibGljOgorICAgIGVudW0gY2hhbm5lbF90IDogdWludDMyX3QgeworICAgICAgICBDSEFOTkVMX1ksICAvLy88IGx1bWEKKyAgICAgICAgQ0hBTk5FTF9SLCAgLy8vPCByZWQKKyAgICAgICAgQ0hBTk5FTF9HLCAgLy8vPCBncmVlbgorICAgICAgICBDSEFOTkVMX0IsICAvLy88IGJsdWUKKyAgICAgICAgQ0hBTk5FTF9BLCAgLy8vPCBhbHBoYQorICAgICAgICBDSEFOTkVMX0NSLCAvLy88IENyCisgICAgICAgIENIQU5ORUxfQ0IsIC8vLzwgQ2IKKyAgICB9IGNoYW5uZWw7CisKKyAgICBpbnQzMl90IGNvbEluYzsgICAgICAgLy8vPCBjb2x1bW4gaW5jcmVtZW50IGluIGJ5dGVzLiBtYXkgYmUgbmVnYXRpdmUKKyAgICBpbnQzMl90IHJvd0luYzsgICAgICAgLy8vPCByb3cgaW5jcmVtZW50IGluIGJ5dGVzLiBtYXkgYmUgbmVnYXRpdmUKKworICAgIHVpbnQzMl90IGNvbFNhbXBsaW5nOyAvLy88IHN1YnNhbXBsaW5nIGNvbXBhcmVkIHRvIHdpZHRoIChtdXN0IGJlIGEgcG93ZXIgb2YgMikKKyAgICB1aW50MzJfdCByb3dTYW1wbGluZzsgLy8vPCBzdWJzYW1wbGluZyBjb21wYXJlZCB0byBoZWlnaHQgKG11c3QgYmUgYSBwb3dlciBvZiAyKQorCisgICAgdWludDMyX3QgYWxsb2NhdGVkRGVwdGg7IC8vLzwgc2l6ZSBvZiBlYWNoIHNhbXBsZSAobXVzdCBiZSBhIG11bHRpcGxlIG9mIDgpCisgICAgdWludDMyX3QgYml0RGVwdGg7ICAgICAgIC8vLzwgc2lnbmlmaWNhbnQgYml0cyBwZXIgc2FtcGxlCisgICAgLyoqCisgICAgICogdGhlIHJpZ2h0IHNoaWZ0IG9mIHRoZSBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBzYW1wbGUuIEUuZy4gaWYgYSAxMC1iaXQgc2lnbmlmaWNhbnQKKyAgICAgKiB2YWx1ZSBpcyBsYWlkIG91dCBpbiBhIDE2LWJpdCBhbGxvY2F0aW9uIGFsaWduZWQgdG8gTFNCICh2YWx1ZXMgMC0xMDIzKSwgcmlnaHRTaGlmdAorICAgICAqIHdvdWxkIGJlIDAgYXMgdGhlIDE2LWJpdCB2YWx1ZSByZWFkIGZyb20gdGhlIHNhbXBsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHJpZ2h0IHNoaWZ0ZWQKKyAgICAgKiBhbmQgY2FuIGJlIHVzZWQgYXMgaXMgKGFmdGVyIGFwcGx5aW5nIGEgMTAtYml0IG1hc2sgb2YgMHgzRkYpLgorICAgICAqCisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqIHwgICAgICBWVnxWVlZWVlZWVnwKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogIDE1ICAgICA4IDcgICAgICAwCisgICAgICoKKyAgICAgKiBJZiB0aGUgdmFsdWUgaXMgbGFpZCBvdXQgYWxpZ25lZCB0byBNU0IsIHJpZ2h0U2hpZnQgd291bGQgYmUgNiwgYXMgdGhlIHZhbHVlIHJlYWQKKyAgICAgKiBmcm9tIHRoZSBhbGxvY2F0ZWQgc2FtcGxlIG11c3QgYmUgcmlnaHQtc2hpZnRlZCBieSA2IHRvIGdldCB0aGUgYWN0dWFsIHNhbXBsZSB2YWx1ZS4KKyAgICAgKgorICAgICAqICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgKiB8VlZWVlZWVlZ8VlYgICAgICB8CisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqICAxNSAgICAgOCA3ICAgICAgMAorICAgICAqLworICAgIHVpbnQzMl90IHJpZ2h0U2hpZnQ7CisKKyAgICBlbnVtIGVuZGlhbm5lc3NfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTkFUSVZFLAorICAgICAgICBMSVRUTEVfRU5ELCAvLyBMSVRUTEVfRU5ESUFOIGlzIHJlc2VydmVkIG1hY3JvCisgICAgICAgIEJJR19FTkQsICAgIC8vIEJJR19FTkRJQU4gaXMgYSByZXNlcnZlZCBtYWNybworICAgIH0gZW5kaWFubmVzczsgLy8vPCBlbmRpYW5uZXNzIG9mIHRoZSBzYW1wbGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBmaWVsZHMgZGVmaW5lIHRoZSByZWxhdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHBsYW5lcy4gSWYgbXVsdGlwbGUgcGxhbmVzIGFyZQorICAgICAqIGludGVybGVhdmVkLCB0aGV5IHNoYXJlIGEgcm9vdCBwbGFuZSAod2hpY2hldmVyIHBsYW5lJ3Mgc3RhcnQgYWRkcmVzcyBpcyB0aGUgbG93ZXN0KSwgYW5kCisgICAgICogfG9mZnNldHwgaXMgdGhlIG9mZnNldCBvZiB0aGlzIHBsYW5lIGluc2lkZSB0aGUgcm9vdCBwbGFuZSAoaW4gYnl0ZXMpLiB8cm9vdEl4fCBpcyB0aGUgaW5kZXgKKyAgICAgKiBvZiB0aGUgcm9vdCBwbGFuZS4gSWYgYSBwbGFuZSBpcyBpbmRlcGVuZGVudCwgcm9vdEl4IGlzIGl0cyBpbmRleCBhbmQgb2Zmc2V0IGlzIDAuCisgICAgICovCisgICAgdWludDMyX3Qgcm9vdEl4OyAvLy88IGluZGV4IG9mIHRoZSByb290IHBsYW5lCisgICAgdWludDMyX3Qgb2Zmc2V0OyAvLy88IG9mZnNldCBvZiB0aGlzIHBsYW5lIGluc2lkZSBvZiB0aGUgcm9vdCBwbGFuZQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBzc2l6ZV90IG1pbk9mZnNldCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgICAgIHNzaXplX3Qgb2ZmcyA9IDA7CisgICAgICAgIGlmICh3aWR0aCA+IDAgJiYgY29sSW5jIDwgMCkgeworICAgICAgICAgICAgb2ZmcyArPSBjb2xJbmMgKiAoc3NpemVfdCkod2lkdGggLSAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVpZ2h0ID4gMCAmJiByb3dJbmMgPCAwKSB7CisgICAgICAgICAgICBvZmZzICs9IHJvd0luYyAqIChzc2l6ZV90KShoZWlnaHQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2ZmczsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIHNzaXplX3QgbWF4T2Zmc2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAgICAgc3NpemVfdCBvZmZzID0gKGFsbG9jYXRlZERlcHRoICsgNykgPj4gMzsKKyAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBjb2xJbmMgPiAwKSB7CisgICAgICAgICAgICBvZmZzICs9IGNvbEluYyAqIChzc2l6ZV90KSh3aWR0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWlnaHQgPiAwICYmIHJvd0luYyA+IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gcm93SW5jICogKHNzaXplX3QpKGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvZmZzOworICAgIH0KK30gQzJfUEFDSzsKKworc3RydWN0IEMyUGxhbmFyTGF5b3V0IHsKKy8vcHVibGljOgorICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICBUWVBFX1VOS05PV04gPSAwLAorICAgICAgICBUWVBFX1lVViA9IDB4MTAwLCAgIC8vLzwgWVVWIGltYWdlIHdpdGggMyBwbGFuZXMKKyAgICAgICAgVFlQRV9ZVVZBLCAgICAgICAgICAvLy88IFlVVkEgaW1hZ2Ugd2l0aCA0IHBsYW5lcworICAgICAgICBUWVBFX1JHQiwgICAgICAgICAgIC8vLzwgUkdCIGltYWdlIHdpdGggMyBwbGFuZXMKKyAgICAgICAgVFlQRV9SR0JBLCAgICAgICAgICAvLy88IFJCR0EgaW1hZ2Ugd2l0aCA0IHBsYW5lcworICAgIH07CisKKyAgICB0eXBlX3QgdHlwZTsgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlIHR5cGUKKyAgICB1aW50MzJfdCBudW1QbGFuZXM7ICAgICAgICAgICAgIC8vIG51bWJlciBvZiBjb21wb25lbnQgcGxhbmVzCisgICAgdWludDMyX3Qgcm9vdFBsYW5lczsgICAgICAgICAgICAvLyBudW1iZXIgb2YgbGF5b3V0IHBsYW5lcyAocm9vdCBwbGFuZXMpCisKKyAgICBlbnVtIHBsYW5lX2luZGV4X3QgOiB1aW50MzJfdCB7CisgICAgICAgIFBMQU5FX1kgPSAwLAorICAgICAgICBQTEFORV9VID0gMSwKKyAgICAgICAgUExBTkVfViA9IDIsCisgICAgICAgIFBMQU5FX1IgPSAwLAorICAgICAgICBQTEFORV9HID0gMSwKKyAgICAgICAgUExBTkVfQiA9IDIsCisgICAgICAgIFBMQU5FX0EgPSAzLAorICAgICAgICBNQVhfTlVNX1BMQU5FUyA9IDQsCisgICAgfTsKKworICAgIEMyUGxhbmVJbmZvIHBsYW5lc1tNQVhfTlVNX1BMQU5FU107Cit9OworCisvKioKKyAqIEFzcGVjdCBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYSBwbGFuYXIgc2VjdGlvbiAoY3JvcCByZWN0YW5nbGUpLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBzZWN0aW9uIGludGVyZmFjZQorLy8vIEB7Citwcml2YXRlOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3Qod2lkdGgsIGhlaWdodCksCisgICAgICAgICAgbUNyb3AoQzJSZWN0KHN0ZDo6bWluKHdpZHRoIC0gc3RkOjptaW4oY3JvcC5sZWZ0LCB3aWR0aCksIGNyb3Aud2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihoZWlnaHQgLSBzdGQ6Om1pbihjcm9wLnRvcCwgaGVpZ2h0KSwgY3JvcC5oZWlnaHQpKS5hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihjcm9wLmxlZnQsIHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihjcm9wLmhlaWdodCwgaGVpZ2h0KSkpIHsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBjcm9wIGNhbiBiZSBhbiBlbXB0eSByZWN0LCBkb2VzIG5vdCBoYXZlIHRvIGxpbmUgdXAgd2l0aCBzdWJzYW1wbGluZworICAgIC8vIE5PVEU6IHdlIGRvIG5vdCBzdXBwb3J0IGZsb2F0aW5nLXBvaW50IGNyb3AKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBjcm9wKCkgY29uc3QgeyByZXR1cm4gbUNyb3A7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjaGlsZCBwbGFuYXIgc2VjdGlvbiBmb3IgfGNyb3B8LCB3aGVyZSB0aGUgY2FwYWNpdHkgcmVwcmVzZW50cyB0aGlzIHNlY3Rpb24uCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IGNoaWxkU2VjdGlvbihjb25zdCBDMlJlY3QgJmNyb3ApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoCisgICAgICAgICAgICAgICAgbUNyb3Aud2lkdGgsIG1Dcm9wLmhlaWdodCwKKyAgICAgICAgICAgICAgICAvLyBjcm9wIGFuZCB0cmFuc2xhdGUgfGNyb3B8IHJlY3QKKyAgICAgICAgICAgICAgICBDMlJlY3QoYzJfbWluKG1Dcm9wLnJpZ2h0KCkgLSBjMl9jbGFtcChtQ3JvcC5sZWZ0LCBjcm9wLmxlZnQsIG1Dcm9wLnJpZ2h0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC53aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihtQ3JvcC5ib3R0b20oKSAtIGMyX2NsYW1wKG1Dcm9wLnRvcCwgY3JvcC50b3AsIG1Dcm9wLmJvdHRvbSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3AuaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAuYXQoYzJfY2xhbXAobUNyb3AubGVmdCwgY3JvcC5sZWZ0LCBtQ3JvcC5yaWdodCgpKSAtIG1Dcm9wLmxlZnQsCisgICAgICAgICAgICAgICAgICAgIGMyX2NsYW1wKG1Dcm9wLnRvcCwgY3JvcC50b3AsIG1Dcm9wLmJvdHRvbSgpKSAtIG1Dcm9wLnRvcCkpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdChjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksIG1Dcm9wKHdpZHRoKCksIGhlaWdodCgpKSB7fQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1Dcm9wKHBhcmVudCA9PSBudWxscHRyID8gQzJSZWN0KCkgOiAoKEMyUmVjdCkqcGFyZW50KS5pbnRlcnNlY3QoY3JvcCkubm9ybWFsaXplKCkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgKnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbUNyb3AocGFyZW50ID09IG51bGxwdHIgPyBDMlJlY3QoKSA6IHBhcmVudC0+Y3JvcCgpLmludGVyc2VjdChjcm9wKS5ub3JtYWxpemUoKSkgeyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdDsKKyAgICBDMlJlY3QgbUNyb3A7CisvLy8gQH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhbiBlZGl0YWJsZSBwbGFuYXIgc2VjdGlvbiAoY3JvcCByZWN0YW5nbGUpLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKKy8vLyBcbmFtZSBQbGFuYXIgc2VjdGlvbiBpbnRlcmZhY2UKKy8vLyBAeworICAgIHVzaW5nIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3Q6Ol9DMlBsYW5hclNlY3Rpb25Bc3BlY3Q7CisKK3B1YmxpYzoKKyAgICAvLyBjcm9wIGNhbiBiZSBhbiBlbXB0eSByZWN0LCBkb2VzIG5vdCBoYXZlIHRvIGxpbmUgdXAgd2l0aCBzdWJzYW1wbGluZworICAgIC8vIE5PVEU6IHdlIGRvIG5vdCBzdXBwb3J0IGZsb2F0aW5nLXBvaW50IGNyb3AKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBjcm9wKCkgY29uc3QgeyByZXR1cm4gbUNyb3A7IH0KKworICAgIC8qKgorICAgICAqICBTZXRzIGNyb3AgdG8gY3JvcCBpbnRlcnNlY3RlZCB3aXRoIFsoMCwwKSAuLiAod2lkdGgsIGhlaWdodCldCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0Q3JvcF9iZShjb25zdCBDMlJlY3QgJmNyb3ApIHsKKyAgICAgICAgbUNyb3AubGVmdCA9IHN0ZDo6bWluKHdpZHRoKCksIGNyb3AubGVmdCk7CisgICAgICAgIG1Dcm9wLnRvcCA9IHN0ZDo6bWluKGhlaWdodCgpLCBjcm9wLnRvcCk7CisgICAgICAgIC8vIEl0J3MgZ3VhcmFudGVlZCB0aGF0IG1Dcm9wLmxlZnQgPD0gd2lkdGgoKSAmJiBtQ3JvcC50b3AgPD0gaGVpZ2h0KCkKKyAgICAgICAgbUNyb3Aud2lkdGggPSBzdGQ6Om1pbih3aWR0aCgpIC0gbUNyb3AubGVmdCwgY3JvcC53aWR0aCk7CisgICAgICAgIG1Dcm9wLmhlaWdodCA9IHN0ZDo6bWluKGhlaWdodCgpIC0gbUNyb3AudG9wLCBjcm9wLmhlaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgY3JvcCBpcyB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBvYmplY3QsIGl0IHNldHMgY3JvcCB0byBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZmYgY3JvcCBpcyB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBzZXRDcm9wKGNvbnN0IEMyUmVjdCAmY3JvcCkgeworICAgICAgICBpZiAod2lkdGgoKSA8IGNyb3Aud2lkdGggfHwgaGVpZ2h0KCkgPCBjcm9wLmhlaWdodAorICAgICAgICAgICAgICAgIHx8IHdpZHRoKCkgLSBjcm9wLndpZHRoIDwgY3JvcC5sZWZ0IHx8IGhlaWdodCgpIC0gY3JvcC5oZWlnaHQgPCBjcm9wLnRvcCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1Dcm9wID0gY3JvcDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorLy8vIEB9Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNhZmUgcmFuZ2UgY2FsY3VsYXRpb25zIHVzaW5nIHNpemVfdC1zLgorICovCitjbGFzcyBDMlBsYW5hclNlY3Rpb24gOiBwdWJsaWMgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24oY29uc3QgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgJnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoJnBhcmVudCwgY3JvcCkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbihjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZwYXJlbnQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KCZwYXJlbnQsIGNyb3ApIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24gaW50ZXJzZWN0KGNvbnN0IEMyUmVjdCAmY3JvcCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJQbGFuYXJTZWN0aW9uKCp0aGlzLCBjcm9wKTsKKyAgICB9Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNpbXBsZSBhbmQgc2FmZSBwbGFuYXIgY2FwYWNpdHkgYW5kIHNlY3Rpb24gY29uc3RydWN0aW9uLgorICovCitjbGFzcyBDMlBsYW5hckNhcGFjaXR5IDogcHVibGljIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIGV4cGxpY2l0IEMyUGxhbmFyQ2FwYWNpdHkoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KGMyX21pbih3aWR0aCwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMl9taW4oaGVpZ2h0LCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJQbGFuYXJTZWN0aW9uIHNlY3Rpb24oY29uc3QgQzJSZWN0ICZjcm9wKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlBsYW5hclNlY3Rpb24oKnRoaXMsIGNyb3ApOworICAgIH0KK307CisKKworLyoqCisgKiBcaW5ncm91cCBncmFwaGljIGFsbG9jYXRvcgorICogMkQgYWxsb2NhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2NsYXNzIEMyR3JhcGhpY0FsbG9jYXRpb24gOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgYSByZWN0YW5ndWxhciBzZWN0aW9uIChhcyBkZWZpbmVkIGJ5IHxyZWN0fCkgb2YgYSAyRCBhbGxvY2F0aW9uIGludG8gbG9jYWwgcHJvY2VzcworICAgICAqIG1lbW9yeSBmb3IgZmxleGlibGUgYWNjZXNzLiBPbiBzdWNjZXNzLCBpdCBmaWxscyBvdXQgfGxheW91dHwgd2l0aCB0aGUgcGxhbmUgc3BlY2lmaWNhdGlvbnMKKyAgICAgKiBhbmQgZmlsbHMgdGhlIHxhZGRyfCBhcnJheSB3aXRoIHBvaW50ZXJzIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSB0b3AtbGVmdCBwaXhlbCBvZiBlYWNoCisgICAgICogcGxhbmUgdXNlZC4gT3RoZXJ3aXNlLCBpdCBsZWF2ZXMgfGxheW91dHwgYW5kIHxhZGRyfCB1bnRvdWNoZWQuIHxmZW5jZXwgd2lsbCBjb250YWluCisgICAgICogYW4gYWNxdWlyZSBzeW5jIGZlbmNlIG9iamVjdC4gSWYgaXQgaXMgYWxyZWFkeSBzYWZlIHRvIGFjY2VzcyB0aGUKKyAgICAgKiBidWZmZXIgY29udGVudHMsIHRoZW4gaXQgd2lsbCBiZSBhbiBlbXB0eSAoYWxyZWFkeSBmaXJlZCkgZmVuY2UuCisgICAgICoKKyAgICAgKiBTYWZlIHJlZ2lvbnMgZm9yIHRoZSBwb2ludGVyIGFkZHJlc3NlcyByZXR1cm5lZCBjYW4gYmUgZ290dGVuIHZpYSBDMkxheW91dEluZm8ubWluT2Zmc2V0KCkvCisgICAgICogbWF4T2Zmc2V0KCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICAgICAgICBzZWN0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGFsaWduZWQpCisgICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgdGhlIGRlc2lyZWQgdXNhZ2UuIFx0b2RvIHRoaXMgbXVzdCBiZSBrU29mdHdhcmVSZWFkIGFuZC9vcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGtTb2Z0d2FyZVdyaXRlLgorICAgICAqIFxwYXJhbSBmZW5jZSAgICAgICAgIGEgcG9pbnRlciB0byBhIGZlbmNlIG9iamVjdCBpZiBhbiBhc3luYyBtYXBwaW5nIGlzIHJlcXVlc3RlZC4gSWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QtbnVsbCwgYW5kIGFjcXVpcmUgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLCBvciBlbXB0eQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZlbmNlIG9uIGZhaWx1cmUuIElmIG51bGwsIHRoZSBtYXBwaW5nIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICogXHBhcmFtIGxheW91dCAgICAgICAgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBtYXBwZWQgcGxhbmVzJyBkZXNjcmlwdG9ycyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3RvcmVkLiBPbiBmYWlsdXJlLCBudWxscHRyIHdpbGwgYmUgc3RvcmVkIGhlcmUuCisgICAgICogXHBhcmFtIGFkZHIgICAgICAgICAgcG9pbnRlciB0byBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLiBPbmx5IGxheW91dC5udW1QbGFuZXMgZWxlbWVudHMgd2lsbCBiZSBtb2RpZmllZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gbWFwIHRoZSBzZWN0aW9uCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgdGhlcmUgaXMgYWxyZWFkeSBhIG1hcHBlZCByZWdpb24gYW5kIHRoaXMgYWxsb2NhdGlvbiBjYW5ub3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG11bHRpLW1hcHBpbmcgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgcGFyYW1ldGVycyAocmVjdCkgYXJlIGludmFsaWQgb3Igb3V0c2lkZSB0aGUgYWxsb2NhdGlvbiwgb3IgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgZmxhZ3MgYXJlIGludmFsaWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pID0gMDsKKworICAgIC8qKgorICAgICAqIFVubWFwcyBhIHNlY3Rpb24gb2YgYW4gYWxsb2NhdGlvbiBhdCB8YWRkcnwgd2l0aCB8cmVjdHwuIFRoZXNlIG11c3QgYmUgcGFyYW1ldGVycyBwcmV2aW91c2x5CisgICAgICogcGFzc2VkIHRvIGFuZCByZXR1cm5lZCBieSB8bWFwfDsgb3RoZXJ3aXNlLCB0aGlzIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorICAgICAqCisgICAgICogXHBhcmFtIGFkZHIgICAgICAgICAgcG9pbnRlciB0byBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGNvbnRhaW5pbmcgdGhlIHN0YXJ0aW5nIGFkZHJlc3NlcyBvZiB0aGUgbWFwcGVkIGxheWVycworICAgICAqIFxwYXJhbSByZWN0ICAgICAgICAgIGJvdW5kYXJpZXMgb2YgdGhlIG1hcHBlZCBzZWN0aW9uCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIHVubWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGEgcmVsZWFzZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5IGZlbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhpcyBmZW5jZSBzaWduYWxzIHdoZW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gY29udGFpbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGwgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHRvIHRoZSBtYXBwZWQgc2VjdGlvbi4gSWYgbnVsbCwgdGhlIHVubWFwcGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGVyZSBpcyBubyBzdWNoIG1hcHBlZCByZWdpb24gKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gdW5tYXAgdGhlIHNlY3Rpb24gKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB1bm1hcCgKKyAgICAgICAgICAgIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8sIEMyUmVjdCByZWN0LCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIElEIGZvciB0aGlzIGFsbG9jYXRpb24uIFRoaXMgaXMgdXNlZnVsIHRvIHB1dCB0aGUgaGFuZGxlIGludG8gY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRpb24gaGFuZGxlLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzYW1lIGFsbG9jYXRpb24gYXMgfG90aGVyfC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIHVzaW5nIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0OjpfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdDsKKyAgICB2aXJ0dWFsIH5DMkdyYXBoaWNBbGxvY2F0aW9uKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbjsKKworLyoqCisgKiBBIDJEIGJsb2NrLgorICoKKyAqIFxub3RlIHdpZHRoKCkvaGVpZ2h0KCkgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHVzZXJzIG9mIGJsb2NrczsgaW5zdGVhZCwgY3JvcCgpLndpZHRoKCkgYW5kCisgKiBjcm9wKCkuaGVpZ2h0KCkgaXMgdGhlIGNhcGFjaXR5IG9mIHRoZSB1c2FibGUgcG9ydGlvbi4gVXNlIGFuZCBjcm9wKCkgaWYgYWNjZXNzaW5nIHRoZSBibG9jaworICogZGlyZWN0bHkgdGhyb3VnaCBpdHMgaGFuZGxlIHRvIHJlcHJlc2VudCB0aGUgYWxsb3R0ZWQgcmVnaW9uIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gdG8gdGhpcworICogYmxvY2suCisgKi8KK2NsYXNzIEMyQmxvY2syRCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGhhbmRsZSBmb3IgdGhpcyBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgdGhhdCB0aGUgYmxvY2sgYW5kIGl0cyBibG9jayBwb29sIGhhcyBzaGFyZWQgb3duZXJzaGlwIG9mIHRoZSBoYW5kbGUKKyAgICAgKiAgICAgICBhbmQgaWYgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGJsb2NrIGFyZSByZWxlYXNlZCwgdGhlIHVuZGVybHlpbmcgYmxvY2sKKyAgICAgKiAgICAgICBhbGxvY2F0aW9uIG1heSBnZXQgcmV1c2VkIGV2ZW4gaWYgYSBjbGllbnQga2VlcHMgYSBjbG9uZSBvZiB0aGlzIGhhbmRsZS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCB0aGF0IGNyZWF0ZWQgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiBmb3IgdGhpcyBibG9jay4gVGhpcworICAgICAqIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBoYW5kbGUuCisgICAgICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgQzJCbG9jazJEKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogR3JhcGhpYyB2aWV3IHByb3ZpZGVzIHJlYWQgb3IgcmVhZC13cml0ZSBhY2Nlc3MgZm9yIGEgZ3JhcGhpYyBibG9jay4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICoKKyAqIFxub3RlIER1ZSB0byB0aGUgc3Vic2FtcGxpbmcgb2YgZ3JhcGhpYyBidWZmZXJzLCBhIHJlYWQgdmlldyBtdXN0IHN0aWxsIGNvbnRhaW4gYSBjcm9wIHJlY3RhbmdsZQorICogdG8gZW5zdXJlIHN1YnNhbXBsaW5nIGlzIGZvbGxvd2VkLiBUaGlzIHJlc3VsdHMgaW4gbmVhcmx5IGlkZW50aWNhbCBpbnRlcmZhY2UgYmV0d2VlbiByZWFkIGFuZAorICogd3JpdGUgdmlld3MsIHNvIEMyR3JhcGhpY1ZpZXcgY2FuIGVuY29tcGFzcyBib3RoIG9mIHRoZW0uCisgKi8KK2NsYXNzIEMyR3JhcGhpY1ZpZXcgOiBwdWJsaWMgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGFycmF5IG9mIHBvaW50ZXJzIChvZiBsYXlvdXQoKS5udW1QbGFuZXMgZWxlbWVudHMpIHRvIHRoZSBzdGFydCBvZiB0aGUgcGxhbmVzIG9yCisgICAgICogbnVsbHB0ciBvbiBlcnJvci4gUmVnYXJkbGVzcyBvZiBjcm9wIHJlY3QsIHRoZXkgYWx3YXlzIHBvaW50IHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaAorICAgICAqIHBsYW5lLiBBY2Nlc3Mgb3V0c2lkZSBvZiB0aGUgY3JvcCByZWN0IHJlc3VsdHMgaW4gYW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgICAqLworICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGFycmF5IG9mIHBvaW50ZXJzIChvZiBsYXlvdXQoKS5udW1QbGFuZXMgZWxlbWVudHMpIHRvIHRoZSBzdGFydCBvZiB0aGUgcGxhbmVzIG9yCisgICAgICogbnVsbHB0ciBvbiBlcnJvci4gUmVnYXJkbGVzcyBvZiBjcm9wIHJlY3QsIHRoZXkgYWx3YXlzIHBvaW50IHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaAorICAgICAqIHBsYW5lLiBBY2Nlc3Mgb3V0c2lkZSBvZiB0aGUgY3JvcCByZWN0IHJlc3VsdHMgaW4gYW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgICAqLworICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGxheW91dCBvZiB0aGUgZ3JhcGhpYyBibG9jayB0byBpbnRlcnByZXQgdGhlIHJldHVybmVkIGRhdGEuCisgICAgICovCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgbGF5b3V0KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2VjdGlvbiBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICB0aGUgZGltZW5zaW9uIG9mIHRoZSBzZWN0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNyb3Agb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogXHJldHVybiBhIHJlYWQgdmlldyBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgc2VjdGlvbiBvZiB0aGlzIHZpZXcKKyAgICAgKi8KKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IHN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdDsKKyAgICBDMkdyYXBoaWNWaWV3IHN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMkdyYXBoaWNWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKTsKKyAgICBleHBsaWNpdCBDMkdyYXBoaWNWaWV3KGMyX3N0YXR1c190IGVycm9yKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIEEgY29uc3RhbnQgKHJlYWQtb25seSkgZ3JhcGhpYyBibG9jayAocG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uKSB3aXRoIGFuIGFjcXVpcmUgZmVuY2UuCisgKiBCbG9ja3MgYXJlIHVubWFwcGVkIHdoZW4gY3JlYXRlZCwgYW5kIGNhbiBiZSBtYXBwZWQgaW50byBhIHJlYWQgdmlldyBvbiBkZW1hbmQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZSBhbmQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGFsbG9jYXRpb24gdGhhdCBpdCBpcyBiYXNlZCBvbi4KKyAqLworY2xhc3MgQzJDb25zdEdyYXBoaWNCbG9jayA6IHB1YmxpYyBDMkJsb2NrMkQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHJlYWQgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBtYXAoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZWN0aW9uIG9mIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHNlY3Rpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY3JvcCByZWN0YW5nbGUgb2YKKyAgICAgKiAgICAgICAgICAgICAgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBncmFwaGljIGJsb2NrIGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2sKKyAgICAgKi8KKyAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIHN1YkJsb2NrKGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZvciB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZlbmNlIHRoYXQgbXVzdCBiZSB3YWl0ZWQgb24gYmVmb3JlIHJlYWRpbmcgdGhlIGJsb2NrLgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdCB7IHJldHVybiBtRmVuY2U7IH0KKworcHJvdGVjdGVkOgorICAgIEMyQ29uc3RHcmFwaGljQmxvY2soCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbiwgQzJGZW5jZSBmZW5jZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgQzJGZW5jZSBtRmVuY2U7Cit9OworCisvKioKKyAqIEdyYXBoaWMgYmxvY2sgaXMgYSB3cml0ZWFibGUgMkQgYmxvY2suIE9uY2Ugd3JpdHRlbiwgaXQgY2FuIGJlIHNoYXJlZCBpbiB3aG9sZSBvciBpbiBwYXJ0IHdpdGgKKyAqIGNvbnN1bWVycy9yZWFkZXJzIGFzIHJlYWQtb25seSBjb25zdCBncmFwaGljIGJsb2NrLgorICovCitjbGFzcyBDMkdyYXBoaWNCbG9jayA6IHB1YmxpYyBDMkJsb2NrMkQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHdyaXRlIHZpZXcgZm9yIGl0LgorICAgICAqCisgICAgICogXHJldHVybiBhIHdyaXRlIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IG1hcCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2sgZm9yIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrOyBvcHRpb25hbGx5IHByb3RlY3RlZAorICAgICAqIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpczoKKyAgICAgKgorICAgICAqIDEpIHNoYXJlIHJlYWR5IGJsb2NrIGFmdGVyIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4gdGhpcyBjYXNlIG5vIGZlbmNlIHNoYWxsIGJlCisgICAgICogICAgc3VwcGxpZWQsIGFuZCB0aGUgYmxvY2sgc2hhbGwgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogMikgc2hhcmUgYmxvY2sgbWV0YWRhdGEgYmVmb3JlIGFjdHVhbGx5IChmaW5pc2hpbmcpIHdyaXRpbmcgdGhlIGRhdGEgaW50byB0aGUgYmxvY2suIEluCisgICAgICogICAgdGhpcyBjYXNlIGEgZmVuY2UgbXVzdCBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgKiAgICBUaGUgYmxvY2sgc2hhbGwgYmUgbW9kaWZpZWQgb25seSB1bnRpbCBmaXJpbmcgdGhlIGV2ZW50IGZvciB0aGUgZmVuY2UuCisgICAgICovCisgICAgQzJDb25zdEdyYXBoaWNCbG9jayBzaGFyZShjb25zdCBDMlJlY3QgJmNyb3AsIEMyRmVuY2UgZmVuY2UpOworCitwcm90ZWN0ZWQ6CisgICAgQzJHcmFwaGljQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7Cit9OworCisvLy8gQH0KKworLy8vIFxkZWZncm91cCBidWZmZXJfb25qIEJ1ZmZlciBvYmplY3RzCisvLy8gQHsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQlVGRkVSUworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vLyBcdG9kbzogRG8gd2Ugc3RpbGwgbmVlZCB0aGlzPworLy8vCisvLyBUaGVyZSBhcmUgMiBraW5kcyBvZiBidWZmZXJzOiBsaW5lYXIgb3IgZ3JhcGhpYy4gTGluZWFyIGJ1ZmZlcnMgY2FuIGNvbnRhaW4gYSBzaW5nbGUgYmxvY2ssIG9yCisvLyBhIGxpc3Qgb2YgYmxvY2tzIChMSU5FQVJfQ0hVTktTKS4gU3VwcG9ydCBmb3IgbGlzdCBvZiBibG9ja3MgaXMgb3B0aW9uYWwsIGFuZCBjYW4gYWxsb3cgY29uc3VtaW5nCisvLyBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVycyBvciBzY2F0dGVyZWQgZGF0YSBzb3VyY2VzIHdpdGhvdXQgZXh0cmEgbWVtY3B5LiBDdXJyZW50bHksIGxpc3Qgb2YKKy8vIGdyYXBoaWMgYmxvY2tzIGlzIG5vdCBzdXBwb3J0ZWQuCisKK2NsYXNzIEMyTGluZWFyQnVmZmVyOyAgIC8vIHJlYWQtd3JpdGUgYnVmZmVyCitjbGFzcyBDMkdyYXBoaWNCdWZmZXI7ICAvLyByZWFkLXdyaXRlIGJ1ZmZlcgorY2xhc3MgQzJMaW5lYXJDaHVua3NCdWZmZXI7CisKKy8qKgorICogQzJCdWZmZXJEYXRhOiB0aGUgbWFpbiwgbm9uLW1ldGEgZGF0YSBvZiBhIGJ1ZmZlci4gQSBidWZmZXIgY2FuIGNvbnRhaW4gZWl0aGVyIGxpbmVhciBibG9ja3MKKyAqIG9yIGdyYXBoaWMgYmxvY2tzLCBhbmQgY2FuIGNvbnRhaW4gZWl0aGVyIGEgc2luZ2xlIGJsb2NrIG9yIG11bHRpcGxlIGJsb2Nrcy4gVGhpcyBpcyBkZXRlcm1pbmVkCisgKiBieSBpdHMgdHlwZS4KKyAqLworY2xhc3MgQzJCdWZmZXJEYXRhIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiAgVGhlIHR5cGUgb2YgYnVmZmVyIGRhdGEuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIElOVkFMSUQsICAgICAgICAgICAgLy8vPCBpbnZhbGlkIGJ1ZmZlciB0eXBlLiBEbyBub3QgdXNlLgorICAgICAgICBMSU5FQVIsICAgICAgICAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBhIHNpbmdsZSBsaW5lYXIgYmxvY2sKKyAgICAgICAgTElORUFSX0NIVU5LUywgICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgb25lIG9yIG1vcmUgbGluZWFyIGJsb2NrcworICAgICAgICBHUkFQSElDLCAgICAgICAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBhIHNpbmdsZSBncmFwaGljIGJsb2NrCisgICAgICAgIEdSQVBISUNfQ0hVTktTLCAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIG9uZSBvZiBtb3JlIGdyYXBoaWMgYmxvY2tzCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgKGRhdGEpLgorICAgICAqIFxyZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgZGF0YS4KKyAgICAgKi8KKyAgICB0eXBlX3QgdHlwZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGluZWFyIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBjb25zdCBsaW5lYXIgYmxvY2tzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFxyZXR2YWwgZW1wdHkgbGlzdCBpZiB0aGlzIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGxpbmVhciBibG9jayhzKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IGxpbmVhckJsb2NrcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHVybiBhIGNvbnN0YW50IGxpc3Qgb2YgY29uc3QgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHZhbCBlbXB0eSBsaXN0IGlmIHRoaXMgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gZ3JhcGhpYyBibG9jayhzKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2tzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBubyBwdWJsaWMgY29uc3RydWN0b3IKKyAgICBleHBsaWNpdCBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKyAgICBleHBsaWNpdCBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7Cit9OworCisvKioKKyAqIEMyQnVmZmVyOiBidWZmZXIgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsd2F5cyB1c2VkIGFzIHNoYXJlZF9wdHJzLiBUaG91Z2ggdGhlIHVuZGVybHlpbmcgYnVmZmVyCisgKiBvYmplY3RzIChuYXRpdmUgYnVmZmVycywgaW9uIGJ1ZmZlcnMsIG9yIGRtYWJ1ZnMpIGFyZSByZWZlcmVuY2UtY291bnRlZCBieSB0aGUgc3lzdGVtLAorICogQzJCdWZmZXJzIGhvbGQgb25seSBhIHNpbmdsZSByZWZlcmVuY2UuCisgKgorICogVGhlc2Ugb2JqZWN0cyBjYW5ub3QgYmUgdXNlZCBvbiB0aGUgc3RhY2suCisgKi8KK2NsYXNzIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgYnVmZmVyJ3MgZGF0YS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkJ1ZmZlckRhdGEgZGF0YSgpIGNvbnN0OworCisgICAgLy8vQG5hbWUgUHJlLWRlc3Ryb3kgbm90aWZpY2F0aW9uIGhhbmRsaW5nCisgICAgLy8vQHsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24ganVzdCBwcmlvciB0byB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgdHlwZWRlZiB2b2lkICgqT25EZXN0cm95Tm90aWZ5KSAoY29uc3QgQzJCdWZmZXIgKmJ1Ziwgdm9pZCAqYXJnKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBmb3IgYSBwcmUtZGVzdHJveSBub3RpZmljYXRpb24uIFRoaXMgaXMgY2FsbGVkIGp1c3QgcHJpb3IgdG8gdGhlIGRlc3RydWN0aW9uIG9mCisgICAgICogdGhpcyBidWZmZXIgKHdoZW4gdGhpcyBidWZmZXIgaXMgbm8gbG9uZ2VyIHZhbGlkLikKKyAgICAgKgorICAgICAqIFxwYXJhbSBvbkRlc3Ryb3lOb3RpZnkgICB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgICAgICogXHBhcmFtIGFyZyAgICAgICAgICAgICAgIGFuIGFyYml0cmFyeSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSBhIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGlzIGNhbGxiYWNrIGFuZCBhcmd1bWVudAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlZ2lzdGVyIGZvciB0aGlzIGNhbGxiYWNrCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgYW4gdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlZ2lzdHJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCByZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHByZS1kZXN0cm95IG5vdGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBvbkRlc3Ryb3lOb3RpZnkgICB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgICAgICogXHBhcmFtIGFyZyAgICAgICAgICAgICAgIGFuIGFyYml0cmFyeSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHVucmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBub3RpZmljYXRpb24gd2FzIG5vdCBmb3VuZAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIGFuIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSByZWdpc3RyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcgPSBudWxscHRyKTsKKworICAgIC8vL0B9CisKKyAgICB2aXJ0dWFsIH5DMkJ1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIC8vL0BuYW1lIEJ1ZmZlci1zcGVjaWZpYyBhcmJpdHJhcnkgbWV0YWRhdGEgaGFuZGxpbmcKKyAgICAvLy9AeworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGlzdCBvZiBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBpbmZvIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBpbmZvKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2hlcyAob3IgdXBkYXRlcykgYW4gKGV4aXN0aW5nKSBtZXRhZGF0YSBmb3IgdGhpcyBidWZmZXIuCisgICAgICogSWYgdGhlIG1ldGFkYXRhIGlzIHN0cmVhbSBzcGVjaWZpYywgdGhlIHN0cmVhbSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIGluZm8gTWV0YWRhdGEgdG8gdXBkYXRlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgbWV0YWRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBhdHRhY2hlZC91cGRhdGVkLgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGF0dGFjaCB0aGUgbWV0YWRhdGEgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaWYgdGhlIHNhbWUga2luZCBvZiBtZXRhZGF0YSBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBidWZmZXIpLgorICAgICAqLworICAgIGMyX3N0YXR1c190IHNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgY2VydGFpbiB0eXBlIG9mIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoaXMgYnVmZmVyLgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IHRoZSBwYXJhbWV0ZXIgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZmYgdGhlcmUgaXMgYSBtZXRhZGF0YSB3aXRoIHRoZSBwYXJhbWV0ZXIgdHlwZSBhdHRhY2hlZCB0byB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBib29sIGhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjZXJ0YWluIHR5cGUgb2YgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyBidWZmZXIsIGFuZCByZXR1cm5zIGEKKyAgICAgKiBzaGFyZWQgcG9pbnRlciB0byBpdCBpZiB0aGVyZSBpcy4gUmV0dXJucyBhbiBlbXB0eSBzaGFyZWQgcG9pbnRlciBvYmplY3QgKG51bGxwdHIpIGlmIHRoZXJlCisgICAgICogaXMgbm90LgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IHRoZSBwYXJhbWV0ZXIgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIG1ldGFkYXRhLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+IGdldEluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbWV0YWRhdGEgZnJvbSB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZUluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCk7CisgICAgLy8vQH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBsaW5lYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gYmxvY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENyZWF0ZUxpbmVhckJ1ZmZlcihjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBncmFwaGljIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIGJsb2NrIHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrKTsKKworcHJvdGVjdGVkOgorICAgIC8vIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcgorICAgIGV4cGxpY2l0IEMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2Nrcyk7CisgICAgZXhwbGljaXQgQzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIEFuIGV4dGVuc2lvbiBvZiBDMkluZm8gb2JqZWN0cyB0aGF0IGNhbiBjb250YWluIGFyYml0cmFyeSBidWZmZXIgZGF0YS4KKyAqCisgKiBcbm90ZSBUaGlzIG9iamVjdCBpcyBub3QgZGVzY3JpYmFibGUgYW5kIGNvbnRhaW5zIG9wYXF1ZSBkYXRhLgorICovCitjbGFzcyBDMkluZm9CdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoaXMgaW5mbyBvYmplY3QuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBwYXJhbWV0ZXIgaW5kZXguCisgICAgICovCisgICAgY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqLworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSBkYXRhKCkgY29uc3Q7Cit9OworCisvLy8gQH0KKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJCVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXJCYXNlLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZDQ4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyQmFzZS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQlVGRkVSX0JBU0VfSF8KKyNkZWZpbmUgQzJCVUZGRVJfQkFTRV9IXworCisvLy8gXGRlZmdyb3VwIGFsbG9jYXRvciBBbGxvY2F0aW9uIGFuZCBtZW1vcnkgcGxhY2VtZW50CisvLy8gQHsKKworLyoqCisgKiBCdWZmZXIvbWVtb3J5IHVzYWdlIGJpdHMuIFRoZXNlIHNoYWxsIGJlIHVzZWQgYnkgdGhlIGFsbG9jYXRvcnMgdG8gc2VsZWN0IG9wdGltYWwgbWVtb3J5IHR5cGUvCisgKiBwb29sIGFuZCBidWZmZXIgbGF5b3V0LiBVc2FnZSBiaXRzIGFyZSBjb25jZXB0dWFsbHkgc2VwYXJhdGVkIGludG8gcmVhZCBhbmQgd3JpdGUgdXNhZ2UsIHdoaWxlCisgKiB0aGUgYnVmZmVyIHVzZSBsaWZlLWN5Y2xlIGlzIHNlcGFyYXRlZCBpbnRvIHByb2R1Y2VycyAod3JpdGVycykgYW5kIGNvbnN1bWVycyAocmVhZGVycykuCisgKiBUaGVzZSB0d28gY29uY2VwdHMgYXJlIHJlbGF0ZWQgYnV0IG5vdCBlcXVpdmFsZW50OiBjb25zdW1lcnMgbWF5IG9ubHkgcmVhZCBidWZmZXJzIGFuZCBvbmx5CisgKiBwcm9kdWNlcnMgbWF5IHdyaXRlIHRvIGJ1ZmZlcnM7IG5vdGUsIGhvd2V2ZXIsIHRoYXQgYnVmZmVyIHByb2R1Y2VycyBtYXkgYWxzbyB3YW50IG9yIG5lZWQgdG8KKyAqIHJlYWQgdGhlIGJ1ZmZlcnMuCisgKgorICogUmVhZCBhbmQgd3JpdGUgYnVmZmVyIHVzYWdlIGJpdHMgc2hhbGwgYmUgb3ItZWQgdG8gYXJyaXZlIGF0IHRoZSBmdWxsIGJ1ZmZlciB1c2FnZS4gQWRtaXR0ZWRseSwKKyAqIHRoaXMgZG9lcyBub3QgYWNjb3VudCBmb3IgdGhlIGFtb3VudCBvZiByZWFkaW5nIGFuZCB3cml0aW5nIChlLmcuIGEgYnVmZmVyIG1heSBoYXZlIG9uZSBvciBtb3JlCisgKiByZWFkZXJzKTsgaG93ZXZlciwgdGhlIHByb3BlciBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcHJvcGVybHkgd2VpZ2ggdGhlIHZhcmlvdXMgdXNhZ2VzIHdvdWxkIGJlCisgKiB0aGUgYW1vdW50IG9mIGRhdGEgcmVhZC93cml0dGVuIGZvciBlYWNoIHVzYWdlIHR5cGUuIFRoaXMgd291bGQgcmVzdWx0IGluIGFuIGludGVnZXIgYXJyYXkgb2YKKyAqIHNpemUgNjQgKG9yIHRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNhZ2VzKSBmb3IgbWVtb3J5IHVzYWdlLCBhbmQgbGlrZWx5IHN1Y2ggZGV0YWlsZWQgaW5mb3JtYXRpb24KKyAqIHdvdWxkIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLgorICoKKyAqIFRoYXQgcGxhdGZvcm0tYWdub3N0aWMgQ29kZWMgMi4wIEFQSSBvbmx5IGRlZmluZXMgdGhlIGJhcmUgbWluaW11bSB1c2FnZXMuIFBsYXRmb3JtcyBzaGFsbCBkZWZpbmUKKyAqIHVzYWdlIGJpdHMgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwbGF0Zm9ybS4KKyAqLworc3RydWN0IEMyTWVtb3J5VXNhZ2UgeworLy8gcHVibGljOgorICAgIC8qKgorICAgICAqIEJ1ZmZlciByZWFkIHVzYWdlLgorICAgICAqLworICAgIGVudW0gcmVhZF90IDogdWludDY0X3QgeworICAgICAgICAvKiogQnVmZmVyIGlzIHJlYWQgYnkgdGhlIENQVS4gKi8KKyAgICAgICAgQ1BVX1JFQUQgICAgICAgID0gMSA8PCAwLAorICAgICAgICAvKioKKyAgICAgICAgICogQnVmZmVyIHNoYWxsIG9ubHkgYmUgcmVhZCBieSB0cnVzdGVkIGhhcmR3YXJlLiBUaGUgZGVmaW5pdGlvbiBvZiB0cnVzdGVkIGhhcmR3YXJlIGlzCisgICAgICAgICAqIHBsYXRmb3JtIHNwZWNpZmljLCBidXQgdGhpcyBmbGFnIGlzIHJlc2VydmVkIHRvIHByZXZlbnQgbWFwcGluZyB0aGlzIGJsb2NrIGludG8gQ1BVCisgICAgICAgICAqIHJlYWRhYmxlIG1lbW9yeSByZXN1bHRpbmcgaW4gYnVzIGZhdWx0LiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgd2hlbiBidWZmZXIgYWNjZXNzIG11c3QgYmUKKyAgICAgICAgICogcHJvdGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgUkVBRF9QUk9URUNURUQgID0gMSA8PCAxLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgd3JpdGUgdXNhZ2UuCisgICAgICovCisgICAgZW51bSB3cml0ZV90IDogdWludDY0X3QgeworICAgICAgICAvKiogQnVmZmVyIGlzIHdyaXR0ZWQgdG8gYnkgdGhlIENQVS4gKi8KKyAgICAgICAgQ1BVX1dSSVRFICAgICAgICA9IDEgPDwgMiwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1ZmZlciBzaGFsbCBvbmx5IGJlIHdyaXR0ZW4gdG8gYnkgdHJ1c3RlZCBoYXJkd2FyZS4gVGhlIGRlZmluaXRpb24gb2YgdHJ1c3RlZCBoYXJkd2FyZQorICAgICAgICAgKiBpcyBwbGF0Zm9ybSBzcGVjaWZpYywgYnV0IHRoaXMgZmxhZyBpcyByZXNlcnZlZCB0byBwcmV2ZW50IG1hcHBpbmcgdGhpcyBibG9jayBpbnRvIENQVQorICAgICAgICAgKiB3cml0YWJsZSBtZW1vcnkgcmVzdWx0aW5nIGluIGJ1cyBmYXVsdC4gVGhpcyBmbGFnIGNhbiBiZSB1c2VkIHdoZW4gYnVmZmVyIGludGVncml0eSBtdXN0CisgICAgICAgICAqIGJlIHByb3RlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIFdSSVRFX1BST1RFQ1RFRCAgPSAxIDw8IDMsCisgICAgfTsKKworICAgIGVudW0gOiB1aW50NjRfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWZmZXIgdXNhZ2UgYml0cyByZXNlcnZlZCBmb3IgdGhlIHBsYXRmb3JtLiBXZSBkb24ndCBzZXBhcmF0ZWx5IHJlc2VydmUgcmVhZCBhbmQKKyAgICAgICAgICogd3JpdGUgdXNhZ2VzIGFzIHBsYXRmb3JtcyBtYXkgaGF2ZSBhc3ltbWV0cmljIGRpc3RyaWJ1dGlvbiBiZXR3ZWVuIHRoZW0uCisgICAgICAgICAqLworICAgICAgICBQTEFURk9STV9NQVNLICAgICA9IH4oQ1BVX1JFQUQgfCBDUFVfV1JJVEUgfCBSRUFEX1BST1RFQ1RFRCB8IFdSSVRFX1BST1RFQ1RFRCksCisgICAgfTsKKworICAgIC8qKiBDcmVhdGUgYSB1c2FnZSBmcm9tIHNlcGFyYXRlIGNvbnN1bWVyIGFuZCBwcm9kdWNlciB1c2FnZSBtYXNrLiBcZGVwcmVjYXRlZCAqLworICAgIGlubGluZSBDMk1lbW9yeVVzYWdlKHVpbnQ2NF90IGNvbnN1bWVyLCB1aW50NjRfdCBwcm9kdWNlcikKKyAgICAgICAgOiBleHBlY3RlZChjb25zdW1lciB8IHByb2R1Y2VyKSB7IH0KKworICAgIGlubGluZSBleHBsaWNpdCBDMk1lbW9yeVVzYWdlKHVpbnQ2NF90IGV4cGVjdGVkXykKKyAgICAgICAgOiBleHBlY3RlZChleHBlY3RlZF8pIHsgfQorCisgICAgdWludDY0X3QgZXhwZWN0ZWQ7IC8vIGV4cGVjdGVkIGJ1ZmZlciB1c2FnZQorfTsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJCVUZGRVJfQkFTRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmOGQyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb21wb25lbnQuaApAQCAtMCwwICsxLDk3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJDT01QT05FTlRfSF8KKworI2RlZmluZSBDMkNPTVBPTkVOVF9IXworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxDMkVudW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKy8vLyBcZGVmZ3JvdXAgY29tcG9uZW50cyBDb21wb25lbnRzCisvLy8gQHsKKworc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSB7CisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIFBPU1NJQkxFLCAvLy88IHF1ZXJ5IGFsbCBwb3NzaWJsZSB2YWx1ZXMgcmVnYXJkbGVzcyBvZiBvdGhlciBzZXR0aW5ncworICAgICAgICBDVVJSRU5ULCAgLy8vPCBxdWVyeSBjdXJyZW50bHkgcG9zc2libGUgdmFsdWVzIGdpdmVuIGRlcGVuZGVudCBzZXR0aW5ncworICAgIH07CisKK3ByaXZhdGU6CisgICAgQzJQYXJhbUZpZWxkIF9tRmllbGQ7CisgICAgdHlwZV90IF9tVHlwZTsKK3B1YmxpYzoKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyB2YWx1ZXM7CisKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZF8sIHR5cGVfdCB0eXBlXykKKyAgICAgICAgOiBfbUZpZWxkKGZpZWxkXyksIF9tVHlwZSh0eXBlXyksIHN0YXR1cyhDMl9OT19JTklUKSB7IH0KKworICAgIHN0YXRpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKKyAgICBDdXJyZW50KGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGRfKSB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoZmllbGRfLCBDVVJSRU5UKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5CisgICAgUG9zc2libGUoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZF8pIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShmaWVsZF8sIFBPU1NJQkxFKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkIGZpZWxkKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZDsgfTsKKworICAgIGlubGluZSB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZTsgfQorfTsKKworLyoqCisgKiBDb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4gVGhpcyBvYmplY3QgY29udGFpbnMgYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgcG90ZW50aWFsIG9yCisgKiBhY3R1YWwgY29tcG9uZW50LiBJdCBjYW4gYmUgY3JlYXRlZCBhbmQgdXNlZCBpbmRlcGVuZGVudGx5IG9mIGFuIGFjdHVhbCBDMkNvbXBvbmVudCBpbnN0YW5jZSB0bworICogcXVlcnkgc3VwcG9ydCBhbmQgcGFyYW1ldGVycyBmb3IgdmFyaW91cyBjb21wb25lbnQgc2V0dGluZ3MgYW5kIGNvbmZpZ3VyYXRpb25zIGZvciBhIHBvdGVudGlhbAorICogY29tcG9uZW50LiBBY3R1YWwgY29tcG9uZW50cyBhbHNvIGV4cG9zZSB0aGlzIGludGVyZmFjZS4KKyAqLworCitjbGFzcyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLy8gQUxXQVlTIEFWQUlMQUJMRSBNRVRIT0RTCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFRoaXMgaXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSAnY2xhc3MnOyBob3dldmVyLCBtdWx0aXBsZQorICAgICAqIGluc3RhbmNlcyBvZiB0aGlzIGNvbXBvbmVudCBTSEFMTCBoYXZlIHRoZSBzYW1lIG5hbWUuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlLgorICAgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG5vciB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBUaGlzIElEIGlzIHVzZWQgYXMgd29yayB0YXJnZXRzLCB1bmlxdWUgd29yayBJRHMsIGFuZCB3aGVuIGNvbmZpZ3VyaW5nIHR1bm5lbGluZy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB1bmlxdWUgbm9kZSBJRCBmb3IgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgYSBzZXQgb2YgcGFyYW1ldGVycyBmcm9tIHRoZSBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBRdWVyeWluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBjb21wb25lbnQgU0hBTEwgcXVlcnkgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFuZAorICAgICAqIHNraXAgdW5zdXBwb3J0ZWQgb25lcywgaGVhcCBhbGxvY2F0ZWQgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQgb3IgcGFyYW1ldGVycworICAgICAqIHRoYXQgY291bGQgbm90IGJlIHF1ZXJpZWQgd2l0aG91dCBibG9ja2luZy4gQW55IGVycm9ycyBhcmUgY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICogQWRkaXRpb25hbGx5LCBwcmVhbGxvY2F0ZWQgKGUuZy4gc3RhY2spIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgcXVlcmllZCBhcmUgaW52YWxpZGF0ZWQuCisgICAgICogSW52YWxpZCBvciBibG9ja2luZyBwYXJhbWV0ZXJzIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQuCisgICAgICoKKyAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdmFsdWVzIGRvIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHF1ZXJ5LgorICAgICAqCisgICAgICogXHRvZG8gVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gcXVlcnkgaW5mby1idWZmZXJzLiBJcyB0aGF0IGEgcHJvYmxlbT8KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbixvdXRdIHN0YWNrUGFyYW1zICBhIGxpc3Qgb2YgcGFyYW1zIHF1ZXJpZWQuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBzcGVjaWZpYyB0byBlYWNoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5vdGUgRmxleGlibGUgc2V0dGluZ3MgdGhhdCBhcmUgb2YgaW5jb3JyZWN0IHNpemUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlZC4KKyAgICAgKiBccGFyYW1baW5dIGhlYXBQYXJhbUluZGljZXMgYSB2ZWN0b3Igb2YgcGFyYW0gaW5kaWNlcyBmb3IgcGFyYW1zIHRvIGJlIHF1ZXJpZWQgYW5kIHJldHVybmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBoZWFwLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcmV0dXJuZWQgaW4gaGVhcFBhcmFtcy4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5zdXBwb3J0ZWQgcGFyYW0gaW5kaWNlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayAgICAgICAgIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKiBccGFyYW1bb3V0XSBoZWFwUGFyYW1zICAgICAgYSBsaXN0IG9mIHBhcmFtcyB3aGVyZSB0byB3aGljaCB0aGUgc3VwcG9ydGVkIGhlYXAgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhIHN1cHBvcnRlZCBwYXJhbWV0ZXIKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHF1ZXJ5IHRoZSBwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBydW5uaW5nIHN0YXRlKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHF1ZXJ5aW5nIG9mIHRoZSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFR1bmluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBjb21wb25lbnQgU0hBTEwgcHJvY2VzcyB0aGUgY29uZmlndXJhdGlvbiB1cGRhdGVzIGluCisgICAgICogdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHxwYXJhbXN8LiBJZiBhbnkgcGFyYW1ldGVyIHVwZGF0ZSBmYWlscywgdGhlIGNvbXBvbmVudCBzaGFsbAorICAgICAqIGNvbW11bmljYXRlIHRoZSBmYWlsdXJlIGluIHRoZSByZXR1cm4gdmFsdWUgYW5kIGluIHxmYWlsdXJlc3wsIGFuZCBzdGlsbCBwcm9jZXNzIHRoZQorICAgICAqIHJlbWFpbmluZyBwYXJhbWV0ZXJzLiBVbnN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBza2lwcGVkLCB0aG91Z2ggdGhleSBhcmUgY29tbXVuaWNhdGVkIGluCisgICAgICogdGhlciByZXR1cm4gdmFsdWUuIE1vc3QgcGFyYW1ldGVycyBhcmUgdXBkYXRlZCBhdCBiZXN0IGVmZm9ydCAtIHN1Y2ggdGhhdCBldmVuIGlmIGNsaWVudAorICAgICAqIHNwZWNpZmllcyBhbiB1bnN1cHBvcnRlZCB2YWx1ZSBmb3IgYSBmaWVsZCwgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHZhbHVlIGlzIHVzZWQuIE9uIHRoZQorICAgICAqIG90aGVyIGhhbmQsIHN0cmljdCBwYXJhbWV0ZXJzIG9ubHkgYWNjZXB0IHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlaXIgZmllbGRzLCBhbmQgaWYgdGhlIGNsaWVudAorICAgICAqIHNwZWNpZmllcyBhbiB1bnN1cHBvcnRlZCB2YWx1ZSwgdGhlIHBhcmFtZXRlciBzZXR0aW5nIHNoYWxsIGZhaWwgZm9yIHRoYXQgZmllbGQuCisgICAgICogSWYgdGhlIGNsaWVudCB0cmllcyB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgZmllbGQgdGhhdCByZXF1aXJlcyBtb21lbnRhcnkgYmxvY2tpbmcgd2l0aG91dAorICAgICAqIHNldHRpbmcgfG1heUJsb2NrfCB0byBDMl9NQVlfQkxPQ0ssIHRoYXQgcGFyYW1ldGVyIHNoYWxsIGFsc28gYmUgc2tpcHBlZCBhbmQgYSBzcGVjaWZpYworICAgICAqIHJldHVybiB2YWx1ZSBzaGFsbCBiZSB1c2VkLiBGaW5hbCB2YWx1ZXMgZm9yIGFsbCBwYXJhbWV0ZXJzIHNldCBhcmUgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZQorICAgICAqIGNhbGxlciBpbiB8cGFyYW1zfC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB0dW5pbmcgRE9FUyBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHRoZSB0dW5pbmcgcGFyYW1ldGVycy4gRS5nLiBzb21lIHBhcmFtZXRlcgorICAgICAqIHVwZGF0ZSBtYXkgYWxsb3cgc29tZSBzdWJzZXF1ZW50IHZhbHVlcyBmb3IgZnVydGhlciBwYXJhbWV0ZXIgdXBkYXRlcy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbixvdXRdIHBhcmFtcyBhIGxpc3Qgb2YgcGFyYW1ldGVyIHVwZGF0ZXMuIFRoZXNlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZXMgKHRoaXMgaXMgYmVjYXVzZSB0dW5pbmcgaXMgcGVyZm9ybWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGF0IGJlc3QgZWZmb3J0KS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgXHRvZG8gcGFyYW1zIHRoYXQgY291bGQgbm90IGJlIHVwZGF0ZWQgYXJlIG5vdCBtYXJrZWQgaGVyZSwgc28gYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2luZyAtIGFyZSB0aGV5ICJleGlzdGluZyIgdmFsdWVzIG9yIGludGVuZGVkIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPworICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgICBpZiB0cnVlIChDMl9NQVlfQkxPQ0spLCBpbXBsZW1lbnRhdGlvbiBtYXkgbW9tZW50YXJpbHkgYmxvY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICogXHBhcmFtW291dF0gZmFpbHVyZXMgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgZmFpbHVyZXMgYW5kIG9wdGlvbmFsIGd1aWRhbmNlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHNvbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcywgYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHRoZW0uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHNldCB0aGUgcGFyYW1ldGVycyB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcnVubmluZyBzdGF0ZSkKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgdXBkYXRlIG9mIHRoZSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7CisKKyAgICAvLyBUVU5ORUxJTkcKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB0dW5uZWwgZnJvbSB0aGlzIGNvbXBvbmVudCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIElmIHRoZSBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIHN1YnNlcXVlbnQgd29yayBpdGVtcyBxdWV1ZWQgbWF5IGluY2x1ZGUgYQorICAgICAqIHR1bm5lbGVkIHBhdGggYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdHVubmVsIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSB0YXJnZXQgY29tcG9uZW50IGRvZXMgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgdGhlIHR1bm5lbCBhbHJlYWR5IGV4aXN0cworICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHR1bm5lbGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIHNwZWNpZmljIHR1bm5lbCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIHR1bm5lbCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIHR1bm5lbCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyBhIHR1bm5lbCBmcm9tIHRoaXMgY29tcG9uZW50IHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhlIHJlbGVhc2Ugb2YgYSB0dW5uZWwgaXMgZGVsYXllZCB3aGlsZSB0aGVyZSBhcmUgcGVuZGluZyB3b3JrIGl0ZW1zIGZvciB0aGUgdHVubmVsLgorICAgICAqIEFmdGVyIHJlbGVhc2luZyBhIHR1bm5lbCwgc3Vic2VxdWVudCB3b3JrIGl0ZW1zIHF1ZXVlZCBNVVNUIE5PVCBpbmNsdWRlIGEgdHVubmVsZWQKKyAgICAgKiBwYXRoIGJldHdlZW4gdGhlc2UgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHR1bm5lbCB3YXMgbWFya2VkIGZvciByZWxlYXNlIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSB0YXJnZXQgY29tcG9uZW50IGRvZXMgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIHR1bm5lbCBkb2VzIG5vdCBleGlzdAorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHR1bm5lbGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBtYXJrIHRoZSB0dW5uZWwgZm9yIHJlbGVhc2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlbGVhc2Ugb2YgdGhlIHR1bm5lbCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgPSAwOworCisgICAgLy8gUkVGTEVDVElPTiBNRUNIQU5JU00gKFVTRUQgRk9SIEVYVEVOU0lPTikKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtvdXRdIHBhcmFtcyBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgdmVjdG9yLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBxdWVyaWVkIGZpZWxkcy4KKyAgICAgKgorICAgICAqIENsaWVudCBTSEFMTCBzZXQgdGhlIHBhcmFtZXRlci1maWVsZCBzcGVjaWZpZXIgYW5kIHRoZSB0eXBlIG9mIHN1cHBvcnRlZCB2YWx1ZXMgcXVlcnkgKGUuZy4KKyAgICAgKiBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcywgb3IgcG90ZW50aWFsIHN1cHBvcnRlZCB2YWx1ZXMpIGluIGZpZWxkcy4KKyAgICAgKiBVcG9uIHJldHVybiB0aGUgY29tcG9uZW50IFNIQUxMIGZpbGwgaW4gdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmaWVsZHMgbGlzdGVkIGFzIHdlbGwKKyAgICAgKiBhcyBhIHN0YXR1cyBmb3IgZWFjaCBmaWVsZC4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsIGZpZWxkcyBxdWVyaWVkIGV2ZW4gaWYgc29tZSBxdWVyaWVzCisgICAgICogZmFpbC4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbiBvdXRdIGZpZWxkcyBhIHZlY3RvciBvZiBmaWVsZHMgZGVzY3JpcHRvciBzdHJ1Y3R1cmVzLgorICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgICBpZiB0cnVlIChDMl9NQVlfQkxPQ0spLCBpbXBsZW1lbnRhdGlvbiBtYXkgbW9tZW50YXJpbHkgYmxvY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhdCBsZWFzdCBvbmUgZmllbGQgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgY29tcG9uZW50IGZpZWxkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHF1ZXJ5IHN1cHBvcnRlZCB2YWx1ZXMgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJ1bm5pbmcgc3RhdGUpCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnRJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgTGlzdGVuZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpID0gMDsKKworICAgICAgICAvLyB2aXJ0dWFsIHZvaWQgb25UdW5uZWxSZWxlYXNlZCg8ZnJvbT4sIDx0bz4pID0gMDsKKworICAgICAgICAvLyB2aXJ0dWFsIHZvaWQgb25Db21wb25lbnRSZWxlYXNlZCg8aWQ+KSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB+TGlzdGVuZXIoKSA9IGRlZmF1bHQ7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpc3RlbmVyIGZvciB0aGlzIGNvbXBvbmVudAorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYWxsIHN0YXRlcyBleGNlcHQgcmVsZWFzZWQuCisgICAgICogVGhlIGxpc3RlbmVyIGNhbiBvbmx5IGJlIHNldCB0byBub24tbnVsbCB2YWx1ZSBpbiBzdG9wcGVkIHN0YXRlICh0aGF0IGRvZXMgbm90IGluY2x1ZGUKKyAgICAgKiB0cmlwcGVkIG9yIGVycm9yKS4gSXQgY2FuIGJlIHNldCB0byBudWxscHRyIGluIGJvdGggc3RvcHBlZCBhbmQgcnVubmluZyBzdGF0ZXMuCisgICAgICogQ29tcG9uZW50cyBvbmx5IHVzZSB0aGUgbGlzdGVuZXIgaW4gcnVubmluZyBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIGxpc3RlbmVyIGlzIG51bGxwdHIsIHRoZSBjb21wb25lbnQgU0hBTEwgZ3VhcmFudGVlIHRoYXQgbm8gbW9yZSBsaXN0ZW5lciBjYWxsYmFja3MgYXJlCisgICAgICogZG9uZSB0byB0aGUgb3JpZ2luYWwgbGlzdGVuZXIgb25jZSB0aGlzIG1ldGhvZCByZXR1cm5zLiAoQW55IHBlbmRpbmcgbGlzdGVuZXIgY2FsbGJhY2tzIHdpbGwKKyAgICAgKiBuZWVkIHRvIGJlIGNvbXBsZXRlZCBkdXJpbmcgdGhpcyBjYWxsIC0gaGVuY2UgdGhpcyBjYWxsIG1heSBiZSB0ZW1wb3JhcmlseSBibG9ja2luZy4pCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSB2YXJpYWJsZSBibG9ja2luZyBiZWhhdmlvciBiYXNlZCBvbiBzdGF0ZS4KKyAgICAgKiBJbiB0aGUgc3RvcHBlZCBzdGF0ZSB0aGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKiBJbiB0aGUgcnVubmluZyBzdGF0ZXMgdGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIENvbXBvbmVudCBTSEFMTCBoYW5kbGUgbGlzdGVuZXIgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBzYW1lIHRocmVhZCAodGhlIHRocmVhZCB1c2VkIGlzCisgICAgICogYXQgdGhlIGNvbXBvbmVudCdzIGRpc2NyZXRpb24uKQorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBjb3VsZCBhbHNvIGJlIGFjY29tcGxpc2hlZCBieSBwYXNzaW5nIGEgd2Vha19wdHIgdG8gYSBjb21wb25lbnQtc3BlY2lmaWMgbGlzdGVuZXIKKyAgICAgKiBoZXJlIGFuZCByZXF1aXJpbmcgdGhlIGNsaWVudCB0byBhbHdheXMgcHJvbW90ZSB0aGUgd2Vha19wdHIgYmVmb3JlIGFueSBjYWxsYmFjay4gVGhpcyB3b3VsZAorICAgICAqIHB1dCB0aGUgYnVyZGVuIG9uIHRoZSBjbGllbnQgdG8gY2xlYXIgdGhlIGxpc3RlbmVyIC0gd2FpdCBmb3IgaXRzIGRlbGV0aW9uIC0gYXQgd2hpY2ggcG9pbnQKKyAgICAgKiBpdCBpcyBndWFyYW50ZWVkIHRoYXQgbm8gbW9yZSBsaXN0ZW5lciBjYWxsYmFja3Mgd2lsbCBvY2N1ci4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gbGlzdGVuZXIgdGhlIGNvbXBvbmVudCBsaXN0ZW5lciBvYmplY3QKKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSBhdHRlbXB0aW5nIHRvIGNoYW5nZSB0aGUgbGlzdGVuZXIgaW4gdGhlIHJ1bm5pbmcgc3RhdGUgdG8gYSBub24tbnVsbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICh1c2VyIGVycm9yKSwgb3IgY2FsbGVkIGluIHRoZSByZWxlYXNlZCBzdGF0ZQorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBsaXN0ZW5lciB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSA9IDA7CisKKyAgICAvLy8gY29tcG9uZW50IGRvbWFpbiAoZS5nLiBhdWRpbyBvciB2aWRlbykKKyAgICBlbnVtIGRvbWFpbl90IDogdWludDMyX3Q7CisKKyAgICAvLy8gY29tcG9uZW50IGtpbmQgKGUuZy4gZW5jb2RlciwgZGVjb2RlciBvciBmaWx0ZXIpCisgICAgZW51bSBraW5kX3QgOiB1aW50MzJfdDsKKworICAgIC8vLyBjb21wb25lbnQgcmFuay4gVGhpcyBudW1iZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgY29tcG9uZW50IG9yZGVyaW5nICh0aGUgbG93ZXIgdGhlIHNvb25lcikKKyAgICAvLy8gaW4gdGhlIGNvbXBvbmVudCBsaXN0LgorICAgIHR5cGVkZWYgdWludDMyX3QgcmFua190OworCisgICAgLy8vIGNvbXBvbmVudCBhdHRyaWJ1dGVzCisgICAgZW51bSBhdHRyaWJfdCA6IHVpbnQ2NF90OworCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gYWJvdXQgYSBjb21wb25lbnQuCisgICAgICovCisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgLy8gcHVibGljOgorICAgICAgICBDMlN0cmluZyBuYW1lOyAvLy88IG5hbWUgb2YgdGhlIGNvbXBvbmVudAorICAgICAgICBkb21haW5fdCBkb21haW47IC8vLzwgY29tcG9uZW50IGRvbWFpbgorICAgICAgICBraW5kX3Qga2luZDsgLy8vPCBjb21wb25lbnQga2luZAorICAgICAgICByYW5rX3QgcmFuazsgLy8vPCBjb21wb25lbnQgcmFuaworICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGU7IC8vLzwgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudAorICAgICAgICBDMlN0cmluZyBvd25lcjsgLy8vPCBuYW1lIG9mIHRoZSBjb21wb25lbnQgc3RvcmUgb3duaW5nIHRoaXMgY29tcG9uZW50CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5hbWUgYWxpYXMoZXMpIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgKiBcbm90ZSBNdWx0aXBsZSBjb21wb25lbnRzIGNhbiBoYXZlIHRoZSBzYW1lIGFsaWFzIGFzIGxvbmcgYXMgdGhlaXIgbWVkaWEtdHlwZSBkaWZmZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXM7IC8vLzwgbmFtZSBhbGlhc2VzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgfTsKKworICAgIC8vIE1FVEhPRFMgQVZBSUxBQkxFIFdIRU4gUlVOTklORworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUXVldWVzIHVwIHdvcmsgZm9yIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMSBtcworICAgICAqCisgICAgICogSXQgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyBtZXRob2QgdG8gcmV0dXJuIE9LIGFuZCByZXR1cm4gYW4gZXJyb3IgdmFsdWUgdXNpbmcgdGhlCisgICAgICogb25Xb3JrRG9uZSgpIGNhbGxiYWNrLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHdvcmsgd2FzIHN1Y2Nlc3NmdWxseSBxdWV1ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBkbyhlcykgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIGNvbXBvbmVudHMgYXJlIG5vdCB0dW5uZWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcXVldWUgdGhlIHdvcmsKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHF1ZXVpbmcgdGhlIHdvcmsgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgPSAwOworCisgICAgLyoqCisgICAgICogQW5ub3VuY2VzIGEgd29yayB0byBiZSBxdWV1ZWQgbGF0ZXIgZm9yIHRoZSBjb21wb25lbnQuIFRoaXMgcmVzZXJ2ZXMgYSBzbG90IGZvciB0aGUgcXVldWUKKyAgICAgKiB0byBlbnN1cmUgY29ycmVjdCB3b3JrIG9yZGVyaW5nIGV2ZW4gaWYgdGhlIHdvcmsgaXMgcXVldWVkIGxhdGVyLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQgYW5kIGVycm9yKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDEgbXMKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIGFubm91bmNlbWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBvdXRsaW5lIGRvKGVzKSBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX0NBTk5PVF9ETyB0aGUgY29tcG9uZW50ZXMgYXJlIG5vdCB0dW5uZWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjb3JkIHRoZSB3b3JrIGFubm91bmNlbWVudAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVjb3JkaW5nIHRoZSBhbm5vdW5jZW1lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBcdG9kbyBDYW4gdGhpcyBiZSByb2xsZWQgaW50byBxdWV1ZV9uYj8KKyAgICAgKiBcdG9kbyBFeHBvc2UgbmV4dCB3b3JrIGl0ZW0gZm9yIGVhY2ggY29tcG9uZW50IHRvIGRldGVjdCBzdGFsbHMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgPSAwOworCisgICAgZW51bSBmbHVzaF9tb2RlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vLyBmbHVzaCB3b3JrIGZyb20gdGhpcyBjb21wb25lbnQgb25seQorICAgICAgICBGTFVTSF9DT01QT05FTlQsCisKKyAgICAgICAgLy8vIGZsdXNoIHdvcmsgZnJvbSB0aGlzIGNvbXBvbmVudCBhbmQgYWxsIGNvbXBvbmVudHMgY29ubmVjdGVkIGRvd25zdHJlYW0gZnJvbSBpdCB2aWEKKyAgICAgICAgLy8vIHR1bm5lbGluZworICAgICAgICBGTFVTSF9DSEFJTiA9ICgxIDw8IDE2KSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogRGlzY2FyZHMgYW5kIGFiYW5kb25zIGFueSBwZW5kaW5nIHdvcmsgZm9yIHRoZSBjb21wb25lbnQsIGFuZCBvcHRpb25hbGx5IGFueSBjb21wb25lbnQKKyAgICAgKiBkb3duc3RyZWFtLgorICAgICAqCisgICAgICogXHRvZG8gZGVmaW5lIHRoaXM6IHdlIGNvdWxkIGZsdXNoIGFsbCB3b3JrIGJlZm9yZSBsYXN0IGl0ZW0gcXVldWVkIGZvciBjb21wb25lbnQgYWNyb3NzIGFsbAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzIGxpbmtlZCB0byB0aGlzOyBmbHVzaCBvbmx5IHdvcmsgaXRlbXMgdGhhdCBhcmUgcXVldWVkIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50CisgICAgICogXHRvZG8gcmV0dXJuIHdvcmsgIyBvZiBsYXN0IGZsdXNoZWQgaXRlbTsgb3IgYWxsIGZsdXNoZWQgKGJ1dCBub3QgcmV0dXJuZWQgaXRlbXMpCisgICAgICogXHRvZG8gd2UgY291bGQgbWFrZSBmbHVzaCB0YWtlIGEgd29yayBpdGVtIGFuZCBmbHVzaCBhbGwgd29yayBiZWZvcmUvYWZ0ZXIgdGhhdCBpdGVtIHRvIGFsbG93CisgICAgICogICAgICAgVEJEIChzbGljaW5nL3NlZWs/KQorICAgICAqIFx0b2RvIHdlIGNvdWxkIHNpbXBseSB0YWtlIGEgbGlzdCBvZiBudW1iZXJzIGFuZCBmbHVzaCB0aG9zZS4uLiB0aGlzIGlzIGJhZCBmb3IgZGVjb2RlcnMKKyAgICAgKiAgICAgICBhbHNvLCB3aGF0IHdvdWxkIGhhcHBlbiB0byBmaW5lIGdyYWRlIHJlZmVyZW5jZXM/CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IG11c3QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBXb3JrIHRoYXQgY291bGQgYmUgaW1tZWRpYXRlbHkgYWJhbmRvbmVkL2Rpc2NhcmRlZCBTSEFMTCBiZSByZXR1cm5lZCBpbiB8Zmx1c2hlZFdvcmt8OyB0aGlzCisgICAgICogY2FuIGJlIGRvbmUgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyLgorICAgICAqCisgICAgICogV29yayB0aGF0IGNvdWxkIG5vdCBiZSBhYmFuZG9uZWQgb3IgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IFNIQUxMIGJlIG1hcmtlZCB0byBiZQorICAgICAqIGRpc2NhcmRlZCBhdCB0aGUgZWFybGllc3Qgb3Bwb3J0dW5pdHksIGFuZCBTSEFMTCBiZSByZXR1cm5lZCB2aWEgdGhlIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KKyAgICAgKiBUaGlzIHNoYWxsIGJlIGNvbXBsZXRlZCB3aXRoaW4gNTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kZSBmbHVzaCBtb2RlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmbHVzaGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGZsdXNoIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgZmx1c2hpbmcgZnJvbSBjb21wbGV0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmx1c2hfc20oZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSA9IDA7CisKKyAgICBlbnVtIGRyYWluX21vZGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIGRyYWluIGNvbXBvbmVudCBvbmx5IGFuZCBhZGQgYW4gImVuZC1vZi1zdHJlYW0iIG1hcmtlci4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsCisgICAgICAgIC8vLyBxdWV1ZWQgd29yayBhbmQgY29tcGxldGUgdGhlIGN1cnJlbnQgc3RyZWFtLiBJZiBuZXcgaW5wdXQgaXMgcmVjZWl2ZWQsIGl0IHNoYWxsIHN0YXJ0CisgICAgICAgIC8vLyBhIG5ldyBzdHJlYW0uIFx0b2RvIGRlZmluZSB3aGF0IGEgc3RyZWFtIGlzLgorICAgICAgICBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsCisgICAgICAgIC8vLyBkcmFpbiBjb21wb25lbnQgd2l0aG91dCBzZXR0aW5nICJlbmQtb2Ytc3RyZWFtIiBtYXJrZXIuIENvbXBvbmVudCBzaGFsbCBwcm9jZXNzIGFsbAorICAgICAgICAvLy8gcXVldWVkIHdvcmsgYnV0IHNoYWxsIGV4cGVjdCBtb3JlIHdvcmsgaXRlbXMgZm9yIHRoZSBzYW1lIHN0cmVhbS4KKyAgICAgICAgRFJBSU5fQ09NUE9ORU5UX05PX0VPUyA9ICgxIDw8IDApLAorCisgICAgICAgIC8vLyBtYXJrcyB0aGUgbGFzdCB3b3JrIGl0ZW0gd2l0aCBhIHBlcnNpc3RlbnQgImVuZC1vZi1zdHJlYW0iIG1hcmtlciB0aGF0IHdpbGwgZHJhaW4KKyAgICAgICAgLy8vIGRvd25zdHJlYW0gY29tcG9uZW50cworICAgICAgICAvLy8gXHRvZG8gdGhpcyBtYXkgY29uZnVzZSB3b3JrLW9yZGVyaW5nIGRvd25zdHJlYW0KKyAgICAgICAgRFJBSU5fQ0hBSU4gPSAoMSA8PCAxNiksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFx0b2RvIGRlZmluZSB0aGlzOyB3ZSBjb3VsZCBwbGFjZSBFT1MgdG8gYWxsIHVwc3RyZWFtIGNvbXBvbmVudHMsIGp1c3QgdGhpcyBjb21wb25lbnQsIG9yCisgICAgICAgICAqICAgICAgIGFsbCB1cHN0cmVhbSBhbmQgZG93bnN0cmVhbSBjb21wb25lbnQuCisgICAgICAgICAqIFx0b2RvIHNob3VsZCBFT1MgY2Fycnkgb3ZlciB0byBkb3duc3RyZWFtIGNvbXBvbmVudHM/CisgICAgICAgICAqLworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBEcmFpbnMgdGhlIGNvbXBvbmVudCwgYW5kIG9wdGlvbmFsbHkgZG93bnN0cmVhbSBjb21wb25lbnRzLiBUaGlzIGlzIGEgc2lnbmFsbGluZyBtZXRob2Q7CisgICAgICogYXMgc3VjaCBpdCBkb2VzIG5vdCB3YWl0IGZvciBhbnkgd29yayBjb21wbGV0aW9uLgorICAgICAqCisgICAgICogTWFya3MgbGFzdCB3b3JrIGl0ZW0gYXMgImRyYWluLXRpbGwtaGVyZSIsIHNvIGNvbXBvbmVudCBpcyBub3RpZmllZCBub3QgdG8gd2FpdCBmb3IgZnVydGhlcgorICAgICAqIHdvcmsgYmVmb3JlIGl0IHByb2Nlc3NlcyB3b3JrIGFscmVhZHkgcXVldWVkLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyB1c2VkIHRvIHNldCB0aGUKKyAgICAgKiBlbmQtb2Ytc3RyZWFtIGZsYWcgYWZ0ZXIgd29yayBoYXMgYmVlbiBxdWV1ZWQuIENsaWVudCBjYW4gY29udGludWUgdG8gcXVldWUgZnVydGhlciB3b3JrCisgICAgICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFdvcmsgdGhhdCBpcyBjb21wbGV0ZWQgU0hBTEwgYmUgcmV0dXJuZWQgdmlhIHRoZSBvbldvcmtEb25lKCkgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kZSBkcmFpbiBtb2RlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgZHJhaW4gcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgZHJhaW4gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBkZWZpbmUgc3VwcG9ydGVkIG1vZGVzIGRpc2NvdmVyeQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBmbHVzaCBjb3VsZCBub3QgYmUgY29tcGxldGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGZsdXNoaW5nIGZyb20gY29tcGxldGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvLyBTVEFURSBDSEFOR0UgTUVUSE9EUworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBzdG9wcGVkIHN0YXRlLCBhcyB3ZWxsIGFzIGR1cmluZyB0aGUgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfT0ssIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHJ1bm5pbmcgc3RhdGUuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcbm90ZSBJZiBhIGNvbXBvbmVudCBpcyBpbiB0aGUgdHJpcHBlZCBzdGF0ZSBhbmQgc3RhcnQoKSBpcyBjYWxsZWQgd2hpbGUgdGhlIGNvbXBvbmVudAorICAgICAqIGNvbmZpZ3VyYXRpb24gc3RpbGwgcmVzdWx0cyBpbiBhIHRyaXAsIHN0YXJ0IHNoYWxsIHN1Y2NlZWQgYW5kIGEgbmV3IG9uVHJpcHBlZCBjYWxsYmFjaworICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHRoZSBjb25maWd1cmF0aW9uIGNvbmZsaWN0IHRoYXQgcmVzdWx0cyBpbiB0aGUgbmV3IHRyaXAuCisgICAgICoKKyAgICAgKiBcdG9kbyBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW4gNTAwbXMuIFNlZW1zIHRoaXMgc2hvdWxkIGJlIGFibGUgdG8gcmV0dXJuIHF1aWNrbHksIGFzCisgICAgICogdGhlcmUgYXJlIG5vIGltbWVkaWF0ZSBndWFyYW50ZWVzLiBUaG91Z2ggdGhlcmUgYXJlIGd1YXJhbnRlZXMgZm9yIHJlc3BvbnNpdmVuZXNzIGltbWVkaWF0ZWx5CisgICAgICogYWZ0ZXIgc3RhcnQgcmV0dXJucy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIHN0YXJ0ZWQgKG9yIHJlc3VtZWQpIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXJ0IGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBzdG9wcGVkIHN0YXRlIG9yIHRyaXBwZWQgc3RhdGUsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXRlIGNoYW5nZSBjYWxsIGZyb20gYW5vdGhlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBzdGFydCB0aGUgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgc3RhcnRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzdGFydGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KKyAgICAgKgorICAgICAqIFVwb24gdGhpcyBjYWxsLCBhbGwgcGVuZGluZyB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCBhbmQgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlCisgICAgICogcmVsZWFzZWQuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBGb3IgYWxsIG90aGVyIHJldHVybiB2YWx1ZXMsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBzaG91bGQgdGhpcyByZXR1cm4gY29tcGxldGVkIHdvcmssIHNpbmNlIGNsaWVudCB3aWxsIGp1c3QgZnJlZSBpdD8gUGVyaGFwcyBqdXN0IHRvCisgICAgICogdmVyaWZ5IGFjY291bnRpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IGFsdGVyIGFueSBzZXR0aW5ncyBhbmQgdHVuaW5ncyB0aGF0IG1heSBoYXZlIHJlc3VsdGVkIGluIGEgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKiAoSXMgdGhpcyBtYXRlcmlhbCBnaXZlbiB0aGUgZGVmaW5pdGlvbj8gUGVyaGFwcyBpbiBjYXNlIHdlIHdhbnQgdG8gc3RhcnQgYWdhaW4uKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB3aGVuIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdG9wIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBydW5uaW5nIHN0YXRlLCBpbmNsdWRpbmcgd2hlbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdGF0ZSBjaGFuZ2UgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHN0b3BwZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc3RvcHBpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFsbCAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcyBvdGhlciB0aGFuIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgZHVyaW5nIGFueSBvdGhlciBibG9ja2luZyBjYWxsLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KKyAgICAgKgorICAgICAqIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zIGFsbCB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCwgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlIHJlbGVhc2VkLgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfQkFEX1NUQVRFIG9yIEMyX0RVUExJQ0FURSwgbm8gc3RhdGUgY2hhbmdlIGlzIGV4cGVjdGVkIGFzIGEKKyAgICAgKiByZXNwb25zZSB0byB0aGlzIGNhbGwuCisgICAgICogRm9yIGFsbCBvdGhlciByZXR1cm4gdmFsdWVzLCB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGluIHRoZSBzdG9wcGVkIHN0YXRlLgorICAgICAqCisgICAgICogXHRvZG8gc2hvdWxkIHRoaXMgcmV0dXJuIGNvbXBsZXRlZCB3b3JrLCBzaW5jZSBjbGllbnQgd2lsbCBqdXN0IGZyZWUgaXQ/IEFsc28sIGlmIGl0IHVuYmxvY2tzCisgICAgICogYSBzdG9wLCB3aGVyZSBzaG91bGQgY29tcGxldGVkIHdvcmsgYmUgcmV0dXJuZWQ/CisgICAgICoKKyAgICAgKiBUaGlzIGJyaW5ncyBzZXR0aW5ncyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgLSAiZ3VhcmFudGVlaW5nIiBubyB0cmlwcGVkIHNwYWNlLgorICAgICAqCisgICAgICogXHRvZG8gcmVjbGFpbSBzdXBwb3J0IC0gaXQgc2VlbXMgdGhhdCBzaW5jZSBvd25lcnNoaXAgaXMgcGFzc2VkLCB0aGlzIHdpbGwgYWxsb3cgcmVjbGFpbWluZworICAgICAqIHN0dWZmLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiByZXNldAorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHJlc2V0IGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBzdGF0ZQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHJlc2V0IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlc2V0dGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gc3RvcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbmcgNTAwbXMuIFVwb24gcmV0dXJuIGFsbCByZWZlcmVuY2VzIHNoYWxsIGJlIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVsZWFzZWQKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGUgY29tcG9uZW50IGlzIGFscmVhZHkgcmVsZWFzZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB0aGUgY29tcG9uZW50IGlzIHJ1bm5pbmcKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSByZWxlYXNlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZWxlYXNpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnQoKSA9IGRlZmF1bHQ7Cit9OworCitDMkVOVU0oQzJDb21wb25lbnQ6OmtpbmRfdCwgdWludDMyX3QsCisgICAgS0lORF9PVEhFUiwKKyAgICBLSU5EX0RFQ09ERVIsCisgICAgS0lORF9FTkNPREVSCispOworCitDMkVOVU0oQzJDb21wb25lbnQ6OmRvbWFpbl90LCB1aW50MzJfdCwKKyAgICBET01BSU5fT1RIRVIsCisgICAgRE9NQUlOX1ZJREVPLAorICAgIERPTUFJTl9BVURJTywKKyAgICBET01BSU5fSU1BR0UKKyk7CisKK2NsYXNzIEMyRnJhbWVJbmZvUGFyc2VyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHRoZSBjb250ZW50IHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBcdG9kbyB0aGlzIG1heSBiZSByZWR1bmRhbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nTGl0ZXJhbCBnZXRUeXBlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogXHJldHVybiBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVyIGluZGljZXMgcGFyc2VkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFx0b2RvIHN0aWNreSB2cy4gbm9uLXN0aWNreSBwYXJhbXM/IHRoaXMgbWF5IGJlIGNvbW11bmljYXRlZCBieSBwYXJhbS1yZWZsZWN0b3IuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0UGFyc2VkUGFyYW1zKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoaXMgaW5mbyBwYXJzZXIuIFRoaXMgYnJpbmdzIHRoaXMgcGFyc2VyIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFmdGVyIGNyZWF0aW9uLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgaW5mbyBwYXJzZXIgd2FzIHJlc2V0CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHJlc2V0IHRoZSBwYXJzZXIgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlc2V0dGluZyBvZiB0aGUgcGFyc2VyICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSB7IHJldHVybiBDMl9PSzsgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwYXJzZUZyYW1lKEMyRnJhbWVEYXRhICZmcmFtZSk7CisKKyAgICB2aXJ0dWFsIH5DMkZyYW1lSW5mb1BhcnNlcigpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQWxsb2NhdG9yU3RvcmUgeworcHVibGljOgorICAgIHR5cGVkZWYgQzJBbGxvY2F0b3I6OmlkX3QgaWRfdDsKKworICAgIGVudW0gOiBDMkFsbG9jYXRvcjo6aWRfdCB7CisgICAgICAgIERFRkFVTFRfTElORUFSLCAgICAgLy8vPCBiYXNpYyBsaW5lYXIgYWxsb2NhdG9yIHR5cGUKKyAgICAgICAgREVGQVVMVF9HUkFQSElDLCAgICAvLy88IGJhc2ljIGdyYXBoaWMgYWxsb2NhdG9yIHR5cGUKKyAgICAgICAgUExBVEZPUk1fU1RBUlQgPSAweDEwLAorICAgICAgICBWRU5ET1JfU1RBUlQgICA9IDB4MTAwLAorICAgICAgICBCQURfSUQgICAgICAgICA9IEMyQWxsb2NhdG9yOjpCQURfSUQsIC8vLzwgRE8gTk9UIFVTRQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFjdHVhbCBuYW1lLgorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBhbGxvY2F0b3JzIHN1cHBvcnRlZCBieSB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHZhbCB2ZWN0b3Igb2YgYWxsb2NhdG9yIGluZm9ybWF0aW9uIChhcyBzaGFyZWQgcG9pbnRlcnMpCisgICAgICogXHJldHZhbCBhbiBlbXB0eSB2ZWN0b3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSB3aG9sZSB2ZWN0b3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+IGxpc3RBbGxvY2F0b3JzX25iKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzL2NyZWF0ZXMgYSBzaGFyZWQgYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBUaGUgYWxsb2NhdG9yIGlzIGNyZWF0ZWQgb24gZmlyc3QgdXNlLCBhbmQgdGhlIHNhbWUgYWxsb2NhdG9yIGlzIHJldHVybmVkIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBjb25jdXJyZW50IHVzZXMgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhlIGFsbG9jYXRvciBpcyBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlciByZWZlcmVuY2VkLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLiBUaGlzIGlzIGRlZmluZWQgYnkgdGhlIHN0b3JlLCBidXQKKyAgICAgKiAgICAgICAgICAgICAgICB0aGUgSUQgb2YgdGhlIGRlZmF1bHQgbGluZWFyIGFuZCBncmFwaGljIGFsbG9jYXRvcnMgaXMgZm9ybWFsaXplZC4KKyAgICAgKiBccGFyYW0gYWxsb2NhdG9yIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGFsbG9jYXRvciBpcyBzdG9yZWQuIENsZWFyZWQgb24gZmFpbHVyZQorICAgICAqICAgICAgICAgICAgICAgICAgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0b3Igd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBhbGxvY2F0b3IKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hBbGxvY2F0b3IoaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvclN0b3JlKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgJ2NsYXNzJzsgaG93ZXZlciwgbXVsdGlwbGUKKyAgICAgKiBpbnN0YW5jZXMgb2YgdGhpcyBjb21wb25lbnQgU0hBTEwgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlCisgICAgICogaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBjcmVhdGUKKyAgICAgKiBccGFyYW0gY29tcG9uZW50ICAgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBjb21wb25lbnQgaXMgc3RvcmVkLiBDbGVhcmVkIG9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBubyBzdWNoIGNvbXBvbmVudAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UgdG8gY3JlYXRlCisgICAgICogXHBhcmFtIGludGVyZmFjZSAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgaW50ZXJmYWNlIGlzIHN0b3JlZAorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICoKKyAgICAgKiBcdG9kbyBEbyB3ZSBuZWVkIGFuIGludGVyZmFjZSwgb3IgY291bGQgdGhpcyBqdXN0IGJlIGEgY29tcG9uZW50IHRoYXQgaXMgbmV2ZXIgc3RhcnRlZD8KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjb21wb25lbnRzIHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudCBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgdmVjdG9yIG9mIGNvbXBvbmVudCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRZIE1FVEhPRFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIG9uLWRlbWFuZCBidWZmZXIgbGF5b3V0IGNvbnZlcnNpb24gKHN3aXp6bGluZykKKyAgICAvLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGUuZy4gZm9yIGdsb2JhbCBzZXR0aW5ncyAoc3lzdGVtLXdpZGUgc3RyaWRlLCBldGMuKQorCisgICAgLyoqCisgICAgICogUXVlcmllcyBhIHNldCBvZiBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzLgorICAgICAqIFF1ZXJ5aW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHF1ZXJ5IGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgKiBza2lwIHVuc3VwcG9ydGVkIG9uZXMsIG9yIGhlYXAgYWxsb2NhdGVkIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLiBBbnkgZXJyb3JzCisgICAgICogYXJlIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlLiBBZGRpdGlvbmFsbHksIHByZWFsbG9jYXRlZCAoZS5nLiBzdGFjaykgcGFyYW1ldGVycyB0aGF0CisgICAgICogY291bGQgbm90IGJlIHF1ZXJpZWQgYXJlIGludmFsaWRhdGVkLiBQYXJhbWV0ZXJzIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhcmUgb21pdHRlZCBmcm9tCisgICAgICogdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgcXVlcnkuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtIHN0YWNrUGFyYW1zICAgYSBsaXN0IG9mIHBhcmFtcyBxdWVyaWVkLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgc3BlY2lmaWMgdG8gZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IEZsZXhpYmxlIHNldHRpbmdzIHRoYXQgYXJlIG9mIGluY29ycmVjdCBzaXplIHdpbGwgYmUgaW52YWxpZGF0ZWQuCisgICAgICogXHBhcmFtIGhlYXBQYXJhbUluZGljZXMgYSB2ZWN0b3Igb2YgcGFyYW0gaW5kaWNlcyBmb3IgcGFyYW1zIHRvIGJlIHF1ZXJpZWQgYW5kIHJldHVybmVkIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGhlYXAuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXR1cm5lZCBpbiBoZWFwUGFyYW1zLiBVbnN1cHBvcnRlZCBwYXJhbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIFxwYXJhbSBoZWFwUGFyYW1zICAgIGEgbGlzdCBvZiBwYXJhbXMgd2hlcmUgdG8gd2hpY2ggdGhlIHN1cHBvcnRlZCBoZWFwIHBhcmFtZXRlcnMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBzdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcXVlcnlpbmcgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgYSBzZXQgb2Ygc3lzdGVtLXdpZGUgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZXJlIGFyZSBubyBzZXR0YWJsZSBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzIGRlZmluZWQgdGh1cyBmYXIsIGJ1dCBtYXkgYmUgYWRkZWQgaW4gdGhlCisgICAgICogZnV0dXJlLgorICAgICAqCisgICAgICogVHVuaW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHVwZGF0ZSBhbGwgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gYXQKKyAgICAgKiBiZXN0IGVmZm9ydCAodW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlKSBhbmQgc2tpcCB1bnN1cHBvcnRlZCBvbmVzLiBBbnkgZXJyb3JzIGFyZQorICAgICAqIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCisgICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgcGFyYW1ldGVyIHVwZGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zICAgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIHVwZGF0ZXMuIFRoZXNlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlcyAodGhpcyBpcyBiZWNhdXNlIHR1bmluZyBpcyBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHRvZG8gcGFyYW1zIHRoYXQgY291bGQgbm90IGJlIHVwZGF0ZWQgYXJlIG5vdCBtYXJrZWQgaGVyZSwgc28gYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW5nIC0gYXJlIHRoZXkgImV4aXN0aW5nIiB2YWx1ZXMgb3IgaW50ZW5kZWQgdG8gYmUgY29uZmlndXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KKyAgICAgKiBccGFyYW0gZmFpbHVyZXMgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIGZhaWx1cmVzCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHNvbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgYSBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB0aGVtLgorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHVwZGF0ZSBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7CisKKyAgICAvLyBSRUZMRUNUSU9OIE1FQ0hBTklTTSAoVVNFRCBGT1IgRVhURU5TSU9OKQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHJlZmxlY3Rvci4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSBwYXJhbWV0ZXIgZmllbGRzLiBUaGlzIGlzIHNoYXJlZCBmb3IgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBieQorICAgICAqIHRoaXMgY29tcG9uZW50IHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgc2hhcmVkIHBhcmFtZXRlciByZWZsZWN0b3Igb2JqZWN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBwYXJhbXMgYSB2ZWN0b3Igb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZWQgZmllbGRzLgorICAgICAqCisgICAgICogQ2xpZW50IFNIQUxMIHNldCB0aGUgcGFyYW1ldGVyLWZpZWxkIHNwZWNpZmllciBhbmQgdGhlIHR5cGUgb2Ygc3VwcG9ydGVkIHZhbHVlcyBxdWVyeSAoZS5nLgorICAgICAqIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzLCBvciBwb3RlbnRpYWwgc3VwcG9ydGVkIHZhbHVlcykgaW4gZmllbGRzLgorICAgICAqIFVwb24gcmV0dXJuIHRoZSBzdG9yZSBTSEFMTCBmaWxsIGluIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgZmllbGRzIGxpc3RlZCBhcyB3ZWxsCisgICAgICogYXMgYSBzdGF0dXMgZm9yIGVhY2ggZmllbGQuIFN0b3JlIHNoYWxsIHByb2Nlc3MgYWxsIGZpZWxkcyBxdWVyaWVkIGV2ZW4gaWYgc29tZSBxdWVyaWVzCisgICAgICogZmFpbC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4gb3V0XSBmaWVsZHMgYSB2ZWN0b3Igb2YgZmllbGRzIGRlc2NyaXB0b3Igc3RydWN0dXJlcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhdCBsZWFzdCBvbmUgZmllbGQgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgY29tcG9uZW50IHN0b3JlIGZpZWxkCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnRTdG9yZSgpID0gZGVmYXVsdDsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkNPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDVjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKQEAgLTAsMCArMSwyMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkNPTkZJR19IXworI2RlZmluZSBDMkNPTkZJR19IXworCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyRW51bS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworLy8vIFxkZWZncm91cCBjb25maWcgQ29tcG9uZW50IGNvbmZpZ3VyYXRpb24KKy8vLyBAeworCisvKioKKyAqIEVudW1lcmF0ZWQgYm9vbGVhbi4KKyAqLworQzJFTlVNKGMyX2Jvb2xfdCwgdWludDMyX3QsCisgICAgQzJfRkFMU0UsIC8vLzwgdHJ1ZQorICAgIEMyX1RSVUUsICAvLy88IGZhbHNlCispCisKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxjMl9ib29sX3Q+IEMyQm9vbFZhbHVlOworCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxjMl9ib29sX3Q+PiBDMkVhc3lCb29sVmFsdWU7CisKKy8qKgorICogRW51bWVyYXRlZCBzZXQgdHJpLXN0YXRlLgorICoKKyAqIFVzZWQgZm9yIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdmFsdWVzIHNldCBieSB0aGUgY2xpZW50LAorICogZGVmYXVsdCB2YWx1ZXMgc2V0IGJ5IHRoZSBjb21wb25lbnQsIG9yIHVuc2V0IHZhbHVlcy4KKyAqLworQzJFTlVNKGMyX3NldF90LCB1aW50MzJfdCwKKyAgICBDMl9VTlNFVCwgICAvLyBwYXJhbWV0ZXIgaXMgdW5zZXQgYW5kIGhhcyBubyB2YWx1ZQorICAgIEMyX1NFVCwgICAgIC8vIHBhcmFtZXRlciBpcy9oYXMgYmVlbiBzZXQgYnkgdGhlIGNsaWVudAorICAgIEMyX0RFRkFVTFQsIC8vIHBhcmFtZXRlciBoYXMgbm90IGJlZW4gc2V0IGJ5IHRoZSBjbGllbnQsIGJ1dCBpcyBzZXQgYnkgdGhlIGNvbXBvbmVudAorKQorCisvKiogRW51bWVyYXRpb25zIHVzZWQgYnkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgQzJDb25maWcgeworICAgIGVudW0gYWFjX3BhY2thZ2luZ190IDogdWludDMyX3Q7ICAgICAgICAvLy88IEFBQyBwYWNrYWdpbmcgKFJBVyB2cyBBRFRTKQorICAgIGVudW0gYWFjX3Nicl9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IEFBQyBTQlIgbW9kZQorICAgIGVudW0gYXBpX2ZlYXR1cmVfdCA6IHVpbnQ2NF90OyAgICAgICAgICAvLy88IEFQSSBmZWF0dXJlcworICAgIGVudW0gYXBpX2xldmVsX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAvLy88IEFQSSBsZXZlbAorICAgIGVudW0gYml0cmF0ZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IGJpdHJhdGUgY29udHJvbCBtb2RlCisgICAgZW51bSBkcmNfY29tcHJlc3Npb25fbW9kZV90IDogaW50MzJfdDsgIC8vLzwgRFJDIGNvbXByZXNzaW9uIG1vZGUKKyAgICBlbnVtIGRyY19lZmZlY3RfdHlwZV90IDogaW50MzJfdDsgICAgICAgLy8vPCBEUkMgZWZmZWN0IHR5cGUKKyAgICBlbnVtIGludHJhX3JlZnJlc2hfbW9kZV90IDogdWludDMyX3Q7ICAgLy8vPCBpbnRyYSByZWZyZXNoIG1vZGVzCisgICAgZW51bSBsZXZlbF90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAgIC8vLzwgY29kaW5nIGxldmVsCisgICAgZW51bSBvcmRpbmFsX2tleV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgd29yayBvcmRlcmluZyBrZXlzCisgICAgZW51bSBwY21fZW5jb2RpbmdfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgUENNIGVuY29kaW5nCisgICAgZW51bSBwaWN0dXJlX3R5cGVfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgcGljdHVyZSB0eXBlcworICAgIGVudW0gcGxhdGZvcm1fZmVhdHVyZV90IDogdWludDY0X3Q7ICAgICAvLy88IHBsYXRmb3JtIGZlYXR1cmVzCisgICAgZW51bSBwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgcGxhdGZvcm0gbGV2ZWwKKyAgICBlbnVtIHByZXBlbmRfaGVhZGVyX21vZGVfdCA6IHVpbnQzMl90OyAgLy8vPCBwcmVwZW5kIGhlYWRlciBvcGVyYXRpb25hbCBtb2RlcworICAgIGVudW0gcHJvZmlsZV90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAvLy88IGNvZGluZyBwcm9maWxlCisgICAgZW51bSBzY2FsaW5nX21ldGhvZF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgc2NhbGluZyBtZXRob2RzCisgICAgZW51bSBzY2FuX29yZGVyX3QgOiB1aW50MzJfdDsgICAgICAgICAgIC8vLzwgc2NhbiBvcmRlcnMKKyAgICBlbnVtIHNlY3VyZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCBzZWN1cmUvcHJvdGVjdGVkIG1vZGVzCisgICAgZW51bSBzdXBwbGVtZW50YWxfaW5mb190IDogdWludDMyX3Q7ICAgIC8vLzwgc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIHR5cGVzCisgICAgZW51bSB0aWxpbmdfbW9kZV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgdGlsaW5nIG1vZGVzCit9OworCituYW1lc3BhY2UgeworCitlbnVtIEMyUGFyYW1JbmRleEtpbmQgOiBDMlBhcmFtOjp0eXBlX2luZGV4X3QgeworICAgIEMyX1BBUkFNX0lOREVYX0lOVkFMSUQgICAgICAgICAgICAgPSAweDAsICAgIC8vLzwgZG8gbm90IHVzZQorICAgIEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCAgICAgICAgPSAweDEsICAgIC8vLzwgc3RydWN0IG9ubHkgaW5kaWNlcworICAgIEMyX1BBUkFNX0lOREVYX1BBUkFNX1NUQVJUICAgICAgICAgPSAweDgwMCwgIC8vLzwgcmVndWxhciBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQgICA9IDB4MTAwMCwgLy8vPCBlbi90cmFuc2NvZGVyIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJUID0gMHgxODAwLCAvLy88IGltYWdlL3ZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9WSURFT19QQVJBTV9TVEFSVCAgID0gMHgyMDAwLCAvLy88IHZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCAgID0gMHgyODAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9BVURJT19QQVJBTV9TVEFSVCAgID0gMHgzMDAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QTEFURk9STV9TVEFSVCAgICAgID0gMHg0MDAwLCAvLy88IHBsYXRmb3JtLWRlZmluZWQgcGFyYW1ldGVycworCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gc3RydWN0dXJlIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4Q29sb3JYeSA9IEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCwKKyAgICBrUGFyYW1JbmRleE1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZSwKKyAgICBrUGFyYW1JbmRleENocm9tYU9mZnNldCwKKyAgICBrUGFyYW1JbmRleEdvcExheWVyLAorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGFyYW1ldGVyIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4QXBpTGV2ZWwgPSBDMl9QQVJBTV9JTkRFWF9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleEFwaUZlYXR1cmVzLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFsbCBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgLyogZ2VuZXJpYyBjb21wb25lbnQgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhOYW1lLAorICAgIGtQYXJhbUluZGV4QWxpYXNlcywKKyAgICBrUGFyYW1JbmRleEtpbmQsCisgICAga1BhcmFtSW5kZXhEb21haW4sCisgICAga1BhcmFtSW5kZXhBdHRyaWJ1dGVzLAorICAgIGtQYXJhbUluZGV4VGltZVN0cmV0Y2gsCisKKyAgICAvKiBjb2RpbmcgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhQcm9maWxlTGV2ZWwsCisgICAga1BhcmFtSW5kZXhJbml0RGF0YSwKKyAgICBrUGFyYW1JbmRleFN1cHBsZW1lbnRhbERhdGEsCisgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YSwKKworICAgIC8qIHBpcGVsaW5lIGNoYXJhY3RlcmlzdGljcyAqLworICAgIGtQYXJhbUluZGV4TWVkaWFUeXBlLAorICAgIGtQYXJhbUluZGV4RGVsYXlSZXF1ZXN0LAorICAgIGtQYXJhbUluZGV4RGVsYXksCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VBZ2UsCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJCdWZmZXJEZXB0aCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJLZXksCisgICAga1BhcmFtSW5kZXhTdHJlYW1Db3VudCwKKyAgICBrUGFyYW1JbmRleFN1YnNjcmliZWRQYXJhbUluZGljZXMsCisgICAga1BhcmFtSW5kZXhTdWdnZXN0ZWRCdWZmZXJDb3VudCwKKyAgICBrUGFyYW1JbmRleEJhdGNoU2l6ZSwKKyAgICBrUGFyYW1JbmRleEN1cnJlbnRXb3JrLAorICAgIGtQYXJhbUluZGV4TGFzdFdvcmtRdWV1ZWQsCisKKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiAqLworICAgIGtQYXJhbUluZGV4QWxsb2NhdG9ycywKKyAgICBrUGFyYW1JbmRleEJsb2NrUG9vbHMsCisgICAga1BhcmFtSW5kZXhCdWZmZXJUeXBlLAorICAgIGtQYXJhbUluZGV4VXNhZ2UsCisgICAga1BhcmFtSW5kZXhPdXRPZk1lbW9yeSwKKyAgICBrUGFyYW1JbmRleE1heEJ1ZmZlclNpemUsCisKKyAgICAvKiBtaXNjLiBzdGF0ZSAqLworICAgIGtQYXJhbUluZGV4VHJpcHBlZCwKKyAgICBrUGFyYW1JbmRleENvbmZpZ0NvdW50ZXIsCisKKyAgICAvKiByZXNvdXJjZXMgKi8KKyAgICBrUGFyYW1JbmRleFJlc291cmNlc05lZWRlZCwKKyAgICBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkLAorICAgIGtQYXJhbUluZGV4T3BlcmF0aW5nUmF0ZSwKKyAgICBrUGFyYW1JbmRleFJlYWxUaW1lUHJpb3JpdHksCisKKyAgICAvKiBwcm90ZWN0ZWQgY29udGVudCAqLworICAgIGtQYXJhbUluZGV4U2VjdXJlTW9kZSwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAodHJhbnMvZW4pY29kZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhCaXRyYXRlID0gQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZSwKKyAgICBrUGFyYW1JbmRleFF1YWxpdHksCisgICAga1BhcmFtSW5kZXhDb21wbGV4aXR5LAorICAgIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGUsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW1hZ2UvdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4UGljdHVyZVNpemUgPSBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4Q3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhQaXhlbEZvcm1hdCwKKyAgICBrUGFyYW1JbmRleFJvdGF0aW9uLAorICAgIGtQYXJhbUluZGV4UGl4ZWxBc3BlY3RSYXRpbywKKyAgICBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplLAorICAgIGtQYXJhbUluZGV4U2NhbGVkQ3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhTY2FsaW5nTWV0aG9kLAorICAgIGtQYXJhbUluZGV4Q29sb3JJbmZvLAorICAgIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzLAorICAgIGtQYXJhbUluZGV4SGRyU3RhdGljTWV0YWRhdGEsCisgICAga1BhcmFtSW5kZXhEZWZhdWx0Q29sb3JBc3BlY3RzLAorCisgICAga1BhcmFtSW5kZXhCbG9ja1NpemUsCisgICAga1BhcmFtSW5kZXhCbG9ja0NvdW50LAorICAgIGtQYXJhbUluZGV4QmxvY2tSYXRlLAorCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZU1hc2ssCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZSwKKyAgICBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHZpZGVvIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleEZyYW1lUmF0ZSA9IEMyX1BBUkFNX0lOREVYX1ZJREVPX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4TWF4Qml0cmF0ZSwKKyAgICBrUGFyYW1JbmRleE1heEZyYW1lUmF0ZSwKKyAgICBrUGFyYW1JbmRleE1heFBpY3R1cmVTaXplLAorICAgIGtQYXJhbUluZGV4R29wLAorICAgIGtQYXJhbUluZGV4U3luY0ZyYW1lSW50ZXJ2YWwsCisgICAga1BhcmFtSW5kZXhSZXF1ZXN0U3luY0ZyYW1lLAorICAgIGtQYXJhbUluZGV4VGVtcG9yYWxMYXllcmluZywKKyAgICBrUGFyYW1JbmRleExheWVySW5kZXgsCisgICAga1BhcmFtSW5kZXhMYXllckNvdW50LAorICAgIGtQYXJhbUluZGV4SW50cmFSZWZyZXNoLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGltYWdlIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleFRpbGVMYXlvdXQgPSBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleFRpbGVIYW5kbGluZywKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhdWRpbyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhTYW1wbGVSYXRlID0gQzJfUEFSQU1fSU5ERVhfQVVESU9fUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhDaGFubmVsQ291bnQsCisgICAga1BhcmFtSW5kZXhQY21FbmNvZGluZywKKyAgICBrUGFyYW1JbmRleEFhY1BhY2thZ2luZywKKyAgICBrUGFyYW1JbmRleE1heENoYW5uZWxDb3VudCwKKyAgICBrUGFyYW1JbmRleEFhY1Nick1vZGUsIC8vIGFhYyBlbmNvZGUsIGVudW0KKyAgICBrUGFyYW1JbmRleERyY0VuY29kZWRUYXJnZXRMZXZlbCwgIC8vIGRyYywgZmxvYXQgKGRCRlMpCisgICAga1BhcmFtSW5kZXhEcmNUYXJnZXRSZWZlcmVuY2VMZXZlbCwgLy8gZHJjLCBmbG9hdCAoZEJGUykKKyAgICBrUGFyYW1JbmRleERyY0NvbXByZXNzaW9uLCAvLyBkcmMsIGVudW0KKyAgICBrUGFyYW1JbmRleERyY0Jvb3N0RmFjdG9yLCAvLyBkcmMsIGZsb2F0ICgwLTEpCisgICAga1BhcmFtSW5kZXhEcmNBdHRlbnVhdGlvbkZhY3RvciwgLy8gZHJjLCBmbG9hdCAoMC0xKQorICAgIGtQYXJhbUluZGV4RHJjRWZmZWN0VHlwZSwgLy8gZHJjLCBlbnVtCisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGxhdGZvcm0tZGVmaW5lZCBwYXJhbWV0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUxldmVsID0gQzJfUEFSQU1fSU5ERVhfUExBVEZPUk1fU1RBUlQsIC8vIGFsbCwgdTMyCisgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUZlYXR1cmVzLCAvLyBhbGwsIHU2NCBtYXNrCisgICAga1BhcmFtSW5kZXhTdG9yZUlvblVzYWdlLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhBc3BlY3RzVG9EYXRhU3BhY2UsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnMsIC8vIHN0b3JlLCBzdHJ1Y3RbXQorICAgIGtQYXJhbUluZGV4RGF0YVNwYWNlVG9Bc3BlY3RzLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhEYXRhU3BhY2UsIC8vIHUzMgorICAgIGtQYXJhbUluZGV4U3VyZmFjZVNjYWxpbmcsIC8vIHUzMgorCisgICAgLy8gaW5wdXQgc3VyZmFjZQorICAgIGtQYXJhbUluZGV4SW5wdXRTdXJmYWNlRW9zLCAvLyBpbnB1dC1zdXJmYWNlLCBlb3MKKyAgICBrUGFyYW1JbmRleFRpbWVkQ29udHJvbCwgLy8gc3RydWN0CisgICAga1BhcmFtSW5kZXhTdGFydEF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFN1c3BlbmRBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhSZXN1bWVBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhTdG9wQXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4VGltZU9mZnNldCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhNaW5GcmFtZVJhdGUsIC8vIGlucHV0LXN1cmZhY2UsIGZsb2F0CisgICAga1BhcmFtSW5kZXhUaW1lc3RhbXBHYXBBZGp1c3RtZW50LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKworICAgIGtQYXJhbUluZGV4U3VyZmFjZUFsbG9jYXRvciwgLy8gdTMyCit9OworCit9CisKKy8qKgorICogQ29kZWMgMi4wIHBhcmFtZXRlciB0eXBlcyBmb2xsb3cgdGhlIGZvbGxvd2luZyBuYW1pbmcgY29udmVudGlvbjoKKyAqCisgKiBDMjxncm91cD48ZG9tYWluPjxpbmRleD48dHlwZT4KKyAqCisgKiBFLmcuIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOiBncm91cD0iIiBkb21haW49IlN0cmVhbSIgaW5kZXg9IlBpY3R1cmVTaXplIiB0eXBlPSJJbmZvIi4KKyAqIEdyb3VwIGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYnV0IGRlbm90ZXMga2luZCBvZiBvYmplY3RzIHRoZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZC4KKyAqIEF0IHRoaXMgcG9pbnQgd2UgdXNlIENvbXBvbmVudCBhbmQgU3RvcmUgdG8gZGlzdGluZ3Vpc2ggYmFzaWMgY29tcG9uZW50L3N0b3JlIHBhcmFtZXRlcnMuCisgKgorICogUGFyYW1ldGVyIGtleXMgYXJlIG5hbWVkIEMyX1BBUkFNS0VZX1s8Z3JvdXA+X108ZG9tYWluPl88aW5kZXg+IGFzIHR5cGUgaXMgbm90IGV4cGVjdGVkCisgKiB0byBkaXN0aW5ndWlzaCBwYXJhbWV0ZXJzLiBFLmcuIGEgY29tcG9uZW50IGNvdWxkIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIGFuZCBpdAorICogaXMgbm90IGV4cGVjdGVkIHVzZXJzIHdvdWxkIG5lZWQgdG8gY2hhbmdlIHRoZSBrZXkuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVBJIGxldmVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gQzJDb25maWc6OmFwaV9sZXZlbF90IDogdWludDMyX3QgeworICAgIEFQSV9MMF8xID0gMCwgICAvLy88IHN1cHBvcnQgZm9yIEFQSSBsZXZlbCAwLjEKK307CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6YXBpX2xldmVsX3Q+LCBrUGFyYW1JbmRleEFwaUxldmVsPgorICAgICAgICBDMkFwaUxldmVsU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FQSV9MRVZFTFtdID0gImFwaS5sZXZlbCI7CisKK2VudW0gQzJDb25maWc6OmFwaV9mZWF0dXJlX3QgOiB1aW50NjRfdCB7CisgICAgQVBJX1JFRkxFQ1RJT04gICAgICAgPSAoMVUgPDwgMCksICAvLy88IGFiaWxpdHkgdG8gbGlzdCBzdXBwb3J0ZWQgcGFyYW1ldGVycworICAgIEFQSV9WQUxVRVMgICAgICAgICAgID0gKDFVIDw8IDEpLCAgLy8vPCBhYmlsaXR5IHRvIGxpc3Qgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZWFjaCBwYXJhbWV0ZXIKKyAgICBBUElfQ1VSUkVOVF9WQUxVRVMgICA9ICgxVSA8PCAyKSwgIC8vLzwgYWJpbGl0eSB0byBsaXN0IGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIHBhcmFtZXRlcgorICAgIEFQSV9ERVBFTkRFTkNZICAgICAgID0gKDFVIDw8IDMpLCAgLy8vPCBoYXZlIGEgZGVmaW5lZCBwYXJhbWV0ZXIgZGVwZW5kZW5jeQorCisgICAgQVBJX1NUUkVBTVMgICAgICAgICAgPSAoMVVMTCA8PCAzMiksICAvLy88IHN1cHBvcnRpbmcgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmVhbXMKKworICAgIEFQSV9UVU5ORUxJTkcgICAgICAgID0gKDFVTEwgPDwgNDgpLCAgLy8vPCB0dW5uZWxpbmcgQVBJCit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmFwaV9mZWF0dXJlX3Q+LCBrUGFyYW1JbmRleEFwaUZlYXR1cmVzPgorICAgICAgICBDMkFwaUZlYXR1cmVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FQSV9GRUFUVVJFU1tdID0gImFwaS5mZWF0dXJlcyI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdlbmVyaWMgY29tcG9uZW50IGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQuCisgKgorICogVGhpcyBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvciBkb3QgJy4nLCBoeXBoZW4gJy0nLCBwbHVzICcrJywgb3IKKyAqIHVuZGVybGluZSAnXycuIFRoZSBuYW1lIG9mIGVhY2ggY29tcG9uZW50IG11c3QgYmUgdW5pcXVlLgorICoKKyAqIEZvciBBbmRyb2lkOiBDb21wb25lbnQgbmFtZXMgbXVzdCBzdGFydCB3aXRoICdjMi4nIGZvbGxvd2VkIGJ5IHRoZSBjb21wYW55IG5hbWUgb3IgYWJicmV2aWF0aW9uCisgKiBhbmQgYW5vdGhlciBkb3QsIGUuZy4gJ2MyLmFuZHJvaWQuJy4gVXNlIG9mIGxvd2VyY2FzZSBpcyBwcmVmZXJyZWQgYnV0IG5vdCByZXF1aXJlZC4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleE5hbWU+IEMyQ29tcG9uZW50TmFtZVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfTkFNRVtdICA9ICJjb21wb25lbnQubmFtZSI7CisKKy8qKgorICogQWx0ZXJuYXRlIG5hbWVzIChhbGlhc2VzKSBvZiB0aGUgY29tcG9uZW50LgorICoKKyAqIFRoaXMgaXMgYSBjb21tYSAnLCcgc2VwYXJhdGVkIGxpc3Qgb2YgYWx0ZXJuYXRlIGNvbXBvbmVudCBuYW1lcy4gVW5saWtlIGNvbXBvbmVudCBuYW1lcyB0aGF0CisgKiBtdXN0IGJlIHVuaXF1ZSwgbXVsdGlwbGUgY29tcG9uZW50cyBjYW4gaGF2ZSB0aGUgc2FtZSBhbGlhcy4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleEFsaWFzZXM+IEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfQUxJQVNFU1tdICA9ICJjb21wb25lbnQuYWxpYXNlcyI7CisKKy8qKgorICogQ29tcG9uZW50IGtpbmQuCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbXBvbmVudDo6a2luZF90Piwga1BhcmFtSW5kZXhLaW5kPgorICAgICAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0tJTkRbXSAgPSAiY29tcG9uZW50LmtpbmQiOworCisvKioKKyAqIENvbXBvbmVudCBkb21haW4uCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbXBvbmVudDo6ZG9tYWluX3Q+LCBrUGFyYW1JbmRleERvbWFpbj4KKyAgICAgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0RPTUFJTltdICA9ICJjb21wb25lbnQuZG9tYWluIjsKKworLyoqCisgKiBDb21wb25lbnQgYXR0cmlidXRlcy4KKyAqCisgKiBUaGVzZSBhcmUgYSBzZXQgb2YgZmxhZ3MgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBjaGFyYWN0ZXJpemluZyBpdHMgcHJvY2Vzc2luZyBhbGdvcml0aG0uCisgKi8KK0MyRU5VTShDMkNvbXBvbmVudDo6YXR0cmliX3QsIHVpbnQ2NF90LAorICAgIEFUVFJJQl9JU19URU1QT1JBTCA9IDF1IDw8IDAsIC8vLzwgY29tcG9uZW50IGlucHV0IG9yZGVyaW5nIG1hdHRlcnMgZm9yIHByb2Nlc3NpbmcKKykKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50OjphdHRyaWJfdD4sIGtQYXJhbUluZGV4QXR0cmlidXRlcz4KKyAgICAgICAgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTW10gPSAiY29tcG9uZW50LmF0dHJpYnV0ZXMiOworCisvKioKKyAqIFRpbWUgc3RyZXRjaGluZy4KKyAqCisgKiBUaGlzIGlzIHRoZSByYXRpbyBiZXR3ZWVuIHRoZSByYXRlIG9mIHRoZSBpbnB1dCB0aW1lc3RhbXAsIGFuZCB0aGUgcmF0ZSBvZiB0aGUgb3V0cHV0IHRpbWVzdGFtcC4KKyAqIEUuZy4gaWYgdGhpcyBpcyA0LjAsIGZvciBldmVyeSAxIHNlY29uZHMgb2YgaW5wdXQgdGltZXN0YW1wIGRpZmZlcmVuY2UsIHRoZSBvdXRwdXQgc2hhbGwgZGlmZmVyCisgKiBieSA0IHNlY29uZHMuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleFRpbWVTdHJldGNoPiBDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVElNRV9TVFJFVENIW10gID0gImFsZ28udGltZS1zdHJldGNoIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29kaW5nIGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFByb2ZpbGUgYW5kIGxldmVsLgorICoKKyAqIFByb2ZpbGUgZGV0ZXJtaW5lcyB0aGUgdG9vbHMgdXNlZCBieSB0aGUgY29tcG9uZW50LgorICogTGV2ZWwgZGV0ZXJtaW5lcyB0aGUgbGV2ZWwgb2YgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqLworCituYW1lc3BhY2UgeworCitlbnVtIDogdWludDMyX3QgeworICAgIF9DMl9QTF9NUDJWX0JBU0UgPSAweDEwMDAsCisgICAgX0MyX1BMX0FBQ19CQVNFICA9IDB4MjAwMCwKKyAgICBfQzJfUExfSDI2M19CQVNFID0gMHgzMDAwLAorICAgIF9DMl9QTF9NUDRWX0JBU0UgPSAweDQwMDAsCisgICAgX0MyX1BMX0FWQ19CQVNFICA9IDB4NTAwMCwKKyAgICBfQzJfUExfSEVWQ19CQVNFID0gMHg2MDAwLAorICAgIF9DMl9QTF9WUDlfQkFTRSAgPSAweDcwMDAsCisgICAgX0MyX1BMX0RWX0JBU0UgICA9IDB4ODAwMCwKKyAgICBfQzJfUExfQVYxX0JBU0UgID0gMHg5MDAwLAorCisgICAgQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgPSAweDcwMDAwMDAwLAorfTsKKworfQorCitlbnVtIEMyQ29uZmlnOjpwcm9maWxlX3QgOiB1aW50MzJfdCB7CisgICAgUFJPRklMRV9VTlVTRUQgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHByb2ZpbGUgaXMgbm90IHVzZWQgYnkgdGhpcyBtZWRpYSB0eXBlCisKKyAgICAvLyBBQUMgKE1QRUctMiBQYXJ0IDcgYW5kIE1QRUctNCBQYXJ0IDMpIHByb2ZpbGVzCisgICAgUFJPRklMRV9BQUNfTEMgPSBfQzJfUExfQUFDX0JBU0UsICAgICAgICAgICAvLy88IEFBQyBMb3ctQ29tcGxleGl0eQorICAgIFBST0ZJTEVfQUFDX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTWFpbgorICAgIFBST0ZJTEVfQUFDX1NTUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgU2NhbGFibGUgU2FtcGxpbmcgUmF0ZQorICAgIFBST0ZJTEVfQUFDX0xUUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTG9uZyBUZXJtIFByZWRpY3Rpb24KKyAgICBQUk9GSUxFX0FBQ19IRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEhpZ2gtRWZmaWNpZW5jeQorICAgIFBST0ZJTEVfQUFDX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgU2NhbGFibGUKKyAgICBQUk9GSUxFX0FBQ19FUl9MQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEVycm9yIFJlc2lsaWVudCBMb3ctQ29tcGxleGl0eQorICAgIFBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRXJyb3IgUmVzaWxpZW50IFNjYWxhYmxlCisgICAgUFJPRklMRV9BQUNfTEQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBMb3cgRGVsYXkKKyAgICBQUk9GSUxFX0FBQ19IRV9QUywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEhpZ2gtRWZmaWNpZW5jeSBQYXJhbWV0cmljIFN0ZXJlbworICAgIFBST0ZJTEVfQUFDX0VMRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRW5oYW5jZWQgTG93IERlbGF5CisgICAgUFJPRklMRV9BQUNfWEhFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBFeHRlbmRlZCBIaWdoLUVmZmljaWVuY3kKKworICAgIC8vIE1QRUctMiBWaWRlbyBwcm9maWxlcworICAgIFBST0ZJTEVfTVAyVl9TSU1QTEUgPSBfQzJfUExfTVAyVl9CQVNFLCAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTaW1wbGUKKyAgICBQUk9GSUxFX01QMlZfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTWFpbgorICAgIFBST0ZJTEVfTVAyVl9TTlJfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTTlIgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFLCAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgU3BhdGlhbGx5IFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2gKKyAgICBQUk9GSUxFX01QMlZfNDIyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgNDoyOjIKKyAgICBQUk9GSUxFX01QMlZfTVVMVElWSUVXLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTXVsdGktdmlldworCisgICAgLy8gSC4yNjMgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0gyNjNfQkFTRUxJTkUgPSBfQzJfUExfSDI2M19CQVNFLCAgIC8vLzwgSC4yNjMgQmFzZWxpbmUgKFByb2ZpbGUgMCkKKyAgICBQUk9GSUxFX0gyNjNfSDMyMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgVmVyc2lvbiAyIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgKFByb2ZpbGUgMSkKKyAgICBQUk9GSUxFX0gyNjNfVjFCQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAxIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgKFByb2ZpbGUgMikKKyAgICBQUk9GSUxFX0gyNjNfSVNXVjIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAyIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgKFByb2ZpbGUgMykKKyAgICBQUk9GSUxFX0gyNjNfSVNXVjMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAzIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgKFByb2ZpbGUgNCkKKyAgICBQUk9GSUxFX0gyNjNfSElHSF9DT01QUkVTU0lPTiwgICAgICAgICAgICAgIC8vLzwgSC4yNjMgQ29udmVyc2F0aW9uYWwgSGlnaCBDb21wcmVzc2lvbiAoUHJvZmlsZSA1KQorICAgIFBST0ZJTEVfSDI2M19JTlRFUk5FVCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBJbnRlcm5ldCAoUHJvZmlsZSA2KQorICAgIFBST0ZJTEVfSDI2M19JTlRFUkxBQ0UsICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBJbnRlcmxhY2UgKFByb2ZpbGUgNykKKyAgICBQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZLCAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgSGlnaCBMYXRlbmN5IChQcm9maWxlIDgpCisKKyAgICAvLyBNUEVHLTQgUGFydCAyIChWaWRlbykgTmF0dXJhbCBWaXN1YWwgUHJvZmlsZXMKKyAgICBQUk9GSUxFX01QNFZfU0lNUExFLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUsICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDRWX0NPUkUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlCisgICAgUFJPRklMRV9NUDRWX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBNYWluCisgICAgUFJPRklMRV9NUDRWX05CSVQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBOLUJpdAorICAgIFBST0ZJTEVfTVA0Vl9BUlRTLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgUmVhbHRpbWUgU2ltcGxlCisgICAgUFJPRklMRV9NUDRWX0NPUkVfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDRWX0FDRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBBZHZhbmNlZCBDb2RpbmcgRWZmaWNpZW5jeQorICAgIFBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9DT1JFLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgQ29yZQorICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEVfU1RVRElPLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlIFN0dWRpbworICAgIFBST0ZJTEVfTVA0Vl9DT1JFX1NUVURJTywgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQ29yZSBTdHVkaW8KKyAgICBQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFLCAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIEFkdmFuY2VkIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9GR1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gRmluZSBHcmFudWxhcml0eSBTY2FsYWJsZQorCisgICAgLy8gQVZDIC8gTVBFRy00IFBhcnQgMTAgKEguMjY0KSBwcm9maWxlcworICAgIFBST0ZJTEVfQVZDX0JBU0VMSU5FID0gX0MyX1BMX0FWQ19CQVNFLCAgICAgLy8vPCBBVkMgKEguMjY0KSBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDb25zdHJhaW5lZCBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNYWluCisgICAgUFJPRklMRV9BVkNfRVhURU5ERUQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEV4dGVuZGVkCisgICAgUFJPRklMRV9BVkNfSElHSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdILCAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgUHJvZ3Jlc3NpdmUgSGlnaAorICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDb25zdHJhaW5lZCBIaWdoCisgICAgUFJPRklMRV9BVkNfSElHSF8xMCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggMTAKKyAgICBQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwLCAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgUHJvZ3Jlc3NpdmUgSGlnaCAxMAorICAgIFBST0ZJTEVfQVZDX0hJR0hfNDIyLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDQ6MjoyCisgICAgUFJPRklMRV9BVkNfSElHSF80NDRfUFJFRElDVElWRSwgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDo0OjQgUHJlZGljdGl2ZQorICAgIFBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEsICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDEwIEludHJhCisgICAgUFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEsICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDoyOjIgSW50cmEKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX0NBVkxDXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDQVZMQyA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0JBU0VMSU5FID0gX0MyX1BMX0FWQ19CQVNFICsgMHgxMDAsICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfQkFTRUxJTkUsICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIENvbnN0cmFpbmVkIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSCwgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9ISUdILCAgICAgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgQ29uc3RyYWluZWQgSGlnaAorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0hfSU5UUkEsICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBTY2FsYWJsZSBIaWdoIEludHJhCisgICAgUFJPRklMRV9BVkNfTVVMVElWSUVXX0hJR0ggPSBfQzJfUExfQVZDX0JBU0UgKyAweDIwMCwgIC8vLzwgQVZDIChILjI2NCkgTXVsdGl2aWV3IEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TVEVSRU9fSElHSCwgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgU3RlcmVvIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NRkNfSElHSCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTUZDIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NVUxUSVZJRVdfREVQVEhfSElHSCA9IF9DMl9QTF9BVkNfQkFTRSArIDB4MzAwLCAgLy8vPCBBVkMgKEguMjY0KSBNdWx0aXZpZXcgRGVwdGggSGlnaAorICAgIFBST0ZJTEVfQVZDX01GQ19ERVBUSF9ISUdILCAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNRkMgRGVwdGggSGlnaAorICAgIFBST0ZJTEVfQVZDX0VOSEFOQ0VEX01VTFRJVklFV19ERVBUSF9ISUdIID0gX0MyX1BMX0FWQ19CQVNFICsgMHg0MDAsICAvLy88IEFWQyAoSC4yNjQpIEVuaGFuY2VkIE11bHRpdmlldyBEZXB0aCBIaWdoCisKKyAgICAvLyBIRVZDIHByb2ZpbGVzCisgICAgUFJPRklMRV9IRVZDX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFLCAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluCisgICAgUFJPRklMRV9IRVZDX01BSU5fMTAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX01BSU5fU1RJTEwsICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFN0aWxsIFBpY3R1cmUKKyAgICBQUk9GSUxFX0hFVkNfTU9OTyA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDEwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUKKyAgICBQUk9GSUxFX0hFVkNfTU9OT18xMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUgMTIKKyAgICBQUk9GSUxFX0hFVkNfTU9OT18xNiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUgMTYKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTIsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDQsICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTIsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSwgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMl9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTBfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTJfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfSU5UUkEsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTBfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTJfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTZfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTYgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfU1RJTEwsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgU3RpbGwgUGljdHVyZQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9TVElMTCwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxNiBTdGlsbCBQaWN0dXJlCisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0ID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4MjAwLCAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0XzEwLCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRocm91Z2hwdXQgNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfSElHSF80NDRfMTQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNAorICAgIFBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDE2IEludHJhCisgICAgUFJPRklMRV9IRVZDX1NYX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHgzMDAsICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbgorICAgIFBST0ZJTEVfSEVWQ19TWF9NQUlOXzEwLCAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIE1haW4gMTAKKyAgICBQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0XzEwLCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbiA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xMCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xNCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNAorICAgIFBST0ZJTEVfSEVWQ19NVUxUSVZJRVdfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDQwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIE11bHRpdmlldyBNYWluCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg1MDAsICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fMTAsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk8gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg2MDAsICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTIsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lIDEyCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTYsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lIDE2CisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fNDQ0LCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDXzNEX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg3MDAsICAvLy88IEhFVkMgKEguMjY1KSAzRCBNYWluCisKKyAgICAvLyBWUDkgcHJvZmlsZXMKKyAgICBQUk9GSUxFX1ZQOV8wID0gX0MyX1BMX1ZQOV9CQVNFLCAgICAgICAgICAgIC8vLzwgVlA5IFByb2ZpbGUgMCAoNDoyOjApCisgICAgUFJPRklMRV9WUDlfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBQcm9maWxlIDEgKDQ6MjoyIG9yIDQ6NDo0KQorICAgIFBST0ZJTEVfVlA5XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAyICg0OjI6MCwgMTAgb3IgMTIgYml0KQorICAgIFBST0ZJTEVfVlA5XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAzICg0OjI6MiBvciA0OjQ6NCwgMTAgb3IgMTIgYml0KQorCisgICAgLy8gRG9sYnkgVmlzaW9uIHByb2ZpbGVzCisgICAgUFJPRklMRV9EVl9BVl9QRVIgPSBfQzJfUExfRFZfQkFTRSArIDAsICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmF2LnBlciBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfQVZfUEVOLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi5wZW4gcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0hFX0RFUiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZGVyIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV9ERU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLmRlbiBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfSEVfMDQgPSBfQzJfUExfRFZfQkFTRSArIDQsICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS4wNCBwcm9maWxlCisgICAgUFJPRklMRV9EVl9IRV8wNSA9IF9DMl9QTF9EVl9CQVNFICsgNSwgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA1IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFX0RUSCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZHRoIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV8wNyA9IF9DMl9QTF9EVl9CQVNFICsgNywgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA3IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFXzA4ID0gX0MyX1BMX0RWX0JBU0UgKyA4LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuMDggcHJvZmlsZQorICAgIFBST0ZJTEVfRFZfQVZfMDkgPSBfQzJfUExfRFZfQkFTRSArIDksICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi4wOSBwcm9maWxlCisKKyAgICAvLyBBVjEgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0FWMV8wID0gX0MyX1BMX0FWMV9CQVNFLCAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMCAoNDoyOjAsIDggdG8gMTAgYml0KQorICAgIFBST0ZJTEVfQVYxXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgUHJvZmlsZSAxICg4IHRvIDEwIGJpdCkKKyAgICBQUk9GSUxFX0FWMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMiAoOCB0byAxMiBiaXQpCit9OworCitlbnVtIEMyQ29uZmlnOjpsZXZlbF90IDogdWludDMyX3QgeworICAgIExFVkVMX1VOVVNFRCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsZXZlbCBpcyBub3QgdXNlZCBieSB0aGlzIG1lZGlhIHR5cGUKKworICAgIC8vIE1QRUctMiBWaWRlbyBsZXZlbHMKKyAgICBMRVZFTF9NUDJWX0xPVyA9IF9DMl9QTF9NUDJWX0JBU0UsICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTG93IExldmVsCisgICAgTEVWRUxfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIE1haW4gTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0hfMTQ0MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaCAxNDQwIExldmVsCisgICAgTEVWRUxfTVAyVl9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2ggTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0hQLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaFAgTGV2ZWwKKworICAgIC8vIEguMjYzIGxldmVscworICAgIExFVkVMX0gyNjNfMTAgPSBfQzJfUExfSDI2M19CQVNFLCAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAxMAorICAgIExFVkVMX0gyNjNfMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAyMAorICAgIExFVkVMX0gyNjNfMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAzMAorICAgIExFVkVMX0gyNjNfNDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA0MAorICAgIExFVkVMX0gyNjNfNDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA0NQorICAgIExFVkVMX0gyNjNfNTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA1MAorICAgIExFVkVMX0gyNjNfNjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA2MAorICAgIExFVkVMX0gyNjNfNzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA3MAorCisgICAgLy8gTVBFRy00IFBhcnQgMiAoVmlkZW8pIGxldmVscworICAgIExFVkVMX01QNFZfMCA9IF9DMl9QTF9NUDRWX0JBU0UsICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMAorICAgIExFVkVMX01QNFZfMEIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMGIKKyAgICBMRVZFTF9NUDRWXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDEKKyAgICBMRVZFTF9NUDRWXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDIKKyAgICBMRVZFTF9NUDRWXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDMKKyAgICBMRVZFTF9NUDRWXzNCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDNiCisgICAgTEVWRUxfTVA0Vl80LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA0CisgICAgTEVWRUxfTVA0Vl80QSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA0YQorICAgIExFVkVMX01QNFZfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNQorICAgIExFVkVMX01QNFZfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNgorCisgICAgLy8gQVZDIC8gTVBFRy00IFBhcnQgMTAgKEguMjY0KSBsZXZlbHMKKyAgICBMRVZFTF9BVkNfMSA9IF9DMl9QTF9BVkNfQkFTRSwgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMQorICAgIExFVkVMX0FWQ18xQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxYgorICAgIExFVkVMX0FWQ18xXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxLjEKKyAgICBMRVZFTF9BVkNfMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMS4yCisgICAgTEVWRUxfQVZDXzFfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDEuMworICAgIExFVkVMX0FWQ18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyCisgICAgTEVWRUxfQVZDXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDIuMQorICAgIExFVkVMX0FWQ18yXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyLjIKKyAgICBMRVZFTF9BVkNfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMworICAgIExFVkVMX0FWQ18zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAzLjEKKyAgICBMRVZFTF9BVkNfM18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMy4yCisgICAgTEVWRUxfQVZDXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQKKyAgICBMRVZFTF9BVkNfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNC4xCisgICAgTEVWRUxfQVZDXzRfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQuMgorICAgIExFVkVMX0FWQ181LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1CisgICAgTEVWRUxfQVZDXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDUuMQorICAgIExFVkVMX0FWQ181XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1LjIKKyAgICBMRVZFTF9BVkNfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNgorICAgIExFVkVMX0FWQ182XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA2LjEKKyAgICBMRVZFTF9BVkNfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNi4yCisKKyAgICAvLyBIRVZDIChILjI2NSkgdGllcnMgYW5kIGxldmVscworICAgIExFVkVMX0hFVkNfTUFJTl8xID0gX0MyX1BMX0hFVkNfQkFTRSwgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDEKKyAgICBMRVZFTF9IRVZDX01BSU5fMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAyCisgICAgTEVWRUxfSEVWQ19NQUlOXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMi4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMworICAgIExFVkVMX0hFVkNfTUFJTl8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDMuMQorICAgIExFVkVMX0hFVkNfTUFJTl80LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDQKKyAgICBMRVZFTF9IRVZDX01BSU5fNF8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA0LjEKKyAgICBMRVZFTF9IRVZDX01BSU5fNSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1CisgICAgTEVWRUxfSEVWQ19NQUlOXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNS4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNS4yCisgICAgTEVWRUxfSEVWQ19NQUlOXzYsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNgorICAgIExFVkVMX0hFVkNfTUFJTl82XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDYuMQorICAgIExFVkVMX0hFVkNfTUFJTl82XzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDYuMgorCisgICAgTEVWRUxfSEVWQ19ISUdIXzQgPSBfQzJfUExfSEVWQ19CQVNFICsgMHgxMDAsICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNAorICAgIExFVkVMX0hFVkNfSElHSF80XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDQuMQorICAgIExFVkVMX0hFVkNfSElHSF81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUKKyAgICBMRVZFTF9IRVZDX0hJR0hfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA1LjEKKyAgICBMRVZFTF9IRVZDX0hJR0hfNV8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA1LjIKKyAgICBMRVZFTF9IRVZDX0hJR0hfNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2CisgICAgTEVWRUxfSEVWQ19ISUdIXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNi4xCisgICAgTEVWRUxfSEVWQ19ISUdIXzZfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNi4yCisKKyAgICAvLyBWUDkgbGV2ZWxzCisgICAgTEVWRUxfVlA5XzEgPSBfQzJfUExfVlA5X0JBU0UsICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAxCisgICAgTEVWRUxfVlA5XzFfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAxLjEKKyAgICBMRVZFTF9WUDlfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDIKKyAgICBMRVZFTF9WUDlfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDIuMQorICAgIExFVkVMX1ZQOV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMworICAgIExFVkVMX1ZQOV8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMy4xCisgICAgTEVWRUxfVlA5XzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA0CisgICAgTEVWRUxfVlA5XzRfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA0LjEKKyAgICBMRVZFTF9WUDlfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDUKKyAgICBMRVZFTF9WUDlfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDUuMQorICAgIExFVkVMX1ZQOV81XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNS4yCisgICAgTEVWRUxfVlA5XzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA2CisgICAgTEVWRUxfVlA5XzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA2LjEKKyAgICBMRVZFTF9WUDlfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYuMgorCisgICAgLy8gRG9sYnkgVmlzaW9uIGxldmVscworICAgIExFVkVMX0RWX01BSU5fSERfMjQgPSBfQzJfUExfRFZfQkFTRSwgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX0hEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBoZDMwCisgICAgTEVWRUxfRFZfTUFJTl9GSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgZmhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX0ZIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBmaGQzMAorICAgIExFVkVMX0RWX01BSU5fRkhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGZoZDYwCisgICAgTEVWRUxfRFZfTUFJTl9VSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQzMAorICAgIExFVkVMX0RWX01BSU5fVUhEXzQ4LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDQ4CisgICAgTEVWRUxfRFZfTUFJTl9VSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkNjAKKworICAgIExFVkVMX0RWX0hJR0hfSERfMjQgPSBfQzJfUExfRFZfQkFTRSArIDB4MTAwLCAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX0hEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBoZDMwCisgICAgTEVWRUxfRFZfSElHSF9GSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgZmhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX0ZIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBmaGQzMAorICAgIExFVkVMX0RWX0hJR0hfRkhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGZoZDYwCisgICAgTEVWRUxfRFZfSElHSF9VSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQzMAorICAgIExFVkVMX0RWX0hJR0hfVUhEXzQ4LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDQ4CisgICAgTEVWRUxfRFZfSElHSF9VSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkNjAKKworICAgIC8vIEFWMSBsZXZlbHMKKyAgICBMRVZFTF9BVjFfMiAgICA9IF9DMl9QTF9BVjFfQkFTRSAsICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIKKyAgICBMRVZFTF9BVjFfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIuMQorICAgIExFVkVMX0FWMV8yXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMi4yCisgICAgTEVWRUxfQVYxXzJfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAyLjMKKyAgICBMRVZFTF9BVjFfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMKKyAgICBMRVZFTF9BVjFfM18xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMuMQorICAgIExFVkVMX0FWMV8zXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMy4yCisgICAgTEVWRUxfQVYxXzNfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAzLjMKKyAgICBMRVZFTF9BVjFfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQKKyAgICBMRVZFTF9BVjFfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQuMQorICAgIExFVkVMX0FWMV80XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNC4yCisgICAgTEVWRUxfQVYxXzRfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA0LjMKKyAgICBMRVZFTF9BVjFfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUKKyAgICBMRVZFTF9BVjFfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUuMQorICAgIExFVkVMX0FWMV81XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNS4yCisgICAgTEVWRUxfQVYxXzVfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA1LjMKKyAgICBMRVZFTF9BVjFfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYKKyAgICBMRVZFTF9BVjFfNl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYuMQorICAgIExFVkVMX0FWMV82XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNi4yCisgICAgTEVWRUxfQVYxXzZfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA2LjMKKyAgICBMRVZFTF9BVjFfNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcKKyAgICBMRVZFTF9BVjFfN18xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcuMQorICAgIExFVkVMX0FWMV83XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNy4yCisgICAgTEVWRUxfQVYxXzdfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA3LjMKK307CisKK3N0cnVjdCBDMlByb2ZpbGVMZXZlbFN0cnVjdCB7CisgICAgQzJDb25maWc6OnByb2ZpbGVfdCBwcm9maWxlOyAgLy8vPCBjb2RpbmcgcHJvZmlsZQorICAgIEMyQ29uZmlnOjpsZXZlbF90ICAgbGV2ZWw7ICAgIC8vLzwgY29kaW5nIGxldmVsCisKKyAgICBDMlByb2ZpbGVMZXZlbFN0cnVjdCgKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgcHJvZmlsZV8gPSBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQsCisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbF8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKQorICAgICAgICA6IHByb2ZpbGUocHJvZmlsZV8pLCBsZXZlbChsZXZlbF8pIHsgfQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChQcm9maWxlTGV2ZWwpCisgICAgQzJGSUVMRChwcm9maWxlLCAicHJvZmlsZSIpCisgICAgQzJGSUVMRChsZXZlbCwgICAibGV2ZWwiKQorfTsKKworLy8gVE9ETzogbWF5IG5lZWQgdG8gbWFrZSB0aGlzIGV4cGxpY2l0IChoYXZlIC5zZXQgbWVtYmVyKQordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQcm9maWxlTGV2ZWxTdHJ1Y3QsIGtQYXJhbUluZGV4UHJvZmlsZUxldmVsPgorICAgICAgICBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMW10gPSAiY29kZWQucGwiOworCisvKioKKyAqIENvZGVjLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGRhdGEuCisgKgorICogVGhpcyBpcyBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgY29kZWMuCisgKgorICogRm9yIEFWQy9IRVZDLCB0aGVzZSBhcmUgdGhlIGNvbmNhdGVuYXRlZCBTUFMvUFBTL1ZQUyBOQUxzLgorICoKKyAqIFRPRE86IGRlZmluZSBmb3Igb3RoZXIgY29kZWNzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkJsb2JWYWx1ZSwga1BhcmFtSW5kZXhJbml0RGF0YT4gQzJTdHJlYW1Jbml0RGF0YUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTklUX0RBVEFbXSA9ICJjb2RlZC5pbml0LWRhdGEiOworCisvKioKKyAqIFN1cHBsZW1lbnRhbCBEYXRhLgorICoKKyAqIFRoaXMgaXMgY29kaW5nLXNwZWNpZmljIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbmFsIGRhdGEsIGUuZy4gU0VJIGZvciBBVkMvSEVWQy4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIG5vdCBhIGNvbmZpZ3VyYXRpb24gc28gaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmFtZXRlciBrZXkuCisgKiBUaGlzIHN0cnVjdHVyZSBzaGFsbCBiZSByZXR1cm5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiB1cGRhdGUsIGFuZCBjYW4gYmUgcmVwZWF0ZWQgYXMgbmVlZGVkCisgKiBpbiB0aGUgc2FtZSB1cGRhdGUuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdCwgdWludDMyX3QsCisgICAgSU5GT19OT05FID0gMCwKKworICAgIElORk9fUFJFRklYX1NFSV9VTklUID0gMHgxMDAwMCwgLy8vPCBwcmVmaXggU0VJIHBheWxvYWQgdHlwZXMgYWRkIHRoaXMgZmxhZworICAgIElORk9fU1VGRklYX1NFSV9VTklUID0gMHgyMDAwMCwgLy8vPCBzdWZmaXggU0VJIHBheWxvYWQgdHlwZXMgYWRkIHRoaXMgZmxhZworCisgICAgSU5GT19TRUlfVVNFUl9EQVRBID0gSU5GT19QUkVGSVhfU0VJX1VOSVQgfCA0LCAgICAvLy88IGNsb3NlZC1jYXB0aW9uaW5nIGRhdGEgKElUVS1UIFQzNSkKKyAgICBJTkZPX1NFSV9NRENWICAgICAgPSBJTkZPX1BSRUZJWF9TRUlfVU5JVCB8IDEzNywgIC8vLzwgbWFzdGVyaW5nIGRpc3BsYXkgY29sb3Igdm9sdW1lCisgICAgSU5GT19TRVRfVVNFUl9EQVRBX1NGWCA9IElORk9fU1VGRklYX1NFSV9VTklUIHwgNCwgLy8vPCBjbG9zZWQtY2FwdGlvbmluZyBkYXRhIChJVFUtVCBUMzUpCisKKyAgICBJTkZPX1ZFTkRPUl9TVEFSVCA9IDB4NzAwMDAwMDAKKykKKworc3RydWN0IEMyU3VwcGxlbWVudGFsRGF0YVN0cnVjdCB7CisgICAgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0KCkKKyAgICAgICAgOiB0eXBlXyhJTkZPX05PTkUpIHsgfQorCisgICAgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0KAorICAgICAgICAgICAgc2l6ZV90IGZsZXhDb3VudCwgQzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3QgdHlwZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV8pCisgICAgICAgIDogdHlwZV8odHlwZSkgeworICAgICAgICAgICAgbWVtY3B5KGRhdGEsICZkYXRhX1swXSwgYzJfbWluKGRhdGFfLnNpemUoKSwgZmxleENvdW50KSk7CisgICAgfQorCisgICAgQzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3QgdHlwZV87CisgICAgdWludDhfdCBkYXRhW107CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoU3VwcGxlbWVudGFsRGF0YSwgZGF0YSkKKyAgICBDMkZJRUxEKHR5cGVfLCAidHlwZSIpCisgICAgQzJGSUVMRChkYXRhLCAiZGF0YSIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0LCBrUGFyYW1JbmRleFN1cHBsZW1lbnRhbERhdGE+CisgICAgICAgIEMyU3RyZWFtU3VwcGxlbWVudGFsRGF0YUluZm87CisKKy8qKgorICogU3VwcGxlbWVudGFsIERhdGEgU3Vic2NyaXB0aW9uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YT4KKyAgICAgICAgQzJTdHJlYW1TdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfU1VQUExFTUVOVEFMX0RBVEFbXSA9ICJvdXRwdXQuc3Vic2NyaWJlZC1zdXBwbGVtZW50YWwiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBpcGVsaW5lIGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogTWVkaWEtdHlwZS4KKyAqCisgKiBUaGlzIGlzIGRlZmluZWQgZm9yIGJvdGggcG9ydCBhbmQgc3RyZWFtLCBidXQgc3RyZWFtIG1lZGlhIHR5cGUgbWF5IGJlIGEgc3VidHlwZSBvZiB0aGUKKyAqIHBvcnQgbWVkaWEgdHlwZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWVkaWFUeXBlPiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRVtdID0gImlucHV0Lm1lZGlhLXR5cGUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEVbXSA9ICJvdXRwdXQubWVkaWEtdHlwZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWVkaWFUeXBlPiBDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc7CisKKy8qKgorICogUGlwZWxpbmUgZGVsYXlzLgorICoKKyAqIElucHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBpbnB1dCBmcmFtZXMgcmVxdWVzdGVkIGJ5IHRoZSBjb21wb25lbnQgdG8gcHJvY2VzcworICogYW4gaW5wdXQgZnJhbWUuCisgKgorICogT3V0cHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJhbWVzIHRoYXQgbmVlZCB0byBiZSBnZW5lcmF0ZWQgYmVmb3JlIGFuCisgKiBvdXRwdXQgY2FuIGJlIHJlbGVhc2VkIGJ5IHRoZSBjb21wb25lbnQuCisgKgorICogUGlwZWxpbmUgZGVsYXkgaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGZyYW1lcyB0aGF0IGFyZSBwcm9jZXNzZWQgYXQgb25lIHRpbWUgYnkgdGhlCisgKiBjb21wb25lbnQuCisgKgorICogQXMgdGhlc2UgbWF5IHZhcnkgZnJvbSBmcmFtZSB0byBmcmFtZSwgdGhlIG51bWJlciBpcyB0aGUgbWF4aW11bSByZXF1aXJlZCB2YWx1ZS4gRS5nLiBpZgorICogaW5wdXQgZGVsYXkgaXMgMCwgdGhlIGNvbXBvbmVudCBpcyBleHBlY3RlZCB0byBjb25zdW1lIGVhY2ggZnJhbWUgcXVldWVkIGV2ZW4gaWYgbm8gZnVydGhlcgorICogZnJhbWVzIGFyZSBxdWV1ZWQuIFNpbWlsYXJseSwgaWYgaW5wdXQgZGVsYXkgaXMgMSwgYXMgbG9uZyBhcyB0aGVyZSBhcmUgYWx3YXlzIGV4YWN0bHkgMgorICogb3V0c3RhbmRpbmcgaW5wdXQgZnJhbWVzIHF1ZXVlZCB0byB0aGUgY29tcG9uZW50LCBpdCBzaGFsbCBwcm9kdWNlIG91dHB1dC4KKyAqLworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5UmVxdWVzdD4gQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWV9SRVFVRVNUW10gPSAiaW5wdXQuZGVsYXkucmVxdWVzdGVkIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWV9SRVFVRVNUW10gPSAib3V0cHV0LmRlbGF5LnJlcXVlc3RlZCI7CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEZWxheVJlcXVlc3Q+CisgICAgICAgIEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1RbXSA9ICJwaXBlbGluZS1kZWxheS5yZXF1ZXN0ZWQiOworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGVsYXk+IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVlbXSA9ICJpbnB1dC5kZWxheS5hY3R1YWwiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZW10gPSAib3V0cHV0LmRlbGF5LmFjdHVhbCI7CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5PiBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWVtdID0gImFsZ28uZGVsYXkuYWN0dWFsIjsKKworLyoqCisgKiBSZWZlcmVuY2UgY2hhcmFjdGVyaXN0aWNzLgorICoKKyAqIFRoZSBjb21wb25lbnQgbWF5IGhvbGQgb250byBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgZXZlbiBhZnRlciBjb21wbGV0aW5nIHRoZSBjb3JyZXNwb25kaW5nCisgKiB3b3JrIGl0ZW0uCisgKgorICogTWF4IHJlZmVyZW5jZSBhZ2UgaXMgdGhlIGxvbmdlc3QgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZnJhbWUgcHJvY2Vzc2luZyB0aGF0IGEgY29tcG9uZW50IG1heQorICogaG9sZCBvbnRvIGEgYnVmZmVyIGZvci4gTWF4IHJlZmVyZW5jZSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBhIGNvbXBvbmVudCBtYXkKKyAqIGhvbGQgb250byBhdCB0aGUgc2FtZSB0aW1lIGF0IHRoZSB3b3JzdCBjYXNlLiBUaGVzZSBudW1iZXJzIGFzc3VtZSBzaW5nbGUgZnJhbWUgcGVyIGJ1ZmZlcnMuCisgKgorICogVXNlIG1heC11aW50MzIgaWYgdGhlcmUgaXMgbm8gbGltaXQgZm9yIHRoZSBtYXggYWdlIG9yIGNvdW50LgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TWF4UmVmZXJlbmNlQWdlPgorICAgICAgICBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9SRUZFUkVOQ0VfQUdFW10gPSAiaW5wdXQucmVmZXJlbmNlLm1heC1hZ2UiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQUdFW10gPSAib3V0cHV0LnJlZmVyZW5jZS5tYXgtYWdlIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUNvdW50PgorICAgICAgICBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9DT1VOVFtdID0gImlucHV0LnJlZmVyZW5jZS5tYXgtY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlRbXSA9ICJvdXRwdXQucmVmZXJlbmNlLm1heC1jb3VudCI7CisKKy8qKgorICogT3V0cHV0IHJlb3JkZXJpbmcuCisgKgorICogVGhlIHNpemUgb2YgdGhlIHdpbmRvdyB0byB1c2UgZm9yIG91dHB1dCBidWZmZXIgcmVvcmRlcmluZy4gMCBpcyBpbnRlcnByZXRlZCBhcyAxLgorICovCisvLyBvdXRwdXQgb25seQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhSZW9yZGVyQnVmZmVyRGVwdGg+CisgICAgICAgIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9SRU9SREVSX0RFUFRIW10gPSAib3V0cHV0LnJlb3JkZXIuZGVwdGgiOworCitDMkVOVU0oQzJDb25maWc6Om9yZGluYWxfa2V5X3QsIHVpbnQzMl90LAorICAgICAgICBPUkRJTkFMLAorICAgICAgICBUSU1FU1RBTVAsCisgICAgICAgIENVU1RPTSkKKworLy8gcmVhZC1vbmx5LCBvdXRwdXQgb25seQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6Om9yZGluYWxfa2V5X3Q+LCBrUGFyYW1JbmRleFJlb3JkZXJLZXk+CisgICAgICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1JFT1JERVJfS0VZW10gPSAib3V0cHV0LnJlb3JkZXIua2V5IjsKKworLyoqCisgKiBTdHJlYW0gY291bnQuCisgKi8KKy8vIHByaXZhdGUKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U3RyZWFtQ291bnQ+IEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0NPVU5UW10gPSAiaW5wdXQuc3RyZWFtLWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQ09VTlRbXSA9ICJvdXRwdXQuc3RyZWFtLWNvdW50IjsKKworLyoqCisgKiBDb25maWcgdXBkYXRlIHN1YnNjcmlwdGlvbi4KKyAqLworLy8gcHJpdmF0ZQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMkFycmF5LCBrUGFyYW1JbmRleFN1YnNjcmliZWRQYXJhbUluZGljZXM+CisgICAgICAgIEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfUEFSQU1fSU5ESUNFU1tdID0gIm91dHB1dC5zdWJzY3JpYmVkLWluZGljZXMiOworCisvKioKKyAqIFN1Z2dlc3RlZCBidWZmZXIgKEMyRnJhbWUpIGNvdW50LiBUaGlzIGlzIGEgc3VnZ2VzdGlvbiBieSB0aGUgY29tcG9uZW50IGZvciB0aGUgbnVtYmVyIG9mCisgKiBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lcyBhbGxvY2F0ZWQgZm9yIHRoZSBjb21wb25lbnQncyB1c2UgaW4gdGhlIGJ1ZmZlciBwb29scy4KKyAqCisgKiBDb21wb25lbnQgc2hhbGwgc2V0IHRoZSBhY2NlcHRhYmxlIHJhbmdlIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIGZvciBpdC4gRS5nLiBjbGllbnQgc2hhbGwKKyAqIGFsbG9jYXRlIGF0IGxlYXN0IHRoZSBtaW5pbXVtIHJlcXVpcmVkIHZhbHVlLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0QXJyYXksIGtQYXJhbUluZGV4U3VnZ2VzdGVkQnVmZmVyQ291bnQ+CisgICAgICAgIEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VHR0VTVEVEX0JVRkZFUl9DT1VOVFtdID0gImlucHV0LmJ1ZmZlcnMucG9vbC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVUdHRVNURURfQlVGRkVSX0NPVU5UW10gPSAib3V0cHV0LmJ1ZmZlcnMucG9vbC1zaXplIjsKKworLyoqCisgKiBJbnB1dC9vdXRwdXQgYmF0Y2hpbmcuCisgKgorICogRm9yIGlucHV0LCBjb21wb25lbnQgcmVxdWVzdHMgdGhhdCBjbGllbnQgYmF0Y2hlcyB3b3JrIGluIGJhdGNoZXMgb2Ygc3BlY2lmaWVkIHNpemUuIEZvciBvdXRwdXQsCisgKiBjbGllbnQgcmVxdWVzdHMgdGhhdCB0aGUgY29tcG9uZW50IGJhdGNoZXMgd29yayBjb21wbGV0aW9uIGluIGdpdmVuIGJhdGNoIHNpemUuCisgKiBWYWx1ZSAwIG1lYW5zIGRvbid0IGNhcmUuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0QXJyYXksIGtQYXJhbUluZGV4QmF0Y2hTaXplPiBDMlBvcnRCYXRjaFNpemVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9CQVRDSF9TSVpFW10gPSAiaW5wdXQuYnVmZmVycy5iYXRjaC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9CQVRDSF9TSVpFW10gPSAib3V0cHV0LmJ1ZmZlcnMuYmF0Y2gtc2l6ZSI7CisKKy8qKgorICogQ3VycmVudCAmIGxhc3Qgd29yayBvcmRpbmFscy4KKyAqCisgKiBpbnB1dCBwb3J0OiBsYXN0IHdvcmsgcXVldWVkIHRvIGNvbXBvbmVudC4KKyAqIG91dHB1dCBwb3J0OiBsYXN0IHdvcmsgY29tcGxldGVkIGJ5IGNvbXBvbmVudC4KKyAqIGdsb2JhbDogY3VycmVudCB3b3JrLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMldvcmtPcmRpbmFsU3RydWN0LCBrUGFyYW1JbmRleExhc3RXb3JrUXVldWVkPiBDMkxhc3RXb3JrUXVldWVkVHVuaW5nOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMldvcmtPcmRpbmFsU3RydWN0LCBrUGFyYW1JbmRleEN1cnJlbnRXb3JrPiBDMkN1cnJlbnRXb3JrVHVuaW5nOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWVtb3J5IGFsbG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEFsbG9jYXRvcnMgdG8gdXNlLgorICoKKyAqIFRoZXNlIGFyZSByZXF1ZXN0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBJZiBub25lIHNwZWNpZmllZCwgY2xpZW50IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGFsbG9jYXRvciBJRCBiYXNlZCBvbiB0aGUgY29tcG9uZW50IGRvbWFpbiBhbmQKKyAqIGtpbmQuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJBbGxvY2F0b3I6OmlkX3Q+LCBrUGFyYW1JbmRleEFsbG9jYXRvcnM+CisgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9BTExPQ0FUT1JTW10gPSAiaW5wdXQuYnVmZmVycy5hbGxvY2F0b3ItaWRzIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9BTExPQ0FUT1JTW10gPSAib3V0cHV0LmJ1ZmZlcnMuYWxsb2NhdG9yLWlkcyI7CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkFsbG9jYXRvcjo6aWRfdD4sIGtQYXJhbUluZGV4QWxsb2NhdG9ycz4KKyAgICAgICAgQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BSSVZBVEVfQUxMT0NBVE9SU1tdID0gImFsZ28uYnVmZmVycy5hbGxvY2F0b3ItaWRzIjsKKworLyoqCisgKiBBbGxvY2F0b3IgdG8gdXNlIGZvciBvdXRwdXR0aW5nIHRvIHN1cmZhY2UuCisgKgorICogQ29tcG9uZW50cyBjYW4gb3B0aW9uYWxseSByZXF1ZXN0IGFsbG9jYXRvciB0eXBlIGZvciBvdXRwdXR0aW5nIHRvIHN1cmZhY2UuCisgKgorICogSWYgbm9uZSBzcGVjaWZpZWQsIGNsaWVudCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBCdWZmZXJRdWV1ZS1iYWNrZWQgYWxsb2NhdG9yIElEIGZvciBvdXRwdXR0aW5nIHRvCisgKiBzdXJmYWNlLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFN1cmZhY2VBbGxvY2F0b3I+CisgICAgICAgIEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1VSRkFDRV9BTExPQ0FUT1JbXSA9ICJvdXRwdXQuYnVmZmVycy5zdXJmYWNlLWFsbG9jYXRvci1pZCI7CisKKy8qKgorICogQmxvY2sgcG9vbHMgdG8gdXNlLgorICoKKyAqIFRoZXNlIGFyZSBhbGxvY2F0ZWQgYnkgdGhlIGNsaWVudCBmb3IgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgYWxsb2NhdG9yIElEcyBzcGVjaWZpZWQgYnkgdGhlCisgKiBjb21wb25lbnQuIFRoaXMgaXMgbm90IHVzZWQgZm9yIHRoZSBpbnB1dCBwb3J0LgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQmxvY2tQb29sOjpsb2NhbF9pZF90Piwga1BhcmFtSW5kZXhCbG9ja1Bvb2xzPgorICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0JMT0NLX1BPT0xTW10gPSAib3V0cHV0LmJ1ZmZlcnMucG9vbC1pZHMiOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Q+LCBrUGFyYW1JbmRleEJsb2NrUG9vbHM+CisgICAgICAgIEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklWQVRFX0JMT0NLX1BPT0xTW10gPSAiYWxnby5idWZmZXJzLnBvb2wtaWRzIjsKKworLyoqCisgKiBUaGUgbWF4IG51bWJlciBvZiBwcml2YXRlIGFsbG9jYXRpb25zIGF0IGFueSBvbmUgdGltZSBieSB0aGUgY29tcG9uZW50LgorICogKFRoaXMgaXMgYW4gYXJyYXkgd2l0aCBhIGNvcnJlc3BvbmRpbmcgdmFsdWUgZm9yIGVhY2ggcHJpdmF0ZSBhbGxvY2F0b3IpCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJBcnJheSwga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudD4KKyAgICAgICAgQzJNYXhQcml2YXRlQnVmZmVyQ291bnRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9NQVhfUFJJVkFURV9CVUZGRVJfQ09VTlRbXSA9ICJhbGdvLmJ1ZmZlcnMubWF4LWNvdW50IjsKKworLyoqCisgKiBCdWZmZXIgdHlwZQorICoKKyAqIFRoaXMgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBmb3IgdGhlIGNsaWVudCB0byBhbGxvY2F0ZSB0aGUgcHJvcGVyIGJ1ZmZlciB0eXBlIGZvciB0aGUKKyAqIGlucHV0IHBvcnQsIGFuZCBjYW4gYmUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCB0byBjb250cm9sIHRoZSBidWZmZXIgdHlwZSBmb3IgdGhlIG91dHB1dC4KKyAqLworLy8gcHJpdmF0ZQordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQnVmZmVyRGF0YTo6dHlwZV90Pj4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhCdWZmZXJUeXBlPgorICAgICAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFW10gPSAiaW5wdXQuYnVmZmVycy50eXBlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEVbXSA9ICJvdXRwdXQuYnVmZmVycy50eXBlIjsKKworLyoqCisgKiBNZW1vcnkgdXNhZ2UuCisgKgorICogU3VnZ2VzdGVkIGJ5IGNvbXBvbmVudCBmb3IgaW5wdXQgYW5kIG5lZ290aWF0ZWQgYmV0d2VlbiBjbGllbnQgYW5kIGNvbXBvbmVudCBmb3Igb3V0cHV0LgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4VXNhZ2U+IEMyU3RyZWFtVXNhZ2VUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0VbXSA9ICJpbnB1dC5idWZmZXJzLnVzYWdlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fVVNBR0VbXSA9ICJvdXRwdXQuYnVmZmVycy51c2FnZSI7CisKKy8qKgorICogUGljdHVyZSAodmlkZW8gb3IgaW1hZ2UgZnJhbWUpIHNpemUuCisgKi8KK3N0cnVjdCBDMlBpY3R1cmVTaXplU3RydWN0IHsKKyAgICBpbmxpbmUgQzJQaWN0dXJlU2l6ZVN0cnVjdCgpCisgICAgICAgIDogd2lkdGgoMCksIGhlaWdodCgwKSB7IH0KKworICAgIGlubGluZSBDMlBpY3R1cmVTaXplU3RydWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XykKKyAgICAgICAgOiB3aWR0aCh3aWR0aF8pLCBoZWlnaHQoaGVpZ2h0XykgeyB9CisKKyAgICB1aW50MzJfdCB3aWR0aDsgICAgIC8vLzwgdmlkZW8gd2lkdGgKKyAgICB1aW50MzJfdCBoZWlnaHQ7ICAgIC8vLzwgdmlkZW8gaGVpZ2h0CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFBpY3R1cmVTaXplKQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorfTsKKworLyoqCisgKiBPdXQgb2YgbWVtb3J5IHNpZ25hbGluZworICoKKyAqIFRoaXMgaXMgYSBjb25maWd1cmF0aW9uIGZvciB0aGUgY2xpZW50IHRvIG1hcmsgdGhhdCBpdCBjYW5ub3QgYWxsb2NhdGUgbmVjZXNzYXJ5IHByaXZhdGUgYW5kLworICogb3Igb3V0cHV0IGJ1ZmZlcnMgdG8gY29udGludWUgb3BlcmF0aW9uLCBhbmQgdG8gc2lnbmFsIHRoZSBmYWlsaW5nIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0cnVjdCBDMk91dE9mTWVtb3J5U3RydWN0IHsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sOyAgIC8vLzwgcG9vbCBJRCB0aGF0IGZhaWxlZCB0aGUgYWxsb2NhdGlvbgorICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgICAgICAgICAgLy8vPCBtZW1vcnkgdXNhZ2UgdXNlZAorICAgIEMyUGljdHVyZVNpemVTdHJ1Y3QgcGxhbmFyOyAgICAgLy8vPCBidWZmZXIgZGltZW5zaW9ucyB0byBiZSBhbGxvY2F0ZWQgaWYgMkQKKyAgICB1aW50MzJfdCBmb3JtYXQ7ICAgICAgICAgICAgICAgIC8vLzwgcGl4ZWwgZm9ybWF0IHRvIGJlIHVzZWQgaWYgMkQKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsgICAgICAgICAgICAgIC8vLzwgYnVmZmVyIGNhcGFjaXR5IHRvIGJlIGFsbG9jYXRlZCBpZiAxRAorICAgIGMyX2Jvb2xfdCBvdXRPZk1lbW9yeTsgICAgICAgICAgIC8vLzwgdHJ1ZSBpZiBjb21wb25lbnQgaXMgb3V0IG9mIG1lbW9yeQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChPdXRPZk1lbW9yeSkKKyAgICBDMkZJRUxEKHBvb2wsICJwb29sIikKKyAgICBDMkZJRUxEKHVzYWdlLCAidXNhZ2UiKQorICAgIEMyRklFTEQocGxhbmFyLCAicGxhbmFyIikKKyAgICBDMkZJRUxEKGZvcm1hdCwgImZvcm1hdCIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKG91dE9mTWVtb3J5LCAib3V0LW9mLW1lbW9yeSIpCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyT3V0T2ZNZW1vcnlTdHJ1Y3QsIGtQYXJhbUluZGV4T3V0T2ZNZW1vcnk+IEMyT3V0T2ZNZW1vcnlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRfT0ZfTUVNT1JZW10gPSAiYWxnby5vb20iOworCisvKioKKyAqIE1heCBidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgaXMgYSBoaW50IHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIGV4cGVjdGVkIG9uIGEgc3RyZWFtIGZvciB0aGUKKyAqIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvbiBpdHMgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLiBUaGlzIGlzIGNvbW11bmljYXRlZCB0byBjbGllbnRzIHNvIHRoZXkKKyAqIGNhbiBwcmVhbGxvY2F0ZSBpbnB1dCBidWZmZXJzLCBvciBjb25maWd1cmUgZG93bnN0cmVhbSBjb21wb25lbnRzIHRoYXQgcmVxdWlyZSBhIG1heGltdW0gc2l6ZSBvbgorICogdGhlaXIgYnVmZmVycy4KKyAqCisgKiBSZWFkLW9ubHkuIFJlcXVpcmVkIHRvIGJlIHByb3ZpZGVkIGJ5IGNvbXBvbmVudHMgb24gYWxsIGNvbXByZXNzZWQgc3RyZWFtcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhCdWZmZXJTaXplPiBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFW10gPSAiaW5wdXQuYnVmZmVycy5tYXgtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX0JVRkZFUl9TSVpFW10gPSAib3V0cHV0LmJ1ZmZlcnMubWF4LXNpemUiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1pc2MuIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBUcmlwcGVkIHN0YXRlLAorICoKKyAqIFRoaXMgc3RhdGUgZXhpc3RzIHRvIGJlIGFibGUgdG8gcHJvdmlkZSByZWFzb25pbmcgZm9yIGEgdHJpcHBlZCBzdGF0ZSBkdXJpbmcgbm9ybWFsCisgKiBpbnRlcmZhY2Ugb3BlcmF0aW9ucywgYXMgd2VsbCBhcyB0byBhbGxvdyBjbGllbnQgdG8gdHJpcCB0aGUgY29tcG9uZW50IG9uIGRlbWFuZC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkJvb2xWYWx1ZSwga1BhcmFtSW5kZXhUcmlwcGVkPgorICAgICAgICBDMlRyaXBwZWRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9UUklQUEVEW10gPSAiYWxnby50cmlwcGVkIjsKKworLyoqCisgKiBDb25maWd1cmF0aW9uIGNvdW50ZXJzLgorICoKKyAqIENvbmZpZ3VyYXRpb25zIGFyZSB0cmFja2VkIHVzaW5nIHRocmVlIGNvdW50ZXJzLiBUaGUgaW5wdXQgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5CisgKiBvbmNlIHdpdGggZWFjaCB3b3JrIGFjY2VwdGVkIGJ5IHRoZSBjb21wb25lbnQuIFRoZSBvdXRwdXQgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5CisgKiBvbmNlIHdpdGggZWFjaCB3b3JrIGNvbXBsZXRlZCBieSB0aGUgY29tcG9uZW50IChpbiB0aGUgb3JkZXIgb2Ygd29yayBjb21wbGV0aW9uKS4gVGhlCisgKiBnbG9iYWwgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5IG9uY2UgZHVyaW5nIHRvIGVhY2ggY29uZmlnKCkgY2FsbC4gVGhlc2UgY291bnRlcnMKKyAqIHNoYWxsIGJlIHJlYWQtb25seS4KKyAqCisgKiBUT0RPOiB0aGVzZSBzaG91bGQgYmUgY291bnRlcnMuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4Q29uZmlnQ291bnRlcj4gQzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRWYWx1ZSwga1BhcmFtSW5kZXhDb25maWdDb3VudGVyPiBDMkNvbmZpZ0NvdW50ZXJUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9DT1VOVEVSW10gPSAiaW5wdXQuYnVmZmVycy5jb3VudGVyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9DT1VOVEVSW10gPSAib3V0cHV0LmJ1ZmZlcnMuY291bnRlciI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT05GSUdfQ09VTlRFUltdID0gImFsZ28uY29uZmlnLmNvdW50ZXIiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNvdXJjZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBSZXNvdXJjZXMgbmVlZGVkIGFuZCByZXNvdXJjZXMgcmVzZXJ2ZWQgZm9yIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBSZXNvdXJjZXMgYXJlIHRyYWNrZWQgYXMgYSB2ZWN0b3Igb2YgcG9zaXRpdmUgbnVtYmVycy4gQXZhaWxhYmxlIHJlc291cmNlcyBhcmUgZGVmaW5lZCBieQorICogdGhlIHZlbmRvci4KKyAqCisgKiBCeSBkZWZhdWx0LCBubyByZXNvdXJjZXMgYXJlIHJlc2VydmVkIGZvciBhIGNvbXBvbmVudC4gSWYgcmVzb3VyY2UgcmVzZXJ2YXRpb24gaXMgc3VjY2Vzc2Z1bCwKKyAqIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgYWJsZSB0byB1c2UgdGhvc2UgcmVzb3VyY2VzIGV4Y2x1c2l2ZWx5LiBJZiBob3dldmVyLCB0aGUgY29tcG9uZW50IGlzCisgKiBub3QgdXNpbmcgYWxsIG9mIHRoZSByZXNlcnZlZCByZXNvdXJjZXMsIHRob3NlIG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlciBjb21wb25lbnRzLgorICoKKyAqIFRPRE86IGRlZmluZSBzb21lIG9mIHRoZSByZXNvdXJjZXMuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRBcnJheSwga1BhcmFtSW5kZXhSZXNvdXJjZXNOZWVkZWQ+IEMyUmVzb3VyY2VzTmVlZGVkVHVuaW5nOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkPgorICAgICAgICBDMlJlc291cmNlc1Jlc2VydmVkVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVTT1VSQ0VTX05FRURFRFtdID0gInJlc291cmNlcy5uZWVkZWQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVTT1VSQ0VTX1JFU0VSVkVEW10gPSAicmVzb3VyY2VzLnJlc2VydmVkIjsKKworLyoqCisgKiBPcGVyYXRpbmcgcmF0ZS4KKyAqCisgKiBPcGVyYXRpbmcgcmF0ZSBpcyB0aGUgZXhwZWN0ZWQgcmF0ZSBvZiB3b3JrIHRocm91Z2ggdGhlIGNvbXBvbmVudC4gTmVnYXRpdmUgdmFsdWVzIGlzCisgKiBpbnZhbGlkLgorICoKKyAqIFRPRE86IHRoaXMgY291bGQgZGlzdGluZ3Vpc2ggc2V0IHZhbHVlCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleE9wZXJhdGluZ1JhdGU+IEMyT3BlcmF0aW5nUmF0ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09QRVJBVElOR19SQVRFW10gPSAiYWxnby5yYXRlIjsKKworLyoqCisgKiBSZWFsdGltZSAvIG9wZXJhdGluZyBwb2ludC4KKyAqCisgKiBQcmlvcml0eSB2YWx1ZSBkZWZpbmVzIHRoZSBvcGVyYXRpbmcgcG9pbnQgZm9yIHRoZSBjb21wb25lbnQuIE9wZXJhdGluZyBwb2ludHMgYXJlIGRlZmluZWQgYnkKKyAqIHRoZSB2ZW5kb3IuIFByaW9yaXR5IHZhbHVlIG9mIDAgbWVhbnMgdGhhdCB0aGUgY2xpZW50IHJlcXVpcmVzIG9wZXJhdGlvbiBhdCB0aGUgZ2l2ZW4gb3BlcmF0aW5nCisgKiByYXRlLiBQcmlvcml0eSB2YWx1ZXMgLTEgYW5kIGJlbG93IGRlZmluZSBvcGVyYXRpbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgcGVyZm9ybWFuY2UuIEluIHRoaXMKKyAqIGNhc2UgY2xpZW50IGV4cGVjdHMgYmVzdCBlZmZvcnQgd2l0aG91dCBleGNlZWRpbmcgdGhlIHNwZWNpZmljIG9wZXJhdGluZyBwb2ludC4gVGhpcyBhbGxvd3MKKyAqIGNsaWVudCB0byBydW4gY29tcG9uZW50cyBkZWVwZXIgaW4gdGhlIGJhY2tncm91bmQgYnkgdXNpbmcgbGFyZ2VyIHByaW9yaXR5IHZhbHVlcy4gSW4gdGhlc2UKKyAqIGNhc2VzIG9wZXJhdGluZyByYXRlIGlzIGEgaGludCBmb3IgdGhlIG1heGltdW0gcmF0ZSB0aGF0IHRoZSBjbGllbnQgYW50aWNpcGF0ZXMuCisgKgorICogT3BlcmF0aW5nIHJhdGUgYW5kIHByaW9yaXR5IGFyZSB1c2VkIGluIHRhbmRlbS4gRS5nLiBpZiB0aGVyZSBhcmUgY29tcG9uZW50cyB0aGF0IHJ1biBhdCBhCisgKiBoaWdoZXIgb3BlcmF0aW5nIHBvaW50IChwcmlvcml0eSkgaXQgd2lsbCBtYWtlIG1vcmUgcmVzb3VyY2VzIGF2YWlsYWJsZSBmb3IgY29tcG9uZW50cyBhdAorICogYSBsb3dlciBvcGVyYXRpbmcgcG9pbnQsIHNvIG9wZXJhdGluZyByYXRlIGNhbiBiZSB1c2VkIHRvIGdhdGUgdGhvc2UgY29tcG9uZW50cy4KKyAqCisgKiBQb3NpdGl2ZSBwcmlvcml0eSB2YWx1ZXMgYXJlIG5vdCBkZWZpbmVkIGF0IHRoZSBtb21lbnQgYW5kIHNoYWxsIGJlIHRyZWF0ZWQgZXF1aXZhbGVudCB0byAwLgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhSZWFsVGltZVByaW9yaXR5PgorICAgICAgICBDMlJlYWxUaW1lUHJpb3JpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklPUklUWVtdID0gImFsZ28ucHJpb3JpdHkiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RlY3RlZCBjb250ZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBTZWN1cmUgbW9kZS4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpzZWN1cmVfbW9kZV90LCB1aW50MzJfdCwKKyAgICBTTV9VTlBST1RFQ1RFRCwgICAgLy8vPCBubyBjb250ZW50IHByb3RlY3Rpb24KKyAgICBTTV9SRUFEX1BST1RFQ1RFRCwgLy8vPCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgc2hhbGwgYmUgcHJvdGVjdGVkIGZyb20gcmVhZGluZworKQorCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNlY3VyZV9tb2RlX3Q+LCBrUGFyYW1JbmRleFNlY3VyZU1vZGU+CisgICAgICAgIEMyU2VjdXJlTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NFQ1VSRV9NT0RFW10gPSAiYWxnby5zZWN1cmUtbW9kZSI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRU5DT0RFUiBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBCaXRyYXRlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Qml0cmF0ZT4gQzJTdHJlYW1CaXRyYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JJVFJBVEVbXSA9ICJjb2RlZC5iaXRyYXRlIjsKKworLyoqCisgKiBCaXRyYXRlIG1vZGUuCisgKgorICogVE9ETzogcmVmaW5lIHRoaXMgd2l0aCBiaXRyYXRlIHJhbmdlcyBhbmQgc3VnZ2VzdGVkIHdpbmRvdworICovCitDMkVOVU0oQzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCB1aW50MzJfdCwKKyAgICBCSVRSQVRFX0NPTlNUX1NLSVBfQUxMT1dFRCA9IDAsICAgICAgLy8vPCBjb25zdGFudCBiaXRyYXRlLCBmcmFtZSBza2lwcGluZyBhbGxvd2VkCisgICAgQklUUkFURV9DT05TVCA9IDEsICAgICAgICAgICAgICAgICAgIC8vLzwgY29uc3RhbnQgYml0cmF0ZSwga2VlcCBhbGwgZnJhbWVzCisgICAgQklUUkFURV9WQVJJQUJMRV9TS0lQX0FMTE9XRUQgPSAyLCAgIC8vLzwgYml0cmF0ZSBjYW4gdmFyeSwgZnJhbWUgc2tpcHBpbmcgYWxsb3dlZAorICAgIEJJVFJBVEVfVkFSSUFCTEUgPSAzLCAgICAgICAgICAgICAgICAvLy88IGJpdHJhdGUgY2FuIHZhcnksIGtlZXAgYWxsIGZyYW1lcworICAgIEJJVFJBVEVfSUdOT1JFID0gNywgICAgICAgICAgICAgICAgICAvLy88IGJpdHJhdGUgY2FuIGJlIGV4Y2VlZGVkIGF0IHdpbGwgdG8gYWNoaWV2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHF1YWxpdHkgb3Igb3RoZXIgc2V0dGluZ3MKKworICAgIC8vIGJpdHJhdGUgbW9kZXMgYXJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3MKKyAgICBCSVRSQVRFX0ZMQUdfS0VFUF9BTExfRlJBTUVTID0gMSwKKyAgICBCSVRSQVRFX0ZMQUdfQ0FOX1ZBUlkgPSAyLAorICAgIEJJVFJBVEVfRkxBR19DQU5fRVhDRUVEID0gNCwKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZT4KKyAgICAgICAgQzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERVtdID0gImFsZ28uYml0cmF0ZS1tb2RlIjsKKworLyoqCisgKiBRdWFsaXR5LgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBieSBlYWNoIGNvbXBvbmVudCwgdGhlIGhpZ2hlciB0aGUgYmV0dGVyIHRoZSBvdXRwdXQgcXVhbGl0eSBhdCB0aGUgZXhwZW5zZSBvZgorICogbGVzcyBjb21wcmVzc2lvbiBlZmZpY2llbmN5LiBUaGlzIHNldHRpbmcgaXMgZGVmaW5lZCBmb3IgdGhlIG91dHB1dCBzdHJlYW1zIGluIGNhc2UgdGhlCisgKiBjb21wb25lbnQgY2FuIHN1cHBvcnQgdmFyeWluZyBxdWFsaXR5IG9uIGVhY2ggc3RyZWFtLCBvciBhcyBhbiBvdXRwdXQgcG9ydCB0dW5pbmcgaW4gY2FzZSB0aGUKKyAqIHF1YWxpdHkgaXMgZ2xvYmFsIHRvIGFsbCBzdHJlYW1zLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UXVhbGl0eT4gQzJTdHJlYW1RdWFsaXR5VHVuaW5nOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhRdWFsaXR5PiBDMlF1YWxpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9RVUFMSVRZW10gPSAiYWxnby5xdWFsaXR5IjsKKworLyoqCisgKiBDb21wbGV4aXR5LgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBieSBlYWNoIGNvbXBvbmVudCwgdGhpcyBoaWdoZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSByZXNvdXJjZXMgdGhlIGNvbXBvbmVudAorICogd2lsbCB1c2UgdG8gcHJvZHVjZSBiZXR0ZXIgcXVhbGl0eSBhdCB0aGUgc2FtZSBjb21wcmVzc2lvbiBlZmZpY2llbmN5IG9yIGJldHRlciBjb21wcmVzc2lvbgorICogZWZmaWNpZW5jeSBhdCB0aGUgc2FtZSBxdWFsaXR5LiBUaGlzIHNldHRpbmcgaXMgZGVmaW5lZCBmb3IgdGhlIG91dHB1dCBzdHJlYW1zIGluIGNhc2UgdGhlCisgKiBjb21wb25lbnQgY2FuIHN1cHBvcnQgdmFyeWluZyBjb21wbGV4aXR5IG9uIGVhY2ggc3RyZWFtLCBvciBhcyBhbiBvdXRwdXQgcG9ydCB0dW5pbmcgaW4gY2FzZSB0aGUKKyAqIHF1YWxpdHkgaXMgZ2xvYmFsIHRvIGFsbCBzdHJlYW1zCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhDb21wbGV4aXR5PiBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleENvbXBsZXhpdHk+IEMyQ29tcGxleGl0eVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFlbXSA9ICJhbGdvLmNvbXBsZXhpdHkiOworCisvKioKKyAqIEhlYWRlciAoaW5pdC1kYXRhKSBoYW5kbGluZyBhcm91bmQgc3luYyBmcmFtZXMuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6cHJlcGVuZF9oZWFkZXJfbW9kZV90LCB1aW50MzJfdCwKKyAgICAvKioKKyAgICAgKiBkb24ndCBwcmVwZW5kIGhlYWRlci4gU2lnbmFsIGhlYWRlciBvbmx5IHRocm91Z2ggQzJTdHJlYW1Jbml0RGF0YUluZm8uCisgICAgICovCisgICAgUFJFUEVORF9IRUFERVJfVE9fTk9ORSwKKworICAgIC8qKgorICAgICAqIHByZXBlbmQgaGVhZGVyIGJlZm9yZSB0aGUgZmlyc3Qgb3V0cHV0IGZyYW1lIGFuZCB0aGVyZWFmdGVyIGJlZm9yZSB0aGUgbmV4dCBzeW5jIGZyYW1lCisgICAgICogaWYgaXQgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9PTl9DSEFOR0UsCisKKyAgICAvKioKKyAgICAgKiBwcmVwZW5kIGhlYWRlciBiZWZvcmUgZXZlcnkgc3luYyBmcmFtZS4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQywKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJCb29sVmFsdWUsIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGU+CisgICAgICAgIEMyUHJlcGVuZEhlYWRlck1vZGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJFUEVORF9IRUFERVJfTU9ERVtdID0gIm91dHB1dC5idWZmZXJzLnByZXBlbmQtaGVhZGVyIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU1BR0UvVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorICogT3JkZXIgb2YgdHJhbnNmb3JtYXRpb24gaXM6CisgKgorICogY3JvcCA9PiAoc2NhbGluZyA9PiBzY2FsZWQtY3JvcCkgPT4gc2FtcGxlLWFzcGVjdC1yYXRpbyA9PiBmbGlwID0+IHJvdGF0aW9uCisgKi8KKworLyoqCisgKiBQaWN0dXJlIChpbWFnZS0gYW5kIHZpZGVvIGZyYW1lKSBzaXplLgorICoKKyAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgdmlkZW8gZGVjb2RlciwgYW5kIHRoZSBpbnB1dCBvZiB0aGUgdmlkZW8gZW5jb2Rlci4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhQaWN0dXJlU2l6ZT4gQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkVbXSA9ICJyYXcuc2l6ZSI7CisKKy8qKgorICogQ3JvcCByZWN0YW5nbGUuCisgKi8KK3N0cnVjdCBDMlJlY3RTdHJ1Y3QgOiBDMlJlY3QgeworICAgIEMyUmVjdFN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBDMlJlY3RTdHJ1Y3QoY29uc3QgQzJSZWN0ICZyZWN0KSA6IEMyUmVjdChyZWN0KSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlJlY3RTdHJ1Y3QgJikgPSBkZWxldGU7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyUmVjdFN0cnVjdCAmKSA9IGRlbGV0ZTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChSZWN0KQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorICAgIEMyRklFTEQobGVmdCwgImxlZnQiKQorICAgIEMyRklFTEQodG9wLCAidG9wIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUmVjdFN0cnVjdCwga1BhcmFtSW5kZXhDcm9wUmVjdD4gQzJTdHJlYW1Dcm9wUmVjdEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DUk9QX1JFQ1RbXSA9ICJyYXcuY3JvcCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DUk9QX1JFQ1RbXSA9ICJjb2RlZC5jcm9wIjsKKworLyoqCisgKiBQaXhlbCBmb3JtYXQuCisgKi8KKy8vIFRPRE86IGRlZmluZSBzb21lCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UGl4ZWxGb3JtYXQ+IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUW10gPSAicmF3LnBpeGVsLWZvcm1hdCI7CisKKy8qKgorICogRXh0ZW5kZWQgcm90YXRpb24gaW5mb3JtYXRpb24gYWxzbyBpbmNvcnBvcmF0aW5nIGEgZmxpcC4KKyAqCisgKiBSb3RhdGlvbiBpcyBjb3VudGVyIGNsb2NrLXdpc2UuCisgKi8KK3N0cnVjdCBDMlJvdGF0aW9uU3RydWN0IHsKKyAgICBDMlJvdGF0aW9uU3RydWN0KGludDMyX3Qgcm90YXRpb24gPSAwKQorICAgICAgICA6IGZsaXAoMCksIHZhbHVlKHJvdGF0aW9uKSB7IH0KKworICAgIGludDMyX3QgZmxpcDsgICAvLy88IGhvcml6b250YWwgZmxpcCAobGVmdC1yaWdodCBmbGlwIGFwcGxpZWQgcHJpb3IgdG8gcm90YXRpb24pCisgICAgaW50MzJfdCB2YWx1ZTsgIC8vLzwgcm90YXRpb24gaW4gZGVncmVlcyBjb3VudGVyIGNsb2Nrd2lzZQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKFJvdGF0aW9uKQorICAgIEMyRklFTEQoZmxpcCwgImZsaXAiKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlJvdGF0aW9uU3RydWN0LCBrUGFyYW1JbmRleFJvdGF0aW9uPiBDMlN0cmVhbVJvdGF0aW9uSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JPVEFUSU9OW10gPSAicmF3LnJvdGF0aW9uIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9ST1RBVElPTltdID0gImNvZGVkLnZ1aS5yb3RhdGlvbiI7CisKKy8qKgorICogUGl4ZWwgKHNhbXBsZSkgYXNwZWN0IHJhdGlvLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFBpeGVsQXNwZWN0UmF0aW8+CisgICAgICAgIEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJyYXcuc2FyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJjb2RlZC52dWkuc2FyIjsKKworLyoqCisgKiBJbi1saW5lIHNjYWxpbmcuCisgKgorICogQ29tcG9uZW50cyBjYW4gb3B0aW9uYWxseSBzdXBwb3J0IHNjYWxpbmcgb2YgcmF3IGltYWdlL3ZpZGVvIGZyYW1lcy4gIE9yIHNjYWxpbmcgb25seSBhCisgKiBwb3J0aW9uIG9mIHJhdyBpbWFnZS92aWRlbyBmcmFtZXMgKHNjYWxlZC1jcm9wKS4KKyAqLworCitDMkVOVU0oQzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3QsIHVpbnQzMl90LAorICAgIFNDQUxJTkdfQVJCSVRSQVJZLCAgIC8vLzwgYXJiaXRyYXJ5LCB1bnNwZWNpZmllZAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4U2NhbGluZ01ldGhvZD4KKyAgICAgICAgQzJTdHJlYW1TY2FsaW5nTWV0aG9kVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTElOR19NT0RFW10gPSAicmF3LnNjYWxpbmctbWV0aG9kIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplPgorICAgICAgICBDMlN0cmVhbVNjYWxlZFBpY3R1cmVTaXplVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTEVEX1BJQ1RVUkVfU0laRVtdID0gInJhdy5zY2FsZWQtc2l6ZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJSZWN0U3RydWN0LCBrUGFyYW1JbmRleFNjYWxlZENyb3BSZWN0PgorICAgICAgICBDMlN0cmVhbVNjYWxlZENyb3BSZWN0VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTEVEX0NST1BfUkVDVFtdID0gInJhdy5zY2FsZWQtY3JvcCI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29sb3IgaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIENvbG9yIEluZm8KKyAqCisgKiBDaHJvbWEgbG9jYXRpb24gY2FuIHZhcnkgZm9yIHRvcCBhbmQgYm90dG9tIGZpZWxkcywgc28gdXNlIGFuIGFycmF5LCB0aGF0IGNhbiBoYXZlIDAgdG8gMgorICogdmFsdWVzLiBFbXB0eSBhcnJheSBpcyB1c2VkIGZvciBub24gWVVWIGZvcm1hdHMuCisgKi8KKworc3RydWN0IEMyQ29sb3IgeworICAgIGVudW0gbWF0cml4X3QgOiB1aW50MzJfdDsgIC8vLzwgbWF0cml4IGNvZWZmaWNpZW50IChZVVYgPD0+IFJHQikKKyAgICBlbnVtIHBsYW5lX2xheW91dF90IDogdWludDMyX3Q7ICAvLy88IHBsYW5lIGxheW91dCBmb3IgZmxleGlibGUgZm9ybWF0cworICAgIGVudW0gcHJpbWFyaWVzX3QgOiB1aW50MzJfdDsgIC8vLzwgY29sb3IgcHJpbWFyaWVzIGFuZCB3aGl0ZSBwb2ludAorICAgIGVudW0gcmFuZ2VfdCA6IHVpbnQzMl90OyAgLy8vPCByYW5nZSBvZiBjb2xvciBjb21wb25lbnQgdmFsdWVzCisgICAgZW51bSBzdWJzYW1wbGluZ190IDogdWludDMyX3Q7ICAvLy88IGNocm9tYSBzdWJzYW1wbGluZworICAgIGVudW0gdHJhbnNmZXJfdCA6IHVpbnQzMl90OyAgLy8vPCB0cmFuc2ZlciBmdW5jdGlvbgorfTsKKworLy8vIENocm9tYSBzdWJzYW1wbGluZworQzJFTlVNKEMyQ29sb3I6OnN1YnNhbXBsaW5nX3QsIHVpbnQzMl90LAorICAgIE1PTk9DSFJPTUUsICAgICAvLy88IHRoZXJlIGFyZSBubyBDciBub3IgQ2IgcGxhbmVzCisgICAgTU9OT0NIUk9NRV9BTFBIQSwgLy8vPCB0aGVyZSBhcmUgbm8gQ3Igbm9yIENiIHBsYW5lcywgYnV0IHRoZXJlIGlzIGFuIGFscGhhIHBsYW5lCisgICAgUkdCLCAgICAgICAgICAgIC8vLzwgUkdCCisgICAgUkdCQSwgICAgICAgICAgIC8vLzwgUkdCQQorICAgIFlVVl80MjAsICAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIHN1YnNhbXBsZWQgYnkgMiBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseQorICAgIFlVVl80MjIsICAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIHN1YnNhbXBsZWQgaG9yaXpvbnRhbGx5CisgICAgWVVWXzQ0NCwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgbm90IHN1YnNhbXBsZWQKKyAgICBZVVZBXzQ0NCwgICAgICAgLy8vPCBDciBhbmQgQ2IgcGxhbmVzIGFyZSBub3Qgc3Vic2FtcGxlZCwgdGhlcmUgaXMgYW4gYWxwaGEgcGxhbmUKKykKKworc3RydWN0IEMyQ2hyb21hT2Zmc2V0U3RydWN0IHsKKyAgICAvLyBjaHJvbWEgb2Zmc2V0cyBkZWZpbmVkIGJ5IElUVQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80NDQoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjIoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMCgpIHsgcmV0dXJuIHsgMC4wZiwgMC41ZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8xKCkgeyByZXR1cm4geyAwLjVmLCAwLjVmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzIoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMygpIHsgcmV0dXJuIHsgMC41ZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF80KCkgeyByZXR1cm4geyAwLjBmLCAxLjBmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzUoKSB7IHJldHVybiB7IDAuNWYsIDEuMGYgfTsgfQorCisgICAgZmxvYXQgeDsgICAgLy8vPCB4IG9mZnNldCBpbiBwaXhlbHMgKHRvd2FyZHMgcmlnaHQpCisgICAgZmxvYXQgeTsgICAgLy8vPCB5IG9mZnNldCBpbiBwaXhlbHMgKHRvd2FyZHMgZG93bikKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ2hyb21hT2Zmc2V0KQorICAgIEMyRklFTEQoeCwgIngiKQorICAgIEMyRklFTEQoeSwgInkiKQorfTsKKworc3RydWN0IEMyQ29sb3JJbmZvU3RydWN0IHsKKyAgICBDMkNvbG9ySW5mb1N0cnVjdCgpCisgICAgICAgIDogYml0RGVwdGgoOCksIHN1YnNhbXBsaW5nKEMyQ29sb3I6OllVVl80MjApIHsgfQorCisgICAgdWludDMyX3QgYml0RGVwdGg7CisgICAgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZzsKKyAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbXTsgLy8gbWF4IDIgZWxlbWVudHMKKworICAgIEMyQ29sb3JJbmZvU3RydWN0KAorICAgICAgICAgICAgc2l6ZV90IC8qIGZsZXhDb3VudCAqLywgdWludDMyX3QgYml0RGVwdGhfLCBDMkNvbG9yOjpzdWJzYW1wbGluZ190IHN1YnNhbXBsaW5nXykKKyAgICAgICAgOiBiaXREZXB0aChiaXREZXB0aF8pLCBzdWJzYW1wbGluZyhzdWJzYW1wbGluZ18pIHsgfQorCisgICAgQzJDb2xvckluZm9TdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgZmxleENvdW50LCB1aW50MzJfdCBiaXREZXB0aF8sIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmdfLAorICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyQ2hyb21hT2Zmc2V0U3RydWN0PiBsb2NhdGlvbnNfKQorICAgICAgICA6IGJpdERlcHRoKGJpdERlcHRoXyksIHN1YnNhbXBsaW5nKHN1YnNhbXBsaW5nXykgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IEMyQ2hyb21hT2Zmc2V0U3RydWN0ICZsb2NhdGlvbiA6IGxvY2F0aW9uc18pIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBmbGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2F0aW9uc1tpeF0gPSBsb2NhdGlvbjsKKyAgICAgICAgICAgICsraXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoQ29sb3JJbmZvLCBsb2NhdGlvbnMpCisgICAgQzJGSUVMRChiaXREZXB0aCwgImJpdC1kZXB0aCIpCisgICAgQzJGSUVMRChzdWJzYW1wbGluZywgInN1YnNhbXBsaW5nIikKKyAgICBDMkZJRUxEKGxvY2F0aW9ucywgImxvY2F0aW9ucyIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkNvbG9ySW5mb1N0cnVjdCwga1BhcmFtSW5kZXhDb2xvckluZm8+IEMyU3RyZWFtQ29sb3JJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09MT1JfSU5GT1tdID0gInJhdy5jb2xvci1mb3JtYXQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GT1tdID0gImNvZGVkLmNvbG9yLWZvcm1hdCI7CisKKy8qKgorICogQ29sb3IgQXNwZWN0cworICovCisKKy8qIFRoZSBtZWFuaW5nIG9mIHRoZSBmb2xsb3dpbmcgZW51bWVyYXRvcnMgaXMgYXMgZGVzY3JpYmVkIGluIElUVS1UIEguMjczLiAqLworCisvLy8gUmFuZ2UKK0MyRU5VTShDMkNvbG9yOjpyYW5nZV90LCB1aW50MzJfdCwKKyAgICBSQU5HRV9VTlNQRUNJRklFRCwgICAgICAgICAgLy8vPCByYW5nZSBpcyB1bnNwZWNpZmllZAorICAgIFJBTkdFX0ZVTEwsICAgICAgICAgICAgICAgICAvLy88IGZ1bGwgcmFuZ2UKKyAgICBSQU5HRV9MSU1JVEVELCAgICAgICAgICAgICAgLy8vPCBsaW1pdGVkIHJhbmdlCisKKyAgICBSQU5HRV9WRU5ET1JfU1RBUlQgPSAweDgwLCAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgcmFuZ2UgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBSQU5HRV9PVEhFUiA9IDBYRkYgICAgICAgICAgLy8vPCBtYXggdmFsdWUsIHJlc2VydmVkIGZvciB1bmRlZmluZWQgdmFsdWVzCispCisKKy8vLyBDb2xvciBwcmltYXJpZXMKK0MyRU5VTShDMkNvbG9yOjpwcmltYXJpZXNfdCwgdWludDMyX3QsCisgICAgUFJJTUFSSUVTX1VOU1BFQ0lGSUVELCAgICAgICAgICAvLy88IHByaW1hcmllcyBhcmUgdW5zcGVjaWZpZWQKKyAgICBQUklNQVJJRVNfQlQ3MDksICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjcwOS02IG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ0NzBfTSwgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjQ3MC02IFN5c3RlbSBNIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ2MDFfNjI1LCAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjYwMS02IDYyNSBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0JUNjAxXzUyNSwgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC42MDEtNiA1MjUgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19HRU5FUklDX0ZJTE0sICAgICAgICAgLy8vPCBHZW5lcmljIEZpbG0KKyAgICBQUklNQVJJRVNfQlQyMDIwLCAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjIwMjAgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19SUDQzMSwgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBSUCA0MzEtMiBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0VHNDMyLCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIEVHIDQzMi0xIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfRUJVMzIxMywgICAgICAgICAgICAgIC8vLzwgRUJVIFRlY2guMzIxMy1FIG9yIGVxdWl2YWxlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLworICAgIFBSSU1BUklFU19WRU5ET1JfU1RBUlQgPSAweDgwLCAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgcHJpbWFyaWVzIHZhbHVlcyBzdGFydCBoZXJlCisgICAgUFJJTUFSSUVTX09USEVSID0gMHhmZiAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIFRyYW5zZmVyIGZ1bmN0aW9uCitDMkVOVU0oQzJDb2xvcjo6dHJhbnNmZXJfdCwgdWludDMyX3QsCisgICAgVFJBTlNGRVJfVU5TUEVDSUZJRUQsICAgICAgICAgICAvLy88IHRyYW5zZmVyIGlzIHVuc3BlY2lmaWVkCisgICAgVFJBTlNGRVJfTElORUFSLCAgICAgICAgICAgICAgICAvLy88IExpbmVhciB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MKKyAgICBUUkFOU0ZFUl9TUkdCLCAgICAgICAgICAgICAgICAgIC8vLzwgc1JHQiBvciBlcXVpdmFsZW50CisgICAgVFJBTlNGRVJfMTcwTSwgICAgICAgICAgICAgICAgICAvLy88IFNNUFRFIDE3ME0gb3IgZXF1aXZhbGVudCAoZS5nLiBCVC42MDEvNzA5LzIwMjApCisgICAgVFJBTlNGRVJfR0FNTUEyMiwgICAgICAgICAgICAgICAvLy88IEFzc3VtZWQgZGlzcGxheSBnYW1tYSAyLjIKKyAgICBUUkFOU0ZFUl9HQU1NQTI4LCAgICAgICAgICAgICAgIC8vLzwgQXNzdW1lZCBkaXNwbGF5IGdhbW1hIDIuOAorICAgIFRSQU5TRkVSX1NUMjA4NCwgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBTVCAyMDg0IGZvciAxMC8xMi8xNC8xNiBiaXQgc3lzdGVtcworICAgIFRSQU5TRkVSX0hMRywgICAgICAgICAgICAgICAgICAgLy8vPCBBUklCIFNURC1CNjcgaHlicmlkLWxvZy1nYW1tYQorCisgICAgVFJBTlNGRVJfMjQwTSA9IDB4NDAsICAgICAgICAgICAvLy88IFNNUFRFIDI0ME0gb3IgZXF1aXZhbGVudAorICAgIFRSQU5TRkVSX1hWWUNDLCAgICAgICAgICAgICAgICAgLy8vPCBJRUMgNjE5NjYtMi00IG9yIGVxdWl2YWxlbnQKKyAgICBUUkFOU0ZFUl9CVDEzNjEsICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjEzNjEgZXh0ZW5kZWQgZ2FtdXQKKyAgICBUUkFOU0ZFUl9TVDQyOCwgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgU1QgNDI4LTEgb3IgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vCisgICAgVFJBTlNGRVJfVkVORE9SX1NUQVJUID0gMHg4MCwgICAvLy88IHZlbmRvci1zcGVjaWZpYyB0cmFuc2ZlciB2YWx1ZXMgc3RhcnQgaGVyZQorICAgIFRSQU5TRkVSX09USEVSID0gMHhmZiAgICAgICAgICAgLy8vPCBtYXggdmFsdWUsIHJlc2VydmVkIGZvciB1bmRlZmluZWQgdmFsdWVzCispCisKKy8vLyBNYXRyaXggY29lZmZpY2llbnQKK0MyRU5VTShDMkNvbG9yOjptYXRyaXhfdCwgdWludDMyX3QsCisgICAgTUFUUklYX1VOU1BFQ0lGSUVELCAgICAgICAgICAgICAvLy88IG1hdHJpeCBjb2VmZmljaWVudHMgYXJlIHVuc3BlY2lmaWVkCisgICAgTUFUUklYX0JUNzA5LCAgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC43MDktNSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYX0ZDQzQ3XzczXzY4MiwgICAgICAgICAgICAvLy88IEZDQyBUaXRsZSA0NyBDRlIgNzMuNjgyIG9yIGVxdWl2YWxlbnQgKEtSPTAuMzAsIEtCPTAuMTEpCisgICAgTUFUUklYX0JUNjAxLCAgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC40NzAsIEJULjYwMS02IDYyNSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYXzI0ME0sICAgICAgICAgICAgICAgICAgICAvLy88IFNNUFRFIDI0ME0gb3IgZXF1aXZhbGVudAorICAgIE1BVFJJWF9CVDIwMjAsICAgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMjAyMCBub24tY29uc3RhbnQgbHVtaW5hbmNlCisgICAgTUFUUklYX0JUMjAyMF9DT05TVEFOVCwgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC4yMDIwIGNvbnN0YW50IGx1bWluYW5jZQorICAgIE1BVFJJWF9WRU5ET1JfU1RBUlQgPSAweDgwLCAgICAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgbWF0cml4IGNvZWZmaWNpZW50IHZhbHVlcyBzdGFydCBoZXJlCisgICAgTUFUUklYX09USEVSID0gMHhmZiwgICAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworc3RydWN0IEMyQ29sb3JBc3BlY3RzU3RydWN0IHsKKyAgICBDMkNvbG9yOjpyYW5nZV90IHJhbmdlOworICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyOworICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKworICAgIEMyQ29sb3JBc3BlY3RzU3RydWN0KCkKKyAgICAgICAgOiByYW5nZShDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCksCisgICAgICAgICAgcHJpbWFyaWVzKEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCksCisgICAgICAgICAgdHJhbnNmZXIoQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQpLAorICAgICAgICAgIG1hdHJpeChDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpIHsgfQorCisgICAgQzJDb2xvckFzcGVjdHNTdHJ1Y3QoQzJDb2xvcjo6cmFuZ2VfdCByYW5nZV8sIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6dHJhbnNmZXJfdCB0cmFuc2Zlcl8sIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeF8pCisgICAgICAgIDogcmFuZ2UocmFuZ2VfKSwgcHJpbWFyaWVzKHByaW1hcmllc18pLCB0cmFuc2Zlcih0cmFuc2Zlcl8pLCBtYXRyaXgobWF0cml4Xykge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JBc3BlY3RzKQorICAgIEMyRklFTEQocmFuZ2UsICJyYW5nZSIpCisgICAgQzJGSUVMRChwcmltYXJpZXMsICJwcmltYXJpZXMiKQorICAgIEMyRklFTEQodHJhbnNmZXIsICJ0cmFuc2ZlciIpCisgICAgQzJGSUVMRChtYXRyaXgsICJtYXRyaXgiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJDb2xvckFzcGVjdHNTdHJ1Y3QsIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzPgorICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTW10gPSAicmF3LmNvbG9yIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTW10gPSAiY29kZWQudnVpLmNvbG9yIjsKKworLyoqCisgKiBEZWZhdWx0IGNvbG9yIGFzcGVjdHMgdG8gdXNlLiBUaGVzZSBjb21lIGZyb20gdGhlIGNvbnRhaW5lciBvciBjbGllbnQgYW5kIHNoYWxsIGJlIGhhbmRsZWQKKyAqIGFjY29yZGluZyB0byB0aGUgY29kaW5nIHN0YW5kYXJkLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyQ29sb3JBc3BlY3RzU3RydWN0LCBrUGFyYW1JbmRleERlZmF1bHRDb2xvckFzcGVjdHM+CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTW10gPSAiZGVmYXVsdC5jb2xvciI7CisKKy8qKgorICogSERSIFN0YXRpYyBNZXRhZGF0YSBJbmZvLgorICovCitzdHJ1Y3QgQzJDb2xvclh5U3RydWN0IHsKKyAgICBmbG9hdCB4OyAvLy88IHggY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKyAgICBmbG9hdCB5OyAvLy88IHkgY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JYeSkKKyAgICBDMkZJRUxEKHgsICJ4IikKKyAgICBDMkZJRUxEKHksICJ5IikKK307CisKK3N0cnVjdCBDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCB7CisgICAgQzJDb2xvclh5U3RydWN0IHJlZDsgICAgLy8vPCBjb29yZGluYXRlcyBvZiByZWQgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IGdyZWVuOyAgLy8vPCBjb29yZGluYXRlcyBvZiBncmVlbiBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgYmx1ZTsgICAvLy88IGNvb3JkaW5hdGVzIG9mIGJsdWUgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IHdoaXRlOyAgLy8vPCBjb29yZGluYXRlcyBvZiB3aGl0ZSBwb2ludAorCisgICAgZmxvYXQgbWF4THVtaW5hbmNlOyAgLy8vPCBtYXggZGlzcGxheSBtYXN0ZXJpbmcgbHVtaW5hbmNlIGluIGNkL21eMgorICAgIGZsb2F0IG1pbkx1bWluYW5jZTsgIC8vLzwgbWluIGRpc3BsYXkgbWFzdGVyaW5nIGx1bWluYW5jZSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lKQorICAgIEMyRklFTEQocmVkLCAicmVkIikKKyAgICBDMkZJRUxEKGdyZWVuLCAiZ3JlZW4iKQorICAgIEMyRklFTEQoYmx1ZSwgImJsdWUiKQorICAgIEMyRklFTEQod2hpdGUsICJ3aGl0ZSIpCisKKyAgICBDMkZJRUxEKG1heEx1bWluYW5jZSwgIm1heC1sdW1pbmFuY2UiKQorICAgIEMyRklFTEQobWluTHVtaW5hbmNlLCAibWluLWx1bWluYW5jZSIpCit9OworCitzdHJ1Y3QgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCB7CisgICAgQzJNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWVTdHJ1Y3QgbWFzdGVyaW5nOworCisgICAgLy8gY29udGVudCBkZXNjcmlwdG9ycworICAgIGZsb2F0IG1heENsbDsgIC8vLzwgbWF4IGNvbnRlbnQgbGlnaHQgbGV2ZWwgKHBpeGVsIGx1bWluYW5jZSkgaW4gY2QvbV4yCisgICAgZmxvYXQgbWF4RmFsbDsgLy8vPCBtYXggZnJhbWUgYXZlcmFnZSBsaWdodCBsZXZlbCAoZnJhbWUgbHVtaW5hbmNlKSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChIZHJTdGF0aWNNZXRhZGF0YSkKKyAgICBDMkZJRUxEKG1hc3RlcmluZywgIm1hc3RlcmluZyIpCisgICAgQzJGSUVMRChtYXhDbGwsICJtYXgtY2xsIikKKyAgICBDMkZJRUxEKG1heEZhbGwsICJtYXgtZmFsbCIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCwga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YT4KKyAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPW10gPSAicmF3Lmhkci1zdGF0aWMtaW5mbyI7CisKKy8qKgorICogSERSMTArIE1ldGFkYXRhIEluZm8uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQmxvYlZhbHVlLCBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhPgorICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk9bXSA9ICJpbnB1dC5oZHIxMC1wbHVzLWluZm8iOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gIm91dHB1dC5oZHIxMC1wbHVzLWluZm8iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYmxvY2stYmFzZWQgY29kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQmxvY2stc2l6ZSwgYmxvY2sgY291bnQgYW5kIGJsb2NrIHJhdGUuIFVzZWQgdG8gZGV0ZXJtaW5lIG9yIGNvbW11bmljYXRlIHByb2ZpbGUtbGV2ZWwKKyAqIHJlcXVpcmVtZW50cy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhCbG9ja1NpemU+IEMyU3RyZWFtQmxvY2tTaXplSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1NJWkVbXSA9ICJjb2RlZC5ibG9jay1zaXplIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja0NvdW50PiBDMlN0cmVhbUJsb2NrQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfQ09VTlRbXSA9ICJjb2RlZC5ibG9jay1jb3VudCI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja1JhdGU+IEMyU3RyZWFtQmxvY2tSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1JBVEVbXSA9ICJjb2RlZC5ibG9jay1yYXRlIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEZyYW1lIHJhdGUgKGNvZGVkIGFuZCBwb3J0IGZvciByYXcgZGF0YSkKKyAqCisgKiBDb2RlZCBmcmFtZSByYXRlcyBhcmUgd2hhdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gYW5kIHNob3VsZCBjb3JyZXNwb25kIHRvCisgKiB0aGUgdGltZXN0YW1wLgorICoKKyAqIEZyYW1lIHJhdGVzIG9uIHJhdyBwb3J0cyBzaG91bGQgc3RpbGwgY29ycmVzcG9uZCB0byB0aGUgdGltZXN0YW1wcy4KKyAqCisgKiBGb3Igc2xvdyBtb3Rpb24gb3IgdGltZWxhcHNlIHJlY29yZGluZywgdGhlIHRpbWVzdGFtcCBzaGFsbCBiZSBhZGp1c3RlZCBwcmlvciB0byBmZWVkaW5nIGFuCisgKiBlbmNvZGVyLCBhbmQgdGhlIHRpbWUgc3RyZXRjaCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVzZWQgdG8gc2lnbmFsIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbgorICogdGltZXN0YW1wIGFuZCByZWFsLXdvcmxkIHRpbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEVbXSA9ICJjb2RlZC5mcmFtZS1yYXRlIjsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyUG9ydEZyYW1lUmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9GUkFNRV9SQVRFW10gPSAiaW5wdXQuZnJhbWUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfRlJBTUVfUkFURVtdID0gIm91dHB1dC5mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lIHN0cmV0Y2guIFJhdGlvIGJldHdlZW4gcmVhbC13b3JsZCB0aW1lIGFuZCB0aW1lc3RhbXAuIEUuZy4gdGltZSBzdHJldGNoIG9mIDQuMCBtZWFucyB0aGF0CisgKiB0aW1lc3RhbXAgZ3Jvd3MgMS80IHRoZSBzcGVlZCBvZiByZWFsLXdvcmxkIHRpbWUgKGUuZy4gNHggc2xvLW1vIGlucHV0KS4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogb3B0aW1pemUgZW5jb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4VGltZVN0cmV0Y2g+IEMyUG9ydFRpbWVTdHJldGNoSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSFtdID0gImlucHV0LnRpbWUtc3RyZXRjaCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfVElNRV9TVFJFVENIW10gPSAib3V0cHV0LnRpbWUtc3RyZXRjaCI7CisKKy8qKgorICogTWF4IHZpZGVvIGZyYW1lIHNpemUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhNYXhQaWN0dXJlU2l6ZT4KKyAgICAgICAgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzsKK3R5cGVkZWYgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZyBDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkVbXSA9ICJyYXcubWF4LXNpemUiOworCisvKioKKyAqIFBpY3R1cmUgdHlwZSBtYXNrLgorICovCitDMkVOVU0oQzJDb25maWc6OnBpY3R1cmVfdHlwZV90LCB1aW50MzJfdCwKKyAgICBTWU5DX0ZSQU1FID0gKDEgPDwgMCksICAvLy88IHN5bmMgZnJhbWUsIGUuZy4gSURSCisgICAgSV9GUkFNRSAgICA9ICgxIDw8IDEpLCAgLy8vPCBpbnRyYSBmcmFtZSB0aGF0IGlzIGNvbXBsZXRlbHkgZW5jb2RlZAorICAgIFBfRlJBTUUgICAgPSAoMSA8PCAyKSwgIC8vLzwgaW50ZXIgcHJlZGljdGVkIGZyYW1lIGZyb20gcHJldmlvdXMgZnJhbWVzCisgICAgQl9GUkFNRSAgICA9ICgxIDw8IDMpLCAgLy8vPCBiYWNrd2FyZCBwcmVkaWN0ZWQgKG91dC1vZi1vcmRlcikgZnJhbWUKKykKKworLyoqCisgKiBBbGxvd2VkIHBpY3R1cmUgdHlwZXMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGVNYXNrPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJQ1RVUkVfVFlQRV9NQVNLW10gPSAiY29kaW5nLnBpY3R1cmUtdHlwZS1tYXNrIjsKKworLyoqCisgKiBSZXN1bHRpbmcgcGljdHVyZSB0eXBlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkNvbmZpZzo6cGljdHVyZV90eXBlX3Q+PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1QaWN0dXJlVHlwZUluZm8gQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9UWVBFW10gPSAiY29kZWQucGljdHVyZS10eXBlIjsKKworLyoqCisgKiBHT1Agc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBHT1AgaXMgc3BlY2lmaWVkIGluIGxheWVycyBiZXR3ZWVuIHN5bmMgZnJhbWVzLCBieSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWMgdHlwZSBvZgorICogZnJhbWVzIGJldHdlZW4gdGhlIHByZXZpb3VzIHR5cGUgKHN0YXJ0aW5nIHdpdGggc3luYyBmcmFtZXMgZm9yIHRoZSBmaXJzdCBsYXllcik6CisgKgorICogRS5nLgorICogICAgICAtIDQgSSBmcmFtZXMgYmV0d2VlbiBlYWNoIHN5bmMgZnJhbWUKKyAqICAgICAgLSAyIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgICAgIC0gMSBCIGZyYW1lIGJldHdlZW4gZWFjaCBQIGZyYW1lCisgKgorICogICAgICBbIHsgSSwgNCB9LCB7IFAsIDIgfSwgeyBCLCAxIH0gXSA9PT4gKFN5bmMpQlBCUEIgSUJQQlBCIElCUEJQQiBJQlBCUEIgSUJQQlBCIChTeW5jKUJQQlBCCisgKgorICogRm9yIGluZmluaXRlIEdPUCwgSSBsYXllciBjYW4gYmUgb21pdHRlZCAoYXMgdGhlIGZpcnN0IGZyYW1lIGlzIGFsd2F5cyBhIHN5bmMgZnJhbWUuKToKKyAqCisgKiAgICAgIFsgeyBQLCBNQVhfVUlOVCB9IF0gICA9PT4gKFN5bmMpUFBQUFBQUFBQUFBQUFBQUFBQLi4uCisgKgorICogU3luYyBmcmFtZXMgY2FuIGFsc28gYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCwgYW5kIGFzIGEgdGltZS1iYXNlZCBpbnRlcnZhbC4gRm9yIHRpbWUtYmFzZWQKKyAqIGludGVydmFsLCBpZiB0aGVyZSBoYXNuJ3QgYmVlbiBhIHN5bmMgZnJhbWUgaW4gYXQgbGVhc3QgdGhlIGdpdmVuIHRpbWUsIHRoZSBuZXh0IEkgZnJhbWUgc2hhbGwKKyAqIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLiAgRm9yIHN5bmMgcmVxdWVzdCwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4KKyAqCisgKiBUZW1wb3JhbCBsYXllcmluZyB3aWxsIGRldGVybWluZSBHT1Agc3RydWN0dXJlIG90aGVyIHRoYW4gdGhlIEkgZnJhbWUgY291bnQgYmV0d2VlbiBzeW5jCisgKiBmcmFtZXMuCisgKi8KK3N0cnVjdCBDMkdvcExheWVyU3RydWN0IHsKKyAgICBDMkdvcExheWVyU3RydWN0KEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCB0eXBlLCB1aW50MzJfdCBjb3VudF8pCisgICAgICAgIDogdHlwZV8odHlwZSksIGNvdW50KGNvdW50XykgeyB9CisKKyAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgdHlwZV87CisgICAgdWludDMyX3QgY291bnQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEdvcExheWVyKQorICAgIEMyRklFTEQodHlwZV8sICJ0eXBlIikKKyAgICBDMkZJRUxEKGNvdW50LCAiY291bnQiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyR29wTGF5ZXJTdHJ1Y3Q+LCBrUGFyYW1JbmRleEdvcD4KKyAgICAgICAgQzJTdHJlYW1Hb3BUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9HT1BbXSA9ICJjb2RpbmcuZ29wIjsKKworLyoqCisgKiBTeW5jIGZyYW1lIGNhbiBiZSByZXF1ZXN0ZWQgb24gZGVtYW5kIGJ5IHRoZSBjbGllbnQuCisgKgorICogSWYgdHJ1ZSwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4gVGhpcyBjb25maWcgY2FuIGJlIHBhc3NlZAorICogc3luY2hyb25vdXNseSB3aXRoIHRoZSB3b3JrLCBvciBkaXJlY3RseSB0byB0aGUgY29tcG9uZW50IC0gbGVhZGluZyB0byBkaWZmZXJlbnQgcmVzdWx0LgorICogSWYgaXQgaXMgcGFzc2VkIHdpdGggd29yaywgaXQgc2hhbGwgdGFrZSBlZmZlY3Qgd2hlbiB0aGF0IHdvcmsgaXRlbSBpcyBiZWluZyBwcm9jZXNzZWQgKHNvCisgKiB0aGUgZmlyc3QgSSBmcmFtZSBhdCBvciBhZnRlciB0aGF0IHdvcmsgaXRlbSBzaGFsbCBiZSBhIHN5bmMgZnJhbWUpLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyRWFzeUJvb2xWYWx1ZSwga1BhcmFtSW5kZXhSZXF1ZXN0U3luY0ZyYW1lPgorICAgICAgICBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUVbXSA9ICJjb2RpbmcucmVxdWVzdC1zeW5jLWZyYW1lIjsKKworLyoqCisgKiBTeW5jIGZyYW1lIGludGVydmFsIGluIHRpbWUgZG9tYWluICh0aW1lc3RhbXApLgorICoKKyAqIElmIHRoZXJlIGhhc24ndCBiZWVuIGEgc3luYyBmcmFtZSBpbiBhdCBsZWFzdCB0aGlzIHZhbHVlLCB0aGUgbmV4dCBpbnRyYSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkCisgKiBhcyBhIHN5bmMgZnJhbWUuIFRoZSB2YWx1ZSBvZiBNQVhfSTY0IG9yIGEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgbm8gc3luYyBmcmFtZXMgYWZ0ZXIgdGhlIGZpcnN0CisgKiBmcmFtZS4gQSB2YWx1ZSBvZiAwIG1lYW5zIGFsbCBzeW5jIGZyYW1lcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4U3luY0ZyYW1lSW50ZXJ2YWw+CisgICAgICAgIEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMW10gPSAiY29kaW5nLnN5bmMtZnJhbWUtaW50ZXJ2YWwiOworCisvKioKKyAqIFRlbXBvcmFsIGxheWVyaW5nCisgKgorICogTGF5ZXIgaW5kZXggaXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIGxheWVyIGNvdW50IC0gMS4gTGF5ZXJzIHdpdGggaGlnaGVyIGluZGV4IGhhdmUgaGlnaGVyCisgKiBmcmVxdWVuY3k6CisgKiAgICAgMAorICogICAxICAgMQorICogIDIgMiAyIDIKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhMYXllckluZGV4PiBDMlN0cmVhbUxheWVySW5kZXhJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTEFZRVJfSU5ERVhbXSA9ICJjb2RlZC5sYXllci1pbmRleCI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TGF5ZXJDb3VudD4gQzJTdHJlYW1MYXllckNvdW50SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0xBWUVSX0NPVU5UW10gPSAiY29kZWQubGF5ZXItY291bnQiOworCitzdHJ1Y3QgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0IHsKKyAgICBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3QoKQorICAgICAgICA6IGxheWVyQ291bnQoMCksIGJMYXllckNvdW50KDApIHsgfQorCisgICAgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0KHNpemVfdCAvKiBmbGV4Q291bnQgKi8sIHVpbnQzMl90IGxheWVyQ291bnRfLCB1aW50MzJfdCBiTGF5ZXJDb3VudF8pCisgICAgICAgIDogbGF5ZXJDb3VudChsYXllckNvdW50XyksIGJMYXllckNvdW50KGMyX21pbihsYXllckNvdW50XywgYkxheWVyQ291bnRfKSkgeyB9CisKKyAgICBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgdWludDMyX3QgbGF5ZXJDb3VudF8sIHVpbnQzMl90IGJMYXllckNvdW50XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PGZsb2F0PiByYXRpb3MpCisgICAgICAgIDogbGF5ZXJDb3VudChsYXllckNvdW50XyksIGJMYXllckNvdW50KGMyX21pbihsYXllckNvdW50XywgYkxheWVyQ291bnRfKSkgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGZsb2F0IHJhdGlvIDogcmF0aW9zKSB7CisgICAgICAgICAgICBpZiAoaXggPT0gZmxleENvdW50KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiaXRyYXRlUmF0aW9zW2l4KytdID0gcmF0aW87CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50MzJfdCBsYXllckNvdW50OyAgICAgLy8vPCB0b3RhbCBudW1iZXIgb2YgbGF5ZXJzICgwIG1lYW5zIG5vIHRlbXBvcmFsIGxheWVyaW5nKQorICAgIHVpbnQzMl90IGJMYXllckNvdW50OyAgICAvLy88IHRvdGFsIG51bWJlciBvZiBiaWRpcmVjdGlvbmFsIGxheWVycyAoPD0gbnVtIGxheWVycykKKyAgICAvKioKKyAgICAgKiBCaXRyYXRlIGJ1ZGdldHMgZm9yIGVhY2ggbGF5ZXIgYW5kIHRoZSBsYXllcnMgYmVsb3csIGdpdmVuIGFzIGEgcmF0aW8gb2YgdGhlIHRvdGFsCisgICAgICogc3RyZWFtIGJpdHJhdGUuIFRoaXMgY2FuIGJlIG9taXR0ZWQgb3IgcGFydGlhbGx5IHNwZWNpZmlmZWQgYnkgdGhlIGNsaWVudCB3aGlsZSBjb25maWd1cmluZywKKyAgICAgKiBpbiB3aGljaCBjYXNlIHRoZSBjb21wb25lbnQgc2hhbGwgZmlsbCBpbiBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIHRoZSBtaXNzaW5nIGxheWVycy4KKyAgICAgKiBUaGlzIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCB3aGVuIHF1ZXJpZWQgZm9yIGF0IGxlYXN0IGxheWVyIGNvdW50IC0gMSAoYXMgdGhlCisgICAgICogbGFzdCBsYXllcidzIGJ1ZGdldCBpcyBhbHdheXMgMS4wKS4KKyAgICAgKi8KKyAgICBmbG9hdCBiaXRyYXRlUmF0aW9zW107ICAgLy8vPCAxLjAtYmFzZWQKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUZW1wb3JhbExheWVyaW5nLCBiaXRyYXRlUmF0aW9zKQorICAgIEMyRklFTEQobGF5ZXJDb3VudCwgImxheWVyLWNvdW50IikKKyAgICBDMkZJRUxEKGJMYXllckNvdW50LCAiYi1sYXllci1jb3VudCIpCisgICAgQzJGSUVMRChiaXRyYXRlUmF0aW9zLCAiYml0cmF0ZS1yYXRpb3MiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3QsIGtQYXJhbUluZGV4VGVtcG9yYWxMYXllcmluZz4KKyAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkdbXSA9ICJjb2RpbmcudGVtcG9yYWwtbGF5ZXJpbmciOworCisvKioKKyAqIEludHJhLXJlZnJlc2guCisgKi8KKworQzJFTlVNKEMyQ29uZmlnOjppbnRyYV9yZWZyZXNoX21vZGVfdCwgdWludDMyX3QsCisgICAgSU5UUkFfUkVGUkVTSF9ESVNBQkxFRCwgICAgIC8vLzwgbm8gaW50cmEgcmVmcmVzaAorICAgIElOVFJBX1JFRlJFU0hfQVJCSVRSQVJZLCAgICAvLy88IGFyYml0cmFyeSwgdW5zcGVjaWZpZWQKKykKKworc3RydWN0IEMySW50cmFSZWZyZXNoU3RydWN0IHsKKyAgICBDMkludHJhUmVmcmVzaFN0cnVjdCgpCisgICAgICAgIDogbW9kZShDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCksIHBlcmlvZCgwLikgeyB9CisKKyAgICBDMkludHJhUmVmcmVzaFN0cnVjdChDMkNvbmZpZzo6aW50cmFfcmVmcmVzaF9tb2RlX3QgbW9kZV8sIGZsb2F0IHBlcmlvZF8pCisgICAgICAgIDogbW9kZShtb2RlXyksIHBlcmlvZChwZXJpb2RfKSB7IH0KKworICAgIEMyQ29uZmlnOjppbnRyYV9yZWZyZXNoX21vZGVfdCBtb2RlOyAvLy88IHJlZnJlc2ggbW9kZQorICAgIGZsb2F0IHBlcmlvZDsgICAgICAgICAvLy88IGludHJhIHJlZnJlc2ggcGVyaW9kIGluIGZyYW1lcyAobXVzdCBiZSA+PSAxKSwgMCBtZWFucyBkaXNhYmxlZAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChJbnRyYVJlZnJlc2gpCisgICAgQzJGSUVMRChtb2RlLCAibW9kZSIpCisgICAgQzJGSUVMRChwZXJpb2QsICJwZXJpb2QiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkludHJhUmVmcmVzaFN0cnVjdCwga1BhcmFtSW5kZXhJbnRyYVJlZnJlc2g+CisgICAgICAgIEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5UUkFfUkVGUkVTSFtdID0gImNvZGluZy5pbnRyYS1yZWZyZXNoIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU1BR0UgQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFRpbGUgbGF5b3V0LgorICoKKyAqIFRoaXMgZGVzY3JpYmVkIGhvdyB0aGUgaW1hZ2UgaXMgZGVjb21wb3NlZCBpbnRvIHRpbGVzLgorICovCitDMkVOVU0oQzJDb25maWc6OnNjYW5fb3JkZXJfdCwgdWludDMyX3QsCisgICAgU0NBTl9MRUZUX1RPX1JJR0hUX1RIRU5fRE9XTgorKQorCitzdHJ1Y3QgQzJUaWxlTGF5b3V0U3RydWN0IHsKKyAgICBDMlBpY3R1cmVTaXplU3RydWN0IHRpbGU7ICAgICAgIC8vLzwgdGlsZSBzaXplCisgICAgdWludDMyX3QgY29sdW1uQ291bnQ7ICAgICAgICAgICAvLy88IG51bWJlciBvZiB0aWxlcyBob3Jpem9udGFsbHkKKyAgICB1aW50MzJfdCByb3dDb3VudDsgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHRpbGVzIHZlcnRpY2FsbHkKKyAgICBDMkNvbmZpZzo6c2Nhbl9vcmRlcl90IG9yZGVyOyAgIC8vLzwgdGlsZSBvcmRlcgorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChUaWxlTGF5b3V0KQorICAgIEMyRklFTEQodGlsZSwgInRpbGUiKQorICAgIEMyRklFTEQoY29sdW1uQ291bnQsICJjb2x1bW5zIikKKyAgICBDMkZJRUxEKHJvd0NvdW50LCAicm93cyIpCisgICAgQzJGSUVMRChvcmRlciwgIm9yZGVyIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVGlsZUxheW91dFN0cnVjdCwga1BhcmFtSW5kZXhUaWxlTGF5b3V0PiBDMlN0cmVhbVRpbGVMYXlvdXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVRbXSA9ICJjb2RlZC50aWxlLWxheW91dCI7CisKKy8qKgorICogVGlsZSBoYW5kbGluZy4KKyAqCisgKiBXaGV0aGVyIHRvIGNvbmNhdGVuYXRlIHRpbGVzIG9yIG91dHB1dCB0aGVtIGVhY2guCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6dGlsaW5nX21vZGVfdCwgdWludDMyX3QsCisgICAgVElMSU5HX1NFUEFSQVRFLCAgICAvLy88IG91dHB1dCBlYWNoIHRpbGUgaW4gYSBzZXBhcmF0ZSBvbldvcmtEb25lCisgICAgVElMSU5HX0NPTkNBVEVOQVRFICAvLy88IG91dHB1dCBvbmUgd29yayBjb21wbGV0aW9uIHBlciBmcmFtZSAoY29uY2F0ZW5hdGUgdGlsZXMpCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJUaWxlTGF5b3V0U3RydWN0LCBrUGFyYW1JbmRleFRpbGVIYW5kbGluZz4KKyAgICAgICAgQzJTdHJlYW1UaWxlSGFuZGxpbmdUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9USUxFX0hBTkRMSU5HW10gPSAiY29kaW5nLnRpbGUtaGFuZGxpbmciOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBVURJTyBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogU2FtcGxlIHJhdGUKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTYW1wbGVSYXRlPiBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEVbXSA9ICJyYXcuc2FtcGxlLXJhdGUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfU0FNUExFX1JBVEVbXSA9ICJjb2RlZC5zYW1wbGUtcmF0ZSI7CisKKy8qKgorICogQ2hhbm5lbCBjb3VudC4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhDaGFubmVsQ291bnQ+IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlRbXSA9ICJyYXcuY2hhbm5lbC1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DSEFOTkVMX0NPVU5UW10gPSAiY29kZWQuY2hhbm5lbC1jb3VudCI7CisKKy8qKgorICogTWF4IGNoYW5uZWwgY291bnQuIFVzZWQgdG8gbGltaXQgdGhlIG51bWJlciBvZiBjb2RlZCBvciBkZWNvZGVkIGNoYW5uZWxzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heENoYW5uZWxDb3VudD4gQzJTdHJlYW1NYXhDaGFubmVsQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlRbXSA9ICJyYXcubWF4LWNoYW5uZWwtY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX0NPREVEX0NIQU5ORUxfQ09VTlRbXSA9ICJjb2RlZC5tYXgtY2hhbm5lbC1jb3VudCI7CisKKy8qKgorICogQXVkaW8gc2FtcGxlIGZvcm1hdCAoUENNIGVuY29kaW5nKQorICovCitDMkVOVU0oQzJDb25maWc6OnBjbV9lbmNvZGluZ190LCB1aW50MzJfdCwKKyAgICBQQ01fMTYsCisgICAgUENNXzgsCisgICAgUENNX0ZMT0FUCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnBjbV9lbmNvZGluZ190Piwga1BhcmFtSW5kZXhQY21FbmNvZGluZz4KKyAgICAgICAgQzJTdHJlYW1QY21FbmNvZGluZ0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkdbXSA9ICJyYXcucGNtLWVuY29kaW5nIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPREVEX1BDTV9FTkNPRElOR1tdID0gImNvZGVkLnBjbS1lbmNvZGluZyI7CisKKy8qKgorICogQUFDIFNCUiBNb2RlLiBVc2VkIGR1cmluZyBlbmNvZGluZy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjphYWNfc2JyX21vZGVfdCwgdWludDMyX3QsCisgICAgQUFDX1NCUl9PRkYsCisgICAgQUFDX1NCUl9TSU5HTEVfUkFURSwKKyAgICBBQUNfU0JSX0RVQUxfUkFURSwKKyAgICBBQUNfU0JSX0FVVE8gLy8vPCBsZXQgdGhlIGNvZGVjIGRlY2lkZQorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjphYWNfc2JyX21vZGVfdD4sIGtQYXJhbUluZGV4QWFjU2JyTW9kZT4KKyAgICAgICAgQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQUFDX1NCUl9NT0RFW10gPSAiY29kaW5nLmFhYy1zYnItbW9kZSI7CisKKy8qKgorICogRFJDIENvbXByZXNzaW9uLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpkcmNfY29tcHJlc3Npb25fbW9kZV90LCBpbnQzMl90LAorICAgIERSQ19DT01QUkVTU0lPTl9PRE1fREVGQVVMVCwgLy8vPCBvZG0ncyBkZWZhdWx0CisgICAgRFJDX0NPTVBSRVNTSU9OX05PTkUsCisgICAgRFJDX0NPTVBSRVNTSU9OX0xJR0hULAorICAgIERSQ19DT01QUkVTU0lPTl9IRUFWWSAvLy88CispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmRyY19jb21wcmVzc2lvbl9tb2RlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RHJjQ29tcHJlc3Npb24+CisgICAgICAgIEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREVbXSA9ICJjb2RpbmcuZHJjLmNvbXByZXNzaW9uLW1vZGUiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWw+CisgICAgICAgIEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTFtdID0gImNvZGluZy5kcmMucmVmZXJlbmNlLWxldmVsIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY0VuY29kZWRUYXJnZXRMZXZlbD4KKyAgICAgICAgQzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUxbXSA9ICJjb2RpbmcuZHJjLmVuY29kZWQtbGV2ZWwiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjQm9vc3RGYWN0b3I+CisgICAgICAgIEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SW10gPSAiY29kaW5nLmRyYy5ib29zdC1mYWN0b3IiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjQXR0ZW51YXRpb25GYWN0b3I+CisgICAgICAgIEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SW10gPSAiY29kaW5nLmRyYy5hdHRlbnVhdGlvbi1mYWN0b3IiOworCisvKioKKyAqIERSQyBFZmZlY3QgVHlwZSAoc2VlIElTTyAyMzAwMy00KSBVbmlmb3JtIER5bmFtaWMgUmFuZ2UgQ29udHJvbC4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6ZHJjX2VmZmVjdF90eXBlX3QsIGludDMyX3QsCisgICAgRFJDX0VGRkVDVF9PRE1fREVGQVVMVCA9IC0yLCAvLy88IG9kbSdzIGRlZmF1bHQKKyAgICBEUkNfRUZGRUNUX09GRiA9IC0xLCAgICAvLy88IG5vIERSQworICAgIERSQ19FRkZFQ1RfTk9ORSA9IDAsICAgIC8vLzwgbm8gRFJDIGV4Y2VwdCB0byBwcmV2ZW50IGNsaXBwaW5nCisgICAgRFJDX0VGRkVDVF9MQVRFX05JR0hULAorICAgIERSQ19FRkZFQ1RfTk9JU1lfRU5WSVJPTk1FTlQsCisgICAgRFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgIERSQ19FRkZFQ1RfTE9XX1BMQVlCQUNLX0xFVkVMLAorICAgIERSQ19FRkZFQ1RfRElBTE9HX0VOSEFOQ0VNRU5ULAorICAgIERSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTgorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpkcmNfZWZmZWN0X3R5cGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhEcmNFZmZlY3RUeXBlPgorICAgICAgICBDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEVbXSA9ICJjb2RpbmcuZHJjLmVmZmVjdC10eXBlIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFBQyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEFBQyBzdHJlYW0gZm9ybWF0CisgKi8KK0MyRU5VTShDMkNvbmZpZzo6YWFjX3BhY2thZ2luZ190LCB1aW50MzJfdCwKKyAgICBBQUNfUEFDS0FHSU5HX1JBVywKKyAgICBBQUNfUEFDS0FHSU5HX0FEVFMKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjphYWNfcGFja2FnaW5nX3Q+PiwKKyAgICAgICAga1BhcmFtSW5kZXhBYWNQYWNrYWdpbmc+IEMyU3RyZWFtQWFjUGFja2FnaW5nSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1BYWNQYWNrYWdpbmdJbmZvIEMyU3RyZWFtQWFjRm9ybWF0SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkdbXSA9ICJjb2RlZC5hYWMtcGFja2FnaW5nIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUExBVEZPUk0tREVGSU5FRCBQQVJBTUVURVJTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogUGxhdGZvcm0gbGV2ZWwgYW5kIGZlYXR1cmVzLgorICovCitlbnVtIEMyQ29uZmlnOjpwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3QgeworICAgIFBMQVRGT1JNX1AsICAgLy8vPCBzdXBwb3J0IGZvciBBbmRyb2lkIDkuMCBmZWF0dXJlIHNldAorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwbGF0Zm9ybV9sZXZlbF90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBsYXRmb3JtTGV2ZWw+CisgICAgICAgIEMyUGxhdGZvcm1MZXZlbFNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QTEFURk9STV9MRVZFTFtdID0gImFwaS5wbGF0Zm9ybS1sZXZlbCI7CisKK2VudW0gQzJDb25maWc6OnBsYXRmb3JtX2ZlYXR1cmVfdCA6IHVpbnQ2NF90IHsKKyAgICAvLyBubyBwbGF0Zm9ybS1zcGVjaWZpYyBmZWF0dXJlcyBoYXZlIGJlZW4gZGVmaW5lZAorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwbGF0Zm9ybV9mZWF0dXJlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGxhdGZvcm1GZWF0dXJlcz4KKyAgICAgICAgQzJQbGF0Zm9ybUZlYXR1cmVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BMQVRGT1JNX0ZFQVRVUkVTW10gPSAiYXBpLnBsYXRmb3JtLWZlYXR1cmVzIjsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHByZWZlcnJlZCBpb24gYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIG1lbW9yeSB1c2FnZS4KKyAqLworc3RydWN0IEMyU3RvcmVJb25Vc2FnZVN0cnVjdCB7CisgICAgaW5saW5lIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCgpIHsKKyAgICAgICAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOworICAgIH0KKworICAgIGlubGluZSBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QodWludDY0X3QgdXNhZ2VfLCB1aW50MzJfdCBjYXBhY2l0eV8pCisgICAgICAgIDogdXNhZ2UodXNhZ2VfKSwgY2FwYWNpdHkoY2FwYWNpdHlfKSwgaGVhcE1hc2soMCksIGFsbG9jRmxhZ3MoMCksIG1pbkFsaWdubWVudCgwKSB7IH0KKworICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgLy8vPCBDMk1lbW9yeVVzYWdlCisgICAgdWludDMyX3QgY2FwYWNpdHk7ICAgICAvLy88IGNhcGFjaXR5CisgICAgaW50MzJfdCBoZWFwTWFzazsgICAgICAvLy88IGlvbiBoZWFwTWFzaworICAgIGludDMyX3QgYWxsb2NGbGFnczsgICAgLy8vPCBpb24gYWxsb2NhdGlvbiBmbGFncworICAgIHVpbnQzMl90IG1pbkFsaWdubWVudDsgLy8vPCBtaW5pbXVtIGFsaWdubWVudAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChTdG9yZUlvblVzYWdlKQorICAgIEMyRklFTEQodXNhZ2UsICJ1c2FnZSIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKGhlYXBNYXNrLCAiaGVhcC1tYXNrIikKKyAgICBDMkZJRUxEKGFsbG9jRmxhZ3MsICJhbGxvYy1mbGFncyIpCisgICAgQzJGSUVMRChtaW5BbGlnbm1lbnQsICJtaW4tYWxpZ25tZW50IikKK307CisKKy8vIHN0b3JlLCBwcml2YXRlCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QsIGtQYXJhbUluZGV4U3RvcmVJb25Vc2FnZT4KKyAgICAgICAgQzJTdG9yZUlvblVzYWdlSW5mbzsKKworLyoqCisgKiBGbGV4aWJsZSBwaXhlbCBmb3JtYXQgZGVzY3JpcHRvcnMKKyAqLworc3RydWN0IEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3QgeworICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0OworICAgIHVpbnQzMl90IGJpdERlcHRoOworICAgIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmc7CisgICAgQzJDb2xvcjo6cGxhbmVfbGF5b3V0X3QgbGF5b3V0OworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcikKKyAgICBDMkZJRUxEKHBpeGVsRm9ybWF0LCAicGl4ZWwtZm9ybWF0IikKKyAgICBDMkZJRUxEKGJpdERlcHRoLCAiYml0LWRlcHRoIikKKyAgICBDMkZJRUxEKHN1YnNhbXBsaW5nLCAic3Vic2FtcGxpbmciKQorICAgIEMyRklFTEQobGF5b3V0LCAibGF5b3V0IikKK307CisKKy8qKgorICogUGxhbmUgbGF5b3V0IG9mIGZsZXhpYmxlIHBpeGVsIGZvcm1hdHMuCisgKgorICogYnBwOiBieXRlcyBwZXIgY29sb3IgY29tcG9uZW50LCBlLmcuIDEgZm9yIDgtYml0IGZvcm1hdHMsIGFuZCAyIGZvciAxMC0xNi1iaXQgZm9ybWF0cy4KKyAqLworQzJFTlVNKEMyQ29sb3I6OnBsYW5lX2xheW91dF90LCB1aW50MzJfdCwKKyAgICAgICAvKiogVW5rbm93biBsYXlvdXQgKi8KKyAgICAgICBVTktOT1dOX0xBWU9VVCwKKworICAgICAgIC8qKiBQbGFuYXIgbGF5b3V0IHdpdGggcm93cyBvZiBlYWNoIHBsYW5lIHBhY2tlZCAoY29sSW5jID0gYnBwKSAqLworICAgICAgIFBMQU5BUl9QQUNLRUQsCisKKyAgICAgICAvKiogU2VtaXBsYW5hciBsYXlvdXQgd2l0aCByb3dzIG9mIGVhY2ggcGxhbmUgcGFja2VkIChjb2xJbmNfWS9BID0gYnBwIChwbGFuYXIpLAorICAgICAgICAqICBjb2xJbmNfQ2IvQ3IgPSAyKmJwcCAoaW50ZXJsZWF2ZWQpLiBVc2VkIG9ubHkgZm9yIFlVVihBKSBmb3JtYXRzLiAqLworICAgICAgIFNFTUlQTEFOQVJfUEFDS0VELAorCisgICAgICAgLyoqIEludGVybGVhdmVkIHBhY2tlZC4gY29sSW5jID0gTipicHAgKE4gYXJlIHRoZSBudW1iZXIgb2YgY29sb3IgY29tcG9uZW50cykgKi8KKyAgICAgICBJTlRFUkxFQVZFRF9QQUNLRUQsCisKKyAgICAgICAvKiogSW50ZXJsZWF2ZWQgYWxpZ25lZC4gY29sSW5jID0gc21hbGxlc3QgcG93ZXIgb2YgMiA+PSBOKmJwcCAoTiBhcmUgdGhlIG51bWJlciBvZiBjb2xvcgorICAgICAgICAqICBjb21wb25lbnRzKSAqLworICAgICAgIElOVEVSTEVBVkVEX0FMSUdORUQKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9ycz4KKyAgICAgICAgQzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm87CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBhbmRyb2lkIGRhdGFzcGFjZSBmb3IgYSByYXcgdmlkZW8vaW1hZ2UgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGF0YVNwYWNlPiBDMlN0cmVhbURhdGFTcGFjZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EQVRBX1NQQUNFW10gPSAicmF3LmRhdGEtc3BhY2UiOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgYW5kcm9pZCBzdXJmYWNlIHNjYWxpbmcgbW9kZSBmb3IgYSByYXcgdmlkZW8vaW1hZ2UgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U3VyZmFjZVNjYWxpbmc+IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREVbXSA9ICJyYXcuc3VyZmFjZS1zY2FsaW5nIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElOUFVUIFNVUkZBQ0UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogSW5wdXQgc3VyZmFjZSBFT1MKKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkVhc3lCb29sVmFsdWUsIGtQYXJhbUluZGV4SW5wdXRTdXJmYWNlRW9zPgorICAgICAgICBDMklucHV0U3VyZmFjZUVvc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfRU9TW10gPSAiaW5wdXQtc3VyZmFjZS5lb3MiOworCisvKioKKyAqIFN0YXJ0L3N1c3BlbmQvcmVzdW1lL3N0b3AgY29udHJvbHMgYW5kIHRpbWVzdGFtcHMgZm9yIGlucHV0IHN1cmZhY2UuCisgKgorICogVE9ETzogbWFrZSB0aGVzZSBjb3VudGVycworICovCisKK3N0cnVjdCBDMlRpbWVkQ29udHJvbFN0cnVjdCB7CisgICAgYzJfYm9vbF90IGVuYWJsZWQ7IC8vLzwgY29udHJvbCBpcyBlbmFibGVkCisgICAgaW50NjRfdCB0aW1lc3RhbXA7IC8vLzwgaWYgZW5hYmxlZCwgdGltZSB0aGUgY29udHJvbCBzaG91bGQgdGFrZSBlZmZlY3QKKworICAgIEMyVGltZWRDb250cm9sU3RydWN0KCkKKyAgICAgICAgOiBlbmFibGVkKEMyX0ZBTFNFKSwgdGltZXN0YW1wKDApIHsgfQorCisgICAgLyogaW1wbGljaXQgKi8gQzJUaW1lZENvbnRyb2xTdHJ1Y3QodWludDY0X3QgdGltZXN0YW1wXykKKyAgICAgICAgOiBlbmFibGVkKEMyX1RSVUUpLCB0aW1lc3RhbXAodGltZXN0YW1wXykgeyB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbWVkQ29udHJvbCkKKyAgICBDMkZJRUxEKGVuYWJsZWQsICAgImVuYWJsZWQiKQorICAgIEMyRklFTEQodGltZXN0YW1wLCAidGltZXN0YW1wIikKK307CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN0YXJ0QXQ+CisgICAgICAgIEMyUG9ydFN0YXJ0VGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVEFSVF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3RhcnQiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3VzcGVuZEF0PgorICAgICAgICBDMlBvcnRTdXNwZW5kVGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVVNQRU5EX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdXNwZW5kIjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFJlc3VtZUF0PgorICAgICAgICBDMlBvcnRSZXN1bWVUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1JFU1VNRV9BVFtdID0gImlucHV0LXN1cmZhY2UucmVzdW1lIjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN0b3BBdD4KKyAgICAgICAgQzJQb3J0U3RvcFRpbWVzdGFtcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfU1RPUF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3RvcCI7CisKKy8qKgorICogVGltZSBvZmZzZXQgZm9yIGlucHV0IHN1cmZhY2UuIElucHV0IHRpbWVzdGFtcCB0byBjb2RlYyBpcyBzdXJmYWNlIGJ1ZmZlciB0aW1lc3RhbXAgcGx1cyB0aGlzCisgKiB0aW1lIG9mZnNldC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4VGltZU9mZnNldD4gQzJDb21wb25lbnRUaW1lT2Zmc2V0VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9USU1FX09GRlNFVFtdID0gImlucHV0LXN1cmZhY2UudGltZS1vZmZzZXQiOworCisvKioKKyAqIE1pbmltdW0gZnBzIGZvciBpbnB1dCBzdXJmYWNlLgorICoKKyAqIFJlcGVhdCBmcmFtZSB0byBtZWV0IHRoaXMuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhNaW5GcmFtZVJhdGU+IEMyUG9ydE1pbkZyYW1lUmF0ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfTUlOX0ZSQU1FX1JBVEVbXSA9ICJpbnB1dC1zdXJmYWNlLm1pbi1mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lc3RhbXAgYWRqdXN0bWVudCAob3ZlcnJpZGUpIGZvciBpbnB1dCBzdXJmYWNlIGJ1ZmZlcnMuIFRoZXNlIGNvbnRyb2wgdGhlIGlucHV0IHRpbWVzdGFtcAorICogZmVkIHRvIHRoZSBjb2RlYywgYnV0IGRvIG5vdCBpbXBhY3QgdGhlIG91dHB1dCB0aW1lc3RhbXAuCisgKi8KK3N0cnVjdCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QgeworICAgIC8vLyBjb250cm9sIG1vZGVzCisgICAgZW51bSBtb2RlX3QgOiB1aW50MzJfdDsKKworICAgIGlubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QoKTsKKworICAgIGlubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QobW9kZV90IG1vZGVfLCB1aW50NjRfdCB2YWx1ZV8pCisgICAgICAgIDogbW9kZShtb2RlXyksIHZhbHVlKHZhbHVlXykgeyB9CisKKyAgICBtb2RlX3QgbW9kZTsgICAgLy8vPCBjb250cm9sIG1vZGUKKyAgICB1aW50NjRfdCB2YWx1ZTsgLy8vPCBjb250cm9sIHZhbHVlIGZvciBnYXAgYmV0d2VlbiB0d28gdGltZXN0YW1wCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbWVzdGFtcEdhcEFkanVzdG1lbnQpCisgICAgQzJGSUVMRChtb2RlLCAibW9kZSIpCisgICAgQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikKK307CisKK0MyRU5VTShDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6Om1vZGVfdCwgdWludDMyX3QsCisgICAgTk9ORSwKKyAgICBNSU5fR0FQLAorICAgIEZJWEVEX0dBUCwKKyk7CisKK2lubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6OkMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCgpCisgICAgOiBtb2RlKEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6Tk9ORSksIHZhbHVlKDApIHsgfQorCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q+IEMyUG9ydFRpbWVzdGFtcEdhcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfVElNRVNUQU1QX0FESlVTVE1FTlRbXSA9ICJpbnB1dC1zdXJmYWNlLnRpbWVzdGFtcC1hZGp1c3RtZW50IjsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJDT05GSUdfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZmFkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkVOVU1fSF8KKyNkZWZpbmUgQzJFTlVNX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8X0MyTWFjcm9VdGlscy5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qKiBcZmlsZQorICogVG9vbHMgZm9yIGVhc2llciBlbnVtIHN1cHBvcnQuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBFTlVNRVJBVElPTiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIGlnbm9yaW5nIGVudW0gdmFsdWUgYXNzaWdubWVudCAoZS5nLiBib3RoICcoX0MyRW51bUNvbnN0KWtWYWx1ZSA9IHgnCisgKiBhbmQgJyhfQzJFbnVtQ29uc3Qpa1ZhbHVlJyB3aWxsIGV2YWwgdG8ga1ZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgX0MyRW51bUNvbnN0IHsKK3B1YmxpYzoKKyAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gVAorICAgIGlubGluZSBfQzJFbnVtQ29uc3QoVCB2YWx1ZSkgOiBfbVZhbHVlKHZhbHVlKSB7fQorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gVAorICAgIGlubGluZSBvcGVyYXRvciBUKCkgeyByZXR1cm4gX21WYWx1ZTsgfQorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gQzJWYWx1ZTo6UHJpbWl0aXZlCisgICAgaW5saW5lIG9wZXJhdG9yIEMyVmFsdWU6OlByaW1pdGl2ZSgpIHsgcmV0dXJuIChUKV9tVmFsdWU7IH0KKyAgICAvLyBpZ25vcmUgYXNzaWdubWVudCBhbmQgcmV0dXJuIFQgaGVyZSB0byBhdm9pZCBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIFQgbGF0ZXIKKyAgICBpbmxpbmUgVCAmb3BlcmF0b3IgPShUIHZhbHVlIF9fdW51c2VkKSB7IHJldHVybiBfbVZhbHVlOyB9Citwcml2YXRlOgorICAgIFQgX21WYWx1ZTsKK307CisKKy8vLyBtYXBwZXIgdG8gZ2V0IG5hbWUgb2YgZW51bQorLy8vIFxub3RlIHRoaXMgd2lsbCBjb250YWluIGFueSBpbml0aWFsaXphdGlvbiwgd2hpY2ggd2Ugd2lsbCByZW1vdmUgd2hlbiBjb252ZXJ0aW5nIHRvIGxvd2VyLWNhc2UKKyNkZWZpbmUgX0MyX0dFVF9FTlVNX05BTUUoeCwgeSkgI3gKKy8vLyBtYXBwZXIgdG8gZ2V0IHZhbHVlIG9mIGVudW0KKyNkZWZpbmUgX0MyX0dFVF9FTlVNX1ZBTFVFKHgsIHR5cGUpIChfQzJFbnVtQ29uc3Q8dHlwZT4peAorCisvLy8gXGVuZGNvbmQKKworY2xhc3MgX0MyRW51bVV0aWxzIHsKKyAgICBzdGF0aWMgQzJTdHJpbmcgY2FtZWxDYXNlVG9EYXNoZWQoQzJTdHJpbmcgbmFtZSk7CisKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplRW51bVZhbHVlTmFtZXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIF9wcmVmaXggPSBudWxscHRyKTsKKworICAgIGZyaWVuZCBjbGFzcyBDMlV0aWxUZXN0X0VudW1VdGlsc1Rlc3RfVGVzdDsKKworcHVibGljOgorICAgIC8vIHRoaXMgbWF5IG5vdCBiZSB1c2VkLi4uCisgICAgc3RhdGljIEMyX0hJREUgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHBhcnNlRW51bVZhbHVlc0Zyb21TdHJpbmcoQzJTdHJpbmdMaXRlcmFsIHZhbHVlKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIEMyX0hJREUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBzYW5pdGl6ZUVudW1WYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiB2YWx1ZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIHByZWZpeCA9IG51bGxwdHIpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplZE5hbWVzID0gc2FuaXRpemVFbnVtVmFsdWVOYW1lcyhuYW1lcywgcHJlZml4KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpICYmIGkgPCBzYW5pdGl6ZWROYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKHNhbml0aXplZE5hbWVzW2ldLCB2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorICAgIHN0YXRpYyBDMl9ISURFIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgY3VzdG9tRW51bVZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDMlN0cmluZ0xpdGVyYWwsIEU+PiBpdGVtcykgeworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzOworICAgICAgICBmb3IgKGF1dG8gJml0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKGl0ZW0uZmlyc3QsIGl0ZW0uc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXM7CisgICAgfQorfTsKKworI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorICAgIF9ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIG5hbWUsIHR5cGUsIHByZWZpeCwgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCisgICAgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihlbmFibGVkLCBuYW1lLCB0eXBlLCBwcmVmaXgsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIoZW5hYmxlZCwgbmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKKyAgICBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUiMjZW5hYmxlZChuYW1lLCB0eXBlLCBwcmVmaXgsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCit0ZW1wbGF0ZTw+IFwKK0MyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IG5hbWUgJnIgX191bnVzZWQpIHsgXAorICAgIHJldHVybiBfQzJFbnVtVXRpbHM6OnNhbml0aXplRW51bVZhbHVlcyggXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX1ZBTFVFLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgeyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9OQU1FLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgcHJlZml4KTsgXAorfQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUl9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikKKworI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIG5hbWVzKSBcCisgICAgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBuYW1lLCBuYW1lcykKKyNkZWZpbmUgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpIFwKKyAgICBfX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpCisjZGVmaW5lIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykgXAorICAgIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIjI2VuYWJsZWQobmFtZSwgbmFtZXMpCisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgbmFtZXMpIFwKK3RlbXBsYXRlPD4gXAorQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgbmFtZSAmciBfX3VudXNlZCkgeyBcCisgICAgcmV0dXJuIF9DMkVudW1VdGlsczo6Y3VzdG9tRW51bVZhbHVlcyggXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nTGl0ZXJhbCwgbmFtZT4+IG5hbWVzKTsgXAorfQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIG5hbWVzKQorCisvKioKKyAqIERlZmluZXMgYW4gZW51bSB0eXBlIHdpdGggdGhlIGRlZmF1bHQgbmFtZWQgdmFsdWUgbWFwcGVyLiBUaGUgZGVmYXVsdCBtYXBwZXIKKyAqIGZpbmRzIGFuZCByZW1vdmVzIHRoZSBsb25nZXN0IGNvbW1vbiBwcmVmaXggYWNyb3NzIGFsbCBvZiB0aGUgZW51bSB2YWx1ZSBuYW1lcywgYW5kCisgKiByZXBsYWNlcyBjYW1lbC1jYXNlIHNlcGFyYXRvcnMgd2l0aCBkYXNoZXMgKCctJykuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTShjMl9lbnVtX3QsIHVpbnQzMl90LAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICIxIiwgQzJfVkFMVUUyID0+ICIyIiwgLi4uCisgKiAgLy8gbG9uZ2VzdCBjb21tb24gcHJlZml4IGlzICJDMl9WQUxVRSIKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgZW51bSB0eXBlIChUaGlzIGNhbiBiZSBhbiBpbm5lciBjbGFzcyBlbnVtLikKKyAqIFxwYXJhbSB0eXBlIHVuZGVybHlpbmcgdHlwZQorICovCisjZGVmaW5lIEMyRU5VTShuYW1lLCB0eXBlLCAuLi4pIFwKK2VudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCitERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBudWxscHRyLCBfX1ZBX0FSR1NfXykKKworLyoqCisgKiBEZWZpbmVzIGFuIGVudW0gdHlwZSB3aXRoIHRoZSBkZWZhdWx0IG5hbWVkIHZhbHVlIG1hcHBlciBidXQgY3VzdG9tIHByZWZpeC4gVGhlIGRlZmF1bHQKKyAqIG1hcHBlciByZW1vdmVzIHRoZSBwcmVmaXggZnJvbSBhbGwgb2YgdGhlIGVudW0gdmFsdWUgbmFtZXMgKGlmIHByZXNlbnQpLCBhbmQKKyAqIGluc2VydHMgZGFzaGVzIGF0IGNhbWVsLWNhc2Ugc2VwYXJhdG9ycyAobG93SGlnaCBiZWNvbWVzIGxvdy1oaWdoKSBhbmQgYWxzbyByZXBsYWNlcworICogbm9uLWxlYWRpbmcgdW5kZXJzY29yZXMgd2l0aCBkYXNoZXMgKCctJykuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTV9DVVNUT01fUFJFRklYKGMyX2VudW1fdCwgdWludDMyX3QsICJDMl8iLAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICJWQUxVRTEiLCBDMl9WQUxVRTIgPT4gIlZBTFVFMiIsIC4uLgorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiBccGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBlbnVtIHR5cGUgKFRoaXMgY2FuIGJlIGFuIGlubmVyIGNsYXNzIGVudW0uKQorICogXHBhcmFtIHR5cGUgdW5kZXJseWluZyB0eXBlCisgKiBccGFyYW0gcHJlZml4IHByZWZpeCB0byByZW1vdmUKKyAqLworI2RlZmluZSBDMkVOVU1fQ1VTVE9NX1BSRUZJWChuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgX19WQV9BUkdTX18pCisKKy8qKgorICogRGVmaW5lcyBhbiBlbnVtIHR5cGUgd2l0aCBjdXN0b20gbmFtZXMuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTV9DVVNUT01fTkFNRVMoU29tZVN0cnVjdDo6YzJfZW51bV90LCB1aW50MzJfdCwgKHsKKyAqICAgICAgeyAiT25lIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUxIH0sCisgKiAgICAgIHsgIlR3byIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMiB9LAorICogICAgICB7ICJUaHJlZSIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMyB9IH0pLAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKgorICogIC8vIG5hbWVkIHZhbHVlcyBhcmU6IEMyX1ZBTFVFMSA9PiAiT25lIiwgQzJfVkFMVUUyID0+ICJUd28iLCAuLi4KKyAqICB+fn5+fn5+fn5+fn5+CisgKi8KKyNkZWZpbmUgQzJFTlVNX0NVU1RPTV9OQU1FUyhuYW1lLCB0eXBlLCBuYW1lcywgLi4uKSBcCitlbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAorREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihuYW1lLCBuYW1lcykKKworLyoqCisgKiBNYWtlIGVudW1zIHVzYWJsZSBhcyB0aGVpciBpbnRlZ3JhbCB0eXBlcy4KKyAqCisgKiBOb3RlOiB0aGlzIG1ha2VzIHRoZW0gbm90IHVzYWJsZSBpbiBwcmludGYoKQorICovCit0ZW1wbGF0ZTxjbGFzcyBFPgorc3RydWN0IEMyRWFzeUVudW0geworICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKKyAgICBFIHZhbHVlOworICAgIC8vIGRlZmluZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgRSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKEUgdmFsdWVfKSA6IHZhbHVlKHZhbHVlXykgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKFUgdmFsdWVfKSA6IHZhbHVlKEUodmFsdWVfKSkgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKCkgPSBkZWZhdWx0OworfTsKKworLy8gbWFrZSBDMkVhc3lFbnVtIGJlaGF2ZSBsaWtlIGEgcmVndWxhciBlbnVtCisKK25hbWVzcGFjZSBzdGQgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RydWN0IHVuZGVybHlpbmdfdHlwZTxDMkVhc3lFbnVtPEU+PiB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIHR5cGU7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RydWN0IGlzX2VudW08QzJFYXN5RW51bTxFPj4geworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSB0cnVlOworICAgIH07Cit9CisKKyNlbmRpZiAgLy8gQzJFTlVNX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2NGJmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCkBAIC0wLDAgKzEsMTY3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJQQVJBTV9IXworI2RlZmluZSBDMlBBUkFNX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKKy8vLyBAeworCisvLy8gXGRlZmdyb3VwIGludGVybmFsIEludGVybmFsIGhlbHBlcnMuCisKKy8qIQorICogXGZpbGUKKyAqIFBBUkFNRVRFUlM6IFNFVFRJTkdzLCBUVU5JTkdzLCBhbmQgSU5GT3MKKyAqID09PQorICoKKyAqIFRoZXNlIHJlcHJlc2VudCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wgYW5kIG1ldGFkYXRhIGluZm9ybWF0aW9uIGFuZCBhcmUgbGlrZWx5IGNvcGllZCBpbnRvCisgKiBrZXJuZWwgc3BhY2UuIFRoZXJlZm9yZSwgdGhlc2UgYXJlIEMtbGlrZSBzdHJ1Y3R1cmVzIGRlc2lnbmVkIHRvIGNhcnJ5IGp1c3QgYSBzbWFsbCBhbW91bnQgb2YKKyAqIGluZm9ybWF0aW9uLiBXZSBhcmUgdXNpbmcgQysrIHRvIGJlIGFibGUgdG8gYWRkIGNvbnN0cnVjdG9ycywgYXMgd2VsbCBhcyBub24tdmlydHVhbCBhbmQgY2xhc3MKKyAqIG1ldGhvZHMuCisgKgorICogPT1TcGVjaWZpY2F0aW9uIGRldGFpbHM6CisgKgorICogUmVzdHJpY3Rpb25zOgorICogICAtIG11c3QgYmUgUE9EIHN0cnVjdCwgZS5nLiBubyB2dGFibGUgKG5vIHZpcnR1YWwgZGVzdHJ1Y3RvcikKKyAqICAgLSBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBpbiA2NC1iaXQgYW5kIDMyLWJpdCBtb2RlIChubyBzaXplX3QpCisgKiAgIC0gYXMgc3VjaCwgbm8gcG9pbnRlciBtZW1iZXJzCisgKiAgIC0gc29tZSBjb21tb24gbWVtYmVyIGZpZWxkIG5hbWVzIGFyZSByZXNlcnZlZCBhcyB0aGV5IGFyZSBkZWZpbmVkIGFzIG1ldGhvZHMgZm9yIGFsbAorICogICAgIHBhcmFtZXRlcnM6CisgKiAgICAgdGhleSBhcmU6IHNpemUsIHR5cGUsIGtpbmQsIGluZGV4IGFuZCBzdHJlYW0KKyAqCisgKiBCZWhhdmlvcjoKKyAqIC0gUGFyYW1zIGNhbiBiZSBnbG9iYWwgKG5vdCByZWxhdGVkIHRvIGlucHV0IG9yIG91dHB1dCksIHJlbGF0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0LAorICogICBvciByZWxhdGVkIHRvIGFuIGlucHV0L291dHB1dCBzdHJlYW0uCisgKiAtIEFsbCBwYXJhbXMgYXJlIHF1ZXJpZWQvc2V0IHVzaW5nIGEgdW5pcXVlIHBhcmFtIGluZGV4LCB3aGljaCBpbmNvcnBvcmF0ZXMgYSBwb3RlbnRpYWwgc3RyZWFtCisgKiAgIGluZGV4IGFuZC9vciBwb3J0LgorICogLSBRdWVyeWluZyAoc3VwcG9ydGVkKSBwYXJhbXMgTVVTVCBuZXZlciBmYWlsLgorICogLSBBbGwgcGFyYW1zIE1VU1QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4KKyAqIC0gSWYgc29tZSBmaWVsZHMgaGF2ZSAidW5zdXBwb3J0ZWQiIG9yICJpbnZhbGlkIiB2YWx1ZXMgZHVyaW5nIHNldHRpbmcsIHRoaXMgU0hPVUxEIGJlCisgKiAgIGNvbW11bmljYXRlZCB0byB0aGUgYXBwLgorICogICBhKSBJZGVhbGx5LCB0aGlzIHNob3VsZCBiZSBhdm9pZGVkLiAgV2hlbiBzZXR0aW5nIHBhcmFtZXRlcnMsIGluIGdlbmVyYWwsIGNvbXBvbmVudCBzaG91bGQgZG8KKyAqICAgICAiYmVzdCBlZmZvcnQiIHRvIGFwcGx5IGFsbCBzZXR0aW5ncy4gSXQgc2hvdWxkIGNoYW5nZSAiaW52YWxpZC91bnN1cHBvcnRlZCIgdmFsdWVzIHRvIHRoZQorICogICAgIG5lYXJlc3Qgc3VwcG9ydGVkIHZhbHVlcy4KKyAqICAgLSBUaGlzIGlzIGNvbW11bmljYXRlZCB0byB0aGUgY2xpZW50IGJ5IGNoYW5naW5nIHRoZSBzb3VyY2UgdmFsdWVzIGluIHR1bmUoKS8KKyAqICAgICBjb25maWd1cmUoKS4KKyAqICAgYikgSWYgZmFsbGluZyBiYWNrIHRvIGEgc3VwcG9ydGVkIHZhbHVlIGlzIGFic29sdXRlbHkgaW1wb3NzaWJsZSwgdGhlIGNvbXBvbmVudCBTSEFMTCByZXR1cm4KKyAqICAgICBhbiBlcnJvciBmb3IgdGhlIHNwZWNpZmljIHNldHRpbmcsIGJ1dCBzaG91bGQgY29udGludWUgdG8gYXBwbHkgb3RoZXIgc2V0dGluZ3MuCisgKiAgICAgVE9ETzogdGhpcyBjdXJyZW50bHkgbWF5IHJlc3VsdCBpbiB1bmludGVuZGVkIHJlc3VsdHMuCisgKgorICogKipOT1RFOioqIHVubGlrZSBPTVgsIHBhcmFtcyBhcmUgbm90IHZlcnNpb25lZC4gSW5zdGVhZCwgYSBuZXcgc3RydWN0IHdpdGggbmV3IHBhcmFtIGluZGV4CisgKiBTSEFMTCBiZSBhZGRlZCBhcyBuZXcgdmVyc2lvbnMgYXJlIHJlcXVpcmVkLgorICoKKyAqIFRoZSBwcm9wZXIgc3VidHlwZSAoU2V0dGluZywgSW5mbyBvciBQYXJhbSkgaXMgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGNsYXNzIHR5cGUuIERlZmluZSBzdHJ1Y3RzCisgKiB0byBkZWZpbmUgbXVsdGlwbGUgc3VidHlwZWQgdmVyc2lvbnMgb2YgcmVsYXRlZCBwYXJhbWV0ZXJzLgorICoKKyAqID09SW1wbGVtZW50YXRpb24gZGV0YWlsczoKKyAqCisgKiAtIFVzZSBtYWNyb3MgdG8gZGVmaW5lIHBhcmFtZXRlcnMKKyAqIC0gQWxsIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogICAtIFRoaXMgaXMgb25seSB1c2VkIGZvciBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyBpbiBzb3VyY2UgKGUuZy4gd2lsbCBub3QgYmUgdXNlZAorICogICAgIHdoZW4gYnVpbGRpbmcgYSBwYXJhbWV0ZXIgYnkgdGhlIGZyYW1ld29yayBmcm9tIGtleS92YWx1ZSBwYWlycy4pCisgKi8KKworLy8vIFxpbmdyb3VwIGludGVybmFsCisKKy8qKgorICogUGFyYW1ldGVyIGJhc2UgY2xhc3MuCisgKi8KK3N0cnVjdCBDMlBhcmFtIHsKKyAgICAvLyBwYXJhbSBpbmRleCBlbmNvbXBhc3NlcyB0aGUgZm9sbG93aW5nOgorICAgIC8vCisgICAgLy8gLSBraW5kIChzZXR0aW5nLCB0dW5pbmcsIGluZm8sIHN0cnVjdCkKKyAgICAvLyAtIHNjb3BlCisgICAgLy8gICAtIGRpcmVjdGlvbiAoZ2xvYmFsLCBpbnB1dCwgb3V0cHV0KQorICAgIC8vICAgLSBzdHJlYW0gZmxhZworICAgIC8vICAgLSBzdHJlYW0gSUQgKHVzdWFsbHkgMCkKKyAgICAvLyAtIGFuZCB0aGUgcGFyYW1ldGVyJ3MgdHlwZSAoY29yZSBpbmRleCkKKyAgICAvLyAgIC0gZmxleGlibGUgcGFyYW1ldGVyIGZsYWcKKyAgICAvLyAgIC0gdmVuZG9yIGV4dGVuc2lvbiBmbGFnCisgICAgLy8gICAtIHR5cGUgaW5kZXggKHRoaXMgaW5jbHVkZXMgdGhlIHZlbmRvciBleHRlbnNpb24gZmxhZykKKyAgICAvLworICAgIC8vIGxheW91dDoKKyAgICAvLworICAgIC8vICAgICAgICBraW5kIDogPC0tLS0tLS0gc2NvcGUgLS0tLS0tLT4gOiA8LS0tLS0gY29yZSBpbmRleCAtLS0tLT4KKyAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tfC0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgICAvLyAgICAgIHwga2luZCB8IGRpciB8IC0gfHN0cmVhbXxzdHJlYW1JRHxmbGV4fHZlbmRvcnwgIHR5cGUgaW5kZXggIHwKKyAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgICAvLyAgYml0OiAzMS4uMzAgMjkuMjggICAgICAgMjUgICAyNCAuLiAxNyAgMTYgICAgMTUgICAxNCAgICAuLiAgICAgMAorICAgIC8vCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQzJQYXJhbSBraW5kcywgdXNhYmxlIGFzIGJpdG1hcHMuCisgICAgICovCisgICAgZW51bSBraW5kX3QgOiB1aW50MzJfdCB7CisgICAgICAgIE5PTkUgICAgPSAwLAorICAgICAgICBTVFJVQ1QgID0gKDEgPDwgMCksCisgICAgICAgIElORk8gICAgPSAoMSA8PCAxKSwKKyAgICAgICAgU0VUVElORyA9ICgxIDw8IDIpLAorICAgICAgICBUVU5JTkcgID0gKDEgPDwgMykgfCBTRVRUSU5HLCAvLyB0dW5pbmdzIGFyZSBzZXR0aW5ncworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyYW1ldGVyIHR5cGUgaW5kZXggc3BlY2lmaWVzIHRoZSB1bmRlcmx5aW5nIHBhcmFtZXRlciB0eXBlIG9mIGEgcGFyYW1ldGVyIGFzCisgICAgICogYW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlciB0eXBlcyBhcmUgZGl2aWRlZCBpbnRvIHR3byBncm91cHM6IHBsYXRmb3JtIHR5cGVzIGFuZCB2ZW5kb3IgdHlwZXMuCisgICAgICoKKyAgICAgKiBQbGF0Zm9ybSB0eXBlcyBhcmUgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0gYW5kIGFyZSBjb21tb24gZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgICAgICoKKyAgICAgKiBWZW5kb3IgdHlwZXMgYXJlIGRlZmluZWQgYnkgZWFjaCB2ZW5kb3JzLCBzbyB0aGV5IG1heSBkaWZmZXIgYmV0d2VlbiBpbXBsZW1lbnRhdGlvbnMuCisgICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB2ZW5kb3IgdHlwZXMgYmUgdGhlIHNhbWUgZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMgYnkgYSBzcGVjaWZpYworICAgICAqIHZlbmRvci4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHVpbnQzMl90IHR5cGVfaW5kZXhfdDsKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgVFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQgPSAweDAwMDA4MDAwLCAvLy88IHZlbmRvciBpbmRpY2VzIFNIQUxMIHN0YXJ0IGFmdGVyIHRoaXMKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29yZSBpbmRleCBpcyB0aGUgdW5kZXJseWluZyBwYXJhbWV0ZXIgdHlwZSBmb3IgYSBwYXJhbWV0ZXIuIEl0IGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlCisgICAgICogbGF5b3V0IG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbXBvbmVudCBvciBwYXJhbWV0ZXIga2luZC9zY29wZS4KKyAgICAgKgorICAgICAqIEl0IGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kIGRpc3Rpbmd1aXNoIGdsb2JhbCBwYXJhbWV0ZXJzLCBhbmQgYWxzbyBwYXJhbWV0ZXJzIG9uIGEgZ2l2ZW4KKyAgICAgKiBwb3J0IG9yIHN0cmVhbS4gVGhleSBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhlIHNldCBvZiBnbG9iYWwgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBmb3IgdGhlCisgICAgICogc2V0IG9mIHBhcmFtZXRlcnMgb24gZWFjaCBwb3J0IG9yIGVhY2ggc3RyZWFtLCBidXQgdGhlIHNhbWUgY29yZSBpbmRleCBjYW4gYmUgdXNlZCBmb3IKKyAgICAgKiBwYXJhbWV0ZXJzIG9uIGRpZmZlcmVudCBzdHJlYW1zIG9yIHBvcnRzLCBhcyB3ZWxsIGFzIGZvciBnbG9iYWwgcGFyYW1ldGVycyBhbmQgcG9ydC9zdHJlYW0KKyAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogTXVsdGlwbGUgcGFyYW1ldGVyIHR5cGVzIGNhbiBzaGFyZSB0aGUgc2FtZSBsYXlvdXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGUgbGF5b3V0IGZvciBhbGwgcGFyYW1ldGVycyB3aXRoIHRoZSBzYW1lIGNvcmUgaW5kZXggYWNyb3NzIGFsbCBjb21wb25lbnRzIG11c3QKKyAgICAgKiBiZSBpZGVudGljYWwuCisgICAgICovCisgICAgc3RydWN0IENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBJU19GTEVYX0ZMQUcgPSAweDAwMDEwMDAwLAorICAgICAgICB9OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgS0lORF9NQVNLICAgICAgPSAweEMwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TVFJVQ1QgICAgPSAweDAwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9UVU5JTkcgICAgPSAweDQwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TRVRUSU5HICAgPSAweDgwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9JTkZPICAgICAgPSAweEMwMDAwMDAwLAorCisgICAgICAgICAgICBESVJfTUFTSyAgICAgICA9IDB4MzAwMDAwMDAsCisgICAgICAgICAgICBESVJfR0xPQkFMICAgICA9IDB4MjAwMDAwMDAsCisgICAgICAgICAgICBESVJfVU5ERUZJTkVEICA9IERJUl9NQVNLLCAvLyBNVVNUIGhhdmUgYWxsIGJpdHMgc2V0CisgICAgICAgICAgICBESVJfSU5QVVQgICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBESVJfT1VUUFVUICAgICA9IDB4MTAwMDAwMDAsCisKKyAgICAgICAgICAgIElTX1NUUkVBTV9GTEFHICA9IDB4MDIwMDAwMDAsCisgICAgICAgICAgICBTVFJFQU1fSURfTUFTSyAgPSAweDAxRkUwMDAwLAorICAgICAgICAgICAgU1RSRUFNX0lEX1NISUZUID0gMTcsCisgICAgICAgICAgICBNQVhfU1RSRUFNX0lEICAgPSBTVFJFQU1fSURfTUFTSyA+PiBTVFJFQU1fSURfU0hJRlQsCisgICAgICAgICAgICBTVFJFQU1fTUFTSyAgICAgPSBJU19TVFJFQU1fRkxBRyB8IFNUUkVBTV9JRF9NQVNLLAorCisgICAgICAgICAgICBJU19WRU5ET1JfRkxBRyAgPSAweDAwMDA4MDAwLAorICAgICAgICAgICAgVFlQRV9JTkRFWF9NQVNLID0gMHgwMDAwRkZGRiwKKyAgICAgICAgICAgIENPUkVfTUFTSyAgICAgICA9IFRZUEVfSU5ERVhfTUFTSyB8IElTX0ZMRVhfRkxBRywKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLy8vIGNvbnN0cnVjdG9yL2NvbnZlcnNpb24gZnJvbSB1aW50MzJfdAorICAgICAgICBpbmxpbmUgQ29yZUluZGV4KHVpbnQzMl90IGluZGV4KSA6IG1JbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBDb3JlSW5kZXgodWludDY0X3QgaW5kZXgpID0gZGVsZXRlOworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSB2ZW5kb3IgZXh0ZW5zaW9uIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1ZFTkRPUl9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGZsZXhpYmxlIHBhcmFtZXRlciAod2l0aCB2YXJpYWJsZSBzaXplKQorICAgICAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfRkxFWF9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXgKKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleCBhbmQgdGhlIGZsZXhpYmxlIGZsYWcuCisgICAgICAgIGlubGluZSB1aW50MzJfdCBjb3JlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBDT1JFX01BU0s7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGUgaW5kZXgKKyAgICAgICAgaW5saW5lIHR5cGVfaW5kZXhfdCB0eXBlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBUWVBFX0lOREVYX01BU0s7IH0KKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQ29yZUluZGV4LCBtSW5kZXgsIENPUkVfTUFTSykKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdWludDMyX3QgbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlIGVuY29tcGFzc2VzIHRoZSBwYXJhbWV0ZXIncyBraW5kICh0dW5pbmcsIHNldHRpbmcsIGluZm8pLCBpdHMgc2NvcGUgKHdoZXRoZXIgdGhlCisgICAgICogcGFyYW1ldGVyIGlzIGdsb2JhbCwgaW5wdXQgb3Igb3V0cHV0LCBhbmQgd2hldGhlciBpdCBpcyBmb3IgYSBzdHJlYW0pIGFuZCB0aGUgaXRzIGJhc2UKKyAgICAgKiBpbmRleCAod2hpY2ggYWxzbyBkZXRlcm1pbmVzIGl0cyBsYXlvdXQpLgorICAgICAqLworICAgIHN0cnVjdCBUeXBlIDogcHVibGljIENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBnbG9iYWwgcGFyYW1ldGVyIChub3QgZm9yIGlucHV0IG5vciBvdXRwdXQpCisgICAgICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfR0xPQkFMOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gaW5wdXQgb3IgaW5wdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX0lOUFVUOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gb3V0cHV0IG9yIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX09VVFBVVDsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvclN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1NUUkVBTV9GTEFHOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JQb3J0KCkgY29uc3QgICB7IHJldHVybiAhZm9yU3RyZWFtKCkgJiYgIWlzR2xvYmFsKCk7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgKH5TVFJFQU1fSURfTUFTSyk7IH0KKworICAgICAgICAvLy8gcmV0dXJuIHRoZSBraW5kIChzdHJ1Y3QsIGluZm8sIHNldHRpbmcgb3IgdHVuaW5nKSBvZiB0aGlzIHBhcmFtCisgICAgICAgIGlubGluZSBraW5kX3Qga2luZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCAobUluZGV4ICYgS0lORF9NQVNLKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NUUlVDVDogcmV0dXJuIFNUUlVDVDsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfSU5GTzogcmV0dXJuIElORk87CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NFVFRJTkc6IHJldHVybiBTRVRUSU5HOworICAgICAgICAgICAgICAgIGNhc2UgS0lORF9UVU5JTkc6IHJldHVybiBUVU5JTkc7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PTkU7IC8vIHNob3VsZCBub3QgaGFwcGVuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQzMl90IGluZGV4KSA6IENvcmVJbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoVHlwZSwgbUluZGV4LCB+U1RSRUFNX0lEX01BU0spCisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgLy8gZm9yIHNldFBvcnQoKQorICAgICAgICBmcmllbmQgc3RydWN0IEMyVHVuaW5nOyAgLy8gZm9yIEtJTkRfVFVOSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJTZXR0aW5nOyAvLyBmb3IgS0lORF9TRVRUSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJJbmZvOyAgICAvLyBmb3IgS0lORF9JTkZPCisgICAgICAgIC8vIGZvciBESVJfR0xPQkFMCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyR2xvYmFsUGFyYW07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyAgIC8vIGZvciBrRGlyKgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlN0cmVhbVBhcmFtOyAvLyBmb3Iga0RpcioKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcG9ydC9zdHJlYW0gZGlyZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBkaXJlY3Rpb24gKGUuZy4gaXQgaXMgZ2xvYmFsIHBhcmFtKS4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBib29sIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIGlmIChpc0dsb2JhbCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgfkRJUl9NQVNLKSB8IChvdXRwdXQgPyBESVJfT1VUUFVUIDogRElSX0lOUFVUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBpbmRleCBlbmNvbXBhc3NlcyBhbGwgcmVtYWluaW5nIGluZm9ybWF0aW9uOiBiYXNpY2FsbHkgdGhlIHN0cmVhbSBJRC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSW5kZXggOiBwdWJsaWMgVHlwZSB7CisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBhcyB1aW50MzJfdAorICAgICAgICBpbmxpbmUgb3BlcmF0b3IgdWludDMyX3QoKSBjb25zdCB7IHJldHVybiBtSW5kZXg7IH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50MzJfdCBpbmRleCkgOiBUeXBlKGluZGV4KSB7IH0KKworICAgICAgICAvLy8gY29weSBjb25zdHJ1Y3RvcgorICAgICAgICBpbmxpbmUgSW5kZXgoY29uc3QgSW5kZXggJmluZGV4KSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHN0cmVhbSBJRCBvciB+MCBpZiBub3QgYSBzdHJlYW0KKyAgICAgICAgaW5saW5lIHVuc2lnbmVkIHN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDogfjBVOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYW4gaW5kZXggd2l0aCBzdHJlYW0gZmllbGQgc2V0IHRvIGdpdmVuIHN0cmVhbS4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhTdHJlYW0odW5zaWduZWQgc3RyZWFtKSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIGl4OworICAgICAgICB9CisKKyAgICAgICAgLy8vIHNldHMgdGhlIHBvcnQgKGRpcmVjdGlvbikuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhQb3J0KGJvb2wgb3V0cHV0KSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBpeDsKKyAgICAgICAgfQorCisgICAgICAgIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhJbmRleCwgbUluZGV4KQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlBhcmFtOyAgICAgICAgICAgLy8gZm9yIHNldFN0cmVhbSwgTWFrZVN0cmVhbUlkLCBpc1ZhbGlkCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZCwgZS5nLiBkaXJlY3Rpb24gaXMgbm90IHVuZGVmaW5lZCBBTkQKKyAgICAgICAgICogc3RyZWFtIGlzIDAgaWYgbm90IGEgc3RyZWFtIHBhcmFtLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIFR5cGU6OmlzVmFsaWQgKGV2ZW4gdGhvdWdoIHNvbWUgb2YgdGhpcyBjaGVjayBjb3VsZCBiZQorICAgICAgICAgICAgLy8gcGVyZm9ybWVkIG9uIHR5cGVzKSBhcyB0aGlzIGlzIG9ubHkgdXNlZCBvbiBpbmRleC4uLgorICAgICAgICAgICAgcmV0dXJuIChmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDwgTUFYX1NUUkVBTV9JRCA6IHJhd1N0cmVhbSgpID09IDApCisgICAgICAgICAgICAgICAgICAgICYmIChtSW5kZXggJiBESVJfTUFTSykgIT0gRElSX1VOREVGSU5FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSByYXcgc3RyZWFtIElEIGZpZWxkCisgICAgICAgIGlubGluZSB1bnNpZ25lZCByYXdTdHJlYW0oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1JbmRleCAmIFNUUkVBTV9JRF9NQVNLKSA+PiBTVFJFQU1fSURfU0hJRlQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtSWQgYml0ZmllbGQgZm9yIGEgZ2l2ZW4gfHN0cmVhbXwuIElmIHN0cmVhbSBpcyBpbnZhbGlkLAorICAgICAgICAvLy8gcmV0dXJucyBhbiBpbnZhbGlkIGJpdGZpZWxkLgorICAgICAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IE1ha2VTdHJlYW1JZCh1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgICAgIC8vIHNhdHVyYXRlIHN0cmVhbSBJRCAobWF4IHZhbHVlIGlzIGludmFsaWQpCisgICAgICAgICAgICBpZiAoc3RyZWFtID4gTUFYX1NUUkVBTV9JRCkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IE1BWF9TVFJFQU1fSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA8PCBTVFJFQU1fSURfU0hJRlQpICYgU1RSRUFNX0lEX01BU0s7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBjb252ZXJ0VG9TdHJlYW0oYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5ESVJfTUFTSykgfCBJU19TVFJFQU1fRkxBRzsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBzZXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb1BvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKTsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb0dsb2JhbCgpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKSB8IERJUl9HTE9CQUw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgc3RyZWFtIGluZGV4LgorICAgICAgICAgKiBccmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBpbmRleCAoZS5nLiBub3QgYSBzdHJlYW0gcGFyYW0pLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgaWYgKGZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5TVFJFQU1fSURfTUFTSykgfCBNYWtlU3RyZWFtSWQoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+c3RyZWFtKCkgPCBNQVhfU1RSRUFNX0lEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworcHVibGljOgorICAgIC8vIHB1YmxpYyBnZXR0ZXJzIGZvciBJbmRleCBtZXRob2RzCisKKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgdmVuZG9yIGV4dGVuc2lvbiBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWZW5kb3IoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBmbGV4aWJsZSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0ZsZXhpYmxlKCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZ2xvYmFsIHBhcmFtZXRlciAobm90IGZvciBpbnB1dCBub3Igb3V0cHV0KQorICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0dsb2JhbCgpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBpbnB1dCBvciBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9ySW5wdXQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvcklucHV0KCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGFuIG91dHB1dCBvciBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9yT3V0cHV0KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JTdHJlYW0oKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvclBvcnQoKSBjb25zdCAgIHsgcmV0dXJuIF9tSW5kZXguZm9yUG9ydCgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtIElEIG9yIH4wIGlmIG5vdCBhIHN0cmVhbQorICAgIGlubGluZSB1bnNpZ25lZCBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBfbUluZGV4LnN0cmVhbSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgaW5saW5lIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXgudHlwZSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAvLy8gXHRvZG86IHNob3VsZCB3ZSByZXN0cmljdCB0aGlzIHRvIEMyUGFyYW1GaWVsZD8KKyAgICBpbmxpbmUgdWludDMyX3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiAodWludDMyX3QpX21JbmRleDsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgQ29yZUluZGV4IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguY29yZUluZGV4KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBraW5kIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgaW5saW5lIGtpbmRfdCBraW5kKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5raW5kKCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgb3IgMCBpZiB0aGUgcGFyYW1ldGVyIGlzIGludmFsaWQKKyAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgdmFsaWQKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWYWxpZCgpICYmIF9tU2l6ZSA+IDA7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICAgIGlubGluZSBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciBib29sKCk7IH0KKworICAgIC8vIGVxdWFsaXR5IGlzIGRvbmUgYnkgbWVtY21wICh1c2UgZXF1YWxzKCkgdG8gcHJldmVudCBhbnkgb3ZlcnJlYWQpCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBlcXVhbHMobykgJiYgbWVtY21wKHRoaXMsICZvLCBfbVNpemUpID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJQYXJhbSAmbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0obyk7IH0KKworICAgIC8vLyBzYWZlKHIpIHR5cGUgY2FzdCBmcm9tIHBvaW50ZXIgYW5kIHNpemUKKyAgICBpbmxpbmUgc3RhdGljIEMyUGFyYW0qIEZyb20odm9pZCAqYWRkciwgc2l6ZV90IGxlbikgeworICAgICAgICAvLyBfbVNpemUgbXVzdCBmaXQgaW50byBzaXplLCBidXQgcmVhbGx5IEMyUGFyYW0gbXVzdCBhbHNvIHRvIGJlIGEgdmFsaWQgcGFyYW0KKyAgICAgICAgaWYgKGxlbiA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gKEMyUGFyYW0qKWFkZHI7CisgICAgICAgIGlmIChwYXJhbS0+X21TaXplICE9IGxlbikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG1hbmFnZWQgY2xvbmUgb2YgfG9yaWd8IGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weShjb25zdCBDMlBhcmFtICZvcmlnKSB7CisgICAgICAgIGlmIChvcmlnLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB2b2lkICptZW0gPSA6Om9wZXJhdG9yIG5ldyAob3JpZy5zaXplKCkpOworICAgICAgICBDMlBhcmFtICpwYXJhbSA9IG5ldyAobWVtKSBDMlBhcmFtKG9yaWcuc2l6ZSgpLCBvcmlnLl9tSW5kZXgpOworICAgICAgICBwYXJhbS0+dXBkYXRlRnJvbShvcmlnKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPihwYXJhbSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBzdHJlYW0gcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzU3RyZWFtKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IENvcHkob3JpZyk7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBjb3B5LT5fbUluZGV4LmNvbnZlcnRUb1N0cmVhbShvdXRwdXQsIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBwb3J0IHBhcmFtZXRlciBhdCBoZWFwLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IENvcHlBc1BvcnQoY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9Qb3J0KG91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBnbG9iYWwgcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzR2xvYmFsKGNvbnN0IEMyUGFyYW0gJm9yaWcpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9HbG9iYWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyNpZiAwCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUCwgY2xhc3M9ZGVjbHR5cGUoQzJQYXJhbShQKCkpKT4KKyAgICBQICpBcygpIHsgcmV0dXJuIFA6OkZyb20odGhpcyk7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQPgorICAgIGNvbnN0IFAgKkFzKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBQKj4oUDo6RnJvbShjb25zdF9jYXN0PEMyUGFyYW0qPih0aGlzKSkpOyB9CisjZW5kaWYKKworcHJvdGVjdGVkOgorICAgIC8vLyBzZXRzIHRoZSBzdHJlYW0gZmllbGQuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgIHJldHVybiBfbUluZGV4LnNldFN0cmVhbShzdHJlYW0pOworICAgIH0KKworICAgIC8vLyBzZXRzIHRoZSBwb3J0IChkaXJlY3Rpb24pLiBSZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCisgICAgaW5saW5lIGJvb2wgc2V0UG9ydChib29sIG91dHB1dCkgeworICAgICAgICByZXR1cm4gX21JbmRleC5zZXRQb3J0KG91dHB1dCk7CisgICAgfQorCitwdWJsaWM6CisgICAgLy8vIGludmFsaWRhdGUgdGhpcyBwYXJhbWV0ZXIuIFRoZXJlIGlzIG5vIHJlY292ZXJ5IGZyb20gdGhpcyBjYWxsOyBlLmcuIHBhcmFtZXRlcgorICAgIC8vLyBjYW5ub3QgYmUgJ2NvcnJlY3RlZCcgdG8gYmUgdmFsaWQuCisgICAgaW5saW5lIHZvaWQgaW52YWxpZGF0ZSgpIHsgX21TaXplID0gMDsgfQorCisgICAgLy8gaWYgb3RoZXIgaXMgdGhlIHNhbWUga2luZCBvZiAodmFsaWQpIHBhcmFtIGFzIHRoaXMsIGNvcHkgaXQgaW50byB0aGlzIGFuZCByZXR1cm4gdHJ1ZS4KKyAgICAvLyBvdGhlcndpc2UsIGRvIG5vdCBjb3B5IGFueXRoaW5nLCBhbmQgcmV0dXJuIGZhbHNlLgorICAgIGlubGluZSBib29sIHVwZGF0ZUZyb20oY29uc3QgQzJQYXJhbSAmb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyLl9tU2l6ZSA8PSBfbVNpemUgJiYgb3RoZXIuX21JbmRleCA9PSBfbUluZGV4ICYmIF9tU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweSh0aGlzLCAmb3RoZXIsIG90aGVyLl9tU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgLy8gcmV0dXJucyB8b3wgaWYgaXQgaXMgYSBudWxsIHB0ciwgb3IgaWYgY2FuIHN1aXRhYmx5IGJlIGEgcGFyYW0gb2YgZ2l2ZW4gfHR5cGV8IChlLmcuIGhhcworICAgIC8vIHNhbWUgdHlwZSAoaWdub3Jpbmcgc3RyZWFtIElEKSwgYW5kIHNpemUpLiBPdGhlcndpc2UsIHJldHVybnMgbnVsbC4gSWYgfGNoZWNrRGlyfCBpcyBmYWxzZSwKKyAgICAvLyBhbGxvdyB1bmRlZmluZWQgb3IgZGlmZmVyZW50IGRpcmVjdGlvbiAoZS5nLiBhcyBjb25zdHJ1Y3RlZCBmcm9tIEMyUG9ydFBhcmFtKCkgdnMuCisgICAgLy8gQzJQb3J0UGFyYW06OmlucHV0KSwgYnV0IHN0aWxsIHJlcXVpcmUgZXF1aXZhbGVudCB0eXBlIChzdHJlYW0sIHBvcnQgb3IgZ2xvYmFsKTsgb3RoZXJ3aXNlLAorICAgIC8vIHJldHVybiBudWxsLgorICAgIGlubGluZSBzdGF0aWMgY29uc3QgQzJQYXJhbSogSWZTdWl0YWJsZSgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0qIG8sIHNpemVfdCBzaXplLCBUeXBlIHR5cGUsIHNpemVfdCBmbGV4U2l6ZSA9IDAsIGJvb2wgY2hlY2tEaXIgPSB0cnVlKSB7CisgICAgICAgIGlmIChvID09IG51bGxwdHIgfHwgby0+X21TaXplIDwgc2l6ZSB8fCAoZmxleFNpemUgJiYgKChvLT5fbVNpemUgLSBzaXplKSAlIGZsZXhTaXplKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKGNoZWNrRGlyKSB7CisgICAgICAgICAgICByZXR1cm4gby0+X21JbmRleC50eXBlKCkgPT0gdHlwZS5tSW5kZXggPyBvIDogbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChvLT5fbUluZGV4LmlzR2xvYmFsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoby0+X21JbmRleC50eXBlKCkgXiB0eXBlLm1JbmRleCkgJiB+VHlwZTo6RElSX01BU0spID8gbnVsbHB0ciA6IG87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYmFzZSBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBDMlBhcmFtKHVpbnQzMl90IHBhcmFtU2l6ZSwgSW5kZXggcGFyYW1JbmRleCkKKyAgICAgICAgOiBfbVNpemUocGFyYW1TaXplKSwKKyAgICAgICAgICBfbUluZGV4KHBhcmFtSW5kZXgpIHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgbWVtc2V0KHRoaXMgKyAxLCAwLCBwYXJhbVNpemUgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIGJhc2UgY29uc3RydWN0b3Igd2l0aCBzdHJlYW0gc2V0CisgICAgaW5saW5lIEMyUGFyYW0odWludDMyX3QgcGFyYW1TaXplLCBJbmRleCBwYXJhbUluZGV4LCB1bnNpZ25lZCBzdHJlYW0pCisgICAgICAgIDogX21TaXplKHBhcmFtU2l6ZSksCisgICAgICAgICAgX21JbmRleChwYXJhbUluZGV4IHwgSW5kZXg6Ok1ha2VTdHJlYW1JZChzdHJlYW0pKSB7CisgICAgICAgIGlmIChwYXJhbVNpemUgPiBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIG1lbXNldCh0aGlzICsgMSwgMCwgcGFyYW1TaXplIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHxvfCBoYXMgdGhlIHNhbWUgc2l6ZSBhbmQgaW5kZXggYXMgdGhpcy4gVGhpcyBwZXJmb3JtcyB0aGUKKyAgICAvLy8gYmFzaWMgY2hlY2sgZm9yIGVxdWFsaXR5LgorICAgIGlubGluZSBib29sIGVxdWFscyhjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVNpemUgPT0gby5fbVNpemUgJiYgX21JbmRleCA9PSBvLl9tSW5kZXg7CisgICAgfQorCisgICAgdWludDMyX3QgX21TaXplOworICAgIEluZGV4IF9tSW5kZXg7Cit9OworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBhbGxvdyBDMlBhcmFtcyBhY2Nlc3MgdG8gcHJpdmF0ZSBtZXRob2RzLCBlLmcuIGNvbnN0cnVjdG9ycworI2RlZmluZSBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJHbG9iYWxQYXJhbTsgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJTdHJlYW1QYXJhbTsgXAorCisvKioKKyAqIFNldHRpbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMlNldHRpbmcgOiBwdWJsaWMgQzJQYXJhbSB7Citwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTZXR0aW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlBhcmFtKGFyZ3MuLi4pIHsgfQorcHVibGljOiAvLyBUT0RPCisgICAgZW51bSA6IHVpbnQzMl90IHsgUEFSQU1fS0lORCA9IFR5cGU6OktJTkRfU0VUVElORyB9OworfTsKKworLyoqCisgKiBUdW5pbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMlR1bmluZyA6IHB1YmxpYyBDMlNldHRpbmcgeworcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyVHVuaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlNldHRpbmcoYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9UVU5JTkcgfTsKK307CisKKy8qKgorICogSW5mbyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMySW5mbyA6IHB1YmxpYyBDMlBhcmFtIHsKK3Byb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkluZm8oY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyUGFyYW0oYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9JTkZPIH07Cit9OworCisvKioKKyAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgZmllbGQgaW4gYW4gYXJiaXRyYXJ5IHN0cnVjdHVyZS4KKyAqCisgKiBcbm90ZSBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGRpZmZlcmVudGx5IGluIEMyRmllbGREZXNjcmlwdG9yIHRvCisgKiBpZGVudGlmeSBhcnJheSBmaWVsZHMsIHN1Y2ggdGhhdCBfbVNpemUgaXMgdGhlIHNpemUgb2YgZWFjaCBlbGVtZW50LiBUaGlzIGlzCisgKiBiZWNhdXNlIHRoZSBmaWVsZCBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZSBhcnJheS1sZW5ndGgsIGFuZCB3ZSB3YW50IHRvIGtlZXAKKyAqIGEgcmVsZXZhbnQgZWxlbWVudCBzaXplIGZvciB2YXJpYWJsZSBsZW5ndGggYXJyYXlzLgorICovCitzdHJ1Y3QgX0MyRmllbGRJZCB7CisvL3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciBDMkZpZWxkRGVzY3JpcHRvciB0aGF0IHJlbW92ZXMgdGhlIGFycmF5IGV4dGVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gb2Zmc2V0IHBvaW50ZXIgdG8gdGhlIGZpZWxkIGluIGFuIG9iamVjdCBhdCBhZGRyZXNzIDAuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoVCogb2Zmc2V0KQorICAgICAgICA6IC8vIG9mZnNldCBpcyBmcm9tICIwIiBzbyB3aWxsIGZpdCBvbiAzMi1iaXRzCisgICAgICAgICAgX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKG9mZnNldCkpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgLyoqCisgICAgICogRGlyZWN0IGNvbnN0cnVjdG9yIGZyb20gb2Zmc2V0IGFuZCBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBvZmZzZXQgb2Zmc2V0IG9mIHRoZSBmaWVsZC4KKyAgICAgKiBccGFyYW1baW5dIHNpemUgc2l6ZSBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgaW5saW5lIF9DMkZpZWxkSWQoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX21PZmZzZXQob2Zmc2V0KSwgX21TaXplKHNpemUpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGlkZW50aWZ5IGEgZmllbGQgaW4gYW4gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIFVbdHlwZV0gcG9pbnRlciB0byB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZC4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUKKyAgICAgKiAgICAgICAgZmllbGQgaXMgaW4gYW4gKGluaGVyaXRlZCkgYmFzZSBjbGFzcywgaW4gd2hpY2ggY2FzZSBUIHdpbGwgYmUgdGhhdCBiYXNlIGNsYXNzLgorICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoVSAqLCBSIFQ6OiogcG0pCisgICAgICAgIDogX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKCYoKChVKikyNTYpLT4qcG0pKSAtIDI1NnUpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBpZGVudGlmeSBhIGZpZWxkIGluIGFuIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoUiBUOjoqIHBtKQorICAgICAgICA6IF9tT2Zmc2V0KCh1aW50MzJfdCkodWludHB0cl90KSgmKCgoVCopMCktPipwbSkpKSwKKyAgICAgICAgICBfbVNpemUoc2l6ZW9mKEIpKSB7IH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX0MyRmllbGRJZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tT2Zmc2V0ID09IG90aGVyLl9tT2Zmc2V0ICYmIF9tU2l6ZSA9PSBvdGhlci5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IF9DMkZpZWxkSWQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU9mZnNldCA8IG90aGVyLl9tT2Zmc2V0IHx8CisgICAgICAgICAgICAvLyBOT1RFOiBvcmRlciBwYXJlbnQgc3RydWN0dXJlIGJlZm9yZSBzdWIgZmllbGQKKyAgICAgICAgICAgIChfbU9mZnNldCA9PSBvdGhlci5fbU9mZnNldCAmJiBfbVNpemUgPiBvdGhlci5fbVNpemUpOworICAgIH0KKworICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyhfQzJGaWVsZElkKQorCisjaWYgMAorICAgIGlubGluZSB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBfbU9mZnNldDsgfQorICAgIGlubGluZSB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX21TaXplOyB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRlJJRU5EX1RFU1QpCisgICAgZnJpZW5kIHZvaWQgUHJpbnRUbyhjb25zdCBfQzJGaWVsZElkICZkLCA6OnN0ZDo6b3N0cmVhbSopOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKyAgICBmcmllbmQgc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOworCisgICAgdWludDMyX3QgX21PZmZzZXQ7IC8vIG9mZnNldCBvZiBmaWVsZAorICAgIHVpbnQzMl90IF9tU2l6ZTsgICAvLyBzaXplIG9mIGZpZWxkCit9OworCisvKioKKyAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgJ2ZpZWxkJyBpbiBhIGNvbmZpZ3VyYXRpb24uIFRoZSBmaWVsZAorICogY2FuIGJlIGEgZmllbGQgb2YgYSBjb25maWd1cmF0aW9uLCBhIHN1YmZpZWxkIG9mIGEgZmllbGQgb2YgYSBjb25maWd1cmF0aW9uLAorICogYW5kIGV2ZW4gdGhlIHdob2xlIGNvbmZpZ3VyYXRpb24uIE1vcmVvdmVyLCBpZiB0aGUgZmllbGQgY2FuIHBvaW50IHRvIGFuCisgKiBlbGVtZW50IGluIGEgYXJyYXkgZmllbGQsIG9yIHRvIHRoZSBlbnRpcmUgYXJyYXkgZmllbGQuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgcXVlcnlpbmcgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZCwgYXMgd2VsbAorICogYXMgY29tbXVuaWNhdGluZyBjb25maWd1cmF0aW9uIGZhaWx1cmVzIGFuZCBjb25mbGljdHMgd2hlbiB0cnlpbmcgdG8gY2hhbmdlCisgKiBhIGNvbmZpZ3VyYXRpb24gZm9yIGEgY29tcG9uZW50L2ludGVyZmFjZSBvciBhIHN0b3JlLgorICovCitzdHJ1Y3QgQzJQYXJhbUZpZWxkIHsKKy8vcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGZpZWxkIGlkZW50aWZpZXIgdXNpbmcgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciAodmFyaWFibGUpLAorICAgICAqIGFuZCBhIHBvaW50ZXIgdG8gbWVtYmVyLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIHN0cnVjdCBDMlNvbWVQYXJhbSB7CisgICAgICogICB1aW50MzJfdCBtRmllbGQ7CisgICAgICogICB1aW50MzJfdCBtQXJyYXlbMl07CisgICAgICogICBDMk90aGVyU3RydWN0IG1TdHJ1Y3Q7CisgICAgICogICB1aW50MzJfdCBtRmxleEFycmF5W107CisgICAgICogfSAqbVBhcmFtOworICAgICAqCisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZpZWxkKTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tQXJyYXkpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1BcnJheVswXSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bVN0cnVjdC5tU3ViRmllbGQpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GbGV4QXJyYXkpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GbGV4QXJyYXlbMl0pOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHRvZG8gZml4IHdoYXQgdGhpcyBpcyBmb3IgVFtdIChmb3Igbm93IHNpemUgYmVjb21lcyBUWzFdKQorICAgICAqCisgICAgICogXG5vdGUgdGhpcyBkb2VzIG5vdCB3b3JrIGZvciA2NC1iaXQgbWVtYmVycyBhcyBpdCB0cmlnZ2VycyBhCisgICAgICogJ3Rha2luZyBhZGRyZXNzIG9mIHBhY2tlZCBtZW1iZXInIHdhcm5pbmcuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gb2Zmc2V0IG1lbWJlciBwb2ludGVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFMqIHBhcmFtLCBUKiBvZmZzZXQpCisgICAgICAgIDogX21JbmRleChwYXJhbS0+aW5kZXgoKSksCisgICAgICAgICAgX21GaWVsZElkKChUKikoKHVpbnRwdHJfdClvZmZzZXQgLSAodWludHB0cl90KXBhcmFtKSkge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIHN0YXRpYyBDMlBhcmFtRmllbGQgTWFrZShTJiBwYXJhbSwgVCYgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQocGFyYW0uaW5kZXgoKSwgKHVpbnRwdHJfdCkmb2Zmc2V0IC0gKHVpbnRwdHJfdCkmcGFyYW0sIHNpemVvZihUKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB1c2luZyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSksCisgICAgICogYW5kIGEgbWVtYmVyIHBvaW50ZXIuIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFuCisgICAgICogYXJyYXkgZWxlbWVudCBvciBhIHN1YmZpZWxkLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIEMyU29tZVBhcmFtIG1QYXJhbTsKKyAgICAgKiBDMlBhcmFtRmllbGQoJm1QYXJhbSwgJkMyU29tZVBhcmFtOjptTWVtYmVyRmllbGQpOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHBhcmFtIHAgcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gVCBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQgbWVtYmVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFUgKnAsIFIgVDo6KiBwbSkgOiBfbUluZGV4KHAtPmluZGV4KCkpLCBfbUZpZWxkSWQocCwgcG0pIHsgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB0byBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSkuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogQzJTb21lUGFyYW0gbVBhcmFtOworICAgICAqIEMyUGFyYW1GaWVsZCgmbVBhcmFtKTsKKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChTKiBwYXJhbSkKKyAgICAgICAgOiBfbUluZGV4KHBhcmFtLT5pbmRleCgpKSwgX21GaWVsZElkKDB1LCBwYXJhbS0+c2l6ZSgpKSB7IH0KKworICAgIC8qKiBDb3B5IGNvbnN0cnVjdG9yLiAqLworICAgIGlubGluZSBDMlBhcmFtRmllbGQoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogRXF1YWxpdHkgb3BlcmF0b3IuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkID09IG90aGVyLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcmRlcmluZyBvcGVyYXRvci4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gX21JbmRleCA8IG90aGVyLl9tSW5kZXggfHwKKyAgICAgICAgICAgIChfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkIDwgb3RoZXIuX21GaWVsZElkKTsKKyAgICB9CisKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQzJQYXJhbUZpZWxkKQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLCBfbUZpZWxkSWQob2Zmc2V0LCBzaXplKSB7fQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7CisKKyAgICBDMlBhcmFtOjpJbmRleCBfbUluZGV4OyAvLy88IHBhcmFtZXRlciBpbmRleAorICAgIF9DMkZpZWxkSWQgX21GaWVsZElkOyAgIC8vLzwgZmllbGQgaWRlbnRpZmllcgorfTsKKworLyoqCisgKiBBIHNoYXJlZCAodW5pb24pIHJlcHJlc2VudGF0aW9uIG9mIG51bWVyaWMgdmFsdWVzCisgKi8KK2NsYXNzIEMyVmFsdWUgeworcHVibGljOgorICAgIC8vLyBBIHVuaW9uIG9mIHN1cHBvcnRlZCBwcmltaXRpdmUgdHlwZXMuCisgICAgdW5pb24gUHJpbWl0aXZlIHsKKyAgICAgICAgLy8gZmlyc3QgbWVtYmVyIGlzIGFsd2F5cyB6ZXJvIGluaXRpYWxpemVkIHNvIGl0IG11c3QgYmUgdGhlIGxhcmdlc3QKKyAgICAgICAgdWludDY0X3QgICAgdTY0OyAgIC8vLzwgdWludDY0X3QgdmFsdWUKKyAgICAgICAgaW50NjRfdCAgICAgaTY0OyAgIC8vLzwgaW50NjRfdCB2YWx1ZQorICAgICAgICBjMl9jbnRyNjRfdCBjNjQ7ICAgLy8vPCBjMl9jbnRyNjRfdCB2YWx1ZQorICAgICAgICB1aW50MzJfdCAgICB1MzI7ICAgLy8vPCB1aW50MzJfdCB2YWx1ZQorICAgICAgICBpbnQzMl90ICAgICBpMzI7ICAgLy8vPCBpbnQzMl90IHZhbHVlCisgICAgICAgIGMyX2NudHIzMl90IGMzMjsgICAvLy88IGMyX2NudHIzMl90IHZhbHVlCisgICAgICAgIGZsb2F0ICAgICAgIGZwOyAgICAvLy88IGZsb2F0IHZhbHVlCisKKyAgICAgICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKKyAgICAgICAgUHJpbWl0aXZlKHVpbnQ2NF90IHZhbHVlKSAgICA6IHU2NCh2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShpbnQ2NF90IHZhbHVlKSAgICAgOiBpNjQodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoYzJfY250cjY0X3QgdmFsdWUpIDogYzY0KHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKHVpbnQzMl90IHZhbHVlKSAgICA6IHUzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShpbnQzMl90IHZhbHVlKSAgICAgOiBpMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoYzJfY250cjMyX3QgdmFsdWUpIDogYzMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKHVpbnQ4X3QgdmFsdWUpICAgICA6IHUzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjaGFyIHZhbHVlKSAgICAgICAgOiBpMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoZmxvYXQgdmFsdWUpICAgICAgIDogZnAodmFsdWUpICB7IH0KKworICAgICAgICAvLyBhbGxvdyBjb25zdHJ1Y3Rpb24gZnJvbSBlbnVtIHR5cGUKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRSwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08RT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgUHJpbWl0aXZlKEUgdmFsdWUpCisgICAgICAgICAgICA6IFByaW1pdGl2ZShzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZT4odmFsdWUpKSB7IH0KKworICAgICAgICBQcmltaXRpdmUoKSA6IHU2NCgwKSB7IH0KKworICAgICAgICAvKiogZ2V0cyB2YWx1ZSBvdXQgb2YgdGhlIHVuaW9uICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IFQgJnJlZigpIGNvbnN0OworCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiBhc3N1bWUgc3RhbmRhcmQgYWxpYXNpbmcKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTY0KSA9PSBzaXplb2YoaTY0KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1NjQpID09IHNpemVvZihjNjQpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHUzMikgPT0gc2l6ZW9mKGkzMiksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTMyKSA9PSBzaXplb2YoYzMyKSwgIiIpOworICAgIH07CisgICAgLy8gdmVyaWZ5IHRoYXQgd2UgY2FuIGFzc3VtZSBzdGFuZGFyZCBhbGlhc2luZworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1NjQpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgaTY0KSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1NjQpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgYzY0KSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1MzIpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgaTMyKSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1MzIpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgYzMyKSwgIiIpOworCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIE5PX0lOSVQsCisgICAgICAgIElOVDMyLAorICAgICAgICBVSU5UMzIsCisgICAgICAgIENOVFIzMiwKKyAgICAgICAgSU5UNjQsCisgICAgICAgIFVJTlQ2NCwKKyAgICAgICAgQ05UUjY0LAorICAgICAgICBGTE9BVCwKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgdHlwZV90IFR5cGVGb3IoKSB7CisgICAgICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZTsKKyAgICAgICAgcmV0dXJuIFR5cGVGb3I8VT4oKTsKKyAgICB9CisKKyAgICAvLyBkZXByZWN0YXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgQiA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgdHlwZV90IHR5cGVGb3IoKSB7CisgICAgICAgIHJldHVybiBUeXBlRm9yPFQsIEI+KCk7CisgICAgfQorCisgICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyVmFsdWUoVCB2YWx1ZSkgIDogX21UeXBlKHR5cGVGb3I8VD4oKSksIF9tVmFsdWUodmFsdWUpIHsgfQorCisgICAgQzJWYWx1ZSgpIDogX21UeXBlKE5PX0lOSVQpIHsgfQorCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBib29sIGdldChUICp2YWx1ZSkgY29uc3QgeworICAgICAgICBpZiAoX21UeXBlID09IHR5cGVGb3I8VD4oKSkgeworICAgICAgICAgICAgKnZhbHVlID0gX21WYWx1ZS5yZWY8VD4oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUKKyAgICB2b2lkICpnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVR5cGUgPT0gTk9fSU5JVCA/IG51bGxwdHIgOiAodm9pZCopJl9tVmFsdWU7CisgICAgfQorCisgICAgLy8vIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lZCB2YWx1ZQorICAgIHNpemVfdCBpbmxpbmUgc2l6ZU9mKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU2l6ZUZvcihfbVR5cGUpOworICAgIH0KKworICAgIHN0YXRpYyBzaXplX3QgU2l6ZUZvcih0eXBlX3QgdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSU5UMzI6CisgICAgICAgICAgICBjYXNlIFVJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQ05UUjMyOiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuaTMyKTsKKyAgICAgICAgICAgIGNhc2UgSU5UNjQ6CisgICAgICAgICAgICBjYXNlIFVJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgQ05UUjY0OiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuaTY0KTsKKyAgICAgICAgICAgIGNhc2UgRkxPQVQ6IHJldHVybiBzaXplb2YoX21WYWx1ZS5mcCk7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB0eXBlX3QgX21UeXBlOworICAgIFByaW1pdGl2ZSBfbVZhbHVlOworfTsKKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgaW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8aW50MzJfdD4oKSBjb25zdCB7IHJldHVybiBpMzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGludDY0X3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gaTY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB1aW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDMyX3Q+KCkgY29uc3QgeyByZXR1cm4gdTMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB1aW50NjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gdTY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBjMl9jbnRyMzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8YzJfY250cjMyX3Q+KCkgY29uc3QgeyByZXR1cm4gYzMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBjMl9jbnRyNjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8YzJfY250cjY0X3Q+KCkgY29uc3QgeyByZXR1cm4gYzY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBmbG9hdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8ZmxvYXQ+KCkgY29uc3QgeyByZXR1cm4gZnA7IH0KKworLy8gcHJvdmlkZSB0eXBlcyBmb3IgZW51bXMgYW5kIHVpbnQ4X3QsIGNoYXIgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgcHJvdmlkZSByZWFkaW5nIGFzIHRoZW0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGNoYXIsIGZhbHNlPigpIHsgcmV0dXJuIElOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxpbnQzMl90LCBmYWxzZT4oKSB7IHJldHVybiBJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8aW50NjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gSU5UNjQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPHVpbnQ4X3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQ2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8YzJfY250cjMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIENOVFIzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8YzJfY250cjY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIENOVFI2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8ZmxvYXQsIGZhbHNlPigpIHsgcmV0dXJuIEZMT0FUOyB9CisKKy8vIGZvcndhcmQgZGVjbGFyZSBlYXN5IGVudW0gdGVtcGxhdGUKK3RlbXBsYXRlPHR5cGVuYW1lIEU+IHN0cnVjdCBDMkVhc3lFbnVtOworCisvKioKKyAqIGZpZWxkIGRlc2NyaXB0b3IuIEEgZmllbGQgaXMgdW5pcXVlbHkgZGVmaW5lZCBieSBhbiBpbmRleCBpbnRvIGEgcGFyYW1ldGVyLgorICogKE5vdGU6IFN0cmVhbS1pZCBpcyBub3QgY2FwdHVyZWQgYXMgYSBmaWVsZC4pCisgKgorICogT3JkZXJpbmcgb2YgZmllbGRzIGlzIGJ5IG9mZnNldC4gSW4gY2FzZSBvZiBzdHJ1Y3R1cmVzLCBpdCBpcyBkZXB0aCBmaXJzdCwKKyAqIHdpdGggYSBzdHJ1Y3R1cmUgdGFraW5nIGFuIGluZGV4IGp1c3QgYmVmb3JlIGFuZCBpbiBhZGRpdGlvbiB0byBpdHMgbWVtYmVycy4KKyAqLworc3RydWN0IEMyRmllbGREZXNjcmlwdG9yIHsKKy8vcHVibGljOgorICAgIC8qKiBmaWVsZCB0eXBlcyBhbmQgZmxhZ3MKKyAgICAgKiBcbm90ZTogb25seSAzMi1iaXQgYW5kIDY0LWJpdCBmaWVsZHMgYXJlIHN1cHBvcnRlZCAoZS5nLiBubyBib29sZWFuLCBhcyB0aGF0CisgICAgICogaXMgcmVwcmVzZW50ZWQgdXNpbmcgSU5UMzIpLgorICAgICAqLworICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICAvLyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgSU5UMzIgICA9IEMyVmFsdWU6OklOVDMyLCAgLy8vPCAzMi1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgVUlOVDMyICA9IEMyVmFsdWU6OlVJTlQzMiwgLy8vPCAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcgorICAgICAgICBDTlRSMzIgID0gQzJWYWx1ZTo6Q05UUjMyLCAvLy88IDMyLWJpdCBjb3VudGVyCisgICAgICAgIElOVDY0ICAgPSBDMlZhbHVlOjpJTlQ2NCwgIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIFVJTlQ2NCAgPSBDMlZhbHVlOjpVSU5UNjQsIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIENOVFI2NCAgPSBDMlZhbHVlOjpDTlRSNjQsIC8vLzwgNjQtYml0IGNvdW50ZXIKKyAgICAgICAgRkxPQVQgICA9IEMyVmFsdWU6OkZMT0FULCAgLy8vPCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQKKworICAgICAgICAvLyBhcnJheSB0eXBlcworICAgICAgICBTVFJJTkcgPSAweDEwMCwgLy8vPCBmaXhlZC1zaXplIHN0cmluZyAoUE9EKQorICAgICAgICBCTE9CLCAgICAgICAgICAgLy8vPCBibG9iLiBCbG9icyBoYXZlIG5vIHN1Yi1lbGVtZW50cyBhbmQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYnl0ZSBhcnJheXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGhvd2V2ZXIsIGJ5dGVzIGNhbm5vdCBiZSBpbmRpdmlkdWFsbHkgYWRkcmVzc2VkIGJ5IGNsaWVudHMuCisKKyAgICAgICAgLy8gY29tcGxleCB0eXBlcworICAgICAgICBTVFJVQ1RfRkxBRyA9IDB4MjAwMDAsIC8vLzwgc3RydWN0cy4gTWFya2VkIHdpdGggdGhpcyBmbGFnIGluIGFkZGl0aW9uIHRvIHRoZWlyIGNvcmVJbmRleC4KKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8QzJTdHJpbmcsIEMyVmFsdWU6OlByaW1pdGl2ZT4gTmFtZWRWYWx1ZVR5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxOYW1lZFZhbHVlVHlwZT4gTmFtZWRWYWx1ZXNUeXBlOworICAgIC8vdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8QzJTdHJpbmc+LCBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+PiBOYW1lZFZhbHVlc1R5cGU7CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGF0IHJldHVybnMgdGhlIG5hbWVkIHZhbHVlcyBmb3IgYSB0eXBlLgorICAgICAqCisgICAgICogXHRvZG8gaGlkZSBmcm9tIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB2ZWN0b3Igb2YgbmFtZS12YWx1ZSBwYWlycy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorICAgIHN0YXRpYyBOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXNGb3IoY29uc3QgQiAmKTsKKworICAgIC8qKiBzcGVjaWFsaXphdGlvbiBmb3IgZWFzeSBlbnVtcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgaW5saW5lIHN0YXRpYyBOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXNGb3IoY29uc3QgQzJFYXN5RW51bTxFPiAmKSB7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdudWxsLWRlcmVmZXJlbmNlIgorICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXNGb3IoKihFKiludWxscHRyKTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisgICAgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEIsIGJvb2wgZW5hYmxlZD1zdGQ6OmlzX2FyaXRobWV0aWM8Qj46OnZhbHVlIHx8IHN0ZDo6aXNfZW51bTxCPjo6dmFsdWU+CisgICAgc3RydWN0IEMyX0hJREUgX05hbWVkVmFsdWVzR2V0dGVyOworCitwdWJsaWM6CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGV4dGVudCwgQzJTdHJpbmcgbmFtZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX21UeXBlKCh0eXBlX3QpdHlwZSksIF9tRXh0ZW50KGV4dGVudCksIF9tTmFtZShuYW1lKSwgX21GaWVsZElkKG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJikgPSBkZWZhdWx0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IFQqIG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBfbVR5cGUodGhpcy0+R2V0VHlwZSgoQiopbnVsbHB0cikpLAorICAgICAgICAgIF9tRXh0ZW50KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tTmFtZWRWYWx1ZXMoX05hbWVkVmFsdWVzR2V0dGVyPEI+OjpnZXROYW1lZFZhbHVlcygpKSwKKyAgICAgICAgICBfbUZpZWxkSWQob2Zmc2V0KSB7fQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKFMqLCBUIFM6OiogZmllbGQsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogX21UeXBlKHRoaXMtPkdldFR5cGUoKEIqKW51bGxwdHIpKSwKKyAgICAgICAgICBfbUV4dGVudChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSA/IHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA6IDEpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbUZpZWxkSWQoJigoKFMqKTApLT4qZmllbGQpKSB7fQorCisgICAgLy8vIHJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorICAgIGlubGluZSB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZTsgfQorICAgIC8vLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIGluIGNhc2UgaXQgaXMgYW4gYXJyYXkuIFJldHVybnMgMCBmb3IKKyAgICAvLy8gVFtdIGFycmF5cywgcmV0dXJucyAxIGZvciBUWzFdIGFycmF5cyBhcyB3ZWxsIGFzIGlmIHRoZSBmaWVsZCBpcyBub3QgYW4gYXJyYXkuCisgICAgaW5saW5lIHNpemVfdCBleHRlbnQoKSBjb25zdCB7IHJldHVybiBfbUV4dGVudDsgfQorICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgIGlubGluZSBDMlN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gX21OYW1lOyB9CisKKyAgICBjb25zdCBOYW1lZFZhbHVlc1R5cGUgJm5hbWVkVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gX21OYW1lZFZhbHVlczsgfQorCisjaWYgZGVmaW5lZChGUklFTkRfVEVTVCkKKyAgICBmcmllbmQgdm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYsIDo6c3RkOjpvc3RyZWFtKik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmKTsKKyAgICBGUklFTkRfVEVTVChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBvZmZzZXRlZCBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZGVzYywgc2l6ZV90IG9mZnNldCkKKyAgICAgICAgOiBfbVR5cGUoZGVzYy5fbVR5cGUpLCBfbUV4dGVudChkZXNjLl9tRXh0ZW50KSwKKyAgICAgICAgICBfbU5hbWUoZGVzYy5fbU5hbWUpLCBfbU5hbWVkVmFsdWVzKGRlc2MuX21OYW1lZFZhbHVlcyksCisgICAgICAgICAgX21GaWVsZElkKGRlc2MuX21GaWVsZElkLl9tT2Zmc2V0ICsgb2Zmc2V0LCBkZXNjLl9tRmllbGRJZC5fbVNpemUpIHsgfQorCisgICAgdHlwZV90IF9tVHlwZTsKKyAgICB1aW50MzJfdCBfbUV4dGVudDsgLy8gdGhlIGxhc3QgbWVtYmVyIGNhbiBiZSBhcmJpdHJhcnkgbGVuZ3RoIGlmIGl0IGlzIFRbXSBhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIHBhcmFtZXRlciAodGhpcyBpcyBtYXJrZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAvLyAwKS4gVFswXS1zIGFyZSBub3QgZmllbGRzLgorICAgIEMyU3RyaW5nIF9tTmFtZTsKKyAgICBOYW1lZFZhbHVlc1R5cGUgX21OYW1lZFZhbHVlczsKKworICAgIF9DMkZpZWxkSWQgX21GaWVsZElkOyAgIC8vIGZpZWxkIGlkZW50aWZpZXIgKG9mZnNldCBhbmQgc2l6ZSkKKworICAgIC8vIE5PVEU6IFdlIGRvIG5vdCBjYXB0dXJlIGRlZmF1bHQgdmFsdWUocykgaGVyZSBhcyB0aGF0IG1heSBkZXBlbmQgb24gdGhlIGNvbXBvbmVudC4KKyAgICAvLyBOT1RFOiBXZSBhbHNvIGRvIG5vdCBjYXB0dXJlIGJlc3RFZmZvcnQsIGFzIDEpIHRoaXMgc2hvdWxkIGJlIHRydWUgZm9yIG1vc3QgZmllbGRzLAorICAgIC8vIDIpIHRoaXMgaXMgYXQgcGFyYW1ldGVyIGdyYW51bGFyaXR5LgorCisgICAgLy8gdHlwZSByZXNvbHV0aW9uCisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShpbnQzMl90KikgICAgIHsgcmV0dXJuIElOVDMyOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZSh1aW50MzJfdCopICAgIHsgcmV0dXJuIFVJTlQzMjsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoYzJfY250cjMyX3QqKSB7IHJldHVybiBDTlRSMzI7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGludDY0X3QqKSAgICAgeyByZXR1cm4gSU5UNjQ7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQ2NF90KikgICAgeyByZXR1cm4gVUlOVDY0OyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjMl9jbnRyNjRfdCopIHsgcmV0dXJuIENOVFI2NDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoZmxvYXQqKSAgICAgICB7IHJldHVybiBGTE9BVDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoY2hhciopICAgICAgICB7IHJldHVybiBTVFJJTkc7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQ4X3QqKSAgICAgeyByZXR1cm4gQkxPQjsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICBjbGFzcz10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08VD46OnZhbHVlPjo6dHlwZT4KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKFQqKSB7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHVuZGVybHlpbmcoMCk7CisgICAgICAgIHJldHVybiBHZXRUeXBlKCZ1bmRlcmx5aW5nKTsKKyAgICB9CisKKyAgICAvLyB2ZXJpZnkgQzJTdHJ1Y3QgYnkgaGF2aW5nIGEgRmllbGRMaXN0KCkgYW5kIGEgQ09SRV9JTkRFWC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGNsYXNzPWRlY2x0eXBlKFQ6OkNPUkVfSU5ERVggKyAxKSwgY2xhc3M9ZGVjbHR5cGUoVDo6RmllbGRMaXN0KCkpPgorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoVCopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19iYXNlX29mPEMyUGFyYW0sIFQ+Ojp2YWx1ZSwgImNhbm5vdCB1c2UgQzJQYXJhbXMgYXMgZmllbGRzIik7CisgICAgICAgIHJldHVybiAodHlwZV90KShUOjpDT1JFX0lOREVYIHwgU1RSVUNUX0ZMQUcpOworICAgIH0KKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7Cit9OworCisvLyBubyBuYW1lZCB2YWx1ZXMgZm9yIGNvbXBvdW5kIHR5cGVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOjpfTmFtZWRWYWx1ZXNHZXR0ZXI8QiwgZmFsc2U+IHsKKyAgICBpbmxpbmUgc3RhdGljIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgZ2V0TmFtZWRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBOYW1lZFZhbHVlc1R5cGUoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOjpfTmFtZWRWYWx1ZXNHZXR0ZXI8QiwgdHJ1ZT4geworICAgIGlubGluZSBzdGF0aWMgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBnZXROYW1lZFZhbHVlcygpIHsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV251bGwtZGVyZWZlcmVuY2UiCisgICAgICAgIHJldHVybiBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoKihCKiludWxscHRyKTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisgICAgfQorfTsKKworI2RlZmluZSBERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih0eXBlKSBcCit0ZW1wbGF0ZTw+IGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCB0eXBlICYpIHsgXAorICAgIHJldHVybiBOYW1lZFZhbHVlc1R5cGUoKTsgXAorfQorCisvLyBXZSBjYW5ub3Qgc3VidHlwZSBjb25zdHJ1Y3RvciBmb3IgZW51bWVyYXRlZCB0eXBlcyBzbyBpbnN0ZWQgZGVmaW5lIG5vIG5hbWVkIHZhbHVlcyBmb3IKKy8vIG5vbi1lbnVtZXJhdGVkIGludGVncmFsIHR5cGVzLgorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoaW50MzJfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQzMl90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoYzJfY250cjMyX3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihpbnQ2NF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodWludDY0X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjMl9jbnRyNjRfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQ4X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjaGFyKQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoZmxvYXQpCisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBDMlN0cnVjdERlc2NyaXB0b3IgeworcHVibGljOgorICAgIC8vLyBSZXR1cm5zIHRoZSBjb3JlIGluZGV4IG9mIHRoZSBzdHJ1Y3QKKyAgICBpbmxpbmUgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZS5jb3JlSW5kZXgoKTsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIHN0cnVjdCAobm90IGNvdW50aW5nIGFueSByZWN1cnNpdmUgZmllbGRzKS4KKyAgICAvLyBNdXN0IGJlIGF0IGxlYXN0IDEgZm9yIHZhbGlkIHN0cnVjdHMuCisgICAgaW5saW5lIHNpemVfdCBudW1GaWVsZHMoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5zaXplKCk7IH0KKworICAgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZGlyZWN0IGZpZWxkcyAobm90IGNvdW50aW5nIGFueSByZWN1cnNpdmUgZmllbGRzKS4KKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcmF0b3I7CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNiZWdpbigpOyB9CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jZW5kKCk7IH0KKworICAgIC8vIG9ubHkgc3VwcGx5aW5nIGNvbnN0IGl0ZXJhdG9yIC0gYnV0IHRoZXNlIG5hbWVzIGFyZSBuZWVkZWQgZm9yIHJhbmdlIGJhc2VkIGxvb3BzCisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2JlZ2luKCk7IH0KKyAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2VuZCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoVCopCisgICAgICAgIDogQzJTdHJ1Y3REZXNjcmlwdG9yKFQ6OkNPUkVfSU5ERVgsIFQ6OkZpZWxkTGlzdCgpKSB7IH0KKworICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmZmllbGRzKQorICAgICAgICA6IF9tVHlwZSh0eXBlKSwgX21GaWVsZHMoZmllbGRzKSB7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworCisgICAgaW5saW5lIEMyU3RydWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCB0eXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+ICYmZmllbGRzKQorICAgICAgICA6IF9tVHlwZSh0eXBlKSwgX21GaWVsZHMoc3RkOjptb3ZlKGZpZWxkcykpIHsgfQorCisgICAgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4IF9tVHlwZTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX21GaWVsZHM7Cit9OworCisvKioKKyAqIERlc2NyaWJlcyBwYXJhbWV0ZXJzIGZvciBhIGNvbXBvbmVudC4KKyAqLworc3RydWN0IEMyUGFyYW1EZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgc2V0dGluZyB0aGlzIHBhcmFtIGlzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKiBUaGlzIGNhbiBvbmx5IGJlIHRydWUgZm9yIGJ1aWx0aW4gcGFyYW1zIGZvciBwbGF0Zm9ybS1kZWZpbmVkIGNvbXBvbmVudHMgKGUuZy4gdmlkZW8gYW5kCisgICAgICogYXVkaW8gZW5jb2RlcnMvZGVjb2RlcnMsIHZpZGVvL2F1ZGlvIGZpbHRlcnMpLgorICAgICAqIEZvciB2ZW5kb3ItZGVmaW5lZCBjb21wb25lbnRzLCBpdCBjYW4gYmUgdHJ1ZSBldmVuIGZvciB2ZW5kb3ItZGVmaW5lZCBwYXJhbXMsCisgICAgICogYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCwgaW4gY2FzZSB0aGUgY29tcG9uZW50IGJlY29tZXMgcGxhdGZvcm0tZGVmaW5lZC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1JlcXVpcmVkKCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19SRVFVSVJFRDsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFyYW1ldGVyIGlzIHBlcnNpc3RlbnQuIFRoaXMgaXMgYWx3YXlzIHRydWUgZm9yIEMyVHVuaW5nIGFuZCBDMlNldHRpbmcsCisgICAgICogYnV0IG1heSBiZSBmYWxzZSBmb3IgQzJJbmZvLiBJZiB0cnVlLCB0aGlzIHBhcmFtZXRlciBwZXJzaXN0cyBhY3Jvc3MgZnJhbWVzIGFuZCBhcHBsaWVzIHRvCisgICAgICogdGhlIGN1cnJlbnQgYW5kIHN1YnNlcXVlbnQgZnJhbWVzLiBJZiBmYWxzZSwgdGhpcyBDMkluZm8gcGFyYW1ldGVyIG9ubHkgYXBwbGllcyB0byB0aGUKKyAgICAgKiBjdXJyZW50IGZyYW1lIGFuZCBpcyBub3QgYXNzdW1lZCB0byBoYXZlIHRoZSBzYW1lIHZhbHVlIChvciBldmVuIGJlIHByZXNlbnQpIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBmcmFtZXMsIHVubGVzcyBpdCBpcyBzcGVjaWZpZWQgZm9yIHRob3NlIGZyYW1lcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1BlcnNpc3RlbnQoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1BFUlNJU1RFTlQ7IH0KKworICAgIGlubGluZSBib29sIGlzU3RyaWN0KCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19TVFJJQ1Q7IH0KKworICAgIGlubGluZSBib29sIGlzUmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1JFQURfT05MWTsgfQorCisgICAgaW5saW5lIGJvb2wgaXNWaXNpYmxlKCkgY29uc3QgeyByZXR1cm4gIShfbUF0dHJpYiAmIElTX0hJRERFTik7IH0KKworICAgIGlubGluZSBib29sIGlzUHVibGljKCkgY29uc3QgeyByZXR1cm4gIShfbUF0dHJpYiAmIElTX0lOVEVSTkFMKTsgfQorCisgICAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbS4KKyAgICAvLy8gVGhpcyBkZWZhdWx0cyB0byB0aGUgdW5kZXJseWluZyBDMlN0cnVjdCdzIG5hbWUsIGJ1dCBjb3VsZCBiZSBhbHRlcmVkIGZvciBhIGNvbXBvbmVudC4KKyAgICBpbmxpbmUgQzJTdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9tTmFtZTsgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHBhcmFtZXRlciBpbmRleAorICAgIGlubGluZSBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXg7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHBhcmFtZXRlcnMgdGhhdCB0aGlzIHBhcmFtZXRlciBoYXMgYSBkZXBlbmRlbmN5IG9uCisgICAgaW5saW5lIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmZGVwZW5kZW5jaWVzKCkgY29uc3QgeyByZXR1cm4gX21EZXBlbmRlbmNpZXM7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKGJvb2wgaXNSZXF1aXJlZCwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIGNvbnN0IFQqKQorICAgICAgICA6IF9tSW5kZXgoVDo6UEFSQU1fVFlQRSksCisgICAgICAgICAgX21BdHRyaWIoSVNfUEVSU0lTVEVOVCB8IChpc1JlcXVpcmVkID8gSVNfUkVRVUlSRUQgOiAwKSksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKAorICAgICAgICAgICAgYm9vbCBpc1JlcXVpcmVkLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJQYXJhbTo6SW5kZXggaW5kZXgpCisgICAgICAgIDogX21JbmRleChpbmRleCksCisgICAgICAgICAgX21BdHRyaWIoSVNfUEVSU0lTVEVOVCB8IChpc1JlcXVpcmVkID8gSVNfUkVRVUlSRUQgOiAwKSksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgZW51bSBhdHRyaWJfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8gZmxhZ3MgdGhhdCBkZWZhdWx0IG9uCisgICAgICAgIElTX1JFUVVJUkVEICAgPSAxdSA8PCAwLCAvLy88IHBhcmFtZXRlciBpcyByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQKKyAgICAgICAgSVNfUEVSU0lTVEVOVCA9IDF1IDw8IDEsIC8vLzwgcGFyYW1ldGVyIHJldGFpbnMgaXRzIHZhbHVlCisgICAgICAgIC8vIGZsYWdzIHRoYXQgZGVmYXVsdCBvZmYKKyAgICAgICAgSVNfU1RSSUNUICAgICA9IDF1IDw8IDIsIC8vLzwgcGFyYW1ldGVyIGlzIHN0cmljdAorICAgICAgICBJU19SRUFEX09OTFkgID0gMXUgPDwgMywgLy8vPCBwYXJhbWV0ZXIgaXMgcHVibGljbHkgcmVhZC1vbmx5CisgICAgICAgIElTX0hJRERFTiAgICAgPSAxdSA8PCA0LCAvLy88IHBhcmFtZXRlciBzaGFsbCBub3QgYmUgdmlzaWJsZSB0byBjbGllbnRzCisgICAgICAgIElTX0lOVEVSTkFMICAgPSAxdSA8PCA1LCAvLy88IHBhcmFtZXRlciBzaGFsbCBub3QgYmUgdXNlZCBieSBmcmFtZXdvcmsgKG90aGVyIHRoYW4gdGVzdGluZykKKyAgICAgICAgSVNfQ09OU1QgICAgICA9IDF1IDw8IDYgfCBJU19SRUFEX09OTFksIC8vLzwgcGFyYW1ldGVyIGlzIHB1YmxpY2x5IGNvbnN0IChoZW5jZSByZWFkLW9ubHkpCisgICAgfTsKKworICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcigKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGF0dHJpYl90IGF0dHJpYiwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpCisgICAgICAgIDogX21JbmRleChpbmRleCksCisgICAgICAgICAgX21BdHRyaWIoYXR0cmliKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSkgeyB9CisKKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4LCBhdHRyaWJfdCBhdHRyaWIsIEMyU3RyaW5nICYmbmFtZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICYmZGVwZW5kZW5jaWVzKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLAorICAgICAgICAgIF9tQXR0cmliKGF0dHJpYiksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tRGVwZW5kZW5jaWVzKHN0ZDo6bW92ZShkZXBlbmRlbmNpZXMpKSB7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBDMlBhcmFtOjpJbmRleCBfbUluZGV4OworICAgIGNvbnN0IHVpbnQzMl90IF9tQXR0cmliOworICAgIGNvbnN0IEMyU3RyaW5nIF9tTmFtZTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gX21EZXBlbmRlbmNpZXM7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworfTsKKworREVGSU5FX0VOVU1fT1BFUkFUT1JTKDo6QzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90KQorCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRob3V0IENPUkVfSU5ERVguCisvLy8gXG5vdGUgX0ZJRUxEX0xJU1QgaXMgdXNlZCBvbmx5IGR1cmluZyBkZWNsYXJhdGlvbiBzbyB0aGF0IEMyU3RydWN0IGRlY2xhcmF0aW9ucyBjYW4gZW5kIHdpdGgKKy8vLyBhIHNpbXBsZSBsaXN0IG9mIEMyRklFTEQtcyBhbmQgY2xvc2luZyBicmFja2V0LiBNYXJrIGl0IHVudXNlZCBhcyBpdCBpcyBub3QgdXNlZCBpbiB0ZW1wbGF0ZWQKKy8vLyBzdHJ1Y3RzLgorI2RlZmluZSBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKSBcCitwcml2YXRlOiBcCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVCBfX3VudXNlZDsgLyoqPCBzdHJ1Y3R1cmUgZmllbGRzICovIFwKK3B1YmxpYzogXAorICAgIHR5cGVkZWYgQzIjI25hbWUjI1N0cnVjdCBfdHlwZTsgLyoqPCB0eXBlIG5hbWUgc2hvcnRoYW5kICovIFwKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOyAvKio8IHN0cnVjdHVyZSBmaWVsZHMgZmFjdG9yeSAqLworCisvLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWC4KKyNkZWZpbmUgREVGSU5FX0MyU1RSVUNUKG5hbWUpIFwKK3B1YmxpYzogXAorICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleCMjbmFtZSB9OyBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRob3V0IENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorcHVibGljOiBcCisgICAgRkxFWChDMiMjbmFtZSMjU3RydWN0LCBmbGV4TWVtYmVyKSBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKK3B1YmxpYzogXAorICAgIEZMRVgoQzIjI25hbWUjI1N0cnVjdCwgZmxleE1lbWJlcikgXAorICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleCMjbmFtZSB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHIH07IFwKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKQorCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBEZXNjcmliZSBhIHN0cnVjdHVyZSBvZiBhIHRlbXBsYXRlZCBzdHJ1Y3R1cmUuCisvLyBVc2UgbGlzdC4uLiBhcyB0aGUgYXJndW1lbnQgZ2V0cyByZXN1YnNpdGl0dXRlZCBhbmQgaXQgY29udGFpbnMgY29tbWFzLiBBbHRlcm5hdGl2ZSB3b3VsZCBiZQorLy8gdG8gd3JhcCBsaXN0IGluIGFuIGV4cHJlc3Npb24sIGUuZy4gKHsgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGxpc3Q7IH0pKSB3aGljaCBjb252ZXJ0cworLy8gaXQgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0IHRvIGEgdmVjdG9yLgorI2RlZmluZSBERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1Qoc3RydWt0LCBsaXN0Li4uKSBcCisgICAgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlPD4sIHN0cnVrdCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBsaXN0KQorCisvLy8gXGRlcHJlY2F0ZWQKKy8vLyBEZXNjcmliZSB0aGUgZmllbGRzIG9mIGEgc3RydWN0dXJlIHVzaW5nIGFuIGluaXRpYWxpemVyIGxpc3QuCisjZGVmaW5lIERFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGxpc3QuLi4pIFwKKyAgICBfREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QoLCBDMiMjbmFtZSMjU3RydWN0LCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIGxpc3QpCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIE1hY3JvIGxheWVyIHRvIGdldCB2YWx1ZSBvZiBlbmFibGVkIHRoYXQgaXMgcGFzc2VkIGluIGFzIGEgbWFjcm8gdmFyaWFibGUKKyNkZWZpbmUgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QuLi4pIFwKKyAgICBfX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QpCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIE1hY3JvIGxheWVyIHRvIHJlc29sdmUgdG8gdGhlIHNwZWNpZmljIG1hY3JvIGJhc2VkIG9uIG1hY3JvIHZhcmlhYmxlCisjZGVmaW5lIF9fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgZW5hYmxlZCwgbGlzdC4uLikgXAorICAgIF9fX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUIyNlbmFibGVkKHRlbXBsYXRlLCBzdHJ1a3QsIGxpc3QpCisKKyNkZWZpbmUgX19fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgbGlzdC4uLikgXAorICAgIHRlbXBsYXRlIFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gc3RydWt0OjpGaWVsZExpc3QoKSB7IHJldHVybiBsaXN0OyB9CisKKyNkZWZpbmUgX19fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18odGVtcGxhdGUsIHN0cnVrdCwgbGlzdC4uLikKKworLyoqCisgKiBEZXNjcmliZSBhIGZpZWxkIG9mIGEgc3RydWN0dXJlLgorICogVGhlc2UgbXVzdCBiZSBpbiBvcmRlci4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gdXNlIHRoaXMgbWFjcm86CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9XaWR0aFN0cnVjdCB7CisgKiAgICAgIGludDMyX3Qgd2lkdGg7CisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdCgpIHt9IC8vIG9wdGlvbmFsIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KGludDMyX3QgX3dpZHRoKSA6IHdpZHRoKF93aWR0aCkge30KKyAqCisgKiAgICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCkKKyAqICAgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAqICB9OworICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb1dpZHRoU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCB3aWR0aDsKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KCkgPSBkZWZhdWx0OyAvLyBvcHRpb25hbCBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdChpbnQzMl90IF93aWR0aCkgOiB3aWR0aChfd2lkdGgpIHt9CisgKgorICogICAgICBERUZJTkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCkKKyAqICB9IEMyX1BBQ0s7CisgKgorICogIERFU0NSSUJFX0MyU1RSVUNUKFZpZGVvV2lkdGgsIHsKKyAqICAgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAqICB9KQorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiAgRm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMgKHRob3NlIGVuZGluZyBpbiBUW10pLCB1c2UgdGhlIGZsZXhpYmxlIG1hY3JvczoKKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QgeworICogICAgICBpbnQzMl90IHdpZHRoc1tdOworICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCgpOyAvLyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKgorICogIHByaXZhdGU6CisgKiAgICAgIC8vIG1heSBoYXZlIHByaXZhdGUgY29uc3RydWN0b3JzIHRha2luZyBudW1iZXIgb2Ygd2lkdGhzIGFzIHRoZSBmaXJzdCBhcmd1bWVudAorICogICAgICAvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIEMyUGFyYW0gZmFjdG9yeSBtZXRob2RzLCBlLmcuCisgKiAgICAgIC8vICAgQzJWaWRlb0ZsZXhXaWR0aHNHbG9iYWxQYXJhbTo6QWxsb2NVbmlxdWUoc2l6ZV90LCBpbnQzMl90KTsKKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgaW50MzJfdCB2YWx1ZSkgeworICogICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGV4Q291bnQ7ICsraSkgeworICogICAgICAgICAgICAgIHdpZHRoc1tpXSA9IHZhbHVlOworICogICAgICAgICAgfQorICogICAgICB9CisgKgorICogICAgICAvLyBJZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBUW05dIG9yIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiwgdGhlIGZsZXhDb3VudCB3aWxsCisgKiAgICAgIC8vIGJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBhbmQgcGFzc2VkIGJ5IHRoZSBDMlBhcmFtIGZhY3RvcnkgbWV0aG9kcywgZS5nLgorICogICAgICAvLyAgIGludCB3aWR0aHNbXSA9IHsgMSwgMiwgMyB9OworICogICAgICAvLyAgIEMyVmlkZW9GbGV4V2lkdGhzR2xvYmFsUGFyYW06OkFsbG9jVW5pcXVlKHdpZHRocyk7CisgKiAgICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IGludDMyX3QoJmluaXQpW05dKSB7CisgKiAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZsZXhDb3VudDsgKytpKSB7CisgKiAgICAgICAgICAgICAgd2lkdGhzW2ldID0gaW5pdFtpXTsKKyAqICAgICAgICAgIH0KKyAqICAgICAgfQorICoKKyAqICAgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgd2lkdGhzKQorICogICAgICBDMkZJRUxEKHdpZHRocywgIndpZHRocyIpCisgKiAgfTsKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCBtV2lkdGhzW107CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KCk7IC8vIG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqCisgKiAgICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgbVdpZHRocykKKyAqICB9IEMyX1BBQ0s7CisgKgorICogIERFU0NSSUJFX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgeworICogICAgICBDMkZJRUxEKG1XaWR0aHMsICJ3aWR0aHMiKQorICogIH0pCisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqLworI2RlZmluZSBERVNDUklCRV9DMkZJRUxEKG1lbWJlciwgbmFtZSkgXAorICBDMkZpZWxkRGVzY3JpcHRvcigmKChfdHlwZSopKG51bGxwdHIpKS0+bWVtYmVyLCBuYW1lKSwKKworI2RlZmluZSBDMkZJRUxEKG1lbWJlciwgbmFtZSkgX0MyRklFTEQobWVtYmVyLCBuYW1lLCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisvLy8gXGlmIDAKKyNkZWZpbmUgX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKSBfX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKQorI2RlZmluZSBfX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKSBERVNDUklCRV9DMkZJRUxEIyNlbmFibGVkKG1lbWJlciwgbmFtZSkKKyNkZWZpbmUgREVTQ1JJQkVfQzJGSUVMRF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhtZW1iZXIsIG5hbWUpCisvLy8gXGVuZGlmCisKKy8vLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBERUZJTkVfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIERlZmluZSBhIGJhc2Ugc3RydWN0dXJlICh3aXRoIG5vIENPUkVfSU5ERVgpIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QobmFtZSkgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIERFRklORV9CQVNFX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoIFwKKyAgICAgICAgICAgIG5hbWUsIGZsZXhNZW1iZXIsIERFRklORV9GTEVYX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBiYXNlIHN0cnVjdHVyZSAod2l0aCBubyBDT1JFX0lOREVYKSBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoIFwKKyAgICAgICAgICAgIG5hbWUsIGZsZXhNZW1iZXIsIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIFxpZiAwCisvKgorICAgQWx0ZXJuYXRlIGRlY2xhcmF0aW9uIG9mIGZpZWxkIGRlZmluaXRpb25zIGluIGNhc2Ugbm8gZmllbGQgbGlzdCBpcyB0byBiZSBnZW5lcmF0ZWQuCisgICBUaGUgc3BlY2lmaWMgbWFjcm8gaXMgY2hvc2VkIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18gKHdoZXRoZXIgaXQgaXMKKyAgIGRlZmluZWQgKHRvIGJlIGVtcHR5KSBvciBub3QuIFRoaXMgcmVxdWlyZXMgdHdvIGxldmVsIG9mIG1hY3JvIHN1YnN0aXR1dGlvbi4KKyAgIFRSSUNLWTogdXNlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB0byBoYW5kbGUgY2xvc2luZyBicmFja2V0IHRoYXQgaXMgbm9ybWFsbHkgYWZ0ZXIKKyAgIHRoZXNlIG1hY3Jvcy4KKyovCisKKyNkZWZpbmUgX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpCisjZGVmaW5lIF9fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QjI2VuYWJsZWQobmFtZSwgZGVmaW5lTWFjcm8pCisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lKSB9IEMyX1BBQ0s7IG5hbWVzcGFjZSB7CisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lKSB9IEMyX1BBQ0s7IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6RmllbGRMaXN0KCkgeyByZXR1cm4gX0ZJRUxEX0xJU1Q7IH0gXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpfRklFTERfTElTVCA9IHsKKworI2RlZmluZSBfREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpCisjZGVmaW5lIF9fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUIyNlbmFibGVkKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvKQorI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lLCBmbGV4TWVtYmVyKSB9IEMyX1BBQ0s7IG5hbWVzcGFjZSB7CisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybykgXAorICAgIGRlZmluZU1hY3JvKG5hbWUsIGZsZXhNZW1iZXIpIH0gQzJfUEFDSzsgXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpGaWVsZExpc3QoKSB7IHJldHVybiBfRklFTERfTElTVDsgfSBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6Ol9GSUVMRF9MSVNUID0geworLy8vIFxlbmRpZgorCisKKy8qKgorICogUGFyYW1ldGVyIHJlZmxlY3RvciBjbGFzcy4KKyAqCisgKiBUaGlzIGNsYXNzIGNlbnRyYWxpemVzIHRoZSBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXIgc3RydWN0dXJlcy4gVGhpcyBjYW4gYmUgc2hhcmVkCisgKiBieSBtdWx0aXBsZSBjb21wb25lbnRzIGFzIGRlc2NyaWJpbmcgYSBwYXJhbWV0ZXIgZG9lcyBub3QgaW1wbHkgc3VwcG9ydCBvZiB0aGF0CisgKiBwYXJhbWV0ZXIuIEhvd2V2ZXIsIGVhY2ggc3VwcG9ydGVkIHBhcmFtZXRlciBhbmQgYW55IGRlcGVuZGVudCBzdHJ1Y3R1cmVzIHdpdGhpbgorICogbXVzdCBiZSBkZXNjcmliZWQgYnkgdGhlIHBhcmFtZXRlciByZWZsZWN0b3IgcHJvdmlkZWQgYnkgYSBjb21wb25lbnQuCisgKi8KK2NsYXNzIEMyUGFyYW1SZWZsZWN0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqICBEZXNjcmliZXMgYSBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICAgICAqCisgICAgICogIFxwYXJhbVtpbl0gY29yZUluZGV4IHRoZSBjb3JlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgYXQgbGVhc3QgdGhlCisgICAgICogIGNvcmUgaW5kZXgKKyAgICAgKgorICAgICAqICBccmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZQorICAgICAqICBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcmVmbGVjdG9yCisgICAgICoKKyAgICAgKiAgVGhpcyBtZXRob2RzIHNoYWxsIG5vdCBibG9jayBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAqCisgICAgICogIFxub3RlIHRoaXMgY2xhc3MgZG9lcyBub3QgdGFrZSBhIHNldCBvZiBpbmRpY2VzIGJlY2F1c2Ugd2Ugd291bGQgdGhlbiBwcmVmZXIKKyAgICAgKiAgdG8gYWxzbyByZXR1cm4gYW55IGRlcGVuZGVudCBzdHJ1Y3R1cmVzLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGlzIGxvZ2ljIHRvIGJlCisgICAgICogIHJlcGVhdGVkIGluIGVhY2ggcmVmbGVjdG9yLiBBbHRlcm5hdGVseSwgdGhpcyBjb3VsZCBqdXN0IHJldHVybiBhIG1hcCBvZiBhbGwKKyAgICAgKiAgZGVzY3JpcHRpb25zLCBidXQgd2Ugd2FudCB0byBjb25zZXJ2ZSBtZW1vcnkgaWYgY2xpZW50IG9ubHkgd2FudHMgdGhlIGRlc2NyaXB0aW9uCisgICAgICogIG9mIGEgZmV3IGluZGljZXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DMlBhcmFtUmVmbGVjdG9yKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBHZW5lcmljIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQuCisgKgorICogVGhpcyBjYW4gYmUgZWl0aGVyIGEgcmFuZ2Ugb3IgYSBzZXQgb2YgdmFsdWVzLiBUaGUgcmFuZ2UgY2FuIGJlIGEgc2ltcGxlIHJhbmdlLCBhbiBhcml0aG1ldGljLAorICogZ2VvbWV0cmljIG9yIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIHdpdGggYSBjbGVhciBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlLiBWYWx1ZXMgY2FuCisgKiBiZSBkaXNjcmV0ZSB2YWx1ZXMsIG9yIGNhbiBvcHRpb25hbGx5IHJlcHJlc2VudCBmbGFncyB0byBiZSBvci1lZC4KKyAqCisgKiBcbm90ZSBEbyBub3QgdXNlIGZsYWdzIHRvIHJlcHJlc2VudCBiaXRmaWVsZHMuIFVzZSBpbmRpdmlkdWFsIHZhbHVlcyBvciBzZXBhcmF0ZSBmaWVsZHMgaW5zdGVhZC4KKyAqLworc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgeworLy9wdWJsaWM6CisgICAgZW51bSB0eXBlX3QgeworICAgICAgICBFTVBUWSwgICAgICAvLy88IG5vIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICAgICAgUkFOR0UsICAgICAgLy8vPCBhIG51bWVyaWMgcmFuZ2UgdGhhdCBjYW4gYmUgY29udGludW91cyBvciBkaXNjcmV0ZQorICAgICAgICBWQUxVRVMsICAgICAvLy88IGEgbGlzdCBvZiB2YWx1ZXMKKyAgICAgICAgRkxBR1MgICAgICAgLy8vPCBhIGxpc3Qgb2YgZmxhZ3MgdGhhdCBjYW4gYmUgT1ItZWQKKyAgICB9OworCisgICAgdHlwZV90IHR5cGU7IC8qKiBUeXBlIG9mIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gKi8KKworICAgIHR5cGVkZWYgQzJWYWx1ZTo6UHJpbWl0aXZlIFByaW1pdGl2ZTsKKworICAgIC8qKgorICAgICAqIFJhbmdlIHNwZWNpZmllciBmb3Igc3VwcG9ydGVkIHZhbHVlLiBVc2VkIGlmIHR5cGUgaXMgUkFOR0UuCisgICAgICoKKyAgICAgKiBJZiBzdGVwIGlzIDAgYW5kIG51bSBhbmQgZGVub20gYXJlIGJvdGggMSwgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGFueSB2YWx1ZSwgZm9yIHdoaWNoCisgICAgICogbWluIDw9IHZhbHVlIDw9IG1heC4KKyAgICAgKgorICAgICAqIE90aGVyd2lzZSwgdGhlIHJhbmdlIHJlcHJlc2VudHMgYSBnZW9tZXRyaWMvYXJpdGhtZXRpYy9tdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcywgd2hlcmUKKyAgICAgKiBzdWNjZXNzaXZlIHN1cHBvcnRlZCB2YWx1ZXMgY2FuIGJlIGRlcml2ZWQgZnJvbSBwcmV2aW91cyB2YWx1ZXMgKHN0YXJ0aW5nIGF0IG1pbiksIHVzaW5nIHRoZQorICAgICAqIGZvbGxvd2luZyBmb3JtdWxhOgorICAgICAqICB2WzBdID0gbWluCisgICAgICogIHZbaV0gPSB2W2ktMV0gKiBudW0gLyBkZW5vbSArIHN0ZXAgZm9yIGkgPj0gMSwgd2hpbGUgbWluIDwgdltpXSA8PSBtYXguCisgICAgICovCisgICAgc3RydWN0IHsKKyAgICAgICAgLyoqIExvd2VyIGVuZCBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSkuICovCisgICAgICAgIFByaW1pdGl2ZSBtaW47CisgICAgICAgIC8qKiBVcHBlciBlbmQgb2YgdGhlIHJhbmdlIChpbmNsdXNpdmUgaWYgcGVybWl0dGVkIGJ5IHNlcmllcykuICovCisgICAgICAgIFByaW1pdGl2ZSBtYXg7CisgICAgICAgIC8qKiBTdGVwIGJldHdlZW4gc3VwcG9ydGVkIHZhbHVlcy4gKi8KKyAgICAgICAgUHJpbWl0aXZlIHN0ZXA7CisgICAgICAgIC8qKiBOdW1lcmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzLiAqLworICAgICAgICBQcmltaXRpdmUgbnVtOworICAgICAgICAvKiogRGVub21pbmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzLiAqLworICAgICAgICBQcmltaXRpdmUgZGVub207CisgICAgfSByYW5nZTsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgdmFsdWVzLiBVc2VkIGlmIHR5cGUgaXMgVkFMVUVTIG9yIEZMQUdTLgorICAgICAqCisgICAgICogSWYgdHlwZSBpcyBWQUxVRVMsIHRoaXMgaXMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlcyBpbiBkZWNyZWFzaW5nIHByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBJZiB0eXBlIGlzIEZMQUdTLCB0aGlzIHZlY3RvciBjb250YWlucyB7IG1pbi1tYXNrLCBmbGFnMSwgZmxhZzIuLi4gfS4gQmFzaWNhbGx5LCB0aGUgZmlyc3QKKyAgICAgKiB2YWx1ZSBpcyB0aGUgcmVxdWlyZWQgc2V0IG9mIGZsYWdzIHRvIGJlIHNldCwgYW5kIHRoZSByZXN0IG9mIHRoZSB2YWx1ZXMgYXJlIGZsYWdzIHRoYXQgY2FuCisgICAgICogYmUgc2V0IGluZGVwZW5kZW50bHkuIEZMQUdTIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBpbnRlZ3JhbCB0eXBlcy4gU3VwcG9ydGVkIGZsYWdzIHNob3VsZAorICAgICAqIG5vdCBvdmVybGFwLCBhcyBpdCBjYW4gbWFrZSB2YWxpZGF0aW9uIG5vbi1kZXRlcm1pbmlzdGljLiBUaGUgc3RhbmRhcmQgdmFsaWRhdGlvbiBtZXRob2QKKyAgICAgKiBpcyB0aGF0IHN0YXJ0aW5nIGZyb20gdGhlIG9yaWdpbmFsIHZhbHVlLCBpZiBlYWNoIGZsYWcgaXMgcmVtb3ZlZCB3aGVuIGZ1bGx5IHByZXNlbnQgKHRoZQorICAgICAqIG1pbi1tYXNrIG11c3QgYmUgZnVsbHkgcHJlc2VudCksIHdlIHNoYWxsIGFycml2ZSBhdCAwLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPFByaW1pdGl2ZT4gdmFsdWVzOworCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpCisgICAgICAgIDogdHlwZShFTVBUWSkgeworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IFQoc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMSkpCisgICAgICAgIDogdHlwZShSQU5HRSksCisgICAgICAgICAgcmFuZ2V7bWluLCBtYXgsIHN0ZXAsIChUKTEsIChUKTF9IHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVuKSA6CisgICAgICAgIHR5cGUoUkFOR0UpLAorICAgICAgICByYW5nZXttaW4sIG1heCwgKFQpMCwgbnVtLCBkZW59IHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW4pCisgICAgICAgIDogdHlwZShSQU5HRSksCisgICAgICAgICAgcmFuZ2V7bWluLCBtYXgsIHN0ZXAsIG51bSwgZGVufSB7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gbGlzdCkKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgZm9yIChUIHZhbHVlIDogbGlzdCkgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoYm9vbCBmbGFncywgY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIGxpc3QpCisgICAgICAgIDogdHlwZShmbGFncyA/IEZMQUdTIDogVkFMVUVTKSwKKyAgICAgICAgICByYW5nZXsoVCkwLCAoVCkwLCAoVCkwLCAoVCkwLCAoVCkwfSB7CisgICAgICAgIGZvcihUIHZhbHVlIDogbGlzdCkgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gXGludGVybmFsCisgICAgLy8vIFx0b2RvOiBjcmVhdGUgc2VwYXJhdGUgdmFsdWVzIHZzLiBmbGFncyBpbml0aWFsaXplciBhcyBmb3IgZmxhZ3Mgd2Ugd2FudAorICAgIC8vLyB0byBsaXN0IGJvdGggYWxsb3dlZCBhbmQgcmVxdWlyZWQgZmxhZ3MKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV251bGwtZGVyZWZlcmVuY2UiCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRT1kZWNsdHlwZShDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoKihUKiludWxscHRyKSk+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBjb25zdCBUKikKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZCA9IEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKFQqKW51bGxwdHIpOworICAgICAgICBpZiAoZmxhZ3MpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soMCk7IC8vIG1pbi1tYXNrIGRlZmF1bHRzIHRvIDAKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlVHlwZSAmaXRlbSA6IG5hbWVkKXsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soaXRlbS5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorfTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisKKy8qKgorICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBzcGVjaWZpYyBmaWVsZC4KKyAqCisgKiBUaGlzIGlzIGEgcGFpciBvZiB0aGUgZmllbGQgc3BlY2lmaWVyIHRvZ2V0aGVyIHdpdGggYW4gb3B0aW9uYWwgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHdoZW4gcmVwb3J0aW5nIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIGZhaWx1cmVzIGFuZCBjb25mbGljdHMuCisgKi8KK3N0cnVjdCBDMlBhcmFtRmllbGRWYWx1ZXMgeworICAgIEMyUGFyYW1GaWVsZCBwYXJhbU9yRmllbGQ7IC8vLzwgdGhlIGZpZWxkIG9yIHBhcmFtZXRlcgorICAgIC8vLyBvcHRpb25hbCBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgZmllbGQgaWYgcGFyYW1PckZpZWxkIHNwZWNpZmllcyBhbiBhY3R1YWwgZmllbGQgdGhhdCBpcworICAgIC8vLyBudW1lcmljIChub24gc3RydWN0LCBibG9iIG9yIHN0cmluZykuIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGFycmF5cyAoaW5jbHVkaW5nIHN0cmluZyBhbmQKKyAgICAvLy8gYmxvYnMpIGRlc2NyaWJlIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIGVsZW1lbnQgKGNoYXJhY3RlciBmb3Igc3RyaW5nLCBhbmQgYnl0ZXMgZm9yCisgICAgLy8vIGJsb2JzKS4gSXQgaXMgb3B0aW9uYWwgZm9yIHJlYWQtb25seSBzdHJpbmdzIGFuZCBibG9icy4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gdmFsdWVzOworCisgICAgLy8gVGhpcyBzdHJ1Y3QgaXMgbWVhbnQgdG8gYmUgbW92ZSBjb25zdHJ1Y3RlZC4KKyAgICBDMl9ERUZBVUxUX01PVkUoQzJQYXJhbUZpZWxkVmFsdWVzKTsKKworICAgIC8vIENvcHkgY29uc3RydWN0b3IvYXNzaWdubWVudCBpcyBhbHNvIHByb3ZpZGVkIGFzIHRoaXMgb2JqZWN0IG1heSBnZXQgY29waWVkLgorICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXMgJm90aGVyKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChvdGhlci5wYXJhbU9yRmllbGQpLAorICAgICAgICAgIHZhbHVlcyhvdGhlci52YWx1ZXMgPyBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCpvdGhlci52YWx1ZXMpIDogbnVsbHB0cikgeyB9CisKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMmIG9wZXJhdG9yPShjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXMgJm90aGVyKSB7CisgICAgICAgIHBhcmFtT3JGaWVsZCA9IG90aGVyLnBhcmFtT3JGaWVsZDsKKyAgICAgICAgdmFsdWVzID0gb3RoZXIudmFsdWVzID8gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPigqb3RoZXIudmFsdWVzKSA6IG51bGxwdHI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB3aXRoIG5vIHZhbHVlcy4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbU9yRmllbGRfKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChwYXJhbU9yRmllbGRfKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB3aXRoIHZhbHVlcy4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbU9yRmllbGRfLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXNfKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChwYXJhbU9yRmllbGRfKSwKKyAgICAgICAgICB2YWx1ZXMoc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPih2YWx1ZXNfKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgZnJvbSBmaWVsZHMuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1PckZpZWxkXywgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzXykKKyAgICAgICAgOiBwYXJhbU9yRmllbGQocGFyYW1PckZpZWxkXyksCisgICAgICAgICAgdmFsdWVzKHN0ZDo6bW92ZSh2YWx1ZXNfKSkgeyB9Cit9OworCisvLy8gQH0KKworLy8gaW5jbHVkZSBkZWJ1ZyBoZWFkZXIgZm9yIEMyUGFyYW1zLmggaWYgQzJEZWJ1Zy5oIHdhcyBhbHJlYWR5IGluY2x1ZGVkCisjaWZkZWYgQzJVVElMU19ERUJVR19IXworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1wYXJhbS5oPgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQzJQQVJBTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTMzMjgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmgKQEAgLTAsMCArMSw5MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiogXGZpbGUKKyAqIFRlbXBsYXRlcyB1c2VkIHRvIGRlY2xhcmUgcGFyYW1ldGVycy4KKyAqLworI2lmbmRlZiBDMlBBUkFNX0RFRl9IXworI2RlZmluZSBDMlBBUkFNX0RFRl9IXworCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKKy8vLyBcYWRkdG9ncm91cCBQYXJhbWV0ZXJzCisvLy8gQHsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09IFVUSUxJVFkgVEVNUExBVEVTIEZPUiBQQVJBTUVURVIgREVGSU5JVElPTlMgPT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8vLyBcYWRkdG9ncm91cCBpbnRlcm5hbAorLy8vIEB7CisKKy8vLyBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMuCitzdHJ1Y3QgQzJfSElERSBfQzJDb21wYXJhYmxlX2ltcGwKK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZT1kZWNsdHlwZShTKCkgPT0gUygpKT4KKyAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgVGVzdEVxdWFsKGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0RXF1YWwoLi4uKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKFMoKSAhPSBTKCkpPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0Tm90RXF1YWwoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3ROb3RFcXVhbCguLi4pOworfTsKKworLyoqCisgKiBIZWxwZXIgdGVtcGxhdGUgdGhhdCByZXR1cm5zIGlmIGEgdHlwZSBoYXMgZXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgb3BlcmF0b3JzLgorICoKKyAqIFVzZSBhcyBfQzJDb21wYXJhYmxlPHR5cGVuYW1lIFM+Ojp2YWx1ZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkNvbXBhcmFibGUKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGRlY2x0eXBlKF9DMkNvbXBhcmFibGVfaW1wbDo6VGVzdEVxdWFsPFM+KDApKTo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlY2x0eXBlKF9DMkNvbXBhcmFibGVfaW1wbDo6VGVzdE5vdEVxdWFsPFM+KDApKTo6dmFsdWU+IHsKK307CisKKy8vLyAgSGVscGVyIGNsYXNzIHRoYXQgY2hlY2tzIGlmIGEgdHlwZSBoYXMgYSBDT1JFX0lOREVYIGNvbnN0YW50Lgorc3RydWN0IEMyX0hJREUgX0MyQ29yZUluZGV4SGVscGVyX2ltcGwKK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQ9Uzo6Q09SRV9JTkRFWD4KKyAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgVGVzdENvcmVJbmRleChpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdENvcmVJbmRleCguLi4pOworfTsKKworLy8vIE1hY3JvIHRoYXQgZGVmaW5lcyBhbmQgdGh1cyBvdmVycmlkZXMgYSB0eXBlJ3MgQ09SRV9JTkRFWCBmb3IgYSBzZXR0aW5nCisjZGVmaW5lIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKGNvcmVJbmRleCkgXAorcHVibGljOiBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGNvcmVJbmRleCB9OworCisKKy8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCBhZGRzIGEgQ09SRV9JTkRFWCB0byBhIHR5cGUgaWYgaXQgZG9lcyBub3QgaGF2ZSBvbmUgKGZvciB0ZXN0aW5nKQordGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IENvcmVJbmRleD4KK3N0cnVjdCBDMl9ISURFIF9DMkFkZENvcmVJbmRleCA6IHB1YmxpYyBTIHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShDb3JlSW5kZXgpCit9OworCisvKioKKyAqIFxicmllZiBIZWxwZXIgY2xhc3MgdG8gY2hlY2sgc3RydWN0IHJlcXVpcmVtZW50cyBmb3IgcGFyYW1ldGVycy4KKyAqCisgKiBGZWF0dXJlczoKKyAqICAtIHZlcmlmeSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBubyB2aXJ0dWFsIG1ldGhvZHMsIGFuZCBubyBlcXVhbGl0eSBvcGVyYXRvcnMuCisgKiAgLSBleHBvc2UgUEFSQU1fVFlQRSwgYW5kIG5vbi1mbGV4IEZMRVhfU0laRS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IENvcmVJbmRleCwgdW5zaWduZWQgVHlwZUZsYWdzPgorc3RydWN0IEMyX0hJREUgX0MyU3RydWN0Q2hlY2sgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgICAgICBzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBoYXZlIGRlZmF1bHQgY29uc3RydWN0b3IiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3BvbHltb3JwaGljPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IG5vdCBoYXZlIHZpcnR1YWwgbWV0aG9kcyIpOworICAgIHN0YXRpY19hc3NlcnQoIV9DMkNvbXBhcmFibGU8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3Qgbm90IGhhdmUgb3BlcmF0b3I9PSBvciAhPSIpOworCitwdWJsaWM6CisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgUEFSQU1fVFlQRSA9IENvcmVJbmRleCB8IFR5cGVGbGFncworICAgIH07CisKK3Byb3RlY3RlZDoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBGTEVYX1NJWkUgPSAwLAorICAgIH07Cit9OworCisvLy8gSGVscGVyIGNsYXNzIHRoYXQgY2hlY2tzIGlmIGEgdHlwZSBoYXMgYW4gaW50ZWdlciBGTEVYX1NJWkUgbWVtYmVyLgorc3RydWN0IEMyX0hJREUgX0MyRmxleGlibGVfaW1wbCB7CisgICAgLy8vIHNwZWNpYWxpemF0aW9uIGZvciB0eXBlcyB0aGF0IGhhdmUgYSBGTEVYX1NJWkUgbWVtYmVyCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdW5zaWduZWQ9Uzo6RkxFWF9TSVpFPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0RmxleFNpemUoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3RGbGV4U2l6ZSguLi4pOworfTsKKworLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJldHVybnMgaWYgYSB0eXBlIGhhcyBhbiBpbnRlZ2VyIEZMRVhfU0laRSBtZW1iZXIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyRmxleGlibGUKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGRlY2x0eXBlKF9DMkZsZXhpYmxlX2ltcGw6OlRlc3RGbGV4U2l6ZTxTPigwKSk6OnZhbHVlPiB7Cit9OworCisvLy8gTWFjcm8gdG8gdGVzdCBpZiBhIHR5cGUgaXMgZmxleGlibGUgKGhhcyBhIEZMRVhfU0laRSBtZW1iZXIpLgorI2RlZmluZSBJRl9GTEVYSUJMRShTKSBFTkFCTEVfSUYoX0MyRmxleGlibGU8Uz46OnZhbHVlKQorLy8vIFNob3J0aGFuZCBmb3Igc3RkOjplbmFibGVfaWYKKyNkZWZpbmUgRU5BQkxFX0lGKGNvbmQpIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGNvbmQ+Ojp0eXBlCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFY9dm9pZD4KK3N0cnVjdCBDMl9ISURFIF9jMl9lbmFibGVfaWZfdHlwZSB7CisgICAgdHlwZWRlZiBWIHR5cGU7Cit9OworCisvLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgZXhwb3NlcyB0aGUgZmxleGlibGUgc3VidHlwZSBvZiBhIHN0cnVjdC4KK3RlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIEU9dm9pZD4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXIgeworICAgIHR5cGVkZWYgdm9pZCBGbGV4VHlwZTsKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSAwIH07Cit9OworCisvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsZXhpYmxlIHR5cGVzLiBUaGlzIG9ubHkgd29ya3MgaWYgX0ZsZXhNZW1iZXJUeXBlIGlzIHB1YmxpYy4KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4SGVscGVyPFMsCisgICAgICAgIHR5cGVuYW1lIF9jMl9lbmFibGVfaWZfdHlwZTx0eXBlbmFtZSBTOjpfRmxleE1lbWJlclR5cGU+Ojp0eXBlPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGbGV4SGVscGVyPHR5cGVuYW1lIFM6Ol9GbGV4TWVtYmVyVHlwZT46OkZsZXhUeXBlIEZsZXhUeXBlOworICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IF9DMkZsZXhIZWxwZXI8dHlwZW5hbWUgUzo6X0ZsZXhNZW1iZXJUeXBlPjo6RkxFWF9TSVpFIH07Cit9OworCisvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsZXggYXJyYXlzLgordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXI8U1tdLAorICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3ZvaWQ8dHlwZW5hbWUgX0MyRmxleEhlbHBlcjxTPjo6RmxleFR5cGU+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgICB0eXBlZGVmIFMgRmxleFR5cGU7CisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gc2l6ZW9mKFMpIH07Cit9OworCisvKioKKyAqIFxicmllZiBIZWxwZXIgY2xhc3MgdG8gY2hlY2sgZmxleGlibGUgc3RydWN0IHJlcXVpcmVtZW50cyBhbmQgYWRkIGNvbW1vbiBvcGVyYXRpb25zLgorICoKKyAqIEZlYXR1cmVzOgorICogIC0gZXhwb3NlIENPUkVfSU5ERVggYW5kIEZpZWxkTGlzdCAodGhpcyBpcyBub3JtYWxseSBpbmhlcml0ZWQgZnJvbSB0aGUgc3RydWN0LCBidXQgZmxleGlibGUKKyAqICAgIHN0cnVjdHMgY2Fubm90IGJlIGJhc2UgY2xhc3NlcyBhbmQgdGh1cyBpbmhlcml0ZWQgZnJvbSkKKyAqICAtIGRpc2FibGUgY29weSBhc3NpZ25tZW50IGFuZCBjb25zdHJ1Y3Rpb24gKFRPRE86IHRoaXMgaXMgYWxyZWFkeSBkb25lIGluIHRoZSBGTEVYIG1hY3JvIGZvciB0aGUKKyAqICAgIGZsZXhpYmxlIHN0cnVjdCwgc28gbWF5IG5vdCBiZSBuZWVkZWQgaGVyZSkKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXgsIHVuc2lnbmVkIFR5cGVGbGFncz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhTdHJ1Y3RDaGVjayA6CisvLyBhZGQgZmxleGlibGUgZmxhZyBhcyBfQzJTdHJ1Y3RDaGVjayBkZWZpbmVzIFBBUkFNX1RZUEUKKyAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXggfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRywgVHlwZUZsYWdzPiB7CitwdWJsaWM6CisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgQ09SRV9JTkRFWCA9IFBhcmFtSW5kZXggfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRywgLy8vPCBmbGV4aWJsZSBzdHJ1Y3QgY29yZS1pbmRleAorICAgIH07CisKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKSB7IHJldHVybiBTOjpGaWVsZExpc3QoKTsgfQorCisgICAgLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgZGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBfQzJGbGV4U3RydWN0Q2hlY2soKSA9IGRlZmF1bHQ7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjYW5ub3QgY29weSBmbGV4aWJsZSBwYXJhbXMKKyAgICBfQzJGbGV4U3RydWN0Q2hlY2soY29uc3QgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFR5cGVGbGFncz4gJikgPSBkZWxldGU7CisgICAgX0MyRmxleFN0cnVjdENoZWNrJiBvcGVyYXRvcj0gKGNvbnN0IF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUeXBlRmxhZ3M+ICYpID0gZGVsZXRlOworCisgICAgLy8gY29uc3RhbnRzIHVzZWQgZm9yIGhlbHBlciBtZXRob2RzCisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjxTPjo6RkxFWF9TSVpFLCAvLy88IHNpemUgb2YgZmxleGlibGUgdHlwZQorICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBNQVhfU0laRSA9ICh1aW50MzJfdClzdGQ6Om1pbigoc2l6ZV90KVVJTlQzMl9NQVgsIFNJWkVfTUFYKSwgLy8gVE9ETzogaXMgdGhpcyBhbHdheXMgdTMyIG1heD8KKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgQkFTRV9TSVpFID0gc2l6ZW9mKFMpICsgc2l6ZW9mKEMyUGFyYW0pLCAvLy88IHNpemUgb2YgdGhlIGJhc2UgcGFyYW0KKyAgICB9OworCisgICAgLy8vIHJldHVybnMgdGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoaXMgcGFyYW0gd2l0aCBmbGV4Q291bnQsIG9yIDAgaWYgaXQgd291bGQgb3ZlcmZsb3cuCisgICAgaW5saW5lIHN0YXRpYyBzaXplX3QgQ2FsY1NpemUoc2l6ZV90IGZsZXhDb3VudCwgc2l6ZV90IHNpemUgPSBCQVNFX1NJWkUpIHsKKyAgICAgICAgaWYgKGZsZXhDb3VudCA8PSAoTUFYX1NJWkUgLSBzaXplKSAvIFM6OkZMRVhfU0laRSkgeworICAgICAgICAgICAgcmV0dXJuIHNpemUgKyBTOjpGTEVYX1NJWkUgKiBmbGV4Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8vIGR5bmFtaWMgbmV3IG9wZXJhdG9yIHVzYWJsZSBmb3IgcGFyYW1zIG9mIHR5cGUgUworICAgIGlubGluZSB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIHNpemVfdCBmbGV4Q291bnQpIG5vZXhjZXB0IHsKKyAgICAgICAgLy8gVE9ETzogYXNzZXJ0KHNpemUgPT0gQkFTRV9TSVpFKTsKKyAgICAgICAgc2l6ZSA9IENhbGNTaXplKGZsZXhDb3VudCwgc2l6ZSk7CisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIDo6b3BlcmF0b3IgbmV3KHNpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK307CisKKy8vLyBEZWZpbmUgRnJvbSgpIGNhc3Qgb3BlcmF0b3JzIGZvciBwYXJhbXMuCisjZGVmaW5lIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkgXAorICAgIGlubGluZSBzdGF0aWMgX1R5cGUqIEZyb20oQzJQYXJhbSAqb3RoZXIpIHsgXAorICAgICAgICByZXR1cm4gKF9UeXBlKilDMlBhcmFtOjpJZlN1aXRhYmxlKCBcCisgICAgICAgICAgICAgICAgb3RoZXIsIHNpemVvZihfVHlwZSksIF9UeXBlOjpQQVJBTV9UWVBFLCBfVHlwZTo6RkxFWF9TSVpFLCBcCisgICAgICAgICAgICAgICAgKF9UeXBlOjpQQVJBTV9UWVBFICYgVDo6SW5kZXg6OkRJUl9VTkRFRklORUQpICE9IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEKTsgXAorICAgIH0gXAorICAgIGlubGluZSBzdGF0aWMgY29uc3QgX1R5cGUqIEZyb20oY29uc3QgQzJQYXJhbSAqb3RoZXIpIHsgXAorICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBfVHlwZSo+KEZyb20oY29uc3RfY2FzdDxDMlBhcmFtICo+KG90aGVyKSkpOyBcCisgICAgfSBcCisgICAgaW5saW5lIHN0YXRpYyBfVHlwZSogRnJvbShzdGQ6Om51bGxwdHJfdCkgeyByZXR1cm4gbnVsbHB0cjsgfSBcCisKKy8qKgorICogRGVmaW5lIGZsZXhpYmxlIGFsbG9jYXRvcnMgKEFsbG9jU2hhcmVkIG9yIEFsbG9jVW5pcXVlKSBmb3IgZmxleGlibGUgcGFyYW1zLgorICogIC0gUDo6QWxsb2NYeXooZmxleENvdW50LCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIGdpdmVuIGZsZXgtY291bnQuIFRoaXMgbWFwcyB0bworICogICAgICAgICAgVChmbGV4Q291bnQsIGFyZ3MuLi4pXAorICoKKyAqIENsYW5nIGRvZXMgbm90IHN1cHBvcnQgYXJncy4uLiBmb2xsb3dlZCBieSB0ZW1wbGF0ZWQgcGFyYW0gYXMgYXJncy4uLiBlYXRzIGl0LiBIZW5jZSwKKyAqIHByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIHdoZXJlIHRoZSBpbml0aWFsaXplciByZXBsYWNlcyB0aGUgZmxleENvdW50LgorICoKKyAqIFNwZWNpYWxpemF0aW9ucyB0aGF0IGRlZHVjZSBmbGV4Q291bnQ6CisgKiAgLSBQOjpBbGxvY1h5eihUW10sIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXQgYXJyYXkuCisgKiAgLSBQOjpBbGxvY1h5eihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4sIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXRpYWxpemVyCisgKiAgICAgICAgICAgIGxpc3QuCisgKiAgLSBQOjpBbGxvY1h5eihzdGQ6OnZlY3RvcjxUPiwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdCB2ZWN0b3IuCisgKiAgVGhlc2Ugc3BlY2lhbGl6YXRpb25zIG1hcCB0byBUKGZsZXhDb3VudCA9IHNpemUtb2YtaW5pdCwgYXJncy4uLiwgaW5pdCkKKyAqLworI2RlZmluZSBERUZJTkVfRkxFWElCTEVfQUxMT0MoX1R5cGUsIFMsIHB0ciwgUHRyKSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoZmxleENvdW50KSBfVHlwZShmbGV4Q291bnQsIGFyZ3MuLi4pKTsgXAorICAgIH0gXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFU9dHlwZW5hbWUgUzo6RmxleFR5cGU+IFwKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPiBBbGxvYyMjUHRyKCBcCisgICAgICAgICAgICBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VT4gJmluaXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KGluaXQuc2l6ZSgpKSBfVHlwZShpbml0LnNpemUoKSwgYXJncy4uLiwgaW5pdCkpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZT4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoIFwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFU+ICZpbml0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhpbml0LnNpemUoKSkgX1R5cGUoaW5pdC5zaXplKCksIGFyZ3MuLi4sIGluaXQpKTsgXAorICAgIH0gXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFU9dHlwZW5hbWUgUzo6RmxleFR5cGUsIHVuc2lnbmVkIE4+IFwKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPiBBbGxvYyMjUHRyKGNvbnN0IFUoJmluaXQpW05dLCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhOKSBfVHlwZShOLCBhcmdzLi4uLCBpbml0KSk7IFwKKyAgICB9IFwKKworLyoqCisgKiBEZWZpbmUgZmxleGlibGUgbWV0aG9kcyBBbGxvY1NoYXJlZCwgQWxsb2NVbmlxdWUgYW5kIGZsZXhDb3VudC4KKyAqLworI2RlZmluZSBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykgXAorICAgIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgc2hhcmVkLCBTaGFyZWQpIFwKKyAgICBERUZJTkVfRkxFWElCTEVfQUxMT0MoX1R5cGUsIFMsIHVuaXF1ZSwgVW5pcXVlKSBcCisgICAgaW5saW5lIHNpemVfdCBmbGV4Q291bnQoKSBjb25zdCB7IFwKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoX1R5cGUpID09IF9UeXBlOjpCQVNFX1NJWkUsICJpbmNvcnJlY3QgQkFTRV9TSVpFIik7IFwKKyAgICAgICAgc2l6ZV90IHN6ID0gdGhpcy0+c2l6ZSgpOyBcCisgICAgICAgIGlmIChzeiA+PSBzaXplb2YoX1R5cGUpKSB7IFwKKyAgICAgICAgICAgIHJldHVybiAoc3ogLSBzaXplb2YoX1R5cGUpKSAvIF9UeXBlOjpGTEVYX1NJWkU7IFwKKyAgICAgICAgfSBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisKKy8vLyBNYXJrIGZsZXhpYmxlIG1lbWJlciB2YXJpYWJsZSBhbmQgbWFrZSBzdHJ1Y3R1cmUgZmxleGlibGUuCisjZGVmaW5lIEZMRVgoY2xzLCBtKSBcCisgICAgQzJfRE9fTk9UX0NPUFkoY2xzKSBcCitwcml2YXRlOiBcCisgICAgQzJQQVJBTV9NQUtFX0ZSSUVORFMgXAorICAgIC8qKiBcaWYgMCAqLyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBmcmllbmQgc3RydWN0IF9DMkZsZXhIZWxwZXI7IFwKK3B1YmxpYzogXAorICAgIHR5cGVkZWYgZGVjbHR5cGUobSkgX0ZsZXhNZW1iZXJUeXBlOyBcCisgICAgLyogZGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIGZsZXhDb3VudCAqLyBcCisgICAgaW5saW5lIGNscyhzaXplX3QpIDogY2xzKCkge30gXAorICAgIC8qIGNvbnN0ZXhwciBzdGF0aWMgX0ZsZXhNZW1iZXJUeXBlIGNsczo6KiBmbGV4TWVtYmVyID0gJmNsczo6bTsgKi8gXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmxleEhlbHBlcjxfRmxleE1lbWJlclR5cGU+OjpGbGV4VHlwZSBGbGV4VHlwZTsgXAorICAgIHN0YXRpY19hc3NlcnQoXAorICAgICAgICAgICAgIXN0ZDo6aXNfdm9pZDxGbGV4VHlwZT46OnZhbHVlLCBcCisgICAgICAgICAgICAibWVtYmVyIGlzIG5vdCBmbGV4aWJsZSwgb3IgYSBmbGV4aWJsZSBhcnJheSBvZiBhIGZsZXhpYmxlIHR5cGUiKTsgXAorICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IF9DMkZsZXhIZWxwZXI8X0ZsZXhNZW1iZXJUeXBlPjo6RkxFWF9TSVpFIH07IFwKKyAgICAvKiogXGVuZGlmICovIFwKKworLy8vIEB9CisKKy8qKgorICogR2xvYmFsLXBhcmFtZXRlciB0ZW1wbGF0ZS4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIGdsb2JhbCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gR2xvYmFsIHBhcmFtZXRlcnMgYXJlIG5vdCB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KS4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIG9mIHRoZSB3cmFwcGVkCisgKiBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBhbmQgY29uc3RydWN0b3JzIGFuZCBwb3RlbnRpYWwgcHVibGljIG1ldGhvZHMgYXJlIGFsc28KKyAqIHdyYXBwZWQuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiBzdHJ1Y3R1cmVzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD1TOjpDT1JFX0lOREVYLCBjbGFzcyBGbGV4PXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBDMkdsb2JhbFBhcmFtIDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OlR5cGU6OkRJUl9HTE9CQUw+IHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKK3B1YmxpYzoKKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkdsb2JhbFBhcmFtKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfVHlwZSksIF9UeXBlOjpQQVJBTV9UWVBFKSwgUyhhcmdzLi4uKSB7IH0KKworICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKK307CisKKy8qKgorICogR2xvYmFsLXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIGdsb2JhbCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgZmxleGlibGUgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gR2xvYmFsIHBhcmFtZXRlcnMgYXJlIG5vdCB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIG9mIGZsZXhpYmxlCisgKiBzdHJ1Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG0gbWVtYmVyIHZhcmlhYmxlOyBob3dldmVyLCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqIGFyZSB3cmFwcGVkIGRpcmVjdGx5LiAoVGhpcyBpcyBiZWNhdXNlIGZsZXhpYmxlIHR5cGVzIGNhbm5vdCBiZSBzdWJjbGFzc2VkLikKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBDMkdsb2JhbFBhcmFtPFQsIFMsIFBhcmFtSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgorICAgIDogcHVibGljIFQsIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OlR5cGU6OkRJUl9HTE9CQUw+IHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJHbG9iYWxQYXJhbShzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX1R5cGU6OlBBUkFNX1RZUEUpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKK3B1YmxpYzoKKyAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKQorICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKK307CisKKy8qKgorICogUG9ydC1wYXJhbWV0ZXIgdGVtcGxhdGUuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBwb3J0IHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBQb3J0IHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLCBidXQgbm90IHRvIGEKKyAqIHNwZWNpZmljIHN0cmVhbS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIG9mIHRoZSB3cmFwcGVkCisgKiBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBhbmQgY29uc3RydWN0b3JzIGFuZCBwb3RlbnRpYWwgcHVibGljIG1ldGhvZHMgYXJlIGFsc28KKyAqIHdyYXBwZWQuCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBwb3J0IHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkLCBpbnB1dCBhbmQgb3V0cHV0LiBQYXJhbWV0ZXJzIHdpdGgKKyAqIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gaW5pdGlhbCBwb3J0IHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4PVM6OkNPUkVfSU5ERVgsIGNsYXNzIEZsZXg9dm9pZD4KK3N0cnVjdCBDMl9ISURFIEMyUG9ydFBhcmFtIDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICBwcml2YXRlIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX1VOREVGSU5FRD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJQb3J0UGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKK3B1YmxpYzoKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oKSA6IFQoc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUpIHsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oYm9vbCBfb3V0cHV0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KKworICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX0lOUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IFQoc2l6ZW9mKF9UeXBlKSwgaW5wdXQ6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKworICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX09VVFBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dChjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX1R5cGUpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCisgICAgfTsKK307CisKKy8qKgorICogUG9ydC1wYXJhbWV0ZXIgdGVtcGxhdGUgZm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBwb3J0IHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBQb3J0IHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLCBidXQgbm90IHRvIGEKKyAqIHNwZWNpZmljIHN0cmVhbS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIG9mIGZsZXhpYmxlCisgKiBzdHJ1Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG0gbWVtYmVyIHZhcmlhYmxlOyBob3dldmVyLCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqIGFyZSB3cmFwcGVkIGRpcmVjdGx5LiAoVGhpcyBpcyBiZWNhdXNlIGZsZXhpYmxlIHR5cGVzIGNhbm5vdCBiZSBzdWJjbGFzc2VkLikKKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHBvcnQgcGFyYW1ldGVyczogdW5zcGVjaWZpZWQsIGlucHV0IGFuZCBvdXRwdXQuIFBhcmFtZXRlcnMgd2l0aAorICogdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBpbml0aWFsIHBvcnQgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4LCBJRl9GTEVYSUJMRShTKT4KKyAgICA6IHB1YmxpYyBULCBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpUeXBlOjpESVJfVU5ERUZJTkVEPiB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgQzJQb3J0UGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgYmFzaWMgYWxsb2NhdGlvbjogbmV3KGZsZXhDb3VudCkgUC4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIEMyUG9ydFBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGJvb2wgX291dHB1dCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSksCisgICAgICAgICAgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCitwdWJsaWM6CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorCisgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9JTlBVVD4geworICAgIHByaXZhdGU6CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OlBBUkFNX1RZUEUpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKGlucHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfT1VUUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgb3V0cHV0OjpQQVJBTV9UWVBFKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhvdXRwdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCisgICAgfTsKK307CisKKy8qKgorICogU3RyZWFtLXBhcmFtZXRlciB0ZW1wbGF0ZS4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHN0cmVhbSBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gU3RyZWFtIHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBzcGVjaWZpYyBzdHJlYW0gb24gYSBwb3J0IChpbnB1dCBvcgorICogb3V0cHV0KS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW10ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHN0cmVhbSBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCBwb3J0LCBpbnB1dCBhbmQgb3V0cHV0LiBBbGwgb2YgdGhlc2UgZXhwb3NlCisgKiBhIHNldFN0cmVhbSBtZXRob2QgYW5kIGFuIGV4dHJhIGluaXRpYWwgc3RyZWFtSUQgcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3IuIE1vcmVvdmVyLAorICogcGFyYW1ldGVycyB3aXRoIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gYWRkaXRpb25hbCBpbml0aWFsIHBvcnQKKyAqIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4PVM6OkNPUkVfSU5ERVgsIGNsYXNzIEZsZXg9dm9pZD4KK3N0cnVjdCBDMl9ISURFIEMyU3RyZWFtUGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHByaXZhdGUgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6SW5kZXg6OkRJUl9VTkRFRklORUQ+IHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKK3B1YmxpYzoKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gUG9ydC9kaXJlY3Rpb24gYW5kIHN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oKSA6IFQoc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUpIHsgfQorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbiBhbmQKKyAgICAvLy8gc3RyZWFtLUlELgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oYm9vbCBfb3V0cHV0LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwKKyAgICAgICAgICBTKGFyZ3MuLi4pIHsgfQorICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KKyAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9JTlBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorCisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgICAgICBpbmxpbmUgaW5wdXQoKSA6IFQoc2l6ZW9mKF9UeXBlKSwgaW5wdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQodW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIFMoYXJncy4uLikgeyB9CisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX09VVFBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorCisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgICAgICBpbmxpbmUgb3V0cHV0KCkgOiBUKHNpemVvZihfVHlwZSksIG91dHB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQodW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgb3V0cHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBTKGFyZ3MuLi4pIHsgfQorICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBTdHJlYW0tcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgc3RyZWFtIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBTdHJlYW0gcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHNwZWNpZmljIHN0cmVhbSBvbiBhIHBvcnQgKGlucHV0IG9yCisgKiBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2Ygc3RyZWFtIHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkIHBvcnQsIGlucHV0IGFuZCBvdXRwdXQuIEFsbCBvZiB0aGVzZSBleHBvc2UKKyAqIGEgc2V0U3RyZWFtIG1ldGhvZCBhbmQgYW4gZXh0cmEgaW5pdGlhbCBzdHJlYW1JRCBwYXJhbWV0ZXIgZm9yIHRoZSBjb25zdHJ1Y3Rvci4gTW9yZW92ZXIsCisgKiBwYXJhbWV0ZXJzIHdpdGggdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBhZGRpdGlvbmFsIGluaXRpYWwgcG9ydAorICogcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBDMlN0cmVhbVBhcmFtPFQsIFMsIFBhcmFtSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgorICAgIDogcHVibGljIFQsCisgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpJbmRleDo6RElSX1VOREVGSU5FRD4geworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFBvcnQvZGlyZWN0aW9uIGFuZCBzdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX1R5cGU6OlBBUkFNX1RZUEUsIDB1KSB7IH0KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24gYW5kCisgICAgLy8vIHN0cmVhbS1JRC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGJvb2wgX291dHB1dCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLAorICAgICAgICAgIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworcHVibGljOgorICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX0lOUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBpbnB1dChzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoaW5wdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfT1VUUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKG91dHB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09IFNJTVBMRSBWQUxVRSBQQVJBTUVURVJTID09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFxpbmdyb3VwIGludGVybmFsCisgKiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdG9ycyBhbmQgbm8gY29yZS1pbmRleC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlNpbXBsZVZhbHVlU3RydWN0IHsKKyAgICBUIHZhbHVlOyAvLy88IHNpbXBsZSB2YWx1ZSBvZiB0aGUgc3RydWN0dXJlCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICAvLyBDb25zdHJ1Y3RvciB3aXRoIGFuIGluaXRpYWwgdmFsdWUuCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3QoVCB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSkge30KKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChTaW1wbGVWYWx1ZSkKK307CisKKy8vIFRPRE86IG1vdmUgdGhpcyBhbmQgbmV4dCB0byBzb21lIGdlbmVyaWMgcGxhY2UKKy8qKgorICogSW50ZXJmYWNlIHRvIGEgYmxvY2sgb2YgKG1hcHBlZCkgbWVtb3J5IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2Ygc29tZSB0eXBlIChUKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMk1lbW9yeUJsb2NrIHsKKyAgICAvLy8gXHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGJsb2NrLgorICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7CisgICAgLy8vIFxyZXR1cm5zIGEgY29uc3QgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhpcyBibG9jay4gQ2FyZSBtdXN0IGJlIHRha2VuIHRvIG5vdCByZWFkIG91dHNpZGUKKyAgICAvLy8gdGhlIGJsb2NrLgorICAgIHZpcnR1YWwgY29uc3QgVCAqZGF0YSgpIGNvbnN0ID0gMDsgLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgZnJpZW5kIGFjY2VzcyBvbmx5IGluIHNvbWUgQzJNZW1vcnkgbW9kdWxlPworICAgIC8vLyBccmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgYmxvY2suIENhcmUgbXVzdCBiZSB0YWtlbiB0byBub3QgcmVhZCBvciB3cml0ZQorICAgIC8vLyBvdXRzaWRlIHRoZSBibG9jay4KKyAgICBpbmxpbmUgVCAqZGF0YSgpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VCo+KGNvbnN0X2Nhc3Q8Y29uc3QgQzJNZW1vcnlCbG9jayo+KHRoaXMpLT5kYXRhKCkpOyB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyBUT0RPOiBmb3Igbm93IGl0IHNob3VsZCBuZXZlciBiZSBkZWxldGVkIGFzIEMyTWVtb3J5QmxvY2sKKyAgICB2aXJ0dWFsIH5DMk1lbW9yeUJsb2NrKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gYSBibG9jayBvZiBtZW1vcnkgY29udGFpbmluZyBhIGNvbnN0YW50IChjb25zdGV4cHIpIGFycmF5IG9mIHNvbWUgdHlwZSAoVCkuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJDb25zdE1lbW9yeUJsb2NrIDogcHVibGljIEMyTWVtb3J5QmxvY2s8VD4geworICAgIHZpcnR1YWwgY29uc3QgVCAqIGRhdGEoKSBjb25zdCB7IHJldHVybiBfbURhdGE7IH0KKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX21TaXplOyB9CisKKyAgICAvLy8gQ29uc3RydWN0b3IuCisgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAgICBpbmxpbmUgY29uc3RleHByIEMyQ29uc3RNZW1vcnlCbG9jayhjb25zdCBUKCZpbml0KVtOXSkgOiBfbURhdGEoaW5pdCksIF9tU2l6ZShOKSB7fQorCitwcml2YXRlOgorICAgIGNvbnN0IFQgKl9tRGF0YTsKKyAgICBjb25zdCBzaXplX3QgX21TaXplOworfTsKKworLy8vIFxhZGR0b2dyb3VwIGludGVybmFsCisvLy8gQHsKKworLy8vIEhlbHBlciBjbGFzcyB0byBpbml0aWFsaXplIGZsZXhpYmxlIGFycmF5cyB3aXRoIHZhcmlvdXMgaW5pdGFsaXplcnMuCitzdHJ1Y3QgX0MyVmFsdWVBcnJheUhlbHBlciB7CisgICAgLy8gY2hhcltdLXMgYXJlIHVzZWQgYXMgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MsIHNvIHRoZSBsYXN0IGVsZW1lbnQgaXMgbmV2ZXIgaW5pdGVkLgorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhIGNvbnN0ZXhwciBtZW1vcnkgYmxvY2suCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGlmIChibG9jay5kYXRhKCkpIHsKKyAgICAgICAgICAgIG1lbWNweShhcnJheSwgYmxvY2suZGF0YSgpLCBzdGQ6Om1pbihhcnJheUxlbiwgYmxvY2suc2l6ZSgpKSAqIHNpemVvZihUKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiAmaW5pdCkgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICAvLyByZXNlcnZlIGxhc3QgZWxlbWVudCBmb3IgdGVybWluYWwgMCBmb3Igc3RyaW5ncworICAgICAgICBpZiAoYXJyYXlMZW4gJiYgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSkgeworICAgICAgICAgICAgLS1hcnJheUxlbjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IFQgJml0ZW0gOiBpbml0KSB7CisgICAgICAgICAgICBpZiAoaXggPT0gYXJyYXlMZW4pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFycmF5W2l4KytdID0gaXRlbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYSB2ZWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZpbml0KSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgVCAmaXRlbSA6IGluaXQpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBhcnJheUxlbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJyYXlbaXgrK10gPSBpdGVtOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhbm90aGVyIGZsZXhpYmxlIGFycmF5LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CisgICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBUKCZzdHIpW05dKSB7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGlmIChhcnJheUxlbikgeworICAgICAgICAgICAgbWVtY3B5KGFycmF5LCBzdHIsIHN0ZDo6bWluKGFycmF5TGVuLCAoc2l6ZV90KU4pICogc2l6ZW9mKFQpKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIGEgZmxleGlibGUgYmxvYiBhbmQgc3RyaW5nIGFycmF5cy4gQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZQorICogZmxleGlibGUgYXJyYXkgbWVtYmVyIHdpdGggZGVmYXVsdCBmbGV4aWJsZSBjb25zdHJ1Y3RvcnMgYW5kIG5vIGNvcmUtaW5kZXguIFRoaXMgdHlwZSBjYW5ub3QgYmUKKyAqIGNvbnN0cnVjdGVkIG9uIGl0cyBvd24gYXMgaXQncyBzaXplIGlzIDAuCisgKgorICogXGludGVybmFsIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gQzJTaW1wbGVBcnJheVN0cnVjdDxUW10+IHNpbXBseSBiZWNhdXNlIGl0cyBtZW1iZXIgaGFzIHRoZSBuYW1lCisgKiBhcyB2YWx1ZSB0byByZWZsZWN0IHRoaXMgaXMgYSBzaW5nbGUgdmFsdWUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUgfHwgc3RkOjppc19zYW1lPFQsIHVpbnQ4X3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4gaXMgb25seSBmb3IgQkxPQiBvciBTVFJJTkciKTsKKyAgICBUIHZhbHVlW107CisKKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChTaW1wbGVWYWx1ZSkKKyAgICBGTEVYKEMyU2ltcGxlVmFsdWVTdHJ1Y3QsIHZhbHVlKQorCitwcml2YXRlOgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgYmxvY2spOworICAgIH0KKworICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBUKCZpbml0KVtOXSkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KK307CisKKy8vLyBAfQorCisvKioKKyAqIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUgZmxleGlibGUgYXJyYXkgZWxlbWVudCBvZiBhIHNwZWNpZmljIHR5cGUgKFQpIHdpdGgKKyAqIGRlZmF1bHQgY29uc3RydWN0b3JzIGFuZCBubyBjb3JlLWluZGV4LiBUaGlzIHR5cGUgY2Fubm90IGJlIGNvbnN0cnVjdGVkIG9uIGl0cyBvd24gYXMgaXQncyBzaXplCisgKiBpcyAwLiBJbnN0ZWFkLCBpdCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyLCBlLmcuCisgKgorICogICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyTXlGYW5jeVN0cnVjdD4sCisgKiAgICAgICAgICAga1BhcmFtSW5kZXhNeUZhbmN5QXJyYXlTdHJlYW1QYXJhbT4gQzJNeUZhbmN5QXJyYXlTdHJlYW1JbmZvOworICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyU2ltcGxlQXJyYXlTdHJ1Y3QgeworICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUgJiYgIXN0ZDo6aXNfc2FtZTxULCB1aW50OF90Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAidXNlIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiBpcyBmb3IgQkxPQiBvciBTVFJJTkciKTsKKworICAgIFQgdmFsdWVzW107IC8vLzwgYXJyYXkgbWVtYmVyCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNUKFNpbXBsZUFycmF5LCB2YWx1ZXMpCisgICAgLy9GTEVYKEMyU2ltcGxlQXJyYXlTdHJ1Y3QsIHZhbHVlcykKKworcHJpdmF0ZToKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBDMk1lbW9yeUJsb2NrLgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBDMk1lbW9yeUJsb2NrPFQ+ICZibG9jaykgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBibG9jayk7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gdmVjdG9yLgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW5vdGhlciBmbGV4aWJsZSBhcnJheS4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBUKCZpbml0KVtOXSkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlcywgZmxleENvdW50LCBpbml0KTsKKyAgICB9Cit9OworCisvKioKKyAqIFxhZGR0b2dyb3VwIHNpbXBsZXZhbHVlIFNpbXBsZSB2YWx1ZSBhbmQgYXJyYXkgc3RydWN0dXJlcy4KKyAqIEB7CisgKgorICogU2ltcGxlIHZhbHVlIHN0cnVjdHVyZXMuCisgKgorICogU3RydWN0dXJlcyBjb250YWluaW5nIGEgc2luZ2xlIHNpbXBsZSB2YWx1ZS4gVGhlc2UgY2FuIGJlIHJldXNlZCB0byBlYXNpbHkgZGVmaW5lIHNpbXBsZQorICogcGFyYW1ldGVycyBvZiB2YXJpb3VzIHR5cGVzOgorICoKKyAqICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE15SW50ZWdlclBvcnRQYXJhbT4KKyAqICAgICAgICAgICBDMk15SW50ZWdlclBvcnRQYXJhbVR1bmluZzsKKyAqCisgKiBUaGV5IGNvbnRhaW4gYSBzaW5nbGUgbWVtYmVyICh2YWx1ZSBvciB2YWx1ZXMpIHRoYXQgaXMgZGVzY3JpYmVkIGFzICJ2YWx1ZSIgb3IgInZhbHVlcyIuCisgKgorICogVGhlc2Ugc3RydWN0dXJlcyBkb24ndCBkZWZpbmUgYSBjb3JlIGluZGV4LCBhbmQgYXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgdXNlZCBpbiBzdHJ1Y3R1cmUKKyAqIGRlY2xhcmF0aW9ucy4gVXNlIHR5cGVbXSBpbnN0ZWFkLCBzdWNoIGFzIGludDMyX3QgZmllbGRbXS4KKyAqLworLy8vIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxpbnQzMl90PiBDMkludDMyVmFsdWU7CisvLy8gQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8aW50MzJfdD4gQzJJbnQzMkFycmF5OworLy8vIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQzMl90PiBDMlVpbnQzMlZhbHVlOworLy8vIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8dWludDMyX3Q+IEMyVWludDMyQXJyYXk7CisvLy8gQSA2NC1iaXQgc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGludDY0X3Q+IEMySW50NjRWYWx1ZTsKKy8vLyBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQ2NF90PiBDMkludDY0QXJyYXk7CisvLy8gQSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDY0X3Q+IEMyVWludDY0VmFsdWU7CisvLy8gQSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDx1aW50NjRfdD4gQzJVaW50NjRBcnJheTsKKy8vLyBBIGZsb2F0IHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxmbG9hdD4gQzJGbG9hdFZhbHVlOworLy8vIEEgZmxvYXQgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8ZmxvYXQ+IEMyRmxvYXRBcnJheTsKKy8vLyBBIGJsb2IgZmxleGlibGUgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQ4X3RbXT4gQzJCbG9iVmFsdWU7CisvLy8gQSBzdHJpbmcgZmxleGlibGUgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGNoYXJbXT4gQzJTdHJpbmdWYWx1ZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZVZhbHVlU3RydWN0PFQ+OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIHsgREVTQ1JJQkVfQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikgfTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIHsgREVTQ1JJQkVfQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikgfTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJTaW1wbGVBcnJheVN0cnVjdDxUPjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiB7IERFU0NSSUJFX0MyRklFTEQodmFsdWVzLCAidmFsdWVzIikgfTsKK30KKworLy8vIEB9CisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyUEFSQU1fREVGX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTIzZjNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJXT1JLX0hfCisKKyNkZWZpbmUgQzJXT1JLX0hfCisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworLy8vIFxkZWZncm91cCB3b3JrIFdvcmsgYW5kIGRhdGEgcHJvY2Vzc2luZworLy8vIEB7CisKKy8qKgorICogSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgcmVhc29uIGEgcGFyYW1ldGVyIHNldHRpbmdzIG1heSBmYWlsLCBvcgorICogbWF5IGJlIG92ZXJyaWRlbi4KKyAqLworc3RydWN0IEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgZW51bSBGYWlsdXJlIDogdWludDMyX3QgeworICAgICAgICAvKiBwYXJhbWV0ZXIgZmFpbHVyZXMgYmVsb3cgKi8KKyAgICAgICAgQkFEX1RZUEUsICAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICBCQURfUE9SVCwgICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpYyBwb3J0CisgICAgICAgIEJBRF9JTkRFWCwgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmljIHN0cmVhbQorICAgICAgICBSRUFEX09OTFksICAvLy88IHBhcmFtZXRlciBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQKKyAgICAgICAgTUlTTUFUQ0gsICAgLy8vPCBwYXJhbWV0ZXIgbWlzbWF0Y2hlcyBpbnB1dCBkYXRhCisKKyAgICAgICAgLyogZmllbGQgZmFpbHVyZXMgYmVsb3cgKi8KKyAgICAgICAgQkFEX1ZBTFVFLCAgLy8vPCBzdHJpY3QgcGFyYW1ldGVyIGRvZXMgbm90IGFjY2VwdCB2YWx1ZSBmb3IgdGhlIGZpZWxkIGF0IGFsbAorICAgICAgICBDT05GTElDVCwgICAvLy88IHN0cmljdCBwYXJhbWV0ZXIgZmllbGQgdmFsdWUgaXMgaW4gY29uZmxpY3Qgd2l0aCBhbi9vdGhlciBzZXR0aW5nKHMpCisKKyAgICAgICAgLy8vIHBhcmFtZXRlciBmaWVsZCBpcyBvdXQgb2YgcmFuZ2UgZHVlIHRvIG90aGVyIHNldHRpbmdzICh0aGlzIGZhaWx1cmUgbW9kZQorICAgICAgICAvLy8gY2FuIG9ubHkgYmUgdXNlZCBmb3Igc3RyaWN0IGNhbGN1bGF0ZWQgcGFyYW1ldGVycykKKyAgICAgICAgVU5TVVBQT1JURUQsCisKKyAgICAgICAgLy8vIGZpZWxkIGRvZXMgbm90IGFjY2VzcyB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlciB2YWx1ZSBhdCBhbGwuIEl0IGhhcyBiZWVuIGNvcnJlY3RlZCB0bworICAgICAgICAvLy8gdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHZhbHVlLiBUaGlzIGZhaWx1cmUgbW9kZSBpcyBwcm92aWRlZCB0byBnaXZlIGd1aWRhbmNlIGFzIHRvIHdoYXQKKyAgICAgICAgLy8vIGFyZSB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQgKHdoaWNoIG1heSBiZSBhIHN1YnNldCBvZiB0aGUgYXQtYWxsLQorICAgICAgICAvLy8gcG90ZW50aWFsIHZhbHVlcykKKyAgICAgICAgSU5GT19CQURfVkFMVUUsCisKKyAgICAgICAgLy8vIHJlcXVlc3RlZCBwYXJhbWV0ZXIgdmFsdWUgaXMgaW4gY29uZmxpY3Qgd2l0aCBhbi9vdGhlciBzZXR0aW5nKHMpCisgICAgICAgIC8vLyBhbmQgaGFzIGJlZW4gY29ycmVjdGVkIHRvIHRoZSBjbG9zZXN0IHN1cHBvcnRlZCB2YWx1ZS4gVGhpcyBmYWlsdXJlCisgICAgICAgIC8vLyBtb2RlIGlzIGdpdmVuIHRvIHByb3ZpZGUgZ3VpZGFuY2UgYXMgdG8gd2hhdCBhcmUgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGFzIHdlbGwKKyAgICAgICAgLy8vIGFzIHRvIG9wdGlvbmFsbHkgcHJvdmlkZSBzdWdnZXN0aW9uIHRvIHRoZSBjbGllbnQgYXMgdG8gaG93IHRvIGVuYWJsZSB0aGUgcmVxdWVzdGVkCisgICAgICAgIC8vLyBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICAgIElORk9fQ09ORkxJQ1QsCisgICAgfTsKKworICAgIEZhaWx1cmUgZmFpbHVyZTsgICAgLy8vPCBmYWlsdXJlIGNvZGUKKworICAgIC8vLyBGYWlsaW5nIChvciBjb3JyZWN0ZWQpIGZpZWxkIG9yIHBhcmFtZXRlcmFuZCBvcHRpb25hbGx5LCBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlCisgICAgLy8vIGZpZWxkLiBWYWx1ZXMgbXVzdCBvbmx5IGJlIHNldCBmb3IgZmllbGQgZmFpbHVyZXMgb3RoZXIgdGhhbiBCQURfVkFMVUUsIGFuZCBvbmx5IGlmIHRoZXkgYXJlCisgICAgLy8vIGRpZmZlcmVudCBmcm9tIHRoZSBnbG9iYWxseSBzdXBwb3J0ZWQgdmFsdWVzIChlLmcuIGR1ZSB0byByZXN0cmljdGlvbnMgYnkgYW5vdGhlciBwYXJhbSBvcgorICAgIC8vLyBpbnB1dCBkYXRhKS4KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMgZmllbGQ7CisKKyAgICAvLy8gQ29uZmxpY3RpbmcgcGFyYW1ldGVycyBvciBmaWVsZHMgd2l0aCBvcHRpb25hbCBzdWdnZXN0aW9ucyB3aXRoIChvcHRpb25hbCkgc3VnZ2VzdGVkIHZhbHVlcworICAgIC8vLyBmb3IgYW55IGNvbmZsaWN0aW5nIGZpZWxkcyB0byBhdm9pZCB0aGUgY29uZmxpY3QuIE11c3Qgb25seSBiZSBzZXQgZm9yIENPTkZMSUNULCBVTlNVUFBPUlRFRAorICAgIC8vLyBhbmQgSU5GT19DT05GTElDVCBmYWlsdXJlIGNvZGVzLgorICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gY29uZmxpY3RzOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgV09SSworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKiBVbmlxdWUgSUQgZm9yIGEgcHJvY2Vzc2luZyBub2RlLiAqLwordHlwZWRlZiB1aW50MzJfdCBjMl9ub2RlX2lkX3Q7CisKK2VudW0geworICAgIGtQYXJhbUluZGV4V29ya09yZGluYWwsCit9OworCisvKioKKyAqIEluZm9ybWF0aW9uIGZvciBvcmRlcmluZyB3b3JrIGl0ZW1zIG9uIGEgY29tcG9uZW50IHBvcnQuCisgKi8KK3N0cnVjdCBDMldvcmtPcmRpbmFsU3RydWN0IHsKKy8vcHVibGljOgorICAgIGMyX2NudHI2NF90IHRpbWVzdGFtcDsgICAgIC8qKiBmcmFtZSB0aW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzICovCisgICAgYzJfY250cjY0X3QgZnJhbWVJbmRleDsgICAgLyoqIHN1Ym1pc3Npb24gb3JkaW5hbCBvbiB0aGUgaW5pdGlhbCBjb21wb25lbnQgKi8KKyAgICBjMl9jbnRyNjRfdCBjdXN0b21PcmRpbmFsOyAvKiogY2FuIGJlIGdpdmVuIGJ5IHRoZSBjb21wb25lbnQsIGUuZy4gZGVjb2RlIG9yZGVyICovCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFdvcmtPcmRpbmFsKQorICAgIEMyRklFTEQodGltZXN0YW1wLCAidGltZXN0YW1wIikKKyAgICBDMkZJRUxEKGZyYW1lSW5kZXgsICJmcmFtZS1pbmRleCIpCisgICAgQzJGSUVMRChjdXN0b21PcmRpbmFsLCAiY3VzdG9tLW9yZGluYWwiKQorfTsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgQ29kZWMgMi4wIGZyYW1lIHdpdGggaXRzIG1ldGFkYXRhLgorICoKKyAqIEEgZnJhbWUgYmFzaWNhbGx5IGNvbnNpc3RzIG9mIGFuIG9yZGVyZWQgc2V0cyBvZiBidWZmZXJzLCBjb25maWd1cmF0aW9uIGNoYW5nZXMgYW5kIGluZm8gYnVmZmVycworICogYWxvbmcgd2l0aCBzb21lIG5vbi1jb25maWd1cmF0aW9uIG1ldGFkYXRhLgorICovCitzdHJ1Y3QgQzJGcmFtZURhdGEgeworLy9wdWJsaWM6CisgICAgZW51bSBmbGFnc190IDogdWludDMyX3QgeworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIGlucHV0IGZyYW1lczogbm8gb3V0cHV0IGZyYW1lIHNoYWxsIGJlIGdlbmVyYXRlZCB3aGVuIHByb2Nlc3NpbmcgdGhpcyBmcmFtZSwgYnV0CisgICAgICAgICAqIG1ldGFkYXRhIHNoYWxsIHN0aWxsIGJlIHByb2Nlc3NlZC4KKyAgICAgICAgICogRm9yIG91dHB1dCBmcmFtZXM6IHRoaXMgZnJhbWUgc2hhbGwgYmUgZGlzY2FyZGVkIGFuZCBidXQgbWV0YWRhdGEgaXMgc3RpbGwgdmFsaWQuCisgICAgICAgICAqLworICAgICAgICBGTEFHX0RST1BfRlJBTUUgICAgPSAoMSA8PCAwKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgaXMgdGhlIGxhc3QgZnJhbWUgb2YgdGhlIGN1cnJlbnQgc3RyZWFtLiBGdXJ0aGVyIGZyYW1lcyBhcmUgcGFydCBvZiBhIG5ldworICAgICAgICAgKiBzdHJlYW0uCisgICAgICAgICAqLworICAgICAgICBGTEFHX0VORF9PRl9TVFJFQU0gPSAoMSA8PCAxKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgc2hhbGwgYmUgZGlzY2FyZGVkIHdpdGggaXRzIG1ldGFkYXRhLgorICAgICAgICAgKiBUaGlzIGZsYWcgaXMgb25seSBzZXQgYnkgY29tcG9uZW50cyAtIGUuZy4gYXMgYSByZXNwb25zZSB0byB0aGUgZmx1c2ggY29tbWFuZC4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRElTQ0FSRF9GUkFNRSA9ICgxIDw8IDIpLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBpcyBub3QgdGhlIGxhc3QgZnJhbWUgcHJvZHVjZWQgZm9yIHRoZSBpbnB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBmbGFnIGlzIG5vcm1hbGx5IHNldCBieSB0aGUgY29tcG9uZW50IC0gZS5nLiB3aGVuIGFuIGlucHV0IGZyYW1lIHJlc3VsdHMgaW4gbXVsdGlwbGUKKyAgICAgICAgICogb3V0cHV0IGZyYW1lcywgdGhpcyBmbGFnIGlzIHNldCBvbiBhbGwgYnV0IHRoZSBsYXN0IG91dHB1dCBmcmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQWxzbywgd2hlbiBjb21wb25lbnRzIGFyZSBjaGFpbmVkLCB0aGlzIGZsYWcgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZG93biB0aGUKKyAgICAgICAgICogd29yayBjaGFpbi4gVGhhdCBpcywgaWYgc2V0IG9uIGFuIGVhcmxpZXIgZnJhbWUgb2YgYSB3b3JrLWNoYWluLCBpdCBzaG91bGQgYmUgcHJvcGFnYXRlZAorICAgICAgICAgKiB0byBhbGwgbGF0ZXIgZnJhbWVzIGluIHRoYXQgY2hhaW4uIEFkZGl0aW9uYWxseSwgY29tcG9uZW50cyBkb3duIHRoZSBjaGFpbiBjb3VsZCBzZXQKKyAgICAgICAgICogdGhpcyBmbGFnIGV2ZW4gaWYgbm90IHNldCBlYXJsaWVyLCBlLmcuIGlmIG11bHRpcGxlIG91dHB1dCBmcmFtZSBpcyBnZW5lcmF0ZWQgYXQgdGhhdAorICAgICAgICAgKiBjb21wb25lbnQgZm9yIHRoZSBpbnB1dCBmcmFtZS4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfSU5DT01QTEVURSA9ICgxIDw8IDMpLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBjb250YWlucyBvbmx5IGNvZGVjLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGF0YSwgYW5kIG5vIGFjdHVhbCBhY2Nlc3MgdW5pdC4KKyAgICAgICAgICoKKyAgICAgICAgICogXGRlcHJlY2F0ZWQgcGFzcyBjb2RlYyBjb25maWd1cmF0aW9uIHdpdGggdXNpbmcgdGhlIFx0b2RvIGNvZGVjLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogaW5mbyB0b2dldGhlciB3aXRoIHRoZSBhY2Nlc3MgdW5pdC4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfQ09ERUNfQ09ORklHICA9ICgxdSA8PCAzMSksCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEZyYW1lIGZsYWdzICovCisgICAgZmxhZ3NfdCAgZmxhZ3M7CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IGJ1ZmZlcnM7CisgICAgLy88IGZvciBpbml0aWFsIHdvcmsgaXRlbSwgdGhlc2UgbWF5IGFsc28gY29tZSBmcm9tIHRoZSBwYXJzZXIgLSBpZiBwcm92aWRlZAorICAgIC8vPCBmb3Igb3V0cHV0IGJ1ZmZlcnMsIHRoZXNlIGFyZSB0aGUgcmVzcG9uc2VzIHRvIHJlcXVlc3RlZEluZm9zCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAgICAgIGNvbmZpZ1VwZGF0ZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPj4gaW5mb0J1ZmZlcnM7Cit9OworCitzdHJ1Y3QgQzJXb3JrbGV0IHsKKy8vcHVibGljOgorICAgIC8vIElOCisgICAgYzJfbm9kZV9pZF90IGNvbXBvbmVudDsKKworICAgIC8qKiBDb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gYmUgYXBwbGllZCBiZWZvcmUgcHJvY2Vzc2luZyB0aGlzIHdvcmtsZXQuICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4gdHVuaW5nczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisKKyAgICAvLyBPVVQKKyAgICBDMkZyYW1lRGF0YSBvdXRwdXQ7Cit9OworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IHBhcnRpYWwgd29yay1jaGFpbnMgbm90IHBhcnQgb2YgdGhlIGN1cnJlbnQgd29yayBpdGVtcy4KKyAqCisgKiBUbyBiZSBkZWZpbmVkIGxhdGVyLgorICovCitzdHJ1Y3QgQzJXb3JrQ2hhaW5JbmZvOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBhIHNpbmdsZSB3b3JrIGl0ZW0uCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgc2hhbGwgYmUgcGFzc2VkIGJ5IHRoZSBjbGllbnQgdG8gdGhlIGNvbXBvbmVudCBmb3IgdGhlIGZpcnN0IHdvcmtsZXQuIEFzIHN1Y2gsCisgKiB3b3JrbGV0cyBtdXN0IG5vdCBiZSBlbXB0eS4gVGhlIG93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCBpcyBwYXNzZWQuCisgKi8KK3N0cnVjdCBDMldvcmsgeworLy9wdWJsaWM6CisgICAgLy8vIGFkZGl0aW9uYWwgd29yayBjaGFpbiBpbmZvIG5vdCBwYXJ0IG9mIHRoaXMgd29yaworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMldvcmtDaGFpbkluZm8+IGNoYWluSW5mbzsKKworICAgIC8vLyBUaGUgaW5wdXQgZGF0YSB0byBiZSBwcm9jZXNzZWQgYXMgcGFydCBvZiB0aGlzIHdvcmsvd29yay1jaGFpbi4gVGhpcyBpcyBwcm92aWRlZCBieSB0aGUKKyAgICAvLy8gY2xpZW50IHdpdGggb3duZXJzaGlwLiBXaGVuIHRoZSB3b3JrIGlzIHJldHVybmVkICh2aWEgb25Xb3JrRG9uZSksIHRoZSBpbnB1dCBidWZmZXItcGFjaydzCisgICAgLy8vIGJ1ZmZlciB2ZWN0b3Igc2hhbGwgY29udGFpbiBudWxscHRycy4KKyAgICBDMkZyYW1lRGF0YSBpbnB1dDsKKworICAgIC8vLyBUaGUgY2hhaW4gb2YgY29tcG9uZW50cywgdHVuaW5ncyAoaW5jbHVkaW5nIG91dHB1dCBidWZmZXIgcG9vbCBJRHMpIGFuZCBpbmZvIHJlcXVlc3RzIHRoYXQgdGhlCisgICAgLy8vIGRhdGEgbXVzdCBwYXNzIHRocm91Z2guIElmIHRoaXMgaGFzIG1vcmUgdGhhbiBhIHNpbmdsZSBlbGVtZW50LCB0aGUgdHVubmVscyBiZXR3ZWVuIHN1Y2Nlc3NpdmUKKyAgICAvLy8gY29tcG9uZW50cyBvZiB0aGUgd29ya2xldCBjaGFpbiBtdXN0IGhhdmUgYmVlbiAoc3VjY2Vzc2Z1bGx5KSBwcmUtcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGF0CisgICAgLy8vIHRoZSB3b3JrIGlzIHN1Ym1pdHRlZC4gQWxsb2NhdGluZyB0aGUgb3V0cHV0IGJ1ZmZlcnMgaW4gdGhlIHdvcmtsZXRzIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZgorICAgIC8vLyBlYWNoIGNvbXBvbmVudC4gVXBvbiB3b3JrIHN1Ym1pc3Npb24sIGVhY2ggb3V0cHV0IGJ1ZmZlci1wYWNrIHNoYWxsIGJlIGFuIGFwcHJvcHJpYXRlbHkgc2l6ZWQKKyAgICAvLy8gdmVjdG9yIGNvbnRhaW5pbmcgbnVsbHB0cnMuIFdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGVkL3JldHVybmVkIHRvIHRoZSBjbGllbnQsIG91dHB1dCBidWZmZXJzCisgICAgLy8vIHBvaW50ZXJzIGZyb20gYWxsIGJ1dCB0aGUgZmluYWwgd29ya2xldCBzaGFsbCBiZSBudWxscHRycy4KKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4+IHdvcmtsZXRzOworCisgICAgLy8vIE51bWJlciBvZiB3b3JrbGV0cyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIGluIHRoaXMgY2hhaW4uIFRoaXMgc2hhbGwgYmUgaW5pdGlhbGl6ZWQgdG8gMCBieSB0aGUKKyAgICAvLy8gY2xpZW50IHdoZW4gdGhlIHdvcmsgaXMgc3VibWl0dGVkLiBJdCBzaGFsbCBjb250YWluIHRoZSBudW1iZXIgb2Ygd29ya2xldHMgdGhhdCB3ZXJlCisgICAgLy8vIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgd2hlbiB0aGUgd29yayBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LiBJZiB0aGlzIGlzIGxlc3MgdGhlbiB0aGUgbnVtYmVyCisgICAgLy8vIG9mIHdvcmtsZXRzLCByZXN1bHQgbXVzdCBub3QgYmUgc3VjY2Vzcy4gSXQgbXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgWzAsIHdvcmtsZXRzLnNpemUoKV0uCisgICAgdWludDMyX3Qgd29ya2xldHNQcm9jZXNzZWQ7CisKKyAgICAvLy8gVGhlIGZpbmFsIG91dGNvbWUgb2YgdGhlIHdvcmsgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgd29ya2xldHNQcm9jZXNzZWQpLiBJZiAwIHdoZW4KKyAgICAvLy8gd29yayBpcyByZXR1cm5lZCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCB3b3JrbGV0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorICAgIGMyX3N0YXR1c190IHJlc3VsdDsKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgYSBmdXR1cmUgd29yayB0byBiZSBzdWJtaXR0ZWQgdG8gdGhlIGNvbXBvbmVudC4gVGhlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8KKyAqIHJlc2VydmUgdGhlIHdvcmsgZm9yIHdvcmsgb3JkZXJpbmcgcHVycG9zZXMuCisgKi8KK3N0cnVjdCBDMldvcmtPdXRsaW5lIHsKKy8vcHVibGljOgorICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbDsKKyAgICBzdGQ6OnZlY3RvcjxjMl9ub2RlX2lkX3Q+IGNoYWluOworfTsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJXT1JLX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL19DMk1hY3JvVXRpbHMuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTliYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL19DMk1hY3JvVXRpbHMuaApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19NQUNST19VVElMU19IXworI2RlZmluZSBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCisKKy8qKiBcZmlsZQorICogTWFjcm8gdXRpbGl0aWVzIGZvciB0aGUgdXRpbHMgbGlicmFyeSB1c2VkIGJ5IENvZGVjMiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLy8vIFxpZiAwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWQVJJQUJMRSBBUkdVTUVOVCBDT1VOVElORyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gcmVtb3ZlIGVtcHR5IGFyZ3VtZW50cyAtIF9DMl9BUkcoKSBleHBhbmRzIHRvICcnLCB3aGlsZSBfQzJfQVJHKHgpIGV4cGFuZHMgdG8gJywgeCcKKy8vIF9DMl9BUkduKC4uLikgZG9lcyB0aGUgc2FtZSBmb3IgbiBhcmd1bWVudHMKKyNkZWZpbmUgX0MyX0FSRyguLi4pICwgIyNfX1ZBX0FSR1NfXworI2RlZmluZSBfQzJfQVJHMihfMSwgXzIpIF9DMl9BUkcoXzEpIF9DMl9BUkcoXzIpCisjZGVmaW5lIF9DMl9BUkc0KF8xLCBfMiwgXzMsIF80KSBfQzJfQVJHMihfMSwgXzIpIF9DMl9BUkcyKF8zLCBfNCkKKyNkZWZpbmUgX0MyX0FSRzgoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84KSBfQzJfQVJHNChfMSwgXzIsIF8zLCBfNCkgX0MyX0FSRzQoXzUsIF82LCBfNywgXzgpCisjZGVmaW5lIF9DMl9BUkcxNihfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpIFwKKyAgICAgICAgX0MyX0FSRzgoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84KSBfQzJfQVJHOChfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2KQorCisvLyByZXR1cm4gdGhlIDY1dGggYXJndW1lbnQKKyNkZWZpbmUgX0MyX0FSR0NfMyhfLCBfMCwgXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2LCBcCisgICAgICAgIF8xNywgXzE4LCBfMTksIF8yMCwgXzIxLCBfMjIsIF8yMywgXzI0LCBfMjUsIF8yNiwgXzI3LCBfMjgsIF8yOSwgXzMwLCBfMzEsIF8zMiwgXAorICAgICAgICBfMzMsIF8zNCwgXzM1LCBfMzYsIF8zNywgXzM4LCBfMzksIF80MCwgXzQxLCBfNDIsIF80MywgXzQ0LCBfNDUsIF80NiwgXzQ3LCBfNDgsIFwKKyAgICAgICAgXzQ5LCBfNTAsIF81MSwgXzUyLCBfNTMsIF81NCwgXzU1LCBfNTYsIF81NywgXzU4LCBfNTksIF82MCwgXzYxLCBfNjIsIF82MywgXzY0LCAuLi4pIF82NAorCisvLy8gXGVuZGlmCisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAqLworLy8gV2UgZG8gdGhpcyBieSBwcmVwZW5kaW5nIDEgYW5kIGFwcGVuZGluZyA2NSBkZXNpZ25lZCB2YWx1ZXMgc3VjaCB0aGF0IHRoZSA2NXRoIGVsZW1lbnQKKy8vIHdpbGwgYmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisjZGVmaW5lIF9DMl9BUkdDKC4uLikgX0MyX0FSR0NfMSgwLCAjI19fVkFfQVJHU19fLCBcCisgICAgICAgIDY0LCA2MywgNjIsIDYxLCA2MCwgNTksIDU4LCA1NywgNTYsIDU1LCA1NCwgNTMsIDUyLCA1MSwgNTAsIDQ5LCA0OCwgNDcsIDQ2LCA0NSwgNDQsIDQzLCBcCisgICAgICAgIDQyLCA0MSwgNDAsIDM5LCAzOCwgMzcsIDM2LCAzNSwgMzQsIDMzLCAzMiwgMzEsIDMwLCAyOSwgMjgsIDI3LCAyNiwgMjUsIDI0LCAyMywgMjIsIDIxLCBcCisgICAgICAgIDIwLCAxOSwgMTgsIDE3LCAxNiwgMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMCkKKworLy8vIFxpZiAwCisKKy8vIHN0ZXAgMS4gcmVtb3ZlIGVtcHR5IGFyZ3VtZW50cyAtIHRoaXMgaXMgbmVlZGVkIHRvIGFsbG93IHRyYWlsaW5nIGNvbW1hIGluIGVudW0gZGVmaW5pdGlvbnMKKy8vIChOT1RFOiB3ZSBkb24ndCBrbm93IHdoaWNoIGFyZ3VtZW50IHdpbGwgaGF2ZSB0aGlzIHRyYWlsaW5nIGNvbW1hIHNvIHdlIGhhdmUgdG8gdHJ5IGFsbCkKKyNkZWZpbmUgX0MyX0FSR0NfMShfLCBfMCwgXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2LCBcCisgICAgICAgIF8xNywgXzE4LCBfMTksIF8yMCwgXzIxLCBfMjIsIF8yMywgXzI0LCBfMjUsIF8yNiwgXzI3LCBfMjgsIF8yOSwgXzMwLCBfMzEsIF8zMiwgXAorICAgICAgICBfMzMsIF8zNCwgXzM1LCBfMzYsIF8zNywgXzM4LCBfMzksIF80MCwgXzQxLCBfNDIsIF80MywgXzQ0LCBfNDUsIF80NiwgXzQ3LCBfNDgsIFwKKyAgICAgICAgXzQ5LCBfNTAsIF81MSwgXzUyLCBfNTMsIF81NCwgXzU1LCBfNTYsIF81NywgXzU4LCBfNTksIF82MCwgXzYxLCBfNjIsIF82MywgXzY0LCAuLi4pIFwKKyAgICBfQzJfQVJHQ18yKF8gX0MyX0FSRyhfMCkgXAorICAgIF9DMl9BUkcxNihfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpIFwKKyAgICBfQzJfQVJHMTYoXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyKSBcCisgICAgX0MyX0FSRzE2KF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCkgXAorICAgIF9DMl9BUkcxNihfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQpLCBcCisgICAgIyNfX1ZBX0FSR1NfXykKKworLy8gc3RlcCAyLiB0aGlzIGlzIG5lZWRlZCBhcyByZW1vdmVkIGFyZ3VtZW50cyBjYW5ub3QgYmUgcGFzc2VkIGRpcmVjdGx5IGFzIGVtcHR5IGludG8gYSBtYWNybworI2RlZmluZSBfQzJfQVJHQ18yKC4uLikgX0MyX0FSR0NfMyhfX1ZBX0FSR1NfXykKKworLy8vIFxlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWQVJJQUJMRSBBUkdVTUVOVCBDT05WRVJTSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vLyBcaWYgMAorCisvLyBtYWNyb3MgdGhhdCBjb252ZXJ0IF8xLCBfMiwgXzMsIC4uLiB0byBmbihfMSwgYXJnKSwgZm4oXzIsIGFyZyksIGZuKF8zLCBhcmcpLCAuLi4KKyNkZWZpbmUgX0MyX01BUF82NChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNjAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82MChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81OShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81OChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81NChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNTAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81MChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80OShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80OChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80NChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNDAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80MChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMzAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zMChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMjAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yMChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMTAoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xMChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzgoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF84KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF83KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF81KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8yKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZykKKworLy8vIFxlbmRpZgorCisvKioKKyAqIE1hcHMgZWFjaCBhcmd1bWVudCB1c2luZyBhbm90aGVyIG1hY3JvIHggLT4gZm4oeCwgYXJnKQorICovCisvLyB1c2Ugd3JhcHBlciB0byBjYWxsIHRoZSBwcm9wZXIgbWFwcGVyIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCisjZGVmaW5lIF9DMl9NQVAoZm4sIGFyZywgLi4uKSBfQzJfTUFQX18oX0MyX0FSR0MoX19WQV9BUkdTX18pLCBmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorCisvLy8gXGlmIDAKKworLy8gZXZhbHVhdGUgX24gc28gaXQgYmVjb21lcyBhIG51bWJlcgorI2RlZmluZSBfQzJfTUFQX18oX24sIGZuLCBhcmcsIC4uLikgX0MyX01BUF8oX24sIGZuLCBhcmcsIF9fVkFfQVJHU19fKQorLy8gY2FsbCB0aGUgcHJvcGVyIG1hcHBlcgorI2RlZmluZSBfQzJfTUFQXyhfbiwgZm4sIGFyZywgLi4uKSBfQzJfTUFQXyMjX24gKGZuLCBhcmcsIF9fVkFfQVJHU19fKQorCisvLy8gXGVuZGlmCisKKyNlbmRpZiAgLy8gQzJVVElMU19NQUNST19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9hbmRyb2lkLUMyQnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJlYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9hbmRyb2lkLUMyQnVmZmVyLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMkJVRkZFUl9IXworI2RlZmluZSBBTkRST0lEX0MyQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKworLyogVXNlIGFuZHJvaWQgbmF0aXZlIGhhbmRsZSBmb3IgQzJIYW5kbGUgKi8KK3R5cGVkZWYgOjpuYXRpdmVfaGFuZGxlX3QgQzJIYW5kbGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBBbmRyb2lkIHBsYXRmb3JtIGJ1ZmZlci9tZW1vcnkgdXNhZ2UgYml0cy4KKyAqLworc3RydWN0IEMyQW5kcm9pZE1lbW9yeVVzYWdlIDogcHVibGljIEMyTWVtb3J5VXNhZ2UgeworICAgIGlubGluZSBDMkFuZHJvaWRNZW1vcnlVc2FnZShjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSkgOiBDMk1lbW9yeVVzYWdlKHVzYWdlKSB7IH0KKworLy8gcHVibGljOgorICAgIC8qKgorICAgICAqIFJldXNlIGdyYWxsb2MgZmxhZ3Mgd2hlcmUgcG9zc2libGUsIGFzIENvZGVjIDIuMCBBUEkgb25seSB1c2VzIGJpdHMgMCBhbmQgMS4KKyAgICAgKi8KKyAgICBlbnVtIGNvbnN1bWVyX3QgOiB1aW50NjRfdCB7CisgICAgICAgIFJFTkRFUlNDUklQVF9SRUFEID0gR1JBTExPQ19VU0FHRV9SRU5ERVJTQ1JJUFQsCisgICAgICAgIEhXX1RFWFRVUkVfUkVBRCAgID0gR1JBTExPQ19VU0FHRV9IV19URVhUVVJFLAorICAgICAgICBIV19DT01QT1NFUl9SRUFEICA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIsCisgICAgICAgIC8vIGdyYWxsb2MgZG9lcyBub3QgZGVmaW5lIGEgdmlkZW8gZGVjb2RlciByZWFkIHVzYWdlIGZsYWcsIHNvIHVzZSBlbmNvZGVyIGZvcgorICAgICAgICAvLyBub3cKKyAgICAgICAgSFdfQ09ERUNfUkVBRCAgICAgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCisgICAgICAgIFJFQURfUFJPVEVDVEVEICAgID0gR1JBTExPQ19VU0FHRV9QUk9URUNURUQsCisgICAgfTsKKworICAgIGVudW0gcHJvZHVjZXJfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgUkVOREVSU0NSSVBUX1dSSVRFID0gR1JBTExPQ19VU0FHRV9SRU5ERVJTQ1JJUFQsCisgICAgICAgIEhXX1RFWFRVUkVfV1JJVEUgICA9IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSLAorICAgICAgICBIV19DT01QT1NFUl9XUklURSAgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIsCisgICAgICAgIEhXX0NPREVDX1dSSVRFICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKKyAgICAgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBkZWZpbmUgYSB3cml0ZSBwcm90ZWN0ZWQgdXNhZ2UgZmxhZywgc28gdXNlIHJlYWQgcHJvdGVjdGVkCisgICAgICAgIC8vIG5vdworICAgICAgICBXUklURV9QUk9URUNURUQgICAgPSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCwKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29udmVydCBmcm9tIGdyYWxsb2MgdXNhZ2UuCisgICAgICovCisgICAgc3RhdGljIEMyTWVtb3J5VXNhZ2UgRnJvbUdyYWxsb2NVc2FnZSh1aW50NjRfdCB1c2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRvIGdyYWxsb2MgdXNhZ2UuCisgICAgICovCisgICAgdWludDY0X3QgYXNHcmFsbG9jVXNhZ2UoKSBjb25zdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMkJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTFhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlOworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OnNwOworCit0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworLy8gVE9ETzogOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxJSW5wdXRTdXJmYWNlPgordHlwZWRlZiA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IElucHV0U3VyZmFjZUJhc2U7CisKK2NsYXNzIElucHV0U3VyZmFjZSA6IHB1YmxpYyBJbnB1dFN1cmZhY2VCYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2UoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUlucHV0U3VyZmFjZQorICAgIHNwPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+IGNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OkMyQ29tcG9uZW50PiAmY29tcCk7CisgICAgLy8gVE9ETzogaW50ZigpCisKKyAgICBzdGF0aWMgc3A8SW5wdXRTdXJmYWNlPiBDcmVhdGUoKTsKKworcHJpdmF0ZToKKyAgICBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxCR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYmFzZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICBzcDw6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGE0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gVE9ETzogaW5oZXJpdCBmcm9tIElJbnB1dFN1cmZhY2VDb25uZWN0aW9uCitjbGFzcyBJbnB1dFN1cmZhY2VDb25uZWN0aW9uIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZUNvbm5lY3Rpb24oKTsKKworICAgIC8vIEZyb20gSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgSW5wdXRTdXJmYWNlOworCisgICAgLy8gRm9yIElucHV0U3VyZmFjZQorICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICZjb21wKTsKKyAgICBib29sIGluaXQoKTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSA9IGRlbGV0ZTsKKworICAgIGNsYXNzIEltcGw7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHNwPEltcGw+IG1JbXBsOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5wdXRTdXJmYWNlQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaCBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDgxMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKQEAgLTAsMCArMSwxMDAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKK2ltcG9ydCByZSwgc3lzCisKK2dsb2JhbCBpbl9jb21tZW50LCBjdXJyZW50LCBpbmRlbnQsIGhvbGQKK2luX2NvbW1lbnQsIGN1cnJlbnQsIGluZGVudCwgaG9sZCA9IEZhbHNlLCBOb25lLCAnJywgW10KKworY2xhc3MgQ2hhbmdlQ1N0eWxlQ29tbWVudHNUb0RveHk6CisgICAgZGVmIGR1bXBfaG9sZCgpOgorICAgICAgICBnbG9iYWwgaG9sZAorICAgICAgICBmb3IgaCBpbiBob2xkOgorICAgICAgICAgICAgcHJpbnQoaCwgZW5kPScnKQorICAgICAgICBob2xkWzpdID0gW10KKworICAgIGRlZiBkb3h5X2hvbGQoKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnQsIGhvbGQKKyAgICAgICAgaWYgY3VycmVudCA9PSAnLy8nOgorICAgICAgICAgICAgZm9yIGggaW4gaG9sZDoKKyAgICAgICAgICAgICAgICBwcmludChyZS5zdWIocideKCAqLy8oPyEvKSknLCByJ1wxLycsIGgpLCBlbmQ9JycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaXJzdCA9IFRydWUKKyAgICAgICAgICAgIGZvciBoIGluIGhvbGQ6CisgICAgICAgICAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgIGggPSByZS5zdWIocideKCAqL1sqXSg/IVsqXSkpJywgcidcMSonLCBoKQorICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICAgICAgcHJpbnQoaCwgZW5kPScnKQorICAgICAgICBob2xkWzpdID0gW10KKworICAgIGRlZiBwcm9jZXNzX2NvbW1lbnQodCwgaW5kLCBsaW5lKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnQsIGluZGVudCwgaG9sZAorICAgICAgICBpZiB0ICE9IGN1cnJlbnQgb3IgaW5kIG5vdCBpbiAoaW5kZW50LCBpbmRlbnQgKyAnICcpOgorICAgICAgICAgICAgZHVtcF9ob2xkKCkKKyAgICAgICAgICAgIGN1cnJlbnQsIGluZGVudCA9IHQsIGluZAorICAgICAgICBob2xkLmFwcGVuZChsaW5lKQorCisgICAgZGVmIHByb2Nlc3NfbGluZShpbmQsIGxpbmUpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaW5kZW50CisgICAgICAgIGlmIGluZCBpbiAoaW5kZW50LCAnJyk6CisgICAgICAgICAgICBkb3h5X2hvbGQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZHVtcF9ob2xkKCkKKyAgICAgICAgY3VycmVudCwgaW5kZW50ID0gTm9uZSwgTm9uZQorICAgICAgICBwcmludChsaW5lLCBlbmQ9JycpCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpbnB1dCwgcGF0aCk6CisgICAgICAgIGZvciBsaW5lIGluIGlucHV0OgorICAgICAgICAgICAgaW5kID0gcmUubWF0Y2gocideKCAqKScsIGxpbmUpLmdyb3VwKDEpCisgICAgICAgICAgICBpZiBpbl9jb21tZW50OgorICAgICAgICAgICAgICAgICMgVE9ETzogdGhpcyBpcyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBnb29kIGVub3VnaAorICAgICAgICAgICAgICAgIG0gPSByZS5tYXRjaChyJ14gKlsqXS8nLCBsaW5lKQorICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY29tbWVudCgnLyonLCBpbmQsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGluX2NvbW1lbnQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY29tbWVudCgnLyonLCBpbmQsIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG0gPSByZS5tYXRjaChyJ14gKi8vJywgbGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgIyBvbmUtbGluZSBjb21tZW50CisgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvLycsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqL1sqXScsIGxpbmUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICMgbXVsdGktbGluZSBjb21tZW50CisgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICAjIFRPRE86IHRoaXMgaXMgbm90IHF1aXRlIHJpZ2h0LCBidXQgZ29vZCBlbm91Z2gKKyAgICAgICAgICAgICAgICBpbl9jb21tZW50ID0gbm90IHJlLm1hdGNoKHInXiAqWypdLycsIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHByb2Nlc3NfbGluZShpbmQsIGxpbmUpCisKK2NsYXNzIEF1dG9Hcm91cDoKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpbnB1dCwgcGF0aCk6CisgICAgICAgIGlmICcvY29kZWMyL2luY2x1ZGUvJyBpbiBwYXRoOgorICAgICAgICAgICAgZ3JvdXAgPSAnQVBJIENvZGVjMiBBUEknCisgICAgICAgIGVsaWYgRmFsc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiAnL2NvZGVjMi92bmRrLycgaW4gcGF0aDoKKyAgICAgICAgICAgIGdyb3VwID0gJ1ZOREsgUGxhdGZvcm0gcHJvdmlkZWQgZ2x1ZScKKyAgICAgICAgZWxpZiAnL2NvZGVjMi90ZXN0cy8nIGluIHBhdGg6CisgICAgICAgICAgICBncm91cCA9ICdUZXN0cyBVbml0IHRlc3RzJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ3JvdXAgPSAnUmFuZG9tIE1pc2MuIHNhbmRib3gnCisKKyAgICAgICAgcHJpbnQoJyN1bmRlZiBfX0FQUExFX18nKQorCisgICAgICAgIGZvciBsaW5lIGluIGlucHV0OgorICAgICAgICAgICAgaWYgcmUubWF0Y2gocidebmFtZXNwYWNlIGFuZHJvaWQgeycsIGxpbmUpOgorICAgICAgICAgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJykKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICAgICAgcHJpbnQocicvLy8gXGFkZHRvZ3JvdXAge30nLmZvcm1hdChncm91cCkpCisgICAgICAgICAgICAgICAgcHJpbnQocicvLy8gQHsnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHJlLm1hdGNoKHInXn0gKy8vICtuYW1lc3BhY2UnLCBsaW5lKToKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBAfScpCisgICAgICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQobGluZSwgZW5kPScnKQorCitQID0gQXV0b0dyb3VwKCkKK2ZvciBwYXRoIGluIHN5cy5hcmd2WzE6XToKKyAgICB3aXRoIG9wZW4ocGF0aCwgJ3J0JykgYXMgaW5wdXQ6CisgICAgICAgIFAucHJvY2VzcyhpbnB1dCwgcGF0aCkKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9kb2NzL2RveHlnZW4uY29uZmlnIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzYmVhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlnZW4uY29uZmlnCkBAIC0wLDAgKzEsMjQ0NiBAQAorIyBEb3h5ZmlsZSAxLjguMTEKKworIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgZG91YmxlIGhhc2ggKCMjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgaXMgcGxhY2VkIGluCisjIGZyb250IG9mIHRoZSBUQUcgaXQgaXMgcHJlY2VkaW5nLgorIworIyBBbGwgdGV4dCBhZnRlciBhIHNpbmdsZSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLgorIyBUaGUgZm9ybWF0IGlzOgorIyBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzLCBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKKyMgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzIChcIiBcIikuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgdGV4dAorIyBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252CisjIGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udgorIyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCisKK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZCBieQorIyBkb3VibGUtcXVvdGVzLCB1bmxlc3MgeW91IGFyZSB1c2luZyBEb3h5d2l6YXJkKSB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUKKyMgcHJvamVjdCBmb3Igd2hpY2ggdGhlIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUKKyMgdGl0bGUgb2YgbW9zdCBnZW5lcmF0ZWQgcGFnZXMgYW5kIGluIGEgZmV3IG90aGVyIHBsYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE15IFByb2plY3QuCisKK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSBDb2RlYzIKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIFRoaXMKKyMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgaWYgc29tZSB2ZXJzaW9uCisjIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSAKKworIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIgYQorIyBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9IAorCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGEgbG9nbyBvciBhbiBpY29uIHRoYXQgaXMgaW5jbHVkZWQKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90IGV4Y2VlZCA1NQorIyBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuIERveHlnZW4gd2lsbCBjb3B5CisjIHRoZSBsb2dvIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitQUk9KRUNUX0xPR08gICAgICAgICAgID0gCisKKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKSBwYXRoCisjIGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgd3JpdHRlbi4gSWYgYSByZWxhdGl2ZSBwYXRoIGlzCisjIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmCisjIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IG91dC90YXJnZXQvY29tbW9uL2RvY3MvY29kZWMyL2FwaQorCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCisjIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAorIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCisjIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQorIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKKyMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQUxMT1dfVU5JQ09ERV9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFsbG93IG5vbi1BU0NJSQorIyBjaGFyYWN0ZXJzIHRvIGFwcGVhciBpbiB0aGUgbmFtZXMgb2YgZ2VuZXJhdGVkIGZpbGVzLiBJZiBzZXQgdG8gTk8sIG5vbi1BU0NJSQorIyBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZCwgZm9yIGV4YW1wbGUgX3hFM194ODFfeDg0IHdpbGwgYmUgdXNlZCBmb3IgVW5pY29kZQorIyBVKzMwNDQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMT1dfVU5JQ09ERV9OQU1FUyAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBBZnJpa2FhbnMsIEFyYWJpYywgQXJtZW5pYW4sIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwKKyMgQ2hpbmVzZS1UcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSwKKyMgRXNwZXJhbnRvLCBGYXJzaSAoUGVyc2lhbiksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCBHcmVlaywgSHVuZ2FyaWFuLAorIyBJbmRvbmVzaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksCisjIEtvcmVhbiwgS29yZWFuLWVuIChLb3JlYW4gd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwgTGF0dmlhbiwgTGl0aHVhbmlhbiwKKyMgTWFjZWRvbmlhbiwgTm9yd2VnaWFuLCBQZXJzaWFuIChGYXJzaSksIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sCisjIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVHVya2lzaCwKKyMgVWtyYWluaWFuIGFuZCBWaWV0bmFtZXNlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRW5nbGlzaC4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIGJyaWVmIG1lbWJlcgorIyBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBmaWxlIGFuZCBjbGFzcworIyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFkb2MpLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KKyMKKyMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcworIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAorIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0CisjIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKKyMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgorIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCisjIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gWUVTCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAorIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCisjIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUworCisjIFRoZSBTVFJJUF9GUk9NX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguCisjIFN0cmlwcGluZyBpcyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQKKyMgcGFydCBvZiB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlIHBhdGggdG8KKyMgc3RyaXAuCisjCisjIE5vdGUgdGhhdCB5b3UgY2FuIHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28gcmVsYXRpdmUgcGF0aHMsIHdoaWNoCisjIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMgc3RhcnRlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZVTExfUEFUSF9OQU1FUyBpcyBzZXQgdG8gWUVTLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIKKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKKyMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAorIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKKyMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKKyMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyMgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSAKKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgKGJ1dAorIyBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMgZG9lc24ndAorIyBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlCisjIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YWRvYy1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZgorIyBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YWRvYy1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC0KKyMgc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gWUVTCisKKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0CisjIGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmCisjIHNldCB0byBOTywgdGhlIFF0LXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzCisjIHJlcXVpcmluZyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIGRveHlnZW4gdHJlYXQgYQorIyBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vIGNvbW1lbnRzKSBhcworIyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFRoZSBuZXcgZGVmYXVsdCBpcworIyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gU2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3IgaW5zdGVhZC4KKyMKKyMgTm90ZSB0aGF0IHNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIGFsc28gbWVhbnMgdGhhdCByYXRpb25hbCByb3NlIGNvbW1lbnRzIGFyZQorIyBub3QgcmVjb2duaXplZCBhbnkgbW9yZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYW4gdW5kb2N1bWVudGVkIG1lbWJlciBpbmhlcml0cyB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IHJlLWltcGxlbWVudHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UgYSBuZXcKKyMgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbCBiZSBwYXJ0CisjIG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiBEb3h5Z2VuCisjIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAxNiwgZGVmYXVsdCB2YWx1ZTogNC4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDQKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3QgYXMgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybToKKyMgbmFtZT12YWx1ZQorIyBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgInNpZGVlZmZlY3Q9QHBhciBTaWRlIEVmZmVjdHM6XG4iCisjIHdpbGwgYWxsb3cgeW91IHRvIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nCisjICJTaWRlIEVmZmVjdHM6Ii4gWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQKKyMgbmV3bGluZXMuCisKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0gCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzCisjIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIEZvcgorIyBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3Qgb2YgYWxsCisjIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCisjIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKKyMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKKyMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBGb3J0cmFuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCisjIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAorIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4gKGZpeGVkIGZvcm1hdCBGb3J0cmFuOgorIyBGb3J0cmFuRml4ZWQsIGZyZWUgZm9ybWF0dGVkIEZvcnRyYW46IEZvcnRyYW5GcmVlLCB1bmtub3duIGZvcm1hdHRlZCBGb3J0cmFuOgorIyBGb3J0cmFuLiBJbiB0aGUgbGF0ZXIgY2FzZSB0aGUgcGFyc2VyIHRyaWVzIHRvIGd1ZXNzIHdoZXRoZXIgdGhlIGNvZGUgaXMgZml4ZWQKKyMgb3IgZnJlZSBmb3JtYXR0ZWQgY29kZSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgRm9ydHJhbiB0eXBlIGZpbGVzKSwgVkhETC4gRm9yCisjIGluc3RhbmNlIHRvIG1ha2UgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwKKyMgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgorIworIyBOb3RlOiBGb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb24geW91IGNhbiB1c2Ugbm9fZXh0ZW5zaW9uIGFzIGEgcGxhY2Vob2xkZXIuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UKKyMgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0gCisKKyMgSWYgdGhlIE1BUktET1dOX1NVUFBPUlQgdGFnIGlzIGVuYWJsZWQgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsIGNvbW1lbnRzCisjIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUKKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLgorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91IGNhbgorIyBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuIERpc2FibGUgb25seSBpbgorIyBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkCisjIGNsYXNzZXMsIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4KKyMgYmUgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZCBvcgorIyBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50CisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCBzZXQgdGhpcworIyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOworIyB2ZXJzdXMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bworIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIChzZWU6CisjIGh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NvZnR3YXJlL3NpcC9pbnRybykgc291cmNlcyBvbmx5LiBEb3h5Z2VuCisjIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMgaW5zdGVhZAorIyBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCisKKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlCisjIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTIHdpbGwgbWFrZQorIyBkb3h5Z2VuIHRvIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZQorIyB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdQorIyBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCisKKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQworIyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCisKKyMgSWYgb25lIGFkZHMgYSBzdHJ1Y3Qgb3IgY2xhc3MgdG8gYSBncm91cCBhbmQgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlbiBhbHNvCisjIGFueSBuZXN0ZWQgY2xhc3Mgb3Igc3RydWN0IGlzIGFkZGVkIHRvIHRoZSBzYW1lIGdyb3VwLiBCeSBkZWZhdWx0IHRoaXMgb3B0aW9uCisjIGlzIGRpc2FibGVkIGFuZCBvbmUgaGFzIHRvIGFkZCBuZXN0ZWQgY29tcG91bmRzIGV4cGxpY2l0bHkgdmlhIFxpbmdyb3VwLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dST1VQX05FU1RFRF9DT01QT1VORFMgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mIHRoZSBzYW1lIHR5cGUKKyMgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhIHN1Ymdyb3VwIG9mIHRoYXQKKyMgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvIE5PIHRvIHByZXZlbnQKKyMgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nIHRoZQorIyBcbm9zdWJncm91cGluZyBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQgdW5pb25zCisjIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nIFxpbmdyb3VwKQorIyBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYCisjIGFuZCBSVEYpLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGRvZXMgbm90IHdvcmsgaW4gY29tYmluYXRpb24gd2l0aAorIyBTRVBBUkFURV9NRU1CRVJfUEFHRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PCisKKyMgV2hlbiB0aGUgSU5MSU5FX1NJTVBMRV9TVFJVQ1RTIHRhZyBpcyBzZXQgdG8gWUVTLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zCisjIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgb3Igc2ltcGxlIHR5cGVkZWYgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluCisjIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsCisjIG5hbWVzcGFjZSwgb3IgZ3JvdXAgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0CisjIHRvIE5PLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZAorIyBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8KKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIHRhZyBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvcgorIyBlbnVtIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbworIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5IGJlCisjIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gWUVTCisKKyMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcworIyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUKKyMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZSBzYW1lIHN5bWJvbCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZQorIyBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwKKyMgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZQorIyBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UKKyMgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNj02NTUzNgorIyBzeW1ib2xzLiBBdCB0aGUgZW5kIG9mIGEgcnVuIGRveHlnZW4gd2lsbCByZXBvcnQgdGhlIGNhY2hlIHVzYWdlIGFuZCBzdWdnZXN0CisjIHRoZSBvcHRpbWFsIGNhY2hlIHNpemUgZnJvbSBhIHNwZWVkIHBvaW50IG9mIHZpZXcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDksIGRlZmF1bHQgdmFsdWU6IDAuCisKK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLiBQcml2YXRlCisjIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIHRoZQorIyBFWFRSQUNUX1BSSVZBVEUgcmVzcGVjdGl2ZWx5IEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgdGhlIHdhcm5pbmdzIGFib3V0IHVuZG9jdW1lbnRlZCBtZW1iZXJzIHRoYXQgYXJlCisjIG5vcm1hbGx5IHByb2R1Y2VkIHdoZW4gV0FSTklOR1MgaXMgc2V0IHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzIHdpbGwKKyMgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3NlcyAoYW5kIHN0cnVjdHMpIGRlZmluZWQKKyMgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PLAorIyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLiBEb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QKKyMgZm9yIEphdmEgc291cmNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gSWYgc2V0IHRvIFlFUywgbG9jYWwgbWV0aG9kcywKKyMgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PLCBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUKKyMgaW5jbHVkZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UgbmFtZSBvZgorIyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0IGFub255bW91cyBuYW1lc3BhY2UKKyMgYXJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgaW5zaWRlIGRvY3VtZW50ZWQgY2xhc3NlcyBvciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4gSWYgc2V0CisjIHRvIE5PLCB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbgorIyBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAorIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTywgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PCisKKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIElmIHNldCB0byBOTywgdGhlc2UKKyMgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KKworIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYQorIyBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiB0aGUgZG9jdW1lbnRhdGlvbgorIyB3aWxsIGJlIGV4Y2x1ZGVkLiBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCisjIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUywgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogc3lzdGVtIGRlcGVuZGVudC4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IG1lbWJlcnMgd2l0aAorIyB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTLCB0aGUKKyMgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBISURFX0NPTVBPVU5EX1JFRkVSRU5DRSB0YWcgaXMgc2V0IHRvIE5PIChkZWZhdWx0KSB0aGVuIGRveHlnZW4gd2lsbAorIyBhcHBlbmQgYWRkaXRpb25hbCB0ZXh0IHRvIGEgcGFnZSdzIHRpdGxlLCBzdWNoIGFzIENsYXNzIFJlZmVyZW5jZS4gSWYgc2V0IHRvCisjIFlFUyB0aGUgY29tcG91bmQgcmVmZXJlbmNlIHdpbGwgYmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfQ09NUE9VTkRfUkVGRVJFTkNFPSBOTworCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHV0IGEgbGlzdCBvZgorIyB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZmlsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisjIElmIHRoZSBTSE9XX0dST1VQRURfTUVNQl9JTkMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgYWRkIGZvciBlYWNoCisjIGdyb3VwZWQgbWVtYmVyIGFuIGluY2x1ZGUgc3RhdGVtZW50IHRvIHRoZSBkb2N1bWVudGF0aW9uLCB0ZWxsaW5nIHRoZSByZWFkZXIKKyMgd2hpY2ggZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSB0aGUgbWVtYmVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1dfR1JPVVBFRF9NRU1CX0lOQyAgPSBOTworCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBsaXN0IGluY2x1ZGUKKyMgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSB0YWcgW2lubGluZV0gaXMgaW5zZXJ0ZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTywgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9ucyBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTywgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuIE5vdGUgdGhhdAorIyB0aGlzIHdpbGwgYWxzbyBpbmZsdWVuY2UgdGhlIG9yZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0IGNvbnN0cnVjdG9ycyBhbmQKKyMgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlCisjIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkgU09SVF9CUklFRl9ET0NTIGFuZCBTT1JUX01FTUJFUl9ET0NTLgorIyBOb3RlOiBJZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcgYnJpZWYKKyMgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIE5vdGU6IElmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcKKyMgZGV0YWlsZWQgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgaGllcmFyY2h5CisjIG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gdGhlIGdyb3VwIG5hbWVzIHdpbGwKKyMgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgYnkKKyMgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIE5PLCB0aGUgY2xhc3MgbGlzdCB3aWxsCisjIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0LgorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLgorIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUgYWxwaGFiZXRpY2FsCisjIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0byBkbyBwcm9wZXIKKyMgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYSBtYXRjaCBiZXR3ZWVuCisjIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuIGlmIHRoZXJlIGlzCisjIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UgYnkgZG9pbmcgYQorIyBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4gd2lsbCBzdGlsbAorIyBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIHRvZG8KKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgdGVzdAorIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0IGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIGJ1ZworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykKKyMgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwgZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiA8c2VjdGlvbl9sYWJlbD4gLi4uIFxlbmRpZiBhbmQgXGNvbmQgPHNlY3Rpb25fbGFiZWw+CisjIC4uLiBcZW5kY29uZCBibG9ja3MuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSBJTlRFUk5BTAorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRoYXQgdGhlCisjIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyAvIGRlZmluZSBjYW4gaGF2ZSBmb3IgaXQgdG8gYXBwZWFyIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCBoZXJlCisjIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuIFRoZQorIyBhcHBlYXJhbmNlIG9mIHRoZSB2YWx1ZSBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIC8gZGVmaW5lcyBjYW4gYmUKKyMgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgY29tbWFuZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDMwLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYXQKKyMgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTLCB0aGUKKyMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCisjIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldworIyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCisjIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQorIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAorIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKKyMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgorIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAorIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorIworIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCisjIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQorIyB0YWcgaXMgbGVmdCBlbXB0eS4KKworTEFZT1VUX0ZJTEUgICAgICAgICAgICA9IAorCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMgY29udGFpbmluZworIyB0aGUgcmVmZXJlbmNlIGRlZmluaXRpb25zLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZSAuYmliCisjIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFRoaXMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sCisjIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4KKyMgRm9yIExhVGVYIHRoZSBzdHlsZSBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nCisjIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZQorIyBzZWFyY2ggcGF0aC4gU2VlIGFsc28gXGNpdGUgZm9yIGluZm8gaG93IHRvIGNyZWF0ZSByZWZlcmVuY2VzLgorCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdG8KKyMgc3RhbmRhcmQgb3V0cHV0IGJ5IGRveHlnZW4uIElmIFFVSUVUIGlzIHNldCB0byBZRVMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlCisjIG1lc3NhZ2VzIGFyZSBvZmYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgdG8gc3RhbmRhcmQgZXJyb3IgKHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUworIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgorIworIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB3YXJuaW5ncyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcKKyMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfRE9DX0VSUk9SIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUgcGFyYW1ldGVycworIyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBleGlzdCBvciB1c2luZworIyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoaXMgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvciBmdW5jdGlvbnMgdGhhdAorIyBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyBvciByZXR1cm4KKyMgdmFsdWUuIElmIHNldCB0byBOTywgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlCisjIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFdBUk5fQVNfRVJST1IgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW1tZWRpYXRlbHkgc3RvcCB3aGVuCisjIGEgd2FybmluZyBpcyBlbmNvdW50ZXJlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX0FTX0VSUk9SICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGRveHlnZW4KKyMgY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0IHRhZ3MsIHdoaWNoCisjIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHdhcm5pbmcgb3JpZ2luYXRlZAorIyBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluICR2ZXJzaW9uLCB3aGljaCB3aWxsCisjIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZCBiZSBvYnRhaW5lZCB2aWEKKyMgRklMRV9WRVJTSU9OX0ZJTFRFUikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6ICRmaWxlOiRsaW5lOiAkdGV4dC4KKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyBhbmQgZXJyb3IKKyMgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIHN0YW5kYXJkCisjIGVycm9yIChzdGRlcnIpLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlIG15ZmlsZS5jcHAgb3IKKyMgZGlyZWN0b3JpZXMgbGlrZSAvdXNyL3NyYy9teXByb2plY3QuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyB3aXRoCisjIHNwYWNlcy4gU2VlIGFsc28gRklMRV9QQVRURVJOUyBhbmQgRVhURU5TSU9OX01BUFBJTkcKKyMgTm90ZTogSWYgdGhpcyB0YWcgaXMgZW1wdHkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMKKyMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSB0aGUgbGliaWNvbnYKKyMgZG9jdW1lbnRhdGlvbiAoc2VlOiBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYpIGZvciB0aGUgbGlzdCBvZgorIyBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyByZWFkIGJ5IGRveHlnZW4uCisjCisjIElmIGxlZnQgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOiouYywgKi5jYywgKi5jeHgsICouY3BwLAorIyAqLmMrKywgKi5qYXZhLCAqLmlpLCAqLml4eCwgKi5pcHAsICouaSsrLCAqLmlubCwgKi5pZGwsICouZGRsLCAqLm9kbCwgKi5oLAorIyAqLmhoLCAqLmh4eCwgKi5ocHAsICouaCsrLCAqLmNzLCAqLmQsICoucGhwLCAqLnBocDQsICoucGhwNSwgKi5waHRtbCwgKi5pbmMsCisjICoubSwgKi5tYXJrZG93biwgKi5tZCwgKi5tbSwgKi5kb3gsICoucHksICoucHl3LCAqLmY5MCwgKi5mLCAqLmZvciwgKi50Y2wsCisjICoudmhkLCAqLnZoZGwsICoudWNmLCAqLnFzZiwgKi5hcyBhbmQgKi5qcy4KKworRklMRV9QQVRURVJOUyAgICAgICAgICA9IEMyKi5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMiouY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMiouaAorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgc2hvdWxkCisjIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisjCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLgorCitFWENMVURFICAgICAgICAgICAgICAgID0gCisKKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBmcm9tIHRoZSBpbnB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIGZvciBleGFtcGxlIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gLl8qCisKKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSAKKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgdGhlIFxpbmNsdWRlCisjIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhBTVBMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmsgYWxsCisjIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhBTVBMRV9QQVRURVJOUyAgICAgICA9ICoKKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSBjb21tYW5kcworIyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZAorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kOgorIworIyA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4KKyMKKyMgd2hlcmUgPGZpbHRlcj4gaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZQorIyBuYW1lIG9mIGFuIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlcgorIyBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnCisjIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgTm90ZSB0aGF0IHRoZSBmaWx0ZXIgbXVzdCBub3QgYWRkIG9yIHJlbW92ZSBsaW5lczsgaXQgaXMgYXBwbGllZCBiZWZvcmUgdGhlCisjIGNvZGUgaXMgc2Nhbm5lZCwgYnV0IG5vdCB3aGVuIHRoZSBvdXRwdXQgY29kZSBpcyBnZW5lcmF0ZWQuIElmIGxpbmVzIGFyZSBhZGRlZAorIyBvciByZW1vdmVkLCB0aGUgYW5jaG9ycyB3aWxsIG5vdCBiZSBwbGFjZWQgY29ycmVjdGx5LgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbworIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKKyMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IGRveHlnZW4uCisKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCisjIGJhc2lzLiBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06IHBhdHRlcm49ZmlsdGVyCisjIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGhvdworIyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiB0aGUgRklMVEVSX1BBVFRFUk5TIHRhZyBpcyBlbXB0eSBvciBpZiBub25lIG9mIHRoZQorIyBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyBvciBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgeW91IGFsc28KKyMgbmVlZCB0byBzZXQgRVhURU5TSU9OX01BUFBJTkcgZm9yIHRoZSBleHRlbnNpb24gb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90CisjIHByb3Blcmx5IHByb2Nlc3NlZCBieSBkb3h5Z2VuLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0gCisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIpIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKKyMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IFlFUworCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlCisjIHBhdHRlcm4uIEEgcGF0dGVybiB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIGZvciBGSUxURVJfUEFUVEVSTiAoaWYgYW55KSBhbmQKKyMgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIHNvdXJjZSBmaWx0ZXJpbmcgZm9yIGEgc3BlY2lmaWMgcGF0dGVybiB1c2luZworIyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgc2V0IHRvIFlFUy4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9IAorCisjIElmIHRoZSBVU0VfTURGSUxFX0FTX01BSU5QQUdFIHRhZyByZWZlcnMgdG8gdGhlIG5hbWUgb2YgYSBtYXJrZG93biBmaWxlIHRoYXQKKyMgaXMgcGFydCBvZiB0aGUgaW5wdXQsIGl0cyBjb250ZW50cyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbWFpbiBwYWdlCisjIChpbmRleC5odG1sKS4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGEgcHJvamVjdCBvbiBmb3IgaW5zdGFuY2UgR2l0SHViCisjIGFuZCB3YW50IHRvIHJldXNlIHRoZSBpbnRyb2R1Y3Rpb24gcGFnZSBhbHNvIGZvciB0aGUgZG94eWdlbiBvdXRwdXQuCisKK1VTRV9NREZJTEVfQVNfTUFJTlBBR0UgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAorIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCisjIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbgorIyBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldAorIyB0byBZRVMgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZAorIyBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwgbGluayB0byB0aGUgc291cmNlIGNvZGUuIE90aGVyd2lzZSB0aGV5IHdpbGwKKyMgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworCisjIElmIFNPVVJDRV9UT09MVElQUyBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBob3ZlcmluZyBhIGh5cGVybGluayBpbiB0aGUKKyMgc291cmNlIGNvZGUgd2lsbCBzaG93IGEgdG9vbHRpcCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBwcm90b3R5cGUsCisjIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBsaW5rcyB0byB0aGUgZGVmaW5pdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4gU2luY2UgdGhpcworIyB3aWxsIG1ha2UgdGhlIEhUTUwgZmlsZSBsYXJnZXIgYW5kIGxvYWRpbmcgb2YgbGFyZ2UgZmlsZXMgYSBiaXQgc2xvd2VyLCB5b3UKKyMgY2FuIG9wdCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1NPVVJDRV9UT09MVElQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUgd2lsbAorIyBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuIGJ1aWx0LWluCisjIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UgdGFnZ2luZyBzeXN0ZW0KKyMgKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91IHdpbGwgbmVlZCB2ZXJzaW9uCisjIDQuOC42IG9yIGhpZ2hlci4KKyMKKyMgVG8gdXNlIGl0IGRvIHRoZSBmb2xsb3dpbmc6CisjIC0gSW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZ2xvYmFsCisjIC0gRW5hYmxlIFNPVVJDRV9CUk9XU0VSIGFuZCBVU0VfSFRBR1MgaW4gdGhlIGNvbmZpZyBmaWxlCisjIC0gTWFrZSBzdXJlIHRoZSBJTlBVVCBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCisjIC0gUnVuIGRveHlnZW4gYXMgbm9ybWFsCisjCisjIERveHlnZW4gd2lsbCBpbnZva2UgaHRhZ3MgKGFuZCB0aGF0IHdpbGwgaW4gdHVybiBpbnZva2UgZ3RhZ3MpLCBzbyB0aGVzZQorIyB0b29scyBtdXN0IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGkuZS4gaW4gdGhlIHNlYXJjaCBwYXRoKS4KKyMKKyMgVGhlIHJlc3VsdDogaW5zdGVhZCBvZiB0aGUgc291cmNlIGJyb3dzZXIgZ2VuZXJhdGVkIGJ5IGRveHlnZW4sIHRoZSBsaW5rcyB0bworIyBzb3VyY2UgY29kZSB3aWxsIG5vdyBwb2ludCB0byB0aGUgb3V0cHV0IG9mIGh0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgorCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRoZSBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3Igd2hpY2ggYW4gaW5jbHVkZSBpcworIyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFNlZSBhbHNvOiBTZWN0aW9uIFxjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjIElmIHRoZSBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHVzZSB0aGUKKyMgY2xhbmcgcGFyc2VyIChzZWU6IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy8pIGZvciBtb3JlIGFjY3VyYXRlIHBhcnNpbmcgYXQgdGhlCisjIGNvc3Qgb2YgcmVkdWNlZCBwZXJmb3JtYW5jZS4gVGhpcyBjYW4gYmUgcGFydGljdWxhcmx5IGhlbHBmdWwgd2l0aCB0ZW1wbGF0ZQorIyByaWNoIEMrKyBjb2RlIGZvciB3aGljaCBkb3h5Z2VuJ3MgYnVpbHQtaW4gcGFyc2VyIGxhY2tzIHRoZSBuZWNlc3NhcnkgdHlwZQorIyBpbmZvcm1hdGlvbi4KKyMgTm90ZTogVGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIG9wdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IGRveHlnZW4gd2FzCisjIGdlbmVyYXRlZCB3aXRoIHRoZSAtRHVzZS1saWJjbGFuZz1PTiBvcHRpb24gZm9yIENNYWtlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NMQU5HX0FTU0lTVEVEX1BBUlNJTkcgPSBZRVMKKworIyBJZiBjbGFuZyBhc3Npc3RlZCBwYXJzaW5nIGlzIGVuYWJsZWQgeW91IGNhbiBwcm92aWRlIHRoZSBjb21waWxlciB3aXRoIGNvbW1hbmQKKyMgbGluZSBvcHRpb25zIHRoYXQgeW91IHdvdWxkIG5vcm1hbGx5IHVzZSB3aGVuIGludm9raW5nIHRoZSBjb21waWxlci4gTm90ZSB0aGF0CisjIHRoZSBpbmNsdWRlIHBhdGhzIHdpbGwgYWxyZWFkeSBiZSBzZXQgYnkgZG94eWdlbiBmb3IgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcworIyBzcGVjaWZpZWQgd2l0aCBJTlBVVCBhbmQgSU5DTFVERV9QQVRILgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQ0xBTkdfQVNTSVNURURfUEFSU0lORyBpcyBzZXQgdG8gWUVTLgorCitDTEFOR19PUFRJT05TICAgICAgICAgID0gLXN0ZD1jKysxNAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXggb2YgYWxsCisjIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgY29udGFpbnMgYSBsb3Qgb2YKKyMgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBUaGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4KKyMgd2hpY2ggdGhlIGFscGhhYmV0aWNhbCBpbmRleCBsaXN0IHdpbGwgYmUgc3BsaXQuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA1LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCBjbGFzc2VzIHdpbGwKKyMgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiBUaGUgSUdOT1JFX1BSRUZJWCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByZWZpeCAob3IgYSBsaXN0IG9mIHByZWZpeGVzKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisjIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgSFRNTCBvdXRwdXQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSBodG1sCisKKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLCAucGhwLCAuYXNwKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC5odG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBoZWFkZXIgZmlsZSBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLgorIworIyBUbyBnZXQgdmFsaWQgSFRNTCB0aGUgaGVhZGVyIGZpbGUgdGhhdCBpbmNsdWRlcyBhbnkgc2NyaXB0cyBhbmQgc3R5bGUgc2hlZXRzCisjIHRoYXQgZG94eWdlbiBuZWVkcywgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZCAoZS5nLgorIyB0aGUgc2V0dGluZyBHRU5FUkFURV9UUkVFVklFVykuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBzdGFydCB3aXRoIGEKKyMgZGVmYXVsdCBoZWFkZXIgdXNpbmcKKyMgZG94eWdlbiAtdyBodG1sIG5ld19oZWFkZXIuaHRtbCBuZXdfZm9vdGVyLmh0bWwgbmV3X3N0eWxlc2hlZXQuY3NzCisjIFlvdXJDb25maWdGaWxlCisjIGFuZCB0aGVuIG1vZGlmeSB0aGUgZmlsZSBuZXdfaGVhZGVyLmh0bWwuIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiCisjIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgaGVhZGVyIHRoYXQgZG94eWdlbiBub3JtYWxseQorIyB1c2VzLgorIyBOb3RlOiBUaGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkgaGF2ZSB0byByZWdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbi4gRm9yIGEgZGVzY3JpcHRpb24KKyMgb2YgdGhlIHBvc3NpYmxlIG1hcmtlcnMgYW5kIGJsb2NrIG5hbWVzIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGZvb3RlciBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQKKyMgZm9vdGVyLiBTZWUgSFRNTF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdAorIyBmb290ZXIgYW5kIHdoYXQgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4gU2VlIGFsc28KKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBmb290ZXIKKyMgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAKKworIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZQorIyBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgbG9vayBvZgorIyB0aGUgSFRNTCBvdXRwdXQuIElmIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4KKyMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgc3R5bGUKKyMgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIE5vdGU6IEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIHRhZywgYXMKKyMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMgdGFnIChIVE1MX1NUWUxFU0hFRVQpIHdpbGwgaW4gdGhlIGZ1dHVyZSBiZWNvbWUKKyMgb2Jzb2xldGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAKKworIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIGNhc2NhZGluZyBzdHlsZSBzaGVldHMgdGhhdCBhcmUgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0cworIyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUgY2VydGFpbiBzdHlsZSBhc3BlY3RzLgorIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVCBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZQorIyBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3JlIG1vcmUgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuIEZvciBhbiBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBOb3RlCisjIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJhc2UgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBVc2UgdGhlCisjICRyZWxwYXRoXiBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlCisjIGZpbGVzLiBJbiB0aGUgSFRNTF9TVFlMRVNIRUVUIGZpbGUsIHVzZSB0aGUgZmlsZSBuYW1lIG9ubHkuIEFsc28gbm90ZSB0aGF0IHRoZQorIyBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX0ZJTEVTICAgICAgID0gCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuIERveHlnZW4KKyMgd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIGFjY29yZGluZyB0bworIyB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwgc2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlCisjIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMAorIyBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzNTksIGRlZmF1bHQgdmFsdWU6IDIyMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZiB0aGUgY29sb3JzCisjIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlIGdyYXlzY2FsZXMgb25seS4gQQorIyB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjU1LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZQorIyBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cgMTAwCisjIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UgdGhlIG91dHB1dAorIyBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIHNvIDgwIHJlcHJlc2VudHMKKyMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwgYW5kIDEwMCBkb2VzIG5vdAorIyBjaGFuZ2UgdGhlIGdhbW1hLgorIyBNaW5pbXVtIHZhbHVlOiA0MCwgbWF4aW11bSB2YWx1ZTogMjQwLCBkZWZhdWx0IHZhbHVlOiA4MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwCisKKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIFlFUyBjYW4gaGVscCB0byBzaG93IHdoZW4gZG94eWdlbiB3YXMgbGFzdCBydW4gYW5kIHRodXMgaWYgdGhlCisjIGRvY3VtZW50YXRpb24gaXMgdXAgdG8gZGF0ZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCisjIHBhZ2UgaGFzIGxvYWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gWUVTCisKKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZiBlbnRyaWVzCisjIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXIgY2FuIGV4cGFuZAorIyBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZCB0aGUgdHJlZSB0bworIyBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlIHZpc2libGUgKHVubGVzcworIyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZgorIyBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieSBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZQorIyByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZAorIyB0cmVlIGJ5IGRlZmF1bHQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDk5OTksIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMAorCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQKKyMgZW52aXJvbm1lbnQgKHNlZTogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMveGNvZGUvKSwgaW50cm9kdWNlZCB3aXRoCisjIE9TWCAxMC41IChMZW9wYXJkKS4gVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIE1ha2VmaWxlIGluIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbgorIyB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZyBtYWtlIGluc3RhbGwgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIGl0IGF0CisjIHN0YXJ0dXAuIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRvY3NldCBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcworIyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZSBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlcgorIyAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgY2FuIGJlIGdyb3VwZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24KKyMgc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLgorIyBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeQorIyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZQorIyBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfSUQgICAgPSBvcmcuZG94eWdlbi5QdWJsaXNoZXIKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9OQU1FIHRhZyBpZGVudGlmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiBnZW5lcmF0ZXMgdGhyZWUKKyMgYWRkaXRpb25hbCBIVE1MIGluZGV4IGZpbGVzOiBpbmRleC5oaHAsIGluZGV4LmhoYywgYW5kIGluZGV4Lmhoay4gVGhlCisjIGluZGV4LmhocCBpcyBhIHByb2plY3QgZmlsZSB0aGF0IGNhbiBiZSByZWFkIGJ5IE1pY3Jvc29mdCdzIEhUTUwgSGVscCBXb3Jrc2hvcAorIyAoc2VlOiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTIxMTM4KSBvbgorIyBXaW5kb3dzLgorIworIyBUaGUgSFRNTCBIZWxwIFdvcmtzaG9wIGNvbnRhaW5zIGEgY29tcGlsZXIgdGhhdCBjYW4gY29udmVydCBhbGwgSFRNTCBvdXRwdXQKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaW50byBhIHNpbmdsZSBjb21waWxlZCBIVE1MIGZpbGUgKC5jaG0pLiBDb21waWxlZCBIVE1MCisjIGZpbGVzIGFyZSBub3cgdXNlZCBhcyB0aGUgV2luZG93cyA5OCBoZWxwIGZvcm1hdCwgYW5kIHdpbGwgcmVwbGFjZSB0aGUgb2xkCisjIFdpbmRvd3MgaGVscCBmb3JtYXQgKC5obHApIG9uIGFsbCBXaW5kb3dzIHBsYXRmb3JtcyBpbiB0aGUgZnV0dXJlLiBDb21wcmVzc2VkCisjIEhUTUwgZmlsZXMgYWxzbyBjb250YWluIGFuIGluZGV4LCBhIHRhYmxlIG9mIGNvbnRlbnRzLCBhbmQgeW91IGNhbiBzZWFyY2ggZm9yCisjIHdvcmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgSFRNTCB3b3Jrc2hvcCBhbHNvIGNvbnRhaW5zIGEgdmlld2VyIGZvcgorIyBjb21wcmVzc2VkIEhUTUwgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgVGhlIENITV9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htCisjIGZpbGUuIFlvdSBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBISENfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoCisjIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHksCisjIGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisjIFRoZSBmaWxlIGhhcyB0byBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitISENfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgVGhlIEdFTkVSQVRFX0NISSBmbGFnIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZAorIyAoWUVTKSBvciB0aGF0IGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBUaGUgQ0hNX0lOREVYX0VOQ09ESU5HIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpCisjIGFuZCBwcm9qZWN0IGZpbGUgY29udGVudC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPSAKKworIyBUaGUgQklOQVJZX1RPQyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkCisjIChZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4gRnVydGhlcm1vcmUgaXQKKyMgZW5hYmxlcyB0aGUgUHJldmlvdXMgYW5kIE5leHQgYnV0dG9ucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgdG8KKyMgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZAorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQKKyMgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYSBRdCBDb21wcmVzc2VkIEhlbHAKKyMgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisjIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0bworIyB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdCBIZWxwCisjIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZQorIyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0CisjIEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gVmlydHVhbAorIyBGb2xkZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLQorIyBmb2xkZXJzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGRvYy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCisKKyMgSWYgdGhlIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIHRhZyBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQorIyBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPSAKKworIyBUaGUgUUhQX0NVU1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcworIyBwcm9qZWN0J3MgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4gUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXMgKHNlZToKKyMgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0gCisKKyMgVGhlIFFIR19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncworIyBxaGVscGdlbmVyYXRvci4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZQorIyBnZW5lcmF0ZWQgLnFocCBmaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIR19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQsIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIHRoZXkgZm9ybSBhbiBFY2xpcHNlIGhlbHAgcGx1Z2luLiBUbworIyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cyBtZW51IGluCisjIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBuZWVkcworIyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQorIyB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuCisjIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlIHRoZSBoZWxwIGFwcGVhcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PCisKKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZSB0aGlzCisjIG5hbWUuIEVhY2ggZG9jdW1lbnRhdGlvbiBzZXQgc2hvdWxkIGhhdmUgaXRzIG93biBpZGVudGlmaWVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0VDTElQU0VIRUxQIGlzIHNldCB0byBZRVMuCisKK0VDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgSWYgeW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIGxheW91dCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgcGFnZXMgaXQgbWlnaHQKKyMgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIGluZGV4IGFuZCByZXBsYWNlIGl0IHdpdGggeW91ciBvd24uIFRoZQorIyBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKSBhdCB0b3AKKyMgb2YgZWFjaCBIVE1MIHBhZ2UuIEEgdmFsdWUgb2YgTk8gZW5hYmxlcyB0aGUgaW5kZXggYW5kIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMKKyMgaXQuIFNpbmNlIHRoZSB0YWJzIGluIHRoZSBpbmRleCBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSBuYXZpZ2F0aW9uCisjIHRyZWUsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyBpZiB5b3UgYWxzbyBzZXQgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uIElmIHRoZSB0YWcKKyMgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UKKyMgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0IGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMKKyMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQKKyMgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4gV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUKKyMgSFRNTCBoZWxwIGZlYXR1cmUuIFZpYSBjdXN0b20gc3R5bGUgc2hlZXRzIChzZWUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUKSBvbmUgY2FuCisjIGZ1cnRoZXIgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBpbmRleC4gQXMgYW4gZXhhbXBsZSwgdGhlIGRlZmF1bHQgc3R5bGUKKyMgc2hlZXQgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaGFzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyBob3cgdG8gcHV0IGFuIGltYWdlIGF0CisjIHRoZSByb290IG9mIHRoZSB0cmVlIGluc3RlYWQgb2YgdGhlIFBST0pFQ1RfTkFNRS4gU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcworIyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4LCB5b3UgY291bGQgY29uc2lkZXIgc2V0dGluZworIyBESVNBQkxFX0lOREVYIHRvIFlFUyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBZRVMKKworIyBUaGUgRU5VTV9WQUxVRVNfUEVSX0xJTkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIHRoYXQKKyMgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgYSB2YWx1ZSBvZiAwIHdpbGwgY29tcGxldGVseSBzdXBwcmVzcyB0aGUgZW51bSB2YWx1ZXMgZnJvbSBhcHBlYXJpbmcKKyMgaW4gdGhlIG92ZXJ2aWV3IHNlY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlIHVzZWQKKyMgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZSBpcyBzaG93bi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTUwMCwgZGVmYXVsdCB2YWx1ZTogMjUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCisKKyMgSWYgdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBvcGVuIGxpbmtzIHRvCisjIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8KKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGFUZVggZm9ybXVsYXMgaW5jbHVkZWQgYXMgaW1hZ2VzIGluCisjIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bAorIyBkb3h5Z2VuIHJ1biB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorIyBNaW5pbXVtIHZhbHVlOiA4LCBtYXhpbXVtIHZhbHVlOiA1MCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAorCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZSBub3QKKyMgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCisjCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcyBpbgorIyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4IChzZWUKKyMgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUgcmVuZGVyaW5nCisjIGluc3RlYWQgb2YgdXNpbmcgcHJlLXJlbmRlcmVkIGJpdG1hcHMuIFVzZSB0aGlzIGlmIHlvdSBkbyBub3QgaGF2ZSBMYVRlWAorIyBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTCBvdXRwdXQuIFdoZW4KKyMgZW5hYmxlZCB5b3UgbWF5IGFsc28gbmVlZCB0byBpbnN0YWxsIE1hdGhKYXggc2VwYXJhdGVseSBhbmQgY29uZmlndXJlIHRoZSBwYXRoCisjIHRvIGl0IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgdG8gYmUgdXNlZCBmb3IKKyMgdGhlIE1hdGhKYXggb3V0cHV0LiBTZWUgdGhlIE1hdGhKYXggc2l0ZSAoc2VlOgorIyBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEhUTUwtQ1NTICh3aGljaCBpcyBzbG93ZXIsIGJ1dCBoYXMgdGhlIGJlc3QKKyMgY29tcGF0aWJpbGl0eSksIE5hdGl2ZU1NTCAoaS5lLiBNYXRoTUwpIGFuZCBTVkcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIVE1MLUNTUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfRk9STUFUICAgICAgICAgPSBIVE1MLUNTUworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBIVE1MCisjIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyMgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4IGRpcmVjdG9yeQorIyBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8gdGhlIE1hdGhKYXgKKyMgQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0IGluc3RhbGxpbmcKKyMgTWF0aEpheC4gSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsIGNvcHkgb2YKKyMgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QKKworIyBUaGUgTUFUSEpBWF9FWFRFTlNJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIE1hdGhKYXgKKyMgZXh0ZW5zaW9uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZHVyaW5nIE1hdGhKYXggcmVuZGVyaW5nLiBGb3IgZXhhbXBsZQorIyBNQVRISkFYX0VYVEVOU0lPTlMgPSBUZVgvQU1TbWF0aCBUZVgvQU1Tc3ltYm9scworIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9FWFRFTlNJT05TICAgICA9IAorCisjIFRoZSBNQVRISkFYX0NPREVGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB3aXRoIGphdmFzY3JpcHQgcGllY2VzCisjIG9mIGNvZGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gc3RhcnR1cCBvZiB0aGUgTWF0aEpheCBjb2RlLiBTZWUgdGhlIE1hdGhKYXggc2l0ZQorIyAoc2VlOiBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuIEZvciBhbgorIyBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfQ09ERUZJTEUgICAgICAgPSAKKworIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveCBmb3IKKyMgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdCBhbmQgREhUTUwgYW5kCisjIHNob3VsZCB3b3JrIG9uIGFueSBtb2Rlcm4gYnJvd3Nlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgSFRNTCBoZWxwCisjIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMgKEdFTkVSQVRFX0RPQ1NFVCkKKyMgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQgdHlwaWNhbGx5IGJlIGRpc2FibGVkLgorIyBGb3IgbGFyZ2UgcHJvamVjdHMgdGhlIGphdmFzY3JpcHQgYmFzZWQgc2VhcmNoIGVuZ2luZSBjYW4gYmUgc2xvdywgdGhlbgorIyBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLiBJdCBpcyBwb3NzaWJsZSB0bworIyBzZWFyY2ggdXNpbmcgdGhlIGtleWJvYXJkOyB0byBqdW1wIHRvIHRoZSBzZWFyY2ggYm94IHVzZSA8YWNjZXNzIGtleT4gKyBTCisjICh3aGF0IHRoZSA8YWNjZXNzIGtleT4gaXMgZGVwZW5kcyBvbiB0aGUgT1MgYW5kIGJyb3dzZXIsIGJ1dCBpdCBpcyB0eXBpY2FsbHkKKyMgPENUUkw+LCA8QUxUPi88b3B0aW9uPiwgb3IgYm90aCkuIEluc2lkZSB0aGUgc2VhcmNoIGJveCB1c2UgdGhlIDxjdXJzb3IgZG93bgorIyBrZXk+IHRvIGp1bXAgaW50byB0aGUgc2VhcmNoIHJlc3VsdHMgd2luZG93LCB0aGUgcmVzdWx0cyBjYW4gYmUgbmF2aWdhdGVkCisjIHVzaW5nIHRoZSA8Y3Vyc29yIGtleXM+LiBQcmVzcyA8RW50ZXI+IHRvIHNlbGVjdCBhbiBpdGVtIG9yIDxlc2NhcGU+IHRvIGNhbmNlbAorIyB0aGUgc2VhcmNoLiBUaGUgZmlsdGVyIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGN1cnNvciBpcyBpbnNpZGUgdGhlCisjIHNlYXJjaCBib3ggYnkgcHJlc3NpbmcgPFNoaWZ0Pis8Y3Vyc29yIGRvd24+LiBBbHNvIGhlcmUgdXNlIHRoZSA8Y3Vyc29yIGtleXM+CisjIHRvIHNlbGVjdCBhIGZpbHRlciBhbmQgPEVudGVyPiBvciA8ZXNjYXBlPiB0byBhY3RpdmF0ZSBvciBjYW5jZWwgdGhlIGZpbHRlcgorIyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUKKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYSB3ZWIgY2xpZW50IHVzaW5nIEphdmFzY3JpcHQuIFRoZXJlCisjIGFyZSB0d28gZmxhdm9ycyBvZiB3ZWIgc2VydmVyIGJhc2VkIHNlYXJjaGluZyBkZXBlbmRpbmcgb24gdGhlIEVYVEVSTkFMX1NFQVJDSAorIyBzZXR0aW5nLiBXaGVuIGRpc2FibGVkLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQSFAgc2NyaXB0IGZvciBzZWFyY2hpbmcgYW5kCisjIGFuIGluZGV4IGZpbGUgdXNlZCBieSB0aGUgc2NyaXB0LiBXaGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkIHRoZSBpbmRleGluZworIyBhbmQgc2VhcmNoaW5nIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2xzLiBTZWUgdGhlIHNlY3Rpb24KKyMgIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCisKKyMgV2hlbiBFWFRFUk5BTF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGUgUEhQCisjIHNjcmlwdCBmb3Igc2VhcmNoaW5nLiBJbnN0ZWFkIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgd3JpdHRlbiB0byBhbiBYTUwgZmlsZQorIyB3aGljaCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgaW5kZXhlci4gRG94eWdlbiB3aWxsIGludm9rZSBhbgorIyBleHRlcm5hbCBzZWFyY2ggZW5naW5lIHBvaW50ZWQgdG8gYnkgdGhlIFNFQVJDSEVOR0lORV9VUkwgb3B0aW9uIHRvIG9idGFpbiB0aGUKKyMgc2VhcmNoIHJlc3VsdHMuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLgorIworIyBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIICAgICAgICA9IE5PCisKKyMgVGhlIFNFQVJDSEVOR0lORV9VUkwgc2hvdWxkIHBvaW50IHRvIGEgc2VhcmNoIGVuZ2luZSBob3N0ZWQgYnkgYSB3ZWIgc2VydmVyCisjIHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkLgorIworIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyIChkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4gU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQKKyMgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hFTkdJTkVfVVJMICAgICAgID0gCisKKyMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUgdW5pbmRleGVkCisjIHNlYXJjaCBkYXRhIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIGZvciBpbmRleGluZyBieSBhbiBleHRlcm5hbCB0b29sLiBXaXRoIHRoZQorIyBTRUFSQ0hEQVRBX0ZJTEUgdGFnIHRoZSBuYW1lIG9mIHRoaXMgZmlsZSBjYW4gYmUgc3BlY2lmaWVkLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBzZWFyY2hkYXRhLnhtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hEQVRBX0ZJTEUgICAgICAgID0gc2VhcmNoZGF0YS54bWwKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZQorIyBFWFRFUk5BTF9TRUFSQ0hfSUQgdGFnIGNhbiBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9qZWN0LiBUaGlzIGlzCisjIHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0byBzZWFyY2ggdGhyb3VnaCBtdWx0aXBsZQorIyBwcm9qZWN0cyBhbmQgcmVkaXJlY3QgdGhlIHJlc3VsdHMgYmFjayB0byB0aGUgcmlnaHQgcHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0hfSUQgICAgID0gCisKKyMgVGhlIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHNlYXJjaGluZyB0aHJvdWdoIGRveHlnZW4KKyMgcHJvamVjdHMgb3RoZXIgdGhhbiB0aGUgb25lIGRlZmluZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIGJ1dCB0aGF0IGFyZQorIyBhbGwgYWRkZWQgdG8gdGhlIHNhbWUgZXh0ZXJuYWwgc2VhcmNoIGluZGV4LiBFYWNoIHByb2plY3QgbmVlZHMgdG8gaGF2ZSBhCisjIHVuaXF1ZSBpZCBzZXQgdmlhIEVYVEVSTkFMX1NFQVJDSF9JRC4gVGhlIHNlYXJjaCBtYXBwaW5nIHRoZW4gbWFwcyB0aGUgaWQgb2YKKyMgdG8gYSByZWxhdGl2ZSBsb2NhdGlvbiB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQuIFRoZSBmb3JtYXQgaXM6CisjIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyA9IHRhZ25hbWUxPWxvYzEgdGFnbmFtZTI9bG9jMiAuLi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9TRUFSQ0hfTUFQUElOR1MgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIExhVGVYIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCisjIGludm9rZWQuCisjCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGdlbmVyYXRpbmcKKyMgYml0bWFwcyBmb3IgZm9ybXVsYXMgaW4gdGhlIEhUTUwgb3V0cHV0LCBidXQgbm90IGluIHRoZSBNYWtlZmlsZSB0aGF0IGlzCisjIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvIGdlbmVyYXRlCisjIGluZGV4IGZvciBMYVRlWC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbWFrZWluZGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgTGFUZVgKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgYnkgdGhlCisjIHByaW50ZXIuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0ICgyMTAgeCAyOTcgbW0pLCBsZXR0ZXIgKDguNSB4IDExIGluY2hlcyksIGxlZ2FsICg4LjUgeAorIyAxNCBpbmNoZXMpIGFuZCBleGVjdXRpdmUgKDcuMjUgeCAxMC41IGluY2hlcykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBhNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNAorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBMYVRlWCBwYWNrYWdlIG5hbWVzCisjIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuIFRoZSBwYWNrYWdlIGNhbiBiZSBzcGVjaWZpZWQganVzdAorIyBieSBpdHMgbmFtZSBvciB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBhcyB0byBiZSB1c2VkIHdpdGggdGhlIExhVGVYCisjIFx1c2VwYWNrYWdlIGNvbW1hbmQuIFRvIGdldCB0aGUgdGltZXMgZm9udCBmb3IgaW5zdGFuY2UgeW91IGNhbiBzcGVjaWZ5IDoKKyMgRVhUUkFfUEFDS0FHRVM9dGltZXMgb3IgRVhUUkFfUEFDS0FHRVM9e3RpbWVzfQorIyBUbyB1c2UgdGhlIG9wdGlvbiBpbnRsaW1pdHMgd2l0aCB0aGUgYW1zbWF0aCBwYWNrYWdlIHlvdSBjYW4gc3BlY2lmeToKKyMgRVhUUkFfUEFDS0FHRVM9W2ludGxpbWl0c117YW1zbWF0aH0KKyMgSWYgbGVmdCBibGFuayBubyBleHRyYSBwYWNrYWdlcyB3aWxsIGJlIGluY2x1ZGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbCB0aGUgZmlyc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBoZWFkZXIuIFNlZQorIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGxldCBkb3h5Z2VuIHdyaXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB0byBhIHNlcGFyYXRlIGZpbGUuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGhlYWRlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchIFRoZQorIyBmb2xsb3dpbmcgY29tbWFuZHMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbnNpZGUgdGhlIGhlYWRlcjogJHRpdGxlLAorIyAkZGF0ZXRpbWUsICRkYXRlLCAkZG94eWdlbnZlcnNpb24sICRwcm9qZWN0bmFtZSwgJHByb2plY3RudW1iZXIsCisjICRwcm9qZWN0YnJpZWYsICRwcm9qZWN0bG9nby4gRG94eWdlbiB3aWxsIHJlcGxhY2UgJHRpdGxlIHdpdGggdGhlIGVtcHR5CisjIHN0cmluZywgZm9yIHRoZSByZXBsYWNlbWVudCB2YWx1ZXMgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHRoZSB1c2VyIGlzIHJlZmVycmVkCisjIHRvIEhUTUxfSEVBREVSLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSEVBREVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGZvb3Rlci4gU2VlCisjIExBVEVYX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGZvb3RlciBhbmQgd2hhdAorIyBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLgorIworIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBmb290ZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRk9PVEVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIExhVGVYIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzIGNyZWF0ZWQKKyMgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIERveHlnZW4KKyMgd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9FWFRSQV9TVFlMRVNIRUVUID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgTEFURVhfT1VUUFVUIG91dHB1dAorIyBkaXJlY3RvcnkuIE5vdGUgdGhhdCB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvcgorIyBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX0ZJTEVTICAgICAgPSAKKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcworIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCisjIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHVzZSBwZGZsYXRleCB0byBnZW5lcmF0ZQorIyB0aGUgUERGIGZpbGUgZGlyZWN0bHkgZnJvbSB0aGUgTGFUZVggZmlsZXMuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMsIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxiYXRjaG1vZGUKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCBydW5uaW5nCisjIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZAorIyB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX0hJREVfSU5ESUNFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgaW5jbHVkZSB0aGUKKyMgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pIGluIHRoZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZQorIyBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBTZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggYW5kIFxjaXRlIGZvciBtb3JlIGluZm8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbGFpbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbgorCisjIElmIHRoZSBMQVRFWF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfVElNRVNUQU1QICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dC4gVGhlCisjIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdG9vIHByZXR0eSB3aXRoIG90aGVyIFJURgorIyByZWFkZXJzL2VkaXRvcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHJ0Zi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCisKKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKKworIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gUlRGIGRvY3VtZW50LiBTeW50YXggaXMKKyMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuIEEgdGVtcGxhdGUgZXh0ZW5zaW9ucyBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQKKyMgdXNpbmcgZG94eWdlbiAtZSBydGYgZXh0ZW5zaW9uRmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisKKyMgSWYgdGhlIFJURl9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZSBjb2RlCisjIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgUlRGIG91dHB1dC4KKyMKKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCisjIFNPVVJDRV9CUk9XU0VSLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NPVVJDRV9DT0RFICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtYW4gcGFnZXMgZm9yCisjIGNsYXNzZXMgYW5kIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuIEEgZGlyZWN0b3J5IG1hbjMgd2lsbCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieQorIyBNQU5fT1VUUFVULgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IG1hbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCisKKyMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQKKyMgbWFuIHBhZ2VzLiBJbiBjYXNlIHRoZSBtYW51YWwgc2VjdGlvbiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgbnVtYmVyLCB0aGUgbnVtYmVyCisjIDMgaXMgcHJlcGVuZGVkLiBUaGUgZG90ICguKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQU5fRVhURU5TSU9OIHRhZyBpcworIyBvcHRpb25hbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC4zLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMworCisjIFRoZSBNQU5fU1VCRElSIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY3JlYXRlZCB3aXRoaW4KKyMgTUFOX09VVFBVVCBpbiB3aGljaCB0aGUgbWFuIHBhZ2VzIGFyZSBwbGFjZWQuIElmIGRlZmF1bHRzIHRvIG1hbiBmb2xsb3dlZCBieQorIyBNQU5fRVhURU5TSU9OIHdpdGggdGhlIGluaXRpYWwgLiByZW1vdmVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9TVUJESVIgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBkb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCB0aGVuIGl0CisjIHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwKKyMgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0CisjIHRoZW0gdGhlIG1hbiBjb21tYW5kIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0CisjIGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogeG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZHVtcCB0aGUgcHJvZ3JhbQorIyBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0bworIyB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplCisjIG9mIHRoZSBYTUwgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgRE9DQk9PSyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfRE9DQk9PSyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCisKKyMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCisjIGZyb250IG9mIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCisKKyMgSWYgdGhlIERPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIHRoZQorIyBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcKKyMgaW5mb3JtYXRpb24pIHRvIHRoZSBET0NCT09LIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5CisjIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBET0NCT09LIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DQk9PSyBpcyBzZXQgdG8gWUVTLgorCitET0NCT09LX1BST0dSQU1MSVNUSU5HID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuCisjIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBodHRwOi8vYXV0b2dlbi5zZi5uZXQpIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUKKyMgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcworIyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlCisjIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKKyMgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJCisjIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5CisjIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8sIHRoZQorIyBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdAorIyBqdXN0IHRoZSBzYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUgYXJlCisjIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4gVGhpcyBpcyB1c2VmdWwKKyMgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lIE1ha2VmaWxlIGRvbid0CisjIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvcgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGV2YWx1YXRlIGFsbAorIyBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gbmFtZXMKKyMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8sIG9ubHkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2lsbCBiZQorIyBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgd2F5IGJ5IHNldHRpbmcKKyMgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgUFJFREVGSU5FRCBhbmQKKyMgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbmNsdWRlIGZpbGVzIGluIHRoZQorIyBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCBpZiBhICNpbmNsdWRlIGlzIGZvdW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZQorIyBwcmVwcm9jZXNzb3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hfSU5DTFVERVMgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9QQVRIICAgICAgICAgICA9IC9Wb2x1bWVzL0EvYW9zcC9wcmVidWlsdHMvY2xhbmcvZGFyd2luLXg4Ni9ob3N0LzMuNi9saWIvY2xhbmcvMy42L2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC9Wb2x1bWVzL0EvYW9zcC9leHRlcm5hbC9saWJjeHgvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC9Wb2x1bWVzL0EvYW9zcC9iaW9uaWMvbGliYy9rZXJuZWwvdWFwaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2tlcm5lbC91YXBpL2FzbS1hcm02NCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2V4dGVybmFsL2d0ZXN0CisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIGJlCisjIHVzZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKKyMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCisjIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKKyMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgorIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gX19BUFBMRV9fPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgX19BTkRST0lEX189MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRDo9MSBcCisJCQkgX191bnVzZWQ9CisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCisjIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCisjIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAorIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCisjIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IERFRklORV9GTEVYSUJMRV9NRVRIT0RTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMKKworIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwKKyMgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZQorIyBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggZnVuY3Rpb24gbWFjcm9zCisjIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgYm9pbGVyLXBsYXRlIGNvZGUsIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QKKyMgcmVtb3ZlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZyBmaWxlcy4gRm9yIGVhY2ggdGFnCisjIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlIGZvcm1hdCBvZgorIyBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLgorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uCisjIHdoZXJlIGxvYzEgYW5kIGxvYzIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIFVSTHMuIFNlZSB0aGUKKyMgc2VjdGlvbiAiTGlua2luZyB0byBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlCisjIG9mIHRhZyBmaWxlcy4KKyMgTm90ZTogRWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQorIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIGEKKyMgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuIFNlZSBzZWN0aW9uICJMaW5raW5nIHRvCisjIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0YWcgZmlsZXMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgZXh0ZXJuYWwgY2xhc3Mgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQKKyMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVEVSTkFMX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgZXh0ZXJuYWwgcGFnZXMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIHJlbGF0ZWQgcGFnZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgcGFnZXMgd2lsbAorIyBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX1BBR0VTICAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiAnd2hpY2ggcGVybCcpLgorIyBUaGUgZGVmYXVsdCBmaWxlICh3aXRoIGFic29sdXRlIHBhdGgpIGlzOiAvdXNyL2Jpbi9wZXJsLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2xhc3MgZGlhZ3JhbQorIyAoaW4gSFRNTCBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8KKyMgTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVAorIyBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlCisjIHBvd2VyZnVsIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZToKKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSkgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCisKKyMgWW91IGNhbiBpbmNsdWRlIGRpYWdyYW1zIG1hZGUgd2l0aCBkaWEgaW4gZG94eWdlbiBkb2N1bWVudGF0aW9uLiBEb3h5Z2VuIHdpbGwKKyMgdGhlbiBydW4gZGlhIHRvIHByb2R1Y2UgdGhlIGRpYWdyYW0gYW5kIGluc2VydCBpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlCisjIERJQV9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZGlhIGJpbmFyeSByZXNpZGVzLgorIyBJZiBsZWZ0IGVtcHR5IGRpYSBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitESUFfUEFUSCAgICAgICAgICAgICAgID0gCisKKyMgSWYgc2V0IHRvIFlFUyB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZSBpbmhlcml0YW5jZQorIyBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkIG9yIGlzIG5vdCBhIGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pLCBhIGdyYXBoIHZpc3VhbGl6YXRpb24gdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudAorIyBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcworIyBzZXQgdG8gTk8KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzIGFsbG93ZWQKKyMgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwIGRveHlnZW4gd2lsbCBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZgorIyBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdCBleHBsaWNpdGx5IHRvIGEgdmFsdWUKKyMgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3NpbmcKKyMgc3BlZWQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDMyLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX05VTV9USFJFQURTICAgICAgICA9IDAKKworIyBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IGluIHRoZSBkb3QgZmlsZXMgdGhhdCBkb3h5Z2VuCisjIGdlbmVyYXRlcyB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2UKKyMgc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEKKyMgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkKKyMgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSGVsdmV0aWNhLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQorCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSAoaW4gcG9pbnRzKSBvZiB0aGUgZm9udCBvZgorIyBkb3QgZ3JhcGhzLgorIyBNaW5pbXVtIHZhbHVlOiA0LCBtYXhpbXVtIHZhbHVlOiAyNCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIGRlZmF1bHQgZm9udCBhcyBzcGVjaWZpZWQgd2l0aAorIyBET1RfRk9OVE5BTUUuIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0CisjIHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLgorIyBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24KKyMgZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZCBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlCisjIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworCisjIElmIHRoZSBHUk9VUF9HUkFQSFMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlIHRoZQorIyBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUgZ3JhcGggbWF5CisjIGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTIHRocmVzaG9sZCBsaW1pdHMgdGhlCisjIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZSBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwCisjIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0CisjIGlzIGVuZm9yY2VkLiBTbyB3aGVuIHlvdSBzZXQgdGhlIHRocmVzaG9sZCB0byAxMCwgdXAgdG8gMTUgZmllbGRzIG1heSBhcHBlYXIsCisjIGJ1dCBpZiB0aGUgbnVtYmVyIGV4Y2VlZHMgMTUsIHRoZSB0b3RhbCBhbW91bnQgb2YgZmllbGRzIHNob3duIGlzIGxpbWl0ZWQgdG8KKyMgMTAuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiB0aGUgVEVNUExBVEVfUkVMQVRJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIKKyMgaW5zdGFuY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgSU5DTFVERV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZSBzZXQgdG8KKyMgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcgdGhlCisjIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBJTkNMVURFRF9CWV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZQorIyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcKKyMgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbAorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4gRGlzYWJsaW5nIGEgY2FsbCBncmFwaCBjYW4gYmUKKyMgYWNjb21wbGlzaGVkIGJ5IG1lYW5zIG9mIHRoZSBjb21tYW5kIFxoaWRlY2FsbGdyYXBoLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciBncmFwaHMgZm9yIHNlbGVjdGVkCisjIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4gRGlzYWJsaW5nIGEgY2FsbGVyIGdyYXBoIGNhbiBiZQorIyBhY2NvbXBsaXNoZWQgYnkgbWVhbnMgb2YgdGhlIGNvbW1hbmQgXGhpZGVjYWxsZXJncmFwaC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ3JhcGhpY2FsCisjIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCisKKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZQorIyBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlCisjIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZSByZWxhdGlvbnMgYmV0d2VlbiB0aGUKKyMgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuIEZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgaW1hZ2UgZm9ybWF0cyBzZWUgdGhlIHNlY3Rpb24KKyMgb3V0cHV0IGZvcm1hdHMgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGRvdCB0b29sIChHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pKS4KKyMgTm90ZTogSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIKKyMgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzIHZpc2libGUgaW4gSUUgOSsgKG90aGVyIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoaXMKKyMgcmVxdWlyZW1lbnQpLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBwbmcsIGpwZywgZ2lmLCBzdmcsIHBuZzpnZCwgcG5nOmdkOmdkLCBwbmc6Y2Fpcm8sCisjIHBuZzpjYWlybzpnZCwgcG5nOmNhaXJvOmNhaXJvLCBwbmc6Y2Fpcm86Z2RpcGx1cywgcG5nOmdkaXBsdXMgYW5kCisjIHBuZzpnZGlwbHVzOmdkaXBsdXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbmcuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCisKKyMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvCisjIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLgorIworIyBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIG1vZGVybiBicm93c2VyIG90aGVyIHRoYW4gSW50ZXJuZXQgRXhwbG9yZXIuIFRlc3RlZAorIyBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4KKyMgTm90ZTogRm9yIElFIDkrIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UKKyMgdGhlIFNWRyBmaWxlcyB2aXNpYmxlLiBPbGRlciB2ZXJzaW9ucyBvZiBJRSBkbyBub3QgaGF2ZSBTVkcgc3VwcG9ydC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PCisKKyMgVGhlIERPVF9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUKKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRvdGZpbGUKKyMgY29tbWFuZCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gbXNjIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxtc2NmaWxlCisjIGNvbW1hbmQpLgorCitNU0NGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIERJQUZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gZGlhIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkaWFmaWxlCisjIGNvbW1hbmQpLgorCitESUFGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIFBMQU5UVU1MX0pBUl9QQVRIIHRhZyBzaG91bGQgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZQorIyBwYXRoIHdoZXJlIGphdmEgY2FuIGZpbmQgdGhlIHBsYW50dW1sLmphciBmaWxlLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkCisjIFBsYW50VU1MIGlzIG5vdCB1c2VkIG9yIGNhbGxlZCBkdXJpbmcgYSBwcmVwcm9jZXNzaW5nIHN0ZXAuIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIHdhcm5pbmcgd2hlbiBpdCBlbmNvdW50ZXJzIGEgXHN0YXJ0dW1sIGNvbW1hbmQgaW4gdGhpcyBjYXNlIGFuZAorIyB3aWxsIG5vdCBnZW5lcmF0ZSBvdXRwdXQgZm9yIHRoZSBkaWFncmFtLgorCitQTEFOVFVNTF9KQVJfUEFUSCAgICAgID0gCisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIHNwZWNpZmllZCBwYXRocyBhcmUgc2VhcmNoZWQgZm9yIGZpbGVzIHNwZWNpZmllZCBieQorIyB0aGUgIWluY2x1ZGUgc3RhdGVtZW50IGluIGEgcGxhbnR1bWwgYmxvY2suCisKK1BMQU5UVU1MX0lOQ0xVREVfUEFUSCAgPSAKKworIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcworIyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggYmVjb21lcworIyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcyB2aXN1YWxpemVkCisjIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUgbnVtYmVyIG9mIGRpcmVjdAorIyBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiA1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAorCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIGdyYXBocworIyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSBmcm9tIHRoZQorIyByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyB0aGF0IGxheQorIyBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDEKKyMgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSBjb2RlIGJhc2VzLiBBbHNvCisjIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkKKyMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90IHNlZW0KKyMgdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LgorIworIyBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvCisjIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0bworIyByZWFkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIHRvIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0CisjIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlCisjIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZAorIyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90CisjIGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhcmlvdXMgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGFkM2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfY29tcG9uZW50X3dyYXBwZXIiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMkNvbXBvbmVudFdyYXBwZXIuY3BwIiwKKyAgICAgICAgIlNpbXBsZU1ldGhvZFN0YXRlLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmNwcCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWY4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQ29tcG9uZW50V3JhcHBlciIKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50V3JhcHBlci5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK2MyX3N0YXR1c190IFdyYXBTaW1wbGVNZXRob2QoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qodm9pZCk+IG9wLCBjb25zdCBTaW1wbGVNZXRob2RTdGF0ZSAmc3RhdGUpIHsKKyAgICBjMl9zdGF0dXNfdCByZXN1bHQgPSBDMl9PSzsKKyAgICBzd2l0Y2ggKHN0YXRlLmdldE1vZGUoKSkgeworICAgICAgICBjYXNlIFNpbXBsZU1ldGhvZFN0YXRlOjpFWEVDVVRFOgorICAgICAgICAgICAgcmVzdWx0ID0gb3AoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpbXBsZU1ldGhvZFN0YXRlOjpOT19PUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNpbXBsZU1ldGhvZFN0YXRlOjpIQU5HOgorICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgICh2b2lkKXN0YXRlLm92ZXJyaWRlUmVzdWx0KCZyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDMkNvbXBvbmVudFdyYXBwZXI6OkluamVjdGVyOjpJbmplY3RlcihDMkNvbXBvbmVudFdyYXBwZXIgKnRoaXopIDogbVRoaXoodGhpeikge30KKworU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyIEMyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXI6OnN0YXJ0KCkgeworICAgIHJldHVybiBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIoJm1UaGl6LT5tU3RhcnRTdGF0ZSk7Cit9CisKK0MyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Okxpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIpIDogbUxpc3RlbmVyKGxpc3RlbmVyKSB7fQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgeworICAgIG1MaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihjb21wb25lbnQsIHN0ZDo6bW92ZSh3b3JrSXRlbXMpKTsKK30KKwordm9pZCBDMkNvbXBvbmVudFdyYXBwZXI6Okxpc3RlbmVyOjpvblRyaXBwZWRfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgeworICAgIG1MaXN0ZW5lci0+b25UcmlwcGVkX25iKGNvbXBvbmVudCxzZXR0aW5nUmVzdWx0KTsKK30KKwordm9pZCBDMkNvbXBvbmVudFdyYXBwZXI6Okxpc3RlbmVyOjpvbkVycm9yX25iKAorICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHVpbnQzMl90IGVycm9yQ29kZSkgeworICAgIG1MaXN0ZW5lci0+b25FcnJvcl9uYihjb21wb25lbnQsIGVycm9yQ29kZSk7Cit9CisKK0MyQ29tcG9uZW50V3JhcHBlcjo6QzJDb21wb25lbnRXcmFwcGVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICZjb21wKSA6IG1Db21wKGNvbXApIHt9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c2V0TGlzdGVuZXJfdmIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgeworICAgIG1MaXN0ZW5lciA9IHN0ZDo6bWFrZV9zaGFyZWQ8TGlzdGVuZXI+KGxpc3RlbmVyKTsKKyAgICByZXR1cm4gbUNvbXAtPnNldExpc3RlbmVyX3ZiKG1MaXN0ZW5lciwgbWF5QmxvY2spOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSB7CisgICAgcmV0dXJuIG1Db21wLT5xdWV1ZV9uYihpdGVtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6YW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSB7CisgICAgcmV0dXJuIG1Db21wLT5hbm5vdW5jZV9uYihpdGVtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6Zmx1c2hfc20oCisgICAgICAgIEMyQ29tcG9uZW50OjpmbHVzaF9tb2RlX3QgbW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIHsKKyAgICByZXR1cm4gbUNvbXAtPmZsdXNoX3NtKG1vZGUsIGZsdXNoZWRXb3JrKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpkcmFpbl9uYihDMkNvbXBvbmVudDo6ZHJhaW5fbW9kZV90IG1vZGUpIHsKKyAgICByZXR1cm4gbUNvbXAtPmRyYWluX25iKG1vZGUpOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnN0YXJ0KCkgeworICAgIHJldHVybiBXcmFwU2ltcGxlTWV0aG9kKFt0aGlzXSB7IHJldHVybiBtQ29tcC0+c3RhcnQoKTsgfSwgbVN0YXJ0U3RhdGUpOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnN0b3AoKSB7CisgICAgcmV0dXJuIG1Db21wLT5zdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cmVzZXQoKSB7CisgICAgcmV0dXJuIG1Db21wLT5yZXNldCgpOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OnJlbGVhc2UoKSB7CisgICAgcmV0dXJuIG1Db21wLT5yZWxlYXNlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gQzJDb21wb25lbnRXcmFwcGVyOjppbnRmKCl7CisgICAgcmV0dXJuIG1Db21wLT5pbnRmKCk7Cit9CisKK0MyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXIgQzJDb21wb25lbnRXcmFwcGVyOjppbmplY3QoKSB7CisgICAgcmV0dXJuIEluamVjdGVyKHRoaXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5oIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzM1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KKyNkZWZpbmUgQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJTaW1wbGVNZXRob2RTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ3JlYXRlcyBhIFdyYXBwZXIgYXJvdW5kIHRoZSBjbGFzcyBDMkNvbXBvbmVudCBhbmQgaXRzIG1ldGhvZHMuIFRoZSB3cmFwcGVyIGlzIHVzZWQgdG8KKyAqIHNpbXVsYXRlIGVycm9ycyBpbiB0aGUgYW5kcm9pZCBtZWRpYSBjb21wb25lbnRzIGJ5IGZhdWx0IGluamVjdGlvbiB0ZWNobmlxdWUuCisgKiBUaGlzIGlzIGRvbmUgdG8gY2hlY2sgaG93IHRoZSBmcmFtZXdvcmsgaGFuZGxlcyB0aGUgZXJyb3Igc2l0dWF0aW9uLgorICovCitjbGFzcyBDMkNvbXBvbmVudFdyYXBwZXIKKyAgICAgICAgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEMyQ29tcG9uZW50V3JhcHBlcj4geworcHVibGljOgorICAgIGNsYXNzIEluamVjdGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluamVjdGVyKEMyQ29tcG9uZW50V3JhcHBlciAqdGhpeik7CisKKyAgICAgICAgU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyIHN0YXJ0KCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgQzJDb21wb25lbnRXcmFwcGVyICpjb25zdCBtVGhpejsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQSB3cmFwcGVyIGFyb3VuZCB0aGUgbGlzdGVuZXIgY2xhc3MgaW5zaWRlIEMyQ29tcG9uZW50IGNsYXNzLgorICAgICAqLworICAgIGNsYXNzIExpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBMaXN0ZW5lcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIpOworICAgICAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvbkVycm9yX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICB9OworCisgICAgZXhwbGljaXQgQzJDb21wb25lbnRXcmFwcGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApOworICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50V3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc2V0TGlzdGVuZXJfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmbHVzaF9zbSgKKyAgICAgICAgICAgIGZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbl9uYihkcmFpbl9tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RvcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpIG92ZXJyaWRlOworCisgICAgSW5qZWN0ZXIgaW5qZWN0KCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBtQ29tcDsKKworICAgIFNpbXBsZU1ldGhvZFN0YXRlIG1TdGFydFN0YXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEMyX0NPTVBPTkVOVF9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzlkNjRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlTWV0aG9kU3RhdGUiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiU2ltcGxlTWV0aG9kU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OkluamVjdGVyKFNpbXBsZU1ldGhvZFN0YXRlICp0aGl6KSA6IG1UaGl6KHRoaXopIHt9CisKK3ZvaWQgU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyOjpoYW5nKCkgeworICAgIG1UaGl6LT5tTW9kZSA9IEhBTkc7Cit9CisKK3ZvaWQgU2ltcGxlTWV0aG9kU3RhdGU6OkluamVjdGVyOjpmYWlsKGMyX3N0YXR1c190IGVyciwgYm9vbCBleGVjdXRlKSB7CisgICAgbVRoaXotPm1Nb2RlID0gZXhlY3V0ZSA/IEVYRUNVVEUgOiBOT19PUDsKKyAgICBtVGhpei0+bU92ZXJyaWRlID0gdHJ1ZTsKKyAgICBtVGhpei0+bVJlc3VsdE92ZXJyaWRlID0gZXJyOworfQorCitTaW1wbGVNZXRob2RTdGF0ZTo6U2ltcGxlTWV0aG9kU3RhdGUoKQorICAgIDogbU1vZGUoRVhFQ1VURSksIG1PdmVycmlkZShmYWxzZSksIG1SZXN1bHRPdmVycmlkZShDMl9PSykge30KKworU2ltcGxlTWV0aG9kU3RhdGU6Ok1vZGUgU2ltcGxlTWV0aG9kU3RhdGU6OmdldE1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Nb2RlOworfQorCitib29sIFNpbXBsZU1ldGhvZFN0YXRlOjpvdmVycmlkZVJlc3VsdChjMl9zdGF0dXNfdCAqcmVzdWx0KSBjb25zdCB7CisgICAgaWYgKCFtT3ZlcnJpZGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqcmVzdWx0ID0gbVJlc3VsdE92ZXJyaWRlOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmggYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA0NTlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX01FVEhPRF9TVEFURV9IXworI2RlZmluZSBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogU3RhdGUgZm9yIGEgc2ltcGxlIG1ldGhvZCB3aGljaCByZXR1cm5zIGMyX3N0YXR1c190IGFuZCB0YWtlcyBubyBwYXJhbWV0ZXJzLgorICovCitjbGFzcyBTaW1wbGVNZXRob2RTdGF0ZSB7CitwdWJsaWM6CisgICAgZW51bSBNb2RlIHsKKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbm9ybWFsIG9wZXJhdGlvbgorICAgICAgICBFWEVDVVRFLAorICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZworICAgICAgICBOT19PUCwKKyAgICAgICAgLy8gSGFuZzsgbmV2ZXIgcmV0dXJuCisgICAgICAgIEhBTkcsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEluamVjdGVyIGNsYXNzIHRoYXQgbW9kaWZpZXMgdGhlIGludGVybmFsIHN0YXRlcyBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIGNsYXNzIEluamVjdGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluamVjdGVyKFNpbXBsZU1ldGhvZFN0YXRlICp0aGl6KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZyB0aGUgb3BlcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBoYW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZhaWwgdGhlIG9wZXJhdGlvbiB3aXRoIGdpdmVuIHBhcmFtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGVyciAgICAgICBlcnJvciBjb2RlIHRvIHJlcGxhY2UgdGhlIGFjdHVhbCByZXR1cm4gdmFsdWUKKyAgICAgICAgICogXHBhcmFtIGV4ZWN1dGUgICB3aGV0aGVyIHRoZSB3cmFwcGVyIHNob3VsZCBleGVjdXRlIHRoZSBvcGVyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZmFpbChjMl9zdGF0dXNfdCBlcnIsIGJvb2wgZXhlY3V0ZSA9IGZhbHNlKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNpbXBsZU1ldGhvZFN0YXRlICpjb25zdCBtVGhpejsKKyAgICB9OworCisgICAgU2ltcGxlTWV0aG9kU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCBleGVjdXRpb24gbW9kZS4KKyAgICAgKi8KKyAgICBNb2RlIGdldE1vZGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBpZiBjb25maWd1cmVkIHNvLgorICAgICAqLworICAgIGJvb2wgb3ZlcnJpZGVSZXN1bHQoYzJfc3RhdHVzX3QgKnJlc3VsdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1PdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBtUmVzdWx0T3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU0lNUExFX01FVEhPRF9TVEFURV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWFhNjViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3MiBAQAorLy8gRE8gTk9UIERFUEVORCBPTiBUSElTIERJUkVDVExZCisvLyB1c2UgbGliY29kZWMyLWhpZGwtZGVmYXVsdHMgaW5zdGVhZAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKKworICAgIGRlZmF1bHRzOiBbImhpZGxfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNvbXBvbmVudC5jcHAiLAorICAgICAgICAiQ29tcG9uZW50SW50ZXJmYWNlLmNwcCIsCisgICAgICAgICJDb21wb25lbnRTdG9yZS5jcHAiLAorICAgICAgICAiQ29uZmlndXJhYmxlLmNwcCIsCisgICAgICAgICJJbnB1dEJ1ZmZlck1hbmFnZXIuY3BwIiwKKyAgICAgICAgIklucHV0U3VyZmFjZS5jcHAiLAorICAgICAgICAiSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAiLAorICAgICAgICAidHlwZXMuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN5c3RlbV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsIC8vIHByaXZhdGUKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBDb2RlYyAyLjAgSEFMIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiZjZmNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCkBAIC0wLDAgKzEsNDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnQiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxCaW5kZXJTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworLy8gQ29tcG9uZW50TGlzdGVuZXIgd3JhcHBlcgorc3RydWN0IENvbXBvbmVudDo6TGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKKworICAgIExpc3RlbmVyKGNvbnN0IHNwPENvbXBvbmVudD4mIGNvbXBvbmVudCkgOgorICAgICAgICBtQ29tcG9uZW50KGNvbXBvbmVudCksCisgICAgICAgIG1MaXN0ZW5lcihjb21wb25lbnQtPm1MaXN0ZW5lcikgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yX25iKAorICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gLyogYzJjb21wb25lbnQgKi8sCisgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbGlzdGVuZXItPm9uRXJyb3IoU3RhdHVzOjpPSywgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25FcnJvcl9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkX25iKAorICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gLyogYzJjb21wb25lbnQgKi8sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gYzJzZXR0aW5nUmVzdWx0CisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4gc2V0dGluZ1Jlc3VsdHMoYzJzZXR0aW5nUmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmYzJyZXN1bHQgOgorICAgICAgICAgICAgICAgICAgICBjMnNldHRpbmdSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYzJyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJnNldHRpbmdSZXN1bHRzW2l4KytdLCAqYzJyZXN1bHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldHRpbmdSZXN1bHRzLnJlc2l6ZShpeCk7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBsaXN0ZW5lci0+b25UcmlwcGVkKHNldHRpbmdSZXN1bHRzKTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25UcmlwcGVkX25iIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lX25iKAorICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gLyogYzJjb21wb25lbnQgKi8sCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGMyd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBjMndvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmJhY2soKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHdvcmstPndvcmtsZXRzLmJhY2soKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0QnVmZmVyTWFuYWdlcjo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIsIHdvcmstPmlucHV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBXb3JrQnVuZGxlIHdvcmtCdW5kbGU7CisKKyAgICAgICAgICAgIHNwPENvbXBvbmVudD4gc3Ryb25nQ29tcG9uZW50ID0gbUNvbXBvbmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIW9iamNweSgmd29ya0J1bmRsZSwgYzJ3b3JrSXRlbXMsIHN0cm9uZ0NvbXBvbmVudCA/CisgICAgICAgICAgICAgICAgICAgICZzdHJvbmdDb21wb25lbnQtPm1CdWZmZXJQb29sU2VuZGVyIDogbnVsbHB0cikpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wb25lbnQ6Okxpc3RlbmVyOjpvbldvcmtEb25lX25iIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJyZWNlaXZlZCBjb3JydXB0ZWQgd29yayBpdGVtcy4iOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vbldvcmtEb25lKHdvcmtCdW5kbGUpOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wb25lbnQ6Okxpc3RlbmVyOjpvbldvcmtEb25lX25iIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKGMyd29ya0l0ZW1zLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIHdwPENvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICB3cDxJQ29tcG9uZW50TGlzdGVuZXI+IG1MaXN0ZW5lcjsKK307CisKKy8vIENvbXBvbmVudDo6U2luaworc3RydWN0IENvbXBvbmVudDo6U2luayA6IHB1YmxpYyBJSW5wdXRTaW5rIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBtQ29tcG9uZW50OworICAgIHNwPElDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHF1ZXVlKGNvbnN0IFdvcmtCdW5kbGUmIHdvcmtCdW5kbGUpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Db21wb25lbnQtPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworICAgIH0KKworICAgIFNpbmsoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCk7CisgICAgdmlydHVhbCB+U2luaygpIG92ZXJyaWRlOworCisgICAgLy8gUHJvY2Vzcy13aWRlIG1hcDogQ29tcG9uZW50OjpTaW5rIC0+IEMyQ29tcG9uZW50LgorICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNTaW5rMkNvbXBvbmVudE11dGV4OworICAgIHN0YXRpYyBzdGQ6Om1hcDxJSW5wdXRTaW5rKiwgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4+IHNTaW5rMkNvbXBvbmVudDsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGZpbmRMb2NhbENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKTsKK307CisKK3N0ZDo6bXV0ZXgKKyAgICAgICAgQ29tcG9uZW50OjpTaW5rOjpzU2luazJDb21wb25lbnRNdXRleHt9Oworc3RkOjptYXA8SUlucHV0U2luayosIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+PgorICAgICAgICBDb21wb25lbnQ6OlNpbms6OnNTaW5rMkNvbXBvbmVudHt9OworCitDb21wb25lbnQ6OlNpbms6OlNpbmsoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCkKKyAgICAgICAgOiBtQ29tcG9uZW50e2NvbXBvbmVudH0sCisgICAgICAgICAgbUNvbmZpZ3VyYWJsZXtbJmNvbXBvbmVudF0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gcmV0MSA9IGNvbXBvbmVudC0+Z2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICAgIGlmICghcmV0MS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlNpbms6OlNpbmsgLS0gY29tcG9uZW50J3MgdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHJldDIgPQorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb21wb25lbnRJbnRlcmZhY2U+PihyZXQxKS0+CisgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgICAgICAgIGlmICghcmV0Mi5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlNpbms6OlNpbmsgLS0gaW50ZXJmYWNlJ3MgdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHJldDIpOworICAgICAgICAgIH0oKX0geworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNTaW5rMkNvbXBvbmVudE11dGV4KTsKKyAgICBzU2luazJDb21wb25lbnQuZW1wbGFjZSh0aGlzLCBjb21wb25lbnQtPm1Db21wb25lbnQpOworfQorCitDb21wb25lbnQ6OlNpbms6On5TaW5rKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNTaW5rMkNvbXBvbmVudE11dGV4KTsKKyAgICBzU2luazJDb21wb25lbnQuZXJhc2UodGhpcyk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gQ29tcG9uZW50OjpTaW5rOjpmaW5kTG9jYWxDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc1NpbmsyQ29tcG9uZW50TXV0ZXgpOworICAgIGF1dG8gaSA9IHNTaW5rMkNvbXBvbmVudC5maW5kKHNpbmsuZ2V0KCkpOworICAgIGlmIChpID09IHNTaW5rMkNvbXBvbmVudC5lbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGktPnNlY29uZC5sb2NrKCk7Cit9CisKKy8vIENvbXBvbmVudAorQ29tcG9uZW50OjpDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgSUNsaWVudE1hbmFnZXI+JiBjbGllbnRQb29sTWFuYWdlcikKKyAgICAgIDogbUNvbXBvbmVudHtjb21wb25lbnR9LAorICAgICAgICBtSW50ZXJmYWNle25ldyBDb21wb25lbnRJbnRlcmZhY2UoY29tcG9uZW50LT5pbnRmKCksIHN0b3JlLmdldCgpKX0sCisgICAgICAgIG1MaXN0ZW5lcntsaXN0ZW5lcn0sCisgICAgICAgIG1TdG9yZXtzdG9yZX0sCisgICAgICAgIG1CdWZmZXJQb29sU2VuZGVye2NsaWVudFBvb2xNYW5hZ2VyfSB7CisgICAgLy8gUmV0cmlldmUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBzdG9yZQorICAgIC8vIFRPRE86IFdlIGNvdWxkIGNhY2hlIHRoaXMgcGVyIGNvbXBvbmVudC9pbnRlcmZhY2UgdHlwZQorICAgIG1Jbml0ID0gbUludGVyZmFjZS0+c3RhdHVzKCk7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudDo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudAorUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSB7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMndvcmtzOworCisgICAgaWYgKCFvYmpjcHkoJmMyd29ya3MsIHdvcmtCdW5kbGUpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyBSZWdpc3RlciBpbnB1dCBidWZmZXJzLgorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBjMndvcmtzKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OgorICAgICAgICAgICAgICAgICAgICByZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIsIHdvcmstPmlucHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnF1ZXVlX25iKCZjMndvcmtzKSk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMmZsdXNoZWRXb3JrczsKKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1Db21wb25lbnQtPmZsdXNoX3NtKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICZjMmZsdXNoZWRXb3Jrcyk7CisKKyAgICAvLyBVbnJlZ2lzdGVyIGlucHV0IGJ1ZmZlcnMuCisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyZmx1c2hlZFdvcmtzKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBXb3JrQnVuZGxlIGZsdXNoZWRXb3JrQnVuZGxlOworICAgIFN0YXR1cyByZXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGMycmVzKTsKKyAgICBpZiAoYzJyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmZsdXNoZWRXb3JrQnVuZGxlLCBjMmZsdXNoZWRXb3JrcywgJm1CdWZmZXJQb29sU2VuZGVyKSkgeworICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2IocmVzLCBmbHVzaGVkV29ya0J1bmRsZSk7CisgICAgeWllbGRCdWZmZXJRdWV1ZUJsb2NrcyhjMmZsdXNoZWRXb3JrcywgdHJ1ZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpkcmFpbihib29sIHdpdGhFb3MpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5kcmFpbl9uYih3aXRoRW9zID8KKyAgICAgICAgICAgIEMyQ29tcG9uZW50OjpEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MgOgorICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRSQUlOX0NPTVBPTkVOVF9OT19FT1MpKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpzZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICB1aW50NjRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2w7CisgICAgR2V0Q29kZWMyQmxvY2tQb29sKGJsb2NrUG9vbElkLCBtQ29tcG9uZW50LCAmcG9vbCk7CisgICAgaWYgKHBvb2wgJiYgcG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSA9PSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPiBicVBvb2wgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPihwb29sKTsKKyAgICAgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6T25SZW5kZXJDYWxsYmFjayBjYiA9CisgICAgICAgICAgICBbdGhpc10odWludDY0X3QgcHJvZHVjZXIsIGludDMyX3Qgc2xvdCwgaW50NjRfdCBuc2VjcykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGJhdGNoIHRoaXMKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzxJQ29tcG9uZW50TGlzdGVuZXI6OlJlbmRlcmVkRnJhbWU+IHJlbmRlcmVkOworICAgICAgICAgICAgICAgIHJlbmRlcmVkLnJlc2l6ZSgxKTsKKyAgICAgICAgICAgICAgICByZW5kZXJlZFswXSA9IHsgcHJvZHVjZXIsIHNsb3QsIG5zZWNzIH07CisgICAgICAgICAgICAgICAgKHZvaWQpbUxpc3RlbmVyLT5vbkZyYW1lc1JlbmRlcmVkKHJlbmRlcmVkKS5pc09rKCk7CisgICAgICAgIH07CisgICAgICAgIGlmIChicVBvb2wpIHsKKyAgICAgICAgICAgIGJxUG9vbC0+c2V0UmVuZGVyQ2FsbGJhY2soY2IpOworICAgICAgICAgICAgYnFQb29sLT5jb25maWd1cmVQcm9kdWNlcihzdXJmYWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudDo6Y29ubmVjdFRvSW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLAorICAgICAgICBjb25uZWN0VG9JbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBpbnB1dFN1cmZhY2UtPmNvbm5lY3QoCisgICAgICAgICAgICBhc0lucHV0U2luaygpLAorICAgICAgICAgICAgWyZzdGF0dXMsICZjb25uZWN0aW9uXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50Ojpjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICAodm9pZClwcm9kdWNlcjsKKyAgICAodm9pZClzb3VyY2U7CisgICAgKHZvaWQpX2hpZGxfY2I7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIHsKKyAgICAvLyBUT0RPIGltcGxlbWVudAorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3N0cnVjdCBCbG9ja1Bvb2xJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQmxvY2tQb29sSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKQorICAgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRmeworICAgICAgICAgICAgICAgICJDMkJsb2NrUG9vbDoiICsKKyAgICAgICAgICAgICAgICAgICAgKHBvb2wgPyBzdGQ6OnRvX3N0cmluZyhwb29sLT5nZXRMb2NhbElkKCkpIDogIm51bGwiKSwKKyAgICAgICAgICAgICAgICAwfSwKKyAgICAgICAgICAgIG1Qb29se3Bvb2x9IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClwYXJhbXM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClmYWlsdXJlczsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4mIGluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpaW5kaWNlczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpZmllbGRzOworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbVBvb2w7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgdWludDMyX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIGNyZWF0ZUJsb2NrUG9vbF9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdD4oYWxsb2NhdG9ySWQpLAorICAgICAgICAgICAgbUNvbXBvbmVudCwKKyAgICAgICAgICAgICZibG9ja1Bvb2wpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgYmxvY2tQb29sID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGJsb2NrUG9vbCkgeworICAgICAgICBtQmxvY2tQb29sc011dGV4LmxvY2soKTsKKyAgICAgICAgbUJsb2NrUG9vbHMuZW1wbGFjZShibG9ja1Bvb2wtPmdldExvY2FsSWQoKSwgYmxvY2tQb29sKTsKKyAgICAgICAgbUJsb2NrUG9vbHNNdXRleC51bmxvY2soKTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpLAorICAgICAgICAgICAgYmxvY2tQb29sID8gYmxvY2tQb29sLT5nZXRMb2NhbElkKCkgOiAwLAorICAgICAgICAgICAgbmV3IENhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QmxvY2tQb29sSW50Zj4oYmxvY2tQb29sKSkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6ZGVzdHJveUJsb2NrUG9vbCh1aW50NjRfdCBibG9ja1Bvb2xJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CbG9ja1Bvb2xzTXV0ZXgpOworICAgIHJldHVybiBtQmxvY2tQb29scy5lcmFzZShibG9ja1Bvb2xJZCkgPT0gMSA/CisgICAgICAgICAgICBTdGF0dXM6Ok9LIDogU3RhdHVzOjpDT1JSVVBURUQ7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+c3RhcnQoKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5zdG9wKCkpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIFN0YXR1cyBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnJlc2V0KCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmNsZWFyKCk7CisgICAgfQorICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6cmVsZWFzZSgpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5yZWxlYXNlKCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmNsZWFyKCk7CisgICAgfQorICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1JldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gQ29tcG9uZW50OjpnZXRJbnRlcmZhY2UoKSB7CisgICAgcmV0dXJuIHNwPElDb21wb25lbnRJbnRlcmZhY2U+KG1JbnRlcmZhY2UpOworfQorCitSZXR1cm48c3A8SUlucHV0U2luaz4+IENvbXBvbmVudDo6YXNJbnB1dFNpbmsoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVNpbmtNdXRleCk7CisgICAgaWYgKCFtU2luaykgeworICAgICAgICBtU2luayA9IG5ldyBTaW5rKHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgfQorICAgIHJldHVybiB7bVNpbmt9OworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IENvbXBvbmVudDo6ZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaykgeworICAgIHJldHVybiBDb21wb25lbnQ6OlNpbms6OmZpbmRMb2NhbENvbXBvbmVudChzaW5rKTsKK30KKwordm9pZCBDb21wb25lbnQ6OmluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gYzJsaXN0ZW5lciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpc3RlbmVyPihzZWxmKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihjMmxpc3RlbmVyLCBDMl9ET05UX0JMT0NLKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIG1Jbml0ID0gcmVzOworICAgIH0KK30KKworQ29tcG9uZW50Ojp+Q29tcG9uZW50KCkgeworICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIG1TdG9yZS0+cmVwb3J0Q29tcG9uZW50RGVhdGgodGhpcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRJbnRlcmZhY2UuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudEludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNTM1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnRJbnRlcmZhY2UiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxCaW5kZXJTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBDb25maWd1cmFibGVDMkludGYgYmFzZWQgb24gQzJDb21wb25lbnRJbnRlcmZhY2UKK3N0cnVjdCBDb21wSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgIENvbXBJbnRmKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGYpIDoKKyAgICAgICAgQ29uZmlndXJhYmxlQzJJbnRme2ludGYtPmdldE5hbWUoKSwgaW50Zi0+Z2V0SWQoKX0sCisgICAgICAgIG1JbnRme2ludGZ9IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHt9LCBpbmRpY2VzLCBtYXlCbG9jaywgcGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKGZpZWxkcywgbWF5QmxvY2spOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIENvbXBvbmVudEludGVyZmFjZQorQ29tcG9uZW50SW50ZXJmYWNlOjpDb21wb25lbnRJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGYsCisgICAgICAgIENvbXBvbmVudFN0b3JlKiBzdG9yZSkKKyAgICAgIDogbUludGVyZmFjZXtpbnRmfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6bWFrZV91bmlxdWU8Q29tcEludGY+KGludGYpKX0geworICAgIG1Jbml0ID0gbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZSk7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudEludGVyZmFjZTo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBDb21wb25lbnRJbnRlcmZhY2U6OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1ZmFhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUNvbXBvbmVudFN0b3JlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb247CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworc3RydWN0IFN0b3JlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgIFN0b3JlSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRme3N0b3JlID8gc3RvcmUtPmdldE5hbWUoKSA6ICIiLCAwfSwKKyAgICAgICAgICAgIG1TdG9yZXtzdG9yZX0geworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgcGFyYW1zLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+Y29uZmlnX3NtKHBhcmFtcywgZmFpbHVyZXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgaW5kaWNlcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5X3NtKHt9LCBpbmRpY2VzLCBwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLyBBc3N1bWUgYWxsIHBhcmFtcyBhcmUgYmxvY2tpbmcKKyAgICAgICAgLy8gVE9ETzogRmlsdGVyIGZvciBzdXBwb3J0ZWQgcGFyYW1zCisgICAgICAgIGlmIChtYXlCbG9jayA9PSBDMl9ET05UX0JMT0NLICYmIGZpZWxkcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKGZpZWxkcyk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IG1TdG9yZTsKK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFN0b3JlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiYgc3RvcmUpCisgICAgICA6IG1Db25maWd1cmFibGV7bmV3IENhY2hlZENvbmZpZ3VyYWJsZShzdGQ6Om1ha2VfdW5pcXVlPFN0b3JlSW50Zj4oc3RvcmUpKX0sCisgICAgICAgIG1TdG9yZXtzdG9yZX0geworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHBsYXRmb3JtU3RvcmUgPSBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisgICAgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoc3RvcmUpOworCisgICAgLy8gUmV0cmlldmUgc3RydWN0IGRlc2NyaXB0b3JzCisgICAgbVBhcmFtUmVmbGVjdG9yID0gbVN0b3JlLT5nZXRQYXJhbVJlZmxlY3RvcigpOworCisgICAgLy8gUmV0cmlldmUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBzdG9yZQorICAgIG1Jbml0ID0gbUNvbmZpZ3VyYWJsZS0+aW5pdCh0aGlzKTsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50U3RvcmU6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudFN0b3JlOjp2YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcykgeworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworCisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghZGVzYykgeworICAgICAgICAgICAgLy8gQWxsIGRlc2NyaXB0b3JzIHNob3VsZCBiZSB2YWxpZAorICAgICAgICAgICAgcmVzID0gcmVzID8gcmVzIDogQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCk7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1TdHJ1Y3REZXNjcmlwdG9ycy5maW5kKGNvcmVJbmRleCk7CisgICAgICAgIGlmIChpdCA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPQorICAgICAgICAgICAgICAgICAgICBtUGFyYW1SZWZsZWN0b3ItPmRlc2NyaWJlKGNvcmVJbmRleCk7CisgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgc3VwcG9ydGVkIHBhcmFtcyBtdXN0IGJlIGRlc2NyaWJlZAorICAgICAgICAgICAgICAgIHJlcyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHBvb2wsCisgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgeworCisgICAgc3A8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMmNvbXBvbmVudDsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPigKKyAgICAgICAgICAgIG1TdG9yZS0+Y3JlYXRlQ29tcG9uZW50KG5hbWUsICZjMmNvbXBvbmVudCkpOworCisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyY29tcG9uZW50LT5pbnRmKCkpOworICAgICAgICBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGMyY29tcG9uZW50LCBsaXN0ZW5lciwgdGhpcywgcG9vbCk7CisgICAgICAgIGlmICghY29tcG9uZW50KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcG9ydENvbXBvbmVudEJpcnRoKGNvbXBvbmVudC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5zdGF0dXMoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4oY29tcG9uZW50LT5zdGF0dXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbXBvbmVudC0+aW5pdExpc3RlbmVyKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC0+c3RhdHVzKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb21wb25lbnQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgY3JlYXRlSW50ZXJmYWNlX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjMmludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtU3RvcmUtPmNyZWF0ZUludGVyZmFjZShuYW1lLCAmYzJpbnRlcmZhY2UpOworICAgIHNwPElDb21wb25lbnRJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyaW50ZXJmYWNlKTsKKyAgICAgICAgaW50ZXJmYWNlID0gbmV3IENvbXBvbmVudEludGVyZmFjZShjMmludGVyZmFjZSwgdGhpcyk7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PFN0YXR1cz4ocmVzKSwgaW50ZXJmYWNlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6Omxpc3RDb21wb25lbnRzKGxpc3RDb21wb25lbnRzX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBjMnRyYWl0cyA9CisgICAgICAgICAgICBtU3RvcmUtPmxpc3RDb21wb25lbnRzKCk7CisgICAgaGlkbF92ZWM8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM+IHRyYWl0cyhjMnRyYWl0cy5zaXplKCkpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gJmMydHJhaXQgOiBjMnRyYWl0cykgeworICAgICAgICBpZiAoYzJ0cmFpdCkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmdHJhaXRzW2l4XSwgKmMydHJhaXQpKSB7CisgICAgICAgICAgICAgICAgKytpeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdHJhaXRzLnJlc2l6ZShpeCk7CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgdHJhaXRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUlucHV0U3VyZmFjZShjcmVhdGVJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBuZXcgR3JhcGhpY0J1ZmZlclNvdXJjZSgpOworICAgIGlmIChzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6Q09SUlVQVEVELCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR2JwOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR2JwPiBCMkhHYnA7CisgICAgc3A8SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPSBuZXcgSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCksCisgICAgICAgICAgICBuZXcgQjJIR2JwKHNvdXJjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSwKKyAgICAgICAgICAgIHNvdXJjZSk7CisgICAgX2hpZGxfY2IoaW5wdXRTdXJmYWNlID8gU3RhdHVzOjpPSyA6IFN0YXR1czo6Tk9fTUVNT1JZLAorICAgICAgICAgICAgIGlucHV0U3VyZmFjZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBDb21wb25lbnRTdG9yZTo6b25JbnRlcmZhY2VMb2FkZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZikgeworICAgIC8vIGludmFsaWRhdGUgdW5zdXBwb3J0ZWQgc3RydWN0IGRlc2NyaXB0b3JzIGlmIGEgbmV3IGludGVyZmFjZSBpcyBsb2FkZWQgYXMgaXQgbWF5IGhhdmUKKyAgICAvLyBleHBvc2VkIG5ldyBkZXNjcmlwdG9ycworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICBpZiAoIW1Mb2FkZWRJbnRlcmZhY2VzLmNvdW50KGludGYtPmdldE5hbWUoKSkpIHsKKyAgICAgICAgbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuY2xlYXIoKTsKKyAgICAgICAgbUxvYWRlZEludGVyZmFjZXMuZW1wbGFjZShpbnRmLT5nZXROYW1lKCkpOworICAgIH0KK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpnZXRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICBnZXRTdHJ1Y3REZXNjcmlwdG9yc19jYiBfaGlkbF9jYikgeworICAgIGhpZGxfdmVjPFN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzKGluZGljZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIFN0YXR1cyByZXMgPSBTdGF0dXM6Ok9LOworICAgIGZvciAoc2l6ZV90IHNyY0l4ID0gMDsgc3JjSXggPCBpbmRpY2VzLnNpemUoKTsgKytzcmNJeCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RydWN0RGVzY3JpcHRvcnNNdXRleCk7CisgICAgICAgIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoaW5kaWNlc1tzcmNJeF0pLmNvcmVJbmRleCgpOworICAgICAgICBjb25zdCBhdXRvIGl0ZW0gPSBtU3RydWN0RGVzY3JpcHRvcnMuZmluZChjb3JlSW5kZXgpOworICAgICAgICBpZiAoaXRlbSA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbiB0aGUgY2FjaGUsIGFuZCBub3Qga25vd24gdG8gYmUgdW5zdXBwb3J0ZWQsIHF1ZXJ5IGxvY2FsIHJlZmxlY3RvcgorICAgICAgICAgICAgaWYgKCFtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5jb3VudChjb3JlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJhbVJlZmxlY3Rvci0+ZGVzY3JpYmUoY29yZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuZW1wbGFjZShjb3JlSW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmpjcHkoJmRlc2NyaXB0b3JzW2RzdEl4XSwgKnN0cnVjdERlc2MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2RzdEl4OworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPnNlY29uZCkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmZGVzY3JpcHRvcnNbZHN0SXhdLCAqaXRlbS0+c2Vjb25kKSkgeworICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZXNjcmlwdG9ycy5yZXNpemUoZHN0SXgpOworICAgIF9oaWRsX2NiKHJlcywgZGVzY3JpcHRvcnMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IENvbXBvbmVudFN0b3JlOjpnZXRQb29sQ2xpZW50TWFuYWdlcigpIHsKKyAgICByZXR1cm4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoY29uc3QgQnVmZmVyJiBzcmMsIGNvbnN0IEJ1ZmZlciYgZHN0KSB7CisgICAgLy8gVE9ETyBpbXBsZW1lbnQKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIHJldHVybiBTdGF0dXM6Ok9NSVRURUQ7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gQ29tcG9uZW50U3RvcmU6OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworLy8gQ2FsbGVkIGZyb20gY3JlYXRlQ29tcG9uZW50KCkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mIGBjb21wb25lbnRgLgordm9pZCBDb21wb25lbnRTdG9yZTo6cmVwb3J0Q29tcG9uZW50QmlydGgoQ29tcG9uZW50KiBjb21wb25lbnQpIHsKKyAgICBDb21wb25lbnRTdGF0dXMgY29tcG9uZW50U3RhdHVzOworICAgIGNvbXBvbmVudFN0YXR1cy5jMkNvbXBvbmVudCA9IGNvbXBvbmVudC0+bUNvbXBvbmVudDsKKyAgICBjb21wb25lbnRTdGF0dXMuYmlydGhUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgIG1Db21wb25lbnRSb3N0ZXIuZW1wbGFjZShjb21wb25lbnQsIGNvbXBvbmVudFN0YXR1cyk7Cit9CisKKy8vIENhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZGVzdHJ1Y3RvciBvZiBgY29tcG9uZW50YC4gTm8gdmlydHVhbCBmdW5jdGlvbiBjYWxscworLy8gYXJlIG1hZGUgb24gYGNvbXBvbmVudGAgaGVyZS4KK3ZvaWQgQ29tcG9uZW50U3RvcmU6OnJlcG9ydENvbXBvbmVudERlYXRoKENvbXBvbmVudCogY29tcG9uZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNvbXBvbmVudFJvc3Rlck11dGV4KTsKKyAgICBtQ29tcG9uZW50Um9zdGVyLmVyYXNlKGNvbXBvbmVudCk7Cit9CisKKy8vIER1bXBzIGNvbXBvbmVudCB0cmFpdHMuCitzdGQ6Om9zdHJlYW0mIENvbXBvbmVudFN0b3JlOjpkdW1wKAorICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+JiBjb21wKSB7CisKKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciBpbmRlbnRbXSA9ICIgICAgIjsKKworICAgIG91dCA8PCBpbmRlbnQgPDwgIm5hbWU6ICIgPDwgY29tcC0+bmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAiZG9tYWluOiAiIDw8IGNvbXAtPmRvbWFpbiA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAia2luZDogIiA8PCBjb21wLT5raW5kIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJyYW5rOiAiIDw8IGNvbXAtPnJhbmsgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgIm1lZGlhVHlwZTogIiA8PCBjb21wLT5tZWRpYVR5cGUgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgImFsaWFzZXM6IjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFsaWFzIDogY29tcC0+YWxpYXNlcykgeworICAgICAgICBvdXQgPDwgJyAnIDw8IGFsaWFzOworICAgIH0KKyAgICBvdXQgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIG91dDsKK30KKworLy8gRHVtcHMgY29tcG9uZW50IHN0YXR1cy4KK3N0ZDo6b3N0cmVhbSYgQ29tcG9uZW50U3RvcmU6OmR1bXAoCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICBDb21wb25lbnRTdGF0dXMmIGNvbXBTdGF0dXMpIHsKKworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgICAiOworCisgICAgLy8gUHJpbnQgYmlydGggdGltZS4KKyAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1zID0KKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KAorICAgICAgICAgICAgICAgIGNvbXBTdGF0dXMuYmlydGhUaW1lLnRpbWVfc2luY2VfZXBvY2goKSk7CisgICAgc3RkOjp0aW1lX3QgYmlydGhUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KAorICAgICAgICAgICAgY29tcFN0YXR1cy5iaXJ0aFRpbWUpOworICAgIHN0ZDo6dG0gdG0gPSAqc3RkOjpsb2NhbHRpbWUoJmJpcnRoVGltZSk7CisgICAgb3V0IDw8IGluZGVudCA8PCAiQ3JlYXRpb24gdGltZTogIgorICAgICAgICA8PCBzdGQ6OnB1dF90aW1lKCZ0bSwgIiVZLSVtLSVkICVIOiVNOiVTIikKKyAgICAgICAgPDwgJy4nIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygzKSA8PCBtcy5jb3VudCgpICUgMTAwMAorICAgICAgICA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBQcmludCBuYW1lIGFuZCBpZC4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBjb21wU3RhdHVzLmMyQ29tcG9uZW50LT5pbnRmKCk7CisgICAgaWYgKCFpbnRmKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgIlVua25vd24gY29tcG9uZW50IC0tIG51bGwgaW50ZXJmYWNlIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQgPDwgIk5hbWU6ICIgPDwgaW50Zi0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJJZDogIiA8PCBpbnRmLT5nZXRJZCgpIDw8IHN0ZDo6ZW5kbDsKKworICAgIHJldHVybiBvdXQ7Cit9CisKKy8vIER1bXBzIGluZm9ybWF0aW9uIHdoZW4gbHNoYWwgaXMgY2FsbGVkLgorUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpkZWJ1ZygKKyAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIGhhbmRsZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+JiAvKiBhcmdzICovKSB7CisgICAgTE9HKElORk8pIDw8ICJkZWJ1ZyAtLSBkdW1waW5nLi4uIjsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmggPSBoYW5kbGUuZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgaWYgKCFoIHx8IGgtPm51bUZkcyAhPSAxKSB7CisgICAgICAgTE9HKEVSUk9SKSA8PCAiZGVidWcgLS0gZHVtcGluZyBmYWlsZWQgLS0gIgorICAgICAgICAgICAgICAgImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIHRvIGR1bXAgdG8iOworICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgICB7IC8vIFBvcHVsYXRlICJvdXQiLgorCisgICAgICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgIjsKKworICAgICAgICAvLyBTaG93IG5hbWUuCisgICAgICAgIG91dCA8PCAiQmVnaW5uaW5nIG9mIGR1bXAgLS0gQzJDb21wb25lbnRTdG9yZTogIgorICAgICAgICAgICAgICAgIDw8IG1TdG9yZS0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbXBvbmVudHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gdHJhaXRzTGlzdCA9CisgICAgICAgICAgICAgICAgbVN0b3JlLT5saXN0Q29tcG9uZW50cygpOworCisgICAgICAgIC8vIER1bXAgdGhlIHRyYWl0cyBvZiBzdXBwb3J0ZWQgY29tcG9uZW50cy4KKyAgICAgICAgb3V0IDw8IGluZGVudCA8PCAiU3VwcG9ydGVkIGNvbXBvbmVudHM6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICBpZiAodHJhaXRzTGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCA8PCBpbmRlbnQgPDwgIk5PTkUiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWl0cyA6IHRyYWl0c0xpc3QpIHsKKyAgICAgICAgICAgICAgICBkdW1wKG91dCwgdHJhaXRzKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEdW1wIGFjdGl2ZSBjb21wb25lbnRzLgorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8ICJBY3RpdmUgY29tcG9uZW50czoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgICAgICAgICAgaWYgKG1Db21wb25lbnRSb3N0ZXIuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8IGluZGVudCA8PCAiTk9ORSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbUNvbXBvbmVudFJvc3RlcikgeworICAgICAgICAgICAgICAgICAgICBkdW1wKG91dCwgcGFpci5zZWNvbmQpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgIkVuZCBvZiBkdW1wIC0tIEMyQ29tcG9uZW50U3RvcmU6ICIKKyAgICAgICAgICAgICAgICA8PCBtU3RvcmUtPmdldE5hbWUoKSA8PCBzdGQ6OmVuZGw7CisgICAgfQorCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmQob3V0LnN0cigpLCBoLT5kYXRhWzBdKSkgeworICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJkZWJ1ZyAtLSBkdW1waW5nIGZhaWxlZCAtLSB3cml0ZSgpIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coSU5GTykgPDwgImRlYnVnIC0tIGR1bXBpbmcgc3VjY2VlZGVkIjsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29uZmlndXJhYmxlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db25maWd1cmFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOWMxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29uZmlndXJhYmxlLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItQ29uZmlndXJhYmxlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworQ2FjaGVkQ29uZmlndXJhYmxlOjpDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmFibGVDMkludGY+JiYgaW50ZikKKyAgICAgIDogbUludGZ7c3RkOjptb3ZlKGludGYpfSB7Cit9CisKK2MyX3N0YXR1c190IENhY2hlZENvbmZpZ3VyYWJsZTo6aW5pdChDb21wb25lbnRTdG9yZSogc3RvcmUpIHsKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgYzJfc3RhdHVzX3QgaW5pdCA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmbVN1cHBvcnRlZFBhcmFtcyk7CisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGUgPSBzdG9yZS0+dmFsaWRhdGVTdXBwb3J0ZWRQYXJhbXMobVN1cHBvcnRlZFBhcmFtcyk7CisgICAgcmV0dXJuIGluaXQgPT0gQzJfT0sgPyBDMl9PSyA6IHZhbGlkYXRlOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlIGZvbGxvdy4KK1JldHVybjx1aW50MzJfdD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpnZXRJZCgpIHsKKyAgICByZXR1cm4gbUludGYtPmdldElkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OmdldE5hbWUoZ2V0TmFtZV9jYiBfaGlkbF9jYikgeworICAgIF9oaWRsX2NiKG1JbnRmLT5nZXROYW1lKCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5KAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgIHF1ZXJ5X2NiIF9oaWRsX2NiKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJbmRleDsKKyAgICBzdGQ6OnZlY3RvcjxJbmRleD4gYzJoZWFwUGFyYW1JbmRpY2VzKAorICAgICAgICAgICAgKEluZGV4KilpbmRpY2VzLmRhdGEoKSwKKyAgICAgICAgICAgIChJbmRleCopaW5kaWNlcy5kYXRhKCkgKyBpbmRpY2VzLnNpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjMmhlYXBQYXJhbXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+cXVlcnkoCisgICAgICAgICAgICBjMmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJoZWFwUGFyYW1zKTsKKworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJnBhcmFtcywgYzJoZWFwUGFyYW1zKSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIGludmFsaWQgb3V0cHV0IHBhcmFtcy4iOworICAgIH0KKyAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxTdGF0dXM+KGMycmVzKSwgcGFyYW1zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpjb25maWcoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpblBhcmFtcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgY29uZmlnX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gaW5QYXJhbXMgaXMgbm90IHdyaXRhYmxlLCBzbyBjcmVhdGUgYSBjb3B5IGFzIGNvbmZpZyBtb2RpZmllcyB0aGUgcGFyYW1ldGVycworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGluUGFyYW1zQ29weSA9IGluUGFyYW1zOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjMnBhcmFtczsKKyAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmYzJwYXJhbXMsIGluUGFyYW1zQ29weSkpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBpbnB1dCBwYXJhbXMuIjsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpDT1JSVVBURUQsCisgICAgICAgICAgICAgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4oKSwKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgLy8gVE9ETzogY2hlY2sgaWYgYmxvYiB3YXMgaW52YWxpZAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMmZhaWx1cmVzOworICAgIGMyX3N0YXR1c190IGMycmVzID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgIGMycGFyYW1zLAorICAgICAgICAgICAgbWF5QmxvY2sgPyBDMl9NQVlfQkxPQ0sgOiBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgJmMyZmFpbHVyZXMpOworICAgIGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IGZhaWx1cmVzKGMyZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4mIGMycmVzdWx0IDogYzJmYWlsdXJlcykgeworICAgICAgICAgICAgaWYgKGMycmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKG9iamNweSgmZmFpbHVyZXNbaXhdLCAqYzJyZXN1bHQpKSB7CisgICAgICAgICAgICAgICAgICAgICsraXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29uZmlnIC0tIGludmFsaWQgc2V0dGluZyByZXN1bHRzLiI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmYWlsdXJlcy5yZXNpemUoaXgpOworICAgIH0KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBvdXRQYXJhbXM7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZvdXRQYXJhbXMsIGMycGFyYW1zKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpYzJyZXMsIGZhaWx1cmVzLCBvdXRQYXJhbXMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICB1aW50MzJfdCBzdGFydCwKKyAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX2NiIF9oaWRsX2NiKSB7CisgICAgQzJMaW5lYXJSYW5nZSByZXF1ZXN0ID0gQzJMaW5lYXJDYXBhY2l0eShtU3VwcG9ydGVkUGFyYW1zLnNpemUoKSkucmFuZ2UoCisgICAgICAgICAgICBzdGFydCwgY291bnQpOworICAgIGhpZGxfdmVjPFBhcmFtRGVzY3JpcHRvcj4gcGFyYW1zKHJlcXVlc3Quc2l6ZSgpKTsKKyAgICBTdGF0dXMgcmVzID0gU3RhdHVzOjpPSzsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIGZvciAoc2l6ZV90IHNyY0l4ID0gcmVxdWVzdC5vZmZzZXQoKTsgc3JjSXggPCByZXF1ZXN0LmVuZE9mZnNldCgpOyArK3NyY0l4KSB7CisgICAgICAgIGlmIChtU3VwcG9ydGVkUGFyYW1zW3NyY0l4XSkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmcGFyYW1zW2RzdEl4XSwgKm1TdXBwb3J0ZWRQYXJhbXNbc3JjSXhdKSkgeworICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkJBRF9JTkRFWDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwYXJhbXMucmVzaXplKGRzdEl4KTsKKyAgICBfaGlkbF9jYihyZXMsIHBhcmFtcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBpbkZpZWxkcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGMyZmllbGRzOworICAgIHsKKyAgICAgICAgLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IG9iamVjdHMgYXJlIHJlc3RyaWN0ZWQgaW4gdGhhdCBzb21lCisgICAgICAgIC8vIG1lbWJlcnMgYXJlIGNvbnN0LgorICAgICAgICAvLyBDMlBhcmFtRmllbGQgLSByZXF1aXJlZCBmb3IgaXRzIGNvbnN0cnVjdG9yIC0gaGFzIG5vIGNvbnN0cnVjdG9ycworICAgICAgICAvLyBmcm9tIGZpZWxkcy4gVXNlIEMyUGFyYW1JbnNwZWN0b3IuCisgICAgICAgIGZvciAoY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBpbkZpZWxkcykgeworICAgICAgICAgICAgYzJmaWVsZHMuZW1wbGFjZV9iYWNrKF9DMlBhcmFtSW5zcGVjdG9yOjpDcmVhdGVQYXJhbUZpZWxkKAorICAgICAgICAgICAgICAgICAgICBxdWVyeS5maWVsZC5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkuZmllbGQuZmllbGRJZC5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmZpZWxkLmZpZWxkSWQuc2l6ZSksCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LnR5cGUgPT0gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEUgPworICAgICAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBPU1NJQkxFIDoKKyAgICAgICAgICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGMyZmllbGRzLAorICAgICAgICAgICAgbWF5QmxvY2sgPyBDMl9NQVlfQkxPQ0sgOiBDMl9ET05UX0JMT0NLKTsKKyAgICBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0PiBvdXRGaWVsZHMoaW5GaWVsZHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZyZXN1bHQgOiBjMmZpZWxkcykgeworICAgICAgICBpZiAob2JqY3B5KCZvdXRGaWVsZHNbZHN0SXhdLCByZXN1bHQpKSB7CisgICAgICAgICAgICArK2RzdEl4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0RmllbGRzLnJlc2l6ZShkc3RJeCk7CisgICAgICAgICAgICBjMnJlcyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYigoU3RhdHVzKWMycmVzLCBvdXRGaWVsZHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dEJ1ZmZlck1hbmFnZXIuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyM2EwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dEJ1ZmZlck1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1JbnB1dEJ1ZmZlck1hbmFnZXIiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6cmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl9yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkgeworICAgIGdldEluc3RhbmNlKCkuX3VucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lcik7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpzZXROb3RpZmljYXRpb25JbnRlcnZhbCgKKyAgICAgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwobm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfcmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9CisgICAgICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXBbbGlzdGVuZXJdW2ZyYW1lSW5kZXhdOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC5idWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghaW5wdXQuYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIklucHV0IGJ1ZmZlciBhdCBpbmRleCAiIDw8IGkgPDwgIiBpcyBudWxsLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBUcmFja2VkQnVmZmVyICZidWZmZXJJZCA9CisgICAgICAgICAgICAgICAgKmJ1ZmZlcklkcy5lbXBsYWNlKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBpLCBpbnB1dC5idWZmZXJzW2ldKS4KKyAgICAgICAgICAgICAgICBmaXJzdDsKKworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBpbnB1dC5idWZmZXJzW2ldLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgKKyAgICAgICAgICAgICAgICBvbkJ1ZmZlckRlc3Ryb3llZCwKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmYnVmZmVySWQpKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgInJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpID0+IHN0YXR1cyA9ICIgPDwgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1EZWF0aE5vdGlmaWNhdGlvbnMuZW1wbGFjZSgKKyAgICAgICAgICAgIGxpc3RlbmVyLAorICAgICAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zKAorICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpKTsKK30KKworLy8gUmVtb3ZlIGEgcGFpciAobGlzdGVuZXIsIGZyYW1lSW5kZXgpIGZyb20gbVRyYWNrZWRCdWZmZXJzTWFwIGFuZAorLy8gbURlYXRoTm90aWZpY2F0aW9ucy4gVGhpcyBpbXBsaWVzIGFsbCBidWZmZXJJbmRpY2VzIGFyZSByZW1vdmVkLgorLy8KKy8vIFRoaXMgaXMgY2FsbGVkIGZyb20gb25Xb3JrRG9uZSgpIGFuZCBmbHVzaCgpLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIgPDwgc3RkOjpkZWMgPDwgZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgIGF1dG8gZmluZExpc3RlbmVyID0gbVRyYWNrZWRCdWZmZXJzTWFwLmZpbmQobGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXIgIT0gbVRyYWNrZWRCdWZmZXJzTWFwLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4gJmZyYW1lSW5kZXgyQnVmZmVySWRzCisgICAgICAgICAgICAgICAgPSBmaW5kTGlzdGVuZXItPnNlY29uZDsKKyAgICAgICAgYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmZpbmQoZnJhbWVJbmRleCk7CisgICAgICAgIGlmIChmaW5kRnJhbWVJbmRleCAhPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFRyYWNrZWRCdWZmZXImIGJ1ZmZlcklkIDogYnVmZmVySWRzKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJJZC5idWZmZXIubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICItLSB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnVmZmVySWQubGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgYnVmZmVySWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgYnVmZmVySWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgPT4gc3RhdHVzID0gIiA8PCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lcmFzZShmaW5kRnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoZnJhbWVJbmRleDJCdWZmZXJJZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byBmaW5kTGlzdGVuZXJEID0gbURlYXRoTm90aWZpY2F0aW9ucy5maW5kKGxpc3RlbmVyKTsKKyAgICBpZiAoZmluZExpc3RlbmVyRCAhPSBtRGVhdGhOb3RpZmljYXRpb25zLmVuZCgpKSB7CisgICAgICAgIERlYXRoTm90aWZpY2F0aW9ucyAmZGVhdGhOb3RpZmljYXRpb25zID0gZmluZExpc3RlbmVyRC0+c2Vjb25kOworICAgICAgICBhdXRvIGZpbmRGcmFtZUluZGV4ID0gZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMuZmluZChmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZpbmRGcmFtZUluZGV4ICE9IGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZidWZmZXJJbmRpY2VzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCAtPSBidWZmZXJJbmRpY2VzLnNpemUoKTsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gUmVtb3ZlIGxpc3RlbmVyIGZyb20gbVRyYWNrZWRCdWZmZXJzTWFwIGFuZCBtRGVhdGhOb3RpZmljYXRpb25zLiBUaGlzIGltcGxpZXMKKy8vIGFsbCBmcmFtZUluZGljZXMgYW5kIGJ1ZmZlckluZGljZXMgYXJlIHJlbW92ZWQuCisvLworLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGNsZWFucyB1cCBhbGwgaW5wdXQgYnVmZmVycywgaS5lLiwgd2hlbgorLy8gcmVzZXQoKSwgcmVsZWFzZSgpLCBzdG9wKCkgb3IgfkNvbXBvbmVudCgpIGlzIGNhbGxlZC4KK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEgLS0gY2FsbGVkIHdpdGggIgorICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXggPDwgbGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciAhPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMgPQorICAgICAgICAgICAgICAgIGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgICAgICBmb3IgKGF1dG8gZmluZEZyYW1lSW5kZXggPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5iZWdpbigpOworICAgICAgICAgICAgICAgIGZpbmRGcmFtZUluZGV4ICE9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpOworICAgICAgICAgICAgICAgICsrZmluZEZyYW1lSW5kZXgpIHsKKyAgICAgICAgICAgIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+ICZidWZmZXJJZHMgPSBmaW5kRnJhbWVJbmRleC0+c2Vjb25kOworICAgICAgICAgICAgZm9yIChjb25zdCBUcmFja2VkQnVmZmVyJiBidWZmZXJJZCA6IGJ1ZmZlcklkcykgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gYnVmZmVySWQuYnVmZmVyLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGJ1ZmZlci0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkJ1ZmZlckRlc3Ryb3llZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmYnVmZmVySWQpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLS0gdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgpIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIobGlzdGVuZXIgQCAweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJ1ZmZlcklkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8IGJ1ZmZlcklkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGJ1ZmZlcklkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpID0+IHN0YXR1cyA9ICIgPDwgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXAuZXJhc2UoZmluZExpc3RlbmVyKTsKKyAgICB9CisKKyAgICBtRGVhdGhOb3RpZmljYXRpb25zLmVyYXNlKGxpc3RlbmVyKTsKK30KKworLy8gU2V0IG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9zZXROb3RpZmljYXRpb25JbnRlcnZhbCgKKyAgICAgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgbU5vdGlmaWNhdGlvbkludGVydmFsTnMuc3RvcmUoCisgICAgICAgICAgICBub3RpZmljYXRpb25JbnRlcnZhbE5zLAorICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Cit9CisKKy8vIE1vdmUgYSBidWZmZXIgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgdG8gbURlYXRoTm90aWZpY2F0aW9ucy4KKy8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWdpc3RlcmVkIEMyQnVmZmVyIG9iamVjdCBpcyBkZXN0cm95ZWQuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6b25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fb25CdWZmZXJEZXN0cm95ZWQoYnVmLCBhcmcpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZykgeworICAgIGlmICghYnVmIHx8ICFhcmcpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICA8PCAibnVsbCBhcmd1bWVudCAocyk6ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJidWYgQCAweCIgPDwgc3RkOjpoZXggPDwgYnVmCisgICAgICAgICAgICAgICAgICAgICA8PCAiLCBhcmcgQCAweCIgPDwgc3RkOjpoZXggPDwgYXJnCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVHJhY2tlZEJ1ZmZlciBpZCgqcmVpbnRlcnByZXRfY2FzdDxUcmFja2VkQnVmZmVyKj4oYXJnKSk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJidWYgQCAweCIgPDwgc3RkOjpoZXggPDwgYnVmCisgICAgICAgICAgICAgICAgIDw8ICIsIGFyZyBAIDB4IiA8PCBzdGQ6OmhleCA8PCBhcmcKKyAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgIiAtLSAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIgPDwgc3RkOjpkZWMgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgPDwgIi4iOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgIGF1dG8gZmluZExpc3RlbmVyID0gbVRyYWNrZWRCdWZmZXJzTWFwLmZpbmQoaWQubGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXIgPT0gbVRyYWNrZWRCdWZmZXJzTWFwLmVuZCgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tICIKKyAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgaW52YWxpZCBsaXN0ZW5lcjogIgorICAgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIChmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGlkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIikuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4gJmZyYW1lSW5kZXgyQnVmZmVySWRzCisgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgIGF1dG8gZmluZEZyYW1lSW5kZXggPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5maW5kKGlkLmZyYW1lSW5kZXgpOworICAgIGlmIChmaW5kRnJhbWVJbmRleCA9PSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSAiCisgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkIGludmFsaWQgZnJhbWUgaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICA8PCAiZnJhbWVJbmRleCA9ICIgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIgKGxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIpLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICBhdXRvIGZpbmRCdWZmZXJJZCA9IGJ1ZmZlcklkcy5maW5kKGlkKTsKKyAgICBpZiAoZmluZEJ1ZmZlcklkID09IGJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSAiCisgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkIGludmFsaWQgYnVmZmVyIGluZGV4OiAiCisgICAgICAgICAgICAgICAgICAgPDwgImJ1ZmZlckluZGV4ID0gIiA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIgKGZyYW1lSW5kZXggPSAiIDw8IGlkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiKS4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnVmZmVySWRzLmVyYXNlKGZpbmRCdWZmZXJJZCk7CisgICAgaWYgKGJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgIGZyYW1lSW5kZXgyQnVmZmVySWRzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZyYW1lSW5kZXgyQnVmZmVySWRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBtRGVhdGhOb3RpZmljYXRpb25zW2lkLmxpc3RlbmVyXTsKKyAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlc1tpZC5mcmFtZUluZGV4XS5lbXBsYWNlX2JhY2soaWQuYnVmZmVySW5kZXgpOworICAgICsrZGVhdGhOb3RpZmljYXRpb25zLmNvdW50OworICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC5ub3RpZnlfb25lKCk7Cit9CisKKy8vIE5vdGlmeSB0aGUgY2xpZW50cyBhYm91dCBidWZmZXIgZGVzdHJ1Y3Rpb25zLgorLy8gUmV0dXJuIGZhbHNlIGlmIGFsbCBkZXN0cnVjdGlvbnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgorLy8gUmV0dXJuIHRydWUgYW5kIHNldCB0aW1lVG9SZXRyeSB0byB0aGUgdGltZSBwb2ludCB0byB3YWl0IGZvciBiZWZvcmUKKy8vIHJldHJ5aW5nIGlmIHNvbWUgZGVzdHJ1Y3Rpb25zIGhhdmUgbm90IGJlZW4gbm90aWZpZWQuCitib29sIElucHV0QnVmZmVyTWFuYWdlcjo6cHJvY2Vzc05vdGlmaWNhdGlvbnMobnNlY3NfdCogdGltZVRvUmV0cnlOcykgeworCisgICAgc3RydWN0IE5vdGlmaWNhdGlvbiB7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6SW5wdXRCdWZmZXI+IGlucHV0QnVmZmVyczsKKyAgICAgICAgTm90aWZpY2F0aW9uKGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGwsIHNpemVfdCBzKQorICAgICAgICAgICAgICA6IGxpc3RlbmVyKGwpLCBpbnB1dEJ1ZmZlcnMocykge30KKyAgICB9OworICAgIHN0ZDo6bGlzdDxOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbnM7CisgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zID0KKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisKKyAgICBib29sIHJldHJ5ID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAqdGltZVRvUmV0cnlOcyA9IG5vdGlmaWNhdGlvbkludGVydmFsTnM7CisgICAgICAgIG5zZWNzX3QgdGltZU5vd05zID0gc3lzdGVtVGltZSgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbURlYXRoTm90aWZpY2F0aW9ucy5lbmQoKTsgKSB7CisgICAgICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBpdC0+c2Vjb25kOworCisgICAgICAgICAgICBuc2Vjc190IHRpbWVTaW5jZUxhc3ROb3RpZmllZE5zID0KKyAgICAgICAgICAgICAgICAgICAgdGltZU5vd05zIC0gZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnM7CisgICAgICAgICAgICAvLyBJZiBub3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsYmFjaywgbGVhdmUgdGhlCisgICAgICAgICAgICAvLyBub3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyIHVudG91Y2hlZCBmb3Igbm93IGFuZCByZXRyeQorICAgICAgICAgICAgLy8gbGF0ZXIuCisgICAgICAgICAgICBpZiAodGltZVNpbmNlTGFzdE5vdGlmaWVkTnMgPCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgICAgICAgICAgICAgcmV0cnkgPSB0cnVlOworICAgICAgICAgICAgICAgICp0aW1lVG9SZXRyeU5zID0gc3RkOjptaW4oKnRpbWVUb1JldHJ5TnMsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25JbnRlcnZhbE5zIC0gdGltZVNpbmNlTGFzdE5vdGlmaWVkTnMpOworICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOb3RpZmljYXRpb25zIGZvciBsaXN0ZW5lciBAICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgd2lsbCBiZSBwb3N0cG9uZWQuIjsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IG5vdGlmaWNhdGlvbiB0byB0aGlzCisgICAgICAgICAgICAvLyBsaXN0ZW5lciBidXQgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBwZW5kaW5nIG5vdGlmaWNhdGlvbnMsIHRoZQorICAgICAgICAgICAgLy8gbGlzdGVuZXIgY2FuIGJlIHJlbW92ZWQgZnJvbSBtRGVhdGhOb3RpZmljYXRpb25zLS0tdGhlcmUgaXMgbm8KKyAgICAgICAgICAgIC8vIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBub3RpZmljYXRpb24gdGltZSBhbnltb3JlLgorICAgICAgICAgICAgaWYgKGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBhcmd1bWVudCBmb3IgdGhlIGNhbGxiYWNrLgorICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5lbXBsYWNlX2JhY2sobGlzdGVuZXIsIGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCk7CisgICAgICAgICAgICBoaWRsX3ZlYzxJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyPiAmaW5wdXRCdWZmZXJzID0KKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5iYWNrKCkuaW5wdXRCdWZmZXJzOworICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgZm9yIChzdGQ6OnBhaXI8Y29uc3QgdWludDY0X3QsIHN0ZDo6dmVjdG9yPHNpemVfdD4+JiBwIDoKKyAgICAgICAgICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gcC5maXJzdDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZidWZmZXJJbmRpY2VzID0gcC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzaXplX3QmIGJ1ZmZlckluZGV4IDogYnVmZmVySW5kaWNlcykgeworICAgICAgICAgICAgICAgICAgICBJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyICZpbnB1dEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaW5wdXRCdWZmZXJzW2krK107CisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLmFycmF5SW5kZXggPSBidWZmZXJJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuZnJhbWVJbmRleCA9IGZyYW1lSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDbGVhciBkZWF0aE5vdGlmaWNhdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIgYW5kIHNldCByZXRyeSB0byB0cnVlCisgICAgICAgICAgICAvLyBzbyBwcm9jZXNzTm90aWZpY2F0aW9ucyB3aWxsIGJlIGNhbGxlZCBhZ2Fpbi4gVGhpcyB3aWxsCisgICAgICAgICAgICAvLyBndWFyYW50ZWUgdGhhdCBhIGxpc3RlbmVyIHdpdGggbm8gcGVuZGluZyBub3RpZmljYXRpb25zIHdpbGwKKyAgICAgICAgICAgIC8vIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZCBmcm9tIG1EZWF0aE5vdGlmaWNhdGlvbnMgYWZ0ZXIKKyAgICAgICAgICAgIC8vIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIG5hbm9zZWNvbmRzIGhhcyBwYXNzZWQuCisgICAgICAgICAgICByZXRyeSA9IHRydWU7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5jbGVhcigpOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmNvdW50ID0gMDsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5sYXN0U2VudE5zID0gdGltZU5vd05zOworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENhbGwgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIG91dHNpZGUgdGhlIGxvY2sgdG8gYXZvaWQgZGVhZGxvY2suCisgICAgZm9yIChjb25zdCBOb3RpZmljYXRpb24mIG5vdGlmaWNhdGlvbiA6IG5vdGlmaWNhdGlvbnMpIHsKKyAgICAgICAgaWYgKCFub3RpZmljYXRpb24ubGlzdGVuZXItPm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLmlucHV0QnVmZmVycykuaXNPaygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIG1heSB0cmlnZ2VyIGlmIHRoZSBjbGllbnQgaGFzIGRpZWQuCisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgImZhaWxlZCB0byBzZW5kIGRlYXRoIG5vdGlmaWNhdGlvbnMgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG5vdGlmaWNhdGlvbi5saXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiLiI7CisgICAgICAgIH0gZWxzZSB7CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBpbnB1dEJ1ZmZlckxvZzsKKyAgICAgICAgICAgIGZvciAoY29uc3QgSUNvbXBvbmVudExpc3RlbmVyOjpJbnB1dEJ1ZmZlciYgaW5wdXRCdWZmZXIgOgorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uaW5wdXRCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJMb2cgPDwgIiAoIiA8PCBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBpbnB1dEJ1ZmZlci5hcnJheUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZGVhdGggbm90aWZpY2F0aW9ucyBzZW50IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbm90aWZpY2F0aW9uLmxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoIHRoZXNlIChmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgcGFpcnM6IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGlucHV0QnVmZmVyTG9nLnN0cigpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgaWYgKHJldHJ5KSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICA8PCAid2lsbCByZXRyeSBhZ2FpbiBpbiAiIDw8ICp0aW1lVG9SZXRyeU5zIDw8ICJucy4iOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICA8PCAibm8gcGVuZGluZyBkZWF0aCBub3RpZmljYXRpb25zLiI7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJldHJ5OworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6bWFpbigpIHsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlciBtYWluIC0tIHN0YXJ0ZWQuIjsKKyAgICBuc2Vjc190IHRpbWVUb1JldHJ5TnM7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlIChtRGVhdGhOb3RpZmljYXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC53YWl0KGxvY2spOworICAgICAgICB9CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHdoaWxlIChwcm9jZXNzTm90aWZpY2F0aW9ucygmdGltZVRvUmV0cnlOcykpIHsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKHRpbWVUb1JldHJ5TnMpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworSW5wdXRCdWZmZXJNYW5hZ2VyOjpJbnB1dEJ1ZmZlck1hbmFnZXIoKQorICAgICAgOiBtTWFpblRocmVhZHsmSW5wdXRCdWZmZXJNYW5hZ2VyOjptYWluLCB0aGlzfSB7Cit9CisKK0lucHV0QnVmZmVyTWFuYWdlciYgSW5wdXRCdWZmZXJNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBzdGF0aWMgSW5wdXRCdWZmZXJNYW5hZ2VyIGluc3RhbmNle307CisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWM0NGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0U3VyZmFjZSIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKKy8vIERlcml2ZWQgY2xhc3Mgb2YgQzJJbnRlcmZhY2VIZWxwZXIKK2NsYXNzIElucHV0U3VyZmFjZTo6SW50ZXJmYWNlIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRW9zLCBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX0VPUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nKGZhbHNlKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Fb3MsIHZhbHVlKS5vbmVPZih7dHJ1ZSwgZmFsc2V9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRW9zU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEVvc1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJJbnB1dFN1cmZhY2VFb3NUdW5pbmc+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGVvcygpIGNvbnN0IHsgcmV0dXJuIG1Fb3MtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nPiBtRW9zOworfTsKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDb25maWd1cmFibGVDMkludGYKK2NsYXNzIElucHV0U3VyZmFjZTo6Q29uZmlndXJhYmxlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworcHVibGljOgorICAgIENvbmZpZ3VyYWJsZUludGYoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlOjpJbnRlcmZhY2U+ICZpbnRmLAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSkKKyAgICAgICAgOiBDb25maWd1cmFibGVDMkludGYoImlucHV0LXN1cmZhY2UiLCAwKSwKKyAgICAgICAgICBtSW50ZihpbnRmKSwKKyAgICAgICAgICBtU291cmNlKHNvdXJjZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkNvbmZpZ3VyYWJsZUludGYoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnkoe30sIGluZGljZXMsIG1heUJsb2NrLCBwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcocGFyYW1zLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgICAgICBpZiAobUludGYtPmVvcygpKSB7CisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0ciB8fCBzb3VyY2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHB1dCBzb21ldGhpbmcgaW4gfGZhaWx1cmVzfAorICAgICAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJlc2V0IGVvcz8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBtYXlCbG9jayk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U6OkludGVyZmFjZT4gbUludGY7CisgICAgd3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKK307CisKK1JldHVybjxzcDxJbnB1dFN1cmZhY2U6OkhHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiBJbnB1dFN1cmZhY2U6OmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIHsKKyAgICByZXR1cm4gbVByb2R1Y2VyOworfQorCitSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IElucHV0U3VyZmFjZTo6Z2V0Q29uZmlndXJhYmxlKCkgeworICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworfQorCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBpZiAoIXNpbmspIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXAgPSBDb21wb25lbnQ6OmZpbmRMb2NhbENvbXBvbmVudChzaW5rKTsKKyAgICBpZiAoY29tcCkgeworICAgICAgICBjb25uZWN0aW9uID0gbmV3IElucHV0U3VyZmFjZUNvbm5lY3Rpb24obVNvdXJjZSwgY29tcCwgbVN0b3JlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25uZWN0aW9uID0gbmV3IElucHV0U3VyZmFjZUNvbm5lY3Rpb24obVNvdXJjZSwgc2luaywgbVN0b3JlKTsKKyAgICB9CisgICAgaWYgKCFjb25uZWN0aW9uLT5pbml0KCkpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8gRGVyaXZlZCBtZXRob2RzIGZyb20gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcgorCisvLyBDb25zdHJ1Y3RvciBpcyBleGNsdXNpdmUgdG8gQ29tcG9uZW50U3RvcmUuCitJbnB1dFN1cmZhY2U6OklucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgcmVmbGVjdG9yLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpCisgICAgICA6IG1TdG9yZXtzdG9yZX0sCisgICAgICAgIG1Qcm9kdWNlcntwcm9kdWNlcn0sCisgICAgICAgIG1Tb3VyY2V7c291cmNlfSwKKyAgICAgICAgbUludGZ7c3RkOjptYWtlX3NoYXJlZDxJbnRlcmZhY2U+KHJlZmxlY3Rvcil9LAorICAgICAgICBtQ29uZmlndXJhYmxle25ldyBDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb25maWd1cmFibGVJbnRmPigKKyAgICAgICAgICAgICAgICAgICAgbUludGYsIHNvdXJjZSkpfSB7CisKKyAgICBtQ29uZmlndXJhYmxlLT5pbml0KHN0b3JlLmdldCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTMyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0U3VyZmFjZUNvbm5lY3Rpb24iCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKworY29uc3RleHByIGludDMyX3Qga0J1ZmZlckNvdW50ID0gMTY7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NsYXNzIEJ1ZmZlcjJEIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCdWZmZXIyRChDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrKSA6IEMyQnVmZmVyKHsgYmxvY2sgfSkgeworICAgIH0KK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDb21wb25lbnRXcmFwcGVyIGZvciB1c2Ugd2l0aAorLy8gR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKCkuCisvLworc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwgOiBwdWJsaWMgQ29tcG9uZW50V3JhcHBlciB7CisKKyAgICBJbXBsKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBsb2NhbENvbXApCisgICAgICAgICAgOiBtU291cmNle3NvdXJjZX0sIG1Mb2NhbENvbXB7bG9jYWxDb21wfSwgbVNpbmt7fSwgbUZyYW1lSW5kZXh7MH0geworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBsb2NhbENvbXAtPmludGYoKTsKKyAgICAgICAgbVNpbmtOYW1lID0gaW50ZiA/IGludGYtPmdldE5hbWUoKSA6ICIiOworICAgIH0KKworICAgIEltcGwoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKQorICAgICAgICAgIDogbVNvdXJjZXtzb3VyY2V9LCBtTG9jYWxDb21we30sIG1TaW5re3Npbmt9LCBtRnJhbWVJbmRleHswfSB7CisgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPSBzaW5rLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlJlbW90ZSBzaW5rIGlzIGRlYWQuIjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtU2lua0NvbmZpZ3VyYWJsZSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KTsKKyAgICAgICAgaWYgKCFtU2lua0NvbmZpZ3VyYWJsZSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVtb3RlIHNpbmsgaXMgbm90IGNvbmZpZ3VyYWJsZS4iOworICAgICAgICAgICAgbVNpbmtOYW1lID0gIiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBoaWRsX3N0cmluZyBuYW1lOworICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtU2lua0NvbmZpZ3VyYWJsZS0+Z2V0TmFtZSgKKyAgICAgICAgICAgICAgICBbJm5hbWVdKGNvbnN0IGhpZGxfc3RyaW5nJiBuKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVtb3RlIHNpbmsncyBjb25maWd1cmFibGUgaXMgZGVhZC4iOworICAgICAgICAgICAgbVNpbmtOYW1lID0gIiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVNpbmtOYW1lID0gbmFtZS5jX3N0cigpOworICAgIH0KKworICAgIHZpcnR1YWwgfkltcGwoKSB7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbVNvdXJjZS0+cmVsZWFzZSgpOworICAgIH0KKworICAgIGJvb2wgaW5pdCgpIHsKKyAgICAgICAgaWYgKG1Tb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPmluaXRDaGVjaygpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gR3JhcGhpY0J1ZmZlclNvdXJjZSBpbml0IGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzdGF0dXMgPSAiIDw8IGVyciA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIHNldHRpbmdzIHByb3Blcmx5IGZyb20gdGhlIGludGVyZmFjZQorICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQgaW5wdXRTaXplOworICAgICAgICBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCB1c2FnZTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJTdGF0dXMgPSBxdWVyeUZyb21TaW5rKHsgJmlucHV0U2l6ZSwgJnVzYWdlIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICBpZiAoYzJTdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBjYW5ub3QgcXVlcnkgaW5mb3JtYXRpb24gZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBjb21wb25lbnQgaW50ZXJmYWNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgYXNTdHJpbmcoYzJTdGF0dXMpIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHByb3BlciBjb2xvciBhc3BlY3QgJiBkYXRhc3BhY2UKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKworICAgICAgICAvLyBUT0RPOiB1c2UgdGhlIHVzYWdlIHJlYWQgZnJvbSBpbnRmCisgICAgICAgIC8vIHVpbnQzMl90IGdyYWxsb2NVc2FnZSA9CisgICAgICAgIC8vICAgICAgICAgQzJBbmRyb2lkTWVtb3J5VXNhZ2UoQzJNZW1vcnlVc2FnZSh1c2FnZS52YWx1ZSkpLgorICAgICAgICAvLyAgICAgICAgIGFzR3JhbGxvY1VzYWdlKCk7CisKKyAgICAgICAgdWludDMyX3QgZ3JhbGxvY1VzYWdlID0KKyAgICAgICAgICAgICAgICBtU2lua05hbWUuY29tcGFyZSgwLCAxMSwgImMyLmFuZHJvaWQuIikgPT0gMCA/CisgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIDoKKyAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+Y29uZmlndXJlKAorICAgICAgICAgICAgICAgIHRoaXMsIGRhdGFTcGFjZSwga0J1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgIGlucHV0U2l6ZS53aWR0aCwgaW5wdXRTaXplLmhlaWdodCwKKyAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gR0JTIGNvbmZpZ3VyZSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBlcnIgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtCdWZmZXJDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW1Tb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQ6IGZhaWxlZCB0byBwb3B1bGF0ZSBHQlMgc2xvdHMuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtU291cmNlLT5zdGFydCgpLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbXBsOjppbml0IC0tIEdCUyBmYWlsZWQgdG8gc3RhcnQuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtQWxsb2NhdG9yTXV0ZXgubG9jaygpOworICAgICAgICBjMl9zdGF0dXNfdCBjMmVyciA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgQzJBbGxvY2F0b3JTdG9yZTo6UExBVEZPUk1fU1RBUlQgKyAxLCAgLy8gR1JBTExPQworICAgICAgICAgICAgICAgICZtQWxsb2NhdG9yKTsKKyAgICAgICAgbUFsbG9jYXRvck11dGV4LnVubG9jaygpOworICAgICAgICBpZiAoYzJlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBmYWlsZWQgdG8gZmV0Y2ggZ3JhbGxvYyBhbGxvY2F0b3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBhc1N0cmluZyhjMmVycikgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZyb20gQ29tcG9uZW50V3JhcHBlcgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VibWl0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGludCBmZW5jZUZkKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW1wbDo6c3VibWl0QnVmZmVyIC0tIGJ1ZmZlcklkID0gIiA8PCBidWZmZXJJZCA8PCAiLiI7CisgICAgICAgIC8vIFRPRE86IFVzZSBmZCB0byBjb25zdHJ1Y3QgZmVuY2UKKyAgICAgICAgKHZvaWQpZmVuY2VGZDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIEMySGFuZGxlKiBoYW5kbGUgPSBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgICAgICAgICBidWZmZXItPmhhbmRsZSwKKyAgICAgICAgICAgICAgICBidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBidWZmZXItPmZvcm1hdCwgYnVmZmVyLT51c2FnZSwgYnVmZmVyLT5zdHJpZGUpOworICAgICAgICBtQWxsb2NhdG9yTXV0ZXgubG9jaygpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgbUFsbG9jYXRvck11dGV4LnVubG9jaygpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrID0KKyAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4LmZldGNoX2FkZCgKKyAgICAgICAgICAgICAgICAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyKAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcjJEKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwgOjpDMkZlbmNlKCkpKSwKKyAgICAgICAgICAgICAgICBbYnVmZmVySWQsIHNvdXJjZSA9IG1Tb3VyY2VdKEMyQnVmZmVyKiBwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpc291cmNlLT5vbklucHV0QnVmZmVyRW1wdGllZChidWZmZXJJZCwgLTEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBlcnIgPSBxdWV1ZVRvU2luaygmaXRlbXMpOworICAgICAgICByZXR1cm4gKGVyciA9PSBDMl9PSykgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRFb3MoaW50MzJfdCBidWZmZXJJZCkgb3ZlcnJpZGUgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkltcGw6OnN1Ym1pdEVvcyAtLSBidWZmZXJJZCA9ICIgPDwgYnVmZmVySWQgPDwgIi4iOworICAgICAgICAodm9pZClidWZmZXJJZDsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleC5mZXRjaF9hZGQoCisgICAgICAgICAgICAgICAgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBxdWV1ZVRvU2luaygmaXRlbXMpOworICAgICAgICByZXR1cm4gKGVyciA9PSBDMl9PSykgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZCgKKyAgICAgICAgICAgIGludDMyX3QgZGF0YVNwYWNlLCBpbnQzMl90IGFzcGVjdHMsIGludDMyX3QgcGl4ZWxGb3JtYXQpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZClkYXRhU3BhY2U7CisgICAgICAgICh2b2lkKWFzcGVjdHM7CisgICAgICAgICh2b2lkKXBpeGVsRm9ybWF0OworICAgIH0KKworICAgIC8vIENvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgZm9yIElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwuCisgICAgLy8KKyAgICAvLyBUaGlzIGNsYXNzIGlzIGRlY2xhcmVkIGFzIGFuIGlubmVyIGNsYXNzIHNvIHRoYXQgaXQgd2lsbCBoYXZlIGFjY2VzcyB0bworICAgIC8vIGFsbCBJbXBsJ3MgbWVtYmVycy4KKyAgICBzdHJ1Y3QgQ29uZmlndXJhYmxlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgICAgICBzcDxJbXBsPiBtQ29ubmVjdGlvbjsKKyAgICAgICAgQ29uZmlndXJhYmxlSW50Zihjb25zdCBzcDxJbXBsPiYgY29ubmVjdGlvbikKKyAgICAgICAgICAgICAgOiBDb25maWd1cmFibGVDMkludGZ7ImlucHV0LXN1cmZhY2UtY29ubmVjdGlvbiIsIDB9LAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ue2Nvbm5lY3Rpb259IHt9CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zCisgICAgICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGU7CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBxdWVyeUZyb21TaW5rKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSB7CisgICAgICAgIGlmIChtTG9jYWxDb21wKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBtTG9jYWxDb21wLT5pbnRmKCk7CisgICAgICAgICAgICBpZiAoaW50ZikgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnRmLT5xdWVyeV92YihzdGFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBhbiBpbnRlcmZhY2UuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0sobVNpbmspIDw8ICItLSBxdWVyeUZyb21TaW5rICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItLSBjb25uZWN0aW9uIGhhcyBubyBzaW5rLiI7CisgICAgICAgIENIRUNLKG1TaW5rQ29uZmlndXJhYmxlKSA8PCAiLS0gcXVlcnlGcm9tU2luayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLS0gc2luayBoYXMgbm8gY29uZmlndXJhYmxlLiI7CisKKyAgICAgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygKKyAgICAgICAgICAgICAgICBzdGFja1BhcmFtcy5zaXplKCkgKyBoZWFwUGFyYW1JbmRpY2VzLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBudW1JbmRpY2VzID0gMDsKKyAgICAgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgc3RhY2tQYXJhbSA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW0pIHsKKyAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tIG51bGwgc3RhY2sgcGFyYW0gZW5jb3VudGVyZWQuIjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YWNrUGFyYW0tPmluZGV4KCkpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBudW1TdGFja0luZGljZXMgPSBudW1JbmRpY2VzOworICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4JiBpbmRleCA6IGhlYXBQYXJhbUluZGljZXMpIHsKKyAgICAgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworICAgICAgICB9CisgICAgICAgIGluZGljZXMucmVzaXplKG51bUluZGljZXMpOworICAgICAgICBpZiAoaGVhcFBhcmFtcykgeworICAgICAgICAgICAgaGVhcFBhcmFtcy0+cmVzZXJ2ZShoZWFwUGFyYW1zLT5zaXplKCkgKyBudW1JbmRpY2VzKTsKKyAgICAgICAgfQorICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1TaW5rQ29uZmlndXJhYmxlLT5xdWVyeSgKKyAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJm51bVN0YWNrSW5kaWNlcywgJnN0YWNrUGFyYW1zLCBoZWFwUGFyYW1zXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBQYXJhbXMmIHApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgYXNTdHJpbmcoc3RhdHVzKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSBlcnJvciB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJwYXJzaW5nIHBhcmFtcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gcGFyYW1Qb2ludGVycy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHBhcmFtUG9pbnRlcnMuZW5kKCk7ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVN0YWNrSW5kaWNlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW51bVN0YWNrSW5kaWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBzdGFjayBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBzdGFja1BhcmFtcy5zaXplKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGFja1BhcmFtc1tpXTsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaSA8IHN0YWNrUGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVBvaW50ZXItPmluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIHNraXBwZWQgKGluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpIDw8ICIpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zW2krK10tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tQYXJhbXNbaSsrXS0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gdXBkYXRlIGZhaWxlZCAoaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1Qb2ludGVyLT5pbmRleCgpIDw8ICIpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBoZWFwIHBhcmFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYXBQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBzdGFjayBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVldWVUb1Npbmsoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICAgICAgaWYgKG1Mb2NhbENvbXApIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYWxDb21wLT5xdWV1ZV9uYihpdGVtcyk7CisgICAgICAgIH0KKworICAgICAgICBDSEVDSyhtU2luaykgPDwgIi0tIHF1ZXVlVG9TaW5rICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItLSBjb25uZWN0aW9uIGhhcyBubyBzaW5rLiI7CisKKyAgICAgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworICAgICAgICBpZiAoIW9iamNweSgmd29ya0J1bmRsZSwgKml0ZW1zLCBudWxscHRyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb1NpbmsgLS0gYmFkIGlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbVNpbmstPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb1NpbmsgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVldWVUb1NpbmsgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhc1N0cmluZyhzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Mb2NhbENvbXA7CisgICAgc3A8SUlucHV0U2luaz4gbVNpbms7CisgICAgc3A8SUNvbmZpZ3VyYWJsZT4gbVNpbmtDb25maWd1cmFibGU7CisgICAgc3RkOjpzdHJpbmcgbVNpbmtOYW1lOworCisgICAgLy8gTmVlZGVkIGZvciBDb21wb25lbnRXcmFwcGVyIGltcGxlbWVudGF0aW9uCisgICAgc3RkOjptdXRleCBtQWxsb2NhdG9yTXV0ZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GcmFtZUluZGV4OworCit9OworCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgOiBtSW1wbHtuZXcgSW1wbChzb3VyY2UsIGNvbXApfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbXBsOjpDb25maWd1cmFibGVJbnRmPihtSW1wbCkpfSB7CisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK0lucHV0U3VyZmFjZUNvbm5lY3Rpb246OklucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgOiBtSW1wbHtuZXcgSW1wbChzb3VyY2UsIHNpbmspfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbXBsOjpDb25maWd1cmFibGVJbnRmPihtSW1wbCkpfSB7CisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OmRpc2Nvbm5lY3QoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUltcGxNdXRleCk7CisgICAgbUltcGwgPSBudWxscHRyOworICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjp+SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpIHsKKyAgICBtSW1wbCA9IG51bGxwdHI7Cit9CisKK2Jvb2wgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6aW5pdCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW1wbE11dGV4KTsKKyAgICByZXR1cm4gbUltcGwtPmluaXQoKTsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpnZXRDb25maWd1cmFibGUoKSB7CisgICAgcmV0dXJuIG1Db25maWd1cmFibGU7Cit9CisKKy8vIENvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgZm9yIElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwKK2MyX3N0YXR1c190IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGw6OkNvbmZpZ3VyYWJsZUludGY6OmNvbmZpZygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAodm9pZClwYXJhbXM7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgKHZvaWQpZmFpbHVyZXM7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbXBsOjpDb25maWd1cmFibGVJbnRmOjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAodm9pZClpbmRpY2VzOworICAgICh2b2lkKW1heUJsb2NrOworICAgICh2b2lkKXBhcmFtczsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGw6OkNvbmZpZ3VyYWJsZUludGY6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgKHZvaWQpcGFyYW1zOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbDo6Q29uZmlndXJhYmxlSW50Zjo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgeworICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICh2b2lkKWZpZWxkczsKKyAgICAodm9pZCltYXlCbG9jazsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQ0MDEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lJbnB1dFNpbmsuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lCaW5kZXIuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQmluZGVyOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6d3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworc3RydWN0IENvbXBvbmVudCA6IHB1YmxpYyBJQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPENvbXBvbmVudD4geworICAgIENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICAgICAgICAgIElDbGllbnRNYW5hZ2VyPiYgY2xpZW50UG9vbE1hbmFnZXIpOworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgLy8gTWV0aG9kcyBmcm9tIElDb21wb25lbnQgZm9sbG93LgorICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcXVldWUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZHJhaW4oYm9vbCB3aXRoRW9zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICB1aW50NjRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjb25uZWN0VG9JbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLAorICAgICAgICAgICAgY29ubmVjdFRvSW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29ubmVjdFRvT214SW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgdWludDMyX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICBjcmVhdGVCbG9ja1Bvb2xfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZGVzdHJveUJsb2NrUG9vbCh1aW50NjRfdCBibG9ja1Bvb2xJZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc3RvcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gZ2V0SW50ZXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUlucHV0U2luaz4+IGFzSW5wdXRTaW5rKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBSZXR1cm5zIGEgQzJDb21wb25lbnQgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gc2luayBpZiB0aGUgc2luayBpcyBpbmRlZWQKKyAgICAvLyBhIGxvY2FsIGNvbXBvbmVudC4gUmV0dXJucyBudWxscHRyIG90aGVyd2lzZS4KKyAgICAvLworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBJbnB1dFN1cmZhY2U6OmNvbm5lY3QoKS4KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBmaW5kTG9jYWxDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luayk7CisKK3Byb3RlY3RlZDoKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3A8Q29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZXJmYWNlOworICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIKKyAgICAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVyOworCisgICAgc3RydWN0IFNpbms7CisgICAgc3RkOjptdXRleCBtU2lua011dGV4OworICAgIHNwPFNpbms+IG1TaW5rOworCisgICAgc3RkOjptdXRleCBtQmxvY2tQb29sc011dGV4OworICAgIC8vIFRoaXMgbWFwIGtlZXBzIEMyQmxvY2tQb29sIG9iamVjdHMgdGhhdCBhcmUgY3JlYXRlZCBieSBjcmVhdGVCbG9ja1Bvb2woKQorICAgIC8vIGFsaXZlLiBUaGVzZSBDMkJsb2NrUG9vbCBvYmplY3RzIGNhbiBiZSBkZWxldGVkIGJ5IGNhbGxpbmcKKyAgICAvLyBkZXN0cm95QmxvY2tQb29sKCksIHJlc2V0KCkgb3IgcmVsZWFzZSgpLCBvciBieSBkZXN0cm95aW5nIHRoZSBjb21wb25lbnQuCisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4+IG1CbG9ja1Bvb2xzOworCisgICAgdm9pZCBpbml0TGlzdGVuZXIoY29uc3Qgc3A8Q29tcG9uZW50PiYgc2VsZik7CisKKyAgICB2aXJ0dWFsIH5Db21wb25lbnQoKSBvdmVycmlkZTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKKyAgICBzdHJ1Y3QgTGlzdGVuZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRJbnRlcmZhY2UuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQyMzVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKK3N0cnVjdCBDb21wb25lbnRJbnRlcmZhY2UgOiBwdWJsaWMgSUNvbXBvbmVudEludGVyZmFjZSB7CisgICAgQ29tcG9uZW50SW50ZXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiYgaW50ZXJmYWNlLAorICAgICAgICAgICAgQ29tcG9uZW50U3RvcmUqIHN0b3JlKTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRlcmZhY2U7CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworICAgIGMyX3N0YXR1c190IG1Jbml0OworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODBjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRTVE9SRV9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlcjsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZSA6IHB1YmxpYyBJQ29tcG9uZW50U3RvcmUgeworICAgIENvbXBvbmVudFN0b3JlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworICAgIHZpcnR1YWwgfkNvbXBvbmVudFN0b3JlKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBDYWNoZWRDb25maWd1cmFibGU6OmluaXQoKSB0byB2YWxpZGF0ZQorICAgICAqIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIGMyX3N0YXR1c190IHZhbGlkYXRlU3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcyk7CisKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUuCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcG9vbCwKKyAgICAgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBjcmVhdGVJbnRlcmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGxpc3RDb21wb25lbnRzKGxpc3RDb21wb25lbnRzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjcmVhdGVJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICAgICAgZ2V0U3RydWN0RGVzY3JpcHRvcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDbGllbnRNYW5hZ2VyPj4gZ2V0UG9vbENsaWVudE1hbmFnZXIoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBCdWZmZXImIHNyYywKKyAgICAgICAgICAgIGNvbnN0IEJ1ZmZlciYgZHN0KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBEdW1wcyBpbmZvcm1hdGlvbiB3aGVuIGxzaGFsIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBkZWJ1ZygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworCisgICAgLy8gRG9lcyBib29ra2VlcGluZyBmb3IgYW4gaW50ZXJmYWNlIHRoYXQgaGFzIGJlZW4gbG9hZGVkLgorICAgIHZvaWQgb25JbnRlcmZhY2VMb2FkZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50Zik7CisKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gbVN0b3JlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUGFyYW1SZWZsZWN0b3I7CisKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpDb3JlSW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+PiBtU3RydWN0RGVzY3JpcHRvcnM7CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6Q29yZUluZGV4PiBtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9yczsKKyAgICBzdGQ6OnNldDxDMlN0cmluZz4gbUxvYWRlZEludGVyZmFjZXM7CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4OworCisgICAgLy8gQ29tcG9uZW50U3RvcmUga2VlcHMgdHJhY2sgb2YgbGl2ZSBDb21wb25lbnRzLgorCisgICAgc3RydWN0IENvbXBvbmVudFN0YXR1cyB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gYzJDb21wb25lbnQ7CisgICAgICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgYmlydGhUaW1lOworICAgIH07CisKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUNvbXBvbmVudFJvc3Rlck11dGV4OworICAgIHN0ZDo6bWFwPENvbXBvbmVudCosIENvbXBvbmVudFN0YXR1cz4gbUNvbXBvbmVudFJvc3RlcjsKKworICAgIC8vIENhbGxlZCB3aGVuZXZlciBDb21wb25lbnQgaXMgY3JlYXRlZC4KKyAgICB2b2lkIHJlcG9ydENvbXBvbmVudEJpcnRoKENvbXBvbmVudCogY29tcG9uZW50KTsKKyAgICAvLyBDYWxsZWQgb25seSBmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIENvbXBvbmVudC4KKyAgICB2b2lkIHJlcG9ydENvbXBvbmVudERlYXRoKENvbXBvbmVudCogY29tcG9uZW50KTsKKworICAgIGZyaWVuZCBDb21wb25lbnQ7CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBkdW1waW5nLgorCisgICAgc3RkOjpvc3RyZWFtJiBkdW1wKAorICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4mIGNvbXApOworCisgICAgc3RkOjpvc3RyZWFtJiBkdW1wKAorICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICBDb21wb25lbnRTdGF0dXMmIGNvbXBTdGF0dXMpOworCit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UU1RPUkVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOTUxODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRV9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworLyoqCisgKiBDb2RlYzIgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgbWF5IGhhdmUgZGlmZmVyZW50IHF1ZXJ5aW5nIGFuZCBjb25maWd1cmluZworICogZnVuY3Rpb25zLCBidXQgYWNyb3NzIHRoZSBUcmVibGUgYm91bmRhcnksIHRoZXkgc2hhcmUgdGhlIHNhbWUgSElETAorICogaW50ZXJmYWNlLCBJQ29uZmlndXJhYmxlLgorICoKKyAqIENvbmZpZ3VyYWJsZUMySW50ZiBpcyBhbiBhYnN0cmFjdCBjbGFzcyB0aGF0IGEgQ29kZWMyIG9iamVjdCBjYW4gaW1wbGVtZW50IHRvCisgKiBlYXNpbHkgZXhwb3NlIGFuIElDb25maWd1cmFibGUgaW5zdGFuY2UuIFNlZSBDYWNoZWRDb25maWd1cmFibGUgYmVsb3cuCisgKi8KK3N0cnVjdCBDb25maWd1cmFibGVDMkludGYgeworICAgIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHVpbnQzMl90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisgICAgLyoqIEMyQ29tcG9uZW50SW50ZXJmYWNlOjpxdWVyeV92YiBzYW5zIHN0YWNrIHBhcmFtcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zKSBjb25zdCA9IDA7CisgICAgLyoqIEMyQ29tcG9uZW50SW50ZXJmYWNlOjpjb25maWdfdmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+Q29uZmlndXJhYmxlQzJJbnRmKCkgPSBkZWZhdWx0OworCisgICAgQ29uZmlndXJhYmxlQzJJbnRmKGNvbnN0IEMyU3RyaW5nJiBuYW1lLCB1aW50MzJfdCBpZCkKKyAgICAgICAgICA6IG1OYW1le25hbWV9LCBtSWR7aWR9IHt9CisKK3Byb3RlY3RlZDoKKyAgICBDMlN0cmluZyBtTmFtZTsgLyogY2FjaGVkIGNvbXBvbmVudCBuYW1lICovCisgICAgdWludDMyX3QgbUlkOworfTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUNvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgdGhhdCBzdXBwb3J0cyBjYWNoaW5nIG9mCisgKiBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIGEgc3VwcGxpZWQgQ29tcG9uZW50U3RvcmUuCisgKgorICogQ2FjaGVkQ29uZmlndXJhYmxlIGVzc2VudGlhbGx5IGNvbnZlcnRzIGEgQ29uZmlndXJhYmxlQzJJbnRmIGludG8gSElETCdzCisgKiBJQ29uZmlndXJhYmxlLiBBIENvZGVjMiBvYmplY3QgZ2VuZXJhbGx5IGltcGxlbWVudHMgQ29uZmlndXJhYmxlQzJJbnRmIGFuZAorICogcGFzc2VzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB0aGUgY29uc3RydWN0b3Igb2YgQ2FjaGVkQ29uZmlndXJhYmxlLgorICoKKyAqIE5vdGUgdGhhdCBjYWNoaW5nIGhhcHBlbnMKKyAqLworc3RydWN0IENhY2hlZENvbmZpZ3VyYWJsZSA6IHB1YmxpYyBJQ29uZmlndXJhYmxlIHsKKyAgICBDYWNoZWRDb25maWd1cmFibGUoc3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYWJsZUMySW50Zj4mJiBpbnRmKTsKKworICAgIGMyX3N0YXR1c190IGluaXQoQ29tcG9uZW50U3RvcmUqIHN0b3JlKTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUKKworICAgIHZpcnR1YWwgUmV0dXJuPHVpbnQzMl90PiBnZXRJZCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0TmFtZShnZXROYW1lX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIHF1ZXJ5X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpblBhcmFtcywKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBjb25maWdfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICB1aW50MzJfdCBzdGFydCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgaW5GaWVsZHMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgLy8gQ29tbW9uIENvZGVjMi4wIGludGVyZmFjZSB3cmFwcGVyCisgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYWJsZUMySW50Zj4gbUludGY7CisKKyAgICAvLyBDYWNoZWQgc3VwcG9ydGVkIHBhcmFtcworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1TdXBwb3J0ZWRQYXJhbXM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09ORklHVVJBQkxFX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0QnVmZmVyTWFuYWdlci5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0QnVmZmVyTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ODU3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmgKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRfQlVGRkVSX01BTkFHRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKKy8qKgorICogSW5wdXRCdWZmZXJNYW5hZ2VyCisgKiA9PT09PT09PT09PT09PT09PT0KKyAqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIgcHJlc2VudHMgYSB3YXkgdG8gdHJhY2sgYW5kIHVudHJhY2sgaW5wdXQgYnVmZmVycyBpbiB0aGlzCisgKiAoY29kZWMpIHByb2Nlc3MgYW5kIHNlbmQgYSBub3RpZmljYXRpb24gdG8gYSBsaXN0ZW5lciwgcG9zc2libHkgaW4gYQorICogZGlmZmVyZW50IHByb2Nlc3MsIHdoZW4gYSB0cmFja2VkIGJ1ZmZlciBubyBsb25nZXIgaGFzIGFueSByZWZlcmVuY2VzIGluIHRoaXMKKyAqIHByb2Nlc3MuCisgKgorICogSW5wdXRCdWZmZXJNYW5hZ2VyIGhvbGRzIGEgY29sbGVjdGlvbiBvZiByZWNvcmRzIHJlcHJlc2VudGluZyB0cmFja2VkIGJ1ZmZlcnMKKyAqIGFuZCB0aGVpciBjYWxsYmFjayBsaXN0ZW5lcnMuIENvbmNlcHR1YWxseSwgb25lIHJlY29yZCBpcyBhIHRyaXBsZSAobGlzdGVuZXIsCisgKiBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgd2hlcmUKKyAqCisgKiAtIChmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgaXMgYSBwYWlyIG9mIGluZGljZXMgdXNlZCB0byBpZGVudGlmeSB0aGUgYnVmZmVyLgorICogLSBsaXN0ZW5lciBpcyBvZiB0eXBlIElDb21wb25lbnRMaXN0ZW5lci4gSXRzIG9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoKQorICogICBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgYXNzb2NpYXRlZCBidWZmZXIgZGllcy4gVGhlIGFyZ3VtZW50IG9mCisgKiAgIG9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoKSBpcyBhIGxpc3Qgb2YgSW5wdXRCdWZmZXIgb2JqZWN0cywgZWFjaCBvZiB3aGljaAorICogICBoYXMgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgorICoKKyAqICAgICB1aW50NjRfdCBmcmFtZUluZGV4CisgKiAgICAgdWludDMyX3QgYXJyYXlJbmRleAorICoKKyAqIFdoZW4gYSB0cmFja2VkIGJ1ZmZlciBhc3NvY2lhdGVkIHRvIHRoZSB0cmlwbGUgKGxpc3RlbmVyLCBmcmFtZUluZGV4LAorICogYnVmZmVySW5kZXgpIGdvZXMgb3V0IG9mIHNjb3BlLCBsaXN0ZW5lci0+b25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIHdpbGwgYmUKKyAqIGNhbGxlZCB3aXRoIGFuIElucHV0QnVmZmVyIG9iamVjdCB3aG9zZSBtZW1iZXJzIGFyZSBzZXQgYXMgZm9sbG93czoKKyAqCisgKiAgICAgaW5wdXRCdWZmZXIuZnJhbWVJbmRleCA9IGZyYW1lSW5kZXgKKyAqICAgICBpbnB1dEJ1ZmZlci5hcnJheUluZGV4ID0gYnVmZmVySW5kZXgKKyAqCisgKiBJUEMgT3B0aW1pemF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKgorICogU2luY2Ugb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIGlzIGFuIElQQyBjYWxsLCBJbnB1dEJ1ZmZlck1hbmFnZXIgdHJpZXMgbm90CisgKiB0byBjYWxsIGl0IHRvbyBvZnRlbi4gQW55IHR3byBjYWxscyB0byB0aGUgc2FtZSBsaXN0ZW5lciBhcmUgYXQgbGVhc3QKKyAqIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIG5hbm9zZWNvbmRzIGFwYXJ0LCB3aGVyZSBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOcyBpcworICogY29uZmlndXJhYmxlIHZpYSBjYWxsaW5nIHNldE5vdGlmaWNhdGlvbkludGVydmFsKCkuIFRoZSBkZWZhdWx0IHZhbHVlIG9mCisgKiBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOcyBpcyBrRGVmYXVsdE5vdGlmaWNhdGlvbkludGVybmFsTnMuCisgKgorICogUHVibGljIE1lbWJlciBGdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSW5wdXRCdWZmZXJNYW5hZ2VyIGlzIGEgc2luZ2xldG9uIGNsYXNzLiBJdHMgb25seSBpbnN0YW5jZSBpcyBhY2Nlc3NpYmxlIHZpYQorICogdGhlIGZvbGxvd2luZyBwdWJsaWMgZnVuY3Rpb25zOgorICoKKyAqIC0gcmVnaXN0ZXJGcmFtZURhdGEoY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgKiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkKKyAqCisgKiAtIHVucmVnaXN0ZXJGcmFtZURhdGEoY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KQorICoKKyAqIC0gdW5yZWdpc3RlckZyYW1lRGF0YShjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcikKKyAqCisgKiAtIHNldE5vdGlmaWNhdGlvbkludGVydmFsKG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcykKKyAqCisgKi8KKworc3RydWN0IElucHV0QnVmZmVyTWFuYWdlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHRpbWUgaW50ZXJ2YWwgYmV0d2VlbiAyIHN1YnNlcXVlbnQgSVBDcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga0RlZmF1bHROb3RpZmljYXRpb25JbnRlcnZhbE5zID0gMTAwMDAwMDsgLyogMW1zICovCisKKyAgICAvKioKKyAgICAgKiBUcmFjayBhbGwgYnVmZmVycyBpbiBhIEMyRnJhbWVEYXRhIG9iamVjdC4KKyAgICAgKgorICAgICAqIGlucHV0IChDMkZyYW1lRGF0YSkgaGFzIHRoZSBmb2xsb3dpbmcgdHdvIG1lbWJlcnMgdGhhdCBhcmUgb2YgaW50ZXJlc3Q6CisgICAgICoKKyAgICAgKiAgIEMyV29ya09yZGluYWwgICAgICAgICAgICAgICAgb3JkaW5hbAorICAgICAqICAgdmVjdG9yPHNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyLCBpbnB1dCkgd2lsbCByZWdpc3RlciBtdWx0aXBsZQorICAgICAqIHRyaXBsZXMgKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgd2hlcmUgZnJhbWVJbmRleCBpcyBlcXVhbCB0bworICAgICAqIGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCBhbmQgYnVmZmVySW5kZXggcnVucyB0aHJvdWdoIHRoZSBpbmRpY2VzIG9mCisgICAgICogaW5wdXQuYnVmZmVycyBzdWNoIHRoYXQgaW5wdXQuYnVmZmVyc1tidWZmZXJJbmRleF0gaXMgbm90IG51bGwuCisgICAgICoKKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBxdWV1ZSgpLgorICAgICAqCisgICAgICogXHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIG9mIGRlYXRoIG5vdGlmaWNhdGlvbnMuCisgICAgICogXHBhcmFtIGlucHV0IElucHV0IGZyYW1lIGRhdGEgd2hvc2UgaW5wdXQgYnVmZmVycyBhcmUgdG8gYmUgdHJhY2tlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCByZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKworICAgIC8qKgorICAgICAqIFVudHJhY2sgYWxsIGJ1ZmZlcnMgaW4gYSBDMkZyYW1lRGF0YSBvYmplY3QuCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHVucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KSB3aWxsIHVucmVnaXN0ZXIgYW5kIHJlbW92ZQorICAgICAqIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgYWxsIHRyaXBsZXMgKGwsIGZpLCBidWZmZXJJbmRleCkgc3VjaCB0aGF0CisgICAgICogbCA9IGxpc3RlbmVyIGFuZCBmaSA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC4KKyAgICAgKgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIG9uV29ya0RvbmUoKSBhbmQgZmx1c2goKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaXN0ZW5lciBQcmV2aW91c2x5IHJlZ2lzdGVyZWQgbGlzdGVuZXIuCisgICAgICogXHBhcmFtIGlucHV0IFByZXZpb3VzbHkgcmVnaXN0ZXJlZCBmcmFtZSBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisKKyAgICAvKioKKyAgICAgKiBVbnRyYWNrIGFsbCBidWZmZXJzIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBsaXN0ZW5lci4KKyAgICAgKgorICAgICAqIENhbGxpbmcgdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lcikgd2lsbCB1bnJlZ2lzdGVyIGFuZCByZW1vdmUKKyAgICAgKiBwZW5kaW5nIG5vdGlmaWNhdGlvbnMgZm9yIGFsbCB0cmlwbGVzIChsLCBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgc3VjaAorICAgICAqIHRoYXQgbCA9IGxpc3RlbmVyLgorICAgICAqCisgICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBjbGVhbnMgdXAgYWxsIGlucHV0IGJ1ZmZlcnMsCisgICAgICogaS5lLiwgd2hlbiByZXNldCgpLCByZWxlYXNlKCksIHN0b3AoKSBvciB+Q29tcG9uZW50KCkgaXMgY2FsbGVkLgorICAgICAqCisgICAgICogXHBhcmFtIGxpc3RlbmVyIFByZXZpb3VzbHkgcmVnaXN0ZXJlZCBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBub3RpZmljYXRpb24gaW50ZXJ2YWwuCisgICAgICoKKyAgICAgKiBccGFyYW0gbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyBOZXcgbm90aWZpY2F0aW9uIGludGVydmFsLCBpbiBuYW5vc2Vjb25kcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzZXROb3RpZmljYXRpb25JbnRlcnZhbChuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpOworCitwcml2YXRlOgorICAgIHZvaWQgX3JlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworICAgIHZvaWQgX3VucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisgICAgdm9pZCBfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICB2b2lkIF9zZXROb3RpZmljYXRpb25JbnRlcnZhbChuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpOworCisgICAgLy8gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRpZWQgdG8gQzJCdWZmZXIgb2JqZWN0cy4KKyAgICAvLworICAgIC8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHNJbnN0YW5jZSBpcyB0aGUgb25seSBpbnN0YW5jZSBvZiB0aGlzCisgICAgLy8gICAgICAgY2xhc3MuCisgICAgc3RhdGljIHZvaWQgb25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKTsKKyAgICB2b2lkIF9vbkJ1ZmZlckRlc3Ryb3llZChjb25zdCBDMkJ1ZmZlciogYnVmLCB2b2lkKiBhcmcpOworCisgICAgLy8gUGVyc2lzdGVudCBkYXRhIHRvIGJlIHBhc3NlZCBhcyAiYXJnIiBpbiBvbkJ1ZmZlckRlc3Ryb3llZCgpLgorICAgIC8vIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHRyaXBsZSAobGlzdGVuZXIsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBwbHVzIGEKKyAgICAvLyB3ZWFrIHBvaW50ZXIgdG8gdGhlIEMyQnVmZmVyIG9iamVjdC4KKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCB0aGUgImtleSIgaXMgYnVmZmVySW5kZXggYWNjb3JkaW5nIHRvIG9wZXJhdG9yPCgpLiBUaGlzIGlzCisgICAgLy8gZGVzaWduZWQgdG8gd29yayB3aXRoIFRyYWNrZWRCdWZmZXJzTWFwIGRlZmluZWQgYmVsb3cuCisgICAgc3RydWN0IFRyYWNrZWRCdWZmZXIgeworICAgICAgICB3cDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyOworICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgICAgICBzaXplX3QgYnVmZmVySW5kZXg7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgVHJhY2tlZEJ1ZmZlcihjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIpCisgICAgICAgICAgICAgIDogbGlzdGVuZXIobGlzdGVuZXIpLAorICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgoZnJhbWVJbmRleCksCisgICAgICAgICAgICAgICAgYnVmZmVySW5kZXgoYnVmZmVySW5kZXgpLAorICAgICAgICAgICAgICAgIGJ1ZmZlcihidWZmZXIpIHt9CisgICAgICAgIFRyYWNrZWRCdWZmZXIoY29uc3QgVHJhY2tlZEJ1ZmZlciYpID0gZGVmYXVsdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVHJhY2tlZEJ1ZmZlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXJJbmRleCA8IG90aGVyLmJ1ZmZlckluZGV4OworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIE1hcDogbGlzdGVuZXIgLT4gZnJhbWVJbmRleCAtPiBzZXQ8VHJhY2tlZEJ1ZmZlcj4uCisgICAgLy8gRXNzZW50aWFsbHksIHRoaXMgaXMgdXNlZCB0byBzdG9yZSB0cmlwbGVzIChsaXN0ZW5lciwgZnJhbWVJbmRleCwKKyAgICAvLyBidWZmZXJJbmRleCkgdGhhdCdzIHNlYXJjaGFibGUgYnkgbGlzdGVuZXIgYW5kIChsaXN0ZW5lciwgZnJhbWVJbmRleCkuCisgICAgLy8gSG93ZXZlciwgdGhlIHZhbHVlIG9mIHRoZSBpbm5lcm1vc3QgbWFwIGlzIFRyYWNrZWRCdWZmZXIsIHdoaWNoIGFsc28KKyAgICAvLyBjb250YWlucyBhbiBleHRyYSBjb3B5IG9mIGxpc3RlbmVyIGFuZCBmcmFtZUluZGV4LiBUaGlzIGlzIG5lZWRlZAorICAgIC8vIGJlY2F1c2Ugb25CdWZmZXJEZXN0cm95ZWQoKSBuZWVkcyB0byBrbm93IGxpc3RlbmVyIGFuZCBmcmFtZUluZGV4IHRvby4KKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHdwPElDb21wb25lbnRMaXN0ZW5lcj4sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+Pj4gVHJhY2tlZEJ1ZmZlcnNNYXA7CisKKyAgICAvLyBTdG9yYWdlIGZvciBwZW5kaW5nICh1bnNlbnQpIGRlYXRoIG5vdGlmaWNhdGlvbnMgZm9yIG9uZSBsaXN0ZW5lci4KKyAgICAvLyBFYWNoIHBhaXIgaW4gbWVtYmVyIG5hbWVkICJpbmRpY2VzIiBhcmUgKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBmcm9tCisgICAgLy8gdGhlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHRyaXBsZS4KKyAgICBzdHJ1Y3QgRGVhdGhOb3RpZmljYXRpb25zIHsKKworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lci4KKyAgICAgICAgLy8gY291bnQgbWF5IGJlIDAsIGluIHdoaWNoIGNhc2UgdGhlIERlYXRoTm90aWZpY2F0aW9ucyBvYmplY3Qgd2lsbAorICAgICAgICAvLyByZW1haW4gdmFsaWQgZm9yIG9ubHkgYSBzbWFsbCBwZXJpb2QgKHNwZWNpZmllZAorICAgICAgICAvLyBuYW5vc2Vjb25kcykuCisgICAgICAgIHNpemVfdCBjb3VudDsKKworICAgICAgICAvLyBUaGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBjYWxsYmFjayBvbiB0aGlzIGxpc3RlbmVyLiBUaGlzIGlzCisgICAgICAgIC8vIHVzZWQgdG8gZ3VhcmFudGVlIHRoYXQgY2FsbGJhY2tzIGRvIG5vdCBvY2N1ciB0b28gZnJlcXVlbnRseSwgYW5kCisgICAgICAgIC8vIGFsc28gdG8gdHJpZ2dlciBleHBpcmF0aW9uIG9mIGEgRGVhdGhOb3RpZmljYXRpb25zIG9iamVjdCB0aGF0IGhhcworICAgICAgICAvLyBjb3VudCA9IDAuCisgICAgICAgIG5zZWNzX3QgbGFzdFNlbnROczsKKworICAgICAgICAvLyBNYXA6IGZyYW1lSW5kZXggLT4gdmVjdG9yIG9mIGJ1ZmZlckluZGljZXMKKyAgICAgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSBhIGNvbGxlY3Rpb24gb2YgKGZyYW1kZUluZGV4LCBidWZmZXJJbmRleCkuCisgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnZlY3RvcjxzaXplX3Q+PiBpbmRpY2VzOworCisgICAgICAgIERlYXRoTm90aWZpY2F0aW9ucygKKyAgICAgICAgICAgICAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMgPSBrRGVmYXVsdE5vdGlmaWNhdGlvbkludGVydmFsTnMpCisgICAgICAgICAgICAgIDogY291bnQoMCksCisgICAgICAgICAgICAgICAgbGFzdFNlbnROcyhzeXN0ZW1UaW1lKCkgLSBub3RpZmljYXRpb25JbnRlcnZhbE5zKSwKKyAgICAgICAgICAgICAgICBpbmRpY2VzKCkge30KKyAgICB9OworCisgICAgLy8gVGhlIG1pbmltdW0gdGltZSBwZXJpb2QgYmV0d2VlbiBJUEMgY2FsbHMgdG8gbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgdGhlCisgICAgLy8gZGVzdHJ1Y3Rpb24gb2YgaW5wdXQgYnVmZmVycy4KKyAgICBzdGQ6OmF0b21pYzxuc2Vjc190PiBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOc3trRGVmYXVsdE5vdGlmaWNhdGlvbkludGVydmFsTnN9OworCisgICAgLy8gTXV0ZXggZm9yIHRoZSBtYW5hZ2VtZW50IG9mIGFsbCBpbnB1dCBidWZmZXJzLgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworCisgICAgLy8gVHJhY2tlZCBpbnB1dCBidWZmZXJzLgorICAgIFRyYWNrZWRCdWZmZXJzTWFwIG1UcmFja2VkQnVmZmVyc01hcDsKKworICAgIC8vIERlYXRoIG5vdGlmaWNhdGlvbnMgdG8gYmUgc2VudC4KKyAgICAvLworICAgIC8vIEEgRGVhdGhOb3RpZmljYXRpb25zIG9iamVjdCBpcyBhc3NvY2lhdGVkIHRvIGVhY2ggbGlzdGVuZXIuIEFuIGVudHJ5IGluCisgICAgLy8gdGhpcyBtYXAgd2lsbCBiZSByZW1vdmVkIGlmIGl0cyBhc3NvY2lhdGVkIERlYXRoTm90aWZpY2F0aW9ucyBoYXMgY291bnQgPQorICAgIC8vIDAgYW5kIGxhc3RTZW50TnMgPCBzeXN0ZW1UaW1lKCkgLSBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOcy4KKyAgICBzdGQ6Om1hcDx3cDxJQ29tcG9uZW50TGlzdGVuZXI+LCBEZWF0aE5vdGlmaWNhdGlvbnM+IG1EZWF0aE5vdGlmaWNhdGlvbnM7CisKKyAgICAvLyBDb25kaXRpb24gdmFyaWFibGUgc2lnbmFsZWQgd2hlbiBhbiBlbnRyeSBpcyBhZGRlZCB0byBtRGVhdGhOb3RpZmljYXRpb25zLgorICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1PbkJ1ZmZlckRlc3Ryb3llZDsKKworICAgIC8vIE5vdGlmeSB0aGUgY2xpZW50cyBhYm91dCBidWZmZXIgZGVzdHJ1Y3Rpb25zLgorICAgIC8vIFJldHVybiBmYWxzZSBpZiBhbGwgZGVzdHJ1Y3Rpb25zIGhhdmUgYmVlbiBub3RpZmllZC4KKyAgICAvLyBSZXR1cm4gdHJ1ZSBhbmQgc2V0IHRpbWVUb1JldHJ5IHRvIHRoZSBkdXJhdGlvbiB0byB3YWl0IGZvciBiZWZvcmUKKyAgICAvLyByZXRyeWluZyBpZiBzb21lIGRlc3RydWN0aW9ucyBoYXZlIG5vdCBiZWVuIG5vdGlmaWVkLgorICAgIGJvb2wgcHJvY2Vzc05vdGlmaWNhdGlvbnMobnNlY3NfdCogdGltZVRvUmV0cnlOcyk7CisKKyAgICAvLyBNYWluIGZ1bmN0aW9uIGZvciB0aGUgaW5wdXQgYnVmZmVyIG1hbmFnZXIgdGhyZWFkLgorICAgIHZvaWQgbWFpbigpOworCisgICAgLy8gVGhlIHRocmVhZCB0aGF0IG1hbmFnZXMgbm90aWZpY2F0aW9ucy4KKyAgICAvLworICAgIC8vIE5vdGU6IFRoaXMgdmFyaWFibGUgaXMgZGVjbGFyZWQgbGFzdCBzbyBpdHMgaW5pdGlhbGl6YXRpb24gd2lsbCBoYXBwZW4KKyAgICAvLyBhZnRlciBhbGwgb3RoZXIgbWVtYmVyIHZhcmlhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgc3RkOjp0aHJlYWQgbU1haW5UaHJlYWQ7CisKKyAgICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yLgorICAgIElucHV0QnVmZmVyTWFuYWdlcigpOworCisgICAgLy8gVGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICBzdGF0aWMgSW5wdXRCdWZmZXJNYW5hZ2VyJiBnZXRJbnN0YW5jZSgpOworCit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRfQlVGRkVSX01BTkFHRVJfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4MmMxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U2luay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lJbnB1dFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IElucHV0U3VyZmFjZSA6IHB1YmxpYyBJSW5wdXRTdXJmYWNlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjoKKyAgICAgICAgICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UgR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiBnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgICAgIGNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisKKyAgICBjbGFzcyBJbnRlcmZhY2U7CisgICAgY2xhc3MgQ29uZmlndXJhYmxlSW50ZjsKKworICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGVyZmFjZT4gbUludGY7CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworCisgICAgSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIHJlZmxlY3RvciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBiYXNlLAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBmcmllbmQgc3RydWN0IENvbXBvbmVudFN0b3JlOworCit9OworCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4YjZiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRUNPTk5FQ1RJT05fSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRUNPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U7CisKKy8vIEFuIElucHV0U3VyZmFjZUNvbm5lY3Rpb24gY29ubmVjdHMgYW4gSW5wdXRTdXJmYWNlIHRvIGEgc2luaywgd2hpY2ggbWF5IGJlIGFuCisvLyBJSW5wdXRTaW5rIG9yIGEgbG9jYWwgQzJDb21wb25lbnQuIFRoaXMgY2FuIGJlIHNwZWNpZmllZCBieSBjaG9vc2luZyB0aGUKKy8vIGNvcnJlc3BvbmRpbmcgY29uc3RydWN0b3IuIFRoZSByZWFzb24gZm9yIGRpc3Rpbmd1aXNoaW5nIHRoZXNlIHR3byBjYXNlcyBpcworLy8gdGhhdCB3aGVuIGFuIElucHV0U3VyZmFjZUNvbm5lY3Rpb24gbGl2ZXMgaW4gdGhlIHNhbWUgcHJvY2VzcyBhcyB0aGUKKy8vIGNvbXBvbmVudCB0aGF0IHByb2Nlc3NlcyB0aGUgYnVmZmVycywgZGF0YSBwYXJjZWxpbmcgaXMgbm90IG5lZWRlZC4KK3N0cnVjdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uIDogcHVibGljIElJbnB1dFN1cmZhY2VDb25uZWN0aW9uIHsKKworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZGlzY29ubmVjdCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmssCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKTsKKworICAgIGJvb2wgaW5pdCgpOworCisgICAgZnJpZW5kIHN0cnVjdCBJbnB1dFN1cmZhY2U7CisKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKCkgPSBkZWxldGU7CisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihjb25zdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uJikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiYpID0gZGVsZXRlOworCisgICAgc3RydWN0IEltcGw7CisKKyAgICBzdGQ6Om11dGV4IG1JbXBsTXV0ZXg7CisgICAgc3A8SW1wbD4gbUltcGw7CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworCisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRUNPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL3R5cGVzLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWYzYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL3R5cGVzLmgKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfVFlQRVNfSAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWJhc2UuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICBDb25uZWN0aW9uSWQ7Cit1c2luZyA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKy8vIFR5cGVzIG9mIG1ldGFkYXRhIGZvciBCbG9ja3MuCitzdHJ1Y3QgQzJIaWRsX1JhbmdlIHsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3QgbGVuZ3RoOyAvLyBEbyBub3QgdXNlICJzaXplIiBiZWNhdXNlIHRoZSBuYW1lIGNvbGxpZGVzIHdpdGggQzJJbmZvOjpzaXplKCkuCit9OwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJIaWRsX1JhbmdlLCAwPiBDMkhpZGxfUmFuZ2VJbmZvOworCitzdHJ1Y3QgQzJIaWRsX1JlY3QgeworICAgIHVpbnQzMl90IGxlZnQ7CisgICAgdWludDMyX3QgdG9wOworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkhpZGxfUmVjdCwgMT4gQzJIaWRsX1JlY3RJbmZvOworCisvLyBNYWtlIGFzU3RyaW5nKCkgYW5kIG9wZXJhdG9yPDwgd29yayB3aXRoIFN0YXR1cyBhcyB3ZWxsIGFzIGMyX3N0YXR1c190LgorQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKFN0YXR1cyk7CisKKy8qKgorICogQWxsIG9iamNweSgpIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICogY29udmVyc2lvbiBzdWNjZWVkcyBvciBub3QuCisgKi8KKworLy8gQzJTZXR0aW5nUmVzdWx0IC0+IFNldHRpbmdSZXN1bHQKK2Jvb2wgb2JqY3B5KAorICAgICAgICBTZXR0aW5nUmVzdWx0KiBkLAorICAgICAgICBjb25zdCBDMlNldHRpbmdSZXN1bHQmIHMpOworCisvLyBTZXR0aW5nUmVzdWx0IC0+IHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+Citib29sIG9iamNweSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4qIGQsCisgICAgICAgIGNvbnN0IFNldHRpbmdSZXN1bHQmIHMpOworCisvLyBDMlBhcmFtRGVzY3JpcHRvciAtPiBQYXJhbURlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KAorICAgICAgICBQYXJhbURlc2NyaXB0b3IqIGQsCisgICAgICAgIGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yJiBzKTsKKworLy8gUGFyYW1EZXNjcmlwdG9yIC0+IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+KiBkLAorICAgICAgICBjb25zdCBQYXJhbURlc2NyaXB0b3ImIHMpOworCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYm9vbCBvYmpjcHkoCisgICAgICAgIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgcyk7CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKTsKKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5LCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0IC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYm9vbCBvYmpjcHkoCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSogZCwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgc3EsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQmIHNyKTsKKworLy8gQzJDb21wb25lbnQ6OlRyYWl0cyAtPiBDb21wb25lbnRUcmFpdHMKK2Jvb2wgb2JqY3B5KAorICAgICAgICBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyogZCwKKyAgICAgICAgY29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cyYgcyk7CisKKy8vIENvbXBvbmVudFRyYWl0cyAtPiBDMkNvbXBvbmVudDo6VHJhaXRzCitib29sIG9iamNweSgKKyAgICAgICAgQzJDb21wb25lbnQ6OlRyYWl0cyogZCwKKyAgICAgICAgY29uc3QgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMmIHMpOworCisvLyBDMlN0cnVjdERlc2NyaXB0b3IgLT4gU3RydWN0RGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoCisgICAgICAgIFN0cnVjdERlc2NyaXB0b3IqIGQsCisgICAgICAgIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciYgcyk7CisKKy8vIFN0cnVjdERlc2NyaXB0b3IgLT4gQzJTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFN0cnVjdERlc2NyaXB0b3ImIHMpOworCisvLyBBYnN0cmFjdCBjbGFzcyB0byBiZSB1c2VkIGluCisvLyBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlKS4KK3N0cnVjdCBCdWZmZXJQb29sU2VuZGVyIHsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBSZXN1bHRTdGF0dXM7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIEJ1ZmZlclN0YXR1c01lc3NhZ2U7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6CisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSBCdWZmZXJQb29sRGF0YTsKKworICAgIC8qKgorICAgICAqIFNlbmQgYnBEYXRhIGFuZCByZXR1cm4gQnVmZmVyU3RhdHVzTWVzc2FnZSB0aGF0IGNhbiBiZSBzdXBwbGllZCB0bworICAgICAqIElDbGllbnRNYW5hZ2VyOjpyZWNlaXZlKCkgaW4gdGhlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZnVuY3Rpb24KKyAgICAgKiBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gYnBEYXRhIEJ1ZmZlclBvb2xEYXRhIGlkZW50aWZ5aW5nIHRoZSBidWZmZXIgdG8gc2VuZC4KKyAgICAgKiBccGFyYW1bb3V0XSBicE1lc3NhZ2UgQnVmZmVyU3RhdHVzTWVzc2FnZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEluZm9ybWF0aW9uCisgICAgICogICAgaW5zaWRlIFxwIGJwTWVzc2FnZSBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBieSBzb21lCisgICAgICogICAgb3RoZXIgbWVhbnMgc28gaXQgY2FuIGNhbGwgcmVjZWl2ZSgpIHByb3Blcmx5LgorICAgICAqIFxyZXR1cm4gUmVzdWx0U3RhdHVzIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc3VjY2VzcyBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgIChTZWUgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBSZXN1bHRTdGF0dXMgaW4KKyAgICAgKiAgICBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3R5cGVzLmhhbC4pCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgc2VuZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgPSAwOworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbFNlbmRlcigpID0gZGVmYXVsdDsKK307CisKKy8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQnVmZmVyUG9vbFNlbmRlci4KKy8vCisvLyBUbyB1c2UgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIsIHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2aW5nCisvLyBwcm9jZXNzIG11c3QgYmUgc2V0IGJlZm9yZSBzZW5kKCkgY2FuIG9wZXJhdGUuIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyIHdpbGwKKy8vIGhvbGQgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBhbmQgdXNlIGl0IHRvIGNhbGwKKy8vIElDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcigpIHRvIGVzdGFibGlzaCB0aGUgYnVmZmVycG9vbCBjb25uZWN0aW9uIHdoZW4KKy8vIHNlbmQoKSBpcyBjYWxsZWQuCitzdHJ1Y3QgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIgOiBCdWZmZXJQb29sU2VuZGVyIHsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgICAgICBDbGllbnRNYW5hZ2VyIENsaWVudE1hbmFnZXI7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICBJQ2xpZW50TWFuYWdlciBJQ2xpZW50TWFuYWdlcjsKKworICAgIC8vIFNldCB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmluZyBwcm9jZXNzIGFuZCB0aGUgcmVmcmVzaAorICAgIC8vIGludGVydmFsIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaW50ZXJ2YWwgaXMgNC41IHNlY29uZHMsIHdoaWNoCisgICAgLy8gaXMgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgYnVmZmVycG9vbCB3aWxsIGtlZXAgYW4KKyAgICAvLyBpbmFjdGl2ZSBjb25uZWN0aW9uIGZvci4KKyAgICBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCA9IDQ1MDBtcyk7CisKKyAgICAvLyBTZXQgdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIG9mIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBhbmQgdGhlIHJlZnJlc2gKKyAgICAvLyBpbnRlcnZhbCBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoZSBkZWZhdWx0IGludGVydmFsIGlzIDQuNSBzZWNvbmRzLCB3aGljaAorICAgIC8vIGlzIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIGJ1ZmZlcnBvb2wgd2lsbCBrZWVwIGFuCisgICAgLy8gaW5hY3RpdmUgY29ubmVjdGlvbiBmb3IuCisgICAgdm9pZCBzZXRSZWNlaXZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsID0gNDUwMG1zKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIEJ1ZmZlclBvb2xTZW5kZXI6OnNlbmQoKS4gc2VuZCgpIHdpbGwgZXN0YWJsaXNoIGEKKyAgICAvLyBidWZmZXJwb29sIGNvbm5lY3Rpb24gaWYgbmVlZGVkLCB0aGVuIHNlbmQgdGhlIGJ1ZmZlcnBvb2wgZGF0YSBvdmVyIHRvCisgICAgLy8gdGhlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIHNlbmQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+JiBicERhdGEsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlKiBicE1lc3NhZ2UpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHNwPENsaWVudE1hbmFnZXI+IG1TZW5kZXJNYW5hZ2VyOworICAgIHNwPElDbGllbnRNYW5hZ2VyPiBtUmVjZWl2ZXJNYW5hZ2VyOworICAgIGludDY0X3QgbVJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgIGludDY0X3QgbVNvdXJjZUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG1MYXN0U2VudDsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBtUmVmcmVzaEludGVydmFsOworfTsKKworLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlCisvLyBOb3RlOiBJZiBidWZmZXJwb29sIHdpbGwgYmUgdXNlZCwgYnBTZW5kZXIgbXVzdCBub3QgYmUgbnVsbC4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBXb3JrQnVuZGxlKiBkLAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBicFNlbmRlciA9IG51bGxwdHIpOworCisvLyBXb3JrQnVuZGxlIC0+IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBkLAorICAgICAgICBjb25zdCBXb3JrQnVuZGxlJiBzKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgcmV0dXJucyBDMlBhcmFtIHBvaW50ZXJzIHRvIGl0cyBwYXJhbXMuIFRoZSBwb2ludGVycworICogcG9pbnQgdG8gbG9jYXRpb25zIGluc2lkZSB0aGUgdW5kZXJseWluZyBidWZmZXIgb2YgXHAgYmxvYi4gSWYgXHAgYmxvYiBpcworICogZGVzdHJveWVkLCB0aGUgcG9pbnRlcnMgYmVjb21lIGludmFsaWQuCisgKgorICogXHBhcmFtW291dF0gcGFyYW1zIHRhcmdldCB2ZWN0b3Igb2YgQzJQYXJhbSBwb2ludGVycworICogXHBhcmFtW2luXSBibG9iIHBhcmFtZXRlciBibG9iIHRvIHBhcnNlCisgKiBccmV0dmFsIHRydWUgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkCisgKiBccmV0dmFsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIHBhcnNlUGFyYW1zQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICpwYXJhbXMsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZibG9iKTsKKworLyoqCisgKiBDb25jYXRlbmF0ZXMgYSBsaXN0IG9mIEMyUGFyYW1zIGludG8gYSBwYXJhbXMgYmxvYi4KKyAqCisgKiBccGFyYW1bb3V0XSBibG9iIHRhcmdldCBibG9iCisgKiBccGFyYW1baW5dIHBhcmFtcyBwYXJhbWV0ZXJzIHRvIGNvbmNhdGVuYXRlCisgKiBccmV0dmFsIHRydWUgaWYgdGhlIGJsb2Igd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKiBccmV0dmFsIGZhbHNlIGlmIHRoZSBibG9iIHdhcyBub3Qgc3VjY2Vzc2Z1bCAodGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlCisgKiAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3QgY29uc3QpCisgKi8KK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zKTsKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcyk7Citib29sIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gJnBhcmFtcyk7Citib29sIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiAmcGFyYW1zKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgY3JlYXRlIGEgdmVjdG9yIG9mIEMyUGFyYW1zIHdob3NlIG1lbWJlcnMgYXJlIGNvcGllcworICogb2YgdGhlIHBhcmFtcyBpbiB0aGUgYmxvYi4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGhlIHJlc3VsdGluZyB2ZWN0b3IKKyAqIFxwYXJhbVtpbl0gYmxvYiBwYXJhbWV0ZXIgYmxvYiB0byBwYXJzZQorICogXHJldHZhbCB0cnVlIGlmIHRoZSBmdWxsIGJsb2Igd2FzIHBhcnNlZCBhbmQgcGFyYW1zIHdhcyBjb25zdHJ1Y3RlZAorICogXHJldHZhbCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCBjb3B5UGFyYW1zRnJvbUJsb2IoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpOworYm9vbCBjb3B5UGFyYW1zRnJvbUJsb2IoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgYXBwbGllcyB1cGRhdGVzIHRvIHBhcmFtcy4KKyAqCisgKiBccGFyYW1baW4sb3V0XSBwYXJhbXMgcGFyYW1zIHRvIGJlIHVwZGF0ZWQKKyAqIFxwYXJhbVtpbl0gYmxvYiBwYXJhbWV0ZXIgYmxvYiBjb250YWluaW5nIHVwZGF0ZXMKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQgYW5kIHBhcmFtcyB3YXMgdXBkYXRlZAorICogXHJldHZhbCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCB1cGRhdGVQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBwYXJhbXMsCisgICAgICAgIGNvbnN0IFBhcmFtcyYgYmxvYik7CisKKy8qKgorICogQ29udmVydHMgYSBCdWZmZXJQb29sIHN0YXR1cyB2YWx1ZSB0byBjMl9zdGF0dXNfdC4KKyAqIFxwYXJhbSBCdWZmZXJQb29sIHN0YXR1cworICogXHJldHVybiBDb3JyZXNwb25kaW5nIGMyX3N0YXR1c190CisgKi8KK2MyX3N0YXR1c190IHRvQzJTdGF0dXMoOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICBSZXN1bHRTdGF0dXMgcnMpOworCisvLyBCdWZmZXJRdWV1ZS1CYXNlZCBCbG9jayBPcGVyYXRpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIENyZWF0ZSBhIEdyYXBoaWNCdWZmZXIgb2JqZWN0IGZyb20gYSBncmFwaGljIGJsb2NrIGFuZCBhdHRhY2ggaXQgdG8gYW4KKy8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXIuCitzdGF0dXNfdCBhdHRhY2hUb0J1ZmZlclF1ZXVlKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KTsKKworLy8gUmV0dXJuIGZhbHNlIGlmIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbC4KKy8vIE90aGVyd2lzZSwgZXh0cmFjdCBnZW5lcmF0aW9uLCBicUlkIGFuZCBicVNsb3QgYW5kIHJldHVybiB0cnVlLgorYm9vbCBnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KTsKKworLy8gRGlzYXNzb2NpYXRlIHRoZSBnaXZlbiBibG9jayB3aXRoIGl0cyBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlIHNvIHRoYXQKKy8vIGNhbmNlbEJ1ZmZlcigpIHdpbGwgbm90IGJlIGNhbGxlZCB3aGVuIHRoZSBibG9jayBpcyBkZXN0cm95ZWQuIElmIHRoZSBibG9jaworLy8gZG9lcyBub3QgaGF2ZSBhIGRlc2lnbmF0ZWQgYnVmZmVycXVldWUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLgorLy8gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRydWUuCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGF0dGFjaEJ1ZmZlcigpIG9yIHF1ZXVlQnVmZmVyKCkgaXMKKy8vIGNhbGxlZCBtYW51YWxseS4KK2Jvb2wgeWllbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKTsKKworLy8gQ2FsbCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2soKSBvbiBibG9ja3MgaW4gdGhlIGdpdmVuIHdvcmtMaXN0LiBwcm9jZXNzSW5wdXQKKy8vIGRldGVybWluZXMgd2hldGhlciBpbnB1dCBibG9ja3MgYXJlIHlpZWxkZWQuIHByb2Nlc3NPdXRwdXQgd29ya3Mgc2ltaWxhcmx5IG9uCisvLyBvdXRwdXQgYmxvY2tzLiAoVGhlIGRlZmF1bHQgdmFsdWUgb2YgcHJvY2Vzc0lucHV0IGlzIGZhbHNlIHdoaWxlIHRoZSBkZWZhdWx0CisvLyB2YWx1ZSBvZiBwcm9jZXNzT3V0cHV0IGlzIHRydWUuIFRoaXMgaW1wbGllcyB0aGF0IGluIG1vc3QgY2FzZXMsIG9ubHkgb3V0cHV0CisvLyBidWZmZXJzIGNvbnRhaW4gYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzLikKKy8vCisvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgV29ya0J1bmRsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKKy8vIHNlbnQgb3ZlciB0aGUgVHJlYmxlIGJvdW5kYXJ5IHRvIGFub3RoZXIgcHJvY2Vzcy4KK3ZvaWQgeWllbGRCdWZmZXJRdWV1ZUJsb2Nrcyhjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2Nlc3NJbnB1dCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc091dHB1dCA9IHRydWUpOworCisvLyBBc3NpZ24gdGhlIGdpdmVuIGJsb2NrIHRvIGEgYnVmZmVycXVldWUgc28gdGhhdCB3aGVuIHRoZSBibG9jayBpcyBkZXN0cm95ZWQsCisvLyBjYW5jZWxCdWZmZXIoKSB3aWxsIGJlIGNhbGxlZC4KKy8vCisvLyBJZiB0aGUgYmxvY2sgZG9lcyBub3QgY29tZSBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLCB0aGlzIGZ1bmN0aW9uCisvLyByZXR1cm5zIGZhbHNlLgorLy8KKy8vIElmIHRoZSBibG9jayBhbHJlYWR5IGhhcyBhIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBvbmUsCisvLyB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlLgorLy8KKy8vIElmIHRoZSBibG9jayBhbHJlYWR5IGhhcyBhIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUKKy8vIGdpdmVuIG9uZSwgdGhlIGJsb2NrIHdpbGwgYmUgcmVhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gYnVmZmVycXVldWUuIFRoaXMKKy8vIHdpbGwgY2FsbCBhdHRhY2hCdWZmZXIoKSBvbiB0aGUgZ2l2ZW4gaWdicC4gVGhlIGZ1bmN0aW9uIHRoZW4gcmV0dXJucyB0cnVlIG9uCisvLyBzdWNjZXNzIG9yIGZhbHNlIG9uIGFueSBmYWlsdXJlIGR1cmluZyB0aGUgb3BlcmF0aW9uLgorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBkZXRhY2hCdWZmZXIoKSBvciBkZXF1ZXVlQnVmZmVyKCkKKy8vIGlzIGNhbGxlZCBtYW51YWxseS4KK2Jvb2wgaG9sZEJ1ZmZlclF1ZXVlQmxvY2soY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uKTsKKworLy8gQ2FsbCBob2xkQnVmZmVyUXVldWVCbG9jaygpIG9uIGlucHV0IG9yIG91dHB1dCBibG9ja3MgaW4gdGhlIGdpdmVuIHdvcmtMaXN0LgorLy8gU2luY2UgdGhlIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBjYW4gYmUKKy8vIGRpZmZlcmVudCwgdGhpcyBmdW5jdGlvbiB0YWtlcyBmb3JJbnB1dCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4KKy8vIGJ1ZmZlcnF1ZXVlIGlzIGZvciBpbnB1dCBidWZmZXJzIG9yIG91dHB1dCBidWZmZXJzLiAoVGhlIGRlZmF1bHQgdmFsdWUgb2YKKy8vIGZvcklucHV0IGlzIGZhbHNlLikKKy8vCisvLyBJbiB0aGUgKHJhcmUpIGNhc2UgdGhhdCBib3RoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgYnVmZmVycXVldWUtYmFzZWQsCisvLyB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHR3aWNlLCBvbmNlIGZvciB0aGUgaW5wdXQgYnVmZmVycyBhbmQgb25jZSBmb3IKKy8vIHRoZSBvdXRwdXQgYnVmZmVycy4KKy8vCisvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgV29ya0J1bmRsZSBoYXMgYmVlbiByZWNlaXZlZCBmcm9tCisvLyBhbm90aGVyIHByb2Nlc3MuCit2b2lkIGhvbGRCdWZmZXJRdWV1ZUJsb2Nrcyhjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcklucHV0ID0gZmFsc2UpOworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzYmNiNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAKQEAgLTAsMCArMSwxOTQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi10eXBlcyIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorI2luY2x1ZGUgPHV0aWwvQzJQYXJhbVV0aWxzLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6QnVmZmVyU3RhdHVzTWVzc2FnZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICBDbGllbnRNYW5hZ2VyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgVHJhbnNhY3Rpb25JZDsKK3VzaW5nIDo6YW5kcm9pZDo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKK2NvbnN0IGNoYXIqIGFzU3RyaW5nKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGNoYXIqIGRlZikgeworICAgIHJldHVybiBhc1N0cmluZyhzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdHVzKSwgZGVmKTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bUNsYXNzPgordHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RW51bUNsYXNzPjo6dHlwZSB1bmRlcmx5aW5nX3ZhbHVlKAorICAgICAgICBFbnVtQ2xhc3MgeCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFbnVtQ2xhc3M+Ojp0eXBlPih4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbW1vbiwgdHlwZW5hbWUgRHN0VmVjdG9yLCB0eXBlbmFtZSBTcmNWZWN0b3I+Cit2b2lkIGNvcHlWZWN0b3IoRHN0VmVjdG9yKiBkLCBjb25zdCBTcmNWZWN0b3ImIHMpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDb21tb24pID09IHNpemVvZihkZWNsdHlwZSgoKmQpWzBdKSksCisgICAgICAgICAgICAiRHN0VmVjdG9yJ3MgY29tcG9uZW50IHNpemUgZG9lcyBub3QgbWF0Y2ggQ29tbW9uIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQ29tbW9uKSA9PSBzaXplb2YoZGVjbHR5cGUoc1swXSkpLAorICAgICAgICAgICAgIlNyY1ZlY3RvcidzIGNvbXBvbmVudCBzaXplIGRvZXMgbm90IG1hdGNoIENvbW1vbiIpOworICAgIGQtPnJlc2l6ZShzLnNpemUoKSk7CisgICAgc3RkOjpjb3B5KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDb21tb24qPigmc1swXSksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENvbW1vbio+KCZzWzBdICsgcy5zaXplKCkpLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDb21tb24qPigmKCpkKVswXSkpOworfQorCisvLyBDMlBhcmFtRmllbGQgLT4gUGFyYW1GaWVsZAorYm9vbCBvYmpjcHkoUGFyYW1GaWVsZCAqZCwgY29uc3QgQzJQYXJhbUZpZWxkICZzKSB7CisgICAgZC0+aW5kZXggPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihfQzJQYXJhbUluc3BlY3Rvcjo6R2V0SW5kZXgocykpOworICAgIGQtPmZpZWxkSWQub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQocykpOworICAgIGQtPmZpZWxkSWQuc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShzKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0cnVjdCBDMlBhcmFtRmllbGRCdWlsZGVyIDogcHVibGljIEMyUGFyYW1GaWVsZCB7CisgICAgQzJQYXJhbUZpZWxkQnVpbGRlcigpIDogQzJQYXJhbUZpZWxkKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQYXJhbTo6SW5kZXg+KHN0YXRpY19jYXN0PHVpbnQzMl90PigwKSksIDAsIDApIHsKKyAgICB9CisgICAgLy8gUGFyYW1GaWVsZCAtPiBDMlBhcmFtRmllbGQKKyAgICBDMlBhcmFtRmllbGRCdWlsZGVyKGNvbnN0IFBhcmFtRmllbGQmIHMpIDogQzJQYXJhbUZpZWxkKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQYXJhbTo6SW5kZXg+KHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmluZGV4KSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5maWVsZElkLm9mZnNldCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5maWVsZElkLnNpemUpKSB7CisgICAgfQorfTsKKworLy8gQzJXb3JrT3JkaW5hbFN0cnVjdCAtPiBXb3JrT3JkaW5hbAorYm9vbCBvYmpjcHkoV29ya09yZGluYWwgKmQsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJnMpIHsKKyAgICBkLT5mcmFtZUluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBkLT50aW1lc3RhbXBVcyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLnRpbWVzdGFtcC5wZWVrdSgpKTsKKyAgICBkLT5jdXN0b21PcmRpbmFsID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMuY3VzdG9tT3JkaW5hbC5wZWVrdSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gV29ya09yZGluYWwgLT4gQzJXb3JrT3JkaW5hbFN0cnVjdAorYm9vbCBvYmpjcHkoQzJXb3JrT3JkaW5hbFN0cnVjdCAqZCwgY29uc3QgV29ya09yZGluYWwgJnMpIHsKKyAgICBkLT5mcmFtZUluZGV4ID0gYzJfY250cjY0X3Qocy5mcmFtZUluZGV4KTsKKyAgICBkLT50aW1lc3RhbXAgPSBjMl9jbnRyNjRfdChzLnRpbWVzdGFtcFVzKTsKKyAgICBkLT5jdXN0b21PcmRpbmFsID0gYzJfY250cjY0X3Qocy5jdXN0b21PcmRpbmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UncyB0eXBlIC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSYW5nZQorYm9vbCBvYmpjcHkoCisgICAgICAgIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSYW5nZSogZCwKKyAgICAgICAgY29uc3QgZGVjbHR5cGUoQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UpJiBzKSB7CisgICAgZC0+bWluID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMubWluLnU2NCk7CisgICAgZC0+bWF4ID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMubWF4LnU2NCk7CisgICAgZC0+c3RlcCA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLnN0ZXAudTY0KTsKKyAgICBkLT5udW0gPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5udW0udTY0KTsKKyAgICBkLT5kZW5vbSA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLmRlbm9tLnU2NCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXMKK2Jvb2wgb2JqY3B5KEZpZWxkU3VwcG9ydGVkVmFsdWVzICpkLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZzKSB7CisgICAgc3dpdGNoIChzLnR5cGUpIHsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkVNUFRZOgorICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OkVNUFRZOworICAgICAgICBkLT52YWx1ZXMucmVzaXplKDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFOgorICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OlJBTkdFOworICAgICAgICBpZiAoIW9iamNweSgmZC0+cmFuZ2UsIHMucmFuZ2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChzLnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVM6CisgICAgICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OlZBTFVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTOgorICAgICAgICAgICAgZC0+dHlwZSA9IEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpGTEFHUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdCAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMudHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgZC0+dHlwZSA9IHN0YXRpY19jYXN0PEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlPihzLnR5cGUpOworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmQtPnJhbmdlLCBzLnJhbmdlKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29weVZlY3Rvcjx1aW50NjRfdD4oJmQtPnZhbHVlcywgcy52YWx1ZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlIC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlJ3MgdHlwZQorYm9vbCBvYmpjcHkoCisgICAgICAgIGRlY2x0eXBlKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlKSogZCwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlJiBzKSB7CisgICAgZC0+bWluLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLm1pbik7CisgICAgZC0+bWF4LnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLm1heCk7CisgICAgZC0+c3RlcC51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5zdGVwKTsKKyAgICBkLT5udW0udTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMubnVtKTsKKyAgICBkLT5kZW5vbS51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5kZW5vbSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzIC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMKK2Jvb2wgb2JqY3B5KEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmQsIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzICZzKSB7CisgICAgc3dpdGNoIChzLnR5cGUpIHsKKyAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpFTVBUWToKKyAgICAgICAgZC0+dHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkVNUFRZOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpSQU5HRToKKyAgICAgICAgZC0+dHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFOworICAgICAgICBpZiAoIW9iamNweSgmZC0+cmFuZ2UsIHMucmFuZ2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN3aXRjaCAocy50eXBlKSB7CisgICAgICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OlZBTFVFUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6RkxBR1M6CisgICAgICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMudHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgZC0+dHlwZSA9IHN0YXRpY19jYXN0PEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdD4ocy50eXBlKTsKKyAgICAgICAgICAgIGlmICghb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZS4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb3B5VmVjdG9yPHVpbnQ2NF90PigmZC0+dmFsdWVzLCBzLnZhbHVlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKSB7CisgICAgaWYgKCFvYmpjcHkoJmQtPmZpZWxkLCBzLmZpZWxkKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpmaWVsZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN3aXRjaCAocy50eXBlKCkpIHsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEU6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpQT1NTSUJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQ6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpDVVJSRU5UOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Ojp0eXBlX3QgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMudHlwZSgpKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+dHlwZSA9IHN0YXRpY19jYXN0PEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU+KHMudHlwZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKSB7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Ojp0eXBlX3QgZFR5cGU7CisgICAgc3dpdGNoIChzLnR5cGUpIHsKKyAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OlBPU1NJQkxFOgorICAgICAgICBkVHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6Q1VSUkVOVDoKKyAgICAgICAgZFR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLnR5cGUpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBkVHlwZSA9IHN0YXRpY19jYXN0PEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6dHlwZV90PihzLnR5cGUpOworICAgIH0KKyAgICAqZCA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShDMlBhcmFtRmllbGRCdWlsZGVyKHMuZmllbGQpLCBkVHlwZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0Citib29sIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKSB7CisgICAgZC0+c3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihzLnN0YXR1cyk7CisgICAgcmV0dXJuIG9iamNweSgmZC0+dmFsdWVzLCBzLnZhbHVlcyk7Cit9CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnksIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQgLT4KKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYm9vbCBvYmpjcHkoCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSogZCwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgc3EsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQmIHNyKSB7CisgICAgaWYgKCFvYmpjcHkoZCwgc3EpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGQtPnN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190Pihzci5zdGF0dXMpOworICAgIGlmICghb2JqY3B5KCZkLT52YWx1ZXMsIHNyLnZhbHVlcykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0Ojp2YWx1ZXMuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJDb21wb25lbnQ6OlRyYWl0cyAtPiBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cworYm9vbCBvYmpjcHkoCisgICAgICAgIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzICpkLAorICAgICAgICBjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzICZzKSB7CisgICAgZC0+bmFtZSA9IHMubmFtZTsKKworICAgIHN3aXRjaCAocy5kb21haW4pIHsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fVklERU86CisgICAgICAgIGQtPmRvbWFpbiA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OlZJREVPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU86CisgICAgICAgIGQtPmRvbWFpbiA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OkFVRElPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U6CisgICAgICAgIGQtPmRvbWFpbiA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OklNQUdFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVI6CisgICAgICAgIGQtPmRvbWFpbiA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46Ok9USEVSOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJDb21wb25lbnQ6OmRvbWFpbl90ICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLmRvbWFpbikKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGQtPmRvbWFpbiA9IHN0YXRpY19jYXN0PElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW4+KAorICAgICAgICAgICAgICAgIHMuZG9tYWluKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMua2luZCkgeworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUjoKKyAgICAgICAgZC0+a2luZCA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpERUNPREVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI6CisgICAgICAgIGQtPmtpbmQgPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6RU5DT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9PVEhFUjoKKyAgICAgICAgZC0+a2luZCA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpPVEhFUjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEMyQ29tcG9uZW50OjpraW5kX3QgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMua2luZCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGQtPmtpbmQgPSBzdGF0aWNfY2FzdDxJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZD4oCisgICAgICAgICAgICAgICAgcy5raW5kKTsKKyAgICB9CisKKyAgICBkLT5yYW5rID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMucmFuayk7CisKKyAgICBkLT5tZWRpYVR5cGUgPSBzLm1lZGlhVHlwZTsKKworICAgIGQtPmFsaWFzZXMucmVzaXplKHMuYWxpYXNlcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGl4ID0gcy5hbGlhc2VzLnNpemUoKTsgaXggPiAwOyApIHsKKyAgICAgICAgLS1peDsKKyAgICAgICAgZC0+YWxpYXNlc1tpeF0gPSBzLmFsaWFzZXNbaXhdOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29tcG9uZW50VHJhaXRzIC0+IEMyQ29tcG9uZW50OjpUcmFpdHMsIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+Citib29sIG9iamNweSgKKyAgICAgICAgQzJDb21wb25lbnQ6OlRyYWl0cyogZCwKKyAgICAgICAgY29uc3QgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMmIHMpIHsKKyAgICBkLT5uYW1lID0gcy5uYW1lLmNfc3RyKCk7CisKKyAgICBzd2l0Y2ggKHMuZG9tYWluKSB7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpWSURFTzoKKyAgICAgICAgZC0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpBVURJTzoKKyAgICAgICAgZC0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpJTUFHRToKKyAgICAgICAgZC0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpPVEhFUjoKKyAgICAgICAgZC0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIENvbXBvbmVudFRyYWl0czo6RG9tYWluICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLmRvbWFpbikKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGQtPmRvbWFpbiA9IHN0YXRpY19jYXN0PEMyQ29tcG9uZW50Ojpkb21haW5fdD4ocy5kb21haW4pOworICAgIH0KKworICAgIHN3aXRjaCAocy5raW5kKSB7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6REVDT0RFUjoKKyAgICAgICAgZC0+a2luZCA9IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkVOQ09ERVI6CisgICAgICAgIGQtPmtpbmQgPSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpPVEhFUjoKKyAgICAgICAgZC0+a2luZCA9IEMyQ29tcG9uZW50OjpLSU5EX09USEVSOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQ29tcG9uZW50VHJhaXRzOjpLaW5kICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLmtpbmQpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBkLT5raW5kID0gc3RhdGljX2Nhc3Q8QzJDb21wb25lbnQ6OmtpbmRfdD4ocy5raW5kKTsKKyAgICB9CisKKyAgICBkLT5yYW5rID0gc3RhdGljX2Nhc3Q8QzJDb21wb25lbnQ6OnJhbmtfdD4ocy5yYW5rKTsKKyAgICBkLT5tZWRpYVR5cGUgPSBzLm1lZGlhVHlwZS5jX3N0cigpOworICAgIGQtPmFsaWFzZXMucmVzaXplKHMuYWxpYXNlcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcy5hbGlhc2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGQtPmFsaWFzZXNbaV0gPSBzLmFsaWFzZXNbaV07CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIEMyUGFyYW1GaWVsZFZhbHVlcyAtPiBQYXJhbUZpZWxkVmFsdWVzCitib29sIG9iamNweShQYXJhbUZpZWxkVmFsdWVzICpkLCBjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXMgJnMpIHsKKyAgICBpZiAoIW9iamNweSgmZC0+cGFyYW1PckZpZWxkLCBzLnBhcmFtT3JGaWVsZCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMlBhcmFtRmllbGRWYWx1ZXM6OnBhcmFtT3JGaWVsZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzLnZhbHVlcykgeworICAgICAgICBkLT52YWx1ZXMucmVzaXplKDEpOworICAgICAgICBpZiAoIW9iamNweSgmZC0+dmFsdWVzWzBdLCAqcy52YWx1ZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyUGFyYW1GaWVsZFZhbHVlczo6dmFsdWVzLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGQtPnZhbHVlcy5yZXNpemUoMCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBhcmFtRmllbGRWYWx1ZXMgLT4gQzJQYXJhbUZpZWxkVmFsdWVzCitib29sIG9iamNweShDMlBhcmFtRmllbGRWYWx1ZXMgKmQsIGNvbnN0IFBhcmFtRmllbGRWYWx1ZXMgJnMpIHsKKyAgICBkLT5wYXJhbU9yRmllbGQgPSBDMlBhcmFtRmllbGRCdWlsZGVyKHMucGFyYW1PckZpZWxkKTsKKyAgICBpZiAocy52YWx1ZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgZC0+dmFsdWVzID0gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPigpOworICAgICAgICBpZiAoIW9iamNweShkLT52YWx1ZXMuZ2V0KCksIHMudmFsdWVzWzBdKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBQYXJhbUZpZWxkVmFsdWVzOjp2YWx1ZXMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHMudmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGQtPnZhbHVlcy5yZXNldCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBQYXJhbUZpZWxkVmFsdWVzOiAiCisgICAgICAgICAgICAgICAgICAiVHdvIG9yIG1vcmUgRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0cyBleGlzdCBpbiAiCisgICAgICAgICAgICAgICAgICAiUGFyYW1GaWVsZFZhbHVlcy4gIgorICAgICAgICAgICAgICAgICAgIk9ubHkgemVybyBvciBvbmUgaXMgYWxsb3dlZC4iOworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBDMlNldHRpbmdSZXN1bHQgLT4gU2V0dGluZ1Jlc3VsdAorYm9vbCBvYmpjcHkoU2V0dGluZ1Jlc3VsdCAqZCwgY29uc3QgQzJTZXR0aW5nUmVzdWx0ICZzKSB7CisgICAgc3dpdGNoIChzLmZhaWx1cmUpIHsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1RZUEU6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfVFlQRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9QT1JUOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1BPUlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfSU5ERVg6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfSU5ERVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFk6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpSRUFEX09OTFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpNSVNNQVRDSDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6Ok1JU01BVENIOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1Q6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpDT05GTElDVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OlVOU1VQUE9SVEVEOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6VU5TVVBQT1JURUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpJTkZPX0JBRF9WQUxVRToKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OklORk9fQkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19DT05GTElDVDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OklORk9fQ09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMlNldHRpbmdSZXN1bHQ6OkZhaWx1cmUgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZmFpbHVyZSkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGQtPmZhaWx1cmUgPSBzdGF0aWNfY2FzdDxTZXR0aW5nUmVzdWx0OjpGYWlsdXJlPihzLmZhaWx1cmUpOworICAgIH0KKyAgICBpZiAoIW9iamNweSgmZC0+ZmllbGQsIHMuZmllbGQpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJTZXR0aW5nUmVzdWx0OjpmaWVsZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGQtPmNvbmZsaWN0cy5yZXNpemUocy5jb25mbGljdHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXMmIHNDb25mbGljdCA6IHMuY29uZmxpY3RzKSB7CisgICAgICAgIFBhcmFtRmllbGRWYWx1ZXMgJmRDb25mbGljdCA9IGQtPmNvbmZsaWN0c1tpKytdOworICAgICAgICBpZiAoIW9iamNweSgmZENvbmZsaWN0LCBzQ29uZmxpY3QpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyU2V0dGluZ1Jlc3VsdDo6Y29uZmxpY3RzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaSAtIDEgPDwgIl0uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU2V0dGluZ1Jlc3VsdCAtPiBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PgorYm9vbCBvYmpjcHkoc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gKmQsIGNvbnN0IFNldHRpbmdSZXN1bHQgJnMpIHsKKyAgICAqZCA9IHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+KG5ldyBDMlNldHRpbmdSZXN1bHQgeworICAgICAgICAgICAgLmZpZWxkID0gQzJQYXJhbUZpZWxkVmFsdWVzKEMyUGFyYW1GaWVsZEJ1aWxkZXIoKSkgfSk7CisgICAgaWYgKCEqZCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyBtZW1vcnkgZm9yIEMyU2V0dGluZ1Jlc3VsdC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gZmFpbHVyZQorICAgIHN3aXRjaCAocy5mYWlsdXJlKSB7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfVFlQRToKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1RZUEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1BPUlQ6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9QT1JUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9JTkRFWDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX0lOREVYOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OlJFQURfT05MWToKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6UkVBRF9PTkxZOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6Ok1JU01BVENIOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpNSVNNQVRDSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfVkFMVUU6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpDT05GTElDVDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6VU5TVVBQT1JURUQ6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OlVOU1VQUE9SVEVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OklORk9fQkFEX1ZBTFVFOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpJTkZPX0JBRF9WQUxVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpJTkZPX0NPTkZMSUNUOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpJTkZPX0NPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZSAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5mYWlsdXJlKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IHN0YXRpY19jYXN0PEMyU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZT4ocy5mYWlsdXJlKTsKKyAgICB9CisKKyAgICAvLyBmaWVsZAorICAgIGlmICghb2JqY3B5KCYoKmQpLT5maWVsZCwgcy5maWVsZCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBTZXR0aW5nUmVzdWx0OjpmaWVsZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gY29uZmxpY3RzCisgICAgKCpkKS0+Y29uZmxpY3RzLmNsZWFyKCk7CisgICAgKCpkKS0+Y29uZmxpY3RzLnJlc2VydmUocy5jb25mbGljdHMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IFBhcmFtRmllbGRWYWx1ZXMmIHNDb25mbGljdCA6IHMuY29uZmxpY3RzKSB7CisgICAgICAgICgqZCktPmNvbmZsaWN0cy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzeyBDMlBhcmFtRmllbGRCdWlsZGVyKCksIG51bGxwdHIgfSk7CisgICAgICAgIGlmICghb2JqY3B5KCYoKmQpLT5jb25mbGljdHMuYmFjaygpLCBzQ29uZmxpY3QpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFNldHRpbmdSZXN1bHQ6OmNvbmZsaWN0cy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMlBhcmFtRGVzY3JpcHRvciAtPiBQYXJhbURlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KFBhcmFtRGVzY3JpcHRvciAqZCwgY29uc3QgQzJQYXJhbURlc2NyaXB0b3IgJnMpIHsKKyAgICBkLT5pbmRleCA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHMuaW5kZXgoKSk7CisgICAgZC0+YXR0cmliID0gc3RhdGljX2Nhc3Q8aGlkbF9iaXRmaWVsZDxQYXJhbURlc2NyaXB0b3I6OkF0dHJpYj4+KAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldEF0dHJpYihzKSk7CisgICAgZC0+bmFtZSA9IHMubmFtZSgpOworICAgIGNvcHlWZWN0b3I8dWludDMyX3Q+KCZkLT5kZXBlbmRlbmNpZXMsIHMuZGVwZW5kZW5jaWVzKCkpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBQYXJhbURlc2NyaXB0b3IgLT4gQzJQYXJhbURlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gKmQsIGNvbnN0IFBhcmFtRGVzY3JpcHRvciAmcykgeworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBkRGVwZW5kZW5jaWVzOworICAgIGREZXBlbmRlbmNpZXMucmVzZXJ2ZShzLmRlcGVuZGVuY2llcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgUGFyYW1JbmRleCYgc0RlcGVuZGVuY3kgOiBzLmRlcGVuZGVuY2llcykgeworICAgICAgICBkRGVwZW5kZW5jaWVzLmVtcGxhY2VfYmFjayhzdGF0aWNfY2FzdDx1aW50MzJfdD4oc0RlcGVuZGVuY3kpKTsKKyAgICB9CisgICAgKmQgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgIEMyUGFyYW06OkluZGV4KHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmluZGV4KSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3Q+KHMuYXR0cmliKSwKKyAgICAgICAgICAgIEMyU3RyaW5nKHMubmFtZS5jX3N0cigpKSwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShkRGVwZW5kZW5jaWVzKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyU3RydWN0RGVzY3JpcHRvciAtPiBTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweShTdHJ1Y3REZXNjcmlwdG9yICpkLCBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnMpIHsKKyAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4ocy5jb3JlSW5kZXgoKS5jb3JlSW5kZXgoKSk7CisgICAgZC0+ZmllbGRzLnJlc2l6ZShzLm51bUZpZWxkcygpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvJiBzRmllbGQgOiBzKSB7CisgICAgICAgIEZpZWxkRGVzY3JpcHRvciYgZEZpZWxkID0gZC0+ZmllbGRzW2krK107CisgICAgICAgIGRGaWVsZC5maWVsZElkLm9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKKyAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KHNGaWVsZCkpOworICAgICAgICBkRmllbGQuZmllbGRJZC5zaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHNGaWVsZCkpOworICAgICAgICBkRmllbGQudHlwZSA9IHN0YXRpY19jYXN0PGhpZGxfYml0ZmllbGQ8RmllbGREZXNjcmlwdG9yOjpUeXBlPj4oCisgICAgICAgICAgICAgICAgc0ZpZWxkLnR5cGUoKSk7CisgICAgICAgIGRGaWVsZC5leHRlbnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc0ZpZWxkLmV4dGVudCgpKTsKKyAgICAgICAgZEZpZWxkLm5hbWUgPSBzdGF0aWNfY2FzdDxoaWRsX3N0cmluZz4oc0ZpZWxkLm5hbWUoKSk7CisgICAgICAgIGNvbnN0IGF1dG8mIHNOYW1lZFZhbHVlcyA9IHNGaWVsZC5uYW1lZFZhbHVlcygpOworICAgICAgICBkRmllbGQubmFtZWRWYWx1ZXMucmVzaXplKHNOYW1lZFZhbHVlcy5zaXplKCkpOworICAgICAgICBzaXplX3QgaiA9IDA7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc05hbWVkVmFsdWUgOiBzTmFtZWRWYWx1ZXMpIHsKKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZSYgZE5hbWVkVmFsdWUgPSBkRmllbGQubmFtZWRWYWx1ZXNbaisrXTsKKyAgICAgICAgICAgIGROYW1lZFZhbHVlLm5hbWUgPSBzdGF0aWNfY2FzdDxoaWRsX3N0cmluZz4oc05hbWVkVmFsdWUuZmlyc3QpOworICAgICAgICAgICAgZE5hbWVkVmFsdWUudmFsdWUgPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4oCisgICAgICAgICAgICAgICAgICAgIHNOYW1lZFZhbHVlLnNlY29uZC51NjQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBTdHJ1Y3REZXNjcmlwdG9yIC0+IEMyU3RydWN0RGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gKmQsIGNvbnN0IFN0cnVjdERlc2NyaXB0b3IgJnMpIHsKKyAgICBDMlBhcmFtOjpDb3JlSW5kZXggZEluZGV4ID0gQzJQYXJhbTo6Q29yZUluZGV4KHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnR5cGUpKTsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZEZpZWxkczsKKyAgICBkRmllbGRzLnJlc2VydmUocy5maWVsZHMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNGaWVsZCA6IHMuZmllbGRzKSB7CisgICAgICAgIEMyRmllbGREZXNjcmlwdG9yIGRGaWVsZCA9IHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzRmllbGQudHlwZSksCisgICAgICAgICAgICBzRmllbGQuZXh0ZW50LAorICAgICAgICAgICAgc0ZpZWxkLm5hbWUsCisgICAgICAgICAgICBzRmllbGQuZmllbGRJZC5vZmZzZXQsCisgICAgICAgICAgICBzRmllbGQuZmllbGRJZC5zaXplIH07CisgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXM7CisgICAgICAgIG5hbWVkVmFsdWVzLnJlc2VydmUoc0ZpZWxkLm5hbWVkVmFsdWVzLnNpemUoKSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc05hbWVkVmFsdWUgOiBzRmllbGQubmFtZWRWYWx1ZXMpIHsKKyAgICAgICAgICAgIG5hbWVkVmFsdWVzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBzTmFtZWRWYWx1ZS5uYW1lLAorICAgICAgICAgICAgICAgIEMyVmFsdWU6OlByaW1pdGl2ZShzdGF0aWNfY2FzdDx1aW50NjRfdD4oc05hbWVkVmFsdWUudmFsdWUpKSk7CisgICAgICAgIH0KKyAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkFkZE5hbWVkVmFsdWVzKGRGaWVsZCwgc3RkOjptb3ZlKG5hbWVkVmFsdWVzKSk7CisgICAgICAgIGRGaWVsZHMuZW1wbGFjZV9iYWNrKGRGaWVsZCk7CisgICAgfQorICAgICpkID0gc3RkOjptYWtlX3VuaXF1ZTxDMlN0cnVjdERlc2NyaXB0b3I+KAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkNyZWF0ZVN0cnVjdERlc2NyaXB0b3IoZEluZGV4LCBzdGQ6Om1vdmUoZEZpZWxkcykpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBGaW5kIG9yIGFkZCBhIGhpZGwgQmFzZUJsb2NrIG9iamVjdCBmcm9tIGEgZ2l2ZW4gQzJIYW5kbGUqIHRvIGEgbGlzdCBhbmQgYW4KKy8vIGFzc29jaWF0ZWQgbWFwLgorLy8gTm90ZTogVGhlIGhhbmRsZSBpcyBub3QgY2xvbmVkLgorYm9vbCBfYWRkQmFzZUJsb2NrKAorICAgICAgICB1aW50MzJfdCogaW5kZXgsCisgICAgICAgIGNvbnN0IEMySGFuZGxlKiBoYW5kbGUsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiYWRkQmFzZUJsb2NrIGNhbGxlZCBvbiBhIG51bGwgQzJIYW5kbGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGl0ID0gYmFzZUJsb2NrSW5kaWNlcy0+ZmluZChoYW5kbGUpOworICAgIGlmIChpdCAhPSBiYXNlQmxvY2tJbmRpY2VzLT5lbmQoKSkgeworICAgICAgICAqaW5kZXggPSBpdC0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgICppbmRleCA9IGJhc2VCbG9ja3MtPnNpemUoKTsKKyAgICAgICAgYmFzZUJsb2NrSW5kaWNlcy0+ZW1wbGFjZShoYW5kbGUsICppbmRleCk7CisgICAgICAgIGJhc2VCbG9ja3MtPmVtcGxhY2VfYmFjaygpOworCisgICAgICAgIEJhc2VCbG9jayAmZEJhc2VCbG9jayA9IGJhc2VCbG9ja3MtPmJhY2soKTsKKyAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjbG9uZSB0aGUgaGFuZGxlLgorICAgICAgICBkQmFzZUJsb2NrLm5hdGl2ZUJsb2NrKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90Kj4oaGFuZGxlKSk7CisKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZpbmQgb3IgYWRkIGEgaGlkbCBCYXNlQmxvY2sgb2JqZWN0IGZyb20gYSBnaXZlbiBCdWZmZXJQb29sRGF0YSB0byBhIGxpc3QgYW5kCisvLyBhbiBhc3NvY2lhdGVkIG1hcC4KK2Jvb2wgX2FkZEJhc2VCbG9jaygKKyAgICAgICAgdWludDMyX3QqIGluZGV4LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YSwKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlciwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBpZiAoIWJwRGF0YSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJhZGRCYXNlQmxvY2sgY2FsbGVkIG9uIGEgbnVsbCBCdWZmZXJQb29sRGF0YS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gaXQgPSBiYXNlQmxvY2tJbmRpY2VzLT5maW5kKGJwRGF0YS5nZXQoKSk7CisgICAgaWYgKGl0ICE9IGJhc2VCbG9ja0luZGljZXMtPmVuZCgpKSB7CisgICAgICAgICppbmRleCA9IGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmluZGV4ID0gYmFzZUJsb2Nrcy0+c2l6ZSgpOworICAgICAgICBiYXNlQmxvY2tJbmRpY2VzLT5lbXBsYWNlKGJwRGF0YS5nZXQoKSwgKmluZGV4KTsKKyAgICAgICAgYmFzZUJsb2Nrcy0+ZW1wbGFjZV9iYWNrKCk7CisKKyAgICAgICAgQmFzZUJsb2NrICZkQmFzZUJsb2NrID0gYmFzZUJsb2Nrcy0+YmFjaygpOworCisgICAgICAgIGlmIChidWZmZXJQb29sU2VuZGVyKSB7CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIHBvb2xlZEJsb2NrOworICAgICAgICAgICAgUmVzdWx0U3RhdHVzIGJwU3RhdHVzID0gYnVmZmVyUG9vbFNlbmRlci0+c2VuZCgKKyAgICAgICAgICAgICAgICAgICAgYnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAmcG9vbGVkQmxvY2spOworCisgICAgICAgICAgICBpZiAoYnBTdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZW5kIGJ1ZmZlciB3aXRoIEJ1ZmZlclBvb2wuIEVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQzMl90PihicFN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkQmFzZUJsb2NrLnBvb2xlZEJsb2NrKHBvb2xlZEJsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBhZGRCYXNlQmxvY2soCisgICAgICAgIHVpbnQzMl90KiBpbmRleCwKKyAgICAgICAgY29uc3QgQzJIYW5kbGUqIGhhbmRsZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+JiBibG9ja1Bvb2xEYXRhLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGlmICghYmxvY2tQb29sRGF0YSkgeworICAgICAgICAvLyBObyBCdWZmZXJQb29sRGF0YSA9PT4gTkFUSVZFIGJsb2NrLgorICAgICAgICByZXR1cm4gX2FkZEJhc2VCbG9jaygKKyAgICAgICAgICAgICAgICBpbmRleCwgaGFuZGxlLAorICAgICAgICAgICAgICAgIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpOworICAgIH0KKyAgICBzd2l0Y2ggKGJsb2NrUG9vbERhdGEtPmdldFR5cGUoKSkgeworICAgIGNhc2UgX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJQT09MOiB7CisgICAgICAgICAgICAvLyBCdWZmZXJQb29sRGF0YQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBicERhdGE7CisgICAgICAgICAgICBpZiAoIV9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUG9vbERhdGEoYmxvY2tQb29sRGF0YSwgJmJwRGF0YSkKKyAgICAgICAgICAgICAgICAgICAgfHwgIWJwRGF0YSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkJ1ZmZlclBvb2xEYXRhIHVuYXZhaWxhYmxlIGluIGEgYmxvY2suIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX2FkZEJhc2VCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGJwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgICAgIH0KKyAgICBjYXNlIF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUVVFVUU6CisgICAgICAgIC8vIERvIHRoZSBzYW1lIHRoaW5nIGFzIGEgTkFUSVZFIGJsb2NrLgorICAgICAgICByZXR1cm4gX2FkZEJhc2VCbG9jaygKKyAgICAgICAgICAgICAgICBpbmRleCwgaGFuZGxlLAorICAgICAgICAgICAgICAgIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gQzJCbG9ja1Bvb2xEYXRhIHR5cGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLy8gQzJGZW5jZSAtPiBoaWRsX2hhbmRsZQorLy8gTm90ZTogRmlsZSBkZXNjcmlwdG9ycyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IgbXVzdAorLy8gbm90IGJlIGNsb3NlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorYm9vbCBvYmpjcHkoaGlkbF9oYW5kbGUqIGQsIGNvbnN0IEMyRmVuY2UmIHMpIHsKKyAgICAodm9pZClzOyAvLyBUT0RPOiBpbXBsZW1lbnQgcy5mZCgpCisgICAgaW50IGZlbmNlRmQgPSAtMTsKKyAgICBkLT5zZXRUbyhudWxscHRyKTsKKyAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgICAgIGlmICghaGFuZGxlKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgbmF0aXZlIGhhbmRsZS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZlbmNlRmQ7CisgICAgICAgIGQtPnNldFRvKGhhbmRsZSwgdHJ1ZSAvKiBvd25zICovKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyQ29uc3RMaW5lYXJCbG9jayAtPiBCbG9jaworLy8gTm90ZTogTmF0aXZlIGhhbmRsZXMgYXJlIG5vdCBkdXBsaWNhdGVkLiBUaGUgb3JpZ2luYWwgaGFuZGxlcyBtdXN0IG5vdCBiZQorLy8gY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShCbG9jayogZCwgY29uc3QgQzJDb25zdExpbmVhckJsb2NrJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiBicERhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKHMpOworICAgIGlmICghYWRkQmFzZUJsb2NrKCZkLT5pbmRleCwgcy5oYW5kbGUoKSwgYnBEYXRhLAorICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBibG9jayBkYXRhIGluIEMyQ29uc3RMaW5lYXJCbG9jay4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRoZSBtZXRhZGF0YS4KKyAgICBDMkhpZGxfUmFuZ2VJbmZvIGRSYW5nZUluZm87CisgICAgZFJhbmdlSW5mby5vZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5vZmZzZXQoKSk7CisgICAgZFJhbmdlSW5mby5sZW5ndGggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5zaXplKCkpOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+eyAmZFJhbmdlSW5mbyB9KSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHJhbmdlIGluZm8gaW4gQzJDb25zdExpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBmZW5jZQorICAgIGlmICghb2JqY3B5KCZkLT5mZW5jZSwgcy5mZW5jZSgpKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQ29uc3RMaW5lYXJCbG9jazo6ZmVuY2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJDb25zdEdyYXBoaWNCbG9jayAtPiBCbG9jaworLy8gTm90ZTogTmF0aXZlIGhhbmRsZXMgYXJlIG5vdCBkdXBsaWNhdGVkLiBUaGUgb3JpZ2luYWwgaGFuZGxlcyBtdXN0IG5vdCBiZQorLy8gY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShCbG9jayogZCwgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgcywKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlciwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4gYnBEYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEocyk7CisgICAgaWYgKCFhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGJsb2NrIGRhdGEgaW4gQzJDb25zdEdyYXBoaWNCbG9jay4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRoZSBtZXRhZGF0YS4KKyAgICBDMkhpZGxfUmVjdEluZm8gZFJlY3RJbmZvOworICAgIEMyUmVjdCBzUmVjdCA9IHMuY3JvcCgpOworICAgIGRSZWN0SW5mby5sZWZ0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNSZWN0LmxlZnQpOworICAgIGRSZWN0SW5mby50b3AgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3QudG9wKTsKKyAgICBkUmVjdEluZm8ud2lkdGggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3Qud2lkdGgpOworICAgIGRSZWN0SW5mby5oZWlnaHQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3QuaGVpZ2h0KTsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJmQtPm1ldGEsIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPnsgJmRSZWN0SW5mbyB9KSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHJlY3QgaW5mbyBpbiBDMkNvbnN0R3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBmZW5jZQorICAgIGlmICghb2JqY3B5KCZkLT5mZW5jZSwgcy5mZW5jZSgpKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQ29uc3RHcmFwaGljQmxvY2s6OmZlbmNlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyQnVmZmVyRGF0YSAtPiBCdWZmZXIKKy8vIFRoaXMgZnVuY3Rpb24gb25seSBmaWxscyBpbiBkLT5ibG9ja3MuCitib29sIG9iamNweShCdWZmZXIqIGQsIGNvbnN0IEMyQnVmZmVyRGF0YSYgcywKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlciwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBkLT5ibG9ja3MucmVzaXplKAorICAgICAgICAgICAgcy5saW5lYXJCbG9ja3MoKS5zaXplKCkgKworICAgICAgICAgICAgcy5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBDMkNvbnN0TGluZWFyQmxvY2smIGxpbmVhckJsb2NrIDogcy5saW5lYXJCbG9ja3MoKSkgeworICAgICAgICBCbG9jayYgZEJsb2NrID0gZC0+YmxvY2tzW2krK107CisgICAgICAgIGlmICghb2JqY3B5KAorICAgICAgICAgICAgICAgICZkQmxvY2ssIGxpbmVhckJsb2NrLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyRGF0YTo6bGluZWFyQmxvY2tzLiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoRGVzdGluYXRpb24gaW5kZXggPSAiIDw8IGkgLSAxIDw8ICIuKSI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBncmFwaGljQmxvY2sgOiBzLmdyYXBoaWNCbG9ja3MoKSkgeworICAgICAgICBCbG9jayYgZEJsb2NrID0gZC0+YmxvY2tzW2krK107CisgICAgICAgIGlmICghb2JqY3B5KAorICAgICAgICAgICAgICAgICZkQmxvY2ssIGdyYXBoaWNCbG9jaywKKyAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJ1ZmZlckRhdGE6OmdyYXBoaWNCbG9ja3MuICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihEZXN0aW5hdGlvbiBpbmRleCA9ICIgPDwgaSAtIDEgPDwgIi4pIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJCdWZmZXIgLT4gQnVmZmVyCitib29sIG9iamNweShCdWZmZXIqIGQsIGNvbnN0IEMyQnVmZmVyJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+aW5mbywgcy5pbmZvKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCdWZmZXI6OmluZm8uIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW9iamNweShkLCBzLmRhdGEoKSwgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJ1ZmZlcjo6ZGF0YS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkluZm9CdWZmZXIgLT4gSW5mb0J1ZmZlcgorYm9vbCBvYmpjcHkoSW5mb0J1ZmZlciogZCwgY29uc3QgQzJJbmZvQnVmZmVyJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIC8vIFRPRE86IEMySW5mb0J1ZmZlciBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAgKHZvaWQpZDsKKyAgICAodm9pZClzOworICAgICh2b2lkKWJ1ZmZlclBvb2xTZW5kZXI7CisgICAgKHZvaWQpYmFzZUJsb2NrczsKKyAgICAodm9pZCliYXNlQmxvY2tJbmRpY2VzOworICAgIExPRyhJTkZPKSA8PCAiSW5mb0J1ZmZlciBub3QgaW1wbGVtZW50ZWQuIjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGcmFtZURhdGEgLT4gRnJhbWVEYXRhCitib29sIG9iamNweShGcmFtZURhdGEqIGQsIGNvbnN0IEMyRnJhbWVEYXRhJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGQtPmZsYWdzID0gc3RhdGljX2Nhc3Q8aGlkbF9iaXRmaWVsZDxGcmFtZURhdGE6OkZsYWdzPj4ocy5mbGFncyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPm9yZGluYWwsIHMub3JkaW5hbCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZyYW1lRGF0YTo6b3JkaW5hbC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZC0+YnVmZmVycy5yZXNpemUocy5idWZmZXJzLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgc0J1ZmZlciA6IHMuYnVmZmVycykgeworICAgICAgICBCdWZmZXImIGRCdWZmZXIgPSBkLT5idWZmZXJzW2krK107CisgICAgICAgIGlmICghc0J1ZmZlcikgeworICAgICAgICAgICAgLy8gQSBudWxsIChwb2ludGVyIHRvKSBDMkJ1ZmZlciBjb3JyZXNwb25kcyB0byBhIEJ1ZmZlciB3aXRoIGVtcHR5CisgICAgICAgICAgICAvLyBpbmZvIGFuZCBibG9ja3MuCisgICAgICAgICAgICBkQnVmZmVyLmluZm8ucmVzaXplKDApOworICAgICAgICAgICAgZEJ1ZmZlci5ibG9ja3MucmVzaXplKDApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCdWZmZXIsICpzQnVmZmVyLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpidWZmZXJzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaSAtIDEgPDwgIl0uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+Y29uZmlnVXBkYXRlLCBzLmNvbmZpZ1VwZGF0ZSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZyYW1lRGF0YTo6Y29uZmlnVXBkYXRlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkLT5pbmZvQnVmZmVycy5yZXNpemUocy5pbmZvQnVmZmVycy5zaXplKCkpOworICAgIGkgPSAwOworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mb0J1ZmZlcj4mIHNJbmZvQnVmZmVyIDogcy5pbmZvQnVmZmVycykgeworICAgICAgICBJbmZvQnVmZmVyJiBkSW5mb0J1ZmZlciA9IGQtPmluZm9CdWZmZXJzW2krK107CisgICAgICAgIGlmICghc0luZm9CdWZmZXIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgQzJGcmFtZURhdGE6OmluZm9CdWZmZXJzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaSAtIDEgPDwgIl0uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9iamNweSgmZEluZm9CdWZmZXIsICpzSW5mb0J1ZmZlciwKKyAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZyYW1lRGF0YTo6aW5mb0J1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIncyBpbXBsZW1lbnRhdGlvbgorCitEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcjo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwpCisgICAgOiBtUmVjZWl2ZXJNYW5hZ2VyKHJlY2VpdmVyTWFuYWdlciksCisgICAgICBtU291cmNlQ29ubmVjdGlvbklkKDApLAorICAgICAgbUxhc3RTZW50KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpKSwKKyAgICAgIG1SZWZyZXNoSW50ZXJ2YWwocmVmcmVzaEludGVydmFsKSB7Cit9CisKK3ZvaWQgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXI6OnNldFJlY2VpdmVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAobVJlY2VpdmVyTWFuYWdlciAhPSByZWNlaXZlck1hbmFnZXIpIHsKKyAgICAgICAgbVJlY2VpdmVyTWFuYWdlciA9IHJlY2VpdmVyTWFuYWdlcjsKKyAgICB9CisgICAgbVJlZnJlc2hJbnRlcnZhbCA9IHJlZnJlc2hJbnRlcnZhbDsKK30KKworUmVzdWx0U3RhdHVzIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyOjpzZW5kKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+JiBicERhdGEsCisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgeworICAgIGlmICghbVJlY2VpdmVyTWFuYWdlcikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyBhY2Nlc3MgdG8gcmVjZWl2ZXIncyBCdWZmZXJQb29sLiI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKCFtU2VuZGVyTWFuYWdlcikgeworICAgICAgICBtU2VuZGVyTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGlmICghbVNlbmRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZXRyaWV2ZSBsb2NhbCBCdWZmZXJQb29sIENsaWVudE1hbmFnZXIuIjsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIGludDY0X3QgY29ubmVjdGlvbklkID0gYnBEYXRhLT5tQ29ubmVjdGlvbklkOworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbm93ID0KKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGludGVydmFsID0gbm93IC0gbUxhc3RTZW50OworICAgIGlmIChtU291cmNlQ29ubmVjdGlvbklkID09IDAgfHwKKyAgICAgICAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQgIT0gY29ubmVjdGlvbklkIHx8CisgICAgICAgICAgICBpbnRlcnZhbCA+IG1SZWZyZXNoSW50ZXJ2YWwpIHsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYnVmZmVycG9vbCBjb25uZWN0aW9uLgorICAgICAgICBtU291cmNlQ29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICBpZiAobVNvdXJjZUNvbm5lY3Rpb25JZCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgcmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgICAgIHJzID0gbVNlbmRlck1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKG1SZWNlaXZlck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY2VpdmVyQ29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKChycyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSAmJiAocnMgIT0gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUykpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicmVnaXN0ZXJTZW5kZXIgLS0gcmV0dXJuZWQgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQzMl90PihycykKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gcnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjZWl2ZXJDb25uZWN0aW9uSWQgPSByZWNlaXZlckNvbm5lY3Rpb25JZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQ7CisgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICBycyA9IG1TZW5kZXJNYW5hZ2VyLT5wb3N0U2VuZCgKKyAgICAgICAgICAgIG1SZWNlaXZlckNvbm5lY3Rpb25JZCwgYnBEYXRhLCAmdHJhbnNhY3Rpb25JZCwgJnRpbWVzdGFtcFVzKTsKKyAgICBpZiAocnMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDbGllbnRNYW5hZ2VyOjpwb3N0U2VuZCAtLSByZXR1cm5lZCBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KHJzKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIHJzOworICAgIH0KKyAgICBpZiAoIWJwTWVzc2FnZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJOdWxsIG91dHB1dCBwYXJhbWV0ZXIgZm9yIEJ1ZmZlclN0YXR1c01lc3NhZ2UuIjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIGJwTWVzc2FnZS0+Y29ubmVjdGlvbklkID0gbVJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgIGJwTWVzc2FnZS0+YnVmZmVySWQgPSBicERhdGEtPm1JZDsKKyAgICBicE1lc3NhZ2UtPnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIGJwTWVzc2FnZS0+dGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICBtTGFzdFNlbnQgPSBub3c7CisgICAgcmV0dXJuIHJzOworfQorCisvLyBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUKK2Jvb2wgb2JqY3B5KAorICAgICAgICBXb3JrQnVuZGxlKiBkLAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyKSB7CisgICAgLy8gYmFzZUJsb2NrcyBob2xkcyBhIGxpc3Qgb2YgQmFzZUJsb2NrIG9iamVjdHMgdGhhdCBCbG9ja3MgY2FuIHJlZmVyIHRvLgorICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+IGJhc2VCbG9ja3M7CisKKyAgICAvLyBiYXNlQmxvY2tJbmRpY2VzIG1hcHMgYSByYXcgcG9pbnRlciB0byBuYXRpdmVfaGFuZGxlX3Qgb3IgQnVmZmVyUG9vbERhdGEKKyAgICAvLyBpbnNpZGUgYmFzZUJsb2NrcyB0byB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBpbnRvIGJhc2VCbG9ja3MuIFRoZSBrZXlzCisgICAgLy8gKHBvaW50ZXJzKSBhcmUgdXNlZCB0byBpZGVudGlmeSBibG9ja3MgdGhhdCBoYXZlIHRoZSBzYW1lICJiYXNlIGJsb2NrIiBpbgorICAgIC8vIHMsIGEgbGlzdCBvZiBDMldvcmsgb2JqZWN0cy4gQmVjYXVzZSBiYXNlQmxvY2tzIHdpbGwgYmUgY29waWVkIGludG8gYQorICAgIC8vIGhpZGxfdmVjIGV2ZW50dWFsbHksIHRoZSB2YWx1ZXMgb2YgYmFzZUJsb2NrSW5kaWNlcyBhcmUgemVyby1iYXNlZAorICAgIC8vIGludGVnZXIgaW5kaWNlcyBpbnN0ZWFkIG9mIGxpc3QgaXRlcmF0b3JzLgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSBwb2ludGVycyBjYW4gYmUgcmF3IGJlY2F1c2UgYmFzZUJsb2NrSW5kaWNlcyBoYXMgYSBzaG9ydGVyCisgICAgLy8gbGlmZXNwYW4gdGhhbiBhbGwgb2YgYmFzZSBibG9ja3MuCisgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiBiYXNlQmxvY2tJbmRpY2VzOworCisgICAgZC0+d29ya3MucmVzaXplKHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgc1dvcmsgOiBzKSB7CisgICAgICAgIFdvcmsgJmRXb3JrID0gZC0+d29ya3NbaSsrXTsKKyAgICAgICAgaWYgKCFzV29yaykgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJOdWxsIEMyV29yayBlbmNvdW50ZXJlZC4iOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGFpbiBpbmZvIGlzIG5vdCBpbiB1c2UgY3VycmVudGx5LgorCisgICAgICAgIC8vIGlucHV0CisgICAgICAgIGlmICghb2JqY3B5KCZkV29yay5pbnB1dCwgc1dvcmstPmlucHV0LAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsICZiYXNlQmxvY2tzLCAmYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJXb3JrOjppbnB1dC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldHMKKyAgICAgICAgaWYgKHNXb3JrLT53b3JrbGV0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiV29yayB3aXRoIG5vIHdvcmtsZXRzLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQYXJjZWwgdGhlIHdvcmtsZXRzLgorICAgICAgICAgICAgaGlkbF92ZWM8V29ya2xldD4gJmRXb3JrbGV0cyA9IGRXb3JrLndvcmtsZXRzOworICAgICAgICAgICAgZFdvcmtsZXRzLnJlc2l6ZShzV29yay0+d29ya2xldHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4mIHNXb3JrbGV0IDogc1dvcmstPndvcmtsZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc1dvcmtsZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJOdWxsIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaiA8PCAiXS4iOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgV29ya2xldCAmZFdvcmtsZXQgPSBkV29ya2xldHNbaisrXTsKKworICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBpZAorICAgICAgICAgICAgICAgIGRXb3JrbGV0LmNvbXBvbmVudElkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQtPmNvbXBvbmVudCk7CisKKyAgICAgICAgICAgICAgICAvLyB0dW5pbmdzCisgICAgICAgICAgICAgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkV29ya2xldC50dW5pbmdzLCBzV29ya2xldC0+dHVuaW5ncykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+dHVuaW5ncy4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmFpbHVyZXMKKyAgICAgICAgICAgICAgICBkV29ya2xldC5mYWlsdXJlcy5yZXNpemUoc1dvcmtsZXQtPmZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgc2l6ZV90IGsgPSAwOworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4mIHNGYWlsdXJlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNXb3JrbGV0LT5mYWlsdXJlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNGYWlsdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrOjp3b3JrbGV0c1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaiAtIDEgPDwgIl0tPmZhaWx1cmVzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBrIDw8ICJdLiI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZFdvcmtsZXQuZmFpbHVyZXNbaysrXSwgKnNGYWlsdXJlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaiAtIDEgPDwgIl0tPmZhaWx1cmVzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgayAtIDEgPDwgIl0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIG91dHB1dAorICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZkV29ya2xldC5vdXRwdXQsIHNXb3JrbGV0LT5vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCAmYmFzZUJsb2NrcywgJmJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJXb3JrOjp3b3JrbGV0c1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaiAtIDEgPDwgIl0tPm91dHB1dC4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldHMgcHJvY2Vzc2VkCisgICAgICAgIGRXb3JrLndvcmtsZXRzUHJvY2Vzc2VkID0gc1dvcmstPndvcmtsZXRzUHJvY2Vzc2VkOworCisgICAgICAgIC8vIHJlc3VsdAorICAgICAgICBkV29yay5yZXN1bHQgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHNXb3JrLT5yZXN1bHQpOworICAgIH0KKworICAgIC8vIENvcHkgc3RkOjpsaXN0PEJhc2VCbG9jaz4gdG8gaGlkbF92ZWM8QmFzZUJsb2NrPi4KKyAgICB7CisgICAgICAgIGQtPmJhc2VCbG9ja3MucmVzaXplKGJhc2VCbG9ja3Muc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICBmb3IgKGNvbnN0IEJhc2VCbG9jayYgYmFzZUJsb2NrIDogYmFzZUJsb2NrcykgeworICAgICAgICAgICAgZC0+YmFzZUJsb2Nrc1tpKytdID0gYmFzZUJsb2NrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworc3RydWN0IEMyQmFzZUJsb2NrIHsKKyAgICBlbnVtIHR5cGVfdCB7CisgICAgICAgIExJTkVBUiwKKyAgICAgICAgR1JBUEhJQywKKyAgICB9OworICAgIHR5cGVfdCB0eXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBsaW5lYXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBncmFwaGljOworfTsKKworLy8gaGlkbF9oYW5kbGUgLT4gQzJGZW5jZQorLy8gTm90ZTogRmlsZSBkZXNjcmlwdG9ycyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IgbXVzdAorLy8gbm90IGJlIGNsb3NlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorYm9vbCBvYmpjcHkoQzJGZW5jZSogZCwgY29uc3QgaGlkbF9oYW5kbGUmIHMpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQuCisgICAgKHZvaWQpczsKKyAgICAqZCA9IEMyRmVuY2UoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJMaW5lYXJCbG9jaywgdmVjdG9yPEMyUGFyYW0qPiwgQzJGZW5jZSAtPiBDMkJ1ZmZlcgorYm9vbCBjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGJ1ZmZlciwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBtZXRhLAorICAgICAgICBjb25zdCBDMkZlbmNlJiBmZW5jZSkgeworICAgIC8vIENoZWNrIHRoZSBibG9jayBtZXRhLiBJdCBzaG91bGQgaGF2ZSBleGFjdGx5IDEgQzJJbmZvOgorICAgIC8vIEMySGlkbF9SYW5nZUluZm8uCisgICAgaWYgKChtZXRhLnNpemUoKSAhPSAxKSB8fCAhbWV0YVswXSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyTGluZWFyQmxvY2s6Om1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWV0YVswXS0+c2l6ZSgpICE9IHNpemVvZihDMkhpZGxfUmFuZ2VJbmZvKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHJhbmdlIGluZm8gaW4gQzJMaW5lYXJCbG9jay4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEMySGlkbF9SYW5nZUluZm8gKnJhbmdlSW5mbyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEMySGlkbF9SYW5nZUluZm8qPihtZXRhWzBdKTsKKworICAgIC8vIENyZWF0ZSBDMkJ1ZmZlciBmcm9tIEMyTGluZWFyQmxvY2suCisgICAgKmJ1ZmZlciA9IEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgcmFuZ2VJbmZvLT5vZmZzZXQsIHJhbmdlSW5mby0+bGVuZ3RoLAorICAgICAgICAgICAgZmVuY2UpKTsKKyAgICBpZiAoISgqYnVmZmVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVMaW5lYXJCdWZmZXIgZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyR3JhcGhpY0Jsb2NrLCB2ZWN0b3I8QzJQYXJhbSo+LCBDMkZlbmNlIC0+IEMyQnVmZmVyCitib29sIGNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGJ1ZmZlciwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiYgYmxvY2ssCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgbWV0YSwKKyAgICAgICAgY29uc3QgQzJGZW5jZSYgZmVuY2UpIHsKKyAgICAvLyBDaGVjayB0aGUgYmxvY2sgbWV0YS4gSXQgc2hvdWxkIGhhdmUgZXhhY3RseSAxIEMySW5mbzoKKyAgICAvLyBDMkhpZGxfUmVjdEluZm8uCisgICAgaWYgKChtZXRhLnNpemUoKSAhPSAxKSB8fCAhbWV0YVswXSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyR3JhcGhpY0Jsb2NrOjptZXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1ldGFbMF0tPnNpemUoKSAhPSBzaXplb2YoQzJIaWRsX1JlY3RJbmZvKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHJlY3QgaW5mbyBpbiBDMkdyYXBoaWNCbG9jay4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEMySGlkbF9SZWN0SW5mbyAqcmVjdEluZm8gPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDMkhpZGxfUmVjdEluZm8qPihtZXRhWzBdKTsKKworICAgIC8vIENyZWF0ZSBDMkJ1ZmZlciBmcm9tIEMyR3JhcGhpY0Jsb2NrLgorICAgICpidWZmZXIgPSBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jay0+c2hhcmUoCisgICAgICAgICAgICBDMlJlY3QocmVjdEluZm8tPndpZHRoLCByZWN0SW5mby0+aGVpZ2h0KS4KKyAgICAgICAgICAgIGF0KHJlY3RJbmZvLT5sZWZ0LCByZWN0SW5mby0+dG9wKSwKKyAgICAgICAgICAgIGZlbmNlKSk7CisgICAgaWYgKCEoKmJ1ZmZlcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ3JlYXRlR3JhcGhpY0J1ZmZlciBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQnVmZmVyIC0+IEMyQnVmZmVyCisvLyBOb3RlOiBUaGUgbmF0aXZlIGhhbmRsZXMgd2lsbCBiZSBjbG9uZWQuCitib29sIG9iamNweShzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+KiBkLCBjb25zdCBCdWZmZXImIHMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQmFzZUJsb2NrPiYgYmFzZUJsb2NrcykgeworICAgICpkID0gbnVsbHB0cjsKKworICAgIC8vIEN1cnJlbnRseSwgYSBub24tbnVsbCBDMkJ1ZmZlciBtdXN0IGNvbnRhaW4gZXhhY3RseSAxIGJsb2NrLgorICAgIGlmIChzLmJsb2Nrcy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHMuYmxvY2tzLnNpemUoKSAhPSAxKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgIkN1cnJlbnRseSwgYSBDMkJ1ZmZlciBtdXN0IGNvbnRhaW4gZXhhY3RseSAxIGJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBCbG9jayAmc0Jsb2NrID0gcy5ibG9ja3NbMF07CisgICAgaWYgKHNCbG9jay5pbmRleCA+PSBiYXNlQmxvY2tzLnNpemUoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLmluZGV4OiAiCisgICAgICAgICAgICAgICAgICAgICAgIkFycmF5IGluZGV4IG91dCBvZiByYW5nZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMyQmFzZUJsb2NrICZiYXNlQmxvY2sgPSBiYXNlQmxvY2tzW3NCbG9jay5pbmRleF07CisKKyAgICAvLyBQYXJzZSBtZXRhLgorICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBzQmxvY2tNZXRhOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZzQmxvY2tNZXRhLCBzQmxvY2subWV0YSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBCdWZmZXI6OmJsb2Nrc1swXS5tZXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb3B5IGZlbmNlLgorICAgIEMyRmVuY2UgZEZlbmNlOworICAgIGlmICghb2JqY3B5KCZkRmVuY2UsIHNCbG9jay5mZW5jZSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBCdWZmZXI6OmJsb2Nrc1swXS5mZW5jZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ29uc3RydWN0IGEgYmxvY2suCisgICAgc3dpdGNoIChiYXNlQmxvY2sudHlwZSkgeworICAgIGNhc2UgQzJCYXNlQmxvY2s6OkxJTkVBUjoKKyAgICAgICAgaWYgKCFjcmVhdGVMaW5lYXJCdWZmZXIoZCwgYmFzZUJsb2NrLmxpbmVhciwgc0Jsb2NrTWV0YSwgZEZlbmNlKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJhc2VCbG9jazo6bGluZWFyLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkJhc2VCbG9jazo6R1JBUEhJQzoKKyAgICAgICAgaWYgKCFjcmVhdGVHcmFwaGljQnVmZmVyKGQsIGJhc2VCbG9jay5ncmFwaGljLCBzQmxvY2tNZXRhLCBkRmVuY2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjpncmFwaGljLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJhc2VCbG9jazo6dHlwZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUGFyc2UgaW5mbworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtcywgcy5pbmZvKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6aW5mby4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoQzJQYXJhbSogcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKHBhcmFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgcGFyYW0gaW4gQnVmZmVyOjppbmZvLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGMycGFyYW17CisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW0pLnJlbGVhc2UoKX07CisgICAgICAgIGlmICghYzJwYXJhbSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBwYXJhbSBpbiBCdWZmZXI6OmluZm8uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICgqZCktPnNldEluZm8oc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMySW5mbz4oYzJwYXJhbSkpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDMkJ1ZmZlcjo6c2V0SW5mbyBmYWlsZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBGcmFtZURhdGEgLT4gQzJGcmFtZURhdGEKK2Jvb2wgb2JqY3B5KEMyRnJhbWVEYXRhKiBkLCBjb25zdCBGcmFtZURhdGEmIHMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQmFzZUJsb2NrPiYgYmFzZUJsb2NrcykgeworICAgIGQtPmZsYWdzID0gc3RhdGljX2Nhc3Q8QzJGcmFtZURhdGE6OmZsYWdzX3Q+KHMuZmxhZ3MpOworICAgIGlmICghb2JqY3B5KCZkLT5vcmRpbmFsLCBzLm9yZGluYWwpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRnJhbWVEYXRhOjpvcmRpbmFsLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+YnVmZmVycy5jbGVhcigpOworICAgIGQtPmJ1ZmZlcnMucmVzZXJ2ZShzLmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IEJ1ZmZlciYgc0J1ZmZlciA6IHMuYnVmZmVycykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGRCdWZmZXI7CisgICAgICAgIGlmICghb2JqY3B5KCZkQnVmZmVyLCBzQnVmZmVyLCBiYXNlQmxvY2tzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGcmFtZURhdGE6OmJ1ZmZlcnMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkLT5idWZmZXJzLmVtcGxhY2VfYmFjayhkQnVmZmVyKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1zOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbXMsIHMuY29uZmlnVXBkYXRlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZyYW1lRGF0YTo6Y29uZmlnVXBkYXRlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+Y29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgZm9yIChDMlBhcmFtKiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBkLT5jb25maWdVcGRhdGUuZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CisgICAgICAgIGlmICghZC0+Y29uZmlnVXBkYXRlLmJhY2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5leHBlY3RlZCBlcnJvciB3aGlsZSBwYXJzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyYW1lRGF0YTo6Y29uZmlnVXBkYXRlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBvbmNlIEMySW5mb0J1ZmZlciBoYXMgY29uc3RydWN0b3JzLgorICAgIGQtPmluZm9CdWZmZXJzLmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEJhc2VCbG9jayAtPiBDMkJhc2VCbG9jaworYm9vbCBvYmpjcHkoQzJCYXNlQmxvY2sqIGQsIGNvbnN0IEJhc2VCbG9jayYgcykgeworICAgIHN3aXRjaCAocy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICBjYXNlIEJhc2VCbG9jazo6aGlkbF9kaXNjcmltaW5hdG9yOjpuYXRpdmVCbG9jazogeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBzSGFuZGxlID0KKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9uZShzLm5hdGl2ZUJsb2NrKCkpOworICAgICAgICAgICAgaWYgKHNIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgQmFzZUJsb2NrOjpuYXRpdmVCbG9jay4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpzQzJIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEMySGFuZGxlKj4oc0hhbmRsZSk7CisKKyAgICAgICAgICAgIGQtPmxpbmVhciA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soc0MySGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChkLT5saW5lYXIpIHsKKyAgICAgICAgICAgICAgICBkLT50eXBlID0gQzJCYXNlQmxvY2s6OkxJTkVBUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZC0+Z3JhcGhpYyA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKHNDMkhhbmRsZSk7CisgICAgICAgICAgICBpZiAoZC0+Z3JhcGhpYykgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6R1JBUEhJQzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBoYW5kbGUgdHlwZSBpbiBCYXNlQmxvY2s6Om5hdGl2ZUJsb2NrLiI7CisgICAgICAgICAgICBpZiAoc0hhbmRsZSkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2Uoc0hhbmRsZSk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoc0hhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICBjYXNlIEJhc2VCbG9jazo6aGlkbF9kaXNjcmltaW5hdG9yOjpwb29sZWRCbG9jazogeworICAgICAgICAgICAgY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmYnBNZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgcy5wb29sZWRCbG9jaygpOworICAgICAgICAgICAgc3A8Q2xpZW50TWFuYWdlcj4gYnAgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBicERhdGE7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGU7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgYnBTdGF0dXMgPSBicC0+cmVjZWl2ZSgKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIGJwTWVzc2FnZS5idWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLnRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAmY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgJmJwRGF0YSk7CisgICAgICAgICAgICBpZiAoYnBTdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWNlaXZlIGJ1ZmZlciBmcm9tIGJ1ZmZlcnBvb2wgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdFN0YXR1cyA9ICIgPDwgdW5kZXJseWluZ192YWx1ZShicFN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFicERhdGEpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBkYXRhIGluIGJ1ZmZlcnBvb2wgdHJhbnNhY3Rpb24uIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGQtPmxpbmVhciA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soY0hhbmRsZSwgYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChkLT5saW5lYXIpIHsKKyAgICAgICAgICAgICAgICBkLT50eXBlID0gQzJCYXNlQmxvY2s6OkxJTkVBUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZC0+Z3JhcGhpYyA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGNIYW5kbGUsIGJwRGF0YSk7CisgICAgICAgICAgICBpZiAoZC0+Z3JhcGhpYykgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6R1JBUEhJQzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBoYW5kbGUgdHlwZSBpbiBCYXNlQmxvY2s6OnBvb2xlZEJsb2NrLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coRVJST1IpIDw8ICJVbnJlY29nbml6ZWQgQmFzZUJsb2NrJ3MgZGlzY3JpbWluYXRvciB3aXRoICIKKyAgICAgICAgICAgICAgICAgICA8PCAidW5kZXJseWluZyB2YWx1ZSAiCisgICAgICAgICAgICAgICAgICAgPDwgdW5kZXJseWluZ192YWx1ZShzLmdldERpc2NyaW1pbmF0b3IoKSkgPDwgIi4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYm9vbCBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogZCwgY29uc3QgV29ya0J1bmRsZSYgcykgeworICAgIC8vIENvbnZlcnQgQmFzZUJsb2NrcyB0byBDMkJhc2VCbG9ja3MuCisgICAgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+IGRCYXNlQmxvY2tzKHMuYmFzZUJsb2Nrcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcy5iYXNlQmxvY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghb2JqY3B5KCZkQmFzZUJsb2Nrc1tpXSwgcy5iYXNlQmxvY2tzW2ldKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrQnVuZGxlOjpiYXNlQmxvY2tzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgZC0+Y2xlYXIoKTsKKyAgICBmb3IgKGNvbnN0IFdvcmsmIHNXb3JrIDogcy53b3JrcykgeworICAgICAgICBkLT5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxDMldvcms+KCkpOworICAgICAgICBDMldvcmsmIGRXb3JrID0gKmQtPmJhY2soKTsKKworICAgICAgICAvLyBjaGFpbiBpbmZvIGlzIG5vdCBpbiB1c2UgY3VycmVudGx5LgorCisgICAgICAgIC8vIGlucHV0CisgICAgICAgIGlmICghb2JqY3B5KCZkV29yay5pbnB1dCwgc1dvcmsuaW5wdXQsIGRCYXNlQmxvY2tzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrOjppbnB1dC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldChzKQorICAgICAgICBkV29yay53b3JrbGV0cy5jbGVhcigpOworICAgICAgICBmb3IgKGNvbnN0IFdvcmtsZXQmIHNXb3JrbGV0IDogc1dvcmsud29ya2xldHMpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+IGRXb3JrbGV0ID0gc3RkOjptYWtlX3VuaXF1ZTxDMldvcmtsZXQ+KCk7CisKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBpZAorICAgICAgICAgICAgZFdvcmtsZXQtPmNvbXBvbmVudCA9IHN0YXRpY19jYXN0PGMyX25vZGVfaWRfdD4oCisgICAgICAgICAgICAgICAgICAgIHNXb3JrbGV0LmNvbXBvbmVudElkKTsKKworICAgICAgICAgICAgLy8gdHVuaW5ncworICAgICAgICAgICAgaWYgKCFjb3B5UGFyYW1zRnJvbUJsb2IoJmRXb3JrbGV0LT50dW5pbmdzLCBzV29ya2xldC50dW5pbmdzKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgV29ya2xldDo6dHVuaW5ncyI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmYWlsdXJlcworICAgICAgICAgICAgZFdvcmtsZXQtPmZhaWx1cmVzLmNsZWFyKCk7CisgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMucmVzZXJ2ZShzV29ya2xldC5mYWlsdXJlcy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChjb25zdCBTZXR0aW5nUmVzdWx0JiBzRmFpbHVyZSA6IHNXb3JrbGV0LmZhaWx1cmVzKSB7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gZEZhaWx1cmU7CisgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmRGYWlsdXJlLCBzRmFpbHVyZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrbGV0OjpmYWlsdXJlcy4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRXb3JrbGV0LT5mYWlsdXJlcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGRGYWlsdXJlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG91dHB1dAorICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrbGV0LT5vdXRwdXQsIHNXb3JrbGV0Lm91dHB1dCwgZEJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrbGV0OjpvdXRwdXQuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRXb3JrLndvcmtsZXRzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZFdvcmtsZXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdvcmtsZXRzUHJvY2Vzc2VkCisgICAgICAgIGRXb3JrLndvcmtsZXRzUHJvY2Vzc2VkID0gc1dvcmsud29ya2xldHNQcm9jZXNzZWQ7CisKKyAgICAgICAgLy8gcmVzdWx0CisgICAgICAgIGRXb3JrLnJlc3VsdCA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzV29yay5yZXN1bHQpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitjb25zdGV4cHIgc2l6ZV90IFBBUkFNU19BTElHTk1FTlQgPSA4OyAgLy8gNjQtYml0IGFsaWdubWVudAorc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMlBhcmFtKSA9PSAwLCAiQzJQYXJhbSBhbGlnbm1lbnQgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUEFSQU1TX0FMSUdOTUVOVCAlIGFsaWdub2YoQzJJbmZvKSA9PSAwLCAiQzJQYXJhbSBhbGlnbm1lbnQgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUEFSQU1TX0FMSUdOTUVOVCAlIGFsaWdub2YoQzJUdW5pbmcpID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworCisvLyBQYXJhbXMgLT4gc3RkOjp2ZWN0b3I8QzJQYXJhbSo+Citib29sIHBhcnNlUGFyYW1zQmxvYihzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpIHsKKyAgICAvLyBhc3N1bWluZyBibG9iIGlzIGNvbnN0IGhlcmUKKyAgICBzaXplX3Qgc2l6ZSA9IGJsb2Iuc2l6ZSgpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJsb2IuZGF0YSgpOworICAgIEMyUGFyYW0gKnAgPSBudWxscHRyOworCisgICAgZG8geworICAgICAgICBwID0gQzJQYXJhbVV0aWxzOjpQYXJzZUZpcnN0KGRhdGEgKyBpeCwgc2l6ZSAtIGl4KTsKKyAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgIHBhcmFtcy0+ZW1wbGFjZV9iYWNrKHApOworICAgICAgICAgICAgaXggKz0gcC0+c2l6ZSgpOworICAgICAgICAgICAgaXggPSBhbGlnbihpeCwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChwKTsKKworICAgIGlmIChpeCAhPSBzaXplKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInBhcnNlUGFyYW1zQmxvYiAtLSBpbmNvbnNpc3RlbnQgc2l6ZXMuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvKioKKyAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgQzJQYXJhbXMgaW50byBhIHBhcmFtcyBibG9iLiBUIGlzIGEgY29udGFpbmVyIHR5cGUKKyAqIHdob3NlIG1lbWJlciB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCBDMlBhcmFtKi4KKyAqCisgKiBccGFyYW1bb3V0XSBibG9iIHRhcmdldCBibG9iCisgKiBccGFyYW1baW5dIHBhcmFtcyBwYXJhbWV0ZXJzIHRvIGNvbmNhdGVuYXRlCisgKiBccmV0dmFsIEMyX09LIGlmIHRoZSBibG9iIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZAorICogXHJldHZhbCBDMl9CQURfVkFMVUUgaWYgdGhlIGJsb2Igd2FzIG5vdCBzdWNjZXNzZnVsIGNyZWF0ZWQgKHRoaXMgb25seQorICogICAgICAgICBoYXBwZW5zIGlmIHRoZSBwYXJhbWV0ZXJzIHdlcmUgbm90IGNvbnN0KQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgX2NyZWF0ZVBhcmFtc0Jsb2IoaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsIGNvbnN0IFQgJnBhcmFtcykgeworICAgIC8vIGFzc3VtaW5nIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBjb25zdAorICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IHAtPnNpemUoKTsKKyAgICAgICAgc2l6ZSA9IGFsaWduKHNpemUsIFBBUkFNU19BTElHTk1FTlQpOworICAgIH0KKyAgICBibG9iLT5yZXNpemUoc2l6ZSk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBORVZFUiBvdmVyd3JpdGUgZXZlbiBpZiBwYXJhbSB2YWx1ZXMgKGUuZy4gc2l6ZSkgY2hhbmdlZAorICAgICAgICBzaXplX3QgcGFyYW1TaXplID0gc3RkOjptaW4ocC0+c2l6ZSgpLCBzaXplIC0gaXgpOworICAgICAgICBzdGQ6OmNvcHkoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJipwKSwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmKnApICsgcGFyYW1TaXplLAorICAgICAgICAgICAgICAgICYoKmJsb2IpW2l4XSk7CisgICAgICAgIGl4ICs9IHBhcmFtU2l6ZTsKKyAgICAgICAgaXggPSBhbGlnbihpeCwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgfQorICAgIGJsb2ItPnJlc2l6ZShpeCk7CisgICAgaWYgKGl4ICE9IHNpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlUGFyYW1zQmxvYiAtLSBpbmNvbnNpc3RlbnQgc2l6ZXMuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgY3JlYXRlIGEgdmVjdG9yIG9mIG5ldyBUIG9iamVjdHMgdGhhdCBjb250YWluIGNvcGllcworICogb2YgdGhlIHBhcmFtcyBpbiB0aGUgYmxvYi4gVCBpcyBDMlBhcmFtIG9yIGl0cyBjb21wYXRpYmxlIGRlcml2ZWQgY2xhc3MuCisgKgorICogXHBhcmFtW291dF0gcGFyYW1zIHRoZSByZXN1bHRpbmcgdmVjdG9yCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkIGFuZCBwYXJhbXMgd2FzIGNvbnN0cnVjdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIF9jb3B5UGFyYW1zRnJvbUJsb2IoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpIHsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBibG9iKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb3B5UGFyYW1zRnJvbUJsb2IgLS0gZmFpbGVkIHRvIHBhcnNlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwYXJhbXMtPnJlc2l6ZShwYXJhbVBvaW50ZXJzLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoQzJQYXJhbSogY29uc3QmIHBhcmFtUG9pbnRlciA6IHBhcmFtUG9pbnRlcnMpIHsKKyAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImNvcHlQYXJhbXNGcm9tQmxvYiAtLSBudWxsIHBhcmFtUG9pbnRlci4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICgqcGFyYW1zKVtpKytdLnJlc2V0KHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoKnBhcmFtUG9pbnRlcikucmVsZWFzZSgpKSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIHN0ZDo6dmVjdG9yPGNvbnN0IEMyUGFyYW0qPiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEMyUGFyYW0qPiAmcGFyYW1zKSB7CisgICAgcmV0dXJuIF9jcmVhdGVQYXJhbXNCbG9iKGJsb2IsIHBhcmFtcyk7Cit9CisKKy8vIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zKSB7CisgICAgcmV0dXJuIF9jcmVhdGVQYXJhbXNCbG9iKGJsb2IsIHBhcmFtcyk7Cit9CisKKy8vIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gLT4gUGFyYW1zCitib29sIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4gLT4gUGFyYW1zCitib29sIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiAmcGFyYW1zKSB7CisgICAgcmV0dXJuIF9jcmVhdGVQYXJhbXNCbG9iKGJsb2IsIHBhcmFtcyk7Cit9CisKKy8vIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiAmcGFyYW1zKSB7CisgICAgcmV0dXJuIF9jcmVhdGVQYXJhbXNCbG9iKGJsb2IsIHBhcmFtcyk7Cit9CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYikgeworICAgIHJldHVybiBfY29weVBhcmFtc0Zyb21CbG9iKHBhcmFtcywgYmxvYik7Cit9CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PgorYm9vbCBjb3B5UGFyYW1zRnJvbUJsb2IoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKSB7CisgICAgcmV0dXJuIF9jb3B5UGFyYW1zRnJvbUJsb2IocGFyYW1zLCBibG9iKTsKK30KKworLy8gUGFyYW1zIC0+IHVwZGF0ZSBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+Citib29sIHVwZGF0ZVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgY29uc3QgUGFyYW1zJiBibG9iKSB7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBDMlBhcmFtKj4gaW5kZXgycGFyYW07CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFwYXJhbSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gbnVsbCBvdXRwdXQgcGFyYW0uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXgycGFyYW0uZmluZChwYXJhbS0+aW5kZXgoKSkgPT0gaW5kZXgycGFyYW0uZW5kKCkpIHsKKyAgICAgICAgICAgIGluZGV4MnBhcmFtLmVtcGxhY2UocGFyYW0tPmluZGV4KCksIHBhcmFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBibG9iKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBmYWlsZWQgdG8gcGFyc2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoQzJQYXJhbSogY29uc3QmIHBhcmFtUG9pbnRlciA6IHBhcmFtUG9pbnRlcnMpIHsKKyAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIG51bGwgaW5wdXQgcGFyYW0uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkZWNsdHlwZShpbmRleDJwYXJhbSk6Oml0ZXJhdG9yIGkgPSBpbmRleDJwYXJhbS5maW5kKAorICAgICAgICAgICAgICAgIHBhcmFtUG9pbnRlci0+aW5kZXgoKSk7CisgICAgICAgIGlmIChpID09IGluZGV4MnBhcmFtLmVuZCgpKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBpbmRleCAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtUG9pbnRlci0+aW5kZXgoKSA8PCAiIG5vdCBmb3VuZC4gU2tpcHBpbmcuLi4iOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpLT5zZWNvbmQtPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIHNpemUgbWlzbWF0Y2g6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1zLnNpemUoKSA8PCAiIHZzICIgPDwgcGFyYW1Qb2ludGVyLT5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAoaW5kZXggPSAiIDw8IGktPmZpcnN0IDw8ICIpLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIENvbnZlcnQgQnVmZmVyUG9vbCBSZXN1bHRTdGF0dXMgdG8gYzJfc3RhdHVzX3QuCitjMl9zdGF0dXNfdCB0b0MyU3RhdHVzKFJlc3VsdFN0YXR1cyBycykgeworICAgIHN3aXRjaCAocnMpIHsKKyAgICBjYXNlIFJlc3VsdFN0YXR1czo6T0s6CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICBjYXNlIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOgorICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzoKKyAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICBjYXNlIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOgorICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coV0FSTklORykgPDwgIlVucmVjb2duaXplZCBCdWZmZXJQb29sIFJlc3VsdFN0YXR1czogIgorICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocnMpIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gQ3JlYXRlIGEgR3JhcGhpY0J1ZmZlciBvYmplY3QgZnJvbSBhIGdyYXBoaWMgYmxvY2suCitzcDxHcmFwaGljQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKSB7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGZvcm1hdDsKKyAgICB1aW50NjRfdCB1c2FnZTsKKyAgICB1aW50MzJfdCBzdHJpZGU7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBicUlkOworICAgIGludDMyX3QgYnFTbG90OworICAgIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgICAgICBibG9jay5oYW5kbGUoKSwgJndpZHRoLCAmaGVpZ2h0LCAmZm9ybWF0LCAmdXNhZ2UsCisgICAgICAgICAgICAmc3RyaWRlLCAmZ2VuZXJhdGlvbiwgJmJxSWQsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigmYnFTbG90KSk7CisgICAgbmF0aXZlX2hhbmRsZV90ICpncmFsbG9jSGFuZGxlID0KKyAgICAgICAgICAgIFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoYmxvY2suaGFuZGxlKCkpOworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPQorICAgICAgICAgICAgbmV3IEdyYXBoaWNCdWZmZXIoZ3JhbGxvY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OkNMT05FX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHVzYWdlLCBzdHJpZGUpOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGdyYWxsb2NIYW5kbGUpOworICAgIHJldHVybiBncmFwaGljQnVmZmVyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tQcm9jZXNzb3I+Cit2b2lkIGZvckVhY2hCbG9jayhDMkZyYW1lRGF0YSYgZnJhbWVEYXRhLAorICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcykgeworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyIDogZnJhbWVEYXRhLmJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayA6CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3MoYmxvY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tQcm9jZXNzb3I+Cit2b2lkIGZvckVhY2hCbG9jayhjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgIEJsb2NrUHJvY2Vzc29yIHByb2Nlc3MsCisgICAgICAgICAgICAgICAgICBib29sIHByb2Nlc3NJbnB1dCwgYm9vbCBwcm9jZXNzT3V0cHV0KSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtMaXN0KSB7CisgICAgICAgIGlmICghd29yaykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2Nlc3NJbnB1dCkgeworICAgICAgICAgICAgZm9yRWFjaEJsb2NrKHdvcmstPmlucHV0LCBwcm9jZXNzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvY2Vzc091dHB1dCkgeworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiYgd29ya2xldCA6IHdvcmstPndvcmtsZXRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHdvcmtsZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yRWFjaEJsb2NrKHdvcmtsZXQtPm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0SGdicChjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCkgeworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICAgICAgaWdicC0+Z2V0SGFsSW50ZXJmYWNlPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KCk7CisgICAgcmV0dXJuIGhnYnAgPyBoZ2JwIDoKKyAgICAgICAgICAgIG5ldyBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPihpZ2JwKTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitzdGF0dXNfdCBhdHRhY2hUb0J1ZmZlclF1ZXVlKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KSB7CisgICAgaWYgKCFpZ2JwKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBudWxsIHByb2R1Y2VyLiI7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrKTsKKyAgICBncmFwaGljQnVmZmVyLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb24pOworCisgICAgTE9HKFZFUkJPU0UpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIGF0dGFjaGluZyBidWZmZXI6IgorICAgICAgICAgICAgPDwgIiBibG9jayBkaW1lbnNpb24gIiA8PCBibG9jay53aWR0aCgpIDw8ICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBibG9jay5oZWlnaHQoKQorICAgICAgICAgICAgPDwgIiwgZ3JhcGhpY0J1ZmZlciBkaW1lbnNpb24gIiA8PCBncmFwaGljQnVmZmVyLT5nZXRXaWR0aCgpIDw8ICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdyYXBoaWNCdWZmZXItPmdldEhlaWdodCgpCisgICAgICAgICAgICA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKQorICAgICAgICAgICAgPDwgIiwgZm9ybWF0IDB4IiA8PCBzdGQ6OnNldHcoOCkgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0UGl4ZWxGb3JtYXQoKQorICAgICAgICAgICAgPDwgIiwgdXNhZ2UgMHgiIDw8IHN0ZDo6c2V0dygxNikgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0VXNhZ2UoKQorICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJykKKyAgICAgICAgICAgIDw8ICIsIHN0cmlkZSAiIDw8IGdyYXBoaWNCdWZmZXItPmdldFN0cmlkZSgpCisgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpOworCisgICAgc3RhdHVzX3QgcmVzdWx0ID0gaWdicC0+YXR0YWNoQnVmZmVyKGJxU2xvdCwgZ3JhcGhpY0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBMT0coV0FSTklORykgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoQnVmZmVyIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0YXR1cyA9ICIgPDwgcmVzdWx0IDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgTE9HKFZFUkJPU0UpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIGF0dGFjaEJ1ZmZlciByZXR1cm5lZCBzbG90ICMiCisgICAgICAgICAgICAgICAgIDw8ICpicVNsb3QgPDwgIi4iOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KSB7CisgICAgcmV0dXJuIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayksCisgICAgICAgICAgICBnZW5lcmF0aW9uLCBicUlkLCBicVNsb3QpOworfQorCitib29sIHlpZWxkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOworICAgIGlmIChkYXRhICYmIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKGRhdGEpKSB7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6WWllbGRCbG9ja1RvQnVmZmVyUXVldWUoZGF0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgeWllbGRCdWZmZXJRdWV1ZUJsb2NrcygKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0LCBib29sIHByb2Nlc3NPdXRwdXQpIHsKKyAgICBmb3JFYWNoQmxvY2sod29ya0xpc3QsIHlpZWxkQnVmZmVyUXVldWVCbG9jaywgcHJvY2Vzc0lucHV0LCBwcm9jZXNzT3V0cHV0KTsKK30KKworYm9vbCBob2xkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24pIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gZGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKTsKKyAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IG9sZEdlbmVyYXRpb247CisgICAgdWludDY0X3Qgb2xkSWQ7CisgICAgaW50MzJfdCBvbGRTbG90OworICAgIC8vIElmIHRoZSBibG9jayBpcyBub3QgYnVmZmVycXVldWUtYmFzZWQsIGRvIG5vdGhpbmcuCisgICAgaWYgKCFfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgIGRhdGEsICZvbGRHZW5lcmF0aW9uLCAmb2xkSWQsICZvbGRTbG90KSB8fAorICAgICAgICAgICAgKG9sZElkID09IDApKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgYmxvY2sncyBicUlkIGlzIHRoZSBzYW1lIGFzIHRoZSBkZXNpcmVkIGJxSWQsIGp1c3QgaG9sZC4KKyAgICBpZiAoKG9sZElkID09IGJxSWQpICYmIChvbGRHZW5lcmF0aW9uID09IGdlbmVyYXRpb24pKSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiaG9sZEJ1ZmZlclF1ZXVlQmxvY2sgLS0gaW1wb3J0IHdpdGhvdXQgYXR0YWNoaW5nOiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgYnFJZCAiIDw8IG9sZElkCisgICAgICAgICAgICAgICAgICAgICA8PCAiLCBicVNsb3QgIiA8PCBvbGRTbG90CisgICAgICAgICAgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZShkYXRhLCBnZXRIZ2JwKGlnYnApKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCBhdHRhY2ggdG8gdGhlIGdpdmVuIGlnYnAsIHdoaWNoIG11c3Qgbm90IGJlIG51bGwuCisgICAgaWYgKCFpZ2JwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGJxU2xvdDsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBhdHRhY2hUb0J1ZmZlclF1ZXVlKGJsb2NrLCBpZ2JwLCBnZW5lcmF0aW9uLCAmYnFTbG90KTsKKworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiaG9sZEJ1ZmZlclF1ZXVlQmxvY2sgLS0gZmFpbCB0byBhdHRhY2g6IgorICAgICAgICAgICAgICAgICAgIDw8ICIgdGFyZ2V0IGJxSWQgIiA8PCBicUlkCisgICAgICAgICAgICAgICAgICAgPDwgIiwgZ2VuZXJhdGlvbiAiIDw8IGdlbmVyYXRpb24KKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMT0coVkVSQk9TRSkgPDwgImhvbGRCdWZmZXJRdWV1ZUJsb2NrIC0tIGF0dGFjaGVkOiIKKyAgICAgICAgICAgICAgICAgPDwgIiBicUlkICIgPDwgYnFJZAorICAgICAgICAgICAgICAgICA8PCAiLCBicVNsb3QgIiA8PCBicVNsb3QKKyAgICAgICAgICAgICAgICAgPDwgIiwgZ2VuZXJhdGlvbiAiIDw8IGdlbmVyYXRpb24KKyAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgIF9DMkJsb2NrRmFjdG9yeTo6QXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgZGF0YSwgZ2V0SGdicChpZ2JwKSwgZ2VuZXJhdGlvbiwgYnFJZCwgYnFTbG90LCB0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBob2xkQnVmZmVyUXVldWVCbG9ja3MoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JJbnB1dCkgeworICAgIGZvckVhY2hCbG9jayh3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKGhvbGRCdWZmZXJRdWV1ZUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xLCBpZ2JwLCBicUlkLCBnZW5lcmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgZm9ySW5wdXQsICFmb3JJbnB1dCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTCkBAIC0wLDAgKzEsOSBAQAorIyBNZWRpYSB0ZWFtCitsYWpvc0Bnb29nbGUuY29tCitwYXdpbkBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KKworIyBWVFMgdGVhbQoreWltQGdvb2dsZS5jb20KK3podW95YW9AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODc3NTRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAiLAorICAgICAgICAvLyJtZWRpYV9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmNwcCIKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwIiwKKyAgICAgICAgLy8ibWVkaWFfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5jcHAiCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTk0N2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCkBAIC0wLDAgKzEsOTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyX2hpZGxfaGFsX2F1ZGlvX2RlY190ZXN0IgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5oIgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RydWN0IEZyYW1lSW5mbyB7CisgICAgaW50IGJ5dGVzQ291bnQ7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7Cit9OworCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBBdWRpbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJBdWRpb0RlY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0geworICAgICAgICAgICAgeyJ4YWFjIiwgeGFhY30sCisgICAgICAgICAgICB7Im1wMyIsIG1wM30sCisgICAgICAgICAgICB7ImFtcm5iIiwgYW1ybmJ9LAorICAgICAgICAgICAgeyJhbXJ3YiIsIGFtcndifSwKKyAgICAgICAgICAgIHsiYWFjIiwgYWFjfSwKKyAgICAgICAgICAgIHsidm9yYmlzIiwgdm9yYmlzfSwKKyAgICAgICAgICAgIHsib3B1cyIsIG9wdXN9LAorICAgICAgICAgICAgeyJwY20iLCBwY219LAorICAgICAgICAgICAgeyJnNzExLmFsYXciLCBnNzExYWxhd30sCisgICAgICAgICAgICB7Imc3MTEubWxhdyIsIGc3MTFtbGF3fSwKKyAgICAgICAgICAgIHsiZ3NtIiwgZ3NtfSwKKyAgICAgICAgICAgIHsicmF3IiwgcmF3fSwKKyAgICAgICAgICAgIHsiZmxhYyIsIGZsYWN9LAorICAgICAgICB9OworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3Vic3RyaW5nOworICAgICAgICBzdGQ6OnN0cmluZyBjb21wOworICAgICAgICBzdWJzdHJpbmcgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIC8qIFRPRE86IGJldHRlciBhcHByb2FjaCB0byBmaW5kIHRoZSBjb21wb25lbnQgKi8KKyAgICAgICAgLyogImMyLmFuZHJvaWQuIiA9PiAxMXRoIHBvc2l0aW9uICovCisgICAgICAgIHNpemVfdCBwb3MgPSAxMTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN1YnN0cmluZy5maW5kKCIuZGVjb2RlciIsIHBvcyk7CisgICAgICAgIGNvbXAgPSBzdWJzdHJpbmcuc3Vic3RyKHBvcywgbGVuIC0gcG9zKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtVGltZXN0YW1wVXMgPSAwdTsKKyAgICAgICAgbVRpbWVzdGFtcERldlRlc3QgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKworICAgIHN0cnVjdCBvdXRwdXRNZXRhRGF0YSB7CisgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgICAgICB1aW50MzJfdCByYW5nZUxlbmd0aDsKKyAgICB9OworICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIEZvciBkZWNvZGVyIGNvbXBvbmVudHMgY3VycmVudCB0aW1lc3RhbXAgYWx3YXlzIGV4Y2VlZHMKKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gKCh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCk7CisgICAgICAgICAgICAgICAgaWYgKCFjb2RlY0NvbmZpZyAmJgorICAgICAgICAgICAgICAgICAgICAhd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfR0Uod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMpOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJhbmdlTGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzWzBdLT5kYXRhKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpLmNhcGFjaXR5KCk7CisgICAgICAgICAgICAgICAgICAgIC8vTGlzdCBvZiB0aW1lc3RhbXAgdmFsdWVzIGFuZCBvdXRwdXQgc2l6ZSB0byBjYWxjdWxhdGUgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TWV0YURhdGEgbWV0YSA9IHttVGltZXN0YW1wVXMsIHJhbmdlTGVuZ3RofTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9CdWZmZXJNZXRhRGF0YS5wdXNoX2JhY2sobWV0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBtQ3NkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgICAgICh2b2lkKW1Dc2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIHhhYWMsCisgICAgICAgIG1wMywKKyAgICAgICAgYW1ybmIsCisgICAgICAgIGFtcndiLAorICAgICAgICBhYWMsCisgICAgICAgIHZvcmJpcywKKyAgICAgICAgb3B1cywKKyAgICAgICAgcGNtLAorICAgICAgICBnNzExYWxhdywKKyAgICAgICAgZzcxMW1sYXcsCisgICAgICAgIGdzbSwKKyAgICAgICAgcmF3LAorICAgICAgICBmbGFjLAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBib29sIG1UaW1lc3RhbXBEZXZUZXN0OworICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CisgICAgdWludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1UaW1lc3RhbXBVc2xpc3Q7CisgICAgOjphbmRyb2lkOjpMaXN0PG91dHB1dE1ldGFEYXRhPiBvQnVmZmVyTWV0YURhdGE7CisKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KK307CisKK3ZvaWQgdmFsaWRhdGVDb21wb25lbnQoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGl0cyBub3QgYW4gZW5jb2RlciBhbmQgdGhlIGNvbXBvbmVudCB0byBiZSB0ZXN0ZWQgaXMgYXVkaW8KKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBEZWNvZGVyLCBnaXZlbiBFbmNvZGVyIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBjMmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXREb21haW4gPQorICAgICAgICAgICAgKChDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0RG9tYWluLmZpbmQoImF1ZGlvLyIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgQXVkaW8gQ29tcG9uZW50Iik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKKyAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7CisgICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOworfQorCisvLyBTZXQgRGVmYXVsdCBjb25maWcgcGFyYW0uCitib29sIHNldHVwQ29uZmlnUGFyYW0oCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIGludDMyX3QqIGJpdFN0cmVhbUluZm8pIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBiaXRTdHJlYW1JbmZvWzBdKTsKKyAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBiaXRTdHJlYW1JbmZvWzFdKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbXsmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvfTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICBjb21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGZhaWx1cmVzLnNpemUoKSA9PSAwdSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBJbiBkZWNvZGVyIGNvbXBvbmVudHMsIG9mdGVuIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGdldCB1cGRhdGVkIHVwb24KKy8vIHBhcnNpbmcgdGhlIGhlYWRlciBvZiBlbGVtZW50YXJ5IHN0cmVhbS4gQ2xpZW50IG5lZWRzIHRvIGNvbGxlY3QgdGhpcworLy8gaW5mb3JtYXRpb24gYW5kIHJlY29uZmlndXJlCit2b2lkIGdldElucHV0Q2hhbm5lbEluZm8oCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgaW50MzJfdCogYml0U3RyZWFtSW5mbykgeworICAgIC8vIHF1ZXJ5IG5TYW1wbGVSYXRlIGFuZCBuQ2hhbm5lbHMKKyAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJQYXJhbTo6SW5kZXg+IGluZGljZXN7CisgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGluUGFyYW1zOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIGluZGljZXMsIEMyX0RPTlRfQkxPQ0ssICZpblBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBpblBhcmFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBzdGF0dXMpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpblBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQzJQYXJhbSogcGFyYW0gPSBpblBhcmFtc1tpXS5nZXQoKTsKKyAgICAgICAgICAgIGJpdFN0cmVhbUluZm9baV0gPSAqKGludDMyX3QqKSgodWludDhfdCopcGFyYW0gKyBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29tcE5hbWUpIHsKKyAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6YW1ybmI6IHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgODAwMCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMV0sIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjphbXJ3YjogeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCAxNjAwMCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMV0sIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0Ojpnc206IHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgODAwMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLyBudW1iZXIgb2YgZWxlbWVudGFyeSBzdHJlYW1zIHBlciBjb21wb25lbnQKKyNkZWZpbmUgU1RSRUFNX0NPVU5UIDIKKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBpbmZvLCBzaXplX3Qgc3RyZWFtSW5kZXggPSAwKSB7CisgICAgc3RydWN0IENvbXBUb1VSTCB7CisgICAgICAgIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wOworICAgICAgICBjb25zdCBjaGFyIG1VUkxbU1RSRUFNX0NPVU5UXVs1MTJdOworICAgICAgICBjb25zdCBjaGFyIGluZm9bU1RSRUFNX0NPVU5UXVs1MTJdOworICAgIH07CisgICAgQVNTRVJUX1RSVUUoc3RyZWFtSW5kZXggPCBTVFJFQU1fQ09VTlQpOworCisgICAgc3RhdGljIGNvbnN0IENvbXBUb1VSTCBrQ29tcFRvVVJMW10gPSB7CisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnhhYWMsCisgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMiLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIn0sCisgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwKKyAgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om1wMywKKyAgICAgICAgIHsiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyIsCisgICAgICAgICAgImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMifSwKKyAgICAgICAgIHsiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YWFjLAorICAgICAgICAgeyJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwKKyAgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyJ9LAorICAgICAgICAgeyJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsCisgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJuYiwKKyAgICAgICAgIHsic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiIsCisgICAgICAgICAgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIifSwKKyAgICAgICAgIHsic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvIiwKKyAgICAgICAgICAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJ3YiwKKyAgICAgICAgIHsiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiIsCisgICAgICAgICAgImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IifSwKKyAgICAgICAgIHsiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvIiwKKyAgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjp2b3JiaXMsCisgICAgICAgICB7ImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMiLCAiIn0sCisgICAgICAgICB7ImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6b3B1cywKKyAgICAgICAgIHsiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzIiwgIiJ9LAorICAgICAgICAgeyJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpnNzExYWxhdywKKyAgICAgICAgIHsiYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdyIsICIifSwKKyAgICAgICAgIHsiYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpnNzExbWxhdywKKyAgICAgICAgIHsiYmJiX2c3MTFtdWxhd18xY2hfOGtoei5yYXciLCAiIn0sCisgICAgICAgICB7ImJiYl9nNzExbXVsYXdfMWNoXzhraHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmdzbSwKKyAgICAgICAgIHsiYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6cmF3LAorICAgICAgICAgeyJiYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdyIsICIifSwKKyAgICAgICAgIHsiYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZmxhYywKKyAgICAgICAgIHsiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIiwgIiJ9LAorICAgICAgICAgeyJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8iLCAiIn19LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrQ29tcFRvVVJMKSAvIHNpemVvZihrQ29tcFRvVVJMWzBdKTsgKytpKSB7CisgICAgICAgIGlmIChrQ29tcFRvVVJMW2ldLmNvbXAgPT0gY29tcCkgeworICAgICAgICAgICAgc3RyY2F0KG1VUkwsIGtDb21wVG9VUkxbaV0ubVVSTFtzdHJlYW1JbmRleF0pOworICAgICAgICAgICAgc3RyY2F0KGluZm8sIGtDb21wVG9VUkxbaV0uaW5mb1tzdHJlYW1JbmRleF0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGRlY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBsaW5lYXJQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiogSW5mbywKKyAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgcmFuZ2UsIGJvb2wgc2lnbmFsRU9TID0gdHJ1ZSkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBpbnQgZnJhbWVJRCA9IG9mZnNldDsKKyAgICBpbnQgbWF4UmV0cnkgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChmcmFtZUlEID09IChpbnQpSW5mby0+c2l6ZSgpIHx8IGZyYW1lSUQgPT0gKG9mZnNldCArIHJhbmdlKSkgYnJlYWs7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICAgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3b3JrICYmIChtYXhSZXRyeSA+PSBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wID0gKCpJbmZvKVtmcmFtZUlEXS50aW1lc3RhbXA7CisgICAgICAgIGlmICgoKkluZm8pW2ZyYW1lSURdLmZsYWdzKSBmbGFncyA9IDF1IDw8ICgoKkluZm8pW2ZyYW1lSURdLmZsYWdzIC0gMSk7CisgICAgICAgIGlmIChzaWduYWxFT1MgJiYgKChmcmFtZUlEID09IChpbnQpSW5mby0+c2l6ZSgpIC0gMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lSUQgPT0gKG9mZnNldCArIHJhbmdlIC0gMSkpKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBmcmFtZUlEOworICAgICAgICB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soZnJhbWVJRCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNpemUgPSAoKkluZm8pW2ZyYW1lSURdLmJ5dGVzQ291bnQ7CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopbWFsbG9jKHNpemUpOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cik7CisKKyAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgc2l6ZSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIHNpemUpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywKKyAgICAgICAgICAgICAgICAgICAgbGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZibG9jaykpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworCisgICAgICAgICAgICAvLyBXcml0ZSBWaWV3CisgICAgICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3Qpc2l6ZSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwdSwgdmlldy5vZmZzZXQoKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LnNpemUoKSk7CisKKyAgICAgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIHNpemUpOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIGF1ZGlvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBjb25maWdDb21wKSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGNvbXBvbmVudCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgIHNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitjbGFzcyBDb2RlYzJBdWRpb0RlY0RlY29kZVRlc3QKKyAgICA6IHB1YmxpYyBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjxpbnQzMl90LCBib29sPj4geworfTsKKworVEVTVF9QKENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdCwgRGVjb2RlVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJEZWNvZGVzIGlucHV0IGZpbGUiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICB1aW50MzJfdCBzdHJlYW1JbmRleCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgYm9vbCBzaWduYWxFT1MgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBtVGltZXN0YW1wRGV2VGVzdCA9IHRydWU7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgc3RyZWFtSW5kZXgpOworICAgIGlmICghc3RyY21wKG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpKSB7CisgICAgICAgIEFMT0dWKCJFTVBUWSBJTlBVVCBnRW52LT5nZXRSZXMoKS5jX3N0cigpICVzIG1VUkwgICVzICIsCisgICAgICAgICAgICAgIGdFbnYtPmdldFJlcygpLmNfc3RyKCksIG1VUkwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0KKyAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgLy8gUmVzZXQgdG90YWwgbm8gb2YgZnJhbWVzIHJlY2VpdmVkCisgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICBtVGltZXN0YW1wVXMgPSAwOworICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKKyAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKKyAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgIH0KKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbykpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCksIHNpZ25hbEVPUykpOworCisgICAgLy8gSWYgRU9TIGlzIG5vdCBzZW50LCBzZW5kaW5nIGVtcHR5IGlucHV0IHdpdGggRU9TIGZsYWcKKyAgICBzaXplX3QgaW5mb1NpemUgPSBJbmZvLnNpemUoKTsKKyAgICBpZiAoIXNpZ25hbEVPUykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgdGVzdElucHV0QnVmZmVyKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgZmFsc2UpKTsKKyAgICAgICAgaW5mb1NpemUgKz0gMTsKKyAgICB9CisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gaW5mb1NpemUpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgaW5mb1NpemUpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgdWludDY0X3QgZXhwVHM7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIC8vIFVwZGF0ZSBTYW1wbGVSYXRlIGFuZCBDaGFubmVsQ291bnQKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgICAgICBpbnQgblNhbXBsZVJhdGUgPSBiaXRTdHJlYW1JbmZvWzBdOworICAgICAgICBpbnQgbkNoYW5uZWxzID0gYml0U3RyZWFtSW5mb1sxXTsKKyAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgaXRJbiA9IG1UaW1lc3RhbXBVc2xpc3QuYmVnaW4oKTsKKyAgICAgICAgYW5kcm9pZDo6TGlzdDxvdXRwdXRNZXRhRGF0YT46Oml0ZXJhdG9yIGl0T3V0ID0gb0J1ZmZlck1ldGFEYXRhLmJlZ2luKCk7CisgICAgICAgIEVYUEVDVF9FUSgqaXRJbiwgaXRPdXQtPnRpbWVzdGFtcFVzKTsKKyAgICAgICAgZXhwVHMgPSAqaXRJbjsKKyAgICAgICAgd2hpbGUgKGl0T3V0ICE9IG9CdWZmZXJNZXRhRGF0YS5lbmQoKSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cFRzLCBpdE91dC0+dGltZXN0YW1wVXMpOworICAgICAgICAgICAgaWYgKGV4cFRzICE9IGl0T3V0LT50aW1lc3RhbXBVcykgYnJlYWs7CisgICAgICAgICAgICAvLyBidWZmZXIgc2FtcGxlcyA9ICgodG90YWwgYnl0ZXMpIC8gKGFjICogKGJpdHMgcGVyIHNhbXBsZSAvIDgpKQorICAgICAgICAgICAgc2FtcGxlc1JlY2VpdmVkICs9ICgoaXRPdXQtPnJhbmdlTGVuZ3RoKSAvIChuQ2hhbm5lbHMgKiAyKSk7CisgICAgICAgICAgICBleHBUcyA9IHNhbXBsZXNSZWNlaXZlZCAqIDEwMDAwMDBsbCAvIG5TYW1wbGVSYXRlOworICAgICAgICAgICAgaXRPdXQrKzsKKyAgICAgICAgfQorICAgICAgICBpdEluID0gbVRpbWVzdGFtcFVzbGlzdC5lbmQoKTsKKyAgICAgICAgLS1pdEluOworICAgICAgICBFWFBFQ1RfR1QoZXhwVHMsICppdEluKTsKKyAgICAgICAgb0J1ZmZlck1ldGFEYXRhLmNsZWFyKCk7CisgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QuY2xlYXIoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorLy8gRGVjb2RlVGVzdCB3aXRoIFN0cmVhbUluZGV4IGFuZCBFT1MgLyBObyBFT1MKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFN0cmVhbUluZGV4QW5kRU9TLCBDb2RlYzJBdWRpb0RlY0RlY29kZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhzdGQ6Om1ha2VfcGFpcigwLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigwLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDEsIHRydWUpKSk7CisKKy8vIHRodW1ibmFpbCB0ZXN0CitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgVGh1bWJuYWlsVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIHRodW1ibmFpbCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworCisgICAgLy8gcmVxdWVzdCBFT1MgZm9yIHRodW1ibmFpbAorICAgIC8vIHNpZ25hbCBFT1MgZmxhZyB3aXRoIGxhc3QgZnJhbWUKKyAgICBzaXplX3QgaSA9IC0xOworICAgIGRvIHsKKyAgICAgICAgaSsrOworICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIGlmIChJbmZvW2ldLmZsYWdzKSBmbGFncyA9IDF1IDw8IChJbmZvW2ldLmZsYWdzIC0gMSk7CisKKyAgICB9IHdoaWxlICghKGZsYWdzICYgU1lOQ19GUkFNRSkpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgaSArIDEpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBFWFBFQ1RfR0UobUZyYW1lc1JlY2VpdmVkLCAxVSk7CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBGbHVzaCBjYWxscyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgLy8gRGVjb2RlIDEyOCBmcmFtZXMgYW5kIGZsdXNoLiBoZXJlIDEyOCBpcyBjaG9zZW4gdG8gZW5zdXJlIHRoZXJlIGlzIGEga2V5CisgICAgLy8gZnJhbWUgYWZ0ZXIgdGhpcyBzbyB0aGF0IHRoZSBiZWxvdyBzZWN0aW9uIGNhbiBiZSBjb3ZlcmVkIGZvciBhbGwKKyAgICAvLyBjb21wb25lbnRzCisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEyODsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIG51bUZyYW1lc0ZsdXNoZWQsIGZhbHNlKSk7CisgICAgLy8gZmx1c2gKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSBmYWxzZTsKKyAgICAvLyBUaGlzIHRlc3QgaW50cm9kdWNlcyBlbXB0eSBDU0QgYWZ0ZXIgZXZlcnkgMjB0aCBmcmFtZQorICAgIC8vIGFuZCBlbXB0eSBpbnB1dCBmcmFtZXMgYXQgYW4gaW50ZXJ2YWwgb2YgNSBmcmFtZXMuCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDUpKSB7CisgICAgICAgICAgICBpZiAoIShmcmFtZUlkICUgMjApKSBmbGFncyA9IDMyOworICAgICAgICAgICAgZWxzZSBmbGFncyA9IDA7CisgICAgICAgICAgICBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgZnJhbWVJZCsrOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIGlmICghbUVvcykgeworICAgICAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIH0KKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gSW5mby5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HVigiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NDZmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKQEAgLTAsMCArMSw2NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBBdWRpbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0geworICAgICAgICAgICAgeyJhYWMiLCBhYWN9LAorICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCisgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwKKyAgICAgICAgICAgIHsiYW1ybmIiLCBhbXJuYn0sCisgICAgICAgICAgICB7ImFtcndiIiwgYW1yd2J9LAorICAgICAgICB9OworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3Vic3RyaW5nOworICAgICAgICBzdGQ6OnN0cmluZyBjb21wOworICAgICAgICBzdWJzdHJpbmcgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIC8qIFRPRE86IGJldHRlciBhcHByb2FjaCB0byBmaW5kIHRoZSBjb21wb25lbnQgKi8KKyAgICAgICAgLyogImMyLmFuZHJvaWQuIiA9PiAxMXRoIHBvc2l0aW9uICovCisgICAgICAgIHNpemVfdCBwb3MgPSAxMTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN1YnN0cmluZy5maW5kKCIuZW5jb2RlciIsIHBvcyk7CisgICAgICAgIGNvbXAgPSBzdWJzdHJpbmcuc3Vic3RyKHBvcywgbGVuIC0gcG9zKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtQ3NkID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICAgICAgZ2V0SW5wdXRNYXhCdWZTaXplKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGFhYywKKyAgICAgICAgZmxhYywKKyAgICAgICAgb3B1cywKKyAgICAgICAgYW1ybmIsCisgICAgICAgIGFtcndiLAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1Dc2Q7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgaW50MzJfdCBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworCisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICAvLyBJbiBlbmNvZGVyIGNvbXBvbmVudHMsIGZldGNoIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBhbGxvY2F0ZWQKKyAgICB2b2lkIGdldElucHV0TWF4QnVmU2l6ZSgpIHsKKyAgICAgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzFdID0gezB9OworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGluUGFyYW1zOworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBtQ29tcG9uZW50LT5xdWVyeSgKKyAgICAgICAgICAgIHt9LCB7QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEV9LCBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgJmluUGFyYW1zKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBpblBhcmFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlF1ZXJ5IE1heEJ1ZmZlclNpemVJbmZvIGZhaWxlZCA9PiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpblBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gaW5QYXJhbXNbaV0uZ2V0KCk7CisgICAgICAgICAgICAgICAgYml0U3RyZWFtSW5mb1tpXSA9ICooaW50MzJfdCopKCh1aW50OF90KilwYXJhbSArIG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0TWF4QnVmU2l6ZSA9IGJpdFN0cmVhbUluZm9bMF07CisgICAgfQorCit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIGF1ZGlvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRW5jb2RlciwgZ2l2ZW4gRGVjb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJhdWRpby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEF1ZGlvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgorYm9vbCBzZXR1cENvbmZpZ1BhcmFtKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBpbnQzMl90IG5DaGFubmVscywgaW50MzJfdCBuU2FtcGxlUmF0ZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCBzYW1wbGVSYXRlSW5mbygwdSwgblNhbXBsZVJhdGUpOworICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbkNoYW5uZWxzKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbXsmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvfTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICBjb21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGZhaWx1cmVzLnNpemUoKSA9PSAwdSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCkgeworICAgIHN0cnVjdCBDb21wVG9VUkwgeworICAgICAgICBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKKyAgICAgICAgY29uc3QgY2hhciogbVVSTDsKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0geworICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphYWMsCisgICAgICAgICAiYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcm5iLAorICAgICAgICAgImJiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcndiLAorICAgICAgICAgImJiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpmbGFjLAorICAgICAgICAgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpvcHVzLAorICAgICAgICAgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrQ29tcFRvVVJMKSAvIHNpemVvZihrQ29tcFRvVVJMWzBdKTsgKytpKSB7CisgICAgICAgIGlmIChrQ29tcFRvVVJMW2ldLmNvbXAgPT0gY29tcCkgeworICAgICAgICAgICAgc3RyY2F0KG1VUkwsIGtDb21wVG9VUkxbaV0ubVVSTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZW5jb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGxpbmVhclBvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLCB1aW50MzJfdCBuRnJhbWVzLAorICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLCBpbnQzMl90IG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TYW1wbGVSYXRlLCBib29sIGZsdXNoZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICB1aW50MzJfdCBmcmFtZUlEID0gMDsKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgaW50IGJ5dGVzQ291bnQgPSBzYW1wbGVzUGVyRnJhbWUgKiBuQ2hhbm5lbHMgKiAyOworICAgIGludDMyX3QgdGltZXN0YW1wSW5jciA9CisgICAgICAgIChpbnQpKCgoZmxvYXQpc2FtcGxlc1BlckZyYW1lIC8gblNhbXBsZVJhdGUpICogMTAwMDAwMCk7CisgICAgdWludDY0X3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAobkZyYW1lcyA9PSAwKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAobkZyYW1lcyA9PSAxKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIGlmIChmbHVzaGVkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBTWU5DX0ZSQU1FOworICAgICAgICAgICAgZmx1c2hlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopbWFsbG9jKGJ5dGVzQ291bnQpOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cik7CisgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIGJ5dGVzQ291bnQpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmdjb3VudCgpLCBieXRlc0NvdW50KTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBBU1NFUlRfRVEoQzJfT0ssIGxpbmVhclBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzQ291bnQsIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9jaykpOworICAgICAgICBBU1NFUlRfVFJVRShibG9jayk7CisgICAgICAgIC8vIFdyaXRlIFZpZXcKKyAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClieXRlc0NvdW50LCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICBBU1NFUlRfRVEoMHUsIHZpZXcub2Zmc2V0KCkpOworICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClieXRlc0NvdW50LCB2aWV3LnNpemUoKSk7CisKKyAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgZnJlZShkYXRhKTsKKworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICAvLyBETyBUSEUgREVDT0RJTkcKKyAgICAgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgICAgICBBTE9HVigiRnJhbWUgIyVkIHNpemUgPSAlZCBxdWV1ZWQiLCBmcmFtZUlELCBieXRlc0NvdW50KTsKKyAgICAgICAgbkZyYW1lcy0tOworICAgICAgICB0aW1lc3RhbXAgKz0gdGltZXN0YW1wSW5jcjsKKyAgICAgICAgZnJhbWVJRCsrOworICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgfQorfQorCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCBhdWRpbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCitjbGFzcyBDb2RlYzJBdWRpb0VuY0VuY29kZVRlc3QKKyAgICA6IHB1YmxpYyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjxib29sLCBpbnQzMl90Pj4geworfTsKKworVEVTVF9QKENvZGVjMkF1ZGlvRW5jRW5jb2RlVGVzdCwgRW5jb2RlVGVzdCkgeworICAgIEFMT0dWKCJFbmNvZGVUZXN0Iik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMKTsKKyAgICBib29sIHNpZ25hbEVPUyA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgLy8gUmF0aW8gdy5yLnQgdG8gbUlucHV0TWF4QnVmU2l6ZQorICAgIGludDMyX3QgaW5wdXRNYXhCdWZSYXRpbyA9IEdldFBhcmFtKCkuc2Vjb25kOworCisgICAgLy8gU2V0dGluZyBkZWZhdWx0IHNhbXBsZVJhdGUKKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDI7CisgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSA9IDQ0MTAwOworICAgIHN3aXRjaCAobUNvbXBOYW1lKSB7CisgICAgICAgIGNhc2UgYWFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBmbGFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBvcHVzOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJuYjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJ3YjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDE2MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0KKyAgICAgICAgKChtSW5wdXRNYXhCdWZTaXplIC8gaW5wdXRNYXhCdWZSYXRpbykgLyAobkNoYW5uZWxzICogMikpOworICAgIEFMT0dWKCJzaWduYWxFT1MgJWQgbUlucHV0TWF4QnVmU2l6ZSAlZCBzYW1wbGVzUGVyRnJhbWUgJWQiLCBzaWduYWxFT1MsCisgICAgICAgICAgbUlucHV0TWF4QnVmU2l6ZSwgc2FtcGxlc1BlckZyYW1lKTsKKworICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgdWludDMyX3QgbnVtRnJhbWVzID0gMTY7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sIG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIG5DaGFubmVscywgblNhbXBsZVJhdGUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVPUykpOworCisgICAgLy8gSWYgRU9TIGlzIG5vdCBzZW50LCBzZW5kaW5nIGVtcHR5IGlucHV0IHdpdGggRU9TIGZsYWcKKyAgICBpZiAoIXNpZ25hbEVPUykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgdGVzdElucHV0QnVmZmVyKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgZmFsc2UpKTsKKyAgICAgICAgbnVtRnJhbWVzICs9IDE7CisgICAgfQorCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gbnVtRnJhbWVzKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAldSIsIG1GcmFtZXNSZWNlaXZlZCwgbnVtRnJhbWVzKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKyAgICBpZiAoKG1Db21wTmFtZSA9PSBmbGFjIHx8IG1Db21wTmFtZSA9PSBvcHVzIHx8IG1Db21wTmFtZSA9PSBhYWMpKSB7CisgICAgICAgIGlmICghbUNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBidWZmZXIgbWlzc2luZyIpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKKy8vIEVuY29kZVRlc3Qgd2l0aCBFT1MgLyBObyBFT1MgYW5kIGlucHV0TWF4QnVmUmF0aW8KKy8vIGlucHV0TWF4QnVmUmF0aW8gaXMgcmF0aW8gdy5yLnQuIHRvIG1JbnB1dE1heEJ1ZlNpemUKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEVuY29kZVRlc3QsIENvZGVjMkF1ZGlvRW5jRW5jb2RlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHRydWUsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIodHJ1ZSwgMikpKTsKKworCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibVdvcmtRdWV1ZSBFbXB0eSBpcyBub3QgZXhwZWN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0Iik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IG1Xb3JrUXVldWUuc2l6ZSgpOworICAgICAgICBpZiAocXVldWVTaXplIDwgTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIGZsdXNoIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMKTsKKworICAgIC8vIFNldHRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgaW50MzJfdCBuQ2hhbm5lbHMgPSAyOworICAgIGludDMyX3QgblNhbXBsZVJhdGUgPSA0NDEwMDsKKyAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CisgICAgc3dpdGNoIChtQ29tcE5hbWUpIHsKKyAgICAgICAgY2FzZSBhYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBmbGFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxMTUyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugb3B1czoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gOTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW1ybmI6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW1yd2I6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSAxNjAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMzA7CisgICAgdWludDMyX3QgbnVtRnJhbWVzID0gMTI4OworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCBudW1GcmFtZXNGbHVzaGVkLAorICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSkpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMgLSBudW1GcmFtZXNGbHVzaGVkLCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSwgdHJ1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQobUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUZsdXNoZWRJbmRpY2VzLmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9tZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vbWVkaWFfYzJfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzczY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vbWVkaWFfYzJfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0MyX0FVRElPX0hJRExfVEVTVF9DT01NT05fSAorI2RlZmluZSBNRURJQV9DMl9BVURJT19ISURMX1RFU1RfQ09NTU9OX0gKKworCisjZW5kaWYgIC8vIE1FRElBX0MyX0FVRElPX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjQ2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMyBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJWdHNNZWRpYUMyVjFfMENvbW1vblV0aWwiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyLWhpZGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyLWhpZGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiVnRzTWVkaWFDMlYxXzBDb21tb25VdGlsIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9jbGllbnQiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL1JFQURNRS5tZCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNTY5YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL1JFQURNRS5tZApAQCAtMCwwICsxLDIyIEBACisjIyBDb2RlYzIgSGFsIEAgMS4wIHRlc3RzICMjCistLS0KKyMjIyMgbWFzdGVyIDoKK0Z1bmN0aW9uYWxpdHkgb2YgbWFzdGVyIGlzIHRvIGVudW1lcmF0ZSBhbGwgdGhlIENvZGVjMiBjb21wb25lbnRzIGF2YWlsYWJsZSBpbiBDMiBtZWRpYSBzZXJ2aWNlLgorCit1c2FnZTogTXRzSGlkbEMyVjFcXzBUYXJnZXRNYXN0ZXJUZXN0IC1JIHNvZnR3YXJlCisKKyMjIyMgY29tcG9uZW50IDoKK0Z1bmN0aW9uYWxpdHkgb2YgY29tcG9uZW50IGlzIHRvIHRlc3QgY29tbW9uIGZ1bmN0aW9uYWxpdHkgYWNyb3NzIGFsbCB0aGUgQ29kZWMyIGNvbXBvbmVudHMgYXZhaWxhYmxlIGluIEMyIG1lZGlhIHNlcnZpY2UuIEZvciBhIHN0YW5kYXJkIEMyIGNvbXBvbmVudCwgdGhlc2UgdGVzdHMgYXJlIGV4cGVjdGVkIHRvIHBhc3MuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldENvbXBvbmVudFRlc3QgLUkgc29mdHdhcmUgLUMgPGNvbXAgbmFtZT4KKworIyMjIyBhdWRpbyA6CitGdW5jdGlvbmFsaXR5IG9mIGF1ZGlvIHRlc3QgaXMgdG8gdmFsaWRhdGUgYXVkaW8gc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBDb2RlYzIgY29tcG9uZW50cy4gVGhlIHJlc291cmNlIGZpbGVzIGZvciB0aGlzIHRlc3QgYXJlIHRha2VuIGZyb20gaGFyZHdhcmUvaW50ZXJmYWNlcy9tZWRpYS9yZXMuIFRoZSBwYXRoIHRvIHRoZXNlIGZpbGVzIG9uIHRoZSBkZXZpY2UgaXMgcmVxdWlyZWQgdG8gYmUgZ2l2ZW4gZm9yIGJpdHN0cmVhbSB0ZXN0cy4KKwordXNhZ2U6IE10c0hpZGxDMlYxXF8wVGFyZ2V0QXVkaW9EZWNUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+IC1QIC9zZGNhcmQvbWVkaWEKKworIyMjIyB2aWRlbyA6CitGdW5jdGlvbmFsaXR5IG9mIHZpZGVvIHRlc3QgaXMgdG8gdmFsaWRhdGUgdmlkZW8gc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBDb2RlYzIgY29tcG9uZW50cy4gVGhlIHJlc291cmNlIGZpbGVzIGZvciB0aGlzIHRlc3QgYXJlIHRha2VuIGZyb20gaGFyZHdhcmUvaW50ZXJmYWNlcy9tZWRpYS9yZXMuIFRoZSBwYXRoIHRvIHRoZXNlIGZpbGVzIG9uIHRoZSBkZXZpY2UgaXMgcmVxdWlyZWQgdG8gYmUgZ2l2ZW4gZm9yIGJpdHN0cmVhbSB0ZXN0cy4KKwordXNhZ2U6IE10c0hpZGxDMlYxXF8wVGFyZ2V0VmlkZW9EZWNUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+IC1QIC9zZGNhcmQvbWVkaWEKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzNjI3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKKy8vIFRlc3QgdGhlIGNvZGVjcyBmb3IgTnVsbEJ1ZmZlciwgRW1wdHkgSW5wdXQgQnVmZmVyIHdpdGgob3V0KSBmbGFncyBzZXQKK3ZvaWQgdGVzdElucHV0QnVmZmVyKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICB1aW50MzJfdCBmbGFncywgYm9vbCBpc051bGxCdWZmZXIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIndvcmtRdWV1ZSBFbXB0eSBhdCB0aGUgc3RhcnQgb2YgdGVzdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworCisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIGlmIChpc051bGxCdWZmZXIpIHsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobnVsbHB0cik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7Cit9CisKKy8vIFdhaXQgZm9yIGFsbCB0aGUgaW5wdXRzIHRvIGJlIGNvbnN1bWVkIGJ5IHRoZSBwbHVnaW4uCit2b2lkIHdhaXRPbklucHV0Q29uc3VtcHRpb24oc3RkOjptdXRleCYgcXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckNvdW50KSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgeworICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IHdvcmtRdWV1ZS5zaXplKCk7CisgICAgfQorICAgIHdoaWxlICgobWF4UmV0cnkgPCBNQVhfUkVUUlkpICYmIChxdWV1ZVNpemUgPCBidWZmZXJDb3VudCkpIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBpZiAocXVldWVTaXplICE9IHdvcmtRdWV1ZS5zaXplKCkpIHsKKyAgICAgICAgICAgIHF1ZXVlU2l6ZSA9IHdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICB9CisgICAgfQorfQorCisvLyBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKK3ZvaWQgd29ya0RvbmUoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLCBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICBzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsIGJvb2wmIGVvcywgYm9vbCYgY3NkLAorICAgIHVpbnQzMl90JiBmcmFtZXNSZWNlaXZlZCkgeworICAgIC8vIGhhbmRsZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgaW4gd29yayBkb25lCisgICAgaWYgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgQUxPR1YoIkNvbmZpZyBVcGRhdGUiKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiB1cGRhdGVzID0KKyAgICAgICAgICAgIHN0ZDo6bW92ZSh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFtOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdXBkYXRlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQzJQYXJhbSogcGFyYW0gPSB1cGRhdGVzW2ldLmdldCgpOworICAgICAgICAgICAgaWYgKHBhcmFtLT5pbmRleCgpID09IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHsKKyAgICAgICAgICAgICAgICBjc2QgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICgocGFyYW0tPmluZGV4KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLT5pbmRleCgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLT5pbmRleCgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZ1BhcmFtLnB1c2hfYmFjayhwYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKyAgICB9CisgICAgaWYgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAhPSBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSB7CisgICAgICAgIGZyYW1lc1JlY2VpdmVkKys7CisgICAgICAgIGVvcyA9ICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICAgICAgYXV0byBmcmFtZUluZGV4SXQgPSBzdGQ6OmZpbmQoZmx1c2hlZEluZGljZXMuYmVnaW4oKSwgZmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgQUxPR1YoIldvcmtEb25lOiBmcmFtZUlEIHJlY2VpdmVkICVkIiwKKyAgICAgICAgICAgICAgKGludCl3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIHdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIGlmICghZmx1c2hlZEluZGljZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2EyOTAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSAorI2RlZmluZSBNRURJQV9DMl9ISURMX1RFU1RfQ09NTU9OX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczsKKwordXNpbmcgOjphbmRyb2lkOjpNdXRleGVkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEVudkJhc2UuaD4KKworI2RlZmluZSBNQVhfUkVUUlkgMjAKKyNkZWZpbmUgVElNRV9PVVQgNDAwbXMKKyNkZWZpbmUgTUFYX0lOUFVUX0JVRkZFUlMgOAorCisvKgorICogSGFuZGxlIENhbGxiYWNrIGZ1bmN0aW9ucyBvbldvcmtEb25lKCksIG9uVHJpcHBlZCgpLAorICogb25FcnJvcigpLCBvbkRlYXRoKCksIG9uRnJhbWVzUmVuZGVyZWQoKQorICovCitzdHJ1Y3QgQ29kZWNMaXN0ZW5lciA6IHB1YmxpYyBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIHsKKyAgIHB1YmxpYzoKKyAgICBDb2RlY0xpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKT4gZm4gPQorICAgICAgICAgICAgbnVsbHB0cikKKyAgICAgICAgOiBjYWxsQmFjayhmbikge30KKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXAsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgIEFMT0dEKCJvbldvcmtEb25lIGNhbGxlZCIpOworICAgICAgICAodm9pZCljb21wOworICAgICAgICBpZiAoY2FsbEJhY2spIGNhbGxCYWNrKHdvcmtJdGVtcyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXAsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiYgc2V0dGluZ1Jlc3VsdHMpCisgICAgICAgIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZCljb21wOworICAgICAgICAodm9pZClzZXR0aW5nUmVzdWx0czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcigKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXAsCisgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgIEFMT0dEKCJvbkVycm9yIGNhbGxlZCIpOworICAgICAgICBpZiAoZXJyb3JDb2RlICE9IDApIEFMT0dFKCJFcnJvciA6ICV1IiwgZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EZWF0aCgKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXApIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZCljb21wOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZClmcmFtZUluZGV4OworICAgICAgICAodm9pZClhcnJheUluZGV4OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lUmVuZGVyZWQoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsCisgICAgICAgIGludDMyX3Qgc2xvdElkLAorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpYnVmZmVyUXVldWVJZDsKKyAgICAgICAgKHZvaWQpc2xvdElkOworICAgICAgICAodm9pZCl0aW1lc3RhbXBOczsKKyAgICB9CisgICAgLy8gc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIC8vIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICAvLyBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk+IGNhbGxCYWNrOworfTsKKworLy8gQSBjbGFzcyBmb3IgdGVzdCBlbnZpcm9ubWVudCBzZXR1cAorY2xhc3MgQ29tcG9uZW50VGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RFbnZCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3RTZXJ2aWNlcygpIG92ZXJyaWRlIHsKKyAgICAgICAgcmVnaXN0ZXJUZXN0U2VydmljZTxJQ29tcG9uZW50U3RvcmU+KCk7CisgICAgfQorCisgICAgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9zZGNhcmQvbWVkaWEvIikge30KKworICAgIHZvaWQgc2V0Q29tcG9uZW50KGNvbnN0IGNoYXIqIF9jb21wb25lbnQpIHsgY29tcG9uZW50ID0gX2NvbXBvbmVudDsgfQorCisgICAgdm9pZCBzZXRJbnN0YW5jZShjb25zdCBjaGFyKiBfaW5zdGFuY2UpIHsgaW5zdGFuY2UgPSBfaW5zdGFuY2U7IH0KKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIqIF9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0SW5zdGFuY2UoKSBjb25zdCB7IHJldHVybiBpbnN0YW5jZTsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0Q29tcG9uZW50KCkgY29uc3QgeyByZXR1cm4gY29tcG9uZW50OyB9CisKKyAgICBjb25zdCBoaWRsX3N0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICAgICAgICAgIHsiaW5zdGFuY2UiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKKyAgICAgICAgICAgIHsiY29tcG9uZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdDJ30sCisgICAgICAgICAgICB7InJlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LAorICAgICAgICAgICAgezAsIDAsIDAsIDB9fTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIkk6QzpQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0SW5zdGFuY2Uob3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgICAgIHNldENvbXBvbmVudChvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICAgICAiLUksIC0taW5zdGFuY2U6IHNvZnR3YXJlIGZvciBDMiBjb21wb25lbnRzLCBlbHNlIGRlZmF1bHRcbiIKKyAgICAgICAgICAgICAgICAgICAgIi1DLCAtLWNvbXBvbmVudDogQzIgY29tcG9uZW50IHRvIHRlc3RcbiIKKyAgICAgICAgICAgICAgICAgICAgIi1QLCAtLXJlczogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgaGlkbF9zdHJpbmcgaW5zdGFuY2U7CisgICAgaGlkbF9zdHJpbmcgY29tcG9uZW50OworICAgIGhpZGxfc3RyaW5nIHJlczsKK307CisKKy8qCisgKiBjb21tb24gZnVuY3Rpb25zIGRlY2xhcmF0aW9ucworICovCit2b2lkIHRlc3RJbnB1dEJ1ZmZlcigKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgdWludDMyX3QgZmxhZ3MsIGJvb2wgaXNOdWxsQnVmZmVyKTsKKwordm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCA9IE1BWF9JTlBVVF9CVUZGRVJTKTsKKwordm9pZCB3b3JrRG9uZSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwgYm9vbCYgZW9zLCBib29sJiBjc2QsCisgICAgdWludDMyX3QmIGZyYW1lc1JlY2VpdmVkKTsKKworI2VuZGlmICAvLyBNRURJQV9DMl9ISURMX1RFU1RfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjkxM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZ0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcCJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODAzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcApAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyX2hpZGxfaGFsX2NvbXBvbmVudF90ZXN0IgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKKy8vIGdvb2dsZS5jb2RlYzIgQ29tcG9uZW50IHRlc3Qgc2V0dXAKK2NsYXNzIENvZGVjMkNvbXBvbmVudEhpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBJZiB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGZhdGFsIGZhaWx1cmUsIGl0IGlzIHBvc3NpYmxlIHRoYXQKKyAgICAgICAgICAgIC8vIGZyZWVOb2RlKCkgd2lsbCBub3QgZ28gdGhyb3VnaC4gSW5zdGVhZCBvZiBoYW5naW5nIHRoZSBhcHAuCisgICAgICAgICAgICAvLyBsZXQgaXQgcGFzcyB0aHJvdWdoIGFuZCByZXBvcnQgZXJyb3JzCisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJvb2wgbUNzZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgbUVvczsKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KK307CisKKy8vIFRlc3QgRW1wdHkgRmx1c2gKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgRW1wdHlGbHVzaCkgeworICAgIEFMT0dWKCJFbXB0eSBGbHVzaCBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAvLyBFbXB0eSBGbHVzaCBzaG91bGQgbm90IHJldHVybiBhbnkgd29yaworICAgIEFTU0VSVF9FUShmbHVzaGVkV29yay5zaXplKCksIDB1KTsKK30KKworLy8gVGVzdCBRdWV1ZSBFbXB0eSBXb3JrCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIFF1ZXVlRW1wdHlXb3JrKSB7CisgICAgQUxPR1YoIlF1ZXVlIEVtcHR5IFdvcmsgVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgLy8gUXVldWVpbmcgYW4gZW1wdHkgV29ya0J1bmRsZQorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0xpc3Q7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJndvcmtMaXN0KTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5yZXNldCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKK30KKworLy8gVGVzdCBDb21wb25lbnQgQ29uZmlndXJhdGlvbgorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBDb25maWcpIHsKKyAgICBBTE9HVigiQ29uZmlndXJhdGlvbiBUZXN0Iik7CisKKyAgICBDMlN0cmluZyBuYW1lID0gbUNvbXBvbmVudC0+Z2V0TmFtZSgpOworICAgIEVYUEVDVF9ORShuYW1lLmVtcHR5KCksIHRydWUpIDw8ICJJbnZhbGlkIENvbXBvbmVudCBOYW1lIjsKKworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisKKyAgICAvLyBRdWVyeSBzdXBwb3J0ZWQgcGFyYW1zIGJ5IHRoZSBjb21wb25lbnQKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBwYXJhbXM7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJnBhcmFtcyk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFMT0dWKCJOdW1iZXIgb2YgdG90YWwgcGFyYW1zIC0gJXp1IiwgcGFyYW1zLnNpemUoKSk7CisKKyAgICAvLyBRdWVyeSBhbmQgY29uZmlnIGFsbCB0aGUgc3VwcG9ydGVkIHBhcmFtcworICAgIGZvciAoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBwIDogcGFyYW1zKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeWluZyBpbmRleCAlZCIsIChpbnQpcC0+aW5kZXgoKSk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHt9LCB7cC0+aW5kZXgoKX0sIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICAgICAgRVhQRUNUX05FKHF1ZXJpZWQuc2l6ZSgpLCAwdSk7CisgICAgICAgIEVYUEVDVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+Y29uZmlnKHtxdWVyaWVkWzBdLmdldCgpfSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgICAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisgICAgfQorfQorCisvLyBUZXN0IE11bHRpcGxlIFN0YXJ0IFN0b3AgUmVzZXQgVGVzdAorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBNdWx0aXBsZVN0YXJ0U3RvcFJlc2V0KSB7CisgICAgQUxPR1YoIk11bHRpcGxlIFN0YXJ0IFN0b3AgYW5kIFJlc2V0IFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfUkVUUlk7IGkrKykgeworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5yZXNldCgpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgfQorCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgLy8gU2Vjb25kIHN0b3Agc2hvdWxkIHJldHVybiBlcnJvcgorICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICBBU1NFUlRfTkUoZXJyLCBDMl9PSyk7Cit9CisKKy8vIFRlc3QgQ29tcG9uZW50IFJlbGVhc2UgQVBJCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIE11bHRpcGxlUmVsZWFzZSkgeworICAgIEFMT0dWKCJNdWx0aXBsZSBSZWxlYXNlIFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFF1ZXJ5IENvbXBvbmVudCBEb21haW4gVHlwZQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgRVhQRUNUX05FKHF1ZXJpZWQuc2l6ZSgpLCAwdSk7CisKKyAgICAvLyBDb25maWd1cmUgQ29tcG9uZW50IERvbWFpbgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dCogcG9ydE1lZGlhVHlwZSA9CisgICAgICAgIEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7cG9ydE1lZGlhVHlwZX0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgfQorfQorCitjbGFzcyBDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzIDogcHVibGljIENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPHVpbnQzMl90LCBib29sPiA+IHsKK307CisKK1RFU1RfUChDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzLCBJbnB1dEJ1ZmZlclRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZm9yIGRpZmZlcmVudCBpbnB1dHMiKTsKKworICAgIHVpbnQzMl90IGZsYWdzID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBib29sIGlzTnVsbEJ1ZmZlciA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIGlmIChpc051bGxCdWZmZXIpIEFMT0dEKCJUZXN0aW5nIGZvciBudWxsIGlucHV0IGJ1ZmZlciB3aXRoIGZsYWcgOiAldSIsIGZsYWdzKTsKKyAgICBlbHNlIEFMT0dEKCJUZXN0aW5nIGZvciBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBmbGFnIDogJXUiLCBmbGFncyk7CisgICAgbUVvcyA9IGZhbHNlOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdElucHV0QnVmZmVyKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtV29ya1F1ZXVlLCBmbGFncywgaXNOdWxsQnVmZmVyKSk7CisKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChmbGFncyA9PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5yZXNldCgpLCBDMl9PSyk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZElucHV0cywgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgc3RkOjptYWtlX3BhaXIoMCwgdHJ1ZSksCisgICAgc3RkOjptYWtlX3BhaXIoQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgdHJ1ZSksCisgICAgc3RkOjptYWtlX3BhaXIoMCwgZmFsc2UpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRywgZmFsc2UpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIGZhbHNlKSkpOworCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vIFRPRE86IEFkZCB0ZXN0IGZvciBJbnZhbGlkIHdvcmssCisvLyBUT0RPOiBBZGQgdGVzdCBmb3IgSW52YWxpZCBzdGF0ZXMKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2NGQ2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9WdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL1Z0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODhmYmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9WdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdC5jcHAKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9tYXN0ZXJfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworLy8gZ29vZ2xlLmNvZGVjMiBNYXN0ZXIgdGVzdCBzZXR1cAorY2xhc3MgQ29kZWMyTWFzdGVySGFsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICB9CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7Cit9OworCit2b2lkIGRpc3BsYXlDb21wb25lbnRJbmZvKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBjb21wTGlzdCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcExpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8IGNvbXBMaXN0W2ldLm5hbWUgPDwgIiB8ICIgPDwgY29tcExpc3RbaV0uZG9tYWluOworICAgICAgICBzdGQ6OmNvdXQgPDwgIiB8ICIgPDwgY29tcExpc3RbaV0ua2luZCA8PCAiXG4iOworICAgIH0KK30KKworLy8gTGlzdCBDb21wb25lbnRzCitURVNUX0YoQ29kZWMyTWFzdGVySGFsVGVzdCwgTGlzdENvbXBvbmVudHMpIHsKKyAgICBBTE9HVigiTGlzdENvbXBvbmVudHMgVGVzdCIpOworCisgICAgQzJTdHJpbmcgbmFtZSA9IG1DbGllbnQtPmdldE5hbWUoKTsKKyAgICBFWFBFQ1RfTkUobmFtZS5lbXB0eSgpLCB0cnVlKSA8PCAiSW52YWxpZCBDb2RlYzJDbGllbnQgTmFtZSI7CisKKyAgICAvLyBHZXQgTGlzdCBvZiBjb21wb25lbnRzIGZyb20gYWxsIGtub3duIHNlcnZpY2VzCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdFRyYWl0cyA9CisgICAgICAgIG1DbGllbnQtPkxpc3RDb21wb25lbnRzKCk7CisKKyAgICBpZiAobGlzdFRyYWl0cy5zaXplKCkgPT0gMCkKKyAgICAgICAgQUxPR0UoIldhcm5pbmcsIENvbXBvbmVudEluZm8gbGlzdCBlbXB0eSIpOworICAgIGVsc2UgeworICAgICAgICAodm9pZClkaXNwbGF5Q29tcG9uZW50SW5mbzsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0VHJhaXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICAgICAgICAgIGxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKCkpOworICAgICAgICAgICAgQVNTRVJUX05FKGxpc3RlbmVyLCBudWxscHRyKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbXBvbmVudCBmcm9tIGFsbCBrbm93biBzZXJ2aWNlcworICAgICAgICAgICAgY29tcG9uZW50ID0gbUNsaWVudC0+Q3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgICAgICAgICAgICAgIGxpc3RUcmFpdHNbaV0ubmFtZS5jX3N0cigpLCBsaXN0ZW5lciwgJm1DbGllbnQpOworICAgICAgICAgICAgQVNTRVJUX05FKGNvbXBvbmVudCwgbnVsbHB0cikgPDwgIkNyZWF0ZSBjb21wb25lbnQgZmFpbGVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBsaXN0VHJhaXRzW2ldLm5hbWUuY19zdHIoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1diBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhM2U0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYKQEAgLTAsMCArMSBAQAorysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLS09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs8Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/RERBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nzw7Pjo9Ojo6ODg6Ozs4ODo6Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo+O0Q8PTo8PDk4Ojk6Ojk7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxBQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLzMvLy8vLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svLzMzLy8vLy8vLy8vLy8vKysvLy8vMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2tra29vb2dnZ2dnZ2dna2tra2trY1tfX19fX19fY19jX19fa29ra2tra2trb3Nvb29zc3Nzc3Nzc3dzb29vb2tTT09PT09PT09PT1NTW1dXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZElJTE5AOTk6MztAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjY2RkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0jYuLi4uLi4uLi4qKiouHgYKCgoKCgoKBgYGBf5HT09PT09PT0tLS0tPT09vi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOUmJMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7r6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFhSU1NTU1NTU1NTU1NUTUNERERERERDQ0NEQz9d0dPT09PT09LS0tLS0tLf6uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7QEM+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0NLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp5cVldXV1dXV1dXV1dXWFFJSUlJSUlJSUhISEhEYNDT0tLS0tLS0tLS0tLR3+rq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzc/R0dLS0tLS0tHS0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWFiYmJiYmJejKypqampqampqampqaqjZ2FiYmJiYmJiYmJiYmJcVFRUVFRUVFRUVFRVUWvQ0tLS0tLS0tLS0tLS0d/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Nzs7Ozs7Ozs7OzczMzM7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs7OzcvMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcXGxsbLzMvMy8zMzMzMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzLy8vLysrKysrKysrLy8rKy8vN1dXV1tbW1tbW1tbW1tXX2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztLTz8/P0tTPz9LU1dTPz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0NHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tXW1tbW1tbX19fX19fX19bW1tbW1tbX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08CazM/Ozs7OztKrnM/Q07mf0dCcgoSKyM/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbW1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTEJAPT08PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK2nKWj1bKXmLW2k7i5r6LSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/OnZyRncOdoqar0pF9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I5NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqYqtTPz8/Rv5igm7KtyIaZrdXSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPj8+OjhFQD9COzc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmKrUz8/P07SZlqq4pNujmK3V08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8qgo7/KnKWMp63Yqpmq1M/Pz9Srmn6jj6DYoZit1dWwoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDUrJuni5ah2aGYrdXUo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbX19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk9Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q07aysqWZqdqhmK7WzZ6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXEopmWm7Tao5iv2MKfodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS09PT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6DH1aKrpJrM2KGZrdqypKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09PIkY201dSxhMPWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVUxGQjw8P0ZFR0tIPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MjB1dHS0cPV0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRExMQD43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHT1NLS0tLV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRENJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZJRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f3+Dg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREQ+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODg5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREU+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPDs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5OTo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29ra2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFEPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3F0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h1fHZ9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTQzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tba2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg0NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7Oz4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubi4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTQ2ODg2ODY7Ojk8PT07Ojg2Njg4Ojc2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trq+ztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBGPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2Njg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm6ubm4t7e2tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+cnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NjQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO1tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tbS2tre3trW0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmZqZl5eXl5eWmZuYmZmZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+QkA/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utrausr7Cxr6+wsrW1tre1tba1tbW1tba1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmpqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura6rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJmam5ycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BBQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytrayrqqelpaWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDY1NzM4Ojo6Ojo8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Slpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqalpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioaCfn56enJycnJ2dnZydnp+goqGio6OjoaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaWoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZmJeXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCcnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWkpaSlpaaoqKeop6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGho6Ojo6Kjpaampqenp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZucoaSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6elpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goqKioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6SmpqWlpqempqKdnJ+hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+fn5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3OTk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaampaWjoKChoaCZkpCPlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2dnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSk5KRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU5OTg5PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5qcnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WSlJicmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJycnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqOjpKSkpKKhoZ6bmpmXobWemZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NjY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpmXmJmcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKCgoKKkoaKioaGgnpybm5uZn6ubnJqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY6NzU2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2goaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCls6ygoJ+fnpyZmZqam65qdp2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJuam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn52dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCfppKbq5+goJ6bmpmamaiERH+fnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpuam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpOTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnqCeYpymnp6cmpqbnKGjUUeDoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5yam5ubm5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODo7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuapmZdo6CbmpmbnZyudUlMhqCcnJ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8Pjk6Ojs+Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKSAUniimZmanZugpF9WToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ybm5ucnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PUNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgiFtflJqZm5yco49kWkyBop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiZn5ddXXaXmpydnaKBZFlNfqKenp6dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubmpydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmaYGFggJadnJ6YdGNVToCin5+fnp2eoaCenZ6dnp2dn5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmZn2leW2V/nJyejGpfUFKGnpudnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M+Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal5NzaGFUdpOXnIdcVlBXipKOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6Smp6SfaCjlqScbkxPY4aGgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4Ojs/PDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz9ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CEoJ2Of2yWpZWfgIl/X3J/gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz05OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE+P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5/gKKLfG5SdZyMjFpxfXx+fXyGjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODk4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZiad1hPTHCUhoJMYG9xd4iFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY2jjVUvMD13h3d2QURea22EkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KmnGdBWkg7d3lrZ0UvOFtsc5CPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mpr49Lb6F4QXt3Y2JQUFpHYG6KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLS0tLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKN4YL/WpkN7jIB1T22OdVJkf6Oop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkp6eZnaSlo6KdYn+9wK93nqOalGVMYXhtUXSVoqKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dQXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA8Pjw5OTxBQkVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqadnmqEnLqPptChmbGoWEysk1Nlj6CeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+roqKGd359cs7JsZunr2tVqrBiWoemn6WioZ2fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PjxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e0tbazra6tj4aDbo/NuZWQopd0VG96c257laaqp6OfnqObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKno6GmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm42Ad3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEI+Qz07OT45QEBAP0JDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3u7u7ubnBuLS1oIh5ZFmft8CmqJ2Id2txb3h4en2GjpKYnKKlpqulpJihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKempaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgXZ4eXhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz5DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW3wcbMz87Myb6zpJBzZlJEi5eJiYh+eHFuZ2ZsaWtxcnFxcnR8jKnExLuip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWhpKenoZ+dnpaTnKCXmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYWZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PFx9vj49rLvK+kl4h0WVpRQ2l6bG91bmtlZVlXXlhcY2lpaGVgaIm0wMC5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hnp2loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3b21bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs6PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVejIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7N0dXKuaedlIZyXlFUS0RbZl5ka2VhYGhZVFhSVlhZXFhadJm2u6u0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudnJydnJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkzW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/wsHHy8i3lHVlVVBPVEg+XmteX2ViYF1kYVNWVlVTVFdym6uwqqiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzM2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI8ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5uMObYUlER0tEPVtlYmFoY2BbY19XUU5PT1V/tLqsrqWkoqekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcl5ecm5+eo5yelpiXk5acmZmclJadlJaTiXZ5ent3bmtpaHZaZ3N4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6Ozs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwa2DT0ZNRTtNW19la2VfW2BZWFJNVH+iqrm1s6upo6GtqqynrZ+stLS/w765uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4yVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dmVmaWpoXmtwbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMzKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCxpZqWEc/P0deY2JqYFpYV1NVdpm2vru8urysraapu7q5t7+ztbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rraussZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aWpqdW55bF5kW1ZgWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8HDxMbJxczQzcfMycLCx8LLy8jHzMnOxcbGvalyUEswWFNVZmFTTk9wqcjIwsTGwLy+tLGwsMG+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2tr7WlpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpudnpaco6ChoqSjpKKempmbm5udnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVRNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODo9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPCwbyRP052folWTG+ky9TFtr+/wL+6ur21s7PAv7m/wrnBt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopycn56joKaZeXp5gHNwZmVnZGtlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw8PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzFp3dqg5CYb6nIyMfRwa+9vbi5u7u+uLWxur+0vL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsKempaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaOgmp6gpKKjnKKho6CenJ6eqaWolX16g3huZmFlYmFjZGRqY2dkW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OztAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPTo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Aur/AvLvFvbrAxL+9vq9zZX2Ri4nRxb+/yb+wwb+6t7u+uba4tLi8tb24tbSvs7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhY2Noa2dnamZqXlZWVFlPVExGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdaNt7+7w7W6x7a1uLq8uLm2qqOYjn+Dyb+/u8G+uca9wr+8xbi3t7W4tra8u7m2tLi6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVnb2plbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/Ed6fMvce3ubettrS3ubO1sbzJw5VLesq+v769vL/Iw8XFvse4tbOzvri5uL67urm8u7q0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucWdxa3RmY25gXFVIS0pESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Yk723x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTWr3R/usjPwsC4rrS0u723ubG9w8qPQ3TNw8K/vr28x8zHx8THvLa1t8G9u7zAw7u/wr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFmbGpvdW94ZGhjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0ppxcqvS0czKxLW6v8TIvr60v8DAeVJty8bCvsG8v8PMysfFxsG5vr3Ev8C/wsi9x8bFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1tdGxtb2BjX2JiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8TQw7q+vMS+t7zAv8nPx8jKysKHcnOjy8zLzcrGwsPLzsG8uL26sXBjYrvIxMDAv8TAysnDw8PDucO+vrnAvcPGwsrOx8a9usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaahn5uCe3qIe21teHxgcWRcX2BgVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqbK2w7+lenZ4msTHy8jBw8DAycrBv7u5saF9c2qtyMXEv8DBv8vHw8DIwLvCu7m0u7vDw8HN0MrEvbW8u7m/ubq1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp2wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3l0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs8Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEuW2szr22ucC8q35uaG5scoGVmHN3fJe9v8bAucC8vsXEvb24sbCZkH6Am8rCw7y9v7/Dw76/yL2+wLjIvquhoaGmucHJxbiyuLi3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBhWlRRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbR2gLO9trXCpYdpWl1gTVJbWm5zd4CfuLjCurO7t7u9v7q7u66km5mIkX7AxMO+vL+7u7i2wcK2wLvIrLyturifk5Gbo7e0sLS0tby5vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z3eG5yYV9nXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmohHiJoK+1nmtlZlZYX0lJTVBTbHeFpbC3vrmytbK7uby2ub60lZynlqFwrsnEwL2/ubOusr27rru7lI/O3Obi0biakoZ/na2vrrO6t7q+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybWBkYlxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fq4h8doygmWBUQ1dWSGFrVk9GSWCNoKuvtrq1tLKsvLm4tbjBvYuZsqOmcqXLwr+5urWupayzsKazuZro49vV19XPuol1amyYrKevtrOyurW7u7u1uLawtcSyvry+vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3Zzb2ReaFldXlNPTkI/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7WRgniIj29OSj9jWkFOd4CUa01BXIGwtbO1srSvrLu6uLa5v8Z2hKqfm2Wnv7i1srGtrZ+kp6edq6K9y6uotcrPz8uZdGtscqCkqq2up7Csr7GxrbGurq+5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2dG12amxdXGtVXlxQTkhER01CR05HODY2NTo1Oj04Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFOhlpKSlh2jYBjQFKiubO0srCxrbC5uLa7t7q9kKKyrKRzq7Cpq62ro6ignZ6dmJqus1o4S3mqxcrGooCFkoiInqOpqKCmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusayqqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWl1dG9lVWJkWF1ST01JQElTRE5DPTg4NzU6Nzw9Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+xu6qZmZVpTkBSeHFQSUlLZ5uBWUVRrbuxrLOvrqyttraytLWuqaafmpudn6aonqCoqZ+hp5ablpeMrH0yUmhWdK+1sZ6MmqKim5ado6KfnqSgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh5g3x2f3pjeG1uXFFpVVBPR1BNTUNQUkA/Oz40Ojo1Ozo9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqLzCq6S+aUVSnIJRV0lJX0tTjmFkYoCutaqytK6qq6+wsrOtpZ2Rl5OPmKCfoqCco6SfnaiTmZSVi6BjXoaHdFqMo5mbmJ2hpKemnZ6foJyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+Ym5qbpJmXlJWanaCdp6iloKOioaOfnKCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fYB1dn1ubHtkaFZTZE5KSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaGqxr/KoVBBcp54T25LS2JldXNgW15wj7GvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqklpaWlI+Iboe6v6NjZ5OHlJGOnqOipqKdn6aenZ+jpqieo6afqp2qraqup6iwpaOkpqespqGlopuZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJeboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GfoKWipqCJfIB+d3l9ZXl5YWJTVmFJSUtMU1VKU1FNOT5BNjc9NjU7Ojw8OTs7ODo8PTs7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NTU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWdo8fHj1dTSWSjXWV+b3JdUGtjW2RfXWuPtLCwuKymoZydmpSYmpmQjpGVkYyOjZOZopyXopiZlpaZiHqkx9bVn09sf4mAg5SamJuro6Gwo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6isrKehoKOxrrKxtKqyr6OZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWooqejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2iCbWVcU1taTVJLT09WTVRNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpI16VWlydXVxYnZ2WFdjYGNnWVhXZayurK+nn56ioZeRlJygnJmYkpOfnKGjmp6alp6ZnZaal493n8rasrJnRmZ6eH+DgXuKta+ms6yhra2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpagnJuYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGDf3x4dmp3dV5tW1JhSVJWSEZWV0tDTUg9S0k4RTw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCkgG6CcGBjWExbU1pNTFBYUkhNTUeXrKqppaCfmpGSlJiYlpaVjIiLjpWdnJ2cnpadmKWdoJqTcIa9slOKdXlxZWlqZV5Qa6y6rLS0sLewrrSppqSlrKm5s7W7w7zDwbe7tquusbi3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaign5+oqKWln52qoqKem5+ooKSnrZmgo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mGhX52cm1pd21obl1YW0NXTkpHTkdDR049Pkw+NTw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYpiV15lYFdNUUc+Pj9DQz8+QlF4qK2pqqagnp+ho56fnpudnJSTlZWenpiUhZ2Zn5mpoqygkoJ7iIN6gZClh3NaS19aSUCnwbW5u8DDub27rK6nsa2xwra4wsbAyMrAyr+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqqvo56sqLeyraOwpqGjsLGusKSlrqOhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJra3VycWhXXFFGVUhESlBJP0ZCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODs6OTs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V9YF5lYFFHRD1DP0U8Pzk2Tn+qs6ekpKKgnqWspp+YnZWSmp6ZlYyKhoiGeGyGn6Khqam0kXmMh4eWo6SmiGJua5GugExEt8S/xMjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Awr3Hx8K4xMrJxMHHv7q0uru0u7ewtrKru7Kuu7fAu7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtmWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo6Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeup6KrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV05FPklZfHBiQj1cjq6soZmbnJ6emZeXmJONj5eXlI+NkIyCg4J2cnBsb42kq62yp3N2eW5sbIKEe4VZVnmMwKdhbszExMvQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsbGysjPv8nRzcfGycbCvcTBvr6/tb6zrb/Aw8TIxcjEr7+5sri9xMLBu7y8ta6np66ooKKppJqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nX1paRE9NQ0ZRSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9LhZ6lmoSgsq2jnpyfmpiXlJOUl5GQkI2IhISJh4OAgYGAeXFxbmp2obe1mZdvZWZcTVaDgHCQemhvX7SnbJ/Tz8TN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3K083O083GycrLwsfMx8nJxr/Ds7PIxcvLzM/Hyr++v73Bx8XMzMnJwMPArrCzqJ6hqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3dqZVdYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnWNTTEpEQz9CUq3RvbKvppycnKCkoZ2blJSVlIp9eXFsZWJocnBye4WKgHVwbXBybYOsmIuaaVdjWF9kcIBtfo9yT3ObmYDG0NHCz9PW2NXV0svJztDLxs3SydLV19nW2NPW2M3Sys7RzM/RzdPQwMnIy8TMzczP0MbHyLbAy8DSzczQx8rJwMTDyM/N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVzY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqNbSUBBREFGUHWxr6aalJefnJqgoJ6bnZqViXdpZGFfYGBfXl9fXWFsdXNwb25rcG5yho2LjmJPXFRcYFFmXlhlWk1qd3mH1dHQy9DN09fW09XQz9LT0cnT0cfQ19fY0tjS19nU1szPz8nN0szP0cDHxMnHz87S0dHIzM3Ay83G1M/Nz8jFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNGQ1NOPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI8Ojw3NDo+PD9APUZBRD2CpJygpZ6lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZ0M4PT5EWIKqqJ+XlZeZmpyfnZibnZN9cWVjYl9fYV9eYWBeYWBfYGVtcHBtam1vc3R/e3FrZVRHSVFQR0U9SlBcX3Vbc9XU0MnOzNLW0tHWzc/V1dHF0dPK0NTV1s7T0djX19fMyM7Eys/Nys3AysHJys7P0MzQzs7Mz9DIzNHRy87Lw8rIys3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRU1ZRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+ZpaegoKOnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksnxIRkI7Vo2hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5fX11cYm1ybm1xcXJxd2lPfo1qUVhLV09LYEBLW1JtYnbR0s7GzczN1MvO0szK1tbQzNDTy8zQ0tPKztHV0tXWysDKwsbNw8nKw83ExsnLy8/Lzs3RztTMx8nQzcnHy8bHwsbKzM7R0cfQz83OzNDFx8G4ub3Ewr3DubKyvrC7w8O1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTUlRUUI7RD87Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9vdo+ajYyXlZCTkZGVlpWQi3tlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFvcHFtaW5wZn2LemZnW0pWXWM8QVZLYWl3zs3GxMbNytHHys3NxdDSz83M1MrHys7Px8bO0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNy83QycXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxcXIu8fDycnCz8C9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVVHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KGoamTjY2Wj4WDg4OBfYSEf3NfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG1taGdpanaDkZJ9aGhUV2ZQQkVcVlddecrEv8K/wsfJyMjJx7/Ey8XHyszJxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbFvL/Kw8XH0sXBycDKysfIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdDR0RMREZTQDU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bV56e52RipKWhnqAhIV/dXh1cnBfWltcYGBiY2RkZWRgW1xeXV5dX1tZWlxhbnFtaWZna2hsf5KdjnNlWltTQUJFT1JTVpHCt7i7ubfAwcHDvb24vL64w8nExsG8xr+3usPIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMx7LHycPOzMDFwr+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRkJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtbU1dfNys/FycXHwbrFvayup2Bjd4CSi4iLhHh/hoZ/fYN7dHRjXFxdXl9gYmNiYmRlYl1cW1xeXF5dWltcXWdyb2tkY2lpa3KJopJ/ZllRUVNOQDtHTHCgs66ysrKysrq0u7C2r7OusbrBu8DEu7+6tLG6vsC4x7i0vLbBwr24vcbBw7u1r7O1u7+0xbi7tay5vb7AvbG6trC3urPGvbevvL+1t7XFvb7DxsDExsbHzMW/xca7x8u/z8nHw8XBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJpbZ2+IjoWIiXp4foWGdneBfHNoXV1dXV5gX2BkYV5jZWNfXlxbXlxdXlpbW11fa29sZmNmaGdqdZGPg21fU1hkXU9ERF2VmKOmraqoqqeyrLSvsaetpquyurm1wrm5ua+qtLm6s8G5r8Cxvby7tbvHucO2raqosLLAtri9sLGosrO1u7yrrranrrauvLKwqriwrruuu7i7wMC+usO/xsPFwLzGwcfKuMXHxb/Hw8K5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOzo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc3Sy8PFwcTPxs3Bw8a/xMTDw8rCycq/wLzCurO1tcOvqrGTW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXGNtbWZkZGRmZ2p4h35vaFxjbGlxc4SUl4+SnaSqoaahqairqa+ipZ6prLS1sLy4r7aup623s7O7t7O8r7i5tbK7wbLBr6Wpo6uxs7OovaqrqKusrrW0pqiuoaSwqbOmp6iupqi3rLGzt7q6u7K8vr6+xL+1wcDHyLe+v8W3xMO/u7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8HLvrvJtr3DvrrKuMHDwrW2vLaxr7W8rqirk2NtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZWpkYmNhZGRobXp3cXFodH9/aGuTmpCNhpibpKCgnqOjpaWsnpuao6WrsK+2tqavq6aps6uzubC1ta22ubKwurqxtqWgpKCmsaisqbmqpaenqKezraCnpp+cpKWsn5+npKGhsa2trLK1s7Owtby2u8HAsrq+w8GxubnCs8C9wLW4u72+vMLHxMPEv7/EoIR4cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk7Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYWBeXFtcXFhZWFhYVlhaXV5jYmBjY2NiZWZpdnh0b3yDfFJnjZWKioCUmZyimZydoaOhpZyZoZqdqa6ssLSiqKipq6uktListq+ssrSus7WvsKqfnp+korKkpqq4raKmpqCoraqZn5+emZ2fpZqZo5ycnrCprKiqq6ytsLK4r7i5urC2vLu6q7OyubO9tLeysbW0v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uci4uL+3ssK0sbu7rLq6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFdXV1dXWFdaXWFiY2NiYmNkZG16cm53fmc9ZYyShoqCkZmaopuXmqGkoKKanZ+Zl6ysrK2woKShrKqmobSvsLGsqK+yp7qzprWgop+co6Kto6Kqtqqio6aepqajlpidl5manaCal52cnZytoayoo6Smrauys6q1sLKrsrm1r6qvsrKzt7Ovqa2usbexura6vb+3s7GUhnp2Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0JCQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMLMyMa/xbbBwMfOt8DDvbO5ubLAtrG5u62yta+fmqSqoJSbkHh/g4R/eG9xdHFoZWRoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVVdgYmNhYWJgYGRmcnBrcntQOVt9jYaMhYyYlpqZkpydpqGcnaWbmpippK2uqZqhobaooJ+tqLWppqetsKS3sKO3oKOcmZmqpqGarbmvo6GknKKgn5OVoZSWlpyZmJaXnJWfqZ6qpKKdo6qqsK2otKyqpq2ysKWrrbOxr7Cvr6eop7KtsbSwu7S6t66jlIJ6d2VfYVdZWFNSVEtNXkxQTEdITUxFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rZ2np6Kqu8C9wLmutLjBzMjFwsO9xbjIzLLBwsGuvLu1u7y1ubmwsLGqnJqhqpWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtbWVtbWlhWV1dWV1hXV1ZVWmJiYGBhX19gYmdwaW5uOS4wTICJjYeKk5iWmpGbmqOioKSknZudpJ2praSeoKG1pqCgoqeyoaWnpa+lsa2rtZ6gnZWVqaGilK2xsZ+io56emZuTi6CTkZOYmJKXmJiXnqebp6GimqSlpaukpbCnpaKrrK2mqa6vr6uoqqqzpqarr7Sxrry2sbCvn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk5PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTs3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLyxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZoKSMinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVlJUUlRfX11eX1xdXWBhaGtrYS4fK0x1hIqFiI6ak5qRl5uhnqmioaGhoqCap6iimJyisKmgoJykqZ2nop6srKqpra2ioaGVmKKanI+rqLCcn6KfnpeZk4qdkY2Sk5WQmJiTnKGjnKShopWgoqSlm6OrpaKkqqSrraWtsqmmpaamtaapqK2ztbS5uq+rrJ6Mc3FwYVtXVlZSR1FPSFpcT1JKVEtTTEVHSkM4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm9sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5QWFxaW1xcXF1cX2JpamI9Kz1MboCHg4eIkpOblZWapKSmpKikp6SglqOropOXo62nn5uYmp+erpmcqrOfpaafo6OhlJSblpaSqamtmpyfoaCblJCMmY2LkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq6+jrbilo6SirK2qqKuvtLeyvbWzq66YhXV0aVxZWVNVUkZYTFFbWE1VT1BMUVJJT0lCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ojo9Njg6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFBYWVlZXFtaW11eY25zU0RQW2B8gn2Jho6QmZiUmaakoqqopa2hpZacqZ2Tk6KnpZyXj46Zna2WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6el46Mi5OFiI2Dj4uRlZGgnqGkmZaflZqhop6Um6WlqKiooLCwprG9p5+jrLSqrqevtLC5tcCxrrCrkX9zdGJXVFVOUkpHVlBSUkxMWE5LTE9TR05LQUNGREM+Qjc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtri8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRRTU5NUldYWVhYV1pbW2BqaWZuX25can94iH+KipCTkZejlpqlo6Kom6SVnaKZkIydoZmWloWEkZqjj5WjnJWWlYeimpuTjI6KkJqlp5uVlZeckZOIlI6LgYuNgJCLkpKSoZqgopaUmZiVoqaajZmlp6inoaC0sqizuKGdo7asqq2ksrKmtby0q6yxoop6dG5eTlFRTU9ETk5OUEtGTk5KSk5OUUhNSkFITElIRD85NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4NTg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLEtbWys8bFt7rDyszGs6y6vbS4wK+tqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlJTUFFUUVNVUU5NS0tTV1dWV1dXV1pcYWVZX1xsX154b4N6hICLiYuWm4qVl5+eoJajk56Zk4qEl5mLc4yCfY2WlYWSmZCTjo17mY+cjIKJgIqYoKOekJOYloWOgpR+fnOKjnqQh5OQkJ2bmpqSlpCejqKjjomaoKGjpJuitK+sr62fmKa4pqWwobGunLG7qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU05JSkpFS01HS0s+ODQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWmpqayp6a0wbivtLDJxLi5wM7GvrOtu8GsrcStp6Gmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWZiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOT05PT1BTVFFNTUpHTlNTU1RUU1VYWlxoWFpXaW1lZEVPaYh5jX6FlZCGjoyblZqUlZSRjJSIfpKIXjtWbnuKk4mAjJGMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFvho1+iYGQjpCYmpmTi5CKnYifmIiIlp6aoaCXp66prampnpats6KlrZmtq5iotKOpraKTf3RuYFtOU1JXTERUSlBMTEZOT0lFTFFNS1BKSU5QR0pKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKepp6OqsKintMK5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFMT1JUVVdZYGBUUmJuY0U4N3mNiYd1gI2GgIWIlomUlYmRhYOShHeHfl9JUG13ipGDfYSMioR/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiZWEm42ChJKblp6dlKSjqKmlpZ6bsKqhpKSRpqqWoqqcoaaninduZl5cSFFRU01JVU1TSUxLT0lIRkpOTE1VS1FSUEdKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnp6+sqrW8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/ipSplpWLf46Eg354cW9YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNTVVpmXFRgZ1dYUEqIfIyAbHd/e3d/h45+j5mLjniDjX5zfndxbXRwdI2NgHp+iaqEentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWLiIqNi4B/hIuNgJSEfICPmJSclpGfnameoKGdoKmln52YjaekkqCglp6epIJzaWJdXUpXUFJIS1hST0pNTFJKSkpMUEhMUUxSVU5GSUI9Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZicn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3eGeHx2cG9qWUtISUhHRUhIUFRUVFdXU1VVVVVWV1hXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXmJeXGFVZX6NkomKc2ByeXBzeYOLeICYkn5uhI16dHluan2tfHSQin56hpKAfH90ZnV8hmxvaHN8io2IgG16cX1xbXaPcWhxgX6OcESLhYKDhX93eHqMhn2Me3V9jpKPmIuSm5ujlpmdm52eoZyWjYulm46dl46WmJB5b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUU9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0tLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rp6mwr7Gru7irur64s6ynm7CnrJuPlpylqaShmJqOhJJ6iY+Li3ZxfG11cWptalhLRkdFQUBDREhMTE1RUU9RU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhcXFtXVneXm7t6a29bc3BodnOCi3V4iINsaYmPdnJ3aGh+gXGWkYqAfZV/SZKZbmd3foJtamRseYWQkoZrc2x8bnJ8hmltcH9zjYmFhnt9fnt3cHV0hoJ5gXlwfI6LipODlpaYmpCTlpaZlp2WjIOJn5KLko2GkJaAb2pvb29ZVlhUUlJZT1JVVFNYVU1PSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYmp+krK+iraqota+urLO/q7zCv6aimpWkmJ6NhIuUoaKYmZGTi3OOeoCGjIZ1b3RscW1la2tZTkRGQ0A8Pj5CRkZHS0tLTE9SUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSk1OT1JWWlFWUlCYeleQX2hvXXZpZ3l0hYRxfYOBcWqWj3JxemhonI5MeYSRiISNZjF2h3JrfX2DdGZldX6EhIWAZmlsdWtwgHxocXF8bpONj3t0fX1xcW92bYN/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo6VmYuOhXqEkJiVjZGMkIdxh4J0h4yGenBzcW9wZHBnX1RGSUM/PDs5Oj9AQURDRUdJS09RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUtBSFBGXaWpl2ZxbmR1Zmt8e398dn+CgnZvnJFxd35xc5KGNXGcp5yNoKGEooV2cIZ7hnxzjK2NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHRycW1gXF1eXFpZYV9STltaWFdMSElGSUg/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTAxMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBkoeVkZ2kp56vlaW0qa2xrsGyu8HFlo+MlI+AiHxugZCSiYOKh4+FdYODbJWIiHx1eHhteG53ZGpeSVBHPj83NDQ4Ozo7PT5AQkVIS0xMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1NUEw3Q01QUUJGe2l0cnJtdmZwgYF2eH9+e4h6c56Wd3yEf4OYg5qcYIWpnpyLg5COenaHfomIjnOKl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1BUWFtVR0pKRUxHP0ZAREQ/QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTQyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2eppGgq6CxqK/AsrvFupaOkZOHeoZ2a3+LkYN9ioOOjHiDgHOghIp9fYF/cIF+emh3a1JYTEBFMjExMjc2Njg4Ojw+QUVGRkdJS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklLTU5RS0pTWlZORl93fXF/cXRqdYiFdXeEgnqRg3SdloaEjJCTpIysqUiGrK+uioGAlIqBioGEkamHgZiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZHbYB3cnl2aG1rX3Z9goh/h4SLeZScm4mKiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdmXFVQUFdZUERMS0ZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmEh5GOlZeSlqCdrKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS0xNT1dfVmlXWFphf4d7inh8eX2KjHmAhIx8lZJ/nZ6VkpmZpKySmbuxprrHw6eLjKGljpOJgZF8cYOen5Gdf3eFhYqPh5BpaHCEgXSMhoSKcoaCd4eAe3aEfG12dWZ/lI6GiIiGh4egqqKWiI6Xf3qBiHp5b2dreH58gHVsZl5aW15qXmFnYFpQTE5XUlFJUEpETkdDSkRDQEREQjw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVvZneCen+Mf4GQjoqamqScoaymqq6wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOhICBjIqCiY2Df4p/bHBqXUJBNC4tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlRSU1NUUlBPSEVCPDg3LzlDPjw8NjMubJOXTVBISkxLSk1VX153Y2JnbI+Pgo+Ii4OGiJODjYuZh5ycj5+moqGpkqe0oafBwq3Hr3i5lJp8jaGemISThYKOoZ+UmZGFioWPmpGWbHB1ioyClYyNjnePhHFthYGKlpGChYhyiKCVhpGJjY+WpLSom4yUooKHkoN9f2tqanyCg4N1Y15lYFtobF1tbF9XS0hOUlBOTExGSVBDRE5GQkNFRkM+Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnB2kYZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXmAkoiRkn2KhJiSkIOAgIuMiYaQh4SJhnh4f2dNUj4vLy4sLy4tLzAwMDIxMjU2Nzo/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMS01OUV1pgXdtenWSkI6cm5mSmZCckJeapJqjppylqKeos5aqvaq0xsi2yNDPvpugcGmqqZ+Ek5KFnKCam5mmkZGIlaObmnd6fpSYk6GTl5eBlJ57d5WSqrKIjJaefJOdm42RlZijoaW1r5yRmKeGlo+NgIhsc3N9gX5zamJeYmBiaGVgZ2dcUkVKS1BPSUpMRkdNQ0hMRkZDQkdFQjs4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbXxhd419e5OOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Ljo18ioaPkI6BgoCJi4qFkoWDhomBgId2XmJQNTYwLTEvLC4wLy4vLi4wMDE1PkFBTVBSU1FSU1RSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUlNTlBZaX6JcoyClZudqrSwnaelp6OksKetsq6uqrivsbybscOquMnLt8O/t6WisLOsrKqji5aYhKWmoKOXgaaZjaKqqKWIhZSkoaGqoKSpj5uwi5Wjpre6m6Cir5KinKGdj6Khq66rsrShlKSph5mIkomVeXp+hoFpYmldZmNfZGRfZ2dfW09DSUhTTkZIS0ZKR0ZGSEFLRkNGRkI7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2luWHmEdoGThYeCnIORkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GOg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8Mi8xMTAtLCstMC4uND5DQU1VUFJTVVVWVU5bUEdIRDw+PkZIQ0RBNzs8NUM7PUZLSUZIUU5QV32LmH+lm6agp7fAvKWuwLOor7yvtLqyvLK/tLm5orfEp7XIx7W9uLSoo7OtsLGbmZKan4inr6ullHafpJehrLK0mZaqrqivtrqyuqyvtaKxq7G1u7a0rbSfpqeippmor6yxuLe3p5q1qIukjZCSnoZ4goV4W2NmV2djYmRhYWdhW1RKRERMVFBISUlESUdFQUBAS0RCTUc9ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiYld5dXGBk32EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeEgY5/gYmPhn+GiIaKh5F7eG5dV0BETjw2OjQ2QUI3NjQwLzZDSENRW09RVVdVXFdQX1VJS0tBPz5HS0ZFRDs+QDdENz9CSkpFRlZTT16Knaeeq6y4q6+4xcSxt8G6sLC+tLW+sbyutXOvsqS5xKOvxriws7Gzp6S1tqqwoKKWm6KSpbCupq2rp6SYoa20u6Kosrq1vL/Mv8XFvb2zwbe6t762ure4q6uwpK+orL2vvLrBwauYuaeUrY6Xl6mIfYN+bVhlY1lsZmtmV1xkWVZTSUdGTFBHQ0hJQUhEPj9CQkxAP01EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpwfo2EgI6FbnpzeIdiuaGZo4mUlJaSlJONj5eSh4d7hoGNlYqAhIGKenyKh4Z9ioOCi4SWfXh6dWZQXGRHRUw7UWNhW15TRz87SFBEWmNRUVlYWmdZVGBfTFJPREE/SUpIRUVBQEM8RTZCPkhHSkxTWlRdj6ixr7Wywbezt8XJt7m/urWzubi1vLK4sMRfc7CksZqdqryopKirqqOisrWhqqiflZaemKCupaempZ+klKOosbSosrO9tsK+08nJ08bCxczCysPAvby+u7u2tK+4trbCucW9wsevnripoauNpKe1iIGBdGFkY19ZY2BqZ1NYYVZSVUlFRU1KQD5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWQc2tycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoOAgnh7i4OHe4t6gYqCl350fXpsZXB1WV5cUGVkYmBlZF1cWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhHQkk6RD9IS1NUVVxaW5C0u7S5scG6tbXHyLe0uLS3uLG1s7KttLWYY3SnnK1wXqKsm5egopuknqqllJ+fkJOOlZiYqJ6mn56amYOkna2lqrCtuLC9udTRz9fQyszSzM/Nysa/vsHJvMC8wMDExMTJvsfNsqO6sLSumqu3u5iAfG5fYl5bYGNaZGNRXGBTUUpDQUVGRTxARj9BSEI/Qzw6RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaV9vlpKQlG5rb3R1h7SsoaGfi5mcmYyNlZGbkoWKin6IhoyQi4h8gYNzfIqDhXuJdIGKhpV/c3t5bG11e2hyZWlsaWZqamlgZmlpbFptc5atpLyIhmdcb2ddWVlUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWCWs8Ktta+3ubKvwsSzrrevr7mqsbClqrari7WnnJqmmk2ZnYyOn5aRppillYqTk4mQiY+RkZ2boZealZaHn5qnm6yvqbCotLTU1NTW08zQ09XN0s/MxMHJ0L3JycrJ0cbMzcLP0bevw7zDuaS1ucGihHFlXl9fWmJZWmdaUV1YTlBBQkhFQkg7QEM+QUc/P0E3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWco+QmIJncW94eYOhqp6ml4yam5eLjZWRmo59iYuFjYqKipCHfISCcH+HgYZ7h3KDkouOfXF4dmxweH5xem14c21pgXFtY2ptcHhpd3x+y77B36dtY3huY1thYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlay1qbGkrbOoq7q+r6mzpaO3paqtoKuzoo2wrZmXmIyOkZGEjpuBjaaRnImDi4SLiYSLhJSWmJeUm5Gcl5man5+rrKWooqytz9LV0s7M09TUz9TRzsfD1NHGzdLT09bM0dHE0dbFwM7Hx8KovbbOnnxxaGBkX1hhVF9bUFFUUU9IPkBGQUJFPEBBPkRDPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnSGhYp3bHdwfX5/oZ6eoYyMmJOTi4yTj5WFeYWPkI2LiYiQhn6Ce3F+gIGHeoR1hZOQiH9vdnNsc317d3tzgnhya4FzcmlwcXp5cnq+y5p9i7GEdnKEdmdhal1DWllbVmVjWGNqU1hcXWBjXWN3en2LgZeoo6OfnZ+mpKmut6mlsqGhrKCiraGmsZ6IppqTkpGJjo2IgZOIapWijJmEgYZ+kYODk5eti5WNlJmOhpKRnpeosKKhoaWkqcnNz8jDzNHV0tTSztPNxtbSzNTY1tbY1NfVydTazcjX19HKq8LCy411cWViYVpWW1RdUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjo8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHJ4coKKgJ2VnZSFi5WJjomIjYaOf3iDk5iKjIiIi4h+gnhze32CiHd/eoaRlYCDbndwbXZ/dnh8dIZ8em2HdnRvfXaEdXh7nbWMO0GKxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhtgIKHkYqcnZ+ckJaXnaKjpLCjo7GeoaScn6iforGbhZ2RkZKQioqKhoOPg36cm4uNgoSFeZR/gqmVo42SipeSjH6Yi5qSq7OYm5yonKe+w8a5t8fO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBnX1tUV1NcWEZHS0lFRT06NzpAQEI5R0Q/RENBQ0I7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjX2XkZ2LfoeSg4mGhImBh3x4hZaWiY6Ch4WHeoR5cXp7g4V1eYWOjZx5i3B8cHB6gHF7gHGDh4Fujnp1d3x8gnV+fIaHr3NYqcK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeYuGjZORmpWflIaLkpqfmpyonqCrmqGZmJ2knZ+rmYqZi4+RjYR7h4eDhIuNn5mTiIOHfmyZeoSZhoiTjI2UjIZ8nImUkK6qlJaYn5mnr7a9qa6+x8zJyszL0MnD0srU19nX2NfV29fT2dvV0Nra0dbI1MqWfH5ra11cUVVUYUpDRkpIPkE+PTc6PT87PUc8P0FBQURBPj86ODdEQjc1NTQ3OS41NTY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgYGEfoN7fISYjYeLfYWHgHeCeW97e4aBdHmSno6gdo91gnR1gX50gINvgZCCb5KEdXyBhXp2hnuJt8Wkwcm5gZabj3dwZU9mY4F6gXeGopCKeHl2e4N/e4R2bZOWk5SOl5CCiY6VmZaVpJuWnpWdkpGWop2YqpWQkImMkYKLg4iIgYWPkZ2amYiFi4GFl3qIiZ+XkIiNiYuCfaGJkYy8oZiTmJmdqaamrp+otr/AwbnIys7OxM3K0dbV1dnV19vU19na29fb2tnYztvGiH18amxoYlZZV1hOTEVOQzs9PTw4Ojs9OT1ANj0/Pzw+PT05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzOTU1NTY0NTU3SEg9REpFNzkyNTtIPjs5OjdJUF1bUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7fn9+gHyEen2BkYmEhXqEh3t1fXRtfH2Gf3N+kp6RnoKQe4Z+eI9+eYqKboKagHSZhn2BiYV8fpB6j6mOj8OhvYyco519iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CRhIiKkJKUjZyZkpOPlYyLlJ6bk5+UkI2Nj4p+jo2NioOIkpaZnp6Ii5SRnZGBin+lmIiEjYGFhIGlhoqMt5idkZWWoqehnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuHt8e25saFpiXVRRT0lETEI8PD45OTs6OTk7PDY/PT48PTk5OzszN0Q/NzM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5cnlzbYB+hH53hZyhm52UkX+MiICYiICckm+IqIV6oYt8kY2DiIScfZqQiYyjo6CQpK+gipCLhYuBkoZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIuGh4uSkouTk5OOi46Jh5WZm46UlZCKkZOFf4qHkYyKiZyWmKGhhpKdlZ+KiYiNm5CDh45/goeGpIWMkbKYnZKVl6Gin5mSnJ2osritpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19bZ2aBygHdqaV9gWlVYWUNASUM/Pj46NDg6Ozc6OzozOzs/PT43Ozo6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNjem1hfpKDbm13i3h5fnqBfIZ7e3eGhH9zcIWCenV2dnSEgoR+f5Kmo5+lopaKnZCVl4uKp5dzirKNhKiShJmThZmMopWfmJKImp6jk6mwoJCUkI2OiJaMbo23hZrEyLKboaWbnJiWkLGRZKTNyJWOhoeIj5KMjJGTiISJiIWVmJmOj5OShpOWg36Pi5mHjZCqlpaioYiYnpaaiI6Hl5eJhI6MgX+Hj6WJjpOompeTl5mhmZ+Zk52bo7O1pqO8wr7IxcXJyMnCy9TNzdSp0tHW1dbY2tTS2c6FdYNrZmFgYFFLVlxCQkdDO0E9ODM3Ozw6OT02NDk6PDo4Mj85OTI6STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfYh4en56gYGDfnZ2gIJ7bG6Kfnl8d3h8hIaLfoujtKikq7OhlqegpqSWla+ig5C4lZGzmoyhoIykm6+jpJ2YkKiXqZmusKSXlJWUkIuYmpagwI6jybirmqOlrZmRm5yynYaFqKKcl4WIiI2Ui4qSjoaAhYaIkZeTi4qTkoaTl4WDkI+bc5CYspWWo6CHm5qTj4qQipaaiIqWjYZ9jJieipCQnJqZk5mYn5SgnZSem6GxrqOkuL+0xMfEvcPDv8fOy8nSp8/M09LQ1tjSz9i8dX16YGNYY1lSSUtPRkJDRDU+Ozc2Oj87PDc9NDI2Njk3NzQ9NTs1PEs8Pjs8QkE3NTw7NTI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXF1ZSmhhO0iEi3p7bYWGeXyEeICEgX1weHx9fG9yjHl9gXt4houJhoSTqLytqbO9sKWus7Spo6KwrYqatZ6juaWVrKOXqa24pqSjn5mpmKqksLGqmZiclJWRl6CXmru7rcqhaba4qrCVmJ6jq5KXvaNeqbKCiYmMlIaQfI6NfIOFjY+Tk4iGkpWLjpWMioyWmJGbmbOWlKqdipuUkYyQkYuYmomRnY+KiZWfoY6VjZeZnZKcmJ6UoaCUnJ2mrqiipLO4q8LIxLW6vbvGyMjC0KHGyc3NxNfW0MrUo3N9bF9dVmJTUUhEPjxDQUE3Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGdIYWBicEpAi4l+gHOHh3yBiXWBioN+bX18fH5wd4d3jYGHe42PjIaMmqvDwLC9xryztMG9tK2ss7eMqLKurr2rm7qjqK25uKunpqKho6Oqr7Kxq52co5mbmJeeoqWlkqO5rqi/u6ytsrmlo6d9iIadrbywgouLipCDj4ORjnqBhpCMjZuHh42WjIqUlpOQmZabp5mwmZCqnI6aj5GOlZCPlZaOkKCQiJWbo6yVlo+UnJ6UoJ2bmJ+glJqfqKekoqOws6bAxsOwsLu2xcXDv82nx8PHw7zW0MzEyop3dmVfXWJeT0xDTEBFRz9BPkI8OjQ+QT09NT02PjMzMzI0MkExN0BCTT5HQENOQ0E9Qzw7ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxpRl9pZ1tdXJOMjIh7h4uGg4x1hZCKgW5+e4F+cX6BepR6kpSVmJCTlqi0xsnAwszCw7nIvbqwq7m7mLK2ubLArqXAo6uwvL2qrqujo56nrK+1saqboKqcopyWn6+zp4yjurq1wbyrqJyypKOolISOqsTDpIKLjoaHhIaVlIx6g4yQjpGgi4uTkI6Hl5+XkpiUlqWfrpyLqZuNlo+RkZSVjZCUkY6hk4aXn5+zn5SblJ+hmqSfmqCboJSYnqekpqekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnIwbV4fHBfW19tVE5JRExMTEpAQT1CRDw1QUQ7OjM9OEIzMzIyNjJBMTVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJoXU1lXGZUY2qajZaKi4iSj4aJeYWTj4FygHuNf3eHgoGPeY2hlqiam5i6vsnIysLSycvCzb3Bs628v6e6v728xLiswamss7y+qrCqpKWjrK61rre2oJ+un6ajmKOzvKmcqLzBo7a3r6uTsKyqrJeGmqqnpZCCjJKklYmAdYmReYSNkY+dn5GOkoqOi5Oil5aalJOhnamekKSZi46Pj5WWiHyOlZKRopqUoKKctqaQn5elpKOln56mmJ6Vl5ulo6ioorKsqLu/w6+ls7fMwLquw7O7vcG5rMLCwb+acXxkXFleXUxNTktHRUNIQUFBREs6NERIOjs0PDdGLjEyMzUyQTI2U0hOPEpCSlFFS0NFRTpFTEI8N0VWPTw9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bEpfWGFaZGVYnpCdjZaOnpKJin+InpKEd4V/lH5/kIiJkICWoJqup6SYxL7IxMjG0s3Ozcu8wriwury0vcu7w8K3tryttL+6vK6vqKGpqLaur6qyuJqerKKoop2rt7eqpa++xLG9ubOnqrSzra6WlaWtqaCRjpKxxaeUjnyRlX2HkZiPqZiXkpKOkpSSpJySnJiToKGhm5iel4qLj46eiFqPlpeSlqSZZpmkn7OllqOVq6yrqJyfppeZlpiVoqSopp61q6m6vMK0prS1y8G4qrass7u4rqi4ury3hG9xXVtXWFBHS1ROSz9BR0RESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmRNRqaUnJWhl6iVjJCDhqWSiIGHgpqEg5WQkJOOmqGfr76uoci+xcXIx87Oz9LKvry2sbu7vL/PtsS+uLm3s7O2s7i0rKecq6y5q6mor7CYo66lqKSltcCwq6y0vsO5wLizp7i0t7KvlaStsLCli5OUoI1zwZl8lpmEjpaai7CVmZmUkZGZmKSilJ6alZmnnJqgn5iKjI+VnV9KlpyalJmll1SWsJ+vnZ+lla+vraaboaaUk5mYjp2gpqGZtKmqs7y7u6uwssfAuKWrq62xsaOhsrK0pXNyaF9dUVNNRlFRUFE7SEpIRkdBQz05S1Q/QTo9Rk0vNzUzNDpCNDROV048SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVGQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVc8OkJDQD1SRVdTdGJWRkiql5mfoaiumJGXh4qnlo6IkoSfh4Sdl46doJqjpbXJtanHvMPEycvJyMzOx7+7s6+6ucDCzbXIu8G5trqyr6+0taeknKu0tauqpq6smqStpqWprLq/qKu3t77BwL64srLCsLe8rKOuta26poialqWbdb6fhJicjpKYmouulqCbmpaUmZ6fqJ2mn5iZqZmgpp2Xj4yQnYJtdZKimpWcop+QrrKiq5aqq5irr6WloaWqkpKZnImVnKKelrCmqaq6tr6zsq6+ubago6aopaacnK2pqY1maWRiVE1OSElPSlZMPUxETUlKQENEPFFVPEFBQkVPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2e2ZXPDo9Li5TYUxWSH5lXkhGrJSboZ+7rpiUnouSqpuRkpOIqo2Hop6Mo62Uo6S2x720wbvCwsjJxsLOyMK+urKvubXBw8q2xrLBvLW7rKmtrbGko5mqtbunqqesqp2or6ikq6u+u6itvbS3vse8trW4wLC9wLOqtbasv6aPopaQoJ+7noman5mWnZ2Ptp6om6SimpugmaeksaCanaWcp6mcl5OOlJuKloiMpKGUnKKeobWvpaWTsqyaq62fn6Wkq5KWlaCEkJ6fnJWopKGhs7S6tq2otbKynZ2jpZqXlZmqoZ54ZGBiYExJR0hOUUlNRUZGQlFKSEBER0FWU0RIPEFHUTE6Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRKiXpJ6ew6ybl6SXmKiblZmajqqWlaimlaytmaGrt8XBu7+4wcLAyMS/zce8vrqysLi0v8PItsCwvLa6t6ekq6ytoaGbq6vEoqWorKaeq6+toqqovrimrb+wt7fHt7S5uL+xvsG2tLK1sL6klqOVkpqTrZ+QoaKkoqKekL6kqJ2oq5ycoJqln7yil6OeoaiqoJyUjJSdk52GjoSNk56koJ22rKWcl7OnmrCpoJurn6KOmpaghY6hmpySpaSal6uxtrKrpaqtrJyYoKCSjpCWqZ+UaWZcY19RSkhLT01IRURJQD1PSEA7RklIW1JPSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9TRjxLeGZjWE6im6ObnsWsoJ6rnZytn5GinpakoKaqq5e3saOqs7bFwr3Atr/BvMnCv8rItri2tLG0tLfCxre/sbi1uragp62rrZ+en6WkwaWhqq6gpKmtsKKmqL21pbG8t7a2xLKzt7q+ssPAt7ittLW1o5yklJGToKyemKGcqKiqoprCrKidq62amp2YpZ+9oZykl6qrq6WgmI2an5KdiI5Xf5aepaGguaunk5m3o5+zoqGcsZihkJuWnoKPoJeXjqKjlZClrrKsqaKipaSVlZ2Yi4+Sk6SfiWNnXGViTkpLS09GRUFHSz49SUE6OEpKTl1RUUk9TFZcOUZJPUVNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQnp+hmJ7Dp6Wis6CbsaaSqaOfo5+tqaudvLGprLWyyMPBw7PCw73HxL3Fyr2wsbausbWwv8W1urGwuratm6mwqqucnqahqMGtnK2xnKmirrGqpKi9t6a2u72vt8Sts7TCv7LGs7q3q7W2raqipZWUk6KroJ+fmqeqrq+vu7Gln6mpmJiXkqGjuKCgo5Gur6ukpZ2RoJ2UnY6QjJSdmqKfqLWnp42ZtZyjsJugnbCRoZWZlZuBkqKWkI6goJOLpaywpaainaCekpKak4aLko2cn4BkaF1pZ0tKTUpTQUNASUc7O0Y+OTlOTVVfUlNKPk9eXj1IUEJNTUk4TmRcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQTdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wO3ZdXj9bVV9nckA4PEiWd2VBNJ+knpufwqejqbGgo7SplLGqpqKksqytqbuzrbC0tMe/xMO1v8S+ysW2wcnCtqy1qbG4rMDEtLivrba6pZmrsqyrmaGnmK27tJyosJusn660sqirurKnubS3srnBqrezw720xae+rq23tamorKGWlZGlo6Kil5ekrretsbS2n56opJmUlJOjoLaipKWVrbGxpaikoJ2amZmVl6ign5minq+zoqaNmK+apa2Ym6Cnk56QlpqbhpeglI2QnZ6Ti6ipq6GnoJqelo2PmZCChpaJlZ96ZWtebWtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUFXYV1CSVNIV0tIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2NaMzM5MDZwW2JIMDVKcWpXRFdGjHlmQzukpJygpb+lqK6uoKm1qZy3r6ujqrS2sbC4t7C3t7jFvMPHvbzDwsjBusLGwruqtqWtu67Bw7i4q66yvKOVrrGus5emqJGquqmhp7CdqqCvtLOrqra1rLuss7K6t6y5sMK6vr+mw6qwt6+pq6umnZiYqqChoJGXoLCus6qwuJmbqp+ZlpKXpp+2qKSioq+ws6uxpqqfm5+fm52lnaGYnaO0sJyfkZSmm6GqnJakopibjJealJaXnpSJkZuZlI6pqKefo5uZm5OHj5mLfYyXho+abGluYm5vWFFSWlRBQ0RVQDs6SUE3OlhQZF5QV1dFWV9eTUxTTl5MSj9aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1ERkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZUAxNzQ3Z1lhRihAOG19aVxWO4l7Y0M9qJ+coam8oaqvqqKwt6iks7Kroay1va6zub27vbe2wcK/ycO5xMPBwbnFvsG5sLaorLeyvL+/taqvsrifl6ytqa+YqamOp7uepa2zn6uisbCzrKq1s7W8ra+xtaywtbLAusW3q72vsbesramisaWepaieo5aPmJ+yqbKpqbKZnaebmpSMoKaktK6noqysrbCnsqqwqaKbnqijnpShmZyot6mYmpOSn5qfoqCSraGbm4iXmoyemp2Ui4+Xl5qXpqWjoJ2WlpaTgJCVhHuPk4SMl2dtcmhxc19HWWZWRENOWERaOUhCNT5dUWhcTlpdSFtfXk5NU1hkSktDXWNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FVMTUxPWBWXzgpQzNZVVxoSzWMemZMQKWaoKSstaOsqKWurbWorrK4pqewt8W3sbe/wcK2tbrFvsvEucPBu8C6xbjBurO0rKq6t7u7vrWrr7G3mZmorKysna2rj6u9nquvsaOpn7Gts6+utrG5tqqtr7KotrC0urzKsqq1tLG0sK+nobOfmqisn6SVlZqZsaKtoKWvlqKkmZmSjKKlp7Kpoaaxq6m0pa6vs66jmJ2tp5uXnpqarLmjmJSRj5mdoZmYla6ioJeDlpuPnp2Zl5GKlJOemqWio6GZlpOSlXuMkIV6jYuDi5Nsbnlvdn1hRmBqWklIWlw9e0pHRTZBY1RpW01cYUtcXVtSUlNiYUxLRWBhYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUTEWalp+wqLCprKSjrq21qLayt6Oss7fJu7W7vMC+tbS3w8DMx7zDvbi/wMC4wL2yva6ourq4t8O3rK6yupaXp6+tqKSyqpSvu6SssrKnp6OytLGysbWwt7Oprqyyp7ivtrTDxbaptbWrsK2qp6O2np+nsZ+jlJuYlLGep5ufqY2po52clZelpaS3p6Kxs6unsKetr7SspJigrKicnJ2claq5nJWPj4yZnaKYkZmppaKZhpSYkZ6cmJeXiZeQl5qonaSgkpaSkJV2hJCGe4aDhIyMbnF4dnyAXExlbFxLTmNdPmJ7R0k4R2hXZVtMXmJNWVpXVFhVal1QUEhhXl9QS0dRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3FqTEVEkZikraSsraqlo7Cxs6m2r7Wfq7S5yLquwr3DuLOytcLDzsTAwr61vsHAu7+9tMSpq7qxt7jAvLCttLSeoaexrqamsaWdsbWsqbKwq6iptbqstbK1q7OsqquprKm5rrKwx7+4pLmvqa2tpqetsaWko66jqJydm5qumaOioqOQrJ+joJ+hqaaluKSrtLSkqquprK62rqKdo6iqnKCam5OktJmPio6IkaOhlo+Vn6OXloeQlZWem5mWlYiYk5WZp52hn42TkY6Qd36PhHx9foeKinJ0c39+fVxTY25fTllnXEZElltHOk1uWGJbTmFiT1ZXVldUWWheUVNNY1tbVUtGT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RlOzYqSGRISis6ST8zQ0lTLD6PbEBISZCaqKmhqK+kpqKzs7CztK+woKutvcy7rsG9x7G0rrTCw9HExb/Cs7/Cw7y/uL3FqK23rLS5vcCxrLOuoqSnrqqopbCjqbCqraqxrq6sq7O7p7awsqmzqaumpaSuuqyqscO5tKu5qamoramnsaWppKOtqaiinpuirJWknZeemaydoqeooaymo62st7GwoKmioKqusKydnqeoqZqjmJmQoaiYh4SPi4ufoZCNj5ifk5KIiZOXoZ2WmZaHl5OTl6WcnZ2MkpCNiX9/iIR7d4CHhYd0dHKJd2xfWWBuY1FzclxLO4R8Rj5XdVhhWU9kXE5WVlVXUVxiX1NQT2hZV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTM5ODsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDI9XkswLklnREY4PEIwNUVLWDFAlF1BTkaVlqynoKmxnKeosLWst7StqqSrqr3JvLG/ucOvsa2zxMPNzsO/wLTAw8S6wbTJxKyvt66zusC+tK+vrKeoqrGpp6ixpbOsqq+trbGusq2zu6W4s6yrrqeroKOesbirqq26tqS1taSqp6ysqq2gqKensLGjpqWhoayWqqGTm6CmnqSiqqOsop6msbasrKGlopqpqq6qnKGlpKSZoJmWkJielIKDkImFnaGNjJCOnJKUjoWPmqWbk5KbjJOSkpSjmpyai4+Li3yGgYKBenWBg4F/dXiKooZ4al5gbmZXZYdkTkBnkkxEYnpXYlhSZlVNVlZWVE9cXWFVS09pV1ZWSEpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC4yLCYwN1haLjBKZ0FBPDxDKzpKT140RIdDSklElpCvpKGqr5eop621qrWwqqSrqqi8wcC5urS8taayr8TJy9G/wbu4v8DDusK6wsSusrWytLzBvbOyr62srae2qqatr6q3raewsK6xq7WqtrantberrKSpqZyknrSzqaiks7Sfta2hqqiqqKynn6usqbi1qamqqaGpoK2bkaqhnaCko6ajqp2cprSup6SpoqOXpKanqpyipKOgmpigkY+PmY5/iI2HhJ6eiYaMjJGRk4+FiZejmo6Nm5GSkI+SoJial42LhH90hoJ/fnh1g397eH5/h5yPcHFmZ3F4XGF0iGpPXZhWSG15VWVWU2RQTVZVVVFPWFtiVklQalVXVEdPWFVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UyMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIvMjIlLzNSYzAyP2Y9Tlg/Qyw/TFRfL0lsOFJGO5WMr6CkqquZqaOtrrK0r6mlr6mou7+8wbKwua2itq/Ix8fQwL+9u7zDvrvEwr+/r7Kzsra+vMKxsrSrtKmltamlrbKyt66irLSxr7G5q7iuqa63rKqeqqugo6G2ramhn6+yobSqn6inqqKqoaGsrai9rquuraGnp5+smY+wopiioainnqebmamwqaKeq6GhkqGio6eYmamlmJiZnY+Lh5WIfY6GhIWkl4aDhI2IkZCShoeWoZeIkp6Sk5CNkZ2Vl4+Lhod4dIGAfHR3eYB7dXR7a4KHpHZpXmVsgXVniIx8UlZvXkt4c1RkU1JfTU1TWmdOTVdZZVlHU2lSUj9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytITztZRDOPjbGgpKWpo6SirKazsrCopLCnqri+wbyxqbmqp66wycbH0MO+wL65v8C9ybzBuLGwtbK6vLnAs7S8rLmso7Smpquwtbexpaa5tKyzu6+8pa2ttqutnKmvpJ+krKqonJ6qsqSzqJqrp6qkqJ2iqaeqvaq0sK6dqaSgrpyas6OWpZylpJ+lmpqoq6Wemqihm5GboKSdmZepqpKZmpKQi4OPhX6Pgn+In4+HgX+NiJORkYaDlZuUhZOjjpSRi5Gbk5aHin+AcXp5fXxodnx6dXFyfmqGeYWIZF9nY3KFe21oeV1eVUFXe21UYVBSWUxMTnB0XUlaW2haRlZmUEM+Sk9EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtGXUAqjZGwmJ6fqKSioauktrGxpKmwpq25wb22saS5rKiosMLIyMzCt72/tbjBuci2wrW1s7Wyvbm6vbavuba/rKKzpqqqrrS2s6ibubuosL6yuqCutLapq5+tsaOcpaipo52bpbCmr6Cfq6mnoambo6igrbynrrCuoaqipK6enq2mmJ+aoaKcn5uZo6qimpqipJWWlJ+hlpuWpayMn5GQkYyCioCAj4B7mpWNin2AjYiSkY2LhpOYkYaUo4uSkYiQmZCUgYl9eWt9dnh4Ynp6cW9xdHhrgnVrgmdjZ2Juc45tYmpvYG9AXHlsVV5OUVJLSk1UWVZNXF5tV0VZYFBeT0hNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl4+I5GWrJiel6eioJ+no7evraGvr6isuMO7tK6gua+rqLS6x8rHv7jBva+0v7fEt8OzsLqxssC2u763qrm4vqqktaeoqa+suK+nmLm7o62+tLSgrbe1p6ansLOgnqWmp6CkmZ6sp6ieoKqvp6CmlqKon7G4n6Sxr6CroayknKanqJqbnJ+jlZybmp2pppabnqiRmJOZnZOZlqGqkZuKjpCHfYd/go59fKGNjYl6hI6GjI6NhoqTmo6IlZ+JkZWCjJeNkn2FfHNwfHFzdF94d2lucXFwa4B0ZXpsZ2VkYmaGgGBbcmpyTU2AaVhaTVFMS0hQU1BHTFtgb1RGWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VcRk89UlpnSCo/MF1cNSiVm6aYm5Wsnp2ho6C2qq+jtLOpqbnFt7OuoLetraywtcXHwLe/wbmwtb23v7u+sKy+sLO/srzCuKq7urinqLWnp6qvqrGupJe7taOqurWvnrG4r6mlp6+xm6GkoKSjoJabr6WhnqKor6GgoZKjpKK3sKGmsaufq6OumJ2qpaifmJudpJOZm5qdpamZm5ullZSXlZyOk5iiqaKRiouQhnqEfoSLeo6Xio6He4OJhIqOj4aQk5iMjpWZi4+XfoaXjJB6gXtwcndub3Ned3dkbGxsa2qFb2dyaWplaV1kc4FgW2t2aVpKf15bWU5PS0hIU1ZHMzheX2xQRVlWWmVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFRdaEQuPDJkVywxlKGhlpSbqpujoaKhtqmtoLu3pay9xbSwr6O2sKysrrTDw7yzvrq2sLO5uLq3uq+uwLOzua+/wLesvbq1paKyqaaosamrsJ+Zv7Skp7S1qJ6yvKmopamvq5mip5yjpZSXoLGkmZ6kqaicoZ+SpKCkuKmkp66nnaShqJOgqaKhoZmbnJ+SmZuWn6Kqm5qYoJSRlZeajZOTpKmkkImKj4Z6hHuEhXydjYqLh3uChYiJipGGl5KSi5CUlI2OlHqDl5CLd358bHRybGtzYHd0aGhqZ2dwh2hoaGRmaWpgamNqaFtme2JgU3RUXFtSTEpHSVBUQCEqaF9pTUVYVV9gTEpIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEaFtKV0dVYGhCMzc5Z1AnMp6ipJGOo6eZnJ6do7Osp6q6tqasw8G4sayjtq6nra62v7+8ssG2sK2ytra4tratqr2zrrKxvL63r7y7saWftamkpLOmqK2dnMCqp6Svs6mstbueqamssKWYnamdpqSRmKWsoZidpKmhm6Gblp+dp7WmsKquoKCdnaGVoKagoqCam5mbkpidk6WdrKGXlp2Uk42VmIuOmJupoJKJiouJeYV2gYKBnYeLg4l+gIaJh4eRhJeUj46PkZGRjJN6g5WPhnN+fmZ5b2pqa2V0c2tiZ2RkdoFjZWZmZWpqY2tyW19ZXWxjYU5pWFpgVkpHSEtNU1c+OV5saEhEVlRdW0lKR0ZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlbTFpKVmJmQDozQmhIJTWao6CPjKuhlpaglqSysaKyvbahscW8urKxo7esqq2puLy6uq3Asa6urravsrizqau5sa+us7W6tbC4vaymnrSpn6Cwoqitm6K/n7CjrrGvt661nq2vra2imZ2mqKWflZqnpZ+YpKKonZqfmpOcnqyvprqorqKhmpuemZ6kmqSdl56Ym5SYn5KolaqnmpOampKMlZmNlJSbqqeOjoqKj3yCc4GBipiFh32JioaGi42Lk4WVm5OSjo+Rlo6Qf4CNjoNvgX9meW1na2lmcHJrXGdjY3SCYmZnam5sZ2pqaW5dbGxycGBUY2ljZlpJRk1NT1hRUFVhZYBVQVdTWVRHSUZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlBMS0rLjM8O0s2MC4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY6vnZmToZqpsa+euL+1oLTBu766saa3sKetpLe4t7asu66sqqu3qrO3rqaytbKuqbC1tbCytbmmqJ+0p5ydqKCnq5qnvZeso66wtbWtraCxrbCooZuco6unm5SbpqOdmqmipJWan5uQm6Sqq6q7oKekoJiamZ2hj2uilpmccIKVmaOAdZKpp56UlJ6QiZiagJaKopB5h5SNg21qf3eDcWyGi4Z+hYyHcV9kYWeEmIVrio2UknR3i4R+g5CAZ4eAZ3VoZVdcaHNuTVBpY2dyhWhfZWZubWpdYGGKj4OEZU5LRDlHVGheSkhRUVVVTEhTYXB0ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsLDA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6Mjc2WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoukmYaVsJuak6Cbqqyqo73Frqm3wre9vK2nt7CkqqK3s7GysLmsqaastKWvtKOpt7W1qKertrKttK2zoaifsqmdoaOZpKWYq7mTpaWvs7etr6WqrqqspKGenKCmppuWoKWkm5unpp2Tnp6Xj52oqaS2sKSjopyWmJeXo4ihjpKahqCHkpygf6V/pqqekpKakYiEc3iNjoWIoXaJjWmXiWZ+c3igb4iHhH6PfX+hoKCZgH2HnnOGjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxb4hZXmlbbGxbiHJuenKFZoaEWl9HTj9HX05GUlZWUVFSV1VnXU1WSVJST0ZIRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiouKC00NTczJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKp5aDnaudmJidn6qpp6q/w66xury3wL+qpbewqKylsrSurrO2qqiksK2ltLKcrrW2tKanp7KwrLKorZ2poLCnn6OimJ+hmq2yk6OlpbW9pq2nq6qsqKWgn5ifpqOZmKWio5icpKiWk6Kbk5OjpaahuKSkoKOYlZOXk5yIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZzGeXixpbeXZYDAnL95hIV6koR9kJCRynKXu5zFenK1pruQe4Btl7GrsHlobFixrm5labySvG5nem5yj9h+U2tjtrJ+gXOUc5qhqpBXT1diT1ZORlVbWFFQU41dV1tRQV1EUE5FSEk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTlXg3cyMVRrXE9bTV5nXD5MMVtdNDEhi6eTgaepn5ecnaWssaiwwr2ytcC1tr7Bq6azrKyopq6zqa62s6anpbSlp7etnLOxtaumpKewraywpqmcpqOvoqCfnZWZnpytq5Odop+zuqOrqaKtrqWhm5qZoaefl5qnn56XnqankZymmZOdoaaiobGjn5+jl5aSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUcK6hpH54u31soZB2sV9qtFulgGWckGFng3tngGt5a6llvnFnpot1sWp7sXh0kpRjbm2nbluEoUVoZoeWRXWcYH5nfKSnglpgjKtogJV4eWqnN0qvXFhTbGRbS09YYFxXVjtOi09XVy9JVFNKREZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MDMuMzNFNC4uNTMvKy8oLjAuOjYvJyQyMDNCLz47VYJ2Mi1WalxPWUxfZ1k6TTVfWDMwG5CilYOtp6Weo6Sqsbestb2+sLbEsbe6waaosKquqKivrqOwuq+jpK2yo6m3p56ysrCjpaGprK6rr6amnaKhr5qhm5aUlpqbrKSVmqGes7OirJyjra2gnZmWn6GonJieo5+bmaGmpI+copmWoJ+qnqemoZqgoZWVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH9rgaZ7goaIk5STd6tna7Fcq3qNhpR0iXKPh4GBiZCXeIKBi5eLg6COg7B2d59xbGxsfItOpFhIYmKZfmNopl95cnVTk4deUaltY3F9hoBinC5RoW9bU2toYExKXGVZXFpCPrJ7WFhBI01oRkNFQUBBMTk+ODg6ODQ7OTk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QEZCQEFEPEZEOzAyMDE7Ri0wLjk0MCwuKC8zLD44MzEfLzItRDE9PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuUoJWHs6amoa+pqLKsqbu2wrC7wa24t7+prK2traWssamgrruqoKezraOqtKOmsrKno6Kepqqxp6+npJ2fn66VnpmUlJSYnaygmZmkqLWvoqqPqqiqm52Ul6Clp5qenKKem5+ipKKVm56XmZ2iqZummpyboqGXk5GSk5yD1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46IpIOlg3qseY+dVq96iH6fa7lbuneHhH6mgpR7l3qqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiFgIl8Y6QzQp12XVBqaWNQQFhoWmRhSkhNcVFcUU9ZZlpDRT9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdIOmFQNzElm6KUmLKoqKa0qqW0qaS8t8Gwub+wtbS6srSnsK+ir7Kln621qJqnuK2ir7Cfs7SwoKSen6apsKizqKObnJ2qlZiXlZaTlqCpnJmWp62wqaOfj62iqJadlZugpaCYoaChoJqhoaeanqGelJiapqCcp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52Non6RoaZ/sXeDkdLSdlyue4V/pG+bqqZrh4V9rX2YmY57sXGSno53s2WXdISeb55nlFHIi1rCXKB5Yl+sYHVzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFQa2BsaFBWR0o5PVVSWldYSUQ/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE/Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1gTDYyMKKdkqSxraOrvK2mtKantbq8srq+trWzubiypLSyoLCxop6rr6OXpritpLGwnLS3qaClnqGppLGnrKmjmZuZp52Vk5eXkJKhp5+Vk6WqsKail5OtoKaSk5+bo6WelZqlpqCaop+tmaGenZCVm6GdnKWVnZWZop6VmJWRm4Wse3eodqONiIapb62KgqeDmJihipKbi6J/k5qJroSAgrNccrNSrn2CgqN/cth+eIZ+j52Gmpl2r4aHkZyHdrRhmmWagoKVbZJasFhLmnWYeWZgrF51d4homIhrXa93lZ6PeGw1eciusl9CVG9eZ2BFUG1gcG1WVk0uZmVpU1lQO0JFQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdCX0g6OTmgnpWgubGXtMKuqLKoqbK6t7O3vri3sbS6tKS3sp6zrJ+fqKuelKe1q6iwsaqts6ObqaCfp6G1pqWpopiclKSgk5Kbl5GUoqSakpCmra+moZaZqaCijpChmaekn5WZpKidnKSerJyhnJ+Mk5+anaGZmZuWl6Kgk5ePpp2GqX19pXihjo2CqnCti4GnhpafoYmYmIijg5KIlKt9gIudeW+xWqiCgoifenTZgHeIdKiBjpuMkqR7lI+fhHqyXp1koH6DlW2SXatbWpOAkX9oZ6pjcXuBa5iHc12rWomgjmtvZU9KQ6FcW0x0XWJnTVthX3FzX0tXN0qcmFhHRT1IR0FNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSF5CMj84o56ZmsGrl7TCrqusqaa0sLewtb65uLGwtbqourOfr6SdpKamnpOpr6iuqLWrqa6hmKCgpqSjuaGiq6CWmpChn5STnpmTmJ6fkIyMqbCwp56Xm6imoIyRo5enqqaUl6innp6goq2koZ6hjJOhmJ+gkp6XnJWdoZWWjaqcj65tcrRzqYt1iqdztHhzs4CRpKORnY6JpIeQd7hwjXuLomprtlqhhWWXl2mgoqdulHK0dJOZfrJqhZGHrWp1s2GdZqJvh5Nrl12tYE2hfIaSUnOja3l/fm+Yh3Fcr1Y8nHdmVG9uLlynT2NTa2VibVljXWFwe2NUW1M+PW5xM0NCQD9MOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKacm568oZyywK+tq6unt6m3rrW/tLqvrre2qsC1qKmgm6WjoZyRqamntKKyp62poJecp5+kq7idoqyalZiOo6KVjJ2gm5icn5GTlKu2saiZlZysqZeMk6WYpKyikZWqsaOfnqarsZmho5CYopagm5aclqGTnKmclJCqmYfUkpq7c7DDgMOGftWWm7h4iJCYjJiLjKeIeqS2dX53dsKCmrJgg7p5wH12uGO1gYyHqX2VgaupcXt/dLyIp6BpnWGmjq+hfox1h6t9vm9zvHSyg3R4gYpumohxbo2kdL1ed31aYXm8a1pWXGp5XmpgZmdjbXhvWVxaQ0BAdEBDRys0RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgYF9fWlBQUktFRko0SExSQEpORUZPQj1FODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmom56jvaGXssOwramqrLGmt6+2w7C4sK24rq3AsKujop2joZybkKijqrKktKWspJ6VmqqYpqy4nKKtl5SfkKSfkoycop6XnZqRlZOvubKslpikqKeUkJaknKOsnZCfqKuemp+oorOfo6WOp6GUopudmJWjmI+vn5GUqZ6FkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahwgHORuYN9h4aNh418ioeNmHyku7m9nHR5tKN0d5d2dLB1mZ5mh2qNtnRycXi2jF5/en2JaIN5bnpji6xwdYV/WFunakVkWlRmYGNeY1FnZ3BsdUNOUUxDOlpNP0syOy8gOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlUnPjs8qJ6hosCllrXEtKyqqKyqqbmusMWts7Kttaa0uKypoaGlnqCdmZOqo6yqpbWnpp+blaCjnaykvKWgqZaTm5Chm5KPoaehkp2XlJiVsrW3rZmepKSii5KRpZukqpuVqKSlm5mhqKanpKqhkq2el6SemJeXnZ6Pr6iTm6WhjWp9aZqld4ZyfZqOdHlkh3u9vsC6b5ODcpaIYXNrWl+bimFjiI+Va2CAlmRunndjlmyBmpWUZV5gYnCZiGlyi32GlWdrf3J0eH1/Ylx4dIFoUF1ug317i2tYa3qCc0pKb4ZwTnRMRVhdZ2FMW1hmY19PW211aXFSUURFTTtHST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTX1Y0KVBfTCgyPVtPJz8yPqmgqKLCo5u1u7airKWup6e0sazHq6+yqrOivbCwpZ+ip52jm5mZq6auo6S0qaSbmJWgmqatqL2nqKSUk5qVn5mSlqSpqJCekZCYnbCzv6ybp56nooiTkamap6Obmqqgo5mao6eso6Cso5uxm5SnoJeVnZ+dlrCkl6CnmJqQm5uhoZekoZmcmZmZj5WBZ219cXeSmJSShoy2q42HmJaOioyYloeUlYuEk5SSiY6TlJmUmJaZn6GZmpOgnI2CeqWFbWt9kH2AdYuKgXGCeHl2dYl/fIlqc4F0g3Vldn13a296bV9kXXBoTVlaZmpfV1pveW1tZlVPRlI5TllNUk8oKzpLQjYzNT1AQTo6Qz48RU5TU1RWV1haWlxcYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODEwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzobOjwKGksrK3oKmlsqelr7Sqx6qsr6SzpMCns6CdpKSco5WVn6qmrKKjtqufmJaVn5etqaXAnqqjlZGal56YkpOhnp6ip5OSmqmos8Swmqudq5+PlpaonaqcnJ+rmKCam6Kkr6eipqigr5iXp52ZmaCenZyvoJygpZSWkZeTnp+UoZ2XoI6Wk4qKjY6XrpB8lpyDkoKLq6mFgZmXiYSPnoh6hJCIhpqSiIeKlo+bl42Ql52jlZiSkJyNf45nobOvhYqFdnuSin13eXpvZnmPgYGJa3WBeYhzaXN/e3aDhoJqdWR6ZmBqZWNkZmtZa3tvaWpdU0xQRF5URUA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaW19iY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RcUTA1TlsxN0UzW0c1PCxAtKG5sL+sq6+ysaCqp7Ktoqyyr8Svqaqisa28orObn6aioZyYl6elqaWkpbK0npSTnZmZsKWtvqCropCQnZmZlJGVoZyXqJ2Enqyso7TItKCqpKuXlZeapp2omp6jqpOen52gqq+qpqSso6+bn6CgmKSenJ6crqOYnqeSlpabkKKXlqecmpZlgpJ8ZX6NmpBjeY5taGt7kqWramWbmH1nhoplZWloe46ij2xojZiRo3draoqYop6Xc2tteoSOiHpYZl6Gg15tjIqBdlxoc3d2kX+Igm13gXh/c255hHR2iYeOg3xqh1lebHVlXXOJaWt7cGtjX1JOV0lkWEFKND5GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJVV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaWgury6r6y0saqlqK2usKatrLC7sKimo6ytsJ6slp+jnaKZmaaqnK2jpaeosq6elKKPoq+ltbilraKOjZmgmZOSm6CZmaWWfKWvo6i1xbiloqevnpyUnqKeo5uiqKiRnqCdoaqwq6ykq6Gqm6efp5+rlqCbpa+jlpuolZ+cmpGilZypl519vYOIcrRyhJ2GrWh4ucS4cZSjo3qmmZlyq4J8y8DAu3GMo4iDnnyWmImdwL2Blp2djJzBwXyCfJONmsPAfmylsm+MgW/Ken+bdpCDjoF1eYCAeXF6f4dwd4WMk3lteJRiZ2B4ZF9lgmJec2dsZGRZTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUVNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9VQUI7LziWo7nDtbCwwaqolKOvqLCuraWys66ppKWlr6ueqpiaop+cmqqmoZ2roqSopKS0pJyikqWtq7ezp62ikZCYnKWSkKChmJyfnYinraWsrsHAsaGprqmWkp6doZmhoqmjkqCgnZ6sr6uup6SkqKGmpZ2sqJGjmqisqZqcp5qqn5WWo5SfoZWbfs6UeHqkgXmVlptfro9ejqiCo6F8p5abc6uDgK9eY42qe6iHhaB0l5OIs2OCq4agjY2zaoSvdX2XiLdig61ao81ukHZ72nt/mXB9iJJ2fWV6h3Z2a3yHbn2FkJF+bYOQYHFscGhgX3llXHFnamRnYFJUUlddS09ENUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqits6ulsqqrqqKrpq6pn6abmaWYnKKvn6CfqKejpaCesKuanZWmrauwqqirn5SRmp+kko+fpZeep6Ofr6atsanAx7OoqbGulpKdm6GXn6ipnpSgn52drbCprKucqKiloquSq7KWpKGqqZ2ipaSfrp+RmKWXnpmSk5CXoHGFjJd1haiGcbF9nnKsf6KfgaWQn3argn2tf5xzrX+sh4afdpmSe3yXfqqIoYuRi519q3uJlZCggXutV53Fe49wk8F9gZVsdXCMbWV2ZYVvYXducm+JipKOg26TkmZwdXVxYWdtZl9vaGluZ2RXVF1hWlJTQzlKSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08KD0xKTNXQEYhHEc6QzEuK7DTxsays5+coo6joqKsrrauqLGlqKmmraqqp6GjnZmilZ+lq5+hpZ+oqKKenbCsl5qWqaeuq6imp56XlJmjoZKUoa2bnaejr62lrrarus6xraauq5aVnJ2imJ6tq5yWoJmdn6mzq6urnK2rpaOsmq6xoaerraWXpKmnp6+gkJSiopiTkISkaqR1iXqpdHqycIKmipmMcYmgmoakYGFSrIV/roObdq2CqIaFn3uZl4V6ZoCjiaSYhoKjfal+gZaIrl98qVaeo5KBeqOfgHvDrsSLcq+zs7lxYqmvwnRojIyYjoFunJVxb3p4eXBsZmZlcnBmfWpjXVdgalhZVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NSoyUEtMIyBBOUQ0LCfDydbUv6GZq6egrqKer7SwrqmsoqelqaqqqKSmoJuknp2mp6ejnKuZoqyho5+voZ2akquktK6uoKeanZWTpqKRm6KooKCmnbGmpqmyrbfJsrWqq6mWkZycopifpbOcmaCUnZ+nrK2lsJutq6OjqqGyraGpsrChmainrK2zoZGUoaWWmZB7qWyehId1q3l8sG+CpYyJn5aWoJWB0ri0t8mBgbJfYJSpg6WIh6B6mZWaeKrJdJmklKmpkJKbjYCdiprGxnlnoYKldIGfjoJ9r11vtGKwdUujh22nR4KTZI6QnpJ8cZmVgXF7dX58blxmanNxZoFrX2FZZG5cX1lJTU1LRURBQj5BPEI/STs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKSim7K4rKqgpZqopKmrqqefpqaYqqOgr6uepaCsmp6ppZ2ntZ6il5OpqrWxrJuknKCUj6WskZqcp6OhqqeuoqaoqrG1w7Kzqqyok4mXnKSaoaOupZehlZmcpaatnLGerqmnn6uitqygsLiunZqtprCxsKKSlqahmJ6Ngp1OeJqBf596hKN9g6SFh6afnZ+UhLh7fHm5gn/MxsK2eJuhkYuefpqWl4p2n5eKpZekqX+whZ2GoISsfZqVY6ZtpHCPhZCBfJaCcqxgo3JwgJpgvH1SVXSOkqOWe36Uk4x2e3OHgHFdbW54cmqCb1tkX2pvY2VdS01RVEFJSEZJOjlLP0IxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZZWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmKmrpKq4qq6gm6CssrOlnqCVpa2traqnnKanm6OoobOvo6mnsqCYqKSUorWiopWXoqm0uKOboZyjko+hsZmenKemoaKwrp2mqaO2s8WwramsqZGHkJynnKKknKWWnpiZmqalq5yxoq+lppivpLutobW1rJycs7C2r7CklZyunqKchY/RtcO3eYeOhZGTkICmeZShd4ygkoSlgopxqoaFtW5yaZqknJWKn32YmYaHj3Ovgqabo46mi5Odi5WQm25xsl2ldJN6nGyYf3uZfG2pYaJxcX6fYnOyuGh3j5SmmH2NjpWOen15kINuanlpenNvgXVeZWVvbmZoYEpbWFg8SEhAVTRARj48Kik2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBfXVtaW1hVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVVVVFPUVtVJSEyQUgkKSWSc4yKrb2+vLm0npanpK21oaGYlaOnpq2rrJmmo5+moaG2qKOpp7CjlKujjqWto52QmZqqs7OknKOcqJGUl66foJ6npJ2onbaao6uktq3EsKmrqaKMhI6coqCmopWZmZyZm5mnpqiZraivo6WbrKa9rJS8r6ydoa6wt6mwpJinr6GmlnmokH18sHeKgKSliJxtsnChh618oY+DqJWYgKyJha6FoJWqoKKXhp+BmpWAe5J+q4CdmpeLqnedoJKKlJKBeq9epIF9pqdknX98l3Jqr12kanCGmV1gW4ygbZWRppmClY+ajnx8hJqAa26AY390boB6YGdmcW9paGdDWmFbPUtVM1U4QkJDOCQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaV1NQT05JNzA0Mi4qLEFUVlZWVFRVVFVVVFRVVFNUVldXWFZVVVFIRklKIygovZKag6jFwbbAs56arKCtt6WjjpukoqCwsKufpaCerZmfuaGjq6CvqZqtoZCrqKSWiZuQrbCspp6lm62XmI+soaGdpaGapZ2vmaKpp7eqwa+lqKSei4CNm5qfpp6SlJialJuapqWmm6qsraSknqmovqWWwaqpoaCqsLepq6Sesq2mqJd1r36Qi5yFh366rYqZZbCNZZWtfaGPg6eVmoGsioSwhaaapKGikYWhXWxrgbNgf617e4OBsW1nbpmZjYmxW361XKSEa8iiZJ+Ae7tXdrVZsn1SroB6rFeAoW2Xj6ibjJiSmpl8epGgf2R1f2OGeHWBfWJraHJuZ2ZlUFVkXEFWYD5JKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBgYGFiXl9cW1hVUE5KR0M1NTMuL0BVWVhXWFdYWFdXV1dWV1dWV1hXV1hZWlpbXFhXV0dCO9KfsrG2vbqzwbKinKympLWooIqaoJ2cs7Oqn6ShnraZobSoqqyesK2eq5yVr6ehjoibj6+rqKahpZmukpiPqJminaWfmqSjppqho6qzqr2vpKienY59i5uVoKCZj5GZm5KamKmgo5qprqilpaKkqLqen8Slo6efqbKzqqyknbmrqquUgKmSo6+Om4CHpJeZkIKAuMO6g46ck4Snl5yCrIqCr4mnnJumq5F+1r3CqmKkv719fqOCg9e7uLWGlpSEnr2+hG2jgm+rhGycgHqysMeDaauwvKx3dqG+vHOAlo6mnZGckpqge4OTnnxjfntlj2d6g3xhbGZta2NRYVtTalxAVWJDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzg7PkFDRUdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbOzsL+4sbyyopytpqWypp2LmKXAqriyqKLAp6iznZ+ynbqon66vpaaVlLCrl4yCm5GupaKsoKOcqp+XiqOTp56nnJuhqaSZoKKsrqq6raijm5eSfIiZkaWbko6Ql5mPmJOpmqGZqqmhqqego6q6najDop+soamwsqitp564paysmXN2qqS4hmSJoHBorpGLkG5ud6SQmZ+Bda6ZlHCPi3GWqKSbmK+kc21tbWaLeG9ugplwgXpqcWlnipiWmXJpaoWIZ3GGZF2IYmpvWVxmfXamX2FwjZBuZWV/jJOPoZmZmpOZoX2JkZh3Zoh4aY9se4B6ZW1kaG1jS2RYSmtaO1FmRlEnSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERkhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1dXWV1eXl1cXFxdXl1eXVtbVVdeqZWss6i5uLGzqqmhrZ6jsqqYkr+zxcu+t6ufwa2upKKpraC6o6SurK2ljZauqY+LhZaWrJ6mqqCdpKOgkYukk6eZqZqXpKuil5+npqiwu6usmpuSknyEl42lmI2RkJiUjpiVqJWgmamjm7CmnaKruZ+vv6ejsaSqrq+oq6mltaKstpWKoammt52JlqOZiKqbkZWdkqmzmZqiqqCylqKhnZ+inaGlopWsp42Tk42Hk5yclZGZk5mRj5aGgaWbmZaPjJSUjJCHhH5niX50gnVzh4pwp2x6k4+TkYCBjY6Qj52VopeamaWEiZeRdGuRd3KMeHh9emptZmVwZVVgWUBqW0hkYlBZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVV1leYGFjXV5UUUtFQz45PUBBU1hbXFpXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKaWqamktLWurqKwo62foLWxkI2syL7Gu7qro6afnaefsqqkt6edqbWnp5GYraKLh4mPm6eVrKSfmaifnpKUo5eomqialaeipJGcqJqhtrunqpmakI18gZWLoJSKlZGWkI+Ul6aRoJupoJy1o52mqranrsCtorWkra2uqqemsLafrLqYkaWjp7aikp6noI6qoI6Tn6OrsJqgo7CosJejoJyjqp+enp2XrJ6TmqKclJCWq5qOmZmXkZegkoihnpeVh5ONkY6Vi4F+ZYuFdYZ0d4eCc5xqho6Sk4+JfYuVkpKYlKOUn5mkhYmbin10l3R8jIBzfIBqb2ZfcWpgW2BabmRQYWZRWjpHR0U+Mj0+OS8qJispJh0mMzE2NjU4OT09P0FBQ0lKR0pLTE1TU1RVWmBgaWFlVlBLQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX2BhYmJhYWFgYmJiZGJcW2OXlaOmoq+xq66jqaasn6e1qpCQnaS1vbCtraOkm3yfpLOlprGpl5u4pqOUmaqcjoaKiZyij66eopWon6CSlpmbrouqlo+qmqmNmqmQn7m2pKWZnI2IeYGTi5qTipSRk5CNkpejjZ+fqJ6fuKJ/g661oq6udKK7obCedniep6+4k3Sro56Jf6t/ZFxidqCOpZ+EmH1tkrOdoqatqqNlnZ+Sc3mal3GBmamYbX+jqIplnKadkpeYloyTnZGGnpuRloSTiJCQkomFd2qOhnaFcHqFf39gaIeKk5GKWnWUkGdoj49zfKicnGZ7m4qFeplqhoyEcHqAa3FmYHdwbGtpXGZmYmNxVFs+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVlcYGhmZ1dRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5WloqCur6urqaWoraKmraWSlau3sbOnm6yorZh0jZ+xoKirp5SXuaCgj5yknpF/iYibnoyrmaKVp6GdjpeSnYV2rY+Jp5yqkpmkipy7s6egmZiLiHV3ko2Wk4mTkZCUjJCUoY+coaeZnLGVgYybtJyzjJKNuaWffaeieaCstH+NjaWeg4uGkLGqr42Ll6SbeoGLrIWcnqGmqKeHlYWYd6WbeoecgZeng4J7nbN6ioahmJqVmJaCkZeXhJuaY3qHkYWPkJKLg21wjod5f3B/gIR9hXOFg5SRd5ZoknSgmnR9mYSjoImYf5WOh4aaa5COh2x5fHJxaGZ5cGpsa1xlbGpndV1eSVRMUkBFNi5bVVU3KSEwOT4+NzQzNDY4Ozo9Pj5AREk/SUVKTEdTWFtZXGJhaGZZUUg5RUw7PmFWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop6lrKyrp6ygp7CmpqmmmZOvycCyopeoqrefkYWfrZynoqCOkL6emo2fmqCQfYaOmZeHq5yilqChkY2TioWAkqeNh6OepZWZnoegurGnnpuSjoVwdpCJlZCKlI+Pm4uPkqCSmKGklp6rh5+0ibSZrYrKhqisiLaFjK+BrquCqIymmI2dfaiPc3t3nI+nl2iVpHm0i6CdpaeSmMKAf6uImKFynoCapX6XhZWzgaF9oZShkJiXgY+UnIuZkox9hZOHjpaSioNtc4+FfnlxhoCDe4N0hICVgI/FZn+ph4+ja56FpJ2FmoGPkYmMmnGQlYZqeXZ8eGhpdnFoaGxeZHBtZ25ZZ0ddUU0zRTU3TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05KSkxDUFpdXFdiXmptXFFFPUtNQEljWF1jZmhnYmJiYmRjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqGer6anqKWrn6S3sKmrp5qVoKOlrKWYpqy5pLCBoqmdpp6dipS8mpONoZKej3qElpaRh6uZm5uaooWOjHeanI+fkIifpZyYmpmIo7mtpJmcjYx+Ym2PipOQjZCMjZeMkJKgj5SgoJmhp36hp4etnZ+VrY+cm5yQhH+gjKishaONqZmMmn+idYGZlGuCrXZNq3iHjZyRmqemgKmrfYOhe3qnap5/kmxnmIaYt4mefm5gZFmDl4CNfGRoi3KZfXmWbF19l25fUnCDXF9reIJfWGSAfIN/lnCnqmuDo25ypXCfhaBqZ6BtXHCOfmdaYISBY1hRcHdmbnZ0bGpwX2txbmxqWWlPXVhGOUE1SEVfbDUsSURSTU49ODQ4NTk7NkA7Oz5CUD5RUkxNQkpcXV9XXV5jdmBNRDpNT05UYVxcZmZpaWJiZGJkZGJhYmBjZGNhY2prZGJkZGdkYmdlYWNol5Wcn7ifqaOmrJGhtbuqrqOZmKGipa2uoZ6wtqSpk6KhoKecmo6ZtJqQi56MlYt1gZSSjYqnlZWZnp9+k4WFrKWHm5CLmqqZm5uSiaaxp6GVmoiJgGluiIeLjo6Ji42Si5CTo4yUn5+boaR/k4GPoqCToHaclI6ngZ+lfoWnqoKleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5qomY6HnXuConN2pmaefnekX5h6fZR0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNjc6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGCdmrSXc32Yn7N1dFyesoNrY3B1eHJpcFlrbXRzZ11qXmJMRT1ENlJCWnMzPVNHYEpSPTwzOTU6OjZEOztASlA/VU1PUUBFX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGRgYWJgZGNfYGNrbmNjZGRoZGJnZmNoaJOWlKK3mKqbk5+NpLe0raygmqKdpKSmr52cs6+tlJmim6GlmpuVnqubi4iSeYuFcYGWjoqQoI+SlJ6YfZGKjqihh5eOipKklZ2bjYypqKWej5eHhH5qe4Z+fY+NgouQkImPlKGDl56fnJ+ei4l3nJihjJ9xoYqGqYeao42Upah8rYx+eqCZeqOTeIF0loiNnH2Wn4abjpiapYWiZKF8iJaQm41tnmibjm+amXuAi6d+c2l0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhvgZxglYxep3Z1h4h+nWeadYaTkpeOgJ9vmpFvqJpeqX95vGx/qlyOhF20aF1vcnt4bGpccWt6emRgZ1hiQlFGTzdXRFJvNUtbW19OWkRAMTUxPDs3SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5cXllkZlhmZ25tYmJlX2FhX19gYGViXmJkb3FgZGVla2VjaWhna2mVm4ips5qmiGOUm6u6sbCsnqacnKmgn6+cnrKprp+YpZyhoJmXlqCjmYaJjWqJgHJ7l4iLlpaDkZSZkHqLhJWknIqVj4aNn5OenYmQqaOgmoySioCAaYGGeH+WjHqIjo6Ij5abf5Oinp+gk5hyaJ+Jno6LcJKMgKmGl52gpJ6le7Cto6K4l3ejs6OkgImUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mbWjpKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJpcXuObICIg5l1m3iGibGzf4Cbk6d3g55udH6VcJp0a6RelXZIZWRhdHJ/f29mYWxpd3xlZWJRX1deVVdAWkZRaEVUV11iWF5JRD1COEBBOklGOExFWEFXUltXREZiXFpgS2BtfXJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lZHZsXWVnZmtkZWxpaWtpk5yAr6yYg1NeoKazubKyqZqjjJysnJ2qlaKtpaOpkKCfnZualpihnZaIh4l3hoJveZWFkZuLfJGTl4hygYmRoZtzkZCBiZqWoZyGj6qcm5WLi4p8g2yEhXGBoYt4hY2Ih5OZlnyTo5+dooithn21hI2dnHullXmpgJSajoiemnunaHdtfpl0oXNyfJ6GmXCTg659o4OlnZiAo29eqGd1omNvpWGc05B9e5l4c3RiooaRf6N0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2cbXtwlm1/cqJxXaRnc6ZgaKZtm9SafYabcHt7mGycfXiYc26ppGdhZnpygYVsaGZlb3d4aWFjU1xnUlJiSFhKVWFYVFxma1xlUUVDS01KS0JLRThPQFFOWFNZT1NRYGZlalJkd3l3SUZFY15mWmhqVGloam9jamdgY19dXV1faGJhaWV8ZF5kZ2RrZGpsZmhsaJeaf6+rVFtKfqmvsbOvsqObmYWZqqCipY+mqaGaq4ubmZmUmZOToZiOiIZ7cH2EaH2Pg5WbgXeRjo+Jb3+Gj5OSbJeUfIqTlKWXg4+rm5SSi4aJeYN2iIBugZ+Gd4CShoiZo5d6lKKimZ+Js6Gitot5rKekrqVvqH+ZjYWAmY96pH+hmYaYcp6EpK6vipeMgI2kjZWCraCTdrW2tcmhc5SLgZ9gnpepbXqVh6GcdaKId6B+k5iLgXBNZqOScJqHc6V7eXRhg4FrfaBrcWRfnHF9c5ZoemmztbPGpnKYfXqda5ybq3aFm254eZhqmnx2mXNRRX2zX2p3bHqIZ2toY3V2cW9XX1RZaVFTaUpXTVlUVl5pbG9WZ1dNS0FKTUtIS09CUUtQZWNqbWV0cnN/eXxudYl7e1RRT2xeaVxraVJqaGlsZ2xmY2VfXV1dXmliZGlre19dZGhjamZvbWVpbGWgm4eupYNkP5Ohsqqur7WiopCAmKqio6aNpqifnqeEm5iXjpeQkJyTjoiDemp5h2WDjX+YoHl1j4mMgmmEhZGDjIWdjXqNjJenlISYqpiMkYuCiXqAfYt4cJChhnmClYeJlqCVf5SkppuVlYNmbnicbKJke3Cld5uXcGWmgJSJeqR5n5aDl3Oed4GKlZePuW6RiqJifZiglIhtcmmqa3WgbW+mYJtpi5BploeblnWigX6aYIyGjXVviGJooGWefmmbdW9jZoiBbXGiWV5aYqFsXYiLbXp9c3FkpW14omRnp2iZc4yZcKJwVYmQcKBgZqhVi15UmG5udGxzg25xaWt5dGtwUllXV2ZaVG1KWlBdSVhpaXNqWWtWUVJGVl1MWFNiVWlrX3h0e31wfHxyg3uAc3aNgIR2XlJyYmdicGdQamhobGxuaGRnX11eXWBqYmppdnRdXGNoY2pqc2xma21jnKOXpXlkc2yKpq2jqbCxpp+MgJisnp+njaOinKSjgZaZlI6akIyYkI6Ke4dxgIhoi4t8mZtzdYl+kHtlg4aUiomVmoJ8iYiYqJKBo62RhpCLgop+gICOcmmPpoR9h5ONiZigj4eTqaWciKZ4lZt+pYiWirGXnY+CrpaepHaThXipc6WPhJpupKKMkoSNg7tufaWvg4aFhpOVm598pXpyqJWglmeefm+sZJaKlpN3qG2qooGJdomDeKuRpohrkbBrdrOMqWuKhW1tn56RlF99q4uqdn1+iqSddp98g6SVnaBqm4h4rGifroy2dXi+jaSTWoOnjqthdnN1cnx1cWNrf29obVRXW1ZhYl1sTV1SXkpebW93YFtxWVxgW2d1ZW5vcmJydGB4en55cnmDc4R+gXt7jIGDgHZieGRkbnNkUmtnaG9scmpmaWFfXlxha2JsbHpvXFxiaWJsandtZ2xuYpWkqZuAf52jlqmpnaimraSZioOYrJufpoqcpp6rnoWNm5CHnJGGko2MjXSHe4iEcI2FfpmTdHSGcpGDbn+LkYeFlI99fIOHmaePgKenj4GOiYWVdoKHkm5si6mAg4uUjomcn4mMk6min45/dJOXiH6BeJOuon6BmnCPhXaOiYJ9e3KnjHF+fXqYlpuEkHl7f36HlJWTinaQmJ2gg3t9iWuMhVt5eXJ6cWlufpKKcoB1gY+UlHGHhINljH9ggYCLd3VzlHVveW5th2yDhl51Z3eOZX+AhYynmX10e5VqiYhwgXZ9h3dubmmNdHp8mHiFXGxYeY9pb3hzc3B4eHBdbIdvamhXW2BXXWZrZFdjVV9SYHB5eW1rd2dqa2t3fXJzdXNhb3ZidHuCeHV5gnZ/gICBeYuFg357bn9sZHluXlZuZ2l1a3hqaWllXGBaY2llbHF0blpbYmxkbGx5bmhsb2GOk7anpoqgoZqmo5ilnKuioYSEmK2SnqKKm6ibqpiDgpyMf5eUh46KiY1yg3yPfX6PhHuYj3RyhHGVhXt8kYuGhpCFeX6AiZuljnyooYuFj5CFlYKGjph2coSpho6SnZCJn56IjJqmnp+qg4iNlZp+foiWrKeOkaWPd26bjoF4kG59qIVxfpVxa3B9gqCNgJOOi2hsXIKLi5uano5zlYuIcXRrgnd0gVlyboeRgn5/jGldamV7hoSKgGBpeXube4KLgnWBhYFnd4qGamBvcYB1XnGJgIiOpZOEZYuNg253i4Rxho96cWhpZn2Ee5ZbXWtobnZcfHp4dm90c4NoXW6LbGxjWlpfWlltclxgYlpfXmZ0f3x2cHVka2trfH5zfHl1ZG51aG18fnZ6fHt5eoCBfm+FiYR7fXR+eXN/aVRccWlsdnB1Z2tnZF1hWGpoa2txcm5XW2VubGdzeW9oam1gi4qor6CPoqCZnp2Xnpioo6J+g5mujqCViJ2jkaaVgHyZhn2SmYqJh4eLc36BjHaFi4KEl4pyb4BymIaEfpGDhIaKgXuBhY2coZGDqKKIeI6XiZWKi5yXhIN5rYKRmJqVip6diIigqZ6hoaOKh5ObnKKZlamgpqSekZqFk4t5doyNg6d+f5KQk5SdsqablZ+QjbGSl4Oki4yUmp+JkJuCiJGKa3yOd3hlg4eRi3yJnoSHjJGJiYGFhZB3fHp0mqCJhoqdiYSTfn2KgH90bnOEgX12hYaJjqOPgoSMhoKMkIx9h4yLkYR6boWGfnqZa3NpYXSLcX57d3dwd3WCXV5vh2huYV9aXV1TaXFWZV1dYm1odnx9dG9wZWtqaYB9bnmAcmpwcW1ngXtzgoF4f31/hXptgoyGfHp4e316hHlOZHZqc25wemVrZWNiYFt0ZXBncnFtVl5sdG1oeXpxZ2lrZIyHnLielqGgl5SYmZSYpKCefICarI+fjoahnYyeln55lYR8jpqKh4SEh255gYFzgYh+iZSEbWt+epeHhIOPfoCGhIZ9iIWPnJ+UiKyghHOKkIaSkYuckX2NeqqEjpOYl4+cloeGm6SeoZmchYKSmpmYj5mmn6Scm4+Vfo6HdHqFjYOle32PkJGGmKuhnpSdkI6pjZCAnYuIk5mego+XfoaOg3B4hnJ1YH+EkIZ1jZmBg5CDh4V/hoWVbnl2dJKiioyFmoSDjHN/iXx7cXB6hoJ6doiNg5GkjoSCjoCDiomKd4aJi41+cm6Agn1vaWxuaF56gGh+fXd2d3V8eF1gcX5udWFkW11fUmduVGZcXmJraXd7f3JsbWRramiBf2x0gmxtdXB6cIZ5boeAdoKAfYV2cYKNiH57fHx/fIKLYGh7anVpaYJkamNgaVxkdWhvYnVtbFVjcXllcHp7c2VqbW2LiJ61maCinpKRlZiKmp+fn3t5n6eRnIuHppWMmJl6e42GfYmSg42DgoNufIB5c4CFfouSfWtofYKXiYGIjXx9hoWHfZCDkZ2dk4qpnYFxi4uMkoagoYmFjHynkYmQk5iUlpN4jKKen52VmH6AkJqYkouaoqCimJWQmXyLgnd/go6GoH9+jI2PfJikoqKTmpGQpoyOgZqRiZKWm36Tkn6HjoF1dIJxd2F+gY6GcouXfYmMco1/g4aHj2l4cniMmJGPf5Z+h4lygYZ7e293eomDeXiOi4GUo5KKhI96hoaHhHaDhImJfGh0foF6fHJtbGhffnNpfXZ2dX5zgWtfYXR3cXhlZFlfX1JraVZmWmBhaGp3eoJyZ2xkbGhmgIFrbn5ob3Jsf3mHe2yMgXOBgX6CdHaCjYZ/fHt/gX5/j2lyg250aWGHaGxiX3FWdG9sbmB4aG1XanR2Y3V6e3Jiam96iYyesJGkpJyOj5ePhpygm558d6WhjpiBjaOLiZqWeXyGiH+Din+Jg4F/coB7dHaChX6LkXhnY32Gl4qCiot4fYCOhHmXg5aZmI6XoZx/cIuBkZOFpZuIjYmDppWFk4yXmJKSd5Gdn6CXk5Z5fo6Xl42WmpyjnJeRk5l3jYOBdoOVjZ1+gomNjHOXo5+ilJmPj6GMioKWl4OSlZl+mI18iI2BdnF+bntkgX2LhXGIlICSgmyJhIKBioVmdm97hZGYjHySeIuHe3+Ge3pwfXeIhHiCjoeJlp+UgYKKdoiDg4J3fIOKh3hienp/dX94aG1mYn9qa3h0dXd+cn1kZGFzbnVzbmFaYV9bbWVTZFlhYWlrdnqHcmNrY21maH2CbGl1aW5waYB9gnpukIZyf4ODf3R8g4yBf356goN+fJBtdolzdW1limxqYmJ1VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm6yWpqeejYyXh4afk5eZfniqnYuZe5iejIyZkHl8gYx+fYR8gYOBeHR6enR9gISAiYuAZF99i5SHf4SGdH1+i4B+mYaXlpmOpaOZgHOHe5OSiaaPjI6KkqCRhJKQlZeRi4GOl56akY+Qcn+NkZOInJyepZeWi5OVcYuLiWuEl4+ZeoiIj4lvl56bpJSVi4yei4WBkZx/kpKVhpmIe4qKgXpxemx1bHx/jH5uhpOElXhwg4R+f4uAZXJqe3+Wl4N+jXSPh4J4hnx0dn58hH97gYqCipKhj3iDgXSJh32AdHWCiYVxY3x2e3J+cGJwZGV8Y29wd3N5eHR1YndgcGx2bnBdXGBeXmteUV5ZY2FpbnR8imxgamVqY2h3h25nbWlrbWiBfXt4b5CIc4CDhX10gYaJe4N9eoKEfX2OcnmKeHhtbIdraF9pcmOHZ3FvZXdnbmxhemlqfXt4cGF4bYuAmJipn6OonYmKkoaKnYuVmX54r5mNl36flJGXlIh3fnyKfXyAd3iAgHB1dHxwhnyBgYp/fGFcfo+RhoCDgnJ6gIh7kJOKk5OelKedlYJ9gX2NipGjiY6KjZiajYaSmZSVjomHi5Gbko6MjG2EkI+RiJ6ZoaCWlIiVj2yGl4JlhJiOk3qJhJCKcJablKOTkomLmYyBf5CefZKOkoyZjnuKhYd0c3ZscW52fYt0b4aSj5NxdYF8goOJfWZxbXl8mZN8g4h0kImAc4d4bX58f4R7g4qGgYuTpot6hnt9ioR3fnFwgYeEZml6dXZxfGNfcWFrdF9xa3t6em1zcWZ6Xm9tc21zWFtfYGJsW1FYWWVjZ3FygIhnXWppZ2JncY1vZGpoZWlpgXp3dm+OhXSBgoN8dYKIhniFfHiEhXp/iXd+i3t7c3iCamtfcGh0gGtyb21yZ29sZXxjboB6dnFsd3eKfqKXoaehppuGi4uBj5yHk512gqyWk46HoY2WlJCAdHx3hXh5f3Nze4Zsc3B7bop2gIGHb3BbWX6RjYeAf392dYGBgaGHkouVnpmilph5in+AjIicnYqPhpKYloWJlZqQlouLi42Lm4mNj4JtiYuQkImclqGblpOEloZogqGBZYSbiZB+i4OLgXeTmZOfkpGJiJSMfn2Ol3uQjI+OmpJ8ioCCb3ZwbG1vcXyGanSEj5mLcXeAdYKJg3pnc251gJmOeoeEeZOQeXWHc2+HeoSKeImEgIaMmaGGe4N1gYp/eHhua4GEg190dXRycnlbX3FhcWtfcGt+fHFubmtud2FwcGtybVlZYmFib1hRVFtmZ2N1cIWDY11rbWRiZmuSbmBnZ19oa4F1cnNwi4B1f4OAeXaAi4B4hX94iIZ3g4V8hox/e3eKf2pxY3xjhnxucW10amhvbHZ4YHF/eXx0dXSAg36klZmsnqeWhI2Ef5eUg5CgdoyglZOGi5uNlo6LenJ4dYJwcoV0cneJbHBudm2IdoN+gG1tVVGBqpSGg3d+d3KEe4OihJSDlpSZnZObeZJ7g4ySo5mTjomVmZKEh5eajJOKiI2OhpyDj4l7couFio6HnJqfmpSTfpJ8ZoOahWaFn4eRhJGCiXGDkJeQnI+PjIuPjHd6kZB6joqMkpaMfIh8gGt2a29rbG17f2F6fpCYgnd7gniDjX16aHRsc4aVin2HhXuSjnF5g292i3mHi3iHfH+Jjpybg3t6doGKfHZwamyChHtheXFvbXN0Vl9wY3JiYG1venJpcGZndXVpcmxid2VdV2ZhYXNUUU9dZ2VeeXCJfWBdaXJiYmZmkWpfaGVbZ3B+cGxxdIp9dn2GgHV2fox5e4WBeIiDc4aFf4yMg3t6lHhmcWuDYIh9b29remBqbnV/dV90fXmHeHRzhX14oI+ZsJyljoKLf4OaiICNn4CMmpSPhYiYjo+PhHd0d3SAcXCFdHByhHBsandug259fW10c1JNgt/IktaSe3B1hXeFooSVeJaSmp2RmnyUc4WQnqGSk5CJk5yUhn+XloiMjYeQjIebfo2Ad3qMfomMiZybnJqUkniMdGWGkIVrh6GEkYiXg4ZjjJGZj5aLl4yNiopxepOIe46IipORiXmFe39tfGVyb2tte3pcgXqRkIF7foCAh497e2lzanOKjoiAhYR8lIpsfn5tf4l9ioZ7g3h/jJKYmIl8dXeDj3hybWdxgIVua3Vwamt2blRfcGVwWmBtc3lobGtjZ3lzcXFkYHhhYFZsYF93UU5MYmdjXXpxinZdXGV2YWJmZY5kYWdiWWlzc25rcneMfXR6hoJ1dn6Lc3+Gf3uJf3KJiIKQiod8fph2ZXNufGWIfm9wbIBZbG55eXNgdnp7jXdzd4p3eZ6Lmq6an5CChXeIlX59i56IhqCSj4WMmISTj4eBdXhweXFvhXBtb39zZWV5cX1teX1qaGtjpJrB3K7woHJsdoV3hqWHk2+YkpeilpyCknKGi6KXiI2VipCdloOBlpCFiY+AkImIlX2GenR/iXeHhI2bmpiYjY51iXVshIeJfImihJGJnISFXouTmIuPiY6LioSJbXuVgX2IhYmRj4Z2hX1+a31keHZrb3lzWIl7koiGen+BgYaMf3pmcml/iY2JgYJ/ipWEa4B1bYaPgI6CfIF4fY2TkJePdHJ3h4x1c3FndXqEY3VucWNrd2hTYXJobFZgb3V6YXNkYGl/cXNvW2RzYWJXblteeU5NTWVnYl53dIpuXF1leV9gZWWFYGNjX1lqc2tua3N4jH50d4SBeHd7iXGDhH1+iXt0i4mIloaLf36Xc2h1cXlsjHtudHGBV3F6dnlyZHd5h4xpd4CKcn+chpinnKOShH1xjJR4eYyehYahjY98lo2AmoiEe3N4cHRqcIJsam19dV9heXd7cXV7Z2BkfOvatcnD3IdybHSDd4udi49rmpGRnpaUgolxhIifjYSLlYqMmJR8jZOIg4iQe4+LhY6Af3V4g4RyiIGTm5aUl4WLdYZ9boOAh4aXoYKTjJ6DiWGDlI+HioaKjYeBh2l8k399g4OJjo2CcYZ+f3F3aHZzanV4bFqNfZKEhn6ChYKFi4N3YXJrh4GOiYB+fpCPfG2Ba3eEjYSQgXqAe32OkI6Uh21weYyFdGtxa3J5gmF1anBebHdhUmVzaWZTYHF3dWFwYV1ohHJ0a1hoaWNpWW5XXHZNS01mZ15ic3SGa1xcZXlfXmRne2FkX11Za29lbmp0eIp+c3SBfnt2eohzhYJ9f4h3doqGj5iBjIJ7k3Vsd3Z5eJN0bnh7fVh6hnF/b2d4d5KCZHaGhnCJloWZoZqiiod0b5KMcXePnX6LmomKfaB/hJqAgXhydG5vZHJ/aWdteHhcYHl7e3FxgGlhZ2F/1baPkaZ3bnF4fXKUko6JbJuQip2TjId7aYeLmIaBkpGGh5iOfI2NgYGJjXuOjH2IhHpzeoN6cIeAlZmOk5KAh3SChHSBfoiRm56GlY+ffohif5OHhYmFi41/f4JnfJCAfn+CjI+Qfm2DfIN1bG13dXR3dmxjjoKQgYZ/fYaAhYmAcF9xb4R7jYqAe36Qh3pwg2V5gYiFioF6hHx9kYyPkYJtbnmLfnVtbmpsfH9kaWxrWm53WVNqc2liUWNzeG1jZl5aa4VvdWNcaF9lbWBvVVxwT0lPZ2ZcaG9ygG1aXGNzYFtjbHdlZV1dWmxtY21qdHeHf3Fwf3x9dHiGeIWCfYCIdXmJgZKVfIiGdoiAb3h5e4OTb257gXdeg390gm1penSUc2dziHxxkZCDmp+boIaIdnaUf213lJh/iJGEi46afYyad312cW9samF1fWdianV6WmB4fHpscH5lY2dnV52PX3J0l77FhXhylouRgHSZjYeelI2Jc2qIj5WAe5SLgYSbjHyKhn18iIx+kod0h4V2dn2BcXWGgZ6UhpSOgoJxfoZzgnqIlpuWhZKNnYCIZn2TgoGGhIqJcoF9Z32Le3l/f4eLj31pgH2EdmZweXhzeHRsa4+Gi4KMgHqDgoSEgGtecHZ6fYuHhHuAjn9+coBod4GGiYSBd4J6fpSKjot8bWt6iHx2dG9oaH54ZV1yY1lxdFRUb3NpYk5odXlnYV5dWHCBcHVaZWNea25hcVBabFNEVGhiWmxvbnxwWltebWNaY293ZGdcXWBramNsaXN3goNxb357f3R1g3qDgnyChnZ+iYGWkHiDinSBh3J5eX6NkG9ve4FxaoJ5en5ubXx2lWtqeIR0a5OMhZ6YoJmFiG99jHZqeZmPgIOLg5aYinmPlm95c3FsamRgdHtpX2Zye1thc316ZnB6YWVkjrGyd0tjWqXb0phzfJONknqAl42GmpKNh29shZKReXmThoCEmYp8h4B5eIiKg5R/bomGcXN9e2p5hoOlkISSjIJ+bn2BdIF3hJmXk4mSj5SFiHB6koR+hIOJg26BeGiAhXhyf3+Diod8ZXx+hHZjcXOAaXpxb3aajYeEjH14eYGFe4NrXG98cn+Gg4h8hId6iHGAbW+ChY2CgnGDd3+WioyCdmxsfYR+dnplaGp/cmFaeFxacm5PWHJ0Z2BLbnd1Yl5cW1l2f3RwWGdeZ2tyYG9PWGlTP1pnX1txa2d6clxbWWxlWWRxeV9oXV5lbGhma2lxd3+Ib2x/foF1cIJ6gIF/g4B2gYWIl4pxgo1xe4V8enmElIx1a3p/bHB+dX9+b3J8e5Nwb4F/eGeRioKhmJ2Sg4Znh4RwZ3qXin+AhYKaioJ8jY1peHJsbGZfYW96bl9jcHldZGyDemBwdl9kZdXrvoszOj6Mj4BzeoeLkY94hZmOgJSPjX9ubYWMi3V8j3+FgpWJfIN4bnaGhYKVdm2HhGt0e3VleYOEp4yDjouCfG1+cnSCeISaj4qPkZKNjId/e5KIeYCFjoNsgHJpgH94bXx8gYqDd2F5hIJyZHFpf252cnWDnY2CgYeAdHZ+gHOBcFtrfHN3iIGJeoZ/fIh4eXBqhoKOgohwgHd9k4iJfXNtanWAgHV1XGlpeXFZV35UW3JmTVtzcmZcSnJ5cV5cW1pddoB2alpiW2hmb2RqTlhnUj5fZlxedmZgdXFbWVVvZFplcXlbaF5gZm1oamtocHh+jm1qgYR/eW6Ae32Bf4J7doKCjJOFcICLbnh9gHt7iJOJgGl7fmp0fHKGe3N3fn+MeniEfnxri4yDm52WjIKAbY1+bGl/j458fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYmx1YWhwiXphc3NeYmSboJBuXTZbsLZ1a4GLf5SId4iZiHWQjIp3cG2FgoZ0eYl4iX2TiHp/c2d1h318lm5vhX1odnluZXqJhaSHgIaMiX1tfXR9f3uKl4aAk5CYiYuFinyPinF8foZ8aX5ta4B7eWp6d4KHgXJfd4J+cmRyaHaDbnV8hpaTgn6DgXB4enx1f21XbX11c4mAhXaGdYGJendybId/jn+DcX17fJCGh3ltbWhsgoF0blxoZnVyUlx8T11yXU9cc3BkVkt0eWtYWllaYXKBdmJeXWFnZGlqZk9aaU5BYmVcYXdhXHVuWFhTdWJaZW9zWGpfYmhrZ21saXB3fJNsaYSKfX1wf358gX+Ce3eAgIqMhHF7h29yd4N/e4mNj4RqfntueHl2i3d9eICCh4CDfn56bYSMiJijjYWEe3aLeWtthYqSeX58gpKAgH6Lg3BycGNmXlhnX3BwYGFocWZqb4l0YXNvW2FjanZ7f7+dqKXKuXKHhnSVfnqJlYR1ko6HcnNwg3qCc3WGdIh3lIl5eXFjdoV4f5JocYN2ZnZ1Y2p8hIiegn9+jo18cX1ygnd9j46CdpWNlJCIgoh7iYpseXqAdWh7aWx/eXNpenaAg31nYHeHfWtqdGh8gWp2gY2Sln98f39yfXd8dX9iVXV7cXKHgYF7gnCGiXd3b26BgIt9fHd8enOMhIB0Z3Bna4iBcW9daGN0b0xmd01fb1ZVWnRuYlFQdXljU1hYXWJyg3RdYlxpZWVkbGVRXHFJRGViXGRyX114aFVXVnheW2ZuaVdsXmFqZ2Vvbmlwd3qTbmmIjHl+c3t+eYKBgnx2fYOIhoNwd4NzbneCgn6Ji5R/cYB8eHp6gYt1g3h/gYGChHqAdW59iYubnoh+hnt3h3xodYeNkXp/gHyKhoR3j4BncG5gZVxYZVpuc2FhYXFtbGiJbmBzaVheY22Ad6naqciHiLNzi3pxj3d9iZGCe5SLgHV0dX12f29wf26FdJSGeHVsYHmAeIeNZHGCbmd1bVttfYGQk4CAeJKRfHd6bIVzfY+Kg3KVipGPiIaGe3+GbnV3f21od2VtfHZta3d3f398YGJ4hnpodXZjfnxodYePjpd9doF3coB7fW6AWlZxfG9zgYV9f3driIZzeGpzfoKCfHl7d3pxiX96cmZyZGyLg2xzWmpgdmZJb29NXWNYV1Z5bmJQU3V3WlFWWF5hc4VwXWFjbmVkXm9jVV5zR0NnYF5naV1afGNSVl12W1tnbGJXa2BhbmZmbHBocHZ4j3Rrjo12f3d4fXeBhIF8dX2DiIiDb3F/dXF1foWBiY2Le3d/eIR8fYWHeIh8fYF9hIB7fnJ1eIuOn4yJe4p3dYN6Xn6Hmo15h4R0hoeFd4l7Ym5tXGJbW2FWanRkYVxob3Bnh3FhcWZXXGNrf3zKzoe6omtub4xuc4ZzfoaMgHuShXp5dHl0dHpqbHZjhHaSgnZwZ158gHiKh2RxgGpqcWNYbXuGnIiCgXKXk3Z9em2Gb3+IioZwlo6QiIaMhHt5f3JycH5naHJjbnhxamxyeH18eV1keYB4aXV5Z4J3aHWIjI+WfnOIa3B/gHlufV1Xb3xscn2IeoBtbomAcHZmdn5/foB0em95coV6d3BkcWBtjIFrcldrX3ldSXBsTlhWX1RVfGtiT1R2c1JSVFdeY3aGal5ha2tmY1pvYllkcUhBaV1hZ19cVnxeT1ZmcVpbamhdWGhhX3JmamhxZ3Fzdod5bpSKdX97eH55g4iAdXR/hoWOg3Bve3h3dXqGhYaMhnp8f3WLf32GhISHf35+fYZ/fHh2eXaRlJ9+jX2LbnWAemSEiJiGc5KLcIWFgnqDdWNuallgWl1eVGhzZWFZZHJyZ4FyYWtlV1pfaX94vq57oLduY3WIaXZ9c3uFiHt+jYB3eHN3bnp2ZWpvYId1joFzamJefXZ4ioJlcH1na2taVm94i6OBhX9wmZJwf3ZzgGx+gI+GcpSIjYiFiYV9eXVzcGl6YWptYW12amdra3l3endaZn19eGVyfm6FdGZ2ho2Hl4BxjGhse4N1bXViW216anJ5iXqAZXSGfW1wZ3R9dn1+cHpqeXl/d3ZvZGtgbIp9bG1VamB4VkxsbVBTUGhOWX1oYk9VdmxNUVRVX2h3hGdeYXFpZ2BXal1dbGpKRWtbY2VXWVZ6Wk5Xb2tZXWxlXFplY151ZmxlcWdzcHSBeHCZhXZ/f3h/fIaHfXZ0goiAlYNuc3l7e3NzhYaIiIR5gX12j399hYmOhIGDen6Lg3t3fHZ2mZ2YeoqDh2p2fn1thYWVgXKPgnGGgn6CgHBmbGdYXVpcW1RlcWVfWGNzdWl2cGVlY1dbW2h/cG9ygHOKZWZ6gGt2d3R1hYZ4goV6d3R2bmp6cGFoa2eGdI2EbmZeXntteYh8Z2x3ZmpkVVdzcI6mfIR7dpaPc3txenhseXmPg3WXfIiGhIeEfXVxc21odV1taWBsdWRnZ2l6b3tyWWeBdnVocIB4gnZid4WLfZaCb4xsbnyBcWZzZWBqeGZwdYh5fGF0g3Zpa3BzeW95eHJ7ZX19fXZ1bWJkYGyGfGxqVWliclRMa2xQTU9wSF58ZmFOVnVlS09TWGJseH9mXmdza2VgV2RYY3JeTExsWGRiVVRWdFdNWXdlWl9sYVxbZGVfdmdtYnBqdG9xfnV0mYF4f4B4gH6GhHp9doKDfpiFbnJ0fHt0cYWFj4KAeot2dJGAfIGVjoGFhHx+jIZ6foB2eqOminmJhoVsdX18doSDjXtvhnN6hX2Cg3VvamllVl1bW1pTY29lW1lhdHtqaG1oYGFYXlppgGlsb4BobWJpe3prdXV1cIeCeoF+d3ZuemhqeWpfZW5ogXeQhGdlWGF2aH2GeG5pb2ZmXVVYb2iPqHaBenyQjXh0bn1tcXR4jX53lHSGg4CGiXZqdHdoaW9cbWVebnNfZ2JqeGh7bVttg3J0am+Bfnp4YneFhXmRhnSJc3B6f3JjcWhbbXVkb3GGendhcn9wZ2l3c3Frd3ZzdWKCeXx1dG9jYmFsfHxra1VpYmdUTG5pUEhTa0ZieWZiTVRyXkpOVVpmbXh7Zl9ucmpkXVZhVm9vWEtUaVhnXlhOVmxUS116YFxfbF1dW2JmYHpobGFvb3Zub3d1epd9d4CBeYCAh4Z6eXqDfYGThHFzdH56dnSFiJB+gX2RbHOVgXyDn4V/h32Bf4aCgIp7doSrn396iIiFbHGCe3aBgIJ1b4hufYB0ioBqcG5lZFhfWlpaVWJrZ1xaX3WCaV5tbFxhV1tca4FlcnR9amtebXh3aXZ4c2+HfH5+enZybHpoaXdnXWRzaHp3koBjYlRjbmWBhHV2ZmhpYVdWWWhkkKdufneAi415cG57ZXdteYp6do5xhH5/gIduZHd0ZWhpXWxiXnBvW2hfbHVlemhddIBucmtxe392dmN1hox8iYiBgHlzdn50YXBsWHBxYW5vgnpzY3GAbGFseW5paHl4c3BkhHN4eHNvY2BjbHN9aWtUaF5fVUx1ZFFIVmJIY3dmYkxUcVlLTVhZaWx3e2VlbnJnY1pYXll4Z1VKXWRYaVlZSVdmUEljeVteX21bXl1iZF5/aWpgb3R5bW9udoOXeXKBgH1/iYyGfnZ2hniGjH1zdXWCeXp6goyOfX+FiWp0l4F7i51+foZ6gHt+fIaJc3GPrYx7fIePfmZxiXt0fn13c3CGbHx+bZB6Y3BwYmVeZVZaWVdkZmxgXV10hWhYcG1bXlhaXGx7Y3F3dm5jXG91dWl2d3Jvhnl/gXp3bm90ZWh0ZVtndWZ2dpF5X11SZWVpgYFzfGFiaVxUWF5jZJCkaHh0goWQd2xteGZ2bHuDeXSHcoF5fXmAaWZ3bWFnYV9qYF51a1lmXW9vYnplW3d8a25vcHh5dHVlc4STgImEiXt3cHN9cmF4Y1lubmBub396cmVxgGRebXVoY2Z3enJsbYFzcXtxcGFdZGxufGVpU2dZWlVOemBSS1pZSGN1ZGFKVW5VS01aV2ptc3tkbG10Y2FZWlxieF1UTGReWWpUV0hZYU5Ia3dZX2FuXFxfYmNchWloYm54em1vanaBkHltgn6AgZKIhIF3dYl0i4Z0cnZ2gXh9fX6Mj4F/k35weJaDfZmTeYCBd3l+f3OIhHNwmaF7e3+JlXlldYl6c3l3bHVwf2x5fHCSc15wb2FoYmxUW1pXaWRuZlxccollU3JuW1pZV2BsdmNqdWtrX1tvdXJudXV1a4d9f4F8d29ubGRpcGNba3JkdHaOc1xWU2NfcH59cIBcYWNeU1phXGSSnmVycYWDkHNraXhrbm55eXpxgHZ/c3t6e2RmdmheYlthaFxfd2hXYl9waGF3YVt8dmpqcm54dHR1aXGCloSIgIZ2dGtwfGxmd1dbaWxhb3B+d3Nlb31bYG9wYl5pcH1ranJ9cG92aW5fWmRrbHphZlNmVVhTUXhdU1BZUkhkdGJhR1ZsUUlQWlZsbGx8ZW1vcmFcWlhabXFYU1FnV1dqVFVGWl1PSXN2WWBjbmNZYWFhXoxqY2Vtenlsb2l2eYZ7a4N9gISafIKEeX2Ibo+GcW52en10goJ9i4+Dg5d0eIKUhYGfiXWBgIFzf4Fwh4N2b6KXc3uGjId7ZneLb258cGd5cntsc3ZzjWtedG9iZ2ZrU15cVmhibW1bXHGMZE5vbV1WWFVmaXNoY3VlZV5bcHdvcXZ2emyIfX99iHePc2Nka29hXG5tY3N4h2taVFZhYnZ7e2+EXGNeY1NaYFpjlpRjbnCChYlyaWZ4bWRydXF6a3l0dW97f3ZfZ3NkW15XYmRZYnVlVWBhbWRhcV1cfm9oaXNxdHF1d2xthZWDin2GcnNnb3xvcW9SWmVpZG9xfnRyYmx1VWJxalpebmR7ZGt0e3BxcWhsXlhjaWp4XmVTZFVXUVZvWFJXVFBIZXNgYkZYa09JWFRXbmllfGlseWtiV11WXHVlVFNYaVJaZ1VUSVtaUE55d1tfZW1pWmJhX16PbmJna3l2bm9pdnZ/fmyDgH2GmHt/h4GKf2uTiHJnc4B7dYCDfomOf4yTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOCjYx3eG56jWBlfXFnenR5bW1xd4NnZHxtY2dnaVRgX1VnYG1wXF5ujmhNaWxgVVZTb2dza2Z4ZWZeWnJ2bnN8eXRuiXt/d5x6eWthZWxtXmBvamVxeX5nWlVXX2t2enlugl5hXWhWWWBYZJyIYmtwgYZ8dmtpdWtbdXBqeWl1cm5vfIFzWWtuYFleVmJkWGVxY1RfYmlhYmxaYH5rZmx0dW9teHdsaIaNgIp8iG5xZnB7bHFsYVhfZ2ZtcX9ycl5pbFNlcGRVYm1heGFvdHp0aW5qaV5XYGZodVxkVWFWVE9ZZ1NPXE9QSWVwXWNHWmpOSmBMWW1lYHhpb4BlYFVfVV52XFVTYWhPXmNVVEtdWlFadnZdX2ZtaFhjYVtejnFjaGp4cXNtZ3Z0eYJzgoN6iI9/fIqIjnpukIp0bHOBdH9/iIWHkoSVj3p9jI+IkZuEgHuMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56enx+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo2NjY2NjY2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx9fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMk5OTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo+NjI2NjY6Pj46Ojo6OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHx9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTEwL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhXdlZ2ZmZmhcQ0RERERDR2RoZ2dnZ2drb25tbm5xSisuLi4uK0iFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI4uGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgoKDcl1fX19fYVI0NTU1NTQ5XGBfX19fX2VnZ2dnZ2o8GBwcHBwYO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmIiIiIiIeNkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaIiYiJiYmJioqKioqKiYWDg4ODg4OFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5GLkI2OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjY2NjY6Ojo6OjY2NjY2Njo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQi4WJiYmOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3d4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCIhYeNiZCJjJCPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfXt3dnd7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkIiFiIyJj4eOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4SKjIiOh4+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin99d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pio6Ni42Mj4+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgICAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgHt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGiouHh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/fn9/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTk5OTk5SVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSk5OTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGSkZGSkpOIhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj4+Pj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCSgoKSkJGRjnWGkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPkJCQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcISQj5B8dIiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzb4qPinJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX1+fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXdte4+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH5+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWFhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc25vhHt1doCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RiXmRfYWtxZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGRUVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYl1qbF1lZmdlY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGRkhJSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaandsYm5yamJZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtrcmthbXRyZlFRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXWNva1hpc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRkhVYmdsb3BvbWxaTExOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDRkdITVpnaGdybm5oZmRgXl5YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PklaXVpcZWxuam9tbWxraWhrZFNHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1LW2ltbm9qb21ramxtZlFHRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozo9SGNvc21ubGtsaFVDPkNGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PUpgc3NwaFQ/Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkJsfWpAOjs+PT4/QEBAPz9BP0BAQUBAQD0/Pz08Ojs9PTw/QEBCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO1tuQD5ERT9AQURfZDs9PTs6PT5BQT8/QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pLSFZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo6bXdIODs6PT5BO0hkPTw9PDg6O0A/PTw9PDxAPT08PD47PTw9PkFAQkFAQEBCRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJYHBwcnJydHV2eXt9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUj08PUlMRkV1dk43ODg6Oz4/V2pBOzw8Ojo7Pj4+PT03OT89PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3J6Sjtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PT0+TlNVUkxDQEA/PkE9Oz9CQEJDQkBCQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFRT9BR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnprYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVCQUdmaGxoYV9PQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVudH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUlJV2pqaGloZmdPREdFRUVERUNBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx7fX99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTU1TbXdwaW1vcWVLSklIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExOTVRyeHhybm9vbE1HSUdGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSkhJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiIRWbIWHhoaGh4iIh3xQTE1KW3d6gnFubW1sS0NDQkNGRkVCQD4+QEFCQEJEPz4/REZIREZHSUtJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wcnJ0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGhIKFhYSEhoaGh4eGinVKSkdbZ2hqZmlzenFDPTs6PEFBQD48OTk4PDw8Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMj2dFVmRqbGFlbHiAZTc5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouNimVib3BsaGtxbXhRMzg3MzU2ODo4NzY1NjU2NzY3Njc6Njc4ODk6NzU3ODk3OTg2Njo8QEdGSUdJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJi4qJiYqKioqLiouLiHF1dnBwdXBqbks0ODg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ5e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgICAgICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeHiIiKioyLiouOiHZ4d3Z4cm1tSjg7PDk6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKjI2NgnV4e3hycWpIQUFCPkBDQUA+PT4+QD8/P0A/QD09P0I+QEE/QT89QEBAPj9BPD48Ozo7Ojk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PDw6Ojs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uMjYyMf3h7enprV0xISEhFRkhHRUNBQEJFQ0NBQkNCP0BESEVDRUNFREFGREZERUZEQEI+PUA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDo3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhoaGiImJiIeGhoaHiYmKi4yNjIyMjIyMfnl6d1lOU01LS0lKSkpJRURER0hGRERFRkRCSElLR0hHRkhHRUtJS0lKS0pDRUNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtBQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjY2MjI6Jenp1XVFUT0xOS0pLSEtHREdJSUlFRklGRkVMTE1JSkdHSElKTk1PTExOS0dGR0dFRUNGRUZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7Oz06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjIyMjY2EeXp0XlFQTk5MSklGSklFS0lHS0pJSkdHR0tMTkxMSEhJSk1RTk9OTE9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhYSEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIyMjI12dnhtVFNQTUxJR0RIS0hNTEdLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRkZJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIyMjn9kZ21ZWFVRT01MRUZHTVBPUFdVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkhHSkZFSEpFREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39URkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yMjG9hY29kSFVTU1JLOztTVFJgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRTExLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+BgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH5hiouLiHNialk+W1taVVI/QFdWWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFVUVlRPT01LTEpJSUxNS09NU290dnh5eHh6enp7enp8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImLjH10c1teXl1UVVNXV1ZbW3WDWVV9kGFcWF1fV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBRT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiYqBboaJiIeEioBqXV1eW1ZXVVhUU1hWY5aAUmVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE5NS0pFQz9AO1BQWlpbU1NRUFJSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn6BfWBVWVtWVFdUUlJNUE1MZnpbXVRZVVZdWkxUWlVTVF5aWFdXV3pqWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fn5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a39+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eIenBzWk5PUVFNT0xKS0VGSUZDP1RkVX9SUVFOS1FUUU1PWVJNTlFTVlVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGFze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ2YWBQSEJFRUREREFFUUNFQUM+Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVNkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNQVVlTVVFRVFJPVl9rbHJ2e3t4eXVybnN0c3l4fX+DgIODgoCCgIOBgmxPSUJDPTw+QEFAQD9rUUtgRUZISUVCP0dMTkdNUlVJQkU/Pjw9PD09Pz0/QUNDQD89PUI+Sk5HVW50dHVzdHZ4enx7fHx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXkpKUFBOS0xRUlFUVVVXUVFXVVBYW2FdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUVCQkM+O0NDQkJEQlxdT3tOT09OS0xNT09RTEtNV01IR0BCPDo3NzU5OT07Ozs4Ojg6PzxCSD9cc3R1dnV2d3l8fHx9fHx9fX59fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXVpJSFBSUU9NUFFOUVJUVlhTU1lUT1laXFdZXV5eX2VfXV5xdmteYGdrd29vbGpvbm5sZWJZSEdISENCR0lGRkZETVJPYVdTV1FQU1NSVVtPT1FWUE1JQ0Y/Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn17fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1LVFRTUFFVT0xSU1RXWFRUWVJNWFlaVlhYVlhZXVdXWGhza11WYXRrYWFfXmRhX15ZVVFOT09NSUhKTEpJRkNRUFNaV1RUTlFTWVNcZVVPU1RSTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTpHbnF0d3h6e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQU1RXVFVSXW5fUk5aYFtXWTtEVlhUW2ZKTFBTUk9OTU5OTkxKRlFQVVlTVE9KT09VU1RcVlJVU1JPTUxJSEhGPz88Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF1SVFpXWFVUV1RSWFhZWVlTVU9KR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBTTUlNS09SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmhpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExISkhGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVFFQUVBRTlFPUVBMSkxMT1BOTlBRUU5QT0pMTU1LR0VFQ0E7PTw8Oj1HNjY3N0RtcHR2eXt7fXx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nVFFTQUdVUE9RUVBNTU9NS0xLTE5PT1FMT09NSExLSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7e3t9e3x7eXx6e35+fHt1dHVydnZ6e3h6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05MUVNMVFVUV1dVTExLSTw5ODc7PkA+PD1BQEI9PkVIRkNFRklHSkpARkFBQEZIRUpPSFFSYlxSUFJPU09PUExNT01MTU1OT05bV0tNUU9HSUhDSUpMTEtGRkZFP0JDPjxCRz9CP0FkcHN2enp7e3x7enp3e3d5fn58e3FzdHByc3dzeHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0JAQD5AREpFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xOS0xOTU1MTE9OU2ROSkxSSUlJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg5Oj9CPzxBQkFBREVHSkZESEhHR0hDRD9CPz9AQT5DRUNLTlJUTEpJTVRGSUlKTEpLTElKTU1PUFJQSkdDTEdDQkpJTE1PTklKSUdDQ0NESEpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9tcG92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSElHSktJSktERkI9Pj06OTo7QEI/PUFCQ0NHRklLSkVJSUZHR0NDO0FAQj5AQENFQ0lNUEhIS0dIS0RISkxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS0xKS0ZHR0pOTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZGR0VGRkdFR0JDQD48PTk6OjtAQ0A+QUNFRUlFSUpMRklJR0ZGQ0I7QUJDPkBDRENER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSUhJT1JSU05SZmZmcm9zeHZ7enxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NCRUBEQj4/Pjo7Oz06PD5DQT5BQ0RGSkZJSExIR0dHRkVDQD1EREI+QUNDQ0VHSUlHTVFKRkZHS05PS0ZISUZFREVJSkhLSUZIT0tDSUxLT01PTk9PTkpKSUxSVVVTT1dkYGBtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPUJBPkE9Ojo9Pzo+PUBCPkBBREdKRklGSUhGRkdEQ0JBQUZGQ0JCQ0RFRUdHSEZMUUxJT0pKTUxJR0hFR0VEQ0lJSEtKR0tSTUJOTkxPTk9PTU5PS0tLT1VXVlVTWF9eXGlhbmpuaHJzYmRmZWRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd3dnR3dWpzdW51dHNxcmtrck1HR0ZIQkJBREU8QUBAQzw4Ojw+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUlNS0lRTUpLSEhJRUZISEVDSUpJS0xLUFNORFFST1BRTk9NTlBNTE1TV1ZYWFVYXVpdZGBpY2ppZ2tfZGVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc7PT46PjpAQj4/P0JFRkRHREVIRURGQ0RGRUZKRUVJR0NHSEZIR0VDRktKSE5LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1RSUFJPUU1OUU5NUFdaVlpZVlpdWVhhYGFgXmhlY2BkZWhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSEhISURCQ0hFPEBFQkU9ODk+Pj08PEFCPD8+QUFGQ0ZDRElEREVFRkdHR0lGR0tIREhIR0lHRkRIS0lHS0lNS0pLTEhMS0xLSk5LT05PUlVWT0tVVlNQU1FSTE9RUE9UWVpZXFpZW11eXWBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD5APz4/QkI8QD5CQUZDRUVFSUZGRUdGR0hGSEhJS0pGSkhIS0hGRkxJSEdKR0xMTUxMSU1LTU1NUExQUFFVVldPS1ZVVFJTUVJMT1JSUVZaWl1eW1xeXl5gYGFkXWNgZWZgZWhqZHNzZmpnZmtvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQ0VERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRkdJRkpGR0RJSEdJSEpMSEhKSklMSkZKS0hJS0pHS0tNTUpKTUxOTk5QS09QUlVYVk1NVFVUUlFRUE1OVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbG9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ1bndLTExMTUdEQ0FFPD9FRUVDPUFBQ0JCQ0RBQ0VBQUVHQ0hISUhHSkdDR0lHSEpGSU1ISUpNS05MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlJQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2NoaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAREJFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdJSklJTEhKSk5MT0tJTEhLTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2hmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQj9AQj89REVGRENEQ0VFREZCRkZHREVLRkZKTUxLTExHR01JR0pLSEtLSUtLTkxNTExMSUxNTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZsbXBzcnBycXBxcnFycnJ0cm1tc25ub3BzdXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdDRkNGRUZFRENISEhERUtIR0xOTkxNTUZKTkhKS0pJTEtKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUFxubVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncG9qam5vcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGSENHRElGRUVCRklISEVITEtHTU1PTE1OR0xNSUxLSUpNSUtKSkpOUE9OTExOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHhrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNGREhHTEhFQ0NIS0lIRkpMTEZOTExTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcXR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVERUFBPkREQkdESElNSUZDRkpMSkdGS05MRk9KS1dRS0dLSkpOSkhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtvZWRwXVpca1ttcWNwc2xkZ2NjZ2Bgam1xcG50eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFxdXR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMWlBKRUhIS01JSEpKS0tJSElGS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT05RTk9RSkpPUFFkcWlUWVZcW1xWWVtdWF1cXGNmYWFlYmNmX19ma25pbXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NER0VFQUVDQERIREZHQ0lLTEhGQ0dLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT01KUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSS1lhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGFhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHJ4cnhzcXJ1cnRPQkNETE1CRERCRUlFR0dGS0pLSEVFSUpLRkVISFBLTU1KTVJJR0VASEZLSUtMSkxKSEZESUZERkdFRkpIQ0pNTExVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoaGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFSSkpNSUVDQkNHSEZIR0lLSkpJREZLS0tFRklKTktOS0hMTkdHRT5HR0tJS0xKS0tJR0RJRENERUFGSkVBS0xKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WVFLRkRHRUJFR0hGR0hIRkdJR0hHSEtJTERES0tOTUxLSEpKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQ0BKS0hQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUE9cX2FjY2NjYl1kY2JkY2ZYUVZUUVpXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGREZLSkZGRkhHR0lHRkZJTEpORkRLS01OSkxJS0pISEZCSEhRTUxLT01KS0lHR0VEP0VDSUlDQ0hHRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWFSUV9fYmJgYGJiYGNiYWRkYlhPUVBRWlJbXV1dXV5fX2NoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktKTVBFRklKS05MTElLS0lJR0RIS1FPTU1QTExLS0hJQ0RBRURJR0NDSEZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1OWGFcYGBfYmNiXWFiV19fVFBPT09XUVxbW1xcXl9hZmZlbGVvb3d8e4B7fX+AhISEhISEhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+Sk5GREZGSERJUmJQQ1ZeSUdHSERGTUpQUEVJSUpLTkxLSkxLSUpHRUpOUVFOT09NTkxNSEtBREJDREdEQ0NGR0JNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TUEtPU1JVWllXWVhYZFdPU1RQUE5NTlRSWlhYWl1cYGBkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoaHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxHR1hMR0hKSEdNTFFQSEtLS0tOTVVOT0pKS0dHS1BTU05QT05PTk5HS0ZgRURfTEVnZEZOXEleW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgX2FiYWJfZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUdGSEVFS09TSUpGYFNHSk9KSU9NUlBMTUxMT1JVUk9PSUtOR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXJ0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fWm5YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW15gYWFhXV9hZ21wbF9wd3R4gYGCg4OCfn1/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJS0VRVUxLTklLUlhXUU5OT01RVE5PUU9LS05HTU9TW1pUUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJvb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ2x3foGAgn17eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOTEdgXUdBRUxNR0pKR0lPTk1NSk5WXllVTFFTTlhaTVNTUk1LT0hRUlRZV1dQVFBQUFFLSGd4bGN4cm1bTE5WeXB1bXVib3ZQZWVKZnZxbXdvgGpmeHdpV3JRaHptaWp6en1seHp/b2hvWXZ2anZ1cIBfcmZ9aWx4fG9eX19iYVpdYmRnaWlkZ2JjZGxscHBzdHNzc3pxcnhibHVncnl7cnJ2eX6Bc3V6bnx9eXhybk5LU3VOQ0JGUFBISktJS1BOTk9NUFpgWldLVFdQYV5SVlFZUkxQSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYVduTHFwXkZoeVd2VEtoeX14YHl7c25hXW1vY1JncXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXF9kZGlnZ2VlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX9ucXBre3p0cm9tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xZVU1VWVVlWFJSWV1TTE5JVFRXV1lXT1NOTk5RSVJtSGl3S2BkdndWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbF92dWtpdXt6bX54a3xwXF5eYlteYWRkZmVlZWJaY2Npa2tyc3J2Z2xpaGRnYWFrYWdzcmxnbW1yfWttaGt7dG1ta21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZUVFRhX1BOTUpUU1RRVlZOTkxNT1BLSFFOUFVMS0xTVFNTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1hYUl5ZV15XVVBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFBJS0xMTUtKU1FNUVFPTFZVVFBUVVhVWlVRWl1VVVRXVVlXT09LTVZUUU5VU05PTUxRUExKUlFLUU1LTFBSVVNRUlNTSUhMTk9RUlFQUVRWUlhXXFdTUlBSVFVVU1pRTlNSWFZUWVdVWlZUUlZUVFVXWFZcWV1gXVtaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY1xaZFxhbWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVBNWFdVVFVXV1dZVVNcYFZXVllVWFJQUEpOV1NQTlVQTlFOTFNQTU9VU05STk1PUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVlhaVVNSWFZVV1tYWV5cVVheXF5cW11gYF1bYmJjZ2ZlZGJYX2FiXmBnZGZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmdmZGBiY2JPTE1MUVFMT1RPT1NRT1FbWVdXWFpZWFlWXWpkVlhZWldWU1NPSk5WVFBPVFBQUE1NUlJQUlhUUVFPTVBUVk9YUlRVVU9OTVFUVVVUVFJUV1ZbXVxaVlZRUVZYVltbV1FUVlZWVllUWFhWU1NZV1ZaXllcXl5VXlxeYFxbX19fXlpiYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FcX11cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xZWltkcW1oZF9bWFVVV1FMTVZTTU5ST1FST0xQU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlFOVVZVW1tXUlNXVldYVlRZW1VUU1pYV1xeWl5fX1RhXGBhXWBiX1xgXWNgY2doZGZgWWNgYV9fZWRfYGJbWlxbXFpaWVhXXFpcW2BeX1teXmFgX2JcWWBbUU5PTlZRUFRRT1RUU1BXXFxcWF5cXlZbXmpxd3mAY1xbVVVXUE1PVlNOUVFPUlRSTFJUVFlbV1VPUk9TWFdUU1VSUlpPUFJSVltWV1dTVlpYXF1bW11WUk1UVVVbXFZSVVZWWFlTVVpcVVNTXVhaXV5cYGBfVmFbY2JdYWReXGJhYl5jZmlkZl1bZGBhYGBjZV9iXllaXltcWllYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1tUV1dRTlJaU1JRVFJUVVRLUldWW1laU09TUVZWVlRPV1JSWlJUVFRYXVdYWVNYXVheXVlaXVRUTlVWV15bWFJVVVlZWVVXWlxWVFdeWl1dYF1iYl1ZX1tlYV9kZF5eY2NhXWVmaWRmXV1kYWBhYWJkYGJeWFpfWlxbWFhYV1dbWVtgXFtbXFtYWVteVl5ZXVFPT1JaUFpUVVZWU1RUXl5gXl5iXGBVXV5ia3l0bH1rWlRZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUlZRWVhZX1taVFVWWllaV1haXFdVW15dXmBhX2NjXF5dXWVhYWZkXl5kY2BcZ2RoZWRhX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QVllRXVVWWVdXVVhfX2FhYGNdX1VdXmJlZXWBemhXWFlTVVNWW1hXV1ZWV11YT1VdWl5dXFRSWFNXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWlxWV1hbWltZWVpbWVdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYVtmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lYXVpbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlaWVRXVFdbWlpbWVhZYFdQVV5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1ldXlldVVJYV1lZXWJaXldYW1xbXFtbWlxaWl9fYGBkYmNkZGJkWmFlYmZmZV5hYmBjXWJjaWRjZ19nXmFhY2FhYF5fWFRbWlpbW1hbWFhcW1pbWFZZWFdcW1tgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXFxaVldYWVxcXV9bWVtiVlVYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5XVVhYW1pfYFxfWVlcXF1eX1xbXVlbYGFeYGRjZGVlZWJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlaWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZcXV5gYWBfYl5ZYV1dXllcXllYVVZbXGBeXV9bWl5dXl5hXVtbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRZaGhiZmljZV5iYmNhYGBfXVxaWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXXFxfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVhUV11eX2BfYFxbXl5gYmNcXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiW2NnX1xpaGJoaWVkYGJhY2FfYF9cXVxZXFlYV1hZWFdcWlpXVlhPWFpdYWNlZnJrf0pZV1xaWl9cW15bWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWJgXltgYWJmY19dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBaZWddYWdoY2hoZmNgYmFjYl9fX11dW1pbWVhYWFZaVlxbWlZWVU1YV1xoaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXp7e3t7e3t7enp6enp6enp7e3t7enp7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3p6enp6enp6e3t7e3t6ent8e3t8fH18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a8homJiYmIkMzT0tLS09PEvb6/vr7AooqMjI2Njol/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIqU3ebk5OXk5dPMzMzMzM+qjY+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXl5endvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2DhISEhIODgoKCgoKCgn58fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV5dnZ2ent4e3h3dnd6d3l5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3l5eXl5eXl5eXl5eXl6e3t7fHx8fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2eX18fHt5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjYyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fXx6e3h8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3dnt9e3l7eHx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp5en16eXt5fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4e3h5enl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGhIOEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYF+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiIaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgoGAgYGBgYGAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgYKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0c3R0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NxcHFwcG9ubm5ubm9ub3BwcXFxcXFwcHFyb29ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzc3NycnBwcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXNxcnJxcG58gm9wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwh4ZwcnFvcpiCbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF9oYJwcm+LnnxucHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXWdoXdxd5+cfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZiokG+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4d3d2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nyc3Ryk6mkeYignXxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eXmftKmkqKiXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgYGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7ia+mobWrrKN+e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2YpZahsqCZp5N9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgZycjqCvoJ+in4CAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImHh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5qOmLGhmJachXx+fn6Afn5+f39+f4CAgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+foCBfn6fq6WWpJublqCfhn9+fX+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CKioqLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgYGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KDg4aNn7KooqCYnZ2mqK2ooJmQh4GAgIGAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNoK2xppuaoJuenJydoaSjnZSHg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYOLl5mXlpigm52dnZmal5CJhoaHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODg4SDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBho6Uk5eanJyblI+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5OSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgYGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDg4iQk4+VmJKHg4KFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHh4WGhoaHiJGTkZCOkI6RkYyJiIWBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKBgIebiIuHgoKCgYCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo+PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIiIeIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf4OIjoCBgoODgX9/f4GAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f4yVgoKBgoSDgYGBgoKDg4OCg4ODg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIODg4KEhIWEg4ODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSk5CNjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYycjoCCgYGCgoSUlIyBgoGCg4OBi5yaoZqKgoKCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpOSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoaGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgYmSkIyWo6OPgYKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWFhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDgoOCk5SWmJKXnpyJgYKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf319fX+ChIODhISLmZSamZeWlZKEhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaGhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39+f4CDhIOEhJGVg4mWmJaVlIiEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWFhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFnZOBgZiZmJiWi4WGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWDg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf359foB/f39/f4CAf3+Af3+FhYihoJubn56SjZCKh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aGhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGBgoGBgYGAf4B/f357eoCImqCamqOim4yBjIqIiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCg4OCgoB/fn19fX1+fnx7e5Shl5aZn5+bmIuLiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4KEh4iIiIeFgoKCg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiIWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKDg4F+fX1+fn5+fn59fn19gZWTkJeYk5ial42Hh4eIh4eJh4eGiIeGiYmEg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoODhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhYaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6gJGOj5COk5iZioOGhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGg4ODhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GEhIODg4KCgH19f4CAgX99fn59fH19e3p6hZCNjI+Ul5SEgIKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4SEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn1/goSEgoOCg4J+fX5/gICBgH59fX19fn18ent7iI+NjY+Phn9+f4CAfn2Af36AgIF/gICBf3+AgYF+fX1/gIF/f35/gIB/gICAgH+AgoCAgoGAgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x8fX59fX6AgH59f359foCDg4OCgoGBf319fn+AgIB/fX19fXx7e3t6enp7i4+NkIZ+fn5+f39+f4B/fn9/gH+AgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af39/fn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fX5/fn1+f3+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp6enl/jo6Uin9/f35/f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f36Af39+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp6enmDkI2VjIGCgICBgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIGAf39/f4CAgH+Af4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEhIKBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXx6enl5eXuHiJSVhIOBgoOBgIKAgoGBg4KDg4GBgYCBgH+AgYOBhIKAgIGAgYGBgIGAgoF/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eXyCh5GEg4KEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5en2Bh3+CioSDhISEl5eDg4SBfX6BgYKBgYGCgYOGiIyFg4KCgYSCg4OCg4WEhIWDg4ODgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl6e31/fIWRg4ODhISUk4CBgX9/f35+hIyAf4CAhIaQiYWEgoKBhYWLgoGChYWGhoSEhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6enp7f4KAgYGDgoB+fX9/e4iRfHyOloB9fn+ChoqFg4OEg4KDjIl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXh8fX6Af4B/fXt7f359gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32CgYCCgoCDg4OEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e35+fn9+fn59fXyAgYB9ho+Bfn2Cfn9+gIJ8fIB/goCBgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMi46OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4WEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX+AgX1/f4B/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjY2Ojo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgH+Af36Afn9/f35/gX58e3x8fHx8fHx8fHx9fXx7fXx8fHt8fHx6enl7fHp9hYODgYGBfoB/f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fHx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhYOBgIB9fn1+f36LhIGHfn18fH9+goJ/fXx9fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjYyPjYyKhoSFhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOBen5+fH5+gIB+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn19fHt7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f3+Af39/f39/gH+BgYB/fYB/f35/fn5+fn98gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt8e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5+f35+f358fH18fH18fX57fHt8fHx8fXx9fH18fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko+NiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/fn9/f4CAf35+fn1/gH9/f3+AgH+Ag4KAf4CBgICAf3+AgIB+fHl8fn1+fX1+foyGfX1+e3uDg319fXx9fH19fX19fXx9e318fX1+fX59fX59fHt7e3x7fHx7ent7enp6e359goaIh4iKiouLiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKDg4GAgIGBgIF/gIGCgX9/fn9+foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fX18fH19fX18fX19fn19fn58e3t7fHt9fHt6e3t5enp5ent+f4ODhIiJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgIF/f4B/gIF/gICBgoGBhIOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5GEhIOBf359fI2HfX1+fX19fn58fX18fX1+fn1+f3x9fHt8fX58fHt8fXp6enl5eXp7fn6AgYOHhIiPjouKh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGCgYKBgICChIF/foF/fX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6ent8fX59f4KAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgIGCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH9+foB+fX5+gIB+gX5/gH9/f4B/fX9/f35/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fn18fHt8fHt7e3x7fHx9fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgH+AgIOBfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4SDhIOCg4SEhIOFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19fYCAf4GAgYGAgICBgX5+gH+BgICBgYB/fn19fX59fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhIWDgX9/gH+AgX59fX5/fn5+foB9fX98fX1+gX+AgICCgICBgIOCgH+AfoCBf4CBf4B/fn59fn5+f31+hYWBgYF/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH58ent6fHt8goF/gn9/gYCCgoGBf39/goB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSDgoSDgYOBgICBf39/f4B8fX1+gH1+f39/f31/fH5+foF/gX9/fn+Af4GDgoOAf3+BgYGCgYGBgICBgICAf4CBgYGCg4GBf4CEgH2Bg4SAgIF/gYGCgH16e3t8fHx/fX+AfH9/fX2BgIB+fX1/fn6CgIGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhIGEhIWEhISBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX99f39/gYCBf398foB+gIGCg4GAgIGDhYKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYSDg4KDgYGDgYCBgX1/gX6BfX19f39/f4B+fn99fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICBgoGAgH6Agn9/gYKDgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgYKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hYSEhYOCg4SEg4KCgoOBgoKBf4GBfYCAfoB9fn1+f4CAf39/f358foB/gYCBgH9/fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgICAf4GCgYB/fX+Bf3+AgoKAgYOChIWGhIB+fXx9fHx7eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHWGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1+gICAf39/f3x/f3+BgIGAgH98gH9+fn6Afn1+foGBgoJ+f359fn5+fn9/gH99gIGAfn59f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgoGCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYGAf32Afn5+f399fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8e3t7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH58f4CBgICAgIB8gH+Af3+BgH9/fYF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf39/gH9+goSCgoOFhYKCfn18e3t7fHl3e3l3eHd3eHt7e3t8hYl9e3p3enx9fXx8fX19f358fX5+fX19fH19fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYGBgYKAgoCAgIB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gX9/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5fHx8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fn1/foCAgYGCf4KBfX6Bf3+AgX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGBgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKNenx9fHt9eXt6enh6gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgYCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgoKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKBgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x8fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf3+AgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+AgICAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31+eHd2eXl6e318fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4SBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgYOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97enZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgYODhoODg4KChIGEg4GDgICCgYOBgoKBgoF/gICAgoGCgYGCgoCBgICAgoKBhIB+gYOCf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3x7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSGhIKDgoOEgYSDgYOAgYOCgoKCgoGCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4J/f4GEhIGDf4KCgYOCgoKBhIODhICCg4KDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoKAf4GDgn+AgoSDg4KBgoKBg4KCg4ODg4OEgIKDgoODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYB+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgYCAgICCgYCAf319fH19fHZyd3h4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGDhYOCgoKDg4GDgYKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYF/goOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgoKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4WDg4SGhIGChoaFhISDg4SEgoSFhIKCg4OEgoOCg4KCgX6AgIKCg4KCg4OEg4GCgoODg4OCgoGBg4J/goOEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fn1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODgoKCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4OBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB/fXx+gn9/fn5+fn19f39/f4CAgH+AhISEg4SFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYuIhIWEhIWFg4eGhoSEhISFhISEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4KDgYOEg4SEhYOEhYaEhIZ9g3p9fn+De4WDgYSDgH99fn9+foGDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWDioiFhYWDhoWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhGp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWEgmh6cnNzfIBygoR+g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fX18fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgoKEhoaDhYSGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OFhIaGhoSGhIOEhIZ9cHuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId6bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KCg4WHhYaAgoWDg4WHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foF/f3t/fn2AfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIWFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIV5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGBf35+f39/en59fH59f39+fYCBg4OAgoOBgoSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4eEhISFh4aFhYWFh4aIhYWGhYeHhoaEhoaJiIWEiYqIhYSFhYaFg4WFhIaGhoaGhoN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBhIGAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGg4aFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SDhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgYF+f357fHt+e3x9fn9/fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhoWFg4SFhoWEhoaHhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaFh4WGhoiGhYiHh4WHhoaIhYWGh4WGhoWDgoWFhoWFg4WDhISGhIaGhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH99f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSGhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYKDhYaGhISDhISDhIaEhoaEhYWDhoaFhoWEhoeFhISFhYOEh4aEgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn59fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoWEhoaHhoiGhISEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFhoiFhoeFh4aHhoeFiIiHh4WGhoeFhoaFgoSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIB7e319fHx8fn18fHx9fnx9fH59fHx9fHx8fH18fn17fIB/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhISGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoWHh4eFh4aIiIeHhoeGh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt8fn18fHx+fXx8fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiHh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaIhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn5/fH9+fnx8fX99fH19fH57e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fHyJh4OGhYaFhoaGhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaEhIaGh4aFhIOFhYaGhoaGhYaHhoaHh4WDhYWDgYKCgYOFgoN+gYKBf4SCfn5+gH5/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4WFiIOEhYSGhoWHhYWEg4WFhoaHhoaFhoaGhYaHhIOEhYKBgoGAhIOCgn2BgYB/g4F+f3+AfX98fX1+fXt+fXx9eXp6eXt8fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCBgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeGhoiJhoWIh4mHhoeHhYSGhYWGhYSHhISFhIiGhoiFhYSChYWGhYaGh4SGhoaFhYaCg4OFgICBgICEgIOAfIGAfn6DgH1/f4F9gHx9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KBgIKBgICAg4F+fn+AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaFhIWEh4aGhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAhIB8gX99foJ+foB+gH5/fX1+fX57f317enl6enl6fH15ent7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4aEhISChYODhoKDhYWEhoSHhoWGhYWDg4WEhYaFhoSEhISFg4WEgICCg39+f39/f4CEf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXl6eXp7fHl6enp7e3x6e3t7fH19fX2AfX18e32Af318hoOGhoWGhoOEgoWChYGBgH9/gIB+f4GBfH5/f35/gIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOEhIWGhIaGhoeGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfoGAfX6DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp8fHt8fn59f4B8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH5/f4J8fX9+fn9/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChoWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhYWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn99f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX59f4CAgIaDhIWEhYKEgoKEgoGAgoB+fX5/fn9+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFg4WDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4aFhYSFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgX9+f318fH19e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/f4B/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxBQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NTU09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svL0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19jX19fa29ra2tra2trb3Nvb3NnX19fX19fX19bW1tbW19rb2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZElJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbLzINtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0jYuLi4uLi4uLi4qKioihv729vb29vby8vLy8vbSLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOUmJMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXy81OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFhSU1NTU1NTU1NTU1NOeq6qqqqqqqqqqampqaybVFNTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18vNUiwxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp5cVldXV1dXV1dXV1dXU32wq6urq6urq6uqqqqtnVlYWFdXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fMzlw5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqiZmFiYmJiYmJiYmJiYl6Fs6+vr6+vr6+vr6+vsaFjYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzM3EwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs7OzcvMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzLy8vLztLS0tLS0tLS0tLS09PRzM3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M3Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztLTz8/Q1NLPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19fX19fX19bW1tbW1tXV1tbW1tXW1tbW1tfW1tfY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztKrnM/RyJSn0tHHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTEJAPT08PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK2nKWk0ZqsnLDRmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/OnZyRnryViJyexJKGnZzNz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I6NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv5igm7KuwcmYmMW8yZeZxdDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9COjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P07SZlqq4pNaUlp/O0ZKZoc/Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8qgo7/KnKWMp63Yqpmq1M/Pz9Srmn6jj6Szn8Ob2q2jv57V0dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDUrJuni5Wh0IqSnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbX19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q07aysqWZqtHbpZmz0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXEopmWnauSp5qgrZCnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6DH1aKrpJ2xpKWooK+noqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09PIkY201p2SjbrVmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVUxGQjw8P0ZFR0tIPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MjB1dPTucfV09O5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRExMQD43NzU6ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHT1NLS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRENJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZJRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODg5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5OTo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3F0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h1fHZ9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTQzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg0NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7Oz4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojc2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBGPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2Njg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm6ubm4t7e2tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NjQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO1tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3trW0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+QkA/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utrausr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmpqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BBQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpaWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDY1NzM4Ojo6Ojo8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioaCfn56enJycnJ2dnZydnp+goqGio6OjoaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5iXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5KUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6elpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6SmpqWlpqempqKdnJ+hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3OTk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaampaWjoKChoaCZkpCPlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaCgn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSk5KRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU5OTg5PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WSlJicmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqOjpKSkpKKhoZ6bmpmXobWemZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NjY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpmXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Cfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKCgoKKkoaKioaGgnpybm5uZn6ubnJqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY6NzU2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCls6ygoJ+fnpyZmZqam65qdp2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJuam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCfppKbq5+goJ6bmpmamaiERH+fnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnqCeYpymnp6cmpqbnKGjUUeDoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODo7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuapmZdo6CbmpmbnZyudUlMhqCcnJ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8Pjk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKSAUniimZmanZugpF9WToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgiFtflJqZm5yco49kWkyBop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiZn5ddXXaXmpydnaKBZFlNfqKenp6dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubmpydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc5ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmaYGFggJadnJ6YdGNVToCin5+fnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmZn2leW2V/nJyejGpfUFKGnpudnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal5NzaGFUdpOXnIdcVlBXipKOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6Smp6SfaCjlqScbkxPY4aGgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CEoJ2Of2yWpZWfgIl/X3J/gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5/gKKLfG5SdZyMjFpxfXx+fXyGjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZiad1hPTHCUhoJMYHBxd4iFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY2jjVUvMD13h3d2QUVea22EkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVGJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KmnGdBWkg7d3lrZ0UwOFlsc5CPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRfTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mpr49Kb6F4QXt3ZGFQUVtHYG6KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKN4YMDWpkN7jIB1T22OdlNkf6Oop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkp6eZnaSlo6KdYn+9wK93nqOalGVMYXhtUXSVoqKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqadnmqEnLqPptChmbGoWEysk1Nlj6CeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+roqKGd359cs/JsZunr2tVqrBiWoemn6WioZ2fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e0tbazra6tj4aDbo/NuZWRo5d0VG96c257laaqp6OfnqObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAP0JDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3u7u7ubnBuLS1oIh5ZFmft8CmqZ2Id2txb3h4en2GjpKYnKKlpqulpJihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW3wcbMz87Myb6zpJBzZlJEi5eJiYh+eHFuZ2ZsaWtxcnFxcnR8jKnExLuip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYWZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PFx9vj49rLvK+kl4h0WVpRQ2l6bG91bmtlZVlXXlhcY2lpaGVgaIm0wMC5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3b21bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7N0dXKuaedlIZyXlFUS0RbZl5ka2VhYGhZVFhSVlhZXFhadJm2u6u0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudnJydnJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/wsHHy8i3lHVlVVBPVEg+XmteX2ViYF1kYVNWVlVTVFdym6uwqqiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5uMObYUlER0tEPVtlYmFoY2BbY19XUU5PT1V/tLqsrqWko6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZ3N4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwa2DT0ZNRTtNW19la2VfW2BZWFJNVH+iqrm1sqypo6GtqqynrZ+stLS/w765uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dmVmampoXmtwbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCxpZqWEc/P0deY2JqYFpYV1NVdpm2vru8urysraapu7q5t7+ztbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rraussZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aGpqdW55bF5kW1ZgWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnOxcbGvalyUEswWFNVZmFTTk9wqcjIwsTGwLy+tLGwsMG+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2tr7WkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPCwbyRP092folWTG+ky9TFtr+/wL+6u721s7PAv7m/wrnBt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVnZGxlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzFp3drg5CYb6nIyMfRwa+9vbi5u7u+t7Sxur+0vL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX16g3huZmFlYmFjZGRqY2dkW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Aur/AvLvFvbrAxL+9vq9zZX2Ri4nRxb+/yb+wwb+6t7u+ubW4tLi8tb24tbSvs7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhY2Noa2dnamZqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdaNt7+7w7W6x7a1uLq8uLm2qqOYjn+Dyb+/u8G+uca9wr+8xbi3t7S4tra8u7m2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVnb2plbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/Ed6fMvce3ubettrS3ubO1sbzJw5VLesq+v769vL/Iw8XFvse4trO1vbi4uL67urm8u7q0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucWdxa3RmY25gXFVIS0pESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTWr3R/usjPwsC4rrS0u723ubG9w8qPQ3TNw8K/vr28x8zHx8THvLTAwcC9u7zAw7rAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFmbGpvdW94ZGhjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0ppxcqvS0czKxLW6v8TIvr60v8DAeVJty8bCvsG8v8PMysfFxsG5wrrFv8C/wsi9x8fGxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1tdGxtb2BjX2JiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8TQw7q+vMS+t7zAv8nPx8jKysKHcnOjy8zLzcrGwsPLzsG8uL26sXBjYrvIxMDAv8TAysnDw8PDu7e0wbnAvcLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaahn5uCe3qIe21teHxgcWRcX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqbK2w7+lenZ4msTHy8jBw8DAycrBv7u5saF9c2qtyMXEv8DBv8vHw8DIwL2sq8Czu7vBvsDKzsrEvbW8u7m/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3l0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEuW2szr22ucC8q35uaG5scoGVmHN3fJe9v8bAucC8vsXEvb24sbCZkH6Am8rCw7y9v7/Dw76/yL2/pZXDtLa1vb6+zszMwriyuLi3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBhWlRRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbR2gLO9trXCpYdpWl1gTVJbWm5zd4CfuLjCurO7t7u9v7q7u66km5mIkX7AxMO+vL+7u7i2wcK2wqCBp7aqsL7CutLJyMOxsLS0tby5vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z3eG5yYV9nXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmohHiJoK+1nmtlZlZYX0lJTVBTbHeFpbC3vrmytbK7uby2ub60lZynlqFwrsnEwL2/ubOusr27rr+fcnqjjZOcn6XDwr+9rKqvrbK6t7q+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybWBkYlxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fq4h8doygmWBUQ1dWSGFrVk9GSWCNoKuvtrq1tLKsvLm4tbjBvYuZsqOmcqXLwr+5urWupayzsKa0oXmEp5eRj5COjpmwtKWoqa7BtbOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3Zzb2ReaFldXlNPTkI/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7WRgniIj29OSj9jWkFOd4CUa01BXIGwtbO1srSvrLu6uLa5v8Z2hKqfm2Wnv7i1srGtrZ+kp6edp6q6xcvTwKSQlJeCg6CgpKW8xKyup7Crr7GxrbGurq+5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2dG12amxdXGtVXlxQTkhER01CR05HODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFOhlpKSlh2jYBjQFKiubO0srCxrbC5uLa7t7q9kKKyrKRzq7Cpq62ro6ignZ6dmJjO5uHh39XGp5GJeW1xl6GpwaaoqKGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusayqqa6vsK2lpqqkqLOurauopqapq6aqp6uyrK+zsauploF/gXdyeWl1dG9lVWJkWF1ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+xu6qZmZVpTkBSeHFQSUlLZ5uBWUVRrbuxrLOvrqyttraytLWuqaafmpudn6aonqCoqZ+hp5ablpWb28/GxszPzL+bfWxqZXulxqqXoqKfn6WgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh5g3x2f3pjeG1uXFFpVVBPR1BNTUNQUkA+Oz40Ojo1Ozo9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqLzCq6S+aUVSnIJRV0lJX0tTjmBjYoCutaqytK6qq6+wsrOtpZ2Rl5OPmKCfoqCco6SfnaiTmZSTrpxjcpC0xsfHq3xpaW5mlLWLm56foZyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+Ym5qbpJmXlJWanaCdp6iloKOioaOfnKCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fYB1dn1ubHtkaFZTZE5KSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaGqxr/KoVBBcp54T25LS2JldXNfWl5wj7GvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqklpaWl6FLLUhaiLPCwauAcYOJg3h9lKKen6aenZ+jpqieo6afqp2qraqup6iwpaOkpqespqGlopuZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJeboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GfoKWipqCJfIB+d3l8ZXl5YWJTVmFJSUtMU1VKU1FNOT5BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWdo8fHj1dTSWSjXGV+b3JdUGtjW2RfXWuPtLCwuKymoZydmpSYmpmQjpGVkYyOjZOZopyXopiZlZyEUmt/aWCUr66eg4GdnqOaf6qqpaGwo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6isrKehoKOxrrKxtKqyr6OZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWooqejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbWVcU1taTVJLT09WTVRNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpI16VWhydXVxYnZ2WFdjYGNnWVhXZayurK+nn56ioZeRlJygnJmYkpOfnKGjmp6alp6ZnZaYfGuQootecJmYj4uNnqOlp6e3tbCms6yhra2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpagnJuYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGDf3x4dmp3dl5tW1JhSVJWSEZWV0tDTUg9S0k4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCkgG6CcGBjWExbU1pNTFBYUkhNTUeXrKqppaCfmpGSlJiYlpaVjIiLjpWdnJ2cnpadmKWfkYGAs8rKk2KDhYaPiJWgo6GuvL64rLS0sLewrrSppqSlrKm5s7W7w7zDwbe7tquusbi3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaign5+oqKWln52qoqKem5+ooKSnrZmgo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mGhX52cm1pd21obl1YW0NXTkpHTUhDRk49Pkw+NDw6Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYpiV15lYFdNUUc+Pj9DQz8+QlF4qK2pqqagnp+ho56fnpudnJSTlZWenpiUhZ2Zn5mqpY1+gbDU0rF0YXN7g3iNlpmVpcDAvrW5u8DDub27rK6nsa2xwra4wsbAyMrAyr+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqqvo56sqLeyraOwpqGjsLGusKSlrqOhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V9YF5lYFFHRD1DP0U8Pzk2Tn+qs6eko6KgnqWspp+YnZWSmp6ZlYyKhoiGeGyGn6Khqa2QfXCk1ZR7h0tacHRxgoN6eJO9yMK/xMjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Awr3Hx8K4xMrJxMHHv7q0uru1u7ewtrKru7Kuu7fAu7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtmWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeup6KrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV05FPklZfHBiQj1cjq6soZmbnJ6emZeXmJONj5eXlI+NkIyCg4J2cnBsb42kq66ujoVmg6h/fHZfYmBkaWhjW1J2wMrExMvQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsbGysjPv8nRzcfGycbCvcTBv7+/tb6zrb/Aw8TIxcjEr7+5sri9xMLBu7y8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nX1paRE9NQ0ZRSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9LhZ6lmoSgsq2jnpyfmpiXlJOUl5GQkI2IhISJh4OAgYGAeXFxbmp2orayl3R9fHp6fnl7koRlXFBsaVo8bs7P0MTN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3K083O083GycrLwsfMx8nJxr/Ds7PIxcvLzM/Hyr++v73Bx8XMzMnJwMPArrCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3dqZVdYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY5Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnWNTTEpEQz9CUq3RvbKvppycnKCkoZ2alJSVlIp9eXFsZWJocnBye4WKgHVwbXBybYSkmYZlfHh3f4+XnJBpaGZkqKV1P6TYz9HCz9PW2NXV0svJztDLxs3SytLV19nW2NPW2M3Sys7RzM/RzdPQwMnIy8TMzczPz8bHyLbAy8DSzczQx8rJwMTDyM/N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVzY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqNbSUBBREFGUHWxr6aalJefnJqgoJ6bnZqViXdpZGFfYGBfXl9fXWFsdXNwb25rcG5yhJCGXl9eWVdxg318XFNxVYq3iWPP1dLQzNDN09fW09XQz9LT0cnT0cjQ19fY0tjS19nU1szPz8nN0szP0cDHxMnHz87S0dLIzM3Ay83G1M/Nz8jFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNGQ1NOPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI8Ojw3NDo+PD9APUZBRD2CpJygpZ6lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZ0M4PT5EWIKqqJ+XlZeZmpyfnZibnZN9cWVjYl9fYV9eYWBeYWBfYGVtcHBtam1vc3SGfk9PUkpRb3tsfmxTclqSrIKR0NXU0MnPzNLW0tHWzc/V1dHF0dPK0NTV1s7T0djX19fMyM7Eys/Nys3AysHJys7P0MzQzs7Mz9DIzNHRy87Lw8rIys3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRU1ZRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+ZpaegoKOnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksnxIRkI7Vo2hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5fX15cYm1ybm1xcXJydnFUT05NXGF1ZnqFdllng4x0nszS0c3GzszN1MvO0szK1tbQzNDTy8zQ0tPKztHV0tXWysDKwsbNw8nKw83ExsnLy8/Lzs3RztTMx8nQzcnHy8bHwsbKzM7R0cfQz83NzNDFx8G4ub3Dwr3DubKyvrC7w8O1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTUlRUUI7RD87Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9vdo+ajYyXlZCTkZGVlpWQi3tlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFvcHFtaW1ycV1KQ01OXVtgcWJIXW9nVpHGzc3GxMbNytHHys3NxdDSz83M1MrHys7Px8bO0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNy83QycXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxMXIu8fDycnCz8C9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVVHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KGoamTjY2Wj4WDg4OBfYSEf3NfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG1taGdpaXeDYEZESEdCP01MUVRnXk6XvcfEwMK/wsfJyMjJx7/Ey8XHyszJxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbFvL/Kw8XH0sXBycDKysfIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdDR0RMREZTPzU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bV56e52RipKWhnqAhIV/dXh1cnBfWltcYGBiY2RkZWRgW1xeXV5dX1tZWlxhbnFtaWZna2hsfnFbTUlHOEY/Q1NKVGRYlK+/uLi7ubfAwcHDvb24vL64w8nExsG8xr+3usPIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMx7LHycPOzMDFwr+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRUJGSkA5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys/FycXHwbrFvayup2Bjd4CSi4iLhHh/hoZ/fYN7dHRjXFxdXl9gYmNiYmRlYl1cW1xeXF5dWltcXWdyb2tkY2lpa3SBbVhLQ05XOTpNRkhbVJWis7CzsrKysrq0u7C2r7OusbrBu8DEu7+6tLG6vsC4x7i0vLbBwr24vcbBw7u1r7O1u7+0xbi7tay5vb7AvbG7trC3urPGvbevvL+1t7XFvb7DxcDExsbHzMW/xca7x8u/z8nHw8XBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBREY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJpbZ2+IjoWIiXp4foWGdneBfHNoXV1dXV5gX2BkYV5jZWNfXlxbXlxdXlpbW11fa29sZmNmaGhqd3tfT1FZRTk4RklESmGfl6SnrqqoqqeyrLSvsaetpquyu7m1wrm5ua+qtLm7s8G6r8Cxvby7tbvHucO3raqosLLAtri9sLGosrO1u7yrrranrrauvLKwqriwrruuu7i7wMG+usO/xsPFwLzGwcfKuMXHxb/Hw8K5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc3Sy8PFwcTPxs3Bwsa/xMTDw8rCycq/wLzCurO1tcOvqrGTW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXGNtbWZkZGRmZ2p6bE9aW0RAOzY6PU2KmpGUn6Sqoaahqairqa+ipZ6prLS1sLy4r7aup623tLO7t7O8r7i5tbK7wbLAr6Wpo6uxs7OovaqrqKusrrW0pqiuoaWwqbOnp6iupqi3rLGzt7q6u7K8vr6+xL+1wcDHyLe+v8W3xcO/u7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8HLvrvJtr3DvrrKuMHDwrW2vLaxr7W8rqirk2NtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZWpkYmNhZGRobXddTEpWVlFRPkJ6nZGOh5mcpaCgnqOjpaWsnpuao6Srsa62tqavq6aps6uzubC1ta22ubKwurqxtqWgpaCmsaisqbmqpaenqKezraCnpp+cpKWsn5+npKGhsa2trLK1s7Owtby2u8HAsrq+w8GxubnCs8C9wLW4u72+vMLHxMPEv7/EoIR4cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhaXV5jYmBjY2NiZWZrcldQYGdvalp8j5aMi4KWmpyimpydoaOhpZyZoZqdqa6ssLSiqKipq6uktListq+ssrSus7WvsKqfnp+korKkpqq4raKmpp+oraqZn5+emZ2fpZqZo5ycnrCprKiqq6ytsLK4r7i5u7C2vLu6q7OyubO9tLeysbW1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uci4uL+3ssK0sbu7rLq6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFdXV1dXWFdaXWFiY2NiYmNkZG9sZXR8b0pPgpCUioyFk5qbo5uXmaKkoKKanZ+Zl6yrrK2woKShrKqmobSvsLGsqK+yp7qzprWgop+co6Kto6Kqtqqio6aepqajlpidl5manaCal52cnZytoayoo6Smrauys6q1sLKrsrm1r6qvsrKzt7Ouqa2usbexura6vb+3s7GUhnp2Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0JCQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMLMyMa/xbbBwMfOt8DDvbO5ubLAtrG5u62yta+fmqSqoJSbkHh/g4R/eG9xdHFoZWRoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVVdgYmNhYWJgYGRmcXF2eWA+TGByjYmOiI6Yl5uZkp2dpqGcnaabmpippK2uqZqhoraooJ+tqLWppqetsKS3sKO3oKOcmZmqpqGarbmvo6GknKKgn5OVoZSWlpuZmJaXnJWfqZ6qpKKdo6qqsK2otKyqpq2ysKWrrbOxsLCvr6eop7KtsbSwvLS6t66jlIJ6d2VfYVdZWFNSVEtNXkxQTEdITUxFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rZ2np6Kqu8C9wLmutLjBzMjFwsO9xbjIzLLBwsGuvLu1u7y1ubmwsLGqnJqhqpWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1ZVWmJiYGBhX19gYmdwb3RSMSwpP3iOjomMlJiWmpGbm6SioKSknZudpJ2praSeoKG1pqCgoqeyoaWnpa+lsa6rtZ6gnZWVqaGilK2xsZ+io56emJuTi6CTkZOYmJKWmJiXnqebp6KimqSlpaukpbCnpaKrrK2mqa6vr6uoqqqzpqarr7Sxrry2sbCvn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk5PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLyxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZoKSMinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVlJUUlRfX11eX1xdXWBhaG9uSSsfKUVvk42Hio6bk5uSl5uhnqmioaKhoaCap6mimJyisKmgoJykqZ2nop6srKqpra2ioaGVmKKanI+rqLCcn6Kfn5eZk4qdkY2Sk5aQmJiTnKGjnKWhopWgoqSlm6OrpaKkqqSqraWtsqmmpaamtaapqK2ztbS5uq+rrJ6Mc3FwYVtXVlZSR1FPSFpcT1JKVEtTTEVHSkM4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm9sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5QWFxaW1xcXF1cX2Jrako7Lz1JXIeOhYmJk5SclpabpKSmpKmkp6ShlqOropOXo62nn5uYmp+erpmcqrOfpaafo6OhlJSblpaSqamtmpyfoaCblJCMmY2LkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq6+krrilo6SirK2qqKuvtLeyvbWzq66YhXV0aVxZWVNVUkZYTFFbWE1VT1BMUVJJT0lCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njg6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFBYWVlZXFtaW11eY3BsTUJPdGxrhICLh4+RmpmVmqakoqqopa2ipZacqZ2Tk6KnpZyXj46Zna2WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6elo6Mi5OFiI2Dj4uRlZGgnqGkmZaflZqhop6Um6WlqKiooLCwp7G9p5+jrLSqrqevtLC5tcCxrrCrkX9zdGJXVFVOUkpHVlBSUkxMWE5LTE9TR05LQUNGREM+Qjc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtri8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRRTU5NUldYWVhYV1pbW2BpamZsZHV2YXt8i4GMi5CUkpejlpumo6Kom6SVnaKYkIydoZmWloWEkZqjj5WjnJWWlYeimpuTjI6KkJqlp5uVlZeckZOIlI6LgYuNgJCLkpKSoZqgopaUmZiVoqaajZmlp6inoaC0sqizuKGdo7asqq2ksrKmtbu0q6yxoop6dG5eTlFRTU9ETk5OUEtGTk5KSk5OUUhNSkFITElIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4NTg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLEtbWys8bFt7rDyszGs6y6vbS4wK+tqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlJSUFFUUVNVUU5NS0tTV1dWV1dXV1pcYWVaYFtueGV2coV6hYGMiYyXm4qVl6CeoJejk56Zk4uFl5mLc4yCfY2XlYWSmZCTjo17mY+cjIKJgIqYoKOekJOYloWOgpR+fnOKjnqQh5OQkJ2bmpqSlpCejqOjjomaoKGjpJuitK+sr62gmKa4pqWwobGunLG8qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU05JSkpFS01HS0s+ODQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWmpqayp6a0wbivtLDJxLi5wM7GvrOtu8GsrcStqKGmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpHTlNTU1RUU1VYWlxoWFpYaXFrZkZQaYl6jn+FlpGGjoyblZqVlZSRjJSIfpKIXjtWbnuLk4mAjJGMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFvho1+iYGQjpCXmpmTi5CKnYifmIiIlp6aoaCXp66pramonpats6KlrZmtq5iotKOpraKTf3RuYFtOU1JXTERUSlBMTEZOT0lFTFFNS1BKSU5QR0pKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKepp6OqsKintMK5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFMT1JUVVdZYGBVU2RsY0Y5OHqOioh2gY2Hf4WIl4qUlYmRhYOShHeHfl9JUG13ipGDfYSMioR/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiJWEm42ChJKblp6dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoaaninduZl5cSFFRU01JVU1TSUxLT0lIRkpOTU1VS1FSUEdKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnp6+sqrW8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/iZSplpWLf46Eg354cW9YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNTVVpmXVZhaVpaUUuIfY2AbHd/e3eAh49+kJmLjnmDjX1zfndxbXRwdI2NgHp+iaqEentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWLiIqNi4B/hIuNgJSEfICPmJSclpGfnameoKGdoKmln52YjaekkqCglp6epIJzaWJdXUpXUFJIS1hST0pNTFJKSkpMUElMUU1SVU5GSUI9Nzg7OTk+PTo7PDk4QD86Oj48Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZicn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3eGeHx2cG9qWUtISUhHRUhIUFRUVFdXU1VVVVVWV1hXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXmJhYGNWaIGOkomLdGByenBzeoSMeYGYkn5vhI16dXluan2tfHSQin56hpKAfH90ZnV8hmxvaHN8io2HgG16cX1xbXaPcWhxgX6OcESLhYKDhX93eHqMhn2Me3V9jpKPmIuSm5ujlpmdm52eoZyWjYulm46dl46WmJB5b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUU9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rp6mwr7Gru7irur64s6ynm7CnrJuPlpylqaShmJqOhJJ5iY+Li3ZxfG11cWptalhLRkdFQUBDREhMTE1RUU9RU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhcXmBcWXmZnLx7bXBcdHFpdnODjHZ5iYNtaomQd3J3aGl/gXGWkYqAfZV/SZKZbmd3foJtamRseYWQkoZrc2x8bnJ8hmltcH9zjYmFhnt9fnt3cHV0hoJ5gXlwfI6MipODlpaYmpCTlpaZlp2WjIOJn5KLko2GkJaAb2pvb29ZVlhUUlJZT1JVVFJYVU1PSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYmp+krK+iraqota+urLO/q7zCv6aimpWkmJ6NhIuUoaKYmZGTi3OOeoCGjIZ1b3RscW1la2tZTkRGQ0A8Pj5CRkZHS0tLTE9SUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSk1OT1JWWlFXVVObe1iQYGpwXndqaHl1hoVyfoSBcWqWj3JxemlpnI5MeYSRiISNZjF2h3JrfX2DdGZldX6EhIWAZmlsdWtwgHxocXF8bpONj3t0fX1xcW92bYN/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo6VmYuOhXqEkJiVjZCMkIdxh4J0h4yGenBzcW9wZHBnX1RGSUM/PDs5Oj9AQURDRUdJS09RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUtBSE9HXqaqmGdyb2V2Z2x9fIB9doCCgnZvnZJyd35xc5KGNXGcp5yNoKGEooV2cIZ7hnxzjK2NiYFoZmJqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHRycW1gXF1eXFpZYV9STltaWFdMSElGSUg/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTAxMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBk4eVkZ2kp56vlaW0qa6wrsGyu8HFlo+MlI+AiHxugZCSiYOKh4+FdYODbJWIiHx1eHhteG53ZGpeSVBHPj83NDQ4Ozo7PT5AQkVIS0xMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1NUEw3Q01QUUJGfGp1cnJud2dwgYJ3eYB/e4h7c56XeHyEfoOYg5qcYIWpnpyLg5COenaHfomIjnOKl4+Ee1xkcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1BUWFtVR0pKRUxHP0ZAREM/QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTQyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2eppGgq6CxqK/AsrvFupaOkZOHeoZ2a3+LkYN9ioOOjHiDgHOghIp9fYF/cIF+emh3a1JYTEBFMjExMjc2Njg4Ojw+QUVGRkdJS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklLTU5RS0pTWlZPR2B4f3KAcnRrdomGdXiEg3qSg3WdloaEjJCTpIysqUiGrK+uioGAlIqBioGFkqmHgZiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZHbYB3cnl2aG1rX3Z9goh/h4SLeZScm4mKiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdmXFVQUFdZUERMS0ZPSUNGQ0NBP0NBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5COlZeSlqCdrKCmuK+zvLOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS0xNT1dfVmtXWVpigYl8i3l8en+LjHqBhIx9lpF/nZ6VkpmZpKySmbuxprrHw6eLjKGljpOJgZF8cYOen5Gdf3eFhYqPh5BpaHCEgXSMhoSKcoaCd4eAe3aEfG12dWZ/lI6GiIiGh4egqqKWiI6Xf3qBiHp5b2dreH58gHVsZl5aW15qXmFnYFpPTE5XUlFIUEpETkdDSkRDQURDQjw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVvZneCen+Mf4GQjoqamqScoaymqq6wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOhICBjIqCiY2Df4p/bHBqXUJBNC4tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlRSU1NUUlBPSEVCPDg3LzlDPjw8NjMubJOXTVBISkxLSk5WX196ZGNobZCPg5CKi4SHiJSDjouZh5ycj6CnoqGpkqe0oafBwq3Hr3i5lJp8jaGemISThYKOoZ+UmZGFioWPmpGWbHB1ioyClYyNjnePhHFthYGKlpGChYhyiKCVhpGJjY+WpLSom4yUooKHkoN9f2tqanyCg4N1Y15lYFtobF1tbF9XS0hOUlBOTExGSVBDRE5GQkNFRkM+Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnB2kYZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXmAkoiRkn2KhJiSkIOAgIuMiYaQh4SJhnh4f2dNUj4vLy4sLy4tLzAwMDIxMjU2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMS01OUV5qhHhve3aTko+enJqTm5CdkZiapJqkp5ymqaeos5aqvaq1x8i2yNDPvpugcGmqqZ+Ek5KFnKCam5mmkZGIlaObm3h6fpSYk6GTl5eBlJ57d5WSqrKIjJaefJOdm42RlZijoaW1r5yRmKeGlo+NgIhsc3N9gX5zamJeYmBiaGVgZ2dcUkVKS09OSUlMRkdNQ0hNRkZDQkdFQjs4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbXxhd459e5OOjoqfkpedlpuqmJ6qQkR9h4mHmI14go2Ljo18ioaPkI6BgoCJi4qFkoWDhomBgId2XmJQNTYwLTEvLC4wLy4vLi4wMDE1PkFBTVBSU1FSU1RSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUlNTlBZaoGKc42Dl5yfq7WxnqimqKOksKits66uqrivsbybscOqucnLt8O/t6WisLOsrKqji5aYhKWmoKOXgaaZjaKqqKWIhZSkoaGqoKSpj5uwi5Wjpre6m6Cir5KinKGdj6Khq66rsrShlKSph5mIkomVeXp+hoFpYmldZmNfZGRfZ2dfW09DSUhTTkZIS0ZKR0ZGSEFLRkRGRkI7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2hvWHmEdoGThYeCnIORkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GOg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8Mi8xMTAtLCstMC4tND9DQU1VUFJTVVVWVU1bUEdIRDw+PkZIQ0RBNzs8NUM7PUZLSUZIUU5QV36OmoCmnKigqLjBvaWvwbOpsL2wtbqzvLK/tLm5orfEp7XIx7W9uLSoo7OtsLGbmZKan4inr6ullHafpJehrLK0mZaqrqivtrqyuqyvtaKxq7G1u7a0rbSfpqeippmor6yxuLe3p5q1qIukjZCSnoZ4goV4W2NmV2djYmRhYWdhW1RKRERMVFBISUlESUdFQUBAS0RCTUc9ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFhYld5dHGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeEgY5/gYmPhn+GiIaKh5F7eG5dV0BETjw2OjQ1QUI3NjQwLzZDSENRW09RVVdVXFdPX1VJS0tBPz5HS0ZFRDs+QDdENz9CSkpFRlZTT16LnqifrK25rLC5xsSyuMG7sbG+tLW/sryutXOvsqS5xKOvxriws7Gzp6S1tqqwoKKXm6KSpbCupq2rp6SYoa20u6Kosrq1vL/Mv8XFvb2zwbe6t762ure4q6uwpK+orL2vvLrBwauYuaeUrY6Xl6mIfYN+bVhlY1lsZmtmV1xkWVZTSUdGTFBHQ0hJQUhEPj9CQkxAP01EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpwfo6EgI6FbnpzeIdiuaGZo4mUlJaSlJONj5eSh4d7hoGNlYqAhIGKenyKh4Z8ioKCi4SWfXh6dWVQXGRHRUw7UWNhW15TRz87SFBEWmNRUVlYWmdZU2BfTFNQRUE/SUpIRUVBQEM8RTZCPkhHSkxTWlRdkKqysLaywre0t8XKuLm/urazubm1vLK4sMRfc7CksZqeqryopKirqqOisrWhqqiflZaemKCupaempZ+klKOnsbSosrO9tsK+08nJ08bCxczCysPAvby+u7u2tK+4trbCucW9wsevnripoauNpKe1iIGBdGFkZF9ZY2BqZ1NYYVZSVUlFRU1KQT5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWQc2tycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoOAgnh7i4OHe4t5gYqCl350fXprZXB1WV5cUGVkYmBlZF1cWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhHQkk6RD9IS1NUVVxaW5C0u7S6scG6trXHyLe0uLS3uLG1s7KttLWXY3SnnK1vXqKsm5egopuknqqllJ+fkJOOlZiYqJ6moJ6amYOknq2lqrCtuLC9udTRz9fQyszSzM/Oysa/vsHJvMC8wMDExMTJvsfNsqO6sLSumqu3u5iAfG5fYl5aYGNaZGRRXGBTUUpDQUVGRTxARj5BSEI/Qz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaF9vlpKQlG5rb3R1h7SsoaGfi5mcmYyNlZGakoaKin6IhouQi4h8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWZqamhgZmlpbFptc5atpLyIhmdcb2ddWlpUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWCWtMOuta64ubKvwsSzrrevr7qqsbClqrari7WnnJqmmk2ZnYyOn5aRppillYqTk4mQiY+RkZ2boZeblZaHn5qnm6yvqbCotLTU1NTW08zQ09XN0s/MxMHJ0L3JycrJ0cbMzcLP0bevw7zDuaS1ucGihHFlXl9fWmJZWmZaUV1YTlBBQkhFQkg7QUM+QUc/P0E3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJncW94eYOhqp6ml4yam5eLjZWRmo59iYuFjYqJipCHfISCcH+HgYZ7h3KDkouOfXF4dWxweH5xem14c21pgHBtY2ptcHhod3x+y77B36dtY3huY1thYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlay1qrGkrbOoq7q+r6mzpaO3paqtoKuzoo2wrZmXmIyOkZGEjpuBjaaRnImDi4SLiYSLhJSWmJeTm5Gcl5man5+rrKWooqytz9LV0s7M09TUz9TRzsfD1NHGzdLT09fM0dHE0dbFwM7Hx8KovbbOnnxxaGBkX1hiU19bUFFUUU9IPkBGQUJFPEBBPkRDPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnWGhYp3bHdwfX5/oZ6eoYyMmJOTi4ySj5WFeYWQkI2LiYiQhn6Ce3F+gICHeoR1hZOQiH9vdnNsc317d3tzgnhya4BzcmlwcXp5cnq+y5p9i7GEdnKEdmhhal1DWllbVmVjWGNqU1hcXWBjXWN3en2LgZeoo6Ofnp+mpKmut6mlsqGhraCiraGmsZ6IppqTkpGJjo2IgZOJapSijJmEgYZ+kYODk5eti5WNlJmOhpORnpeosKKhoaWkqcnNz8jDzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcjX19HKq8LCy411cWViYVpWWlRdUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjo8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHJ4coKJgJ2VnZSFi5WJjomIjYaOf3iDk5iKjIiIi4h+gnhze32Ch3d/eoaRlYCDbndwbXZ/dnh9dIV8em2HdnVvfXaEdXh7nbWMO0GKxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhtgIKHkYqcnZ+ckJaXnaKjpLCio7GeoaScn6iforGbhZ2RkZGPioqKhoOPg36cm4uNgoSFeZR/gqmVo42SipeSjH6Yi5uSq7OYm5yonKe+w8a5t8fO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBnX1tUV1JcWEZHS0lFRT06NzpAQEI6R0Q/RENBQ0I7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhImBh3x4hZaWiI6Ch4WHeoR5cXp7g4V1eYWOjZx5i298cHB6gHF7gHGDh4Fujnp1d3x8gnV+fIaHr3NYqcK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeYuGjZORmpWflIaLkpqfmp2onqCrm6GZmJ2knZ6rmYqZi4+RjYR7h4eDhIuNn5mTiIOHfmyZeoSYhoiTjI2UjIZ8nImUkK6qlJaYn5mnr7a9qa6+x8zJyczL0MnD0srU19nX2NfV29fT2dvV0Nra0dbI1MqWfH5ra11cUVVUYUpDRkpIPkE+PTc6PT87PUc8P0FBQURBPj86ODdEQjc1NTQ3OS41NTY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgYGEfoN7fISYjYeLfYWHgHeCeW97e4aBdHmSno6gdo51gnR1gX50gIRvgZCCb5KEdXyBhXp2hnuJt8Wkwcm5gZaaj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWk5SOl5CCiY6WmZaVpJuXnpWdkpGWop2ZqpWQkImMkYKLg4iIgYWPkZ2bmYmFi4GFmHqIiZ+XkIiNiouCfaGJkYy8oZiTmJmdqaamrp+otr/AwbnIys7Oxc3J0dbV1dnV19vU19na29fb2tnYztvGiH18amxoYlZZV1hOTEVOQzs9PTw4Ojs9OT1ANj0/Pzw+PT05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs5OjdJUF1bUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7fn9+gHyEen2BkYmEhXqEh3t1fXRtfH2GfnN+kp6RnoORe4Z+eI9+eYqKboKagHSZhn2BiYV8fpB6j6mOj8OhvYyco5x9iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CRhIiKkJKTjZyZkpOPlYyLlJ6ck5+UkI2Nj4p+jo2NioOIkpaanp6Ii5SRnZGBi3+lmIiEjYKFhIGlhoqMt5idkZWWoqehnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuHt8e25saFpiXVRRT0lETEI8PD45OTo6OTk7PDY/PT48PTk5OzszN0Q/NzM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5cnlzbYB+hH53hZuhm52Ukn+MiICYiICckm6IqIV6oYt8kY2DiIScfZqQiYyjo6CQpK+fipCLhYuBkoZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIuGh4uSkouTk5OOi46Jh5WanI6UlpCKkZOFf4qHkYyKiZyWmKKihpKdlaCKiYiNm5CDh45/g4eGpIWMkbKYnZKUl6Gin5mSnJ2os7mtpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aBygHdqaV9gWlVYWUNASUM/Pj46NDg6Ozc6OzozOzs/PT43Ozo6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNiem1hfpKDb213i3h5fnqBfYZ7e3eGhH9zcIWCenV2dnSEgoR+f5Kmo5+lopaKnZCVl4uKp5dyirKNhKiShJmThZmMopWfl5KJm56jk6qwn5CUkI2OiJaMbo23hZrEyLKboaWbnJiWkLGRZKTNyJWOhoeIj5KMjJGTiISJiIWVmZqOj5OShpOWg36Pi5mHjZCql5aiooiYnpaaiI6Gl5eJhI6MgX+Hj6SIjpOompeTl5mhmZ+Zk52bo7O1pqO8wr7HxcXJyMnCy9TNzdSp0tHW1dbY2tTS2s6FdYNrZ2FgYFFLVlxCQkdDO0E9ODM3Ozw6OT02NDk6PDo4Mj85OTI6STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfoh4en56gYGDfnZ2gIJ7bG6Kfnl8d3h8hIaLfoujtKikq7OhlqegpqSWla+ig5C4lZGzmoyhoIykm6+jpZ2YkKeXqZmusKSXlJWUkIuYmpagwI6jybirmqOlrZmRm5yynYaFqKKcl4WIiI2Ui4qSj4aAhYaIkpeTi4qTkoaTl4WDkI+bc5CYspWWo6GInJmTj4qQipaaiIqWjYZ9jJifipCQnJqZk5mYoJSgnZSem6GxrqOkuL+0xMfEvcPDv8fOy8nSp8/M09LQ1tjSz9i8dX16YGNXY1hSSUtPRkJDRDU+Ozc2Oj87PDc9NDI2Njk3NzQ9NTs1PEs8Pjs8QkE3NTw7NTI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXF1ZSmhhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9yjHl9gXt4houJhoSSqLytqbO9sKWus7Spo6KwrYqatZ6juaWVrKSXqa24pqWjn5mpmKqksLGqmZiclJWRl6CXmru7rcqhaba4qrCVmJ6iq5KXvaNeqbKCiYmMlIaQfI6NfIOFjY+Tk4iGkpWLjpSMioyWmJGbmbSWlKqdi5uUkY2QkouYmomRnY+Lipafoo2VjZiZnZKcmJ6UoaCUnJ2mrqeipLO4q8LIxLW6vbzGyMjC0KHGyc3NxNfW0MrTo3N9bGBdVmJUUUdEPjxDQUE3Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGdIYWBicEpAi4l+gHKHh3yBiXWCioN/bX18fH5wd4d3jYGHe42PjIaMmqvDwLC9xryztMG9tK2ss7aMqLKtrr2rm7ujqK25uKunpqKho6Oqr7Kxqp2co5ibmJeeoqalkqO5r6i/vKytsrmlo6d9iIadrbywgouLipCDj4ORjnmBhpCMjZuHh42WjIqUlpOQmZabp5qxmZCqnI6aj5GOlZCPlZaOkKCQiJSbo6yVlo+UnJ6UoJ6bmJ+glJqfqKekoqOws6bAxsOwsLu2xcTDvsynx8PHw7zW0MzEyop3dmVfXWJeT0xDTEBFRz9BPkI8OjQ+QT09NT02PjMzMzI0MkExN0BCTT5HQENOQ0E9Qzw7ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxpRl9pZ1tdXJOMjIh7h4uGg4x1hpCKgW9+e4F+cX6BepR6kpSVmJCTlai0xsnAwszCw7nIvbqwq7m7l7K2ubLArqXApKuwvL2qrqujo56nrK+1samboKqcopyWn7C0p4yjurq1wburqJyypKSolISOqsTDpIKLjoaHhIaVlIx5g4yQjpGgi4uTkI6Hl5+XkpiUlqWgrpyMqZyNlo+RkZSVjZCUkY6hk4aXn5+zn5SblJ+hmaSfmqCboJSYn6akpaekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnIwbV4fHBfW19tVE5JRExMTEpAQT1CRDw1QUQ7OjM9OEIzMzIyNjJBMTVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJoXU1lXGZUY2qajZaKi4iSj4aJeYaTkIFygHuMf3eHgoGPeY2hlqiam5i6vsnIysLSycvCzb3Bs628v6e6wL28xLiswamts7y+qrGqpKWjrK60rre1oJ+un6aimKO0vKmcqLzBo7a2r6uTsKyqrJeGmqqnpZCCjJKklYmAdYmReYSMkZCdn5GOkoqOi5Oil5aalJOhnqmekKSZi4+Pj5WWiHyOlZKRopqUoKKctqaQn5ekpKOln56mmJ6Vl5ulo6ioorKsqLvAxK+ls7fMwLquw7O7vcG5rMLCwb+acXxkW1peXUxNTktHRUNIQUFBREs6NERIOjs0PDdGLjEyMzUyQTI2U0hOPEpCSlFFS0NFRTpFTEI8N0VWPTw9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bEpfWGFaZGVYno+djpaOnpKJin+Jn5KEeIV/lH5/kIiJkICWoJqup6SYw77IxMjG0s3Ozcu8wriwur20vcu7xMK2tryttL+6vK6vqKGoqLaurqmyt5qerKKoop2rt7eqpa++xLG9ubOnqrSzra2XlaWtqaCRjpKxxaeUjnyRlXyGkJiPqZiXkpKOkpSSpJySnJiToKGhm5iel4qMj4+eiFqPlpeSlqSZZpmjnrOllqOWq62rp5yfppeZlpiVoaSopp61q6m6vMK0prS1y8G4qrWss7u4rqi4ury3hHBxXVtXWFBHS1ROSz9BR0RESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmRNRqaUnJWhl6iWjJCDhqWSiIGHgpqDg5WQkJOOmqGfr76uoce+xcXIx87OztLKvru2sbu7vL/PtsS+t7m3s7K1s7i0rKecq6y5q6mosLCYo66lqKSltMCwq6y0vsK5wLmzp7i0t7KvlaStsLCli5OUoI1zwZl9lpmEjpaZi7CVmZmUkZGZmKSilJ6alZmonJqhn5iKjI+VnV9KlpyalJmkl1SWsJ+vnZ+lla+wraWboaWUk5mYjp2fpqGZtKmqs7y7u6uwssfAuKarq62xsaOhsrK0pXNyaF9dUVNNRlFRUFE7SEpIRkdBQz05S1Q/QTo9RU0vNzUzNDpCNDROV048SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVGQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTdGJWRkirl5mfoaiumJGXh4qnlo2IkoSfh4Sdl46doJqjpbXJtanHvMPEycvJyM3Nx7+7s6+6uMDCzbXIu8G5trqyr6+0taeknKu0tauqpq6smqStpqWprLq/qKu3t77BwL63srLDsLe9rKOuta26poialqWbdb6fhJmdjpKYmouulqCbmpaUmp6fqJ2mn5mZqZmgpp2Wj4yQnYJtdZKimpWcop+QrrKiq5aqqpirr6WloaWqkpKZnImVnKKelrCmqaq6tr6zsq6+ubago6eopaacnK2pqY1maWNiVE1OSElPSlVMPUxETUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYUxWSH5lXkhGrJWcoZ+7rpiUnouTqpuRkZOIqo2Hop6Mo62Uo6S2x720wbvCwsjJxcLOyMK+urKvubXAwsq2xrLBvLW7rKmtrbGjo5mqtbumqqesqp2or6ikq6q9u6isvbS3vse8trW4wLC9wLOqtbesv6aPopaQoJ+7nomaoJiWnZ2Otp6om6SimpugmaeksaCanaWcp6mcl5OOlJuKloiMpKGUnKKeoLWwpKWTsquaq62fn6WkqpKWlaCEkJ6fnJWppaGhs7S6tq2otbKynpyjpZqXlZmqoZ54ZGBhYExJR0hOUUlNRUZGQlFKSEBER0FWU0RIPEFHUTE6Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRKiXpJ6fw6ybl6SXmaiblZmajqqWlaimlaytmaKrt8XCvL+4wcLAyMS/zca8vrmysLm0v8LItsCwvLe6t6ekq6ytoaGbq6vEoqWorKaeq6+toqqovrimrb6wt7fHt7S5uL+wvsG3tbK1sL6klqOVkpqTrZ+QoaKkoqKekL2kqJ2oq5ycoJqln7yil6OeoaiqoJyUjJSdk52GjoSNk56koJ22rKacl7OnmrCooJyrn6KNmpaghY6hmpySpaWal6uxtrKqpaqtrJyYoKCSjpCWqZ+UaWZcY19RSkhLT0xHRURJQD1PSEA7RklIW1JQSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9TRjxLeGZjWE6im6ObnsWroJ6rnZytn5Ginpakn6aqq5e2saOqs7bFw73Atr/BvMnCv8rItrm1tLG0tLfCxre/sbi1urWgp6yrrJ6en6WkwaWgqq6gpKmtsKKmqL21pbG8t7a2w7Kzt7q+ssPAt7iutLW1o5yklJGToKyemKGcqKiqoprBrKidq62amp2YpZ+9oZykl6qqq6WgmI2an5KdiI1Xf5aepaGguaqnk5m3o5+zoqGcsJihj5uVnoKPoJeXjqKjlZClrrKsqaKipaSVlZyYi4+Sk6SfiWNnXGViTkpLS05GRUFHSz49SUE6OEpKTl1RUUk9TFZcOUZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQnqCgmJ7Dp6Sis6CbsaaSqaOfo56tqaudu7GprLWxyMTBw7PCw73HxL3Fyr2wsbausbWvv8W1urGxurasm6mwqqqbn6ahp8Gtm6yxnKmirrGqpKi9t6a2u72vt8Sts7TCv7LGs7q3q7W2rquipZWVk6KroJ6fmqeqrq6vu7Gln6ipmZiXkqKjt6Cho5GtrqukpZ2RoJ2UnY6QjJSdmqKfqLWnp42ZtZyjr5ufnLCRoZWZlZuAkqKWkI6goZOLpqywpaeinaCekpKak4WLko2cn4BkaF1oZktKTEtTQUNASUc7O0Y+OTlOTVVfUlNKPk9eXj1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQTdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9nckA4PEiWd2VBNJ+knpqgwqejqbGgo7SplbGrpqKksqytqbuzrbC1tMe/xMO1v8S+ysW2wcnCtay1qbC5rL/EtLivrba6ppmrsqyrmKGnmK27tJyosJusn660sqequrKnubS4srnBqrezw720xae+rq23tamorKGWlpGlo6Ghl5ekrretsbS2n56opJmTlJOjoLaipKWVrbGxpaikoJ2amZqVl6ign5minq+zoqaNmK+apayYm5+nk56QlZmbhpeglI2QnZ6Ti6mpq6GnoJqelo2PmZCChpaJlZ96ZWtebGtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUJXYF1CSlNIV0tIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWpXRFdGjHlmQzukpJygpb6lqK6uoKm1qp23r6ujqrS2sbC4t7C3uLjFvcPHvbzDwsjBusLGwrqqtqWtu63Bw7i4qq2yvKOVrrCus5emqJGquqqgprCdqqCvtLOqqra1rLuss7K6t6y5sMK6vb+mw6qwt6+pq6umnZiYqqChoJGXoLCus6qwuJmbqZ+ZlpGXpqC2qKWioq+ws6uxpqqfm5+fmp2lnaGYnaO0sJyfkZSmm6GpnJajopiajJealJaXnpSJkZuZlI6pqaefo5yZm5OHj5mLfoyXhY+bbGluYm5vWFFRWlRBQ0RVQDs6SUE3OlhQZF5RV1dFWV9eTUxTT15MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1ERkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOG19aVxWO4l7Y0M9qJ+coam8oKqvqqKwt6iks7Kroa21va+zub27vbe3wcK/ycO5xMPBwLnFvsG4sLaoq7eyvL+/tKqvsrifl6utqa6YqamOp7ufpa2zn6uisbCzrKq1s7W8rbCxtaywtbLAusW2q72vsbesraqjsaWepaieo5aPmJ+yqbKpqbKZnaebmpSMn6aktK6noqysrbCnsqqwqaKbnqejnpWhmZyotqmYmpKSn5meoaCSraGbmoiXmoyemp2Ui4+Xl5qXpqajoJ6WlpaTgJCVhHuPk4OMl2dtcmhxc19HWWZWRENNWERaOUhCNT5dUWhcT1pdR1tfXk5NU1hjSktDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxoSzWMemZMQKWZn6SstaOsqKSurbWorrO4pqewt8a3sbe/wcK2tbrFvszFucPBusC6xbjBurO0rKq6t7u6vrWrr7G3mJiorKusnK6rj6u9nauusaOpn7Gts66utbG5tqqtr7KotrC0urzJsqq1tLG0sK+nobOfmqirn6SVlZqZsaKtoKWvlqKkmZmSjKKlp7Kpoaaxq6m0pa6vs66jmJ2tp5uXnpqarLiimJORj5icoZmYla6hn5eDlZqOnp2al5GKlJOemqWjo6GZlpOSlXuMkIV7jYuDi5Nsbnlvdn1hRmBqWklIWls9e0pHRTZBY1RpW01dYUtcXVtSUlNiYUxLRWBhYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUTEWalp+wqLCprKSjrq21qLazt6Oss7fJu7W7u7++tbS3w8DMx7zDvbe/v8G4wL2yva6ourq4t8K3rK6xupaXp66tqaSyqZSvu6SssrKmp6KytLGysbWwt7Oprqyyp7ivtrTDxbaptbWrsK2qp6O2n5+nsJ+jlJuYlLGep5ufqY2pop2blZelpaS3p6Kxs6unsKetr7SspJigrKicnJ2claq5nJWOj4yYnaKYkZmopKGZhpSYkZ6cmJeXiZeQl5uonaWhkpaSkJV2hJCGe4aChI2NbnF4dnyAXExlbFxLT2RdP2J7R0k4R2hXZVxMXmJNWVpXVFhVal1PUEhhXl9QS0dRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JqTEVEkZmkraSsraqlorCxsqm3r7Wfq7S5yLmuwbzDuLOytcLDzsTAwr61vsDAu7+9tMSpqrmxtrfAvLCstLSeoaexr6ansaWdsbWsqrKwq6iotbqstbK1q7OsqquprKm5rrKxyL+4pLmwqa2tpqitsaWko66jqJydm5qumaOioqOQrJ+joJ+hqaaluKSrtLSkqquprK61rqKdo6iqnKCam5OktZqPiY6IkaOhlo+Wn6OXloeRlZWem5mXlYiYk5WZp52hoI2TkY6Qd36PhH18fYeKinJ0c39+fVxTY25eTlpnXUZElltHOk1uWGFbTWFiTlZXVldVWWheUVNNY1tbVEtGT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RlOzYqSGRISis6ST8zQ0lTLD6Pa0BISZCaqKmhqK+kpqOzs7CztLCwoKutvcy7rsK9x7K0rrTCw9HExb/Cs77Cw7y/uL3FqK23rLO5vcCxrLKtoqSnrquopbCjqrCqrqqxrq6sq7O7p7ewsaiyqqulpaOvuqyqscK5tKy5qamoramnsaWppKKtqaiinpuirJWlnZeemaydoaeooaymo62strCxoKmioKqtsKydnqenqZqkmJmQoaiYhoSPi4qfoZCNj5iekpKIiZKWoZ2WmZaHl5OTl6WdnZ2MkpCNiX9/iIR8d3+HhYZ1dHKJd2xfWV9uYlFzcVxLO4R8Rj5XdVdhWU9kXE5WVlVXUVxiX1NQTmhZWFdLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTM5ODsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDI9XkswLklnREY4PEIwNUVLWDFAlF1ATkaVlqynoKmxnKeosLWsuLWtqaSrqr3JvLG/ucOvsK2zxMPNzsO/wLPAw8S6wbTJxKyvt66zusC+tK6urKepqrGpp6ixpbOtqq+trbCusq2zu6W3s6ysrqirn6Oesberqq26tqS1taSqp6usqq2gqKamsLGjp6WhoauWqqGTm6CmnqOiqqOsop6msbasrKKlopqpqq6pnKGlpKSZoJmWkJidk4GCkImFnaCNi5COnJGTjYWPmqWbk5KbjJOSkZSjmpyai4+Li3yGgoKBenWBg4F+dXiKooZ4al1fbmZXZYdkTkBnkkxEYnpXYlhSZlVNVlZWVE9cXWFWS09pWFZWSEpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC4yLCYwN1haLjBKZ0FBPDxDKzpKT140RIdCSUlElpCupKGqr5epqK21qrWxqqSrqqm8wcC4urS8taazr8TJy9K/wbu4v7/DusK6wcSusbWytLzBvrOyr62srae3qqatr6q3rqewr66xqrWqtrantLerrKSpqpyknrSzqKiks7Sfta2hqqirqKunn6usqLi1qaqpqaKon62bkaqhnaCkoqaiqp2cprSup6WpoqOXpKanqpyipKOgmpifkY+PmY1/h4yHhJ6eiYaMjJGRk4+FiJejmo6Om5KSkI+SoJiZl42LhH90hoJ/fnh1g397eH5/h52PcHFmZnB3XGF0iGpPXZhWSG15VWRWUmNQTVZUVVFPWFtiVUlRalVXVEdPWFVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UyMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIvMjIlLzNSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JGO5WMr6CkqqyZqaOtrrK0r6mkr6mou7+8wbKwua2itq/Ix8jQwL+9urzDvrvEwr+/r7KzsrW9vMGysrSrtKmltamlrbOyuK6hrLSxr7G5q7muqq63q6qeqqugo6G2ramhn66yoLSqn6inqqKqoaGsrai9rquuraGnp5+smY+wopiioKinnqebmamwqKKfq6KhkqGioqeZmamlmJiZnY+Lh5WIfY6GhIWkl4aDhI2IkZCShoeWoZeIkZ6Sk5CNkZ2VmI+LhoZ4dIF/fHR3eYB7dXR7a4OHpHZpXmVrgHVniIx8UlZvXkt4c1RkU1FfTU1TWmdOTVdZZVlHU2pSUj9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzOPjbGgo6Wqo6OirKazsrGopLCnqri+wb2xqbqqp66wycbI0MO+v725v8C9ybzBuLGwtbK6vLm/s7S8rLmso7Smpquxtbexpaa5tKyzvK+8pa2ttautnKmvpJ+krKqonJ2qsqOzqJqrp6mkqJ2iqaepvaq0sK6dqaSgrpyas6KWpJylpJ+lmpqoqqWemqmhm5GboKSdmZaoqZGZmpKQi4KPhX6Pgn+In4+HgX+NiJORkYaDlZuUhZOijpSRi5Gbk5aHin+AcXp5fXtndnx6dXFyfmqGeYWIZF9nY3KFe21oeV1eVUFXe21UYlBSWUtMTnB0XUlaW2haRlZmUEM+Sk9EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpGwmJ6fqKShoauktrGxpKmwpq25wb23saS5rKior8PJyMzCt72/tbjBusi2wrW0srWyvbm6vbauuba/rKKzpqqqrrS2s6ibubuosL6yuqCutLapq5+tsKOcpampo52bpLCmr6Cfqqmnoambo6igrbynrrCuoaqipK6enq2mmJ+boaKcn5uZo6qimpmjo5WWlKChlpuWpayMn5KQkYyCioCAj4B7mpWNin2AjYiSkY2LhpOYkYaUpIqTkoiQmpCUgYl9eWt9dnh4Ynp6cW9xdHhqgnVrgmdjZ2Fuc45tYmpvYG9AXHlrVl5OUVJLSU1UWVZNXF5tV0VZYFBeT0hNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl4+I5GWrJiel6eioJ+no7evraKvr6isuMO7tK6gua+rqLO6x8rHv7jBva+0v7fEtsOyr7qxssC2u723qrm4vqqktKaoqa+tuK+nl7i8o62+tLSgrbi1p6ansLOfnqWmqKClmJ6sp6ieoKqvp6Cml6Kon7C4n6Sxr6CroayknKanqJqbm56jlZybmp2pppabnqiRmJKZnZOZlqGqkZqKjZCHfYd+go58fKGNjYl6hI2GjI+NhoqTmo6IlKCKkZWCjJeNkn2FfHNwfXFzc194d2lucXFwa4BzZHpsZ2VjYWaGgGBbcmpyTU2AaVhaTVFMS0hQU1BHTFtgb1RGWVpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1cNSiVm6WYm5Wsn52ho6C2q7CjtLOpqbnFt7OuobitrayvtcXHwLe/wbmwtb23v7u+sKy+sLO/srzCuKq7urinp7Snp6qvq7KvpJe7taSrurWvnrG5r6mlp6+xm6GkoKSjoJabr6ahnqKor6GgoZKkpKG3sKGmsaufq6OumJ2qpaifmJqdpJOZm5qdpamZm5uklZSXlZyOk5eiqaKRioqQhnqEfoSLeY+Xio2He4OJhYqOj4aQk5iMjpWZi5CXfoaXjJB6gXtwcndub3Ned3ZkbGxsa2qFbmZyaWplaF1kc4FgW2t2aVpKf15bWE9PS0hIU1ZHMzleX2xQRVlWWWZNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFRdaEQuPDJkVywxlKGhlpSbqpujoaKhtqqtoLu3pay9xbSwr6O1r6ysr7TDw7yzvrq2sLO5uLq3uq+twLOzuK+/wLesvbq1paKyqaepsamrsJ+Zv7Skp7S1qJ6yvKmopamvq5mip5yjpZSXoLKkmZ6kqamcop+SpKCkuKmlp66nnaWhqJOgqaKhoZmbnJ+RmZuWn6Gqm5qYoJSRlJeajpOTpKikkImKj4Z6hHuEhn2djYqLh3uChYiJipKGl5KSi5CVlI6OlHuDl5CLd358bHRybGtzYXd0aGhqaGdwhmhoaWRmaWlgamNqaFtme2JgU3RUXFtSTEpHSVBUQCEqaF9pTURXVV5gTEpIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp6ipJGOo6eZnJ6do7Osp6q6tqesw8G4sayjtq6nra+3v7+8ssG2sK6ytra4tratqr2zrrKwvL63r7u7saWftamlpLOmqK2cnMCqp6Wvs6qstbueqamssKWYnamdpqSRmKWsopidpKmhm6Gblp+dp7WmsKquoKCdnqGVoKagoqCam5mbkpidk6WdrKGXlp2Uk42Vl4uPmJupoJKJiouJeYV2gYKBnYeLg4l+gIaJh4aRhJeUj46PkZGRjJN7g5WPhnN+fmZ5b2pqa2Z0c2tiZ2RkdoFjZWZmZWppY2tyW19ZXWxjYU5pWFpgVkpHSUtNU1g+OV9saEhDVlRcW0lKR0ZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao6CPjKyhlpaglaSysaKyvbahscW8urKxo7esqq2puLy6uq3Asa6urravs7izqau5sa+us7W6tbC4vKumnrSpn5+voqitm6G/n7CjrrGvt661nq2vra2imZ2mqKWflZqnpZ+YpKKonZqfmpOcnqyvprqorqKhmpuemZ6kmqSdl56Ym5SYn5KolaqnmpOampKMlZmNlJSbqqeOjoqKj3uCc4GBipiFh32JioaGi4yKk4WVm5OSjo+Rl46Qf4CNjoNvgX9meW1na2lmcHJrXGdjY3SBYmZnam5sZ2pqaG5dbGxycGBUY2ljZlpJRkxNT1hRUVVhZYBVQVdTWVRGSUZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlBMS0rLjM8O0s2MC4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY6vnZiToZqpsa+euL+1oLTCu766saa3r6etpLa3t7asu66sqqu2qrO3rqaytbGuqbC1tbCztbmmqJ+1p5ydqKCnq5qnvZeso66wtbWtraCxrbCooZuco6unm5SbpqOdmqmipJaan5uQm6Sqq6m7oKekoJiamZ2hj2uilpmccIKVmaN/dZGpp56UlJ6QiZiagJaKopB5h5SNg21pf3eDcWyGi4Z+hYyHcV9kYWeEmIVrio2UknR3i4R+g5CAZ4eAZ3VoZVdcaHNuTVBpY2dyhWhfZWZubWpdYGGKj4OEZU5LRDlHVGheSkhRUFVVTEhTYXB0ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsLDA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoukmYaVsJubk6Cbqqyqo73Fr6m3wre9vK2mt7ClqqK2s7KysLmsqaastKWvtKOpt7W1qKertrKttK2yoaiesqmdoaOZpKWYq7mTpaWvs7etr6WqrqqspKGenKCmppuWoKWkm5unpp2Tnp6Xj52nqaS2sKSiop2WmJeXo4ihjpKahqCHkpygf6V/paqekpKakYiEc3iNjoWIoXaJjWmXiGZ+c3igb4iHhH6PfX+hoKCZgH2HnnOGjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxcIhZXmlbbGxbiHJuenKFZoaEWl9HTj9HX05GUlZWUVFSV1VnXU1WSVJST0ZIRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiouKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKp5eDnKudmJidnqqpp6q/w6+xury2wL6qpbewqKylsrSurrO2qqiksK2ltLKcrrW2tKanp7KwrLKnrZ2poLCnn6OimJ+hmqyzk6OlpbW9pq2nq6qsqKShoJifpqOZmKWio5icpKiWk6Kbk5Kjpaaht6SkoKOYlZOXk5yIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZzGeXixpbeXZYDAnL95hIV6koR9kJCRynKXu5zFenK1p7qQe4Btl7GrsHlobFixrm5labySvG5nem5yj9h+U2tjtrJ+gXKUc5qhqpBXT1diT1ZORlVbWFFRU41dV1tRQV1EUU5FSEk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTlXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKeTgaeqn5ecnaWssaiwwr2ytcC1tr7BqqazrKyopq6zqa61s6anpbSlp7itnLOxtaumpKexra2wpqqcpqOvoqCfnZWZnpytq5Odop+zuqOrqaKtrqWhnJqZoaefl5qnn56XnqankZymmZOdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUcK6hpH54u31soZB2sV9qtFulgGWckGFng3tngGt5a6llvnFnpot1sWp7sXh0kpRjbm2nbluEoUVoZoeWRXWcYH5nfKSnglpgjKtogJR4eWqnN0qvXFhTbGRbS09YX1xXVjtOik9XVy9JVFNKREZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MDMuMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWDMwG5CilYOtp6Weo6Sqsbestb2+sLbEsre6waaosKquqKivrqOwuq+jpK2yo6m4p56ysrCjpaGprK6rr6amnqKhr5qhm5aUlpqaq6WVmqGes7OirJyjraygnZmWn6GonJieo5+bmaGmpI+copmWoJ+qnqemoZqgoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH9rgaZ7goaIk5STd6tna7Fcq3qNhpR0iXKPh4GBiZCXeIKBi5eLg6CPhLB2d59xbGxsfItOpFhIYmKZfmNopmB5cnVTk4deUaltY3F9hoBinC5RoW9bU2toYExKW2RYXFpCPrJ7WFhBI01oRkNFQUBBMTk+ODg6ODQ7OTk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QEZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuUoJWIs6amoa+pqLOsqbu2wrC7wa24t7+prK2traWssamgrruqoKezrKOrtKOmsrKno6Kepqqxp6+npJ2fn66VnpmUlJSXnaygmZmkqLWvoqqPqqiqm52Ul6Clp5qenKKem5+ipKKVm56XmZyiqZqmmpyboqGXk5GSk52D1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46IpIOlg3qseY+dVq96iH6fa7lbuneHhH6mgpR7l3qqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiFgIl8Y6QzQp12XVBqaWNQQFhoWmRhSkhNcVBcUU9ZZlpDRT9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdIOmFQNzElm6KUmLKoqKa0qqW0qaS8t8Gwub+wtbS6srSnsK+ir7Kln621p5qnuK2ir7Gfs7SwoKSen6apsKizqKObnJ2qlZiXlZWTlaCpnJmWp62wqaOfj62iqJadlZugpaCXoaChoJqhoaebnqGelJiapqCbp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52Non6RoaZ/sXeDkdLSdlyue4V/pG+bqqZrh4V9rX2YmY57sXGSno53s2WXdISeb55nlFHIi1rCXKB5Yl+sYHVzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFQa2BsaFBWR0o5PVVSWldYSUQ/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1gTDYyMKKdkqWxraOrvK2mtKantbq8sbq+trWzubiypLSyoLCxop6rr6OXpritpLGwnLS3qaClnqGppLGnrKmjmZuZp52Vk5eXkJGhpp+Vk6WqsKailpOtoKaSk5+bo6WelZqlpqCaop+tmaGenZCUm6GdnKWVnZWZop6VmJWRmoWse3eodqONiIapb62KgqeDmJihipKbi6J/k5qJroSAgrNccrNSrn2CgqN/cth+eIZ+j52Gmpl2r4aHkZyHdrRhmmWagoKVbZJasFhLmnWYeWZgrF51d4homIhrXa93lZ6PeGw1eciusl9CVG9eZ2BFUGxgcG1WVk0uZmVpU1lQO0JFQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdCX0g6OTmgnpWgubCXtMKuqLOoqbK6t7O3vri3sbS6tKS3sp6zrJ+fqKuelKe1q6iwsaqts6ObqaCfp6G1pqWpopiclKSgk5Kbl5GUoaSakpCmra+moZWZqqCijpChmaekn5SZpaicnKSerJyhnJ+Mk5+anaGYmZuWl6Kgk5ePpp2GqX19pXihjo2CqnCti4GnhpafoYmYmIijg5KIlKt9gIudeW+xWqiCgoifenTZgHeIdKiBjpuMkqR7lI+fhHqyXp1koH6DlW2SXatbWpOAkX9oZ6pjcXyCa5iHc12rWomgjmtvZU9KQ6FcW0x0XWJnTlthX3FzX0tXN0qcmFhHRT1IR0FNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOj4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSF9DMj84op6amsGrl7TCrqutqaW0sLewtb65uLGwtbqourOfr6SdpKamnpOpr6iuqLSrqa6hmKCgpqSjuaGiq6CWmpChn5STnpmTl56fkIyMqLCwp56Xm6imoIyRo5enqqaUl6innZ6goq2koZ6hjJShmJ+gkp6XnJWdoZWWjaqcj65tcrRzqYt1iqdztHhzs4CRpKORnY6JpIeQd7hwjXuLomprtlqhhWWXl2mgoqdulHK0dJOZfrJqhZGHrWp1s2GdZqJvh5Nrl12tYE2hfIaSUnOja3h/fm+Yh3Fcr1Y8nHdmVG9uLlynT2NTa2VibVljXWFwe2NUW1I+PW5xM0NCQD9MOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1RkxeODFDOKacm568oZuywK+tq6unt6m3rrW/tLqvrre2qsC1qKmhm6WjoZyRqamntKKyp62poJecp5+kq7ido6yalZiOo6KVjJ2gm5icn5GTlKq2sKiZlZysqZeMk6WYpKyikZWqsaOfnqarsZmho4+Yopafm5aclqGTnKmclI+qmYfUkpq7c7DDgMOGftWWm7h4iJCYjJiLjKeIeqS2dX53dsKCmrJgg7p5wH12uGO1gYyHqX2VgaupcXt/dLyIp6BpnWGmjq+hfox1h6p9vm9zvHSyg3R4gYpumohxbo2kdL1ed31aYXm8a1pWXGp5XmphZmdjbXdvWVxaQ0BAdEBDRys0RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgYF9fWlBQUktFRko0SExSQEpORUZPQj1FODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivaGXssOwraqqq7Gmt6+2w6+4sK24rq3AsKujop2joZybkKijqbKktKWspJ6VmqqYpqy4nKGtmJSfj6Sekoycop2XnZmRlZKvubKslpikqKeUkJakm6OsnZCfqKufmp+oo7Sfo6WOp6GUopqcmJWjmI+vn5KUqZ6FkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahwgHORuYN9h4aNh418ioeNmHyku7m9nHR5tKN0d5d2dLB1mZ5mh2qNtXRycXi2jF5/en2JaIN5bnpji6xwdYV/WFunakVlWlRmYGNeY1FnZ3BsdUNOUU1EOltNP0ozOy8gOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlUnPjs8p56hosCllrXDtKuqqKyqqbmusMWts7Kttaazt6upoaGknqCdmZOqo6yqpbWnpp+blaCjnaukvaagqZaTm5ChmpGOoaehkpyXlJiUsbW3rpmepKSii5KRppqlqpuVp6Slm5mhqKWnpKqhkq2el6Sel5eXnZ6Pr6iTm6WhjWp9aZqld4ZyfZqOdHlkh3u9vsC6b5ODcpaIYXNrWl+bimFjiI+Va2CAlmRunndjlmyAmpWUZV5gYnCZiGlyi32GlWdrf3J0eH1/Ylt3dIFoUF1tg317i2tYa3qCc0pKb4ZwTnRMRVhdZ2FMW1dnY19PW210aXFSUURFTTtHSTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTX1Y0KVBfTCgyPVtPJz8yPqmgqKLCo5u1u7ajrKWup6e0sazIq66yqrOivbCxpZ+ip52jm5mZq6auo6S0qKSbmJSgmqWtp76nqKSUk5qVn5mSl6SpqJCekZCYnLCzv62cp56noomTkamaqKOamqqgo5mao6eso6Cso5qxm5SnoJaVnZ+dlrCkl6CnmJqQm5uhoZekoZmcmZmZj5WBZ219cXeSmJSShoy2q42GmJaOioyYloeUlYuEk5SSiY6TlJiUmJaZn6GZmpOgnI2CeqWFbWt9kH2AdYqKgXGCeHl2dYl/fIpqc4F0g3Vld313a296bV9kXXBoTVlaZmpgV1pveG1tZlVPRlI5T1lNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxcYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzoLOiwKGksrK3oKmlsqelr7Sqx6qrr6WzpMCns6Cdo6Sco5WVn6qmrKKitqufmJaVn5etqaTAnqujlJGalp2YkpShnp6ip5ORmains8Swmqudq5+PlpaonaqbnJ+rmKGanKKkr6eipqifrpiXp52ZmaCenZuvoJyhpZSWkZeTnp+UoZ2XoI6Wk4qKjY6XrpB8lpyDkoKLq6mFgJmXiYSPnoh6hJCIhpqSiIeKlo+bl42Ql52jlZiSkJyNf45nobOvhYqFdnuSin13eXpvZnmPgYCJanWBeYhzaXN/e3aDhoJqdWR6ZmBqZWNkZmtZbHtvaWpdU0xQRF5URUA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaW19iY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RcUTA1TlsxN0UzW0c1PCxAtKC5sL+srK+ysaCqp7Ksoqyyr8Svqaqisa28orObn6aioZyYl6elqaWkpbK0npSTnZmZr6WtvqCropCQnZmZlJCVoZyXqJyEnquso7TItKCqpKqWlZeapp2omp2jqpSen52gqq+qpqSso6+bn6Chl6SenJ6crqOYnqeSlpabkKKXlqecmpZlgpJ8ZX6NmpBjeY5taGt7kqWramWbmH1nhoplZWloe46ij2xojZiRo3draoqYop6Xc2tteoSOiHpYZl6Gg15tjIqBdlxoc3d2kYCIgm54gnh/c255hHR2iYeOg3xqh1lebHRkXXOJaWt8cGtjX1JOV0lkWEFKND5GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJVV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaagury6r6y0saqlqK2usKatrLC7sKimo62tsJ6rlp+jnaGZmaaqnK2jpaepsq6elKOPoq+ltbmlraKOjZmgmJOSmqCZmaWVfKauo6i0xbiloqevnpyVnqKeo5uiqKiRnqGdoaqwrKylq6Gqm6efqKCslqCbpa+jlpuolJ+cmpGilZypl519vYOIcrRyhJ2GrWh4ucS4cZSjo3qmmZlyq4J8y8DAu3GMo4iDnnyXmYmdwL2Blp2djJzBwXyCfJONmsPAfWylsm+MgW/Ken+bd5CDjoF1eYB/eXF6f4dwd4WMk3lteJRjZ2B4ZGBlgmJec2dsZGRZTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUVNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9VQUI7LziWo7nDtbCwwaqolKOvqbCuraWys66ppKWlr6qfq5iaop+cmqqmoZyroqSoo6S0pJyikqWtqrazp62hkZCZnKSSkJ+hmJugnYinraWsrsDAsaGpr6mWkp+doZmio6mjkqChnZ6tr6uuqKSkqKGmpZ2sqJGjmqisqZqcp5qqn5WWo5SfoZWbfs6UeHqkgXmVlptfro9ejqiCo6F8p5abc6uDgK9eY42qe6iHhaB0l5OIs2OCq4agjY2zaoSvdX2XiLdig61ao81ukHZ72nt/mXB9iJJ2fWV7h3Z2a3yHbn2FkJF+bYOQYHJtcGhgX3llXHFnaWRnYFJUU1ddS09ENUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqittKulsqurqqKrpq6qn6abmaWXnKKvn6CeqKeipaCfsKuanZWmrquwqqirn5SRmp+kko+epZiep6Ofrqassai/x7OoqbGulpKdnKGXn6mqnpSgn52drrCprKucqailoquSrLKWpKGqqZ2ipaSfrp+RmKWXnpmSk5CXoHGFjJd1haiGcbF9nnKsf6KfgaWQn3argn2tf5xzrX+sh4afdpmSe3yXfqqIoYuRjJ19q3uJlZCggXutV53Fe49wk8F9gZVsdXCMbWV2ZIZuYXducm+JipKPg26SkWZwdXVxYWdtZl9vaGluZ2RXVF1hWlJTQzlJSUBEPD49QEZFQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08KD0xKTNXQEYhHEc6QzEuK7DTxsays6Ccoo6ioqKsrrauqLGlqKmmraurpqGjnZiilZ+lq5+hpZ+oqKKenbCsl5qWqKeuq6imp56XlJmioZKUoK2bnaejsK2lrbWrus2xraauq5aVnJ2imJ6urJyWoJmen6mzq6urnK2rpaOsmq6xoaerraWXpKmnp6+gkZWiopiTkISkaqR1iXqpdHqycIKmipmMcYmgmoakYGFSrIV/roObdq2CqIaFn3uZl4V6ZoCjiaSYhoKjfal+gpaIrl98qVaeo5KBeqOfgHvDrsSLcq+zs7lxYqmvwnRojIyYjoFunJVxb3p4eXBsZmZlcnBmfWpjXVdgalhZVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NSoyUEtMIyBBOUQ0LCfDydbUv6GZq6egrqKer7SwrqisoqelqKqrqaSmoJuknp2lp6ejnKuZoqygo5+voZyakquktK6uoKeanZWTpqKRm6KooKCmnbGmpqmyrbfIsrWqq6mWkZ2copifpbOdmaGUnZ+nrK2lsJutq6OjqqGyraGpsrChmainrK2zoZGUoaWWmZB7qWyehId1q3l8sG+CpYyJn5aWoJWB0ri0t8mBgbJfYJSpg6WIh6B6mZWaeKrJdJmklKipkJKbjYGdiprGxnlnoYKldIGfjoJ9r11vtGKwdUujh22nR4KTZI6QnZJ8cZmVgXF7dX58blxmanNxZoFrX2FZZG5cX1lJTU1LRURBQj5BPEI/STs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqbKsrKWim7K4q6qhpZqnpKmrqqafpqaYqqOfrqudpaCsmp6ppZyntZ6il5OpqrWxrJulnKCUj6WskZqcp6OhqqeuoqWnqrC1w7GzqqyolIqXnKWaoaOupZehlZmcpqatnLGerqmnn6yjtqygsbiunZmtprCxsKKSlqahmJ6Ngp1OeJqBf596hKN9g6SFh6afnZ+UhLh7fHm5gn/MxsK2eJuhkYuefpqWl4p2n5eKpZekqX+whZ2GoISsfZqVY6ZtpHCPhZCBfJaCcqxgo3JxgJpgvH1SVXSOkqOXe36Uk4x2e3OHgHFdbW54cmqCb1tkYGlvY2RdS0xRVEFJSEZJOjlLP0IxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZZWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmKmrpKu4qq6gm6Css7KlnqCVpa2trqqnnKanm6OoobOuoqmmsqCYqaSUo7WiopWXoqm0uKOboZyiko+hsZmenKemoaKwrp2mqaO2s8WxramsqZGHkJynnKKknKWXnpmamqalq5yxoq+lppivpLutoba1rJ2cs7C2r7CklpyunqKchY/RtcO3eYeOhZGTkICmeZShd4ygkoSlgopxqoaFtW5yaZqknJWKn32YmYaHj3Ovgqabo46mi5Odi5WQm25xsl2ldJN6nGyYf3uZfG2pYaJxcX+fYnOyuGh3j5SmmH2NjpWOen15kINuanlpenNvgXVeZWVvbmZoYEpbWFg8SEdAVTRARj48Kik2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBfXVtaW1hVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVVVVFPUVtVJSEyQUgkKSWSc4yKrb6+vLm0npanpK20oaGZlKKnpq6qq5imo5+loaC2p6Oop7CjlKujjqSto52Qmpqqs7OknKScqJGUlq6fn56npJ2onbabo6uktqzEsKmrqKGMhI6coqCmopWZmZyZnJmnpqiZraivo6abrKa9rJS8r6yeoa6xt6mwpJmnr6GmlnmokH18sHeKgKSliJxtsnChh618oY+DqJWYgKyJha6FoJWqoKKXhp+BmpWAe5J+q4CdmpeLqnedoJKKlJKBeq9epIF9pqdknX98l3Jqr12ka3CGmV1gW4ygbZWRppmClY+ajnx8hJmAa26AY390boB6YGhmcW9paGdDWWFbPUtUM1U4QkJDOCQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFSU1NWWl1fYWBhYWFdXVtaV1NQT05JNzA0Mi4qLEFUVlZWVFRVVFVVVFRVVFNUVldXWFZVVVFIRklKIygovZKag6jFwrbAs56arKCtt6WjjpukoqCwr6qfpaCerZmeuaGjq6CvqZquoZCrqKSWiZqQra+spp6lm6yXmI+soaGdpaGapZ2vmaKpp7eqwa+kqaOei4CNm5qfpp6SlJmalJuapqWmm6qsraSln6movqSWwaqpoaCqsLepq6Sdsq2mqJd1r36Qi5yFh366rYqZZbCNZZWtfaGPg6eVmoGsioSwhqeapKGikYWhXWxrgbNgf617e4OBsW1nbpmZjYmxW361XKSEa8iiZJ+Ae7tXdrVZsnxSroB6rFeAoW2Xj6ibjJiSmpl8epGgf2R1f2OGeHWBfWJqZ3FuZ2ZlUFVkW0FWYD5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOT1FSVFdaXmBgYGFiXl9cW1hVUE5KRkM1NTMuL0BVWVhXWFdYWFdXV1dWV1dWV1hXV1hZWlpbXFhXV0dCO9KfsrG2vbqzwbKinKympLWooIqaoJ2cs7Opn6ShnraZobSoqqyer62eq5uVr6ehjoibjq+rqKahpZmukpiPqJmhnaWfmqSjppqho6qzqr2vpKeenI59i5uVoKCZj5Gam5KamKmgo5qprqilpqKkqLuen8Wlo6efqbKzqqyknbmrqquUgKmSo6+Om4CHpJeZkIKAuMO6g46ck4Snl5yCrIqCr4mnnJumq5F/1r3CqmKkv719fqOCg9e7uLWGlpSEnr2+hG2jgm+rhGycgHqysMeDaauwvKx3dqG+vHOAlo6mnZGckpqge4OTnnxjfntlj2d6g3xhbGZra2NRYVtTalxAVWJDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzc7PkFDRkdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbOzsL+4sbyyopytpaWypp2LmKXAqriyqKLAp6iznZ+ynbqon62vpaaVlLCrl4yDm5GupaKsoKOcqp+XiqOSpp6nm5uhqaSZoKKsrqq6raijm5aSfIiZkaWbko+RmJmPmJOpm6GZqqmhqqego6q6nqjDop+soamxsqetp564paysmXN2qqS4hmSJoHBorpGLkG5ud6SQmZ+Bda6ZlHCPi3GWqKScmK+kc21tbWaLeG9ugplwgXpqcWlnipiWmXJpaoWIZ3GGZF2IYmpvWVxmfXamX2FwjZBuZWV/jJOPoZmZmpOZoX2JkZh3Zoh4aY9seoB6ZW1kZ21jS2RYSmtaOlFmRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1dXWV1eXl1cXFxdXl1eXVtbVVdeqZWss6i5uLGzqqmhrZ6jsqqYkr+zxcq+t6qfwa2upKKorJ+6o6SurK2ljZauqY+LhZaWrJ2mqqCdpKOgkYukk6eZqZqXpKuil56npqiwu6usmpuSknyEl42ll42RkJiVjpiVqZagmamjm7GmnaKruZ+vwKajsaSrrq+oq6mltaKstpWKoammt52JlqOZiKqbkZWdkqmzmZqiqqCylqKhnZ+inaGlopWsp42Tk42Hk5yclZGZk5mRj5WFgaWbmZaPjJSUjJCHhH5niX50gnVzh4pwp2x6k4+TkYCBjY6Qj52VopeamaWEiZeQdGqRd3KMeHh9emptZWRwZVVgWUBqXEhkYlBZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVV1leYGFjXV5UUUtFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKaWqamktLWurqKwo62fn7WxkI2syL7Gu7qro6afnaefsamjtqedqbWnp5GYraKLh4mPm6eVrKSfmaifnpKUo5eomqialaeipJGcqJmitrqoqpiakI18gZWLoJSKlZGWkZCUl6aRoJupoJy2o52mq7enrsCtorWkrq2uqqensbafrLqYkaWjp7aikp6noI6qoI6Tn6OrsJqgo7CosJejoJyjqp+enp2XrJ6TmqKclJCWq5qOmZmXkJegkoihnpeVh5ONkY6Vi4F+ZYuFdYZ0d4eCc5xqhY+Sk4+JfYuVkpKYlKOUn5mkhYmbin1zl3N7jIBzfH9qb2VfcWpgW2BabmRRYWVRWjpHR0U+Mj0+OS8qJispJh0mMzE2NjY4Oj09P0FBQ0lKR0pLTE1TU1RVWmBgaWFlVlBLQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX2BhYmJhYWFgYmJiZGJcW2OXlaOmoq+xq66jqaasn6e1qpCPnaS1vbCtraOkm3yfpLKkpbGpl5u4pqOUmaqcjoaKiZyij66eopWon6CSlpmbrouplo+pmqqNmqmQn7m3pKWZnI2IeYGTjJqTipSRlJCOkpejjp+fqJ6fuKN/g6+1oq6udKK7obCedniep6+4k3Sro56Jf6t/ZFxidqCOpZ+EmH1tkrOdoqetqqNlnp+Sc3mamHGBmamYbX+iqYplnKadkpeYloyTnJGGnpuRloSTiI+QkomFd2qOhnaFcHqFf39gaIeJk5GKWnWUkGdoj49zfKicnGZ7m4qFeZlqhYyEb3qAa3FlYHdwbGtpXGZlYmJxVFs+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVlcYGhmZ1dRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5WloqCur6urqaWoraKnraSSlqu2sbOnm6uorZh0jZ+xoKirp5SXuaCgj5yknpF/iYibnoysmaKVp6GdjpeSnYV2rY+Jp5upkpilipy7tKegmZiLiXV3k42Wk4mTkZCUjZCUoY+coaeZnLGVgIybtJyyjJKNuaWffaeieaCstX+NjaWeg4uGkLCqr42Ll6SbeoGLrIWcnqGmqKeHlYWYd6WbeoicgZeng4J7nLN6ioahmJqVmJaCkZeXhJuZY3qIkIWPkJKLg21wjod5f3B/gIR9hXOFg5SRd5ZoknSgmnR9mYSjoImYf5WNhoWaa4+Oh2x5fHJxaGV5cGpsa1xlbGtmdV1eSVRMUkBFNi5bVVU3KSEwOT4+NzQzNTY4Ozo9Pj5AREk/SUVKTEdTWFtZW2JhaGZZUUg5RUw7PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop6lrKyrp6ygp7CmpqmlmZSvyL+xopeoqrefkYWerZynoqCOkL6emoyfmqCQfYaPmJeHrJyhlp+hkY2TiYWAkqeNh6OepJWZn4efurKnnZuSjoVxdpCJlZCKlI+Pm4yPkqCSmKGklp6rh5+0ibSZrYrKhqisiLaFjK+BrquCqIymmI2dfaiPc3t3nI+nl2iVpHm0jKCdpaeSmMKBf6uImKFynoCapX6XhZWzgaF9oZOhkJiXgY+UnIuZkox9hZOHjZaSiYNtc4+FfnlxhoCDe4N0hICVgI/FZn+ph4+ja56FpJ2EmoGOkImMmnGPlIZpeXZ8eGhpdnJoaGxeZHBtZ25ZZ0ddUk0zRTU3TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05KSkxDUFpdXFdhXmlsXFFFPUtNQEljWF1jZmhnYmJiYmRjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqGer6anqKWrn6S3sKmrppqUoKOkrKWYpqy5pLCBoqmdpp6diZS8mZONoZGej3qEl5aRh6uZm5yaooSPjHeanI+fkIifpZyXmpmHo7mtpJqcjIx+Ym2PipOQjZCMjZiMkJKgj5WhoZmgp36hp4etnZ+WrY+cm5yQhH+gjKishaONqZmMmn+idYGZlGuCrXZNq3iHjZyRmqemgKmrfYOhe3qnap5/kmxnmIaYt4mefm5gZFmDl4CNfGRoi3KZfXmWbF19l21fUnCDXF9reIJfWGSAfIN/lnCnqmuDo25ypXCfhaBqZ6BtXHCOfmdaYISBY1hRcHdmbnVza2pwXmtxbmxqWWlPXVlGOUE1SEVfbDUsSURSTU49ODQ4NTk7NkA7Oz5CUD5RUkxNQkpcXV9XXV5idWBNRDpNT05UYVxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5Wcn7ifqaOmrJGhtbuqrqKZmKGipa2voZ6wtqSpk6KhoKecmo6ZtJmQi5+MlYt1gpSSjIqmlZWYnp9+k4WFrKSHm5CLmquZm5uSiKaxp6GVmoiJgGluiIeLjo6Ji42SjJCTo42Un5+coaR/k4GPoqCTn3aclI6ngZ+lfoWnqoKleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5qomY6HnXuConN2pmaefnekX5h6fZR0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNjc6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGGdmbSXc32Yn7N1dFyesoNrY3B1d3JpcFlsbXNzZ11qXmJMRT1ENlJCWnMzPVNHYEpSPTwzOTU6OjZEOztASlA/VU1PUUBFX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGRgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOWlKK3mKqbk5+NpLe0rK2gmqKdpKOmr52cs6+tlJmimqGlmZqVn6ubi4iSeIuFcYCWjYmQoY+TlJ2YfZGKjaihh5eOiZOklZybjYypqKWej5eHhH5qe4d+fZCNgouQkImQlKGDl56gnZ+ei4l3nJihjJ9xoYqGqYeapI2Upah8rYx+eqCZeqOTeIF0loiNnH2Wn4abjpiapYWiZKF8iJaQm41tnmibjm+amXuAi6d9cml0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhwgZxglYxep3Z1h4h+nWeadYaTkpeOgJ9vmpFup5peqX95u2t+qlyOhF20aF1ucnp4bGpccWt5emRhZ1hiQlJGTzdXRFJvNUtbW19OWkRBMjUxPDs3SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5cXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4ips5qmiGOUm6u6sa+snqacnKmgn6+cnrKprp+YpJuhoJmXlqCjmYaJjWmIgHJ7l4iLlpaEkZWYkHqLhJWknIqUj4aNn5OenYmRqaOgmoySioCAaYGGeH+WjHqJjo6IkJebf5Sinp+gk5hyaJ+Jno6LcJKMgKmGmJ2gpJ6le7Cto6K4l3ejs6OkgImUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mbWjpKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJpcXuObICIg5l1m3iGibGzf4Cbk6d3g55udH6VcJp0a6RelXZIZWRhdHJ+f29mYWxpd3xlZWJRX1ddVVdAWkZRaEVUV11iWF5JRD1COEBBOklGOExFWEFXUltXREZiXFpgS2BtfXJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lY3ZsXWVnZmtkZWxpaWtpk5yAr6yYg1NeoKazubGyqJqijJysnJyqlaKtpaOpkJ+enpualpihnZaIh4l3hoFveZWFkZuLfJGTl4hygYmRoZtzkZCBiZqWoZuFj6qcm5WLi4p8g2yEhXGBoYt4ho2Ih5OZlnyTpKCeooithn21hI2dnHullXmpgJSajoiemnunaHdtfpl0oXNyfJ6GmXCTg659o4OlnZiAo29eqGd1omNvpWGc05B9e5l4c3RiooaQfqN0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2cbXtwlm1/cqJxXaRnc6ZgaKZtm9SafoabcHt7mGycfHiYc26ppGdhZXpygIVsaGZkb3Z4aGFjU1xmUVJiSFhKVWFYVFxma1xlUUZDS01KS0JLRThPQFFOWFNZT1NRYGZmalJkd3l3SUZFY15mWmhqVGloam9jamdgY19dXV1faGJhaWV8ZF5kZ2RrZGpsZmhsaJeaf6+rVFtKfqmvsbOvsqObmYWZqqCipY+mqaGaq4ubmZmUmZOToZiOiIV7cH2EaH2Pg5WbgXeRjo+Kb3+Gj5OSbJeUfIqTlKWXg4+rm5SSi4aJeYN2iIBtgZ+Gd4CThoiZo5h7lKKjmZ+Js6Gitot5rKekrqVvqH+ZjYWAmY96pH+hmYaYcp6EpK6vipeMgI2kjZWCraCTdrW2tcmhc5SLgZ9gnpepbXqVh6GcdaKId6B+kpeLgXBNZqOScJqHc6V7eXRhg4FrfaBrcWRfnHF9c5ZoemmztbPGpnKYfXqda5ybq3aFm253eZhqmnx2mHNRRX2zX2p3bHqIZ2toY3V2cW9XX1RZaVBTaUpXTVlUVl5pbG9WaFdNS0FKTUtISk9CUUtQZWNqbWV0cnN/eXxudYl7e1RRT2xeaVxraVJqaGlsZ2xmY2VfXV1dXmliZGlre19dZGhjamZvbWVpbGWgm4eupYNkP5OhsqqurrSiopCAmKqio6aNpqifnqeEm5iXjpeQkJyTjoiDemp5h2WDjX+YoHl1jomMgWmEhZGDjIWdjXqNjJemlISYqpiMkYuBiXqAfYt4cJChhnmClYeJlqCWf5Slp5uVlYNmbnicbKJke3Cld5uXcGWmgJSJeqR5n5aDl3Oed4GKlZePuW6RiqJifZiglIhtcmmqa3WgbW+mYJtpi5BploeblnWigX6aYIyGjXVwiGJooGWefmmbdW9jZoiBbXGiWV5aYqFsXYiLbXp9c3FkpW14omRnp2iZc4yZcKJwVYmQcKBgZqhVi15UmG5udGxzg25xaWt5dGtwUllXV2ZaVG1KWlBdSVhpaXNqWWxXUVJGVlxMWFNiVWlrX3h0e31wfHxyg3uAc3aNgIR2XlJyYmdjcGdQamhobGxuaGRnX11eXWBqYmppdnRdXGNoY2pqc2xma21jnKOXpXlkc2yKpq2jqbCxpp+LgJisnp+njaOinKSjgZaZlI6akIyYkI6Ke4dxgIhoi4t8mJtzdIl+kHtlg4aUioqWmoJ8iYiYqJKBo62RhpCLgol+gICOcmmPpoR9h5ONiZigj4iTqaWciKZ4lZt+pYiWirGXnY+CrpaepHWThXipc6WPhJpupKKMkoSNg7tufaWvg4aFhpKVnJ98pXpyqJWglmeefm+sZJaKlpN3qG2qooGJdomDd6uRpohrkbBrdrOMqWuKhW1tn56RlF99q4uqdn1+iqSddp98g6SVnaBqm4h4rGifro22dXi+jaSTWoOnjqthdXN1cnx1cWNrf29obVRXW1ZhYl1sTV1SXkpebW93YFtxWVtgW2d0ZW5vcmJydGB4en55cnmDc4R+gXt7jIGDgHZieGRjbnJkUmtnaG9scmpmaWFfXlxha2JtbHtvXFxiaWJsandtZ2xuYpWkqZuAf52jlqmpnaimraSZioKYrJufpoqcpp6rnoWNm5CHnJGGko2MjXSHe4iEcI2FfpiTdHSGcpGDbn+LkYeGlI99fIOHmaePgKenj4GOiYWUdoKHkm5si6mAg4yUjomdn4mNk6min45/dJOXiH6BeJOuon6BmnCPhXaOiYJ9e3KnjHF+fXqYlpuEkHl7f36HlJWTinaQmJ6gg3t+iWuMhVt5eXJ6cWlufpKKcoB1gY+Uk3GHhINljH9fgYCLd3VzlHVveW5th2yDhl51Z3eOZX+AhY2omn10e5VqiYhwgXZ9h3dubmiNdHp8mHiFXGxYeY9pb3hzcnB4eHBdbIdvamhXW2BXXWdrZFdjVV9SYHB5eW1rd2Zra2t3fXJydXNhb3ZidHuCeHV6gnWAgICBeYuFg317bn9sZHluXlZuZ2h1a3hqaWllXGBaY2llbHF1blpbYmxkbGx5bmhrb2GOk7anpoqgoZqmo5ilnKuioYSEmK2SnqKKm6ibqpiDgpyMf5eUh46KiY1yg3yPfX6PhHuYj3RzhHGVhXt8kYuGhpCFeX6AiZulj3yooYuFj5CFlYKGjph2coSpho6SnZCJn56IjJumnp+qg4iNlZp+foiWrKeOkaWPd26bjoF4kG59qIVxfpVxa3B9gqCNgJOOi2hsXIKLi5uano5zlYuIcXRrgnd0gVlyboeRgn5/jGpdamV7hoSKgGBpeXube4KLgnWBhYFnd4qGamBvcYB1XnGJgImOpZOEZYuNg253i4Rxho96cWhpZn2Fe5ZbXWtobnZcfHp4dm90c4NoXW6LbGxjWlpfWlltclxgYlpfXmZ0f3x2cHVka2trfH1zfHl1ZG51aG18fnZ6fXt5eoCBfm+FiYR7fXR+eXN/aVRccWlsdnB1Z2tnZF1hWGpoa2txcm5XW2VubGdzeW9oamxgi4qor6CPoqCZnp2Xnpioo6J+g5mujqCViJ2jkaaVgHyZhn2SmYqJh4eLc36BjHaFi4KEl4pyb4BymIaEfpGDg4aKgXuBhY2coZGDqKKIeI6XiJSKi5yXhIN5rIKRmJqVip6diIihqZ6hoaOKh5ObnKKZlamgpqSekZqFk4t6do2Ng6d+f5KQk5SdsqablZ+QjbGSl4OljIyVmp+JkZuCiJGKa3yOd3hlg4eRi3yJnoSHjJCJiYGFhZB3fHp0mqCJhoqdiYSTfn2KgH90bnOEgX12hYaJjqSPgoSMhoKMkIx9h4uKkYR6boSGfnqZa3NpYXSLcX57eHdweHWCXV5vh2lvYF9aXV1TaXJWZV1dYm1odnx9dG9wZWtqaYB9bnmAcmpwcW1ngXtzgoF3f35/hXptgoyGfHp4e316hHlOZHZqc25wemVrZWNiYFt0ZXBmcnFtVl5sdG1oeXpxZ2lrZYyHnLielqGgl5SYmZSYpKCefH+arI+fjoahnYyeln55lYR8jpqKh4SEh255gYFzgYh+iZSEbWt+epeHhIOPfoCGhIZ9iIWPnJ+UiKyghHKKkIaSkYudkX2NeqmEjpOYl4+cloeGm6SeoZmchYKSmpmYj5imn6Scm4+Vfo6HdHqGjYOle32PkJGGmKuhnpSdkI6pjZCAnYyIk5mego+XfoaOg3B4hnJ1YH+EkIZ1jZmBg4+Dh4V/hoWVbnl2dJKiioyFmoSDjHN/iXx8cXF6hoJ6doiNg5GkjoSCjoCDiomKd4aJi41+cm2Agn1vaWxuaF56gGh+fXd2d3Z7eF1gcX5udWFkW11fUmduVWZcXmJraXd7f3JsbWRramiBf2x0gmxsdXB6cIZ5boeBdoKAfYV2cYKNiH57fHx/e4KKYGh7anVoaYJkamNgaVxkdWhvYnVtbFVjcXllcHp7c2VqbW2LiJ61maCin5KRlZiKmp+fn3t4n6eRnIuHppWMmJl6e42GfYmSg42DgoNufIB5c4CFfouSfWtofYKXiYGIjXx9hoSHfY+DkZ2dk4qpnYFwi4uMkoafoYqFjHynkYiQk5iUlpN4jKKen52VmH6AkJqYkouZoqCjmJWQmXyLgnd/go6GoH9+jI2PfJikoqKTmpGQpoyOgZqQiZKWm36Tkn6HjoF1dIJxd2F+gY6GcouXfYmMcoyAg4WGj2l4cniMmJGPf5Z+h4lygYZ7e293eomDeXiOi4KUo5KKhI96hoaHhHaChImJfWhzfoF6fHJtbGhffnNpfXZ2dH10gGtfYHR3cXhlZFlfX1JraVZmWmBhaWp3eoJyZ2xkbGhmgIFrbn5ob3Fsf3mHe2yMgXOAgX6CdHaCjYZ/fHt/gX1/j2lyg250aWGHaGxiX3FWdG9sbmB4aG1XanR2Y3V6e3Jiam96iYyesJGkpJyOj5ePhpygm558d6WhjpiAjaOKiZqWeXyGiH+Din+Jg4F/coB7dHaChX6LkXhnY32Gl4qCiot4fYCOhHmXg5aZmI6XoZt/cIuCkZOFpZuHjImDppWFk4yXmJKSd5Gcn6CXk5Z5fo6Xl42WmpyjnJeRk5l3jYOBdoOVjZ1+gomNjHOXo5+ilJmPj6GMioKWl4OSlZl+mI18iI2BdnF+bntkgX2LhXGHk4CRgmyIg4KAiYVmdm97hZGYi3ySeIuHe3+Ge3pwfXeIhHiCjoeKl5+UgYKLdoiDg4J3fIOKh3hhenp/dX94aG1mYn9qa3h0dHd+cn1jZGFzbnVzbmFaYV5bbWVTZFlhYWlsdnqHcmNrY21maH2CbGl1aG5waoB9gnpukIZygIODf3R8g4yBf356goN+fJBtdolzdW1limxqYmJ1VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm6yWpqeejYyXh4afk5eZfniqnYuZepidjIyZkHl8gYx+fYR8gYOBeHR6enR9gISAiYuAZF99i5SHf4SGdH1+i4B+mYaXlZiOpaKYgHOHe5ORiaaPjI6KkqCRhJKQlZeRi4GPl56akY+Qcn+NkZOInJyepZeWi5OVcYuLiWuEl4+ZeoiIj4lvl56bpJSVi4yei4WBkZx/kpKVhpmIe4qKgXpxemx1bHx/jH5uhpODlXdwg4R+f4uAZXJqe3+Wl4N+jXSPh4J4hnx0dn58hH97gYqCi5Khj3iDgXSJh32AdHWCiYVxYnx2e3J+cGJwZGV8Y29wd3N5eHR1YndgcGx2bnBdXGBeXmteUV5ZY2FpbnR8imxgamVrY2h3h25nbWlrbWmCfXt4b5CIdIGEhH10gYaJe4N9eoGEfX2OcnmLeHhtbIdqaF9pcmOHZ3FvZXdnbmxhemlqfXt4cGF4bYuAmJipn6OonYmKkoaKnYuVmX54r5mNl36flJGXlIh3fnyKfXyAd3iAgHB1dHxwhn2BgYp/fGFcfo+RhoCDgnJ6gIh7kJOKk5OdlKadlYJ9gX2NipGjiY6KjZiajYaSmZSVjomIjJGbko6MjG2EkI+RiJ6ZoqCWlIiVj2yGl4JlhJiOk3qJhJCKcJablaOTkomLmYyBf5CefZKOkoyZjnuKhYd0c3ZscW52fYt0b4eRj5NxdYF8goOIfGZxbXl8mZN8g4h0kImAc4d4bX58f4R7g4qGgYuUpot6hnt+ioR3fnFwgYaEZml6dXZxfGNfcWFrdF9xa3t6em1zcWZ6Xm9tc21zWFtfYGJsW1BYWWVjaHJygIhnXWppZ2JncY1vZGpoZWlpgXp3dnCOhXSBgoN8dYKIhXiFfHiEhXp/iXd+i3t7c3iDamtfcGh0gGtyb21yZ29sZXxjboB6dnFsd3eKfqKXoaegppuGi4uBj5yHk512gquVk46HoY2WlJCAdHx3hXh5f3Nze4Zsc3B7bot2gIGHb3BbWX6RjYeAf392dYGBgaGHkouUnpmilZh5in+BjIicnYqPhpKYloWJlZqQl4yLjI2Lm4mNj4JtiYuQkImclqGbl5SEloZogqGBZYSbiZB+i4OLgXeTmZOfk5GJiJSMfn2Ol3uRjI+OmpJ8ioCCb3ZwbG1vcXyGanSEj5mLcXeAdYKJgnlnc251gJmOe4eEeZOQeXWHcm6HeoSKeImEgIaNmqGGe4N1gYp/eHhua4GEg190dXRycnlbX3FhcGtfcGt+fHFubmtud2FwcGtybVlZYmFib1hRVFtmZ2N1cIWDY11rbWRiZmuSbmBnZ19oa4F1cnNxi4B1f4OBeXaAi4B4hX94iIZ3g4V8hot/e3eKf2pxY3xjhnxucW10amhvbHZ4YHF/eXx0dXSAg36klZmsnqeWhI2Ef5eUg5CgdoyglJOGi5uNlo6LenJ4dYJwcoV0cneJbHBudm2IdoN+gG1tVVGBqpSGg3d+d3KDeoOig5SClpSZnZObeZF7g4ySo5mTjomUmZKEh5eajJSLiY6OhpyDj4l7couFio6HnJqfmpWTfpJ8ZoOahWaFn4eRhJGCiXGDkJeQnI+QjYuPjHd6kZB6jouMkpaMfIh8gGt2a29rbG17f2F6fpCXgnd6gniDjHx6aHRsc4aVi32HhXuSj3F5g291i3mIi3iHfH+Jjp2bg3t6doKKfHdwamyChHxheXFvbXN0Vl9wYnJiYG1venJpcGZndXVpcmxid2VdV2ZhYHNUUU9dZ2VeeXCJfWBcaXJiYmZmkWpfaGVbZ3B+cGxxdIp9dn2FgHV1fox5e4WBeIiDc4aFf4yMhHx6lHhmcWuDYIh9b29remBqbnR/dV90fXmHeHRzhX14oI+ZsJyljoKLf4OaiICNn4CMmpSPhYiYjo+PhHd0d3SAcXCFdHByhHBsandug259fW10clJNgt/IktaSe3B1hHaFoYSUeJeSmZ2RmnyUc4WPnqGTk5CKk5yUhn+XloiNjYeRjIebfo2Ad3qMfomMiZybnJqUkniMdGWGkIVrh6KEkYiXg4ZjjJGZj5aLl4yNiopxepOIe46IipORiXmFfH9tfGVyb2tse3pcgXqQkIF7fYCAho56emlzanOKj4mBhYR8lIpsfn5tf4p9ioV7g3h/jZOZmIp8dXeDj3hzbWdwgIVua3VwaWt1blRfcGVwWmBtc3lobGtjZ3lzcHFkYHhhYFZsX193UU5MYmdjXXpxinZdXGV2YWJmZY5kYWdiWWlzc25rcneMfXR6hoJ1dn2Lc3+Gf3uJfnKJiIKQioh8fph2ZXNufGWIfm9wbIBZbG55eXNgdnp7jXZyd4p3eZ6Lmq6an5CChXeIlX59i56IhqCSj4WMmISTj4eBdXhweXFvhHBtb39zZWV5cX1teX1qZ2tjpJrB3K7woHJsdoV3hqSGk2+YkpahlZyCknGGiqKXiY2VipCdloOBlpCFiY+AkImIlX2GenR/iXeHhI2cmpiYjY51iXVshIeJfImihJGJnISFXouTmIuQiY6LioSIbHuVgX2IhYmRj4Z2hX1+a31keHZqbnlzWIl7koiGen+BgYaMf3pmcml/iY2JgoF/ipWEa4F1bYePgY6CfYF4fY6UkZePdHJ3h4x1c3FndXqEY3VucWNrd2hSYXJobFZgb3V6YXJkYGl/cXNvW2RyYWJXbltdeU5NTWVnYl53c4puXF1keV5gZWWFYGNjX1lqc2tua3N4jH50d4SBeHd7iXGDhH1+iXp0i4mIlYaMf36Xc2h1cXlsjHtudHGBV3F6dnlyZHd5hoxpdoCJcn+chpinm6OShH1xjJR4eYyehYahjY98lY2AmoiEe3N4cHNqcIJsam19dV9heHd7cXV7Z2BkfOvatcnD3IdybHSCd4ucio9rmpGQnpaUgYlxhIifjYSLlYqMmJR8jZOIg4iQe4+LhY6Af3V4g4RyiIGTm5aUl4WLdYZ9boOAh4aXoYKTjJ6DiWGDlI+HioaKjYeBh2l8k399g4SJjo2CcYZ+f3F3aHZzanV3bFqNfJKDhn6BhIGFioJ2YXJrh4GOiYF+fpGQfW6Ba3eEjoSQgXqAe32PkY6UiG1weYyFdGtwa3J5gmF1anBdbHdhUmVzaWZTYHF3dWFwYF1ohHJ0a1hoaWNpWW5XXHZNS01mZ15ic3SGa1xcZXleXmRne2FkX11Za29lbmp0eIp+c3SBfnt2eohzhYN8f4h2doqGj5iBjIJ7k3Vsd3Z5eJN0bnh7fVh5hnF/b2d4d5KCZHaGhXCJloWZoZqiiod0b5KMcXePnX6LmomKfaB/hJqAgXhydG5vZHJ/aWZteHhcYHl7e3FxgGphZ2F/1baPkaZ3bnF4fXGUko6Ia5uQip2TjId7aIeKmYaBkpGGh5iOfI2NgYGJjXuPjH2IhHpzeoN6cIeAlZmOk5OAh3SChHSBfoiRm52GlY+ffohigJOHhYiFi41/f4JnfJCAfn+CjI+Qfm2DfIN1bG13dXR3dmxjjoKPgIZ/fYaAhYl/cF9xb4R7jouBfH6QiHpwg2V5gYiFioB6hHx9kY2PkYJtbnmLfnVtbmtre39kaWxrWm53WlNqc2liUWNzeG1jZl5aa4RudGJcaF9lbWBvVVxwT0lPZ2ZcaG9ygG1aXGNzYFxjbHdlZV1dWmxtY21qdHeGgHJwf3x9dHiGeIWCfYCIdXiJgZOVfIiGdoiAb3h5e4OTb257gXdeg390gW1penSUc2dziHxxkZCDmp+boIaIdnaUf213lJh/iJGEio6afYyad312cW9samF1fWdianV6WmB4fHpscH9lY2dnV52PX3Jzlr3FhXdylYuRgHSZjYeelI2Jc2qIjpWAe5SMgYSbjHyKhn18iIx+k4d0h4V2dn2BcXWGgZ6UhpSOgoJxfoZzgnqIlpuWhpONnYCIZn6Tg4GGhIqJcoJ+Z32Le3l/f4eLj31pgH2EdmZweXhzeHRsa4+Gi4KLgHmDgYSEgGtecHZ6fYuHhHuAjn9+coBod4GFiYSBd4J6fpWKjot8bWt6iXx2dG9oaH53ZV1yZFlxdFRUb3NpYk5odXlnYV5dWXCBcHRaZWNea25hcVBabFNEVGhiWmxvbnxwWltebWNaY293ZGdcXWBramNsanN3goNxb357f3R1g3qDgnyChnZ+iYGWkXiDinSBh3J5eX6NkG9ve4FxaoJ5en5ubXx2lWtqeIR0a5OMhZ6YoJmFiG9+jHZqeZmPgIKLgpaYinmPlm95c3FsamRgdHtpYGZye1thcn16ZnB6YWVkjrGyd0tiWqXb0phzfJKNkXl/l4yFmpKNh29shZKRenmThoCEmYp8h4B5eImKg5V/bomGcXN9e2p5hoOlkISSjIJ+bn2BdIF3hJmXkoqTj5SFiHB7k4R+hIOJg26BeGiAhXhyf3+Diod8ZXx+hHZjcXOAaXpxb3aajYaEi313eYGFe4NrXG98cn+Hg4h8hId6iHGAbW+ChYyCgnGDd36WioyDd21sfYR+dnplaGp+cmFaeFtac25PWHJ0Z2BLbnd1Yl5cW1l1fnRvWGdeZmtxX29PWGlTP1pnX1txa2d6clxbWWxlWWRxeV9oXV5lbGhma2lxd3+Hb2x/foF1cIJ6gIF/g4B2gYWIl4pxgo1xe4V8enmElIx1a3p/bHB+dX99b3J8e5Nwb4F/eGaRioKhmZ2Sg4Znh4RwZ3qXin+AhYKaioF8jY1peHJsbGZfYW96bl9jcHlcZGyDemBwdl9kZdXrvoszOj6Mj4BzeoaKkI53hZmOf5SOjX9ubYWMi3V8j3+FgpWJfIN4bnaGhIKVdm2HhGt1e3VleYOEp4yDjouCfG1+cnSCeIOaj4qPkZKNjId/e5KIeYCFjoNsgHJpgH94bXx8gYqDeGJ5hIJyZHFpf252cnWCnYyBgIZ/c3Z+gXOBcFtrfHN4iIGKe4Z/fIh4eXBqhoKOgohwgHd9k4mKfXNtanaAgHV1XGlpeXFZV35UW3JmTVtzcmZcSnJ5cF1cW1pddoB2alpiW2hmb2NqTlhnUj5fZl1edmZgdXFbWVVvZFplcXlbaF5gZm1oamtocHh+jm1qgYR/eW6Be32Bf4J6dYGBjJOFcICLbnh9gHt7iJOJgGl7fmp0fHKGe3N2fn+MeniEfnxri4yDm56XjIKBbY1+bGl/j458foCDlIJ/fYqIa3VxZ2ljW2Nnc29gYmx0YWhwiXphc3NeYmOboJBuXTZbsLZ1a4GKfpSHd4iZh3WQjIp3cG2FgoZ0eYl4iX2TiHp/c2d1iH18lm5vhX1odnluZXqJhaSHgIaMiX1tfXR9f3uKl4aAk5CYiYuFinyQinF8foZ8aX5ta4B7eWp6d4KHgXJgd4J+cmRyZ3aDbnV8hpWSgn6DgHB3enx1f21XbX11c4mAhXaGdIKJendybId/jn+DcX17fJCHh3ltbWhsgoF0blxoZnVyUlx9T11yXU9cc3BkVkt0eWtYWlpaYXKBdmJeXWFnZGlqZk9aaU5BYmVcYXdhXHVuWFhTdWJbZW9zWGpfYmhrZ21saXB3fJNsaYSKfXxwf357gX+Ce3eAgImMhHJ7h29yd4N/e4mNj4RqfntueHl2ind9eICCh4CDfn56bYSMiJijjYWEe3aLeWtthYmSeX58gpKAgH6KhHBycGNmXllnX3BwYGBocWZqb4l0YXNvW2BkanZ7f7+dqKXKuXKGhXSVfnqJlYR0ko6HcnNwg3qCc3WGdIh3lIl5eXFjdoV5f5JocYN1ZnZ1Y2p8hIiegn9+jo18cX1ygnd+kI6CdpWNlJCIgoh7iYpseXqAdWh7aWx/eXNpenaAg31oYHeHfWtqdGh7gWp2gY2SlX98f39yfHd8dH9iVXV7cXKHgoF7gXCGind4b26CgYt9fHd8enOMhIB1Z3BnbIiBcW9daGN0b0xmd01fb1ZUWnRuY1FQdXliUlhYXWJyg3RdYlxpZWVja2RSXHFJRGViXGRxXl14aFZXVnheXGZuaVdsXmFqZ2Vvbmhwd3qTbmmIjHl9c3t+eYKBgn12fYOIhoNwdoNzbneCgn6Ii5R/cYB8eHp6gYt1g3h/gYGChHqAdW59iYubnoh+hnt3h3xodYaNkXp/gHyJhoR2kIBnb25gZVxYZlluc2FhYXFsbGiJbmBzaVleY22Ad6naqciHiLNzi3pxj3Z9iZGBe5SLgHV0dX12f29wf22FdJSGeHVsYHmAeIeNZXGCbmd1bVttfYGQk4CAeJKRfHd6bIVzfo+Kg3KVipGPiIaGe3+GbXV3f21od2VtfHZta3d3f398YWJ4hnpodXZjfnxodYePjpZ9doF2coB6fW2AWlVxfG9zgYV9f3driIZzeGpzf4KCfHl7d3pxiX97cmZzZG2Lg2xzWmpgdmZJb29NXGNYV1Z5bmJQU3V3WVFWWF5hc4VwXWFjbWVjXm9jVV5zR0NnYF5naV1afGNSVl12W1tnbGJXa2BhbmZmbHBocHZ4j3Rrjo12f3Z4fXeBhIF7dH2DiIiDb3F/dXF1foWBiI2Le3d/eIR8fYWHeIh8fYF9hIB7fnJ1eIuOn4yJe4p3dYN6Xn6Hmo15h4R0hoeFd4l7Ym5tXGJbW2FWanRkYVxob3Bnh3FhcGZXXGNrf3zKzoe6omtub4xucoVzfoaMf3uThXp5dHl0dHpqbHZjhHaSgnZwZ158gHiKh2RxgGpqcWNYbXuGnIiCgXKXk3Z9em2Gb3+IioZwlo6QiIaMhHt5f3JycH5naHJjbnhxamxyeH18eV1leYB4aXV5Z4J3aHWIjI+WfnOIanB+gHhufV1Xb3xsc36IeoBubol/cHZmdn5/foB1em95coV6eHFlcWBtjIFrcldrX3ldSXBsTlhWX1VWfGtiT1R2c1JSVFdeY3aGal5ha2tmY1pvYlljcUhBaV1hZ19cVnxeT1ZmcVpbamhdWGhhX3JmamhxZ3Fzdod5bpWKdX97eH55g4iAdXN/hYWOg3Bve3h3dXqGhYaMhnp8f3WLf32Gg4SHf35+fYZ/fHh2eXaRlJ9+jX2LbnWAemSEiJiGc5KKb4WFgnqDdWRuallfW11dVGhzZmFZZHJyZ4FyYWtkV1pfaX94vq57oLduY3WIaXV9c3uFiHt+jYB3eHN3bnp2ZWpvYId1joFzamJefXZ4ioJlcH1na2taVm94i6OBhX5wmZJxf3ZzgGx+gI+GcZSIjYiFiYV9eXVzcGl6YWptYW12amdra3l3endaZn19eGVyfm6FdGZ2ho2Gl4BxjGhse4J0bXViW216anN6iXqAZXSHfW1wZ3R9dn1+cHpqeXl/eHZvZGtgbYl9bG1VamB4VkxsbVBTUGlOWXxoYk9VdmxNUVRVX2d3hGdeYXFpZ2FXaV1dbGpKRWtbY2VXWVZ6Wk5Xb2tZXWxlXFplY151ZmxlcWdzcHSBeHCZhXZ/f3h/fIaHfXZzgod/lYNuc3l7e3NzhYaIiYR5gX12j399hYmOhIGDen6Lg3t3fHZ2mZ2YeoqDh2l2fn1thYWVgXKPgnGGgn6CgHBmbGdYXVtcW1NlcWVfWGNzdWl2cGRlYldbW2h/cG9ygHOKZWZ6gGt2d3R1hYZ4goV6d3R2bmp6cGFoa2eGdI2EbmZeXntueYh8Z2x3ZmpkVldzcI6mfIR7dpaQc3txenhseXqPg3WXfIiGhIeEfXVxc21odV1taWBtdWRnZ2l6b3tyWWeBd3VocIB4gnZid4WLfZWCb4xrbnuBcWVzZWBqeGZwdYh5fGF1g3Zqa3B0eW95eHJ7ZX19fXZ1bWNkYGyGfGxqVWpiclRMa2xQTU9xSF58ZmFOVnVlS05UWGFreH9mXmdzamVgV2RYY3JeTExsWWRiVVRVdFdNWXdlWl9sYVxbZGVfd2dtYm9qdG9xfnV0mYF4f4B4gH6GhHp9doKDfpeFbnJ0fHt0cYWFj4KBeot2dJGAfIGVjoCFhHx+jIZ6foB2e6OminmJhoVsdX18doSDjXtvhnN6hX2Cg3VuamllVl1bW1pTY29lW1hhdHtqaG1oYGFYXlppgGlrcIBobWJpe3prdXV1cIeCeoF+d3ZuemhqeWpfZW5ogXeQhGdlWGF2aH2GeW5pb2ZmXVVYb2iPqHeAenyQjXh0bn1tcXR4jX53lHSGg4CGiXZqc3doaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Bfnp4YneFhXmRhnOIcnB6f3JjcWhbbXVkbnGGendhc4BwZ2l3c3Frd3ZzdWKCeX11dG9jYmJsfXxra1VpYmdUTG5pUEhTbEZieWZiTVRyXkpNVVpmbXh7Zl9tcWpkXVZgVm9vWEtUaVhnXlhOVmxUS116YFxfbF1dW2JlYHpobGFvcHZub3d1eph9d4CBeYCAh4Z6eXqDfYGThHF0dH56dnSFiJB+gX2RbHOVgXuCn4V/h32AfoaCgIp7doSsn396iIiEbHKDe3aBgIJ1b4hufYB0ioBqb25lZFhfWlpaVWJrZ1xaX3aCaV5tbFxhV1tca4FlcnR9ampebXh3aXV4c2+HfH5+enZybHpoaXdnXWRzaHp3koBjYlRjbmWBhHV2ZmhpYVdWWWhkkKhvfneAi415cG57ZndteYp6do5xhH5/gIduZHd0ZWhpXWxiXnBvW2hfbXVlemhddIBucmtxe392dmN1hox8iYiBgHhydn50YXBsWHBxYW5vgnpzY3GAbGFtem5qaHl4c3BkhHR4eHRvY2BjbXN9aWtUaF5fVUx1ZFFIV2JIY3dmYkxUcVlLTFhZaWx3e2VlbnJmY1pYXll3Z1VKXWRYaVlZSVdlUUljeVteX21bXl1iZF5/aWpgbnR4bW9udoOXeXKBgH1/iYyGfnZ2hniGjH10dXWCeXp6gouNfX+FiWp0l4F7ip19foV5gHt+fIaJc3GProx7e4eQfmZxiXt0fn13c3CGbXx+bZB6Y3BwYmVdZVZaWVdkZmxgXV10hmhZcG1bXlhaXGx7YnF3dm1jXG91dWl2d3Jvhnl/gXp3bm90ZWh0ZVtndGZ2dpF5X11SZWVpgYFzfGFiaVxUWF5jZJClaHh0goWQd2xteGZ3bHuDeXSHcoF5fXmAaWV3bWBnYV9qYF51a1lmXW9vYnplW3d8a25vcHh5dHVlc4SUgImDiXt3cHJ9cmF4Y1ptbmBub396c2VxgGRebnVoY2Z3enJrbYFzcXtxcGFdZG1vfWRpU2hZWlVOemBSS1pZSGN1ZGFKVW5VSkxaV2ptc3tkbGx0Y2FZWlxid1xUTGReWWpUV0hZYU5Ia3dZX2FuW1tfYmNdhWloYm54eW1vanaBkHltgn6AgZKIhIF3dYl0jId0cnZ2gXd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OHhHNwmaF7e3+JlnlldYl6c3l3bHRwf2x5fHCSc15wb2FnYmxUW1pXaWRuZlxccollU3JtW1lYV2BsdmNqdWpqX1tvdXJudXR1a4d9f4F8d29ubGRpcGNba3JkdHaOc1xWU2NfcH5+cIBcYWNeU1phXGSSn2VycYWDkHNraXhrbm55eXpxgHZ/c3t6e2RmdmheY1thaFxfd2hXYl9waGF3YVt8dmpqcm54dHR1aXGCloSIf4V2c2twe2xmd1dbaWxhb3F+eHNlb35bYHBwYV5pcH1ranJ9cG92aW9gWmRrbXthZlNmVVhTUXhdU1BaUkhkdGJhR1ZsUUlQWlZsbGx8ZW1vcmFbWlhabXFYU1BnWFdqVFVGWl1PSXN2WWBjbmNYYWFhXoxqY2Vtenlsb2l2eYZ7a4N9gISafIKEeX2IbY+GcW92en10goJ9i4+Dg5d0eIKUhoGfiXWBgIF0f4Jwh4N2b6KXc3uGjId7ZneLb258cGd4cXtsc3ZzjWtedG9iZ2ZrU15cVmhibW1bXHGMZE5vbVxWV1VmaXNoY3RlZV5bcHdvcXZ2emyIfX99iHeQc2Nka29hXG5tY3N4h2taVFZhYnd7fG+EXGNeY1NaYFpjlpRjbnCChYlyaWZ4bWRydXF6a3l0dW97f3ZfZ3NkXF9XYmRZYnVlVWBhbWRhcV1dfm9oaXNxdHF1d2xthZSDinyGcnJnbntvcW9SWmRpZG9xfnRzYm11VWJxaltebmV8ZGt1fHBxcWhsXlhjaWp4XmZUZFVXUVZvWFJXVFBIZXNgYkZYa09JWVVXbmllfGlseWtiV1xWXHVlVFNXaVJaZ1VUSVtaUE55d1tfZW1qWmJhXl6PbmJnbHp2bm9pdnZ/fm2DgH2GmHt/h4GKf2uTiHJndIB7dYCDfomOf4yTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOCjYx3eG56jWBlfXFnenR5bW1xd4NnZHxtY2dnaFNgX1VnYG1wXF5ujmhOamxgVVZTb2dza2Z4ZWZeWnJ2bnN8eXRuiXuAd5x7emthZWxtXmBvamVxeX5nWlVXX2t3enpugl5hXWhWWWBYZJyIYmtwgYZ8dmtpdWtbdXBqeWl1cm5vfIFzWWtuYFleVmJkWGVxY1RfYmlhYmxaYH5rZmx0dW9teHdsaIaNgIp7iG5xZnB7bHFsYVhfZ2dtcX9ycl5pbFNlcWRVYm1heGFvdHp0aW5qaV5XYGZodVxkVWFWVE9ZZ1NPXU9QSWVwXWNHWmpOSmBMWW1lYHhpb4BlYFVeVF52XFVTYWdPXmNVVEtdWlFadnZdX2ZtaFhjYVtejnFjaGp4cnNtZ3Z0eYJzgoN6iI9/fIqIjnpukIp0bHOBdH9/iIWHkoSVj3p9jI+HkZuEgHyNhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjY2NjY2NjY2NjY2NjY2Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERDR2RoZ2dnZ2WQoqCgoKCjgGRnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTQ5XGBfX19fXZGmpKSkpKd8XV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaIiYiJiYmJjY+Pj4+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkJCQkJCLjpGRiYeOipCSk5GLkIyOj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjY2NjY6Ojo6NjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQi4WJioaNhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCIhYaKhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfXt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkIiFiIyGjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4SIh4aIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin99d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pio6Ki42Kjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgHt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/fn9/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTk5OTk5SVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSk5OTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGSkZGSkpOIhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCSgoKSkJGRjnWGkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcISQj5B8dIiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzb4qPinJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX1+fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXdte4+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH5+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc25vhHt1doCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RiXmRfYWtxZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYl1qbF1lZmdlY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGRkhJSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaandsYm5yamJZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtrcmthbXRyZlFRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXWNva1hpc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRkhVYmdsb3BvbWxaTExOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDRkdITVpnaGdybm5oZmRgXl5YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PklaXVpcZWxuam9tbWxraWhrZFNHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1LW2ltbm9qb21ramxtZlFHRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozo9SGNvc21ubGtsaFVDPkNGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PUpgc3NwaFQ/Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkJsfWpAOjs+PT4/P0FAPz9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO1tuQD5ERT9AQURfZDs9PTs6PT9BQT8/QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pLSFZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo6bXdIODs6PT5BO0hkPTw9PDg6O0REPDw9PDxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJYHBwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUj08PUlMRkV1dk43ODg6Oz4/V2pBOzw8Ojo7TFI9PT05Oj88PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3J6Sjtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PTxPaEtAPDg8QT8+PkE9Oz9CQEJDQkBCQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFRT9BR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnprYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVCQVBuXlRQSEFDQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVudH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUpJVGhnZV9gWEZNTUZFRUVERUNBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx7fX99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTU1caWhqZWJnWmFOSUlIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExOTWZ2b2hraWxuYUdISEdGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiIRWbIWHhoaGh4iIh3xQTE1ObHh2bm1vcXBRP0RDQkNGRkVCQD4+QEFCQEJEPz4/REZIREZHSUtJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGhIKFhYSEhoaGh4eGinVKSVJ0eoN3cG1sblY7Pzs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMj2dFWWtvem5sb3FzTzY5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouNimdkamxjZWl1gXM8NDg3MzU2ODo4NzY1NjU2NzY3Njc6Njc4ODk6NzU3ODk3OTc3Njo8QEdGSUdJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJi4qJiYqKioqLiouLh3Nxb2ZncHJ9ZTQ2ODg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Njg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ5e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeHiIiKioyLiouNh3hzbm9zbXFhOTo7PDk6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKjI2OhHd1eXJvb11CQkFCPkBDQUA+PT4+QD8/P0A/QD09P0I+QEE/QD89QEBAPj9BPD48Ozo7Ojk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PDw6Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uMjY2NgXt7dnNxVktISEhFRkhHRUNBQEJFQ0NBQkNCP0BESEVDRUNFREFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhoaGiImJiIeGhoaHiYmKi4yNjIyMjIyMf3p7dF5PUkxLS0lKSkpJRkRER0hGRERFRkRCSElLR0hHRkhHRUtJS0lKS0pDRUNDREJBQkNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjY2NjI6Je3pwXFFSTkxOS0pLSUtHREdJSUlFRklGRkVMTE1JSkdHSElKTk1PTExOS0dGR0dFRUNGRUZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7Oz06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjI2MjY2Eenp4ZFBPTU5MSklGSklFS0lHS0pJSkdHR0tMTkxMSEhJSk1RTk9OTE9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhYSEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIyMjIx2d3RxVVJQTUxJR0RISkhNTEdLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRkZJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIyMjn5kYGhdV1VRT01MRUZHTVBPUFdVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkhHSkZFSEpFREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yMjG9fXm9kSFVTU1JLOztTVFJgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRTExLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH5hiouLiHNiaVk9W1pZVFI/QFdWWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFVUVlRPT01LTEpJSUxNS09NU290dnh5eHh6enp7enp8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImLjH1zc1teXVxTVVNXV1VbWnWDWVV9kGFcWF1fV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiYqBboaJiIeEi4BpXFxdW1ZXVVhUUlhWY5aAUmVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRUFJSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn6AfWBUWFtWVFZTUlJNUE1MZnpbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fn5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eIem9zWk5OUVFNT0xKS0VGSUZDP1RkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eXFlVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGFze3x/gIGCgYF/fXp7gH+DgoWGh4KGhoaBhIGGhYZ2YV5PR0FFRUREQ0FFUUNFQUM+Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVNkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNQVVlTVVFRVFJPVl9rbHJ2e3t4eXRybnN0c3l4fX+DgIODgoCCgIOBgmxPSUJCPDw+QEFAQD9rUUtgRUZISUVCP0dMTkdNUlVJQkU/Pjw9PD09Pz0/QUNDQD89PUI+Sk5HVW50dHVzdHZ4enx7fHx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXkpKUFFOS0xRUlFUVVVXUVFXVVBYW2FdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZURCQkI+O0NDQkJEQlxdT3tOT09OS0xNT09RTEtNV01IR0BCPDo3NzU5OT07Ozs4Ojg6PzxCSD9cc3R1dXV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXVpJSFBSUU9NUFFOUVJUVlhTU1lUT1laXFdZXV5eX2VfXV5xdmteYGdrd29vbGpvbm5sZWJZSEdISENCR0lGRkZETVJPYVdTV1FQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3p5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1LVFRTUFFVT0xSU1RXWFRUWVJNWFlaVlhYVlhZXVdXWGhza11WYXRrYWFfXmRhX15ZVVFOT09NSUhKTEpJRkNRUFNaV1RUTlFTWVNcZVVPU1RSTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTpHbnF0d3h6e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQU1RXVFVSXW5fUk5aYFtXWTtEVlhUW2ZKTFBTUk9OTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz89Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF1SVFpXWFVUV1RSWFhZWVlTVU9KR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBTTUlMSk9SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmhpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExISkhGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVFFQUVBRTlFPUVBMSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2eXt7fX19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nVFFTQUdVUE9RUVBNTU9NS0xLTE5PT1FMT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6e3h6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05MUVNMVFVUWFdVTExLSTw5ODc7PkA+PD1BQEI9PkVIR0NFRklHSkpARkFBQEZIRUpPSFFSYlxRUFJPU09PUExNT05MTU1OT05bV0tNUU9HSUhDSEpMTEtGRkZFP0JDPjxCRz9CP0FkcHR2enp6e3x7enp3e3d5fn58e3FzdHByc3dzeHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0JAQD5BREpFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xOS0xOTU1MTE9OU2ROSkxSSUlJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg5Oj9CPzxBQkFBREVHS0ZDSEhHR0hDRD9CPz9AQT5DRUNLTlJUTEpJTVRHSUlKTEpLTElKTU1PUFJQSkdDTEdDQkpJTE1PTklKSUdDQ0NESEpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9tcG92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktERkI9Pj06OTo7QEI/PUFCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQENFQ0lNUEhIS0dIS0RISkxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS01KS0ZHR0pOTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjtAQ0A+QUNERUlFSUpMRklJR0ZGQ0I7QUJDPkBDRENER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSEhJT1JSU05SZmZmcW9zeHV7enxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NCRUBEQj4/Pjo7Oz06PD5DQT5BQ0RGSkZJSExIR0dHRkVDQD1EREI+QUNDQ0RHSElHTVFJRkZHS05PS0ZISUZFREVJSkhLSUZIT0tDSUxLT0xOTU9PTkpKSUxSVVVST1dkYGFtZ3Fyb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPEJBPkE9Ojo9Pzs+PkBCPkBBREdKRUlGSUhHRkdEQ0JBQUZGQ0JCQkRFREdHSEZMUUxJT0pKTUxJR0hFR0VEQ0lJSEtKR0tSTUJOTkxQTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmRmZWRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd3dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREU8QUBAQzw4Ojw+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUlNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFST1BRTk9NTlBNTE1TV1ZYWFVYXVpdZGBpYmppZ2tfZGVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc7PT46PjpAQj4/P0JFRkRHREVIRURFQ0RFRkdKRUVJR0NHSEZIR0VDRkpKR05LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1RSUFJPUU1OUU5NUFdaVlpZVlpdWlhhYGFgXmhlY2BkZWhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSEhHSURCQ0hFPEBFQ0U9ODk+Pj08PEFCPD8+QUFGQ0ZDRElEREVFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS0xLSU1LT05PUlVWT0tVVlNQU1FSTE9RUE9UWVpZXFpZW15eXWBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD5APz4/QkE8QD5CQUZDRUVFSUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxISEhKR0xMTUxMSU1LTU1NT0xQUFFVVldPS1ZVVFJSUVJMT1JSUVZbW11eW1xeXl5gYGFkXWNgZWZgZWhqZHNzZmpnZ2tvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQ0VERTxARkREQzs/P0JAQEBEQT9CP0FDSENGRkdJRkpGR0RJSEdJSEpMSEhKSklMSkZKTEhJS0pHS0tNTUpKTUxOTk1QS09QUlRYVk1NVFVUUlJRUE1OVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ1bndLTExMTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0VBQUVHQ0hISUhHSkdDR0pHSEpGSU1ISUpNS05MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlJQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAREJFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdJSklJTEhKSk5MT0tJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2hmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQ0VFREZCRkZHREVLRkZKTUxLTExHR01JR0pLSEtLSUtLTkxNTExMSUxNTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZsbXBzcnBycXBxcnFycnJ0cm1tc25ub3BzdXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdDRkNGRUZFRENISEhERUtIR0xOTkxNTUZKTkhKS0pJTEtKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUFxubVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncG9qam5vcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGSENHRElGRUVCRklISEVITEtHTU1PTE1OR0xNSUxLSUpNSUtKSktPUE9OTExOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHhrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNGREhHTEhFQ0NIS0lIRkpMTEZOTExTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcXR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFBPkREQkdESElNSUZDRkpMSkdGS05MRk9KS1dSS0dLSkpOSUhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bgam1xcG50eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFxdnR3ckdHRklERUNGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElGS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT05RTk9RSkpPUFFkcWlUWVdcW1xWWVtdWF1cXGNmYWFlYmNmX19ma25pbXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0VFQUVDQERIREZHQ0lLTEhGREdLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT01KUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSS1lhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHJ4cnhzcXJ1cnRPQkNETE1CRERCRUlFR0dGS0pLSEVFSUpLRkVISFBLTU1KTVJIR0VBSEZKSUtMSkxKSEZESUZERkdFRktIQ0pNTExVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoaGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFSSkpNSUVDQkNHSEZIR0hLSkpJREZLS0tFRklKTktOS0hMTkdIRT5HR0xJS0xLS0tJR0RIRENERUFGSkVBS0xKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WVFLRkRHRUJFR0lGR0hIRkZJR0hHSEtJTERES0tOTUxLSEtKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQ0BKS0hQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYl1kY2JkY2ZYUVZUUVpXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGREZLSkZGRkhHR0lHRkZJTEpORkRLS01OSkxJS0pISUZCSEhRTUxLT01KS0lHR0VEP0VDSUlDQ0hHRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWFSUV9fYmJgYGJiYGNiYWRkYlhPUVBRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktKTVBFRklKS05MTElLTElJSERIS1FPTU1QTExLS0hJQ0RBRURJR0NDSEZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1OWGFcYGBfYmNiXWFiV19fVFBPT09XUVxbW1xcXl9iZmZlbGVvb3d8e4B7fX+AhISEhISEhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+Sk5GREZGSERJUmJQQ1ZeSUdHSERGTUpQUEVJSUpLTkxLS0xLSUpHRUpOUVFOT09NTUxNSEtBREFDREdEQ0NGR0JNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TUEtPU1JVWllXWVhYZFdPU1RQUE5NTlRSWlhYWl1cYGFkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoaHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxGR1hMR0hKSEdNTFFQSEtLS0tNTVVOT0pKS0dHS1BTU05QT01OTk5HS0ZgRURfTEVnZEZOXEleW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYWJfZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUdGSEVFS09TSUpGYFNISk9KSU9NUlFMTUxMT1JVUk9PSUxOR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXJ0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fWm5YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW19gYWFhXV9hZ21wbF9wd3R4gYGCg4OCfn1/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJS0VRVUxLTklLUlhXUU5OT01RVE5PUU9LS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJvb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ213foGAgn17eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOTEdgXUdBRU1NSEpKR0lPTk1NSk5WXllVTFFTTlhaTVNTUk1LT0hRUlRZV1dRVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVib3ZQZWVJZnZxbXdvgGpmeHdpV3JRaHptaWp6en1seHp/b2hvWXZ2anZ1cIBfcmZ9aWx4fG9eX19iYVpdYmRnaWlkZ2JjZGxscHBzdHNzc3pxcnhibHVncnl7c3J2eX6Bc3V6bnx9eXhybk5LU3VOQ0JGUFBISktJS1BOTk9NUFpgWldLVFdQYV5SVlFZUkxQSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JncXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXF9kZGlnZ2VlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX9ucXBre3p0cm9tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xZVU1VWVVlWFJSWV1TTE5JVFRXV1lXT1NOTk5RSVJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbF92dWtpdXt6bX54a3xwXF5eYlteYWRkZmVlZWJaY2Npa2tyc3J2Z2xpaGRnYWFrYWdzcmxnbW1yfWttaGt7dG1ta21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZVVFRhX1BOTUpUU1RRVlZOTkxNT1BLSFFOUFVMS0xTVFRTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1hYUl5ZV15XVVBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFBJS0xMTUtKU1FNUVFPTFZVVFBUVVhVWlVRWl1VVVRXVVlXT09LTVZUUU5VU05PTUxRUExKUlFLUU1LTFBSVVNRUlNTSUhMTk9RUlFQUVRWUlhXXFdTUlBSVFVVU1pRTlNSWFZUWVdVWlZUUlZUVFVXWFZcWV1gXVtaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVBNWFdVVFVXV1dZVVNcYFZXVllVWFJQUEpOV1NQTlVQTlFOTFNQTU9VU05STk1PUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVlhaVVNSWFZVV1tYWV5cVVheXF5cW11gYF1bYmJjZ2ZlZGJYX2FiXmBnZGZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmdmZGBiY2JPTE1MUVFMT1RPT1NRT1FbWVdXWFpZWFlWXWpkVlhZWldWU1NPSk5WVFBPVFBQUE1NUlJQUlhUUVFPTVBUVk9YUlRVVU9OTVFUVVVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUVlZWVllUWFhWU1JZV1ZaXllcXl5VXlxeYFxbX19fXlpiYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FcX11cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xYWltkcW1oZF9bWFVVV1FMTVZTTU5ST1FST0xRU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlFOVVZVW1tXUlNXVldYVlRZW1VUUlpYV1xeWl5fX1RhXGBhXWBiX1xgXWNgY2doZGZgWWNgYV9fZWRfYGJbWlxbXFlaWVhXXFpcW2BeX1teXmFgX2NcWWBbUU5PTlZRUFRRT1RUU1BXXFxcWF5cXlZcXmpxd3mAY1xbVVVXUE1PVlNOUVFPUlRSTFJUVFlaV1VPUk9TWFdUU1VSUlpPUFJSVltWV1dTVlpYXF1bW11WUk1UVVVbXFZSVVZWWFlTVVpcVVNTXVhaXV5cYGBfVmFbY2JdYWReXGJhYl5jZmlkZl1bZGBhYGBjZV9iXllaXltcW1hYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1tUV1dRTlJaU1JRVFJUVVRLUldWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWVNYXVheXVlaXVRUTlVWV15bWFJVVVlZWVVXWlxWU1deWl1dYF1iYl1ZX1tlYV9kZF5eY2NhXWVmaWRmXV1kYWBhYWJkYGJeWFpfWlxbWFhYV1dbWVtgXFtbXFtYWlteVl5ZXVFPT1JaUFpUVVZWU1RUXl5gXl5iXGBVXV5ia3l0bH1rWlRZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUlZRWVhZX1taVFVWWllaV1haXFdVW15dXmBhX2NjXF5dXWVhYWZkXl5kY2BcZ2RoZWRhX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QVllRXVVWWVdXVVhfX2FhYGNdX1VdXmJlZXWBemhXWFlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSWFNXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWlxWV1hbWltZWVpbWVdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYVtmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lYXVpbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlaWVVXVFdbWlpcWVhZYFdQVV5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1pdXlldVVJYV1lZXWJaXldYW1xbXFxbWlxaWl9fYGBkYmNkZWJkWmFlY2ZmZV1hYmBjXWJjaWRjZ19nXmFhY2FhYF5fWFRbWlpbW1hbWFhcW1pbWFZZWFdcW1tgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXFxaVldYWVxcXV9bWVtiVlRYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5XVVdXW1tfYFxfWFlcXF1eXlxbXVlbYGFeYGRjZGVlZmJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlaWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZcXV5gYWBfYl5ZYV1dXllcXllYVVZbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRZaGhiZmljZV5iYmNhYGBfXV1aWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1tdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXXFxfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVhUWF1dX2BfYFxbXl5gYmNcXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiW2NnX1xpaGJoaWVkYGJhY2FfYF9cXVxZXFlYV1hZWFdcWlpXVlhPWFpdYWNmZnJrf0pZV1xaWl9cW15bWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWJgXltgYWJmY19dVF1gYWNkZGZlZ2VmZmVeZWZoaGdkZGBaZWddYWdoY2hoZmNgYmFjYl9fX1xdW1pbWVhYWFZaVlxbWlZWVk1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7enp6enp6ent8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXp7e3t7e3p6enp6enp6fH19fHx8fXx7enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a8homJiYmIkMzT0tLS09haJSoqKioijNvS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIqU3ebk5OXl61QTGhoaGxCP7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2DhISEhIOEeHNzc3Nzc32EhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnd6eHp5eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3l5eXl5eXl8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2eX17e316fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjYyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fXx7fnl8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3dnt9fHl8enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp5en17e3x7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4e3h6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGhIOEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYGAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgYKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0dHR0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzc3NycnFxcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXNxcnJxcW98gm9wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwh4ZwcnFwc5iCbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF9oYJwcm+LnnxucHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXWdoXdxd5+cfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZiokG+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4d3d2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nyc3Ryk6mkeYignXxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eXmftKmkqKiXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7ia+mobWrrKN+e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2YpZahsqCZp5N9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgZycjqCvoJ+in4CAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5qOmLGhmJachXx+fn6Afn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+foCBfn6fq6WWpJublqCfhn9+fX+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgYGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KDg4aNn7KooqCYnZ2mqK2ooJmQh4GAgIGAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNoK2xppuaoJuenJydoaSjnZSHg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYOLl5mXlpigmp2dnZmal5CJhoaHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBho6Uk5eanJyblI+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5OSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDg4iQk46UmJKHg4KFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkZCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKBgIebh4uHgoKCgYCBgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo+PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf4OIjoCBgoODgYCBgIGAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f4yVgoKBgoSDgoeIgoKEg4OCg4ODg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIOCjJGBgYSFhIOEg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSk5CNjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYycjoCCgYGCgoSUlIyBgoGCg4GOm4mDg4ODg4ODg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpOSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgY6doaWgkYSCg4SCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDgoODi5KPmaall4SKiIKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf319fX+ChIODhIaPlJWSmKCgmJSGg4SEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaGhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39+f4CDhIOEh5iXm5iWmZiak4aEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWFhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYOMm4mNmZmWlJONh4aGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWDg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf359foB/f39/f4CAf3+Af3+GhJaZgH2RmJiXlY+Ih4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aGhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGBgoGBgYGAf4B/f357eoCLn6GTjZqbl5WSjYmIiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCg4OCgoB/fn19fX1+fnx7e5WjnJuhoZ+QgoqLiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4KEh4iIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKDg4F+fX1+fn5+fn59fn19gZOVlqChm5SHiYiHh4eIh4eJh4eGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6f4+UmZuampWOg4SGhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGg4ODhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GEhIODg4KCgH19f4CAgX99fn59fH19e3p6g4+RjpWXmI+BgYKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4SEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn1/goSEgoODg4J+fX5/gICBgH59fX19fn18ent7hoyNkZSWhX9/f4CAfn2Af36AgIF/gICBf3+AgYF+fX1/gIF/f35/gIB/gICAgH+AgoCAgoGAgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x9fX59fX6AgH59f359foCDg4OCgoGBf319fn+AgIB/fX19fXx7e3t6enp7iY2Nkol+f39+fn9+f4B/fn9/gH+AgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af39/fn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+f3+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp6enl/jo6UioJ/f35/f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f36Af35+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp6enmDj4uUlIKCgICBgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIGAf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEhIKBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXx6enl5eXqHiI+Wh4OBgoOBgIKAgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGBgIGAgoF/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eXyChI2HgoKEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5en6Bg3+CioSDhISEl5eDg4SBfX6BgYKBgYGCgYOGiIyFg4KCgYSCg4OCg4WEhIWDg4ODgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl6e31/fIWRg4ODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLgoGChYWGhoSEhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6ent7f4KAgYGDgoB+fX9/e4iRfHyOln99f3+ChoqFg4OEg4KDjYl/fn+DhIWFg4SGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXh8fX6Af4B/fXt8f359gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32CgYCCgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e35+fn9+fn59fXyAgYB9ho+Bfn2Cfn9+gIJ8fIB/goCBgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMi46OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4WEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX+AgX1/f4B/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjY2Ojo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3x8fHx8fHx8fHx9fXx7fXx8fHt8fHx6enl7fHp9hYODgIGBfoB/f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fHx8fX59fHx8fX19fXx+fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36LhIGHfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjYyPjYyKhoSFhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOBen5+fH5+gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f3+Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgIKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5+f35+f358fH18fH18fX57fHt8fHx8fXx9fH18fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko+NiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/fn9/f4CAf35+fn1/gH9/f3+AgH+Ag4KAf4CBgICAf3+AgIB+fHl8fn1+fX1+foyGfX1+e3uDg319fXx9fH19fX19fXx9e318fX1+fX59fX19fHt7e3x7fHx7ent7enp6e35+goaIh4iLiouLiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgX9/fn9+foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fX18fH19fX18fX19fn19fn58e3t7fHx9fHt6e3t5enl5eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX19fn58fX18fX1+fn1+f3x9fHt8fX58fHt8fXp6eXl5eXp7fn6AgYOHhIiPjouLh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGCgYKBgICChIF/foGAfX6Bfn1+f4CAfX6AhIB+fn99fn19ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6ent8fX59f4KAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgIGCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH99foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fn18fHt8fHt7e3x7fHx9fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgH+AgIOBfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhIOFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYCAgICBgX5+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhIWDgX9/gH+AgX59fX5/fn5+foB9fX98fX1+gX+AgICCgICBgIOCgH+AfoCBf4CBgIB/fn59fn5+f31+hYWBgYF/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foB/gYB/fn+Af4GDgoOAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH2AfX+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX59fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWFgoSEhYSDg4KDgYGDgYCBgX1/gX6BfX19f39/f4B+fn99fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOGhYF/f35+gH+AgYCAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgYKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hYSEhoOChISEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgIB/f4GCgYB/fX+Bfn+AgoKAgYOChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB+fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1+gICAf39/f3x/f3+BgIGAgH98gH9+fn6Afn1+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e3+FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYGAf32Afn5+f39+fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH58f4CBgICAgIB8f3+Af3+BgH9/fYF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t7fHl3e3l3eHd3eHt7ent8hYl9e3p3enx9fXx8fX19f358fX5+fX19fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYGBgYKAgoCAgIB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5fHx8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fn1/foCAgYGCf4KBfX6Bf3+AgX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKNenx9fHt9eXt6enh6gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgYCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgoKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKBgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x8fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+AgICAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgIGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31+eHd2eXl6e318fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4SBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgH+BgYGBgYOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97enZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgYGCgoCAgICAgoKBhIB+gYOCf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3x7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSGhIKDgoOEgYSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4J/f4GEhIGDf4KCgYOCgoKBhIODhICCg4KDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp7fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKDgoODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYB+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgYCAgICCgYCAf319fHx9fHZyd3h4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGDhYOCgoKDg4GDgYKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhIKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOCgoGBg4J/goOEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fn1+gYGAfn59fn1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4OBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB/fXx+gn9/fn5+fn19f39/f4CAgH+AhISEg4SFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYuJhISEhIWFg4eGhoSEhISFhISEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4KDgoOEg4SEhYOEhYaEhYZ9g3p9fn+De4WDgYSDgH99fn9+foGDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWEgmh6cnNzfIBygoR+g4N9gX1+f35/goOCfH+BfX+AfX18fHx8fX18fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgoKEhoaDhYSGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhIZ9cHuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId6bX1yc3Zzdm1ud2xweWx1fX9+fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KCg4WHhYaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fn2AfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIWFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fX59f39+fYCBg4OAgoOBgoSCgX+BgoB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4eEhISFh4aFhYWFh4aIhYWGhYeHhoaEhoaJiIWEiYqIhYSFhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBhIGAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGg4aFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SDhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgoF+f357fHt+e3x9fn9/fXx/foCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaHhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaFh4WGhoiGhYiHh4WHhoaIhYWGh4WGhoWDgoWFhoWFg4WDhISGhIaGhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSGhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYKDhYaGhISDhISDhIaEhoaEhYWDhoaFhoWEhoeFhISFhYOEh4aEgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoWEhoaHhoiGhISEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFhoiFhoeFh4aHhoeFiIeHh4WGhoeFhoaFgoSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIF7e359fHx8fn18fHx9fnx9fH59fHx9fHx8fH18fn17fIB/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoWHh4eFh4aIiIeHhoeGh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx8fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaIhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaGhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFiIOEhYSGhoaIhYWEg4WFhoaHhoeFhoaGhYaGhIOEhYKBgoGAhIODgn2BgYB/g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCBgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeGhoiJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoiFhYSChYWGhYaGh4SFhoaFhYaCg4OFgICBgICEgIOAfIGAfn6DgH1/f4F9gHx9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaFhYWEhYWEg4KBgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDg4aEhIWEh4aGhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B8gX99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15ent7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWGhYWDg4WEhYaFhoSEhISFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXl6eXp7fHl6enp7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoWGhoOEgoWChYGBgH9/gIB+f4GBfH5/f35/gIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOEhIWGhIaGhoaGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5enp5enp7eXp6ent7fHp7fHt8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9+fn9/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChoWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn9+f4J8f359fXx8fHt7enp6enl7eXt6eXp6ent8eXt9e3t+f3+BgH1/fX19f4CAgIaEhIWEhYKEgoKEgoGAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFg4WDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgH9+f318fH19e3t6eXp5eXt5enp5enp7e3t6e319fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lgZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09LT09PT09TU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svL0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19jX19fa29ra2tra2trb3Nvb3NnX19fX19fX19bW1tbW1tPS0tPT09PT09TV1NTW1dXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbLzJWFhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0jYuLi4uLi4uLi4qKioihv729vb29vb28vLy8u7/S0tLT09PT0tLT1NPT09vi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXy8xuUFNTU1NTVFRUVFRUTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFhSU1NTU1NTU1NTU1NOeq6qqqqqqqqqqampqaiw0tLS09PT09LS0tLS0tLf6+rr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18vMcVVYV1dXWFhYWFhYWFGh8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp5cVldXV1dXV1dXV1dXU32wq6urq6urq6uqqqqpstLS0tLS0tLS0tLS0tLR3+rq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fMzXheYWBgYGBhYWFhYWFapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqiZmFiYmJiYmJiYmJiYl6Fs6+vr6+vr6+vr6+vrrbS0tLS0tLS0tLS0tLS0d/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzMzHxcXFxcXFxcXFxcXFxcrQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs7OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzLy8vLztLS0tLS0tLS0tLS09PS1dPU1tbW1tbW1tbW1tXX2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M3Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7OztLTz87R1NTTzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19fX19fX19bW1tbW1tXV1tbW1tbW1tbW1tfW1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvVkpfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztKrnM/SrYODlc/RpaLQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT08PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK2nKWkypu8uJm1s6CiqtLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/OnZyRnrOmjYGNxp6YlpzHz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I6NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv5igm7WYo4qr1rqYop6vsdLPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9COjc0Ojo6OTs7ODs9Pz0+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P07SZlqq7iq2rm6WxmZaws6nU0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A8PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8qgo7/KnKWMp63Yqpmq1M/Pz9Srmn6jkY2lnJankJmEnZOj1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDUrJuni5aiqLSqnn+gqYWZpdXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q07aysqWZq8/YwZyAvK2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXEopmWnaeRoZ6emaiWmJq61dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTo6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6DH1aKrpJy4pKujnsOgq6Sb0NLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09PIko202amPkKzXwo+Nu9TR0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVUxGQjw8P0ZFR0tJPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MjB1dLVwL/W0tXFxNXR0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/Pj5BRExMQT43NzU6ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHT1NLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PDg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRENJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZJRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc2ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7Oz4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU5NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBGPjg7NzI3OTY3NDUzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBCRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO1tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6uvsKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo6Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmpqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpaWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo5Ojk8Pjo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0E/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJ2dnZydnp+goqGio6OjoaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5iXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6alpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5KUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqanp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5ODk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6SmpqWlpqempqKdnJ+hn5eRkZCUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PTo6Ozc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaWmpaWjoKChoaCZkpCPlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaCgn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU5ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WSlJicmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODY4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqOjpKSkpKKhoZ6bmpmXobWemZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpmXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6ChoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKCgoKKkoaKioqGgnpybm5uZn6ubnJqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCls6ygoJ+fnpyZmZqam65qdp2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5uam5qYmZiYmJiYmJWUk5GQkZCQkJKSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCfppKbq5+goJ6bmpqamaiERICfn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs5Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnqCeYpymnp6cmpqbnKGjUUiEoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuapmZdo6CbmpmbnZyudUlMhqGcnZ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKSAUniimZmanZugpF9WToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgiFtflJqZm5yco49kWk2Bop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiZn5ddXXaXmpydnaKBZFlNf6Ken56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp6enZubmpydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmaYGFggJadnJ6YdGNVT4Gin5+fnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTo7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmZn2leW2V/nJyejGpfUFOGnpuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOTc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal5NzaGFUdpOXnIdcVlBXipKOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaOimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6Smp6SfaCjlqScbkxPY4aGgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CEoJ2Of2uWpZWff4l/X3J/gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5/gKKLfG5SdZyMjFlxfXx+fXyGjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj07Pzo4PDk5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZiad1hPTHGUhoJLX3Bxd4iFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY2jjVQvMD14h3d3QERda22EkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KmnGdCW0g7eHlrZ0UxOFpsc5CPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mpr49KcqJ5QXx4ZGJRU11JYG6KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKN4YMHWpUN8jYJ1T22OdlNkf6Oop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBEQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkp6eZnaSlo6KdYn+9wK54oKOalWVMYXhtUXSVoqKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqadnmqEnLqPqNGimrOoWEysk1Nlj6CeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+roqKGd359cs/IsJqnr2tVqrBjW4eln6WioZ6gopiVnpufn6ShnJWYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e0tbazra6tj4aDbpHMu5STpJZ0VG96c3B9lqaqp6Sgn6ObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQENDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3u7u7ubnBuLS1oIh5ZFiftr2mp5qId2txb3h5e36GjpKYnaOlpqulpJihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW3wcbMz87Myb6zpJBzZlJEi5WGhoZ9eHFuZ2ZsaWxycnFycnV9janExLuip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYWZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PFx9vj49rLvK+kl4h0WVpRRGl4a250bmtlZVlXXVhcY2pqaWZhaYq1wcC5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3b21bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7N0tXKuaedlIZyXlFUS0RbZV5jamVhYGhZVFhTVllaXVlbdZq3vKy0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudnJydnJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/wsHHy8i3lHVlVVBPVEg+XmxeX2ViYF1kYVNVV1ZVVVhznK2xqqiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5uMObYUlER0tEPVtlYmJpY2BbY19XUk9QUFaAtLqsrqWko6ikoKClmam0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZ3N4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwa2DT0ZNRTtNW19la2VfW2BZWVNOVYCjq7m1sqypo6GtqaynrZ+stLS/w765uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dmVmampoXmtwbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCxpZqWEc/P0deY2JqYFpYV1RWd5q3wLu8urysraapu7q5t7+ztbiywca6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rraussZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aGpqdW55bF5kW1ZgWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnOxcbGvalyUEswWFNVZmFTTlBxqcjIwsTHwLy+tLCwsMK+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2tr7WkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPCwbyRP092folWTG+ly9TFtr+/wL+6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVnZGxlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzFp3drg5CXb6rJyMfRwa+9vbi5u7u+t7Swub6zvL6xubW4vLa8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFjZGRqY2dkW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Aur/AvLvFvbrAxL+9vq9zZX2RiorRxb+/yb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhY2Noa2dnamZqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz05NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWNuL+7w7W6x7a1uLq8uLm2qqSYjn6Eyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVncGplbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/Ed6jMvce3ubettrS3ubO1sb3JxJVKe8q+v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdxa3RmY25gXFVIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTWrnSAu8jPwsC4rrS0u723ubG9w8qOQ3XNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXJmbGpvdW94ZGhjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0plxcqvR0czKxLW6v8TIvr60v8DAeVJuy8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1tdGxtb2BjX2JiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQw7q+vMS+t7zAv8nPx8jKysKGcnOjzMzLzcrGwsPLzsG8uL26snBjYrvIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWRcX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqbK2w7+leXV4mcTHy8jBw8DAycrBv7u5saF9c2utyMXEv8DBv8vHw8DIwLrBv8OzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEuW2szr22ucC8rH1uaG5tcoGVmHN3fJe9v8bAucC8vsXEvb24sbCYkH2Am8rCw7y9v7/Dw7+/x7y8wrWsrrS0vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBhWlRRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzrR2gLO9trXCpYdpWl5gTVJbWm5zd4CfuLjCurO7t7u9v7q7u66km5iHkX7AxMO+vL+7u7i2wcK1wbqAoLCsr73Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2eG5yYV9nXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmohHiJoK+1nWplZ1ZZYElJTVBTbHeGpbC3vrmytbK7uby2ub60lZyllqFwrsnEwL2/ubOusry6rsF+cKKrpqy6vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybWBkYlxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fq4h8dougmWBUQ1hVR2FqVk9FSmCNoKyvtrq1tLKsvLm4tbjBvYuYsKKlcqXLwr+5urWupayzsKmkVICWoZ6lrba0wba1s6WnqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8cHZzb2ReaFldXlNPTkI/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7WRgniHj29OSj9kWUJOd4CUak5BXYGwtbO1srSvrLu6uLa5v8Z2g6qemmSnv7i1srGtrZ+kpqeliEmDj5mYmZ+prbirqqqepKmkq66vp7Crr7GxrbGurq+5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2dG12amxdXGtVXlxQTkhER01CR05HODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e3lYyIhHtYRkFOh1lKSlh3jYFjQVOjubO0srCxrbC5uLa7t7q9kKKyq6Nyq7Cpq62ro6ignZ6dpG9Ke4aJiIWPm6ito6KjnquvoaOpqKGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWl1dG9lVWJkWF1ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKqZmZVpTkBSeHFQSUlLZpuBWUVSrruxrLOvrqyttraytLWvqaafmpudnqaonqCoqZ+hp5ablad6Ym5se4N+gIibqJ+en6G6pKWdo6OgnqWgpKylpqiloqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CWlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh4g3x2f3pjeG1uXVFpVVBPR1BNTUNQUkE/Oz40Ojo1Ozo9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Cq6W+aUVSnYJRV0lKX0lTjmBjYoCutaqytK6qq6+wsrOtpZ2Rl5OPmKCfoqCco6SfnaiUmpWgtZ6Dfo2Ri4N6e4yZnZynqpKqnJ+goZyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOfnaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fIB1dn1ubHxkaVZTZE5KSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaCqxr/LoVBBc554T25LS2JldHNgWl5wkLGvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqklpaVw9rDurahkYyMhHNrepmfsYGbq6GfoKefnZ+jpqieo6afqp2qraqup6iwpaOkpqespqKlopuZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJfIB+d3l8ZXl5YWJTVmFJSUtMU1VKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfHj1dTSWSkXGV+b3JdUGtjW2RfXWuPtLCwuKymoZydmpSYmpmQjpGVkYyOjZOZopyXopiWquHd1dXRuaGKiot1ZmCOvKFyqq6rpqKxo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbWVcU1taTVJLT09WTVRNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpI16VWlydnVwY3Z2WFdjYGNnWVhXZq2urK+nn56ioJaQk5ugnJmXkpOfnKGjmp6blp6Znb21sr7DxMGxlIB4bGlhjbRxhre4trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpafm5uYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dmp3dV5tW1JhSVJWSEZWV0tDTUg9S0k4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCkgG6CcGBjWExbU1pNTFBYUkhNTUiYrKqppaCfmpKRlJiYlpaWjIiLjpSdnJ2dnpadl6yXT1qDo7e8tqJ/bmVoaXKBX6q6vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwbe7tquusbm3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWln52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21oblxYXENXTkpHTUhDRk49Pkw+NDw6Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYpiV15lYFdNUUc+Pj9DQz8+QlF4qa2pqqagnp+io52fnpudm5STlZSenpiUhZ2Zn5msZkFSWnqjsreogmhhaHFwYIHHvr/Cv7a6u8DDub27rK6nsa2xwra4wsbAyMrAyr+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqqvo56sqLeyraOwpqGjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqKgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V9YF5lYFFHRDxDPkU8Pzk2Tn6qs6eko6KgnqWspp+YnZWSmp6ZlYyKhoiGeGyGn6Kkm2xve2phg6aupn9maHmIjH6zx8TCx8HAxcjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Aw77Hx8K4xMrJxMHHv7q0uru1u7ewtrKru7KvvLfAu7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p+c2phV05FPklZfG9iQj1cjq6soJmbnJ6emZeXmJONj5eXlI+NkIyCg4J2cnBsb42krY10fKKVZWaUnpl5aHyQnaKpwc3LxsjExczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsfGysjPwMnRzcfGyMbCvcTBv7+/tb6zrb/Aw8PHxcjEr7+5sri9xMLBu7y8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nXlpaRE9NQ0ZRSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9Lhp6lmoSgsq2jnpyfmpiXlJOUl5GQkI2IhISJh4OAgYGAeXFxbmp2orGIco+4xZtie4qFdHGIlKGlpbjRzMzNz8TN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3K083O083GycrKwsfMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArrCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZVZYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+OTo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnGNTTEpEQz9DUq7RvbKvppycnKCkoZ2alJSVlIp9eXFsZWJocnBye4WKgHVwbXBybYWfhWmEtdeXamx2cnh3g5Cbm5u21NPSz9LD0NPW2NXV0svJztDLxs3SytLV19nW2NPW2M3Sys/RzM/RzdPQwMnIy8TMzczPz8bHyLbAy8DSzczQx8rJwMTDyM/N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVyY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqJbSUBBREFGUXayr6aalJefnJqgoJ6bnZqViXdpZGFfX19fXl9fXWFsdXNwb25rcG5zgolmbKe1aHxjX2V0cHiIiomKp9XT09HRzNDN09fW09XQz9LT0cnT0cjQ19fY0tjS19nV1szPz8nN0szO0cDHxMnHz87R0dLIzM3Ay83G1M/Nz8nFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNFQ1NOPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ6lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZ0M4PT5EWIKqqJ+XlZeZmpyfnZibnZN9cWVjYl9fYV9fYWBeYGBfYGVtcHBtam1vc3WAaF6DmIqDWUxaZ2JxeHJqaJfUzNXU0crPzNPW0tHVzc/V1dHF0dPK0NTV1s7T0djY2NfLyM7Eys/NyszAycHJys7P0MzQzs7Mz9DIzNDRy87Lw8rIys3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRE1ZRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+ZpaegoKOnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksnxIRkI7Vo2hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBgYGBgYF5gX15cYm1ybm1wcHJydnNnaXBxZFhQUVdYYWJcV0un0MnS0s7GzszN1MvO0szK1tbQzNDTy8zQ0dPKztHV0tXWyr/KwsbNw8jKw83ExsnLy8/Lzs3RztTMx8nQzcnHy8bHwsbKzM7R0cfQz87OzNDFx8G4ub3Dwr3DubKyvrC7w8O1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElRUUI7RD87Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3xlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFvcHFtaW11bmVxc3J4cFZPTlR5d1VuwcDDzs7HxcfNytHHys3NxdDSz83M1MrHys7Px8fP0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNy83QycXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxcXIu8fDycnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVVHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KGoqqTjY2Wj4WDg4OBfYSEfnNfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG1taGdpanNfZXyGhWhXWk5WoJZlm7q2u8fFwcPAw8jJyMjJx7/Ey8XHyszJxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbFvL/Kw8XH0sXBycDKysfIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdDR0RMREZTPzU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bV56fJ6RipKWhnqAhIV/dXh1cnBfWltdYGBiY2RkZWRgW1xeXV5dX1tZWlxhbnFtaWZna2huclttcG9ZS11eeaGJbaCxrq3Aubm7ubjAwcHDvb24vL64w8nExsK9xsC3u8PIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMyLLHycPOzMDFw7+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRUJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys/FycXHwbrFvayup2BjdoGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXWdyb2tkY2lpa3Z3ZmBoYEZmYneBb16XqqiitLG0s7Kys7u0u7C2r7OusbrBu8DEvL+6tLK6vsC4x7i0vLbAwr24vcfBw7u1r7O1u7+0xbi7tay5vb7AvbG7trC3urPGvbevvL+1t7XFvb7DxsDExsbHzMW/xsa7x8u/z8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TFy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJpbZ2+IjoaIiXp4foWGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXlxdXlpbW1xfa29sZmNmaGhqeHBTZW5kXVdiXUxamaaimKaor6upq6iyrLSvsaetpquyu7m1wrm6ubCqtLm7s8G5r8Cxvby7tbvHucO3raqosLLAtri9sLGosrO1u7yrrranrrauvLKwqriwrruuu7i7wMG+usO/xsPFwLzGwcfKuMXHxb/Hw8O5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzCurO1tcOuqrGTW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXGNtbWZkZGRmZ2x5WVJoY0VLWlM+XZifmpOWoKaroqahqqirqq+ipZ6prLS1sLy4r7evqK24tLO7t7O8r7i5tbK8wbLArqWpo6uxs7OovaqrqKusrrW0pqmuoaWwqbOmp6iupqi3rLGzt7q7u7K8vr6+xL+1wcDHyLe+v8W3xcPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8LLvrvJtr3DvrrKt8HDwrW2vLaxr7W8ramrk2NtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZWpkYmNhZGRobnJCRkVEREZTSV6WnJOQipuepaGhnqSkpqWsn5yao6WssrC2tqewq6eqtKuzubC1ta22ubKwurqxtqSgpKCmsaisqbmqpaenqKezraCnp5+cpaasn5+npKGhsa2trLK1s7Swtby2u8HAsru+w8GxubnCs8C9wLW4vL2+vMLHxMPEv8DEoIR5cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs8ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhaXV5jYmBjY2NiZWVtZjM1Qj01R0NulZqPjYSXnJ2jm52doqSipp2aoZqeqq6ssbSjqKmpq6yktListq+ssrSus7WvsKqfnp+korKlpqq4raKmpp+orauZn6CfmZ2fpZqZo5ycnrCprKiqq6ytsLO5r7i5urC2vLu6q7OyubO9tLeysba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uci4uL+3ssK0sbu7rLq6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFdXV1dXWFdaXWFiY2NiYmNkZXFSMTo0LzhCXmOMlo2HlZydpZyYm6OloaObnp+YmK2sra6xoKSiraunobWwsbGsqK+yp7qzp7ahop+co6Gto6Kqtqqio6aepqajlpmdl5manaCal52cnZytoayoo6Smrauzs6q1sLKrsrm0r6qvsrKzt7Ouqa2usriwura6vb+3s7GUhnp2Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0JCQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMLMyMbAxbbBwMfOt8DDvbO5ubK/trG5u62yta+fmqOqoZSaj3h/g4R/eG9xdHFoZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVVdgYmNhYWJgYGRncFBRPywxKyQ6a6WViZCamZyak56ep6Kcnaabmpmqpq6wqZuiorepoaCuqLWqpqetsKS3sKS3oKOcmZmqpqGarbmwo6GknKKgoJOVoZSWlpyZmJaXnJWfqZ6qpKKeo6qqsa2otKyqp62zsKWrrrOxr7Cvr6eoqLKusrSwvLS6uK6jlIJ6d2VfYVdZWFNSVEtNXkxQTEdITUxFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rZ2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwsLGqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1ZVWmJiYWBhX19gYmhwaEoxIhwmSkl/louOlZqXnJKcnKSjoaSlnZuepZ6qrqWfoKK2p6GhoqizoqWnpa+lsa6rtZ+hnZaVqaGilK2xsZ+jo56emJyTjKCUkZOYmJKWmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqa6vr6uoqqqzpqarr7Sxrry2sa+vn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk5PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVlJUUlRfX11eX1xdXl9hamlHOjQvOml8cISLjJCdlZyTmJyin6mjoqKhoqGbqKqjmZ2jsKmhoJ2kqp6oop6srKqprq2ioqKVmKKanJCrqbCcn6Kfn5eZk4qdkY2SlJaQmJiTnKGjnKWhopagoqSlm6OrpaKkqqSrraWusqmmpaemtaaqqK2ztbS5uq+qrJ6Mc3FwYFtXVlZSR1FPSFpcT1JKVEtTTEVHSkM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Nzs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm8sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpaWxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RVVlVUVVVSU05QWVxbW1xcXF1cX2JrSzVCQlJ9hnd7iouLlZWdl5edpKWnpamlqKWhl6SsopSYpK2on5uYmp+erpmcqrOfpaafo6OhlJSblpaSqamtm5yfoaCblJCMmY2MkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrilo6SjrK2qqKuvtLeyvbWzq66YhXV0aVtZWVNVUkZYTFFbWE1VT1BMUVJJT0pCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njg6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7euqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FYWVlZXFtaW11eZmNVWGxtfIF6gIKNiZGTnJuWm6elo6uppq6jppedqp6UlKOnpZyXj46Zna2WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9p5+jrLSqrqevtLC5tcCxrrCrkX5ydGNWVFVOUUpHVlBSUkxMWE5LTE9TR05LQUNGRUM+Qjc1ODg5Ozk6Nzo6Nzw9Ojs/Pjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxt7i8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRRTU5NUldYWVhYV1pbW2BqcGpwZXd9eIN9jYKOjZGWk5mkl5ynpKSpnKWXnqOakY2eoZmWloWEkZqjj5WinJWWlYeimpuTjI6KkJqlp5uVlZeckZOIlI6LgYyNgJCLkpKSoZqgopaUmZiVoqaajZmkp6mnoaC0sqizuKGdo7asqq6ksrKmtbu0q6yxoop6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUhNSkFITElIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLEtbWys8bFt7rDyszGs626vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0tTV1dWV1dXV1pdYWdfY15yeHN8dId9h4OOi46ZnYuWmaGfoZeklJ+alIyGmJmLc42CfY2WloaSmpCTjo17mY+cjIKJgIqYoKOekJOYloWOgpR+fnSKjnqQiJOQkJ2bmpqSlpCejqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLG8qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU05JSkpFS01HS0s+ODQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY2Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLi5wM7GvrOsusGsrcStqKKmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpHTlNTU1RUU1VZWl1oXF5bbHVtaUdSa4p8kIGHl5KHkI2dlpuVlZWSjZWIf5OJXztXb3uLk4mAjJKMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFwho19iYGQjpCXmpmTi5CKnYifmIeIlp6aoaCXp66prampnpats6KlrZmtq5iotKOpraOTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS1BKSU5QR0pKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKapp6OqsKintMK5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFMT1JUVVhZYWNaVmhwZUg7OnuQjIp4go+IgIaJmIuVlYmRhoSThXiIf2BKUW53ipGDfoSMi4R/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiJWEm42ChZKblp6dlKSiqKmlpJ6bsKqhpKSRpqqWoqqcoaaninduZl5cSFFRU01JVU1SSUxLT0lIRkpOTU1VS1FSUEdKRD03Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Nzc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+sqrW8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/iZSplpWLf46Eg354cW9YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlPUVNTVVpoZlxkbVxdU02KgI+Cb3mBfHiBiZB/kJmLj3qEjX50f3hybnVwdI6OgXp+iquFentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWKiIqNi4B/hIuNgJSEfIGPmJSclpGfnameoKGdoKmln52YjaekkqCglp6fpIFzaWJdXUpXUFJIS1hST0pNTFJKSkpMUElMUU1SVU1GSUI9Nzg7OTk+PTo7PDk4QD86Oj48Nz09Nzk5NDc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3eGeHx2cG9qWUtISUhHRUhIUFRUVFdWU1VVVVVWV1hXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXmhtaWhZa4OPlIuMdmJ0e3J1e4WNeoKYkn9whY16dnpua36tfHSQi396hpKAfH90ZnV8hmxvaHN8io2HgG16cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSm5ujlpmdm52eoZyWjYulm46dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUU9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rp6mwr7Gru7iru764s6ynm7CnrJuPlpylqaWhmJqOhJJ5iY+Li3ZxfG11cWptalhLRkdFQUBDREhMTE1RUk9RU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhdYWdjXnycoL18bnJednNqd3SFjXd6iYRua4qQd3N4aWp/gnGWkYyBfZV/SZKZbmd3foJtamRseYWQkoZrc2x8bnJ8hmltcH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6MipODlpaYmpCTlpaZlp2WjIOJn5KLko2GkJeAcGpvb29ZVlhUUlJZT1JVVFJYVU1PSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+krK+iraqota+urLO/q7zDv6aimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ1b3RscW1la2tZTkRGQ0A8Pj5BRkZHS0tLTE9SUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFXWFedfluTYmxyYHlraXt2h4Vzf4WDcmuXj3Jye2lqnY5MeYWTiYSNZjF2h3JrfX2DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3t0fn1xcW91bYN/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo6VmYuOhXqEkJiVjZCMkIdxh4J0h4yGenBzcW9wZHBnX1RGSUM/PDs5Oj9AQURDRUdJS09RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUtBSVBIX6mtmmp0cWd4aG1+fYF+d4GDg3dwnpJyd4BydJOHNXCdqJ2NoKGEooV2cIZ7hnx0jK6NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHNycW1gXF1eXFpZYV9STltaWFdMSElGSUg/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7OT88ODg9Ojg7NjY2NTAxMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlo+MlI+AiHxugZCSiYOKh4+GdYKEbJWIiHx1eHhteG53ZGpeSVBHPj83NDQ4Ozo7PT5AQkVITExMTE5QUVNUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SUkNIfm14dXRweWhyg4R4eoGAfIl7dJ+XeH2FgISZhJqcYYaqnpyLg5COeneIfomIjnSLl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1FUWFtVR0pKRUxHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTQyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2epZGgq6CxqK/AsrvEupaOkZOHeoZ2a3+LkYN9ioOOjHiDgXOghIp9fYF/cIF+emh3a1JYTEBFMjExMzc2Njg4Ojw+QUVGRkdJS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklLTU9RS0pUW1dQSGJ7gXSCdHZteIuHdnmFhHuThHWel4aGjZGUpYysqUiGra+uioGAlIuCi4KEkqmIgZiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9goh/h4SLeZScm4mLiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdlXFVQUFdZUERMS0ZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5COlZeSlqCdrKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzk0Ll2WcHOjVUZJS0xNT1dgV2xYWltkhIt+jXt+fICMjnuChY1+l5KAnp+Wk5qZpa2SmbuxprrHw6eLjKGljpOJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4iAe3aEfG12dWZ/lI6GiIiGh4egqqKWiY6Xf3qBiHl5b2dreH58gHVsZV5bW15qXmJnYFpPTE5XUlFIUEpETkdDSkRDQERDQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneCen+Mf4GRjoqam6Sdoaymqq6wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOhICBjIqCiY2Df4p/bHBqXUJANC0tLy8uLzAyMjM0Nzc5Oz0/QkRISU5RUlRSU1NUUlBPSEVCPDg3LzlDPjw8NjMubJOXTVBISkxLSk1WX2F7ZWRpb5OShpOMjYaJipWEj4yaiJ2dkKCoo6Kqk6i1oafBwq3Hr3i5lJp8jaGemYSThYKOoZ+UmZGFioWPmpGWbHB1ioyClYyNjnePhHFthYGKlpGChYhyiKCVhpGJjY+WpLSom4yUooOHkoN9f2tqanyCg4N1Y19lYFtobF5sbF5XS0hOUlBOTExGSVBDRE5GQkNFRkM+Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXmAkoiRkn2KhJiSkIOAgIuMiYaQh4SJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDg1Mjw/UjVISEhMS01OUl5rhnlwfXiWlJKgn5yVnJKekZmbpZulqJ2mqqiptJarvqu1x8i2yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaObm3h6fpSYk6GTl5eBlJ57d5WSqrKIjJaefJOdm42RlZijoaW1r5yQmKeHlo+NgIhsc3N9gX5zamFeYmBiaGRgaGdcUkVKS09OSUlMRkdNQ0hMRkZDQkdFQjs4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Ljo18ioaPkI6BgoCJi4qFkoWDhomBgId3XmJQNDYwLTIvLC4wLy4vLi4wMDE1PkFBTVFSU1FSU1VSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUpNTlFZa4KMdI+FmZ+hrbezoKmoqaSmsamutK+vq7mwsr2bssOrucnLt8O/t6WisLOsraqji5aYhKWmoKOXgaaZjaKqqKWIhZSkoaGqoKSoj5yxi5Wjpre6m6Cir5KinKGdj6Khq66rsrShlKSpiJmIkomVeXp+hoFpYmldZmNfZWReZ2dfW09DSUhTTkZIS0ZKR0ZGSEFLRkRGRkI7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2luWHqEdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GOg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8My8xMTAtLCstMC4tND9DQU1VUFJTVVVWVU5bUEdIRDw+PkZIQ0RBODs8NUM7PUZLSUZIUU5QV3+Pm4GonqqjqrrCv6ewwrSqsb6xtruzvbPAtbu6orjFqLXIx7W9uLSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqivtrqyuqywtaKxrLG1u7a0rbSfpqeippmor6yxuLe4ppq1qIykjpCSn4Z4goV4W2NlV2djYmRhYWdgW1RKRERMVFBISUlESUdFQUBAS0RCTUc9ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiYld5dXGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeEgY5/gYmPhn+GiIaKh5B6eG5dV0BFTjw2OjQ1QUI3NjQvLzZDSEJRW09RVVdVXFdQX1VJS0tBPz5HS0ZFRDs+QDdENz9CSkpFRlZTUF6MoKqgrq67r7K7yMWzucO7srK/tbbAs72vtnSws6W6xKOvxriws7Gzp6S1tqqxoKKXm6KSpbCupq2rp6SYoa20u6Kosrq1vL/Mv8XFvb2zwbe6t762ure4q6uwpK+orL2vvLrBwauYuaeUrY6Xl6mIfoN+bVhkYllsZmtmWFxjWVZTSUdGTFBHQ0hJQUhEPj9CQkxAP01EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWFVadmpwfo6DgI6EbnpzeIdiuaGZo4mUlJaSlJONj5eSh4d7hoGNlYqAhIGKenyKh4Z8ioKBi4OVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUVlYWmdZVGBfTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWlRdkauzsbezxLm2ucfKubrAu7a0urm1vLO5scVgdLGksZqeqr2ppairqqOisrWhq6iflZafmaCupaempZ+klKOnsbSosrO9tsK+08nJ08bDxczCysPAvby+u7u2tK+4trbCucW9wsevnripoauNpKe1iIGBdGFjY19YY2BqZ1NYYFZSVUlFRU1KQT5HRD1LQT1CQD1HPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoOAgnh7i4OHe4t5gYqCl35zfXprZnB1WV5cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhIQkk6RD9IS1NUVVxaW5K2vbW7s8K8t7bIybi1urW3uLK2s7KttbaYZHWnnK1wXqKsnJigopuknqqllJ+fkJOOlpmYqJ+moJ6amYOknq2lqrCtuLC9udTRz9fQyszSzM/Nysa/vsHJvMC8wMDExMTJvsfNsqO6sLSumqu3u5iAfG1fYl5aYGNaZGNRW2BTUEtDQUVGRTxARj9BSEI/Qz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaF9vlpKQlG5sb3R1h7SsoaGfi5mcmYyNlZGakoaKin6IhouQi4h8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWZqamlgZmlpbFptc5atpLyIhmdcb2ddWlpUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWGXtcSutrC5urOvwsW0rriwsLursrClqrerjLWnnZqnmk2ZnYyOn5aRppillYqTk4mQiY+RkZ2boZealZeHn5qnm6yvqLCotLTU1NTW08zQ09XN0s/MxMHJ0L3JycrJ0cbMzcLP0bevw7zDuaS1ucGihHFlXl9fWmJZWmdaUV1YT1BCQkhFQkg7QEM+QUc/P0E3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJncW95eYOhqp6ml4yam5eLjZWRmo59iYuFjYqJipCHfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem14c21pgHBtY2ltcHhpd3x+y77B36dtY3huY1tiYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlqy2q7Klr7Spq7u/sKq0pqS4pqutn6u0o46wrZqXmIyPkpGEjpuBjaaRnImDi4SKiYSLhJSVmJeUm5Gcl5man5+rrKWooqytz9LV0s7M09TU0NTRzsfD1NHGzdLT09fM0dHE0tbFwc7Hx8KovbfOnnxxaGBlX1hiU19bUFFUUU9IPkBGQUJFPEBBPkRDPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnWGhYp3bHdwfX5/oZ6eoYyMmJOTi4ySj5WFeYWQkI2LiYiQhn6Ce3F+gICHeoR1hZOQiH9vdnJrc317d3tzgnhya4BzcmlvcXp5cXq+y5p9i7GEdnKEdmhha11DWlpbVmVjWGRqU1hcXWBjXWN3en2LgZipo6SgnqCnpaqvuKqls6KhraGjraGmsZ6IppqTkpGJj46IgZOJapSijJmEgYZ+kYODk5eti5WNlZmOhpKRnpeosKKhoaWkqcnNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy411cWViYVpWWlRcUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjo8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHN4coKJgJ2VnZSFi5WJjomIjYaOf3iDk5iKjIiIi4h+gnhze32Ch3d/eoaRlX+DbndwbXV/dXh9dIV8eW2HdnRufXaEdHh7nbWMO0GKxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhugIKHkYucnaCckJeYnqOjpbGjpLKfoaWdoKiforGbhZ6SkZGPioyKhoOPhH+cm4yNgoSFeZR/gqmVo4yRiZeSi36Yi5uSq7OYm5yonKe+w8a5tsbO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBnX1tUV1JcV0ZHSklFRT06NzpAQEI5R0Q/RENBQ0I7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhImBh3x4hZeWiI6Ch4WHeoR5cXp7g4V1eYWOjZx5i3B8b296f3F7gHGDh4Fujnp1d318gnR+fIaHr3NYqcK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeouGjZORmpWflYeLk5ugmp2pnqCrm6GamJ6knp+rmYqai5CRjYR8h4eDhYuOn5mTiIOHfmyZeoSYhoiTjI2UjIZ8nImUkK6qlJaYn5mnr7a9qa2+x8zJyczL0MnD0srU19jX2NfV29fT2tvV0Nra0dbI1MuWfH5ra11cUVVUYUlDRklIPkE+PTc6PT87PUc8P0FBQURBPj86ODdEQjc1NTQ3OS81NTY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgoGDfoN7fISYjYeLfoWHgHeCeW57e4aBdHmSno6gdo51gnN1gX1zgIRvgZCCb5KEdXyBhXp2hnuJt8Wkwcm4gZabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJSOl5CCiY6WmZaVpJuXnpWdkpGWop2Zq5WQkImMkYKMhIiIgYWPkZ2bmYmFi4GFmHqIiZ+XkIiNiouCfaGJkYy8oZiTmJmcqaamrp+otr/AwbnIys7Oxc3J0dbV1dnV19vU1tna29fa2tnYztvGiH18amxoYlZZV1dOTEVOQzs9PTw4Ojs9OT1ANj0/Pzw+PT05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs5OjdJUF1bU1VYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7foB+f3yEen6CkYmEhXmEh3t1fXRtfH2GfnN+kp6RnoORe4Z+eI9+eIqKboKagHSZhn6BiYR7fpB6j6mOj8OhvYucpJ19iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CRhIiKkJKTjZyZkpOPlYyLlJ6clKCUkI2Nj4t+j42NioOIkpaanp6Ii5SRnZGBi3+lmIiEjYKFhIGlhoqMuJidkZWWoqehnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuHt8e25saFpiXVRQT0lETEI8PD45OTs6OTk7PDY/PT48PTk5OzszN0RAODM3OD42MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5c3pzbYB+hH53hZuim52Ukn+MiH+Yh4Cbkm6IqIV6oYt8kY2DiIScfZqQioyjoqCQpK+fi5CLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIuGh4uSkouTk5OOi46Jh5WanI+UlpCKkZOGgIuIkYyKiZyWmKKihpKdlaCKiYiNm5CDh45/g4eGpIWMkbOYnZKUl6Gin5qSnJ6osritpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aBygHdqaV9gWlVZWUNBSUM/Pj46NDg6Ozc6OzozOzs/PT43Ozo6MTpHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOjg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNiem1hfpKDb213i3h5f3qBfIZ8e3eGhH9zcIWCenV3dnSEgoR+f5KmpJ+lopeKnZCUl4uKqJdzirKNhKiShJmThZmMopWfmJKIm56jkqmwn5CUkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNyJWOhoeIj5KMjJGTiISJiIWVmZqPj5SShpOWg3+Pi5mHjZCql5aiooiYnpaaiI6Gl5eJhI6MgX+Hj6SIjpOompeTl5mhmZ+ZlJ2bo7O0pqO8wr7HxsXJyMnCy9PNzdSp0tHW1tbY2tTS2s6FdYNrZ2FgYFFLVlxCQkdDO0E9ODM3Ozw6OT02NDk6PDo4Mj85OTI6STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfoh4en56gYGCfnZ2gIJ7bG6Lfnl8d3h8hIaLfoujtKikq7OhlqegpaSWla+ig5C4lZKzmo2hoIykm6+ipJ2YkKeXqZmtsKSXlJWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcl4WIiI2Ui4qSj4aAhYaIkpiUjIqTkoaTl4aEkZCcc5CYspWWo6GInJmTj4qQipaaiIqWjYZ9jJifipCQnJqZk5mYoJSgnZWfm6GxraOkuL+0xMfEvcPDv8bOysnSp8/M09HQ1tjSz9i8dX15YGNXY1hSSUtPRUJDRDU+Ozc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NTI3Nz9ANj8/Nzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OklFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXFxZSmhhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9yjHp9gXt4houJhoSSqLytqbO9sKWus7Opo6KwrYqatZ2juaWVraSXqa23pqSjn5mpmKqkr7GqmpmclJWRmKCXmru7rcqhaba3qrCVmJ6iq5KXvaReqbKCiYmMlIaQfI6NfIOFjY+UlIiHkpaLjpWNi4yXmJGbmbSWlKqdi5yUkYyQkouYmomRnY+Lipafoo2VjZeZnZOcmJ6UoaCUnJ2mrqiipLO4q8LIxLa6vbzFyMjC0KHGyc3NxNfW0MrTo3N9bGBdVmJUUUdEPjxDQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicEpAi4l/gHKGh3yBiXWCioN+bX18fH5wd4d3jYGHe42QjIaMmqvDwLC9xryztMG8tKyrs7aMqLKtrr2rm7ujqK25uKumpqKipKOqr7Kxqp2co5ibmJieoqalk6O5r6i/vKytsrmlo6d9iIacrb2wgouLipCDj4ORjnmBhpCMjZuHh42WjIqUlpOQmZabp5qxmZCqnI6aj5GOlZCPlZaOkKCQiJSbo6yVlo+UnJ6UoJ2bmJ+glZufp6ekoqSws6bAxsOwsLu2xcXDv82nx8PHw7zV0MzEyop3dmVfXWJeT0xDTEBFRz9BP0I8OjQ+QT09NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFSkhOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1tdXJOMjIh7h4uGg4x1hpCKgW9+e4F+cX6BepR6kpSUmJGTlai0x8nAwszCw7nHvLqvq7m7l7K2ubLBrqXApKuwvLyqrqujo56nrK+1samboKqcopyWn7C0p4yjurq1wburqJyypKSolISOqcTEpIKLjoeIhIaVlIx5g4yQjpGgi4uTkI6Hl5+XkpiUlqWgrpyMqZyOlo+RkJSVjZCUkY6hk4aXn6Cyn5SblKChmaSfmqCboJSZn6ekpqekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnIwbV4fHBfW19tVE5JRExMTEpAQT1CRDw1QUQ7OjM9OEIzMzIyNjNBMTVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qajZaKi4iSj4aJeYaTkIFygHuMf3eHgoGPeY2hlqiam5i6vsnIysLSycvCzb3Bs628v6e6v728xLiswamts7y9qrCqpKWjrK60rre1oJ+un6aimaO0vamcqLzBo7a2r6uTsKyqrJaGmqqnpZGCjJKklYmAdYmReYSMkZCdn5GOkoqOi5Oil5aalJOhnqmekKSZjI+Oj5WWiHyOlZKRopqUoKKctaaQoJelpKOln56mmJ6Vl5ylo6ioorKtqLvAxK+ls7fMwLquw7O7vcG5rcLCwb+acXxkW1pfXkxNTktHRUNIQUFBREs6NERIOjs0PDdGLjEyMzUyQTI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGVYno+djpeOnpKJin+In5KEeIV/lH5/kIiJkICWoZqtp6SYw77JxMjG083Ozcu8wrewur20vcu7xMK2tryttL+5vK6vqKGpqLaurqmyt5qerKKoop2rt7eqpa++xLG9ubOnqrSzra2WlaWtqKCRjpKxxaeVjnyRlXyGkJiPqZiXkpKOkpSSpJySnJiToKGhm5iel4qLjo6diFqPlpeSlqSZZpmjnrOllqKWrK2sp5yfppeYlpiVoaOopp+1q6m6u8O0prS1y8G4qrass7u4rqi4ury3hHBxXVtWV1BHS1ROSz9BR0RESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmRNRqaUnJahl6iWjJCDh6WSiIGHgpuDg5WQkJOOmqKfr76uoce+xsXIx87Oz9LKvru2sbu7vL/PtsS+t7m3s7K1s7izrKecq6y5q6mosLCYo66lqKSltcGwq620vsO5wLmzp7i0t7KvlaStsK+li5OUoI1zwZl9lpmEjpaZi7CVmZmUkZGZmKSilJ6alZmonJqhn5iJi46UnF9KlpyalJmkl1SWsJ+vnJ+lla+vraaboaaUk5mYjp2fpqGZtKmqs7y8u6uwssfAuKasq62xsaOhsrK0pXNyaF9dUVJMRlFRUFE7SEpIRkdBQz05S1Q/QTo9RU0vNzUzNDpCNDROV048SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTdGJWRkirl5mfoaiumJCXh4qnlo2IkoWfh4Sdl46doJqjpLXJtanHvMTEycvJyMzOx766s6+6uMDBzbXIu8G5trqyr6+ztKeknKu0tauqpq6smqStpqWprLq/qKu3t77BwL63srLDsLe9rKOuta26poibl6Wbdb6fhJmdjpKYmouulqCbmpaUmp6fqJ2mn5mZqZmgpp2Wj4yQnIJtdZKimpWcop+QrrKiq5Wpqpiqr6aloaWqkpKZnImVnKKelrCnqaq6t76zsq6+ubago6eopaacnK2pqY1maWNiVE1NR0lPSlVMPUxETUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJScoZ+7rpiUnouTqpuRkZOIqo2Hop6Mo62Uo6S2x720wbvCwsjJxcLOyMK9ubKvubXAw8q2xrLBvLW7rKmtrbGjo5mqtbumqqesqp2or6ikq6q+u6itvbS3vse8trW4wLC9v7Optbesv6WPopeQoZ+8nomaoJiWnZ2Otp6om6WimpugmaeksaCanaWcp6mcl5OOk5uKlomMpKGUnKKfoLWwpaaUsauaq62fn6WkqpKWlaCEkJ6fnJappaGhs7S7tq2otbKynpyjpZqXlZmqoZ54ZF9hYExJRkhOUUlORUZGQlFKSEBER0FWU0RIPEFHUTE7Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRKiXpJ6fw6ybl6SXmaiblZqajqqWlaimla2smaKrt8XCvL+4wcLAyMS/zca7vrmysLm0vsPItsCwvLa6t6ekq6ytoaGbq6vEoqWorKaeq6+toqqovrimrb6wt7fHt7S4uL6xvsC2tLK1r76jlqOVkpqTrZ+QoaGkoqKekL6kqJ2oq5ycoJqln7yil6OeoaiqoJyVjZWek56HjoSNk56koJ22rKadl7OnmrCooJyrn6KNmpWfhI6hmpySpaWal6uxtrKqpaqtrJyYoKCSj5CWqZ+UaWZcYl5QSkhLT0xIRURJQD1PSEA7RklIW1JQSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE6im6ObnsWroJ6rnZytn5Ginpakn6aqq5e2saOqs7bFw73Atr/BvMnCv8rItri1tLG0tLfCxre/sbm1uragp6yrrJ6foKWkwaWhqq6gpKmtsKKmqL21pbG8t7a2w7Kyt7q+ssPAuLittLS1o52klJGToKyfmKGdqKiqoprCrKidq62amp2YpZ+9oZykl6urq6WgmY2aoJKeiI5Yf5afpqGguaqnlJm3o5+zoqGcsJihj5qVnoKPoJeWjqKjlZClrrKsqaKipaSVlZyYi4+Sk6SfiWNnXGVhTUpLS09GRUFHSz49SUE5OUpKTl1RUUk9TFZdOUZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQnqCgmJ7Dp6Sis6CbsaeSqqOfo56tqaydu7GprLWxyMTBw7PCw73HxL3Eyr2wsbausbWwwMW1urGxuratmqmwqqqbn6ahp8KtnK2xnKmirrGqpKi9t6a1u72vt8Sts7PCv7LGs7q3q7S2raqippWVk6KroZ+fmaeqrq6vu7Gln6mpmZiXkqKjt6Cho5GurqukpZ6RoZ6UnY6QjZSdmqOfqLWnp42ZtZyjr5ugnLCRoZWYlZuAkqKWj46goZOLpqywpaeinaCekpKak4WLko2cn4BkaF1oZktKTEtTQUNASUc7O0Y+ODlOTVVfUlNKPk9eXj1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9nckA4PEiWd2VBNJ+knpqgwqejqbGgo7SplbGrpqKksqytqbuyrbC1tMe/xMO1v8S+ysW2wMnCtay1qbC5rMDEtLivrba6pZmrsqyrmKGnmK27tJyosJusn660sqequrKmuLO4srnBqreyw720xae+rq23tamnrKGWlpGlo6Ghl5ekrretsbS2n56opJmTlJOjoLaipKWVrbGxpaikoZ2ZmZqVmKign5minq+zoqaNmK+apayYm5+nk56QlZmahpaglYyQnZ6Ti6mpq6GnoZqelo2PmZCChpWJlZ96ZWtebGtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUJXYF1CSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWpWQ1dGjHlmQzukpJygpb+mqK6uoKm1qp23r6ujqrS2sLC4t7C3uLjFvcPHvbzDwsjBusHGwbqqtqWtu63Bw7i4qq2yvKOVrbCus5emqJGquaqhp7CdqqCvtLOqqra1rLqrs7K6t6y4sMG6vb+mw6qwtq6pq6umnZiYqqChoJGXoLCus6qwuJmbqZ+ZlpGXpqC2qKWioq+ws6uxp6ufmp+fm56lnaGYnaO0sJyfkZSmmqGpnJakopiajJaZlJaXnZSJkZuZlI6pqaefo5yZm5OHj5mLfo2Xho+abGluYm5uWFFRWlRBQ0RVQDs7SEA3OlhQZF5RV1dFWV9eTkxTT19MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOG19aFxWOol7Y0M9qJ+coam8oKqvqqKwt6mltLKroa21va+zuLy7vbe3wcK/ycO5xMPBwLnFvcG4r7aoq7eyvL+/tKqvsrifl6utqa6YqamOp7ufpa2zn6uisbCzrKq1s7W7rK+xtaywtbLAusW2q7yvsbesraqjsaWepaieo5aPmJ+yqbKpqbKZnaebmpSMn6aktK6noqysrbCnsquxqaKbnqiknpWhmZyotqmYmpKSn5mfoaCSrqGbmoiXmYydmp2Ui4+Xl5qXpqajoJ6XlpaUgJCVhHuPk4OMl2dtcmhxc2BHWWZWRENNWERaOUhCNj5dUWhcT1pdR1teXk9NU1hkSktDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKWZn6SrtqOsqKSurbWpr7O5pqewt8a3sbe/wcK2tbrFvszFucPBusC6xbjBurO0rKq6uLu6vrWrr7G3mJioq6usnK6rj6u9nauusaOqn7Gts66utbG5t6qtr7Kotq+zurzJs6q1tbG0sK+nobOfmqisoKWVlpqZsaKtoKWvlqKkmZmSjKKlp7Kpoaaxq6m0pa6vs66jmZ6tp5uXnpqZrLiimJORj5icoZmYla6hn5aClZmOnp2al5GKlJOemqWjo6CZl5OSlnuMkYV7jYuDi5Nsbnlvdn1iRmBqWklIWls9e0pHRTZBY1RpW01cYUtcXFpSUlJiYUxLRWBhYVFNSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUTEWalp+wqLGprKSjrq21qLezt6OstLfJu7W7u8C+tbS3w8DMx7zDvbe/v8G4wL2yva6ourm4t8K3rK6xupaXp66sqKSyqZSvu6SssrKmp6OytLGysbWwt7Oprqyyp7ivtbPExbaptbWrsK6qp6O2n5+msKCjlJuZlLCep5ufqY2pop2blZelpaS3p6Kws6unsKetr7SspJihrKicnJ2clKq5nJWPj4yYnaKYkZmopKGYhZSXkZ2cmJeXiZeQl5uonaWhkpaSkJZ3hJGGfIaChI2NbnF4dnyAXUxlbFxLT2RdP2J7R0k4R2hXZVtNXmJNWVlXVVhVal1PUEhhXl9QS0dRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGcyNydGYUxWJS1CLj1FTFE8M3JqTEVEkZmkraSsraqmorCxsqq3sLWfq7W5ybmuwbzDuLOytcLDzsTAwr61vsDAu7+9tMSpqrmxtrfAvK+stLSeoaexrqWmsaWesrWsqrKwq6iotbqstbK1q7StqquprKm5rbKwx7+4pbmwqa2tpqitsaWko66jqJydm5qvmaKioqOQrJ+joJ+hqaaluKSrtLSkqquprK61rqKco6irnKCZm5KktZqPiY6IkaOhlo+Wn6OXlYaQlZSem5mXlYiYk5WZp5ygoI2Tko6ReH6PhX18fYeKinJ0c39+fl1TY25eTlpnXUZElltHOk1uWGFbTmFiTlZWVldVWWheUVNNY1pbVEtGT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RkOzYqSGRISis6ST8zQ0lTLD6Pa0BISZCaqKmhqbCkp6Ozs7C0tbCwoKutvcy7rsK9x7K0rrTCw9HExb/Cs77Cw7y/uL3FqK23rLS4vMCxrLKtoqSnrqqopbGjqrGqrqqxrq6sq7O7p7ewsqmyqqumpaSuuqyqsMK5tKy5qamoramnsaWppKKuqaiinpyirJWlnZiemaydoaeooaymo62strCxoKmioKqtsKydnqenqZqjmJmQoKiYhoSPi4ufoZCNj5iekpKIiJKWoZ2WmZaHl5OTl6Wdnp2MkpCOin9/iIV8d3+HhYd1dHKJd2xfWV9uYlFzcVxLO4R8Rj5XdVdhWU9jXE5VVlVXUVxiX1NPT2hYWFdLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTM5ODsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLkpnREY4PEIwNUVLWDFAlF1ATkaVlqynoKmxnKeosLWsuLWtqqSqqr3JvLG/ucOvsK2zxMPNzsO/wLPAw8S6wbTJxKyvt66zusC+tK6urKepqrGppqmxprStqq+trbGusq20u6W3s6ysrqiroKOesberqq25tqS1taSqp6ysqq2gqKansbGkp6WhoayWqqGTm6CmnqOiqqOsop6msbasrKKlopqpqq6pnKGlpKSZoJmWj5idk4GCkImFnaCNi5COnJGTjYWOmaWbk5KbjJOSkZSjmpyai4+LjHyGgoKBenWBg4F+dXeLood4al5fbmZXZYdkTkBnkkxFYnpXYlhSZlVNVlZVVE9cXWFWTE9qWFZWSEpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIdCSUlElpCupKGqr5ioqK21qrWxqqWrqqm9wMC4urS8taazr8TJy9K/wbu4v7/DusK6wcSusbWytLzBvrOxr62srae3qqWtsKu4rqewr66xq7WqtrWntLerrKSqqpyknrSzqKiks7Sfta2hqqirqKunn6urqLm2qaqqqqKpn62bkaqhnaCkoqaiqp6cprSup6WpoqOYpKanqpyipKOgmZifkY6PmY1/h4yHhJ6eiYaMjJGRk4+FiJajmo6Om5KSkI+Sn5iZl42LhIB0h4J/fnh1g397eH5/iJ2PcHFmZnB3XGF0iGpPXZhWSG15VWRWU2RQTVVVVVFPWFtiVklRalVXVEdPWFVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UyMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyQGY9Tlg/Qyw/TFRfL0lrN1JGO5WMr6CkqqyZqaOtrrK0r6qkr6mou7+8wbKwua2itq/Ix8fQwL+9urzDvrvEwsC/rrKzs7a9vMGxsrSrtKmltamlrbOyuK6hrLSxr7G5q7muqq63q6qeqqugo6G1raihn6+yobSqn6inqqKqoaGsrai9rquuraGnqJ+smY+wopiioKinnqebmamwqaKfrKKhkqGioqeZmammmJiZnY+Lh5WIfY6GhIWkl4aDhI2HkJCShYaWoZeIkZ2Rk5CNkZ2VmI+LhoZ4dIF/fXR4eoB7dXR7a4KHpHZpXmVrgHVniIt8UlZwX0t4c1RkU1FfTU1TWmZOTVdZZVlHU2pSUj5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzOPjbGgpKWqo6SirKazsrGopLCnqri/wb2xqbqqp62wycbH0MO+wL25v8C9ybzCuLGwtbK6vLnAs7W8rLmso7Smpquxtbexpaa5tK20vK+8pa2ttqutnKmvpJ+krKqonJ2qsqSzqJqrp6mkqJ2iqaepvau0sK6dqaSgr5yas6KWpJulpJ+lmpqoqqWemqmhm5GboKSdmZapqpGZmpOQi4KPhX6Qg4CIn4+HgX+NiJKQkIWClZuUhpOhjZSRi5Gbk5aHin+Acnp5fXtndnx7dXFyfmqGeYWIZF9nY3KFe21neV1eVkJXe21UYlBSWUtMTnB0XUlaW2hZRlZnT0M+S09EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpGwmJ+fqaSioauktrKxpKmwpq25wr23saS5rKmosMLIyMzCt72/tbjBusi2w7W0s7Wyvbm6vbauuba/rKKzpqqqrrS2s6ibubuosb6yuqCutLapq5+tsaOcpaipo52bpbCmr6Cfqqmnoambo6igrbynrrGuoaqipK6enq2mmJ+aoaKbn5uZo6qimpmjo5WWlKChlpuWpqyMn5KPkYyCioCAj4F7mpWNin2AjIeRkI2KhZOYkYaTo4qSkYeQmZCUgYh9emx9dnh4Ynp6cnBxdHhqgnVrgmdjZ2Fuc45tYmpvX3BBXXlrVl5OUVFLSU1TWVZNXF5sV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl0+I5GWrJifl6ejoZ+no7evraKvr6isuMO7tK6gua+rp7O6x8rHv7jCva+0v7fEtsOysLqxssC2u723qrm4vqqktKaoqa+tuK+nl7i8o62+tLShrbi1p6aosLOgnqWlp6ClmZ6sp6ieoKqvp6Cml6Kon7C4n6Oxr6GroayknKenqJqbm5+ilZycmp2pppabnqiRmJKZnZOZlqGqkZuKjpCHfYd+go58fKGNjYl6hI2Fi46NhYmTmo6IlJ+JkJWCjJeNkXyFfHRwfHFzc194eGpvcXFwa4BzZHpsZ2VjYWaHgGBbcmpyTU6AaVhaTVFMS0hQUlBHTVtfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56ho6C2q7CjtLOpqbrFt7OuobitrauvtcXHwLe/wrmwtb23v7u+sKy+sLO/srzCuKq7urinp7Snp6qvq7KvpJe7taSrurWvnrG5r6mlp6+ynKGkoKSjoJabr6WhnqKor6GgoZKjpKK2sKGmsaufrKOumJ2qpaifmJqdo5Oam5qdpaqam5ullZSXlZyOk5eiqaKRiouQhnqEfoSLeo+Xio2He4OIhImNj4WPk5iMjpWZi4+WfoaXjI96gXtwcnZub3NeeHdlbGxsa2qFbmZyaWplaF1kc4FgW2t2aVpKf15bWE9PS0hIUlVHMzldXmxQRVlVWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFRdaEQuPDJkVywylKGhlpSbqpyjoaKhtqmtoLu3pay+xbSwr6O1r6ysrrTDw7yzv7q3sbO5uLq4uq+uwLOzuK+/wLetvbq1paKyqaepsamrsJ+Zv7Skp7S1qJ6yvKmopamvrJmip5ykpZSXoLGkmZ6kqamcop+SpKCkuKmkp66mnqWhqJOgqaKhoZmbnZ+RmZuWn6Gqm5qYoJSRlJeajpOTpKikkImKj4Z6hHuEhn2djYqLh3uChYeIipKFlpKSi5CVlI6NlHuDmI+Ld358bHRybGtzYXd1aGhqaGdwhmhoaWRmaWlgamNqaFtme2NgU3RUXFtSTEpGSU9TQCEqaF5pTERXVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp6ipJGOpKeZnJ6do7Ssp6q6tqesw8G4sayjtq6nra63wL+8ssK2sK6ytra5tratqr2zrrKxvL+3r7u7saWftamlpLOmqK2cnMCqp6Wvs6qstbueqaqrsaWYnqqdpqSRmKWsoZidpKmhm6Gblp+dp7WmsKquoaGdnqGVoKagoqCam5mbkpidk6WdrKGXlp2Uk42Vl4uPmJupoJKJiouJeYV3gYKBnYeLg4l+gIWIh4aRhJeUj46PkZGRjJN7g5WPhnN+fmZ5b2pqa2Z0c2tjZ2RkdoFjZWZmZWppY2tyW19ZXWxkYU5pWFpgVkpHSEtNUlg+OV9saEhDVVRdW0lJR0ZBLjw/OUE4OVJHQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyssMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao6CPjKyhlpaglqSzsaKyvbahscW8u7Kxo7esqq2puLy7uq3Asa6urravs7izqau5sa+us7a6tq+4vaymnrSpn5+voqitm6G/n7CjrrGvt661nq2vra2imZ2nqaWflZqnpZ+YpKKonZqfmpOcnqyvprqorqKhmpuemZ6kmqSdl56Ym5SYn5KolaqnmpOampKMlZmNlJSbqqeOjoqKj3uCc4GBipiFh3yJioaGioyJkoWVm5OSjo+Rl46Qf4CNjoNvgX9meW1na2lmcHJrXGdjY3SBYmZnam5sZ2pqaG5dbGxycGBUY2ljZllJRkxNT1hSUVVhZYBVQVdTWVRHSUZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlBMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY6vnZiToZqpsa+fub+1oLTCu766saa3r6etpLe4t7esu66sqqu3qrO3rqaytbKuqbC2trCztbqmqZ+1p5ydqKCnq5qnvZespK6wtrWsrZ+xrbCpopuco6uom5SbpqOdmqmipJaan5uQm6Sqq6q8n6ekoJiamZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJiagJaKopB5h5SNg21pf3eDcWyGi4Z9hYyHcV5jYWeEmIVrio2UknR3i4R+g5CAZ4eAZ3VoZVdcaHNuTVBpY2dzhWhfZWZubWpdYGGKj4OEZU5LRDlHVGheSkdQUFVVTEhTYXB0ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsLDA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoukmYaVsJuak6Cbqq2qo73Fr6m3wre9va2mt7ClqqK3s7KysLmsqaastKavtKKpt7a2qKestrKutK2zoamfsqmdoaOZpKWYq7mTpaWvs7etrqWprquspaGenKGnppuWoKWkm5unpp2Tnp6Xj52nqaS2sKSjop2WmJeXo4ihjpKahqGHk5ygf6V/paqekpKakYiEc3iNjoWIoXaKjWmXiGZ+c3igb4iHhH6PfX+hoKCZgH2HnnOGjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxcIhZXmlbbGxbiHJuenKFZoaEWl9HTj9HX01FUlZWUVFSV1VnXU1WSFJST0ZIRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKp5eDnKudmJidn6qpp6q/w6+xury2wL+qpbewqKylsrSurrK1qailsK2ltLKbrbW2taanqLKwrLKnrZ2poLCnn6OimJ+hmqyzk6Olpba9pq2nq6qsqKWhoJigpqOZmKWio5icpKiWk6Kbk5Kjpaaht6SkoKOYlZOXk5yIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZzGeXixpbeXZYDAnL95hIV6koR8kJCRynKXu5zFenK1p7qQe4BtlrGrsHlobFixrm5labySvG5nem9yj9h+U2tjtrJ+gXKUc5qhqpBXT1diT1ZORlVbWFFRU41dV1tRQVxEUU5FSEk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKeTgaeqn5ecnqWssqmwwr2ytcC1tr7Bq6e0rKyopq6zqa+1sqanpbSlp7itnLOytqulpKexraywpqqdpqOvoqCfnZWZnpytq5Odop+zuqOqqaKtrqWhnJqaoqefl5qnn56XnqankZymmZOdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUca6hpH54u31soZB2sV9qtFulgGWckWBng3tnf2p4a6llvnFnpot1sWp7sXh0kpRjbm2nbluEoUVoZoeWRXWcYH5nfKSnglpgjKtogJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOik9XVy9JVFNKREZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MDMuMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYOtp6Weo6Sqsbestb2/sLbEsre6waapsKquqKiwrqOwua6jpK2yo6m4p56zs7CjpaCprK+rr6annqOhr5qhm5aUlpqaq6SVmqGftLOiq5yjra2gnpmWoKKonJido5+bmaGmpI+copmXoJ+qnqamoJqgoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH5rgqZ7goaIk5STd6tna7Fcq3qNhpR0iXKPh4B/iJCXeIKBi5eLg6CPhLB2d59xbGxsfItOpFhIYmKZfmNopmB5cnVTk4deUaltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrJ7WFhBI01oRkNFQUBBMTk+ODg6ODQ7OTk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE9PFN9bjMrWGpcT1hNX2dXN0o4YVU1MBuUoJWIs6amoa+pp7Ksqbu2wrC7wa24t7+prK2traWssamgrruqoKezrKOrtKOmsrKno6Kep6qxp7CnpZ2enq6VnpmUlJSXnayhmZmkqLWvoqqPqqiqm52Vl6Clp5menaOfm5+jpaOVm56XmZyiqZummpyboqCXk5GSk52D1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46IpIOlgnqseY+dVq96iH6farlauXaGhH6mgpR7l3qqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiFgIl8Y6QzQp12XVBqaWNQQFhnWmRhSkhNcVBcUU9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFQNzElm6KUmLKoqKa0qqW0qaS8t8Gwub+xtbS6srSnsK+ir7Kln621qJqnuK2ir7Cfs7SwoKSen6apsKi0qKOanJ2qlZiXlZWTlaCpnJmWp62wqaOfj62jqJadlpuhpZ+XoaGioZqhoqebnqCelJiapqCbp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52Non+RoaZ/sXaDkdLSdlyue4V/pG+bqqZrh4V9rX2YmY57sXGSno54s2WXdISeb55nlFHIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPa2BsaFBWR0o5PVVSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTDYyMKKdkqWxraOrvK2mtKantru8srq+tra0ubiypLSyoLCxop6rr6OXpritpLGwnLS3qaClnqGppLGnrKmjmZqZp52Vk5eXkJGhpp+Vk6WqsKailpOtoKaSlKCbpKWelJqlp6Gao5+tmaCenpCVm6GdnKWVnZWaop+VmJWRmoWse3eodqONiIapb62KgqeDmJihiZKai6J/k5qJroV/grNccrNSrn2CgqR/cdd9eIV+j52Gmpl2r4aHkZyHd7RhmmWagoKVbZJasFhLmnWYeWZgrV52d4homIhsXa93lZ6PeGw1eciusl9CVG9eZ2BFUGxgcG1WVk0uZmVpU1lQO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEg6OTmgnpWgubCXtMKtqLOoqbK6t7O3vrm3sbS6tKS3sp6zrJ+fqKuelKe1q6ivsaqts6ObqaCfp6G1pqapopidlKSgk5Kbl5GUoaSakpCmra+moZWZqqCjj5GhmKekoJSapaidnKSerZ2hnJ+Mk56anaCXmZuWl6KglJePpp2GqX19pXihjo2CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTYf3aIdKiBjpuMkqR7lI+fhHuyXp1koH6DlW2SXatbWpOAkX9oZ6pkcnuBa5iHc16rWomgjmtvZU9KQ6FcW0x0XWJnTlthX3JzX0tXN0qbllhIRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOj4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amsGrl7TCrqutqaW0sLewtb65ubGwtLmourOfr6SdpKamnpOpsKmvqbSrqa6hmKCgpqSjuaKiq6CWm5Ghn5STnpmTl56fkIyMqLCwp56Xm6imoIySpJamqqeUmKmnnZ6goq2koZ6gjJShmJ+fkZ2XnJWeoZWWjaqcj65tcrRzqYt1iqdztHhzs4CRpKOSnI6JpIeQd7hwjXuLomprtlqhhWWXl2mhoqdtlHK0dJOZfrJqhZGHrWp1s2GdZqJvh5Nrl12tYE2hfIeRUnOjbHl/fm+Yh3Jdr1Y8nHdmVG9uLlynT2NTa2VibVpjXWFwe2NUW1I+PW5wM0NCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKacm568oZuywK6tq6ynt6m3r7W/tLuvrra1qsC1qKmhm6WjoZyRqamntaKyp62poJecp5+kq7idoqyalZmOo6KVjJ2gm5icn5GTlKq2sKiZlZysqZeMlKWXo6yikZarsaOfnqarsZmhoo+Yopafm5WclqGTnamclI+qmYfUkpq7c7DDgMOGfdWWm7h4iJCYjJeLjKeIeqS2dX53dsKCmrJgg7p5wHx1uGO1gYyHqX2VgaupcXt/dLyIp6BpnWGmjq+hfox1h6p9vm9zvHSyg3V4gYpumohybo2kdL1ed31aYXm8a1pWXGp5XmphZWdjbXhvWVxaQ0BAc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQj1FODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivaGXssOwraqrrLGnt6+2w7C4sK25rq3AsKujop6joZybkKijqrKktKWspJ6VmqqYpqy4nKKtl5Sfj6Sfkoycop2XnZqRlpKvubKslpikqKeUkJakm6OtnpGgqKufmp+oo7SfoqSOp6KUopqcl5WjmJCvn5KUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahxgHORuYN9h4aMh418ioeNmHyku7m9nHR5tKN0d5d2dLB1mZ5mh2qNtXRycXe2jF5/en2JaIN5bnpji6xwdYV/WFunakVlWlRmYGNeY1FnZ3BsdUNOUU1EOlpNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlNZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzkqT15dPSs6VlUnPjs8p56hosCllrXDtKyrqKyrqbqusMWts7Kttqazt6upoaGlnqCdmZOqo6yppbWnp5+blaCjnaukvaahqZaTm5Chm5GPoaehkpyXlJiUsbW3rZmepKSii5KSppulqpuVqaWlm5mhqKWnpKqgka2el6Sel5eXnZ6Pr6iTm6WhjWp9aZuld4ZyfZqOdHlkh3u9vsC6b5ODcpaIYXNrWl6biWBjiI+Va2CAlmRunndjlmyAmpWUZV5gYnCZiGlyi32GlWdrf3J0eH1/Ylt3dIFoUFxtg317i2tYa3qCc0pKb4ZwTnRMRVhdZ2FMW1dnY19PW210aXFSUURFTTtHST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTX1Y0KVBfTCgzPltPJz8yPqmgqKLCo5u1urajrKWup6e1sazIq6+yqrOivbCxpZ+ip52jm5mZq6auo6S0qKWbl5SgmqWtqL2nqKSUk5uVn5mSl6SpqJCekZCYnLCyv6ycp56noomTkamaqKOamqugo5mao6eso6Cropqxm5SnoJaUnZ+dlrCkl6CnmJuQnJyhoZekoZmcmZmZj5WBZ219cXeSmJSShoy2q42GmJWOioyYloeUlYuEk5SSiY6TlJiUmJaZn6GZmpOgnI2CeqWFbWt9kH2AdYqKgXGCeHl2dYl/fIpqc4F0g3Vld313a296bV9kXXBoTVlaZmpgV1pveG1tZlVQRlM5T1pNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzobOiwKGksrK2oKmlsqelsLSqyKqsr6W0pcCns6CdpKSco5WVn6qmrKKjtqufmJaVn5etqaXAnqujlJGbl52XkpShnp6ip5OSmainssSwm6udq5+QlpaonaqcnJ+smKGbnKKkr6eipaefrpiXp52ZmaCenZyvoJyhpZSWkZeTnp+UoZ2XoI6Wk4qKjY6XrpB8lpyDkoKLq6mFgJmXiYSQnoh6hJCIhpqSiIeKlo+bl42Ql52jlZiSkJyNf45nobOvhYqFdnuSin13eXpvZnmPgYCJanWBeYhzaXN/e3aDh4JqdWR6ZmBqZWNkZmtZbHtvaWtdU0xQRF5URkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9iY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RcUTA1TlsxN0U0W0c1PCxAtKC5sL+srK+ysaCqprKtoqyzr8Svqaqisa27orObn6aioZyYl6elqaWkpbK1npSTnZmZr6WtvqCropCRnZmZlJGVoZyXqJyEn6uso7TItKCqpKuXlpeapp2pm5+kq5Sen52gqq+ppaOroq+bn6CgmKSenJ6crqOYnqeSlpWbkaOXlqecmpZlgpJ8ZX6NmpBjeY5taGt7kqWramWbmH1nhoplZWloe46ij2xojZiRo3draoqYop6Xc2tteoSOiHpYZl6Gg15tjIqBdlxoc3d2kYCIgm13gXh/c215hHR2iYiPg3xqh1lebHRkXnOJaWt8cGtkX1JOWElkWEFKND5GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaagur26r6y0saqlqK2usKatrbC8sKimo62usJ6rlp+jnaGZmaaqnK2jpaepsq2elKOPoq+ltrmlrqKOjpqhmZOSmqCZmaWVfKauo6i0xLiloqevn52VnqKeo5yjqaiSn6Gdoaqwq6ukqqCqm6efp6CslqCbpa+jlpuplJ+bmZGjlZypl519vYOIcrRyhJ2GrWh4ucS4cZSjo3qmmZlyq4J8y8DAu3GMo4iDnnyXmYmdwL2Blp2djJzBwXyCfJONmsPAfWylsm+MgW/Ken+bdpCDjoF1eYCAeXF6f4dwd4WMk3lteJRjZ2B4ZGBlgmJec2dsZGRZTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhDQ0JDRUhJS01OUFNWWV5fX2FfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtbCwwKmolKOvqLCuraays66ppKWmr6qeq5iaop+cmqqmoZyroqSoo6S0pJyikqWtq7ezp66ikZCZnKWSkZ+hmJugnYinraWrrsDAsaGpr6mWkp+dopmipKqjk6CinZ6tr6qtp6OjqKGlpZ2sqJGjmqisqZqcp5uqn5SWo5SfoZWbf86UeHqkgXmVlptfro9ejqiCo6F8p5abc6uDgK9eY42qe6iHhaB0l5OIs2OCq4agjY2zaoSvdX2XiLdhg61ao81ukHZ72nt/mXB9h5J2fWV6h3Z2a3yHbn2GkZF+bYOQYHJtcGhgYHpkXHFnaWRnYFJUU1ddS09ENUFIREQ4PjY7QD9BOz03QD4+P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqets6umsqurqqKrpq6qn6abmaWXnKKvn6CeqKeipaCfsKuanZWmrqywqqirn5SRmp+kko+epJeep6Ofrqassai/x7OoqbGulpKdnKGXn6mqn5Whn52drrCprKqcqKiloquSrLKWpKGqqZ2ipaSfrp+RmKWXnpmTk5GXoHGFjJd1haiGcbF9nnKsf6KfgaWPnnargn2tf5xzrX+sh4afdpmSe3yXfqqHooySjJ1+q3uJlJCfgHutV53Fe49wk8F9gZVtdW+MbWV2ZIVuYXducm+JipKPg26SkWZwdXVxYWdtZV9vaWlvZ2RYVF1hWlJTQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXlxbWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08KD4xKTNXQEYhHEc6QzEuK7DTxsaytKCdo46joqKsr7auqLGlqKmmraurpqGjnZmilZ+lq5+hpZ+oqKKenbCsl5qWqKeuq6emp56XlJmioZKUoK2bnaeksK2lrbWrus2xraauq5aVnJ2imZ6urJyXoJqen6mzq6urm6yrpaOsmq6xoaerraWXpKmnp6+gkZWiopiTkISkaqR1iXqpdHqycIKmipmMcYmgm4ekYGBSq4V/roObdq2CqIaFn3uZl4V6ZoCjiaSZhoKjfal+gpaHrl98qVaeo5KBeqOfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoJunJVxb3p4eXBtZ2VlcnBmfWpjXVdgalhZVU1NUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmFhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioyUEtMIyBBOUQ0LCfDydbUv6GZq6egr6KesLSwrqmsoqelqKqrqaSmoJuknp2lp6ejnKuZoqygo5+voZyakqukta+uoKeanZWTpqKRm6KooKCmnbGmpqmyrbfIsrWqq6mWkZ2copmgpbOdmqGUnZ+nrK2ksJutq6OjqqGyraGpsrChmainrK2zoZGUoaWWmZB7qmyehId1q3l8sG+CpYyJn5aWoJWB0ri0uMmBgbJfYJSpg6WIh6B6mZWaeKrJdJmklaipkZOajYGciprGxnlnoYKldIGfjoJ9r11wtGKwdUujh22nR4KTZI+QnpF8cZmVgXF8dX58blxmanNxZoFrX2FZZG5cX1lJTU1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqhpZqnpKmrqqafpqaYqqOfrqudpaCsmp6ppZyntp6il5OpqrWyrJulnKCUj6WskZqcp6OhqqeuoqWnqrC1w7GzqqyolIqXnKWboaOupZehlZmcpqatnLGerqmnn6yjtqygsbiunZqtprCxsKKSlqahmJ6Ngp1OeJqBf596hKN9g6SFh6afnZ+UhLh7e3m5gn/MxsK2eJuhkYuffpqWl4p2n5eKpZikqX+whZ2GoISsfZqVY6ZtpHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Uk413e3OGf3Fcbm54cmqCb1tkYGlvY2RdS0xRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZZWVpbXF9fXl1fX11aWlpYVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmKmrpKu5qq6fm6GssrOlnqCVpa2trqqnnKanm6OoobOuoqmmsqCYqaSUo7aiopWXoqm0uKOboZyiko+hsZmenKemoaKwrp2mqaO2s8WxramsqZGHkJyonaKknKWXnpmamqalq5uwoq+lppivpLutoba1rJycs7C2r7CklpyunqKchY/RtcO3eYeOhZGTkICmeZShd4ygkoSlgYpxqoaFtG5yapqknJWKn32YmYaHj3Ovgqaco46mi5Odi5aQm25xsl2ldJN6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWOen55kINuanlpenNvgXVeZWVvbmZoYEpbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtbWlhVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWScoyKrb6/vLq0npanpK21oaKZlKKnpq6qq5imo5+loaG2p6Oop7CjlKujjqStop2Qmpqqs7OknKScqJGUlq6fn56npJ2onbabo6uktqzEsKmrqKGMhI6coqCmo5aZmp2ZnJmnpqeZraivo6WbrKa9rJS8r6yeoa6xt6mwpJmnr6GmlnmokX18sHeKgKSliJxtsnChh618oY+DqJWYgKyJha2FoJWqoKKXhp+BmpWAe5J+q4Cdm5aLq3idoZKKlJKBeq9epIF9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWRppmDlo6ajnx8hJmAa25/Y390boB6YGhmcW9paGdDWWFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFSU1NWWl1fYWBgYWFeXVtaWFNQT05JNzA0Mi4qLEFUVlZWVVRVVVVVVFRVVFRUVldXWFZVVVFIRklKIygovZOag6jFwrbAs56arKCtt6WjjpukoqCwr6qfpaCerZmeuaGjq6CvqZmuoZCrqKOWiZqQrrCspp6lm6yXl4+soaGdpaCapZ2umKKpp7eqwa+kqaOei4GOm5qfpp6SlJmblZuapqWmm6qsraSln6movqSWwqupoaCqsLepq6Sesq2mqJd1r36Qi5yFh366rYqZZbCNZZWtfaGPhKeVmoGsioSwhaaapKGikYWhXGxqgbNgf617e4OBsW1nb5mZjIixW361XKSEa8iiZJ+Ae7xYdrRZsn1SroB6rFiAoW6Yj6icjJiSmpp8epGgf2R1f2OGeHWBfWJqZ3FuZ2ZlUFVkXEFVYD5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFFSVFdaXmBgYGBiXl9cW1hVUE5KRkM1NTMuL0BVWVhXWFdYWFdXWFdWV1dWV1hXV1hZWlpbXFhXV0dCO9KfsrG3vbqzwbKinKympLWpoIqaoJ6cs7Opn6ShnraZoLSoqqyer62drJuVr6ehjoibjq+rqKahpZmukpiPqZminaSemaOjpZmho6qzqr2vpKeenY9+i5uWoaCYj5GanJKamKmgo5qprqimpqKlqLuen8Wmo6efqbOzqqyjnbqrqquUgKmSo6+Om4CHpJeZkIKAuMO6g46ck4Snl5yCrIqCr4innJumq5F/1r3CqmKjv719fqOCg9e6uLWFlZODnr2+hG2jgm+rhGycf3qysMeDaauwvax4d6K+vHOAlo6nnZGckpqge4OTnnxjfntlj2d6g3xhbGZra2NRYVtTalxAVWJDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzc7PkFDRkdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsL+4sbyyopyupqWypp2LmKXAqriyqKLAp6iznZ+ynbqon62vpaeUlLCrl4yDm5GupaKsoKOcqqCXi6OSpp6mm5qhqaOZoKKsrqq6raijm5eTfYiZkaabko+RmJmPmJSpm6GZqqmhq6ego6q6nqjDop+toqmysqitp564paysmXN2qqW4hmSJoHBorpGLkW5ud6SQmZ+Bda6ZlHCPi3GVqKScmK+kc21tbGaLeG9ugplxgXpqcWlnipeWmHFpaYaIZ3GGZF2IYmpvWVxmfXamX2FxjpFuZWR/jZOPopmZmpOZoX2JkZh3Zoh4aY9se4B6ZW1kZ21jS2RYSmtaOlFmRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1dXWV1eXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp6js6qYkr+zxcq/t6qfwa2upKKorJ+6o6Suq62mjpeuqY+LhZWWrZ6lqaCdpKOgkYulkqeZqJmXo6uhl52mpqiwu6usmpuSknyElo2lmI2RkZmVjpiWqZagmaqjnLGmnaKruZ+vwKajsaSrrq+oq6mltaKstpWKoaimt52JlqOZiKqbkZWdkqmzmZqjqqCylqKhnZ+inKGlopWsp42Tk4yHk5ydlZGZk5mRj5WFgaWbmJaOi5SUjJCHhH5niX50gnVzh4pwp2x6k5CTkoCBjY+Qj52VopeamaWEiZeQdGqRd3KMeHh9emptZWRwZVVgWUBqXEhkYlBZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVV1leYGFjXV5UUUtFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKaWqKqktLaurqGwo62foLaxkI6syL7GvLqro6afnaefsamjtqedqbSmqJGYrKKLh4mPnKeVq6OfmKeenpKUo5eomqeZlKaipZGbp5mitrqoqpiaj4x8gZSLoZSKlZGWkZCUmKaQoJuqoJ22o52mq7enrsCtorWlrq2uqqensbafrLqYkaWkpraikp6noI6qoI6Tn6OrsJqgo7CosJejoJyjqp6enpyWrJ6TmqKblJCWq5qOmZmXkZafkYihnpaVhpKNkY6Vi4F+ZYuFdYZ1eIeCc5xqhY+Sk5CJfYuVkpKYlKOUn5mkhYmbin1zl3R8jIBzfH9qb2VfcWpgW2BabmRRYWVRWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1RVWmBgaWFlVlBLQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX2BhYmNhYWFgYmJiZGJcW2OXlaOnoq+xq66jqaasn6e1qpCPnaW1vbCuraOkm3yfpLKkpbGpl5u5pqOTmaqcjoaKiZyjj62dopWon6CSlpmbrouolY+omqqNmamQn7m3pKWZnIyIeYKUjJuTipWSlJGNkpejjZ+fqZ6fuKN/g6+1oq6udKK7obGedneeqK+4k3Sro56JgKt/ZFxidqCPpZ+EmH1tkrOco6etqqNlnp+Sc3mamHCAmKmYbX+iqIplnKadkpiYlo2SnJCGnpuRl4SSh4+QkomFd2qOhnaGcHuFf39gaIeJk5GLWnWUkGdokI9zfKicnGZ7m4qFeZlqhoyEb3qAa3JlYHdwbGtpXGZlYmJxVFs+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNVVVldYGhmZ1hRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6Cur6yrqaWoraKnraSSlqu2sbOnm6uorZh0jZ+xoKirp5SXuaCgj5yknZF/iYibnoyrmaKVp6GdjpaSnoV1rY+Ip5uqkpilipy7tKegmZiLiXV3k42Wk4qTkZGUjZCUoY+coaeZnLKVgIybtJyyjJKOuqWffaeheaCstX+NjaWeg4uGkLCqr42Ll6SbeoGLrIWcnaGnqKeHlYWYd6WbeoicgJengoF7nLN6ioahmJqVmJaCkZeXhJuZY3uHkIWPkJKLg21wjod5gHB/gIR+hXOFg5SReJZoknSgmnV9mYSjoImYf5WNhoWaa4+Oh2x5fHJxaGV5cGpsa1xlbGtmdV1eSVRMUkBFNi5aVVU3KSEwOT4+NzQzNTY4Ozo9Pj5AREk/SUVKTEdTWFtZXGJhaGZaUUg5RUw7PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop+mrK2rqKygp7CmpqmlmZSvyL+xopeoqrefkYWerZynoqCOkL6emoyfmqCQfIaPmJeHrJyilp+gkYyTiYWAkqeNh6OepJWZn4efurKnnZuSjoVxdpCJlZCKlJCPm4yQkqCSmKGklp6rh5+0ibSZrYrKh6msiLaFjK+BrquCqIymmI2dfaiPc3t3nI+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWzgaF9oZShkJiXgY+UnIuZkot9hZOHjZaSiYNtc4+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56FpJ2EmoGOkImMmnGPlIZpeXZ8eGhpdnJoaGxeZHBtZ25ZZ0ddUk0zRTU3TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUtNQEpjWF1jZmhnYmJiYmRjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKfr6eoqKWrn6S3sKmrppqUoKOkrKWYpqy5pLCBoqmdpp6diZS9mZONoZKej3mEl5aRh6uZm5uZoYSOjHeanI+fkIiepZyXmpmHo7mtpJqcjIx+Ym2Pi5OQjZCNjZiMkZOgj5WhoZmhp36hp4etnZ+WrY+dnJyQhH+gjKishaONqZmMmn+idYGZlGuCrXZNq3iHjZyRmqimgKmrfYOhe3qnap5/kmtnl4aYt4mefm5gZFmDl4CNfGRoi3KZfXmWbF19l21fUnCDXF9reIJfWGSBfIN/l3CnqmuDo25ypXCfhaBqZ6BtXHCOfmdaYISBY1hRcHdmbnVza2pwXmtxbmxqWWlPXVlGOUE1SERfbDUsSURSTU49ODQ4NTk7NkA7Oz5CUD5RUkxNQkpcXV9XXV5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGhtbuqrqKZmKGipa2voZ6wtqSpk6KhoKecmo6ZtJmQi5+MlYt1gZSSjIqmlZWZnp5+koWFrKSHm5CKmaqZm5uSiKaxp6GVmoiJgGluiIeLjo6Ki42SjJGTo42Un5+coqR/k4GPoqCTn3aclY+ngZ+lfoWnqoKleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5uomY6HnXuConN2pmaefnekX5h6fZR0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNjc6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGGdmbSXc32Yn7N1dFyesoNrY3B1d3JpcFlsbXNzZ11qXmJMRT1ENlFCWnMzPVNHYEpSPTwzOTU6OTZEOztASlA/VU1PUUBFX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGRgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOVlKO3mKqbk5+NpLe0ra2gmqKdpKOmr52cs6+tlJmimqGlmZuVn6ubi4iSeIuFcYCWjYmQoY+SlJ2YfZCJjaihh5eOiZKklZybjYypqKWej5eHhH5qe4d+fZCNg4uRkYmQlKGDl56gnZ+ei4l3nJihjJ9xoYqHqYeapI6Vpah8rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYWiZKF8iJaQm41tnmibjm+amXqAi6d9cml0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhwgZxglYxep3Z1h4h+nmiadYaTkpeOgJ9vmpFup5peqX95u2t+qlyOhF20aF1ucnp4bGpccWt5emRhZ1hiQlJGTzdXQ1JvNUxbW19OWkRBMjUxPDo3SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptJqniGOUm6u6sa+snqacnKmgn6+cnrKprp+YpZuhoJmXl6CjmYaJjWqIgHJ7l4iLlpaEkZWYkHqKhJWknIqUj4aMn5OenYmRqaOgmoySioCAaYGGeX+XjHuJjo6IkJebf5Sinp+hk5hyaJ+Jno6LcJKMgamGmJ2hpZ6le7Cto6K4l3ejs6OkgImUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mLWipKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g55udH6VcJp0a6RelXZIZWRhdHJ/f29mYWxpd3xlZWJRX1ddVVdAWkZRaEVUV11iWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lY3ZsXWVnZmtkZWxpaWtpk5yAsK2ZhFNeoKazubKyqZqijJysnJyqlaKtpaOpkKCfnpualpmhnZaIh4l3hoFveZWFkZuLfJGTlohygIiRoZtzkJCBiZqWoZuFj6qcm5WLi4p8g2yEhXGCoYx4ho2IiJOZlnyTpKCeooithn21hI2dnHullnqpgJSaj4memnunaHdtfpl0oXNyfJ6GmXCTg659pIOlnZmAo29eqWd1omNvpWGc05B9e5l4c3NiooaQfqN0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2bbXxwlm1/cqJyXaRnc6ZgaKZtm9SafoabcHt7mGycfHiYc26ppGdhZXpygIVsaGZkb3Z4aGFjU1xmUVJiSFlKVWFXVFxma1xlUUZDS01KS0JLRThPQFFOWFNZT1NRYGZmalJjd3l3SUZFY11lWmhqVGloam9jamdgY19dXV1faGJhaWV8ZF5kZ2RrZGpsZmhsaJeaf6+qVFxLfqmvsbOvsqObmYWZqaCipY+mqaGaq4ubmZmUmZOSoZiOh4V7cH2EaH2Pg5WbgHeRjo+Jb3+FjpKSbJeTfImSlKWXg4+rm5SSi4aJeYN2iIBugp+Gd4CThoiZo5h7lKKjmZ+Js6Gitot6rKekrqVwqYCZjoWAmY96pIChmYaYcp6EpK6vipeMgI2kjZWDraCTdrW2tcmhc5SLgZ9gnpepbXmWh6CbdKKId6B+k5eLgXBNZqOScJuHc6V7eXRhg4FrfqBrcWRfnHF9c5ZoeWmztbTGpnOYfXqda5ybq3aFm253eZhqmnt2mHNRRX2zX2p3bHqIZ2toY3V2cW9XX1RZaVBTaElXTVlUVl5pbG9WaFdOS0FKTUtISk9BUUtQZWNqbWV0cnN/eXxudYl7e1RRT2xeaVxraVJqaGlsZ2xmY2VfXF1dXmliZGlre19dZGdjamZvbWVpbGWhm4iupYNkP5Ohsqqur7WiopCAl6qio6aNpqifnqeEm5iXjpeQj5yTjoiDemp5h2WDjX+YoHl1j4mMgWmEhZGCjIWdjXmNjJemlISZqpiNkYuBiXqAfYt4cJChhnqBlYeJlqCWf5SkppuVlYNmbnicbKJke3Gld5uYcGamgJSJeqR6n5aDl3Oed4GKlZePuW6RiqJifZiglYhucmmqa3WgbW+mYJtpi5BploeblnWigX6aYIyGjXVwiGJooGWefmmbdW9jZoiBbXGiWV5aYqFsXYiLbnp9c3JkpW14omRnp2iZc4yZcKJwVYmQb6BfZqhVi15UmG5udGtzg25xaWx5dGtwUllXV2ZaVG1JWlBdSVhpaXNqWWxXUVJGVlxMWFNhVWlrX3d0e31wfHxyg3uAc3aNgIR2XlJyYmdjcGdQamhoa2xuaGRnX11eXWBqYmppdnVdXGNoY2pqc2xma21jnKOXpXlkc22Lpq2jqbCxpp+LgJirnZ+njaOinKSjgZaZlI6akIuYkI6Ke4dxgIhpi4t8mJtzdYl+kHtkg4eUiYqVmYJ8iIeYqJKBo62RhpCLgol+gICOcmmQpoR9h5ONiJmgj4iTqaWciKZ4lZt+pIiWi7GYnZCCr5efpHWThXipc6WPhJpupKKMkoSNg7tufaWvg4eFhpOVnJ98pXpyqJWglmeefm+sZJaKlpN3qG2qooGJdomDd6uRpohrkbBrdrOMqWuKhW1tn56RlF99q4uqdn5+i6Wedp98g6SVnaBqm4h4rGifroy2dHe+jaSTWoOnjqthdnN1cnx1cWNrf29obVRXW1ZhYl1rTV1SXkpebW93YFtxWVxgW2d0ZW5vcmNydGB3en55cnmDc4R/gXt7jIGDgHZieGRjbnJkUmtnaG9scmpmaWFgXlxha2JtbHpvXFxiaWJsandtZ2xuYpWkqZyBf52jlqmpnaimrqSZioKYrJqfpoqcpp6rnoWNm5CHnJGFko2MjXSHe4iEb42FfpiTdHSGc5KCbX+LkYeGk459e4KHmaePgKenj4GOiYWUdoKHkm5si6mBg4yUjomdn4mMlKmin45/dJOXiH6BeZSuon+BmnGPhneOiYJ9e3KnjHJ+fXqYlpuEkHl7f36HlJWTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GHhIJljH9fgICLd3VzlHVveW5th2yDhl51Z3eOZX+AhIyomn10e5VqiYhwgXZ9h3dubmiNdHp8mHiFXGxYeY9pb3hzcnB4eHBdbIdvamhXW2BXXWZrZFZjVV9SYHB5eW1rd2Zra2t3fXJydXRhb3ZidHuCeHV6gnWAgICBeYuFg317bn9sZHluXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhrb2GNk7eopomgopqmo5ilnKuioYSEmK2SnqKKm6ibqpiDgpyMf5aUh46KiY1yg3yPfX6PhHuYj3RyhHGVhXt9kouGho+EeX6AiJulj3yoooyGkJCFlYKGjph2coSpho6SnZCJn56IjJumnp+qg4iNlZp+fomWraePkqWPd2+bjoF4kG5+qIVxfpVxa3B9gqCNgJOOi2hsXIKLi5uano5zlYuIcXRrgnd0gVlyboeRgX5/jGpdamV7hoSJgGBpeHqbe4KLgnWBhYFnd4qGamBvcYB1XnGJgIiOppSFZYuNg253i4Rxho96cWhpZnyEe5ZbXWtobnZcfHp4dm90c4NoXW6LbGxjWlpfW1lscVxfYVpfXmZ0f3x2cHVka2trfH1zfHl1ZW51aG18fnd6fHt5eoCAfm+FiYR7fXR+eXN/aFRccWlsdnB1Z2toZF1hWGtoa2txcm5XW2VubGdzeW9oamxgi4qpsKGPoqGanp2Xnpioo6J+g5mujqCViZ2jkaaVgHyYhn2SmYmJhoeKc36BjHaFi4KEl4pyb4BymIaDfpKDhIaJgHqBhI2coZGDqKKIeY6XiJSKi5yXhIN6rYKRmJqVip6dh4ihqZ6hoaOKh5ObnKOZlaqhp6afkpqGlIt6do2Ng6d+f5OQkpSdsqablZ+QjbGSl4OljIyVmp+JkJuCiJGKa3yOd3hlg4aRi3yJnoSHjJCJiYGFhJB3fHp0mqCJhoqdiYSTfn2KgH90bnKEgX12hYWJjqWQgoWMhoKMkIx9iIyKkYR6boSFfnqZa3NpYXSLcX57eHdweHWCXV5viGlvYF9aXV1TaHJWZF1dYm1odnx9dG9wZWtqaX99bnmAcmpwcWxngXtygoB4f31/hHptgoyGfHp4e316g3hOY3Zqc25wemVrZWNiYFt0ZnBncnFtVV1sdG1oeXpxZ2lrZYyHnLmelqGgmJSYmZSYpKGffH+arI+fjoagnYyeln15lYR8jpmKhoOEh255gYFzgYh+iZSEbWt+epeHg4OPfoCHhIV8h4WPnJ+TiKyghHOKkIaSkYudkX2Ne6qEjpOYlo+cl4eHm6SeoZmchYKSmpmYj5mmn6Scm4+Vf46HdHqGjYSle3yOkJGGmauinpSdkI6pjZCAnYyIk5mego+XfoeOg294hnJ1YH+EkIZ0jJmBg4+Dh4V/hYSVbnl2dJKiioyFmoSEjHN/iXx7cXF6hoJ6d4iNg5Gmj4WDjoCDiomKd4aJi41+cm2Agn1vaWxuaF56gGl+fXd2d3Z7eF1gcX5udWBjW11fUmduVWZbXmJraXZ6f3JsbWRramiBf2x0gmxsdXB6cIZ5boeAdoKAfoV2cYKNiH57fHx/e4KKYGh7anVpaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2LiZ62maCjn5KRlZiLmp+fn3t4n6eRnIuHpZWMmZl6e42GfYmRhIyCgoNufIB5c4GFfouSfWtofYKXiYGIjXt9hoSGfI+CkJ2dk4mpnYFxi4uMkoagoYqFjHyokYmQkpeTlpN4jKKen52VmH6AkJqYkouZoqCjmJWQmXyLgnd/go6GoH9+jIyPfJiloqKTmpGQpoyPgZqQiZKWm36Tkn6HjoF1dIJxd2F+gY6GcYuXfYmMcox/goWGj2h4cniMmJGPf5Z+iIlygYZ7e293eoqDeXiPi4KVpJOKhY97hoaHhHaDhImJfWhzfoF6fHJtbGhffnRpfXZ2dH1zgWtfYHR2cHdkY1lfX1JraVZmWmBhaWp2eYJyZ2xkbGhmgIFrbn5ob3Fsf3mHemyMgXOBgX6BdHaCjYZ/fHt/gX1/j2lyg250aWGHaGxiX3FWdG9sbWB4aG1XanR2Y3V6e3Jiam96iYyesZGlpJyOj5ePhpygm558d6WhjpiAjaOLiZqWeXyGiH+DiX+JgoF/cn97dHaDhX6LkXhnY32Gl4qCiot4fICNg3mWgpaZmI6XoZt/cIyCkZOGpZuHjImDppaFk4uWl5OSdpGdn6CXk5Z5fo6Xl42WmpyjnJeRk5l3jYOBdoOWjZ1+gYmNjHOXo5+ilJmPj6KMioKWl4OSlZl+mI18iI2BdnF+bntkgHyLhXCHk4CRgmyIg4GAiYVmdW97hZGYi3yTeIuIe3+Ge3pwfXeIhXiDj4eKl6GVgYOLdoiEg4J3fIOKhnhhenp/dYB5aG1mYn9qa3h0dHd+cn1jZGFzbnVybWFaYV5bbWVTZFlhYWlrdXmGcmNrY21maH2CbGl1aG5waoB9g3ltkIZygIODfnR8g4yBf356goN+fJBtdolzdW1limxqYmJ1VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm62XpqeejYyXh4afk5eZfniqnYuZepedjIyZkHl8gYx+fIR8gYOBeHR5enR9gISAiYuAZF99i5SHf4SGdHx+i399mIaXlZiNpKKYgHOHe5ORiaaPjI6Kk6CShJKQlJeRi4GPl56akY+Qcn+NkZOInJyepZeWi5OVcYuLiWuEl4+ZeoeIj4lvl56bpJSWi4yei4aBkZx/kpKVhpmIe4qKgXlyemx1bHx/i35thZODlXdwg4R+fouAZXJpe3+Wl4N+jXSQh4J4hn10dn58hIB7gYuCi5Ojj3iDgXSJh32AdHaCiYVxYnx2e3J+cGNwZGV8Y29wd3N5eHR1YnZgcGx2bm9cXGBeXmteUV5ZY2FpbnR7imxgamVrY2h3h25nbWlrbWmCfXt3b5CIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhtbIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJipn6SonYqKkoaKnYuVmX54r5mNl32flJGXlIh3fnyKfXyAd3iAgHB1dHxvhn2BgYp/fGFcfo+RhoCDgnJ6gId6j5KJk5Kdk6adlYJ9gX2OipGjiY6KjZiajYaSmZSWjoqIjJGbko6MjG2EkI+RiJ6ZoqCWlIiVj2yGl4JlhJiOk3qJhJCKcJablaOUk4mLmYyBf5CefZKOkoyZjnuKhYdzc3ZscW51fIp0b4eRj5NxdYF8gYGIfGVwbHl8mZN8g4h0kImAc4d4bn98gIV7hIqGgYuUp4x6hnt+i4V4fnFwgYeFZml6dXZxfGNfcWFrdF9xa3t6eWxzcWV5Xm9sc21yWFtfYGJsW1BYWWVjaHJyf4hnXWppZ2JncY1vZGpoZWlpgXp3dW+OhXSBgoN7dYKIhXiFfHiEhXp/iXd/i3t7cniDamtfcGh0gGtyb21yZ29sZXxjboB6dnFsd3eKfqKXoaegppuHi4uBj5yHk512gquVk46HoY2WlJCAdHx3hXh5f3Jze4Zrc3B6bot2gIGHb3BbWX6RjYeAf391dIGAgKCHkouUnpiilZh5in+BjYicnYqPhpKYloWJlZqQl4yMjY2Lm4mNj4JtiYuQkImclqGbl5SEloZogqGBZYSciZB+i4OLgXeTmZOgk5KJiZSNfn2Ol3uRjI+OmpJ8ioCCb3ZwbG1vcHuGaXSEj5mLcXeBdYKIg3lmcm51gJmOe4eEeZOQeXWHc2+IeoSKeYqEgIaNm6KHe4N1got/eHlubIGFg190dXRycnlbX3FhcGtfcGt+fHFubmttdmFwb2txbVlZYmFib1hRVFtmZ2N1cIWDY11rbWRiZmuSbmBnZ19oa4F1cnNwi4B1f4OAeXaAi4B4hX94iIZ3g4V8hot/e3aKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx0dXSAg36klZqtnqeWhY2Ef5eUg5CgdoyglJOGi5uNlo6LenJ5dYJwcoV0cXaIbHBudm2IdoN+gG1tVVGBqpSGgnd/dnGDeoOhg5OClZSZnZObeJF7g4ySo5mTjomVmZKEh5eZjJSLiY6PhpyDj4l7couFio6HnJqfmpSTfpJ8ZoOahWaFn4eRhJGCiXGDkZiQnI+QjYyPjHd7kZB6jouMkpaMfIh8gGt3am5rbGx7f2F6fo+Xgnd7gniDjH15Z3Nsc4aVi32HhXqTj3F5g291i3mIinmIe4CKjp2chHt6doKLfHdxamyChHtheXFvbnN0Vl9wYnJiYG1venFpcGZnc3Vpcmxid2VdV2ZhYXNUUU9dZ2VeeXCJfWBdaXJiYmZmkWpfaGVbZ3B+cGxxdIp9dnyGgHV2fox5e4WBeIiDc4aFfoyMhHx5lXhmcmqDYIh+b29remBqbnR/dV90fXmHeHRzhX14oI+ZsZyljoKLf4OaiICMn4CLmpSPhYiYjo+PhHd0d3SAcW+FdHByhHBraXdug259fW10clJNgt/IktaTe3B1hHaFoYSUeJeSmZ2RmXuUc4WQnqGTlJGKk5yUhn+XloiNjYeRjIebfo2Ad3qMfomMipybnJqTkXiMdGWGj4Vrh6KEkYiWg4ZjjJGZj5aLl4yMiopxepSIe46IipORiXmFfH9tfGVzb2tsenpbgXmQkIF6fn+Aho57e2lzanOKj4mBhYR8lIprfX5tf4p9ioV8hHiAjZOZmIl8dXeDj3hybWdxgIVubHVwaWt2b1NfcGVwWmBtc3lobGtjZ3hycHFkYHhhYFZsX193UU5MYmdjXXpyinZeXWV2YWJlZY5kYWdiWWlzc25rcXaMfHR6hoJ1dn2Lc3+Gf3uJf3KJiIGRi4h8fph2ZXNufGWIfm9wbIBZbG55eXNgdnp7jXZyd4p3eZ6Lm66aoJCChXeIlX58ip6IhqCSj4WMmISTj4eBdHhweXFvhHBtb39zZWV5cX1teX1qZ2tjpJrB3K7woXNsdoV3hqSGk2+YkpailpyBknKGi6KXiI6Wi5CdloOBlpCFiY+AkImIlX2GenR/iXeHhI6cmpiYjY51iXVshIeJfImig5GJnISFXouTmIuQiY+Li4SJbXuWgX2IhYmRj4Z2hX1+a31keHZqbnlzWIl7koiFen6BgYaMf3lmcml/iY2JgoF+i5WEa4F1bYaPgY6CfYF4fo6UkZePdHJ3h4x1c3FndnqEY3VucWNreGhSYXJobFZgb3V6YXJkYGl9cHNvW2RyYWJXbltdeU9NTGVnYl53dIpuXV1keV5fZWWFYGNjX1lqc2tua3N3jH10d4SBeHd7iXGDhH1+iHt0i4mIloaMf36Xc2d1cnlsjHtudHGBV3F6dnlyZHd5hoxpdoCJcn+chpinm6OShH1xjJR3eYyehYWhjY98lo2AmoiEe3N3cHRqcIJsam18dV9heHd7cXV7Z2BkfOvatcnD3IdzbHSCd4ucio9rmpGQnpaUgYlxhYifjYSLlouMmJR8jZOIg4mQe4+LhY6Af3V4g4RyiIKTnJaUl4SLdYZ9boKAh4aYoYKTjJ6DiWGDlI+HioaKjoeBh2l8k399g4SJjo2CcYZ+f3F3aHZzanR3bFqNfZODhX2AhIGEioJ2YXJrh4GOiYF+fpGQfW2Ba3eFjoSQgXuAe32PkY6UiG1weYyFdGtxbHN5gmF1anBebXhhUmVzaWZTYHF3dWFwYF1og3F0a1hoaWNpWW5XXHZNS0xmZ15ic3SGa1xcZXleXmRne2FkX11Za29mb2p0eIp+c3OBfnt2eoh0hYN8f4d2d4qGj5mBjIJ7k3Vsd3Z5eJN0bnh7fVh5hnF/b2d4d5KCZHaGhXCKloWZoZqiioh0b5KMcXePnH6LmomJfaB/hJqAgXhydG5vZHJ/aWZteHhcYHl7e3FxgGphZ2F/1baOkaZ4b3F4fXGUko6Ia5uQip2TjIZ7aYeLmYaBkpGGh5iOfI2NgYGJjXuPjH2IhHpzeoN6cIaAlpqOk5OAh3SChHSBfYiQm56GlY+ffohigJOHhYmFi42AgINnfJCAfn+CjI+Qfm2DfIJ0bG13dXR3dmxjjoGPgIV+fYZ/hIl/cF9xb4R7jouBe36QiHlwg2V5gYiFioB6hHx+ko2PkYJtbnmLfnVtbmtse39kaWxrWm94WlNqc2liUWNzeG1jZl5aa4RudGJcaF9lbWBvVVxwT0hPZ2ZcaG9xgG5bXGNzYFxjbHdlZV1dWmxtY21qc3eGf3JxgHx9dHiGeIWCfYCIdXmJgZOVfImGdoiBcHh5e4STb257gXdeg4B0gW1penSUc2dziHxxkpGDmZ+boIaIdnaUf213lJh/iJCEi46afYyad352cnBsamF1fWdianV6W2B4fHpscH9lY2dnV52PX3Fzlr3FhXdylYuRgHSZjYedlI2Ic2uIj5WAe5SLgYSbjHyKhn18iYx+k4d0h4V2dn2BcXWGgZ6VhpSOgYFxfoZzgnmHlZuWhpONnYCIZn6Tg4GGhIqJcoF9Z32Le3l/f4eLj31pgHyDdmZweXhzd3Rsa4+Gi4KLf3mDgYSEgGtecHZ6fYuHhHuAjn9+coBoeIGFiYSBd4J7f5WKjot8bWt6iXx2dG9paH53ZV1yZFlxdVRUb3NpYk5odXlnYV5dWW+BcHRaZWNea25hcVBabFJEVGhiWmxvbXtwWltebWNaY293ZGdcXWBramNsaXN3gYNyb357f3R1g3qDgnyChnZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaoJ5en5ubXx2lWtqeIR0a5OMhZ6YoJmFiG9+jHZqeZmPgIKKgpaYinmPlm96c3FsamRgdHtpYGZye1thcn16ZnB6YWVkjrGyd0tiWqXa0phzfJKNkXp/l4yFmpKNhm9shZKReXmThoCEmYp8h4B5eImKg5V/bomGcXN9e2p5hoOlkYSSjIJ+bn2BdIF2g5mXkoqTj5SFiHB7k4R+hIOJg2+BeGiAhXhyf3+Diod8ZXx+g3VjcXOAaXlxb3WZjYaEi3x3eYCEeoJrXG98cn+Hg4h9hYd6iHGAbXCChYyCgnGDd3+WioyDd21sfoR/dnplaGp+cmFaeFtac29PWHJ0Z2BLbnd2Yl5cW1l1fnNwWGdeZmtyX29PWGlTP1lnX1txa2d5clxbWWxlWmNweV9oXV5lbGhmbGlyeH+HcG6AfYF2cIJ7gIF/g392gYWJl4pxgo1xe4Z8enmElIx1a3p/bHB+dX99b3J8e5Nwb4F/eWaSioKhmJ2Rg4Znh4RwZ3qXin+AhYKaioF8jY1peHJsbGZfYW95bWBjb3lcZGyDemFxdl9kZdXrvoszOj6Lj4ByeYaKkI54hpmOf5SOjX9ubYWMi3V9j3+FgpWJfIN4bnaHhIKVdm2HhGt1e3VleYOEp4yDjouCfGx+cnSBeIOaj4qPkZKNjId/e5KIeYCFjoNsgHJpgH94bXx8gYqDeGJ5hIJyZHFpf251cnWCnIyBgIZ/dHZ+gHOBcFtrfHN4iIGKe4Z/fIh3eXBrh4OPgohwgHd9k4mKfXNtanaAgHV1XWlpeXFaV35UW3JmTVtzcmZcSnJ5cV1bW1pedoB2aVpiW2hmb2NqTlhnUj5eZl1edmZfdXFbWVVvZFplcXlbaF5gZ21oamtpcHh+jm1qgoSAeW6Be32Bf4J6dYKBjJOFcICLbnd9gHt7iJOJgGl7fWt0fHKGe3N2fX6MeniEfnxrjIyEm52WjIKBbY1+bGl/j458fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXTZbsLZ1aoCJfpSHeIiZh3WQjIp3cG2FgoZ0eYl4iX2TiHp/c2d2iH18lm5vhX1odnluZXqJhaWHgIaMiX1tfXR9f3uKl4aAk5CYiYuFinyQinF8foZ8aX5ta4B7eWp6d4KHgXJgd4J+cmRyZ3aDbnV7hpWSgn2CgHB3enx1f21XbX11c4mAhXaGdIKJendybYiAjn+DcX17fJCHh3lubWhtgoF1bl1oZ3VyUlx9T11yXU9cc3BkVkt0eWtYWVlaYnKBdmFeXWFnZGlqZk9aaU5BYmRcYHdhXXVuWFhTdWJbZW9zWGpfYmhrZ21saXB3fJNsaISKfXxwf357gX+CeneAgImLhHJ7h29xd4R/e4mNj4RqfntueHl2ind9eH+Bh3+Efn56bYSMiJijjYWEfHaLemtthYmTen17gpKAgH6KhHBycGNmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f7+dqKXJuHKFhHSVfnqJlYR0ko6HcnNwhHqCc3WGdIh3lIl5eXFkd4Z5f5JocYN1Znd2ZGp8hIiegn9+jo18cX1ygnd+kI6CdpWNlJCIgoh7iYpseXqAdWh7aWx/eXNpenaAg31oYHeIfWtqdGh7gGp2gY2RlX98fn5xfHd8dH9iVXV7cXKHgoF7gXCGiXd4b2+Cgot9fHd8enOMhIB1aHBnbIiBcnBdaGN0b0xmd01fb1ZUWnRuYlFPdXliUlhYXWJxg3RcYl1pZWVja2RSXHFJRGViXGRxXl14aFZXVnheXGZuaVZsXmFqZ2Vvbmhwd3qTbmmIjHl9c3t+eYKBgnx2fYOIhoNwdoNzbneCgn6Ii5R/cYB8eHp6gYt1g3h+gIGChHqAdW99ioubnoh+hnt3hnxodYeNknp/gHyJhoR2j4BncG5gZVxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6naqciHiLNyinlxj3Z9iZGBe5SLgHV0dX52f29wf22FdJSGeHVsYHmAeIeNZXGCbmd1blttfYGQk4CAeJKRfHd6bIVzfo+Kg3KVipGPiIaGe3+GbXV3f21od2VtfHZta3d3f398YGJ4hnpodXZjfntodYaPjpZ9dYB2coB7fW2AWlVxfG9zgYV9f3driIZzeGp0f4OCfHl7d3pxiX97cmdzZG2LhGxzW2pgdmZJb29NXGNYV1Z5bWJQU3V3WVFWWF5hcoVwXWFjbWVjXm9jVV5zR0NnYF5naV1ae2NSVl12W1tnbGJWa2BgbmZmbHBocHZ4j3Rrjo12f3Z4fXeBg4F7dH2DiIiDb3F/dXF1fYWBiY2Le3d/eIR8fYWHeIh8fYF9hIB7fnJ2eIuOn4yJe4p3dYN6Xn6Hmo16h4R0hoeFd4l7Ym5tXGJbW2FVanRkYFtob3Bnh3FhcWZXXGNrf3zKzoe6omtub4tucoVzfoaMf3uThXp5dHp1dHpqbHZjhHaSgnZvZ198gHiKh2RxgGpqcWNYbXuGnImDgXKXk3Z9em2Gb3+IioZwlo6QiIaMhHt5f3JycH5naHJjbnhxamxyeH18eV1leoB4aXV5Z4J3aHWHjI6VfXOHam9+gHhufV1Xb3xsc36IeoBubop/cHZmdn+AfoB1em95coV6eHFlcmBtjIFrclhrX3ldSXBsT1hWX1VWfGtiT1R2c1JSVFdeY3WGal1ha2tmY1pvYlljcUhBaV1hZ19cVXteT1ZmcVpbamhdWGhhX3JmamhxZ3Fzdod5bpWKdX97eH55g4eAdXN/hYWOg3Bwe3h3dXmGhYeMhnp8f3WLf32Gg4SHf35+fYZ/fHh2eXaSlJ9+jX2LbnWAemSEiJiGdJKKb4WGgnqDdWNuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq57oLduYnSHaXV9c3uFiHt+jYB3eHN3b3p2ZWpvYYd1joFzamJefXd4ioJlcH1na2tbVm94i6SBhX9wmZJxf3ZzgGx+gI+GcpSIjYiFiYV9eXVzcGl6YWptYW12amdra3l3endbZ318eWZyfm6FdGZ1ho2GloBwi2dre4J0bXViW216anN6iXqAZXSGfG1wZ3R+d31+cHpqeXl/eHZvZGxhbIl9bG5WamF4VkxsbVBTUGlOWX1oYk9VdmxNUVRVX2h3hGdeYXFpZ2FXaV1dbGpKRWxbYmVXWVR5Wk5Xb2tZXWxlXFplY150ZmxlcWdzcHSBeHCZhXZ/f3h/fIWHfXVzgod/lYNuc3l7e3NyhYaIiYR5gX12j399hYmOhIGDen6Lg3t3fHd2mp2YeoqDh2p2fn1thYWVgXOPgnGGgn+CgHBmbGdXXVtcW1NlcGVfWGNydWl2cGRlYldbW2h/cG9ygHOKZWZ6f2p2d3V1hYZ4goV6d3R2bmt6cGFoa2eGdI2EbmdeX3xueYh8Z2x3ZmpkVldzcI6nfYR7dpaQdHtxenhseXqPg3WXfIiGhIeEfXVxc21odV1taWBtdWRnZ2l6b3tzWWeBdnVocIF4gnZid4WLfZWCb4xrbXuBcWVzZWBqd2ZwdYh5fGF1g3Zqa3F0enB5d3J7ZX19fXZ1bWNlYGyGfG1rVmpjclRMa2xQTU9wR158ZmFOVnVlS05UWGFseH9mXmdzamVgV2RYY3JeTExsWGRiVVRVc1dNWXdlWl9sYVxbZGVfd2dtYm9qdG9xfnV0mYF4f4B4gH6GhHp9doKDfpiFbnJ0fHt1cYWFj4KBeot1dJGAfIGVjoGFhHx+jIZ6foF2e6OminmJhoVsdXx8dYSDjXtvhnR6hX2Cg3VuamllVl1bW1pTY25lXFlidHtqaG1oYGFXXVppgGlrcIBobWJpe3prdXV1cIeCeoF+d3Zue2hqeWpfZW5ogXeQhGdlWGF2aX2GeW5pb2ZmXVVYb2iPqHeBe3yQjnh0bn1tcXR4jX53lHSGg4CGiXZqdHdoaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Bfnp3YXeFhXqRhnOIcnB6f3JjcWhbbXVkbnGGendhc4BwaGp4dHFrd3ZzdWKCeX11dG9jYmJsfXxra1VpYmdUTG5pUEhSbEVheWZiTlRyXkpNVVpmbXh7Zl9tcWpkXVZgVnBvV0pUaVhnXlhOVmxUS116YFxfbF1dW2JlYHpobGFucHZub3d1eph9d4CBeYCAh4Z6eXqDfYGThHF0dH96dnSFiJB+gX2RbHOVgXuCn4V/h32AfoaCgIp7dYSsn396iIiEbHKCenaBgIJ1b4hvfYB0ioBqb25lZFhfWlpaVWJqZ1xaX3WCaV5tbFxhVlpba4FlcnR9ampebXh3aHV4c2+HfH5+enZzbHpoaXdnXWRzZ3p3koBjY1Rkb2aBhHV2ZmhpYVdWWWhkkKhvf3d/io56cG57ZndteYp6do5xhH5/gIduZHd0ZWhpXWxiXnBvW2hfbXVlemhddIBucmtxe392dWJ1hox8iYiAf3hydX50YXBsWHBxYW5vgnpzY3GAbGFte3BqZ3l3c3BkhHR4eHRvY2BjbXN9amxUaV5fVUx1ZFFIV2JHY3dmYkxUcVlLTFhZaWx3e2VlbnJmY1pYXll3ZlRJXWRYaVlZSVdlUUljeVteX21bXl1iZF5/aWpgbnR4bW9udoOXeXKBgH1/iYyGfnV2hniGjH10dXWCeXp6gouNfX+FiWp0loF7ip19foV5gHt+fIaJc3GProx8fIeQfmZxiHp0fn13c3CGbXx+bZB6Y3BwYmVdZVZaWVdjZmtgXV10hmhZcG1bXldZW2x7YnF3dm1jXG50dWh2d3Jvhnl/gXp3b290ZWh0ZVtndWZ2dpF5X11TZWVqgYFzfGFiaVxUWF5jZJClaXl0goWQd2xteGZ3bHuDeXSHcoF5fXmAaWZ3bWFnYV9rYF51a1lmXW9vYnplW3d8a25vcHh5dHVlc4OTgImDiXp2b3J9cmF4Y1lubmBvcH96c2VxgGRfbnZqY2Z4enJsbYFzcXtxcGFdZG1vfWVpVGhZWlVOemBSS1pZSGN1ZGFKVW5VSkxaV2ptc3tkbGx0Y2FZWlxid1xUS2ReWWpUV0hZYU5Ia3dZX2FuW1tfYmNdhWloYm54eW1vanaBkHlug36AgpKIhIF2dYl0i4Z0cXZ2gXd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OHhHNwmaJ7e3+JlnlldYh6c3l3bHRwf2x5fHCSc15wb2FnYmxUW1pXaWRtZlxccollU3JtW1lYV2BsdmNqdWpqX1tudHJtdXR1a4d9f4F8d29ubGRpcGNba3JkdHaOc1xXVGRgcX5+cIBcYWNeU1phXGSTn2VycYWDkHNraXhrbm55eXpxgHZ/c3t6e2RmdmheY1thaFxfd2hXYl9waGF3YVt8dmpqcm54dHR0aXGCloSHf4V2c2pwfG1md1dbaWxhb3F/eHNlb35bYXFxYl9pb3xranJ9cG92anBgWmRrbXthZ1RnVVhTUXhdU1BZUkhkdGJhR1ZsUUlQWlZsbGx8ZW1vcmFbWlhabXFYU1BnWFdqVFVGWl1PSXN2WWBjbmNYYWFhXoxqY2Vtenlsb2l2eYZ7a4R9gIWZfIKEeX2IbY+GcW92en10goJ9i4+Dg5d0eIKUhYGfiXWBgIF0f4Jwh4N2b6KXdHuGjId7ZneLb258cGd4cXtsc3ZzjWtedG9iZ2ZrU15cVmhibGxbXHGMZE5vbVxWV1VmaXNoY3RlZV5acHZvcXZ2emyIfX99iHeQc2Nka29hXG5tY3N4h2taVFZiY3d7fG+EXGNeY1RbYFpjl5VjbnCChYlyaWZ4bWRydXF6a3l0dW97f3ZfZ3NkXF9XYmRZYnVlVWBhbWRhcV1dfm9oaXNxdHF1dmxthZSDinyFcXJnbnxvcW9SWmVpZHByf3RzYm11VWNya1xebmR7ZGt1fHBxcWltX1hjaWp4XmZVZFVXUVZvWFJXVFBIZXNgYkZYa09JWVVXbmllfGlseWtiV1xWXHVlVFNXaVJaZ1VUSVtaUE55d1tfZW1qWmJhXl6PbmJnbHp2bm9pdnZ/fm2EgH6Gl3t/h4GKf2uTiHJndIB7doCDfomOf4yTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOCjYx3eG56jWBlfXFnenR5bW1xd4NnZHxtY2dnaFNgX1VnYGxvXF5ujmhOamxgVVZTb2dza2Z4ZWZeWnJ2bnN8eXRuiXuAd5x7emthZWxtXmBuamVxeX5nWlZYX2x4enpugl5hXWhWWGBYZJyIYmtwgYZ8dmtpdWtbdXBqeWl1cm5vfIFzWWtuYFleVmNkWWVxY1RfYmlhYmxaYH5rZmx0dW9teHZsaIaNgIp7iG1xZnB7bHFsYVhfZ2Zucn9ycl5pbFNmcWVWYm1heGFvdHp0aW5ral9XYGZodVxkVmJWVE9ZZ1NPXU9QSGVwXWNHWmpOSmBMWW1lYHhpb4BlYFVeVF52XFVTYWdPXmNVVEtdWlFadnZdX2ZtaFhjYVtejnFjaGp4cnNtZ3ZzeYNzgoN7iI5+fIqIjnpukIp0bHOCdH9/iIWHkoSVj3p9jI+IkZuEgHyNhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo2NjY2NjY2NjY2NjY2Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjY2NjY2NjY2NjY2NjY2Oj46Ojo6OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERDR2RoZ2dnZ2WQoqCgoKClXiouLi4uK0iFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTQ5XGBfX19fXZGmpKSkpKpWFRwcHBwYO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fn1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHhomTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaIiYiJiYmJjY+Pj4+Pj4iCg4OCg4KFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5GLj4qKkImPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjY2NjY6Ojo6NjIyMjIyMjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQi4WHhouKhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCIhYWFiIeFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkIiFiI2JhIaJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp+fHZ2eHx8e3x9fX19fX5+fn5+f35/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4SJiIeIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6fHp6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pio6Ki46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fn9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f3+Af4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/gICAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f3+AgH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fn5+f39+fn1+fn5+fn9/f35/f4B/f39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSk5OTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGSkZGSkpOIhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCSgoKSkJGRjnWGkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9+f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcIWQj5B8dYiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj4+QkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzb4qPinJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fXx+fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXdte4+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc25vhHt1doCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGRUhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39+fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RiXmRfYWtxZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f35+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYl1qbF1mZmdlY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hJSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaandtYm5zamFZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtrcmxhbnVyZlFRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXWNva1lpc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRkhVYmhsb3BvbWxaTExOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHR0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICCb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDRkdITVpnaGdybm5oZmRgXl5YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PklaXVtcZWxua29tbWxraWhrZFNHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHp9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+AgICAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1LXGltbm9qb21ramxtZlFHRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYGCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozo9SGNvc21ubGtsaVVDPkNGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PUpgc3NwaFQ/Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkJsfWpAOjs+PT4/QEFAPz9BQEBAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO1tuQD5ERT9AQURfZDs9PTs6PT5BQUA+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKR1ZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo6bXdJODs6PT5BO0hkPTw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUj08PUlMRkV1dk43ODg6Oz4/V2pBOzw8Ojo7Pj8/PT05Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N6Sjtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PTxBU0Q/PDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcG9xdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnprYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVBQFlhR0M9PUBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dHd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVvdH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUpJamZRTUVDR0ZHRUdFRUVERUNBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTE5pZ1tbVkxITk1ISUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhGSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExNVmVkYmBlYE5fSUdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiIRWbIWHhoaGh4iIh3xQTE1jamloY2ZoZ19AQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREZHSUpJSkhISEdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGhIKGhYSEhoaGh4eGinVJTW11bWppaWlrSTo8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUtHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMj2ZRdXh0bW1ub2xENzg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouNim12fIRxb3BvbksyNjg3MzU2ODo4NzY1NjU2NzY3Njc6Njc4ODk6NzU3ODk3OTc3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJi4qJiYqKioqLiouLiHJzfHJxbm9uRDM2ODg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Njg2ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDg4SEhIWGiYqKiIeHiIiKioyLiouNhWxobG95fWY+Ozs7PDk6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN1eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKjI2Pf2Zsb3l+XkVDQkFCPkBDQUA+PT4+QD8/P0A/QD09P0I+QEE/QD89QEBAPj9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uMjY2NeXByb3ZdS0xISEhFRkhHRUNBQENFRENBQkNCP0BESEVDRUNFREFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGh4mJiIeGhoaHiYmKi4yNjIyMjIyNfHNycFhMUkxLS0lKSkpJRkRER0hHRERFRkRCSElLR0hHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQD07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjY2NjI2KeXd1b2NRTkxOS0pLSEtHREdJSUlFRklGRkVMTE1JSkdHSElKTk1PTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/f359fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7Oz06PkA+P0BDRklJUF+Bg4WFhYaGh4iIiIiIiIeHiIiIiYqMjY2MjI2MjI6FeXx4cllOTU5MSklGSklGS0lHS0pJSkdHR0tMTkxNSEhJSk1RTk9OTU9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIyMjIx5cmJdW1BQTUxJR0RISkhNTEdLT0xLSkpMTUxPUE5ISUtMT1FQUFFPT0pISkpMSkxGR0hHRkZIRkVFQkFCQlxvcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIyMjX9gXFdXV1VRT01MRUZHTVBPUFdVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1MTkdHSkZGSEpFREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yMi25fW21kSFVTU1JLOztTVFNgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0xLSEhKSEVGSUlJSElpcnZ5eHl4ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH5hiouLiHJhaFg9W1pZVFI/QFdWWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFVUVlRPT01KTEpJSUxNS09NU29zdnh5eHh6eXp7ent8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSGhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImLjHxyc1teXVxTVVNXV1VbWnWDWVV9kGFcWF1fV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiYqBboaJiIeEi4BpXFxdW1ZXVVhUUlhWY5aAUmVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fX1/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRUFJSUlZTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIiHiIeDkY6JiYiGhYiIhn6AfWBUWFtWVFZTUlJNUE1MZnpbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a39+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmJh4aDh4eHem9zWk1OUVFNT0xKS0VGSUZDP1RkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eXFlVUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ2YV5PRkFFRUREQ0FFUUNFQUM+Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVNkcnR2dXN0dXp8e3t7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn+DgIODgoCCgIKBgmxPSUJCPDw+QEFAQD9rUUtgRUZISUVCP0dMTkdNUVVJQUU/Pzw9PD09Pz0/QUNDQD89PUI+Sk5HVW51dHVzdHZ4e3x7fHx8fH19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqamZgW1FSWlxZXkpKUFFOS0xRUlFUVlVXUVFXVVBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZURCQkI+O0NDQkJEQlxdT3tOT09OS0xNT09RTEtNV01IR0BBPDk3NzU5OT07Ozs4Ojg6PzxCSD9cc3R1dXV2d3l8fHx9fHx9fX1+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXVpJSFBSUU9NUFFOUVJUVlhTU1lUT1laW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEdISENCR0lGRkZETVJQYVdTWFFQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1LVFRTUFFVT0xSU1RXWFRUWVJNV1laVlhYVlhZXVdXWGhza11WYXNrYmFfXmRhX15ZVVFOT09NSUhKTEpJRkNRUFNbV1RUTlFTWVNcZVVPU1RSTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTlHbXJ0d3h5e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5aX1tWWTtEVlhUW2ZKTFBTUk9OTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz88Ojc4NzY1OTk2NzY2NVdwcHN3eXp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlTVU9KR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBTTUlMSk9SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmhpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0hGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVFFQUVBRTlFPUVBMSkxMT1BPTlBRUU5QT0pMTU1LR0VFREI7PT08OT1HNjY3N0RtcHR2eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nVFFTQUdVUE9RUVBNTU9NS0xLTE5PT1FMT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6e3h6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT09NUVNMVFVUWFdVTExLSTw5ODc7PkA+PD1BQEI9PkVIR0NFRklHSkpARkFBQEZIRUpPSFFSYlxRUFJPU09PUExNT05MTU1OT05bV0tNUU9HSUhDSEpMTEtGRkZFP0JDPjxCRz9CP0FkcHR2enp6e3x7enp3e3d5fn58e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0JAQD5ARElFQ0dHSkdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xOS0xOTU1MTE9OU2ROSkxSSUlJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7ent6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxBQkFBREVHS0ZDSEhHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRGSUlKTEpLTElKTU1PUFJQSkdDS0dDQklJTE1PTklKSUdDQ0NESEpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktERkI9Pj06OTo7QEI/PUFCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISkxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS01KS0ZHR0pOTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdER0JDQD48PTk6OjpAQ0A+QUNERUlFSUpMRkhIR0ZGQ0I7QUJDPkBDRENER0xOSEtOSERIRUlNTk1HSUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSEhJT1JSU05SZmZmcW9zeHV7eXxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NDRUBEQj4/Pjo7Oz06PD5DQT5BQ0VGSkZJSExIR0dHRkVDQD1EREI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIT0tESUxLT01PTk9PTkpKSUxSVVVST1dkYGFtZ3Fyb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPEJBPkE9Ojo9Pzs9PkBCPkBCREdKRUlGSUhHRkdFQ0JBQUZGQ0JCQkRFREdHSUZMUUxJT0pKTUxJR0hFR0VEQ0lJSEtKR0tSTUJOTkxQTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd3dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREU8QUBAQzw4Ojw+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFST1BRTk9NTlBNTE1TV1ZYWFVYXVpdZGBpYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc7PT06PjpAQj4/P0NFRkRGREVIRURFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR05LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1RTUFJPUU1OUU5NUFdaVlpZVlpdWlhhYGFgXmhlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSEhHSURCQ0hFPEBFQkU9ODk+Pj08PEFCPD8+QUFGQ0ZDRElEREVFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS01LSU1LT05PUlVWT0tVVlNQU1FSTE9RUE9UWVpZXFpZW15eXWBiXlxhY2tiYGRmZ3KFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD9APz4/QkE8QD5CQUZDRUVFSUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTUxMSU1LTU1NT0xQUFFVVldPS1ZWVVNSUVJMT1JSUFZbW11eW1xeXl5gYGFkXWNgZWZgZWhqZHNzZmpnZ2tvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRkdJRkpGR0RJSEdJSEpMSEhKSklMSkZKS0hJS0pHS0tNTUpKTUxOTk1QS09QUlRYVk1OVFVUUlJRUE1OVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTUxMTUdDQ0FEPD9FRUVDPUFBQ0JDQ0RBQ0RBQUVHQ0hISUhHSkdDSElHSEpGSU1ISUpNS05MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAREJFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdISklJTEhKSk5MT0tJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQ0VFREZCRkZHREVLRkZKTUxLTExHR01JR0pLSEtLSUtLTkxNTExMSUxNTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BzdXRxc3N0dXV1dHd4dnR0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdDRkNGRUZFRENISEhERUtIR0xOTkxNTUZKTkhKS0pJTEtKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUFxubVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncG9qam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGSENHRElGRUVCRklISEVITEpHTU1PTE1OR0xNSUxLSUpNSUtKSktPUE9OTExOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNGREhHTEhFQ0NIS0lIRkpMTEZOTExTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcXR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnRzdnNIS0hJQkVFRUFBPkREQkdESElNSUZDRkpMSkdGS05MRk9KS1dSS0dLSkpOSUhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21xcG50eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFxdnR3ckdHRklERUNGQUBCRkVER0JISkxIRkNHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElGS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT05RTk9RSkpPUFFkcWlUWVdcW1xWWVtdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NER0VFQUVDQERIREZHQ0lLTEhGREdLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJSEhJRUZMSUpMT01KUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSS1lhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGFhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHJ4cnhzcXJ1cnRPQkNETE1CRERCRUlFSEdGS0pLSEVGSUpLRkVISFBLTU1KTVJJR0VBSEZKSUtMSk1KSEZESUZERkdFRktIQ0pOTExVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoaGhX91cXBycnN2eXl6eXl4eHh2cnl2eHJxeHZ1dmFTSkpNSUVDQkNHSEZIR0hLSkpJREZLS0tFRklKTktOS0hMTkdIRT5HR0xJS0xLS0tJR0RIRENERUFGSkVBS0xKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFYVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WVFLRkNHRUJFSElGR0hIRkZJR0hHSUtJTERES0tOTUxLSEtKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQ0BKS0hQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUVtXWmBfXV5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHR0lHRkZJTEpORkRLSk1OSkxJS0pISUZCSEhRTUxLT01KS0lHR0VEP0VDSUlDQ0hHRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJaXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHiIeFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktJTVBFRklKS05MTElLTElJSERIS1FPTU1QTExKS0hJQ0RBRURJR0NDSEZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV2BfVFBPT09XUVxbW1xcXl9iZmZlbGVvb3d8e4B7fX+AhISEhISEhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxLS0xLSUpHRUpOUVFOT09NTkxNSEtBREFDREdFQ0NGR0JNSEJLS09PTkxGTUZHSUpIR0xMTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NTlRSWlhYWl1cYGFkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoaHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxHR1hMR0hKSEdNTFFRSExLS0tOTVVOT0pKS0dHS1BTU05QT05OTk5IS0ZgRURfTEVnZEZOXEleW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRkdGSEVFS09TSUpGYFRISU9KSU9NUlFLTUxMT1JVUk9PSUxNR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXJ0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fWm5YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW19gYWBhXWBhZ21wbGBwd3R4gYGCg4SCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEdJS0VSVkxLTklLUlhXUU1PT0xRVE5PUU9LS05HTVBTW1pTUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJvb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ213foGAgn57eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0dgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5MT0hRUlRZV1ZQVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVib3ZQZWVKZnZxbXdvgGpmeHdpV3JRaHptaWp6en5seHp/b2hvWXZ2anZ1cIBfcmZ9aWx4fG9eX19iYVtdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J1eX6Bc3V6bnx9eXhybk5LU3VOQ0JGUE9ISktJS1BPT09NUFpgWlhLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXF9kZGlnaGVlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX5ucXBre3p0cm9tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTE5JVFRXV1lXT1NOTk5RSVJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlVMbGB2dWtpdXt6bX54a3xwXF5eYlteYWRkZ2VlZWJaY2Npa2tyc3J2Z2xpaGRnYWFrYWdzcmxnbG1yfGttaGt7dG1ta21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZUVFRhX1BOTUtUU1RRVlZOTkxNT1BLSFFOUFVMS0xTVFRTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFhaT1NVV1hYUl5ZV15WVFBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09MTVZUUU5VU05PTUxRUExKUlFLUU1LTFBTVVNRUlNTSUhMTk9RUlFQUVRWUlhXXFdTUlBSVFVWU1pRTlNSWFZUWVZVWlZUUlVTVFVXWFZcWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTU9VU05STk1PUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11gYF1bYmJjZ2ZlZGJYX2FiXmBnZGZlYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2JPTE1MUVFMT1RPT1NRT1FbWVdXWFtZWFhWXWpkVlhZWldWU1NPSk5WVFBPVVBQUE5NUlJQUlhUUVFPTVBUVk9YUlRVVU9OTVFTVlVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUVlZWVllUWFhWU1JZV1ZaXlldX15VXlxeYFxbX19fXlpiYmRoZ2RkYlhhYGJeXmZjZGBiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xZWltkcW1oZF9bWFZVV1FMTVZTTU5ST1FST0xRU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VYWFteXVtbVlFOVVZVW1xXUlNXVldYVlRZW1VUUlpYV1xeWl5fYFVhXGFhXWBiX1xgXWNhY2doZGZgWWNgYV9fZWRfYGJbWlxbXFlaWVhXXFpcW2BeX1teXmFgXmJcWWBbUU5PTlZRUFRRT1RUU1BXXFxcWF5cXldcXmpxd3mAY1xbVVVXUE1PVlNOUVFPUlRRTFJUVFlbV1VPUk9TWFdUU1VSUlpPUFJSVltWV1dUVlpYXF1bW11WU01UVVVbXFZSVVZWWFlTVVpcVVNTXVhaXV5cYGBgVmFbY2JdYWReXGJhY19jZmlkZl5bZGBhYGBjZV9iXllaXltcW1lYWVZXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRT1JaU1JRVFJUVVRLUldWW1laU09TUVZWV1RPV1JTWlJUVFRYXVdYWVNYXFheXVlaXVRVTlVWV15bWFJVVVlZWVVXWlxWU1deWl1dYF1iYl1ZX1tlYV9kZF5eY2NhXmVmaWRmXl1kYWBhYWJkYGJeWFpfW1xbWFhYV1dbWVtgXFtbXFtYWlteVl5ZXVFPT1JaUFpUVVZWVFRUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtaVVpeWF9eWVxZUVdSWVlZX1taVFVWWllaV1haXVdVW15dXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU05QVllRXVVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhXWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSWFNXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWlxWV1hbWltZWVpbWVdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYltmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlbWVVXVFdbWlpcWVhZYFdQVV5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1pdXlldVVJZV1lZXWJaXldYW1xbXFtbWlxaWl9fYGBkYmNkZGJkWWFmY2ZmZV5hYmBjXmJjaWRjZ19nXmFhY2FhYF5fWFRbWlpbW1hbWFhcW1pbWFdZWFdcW1tgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW1xaVldYWVxcXV9bWVtiVlRYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5YVVhXW1tfYFxfWFlcXF1eX1xbXVlbYGFeYGVjZGVlZmJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZcXV5gYWBfYl5ZYV1dXllcXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRaaGhiZmljZV5iYmNhYGBfXV1aWFtZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVlUWF1dX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiW2NnYFxpaGJoaWVkYGJhY2FfYF9cXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWJgXltgYWJmY19dVF1gYWNkZGZlZ2VmZmVeZWZoaGdkZGBaZWdeYWdoY2hoZmNgYmFjYl9fX1xdW1pbWVhYWFZaVlxbWlZWVk1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7enp6enp6ent8fHx8fHx7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3p6enp6enp6fH19fX18fHx7fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIkMzT0tLS09haJSsrKyolY5KNjYyMjYl/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIqU3ebk5OXl61QTGxsbGxRdlpGQkI+RjH9/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXl5e3hwb29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2EhYSEhIOEeHNzc3Nzc3l9fHx9fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnd6eHp6eX55eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3l5eXl5eXl8fX19fX19fHt7e3x8fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2eX18fXp7fnt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjYyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fX18fXx+fHd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4SEgoKCgoGBgoKCgoKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3dnt9fHl7fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp5en17fH18fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4e3h6e3l8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKCgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mFhIOEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHl5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veHl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4OBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7e3x8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYGAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoKCgoGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0dHR0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm5ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoKBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzc3NycnFxcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycXJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubm5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoCBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXNxcnJxcW98gm9wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKBgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwh4ZwcnFwc5iCbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF9oYJwcm+LnnxvcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFycXSdoXZxd5+cfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZiokG+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3Jyc3N1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nyc3Ryk6mkeYignXxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3d3h4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eXmftKmkqKiXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7ia+mobWrrKN+e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2YpZaisqCZp5N9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+gIB/f35/f4CAgYCAgYCBgZycjqCwoJ+in4CAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5qOmLKhmJachXx+fn6Afn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f4CBfn6fq6SWpJublqCfhn9+fn+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KDg4aNn7KooqCYnZ2mqK2ooJmRh4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNoK2xppuaoJuenJydoaSjnZSHg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoOLl5qXlpigmp2dnZqamJCJhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBho6Uk5eanJyblI+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5OSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDg4iQk46UmJKHg4KFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkpCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgYGCg4GCgoKBgIebh4uHgoOCgYCAgICBgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf4OIjoCBgoODgH9/gICAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f4yVgoKBgoSDgYGAgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIODgoWCgYSFhIODg4KDg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTk5CNjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgZCMg4F/fn18fYycjoCCgYGCgoWUlIyBgoGCg4KFk4OBg4WDg4SDg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUk5OSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgpGUgYGDg4KDg4OCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDgoOGlpWQjIKCg4SEg4ODg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4SEhISDg4KCg5CUk5KSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhH2GiYB+hYWFhIWCf319fYCDhIOEhIuZoKqom4qEjomDhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaGhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkZKNioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/f3+DhISFipOYoKWkm42Wh4WEhYWFhIWEhoWFhYWGhoaFhoWFhoWFhoaGh4aGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhYWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6Fgn9/f39/f39+gICEhIaVl5WXn5+enZKHiIaGhYaFhYaHh4eIhoeHhoaGh4aHhoaHh4aGhoWDg4SFhYaEhYWGhoeHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4iIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FjJybmpeanJuZjoeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4eHh4aHhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357en+Zl4qUmZmYlZSMiYmJiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7fJqVf4GWmJeVk42JiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4OEh4iIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19gZePjJiWmJeTiYeHh4eIh4eJhoeGiIeHiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6gpqfnJiNiouDhISGhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjZCMiYaEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GEhIODg4KCgH19f4CAgX99fn59fH19e3p5h6CemoyHiICCgYKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goSDgoODg4F+fX5/gICBgH59fX19fn18ent6j5uXlpKJfoB/f4CAfn2Af3+AgIF/gICBf3+AgYF+fX1/gIF/f35/gIB/gICAgH+AgoCAgoGAg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x9fX59fX5/gH99f359foCDg4KCgoGBf319fn+AgIB/fn19fXx7e3t6enp7jpeVl4Z+fn9+fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f39/f3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp6enl/kJCPkZF/f35/f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af35+f3+AgH5+gH9/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp6enmCjYmPloeBgICBgH+Bf4CAgIGBgoKAfoB+f35+f36BgIGAf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaFhIKBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgYKCgoB/fn19fX5+gH19fX19fX19fXx6enl5eXuIiYeHiIOBgoOBgIKAgoGBg4ODg4GBgYCBgH+AgYOBhIKAgIGAgYGBgIGAgoF/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYSEhYSFhoaGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eXyCgoSFg4KEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5en6Bgn+Ci4SDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDg4SDgoODgoKCgoODgoKRkIuIiYeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl6fH+AfYaTg4ODhISUk4CAgX9/f35+hIuAf4GAhIaQiYWEgoKBhYWLg4GChYWGhoSEhYWDhISDg4SDhIWEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6ent9gIKBgoGDgoB+fX9/e4iRfHyOln99f3+ChoqFg4OEg4KDjYl/fX+DhIWFg4SGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYOEg4GCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXl9fn+Af4F/fXt8f359gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32CgYCCgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH9+ioJ7ent6eHp7e3x9e35+f39+fn5+fXyAgYB+ho+Bfn2Cfn9+gIJ8fIB/goCBgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMjI6OjYiIh4WFhYSDgoKCgoODgoKDg4KBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX+AgX1/f4B/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3x8fHx8fHx8fHx9fXx7fXx8fHt8fHx6enl7fHt9hYODgIGBfoB/f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn9+f4CAf3+Af399fXx8fX59fH19fX19fXx9fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36LhIGHfn18fH5+goJ/fX19fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjYyPjYuKhoSFhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fX1+foGBgoOAen5+fH5+gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fYGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f3+Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fH18fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIkY+NiYqHhYWDgoKDg4SDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gH9/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg319fXx9fH19fX19fnx9fH18fX1+fX59fX19fHt7e3x7fHx7ent7enp6e35+g4WIh4iKi4uKiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX19fX18fH19fX18fX19fn19fn58e3t7fHx9fHt6e3t5enl4eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Jgn9+gpGEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f3x9fHt8fX58fHt8fXp6eXl5eXp7fn6AgYOHhIiPjouLh4WEhIOCgYKCgoKBgYGBgoKCgYKCgYKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGCgYOBgICChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH99foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fXt7e3x7fHx9fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKDg4SDhYaDgoF/f4CCgH+AgIOAfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e31+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgoGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoKCg4WDhIOCg4SEhIOFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYCAgICBgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISEg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhIWDgYCAgH+AgX59fX5/fn5+foB9fX98fX1+gX+AgICCgICBgIOCgH+AfoCBf4CBgIB/fn59fn59f35+hYWBgYF/gIOBf36BgH9+f36Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX+Af3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f39/f4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/goB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fnt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhYSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4CDg4OBf3+BgYCCgYGBgICBgICAgICBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH2Afn+AfX9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhIOBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgYOCgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX59fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2d3ZzdIaEhIWFgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn99fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3x8fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgYKBgIGBfYCAfoB9fn1+f4CAgH9/f398f4B/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+Af4B/f4GCgYB/foCBfn+AgoKAgYOChIWGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXx/fYB+fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4GBg4J/gX9+f35/gH19fX1+gICAf39/f3yAf3+BgIGAgH98gH9+fn6Af31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXh5eHh4eXd7fHt7e3+FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Afn5+f39+fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGAgICAfX5+f4B9fH58f4CBgICAgIB8f3+Afn+BgH9/foF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t7fHl3e3l3eHd3eHt7ent8hYl9e3p3enx9fXx8fX19f358fX5+fX19fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgoCAgIB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/foCAgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKNenx9fHt9eXt6enh6gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fX17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgYCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5fHx7fXx7fHx8fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgoKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKBgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fXx9fHx9fX59fX1+fn9/gH99e3x8fHx8e3p5e3t5eXNydW52cnB4cXZ2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKAf4CAgIB/gn9+gIGAgn+AgICAf4B/gICAf359gH9/f3+Af4B/gIB/gIGBgICAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fXh4dXh4eXt8fH17e3x8fH1+f39/f359fX6Af3+BgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgIGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf4CAf4CHfn58e318e31/eHd2eXl6e3x8fHx7fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enJ2eYWFgoOCg4OCgoSEgICDgIaDg4SBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgYCBgYGBgYOAf4GDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYOCg4KDhIKDhIOAgYODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOCf36Ag4KAgX+AgoOCgIGCgYOCg4GBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3x7d3x5eXl7en1+fXx9fHx9fn5/gYGAgICBgYGDhIB9gH9/f39+e3t7ent6dHF4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSFhIKDgoOEgYSDgYOAgYOCgoKCgoGCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4F/f4GEhIGDf4KCgYOBgoKBg4ODhICCg4KDgoKBgoKDgYOEg4SDhIWEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoKAf4GCgoCAgoSDg4KBgoKBg4KCg4OEg4OEgIKDgoODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYF+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgYCAgICBgYCAf319fHx9e3Zydnh4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGDhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKEg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOCgoGBg4J/goOEg4OChH+ChIODg4OEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fn1+gYGAfn59fn1+fn5+fn9/gHx9gIGCgoODhYOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4KBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYOAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB/fXx+gn9/fn5+fn19f39/f4GAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYqJhISEhIWFgoeGhoSEhISFhIWEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOCfYR+fnJ1g4KBdn6DhYB9gXWBeoR/f39/hISCg4KCgYOEg4SEhYOEhYaEhYZ9hHp9fn+De4WDgYSDgX99fn9+foKDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgIJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygoR+g4N9gX1+f35/goOCfH+BfX+AfX18fHx8fX18fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgoKEhoaDhYSGiIaGhYKGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhIZ9cHuBcHl2foN/gm55cHVzfHZ5eYZzhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fX9+fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KCg4WHhoaAgoWDg4WHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB1gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fn2AfoCAfn6AgIGAfn5/fn6Bf4CAfn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhISDhYeGhIWFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WEhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fX99f39+fYCBg4OAgoOBgYSCgH+BgoB9f3+Bfn9+fX6BgH5+gYKAgIKEh4aDg4aEhYSFh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3B5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFhoaGhYSFhYWFhYaJioeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEg4GEg4SDhYOFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WEhISDgoF+f357fHt+fHx9fn9/fX1/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaGhoWFhoSFhoaGhoSHhoeHhoWHiIiIiIaFh4WGhoiGhYiHiIWHhoaIhYWGhoWGhoWDgoWFhoWFg4SEhISGhIaGhIWFg4aGhYWFhIaGhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn58fX1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYODhYaGhISDhISDhIaEhoaFhYWDhoaFhoWEhoeFhISFhYOEiIaEg4OEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn59fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFhoiFhoeFh4aHhoeFiIiHh4WGhoeFhoaFgoSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGh4WEg4SEg4SHg4SBgoSFg4GAgIB7e35+fHx8fn18fHx9fnx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoWHh4eFh4aIiIeHhYeHh4aGh4SChIOEhoWHhYSEhISEhYaGhoaFhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9fn58fHx+fXx8fXx9e3x8fHx8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiGhYeHhoaHh4WHhoiIh4aFh4eIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf39+f35+fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYWFhISDhIKAg4GGgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFhoaHhoeFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt+fXx9enp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYSDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeGhoiIhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4WFhoaFhYaCg4OFgYCBgICEgIOAfIGAfn6CgH2Af4F9gHx9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaFhYWEhYWEhIKCgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDg4aEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B8gX99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15ent7e3p8e3t7e3x9fX18f359fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhoSEhoSHhoaFhYWDg4WEhYaFhoSEhISFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6enp7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoWGhoOEg4aChYGBgH9/gIB+f4GBfH5/f35/gIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGhoaGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5enp5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9+fn9/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChoWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn9+f4J8f359fXx8fHt7enp6enl7eXt6eXp6ent8eXt9e3t+f3+BgH1/fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgX9+f318fH19e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLzMvLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NTT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svLzMzLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19jX19fa29ra2tra2trb3Nvb29nX19fX19fX19fX19fW19rb2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0jYuLi4uLi4uLi4qKioifu7m5ubm5ubi4uLi4ubCLi4uKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFhSU1NTU1NTU1NTU1NPd6ikpKOjo6Ojo6Ojo6WVU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0NLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp5cVldXV1dXV1dXV1dXU3qppaWlpKSkpKSkpKSml1dXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzc/R0dLS0tLS0tHS0dHR3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqiZmFiYmJiYmJiYmJiYl6Crampqampqampqampq55jYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Nzs7Ozs7Ozs7Ozs3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs/Ozs7OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzLy8vLzdLS0tLS0tLS0tLS0tLRzczNzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztLTz8/O0NPQztLU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19fX19fX19bW1tbW1tXW1tbW1tbW1tbW1tfX1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvVkpfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rOzc3N0LmDhIvH08Cay8/Ozs7OztKrnM/P0rmPvtScgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT08PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK2nKWj1MCUsJyxlri5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/OnZyRncWkoIuRw5N9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I6NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv5igm7OnnYedutTSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9COjc0Ojo6OTs7ODs9Pz0+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P07SZlqq5l5yQn6DS08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A8PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz9Srmn6jkoqsr5GhudevoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PD9APDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDUrJuni5iKoZqtm6nYo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q07aysqWbm5qmxZii0Z6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXEopmWnK+enJubrcefodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTo6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6DH1aKrpJrPpquknsW0pKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09PIko201syTkKfXuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVUxGQjw8P0ZFR0tJPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MjB1dHUyr3V0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRExMQT43NzU6ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHT1NLS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PDg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc2ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7Oz4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PD0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBGPjg7NzI3OTY3NDUzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO1tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6uvsKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo6Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmpqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmpqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpaWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo5Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0E/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioaCfn56enJycnJ2dnZydnp+goqGio6OjoaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5iXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5KUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqanp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqWl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6SmpqWlpqempqKdnJ+hn5eRkZCUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaWmpaWjoKChoaCZkpCPlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaCgn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU5ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WSlJicmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODY4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqOjpKSkpKKhoZ6bmpmXobWemZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpmXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6ChoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKCgoKKkoaKioqGgnpybm5uZn6ubnJqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY6NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCls6ygoJ+fnpyZmZqam65qdp2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5uam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCfppKbq5+goJ6bmpmamaiERICfn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5eVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnqCeYpymnp6cmpqbnKGjUUiEoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuapmZdo6CbmpmbnZyudUlMhqGcnZ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKSAUniimZmanZugpF9WToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgiFtflJqZm5yco49kWk2Bop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiZn5ddXXaXmpydnaKBZFlNf6Ken56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubmpydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmaYGFggJadnJ6YdGNVT4Gin5+fnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozg3OTo7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmZn2leW2V/nJyejGpfUVOGnpuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal5NzaGFUdpOXnIdcV1BXipKOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaOimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6Smp6SfaCjlqScbk1QY4aGgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CEoJ2OfmqUpZWdfYiAX3J/gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5/gKKLe21RdZyMjFpxfXx+fXyGjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZiad1dOS3KThoNNX29xd4iFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY2jjVQvLz14h3d2QURda22EkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KmnGdCW0g7eHlrZ0UxOFpsc5CPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mpr49KcqJ5QXx4ZGJRVF5JYG6KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKN4YMHWpUN8joN1T26OdlNkf6Oop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkp6eZnaSlo6KdYn+9wK55oaSalWVMX3htUXSVoqKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqadnmqEnLqOqdGimrOoWEytk1Nlj6CeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+roqKFd359cs7Gr5mmr2tVqrBjW4eln6WioZ6gopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e0tbazra6sjoaDbpHMvJSUpZZ0VG96c3B9lqaqp6Sgn6ObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3u7u7ubnBuLS1n4d5ZFiftbump5mId2txb3h5e36FjpKYnaOlpqulpJihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW3wcbMz87Myb6zpI9yZlJEi5WFhYV9eHFuZ2ZsaWxycnFycnV9janExLuip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYWZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PFx9vj49rLvK6jlYh0WVpRRGl3am50bmtlZVlXXVhcY2pqaWZhaYu2wcC5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3b21bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7N0tXKuaack4VyXlFUS0RbZV5jamVhYGhZVFhTV1laXVlbdZq3vKy0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudnJydnJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/wsHHy8i2k3RjVVBPVEg+XmxfX2ViYF1kYVNVV1ZVVVhznK2xqqiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5uMObYUlER0tEPVtlYWJpY2BbY19XUk9QUFeBtLqsrqWko6ikoKClmam0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZ3N4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwa2DT0ZNRTtNWl1lbGVfW2BZWVNOVYCjq7m1sqypo6GtqaynrZ+stLS/w765uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dmVmampoXmtwbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCxpZqWEc/P0ZdYmFqYFpYV1RWd5q3v7u8urysraapu7q5t7+ztbiywca6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rraussZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aGpqdW55bF5kW1ZgWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnOxcbGvalyUEswWFNWZWFTTlBxqcjIwsTHwLy+tLCwsMK+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2tr7WkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPCwbyRP093gIpWTG+ly9TFtr+/wL+6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVnZGxlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzFp3drgpCXb6vIyMfRwa+9vbi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFjZGRqY2dkW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Aur/AvLvFvbrAxL+9vq9zZH2RiorRxb+/yb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhY2Noa2dnamZqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWNuL+7w7W6x7a1uLq8uLm2qqSYjX6Eyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVncGplbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/Ed6jMvce3ubettrS3ubO1sb3JxJRJe8q+v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdxa3RmY25gXFVIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTWrnSAu8jPwsC4rrS0u723ubG9w8qNQ3XNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXJmbGpvdW95ZGhjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0plxcqvR0czKxLW6v8TIvr60v8DBeFJuy8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1tdGxtb2BjX2JiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQw7q+vMS+t7zAv8nPx8jKysKGcnOjzMzLzcrGwsPLzsG8uL26sW9jYrvIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWRcX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9vDvra+wL6+uqacqbK2w7+leXV4mcTHy8jBw8DAycrBv7u5saB8cmytyMXEv8DBv8vHw8DIwLrCu7mzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEuG2tzr22ucC8rH1uaG5tcoGVmHN3fJe9v8bAucC8vsXEvb24sbCYkH2Am8rCw7y9v7/Dw7+/x7y8wLSzrrS0vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBhWlRRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbN2gbO9trXCpYdpWl5gTVJbWm5zd4CfuLjCurO7t7u9v7q7u66km5iHkH7AxMO+vL+7u7i2wcK1v7q0ra6sr73Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2eG5yYV9nXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmohHiKoK+1nWplZ1ZZYElJTVBTbHeGpbC3vrmytbK7uby2ub60lpyllaFxrsnEwL2/ubOusry6rru0s6Wqpqy6vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybWBkYlxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fqoh8dYygmWBUQ1hVR2FqVk9FSmCNoKyvtrq1tLKsvLm4tbjBvYuYsKGlcqXLwr+5urWupayzsaaysKidoJ6krba0wba1s6WnqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8cHZzb2ReaFldXlNPTkI/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7WRgniIj29OSj9kWUJOd4CUak5BXYGwtbO1srSvrLu6uLa5v8V1g6qemWOpv7i1srGtrZ+kp6airqaclZiXmZ6orbirqqqepKikq66vp7Crr7GxrbGurq+5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2dG12amxdXGtVXlxQTkhER01CR05HODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFOh1lKSlh3jYFjQVOjubO0srCxrbC5uLa7t7q8j6Gyq6NyrLCpq62ro6ignZ2lmoWflJCUlo6Wnaeto6Kjn6GmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWl1dG9lVWJkWF1ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmZmZVpTkBSeHFQSUlLZ5yBWUVSrruxrLOvrqyttraytLWuqKafmpudnqaonqCoqZ+hp5afkVWBnpGMjpSLlZmip5+foaKhpaWco6OgnqWgpKylpqiloqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh4g3x2f3pjeG1uXVFpVVBPR1BNTUNQUkE/Oz40Ojo1Ozo9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Cq6W+aUVSnYJRV0lKYEpUjmBjYoCutaqytK6qq6+wsrOtpZ2Rl5OPl6CfoaCco6SfnqiUo1VWh5WPi4yUkJaaoKeen5+go6WonJ+goZyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOfnaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fIB1dn1ubHtkaVZTZE5KSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaCqxr/LoVBBcp53T25LS2NmdXNgWl5wkLGvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqkmpM6ZISNjIuOl5SZnqKpnaGgnKanq6KfoKefnZ+jpqieo6afqp2qraqup6iwpaOkpqespqKlopuZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJfIB+d3l8ZXl5YWJTVmFJSUtMU1VKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfHjldTSWWjW2V+b3JdUWtjW2RfXWuPtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXoqOAPWSAgXt5f5SYnaOjp56mq5+nrq6qpqKxo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbWVcU1taTVJLT09WTVRNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpI16VWlydnVwY3Z2WFdjYGNnWVhXZq2urK+nn56ioJaQk5ugnJmXkpOfnKGjmp6blp6gg2pjZnB6eHV+jJumqaultbKfrbS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpafm5uYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dmp3dV5tW1JhSVJWSEZWV0tDTUg9S0k4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCkgG6CcGBjWExbU1pNTFBYUkhNTUiYrKqppaCfmpKRlJiYlpaWjIiLjpSdnJ2cnpadnrarf2d/hn11eXuBnbSus8GYqbe4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwbe7tquusbm3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWln52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21oblxYXENXTkpHTUhDRk49Pkw+NDw6Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYpiV15lYFdNUUc+Pj9DQz8+QlF4qa2pqqagnp+io52fnpudm5STlZSenpiUhZ2ZoLzVuZWFiIyFenFwbICpu8SckLnDvr/Cv7a6u8DDub27rK6nsa2xwra4wsbAyMrAyr+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqqvo56sqLeyraOwpqGjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V9YF5lYFFHRDxDPkU8Pzk2Tn6qs6eko6KgnqWspp+YnZWSmp6ZlYyKhoiGeG2Hn7Pb1LyrnImGi4JyaF1dkM62c63HxcXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Aw77Hx8K4xMrJxMHHv7q0uru1u7ewtrKru7KvvLfAu7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p+c2phV05FPklZfG9iQj1cjq6soJmbnJ6emZeXmJONj5eXlI+NkIyCg4J2cnBtcJG7w8fEwLeWg4KEhHJgV4W5gIDQzMzMx8rFxczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsfGysjPwMnRzcfGyMbCvcTBv7+/tb6zrb/Aw8PHxcjEr7+5sri9xMLBu7y8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nXlpaRE9NQ0ZRSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9Lhp6lmoSgsq2jnpyfmpiXlJOUl5GQkI2IhISJh4OAgYGAeXFyb2x7iGeOrba1oY59enpraGVxhF+61NHRzc3O0MTN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3K083O083GycrKwsfMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArrCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZVZYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnGNTTEpEQz9DUq7RvbKvppycnKCkoZ2alJSVlIp9eXFsZWJocnBye4WKgHVwbXFxcHlRWXyYpKOWfm9qY2ZqZl2T2NHS09TSz9HD0NPW2NXV0svJztDLxs3SytLV19nW2NPW2M3Sys/RzM/RzdPQwMnIy8TMzczPz8bHyLbAy8DSzczQx8rJwMTDyM/N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVyY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqJbSUBBREFGUXayr6aalJefnJqgoJ6bnZqViXdpZGFfX19fXl9fXWFsdXNwcG5scW91gGNad5KbmYVpYV9jaWN5zNTNz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ19fY0tjS19nV1szPz8nN0szO0cDHxMnHz87R0dLIzM3Ay83G1M/Mz8nFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNFQ1NOPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ6lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZ0M4PT5EWIKqqJ+XlZeZmpyfnZibnZN9cWVjYl9fYV9eYWBeYWBfYGVtcHBta25xcnZ8YF2AlJiKZ1lZXm11l8fUzsvSzdXU0crPzNPW0tHWzc/V1dHF0dPK0NTV1s7T0djY2NfLyM7Eys/NyszAycHJys7P0MzQzs7Mz9DIzNDRy87Lw8rIys3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRE1ZRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+ZpaegoKOnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksnxIRkI7Vo2hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5fX15cYm1xbm5xcXJxd3dbZ4ePimJVWWqCkZ2zzc7EzcrS0s7GzszN1MvO0s3L19bQzNHUy8zQ0dPKztHV0tXWysDKwsbNw8jKw83ExsnLy8/Lzs3RztTMx8nQzcnHy8bHwsbKzM7R0cfQz87OzNDFx8G4ub3Dwr3DubKyvrC7w8S1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElRUUI7RD87Njg6ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3xlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFwcXFtaW14aFV4g3xbVGl/kpufrsXGv8HEzs7HxcfNytHHys3NxtHSz83M1MrHys7Px8fP0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNy83QycXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxcXIu8fDycnCz8G9vL+wwcnHub2qsbKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVVHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KFoqqTjY2Wj4WDg4OBfYSEfnNfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG1taGdpa3FfZW9qWFx3gpGXl6K3urq4u8jFwcPAw8jJyMjJx8HFy8XHys3JxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbFvL/Kw8XH0sXBycDKysbIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdDR0RMREZTPzU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bV56fJ6RipKWhnqAhIV/dXh1cnBfWltdYGBiY2RkZWRgW1xeXV5dX1tZWlxibnFuaWZna2ludlxaWlxgc36GhoKSrq+xr67Aubq7ubjAwcHDvb25vL+5xMnFxsK9xsC3u8PIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMyLLHycPOzMDFw7+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRUJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys/FycXHwbrFvayup2BjdoGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXWdycGtkY2lqanVwSE9cWWhzb2lkk6WmqqijtbG1s7Kys7u1vLC2r7OvsrvCu8HEvL+6tLK6vsC4yLi0vLbAwr24vcfBw7u1r7O1u7+0xbi7tay5vb7AvbG7trC3urPGvbevvL+1t7XFvb7DxsDExsbHzMW/xsa7x8u/z8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TFy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJpbZ2+IjoaIiXp4foWGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXlxdXlpbW1xfa29sZmNmaGdqeV9DUExcXFZSc6Ganqaimqepr6upq6izrbWvsaetpqyzu7q2w7m6ubCqtLm7s8K5r8Cxvby7tbvHucO3raqosLLAtri9sLGosrO1u7yrrranrrauvLKwqriwrruuu7i7wMG+usO/xsPFwLzGwcfKuMXHxb/Hw8O5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzCurO1tcOuqrGTW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXWNtbWZkZGRlZ2x4UT1FTFhfWpellp2fm5WXoaeroqahqqmrqq+ipZ6qrbW2sb24r7evqK24tLO8t7O8sLi5tbK8wbLArqWpo6uxs7OovaqrqKusrrW0pqmuoaWwqbOmp6iupqi3rLGzt7q7u7K8vr6+xL+1wcDHyLe+v8W3xcPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8LLvrvJtr3DvrrKt8HDwrW2vLaxr7W8ramrk2RtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZWpkYmNhZGRobnNGRGSBcF2UmYecrpaSjJyepqGhn6SlpqWsn5ybpKWssrC2tqewq6eqtKuzubC1ta62ubOwurqxtqSgpKCmsaisqbmqpaenqKezraCnp5+cpaasn5+npKGhsa2trLK1s7Swtby2u8HAsru+w8GxubnCs8C9wLW4vL2+vMLHxMPEv8DEoIR5cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs8ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhaXV5jYmBjY2NiZWVsa1l7eV9UXEReYpOkkYeYnZ6km52eoqSipp2aopueqq6ssbSjqKmpq6yktListq+ts7Wvs7WvsKqfnp+korKlpqq4raKmpp+orauZn6CfmZ2fpZqZo5ycnrCprKiqq6ytsLO5r7i5urC2vLu6q7OyubO9tLeysba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uci4uL+3ssK0sbu7rLq6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFdXV1dXWFdaXWFiY2NiYmNkZW9mWVhIMiEiXFhfjpSJlp2epZyZm6OloaSbnqCamK2tra6xoKSiraunobWwsbGsqa+zqLqzp7ahop+co6Gto6Kqtqqio6aepqajlpmdl5manaCal52cnZytoayoo6Smrauzs6q1sLKrsrm0r6qvsrKzt7Ouqa2usriwura6vb+3s7GUhnp2Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0JCQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMLMyMbAxbbBwMfOt8DDvbO5ubK/trG5u62yta+fmqOqoZSaj3h/g4R/eG9xdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVVdgYmNhYWJgYGRmcVE6MyEaK2iUj3iRjJGbmZ2alJ+fqKKdnqecmpmqpq6wqpuio7epoaCuqLWqpqeusaS4sKS3oKOcmZmqpqGarbmwo6GknKKgoJOVoZSWlpyZmJaXnJWfqZ6qpKKeo6qqsa2otKyqp62zsKWrrrOxr7Cvr6eoqLKusrSwvLS6uK6jlIJ6d2VfYVdZWFNSVEtNXkxQTEdITUxFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rZ2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwsLGqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1ZVWmJiYGBhX19gYmlpPTMtMk5/jZOMk46PlpuYnJOdnaWkoqWmnpyepZ+qrqWfoaO2p6GhoqmzoqWopbCmsa6rtZ+hnZaVqaGilK2xsZ+jo56emJyTjKCUkZOYmJKXmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqa6vr6uoqqqzpqarr7Sxrry2sa+vn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk5PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLuxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVlJUUlRfX11eX1xdXWBha1g0P010hIqJjJKMjpGelZ2UmZ2joKuko6Oio6GbqaqjmZ2ksamhoJ2lqp6oop+trKqprq2ioqKVmKKanJCsqbCcn6Kfn5eZk4qdkY2SlJaQmJiTnKGjnKWhopWgoqSlm6OrpaKkqqSrraWusqmmpaamtaaqqK2ztbS5uq+qrJ6Mc3FwYVtXVlZSR1FPSFpcT1JKVEtTTEVHSkM4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm8sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RVVlVUVVVSU05QWV1bW1xcXF1cX2NoQFJxh3uFhoWPioyMl5aemJiepaappqqmqKWimKSto5SYpK6poJyZm6CfrpmcqrOfpaafo6OhlJSblpaSqamtm5yfoaCblJCMmI2MkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrilo6SjrK2qqKuvtLeyvbWzq66YhXV0aVtZWVNVUkZYTFFbWE1VT1BMUVJJT0lCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njg6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7euqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FYWVlZXFtaW11eZXF5dn9zgIWBiYSPi5KUnZuXnKinpKyqp6+jppieq5+UlKOopp2XkY+anq6WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9p5+jrLSqrqevtLC5tcCxrrCrkX5ydGNWVFVOUkpHVlBSUkxMWE5LTE9TR05LQUNGRUM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxt7i8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRRTU5NUldYWVhYV1pbW2BqdGxyaXuCfIZ/j4SPjpOXlZqlmJ2opaSqnaaXnqSakY6eopqXl4aFkpukj5WinJWWlYeimpuTjI6KkJqlp5uVlZeckZOIlI6LgYyNgJCLkpKSoZqgopaUmZiVoqaajZmkp6mnoaC0sqizuKGdo7asqq6ksrKmtbu0q6yxoop6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUhNSkFITElIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLEtbWys8bFt7rDyszGs626vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0tTV1dWV1dXVlpdYWlkaGN2fHZ+d4l+iIWPjY+anYyXmqKgopiklaCalIyGmJqLc42Dfo6XloaSmpCTjo17mY+cjIKJgIqYoKOekJOYloWOgpR+fnSKjnqQiJOQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLC7qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU05JSkpFS01HS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY2Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLi5wM7GvrOsusGsrcStqKKmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpHTlNTU1RUU1VZWl1oX2NgcXhxa0lTbYt9kYKImJOIkY6el5yVlZWTjZWJf5OJXztWb3yMlIqAjJKMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFwho19iYGQjpCXmpmTi5CKnYifmIeIlp6aoaCXp66prampnpats6KlrZmtrJins6OpraOTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS1BKSU5QR0pKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKapp6OqsKintMK5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFMT1JUVVhZYGVeW211aUo9O3ySjYt5hJCJgoeKmYyVlImRhoSUhXiIf2BKUW54i5KEfoSMi4R/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiJSFm42ChZKblp6dlKSiqKmlpJ6bsKqhpKSRpqqWoamcoaaninduZl5cSFFRU01JVU1TSUxLT0lIRkpOTE1VS1FSUEdKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+sqrW8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/iZSplpWLf46Eg354cW9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNTVVprdGRocWBfVU+Mg5CEcHqCfXmCipGAkZmLj3qFjn90f3hybnVwdI6OgXp+iquFentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWKiIqNi4B/hIuNgJSEfIGPmJSclpGfnameoKGdoKmln52YjaekkqCflp6fpIFzaWJdXUpXUFJIS1hST0pNTFJKSkpMUEhMUU1SVU1GSUI8Nzg7OTk+PTo7PDk4QD86Oj48Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3eGeHx2cG9qWUtISUhHRUhIUFRUVFdXU1VVVVVWV1hXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXnF6cGtcboaRlYyMd2N1fXN1fIaOe4KYkn9who57dnpua36tfHSQi396hpKAfH90ZnV8hmxvaHN8io2HgG16cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSm5ujlpmdm52eoZyWjYulm46dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09LUk9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rqKmxr7GrvLiru764s6ynm7CnrJuPlpylqaWhmJqOhJJ5iY+Li3ZxfG11cWptalhLRkdFQUBDREhMTE1RUU9RU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhdZG1pYn+fo758cHRfd3RreHWGjnh6ioRua4uReHN4aWp/gnGWkYyBfZV/SZKZbmd3foJtamRseYWQkoZrc2x8bnJ8hmltcH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6LipODlpaYmpCTlpaZl52WjIOJn5KLko2GkJeAcGpvb29ZVlhUUlJZT1JVVFJYVU1OSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+krK+iraqota+urLS/q7zDv6aimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ1b3RscW1la2tZTkRGQ0A8Pj5BRkZHS0tLTE9SUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFYWlqggV2VY210YXpsanx3iIZ0gIWEc2uYkHNye2lqnY5MeYWTiYSNZjF2h3JrfX2DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3t0fn1xcW91bYN/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo6VmYuOhXqEkJiVjZCMkIdxh4J0h4yGenBzcW9wZHBnX1RGSUM+PDs5Oj9AQURDRUdJS09RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUtBSVFIYKqunGx1cmh5aW5/foJ/eIKEhHhxn5Nzd4BydJOHNXCdqJ2NoKGEooV2cIZ7hnx0jK6NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHNycW1gXF1eXFpZYV9STltaWFdMSEpGSUg/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTAxMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlo+MlI+AiHxugZCSiYOKh4+GdYKEbJWIiHx1eHhteG53ZGpeSVBHPT83NDQ5Ozo7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01RUkNIgG96d3ZxemlzhIV5e4KBfYp8dKCYeX2FgISZhJqcYYaqnpyLg5COeneIfomIjnSLl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1FUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTQyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2eppGgqqCxqK/AsrvEupaOkZOHeoZ2a3+LkYN9ioOOjHiDgHOghIp9fYF/cIF+emh3a1JYTEBFMjExMzc2Njg4Ojw+QUVGRkdKS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklLTU9RS0pUW1dRSWR9g3aEdXdueYuId3qGhH2UhXafmIeGjZGUpYysqUiGra+uioGAlIuCi4KEkqmIgZiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9g4h/h4WLeZScm4mLiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdlXFVQUFdZUERMS0ZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5COlZeSlqCdrKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9GQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS0xNT1dgWG1YWlxlho2Aj3yAfYGNj3yDho5/mJOAn6CXlJqZpa2Smbuxp7vHw6eLjKGljpOJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4iAe3aEfG11dWZ/lI6GiIiHiIegqqKWiY6Xf3qBiHp5b2dreH58gHVsZV5bW15qXmJnYFpPTE5YUlFIUEpETkdDSkRDQUREQjw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneCen+Mf4GRjoqam6Sdoaymqq6wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOhICBjIqCiY2Df4p/bHBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlRSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISkxLSk1WX2F8ZWVqcZWUiJWOj4eKi5aFkI2biZ6ekKGppKKqk6i1oafBwq3Hr3i5lJp8jaGemYSThYKOoZ+UmZGFioWPmpGWbHB1ioyClYyNjnePhHFthYGKlpGChYhxiKCWhpGJjY+WpLSom4yUooOHkoN9f2tqanyCg4N1Y19lYFtobF5sbF5XS0hOUlFOTExGSVBDRE5GQkNFRkM9Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXmAkoiRkn2KhJiSkIOAgIuMiYaQh4SJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMS01OUl5sh3pxfnmYlpWioJ2WnZOfkpqcppymqZ2nq6iptJarvqu2x8i3yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaObm3h6fpSYk6KSl5eBlJ57d5WSqrKIjJeffJSdm42RlZijoaW1r5yQmKeHlo+NgIhsc3N9gX5zamFeYmBiaGRgaGdcUkVKS1BPSUlMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Ljo18ioaPkI6BgoCJi4qFkoWDhomBgId3XmJQNDYwLTIvLC4wLy4vLi4wMDE1PkFBTVFSU1FSU1VSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUlNT1FZbIONdZCGnKCjr7m0oKqpqqWmsqmutLCwrLqwsr2bssOrusnLuMO/t6WisLOsraqji5aYhKWmoKOXgaaZjaKqqKWIhZSkoaCroaSoj5yxi5Wjpre6m6Cir5KinKGdj6Ohq66rsrShlKSpiJmIkomVeXp+hoFpYmldZmNfZWReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2luWHqEdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GOg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8My8xMTAtLCstMC4tND9DQU1VUFJTVVVWVU5bUEdHRDw+PkZIQ0VBNzs8NUM7PUZLSUZIUU5QV4CQnYKqn62lrLzEwKeww7Wqsb6xtry0vbPAtbu6orjFqLXJx7W9uLSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqywtaKxrLG1u7a0rrSfpqehppqpr6yxuLe4ppq1qIykjpCSn4Z4goV4W2NlV2djYmRhYWdgW1RKRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiYld5dXGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeEgY5/gYmPhn+GiIaKh5B6eG5dV0BFTjw2OjQ1QUI3NjQvLzZDSEJRW09RVVdVXFdQX1VJS0pBPz5HS0ZFRDs+QDdENz9CSkpFRlZTUF6NoaqhrrC9sLO8yca0ucO8srK/tbbAs76vtnSws6W6xKSvxrmws7Gzp6S1tqqxoKKXm6KSpbCupq2rp6SYoa20u6Kosrq1vL/Mv8XFvb2zwbe6t762ure5rKuwpK+prb2wvLrBwauYuaeUrY6Xl6mIfoN+bVhkYllsZmtmWFxjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpwfo6DgI6EbnpzeIdiuaGZo4mUlJaSlJONj5aRh4Z7hoGNlYqAhIGKenyKh4Z8ioKBi4OVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUllYWmdZVGBfTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWlRdkqy0sri1xbu2usfLubrAu7a0urm2vbO5scVgdLGksZqeqr2ppairqqOisrWgq6iflZafmaCupaempZ+klKOnsbSosrO9tsG+08nJ08bDxczCysPAvr2+u7y3tK+4t7bDucW9wsevnripoauNpKe1iIGBdGFjY19ZY2BqZ1NYYFZSVUlFRU5LQT5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCstLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoN/gnh7i4OHe4t5gYqCl350fXprZnB1WV5cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhIQkk6RD9IS1NUVVxaW5K2vra7tMO8uLfIybm1ubW3uLK2tLOutbWYZHWnnK1wXqKsnJigopuknqqllJ+fkJOOlpmYqJ+moJ6amYOknq2lqrCtuLC9udTRz9fQyszSzM/Oysa/vsLJvcG8wcDExMXKvsfNsqO6sLSumqu3u5iAfG1fYl5aX2NaZGNRW2BTUEtDQUVGRTxARj5BSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaF9vlpKQlG5sb3R1h7SsoaGfi5mcmYyNlZGakYWKin6IhoyQi4h8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqamlgZmlpbFptc5atpLyIhmdbb2ddWlpUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWGXtcWvt7G5u7Oww8W0r7iwsLursrCmqrerjLWnnZqnmk2ZnYyOn5aRppillYqTk4mQiY+RkZ2boZealZeHn5qnm6yvqLCotLTU1NTW08zQ09XN0s/MxcLJ0L7JycrJ0cfMzcLP0bevw7zDuaS1ucGihHFlXl9fWmJZWmdaUV1YT1BCQkhFQkg7QUM+QUc/P0E3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJncW95eYOhqp6ml4yam5eLjZWRmo59iYuEjYqKipCHfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem14c21pgXBtY2ltcHhpd3x+y7/B36dtY3huY1tiYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlq23q7Klr7Spq7u/sKq0pqS4pquuoKu0o46wrZqXmIyPkpGEjpuBjaaRnImDi4SKiYSLhJSVmJeUm5Gcl5man5+rrKWooqytz9LV0s7M09TUz9TRzsfD1NHHzdLT09fM0dHE0tbFwc7Hx8KovbfOnnxxaGBlX1hiU19bUFFUUU9IPkBGQUJFPEBBPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnWGhYp3bHdwfX5/oZ6eoYyMmJOTi4ySj5WFeYWPkI2KioiQhn6Ce3J+gICHeoR1hZOQiH9vdnJrc317d3tzgnhya4BzcmlvcXp5cXq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hcXWBjXWN3en2LgZipo6SgnqCnpaqvuKqls6KhraGjraGnsZ+IppqTkpGJkI6IgZOJapSijJmEgYZ+kYODk5eti5WNlZmOhpKRnpeosKKhoaWkqcnNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy411cWViYVpWWlVcUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHN4coKJgJ2VnZSFi5WJjomIjYaOf3iDk5iKjIeIi4h+gndze32Ch3d/eoaRlX+DbndwbXV/dXh9dIV8eWyHdnRufXaEdHh7nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhugIKHkYucnaCckJeYnqOjpbGjpLKfoaWdoKigo7GchZ6SkZGPioyKhoOPhH+cm4yNgoSFeZR/gqmVo4yRiZeSi36Yi5uSq7OYm5yonKe+w8a5tsbO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBnX1xUV1JdV0ZHSklFRT06NzpAQEI6RkQ/RENBREI7Pzs7N0RDNzU2NTU7MDY3OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhImBh3x4hZeWiI6Dh4WHeoR4cXp7g4V1eYWOjZx5i3B8b296f3F7gHGDh4Fujnp1d318gnR+fIaHr3NYqcK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeouGjZORmpWflYeLk5ugmp2pnqGsm6GamJ6lnp+rmYuai5CRjYR8h4eDhYuOn5mTiISHfmyZeoSYhoiTjI2UjIZ8nImUkK6qlJaYn5mnr7a9qa2+x8zJyczL0MnD0srU19nX2NfV29fT2dvV0Nra0dbI1MuWfH1ral1cUVVUYUlDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODdEQjc1NTQ3OS41NTY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgoGDfoN7fISYjYeLfoWGgHeCeW57e4aBdHmSno6gdo51gnN1gX1zgIRvgZCCb5KEdXyBhXp2hnuJt8Wkwcm4gZabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJSOl5CDiY+WmZaVpZyXn5Wek5GXop2Zq5WQkIqMkYKMhIiIgYWPkZ2bmYmGjIGFmHqIiZ+XkIiNiouCfaGJkYy8oZiTmJmdqaamrp+otr/AwbnHys7Oxc3J0dbV1dnV19vU19na29fb2tnYztvGiH18aWtnYVZZV1dOTEVOQzs9PTw4Ojs9OT1ANj0/QDw/PTw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1bU1VYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7foB+f3yEen6CkYmEhXqEh3t1fXRtfH2GfnN+kp6RnoORe4Z+eI9+eIqKboKagHSZhn6BiYR7fpB6j6mOj8OhvYucpJ19iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYiKkJKTjZyZkpOQlo2LlZ+clKCUkY2Nj4t+j46NioOIkpaanp6IjJWSnZGBi3+lmYiEjYKFhIGlhoqMuJidkZWWoqihnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuHt8em5raFliXVRQT0lETEI8PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5c3pzbYB+hH53hZuim52Ukn+MiH+Yh4Cbkm6IqIV6oYt8kY2DiIScfZqQioyjoqCQpK+fi5CLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIyGiIuSkouTk5OOi4+Kh5aanI+UlpCKkZOGgIuIkYyKiZyWmKKihpOdlqCKiYiNm5CDiI5/g4eGpIWMkbOYnZKUl6GhnpqSnJ6osritpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aBygHdqaF9fWlVZWUNBSUM/Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTpHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOjg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNiem1hfpKDb213i3h5f3qBfIZ8e3eGhH9zcIWCenV3dnSEgoR+f5KmpJ+lopeKnZCUl4uKqJdzirKNhKiShJmThZmMopWfmJKIm56jkqmwn5CUkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNyJWOhoeIj5KMjJKTiYWKiYWWmZqPj5SThpSXg3+Pi5mHjZCql5aiooiZnpaaiI6Gl5eJhI6MgX+Hj6SIjpOompeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTS2s6FdYNrZmBgX1FLVlxCQkdDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI6STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfoh4en56gYGCfnZ2gIJ7bG6Lfnl8d3h8hIaLfoujtKikq7OhlqegpaSWla+ig5C4lZKzmo2hoIykm6+ipJ2YkKeXqZmtsKSXlJWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcmIWIiI2Ui4uTj4eAhoeIkpiUjIqTk4aUmIaEkZCcc5CYspWWo6GInJmTj4qQipaaiYqWjYZ9jJifipCQnJqZk5mYoJShnZWfm6GxraOkt76zxcfEvcPDv8bOysnSp8/M09HQ1tjSz9i8dX15YGJXYlhSSUtPRUJDRDU+Ozc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj8/Nzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OklFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXFxZSmhhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9zjXp9gXt4houJhoSSqLytqbO9sKWus7Opo6KwrYqatZ2juaWVraSXqa23pqSjn5mpmKqkr7GqmpmclJWRmKCXmru7rcqhaba3qrCVmJ6iq5KXvaReqrKCiYmMlIaQfI6OfYOGjo+UlIiHkpaLj5WNi4yXmJGbmbSWlaqdi5yUko2QkouYmoqSnY+Lipafoo2VjZeZnZOcmJ6UoaCUnJ2mrqiipLO4q8LIxLa6vbzFyMjC0KHGyc3NxNfW0MrTo3N9bF9cVWFTUUhEPjxDQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicEpAi4l/gHKGh3yBiXWCioN+bX18fH5wd4d3jYGHe42QjIaMmqvCwLC9xryztMG8tKyrs7aMqLKtrb2rm7ujqK25uKumpqKipKOqr7Kxqp2cpJibmJieoqalk6O5r6i/vKytsrmlo6d9iIacrb2wgouLipCDj4ORjnqBh5CNjpyIiI+XjYqUl5SQmpabp5qxmpGrnY6aj5KOlZCPlZaOkKCQiJWcpKyUlo+UnJ6UoJ2bmJ+glZufqKekoqSws6bAxsOwsLu2xcXDv82nx8PHw7zV0MzEyop2dWRfXWJdT0xDTEBFRz5BP0I8OjQ+QT09NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFSkhOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1tdXJOMjIh7h4uGg4x1hpCKgW5+e4F+cX6BepR6kpSUmJGTlai0x8nAwszCw7nHvLqvq7m7l7K2urLAr6XAo6uwvLyqrqujo56nrK+1samboKqcopyWn7C0p4yjurq1wburqJyypKSolISOqcTEpIKLjoeIhIaVlIx6g4yRjpGhjIyUkY6Hl6CYk5mVlqWgrp2MqpyOlo+SkZWVjZCUkY6hk4aXn6Cyn5SblKChmaSfmqCboJSZn6ekpqekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnHwbV3e29eW19tVE5JRE1LS0pAQT1CRDw1QUQ7OjM9OEIzMzIyNjNBMTVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qajZaKi4iSj4aJeYaTkIFygHuMf3eHgoGPeY2hlqiampi7vsnIysLSycrCzb3Bs628v6e6v728xLitwamss7y9qrCqpKWjrK60rra1oJ+un6aimaO0vamcqLzBo7a2r6uTsKyqrJaGmqqnpZGCjJKklYmAdYmReYWNkZCen5KPlIuPi5OjmZeblJOhnqmfkaWajI+PkJWWiHyOlZKRopqVoKKctaaQoJelpKOln56mmJ6Vl5ylo6ioorKtqLvAxK+ls7fMwLquw7O7vcG5rcLCwr+ZcHtjW1lfXkxNTktHRENIQkFBREs6NERIOjs0PDdGLjEyMzUyQTI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGVYno+djpeOnpKJin+In5KEeIV/lH5/kIiJkICWoZqup6OYw77JxMjG083Ozcu8wrewur20vcu7w8G2t7yttMC5vK6vqKGpqLaurqmyt5qerKKoop2rt7eqpa++xLG9ubOnqrSzra2WlaWtqKCRjpKxxaeVjX2RlX2HkZiPqpmXk5OPk5SSpZ2TnZmToKGhnJifmIuMj5CeiFqPlpeSlqSZZpmjnrOllqKWrK2sp5yfppeYlpiVoaOopp+1q6m6u8O0prS1y8G4qrass7u4rqi4ury3hG9wXFpWV1BHTFROSz9BSERESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmRNRqaUnJahl6iWjJCDh6WSiIGHgpuDg5WQkJSOmqKfr76uoce+xsXIx87Oz9LKvru2sbu7vL/PtcS9t7m3s7K2s7izrKecq6y5q6mor6+Xo66lqKSltcGwq620vsK5wLmzp7i0t7KvlaStsK+li5OUoI1zwZl9l5mEjpaai7GVmpmVkpKZmKWjlZ+alZmonJuhoJmKjI+WnWBKlpyalJmkl1SWsJ+vnJ+lla+vraaboaaUk5mYjp2fpqGZtKmqs7y8u6uwssfAuKasq62xsaOhsrK0pXNxZ15cUFJNRlFRUFE7SEtIRkdBQz05S1Q/QTo9RU0vNzUzNDpCNDROV048SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTdGJWRkirl5mfoaiumJCXh4qnlo2IkoWfh4Sdl46eoJqjpLXJtKnHvMPEycvJyMzOxr66s6+6uMDBzbXIusG5tbqyr6+ztKeknKu0tauqp62smaSupqWprLq/qKu3t77BwL63srLDsLe9rKOutK26poibl6Wadb6fhJidjpKYmouulqGcm5eUmp6gqZ6noJiZqZmhp52XkI2RnYNtdZOimpWcop+QrrKiq5Wpqpiqr6aloaWqkpKZnImVnKKelrCnqaq6t76zsq6+ubago6eopaacnK2pqY1maGNgU01NR0lPSlVMPUxFTUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJScoZ+7rpiUnouTqpuRkZOIqo2Hop6Mo6yUo6S2x720wrvDwsjJxcLOyMK9ubKvubXAw8q2xrLBvLW7rKmtrLCjo5mqtbumqqesqp2or6ikq6u+vKitvLS3vsa8trW4wLC9v7Optbesv6WPopeQoZ+8nomaoJmXnZ2Pt56onKWjmpugmqelsqGanaWcp6mdmJSPlJuLlomMpKGUnKKfoLWwpaaUsauaq62fn6WkqpKWlaCEkJ6fnJappaGhtLS6tq2otbKynpyjpZqXlZmqoZ54Y19hX0xJRkhOUUlORUZGQlFKSEBER0FWU0RIPEFHUTE7Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6fw6ybl6SXmaiblZqajqqWlaimla2smaKrt8XCvL+3wcLAyMS/zca7vrmysLm0vsPItcCwvLa6t6ekq6utoaGbq6vEoqWorKaeq6+soqqovrimrb6wt7fGt7S4uL6xvsC2tLK1sL6jlqOVk5qTrZ+QoaGkoqOekL6kqJ2oq5ycoJumn72imKSeoqmroJ2VjZWek56HjoSNk56koJ22rKadl7OnmrCooJyrn6KNmpWfhI6hmpySpaSamKuxtbGqpaqtrJyYoKCSj5CWqZ+UaWVcYl5QSkhLT0xIRURJQD1PSEA7RklIW1JQSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE6im6ObnsWroJ6rnZytn5Ginpakn6aqq5e2saOps7bFwr3AtsDCvMnCv8rItri1tLG0tLfCxre/sbm1uragp6yrrJ6foKWkwaWhqq2gpKmtsKKnqL21pbG7t7a1w7Kyt7q+ssPAuLittLW1o52klJGToK2fmKGdqKiqoprCrKidq62amp2YpqC9oZ2kmKurrKahmY2an5KeiI5Yf5afpqGguaqnlJm3o5+zoqGcsJihj5qVnoKPoJeXjqKjlZClrrOrqaKipaSVlZyYi4+Sk6SfiWNnXGVhTUpLS09GRUFHSz49SUE5OUpKTl1RUUk9TFZdOUZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQnqCgmJ7Dp6Sis6CcsqeSqqOfo56tqaydu7GprLWxyMPBw7PCw77HxL3Eyr2wsbausbWwwMW1urGxuratmqmwqaqbn6ahp8KtnK2xnKqirrGqpKi9t6a2u72vt8Ots7PCv7LGs7q3q7W2rqqippWVlKKroZ+fmaerr6+vu7Gln6mpmZiXk6KkuKCho5Kur6ukpZ6RoZ6UnY6QjZSdmqOfqLWnp42ZtZyjr5ugnLCRoZWYlZuAkqKWkI6foJOLpqywpaeinaCekpKak4WLko2cn4BkaF1oZktKTEtTQUNASUc7O0Y+ODlOTVVfUlNKPk9eXj1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9nckA4PEiWd2VBNJ+knpqgwqejqbGgo7SplbGrpqKksqytqbuyrbC1tMa/xMS2v8S+ysW2wMnCtay1qbC5rMDEtLivrba6pZmrsqyqmKGnmK27tJyosJutn661sqequ7OnubO4srjAqreyw720xae+rq23tamnrKGWlpGlpKGhl5ekrretsbS2n56opJmTlJOjoLejpKWVrrGxpamloZ6bmZqVmKign5minq+zoqaNmK+apayYm5+nk56QlZmahpeglY2QnZ6Ui6mpqqKnoZqelo2PmZCChpWJlZ96ZWpdbGtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUJXYF1CSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWpWQ1dGjHlmQzukpJygpb+mqK6uoKm1qp23r6ujqrS2sLC4t7C3uLfEvcPHvbzDwsfBusHGwbqqtqWtu63Bw7i4qq2yvKOVrbGtspemqJGquaqhp7Cdq6CvtLOqqre1rLuss7K5t6y4sMG6vb+mw6qwtq6pq6umnZiYqqGhoJGXoLCvs6uwuJmbqZ+ZlpKXpqC3qaWioq+xs6uxp6ugnKCfm56lnaGYnaO0sJyfkZSmmqGpnJakopiajJaZlJaXnpSJkpuZlI6pqaego5yZm5OHj5mLfo2Xho+bbGltYm5uWFFRWlRBQ0RVQDs7SEA3OlhQZF5RV1dFWV9eTkxTT19MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOG19aFxWOol7Y0M9qJ+coam8oKqvqqOxt6mltLKroa21va+zuLy7vbe2wMK/ycS5xMPAwLnFvcG4r7aoq7eyvL+/tKqvsrifl6ytqK6YqamOp7ufpa2znquisbCzrKq2s7W8rbCxtaywtbLAusW2q7yvsbesraqjsaWepaieo5aPmJ+yqrOpqrKZnaebmpSMoKaktK6noaysrbGns6uxqaObnqiknpWhmpyotqmYmpKSn5mfoaCSraGbmoiXmYydmp6Ui4+Xl5qXp6WjoJ6XlpaUgJCVhHuPk4SNl2dtcmhxc2BHWWZWRENNWERaOUhCNT5dUWhcT1pdR1teXk9NU1hkSktDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKWZn6SrtqOsqKWurbWpr7O5pqewt8a3sbe/wsK2tbrFvszFucPBusC6xbjBurO0rKq6uLu6vrWrr7G3mZioq6usnK6rj6u+nquvsaOqn7Gts66utbG5t6qtrrGntbCzurzJsqq1tbG0sK6moLOgmqisoKWVlpqZsaKtoKWvlqGkmpmSjaKlp7KpoaaxrKq1pa6wtK+jmZ2tp5uXnpuarLiimJORj5icoZmYla6hn5eDlpuOnpyal5GLlJOemaWjo6GZl5OSlnuMkYV7jYuDjJNsbnlvdn1iRmBqWklIWls9e0pHRTZBYlVpW01cYUtcXFpSU1NiYUxLRWBhYFBNSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1lUTEWalp+wqLGprKSjrq21qLezt6OstLfJu7W7u8C+tbS3w8DMx7vEvbe/v8G4wL2yva6ourm4t8K3rK6yupaXp6+sqKSyqZSvu6SssrKmp6OytLGysbWwt7OprquyprivtbPExbaptbWrsK6pp6K2np+msKCjlJuZlLCep5ufqY2pop6blZelpaS3p6Kws6unsKetr7SspJmhrKicnJ2dlaq5nJWPj4yYnaOYkZiopKGZhpWYkZ2cmJeWiJePl5uonaWhkpaSkJZ3hJGGfIaChI2NbnF4dnyAXUxlbFxKT2RdP2J7R0k4R2dXZltNXmJNWVlXVVhVaV1PUEhhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGcyNydGYUxWJS1CLj1FTFE8M3JrTEVEkZmkraSsraqmo7Cysqq3sLWfq7W5ybmuwbzDuLOytcLDz8TAwr61vsDAu7+9tMSpqrmxtrfAvK+stLSeoaexrqWmsaWesrWtqrKxq6iotbqstbK1q7StqquorKm5rbKwx7+4pbmwqa2tpqetsKWko66jqJydm5qvmaKioqOQrJ+joJ+hqaaluKSrtLSkqquprK62rqKdo6irnKCZm5OktZqPiY6IkaOhlo+Wn6OXloeRlpSem5mWlYeYkpWZp5ygoI2Tko6ReH6PhX19fYeKinJ0c39+fl1TY25eTlpnXUZElltHOk5tWGJbTmFiTlZWVldVWWheUVNNY1pbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RkOzYqSGRISis6ST8zQ0lTLD6PbEBISZCaqKmhqbCkp6OztLC0tLCwoKutvcy7rsK9x7K0rrTBw9HExr/Bsr7Cw7y/uL3FqK23rLS4vMCxrLKuoaOnrqqopbGjqrCqrquxrq6sq7O7p7ewsqmyqqumpaOtuq2rsMK5tKy5qamoramnsaWppKKuqaiinpyirJWlnZiemayeoqeooaymo62strCxoKmjoKqtsKydnqenqZqjmJmQoKiYhoSPi4ufoJCMjpeekpKIiZKWoZ2WmZaGl5OUl6Wcnp2MkpCOin9/iIR8d4CHhYd1dHKJd2xfWWBuY1FzcVxLO4R8Rj5XdVhgWU9jXE5VVlVXUVxiX1NPT2hZV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTM5NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLkpnREY4PEIwNUVLWDFAlF1ATkaVlqynoKmxnKeosLWsuLWtqqSqqr3JvLG/ucOvsK2zw8TOzsO/wLTAw8S6wbTJxKyvt66zusC+tK6urKaoqrGppqmyprStqq+trbGusq20u6W3s6ysrqiroKOesLesqq25tqS1taSqp6ysqq2gqKansbGkp6WhoauWqqGTm6CmnqSjqqOsop6msbasrKKlo5qpq66pnaGlpKSZoJmWj5idk4GCkImFnaCNi5CNnJGTjYWOmaWbk5GbjJOSkpSjmpyai4+LjHyGgoKBenWBhIF+dXeLood4al5gbmZXZodkTkBnkkxFYnpXYlhSZlVNVlZVVE9cXWFWTE9qV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOzo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIdCSUlElpCupKGqr5ipqK21qrWxqqWrqqm8wMC5urS8taazr8PJy9G/wbu5v7/DusK6wcSusbWytLzBvrOxr62srKe3qqWtsKu4rqiwr66xq7WqtrWntLerrKSqqpyknrOzqaiks7Sfta2hqqirqKunn6urqLm2qaqqqaKpn62bkaqhnaCko6aiqp6cprSup6WpoqSYpaanqpyipKOgmZifkY6PmY1/h4yHhJ6eiYaMjJCQk4+FiJajmo6Nm5GSkI+Sn5iZl42LhIB0h4J/fnh1g4B6eH5/iJ2PcHFmZ3F4XGF0iGpPXZhWSG15VWRWU2NQTVVVVVFPWFtiVklRalRWVEdQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UyMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyQGY9Tlg/Qyw/TFRfL0lrN1JGO5WNr6ClqqyZqqOtrrK0r6qkr6mou7+8wbKwua2itq/Ix8jRwL+9urzDvrvEwsC/r7Kzs7a9vMGxsrSrtKmltqmlrbOyuK+irbSxr7G5q7muqq63q6qeqqugo6G1ramhn66yobSqnqinq6OqoaGsrai9rquuraGnqJ+smY+woZiioKimnqebmamwqaKfrKKhkqKio6eZmqmmmJiZnY+Lh5WIfY6GhIWkloaDhI2IkZCShoeWoZeJkZ6Rk5CNkZyVmI+LhoZ4dIGAfXR4eoB7dHR7aoKIpHZpXmVrgXVniIt8UlZwX0t4c1RkU1FfTU1TWmZOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzOPjrCgpKWqo6SjrKa0s7GopLCnqri/wb2xqbqqp62wycbI0MO+wL25v8C9ybzCuLGwtbK6vLnAs7W8rLmso7Wnp6yxtriypae5ta20vK+8pa2ttqutnKmvpJ+krKqonJ2qsqSzqJqqp6qkqZ2iqaepvau0sK6dqaSgr5yas6KWpZulpJ+lmpqoqqWemqmhm5GboKSemZepqpGZmpKQi4KPhX6Qg4CIn4+HgX+NiZOQkYaDlZuUhpOijpSRi5Gbk5aHin+Acnp5fnxodnx7dXFxfmqGeoWIZF9nY3KFe21neV1eVkJXe21UYVBSWUtMTnB0XUlaW2hZRlZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKwmZ+fqaSioauktrKxpKmwpq25wr23sKS5rKmosMLIyczCt72/tbjBusi2w7W0s7Wyvbm6vbauuba/rKK0pqqrrrW3tKmcubuosb6yuqCutLapq5+tsaOcpaipo52bpLCmr6Gfqqmnoqqco6igrbynrrGuoaqipK6enqymmJ+aoaKbn5uZo6qimpmjo5WWlJ+hlpyWpqyMn5KPkYyCioCAj4F7mpWMiX2AjYiSkI2Lh5OYkYeUpIqSkYeQmZCUgYh9emx9dnl4Ynp6cnBxc3hqgnVrgmdjZ2Fuc45tYmpvX3BBXXlrVl5OUVFLSU1TWVZNXF5sV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl0+I5GWq5ifl6eioZ+opLevraKvr6isuMO6tK6gua+rp7O6x8rHv7jCva+0v7fEtsOysLqxssC2u723qrm4vqqktaeoqq+tuK+omLi8pK2+tLShrbi1p6aosLOgnqWlp6GlmZ6sp6ieoKqvp6Cml6Kon7C4n6Oxr6GroayknKemqJqbm5+ilZycmp2pppabnqiRmJKZnZOZlqGqkZuKjpCHfYd+go58fKGNjIl6hI2GjI6NhoqTmo+JlaCJkJWCjJeNkXyFfHRwfHFzdGB4eGpvcXFwa39zZHpsaGVjYWaHgGBbcmpyTU6AaVhaTVFMS0hQUlBHTVtfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56hpKG3q7CjtLOpqbrFt7OuobitrauvtcXHwLe/wrmwtb23v7u+sKy+sLO/srzCuKq7urinqLWop6uvq7KvpJi7tqSrurWvnrG5r6mlp6+ynKGkoKSjoJabr6ahn6Kor6GgopOjpKK2sKGmsaufrKOumJ2qpaifmJqdo5Oam5qdpaqam5ullZSXlZyOk5eiqaKRiouQhnqEfoSLeo+Xio2HeoKIhYqNj4aQk5iMjpaZi4+WfoaXjI96gXtwcnZub3NfeHdlbGxsamqFbmZyaWtlaF1kc4FgW2t2aVpKf15cWE9PS0hIUlVHMzldXmxQRVlVWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFRdaEQuPDJkVywylKGhl5SbqpyjoaKht6qtoLu3pay9xbSxr6O1r6ysrrTDw7yzv7q3sbO5uLq4uq+uwLOzuK+/wLetvbq1paKyqaepsaqtsZ+Zv7Wkp7S1qJ6yvKmopamvrJmip5ykpZSXoLKkmZ6jqKmcop+SpKCkuKmkp66mnqWhqJOgqaKhoZmbnZ+RmZuWn6Gqm5qYoJSRlJeajZSTpKikkImKj4Z6hHuEhn2djYqLh3qBhYiJipKGl5KSi5CVlI6NlHuDmI+Ld358bHRybGxzYXd1aGhqZ2dwh2hoaWRmaWlgamNqaFtme2NgU3RUXFtSTEpGSU9TQCEqaF5pTERXVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp6ipJGOpKaanZ6do7Stp6q6tqesxMG4sayjtq6nra63wL+8ssK3sK6ytra5tratqr2zrrKxvL+3rru7saWftqqlpbOnqa2dnMCrp6Wvs6qstbueqaqrsaWYnqqdpqSRmKWsopiepKmhnKGblp+dp7WmsKquoaGdnqGVoKafoaCam5mbkpidk6WdrKGXlp2Uk42Vl4uPmJupn5KJiouJeYV3gYKBnYeLgop9gIWIh4aRhJeUkI6PkZGRjJN7g5WPhnN+fmZ5b2pqa2Z0c2tjZ2RkdoFiZWZmZmppY2tyW19ZXm1kYU5pWFpgVkpHSEtNUlg+OV9saEhDVVRdW0lJR0VBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFlKVmJmQDozQmhIJTWao6CPjK2hl5eglqSzsaKyvbahsca8urKxo7esqq2puLy7uq3Asq6urravs7izqau5sa+us7a6tq+4vaymnrWqn6Cvo6mum6G/oLCjrrGvt661nq2vra2imZ2nqaWflZqnpZ+ZpKKonZqfmpOcnqyvprqorqKhmpuemZ6kmqSdl56Ym5SYn5KolaqnmpOampKMlZmOlJSaqaaOjoqKj3uCc4GBipiFh3yJioaGioyJkoWVm5OSj5CRl46Qf4CNjoNvgX9meW1na2lmcXJrXGhjY3SBYmZnam5sZ2pqaG5dbGxzcGBUY2ljZllJRkxNT1hSUVVhZYBVQVdTWVRHSUZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY+wnZmToZqpsa+fub+1oLTCu766saa3r6etpLe4t7etu66tqqu3qrO3rqaytbKuqbC2trCztbqmqZ+1qJydqKCorJqnvZispK6vtrWsrZ+xrbCpopuco6uonJScp6OdmqmipJaan5uQm6Sqq6q8n6ekoJiamZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJiagJaKoZB5h5SNg21pf3eDcWyGi4Z9hYyHcV5jYWeEmIZri46UknR3i4R+g5CAZ4eAZ3VoZVdcaHNtTlBqY2dzhWhfZWZubWpdYGGKj4OEZU5LRDlHVGheSkdQUFVVTEhSYG90ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsKzA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoukmYaVsJubk6Cbqq2qo73Fr6m3wre9va2mt7ClqqK3s7KysbmsqaastKavtKKpt7a2qKestrKutK2zoamfs6mdoaObpaaYq7mUpaWvs7etrqWprquspaGenKGnppuXoKWlm5unpp2Tnp6Xj52nqaS2sKSjop2WmJeXo4ihjpKahqGHk5ygf6V/paqekpKakYiEc3iNjoWIoXaJjWmXiGZ+c3igb4iHhH6PfX+hoKCZgH2InnSHjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxcIhYXmlbbGxbiHJuenKFZ4aEWl9HTj9HX01FUlZWUVFTV1RnXU1WSFJST0ZIRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKp5eDnKucmJidn6qpp6q/w6+xury3wL+qpbewqayksrSurrO3qqilsK2ltLKbrbW2taanqLKwrLKnrZ2poLGnn6OimZ+hmqyzlKOlpba9pq2nq6qsqKWhoJigpqOZmaWjpJicpKmWlKKbk5Kjpaaht6SkoKOYlZOXkpyIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZYDAnL95hIV6koR8kJCRynKXvJzFenK1pruQe4BtlrGrsHlobFixrm5lab2SvG5nem9yj9h+U2tjtrJ+gXKUc5qhqpBXT1diT1ZORlVbWFFRU4xcV1tQQVxEUU5FSEk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKeTgaeqn5ecnqWssqmwwr6ytb+1tr7Bq6e0rKyppq6zqa+2s6enprSlp7itnLOytqulpKexraywpqqdpqSwoqGfnZaanpytq5Odop+zuqOqqaKtrqWhnJqaoqefl5unoJ+YnqenkZymmpOdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUca6hpH54u31roZB2sV9qtFulgGWckWBng3tnf2p4a6llvnJnpox1sWp8sXh0kpRjbm2nbluEoUVoZoeWRXWcYH5nfKSnglpfjKtogJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOiU9XVy9JVFNKQ0ZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYOtp6Weo6Sqsbestb2/sLbEsre6waapsKquqKivrqOwuq+jpK2yo6m4p56zs7CjpaCprK+rr6annqOhr5uim5aVlpqaq6WVmqGftLOiq5yjra2gnpmWoKKonJido5+bmaGmpI+copmXoJ+qnqamoJqgoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH5rgqZ7goaIk5STd6tna7Fcq3qNhpR0iXKPh4B/iJCXeIKBi5iLg6CPhLB2d59xbGxsfItOpFhIYmKZfmNopmB5cnVTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5V1hBI01oRkNFQUBBMTk+ODg6ODQ7Ojk8ODpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE9PFN9bjMrWGpcT1hNX2dXN0o4YVU1MBuUoJWIs6amoa+pp7Osqbu2wrC7wa24t7+prK2traatsamgrruqoKe0rKOrtKSmsrOno6Kep6qxp7CnpZ2fn66VnpmUlJWYnaygmZmkqLWvoqqPqqiqm52Vl6ClqJqenKKem5+jpaOVm56XmZyiqZummZyboqCXk5GTk5yD1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46IpIOlgnqseY+dVq96iH6farlauXaGhH6mgpR7mHqqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiFgIl8Y6QzQp12XVBqaWNQQFhnWmRhSkhNbk5cUU9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFQNzElm6KUmLKoqKa0qqW0qaS8t8Gwub+xtbS6srSnsa+isLKmn621p5qnua2ir7Cfs7SwoaSen6apsKi0qKObnZ2qlZiXlZWUlqCpnJmWp62wqaOfj62jqJadlpuhpaGYoaGhoZqhoqebnqCelJiapqCbp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52Non+RoaZ/sXaDkdLSdlyue4V/pG+bqqZrh4V9rX2YmY57sXGSno54s2WXdISeb55mlFHIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPa2BsaFBWR0k5PVVSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTDYyMKKdkqWwrKOrvK2mtKantru8srq+tra0ubiypbSzoLGxop6rr6SXprmtpLGwm7S4qqClnqGppLGnrKmjmZyZp52Vk5eXkZKhpp+Vk6WqsKailpOtoKaSlKCbpKaflZqlpqGao5+tmaCenpCVm6GdnKWVnZWaop+VmJWRm4Wse3eodqONiIapb62KgqeDmJihiZKai6J/k5qJroV/grNccrNSrn2CgqR/cdd9eIV+j52Gmpl2r4aHkZyHd7RhmmWagoKVbZJasFhLmnWYeWZgrV52d4homIhsXa93lZ6PeGw1eciusl9CVG9eZ2BFUGxgcG1WVk0uZmRpU1lQO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEg6OTmgnpWgubCXtMKtqLOoqbK6t7O3vrm3sbS6tKS3sp+zrJ+eqKuflKe1q6ivsaqttKSbqaCfp6G1pqapopidlKSgk5Kbl5GUoaSakpCmra+moZWZqqCjj5GhmaikoJWZpaidnKSerZ2hnaCNk56anaGYmZuWl6KglJeQpp2GqX19pXihjo2CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTYf3aIdKiBjpuMkqR7lI+fhHuyXp1koH6DlW2SXKtbWpOAkX9oZ6pkcnuBa5iHc16rWomgjmtvZU9KQ6FcW0x0XWJnTlthX3JzX0tWN0qblVlHRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amsCrmLTCrqutqaW0sLewtb65ubGwtbqourSfr6SdpKennpOpsKmvqbSrqq6hmKCgpqSjuaKiq6CWm5Ghn5STnpmTl56fkIyMqLCwp56Xm6imoIySpJeoqqeUl6mnnp6goq2koZ6ijJShmJ+gkp6XnJWeoZWWjqucj65tcrRzqYt1iqdztHhzs4CRpKOSnI6JpIeQd7hwjXuLomprtlqhhWWXl2mhoqdtlHK0dJOZfrJqhZGHrWp1s2GdZqJvh5Nrl1ytX02hfIeRUnOjbHl/fm+Yh3Jdr1Y8nHdmVG9uLlynT2NTa2VibVpjXWFwe2NUWlI+P25wM0NCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKacm568oZuywK6tq6ynt6m3r7W/tLuvrre2qsC1qKmgmqWjoZyRqqmntaKyp66poJecp5+kq7idoqyalZmOo6KVjJ2gm5icn5GTlKq2sKiZlZysqZeMlKWZpayikZaqsqOfnqarsZmho4+Yopafm5aclqGTnamclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJeLjKeIeqS2dX53dsKCmrJgg7p5wHx1uGO1goyHqX2VgaupcXt/dLyIp6BpnWGmjq+hfox0h6p9vm9zvHSyg3V4gYpumohybo2kdL1ed31aYXm8a1pWXGp5XmphZWdjbXhvWlxZQ0FBc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQj1FODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivaGXssOwraqrrLGnt6+2xLC4sK25rq3AsKujoZ6joZybkKijqrKktKWspZ6VmqqYpqy4nKKtl5Sfj6Sfkoycop2XnZqRlpKvubKslpikqKeUkJaknKSsnpCgqKufmp+oo7Ofo6WOp6KUopqcmJWjmJCvoJKUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahxgHORuYN8hoaMh418ioeNmHyku7m9nHR6tKN0d5d2dLB1mZ5mhmqNtXRycXe2jF5/en2JaIN5bnpji6xwdYV/WFunakVlWlRmYGNeY1FnZ3BsdUNOUE1EO1pNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT11dPSs6VlUnPjs8p56hor+llrTDtKyrqKyrqbqusMWts7KttqazuKupoaGlnqCdmZOqo6yppbWnp5+blaCjnaukvaahqZaTm5Chm5GPoaehk5yXlJiUsbW3rZmepKSii5KSppulqpuVqaWlm5mhqKWnpKmhka2flqSel5eXnZ6Pr6iUm6ahjWp9aZumd4dyfZmOdHlkh3u9vsC6b5ODcpaIYHJqWl6biWBjiI+Va2CAlWNtnXdilWyAmpWUZV5gY3Caimlyi32GlWdrf3J1eH1+Ylt3dIFoUFxtg317i2tYa3qCc0pKb4ZwTnRNRVhdZ2FMW1dnY19PW211aXFSUURFTTtHST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFS09IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPltPJz8yPqmgqKLCo5u1urajrKWup6e1sazIq6+yqrOivbCxpp+ip52jm5mZq6auo6S0qKWbl5Sgm6atqL2nqKSUk5uVn5mSl6SoqJCdkZCYnLCyv6ycp56noomTkamaqKOamqugo5mao6eso6Cro5qwm5WnoJaUnZ+dl7ClmKGnmZuQnJyiopiloZmbmZmZj5WBZ219cXeSmJSShYu1qo2GmJWOioyYloeUlYqEk5SRiY6TlJiUmJaaoKGam5SgnI2CeqWFbWt9kXyAdYqKgXGCeHl2dYl/fIpqc4F0g3Vld313a296bWBjXXBoTVlaZmpgV1pveW1tZlRQRlM5T1pNUU8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzobOiwKGksrK2oKmlsqelsLSqyKqsr6W0pcCms6CdpKSco5WVn6qmrKKjtqufmJaVn5atqaXAnqujlJGbl52XkpShnp6ip5OSmainssSwm6udq5+QlpaonaqcnJ+smKGbnKKkr6eipaifrpiXp52ZmaCenZyvoJyhppWXkpeTn6CUop2XoI6Wk4qKjY6XrpB8lpyDkoKLqqmFgJmXiYSQnoh6hJCHhpqSiIaKlo+bl42RmJ2klpmTkJyNf45nobOvhYqEdnuSin13eXpvZnmPgYCJanWBeYhzaXN/e3aDh4JrdWR5ZmBqZWNkZmtZbHtvaWtdU0xQRF5URUA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9iY2FfXV5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0W0c1PCxAtKC5sL+sq66ysaCqprKtoqyzr8Svqaqisa28orObn6aioZyYl6elqaWkpbK1npSTnZmZr6WtvqCropCRnZmZlJGVoZyXqJyEn6uso7TItKCqpKuXlpeapp2pm5+kq5Sen52gqq+qpqSroq6bn6CgmKSenJ+cr6OYnqeSl5ackaOYl6ecmpdlgpJ8ZX6NmpBjeY5taGt7kqSqamWbmH1nhoplZWloe46hj2tnjZiRo3draouZo5+Yc2xteoSOiHpYZl6Gg15tjIqBdlxoc3d2kYCIgm13gXh/c215hHR2iYiPg3xrh1lebHRkXnOJaWt8cWtkX1JOWElkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaagur26r6y0saqlqK2usKatrbC8sKimo62usJ6slp+jnaGZmaaqnK2jpaepsq2elKOPoq+ltrmlrqKOjpqhmZOSmqCZmaSVfKauo6i0xLiloqevn52VnqKeo5yjqaiSn6Gdoaqwq6ukq6CqnKefp6CslqGbpbCkl5uplaCdmpGjlp2pl519vYOIcrRyhJ2GrWh4ucS4cZOio3qmmZlyq4J8y8DAu3GMo4iCn32XmYmdwL2Cl52ejZ3CwXyCfJONmsPAfWylsm+MgW/Ken+bdpCDjoF1eYCAeXF6f4dwd4WMk3lueJRjZ2B4ZGBlgmNedGdsZGRZTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhDQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtbCwwKmolKOvqLCuraays66ppKWmr6ufqpiaop+cmqqmoZyroqSopKS0pJyikqatq7ezp66ikZCZnKWSkZ+hmJufnYinraWsrsDAsaGpr6mWkp+dopqipKqjk6CinZ6tr6qtp6SkqKGmpZ2sqJGjmqitqZqcqJuroJWWpJWfopacfs6UeHqkgXmVlptfro9ejqeBoqB8p5abc6uDgK9eY42qe6iHhaB1l5OIs2OCq4ahjo2zaoSvdH2XiLdhg61ao81ukHZ72nt/mXB9h5J2fWV6h3Z2a3yHbn2GkZF+bYOQYXJtcGhgYHpkXHFoamRnYFJUU1ddS09DNUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqets6umsqurqqOqpq+pn6abmaWXnKKvn6CfqKeipaCfsKuanZWnrqywqqirn5SRmp+kko+epZiep6OfrqassanAx7OoqbGulpKdnKKXn6mqn5Whn52drrCprKqcqKiloquSrLKWpaKqqp2ipaSgrp+RmKaYn5mTk5GXoHGFjJd1haiGcbF9nnKsfqKfgaWPnnargn2tf5xzrX+sh4afdpmSe3yXfqqIooySjJ1+q3uJlJCfgHutV53Fe49wk8F9gZVtdW+MbWV2ZYZvYXducm+JipKPg26SkWZwdXVxYWdtZV9vaWlvZ2RYVF1hWlJTRDlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXlxbWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNXQEYhHEc6QzEuK7DTxsaytKCdo46joqKsr7auqLGmqKqmraurpqGjnZmilZ+lq5+hpZ+oqKKenbCsl5qWqKeuq6emp56XlJmjoZGUoK2bnaejsK2lrbarus6yraaurJeVnJ2imZ6urJyXoJqen6mzq6urm62rpaOrmq6xoaerraWYpKmoqK+hkZWio5mTkYSkaqR1iXqpdHqycIKmipmMcYmgm4ekYGBSq4V/roObdq2CqIaFn3qZl4Z7ZoCjiaSZhoKjfal+gpaHrl98qVaeo5KBeqOfgHvDr8WLcq+zs7lyYqmvwnRojIyYjoJunJVxb3p4eXBtZ2VlcnBmfWpjXVdgalhZVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioyUEtMIyBBOUQ0LCfCydXUv6GZq6egr6KesLSwrqmsoqemqKqrqaSmoJuknp2lp6ejnKuaoqyho5+voZyakqukta+uoKeanZWTpqKQmqKooKCmnLGmpqmyrrfIsrWqrKmWkZ2copmgpbOdmqGUnZ+nrK2ksJutq6OjqqGzraGqs7Ghmqinra60oZGUoqaXmpF7qmyehId1q3l8sG+CpYyJn5aWoJWB0ri0uMmBgbJfYJSpg6WIh6B6mJaaeKrJdJqklaipkZOajYGciprGxnlnoYKldIGfjoJ9r11wtGKwdUujh22nR4KTZI+QnpF8cZmVgXF8dX58blxmanNxZoFrX2FZZG5cX1lJTk1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqhpZqopKqrqqafpqaYqqOfrqudpaCsmp6ppZyntp6il5Opq7WyrJulnKCUj6WskZmcqKOhqqeuoqWnqbC1w7Kzqq2ok4qXnKWboaOupZehlZmcpqatnLGer6mnn6yjt6yhsbivnZquprGysaOTlqaimJ6Ogp1OeJqBf596hKN9g6SFh6afnZ+UhLh7e3m5gn/MxsK2eJuhkYuffpqWl4p2npiKpJejqX+whZ2GoISsfZqVY6ZtpHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Uk413e3OGf3Fcbm54cmqCcFtkYGlvY2RdTE1RVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZZWVpbXF9fXl1fX11aWlpYVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq6fm6GssrOlnqCVpa2trqqnnKanm6OoobOuoqmmsqCYqaSUo7aiopWXoqm0uKOboZyiko+hsZmem6emoaKwrp2mqaK2ssWxramtqZGHkJyonaKknKWXnpmamqalq5uwoq+lp5ivpLusoba2rZ2ctLG3r7Gll5yun6KdhY/RtcO3eYeOhZGTkICmeZShd4ygkoSlgYpxqoaFtG5yaZqknJWKn3yYmYaHj3OvgqWboo6mi5Odi5aQm25xsl2ldJN6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWOen55kINuanlpenNvgXVeZWVvbmZoYEtbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtbWlhVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWSc4yKrb6/vLq0npanpK21oaKZlKKopq6rq5imo5+loaG2p6Oop7CjlKyjjqStop2Qmpqqs7OknKScqJGUl66fn56npJ2onbabo6uktqzEsKmrqaKMhI6coqCmopaZmp2ZnJmnpqeZraivpKabraa9rJS9r6yfoa+yt6mypZqosKKnl3mokX18sHeKgKSliJxtsnChh618oY+Dp5WYgKyJha2FoJWqoKKXhp+AmZWAe5J+q4CdmpaLq3idoZKKlJKBeq9epIF9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWRppmDlo6ajnx8hJmAa25/Y390boB6YGhmcW9paGhDWmFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFSU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA0Mi4qLEFUVlZWVVRVVVVVVFRVVFRUVldXWFZVVVFIRklKIygovZOag6jFwrbAs56arKCtt6Wjjpukop+wsKqfpaCerZmeuaGjq6CvqZmuoZCrqKOWiZqQrrCspp6lm6yXl4+soaGdpqGapZ2umKGop7epwa+kqaSei4GOm5qfp5+SlJmblZuapqWmm6qsraSln6movqSWwqyqoqCqsbeorKWesq2nqJd1r36Qi5yFh366rYqZZbCNZZWtfaGPhKaVmoGsioSwhaaapKGhkYWhXGxqgbNgf617e4OBsW1nb5mZjIixW361XKSEa8iiZJ+Ae7xYdrRZsn1SroB6rFiAoW2Yj6ibjJiSmpp8epGff2V1f2OGeHSBfWJqZ3FuZ2ZmUFVkXEFVYD5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFFSVFdaXmBfYGFiXl9cW1hVUE5KRkM1NTMuL0BVWVhXWFdXWFdXV1dWV1dWV1hXV1hZWlpbXFhXV0dCO9KfsrG3vbqzwbKinKympLWpoIqaoJ6cs7Opn6ShnraZoLSoqqyer62drJuVr6ehjoibjq+rqKahpZmukpiPqZminqWfmqOjpZmgoqqzqb2vpKienY9+i5uWoaGakJGanJKamKmgopqprqimpqKkqbueoMampKigqbOzqq2lnrqsq6uUgKmSo6+Om4CHpJeZkIKAuMO6g46ck4Snl5yCrIqCr4innJumqpB+1b3CqmKjv719fqOChNe6uLWFlZODnr2+hG2jgm+rhGycf3qysMeDaauwvax4d6K+vHOAlo6nnZGbkpqge4OTnXtkfntlj2d5gnxhbGZra2NRYltTalw/VWJDTSk9OjQvHx8kHyUyIB0kKDA0OTY2Nzc7PkFDRkdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsL+4sbyyopyupqWypp2LmKXAqriyqKLAp6iznZ+ynbqon62vpaeUlLCrl4yDm5GupaKsoKOcqqCXi6OSpp6nnJqhqaOZn6Gsrqq6raejmpeTfYiZkaack4+RmJmPmJSpm6GZqqmhq6ego6q7nqjEop+toqiysqeuqZ+5pq2tmXN2qqW4hmSJoHBorpGLkG5ud6SQmZ+Bda6YlHCPi3GVqKOal66kcmxsbGaLeG9ugplxgXpqcWlnipeWmHFpaYaIZ3GGZF2IYmpvWVxmfXamX2FxjpFuZWR/jZOPopmZmZOaon6JkZh3Z4l4aY9reYB6ZW1kZ21jS2VYSmtaOlFmRlEnSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1dXWV1eXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp6js6qYkr+zxcq/t6qfwa2upKKorJ+6o6Suq62mjpeuqY+LhZWWrZ6mqqCdpKOgkYulkqeZqZqXo6qhlp6mp6iwu6urmpuTk3yElo6mmY6SkZmVjpiWqZagmamjnLGmnaKruZ+vwaejsqWqrrCpq6mltaKstpWKoaimt52JlqOZiKqbkZWdkqmzmZqjqqCylqKhnZ+inKGlopWrp42SkoyHk5ydlZGZk5mRj5WFgaWbmJaOi5SUjJCHhX5niX50gnVzh4pwp2x6k5CTkoCBjY+Qj52VopeamqWEiZeQc2uRd3GMeHd9emptZWRwZVVhWUBqXEhjYlBZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhUVlleYGFjXV5UUUtFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKaWqKqktLaurqGwo62foLaxkI6syL7GvLqro6afnaefsamjtqedqbSmqJGYrKKLh4mPnKeVrKSfmKeenpKUo5eomqialKahpJGcqZqitrunqpiakI19gZWMopWLlZGWkZCUmKaQoJuqoJ22o52mq7enrsCtoralrq6vq6ensbafrbuYkaWkpraikp6noI6qoI6Tn6OrsJqgo7Cor5ijoJyjqp6enp2XrJ2TmaGblJCWq5qOmZmXkZafkYihnpaVhZKNkY6Vi4F+ZouFdYZ1eIeCc5xqhY+Sk5CJfYuVkpKYlKOTn5mkhYqbin10l3R7jIBzfH9qb2VfcWpgW2BabmRQYWZRWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWFlVlBLQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX2BhYmJhYWFgYmJiZGJcW2OXlaOnoq+xq66jqaasn6e1qpCPnaW1vbCuraOkm3yfpLKkpbGpl5u5pqOTmaqcjoaKiZyij66eopWon6CSlpmbrouplo+omaiNmqqQn7q3pKSYnI2JeoKUjZyUi5WSlJGNkpejjZ+fqZ6fuKN/g6+1oq+udKO8orCed3iep6+4lHWso56JgKt/ZFxidqCPpZ+EmH1tkrOco6etqqJlnp+Sc3mal3GBmaiYbX+iqIplnKadkpiYlo2SnJCGnpuQloSSh4+QkomFd2qOh3aGcHuFf39gaIeJk5GLWnWUkGdokI9ze6icnGZ7m4qFeplqhYyEb3qAa3JlYHdwbGtpXGZmYmJxVFs+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVldYGhmZ1hRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6Cur6yrqaWoraKnraSSlqu3sbOnm6uorZh0jZ6xoKirp5SXuaCgj5yknZF/iYianoyrmaGUp6GdjpaSnoR2rY+Ip5upkpmlip27tKigmZiLiXV3k42Xk4qUkZGUjZCUoY+coaeZnLKVgIybtZ2zjJKOuqaffaeieaCstH+OjaWeg4uGkLCqr42Ll6SbeoGLrIWcnaGnqKeHlYWYd6WbeoecgZengoJ7nLJ6ioahmJqVmJaCkZeXhJuZYnqHkIWPkJKLg21wjYd5gHB/gIR+hXOFg5SReJZoknSgmnV9mYWjoImYf5SMhYWaa4+Ohmx5fHFxaGV4cGpsa1xlbGpmdV1eSVRMUkBFNi5aVVU3KSEwOT4+NzQzNTY4Ozo9Pj5AREk/SkVKS0dTWFtZXGJhaGZaUUg5RUw7PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop+mrK2rqKygp6+mpqmlmZSvycCxopeoqrefkYWerZynoqCOkL6emoyfmqCQfIWOmJeHqpuglZ+gkYyTiYaAkaeNh6OepJWZn4ifurKonpqSjoVxdpCJlZCKlJCPm4yQkqCSmKGklp6rh5+0ibSarYrKh6msiLaFjbCBr6yCqIymmI2dfaiPc3t3nY+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWygaF9oZShkJiXgY+UnIuZkot9hZOHjZaSiYNtco+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56FpJ2FmoGOj4eLmnGQlIZpeXV8eGhpdnJoaGxeZHBtZ25ZZ0ddUk0zRTQ3TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUtNQEpjWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKfr6eoqKWrn6O3sKmrppqUoKSlrKWYpqy5pLCBoqmdpp6diZS9mZONoZKej3mElpWRh6qYmpqZoYSOi3ebnI+fkIiepZyXmpmIpLmupZqcjIx+Ym2Pi5OQjZCNjZiMkZOgj5WhoZmhp36hp4etnaCWrY+dnJyQhYCgjKmshaONqZmMmn+idYGZlGyCrXZNq3iHjZyRmqimgKmrfYOhe3qnap5/kmtnl4aXt4mefm5gZFmDl4CNe2Roi3KZfXmWbF19l21fUnCDXF9reIJfWGSBfIN/l3CnqmuDo25ypXCfhaBqZ6BtW2+MfWdaYISBY1hRcHdmbnVza2pvXWpxbmxqWWlPXVlGOUE1SERfbDUsSURSTU49ODQ4NTk7NkA7Oz5CUD5RUkxNQkpcXV9XXV5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGgtruqrqKZmKGjpq2voZ6wtqSpk6KhoKecmo6ZtJmQi5+MlYt1gZOSjIqmlJSYnZ5+koWFrKSHm5CKmaqZm5uSiaexp6KWmoiJgGluiIeLjo6Ki42SjJGTo42Un5+coqR/k4GPoqGUoHaclY+ngqCmf4Wnq4OleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5uomY6HnXuConN2pmaefnekX5h6fZN0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNic6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGGdmbOWcn2Yn7N1dFyesoNrY3B1d3Jpb1hrbXNzZ11pXmJMRT1ENlFCWnMzPVNHYEpSPTwzOTU6OTZEOztASlA/VU1PUUBEX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOVlKO3mKqbk5+NpLa0ra2gmqKdpKOmr52cs6+tlJmimqGlmZuVn6ubi4iSeIuFcYGWjYqPoI6SlJ2YfZCJjaigh5eOiZKklZybjYupqKWekJeHhX5qe4d+fZCNg4uRkYmQlKGDl56gnZ+ei4l3nJiijZ9xoYqHqYebpY6Upql9rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYWiZKF8iJaQm41tnmibjm+amXqAi6d9cml0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhwgZxglYxep3Z1h4h+nmiadYaTkpeOgJ9vmpFup5pdqX95u2t+qlyOhF20aF1ucnp4a2lccWt5emRgZlhiQlFGTzdXQ1JvNUxbW19OWkRBMjUxPDs3SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptJqniGOUm6u5sa+snqacnKmgn6+cnrKprp+YpZuhoJmXl6CjmYaJjWqIgHJ7l4iLlpWDkZWYkHqKhJWknIqUj4aMn5OenYmQqaOgmoySioGAaYGGeX+XjHuJjo6IkJebf5Sinp+hk5hyaJ+Jn4+McJKMgamHmJ6hpZ6me7Cto6K4l3ejs6OkgImUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mLWipKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g55uc32VcJp0a6RelXZIZWRhdHJ/f29mYGxpd3xlZWFRX1ddVFdAWkZRaEVUV11iWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lY3ZtXWVnZmtkZWxpaWtpk5yAsK2ZhFNeoKazubKyqZqijJysnJyqlaKtpaOpkKCfnZualpmhnZaIh4l3hoFveZWFkZuKe5GTlohygIiSoZxzkZCBiZqWoZyFj6mcm5WLi4t9g2yEhXGCoYx4ho2IiJOZlnyTo6Ceooithn21hI6enXullnqpgJWbj4mfm3ynaHdtfpl0oXNyfJ6GmXCTg659pIOlnZmAo29eqGd1omNvpWGc05B9e5l4c3NiooaQfqN0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2bbXxwlm1/cqJyXaRnc6ZgaKZtm9SafoabcHp7l2ycfHiXc26ppGdhZXpygIVsaGZkb3Z4aGBjU1xmUVFiSFlKVWFXVFxma1xlUUZDS01KS0JLRThPQFFOWFNZT1NRYGZmalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaWV8ZF5kZ2RrZGpsZ2hsaJeaf6+qVFxLfqmvsbOvsqObmYWZqqGipY+mqaGaq4ubmZmUmZOToZiOh4V7cH2EaH2Pg5SagHeRjo+Jb3+FjpKSbJeTfIqTlKWXg4+rm5STi4aJeYN2iIFugp+GeIGShoiZo5h7lKKjmZ+Js6Gitot6rKekrqVwqYCajoWAmpB7pIChmYaYcp6EpK6vipeMgI2kjZWDraCTdrW2tcmhc5SLgZ9gnpepbXmWh6CbdKKId6B+k5eLgXBNZqOScJuHc6R7eXRhg4FrfqBrcWRfnHF9c5ZoeWiytbTGpnOYfXqda5ybq3aFm253eZhqmnt1mHJRRX2zX2p3bHqIZ2toY3V1cW5XX1RZaVBTaElXTVlUVl5pbG9WaFdOS0FKTUtISk9BUUtQZWNqbWV0cnN/eXxudYl7e1RRT2xeaVxraVJqaGlsaGxmY2VfXF1dXmliZGlre19dZGdjamZvbWVpbGWhm4iupYNkP5Ohsqqur7WiopCAmKujo6aNpqifnqeEm5iXjpeQkJyTjoiDemp5h2WDjX+YoHl1j4mMgWmEhZGCjIWdjXqOjJemlISZqpiNkouBiXqAfYx5cJChhnqClYeJlqCWf5SlqJyVlYNmbnicbKJke3Gld5uYcGemgJWKeqR6n5aDl3Oed4GKlZePuW6RiqJifZmglYhucmmqa3WgbW+mYJtpi5BploeblnWigX6aYIyGjXVwiGJooGWefmmbdW9jZoiBbXGiWl5bYqFsXYiLbnp9cXFkpW14omRnp2iZc4yZcKJwVYmQb6BfZqhUi15UmG5udGtzg25xaWx5dGtwUllXV2ZaVG1JWlBdSVhpaXNqWWxXUVJGVlxMWFNhVWlrX3d0e31wfHxyg3uAc3aNgIR2XlJyYmdjcGdQamhoa2xuaGRnX11eXWBqYmppdnVdXGNoY2pqc21ma21jnKOXpXlkc22Lpq2jqbCxpp+LgJisnp+njaOinKSjgZaZlI6akIyYkI6Ke4dxgIhpi4t8mJtzdYl+kHtkg4eUiYqVmYJ8iYiYqJKBo62RhpCLgop+gICPdGmQpoR9h5SNiJmgj4iTqaadiKZ4lZt+pIiWi7GYnZCCr5efpXaUhnipc6WPhJpupKKMkoSNg7tufaWvg4aFhpOVnJ98pXpyqJWglmeefm+sZJaKlpN3qG2qooGJdomDd6uRpohrkbBrdrOMqWuKhW1tn56SlWB+q4uqdn5+iqSed598g6SVnaBqm4h4rGifroy2dHe+jaSTWoOnjqthdnN1cnx1cWNrf29pbVNXW1ZhYl1rTV1SXkpebW93YFtxWVxgW2d0ZW5vcmNydGB3en55cnmDc4R/gXt7jIGDgHZieGRjbnJkUmtnaG9scmpmaWFgXlxha2JtbHpvXFxiaWJsanhtZ2xuYpWkqZyBf52jlqmpnaimrqSZioKYrJufpoqcpp6rnoWNm5CHnJGGko2MjHOGeoiEb4yEfZmTdHSGc5KCbX+LkYeGk459e4KHmaePgKenj4GOiYWVdoKHkm9si6mBg4yUjomdn4mMlKqin4+AdZSXiH6BeZSuon+BmnGPhneOiYJ9e3KnjHJ+fXqYlpuEkHl7f36HlJWTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GHhIJljH9fgX+Ld3RylHVveW5th2yDhV11Z3eOZX+AhIynmX10e5VqiYhwgXZ9h3dubmiNdHp8mHiFXGxYeY9pb3hzcnB4eHBdbIduamdWW2BXXWZrZFZjVV9SYHB5eW1rd2Zra2t3fXJydXRhb3ZidHuCeHV6gnWAgICBeIuFg317bn9sZHluXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNk7eopomgopqmo5iknKuioYSEmK2SnqKKm6ibqpmDgpyMf5eUh46KiY1xgnyPfX6OhHuYj3RyhHGVhXt9kouGho+EeX6AiJulj3yoooyGkJCFlYOGjph2coSpho6SnZCJn56IjJunn5+qg4mOlZp+fomWraePkaWPd2+bj4F4kG5+qIVxfpVxa3B9gqCNgJOOi2hsXIKLi5uano5zlYuIcXRrgnd0gVlyboeRgX5/jGpdamV7hoSJgGBpeHqae4KKgXWBhYFnd4qGal9vcYF1XnGJgIiNpJSFZYuNg253i4Rxho96cWhpZnyEe5ZbXGtobnZbfHl4dm90c4NoXW6La2tiWlpfW1lscVxfYVpfXmZ0f3x2cHVka2trfH1zfHl1ZG51aG18fnd6fHt5eoCAfm+GioR7fXR+eXN/aFRccWlsdnB1Z2toZF1hWGtoa2txcm5XW2VubGdzem9oam1gi4qpsKGPoqGanp2Xnpioo6J+g5mujqCViZ2jkaaVgHyYhn2SmYqJh4eKcn2BjHaFi4GEl4pyb4BymIaDfpKDhIaJgHqBhI2coZGDqKKIeY6XiZWLi5yXhIN6rYKRmJqVip6dh4ihqp+hoqSLiJObnKOZlaqhp6afkpqGlIx6do2Ng6d+f5KQkpSdsqablZ+QjbGSl4OljIyVmp+JkJuCiJGKa3yOd3hlg4eRi3yJnoSHjJCJiYGFhJB3fHp0maCIhomdiYSTfn2KgH90bnKEgX12hYWJjqSPgoWMhoKMkIx9iIyKkYR6boSFfnqZa3NpYXSKcX57eHdweHWCXV5vh2huX15aXV1TaHJWZF1dYm1odnx9dG9wZWtqaYB9bnmAcmpwcWxngXtygoB4f31/hHttgoyGfHp4e316g3hOY3Zqc25wemVrZWNiYFt0ZnBncnFtVV1sdG1peXpxZ2lrZIyHnLmelqGgmJSYmZSYpKGefH+arI+fjoegnYyeln15lYR8jpmKhoSEhm55gYFzgYd9iZSEbWt+epeHg4OPfoCHhIV8iIWPnJ+TiKyghHOLkIaSkYudkX2Ne6qEjpOYlo+cl4eHm6WfopmchYKSmpmYj5qnn6WdnI+Vf4+IdXuGjYSle3yOkJGGmauinpSdkI6pjZCAnYyIk5mego+XfoaOg294hnJ1YH+EkIZ1jZmBg5CDh4V/hYSVbnl2dJKhiouFmoSEjHN/iXt8cXF6h4J6d4iNg5GljoWDjoCDiomKd4aJi41+cm2Agn1vaWxuaF56f2l+fXd2d3Z7eF1gcX5udGBjW11fUmduVGZbXmJraXZ6f3JsbWRramiBf2x0gmxsdW96cIZ6boeAdoKAfoV2cYKNiH57fHx/e4KKYGh7anVpaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2LiZ62maCjn5KRlZiLmp6fnnt4n6eRnIuHpZWMmZl6eo2GfYmRhIyCgoNufIB5c4GEfYuSfWtofYKXiYGIjXt9hoSGfJCDkZ2dk4mpnYFxjIuMkoagoYqFjHyokYmQkpeTlpN4jaOfoJ2VmH6AkJqYkoybo6GjmZaQmn2Mg3d/go6GoH9+jIyPfJiloqKTmpGQpoyPgZqRiZKXm36Tkn6HjoF1dIJxd2F+gI6GcouWfYiMcox/goWGj2h4cniLmJGPf5Z+iIlygYZ7fHB3eoqDeXiPi4KVpJOKhY97hoaHhHaDhImJfWhzfoF6fHJtbGhffnRpfXZ2dH1zgWtfYHR2cHdkY1lfX1JraVZmWmBhaGp2eYJxZ2tkbGhmgIBrbn5ob3FsfniHe2yMgXOBgX6BdHaCjYZ/fHuAgX1/j2lyg250aWGHaGxiX3FWdG9sbWB4aG1XanR2Y3V6e3Jiam96iYyesZGlpJyOj5ePhpygm519d6WhjpiAjaOLiZqWeXyGiH+DiX+JgoF/cn97dHaDhX2KkXdnY36Gl4qCiot4fICNg3mXg5aZmI2XoZx/cIyCkZOGpZuHjImDppaFk4uWl5OSdpGdoKGXk5V4fo6Xl42Wm52knZiSlJp4jYSCd4OVjZ1+gYmNjHOXo5+ilJmPj6KMioKWl4OSlpl+mI18iI2BdnF+bntkgHyLhXGHk4CRgmyHg4GAiYVmdW97hpGXi3yTeIuIe3+Ge3pxfXeIhXiDj4eKl6GVgYOLdoiEg4J3fIOKhnhhenp/dYB5aG1mYn9qa3h0dHd+cn1jZGFzbnVybWFaYV5bbGVTZFlhYWhrdnmGcWNrY21maHyDbWl1aG5waYB9g3pukIZygIODfnR8g4yBgH57goN+fJBtdolzdW1limxqYmJ1VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm62XpqeejYyXh4afk5eZfniqnYuae5edjIyZkHl8gYx+fIR8gYOBeHR5enR9gIR/iYuAZF99i5SHf4SGdH1+i399mYaXlZiNpKKZgHOHe5ORiaaPjI6Kk6CShJKQlJeRi4GPl5+akY+Pcn+NkZOJnZ2eppeXjJSVcouMiWuEl4+ZeoeIj4lvl56bpJSVi4yei4aBkZx/kpKVhpmIe4qKgXlxemx1bHx/i35uhpODlXhxgoR+fouAZXJpe3+VloN+jXSQh4J4hn11d398hIB7gouCi5Ojj3iDgXSJh32AdHaCiYVxYnx2e3J+cGNwZGV8Y29wd3N5eHR1YndgcGx2bm9cXF9eXmteUF5ZY2FobnR7iWxgaWVrY2l3h25nbWlrbWiBfXt4b5CIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhtbIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJipn6SonYqKkoaKnYuVmH54r5mNmH6flJGXlIh3fnyKfXyAd3iAgHB1dHxvhn2BgYp/fGFcfo+RhoCDgnN7gId6j5KJk5KdlaacloJ9gX2OipGjiY6KjZiajYaSmZSWjoqIjJKcko+Li22EkI+RiJ6ZoqCWlYiWkG2HmINlhZiOk3qJhJCKcJablaOTkomLmYyBf5CdfZKOkoyZjnuKhYdzc3ZscW51fIp0boaRj5NxdYF8gYGIfGVwbHl7mJN8g4h0kImAc4d4bn98gIV7hIuHgouUp4x6hnt+i4V4fnFwgYeFZml6dXZxfGNfcWFrdF9xa3t6eWxzcWZ6Xm9sc21yWFtfYGFsXFBXWGVjZ3Fxf4hnXWlpZ2JncY1vZGpoZWlpgXp3dW+OhXSBgoN7dYKIhXiFfHiEhXp/iXd/i3t7cniDamtfcGh0gGtyb21yZ29sZXxjboB6d3Fsd3eKfqKXoaegppuHi4uBj5yHk512gquVk4+IoY2WlJCAdHx3hXh5f3Jze4Zrc3B6bot2gIGHb3BbWX6RjYeAf392dYCAgKCHkouUnpqilZh4in+BjYicnYqPhpKYloWJlZqQl4yMjY2MnImOkIJsiYuRkYqdlqGbl5SEl4Zpg6KBZYSciZB+i4OLgXeTmZOfkpGJiZSNfn2Ol3uRjI+OmpJ8ioCCb3ZwbG1vcHuGaXSDj5mLcXeAdYKIg3lmcm51f5iOe4eEeZOQeXWHc2+IeoSKeYqFgYaNm6KHe4N1got/eHlubIGFg190dXRycnlbX3FhcGtfcGt+fHFubmtud2Fwb2txbVlZYmFib1lRVFpmZ2N1cISDY11rbmRjZmuSbmBnZ19oa4F1cnNwi4B1f4OAeXaAi4B5hX94iIZ3g4V8hot/e3aKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx0dXSAg36klZqsnqeWhY2Ef5eUg5CgdoyglJOHjJuNlo6LenJ5dYJwcoV0cXaIbHBudm2IdoN+gG1tVVGBq5SGgnd/d3KDeoOhg5OClZSanZObeJJ7g4ySo5mTjomVmZKEh5eZjJSLiY+Ph52EkIp7couFio6InJqfm5WTf5N9Z4SbhmeFn4eRhJGCiXGDkZiQnI+PjIyPjHd7kZB6jouMkpaMfIh8gGt3am5rbGx7f2J6fo+XgXZ7gXiDjH15Z3Nsc4aUi36HhXqSj3F5g291i3mIinmIfICKjp2chHt6doKLfHdxamyChHtheXFvbXN0Vl9wYnJiYG1venFpcGZndXVpcmxid2VdV2ZhYHNUUU9cZmVdeXCIfWBcaXJiYmVmkWpfaGVbZ3B+cGtxdIp9dnyGgHV2fox5e4WBeIiDc4aFfoyMhHx5lXhmcmqDYIh+b29remBqbnR/dV90fXmHeHRzhX14oI+ZsJyljoKLf4Oah4CMn4CLmpSPhYiYjo+PhHd0d3SAcXCFdHByhHBraXdug259fW10c1JNgt/IktaTe3B1hHaFoYSUd5aRmZ2RmXuUc4WQnqGSk5GLk5yUhn+XloiNjYeRjYebfo2Ad3qNfomMipybnJqUknmMdWaHkIVrh6KEkYiWg4ZjjJGZj5WLl4yMiopxepSIe46IipORiXqGfH9tfGVzb2tsenpbgXmQkIF6fn+Aho57e2lzanOKj4mBhYR8lIprfX5tf4p9ioV8hHmAjZOZmIl8dXeDj3hzbWdxgIVubHVwaWp1blNfcGVwWmBtc3lobGtjZ3lzcHFkYHhhYFZsX192UE5MYmdjXXpxiXVdXGV2YWJlZY5kYWdiWWlzc25rcXaMfHR6hoJ1dn2Lc4CGf3uJf3KJiIGRi4h8fph2ZXNufGWIfm5wbIBZbG55eXNgdnp7jXZyd4p3eZ6Lm66aoJCChXeIlX58ip6IhqCSj4WMmISTj4eBdHhweXFvhHBtb39zZWV5cX1teX1qaGtjpJrB3K7woXNsdoV3hqSGk3CXkZahlZyBknKGi6KXiY2Wi5CdloOBlpCFiY+AkYuJlX2GenV/iXiHhI6cmpiYjo92iXVthYiJfImig5GJnISFXouTl4uPiY+Li4SJbXuWgX2IhYmRj4Z2hn5+a31keHZqbnlzWIl7koiFen6BgYaMf3lmcml/iY2JgoF+i5WEa4F1bYaPgY6CfYF4fo6UkZePdHJ3h4x1c3FndnqEY3VucWNqdmhSYXJobFZgb3V6YXJkYGl/cXNvW2RyYWJXbltdeE5NTGVnYl53c4luXFxkeV5fZWWFYGNjX1lqc2tua3N3jH10d4SBeHd7iXGDhH1+iHt0i4mIloaMf36Xc2d1cnlsjHtudHGBV3F6dnlyZHd5hoxpdoCJcn+chpinm6OShH1xjJR3eYyehYWhjY98lo2AmoiEe3N3cHRqcIJsam18dV9heHd7cXV7Z2BkfOvatcnD3IdzbHSCd4ucio9qmZGQnpaUgYlxhYifjYSLlouMmJR8jZOIg4mQe5CLhY6Af3V4g4RyiIKTnJaUl4WMdYZ9b4OBh4aYoYKTjJ6DiWGDlI+HioaKjoeBh2l8k399g4SJjo2Ccod/f3F3aHZzanR3bFqNfZODhX2AhIGEioJ2YXJriIGOiYF+fpGQfW2Ba3eFjoSQgXuAfH2PkY6UiG1weYyFdGtwbHN5gmF1anBebHdhUmVzaWZTYHF3dWFwYF1ohHJ0a1hoaGNpWW1XXHVMS0xmZ15ic3OFalxcZXleXmRne2FkX11Za29mb2p0eIp+c3OBfnt2eohzhYN8f4d2d4qGj5mBjIJ7k3Vsd3Z5eJN0bnh7fVh5hnF/b2d4d5KCZHaGhXCKloWZoZqiioh0b5KMcXePnH6LmomJfaB/hJqAgXhydG5vZHJ/aWZteHhcYHl7e3FxgGlhZ2F/1baOkaZ4b3F4fXGUko6Ia5qPiZ2TjIZ7aYeLmYaBkpGGh5iOfI2NgYGJjXuOjH2IhHpzeoN7cYaAlpqOk5OBiHSChXWCf4mRnJ2GlY+ffohif5OHhYiFi42AgINnfJCAfn+CjI+Qfm2DfIN1bG13dXV4dmxjjoGPgIV+fYZ/hIl/cF9xcIR7jouBe36QiHlwg2V5gYiFioB6hHx+ko2PkYJtbnmLfnVtbmtse39kaWxrWm53WlNqc2liUWNzeG1jZl5aa4RudGJcaF9lbWBvVVxwT0hPZ2ZcaG9ygG5bXGNzYFxjbHdlZV1dWmxtY21qc3eGf3Fwf3x9dHiGeIWCfICHdXmJgZOVfImGdoiBcHh5e4STb257gXdeg4B0gW1penSUc2dziHxxkpGDmZ+boIaIdnaUf213lJh/iJCEi46afYyad352cnBsamF1fWdianV6W2B4fHpscH5lY2dnV52PX3Fzlr3FhXdylYuRgHSYjIedlI2Ic2uIj5WAe5SLgYSbjHyKhn18iYx+k4d0h4V2dn2CcXWGgZ6VhpSPgoJxfodzg3qIlpuWhpONnYCIZn2TgoCGhIqJcoF9Z32Le3l/f4eLj31pgH2EdmZweXh0eHRsa4+Gi4KLf3mDgYSEgGtecHZ6fYuHhHuAjn9+coBoeIGFiYSBd4J7f5WKjot8bWt6iXx2dG9oaH53ZV1yZFlwdFNUb3NpYk5odXlnYV5dWW+BcHRaZWNda25hcVBabFJEVGhiWmxvbnxwWltebWNaY293ZGdcXWBramNsaXN3gYNxbn57f3R1g3qEgnyChXZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaoJ5en5ubXx2lWtqeIR0a5OMhZ6YoJmFiG9+jHZqeZmPgIKKgpaYinmPlm96c3FsamRgdHtpYGZye1thcn16ZnB6YWVkjrGyd0tiWqXa0phzfJKNkXp/loyFmpKNhm9shZKReXmThoCEmYp8h4B5eImKg5V/bomGcXN9e2p5hoOlkYSTjIJ/bn6CdYJ3hJqXkoqTj5SFiHB6koR+g4SJg2+BeGiAhXhyf3+Diod8ZXx+hHZjcXOAanpxb3WZjYaEi3x3eYCEeoJrXHB8cn+Hg4h9hYd6iHGAbXCChY2CgnGDd3+WioyDd21sfYR+dnplaGp+cmFaeFtacm5OWHJ0Z2BLbnd2Yl5cW1l1fnNwWGdeZmtxX29PWGlTP1lnX1txa2h6clxbWWtlWWNweV9oXV5lbGhmbGlxeH+Hb21/fYF1cIJ7gIF/g392gYWJl4pxgo1xe4Z8enmElIx1a3p/bHB+dH99b3J8e5Nwb4F/eWaSioKhmJ2Rg4Znh4RwZ3qXin+AhYKaioF8jY1peHJsbGZfYW95bV9ib3lcZGyDemFxdl9kZdXrvoszOj6Lj4ByeYaKkI54hZmOf5SOjX9ubYWMi3V9j3+FgpWJfIN4bnaHhIKVdm2HhGt1e3VleYOEp4yDj4yDfW1/c3WCeISaj4uPkZKMjId/e5KIeYCFjoNsgHJpgH54bXx7gYqDeGJ5hIJyZHFpf252cnWCnIyBgIZ/dHZ+gHOBb1trfXN4iIGKe4Z/fIh3eXBrh4KOgohwgHd9k4mKfXNtanaAgHV1XWlpeXFaV35UW3JmTVtzcmZcSnJ5cV1bW1pedoB2aVpiW2dmb2NqTlhmUT1eZl1edmZfdXFbWVVvZFpkcXpcaF5gZ21namtpcHh9jm1qgoSAeW6Be32Bf4J6dYKBjJOFcICLbnd9gHt7iJOJgGl7fWt0fHKGe3N2fX+MeniEfnxrjIyEm52WjIKBbY1+bGl/j458fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXTZbsLZ1aoCJfpSHd4iZh3WQjIp3cG2FgoZ0eYl4iX2TiHp/c2d2iH18lm5vhX1odnluZXqJhaWHgIeNiX1tfXR+f3uKl4aBkpCYiYuFinyQinF8foZ8aX5ta4B7eWp6doKHgXJgd4J+cmRyZ3aDbnV8hpWSgn2CgHB3enx1fm1XbX11c4mAhXaGdIKJendybYh/jn+DcX17fJCHh3ltbWhsgoF1bl1oZ3VyUlx9T11yXU9cc3BkVkt0eWtYWVlaYnKBdmFeXWFnZGlqZk9aaE5BYWRcYHdhXHVtWFhTdWJaZW9zWGpfYmhrZ21saXB3fJNsaYSKfXxwf357gX+CeneAgImLhHJ7h29xd4R/e4mNj4RqfntueHl3ind9eICCh3+Efn56bYSMiJijjYWEfHaLemtthYmTen17gpKAgH6KhHBycGNmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f7+dqKXJuHKFhHSVfnqJlYR0ko6HcnNwhHqCc3WGdIh3lIl5eXFkd4Z5f5JocYN1Znd2ZGp8hIiegoB/jo59cX5yg3h+kI6Cd5WMlJCIgoh7iYpseXqAdWh7aWx/eXNpenaAg31oYHeIfWtqdGh7gWp2go2RlX98fn5xfHZ8dH5iVXV7cXKHgoF7gXCGiXd4b2+CgYt9fHd8enOMhIB1Z3BnbIiBcnBdaGN0b0xmd01fb1ZUWnRuYlFPdXliUlhYXWJxg3RcYl1pZWVja2RSXHFJRGRiXGRxXlx4aFVXVnheXGZuaVdsXmFqZ2Vubmhwd3qTbmmIjHl+c3t+eYKBgnx2fYOIhoNwdoNzbneCgn6Ii5R/cYB8eHp6gYt1g3h/gYGChHqAdW99ioubnoh+hnt3hnxodYeNknp/gHyJhoR2j4BncG5gZVxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6naqciHiLNyinlxj3Z9iZGBe5SLgHV0dX52f29wf22FdJSGeHVsYHmBeYiNZXGCbmd1blttfYGQk4CBeZKSfXd6bIV0f4+Kg3KViZGPiIaGe3+GbXV3f21od2VtfHZtand2f398YGJ4hnpodXZjfnxodYePjpZ9dYB2coB6fW2AWVZyfW9zgYV9f3driIZzeGp0f4KCfHl7d3pxiX97cmZzZG2LhGxzW2pgdmZJb29NXGNYV1Z5bWJQU3V3WVFWWF5hcoVwXWFjbWVjXm9jVV5yR0JmX15naV1ae2NSVl12W1tna2FXa2BgbmZmbHFocHZ4j3Rrjo12f3d4fXeBg4F7dH2DiIiDb3F/dXF1fYWBiY2Le3d/eIR8fYWHeIh8fYF9hIB7fnJ2eIuOn4yJe4p3dYN6Xn6Hmo16h4R0hoeFd4l7Ym5tXGJbW2FVanRkYFtob3Bnh3FhcWZXXGNrf3zKzoe6omtub4tucoVzfoaMf3uThXp5dHp1dHpqbHZjhHaSgnZvZ198gXmLiGRxgGpqcWNYbXuGnImDgnKXk3d9e22Gb4CJioZwlo6QiIaMhHt5f3JycH5naHJjbnhxamxxd318eV1leoB4aXV5Z4J3aHWIjI6VfXOHam9+gHhufV1XcH1tc36IeoBubop/cHZmdn5/foB1em95coV6eHFlcWBtjIFrclhrX3ldSXBsT1hWX1VWfGtiT1R2c1JSVFdeY3WGal1ha2tmY1pvYlljcEdBaF1hZ19cVnxeT1ZmcVpbamhdWGhhX3JmamhxZ3Fzdod5bpWKdYB7d355g4eAdXN/hYWOg3Bwe3h3dXmGhYeMhnp8f3WLfn2Gg4SHf35+fYZ/fHh2eXaSlJ9+jX2LbnWAemSEiJiGdJKKb4WGgnqDdWNuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq57n7huYnSHaXV9c3uFiHt+jYB3eHN3b3p2ZWpvYYd1joFzamJefXd5i4JlcH1na2tbVm94i6SBhX9wmZJxf3d0gGx/gI+GcpOHjIiFiYV9eXVzcGl6YWptYW12amdra3l3endbZ318eWZyfm6FdGZ2ho2GloBwi2dre4N0bHViW256anN6iXqAZXSGfG1wZ3R9dnx+cHpqeXl/eHZvZGtgbYl9bG5WamF4VkxsbVBTUGlOWX1oYk9VdmxNUVRVX2h3hGdeYXFpZ2FXaV1dbGlKRGpaYmVXWVV5Wk5Xb2tZXWxlXVplY150ZmxlcWZzcHSBeHCZhXaAf3h/fIWHfXVzgod/lYNuc3l7e3NyhYaIiYR5gX12j399hImOhIGDen6Lg3t3fHd2mp2YeoqDh2p2fn1thYWVgXOPgnGGgn+CgHBmbGdYXVtcW1RlcGVfWGNydWl2cGRlYldbW2h/cG9ygHOKZWZ6f2p2d3R0hYZ4goV6d3R2bmt6cGFoa2eGdI2DbWdeX3xveol8aGx3ZmpkVldzcI6nfYR8dpaQc3txe3hseXqPg3WXe4iGhIeEfXVxc21odV1taWBsdWRnZml6b3tyWWeBdnVocIF4gndjeIWLfZWCb4xrbXuBcWZzZWBreGZwdYh5fGF1g3Vpa3F0eW94d3J7ZX19fXZ1bWNkYGyGfG1rVmpjclRMa2xQTU9wR158ZmFOVnVlS05UWGFseH9mXmdzamVgV2RYY3JeTEtrWWRiVlRVc1ZNWXdlWl9sYFxbZGVfd2dtYm9pdG9xfnV0mYF4gIF4gH+GhHp9doKDfpiFbnJ0fHt1cYWFjoKBeot1dJCAfYGVjoCFhHx+jIZ6foF2e6OminmJhoVsdXx8dYSDjXtvhnR6hX2Cg3VuamllVl1bW1pTY25lXFlidHtqaG1oYGFXXlppgGlrcIBobWJpe3prdXV1cIeCeoF+d3Zue2hqeWpfZW5ogXeQhGdlWGF2aX2GeW5pb2ZmXVVYb2iPqHeBenyQjnh0bn1tcXR4jX53lHSGg4CGiXZqc3doaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Bfnp4YneFhXqRhnOIcnB6f3JjcWhbbXVkbnGGendhcoBvZ2l4c3Frd3ZzdWKCeX11dG9jYmJsfXxra1VpYmdUTG5oUEhSbEVheWZiTVRyXkpNVVpmbXl7Zl9tcWpkXVZgVm9vWEtUaVhnX1lOVWxUS116X1xfbF1dW2JlYHpobGFucHZub3d1eph9d4CBeYCAh4Z6eXqDfYGThHF0dH96dnSFiJB+gX2RbHOVgXuCn4V/h32AfoaCgIp7dYSsn396iIiEbHKCenaBgIJ1b4hvfYB0ioBqb25lZFhfWlpaVWJqZ1xaX3WCaV5tbFxhV1tca4FlcnR9ampebXh3aHV4c2+HfH5+enZzbHpoaXdnXWRzZ3p3koBjY1Rkb2aBhHZ2ZmhpYVdWWWhkkKhvf3d/io56cG97ZndteYp6do5xhH5/gIduZHd0ZWhpXWxiXnBwW2dfbXVlemhddIBucmtxe392dmR1hox8iYiAf3hydX50YXBsWHBxYW5vgnpzY3GAa2Bsem5paHl3c3BkhHR4eHRvY2BjbXN9amxUaV5fVUx1Y1FHV2JHY3dmYUxUcVlLTFhZaW13e2VlbnJmY1pYXll3ZlVLXWRYaVhaSVdlUUljeFtdX21bXlxiZF5/aWpgbnR4bW9udoOXeXKBgH1/iYyGfnV2hniGjH10dXWCeXp6goyOfX+FiWp0loF7ip19foV5gHt+fIaJc3GProx8fIeQfmZxiHp0fn13c3CGbXx+bZB6Y3BwYmVdZVZaWVdjZmtgXV10hmhYcG1bXlhaXGx7YnF3dm1jXG50dWl2d3Juhnl/gXp3b290ZWh0ZVtndWZ2dpF5X11TZWVqgoFzfGFiaVxUWF5jZJClaXl0goWQeGxteWZ3bHuDeXSHcoF5fXmAaWV3bWBnYV9rYF51a1lmXW9vYnplW3d8a25vcHh5dHVmc4OTgImDiXp2b3J9cmF4Y1lubmBvcIB6c2VxgGRebXVoY2Z4enJsbYFzcXtxcGFdZG1vfWVpVGhZWlVOeV9SSlpZSGN1ZGFKVW5VSkxbV2ptc3tkbGx1Y2FZWlxid1xUTGReWWpUV0hZYU5IanZYX2FuW1tfYmNdhWloYm54eW1vanaBkHlug36AgpKIhIF2dYl0jIZ0cXZ2gXd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OHhHNwmaJ7e3+JlnlldYh6c3l3bHRwf2x5fHCSc15wb2FnYmxUW1pXaWRtZlxccollU3JuW1lYV2BsdmNqdWpqX1tudXNudXR1a4d9f4F8d29ubGRpcGNba3JkdHaOc1xXVGRgcX9+cYFcYWNeU1phXGSTn2VycYWDkHNranhsbm55eXpxgHZ/c3t6e2RmdmheY1thaFxfd2hXYl5waGF3YVt8dmpqcm54dHR1anKCloSHf4V2c2pwfG1md1dbaWxhb3F/eXNlb35aYHBwYV5pb3xranJ9cG92anBgWmRrbXthZ1RnVVhTUXdcUlBZUkhkc2JgR1ZsUUlQWlVrbGt8ZW1vcmFbWlhabXFYU1BnWFdpVFVHWlxPSXN1WGBjbmNYYWFhXoxqY2Vtenlsb2l2eYZ7a4R9gIWZfIKEeX2IbY+GcW92en10goJ9i4+Dg5d0eIKUhYGfiXWBgIF0f4Jwh4N2b6KXdHuGjId7ZneLb258cGd4cXtsc3ZzjWtedG9iZ2ZrU15cVmhibGxbXHGMZE5vbVxWV1VnaXNoY3RlZV5acHZwcnZ2emyIfX99iHeQc2Nka29hXG5tY3N4h2taVFZiY3d8fHCEXGNeY1RbYFpjl5VjbnCChYlyaWZ5bmRydXF6a3l0dW97f3ZfZ3NkXF9XYmRZYnVlVV9gbWRhcV1dfm9oaXNxdHF1d21thZSDinyFcXJnbnxvcW9SWmVpZHByf3VzYmx1VWJxaltebmR7ZGt1fHBxcWltX1hjaWp4XmZVZFVXUVZvWFFXVFBIZXJfYUZYa09JWVRWbmlkfGlseWtiV1xWXHVlVFJWaVJZZ1VUSVpbUE55d1tfZW1qWmJhXl6PbmJnbHp2bm9pdnZ/fm2EgH6Gl3t/h4GKf2uTiHJndIB7dYCDfomOf4yTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOCjYx3eG56jWBlfXFnenR5bW1xd4NnZHxtZGdnaFNgX1VnYGxvXF5ujmhNaWxgVVZTb2dza2Z4ZWZeWnJ2b3R8eXRuint/d5x7emthZWxtXmBuamVxeX5nWlZYX2x4e3pvg15hXWhWWGBYZJyIYmtwgYZ8dmtqdmxbdXBqeWl1cm5vfIFzWWtuYFleVmNkWWVxY1RfYmlhYmxaYH5rZmx0dW9teHdtaYaNgIp7iG1xZnB7bHFsYVhfZ2ZucoBzcl5pbFNlcGRVYm1heGFvdHp0aW5ral9XYGZodVxkVmJWVE9ZZ1NPXU9QSGVwXWNHWmpOSmBLWG1lX3hpb39lYFVeVF52XFVSYGdQXmJVVEtcWlFadnZdX2ZtaFhjYVtejnFjaGp4cnNtZ3ZzeYNzgoN7iI5+fIqIjnluj4p0bHOCdH9/iIWHkoSVj3p9jI+IkZuEgHyNhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpSTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo6Ojo6Ojo2Njo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPy8xMTEwL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERDR2RoZ2dnZ2hNQkNDRERDWGhmZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIaCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTQ5XGBfX19gYUE1NjU1NTRNYV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fn1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHh4iIiIeOkJCQkJCQjIeHh4eHhomSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaIiYiJiYmJh4WFhYWFhYeJiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5GLkI6LjYWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjY2NjY6Ojo6Ojo6Ojo6OjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQi4WIh4qOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCIhYWFiI+JjJCPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkIiFh4eIjIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp+fHZ2eHx8e3x9fX19fX5+fn5+f35/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4SJiIWMiI+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pio6Mi42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5eXt9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fn9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fn5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTk5KTk5SVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSk5OTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGSkZGSkpOIhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCSgoKSkJGRjnWGkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9+f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcIWQj5B8dYiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzb4qPinJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXdte4+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/f39+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc25vhHt1doCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGRUhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RiXmRfYmxxZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYl1qbF1mZmdlY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hJSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaandtYm5yamFZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtrcmxhbXVyZlFRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXWNva1lpc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRkhVYmhrb3BvbWxaTExOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDRkdITVpnaGdybm5oZmRgXl5YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gH+AgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PklaXVpcZWxua29tbWxraWhrZFNHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1LW2ltbm9qb21raWxtZlFHRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYGCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozo9SGNvc21ubGpraFVDPkNGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PUpgc3RwZ1Q/Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkJsfGo/OTs+PT4/QEBAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO1tuQD5ERT9AQURfZDs9PTs6PT5BQUA+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKR1ZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo6bXdJODs6PT5BO0hkPTw9PDg6Oz8/PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlMRkV1dk43ODg6Oz4/V2pBOzw8Ojo7Pj8/PT05Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnlrYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVvdH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUlMUU1NS0VDRkdHRUdFRUVERUNBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTmlaT1BOSUdJSEhJSUhIR0dISEVDRUVFRkZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSEtWc15WUUtISEhIREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiIRWbISHhoaGh4iIh3xQSlluZV5dVEdDTUZAQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREZHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGhIKGhYSEhoaGh4eGinVKYGJhYWNlU05YPDw8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjnFoaGdlZ2lmaEY2ODg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouMjHhtbGloaWpZNTY1NTg3MzU2ODo4NzY1NjU2NzY3Njc6Njc4ODk6NzU3ODk3OTc3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJi4qJiYqKioqLioqLiXZtbW1sbFU3ODU2ODg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Njg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeHiIiKioyLiouNiHJub29wZUA+Ojs7PDk6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKjI2OgnJycXFjR0ZDQkFCPkBDQUA+PT4+QD8/P0A/QD09P0I+QEE/QD89QEBAPj9BPD48Ozo7Ojk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uMjY2NfnJzclNLSktISEhFRkhHRUNBQEJFQ0NBQkNCP0BESEVDRUNFREFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyMjIyLe3p0XmddUEtLS0lKSkpJRkRER0hHRENFRkRCSElLR0hHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjY2NjI6Je3h7b2dVTUxNSkpLSEtHREdJSElFRUhGRkVMTE1JSkdHSElKTk1PTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7Oz06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjI2MjY6CeHJVUlJPTU5LSUlGSklFS0lHS0pJSkdHR0tMTkxMSEhJSk1RTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIyMjIxzW1ZUUVFPTEtIR0NISkhNTEdLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSkxGR0hHRkZJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIyMjXxcW1dWV1VRTkxLRUZHTVBPUFdVUVBPUVNSTVNUT01TTFBTVVZSU1JQTEpNTU1LTkdHSkZGSEpFREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yLi2xdWm1iR1VTUlFLOztTVFNgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl4ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH5hiouLh29fZ1g8WVpZVFE/QFdWWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFVUVlRPT01KTEpJSUxNS09NU29zdnh5eHd5eXp7ent8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mLjHtxclpdXVxTVVNXV1VbWnWDWVV9kGFcWF1fV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeEi4BoW1xdWlVXVVhTUlhWY5aAUmVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRUFJSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn6AfV9TV1pWU1ZUUlJNUE1MZnpbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a39+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHem9yWUxNUFBNT0xKS0VGSUZDP1RkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f39/f39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eXFlVUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ2YF5ORUBEREREQ0FFUUNFQUM+Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn+DgIODgoCCgIKBgmxOSEFBPDw+QEFAQD9rUUtgRUZISUVCP0dMTkdNUVVJQUU/Pzw9PD09Pz0/QUNDQD89PUI+Sk5HVW51dHVzdHZ4e3x7fHx8fH19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVlVXUVFXVVBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZURCQUI9O0NDQkJEQlxdT3tOT09OS0xNT09RTEtNV01IR0BBPDk3NzU5OT07Ozs4Ojg6PzxCSD9cc3R1dXV2d3l8fHx9fHx9fX1+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXFpJSFBSUU9NUFFOUVJUVlhTU1lUT1laW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEdISENCR0lGRkVETVJQYVdTWFFQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1LVFRTUFFVT0xSU1RYWFRUWVJNV1laVlhYVlhZXVdXWGhza11WYXNrYmFfXmRhX15ZVVFOT09NSUhKTEpJRkNRUFNbV1RUTlFTWVNcZVVPU1RSTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTpHbXJ0d3h5e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5aX1tWWTtEVlhUW2ZKTFBTUk9OTU5OTkxKRlFQVVlTVE9KT09VU1RcVlJVU1JPTUxJSEhGPz48Ojc4NzY1OTk2NzY3NVdvcHN3eXp7fH19fX18fX18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlTVU9KR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBTTUlMS09SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0hGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVFFQUVBRTlFPUVBMSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR1eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nVFFTQUdVUE9RUVBOTU5NS0xLTE5PT1FMT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9e3x7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTExLSTw5ODc7PkA+PD1BQEI9PkVIR0NFRklHSkpARkFBQEZIRUpPSFFSYlxRUFJPU09PUExMT01MTU1OT05bV0tNUU9HSUhDSEpMTEtGRkZFP0JDPjxCRz9CP0FkcHN3enp6e3x7enp3e3d5fn58e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0JAQD5ARElFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xOS0xNTU1MTE9OU2ROSkxSSElJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxBQkFBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRGSUlKTEpLTElKTU1PUFJQSkdDTEdDQkpJTE1PTklKSUdDQ0NESEpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktERkI9Pj05OTo7QEI/PUFCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISkxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS01KS0ZHR0pOTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjpAQ0A+QUNERUlFSUpMRklJR0ZGREI7QUNDPkBDRENER0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSEhJT1JSU05SZmZmcW9zeHV7enxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NDRUBEQj4/Pjo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1ERUI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIT0tDSU1LT01PTk9QTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPUJBPkE9Ojo9Pzs9PkBCPkBCREdKRUlGSUhHRkdFQ0JBQUZGQ0JCQkRFREdHSUZMUUxJT0pKTUxJR0hFR0ZEQ0lJSEtKR0tSTUJOTk1QTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd3dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREU8QUBAQzw4Oj0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFSUFBRTk9NTlBNTE1TV1ZYWFVYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc6Pj06PjpAQj4/P0NFRkRGREVIRkRFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR05LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFJPUU1OUU5NUFdaVlpZVlpdWVhhYGFgXmhlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSEhHSURCQ0hFPEBFQkU9ODk+Pj08PEFCPD8+QUFGQ0ZDRElFREVFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5LT05PUlVWT0tVV1NQU1FSTE9RUE9UWVpZXFpZW15eXWBjXlxhY2tiYGRnZ3KFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD9APz4/QkE8QD5BQUZDRUVFSUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTUxMSU1LTk1NUExQUFFVVldPS1ZWVVNTUVJMT1JSUFZbW11eW1xeX19hYGFkXWNgZWZgZWhqZHNzZmpnZ2tvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQ0VERTxARkREQzs/P0JAQEBDQT9CP0FDSENGRkdJRklGR0RJSEdJSEpMSEhKSklMSkZKS0hJS0pHS0tNTUpKTU1OTk5QS09RUlRYVk1OVFZUUlJRUE1OVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTExMTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hISUhHSkdDSElHSEpGSUxISUpNS05MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAREJFRERGQkNFR0NDSUZDSEpLSUlLR0RLSkdISklJS0hKSk5MT0tJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQ0ZFREZCRkZHREVLRkZKTUxLTExHR01JR0pLSEtLSUtLTkxNTExMSUxNTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdCRkNGRUZFRENISEhERUtIR0xOTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUFxubVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGR0JHRElGRUVCRklISUVITEpHTU1PTE1OR0xNSUxLSUpNSUtKSktPUE9OTUxOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNHREhHTEhFQ0NISklIRkpMTEZOTExTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFBPkREQkdESElNSUZDRkpMSkdGS05MRk9KS1dSS0dLSkpOSUhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERUNGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElHS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSkpPUFFkcWlUWVdcW1xWWVtdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZFQUVDQERIREZHQ0lLTEhGREdLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT01KUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSS1lhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CRENCRUlFR0dGS0pLSEVFSUpLRkVISFBLTU1KTVJJR0VBSEZKSUtMSkxKSEZESUZERkdFRktIQ0pOTExVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOX1xeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoaGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNHSEZIR0hLSkpJREZLS0tFRklKTktOS0hMTkdIRT5HR0xJS0xLS0tJR0RIRENERUFGSkVASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFYVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZJR0hHSEtJTERES0tOTUxLSEtKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQ0BJSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUVtXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGREZLSkZGRkhHR0lHRkZJTEpORkRLS01OSkxJS0pISEZCSEhRTUtLT01KS0lHR0VEP0VDSUlCQkdGRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktKTVBFRklKS05MTElLTElIR0RIS1FPTU1QTExKS0hJQ0RBRURJR0NCR0ZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV2BfVFBPT09XUVxbW1xcXl9iZmZlbGVvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxLS0xLSUpHRUpOUVFOT09NTkxNSEtBREFDREdFQ0JFR0JNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NT1RTWlhYWl1cYGFkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSEtLS0tOTVVOT0pKS0dHS1BTU05QT05OTk5HS0ZgRURfTEVmZEVOXEleW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgIODf356e0xJRkdGSEVFS09TSUpGYFRISU9KSU9NUlFMTUxMT1JVUk9PSUtNR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXJ0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW19gYWBhXWBhZ21wbGBwd3R4gYGCg4OCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJS0VSVkxLTklLUlhXUU1PT01RVE5PUU9LS05HTVBTW1pTUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ213foGAgn57eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0dgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0hRUlRZV1ZQVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVib3ZQZWVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anZ1cIBfcmZ9aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J2eX6Bc3V6bnx9eXhyb05LU3VOQ0JGUFBISktJS1BPT09NUFpgWldLVFdQYV5SVlFZUkxQSVNUVlhXV09VUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnZ2VlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX5ucXBre3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTE5JVFRWV1lXT1NOTk5SSVJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbGB2dWtpdXt6bX54a3xwXF5eYlteYmRkZ2VlZWJaY2Npa2tyc3J2Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ua21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZUVFRhX1BOTUtUU1RRVlZOTkxNT1BLSFFOUFVMS0xTVFRTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFhaT1NVV1hYUl5ZV15WVFBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09MTVZUUU5VU05PTUxRUExKUVFLUU1LTFBSVVNRUlNTSUhMTk9RUlFRUVRWUlhXXFdTUlBSVFVWU1pRTlNSWFZUWVZVWlZUUlVUVFVXWFZcWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTU9VU05STk1PUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11hYV5bYmJjZ2ZlZGJYX2FiXWBnZGZlYV5fXV1eWlpgWl9nYF5dXWJoa2FnZmhmZGBiY2JPTE1MUVFMT1RPT1NRT1FbWVdXWFtZWFlWXWpkVlhZWldWU1NPSk5WVFBPVVBQUE1NUlJQUlhUUVFPTVBUVk9YUlRVVU9OTVFUVlVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUVlZWVllUWFhWU1JZV1ZaXlldX15VXlxeYFxbX19fX1piYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xYWltkcW1oZF9bWFZVV1FMTVZTTU5ST1FST0xRU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlFOVVZVW1xXUlNXVldYVlRZW1VUUlpYV1xeWl5fYFVhXGFhXWBiX1xgXWNhY2doZGZgWWNgYV9fZWRfYGJbWlxbXFlaWVhXXFpcW2BeX1teXmFgXmJcWWBbUU5PTlZRUFRRT1RUU1BXXFxcWF5cXlZcXmpxd3mAY1xbVVVXUU1PVlNOUVFPUlRSTFJUVFlaV1VPUk9TWFdUU1VSUlpPUFNSVltWV1dTVlpYXF1bW11WU01UVVVcXFdSVVZWWFlTVVpcVVNTXVhaXV5cYGBgVmFbY2JdYWReXGJhY19jZmlkZl5bZGBhYGBjZV9iXllaXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRTlJaU1JRVFJUVVRLUldWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWVNYXVheXVlaXVRVTlVWV15bWVJVVVlZWVVXWlxWU1deWl1dYFxiYl1ZX1tlYV9kZF5eY2NhXmVmaWRmXl1kYWBhYWJkYGJeWFpfW1xbWFhYV1dbWVtgXFtbXFtYWlteVl5ZXVFPT1JaUFpUVVZWU1RUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUVdSWVhZX1taVFVWWllaV1haXVdVW15dXmBhX2RjXF5dXWVhYmZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU05QVllRXVVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhXWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSV1NXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWVxWV1hbWltZWVpbWVdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYltmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlbWVVXVFdbWlpcWVhZYFdQVV5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1pdXlldVVJZV1lZXWJaXldYW1xbXFtbWlxaWl9fYGBkYmNkZGJkWWFmY2ZmZV5hYmBjXmJjaWRjZ19nXmFiY2FhYF5fWFRbWlpbW1hbWFhcW1pbWFdZWFdcW1tgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW1xaVldYWVxcXV9bWVtiVlRYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5YVVhXW1tfYFxfWFlcXF1eX1xbXVlbYGFeYGVjZGVlZmJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXllcXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRaaWhiZmljZV5iYmNhYGBfXV1aWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVlUWF1dX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaGJoaWVkYGJhY2FfYF9cXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWJgXltgYWJmY19dVF1gYWNkZGZlZ2VmZmVeZWZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX1xdW1pbWVhYWFZaVlxbWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7enp6enp6ent7e3x7e3t7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3p6enp6enp6e3t7e3t7e3t6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIkMzT0tLS09WehomJiYmGs9bS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIqU3ebk5OXk56WJjIyMjIi/6eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXl5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2EhYSEhISEfnx8fHx8e4GEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV5dnZ2ent4e3h3dnd6d3l6en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3l5eXl5eXl6e3t6e3t7enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2eX18fHp5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjYyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fX1+fXl7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4SEgoKCgoGBgoKCgoKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3dnt9fHx8enx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp5en17fH16fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4e3h6e3l5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKCgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mFhIOEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4OBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7e3x8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYGAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoKCgoGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0dHR0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm5ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoKBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzc3NycnFxcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubm5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgYKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXNxcnJxcW98gm9wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKBgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwh4ZwcnFwc5iCbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGBgYGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF9oYJvcm+LnnxvcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKBgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFycXWdoXZxd5+cfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgoKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZiokG+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nyc3Ryk6mkeYihnnxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eXmftKmkp6mXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7ia+mobWqrKN+e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2YpZaisqCZp5N9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+gIB/f35/f4CAgYCAgYCBgZycjqCwoJ+in4CAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5qOmLGhmJWchXx+fn5/fn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+foCBfn6fq6SXpJublqGfhn99fX+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgYGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KDg4aOn7KooqCZnZ2mqKyooJmRh4GAgIGAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNoK2xppuaoJuenJydoaSjnZSHg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYOLl5qXlpigm52dnZmal5CJhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBho6Uk5eanJyblI+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5OSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDhIiQk4+UmJKHg4KFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkpCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKBgIebiIuHgoKCgYCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf4OIjoCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f4yVgoKBgoSCgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSk5CNjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgZCMg4F/fn18fYycjoCCgYGCgoSUlIyBgoGCg4KBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYSFhYSDg4SDhIOChpSUkpOSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgYOCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDg4KKj4KDg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhH2GiYB+hYWFhIWCf319fYCDhIODhpiPgoOEhISEhYODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaGhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/f3+DhIONmZWSiISFhIWFhISEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhZSbo6uik4eFkIeGh4aGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWDg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+Jkp2lpqaik5CSiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357eYmYl5yhoJ2dmoyIiYmJiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fXx7fpKbmZ2enJ2Th4iJiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4OEh4iIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19gJWamZuamZKFhoeHh4eIh4eJh4eGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6gJaZmZiVkoKChISGhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GEhIODg4KCgH19f4CAgX99fn59fH19e3t6hpeXlZaPgYGCgYKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goSEgoOCg4J+fX5/gICBgH59fX19fn18enx7ipaWk4SAf4B/f4CAfn2Af36AgIF/gICBf3+AgYF+fX1/gIF/f35/gIB/gICAgH+AgoCAgoGBg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6e3t8jYyKi5eMfX9+fn9+f4B/fn9/gH+AgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp6enl+jI2KkY+Bf35/f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f36Af39+f3+AgH5+gH9/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp6enmGjoeCgoOCgICBgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIGAf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEhIKBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXx6enl5eXuFhIKChIOBgoOBgIKAgoGBg4ODg4GBgoCBgH+AgYOBhIKAgIGAgYGBgIGAgoJ/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYSEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eHyCg4SFg4GEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5en+Cgn+Di4SDhISEl5eDg4SBfX6BgYKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDg4SDgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl5fICAfYeUg4ODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6e3x9gYKBgoGDgoB+fX9/e4iRfHyOln99f3+ChoqFg4OEg4KDjYl/fX+DhIWFg4WGhoSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYOEg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXl9fn+Af4F/fXt8f359gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32CgYCCgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e35+f39+fn5+fXyAgYB+ho+Bfn2Cfn9+gIJ8fIB/goCBgH58e4qCfYB/foGAgIGCgIKAgICBgH+LlJCMjI6OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoWEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX+AgX1/f4B/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gZSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3x8fHx8fHx8fHx9fXx7fHx8fHt8fHx6enl7fHp9hYODgIGBfoB/f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36LhIGHfn18fH9+goJ/fX19fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjYyPjYyKhoSFhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen5+fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISDgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fH18fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJioiKiYWIko+NiYqHhYWDgoKDg4SDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn5/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg319fXx9fH19fX19fnx9e318fX1+fX59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fX18fX19fn19fn58e3t7fHx9fHt6e3t5enp5eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH+AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18fn98fX18fX1+fn1+f3x9fHt8fX58fHt8fXp6eXl5eXp7fn6AgYOHhIiPjouKh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGCgYKBf4CChIF/foGAfX6Bfn1+f4CAfX6AhIB+fn99fn19ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH99foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fXt7e3x7fHx9fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgYCAgIOAfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e31+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYCAgICBgX5+gH+BgH+BgIB/fn19fX59fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhISDgYCAgH+AgX59fX5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBf4CBgIB/fn5+fn59f35+hYWBgYF/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4GDgoOAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH2AfX+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX98f3+AgYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX59fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWFgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p9eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hYSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f4B/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgIB/f4GCgYB/foCBfn+AgoKAgYOChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB+fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1+gICAf39/f3yAf3+BgIGAgH98gH9+f35/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e3+FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Afn5/f39+fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH58f4CBgICAgIB8gH+Afn+BgH9/fYF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3e3l3eHd3eHt7ent8hYl9e3p3enx9fXx8fX19f358fX5+fX19fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgoCAgYB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/foCAgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKNenx9fHt9eXt6enh6gYF4eXx8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fXh4dXh4eXt8fH17fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgIGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31/eHd2eXl6fHx8fHx7fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4SBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgH+BgYGBgYOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97enZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgoGCgoCBgICAgoKBhIB+gYOBf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSGhIKDgoOEgYSDgYOAgYOCgoKCgoGCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhICChIKDgoKBgoKDgYOEg4SDhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYF+fHl8enp6fXx8gX56fHx9fXx6e35+foCAf4GBgYCAgICCgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGDhYOCgoKDg4GDgYKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYCAgoOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOCgoGBg4J/goOEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fn1+gYGAfn59fn1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4KBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+fn9/f31/fXt8fX19fX1+fn+AgYCBgYB/fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDhISFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYuJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeoR/f39+hISCg4KCgYOEg4SEhYOEhYaEhYZ9hHl9fn+De4WDgISDgH99fn9+foGDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgIJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYR+g4N9gX1+f35/goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYSGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhIZ9cHuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fX9+fH6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYGAgYCAgIGBgICCg4KCg4WHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fn2BfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIWFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WEhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fX99f39+fYCBg4OAgoOBgYSCgX+BgoB9f3+Bfn9+fX6BgH5+gYKAgIKEh4aDg4aEhISFh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhYSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3B5fX1tfXVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEg4GDg4SDhYOFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgoF+f357fHt+e3x9fn9/fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoeFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaHhoWEhoSFhoaGhoSHhoeHhoaHiIiIiIaFh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISGhIaFhIWFg4aGhYWFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYODhYaGhISDhISDhIaEhoaFhYWDhoaFhoWEhoeFhISFhYOEiIaEg4OEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFhoiFhoeGh4aHhoeFiIiHh4WGhoeFhoaFgoSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIF7e359fHx8fn18fHx9fnx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaIhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeIiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf39+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYWFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFiIOEhYSGhoaHhYWEg4WFhoaHhoeFhoaGhYaGhIOEhYKBgoGAhIOCgn2BgX9+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt8fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYSDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iIhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4WFhoaFhYaCg4OFgYCBgICEgIOAfIGAfn6CgH2Af4F9gHx9fn1+e359fHt5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaFhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFhoeGiIiGhYiHiYeGhYWFg4aEhYeDg4aEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B8gX99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhoSEhoSHhoaFhYWDhIWEhYaFhoSEhISFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoWGhoOEg4aChYGBgH9/gIB+f4GBfH5/f35/gIKCgoSFg4KBgoSBgIOCgYCEhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGhoaGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9+fn9/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChoWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn9+f4J8f359fXx8fHt7enp6enl7eXt6eXp6ent8eXt9e3t+f3+BgH1/fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj08Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09PT09PT09TU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svL0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19jX19fa29ra2tra2trb3Nvb29nX19fX19fX19fX19fX1tTT09PT09PT09PT1NTW1dXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbLzINtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0jYuLi4uLi4uLi4qKioifu7m5ubm5ubi4uLi4t73T09PT09PT0tLS0tPT09vi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXy81OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFhSU1NTU1NTU1NTU1NPd6ikpKOjo6Ojo6Ojo6Kr09LS09PT09LS0tLS0tLf6+rr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18vNUiwxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp5cVldXV1dXV1dXV1dXU3qppaWlpKSkpKSkpKSjrNLS0tLS0tLS0tLS0tLR3+rq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fMzlw5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqiZmFiYmJiYmJiYmJiYl6CrampqampqampqampqLDS0tLS0tLS0tLS0tLS0d/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzM3EwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzLy8vLzdLS0tLS0tLS0tLS0tLS1NPU1tbW1tbW1tbW1tXX2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M3Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztLTz8/P09PPz9DT0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19fX19fX19bW1tbW1tXW1tbW1tbW1tbW1tfX1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvVkpfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztKrnM/Q0KGWy9PHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT08PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK2nKWj1qegq5/PmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/OnZyRnrmelpChtJWGnZzNz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I6NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv5igm7WXn6CombW/yZeZxdDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9COjc0Ojo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P07SZlqq5nKagi5/E05GZoc/Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8qgo7/KnKWMp63Yqpmq1M/Pz9Srmn6jj6Wbx8mU2K2jv57V0dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDUrJuni5eUn5WVpLvNiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PD05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q07aysqWdhp6vs52l0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXEopmWoI+jm6KcnJGnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTo6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6DH1aKrpJy+nqiho56ooqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZSUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6Oz06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09PIkY202a+NkaXUmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVExGQjw8P0ZFR0tJPTY2Nzo5Nzk6Ozo7PTk+OTg6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MjB1dLVwL3W1NO5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRExMQT43NzU6ODg4OTk6PD48Pjc6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHT1NLS0tTV09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PDg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT0tLS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCREtJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTU1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ7Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIREVAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDg3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojs4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5OTo4Njg4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/hoG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc2ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTM1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY5PTs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5ubi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY8Ojk8PT07Ojg2Njg4Ojc2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBGPjg7NzI4OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2Njg/PkBCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NjQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO1tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6uvsKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOj0+QD9AOkBCQkI/P0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3s7CwrayrqqmpqKeoqampqKiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJiZmZmZmpqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OTM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpaWlpaaoqKeoqKWmqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmJiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8Pjo6QTw3PDgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutraysrKuqqailo6Slpqalpqenqqimpqenp6iop6eoqKelpKSioaGhoJ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsK2rqamuq6ilpaamp6WkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiZmpqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PD89P0E/PD9CQz9CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlo6KjpaampaWlpqmqqaalo6Slpqako6OioqOioZ+fn56enJycnJ2dnZydnp+goqGio6OjoaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZmJeXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+Pjs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWkpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5KUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTg9Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Kjo6SkpaampaSkoqGho6Ojo6Kjpaampqanp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PTs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqChoKSnp6alo6Kho6empqWjo6ampqamp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKio6WkpaWlpaWlpaSjpKOioqKhoKChoJ6fn5+fn56en6CfnJuamZeVlJSUk5GQkJGSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqcnZ6hpqampaSjoqKmp6emo6SmpqWlpqempqKdnJ+hn5eRkZCUl5udmJaXl5ibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjo6SlpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ2fnpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo4NjU4NDY3ODk9ODg7Ojs/Ozo7PDo6Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpeYl5eanqKioaKjpKSjo6ampaSmp6alpaWmpaWjoKChoaCZkpCPlpuanpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaCgn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpGQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqWlpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6fn6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WTlZmcmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODY4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZycnZyenp6foKGgn5+goKChoqOjpKSkpKKhoZ6cmpmXo7efmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZmJmWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpmXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Cfn6ChoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKChoKGhoKChoaKmoaKioqGgnpybm5uZoamWnJubmZyempaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkZKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQT09Ozo6Ozs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjw6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqWhnqChoqKioaClsq2goJ+fnpyZmZqanK5meJ2dnpuZmpyZl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5KQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCfppOYrJ+gn52bmpqamaqARIGfnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ+enZuampqbmpiZmZiXl5aVlJSTkZGQkJGSkpOTkpOTlJeZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD05ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzo5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm5+iop6bnJ2cnJydnqCfYZmon56cmpqbnKOhT0iEoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+goaCdnJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn56cmZuanJybmpqZlpaWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7QkM5PD8/Ozo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E8Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiXmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuap2pcoqCbmZmbnZyvckpMhqGcnJ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mYmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKWCU3eimZmanZugo19XToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bmpycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZaWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgilxgk5uam52co49lWk2Bop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+QjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZiZnpldXnWWmpydnaKBZVpNf6Ken56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpubm5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8OT0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnJydnJubm5ubnJqYmZmbYWJgfpWenJ6XdGNVT4Ginp+fnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiZmpiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmZidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk6PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp2dnZyam5ucm5ubmJmZn2ldW2N9nJyei2leUFOHn5uenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yQjpCLi4+PloiIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiqrG3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODo5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GGjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZm5qal5N2bmZWeZSYnYlbVFBZi5KOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojg7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4yRj4uMj5CRkY6TnZ+Sf6KlmKaddE9QZIeHgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjpAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CFopuMfGaSpZOce4iDY3SAgIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+gqOJeWxRc5yNi1hwe3x/fnyFjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc5Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZmZdVNLS3OThYJMXm9xd4mFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj04ODs6OTo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLgIKJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4OChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY6ji1AwLzt4hnZ1QEJbam6CkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz86PDg5NTg3NTc5NTo6Ojk8ODo8PTo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KnnGNDX0s8eHhpZkcxNldtcpCPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkM+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mqro5JeKp+QHx4ZWJRVmNKXm+KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dFPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKJ2Y8LUpUV9kIR4T22NeFZigKOop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBEQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqqmkp6eZnaSlo6KeY4G7wK58pKOal2xJXHtwUnSVo6KgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTtAQUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioKKnoaaupqacn2yDmLmLrNOjm7SsXE2vmlVlkKGeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+ro6OHd356c9HEsJmjrWxWp65mXYemoKWioZ2fopiVnpufn6ShnJWYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e1tbayrbCtj4eBbZLLvZWVppV0Vm13dXN/laaqp6Shn6ObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K4u7y8urrCubW0noZ2YVaetbump5mHeG1ycHh5en2EjJGWm6Gmp6ympZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW4wsjO0tDMyL2xo41wZVJEiJSFhYV9eHJvZmVraGtxc3FxcnR7i6nGxruip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYWZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PFx9vk49nJu66jlYZyWVpRRGZ3am50bmtlZVlYXVhcYmlqaGVha4+4wcC5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7M0NTKuaaakYRwXFFUS0RbZl5jamViYWhbVVlUV1laXFldeZ64uqu0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudnJydXJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS+w8HHy8m4lXRhVE9PU0g+X2xfX2VjYl9kYlRWV1ZUVVt5oq6wqqirrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5uMOfZktER0tEPVpkYmJqZGFcZF9YU1BQUlyHtrqsrqWko6ikoKClmam0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZ3J4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwbCKU0dNRTtLWl9mbGdfXGBZWlRPWYenrLi1sqypo6GtqaynrZ+stLS/w765uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dmVmampoXmtvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCx51xXEg/P0ReYmFrYltYV1NZgKG5v7u8urysraapu7q5t7+ztbiywca6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aGpqdG55bF5kW1VgWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnOxsbGwK96VU4vVlRXaGFSTlR6ssnIwsTHwLy+tLCwsMK+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsLCw8GVQ055g45WUHmtzdPFtr+/wL+6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVnZGxlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvrzHpnltgpGWcrTMyMfRwa+9vbi5u7u+t7Swub6zvL6xubW4vLa8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX16g3huZmFlYmFjZGRqY2dkW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8yc/Aur/AvLvFvbrAxL+9v65wYXyRiovRxb+/yb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKynpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCnoaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhY2Noa2dnamZqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz05NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdSMuL+7w7W6x7a1uLq8uLm2q6WYjXyEyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGhoqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVncGplbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/DdqjMvce3ubettrS3ubO1sb3JxZVIfMq+v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdxa3RmY25gXFVIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrXOAu8jPwsC4rrS0u723ubG9w8qNRHbNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXJmbGpudW95ZGhjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0Zhwc6zR0czKxLW6v8TIvr60v8DAd1Fvy8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1sdGxtb2BjX2JiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XRw7q+vMS+t7zAv8nPx8jKycGFcXOlzMzLzcrGwsPLzsG8uL26sG5jY7zIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWRcX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9vDvra+wL6+uqacqbK2w7+leHV4m8TGy8jBw8C/ycrBv7u5saB8cmuuyMXEv8DBv8vHw8DIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpJ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEt22tzr22ucC8rH1uaG5tcoGVmHN3fJe9v8bAucC8vsXEvb24sbCYj3yAm8rCw7y9v7/Dw7+/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cG9qXGBhWlRRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbJ2gbO9trXCpYdpWl5gTVJbWm5zd4GfuLjCurO7t7u9v7q7u66kmpeGkH7AxMO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGso6irqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d25yYV9mXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmnhXiKoK+1nWplZ1ZZYElJTVBTbHeGpbC3vrmytbK7uby2ub60lpullaBxrsnEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fqoh8dYygmGBUQ1hVR2FqVk9FSmGNoKyvtrq1tLKsvLm4tbjBvYuXr6GlcqXLwr+5urWupayzsKavraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXlNPTkI/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4vrSQgniIj29OSj9kWUJOd4CUak5BXYGwtbO1srSvrLu6uLa5v8V1gqidmWOpv7i1srGtrZ+kpqaco6WclpmZmp+prrmsq6ufpaikq66vp7Crr7GxrbGurq+5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211amxdXGtUXlxQTkhER01CR05HODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFOh1lKSlh3jYFjQVOjuLO0srCxrbC5uLa7t7q8j6GxqqNyrLCpq62ro6ignZ6dlpehlZGVl4+XnqiupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWh1dG9lVWFkV11ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKqZmZVpTUBSeHFQSUlLZ5yBWURSrruxrLOvrqyttraytLWuqKaempudnqaonqCoqZ+hp5aalpeNm5KMjpSMlpqjqKCfoaKhpqWco6OgnqWgpKylpqiloqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh4g3x2f3pjeG1uXVFpVVBPR1BNTUNQUkE/Oz40Ojo1Ozo9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Cq6W+aUVSnYJRV0lKYEtUjmFjYoGutaqytK6qq6+wsrOtpZ2Rl5OPl6CfoaCco6SfnqiUmZSVipSOio2VkZeboamenp+go6WonJ+goZyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOfnaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fIB1dn1ubHtkaVZSZE5JSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaCqxr/LoVBBc513UG5LTGNmdXNgWl5wkLGvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqklZ2alI2Pj4+Ql5aanqOpnaCgnqanq6KfoKefnZ+jpqieo6afqp2qraqup6iwpaOkpqespqKlopuZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJfIB+d3l8ZXl5YWJTVmFISUtMU1VKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfHjldTSmWjWmV+b3JdUWtjW2RfXGuPtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyWp6WhlZWWkZaWlJuZnaOkqJ+lo56nrq6qpqKxo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbWVcU1taTVFLT09WTVRNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpI16VWlydnVwY3Z2WFdjYGNnWVhXZ62urK+nn56ioJaQk5ugnJmXkpOfnKGjmp6amKNufZeZoJuinpyinKKmq62nq6ikrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpafm5uYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dmp3dV5tW1JhSVJWSEZWV0tDTUg9S0k4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCkgG6CcGBjWExbU1pNTFBYUkhNTUiYrKqppaCfmpKRlJiYlpaWjIiLjpSdnJ2cn5lIR4+fn6ajrqekrKCoq7WwtLCwrba4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwbe7tquusbm3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWln52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21oblxYXENXTkpHTUhDRk49Pkw+NDw6Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYlhV15lYFdNUUc+Pj9DQz8+QlF4qa2pqqagnp+io52fnpudm5STlZSenpiUhaZ2KmCSnqOrrrivr66vr7i8u7u4tbjDvr/Cv7a6u8DDub27rK6nsa2xwra4wsbAyMrAyr+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqqvo56sqLeyraOwpqGjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V8X15lYFFHRDxDPkU8Pzk2Tn6qs6eko6KgnqWspp+YnZWSmp6ZlYyKhoiGeGyLVzVmhXx5gJa8vLywucHDwsa/vsLGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Aw77HxsK4xMrJxMHHv7q0uru1u7ewtrKru7KvvLfAu7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV05FPklZfG9iQj1cjq6soJmbnJ6emZeXmJONj5eXlI+NkIyCg4J2cnBscGxUYGtwcm5zj67EvsHMzdDIxMjQzMzMx8rFxczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsfGysjPwMnRzcfGyMbCvcTBv7+/tb6zrb/Aw8PHxcjEr7+5sri9xMLBu7y8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nXlpaRE9NQ0ZRSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9Lhp6lmoSgsq2jnpyfmpiXlJOUl5GQkI2IhISJh4OAgYGAeXFxbmp7gGRYd3dybnJ/nb7PzdPKs9HQ0NHRzc3O0MTN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3J083O083GycrKwsfMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArrCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZVZYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnGNUTEpEQz9DUq7RvbKvppycnKCkoZ2alJSVlIp9eXFsZWJocnBye4WKgHVwbXByb4R7doB9dHJ1b3Sez9DTmbbX09HS1NTSz9HD0NPW2NXV0svJztDLxs3SytLV19nW2NPW2M3Sys/RzM/RzdPQwMnIy8TMzczPz8bHyLbAy8DSzczQx8rJwMTDyM/N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVyY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqJbSUBBREFGUXayr6aalJefnJqgoJ6bnZqViXdpZGFfX19fXl9fXWFsdXNwb25rcG9zg4B7gXltaWhebb7To3/S1tTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ19fY0tjS19nV1szPz8nN0szO0cDHxMnHz87R0dLIzM3Ay83G1M/Mz8nFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNFQ1NOPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ6lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZkM4PT5EWIKqqJ+XlZeZmpyfnZibnZN9cWVjYl9fYV9eYWBeYWBfYGVtcHBtamxvc3Z9cnmAcmJcU1mjrXKr2s/TzsvSzdXU0crPzNPW0tHWzc/V1dHF0dPK0NTV1s7T0djY2NfLyM7Eyc/NyszAycHJys7P0MzQzs7Mz9DIzNDRy87Lw8rIys3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRE1ZRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+ZpaegoKOnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksntIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5fX15cYm1ybm5wcXJxdnRvd3l0Y1tce3eI0dTJzM3EzcrS0s7GzszN1MvO0s3L19bQzNHUy8zQ0tPKztHV0tXWysDKwsbNw8jKw83ExsnLy8/Lzs3RztTMx8nQzcnHy8bHwsbKzM7R0cfQz87OzNDFx8G4ub3Dwr3DubKyvrC7w8S1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElRUUI7RD87Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3xlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFvcHFtaW1zcGhydGdmY113wsXHx8TEvcHFzs7HxcbNytHIy83NxtHSz83M1MrHys7Px8fP0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNy83QycXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxcXIu8fDycnCz8G9vL+wwcnHub2qsbKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVVHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ojo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KFoqqTjY2Wj4WDg4OBfYSEfnNfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG1taGdpanVqY2JeYmVdqMa4v8G5ubi4vcjFwcPAw8fKyMjJyMHFzMbIys3JxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbGvL/Kw8XH0sXBycDKysbIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdDR0RMREZTPzU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bF55fJ+RipKWhnqAhIV/dXh1cnBfWltdYGBiY2RkZWRgW1xeXV5dYFtZWlxhbnFtaWZna2lud1xYVl1haarBrbW4sLCxr6/Burq7urjAwcHEvr25vcC5xMrFxsK9xsC3u8PIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMyLLHycPOzMDFw7+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRUJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys/FycXHwbrFvayupmBjdoGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXWdyb2tkY2lqa3dyT1FXYnGatKuurqSnq6mktbK1s7KztLu1vbG3sLWvsrvCu8HEvL+6tLK6vsC4yLi0vLbAwr24vcfBw7u1r7O1u7+0xbi7tay5vb7AvbG7trC3urPGvbevvL+1t7XFvb7DxsDExsbHzMW/xsa7x8u/z8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TFy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJlbZ2+Ij4aIiXp4foWGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXlxdXlpbW11fa29sZmNmaGhse2VJXHWHlKioqKObn6ekm6ipsKypq6mzrbWwsqitp6yzu7q2w7m6ubCqtLm7s8K5r8Cxvby7tbvHucO3raqosLLAtri9sLGosrO1u7yrrranrrauvLKxqriwrruuu7i7wMG+usO/xsPFwLzGwcfKuMXHxb/Hw8O5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzCurO1tcOuqrCSW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXGNtbWZkZGRmaG15ZG2EkJOboqWumpuhnZaZoqiso6ehq6mrq7Cjpp+prbW2sb24r7evqK24tLO8t7O9sLi5tbK8wbLAr6Wpo6uxs7OovaqrqKusrrW0pqmuoaWvqbOmqKiupqi3rLGzt7q7u7K8vr6+xL+1wcDHyLe/v8W3xcPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8LLvrvJtr3DvrrKt8HEwbS2vLaxr7W8ramrk2RtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZWpkYmNhZGRobXl5gIeGk5iRla2moJiUjp6gp6Kin6SkpqWtn5ybo6WssrC2t6ewrKiqtKuzubC2tq62urOwurqxtqSgpKCmsaisqbmqpaenqKezraCnp5+cpKasn5+npKGhsa2trLK1s7Swtby2u8HAsru+w8GxubnCs8C9wLW4vL2+vMLHxMPEv8DEoIR5cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhaXV5jYmBjY2NiZWZseXNxalhbb0V7oJ+Ukomanp+lm56eoqSip52bopueqq6ssbWkqKqprKyktList7Css7Wvs7WvsKqfnp+korKlpqq4raKmpp+orauZn6CemZ2fpZqZo5ycnrCprKiqq6ytsLO5r7i5urC2vLu6q7OyubO9tLeysba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uci4uL+3ssK0sbu7rLm6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dXWFdaXWFiY2NiYmNkZXBqWEEiOnFoaYeckpKMl56epp2am6OloaSbn6CZmK6tra+yoKSiraunobWwsbKsqbCzqLqzp7ahop+co6Gto6Kqtquio6aepqajlpmdl5manZ+al52cnZytoayoo6Smrauzs6q1sLKrsrm0r6qvsrKzt7Ouqa2usriwura6vb+3s7GUhnp2Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMLMyMbAxbbBwMfOt8DDvbO5ubK/trG5u62yta+fmqOqoZSaj3h/g4R/eG9xdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXVlZYV1hXVVdgYmNhYWJgYGRmckQZHEiKlJCOmZGUjpOcmp6blZ+fp6Kdnaebmpqrp6+wqpyjo7epoaCuqLWqp6eusaS4sKS3oKOcmZmqpqGarbmwo6GknKKgoJOVoZSWlpyZmJaXnJWfqZ6qpKKeo6qqsa2otKyqp62zsKWrrrOxr7Cvr6eoqLKusrSwvLS6uK6jlIJ6d2VfYVdZWFNSVEtNXkxQTEdITUxFPUA+PUI8Ojc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rZ2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1ZVWmJiYGBhX19gYmpfJTduh4uOjpSSlpCRmJyZnZSenaWkoqWmnpyfpqCrr6afoaO2p6GhoqmzoqWopbCmsa6rtZ+hnZaVqaGilK2xsZ+jo56emJyTjKCUkZOYmJKXmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqa6vr6uoqqqzpqarr7Sxrry2sa+vn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk5PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLuxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVVRWVlJUUlRfX11eX1xdXWBhbFdch4OJh42LjZWOkJOgl56Vmp6joKuko6OipKKcqqukmp6lsaqhoZ6lqp6oop+trKqprq2ioqKVmKKanJCrqbCcn6Kfn5eZk4qdkY2SlJaQmJiTnKGjnKWhopWgoqSlm6OrpaKkqqSrraWusqmmpaamtaaqqK2ztbS5uq+qrJ6Mc3FwYFtXVlZSR1FPSFpcT1JKVEtTTEVHSkM4Ozs9PDk2NjY6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm8sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU05QWV1bW1xcXF1cX2Jrg4l9in+IiIeSjI+OmJigmZmfpqeqp6unqaWimKSupJWYpK+poJyZm6CfrpmcqrOfpqafo6OhlZSblpaSqamtm5yfoaGblJCMmI2MkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrilo6SjrK2qqKuvtLeyvbWzq66YhXV0aVtZWVNVUkZYTFFbWE1VT1BMUVJJT0lCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7euqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2hmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FYWVlZXFtaW11eZHqEeoN3hIiDi4eRjJOWnp2Ynqmopa2rqbCjp5merKCUlKOop52YkI+anq6WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6el46Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9p5+jrLSqrqevtLC5tcCxrrCrkX5ydGNWVFVOUUpHVlBSUkxMWE5LTE9TR05LQUNGRUM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxt7i8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRSTU5NUldYWVhYV1pbW2Bpd3B2bX+Ff4iCkYaQkJSYlpummZ6ppqWrnaaYnqWbko6eopqXl4aFkpukj5WinJaWlYeimpuTjI6KkJqlp5yVlZeckZOIlI6LgYyNgJCLkpKSoZqgopaUmZiVoqaajZmkp6mnoaC0sqizuKGdo7asqq6ksrKmtbu1q6yxoop6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUhNSkFITElIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLDtbWys8bFt7rDyszGs626vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0tTV1dWV1dXVlpdYWxpbWd7f3qBeoyAioaRjZCbn42Ym6Oho5iklqGblI2HmZqMc42Dfo6XloaSmpCUjo17mY+djIKJgIqYoKOekJOYloWOgpR+fnSKjnqQiJOQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLG8qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU05JSkpFS01HS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY2Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLi5wM7GvrOsusGsrcStqKKmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpHTlNTU1RUU1VYW11pZGdkdXx0bUtVbox/k4OKmpWJkpCemJ2VlJaTjZWJgJSJXztWb3yMlIqAjJKMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFwho19iYGQjpCXmpmTi5CKnYifmIeIlp6aoaCXp66prampnpats6KlrZmtq5iotKOpraOTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS1BKSU5QR0pKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKapp6OqsKintMG5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFMT1JUVVhZYGlkXnF5bEw/PX2Tj416hZKKg4iLmo2WlImRhoSThXmJf2BKUW54i5KEfoSMi4R/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiJSFm42ChZKblp6dlKSiqKmlpJ6bsKqhpKSRpqqWoqqcoaaninduZl5cSFFRU01JVU1SSUxLT0lIRkpOTE1VS1FSUEdKRD03Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+sqra8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/iZSplpWLf46Dgn54cW9YTUtNTU5LTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNUVVptfWptdmNjWFKOhpKFcXyEfnqDi5KBkpmLjnqFj391f3hzb3VwdI6OgXp+iquFentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWKiIqNi4B/hIuNgJSEfIGPmJSclpGfnameoKGdoKmln52Yjaejk6Cflp6fpIFzaWJdXUpXUFJIS1hST0pNTFJKSkpMUEhMUU1SVU1GSUI9Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5NDc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6RfneGd3x3cG9qWUtISUhHRUhIUFRUVFdXU1RVVVVWV1hXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXnN+dnJhcYmUl42NeWR3fnR2fYePfIOYkX9who97dntva36tfHSQi396hpKAfH90ZnV8hmxvaHN8io2HgG15cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdm52eoZyWjYulmo6dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUk9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzUxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rqKmxr7GrvLiru764s6ynm7CnrJuPlpylqaWhmJqOhJJ5iY+Li3ZxfG11cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhdZW9vZ4OlqcB9cXZgeXZseXeGj3l7i4Vua4uSeHN4aWqAgnGWkYyBfZV/SZKZbmd3foJtamRseYWQkoZrcmx8bnJ8hmltcH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6LipODlpeYmpCTlpaZl52WjIOJn5KLko2GkJeAcGpvb29ZVlhUUlJZT1JVVFJYVU1OSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+krK+iraqota+urLS/q7zDv6aimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ1b3RscG1la2tZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFYW16lhmGYZW91Ynxta314iYd1gYeFc2uZkXRzfGlqnY5MeYWTiYSOZjF2h3JrfX2DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3t0fn1xcW91bYN/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzM1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo6VmYuOhXqEkJiVjZCMkIdxh4J0iIyGenBzcW9wZHBnX1RGSUM+PDs5Oj9AQURDRUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUxCSVFJYq6ynm53dGl6am+Af4OAeYOFhXlyoJR0eIBzdJSHNXCdqJ2PoaGEooV2cIZ7hnx0jK6NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHNycW1gXF1eXFpZYV9STltaWFdMSEpGSUc/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMTEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlo+MlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt1eHhsd253ZGpeSVBHPT83NDQ4Ozo7PT5AQkVITExMTE5QUVNUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw4RE5SU0RKhHN8eXlze2p0hYZ6fIOCfot9daGZeX6FgISZhJqcYYaqn52Kg5COeneIfomIjnOLl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1FUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2eppGgqqCxqK/AsrvEupaOkZOHeoZ2a3+LkYN9ioOOjHiDgHOhhIp9fYF/cIF+emh3a1JYTEBFMjExMzc2Njg4Ojw+QUVGRkdKS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9RTEtUXFhSS2eBhXiGd3lveo2JeHuHhX6Wh3agmYeGjpKUpY2sqUiGrrCui4GAlIuCi4KEkqmHgJiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9g4h/h4WLeZScm4mLiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdmXFVQUFdZUERMS0ZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5COlZeSlqCdrKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIgIKIhXiHiX5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzk0Ll2WcHOjVUZJS01NUFdgWG9ZW11niY+DkX6Bf4OPj3yEh4+AmZSBn6CXlJuapq2Tmbuxp7vHw6iLjKGljpOJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4iAe3aEfG11dWZ/lI6GiIiHiIegqqKWiY6Xf3qBiHl5b2dreH58gHVsZV5bW15qXmJnYFpPTE5YUlFJUEpETkdDSkRDQUREQjw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneCen+Mf4GQjoqam6Sdoaymqq6wl5GRhKGUhHh3f4yUfH6ShpKVf4qAkpuOhICBjIqCiY2Df4p/bHBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlRSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISkxMS05WX2J+ZmZrcpiWi5eQkIiLjJeGkY6cip+fkaKppKOrk6m2oqjBwq3Hr3i6lJp8jaGemYSThYKOoZ+UmZGFioWPmZGWbHB1ioyClYyNjnePhHFthYGKlpGChYhxiKCWhpGJjY+WpLSom4yUooOHkoN9f2tqanyCg4N1Y19lYFtobF5sbF5XS0hOUlFNTExGSVBDRE5GQkNFRkM9Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIOAgIuMiYaQh4SJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDg1Mjw/UjVISEhMTE1OUl5tiXtyf3ubmZekop+XnpSgk5udp52nqp6nq6mqtZerv6u2x8i3yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaKbm3h6fpSYk6KSl5eBlJ57d5WSqrKIjJeffJSdm42RlZijoaW1r5yQmKeHlo+NgIhsc3N9gX5zamFeYmBiaGRgaGdcUkVKS1BPSUlMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjox8ioaPkI6BgoCJi4qFkoWDhomBgId3XmJQNDYwLTEvLC4wLy4vLi4wMDE1PkFBTVFSU1FSU1VSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUpOT1FZbISOdpKInqKmsbu2oqyqq6ans6qvtbGxrbqxs72bssOrusnLt8O/uKWisLOsraqji5aYhKWmoKOXgaaZjaKrqKWIhZSkoaCroaSoj5yxi5Wjpre6m6Cir5KjnaKdj6Ohq66rsrShlKSpiJmIkomVeXp+hoFpYmldZmNfZWReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2luWHqEdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GOg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8Mi8xMTAtLCstMC4tND9DQU1VUFJTVVVWVU5bUEdHRDw+PkZIQ0VBODs8NUM7PUZLSUdIUU9RV4CRnoOroa+nrr7FwaixxLWrsr+yt721vrTBtru6o7jFqLXIx7W9ubSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqywtaKxrLG1u7a0rrSgp6ijp5qpr6yxuLe4ppq1qIykjpCSn4Z4goV4W2NlV2djYmRhYWdgW1RKRERMVVFISUpESUdFQUBAS0RCTUc8OTY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiYld5dXCBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIyTjIeEgY5/gYmPhn+GiIaKh5B6eG5dVkBFTjw2OjQ1QUI3NjQvLzZDSEJRW09RVVdVXFdQX1VJS0pBPz5HS0ZGRDs+QDdENz9CSkpFRlZUUF6Oo6yisLG/srW+yse1usS9srPAtrfBtL6wt3Sxs6a6xKSwxrmwsrG0qKS1tqqxoKKXm6KSpbCupq2rp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwbe6t762ure5rKyxpbCprb2wvLrBwauYuaeUrY6Xl6mIfoN+bVhkYllsZmtmWFxjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpvfo6DgI6EbnpzeIdiuaGZo4mUlJaSlJONj5aRh4Z7hoGNlYqAhIGKenyKh4Z8ioKBi4OVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUlhYWmdZVGBfTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWVRdkq22s7m2x7y4u8nMurvAu7e1u7q2vbO5scVgdbKksZqeqr2ppairqqSisrWgq6iflZafmaCupaempZ+jk6OnsbSosrO9tsG+08nJ08bDxczCysPAvby+u7y3tK+4t7bDucW9wsevnripoauNpKe1iIGBdGFjY19ZY2BqZ1NYYFZSVUlFRU5LQD5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VBSU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoN/gnh7i4OHe4t5gYqCl350fXprZnB1WV5cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhIQkk6RD9IS1NUVVxaW5K3vre8tcS+ubjJyrq2ubW3ubK3tLOutbaYZHWnnK1wXqKsnJigopuknqqllJ+fkJOOlpmYqJ+moJ6amYOknqylqrCtuLC9udTRz9fQyszSzM/Oysa/vsLKvcG8wcDExMXKvsfNsqO6sLSumqu4u5iAfG1fYl5aX2NaZGNRW2BTUEtDQUVGRTxART5BSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaF9vlpKQlG5sb3R1h7SsoaGfi5mcmYyNlZGakYWKin6IhoyQi4h8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqamlgZmlpbFptc5atpLyIhmdbb2ddWlpUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWGWtcWwuLK6u7OwxMa1r7iwsLursrGmqrerjLWnnZqnmk6ZnYyOn5aRppillYqTk4mQiY+RkZ2boZealZaHnpqnm6yvqLCotLTU1NTW08zQ09XN0s/MxMLJ0L7JycrJ0cfMzcLP0bevw7zDuaS1ucGihHFlXl9fWmJZWmdaUV1YT1BCQkhFQkg7QUM+QUc/P0E3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJncW95eYOhqp6ml4yam5eLjZWRmo59iYuEjYqKipCHfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem14c21pgXBtY2ltcHhpd3x+y7/B36dtY3huY1tiYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlqy3q7Omr7Wpq7u/sKq0paS4pquuoKu0o46wrZqXmIyQk5GEjpuBjaaRnImDi4SKiYSLhJSVmJeUm5Gcl5man5+rrKWooqytz9LV0s7M09TUz9TRzsfD1NHHzdLT09fM0dHE0tbFwc7Hx8KovbfOnnxxaGBlX1hiU19bUFFUUU9IPkBGQUJFPEBBPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnWGhYp3bHdwfX5/oZ6eoYyMmJOTi4ySj5WFeYWPkI2KioiQhn6Ce3J+gICHeoR1hZOQiH9vdnJrc317d3tzgnhya4BzcmlvcXp5cXq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hcXWBjXWN3en2LgZippKShn6CnpaqvuKqlsqGhraGjraGnsZ+IppqTkpGJkY6IgZOJapSijJmEgYZ+kYODk5eti5WNlZmOhpKRnpeosKKhoaWkqcnNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy411cWViYVpWWlVcUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHN4coKJgJ2VnZSFi5WJjomIjYaOf3iDk5iKjIeHi4h+gndze32Ch3d/eoaRlX+DbndwbXV/dXh9dIV8eWyHdnRufXaEdHh7nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhugIKHkYucnaCdkJeYnqOjpbGjo7GeoaWdoKigo7GchZ6SkZGPi42LhoOPhH+cm4yNgoSFeZR/gqmVo4yRiZeSi36Yi5qSq7OYm5yonKe+w8a5tsbO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBnX1xUV1JdV0ZHSklFRT06NzpAQEI6RkQ/RENBREI7Pzs7N0RDNzU2NTU7MDY3OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhImBh3x4hZaWiI6Ch4WHeoR4cXp7g4V1eYWOjZx5i3B8b296f3F7gHGDh4Bujnp1d318gnR+fIaHr3NYqcK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeouGjZORmpWflYeMk5qgmp6pn6Csm6GamJ+lnp+rmYuai5CSjYV9iIeDhYuOoJmTiIOHfmyZeoSYhoiTjI2UjIZ8nImUkK6qlJaYn5mnr7a9qa2+x8zJyczL0MnD0srU19nX2NfV29fT2dvV0Nra0dbI1MuWe31ral1cUVRVYElDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODdEQjc1NTQ3OS41NjY0MzU1NDIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgoGDfoN7fISYjYeLfoWGgHeCeW57e4aBdHmSno6gdo51gnN1gX1zgIRvgZCCb5KEdXyBhXp2hnuJt8Wkwcm4gZabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJSOl5GDiY+WmpaWpZyXn5aekpGXop2Zq5WQkIqMkYKMhYiIgYaQkZ6bmYiGjIGFl3qIiZ+XkIiNiouCfaGJkYy8oZiTmJmdqaamrp+otr/AwbnHys7Oxc3J0dbV1dnV19vU1tna29fb2tnYztvGiH17aWtnYVVZVldOTEVOQzs9PTw4Ojs9OT1ANj0/QDw/PTw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7foB+f3yEen2CkYmEhXqEh3t1fXRtfH2GfnR/kp6RnoORe4Z+eI9+eIqKboKagHSZhn6BiYR7fpB6j6mOj8OhvYucpJ19iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYiKkJOUjpyZkpSQlo2MlZ+clKCUkY2Nj4t+kI6OioSJkpaanp+JjJSSnZGCi4ClmYiEjYKFhIGlhoqMuJidkZWWoqihnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuXt7em5raFliXVRQT0lETEI8PD45OTo6OTk7PTY/Pj48PTk6OzszN0Q/NzM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5c3pzbYB+hH53hZuim52Ukn+MiH+Yh4Cbkm6IqIV6oIt8kY2DiIScfZqQioyjoqCQpK+fi5CLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlYyHiIySkouUlJOOi4+Kh5aanI+UlpCKkZOGgIuIko2KipyWmKKihpOdlqCKiYiNm5CDiI6Ag4eGpIWMkbOYnZKUl6GhnpqSnJ6osritpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aByf3dqaF9eWVVZWUNBSUM/Pj46NDk6Ozc6OzozOzs/PT43Ozk6MDpHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNiem1hfpKDb213i3h5f3qBfIV7e3aFhH9zcIWCenV3dnSEgoR+f5KmpJ+lopeKnZCUl4uKqJdzirGNhKeShJmThZmMopWfmJOImp6jkqmwn5CUkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNyJaPhoeIkJKNjZKTiYWKiYWWmZqPj5SThpSXg3+Pi5mIjZCqlpejo4iZnpaaiI6GlpeJhI6MgX+Hj6SIjpOompeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTS2s6EdYJrZmBgX1BLVlxCQkdDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfoh4en56gYGCfnZ2gIJ7bG6Lfnl8d3h8hIaKfoujtKikqrOhlqegpaSWla+ig5C4lZKzmo2hoIykm6+ipJ2YkKeXqZmtsKSXlJWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcmIWIiI6UjIqTj4eAhoeIk5iUjIqTk4aUmIaEkZCcdJCYspWWpKGInJmTj4qQipaaiYqWjYZ9jJifipCQnJqZk5mYoJShnZWfm6GxraOkt76zxcfEvcPDv8bOysnSp87M09HQ1tjSz9i8dXx4X2JXYlhSSUtPRUJDRDU+Ozc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj8/Nzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OklFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXFxZSmhhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9zjXp9gXt4houJhoSSqLytqbK9sKWus7Opo6KwrYqatZ2iuKWVraSXqa23pqSjn5mpmKqkr7GqmpmclJWRmKCXmru7rcqhaba3qrCVmJ6iq5KXvaReqrKCiYqMlIeQfI6OfYOGjpCUlIiHkpaLj5WNi4yXmZKcmbSWlauei5yUko2QkouYmoqSnY+LiZagoo2VjZeZnZOcmJ6UoaCUnJ2mrqiipLO4q8LIxLa6vbzFyMjC0KHGyc3NxNfW0MrTo3N9a19bVWFTUUdEPjxDQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQUVANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicEpAi4l/gHKGh3yBiXWCioN+bX18fH5wd4d3jYGHe42QjIaMmqvCwLC9xryztMG8tKyrs7aMqLKtrb2rm7ujqK25uKumpqKipKOqr7Kxqp2cpJibmJieoqalk6O5r6i/vKytsrmlo6d9iIacrb2wgouLipCDj4ORjnqBh5CNjpyIiI+XjYqUl5SQmpacp5qwmpGrnY6aj5KOlpGPlZeOkaCQiJSbpKyUlo+UnJ6UoZ6bmKCglZqep6ekoqSws6bAxsOwsLu2xcXDv82nx8PHw7zV0MzEyop2dmRfXGJdT0xDTEBFRz5BP0I8OjQ+QT09NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFSkhOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1tdXJOMjIh7h4uGg4x1hpCKgW5+e4F+cX6BepR6kpSUmJGTlai0x8nAwszCw7nHvLqvq7m7l7K2urLAr6XAo6uwvLyqrqujop6nrK+1samboKqcopyWn7C0p4yjurq1wburqJyypKSolISOqcTEpIKLjoaIhIaVlIx6g4yRj5GhjIyUkY+Il6CYk5mUlqWgrpyMqpyOlo+SkZWVjZCUkY+hk4aXn6Cyn5SblKChmaSgmqCboJSYnqekpqekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnHwbV3e29eW15sVE5JRE1LS0pAQT1CRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qajZaKi4iSj4aJeYaTkIFygHuMf3eHgoKPeY2hlqiampi7vsnIysLSycrCzb3Bs628v6e6v728xLitwamss7y9qrCqpKWjrK60rra1oJ+un6aimaO0vamcqLzBo7a2r6uTsKyqrJaGmqqnpZGCjJKklYmAdYmReYWNkZCen5KPlIuPjJSjmZeblJOinqmfkaWajI+PkJWWiHyOlZKSo5qVoKKctaaQoJelpKOln56mmJ6Vl5ylo6ioorKsqLvAxK+ls7fMwLquw7O7vcG5rcLCwr+ZcHtjW1leXU1NTktHRENIQkFBREs6NERIOjs0PDdGLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGVYno+djpeOnpKJin+In5KEeIV/lH5/kIiJkICWoZqup6OYw77JxMjG083Ozcu8wrewur20vcu7w8G2t7yttMC5vK6vqKGpqLaurqmyt5qerKKoop2rt7eqpa++xLG9ubOnqrSzra2WlaWtqKCRjpKxxaeVjX2RlX2HkZiPqpmXk5OOk5WTpZ2TnZmToKKhnJifmIuMj5CeiFqQlpeSlqSZZpmjnrOllqKWrK2sp5yfp5eYlpiWoaOopp+1q6m6u8O0prS1y8G4qrass7u4rqi4ury3hG9wXFpWV1BHTFROSz9BSERESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmRNRqaUnJahl6iWjJCDh6WSiIGHgpuDg5WQkJSOmqKfr76uoce+xsXIx87Oz9LKvru2sbu7vL/PtcS9t7m3s7K2s7izrKecq6u5q6mor6+Xo66lqKSltcGwq620vsK5wLmzp7i0t7KvlaStsK+li5OUoI1zwZl9l5mEjpaZi7GVmpmVkpKZmaWjlZ+blpqonJuhoJmKjI+WnWBKlpyalZmll1SWsJ+vnJ+lla+vraaboaaUk5mZjp2fpqGZtKmqs7y8u6uwssfAuKasq62xsaOhsrK0pXNxZ15cUFNNRlFRUFE7SEtIRkdBQz05S1Q/QTo9RU0vNzUzNDpCMzROV048SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTdGJWRkirl5mfoaiumJCXh4qnlo2IkoWfh4Scl46eoJqjpLXJtKnHvMPEycvJyMzOxr66s6+6uMDBzbXIusG5tbqyr6+ztKeknKq0tauqp62smaSupqWprLrAqKu3t77BwL63srLDsLe9rKOuta26poibl6Wadb6fhJidjpKYmouulqGcm5eUmp+gqZ6noJmaqpmhp56XkI2RnYNtdZOimpWcop+QrbKiq5Wpqpiqr6aloaWqk5KZnImVnKKelrCnqaq6t76zsq6+ubago6eopaacnK2pqY1maGNgU01NR0lPSlVMPU1FTUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJScoZ+7rpiUnouTqpuRkZOIqoyGoZ6Mo6yUo6S2x720wrvDwsjJxcLOyMK9ubKvubXAw8q2xrHBvLW7rKmtrLCjo5mqtLumqqesqp2or6ikq6u+vKitvLS3vsa8trW4wLC9v7Optbesv6WPopeQoZ+8nomaoJmXnZ2Pt5+pnKWjmpyhmqeks6GbnaWcp6mdmJSPlJuLlomMpKKUnKOfoLWwpaaTsauaq62fn6WkqpKWlaCEkJ6fnJappKGhtLW6tq2otbKynpyippqXlZmroZ54Y19hX0xJRkhOUUlORUZHQlFKSEBER0FWU0RIPEFHUTE7Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6fw6ybl6SXmaiblZqajqqWlaimla2smaKrt8XCvL+3wcLAyMS/zca7vrmysLm0vsPItb+wvLa6t6ekq6utoaGbq6rEoqWorKaeq6+soqqovrimrb6wt7fGt7S4uL6xvsC2tLK1r76jlqOVk5qTrZ+QoaGkoqOekL6kqZ2prJ2doZumn72imKOeoqmroJ2VjZWek56HjoSNk56koJ22rKaclrKmmbCooJyrn6GNmpWfhI6hmpySpaSamKuxtbGqpaqtrJuYoKGSjpCWqZ+UaWVcYl5QSkhLT0xIRURJQD1PSEA7RklIW1JPSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE6jm6ObnsWroJ6rnZytn5Ginpakn6aqq5e2saOps7bFwr3AtsDCvMnCv8rItri1tLG0tLfCxre+sbi0uragp6yqq56en6WkwaWhqq2gpKmtsKKnqL21pbG7t7a1w7Kyt7q+ssPAuLittLS1o52klJGToKyfmKGdqKiqoprCrKidrK2bm56YpqC9oZ2kmKurrKahmY2an5KeiI5Yf5afpqGguaqnlJi2o56zoqGcsZigj5qVnoKPoJeWjqKjlZClrrOrqaKipaSVlZyZi4+Sk6SfiWNnXGVhTUpLS09GRUFHSz49SUE5OUpKTl1RUUk9TFZcOEZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQn6CgmJ7Dp6Sis6CcsqeSqqOfo56tqaydu7GprLWxyMPBw7PCw77HxL3Eyr2wsbausbWwwMW1urGwuratmqmwqambnqahp8KtnK2xnKqirrGqpKi9t6a2u72vt8Ots7PCv7LGs7q3q7S2raqippWVlKKroZ+fmaerr6+vu7Kln6mpmZmXk6KkuKCho5Kur6ukpZ6RoZ6UnY6QjZSdmqOfqLWnp42YtJyjr5ugnLCRoZSYlZuAkqKWj46goJOLpqywpaeinaCekpKalIWLko2cn4BkaF1oZktKTEtTQUNASUc7O0Y+ODlOTVVfUlNKPk9eXT1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9nckA4PEiWd2VBNJ+kn5ugwqejqbGgo7SplbGrpqKksqytqbuyrbC1tMa/xMS2v8S+ysW2wMnCtay1qbC5rMDEtLevrba6pZmrsqyqmKGnmK27tJyosJutn661sqequ7OnubO4srjAqreyw720xae+rq23tamnrKGWlpGlpKGhl5ekrretsbS2n5+ppJmTlJOjoLejpKWVrrGxpamloZ6bmZqVl6ign5min6+zo6aMl6+apauXm5+nk52PlZmahpaglYyQnZ6Ui6mpqqKnoZqeloyPmZCBhpWIlZ96ZWpdbGtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUFXYFxCSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWlWQ1dGjHlmQzukpJyhpb+mqK6uoKm1qp23r6ujqrS2sbC4t7C3uLfEvcPHvbzDwsfBusHGwbqqtqWtu63Bw7e3qq2yvKOVrbGtspemqJGquaqhp7Cdq6CvtLOqqre1rLuss7K5t6y4sMG6vb+mw6qwtq6pq6umnZiYqqGhoJGXoLCvs6uwuZmbqZ+ZlpKXpqC3qaWioq+xs6uxp6ugnKCfm56lnaGYnaS0sJyfkJOmmqGpm5ajoZiai5aZlJaXnZSJkpuZlI6pqaego5yZm5OHj5mLfoyXho+bbGltYm5uWFFRWlRBQ0RVQDs7SEA3OlhQZF5QV1dEWV5eTkxTTl9MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOGx9aFxWOol7Y0M9qJ+coam8oKqvqqOxt6mltLKroa21va+zuLy7vbe2wMK/ycS5xMPAwLnFvcG4r7aoq7eyvL+/tKqusrifl6ytqK6YqKmOp7ufpa2znquisbCzrKq2s7W8rbCxtaywtbLAusW2q7yvsbesraqjsaWepKieo5aPmJ+yqrOpqrOZnaebmpSNoKaktK6noaysrbGns6uxqaObnqiknpWhmZyotqmYmpKRnpmeoZ+SraCamoeXmYydmp2Ui4+Xl5qXp6ajoJ6XlpaUgZCVhXuPk4OMl2dtcmhxc2BHWWZWRENNWERaOUhCNT5dUWhcTlpdR1teXU9NU1hkSktDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKWZn6SrtqOrqKWurbWprrO4pqewt8a2sLe/wcK2tLrFvszFucPBusC6xLjBurO1rKq6uLu6vrWrr7G3mZioq6usnK6rj6u+nquvsaOqn7Gts66utrG4tqqtrrGntbCzurzJsqq1tbG0sK6moLOgmqisoKSVlZqZsaKtoKWvlqKkmpmSjKKlp7KpoaaxrKq1pK6wtK+jmZ2tp5uXnpqZrLiil5ORj5icoZmYla6hn5aClZmOnpyal5GLlJOemaWjo6GZl5OSlnuMkYV7jYuDjJNsbnlvdn1iRmBqWklIWls9e0pHRTZBYlVpW01cYUpcXFpSU1NiYUxLRWBhYFBNSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1lUTEWalp+wqLGprKSjrq21qLezt6OstLfJurS7u8C+tLO3w8DMx7vEvbe/wMC4wL2yva6ourm4t8K3rK6yupaXp6+sqKSzqZSvu6SssrKmp6OytLGysbWwt7KprquyprivtbPExbaptbWrsK6pp6K2np+msKCjlJuZlLCep5ufqY2pop2blZelpaS3p6Kws6unsaetr7WspJmgrKicnJ2clKq5nJWPj4yYnaOYkZiopKCYhZOXkZ2cmJeWiJePl5uonaWhkpaSkJZ3hJGGfIaChI2NbnF4dnyAXExlbFxKT2RdP2J7R0k4R2dXZltMXmJMWVlXVVhVaV1PUEhhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGcyNydGYUxWJS1CLj1FTFE8M3JrTEVEkZmkraSsraqmo7Cysqq3sLWfq7W5ybiuwbzDt7OxtcLDz8TAwr61vsHAu7+8tMSoqrmxtrfAvK+stLSeoaexrqWmsaWesrWsqrKxq6iotbqstbK1q7OsqquorKm5rbKwx7+4pbmwqa2tpqetsKWko66jqJudm5qvmaKioqOQrJ+joJ+hqaaluKSrtLSkqquorK62rqKdo6irnKCZm5KktZqPiY6IkaOhlo+Wn6KWlYaQlZSem5mWlYeYkpWZp5ygoI2Tko6ReH6OhH19fYeKinJ0c39+flxTY25eTlpnXUZElltHOk5tWGJaTWFiTlZWVldVWWheUVNNY1pbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RkOzYqSGRISis6ST8zQ0lTLD6PbEBISZCaqKmhqa+kp6OztLC0tLCwoKutvcy6rsG8x7G0rbPBw9HExr/Bsr7Dwry/uL3FqK23rLS4vMCxrLKuoaOnrqqopbGjqrCqrquxrq6sq7O7p7ewsqmyqaqmpaOtuq2rsMK5tKy5qamoramnsaWppKKuqqihnpujrJWlnZiemaudoaeooaymo62strCxoKmin6qtsKudnqenqZqjmJmQoKiYhoOPi4ufoJCMjpeekpGIiJKWoZ2WmZaGl5OUl6Wcnp2MkpCOin9/iIR9d4CHhYd1dHKJd2xfWWBuY1FzcVxLO4R8Rj9XdVhgWU9jXE1VVlVXUVxiX1NPT2hZV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTM5NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLkpnREY4PEIwNUVLWDFAlF1ATkaVlqynoKmxm6iosLWsuLWtqaSrqr3JvLG+uMOvsKyzw8TOzsO/wLTAxMS6wbXJxKyvt66zusC+tK6urKaoqrGppqmyprStqq+trbGusq20u6W4s6ysraeroKOesLesqq25tqS1taSqp6ysqq2gqKansbGkpqWhoauWqqGTm6ClnqOjqqOsop6msbasrKKlo5qpq62pnaGlpKSZoJmWj5idk4GCkImFnaCNi5CNm5CSjYWOmaWbk5GbjJOSkpSjmpyai4+LjHyHgYKCe3WBhIF+dXeLo4d4al5gbmZXZodkTkBnkkxFYnpXYlhSZVVNVlZVVE9cXWFWTE9qV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOzo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIdCSUlElpCupKGpr5ipqK21qrWwqqSrqqm8wMC5ubS8taayr8PJy9G/wbu5wMDCusG6wsSusbWytLzBvrOxr62srKe3qqWtsKu4rqiwr66xq7WqtrWntbesrKSpqpyknrOzqaiks7Sfta2hqqirqKunn6urqLm2qaqqqaGpn62bkaqhnaCjo6aiqp6cprSup6WpoqSXpKanqpyipKOgmZifkY6PmY1+h4yHhZ6eiYWMi5CPko6FiJejmo6Nm5GSkI+Sn5iZl42LhIB0h4F/fnh1g4B6eH5/iJ2PcHFmZ3F4XGF0iGpPXZhWSG15VWRWUmJPTFVVVVFPWFtiVklRalRWVEdQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UyMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyQGY9Tlg/Qyw/TFRfL0lrN1JGO5WNr6ClqayZqqOtrrK0r6qkr6mou7+8wbKwua2itq/Ix8jRwL+9urzDvrvEwcC/r7Kzs7a9vMGysrSrtKmltqmlrbOyuK+irbWxr7G5q7muqq63q6qeqqugo6G1ramhn66yobSqnqinq6OqoaGsrai9rquuraGnqJ+smY+woZiioKinnqebmKmwqaKfrKKhkqGio6eYmqmmmJiZnY+Lh5WIfI2GhIWkloaDg4yHkJCShYeVoJaJkZ2Rk5CNkZyVmI+LhoZ4dIF/fXR4eoB7dHR7aoKIpHZpXmVsgXVniIt8UlZwXkt4c1RkU1FfTU1TWmZOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzOPjrCgpKWqoqWjrKa0s7GopLCnqri/wb2xqbqqp62wycbI0MO+wL25v8C9ybzCuLGwtbK6vLnAs7W8rbmso7Wmp6yxtriypqe5ta20vK+8pa2ttautnKmvpJ+krKqonJ2qsqSzqJqqp6qkqZ2iqaepvauzsK6dqaSgr5yas6KWpZulpJ+lmpmoqqWemqmhm5GboKSdmZepqpGZmpKQi4KPhX2Pg4CIno+HgH6MiJKQkYWClJqThpOijZSRi5Gbk5aHin+Acnp5fnxodnx7dXFxfmqGeoWIZF9oY3KFe21neV1eVkJXe21UYVBSWUtMTnB0XUlaW2hZRlZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKwmZ+fqaSioauktrKxpKmwpq25wr23sKS5rKmosMLIyczCt72/tbjBusi2w7W0s7Wyvbm6vbauuba/raKzpqqrrrS3tKmcubuosb6yuqCutLapq56tsaOcpaipo52bpLCmr6Gfqqmnoqqco6igrbynrrGuoaqipK6enqymmJ+aoaKbn5uZo6qimpmjo5WWlJ+hlpyWpqyMn5KPkYyCioCAj4F7mpSMiX1/jIeRkI2KhpKXkYeUo4qSkYeQmZCUgYh9emx9dnl4Ynp6cnBxc3hqgnVrgmdjZ2Fuc45tYmpvX3BBXXlrVl5OUVFLSU1TWVZNXF5sV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl0+I5GWq5ifl6eioZ+opLevraKvr6isuMO6tK6gua+rp7O6x8rHv7jCva+0v7fEtsOysLqxssC2u723qrq4vqqktaeoqq+tuLComLi8o62+tLShrbe1pqaosLOgnqWlp6GkmZ6sp6ieoKqvp6Cml6Kon7C4n6Oxr6GroayknKemqJqbm5+ilZybmp2pppabnqiRmJKZnZOZlqGqkZuKjpCHfYd/go58fKGMjIl6hI2Fi46NhYmTmo6JlZ+JkJWCjJeNkXyFfHRwfHFzdGB4eGpvcXFwa39zZHpsaGVkYWaHgGBbcmpyTU6AaVhaTVFMS0hQUlBHTVtfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56hpKG3q7CjtLOpqbrFt7OuobitrauvtcXHwLe/wrmwtb23v7u+sKy+sLO/srzCuKq7urinqLWop6uvq7KvpJi7tqSrurWvnrG4r6mlp6+ynKGkoKSjoJabr6ahn6Kor6GgopOjpKK2sKGmsaufrKOumJ2qpaifmJqdo5Oam5qdpaqam5ullZSXlZyOk5eiqaKRiouQhnqDfoSLeY+Xio2HeoKIhImNj4WPk5iMjpaZi4+WfoaXjI96gXtwcnZub3NfeHdlbGxsamqFb2ZyaWtmaF5kc4FgW2t2aVpKf15cWE9PS0hIUlVHMzldXmxQRVlVWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJkVywylKGhl5SbqpyjoaKht6qtoLu3pay9xbSxr6O1r6ysrrTDw7yzv7q3sbO5uLq4uq+uwLOzuK+/wLetvbq1pqKyqaepsaqtsaCZv7Wkp7S1qJ6yvKmopamwrJmip5ykpZSXoLKkmZ6jqKmcop+SpKCkuKmkp66mnqWhqJOgqaKhoZmbnZ+RmZuWn6Gqm5qYoJSRlJaZjZSTpKikkImKj4Z5hHuEhn2djYmKh3qBhIeIipKFlpOTi5CWlI6NlHuDmI+Ld358bHRybGxzYXd1aGhqZ2dwh2hoaWNmampga2NqaFtme2NgU3RUXFtSTEpGSU9TQCEqaF5pTERXVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp6ipJGOpKaanZ6do7Stp6q6tqesxMG4sKyjtq6nra62wL+8ssK2sK6ytrW4tratqr2zrrKxvL+3r7y7saWftqqlpbOnqa2dnMCrp6Wvs6qstbueqKqrsaWYnqqdpqSRmKWsopiepKmhnKKclp+dp7WmsKquoaGdnqGVoKafoaCam5mbkpidk6WdrKGXlp2Uk42Vl4uPmJupn5KIiouIeIV2gYKBnYeKgop9f4WIh4aRhJaUkI6PkZGRjJN7g5WPhnN+fmZ5b2tqa2Z1c2tjZ2RkdoFiZWZmZmpqY2tyW19ZXm1kYU5pWFpgVkpHSEtNUlg+OV9saEhDVVRdW0lJR0VBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyssMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFlKVmJmQDozQmhIJTWao6CPjK2hl5eglqSzsaKyvbahsca8urGxo7esqq2puLy7uq3Asq6urrausrizqau5sa+us7a6tq+4vaymnrWpn5+vo6munKG/oLCjrrGvt661nq2vra6imZ2nqaWflZqnpZ+ZpKKonZqfmpScnqyvprqorqKhmpuemZ6kmqSdl56Xm5OYn5KolaqnmpOampKMlZmOlJSaqaaOjYqJjnuBc4GBipiFh3yJiYWFioyJkoSUm5OSj5CRl46Qf4CNjoNvgX9meW1oa2lmcXJrXGhjY3SBYmZnam5sZ2tqaG5dbGxzcGBUY2ljZllJRkxNT1hRUVVhZYBVQVdTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY+wnZmToZqpsa+fub+1oLTCu726saa3r6etpLe3tretu66sqqu2qbO3rqaytbKuqbC2trCztrqmqZ+1qJydqKCorJqnvZispK6vtrWsrZ+xrbCpopuco6uonJScp6SdmqmipJaan5uQm6Sqq6q8n6ekoJiamZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJiagJaKoZB5h5SMg21pfnaDcWyGi4Z9hYyHcF5jYWeEmIVri46UknR3i4R+g5CAZ4eAZ3VoZVdcaHNtTlBqY2dzhWhfZWZubWpeX2GKj4OEZU5LRDlHVGheSkdRUFRVTEhSYG90ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsKzA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoukmYaVsJubk6Cbqq2qo73Fr6m3wre9va2mt7ClqqK2s7GysbmsqaastKWvtKKpt7a2qKestrKutK2zoamfs6qeoKObpaaXq7mUpaWvs7etrqWprquspaGenKGnppuXoKWlm5unpp2Tnp+YkJ6oqaS2sKSjop2WmJeXo4ihjpKahqCHk5ygf6V/paqekpKakYiEc3iNjoWIoXaIjGmXiGZ9c3igb4iHg36OfH+hoKCZgHyHnnSHjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxcIhYXmlbbGxbiHJuenKFZ4aEWl9HTj9HX01FUlZWUVFTV1RnXU1WSFJST0ZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKp5eDnKucmJidn6mpp6q/w6+xury2wL+qpbevqayksrSurrO2qqilsK2ltLKbrbW2taanqLKwrLKnrZ2qoLGnn6KimaChmqyzlKOlpba9pq2nq6qsqKahoJigpqOZmaWjpJicpKmWlKKck5Ojpaaht6SkoKOYlZOXkpyIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kYR8kJCRynKXvJzFenK1pruQe4BtlrGrsHlobFixrm5lab2SvG5nem9yj9h+U2tjtrJ/gXKUc5qhqpBXT1diT1ZORlVbWFFQUoxcV1tQQVxEUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKeTgaeqn5ecnqWssqiwwr6ytb+1tr7Bq6ezrKyppq6zqa62s6enprSlp7etnLOytqulpKexraywpqqdpqOwoqGfnZaanpytq5Odop+0uqOqqaKtrqWhnZqaoqefl5unoJ+YnqenkZymmpOdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUca6hpH54u31roY92sV9qtFulgGWckWBmgntmf2p4a6llvnJnpox1sWp8sXh0kpRjbm2nbluEoUVoZoeWRXWcYH5nfKSnglpfjKtogJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOiU9XVy9JVFNKQ0ZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYOtp6Weo6Sqsbestb2/sLbEsre6waapsKquqKivrqKwuq+jpK2yo6i4p56zs7CjpaCprK+rr6annqOhr5uimpaVlpmaq6WVmqGftLOiq5yjra2gnpqWoKKonJido5+bmaGmpI+copmXoJ+qnqamoJqfoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH5rgqZ7goaIkpSSd6tna7Fcq3qNhpR0iXKPhoB/iJCXeIKCi5iLg6CPhLB2d59xbGxsfItOpFhIYmKZfmNopmB5cnVTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5V1hBI01oRkNFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o5YVU1MBuVoJWIs6amoa+pp7Osqbu2wrC7wa24t7+prK2traatsamgrruqoKe0rKOrtKSmsrOno6Kep6qxp7CnpZ6fn66VnpmUlZWXnaugmZmkqLWvoqmPqaiqm52Vl6ClqJqenKKem5+jpaOVm56XmZyiqZummZyboqCXk5GTk5yD1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46HpIKlgnqseY+dVq96iH6farlauXaGg32mgpN8mHqqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKlic3KIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWNQQFhnWmRhSkhNbk5cUU9ZZllDRD9FPzA9PDU5Ozc0PDw4PTo8QzpGOjo/NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFQNzElm6KUmbKoqKa0qqW0qaS8t8Gwub+xtbS6srSnsa+isLKmn621p5qnua2ir7Cfs7SwoaSen6apsKi0qKObnZ2qlZiWlZaUlqConJmWqK2wqaOej62iqJadl5ugpaGYoaGhoZqhoqebnqCelJiapqCbp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52Non+RoaV+sHaDkdLSdlyue4V/pG+bqqZrhoR8rX2XmY57sHKSnY54s2WXdISeb55mlFHIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPa2BsaFBWR0k5PVVSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTDYyMKKdk6WwrKOrvK2mtKantru8srq+tra0ubiypbSzoLGxop6rr6SXprmtpLGwm7S4qqClnaGppLGnrKmjmZyZp52Vk5eXkZGhpp+VkqWrsKailpOtoKWSlKCbpKaflZqlpqGao5+tmaCenpCVm6GdnKWVnZWaop+VmJWRm4Wse3eodqONiIapb62KgqeDmJihiZKai6J/k5qJroV/grNccrNSrn2CgqR/cdd9eIV+jp2Fmpp2r4aJkZyHd7RhmmWagoKVbZJasFhLmnWYeWZgrV52d4homIhsXa93lZ6PeGw1eciusl9CVG9eZ2BFUGxgcG1WVk0uZmRpU1lQO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEg6OTmgnpWgubCXtMKtqLOoqbK6t7O3vrm3sbS6tKS3sp+zrJ+eqKuflKe1q6ivsaqttKSbqaCfp6G1pqapopidlKSgk5KbmJGUoaSakpCmra+moJWZqaCij5GhmaikoJWZpaidnKSerZ2hnaCNk56anaGYmZuWl6KglJeQpp2GqX19pXihjo2CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTYf3aHc6iBjpuNkqR8lpCfhHuyXp1koH6DlW2SXKtbWpOAkX9oZ6pkcnuBa5iHc16rWomgjmtvZU9KQ6FcW0x0XWJnTlthX3JzX0tWN0qblFhHRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amsCrmLTCrqutqaW0sLewtb65ubGwtbqourSfr6SdpKennpOpsKmvqbWrqq6hmKCfpqSjuaKjq6CWm5Chn5STnpmTl56fj4yLqLCwp52Xm6imn4ySpJeoqqeUl6mnnp6goq2koZ6ijJShmJ+gkp6XnJWeoZWWjqucj65tcrRzqYt1iqdztHhzs4CRpKOSnI6JpIeQd7hvjHuLomprtlqhhWWXl2mhoqdtk3K0dJOYf7JqhZKIrWp1s2GdZqJvh5Nrl1ytX02hfIeRUnOjbHl/fm+Yh3Jdr1Y8nHdmVG9uLlynT2NTa2VibVpjXWFwe2NUWlI+Pm1vM0NCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKacm5+8oZuywK6tq6ynt6m3r7W/tLuvrre2qsC1qKmgmqWjoZyRqqmntaKyp66poJebp5+kq7idoqyalZmOo6KVjJygm5icn5GTlKq2sKiZlJusqpeMlKWYpayikZaqsqOfnqarsZmho4+Yopafm5aclqGTnamclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJeLjKeIeqS2dX13dsKCmrJgg7p5wHx1uGO1goyHqXyVgaypcXt/dLyIp6BpnWGmjq+hfox0h6p9vm9zvHSyg3V4gYpumohybo2kdL1ed31aYXm8a1pWXGp5XmphZWdjbXhvWlxZQ0FAc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivaGXssOwraqrrLGnt6+2xLC4sK25rq3AsKujoZ6joZybkKmjqrKktKWspZ6VmaqYpqy4nKKtl5Sfj6Sfkoycop2XnZqRlZKvubKslpikqKeUkJaknKStnpGgqKufm5+oo7Ofo6WOp6KUopqcmJWjmJCvoJKUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahxgHORuYN8hoaMh418ioeMl3yku7m9nHV6tKN0d5d2dLB1mZ5mhmqNtXRycXe2jF5/en2JaIN5bnpji6xwdYV/WFunakVlWlRmYGNeY1FnZ3BsdUNOUE1EOlpNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlNZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlUnPjs8p56gor+llrTDtKyrqKyrqbqusMWts7KttaazuKupoaGlnqCdmZOrpKyppbWnp5+blaCjnaukvaahqZaTm5ChmpGPoaehk5yXk5eUsbW3rZmepKSii5KSppulqpuVqaSlnJqhqKWnpKmhka2flqSel5eXnZ6Pr6iUm6ahjWp9aZumeIdyfZmOdHlkh3u9vsC6b5ODcpaIYHJqWl6biWBjiI+Va2CAlWNtnXdilWyAmpWUZV5gY3Gaimlyi32GlWdrf3J1eH1+Ylt3dIFoUFxug317i2tYa3qCc0pKb4ZwTnRNRVhdZ2FMW1hnY19PW211aXFSUURFTTtHST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPltPJz8yPqmgqKLCo5u1urajrKWup6e1sazIq6+yqrOivbCxpp+ip52jm5mZq6auo6S0qKSbl5Sgm6atqL2nqKSUk5qVn5mSl6SoqJCdkZCYnLCyv6ycp56noomTkamaqKObmqugo5mbo6eso6Cro5qwm5WnoJaUnZ+dl7ClmKGnmZuQnJyio5iloZmbmZmZj5WBZ219cXeSmJSShYu1qo2GmJWOioyYloeUlYqEk5SRiY6TlJiUmJaaoKGanJShnY6CeqWFbWt9kXyAdYqKgXGCeHl2doqAfIprc4F0g3Vld313a296bWBjXXBoTVlaZmpgV1pveW1tZlRQRlM5T1pNUU8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzoLOiwKGksrK2oKmlsqelsLSqyKqsr6S0pcCms6CdpKSco5WVn6qmrKKjtqufmJaVn5atqaXAnqujlJGbl52XkpOhnp6ip5KSmainssSwm6udq5+QlpannaqbnJ+smKGbnKKkr6eipaifrpiXp52ZmaCenZyvoJyhppWXkpeTn6CVop2XoI6Wk4qKjY6XrpB8lpyDkoKLqqmFgJmXiYSQnoh6hJCHhpqSiIaKlo+bl42RmJ2klpqTkZ2Nf45nobOvhYqEdnuSin13eXpvZnmQgYCJa3WBeohzaXN/e3aDh4JrdWR5ZmBqZmNkZmtZbHtvaWtdU0xQRF5URUA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9iY2FfXV5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0W0c1PCxAtKC5r7+sq66ysaCqprKtoqyzr8Svqaqisa28orObn6aioZyYl6elqaWkpbK1nZSTnZmZr6WtvqCropCRnZmYlJCUoZyXqJyEnqqro7TItKCqpKuXlpeZpZ2pmp6jq5Sen56gqa+qpqSroq6bn6CgmKSenJ+cr6OYnqeSl5ackaOYl6ecmpdlgpJ8ZX6NmpBjeY5taGt7kqSqamWbmH1nhoplZWloe46hj2tnjZiRo3draouZo5+Yc2xueoSOiHpYZl6Gg15ti4mBdlxoc3d2koCIgm54gniAc215hHR2iYiPg3xrh1lebHRkXnOJaWt8cWtkX1JOWElkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaWfury6r6y0saqlqK2usKatrbC8sKimo62usJ6slp+jnaGZmaaqnKyjpaeosq2elKOPoq+ltrmlrqKOjpqhmZOSmqCZmaSVe6Wtoqi0xLiloqevn52UnaGeo5uiqaiSn6GeoKmwq6ukq6CqnKefp6CslqGbpbCkl5uplaCdmpGjlp2pl519vYOIcrRyhJ2GrWh4ucS4cZOio3qmmZlyq4J8y8DAu3GMo4iCn32XmYmdwL2Cl52ejZ3CwXyCfJONmsPAfWylsm+MgW/Ken+bd5GDjoF2eYGAeXF6f4dwd4WMk3lueJRjZ2B4ZGBlgmNedGdsZGRZTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2FfXl5eXl9fX15cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtbCwwKmolKOvqLCuraays66ppKWmr6ufqpiaop+cmqqnop2roqSopKS0o5yikqatq7ezp66ikZGZnKWSkZ+hl5ufnYimrKSsrcDAsaGpr6mXkZ6copmho6qjk6GinZ2srqqtp6Skp6GmpZ2sqJGjmqitqZqcqJuroJWVpJWgopacfs6UeHqkgXmVlptfro9ejqeBoqB8p5abc6uDgK9eY4yqe6iHhaB1mJOIs2OCq4ahjo2zaoSvdX2XiLdhg61ao81ukHZ72nt/mXB+h5J2fmV7iHZ2a3yHbn2GkZF+bYOQYXJtcGhgYHlkXHFoamRnYFJUU1ddS09DNUFIREQ4PjY7QD9BOz04QD4+P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqets6umsqurqqOqpq+pn6abmaSXnKKvn6CfqKeipaCfsKyanZWnrqywqqirn5SRmp+kko+epJedp6OfraWrsKjAx7OoqbGulpKcmqGXn6mpn5Whn52crK6orKqcqKikoquSrLKWpaKqqp2ipaSgrp+RmKaZn5mTk5CXoHGFjJd1haiGcbF9nnKsfqKfgaWPnnargn2tf5xyrX6rh4afdpmSe3yXfqqIooySjJ1+q3uJlJCfgHutV53Fe49wk8F9gZVtdW+MbWV2ZYZvYXducm+JipKPg26TkWZwdXVxYWdtZV9vaWluZ2RYU11hWVJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNXQEYhHEc6QzEuK7DTxsaytKCdo46joqKsr7auqLGmqKqmraurpqGjnZmhlZ+lq5+hpZ+oqKKenbCsl5qWqKeuq6emp56XlJmjoZGUoKyanaajr6ykrLWqus6yraaurJeUm5yimZ6urJyXoJqen6ixqqurm62rpaOrmq6xoairrqWYpKmoqK+hkZWio5mTkYSkaqR1iXqpdHqycIKmipmMcYmgm4ekYGBSq4V/roObdq2Bp4aFn3qZl4Z7ZoCjiaSZhoKjfal+gpaHrl98qVaeo5KBeqOfgHvDr8WLcq+zs7lyYqmvwnRojIyYjoJunJVxb3p4eXBtZ2VlcnBmfGljXVdgalhZVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmFhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXUv6GZq6egr6KesLSwrqmsoqemqKqrqaSln5uknp2lp6ejnKuaoqyho5+voZyakqujta+uoKeanZWTpqKQmqKnn5+lnLGlpKixrbfIsrWqrKmWkpybopmfpbOdmqGUnZ+mrK2ksJutqqOjqqGzraGqs7Ghmqinra60oZGUoqaXmpF8qWyehId1q3l8sG+CpYyJn5aWoJWB0ri0uMmBgbJfYJSpg6SJh6B6mJaaeKrJdJqklaipkZOajYGciprGxnlnoYKldIGfjoJ9r11wtGKwdUujh22nR4KTZI+QnpF8cZmVgXF8dX58blxmanNxZoFrXmFZZG1cX1lJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqhpZqopKqrqqafpqWYqqOfrqudpaCsmp6ppZyntp6il5OoqrWyrJulnKCUj6WskZmcp6OfqaeuoaWnqbC1w7Kzqq2ok4qXnKWboaOvpZehlZmcpaatnLGerqimn6yjt6yhsrivnZquprGysaOTlqaimZ6Ogp1OeJqBf596hKN9g6SFh6afnZ+UhLh7e3m5gn/MxsK2eJuhkIuffpqWl4p2npiKpZikqX+whZ2GoISsfZqVY6ZtpHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Uk4x2e3OGgHFcbm54cmqBb1tkX2luYmReTExRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX11aWlpYVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq6fm6GssrOlnqCVpa2trqqnnKammqOnobOuoqmmsqCYqaSUo7aiopWXoam0uKOboZyiko+hsZmem6aloKGvrpylqKK2ssWxramtqZGHkJyonKKknKWXnpiamqakq5uwoq6kppivpLusoba2rZ2ctLG3r7Gll5yuoKOchY/RtcO3eYeOhZGTkICmeZShd4ygkoSlgYpxqoaFtG5yapmjnJWKnnyYmYaHj3Ovgqaco46mi5Odi5aQm25xsl2ldJN6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWOeX55kINuanlpenNvgHVeZWVvbWZnYEpbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtbWlhVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWSc4yKrb6/vLq0npanpK21oaKZlKKopq6rq5imop+moKC2p6Oop7CjlKyjjqStop2Qmpqqs7OknKScqJGUl66fn56mopynnbWaoqqktqzEsKmrqaGMhI6coqCmopWZmp2Zm5mmpaiZraiuo6Wbraa9rJS9r6yfoa+yuKmypZqosKKnl3mokX18sHeKgKSliJxtsnChh618oY+Dp5WYgKyJha6Fn5SqoKGXhp+AmZWAe5J+q4Cdm5aLq3idoZKKlJKBeq9epIF9pqdknYB9l3Nqr12la3CFmV1gW4ygbZWRppmDlo6Zjnx8hJmAa25/Y390boB6YGdmcW5oZ2hDWWFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFSU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA0Mi4qLEFUVlZWVFRVVFVVVFRVVFNUVldXWFZVVVFIRklKIygovZOag6jFwrbAs56arKCtuKWjjpukop+wsKqfpJ+drZmeuaCjq6CvqZmuoZCrqKOWiZqQrrCspp6lm6yXl4+soaCdpqGapJ2umKGop7epwa+lqaSei4COm5qfpp6SlJmblJuapqWmm6qsrKSln6movqSWwqyqoqCrsriprKWesq2nqJd1r36Qi5yFh366rYqZZbCNZZWtfaCPg6aVmoGsioSwhaaapKGhkISgXGxqgbNgf617e4OBsW1nb5mZjIixW361XKSEa8iiZJ+Ae7xYdrVZsn1SroB6rFiAoW2YkKibjJiSmpp8epGff2V1fmOGeHSBfGFqZ3BtZ2VmT1VkXEFVXz5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFFSVFdaXmBfYGFhXl9cW1hVUE5KRkM1NTMuL0BVWVhXWFdXWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9KfsrG3vbqzwbKinKympLWooIqaoJ6cs7Opn6OgnrWZoLSoqqyer62drJuVr6ehjoibjq+rqKahpZmukpiPqJmhnaWfmqOjpZmgoqqzqb2wpaienI59i5uWoaCYj5GanJKamKmgopqprqimpqKlqbueoMampKigqrS0q62lnrqsq6uUgKmSo6+Om4CHpJeZkIKAuMO6g46ckoSnl5yCrIqCr4innJumqpB+1b3CqmKjv719fqOCg9e6uLWFlZODnr2+hG2jgm+rhGycf3qysMeDaauwvax4d6K+vHOAlo6mnZGbkpqge4OTnHtkfntlj2d5gnthbGVramNQYltTalw/VGFDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzc7PkFDRkdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsL+4sbyyopyupqSypp2LmKXAqriyqKG/pqeynJ6xnLqon62vpaeUlLCrl4yDm5GupaKsoKOcqqCXi6OSpp2nnJqhqaOZn6Gsraq6rqijmpaSfIiZkaabko+RmJmPmJSpm6GZqqmhq6ego6q7nqjEop+toqmzs6muqJ+5pq2tmXN2qqW4hmSJoHBorpGKkG5ud6SQmZ+Bda6YlHCPi3GVqKObl66kcmxsbGaLeG9ugplxgXpqcWlnipeWmHFpaYWIZ3GGZF2IYmpvWVxmfXamX2FxjpFuZWR/jZOPoZiZmZOaon6JkZZ2Z4h4aY9reYB5ZW1jZmxiS2VYSmxaOlBlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWVxeXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp2jsqmXkr+zxcq/t6uewKytpKKnrJ+6o6Suq62mjpeuqY+LhZWWrZ6mqqCdpKOgkYukkqaYqZqXo6qhlp2mpqevuqysmpuSkXuElo2lmI2RkZmVjpiWqZagmKmjm7GmnaKruZ+vwaejsqWrr7CprKqmtaKstpWKoaimt52JlqOZh6qbkZWdkqmymZqjqqCylqKhnZ+inKGloZWrp42SkoyHk5ydlZGZk5mRj5aGgaWbmJaOi5SUjJCGhH1niX50gnVzh4pwp2x6lJGTkoGBjY+Qj52VopeamqWEiZePc2qRd3GMeHd9emptZGNvZFVhWUBqXEhjYU9ZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVVlleYGFjXV5UUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaWlxcXl9fYF5eXl9fYGBgX1lZYKaWqKqktLaurqGwo62foLWxkI6syL7GvLqro6WenKefsamjtqedqbSmqJGYrKKLh4mPnKeVrKSfmKeenpKUo5anmaialKahpJCbqJmhtbqoq5maj4x8gZSLoZSKlZGWkZCUmKaQoJuqn5y2o52mq7enrsCtoralrq+vq6iosbegrbuYkaWkpraikp6noI6qoI6Sn6Orr5qgo6+or5ijoJyjqp6enpyWq52TmaGblJCWq5qOmZmXkZafkomhnpaVhZKNkY6Vi4B9ZouFdYZ1eIeCc5xqhY+Uk5CJfYuVkpKYlKOTn5mkhYqaiXxzl3N7jIBzfH9qb2RecGpgW2BabmRQYGVQWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWFlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX19hYWJhYWFgYmJiZGJcW2OXlaOnoq+xq66jqaasn6e1qpCPnaW1vbCuraKjmnqeo7KkpbGpl5u5pqOTmaqcjoaKiZyij66eopWon6CSlpmbrYqplo+omamNmamPnrm2pKWZnIyIeYKUjJuTipWSlJGNkpejjZ+fqZ6fuKN/g6+1oq+udKO8orGfd3ifqLC5lHWso56JgKt/ZFxidqCPpZ+El31tkrOco6etqqJlnp+Sc3mal3CAmKiYbX+iqIplnKadkpiYlo2SnJKGnpuQloSSh4+PkomFd2qOhnaGcHuFf39gaIeKlJKLWnWUkGdokI9ze6icnGZ7m4mEeZlqhYyEb3qAa3JlX3ZxbGtoXGZmYmJwU1s+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVldYGhmaFhQSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6CusKyrqaWoraKnraSSlqu2sbOnm6unrJdzjJ2woKirp5SXuaCgj5yknZF/iYibnoysmqKVp6GdjpaSnoR1rY+Ip5upkZekiZy6s6igmZiLiXV3k42Wk4qUkZGUjZCUoY+coaeZnLKVgIybtZ2zjJKOuqagfqeieqGttYCOjaWeg4uGkLGqr4yKl6SbeoCLrIabnaGnqKeHlYWYd6WbeoecgZengoJ7nLJ6ioahmJqVmJaDkZeXhZuZYnqHkIWPkJKLg21wjod5gHB/gIR+hXOFhJWReJZoknSgmnV9mYWjoImYf5SMhYWaa4+Ohmx4e3FxZ2R3b2psa1xla2pmdFxeSVRMUkBFNi5aVVU3KSEwOT4+NzQzNTY4Ozo9Pj5AREk/SUVKTEdTWFtZXGJhaGZaUUg5REw7PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop+mrK2rqKygp6+mpqmlmZSvyL+xopeoqbaekISdrJynoqCOkL6emoyfmqCQfIaPmZeHrJyhlp+gkYyTiYaAkaeNh6OdpJSYnoaeurKonpqSjoVxdpCJlZCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6msiLaFjbCBr6yCqIymmI2dfaiPcnt3nI+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWygaF9oZShkJmXgY+UnIuZkot9hZOHjpaSiYNtco+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56FpJ2FmoGOj4eLmnGPlIVoeHV8eGhodnBoaGxeZHBsZ25ZZ0ddUk0zRTQ3TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUtNQEpjWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKfr6eoqKWrn6O3sKmrppqUoKOkq6SXpqu4o6+Aoaidpp6diZS9mZONoZKej3mElpaRh6uZm5yZoYSOi3ebnI+fkIiepJyWmpiHo7mupZqcjIx+Ym2Pi5OQjZCNjZiMkZKgj5ShoZmhp36hp4etnaCWrY+dnJyQhYCgjKmthaONqZmMmn+idYCZlGuCrXZNq3iHjZyRmqimgKmrfYOhe3qnap5/kmtnl4aXt4mefm5gZFmDl4CNe2Roi3KZfXmWbF19l21fUnCDXF9reIJfWGSBfIN/lnCnqmuDo25ypXCfhaBqZ6BtW2+MfWdaYISAYlhQb3dmbXRya2pvXWpwbGxqWWlPXVlGOUE1SERfbDUsSURSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXV5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGgtruqrqKZmKGipa2uoZ6vtaOokqGgoKecmo6ZtJmQi5+MlYt1gZSSjIqmlZWZnp5+koWFrKSHm5CKmamZmpuSiKaxp6KWmoiJgGluiIeLjo6Ki42SjJGTo42Un6CcoaR/k4GPoqGUoHaclY+ngqCmf4Wnq4OleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5uomY6HnXuConN2pmaefnekX5h6fZN0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNic6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGGdmbOWcn2Yn7N1c1uesoNqYm90dnFpb1hrbHJzZ11pXmJMRT1ENlFCWnMzPVNHYEpSPTwzOTU6OTZEOztASlA/VU1PUUBFX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOVlKO3mKqbk5+NpLa0ra2gmqKdpKOmrp2csq6sk5iimqGkmZuVn6ubi4iSeIuFcYCWjoqQoY+SlJ2YfZCJjaigh5eOiZKklJybjYupqKWekJeHhX5qe4d+fZCNg4uRkYmQlKGDl56gnaCei4l3nJiijZ9xoYqHqYebpY6Upql9rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYWiZKF8iJaQm41tnmibjm+amXqAi6d9cml0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhwgZxglYxep3Z1h4h+nmiadYaTkpeOgJ9vmpFup5pdqX95u2t+qlyOhF20Z1xucnp4a2lccWp4eWRgZlhiQlFGTzdXQ1JvNUxbW19OWkRBMjUxPDs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptJqniGOUm6u5sbCsnqacnKmgn6+cnrGprZ6XpJuhoJmXl6CjmYaJjWqIgHJ7l4iMlpaEkZWYkHqKhJWjnIqUj4aMn5KdnYmQqaOgmoySioGAaYGGeX+XjHuJjo6IkJebf5Sjn6Chk5hyaJ+Jn4+McJKMgamHmJ6hpZ6me7Cto6K4l3ejs6OkgIiUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mLWipKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g55uc32VcJp0a6RdlXZIZWRgdHF+fm9mYGxpdnxlZWFRX1ddVFdAWkZRaEVUV11iWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lY3ZtXWVnZmtkZmxpaGtpk5yAsK2ZhFNeoKazubKyqZqijJysnJyqlKKspKOoj6CenZualpmhnZaIh4l3hoFveZWFkZuLfJGTlohygIiSoZxzkZCBiZqVoZuFj6mcm5WLi4t8g2yEhXGCoYx4ho2IiJOZlnyTpKCeooithn21hI6enXullnqpgZWbj4mfm3ynaHdtfpl0oXNyfJ2GmXCTg659pIOlnZmAo29eqWd1omNvpWGc05B9e5l4c3NiooaQfqN0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2bbnxwlm1/cqJyXaRnc6ZgaKZtm9SafoabcHp7mGycfHiXc26ppGdgZXpxgIVsaGZkbnV4aGBjU1xmUVFiSFlKVWFXVFxma1xlUUZDS01KS0JLRThPQFFOWFNZT1NRYGZmalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaWV8ZF5kZ2RrZGptZ2hsaJeaf6+qVFxLfqmvsbOvsqObmYWZqaChpI6mqaGZqoubmZmUmZOSoZiOh4V7cH2EaH2Pg5SagHeRjo+Jb3+Gj5OSbJeTfImSk6WXg4+rm5STi4aJeYN2h4Bugp+Gd4CShoiZo5h7lKOkmZ+Js6Gitot6rKekrqVwqYCajoWAmpB7pIChmYaYcp6EpK6vipeMgI2kjZWDraCTdrW2tcmhc5SLgZ9gnpepbXmWh6CbdKKId6B+k5eLgXBNZqOScJuHc6R7eXRhg4FrfqBrcWRfnHF9c5ZoeWmztbTGpnOYfXqda5ybq3aFm212eJhqmnt1mHJRRX2zX2p2a3qIZmtoY3V1cW5XX1RZaVBTaElXTVlUVl5pbG9WaFdOS0FKTUtISk9BUUtQZWNqbWV0cnN/eXxudYl7e1RRT2xeaVxraVJqaGlsaGxmY2VfXF1dXmliZGlre19dZGhjamZvbWVpbGWhm4iupYNkP5Ohsqqur7WiopCAl6qio6WMpaeenaaDm5iXjpeQj5yTjoiDemp5h2WDjX+YoHl1j4mMgWmEhZKDjIWdjXmNi5amk4SZqpiNkouBiXqAfYt5cJChhnmAlYeJlqCWf5SlqJyVlYNmbnicbKJke3Gld5uYcGemgJWKeqR6n5aDl3Oed4GKlZePuW6RiqJifZmglYhucmmqa3WgbW+mYJtpi5BploeblnWigX6aYIyGjXVwiGJooGWefmmbdW9jZoiBbXGiWl5bYqFtXYiLbnp9c3JkpW14omRnp2iZc4yZcKJvVYmQb6BfZqhUi15UmG5tc2tygm1waWx5dGtwUllXV2ZaVG1JWU9dSVhpaXNrWWxXUVJGVlxMWFNhVWlrX3d0e31wfHxyg3uAc3aNgIR2XlJyYmdjcGdQamhoa2xuaGRnX11eXWBqYmppdnVdXGNoY2pqc21ma21jnKOXpXlkc22Lpq2jqbCxpp+LgJirnZ+mjKOim6OigZaZlI6akIuYkI6Ke4dxgIhpi4t8mJtzdYl+kHtkg4eVioqVmYJ8iIeXqJGBo62RhpCLgop+gICOc2mQpoR9hpONiJmgj4iTqaadiKZ4lZt+pIiWi7GYnZCCr5efpXaUhnipc6WPhJpupKKMkoSNg7tufaWvg4aFhpOVnJ98pXpyqJWglmeefm+sZJaKlpN3qG2qooGJdomDd6uRpohrkbBrdrOMqWuKhW1tn56SlWB+q4uqdn5+i6Wedp98g6SVnaBqm4h4rGierYy2dHe+jaSTWoOnjqthdXJ0cHx1cWNrf29pbVNXW1ZhYl1rTV1SXUpebW93YFtxWVxgW2d0ZW5vcmNydGB3en55cnmDc4R/gXt7jIGCgHZieGRjbnJkUmtnaG9scmpmaWFgXlxha2JtbHpvXFxiaWJsanhtZ2xuYpWkqZyBf52jlqmpnaimrqSZioKYrJqfpYqbpp2pnYWNm5CHnJGFko2MjXSHe4iEb42FfpiTdHSGc5KCbX+LkYeGk459e4KGmKaOf6enj4GOiYWVdoKHkm9si6mBg4yUjomdn4mMlKqin4+AdZSXiH6BeZSuon+Bm3GPhneOiYJ9e3KnjHJ+fXqYlpuEkHl7f36HlJWTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GHhIJljH9fgX+Ld3RylHVveW5th2yEhV51Z3eOZYCAhY2omn10e5VqiYhwgXZ9h3dubmiMc3p8mHiFXGxYeY9pb3hycW94eHBda4duamdWW2BXXWZrZFZjVV9RX3B5eW1rd2Zra2t3fXJydXRhb3ZidHuCeHV6gnWAgICBeIuFg317bn9sZHluXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNk7eopomgopqmo5iknKuioYSEmK2SnqGJm6ebqZiDgpyMf5aUh46KiY1yg3yPfX6PhXuYj3RyhHGVhXt9kouGho+EeX6Ah5qljnyoooyGkJCFlYOGjph3coSpho6SnZCJn56IjJunn5+qhImOlZp+fomWraePkaaPd2+bj4F4kG5+qIVxfpVxa3B9gqCNgJOOi2hsXIKLi5uano5zlYuIcXRrgnd0gVlyboeRgX5/jGpdamR7hoSJgGBpeHqae4KKgXWBhYFnd4qGamFwcYF0XnGKgYiOpZSFZYuNg253i4Rxho96cWhoZXyEe5ZbXGtobnZbfHl4dW5zc4NnXG2La2tiWlpfW1lscVxfYVpfXWV0f3x2cHVka2trfH1zfHl1ZG51aG18fnd6fHt5eoCAfm+GioR7fXR+eXN/aFRccWlsdnB1Z2toZF1hWGtoa2txcm5XW2VubGdzem9oam1gi4qpsKGPoqGanp2Xnpioo6J+g5mujqCViJyikaWVf3yYhn2SmYmJhoeKc36BjHaFjIKEl4pyb4BymIaDfpKDhIaJgHqBhIycoZGDp6KIeY6XiZWLi5yXhIN6rYKRmJqVip6dh4ihqp+hoqOLiJObnKOZlaqhp6afkpqHlYx6do2Ng6d+f5KQk5SdsqablZ+QjbGSl4OljIyVmp+JkJuCiJGKa3yOd3hlg4eRi3yJnoSHjJCJiIGFhJB3fHp0maCIhomdiYSTfn2KgIB1b3KEgn53hYaKj6WQgoWMhoKMkIx9iIyKkYR6bYOFfnqZa3NpYXSKcX56d3dvd3SCXV5vh2huX15aXV1TaHJWZF1dYmxodnx9dG9wZWtqaYB9bnmAcmpwcWxngXtygoB4f31/hHttgoyGfHp4e316g3hOY3Zqc25wemVrZWNiYFt0ZnBncnFtVV1sdG1peXpxZ2lrZIyHnLmelqGgmJSYmZSYpKCefH+arI+fjoagnYueln15lYR8jpmKhoOEh255gYFzgYh+iZSEbWt+epeHhIOQf4CHhIV8h4WPnJ+TiKyghHOLkIaSkYudkX2Ne6qEjpOYlo+cloeHm6WfopqdhYKSmpqYj5mmn6WdnI+Vf4+IdXuGjYSle3yOkJGGmauinpSdkI6pjZCAnYyIk5mego+XfoeOg294hnJ1YH+EkIZ1jZmBg5CDh4V/hYSVbnl2dJKhiouFmoOEjHN/iXt8cnF6h4J6d4mNg5Gmj4WDjoCDiomKd4aJi4x+cW1/gnxvaGxtaF96f2h+fHZ1dnV7eFxfcX5udGBjW11fUmduVGVbXmJraXZ6f3JsbWRramiBf2x0gWxsdW96cIZ5boeAdoKAfoV2coKNiH57fHx/e4KKYGh7anVpaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2LiZ62maCjn5KRlZiLmp6fnnt4n6eRnIuHpZWLmJl5eo2FfImRhIyCgoNufIB5c4GFfouRfWtofYKXiYGIjnx+hoSGfI+CkJ2dk4mpnYFxjIuMkoagoYqFjHyokYiQkpeTlpN4jaOfoJ2WmX+AkJuZkoyaoqCjmZeQmn2Mg3d/go6GoH9+jIyPfJikoaKTmpGQpoyPgZqRiZKXm36Tkn6HjoF1dIJxd2F+gI6GcouWfYiMcox/goWGj2h4cniLmJGPf5Z9iIpygYZ7fHB3eoqCeHiPi4GUpZKLhY97hYaHhHaDhImJfGdzfYB5e3Fta2dffnNofHV2dHxzgGpeYHR2cHdkY1lfX1JraVVlWWBhaGp2eYJxZ2tkbGhmgIBrbn5ob3FsfnmHemyMgXOBgX6BdHaCjYZ/fHuAgX1/j2lyg250aWGHaGxiX3FWdG9tbWB4aG1XanR2Y3V6e3Jiam96iYyesZGlpJyOj5ePhpygm519d6WhjpiAjaOLiJqWeXuGh36DiX+JgoF/cn97dHaDhX6KkXhnY36Gl4qCiox5fYCNg3mWgpaZmI2XoZx/cIyCkZOGpZuHjImDppWFk4uWmJOSd5GdoKGXlJZ5fo6YmI6WmpyjnZiSlJp4jYSCd4OVjZ1+gYmNjHOXo5+ilJmPj6KMioKWl4OSlpl+mI18iI2BdnF+bntkgHyLhXGHk4CRgmyHg4GAiYVmdW97hZGXi3ySd4uIe3+Ge3pxfXeIg3iDj4eJl6GVgYOLdoiEg4J3fIOKh3hgenl+dH94Z21lYX9qandzdHZ+cXxjY2BzbnVybWFaYV5bbGVSY1lhYWhrdnmGcWNrY21maHyDbWl1aG5waYB9gnltkIZygIODfnR8g4yBgH57goN+fJBtdolzdW1limxqYmJ2VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm62XpqeejYyXh4afk5eZfniqnYuZepedi4yYkHl8gYx+fIR8gYOBeHR5enR9gISAiYuAZF99i5WHf4WGdX1+i399mIaXlZiNpKKZgHOHe5ORiaaPjI6Kk6CRg5KQlZeRi4GPl5+akZCQc3+NkpSJnZ2eppeXjJSVcouMiWuEl4+ZeoeIj4lvl52apJSVi4yejIaBkZx/kpKVhpmIe4qKgXlxemx1bHx/i35uhpODlXhxgoR+fouAZXJpe3+Wl4N+jXOPh4J4hn11d398hH97gouDipOjj3iDgXSJh32AdHaCiYVwYnx2e3J9cGJvY2R8Y25wdnN4d3N0YnZgb2x2bm9cXF9eXmpeUF1ZY2FobnR7iWxgaWVrY2l3h25nbGlrbWiBfXt3b5CIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhtbIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJipn6SonYqKkoaKnYuVmH54r5mNl32flJGXk4h3fnuKfXyAd3iAgHB1dHxvhn2BgYp/fGFcfo+RhoCDg3N7gId6j5KJk5KdlaacloJ9gX2OipGjiI6KjZiajYaSmZSWjoqIjJKcko+MjG6EkI+RiJ6ZoqCWlYmWkG2HmINlhZiOk3qJhJCKcJaalKOTkomLmYyBf5CdfZKOkoyZjnuKhYdzc3ZscW51fIp0boaRj5NxdYF8gYGIfGVwbHl8mZN8g4h0kImAc4d4bn98gIV7hIuHgouUp4x6hnt+ioV3fnFwgYeFZml6dXZxfGJfcGFrdF9xant5eWxzcGV5Xm5sc21yWFtfYGFrW1BXWGVjZ3Fxf4hnXWlpZ2JncY1vZGloZWlpgXp3dW+OhXSBgoN7dYKIhXiFfHiEhXp/iXd/i3t7cniDamtfcGh0gGtyb21yZ29sZXxjboB6d3Fsd3eKfqKXoaegppuHi4uBj5yHk512gquVk46HoY2WlI9/c3x2hXh5f3Nze4Zrc3B6bot2gIGIb3FbWX6RjYeAf392dYCAgKCHkouUnpqilZh4in+BjYicnYqPhpKYloWJlZqQl4uLjY2MnImNkINtiYuQkYqdlqGbl5SFl4dpg6KBZYSciZB+i4OLgXeTmJKfk5GJiZSNfn2Ol3uRjI+OmpJ8ioCCb3ZwbG1vcHuGaXSDj5mLcXeAdYKIg3lmcm51gJmOe4eDeZOQeXWHc2+HeoSKeYqFgYeNmqKGe4N1got/d3lubIGFg190dXNxcXlaX3FhcGtecGp9e3FtbWptdmBvb2txbVlZYmFiblhRVFpmZ2N1cISDY11rbmRjZmuSbmBnZ19oa4F1cnNwi4B1f4OAeXaAi4B5hX94iIZ3g4V8hot/e3aKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx1dXSAg36klZqsnqeWhY2Ef5eUg5CgdoyglJOHi5uNlo6LeXF4dIJwcoV0cXaIbHBudm2IdoN+gG5uVVGBq5WHg3h/d3KDeoOggpOClZSanZObeJJ7g4ySo5mTjomVmZKEh5eZjJSLiY+Ph52EkIp8c4uFio6InJqfm5WTf5N9aISbhmeFn4eRhJGCiXGDkZiQnI+PjIyPjHd7kZB6jouMkZaMfIh8gGt3am5rbGx7f2J6fo+XgXZ7gXiDjH15Z3Nsc4aVi36HhXqTj3F5g292i3mIinmIfIGKj52dhHt6doKLfHdxamyChHtheXFubXJ0Vl9wYnJhYG1venFob2Zmc3RpcWtid2VdV2ZgYHJTUU9cZmVdeXCIfWBcaXJiYmVmkWpfaGVbZ3B+cGtxdIp9dnyGgHV2fox5e4WBeIiDc4aFfoyMhHx5lXhmcmuDYIh+b29remBqbnR/dV90fXmGeHRzhX14oI+ZsJuljoKLf4OaiICMn4CLmpSPhYiYjo+PhHZ0d3SAcXCFdHByhHBraXdug259fW11c1JNgt/IktaTe3B1hHaEoIOUd5aRmZ2RmXuUc4WQnqGTk5CJk5yUhn+XloiNjYiRjIebf46Ad3qNfomMipybnJqUknmMdWaHkIVrh6KEkYiXg4ZjjJGZj5WLl4yMiopxepSIe46IipKRiXqGfH9tfGVzb2tsenpbgXmQkIF6fn+Aho57emhyanOKj4mBhYR8lIprfX5tf4t9ioV8g3iAjpSZmYp8dXeDj3hybWdxgIVua3VwaGp1blNfb2VwWmBscnhna2piZnhycHFjX3dgYFZrX152UE5MYWdjXXpxiXVdXGV2YWJlZY5kYWdiWWlzc25rcXaMfHR6hoJ1dn6Lc4CGf3uJf3KJiIGRi4h8fph2ZXNufGWIfm5wbIBZbG55eXNgdnp7jXZyd4p3eZ6Lm66aoJCChXeIlX58ip6IhqCSj4WMmISTjoeBdHhweXFvhG9tb39zZWV5cX1ten1qaGtjpJrB3K7woXNsdoR2haOGk3CXkZahlZyBknKGi6KXiY2VipCdloOBlpCFiY+AkYmJln6HenV/iXiHhI6cmpiYjo92iXVthYiJfImig5GJnISFXouTl4uPiY+Li4SJbXuWgX2IhYmRj4Z2hn5+a31keHZqbnlzWIl7koiFen6BgYaMf3llcml/iY2JgoF+i5WEa4F1bYePgY6DfYF4fo+UkpiPdHJ3h4x1c3FndnqEY3VucWNqdmhSYXFnbFZfb3R6YXJkYGl9cHNvW2NyYGJWbllceE5NTGRmYl53c4luXFxkeV5fZWWFYGNjX1lqc2tua3N3jH10d4SBeHd7iXGDhH1+iHt0i4mIloaMf36Xc2d1cnlsjHtudHGBV3F6dnlyZXd5h41pdoCJcn+chpimm6OShH1xjJR3eYyehYWhjY98lo2AmYiEe3N3cHRqcIFsaW18dV9heHd8cXV8aGBkfOvatcnD3IdzbHSCd4ubiY9qmZGQnpaUgYlxhYifjYSLlYqMmJR8jZOIg4mPe4+KhY+Bf3Z4g4RyiIKTnJaUl4WMdYZ+b4OBh4aYoYKTjJ6DiWGDlI+HioaKjoeBh2l8k399g4SJjo2Ccod/f3F3aHZzanR3bFqNfZODhX2AhIGEioJ2YXJriIGOiYF+fpGQfW2Ba3eEjoSQgnuAfH6PkY+ViG5weYyFdGtxbHN5gmF1am9dbHdhUmVyaWZTYHB2dWFwYF1og3Fza1dnaGJpWG1WW3VMS0xlZ15ic3OFalxcZXleXmRne2FkX11Za29mb2p0eIp+c3OBfnt2eohzhYN8f4d2d4qGj5mBjIJ7k3Vsd3Z5eJN0bnh7fVh5hnGAb2d5d5KDZHaGhXCKloWZoJqiiod0b5KMcXePnH6LmomJfaB/g5mAgXhydG5vZHJ/aWZteHhcYHl7e3FxgGphZ2F/1baOkaZ4bnF3fHGTkY2Ia5qPiZ2TjIZ7aYeLmYaBkpGGh5iOfI2NgYGKjXyPjH2JhHp0eoN7cYaAlpqOk5OBiHWChXSCf4mRnJ2GlI+ffohif5OHhYiFi42AgINnfJCAfn+CjI+Qfm2DfIN1bG13dXV4dmxjjoGPgIV+fYZ/hIl/cF9xb4R7jouBe36QiHlwg2V5gYmFioF6hHx+ko2PkYNtbnmLfnVtbmtse39kaWxqWW53WlNqc2liUWNyeG1jZl5aaoNudGJcaF9kbF9uVVtwT0hPZ2VcZ29xgG1aXGNzYFxjbHdlZV1dWmtsY21qc3eGf3Fwf3x9dHiGeIWCfICHdXmJgZKVfImGdoiBcHh5e4STb257gXdeg4B0gm1penSUc2dziHxxkpGDmZ6boIaIdnaUf213lJh/iJCEi46afIuad352cXBsamF1fGdianV6W2B4fHptcX9lY2hnV52PX3FzlrzEhHdxlIqQgHSYjIedlI2Ic2uIj5WAe5SLgYSbjHyKhn18iYx/k4d0iIV2dn2CcXWGgZ6VhpSPgoJxfodzg3qIlpuWhpKNnICIZn2TgoCGhIqJcoF9Z32Le3l/f4eLj31pgH2EdmZweXh0eHRsa4+Gi4KLf3mDgYSEgGtecHd6fYuHhXuAjn9+coBoeIGGiYSCd4J6f5aLjot8bWt6iHx2dG9paH53ZV1xY1hwdFNUb3NpYk5odXlnYV5dWG+Ab3RZZWNdam1gcE9ZbFJEVGhiWmxvbXtvWVtebWNaY293ZGdcXWBramNsaXN3gYNxbn57f3R1g3qEgnyChXZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaoJ5en5ubXx2lmtqeIR0a5OMhZ6YoJmFiG9+jHZqeZmPgIKKgpaYinmOlm96c3FsamRgdHtpYGZye1thc316Z3B6YWVkjrGyd0tiWqXa0Zdye5KMkXl/loyFmpKNhm9shZKReXmThoCEmYp8h4B5eImKhJWAb4qHcXR9e2p5hoOlkYSTjIJ/bn6CdYJ3hJqXkoqTj5SFh3B6koR+g4SKg2+BeGiAhXhyf3+Diod8ZXx+hHZjcXOAanpxb3WZjYaEi3x3eYCEeoJrXG98cn+Gg4h9hYd6iHGAbXCChY2Cg3GDd3+Xi42Dd21tfoN/dnplaGp+cmFaeFpZcm5OWHJ0ZmBLbXd1Yl5cW1l1fXJwV2deZmpxX29OV2lTP1lnX1twa2d5cVtbWWtlWWNweV9oXV5lbGhmbGlxeH+Hb21/fYF2cIJ7gIF/g392gYWJl4pxgo1xe4Z8enmElIx1a3p/bHB+dH99b3J8e5Rwb4B/eWaSioKhmJ2Rg4Znh4RwZ3qXin6AhYKZioF8jY1peHJsbGZfYW95bV9ib3lcZGyDemFxdl9kZdXrvosyOj6LjoByeYaJj413hZmOf5SOjX9ubYWMi3V9j3+FgpWJfIN4bnaHhYKWd26HhGt1e3RleYOEp4yDj4yDfW1/c3WCeISaj4uPkZKMi4d/e5KHeICFjYNsgHNpgH54bXx7gYqDeGJ5hIJyZHFpf252cnWCnIyBgIZ/dHZ+gHOBb1prfXN4iIGKe4Z/fIh3eXBrh4KOgolxgHd9lImKfXRtanaAgHV1XGlpeXFaV31TWnJmTVtzcmZcSnF4cF1bW1pddX91aVliW2dlbmJpTVdmUT1eZl1edmZfdXFbWVVvZFpkcHlbaF5gZ21namtpcHh9jm1qgoSAeW6Be32Bf4J6dYKBjJOFcICLbnd9gHt7iJOJgGl7fmt0fHKGe3N3fX+MeniEfnxrjIyEm52WjIKBbI1+a2h/j458fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXDVar7V1aoCKfpOHd4iYh3WQjIp3cG2FgoZ0eYl4iX2TiHp/c2d1iH59l29xhX1odnluZXqJhaWHgIeNiX1tfXR+f3uKl4aBkpCYiYuFinyPiXJ8foV8aX5ta4F7eWp6doKHgXJgd4J+cmRyZ3aDbnV8hpWSgn2CgHB3enx1fm1YbX11c4p/hnaGdIKJendybYh/jn+DcX17fJGHiHptbWhtgoF1bl1oZnRyUlx8TlxxXU9cc3BkVkt0eWtYWVlaYXGBdWFdXWBmZGhoZk5aaE5BYWRcYHZhXHVtWFhTdGFbZW9yV2pfYmhrZ21saXB3fJNsaYSKfXxwf357gX+CeneAgImLhHJ7h29xd4R/e4mNj4RqfntueHl3ind9eICCh3+Efn56bYSMiJijjYWEe3aLemtthYmSeX17gpKAgH2KhHBycGNmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f76cp6TJuHKFhHOUfXmIlIR0ko6HcnNwhHqCc3WGdIh3lIl5eXFkd4Z6gJJocYR1Znd2ZGp8hIiegoB/jo59cX5yg3h+kI6Cd5WMlJCIgoh6iYlseXp/dWh6aWx/eXNpenaAg31oYHiIfWtqdGh7gWp2go2RlX98fn5xfHZ8dH5iVXV7cXKIgoJ7gXCGiXd4b2+CgYt9fHd8e3SNhIF1aHBnbIiCcnBdaGN0b0xmdkxeb1ZUWnRuYlFPdHliUlhYXWFwgnNbYV1oZWVjamRRW3FJRGRiXGRxXlx4aFVXVndeXGZuaFZsXmFqZ2Vubmhwd3qTbmmIjHl9c3t+eYKBgnx2fYOIhoNwdoNzbneCgn6Ii5R/cYB8eHp6gYt0g3h/gYGChHqAdW99ioubnoh+hnt3hntndYeNkXp/gHyJhoR2j4BncG5gZVxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6naqceGiLNyinlwjnZ9iJCBe5SLgHV0dX52f29wf22FdJSGeHVsYHmBeYiOZXGDb2d1blttfYGQk4CBeZKSfXd6bIV0f4+Kg3KViZGPiIaGe3+GbXV2f21od2ZtfHZtand2f398YGJ4hnpodXZjfnxodYePjpZ9dYB2coB6fW2AWVZyfW9zgoZ+f3driIZzeGp0f4KCfHl7d3lxin97cmdzZG2LhGxzW2pfdmZJb29MW2NYV1Z5bWJQU3V2WVFWWF5gcoRvXGBjbWRjXW9jVF1yR0JmX15maV1ae2NSVlx1W1tna2FWa2BgbmZmbHFocHZ4j3Rrjo12f3Z4fXeBg4F7dH6DiIiDb3F/dXF1fYWBiY2Le3d/eIR8fYWHeId8fYF9hIB7fnJ2eIuOn4yJe4p3dYN6Xn6Hmo15h4R0hoeEd4l7Ym5tXGJbW2FVanRkYFtob3Bnh3FhcWZXXGNrf3zKzoe6omtub4ttcoRyfoaLf3uShXp5dHp1dHpqbHZjhHaSgnZvZ198gXmLiGVxgGpqcWNYbXuGnImDgnKXk3d9e22Gb4CJioZwlo6QiIaMhHt5f3JycH5naHJjbnhxamxxd318eV1leoB4aXV5Z4J3aHWIjI6VfXOHam9+gHhufV1XcH1tc36Je4Btbop/cHZmdn5/foB1e3B4coV7eHFlcmBti4FrclhrX3hdSXBsTldWX1RVfGtiT1R2clFSVFdeYnSGaV1ga2pmYlluYVhjcEdBaF1hZl9cVnxeT1ZlcVlbamhdWGhhX3JmamhxZ3Fzd4d5bpWKdX97d355g4eAdXN/hYWOg3Bwe3h3dXmGhYeMhnp8f3WLfn2GhISHf35+fYZ/fHh2eXaSlJ9+jX2LbnWAemSEiJiGdJKKb4WFgnqDdWNuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq56n7huYnSHaXV8cnqEh3t+jYB3eHN3b3p2ZWpvYYd1joFzamJefXd4ioJlcH1oa2taVm94i6SBhX9wmZJxf3d0gGx/gI+GcpOHjIiFiYV9eXVzb2l5YWptYW12amdra3l3endbZ318eWZyfm6FdGZ2ho2GloBwi2dre4N0bHViW256anN6inuAZXSHfG1wZ3R9dnx+cHpqeHl/eHdvZWxhbIl9bG5WamF4VktrbE9ST2lOWX1oYk9VdWtNUVRVXmZ2hGddYXFoZ2FXaVxca2lKRWpaYmVXWFV5Wk5XbmpZXWxlXFplY150ZmxlcWZzcHSBeHCZhXZ/f3h/fIWHfXV0god/lYNuc3l7e3NyhYaIiIR5gX12j399hImOhIGDen6Lg3t3fHd2mp2YeoqDh2p2fn1shIaVgXKPgnGGgn6CgG9mbGdYXVtcW1RlcGVfWGNydWl2cGRlYldbW2h/cG9ygHOKZWZ6f2p1d3R0hIZ4goV6d3R2bmt6cGFoa2eGdI2EbmZeX3xveol9aG13ZmpkVldzcI6nfYR8dpaQc3txe3hseXqPg3WXfIiGg4eEfXVxc21odV1taWBtdWRnZml6b3tzWWeBdnVocIF4gnZid4WLfZWCb4xrbXuBcWZzZV9reGZxdYl6fWF1g3Vpa3F0eW94d3J7ZXx9fnd1bmNlYGyGfG1rVmpjclRMamtQTE9wSF58ZmFOVnRkS09UWGFrd35mXWdzaWVfV2NXY3FdS0trWGRiVVRVc1ZNWXZlWl9sYFxbZGVfd2dtYnBpdG9xfnV0mYF4f4B4gH+GhHp9doKDfpiFbnJ0fHt0cYWFjoGBeot1dJCAfYGUjoCFhHx+jIZ6foF2e6OminmJhoVsdXx8dYSDjXtvhXN6hX2Cg3VuamllVl1bW1pTY25lW1hidHtqaW1oYGFXXlppgGlsb4BnbWJpe3prdHV1b4aCeoF+d3Zue2hqeWpfZW5ogXeQhGdlWGF2aX2GeW5pb2ZmXVVYb2mPqHeBenyQjnh0bn1tcXR4jX53lHSGg4CFiXZqc3ZoaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Bfnp3YXeFhXqRhnOIcnB6f3JjcWhbbXZkb3KHendhcoBvZ2l4c3Frd3ZzdWKCen12dW9jYmJtfHxra1VpYmdUTG5oUEhSbEVheWZiTVRyX0pNVVllbHh7Zl9tcGpjXVZgVnBvV0pTaFhnXlhNVWxUS116X1xfbF1dW2JlYHpobGFvb3Zub3d1eph9d4CBeYCAh4Z6eXqDfYGThHF0dH56dnSFiJB+gX2RbHOVgXuCn4V/h32AfoaCgIp7dYSsn396iIiEbHKCenaBgYJ1bodvfYB0ioBqb25lZFhfWlpaVWJqZ1xaX3WCaV5tbFxhV1tca4FlcXV9aWpebXh3aHV4c26HfH5+enZzbHpoaXdnXWRzZ3p3koFjY1Rkb2aBhHZ2ZmhqYVdWWWhjkKhvf3d/io56cG97ZndteYp6do5xhH1/f4duZHd0ZWhpXWxiXnBwW2dfbXVlemhddIBucmtxe392dWJ1hox8iYiAf3hydX50YXBsWHByYW9wg3p0Y3GAa2Bsem5paHl3c3Bkg3R4eHRwZGBjbXJ9amxUaV5fVUx1Y1FHV2JHY3dmYUxUcVlLTFhYaGx2emVkbXFmY1pYXVh3Z1RKXGNYaVhYSFdlUUljeFtdX21bXlxiZF5/aWpgb3R4bW9udoOXeXKBgH1/iYyGfnV2hniGjH10dXWCeXp6goyOfX+FiWp0loF7ip19foV5gHt+fIaJc3GProx8fIeQfmZxiHp0fn12cm+GbHx+bZB6Y3BwYmVdZVZaWVdjZmtgXV1zhmlZcW5bXlhaXGx7YnF3dmxjXG50dWh1d3Fuhnl/gXp3b290ZWh0ZVtndWZ2dpJ6X11TZWVqgoFzfGFjaVxUV15iZJClaXl0goWQeGxteWZ3bHuDeXSHcoF4fHmAaWV3bWBnYV9rYF51a1lmXW9vYnplW3d8a25vcHh5dHVlc4OTgImDiXp2b3J9cmF4Y1pub2BvcIB6c2VxgGRebXVoY2Z4enJrbYBzcntxcWFeZW1ufWRpVGhZWlVOeV9SSlpZSGN1ZGFKVW5VSkxaV2lscntkbGxzYmFZWlthd11US2NdWWpTVkdZYU5IanZYX2FuW1tfYmNdhWloYm54eW1vanaBkHlug36AgpKIhIF2dYl0jIZ0cXZ2gXd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OHhHNwmaJ7e3+JlnlldYh6c3l3bHRwf2x5fHCSc15wb2FnYmxUW1pXaWRtZlxccYllU3JuW1lYV2BrdWRqdWpqX1tudHJtdHR1a4d9f4F9d29ubGRpcGNba3JkdHaOc1xXVGNfcH9+cYFcYmNeU1phXGSTn2VycYWDkHNranhsbm55eXpxgHZ/c3t6e2RmdmheY1thaFxed2hXYl5waGF3YVt8dmpqcm54dHR0aXGCloSHf4V2c2pwfG1md1dbaWxhcHF/eHNlb35aYHBwYV5pb3xranJ9cW92aW9gW2RrbHthZlRnVVhTUXdcUlBZUkhkc2JgR1ZsUUlQWlVrbGt8ZW1vcmFbWlhZbHBXU1BmV1dpU1RGWlxPSXN1WGBjbmNYYWFhXoxqY2Vtenlsbml2eYZ7a4R9gIWZfIKEeX2IbY+GcW92en10goJ9i4+Dg5d0eIKUhYGfiXWBf4F0f4Jwh4N2b6KXdHuGjId7ZneLb258cGd4cXtsc3ZzjWtedG9iZ2ZrU15cVmhibGxbXHGNZE9vbVxWV1VmaHNoY3RlZV5acHZvcXZ2emyIfYB9iHeQc2Nka29hXG5tY3N4h2taVFZiYnZ8fHCEXGNfY1RaYFpjl5VjbnCChYlyaWZ5bmRydXF6a3l0dW97f3ZfZ3NkXF9XYmRZYXVlVV9gbWRhcV1dfm9oaXNxdHF1dmxthZSDinyFcXJnbnxvcW9SWmVpZHByf3VzYmx1VWJxaltebmR7ZGt0fHFxcWlsX1hkaWp4XmZVZFVXUVZvWFFXVFBIZXJfYUZYa09JWVRWbmlkfGlreGthV1xVW3RkU1JWaFFZZ1RTSFpbUE55d1tfZW1qWmJhXl6PbmJnbHl2bm5pdnZ/fm2EgH6Gl3t/h4GKf2uTiHJndIB7dYCDfomOf4yTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOCjYx3eG56jWBlfXFnenR5bG1xd4NnZHxtZGdnaFNgX1VnYGxvXF5ujmhNaWxgVVZTb2Vya2Z4ZWVdWnJ2bnN7eXNuinuAd5x7emthZWxtXmBuamVweX5nWlZYX2p3e3pvg19iXmdWWWBYZJyIYmtwgYZ8d2tqdmxbdXBqeWl1cm5ve4FzWGtvYFleVmNkWGVxY1RfYmlhYmxaYH5rZmx0dW9teHZsaIaNgIp7iG1xZnB7bHFsYVhfZ2ducn9zcl5pbFNlcGRVYm1heGFvdHp0aW5ral5XYGZodVxkVmJWVE9ZZ1NPXU9QSGVwXWNHWmpOSmBLWG1lX3hobn5kYFVeVF11W1RSYGdOXmJVU0pcWlFadnZdX2ZtaFhjYVtejnFjaGp4cnNtaHZzeYNzgoN7iI5+fIqIjnluj4p0bHOCc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo2NjY2NjY6Ojo6Ojo6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo6Ojo6Ojo6Oj46Ojo6OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERDR2RoZ2dnZ2hNQkNDRERFOS4uLi4uK0iFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTQ5XGBfX19gYUE1NjU1NTcnGxwcHBwYO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fn1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaIiYiJiYmJh4WFhYWFhYSDg4OCg4KFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkJCQkJCLjpGRiYeOipCSk5GLkI2Mj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjY2NjY6Ojo6Ojo6Ojo6Ojo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQi4WHh4eMhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCIhYWGhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkIiFhoaHjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp+fHZ2eHx8e3x9fX19fX5+fn5+f35/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4SIhoaIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6fHp6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pio6KioyKjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fn9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f3+Af4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/gICAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f3+AgH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f4B/f39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJWVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5KSkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX1+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSk5OTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpCSkZGSkpOHhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCSgoGSkZGSjnWGkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9+f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcISRj5B8dYiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj4+QkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fX19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzb4qPiXJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXZue4+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc21ug3p0doCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGRUhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39+fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RiXmRfYmtxZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f35+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYl5sbF1mZ2dlYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hJSkhISElJSElWcHN1eXp7eXZ2eXp6e31+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWVZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaa3dtYm5zamJaWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fX59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtrcmxhbXRyZ1FRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXGRva1lpc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgIB/gWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRUlWY2drb3BubWxaTUxOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICCb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDR0hJTltnaWdybm5pZmRgX19YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PklaXVtdZmxua29tbWxraWlrY1JHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+AgICAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1KW2lubm9qb21ramxsZVBHRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYGCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ojo9R2Juc25ubGtsZ1RCP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VGRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PElfc3RxZlI/Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkJsfWk+Ojs+PT4/QEBAPj9BQEBAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQURGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APFxuQD5ERT8/QURfZDw9PTs7PT5BQUA+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJDRUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT5BOkllPTw9PDg6Oz8/PTw9OzxAPT08PT07PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUdISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw8PUlMRkZ1d003ODg6Oz4/V2pBOzw8Ojs7Pj8/PT04Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3J5STtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PT0/QUNAPDk7QT8+PkE9Oz9BQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnlrYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVudH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUpKSU1NS0VDRkZHRUdFRUVERUNBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTE5PUFBNSUdJR0hJSUhIR0dISEVDRUVFRkZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSEpPTk9PTUtHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiIRWbISHhoaGh4iIh3xPWGRMSUlHR0REQ0NAQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREZHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGhIKGhYSEhoaGh4eGinZvaVNNQD5BPz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjn5sYmFSPjg/QDc3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouNjG9gZGVZQVc9NTY1NTg3MzU2ODo4NzY1NjU2NzY3Nzc6Njc4ODk6NzU3ODk3OTc3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJioqJiYqKioqLiouMhmpma2lmUTc4ODU1ODg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Njg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeHiIiKioyLiouOhGtsa2I/PD4/OTk7PDk6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKjI2OgG1sYEVERkZCQUFCP0BDQUA+PT4+QD8/P0A/QD09P0I+QEE/QD89QEBAPj9BPD48Ozo7Ojk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t9fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKDgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uMjYyNe21rT0tNS0pHSEhFRkhHRUNBQEJFQ0NBQkNCP0BESEVDRUNFREFGRUZERUZEQEI+PUA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyMjI2LeG1hbWRNT0tLS0lJSkpJRkRER0hHRENFRkRCSElLR0hHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjY2MjIyHeXllYU9PTUxNSklKSEtHREdJSElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7Oz06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjIyLjI2GaVJST05OTU5KSEhFSklFS0lHS0pJSkdHR0tMTkxNSEhJSk1RTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIyMjIxhVFVTUFBPTEtIR0NISkdMS0dLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSkxGR0hHRkZJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIyMjn1aWFVVVlVQTkxLRUZGTE9OUFdVUVBPUVNSTVNUT01TTFBTVVZSU1JQTEpNTU1LTkdHSkZGSEpFREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yMjGpaWGxjR1RSUlFLOztSU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl4ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqLjH5hiouLh25dZVY7WVpZVFE/QFZVWFxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFVUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6enp7ent8fXt+f359fn19fX5+f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKjHpvcFpcXVxTVVNWVlVbWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f3+Af39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeEi35nWlpcWlVXVVdSUVdWY5aAUmVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbU1NRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn6AfF5SV1lWU1ZTUlFMT01LZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fn5/fX19fn19fn9/f4CAf39/f35+enh3dnN1e39/gIB0a39+a3J5XltWVVNST0tGQ0RBTl6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmJh4aDh4eHeW9yWEtNT1BNT0xKS0RFSUVDPlRkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eXFlVUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ2YF5NRUBEREREQ0FFUEJDQUM9Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn+DgIODgoCCgIKBgmxOSEBBOzw+QEA/QD9rUEpgRUZISUVCP0dMTkdNUVVJQUU+Pzw9PD09Pz0/QUNDQD89PUI+Sk5HVW51dHVzdHZ4e3x7fHx8fX19fXx+fX18fn5/f3+AgH9/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVlVXUVFXVVBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZURCQUI9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtNV01IR0BBPDk3NzU5OT07Ozs4Ojg6PzxCSD9cc3R1dXV2d3l8fHx9fHx9fX5+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXVpJSFBSUU9NUFFOUVJUVlhTU1lUT1laW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEdISEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1MVFRTUFFVT0xSU1RYWFRUWVJNV1laVlhYVlhZXVdXWGhza11WYXNrYmFfXmRhX15ZVFFOT05MSUhKTElJRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTlHbXJ0d3h5e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5aX1tWWTtEVlhUW2ZKTFBTUk9NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz48Ojc4NzY1OTk2NzY2NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlTVU9KR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBTTUlMSk9SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0hGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVVFQUVBRTlFPUVBMSkxMT1BPTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR1eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nVFFTQUdVUE9RUVBOTU5NS0xLS05PT1FMT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT09NUVNMVFVUWFdVTExLSTw5ODc7PkA+PD1BQEI9PkVIR0NFRklHSkpARkFBQEZIRUpPSFFSYlxRUFJPU09PUExMT01MTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZFP0JDPjxCRz9CP0FkcHN3enp7e3x7enp3e3d5fn58e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0FAQD5ARElFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xNS0xNTU1MTE9OU2ROS0xSSUlJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7enx6d3R4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxAQkFBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRHSUlKTElLTElKTU1PUFJQS0dDS0dDQklJTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSEhHSktJSktERkI9Pj05OTo7QEI/PUJCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISUxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS01KS0ZHR0pNTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjpAQ0A+QkNERUlFSUpMRklJR0ZGREI7QUNDPkBDRENER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSEhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NCRUBEQT4/Pjo7Oz06PD5DQT5BQ0VGSkZJSExIR0dHRkVDQD1ERUI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIT0tDSU1LT01PTk9PTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPUJBPkE9Ojo9Pzo9PkBCPkBCREdKRUlGSUhGRkdFQ0JBQUZGQ0JCQkRFREdHSUZMUUxJT0pKTExJR0hFR0ZEQ0lJSEtKR0tSTUJOTk1QTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXV2dnZ3dnd3dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREU8QUBAQzw4Oj0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFSUFBRTk9NTlBNTE1TV1ZYWFVYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc6Pj46PjpAQj4/P0NFRkRGREVIRURFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR05LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFJPUU1OUU5NUFdaVlpZVlpdWVhhYGFgXmhlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bm9ycnhOSEhHSURCQ0hFPEBFQkU9ODk+Pj08PEFCPD8+QUFGQ0VDQ0lEREVFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5LT05PUlVWT0tVV1NQU1FSTE9RUE9UWVpZXFpZW15eXWBjXlxhY2tiYGRmZ3KFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD9APz4/QkE8QD5BQUZDRUVESUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTUxMSU1LTk1NT0xQUFFVVldPS1ZWVVNSUVFMT1JSUFZbW11eW1xeX19hYGFkXWNgZWZgZWhqY3NzZmpnZ2tvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZJRklGR0RJSUdJSEpMSEhKSklMSkZKS0hJS0pHS0tNTUpKTU1OTk5QS09QUlRYVk1OVFZUUlJRUExOVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW5zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTExMTUdDQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdDSElHSEpGSUxISUpNS05MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltbnNycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdISklJS0hKSk5MT0tJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVLRkVKTUxLTExHR01JR0pLSEtLSUtLTkxOTExMSUxMTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnR0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdCRkNGRUZFRENISEdERUtIR0xOTkxNTEZKTkhKS0pJTEpKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncHBqaW9wcHJzcHFwcXBycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGR0JHRElGRUVCRklISEVITEpHTU1OS01OR0xOSUxLSUpNSUtKSktPUE9OTUxOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNHREhHTEhFQ0NIS0lIRkpMTEZOTExTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFBPkREQkdESElNSUZDRkpMSkdGS05MRU9KS1dSS0dLSkpOSUhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERUNGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElHS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSkpPUFFkcWlUWVdcW1xWWVtdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZFQUVDQERIREZHQ0lLTEhGREdLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT01KUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSS1lhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGFhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CRENCRUlFR0dGS0pLSEVGSUpLRkVISFBLTU1KTVJJR0VBSEZKSUtMSkxKSEZESUZERkdFRkpIQ0pOS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOX1xeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNHSEZIR0hLSkpJREZLS0tFRklKTktOS0hMTkdIRT5HR0xJS0xLS0tJR0RIRENERUFGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFYVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZJR0hHSEtJTERES0tOTUxLSEtKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQj9JSkhPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUVtXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHR0lHRkZJTEpORkRLS01OSkxJS0pISEZCSEhRTUtLT0xKS0lHR0VEP0VDSUlCQkdGRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHiIeFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktKTVBFRklKS05MTElLTElIR0RIS1FPTU1QTExKS0hJQ0RBRURJR0NCR0ZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV2BfVFBPT09YUVxbW1xcXl9iZmZlbGVvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxMS0xLSUpHRUpOUVFOT09NTkxNSEtBREFDREdFQ0JFR0JNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NT1RTWlhYWl1cYGFkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSExLS0tOTVVOT0pKS0dHS1BTU05QT05OTk5HS0ZgRURfTEVmZEVOXEleW3JtT01VbVlMRFFgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRkdGSEVFS09TSUpGYFRISU9KSU9NUlFMTUxMT1JVUk9PSUxNR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXJ0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW19gYWBhXWBhZ21wbGBwd3R4gYGCg4OCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJS0VRVkxLTklLUlhXUU5PT01RVE5PUU9LS05HTVBTW1pTUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0dgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0hRUlRZV1ZQVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVib3ZQZWVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en5seHp/b2hvWXZ2anZ1cIBfcmZ9aWx4fG9eX19iYVtdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J2eX6Bc3V6bnx9eXhybk5LU3VOQ0JGUFBISktJS1BPT09NUFpgWldLVFdQYV5SVlFZUkxQSVNUVlhXV09VUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX9ucXBre3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbGB2dWtpdXt6bX54a3xwXF5eYlteYmRkZ2VlZWJaY2Npa2tyc3J2Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ua21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZUVFRhX1BOTUtUU1RRVlZOTkxNT1BKSFFOUFVMS0xTVFRTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFhaT1NVV1hYUl5ZV15WVFBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09MTVZUUU5VU05PTUxRUExKUVFLUU1LS1BTVVNRUVNTSUhMTk9RUlFRUVRWUlhXXFdTUlBSVFVWU1pRTlNSV1ZUWVZVWlZUUlVUVFRXWFZcWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTU9VU05RTk1OUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11gYV5bYmJjZ2ZlZGJYX2FiXWBnZGZlYV5fXV1eWlpgWl9nYF5dXWJoa2FnZmhmZGBiY2FPTE1MUVFMT1RPT1NRT1FbWVdXWFtZWFhWXGpkVlhZWldWU1NPSk5WVFBPVFBQUE1NUlJQUlhUUVFPTU9TVk9YUlRVVU9OTVFUVlVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUV1ZWVllUWFhWU1JZV1VaXlldX15VXlxeYFxbX19fX1piYmRoZ2RkYVhhYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xZWltkcW1oZF9bWFZVV1FMTVZTTU5ST1FST0xRU1JVWlVTUFBNUVdXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlFOVVZVW1xXUlRXVldYVlRYW1VUUlpYV1xeWl5fYFVhXGFhXWBiX1xgXWNgY2doZGZgWWNgYV9fZWRfYGJbWlxbXFlaWVhXXFpcW2BeX1teXmFgXmNcWWBaUU5PTlZRUFRRT1RUU1BXXFxcWF5cXldcXmpxd3mAY1xbVVVXUU1PVlNOUVFPUlRSTFJUVFlaV1VPUk9TWFdUU1VSUlpPUFNSVltWV1dUVltYXF1bW11WU01UVVVcXFZSVVZWWFlTVVpcVVNTXVhaXV5cYGBgVmFbY2JdYWReXGJhYl9jZmlkZl5bZGBhYGBjZV9iXllaXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRTlJaU1JRVFJUVVRLUldWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWVNYXVheXVlaXVRVTlVWV15bWFJVVVlZWVVXWlxWVFdeWl1dYF1iYl1ZX1tlYV9kZF5eY2NhXmVmaWRmXl1kYWBhYWJkYGJeWFpfW1xbWFhYV1dbWVtgXFtbXFtYWlteVl5ZXVFPT1JaUFpUVVZWU1RUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUVdSWVhZX1taVFVWWllaV1haXFdVW15cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU05QVllRXVVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhXWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSV1NXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWVxWV1hbWltZWVpbWVdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYltmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlbWVVXVFdbWlpcWlhZYFdQVV5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1pdXlldVVJZV1lZXWJaXlZXW1xbXFxbWlxaWl9fYGBkYmNkZGJkWWFmYmZmZV5hYmBjXmJjaWRjZ19nXmFiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW1xaVldYWVxcXV9bWVtiVlRYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5YVVhXW1tfYFxfWFlcXF1eX1xbXVlcYGFeYGVjZGVlZmJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZcXV5gYWBfYl5ZYV1dXllcXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRaaWhiZmljZV5iYmNhYGBfXVxaWFtZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1xdWldcXV9gYmRhYmFdYFhiY2JgY2FiXVtcW1hXW1xfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVlUWF1dX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaGJoaWVkYGJhY2FfYF9dXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWFgXltgYWJmY19dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBaZmdeYWhoYmhoZmNgYmBjYl9fX1xdW1pbWVhYWFZaVlxbWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7enp6enp6ent7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3p6enp6enp6e3t7e3t7e3t7e3t7e318fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIkMzT0tLS09WehomJiYmJi42MjIyMjol/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIqU3ebk5OXk56WJjIyMjIyPkI+Pj4+Qi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvb29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2DhISEhISEfnx8fHx8fHx9fHx9fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnd6eHp6eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3l5eXl5eXl6e3t6e3t7e3t7e3x8fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2eX18fX16fHt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjYyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fX19fXl8end4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4SEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3dnt8fXx7enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp5en18fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4e3h6e3l7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgoGCgoKCgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mFhIOEg4OCgYGBgYKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHl5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veHl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEgoOFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4OBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYGAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoGCgoGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0dHR0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm5ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoKBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzc3NycnFxcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycXJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubm5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoCBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXRxcnJxcW9+gm5wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwh4hwcnFwdJqBbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF9ooNvcm+Nn3xvcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFycXWeondxd6CcfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZipkG+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nyc3Ryk6mke4mhnXxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3d3h4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eXmgtKmmqamXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf39/f359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7iq+kobWqrKN/e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2ZpZaisaCZp5R9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgZycjaCwoJ+in4CAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5uQmLGhmJWdhX1+fn6Afn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJioyOjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+f39/f39/f4B+foCBfn+hq6WWpJubmKKgh39+fn+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgYGBg4OBgYGCg4KEhIePobKnoaCZnZ2mqKypoZqRh4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNn62xppuaoJuenJyeoaSjnZSIg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoOKl5mXlpigm52enZqal5CJhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBho6Uk5eanJ2clY+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5OSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDg4iQlI6UmJGHgoKFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkpCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgYGCg4GCgoKBgIebiIyHgoOCgYCAgH+BgICAgIB/f4CBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gIGAf4OJjoCBgoODgH9/f4CAgICAgICAgoOCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDipaIhIKEgoF/f4yVgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhoSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIODgoOBgYSFhIODg4KCg4SEg4SDg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSkpCNjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgZCMg4F/fn18fYycjoCCgYGCgoWUlIyBgoGCg4KCgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYSFhYSDg4SDhIOChpSUkpSSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgoGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDg4OCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf319fYCDhIOCg4SDhIODhISEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaGhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKNioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/f3+Dg4SLhoSEhISFhYSEhISEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICDj5eGhYaFhYWFhYaHh4aGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWDg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4iIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af4GVlpKPiIiHh4aHiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357eoqdp6SYjImLi4iJiYmJiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7fZmnpKKYj5WLiIiKiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4OEh4iIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn18gZygnZ2cj4aFhoeHh4eIh4eJh4eGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6g5ybnJWEg4KDg4SGhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GEhIODg4KCgH19f4CAgX99fn59fH19e3p5iZubl4WAgYGBgYKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goSEgoOCg4J+fX5/gICBgH59fX19fn18enp7jZqVhYKAf39/f4CAfn2Af3+AgIF/gICBf3+AgYF+fX1/gIF/f35/gIB/gICAgH+AgoCAgoGBg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp7j5ORmo9+fn9+fn9+f4B/fn9/gH+AgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp6enmAjIyMi4F/f35/f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f36Af39+f3+AgH5+gH9/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp6enl/hYCAgYGCgICAf3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGAf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fHx6enl5eXqBgoKChYOBgoOBgIKAgoGBg4ODg4GBgoCBgH+AgYOBhIKAgIGAgYGBgIGAgoJ/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYSEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eXyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5eYCCg3+DjISDhISEl5eDg4SBfX6BgYKBgoGCgYSGiIyFg4KCgYSChIOCg4WEhIWDg4SDgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl5fIGBfoiVg4ODhISUk4CAgX9/f35+hIuAf4GAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CAgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6e3x+gYOBgoGDgoB+fX9/e4iRfHyOln99f3+ChoqFg4OEg4KDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYOEg4GBgoKCg4SDg4OBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXl9fX+Af4F/fXt7f359gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32DgYCCgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH9+ioJ7ent6eHp7e3x9fH5+f39+fn5+fXyAgYB9ho+Bfn2Cfn9+gIJ8fIB/goCBgH59e4qCfYB/foGAgIGCgIKAgICBgH+LlI+MjI6OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4WEgIaUiICCgYGBgYB/f39/gH5+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX+AgX1/f4B/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gpSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx9fXx7fXx8fHt8fHx6enl7fHt9hYODgIGBfoB/f4B/hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYCAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36MhIGHfn18fH9+goJ/fX19fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjoyPjYyKhoSFhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOBen5+fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fYGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgIKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5+f35+f358fH18fH18fn57fHt8fHx8fXx9fH58fXx7e3t8ent8e3x9en1+fn+AgIOHiYmJiomKiYWIko+NiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg319fX19fH19fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt7e3t5enl5eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18fn58fX18fX1+fn1+f3x9fXt8fX58fHt8fXp6eXl5eXp7fn6AgYOHhIiPjouKh4WEhISCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGCgYKBf4CChIF/foGAfX6Bfn1+f4CAfX6AhIB+fn99fn19ioV9fn99fn6Afnx9fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY6LjIiFhYWEhIKCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH99foB+fX5+gIB/gX9/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fXt7e3x7fHx9fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgYCAgIOAfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICAgICAf358fX19fX5+fYJ9gH6CgH1+gIF/fH5+fX19e31+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYCAgICBgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISEg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn19fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhISDgYCAgH+AgX59fX5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn59f35+hYWBgYF/gIOBf36BgH9+f36Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX+Af3+AfX19fn99fn9/f359fnx9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4CDgoOBf3+BgYGCgYGBgYCBgICAgICBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH2Afn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhIOBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX59fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWFgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p9eXt5eH9+e3x8fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f4B/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB+fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1+gICAf39/f3yAf3+BgIGAgH98gH9+f35/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e3+FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Afn5/f39+fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH58f4CBgICAgIB8f3+Afn+BgH9/fYF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7e3t8hYl9e3p3enx9fXx8fX19f358fX5+fX19fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgoCAgIB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+fn18fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgIGBgH+Af39/fX1/foCAgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/foCAf39/f4B/gICAgIB/gYGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh6gYF4eXx8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fX17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fH19fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBgICAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fXh4dXh4eXt8fH17fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgIGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf4CAf4CHfn58e318e31/eHd2eXl6e318fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgIaDg4SBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgH+BgYGBgYOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f317fX97enZ6eHl7e3x9fXt8fX19fX5/gIGAgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgYODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOBf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSFhIKDg4OEgYSDgIOAgYOCgoKCgoGCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhICChIKDgoKBgoKDgYOEg4SDhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4SDgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYF+fHl8enp6fXx8gX16fHx9fXx6e35+foB/f4GBgICAgICCgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGDhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOCgoGBg4J/goOEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fn1+fn5+fn9/gHx9gIGCgoODhYOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4OBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f35/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYuJhISEhIWFgoeGhoSEhISFhIWEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYB9gXWBeoR/f39+hYSCg4OCgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn9+foGDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+f35/goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYSGiIaGhYKGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cHuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fX9+fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydWaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIWFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WEhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fH99f39+fYCBg4OAgoOBgYSCgX+BgoB9f3+Bfn9+fX6BgH5+gYKAgIKEh4aDg4aEhISFh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhYSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3B5fX1tfXVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fXx/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYWFhYaJioeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGEg4SDhYOFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgoF+f357fHt+fHx8fX9/fX1/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiYaEhoWHhYWFg4SFhoWEhoaHhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIWFh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4SEhISGhIaFhIWFg4aGhYWFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH19f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYODhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoeFhISFhYOEh4aDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIiYiFhoiFhoeGh4aHhoeFiIiHh4WGhoeFhoaFgoSEhYaFhYSEhIOEhYWGhoaFhoSGhYaGhYWGh4WEg4SEg4SHg4SBgoSFg4GAgIB7e35+fHx8fn18fHx9fnx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoaHhoeFh4aIiIeHhYeHh4aGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9fn58fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4eIhoaIhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH57e3t6e3x8fHt7e357fH17ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeIiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaEg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf35+f35+fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYWFhISDhIKAg4GGgoGCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIiHh4aHiIaEhoaGh4WFiIOEhYSGhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIOCgn2BgX9+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iIhoWIh4iHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SFhoaFhYaCg4OFgICBgICDgIOAfIGAfn6CgH2Af4F9gHx9fn1+e359fHt5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFhoeGiIiGhYiHiYeGhYWFg4aEhYeDg4aEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B8gH99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhoSEhoSHhoaFhYWDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfn1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6enp7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoWGhoOEg4WChYGBgH9/gIB+f4GBfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCDhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGhoaGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfYGAfX6DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9+fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChoWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1/fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svL0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2dvc3Nzc3Nzc3dzb29vb29ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbLzJWFhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6mXgIKCgoKCgoKBgYGBgYOLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXy8xuUFNTU1NTVFRUVFRUTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIeEhISEhISEhISEhISIZ0BERERERERDQ0NERENGU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18vMcVVYV1dXWFhYWFhYWFGh8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKKhoeHh4eHh4eHh4eHimpGSUlJSUlJSUhISEhHSldXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fMzXheYWBgYGBhYWFhYWFapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjZBzUVRUVFRUVFRUVFRVVFZgYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzMzHxcXFxcXFxcXFxcXFxcrQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs7PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/PzcrKysrKysrLy8rLy8vLzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M3Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/O0tLPzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dbX19fX19fX19fX19jY19jY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/P0qee0M/RpaLQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZuz1rOeo6bWsKCiqtLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6CqrtCdmpOdwJ6YlpzHz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I6NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrTAmKGctJicop6vsdLPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9COjc0Ojo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5m1tpmWrbmGnpaws6nU0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8qgo7/KnKWMp63Yqpmq1M/Pz8/P1aWZtq2YgaCWeJuEnpOj1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0Nalmbaum6iInHmfqYWZpdXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpZq2t7WvppyKva2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njk5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1qaatMajl5edpaeWmJq61dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0telm7HYn6ukm9Cfq6Sb0NLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HUtYLD1cWQjbfXwo+Nu9TR0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVUxGQjw8P0ZFR0tJPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHD1NHUx8PV0dXFxNXR0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRExMQT03NzU6ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZJRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7Oz4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJ2dnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5KUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ+hn5eRkZCUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaampaWjoKChoaCZkpCPlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaCgn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WTlZmcmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqKjpKSkpKKhoZ6bmpmWprmfmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKOmoaKhoqGgnpybm5uZo6aRnJucmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCmsa6goJ+fnpyZmZqana1heZ2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJuam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goKCfppKVrZ+goJ6bmpmamat7Q4Gfnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp+hYZaonp6cmpqbm6SfTUmEoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuZp2xaoKCbmpqbnZyvbktMhqGcnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKWEVHSimpmanZuhoWBYToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgi11gkZqZm52co45lWkyAop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiZnpleX3OVmpydnaGAZVpNf6Ken56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZibYWJgfJSenJ6Wc2NVT4Ghnp+fnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmYoGpcWmF7m5yeiWleUFSInpuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qalpJ4c2tYfJWYnopbVFBZi5KOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6Vn5+SgKSnmaaaeVVPZIeHgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CFpJmLemKOo5KYc4WFaHV/gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+hKKHdmpQcZuNildueXt/fnyFjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZmYck5HSXOSg4BKXG5vdomFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY+jiEwzMjt5hHVyPz1Wam2BkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6Knm19FZE49eXdnZEg1NlRucY+Pi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mproxLgraGQHt7aGNSX3FRW2+KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKJ0aMXSqEmAlYx9T2yKe1pggKOop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkp6eZnaSlo6KeYoK4v6qFr6OanXdHV4FyUnOUoqKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqacnm+ClLOIttamnLixYlC0o1ZkkKGeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+ro6OJd391eNO7qZOeqGxVoapoX4enoKWioZ2fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e1tLayrLCtkIh/bJjHxJecqpJ2WmlzdXV/kqWpp6Sgn6ObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gqrK3u7y8urrCubSznYR0XlGdsK+kopGEd25zcXd4eXyCiY6UmaClp6ympZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW4w8nQ1NHMx7yvoYxtY1JDg41+foB5dW9tZGRpZ2pxcnFxcXJ5ianHx7yip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PEx9vk49fHua2ilIRvV1hQRGFyZ2tya2hjZVhXXFdbYGhpZ2RgbJK6wL+5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7Lz9TLuaWYj4JuWlBUSkNcZl1haGRhYWlcVFhVV1hZW1hffaG4uau0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudXJydXJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS+w8HHy8m6l3RfUk5PUkc9XmxgX2VjYV5kY1RVV1ZUVV1/p66vqqirrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5t8SjakxDRUpEPVlhYWRsZGFcZV9ZU1BQVWGLt7msrqWko6ekoKClmam0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZ3J4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwbOQVkhNRjtJWF9obWhfXF9ZWlRQXY2qrLi1sqypo6GtqaynrZ+stLS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dWVmampoXmtvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCyKN3YEg/P0FeXVxrZFtYVlJdiKi6vrq8urysraapu7q5t7+ztbiywca6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aGpqdG55bF5kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxsbHwrWBXVQvVVldbF9RTVeEucrHwsTGwLy+tLCwsMK+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwcLCxcacTlKAiZVVVIO1ztLFtr+/wL+6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVnZGxlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvrzFp3x0gJGUdbzOx8fQwK+9vbi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFjZGRqY2djW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8yc/Aur/AvLvFvbrAxL+9vrFzYYCRiYrPxL/Ayb6wwb+6t7u+ubW4tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNnamdnamZqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdSMuL+7w7W6x7a1uLq8uLm2s7aejXSEyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmcGplbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/DdqjMvce3ubettrS3ubO1sbvGx5ZCfMq+v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucWdxa3RmY25gXFVIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrXOAu8jPwsC4rrS0u723ubC9w8iMRnbNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudW94Y2hjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0Zhwc6zR0czKxLW6v8TIvr60v8C/d1Nvy8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1sdGxsbl9jX2JiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKycGGcXOlzMzLzcrGwsPLzsG8uL26sG9kY7vIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWNbX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqbK2w7+leHV4m8TGy8jBw8DAycrBv7u5saB+c2ytyMXEv8DBv8vHw8DIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO1uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEt22tzr22ucC8rH1uaG5tcoGVmHJ3fJe9v8bAucC8vsXEvb24sbCZj36CnMrCw7y9v7/Dw7+/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsbess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cG9qXGBhWlNRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbJ1gbO9trXCpYdpWl5gTVJbWm5zdoGfuLjCurO7t7u9v7q7u6+kmpeIkn7AxMO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d25yYV9mXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmnhHiKoK+1nWplZ1ZZYElJTVBTbHaGpbC3vrmytbK7uby2ub60lZyml6FyrsnEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fqoh8dYygmGBUQ1hVR2FqVk9FSmCNoKyvtrq1tLKsvLm4tbjBvYqXsKGmc6XLwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtsSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXlNPTkE/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4vrSQgniIj29OSj9kWUJOd4CUak5AXIGvtbO1srSvrLu6uLa5v8V1gamdmmSnv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ3c211amxdXGtUXlxQTkhER01CR05HODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFOh1lKSlh3jYFjQFOjubO0srCxrbC5uLa7t7q8j6Gxq6Rzq7Cpq62ro6ignZ6el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWh1dG9lVWFkV11ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKqZmZVoTkBSeHBQSUlLZ5yAWURSrruxrLOvrqyttraytLWuqKaempudn6aonqCoqZ+hp5aalpeOnZOOkJaNl5ukqKCgoqKhpaWco6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh4g3x2f3pjd21uXVFpVVBPR1BNTUNQUkA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Cq6W9aEVSnYJRV0lKYEpUjWBjYoGutaqytK6qq6+wsrOtpZ2Rl5OPl6CfoqCco6SfnqiUmpWWi5aRjY+Xkpidoqqfn5+go6WonJ+goZyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fIB1dn1ua3tkaVZSZE5JSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaCqxr/LoFBBc513UG5LS2NmdHNfWl5wkLGvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqklpeXlY+RkZGSmpeboKSqnqGhnqanq6KfoKefnZ+jpqieo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJfIB+d3l8ZXl6YGJTVmFISUtLU1RKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfHjldTSmWjWmV+b3JcUWtjW2RfXGqPtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXopiZl5eYlJmYlp2bn6WlqaCmpJ6nrq6qpqKxo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbGZbU1taTVFLT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpIx5VWlydnVwY3Z2WFdjYGNnWFdWZ62urK+nn56ioJaQk5ugnJmXkpOfnKGjmp6blp6anpeaop2koJ6jnqSorK2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpafm5uYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dmp4dV5tW1JhSVJWSEZWV0pDTUg9S0k4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCjgG6CcGBjWExbU1pNTFBYUkdMTEeYrKqppaCfmpKRlJiYlpaWjIiLjpSdnJ2cnpadmaafoKelsKmmraKqrbawtbKwrba4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21oblxYXENXTkpHTUhDRk49Pkw+NDw6Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYphV15lYFdNUUc+Pj9DQz8+QlF4qa2pqqagnp+io52enpqdm5STlZSenpiUhZ6doJmro6uxr7mxsbCxsLq9vLy5trjDvr/Cv7a6u8DDub27rK6nsa2xwra4wsbAyMrAyb+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqquo56sqLayraOwpqGjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhFSlBJP0VCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V8X15lYFFHRDxDPkU8Pzk2Tn6qs6eko6KgnqWspp6XnJSRmp6ZlYyKhoiGeGyKpaKiq6uyvLbDvb6yu8HDwsW/v8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Aw77HxsK4xMrJxMHHv7q0uru1u7ewtrKru7KvvLe/u7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV05FPklZfG9iQj1cjq6soJmbnJ6emZeXmJKNj5eXlI+NkIyCg4J2cnBtcIelrK20uMS6zcfLvsLMzc3Mx8jQzMzMx8rFxczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsfGysjPwMnRzcfGyMbCvMPBv7+/tb6zrb/Aw8PHxcfEr7+5sri9xMLCury8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nXlpaRE9NQ0VQSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9Lhp6lmoSgsq2jnpyfmpiXlJOUl5GQj4yHhISIhoOAgYGAeXFyb2t4ora7ubzKwdPS0sjNztHT0dHQ0NHRzc3O0MTN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3J083O083GycrKwsbMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArrCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZVZYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnGNUTEpEQz9DUq7RvbKvppycnKCkoZ2alJSVlIp9eHFrZWJocnBye4WKgHVwbXFyb4ScrbzH0dHX1tXR1s3U1tbT09HS1NTSz9HD0NPW2NXV0svJztDLxs3SytLV19nW2NPW2M3Sys/RzM/RzdPQwMnIy8TMzczPz8bHyLbAy8DSzczQx8rIwMTDyM/N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVyY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqJbSUBBREFGUXayr6aalJefnJqgoJ6bnJqViXdpY2FfX19fXl9fXWFsdXNwcG5scG91gHeYuNXX1tfW09fP1dTZ1NTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ19fY0tjS19nV1szPz8nN0szO0cDHxMnHz87S0dLIzM3Ay83G1M/MzsnFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNFQ1NNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZkM4PT5EWIKqqJ+XlZeZmpyfnZibnJN9cWVjYl9fYV9eYWBeYWBfYGVtcHBta25wdHl2aXypzdTY2NjRxdPS18/TzsvSzdXU0crPzNPW0tHWzc/V1dHF0dPK0NTV1s7T0djY2NfLyM7Eyc/NyszAycHJys7O0MzQzs7Mz8/IzNDRy87Lw8nHys3LzNLTztPS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRE1ZRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksntIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5fX15cYm1xbm5ycnR1enFibZ7H1dTQpMrPztPKzc7EzcrS0s7GzszN1MvO0s3K1tbQzNHUy8zQ0dPKztHV0tXWysDKwcbNw8jKw83ExsnLy8/Lzs3QztTMxsnQzcnHy8bHwsbKzM7R0cfQz87OzNDFx8G4ub3Dwr3DubKyvrC7w8S1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElRUUI7RD87Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3xlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFwcXJva3F5dGVun8/Nm5fWycPIyMXGvsLFzs7HxcbNytHIy83NxdDSz83M1MrHys7Px8fP0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNyszQyMXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxcXIu8fDycnCz8G9vL+wwcnHub2qsbKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KFoqqTjY2Wj4WDg4OBfYSEfnNfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG5uaWptbnpnVYDAonm7z8O4v8K6urq4vcjFwcPAw8fKyMjJx8DFy8bIys3JxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbGvL/Kw8XH0sXBycDKysbIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdCR0RMREZSQDU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bF55fJ+RipKWhnqAhIV/dXh1cnBfWltdYGBiY2RkZWRgW1xeXV5eYFtZWlxibnFuamhpbm1zeVZqlHurw8XArrW4sLGysLDBu7u7ubjAwcHEvr25vb+5xMnFxsK9xsC3u8PIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMyLLHycPOzMDFw7+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRUJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys/FycXHwbrFvayupmBjdoGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXWdycGxmZWxtb3t4XmaSx7m/t6yvrqWorKqlt7O1s7KztLu1vbG3sLWusrvCu8HEvL+6tLK6vsC4yLi0vLbAwr24vcfBw7u1r7O1u7+0xbi7tay5vb7AvbG7trC3urPGvbevvL+1t7XFvb7DxsDExsbHy8W/xsa7x8u/z8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJlbZ2+IjoaIiXp4foWGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXlxdXlpbW1xfa29tZ2Voa2xvfm1ouri2s66oq6WcoKelnKmqsaypq6mzrbWwsqitpqyzu7q2w7m6ubCqtLm7s8K5r8Cxvby7tbvHucO3raqosLLAtri9sLGosrO1u7yrrranrrauvLKxqriwrruuu7i7wMG+usO/xsPFwLzGwcfKuMXHxb/Hw8O5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzCurO1tcOuqrCSW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXGRtbmZlZmdpa3B6ibevtKyjoqSkmJ6inpiao6mso6ehq6msq7Cjpp+qrbS2sb24r7evqK24tLO8t7O9sLi5tbK8wbLAr6Wpo6uxs7OovaqrqKusrrW0pqmuoaWvqbOmqKiupqi3rLGzt7q6u7K8vr++xL+1wcDHyLe/v8W3xcPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8LLvrvJtr3DvrrKt8HEwbS2vLaxr7W8ramrkmNtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZmtlY2VkZmhscYKlpKqimpmeoZGaopiVj5+gp6Kin6Wlp6Wtn5ybpKassrC2t6ewrKiqtKuzubC2tq62urOwurqxtqSgpKCmsaisqbmqpaenqKezraCnp5+cpKasn5+npKGhsa2trLK1s7Owtby2u8HAsru+w8GxubnCs8C9wLW4vL2+vMLHxMPEv8DEoIR5cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhbXV5kYmFkZWVkaGpshpynpaKWl52TmJ+Vk4mbn6Clm56fo6Wip52aopufqq+tsbWkqKqprKyktList7Css7Wvs7WvsKqfnp+korKlpqq4raKmpqCorauZn6CemZ2fpZqZo5ycnrCprKiqq6ytsLK5r7i5urC2vLu6q7OyubO9tLeysba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4uL+3ssK0sbu7rLm6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dXWFdaXWFjY2RkZWZnaXGJkIKTq5eWk5edkpONmZ+fpp2bnKSmoaSbn6GbmK6tra6yoKSiraunobWwsbKsqbCzqLqzp7ahop+co6Gto6Kqtquio6adpqajlpmdl5manZ+al52cnZytoayoo6Smrauzs6q1sLKrsrm0r6qvsrKzt7Ouqa2usriwura6vb+3s7GUhnp1Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMHMyMa/xbbBwMfOtsDDvbO5ubK/trG5u62yta+fmqOqoZSaj3h/g4R/eG9xdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXVlZYV1hXVVdhY2RiYmNjY2Zpc3NHTX2QkJKTmpOWkZSdm5+blqCgqKOenqicm5qrp66wqpyjo7epoaCuqLWqp6eusaS4sKS3oKOcmZmqpqGarbmwo6GknKOgoJOVoZSWlpyZmJaXnJWfqZ6qpKKdo6qqsa2otKyqp62zsKWrrrOxr7Cvr6eoqLKusrSwvLS6uK6jlIJ6dmVfYVdZWFNSVEtNXkxQTEdITEtFPUA+PUI8Ojc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rZ2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1ZVWmJiYWFiYGFjZGtyZWduiI6Pj5aUmJKSmJ2anZWfnqalo6ann52fpqCqr6afoaO2p6GhoqmzoqWopbCmsa6rtZ+hnZaVqaGilK2xsZ+io52emJyTjKCUkZOYmJKXmJiXnqebp6GimqSlpaukpbCnpaOrrK2mqK6vr6uoqqqzpqarr7Sxrry2sa+vn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLuxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xcSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVlJUUlRfX15fYF1fX2FjaYGPhYWLiY+NjpeQkZOhl56Vm56koaylpKSjo6Kcqqukmp6lsaqhoZ6lqp6oop+trKqprq2ioqKVmKKanJCrqbCbn6Kfn5eZk4qdkY2SlJaQmJiTnKGjnKSgopWgoqSlm6OrpaKkqqSrraWusqmmpaamtKaqqK2ztbS5uq+qrJ6Mc3FwYFtXVlZSR1FPSFpcT1JKVEtTTEVHSUM4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm8sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU05QWV1bXF1dXV5eYWNsiIp+i4GKi4mUj5CPmZmhmpqfp6iqqKunqaajmaWvpJWZpa+poJyZm6CfrpmcqrOfpqafo6OhlJSblpaSqamtm5yfoaGblJCMmI2MkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrilo6SjrK2qqKuvtLeyvbWzq66YhXV0aVtYWVNVUkZYTFFbWE1VT1BMUVJJT0lCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7euqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FZWVlZXFxcXV5fZHqGfIR5houFjYmTjZSXn56Znqqopq6sqbCkqJqfrKCVlaSop52YkI+anq6WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6el46Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9p5+jrLSrrqevtLC5tcCxrrCrkX5ydGNWVFVOUUpHVlBSUkxMWE5LTU9SR05LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxt7i8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRRTU5NUldYWVhZWFtbXGBpenR5b4KHgouFk4eRkZWYl5ynmp+qpqarnaeZoKWbko+fo5qXl4aFkpukj5WinJaWlYeimpuTjI6KkJqlp5yVlZeckZOIlI6LgYyNgJCLkpKSoZqgopaUmZiVoqaajZmkp6mnoaC0sqizuKGdo7esqq6ksrKmtbu1q6yxoop6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUlNSkFITElIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLDtbWys8bFt7rDyszGs626vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWV1hYV1pdYWxscGp+gn2DfI2Bi4eSjpGcoI6ZnKOho5ikl6GclY2HmZqMc42Dfo6XloaSmpCUjo17mY+djIKJgIqYoKOekJOYloWOgpR+fnSKjnqQiJOQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLG8qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU01ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY2Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLi5wM7GvrOsusGsrcStqKKmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpHTlNTU1RVVFZYWl1pZmtneX93cExWb42AlISLmpaJkpCemJ2VlJaUj5aKgJSJXztWb3yMlIqAjJKMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFwho19iYGQjpCXmpmTi5CKnYifmIeIlp6aoaCXp66prampnpats6KmrZmtq5iotKOpraKTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKapp6OqsKintMG5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFNT1JUVVhZYGpoYnV8b01APn6VkI57hpOLg4mMmo2WlImSh4WVhnmJf2BKUW54i5KEfoSMi4R/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiJSFm42ChZKblp6dlKSiqKmlpJ6bsKqhpKSRpqqWoqqcoaaninduZl5cSFFRU01JVU1TSUxLT0lIRkpOTE1US1FRT0ZKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KmnZ+hrqGnqKWnqK+sqra8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/iZSplpWLf46Dgn54cW9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNUVVpugW5weGVlWVKOiJOGcn2Ff3uEi5OBkpmLj3uGj4B1f3hzb3VwdI6OgXp+iquFentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWKiIqNi4B/hIuNgJSEfIGPmJSclpGfnameoKGdoKmln52Yjaejk6Cflp6fpIFzaWJdXUpXUFJIS1hST0pNTFJKSkpMUEhMUU1SVE1GSUI9Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6RfneGd3x3cG9qWUtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXnWBeXRic4qUl42NemV4f3V3foiQfIOYkoBxho97dntva36tfHSQi396hpKAfH90ZnV8hmxvaHN8io2HgG15cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdm52eoZyWjYulmo6dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUk9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rqKmxr7GrvLiru764s6ynm7CnrJuPlpylqaShmJmOhJJ5iY+Li3ZxfG11cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhdZnBwaYWlqcB9cndhendteneHj3l7i4VvbIySeHN4aWqAgnGWkYyBfZV/SZKZbmd3foJtamRseYWQkoZrcmx8bnJ8hmltcH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6LipODlpeYmpCTlpaZl52WjIOJn5KLko2GkJeAcGpvb29ZVlhUUlJZT1JVVFJYVU1OSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+krK+iraqota+urLS/q7zDv6WimZWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ1b3RscGxlbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFZW1+mhmGYZnB3Y3xubH55ioh1gYeFdGyZkXRzfGlqnY5MeYWTiYSOZjF2h3JrfX2DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3t0fn1xcW91bYJ/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo+VmYuOhXqEkJiVjZCMkIdxh4J0iIyGenBzcW9wZHBnX1RGSUM+PDs5Oj9AQURDRUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUxCSVFJYq6ynnB5dWp7a3CCgISAeoSFhXlyoJR0eIBzdJSHNXCdqJ2PoaGEooV2cIZ7hnx0jK6NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHNycW1gXF1eXFpZYV9STltaWFdMSEpGSUc/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt1eHhsd253Y2peSVBHPT83NDQ5Ozo7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw4RE5SU0RKhHN+enp0fWt1hod7fISDfot9daGZeX6FgISZhJqcYYaqn52Kg5COeneIfomIjnOLl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1FUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2eppGgqqCxqK/AsrvFupaOkZOHeoZ2a3+LkYN9ioOOjHiDgHOghIp9fYF/cIF+emh2a1JYTEBFMjExMzc2Njg4Ojw+QUVHRkdKS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9RTEtUXFhSS2eBh3qIeHpwe46KeXuIhn6Wh3ahmYeGjpKUpY2sqUiGrrCui4GAlIuCi4KEkqmHgJiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9g4h/h4WLeZScm4mLiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdmXFVQUFdZUERMS0ZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5COlZeSlqCdrKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS01NUFdgWG9ZW11oi5GFk3+CgIOQkX2FiJCAmZSBoKGYlJuapq2Tmbuxp7vHw6iLjKGljpOJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4iAe3aEfG11dWZ/lI6GiIiHiIegqqKWiY6Xf3qBiHp5b2dreH58gHVsZV5bW15qXmJnYFpPTE5YUlFJUEpETkdDSkRDQUREQjw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneCen+Mf4GQjoqam6Sdoaymqq6wl5GRhKGUhHh3f4yUfH6ShpKVf4qAkpuOg4CBjIqCiY2Df4p/bHBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlRSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUxMS05WYGN/ZmZsdJqYjZiRkYmMjZiHko+di6CfkaOqpaOrk6m2oqjBwq3Hr3i6lJp8jaGemYSThYKOoZ+UmZGFioWPmZGWbHB1ioyClYyNjnePhHFthYGKlpGChYhxiKCWhpGJjY+WpLSom4yUooOHkoN9f2tqanyBgoN1Y19lYFtobF5sbF5XS0hOUlFNTExGSVBDRE5GQkNFRkM9Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYaQh4SJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMTE1OUl5uintygHydmpqlpKCYn5ahlJyep52oqp+orKmqtZerv6u2x8i3yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaKbm3h6fpSYk6KSl5eBlJ57d5WSqrKIjJeffJSdm42RlZijoaW1r5yQmKeHlo+NgIhsc3N9gX5zamFeYmBiaGRgaGdcUkVKS1BPSUlMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjox8ioaPkI6BgoCJi4qFkoWDhomBgId3XmJQNDYwLTEvLC4wLy4vLi4wMDE1PkFBTVFSU1FSU1VSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUpOT1FZbYWPdpSJoKSnsry3o62rq6aos6uvtbGxrbuxs72bssOrusnLt8O/uKWisLOsraqji5aYhKWmoKOXgaaZjaKrqKWIhZSkoaCroaSoj5yxi5Wjpre6m6Cir5KhnaKdj6Ohq66rsrShlKSpiJmIkomVeXp+hoBpYmldZmNfZWReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2luWHqEdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8Mi8xMTAtLCstMC4tND9DQU1VUFJTVVVWVU5bUEdHRDw+PkZIQ0VBNzs8NUM7PUZLSUdIUU9QV4CSn4OsorGpsL/GwqmyxbWrsr+yt721v7TBtru6o7jFqLXIx7W9ubSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqywtaKxrLG1u7a0rrSfpqejp5qpr6yxuLe4ppq1qIykjpCSn4Z4gYV3W2NlV2djYmRhYWdgW1RKRERMVVFISUpESUdFQUBAS0RCTUc9ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiYld5dXCBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeEgY5/gYmPhn+GiIaKh5B6eG5dVkBFTjw2OjQ1QUI3NjQvLzZDSEJRW09RVVdVXFdQX1VJS0pBPz5HS0ZGRDs+QDdENz9CSkpFRlZUUF6Oo6yisbPBtLbAy8i1u8S9srO/trfBtL+wt3Sxs6a6xKSwxrmwsrG0qKS1tqqxoKKXm6KSpbCupq2rp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwbe6t762ure5rKuwpbCprb2wvLrBwauYuaeUrY6Xl6mIfoN+bFhkYllsZmtmWFxjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpvfo6DgI6EbnpzeIdiuaGZo4mUlJaSlJONj5aRh4Z7hoGNlYqAhIGKenyKh4Z9ioKBi4OVfXd6dWVQXGRHRUs7UWNhW15TRj87SFBFWmNRUllYWmdZVGBfTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWVRdk663tLm3yL64vMnMurvAu7e1u7q2vbO5scVgdbGksZqeqr2ppairqqSisrWgq6iflZafmaCupaempZ+jk6OnsbSosrO9tsG+08nJ08bDxczCysPAvr2+u7y3tK+4t7bDucW9wsevnripoauNpKe1iIGBc2FjY19ZY2BqZ1NYYFZSVUlFRU5LQD5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoN/gnh7ioOHe4t5gYqCl350fXprZnB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhIQkk6RD9IS1NUVVxaW5O4v7i9tsW/urjJyrq2ubW3ubK3tLOutbaYZHWnnK1wXqKsnJigopuknqqllJ+fkJOOlpmYqJ+moJ6amYOknqylqrCtuLC9udTRz9fQyszSzM/Oysa/vsLKvcG8wcDExMXKvsfNsqO6sLSumqu4upiAe21fYV1aX2JaZGNRW2BTUEtDQUVGRTxART5BSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaF9vlpKQlG5sb3R1h7OroKGfi5mcmYyMlZGakYWKin6IhoyQi4h8gYNze4qChXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqamlgZmlpbFptc5atpLyIhmdbb2ddWVpUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWGXtsawuLK6vLSwxMa1r7iwsLursrGmqrerjLWnnZqnmk6ZnYyOn5aRppillYqTk4mQiY+RkZ2boZealZaHnpqnm6yvqLCotLTU1NTW08zQ09XN0s/MxcLJ0L7JycrJ0cfMzcLP0bevw7zDuaS1ucGig3BlXl9fWmFYWmdaUV1YT1BCQkhFQkg7QUM+QUc/P0E3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJncW95eYOgqZ6ml4yam5eLjZWRmo59iYuEjYqKipCHfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem54c21pgXBtY2ltcHhpd3x+y7/B36dtY3huY1tiYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlq23q7Omr7WprLu/sKq0pqS4pquuoKu0o46wrZqXmIyRk5GEjpuBjaaRnImDi4SKiYSLhJSVmJeUm5Gcl5man5+rrKWooqytz9LV0s7M09TUz9TRzsfD1NHHzdLT09fM0dHE0tbFwc7Hx8KovbfOnnxwZ19kX1dhU19bUFFUUU9IPkBGQUJFPEBBPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnWGhYp3bHdwfX5/oZ6eoYyMmJOTi4ySj5WFeYWPkI2KioiQhn6Ce3J+gIGHeoR1hZOQiH9vdnJrc317d3tzgXhya4BzcmlvcXp5cXq+y5p+i7GEdnKEdmhha11DWlpbVmVjWGRqU1hcXWBjXWN3en2LgZippKShn6CnpaqvuKqls6KhraGjraGnsZ+IppqTkpGJko+IgZOJapSijJmEgYZ+kYODk5eti5WNlZmOhpKRnpeosKKhoaWkqcnNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy411cGViYVlVWlRcUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHN4coKJgJyUnZSFi5WJjomIjYaOf3iDk5iKjIeIi4h+gndze32Ch3d/eoaRlX+DbndwbXV/dXh9dIV8eWyHdnRufXaEdHh7nbWMO0CLxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhugIKHkYucnaCdkJeYnqOjpbGjpLKfoaWdoKigo7GchZ6SkZGPi46LhoOPhH+cm4yNgoSFeZR/gqmVo4yRiZeSi36Yi5qSq7OYm5yonKe+w8a5tsbO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBmX1tTV1JcV0ZHSklFRT06NzpAQEI6RkQ/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkJ2LfoeSg4mGhImBh3x4hZaWiI6Dh4WGeoR4cXp7g4Z1eYWOjZx5i3B8b296f3F7gHGDh4Bujnp1d318gnR+fIaHr3NYqsK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeouGjZORmpWflYeMk5qgmp6pn6Gsm6GamJ+lnp+rmYuai5CRjYV9iIeDhYuOoJmTiIOHfmyZeoSYhoiTjI2UjIZ8nImUj66qlJaYn5mnr7a9qa2+x8zJyczL0MnD0srU19nX2NfV29fT2dvV0Nra0dbI1MuWe31qal1cUVRUYElDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODdEQjc1NTQ3OS41NTY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgoGDfoN7fISYjYeLfoWGgHaCeW57e4aBdHmSno6gdo51gnN1gX1zgIRvgZCCb5KEdXyBhXp2hnuJt8Wkwcm4gZabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWk5SOl5GDiY+WmpaWpZyXn5aekpGXop2Zq5WQkIqMkYKMhYiIgYaQkZ6bmYiGjIGFl3qIiZ+XkIiNiouCfaGJkYu8oZiTmJmdqaamrp+otr/AwbnHys7Oxc3J0dbV1dnV19vU19na29fb2tnYztvGiH17aWtnYVVZVldOTEVOQzs9PTw4Ojs9OT1ANj0/QDw/PTw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7foB+f3yEen2CkYmEhXqEh3p1fXRtfH2GfnR/kp6RnoORe4Z+eI9+eIqKboKagHSZhn6BiYR7fpB6j6mOj8OhvYucpJx9iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Li5CShYiKkJOUjpyZkpSQlo2MlZ+clKCUkY2Nj4t+kI6Oi4SJkpaanp+JjJSSnZGCi4ClmYiEjYKFhIGkh4uLuJidkZWWoqihnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuXt7em5raFliXVRQT0lETEI8PD45OTo6OTk7PTY/Pj48PTk6OzszN0Q/NzM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5cnpzbYB+hH53hZuim52Ukn+MiH+Yh4Cbkm6HqIV6oIt8kY2DiIScfZqQioyjoqCQpK+fi5CLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlYyHiIySkouUlJOOi4+Kh5aanI+UlpCKkZOGgIuIko2KipyWmKKihpOdlqCKiYiNm5CDiI6Ag4eFpIaMkLOYnZKUl6GhnpmSnJ6osritpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aByf3dqaF9eWVVZWUNBSUM/Pj46NDk6Ozc6OzozOzs/PT43Ozk6MDpHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNiem1hfpKDb213i3h5f3qBfIV7e3aFhH9zcIWBenV2dnSEgoR+f5KmpJ+lopeKnZCUl4uKqJdyirGNhKeShJmThZmMopWfmJOImp6jkqmwn5CUkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNx5WPhoeIkJKNjZKTiYWKiYWWmZqPj5SThpSXg3+Pi5mIjZCqlpejo4iZnpaaiI6GlpeJhI6MgX+Hj6SJjpSompeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTS2s6EdYJrZmBgX1BLVlxCQkdDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfoh4en56gYGCfnZ2gIJ7bG+Kfnl8d3h8hIaKfoujtKikqrOhlqegpaSWla+ig5C4lZKzmo2hoIykm6+ipJ2YkKeXqZmtsKSXlJWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcmIWIiI6UjIqTj4eAhoeIk5iUjIqTk4aUmIaEkZCcdJGYspWWpKGInJmTj4qQipaaiYqWjYZ9jJifipCQnJqZk5mYoJShnZWfm6GxraOkt76zxcfEvcPDv8bOysnSp87M09HQ1tjSz9i8dXx4X2JXYlhSSUtPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXFxZSmhhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9zjHl9gXt4houJhoSSqLytqbK9sKWus7Opo6KwrIqatZ2iuKWVraSXqa23pqSjn5mpmKqkr7GpmZiblJWRmKCXmbu7rcqhaba3qrCVmJ6jq5KXvaReqrOCiYqMlIeQfI6OfYOGjpCUlIiHkpaLj5WNi4yXmZOcmbSWlauei5yUko2QkouYmoqSnY+LiZWgoo2VjZeZnZOcmJ6UoaCUnJ2lrqiipLO4q8LIxLa6vbzFyMjC0KHGyc3NxNfW0MrTo3N9a19bVWFTUUdEPjxDQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicEpAi4p+gHKGh3yBiXWCioN+bX18fH5wd4d3jYGHe42QjIaMmqvDwLC9xryztMG8tKyrs7aMqLKtrb2rm7ujqK25uKumpqKipKOqr7Kxqp2co5ibmJieoqWlk6O5r6jAu6ytsrmlo6d9iIacrb2wgouLipCDj4ORjnqBh5CNjpyIiI+XjYqUl5SQmpedp5qwmpGrnY6aj5KOlZGPlZeOkaCQiJSbpKyUlo+UnJ6UoZ6bmJ+glZqep6ekoqSws6bAxsOwsLu2xcXDv82nx8PHw7zV0MzEyop2dmRfXGJdT0xDTEBFRz5BP0I8OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1tdXJOMjIh7h4uGg4x1hpCKgW5+e4F+cX6BepR6kpSUmJGTlai0x8nAwszCw7nHvLqvq7m7l7K2urLAr6XAo6uwvLyqrqujop6nrK+1samboKqcopyWn7Czp4yiurq1wburqJyypKOolISOqcTEpIKLjoaIhIaVlIx6g4yRj5GhjIyUkY+Il6CYk5mVl6WgrpyMqpyOlo+SkZWVjZCUkY+hk4aXn6Cyn5SblKChmaSgmqCboJSYnqekpqekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnIwbV3e29eW15sVE5JRE1LS0lAQT1CRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZaJi4iSj4aJeYaTkIFygHuMf3eGgYKPeY2hlqiampi7vsnIysLSycrCzb3Bs628v6e6v728xLitwamss7y9qrCqpKWjrK60rra1oJ+un6aimaO0vKmbqbzBo7a2r6uTr6uqrJaGmqqnpZGCjJKklYmAdYmReYWNkZCen5KPlIuPjJSjmZeblZSinqmfkaWajI+PkJWWiHyOlZKSo5qVoKKctaaQoJelpKOln56mmJ6Vl5ylo6ioorKsqLvAxK+ls7fMwLquw7O7vcG5rcLCwr+ZcHtjW1leXU1NTktHRENIQkFBQ0s6NERIOjs0PDdGLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGVXnpCdjpeOnpKJin+In5KEeIV/lH5/kIiJkICWoZqup6OYw77JxMjG083Ozcu8wrewur20vcu7w8G2t7yttMC5vK6vqKGpqLaurqmyt5qerKKoop2rt7eppa++xLG9uLOnqrSzra6WlaWtqKCRjpKxxaeVjX2RlX2HkZiPqpmXk5OOk5WTpZ2TnZmUoKKhnJifmIuMj5CeiFqPlpeSlqSZZpmjnrOllqKWrK2sp5yfp5eYlpiWoaOopp+1q6m6u8O0prS1y8G4qrass7u4rqi4ury3hG9wXFpWV1BHTFROSz9BSERESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmNNRqaUnJahl6iWjJCDh6WSiIGHgpuDg5WQkJSOmqKfr76uoce+xsXIx87Oz9LKvru2sbu7vL/PtcS9t7m3s7K2s7izrKecq6u5q6mor6+Xo66lqKSltcGwq6y0vsO5wLizp7i0t7KvlaStsK+ki5OUoI1zwZl9l5mEjpaZi7GVmpmVkpKZmaWjlZ+blpqonJuhoJmKjI+WnWBKlpyalZmll1SWsJ+vnJ+lla+vraaboaaUk5mZjp2fpqGZtKmqs7y8u6uwssfAuKasq62xsaOhsrK0pXNxZ15cUFNNRlFRUFE7SEtIRkdBQz05S1Q/QTo9RU0vNzU0NDpCMzROV048SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTc2JWRkirl5mfoaiumJCXh4qnlo2IkoWfh4Scl46doJqjpLXJtKnHvMPEycvJyMzOx766s6+6uMDBzbXIusG5tbqyr6+ztKeknKq0tauqp62smaSupqWprLrAqKu3tr7BwL63srLDsLe8rKOuta26pYibl6Wadb6fhJidjpKYmouulqGcm5eUmp+gqZ6noJmaqpmhp56XkI2RnYNtdZOimpSco5+QrbKiq5Wpqpiqr6aloaWqk5KZnImVnKKelrCnqaq6t76zsq6+ubago6eopaacnKypqY1maGNgU01NR0lPSlVMPU1FTUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJScoZ+7rpiUnouTqpuRkZOIqoyGoZ6Mo6yUo6S2x720wrvDwsjJxcLOyMK9ubKvubXAw8q2xrHBvLW7rKmtrLCjo5mqtLumqqesqp2or6ikq6q+vKitvLS3vsa8trW4wLC9v7Optbesv6WPopeQoZ+8nomaoJmXnZ2Ptp+pnKWjmpugmqels6GbnaWcqKqdmJSPlJuLlomMpKGUnKKfoLWwpaaTsauaq62fn6WkqpKWlaCEkJ6fnJappKGhtLW6tq2otbKynpyippqXlZmqoZ54Y19hX0xJRkhOUUlORUZHQlFKSEBER0FWU0RIPEFHUTE7Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6fw6ybl6SXmaiblZqajqqWlaimla2smaKrt8XCvL+3wcLAyMS/zca7vrmysLm0vsPItb+wvLa6t6ekq6utoaGbq6rEoqWorKaeq6+soqqovrimrb6wt7fGt7S4uL6xvsC2tLK1r76jlqOVk5qTrZ+QoaGkoqOekL6kqJ2prJycoJumn72imKOeoqmroJ2VjZWek56HjoSNk56koJ22rKaclrKmmbCooJyrn6GNmpWfhI6hmpySpaSamKuxtbGqpaqtrJuYoKGSjpCWqZ+UaWVcYl5QSkhLT0xIRURJQD1PSEA7RklIW1JPSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE6jm6ObnsWroJ6rnZytn5Ginpakn6aqq5e2saOps7bFwr3AtsDCvMnCv8rItri1tLG0tLfCxre+sbi0uragp6yqq56en6WkwaWhqq2gpKmtsKKmqL21pbG7t7a1w7Kyt7q+ssPAuLittLS1o52klJGToKyfmKGdqKiqoprCrKidrK2amp2YpqC9oZ2kmKurq6agmY2an5KeiI5Yf5afpqGguaqmlJi2o56zoqGcsZigj5qVnoKPoJeWjqKjlZClrrOrqaKipaSVlZyZi4+Sk6SfiWNnXGVhTUpLS09GRUFHSz49SUE5OUpKTl1RUUk9TFZcOEZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQn5+gmJ7Dp6Sis6CcsqeSqaOfo56tqaydu7GprLWxyMPBw7PCw77HxL3Eyr2wsbausbWwwMW1urGwuratmqmwqambnqahp8KtnK2xnKqirrGppKe9t6a2u72vt8Ots7PCv7LGs7q3q7S2raqippWVlKKroZ+fmaerr6+vu7Kln6mpmZiXkqKkuKCho5Kur6ukpZ6RoZ6UnY6QjZSdmqOfqLWnp42YtJyjr5ugnLCRoZSYlZuAkqKWj46goJOLpqywpaeinaCekpKalIWLko2cn4BkaF1oZktKTEtTQUNASEc7O0Y+ODlOTVVfUlNKPk9eXT1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9nckA4PEiWd2VBNJ+knpugwqejqbGgo7SplbGrpqKksqytqbuyrbC1tMa/xMS2v8S+ysW2wMnCtay1qbC5rMDEtLevrba6pZmrsqyqmKGnmK27tJyosJutn660saequrOnubO4srjAqreyw720xae+rq23tamnq6CWlpGlpKGhl5ekrretsbS2n5+ppJmTlJOjoLejpKWVrrGypamloZ6bmZqVl6ifnpmin6+zoqaNmK+apauXm5+nk52PlZmahpaglYyQnZ6Ui6mpqqKnoZmeloyPmZCBhpWIlZ96ZWpdbGtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUFXYFxCSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWlWQ1dGjHlmQzukpJygpb+mqK6uoKm1qp23r6ujqrS2sbC4t7C3uLfEvcPHvbzDwsfBusHGwbqqtqWtu63Bw7e3qq2yvKOVrbGtspemqJGquaqhp7Cdq6CvtLOqqre1rLuss7K5t6y4sMG6vb+mw6qwtq6pq6umnZiYqqGhoJGXoLCvs6uwuZmbqZ+ZlpKXpqC3qaWioq+xs6uxp6ugnKCfm56lnaGYnaO0sJufkZSmmqGpm5ajoZiai5aZlJaXnZSJkpuZlI6pqaego5yYm5OHj5mLfoyXho+bbGltYm5uWFFRWlRBQ0RUQDs7SEA3OlhQZF5QV1dEWV5eTkxTTl9MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOGx9aFxWOol7Y0M9qJ+coai8oKmvqqKxt6iktLGqoa21va+zuLy7vbe2wMK/ycS5xMPAwLnFvcG4r7aoq7eyvL+/tKqusrifl6ytqK6YqKmOp7ufpa2znquisbCzrKq2s7W8rbCxtaywtLLAusW2q7yvsbesramjsaWepKieo5aPmJ+yqrOpqrOZnaebmpSNoKaktK6noaysrbGnsquxqaObnqiknpSgmZyotqmXmpOSn5meoZ+SraCamoeXmYydmp2Ui4+Xl5qXp6ajoJ6WlpaUgZCVhXuPk4OMl2dtcmhxc2BHWWZWRENNWERaOUhCNT5dUWhcTlpdR1teXU9NU1hkSktDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKSaoKSrtqOrqKSurbWprrO4pqewt8a2sLe/wcK2tLrFvszFucPBusC6xLjBurO1rKq6uLu6vrWrr7G2mZioq6usnK6rj6u+nquvsaOqn7Gts66utrG4tqqtrrGntbCzurzJsqq1tLC0sK6moLOgmqisoKSVlZqZsaKtoKWvlqKkmpmSjKKlp7KpoaaxrKq1pK6wtK+jmZ2tp5uXnpqZrLiil5ORj5icoZmYla6hn5aClZmOnpyal5GLlJOemaWjo6GZl5OSlnuMkYV7jYuDjJNsbnlvdn1iRmBqWklIWls9e0pHRTZBYlVpW01cYUpcXFpSU1NiYUxLRWBhYFBNSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUS0WalqCwp7GprKSjrq20qLezt6OstLfJurS7u8C+tLO3w8DMx7vEvbe/wMC4wL2yva6ourm4t8K3rK6xuZWXp6+sqKSzqZSvu6SssrKmp6OytLCysbSwt7KprquyprivtbPExbaptbWrsK2pp6K2np+msKCjlJuZlLCep5ufqY2pop2blZelpaS3p6Kws6unsaetr7WspJmgrKicnJ2clKq5nJWPj4yYnaOYkZiopKCYhZOXkZ2cmJeWiJePl5uonaWhkpaSkJZ3hJGGfIaChI2NbnF4dnyAXExlbFxKT2RdP2J7R0k4R2dXZltMXmJMWVlXVVhVaV1PUEhhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGcyNydGYUxWJS1CLj1FTFE8M3JrTEREkZmkraOsraqmo7Cysqq3sLWfq7W5ybiuwbzDt7OxtcLDz8TAwr61vsHAu7+8tMSoqrmxtrfAvK+stLSeoaexrqWmsaWesrWsqrKxq6iotLqstLK0q7OsqquorKm5rbKwx7+4pLmwqa2tpqetsKWko66jqJudm5qvmaKioqOQrJ+joJ+hqaaluKSrtLSkqquorK62rqKdo6irnKCZm5KktZqPiY6IkaOhlo+Wn6KWlYaQlZSem5mWlYeYkpWZp5ygoI2Tko6ReH6OhH19fYeKinJ0c39+flxTY25eTlpnXUZElltHOk5tWGJaTWFiTlZWVldVWWheUVNNY1pbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RkOzYqSGRISis6ST8zQ0lTLD6Paz9ISZCbqamhqa+kp6Ozs7C0tLCwoKutvcy6rsG8x7G0rbPBw9HExr/Bsr7Dwry/uL3FqK23rLS4vMCxrLKtoaOnrqqopbGjqrCqrquxrq6sq7O6prewsqmyqaqmpaOtuqyqsMK5tKy5qKioramnsaWppKKuqqihnpujrJWlnZiemaudoaeooaymo62strCxoKmin6qtsKudnqenqZqjmJmQoKiYhoOPi4ufoJCMjpeekpGIiJKWoZ2WmZaGl5OUl6Wcnp2MkpCOin9/iIR9d4CHhYd1dHKJd2xfWWBuY1FzcVxLO4R7Rj9XdVhgWU9jXE1VVlVXUVxiX1NPT2hZV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlF1ATkaVlqynoKmxm6iosLWsuLWtqaSrqr3JvLG+uMOvsKyzw8TOzsO/wLTAxMS6wbXJxKyvt66zusC+tK6urKaoqbGppqmyprStqq+trbGusq2zuqS4s6ysraeroKOesLerqq25tqS1taOpp6ysqq2gqKansbGkpqWhoauWqqGTm6ClnqOjqqOsop6msbasrKKlo5qpq62pnaGlpKSZoJmWj5idk4GCkImFnaCNi5CNm5CSjYWOmaWbk5GbjJOSkpSjmpyai4+LjHyHgYKCe3WBhIF+dXeLo4d4al5gbmZXZodkTkBnkkxEYnpXYlhSZVVNVlZVVE9cXWFWTE9qV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZCSUlElpGvpKKpr5ipqK21qrWwqqSrqqm8wMC5ubS8taayr8PJy9G/wbu5wMDCusG6wsSusbWytLzBvrOxrq2srKe3qqWtsKu4rqiwr66xq7WqtrWmtLesrKSpqpyknrOzqKiks7Sfta2hqairqKunn6urqLm2qaqqqaGpn62bkaqhnaCjo6aiqp6cprSup6WpoqSXpKanqpyipKOgmZifkY6PmY1+h4yHhZ6eiYWMi5CPko6FiJajmo6Nm5GSkI+Sn5iZl42LhIB0h4F/fnh1g4B6eH5/iJ2PcHFmZ3F4XGF0iGpPXZhWSG15VWRWUmJPTFVVVVFPWFtiVklRalRWVEdQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JGO5WNr6ClqayZqqOsrrK0r6qkr6mou7+8wrKvua2itq/Ix8jRwL+9urzDvbvDwb+/r7Gzsra9vMGysrSrtKmltqmlrbOyuK+irbWxr7G5qriuqq63q6qeqqugo6G1ramhn66yobSqnqinq6OqoaGsrai9rquuraGnp5+rmY+wopiioKinnqebmKmwqaKfrKGhkqGio6eYmqilmJiYnI+Lh5WIfI2GhIWkloaDg4yHkJCShYeVoZaJkZ6Rk5CNkZyVmI+LhoZ4dIF/fXR4eYB7dHR7aoKIpHZpXmVsgXVniIt8UlZwXkp4c1RkU1FfTU1TWmZOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzOPjrCgpKWqoqWjrKa0s7GopLCnqri+wb2wqLmqp62wycbI0MK9v725v7+9ybzCuLGwtbG6vLnAs7S8rbmso7Wmp6yxtriypqe5ta20vK+7pa2ttautnKmvpJ+krKqonJ2qsqSzqJqqp6qkqZ2iqaepvauzsK6dqaOgrpuas6KWpZulpJ+lmpmoqqWemqmgm5GaoKSdmZepqZGZmpKQi4KPhX2Pg4CIno+HgH6MiJKQkYWClJuUhpOijZSRi5Gbk5aHin+Acnp5fnxodnx7dXByfmqGeoWIZF9oY3KFe21neV1eVkJXe21UYVBSWUtMTnB0XUlaW2hZRlZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKwmZ+fqaSioauktrKxpKmwpq25wr23sKS5rKmosMLIyczBt72/tbjBusi1w7W0s7Wyvbm6vbauuba/raKzpqqrrrS3tKmcubuosb6yuqCutLapq56tsaOcpaipo52bpLCmr6Gfqqmnoqqco6igrbynrrGuoaqio66enqymmJ+aoaKbn5uZo6qimpqjo5WWk5+hlpyWpqyLn5GPkYyCi4CAj4F7mpSMiX1/jIeRkI2KhpOYkYeUo4qSkYeQmZCUgYh9emx9dnl4Ynp6cnBwc3hqgnVrgmdjZ2Fuc45tYmpvX3BBXXlrVl5OUVFLSU1TWVZNXF5sV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl0+I5GWq5ifl6eioZ+no7evraKvr6iruMK6s62gua+rp7O6x8rHv7fCva+0vrfEtsKysLmxssC2u723qrm4vqqktaeoqq+tuLComLi8o62+tLShrbe1pqaosLOgnqWlp6GkmZ6sp6ieoKqvp6Cml6Kon7C4n6Oxr6GroayknKamqJqbm5+ilZybmp2pppabnqiRmJKYnZOZlqGqkJqJjZCHfYd/go58fKGMjIl6hI2Fi46NhYmTmo6JlZ+JkJWCjJeNkXyFfHRwfHFzdGB4eGlvcHFwa39zZHpsaGVkYWaHgGBbcmpyTU6AaVhaTVFMS0hQUlBHTVtfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56hpKG3q7CjtLOpqbrEt7KuobitrauvtcXHwLe/wbmwtL23v7u+sKy+sLO/sbzCuKm7urinqLWop6uvq7KvpJi7tqSrurWvnrG4r6mlp6+ynKGkoKSjoJabr6ahn6Kor6GgopOjpKK2sKGmsaufrKOul5yqpaifmJqdo5Oam5qdpaqam5ullJSXlZyOk5eiqKGQiYqPhnqDfoSLeY+Xio2HeoKIhImNj4WPk5iMjpaZi4+WfoaXjI96gXtwcnZub3NfeHdkbGxsamqFb2ZyaWtmaF5kc4FgW2t2aVpKf15cWE9PS0hIUlVHMzldXmxQRVlVWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJkVywylKGhl5SbqpyjoaKht6qtoLu3pay9xbSxr6O1r6ysrrTDw7yzv7q3sbO5uLq3uq+uwLO0ua+/wLesvbq1pqKyqaepsaqtsaCZv7Wkp7S1qJ6yvKmopamwrJmip5ykpZSXoLKkmZ6jqKmcop+SpKCkuKmkp66mnqWhqJKfqaKhoZmbnZ+RmZuWn6Gqm5qYoZSRlJaZjZSTpKikkImJjoZ5hHuEhn2djYmKh3qBhIeIipKFlpOTi5CWlI6NlHuDmI+Ld358bHRybGxzYXd0aGhqZ2dwh2hoaWNmaWlgamNqaFtme2NgU3RUXFtSTEpGSU9TQCEqaF5pTERXVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp6io5CNpKaanZ6do7Stp6q6tqesxMG3sayjtq6nra62wL+8ssK2sK6ytrW4tratqr2zrrKxvL+3rry7saWftqqlpbOnqa2dnMCrp6SvsqmstbueqKqrsaWYnqqdpqSRmKWsopiepKmhnKKblp+dp7WmsKquoaGdnqGUoKafoaCam5mbkpidk6WdrKGXlp2Tk42Vl4uPmJuon5GIiYuIeIV2gYKBnYeKgop9f4WIh4aRhJaUkI6PkZGRjJN7g5WPhnN+fmZ5b2tqa2Z0c2tjZ2RkdoFiZWZmZmpqY2tyW19ZXm1kYU5pWFpgVkpHSEtNUlg+OV9saEhDVVRdW0lJR0ZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao6CPjK2hl5eglqSzsaKyvbahsca8urGxo7esqq2puLy7uq3Asq6urrausrizqau5sa+us7a6trC4vaymnbWpn5+vo6munKG/oLCjrrCut661nq2vra6imZ2nqaWflZqnpZ+ZpKKonZqfmpScnqyvprqorqKhmpuemZ6kmqSdl56Xm5OYn5KolaqnmpOampKMlZmNlJSaqaaOjYqJjnuBc4GBipiFh3yJiYWFioyJkoSUm5OSj5CRl46Qf4CNjoNvgX9meW1oa2lmcXJrXGhjY3SBYmZnam5sZ2tqaG5dbGxzcGBUY2ljZllJRkxNT1hRUVVhZYBVQVdTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY+wnZmToZqpsa+fub+1oLTCu726saa3r6etpLe3tretu66sqqu2qbO3rqaytbKuqbC2trCztrqnqJ+1qJydqKCorJqnvZiso66vtbWtrZ+xrbCpopuco6uonJScpqSdmqmipJaan5uQm6Oqq6q8n6ekoJiamZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB5h5SMg21pfnaDcWyGi4Z9hYyHcF5jYWeEmIVri46UknR3i4R+g5CAZ4eAZ3VoZVdcaHNtTlBqY2dzhWhfZWZubWpeX2GKj4OEZU5LRDlHVGheSkdRUFRVTEhSYG90ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsKzA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoqjmYWVsJubk6Cbqq2qo73Fr6m3wre9va2mt7ClqqK2s7GysbmsqaastKWvtKKpt7a2qKestrKutK2zoames6qeoKObpaaXq7mUpaWvs7etrqWprquspaGenKGnppuXoKWlmpunpp2Tnp+XkJ2oqaS2sKSjop2WmJeXo4ihjpKahqCHk5ygf6V/paqekpKakYiEcniNjoWIoXaIjGmXiGZ9c3igb4iHg36OfH+hoKCZgHyHnnSHjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxcIhYXmlbbGxbiHJuenKFZ4aEWl9HTj9HX01FUlZWUVFTV1RnXU1WSFJST0ZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKppaCnKucmJidn6mpp6q/w66xury2wL+qpbevqayksrSurrO2qqilsK2ltLKbrbW2taanqLKwrLKnrZ2pn7Gnn6KimaChmqyzlKOkpbW8pq2nq6qsqKahoJigpqOZmaWjpJicpKmWk6Kck5Kjpaaht6SkoKOYlZOXkpyIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kYR8kJCRynKXvJzFenK1pruQe4BtlrGrsHlobFixrm5lab2SvG5nem9yj9h+U2tjtrJ/gXKUc5qhqpBXT1diT1ZORlVbWFFQUoxcV1tQQVxEUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKaSgKeqn5ecnqWssqiwwr2xtb+1tr7Bq6ezrKyppq6zqa62s6enprSlp7etnLOytqulpKexraywpqqdpqOwoqGfnZaanpytq5Odop+0uqOqqaKtrqWhnZqaoqefl5unoJ+YnqenkZymmpOdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUca6hpH54u31roY92sV9qtFulgGWckWBmgntmf2p4a6llvnJnpox1sWp8sXh0kpRjbm2nbluEoEVoZoeWRXWcYH5nfKSnglpfjKtogJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOiU9XVy9JVFNKQ0ZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKtp6Weo6SqsbestL2/r7bEsre6waapsKquqKivrqKwuq+jpK2yo6i4p56zs7CjpaCprK+rr6annqOhr5uimpaVlpmaq6WVmqGetLOiq5yjra2gnpmWoKKonJido5+bmaGmpI+copmWoJ+qnqamoJqfoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH5rgaZ7goaIkpSSd6tna7Fcq3qNhpR0iXKPhoB/iJCXeIKCi5iLg6CPhLB2d59xbGxsfItOpFhIYmKZfmNopmB5cnVTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5V1hBI01oRkNFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVQ1MBuVoJWIs6amoa+pp7Osqbu2wrC7wa24t7+prK2traatsamgrruqoKe0rKOrtKSmsrOno6Kep6qxp7CnpJ6fn66VnpmUlZWXnaugmZmkqLSvoqmPqaiqm52Vl6ClqJqenKKem5+jpaOVm56XmZyiqZummZyboqCXk5GTk5yD1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46Ho4KlgnqseY+dVq96iH6farlauXaGg32mgpN8mHqqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKlic3KIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWNQQFhnWmRhSkhNbk5cUU9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFQNzElm6KUmbKoqKa0qqW0qaS8t8Gwub+xtbS6srSnsa+isLKmn621p5qnua2ir7Cfs7SwoaSen6apsKi0qKObnZ2qlZiWlZaUlqConJmWp62wqaOej62iqJadl5ugpaGYoaGhoZqhoqebnqCelJiapqCbp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52No3+RoaV+sHaDkdLSdlyue4V/pG+bqqZrhoR8rX2XmY57sHKSnY54s2WXdISeb55mlFHIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPa2BsaFBWR0k5PVVSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTDYyMKGdkqWwrKOrvK2mtKantru8srq+tra0ubiypbSzoLGxop6rr6SXprmtpLGwm7S4qqClnaGppLGnrKmjmZyZp52Vk5eXkZGhpp+VkqWqsKailpOtoKWSlKCbpKaflZqlpqGaop+smaCenpCVm6GdnKWVnZWaop+VmJWRm4Wse3eodqONiIapb62KgqeDmJihiZKai6J/k5qJroV/grNccrNSrn2CgqR/cdd9eIV+jp2Fmpp2r4aJkZyHd7RhmmWagoKVbZJasFhLmnWYeWZgrV52d4homIhsXa93lZ6PeGw1eciusl9CVG9eZ2BFUGxfcG1WVk0uZmRpU1lQO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEg6OTmgnpWgubCXtMKtqLOoqbK6t7O3vri3sbS6tKS3sp+zrJ+eqKuelKe1q6ivsaqttKSbqaCfp6G1pqapopidlKSgk5KbmJGUoaSakpCmra+moJWZqaCij5GhmaikoJWZpaidnKSerJyhnaCNk56anaGYmZuWl6KglJeQpp2GqX19pXihjo2CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTYf3aHc6iBjpuNkqR8lpCfhHuyXp1koH6DlW2SXKtbWpOAkX9oZ6pkcnuBa5iHc16rWomgjmtvZU9KQ6FcW0x0XWJnTlthX3JzX0tWN0qblFhHRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amr+rmLTCrqutqaW0sLewtb64uLGwtbqourSfr6SdpKennZOpsKmvqbSrqq6hmKCfpqSjuaKjq6CWm5Chn5STnpmTl56fj4yLqLCvp52Xm6imn4ySpJeoqqeUl6mnnp6goq2koZ6ijJShmJ+gkp6XnJWeoZWWjqucj65tcrRzqYt1iqdztHhzs4CRpKOSnI6JpIeQd7hvjHuLomprtlqhhWWXl2mhoqdtk3K0dJOYf7JqhZKIrWp1s2GdZqJvh5Nrl1ytX02hfIeRUnOjbHl/fm+Yh3Jdr1Y8nHdmVG9uLlynT2NTa2VibVpjXWBwe2NUWlI+Pm1vM0NCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKacm567oZuywK6tq6ynt6m3r7W/tLqvrre2qsC1qKmgmqWjoZyRqqmntaKyp66poJebp5+kq7idoqyalZmOo6KVjJygm5icn5GTlKq2sKiZlJysqpeMlKWYpayikZaqsqOfnaarsZmho4+Yopafm5aclqGTnamclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJeLjKeIeqS2dX13dsKCmrJgg7p5wHx1uGO1goyHqXyVgaypcXt/dLyIp6BpnWGmjq+hfox0h6p9vm9zvHSyg3V4gYpumohybo2kdL1ed31aYXm8a1pWXGp5XmphZWdibXhvWlxZQ0FAc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivaGXssOwraqrrLGnt6+2w7C4sK25rq3AsKujoZ2ioZubkKmjqrKktKWspZ6VmaqYpqy4nKKtl5Ofj6Sfkoycop2XnZqRlZKvubKslZejp6eUkJaknKSsnpCgqKufm5+oo7Ofo6WOp6KUopqcmJWjmJCvoJKUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahwgHORuYN8hoaMh418ioeMl3yku7m9nHV6tKN0d5d2dLB1mZ5mhmqNtXRycXe2jF5/en2JaIN5bnpji6xwdYV/WFunakVlWlRmYGNeY1FnZnBsdUNOUE1EOlpNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlUnPjs8p56gor+llrTDtKyrqKyrqbqusMWts7KttaazuKupoqGlnqCdmZOro6yppbWnp5+blaCjnaukvaahqZaTm5ChmpGPoaehk5yXk5eUsbW3rZmepKSii5KSppulqpuVqaSlnJqhqKWnpKmhka2flqSel5eXnZ6Pr6iUm6ahjWp9aZumeIdyfZmOdHlkh3u9vsC6b5ODcpWHYHJqWl6biWBjiI6Va2CAlWNtnXdilWuAmpWUZV5gY3Caimhyi32GlWdrf3J1eH1+Ylt3dIFoUFxug317i2tYa3qCc0pKb4ZwTnRNRVhdZ2FMWlhnY19PW211aXFSUERFTTtHST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPltPJz8yPqmgqKLCo5u1urajrKWup6e1sazIq6+yqrOivbCxpp+ip5yjm5mZq6auo6S0qKSbl5Sgm6atqL2nqKSUk5qVn5mSl6SoqJCdkZCYnLCyv6ybp56noomTkamaqKObmqugo5mbo6eso6Cro5qwm5WnoJaUnZ+dl7ClmKGnmZuQnJyio5iloZmbmZmZj5WBZ219cXeSl5SShYu1qo2GmJWOioyYloeUlYqEk5SRiY6SlJiTmJaaoKGanJSgnY6CeqWFbWt9kXyAdYqKgXGCeHl2doqAfIpqc4F0g3Vld313a296bWBjXXBoTVhaZmpgV1pveW1tZlRPRlM5T1pNUU8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzoLOiwKGksrK2oKmlsqelsLSqyKqsr6S0pcCms6CdpKSco5WVn6qmrKKjtqufmJaVn5atqaXAnqujlJGbl52XkpOhnp6ip5KSmainssSwmqudqp+QlpaonaqbnJ+smKGbnKKkr6eipaifrpiXp52ZmaCenZyvoJyhppWXkpeTn6CVop2XoI6Wk4qKjY6XrpB8lpuDkoKLqqmFgJmXiYOPnoh6hJCHhpqSiIaKlo6bl42RmJ2klpqTkZ2Nf45nobOvhYqEdnuSin13eXpvZnmQgYCJa3WBeohzaXN/e3aDh4JrdWR5ZmBqZWNkZmtZbHtvaWtcU0xQRF5URUA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9iY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0W0c1PCxAtKC5r7+sq66ysaCqprKtoqyzr8Svqaqisa28orObn6aioZyYl6elqaWkpbK1nZSTnZmZr6WtvqCropCRnZmYlJCUoZyXqJyEnqqro7TItJ+qpKqWlpeapp2pmp6jq5Sen56gqa+qpqSroq6bn6CgmKSenJ+cr6OYnqeSl5ackaOYl6ecmpdlgpJ8ZX6NmpBjeY5taWt7kqSqamWbmH1nhoplZWloe46hj2tnjZiRo3draouZo5+Yc2xueoSOiHpYZl6Gg15ti4mBdlxoc3d2koCHgm53gniAc215hHR2iIiPg3xrh1lebHRkXnOJaWt8cWtkX1JOWElkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaWfury6r6y0saqlqK2usKatrbC8sKimo62usJ6slp+jnaGZmaaqnKyjpaeosq2elKOPoq+ltrmlrqKOjpmhmZOSmqCZmaSVe6Wtoqi0xLiloqevn52UnqKeo5uiqaiSn6GeoKmwq6ukq6CqnKefp6CslqGbpbCkl5uplaCdmpGjlp2pl519vYOIcrRyhJ2GrWh4ucS4cZOio3qmmZlyq4J8y8DAu3GMo4iCn32WmImdwL2Cl52ejZ3CwXyCfJONmsPAfWylsm+MgW/Ken+bd5GDjoF2eYCAeXF6f4dwd4WMk3lueJRjZ2B4ZGBlgmNedGdsZGNYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtbCwwKmolKOvqLCuraays66ppKWmr6ufqpiaop+cmqqnopyroqSopKS0o5yikqatq7ezp66hkZGZnKWSkJ+hmJufnYimrKSsrcDAsaGpr6mXkZ+dopmho6qjk6GinZ6sr6qtp6Skp6GmpZ2sqJGjmqitqZqcqJuroJWWpJWgopacfs6UeHqkgXmVlptfro9ejqeBoqB8p5abc6uDgK9eY4yqe6iHhaB0l5OIs2OCq4ahjo2zaoSvdX2XiLdhg61ao81ukHZ72nt/mXB+h5J2fmV7iHZ2a3yHbn2GkZF+bYOQYXJtcGhgYHlkXHFoamRnYFJUU1ddS09DNUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqets6umsqurqqOqpq+pn6abmaSXnKKvn6CeqKeipaCfsKyanZWnrqywqqirn5SRmp+kko+epZiep6OfraWrsKjAx7OoqbGulpKdm6KXn6mpn5Whn52dra+prKqcqKiloquSrLKWpaKqqp2ipaSgrp+RmKaZn5mTk5CXoHGFjJd1haiGcbF9nnKsfqGegaWPnnargn2tf5xyrX6rh4afdpmSe3yXfqqIooySjJ1+q3uJlJCfgHutV53Fe49wk8F9gZVtdW+MbWV2ZYZvYXducm6JipKPg26TkWZwdXVxYWdtZV9vaWluZ2RYU11hWVJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DTxsaytKCdo46joqKsr7auqLGmqKqmraurpqGjnZmhlZ+lq5+hpZ+oqKKenbCsl5qWqKeuq6emp56XlJmjoZGUoK2bnaajr6ykrLWqus6yraaurJeVnJ2imZ6urJyXoJqen6myq6urm62rpaOrmq6xoairrqWYpKmoqK+hkZWio5mTkYSkaqR1iXqpdHqycIKmipmMcYigmoekYGBSrIV/roObdq2Bp4aFn3qZl4Z7ZoCjiaSZhoKjfal+gpaHrl98qVaeo5KBeqOfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoJunJVxb3p4eXBtZ2VlcnBmfGljXVdgalhZVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXUv6GZq6egr6KesLSwrqmsoqemqKqrqaSln5uknp2lp6ejnKuaoqyho5+voZyakqujta+uoKeanZWTpqKQmqKooJ+lnLGlpKixrbfIsrWqrKmWkZ2copmfpbOdmqGUnZ+nrK2ksJutqqOjqqGzraGqs7Ghmqinra60oZGUoqaXmpF8qWyehId1q3l8sG+CpYyJn5aWn5SB0ri0uMmBgbJfYJSpg6SJh6B6mJaaeKrJdJqklaipkZKajYGciprGxnlnoYKldIGfjoJ9r11wtGKwdUujhm2nR4KTZI+QnpF8cZmVgXF8dX58blxmanNxZoFrXmFZZG1cX1lJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqhpZqopKqrqqafpqWYqqOfrqudpaCsmp6ppZyntp6il5OoqrWyrJulnKCUj6WskZmcqKOgqqeuoaWnqbC1w7Kzqq2ok4qXnKWboaOvpZehlZmcpaatnLGer6mnn6yjt6yhsbivnZquprGysaOTlqaimZ6Ogp1OeJqBf596hKN9g6SFh6afnJ6ThLh7e3m5gn/MxsK2eJuhkIuffpqWl4p2npiKpZikqX+whZ2GoISsfZqVY6ZtpHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Uk4x2e3OGgHFcbm54cmqBb1tkX2luYmReTExRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX11aWlpYVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq6fm6GssrOlnqCVpa2trqqnnKammqOnobOuoqmmsqCYqaSUo7aiopWXoam0uKOboZyiko+hsZmem6emoaKwrpylqKK2ssWxramtqZGHkJyonKKknKWXnpiamqakq5uwoq+lp5ivpLusoba1rZ2ctLG3r7Gll5yuoKOchY/RtcO3eYeOhZGTkICmeZShd4ygkYSlgYpxqoaFtG5yapmjnJWKnnyYmYaHj3Ovgqaco46mi5Odi5aQm25xsl2ldJN6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWOeX55kINuanlpenNvgHVeZWVvbWZnYEpbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtbWlhVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWSc4yKrb6/vLq0npanpK21oaKZlKKopq6rq5imop+moKC2p6Oop7CjlKyjjqStop2Qmpqqs7OknKScqJGUl66fn56npJ2onbWaoqqktqzEsKmrqaGMhI6coqCmopWZmp2Zm5mmpaiZraivpKabraa9rJS9r6yeoa+yuKmypZqosKKnl3mokX18sHeKgKSliJxtsnChh618oY+Dp5WYgKyJha6Fn5SqoKGXhp+AmZWAe5J+q4Cdm5aLq3idoZKKlJKBeq9epIF9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWRppmDlo6Zjnx8hJmAa25/Y390boB6YGdmcW5oZ2hDWWFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFSU1NWWl1fYWBhYWFeXVtaV1NQT05JNzA0Mi4qLEFUVlZWVFRVVFVVVFRVVFNUVldXWFZVVVFIRklKIygovZOag6jFwrbAs56arKCtuKWjjpukop+vsKqfpJ+drZmeuaCjq6CvqZmuoZCrqKOWiZqQrrCspp6lm6yXl4+soaCdpqGapZ2umKGop7epwa+lqaSei4COm5qfpp6SlJmblJuapqWmm6qsraSln6movqSWw6ypoqCrsriprKWesq2nqJd1r36Qi5yFh326rYqZZbCNZZWtfaCPg6aVmoGsioSwhaaapKGhkISgXGxqgbNgf617e4OBsW1nb5mZjIixW361XKSEa8iiZJ+Ae7xYdrVZsn1SroB6rFiAoW2YkKibjJiSmZl8epCff2V1fmOGeHSBfGFqZ3BtZ2VmT1VkXEFVXz5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFFSVFdaXmBgYGFiXl9cW1hVUE5KRkM1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9KfsrG3vbqzwbKinKympLWooIqaoJ6cs7Opn6OgnrWZoLSoqqyer62drJuVr6ehjoibjq+rqKahpZmukpiPqJmhnaWfmqOjpZmgoqqzqb2wpaienI59i5uWoaCYj5GanJKamKmgopqprqimpqKkqbueoMampKigqrS0q62lnrqsq6uUgKmSo6+Om3+HpJeZkIKAuMO6g46ckoSnl5yCrIqCr4innJumqpB+1b3CqmKjv719fqOCg9e6uLWFlZODnr2+hG2jgm+rhGycf3qysMeDaauwvax4d6K+vHOAlo6mnZGbkpqfe4KSnHtkfntlj2d5gnthbGVramNQYltTalw/VGFDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzc7PkFDRkdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsL+4sbyyopyupqSypp2LmKXAqriyqKG/pqeynJ6xnLqon62vpaeUlLCrl4yDm5GupaKsoKOcqqCXi6OSpp2nnJqhqaOZn6Gsraq6rqijmpaSfIiZkaabko+RmJmPmJSpm6GZqqmhq6ego6q7nqjEop+toqmzs6muqJ+5pq2tmXN2qqW4hmSJoHBorpGKkG5ud6SQmZ+Bda6YlHCPi3GVqKObl66kcmxsbGaLeG9ugplxgXpqcWlnipeWmHFpaYWIZ3GGZF2IYmpvWVxmfXamX2FxjpFuZWV/jZOPoZiZmZOZoX6IkZZ3Z4h4aY9reYB5ZW1jZmxiS2VYSmxaOlBlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWVxeXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp2jsqmXkr+zxcq/t6qewKytpKKnrJ+6o6Suq62mjpeuqY+LhZWWrZ6mqqCdpKOgkYukkqeYqZqXo6qhlp2mpqewu6ysmpuSkXuElo2lmI2RkZmVjpiWqZagmKmjm7GmnaKruZ+vwaejsqWrr7CprKqmtaKstpWKoaimt52JlqOZh6qbkZWdkqmymZqjqqCylqKhnZ+inKGloZWrp42SkoyHk5ydlZGZk5mRj5WGgaWbmJaOi5SUjJCGhH1niX50gnVzh4pwp2x6lJGTkoGBjY+Qj52VopeamqSEiZaPc2qRd3GMeHd9emptZGNvZFVhWUBqXEhjYU9ZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVVlleYGFjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaWlxcXl9fYF5eXl9fYGBgX1lZYKaWqKqktLaurqGwo62foLWxkI6syL7Fu7mroqWenKefsamjtqedqbSmqJGYrKKLh4mPnKeVrKSfmKeenpKUo5aomqialKahpJCbqJmhtruoq5maj4x8gZSLoZSKlZGWkZCUmKaQoJuqn5y2o52mq7enrsCtoralrq+vq6iosbegrbuYkaWkpraikp6noI6qoI6Sn6Orr5qgo6+or5ijoJyjqp6enpyWq52TmaGblJCWq5qOmZmXkZafkomhnpaVhZKNkY6Vi4B9ZouFdYZ1eIeCc5xqhY+Uk5CJfIuVkpKYlKOTn5mkhYqaiXxzl3N7jIBzfH9qb2RecGpgW2BabmRQYGVQWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX19hYWJhYWFgYmJiZGJcW2OXlaOnoq+xq66jqaasn6e1qpCPnaW1vLCtraKjmnqeo7KkpbGpl5u5pqOTmaqcjoaKiZyij66eopWon6CSlpmbrouqlo+omamNmamPn7q3pKWZnIyIeYKUjJuTipWSlJGNkpejjZ+fqZ6fuKN/g6+1oq+udKO8orGfd3ifqLC5lHWso56JgKt/ZFxidqCPpZ+El31tkrOco6etqqJlnp+Sc3mal3CAmKiYbX+iqIplnKadkpiYlo2SnJKGnpuQloSSh4+PkomFd2qOhnaGcHuFf39gaIeKlJKLWnWUkGdokI9ze6icm2Z6momEeZlqhYyEb3qAa3JlX3ZxbGtoXGZmYmJwU1s+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVldYGhmZ1hQSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6Cur6yrqaWoraKnraSSlqu2sbOnm6unrJdzjJ2woKirp5SXuaCgj5yknZF/iYibnoysmqKVp6GdjpaSnoR1rY+Ip5upkZekiZy7tKigmZiLiXV3k42Wk4qUkZGUjZCUoY+coaeZnLKVgIybtZ2zjJKOuqagfqeieqGttYCOjaWeg4uGkLGqr4yKl6SbeoCLrIabnaGnqKeHlYWYd6WbeoecgZengoJ7nLJ6ioahmJqVmJaDkZeXhZuZYnqHkIWPkJKLg21wjoZ5gHB/gIR+hXOFhJWReJZnknSgmnV9mYWjoIiYf5SMhYWaa4+Ohmx4e3FxZ2R3b2psa1xla2pldFxeSVRMUkBFNi5aVVU3KSEwOT4+NzQzNTY4Ozo9Pj5AREk/SUVKTEdTWFtZW2FhaGZaUUg5REw7PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop+lrKyrqKygp6+mpqmlmZSvyL+xopeoqbaekISdrJynoqCNkL6emoyfmqCQfIaPmZeHrJyhlp+gkYyTiYaAkaeNh6OdpJSYnoaeurKonpqSjoVxdpCJlZCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6msiLaFjbCBr6yCqIymmI2dfaiPcnt3nI+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWygaF9oZShkJiXgY+UnIuZkot9hZOHjpaSiYNtco+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56FpJ2EmoGOj4eLmnGPlIVoeHV8eGhodnBoaGxeZHBsZmxYZ0ddUk0zRTQ2TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUtNQEpjWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKfr6eoqKWrn6O3sKmrppqUoKOkq6SXpqu4o6+Aoaidpp6diZS9mZONoZKej3mElpaRh6uZm5yZoYSOi3ebnI+fkIiepJyWmpiHo7mupZqcjIx+Ym2Pi5OQjZCNjZiMkZKgj5ShoZmhp36hp4etnaCWrY+dnJyQhYCgjKmthaONqZmMmn+idYCZlGuCrXZNq3iHjZyRmqimgKmrfYOhe3qnap5/kmtnl4aXt4mefm5gZFmDl4CNe2Roi3KZfXmWbF19l21fUnCDXF9reIJfWGSBfIN/l3CnqmuDo25ypXCfhaBqZ6BtW2+MfWdaYISAYlhQb3dmbXRya2pvXWpxbWtpWGlPXVlGOUE1SERfbDUsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXV5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGgtruqrqKZmKGipa2uoZ6vtaOokqGgoKecmo6ZtJmQi5+MlYt1gZSSjIqmlZWZnp5+koWFrKSHm5CKmamZmpuSiKaxp6KWmoiJgGluiIeLjo6Ki42SjJGTo42Un6CcoaR/k4GPoqGUoHaclY+ngqCmf4Wnq4OleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5uomY6HnXuConN2pmaefnekX5h6fZN0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNic6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGGdmbOWcn2Yn7N1c1uesoNqYm90dnFpb1hrbXNyZl1pXmJMRT1ENlFCWnMzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1PUUBFX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOVlKO3mKqbk5+NpLa0rK2gmqKdpKOmrp2csq6sk5iimqGkmZqUnqubi4iSeIuFcYCWjoqQoY+SlJ2YfZCJjaigh5eOiZKklJybjYupqKWekJaHhX5qe4d+fZCNg4uRkYmQlKGDl56gnaCei4l3nJiijZ9xoYqHqYebpY6Upql9rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYWiZKF8iJaQm41tnmibjm+amXqAi6d9cml0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhwgZxglYxep3Z1h4h+nmiadYaTkpeOgJ9vmpFup5pdqX95u2t+qlyOhF20Z1xucnp4a2lccWt5eWNgZlhiQlFGTzdXQ1JvNUtbWl9OWkRBMjUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptJqniGOUm6u5sa+snqacnKmgn6+cnrGprZ6XpJuhoJmWlqCjmYaJjWqIgHJ7l4iMlpaEkZWYkHqKhJWjnIqUj4aMn5KdnYmQqaOgmoySioGAaYGGeX+XjHuJjo6IkJebf5Sjn6Chk5hyaJ+Jn4+LcJKMgKmHmJ6hpZ6me7Cto6K4l3ejs6OkgIiUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mLWipKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g55uc32VcJp0a6RdlXZIZWRgdHF+fm9mYGxpdnxkZWJRX1ddVFdAWkZRaERTV1xiWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lY3ZtXWVnZmtkZmxpaGtpk5yAsK2ZhFNeoKazubKyqJqijJysnJyqlKKspKOoj6CenZuZlpihnZaIh4l3hoFveZWFkZuLfJGTlohygIiSoZxzkZCBiZqVoZuFj6mcm5WLi4t8g2yEhXGCoYx4ho2IiJOZlnyTpKCeooithn21hI6enHullnqpgZWbj4mfm3ynaHdtfpl0oXNyfJ2GmXCTg659pIOlnZmAo29eqGd1omNvpWGc05B9e5l4c3NiooaQfqN0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2cbXxwlm1/cqJyXaRnc6ZgaKZtm9SafoabcHl7l2ycfHiXc26ppGdgZXpxgIVsaGZkbnZ4Z2BjU1xmUVFiSFhKVWFXVFtlalxlUUZDS01KS0JLRThPQFFOWFNZT1NRYGZmalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaWV8ZF5kZ2RrZGptZ2hsaJeaf6+qVFxLfqmvsbOvsqObmYWZqaChpI6mqaGZqoqamJiTmZOSoZiOh4V7cH2EaH2Pg5SagXeRjo+Jb3+Gj5OSbJeTfImSk6WXg4+rm5STi4aJeYN2h4Bugp+GeIGShoiZo5h7lKOkmZ+Js6Gitot6rKekrqVwqYCajoWAmpB7pIChmYaYcp6EpK6vipeMgI2kjZWCraCTdrW2tcmhc5SLgZ9gnZepbXqVh6CbdKKId6B+k5eLgXBNZqOScJqHc6R7eXRhg4FrfaBrcWRfnHF9c5ZoeWmztbTGpnOYfXqda5ybq3aFm212eJhqmnt1mHJRRX2zX2p2a3qIZmtoY3V1cW5XX1RZaVBTaElWTVlUVl1oa25WZ1dOS0FKTUtISk9BUUtQZWNqbWV0cnN/eXxudYl7e1RQTmxeaVxraVJqaGlsaGxmY2VgXF1dXmliZGlre19dZGhjamZubWVpbGWhm4iupYNkP5Ohsqqur7WiopCAl6qio6WMpaeenaaDmpeWjpeQj5yTjoiDemp5h2WDjX+YoHl1j4mMgWmEhZKDjIWdjXmNi5amk4OYqpiNkouBiXqAfYt5cJChhnqClYeJlqCWf5SlqJyVlYNmbnicbKJke3Gld5uYcGemgJWKeqR6n5aDl3Ked4GKlZePuW6RiqJifZiglYhtcmmqa3WgbW+mX5ppi5BploeblnWigX6aYIyGjXVwiGJooGWefmmbdW9jZoiBbXGiWl5bYqFtXYiLbnp9c3JkpW14omRnp2iZc4yZcKJvVYmQb6BfZqhUi15UmG5tc2tygm1waWx5dGtwUllXV2ZaVG1JWU9dSVhpaXNqWWtWUVJGVlxMWFNhVWlrX3d0e31wfHxyg3uAc3aNgIR2XlFyYmdjcGdQamhoa2xuaGRnX11eXWBqYmppdnVdXGNoY2pqc21ma21jnKOXpXlkc22Lpq2jqbCxpp+LgJirnZ+mjKOim6OigZaYk46akIuYkI6Ke4dxgIhpi4t8mJtzdYl9kHtkg4eVioqVmYJ8iIeXqJGBo6yQhpGLgop+gICOc2mQpoR9h5SNiJmgj4iTqaadiKZ4lZt+pIiWi7GYnZCCr5eepXaUhnipc6WPhJpupKKMkoSNg7tufaWvgoaFhpOVnJ98pXpyqJWglmaefm+sZJaKlpN3qG2qooGJdomDd6uRpohrkbBrdrOMqWuKhW1tn56SlWB+q4uqdn5+i6Wedp98g6SVnaBqm4h4rGierYy2dHe+jaSTWoOnjqthdXJ0cHx1cWNrf29pbVNXW1ZhYl1rTV1SXUpebW53X1txWVxgW2d0ZW5vcmNydGB3en55cnmDc4R/gXt7jIGCgHZieGRjbnJkUmtnaG9scmpmaWFgXlxha2JtbHpvXFxiaWJtanhtZ2xuYpWkqZyBf52jlqmpnaimrqSZioKYrJqfpYqbpp2pnYWMmo+GnJGFko2MjXSHe4iEb42FfpiTdHSGcpGCbX+LkYeGk459e4KGmKaOf6anjoGOiYWVdoKHkm9si6mBg4yUjomdn4mMlKqin4+AdZSXiH6BeZSuon+Bm3GPhneOiYJ9e3KnjHF9fXqYlpuEj3l7f36HlJWTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GHhIJljH9fgX+Ld3RylHVveW5th2yEhV51Z3eOZYCAhY2omn10e5VqiYhwgXZ9h3dubmiMc3p8mHiFXGxYeY9pb3hycW94eHBda4duamdWW2BXXWZrZFZjVV9RX3B4eWxrdmZra2t3fXJydXRhb3ZidHuCeHV6gnWAgICBeIuFg317bn9sZHluXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNk7eopomgopqmo5iknKuioYSEmK2SnqGJm6ebqZiDgZuLf5aUh46KiY1yg3yPfX6PhXuYj3RyhHCVhXt9kouGho+EeX6Ah5qljnyooYuGkJCFlYOGjph3coSpho6SnZCJn56IjJunn5+qg4iOlZp+fomWraePkaaPd2+bj4F4kG5+qIVwfZVxa3B9gaCNgJOOi2hsXIKLi5uano5zlYuIcXRrgXZ0gVlyboeRgX5/jGpdamR7hoSJgGBpeHqae4KKgXWBhYFnd4qGamFwcYF0XnGKgYiOpZSFZYuNg253i4Rxho96cWhoZXyEe5ZbXGtobnZbfHl4dW5zc4NnXG2La2tiWlpfW1lscVxfYVpfXWV0f3t1cHRka2trfH1zfHl1ZG51aG18fnd6fHt5eoCAfm+GioR7fXR+eXN/aFRccWlsdnB1Z2toZF1hWGtoa2txcm5XW2VubGdzem9oam1gi4qpsKGPoqGanp2Xnpioo6J+g5mujqCViJyikaWVf3uYhX2SmYmJhoeKc36BjHaFjIKEl4pyb4BymIaDfpKDhIaJgHqBhIycoZGDp6KIeY6XiZWLi5yXhIN6rYKRmJqVip6dh4ihqp+hoqOLh5ObnKOZlaqhp6afkpqHlYx6do2Ng6d+f5KQk5SdsqablZ+QjbGSl4OljIyVmp+JkJuCiJGKa3yOd3hlg4eRi3yJnoSHjJCJiIGFhJB3fHp0maCIhomdiYSTfn2KgIB1b3KEgn53hoaKj6WQgoWMhoKMkIx9iIyKkYR6bYOFfnqZa3NpYXSKcX56d3dvd3SCXV5vh2huX15aXV1TaHJWZF1dYmxodXx8c29wZGtqaYB9bnmAcmpwcWxngXtygoB4f31/hHttgoyGfHp5e316g3hOY3Zqc25wemVrZWNiYFt0ZnBncnFtVV1sdG1oeXpxZ2lrZIyHnLmelqGgmJSYmZSYpKCefH+arI+fjoagnYueln15lIN7jpmKhoOEh255gYFzgYh+iZSEbWt+epeHhIOQf4CHhIV8h4WPnJ+Th6ughHOLkIaSkYudkX2Ne6qEjpOYlo+cloeHnKWfopqdhYKSmpmYj5mmn6WdnI+Vf4+IdXuGjYSle3yOkJGGmauhnpSdkI6pjZCAnYyIk5mego+XfoaOg294hnF1YH+EkIZ1jZmBg5CDh4V/hYSVbnl2dJKhiouFmoOEjHN/iXt8cnF6h4N6d4mOg5Gmj4WDjoCDiomKd4aJi4x+cW1/gnxvaGxtaF96f2h+fHZ1dnV7eFxfcX5udGBjW11fUmduVGVbXmJraXZ5f3FsbWRramiBf2x0gWxsdW96cIZ5boeAdoKAfoV2cYKNiH57e3x/e4KKYGh7anVoaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2LiZ62maCjn5KRlZiLmp6fnnt4n6eRnIuHpZWLmJl5eo2FfImRhIyCgoNufIB5c4GFfouRfWtofYKXiYGIjnx+hoSGfI+CkJ2dk4monYBwjIuMkoagoYqFjHyokYiQkpeTlpN4jaOfoJ2WmX+AkJqYkoyaoqCjmZeQmn2Mg3d/go6GoH9+jIyPfJikoaKTmpGQpoyPgZqRiZKXm36Tkn6HjoF1c4Jwd2F+gI6GcouWfYiMcox/goWGj2h4cniLmJGPf5Z9iIpxgYZ7fHB3eoqDeXmPjIKUpJKLhY97hYaHhHaDhImJfGdzfYB5e3Fta2dffnNofHV2dHxzgGpeYHR2cHdkY1lfX1JraVVlWWBhaGp2eYJxZ2tkbGhmgIBrbn5ob3FsfnmHemyMgXOBgX6BdHaCjYZ/fHp/gX1/j2lyg250aWGHaGxiX3FWdG9tbWB4aG1XanR2Y3V6e3Jiam96iYyesZGlpJyOj5ePhpygm519d6WhjpiAjaOLiJqWeXuGh36DiX+JgoF/cn97dHaDhX6KkXhnY36Gl4qCiox5fYCNg3mWgpaZmI6XoZx+cIyCkZOGpZuHjImDppWFk4uWmJOSd5GdoKGXlJZ5fo6Xl42WmpyjnZiSlJp4jYSCd4OVjZ1+gYmNjHOXo5+ilJmPj6KMioKWl4OSlpl+mI18iI2BdnF9bntkgHyLhXGHk4CRgmyHg4GAiYVmdW97hZGXi3ySd4uIe3+Fe3pxfXeIhHmDj4iKl6GVgYOLdoiEg4J3fIOKh3hgenl+dH94Z21lYX9qandzdHZ+cXxjY2BzbnVybWFaYV5bbGVSY1lhYWhrdnmGcWNrY21maHyDbWl1aG5waYB9gnltkIZygIODf3R8g4yBgH16goN+fJBtdolzdW1limxqYmJ2VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm62XpqeejYyXh4afk5eZfniqnYuZepedi4yYkHl8gYx+fIR8gYOBeHR5enR9gISAiYuAZF99i5WHfoSGdX1+i399mIaXlZiNpKKZf3KHe5ORiaaPjI6Kk6CRg5KQlZeRi4GPmJ+akZCQc3+NkZOJnZ2eppeXjJSVcouMiWuEl4+ZeoeIj4lvl52apJSVi4yei4aBkZx/kpKVhpmIe4qKgXlxeWt1bHx/i35uhpODlXhxgoR+fouAZXJpe3+Wl4N+jXOPh4N4hnx1d398hH97gouDi5Ojj3iDgXSJh32AdHaCiYVwYXx2e3J9cGJvY2R8Y25wdnN4d3N0YnZgb2x2bm9cXF9eXmpeUF1ZY2FobnR7iWtgaWVrY2l3h25nbGlrbWiBfXt3b5CIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhtbIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJipn6OonYqKkoWKnYuVmH54r5mNl32flJGXk4h3fnuKfXyAd3iAgHB1dHxvhn2BgYp/fGFcfo+Rhn+Dg3N7gId6j5KJk5Kdk6acloJ9gX2OipGjiI6KjZiajYaSmZSWjoqIjJKcko+MjG6EkI+RiJ6ZoqCWlYmWkG2HmINlhZiOk3qJhJCKcJaalKOTkomLmYyBf5CdfZKOkoyZjnuKhYdzc3ZrcG51fIp0boaRj5NxdYF8gYGIfGVwbHl8mZN8g4h0kImAc4d4bn98gIV7hIuHgouUp4x6hnt+ioV3fnFwgYeEZWh5dXZxfGJfcGFrdF9xant5eWxzcGV5Xm5sc21yWFtfYGFrW1BXWGVjZ3Fxf4dmXWlpZ2JncY1vZGloZWlpgXp3dW+OhXSBgoN7dYKIhXiFfHiEhXp/iXd/i3t7cniDamtfcGh0gGtyb21yZ29sZXxjboB6d3Fsd3eKfqKXoaegppuHi4uBj5yHk512gquVk46HoY2WlI9/c3x2hXh5f3Nze4Zrc3B6bot2gIGIb3FbWX6RjYeAf392dYCAgKCHkouUnpiilZh4in+BjYicnYqPhpKYloWJlZqQl4uLjI2MnImOkINtiYuQkYqdlqGbl5SFl4dpg6KBZYSciZB+i4OLgXeTmJKfk5GJiZSNfn2Ol3uRjI+OmpJ8ioCCb3ZwbG1vcHuGaXSDj5mLcXeAdYKIg3lmcm51gJmOe4eDeZOQeXWHc2+HeoSKeYqFgoeNmqKGe4N1got/d3lubIGFg15zdXNxcXlaX3FhcGtecGp9e3FtbWptdmBwb2txbVlZYmFiblhRVFpmZ2N1cISCYl1rbmRjZmuSbmBnZ19oa4F1cnNwi4B1f4OAeHWAi4B5hX94h4Z3g4V8hot/e3aKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx1dXSAg36klZqsnqeWhY2Ef5eUg5CgdoyglJOGi5uNlo6LeXF4dIJwcoV0cXaIbHBudm2IdoN+gG5uVVGBq5SHg3h/d3KDeoOggpOClZSZnJObeJJ7g4ySo5mTjomVmZKEh5eZjJSLiY+Ph52EkIp8c4uFio6InJqfm5WTf5N9aISbhmeFn4eRhJGCiXGDkZiQm4+PjIyPjHd7kZB6jouMkZaMfIh8gGt2am5rbGx7f2J6fo+XgXZ7gXiDjH15Z3Nsc4aVi32HhXqTj3B5g292i3mIinmIfIGLj52dhHt6doKLfHdxamyChHtgeHFubXJ0Vl9wYnJhYG1venFob2Zmc3RpcWtid2VdV2ZgYHJTUU9cZmVdeXCIfGBcaXJiYmVmkWpfaGVbZ3B+cGtxdIp9dnyGgHV1fox5e4WBeIiDc4aFfoyMhHx5lXhmcmuDYIh9b29remBqbnV/dV90fXmGeHRzhX14oI+ZsJuljoKLf4OZh4CMn4CLmpSPhYiYj4+PhHZ0d3SAcXCFdHByhHBraXdug259fW11c1JNgt/IktaTe3B1hHaEoIOUd5aRmZ2RmXuUc4WQnqGTk5CJk5yUhn+XloiNjYiSjYibf46Ad3qNfomMipybnJqUknmMdWaHkIVrh6KEkYiXg4ZjjJGZj5WLl4yMiotxepSIe46IipKRiXmFfH9se2VzcGtsenpbgXmQkIF6fn+Aho57emhyanOKjomBhIR8lIprfX5tf4t9ioV8g3iAjpSZmYp8dXeDj3hybWdxgIVua3VwaGp1blNfb2VwWmBscnhna2piZnhycHBjYHdgYFZrX152UE5MYWdiXXpxiXVdXGV2YWJlZY5kYWdiWWlzc25rcXaMfHR6hoJ1dn6Lc4CGf3uJf3KJiIGRi4h8fph2ZXNufGWIfm9wbIBZbG55eXNgdnp7jXZyd4p3eZ6Lm66aoJCChXeIlX58ip6IhqCSj4WMmISTjoeBdHhweXFvhG9tb39zZWV5cX1ten1qaGtjpJrB3K7woXNsdoR2haOGk3CXkZahlZyBknKGi6KXiY2VipCdloOBlpCFiY+AkYqJln6HenV/iXiHhI6cmpiYjo92iXRthYiJfImig5GJnISFXouTl4uPiY+Li4SJbXuWgX2IhYmRj4Z2hX1+a31keHVqbnlzWIl7koiFen6BgYaMf3llcml/iY2JgYJ+i5WEa4F1bYaPgY6DfYF4fo+UkpiPdHJ3h4x1c3FndnqEY3VucWNqdmhSYXFnbFZfb3R6YXJkYGl9cHJuW2NyYGJWbllceE5NTGRmYl53c4luXFxkeV5fZWWFYGNjX1lqc2tua3N3jH10d4SBeHd7iXGDhH1+iHt0i4mIloaMf36Xc2d1cnlsjHtudHGBV3F6dnlyZXd5h41pdoCJcn+chpimm6OShH1xjJR3eYyehYWhjY98lo2AmYiEe3N3cHRqcIFsaW18dV9heHd8cXV8aGBkfOvatcnD3IdzbHSCd4ubiY9qmZGQnpaUgYlxhYifjYSLlYqMmJR8jZOIg4mPe5CLhY+Bf3Z4g4RyiIKTnJaUl4WMdYZ+b4OBh4aYoYKTjJ6DiWGDlI+HioaJjYeBh2l8k399g4SJjo2CcYZ+f3F3aHZyaXR3bFqNfZODhX2AhIGEioJ2YXJriICOiYF+fpGQfW2Ba3eEjYSQgnuAfH6PkY+ViG5weYyFdGtxbHN5gmF1am9dbHdhUmVyaWZTYHB2dWFwYF1og3FzaldnaGJpWG1WW3VMS0xlZ15ic3OFalxcZXleXmRne2FkX11Za29mb2p0eIp+c3OBfnt2eohzhYN8f4d2d4qGj5mBjIJ7k3Vsd3Z5eJN0bnh7fVh6hnGAb2d5d5KDZHaGhXCKloWZoJqiiod0b5KMcXePnH6LmomJfKB/hJmAgXhydG5vZHJ/aWZteHhcYHl7e3FxgGphZ2F/1baOkaZ4bnF3fHGTkY2Ia5qPiZ2TjIZ7aYeLmYaBkpGGh5iOfI2NgYGKjXyPjH2JhHp0eoN7cYaAlpqOk5OBiHSChXSCf4mRnJ2GlI+ffohif5OHhYiEio2AgINnfJCAfn+CjI+Qfm2DfIJ0a213dXR3dmxjjoGPgIV+fYZ/hIl/cF9xb4R7jouBe36QiHlwg2V5gYmFioF6hHx+ko2PkYNtbnmLfnVtbmtse39kaWxqWW53WlNqc2liUWNyeG1jZl5aaoNuc2JbZ19kbF9uVVtwT0hPZ2VcZ29xgG1aXGNzYFxjbHdlZV1dWmtsY21qc3eGf3Fwf3x9dHiGeIWCfICHdXmJgZKVfImGdoiBcHh5e4STb257gXdeg4B0gm1penSUc2dziHxxkpGDmZ6boIaIdnaUf213lJh/iJCEi46afYyadn52cXBsamF1fGdianV6W2B4fHptcX9lY2hnV52PX3FzlrzEhHdxlIqQgHSYjIedlI2Ic2uIj5WAe5SLgYSbjHyKhn18iYx/k4d0iYV2dn2CcXWGgZ6VhpSPgoJxfodzg3qIlpuWhpKNnICIZn2TgoCGg4mJcoF9Z32Le3l/f4eLj31pgHyDdmZveXhzd3Rsa4+Gi4KLf3mDgYSEgGtecHd6fYuHhHuAjn9+coBoeIGGiYSCd4J6f5aLjot8bWt6iHx2dG9paH53ZV1xY1hwdFNUb3NpYk5odXlnYV5dWG+Ab3RZZGFdam1gcE9ZbFJEVGhiWmxvbXtvWVtebWNaY293ZGdcXWBramNsaXN3gYNxbn57f3R1g3qEgnyChXZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaYJ5en5ubXx2lmtqeIR0a5OMhZ6YoJmFiG9+jHZqeZmPgIKKgpaYinqPlm96c3FsamRgdHtpYGZye1thc316Z3B6YWVkjrGyd0tiWqXa0Zdye5KMkXl/loyFmpKNhm9shZKReXmThoCEmYp8h4B5eImKhJWAb4qHcXR9e2p5hoOlkYSTjIJ+bn6CdYJ3hJqXkoqTj5SFh3B6koR+g4OJg2+BeGiAhXhyf3+Diod8ZXx+g3ZjcHOAaXlxb3WZjYaEi3x3eYCEeoJrXG98cn+Hg4h9hYd6iHGAbXCChY2Cg3GDd3+Yi42Dd21tfoN/dnplaGp+cmFaeFpZcm5OWHJ0ZmBLbXd1Yl5cW1l1fXJwV2ZdZmpxX29OV2lTP1lnX1twa2d5cVtbWWtlWWNweV9oXV5lbGhmbGlxeH+Hb21/fYF1cIJ7gIF/g392gYWJl4pxgo1xe4Z8enmElIx1a3p/a29+dH99b3J8e5Rwb4B/eWaSiYKhmJ2Rg4Znh4RwZ3qXin6AhYKZioF8jY1peHJsbGZfYW95bWBib3lcZGyDemFxdl9kZdXrvosyOj6LjoByeYaJj413hZmOf5SPjX9ubYWMi3V9j3+FgpWJfIN4bnaHhYKWd26HhGt1e3RleYOEp4yDj4yDfW1/c3WCeISaj4uPkZKMi4Z+e5KHeICFjYNsgHJpf354bXx7gYqDeGJ5hIJxZHFofm51cnWCnIyBgIZ/dHZ+gHOBb1trfXN4iIGKe4Z/fIh3eXBrh4KOgolxgHd9lImKfXRtanaAgHV1XGlpeXFaV31TWnJmTVtzcmZcSnF4cF1bW1pddX91aVliW2dlbmJpTVdmUT1eZl1edmZfdXFbWVVvZFpkcHlbaF5gZ21namtocHh9jm1qgYR/eW6Be32Bf4J6dYKBjJOFcICLbnd9gHt7iJOJgGl7fmp0fHKGe3N3fX+MeniEfnxrjIyDm52WjIKBbI1+a2h/j458fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXDVar7V1aoCKfpOHd4iYh3WQjIp3cG2FgoZ0eYl4iX2TiHp+c2d1iH59l29xhn1odnluZXqJhaWHgIeNiX1tfXR+f3uKl4aBkpCYiIuEiXyPiXJ8foV8aX5ta4B7eWp6doKHgHJgd4F+cWRyZ3WCbnV7hpWSgn2CgHB3enx1fm1XbX11c4p/hnaGdIKJendybYh/jn+DcX17fJGHiHptbWhtgoF1bl1oZnRyUlx8TlxxXU9cc3BkVktzeWpYWVlaYXGBdWFdXWBmZGhoZk5aaE5BYWRcYHZhXHVtWFhTdGFbZW9yV2pfYmhrZ21saXB3fJNsaISJfXxwf357gX+CeneAgImLhHJ7h29xd4R/e4mNj4RqfntueHl3ind9eICCh3+Efn56bYSMiJijjYWEe3aLemtthYmSeX17gpKAgH2KhHBycGNmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f76cp6TJuHKFhHOUfXmIlIR0ko2HcnNwhHqCc3WGdIh3lIl5eXFkd4Z6gJJocYR1Znd2ZGp8hIiegoB/jo59cX5yg3h+kI6Cd5WMlI+Igoh6iYlseXp/dWh6aWx/eXNpenaAg31oYHiHfWpqdGh7gGp2gY2RlX98fn5xfHZ8dH5iVXV7cXKIgoJ7gXCGiXd4b2+CgYt9fHd8e3ONhIF1aHBnbIiCcnBdaGN0b0xmdkxeb1ZUWnRuYlFPdHliUlhYXWFwgnNbYV1oZWVjamRRW3FJRGRiXGRxXlx4aFVXVndeXGZuaFZsXmFqZ2Vubmhwd3qTbmmIjHl9c3t+eYKBgnx2fYOIhoNwdoNzbneCgn6Ii5R/cYB8eHp6gYt0g3h/gYGChHqAdW99iYubnoh+hnt3hntndYeNkXp/gHyJhoR2j4BncG5gZVxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6naqceGiLNyinlwjnZ9iJCBe5SLgHV0dX52f29wf22FdJSGeHRsYHmBeYiOZXGDb2d1blttfYGQk4CBeZKSfXd6bIV0f4+Kg3KViZGPh4WFe3+GbXV2f21od2ZtfHZtand2f398YGJ4hnpodXZjfntodYaPjpZ9dYB2coB6fW2AWVZyfW9zgoZ+f3driIZzeGp0f4KCfHl7d3pxin97cmdzZG2LhGxzW2pfdmZJb29MW2NYV1Z5bWJQU3V3WVFWWF5gcoRvXGBjbWRjXW9jVF1yR0JmX15maV1ae2NSVlx1W1tna2FWa2BgbmZmbHFocHZ4jnRrjox1f3Z4fXeBg4F7dH6DiIiDb3F/dXF1fYWBiY2Le3d/eIR8fYWHeId8fYF+hYB7fnJ2eIuOn4yJe4p3dYN6Xn6Hmo15h4R0hoeEd4l7Ym5tXGJbW2FVanRkYFtob3Bnh3FhcWZXXGNrf3zKzoe6omtub4ttcoRyfoaLf3uShXp5dHl1dHpqbHZjhHaSgnZvZ198gXmLiGVxgGpqcWNYbXuGnImDgnKXk3d9e22Gb4CJioZwlo6QiIaMhHt5f3JycH5naHJjbXhxamxxd318eV1leYB3aXV4ZoJ3aHWHjI6VfXOHam9+gHhufV1XcH1tc36Je4Btbop/cHZmdn5/foB1e3B5c4V7eHFlcmBti4FrclhrX3hdSXBsTldWX1RVfGtiT1R2c1JSVVdeYnSGaV1ga2pmYlluYVhjcEdBaF1hZl9cVnxeT1ZlcVlbamhdWGhhX3JmamhxZ3FzdoZ5bpWKdH97d355g4eAdXN/hYWOg3Bwe3h3dXmGhYeMhnp8f3WLfn2GhISHf35/fYd/fHh2eXaRk59+jX2LbnWAemSEiJiGdJKKb4WFgnqDdWNuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq56n7huYnSHaXV8cnqEh3t+jYB3eHJ3b3p2ZWpvYYd1joFzamJefXd4ioJlcH1oa2taVm94i6SBhX9wmZJxf3d0gGx/gI+GcpOHjIiFiYV9eXVzb2l5YWptYW12amdra3l3endbZ318eGVyfW6EdGZ1ho2GloBwi2dre4N0bHViW256anN6inuAZXSHfG1wZ3R9dnx+cHpqeXqAeHZvZWxhbIl9bG5WamF4VktrbE9ST2lOWX1oYk9VdmxNUVRVXmZ2hGddYXFoZ2FXaVxca2lKRWtaYmVXWFV5Wk5XbmpZXWxlXVplY150ZmxlcWZzcHSBeHCZhXZ/f3h/fIWHfXVzgod/lYNuc3l7e3NyhYaIiIR5gX12j399hImOhIGDe36Lg3t3fHd2mp2XeoqDh2p2fn1shIaVgXKPgnGFgn6CgG9mbGdYXVtcW1RlcGVfWGNydWl2cGRlYldbW2h/cG9ygHOKZWZ6f2p1d3R0hIV4gYV6d3R1bmt6cGFoa2eGdI2EbmZeX3xveol9aG13ZmpkVldzcI6nfYR8dpaQc3txe3hseXqPg3WXfIeGg4eEfXVxc21odV1taWBtdWRnZml6b3tyWWeBdnVocIB4gnZid4WLfJWCb4xrbXuBcWZzZWBreGZxdYl6fWF1g3Vpa3F0eW94d3J7ZX19fnd1bmJlYGyGfG1rVmpjclRMamtQTE9wSF58ZmFOVnVlSk9TWGFrd35mXWdzaWVfV2NXYnFdS0trWGRiVVRVc1ZNWXZlWl9sYFxbY2Vfd2dtYnBpdG9xfnV0mYF3f4B4gH+GhHp9doKDfpiFbnJ0fHt0cYWFjoGAeot1dJCAfYGUjoCFhH1+jIZ6foF2e6OlinmJhoVsdXx8dYSDjXtvhXN6hX2Cg3VuamllVl1bW1pTY25lW1hidHtqaW1oYGFXXlppgGlsb4BnbWJpe3prdHV1b4aCeoF+dnVuemhqeWpfZW5ogXeQhGhlWGF2aX2GeW5pb2ZnXVVYb2mPqHeBenyQjnh0bn1tcXR4jX53lHSFg4CFiXZqc3ZoaW9cbWVebnNfZ2JqeGh7bVttg3J0am+Afnl3YXeFhHiQhnOIcnB6f3JjcWhbbXZkb3KHendhcoBvZ2l4c3Frd3ZzdWKCen12dW9jYmJtfHxra1VpYmdUTG5oUEhSbEVheWZiTVRyXkpNVVllbHh7Zl9tcGpjXVZgVW9uV0pTaFhnXlhNVWxUS116X1xfbF1dW2JlYHpobGFvb3Zub3d1eph9d4CBeYCAh4Z6eXqDfYGThHF0dH56dnSFiJB+gX2QbHOVgXuCn4V/h32AfoaCgIp7dYSsn396iIiEbHKCenaBgYJ1bodvfYB0ioBqb25lZFhfWlpaVWJqZ1xaX3WCaV5tbFxhV1tca4FlcXV9aWpebXh3aHV4c26HfH5+enZzbHpnaXdnXWRzZ3p3koFjY1Rkb2aBhHZ2ZmhqYVdWWWhjkKhvf3d/io56cG97ZndteYp6do5xg31/f4duZHd0ZWhpXWxiXnBwW2dfbXVlemhddIBucmtxe351dWJ1hox7iIiAf3hydX50YXBsWHByYW9wg3p0Y3GAa2Bsem5paHl3c3Bkg3R4eHRwZGBjbXJ9amxUaV5fVUx1Y1FHV2JHY3dmYUxUcFlLTFhYaGx2emVkbXFmY1pYXVh2ZlRKXGNYaVhYSFdlUUljeFtdX21bXlxiY15/aWpgbnR4bW9udoOXeXKBgH1/iYyGfnV2hniGjH10dXWCeXp6goyOfX6FiWp0loF7ip19foV5gHt+fIaJc3GProx7e4eQfmZxiHp0fn12cm+GbHx+bZB6Y3BwYmVdZVZaWVdjZmtgXV1zhmhZcW5bXlhaXGx7YnF3dmxjXG50dWh1d3FuhXl/gXp3b290ZWh0ZVtndWZ2dpJ6X11TZWVqgoFzfGFjaVxUV15iZJClaXl0goWQeGxteWZ3bHuDeXSHcoB4fHmAaWV3bWBnYV9rYF51a1lmXW9vYnplW3d8a25ucHh5dHVlc4OTf4iDiXp2b3J9cmF4Y1pub2BvcIB6c2VxgGRebXVoY2Z4enJrbYBzcntxcWFeZW1ufWRpVGhZWlVOeV9SSlpZSGN1ZGFKVG1VSkxaV2lscntkbGxzYmFZWlthdlxUS2NdWWpTVkdZYU5IanZYX2FuW1tfYmNdhWloYm53eW1vanaBkHhtg36AgpKIhIF2dYl0jIZ0cXZ2gXd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OHhHNwmaJ6e4CJlXlldYh6c3l3bHRwf2x5fHCSc15wb2FnYmxUW1pXaWRtZlxccYllU3JuW1lYV2BsdmRqdWpqX1tudHJtdHR1a4Z9f4B9d29ubGRpcGNba3JkdHaOc1xXVGRgcX9+cYFcYmNeU1phXGSTn2VycYWDkHNranhsbm55eXpxgHZ/c3t6e2RmdmheY1thaFxed2hXYl5waGF3YVt8dmpqcm94dHN0aXGClYOHf4V2c2pwfG1md1dbaWxhcHF/eHNlb35aYHBwYV5pb3xranJ9cW92aW9gW2RrbHthZlRnVVhTUXdcUlBZUkhkc2JgR1ZrUUlQWlVrbGt8ZW1vcmFbWlhZbHBXU1BmV1dpU1RGWlxPSXN1WGBjbmNYYWFiXYxqY2Vtenlsbml2eYZ6a4R9gIWZfIKEeX2IbY+GcW92en10goJ9i4+Dgpd0eIKUhYGfiXWBf4F0f4Jwh4N2b6KXc3uGi4d7ZneLb258cGd4cXtsc3ZzjWtedG9iZ2VrU15cVmhibGxbXHGNZE5vbVxWV1VnaXRoY3RlZV5acHZvcXZ2emyIfYB9iHeQc2Nka29hXG5tY3N4h2taVFZiY3d8fHCEXGNfY1RaYFpjl5VjbnCChYlyaWZ5bmRydXF6a3l0dW97f3ZfZ3NkXF9XYmRZYXVlVV9gbWRhcV1dfm9oaXNxdHB1dmxthZSCiXyFcXJnbnxvcW9SWmVpZHByf3VzYmx1VWJxaltebmR7ZGt0fHFxcWlsX1hkaWp4XmZVZFVXUVZvWFFXVFBIZXJfYUZYa09JWFRWbmlkfGlreGthV1xVW3RkU1JWaFFZZ1RTSFpbUE55d1tfZW1qWmJgX16PbmFna3l2bm5pdnZ/fm2EgH6Gl3t/h4GKf2uTiHJndIB7dYCDfomOf4uTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYt3eG56jWBlfXFnenR5bG1xd4NnZHxtY2dnaFNgX1VnYGxvXF5ujmhNaWxgVVZTb2Zza2Z4ZWVdWnJ2bnN7eXNuiXuAd5x7emthZWxtXmBuamVweX5nWlZYX2x4e3pvg19iXmdWWWBYZJyIYmtwgYZ8d2tqdmxbdXBqeWl1cm5vfIFzWGtvYFleVmNkWGVxY1RfYmlhYmxaYH5rZmxzdW9teHZsaIaMf4l7iG1xZnB7bHFsYVhfZ2ducn9zcl5pbFNlcGRVYm1heGFvdHp0aW5ral5XYGZodVxkVmJWVE9ZZ1NPXU9QSGVwXWNHWmpOSmBLWG1lX3hobn5kYFVeVF11W1RSYGdOXmJVU0pcWlFadnZdX2ZtaFhjYVtejnBjaGp3cnNtaHZ0eYJzgoN6iI5+fIqIjnluj4p0bHOCc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY6NjI2Njo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZp6bG5tbm5vamZnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJycnXdlZ2dnZ2hjX19fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6Oi4qKioqJiomIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5GLko6NkYiPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2NjY2NjY2NjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoWNh4aJhoiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiIuGhYSFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCIi4SHhIaJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMkIiMhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6fHp6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pi46Mi46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTkpKSkpKTk5OTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKRkZGRkpOSkpKTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSko+SkZGSkpOGhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCRgoCSkJGSjXWHkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcIKQj5B7dYiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzbomPiXJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjHZteo+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc21tgnl0dYCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RhXmRfYmpwZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYV9tbF1mZ2dlYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaa3dsYm9zamJaWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtqcmtfbHRzZ1FRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXGNua1ppc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0VDRUlWYmZrcXBubWxaTUxOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDR0hJTltnaGdxbm5pZmRgX19YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8PUhZXFteZmxua29tbWxraWlqYlFHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1KWmhubnBqbm1ramxsZE9HRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozo9RWBuc25ubGxsZlFCP0NGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PEhcdHVxZVA+Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkFqfGk9OTs+PT4/QEBAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APFxuQD5ERT9AQUFbYzw9PTs6PT5BQUA+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT5BOklkPTw9PDg6Oz8/PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlMRkZ1d003ODg6Oz4+VmpBOzw8Ojo7Pj8/PT05Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3J5STtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PT0/QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnlrYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVudH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8ent7fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRkZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fH1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExNTE1OTElGR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbISHhoaGh4iIh3xQS0xLSEhGRkREQ0NAQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGg4KGhYSEhoaGh4eGinVLSkZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMj2hDQT04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouMiWBDNzU1NTc2NjY1NTg3MzU2ODo4NzY1NjU2NzY3Njc6Njc4ODk6NzU3ODk3OTc3Njo8QEdGSUdJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJi4qJiYqKioqLiYqKh2ZJNTlANTg4NzQ1Nzg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Njg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeHiIiKioyLioqMg2VQWkM6PD0+OTk6Ozg6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCREhJTUtJS0xXb3JzdXN2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKi4uMfWpTPUJERUVCQUBCP0BDQUA+PT4+QD8/P0A+Pz09P0I+QEE/QD89QEBAPj9BPD48Ozo7Ojk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uLjIqLdEVDR0pMSkpHR0hFRkhHRUJBQENFRENBQkJCP0BESEVDRUNFREFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyMi4uJWkpQTk5MT0pKS0lJSkpJRUNERkdGRENFRkRCSElLR0hHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjYyMi4yBbG1VTk1PTEpMSklKSEpGREdJSElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7Oz06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjIyLi459YFhQT05NTE1KSEhFSUlFS0lHSkpJSkdHR0tMTkxMSEhJSk1RTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIyLi4pfVFRST09OS0pHRkJHSkdMS0ZLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRkZIRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIuLjn1aWFRUVlRPTUtKREVHTE9OT1dVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yMjGlZWGtiRlRRUVBKOztSU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH5hiouLh21cZVY6WVlYU1E/QFZVWFxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU290dnh5eHd6eXp7enp8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKjHpvcFlbXFtSVFJWVlVbWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeEi35nWVlcWVRWVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn6AfF1RVlhVUlVTUVFMT01LZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fn5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xV0pMTk9LTktJSkRFSUVDPlRkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eXFlVUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11MRD9DQ0NDQkBEUEJDQUM9Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fX+DgIODgoCCgIKBgmtNRz9AOzs+Pz8/Pz5rUEpgRUZISUVCP0dMTkdNUlVJQkU/Pzw9PD09Pz0/QUNDQD89PUI+Sk5HVW50dHVzdHZ4enx7fHx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVVBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtNV01IR0BCPDk3NzU5OT07Ozs4OTg6PzxCSD9cc3R1dXV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXVpJSFBSUU9NUFFOUVJUVlhTUllUT1laW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1LVFRTUFFVT0xSU1RYWFRUWVJNV1laVlhYVlhZXVdXWGhza11WYXNrYWFfXmRhX15ZVFFOT05MSUhKTElJRkNRUFNbV1RUTlFTWVNcZVVPU1NRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTpHbnF0d3h5e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBTU09NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz49Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF1SVFpWV1VUV1RSWFhZWVlTVU9KR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0hGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR1eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nU1FTQUdVUE9RUVBOTU5NS0xLS05PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTExLSTw5ODc7PkA+PD1BQEI9PkVIR0NFRklHSkpARkFBQEZIRUpPSFFSYVxRUFJPU09PUExMT01MTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZFP0JDPjxCRz9CP0FkcHN3enp6e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0JAQD5ARElFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xNS0xNTU1MTE9OU2ROSkxSSUlJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxAQkFBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRHSUlKTEpLTElKTU1PUFJQS0dDTEdDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSEhHSktJSktERkI9Pj05OTo7QEI/PUJCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISUxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS01KS0ZHR0pNTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjpAQ0A+QkNERUlFSUpMRklJR0ZGREI7QUNDPkBDRENER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSEhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NCRUBEQj4/Pjo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1ERUI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIT0tDSU1LT01PTk9QTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFR0NCQUJEPUJBPkE9Ojo9Pzo9PkBCPkBCREZKRUlGSUhGRkdFQ0JBQUZGQ0JCQkRFREdHSUZMUUxJT0pKTExJR0hFR0ZEQ0lJSEtKR0tSTUJOTk1QTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREU8QUBAQzw4Oj0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFSUFBRTk9NTlBNTE1TV1ZYWFVYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc6Pj06PjpAQj4/P0NFRkRGREVIRURFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR05LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFJPUU1OUU5NUFdaVlpZVlpdWVhhYGBgXmhlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSEhHSURCQ0hFPEBFQkU9ODk+Pj08PEFCPT8+QUJGQ0VDQ0lEQ0VFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5LT05PUlVWT0tVV1NQU1FSTE9RUE9UWVpZXFpZW15eXWBjXlxhY2tiYGRnZ3KFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD9APz4/QkE8QD5BQUZDRUVESUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxJSEdKR0xMTUxMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1JSUFZbW11eW1xeX19hYGFkXWNgZWZgZWhqZHNzZmpnZ2tvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQ0VERTxARkREQzs/P0JAQEBDQT9CP0FDSENGRUZJRklGR0RJSUdJSEpMSEhKSklMSkZKS0hJS0pHS0tNTUpKTUxOTk5QS09RUlRYVk1OVFZUUlJRUExOVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTExMTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdDSElHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdISklJS0hKSk5MTktJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVLRkVKTUxLTExHR01JR0pLSEtLSUtLTkxOTExMSUxNTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdCRkNGRUZFRENISEdERUtIR0xOTktNTUZKTkhKS0pJTEtKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGR0JHRElFRUVCRklISEVITEpHTU1OS01OR0xNSUxLSUpNSUtJSktPUE9OTUxOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNHREhHTEhFQ0NIS0lIRkpMTEZOTExTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFBPkREQkdESElNSUZDRkpMSkdGS05MRU9KS1dSS0dLSkpOSUhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERUNGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElHS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xWWVtdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZFQUVDQERIREZHQ0lLTEhGREdLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT0xJUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CRENCRUlFR0dGS0pLSEVFSUpLRkVISFBLTU1KTVJJR0VBSEZKSUtMSkxKSEZESUZERkdFRkpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNHSEZIR0hLSkpJREZLS0tFRklKTktOS0hMTkdIRT5HR0xJS0xLS0tJR0RIRENERUFGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFYVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZJR0hHSEtJTERES0tOTUxLSEtKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQj9JSkhPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUVtXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHR0lHRkZJTEpORkRLS01OSkxJS0pISEZCSEhRTUtLT0xKS0lHR0VEP0VDSUlCQkdGRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktKTVBFRklKS05MTElLTElIR0RIS1FPTU1QTExKS0hJQ0RBRURJR0NCR0ZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV19fVFBPT09XUVxbW1xcXl9iZmZlbGVvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxLS0xLSUpHRUpOUVFOT09NTkxNSEtBREFDREdFQ0JFR0JNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NT1RTWlhYWl1cYGFkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxHR1hMR0hKSEdNTFFRSExLS0tOTVVOT0pKS0dHS09TU05QT05OTk5HS0ZgRURfTEVmZEVOW0leW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRkdGSEVFS09TSUpGYFRISU9KSU9NUlFLTUxMT1JVUk9PSUxNR0hMUFtZT1BQTk9PT0lKUX9RSXxZWXF0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW19gYWFhXWBhZ21wbGBwd3R4gYGCg4OCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJS0VRVkxLTklLUlhXUU1PT01RVE5PUU9LS05HTU9SW1pTUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0hRUlRZV1ZQVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVib3ZQZWVJZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anV1cIBfcmZ9aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J2eX6Bc3V6bnx9eXhybk5KU3VOQ0JGUFBISktJS1BPT09NUFpgWldLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX5ucXBre3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTU1JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbGB2dWtpdXt6bX54a3xwXF5eYlteYmRkZ2VlZWJaY2Npa2tyc3J2Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZUVFRhX1BOTUpUU1RRVlZOTkxNT1BKSFFOUFVMS0xTVFNTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFhaT1NVV1hYUl5ZV15WVFBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09MTVZUUU5VU05PTUxRUEtKUVFLUU1LS1BSVVNRUlNTSUhMTk9RUlFRUVRWUlhXXFdTUlBSVFVWU1pRTlNSV1ZUWVZUWlZUUlVUVFRXWFZcWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTU9VU05RTk1OUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11gYV5bYmJjZ2ZlZGJYX2FiXWBnZGZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FPTE1MUVFMT1RPT1NRT1FbWVdXWFtZWFlWXGpkVlhZWldWU1NPSk5WVFBPVFBQUE1NUlJQUlhUUVFPTU9TVk9YUlRVVU9OTVFTVlVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUV1ZWVllUWFhVU1JZV1VaXlldX15VXlxeYFxbX19fX1piYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xYWltkcW1oZF9bWFZVV1FMTVZTTU5ST1FST0xRU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VYWFteXVtbVlFOVVZVW1xXUlRXVldYVlRYW1RTUlpYV1xeWl5fYFVhXGFhXWBiX1xgXWNgY2doZGZgWWNgYV9fZWRfYGJbWlxbXFlaWVhXXFpcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRRT1RUU1BXXFxcWF5cXlZcXmpxd3mAY1xbVVVXUU1PVlNOUVFPUlRSTFJUVFlaV1VPUk9TWFdUU1VSUlpPUFNSVltWV1dUVlpYXF1bW11WU01UVVVcXFZSVFZWWFlTVVpcVVNTXVhaXV5cYGBgVmFbY2JdYWReXGJhYl9jZmlkZl5bZGBhYGBjZV9iXllaXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRTlJaU1JRVFJUVVRLUldWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWVNYXFheXVlaXVRVTlVWV15bWFJVVVlZWVVXWlxWVFdeWl1dYF1iYl1ZX1tlYV9kZF5eY2NhXmVmaWRmXl1kYWBhYWJkYGJeWFpfW1xbWFhYV1dbWVtgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWU1RUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUVdSWVhZX1taVFVWWllaV1haXFZVW15cXmBhXmRjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU05QVllRXVVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhXWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSV1NXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWVxWV1hbWltZWVpbWFdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYltmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlbWVVXVFdbWlpcWVhZYFdQVl5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1pdXlldVVJZV1lZXWJaXlZXW1xbXFtbWlxZWl9fYGBkYmNkZGJkWWFmY2ZmZV5hYmBjXmJjaWRjZ19nXmFiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW1xaVldYWVxcXV9bWVtiVlRYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5YVVhXW1tfYFxfWFlcXF1eX1xbXVhbYGFeYGVjZGVlZmJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXllcXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRaaWhiZmljZV5iYmNhYGBfXVxaWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVlUWF1dX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaGJoaWVkYGJhY2FfYF9cXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWFgXltgYWJmY19dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBaZmdeYWhoYmhoZmNgYmBjYl9fX1xdW1pbWVhYWFZaVlxbWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXp7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8ent7e3t6e3t7enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a8homJiYmKgkU+Pz8/Pzubw76/vr69ytTS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzLqHSzMzMzMvZ5eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXp6enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1foOCgoKCgoOEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnd6eHp6eX56eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx6eXl5eXl6enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH15fX18fXt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHp9fXx9fXh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8en17fH18eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHx6fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4enl6enh7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGhIOEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0dHR0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJyc3NycnFxcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXRxcnJxcW5/g25wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwiIhwcXFwdJqAbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF8ooRwcnCOnnxucHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXWeo3hweKCcfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZipkW+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nzc3Nyk6qlfIqhnXxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eHmhs6mnqaqXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7iq+iobWpq6R/e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2ZpJahsZ+YppV9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgZybjJ+woaCinoCAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5uQl7CgmJSchnx+fn6Afn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f3+AfoChrKWXopqcmaKhiIB+fn+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KEhIiQorKmoKGZnZ2mp6ypoZuSh4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNn62vpJqaoJudnJ2doKSinJOHg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYOJlZiWlZifm52enZqZl4+IhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBhY2Uk5aZnJ2clY+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDg4ePlY2UmJCGg4KFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKBgIaZiIyGgoKCgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf4KJjoCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f4yVgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgZCMg4F/fn18fYycjoCCgYGCgoSUlIyBgoGCg4KCgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgoGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDgoOCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf319fYCDhIODhIODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkZKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/f3+DhIOEhISEhISEhISEhISEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhISFhoaGhYWFhoaHh4aGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWDg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af4CJhYaIiIiHh4aGiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357e4KGh4mKiomJiYiJiYmJiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7e4uMiIuKi4qJiIiJiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4KEh4iIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19gZeQiIyOh4eFhoeHh4eIh4eJh4eGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6hJqTloqDg4GCg4SGhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4CDg4ODg4KCgH19f4CAgX99fn59fH19e3p6iJ2Ng4KBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4WEgYOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goODgoOCg4J+fX5/gICBgH59fX19fn18ent7ioWCgH9/f39+f4CAfn2Af36AgIF/gICBf3+AgYF+fX1/gIF/fn5/gIB/gICAgH+AgoCAgoGBg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp7g4SDfoB/fn59f39+f4B/fn9/gH+AgH9+fX5/f359fH5/gH5+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp6enl+lpODf4B/f35/f36AgH9+f3+Af4KAf3x+fn9+fn18f3+Af35+f36Af39+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enp6eXmCi4SAgYGBgICAf3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fXx6enl5eXqAgoKChYOBgoOBgIKAgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYSEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eH2Cg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5eYCDg3+DjISDhISEl5eDg4SBfX6BgYKBgYGCgYOGiIyFg4KCgYSChIOCg4WEhIWDg4ODgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl5fIGBfoiWg4ODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6e3x+gYOBgoGDgoB+fX9/e4iRfHyOln99f3+ChoqFg4OEg4KDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYOEg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhYSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXl9fX+Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32CgYCCgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4ODgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9fH5+fn9+fn19fXx/gYB9ho+Bfn2Cfn9+gIJ8fIB/goCBgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMi46OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4WEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX9/gH1/fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx9fXx7fXx8fHt8fHx6enl7fHp9hYODgIGBfoB+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36LhIGHfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjYyPjYyKhoSFhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOBen5+fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISDgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5+f35+f358fH18fH18fX57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko+MiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn2AgIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg319fXx9fH19fX19fXx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3t5enl5eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18fn58fX18fX1+fn1+f3x9fXt8fX58fHt8fXp6eXl5eXp7fn6AgYOHhIiPjouKh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGCgYKBf4CChIF/foGAfX6Bfn1+f4CAfX6AhIB+fn99fn18ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX19gIOAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH99foB+fX5+gIB/gX5/gH9/f4B/fX5+f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fn18fHt8fXt7e3x7fHx8fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgYCAgIOAfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e31+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYCAgICBgX5+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhISDgYCAgH+AgX59fX5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn59f35+hYWBgYF/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4GDgoOAf3+BgYCCgYGBgYCBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH2AfX+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4KAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX59fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p9eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hYSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgICAf4GCgYB/fn+Bfn+AgoKAgYOChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB+fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1+gICAf39/f3yAf3+BgIGAgH98gH9+f35/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e3+FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Afn5/f39+fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH58f4CBgICAgIB8f3+Afn+BgH9/fYF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3e3l3eHd3eHt7ent8hYl9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgoCAgIB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgIGBgH+Af39/fX1/foCAgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh6gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgIGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31/eHd2eXl6fHx8fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgH+BgYGBgYOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97enZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOBf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSDgIOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhICChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYF+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGEhYOCgoKDg4GDgYKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOCgoGBg4J/goOEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fn1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4OBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYuJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4KDgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn9+foGDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygoR+g4N9gX1+f35/goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYSGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cHuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fX9+fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIWFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fH99f39+fYCBg4OAgoOBgYSCgX+BgoB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4eEhISFh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhYSFhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fXx/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGg4aFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SDhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgoF+f357fHt+e3x8fX9/fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fIB+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaHhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaFh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISGhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoeFhISFhYOEh4aDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFhoiFhoeFh4aHhoeFiIiHh4WGhoeFhoaEgoSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIF7e359fHx8fn18fHx9fnx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaHhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFiIOEhYSGhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIOCgn2BgX9+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt8fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iIhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SFhoaFhYaCg4OFgICBgICDgIOAfIGAfn6CgH2Af4F9gHx9fn1+e359fHt5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KBgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFhoeGiIiGhYiHiYeGhYWFg4aEhYeDg4aEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B8gX99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhoSEhoSHhoaFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoWGhoOEg4aChYGBgH9/gIB+f4GBfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGhoaGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9+fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFg4ODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1/fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtBPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NXV1NLT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01PSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2dvc3Nzc3Nzc3dzb29vc2tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6mXgIKCgoKCgoKBgYGBgI/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIaEhISEhISEhISEhISIZ0BERERERERDQ0NEQz9c09PS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAODw6PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKJh4eHh4eHh4eHh4eHimpGSUlJSUlJSUhISEhDYNLT0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjZBzUVRUVFRUVFRUVFRVUWrS09LS0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/PzcrKysrKysrLy8rLzMzM09TU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/O0dLOz9LU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX1tbW1tbW1tbV1dXV1dbX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/P07iez9GcgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZuz1bKXmbm6lbi5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6CqrtSco6iy0ZJ9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrHVw4aatdXTzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5mx1NajmLTU08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P1KSZsdTVopm01NWwoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NSkmbLV1aKZtdTUo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpJqz1dWimrbUzZ6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njk5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1aSas9XWo5q218OfoNLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0tajm7HW16KbtNqypKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HVtYLD09Wxg8bWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tJPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHD1NLS0MPV0dHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/Pj5BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tLV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6Njk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8Ozk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6OTs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq5urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKipqqelpKOioqKjoqCioqGhoaCgoaGio6Sjo6WlpqiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSmpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk+NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoKCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqamp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlp6empqKenJ+hn5eRkJCUl5udmJaXlpibmZqampqamZeYmpuhoZ+en52cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjY4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNAREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaampaWjoKChoaCZko+OlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5iVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9CQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5SZqpybmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqKjpKSkpKKhoZ6bmpmaraqemZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6ChoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKKwp6GioqKgnpybm5uarnl6m5ucmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCkpa2nn6CgnpyZmZqZppNLgZ2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCfo6J5qqSgoJ6bmpqbnahaSYSfnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+ipKSioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6obW+rop+cmpqcnKyCS0+Hn56enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZyapIhUhKibmpmbnJ6qZFRRiKCdnZ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubnJqamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmaCTYmKbnZibnZuilmZdUYehnZ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyZmJmcmWVjfZyYm52cpIdnXFGCop2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXExGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZmZmqRoZ2aIl5ycnpx5ZlpUg6Ken56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZifbmVibIadnZ+Qb2NWV4ehn6Cfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmZn3lzcl54mZyhjmFZU1qOnZuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOTc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qalpKbn5R5mqihqpR8YlJgkJKOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6gn459YompmJpug4drcIiHgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg3+MqI14aVJwnY+MVm15e4J+f4KSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+kKB6T0NJdpSDg0lXb3N3gnuGjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCBgKCUUzQ0O3mFdXJDOE5rb4CHio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY+hbkZkVT96emdkTDw5TW51jYqJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KkmFF0sJFIe4d4bVJpf1lXcYiQjJiaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mprIRfv9isRpKjmpBda4J7Xl6DoqGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKZver3AqprMqJ6zmkhWhHBSeJ+pp6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKeanaSlo6KicoGZro7JzrKesLJuU76gVGyUo6KgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioKOnoaaupqacoI19hXuG0L2Yl6icclKarGdjjqOdoKCenaCjmpaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqmioKKoqq6xsq6rpKmYiHtqnb3Dq66eiXZkcHh6doejpKejoZ2gopmVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7a0s7aysLKniXVeTpafkI+NgHtzcHNxeHx+hZKdoaSjoqSbnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K2u76/wL/Fv7Wrk3BmWEd3gHN1enFuaWhiYmlpb3Z3eH2DjZijqKympJmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW6yNLZ3NXHuq2fkHhcW09FXmtlanBoZGJnWVddWV5mbm5tbWxugajIxruip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PExdni38+9sKicjXhiVVdNRV5sYWNqZWFiaV1VXFdZWl5jYVxjgKnFwL24qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrzHx87QxKuNe29cU1RWS0BebGVmbmViXmZhVVhaWFZXV2KDpba7uau0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudXJydXFnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/xMLGycnApIhaTEhKTkg+WmBibHFoYV9lXFhVU1RRVoC2w6+sqqqqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIx8bExMO4s8G6oHdMSlFJPU1UYmppbmNfX1pcVVNaf5qtt7SrrqWko6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZnJ4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvbu+kWVWS0JKPV5WWGtnW1pZWFZwkLCxq7i1s6ypo6GtqaynraCstbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dWVmaWpoXmpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMi/xsa2oGxLWUFScnuAWlJQU2ufvsC6vbu8urysraapu7q5t8CztbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aWpqdG55bF5kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXFxMnAqo14b4yZnVNPcZ/C0sfEwcTHwby+tLGwsMK+vsHGwL+4tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd2xpZnVvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwcHAws68c2qFmZdakcvLzc/Ftr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVmY2tkYmttb29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzCwZmAjpmIf9LLxMjRwa+9vbi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFjY2RqY2djW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Au7/AvLvEvbrAxL+9vba+yKSUZo/NxL/Ayb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnamVqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWNur+7w7W6x7e2ubu8uLm1usTJpkKLyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmcGplbGhYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/EeKnMvce3ubittrS3ubO1srrFyppGgMq/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucWdxa3RmYm5gXFRIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrnSBu8jPwsC4rrW1u723ubG+w8eOTHvNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudW94Y2hiXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0plxdK7R0czKxLW6v8TIvr60vsDAe1lzy8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGxsbl9jX2FiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysGGcnSmzMzLzcrGwsPLzsG8uLy6sXJpZrvIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWNbX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqbK2w8CleXZ5nMTGy8jBw8DAycrBv7u5saGBeHGuyMXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO1uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEt22tzr22ucC9q31uaG5tcoGVmHN4fZi9v8bAucC8vsXEvb24sa+clYOInMrCw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsbess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBgWlNQQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbJ2gbO9trXCpYdpWl5gTVJbW250d4KhuLjCurO7t7u9v7q7u66jnp2OmX+/xMO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d29xYV9mXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmnhXiKoK+1nWpmZ1ZZYElJTVBUbHeHprC3vrmytbK8uby2ub61laCrnah0rsnEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVm5WNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fqoh8doyhmGBUQ1hVR2FqVk9FSmGOoayvtrq1tLKsvLm4tbjBvYuas6aqdKbLwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtsSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXVNPTkE/SkNBSkpANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7SQgnmIkG9PSj9kWUJOd4CUak5BXIKwtbO1srSvrLu6uLa5v8Z2hKygnGWpv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ3c211amxdXGtVXlxQTkhER01CR05GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHxYRkFPh1lKSlh3jYFjQVOjubO0srCxrbC5uLa7t7u8kKKxq6RzrLCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWh1dG5lVWFkV11ST01JQElTRU5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZRoTT9SeHFQSUlLZ5yAWkVTr7uxrLOvrqyttraytLWuqaaempudn6aonqCoqZ+hp5ablpeOnZOPkJaNl5ukqKCgoqKhpaWco6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CWlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjd21uXVFpVVBPR1BNTUNQUkA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3CqqW9aERSnYJRV0lKYEpVjWFkY4GutaqytK6qq6+wsrOtpZ2Rl5OPl6CfoqCco6SfnqiUm5aWjJeRjZCXk5ido6qfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ubHtkaVZSZE5KSEdPU05LTkg8RUA8MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCqxr/KoFBBc512T21KS2NmdHNgW2BxkLGvrrO1qqasrKObmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZKTmpeboKSqnqGhnqanq6KfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpquqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl6YGJTVWFISUpLU1RKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMbGjFdTSmWkWmV9b3JcUWtjW2VgXmuPtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmpJ6nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qXmZuUlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbGZcU1paTVFLT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlxdnVwY3Z2WFhjYGNoWllXZ62urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2prKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgH14dmp4dV5tW1JhSVJVSEZVV0pDTUc9S0k4RTw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjgG+CcGBjWExbUlpNTFBYUkhNTUeYrKqppaCfmpKRlJiYlpaWjIiLjpWdnZ2cnpeemaafoKilsaqnrqOrrrawtbKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21pblxYXENXTkpHTUhDRk49Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOenYpiV15lYFdNUUc9P0BDQz8+QlF4qa2pqqafnp+io52enZqdm5STlZSenpiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyb+wubm9ucK+uLS7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqGjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFFHRTxDPkY8Pjk2Tn6qs6ejo6KgnqWrpp6XnJSRmp6ZlYyKhoiGeG2IoKSiq6y0vLbDvb6zu8HDwsXAv8LGxcXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8rJw8HHv7q0uru1u7ewtrKqurKuvLi/u7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWlxGTE1FRFRNRUNFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz49Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV09FPklafG9iQj1cjq6soJmbm56emZeXl5KNj5eXlI+NkIyCg4J3cnFtcI+mra60ucW7zcfLvsHMzc3MyMjQzMzMx8rFxszQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsbGysjPwMnRzcfGyMbCvMTBvr+/tr6zrb/Aw8PHxMfEr7+5sri9xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXRzZWJncm9nXlpaRE9NREVQSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E/PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ2VamZdVElEQT9Lhp6lmYSgsq2jnpyfmpiXlJKUlpGQj4yHhISIhoOAgYGAeXFyb2x5pLa6ub7LwdPR08jNztHT0dLQ0NHRzc7P0MXN1NXY0dfNxsfJzMPFys/K09fR19LV1tPUyMzGzM3J083O083GycrKwsbMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZVZYUkRORkBJUUM+Qj06MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnGJUTEpEQz9DUq/RvbKvppycnKCkoZ2alJOVlIl9eHFrZWJocnBye4WKgHVwbnFzcIWzw77F0dDX1tXS1s3U1tbU09HS09TSz9LD0NPW2NXV0svKztHLxs3SytLV1tnW2NPW2M3Sys/RzM/RzNPQwMnIy8TMzczPz8XHyLbAy8DSzczQxsrJwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYGVyY11SXEpLR0FFSUo+O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFaSUBBREFGUXayr6aalJefnJqgoJ6bnJqViXdpY2FfX19fXl9fXWFsdXNwcG9scXF1ksTIx9TW19fW09bQ1dTZ1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ2NfY0djS19nU1szPz8nN0svO0cDGxMnHz87R0dLIzM3Ay83G1M/Mz8jEy8fHyMzL1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYmNpbV9WUWBKSkNFQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu32NTV2dnRztC/vMzJtr6upqqooaOsZkM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cWVjYl9fYV9eYWBfYGBfYGVtcHBua29ydneczMHT1dPY2NbZ0dLS18/TzsvSzdXU0crPzNPW0tHVzc/V1dHF0dTK0NTV1s7T0djX19fLyM7Eyc/MyszAycHJys7Oz8vQzs7Mz8/IzNDQy87Lw8rHyc3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO+u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSkZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Onn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXpIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5gX15cYm1yb29zdHV2eaS/zNXR1tPT2NbOztPLzs7FzsrS0s/Hzs3N1MvO0s3L19bQzNHUy8vQ0tPKztHV0tXVysDKwcbNwsnKw83ExsnLy8/Kzs3QztTMxsnQzcnHy8XHwsbKzM3Q0sfQz87OzNDFx8G4ub3Dw73DubOyvrG7w8S2qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElQUUI7RD87Njg6ODo7NTc9PUA7Ojw9OTw9OT09Oj46PDc7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3tlYmJiYF1eYWNiYF9gYGFhX19dW11ncnJwcnNwbXJ5pcfTzszQz9PUycTIyMXGv8PFz87HxcfNytHIy87NxtHS0M7M1MrHys7Px8fP0svQz8W6xL/Gyr3DyMrOxcPHwMfNyMTMyszPyMTE0MnGwsbJxb/Bx8zLzM/Cy8zJx8vQxcXHu8fDycnCz8G9vL+wwcnHur2qsbKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KFoqqTjY2Wj4WDg4OBfYSEfnNgW15dXmBeYGNkY19dXV5fYGBfW1pcYGxycW5va2xvb3250cvCws/LzcS6v8O6u7q5vsjGwsPAw8jKycjKyMHFzMbIys3JxMHKycHBy9DFy8i/ucG8xse+wMbPy8TAw7vJx8m8ycfFysG+wsvGxcS+xr29wcPFzMXGvMDJw8XH0sTByb/KysbIxtHDw8bDrsTLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdCR0VMREZTQDU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bF55fJ+RipKWhnqAhYV/dXh1cnBfW1tdYGBiZGRkZWRgXFxeXV5eYFtZWlxib3Jua2lrcG9zj8i7mMDMwMbBsLa5sbGzsbDBu7u8urjBwcHEvr25vb+5xMrFxsK9xsC3u8PJv8HJu7a7usbDv7zCzsPGvr61wb3Du73HvMO6tL3GxMLDt8C2tr6/u8zDvba6yLu/vsvDwcbDxsnHycbQxsLMx7LHycPOzcHFw7+9srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRkJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys7FycXHwbrFvayupmBjdYGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmbjp/Ew7rAuK2wsKaprault7O1tLOztLu2vbK3sLSusrvCvMHEvL+6tLK6vsC4yLi0vLbBwr24vcfBxLu1r7K1ur+0xbi7tay5vb7AvbG7trC3urPGvLevu7+1t7XFvL/DxsDExcbHzMXAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJlbZ2+JjoaIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXlxdXlpbW11fbHBuaWZqbW5ze4q/v7i4tK+qq6adoaimnamqsa2qrKm0rbaws6mup6yzu7q2w7m6ubCrtLm7tMK5r8Cxvry7trzIucO3raqosLLAtri9sLGosbO1u7ysrramrrauu7KxqrmwrruuvLi8wMC+usO/xsPFwLzGwsjLuMXHxb/HxMO6xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMS01KRUFDQEdBOzo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzBurO1tcOuqrCSW2l+koiOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNiY2RiYF9eWltaWl1aWlpaXGVub2hmZ2lrbnKErbmwta2ko6WlmZ+jn5iapKqtpKiiq6qsq7Cjpp+qrbW2sb24r7evqK64tLS8uLO8sLi5trK8wbLBr6apo6uxs7SovaqrqKutrrW0pqitoaSvqbKmqKiupai3rLGzt7q6u7K8vr6/xb+1wsHHyLe/wMW3xMPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz83Dx7m5y8LLvrvJtr3DvrrKt8HDwbS2vLaxr7W8ramrkmNtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZGZlaGtvcoWppaujnJqfo5Obo5mWj6ChqKOjn6Wlp6auoJ2bpKassrC3t6ewrKiqtKu0urG2tq62urOwu7qxt6WgpKCnsaisqbqqpaanqKezraCop5+cpKasn5+npKChsa2trLK1s7Sxtb22u8HAsru+w8GyubnCs8C9wLW4vL2+vMLHxMPEv8DEoIR4cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wLq9taCelJ2hprq2q7Ozu7PEz8nLwsa4t8fAzL+4yre7xbizxbizv8CstbyyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhbXV9kY2NmZ2dna21uh52onZOTl56UmaCWlIucoKGmnJ+fo6Wjp56bopyfq7CtsbWkqaqqrKyltLitt7Css7Wvs7avsaqfnp+korKlpqq5raKmpqCorauZoKCemZ2fpZqao5ycnrCprKiqq6ytsLO5r7i5urC2vLu6rLOzubO9tLexsba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTUzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLW3xc/IyMDGu7vDw8++uce4uL+3ssK0sbu7rLm6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXWJkZGZmZmhpa3KMp5qQkZGYlJiek5SOmqCgp56bnaWmoqWbn6Gama+urq+yoaWjrquoorWwsrKsqbCzqLuzp7aho5+co6Kuo6Kqtqujo6aepqajlpmdl5mbnaCal52cnZytoayoo6SmrauztKq1sLKrs7m0r6qwsrKzt7Ouqa2usrewura6vcC4s7GUhnl1Zl9mX1taVlNaVUtbUUxKRUhLSUM9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxw7W2va20ucHMyMa/xbbBwMfOtsDDvbO5ubK/trG5u62ytK+fmqOqoZSaj3h/g4R/eG9xdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCZkJCNkZOUnJSXkpWenKCclqGhqaOenqicmpqrp6+wq5yjpLiqoaCvqLerp6eusaS4sKS3oKOcmZmrpqGarbmwo6GknKKgn5OUoZSWlpuZmJaXnJWfqZ6qpKKdo6qqsa2otKyqp62zsKWrrrOxr7Cvr6eoqLKusbSwvLS6uK+jlYJ6dmVfYVdZWFNSVEtNXkxQTEdITEtFPUA+PUI8Ojc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjY2JjYmJjZmmAko6RiY6QkZeVmZOUmZ6bnpWgn6alo6ann5yfpqCrr6agoqO3qKGhoqmzoqWopbCmsa6stZ+hnZaVqaGilK2xsZ+jo56emJuTi6GUkZOYmJOXmJiXnqebp6GimqSlpaukpbCnpaOrrK2mqa6wr6uoqqqzpqarr7Sxrry2sbCvoJN7eHNlYlxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLuxt6yepaast7u8wcW6srm1xMnJwMPGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVVRWVlJUUlVgYV9gYV9gYGJkaX6OjoaNi5COkJmRk5WimJ+WnKCloaylpKSjpKOdq6ulmp+lsaqhoZ6lqp6oop+urKqprq2ioqKVmKKbnJCrqbCcn6Kfn5eYk4mekY2Sk5aQmJiTnKGjnKSgopWgoqSlm6OrpaKjq6SrraWusqqmpaamtKaqqK2ztbS5urCrrJ6Mc3FwYFtXVlZSR1FPSFpcT1JKVEtTTEVHSkQ4Ozs+PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DIurbAr8XIzLrByczItcm8sb3Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RVVlVUVVVSUk5RWV1cXV1eXl9fYmRtiYt/jYKLjYuWkJGQm5qhm5ugqKmrqKynqaakmaWvpJWZpa+poJyZm6Cfrpqcq7OgpqafoqShlJSblpaSqaqtm52foaGblJCMmY6MkYySjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrimo6SjrK2pqKuvtLeyvbWzq6+YhXV0aVtYWVJVUkZYTFFbWE1VT1FMUVJJTkpCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7Px7PEure7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FZWlpaXVxcXV9gZHuIfYZ6iIyGj4qUj5WXoJ+an6uppq+sqLClqZqfraGVlqSop52YkI+anq+XmaeqmaCdlKWhn5KRkpGTlairpZqZmZ6el46Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9qKCjrLSqrqewtLC5tcCxrrGrkH5ydGNWVFZOUkpHVlBSUkxMWE5LTU9SSE5LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqytri8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5yam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRSTk5OUldYWllZWFxcXWFqfHZ7cYSJg42GlYiSkpaamJ2om6CrpqasnqiZoKack4+fo5qXl4aFkpukkJWjnZaWloiim5uUjI6KkJqlp5yVlZebkZOIlI6LgYyNgJCLkpKSoZqgopaUmZiVoqaajZmkp6mnoaC0sqizuKGdo7esqa2ks7Kmtbu1q6yxo4p6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUlNSkFITEhIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS3saWnpKqloKmmpLOqorLDtbWys8bGt7rDyszGs6y5vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB2cWpuaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFpdYW5ucmyAhH+FfY+CjYiSkJKdoY6anaOipJillqKclY2ImZqMc42Dfo6XloaSmpCUjo57mY+djYKJgIqYoKOekJOYloWOg5R+fnSKjnqQiJOQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLG8qqmvqpmDeHRkVk1SUFBNQ1NOTFBNQlBRSElOU01ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY2Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLi5wM7GvrOsusGsrcStqKKmkp2mt62joJCWl5KQfnh/ZldWX2dmaWdob2NpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlRTU1RVVVdZW11paG1oe4F5cU1WcI6BlYWMm5eKk5GfmJ2VlJaUj5aKgJSJXztWb3yMlIqAjJKMkIaGc4uFl4F5gXuGlJ2Vg5aOkZCDhn2TeHFwho19iYGQjpCXmpmTi5CKnYifmIiIlp6aoaCXp66prampnpats6KmrpmsrJiotKOpraOTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqapoKapp6OqsKintMG5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpiHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtJRkhOUVFNT1JUVlhaYGtqZHZ+cU5BP3+VkZB8h5SMhIqNm46WlYmSiIaVh3mJf2BKUW54i5KEfoSNi4WAf21/f5R4dnZ4hI2acFGNiIqGfH54lHZod4aIfoqIlYuOkZOXjISKiJWEm42DhJKblp6dlKSiqKmlpJ6bsKqhpKSSpqqWoqqcoaaoiXZuZ15cSFFRU01JVU1SSUxLT0lIRkpOTE1US1FRT0dKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hrqGnqKWnqK+sqra8tri3s8G7tqi5yLi2qKi1tqqyvKeelY1/iZSplpWLf46Dgn54cW9YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVlYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRURDSU5PaFlPUVNUVVpugXBzemdmWlOPiZSHc36GgHyFjJOCkpmLj3uGj4B2gHhzb3VxdI6OgXp+iquFentpdnuOcHJteIGLjZJ4e4B7gHdzc5J4Z3WFhISFfJWKiIqNi4B/hIuNgJSEfICPmJSclpGfnameoKGdoKmlnp2Yjaekk6Cflp6fpIFzaWJdXUpXUFJHS1hST0pNTFJKSkpMUEhMUUxSVE1GSUI9Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3aGd3x2b29qWUtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWCenZkdIuVmI2Oe2Z5gHZ4f4iQfIOYkoBxh498d3tva36tfXSQi396hpKBfX90ZnZ8hmxvaHN8io2HgG15cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdmp2eoZyWjYulm46dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUk9ITlBMRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzUxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlp2lqaShmJmPhZJ5iY+Li3ZxfG11cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZW9waoalqsB+c3hie3due3iHj3l7i4ZvbYySeXR5amqAgnGWkYyBfZWASpOZbmh3foJtamRseYWQkoZrcmx8bnJ8hmltcH9zjYmFh3t+f3t3cHR0hoJ5gXlwfI6LipODlpeYmpCTlpaZl52WjIOJn5KLko2GkJeAb2pvb29ZVlhUUlFZT1JUVFJYVU1OSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+lra+iraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ1b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFYW1+mh2GZZ3J4ZH1vbH95ioh1gYeFdGyaknR0fGpqnY5NeYWTiYSOZzF2h3Nsfn6DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3x0fn1xcW51bYJ/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW01QVVZZWE5JSEVKSkhHQ0BHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEvKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0iIyGenBycG9vZHFnX1RGSUM+PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUxBSVFJYq+yn3B6dmt8bHGCgYSAeoSFhXlyoJV0eIBzdZSHNXGdqJ2OoaGEo4V2cId8h3x0jK6NiYFoZ2JqbnJtcIN1aXBYdXCOm5F2bX97fW1ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gW11eXFpZYV9STltaWFdMSEpGSUc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt1eHhtd253ZGpeSVBHPT83NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9ITE1OUEw3Q01RU0RLhXR/e3t1fmx2h4d7fISDfot9daKaen6GgYSZhJqcYYaqn52Kg5COeneJfomIjnOLl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWEenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVmZ2BbW15TXGdeV1BUWFtVR0pKRUtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCYnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyNeIp/k4yRnJ2fppGgqqCxqK/AsrvFupaOkZSHe4Z2a3+MkYJ9ioOOjHiDgHOghIp9fYF/cIF+emh2bFJYTEBFMjExMzc2Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9RTEtUXVlSS2iCh3qJeXtxfI+LeXyIhn6Wh3ahmoiHj5KUpY2tqUiGrq+ui4GAlIuCi4KEkqmHgJiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9g4h/iISLeZWcm4mLiJF/enWKdnx4bW93foF1dXNtXF5eW2NkWGdlXFRQUFZZUERMS0ZPSUNGQ0NAQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSlqCerKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8zMzEyMzY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS01NUFdgWW9ZXF5pjJKGlICDgYSRkn6FiJGBmpWCoaGYlZuapq2Tmbuxp7vHw6iLjKGljpSJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4iAe3aEfG52dWZ/lI6HiImHiIehq6KWiY6Xf3qBiHl5cGdreH98f3VsZV5bW15qXmJnYFpPTE5XUlFJUEpETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDen+Mf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShpKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc5Oz0/QkRISU5RUlRSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBJSUxMS05WYGN/ZmdtdJuZjpmSkoqNjpmIko+di6CgkqOqpaSsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOoZ+UmZGFioWPmZGWbHB1ioyCloyNjnePhHFthYGKlpGDhYhxiKCWhpKJjY+WpLSpm4yUooOHkoN9f2tqanyBgoN1Y15kYFtnbF1sbF5XS0hOUlFNTExGSVBDRE1GQkNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYaRh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMTE1OUl5uinxzgXyenJunpaGZoJailJyeqJ6oq5+orKmqtperv6u2yMi3yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaKbm3h6fpSYk6KTl5eBlJ57d5WSq7KJjZeffJSdm42SlZijoaa1r5yQmKiHlo+NgIhsc3N9gX5zaWBeYmBiaGRgZ2ZcUkVKS1BPSUlMRkZNQ0hMRkdDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbXxhd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjox8ioaPkI6BgoCJi4qEkoWDh4mBgId2XmJQNDYwLTEvLC4wLy8vLi4wMDE1PkFBTVFSU1FSU1RSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUpOT1FZbYWPd5SJoaWos7y3pK6rq6aotKuwtrKxrbuxs76cs8OrusnKt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKWIhZSkoaCroaSoj5yxi5Wjpre6m6CisJKinaKdkKOhq6+ssrWilKSqiJmIkomVeXp+hoBpYmldZmNeZGReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2lvWHqFdoGThYiCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4SBi4WGiJKGg4WJh4iHh3FuYUBFNjQ8My8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdIRTw+PkZIQ0VBNzs8NUM7PUZLSUdIUU9QV4GSn4StorGpscDGwqqzxbars7+zuL62v7TBtru6o7jFqLbJx7W+ubSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqmutruyuqywtaKxrLG1u7e1rrSgp6ijp5qpr6yyube4ppu2qYykjpGTn4Z4gYV3W2NlV2djYmRgYWdgW1RKRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiY1d5dXCBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeEgY5/gYmPh4CGiIWKh5F6eG5dVkBFTTw2OjU2QUI3NjQvLzZDSEJRXFBRVVdVXFZQX1VJTEtBPz5HS0ZGRDs+QDdENz9CSkpFRlZTUF6PpK2jsbPBtbfBzMi1u8S9s7PAtrjBtb+vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKXm6KSpbCupq2rp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwbe6t763ure5rKywpbCprb2wvLrBwauYuaeUrY6Xl6qIfoN+bFhkYllrZmpmV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpvfo6EgI2EbnpzeIdiuaGZo4mUlJaSlJONj5aSh4Z7hoGNlYqAhIGKenyLh4Z9ioKBi4SVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUlhYWmdZVGBgTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWlRdk664tLq4yL+5vcnMu7zBu7e1u7q2vbS6scZgdbKksZqeq72ppairqqSisrWgq6iflZafmaCupaempZ+kk6KnsbSnsrK9tsG+08nJ08bDxczCysPAvr2+u7y3tK+4t7bDucW9wsevnrmpoauOpKi1iIGBc2BjY19YY2BqZ1JYYFZSVUlFRU5LQD5HRD1KQT1CQD1GPjtIQTc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjISPc2xycnOH1cC1maCNlZiZkY6XkpaWjoaHfYaDjZaKfoN/g3h7i4OHfIt5gYqCl350fXprZnB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktLSUZISEhIQkk6RD9IS1RUVlxaW5K5wLi9tsW/urjJyrq2ubW3ubK3tbOutraYZHWonK1wXqKsnJigopuknqqllJ+gkJOOlpmYqJ+moJ6amYOknqylqrCtuLC9udTRz9bQyszSzM/Oysa/vsLKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5h/e21eYV1aX2JaZGNQW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj8zNzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vlpGQlG5sb3R1h7OroKGfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqaWhgZmlpbFptc5atpLyIhmdbb2hdWlpUSEtOUEpLUEtTUUhMQUpGSk9fXmJnaWGXt8ewubK6vbWxxMa1r7ixsLursrGnq7erjLannZqnmk6anYyOn5aRppillYqTk4mQiY+RkZ2boZealZaHnpqnm6yvqLCotLTU1dXW08vQ1NXN08/NxcLJ0L7JycrJ0cfMzcLQ0bevw7zEuaW1usKig3BlXl5fWWFYWmZaUV1YT1BCQkhFQkg7QUM+QUc/P0E3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJocW95eYOgqZ6ml4yam5eLjZWRmo59iYuEjYqKi5CIfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem54c2xpgXBtY2ptcHhpd3x+y7/B36dtY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmsLWqrLy/sKq0pqS4pquuoKu0o46xrpqXmIyRk5GEjpuBjaaRnImDi4SKiYSLhJSVmJeTm5CcmJman56rrKWooqytz9LV0s7M09TU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfOnntwZ19kXlhhU15aUFFUUU9IPkBGQUJFPEBBPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OWnWGhYp3bHdvfX5/oZ6eoYyMmJOTi4ySj5aEeYWPkI2KiYiRhn+Ce3J+gIGHeoR1hZOQiH9vdnJrc317d3tzgXhyaoBzcmlvcXp5cXq+y5p+jLKEdnKEdmhha11DWlpbVmVjWWRqVFhcXWBkXmN3en6LgZipo6Whn6CopaqwuKqls6OhraKjraGnsZ+IppqTkpGJkY6IgZOJapSijJmEgYZ+kYODk5eti5WNlJqOhpORnpensKGhoaWkqcjNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy4x0cGViYVlVWlRcUEtHSUpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJyUnZSFi5WJj4qIjYeOf3iDk5iKjIiIi4l+g3hze32Dh3d/eoaRlX+DbndwbXV/dnh9dIV8eWyHdnRufXaEdHh7nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamRud1teZmhrbmlugIOIkIucnaCdkJeYnqOjpbGjpLOfoaWdoKigo7GchZ6SkpKQio6LhoOPhH6cm4yNgoSFepR/gqmVo4yRipeSi36Yi5qSq7OYm5yonKe9w8a5tsbO0tHS0MzSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7Ly7V6eHBmXltTV1JbVkZHSklFRT06NzpAQEI6RkQ/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXOFjXyXkJ2Lf4eSg4mGhYmBh3x4hZaWiI6Ch4WGeoR5cXt7g4Z1eoWOjZx5i3B8b296f3F7gXGDh4Bujnp0d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeouGjpORm5WflYeMk5ugmp6pn6Gsm6GamZ+lnp+rmYuajJCRjYR9iIeDhYuOoJmTiIOHfmyZeoSZhoiTjI2UjIZ8nImUj66qlJaYn5mnr7a9qa2+x8zJyczL0MnD0srU19jX2NfV29fT2dvV0Nva0dbI1MuWe31qalxbUVRUX0hDRklIPkE+PTc6PT87PUc9P0FBQURBPj86ODdFQjc1NTQ3OS81NjY0MzU1NDIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEP0NHUmpebWRiZmt2gIhxkY+agHqAjX6CgoGDfoN7fISYjYeLfoWGgHaCeW97e4aBdHqSno6gdo51gnR1gX1zgIRvgZCCb5KEdXyBhXp2hnuIt8Wkwcm4gZabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5GEiY+WmZeWpZyYn5aek5KXo52Zq5WQkImMkYKMhYiIgYaQkZ6bmYiGjIGFl3qIiZ+XkIiNiouCfaGKkYu8oZiUmJmcqaamrp+otr/AwLnHys7Oxc3K0dbV1dnV19vU1tna29fb2trYztvGiH17aWtnYlVYVlZOTEVOQzs9PTw4Ojw+OD1ANj0/QD0/Pjw5ODY3REE2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bImMknd2eop7foB+f3yEen2CkYmEhXqEh3p1fXRtfH2GfnR/k56RnoORfIZ+eI9+eIqKboKagHSZhn6BiYV8fZB6j6mOj8OhvYyco5x9iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmLkJKUjp2akpSQlo2MlZ+clKCUkY2Nj4t+kI6Oi4SJkpaanp+JjJSSnZGCi4CmmYiEjYKFhIClh4qLuJidkZWWoqihnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuXt7em1rZ1liXFRQT0lETEI8PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD42MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PURSU1JYXlVYZm1tbWmBjopxc3mKe3p/fH97h3p8e4uGgn10g4V5cnpzbYB+hH53hZyim52UkoCMiH+Yh4CckW6HqIV6oIt8kY2DiISbfZqQioyjoqCQpK+fi5CLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlYyHiIySk4uUlJOOi4+Kh5abnI+UlpCKkpOGgIuIko2Kip2WmaKihpOdlqCKiYiNnJCDiI5/g4eFpIaMkLOYnZKVl6Gin5mSnJ2osrmspr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aByf3dpaF9eWVRYWUNBSEM/Pj46NDk6Ozc6OzszOzs/PT43Ozk6MTpIPjozNz1ANTE2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNjem1hfpGDb213i3h5f3qBfIV7e3aFhH9zcIWBenV2dnSEg4V+f5KmpJ+mopaKnZCUl4uKqJdzirGNhKeShJmThZmMopWfmJOImp6jkqmwoJCUkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNyJaPhoeIj5KNjZKTiYWKiYWWmZuPj5SThpSXg3+Pi5mIjZCqlpejo4iZn5aaiI6GlpeKhI6NgX+Ij6SJjZOompeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTT2s6EdYJrZmBgX1BLVlxCQkdDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfXxtfYh4en56gYGCfnZ2gIJ7bG+Lfnl8d3h8hIeLfoujtKikq7OhlqegpaSWla+ig5C4lZKzmY2hoIykm6+ipJ2YkKeXqZmtsKSXlJWUkIuYmpagwI6jybmrmqKlrZmRm5yynYaFqKKdmIWIiI6VjIuTj4eBhoeIk5iUjIqTk4aUmIaEkZCcdJGZspWWpKGInJqTj4qQipeaiYuWjYZ9jJmeipCPnJqZk5mYoJWhnZWfm6GxrqOkt76zxcfEvcPDv8bOysnSp8/N09HQ1tjSz9i8dXx4X2JXYlhSSUtPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNW1xZSWhhO0iEinp7bYWGeXyEeICFgX1weHx9fG9zjHp9gnt4hYuJhoOSqLytqbO9r6Wus7Opo6KwrIqatZ2iuKWVraSXqa23pqSjn5mpmKqkr7GqmpiblJWRmKCXmbu7rcqhaba3qrCVmJ6iq5KXvaReqbKCiYqMlIeRfI+OfYOGjpCUlIiHkpaLj5WNi42WmZOdmrSWlauei5yUko2QkouYm4qSnY+LiZWgoY2VjZeZnZOcmZ6VoqCUnJ2lr6ihpbO4q8LIxLa7vbzFyMjC0KHGyc3NxNfW0MvTo3N9a19cVWFTUUdEPjxDQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicElAi4l/gHKGh3yBiXWCioN+bX19fH5wd4d3jYGHe42PjIaMmqvDwLC9xruztMG8tKyrs7eMqLKtrb2rm7qkqK25t6qmpqKipKOqr7Kxqp2co5ibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2vgouLipCDjoORjnmBh5CNjpyIiI+XjYqUl5SQmpedp5qwmpGrnY6aj5KOlZCPlZeOkaCQiJSbo6yVlo+UnJ6UoJ6bmKChlJqep6ekoqSws6bBxsOwsLu2xcTDv82nx8PHw7zW0MzEyop2dWRfXGJdT0tDTEBFRz5BP0I8OjQ+QT09NT02PjMzMzI0MkExN0BCTj9HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1pdXJOMjIh7h4uGg4x1hpCKgW5+e4F+cX6BepV6kpSUmJGTlai0x8nAwszBw7rHvLqvq7m7l7K2urPArqXApKuwvLyqrqujo56orK+1sKqboKqcopyWn7C0p4uiurq1wburqJyypKSolISOqcTDpIKLjoeIhIaVlIx5g4yRj5KhjIyUkY+Il6CXkpmVl6agrpyMqpyOlo+SkZWVjpCVkY+hk4aXn6Cyn5SblKChmaSgmqCcoJSYnqekpqekr62lv8TCrqm3tcnDvrbPssW+w7yz0cnHwbV3e29fWl5sVE5JRE1LS0lAQT1CRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZeJi4iSj4aJeYaTkIFygHuNf3eGgYKQeo2hlqiampi7vsnIysLSycrCzbzBs628v6e6v768xLiswamss7u9qrCqpKWjrK60rba1oKCun6WimKO0vKmbqLzBo7W2r6uSr6yqq5aGmqqnpZGCjJOklYqAdYmSeYWNkZCeoJKOlIuPjJSjmZablJSjnqmfkaWajI+PkJWWiH2PlZKSo5qVoKKctaaQn5elpKOln56mmJ6Vl5ylo6ioorKtqLvAxK+ls7fMwLmuw7O7vcG5rcLCwr+ZcHtjW1heXE1NTkpHRENIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGRXnpCdjZeOnpKJin+In5KEeIV/lX5/kIiKkICVoJmup6OYw77JxMjG0s3Ozcu8wrewur20vcu7w8G2t7yts8C5vK6vqKGpqLatrqmyt5qerKKnoZ2rt7eppa++xLG9ubOnqbOzra6WlaWtqKCRjpKxxaeVjX2RlX2HkZiPqpmYk5OOk5WTpZ6TnZmToaKhnJifmIuMj4+eiFqQlpeSlqWZZZijnrOllqKWq62rp5yfp5eYlpiVoaSpp5+2rKm6vMO1prS1y8G4qrass7u4rqi4ury3hG5wXFpWV1BHS1NNSz9BSEVESEZGODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZWNMRqWUnJWhl6iWjJCDh6WSiIGHgpuEg5WQkZSOmqKfr76uoce+xsXIx87OztLKvru2sbq7vL/PtcS9t7m3srK2s7ezrKacq6u5q6mor7CXo66kp6SltMGwq6yzvsK5wLmzp7i0t7OvlaStsK+li5OVoY1zwZl9lpmEjpaZi7GVmpqVkpKZmaajlaCblpqpnJuhoJmKjI+WnWBKlpyalZmll1SWsJ+vnJ+llK+vraaboaaUk5mZjp2gp6GZtKmqs728u6uwssfAuKasq62xsaOhsrK0pXNxZ15cUFJNRVFRUFE7SEtJRkdBQz05S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTc2JWRkirl5mfoaiumJCXh4qnlo6Ik4WgiIScl4+eoJujpbXJtKnGvMPEyMvJyMzOx766s665ucHBzbXIu8G5tbqxr6+ytKeknKq0tauppq2smaSupaWorLrAqKu2tr/BwL+4srLDsLe9q6Outa26pYibl6abdr6fhJicjpKYmouulqGcm5eUmp+hqZ6ooJqbqpmhp56XkI2RnYNtdZOimpWdo5+QrrKjq5Wpqpirr6WloaWqk5KZnImVnKKelrGmqau6t72zsq6+ubago6eppaacnKypqY1maGJgU0xNR0hOSlVMPU1FTUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJWcoZ+7rpmUnouTqpuRkpOJqo2GoZ6Mo6yUpKS2x720wbvCwsfJxcLOyMK9ubKvubXAwsq2xrHBvLW7q6mtrLCjo5mqtLqmqqesqp2or6ekq6q+vKitvLS4vsa8trW4wLC9wLOptbarv6WPo5eRoZ+7nomaoJmXnZ2Ptp6pnKWjm5yhmqels6KbnqWcqKqdmJWPlJuLlomMpKGUnKKfobWvpaaTsauaq62fn6WkqpGWlaCEkJ6fnJappKGhtLS6ta2otbKynpyjppqXlZmqoZ54Y19hX0xJRkhOUUlNREZGQlFLSEFER0FWUkRIPEFHUTE7QTc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaeXpJ6ew6ybl6SXmaiblZqaj6qWlaimla2smaKqtsXCvL+4wMLAyMS/zca7vrmysLi0v8PItb+wvLe6t6ekq6usoaGbq6rEoqWprKaeq6+soqqov7imrb6wt7fGtrS5uL6yv8G2tLK0r72jlqOVkpuTrZ+QoaGkoqOekL6kqZ2prJ2doJumn72imKOeoqmroJ2WjZWek56HjoSNk56koZ21rKaclrKmmbCpoJurn6GNmpWfhI6hmpuSpaSamKuxtbGqpaqtrJyYoKGSjpCVqJ+UamVcYl5QSkhLT01IRUNJQD1PSEA7R0lIW1JPSz1ITlU0QkU4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE6im6SbnsWsoZ+snZytn5KinpaloKaprJe2saOqs7bFwr3Atr/Bu8nCv8rItri1tbG0tLfCxre+sbi1uragp62qq52en6WkwaWgqa6gpKmtsKKmqL21prK8t7a1w7Kzt7q+s8TAuLiutLS0o52klJGToKyfmKGdqKiqoprCramdrK2bm56YpqC9oZ2kmKurq6agmY2Zn5KeiI5Yf5aepqGguKqmlJi2o56yoqGcsJigj5qUnoKPoJeWjqKjlZClrrOrqaKipaWVlZyZi4+Rk6SfiWNnXGVhTUpLS09GRUFGSz49SUE5OUpKTl1RUUk9TFZcOEZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExPnqChmJ7Dp6Wis6CcsqeTqqOfo5+sqaydu7GprLWxyMPBw7PCw77HxL3Eyr2wsLausbWwwMW1urGwuratmqmwqambnqahqMKtm6yxnKqirrGqpKe9t6a3u72vt8Ots7PCv7LHs7q3q7S2raqippWVlKKroZ+fmaerr6+vu7Kmn6mpmZmXk6KkuKGho5Kur6ukpZ6SoZ6UnY6QjZSdmqOfp7Snp42YtJyjr5ufnK+RoJSYlJqAkqKWj46goJOLpqywpaeinaCekpKalIWLko2cn4BkaF1oZktKTEtTQkNASUc7O0Y+ODlOTVVfUlNKPk9eXT1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9mckA4PEiWd2VBNJ+kn5ufwqijqrGgo7SplbKrpqKksqytqbuyrbC0tMa/xMS1wMS+ysW2wMnCtau1qbG5rMDFtLiurba6pZmrsquqmKGnl627tZuosJutn660sqequrOnubK4srjAqriywr20xae+rq23tamnrKGWlpGlpKGhl5ekrretsrW2n56opJmUlJOjoLejpKWVrrGypamkoZ6amZqVmKifnpiin6+yoqeNl6+YpauYm5+mkp2PlZiahpaglYyQnZ6Ui6mpqqKnoZmdloyPmZCBhpaJlZ96ZmpdbGtPUU5OVD1CQU5DOzpJPzc3UU5dX1JWUUFXYFxCSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWpWQ1dGjHlmQzukpJyhpb+mqK6uoKm1qp24r6ukqrS3sbC4t7C3uLfFvcPHvbzEwsfBucHGwbqqtqWtu63Bw7e4qq2yvKOVrbCtspemqJGquaqhp7Cdq6CvtLOqqre1rLuss7K5t6y4sMG6vb+mw6qwtq6pqqumnZiYqqGhoJGXoLCus6uwuZmbqZ+ZlpKXpqC3qaWioq+xs6uxp6ugnKCfm56lnaCXnaS0sJufkJSmmqCpm5ajoJeZi5aZlJaXnZSJkpuZlI6pqaego5yYm5OHj5mLfoyXho+abGptYm5uWFFRWlRBQ0VVQDs7SEA3OlhQZF5QV1dEWV5eTkxTT19MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOG19aFxWOol7Y0M9qJ+coam8oaqvqqKxt6mltLKroa21va+zuL27vbe2wcO/ycS5xcPAwLnFvsG4r7aoq7eyvL+/tKqusrifl6ytqK6YqKmOp7ufpa2zn6uisbCzrKq2s7W8rbCxtaywtbHAusW2q7yvsbesrKmisaWepKifo5aPmJ+yqrOpqrOZnaebmpSNoKaktK6noaysrbGnsquxqaObnqiknpSgmZuptqmXmpKSn5meoZ+SraCamYeXmIydmp2Ui4+Wl5qXpqajoJ6WlpeUgZCVhXuPk4OMl2dtc2hwc19HWWZWRENOWERaOUhCNT5dUWhcTlpdR1teXU9NUlhkS0tDXWNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKSan6SstqOsqKSurbWprrO4pqawuMa2sLe/wcK2tLrFvszFucPBusC6xLjBubK1rKq6uLu6vrWrr7G3mZioq6urnK6rj6u+nquvsaOqn7Gtsq6utrK4tqqtrrGnta+0urzJsqq1tLG0r66moLOfmqisoKSVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxrKq1pK6wtK+jmZ2tp5uXnZmZrLiil5ORj5mcoZiYlK2hn5aClZmOnp2alpGKlJOemqWjo6GZl5OSlnuMkYV7jYuDi5NsbnlvdXxhRmBqWklIWls9e0pHRTZBYlVpW01cYUpbXFpTU1NiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUS0Walp+vqLGprKWjrq61qbezt6OstLfKurS7u8C+tLO3xMDMx7zEvbe/wMC4wL2yva6ourm4t8K3rK6yuZWXp66sp6SyqpSvu6SssrKmp6Kxs7CysbWwt7KprquyprivtbPExbaptbWrsK2pp6K2n5+msaCklJuYlLCep5ufqY2pop2blZelpaS2p6Kws6unsaetsLWspJmhrKicnJ2blKq5nJWPj4yYnaKYkZiopKCYhZOXkZ2cmJeXiJaPl5uonKShkpaSkJZ3hJGGfIaChIyNbnF4dnx/XUtlbFxKT2RcP2J7R0k4R2dXZltMXmJNWFlXVVhVaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGcyNydGYUxWJS1CLj1FTFE8M3JrTEREkZmkraSsraumo7Cysqq3sLWfq7W6ybiuwbzDt7OxtcLDz8TAwr60vcHAu7+8tMSoqrmxtrfAvK+stLSdoaexraWmsaWesrWsqrKxq6iotLmstLK1rLOsqquorKm5rbKwx7+4pLmwqa2tpqessKWko66jqZydm5qvmaKioqOQrJ+joJ+hqaaluKSrtLSkqquorK62rqKdo6iqnKCZmpKktJmPiY6IkaOglo6Vn6KWlYaQlZSem5mWlYeXkpWZp5ygoI2Tko6ReH6OhH19fYeKinJ0c39+flxTZG5eTlpnXUZElltHOk5tWGJaTWFiTlZWVldUWWheUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RkOzYqSGRISis6ST8zQ0lTLD6Paz9ISZCbqaqhqa+kp6OztLC0tbGwoKutvcy6rsG8x7G0rbTCw9HExb/Bsr7Dwry/uL3FqK23rLS4vMCxrLKuoaOnrqqnpbGjq7Gqrquxrq6sq7K6p7exsqmyqaqmpaOtuqyqsMK5tKy5qKmoramnsKWppKKuqqiinpyirJWlnZeemKudoaeooaymoqystrCxoKmin6qtsKydnqanqZqjl5iQoKiYhoOPi4ufoJCMjpeekpGIiJKWoZ2WmJaGlpOTl6WcnZ2MkpCNin9/iIR9d4CHhYd1dHKJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9jXE1VVlVXUVxiX1NPT2hYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlF1ATkaVl6ynoamxnKior7WsuLWuqaSrq73Ju7C+uMOvsKyyxMTOzsO/v7TBxMS6wbTJxKyvt66zusC+tK6urKanqbGppqiyprStqrCtrbGvsqyzuqS4s6ysraeroKOesLerqq25tqS1taOpqKysqqygqKansbGjpqWhoauWqqGUm6ClnqOiqqOsop6msbasrKKlo5qpq66pnaGlpKSZn5mVj5idk4GCkImFnaCNi4+Nm5CTjYWOmaWbkpGbi5ORkZSjmpuai4+Li3yHgYKCe3WBhIF+dXiLo4d4a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWFWS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZCSUlEl5GvpKKpr5ipqK21qrawqqSrqam8wcC4ubS8taayr8TKy9G/wbu4wMDCusG6wsSusbWytLzBvrOxr62srKi3qqatsKu4rqixsK6xq7WqtbantberrKSpqpyknrOzqKiks7Sfta2hqairqKumn6urqLm2qaqpqaGpn62bkamhnaCjoqaiqp2bprSup6WpoqSXpaanqpyio6OfmZifkY6PmI1+h4yHhZ6eiIWLi5CQko6FiJajmo6NmpGSkI6Sn5eZlo2LhH90h4F/fnh1g4B6eH6AiJ2PcHJnZ3F4XGF0iGlPXZhWSG15VWRWUmJPTFZUVVFPWFtiVkhQalRWVEdQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JGO5WNr5+lqqyZqqStrrK0r6qlr6mpu767wbGwua2itq/Jx8jRwL+9urzDvbvDwb+/r7Kzsra9vMGxsrOrs6mltaikrLOyuK+irbWxr7G5qriuqq+3q6qeqqugo6G1ramhn6+yobWqnqinqqOqoaGsrai9r6uuraGnp5+rmY+vopiioKimnqebmKmwqaKfrKKhkqGio6eYmqilmJiYnY+Lh5SIfI2GhIWkloaDgoyHkI+ShYeVoZaJkp2Rk5CNkZyUl4+KhoZ4dIF/fXR4eoF7dHR7aoKIo3ZpXmVsgXVniIt8UldwXkt4c1RkU1FfTU1TWmdOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzSPjrCepKWqoqWjrKa0s7GppLCnqri+wbywqLmqp66wycfI0cK9wL65v7+9ybzCuLGwtbK6vLnAs7S8rbmso7Wmp6yxtriypqe5ta20vK+7pa2ttqqtnKmvpJ+lrKuonJ2qsqS0qZqqp6mkqZ2jqaipvauzsK6dqaOgrpuasqKWpJulpJ+lmpmnqqWemqmhm5GboKSdmZaoqZGZmpKQi4KPhX2Pgn+Ino+HgH6MiJKQkYWClJuUhpOijZORi5GakpWHin+Acnp4fnxod3x7dXFyfmmGeoSIZGBoY3KFe21oeV1eVkNYe21UYVBSWUtLTXB0XUlaW2daRlZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKvmJ+eqaSjoaqkt7KxpKmxp625wb21sKS5rKiosMPJyczBt72/tbjBusi1w7W0s7Wyvbm6vbauuba/raKzpqqrrrW3tKmcuruosb+yuqCvtLaprJ6tsaOcpaepo52cpK+mr6Gfq6mnoqqco6mgrbunrrGuoaqio66enqyml5+aoaKbn5qZoqqimpqjo5WWk5+hlpyWpayLn5GPkYyCin9/j4B6mpSMiX1/jIeRkI2KhpOYkYeUo4qRkYeQmZCTgYh9eWx9dnl4Ynt6cnBxc3hqgnVqg2djaGFuc45tYmpwYG9CXXlrVl5OUVFLSU1TWVZNXF5tV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl09I5GXq5ifl6ejoZ+no7evrqKvsKmrucK6s62gua+rp7O6x8rIv7fBvq+0vrfEtsKysLqxssC2u763qrm4vaqktKaoqq+tubComLi8o62+tLOhrri1p6aosLOgnqSlqKGkmZ6sqKieoKqvp6Cml6KooLC4n6Oxr6GroayknKamqZqam5+ilZybmZ2pppabnqiQl5KYnZOZlqGpkJqJjZCHfYd+go18e6GMjYh5hI2Gi46NhomTmo6JlZ+JkJWDjJaNkX2FfHRwfHFzdGB5eGpvcHFwan9zZHpsaGVkYmaHgGBbcmpxTU6AaVhaTVFMS0hQUlFITVxfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56hpKG3q7CjtLSpqbrFt7OuoLitrqywtcXHwLa/wrmwtL23v7u+sKy+sLO/sr3Cuaq7urinqLWop6uvq7OwpZi7tqSrurWunrG4r6mlp6+ynKGkoKSkoZabr6ahn6Oor6GgopOkpKK3sKGmsaufrKOvl5yqpaifmJqdo5Oam5mcpaqam5uklJSXlZyOk5eiqKGQiYqPhnqDfYOKeY6Xio2HeoKIhImNj4WPk5iMjpaZi46Wf4aXjI95gXtwcnZub3RfeHdlbWxsamqEb2ZyaWtmaF5kdIFgW2t2aVpKf15cWE9PS0hIUlVHMzldXmxRRVlVWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJkVywylKGhl5ScqpykoaKgt6quoLu4pay9xbSxr6O1sKysrrXDw7yzv7q3sbO5uLq3uq+uwLO0ubC/wLitvbq1paKyqaepsautsaCZv7Wkp7W1qJ6yvKmopamwrJmjp5ykpZSYobGlmZ+jqKmcop+TpaCkuKikp66mnqWhqJKfqKKhoZmbnZ+RmpuWn6Gqm5qYoJSQk5aZjZSTo6ekkImJjoZ5hHqEhXydjYmKh3qBhIeJipKFlpOTi5CWlI2NlHyDl46Ld358bHRybGxzYXd1aWlqZ2dvhmhoaWNmaWlgamNqaFxme2NgU3RUXFtTTEpHSU9TQCEqaF5qTURXVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp2ipJCNpKaanZ6do7Stp6q6tqesxMG3sayjtq6nrq62v768ssG3sK6ytra4tratqr2zrrKxvb+3rry7saSftqqlpbOoqq2dnMCrp6WvsqmstbueqKmrsaWYnqmdpqSRmaasopiepKmhm6Gclp+dp7WmsKquoaGdnqGUoKafoaCam5mbkpick6WdrKGXlpyUko2Vl4uPmJupn5GIiYuIeIV2gYKBnYeKgol9f4WIh4aRhJaUkI6QkZGRjJJ7g5WOhnN9fWZ4b2tqa2Z1c2tjZ2RkdoFjZWZmZmpqY2tzW19aXW1kYU5pWFpgVkpHSEtNU1g+OV9saUhDVVRdW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao6CPi6yhmJeglqSzsaKyvbahsca8urGxpLasqq6ouLu6ua3Asq6urrausrizqay5sa+us7a6trC4vaymnrWpn5+vo6munKLAoLGjrrCut621nq2ura2imp2mqaWflZqnpZ+ZpaKonZqfm5ScnqyvprqorqKhmpuemZ6kmqSdl56Xm5OYn5KolaqnmpOampKMlZmNlJSaqaaOjYqJjnuBdIGBipiFh3yJiYWFioyKkoSUm5OSj5CQlo6Qf4CMjoJwgH5meW1oa2lmcXJrXGhjY3SBYmZnam5sZ2pqaG5dbGx0cGFUY2lkZlpJRkxNT1lRUFZhZYFVQVdTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGbjY6wnpqToZqpsa+fub+1oLTCu726saa2r6itpLa3trasvK+sqqu2qrO4rqaztbKuqbC2trGztbqmqZ+1qJydqKGorJqnvZiso66vtbWsrJ+xra+popucoquonJScpqSdmqqipJaan5yQm6Sqqqq8n6ekoJiamZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiZeZgJaKoZB5h5SMg21pfnaDcWyGi4Z9hYyHcF5jYWeEmIVri4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dzhWhfZWZubWpdYGGKj4SEZk5LRDlHVGdeSkdQUFVVTEhTYXB0ZkZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsKzA4PUc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYWVsJubk6Cbqq2qo73Fr6m4wri9vK2ntrClq6O2srGysLmtqaastKavtaOpuLa2qKestrKutK2zoamfs6qeoKObpaaYq7mUpaWvs7etrqWpraqspaGenKCnppuXoKWlm5unpp2Tn5+YkJ6oqaS2sKSjop2WmJeXo4igjpKZhqCHk5ygf6R/paqekpKakoiEcniNjoWIoXaIjGmXiGZ9c3igb4iHg36OfH+hoKCZgHyHnnSHjnWbimyHgYNsaGVjemxxYVOFbWJsaZhxWGlxcIhYXmlbbGxbiHFuenKFZ4aEWl5HTj9HX01FUlZWUVFSV1VnXk1XSVJSUEZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiKppaDnKucmZidn6qqp6q/w66xur23wL6qpbewqaylsrSur7K2qqmlsK2ltLOcrbW2taanqLOwrbKnrp2qn7Gnn6KimaGhmq2zlKOlpbW9pqynq6qsqKWhoJifpqOZmaWjpJicpKmWlKOclJOjpKaht6SkoKOYlZOXkpyIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kYR8kJCRynKXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5nem9yj9h+U2tjtrJ/gXKVdJqhqpBXT1diUFZORlVbWFFQUo1cV1tRQV1EUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKaSgKeqn5ecnaWssqiwwr2xtb+1t77BqqezrKypp66zqa+1s6anprSlp7ivnLOytqulpKexrq6wpqqdp6OwoqGfnZaanpytq5Oeop+0uqKqqaGtrqWhnZqaoaefl5unoJ+YnqenkZynmpSdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUca6hpH54u31roY92sV9qtFulgGWckWBmgntmf2p4a6llvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5nfKSnglpfi6tpgJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOiVBXVy9JVFNKREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsqKWeo6SqsbestL2/r7bEsre6waapsKuuqKmvrqOwuq6jpK2yo6i4qJ6zs7CjpaCqra+sr6ann6Ohr5uimpaVlpqarKWWm6GftLOiq5yira2gnZqXoKGonJido5+cmaGmpI+dopmXoZ+qnqamoJqfoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH9rgaZ7goaIkpSSd6tna7Fcq3qNhpR0iXKPhoB/iJCXeIKCi5iLg6CPhLB2d59xa2tsfItOpFhIYmKZfmNopmB5cnVTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCP7J5WFhBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WIs6amoa+pp7Osqbu2wrC7wq24tr+qrK2traatsamgrryqoKe0rKOrtaSmsrOnpKKep6qyqLCnpZ6fn62Vn5iUlZWXnaugmZmkqLSuoqmPqaiqm52VmKCkp5qenKKfm6CjpKOVm56XmZ2iqZummZycoqCXk5GTk52D1ZOZuXCwwX7GhnzWlJu7fJqVpY+NnY2ke46HpIKlgnqseY+dVq96iH6farlbuneHhH2mgpN8mHqpeI2dj3uxbo6EdJG8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObk5cUk9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSguMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KUmbKoqKa0qqW0qaS8t8GwucCxtbS6s7Wnsa+isLKmn622qJqnua2jr7Ggs7SxoaSen6epsKi0qKSbnZ2plZiXlZeVlqConJmWp62wqaOfj62iqJael5uhpaGYoaGhoZqhoqabnqGelJmbpp+bp5WbnJ+hmJCRlJGdiLJuaLVxq4dujqZytHNytnual6SLj52No3+RoaV+sHaDkdLSdlyue4V/pG+bqqZrh4V9rX2XmY57sHKSnY54s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa2BsaFBVSEk5PVZSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWwrKOrvK2mtKantru8srq/t7azubmypLSzoLGxop6rsKSXprmtpLGwnLS4qqCmnaGppLGorKmkmZuZpp2Vk5eYkpKhpp+VkqWqsKailpOtoKWSlKCbpKaflZumpqGaop+tmaCenpCVm6GdnKaVnZaaop+VmJWRm4Wse3eodqONiIapb62KgqeDmJihiZKai6J/k5mJroV/grNccrNSrn2CgqR/cth+eIZ+j52Fmpp2r4aJkZyHd7RhmmWagoKUbJJasFhLmnWYeWZgrV52d4homIhrXa93lZ6PeGw1eciusl9CVG9eZ2BFUG1fcG1WVk0uZmRpU1hRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnpSgubCXtMKtqLOoqbK6t7O4vrm3sbS7taS3sp+zrJ+eqKyflKe1q6iwsauttKSbqaCfqKG1pqapopmdlKOhk5KbmJGUoaSakpCmra+moZWZqZ+ijpGhmailoZWZpamdnKSerJ2hnaCNk56anaGYmZuWl6Kgk5eQpp6GqX19pXihjo2CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTZgHeIdKiBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpOAkX9oZ6pkcnuBa5iHc12rWomgjmtvZU9KQ6FcW0x0XWJnTVthX3J0X0tWN0qblFhHRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amr+rmLTCrqutqaW0sLextb65ubKwtrqourSfr6SdpKennpOqsKmvqbWsqq+hmKGgpqSkuaKjq6CWm5Chn5STnpmTl56ej4yLqLCvp52Xm6imn4ySo5eoq6eVl6mnnp6go62koZ6ijZShmJ+gkp6XnJWeoZWWjqucj65tcrRzqYt1iqdztHhzs4CRpKOSnI6JpIeQd7hvjHuLomprtlqhhWWXl2mgoqdulHK0dJOYf7JqhZKIrWt1s2GdZqJvh5Nql1ytX02hfIeRUnOjbHl/fm+Yh3Fcr1Y8nHdmVG9uLlynT2NTa2VibVpjXWFwe2NUWlI+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKabm527oZuywK+tq6ynt6m3r7XAtLuvrre2qsC1qKmgmqWjoZyRqqmntaOyqK6qoJecp6Clq7mdo62blpmOpKKVjJ2gm5icn5GTlKq2sKiZlJysqZeMk6WZpa2jkZaqsqSfnqarsZmho5CZopagm5acl6GTnamclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJeLjKeIeqO2dX13dsKCmrJgg7p5wHx1uGO1gYyHqX2VgaypcXt/dLyIp6BpnWGmjq+ifox0h6p9vm9zvHSyg3V4gYpumohxbo2kdL1ed31aYXm8a1pWXGp5XmphZWdjbXhvWlxaREFAc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6ivKGXssOwraqrq7GnuK+2xLC5sKy5rq3Asaujop6joZubkKmkqrKjtKatpZ+WmqqZp6y5naOtmJSgkKWfkoycop2YnZqRlZKvubKslZejp6eUkJaknKStnpGgqKufm5+oo7Ofo6WOqKGUopqcmJWjmJCvoJKUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSewbu9mXqBsahwgHORuYN8hoaMh418ioeNl3yku7m9nHV6tKN0dpd2dLB1mZ5mhmqNtXRycXe2jF5/en2JaIN5bnlii6xwdYV/WFunakVlWlRmYGNeY1FoZ3FtdUJOUE1EO1pNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43MDdMVF9HJ1NiVzgqT15dPSs6VlYnPjs8p56gob+llrTDtKyrqKyrqbqusMWutLGstqa0uKypoaGlnqCdmZOrpK2ppbSnp5+blqCjnaykvqahqpaTnJChmpGPoaehk5yXk5eUsbW3rZmepKSii5KSppulqpuWqaWlnJqhqKWnpKmhkq2elqOel5eXnZ6Pr6iUm6ahjWp9aZumeIdyfZmOdHlkh3u9vsC6b5ODcpWHYXNqWl2aiWFjiI6Va2CAlWNtnXdilWuAmpWUZV5gY3Caimhyi32FlWdqfnJ1eH1+Ylt3dIFoUFxug318i2tYa3uCckpKb4ZwTnRNRVhdZ2FMWlhnY19PW251aXJSUERFTjtIST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPltPJz8yPqmgqKLCo5u1urWjrKWup6e1sazIq6+xqbOivbGxpqCiqJyim5mZrKavo6O0qaWbl5Whm6atqL6nqKWUk5uVn5mSl6SoqJCekZCYnLCyv6ybp56noomTkamaqKOamqygo5mbo6eso6Cro5qxm5SnoJaUnZ+dl7Cll6GnmZuQnJyio5iloZmbmZmZj5WBZ219cXeSl5SShYu1qoyFl5WOioyYloeUlYqEk5SRiY6SlJiUmJaaoKGanJSgnY2CeqWGbGp8kXyAdYqKgXGCeHl2doqAfIpqc4F1g3Vld313a296bWBjXXBoTVhaZmpgV1pwem5tZlRPRlM5T1pNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOiwKGksrK2oKqmsqelsLSqyKqsr6S0pcCns6CdpKSco5WVoKqnrKOitqufmZaWn5etqqXBnqujlZGbl52XkpOhnp2hp5OSmainssSwmqudq5+Ql5aonaqbnJ+tmaGbnaKkr6eipaifrpiXp5yZmqCenZyvoJyhppWXkpeTn6CVop2XoI6Wk4qKjY6XrpB8lpuDkoKLqqmFgJiXiYOPnoh6hJCHhpqSiIaKlo+bl42RmJ2jlpqTkZ2Nf45mobOvhYqEdnuSin12eXpvZnmQgYCJa3WBeohyaXN/e3aDh4JrdWR5ZmBqZWNkZmtZbHtwaWpcU0xQRF5URkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9iY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0W0c1PCxAtKC6r7+sq66ysaCrprGtoqyzr8Svqquisq28o7Obn6aioZyZl6ilqaakpbK0npWUnZmZsKWuvqCsopCRnZmZlJGUoZyXqJyEn6qro7TItJ+qpKuWlpeapp2pmp6jrJSen56gqa+qpqSsoq6bn6CgmKSenJ+cr6OYnqeSl5ackaOYl6ecmpdlgpJ8ZX6NmpBjeY5taWt7kqSqamSal31nhoplZWloe46hj2xojZiRo3draouZo56Zc2xueoONh3pYZV6Gg15ti4mBdlxoc3d3koCHgm54gniAc215hHR2iIiPg3xrh1lebHVkXnOJaWt8cWtjXlJOWElkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaWfury5r6y0saqlqK2tsKatrbC8sKmmo62usJ6slqCjnaKZmaaqnK2jpaipsq2elaOPoq+ltrmmrqOOjpqhmZOSmp+ZmaSVe6Wtoqi0xLiloqevn56UnqKeo5uiqamSn6GeoKqwq6ykq6Cqm6efp6CrlaGbpbCkl5uqlaCcmpGjlp2pl519vYOIcrRyhJ2GrWh4ucS4cZOio3qlmZhzq4J8y8DAu3GMooiDn32WmImdwL2Cl52djZ3CwXyCe5KNmsPAfmylsm6MgW/Ken+bd5GDjoF2eYGAeXF6f4dwd4WMk3lueJRjZl95ZGBlgmNedGhsZGNYTFdJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtLCwwKmolKOvqbCuraaztK+ppaWmsKufq5iaop+cmqqnop2soqWopKS0pJ2ikqatq7ezp66ikZGZnKWSkZ+gmJufnYemrKSrrcDAsaGpr6mXkZ+dopqho6qjk6Cinp6tr6qtp6Skp6GmpZ2tqJGkmqitqZqcqZuroJWVpJWgopacfs6UeHqkgXmVlptfro9ejqeBoqB8p5abc6uDgK9eY42qe6eHhaB1l5OIs2OCq4ahjY2zaoSudH2XiLdhgq1ao81tkHV72nt/mXB+iJJ2fmV7iHZ2a3yIbn2GkZF/bYOQYXJscGhgYHlkXHFoamRnYFJUU1ddS09DNUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NDc3MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqets6umsqysqqKqp6+poKebmaWXnKKvn6CeqKejpqGfsKyanZWnrqywqqisn5SSm5+kk4+epJedp6OerqWrsKi/x7OoqbGulpKdm6KXn6mqn5Wgn52dra+prKqdqKikoquSrLKWpaKqqp2jpqShr5+RmKaYn5mTk5GXoHGFjJd1haiGcbF9nnKsfqGegaWPnneqgn2tf5xzrX6rh4afdpmSe3yXfqqIooyRjJ1+q3qIlJCfgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+JipKPhG6SkWZwdXVxYWdtZV9vaWluZ2RYU11hWlJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08KD4xKTNWQEYhHEc6QzEuK7DTxsaytKCdo46joqKsr7auqLCmqKqmraurpqGknZmhlaClq5+ipaCoqKOfnbCsl5qWqaeurKinqJ6XlJqjoZKUoK2bnaair6ykrLWquc2yraaurJeVnJ2imJ6trJ2XoJmen6myq6urnKyrpKOsm6+xoqirrqWYpaqoqbChkZWipJmTkYSkaqR1iXqpdHqycIKmipmMcYigmoekYGBSq4R/roObdq2Bp4aGn3qZl4Z7ZoCjiaSZhoKjfal+gZaHrl99qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoJunJVxbnp4eXBtZ2VlcnBmfGljXVdgalhZVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydXVv6GZq6egr6KesLSwrqmsoqemqKqrqaSmn5uknp2mp6ejnKyaoqyho5+vopybk6ukta+uoKianZaUpqOQmqKon6ClnLCmpKixrLbIsrWqrKmWkZ2coZifpLOdmqGUnZ+nrK2lsJutqqOiqqGzraGqs7Chmqinrq60opKVoqaYmpF7qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfYJSpg6SJh6B6mJaaeKrJdJqklaipkZOajICciprGx3hmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI6QnpJ8cZmVgXF8dX58blxmanNxZoFrXmFZZG1cX1lJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqgpZqopaqrqaafpqaYqqOgrqudpqCsmp6ppZ2ntp+il5OpqrayrZulnKCUj6WskZmcp6KgqaauoaSnqbC1w7Kzqq2ok4mXnaWaoaOupZehlZmcpaatnLGer6mnnqyjt6yhsbivnZquprKysqOTlqeimZ6Ogp1OeJqBf596hKN9g6SEh6aenJ6ThLh7e3m5gn/MxsK2eJuhkIuffpqWl4p2npiKpZikqH+whZ2GoISsfZqUYqVspHCPhJCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Uk4x2fHOGgHFcbm54cmqBb1tkX2luYmReTExRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX11aWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq6fm6GssrOlnqCVpa6trqunnKammqOnobOvoqmnsqCZqqWUorWiopWXoam0uKSbop2jko+hsZmem6akoaKvrpylqKK2ssSxramtqZGHkJynnKKknKWXnpiamqakq5uwoq+lppivpLusoba2rZ2ctLG3sLGll5yun6OchY/RtcO3eYeOhZGTkICmeJShd4ygkYSlgYpxqoaFtG5yapmjnJWKnnyYmYaHj3OvgqWboo2mi5Odi5aQm21xsl2lc5N6m2uZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWNeX55kINuanlpeXJvgHVeZWVvbWZnYEpbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/vLq0npanpa21oaKZlaOopq6rrJmmop+moKG2p6Opp7GjlKyjjqWto52Qmpqqs7OknKScqZGUl66fn56mo5ynnLWZoqqktqvDsKmrqaGMhI6coqCmo5WampyZm5mnpaiZramvo6Wbraa9rJS9sKyeoa+yuaqypZqosKKnl3mokH18sHeKgKSliJxtsm+gh618oY+Dp5WYgKyJha6Fn5SqoKGXhp+AmZWAe5J+q4CdmpaLq3idoJKKlJKBeq9eo4F9pqdjnYB8l3Nqr12la3CFmV1gW4ygbZWRppmDlo6ZjXx8hJiAa25/Y390boB6YWdmcW5oZ2hDWmFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBgYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVVRVVVVVVFRVVFRUVldXWFZVVVFIRklKIygovZOag6nGwrbBs5+arKCtuKWjjpuko5+wsKqfpJ+drZmfuaCjq6CvqZquoZCrqKSWiZuQrrCspp6mm6yXl4+soaCdpaGZpJyumKGop7epwa+lqaSei4COm5qfpp6SlZqblJuapqWlm6qsraSln6qovqSWwqupoqCrsripraWfsq2nqJd2r36Qi5yFh326rYqZZbGNZZWtfaCPg6aVmoGsioSwhaaapKGhkYWgW2xqgbNgf617e4OBsW1nb5mYjIixW361XaSEa8iiZJ+Ae7xYdrVZsn1SroB6rFiAoW2YkKibjJiSmZh8epCef2V1f2OFeHSAfGJqZ3FtZ2VmT1ZkXEFVXz5JKD46PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBfYGFiXl9cW1hVUE5KR0M1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vbqzwbOjnKympLaooIqaoJ+ds7Opn6OgnrWZoLSoqqyer62erJuVr6iijoibjq+sqKehppmukpiPqJmhnaSfmaOjppmgoqqzqb2vpKienY99i5uWoaCZkJKanJKamKmgopqprqimpqKlqbueoMampKigqrS0q62lnrqsq6uUgKmSo6+Om3+HpJeZkIKAuMO6g46ckoSnl5yCrIqCr4innJumqpB+1b3CqmKjv719fqOCg9e6uLWFlZODnr2+hGyjgm+rhGycf3qysMeDaauwvax4d6K+vHOAlo6mnZGbkpqfe4KSnHtkfnxljmd5gnthbGVramNQYVtTalw/VWJDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsb+5sr2yoZyupqWypp2MmKW/qriyqKK/p6eynJ6xnLqon62vpqeUlLCsl4yDm5GupaKsoKOcqqCXiqKSpp2nnJqhqKKZn6Gsrqq6raijmpeTfIeZkaabko+RmJiPmJSpm6GZqqmhqqego6q7najFoqCuo6mzs6muqJ+5pq2tmXN1qqS3hmSJoHBorpGKkG5ud6SQmZ+Bda6YlHCPi3GVqKObl66kcm1sbGaLeG9ugplxgXpqcWlnipeWmHFpaYWIZ3GGZF2IYmpvWVxmfXamX2FxjpFuZWV/jZOPoZiZmZOZoX6JkZZ3Z4h4aY5ren95ZWxjZmxiS2RYSmxaOlBlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVlXV1ZXWVxeXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp6jsqmXkr6yxMq/t6qfwKytpKGnrKC6o6SurK6njpeuqY+LhZaXrZ2mqqCdo6OgkYukkqaZqJmWo6qglp2mpqewu6ysmpuTknuElo2lmI2RkZmUjpiWqZagmKmjm7GmnaKruZ+vwaejsqWrr7CprKqmtqKstpWKoKiltp2JlqOZh6qbkZWdkqmymZqjqqCylqKhnZ+inKGloZWrp42SkoyHk5ydlZGZk5mRjpWGgaWbmJaOi5SUi5CGhH1niX50gnVzhopwp2x6lJGTkoGBjY+Qj52VopeamaSEiZaPc2qRd3GMeHd8emptZGNvZFVhWUBqXEhjYU9ZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhUVlleYGFjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1xcXl9fYF5eXl9fYGBgX1lZYKaWqKqltLaurqKwo62foLWxkI6sx77Gu7mro6WenKafsamkt6edqbWnqJGYraKLh4mPnKeVrKSfmKeenpKUo5anmqiZlKahpJCbqJmhtruoq5makIx8gZSLoZSKlZGWkJCUmKaQn5uqn5y2o56nq7enrsGto7alrq+vq6iosregrbuYkaWkpraikp6noI6qoI6Sn6Osr5qgo6+or5ijoJyjqp6enZyWq52TmaGblJCWq5qOmZmWkJafkomhnpWVhZKNkY6Vi4B9ZouFdYZ1eIeCc5xqhY+Uk5CJfIuVkpKYlKOTn5mkhYqaiXxzl3N6i4BzfH9qb2RecGpgW2BZbmRQYGVQWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaOno6+yrK6jqaatn6e1qpCQnaW1vLCtraKjmnueo7KkpbGpl5u5p6OTmaqcjoaKiZyij66eopWon6CSlpiarYuplo+omamNmamPnrq3pKWZm42IeYGUjJuTipWSlJGNkpejjZ6fqZ6fuKOAhK+1oq+vdKO9o7Gfd3mfqbC5lHWso56JgKp/ZFxidqCPpZ+El31tkrOco6etqqJlnp+Sc3mal3CAmKiXbX+iqIplnKadkpiYloySnJKGnpqQloSSh4+PkomFd2qOhnaGcHuFf39gaIeKlJKLWnWUkGdokI9ze6icm2Z6momEeZlqhIuEb3mAa3JlX3ZwbGtoW2dmYmJwU1w+Tk5OU0c+QFVEOTEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6CusKyrqaWorqKmraSSlqu2sbOnm6unrJd0jJ2woKirp5SXuaCgj5yknZF/iYibno2smqKVp6GdjpaRnoR1rY+IppupkZekiZy7tKigmZiLiXV3k42Wk4qTkZGUjJCUoY+boaeZnLKWgIybtZyzjJKOu6agfqeieqGttYCOjaWeg4uGkLGqr4yKl6SbeoCLrIacnaGnqKeHlYWYd6WbeoebgZingoJ7nLJ6ioahmJqVmJaCkZeXhZuZY3qHkIWPkJKLg21wjoZ5gHB/gIR+hXOFhJWReJZnknSgmnV9mYWjn4iYf5SMhYWaa46Ohmx4e3FxZ2R4b2psa1tlbGpldFxeSVRMUkBFNS5aVVU2KSEwOT0+NzQzNTY4Ozo9Pj5AREk/SUVKTEdTWFtZW2FhaGZZUUg5RUw8PmJWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop+lrKyrqKyfqLCmpqmlmZSvyL+xopeoqbWekIWdrJynoqCNkL6emo2fmqCQfIaPmZiIrJyilp+hkYyTiYaAkaeNh6KdpJSYnoefurKonpqSjoVxdpCJlZCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6mtiLeFjbCBrqyCqIymmI2dfaiPcnt3nI+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWygaF9oZOgkJiXgY6TnIuZkox9hZOHjpaSiYNtco+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56EpJ2EmoGOj4eLmnGQlIVoeHV8eGhodnFoaGxeZHBtZ21YZ0ddUk0yRDQ2TmJlNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKfr6eoqKWrn6O3sKmqppqUoKOkq6SXpqu4o7CBoaidpp6diZS9mpONoZKej3mElpaRiKuZm5uZooWOi3ebnI+fkIiepZyWmpiHo7mupZqcjIx+Ym2Pi5OQjZCNjZiMkZKgj5SgoZmhp36hp4etnaCWrY+enJ2RhYCgjKmthaONqZmMmn+jdYCZlGuCrXZNq3iHjZyRmqingKmrfYOhe3qnap5/kmtnl4aXt4mefm5gZFmDl3+Me2Roi3OZfXmWbF19l21fU3CDXF9reIJfWGSBfIN/l3CnqmuDo25ypXCfhaBqZqBtW2+MfWdaYISAYlhQb3dmbXRza2pvXmtxbWtpWGlPXllGOUE0SERfbDUsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGgtrurraKZmKGipa2uoZ6vtaOok6GgoKecmo6ZtJqQi5+MlYt1gZSSjYqnlpWYnp9/koWFrKSHmpCKmamZmpuSiKaxp6KWmoiJgGluiIeLjo6Ki42SjJGTo42Un6CcoaR/k4GPo6GUoHeclY+ng6Gmf4Wnq4OleIl8hJp+onBzlIiWfJ+NeW2Hm4yZj5uomo+HnXuConN2pmaefnekX5h6fZN0om6Yt7S6dJOHgn+1qGSBxrh7cJW2jHKAmqRjc6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGCdmbOWcX2Yn7N1c1uesoNqY290dnFob1hrbXNyZl1pXmNMRT1ENlJCWnMzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1PUUBFX15bWlhgYHxkSEM4TFdVV2NhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOVlKO3mKqbk6CNpLe0ra2gmqKdpKOmrp2csq6sk5ihmqGkmZqUn6ubi4iSeIuFcYCWjoqQoY+SlJ2YfZCJjaigh5eOiZKjlJybjYupqKWekJeHhX5qe4d+fZCNg4uQkYmQlKGDl5+gnaCei4l3nJiijJ9yoYuHqYibpY6Upql9rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYaiZKF8iJaQm41tnmibjm+amXuAi6d9cmh0q4Oeg3SqaJWaXZuFdoWdZ6prgLhmXKhwgZxglYxep3Z1h4h+nmiadIWTkpeOgJ9vmpBup5pdqH54u2t+qlyOhF20Z1xucnp4a2lccWt5eWNgZlhiQlFGTzdXRFNvNUtbWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXlllZ1hmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptJqniGOUm6u6sa+snqacnKmgn6+cnrGprZ2XpJuhoJmWlqGkmYaJjWqIgHJ7l4iLlpaEkZWYkHqKhJWknIqUj4aMnpKdnYmQqaOgmoySioGAaYGGeX+XjHuJjo6IkJebf5Sjn6Chk5hyaJ+Kn4+McJKMgamHmJ6hpZ6me7Cto6K4l3ejs6OkgIiUeZ17qpp/oo6cmpaIl3GhfIWNr7V9a5qRoXl+mbWjpKuohJl8m32dmn90qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g51uc32VcJp0a6RdlXZIZWRgdHF+fm5mYGxpdntkZGJRX1hdVVdAWkZRaEVTV1xiWF5JRD1COD9BOklGOExFWEFXUltWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZtXWVnZmtkZmxpaGtpk5yAsK2ZhFNeoKazubKyqZqijJysnJyqlKKspKKoj6CenZuZlpihnZaIh4l3hoFveZWFkZuLfJGTlohygIiSoZtzkJCBiZqVoZuFj6mcm5WLi4t9g2yEhXGCoYx4ho2IiJOZlnyUpKGeooithn21hI6enHullnqpgZWbj4mfm3ynaHdtfpl0oXNyfJ2GmXCTg659pIOmnZmBpG9eqGd1omNvpWGc05B9e5l4c3RiooaQfqNzpI91a4+zjGCCmIlzqrKovH93g21+v6aptF2bbnxwlm1/cqJyXaRnc6ZgaKZtm9SafYabcHp7mGycfHiXc26ppGdgZXpxgIRsZ2Zkb3V3Z2FjU1xmUVFiSVhKVWFXU1tlaltlUUZES01KS0JLRThPQFFOWFNZT1NRYWVlalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJeagLCrVFxLfqmvsbSvs6ObmYWZqaChpI6lqaGZqoqamJiTmZOSoZiPiIZ7cH2FaH2Pg5SagXeQjY+Jb3+Fj5OSbJeTfImSk6WWg4+rm5STi4aKeYN2iIBugp+Gd4CShoiao5h7lKOkmp+Js6Gitot6rKekrqVwqYCajoWAmpB7pIChmYaYcp6Eo66vipeMgI2kjZWDraCUdrW1tcmhc5SLgZ9gnZepbXmVh6CbdKKHd6B+k5eLgW9NZqOScJqHc6R7enRhg4FrfaBrcWRfnHF9c5ZoeWmztbTGpnOYfXqda5ybq3aFm212eJhqmnt1mHJQRX2zX2p2a3mHZmtoY3V1cG5XX1RZaVFTaElWTVlUVl1oa25WZ1dOS0JKTUtISk9BUUtQZWNqbWV0c3N+eXxudYl7e1RQT2xeaVxraVJqaGlsZ2xmY2VgXF1dXmliZGlre19dZGhjamZubWVpbGWhm4iupoRlP5Ohsqqur7WiopCAl6qio6WMpaeenaaDm5eWjpeQj5yTjoiDemp5h2WDjX+YoHl1j4iMgWmEhZGDjIWdjXqNi5amk4OZqpiNkouBiXp/fYt5cJChhnqBlYeJlqCWf5SlqJyWloRmbnicbKJkfHGld5uYcGemgJWKeqR6n5aDl3Kfd4GKlZePuW6RiqJifZmglYhtcmmqa3WgbW+mX5ppi5BploeblXSigH2aYIyGjXVviGJooGWefmmbdW9jZoiCbXGiWl5bY6FtXYiLbnp9c3JkpW14omRnp2iZc4yZcKJvVYmQb6BfZqhUi15UmG5tc2tygm1waWx5c2tvUllXV2ZaVG1JWU9dSVhpaXNqWWtWUVJGVlxNWFNhVWlrX3d0e31wfXxyg3uAc3aNgIR2XlFyYmdjcGdQamhoa2xuaGRnX11eXWBqY2ppdnVdXGNpY2pqc21ma21jnKSYpXpkdG2Lp66jqbCxpp+MgJirnZ+mjKOim6OigZaYk46akIuYkI6KfIdxgIlpi4t8mJxzdIl9kHxkgoeUiYmVmYJ8iIeXqJGBo6yQhpGLgop+gICPc2mQpoR9hpSNiJmgj4iTqaadiKZ4lZt+pYiWjLKYnpCCr5efpXaUhnipc6WPhJpupaKMkoSNg7tufaWvg4aFhpOVnJ98pXpyqJWglmaefm+sY5WKlpN3qG2qooGJdoiDd6uRpohrkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5+i6Wedp98g6SVnaBqm4h4rGierYy2dHe+jaSTWYOnjqthdXJ0cXx1cWNrf29obFNXW1ZhYl1rTV1SXUpebW53X1txWVxgW2d0ZW5vcmJxdGB3en55cnmDc4N/gXt7jIGCgHZieGRjbnJkUmtnaG9scmpmaWFgXlxia2JtbHpvXFxiaWJsanhtZ2xuYpWlqpyAf52jlqmqnaimrqSZioKYrJqfpYqbpp2pnYWMmo+HnJGFko2MjXSHe4mEcI2FfpiUdHSFcpKDbX+LkYeGk459e4KGmKaOf6anjoGOiYWVdoKHk29si6mBg4yUjomdn4qMlKujoI+AdZSXiH6BeZSuo3+Bm3GPhneOiYJ9e3KnjHF9fXqYlpuEj3l7f36Hk5WTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GGhIJljH9fgH+Ld3RylHVveW5uh2yEhV51Z3eOZYCAhY2omn10e5VqiYhwgXZ9h3dubWeMc3p8mHiFXGtYeY9pb3hycm94eHBda4duamdWW2BXXWZrZFZiVV9RX3B4eWxrdmZqa2x3fXJydXNhb3VidHuBeHV6g3V/gH+AeIqFg317bX9sZHluX1duZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNlLiopomgopqmpJilnKuioYSEmK2SnqGJm6ebqZiDgZuLf5aUh46KiY1yg3yPfX6PhXuYj3Ryg3CVhXt8kouGho+FeX6Ah5qljnyooYuGkJCFlYOGjph3coSpho6SnZCJn56IjJuon6Cqg4iOlZp+fomWraiPkaaPd2+bj4F4kG5+qIVwfZVxa3B9gaCNgJOOjGhtXYOLi5uano5zlYuIcXRrgXZ0gVlyboaRgX5+jGpdamR7hYSJgGBpeHqae4KKgXWBhYJnd4qGamFwcYF1XnGKgIiOpZSFZYuNg253i4RxhpB6cWdoZXyEe5ZbXGpnbnZbfHl4dW5zc4NnXG2La2tiWlpfW1pscVxfYVpfXWZ0fnt1cHRja2trfH5zfHh1ZG11aG18fnZ6fHt5eoCAfm+GioR7fXN+eXN/aFVccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzem9oam1gi4uqsKCPoqGanp2Xnpioo6J+g5mujqCViJyikaWVf3uYhX2SmYmJhoeKc36BjHaFjIKFl4pxb4BymIaDfpKDhIaKgXqBhYycoZGDp6KIeY6XiZWLi5yYhIN6rYKRl5qVip6diIihqp+hoqOLh5ObnKOZlqqhp6afkpqGlIx6do2Ng6d+f5KQkpOcsqablZ+QjbKTl4OljIyVmp+JkJuCiJGKa3yOd3hlgoaQi3yJnYSHjJCIiICEhJB3fHp0maCIhomdiYSTfn2KgIB1b3KEgX13hoaKj6WQgoWMhoKMkIx9h4yKkYR5bYOFfnqZa3JoYXSKcX56d3dwd3SCXV5vh2huX15aXV1TaHJWZFxdYmxodXt8c29wZGtraoB9bnmAcmpwcGxngXtygoB4f31/hHttgo2GfHl4e316g3hOZHZqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnLmelqKgmJSYmJSYpKCefH+arI+fjoagnYueln14lIN8jpmKhoOEh255gYFzgYh+iZSEbWt+epeGg4KPf4CHhIZ9h4WOnJ6Th6ughHOLkIaSkYudkn2Ne6qEjpOYlo+cloeHnKWfopqdhYKSmpmZkJqmn6WdnY+Vf4+IdXuGjYSle3yOkJGGmKuhnpSdkI6qjZCAnYyIk5mego+XfoaOg293hnF1YH6Dj4Z1jJiAg4+ChoV+hYSUbnl1dJGhiouFmoSEjHN/iXx8cnF6h4J6d4qOg5Gmj4WDjoCDiomKd4aJi41+cGx/gnxuaGxtaF96f2l+fHZ1dnV7eFxfcH5udWBjW11fUmduVGVbXmJraXZ6fnFsbWRramiBgGxzgWxsdW95b4Z5boeAdoKAfoV2cYKNiH57enx/e4KKYGl8anVoaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2LiZ63mqGjn5GRlZeLmp6fnnt4n6eRnIuHpZSLmJl5eo2FfImRhIyCgoNufIB5c4GFfouRfWpofYKXiH+HjX1+hoSGfY+CkJydkomonYBwjIuMkoegoYqFjH2okYmQkpeTlpN4jKOgoJ2WmX+AkJqYkoybo6GkmZeRmn2Mg3d/go6Gn39+jIyPfJiloaKTmpGQpoyPgZqRiZKXm36Tkn6HjoF1dIJwd2F9gI2GcYuVfIiMcYx/goWGj2h3cXiLmJGPf5Z9h4pxgYZ7fHB3eoqDeXmPjIKUpZKLhY97hoaHhHaDhImJfGdzfYB5e3Fsa2dffnNofHV2dH1zgGpeYHR2cHdkY1lfX1JraVVlWV9haGp2eYJxZ2tkbWhmgIFrbn1ob3JsfnmHemyMgXOBgX6BdHaCjYZ/fHp/gX1/j2lyg25zaWGHaGxiX3FWdG9tbWB4aG1XanR2Y3V6e3Jiam96iYyespKlpZyOj5ePhpygm518dqWhjpiAjaOLiJqWeXuGh36DiX+JgoF/cn97dHaDhX6KkXhnY32Gl4mAiYt5fYCNg3mXgpaZl42XoZx+cIyCkZSGppuIjImDppWFk4uWl5OSd5GdoKGXk5Z5f46Yl46WmpyknZiSlJp4joSCd4OVjZ1+gYmNjHOXo5+ik5mPj6KMi4OWmIOSlpl+mIx8iI2BdnF9bntkgHyKhXCHk3+RgmyHg4KAiYVldW57hZGXi3yTd4uIe3+FfHpxfXeIhHiEj4iKl6GVgYOLdoiEg4J3fIOKh3hhenl+dH94Z21lYX9qandzdHV9cXxiY2B0bnVybWFaYV5bbGVSY1lgYWhrdnmGcWNqY21laH2DbGh0aG5waYB9gnltkIZxgISDf3R8g4yBgH16goN+fJBtdol0dG1limxqYmJ2VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPnK2XpqiejYyXh4afk5eZfniqnYuZepedi4uYkHl8gYx+fIN8gYOBeHR5e3R9gYSAiYuAZF99i5SGfoSGdX1+in99mYWXlZiNpKOZf3OHe5SSiqaPjI6Kk6GSg5GQlZeRi4GPl5+ako+Qc3+NkpSJnZ2eppeXjJSVcouNiWuEl4+ZeoeIj4lvl52apJSVi4yfjIaCkpx/kpKVh5mIfIqKgXpxeWt1bHt+i35thZKClHhwgYN+fouAZHFpe3+Wl4R+jHOPh4N4hnx1d398hH97gouEi5Ojj3iDgXSJh32AdHaCiYVwYXx2enF9b2JvY2R8Y25vdnN4d3N0YXZgb2x1bW9cXF9eXmpeUF1ZY2FobXR7iWxgaWZqY2l3iG5mbGlqbWiBfXt3b5CIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhubIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJmqoKOonYqKkYaKnYuVmH54r5mNl32flJGWk4h3fnyKfXyAd3iAgHB1dHxvhn2BgYp/fGFcfo+Shn+Dg3N7gId7j5KJk5Kdk6acloJ9gX2OipKkiY6KjZibjYaRmJSWj4qIjJKcko+LjG2Dj4+RiZ6ZoqGXlYiWkG2HmINmhZiOk3qIhJCKcJaalKOTkomLmYyCf5CdfZKPkoyZjnuKhYdzcnVrcG51fIp0boaQjpJxdYB8gYKIfGRwbHl8mZN9g4hzkImAc4d4bn98f4V7hIuHg4uUp4x7h3t+i4V3fnFwgYeEZWh5dXVwfGJfcGFrdF5xant5eWxzcGV4XW5sc21yWFtfYGFrW1BXWGVjZ3Fxf4dmXWppZ2JncY1vZGlnZWlpgXp3dW+OhXSBgoN7dYKIhXiFfHiEhXp/iXd/i3t7cniDamtgcGh0gGtyb21yZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqBkJyHk512gquVk46HoY2Wk49/dHx3hXh5f3Nze4Zrc3B6bot3gIGIb3FbWX6RjYiAf393dYGBgKCGkYuTnZihlZh4in+BjYmcnYqPhpKYloWJlZmQl4uLjI2MnImNj4JtiYuQkYqdlqGcl5SFl4dpg6KCZYSciZB+i4OLgXeTmJKfk5GJiZWNf36Pl3yRjY+OmpF8ioCDb3VwbG1vcHuFaXODjpiLcXeAdYKJg3lmcm51gJqOe4eDeZOQeXaHc2+IeoSLeYqFgoeNmqKHe4N1got/d3lubIKFg15zdXNxcHlaX3FhcGtecGp9e3FtbWpsdmBvb2pxbVlZYmFiblhRVFpmZ2N2cISCYl1rbmRiZmuSbmBnZmBoa4F1cnNwi4B1f4OAeHWAi4B5hX93h4Z3g4V8h4x/e3eKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx1dXSAg36klZqtnqaWhY2Df5eUg5CgdoyglJOGi5uNlo6LenJ4dIJwcoV0cXaIbHBudm2Jd4N+gG5uVVGBq5SHgniAd3KDeoKhgpOClZSZnJObeJJ7g4ySpJqTjomVmZKEh5eZjJSLiY+Ph52EkIp8couFiY6InJqfm5WUf5N9aISbhmeFn4eShJGCiXGDkZiQnI+QjIyPjXd7kpF6jouMkZaMfIh8gGt2am5rbGx7f2F6fo6WgnZ6gHiDjHx5ZnNrc4aVi36HhXqTjnB5hG92i3mIi3mHfIGLj52dhHx7doKLfXdwamyChHtheXFubXN0Vl9wYnJhYGxuenFocGZmc3RocWthd2VdV2ZhYHJTUU9cZmVdeXCIfGBcaXJiYmVmkWpfaGVbZ3B+cGxxdIp9dnyFgHV1fox5e4WBeIiDc4aFfoyNhHx5lXhmcmuDYIh+b29remBqbnR/dV90fXmGeHRzhX14oI+ZsJyljoKKf4OaiICMnoCLmpSPhYiYj4+PhHd0d3SAcXCFdHByhHBraXdug259fW51c1JNgt/IktaTe3B1g3WEoIOUd5aSmZyRmXuUc4WQn6GTk5GJk5yUhn+XlomOjYiSjYicf46Bd3qMfomMipybnJuVknmMdWaHkIZrh6KEkYiXg4ZjjJGZj5WLl4yMiotxepSIe46IipKRiXmFfH5se2VzcGtrenlbgHmPj4F6fX5/ho57emdyanKKjomBhYR8lIprfX5tf4t+ioV8g3mAjpSZmYl8dXeDkHhybWdxgIVua3VwaGp1blRfb2VwWmBscnhna2tiZnhycHBjX3dgYFZrX152UE5LYWdjXXpxinVdXGV2YWJlZY9kYWZiWWlzc25rcneMfXR6hoJ1dn6Lc4CGf3uJf3KJiIGRi4h8fph2ZXNufWWIfm5wbIBZbG55eXRhdnt7jXZyd4p3eZ+Lm66bn5CChXeIlX59ip2IhqCRj4WMmISTjoeBdHhweXFvhG9tb39zZWV5cX1ten1qaGtjpJrB3K7woXJsdoR2haOGkm+XkZahlpyBknKGi6OXiY6VipGdloOBlpCGipCAkYqJln6HenV/iXiHhI6cmpiZjo92iXVthYiKfImig5GJnISFXouTl4uPiY+Li4WJbXuWgX2IhYmRj4Z2hX19a31keHVqbnlzV4h6koeFeX6AgYaMf3llcml/iY6JgYJ+i5aEa4F1bYeQgY6DfYF4fo+UkpiPdHJ3h4x1c3FndnqEY3VucWNqd2hSYXFnbFZfb3R6YXJkX2h+cHJuWmNyYGJWbllceE5NTGRnYl53c4luXFxkeV5gZGWFYGNjX1lqcmtua3N3jH50d4SBeHd7iXGDhH1+iHt0i4mIloaMf36Xc2d1cnlsi3tudHGBV3F6dnlyZXd5h4xpdoCJcn+ch5innKOShX1xjJR4eYyehIWhjY58lo2AmYeEe3J3cHRqcIFsaW18dV9heHd7cXV8aGBkfOvatcnD3IdybHSBdoubiY5qmZCQnZaUgYlxhYmgjoWLlYqMmJR8jZOIg4mQe5CLhY+Bf3Z4g4RyiIKTnJaUl4aMdYZ9boOBiIaYoYKTjJ6DiWGDlI+HioaJjYeBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXR3a1qMfJKChX1/g4CEioJ1YXJqh4CPioF+fpGQfG2Ba3eFjoWRgnuAfH6PkY+ViG5weYyGdWtxbHN5gmB1am9da3dgUmVyaWZTYHB2dGFwYF1og3FzaldnaGJpWG1WW3VMS0xlZ19ic3OFalxcZXleXmRne2FkX11Za25lb2p0eIp+c3OBfnt2eodzhYN8f4d2d4qGj5mBjIJ7k3Vsd3Z5eJN0bnh6fVh6hnGAb2d5d5KCZHaGhXCKloWZoZqiiod0b5OLcnePnH6LmomJfKB/hJl/gXhydG5vZHJ/aWZteHhcX3l7e3FxgGphZmF/1baOkaZ4bnF3fHGTkY2Ha5qPiZyTjIZ7aYeLmYeBkpGGh5iOfI2NgYGKjXyPjH2JhHp0eoN7cYaAlpqOk5SBiHWDhXWCf4mRnJ6GlI+ffohif5OHhYiEio2AgINnfZGAfn+CjI+Qfm2CfIJ0a213dXR3dmtjjYGOgIV+fIV/hIl/cF9xb4R7jouBe36Qh3lwg2V5gYmGi4J6g3x+ko2PkYNubnmLfnVtbmtse35kaWxqWW53WlJqc2liUWNzeGxiZV5aaoNuc2JcaF9kbGBuVVtwTkhPZ2VcZ29xgG1aXGNzYFxjbHdkZV1dWmxsY21qc3eHf3FwgHt9dHiGeIWCfICIdXmJgZKWfImGdomBcHh5e4STb258gXdeg390gm1penOUc2dziHxykpGDmp+boIaIdnaVf213lZh+iJCEio2afYyadn52cXBsamF1fGdianV6W2B4fHptcX9lY2dnV52PX3FzlrzEhHdxlIqQf3OYjIedlI2IdGuIj5WAe5SMgYSbjHyKhn18iYx/k4h1iYV2dn2BcXWGgZ6VhpSPgoJxf4dzg3qIlpuXhpONnICIZn2TgoCGg4mJcoJ+Z32Le3l/f4eLj31pgH2DdmZveXhzd3Nsao6FioGKf3iCgYSEgGtdcHd6fYuIhXuAjn99cYBoeIGGioWDd4J6f5aLjot8bWt6iXx2dG9paH13ZV1xY1hwdFNUb3NpYk5odHhmYV5dWG+Ab3RZZWNdam1gcE9ZbFJEVGhiWmxvbXtvWVtebWNaY3B2ZGdcXWBsamNsaXN3gYJxbn57f3R1g3qEgnyChnZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaYF5en5ubXx2lmtqeIR0a5SNhZ6YoJmFiG9+jHZqeZmPf4KKgpWXinqPlm96c3BsamRgdHtpYGZye1thc316Z3B6YWVkjrGyd0tiWqXa0Zdye5KMkXl/loyFmZKNhm9shpKRenmTh4GEmYp8h395eImKhJWAb4qHcXR9e2p5hoOlkYWTjYN/bn6CdYJ3hZmXk4qTj5SFh3B7koR+g4OJg2+BeGiAhXhyf3+Diod8ZXx+hHZjcHOAaHlxb3WZjIaDint2eICEeoJrW298cn+Hg4h9hYh6iHGAbXCChY2DhHGDd3+Yi42Dd21tfYN/dnplaGp+cmFaeFtZcm5OWHJzZmBLbXd1Yl5bW1l1fXJwWGheZmpxX29OV2lSP1lnX1twa2d5cVtbWWtlWWNxeV9oXV5lbGhmbGlxeH+Hb21/fYF1cIF7gIF/g392gYWJl4pxgo1xe4Z8enmElIx1a3p/bG9+dIB9b3J8e5Rwb4B/eWaSioKhmJ2Sg4Vnh4NwZ3qXin6AhYKaioF8jY1peHJra2ZfYW95bV9ib3ldZGyDemFxdl9kZdXrvosyOj6LjoByeYaJj413hZiNf5OPjX9ubYWMjHV9j3+FgpWJfIN4bnaHhYOWd26HhGt1e3VleYOEp4yDj4yDfW1/c3WCeISaj4uPkZKMi4Z+e5KHeICFjYNsgHJpgH54bXx7gYqDeGJ5hIFxZHFofm11cXWBm4uBf4V+c3V9gHKAb1prfHN4iIGKe4Z/fId3eXBrhoKOgolxgHd+lYqKfnRtanaAgHV1XGlpeHFaV35TWnJlTFtzcmZbSnF4cF5bWllcdX91aVliW2dlbmJpTVhmUT1eZl1edmZfdXFbWVVvZFplcXlbaF5gZ21naWtpcHh9jm1qgYR/eW6Ae32Bf4J6dYKBjJOFcICLbnd+gXt7iJOJf2l7fWt0fHKGe3N3fX+MeniEfnxrjIyEm52WjIKAbI1+a2h/j457fn+DlYJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXDVar7V1aoCKfpOGd4eYh3WPjIp4cG2Fg4d0eYl4iX2TiHp+cmd2iH59l29xhn1odnluZXqJhaWHgIeNiX1tfXV+f3uKl4aBk5CXiIuEiXyPiXF8foV8aX5ta4F7eWp6doKHgHJgd4J+cWRyZ3WCbXV7hpSRgX2Bf293eXt0fWxXbX11c4qAhneGdYGJendybYh/jn+DcX17fJGHiHpubWltgoJ1bl1oZnRyUlx8TlxxXE9cc29kVktzeWtYWVhZYHGAdWFdXWBnZGhoZk5aaE5BYWRcYHZhXHVtWFhTdGFbZW9zV2pfYmhrZ21saXB3fJNsaISJfXxwfn58gX+CeneAgImLhHJ7h29xd4R/e4mNj4NqfntueHl3ind9eICCh3+Efn56bYSMiJijjYWEe3aLeWtthYmSeX17gpKAgH2Kg3BycGJmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f76cp6TJuHKFhHOTfXmIlIR0kY2IcnNwhHuDc3WGdIh3lIl5eXBjd4Z5gJJpcoR1Znd2Y2p8hIiegoB/jo99cX5zg3h+kI6Cd5WNlI+Igoh7iYlseXp/dmh6aWx/eXNpenaAg31oYHiIfWpqc2h7gGp2gYyRlH56fX5xe3Z7c31hVXV7cXOIgoF7gnCGiXd3b2+CgYt9fHd8e3SNhIF1aHFobIiCcnBdaGN0b0xmdkxeb1VUWXNuYlFPdHliU1dXXGFwgnNbYV1oZWVjamRRW3FJRGRiXGRxXlx4aFVXVndeXGZuaVZsXmFqZ2Vubmhwd3qTbmmIjHl9cnt+eYKBgnx2fYOIhoNwdoNzbXeCgn6Ji5R/cYB8eHp6gYt0g3h/gYGChHqAdW99iYubnoh+hnt3h3xodYaNkXp/gHyJhoR2j4BncG5fZFxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6nZqceGiLNyinlwjnZ9iJCBepSLgHV0dX53f3Bwf26FdJSGeHRsYHqBeYiOZXGDb2d1blttfYGQk4CBeZGSfXd6bIV0fo+Kg3KVipCOh4WFe3+GbXV2f25od2VtfHZtand2f398YGJ4hnpodXVjfntndYaOjZV8dH91cYB6fGx+WVZyfG90goZ+f3driIZzeGp0f4KCfHl7d3pxin98cmd0ZG2LhG10W2tgdmZJb29MW2NYV1Z4bWJQU3V2WVFVV11gcoRvXGBjbWRjXW9jVF1yR0JmX15maV1ae2NSVlx1W1tna2FWa2BgbmZmbHFocHZ4j3Rrjox1f3Z4fXeBg4F7dH6DiIiDb3GAdXF1foaCiY2Le3d/eIR8fYWHeId8fYF+hYB7fnN2eIuOn42Je4p3dYN6Xn6Hmo15h4R0hoeEd4l6Ym5sW2JbW2FVanRkYFtob3Bnh3FhcWZXXGNrf3zKzoa5omtubottcoVyfoWLf3uShnp5dHp1dXtqbHZjhHaSgnZvZ198gXmLiGVxgGpqcWNYbHuGnImDgnKXlHZ9e22HcICJioZwlo6QiIWLhHt5f3JycH5naHJjbnhxamxxd319el1leoB3aXV5ZoJ2Z3SHi42UfXKGam9+gHhte1xYcH1sc36Je4Ftbol/cHZmdn6AfoB1enB5c4V7eHFlcmBti4Frc1hrX3ldSXBsTldWX1RVfGtiT1R2c1FSVFZdYnSGaVxga2pmYlluYVhjcEdBaF1hZl9cVnxeT1ZlcVlbamhdWGdhX3JmamhxZ3Fzd4d5bpWKdH97d355g4eAdXN/hoWOg3BwfHh3dXmHhoeMhnp8f3WLfn2GhISHf35+fYd/fHh2eXaRk59+jX2LbnWAemSEiJeGc5KKb4WFgnqDdWRuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq56n7duYnSHaXR8cnqEh3t+jYB4eHN3b3t3ZWpvYId1joFzamJefnh4ioJlcH1oa2taVm93i6SBhX9xmZJxf3d0gWx/gY+GcpOHjIeEiYV9eXVzb2l5YWptYW12amdra3l3endbZ358eGVzfm6EdGZ2ho2GlX9vi2ZreoJ0bHRiW256anN6inqBZXSGfW1wZ3R+d3x+cHpqeXqAeHdvZWxhbIl9bG5Wa2F4VkxrbE9ST2lOWX1nYk9VdmxNUVRVXmZ2hGdeYXFoZ2FXaV1ca2lKRWtaYmVXWFV5Wk5XbmpZXWxlXVplY151ZmxlcWZzcHSBeHCZhXZ/f3h/fIWHfXZ0goeAlYNuc3l7e3NzhYeIiIR5gX12j399hImOg4GDe36Lg3t3fHd2mp2XeoqDh2p2fn1shIaUgHKPgnGGgn6CgHBmbGdXXVtcW1NlcGVfWGNydWl2cGRlYldbW2h/cG9yf3OJZWZ6f2p1dnR0hIV4gYV6d3R1bmt6cWJoa2eGdI2DbWZeX3xveol9aG13ZmpkVldzcI6nfYR8dpaQc3tye3lsenqPg3aXfIeGg4eEfXVxc21odV1taV9sdWRnZml6b3tyWWeBd3VocIB4gnZid4WLfJSBbotqbXuAcGVyZV9reGZxdYl6fWF1g3Zpa3F0em94eHJ7ZX1+fnd1bmNlYWyGfG1rVmpjclRMa2xQTE9wSF57ZWFOVnVlS09TV2Brd35mXWdzaWVfV2NXYnFdTEtrWGRiVVRVc1dNWXZlWl9sYFxbY2Vfd2dtYnBpdG9xfnV0mYF3f4B4gH+GhHp9doKDfpiFbnJ0fHt0cYWFj4KAeot1dJCAfYGUjoCFhHx+jIZ6foF2e6OlinmJhoVsdX17dYSDjXpvhXN6hX2ChHVuamllVl1bW1pTY25lW1hidHtqaG1oYGFXX1ppgGlrb39nbGJpe3prdHV1b4aCe4F9dnZuemhqeWpfZW5pgXeQhGdlWGJ3aX6GeW5pb2ZmXVVZcGmPqHeBenyQjnh1b31ucnR4jn53lHSFgoCGiHZqc3ZoaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Afnl3YXaFhHmQhnOIcW95f3FicGhbbXZjcHKHendhcoBvZ2l4c3Frd3Z0dWKCen12dW9jY2JtfHxra1VpYmdUTG5oUEhSbEVheGVhTVRzXkpNVVllbHh7Zl9tcGpkXVZgVW9vV0pTaFhnXlhNVWxUS1x6X1xfa11dW2JlYHpobGFvb3Zub3d1epd9d4CBeYCAh4Z6eXqDfYGThHF0dH56dnSFiJB9gXyQbHOVgXuCn4V/h32AfoaCgIp7doSsn396iIiEbHKCenaBgYJ0bodvfYB0ioBqb25kZFhfWlpaVWJqZ1xaX3WCaV5tbFxhVltca4FlcXR8aWpdbXh3aHV4c26GfH5+enZzbHpoaXhnXWRzaHp3koFjY1Rkb2eBhHZ2ZmhpYVdWWWhkkKhvf3iAi456cG97ZnhueYp6do5xg31/f4ZuZHdzZGlpXWxiXnBvW2dfbXVlemhddIBvcmtxe351dmJ1hYt7iIiAf3dydX5zYHBsWHByYXBwg3tzY3GAa2Bsem9pZ3l3dHBkg3R5eXRxZGFkbXJ+amtUaV5fVUx1Y1FHV2JHY3ZlYUxUcVlLTFhYZ2x2emVlbXFmY1pYXVh3ZlRKXGNYaVhYSFdlUUlieFtdX21bXl1iY16AaWtgb3R4bW9udoOXeXKBgH1/iYyGfnV2hniGjH10dXWCeXp6goyOfX+EiWp0loF7ip19foV5gHt+fIaJc3GProx7e4eQfmZxiHp0fn12cm+GbHt+bZB6Y3BvYmVdZVZaWVdjZmtgXV1zhmlYcG1bXldaXGx7YnF3dWxiW250dWh1d3Juhnl/gXp3b290ZWh0ZVtndWZ2dpJ6YF1TZWZqgoFzfGFjaVxUWF5iZJClaXl0goWQeGxueGZ3bHuDeXSIcoB4fHiAaWZ3bWBoYV9rYF51a1lmXW9vYnplW3d8a25ucHh5dHRlc4OSf4iDiHp2b3F8cWF3Y1pub2BvcIB7cmVxgGRebXVpY2Z4enJsbYB0cnxycWFeZW1ufWVpVGhZWlVOeWBSS1pZSGJ0Y2BKVW5VSkxaVmlscntjbGxzY2FaWlthd1xUS2NdWWpTVkdZYU5IanZYX2FtW1tfYmNdhWloYm54eWxvanaBkHhtgn6AgZKIhIF2dYl0i4Z0cXZ2gnd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OIhHNwmaJ7e3+JlnhkdYl5c3l2a3Rwf2x5fHCRcl5wb2BnYmxUW1pXaWRtZlxccolmUnJtW1lYV2BsdmRqdWppX1tudXJtdHV1a4Z9f4B8d29ubGVpcWNba3JkdHaOc1xXVGRgcX9+cYFcYmNeU1phXGSTn2VycYSDkHNranhsbm95eXpxgHZ/c3p6e2RmdmheY1thaFxed2lXYl5waGF3YVt8dmpqcm94dHN0aHGClYOHf4R1cmpwe2xldldbaWxhcHF/eXNlb35aYG9xYl5pb3xranJ9cW92aW9gW2RrbHthZ1RnVVhSUXdcU1BZUkhjc2JgR1ZsUUlQWlZrbGt8ZW1vcmFbWlhZbHBXU1BmV1dpU1RGWlxPSXN1WGBkbWNYYGFiXYxqZGVtenhrb2l1eYV7a4R9gISZfYKEeX2IbY+GcW92en10goJ9i4+Dgpd0eIKThoGfiXWBf4F0f4Jwh4J1b6KXc3uGjId7ZneLb258cGd4cXtsc3ZzjWtedG5hZ2ZrU15cVmhibGxbXHGMZE5vbVxWV1VmaXRoY3RlZV1acHZvcXZ2emyIfYB9iHeQc2Nla29hXW5tZHN4iGtaVFZiY3d8fHCEXGNfY1RaYFpjl5VjbnCDhIlyamd5bmVydXF6a3l0dW96fnZfZ3NkXF9XYmRZYXVmVl9gbWRhcV1dfnBoaXNxdHF1dmtthZOCiXyFcXFmbntvcG5SWmVpZHByf3VzYmx1VWJxa1tebmR7ZGt0fHFxcWlsX1hkaWp4XmZVZVVWUFVvWFJXVFBIZXJfYUZYa09JWFRWbmlkfGlreGthV1xWW3RkU1JXaFFZZ1RTSFpbUE54d1tfZm1qWmJgX16PbmJna3l2bm5pdnZ+fm2EgH6Gl3t/h4GKfmuTiHJndIB7dYCDfomOf4uTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYx3eG56jWBlfXFnenR5bG1xd4NnZHxtY2ZnaFNgX1VnYGxvXF5ujmhNaWxgVVZTbmZza2Z4ZGVdWnJ2bnN7eXRuiXuBd5x7emxiZWxtXmBvamVxeX9nWlZYX2x4e3pvg19iXmhWWWBYZJyIYmtxgYZ8d2tqdmxbdXBqeWl1cm5ve4BzWGtvX1leV2NkWGVxY1RfYmlhYmxaYH5rZmxzdW9teHZraIWMf4l6iG1wZW97bHFsYlhfZ2ducn9zcl5pbFNlcGRVYm1heGJvdXp0am5ral9YYGZodV1kV2JWU09ZZ1NPXU9PSGVvXWNHWmpOSl9LWG1lX3hobn5kYFVeVF11W1RTYGdOXmJVU0pcWlFadnZdX2ZtaFhjYVtejnFjaGp4cnNtZ3ZzeYNzgoN7iI5+fIqIjnlukIp0bHOCdH9/iIWHkYSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY6NjI2NjY6Pj4+Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZp6bG5tbm5xSSwwMC8vLEmFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIaCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJycnXdlZ2dnZ2s8GBwcHR0YO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHiIiIiIaNkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6Oi4qKioqJiYaCgoKCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkpKRiYeOipCSk5GLko6OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2NjY2NjY2NjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoWOiYmOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiI6NiZGJjJCPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCJjoyJkIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x8fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouLkIiNjImOh4+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2PjI6Ni42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5eXt9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHt7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx7fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eHiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fn5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTk5OUk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOTkY+TkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZGSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSko6QkZGRkpN/hJORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCShHmQkZCSiHOJkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CNcHuQj493doiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo51bIWQh3J4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXhtdY6BdHaGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uIcGJneHNvdYKFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3JcYmlcYmRrZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYGN0bF5qbmdkYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpba3NrYW10bmVZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtlb2taaXN0a1JRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OWGJobW5vcHFuU0xPUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0VDRklWY2ZncW5taGddUU5OTk9PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVFS01NUl9qbWhubW1qaGZjY2NaTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8PkVUXV9jaWxuaW1sbGpqa2pnXk9HRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7OztHVl9ucHFrbWtqaW1nWElFRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs8PVFlcXJzb2xoWEVAP0NGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5OTxLbntxVkE4Ojw9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT09PDtKbGU5Ojs9PT4/QEFAPz9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APFxuQD5ERT8/QTpGXz4+PTs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT1BPEtkPTw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw8PUlNRkZ1d003ODg6Oz4+V2pBOzw8Ojo7Pj8/PT05Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/enx3Vzw9Pz09PkZodEw6PT4/PT0/QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoOEg4ODgH1ePkBDQEE9SnJ7WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2Fdk1BQ0VAPz5Ze4BdP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhGSEZRbm5wcXJ1dnl7e3t6fH1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIpsQUFWdIeJh4eHiINXSExNTE1OTElHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbISHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpUgYOEhIKChYaGhIKGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhLTUxHSUpNTU5NSkpLS0pMTFNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1NTc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouMiVQ6ODY1Njc2NjY1Njc3MzU2ODo4NzY1NjU2NzY3Njg6Njc4ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGUFNSU1NST1BQUlRlcXFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/f35/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JlhYOBgIGDg4ODg4WJi4qJiYqKioqLiYqKgUc1NjY0Njg4NzQ1Nzg1Njc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc3Nzk6OTg4Nzg2ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn9/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDg4SEhIWGiYqKiIeIiIiKioyKiYmMej48Ojg7PD0+OTo6Ozg6Ozk6Ozo6OTs6OT09PT47Ozw9Oj07OTs7PDs8PDk6PDg6Ojo6OTk5PD88PEFCRElKTEtJS0xXb3JzdXN1eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMb08+PkJERUVCQUBCP0BCQUA+PT4+QD8/P0A/Pz09P0I/QUE/QD89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t9fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4mMYz5ERkpMSkpGR0hFRkdHRUJBQENFQ0NBQkNCP0BESERDRUNFRUFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqHVkhNTU5MT0pKS0lJSkpJRUNERkdGRENFRkRCSElLSEhHRkhHRUpJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtBQkJBOTg8Pjs8Oz5AP0E+QkJHR0pZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjYyLiox/UE5QT01PTEpMSklJSEpGREZISElFRUhGRkVMTE1JSkdGSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7PD06PkA+P0BDRklKUV+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjIuLio1yTlNRT05NTE1KSEdFSUlFSkhHSkpJSkdHR0tMTkxNSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4tgVFRST09OS0pIRkJHSkdMSkZLT0xLSkpLTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRkZIRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIuLjn1ZWFRUVVRPTUtKREVGS09OT1dVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLjGlZV2thRlRRUVBJOztSU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl4ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh21cZVU6WVlYU1E/QFZVWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd5eXp7ent8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3lvcFlbXFtSVFJWVlRbWnWDWVV9kGFdWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeEin5nWVlcWVRWVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbU1NRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2AfFxRVlhVUlVSUVFMT01LZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW5xVkpMTk9LTUtISkRFSUVDPlRkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3t9e319fX59fX1+fX5/f39/f39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11MRD9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZORkRFRklHSENESEdIS0dEQkFEQE9RTVJkcnR2dXN0dXp8e3t7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT09MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn+DgIODgoCCgIKBgmtNRz9AOzs+QEA/Pz5rUEthRUZISUVCP0dMTkdNUVVJQUU/Pzw9PD09Pz0/QUNDQD88PUI+Sk5HVW50dHVzdHZ4enx7fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOTExRUlFUVlRXUlFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQkJEQlxdT3tOT05OS0xNT09RTEtNV01IR0BBPDk3NzU5OT07Ozs4OTg5PzxCSD9cc3R1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aWE1MVFRTUFFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdYWGhza11WYXNrYmFfXmRhX15ZVFFOTk5MSUhKTElJRkNRUFNbV1RUTlFTWVNcZVVPU1NRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTlHbXF0d3h5e3t8fX19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcG5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTk1KRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz49Ojc4NzY1OTk2NzY2NVdwcHN3eXp7fH1+fX58fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlSVU9KR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMS09SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR1eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRkZISk1MRUdDT1JDOEVOU11nU1BTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7PkA+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFFSYVxRUFJPU09PUExMT01MTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZFP0JDPjxCRz9CP0FkcHN3enp7e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk3Nzk/Qj47P0JAQD5BREpFQ0dHSUZJRUJCPz49Q0JBR0lFTk9iZVFNT05XS0xNS0xNTU1MS09OU2ROSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7ent6d3R4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ2clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxAQkFBREVHSkZDSElHR0hDQz9CPz9AQT5ERUNMTlJUTEpJTVRHSUlKTEpLTElKTE1PUFJQS0dDTEdDQkpJTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktER0I9Pj06OTo7QUI/PUJCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQENFRElNUEhIS0dIS0RISUxNSEpMSElKTEtNXVJISERORkFESkpNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3p5fHp9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjtAQ0A+QkNFRUlFSUpMRklJR0ZGREI7QUNDPkBDQ0NER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQ0dNS01MT01NTk1LSEhJT1JRUk5SZmZmcW9zeHV7enxsaGpvZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NCRUBEQT4/Pjo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1ERUI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIUEtESU1LT01PTk9QTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPUJBPkE9Ojo9Pzo9PkBCPkBCREdKRUlGSUhGRkdFQ0JBQUZGQ0JCQkRFRUdHSUZMUUxJT0pKTExJR0hFR0ZEQ0lJSEtKR0tSTUJOT01RTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREQ8QUBAQzw4OT0+OT88P0JAQEBERkhFSUZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFSUFFRTlBNTlBNTE1TV1ZYV1VYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRDw/QkJEPDc6Pj46PjpAQj4/P0JFRkRHREVIRkRFRERFRkdKRUVKR0NHSEZIR0VDRkpKR01LTEtISkxGSUlLSEVLS0xMTk9SVFBIU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkU9OTo+Pj08PEFCPD8+QUJGQ0VDQ0hFQ0VFRkdHR0lGR0tIREhIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT09PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZDRUVESUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTUxMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1JSUFZbW11eW1xeX19hYGFkXWNgZWZgZWhqY3NzZmpnZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SkpMSkxHQ0VERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZJRklGRkVJSUdJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdESElHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luaGNpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUVDSUpKSUlLR0VLSkdISklJS0hKSk5MTktJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVKRUVKTU1LTExHR01JR0pLSEtLSUtLTkxOTExMSUxNTFtzYmRwXmxtVU1OZnNdZ2ZxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1KcXl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydnRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdCRkNGRUZFRENISEdERUtIR0xNTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTk1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUtJSktPUE9OTUxOTkxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRqdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNHREhHTEhFQ0NIS0hIRkpMTEZOTExTUkxHTE1ITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnRzdnNIS0hJQkVFRUFAPkREQkdESElNSUZDRkpMSUdGSk1MRU9KS1dSS0dLS0pOSUlKTElLSklISk1NTU1JS0tLU2tjW2leX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4dHVucXVud3FydnR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEtKS0tJSElHS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVtdWF1cXGNmYWFlYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQERIREZHQ0lLTEhGREdLTEhER0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT0xJUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHh5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRENCRUlFR0dGS0pLSEVGSUpLRkVISFBKTU1KTVJJSEVBSEZKSUtMSk1KSEZESUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmJhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNHSEZIR0hLSUlJREdLS0tFRklKTktOTEhMTkdIRT5HR0xJS0xLS0tJR0RJRENERUJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVpQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZKR0hHSUtJTERES0pNTUxMSEpKSEpGP0dHTktLS01LS0tJRkdDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHRklGRkZJTEpORkRLS0xOSkxJS0pISUZCSElRTUxLT0xKS0lHR0VEP0VDSEhBQkdHRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYVhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhISFhYWFhISFg4SFh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTEhJR0RIS1FOTUxQTExKS0hJQ0RBRURIR0JBR0VEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV19fVFBPT09XUVxbW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxMTE1LSkpHRUpOUVFOT09NTkxNSEtBREFDREZEQ0JFRkJNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NT1RSWlhYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxHR1hNSEhKSEdNTFFRSExLS0tOTVVOT0tLS0dHS1BTU05QT05PTk5HS0ZgRURfTEVmZEVNW0leW3JtT01VbVlMRFBgVWtXZ0pdWFVeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYmJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgYOEhIWFgYSFgYODf356e0xJRkdGSEVFS09TSUpGYFRISU9KSU9NUlFLTUxMT1JVUk9PSUtNR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXF0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1tmW19gYWFhXWBiZ21wbGBwd3R4gYGCg4OCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEdJTEVRVkxLTklLUlhXUU1PT01RVE5PUVBLS05HTVBTW1pTUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b354boByX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpLR0pQT01NSk5WXllVTFFTTllaTVNTUk5LT0hRUlNZV1ZQVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anV1cIFgcmZ9aWx4fG9eX19iYVtdY2RnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J2eX6Bc3V6bnx9eXdybk5KU3VOQ0JGUFBISktJS1BPT09NUFpgWldLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpMcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txbm1qcGFjZmNvd3hvbXBzeX5ucXBqe3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbGB2dWtpdXt7bX54a3xwXF5fYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PR0tLSUpISFFQTE5PTEtSUlJPU1JXUlZUUFdbVlZUVFRhX1BOTUtUU1RRVVZOTkxNT1BKSFFOUFVMS0xTVFNTVFBWVVFRTlFRWFlSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1hYUl5ZV15WVFBZUldXV1dYXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xNTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09LTVZUUU5VU05PTUxRUEtKUlFLUU1LS1BSVVNRUlNTSUhMTk9RUlFRUVRWUlhXXFdTU1BSVFVWU1pRTlNSWFZUWVZUWlZUUlVUVFVXWFZdWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLS09PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTE9VU05RTk1OUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11gYV5bYmJjZ2ZlZGJYX2FiXWBnZGZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQTE1MUFFMT1RPT1NRT1FbWlhXWFtZWFlWXGpkVlhZWldWU1NPSk5WVFBPVFBQUE5MUVFQUlhUUVFPTU9TVk9XUlRVVU9OTVFTVlVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUV1ZWVllUWFhWU1JZV1ZaXlldX15VXlxeYFxbX19fX1piYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xYWltkcW1oZF9bWVZVV1FMTVZTTU5ST1FST0xQU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpYV1xeWl5fYFVhXGFhXWBiX11gXWNgY2doZGZgWWNgYV9fZWRfYGNbWlxbXFlaWVhXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXFxcWF5cXlZcXmpxd3mAY1xbVVVYUU1PVlNOUVFQUlRSS1FUVFlaV1VPUk9TWFdUU1VSUlpPUFNSVltWVldTVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVVNTXVhaXV5cYGBgVmFbY2JdYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRTlJaU1JRVFJUVVRLUlZWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxVVFdeWV1dYF1iYl5ZX1tlYV9kZF5eY2NhXmVmaWRmXV1kYWBgYWJkYGJeWFpfW1xbWFhYV1dbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFtUVVZWVFRUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVVFRU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVlZX1taVFVWWllaV1haXFZVWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXFVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhYWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSV1NXVlVTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWVRZWlphWVxWV1hbWltZWVpbWFZdX2BfY2JhZGRdYlxgZmFkZmReX2RiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRZVlNcVFZXWVZWXGBhYmNhY15fVltgZGFfenVvaFlcWlVXVFdbWllcWVhZYFdQVl5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1ldXlleVVNZV1lZXWJaXlZXW1xbXFtbWltZWV9fYGBkY2NkZWJkWWFmY2ZmZV5hYmBjXmJjaWRjZ19nXmFiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNPVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW11bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllQV1ZXV1dWU1VUWFxcXmBgXWBcV2FeW15cW15YVlhYW1tfYFxfWFlcXF1eXlxbXVhbYGFeYGVjZGVlZmJYY2VkaGdkXmNgYGVjXWVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWlhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXlldXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2NfY15hZmRaaWljZmljZV5iYmNhYGBfXV1aWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVddW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW11fXWBfXVtgZF1cWFpiZWNhUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlUWF1eX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaWJoaWVkYGJhY2FfYF9dXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiY2JcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1cWltbY2BiYmNgYmRhYGNeYFxeXl5aWFZbX15dYWFgXltgYWJlY19dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxbW1ZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WDgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8ent7e3t6enp7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKgkU+Pz8/Pzubw76/vr7BooqMjIyMjYl+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzLqHSzMzMzM+qjZCQkJCSi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eXh4eHh3d3d3d3d3eHl5eXp5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1foOCgoKCgoB8fH19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dXV5dnZ2ent4e3h3dnd6d3l5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx6eXl5eXl6enx7e3x8e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH15e3t5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgYKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3e3l5e3h8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d7eXp7d3x5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6d3t5enx5fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4enl5enl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mFg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhYWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEgoOFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbW1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoKBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dwcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJyc3NycnFwcnVwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcnd0cXJycW6Jhm5wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHJwhZNycXFve55+bnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF3o5BwcXGVn31vcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnOcqIFve6KefnBxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZSrm3CDo59+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h3eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3Nyk7Gqi5WmnXtzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHh4eHypr6Oxra+ffHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx8fHx7j6uZobSkn6mIent6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2ZoZWjr5+co5p+f399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgZmbiZiwoZ2dnYOAgYB/f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYF/l6SdlKObmZGdiHt9fn6Afn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f3+Afoaor6aemZ2fpqmmj4WBf3+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KFho2aq6+gm6Odn56ipKqrpZ+Uh4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEg4aMn6upoJmZop2enp+dnqGgmpCGg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoKGj5KUlZecnJ6fnpmYk42IhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5GPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGAg4iQlZSQl52akYqGh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDgoOMm4eQlIqEgoOFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKCgYGIh42DgoOCgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf3+JkYCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/gIyVgoKBgoSCgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChISDgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgZCMg4F/fn18fYycjoCCgYGCgoWUlIyBgoGCg4OCgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX17gZiMgIOBgYGAj5SMkIGCgYKCgoGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGVn4p+foB9h4t+hISDhIKDg4KOiYWMgoKDgoKCgoODg4KDg4OCgoKDg4OCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf359fYCChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMi4iFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhYWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFhoaGhYWFhoaHh4aGhYaFhYaHh4eIhoeHhoaGh4aHhoaHh4eGhoWEg4SFhYaFhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYSDhIWGhoWFhYaGhoeHhYaHhoeGh4eHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmLi4qKiIeHiIiJh4eIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgIWEgoKCgoKCgoB/fn19fX1+fnx7fIOHiYuLioqJiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJh4eGiIeHiYmDg4SDhYSEhYWHiIiGhYODgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoKChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOIiIaEg4KCg4SGhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjZCMiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYaHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GDg4ODg4KCgH19f4CAgX99fn59fH19e3p6gZCEhIKBgYCBgIKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goODgoOCg4J+fX5/gICBgH59fX19fn18enl8g4KCgX9/f39+f4CAfn2Af36AgIF/gICBf3+AgYF+fX1/gIGAf36AgICAgICAgH+AgoCAgoGBg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4KCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gICAf39/fn59f39+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af39/fn+AgX+Afn9/f4B/fn+Af4WSko+Oj4yLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gIB/f35/f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f3+AgH59gH9/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh9gYCAgYGBgICAf3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fXt6enl5eXqBgoKChYOBgoOBgIKAgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoaEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl4eH2Dg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX+BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDg4ODgoODgoKCgoODgoKRkIuIiYeJh4aGhIaGhYSEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl5fIGBfoiWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYSDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CAgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6e3x/gYOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WFhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gHp5ent8eXl9fX+Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4WFhYWDg4OEgoGCg4KDg4KBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9fH5+fn9+fn19fXx/gYB9ho+BfX2Cfn9+gIJ8fIB/goCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMjI6OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3p6fIKAgX9/gX1/fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYODgIGBfoB+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn9+f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36MhIGHfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjYyPjYyKhoSFhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen5+fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8ent6fX+AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx+gIKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISDgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fH18fH18fX57fHt8fHx8fXx9fH18fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko+MiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx8fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgX9+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiYyRkI6KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3t5enp4eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+gpGEhIOBf359fI2HfX1+fX18fn58fX18fX1+fn1+f3x9fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiPjouLh4WEhISCgYKCgoKBgYGBgoKCgYKCgYKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Afnx9fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY6LjIiFhYWEhIKCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOBgICBg4F/gIGEgX5+gH9+foB+fX5+gIF/gX9/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx7fHt7e3x7fHx9fXyKi4mIhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKDg4SDhYaDgoF/f4CDgYCAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+foJ9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+fn+AfX6AfX19foB/f4GAgYGAgICBgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH+AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhISDgYB/gH+AgX59fX5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn59f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OEhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4GDgoOAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhIKEhIWEhIOBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgIGBgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgIF/f4GCgYB/fn+Bfn+AgoKAgYOChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx+gICAf39/f3yAf3+BgIGAgH98gH9+f36Af31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgICAgICAfIB+gIB/gYCAf32Bf35/f39+fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDg4ODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgICAgIB8f3+Afn+BgH9/foF/fn9/fn19fH+AgICAfn9+fn99fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYl9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/foCAgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKAgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh6gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgYGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9+f3+Af4B/gIB/gIGBgICAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fHh4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKDgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgYGAf4CAf4CHfn58e318e31/eHd2eXl6e318fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGBgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f317fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYSBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOCf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDgoOEgYSDgYOAgYOCgoKCgoGCgH+BgICCgYKBgYKCgYCBgYGCgoKDgH6Bg4F/gIGEhIGDf4KCgYOBgoKBg4ODhICChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoGCf4GAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7fYF+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKAgoKDhIKCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn+DgYKEhIKEg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEhIODgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fn1+fX1+fn9/gHx9gIGCgoODhYOEg4aEgYKIh4WEg4KEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4KBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f35/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSFhISFhIWEhIOEg4GCgoODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeoR/f39+hISCg4KCgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYR+g4N9gX1+f31+goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fn9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fH99f39+fYCBg4OAgoOBgYSCgX+BgoB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fXx/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SDhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9eIWDhISDgoF+f357fHt+e3x8fX9/fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISGhIaGhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoeFhISFhYOEh4aDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFhoeFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIh4iGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeHh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfX98fX1+fXt+fXx9eXp6eXt8fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SFhoaFhYaCg4OFgICBgICDgIOAfIGAfn6CgH2Af4J9gHx9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoWGhoOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1+f4J8fX9+fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFg4ODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NTU09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2djX19fX19fX19bW1tbW19rb2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6axvr29vb29vb28vLy8vbSLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIaEhISEhISEhISEhISClayqqqqqqqqqqampqaybVFNTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PEJAODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKJh4eHh4eHh4eHh4eHhZetq6urq6urq6uqqqqtnVlYWFdXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjYucsa+vr6+vr6+vr6+vsaFjYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/O0NPS0tLS0tLS0tLS09PRzM3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/Q1NLPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1tbW1tbW1tfW1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/RyJSn0tHHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZu00ZqsnLDRmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6Cqr82TiJyexJKGnZzNz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrHXvcmYmMW8yZeZxdDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5mx1dKUlp/O0ZKZoc/Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P1aWZsdmwn8Ob2q2jv57V0dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NalmbLWzYqSnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpZqz1s3bpZmz0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0Y/SEhHRUA8PD4+PD09PDc1Njk5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1qaatM2Op5qgrZCnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQzs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0telm7S8o6WooK+noqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HUtYLE1Z2SjbrVmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHD1NPTucfV09O5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT03NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6Njk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKenJ+hoJiSkY+Ul5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaanpqWjoKChoZ+ZkpWkmpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOlpKWlpaSko6KhoZ2cmpapqp2bmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqako6SkpKKhoZ6bmpmqfX6cmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKCxtaSgoqGgnpybmpqil1CDnJucmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaChp5Kxop+fnpyZmZqbqmJMh52dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCgn6qBfa6ioJ6bmZqap4xOU4qfnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6il1mJrZ6cmZucnatqVVWKnp2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZybnaJtY56gmZmcnaGaaWBYjKCcnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmZuic2l/opibnJyji2pfWIagnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyZmJmZqXVwaouXnJ2dm3xoX1yHoZ2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZiZmKN7bGtvh5ycnpRwZVtfiqGen56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmfiYuSdH6coKOReGVVYJChn6Cfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmaoKacjWyIsaekeIqGY2GXnJuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qalqWgiHhba6eWllt0gXx2lJKNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkJKoj2tUUHKciotOXXR4gIiHgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg3+TqHo7Lzx4j3p5RzpTb3WBgIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5/nplPT1Q/e4RuZk47NVBwen6Fjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCBgKR1U4F4UHyViXlSaHxSXHWEio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY2fYY3WwF+mr6SmcHGKf1ZohouJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KjkWW/0K2V27emwLFUXndpVYSQi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mqsoFzs6+d0cWimKytcWrFh1B7n6KknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKyNfpOEisjOsLOqknRGrrFbcJ2pp6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxkY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaanaSlo6KloYyDb5ixo56ch4F0Y3qMdW2UpKKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioKOnoaaupqacqJ2Ba1GMkoB+gnZ0b3BzdH6AkKOhoZ+enaCjmpaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq6sq6mDcF9Ib3VucXZraWVoZmdxdn6KlqGkpZ+gopmVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7Wztrq9u6+UamNXSFxrZmpxZ2NjZVpaYWJrdXp+iJSdo6acnaCalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3vsXN0MfAtaaTd15dU0dcdGtqcWVgY2laWF5ZXmVucHF0eIWYpq6npZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW80Nzg2cq7r6CReWNcXlNBX2xqcXdnYl5nXlVcXFtbXmVkYmNuibLJwrmhp6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PEwM7X2M66o498b11WWFhMPV5iaHRybWJhZltXV1hYVlhYXXGSsMXLuri3qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrrEwMfP0semhV1PS09TTD1WV2hiYHFoYV9YWldYVlReh7HEvbO0tqq1sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudXJydXFnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8PGxsG2ncezjFxTVlBDVlNcYWZwZVhbWl5YWWeQr7+6tqapqamqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbDxMS5tL+5u8queV1QTld8dJCXllVUWFdZYYGwt6mrsrSsrqWlo6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpaHZaZnJ4c3lmZl5kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvre9w8OyfVZMcHeXpZ1OUVNbdKC1t7KtrLi1s6ypo6GtqaynrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXmpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMe/xMfDx8iwgGBYkaaSSExtl7PCvL65vLq8urysraapu7q5t7+ytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aWpqdG55bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXFwsXFzdDHk4uoi0VtucXJzcbFwcTHwby+tLGwsMK+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZnVvdGNdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwcHAwcXGyc6xjF5pxNDHy8/Ftr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2tkYmttbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzBwb/AyZM/lNLMxcjRwa+9vbi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFjY2RqY2djW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8yc7Bu7/AvLvEvbrAxL+9vLi7wMWrSJXMxMDAyb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnamVqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdSNur+7w7W6x7e2ubu8uLm1usPJqUyPyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmcGplbGhYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/EeKrLvce3ubittrS3ubO1srrFyZxNhMq/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucWdxa3RmYm5gXFRIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrnWCvMjPwsC4rrW1u723ubG+w8eRVH/Nw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudW94Y2hiXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0plydK7R0czKxLW6v8TIvr60vsC/f2F2y8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGxsbl9jX2FiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysGGc3SmzMzLzcrGwsPLzsG8uLy6sHhxabvIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWNbX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqrK2w8CleXd6nMTGy8jBw8DAycrBv7u5sqKKf3WuyMXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEt22tzr22ucC8qn1uaG5tcoGWmHR4fZm9v8bAucC8vsXEvb24sa6gn4yOncrCw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBgWlNQQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbJ1gbO9trXBpIZpWl5gTVJbW290eIOiuLjCurO7t7u9v7q7u66ioqaXn4C+xMO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d29xYV9mXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmmhHiKoK+1nGpmZ1ZZYElJTVBUbXiIp7C3vrmytbK8uby2ub61laW1pa12rcnEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/GqYh8doyhmF9TQ1hVR2FqVk9FSmGOoq2vtrq1tLKsvLm4tbjBvYueuauudabLwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXVNPTkE+SkJASkpANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7SQgnmIkG5OSz9kWUJOd4CUaU1BXYOwtbO1srSvrLu6uLa5v8Z2h7CknGapv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211amxdXGtVXlxQTkhER01CRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHxYRkFPh1lKSlh3jYFiQFOjubO0srCxrbC5uLa7t7u8kaOzraR0rLCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWh1dG5lVWFkV11ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZRoTT9SeHFQSUlLaJyAWkVSrruxrLOvrqyttraytLWuqaefmpudn6aonqCoqZ+hp5ablpeOnZSPkJaNl5ukqKCgoqKhpaWco6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjeG1uXVFpVVBPR1BNTUNQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3CqqW9aERSnYJRV0lKYEpVjWFkY4GutaqytK6qq6+wsrOtpZ2Rl5OPl6CfoqCco6SfnqiUm5aWjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ta3tkaFZSZE5KSEdPU05LTkg8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCqxr/KoFBBc512T21KS2NmdHNgXGBykLGvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanq6KfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpquqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl6YGJTVWFISUpLU1RKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMbGjFdTSmWkWmV9b3JbUWtjW2VhXmuPtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qXmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbGZbU1paTVFLT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlxdnVwY3Z2WFdjYGNoWllXZ62urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgH14dmp4dV1tW1JhSVJVSEZVV0pDTUc9S0k4RTw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjgG+CcGBjWExbUlpMS1BYUkhNTUeYrKqppJ+fmZKSlJiYlpaWjIiLjpWdnJ2dnpeemaafoKilsaqnrqOrrrawtbKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21pbVxYXENXTkpHTUhDRk49Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOenYpiV15lYFdNUUc9Pj9DQz8+QlF4qa2pqqWfnp+io52enZqdm5STlZSenZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyb+wubm9ucK+uLS7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqGjsLGusKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFFGRDtDPkY8Pzk2Tn6qs6ejo6KgnqWrpp6XnJSRmp6ZlYyKhoiGeG2IoKSiq6y0vLbDvb6zu8HDwsXAv8LGxcXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8rJw8HHv7q0uru1u7ewtrKqurKuvLi/u7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGplWltGTE1FRFRNRUNFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV05FPklZfG9hQj1cjq6soJmbm56emZeXl5KNj5eXlI+NkIyCg4J3cnFtcI+mra60ucW7zcfLvsHMzc3MyMjQzMzMx8rFxszQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsbGysjPwMnRzcfGyMbCvMTBvr+/tr6zrb/Aw8PHxMfEr7+5sri9xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXRzZWJncm9mXlpaRE9NREVQSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ2VamZdVElEQD9KhZ6kmYOgsq2jnpyfmpiXlJKUlpGQj4yHhISIhoOAgYGAeXFyb2x5pLa6ub7LwdPR08jNztHT0dLQ0NHRzc7P0MXN1NXY0dfNxsfJzMPFys/K09fR19LV1tPUyMzGzM3J083O083GycrKwsbMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZFZXUkRORkBJUUM+Qj06MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2JUTEpEQz9DUq/RvbKvppycnKCkoZ2alJOVlIl9eHFrZWJocnBye4WKgHVwbnFzcIWzw77F0dDX1tXS1s3U1tbU09HS09TSz9LD0NPW2NXV0svKztHLxs3RytLV1tnW2NPW2M3Sys/RzM/RzNPQwMnIysTMzMzPz8XHyLbAy8DSzczQxsrJwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYGVyY11SXElLR0FFSUo+O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFaSUBBREFGUXaxr6aalJefnJqgoJ6bnJqViXdpY2FfX19fXl9fXWFsdXNwcG9scXF1ksTIx9TW19fW09bQ1dTZ1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ2NfY0djS19nU1szPz8nN0svO0cDGw8jGz87R0dLIzM3Ay83G1M/Mz8jEy8fHyMzL1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYmNpbV9WUWBKSkNFQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6upqqooaOrZkM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cWVjYl9fYV9eYWBeYWBfYGVtcHBua29ydneczMHT1dPY2NbZ0dLS18/TzsvSzdXU0crPzNPW0tHWzc/V1dHF0dTK0NTV1s7T0djX19fLyM7Eyc/MyszAysDJys7Oz8vQzs7Mz8/IzNDQy87Lw8rHyc3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxaSkZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXtIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBhYF5fX15cYm1yb29zdHV2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3N1MvO0s3L19bQzNHUy8vQ0tPKztHV0tXVysDKwcbNwsjKw8zExsjLy8/Kzs3QztTMxsnPzcnHy8XHwsbKzM3Q0sfQz87OzNDFx8G4ub3Dw73DubOyvrG7w8S1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElQUUI7Qz47Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYGBgYGFhX19dW11ncnJwcnNwbXJ5pcfTz8vQ0NPUycTIycXGv8PFz87HxcfNytHIy87NxtHS0M7M1MrHys7Px8fP0svQz8W6xL/Gyr3DyMnOxcPHwMfNyMTMyszPyMTE0MnGwsbJxb/Bx8zLzM/Cy8zJx8vQxcXHu8fDycnCz8G9vL+wwcnHubyqsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KFoqqTjY2Wj4WDg4OBfYSEfnNfW15dXmBeYGNkY19dXV5fYGBfW1pcYGxycW5va2xvb3250cjJys/LzcS6v8O6u7q5vcjGwsPAw8jKyMjKyMHFzMbIys3JxMHKycHBy9DFy8i/ucG8xse+wMbPy8TAw7vJx8m8ycfFysG+wsvGxcS+xr29wcPFzMXGvMDJw8XH0sTByb/KysbIxtHDw8bDrsTLx8TKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdCR0VMREZTQDU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bF55fJ+RipKWhnqAhYV/dXh1cnBfWltdYGBiY2RkZWRgXFxeXV5eYFtZWlxib3Jua2lrcG9zj8e9ycXLwMbBsLa5sbGzsrHCvLy8urjAwcHEvr25vb+5xMrFxsK9xsC3u8PJv8HJu7a7usbDv7zCzsPGvr61wb3Du73HvMO6tL3GxMLDt8C2tr6/u8zDvba6yLu/vsvDwcbDxsnHycbQxsLMx7LHycPOzMHFw7+9srewsqeoqLmwpa2wqq2slHp2eGtlaGBob2RWXllKRkpGSEtBRkJGSUA5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys7FycXHwbrFvayupmBjdYGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvcvBw7rAuK2wsKapraumuLS2tLOzs7u2vbG3sLSusrvCvMHEvL+6tLK6vsC4yLi0vLbBwr24vcfBxLu1r7K1ur+0xbi7tay5vb7AvbG7trC3urPGvLevu7+1t7XFvL/DxsDExcbHy8XAxsa7x8vAzsnHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJlbZ2+JjoaIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXltdXlpbW11fbHBuaWZqbW5yfKTGv7i4tK+qq6eeoammnqqssq2qrKm0rbaxs6mup6yzu7q2w7m6ubCrtLm7tMK5r8Cxvry7trzHucO3raqosLLAtri9sLGosbO1u7ysrramrrauu7KxqrmwrruuvLi8wMC+usO/xsPFwLzGwsjLuMXHxb/HxMO6xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMS01KRUFDQEZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzBurO1tcOuqrCSW2l+koiOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNiY2RiYF9eWltaWl1aWllaXGVub2hmZ2lrbnKBrbqwta2lo6ammZ+kn5mbpKqupKiiq6qsqrCjpp+qrbW2sby4r7evqK64tLS8uLO8r7i5tbK8wbLBr6Wpo6uxsrOovaqrqKutrrW0pqitoaSvqbKmqKiupai3rLGzt7q6u7K8vr6+xL+1wcHHyLe+wMW3xcPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz83Dx7m5y8LLvrvJtr3DvrrKt8HDwbS2vLaxr7W8ramrkmNtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZGZlaGtvcoWppauknZugo5Oco5qXkKCiqaOin6Wmp6atoJ2bpKassq+3t6ewrKiqtKu0urG2tq62ubKwurqxt6SgpKCmsaisqbqqpaenqKezraCop5+cpKasn5+npKChsa2trLK1s7Sxtb22u8HAsru+w8GxubnCs8G9wLW4vL2+vMLHxMPEv8DEoIR4cWxiZmBrb2BUWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wLq9taCelJ2hprq2q7Ozu7PEz8nLwsa4t8fAzL+4yre7xbizxbizv8CstbyyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV9kY2NmZ2dna21uh52onpSUmZ+UmaGXlYudoKGmnJ+fpKWip56bopufq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+korKlpqq5raKmpqCorauZoKCemZ2fpZqao5ycnrCprKiqrK2tsLO5r7i5urC2vLu6q7OzubO9tLexsba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4t7+3ssK0sbu7rLm6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXWJkZGZmZmhpa3KMp5uRkpKZlZmflJWPm6GhqJ6bnaWmoqWboKGama+ura+yoaWjrquoorWwsrKsqa+zp7qzpraho5+co6Gto6Kqtqujo6aepqajlpmdl5mbnaCal52cnZytoayoo6SmrauztKq1sLKrs7m0r6uvsrKzuLOuqa2usrewura6vcC4s7GUhnl1Zl9mX1tZVlNaVUtbUUxKRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxwrW2va20uMHMyMa/xbbBwMfOtsDDvbO5ubK/trG5u62ytK+fmqOqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCakZGOkpSVnZWXk5afnaCclqGhqKSfn6mdm5urpq+wq5yjpLipoKCvqLerp6etsKS3sKS3oKOcmZmqpqGbrbmwo6GknKKgn5OUoZSWlpuZmJaXnJWfqZ6qpKKdo6qqsa2otKyqp62zsKWrrrOxsLCvr6eoqLKusbSwvLS6uK6jlYJ6dmVfYVdZWFNSVEtNXkxQTEdITEtFPUA+PUI8Ojc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjY2JjYmJjZmmAk4+Sio+RkpiWm5OUmp+bnpWfn6empKeooJ2fpqCrr6agoqO3qKGhoqmzoqWopbCmsa6stZ6hnZaVqaGilK2xsZ+jo56emJuTi6GUkZOYmJOXmJiXnqebqKGimqSlpaukpbCnpaOrrK2mqa6vr6uoqqqzpqarr7Sxrry2sbCvoJJ7eHNlYlxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLuxt6yepaast7u8wcW6sbm1xMnJwMPGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVJUUlVgYV9gYV9gYGJkaX+Pj4eOi5GPkZqSk5WjmaCWnKCloa2mpaWkpKOdqqulmp+lsaqhoZ6lqp6oop+urKqpra2ioqKVl6KanJCrqbCcn6Kfn5eYk4mekY2Sk5aQmJiTnKGjnKShopWgoqSlm6OrpaKjq6SrraWusqqmpaamtKaqqK2ztbS5urCrrJ6Mc3FwYFtXVlZSRlBPSFpcT1JKVEtTTEVHSkQ4Ozs+PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByczItcm8sb3Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5RWV1cXV1eXl9fYmRtioyBjoONjYyXkZKRnJqhnJugqKmrqKynqaakmaWvpJWZpa+poJyZm6Cerpqcq7Sgpqafo6ShlJOblpaSqaqtm52goaGblJCMmY6MkYySjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrimo6SjrK2pqKuvtLeyvbWzq6+YhXV0aVtYWVJVUkVYTFFbWE1VT1FMUVJJTkpCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7Px7PEure7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FZWlpaXVxcXV9gZHyJf4h8iY2HkIuVj5aYoZ+aoKuqpq+sqLClqZqfraGVlqSop52YkI+anq+XmaeqmaCdlKWhn5KRkpGTlairpZqZmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9qKCjrLSqrqewtLC5tcCxrrGrkH5ydGNWVFZOUkpHVlBSUkxMWE5KTE9SR01LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqaepsrCktsa0ubqzysW5usHL0Mqytri8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5yam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRSTk5OUldYWllZWFxcXWFqfXd8coWLhI6HlYiTkpeamJ6om5+rpqasnqiZoKack4+fo5qXl4aFkpukkJWjnZaWloiim5uTjI6KkJqlp5yVlZebkZKHlI6LgYyNgJCLkpKSoZqgopaUmJiVoqaajZmkp6mnoaC0sqizuKGco7esqa2ks7Kmtbu1q6yxo4p6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUlNSkFITEhIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS3saWnpKqloKmmpLOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFpdYW5vc22BhX+Ffo+CjYmTkJKdoY6anKOipJillqKclY2ImZqMc42Dfo6XloaSmpCUjo57mY+djIKJgIqYoKOekJOYloWOg5R+fnSKjnqQiJOQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLG8qqmvqpmDeHRkVk1SUFBNQ1NOTFBNQlBRSElOU01ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLe5wc7GvrOsusGsrcStqKKmkp2mt62joJCWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlRTU1RVVVdZW11paW9qfIJ6ck1XcY6BloWMnJeLk5GfmJ2VlJaUj5aKgJSJXztWb3yMlIqAjJKMkIaGc4uFl4F5gXuGlJ2Vg5WOkZCDhn2TeHFwho19iYGQjpCXmpmTi5CKnIifmIiIlp6aoaCXp66praionpats6KmrpmsrJiotKOpraOTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqapoKapp6OqsKintMG5sLWwx8K3s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpiHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtJRkhOUVFNT1JUVlhaYGtsZnh/ck9BP3+VkZB8iJSMhIqNm46WlYmSiIaVh3mJf2BKUW54i5KEfoSNi4WAf21/f5R3dXZ4hI2acFGNiIqGfH54lHZod4aIfoqIlYuOkZOXjISKiJSEm42DhJKblp6dlKSiqKmlpJ6bsKqhpKSSpqqWoqqcoaaoiXZuZ15cSFFRU01JVU1TSUxLT0lIRkpOTE1US1FRT0dKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hrqGnqKWnqK+sqra8tri3s8G7tqi5yLi2qKi1tqqyvKeelY1/iZSplpWLf46Dgn54cW9YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNUVlpugnF0fGhnW1OPiZSIc36GgXyFjJOCkpmLj3uGj4B2gHhzb3VxdI6OgXp+iquFenpodnuOcHJteIGLjZJ4e4B7gHdzc5J4Z3WFhISFfJWKiIqNi4B/hIuNgJSEfICPmJSclpGfnamen6GdoKmlnp2Yjaekk6Cflp6fpIFzaWJdXUpXUFJHS1hST0pNTFJKSkpMUEhMUUxSVE1GSUI8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3aGd3x2b29qWUtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3dldYuVmI2OfGd4gHZ4f4mQfYSYkoBxh498d3tva36tfXSQi396hpKAfH90ZnZ8hmxvaHN8io2HgG15cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdmp2eoZyWjYulm46dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUk9ITlBMRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlp2lqaShmJmPhZJ5iY+Li3ZxfG11cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBxa4emqsB+dHhie3due3mIkHl8i4ZvbYySeXR5amqAgnGWkYyBfZV/SZKZbmh3foJtamRseYWQkoZrcmx8bnJ8hmltcH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6LipODlpeYmpCTlpaZl52WjIOJn5KLko2GkJeAb2pvb29ZVlhUUlFZT1JUVFJYVU1OSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+kra+iraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFZXF+nh2GZaHJ5ZH5vbH96i4l2goiGdGyaknR0fGpqnY5NeYWTiYSOZjF2h3Nsfn6DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3t0fn1xcW51bYJ/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJaWFlZW01QVVZZWE5JSEVKSkhHQ0BHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakJmWo6itnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHFnX1RGSUM+PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUxBSVFJYq+yn3F6d2t8bHGCgYWBeoSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooV2cId8h3xzi62NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW1ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gW11eXFpZYV9STltaWFdLSEpGSUc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt0eHhtd253ZGpeSVBHPT83NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01RU0RLhnV/fHt1fmx2iIh8fYSDf4x+daKaen6GgYSZhJqcYYaqn52Kg5COeneJfomIjnOKl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVmZ2BbW15TXGdeV1BUWFtVR0pKRUtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2fppGgqqCxqK/AsrvFupaOkZSHe4Z2a3+MkYJ9ioOOjHiDgHOghIp8fIF/cIF9emh2bFJYTEBFMjExMzY2Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9RTEtUXVlSS2iDiHuJeXtxfI+MenyJh36Xh3ahmoiHj5KUpY2tqUiGrq+ui4GAk4qCi4KEkqmHgJiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9goh/h4SLeZScm4mLiJF/enWKdnx4bW93foB1dXNtXF5eW2NjWGdmXFRQUFdZUERMS0ZPSUNGQ0NAQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSlqCerKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS01NUFdgWHBZXF5pjJOGlICEgYWRkn6FiJGAmpWCoaGYlZuapq2Tmbuxp7vHw6iLjKGlj5SJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4d/e3aEfG52dWZ/lI6HiIiHiIegqqKWiY6Xf3qBiHp5cGdreH97f3VsZV5bW15qXmJnYFpPTE5XUlFJUEpETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDen+Mf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShpKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlNSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUxMS05WYGN/ZmdtdJuajpmSkoqNjpmIko+di6CgkqOqpaSsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOoZ+UmZGFioWPmZGWbHB1ioyCloyNjnePhHFthYGKlpGDhYhxiKCVhpKJjY+WpLSpm4yUooOHkoN9f2tqanyBgoN1Y15kYFtnbF1sbF5XS0hOUlFNTExGSVBDRE1GQkNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYaQh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMTE1OUl5uinxzgX2fnJunpaGZoZeilJyeqJ6oq5+orKmqtperv6u2yMi3yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaKbm3h6fpSYk6KTl5eBlJ57d5WSq7KJjZeffJSdm42SlZijoaa1r5yQmKiHlo+NgIhsc3N9gX1zaWBeYmBiaGRgZ2ZcUkVKS1BPSUlMRkZNQ0hMRkdDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbXxhd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjox8ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wLy8vLi4wMDE1PkFBTVFSVFFSU1RSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUpOT1FZbYWPd5SKoqaptLy4pK2srKaotKuwtrKxrbuxs76cs8OrusnLt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKWIhZSkoaCroaSoj5yxi5Wjpre6m6CisJKinaKdkKOhq6+ssrWilKSqiJmIkomVeXp+hoBpYmldZmNeZGReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2lvWHqFdoGThYiCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4SBi4WGiJKGgoSJh4iHh3FuYUBFNjQ8My8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdIRTw+PkZIQ0VBNzs8NUM7PUZLSUdIUU9QV4GSn4Sto7KpscDGwqqzxbars7+zuL62v7TBtru6o7jFqLbJx7W+ubSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqmutruyuqywtaKxq7G1u7e1rrSgp6ijp5qpr6yyube4ppu2qYykjpGTn4Z4gYV3WmNlV2djYmRgYWdgW1RKRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiY1d5dXCBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeEgY5/gYmPh4CGiIWKh5F6eG5dVkBFTjw2OjU2QUI3NjQvLzZDSEJRXFBRVVdVXFZQX1VJS0tBPz5HS0ZGRDs+QDdENz9CSkpFRlZTUF6PpK2jsbTCtbfBy8i1u8S9s7PAtrjBtb+vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKXm6KSpbCupq2rp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwbe5t763ure5rKywpbCprb2wvLrCwauYuaeUrY6Xl6qIfoN+bFhkYllrZmpmV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpvfo6EgI2EbnpzeIdiuaGZo4mUlJaSlJONj5aSh4Z7hoGNlYqAhIGKenyLh4Z9ioKBi4SVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNSUllYWmdZVGBgTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWlRdk664tLq4yL+5vcnMu7vAu7e1u7q2vbS6scZgdbKksZqeq72ppairqqSisrWgq6ielZafmZ+upaempZ+kk6KnsbSnsrK9tsG+08nJ08bDxczCysPAvr2+u7y3tK+4t7bDucW9wsevnrmpoauOpKi1iIGBc2BjY19YY2BqZ1JYYFZSVUlFRU5LQD5HRD1LQT1CQD1GPjtIQTc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjISPc2xycnOH1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKfoN/g3h7i4OHfIt5gYqCl350fXprZnB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktLSEZISEhIQkk6RD9IS1RUVlxaW5K5wLi9tsW/urjJyrq2ubW3ubK3tbOutraYZHWonK1wXqKsnJigopuknqqllJ+gkJOOlpmXp56moJ6amYOknqylqrCtuLC9udTRz9bQyszSzM/Oysa/vsLKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5h/e21eYV1aX2JaZGNQW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj8zNzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vlpGQlG5sb3R1h7OroKGfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqaWhgZmlpbFptc5atpLyIhmdbb2hdWlpUSEtOT0pLUEtTUUhMQUpGSk9fXmJnaWGXt8ewuLK6vbWxxMa1r7iwsLursrGnq7erjLannZqnmk6anYyOn5aRppillYqTk4iQiY+RkZ2boZealZaHnpqnm6yvqLCotLTU1dXW08zQ09XN08/NxcLJ0L7JycrJ0cfMzcLQ0bevw7zEuaW1usKig3BlXl5fWWFYWmZaUV1YT1BCQkhFQkg7QUM+QUc/P0E3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJocW95eYOgqZ6ml4yam5eLjZWRmo59iYuEjYqKi5CHfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem54c2xpgXBtY2ptcHhpd3x+y7/B36dtY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmsLWqrLy/sKu0pqS4pquuoKu0o46xrpqXmIyRk5GEjpuBjaaRnImDi4SKiYSLhJSVl5eTm5CcmJman56rrKWooqytz9LV0s7M0tTU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfOnntwZ19kXlhhU15aUFFUUU9IPkBGQUJFPEBBPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OWnWGhYp3bHdvfX5/oZ6eoYyMmJOTi4ySj5aEeYWPkI2KiYeRhn6Be3J+f4GHeoR1hZOQiH9vdnJrc317dntzgXhyaoBzcmlvcXp5cXq+y5p+jLKEdnKEdmhha11DWlpbVmVjWWRqVFhcXWBkXmN3en6LgZipo6Shn6CopaqwuKqls6OhraKjraGnsZ+IppqTkpGJkY6IgZOJapSijJmEgYZ+kYODk5eti5WNlJqOhpORnpensKGhoaWkqcjNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy4x0cGViYVlVWlRcUEtHSUpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJyUnZSFi5WJj4qIjYeOf3iDk5iKjIiIi4h+gnhze32Dh3d/eoaRlX+DbndwbXV/dnh9dIV8eWyHdnRufXaEdHh7nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamNud1teZmhrbmlugIOIkIucnaCdkJeYnqOjpbGjo7KfoaWdoKigo7GchZ6SkpKQio6LhoOPhH6cm4yNgoSFepR/gqmVo4yRipeSi36Yi5qSq7OYm5yonKe9w8a5tsbO0tDS0MvSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7Ly7V6eHBmXltTV1JbVkZHSklFRT06NzpAQEI6RkQ/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXOFjXyXkJ2Lf4eSg4mGhYmBh3x4hZaWiI6Dh4WGeoR5cXp7g4Z1eoWOjZx5i3B8b296f3F7gXGDh4Bujnp0d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeouGjpORm5WflYeMk5ugmp6pnqCsm6GamZ+lnp+rmYuajJCRjYR9iIeDhYuOoJmTiIOHfmyZeoSZhoiTjI2UjIZ8nImUj66qlJaYn5mnr7a9qa2+x8vJyczLz8nE0srU19nX2NfV29fT2dvV0Nva0dbI1MuWe31qalxbUVRUX0hDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEP0NHUmpebWRiZmt2gIhxkY+agHqAjX6CgoGDfoN7fISYjYeLfoWGgHaCeW57e4aBdHqSno2gdo51gnR1gX1zgIRvgZCCb5KEdXyBhXp2hnuIt8Wkwcm4gZaaj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5GEiY+WmZeWpZyXn5aek5KXop2Zq5WQkImMkYKMhYiIgYaQkZ6bmYiFjIGFl3qIiZ+XkIiNiouCfaGKkYu8oJiTl5mdqaamrp+otr/AwLnHyc3Oxc3K0dbV1dnV19vU19na29fb2trYztvGiH17aWtnYlVYVlZOTERNQjs9PTw4Ojw+OD1ANj0/QD0/Pjw5ODY3REE2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bImMknd2eop7foB+f3yEen2CkYmEhXqEh3p1fXRtfH2GfnR/kp6RnoORfIZ+eI9+eIqKboKagHSZhn6BiYV8fZB6j6mOj8OhvYuco5x9iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmLkJKUjpyZkpSQlo2MlZ+clKCUkY2Nj4t+kI6Oi4SJkpaanp+JjJSRnZGCi3+lmYiEjYKFhIClh4qLuJidkZWWoqihnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuXt7em1rZ1liXFRQT0lDTEE8PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PURSU1JYXlVYZm1tbWmBjopxc3mKe3p/fH97h3p8e4uGgn10g4V5cnpzbYB+hH53hZyhmp2UkoCMiH+Yh4CckW6HqIV6oIt8kY2DiISbfZqQioyjoqCQpK6fipCLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlYyHiIySk4uUlJOOi4+Kh5abnI+UlpCKkpOGgIuIko2KipyWmaKihpOdlqCKiYiNnJCDiI5/g4eFpIaMkLOYnZKVl6Ghn5mSnJ2osrmspr3Bx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aByf3dpaF9eWVRYWUNBSEM/Pj46NDk6Ozc6OzszOzs/PT43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1hfpGDb213i3h5f3qBfIV7e3aFhH9zcISBenV2dnSEg4V+f5KmpJ+lopaKnZCUl4uKqJdzirGNhKeShJmThZmMopWfmJOImp6jkqmvn5GUkI2OiJaMbo23hZrEyLGboaWbnJiWkLKRZKTNyJaPhoeIj5KNjZKTiYWKiYWWmZqPj5SThpSXg3+Pi5mIjZCqlpejo4iZn5aaiI6GlpeKhI6NgX+Ij6SJjZOompeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTT2s6EdYJrZmBgX1BLVlxCQkZDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZINHdYKOfXxtfYh4en56gYGCfnZ2gIJ7bG6Kfnl8d3h8hIeLfoujs6ikq7KhlqegpaSWla+ig5C4lZKzmY2hoIykm6+ipJ2YkKeXqZmtr6SXlJWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKdmIWIiI6VjIuTj4eBhoeIkpiUjIqTk4aUmIaDkZCcdJGZspWWpKGInJqTj4qQipeaiYqWjYZ9jJieipCPnJqZk5mYn5SgnZWfm6GxrqOkt76zxcfEvcPDv8bOysnSp8/N09HQ1tjSz9i8dXx4X2JXYlhSSUtPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNW1xZSWhhO0iEinp7bYWGeXyEeICFgH1weHx9fG9zjHp9gnt4hYuJhoOSqLytqbK9r6Wus7Opo6KwrIqatZ2iuKWVraSXqa23pqSjn5mpmKqkr7CpmpmblJWRmKCXmbu7rcmhaba3qrCVmJ6iq5KXvaNeqbKCiYqMlIeRfI6OfYOGjY+UlIiHkpaLj5WNi4yXmZKdmrSWlauei5yUko2QkouYmoqSnY+LiZWfoY2VjZeZnZOcmJ6VoqCUnJ2lr6ihpbO4q8LIxLa7vbzFyMjC0KHGyc3NxNfW0MrTo3N9a19cVWFTUUdEPjxDQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicElAi4l/gHKGh3yBiXWCioJ+bX19fH5wd4d3jYGHe42PjIaMmqvDwLC9xruztMG8tKyrs7eMqLKtrb2rm7qkqK25t6qmpqGio6Oqr7Kxqp2co5ibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2vgouLipCDjoORjnqBh5CNjpyIiI+XjYqUl5SQmpedp5qwmpGrnY6aj5KOlZCPlZeOkaCQiJSbo6yVlo+UnJ6UoJ6bmKChlJqep6ekoqSws6bBxsOwsLu2xcTDv82nx8PHw7zW0MzEyop2dWRfXGJdT0tDTEBFRj5BP0E8OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1pdXJOMjIh7h4uGg4x1hpCKgW5+e4F+cX6BepV6kpSUmJGTlai0x8nAwszBw7rHvLqvq7m7l7K2urPArqXApKuwvLyqrquiop6nrK+1sKqboKqcopyWn7C0p4uiurq1wburqJyypKSolISOqcTDpIKLjoeIhIaVlIx5g4yRj5KhjIyUkY+Il6CXkpmVl6agrpyMqpyOlo+SkZWVjpCVkY+hk4aXn6Cyn5SblKChmaSfmqCcoJSYnqakpqekr62lv8TCrqm3tcnDvrbOssS+w7uz0cnHwbV3e29fWl5sVE5JRE1LS0lAQT1CRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZeJi4iSj4aJeYaTkIFyf3uNfneHgYKQeo2hlqiampi7vsnIysLSycrCzbzBs627v6e6v768xLiswamss7u9qrCqpKWjrK60rba1oKCun6WimKO0vKmbqLzBo7W2r6uSr6yqq5aGmqmnpZGCjJOklYqAdYmSeYWNkZCeoJKOlIuPjJSjmZablJSjnqmfkaWajI+PkJWWiH2PlZKSo5qVoKKctaaQn5elpKOln56mmJ6Vl5ylo6ioorKtqLvAxK+ls7fMwLmuw7O7vsG4rcLCwr+ZcHtjW1heXE1NTkpHRERIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGRXnpCdjZeOnpKJin+In5KEeIV/lX5/kIiKkICVoJmup6OYw77JxMjG0s3Ozcu8wrewur20vMu7w8G2t7yts8C5vK6vqKGpqLatrqmyt5qerKKnoZ2rt7eppa++xLG9ubOnqbOzra6WlaWtqKCRjpKxxaeVjX2RlX2HkZiPqpmYk5OOk5WTpZ6TnZmToaKhnJifmIuMj4+eiFqQlpeSlqWZZZijnrOllqKWq62rp5yfp5eYlpiVoaSop5+2rKm6vMO1prS1y8G4qrass7u4rqi4ury3hG5wXFpWV1BHS1NNSz9BSERESEZGODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZWNMRqWUnJWhl6iWjJCDh6WSiIGHgpuEg5WQkZSOmqKfr76uoce+xsXIx87OztLKvru2sbq7vL/PtcS9t7m3srK2s7ezrKadq6u4q6mor7CXo66kp6SltMGwq6yzvsK5wLmzp7i0t7OvlaStsK6ki5OVoY1zwZl9lpmEjpaZi7GVmpqVkpKZmaajlaCblpqpnJuhoJmKjI+VnGBKlpyalJqll1SWsJ+vnJ+llK+vraaboaaUk5mZjp2gp6KZtKmqs728u6uwssfAuKasq62ysaOhsrK0pXNxZ15cUFJNRVFRUFE7SEtJRkdBQz05S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTc2JWRkirl5mfoaiumJCXh4qnlo6IkoWfiIScl4+eoJujpbXJtKnGvMPEyMvJyMzOx766s665ucDBzbXIu8G5tbqxr6+ytKejm6q0tKuppq2smaSupaWorLrAqKu2tr/BwL+4srLDsLe9q6OutK25pYibl6abdr6fhJicjpKYmouulqGcm5eUmp+hqZ6ooJqbqpmhp56XkI2QnYNtdZOimpWcop+QrrKjq5Wpqpirr6WloKWqk5KZnImVnKKelrGmqau6t72zsq6+ubago6eppaacnKypqY1maGJgU0xNR0hOSlVMPU1ETUlKQUNEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJWcoZ+7rpiUnouTqpuRkZOJqo2GoZ6Mo6yUpKS2x720wbvCw8jJxcLOyMK9ubKvubTAwsq2xrHBvLW7q6mtrLCjo5mqtLqmqqesqp2or6ekq6u+vKitvLS4vsa8trW4wLC9v7OptbarvqSPopeRoZ+7nomaoJmXnZ2Ptp6pnKWjm5yhmqels6KbnqWcqKqdmJWPlJuLlomMpKGUnKKeobWvpaaTsauaq62fn6WkqpGWlaCEkJ6fnJappKGhtLS6ta2otbKynpyjppqXlZmqoZ54Y19hX0xJR0hNUUlNREZGQVFLSUFER0FWUkRIPEFHUTE7Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6ew6ybl6SXmaiblZqaj6qWlaimla2smaKqtsXBvL+4wcPByMS/zca7vrmysLi0v8PItb+wvLe6t6ekq6usoaGbq6rEoqWprKaeq6+soqqov7imrL2wt7fGtrS5uL6wvsG2tLK0r72jlqOVkpuTrZ+QoaGkoqOekL6kqZ2prJ2doJumn72imKOeoqmroJ2WjZWek56HjoSNk56koZ21rKaclrKmmbCpoJurn6GNmpWfhI6hmpuSpaSamKuxtbGqpaqtrJyYoKGSjpCVqJ+UaWVbYl5QSkhLT0xIRUNJQD1PSEA7R0lIW1JPSz1ITlU0QkU4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjV02im6SbnsWroZ+rnZytn5KinpaloKaprJe2saOqs7bFwr3AtsDCvMnCv8rItri1tbG0tLfCxre+sbi1uragp62qq52en6WkwaWgqa6gpKmtr6KmqL21pbG7t7a1w7Kzt7q+scPAuLiutLS0o5yklJGToKyfmKGdqKiqoprCramdrK2bm56YpqC9oZ2kmKurq6agmY2Zn5KeiI5Yf5aepqGguKqmlJi2o56yoqGcsJigj5qUnoKPoJeWjqKjlZClrrOrqaKipaWVlZyZi4+Rk6SfiWNnXGVhTUpLS09GRUFGSz49SUE5OUpKTl1RUUk9TFZcOEZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExPnqChmJ7Dp6Wis6CcsqeTqqOfo5+sqaydu7GprLWxyMPBw7PCxL7HxL3Eyr2wsLausbWvwMW1urGwuratmqmwqambnqahqMKtm6yxnKqirrCppKe9t6a2ur2vt8Ots7PCv7HGs7q3q7S2rqqippWVlKKroZ+fmaerr6+vu7Kmn6mpmZmXk6KkuKGho5Kur6ukpZ6SoZ6UnY6QjZSdmqOfp7Snp42YtJyjr5ufnK+RoJSYlJqAkqKWj46goJOLpqywpaeinaCekpKalIWLko2cn4BkaF1oZktKTEtTQkNASUc7O0Y+ODlOTVVeUlNKPk9eXT1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9mckA4PEiWd2VBNJ+kn5ufwqijqbGgo7SplbKrpqKksqytqbuyrbC0tMa/xMS1v8S+ysW2wMnCtau1qbG4rMDFtLiurba6pZmrsquqmKGnl627tZuosJutn660sqequrOnubO4srjAqriywr20xae+rq23tamnrKGWlpGlpKGhl5ekrretsrW2n56opJmUlZOjoLejpKWVrrGypamkoZ6amZqVmKifnpiin6+yoqeNl6+YpauYm5+mkp2PlZiahpaglYyQnZ6Ui6mpqqKnoZmdloyPmZCBhpaJlZ96ZWpdbGtPUU5OVD1CQU5DOzpJPzc3UU5dX1JWUUFXYFxCSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWpWQ1dGjHlmQzukpJyhpb+mqK6uoKi1qp24r6ukqrS3sbC4t7C3uLfFvcPHvbzEwsfBucHGwbqqtqWtu63Bw7e4qq2yvKOVrbCtspemqJGquaqhp7Cdq5+vtLOqqre1rLurs7K5t6y4sMG6vb+mw6qwtq6pqqumnZiYqqGhoJGXoLCus6uwuZmbqZ+ZlpKXpqC3qaWioq+xs6uxp6ugnKCfm56lnaCXnaS0sJufkJSmmqCpm5akoJeZi5aZlJaXnZSJkpuZlI6pqaego5yYm5OHj5mLfoyXho+abGptYm5uWFFRWlRBQ0VVQDs7SEA3OlhQZF5QV1dEWV5eTkxST19MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOG19aFxWOol7Y0M9qJ+coam8oaqvqqKxt6iltLKroa21va+zuLy7vbe2wcO/ycS5xcPAwLnFvsG4r7aoq7eyvL+/tKmvsrifl6ytqK6YqKmOp7ufpa2zn6uisbCzrKq2s7W8ra+xtaywtbG/usW2q7yvsbesrKmisaWepKifo5aPmJ+yqrOpqrOZnaebmpSNoKaktK6noaysrbGnsquxqaObnqiknpSgmZuptqmXmpKSn5meoZ+SraCamYeWmYydmp2Ui4+Wl5qXpqajoJ6WlpeUgZCVhXuPk4OMl2dtc2hwc19HWWZWRENOWERaOUhCNT5dUWhcTlpdR1teXU9NUlhkSktDXWNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKSan6SstqOsqKSurbWprrO4pqawuMa2sLe/wsK1tLrFvszFucPBusC6xLjBubK1rKq6t7u6vrWrrrG3mZioq6urnK2rj6u+nquvsaOqn7Gtsq6utbG4tqqtrrGnta+0urzJsqq1tLG0r66moLOfmqisoKSVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxq6q1pK6wtK6jmZ2tp5uXnZmZrLiil5OQj5icoZmYlK2gnpWClJmOnp2alpGKlJOemqWjo6GZl5OSlnuMkYV7jYuDi5Nsb3lvdXxhRmBqWklIWls9e0pHRTZBYlVpW01cYUpbXFpSU1NiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUS0Walp+vqLGprKWjrq61qbezt6OstLfKurS7u8C/tbO3xMDMx7zEvbe/wMC4wL2yva6ourm3t8K3rK6yuZWXp66sp6SyqpSvu6SssrKmp6Kxs7CysbSwt7KprquyprivtbPExbaptbWrsK2pp6K2n5+msaCklJuYlLCep5ufqY2pop2blZelpaS2p6Kws6unsaetr7WspJmhrKicnJ2blKq5nJWOjouYnKKYkZioo6CYhZOXkZ6cmJeXiJaPl5uonKShkpaSkJZ3hJGGfIaChIyNbnF4dnx/XUtlbFxKT2RcP2J7R0k4R2dXZltMXmJNWFlXVVhUaV1QT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JrTEREkZmkraSsraumo7Cysqq3sLWfq7W6ybiuwbzDt7OxtcLDz8TAwr60vcHAu7+8tMSoq7qxtre/va+stLSdoaexraWmsaWesrWsqrKxq6iotLmstLK1rLOsqquorKm5rbGwx7+4pLmvqa2tpqessKWko66jqZydm5qvmaKioqOQrJ+joJ+hqaaluKSrs7SkqquorK62rqKdo6iqnKCZmpKktJmPiY2HkaOglo6Vn6KWlYaQlJSem5mWlYeXkpWZp5ygoI2Tko6ReH6OhH19fYeKinJ0c39+flxSZG5eTlpnXUZElltHOk5tWGJaTWFiTlZWVldUWWheUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NlOzYqSGRISis6ST8zQ0lTLD6Paz9ISZCaqaqhqa+kp6OztLC0tbGwoKutvcy6rsG8x7G0rrTCw9HExb/Bsr7Dwry/uL3FqK23rbS5vMCwrLKuoaOnrqqnpbGjq7Gqrqqwrq6sq7K6p7exsqmyqaqlpaOtuqyqsMK5tKy5qKmoramnsKWppKKuqqiinpyirJWlnZeemKudoaeooaymoqyst7CxoKmin6qtsKudnqanqZqjl5iQoKiYhoOOioufoJCMjpeekpGHiJGVoZ2WmJaGlpOTl6WcnZ2MkpCNin9/iIR9d4CHhYd1dHKJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9jXE1VVlVXUVxiX1RPT2hYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlF1ATUaVlqynoamxnKior7WsuLWuqaSrq73Ju7C+uMOvsK2yxMTOzsO/v7TBxMS6wbTJxKyvuK6zucC/tK6urKanqbGppqiyprStqrCtrbGvsqyzuqS4s6ysraern6OesLerqq25tqS1taOpqKysqqygqKansbGjpqWhoauWqqGUm6ClnqOiqqOsop6msbesrKKlopqpqq2pnaGlpKSZn5mVj5idk4GCkImFnaCNi4+Nm5CSjIWOmaSbkpGbi5ORkZSjmpuai4+Li3yHgYKCe3WBhIF+dXiLo4d4a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWJWS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZCSUhElpCvpKKpr5ipqK21qrawqqSrqam8wcC4ubS8taayr8TKy9G/wbu4wMDCusG6wsSusbaytLvBvrOyr62srKi3qqatsKu4rqewsK6xq7WqtbantberrKSpqpyjnrOzqKiks7Sfta2hqairqKumn6urqLm2qaqpqaGpn62bkamhnaCjoqaiqp2bprSup6WpoqOXpaamqZyio6OfmZifkY6PmI1+h4yHhZ6eiIWLi4+Qko2Fh5ajmo6NmpGSkI6Sn5eZlo2LhH90h4F/fnh1g4B6eH6AiJ2PcHJnZ3F4XGF0iGlPXZhWSG15VWRWUmJPTFZUVVFPWFtiVkhQalRWVEdQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JGO5WNr6ClqayZqqStrrK0r6qlr6mpu767wbGwua2itq/Jx8jQwL+9urzDvbvDwcC/r7Kzsra9vMGxsrOrs6mltaikrLOyuK+irbSxr7G5qriuqq+3q6qeqaugo6G1ramhnq+yobWqnqinqqOqoaGsrai9r6uurKGnp5+rmY+vopiioKimnqebmKmwqKKfrKGhkqGioqaYmailmJiYnY+Kh5SIfI2GhIWkloaDgoyHkI+RhYaUoZaJkZ2Qk5CNkZyUl4+KhoZ4dIF/fXR4eoF7dHR7aoKIo3ZpXmVsgXVniIt8UldwXkt4c1RkU1FfTU1TWmdOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzSPjrGfpKWqo6WjrKa0s7CppLCnqri+wbywqLmqp66wycbI0MK9wL65v7+9ybzCubGwtbK6vLnAs7S8rbmso7Wmp6yxtriypqe6ta20vK+7pa2ttaqtnKmvpJ+lrKqnnJ2qsqS0qZqqp6qkqZ2iqKipvauzsK2dqaOgrpyasqKWpJukpJ+kmpmnqqWemqmhm5GboKSdmJaoqZGZmZKQi4KPhX2Pgn+Ino+HgH6MiJKQkIWBlJuUhpOijJORi5GakpWHiX6Acnp4fnxod3x7dXFyfmmGeoSIZGBoY3KFe21neV1eVkNYe21UYVBSWUtLTXB0XUlaW2daRVZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKwmZ+eqaSjoaqktrKxpKmxp625wb22sKS5rKiosMPJyMzBt72/tbjBusi2xLa0s7Wyvbm6vbauuba/raKzpqqrrrW3tKmcuruosb+yuqCutLWorJ6usaOcpaepo52cpK+mr6Gfq6mnoamco6igrbunrrGuoaqio62enqymmJ+boaKbn5qZoqqimpqjo5WWk56hlpuVpayLnpGPkYyCin9/j4B6mpSMiX1/jIeQj4yKhpOYkYeUo4mRkYeQmZCTgYh8eWx9dnl4Ynt6cnBxc3hqgnVqg2djaGFuc45tYmlwYG9CXXlrVl5OUVFLSU1TWVZNXF5tV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl09I5GXrJifl6ajoZ+no7evraKvsKmrucK6s62gua+rp7O6x8rIv7fBvq+0vrfEtsOysLqxssC2u763qrm4vaqktKaoqq+tuLComLi8o62+tLOhrre0pqansLOgnqSlp6GkmZ6sqKieoKqvp6Cml6Kon7C4n6Oxr6Groa2km6amqZqam56ilZybmZ2pppabnqiQl5KYnZOZlqGpkJqJjY+HfYd+go18e6GMjYh5hI2Fio2NhYmTmo6JlZ+IkJWCjJaNkX2Ee3NwfHFzdGB5eGpvcHFwan9zZHpsaGVkYmaHgGBbcmpxTU6AaVhaTVFMS0hQUlFITVxfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56hpKG3q7Cjs7SpqbrFtrKuoLitrqywtcXHwLa/wrmwtL23v7u+sKy+sLO/sr3Cuaq7urinqLWop6uvq7OvpZi7tqSrurWunrC4rqmlp6+ynKGkoKSkoZabr6ahn6Oor6GgopOjpKG3sKGmsKufq6Ovl5uqpaifmJqdo5Oam5mcpamZm5uklJSXlZyOk5eiqKGQiYqPhnqDfYOKeY6Xio2HeoKIhImNj4WPk5iMjpaZio6WfoWXjI96gHpwcXZub3RfeHdlbWxsamqEb2ZyaWtmaF5kdIFgW2t2aVpKf15cWE9PS0hIUlVHMzldXmxRRVlVWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJkVywylKGhl5SbqpykoaKgt6quoLu4pay9xbOwrqO1sKysrrTDw7yzv7q3sbO5uLq4u6+uwLO0ubC/wLitvbq1paKyqaepsqqtsZ+Zv7Wkp7W1qJ2yvKinpamvrJmjp5ykpZSYobGlmZ+jqKmcop+SpJ+juKikp62mnaWhqJKfqKKhoZmbnJ+RmpuWn6Gpm5qYoJSQk5aZjZOTo6ekkImJjoZ5hHqEhXydjYmKh3qBhIeJiZKFlpOSi5CVk4yNlHuCl46Ld357bHRxbGxzYXd1aWlqZ2dvhmhoaWNmaWlgamNqaFxme2NgU3RUXFtTTEpHSU9TQCEqaF5qTURXVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp2ipJCNpKaanZ6do7Ssp6q6t6esxMG2sKyjtq6nrq63v7+8ssG3sK6ytra4trauqr2zrrKxvb+3rry7saSftqqlpbOoqq2dnMCqp6WvsqmstbueqKmrsaWYnqmdpqSRmaatopiepKmhm6Gclp+dp7Wmr6quoaGdnaGUoKafoaCam5mbkpick6Wcq6GXlpyUkoyVl4uPmJqon5GIiYqIeIV2gYKBnYeKgol9gIWIh4aQhJaUkI6QkZCRjJJ7g5WOhnN9fWZ4b2tqa2Z1c2tjZ2RkdoFjZWZmZmpqY2tzWl9aXW1kYU5pWFpgVkpHSEtNU1g+OV9saUhDVVRdW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao6CPi6yhmJeglqSzsaKyvbahsca8urGxpLasqq6puby7uq3Asq6urrausrizqay5sa+us7a6trC4vaymnrWqoJ+vo6munKK/oLGjrrCut621nq2ura2imp2mqaWflZqnpZ+ZpaKonZqfm5ScnqyvpbqnrqKhmpqdmZ6kmqSdl56Xm5OYn5KolamnmpOampGLlZmNlJSaqKaOjYqJjnuBdIGBipiFh3yJiYWFioyKkoSUm5OSj5CRlo6Qf4CMjoJwgH5meW1oa2lmcXJrXGhjY3SBYmZnam5sZ2pqaG5dbGx0cGFUY2lkZVpJRkxNT1lRUFZhZYFVQVZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGbjY6wnpqToZmpsa+fub+1oLTCu726saa2r6itpbe4t7etu66sqqu2qrO4raaztbKuqbC2trGztbqmqZ+1qJ2dqKGorJqnvZiso66vtbWsrJ+xra+popucoquonJScpqSdmqqipJaan5yQm6Sqqqm7n6ekoJiZmZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB4hpSMg21pfnaDcWyGi4Z9hYyHcF5jYWeEmIVri4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dzhWhfZWZubWpdYGGKj4SEZk5LRDlHVGdeSkdQUFVVTEhSYW90ZkZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4PUc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYWVsJubkqCbqq2qo73Fr6m4wri9vK2ntrClq6O3s7KzsbmtqaastKavtaKpuLa2qKestrKutK2zoamfs6qeoaObpaaYq7mUpaWvs7etrqWpraqspaGenKCnppuXoKWlm5unp52Tn5+YkJ6nqaO1r6Oiop2Wl5eXo4igjpKZhqCHk5ygf6V/paqekpGakYiEcniNjoWIoXaIjGmXiGZ9cnigb4iHhH6OfX+hoKCZgHyHnnSHjnWbimyHgYNsaGVjemxxYVOFbWJsaZhxWGpxcIhZXmlbbGxbiHFuenKFZ4aEWl5HTj9HX01FUlZWUVFSV1VnXk1XSVJSUEZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiKppaDnKucmZidn6qqp6q/w6+xur23wL6qpbewqaylsrSur7O3qqmlsK2ltLOcrbW2taanqLOwrbKnrp2qoLKon6KimaGhmq2zk6OkpbW8pqynq6qsqKWhoJifpqOZmaWjpJicpKmWlKOck5OjpKaht6OkoKOYlZKXk5yIr5CXlImpi5ahm4WxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZH/AnL95hIR5kYR8kJCRynGXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5nem9yj9h+U2tjtrJ/gXKVdJqhqpBXT1diUFZORlVbWFFQUo1cV1xQQV1EUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKaSgKeqn5ecnaWssqixwr2ytb+1t77BqqezrKypp66zqa+2tKenpbSlp7ivnLOytqulpKexrq6wpqqdp6Swo6GfnZaanpytq5Oeop+zuqKqqaGtrqWhnZqaoaefl5unoJ+YnqenkZynmpSdoaahobCin5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnJ2UmaWUca6hpH54u31roY92sV9qtFulgGWckWBmgntmf2p4a6lkvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5ofKSngllfi6tpgJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOiVBXVy9JVFNKREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsqKWdo6Sqsbestb2/sLbEsre6waapsKuuqKmwrqOwuq+jpK2yo6i4qJ6zs7CjpaCqra+sr6ann6OisJuimpaVlpqaq6WVm6Ges7Ohq5yira2gnZqXoKGonJido5+cmaGmpI+dopmXoZ+qnqamn5qfoZWVkZaQmoW1m7V4hamZtZl2hrObt36TlpaolH5rgaZ7goaIkpSSd6tna7Fbq3qNhpR0iXKPhoB/iJCXeIKCi5iLg6CPhLB2d59xa2tsfItOpFhIYmKZfmNopmB5c3ZTkodeUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCP7J5WFhBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WIs6amoK+pp7Ksqru2wrC7wq24tr+qrK2traatsamhrryqoKe0rKOrtaWmsrOnpKKdp6qyqLCnpZ6fn66Wn5iUlZWXnaygmZmkqLSuoamPqaiqm52VmKCkp5qenKKfm6CjpKOVm56XmZ2iqJulmZycoqCWk5GTk52D1ZOZuXCwwX7FhnzWlJu7fJqVpI+NnI2ke46Ho4KlgnqseY+dVq96iH6farlbuneHhH2mgpN8mHqpeI2dj3uxbo6EdJG8hW+UUK+nxYpRoHpjYKlic3OIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObk5cUk9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KUmbKoqKW0qqW0qaS8t8KwucCxtbS6s7WnsbCisLKmn622qJqnua2jr7Ggs7SwoaSen6epsKi0qKSbnZ2qlpiXlZeVlqCpnJmWp62wqKKfj6yiqJadlpuhpaGYoaGhoZqhoqabnqGelJmbpp+bp5Wbm5+gmJCRlJGdiLJuaLVxq4dujqZytHNytnual6OLj52No3+RoaV+sHaDkdLSdlyue4V/pG+bqqZrh4V9rX2XmY57sHKSnY54s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZ0h2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa2BsaFBVSEk5PVZSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWwraOqvK2mtKantru8srq/t7azubmypbSzobGxop+rsKSXprmtpLGwnLS4qqCmnaGppLGorKmkmZuZqJ6Vk5eYkpKhpp+WkqWqsKahlZOtn6WSk6CbpKaflZqlpqGaop+tmaCenZCVm6GdnKWUnZWZop6VmJWRm4Wse3eodqONiIapb62KgqeDmJigiZKaiqJ/k5mJroV/grNccrNSrn2CgqR/cth+eIZ+j52GmZl2r4aJkZyHd7RhmmWagoKUbJJasFhLmnWYeWZgrV52d4domIhrXa93lZ6PeGw1eciusl9CVG9eZ2BFUG1fcG1WVk4uZWRpU1hRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnpSgubCWtMKtqLOoqbK6t7O4vrm3sbS7taS4sp60rJ+eqKyflKe1q6ixsauttKSbqaCfqKG1pqapopmdlKShk5KbmJGUoqSako+mra+moJWZqZ+ijpGhmqikoJWZpaidnKSerJyhnaCNk56anaCYmZuWl6Ggk5eQpp6GqX19pXihjo2CqnCti4GnhpafoImXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTZgHeIdKiBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpOAkX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJnTVthX3JzX0tWNkqblFhHRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amr+rmLTCrqutqaW0sLextb65ubKwtrqou7SfsKSepKennpOqsKmvqbWsqq+hmKGgpqSkuaKjq6CWm5Chn5STnpmTl56fj4yLqLCvpp2Wm6imn4ySo5eoqqaUlqmnnp6go62joZ6ijZShmJ+fkp6XnJWdoZWWjqucj65tcrRzqYt1iqdztHhzs4CRpKOSnI2JpIeQd7hvjHuLomprtlqhhWWXl2mgoqdulHK0dJOYf7JqhZKIrWt1s2GdZqJvh5Nql1ytX02hfIeRUnOjbHl/fm+Yh3Fcr1Y8nHdmVG9uLlynT2NTa2VibVpjXWFwe2NUWlE+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKabm527oZuywK6tq6ynt6m4r7XAtLuvrre2q8C1qKmgm6WkoZyRqqmntaOyp66qoJecp6Ckq7mdo62blpmOpKKVjJ2gm5icnpGSlKq2sKeYlJysqZeMk6WZpayikZaqsqOfnqarsJmho5CZopagm5acl6GSnKmclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJeKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGO1gYyHqX2VgaypcXt/dLyIp6BpnWGmjq+ifox0h6p9vm9zvHSyg3V4gYtumohxbo2kdL1ed31aYXm8a1pWXGp5XmphZWdibXhvWVtZREFAc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6ivKGXssOwrKqrq7GnuK+2xLC5sK25rq3Asaujop6joZubkKmjqrKktaatpZ6WmqqZpqy5naOtmJSgkKWfkoycop2YnZqRlZKuubKslZejp6eUkJaknKSsnpCgqKufm5+oo7Ofo6WOp6GUopqcl5Wjl4+voJKUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSewbu9mnuBsahwgHORuYN8hoaMh418ioeNl3yku7m9nHV6tKN0dpd2dLB1mZ5mhmqNtXRycXe2jF5/en2JaIN5bnlii6xwdYV/WFunakVlWlRmYGNeY1FoZ3FtdUJOUE1EO1pNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlYnPjs8p56gor+llrTDtKyrqKyrqbqusMWutLKttqa0uKypoaGlnqCdmZOrpK2qprWnp5+blqCjnaykvqahqpaTnJChmpGPoaehk5yXk5eUsbW3rZidpKSiipKSpZulqpuWqKWlnJqhqKWnpKmhkq2elqOel5eXnZ6Pr6iUm6ahjWp9aZumeIdyfZmOdHlkh3u9vsC6b5ODcpWHYXNqWl6biWFjiI6Va2CAlWNtnXdilWuAmpWUZV5gY3Caimhyi32FlWdqfnJ0eH1+Ylt3dIFoUFxug318i2tYbHqCckpKb4ZwTnRMRVddZ2FMWlhnY19PW251aXJSUERFTjtIST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPltPJz8yPqmgqKLBopu1urWjrKWup6e1sazIq6+yqrSivbGxpqCiqJyim5mZrKavpKS1qaWbl5Whm6atqL6nqKWUk5uVn5mSl6SoqJCdkZCYnK+yv6ybp56nooiTkamaqKOamqygo5qbo6eso6Cro5qxm5SnoJaUnZ+dl7Cll6GnmZuQnJyio5iloZmbmZmZj5WBZ219cXeSl5SShYu1qo2GmJWOioyYloeUlYqEk5SRiY6SlJiTmJaaoKGanJSgnY2CeqWGbGp8kHyAdYqKgXGCeHl2doqAfIpqc4F1g3Vld313a296bWBjXXBoTVhaZmpgV1pwem5tZlRPRlM5T1pNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOiwKGksrK3oKqmsqelsLSqyKqssKS0pcCns6CdpKSco5WVoKqnrKOjtqufmZaWn5etqqXBnqujlZGbl52XkpOhnp2hp5OSmainssSvmqudqp+Ql5annaqbnJ+tmaGbnaKkr6eipaifrpiXp5yZmqCenZyvoJyhppWXkpeTn6CVop2XoI6Wk4qKjY6XrpB8lpuDkoKLqqmFgJmXiYOPnoh6hJCHhpqSiIaKlY+bl42RmJ2jlpqTkZ2Nf45mobOvhYqEdnuSin12eXpvZnmQgYCJa3WBeYhyaXN/e3aDhoJrdWR5ZmBqZWNkZmtZbHtwaWpcU0xQRF5URkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0W0c1PCxAtKC6r7+tq66ysqCrprGtoqyzr8Svqquisq28o7Obn6aioZyZl6ilqaakpbK0npWUnZmZsKWuvqCsopCRnZmZlJGUoZyXqJyEn6qrorPIs5+qpKqWlpeapp2omp6jq5Sen56gqa+qpqSsoq6bn6CgmKSenJ+cr6OYnqeSl5ackaOYl6ecmpdlgpJ8ZX6NmpBjeY5taWt7kqSqamSal31nhoplZWloe46hj2xojJeRo3draouZo56Zc2xueoONh3pYZV6Ggl5ti4mBdlxoc3d3koCHgm53gnh/c215hHR2iIiOg3xqh1lebHVkXnOJaWt8cWtjXlJOWElkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaWfury6r6y0saqlqK2tsKatrbC8sKmmo62usJ6slqCjnaKZmaaqnK2jpaipsq2elaOPoq+ltrmlraOOjpqhmZOSmp+ZmaSVe6Wtoqi0xLiloqevnp2UnqKeo5uiqamSnqGeoKqwq6ykq6Cqm6efp6CrlaGbpbCkl5uqlaCcmpGjlp2pl519vYOIcrRyhJ2GrWh4ucS4cZOio3qlmZhzq4J8y8DAu3GMooiDn32WmImdwL2Cl52djZ3CwXyCe5KNmsPAfWulsm6MgW/Ken+bd5GDjoF2eYGAeXF6f4dwd4WMk3lueJRjZl95ZGBlgmNedGhsZGNYTFdJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtbCwwKmolKOvqbCuraaztK+ppaWmsKufq5iaop+cmqqnop2soqWopKS0pJ2ikqatq7ezp66ikZGZnKWSkJ+gmJufnIemrKSrrcDAsaCpr6mXkZ6doZmho6qkk6Chnp6tr6qtp6Skp6GmpZ2tqJGkmqitqZqcqZuroJWVpJWgopacfs6UeHqkgXmVlptfro9ejqeBoqB8p5abc6uDgK9eY42qe6eHhaB1l5OIs2OCq4ahjY2zaoSudH2XiLdhg61Zo81tkHV72nt/mXB+iJJ2fmV7h3Z2a3yIbn2FkJF/bYOQYXJscGhgYHlkXHFoamRnYFJUU1ddS09DNUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqits6umsqysqqKqp6+poKebmaSXnKKvn6CeqKejpaGfsKyanZWnrqywqqisn5SSm5+kko+epJedp6OerqWrsKi/x7OoqbGulpKdm6KXn6mqn5Wgn52drbCorKqcqKikoquSrLKWpaKqqp2jpqShr5+RmKaYn5mTk5GXoHGFjJd1haiGcbF9nnKsfqGegaWPnneqgn2tf5xzrX6qhoafdpiSe3yXfqqIooyRjJ1+q3qIlJCfgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+JipKPhG6SkWZwdXVxYWdtZV9vaWluZ2RYU11hWlJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DTxsaytKCdo46jo6Ksr7auqLCmqKqmraurpqGknZmhlaClq5+ipaCoqKKenbCsl5qWqaeurKinqJ6XlJqjoZGToKybnaair6ykrLWquc2yraatrJeVnJ2imJ6trJ2XoJmenqmyqquqnKyrpKOsm6+xoqirrqWYpaqoqbChkZWipJmTkYSkaqR1iXqpdHqycIKmipmMcYigmoekYGBSq4R/roObdq2Bp4aGn3qZl4Z7ZoCjiaSZhoKjfal+gpWHrl99qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoJtm5Vxbnp4eXBtZ2VlcnBmfGljXVdgalhZVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydXVv6GZq6egr6KesLSwrqmsoqemqKqrqaSmn5uknp2mp6ejnKyaoqyho5+vopybk6ukta+uoKianZaUpqKQmqKon6ClnLCmpKixrLbIsrWqq6mWkZ2coZifpLOdmqGUnZ6nrKylr5utqqOiqqGzraGqs7Chmqinrq60opKVoqaYmpF7qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfYJSpg6SIh6B6mJaaeKrJdJmjlaipkZOajICciZrGx3hmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI6QnpJ8cZiVgXF8dX58blxmanNxZoFrXmFZZG1cX1lJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqgpZqopaqrqaafpqaYqqOfrqudpqCsmp6ppZ2ntZ+il5OpqrayrZulnKCUj6WskZmcp6KgqaauoaSnqbC1w7Kyqayok4mXnKWaoaOupZehlZmcpaasm7Cerqmnnqyjt6yhsbivnZquprKysqOTlqaimZ6Ogp1OeJqBf596hKN9g6SEh6aenJ6ThLh7e3m5gn/MxsK2eJuhkIuffpqWl4p2npiKpZikqH+whZyFn4SsfZqUYqVspHCPhJCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Tk4x2fHOGgHFcbm54cmqBb1tkX2luYmReTExRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq+gm6GssrOlnqCVpa6trqunnKammqOnobOvoqmnsqCYqaSUorWiopWXoam0uKSbop2jko+hsZiem6akoaKvrpylqKK2ssSxramtqZGHkJynnKKknKWXnpmZmqakqpuwoq+lppivpLusoba2rZ2ctLG3sLGll5yun6KdhY/RtcO3eYeOhZGTkICmeJShd4ygkYSlgYpxqoaFtG5yapmjnJWKnnyYmYaHj3OvgqWboo2mi5OdipWQm21wsl2lc5N6m2uZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWNeX55kINuanlpeXJvgHVeZWVvbWZnYEpbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/vLq0npanpa21oaKZlaOopq6rrJmmop+moKC2p6Opp7GjlKyjjqSto52Qmpqqs7OknKScqZGUl62fn52mo5ynnLWZoqqktqvDsKmqqaGMhI6boqCmo5WampyZm5mnpaeZraivo6Wbraa9rJS9sKyeoa+yuaqypZqosKKml3mokH18sHeKgKSliJxtsm+gh618oY+Dp5WYgKyJha6Fn5SqoKGXhp+AmZWAe5J+q4CdmpaLq3idn5GJlJKAea9eo4F9pqdjnYB8l3Nqr12la3CFmV1gW4ygbZWRppmDlY6ZjXx8hJiAa25/Y390boB6YGdlcW5oZ2hDWmFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVldXWFZVVVFIRklKIygovZOag6nGwrbBtJ+arKCtuKWjjpuko5+wsKqfpJ+drZmfuaCjq6CvqZquoZCrqKSWiZqQrrCspp6mm6yXl4+soaCdpaGZpJyumKGoprapwK+lqaOei4CNm5qfpp6SlZqblJuapqWlm6qsraSln6qovqSWwqupoqCrsripraWfsq2nqJd2r36Qi5yFh326rYqZZbGNZZWtfaCPg6aVmoGsioSwhaaapKGhkIWgW2xqgbNgf617e4OBsW1nb5mYjIixW320XKSDa8iiZJ+Ae7xYdrVZsn1SroB6rFiAoW2Yj6ebjJeRmJh8epCef2V1f2OFeHSAfGFqZ3FtZ2VmT1ZkXEFVXz5JKD46PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBgYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vbqzwbOjnKympLaooIqaoJ+cs7Spn6OgnrWZoLSoqqyer62erJuVr6mijoibjq+sqKehppmukpiPqJmhnaSfmaOjppmgoqmyqb2vpaienY99jJuWoKCZkJKanJKamKmgopqprqimpqKlqbueoMampKigqrS0q62lnrqsq6uUgKmSo6+Om3+HpJeZkIKAuMO6g46ckoSnl5yCrIqCr4innJumqpB+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGuigW+rhGycf3qysMeDaauwvax4d6K+vHOAlo6mnJGbkZmee4KSnHtkfnxljmd5gnthbGVramNQYVtTalw/VWJDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzg6PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsb+5sr2yoZyupqWypp2MmKW/qriyqKK/p6eynJ6xnLqon62vpqeUlLCsl4yDm5GupaKsoKOcqqCXiqKSpp2nnJqhqKKZn6Gsram5raijmpeTfIeZkaaako+RmJiPmJSpm6GZqqmhqqego6q7najFoqCuo6mzs6muqJ+5pq2tmXN1qqS3hmSJoHBorpGKkG5ud6SQmZ+Bda6YlHCPi3GVqKObl66kcm1sbGaLeG9ugplxgXpqcWlniZaWmHFpaYSHZnCGZF2IYmpvWVxmfXamX2FxjpFuZWV/jZOPoZiZmZKYoX6IkJZ3Z4h4aY5ren95ZWxjZmxiS2RYSmxaOlBlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3OTw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWVxeXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp6jsqmXkr6yxMm+t6qfwKytpKGnrKC6o6SurK6njpeuqY+LhZaXrZ2mqqCdo6OgkYukkqaZqJmWo6qglp2mpqewuqusmpuTknuElo2lmI2RkZmUjpiWqJWgmKmjm7GmnaKruZ+vwaejsqWrr7CprKqmtqKstpWKoKiltp2JlqOZh6qbkZWdkqmymZqjqqCylqKhnZ+inKGloZWrp42SkoyHk5yclJCZk5mRjpWFgaSal5aOi5OTi4+GhH1niX50gnVzhopwp2x6lJGTkoGBjY+Qj5yUoZaamKODiZaPc2qRd3GMeHd8emptZGNvZFVhWUBqXEhjYU9ZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVVlleYGFjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1xcXl9fYF5eXl9fYGBgX1lZYKaWqKqltLaurqGvo62foLWxkI6sx77Gu7mro6WenKafsamkt6edqbWnqJGYraKLh4mPnKeVrKSfmKeenpKUo5anmqiZlKahpJCbp5mhtruoq5makIx8gZSLoZSKlZGWkJCUmKaQn5uqn5y2o56nq7enrsGto7alrq+vq6iosregrbuYkaWkpraikp6noI6qoI6Sn6Osr5qgo6+or5ijoJyjqp2enZyWq52TmaGblJCWqpmNmJmXkJaekYignZWVhZKMkI2UioB9ZouFdYZ1eIeCc5xqhY+Uk5CJfIuVkpKXlKKTnpijhYqaiXxzl3N6i4BzfH9qb2RecGpgW2BZbmRQYGVQWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaOno6+yrK6jqaatn6e1qpCQnaW1vLCtraKjmnueo7KkpbGpl5u5pqOTmaqcjoaKiZyij66eopWon6CSlpiarYuplo+omamNmamPnrq2pKWZm42IeYGUjJqTipWSlJGNkpejjZ6fqZ6fuKOAhK+1oq+vdKO9o7Gfd3mfqbC5lHWso56JgKp/ZFxidqCPpZ+El31tkrOco6etqqJlnp+Sc3mZl3CAmKiXbX+iqIplnKWckZeYloySnJGGnZqPlYOSh46OkomEd2qOhnaGcHuFf39gaIeKlJKLWnWUkGdokI9ze6ebm2Z6momEeZlqhIuEb3mAa3JlX3ZwbGtoW2dmYmJwU1w+Tk5OU0c+QFVEOTEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6CusKyrqaWorqKmraSSlqu2sbKnm6unrJd0jJ2wn6irp5SXuaCgj5yknZF/iYibno2smqKUp6GdjpaRnoR1rY+IppupkZekiZy7tKegmZiLiXR3k42Wk4qTkZGUjZCUoI+boaeZnLKWgIybtZyzjJKOu6agfqeieqGttYCOjaWeg4uGkLGqr4yKl6SbeoCLrIacnaGnqKeHlYWYd6WbeoebgZingoJ7nLJ6ioagl5mUmJaCkZeXhJqZYnmHkISNj5GKg21wjoZ5gHB/gIR+hXOFhJWReJZnknSgmnV9mYSin4iYf5SMhYWaa46Nhmx4e3FxZ2R4b2psa1tlbGpldFxeSVRMUkBFNS5aVVU3KSEwOT0+NzQzNTY4Ozo9Pj5AREk/SUVKS0dTWFtZW2FhaGZZUUg5RUw8PmJWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyYo5+mrK2rqKyfqLCmpqmlmZSvyL+xopeoqbWekISdrJynoqCNkL6emo2fmqCQfIaPmZiIrJyilZ+hkYySiYaAkaeNh6KdpJSYnoefurKnnZuSjoVwdZCJlZCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6mtiLeFjbCBr6yCqIymmI2dfaiPcnt3nI+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWygaF9oZOgkJiXgY6Tm4qYkYt8hZOGjZWSiYNtco+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56Eo5yEmoGOj4eLmnGPk4Vod3R8eGhodnFoaGxeZHBtZ21YZ0ddUk0yRDQ2TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKgsKeoqKWrn6O3sKmqppqUoKOkq6SXpqu4o7CAoaidpZ6diZS8mpSNoZKej3mElpaRiKuZm5uZooWOi3eanI+fkIiepZyWmpiHo7mtpJqcjIx+Ym2Pi5OQjZCNjZiMkZKgj5ShoZmhp36hp4etnaCWrY+enJ2RhYCgjKqthaONqZmMmn+jdYCZlGuCrXZNq3iHjZyRmqingKmrfYOhe3qnaZ5/kmtnl4WXt4mefm5gZFmDl3+Me2Roi3KZfXmVbF18lm1fU3CDXF9reIJfWGSBfIN/l3CnqmuDo25ypXCfhaBqZqBtW2+MfWdaYISAYldQb3dmbXRza2pvXmtxbWtpWGlPXlhGOUE0SERfazQsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGgtrurraKZmKGipa2uoZ6vtaOok6GgoKecmo6ZtJqQi5+MlYt1gZSSjYqnlpWYnp9/koWFq6SHmpCKmamZmpuSiKaxp6GVmoiJgGluiIiLjo6Ki42SjJCSo4yUn6CcoaR/k4GPo6GUoHeclY+ng6Gmf4aoq4OleIl8hJp+onBzlIiWfJ+NeW2Hm4yZj5uomo+HnXuConN2pmaefnekX5h6fZN0om6Yt7S6dJOHgn+1qGSBxrh7cJW2jHF/mqRic6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGCdmbOWcX2Yn7N1c1uesoNqY290dnFob1hrbXNyZlxpXmNMRD1ENlFCWnIzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1OUUBFX15bWlhgYHxkSEM4TFdVV2NgWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOWlKO3maubk6CNpLe0ra2gmqKdpKOmrp2csq6sk5ihmaGkmZqUn6ubi4iSeIuFcYCWjoqQoY+SlJ2YfZCJjaegh5eOiZKjlJybjYupqKWej5eHhH5qe4d/fZCNg4uQkYmQlKCDl56gnaCei4l3nJiijJ9yoYuHqYibpY+Vpql9rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYaiZKF8iJaQm41snmiajW6amXqAi6d9cmh0q4Oeg3SqaJWaXZuFdoSdZ6pqgLhmXKhwgZxglYxep3Z1h4h+nmiadIWTkpeOgJ9vmpFup5pdqH54u2t+qlyOhF20Z1xucnp4a2lccWt5eWNfZlhiQlFGTzdXQ1JvNUtbWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXlllZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptZuniGOUmqu5sa+snqacnKmgn6+cnrGprZ2XpJuhoJmWlqGkmYaJjWqIgHJ7l4iLlpaEkZWYkHqKg5WjnIqUj4aMnpKdnYmQqaOgmoyRioCAaYCHeX+XjHuJjo6Ij5abf5Sin6Chk5hyaJ+Kn4+McJKMgamHmJ6hpZ6me7Cto6K4l3ejs6KkgIiUeZ17qpp/oo6cmpaIl3GhfIWNr7V9a5qRoXh+mLSio6uohJl8m32dmn90qlpdb3uWi3ieYkx+e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g51uc32VcJp0a6RdlXZIZWRgdHF+fm5mYGxpdntkZGFRX1ddVVdAWUZRaERTV1xiWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZtXWVnZmtkZmxpaGtpk5yAsK2ZhFNeoKazubKyqZqijJysnJyqlKKspKKoj6CenZuZlpihnZaIh4l3hoFveZWFkZuLfJGTlohygIiSoJtzkZCBiZqVoZuFj6mcm5WLi4p8g2yEhnGBoYx4ho2IiJOZlnyTo6Ceooithn21hI6enHullnqpgZWbj4mfm3ynaHdtfpl0oXNxfJ6GmXCTg659pIOmnZmApG9eqGd1omNvpWGc05B8e5l4cnNjooaQfqNzpI91a5CzjGCCmIlzqrKnvH93g21+vqaptF2bbnxwlm1/cqJyXaRnc6ZgaKZtm9SafYabcHp7mGycfHiXc26ppGdgZXpxgIRrZ2Zkb3V3Z2BjU1xmUVFiSVdKVGFXU1tlaltlUUZDS01KS0JLRThPQFFOWFNZT1NRYWVlalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJeagLCrVFxLfqmvsbSvs6ObmYWZqaChpI6lqaCZqoqamJiTmZOSoZiPiIZ7cH2EaH2Pg5SagXeQjY+Jb3+Fj5KSbJeTfImSk6WWg4+qm5SSi4WJeYN2iIBugp+Gd4CThoiZopd6lKOkmp+Js6Gitot6rKekrqVwqYCajoWAmpB7pIChmYaYcp6Eo66vipeMgI2kjZWDraCUdrS1tcmhc5SLgZ9gnZepbXmVh6CbdKKHd6B+kpeLgW9MZqOScJuHc6R7enRhg4FrfqBrcWRfnHF9c5ZoeWmztbTGpnOYfXqda5ybq3aFm212eJhqmnt1mHJQRX20X2p2a3mHZmpnY3V1cG5WXlRZaVBSaElWTVlUVl1oa25WZ1dOS0FKTUtISk9BUUtQZWNqbWV0c3N+eXxudYl7e1RQT2xeaVxraVJqaGlsZ2xmY2VgXF1dXmliZGlre19dZGhjamZubWVpbGWhm4iupoRlP5Ohsqqur7WiopCAl6qio6WMpaeenaaDm5eWjpeQj5yTjoiDemp5h2WDjX+YoHl1j4iMgWmEhZGDjIWdjXqNi5amk4OYqZiNkYuBiHp/fYt5cJChhnqBlYeJlqCWf5SlqJyWloRmbnicbKJkfHGld5uYcGemgJWKeqR6n5aDl3KedoGKlZePuW6RiqJifZmglYhtcmmqa3WgbW+mX5ppi5BploeblXSigH2aYIyGjXVviGJooGWefmmbdW9jZoiCbXGiWl9bYqFtXYiLbnp9c3JkpW14omRnp2iZc4yZcKJvVYmQb6BfZqhUi15UmG5tc2tygm1waWx5c2tvUllXV2daU21JWU9dSVhpaXNqWWtWUVJFVlxMWFNhVWlrX3d0e31wfXxyg3uAc3aNgIR2XlFyYmdjcGdQamhoa2xuaGRnX11eXWBqY2ppdnVdXGNpY2pqc21ma21jnKSYpXpkdG2Lp66jqbCxpp+MgJirnZ+mjKOim6OigZaYk46akIuYkI6Ke4ZxgIhoi4t8mJxzdIl9kHxkgoeUiYmVmYJ8iIeXqJGBoqyRhpCKgop+gICPc2mQpoR9hpSNiZmgj4iTqaadiKZ4lZt+pYiWjLKYnpCCr5efpXaUhnipc6WPhJpupKKMkoSNg7tufaWvg4aFhpOVnJ98pXpyqJWglmaefm+sY5WKlpN3qWypooGJdoiDd6qRpodqkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5+i6Wedp98g6SVnaBqm4h4rGierYy2dHe+jaSTWYOmjathdXJ0cXx1cWNrf29obFNXW1ZhYl1rTV1SXUpebW53X1txWVxgW2Z0ZW5vcmJxdGB3en55cnmDc4N/gXt7jIGCgHZieGRjbnJkUmtnaG9scmpmaWFgXlxia2JtbHpvXFxiaWJsanhtZ2xuYpWlqpyAf52jlqmqnaimrqSZioKYrJqfpYqbpZ2pnYWMmo+HnJGFko2MjXSGeoiEcI2FfpiUdHSFcpKDbX+LkYeGk459e4KGmaaOf6amjoGOiYWUdoKHk29si6mBg4yUjomdn4qMlKujoI+AdZSXiH6BeZSuo3+Bm3GPhneOiYJ9e3KnjHF9fXqYlpuEj3l7f36Hk5WTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GGhIJljH9egH+Ld3RylHVueW5thmyEhV51Z3eOZYCAhY2omn10e5VqiYhwgXZ9h3dubWeMc3l8mHiFXGtYeY9pbnhycm94eHBda4duamdWW2BXXGZrZFZiVV9RX3B4eWxrdmZqa2t2fXFydXNhb3VidHuBeHV6g3V/gH+AeIqFg317bX9sZHluXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNlLiopomgopqmpJilnKuioYSEmK2SnqGJm6eaqZiDgZuLf5aUh46KiY1yg3yPfX6PhXuYj3Ryg3CVhXt8kouGho+FeX6Ah5qljnynoYuGkJCFlYOGjph3coSqho2SnZCJn56IjJuon6Cqg4iOlZp+fomWraiPkaaPd2+bj4F4kG5+qIVwfZVxa3B9gaCNgJOOjGhtXYOLi5uano5zlYuIcXRrgXZ0gVlyboaRgX5+jGpdamR7hYSJgGBpd3qae4KKgXWBhYJnd4mFamFwcYF1XnGKgIiOpZSFZYuNg253i4RxhpB6cWdoZXyEepZbXGpnbnZbe3l4dW5zc4JnXG2La2tiWlpfWllscVxfYVpfXWZ0fnt1cHRja2trfH1zfHh1ZG11aG18fnZ6fHt5eoCAfm+GioR7fXN+eXN/aFRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzem9oam1gi4uqsKCPoqGanp2Xnpioo6J+g5mujqCViJyikaWVf3uYhX2SmYmJhoeKc32BjHaFi4KFl4pxb4BymIaDfZKDhIaKgXqBhYycoZGDpqKIeI6XiZWKi5yYhIN6rYKRl5qVip6diIihq5+hoqOLh5ObnKOZlqqhp6afkpqGlIx6do2Ng6d+f5KQk5ScsqablZ+QjbKTl4OljIyVmp+JkJuCiJGKa3yOd3hlgoaQi3yJnYSHi5CIiICEhJB3fHl0maCIhomdiYSTfn2Kf391b3KEgX13hoaKj6WQgoWMhoKMkIx9h4yKkYR5bYOFfXqZa3JoYXSKcX56d3dwd3SBXV5vh2huX15aXV1UaHJWZFxcYmxodXt8c29wZGtraYB8bnmAcmpwcGxngXtygoB4f31/hHttgo2GfHl4e316g3hOZHZqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnLmelqKgmJSYmJSYpKCefH+arI+fjoagnYueln14lIN7jpmJhoOEh255gYBygYh+iZSEbWt+epeHhIOQf4CGhIZ9h4WOnJ6Th6ufhHKLkIaSkYudkn2Oe6qEjpOYlo+cloeGm6WfopqdhYKSmpmZkJqmn6WdnY+Vf4+IdXuGjYOkenyOkJGGmKuhnpSdkI6qjZB/nYyIk5mego6XfoaOg293hnF1YH6Dj4Z1jJiAg4+ChoR+hYSUbnh1dJGhiouFmoOEjHN/iHt8cnF6h4J6d4qNg5GmjoWDjoCDiomKd4aJiox+cGx/gnxuaGxtaF96f2l9fHZ1dnV7d1xfcH5udWBjW11eUmduVGVbXmJraXZ6fnFsbWRrameBgGxzgWxsdW95cIV5boeAdoKAfoV2cYKNiH57enx/e4KKYGl8anVoaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2KiZ63mqGjn5GRlZeLmp6fnnt4n6eRnIuHpZSLmJl5eo2FfImRg42CgoNufH95c4GFfouRfWpofYKYiYGIjnx9hoSGfY+CkJydkomonYBwjIuMkoegoYqFjH2okYmQkpeTlpN4jKOgoJ2WmX+AkJqYkoybo6GkmZeRmn2Mg3d/go6Gn39+jIyPfJiloaKTmpGQpoyPgZqRiZKXm36Tkn6HjoF0dIJwd2F9gI2GcYuVfIiMcYx/goWGjmh3cXiLl5GPf5Z9h4pxgYZ6fHB3eoqDeXmPi4KUpZKLhI96hoaHhXaChImJfGdzfYB5e3Fsa2dffnNofHV2dH1zgGpeYHR2cHdkY1lfXlJraVVlWV9haGp2eYFxZ2tkbWhmgIFrbn1ob3FsfniHemyMgXOBgX6BdHaCjYZ/fHp/gX1/j2lyg25zaWGHaGxiX3FWdG9tbWB4aG1XanR2Y3V6e3Jiam96iIyespKlpZyOj5ePhpygm518dqWhjpiAjaOLiJqWeXuGh36Din+JgoF/cn97dHaDhX6KkXhnY32Gl4qBiox4fYCNg3mXgpaZl42XoJx+cIyCkZSGppuIjImDppWFk4uWl5OSd5GdoKGXk5Z5f46Yl46WmpyknZiSlJp4joSCd4OVjZx9gYmNjHOXo5+ik5mPj6KMi4OWmIOSlpl+mIx8iI2AdnF9bntkgHyKhXCHk3+RgmyHgoGAiYRldW57hZGXi3ySd4uIe3+Fe3pxfXeIhHiDj4iKl6GUgYKKdoiEgoJ3fIOKhnhhenl+dH94Z21lYX9qandzdHV9cXxiY2B0bnVybWFaYV5bbGVSY1lgYWhrdnmGcWJqY21laH2DbGh0aG5waYB9gnltkIZxgISDf3R8g4yBgH16goN+fI9tdol0dG1limxqYmJ2VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPnK6XpqiejYyXh4afk5eZfniqnYuZepedi4uYkHl8gYt9fIR8gYOBeHR5enN9gISAiYuAZF99i5WHfoSGdH1+in99mYWXlZiNpKKZf3OHe5OSiqaPjI6Kk6GSg5GQlZeRi4GPl5+ako+Qc3+NkpSJnZ2eppeXjJSVcouNiWuEl4+YeoeIj4lvl52apJSVi4yejIaCkpx/kpKVh5mIfIqJgXpxeWt1bHt+i35thZKClHhwgYN9fop/ZHFpe3+Wl4R+jHOPh4J4hXx1d398hH97gouDi5Kjj3iDgXSJh32AdHaCiYVwYXx2enF9b2JvY2R8Y25vdnN4d3N0YXZgb2x1bW9cXF9eXmpeUF1ZY2FobnR7iGtgaWZqY2l3iG5mbGlqbWiBfXt3b5CIc4CEhH10gYaJe4N9eoGEfXyOcnqLeHhubIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJmqoKOonYqKkYaKnYuVmH54r5mNl32flJGWk4h3fnuKfHuAd3iAgHB1dHxvhn2BgYp/fGFcfo+Shn+Dg3N6gId6j5KJk5Kdk6adlYJ9gX2NipKkiY6KjZibjYaRmJSWj4qIjJKcko+LjG2Dj4+RiZ6ZoqGXlYiWkG2HmINmhZiOk3qIhJCKcJaalKOTkomLmYyCf5CdfZKPkoyZjnuKhYdzcnVrcG51fIp0boaQjpJxdYB7gYGHe2RwbHl8mZN9g4hzkImAc4d4bn98f4V7hIuHg4uUp4x6h3t9i4V3fnFwgYaEZWh5dXVwfGJfcGFrdF5xant5eWxzcGV4XW5sc21yWFpfX2FrWlBXWGVjZ3Fxf4dmXWppZ2JncY1vZGlnZWlogXp3dW+OhXSBgoN7dYKJhXiFfHiEhXp/iXd/i3t7cniDamtgcGh0gGtyb21yZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqBkJyHk512gquVk46HoY2Wk49/dHx2hXh5f3Nze4Zrc3B6bYp2gIGIb3FbWX6RjYeAf392dYCAgKCGkYuTnZihlZh4in+AjImcnYqPhpKYloWJlZmQl4uLjI2MnImNj4JtiYuQkYqdlqGcl5SFl4dpg6KCZYSciZB+i4OLgXeTmJKfk5GJiZWNf36Pl3yRjY+NmpF8ioCDbnVwbG1vcHuFaXODjpiLcXeAdYKIgnhmcm51gJmOe4eDeZOQeXWHc2+IeoSLeYqFgoeNmqKHe4N1gYt/d3lubIKEgl5zdXNxcHlaX3FhcGtecGp9e3FtbWpsdmBvb2pxbVlYYWBhblhRVFpmZ2N1cISCYl1rbmRiZmuSbmBnZmBna4F1cnNwi4B1f4OAeHWAi4B5hX93h4Z3g4V8h4x/e3eKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx1dXSAg36klZqtnqaWhY2Df5eUg5CgdoyglJOGi5uNlo6LenJ4dIJwcoV0cXaIbHBtdm2IdoN+gG5tVVGBq5SHgniAd3KDeoKhgpOClZSZnJObeJJ7g4ySpJqTjomVmZKEh5eZjJSLiY+Ph52Ej4p8couFiY6InJqfm5WUf5N9aISbhmeFn4eRg5GCiXGDkZiQnI+QjIyPjXd7kpF6jouMkpaMfIh8gGt2am5rbGx7f2F6fo6WgnZ6gHiDjHx5ZnNrc4aVi36HhXqTjnB5g291i3mIi3mHfICLj52dhHx6doGLfHdwamyChHtgeXFubXN0Vl5wYnJhYGxuenFocGZmc3RocWthd2VdVmZgYHJTUU5cZmVdeXCIfF9caXJiYmVmkWpfaGVbZ3B9cGxxdIp9dnyFgHV1fot6e4WAeIiDc4aFfoyNhHx5lXhmcmqDYIh9b29remBqbnR/dV90fXmGeHRzhX14oI+ZsJyljoKKf4OaiICMnoCLmpSPhYiYj4+PhHd0d3SAcHCFdHByhG9raXdug259fW51c1JNgt/IktaTe3B1g3WEoIOUd5aSmZyRmXuUc4WQn6GTk5GJk5yUhn6WlomNjYiSjYicf46Ad3qMfomMipybnJuVknmMdmaHkIZrh6KEkYiXg4ZjjJGZj5WLl4yNiotxepSIe46IipORiXmFfH5se2Vyb2trenlbgHmPj4F6fX5/ho56emdyanKKjomBhYR8lIprfX5tf4p9ioV8g3mAjpSZmYp8dXeDkHhybWdxgIVua3VwaGp1blRfcGVwWmBscnhna2tiZnhycHBjX3dgYFZrX152UE5LYWdjXXpwiXRcXGV2YGFlZY9kYWdiWGlzc25rcneMfXR6hoJ1dn6Lc4CGf3qJf3KJh4GRi4h8fph2ZXNufWWIfm9wbIBZbG55eXNhdnt7jXZyd4p3eZ+Lm66bn5CChXeIlX59ip2IhqCRj4WMmISTjoeBdHdweXFvhG9tb39zZWV5cX1ten1qaGtjpJrB3K7woXJsdoR2haOGkm+XkZahlpyBknKFi6OXiY6VipGdloOAlZCFiZCAkYqJln6HenV/iXiHhI6cmpiZjo92iXVthYiKfImig5CJnISFXouTl4uPiY+Li4WJbXuWgX2IhYmRj4Z2hX19a31keHVqbnlzV4h6koeFeX6AgIWMfnhlcml/iY6JgYJ+i5aEa4F1bYaPgY6DfYF4fo+UkpiPdHJ3h4x1c3FndnqEY3VucWJqd2hSYXFna1Zfb3R6YXJkX2h9cHJuWmNyYGJWbllceE5NTGRnYV53c4luXFxkeV5fZGWFYGNjX1lqcmtua3N3jH50d4SBeHd7iXGDhHx+iHt0i4mHloaMf36Xc2d1cXlti3tudHGBV3F6dnlyZHd5h4xpdoCJcn+ch5innKOShX1xjJR4eYyehIWhjY58lo2AmYeEe3J3cHRqcIFsam18dV9heHd7cXV8aGBkfOvatcnD3IdybHSBdoubiY5qmZCQnZaUgYlxhYmgjoWLlYqMmJR8jZKIg4mQe5CLhY+Bf3Z4g4RyiIKTnJaUl4aMdYZ9boOBiIaYoYKTi56DiWGDlY+HioaJjYiBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXR3a1qMfJKChX1/g4CEioJ1YXJqh4CPioF+fpGQfG2Ba3eEjYWRgnuAfH6PkY+ViG5weYyGdWtxbHN5gmB1am9da3dgUmVyaGZTYHB2dGFwYF1og3FzaldnaGJpWG1WW3VMS0xmZ15icnOFaltcZXleXmRne2FkX11Za25lb2p0eIp+c3OBfnt2eodzhYN8f4d2doqGjpmBjIJ7k3Vsd3V5eJN0bnh6fVh6hnGAb2d5d5KCZHaGhXCKloWZoZqiiod0b5OLcnePnH6LmomJfKB/hJl/gXhydG5vZHJ/aWZteHhcX3l7e3FxgGphZmF/1baOkaZ4bnF3fHGTkY2Ha5qPiZyTjIZ7aYeLmYaBkpGGh5iOfI2MgIGKjXyPjH2JhHp0eoN7cYaAlpqOk5OBiHWDhXWCf4mRnJ2FlI6ffohigJOIhYiEio6AgINnfZGAfn+CjI+Qfm2CfIJ0a213dXR3dmtjjYGOgIV+fIV/hIh+b19xb4R7jouBe36Qh3lwg2V5gYmFioF6g3x+ko2PkoRubnmLfnVtbmtse35kaWxqWW53WlJqc2liUWNzeGxiZV5aaoNuc2FbZ19kbF9uVVtwTkhPZ2VcZ25xgGxaW2NzYFxjbHdkZV1dWmxsY21qc3eHf3FwgHt9dHiGeIWCfICHdXmJgZKWfImGdomBcHh5e4STb258gXdeg390gW1penOUc2dziHxykpGDmp+boIaIdnaVf213lZh+iJCEio2afYyadn52cXBsamF1fGdianV6WmB4fHptcX9lY2dnV52PX3FzlrzEhHdxlIqQf3OYjIedlI2IdGuIj5WAe5SMgYSbjHyKhn18iYx/k4h1iYV2dn2BcXWGgZ6VhpSPgoJxf4dzg3qIlpuWhpONnICIZn2TgoCGhIqJcoJ+Z32Le3l/f4eLj31pgH2DdmZveXhzd3Nsao6FioGKf3iCgISDf2pdcHd6fYuIhXuAjn99cYBoeIGGiYSCd4J6f5aLj4x9bWt6iXx2dG9paH13ZV1xY1hwdFNUb3NoYk5odHhmYV5dWG+Ab3NZZWJdam1gcE9ZbFJEVGdhWmxubXtvWVtebGNaY3B2ZGdcXWBsamNsaXN3gYJxbn57f3R1g3qEgnyChXZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaYF5en5ubXx2lmtqeIR0a5SNhZ6YoJmFiG9+jHZqeZmPf4KKgpWXinqPlm96c3BsamRgdHtpYGVye1thc316Z3B6YWVkjrGyd0tiWqXa0Zdye5KMkXl/loyFmpKNhm9shpKRenmTh4GEmYp8hn94eImKhJWAb4qHcXR9e2p5hoOlkYWTjIN+bn6CdYJ3hZmYk4qSj5SFh3B7koN9g4SKhG+BeGiAhXhyf3+Diod8ZXx+hHZjcHOAaHlxb3WZjIaDint2eICEeYFqW298cn+Hg4h9hYh6iHGAbXCChY2Cg3GDd3+Yi4yEd21tfYR/dnplaGp+cmFaeFtZcm5OWHJzZmBLbXd1Yl5bW1l1fXJvV2ddZmpwX29OV2lSP1lnX1pwa2d5cVtbWWtlWWNxeV9oXV5lbGhmbGlxeH+Hb21/fYF1cIF7gIF/gn92gYWJl4pxgo1xe4Z8enmElIx1a3p/a29+dIB9b3J8e5Rwb4B/eWaSioKhmJ2Sg4Vnh4NwZ3qXin5/hYKZioF8jY1peHJra2ZfYW95bV9ib3ldZGyDemBxdl9kZdXrvosyOj6LjoByeYaJj413hZiNf5OOjX9ubIWNjHV9j3+FgpWJfIJ4bnaHhYOWd26HhGt1e3VleYOEp4yDj4yDfW1/c3WCeISaj4uPkZKMi4Z+e5KHeICFjYNsgHJpgH54bXx7gYqDeGJ5hIFxZHFofm11cXWBm4uBf4V+c3V9gHKAblprfHN4iIGKe4Z/fId3eXBrhoKOgolxgHd+lYqKfnRtanaAgHV1XGlpeHFaV35TWnJlTFtzcmZbSnF4cF5bW1lcdX91aVliW2dlbmJpTFdmUT1eZl1ddmZfdXFbWVVvZFplcXlbaF5gZ21namtpcHh9jm1qgYR/eW6Ae32Af4J6dYKBjJOFcICLbnd+gXt7iJOJf2l7fWt0fHKGe3N3fX+MeniEfnxrjIyEm52WjIKAbI1+a2h/j457fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXDVar7V1aoCKfpOGd4eYh3WPjIp3cGyFg4d0eYl4iX2TiHl+cmd2iH59l29whn1odnluZXqJhaWHgIeNiX1tfXV+f3uKl4aBk5CXiIuEiXyPiXF8foV8aX5ta4F7emp6doKHgHJgd4J+cWRyZ3WCbXV7hpSRgX2Bf293eXt0fWxXbX11c4qAhneGdYGJendybYh/jn+DcX17fJGHiHpubWltgoF0bl1oZnRyUlx8TlxxXE9cc29kVktzeWtYWVlaYHGAdWFdXWFnZGhoZk5aaE5BYWRcYHZhXHVtWFhTdGFbZW9zV2pfYmhrZ21saXB3fJNsaISJfXxwfn58gX+CeneAgImLhHJ7h29xd4R/e4mNj4NqfntueHl3ind9eICCh3+Efn56bYSMiJijjYWEe3aLeWtthYmSeX17gpKAgH2Kg3BycGJmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f76cp6TIuHKFhHOTfXmIlIR0kY2IcnNwhHuDc3WGdIh3lIl5eXBjd4Z5gJJpcoR1Znd2Y2p8hIiegoB/jo99cX5zg3h+kI6Cd5WNlI+Igoh7iYlseXl/dmh6aWx/eXNpenaAg31oYHiIfWpqc2h7gGp2gYyRlH56fX5xe3Z7c31hVXV7cXOIgoF7gnCGiXd3b2+CgYt9fHd8e3SNhIF1aHFobIiCcnBdaGN0b0tmdkxeb1VUWXNuYlFPdHliU1hYXGFwgnNbYVxoZWRjamRRW3FJRGRiXGNxXlx4aFVXVndeXGZuaVZsXmFqZ2Vubmhwd3qTbmmIjHl9cnt+eYKAgnx2fYOIhoNwdoNzbXeCgn6Ji5R/cYB8eHl6gYt0g3h/gYGChHqAdW99iYubnoh+hnt3h3xodYaNkXp/gHyJhoR2j4BncG5fZFxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6nZqceGh7NyinlwjnZ9iJCBepSKgHV0dX53gG9wf26FdJSGeHRsYHqBeYiOZXGCb2d1blttfYGQk4CBeZGSfXd6bIV0fo+Kg3KVipCOh4WFe3+GbXV2f25od2VtfHZtand2f398YGJ4hnpodXVjfntndYaOjZV8dH91cYB6fGx+WVZyfG90goZ+f3driIZzeGp0f4KCfHl7d3pxin98cmd0ZG2LhG10W2tgdmZJb29MW2NYV1Z4bWJQU3V2WVFWWF1gcoRvXGBjbWRjXW5iVF1yR0JmX15maV1ae2NSVlx1W1tna2FWa2BgbmZmbHFocHZ4j3Rrjox1f3Z4fXeBg4F7dH2DiIiDb3GAdXF1foaCiY2Le3d/eIR8fYWHeId8fYF+hIB7fnN2eIuOn42Je4p3dYN6Xn6Hmo15h4R0hoeEd4l6Ym5sW2JbW2FVanRkYFtob3Bmh3JhcWZXXGNrf3zKzoa5omtubottcoVyfoWLf3uShXp5dHl1dXtqbHZjhHaSgnZvZ198gXmLiGVxgGpqcWNYbHuGnImDgnKXlHZ9e22HcICJioZwlo6QiIWLhHt5f3JycH5naHJjbnhxamxxd318el1leoB3aXV5ZoJ2Z3SHi42UfXKGam9+gHhte1xYcH1sc36Je4Ftbol/cHZmdn6AfoB1enB5c4V7eHFlcmBti4Frc1hrX3ldSXBsTldWX1RVfGtiT1R2c1FSVFZdYnSGaVxga2pmYlluYVhjcEdBaF1gZl9cVnxeT1ZlcFlbamhdWGdhX3Jma2hxZ3Fzd4d5bpWKdH97d355g4eAdXN/hoWOg3Bwe3h3dXmHhoeMhnp8f3WLfn2GhISHf35+fYd/fHh2eXaRk59+jX2LbnWAeWSEiJeGc5KKb4WFgnqDdWRuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq56n7duYnSHaXR8cnqEh3t+jYB3d3N3b3t2ZWpvYId1joFzamJefnh4ioJlcH1oa2taVm94i6SBhX9xmZJxf3d0gWx/gY+GcpOHjIeEiYV9eXVzb2l5YWptYW12amdra3l3endbZ358eGVzfm6EdGZ2ho2GlX9vi2ZreoJ0bHRiW216anN6inqBZXSGfW1wZ3R+d3x+cHpqeXqAeHdvZWxhbIl9bG5Wa2F4VkxrbE9ST2lOWX1nYk9VdmxNUVRVXmZ2hGdeYXBoZ2FXaV1ca2lKRGtaYmRWWFV5Wk5XbmpZXWxlXVplY151Zm1kcmZzcHSBeHCZhXZ/f3h/fIWHfXV0goeAlYJuc3l7e3NzhYeIiIR5gX12j399hImOg4GDe36Lg3t3fHd2mp2XeoqDh2p2fnxshIaUgHKPgnGFgn6CgHBmbGdXXVtcW1RlcGVfWGNydWl1cGRlYldbW2h/cG9yf3OJZGV5f2p0dnR0hIV4gYR6d3N1bmt6cGFoa2eGdI2DbWZeX3xveol9aG13ZmpkVldycI6nfYR8dpaQc3tye3lsenqPg3aWe4eGg4eEfXVxc21odV1taV9tdWRnZml6b3tyWWeBdnVocIB4gnZid4WLfJSBbotqbXuAcGVyZV9reGZxdYl6fWF1g3Zpa3F0em94d3F7ZX1+fnd1bmNlYWyGfG1rVmpjclRMamtQTE5wSF57ZmJOVnVlS09TV2Brd35mXWdzaWVfVmJXYnBdS0trWGRhVVRVc1ZNWXZlWl9sYFxbY2Vfd2dtYnBpdG9xfnV0mYF3f4B4gH+GhHp9doKDfpiFbnJ0fHp0cYWFj4KAeot1dJCAfYGUjoCFhHx+jIZ6foF2e6OlinmJhoVsdX17dYSDjXpvhXN6hX2ChHVuamllVl1bW1pTY25lW1hidHtqaG1oYGFXX1ppf2lsb39nbGFpenprdHV0b4aCe4F9dnVuemhqeWpfZW5pgXeQhGdlWGJ3aX6GeW5pb2ZmXVVYb2iPqHeBenyQjnh1b31ucnR4jn53lHSFgoCGiHZqc3ZoaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Afnl3YXaFhHiPhXOIcW95f3FicGhbbXZjcHKHendhcoBvZ2l4c3Frd3ZzdWKCen12dW9jY2JtfHxra1VpYmdUTG1oUEdSbEVheGZiTVRzXkpNVVllbHh7Zl9tcWpjXFZfVW5vV0pTaFhnXlhNVWxUS1x6X1xfa11dW2JlYHpobGFvb3Zub3d1epd9d4CBeYCAh4Z6eXqDfYGThHF0dH56dnSFiJB9gXyQbHOVgXuCn4V/h32AfoaCgIp7doSsn396iIiEbHKCenaBgYJ0bodvfYB0ioBqb25kZFhfWlpaVWJqZ1xaX3WCaV5tbFxhVltca4FlcnR8aWpdbHh3aHV3cm6HfH5+enZzbHpoaXhnXWRzaHp3koFjY1Rkb2eBhHZ2ZmhpYVdWWWhkkKhvf3iAi456cG97ZnhueYp6do5xg31/f4ZuZHdzZGlpXWxiXnBvW2dfbXVlemhddIBvcmtxe351dmJ1hYt7h4eAf3dydX5zYHBsWHByYXBwg3tzY3GAa2Bsem9paHl3c3Bkg3R5eXRxZGFkbXJ+amxUaV5fVUx0Y1FHV2JHY3dmYUxUcVlLTFhYZ2x2emVlbXFmY1pYXVh2ZlRKXGNYaVhYSFdlUUlieFtdX21bXl1iY16AaWpgbnR4bW9udoOXeXKBgH1/iYyGfnZ2hniGjH10dXWBeXp6goyOfX+EiWp0loF7ip19foV5gHt+fIaJc3GProx7e4eQfmZxiHp0fn12cm+GbHt+bZB6Y3BvYmVdZVZaWVdjZmtgXV1zhmlYcG1bXldaXGx7Y3F3dWxiW250dWh1dnFthXl/gXl3bm90ZWh0ZVtndWZ2dpJ6YF1TZWZqgoFzfGFjaVxUWF5iZJClaXl0goWQeGxueGZ3bHuDeXSIcoB4fHiAaWZ3bWBoYV9rYF51a1lmXW9vYnplW3d8a25ucHh5dHRlc4OSf4eCiHp2b3F8cWF3Y1lub2BvcIB7cmVxgGRebXVpY2Z3eXJrbYB0cntycWFeZW1ufWVpVGhZWlVOeWBSS1pZSGJ1ZGFKVW5USkxaVmlscntjbGxzY2FZWlthd1xUS2NdWWpTVkdZYU5IanZYX2FtW1tfYmNdhWloYW53eWxvanaBkHhtgn6AgZKIhIF2dYl0i4Z0cXZ2gXd8fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OIhHNwmaJ7e3+JlnhkdYl5c3l2a3Rwf2x5fHCRcl5wb2BnYmxUW1pXaWRtZlxccolmUnJtW1lYV2BrdmNqdWppX1ttdHJtdHR0a4Z9f4B8d29ubGRpcWNba3JkdHaOc1xXU2RgcX9+cYFcYmNeU1phXGSTn2VycYSDkHNranhsbm95eXpxgHZ/cnp6e2RmdmheY1thaFxed2lXYl5waGF3YVt7dmpqcm94dHN0aHGClYOGfoR1cmpwe2xldldbaWxhcHF/eXNlb35aYG9xYl5pb3xranJ9cW92aW9gW2RrbHthZ1RnVVhSUXdcU1BZUkhjc2JhR1ZsUUlQWlZrbGt8ZW1vcWFbWlhZbHBXU09mV1dpU1RGWlxPSXJ1WGBkbWNYYGFiXYxqZGRteXhrb2l1eYV7a4R9gISZfYKEeX2IbY+GcW92en10gYJ9i4+Dgpd0eIKThoGfiXWBf4F0f4Jwh4J1b6KXc3uGjId7ZneLb258cGd4cXtsc3ZzjWtedG5hZ2ZrU15cVmhibGxbXHGMZE5vbVxWV1VmaXNoY3RlZV1ab3ZvcXV1emyIfYB9iHeQc2Nla29hXW5tZHN4iGtaVFZiY3d8fHCEXGNfY1RaYFpjl5VjbnCDhIlyamd5bmVydXF6a3lzdW96fnZfZ3NkXF9XYmRZYXVmVl9gbWRhcV1dfm9oaXNxdHF1dmtthZOBiXuFcXFmbntvcG5SWmVpZHByf3VzYmx1VWJxa1tebmR7ZGt0fHFxcWlsX1hkaWp4XmZUZVVWUFVvWFFXVFBIZXJfYUZYa09JWFRWbmlkfGlreGthV1xVW3RkU1JWaFFZZ1RTSFpbUE54d1tfZm1qWmJgX16PbmJna3l2bm5pdnZ+fm2EgH6Gl3t/h4GJfmuTiHJndIB7dX+DfomOf4uTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYx3eG56jWBlfXFnenR5bG1xd4NnZHxtY2ZnaFNgX1VnYGxvXF5ujmhNaWxgVVZTbmZza2Z4ZGVdWnF1bnN7eHNuiXuBd5x7emxiZWxtXmBvamVxeX9nWlZYX2x4e3pvg19iXmhWWWBYZJyIYmtxgYZ8d2tqdmxbdXBqeWl1cm1ve4BzWGtvX1leV2NkWGVxY1RfYmlhYmxaYH5rZmtzdW9teHZraIWMf4l6h21wZW97bHFsYlhfZ2ducn9zcl5pbFNlcGRVYm1heGFvdHp0am5ral9YYGZodV1kVmJWU09ZZ1NPXU9PSGVvXWNHWmpOSl9LWG1lX3hobn5kYFVeVF10W1RTYGZOXWJVU0pcWlFZdXZdX2ZtaFhjYVtejnFjaGp4cnNtZ3ZzeYNzgoN7iI5+fIqIjnlukIp0bHOCdH9/iIWHkYSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2NjY2Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZmeoKCgoKCjgGRnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJybm6KkpKSkpKd8XV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6Oj4+Pj4+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5GLkYyOj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2MjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoWOioaNhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiI6KhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCIjYyGjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x8fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMkIiLh4aIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pi42Ki42Kjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5eXt9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTk5OTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkpGRkpKTioeUkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkoyLkpGRkpF3hpORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCRiXKKkpCSgHOJkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pc3CMkIx0d4iQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo93a3qQhnR3h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjntla4Z+cXWGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLiouHaF5oZWdjboKFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d29ecmxcaW1nZWhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoXmh1bF1tdW5mYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpdZ29tX2tzdWxZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVZiaG1zcHBzblJRVFBQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OVGFlZW5tbWloVE1OT1BQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0RDRkxaaGxobWxtaWdjW1VST05PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVFUFRVWmRrbWdsbGtqamloaWdbTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PkJKWWNobGtvbG1samlqa2lfVElFRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7OzpGTk1hbXBwdHBqa2lYS0JFRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs9OztLYG17c2pbRz1AQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5Ojk4QmptSDk3PDw9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT08PTw7R1w5PDw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APFxuQD5ERT8+QTxFXj0+PTs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT1BPEtjPTw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlMRkZ1d003ODg6Oz4+V2pBOzw8Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4OAenx3Vjw9Pz09PkZpdEw6PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4KDgHxdPkBDQEA9SnJ7WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2EdUxBQ0VAPz5Ze4BdP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExNTE1OTElHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbISHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpUgYOEhIKChYaGg4KGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1NTc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouMiVQ6ODY1Njc2NjY1Njc3MzU2ODo4NzY1NjU2NzY3Njg6Njc4ODk7NzU3ODk3OTc3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JlhYOBgIKDg4ODg4WJi4qJiYqKioqLiYqKgUc2NzY0Njg4NzQ1Nzg1Njc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeIiIiKioyKiYmMej45ODg7PD4+OTo6Ozg5Ozk6Ozo6OTs6OT09PT47Ozw9Oj07OTs7PDs8PDk5PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUBCPkBCQUA+PT4+QD8/P0A/Pz09P0I/QUE/QD89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lMSkpGR0dERkdHRUJBQENFQ0NBQkNCP0BESERDRUNFRUFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqIVkhNTE5MTkpJS0lJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUpJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0pZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjYyLiox/UE5QTkxPTEpMSklJSEpGREZISElFRUhGRkVMTE1JSkdGSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7PD06PkA+P0BDRklKUV+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjIuLio1yTlJQTk1NTExKSEdFSUlFSkhHSkpJSkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dIR0NCQUNVbnB1d3d5enh5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4tfU1NRTk9NS0pHRUJHSkdMSkZLTktLSkpLTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRkZJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIuLjXxYV1NTVVNOTEtKREVGS09OT1dVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hYV2thRVJRUVBJOztSU1JgdVxVVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh21cZFU6WFhYU1E/QFZVWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7enp8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3lucFlaW1tSU1JWVlRbWnWDWVV9kGBcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeEin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRFSUVDPlRkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11MRD9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZORkRFRklHSENESEdIS0dEQkFEQE9RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn+DgIODgoCCgIKBgmtNRz9AOzs+QEA/Pz5rUEthRUZISUVCP0dMTUdNUlVJQkU/Pzw9PD09Pz0/QUNDQD88PUI+Sk5HVW50dHVzdHZ4enx7fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQkJEQlxdT3tOT05OS0xNT09QTEtNV01IR0BCPDk3NzU5OT07Ozs4OTg5PzxCSD9cc3R1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZHSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aWE1LVFRTUFFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdXWGhza11WYXNrYmFfXmRhX15ZVFFOTk5MSUhKS0lJRkNRUFNbV1RUTlFTWVNcZVVPU1NRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTpHbnF0d3h5e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcG5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz49Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF1SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR1eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nU1BTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7PkA+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFFSYVxRUFJPU05PUExMT01LTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZEP0JDPjxCRz9CP0FkcHN3enp6e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk3Nzk/Qj47P0JAQD5BREpFQ0dHSUdJRUJCPz49Q0JBR0lFTk9iZVFNT05XS0tNS0xNTU1MS09OU2ROSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxAQkFBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNMTlJUTEpJTVRGSUlKTEpLTElKTE1PUFJQS0dDTEdDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktER0I9Pj06OTo7QUI/PUJCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQENFRElNUEhIS0dIS0RISUxNSEpMSElKTEtNXVJISERORkFESkpNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3p5fHp9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZFR0VGRkdFR0JDQD48PTk6OjtAQ0A+QkNFRUlFSUpMRklJR0ZGREI7QUNDPkBDQ0NER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQ0dNS01MT01NTk1LSEhJT1JRUk5SZmZmcW9zeHV7enxsaGpvZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NCRUBEQj5APjo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1ERUI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIUEtESU1LT01PTk9QTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPUJBPkE9OTo9Pzo9PkBCPkBCREdKRUlGSUhGRkdFQ0JBQUZGQ0JCQkRFRUdHSUZMUUxJT0pKTExJR0hFRkVEQ0lJSEtKR0tSTUJOT01RTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREQ8QUBAQzw4Oj0+OT88P0JAQEBERkhFSUZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFSUFFRTlBNTlBNTE1TV1ZYV1VYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRDw/QkJEPDc6Pj46PjpAQj4/P0JFRkRHREVIRkRFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR01LTEtISkxGSUlLSEVLS0xNTk9SVFBIU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnaWhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkU8ODo+Pj08PEFCPD8+QUJGQ0VDQ0hFQ0VFRkdHR0lGR0tIREhIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZDRUVESUVGRUdFSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTUxMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1JSUFZbW11eW1xeX19hYGFkXWNgZWZgZWhqY3NzZmpnZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SkpMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZJRklGRkRJSUdJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdESElHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUVDSUpKSUlLR0VLSkdISklJS0hKSk5MTktJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVKRUVKTU1LTExHR01JR0pLSEtLSUtLTkxOTExMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1KcXl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEQEJCQD5DRkdCRkNGRUZFRENISEdERUtIR0xNTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUpJSktPUE9OTUtOTkxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNHREhHTEhFQ0NIS0hIRkpMTEZOTExTUkxHTE1ITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFAPkREQkdESElNSUZDRkpMSUdGSk1MRU9KS1dSS0dLS0pOSUhKTElLSklISk1NTU1JS0tLU2tjW2leX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElHS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVtdWF1cXGNmYWFlYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQENIREZHQ0lLTEhGREdLTEhER0lQS0xPS0xXTElFRUhJSkhJS0lMSkhGR0dJR0hJRUZMSUpMT0xJUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRENCRUlFR0dGS0pLSEVFSkpLRkVISFBKTU1KTVJJR0VBSEZKSUtMSkxKSEZESUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNHSEZIR0hLSUlJREZLS0tFRklKTktOTEhMTkdIRT5HR0xJS0xLS0tJR0RJRENERUJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZKR0hHSEtJTERES0pNTUxMSEpKSEpGP0dHTktLS01LS0tJRkdDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGREZLSkZGRkhHRklGRkZJTEpORkRLS0xOSkxJS0pISUZCSEhRTUtLT0xKS0lHR0VEP0VDSEhBQkdHRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTEhJR0RIS1FOTU1QTExKS0hJQ0RBRURIR0JBR0VEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV19fVFBOT09XUVxbW1xcXl9iZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxMTE1LSkpHRUpOUVFOT09NTkxNSEtBREFDREZEQ0JFRkJNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NT1RSWlhYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxHR1hMR0hKSEdNTFFRSExLS0tOTVVOT0tLS0dHS1BTU05QT05PTk5HS0ZgRURfTEVmZEVNW0leW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYmJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRkdGSEVFS09TSUpGYFNISk9KSU9NUlFLTUxMT1JVUk9PSUtNR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXF0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1tmW19gYWFhXWBiZ21wbGBwd3R4gYGCg4OCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJTEVRVkxLTklLUlhXUU1PT01RVE5PUVBLS05HTVBTW1pTUVJPUFBQSkhaeF1UeGVoWlNUUnZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b354boByX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpLR0pQT01NSk5WXllVTFFTTllaTVNTUk5LT0hRUlRZV1ZQVFBQUFFLSGd4bGN4cm1bS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anV1cIFgcmZ9aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J2eX6Bc3V6bnx9eXdybk5LU3VOQ0JGUFBISktJS1BPT09NT1pgWldLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txbm1qcGFjZmNvd3hvbXBzeX5ucXBqe3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbGB2dWtpdXt7bX54a3xwXF5fYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEtLSUlISFFQTE5PTEtSUlJPU1JXUlZUUFdbVlZUVFRhX1BOTUtUU1RRVVZOTkxNT1BKSFFOUFVMS0xTVFNTVFBWVVFRTlFRWFlSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1hYUl5ZV15WVFBZUlZXV1dYXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xNTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09LTVZUUU5VU05PTUxRUEtKUlFLUU1LS1BSVVNRUlNTSUhMTk9RUlFRUVRWUlhXXFdTU1BSVFVWU1pRTlNSWFZUWVZUWlZUUlVUVFVXWFZdWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLS09PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTE9VU05RTk1OUVVRVVFSVFVOS01PUVRUUlJRVldUWVpbWVNVUlRXV1dZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11gYV5bYmJjZ2ZlZGJYX2FiXWBnZGZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FbWlhXWFtZWFlWXGpkVlhZWldWU1NPSk5WVFBPVFBQUE5MUVFQUlhUUVFPTU9TVk9XUlRVVU9OTVFTVVVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUV1ZWVllUWFhWU1JZV1ZaXVldX15VXl1eYFxbX19fX1piYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xYWltkcW1oZF9bWVZVV1FMTVZTTU5ST1FST0xQU1JVWlVTUFBNUFhXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpYV1xeWl5fYFVhXGFhXWBiX11gXWNgY2doZGZgWWNgYV9fZWRfYGNbWlxbXFlaWVhXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXFxcWF5cXlZcXmpxd3mAY1xbVVVYUU1PVlNOUVFQUlRSS1FUVFlaV1VPUk9TWFdUU1VSUlpPUFNSVltWVldTVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVVNTXVhaXV5cYGBgVmFbY2JdYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRTlJaU1JRVFJUVVRLUlZWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxVVFdeWV1dYF1iYl5ZX1tlYV9kZF5eY2NhXmVmaWRmXV1kYWBgYWJkYGJeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFtUVVZWVFRUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVVFRU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1taVFVWWllaV1haXFZVWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXFVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhYWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSV1NXVlVTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWVRZWlphWVxWV1hbWltZWVpbWFZdX2BfY2JhZGRcYlxgZmFkZmReX2RiYltmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRZVlNcVFZXWVZWXGBhYmNhY15fVltgZGFfenVvaFlcWlVXVFdbWllcWVhZYFdQVl5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1ldXlleVVNZV1lZXWJaXlZXW1xbXFtbWltZWV9fYGBkYmNkZWJkWWFmY2ZmZV5hYmBjXmJjaWRjZ19nXmFiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNPVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW11bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllQV1ZXV1dWU1VUWFxcXmBgXWBcV2FeW15cW15YVlhYW1tfYFxfWFlcXF1eXlxbXVhbYGFeYGRjZGVlZmJYY2VkaGdkXmNgYGVjXWVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWlhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXlldXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZGNlZmVmYlpkZmZpZ2NfY15hZmRaaWljZmpjZV5iYmNhYGBfXV1aWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVddW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpiZWNhUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlUWF1eX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaWJoamVkYGJhY2FfYF9dXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiY2JcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5aWFZbX15dYWFgXltgYWJlY19dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxbW1ZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8fX19fX18fXx7enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29vb3l+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKgkU+Pz8/P0AwKisrKyoijNvS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29ueYB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzNCEaGxsbGxCP7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXp5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1dHNzc3Nzc32FhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnd6eHp5eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH15e316fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgYKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHl7fnl8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8eXl8enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHx6e3x7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4enl6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXBwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJycnNzcnFven9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXl7cHJxcHGXg25wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHJxfZ56cHFvhqB8b3BwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFynZ92cHScn31vcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnCXrJBuf6OffnBxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycI6xqHqIpqB9cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3NznLOmpKexonZzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHh3d4GrnaG2pqKnhHp5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx8fHx7kqaZo7Ghm6SUent6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2VnoqUrJ6en5qAf399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgJSjnJScm5eOm4N/gYB+f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f3+AgYB+mrKpo5ufn6WnkX18fX6Af35+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f4CBhJWvpp6ln5+epKitn5GHgX+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KGiZamsamem6Wfnp+gn6OoqKOXh4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4WKmaOfmZiYnZ2eoZ+bnJ2Zk4yFg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCBh4yRlZiZjZWdm5iUjYeGhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBgYOLlpyHjpuajIeGiIiIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SEgoGEi4qSjoWEg4OFhYWDhISFhYOBgoB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKBgYGAiJGCgoOBgoCAgH+BgICAf4B/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAgICJkYCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/gIyVgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmIqDhYSEhIKAkpqGgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYycjYCCgYGCgoWUk4yBgoGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeMgIOBgYGAj5OMkIGCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4t+hISDhIKDg4KOiYWMgoKDgoKCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf359fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkZKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFhoaGhYWFhoaHh4aGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmLi4qKiIeHiIiJh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7fIOHiYuLioqJiIiKiYiJi4qJiYiIiIqKiYuJh4aGhoeFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJh4eGiIeGiYmDg4SDhYSEhYWHiIiGhYOCgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGhoaEg4GCg4SFhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4CDg4ODg4KCgH19f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIGCgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f4CAfn2Af36AgIF/gICBf3+AgIF+fX1/gIF/f35/gICAgICAgH+Agn+AgoGBg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/f39/fn58f39+f4B/fn9/gH+BgH9+fX5/f359fH5/gH5+fn9/gH9/f3+Af39/fn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gIB/f35+f36AgH9+f3+Af4KAf3x+fn9+fn18f3+Af35+f3+Af39+f3+AgH59gH9/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+f36BgIGBf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOAgoOBgIKAgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoaEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl4eHyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgYGCgYOGiIyFg4KCgYSChIOCg4WEhIWDg4ODgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhYSEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl5fIGBfoiWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYSDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6e3x/gYOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WFhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fXx/gYB9ho+Bfn2Cfn9+gIJ8fIB/goCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMjI6OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX5/gHx+fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoGBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36LhIGHfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjYyPjYyKhoSFhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen5+fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX+AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx+gIKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISDgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fH18fH18fX57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko+MiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn2AgIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiYyRkI6KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3t5enl5eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18fn58fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiPjouLh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX19gIOAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOBgICAgoF/gIGEgX5+gH9+foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx7fHt7e3x7fHx8fXyKi4mIhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgYCAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt7foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYGAgICBgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhISDgYB/gH+AgX59fX5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn59f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OEhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af398fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4GDgoOAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2BgoSAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgIGBgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgIF/f4GCgYB/fn+Bfn+AgoGAgYOChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx+gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Bf35+f39+fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgICAgIB8f3+Afn+BgH9/foF/fn9/fn19fH+AgICAfn9+fn99fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYl9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH17fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKAgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh6gYF4eXt8fH18fHt8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKDgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31/eHd2eXl6fHx8fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCg4ODhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYSBgoKBgoF+gICAgoGCgYGDgoCBgICAgoKBhIB+gYOBf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDg4KEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhICChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7fYF+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgYKAgoB9gICBgoOCgoKChIKAgoKDhIKCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4OBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4KDgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+f31+goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fn9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgX+BgoB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fXx/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SDhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgoF+f357fHt+e3x8fX9/fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoeFhISFhYOEh4aDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFhoeFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357fH17ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIh4iGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4OBf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt9fXx9eXp6eXt8fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SFhoaFhYaCg4OFgICBgICDgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoWGhoOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgYKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1+f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFg4ODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2djX19fX19fX19bW1tbW1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6axvr29vb29vb28vLy8u7/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIaEhISEhISEhISEhISClayqqqqqqqqqqampqaiw0tLS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PEJAODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKJh4eHh4eHh4eHh4eHhZetq6urq6urq6uqqqqpstLS0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjYucsa+vr6+vr6+vr6+vrrbS0tLS0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/O0NPS0tLS0tLS0tLS09PS1dTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/R1NTTzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1tbW1tbW1tfW1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/SrYODlc/SpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZu1ypq8uJm1s5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6CqsMSijICNxZ2XlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrPAnois1rqXoZ2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5m1u6erm6WymZavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P1aWZtMGgnZankJqEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NalmbLWo7Srn3+gqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpZqz1snYwZyAvK2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0Y/SEhHRUA8PD4+PD09PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1aWZtMmNoZ+fmaiWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQzs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0tajmrPCpKqjocOgq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HVtYLD2KmPkKzXwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHC1NLVwb/W0tXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj0+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6Njk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9CR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg1NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU5NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo6Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsrK2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo5Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tLa2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKuopqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5OSkZeanJqWl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlp6empqKenJ+hoJmRkpqWl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaWmp6alpaenpqWjoKChoJ+ak6avm5qZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqSlpKampqSko6KioZ6dmqOKh5ucmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqaupKSkpKKhoZ6bm5+gW4acmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKCqtLCio6KgnpybmpqpcFCLm5ucmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaGgq5OcrqCgnp2amZqimVNaj5ydnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCgoKOhaJesn52bmpucqnNWX4+enp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6dqHRopKObm5ucn6FrYmKRnp2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZybmqeCbIGnm5ucnKKSbGRjjZ+cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmZqmhHZwk5qbnJ2dgmplZYygnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyZmJmZpo11fHyOmp2flnhmX2WNoZ2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZiZmZyVlJ17f5yioIaMf2BmkaCen56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmfqZyKa22uqqFnf4t6Z5efoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmXpqWIcF9qpJSYVmd7fXydnJuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal6mZZ0VIdJmDhU9FYHWAlJGNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkJathD06PHiMdm5ROTVedoKHgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg36Yo1pebFB5oZaDU2NqRmd4gYKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+nYxZmKNvtryxvIJ5mn1OdX6Fjo2Lho2UkouQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhH+CfaB4jNzMs9axnri8ZWJyYWCIi46LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYx/iI2Mi4uIkoqaaLPJtMjUr666p3SLqWpYiIuKkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmRnqGdk5eboZqenKOjk2+pm5HCvraxmI13XcqaVYKPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6qps6CHkHmUrJSMj315cmednGN4naKknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipamnp6mqjnhXg417eoBwbmtzdnx9dqCpp6Cioq6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaanaSmoqGpnnxoS2l0bnB4amhkamtueoSWpKOgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioaOnoaaupqenr4RsYktdc25vd2diY2VfXmp0fo6boqGfnaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqmioKGoqa2ws7W8spZvZVxHVnZyc3xnYWRqWlpgY214f4qZoqKhopmWnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOrqqiutri8wcO9r5l7ZWRbQF1sbnh7a2FfZ1tYYF5hZnBzeYGToqidnqGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7O6xtDa1ca4qJZ9Z2JjVT1eamx2cXJkYmNZV1xfXV1haGprbnuSpa6npZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1pdmtwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW90uDh0LqlkoNyYVlbW08/V3JpXltubF5dV1lYWlpYWVlbZHKGnbrIvrehp6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDvMPIztTQwKN+YVVTVVhRRkmCbnqDf15WWFdcW11aV2B8nLK8wMbHt7e3qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwcXIyMW/xa2KZVZYVVFJa3WjrKNPVVxfYVxdbJCxxLy9rqmyt6u1sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2pmaGFrbGdudXJydXFnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEJCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/xMPGxsCxlMTI0ruLZlVWUVZmoq6dTlZXWFtnh7O3rrCtsqaqqqqrrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhvemppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMS5tMC2s77GyLCAWlRTUJmxkUdPVllxjqa8sKWttLWsr6Wlo6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpaHZaZ3J4c3lmZl5kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvri9wMLCw6FuVUqNtoVFS1p+oaKntLKtrLi1s6ypo6GtqaynrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXmpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMe/xMfExMjLxqxzX3ZfS1eWt7nAvb65vLq8urysraapu7q5t7+ytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aWpqdG55bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXFw8bFyMzUzIZJTFegycHIzcbEwcTHwby+tLGwsMK+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZnVvdGNdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPBwsbGxsrMe0eFzs3HzNDFtr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnY2pkYmttbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvr3BwL/Ax6VKn9LMxcnRwa+9vbi5u7u+t7Sxub6zvL6xubW4u7a8tLW5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjY2RqY2djW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvEvbrAxL+9vLi8wMWvT5nNxMDByb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWOu7+7w7W6x7e2ubu8uLm1usTIqlCRyb+/u8G+uca9wr+8xbi2t7S4tra7u7m2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZmVmcGpla2hYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/FeazMvce3ubittrS3ubO1srrFyp5SiMq/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdxa3RmYm5gXFRIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrnaEvcjPwsC4rrW1u723ubG+w8eTWIPOw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudW94Y2diXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0ZlzdrDR0czKxLW6v8TIvr60vsC/gmZ4y8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4J0b2xsdGxsbl9jXmFiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysKHdXanzMzLzcrGwsPLzsG8uLy6sH13a7zIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWRbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7rNvDvra+wL6+uqacqrO3w8Cme3l7nsTGy8jBw8DAycrBv7u5saORhXqvyMXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3h0aHBeXF9cWlFFRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFt22uzr22ucC8qn1uaG5tdIKXmXR6fpq+v8bAucC8vsXEvb24sq6kp5KSncrDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXZ7cW9qXGBgWVNQQUZJR0tARUNIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbJ2grO9trXBpIZpWl5gTlNbXHB1eYSjuLfCurO7t7u9v7q7u6+iqK2epIG+xcO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d29yYV9mXVtVSj0/P0dHPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmnhHiLobC1nGpmZ1ZZX0lJTVBUbnmJqbC3vrmytbK8uby2ub61lqq8q7F3rMrEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXV3dHdybGBjYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/GqYd7doyhmF9TQ1lVSGJqVU9FSmOQpK6vtrq1tLKsvLm4tbjBvY2ivq+wdqfLwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXVNPTkE+SkJASkpANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7SQgXmIkG5OSz9lWUJPeIGTaE1CXoSxtbO1srSvrLu6uLa5v8V3irSnnmaqv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLavqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211amxdXGtVXVtQTkhER01CRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHxYRkFPh1hKSll4joNjQVSjubO0srCxrbC5uLa7t7u9kqOzrqR0rLCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh1dG9lVWFkV11RT01IQElSRE1DPTg4NzU6Nzw+Ojs9ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZVoTUBTeXFQSUlLaJyAWkVUr7uxrLOvrqyttraytLWuqaefmpuen6aonqCoqZ+hp5ablpeOnZSPkJaNl5ukqKCgoqKhpaWdo6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56em5mml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjd2xuXVFpVVBPR1BNTENQUUA+Oz40OTo1Ozk9Ozo5PDk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3CqqW8Z0RTm39RWElLYUpWjmJlZIKvtaqytK6qq6+wsrOtpZ2Rl5OOl6CfoqCco6SfnqiUm5aXjJeRjZCXk5ido6qfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ua3tkaFZSZE5KSEdPU05LTkg8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCqxr/Kn09Bc5hzUG5KTGNmdXRgXGJzkbKvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl5YGJTVmFISUpLU1RJU1FNOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpcbGjFdTSmakWmZ9b3JbUWtjXGZiYGyRtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlyd3VwY3d2WFdjYGRpWlpXZ62urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgH14dmp3dV5tW1JhSVJVSEZVV0pDTUc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCkf2+CcGBjWExbUlpMTFFZUkhOTkiZrKqppJ+fmZKSlJiYlpaVjIiLjpWdnJ2dnpeemaafoKilsaqnrqOrrrawtLKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOenIliV15lYFdNUUc9PkBDRD8+QlJ4qa2pqqWfnp+io52enZqcm5STlZSenZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a7u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqCjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJra3VycWhWXFFGVUhESlBJP0VBNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFFGRDtDP0Y8Pjk2Tn6qs6ejo6KgnqWrpp6YnJSRmZ2ZlYyKhoiGeG2IoKSiq6y0vLbDvb6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3w8rKw8HHv7q0uru1u7ewtrKqurKuu7i/u7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWVtGS0xFRFRNRUNFNzo/OjU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz49Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklafG9hQT1cjq6soJmbm56emZeXmJKNj5eXk46NkIyCg4J3cnFtcI+mra60ucW7zcfLvsHMzc3Mx8nRzMzMx8nFxszQ0tXO08m9wL/Du8bFyMXR083U0NPTzMrCxcbGysjPwMnRzMfGyMbCvMPBv7+/tr6zrb/Aw8PHxcfEr7+5sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXRzZWJncm9mXlpaQ05MREZQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E/PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaWZcVElEQD9Lhp6kmIOgsq2jnpyfmpiXlJKUlpGQj4yIhIOIh4OAgYGAeXFyb2x5pLa6ub7LwdPR08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fS19LV1tPUyMzHzM3K083O083GycrKwsbMx8nJxr/Ds7PIxcvLy8/Hyr++v73BxsXNzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZFZXUURORkBJUUM+Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DUrDSvbKvppycnKCkoZ2alJOVlIl9eHFrZWJocm9xe4WKgHVwbnF0cIWzw77F0dDX1tXS1s3U1tfU09HT1NTTz9LE0NPW2NXW0svJztHLxs3RytLV1tnW19PX2M7Sys/RzM/QzNPQwMnIysTMzMzPz8XHyLbAy8DSzczQxsrJwMTDyM7N0NHPzcvIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYGVyY11SXElKR0FFSUo+O0E4PTU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFZSUBBREFGUXayr6aalJefnJqgoJ6bnJqViXdpY2FfX2BfXl9fXWFsdXNwcG9scnF1ksTIx9TW19fW09bQ1dTa1NTOz9XU1NHRzNHO09fW09XQz9LT0cnT0cjQ2NfY0djS19nU1czPz8rN0svP0cDGw8jGz87R0dLIzM3Ay83G08/MzsjEy8fHyczK1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYmNpbV9WUF9KSkNGQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu32NTV2dnRztC/vMzJtr6upqqooaOrZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cWVjYl9fYV9eYWBfYGBfYGVtcHBua29yd3eczMHT1dPY2NbZ0dLS18/TzsvSzdXU0cvPzdPW0tHVzc/V1dHF0dTK0NTV1s7T0djX19jLyM7Eyc/MyszAysDJys7Oz8vQzs7Mz8/IzNDQy87Lw8rHyc3KzNLTzdPS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXpIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3O1MzO0s3L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXNwsjKw8zExsnKy8/Lzs3QztPMxsnQzcjHy8XHwsbKzM3Q0sfQz87OzNDFx8G4ub3Dw73DuLKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHFoWVhoVk1HTElQUUI7Qz47Njg6ODo6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzs8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfDuMrV1tna29jMzM/I1tXEwrWvtKifrZd4bHBxeY+ajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYF9fYGFhYF9dW11ncnJwcnNxbXJ5pcfTz8vQ0NPUysXJycbGv8PFz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8a6xL/Gyr3DyMnOxcPHwMfNyMTMy8zPyMTE0MnGwsbJxb/Bx8zLzM/Cy8zJx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG90ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7uto7Z+aIOFpKuTjY2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19dXV5fYGBfW1pcYGxycW9va2xvb3250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIys3JxMLLycHBy9DFy8i/ucK7xse+wMbPy8TAw7vJx8m8ycfFysC+wsvGxcS+xr29wcPFzMXGvMDJw8XH0sXByb/KycbIxtHDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdGZpWmFubVpcWFJETEZCR0VMREZTQDU0MzM1PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1drY2c/L0s3NzsjBtcO+sa+2bF56faGRipKWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lrcG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7usbDv7zCzsPGvr61wb3Eu73Hu8O6tL3GxMLDt8C2tr6/u8zDvba6yLu/vsvDwcbCxcnHycbQxsLMyLLHycPOzMDFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2RWXllKRkpGSEtBRkJGSkA5OjY1ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysnGzc3O0cjQxtXU1dfNys7FycXHwbnFvauupmBkdYOTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25wcnmdvczAw7rAuK2wsaeqraynuLS2tLOztLu2vbG3sLWvsrvCvMHEvL+7tbK6vsC4yLm0u7fBwr24vcfBxLy1r7K2u7+0xbe7tau5vb7AvbG7trC3urPGvLevu7+1t7XFvL7DxcDExcbHy8XAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjJyMrIysTQzdLPzcXHwcbAv7q3ybaqsJlbZ3CKj4WIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaWZqbW5yfKTHwLi4tbCrrKeeoqmnnqqss62qrKq0rbaxs6mup6yzu7q2w7m6urGrtbm7tMK6sMCxvry7trzHucO2raqosLLAtri9sLGnsbO1u7ysrramrrauu7Kxqrmwrruuu7i7wMC+usO/xsPFwLzGwcfLuMXHxb/Hw8O6xMbCu8bJzMuzucK9u7OJc3Z2a2lgYmxpWVdXW0FMS01KRUFDQEZBOjk6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTQx83Bw8a/xMTDw8rCycq/wLzCurO1tcOuqrCSW2p/koeOj3t4fYmFenuEgXduXl1cXF1fYF9fZGNiY2RiYF9dWltaWl1aWlpaXGVub2hmaGlrbnKBrbqwta6lpKammqCkoJmcpauupKiiq6qsq7Cjpp+qrbS2sb25r7ewqK64tLO8uLS8r7i5trK8wbLBrqWoo6uxsrOovaqrqKutrrW0pqitoaSvqbKmqKiupqi3rLGzt7q6u7K8vr6+xL+1wsHHyLe+wMS3xMO/u7/Ewr7EyMzKv7/DwMCph3N0c2ppXGFvZFdWWFBIWVJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz83Dx7m5y8HLvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZGdlaGtvcoWqpaulnpygpJSdpJqXkaGiqaOjn6Wmp6atoJ2cpKatsrC2t6exraiqtKu0urG2tq62ubOwurqxt6WgpJ+msaisqbqqpKenqKeyraCop5+cpKasn5+npKChsa2trLK0s7Swtby2u8HAsru+w8GxubnCs8G+wLW4vL2+vMLHxcPEv8DEoIR4cWxiZmBrb2BUWV9ITmdPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS2vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLw8a4t8fAzL+4ybe7xbizxbizv8CstbyyrKWvs62ho5FpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGFeXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21viJ2pn5WVmqCVmqKYlYydoaKnnKCfpKWip56bo5ygq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+jorKlpqq5raKmpqCorauZoKCemZ2fpZqao5ycnq+pq6iqrK2tsLK4r7i5urC2vLu6q7OyubO9tLaxsba1v7a9wL7Dwru6vZeEe3NrX2VeZGRYVFdeSVdcS1BHSkpHQTw/P0A7PzwwNTUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4t763ssK0sbu7rLm6saKeqaunmJ6PbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGZmZmhpa3KNp5ySk5OalpqglZWQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqa+zp7qzpraho5+bo6Gto6Kqtqujo6aepaajlpmdl5mbnaCal56dnZytoauoo6Smrauys6q1sLKrsrm0r6qvsrKzt7Ouqa2usrixura6vcC4s7GUhnp1Zl9mXltZVlNaVUtbUUxKRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxwrW2va20uMHMyMa/xbbBwMfOt8DEvbO5ubK/trG5u62ytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCbkpOPk5WWnpaYk5efnaGclqGhqaSfn6mdnJurp6+wq5yjpLiqoaCuqLaqp6itsaS4sKS3oKOcmZmqp6Gbrbmwo6GknKKgoJOUoZSWlpuZmJaXnJWfqZ6ppKKdo6qqsa2otKyqp62zsKWrrrOxsLCvr6eoqLKusrWwvLS6uK6jlYJ6d2VfYVZZWFNSVEtNXkxQTEdITEtFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmJjZmmAlJGTi5CSk5mXnJWVm5+cn5agoKempKeooJ2gpqCqr6afoqO3qKGhoqizoqWopbCmsa2stZ6hnZaVqaKilK2ysZ+jo56emJuTi6GUkZOYmJOXmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqK6vr6uoqqqzpqarr7Sxr7y2sa+voJJ7eHNlYVxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaast7u8wcW6sbm1xMnJwMPGxce2xcSzwb/Fq7e3vba9uru1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpaW1lZWltXVVhXVFRWVVJUUlVgYV9gYV9gYWNkaYCRkYePjZKQkpyTlZakmaCXnKCloq2mpaWkpKOdqqulmp+lsaqgoZ6lq56oop+uramprq2ioqKVmKKbnJCrqbGcn6Kfn5eYk4mekY2Sk5aQmJiUnKGjnaShopWgoqWmm6OrpaKkqqOrrqWusqmmpaamtKaqqK2ztbS5urCqrJ6Mc3FwYFtXVlZSRlBPSFpcT1JKVExTTEVHSkQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DJurXAr8XIzLrByszItcm8sb3Dya2xuMG1vMC8tLWqrKaVmZubiIFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXF1eXl9fYmRtjI2Cj4SOj42YkpOSnJqinJuhqamrqaynqaakmaWvpZWapa+poJyZm6Ger5qcq7Sgpqafo6ShlJOblpaSqaqtmp2goaGblJCMmY6MkYySjZaVkJ6ioKOdnKOVm6CjoZeiqKOjqKugq6+krrimo6SjrK2qqKuvs7eyvbWzq6+YhXRzaFtYWVNVUkVYTFFbWE1VT1FMUVJJTkpDPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7evqKevrpupqKy3tqu8yru2v6zLxsW4wc7PyLPEure7wsixrbi/t7y9u7O1pqmglpeYlod6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FZWlpaXVxcXl9gZX2KgIl9io+IkIyWkZeZoqCboKuqpq+sqLGlqZqgraGVlqSop52YkI+anq6XmaeqmaCdlKWhn5KRkpGTlairpZqZmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6WmqKiooLGwprG9qKCjrLSrrqewtbC5tcCxrrGrkX5yc2JWVFZOUkpHVlBSUkxMWE5KTE9SR01LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NzYxMzIxLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtre8vcHDsbCxt620tLuztKKjnZ2Xl5SDgHZrZ2xucW5ya3BrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRSTk5OUldYWllZWVxcXWFqfnh9c4eMhY6Il4mUk5ibmJ6pm6Crpqasnqiaoaack4+fo5qXl4WEkpukkJWjnZaWloiim5uUjI6KkJqlp5yVlZebkZKHlI6LgYyNgJCLkpKSoJqgopaUmZmVoqaZjZmkpqmmoaC0sqizuKGco7esqq6ksrKmtby1q6yxo4l5c25dTlFRTE9ETk5OUEtGTk5KSk5OUUlNSkFITEhIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS3saWnpKqloKmmpLOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+tqbCepq66r62fmZqdlZSHe4NuX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5wdG6ChoGHf5CDjoqTkZOdoY+anKOipJmll6KclY2ImZqMc42Dfo6XloaSmpCUjo57mY+djIKJf4qYoKOekJOYloWOg5R+fnSKjnqQh5OQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmaa4pqaxobCunLC8qqmvqpmDd3NjVk1ST1BNQ1NOTFBNQlBRSElOU01ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtqKKmkp2mtq2joI+VlpKQfXd+ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlRTU1RVVVZZW11qanBrfYN7c05Yco+Cl4aNnJeLlJGgmZ2VlJaVj5eKgJSJXztWb3yMlImAjJKMkIaGc4uFl4F5gXuGk52Ug5WOkZCDhn2TeHFwho19ioGRjY+XmpmTi5CKnYifmIeIlp6aoaCXp66praionpeus6Kmrpmsq5iotKOpraOTf3NuX1tOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCgrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKapp6Opr6intMK5sLWwx8K3s73Pv7mvrrXCp6rFqqOdmIOUnLGimpiGlI+Lh31zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtJRkhOUVFNT1JUVlhaYGxtZ3mAc1BCP3+VkpF9iJWMhIqNm46WlYqSiIaVh3mJf2BKUW54i5KEfoSNi4WAf21/f5R3dXZ4hI2acFGNiIqGfH54lHZod4aIfoqJlouOkZOXjISKiJWEm42ChJKalp6dlKSjqKmlpJ6csaqhpKSRpqmWoqqcoqaoiXZtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FRT0dKRD03Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKiosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hr6GnqKWnqK+sqrW8tri2s8G7tqi5yLi2qKi1tqqyvKeelo1/ipSolpWKfo6Dgn13cG9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1KRURDSU5PaFlPUVNUVVpugnJ1fWloXFSQiZSIdH6GgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI6OgXp+iquEenpodnuOcHJteIGLjZJ4e4B7gHZzcpJ4Z3WFhISFfJWKiIqNi4B/hIuNgJSEfICPmJWclpGfnamen6CdoKmlnp2YjaekkqCglp6fpIFzaGFdXUpXUFJHS1hST0pMTVJKSkpMUEhMUUxSVE1GSUI8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK8uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6RfnaGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdoyWmI2OfGd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKAfH90ZnZ8hmxvaHN8iYyHgG15cX1xbXaPcWhxgX6OcESLhYKDhX93eHqMhn2Me3V9jpKPmIuSmpujlpmcmp2eoZyWjYulmo6dl46WmJB4b25nY1tYWFVRSlNVVE9QTlFWS05LT09KUk9JTlBMRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzUxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoaawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlp2lqaShmJmPhZJ5iY6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZXBybIinqsB+dHlie3hvfHmJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKZbmh3foJtamRseYWQkoZscmx8bnJ8hmlucH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6MipSDlpeYmpCSlpeZl52WjIOJnpKLko2GkJaAb2pvb29ZVlhUUlFZT1JUVFJYVU1OSE1KTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrLCjraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+nh2GaaXN5ZX5vbX96i4l2goiGdGyaknR0fGpqnY9NeYWTiYSOZzF2h3Nsfn6DdGZldX+EhIWAZ2lsdWtxgHxocXF8bpONj3x0fn1xcW52bYJ/d3l1anmJgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trcGhmWFJaV1lZW01QVVZZWE5JSEVKSkhHQ0BHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWo6itnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+yoHF7eGx9bHGCgoWBeoSGhnlyoZV0eIFzdZSHNXGdqJ2OoaGEooV2cId8h3x0jK6NiYFoZ2JqbnJtcIJ1aW9YdXCOm5J3bX97fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gXF1eW1lYYF9STltaWFdMSEpGSkc/Q0FCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp5+vlaW0qa6xrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPj82NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8foWDf4x+daKaen6GgYSZhJucYYaqn52Lg5COeneJfomIjnOLl4+Ee11lcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0eXhrbmlddoZ8h3yHh45/ipKXg42FjIZ9cYR/hH11d3t8iXdwc3RmZ2BbW15TW2deV1BUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnJ2fppGgqqCxqK/AsrvFupaOkZSHe4Z2a3+MkYJ9ioSPjHiDgHOghIp9fIF/cIB+emd2a1JXTEBFMjExMzY2Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiHuJeXxxfI+Men2Jh36Xh3ahmoiHj5KUpY2tqkiGrq+vi4GAk4qCi4KEkqmHgJiYipx0bXyBhod9jmhnaHl/boWHgoVxhIZHbIB3cnl2aG1rX3Z9goh/h4SLeZSdnImLiJF/enWLdnx4bXB3foB0dHJsW15eXGNjWGdlXFRPUFZZUERMS0ZOSUNGQ0NAQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSl6CeraGmuK+zvbOXjZKLmIt9dHB+iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01NUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SKgZF8cYOen5Gcf3aGhYuQh5BpaHCEgXSNh4SKcYaCd4d/e3aFfW52dWZ/lI6HiIiHiIegq6KWiY6Xf3qCiHl5b2dreH97f3RsZV5bW15qXmJnYFpPS05XUlFJUEpETkdDSkRDQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDe4CMf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUxMS05WYGN/Z2dtdZ2bj5qSk4uNjpqIk4+di6CgkqOqpaOsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOop+TmJKEioWPmZGWbHB1ioyCloyNjnePhHFthYGKlpGDhYhxiKCWhpKJjo+WpLWpm42UooOHk4N9f2tqa32BgoN1Y15kYFtnbF1sbF5XS0dOUlFNTExGSVBDRE1GQkNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYaQh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpaKZoZeilJyeqJ6oq5+orKmqtperv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGIlaKbm3h6fpSYkqGTl5eBlJ57d5WSq7KJjZeffJSdm42SlZijoqa2r52RmaiHlo+NgYhsc3N9gX1zaWBeYmBiaGRgZ2ZcUkVKS1BPSUlMRkZNQ0hMRkdEQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFCTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK2srKeotKuwtrKyrbuxs72cs8OrusnLt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKWIhZSkoaCroaSpj5uwi5Wjpre7m6GjsJKinaKdkKOhq6+ssrWilKSqiJmJkomVenp+hoBpYmldZmNeZGReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhjV2lvWHqFdoGThYeCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4SBi4WGiJKGgoSJhoiHh3FuYUBFNjQ8My8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdIRDw+PkZIQ0VBODs8NUM7PUZLSUdIUU9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubWoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqyvtaKxq7G1u7e1rrSgp6ijp5qpr62yube4p5u2qIykjpGTn4Z4goR3WmNlV2diYmRgYWZgW1VKRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXCBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeEgY5/gYmPh4CGiIWJh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZQX1VJS0tBQD9HS0ZFRDs+QDdENz9CSkpFRlZTUF6PpK2jsbTDtrjBzMm2u8S9s7PAtrjBtb6vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupq2sp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwre5t7+3ure5rKywpbCprb2wvLrCwqyZuqiTrY+Xl6qIfYN+bFhkYllrZmpmV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpvfo6EgI2EbnpzeIdiuaGZooiUlJaSlJONkJaSh4Z7hoGNlYqAhIGKenyLh4Z9ioKBioOVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUlhYWmdZVGBgTFNQRUE/SUpIRUVBQEM8RTZCPkhHSkxTWlRdk664tbq4yL+6vcnMu7zAvLe1u7q2vbS6scZgdbKksZqeq72qpairq6SisrWgq6eflZafmJ+upaempZ+jlKOnsbSnsrO9tsG+08nJ08fDxczCysPAvr2+u7y3tK+4t7bDucW9wsevnrmqoauOpKi2iIGBc2BjY19YYmBqZ1JYYFZRVUlFRU5LQD5HRD1KQT1CQD1GPjxIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzM0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xyc3OH1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKfoN/g3h7i4OHfIt5gYqCl35zfXprZnB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktKSEZISEhHQUk5RD9IS1RUVlxaW5O5wLi9t8bAu7nKyrq2ubW4ubK3tbSutraZZHWonK1wXqKsnJigopuknqullJ+fkJSOlpiXp5+ln56amYOknaylqrCtuLC9udTRztbPyczSzM/Oysa/vsLKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5h/e21eYV1aX2FaZGNQW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj8zNzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU0RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vlpKQlG5sb3V1h7OsoaCfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYRze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqaWhgZmlpbFptc5atpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpHSk9fXmJmaWGXt8ewuLK7vbWxxMa1sLiwr7ursrGnq7erjbWnnZqnmk6anYyOn5aRppillYqTk4mQiZCRkZ2boZealZaHnpqnm6yvqLCntLTU1NTW0svQ09XN08/NxcLJ0L7JycrJ0cfMzcLQ0bevw7zEuaW1usKig3BlXl5eWWFYWmZaUV1XT1BCQkhFQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6lloyam5eLjZWRmo59iYuEjYqKi5CHfISCcH+IgYZ7h3KDkouOfXF4dWxxeH5xe254c2xpgXBtY2ptcHhpd3x+y7/B36duY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmr7aqrLzAsKu0pqS4pquuoKu0o46xrZqXmIyRk5GEjpuBjaaRnImDi4SKiYSLg5SVl5eTnJGcmJmZn56rrKSnoqytz9LV0c3M0tTU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfOnntwZ19kXlhhU15aUFFUUE9IPkBGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OWnWGhYp3bHdwfX5/oZ6eoYuMmJOTi4ySj5aEeYWQkI2KiYeRhn6Be3J+gIGHeoR1hZOQiH9vdnJrc317dntzgXhyaoBzcmlwcXp5cnq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hdXWBkXmN4en6LgZipo6Shn6CopaqwuKqls6OhraGjraGnsZ+JppqTkpGJkY+IgZSJapSijJmEgIV+kYODk5ati5WNlZqOhpKRnpensKGgoaWkqMjOz8jCy9HU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy4x0cGViYVlVWlRcUEtHSUpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5WJj4qIjYePgHiElJiKjIiIi4h+gnhze32Dh3d/eoaRlX+DbndwbXV/dXh9dIV8eWyHdnRufXaEdXh8nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamRueFteZmhrbmlugIOIkYucnaCdkJeYnqOjprGjo7OfoaWdoKmgo7Gchp6SkpKQio6LhoOPhH6cm4yNgoSFepR+gqmVo4yRipeSi32XipqSq7OYmpyonKe9w8a5tsbO0tDS0MvSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7Ly7V6eHBmXltTV1JbVkZHSklFRT06NzpAQEI6R0Q/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc1NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjX2XkZ2LfoeSg4mGhYmBh3x4hZaWiI6Dh4WGeoR5cXp7hIZ1eoWOjZx5i3B8b296f3F7gXGDh4Bujnp1d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeoyHjpORm5WflYeMk5ugm56qn6CsnKGamJ+lnp+rmYuajJCRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI2UjIZ8nImUj66qlJWYn5mnr7W9qa2+x8vJyczL0MnD0srU19jX2NfV29fT2dvV0Nra0dbI1MuWe31qaVxbUVRUX0hDRklIPkE9PTc6PT87PUc9P0FBQURBPj86ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDY1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmpebWRiZmt2gIhykY+agHqAjX6CgoGDfoN7fISYjYeLfoWGgHaCeW57e4eCdHqSno2gdo51gnR1gX10gIRvgY+Bb5KFdHyAhHp2hnuIt8Wkwcm4gZaaj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5CDiY6WmZeWpZyXn5aek5GXo52Zq5WQkImMkYKMhYiIgYaQkZ6bmYmFjIGGl3qIiJ+Xj4iNiouCfaGKkYy8oZiTl5mdqaamrp+otr/AwLnHys7Oxc3J0dbV1dnV19vU1tna29fb2trYztzGh317aWtnYVVYVlZOTERNQjs9PTw4Ojw+OT1ANj0/QD0/Pjw5ODY3REE2NDU1PTgwNjY1NTQ3NzQ1NjEzODU1NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImMknd2eop8foB+f3yEen2CkYmEhXqEh3p1fnVtfH2GfnN+kp6RnoORfIZ+eI59eIqKboKagHSZhn2BiIR7fZB6j6mOj8OhvYuco519iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmKkJKVj52ak5SQlo2MlZ+clKCUkY2Nj4p+kI6Oi4SJkpaanp+JjJSSnZGCi3+lmYiEjYKFhIGlh4uLuJidkZWWoqihnZ6do6+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuHp7em1rZ1hiXFRQT0lDTEE8PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PURSU1JYX1ZYZm1tbWmBjopxc3mKe3p/fH97h3p8e4uGgn10g4V5cnpzbYB+hH53hZyhmp2UkoCMiH+Yh4Cbkm6HqIV6oIt8kY2CiISbfZqQioyjoqCQpK6gi5GLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIyGiIySk4yUlJSPi4+Kh5abnY+VlpCKkpOFgIuIko2KipyWmaKjh5OdlqCKiYiNnJCDiI5/g4eGpIaMkLOYnZKVl6Ghn5mSnJ2osrmspr3Cx83Ixs/M0MzP19DR1K7W1dja2Nra19bZ2Z9xf3ZpaF9eWVRYWUNBSEM/Pj46NDk6Ozc6OzszOzs/PT43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1ifpGDb214i3h6f3qBfIV7e3aFhH9zcISBenV2dnSEg4V9fpKmpJ+lopaKnZCUl4uKqJdyirGNhKeShJmThJmMopWfmJOImp6jkqmvn5CVkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNx5WOhoeJkJKNjZOUiYWKiYWWmZuPkJSThpSXhH+Pi5mIjZCql5ejo4iZn5aaiI6Hl5eKhI6NgX+Ij6WJjZOpmpeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTT2s6Dc4FpZWBfX1BLVlxCQkZDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfXxtfoh4en56gYGCfnZ2gIJ7bG6Kfnl8d3h8hIeLfoujs6ikq7KhlqegpaSWla6ig5C3lZKzmY2hoIukm6+ipJ2YkKeXqZmtr6SXlZWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcmIWIiY6VjYuTj4eBhoeIk5iUjIuTk4aUmIaDkZCcdJGZspaXpKGInJqTj4qQi5eaiYqWjoZ9jJmfipCQnJqZk5mYn5SgnZWfm6GyrqOlt76zxcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmJXYlhRSUpPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSmdhO0iEinp7bYWGeXyEeICFgH1weHx9fG9zjHp9gnt4houJhYSSp7ytqbK9r6Wus7Ooo6KwrIqatZ6iuKWVraSXqa23pqSjn5mpmKqkr7CpmpmclJWRmKCXmbu7rcmgaba4q7CVmJ+iq5KXvaNeqrKCiYqNlYeRfI+OfYOGjo+UlIiHkpaLj5WNi42XmZKdmbSWlauei5yUko2QkoyYm4qSno+LiZWfoo6VjpianZOcmJ6VoqCUnJylr6iipbO4q8LIxLW7vbzFyMjC0aHGyc3NxNbW0MvTonF8al5cVWBTUUdEPz1DQUI4Pzg3ND5GPDw2PDM1MzQ1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo5Nj49NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVIYmBjcEpAi4p+gHKGh3yBiXWCioJ+bX19fH9wd4d3jYGHe42PjIaMmqvCwLC+xruztMG8tKyrs7aMqLKurr2rm7qkqK25t6umpqKho6Oqr7Kxqp2co5ibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2wg4uMi5CDj4ORj3qBh5CNjpyIiI+XjYuVl5SQmpacp5uxmpGrnY6Zj5KOlZCQlpePkaCRiJWbpKyVlo+UnJ6UoZ6bmaChlJqeqKekoaSws6bBxsOwsLu2xcTDvs2nx8PHw7zW0M3Eyol2dWRfXGJdT0tDTEBFRj5BP0I7OjQ+QT09NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxnR2BpZ1pdW5OMjIh7h4uGg4x1hpCKgW5+e4J/cX6BepV6kpSUmJGTlai0x8nAwszBw7rHvLqvq7m7l7K2urPArqXApKuwu7uqrquiop6nrK+1sKqboKqcopyWn7C0p4ujurq1wburqJyypKSolISOqcPEpIKLjoeIhIaVlI16g4yRj5GhjIyUkY+JmKCXk5mUl6agrp2MqpyOlY+SkZWVjpCVkY+hlIaXn6Czn5SblKChmaSfmqCcoJSYnqekpqekr62lv8TCrqm3tcnDvrbOssW+w7uz0cnIwbV3e29fWl5sVE5JRE1LS0lAQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZaJi4iSj4aJeYaTkIFyf3uNfneHgYKQeo2hlqiampi7vsnIysLSycrCzbzBs627vqe6v768w7iswamss7u9qrCppKWjrK60rba1oKCun6WimKO0vambqLzBo7a2r6uSr6yqq5aGmqmmpZGCjJOllYmAdYqSeYWNkZCeoJKOlIuPjZSjmZeblJSjnqmfkaWajI+Pj5WWiH2PlZKSo5qVoKKctaaQn5elpKOln56mmJ6Vl5ylo6moorKtqLvAxK+ls7fMwLmuw7O7vsG5rcLCwcCZcHtjW1leXE1NTkpHRENIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGVWno+djpeOnpKJin+Jn5KEeIV/lX5/kIiKkICVoJmup6OYw77JxMjG083Ozcu8wrewury0vMq8w8G2t7yttMC5vK2vqKCpp7atrqmyt5qerKKnoZ2rt7ippa++xLG9ubOnqbOzra6WlaWsp6CRjpKxxaeVjXyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQl5eSlqWZZpmjn7OllqOWrK2rp5yfp5eYlpiVoaSopp62rKm6vMO1prS2y8G4qrass7u4rqi4ur24g25wXFpWV1BHS1NNSz9BSEVER0ZHODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqaUnJahl6iWjJCDh6WSiIGHgpyEg5WQkZSOmqKfr76uoce+xsXIx87OztLKvru2sbq7vL7OtsS9t7m3srK1s7iyq6acq6u4q6mosLCXo66kp6SltMCwqqyzvsK6wLmzp7izt7OulaWtrq6ki5OVoY1zwZl9lpmEjpaai7GVmpqVkpOZmaajlaCblpqonJuhoJmLjI+WnWBKlpyalJqll1SWsJ+vnJ+llK+vraaboaaUk5mZjp2gp6KZtKmqs728u6uwssfAuKarq62xsaOhsrK0pHJxZ15cUFJNRVFRUFE7SEtJRkhBQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1SRVdSc2JXRkirl5mfoaiumJCXh4unlo6IkoWfiIScl4+eoJujpbXJtKnGvMPEyMrJyMzOx766s6+5uMDBzbXIusC4tbqxr6+ytKajm6q0tKuppq6smaSupaWorLq/qKu2tr/BwL+4s7LCr7e9q6OutKy4pYibl6abdr6ghJicjpOZmouulqGcm5eVm6ChqZ6ooJqaqpmhp56XkI2RnYNudpOimpWdop+QrrKjq5WpqpirrqWloKWqk5KZnImVnKKelrGnqqu6t72zsq6+ubafo6eopaacnKypqY1laGJgU0xNR0hOSlVMPU1ETUlKQUNEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1WSH9lXkhGrJScoZ+7rpiUnouTqpuRkpOJq42Hop6MpKyUo6O2x720wbvDw8jJxcLOyMK9ubKvubTAwsq2xrHBvLW7q6mtrK+jopiqtLqmqqesqp2or6ekq6u+vKisvLO4vsa8t7W4wLC9v7OptbarvqSPopeRop+8n4maoJmXnp2Ot5+pnKWjm5yhmqels6KbnaWcqKqemZWPlJqLl4mNpKKUnKKfoLWvpaaTsauaq62fn6WkqpKWlaCEkJ6fnJWppaKhtLW6ta2otbKynpyippqXlZmqoZ54Yl9hX0xJR0hNUUlNRUZGQlJKSEFER0FWU0RIPEFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6ew6ybl6WXmamclpqaj6qWlaimla2smaGqtsTCvL+4wcPByMS/zca7vrmysLizv8PItcCwvLe5t6ekq6usoaCaqqrEoqWprKaerK+soqqov7imrL2wt7fGtrW5uL6wvsG2tLK0r76jlqOWk5uUrZ+QoaGlo6OfkL6lqZ2orJ2doZumn72imKSeoqmroZ2WjZWek5+Hj4WNk56koJ21rKaclrKnmbCpoJurn6GNmpWfhI6hmpuSpaSamKyxtrGqpaqtrJyYoKGSjpCVqJ+UaWVbYl5QSkhLT0xIRUNJQD1PSEA7R0lIW1JPSz1ITlU0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE2imqObnsWroZ+snZ2tn5KinpakoKeqrJe2sKOqs7bFwr3AtsDCvMnCv8rItri1tbG0tLfBxre+sbi1uragp62qrJ2en6WkwaWgqa6gpKmtr6Kmp722pbG7t7a1w7Kzt7q+scPAuLiutLS0opyklZGToK2fmKGdqKiroprDramerK6bm56YpqC9oZ2kmKurq6ahmY2an5KeiY5Yf5aepqGguKqnk5m3o5+zoqGcsJigj5qUnoKPoJeWjaKklZCmrrOrqaKipaWVlZyZi4+Rk6SfiWNnXGVhTUpLS09GRUFGSz49SUE5OUpKTl1RUUk9TFdcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXExPnp+hmJ7Dp6Wis6GcsqeTqqSfo5+tqaydu7CorLWyyMPBw7PCxL7HxL3Fyr2wsLausbWvv8W1urGwuratmqmxqaqanqahp8Ktm6yxnKqirrCppKe9t6a2ur2vt8Ots7PCv7HGs7q3q7S2raqipZWVlKOroZ+fmaerr6+vu7KmoKmpmZmXkqKkuKGhpJKur6ykpp+SoZ6Vno+RjZWdmqOfp7Snp42YtJyjr5ufnK+RoJSYlJqAkqKWj46goZOLpqywpaeinaCekpKalIWLko2cn4BkaFxoZktKTEtTQkNASUc7O0Y+ODlOTVVeUlNKPk9eXj1IUEJNTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugwqijqrGho7SplrKrpqKksqyuqbuyrbC0tMa/xMS2wMW+ysW2wMnCtau1qbG4rMDEtLeurbe6pZmrsquqmJ+ml627tZuosJutn660sqequrOnurO4srjAqreywry0xae9rq23tamnrKGXlpGlpKGhl5ekr7itsrW2oJ+opJmUlZOjoLejpKWVrrGypamlop6ampqVmKifnpiinq6yoqaNmK+ZpayYm5+mkp2PlZiahpaflIyQnJ6Ui6mpq6KnoZmdloyPmZCBhpaJlZ96ZWpdbGtPUU5OVD1CQU5DOzpJPzc3UU9dXlJWUUFXYFxCSlNIV0tIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcGlWQ1dGjHlmQzukpJyhpb+mp6+voam1qp25r6ukqrS3sbC5trC3uLjFvcPHvbzEwsfBucHHwbqqtqWtu63Bw7e4qq2yvKOVrbCtspelqJGquaqgp7Cdqp+wtLOqqba2rLuss7K5t6y5sMG5vb6mwquwtq6pqqumnZiYqqGhoJGXoLCus6uwuZqbqZ+ZlpKXpqC3qaWioq+xs6uxp6ufm6Cgm56lnaGXnaOzsJufkJSmmqGpm5akoJeZi5aZlJaXnZOIkJuZlI6pqaego5yYm5OHj5mLfoyXho+abGptYm5uWFJRWlRBQ0VVQDs7SEA3OlhQZF5QV1dEWV5eTUxST19LSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lgRihAOGx9aFxWOol7Y0M9qJ+coam8oaqwqqOxuKmltbKroay1va+zuLy6vbe2wcK/ycS5xcPBwLnFvsG4r7anq7eyvL+/taqusrifl6ytqK2XqKmOp7ufpa2znquisbCzrKq2s7W9ra+xtaywtbHAucS2q7yvsbesrKmisaWepKifo5aPmJ+yqrOpqrOZnaebmZSNoKaktK6noqysrrGnsqyyqaObn6iknpWgmZuotamXmZKSn5mfoZ+SraCamYeWmYydmp2Tio2Wl5qXp6ajoJ6WlpeUgZCVhXuPk4SMl2dtc2hwc19HWWZWRENOWERaOUhCNT5dUmhcTlldR1teXU9NUlhkSkpDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFWMTUxPWBWXjgpQzNZVVxnSzWMemZMQKSZoKSstqOsqaWurraqrrS5pqawuMa3sbe+wcK1tLvFvszFucPBusC6xLjBubO1rKq6t7u6vrWrrrG2mJioq6qrm62rj6u9nquusaOqn7Gts66utrK5t6qtrrKnta+0urzJsqq1tLG0r66moLOfmaisoKWVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxq6q1pK6wta+jmJ6tp5uXnpmZrLiil5OQj5icoZmYlK2gnpWClJmOnp2al5GLlJKemqWjo6GZlpOSlnuMkYV7jYuDi5RsbnlvdXxhRmBqWklIWls9e0pHRTZBYlRpWk1cYUpbXFpSUlNiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkEvSkdQW0czY1lUS0SZl5+vqLGprKWjrq61qba0t6OrtLfKurS7ur++tbS3w8HNx7zEvbe/wMC4wL2yva6nurq3t8K3rK6yuJWXpq6rp6OzqpSvuqStsrGmp6Kys7GysbWxt7Kprquyp7ivtbPExLaptLWrsK2pp6K2n56msaCklJuYlLGdp5ufqY2pop2blZelpaS2p6Kws6unsaetsLWspJmhrKicnJ2blKq5nJWOjouYnKKYkZioo6CXhJOXkZ6cmJeWiJaPl5qonaShk5aSkJZ3hZGHfIaChI2NbnF4dnx/XUtlbFxKT2RcP2J7R0k4R2dXZVtNXmJNWFlXVVhUaV1QT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JrS0RDkZikraSsraumo7Cys6q2sLafq7W6yLmuwbvDt7OytcLDz8TAwr60vcHAur+9s8SoqrmxtrfAvbCss7OdoKewraWmsaWesrWsq7KwrKmotLqstLO1rLSsqauorKm5rbGwx764pLmvqa2tpqessKWjo66jqZydm5qvmaKjoqOQrJ+joJ+hqaaluKSrtLSkqquorK62rqKdo6iqnKCZmpKktJmPiY2HkaOglo6Vn6GWlIaQlJSem5mWlYeYkpWZp52goI2TkY6ReH6OhX19fYeKinJ0c39+flxSZG5eTlpnXUZElltHOk5tWGJbTWFiTlZWVldUWWdeUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NlOzYqSGRISis6ST8zQ0lTLD6Paz5ISY+aqaqhqa+kp6OztLG0tbGxoautvcy6rsG7xrG0rbTCw9HExr/Bs77DwrzAuLzFqK23rLO4vMGxrLKtoaSnramopLGjq7Gqr6uxrq6tq7O7p7exsqmyqaumpaOtuqyqsMK5tKy5qKmoramnsKWppKKuqqiinpyirJWknZeemKudoaeooaymoqyrt7GxoKmin6qtsKydnqanqZqjmJmPoKiYhoOOioufoJCMjpeekZCHiJGVoZ2WmJaGlpOTl6WdnZ2MkpCOioB/iIV9d4CHhYd1c3KJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9jXE5VVlVXUFxhX1RPT2hYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlFxATUaVlqynoamxnKipsLasuLSuqqSrq73Ju7G+t8OvsK2zxMTOzsO/v7TBxMS6wbTJxKyvt66yusC/tK6uq6WoqrCppqiyprStqrCurbGvs6yzuqS4s6ysraeroKKesLerqq26tqS1taOpqKysqqygqKamsbKjpqWhoauWqaCTmqCmnqOiqqSsop6msbesrKKlopqpqq2pnKGlpKSZoJqVj5idk4GCkImFnaCNi4+Nm5CSjIWOmaSck5GbjJORkZSjm5uai46Li3yHgYKCe3WBhIJ+dXeLpId5a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWFWS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZBSUhElpGvpKKpr5ipqK21q7awq6Srqqm8wcC4ubO8taayr8TJy9G/wbu5wMDCusG6wsSusbWytLvBvrOyr62rrKi2qqWtsKu5rqiwsK6xq7WqtrWmtLarrKSpqpyjnbOzqKiks7Sgtq6hqairqKumn6urqLm2qampqaGpn62bkaihnaCjoqaiqp2bprSup6WpoqOXpaanqpyio6OgmZifkY6PmI1+h42HhZ6eiIWLi4+PkY2Fh5ajmo6NmpGSkY6Tn5iZlo2LhH90h4GAf3h1hIB7eH6AiJ2PcHJnZ3F4XGF0iGlPXZhWSG15VWRWUmNPTFZUVVFPWFpiVkhQalRWU0dQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1FFO5WNr6ClqqyZqqStrrO0rqqlr6mpu767wbGvuK2ita/Jx8jQwL+9u7zDvbrDwcC/r7Gzsra9vMGysrOrtKmltaikrbOyuK+irbWxr7G5qriuqq62q6qeqaugo6G1ramhnq+yobWqnqioqqOqoaGsrai9r6yurKGnp5+smY+vopiioKinnqebmKmwqKKfrKKhkqGioqaYmqilmJiYnY+Kh5SIfI2GhIWkloaDgoyHkI+RhYaUoZeJkZ2Qk5CNkZ2Vl4+KhYZ4c4F/fXR4eoF7dHR7aoKIpHZpXmVsgXVniIt8UldwXkt4c1RkU1FfTU1TWmdOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWk6MzhfPWFkP0YxQ1BbWytIUDtZQzSPjrGfpKWqo6WjrKa0s7CppLCnqri+wbywqLmqp66wycbI0MK9wL65vr68ybzCubGwtbK6vLnAs7S7rbmso7Wmp6yxtriypqe6ta20vK+7pa2ttautnKmvpJ+lrKqnnJ2qsqS0qZqqp6qkqZ2iqKipvau0r62dqaOgrpuasqKWpJukpZ+kmpmnqqWemqmhm5GboKSdmJapqZGZmZKQi4KPhX2PgoCIno+HgH6MiJKQkIWBlJuUhpOijJORi5Gbk5WHiX6Acnp5fnxod3x7dXFyfmmGeoSIZGBoY3KFe21oeV1eVkNYe21UYVBSWUtLTXB0XUlaW2haRVZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKwmZ+fqaWjoaqktrKxpKmxp625wb21sKO5raiosMPJyMzBt73Atbe/usi2w7W0s7Wyvbm6vbatuba/raKzpqqrrrW3tKqduruosb+yuqCvtLaprJ6usaOcpaepo52cpK+mr6Gfqqmnoamco6igrbunrrGuoKuio62enqymmJ+boaKcn5qZoqqimpmjo5WWk56hlpuWpqyLnpGPkYyCin9/j4F7mpSMiX1/jIeQj4yKhpOYkYeUo4mRkYeQmpCTgYh8eWx9dnl4Ynt6cnBxc3hqgnVqg2djaGFuc45tYmpwYG9CXXlrVl5OUVFLSU1TWVZNXF5tV0RYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl09I5GXrJifl6ejoZ+no7evraKvr6mrucK6s62fua+rqLS6x8rIv7fCvq+0vrbEtsOysLqxssC2u764qbm4vaqktKaoqq+tuLCpmbm8o62+tLOhrre1p6ansLOgnqSlp6GkmZ6sqKieoKqup6Cml6Kon7C4n6Oxr6Groa2km6amqZqam5+jlZybmZ2pppaanqiRmJKYnZOZlqGqkJqJjY+HfYd+go18fKGMjIh5hI2Fio2NhYmTmo6JlZ+IkJWCjJeNkX2Ee3NwfHFzdGB5eGpvcHFwan9zZHpsaGZkYmaHgGBbcmpxTU6AaVhaTVFMS0hQUlFITVxfb1RFWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsoJ6hpKG3qrCjtLSpqbrFtrKuoLesra2wtcXHwLa/wrmwtby2vru/r6y+sLO/sr3Duam7urinqLWop6uvq7OvpZm8tqSrurWun7G4r6mlp6+ynKGkoKSkoZabr6ahn6Oor6GgopOjpKK2sKGmsKufq6Ovl5uqpaifmJqdpJOam5mcpamZm5uklJSXlZyOk5eiqaGQiYqPhnqDfYOKeY+Xio2HeoKIhImNj4WPk5iMjpaZio6WfoWXjI96gHpwcXZub3RfeHdlbWxsamqEb2ZyaWtmaV5kdIFgW2t2aVpKf15cWE9PS0hIUlVHMzleXm1RRVhWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJkVywylKGhl5Sbqp2koaKht6muoLq4pay9xbOwrqO1r62trrTDw7yzv7q3sbO5t7m3uq+uwLO0ua+/wbisvbq1pqKyqaepsqqtsaCawLWkp7W1qJ6yvKmnpamvrJmjp5ykpZSYobGlmZ+kqKmcop+SpJ+juKikp62mnaWhqJKfqKKhoZmbnKCSmpuWn6Gqm5qYoJSQk5aZjZOTo6ikkImJjoZ5hHqDhX2djYmKh3qBhIeJiZKFlpOSi5CVk4yNlHuCl46Ld357bHRxbGxzYXd1aWlqZ2dvhmhoaWNmaWpga2NqaFxle2NgU3RUXFtTTEpHSU9TQCEqaV5qTURXVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp2io5GNpKebnp6do7Wsp6q6t6esxMG2sKyjta6nrq+3v7+8ssG3sK6ytrW4tratqr2zrrKxvb+4rry7saWftqqlpbOoqq2encCrqKWvsqmstbueqKmrsaWYnqmdpqSRmaatopiepKmhm6Gclp+dp7alr6quoaGdnaGUoKafoaCam5mckZick6Wdq6GXlpyUkoyVl4uPmJqpoJGIiYqIeYV2gYKCnYiLgol9f4WIh4aQhJaVkI6QkZCRjJJ7g5WOhnN9fWZ4b2tqa2d1c2tjZ2RkdoFjZWZmZmpqY2tzWl9ZXW1kYU5pWFpgVkpHSUtNUlg+OV9saUhDVVNcW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao5+QjK2hmJiflqSzsaKxvbahsca8urGxpLesqq6puby7uq3Asq6urrausrizqKu5sa+us7a6trC4vaymnrWqoKCvo6munKLAoLGjrq+tt661nq2ura2imp2nqaWflZqnpZ+ZpaKonZqfm5ScnayvpbqnrqKhmpqdmZ6kmqSel56Ym5SZoJKolamnmpOampGLlZmOlJSZqaeOjYqJj3yCdIGBipiFh3yJiYWFioyKkoSUnJOSj5CRlo6Qf4CMjYJwgH5meW1oa2lncXJrXGhjY3SBYmZoam5sZ2pqaG5dbGx0cGFVY2lkZVpJRkxNT1hRUVZhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGajY6wnpqToZmosq+fuL+2oLTCu725saa2sKiupbe4t7etu66sqqu2qrO4raWztbKuqbC3trGztbqmqZ+1qJ2eqKGorJqnvpito66utLWtrJ+xra+popydo6uonJScpqSdmqqipJaan5yQm6Orqqm7n6ekoJiZmZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB4hpSMg25pfnaDcWyGi4Z9hIyHcF5jYWeEmIZsi4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dzhWdfZGZubWpdYGGKj4OEZU5LRDlGVGdeSkdQUFRVS0hSYG90ZUZaUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYaVsJuck6Cbqq2qo73Fr6m4wri9vK2ntrClq6O3s7KzsbmtqaastKavtaKouLa2qKest7OutK2zoames6qeoaObpaaYq7qVpaWvsratrqSprquspaGfnKCnp5uXoKWlm5unp52Tn5+YkJ6nqqO1r6Oiop2Wl5eXo4igjpKah6GHk5ygf6R/paqekpGakYiEcniNjoWIoXaIjGmXiGZ9cnihb4iHhH6OfX+hoKCZgHyHnnSHjnabimyHgYNsaGVjemtxYVOFbWNsaZhxWWpwb4hYXmlbbGxbiHFuenKFZ4aEWl5HTj9HX01FUlZWUVFSV1RnXk1XSVJTUEZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiLppaDnKucmZidn6qqp6q/w6+xur23wL+qpbewqa2lsrSur7O3qqmlsK2ltLOcrbW2tKanqLOxrbKorp2qoLKooKOimaGhmq2zlKOkpbW8pqynq6qsqKWhoJigpqOZmaWjpJicpKmWlKOclJOkpaaht6OjoKOYlZOXkpyIr5CYlImpi5ehm4WxgKOsnZOZnZR5g9SogIeVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5oem9ykNh+U2tjtrJ/gXKVdJqhqpBXT1diUFZORlVbWFFQUoxcV1xQQFxEUU5FR0o8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaSgKeqn5ecnaWtsqixwr2ytcC1t77Cq6azraypp66zqa+2tKenpbSlp7eunLOytqqlpKeyrq6xpqqdp6Sxo6KfnZaanp2uq5Seop+zuaOqqaKtrqWhnZuaoqefl5unoJ+YnqenkZynmpOdoaaioLCin5+jlpaSl5KZha9raoqNqn5ng5WGrWRwnZ2UmaWUca6hpH54u31roY92sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5ofKSngllfi6tpgJZ4eWqnN0qvXFhTbGRbS05YX1xXVjtOiU9YVy9JVFRKREZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsp6Weo6SqsrestL2+sLbEsre6wqepsKuuqamwrqOwuq+jpK2yo6i4qJ6zsrCjpaCqra+sr6ann6OisJuim5aVlpqarKWWm6Ges7Kiq5yira2gnZqXoKGonJido5+cmaGmpI+dopqXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl2hrObt36TlpaolH5sgqZ7goaIkpSSd6tna7Fbq3uPh5R0iXGPhoB/iJCXeIKCi5iMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5c3VTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5WFhBI01oRkNFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WHs6amoK6pp7Ksqbu2wrC7wq24tr+qrK2trqatsamhrruqoKe0rKOrtaWms7Ono6Kdp6qyqLCopZ6fn6+Wn5iUlZWXnayhmZmkqLSuoamPqaiqm52VmKClp5qenKKfm6CjpKOVm56XmZ2iqZulmZycoqCWk5GTk52D1ZOZuXCwwn7FhnzWlJu7fJqVpI+NnI2ke46HpIKlgnqseY+dVq96iH6farlauXaHhH2mgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKlic3OIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObU1bUk9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KTmLGoqKWzqqW0qaS8t8GwucCxtbO6s7WnsbCjsLKmn621p5qnua2jr7Ggs7SwoKSen6epsKm0qKSbnZ6rl5iXlZeVlaCpnJmWp62wqKKfj6yiqJadlpuhpaGYoaGhoZqhoqabnqGelJmbpqCbp5Wbm5+gmJCRlJGdiLJuaLVxq4dujqZytHNytnual6SLj52No3+RoaV+sHaDkdLSdlyue4V/pG+bqqZrh4V9rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZ0h2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa2BsaFBVR0k4PVZRWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWvraSqvK2mtaWntru8srq/t7WzubqzpbS0obGxop+rr6SXprmtpLGwnLS4qqCmnaGppLKorKmkmZuaqJ6VlJeYkpKip5+WkqWqsKahlZOtn6WSk6CbpKaflZqlpqGaop+tmaCenZCVm6GdnKWUnZWZop6VmJWRm4Wse3eodqOOiIapb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9eIV+j52GmZp3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV52d4domIhrXa93lZ6PeGw1eciusl9CVG9eZ2BFUG1fcG1WVU0uZWNoUlhRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnZSfuLCXtMGtqLOoqbK6t7O4v7m3sbS7tKS4s56zrJ+eqKuelKe1q6ixsauttKSbqaCgqKG2p6apopmdlKShk5KbmJGUoqWako+mra+moJWZqZ+ijpGhmqikoJWZpaidnKSerJyhnaCNlJ6anaCYmZuWl6Ggk5eQpp6GqX19pXihj46CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTYf3aIdKiBjpuNkqN8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJnTVthX3JzX0pWNkqbk1hIRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84oZ2Zmb+rl7TCrqytqaa0sLextb+5ubGwtbqpurSer6SepKennZOqsKmvqbWsqq+hmKGgpqWkuqKjq6CWm5GioJSTnpmTl56fj42LqLCvpp2Wm6imn4ySo5eoqqaUlqmnnp6go62joZ6ijZWhmJ+fkp6XnJWdoZWWjqucj65tcrRyqYx2iqdztHhzs4CRpKOSnI2JpIeQd7hvjHuLomprtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytX02hfIeRUnOjbHl/fm+Yh3Fcr1Y8nHdlVG9uLlynT2NTa2VibVpjXWFwe2NUWlE+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam527oZyywK6uq6unt6m4r7XAtbuwrri2qsG1qKigm6WkoZyRqqmntaOyqK+qoJecp6Ckq7ido62blpmPpaOVjJ2gmpicn5GTlKq2sKeYlJysqZeMk6WZpayikZaqsqOfnqarsJmho4+Zopafm5acl6GSnKmclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2VgaypcXt/dbyIp6BpnWGmjq+hfox0h6p9vm5zvHSyg3V4gYtumohxbo2kdL1ed31bYXm8a1pWXGp5XmphZWdibXhvWVtZQ0FAckBDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03Qjmnm56hvKKXscOwraqrrLGnuK+2xLG5sK25rq3Asaujop6joZybkKmjqrKktaatpZ6WmaqZpqy5naOumJSgkKWfkoyco52XnZuRlZKuubKslZejp6eUkJaknKSsnpCgqKufmp6oo7Oeo6WOp6KUopqcl5WjmJCvoJKUqZ6FkJm1f4+RjLeVeIKTmrV3bWtuc295j4SOiXSewbu9mnuBsqhwgHSRuYN8hoaMho17ioeNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmqNtXRycXe2jF6Aen2KaIN5bXlji6xwdYV/WVunakVlWlRmYGNeY1FoZ3FtdUJNUExEOlpNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlYnPjs8p56gob+llrTCtKyrqKyrqbqusMWutLKttqa0uKypoaGlnqCdmZOrpK2qprWnp5+blqCjnaykvqahqpeUnJChmpGPoaihk52Yk5eUsbW3rZidpKSiipKSpZulqpuVqKWlm5mgqKamo6mhka2elqOel5eXnZ6PsKiUm6ehjmp+aZuleIdyfZqOdHpkh3u9vsC6b5KCcZWHYXNqWl6bimFjiI6Va2CAlWRtnXdilWuAmpWUZV5gY3GaimlyjH2FlWdqfnJ0eH1+Ylt3dIFoUFxuhH18i2tYbHqCc0pKb4ZwTnRMRVddZ2FMWlhnY19PW251aXJST0RFTjtISD1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPVtPJz8yPqigqKHCo5q0ubWjrKWup6e1savIq7CyqrSivbGxpqCiqJyim5mZrKavpKS1qaWbl5Whm6atqL6nqKaVk5uVn5mSl6SpqJCdkY+YnK+yv6ybp56nooiTkamaqKOam6ygo5mZoqesop+ropqxm5SnoJaUnZ+dl7Gkl6GomZyRnZyio5iloZqcmpqZj5WBZ259cXeSl5SRhYu1qo2GmJWOioyYl4eUlYqEkpSRiY6SlJiUmJaaoKGanJShno2CeqSGbGp8kHyAdYqKgXGCeHl2douAfIprc4F0g3Vldn13a296bWBjXXBoTVhaZmpgV1pwem5tZlNPRlM5T1lOUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOhv6GksbK3oKqmsqelsLSqyKutsKS0pcCns6CdpKSco5WVoKqnrKOjtqufmZaWn5etqqXBnquklZKcl52XkpOin56ip5ORmainssSvmqudqp+Ql5annaqbnKCsmKGam6Gkr6ahpaifrpiXp5yZmqCenpyvoJyhppWXkpiTn6CVop2YoI6Wk4qKjY6XrpB8lZuCkoKLqqiGgZmXioSPn4h7hJCHhpqSiIaKlY+bl42RmJ2jlpqTkZ6Nf45mobOvhYqEdnuSin12eXpvZnqRgYCJa3WBeYhzaXN/e3aDhoJrdWR5ZmBqZWNkZmtZbHtwaWpcU0xQRF9URkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r7+sq66ysaCrprGtoqyzsMSwqquisq28o7Obn6aioZyZl6elqaakpbK0npWUnZmZsKWuvqCropCRnZqZlJGUopyXqJyEnqqrorPIs5+qpKqWlpeapp2omp+jqpOen52gqa+ppaOroq6bn6CgmKSenJ+dr6OYnqiTl5abkKOYl6ecmpdlgpJ8ZX6NmpBkeY1saGt7kqSqamWamH5nhoplZWloe46hj2tojZeRo3draouZo56Zc2xue4SNh3pYZV6Ggl5ti4mBdlxoc3d3koCHgm54gniAc215hHR2iIiOg3xqh1lebHVkXXOJaWt8cWtjXlJOV0pkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsaqlqK2tsKatrbC8sammo62usJ6slqCjnaKZmaarnK2jpaipsq2elaOPoq+ltrmlrqOOjpqhmZOSmqCZmaWVe6Wtoqi0xLikoqevnp2UnqKeo5yjqaiRnqGdoKqwqqukqqCqm6efp6CrlaGbpbCkl5uqlaCdmpGklp2pl55+vYOIcrRyhJ2GrWh4ucS4cZOio3qmmZlzqoJ8y8DAu3GMooiCn32WmImdwL2Cl52djZ3CwXyCfJKNmsPAfWulsm6MgW/Ken+bd5GDjoF2eoGAeXF6f4dwd4WMk3lueJRjZl95ZGBlgmNedGhsZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JRLyNGWzNQWS9VQUI7LziWo7nDtLCwwKmolKOvqbCuraaztK+ppaamsKufq5iaop+cmqqnop2so6WopKS0pJ2ikqatq7izp6+ikZGZnaWSkJ+hmJufnYenrKSrrcDAsaCpr6mXkZ6doZmio6mjkqChnZ2trqmsp6Ojp6GmpZ2tqJGkmqitqZucqZusoJWVpJWgopacf86UeHqkgXmVlptfro9ejqeBoqB9p5abdKuDgK9eY42qe6eHhaB1l5OIs2OCq4ahjo2zaoWvdH2XiLdhg61Zo81tkHV72nt/mXB+iJJ2fmV7iHZ2a3yIbn2FkJF+bYOQYXJscGhgX3lkXHFoamRmYFJUUlddS09DNUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGkqqits6umsqysqqOqpq+qoKebmaSWnKKvn6CeqKejpaGfsKyanZWnrqyxqqisoJSSm5+kko+epZidp6OerqSrsKi/x7OoqbGulpKdm6GXn6mqn5Sgn5ydra+nq6mcp6ikoquSrLKWpaKqqp2jpqShsKCSmaaYn5mTlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xzrX6rh4afdpiSe3yXfqqIooyRjJ1+q3uJlJCfgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+JipKPg22SkGZwdXVxYWdtZV9vaWluZ2RYU1xhWVFTQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytKCco46jo6Ksr7auqLCmqKqmrKurp6KjnZmhlKClq5+ipaCoqKKenbCsl5qWqaeurKimqZ6XlJqjoZGToK2bnaajr6yjrLWquc2yraatrJaVnJ2imJ6urJ2WoJmdn6myqaqqm6yrpKOsm6+xoqirrqWYpaqoqbGikpajpJmTkYSkaqR1iXqpdHqycIKmipmMcYigmoekYGFSq4R/roObdq2BpoaGn3qZl4Z7ZoCjiaSZhoKjfal/gpWHrl99qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoFtmpRwbnl4eXBtZmVlcXBmfGpjXVdgaVhYVUxMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwrqmsoqemqaqrqaSmoJuknZymp6ejnKyaoqyho5+vopybk6uktbCvoKmbnZaUpqKQmqKooKClnLCmpKixrLbIsrWqq6mVkZ2copifpbOdmqCUnJ+nrKykrpqtqqOiqqGzraGqs7Ghmqinrq62opKWoqaYmpF8qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfYJSpg6OIh6B6mJaaeKrJdJmklaipkZOajICciprGx3hmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI6QnpJ8cZeTgHF7dX58b1tmanJwZYFrXmFZY21cXllJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqbOtrKWinLK4rKqgpZqopaqrqqegpqWYqqOfrqudpqCsmp6ppZ2ntZ+il5OpqrWyrJylnKCUj6WskZmbp6OgqaauoaSnqbC1w7Kzqq2ok4iWnKSaoaOuppihlZicpaarm7Cdrqimn6yjt6yhsbmvnZquprKysqSTl6eimZ6Ogp1OeJqBf596g6N9g6SEhqaenJ6ThLh7fHm5gn7MxsK2eJuhkIuffpqWl4p2npiKpZikqH+whZ2Fn4SsfZqUYqVspHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Tkot1e3OFf3Fdbm54cmqBb1tkX2huYmRdTExRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq+gm6GssrOlnqCVpa6trqqnnaammqOnobOuoqmnsqCYqaSUorWiopWXoam0uaObop2ik4+hsZiem6eloaKvrp2kqKK2ssSxramtqZGHj5unnKKknKWXnpiZmqakqZqvoq6lppivpLusoba3rZ2dtLG3sLKml52un6KdhY/RtcO3eYeOhZGTkIGmeJShd4ygkYSlgYpxqoaEtG5yapmjnJWKnnyYmYaHj3OvgqWboo2mi5OdipWQm21wslylc5N6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2MjZSNeH15j4JuanlpeXJugHVeZWRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/vLq0npanpa21oaKZlaOop66rrJmmop+moKC1p6Opp7GjlKyjjqSto52QmpqqtLSknaScqZGUl62fn52npJ2nnLWaoaqktqvDsKmrqaGMhI2boaCmopWampyYm5mmpKaYrKiuo6Wbraa9rJS9sKyfoq+yuaqzppqosaKml3mokH18sHeKgKSliJxtsm+gh618oY6DqJWZgKyJha6Fn5SqoaGXhp+AmZWAe5J+q4CdmpaLq3idn5GKlJKBeq9do4F9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWRppmClY6YjXt7hJh/bG5/Y350boB6YGdlcW5oZ2hCWmFbPktUM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFRUVldXWFZVVVFIRklKIygovZKag6nGwrbBtJ+arKCtuKWjjpuko5+wr6qfpJ+drZmeuaCjq6CvqZquoZCrqKSWiZqQrrGspp6mmqyXl4+soaGdpaGapJytmKCoprapwK+lqaSfi4CNm5qfpp6SlJqalJqapaSkmqmsrKSln6qovqSWw6yqoqGrsrmqrqafsq2nqJd2r36Qi5yFh326roqYZbCMZZWtfaGPg6aVmoGsioSwhaaZpKGhkYWgW2xqgbNgf617e4KBsW1nb5mYjIiwW320XKSDa8iiZJ+Ae7xYdrVasn1SroB6rFiAoW6YkKibi5eRl5h8eo+efmV1fmKEeHSAfGFqZnFtZmVmT1ZkXEJVXz5KKD46PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBfYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpcXFhXV0dCO9Kfs7K3vbqzwbOjm6ympLaooIuaoJ+cs7Opn6OgnrWYoLSoqqyer62erJuVr6mijoibjq+sqKehppmukpiPqJqhnqSfmaOjpZmfo6myqb2vpKienI59i5qVoKCZj5Gam5Kal6ifoZqorqimpqOlqbueoMampKihq7S1rK6mnrqsq6uUgKmSo6+Om4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGujgW+rhGycf3qysMeDaquwvax4d6K+vHOBlo6nnJCbkZiee4KSnHtkfntkjmd5gntga2VramJQYVtTalxAVWFDTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzg6PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbO0sb+5sr2yop2upaWypp2MmKW/qriyqKG/pqeynJ6xnLqon62vpaaUlLCsl4yCm5GupaKsoKOcqqCXiqOSpp6nnJqhqKKZnqGsram5raijmpeSe4eZkaabk46RmJiPmJOomqCYqamhqqeho6q7nqjEoqCuo6qztKqvqZ+5pq2tmXN1qqS3hmSJoHBnrY+Kj21vd6SQmZ+Bda6YlHCPi3GVqKObl66kcm1tbGaLeG9ugplxgXpqcWlniZaVmHFpaYSHZ3CGZF2IYmpvWV1nfnemX2FxjpFuZWV/jZOPopiZmZGYoH6IkJZ3Z4h4aY5reX95ZGxjZmxiS2RYSmtaOlFlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3OTw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6m5uLKzqqmhrp6jsqmYkr6yxMm+tqqewKyso6GorKC6o6SurK2njZeuqY+LhZWWrZ6mqqCdo6OgkYukkqeZqJmWo6qglpympqewuqusmpuTknuEl42lmI2RkZiUjZeVqJWfmKmjm7GmnqKruZ+vwKeksqWssLGqraqmtqKstpWKoKiltp2JlqOZh6makJSdkqmzmZujq6CxlqKgnaCinKCloZWrp42TkoyHk5yclZCak5iRjpWFgaSal5WNi5OTi4+GhH1niX50gnZ0h4txp2x6lJGTkoGBjZCQj52VoZaamKODiZaOc2qRd3GLeHd8empsZGNvZFVhWUBqW0hjYU9ZK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhUVlleYGFjXV5VUUpFRD45PUBBU1hbXFpXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltLaurqKwo62foLWxkI6sx73Fu7mroqaem6afsaijtqedqbWnqZGYraKLh4mPm6iVrKSfmKeenpKUo5eomqiZlKaho5Cap5mhtruoq5makI17gZSLoJSKlZGVkJCTl6WQn5qqoJy2o56nq7enrsGuo7amr6+wrKiosrefrbuYkaWkpraikp6nn42pn42Sn6Osr5uho7Cor5ejoJyjqp6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2Ui4B9ZouFdYZ1eYiDc5xqhZCUk5CJfIuWkpKXlKKTnpijhYmaiHtzl3N6i39yfH9qb2RecGphW2BZbmNQYGRQWjpHR0U+Mj09OC8rJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX19hYWJhYWFgYmJiZGJcW2OXlaSooq+yrK6jqaatn6e1qpCQnaW0vK+traKjmnqdorGkpbGpl5u5p6OUmaqcjoaKiZyjj66eopWnn6CSlpibrouplo+omaiMmKmPn7q2pKWZm42IeYKTi5qTipWSlJCNkpeijZ2eqJ6fuKOAhK+1oq+vdaS9o7Kfd3mfqbC5lHWro56JgKp/ZFxidqCOpJ6El31uk7Odo6etqqNlnZ+Sc3mZlnCAmKiXbH+iqIplnKWckZeYloySnJGGnZqQlYOSh4+PkomEd2qOhnaGcHuGgIBhaYeKlJKLWnWUkGhoj49ze6aammZ6moiEeZlqhIuDb3mAa3FlX3ZwbGtoW2dlYmJwU1w+Tk5OU0c+QFREOTEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVRUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5gX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6CvsKyrqaWorqOmraSSlqu2sLKnm6umrJd0jJ2wn6irp5SXuaCgj5yknZF/iYibno2smqKVp6GdjpaRnoR1rY6IppqpkZekiZy6tKegmZiLiXV3k42Wk4qUkZCUjJCToI6boaeZnLKWgIybtZ2zjJKPu6egfqeieqKttYCOjaWeg4uGkLGqr4yKlqOaeYCLrIacnaKnqaeHlYWYd6WbeoebgZengoJ7nLJ6ioagl5mUmJaCkZeXhJqZY3mHkISOj5GLg21wjod5gHCAgYV/hnSGhJWReJZnknSgmnR9mYSinoiYf5SLhYWaa46OhWx4e3FxZ2R4b2psaltla2pldFxeSVRMUUBFNS5aVFU3KSEwOT0+NzQzNTY4Ozo9Pj5AREk/SkVKS0dTWFtZW2FhaGZZUUg5RUs8PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mra6rqKyfqLCmpqmlmZSuyL6xopenqbaekISdrJynoqCNkL6emY2fmqCQfIaOmZiIrJyhlZ+gkY2TiYaAkaeMhqKdpJSYnoafurKnnZuSjoVwdZCJlZCKlJCPm4uPkZ+Sl6Gllp6rh5+0ibSarYrKh6qtiLeFjK+CsKyCqY2lmI2dfaiPcnt3nI+nlmiVpHm0jJ+epqiSmMKBf6uImKFynoCapX2XhZWxgKF9oZOgkJiXgY6Tm4qYkYt8hZOGjZWSiYNtcpCFf3lxhoGEfIR1hIGWgI/FZn+ph4+ja56Do5yDmoGOj4eLmnGOk4Vod3R8d2hodnFoaGteZHBtZ21YZ0ddUk0yRDQ2TmFjNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmptXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKepqaarn6O3sKmqppqUoKOkq6SXpau4o7CAoaidpZ6diZS9mZONoZKej3mElpaRiKuZm5uZoYWPjHebnI+ej4eepJyWmpiHo7mupJqcjIx+Ym2Pi5OQjZCNjZiMj5Gfj5ShoZmhp36hp4etnaCWrY+enJ2RhYCgjaqthaONqZmMmn+jdYCZlGuCrHVNq3iHjZyRm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefm5gZFmDl3+Me2Roi3KZfXmVbF18lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhaBqZqBtW2+MfWdaYIN/YldQb3dmbXRza2pvXmtwbWxpWGlPXlhGOUE0R0ReazQsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5adoLigqqSmrJGgtrurraKZmKCipa2uoZ2utqOok6GgoKecmo6ZtJmQi5+MlYt1gZSSjYqmlpWYnp5/koWGrKSHmo+KmKmZmpuSiKaxp6KVmoiJgGluiIiLj46Ki42SjJCRooyUn6CcoaR/k4GPo6GUoHeclo+ng6Gnf4aoq4OleIp8hJp+onBzlIiWe56MeW2Hm4yZkJuomo+HnXuConN2pmaefnekX5h6fZJzom6Yt7S6dJOHgn+1qGSBxrh7cJW3i3GAmqRic6yrYH1pnbN+bnyGgo2Ci5hxf6NscqN0n4WBpGCdmbOWcX2Yn7R0c1uesoNqYm90dnFpb1hrbHJyZl1pXmNMRD1ENlFBWXEzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1OUUBFX15bWlhgYHxkSEM4TFdVVmNhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe0ra2gmqKdo6Omrp2csq6sk5igmKGkmZqUn6ubi4iSeIuFcYCWjoqPoZCSlJ2XfZCJjqigh5iOipGjlJybjYupqKWej5eHhH5re4d+fY+Ng4uQkYmPlKCDl56gnaCei4l3nJiijJ9yoYuHqIibpY+Vpql9rYx+eqCZeqOTeIF0loiNnH2Vn4abjpmbpoaiZKF8iJaQm41snmiajW6amXuAi6d9cmh0q4Oeg3SqaJWaXZuFdoSdaKpqgLhmXKhwgZxglYxep3Z1h4l+nmiadYaTkpeOgJ9vmpBtp5pdqH54u2t+qluOhF2zZ1xucnp4a2lccWp4eWNgZlhiQlFGTzdWQ1JvNUtbWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXVllZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniGOUmqu5sa+snqacnKmfn6+cnrGprZ2Xo5qhoJmWlqGkmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJajnYqUj4aLnpKdnYmQqaOgmoyRioCAaYCGeH+XjHuJjo6Ij5aaf5Sin6Chk5hyaJ+Kn4+McJKMgamHmJ6hpp6me7Cto6K4l3ejs6KkgIiUeZ17qpp/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn90qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcnyObYCIhJl1m3iGibGzf4Cbk6d3gp1uc32VcJp0a6RdlXZIZWRhdHF+fm5mYGxpdntkZWJSX1ddVVdAWkZRaERTV1xiWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk5yBsK6ZhFReoKazubKyqZqijJyrnJyqlKKspKKoj56dnZuZlpihnZaIh4l3hoFveZWFkZuLfJGTlohyf4iSoZtzkZCBiJmVoZuFjqmcmpWLi4p8g2yEhXGBoYx4ho2IiJOYlXyTo6Ceo4ithn21hI6enHullnqpgZWcj4mfm3ynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpmAo29eqGd1o2NvpWGc05B8e5l4cnNjooaQfqNzpI92a5CzjGCCmIlzqrKovH93g21+vqaptF6cbn1xl25/cqJyXaRnc6ZhaKZtm9SafYWbcHp7mGycfHiXc26ppGdhZXpxgIRrZ2ZkbnV3Z2BjU1xmUVFiSVdKVGFXU1tlalxlUUZDS01KS0JLRThPQFFOWFNZT1NRYWZlalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7CrVFxLfqmvsbSvs6ObmYWZqaChpI6lqKCYqYqamJiTmZOSoJiOh4Z7cH2EaH2Pg5SagXeQjY+Jb3+Gj5KSbJaTfImSk6WWg4+rm5SSi4WJeoN2h4BugZ+Gd4CShoeZopd7lKOkmp+Js6Gitot6rKekrqVwqICakIWAmpB7pIChmYaYcp6Eo66vipeMf4ykjZWDraGUdrS1tcmhc5SKgZ9gnZepbXmVhqCbdaGHd6B+kpeLgW9MZqOScJuHc6R7enRhg4FrfqBrcWRfnHF9dJdpemmztbTGpnOYfnqda5ybq3aFm212eJhqmXt1mHJQRX20Xmp2a3mIZmpoYnR1cG5WXlRZaVBTaUpWTVlUVl1oa25WaFdOS0FKTUtISk9BUUtQZWNqbWV1c3N/eXxudYl7e1RQT2xeaFtraVJqaGlsZ2xmY2VgXF1cXmliZGlre19dZGhjamZvbWVpbGWhnIivpoRmP5Ohsqqur7WiopCAmKqio6WMpqednaaCm5eWjpeQj5yTjoiDeWp5h2WDjX+YoHl1j4iMgWmEhZKCjIWdjXqNi5amk4OYqZiNkYuBiXqAfYt5cJChhnmBlYeJlqCVf5Slp5yWloRmbnicbKJkfHGld5uYcGemgJWKeqR6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmqa3WgbW6mX5ppi5BoloealXWigH2aYIyGjXVviGJooGWefmmbdW9jZoiCbXKiWl9bYqFtXYmMbnt+c3JkpW13omRnp2iZc4yZcKJvVYmQb6BfZqhUi15UmG5tc2tygm1waWt5c2tvUllXV2daVG1KWU9dSVhpaXNqWWtWUVJFVlxMWFNhVWlrX3d0e31wfXxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66jqbCxpp+LgJirnZ+mjaOhm6KigJaZk46aj4uYkI6Ke4ZxgIhoi4t8mJxzdIl9kHtkgoeViomWmYJ8iIeXqJGBoqyRhpCKgop+gICOc2mPpYR9hpSNiJigjoiTqqadiaZ4lZt+pYiWjLKYnpCCr5efpXeUhnipc6WPhJpupKKMkoSMg7tufaWvg4aGhpOVnJ98pXpyqJWglmaefm+rY5aKlZJ4qGypooGJdoiDd6qRpodqkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5/jKWedp99hKSVnaBqm4h3rGeerYy2dHe+jaSTWYOmjathdXJ0cXx0cWNqfm5obFNXW1ZhYl1rTV1SXUpebW52YFtxWVxgW2Z0ZW5vcmJxdGB3en55cnmDc4R/gXt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFgXlxia2JtbHpvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnaimrqSZiYOYq5qfpYqbpZ2pnYWMmo+HnJGFko2MjXSGeoiEcI2FfpiUdHSFcpKDbX+LkoeGk459e4KGmaaOf6amjoGOioWUdoKHkm9si6mAg4uUjomcn4mMlKqin4+AdZSXiH6BeZSuo3+Bm3GPhXiPioN+e3KnjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3t9iWuMhVt5eXJ6cGhufpKJcX91gY+Uk3GGhIJljH9egX+Ld3RylHVveW5uh22EhV52aHiOZYCAhY2pm310fJZqiYhwgXZ9hnZubWeMc3l7mHiFXGtYeY9pbnhycm94eHBdbIZuaWdWW2BXXGZrZFZiVV9RX3B4eGxrdmZqa2t2fXFydXNhb3VidHuBeHV6g3WAgX+BeYuFg317bX9sZHhuXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNlLiopouhopqmpJilnKuioYSEmKySnqGJm6eaqZiDgZuLf5aTh46KiY1yg3yPfX6PhXuYj3Ryg3CWhXt9kouGhpCFeX6Ah5qljnynoYuGkJCFlIOGjph3coWphY6RnZCInp6IjJuon5+qg4mOlZp+fomWraiPkqaPd2+ckIJ5kW5+qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgnZ0gVlyboaRgX1+jGpdamR7hYSJgGBpeHqae4KKgXWBhYJnd4qGa2FwcYF2XnKKgYiPppWFZYyPg253i4Rxho96cWdoZXuDepZbXGpnbnZbe3l4dW5zc4JmXG2Ka2tiWlpfWllscVxfYVpfXWZ0fnp0cHRja2trfH1zfHh1ZG11aG18fnZ6fHt6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzeW9oam1gi4uqsKGQo6Ganp2Xnpioo6J+g5mtjaCViJyikaWVf3uYhX2SmYmIhoeKc32AjHaFi4KFl4pxb4BymIaEfpOEg4aKgXqBhYycoZGCpqKIeI6YiJSLi5yXhYN6rIKRl5mUip6dh4ihq56hoaOLiJObnKOZlqqhp6agkpuHlY17d42Ng6d+f5KRkpOcsqablZ6QjbKSl4SljIyVm5+JkJuCiJGKa3yOd3hlgoaQi3yJnYSHi5CIiICEhJB3fHl0maCIhomeioSUfn2KgIB1b3OEgn53hoaKj6aQg4WNh4ONkIx9iIyKkYR5bYOEfXqZanJoYXSKcH16d3dwd3SBXV5vhmhuX15aXV1UaHJWY1xcYmxodXx8c29wZGtraYB8bnmAcmpwcGxngXtygoB4f35/hXttgoyGfHl4e316g3lOZHZqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnbmelqKhmJSYmJSYpKCee4Caq46fjYagnIueln15lIN7jpmJhoSEhm54gYBzgYh+iZSEbWt+epeHhIOQf4CGhIZ9h4WOnJ6Th6yfhHKLkIaSkYudkX2Ne6qEjZKYlo+cloeGm6afoZqdhoKRmpmYkJqmn6WdnZCWf4+JdXuGjYOkenyOkJGGmKqhnZOdj42qjpGAnYyJk5qego6XfoaOg294hnJ1YX6Dj4Z1i5iBg4+ChoV+hYSUbnl1dJKhiouFmoOEjHN/iXx8cnJ7h4N6eIqOg5KmjoWDjoCDiomKd4aJiox+cW1/gXxuaGxtaF96f2h9fHZ1dnV7d1xfcH1udWBjW11eUWduVGVbXmJraXZ6fnFsbWRramiBgGxzgWxtdW55cIV5boeAdoKAfoV2cYKNiH57enx/e4KKYGl8anVoaYJlamNgaVxkdWhvYnVtbFVjcXllcHp7c2VqbWyLiZ63mqGjn5GRlZeLmp+fnnt4nqeRnIqHpJSLmJl5eo2FfImRg4yCgoJufH95c4GFfYuQfWtofYKYiYCHjXx+hoSGfY+CkJydkompnYBwjIuMk4ehooqFjH2okYiQkpeTlpN4jKOfoJ2WmX+AkJqYkoyao6GjmpeRmn2Mg3d/go6GoH9+jIyPfJikoKGTmZCPpo2PgZqRiZOXm36Tkn6HjoF0dIJwdmB9gI2GcYqVfIiMcYx/goWGjmh3cXiLmJGPfpZ9h4pygYZ7fHF4eoqEenmQi4KVpZOLhI96hoaHhXaChImIfGdzfX95e3Fsa2dffnNofHV2dH1zgGpeYHN2cHdkY1lfXlJraVVlWV9haGp2eYFxZ2tkbWhlgIFrbX5ocHFrfXmHemuMgXOBgX6BdHaCjYZ/fHp/gX1/j2pyg25zaWKHaGxiX3FWdG9tbmB4aG1XanR2Y3V6e3Jiam95iY2espKlpZyOj5ePhp2gm518dqWhjpiAjKKKiJqWeHuGh36DiX+IgoF/cX97dHaDhX6KkXhnY32Gl4qBiYx5fYCNg3mXgpaZl42XoZx+cIyCkZSGppuHjImDppWFk4uWl5OSd5GdoKGXk5Z5fo6Yl46Wmp2knZiSlJp4jYSCd4OWjZ1+gYmNjHKXo56hk5mOj6KMi4OWmIOSlpl+mIx8iI2AdnF9bnpkgHyKhXCGk3+QgmyHgoGAiYRldW97hpKXjHySd4uIe3+FfHtxfneIhXmEj4mKl6KVgYKKdoiEgoJ3fIKKhnhhenl9dH94Z21lYX9qandzdHV9cXxiY2FzbnVybWFaYV5bbGVSY1lgYWhrdnmGcWJqY21laH2DbGh1aW5vZ399gnltkIZxgISDf3R8g4yBgH56goN+fJBtdol0dG1limxqYmN1VoRpcW5geGdsYmp2cGZ5fHpxX3FshoWPnK6XpqiejYyXh4afk5eZfXiqnIqZepedi4yYkHl8gYx+fIN8gIKBeHR5enR9gIR/iYuAZF59i5WHfoSGdX1+in99mYWXlZiNpKOZf3OHe5SSiqePjI6Kk6GSg5GQlJeRi4GPl5+ako+Qc3+NkpSJnZ2eppeXjZWVc4yNiWuFl4+ZeoeIkIlvl52ao5OVio2ejIaCkpx/kpKVh5mIfIqJgXlxemt1bHt+i35thZKClHhwgoN9fop/ZHJpe4CWl4R+jHOPh4N4hn12d398hYB8goyDi5Okj3iDgXSJh32AdHaBiYVwYnx2enF9b2JvY2R8Y25vdnN4d3N0YXVgb2x1bW9cXF9eX2peUF1ZY2FobXR7iGtfaWZqY2h3iG5mbGlqbGeAfXt3bpCIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhubIdqaF9pcmKHaHFvZXZnbmxheWlrfXt4cGF3bYuAmZmqoKOonYqKkYaKnouVmH53rpmNl32fk5GWlIh3fnuKfXuAdnh/gHB0dHxvhn2BgIp/fGFbfo+Shn+Dg3N6gId6j5KJk5Kdk6aclYJ9gnyOi5KkiY6KjZibjYaRmJOWj4qIjJKcko+LjG6Dj4+RiJ6ZoqGXlomWkW6HmINmhZiOk3qIhJCKcJWalKKSkomLmYyCf5CefZKPkoyZjnuKhIdzcnVrcG51fIp0boaQjpJxdYB7gYGHe2RwbHh9mZN9g4hzkImAc4d5bn99gIV7hYuIg4uVqIx6h3t9i4V3fnFwgYaEZGl5dXVwfGJfcGFrdF5xant5eWxzcGV4XW5sc21yWVpfX2FrWlBXWGVjZ3FxfodmXWppZ2JncY1uZGlnZGlpgXp3dW+OhXSBgoN7dYKIhXiFfHiDhXqAiXd/i3t6cniDamtfcGh0gGpyb21xZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqBj52Hk511gaqVk46HoYyVk5CAdHx2hXh5f3Jze4VrcnB6bYp2gIGHbnFbWH6RjYh/f393dYGBgKCGkYuTnZihlZh4ioCBjYmcnoqPhpKYloWJlZmPlouLjI2MnImNj4NtiYuQkIqdlqGcl5SFmIdqg6KCZYWdipB+i4OLgXeTmJGekZCJiZWNf36PmHyRjY+NmpF8ioCCbnVwbG1vcHuFaXODjpiKcXeAdYKIgnhmcm51gZmOe4iDeZOQeXaHc2+Ie4WLeoqFgoeNm6OHe4N1gYt/d3lubIGEgl5zdXNxcHhaXnFhcGtecGp9e3FtbWpsdmBwb2pxbVpYYWFiblhRVFpmZ2N2b4SCYl1rbmRiZmuSbmBmZl9na4F1cnNwi4B1f4OAeHWAi4B5hX93h4Z3g4V8h4x/e3aKf2pxY3xjhnxucWx0amhvbHZ4X3F/eXx0dXSAgn6klZqtnqeWhY2Df5eUg5CgdYuglJKGi5uMlY6LenJ4dIJwcoVzcXWIa29tdm2IdoN+gG1uVVGBq5WHgnd/d3OCeoKhgpOClZSZnJOaeJJ7g42TpJqTjomVmZKFh5eZjJSLiY+Ph52Ej4p8c4uFiY6InJqfm5WUf5N+aISbhmeFoIeRg5GCiXGDkZePm46PjIyPjXh7kpB6jouMkpaMfIh8gGt2am5rbGx7f2F6fo6WgnZ6gHiDjHx5Z3Nsc4eVin6HhXqTjnF5g292jHqJi3mIfYGLj56dhHx6doGLfXdwamyCg3pheXFubXJ0Vl5wYnJhYGxuenFocGZmc3RocGthd2VdVmZgYHJTUU5cZmVdeXCIfF9caXJiYmVmkmpfaGRbZ3B+cGtxdIp9dnyFgHR1fox5e4aAeIiDc4aFfo2NhHx5lXhmcmqDYIh9b29remBqbnR/dV90fXmGeHRzhXx4oI+ZsJyljoKKf4Oah4CMnn+LmpSPhYiYjo6PhHd0dnOAcG+FdHByhHBrandug259fW11c1JNgt/IktaTfHB1g3aEoIOUd5WSmZyRmXuUc4WQn6GTk5GJkpuUhn6WloiNjYiSjYicf46Ad3qMfomMipybnZuVk3mMdWaHkIZrh6KEkYiXgoVjjJGZjpWKl4uNiotxepSIe42IipORiXmFfH5se2Vyb2trenlbgHmQjoB6fX5/ho56emhyanOKjomBhYR8lIprfX5uf4t+i4Z8g3mAjpSamop8dXeDkHhybWdxgIVua3VwaGp1blNfcGVwWmBscnhna2tiZnhycHBjX3dgYFZrX152UE5LYWdjXXpwiXRcXGV2YGFlZY9jYWZiWGlzc21qcXaMfXR5hoF1dn6Lc4CGf3qJfnKJh4GRi4h8fph2ZXNufWWIfm9wa4BabG55eXNhdnt7jXZyd4p3eZ+Lm66boJCChXeIlX59ip2HhqCRj4WMmISTjoeBdHdweXFuhG9tb39zZWV5cX1teX1qaGtjpJrB3K7voXNsdoR2haOGkm+XkZahlpyBknKFi6OXiY6VipCdloOBlZCFiZCAkYqJln6HenV/iXiHhI6cm5iZjo92iXVthYiKfImig5CJnISFXouTl4qOiY6KioSJbXuWgX2IhYmRj4Z2hX19a31keHVqbnlzV4h6koeFeX6AgIWMfnhlcml/iY6JgYJ+i5aEa4F1bYeQgY+EfYF4fpCVk5iQdHJ3h4x1c3FndnqEY3VucWJqd2hSYXFna1Zfb3R6YXJkX2h9cHJtWmNyYWJWbllceE5NTGRnYl53c4ltXFxkeV5gZGWFYGNjXllqcmtua3J3jH50d4SBeHd7iXGDhHx+iHt0i4mHloaMf36Xc2h1cXlti3pudHCAV3F6dnlxZXh5h4xpdoCJcn+ch5mnnKOShX1wjJR4eYudhIWhjY58lo2AmoiEe3N3cHNqcIFsam18dV9heHd7cXV7Z2BkfOvatcnD3IhzbHSBdoubiY5qmZCQnpaUgYlxhYmgjoWLlYqMmJR8jpOIg4mQe5CLhY+Bf3Z4g4RyiIKTnJeUl4aMdYZ9boOBiIaYoYKTi56DiWGDlI+GiYaJjYeBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXR3a1qMfJKDhX1/g4CEioJ1YXNriICPioF+fpGQfG2Ba3iFjoWRgnuAfH6RkpCWiG5weYyGdWtxbHN5gmB1am9da3dgUmVyaGZTYHB2dGFwYF1og3FzaldnaGJpWG1WW3VMS0xmZ19icnOFaVtcZXleXmRne2FkX11Za25mb2lzeIp+c3OBfnp2eohzhYN8f4d2d4qGjpmBjIJ7k3Vsd3V5eJN0bnh7fFh6hnGAb2d5d5KCZHaGhXGKloWZoZqiiodzb5OLcneOnH6LmomJfJ9/hJp/gXhyc25vZHJ/aWZteHhcX3l7e3FxgGphZ2F/1baOkKZ4bnF3fHGTkY2Ha5qPiZ2TjIZ7aYeLmYaBkpGGh5iOfI2NgYGKjXyPjH2JhHp0eoN7cYaAlpqOk5SBiHSDhXWCf4mRnJ2FlI6ffohhf5OHhIiEiY1/gINnfZGAfn+CjI6Qfm2CfIJ0a213dXR3dmtjjYGPf4V+fIR/hIh+b15xcIR7jouBe36Qh3lwg2Z5goqGi4J6g31/k46PkoRubnmLfnVtbmxse35jaWxqWW53WlJqc2liUWNzeGxiZV5aaoNuc2FbZ19kbF9uVVtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmtsYm1qdHeGf3Fwf3x9dHiGeIWCfICHdXmJgZKWfImGdomBcHd5e4STb218gXdeg390gW1penSUc2dzh3xykpGDmp+boIaIdnaVfm12lJd+iJGEio6afYyadn12cW9samF1fGdianV6WmB4fHptcX9lZGhnV52PXnFzlrzEhHZxlIqQf3OYjIeclI2IdGuIj5WAe5SMgYSbjHyLhn18iYx/k4h1iYV2dn2BcXWGgZ6VhpWPgoJxf4dzg3qIlpuWhpONnICIZX2Sgn+Fg4mJcoJ+Z32Le3l/f4eLj31pgH2DdmZveXhzd3Nsao2FioGKf3mCgISDf2pdcHd6fIuIhXuAjn99coBoeIKGioWCd4J7gJeMj4x9bWt6iXx2dG9paH13ZV1xY1hwdFNUb3NoYk5odHhmYV5dWG+Ab3NZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebGNaY3B2ZGdcXWBramNsaXN2gYNxbn57f3R1g3qEgnyChXZ+iYGWkXiDinSBiHJ5eX+OkG9vfIFxaYF5en5tbXx2lmtqeIR0a5SNhZ+YoJqFiG59jHZqeJiPf4KKgpWYinqPlm96c3FsamRgdHtpYGZye1thc316Z3B6YWVljrGyd0piWqTZ0Jdye5KMkXl/loyFmpKNhm9shpKRenmTh4GEmYp8h394eImKhJWAb4qHcXR9e2p5hoOlkYSTjYN+bn6CdYJ3hZmYk4qSj5SFh296koN9g4OJg2+CeGiAhXhyf3+Diod8ZX1+hHVjcHOAaHlxb3WYjYWCint2eICEeYFqWm98cn+Hg4h9hYh6iHKAbXCDho2Dg3GDeICYjI2Ed21tfYN/dnplaGp+cmFaeFtZcm5OWHJzZmBLbXd1Yl5bW1l1fXJvV2ddZmpwX29OV2lSP1lnX1twamd5cVtbWWtlWWNxeV9oXV5lbGhmbGlxd3+Hb21/fYB1cIF7gIF/gn92gYWJl4pxgo1xe4Z9enqElIx1anp/bG9+dH99b3J8e5Rwb4B/eGaSioKhmJySgoVnh4RwaHqXiX6AhYKZioF8jY1peHJrbGZfYW95bV9ib3ldZGyDemFxdl9lZdXrvosyOj6LjoByeYaJj413hZiNf5OOjX9ubIWNjHV9j3+FgpWJfIN4bnaHhYOXd26IhGx1e3VmeYKDqIyDj4yDfW1/dHaBeISbj4uPkZKMi4Z+e5KHeICEjYNsgHNpf354bXx7gYqDeGF5hIFxZHFpfm10cXSBm4uAf4R+c3V9gHOAblprfXR4iYKKe4Z/fIh4eXBrh4KOgolxgXh/loqKfnRtanaAgHV1XGlpeHFZV31TWnJlTFtzcmVbSnF4cF5bW1lcdX91aFliW2dlbmJpTVdmUT1eZl1ddmZfdHBbWVVvZFplcXlaaF5gZ21naWxocHh+jmxqgoR/eW6Ae32Af4J6dYKBjJOFcICLbnd+gXt7iJOJgGl7fmt0fHKGe3N3fX+MeniEfnxrjIyDm52WjIGAbI1+a2l/j417fn+DlIJ/fYqIa3VxZ2hjW2Jnc29gYWx0YWhwiXphc3ReY2SboJBuXDVZr7V1aoCKfpOGd4eYh3WPjIp3cGyFg4d0eYl4iX2TiHp/c2d2iH59mG9whn1od3luZXqIhKWHgYeNin5ufnZ+f3uKmIaBk5CXiIuEiXyPiHF7fYV8aX5ta4B7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZWRgXyBfm93eXt0fWxXbX11c4qBhneHdYGJendybYh/jn+Dcn58fZKIiHpubWltgoF1bl1oZnRyUlt7TlxxXE9ccm9kVktzeWtYWVlaYHGBdWBdXWFnZGhoZk5aaE5BYWRcYHZiXHVtWFhTdGFaZG5yV2peYmhrZ21saXB3fJNsaYSKfX1wfn57gX+CeneAgImLhHJ7h29xd4N/e4qNj4NqfntueHl3ind9eICCh3+Df356bYWMiJijjYSDe3aMeWtthImSeX17gpGAgH2Kg3BycGNmXllnX3BwYGFocGZqb4p1YXRvW2FkaXZ7f76cpqPIuHKFhHOTfXmIlIR0kY2IcnNwhHuDc3WGdIh3lIl5eXFjd4Z5gJNpcoR1Znd2Y2p8g4iegoB/jo59cn5zg3d+kI+Cd5WNlI+Hgoh6iYlreHl+dWh6aWx/eXNpenaAg31oYHeHfmpqc2h7gGl2gYyQlH56fX1xe3Z7c31hVXV7cXOJg4J8gnCGind3b2+CgYt9fHh9fHWNhYJ2aHFobIiCcnBdaGN0b0tldkxeb1VUWXNtYlFPdHliU1hYXGFwgnRbYFxoZWRjamRQW3FJRGRiXGNxX1x3aFVXVndeXGVuaFZsXmFqZ2Vvb2hwd3qTbmmIi3l+c3t+eYKBgnx2fYOIhoNwdoNzbXeDg36Ji5R/cYB8eHl6gYt0g3h/gYGChHmAdm9+iYubnoh9hnp3h3xodIaNkXp/f3yJhoR2kIBncG5fZFxYZVltc2FhYXFsbGiJbmBzaVleZG2Ad6naqseGh7NyinlwjnZ9iJCBepSKgHV0dX53gHBxfm2FdJSFeHRsYHqBeYiOZnGDb2d1blttfYGQk4CBeZKSfXh7bYZ0f5CLg3KVipCOh4WFe3+FbXV2f25od2ZtfHZtand2f398YGJ4hnpodXVjfntndIaOjJV7dIB1cYB6fGx+WVZyfG90g4Z/f3hriIZzeGp0f4KCfHl8d3tyioB8c2d0ZG2LhG10W2tgdmZIbm9MW2NYV1Z4bWJQU3V3WVFWWF1gcoRvXGBjbWRjXW5iVF1yR0NmX15maV1ae2JSVlx1W1tna2FWa19hbmZmbHFocHZ4j3Rrjo11f3Z4fXeBg4F7dH2DiIiDb3GAdXF1foaCiY2Ke3d/eIR8fYWHeId8fYF+hIB7fnN2eYyOn4yJeol3dYN5Xn6Gmo15h4N0hoaEd4l7Ym5sW2JbW2FVanRkYFtob3Bnh3JhcWZXXWNrf3zKzoe5omtubottcoVyfoWLf3uShXp5dHl1dXtqbXVjhHaSgXZvZ198gXmLiWVxgWpqcWNYbXuGnImDgnOXlHd+e22HcICJioZwlo6QiIWLg3p5fnFxb31naHJjbnhyamxxd318el1leYB3aXV5ZoJ2Z3SHjI2UfHKHam5+gHhte1xYcH1sc3+KfIFubol/cHZmdn6AfoB1e3F6c4Z7eXFlcmBtjIJsc1hrX3hdSW9sTVdWX1RVfGthT1R2c1FSVFZdYnSFaFxga2pmYlluYVhjcEdBaF1gZl9cVnteT1ZlcFpbamhdV2dgX3JmamhyaHFzd4d4bpWKdH97d355g4eAdXN/hoWOgnBwe3h3dXmHhYeMhnp8f3WLfn2GhISHf35+fYd/fHh1eXeRk59+jH2LbnWAeWSDiJeGdJKKb4WFgnqDdWNuallfW11dVWhzZWBZZHJyZ4FzYmtkV1tgaX94vq57n7dtYnSHaXR8cnqEh3t+jYB4eHN3b3t3ZWpuYId1joByaWJffnh5ioNmcH1oamtbV294iqOBhX9xmZNxgHh0gW1/gZCHcpOHjIeDiIV9eXRyb2h5YWptYW12a2drbHp3endbZ318eGVzfm6EdGV1ho2GlX5wi2ZreoJ0bHRiW216anR7i3qBZnSGfW1wZ3R+d3x+cXtreXuBeXdwZWxhbIl+bW5Wa2B4VktrbE9ST2lOWX1nYk5VdmxNUVRVXmZ2g2ZdYXBoZ2FXaV1cbGlKRWtaYmRWWFV5Wk5XbmpZXWxlXFllY150ZmxkcmdzcHSBeHCZhXaAf3h/fIWHfXVzgoeAlYJuc3l7e3NyhYeIiIR5gX12j399hImOg4GDe36Lg3t3fHd3mp2XeoqDh2l2fnxshIWUgHKPgnGGgn6Cf29mbGdXXVtcW1NlcGVfWGNzdWl1cGRlYldcXGiAcG9ygHOJZWV5f2p0dnR0hIV4goR6d3R1bmt6cGFna2eGdI2DbWZeX3xve4l9aG13ZmlkVldycI2nfIR8dpaQc3xye3ltenqQhHaWe4eGgoaDfXVwcm1ndV1taV9sdWRnZml6b3tyWWeBdnVncIB4gnZid4WLfJSAbotqbXqAcGVyZWBreGZydol6fWF1g3Zpa3F0em94eHJ8ZX1+fnh2bmNlYWyGfG1rVmpiclRMaWtQTE5wSF57ZmFOVXVlS09TV2Brd35lXWdzaWVfVmNXYnBdS0trWGRhVVRVc1dNWXZlWl9rYFxaY2Vfd2dtYnBpdG9xfnV0mYF4gIB4gH6GhHp9doKDfpiFbnJ0fHp0cYWFj4KAeot1dJCAfYGUjoCFhHx+jIZ6foB2e6OlinmIhoVsdXx7dYSCjHpvhXN6hX2Cg3VuamllVl1bW1pTY25lW1hhdHtqaG1oYGJXX1tpgGlrb4BnbGFpenlqdHV0b4aCe4F9dnVuemhqeWpfZW5pgXeQhGhmWGJ3aX6Hem9pb2dmXVVYb2iPp3aBenyQjnh1bn1tcXR4jn53lHSFgn+FiHZqcnZnaG9cbWVebnNfZ2JqeGh7bVttg3N0am+Afnl3YneEhHiPhXOIcXB5f3FicGhbbndkcHOHe3hhcoBwZ2l4c3Frd3ZzdWKCen53dXBjY2NtfH1ra1VpYmdUTG1pUEdSbEVheGZiTVRzXkpNVVllbHh7Zl9tcWpjXFZfVW9vV0pTaFhnXlhNVWxUS1x6X1tfa11dW2JlYHpobGFvb3Vub3d1epd9d4CBeYCAh4Z6eXqDfYGThHF0dH96dnSFiJB9gH2QbHOVgXuCn4V/h32AfoaCgIp7doSsn396iIeEbHKCeXaBgIJ0bodvfYB0ioBqb25kZFhfWlpaVWJqZ1xaX3WCaV5tbFxhVlxca4FlcnR9aWpdbHd2aHV3cm6HfH5+enZzbHpnaXdnXWRzaHp3koFjY1Rkb2eChHd2ZmhqYVdWWWhkkKdufniAi456cG97ZnhueYp6do5xg31+f4ZuZHZzZGhoXWxiXnBvW2debXVlemlddIBvcmtxe351dmN1hYp7h4eAf3dydX5zYHBsWXByYnFxhHt1ZHKAbGBsem9qaHp3dHBkg3R5eXVxZGFkbXN+amxUaV5fVUx0Y1FHV2JHY3dmYUxUcVlLTFhYZ2x2emVlbXFmY1pYXVh2ZlRKXGNYaVhYSFdlUUljeVtdYGxbXlxiZF6AaWpfb3R4bm9udoOXeXKBgH2AiYyGfnZ2hniGjH10dXWCeXp6goyOfX6EiWp0loF7ip19foV5gHt+fIaIc3GProx7e4aQfmZxiHp0fX12cm+GbXt+bY96YnBvYmVdZVZaWVdjZmtgXV1zhmlYcG1bXlhaXGx7Y3F3dm1jW250dGh1dnFthXl/gXl3bm90ZWh0ZVtndWZ2dpJ6YF1TZWZqgoFzfWFjaVxVWF5iZJClaHl0goWQeGxueGZ3bHuDeXSIcoB4e3h/aGV2bWBmYV9qYF51a1llXW9uYnpmW3h8a25ucHd5dHVlcoOSf4eDiHp2b3F8cWF3Y1pub2FwcYF7c2VxgGRebXZpY2Z4enNrbYB0c3xycWJeZW1vfWVpVGhZWlVOeWBSS1pZSGJ1ZGFKVW5USkxaVmlscntjbGxzY2FZWlthd1xUS2NdWWpTVkdZYU5IanZYX2JtW1tfYmNdhWloYW54eWxvanaBkHhtgn6AgpKIhIF2dYl0i4Z0cXZ2gnh8fX6MkIB+k35weJaDfZmSeYCAeHl+f3OIg3NwmaJ7e4CJlXlkdYh5c3l2a3Nwf2x5fHCRcl5wb2FnYmxUW1pXaWRtZlxccolmUnJtW1lYWGBsdmRqdWpqX1ttdHJtdHR0a4Z9f4B8d29ubGRpcGNba3JkdHaOc1xXU2RgcX9+cYJcYWNeU1phXGSTn2VycYSDkHNranhsbm95eXpxgHZ/cnl6emRmdWdeYlthaFxed2lXYl5waGF4YVt7dmpqcm93dHN0aXCBlIOGfoR2cmpwe2xldldbam1icHKAenNlb35bYG9xYl5pb31sanJ9cXB3a3BgW2VrbXthZ1RnVVhSUXdcU1BZUkhjc2JhR1ZsUUlQWlZrbGt8ZW1vcWFbWlhZbHBXU09mV1dpU1RGWlxPSXJ1WWBkbWNYYWBhXoxqY2RteXhrb2l1eYV7a4R9gIWZfYKEeX2IbY+GcW93enx0goJ9i4+DgpZ0eIKThoGfiXWBf4F0f4Jwh4J1b6KXc3uGi4d7ZneLb258cGZ4cXtsc3ZzjWtedG5hZ2ZrU15cVmhibGxbXHGMZE5vbVxWWFVnaXRoY3RlZV1ab3ZvcXV1emyIfYB9iHeQc2Nka29hXW5tZHN4iGtaVFZiY3d8fHCFXGNfY1RaYFpjlpVjbnCDhIlyamd5bmVydXF6a3lzdW56fnVfZnNjW15XYmRZYXVmVl9hbWNhcV1dfm9oaXNxc3B1dWtshJOBiXuFcXJmbntvcG5SWmVqZXFzgHZzYmx2VWJxa1tebmR8ZWt0fHFycmptYFljaWp4XmZUZVVWUFVvWFFXVFBIZXJfYUZYa09JWFRWbmlkfGlreGthV1xVW3RkU1JWaFFZZ1RTSFpbUE54d1tgZmxpWmJgXl6PbmJma3l1bm5pdnZ+fm2EgH6Gl3t/h4GJfmuTiHJndIB6dYCDfomPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYt3eG57jWBkfHFneXN5bW1xdoNnZHxtY2ZnaFNgX1VnYGxvXF5ujmhNaWxgVVZTb2ZzbGV4ZGVdWnF1bnN7eHNuiXuBd5x7emxiZWxtXmBvamVxeX9nWlZYX2x4e3tvg19iXmhWWWBYZJyIYmtxgYZ8d2tqdmxbdXBqeWl1cm1ue4ByWGpuXlldVmJkWGVxZFRfYmliYm1aYH5rZmtzdW5td3ZraIWMf4l6h21xZm97bHFsYlhfaGhvc4Bzc15pbVNlcGRVYm5heWJvdHp0am9sal9YYGZodV1lVmJWU09ZZ1NPXU9PSGVvXWNHWmpOSl9LWG1lX3hobn5kYFVeVF10W1RTYGZOXWJVU0pcWlFZdXZdX2ZtaFhiYVtejnFjZ2p3cXNtZ3ZzeYNzgoN7iI5+fIqIjnlukIp0bHOBc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY2Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2NjY2Pj46Ojo2OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZmeoKCgoKClXiovLy8wLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJybm6KkpKSkpKpWFRwcHBwXOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6Oj4+Pj4+Pj4iCg4OCgoKFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5GLkIuKkImPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2MjIyMjIyMjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoaMhYqKhoiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiIyGiIeFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCIjY2JhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMkIiMh4WIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2PjI6Kio6Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+JiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5OUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpKTk5KSkpKSlJKRlJOVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkpGRkpOUg4WUkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSko6DkpGRk411iZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCRjm9/kpGRfHSJkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+QeGqEkYpzdoiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo97Z3GOhHJ1h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjnlcaHVwZG+Ijo2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLioqGZGlrXGdqa4OFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d25jdWxbanVuZWhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hnYGdvb2ZscnRqYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXllcYmdqcm9xc21aWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVJfY2Vtbm5qaFJRVFBQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OT01NVWNrZ2xtbWdlWVFPT1BRT05OT05PUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0VFS1JeaG1nbG1sampmYlxVUE9PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEZGU1tdYWZqbmpvbWtqa2tqamZaS0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7P0BDU15jbWxsbndyamlraF9UTUZFRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7PDtHS0JOYm1wenNramBLRkJFRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs9PDo+TWB0cGNOQz9AQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5Ozo2OFdmQTg4Ozw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT08PDw6RFk5PDw9PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APF1uQD5ERT8/QTxGXT0+PTs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdJODs6PT1BPEtiPTw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlMRkZ2d043ODg6Oz4+V2lBOzw8Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dnd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXx3Vjw9Pz09PkVpdE06PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4ODgH1dPkBDQEA9SXJ7Wjo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2EdUxBQ0VAPz5Ye4BdP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVxQ0RFRENXdYaHh35YR0hKTUxOT09MSEdISEhJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fH1+fn19fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIptQUFWdIeJh4eHiINXSExNTE1OTElHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3Z3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbIWHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUlKSUhGSkpKSklKSUpKSkZJTExLSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGhIKGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJioyMi4qJiouMiVQ6ODY2Njc2NjY0NTc3MzU2ODo4NzY1NjU2NzY3Nzg6Njc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIKDg4ODg4WJioqJiYqKioqLiYqKgUc2NzY0Njg4NzQ1Nzg1Njc2OTk3NjY3NjU6OTo7Ojs4OTg5ODc3Nzk6OTg4Nzg2ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiImKiouKiYmMej45ODg7PD0+OTo6PDk6Ozk6Ozo5OTs6OT09PT47Ozw9Oj47OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXN2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA+PT0+QD8+P0A/QD09P0I/QEE/QT89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t9fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4qLXj5ER0lLSklGR0dERkhHRUJAQENFQ0JAQkNCP0BESEVDRUNFRUFGRUZERUZEQEI/PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqIVkhNTE1MT0lJS0lJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE5QTkxOTEpMSklJSEpGREZISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hHR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7PD06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIuLio1yTlJQTk1NTExKSEdFSUlESkhHS0pISkdHR0tMTkxMSEhJSk1RTlBOTU9LSUdJSkhJRElISEZGR0dIR0NCQUNVbnB1d3d5enh5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4tfUlJQTU5NS0pHRUJHSkdMS0ZLTktLSkpMTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRkZJRkVFQkFCQlxvcnd4eXp6eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxYVlJSVFNPTEtKREVGS09OT1dVUVBPUVNTTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hXVWthRVJRUVBJOztSVFJgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTlJQUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQkNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqLjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJdXVddWlVFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd5eXp7ent8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3lucFhaXFtSU1JWVlRbWnWDWVV9kGBcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVRVVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlbXVRZVVZdWktUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlNVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlRkVX9SUVFOS1JUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXZ1c3N3enp7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZPRkRFRklHSENESEdIS0dEQkFEQE5RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgmtNRz9AOjs+QEA/Pz5qUUthRUZISUVCP0dMTkdNUVVJQkU/Pzw9PD09Pz0/QUNDQD88PUI+Sk1HVW50dHVzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqamZgW1FSWlxZXkpKUFFOS0xRUlFUVlRXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV05IR0BBPDk3NzY5OT07Ozs4OTg5PzxCSD9cc3R1dnV2eHp8fHx9fHx9fX5+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH19fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aWE1MVFRTUFFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdYWGhza11WYXNrYWFfXmRhX15ZVFFOTk5MSUhKS0lJRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTlHbnF0d3h5e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fn9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1VUTEtUVlVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz88Ojc4NzY1OTk2NzY2NVdwcHN3eXp7fH1+fX58fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydXl7ent9fHx7eXx6en5+fHt1dHZydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7PkA+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU05PUExMT01LTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZFP0JDPjxCRz9CP0FkcHR3e3p7e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk3Nzk/Qj47P0JAQD5BRElFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNTk5XS0tNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7ent6d3R4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEpEP0E9OTk5Oj9CPzxAQkJBREVHS0ZDSElHR0hDQz9CPz9AQT5ERURLTVJUTEpJTVRHSUlKTEpLTElKTE1PUFFQS0dDS0dDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktER0I9Pj06Ojo7QUI/PUJCQ0NIRklMSkRJSUZHR0NDO0FAQj5AQEJFRElNUEhIS0dIS0RISUtNSEpMSElKS0pNXFJISERORkFES0pNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3t4fHp9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZFR0VGRkdFR0JDQD08PTk6OjpBQ0A+QkNFRUlFSUpMRklJR0ZGQ0I7QUNDPkBDQ0NER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lIRU5JQkZNTE5MT01OTk1LSEhJT1JRU05SZmZmcW9zeHV7eXxsaGpuZWtxbHNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NDRUBEQj5APzo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1FRUI+QkNDQ0RHSElHTVBKRkZHS05PS0ZISkZFREVJSkhLSUZIUEtDSU1MUE1PTk9PTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxmcWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMR0VFSENCQUJEPUNCPkA9OTo9Pzo9PkBCPkBCREdKRklGSUhGRkdFQ0NBQUZGQ0JDQkRFRUdHSUZMUUxJT0pKTExJR0hFRkVEQ0lJSEtKR0tSTUJOT01RTk9PTU5PS0tLUFVXVlVUWF9eXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJAREQ8QkFBQzw4Oj0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUpJS01LT1NORFFSUFFRTlBNTlBNTE1TV1ZYWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW95TUhHSEhCQkJGRTxAQ0JEPDc6Pj06PjpAQj4/P0NFRkRGREVIRkRFRERFRkdKRUVKR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgX2hlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkU8ODo+Pj08PEFCPD8+QUJGQ0VDQ0hFQ0VFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZDRUVESUVGRUdFSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1JSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpnZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZJRklGRkRJSUdJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJkaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdER0lHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUVDSUpKSUlLR0RLSkdISklJS0hKSk5MTkxJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxrVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVKRUVKTU1LTExHR01JR0pLSEtLSUtLTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZmVxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm5cb3VncE1Kcnl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEQEFCQD5DRkdCRkNGRUVFRENISEdERUtIR0xNTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0hFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHS0pHTU1OTE1OR0xOSUxLSUpNSUpJSktPUE9OTUtOTkxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SE1HSURFRENBQj1CQUJGREdGTEhFQ0NIS0hIRkpMTEZOTExTUkxHTE1ITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnRzdnNIS0hJQkVFRUFAPkREQkdESElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLS0pOSUhKTElLSklISk1NTU1JS0tLU2tiW2leX2ljcnJaX1lqb19lZVVrX2NbYWFRYG1oXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElHS0tLTEdIS0tMTExMSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVpdWF1cXGNmYWFlYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQENIREZHQ0lLTEhGREdLTEhER0lQS0xPS0xXTElFRUhJSkhJS0lMSkhGR0dJR0hJRUZLSUpLTkxJUFxXXlBcW2BeTVhZU1xcYl5NWVpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRENCRUlFR0dGS0pLSEVFSkpLRkVISFBKTU1KTVNIR0VBSEZKSUtLSUxKSEZFSUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5ud4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNHSEVIR0hLSUlJREZLS0tFRklKTktOTEhMTkdIRT5HR0xJS0tKTEtJR0VJRENERUJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZKR0hHSEtJTERES0pNTUxMSEpKSEpGP0dGTktLS01LS0tJR0dDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHRklGRkZJTEpORkRLSkxOSkxJS0pISUZCSElRTUtLT01LS0lIR0VEP0VDSEhCQkdHRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTElJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VEV1VFXFVeU1ZfWE5UVU5aWk1KS1RgYVtfWF5eYV1OWWJcYGBfYmNiXWFiV19fVFBOT09XUV1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUtLTkxMTE1LSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0JFRkJNSEJLTFBPTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xRU1JVWllXWVhYZFdPU1RQUE5NT1RTW1lYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSUxLTEtOTVVOT0tLTEdHS1BTU05QT05PTk9IS0ZgRURfTERmZEVNW0leW3JtT01VbVlMQ1FgVWtXZ0pdWFVeRE1RVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalNXVlRbXFtgYGFhYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xIRUdGSEVFS09TSUpGYFNHSk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUX9RSXxZWXFzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1xmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEdJTEVRVkxLTklLUlhXUU1PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWlJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b355b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpLR0pQT01NSk5WXllVTFFTTlhaTFNTUk5MUElRUlRZV1dQVFBQUFFLSGd4bGN4cm1bS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en5seHp/b2hvWXZ2anV1cIFgcmd8aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXdybk5LU3ROQ0JGUFBISktKTFFPT09NUFpgWldLVFdQYV5SVlFZUkxPSVNUVlhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybW5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGZlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUElMTUtMUVFQUFBRV1xYVU1VWVVmWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGR8aXJ8XlRMbGB2dWtpdXx7bX54a3xwXV5fYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYWFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElISFFQTE5PTU1TUlJPU1JXUlZUUFdbVlZUVFRhX1BOTUtUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFQTlFRWFlSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1hYUl1ZV15XVFBZUlZXV1dYX1tncl5bW1ldXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09MTVZUUE5VU05PTUxRUEtKUlFLUU1LS09SVVJRUlNSSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVVWU1pRT1NSWFZUWVZUWlVUUlVTVFVXWFddWl5hXVtaWlxcYGNbXWJjZGZkZGRhWWBhY2FiaGhpbWNhZF5fY11aZFxibWFeZmVnbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEtPV1NQTlVQTlFOS1NQTE9VU05STk1OUVRRVVFTVFVOS01PUVRUUlJRVldUWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSV1ZVV1tZWl9dVVheXF5dW11hYV5bYmJjZ2ZkZGJYX2BiXmBoZWZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FbWlhXWFpaWFlWXGpkVlhZWldWU1NPSk5WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk9YUlRVVU9OTVFTVVVUVFJUV1ZaXVxaVldRUldYVltbV1FUV1ZWVllUWFhVUlJZV1ZaXVldX15WXl1eYFxbX19fX1piYmRoZ2RkYlliYGFeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxbWldbW1xZWltkcW1oZF5bWVZVV1FMTVZSTU5ST1FST0xQU1JVWlVTUFBMUFhXUldTU1NYTU9QUlRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpYV1xeWl5fYFVhXGFhXWBiX11gXWNgY2doZGZgWmNgYV9fZWRfYGNbWlxbXFlaWVlXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cXlZcXmpxd3mAYlxbVlZYUU1PVlNOUVFQUlRSS1FUVFlaV1VPUU5TWFdUU1VSUlpPUFNTVltWVldUVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVVNTXVhaXV5cYGBgVmFbY2JdYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFtdXl5bYFxgVVxdaWpyfXNsZ1xVWVdQTlJaU1JRU1JUVVRLUlZWW1paU09TUlZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxVVFdeWV1dYF1iYl5ZX1tlYV9kZF5eY2NhXmVmaWRmXl5kYWBgYWJkYGJeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWVteVl5ZXVBPT1JaUFpUVVZWU1RUXl5gX15iXGBVXV5ia3l0bH1rWlVZVVFQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paVFVWWllaV1haXFZVWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09RV1lRXVVWWVdXVVhfX2FhYGNdYFRdX2JlZXWBemhYWVlTVlNWXFhXV1ZWV11YT1VdWl5dXVRSV1NXVlVTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxWV1hbWltZWVpbWFZdX2BeY2JiZWRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9gYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVZWXGBhYmNhY19fVltgZGFfenVvaFlcWlVYVFdbWllcWVhZYFdQVl5cYGFcVFRYUFVXVlRWV1JTVVdaWlxfXlpfXFZfX1leXlleVlNZV1lZXWJaXlZXW1xbXFtbWltZWV9fYGBkYmNkZWJkWWJmY2ZmZV5hYmBjXmJjaWRjZ19nXmJiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVlhQV1ZXV1dWU1VUWFxcXmBgXWBdV2FeW15cW15YVlhYW1tfYFxfWFldXF1eXlxbXVhbYGFeYGRjZGVlZmJYY2VkaGdkXmNgX2VjXWVpZGVpX2ZeY2JjYWFgX19bWFlaWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWlhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXlldXllYVldbXGBeXWBaWl5dXl5hXFtbWlxfYl5iZGNlZmVmYlpkZmZpZ2NfY15hZmVaaWljZmljZV5iYmNhYGBfXV1aWFxZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhLWFdcWVdcW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpiZWNhUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfYFxbXl5gYmNcXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaWJoamVkYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFgXltgYWJlYl9dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8fHx7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8fX19fX18fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKgkU+Pz8/P0AwKisrKyolYpKMjI2Njol+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzNCEaGxsbGxRdlo+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXp5e3hub29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1dHNzc3Nzc3l9fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnd6eHt6eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx8fX19fX19fHt7e3t7fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH16fXp7fXt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHp9fH1+fHd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8enp7fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt5fH18fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4eXh6e3l8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3N0cnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycHFzcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzcXRzcnFvhoRucG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXiDcXJycHedf25wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFxdqGIcHJwj6F9b3BwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXJvlap/cHegoX1vcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnCPsZ5wgaWhfXBxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycIy2qpGbsqZ6cXFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3N1oKejs6impXh0c3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHd4eIKon6Oxo5ukj3p5enl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fn18e3x8j6ORk6WcoKGWe3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2OoJiWmZyWkJmCf399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgI+xqqWfoZ+hoYN+gYB+f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f3+AgYCDpK6hp6GgoKisnoV+fX6Af35+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f4CFj6expJynoaCgoqOrqZyMgoCAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KGi5upqqOdmqKdn6Ggnp+ipaGVhoGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgoSHkJiYlpeZnIyUn52bnJqUjIiEg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoGBhIaOlpeVh4+anJaOiYeGh4eHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGCgYGIkpeOlJqThoeHiIiIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SEgoKCh5KWioSEg4OFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKCgoKBiJGCg4OBgoCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAgICIkYCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/gIyWgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmIqDhYSEhIKAkpqGgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSk4+MjIqFhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYucjYCCgYGCgoaUk4yBgoGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeLgIOBgYGAj5OMkIGCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p9hIWDhIKDg4KOiYWMgoKDgoKCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUk5KSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf359fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMi4iFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aDgH5+f35/fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6Fgn9/f39/f39+gICEhYSFhoaGhYWFhYaHh4aGhYaFhYaHh4eIh4eHhoaGh4aHhoaHh4eGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoeGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiHh4eHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoOCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmKi4qKiIiHiIiIh4iIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaGhoWDiZSTkI+QjoqGhIaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgYSEgoKCgoKCgoB/fn19fX1+fXx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGh4eFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoODhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4iJh4iGiIeGiYmDg4SDhYSEhYWHiIiGhYOCgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDhJGSkI6PjouHhYaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGh4eEg4GDg4SFhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4GDg4ODg4KCf319f4CAgX99fn59fH19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn1/goODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af3+AgIF/gICBf3+AgYF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/f4B/fn59fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gIB/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh+gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAgH+Af4GAfn9/gH5/f35/gH99fn19e3yGk5KMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgoOBgIKBgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTj4mJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf39/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeIh4eHhn99gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjYSEhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSCg4OCg4WEhIWDgoODgoODgoKCgoOCgoKSkIuIiIeJh4aGhIaFhYSEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEgoGDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fXx8fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMi46KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fXyAgYB9ho+BfX2Cfn9+gIJ8fIB/goCCgH59e4qCfYB/foGAgIGCgIKAgICBgH+LlJCMjI6OjYiIh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIKAgX5/gXx+fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gZSSjY2Njo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fX1+gICBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY+OjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f32LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjYyPjYuKhoSGhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fnx7fHx8ent6fX+AgISDgn9+f3x8fH18fYGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3x9fXx6fHx+gIKBgICAfXx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISDgYKBhYaFhYaGh4WBhJGPjYuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fX18fHx7fn57fHt8fH18fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJioiLiYWIko+MiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8f4B/f39/f4CAf35+fn2AgIB/f39/gH+Ag4KAf4CBgICAf3+AgX9+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9e318fX1+fH59fX19fHt7e3x7e3x7ent7enp6e35+g4WIh4iKi4uKiYyRkI6KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99fn9+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt7e3t5enl4eXt+f4ODhIeJioeJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18fn58fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiPjouLh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKFhYSCgoGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn5/f319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY6LjIiFhYWEg4OBgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYKCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH9+foB+fX5+gIB/gX9/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKi4mIhoaFhISEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISEhIGBgIB+gIKAfn5+gX9+fn+AfX6AfX19foB/f4GAgYGAgICBgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISEg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhISDg4SDgYB/gH+AgX59fn5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn19f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359f3x9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Bg4F/f4OCf3+Af4F/gH98ent6fHt8goB/gn9/gICCgoGBf39/goB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4GDg4OAf3+BgYCCgYGBgICAgICAgICBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgH16e3t8fHx/fn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt8fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+Af4CAf4GCgIB/foCBfn+AgoGAgYOChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx/gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXh5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Bf35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59gICBgICAgIB8f3+Afn+BgH9/foF/fn9/f319fH+AgICAfn9+fn99fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYl9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB/gH99fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KBhIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYGBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/fn+Af39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f356gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gIB/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgYF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+Afn+AgH9+fX6Afn5/gH9/f4B/f4CBgX+AgYB/gYCBgYOCgYCAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf3+AgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBgICAgICBgICBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHh4dXh4eXt8fH18e3x8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgoKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgICAgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf4CAf4CHfn58e318e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGBgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f317fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCgoKDhIKDhIOAgYODhoODg4KChIGEg4GDgICCgYSBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOCf3+Ag4KAgX+AgoOCgIGCgYKCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDgoKEgYSDgYOAgYOCgoKCgoGCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4F/f4GEhIGDf4KCgYOBgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SDhIWEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgoCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4SDgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7fYF+fHl8enp6fXx8gX56fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgYKEhIKDg4OEhISDhISDhIOFhIODg4KCgHyAgX98fH16enx9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KDgX6AgIKCg4KDg4OEg4GCgoODgoOCgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSCgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhYOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4KBhIOBg4OEg4OEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+fn5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4SDhYSFhYSBhIODhoKDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhIWEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeoR/f39/hISCg4OCgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN+g4N9gX1+f31+goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYKGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6GhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSBgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfXVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhIaEhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEg4GDg4OEhYSFhIWEhoOFhoWFhISFh4aEhIWGhYZ9d4WEhISDgoF9f357fHt+e3x8fX9+fX1/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoeFhYWFhoaHiIaEhoWHhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYWFhIaGhoSEhYaDhYSChIODhYODgX2Af3x7fH57fHx9f358fH59gH59f4B+foB/fX18gH1+f35+fn98fX1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKEhYaGhISDhISDhIaEhYWFhoWDhoaFhoWEhoeFhYSFhYOEh4aDgoOEg4SCfoGAfHt9fnt8e35+fXt8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGh4WEg4SEg4SHg4SBgoSFg4GAgIB7e35+fHx8fn18fHx9fXx9fH59fH19fXx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4aGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9fn58fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4eIhoaIhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH57e3t6e3x8fHt7e357fH17ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIh4iGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4WHh4WDhYWDgYKCgYOFgoN+gYKBf4OBf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYWFhISDhIKAg4GGgoGCf3qEjHuAhIWHhoaGhYSHiIeHh4WFh4qHg4eFhoaIhoWHhIaHiYaGiIiHh4aHiIaEhoaGh4WFiIOEhYSHhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt9fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoiFhYSChYWGhYaGh4SFhoaGhYaCg4OFgYCBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICBg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4N/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn1+f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3uAfX1/gn5/gX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6enp7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoaGhYOEg4WChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhISGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCfn1+f35+f4R+e398fICBfYGAfX6DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1+f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFg4ODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2djX19fX19fY19fX19fW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6auubi4uLi4uLi4uLi4ubCKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIaEhISEhISEhISEhISCkqWjo6Ojo6Ojo6Ojo6WVU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PEJAODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKJh4eHh4eHh4eHh4eHhZWmpKSkpKSkpKSkpKSml1dXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjYyaqqmpqampqampqampq55iYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs/Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/O0NHS0tLS0tLS0tLS0tLRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/O0NPQztLU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXW1tbW1tbW1tbW1tfX1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/P0rmPvtScgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZuz1MCUsJyxlri5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6CqrtaioIuRw5N9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrHPmIedutTSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5mzyJmQn6DS08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P1aWZtL6pr5GhudevoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NalmbW/npqtm6nYo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpZq1xpamxZii0Z6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0Y/SEhHRUA8PD4+PD09PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1aWZs9GanJubrcefodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQzs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0tajmrDZpauknsW0pKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HVtYLD1cyTkKfXuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHC1NLUy73V0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT03NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj0+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6Njk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9CR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU5NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5uLi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubi4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo5Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tLa2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKuopqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qboqCalpeUmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5OSlJmanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKenJ+hoJiQoayXl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaWmp6alpaanpaWjoKChoZ+ZmZqWmJuanpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqSlpKalpaSko6KioZ2cnKJqiZucmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqW2qaOkpKKhoZ6amaWBVo6bmpqYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKCnqrCooKGgnpybmp2iWV2UmpucmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaGgpqKAq6Wfnp2amZmnf1VmlZydnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goKCgoJ+qd3atop6cmpqcpGthaZWcn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJyen56dqIxpjKucm5ucoJduaWuWnZ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZybmqOReXWfnJqcnaCIa2lrkp+cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmpqjlHh8hZianJ6ZfWpnbJKfnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuZmZmaoJyLnoB+mKCchY2BZm2UoJ2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZmZmpynoZFxZaasoWiBjXlrl5+en56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZihrZJ3ZWaml5pYZ31/eJ2eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmXp6V4Tkpwm4SEUkRheIKdm5uenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal6uZTjc8dJJ9cFM/NmF6jpKNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkJatc1RwV3ywqZlaZ25Ia32Igo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg36WpFyFm3zKxbHFnX6delB4goKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+kpFyz9fN1aacubxrXXJdZ4CFjo2Lho2UkouQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhH+CfJl3mtG9x9PHwbScd6WoY2KKio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYx/iI2Ni4uIkoybb6KmlbmsoqGJhXZhyItaiIqJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmRnqGdk5eboZqenKOgnYSTfI+ljYWLd3VwbKaXYYGPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaiprKqqr6eWflhyhnl5gG1raXV4f3h6oKGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipamop6uphXBSYHRxcnppZmJpa3B8haKpp6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaanaSmoqOwmHBpT1Z4dnR8aGFkZl9fbn2KoKSgoJ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKOnoqatp7CyqXxpY0lSc3V4gWhgY2paW2JrdYORnaGgnaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqmioKGoqa21ury9rIptZ2FCWm5wfX5uYV9mW1lhYWhweH+NmqChopmWnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOrqqeuucHGzMW3pY5yaGlaP1Nwb3FsdGhhYVpYX2NhYmpxdnuMn6ednqGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gqrS/ztnbzrqrnIhvYGFiU0NKeWtgYm1sW1tXWlldW1peY2ZmaHePpa+npZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1pdmtwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW8ztrd1MCkinZlXVlaXFNKQ21qlJ6UVlRYV11cXV1YVVdbaX6VqsHHurahp6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDub3Axs7RzbeSdWRbWVpXU0lVb6qzpk5VXmFiX19fZneQp7q+wcXFtLa2qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvFwcXGwb68zMSwkW9cVVhTUFOhtZtOWVtdXWBtjqq6wbW5qaextau1sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2pmaGFrbGdudXJydXFnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEJCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8PGxsGxkr+/zs68lWlYV1pMmbmTTFRZV2B/prywpqussqaqqamrrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhvemppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMS5tcC3s7zBxr6peVhVUYq3hkxTVV2EoKa3r6WttLStrqWko6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpaHZaZ3J4c3lmZl5kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvri9wcO/x72WbFJaaVpRUmSUq5+mtLKtrLi1sqypo6GtqaynrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXmpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMe/xMfExMbJzsqcVkhPUGutu7fAvb65vLq8urysraapu7q5t7+ytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aWpqdG55bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXFw8XEycvR06RSTGCwx8DJzcbEwcTHwby+tLGwsMK+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZnVvdGNdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPBwsbGxsjOikmTzszHzNDFtr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnY2pkYmttbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvr3BwMDAxapOpNHMxcnRwa+9vbi5u7u+t7Sxub6zvL6xubW4u7a8tLW5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjY2RqY2djW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvEvbrAxL+9vbi8wMSvU5zMxMDByb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWOvL67w7W6x7e2ubu8uLm1usTJqlSTyL+/u8G+uca9wr+8xbi2t7S4tra7u7m2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZmVmcGpla2hYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/Fea3Lvce3ubittrS3ubO1srvFyp9Vi8q/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdxa3RmYm5gXFRIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXr3aEvsjPwsC4rrW1u723ubG+w8eUXIbOw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudG94Y2diXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0Zt0d7HR0czKxLW6v8TIvr60vr+/hWp6y8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4J0b2xsdGxsbl9jXmFiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysKIdneozMzLzcrGwsPLzsG8uLy5r4J8bbzIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWRbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u6rNvDvra+wL6+uqacqrO3w8CmfHp8n8TGy8jBw8DAycrBv7u5saOYin6wyMXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3h0aHBeXF9cWlFFRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFtm2uzr22ucC8qn1uaG5tdIKXmXV7f5y+v8bAucC8vsXEvb24sa+nrJeXncrDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bHZ7cW5pXGBgWVNQQUZJR0tARUNIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbF2grO9trXBpIZpWl5gTlNbXHB2eoWkuLfCurO7t7u9v7q7u6+irLKiqIK+xcO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d29xYV9mXVtVSj0/P0dGPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmmhHiLoa+1nGpmZ1ZZX0lJTVBUb3uLqbC3vrmytbK8uby2ub61lq/AsLV4rMrDwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXV3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/GqId7doyhmF9TQ1lVSGJqVU9FSmWRpa+vtrq1tLKsvLm4tbjBvY2nwrKydqfKwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXVNPTkE+SkJAS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7SQgXmIkG5OSz9lWUJPeIGTaE1DXoWxtbO1srSvrLu6uLa5v8V4jripn2arv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211amxdXGtVXVtQTkhER01CRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhXxYRkFPh1hKSll4joNjQVWjubO0srCxrbC5uLa7t7u8kqSzrqR0rLCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh1dG9lVWFkV11RT01IQElSRE1DPTg4NzU6Nzw+OTs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZVoTT9TeHFQSUlLaJ2AWkVVsLqxrLOvrqyttraytLWuqaeemZuen6aonqCoqZ+hp5ablpeOnZSPkJaNl5ukqKCgoqKipaWdo6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56em5mml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjd2xuXVFpVVBPR1BNTENQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3CqqW8Z0RTm31RWElLYUpWjWJlZYOvtaqytK6qq6+wsrOtpZ2Rl5OPl6CfoqCco6SfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ua3tkaFZSZE5KSEdPU05LTkg8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCrxr/Kn09BdJhxUG5KTGNmdXRgXWJ0krKvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl5YGJTVmFISUpLU1RJU1FNOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpcbGjFdTSmakWWZ9b3JbUmtjXGdiYG2RtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlyd3VwY3d2WFdiYGRpW1pXaK2urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgH14dmp3dV5tW1JhSVJVSEZVV0pDTUc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCkf2+CcGBjWExbUlpMTFFZUkhPTkiZrKqppJ+fmZKSlJiYlpaVjIiLjpWdnJ2dnpeemaafoKilsaqnrqOrrrawtLKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOenIliV15lYFdNUUc9PkBDRD8+QlJ4qa2pqqWfnp+io52enZqcm5STlZSenZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a7u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqCjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJra3VycWhWXFFGVUhESlBJP0VBNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFFGRDtDPkY8Pjk2Tn6qs6ejo6KgnqWrpp6YnJSRmZ2ZlYyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3w8rKw8HHv7q0uru1u7ewtrKqurKuu7i/u7qruK2rqri7tbyurrmjpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrY2lveGtlWVtGS0xFRFRNRUNFNzo/OjU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklZfG9hQT1cjq6soJmbm56emZeXl5KNj5eXk46NkIyCg4J3cnFtcI+mra60ucW7zcfLv8LMzc3Mx8nRzMzMx8nFxszQ0tXO08m9wL/Du8bFyMXR083U0NPTzMrCxcbGysjPwMnRzMfGyMbCvMPBv7+/tr6zrb/Aw8PHxcfEr7+5sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXRzZWJncm9mXlpaQ05MREZQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaWZcVElEQD9Khp6kmIOgsq2jnpyfmpiXlJKUlpGQj4yHhIOIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fS19LV1tPUyMzHzM3K083O083GycrKwsfMx8nJxr/Ds7PIxcvLy8/Hyr++v73BxsXNzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAe3J1dmdjZ3ZqZFZXUURORkBJUUM+Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DUrDRvbKvppycnKCkoZ2alJOVlIl9eHFrZWJocm9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s7U1tfU09HT1NTTz9HE0NPW2NXW0svJztHLxs3RytLV1tnW19PX2M7Sys/RzM/QzNPQwMnIysTMzMzPz8XHyLbAy8DSzczQx8rJwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYGVyYl1SXElKR0FFSUo+O0E4PTU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFZSUBBREFGUXayr6aalJefnJqgoJ6bnJqViXdpY2FfX2BfXl9fXWFsdXNwcG9scnF1ksTIx9TV19fX09fQ1dTa1NTOz9XU1NHRzNHO09fW09XQz9LT0cnT0cjQ2NfY0djS19nU1czPz8rN0svP0cDGw8jGz87R0dLIzM3Ay83G08/Mz8jFy8fHyczK1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu32NTV2dnRztC/vMzJtr6upqqooaOrZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cWVjYl9fYV9eYWBfYGBfYGVtcHBua29yd3eczMHT1dPY2NbZ0dLS18/TzsvSzdXU0crPzdPW0tHWzc/V1dHF0dTK0NTV1s7T0djX19jLyM7Eyc/Mys3AysDJys7Oz8vQzs7Mz8/IzNDQy87Lw8rHyc3LzNLTzdPS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXpIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3O1MzO0s3L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXNwsjKw8zExsnKy8/Lzs3QztPMxsnQzcnHy8XHwcbKzM3Q0sfQz87OzNDFx8G4ub3Dw73DuLKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHFoWVhoVk1HTElQUUI7Qz47Njg6ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfDuMrV1tna29jMzM/I1tXEwrWvtKifrZd4bHBxeY+ajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYGBfYGFhYF9dW11ncnJwcnNxbXJ5pcfTz8vQ0NPUysXJycbGv8PFz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8a6xL/Gyr3Cx8nOxcPHwMfNyMTMy8zPyMTE0MnGwsbIxL/Bx8zLzM/Cy8zJx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG90ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7uto7Z+aIOFpKuTjY2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19dXV5fYGBfW1pcYGxycW9va2xvb3250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIys3JxMLLycHBy9DFy8i/ucK7xse+wMbPy8TAw7vJx8m8ycfFysC+wsvGxcS+xr28wcPFzMXGvMDJw8XH0sXByb/KycbIxtHDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdGZpWmFubVpcWFJETEZCR0VMREZTQDU0MzM1PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1drY2c/L0s3NzsjBtcO+sa+2bF56faGRipKWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lrcG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7usbDv7zBzsPGvr61wb3Du73Hu8O6tL3GxMLCt7+2tr6/u8zDvba6yLu/vsvDwcbCxcnHycbQxsLMyLLHycPOzMDFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2RWXllKRkpGSEtBRkJGSkA5OjY1ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysnGzc3O0cjQxdXU1dfNys7FycXHwbnFvauupmBkdYOTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvczAw7rAuK2wsaeqraynuLS2tLOztLu2vbG3sLWvsrvCvMHEvL+7tbK6vsC4yLm0u7fBwr24vcfBxLy1r7K2u7+0xbe7tau5vb7AvbG6trC3urPGvLevu7+1t7XFvL7DxcDExcbHy8XAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjJyMrIysTQzdLPzcXHwcbAv7q3ybaqsJlbZ3CKj4WIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaWZqbW5yfKTHwLi4tbCrrKeeoqmnnqqss62qrKq0rbaxs6mup6yzu7q2w7m6urGrtbm7tMK6sMCxvry7trzIucO2raqosLLAtri9sLGnsbO1u7yrrrWmrrauu7Kxqrmwrruuu7i7wMC+usO/xsPFwLzGwcfLuMXHxb/Hw8O6xMbCu8bJzMuzucK9u7OJc3Z2a2lgYmxpWVhXW0FMS01KRUFDP0ZBOjk6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTQx83Bw8a/xMTDw8rCycq/wLzCurO1tcOuqrCSW2p/koeOj3t4fYmFenuEgXduXl1cXF1fYF9fZGNiY2RiYF9dWltaWl1aWllaXGVub2hmaGlrbnKBrbqwta6lpKenmqCkoJqcpauupKiiq6qsq7Ckpp+qrbS2sb25r7ewqK64tLO8uLS8r7i5tbK8wbLBrqWoo6uxsrOovaqrqKusrrWzpaiuoaSvqbKmqKiupqi3rLGyt7q6u7K8vr6+xL+1wsHHyLe+wMS3xMO/u7/Ewr7EyMzKv7/DwMCph3N0c2ppXGFvZFdXWFBIWVJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz83Dx7m5y8HLvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWqpaylnpyhpJSdpJqXkaGjqaOjn6Wmp6atoJ2cpKatsrC2t6exraiqtKu0urG2tq62ubKwurqxt6WgpJ+msaisqbqqpKenqKeyraCnpp+bpKasn5+npKChsa2trLK0s7Swtby2u8HAsru+w8GxubnCs8G+wLW4vL2+vMLHxcPEv8DEoIR4cWxiZmBrb2BVWV9ITmdPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS2vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLw8a4t8fAzL+4ybe7xbizxbizv8CstbyyrKWvs62ho5FpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGFeXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21viJ2pn5aVmqGWm6KYlYyeoaKnnKCfpKWip56bo5ygq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+jorKlpqq5raKmpqCorauZoJ+emZ2fpZqao5ycnq+pq6iqrK2tsLK4r7i5urC2vLu6q7OyubO9tLaxsba1v7a9wL7Dwru6vZeEe3NrX2VeZGRYVFddSVdcS1BHSkpHQTw/P0A7PzwwNTUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4t763ssK0sbu7rLm6saKeqaunmJ6PbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNp5yTlJSal5qhlpaQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqa+zp7qzpraho5+bo6Gto6Kqtqujo6aepaajlpmdl5mbnaCal56dnZytoauoo6Smrauys6q1sLKrsrm0r6qvsrKzt7Ouqa2usrixura6vcC4s7GUhnp1Zl9mXltZVlNaVUtbUUxKRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxwrW2va20uMHMyMa/xbbBwMfOt8DEvbO5ubK/trG5u62ytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCbk5OPk5aWnpaYk5egnaGclqGhqaSfn6mdnJurp6+wq5yjpLiqoaCuqLaqp6itsaS4sKS3oKOcmZmqp6Gbrbmwo6GknKKgoJOUoZSWlpuYmJaXnJWfqZ6ppKKdo6qqsa2otKyqp62zsKWrrrOxsLCvr6eoqLKusrWwvLS6uK6jlYJ6d2VfYVZZWFNSU0tNXkxQTEdITEtFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmJjZmmBlZKUi5GTk5qYnJWWnJ+cn5agoKempKeooJ2gpqCqr6afoqO3qKGhoqizoqWopbCmsa2stZ6hnZaVqaKilK2ysZ+jo56emJuTi6GUkZOYmJOXmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqK6vr6uoqqqzpqarr7Sxr7y2sa+voJJ7eHNlYVxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaast7u8wcW6sbm1xMnJwMPGxce2xcSzwb/Fq7e3vba9uru1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpaW1lZWltXVVhXVFRWVVJUUlVgYF9gYV9hYWNkaYCSkoiPjZORkpyUlZakmaCXnKCloq2mpaWkpKOdqqulmp+lsaqgoZ6lq56oop+uramprq2ioqKVmKKbnJCrqbGcoKKfn5eYk4qekY2Sk5aQmJiUnKGjnaShopWgoqWmm6OrpaKkqqOrrqWusqmmpaamtKaqqK2ztbS5urCqrJ6Mc3FvYFtXVlVSRlBOSFpcT1JKVEtTTEVHSkQ4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6PDw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb3Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5RWV1cXV1eX19fYmRtjI2CkIWOkI2YkpSSnJqinJuhqamrqaynqaakmaWvpZWZpa+poJyZm6Ger5qcq7Sgpqafo6ShlJOblpaSqaqtmp2goaGblJCMmY6MkYySjZaVkJ6ioKOdnKOVm6CjoZeiqKOjqKugq6+krremo6SjrK2qqKuvs7eyvbWzq6+YhXRzaFtYWVNVUkVYTFFbWE1VT1BMUVJJTkpDPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1NzY1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7evqKivrpupqKy3tqu8yru2v6zLxsW4wc7PyLPEure7wsixrbi/t7y9u7O1pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZX2KgIl9io+IkIyWkZeZoqCboKuqpq+sqLGlqZqgraGVlqWop52YkI+anq6XmairmaCdlKWhn5KRkpGTlairpZqZmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6WmqKiooLGwprG9qKCjrLSrrqewtbC5tcCxrrGrkX5yc2JWVFZOUkpHVlBSUkxMWE5KTE9SR01LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtre8vcHDsbCxt620tLuztKKjnZ2Yl5WEgHZrZ2xucW5ya3BrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqfnh+dIeMhY6Il4mUk5ibmJ6pm6Crpqasnqiaoaack4+fo5qXl4WEkpukkJWjnZaWloiim5uUjI6KkJqlp5yVlZebkZKHlI6LgYyNgJCLkpKSoJqgopaUmJmVoqaZjZmkpqmmoaC0sqizuKGco7esqq6ksrKmtby1q6yxo4l5c25dTlFRTE9ETk5OUEtGTk5KSk5OUUlNSkFITEhIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS3saWnpKqloKmmpLOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+tqbCepq66r62fmZqdlZWIfINuX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5wdW+Dh4GHf5CDjoqTkZOdoY+anKOipJmll6KclY2ImZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4qYoKOekJOYloWOg5R+fnSKjnqQh5OQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmaa4pqaxobCunLC8qqmvqpmDeHRkV01ST1BNQ1NOTFBNQlBRSElOU01ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtqKKmkp2mtq2joI+VlpKQfnh+ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVZZW11qanBrfoR7c05Yco+Cl4aNnJeLlJGgmZ2VlJaVj5aKgJSJXztWb3yMlIqBjJKMkIaGc4uFl4F5gXuGk52Ug5WOkZCDhn2TeHFwho19ioGRjY+XmpmTi5CKnYifmIeIlp6aoaCXp66praionpeus6Kmrpmsq5iotKOpraOTf3RvYFxPU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKapp6Opr6intMK5sLWwx8K3s73Pv7mvrrXCp6rFqqOdmIOUnLGimpiGlI+Lh35zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNT1JUVlhaYGxuZ3qBc1BCP3+VkpF9iJWMhIqNm46WlYqSiIaVh3mJf2BKUW54i5KEfoSNi4V/f21/f5R3dXZ4hI2acFGNiIqGfH54lHZod4aIfoqJlouOkZOXjISKiJWEm42ChJKalp6dlKSjqKmlpJ6csaqhpKSRpqmWoqqcoqaoiXZuZ19dSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQz03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hr6GnqKWnqK+sqrW8tri2s8G7tqi5yLi2qKi1tqqyvKeelo1/ipSolpWKfo6Dgn14cW9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3J1fWloXFSQiZSIdH6GgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI6OgXp+iquFeXtodnuOcHJteIGLjZJ4e4B7gHZzcpJ4Z3WFhISFfJWKiIqNi4B/hIuNgJSEfICPmJWclpGfnamen6CdoKmlnp2YjaekkqCglp6fpIFzaGJdXUpXUFJHS1hST0pMTVJKSkpMUEhMUUxSVE1FSEE9Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK8uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6RfnaGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdoyWmI2OfGd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKBfH91ZnZ8hmxvZ3N8iYyHgG15cX1xbXaPcWhxgX6OcESLhYKDhX93eHqMhn2Me3V9jpKPmIuSmpujlpmcmp2eoZyWjYulmo6dl46WmJB4b21nY1tYWFVRSlNVVE9QTlFWS05LT09KUk9JTlBMRkQ8PDc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoaawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlp2lqaShmJmPhZJ5iY6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZXBybIinqsB+dHlie3hvfHmJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKYbmh4foJtaWRseYWQkoZscmx8bnJ8hmlucH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6MipSDlpeYmpCSlpeZl52WjIOJnpKLko2GkJaAb2pvb29ZVlhUUlFZT1JUVFJYVU1OSE1KTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrLCjraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+nh2GaaXN5ZX5vbX96i4l2goiGdGyaknR0fGpqnY9NeYWTiYSOZzF2hnNsfn2DdGZldX+EhIWAZ2lsdWtxgHxocXF8bpONj3x0fn1xcW52bYJ/d3l1anmJgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trcGhmWFJaV1lZW01QVVZZWE5JSEVKSkhHQ0BHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWo6itnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+yoHF7eGx9bHGCgoWBeoSGhnlyoZV0eIFzdZSHNXGdqJ2OoaGEooV2cId8h3x0jK6NiYFoZ2JqbnJtcIJ1aW9YdXCOm5J3bX97fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gXF1eW1lYYF9STltaWFdMSEpGSkc/Q0FCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp5+vlaW0qa6xrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPj82NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8foWDf4x+daKaen6GgYSZhJucYYaqn52Lg5CNeneIfomJjnOLl4+Ee11lcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0eXhrbmlddoZ8h3yHh45/ipKXg42FjIZ9cYR/hH11d3t8iXdwc3RmZ2BbW15TW2deV1BUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnJ2fppGgqqCxqK/AsrvFupaOkZSHe4Z2a3+MkYJ9ioSPjHiDgHOghIp8fIF/cIB+emd2a1JXTEBFMjExMzY2Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiHuJeXxxfI+Men2Jh36Xh3ahmoiHj5KUpY2tqkiGrq+vi4GAk4uCi4KEkqmHgJiYipx0bXyBhod9jmhnaHl/boWHgoVxhIZHbIB3cnl2aG1rX3Z9goh/h4SLeZSdnImLiJF/enWLdnx4bXB3foB0dHJsW15eXGNjWGdlXFRPUFZZUERMS0ZOSUNGQ0NAQENBPTo4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSl6CeraGmuK+zvbOXjZKLmIt9dHB+iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SKgZF8cYOen5Gcf3aGhYuQh5BpaHCEgXSNh4SKcYWCd4d/e3aFfW52dWZ/lI6GiYiHiIegq6KWiY6Xf3qCiHp5b2dreH97f3RsZV5bW15qXmJnYFpPS05XUlFJUEpETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDe4CMf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WX2N/Z2dtdZ2bj5qSk4uNjpqIk4+di6CgkqOqpaOsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOop+TmJKEioWPmZGWbHB1ioyCloyNjnePhHFthYGKlpGDhYhxiKCVhpKJjo+WpLWpm42UooOHk4N9f2tqa32BgoN1Y15kYFtnbF1sbF5XS0dOUlFNTExGSVBDRE1GQkNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYaQh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpaKZoZeilJyeqJ6oq5+orKmqtperv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGIlaKbm3h6fpSYkqGTl5eBlJ57d5WSq7KJjZeffJSem42SlZijoqa2r52RmaiHlo+NgYhsc3N9gX1zaWBeYmBiaGRgZ2ZcUkVKS1BPSUlMRkZNQ0hMRkdEQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFCTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK2srKeotKuwtrKyrbuxs72cs8OrusnLt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKWIhZSkoaCroaSpj5uwi5Wjpre7m6GjsJKinaGdkKOhq6+ssrWilKSqiJmJkomVenp+hoBpYmldZmNeZGReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhjV2lvWHqFdoGThYeCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4WBjIWGiJKGgoSJhoiHh3BuYUBFNjQ8Mi8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdIRTw+PkZIQ0VBNzs8NUM7PUZLSUdIUk9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubWoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqyvtaKxq7G1u7e1rrSgp6eip5qpr62yube4p5u2qIykjpGTn4Z4goR3WmNlV2diYmRgYWZgW1VKRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeFgY5/gYmPh4CGiIWJh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0tBQD9HS0ZGRDs+QDdENz9CSkpFRldUUF6PpK2jsbTDtrjBzMm2u8S9s7PAtrjBtb6vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupq2sp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwre5uL+3ure5rKywpbCqrb2wvLrCwqyZuqiTrY+Xl6qJfYN+bFhkYllrZmpmV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpwfo6EgI2EbnpzeIdiuaGZo4mUlJaSlJONkJaSh4Z7hoGNlYqAhIGKenyLh4Z9ioKBioOWfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUllYWmdZVGBgTFNQRUE/SUpIRUVBQEM8RTZCPkhHSkxTWlRdk664tbq4yL+6vcnMu7zAu7e1u7q2vbS6scZgdbKksZqeq72qpairq6SisrWgq6eflZafmJ+upaempZ+jlKOnsbSnsrO9tsG+08nJ08fCxczCysPAvr2/u7y3tK+4t7bDucW9wsevnrmqoauOpKe2iIGBc2BjY19YYmBpZ1JYYFZRVUlFRU5LQD5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xyc3OH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLfoN/g3h7i4OHfIt5gYqCl350fXprZnB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktLSEZISEhHQUk5RD9IS1RUVlxaW5O5wLi9t8bAu7nKyrq2ubW4ubK3tbSutraZZHWonK1wXqKsnJigopuknqullJ+fkJSOlpiXp5+ln56amYOknaylqrCtuLC9udTRztbQyczSzM/Oysa/v8LKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5mAe21eYV1aX2FaY2NQW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vlpKQlG5sb3V1h7OsoaCfi5mcmYyNlZGbkoWKin6Ih4uQjIl8gYRze4qDhXuJdIGKh5V/c3t5bG11e2hyZWlsaWZqaWhgZmlpbFptc5atpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpHSk9fXmJmaWGXt8ewuLK7vbWxxMa1sLiwr7ursrGnq7erjbWnnZqnmk6anYyOn5aRppillYqTk4mQiZCRkZ2boZealZaHnpqnm6yvqLCntLTU1NTW0svP1NXN08/NxcLJ0L/KycrJ0cfMzcLQ0bevw7zEuaW2usOig3BlXl5eWWFYWmZaUV1XT1BCQkhFQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6lloyam5eLjZWRmo59iYuFjYqKi5CHfISCcH+IgYZ7h3KDkouPfXF4dWxxeH5xe254c2xogXBtY2ptcHhpd3x+y7/B36duY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmr7aqrLzAsKu0pqS4pquuoKu0o46xrZqXmIyRk5GEjpuBjaaRnImDi4SKiYSLg5SVl5eTnJGcmJmZn56rrKSnoqytz9LV0c3L0tPU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfPnnpwZl9kXlhhU11aUFFUUE9IPkBGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OWnWGhYp3bHdwfX5/oZ6eoYuMmJOTjIuTj5aEeYWQkI2LioeRh3+Ce3J+gIGHeoR1hZORiH9vdnJrc317dntzgXdxaoBzcmlwcXp5cnq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hdXWBkXmN4en6LgZipo6Shn6CopaqwuKqls6OhraGjraGnsZ+JppqTkpGJkY+IgZSJapSijJmEgIV+kYODk5ati5WNlZqOhpKRnpensKGgoaWkqMjOz8jCy9HU0dTTztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPDzIx0cGRhYFlVWlRcUEtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5WJj4qIjoePf3iDlJiKjYiIi4l+gnhze32Dh3d/eoeRloCDbndwbXV/dXh9dIV8eWyHdnRufXaEdXh8nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamRueFteZmhrbmlugIOIkYucnaCdkJeYnqOjprGjo7OfoaWdoKmgo7Gchp6SkpKQio6LhoOPhH6cm4yNgoSFepR+gqmVo4yRipeSi32XipqSq7OYmpyonKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7LzLR5d3BmXltTV1JbVkZHSklFRT06NzpAQEI6R0Q/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc1NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjX2XkZ2LfoeSg4mGhYmBh3x4hZaWiI6Dh4WGeoR5cXp7hIZ1eoWOjZ15i3B8b296f3F7gXGDh4Bujnp1d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeoyHjpORm5WflYeMk5ugm56qn6CsnKGamJ+lnp+rmYuajJCRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI2UjIZ8nImUj66qlJWYn5mmr7W9qa2+x8vJyczL0MnD0srU19jX2NfV29fT2dvV0Nra0dbI1MuVe31qaVxbUVRUX0hDRklIPkE+PTc6PT87PUc9P0FBQURBPj86ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDY1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmpebWRiZmt2gIhykY+agHqAjX6CgoGDfoN8fISYjoeLfoaGgHeCeW57e4eCdHqSno2gdo51gnR1gX10gIRvgY+Bb5KFdHyAhHp2hnuIt8Wkwcm4gpabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5GEiY+WmZeWpZyXn5aek5KXo52Zq5WQkImMkYKMhYiIgYaQkZ6bmYmFjIGGl3qIiJ+Xj4iNiouCfaGKkYy8oZiTl5mdqaamrp+otr/AwLnHyc3Oxc3J0dbV1dnV19vU19na29fb2trYztzGh317aWtnYVVYVlZOTERNQjs9PTw4Ojw+OT1ANj0/QD0/Pjw5ODY3REE2NDU1PTgwNjY1NTQ3NzQ1NjEzODU1NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImMknd2eop8foB+f3yEe36CkYmEhXqEh3p1fXVtfH2GfnN+kp2RnoORfIZ+eI59eIqKboKagHSZhn2BiIR7fZB6j6iOj8OhvYyco519iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmLkJKVj52ak5SQlo2MlZ+clKCUkY2Nj4p+kI6Oi4SJkpaanp+JjJSSnZGCi3+lmYiEjYKFhIGlh4uLuJidkZWWoqihnZ6do6+3urWswMXK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbuHp7em1rZ1hiXFRQT0lDTEE8PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYX1ZYZm1tbWmBjopxc3mKe3p/fH97h3t8e4uHgX51g4V5cnpzbYB+hH53hZuhmp6UkoCMiH+Yh4Cbkm6HqIV6oIt8kY2CiISbfZqQioyjoqCQpK6gi5GLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlYyHiIySk4yUlJSPi4+Jh5abnY+VlpCKkpOFgIuIko2Kip2WmaKjh5OdlqCKiYiNnJCDiI5/g4eGpIaMkLOYnZKVl6Ghn5mSnJ2osrmspr3Cx83Ixs/M0MzO19DR1K7W1dja2Nra19bZ2Z9xf3ZpaF9eWVRYWUNBSEM/Pj46NDk6Ozc6OzszOzs/PT43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1ifpGDb214i3h6f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9fpKmo5+lopaKnZCUl4uKqJdyirGNhKeShJmThJmMopWfmJOJmp6jkqmvn5CVkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNyJaPhoeJkJKNjZOUiYWKiYWWmZuPkJSThpSXhH+Pi5mIjZCql5ejo4iZn5aaiI6Hl5eKhI6NgX+Ij6WJjZOpmpeTl5mhmZ+Zk52bo7O0pqO8wb7IxcXJyMnCytPNzdSp0tHW1tbY2tTT2s6Dc4FpZWBfX1BLVlxCQkZDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfXxtfoh4en56gYGCfnZ2gIJ7bG6Lf3l8eHh8hIeLfoujs6ijq7KhlqegpaSWla6ig5C3lZKzmY2hoIukm6+ipJ2YkKeWqZmtr6SXlZWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKdmIWIiY6VjYuTj4eBhoeIk5iUjIuTk4aUmIaDkZCcdJGZspaXpKGInJqTj4qQi5eaiYqWjoZ9jJmfipCQnJqZk5mYn5SgnZWfm6GyrqOlt760xcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmJXYlhRSUpPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSmdhO0iEinp7bYWGeXyEeICFgX1weH19fG9zjXp9gXt4houJhYSSqLutqLK9r6Wus7Ooo6KwrIqatZ6iuKWVrKSXqa23pqSjn5mpmKqkr7CpmpmclJWRmKCXmbu7rcmgaba4q7CVmJ+iq5KXvaNeqbKCiYqNlYeRfI+OfYOGjY+UlIiHkpaLj5WNi42XmZKdmrOWlauei5yUko2QkoyYm4qSno+LiZWfoo6VjpianZOcmJ6VoqCUnJylr6iipbO4q8LIxLW7vbvFyMjC0aHGyc3NxNbW0MvTonF8al5cVWBSUUdEPj1DQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj49NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVIYmBjcEpAi4p+gHKGh3yBiXWCioJ+bX19fH9wd4d3jYGHe42PjIaMmqvCwLC+xruztMG8tK2rs7aMqLKurr2qm7ukqK25t6umpqKho6Oqr7Kxqp2cpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2wg4uMi5CDj4ORj3qBh5CNjpyIiI+XjYuVl5SQmpacp5qxmpGrnY6Zj5KOlZCQlpePkaCRiJWbpKyVlo+UnJ6UoZ6bmaChlJqeqKekoaSws6bBxsOwsLu2xcTDvs2nx8PHw7zV0M3Eyol2dWReXGFcT0tDTEBFRj5BP0I7OjQ+QT09NTw2PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxnR2BpZ1pdW5OMjIh7h4uGg4x1hpCKgW5+fIJ/cX6BepV6kpSUmJGTlae0xsnAwszBw7rHu7qvq7m7l7K2urPArqXApKqwu7uqrquiop6nrK+1sKqboKqcopyWn7C0p4ujurq1wburqJyypKSolISOqcPEpIKLjoeIhIaVlI16g4yRj5GhjIyUkY+JmKCXk5mUl6agrp2MqpyOlY+SkZWVjpCVkY+hlIaXn6Czn5SblKChmaSfmqCcoJSYnqakpqekr62lv8TCrqm3tcnDvrbOssW+w7yz0crIwbV2e25eWl1sVE5JQ0xLSklAQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZaJi4iSj4aJeYaTkIFygHyNfneHgYKQeo2hlqiampi6vsjJysLSycrCzbzBs627vqe6v768w7eswamss7u9qrCppKWjrK60rba2oKCvn6WimKO0vambqLzBo7a2r6uSr6yqq5aGmqmmpZGCjJOllYmAdYqSeYWNkZCeoJKOlIuPjZSjmZeblJSjnqmfkaWajI+Pj5WWiH2PlZKSo5qVoKKctaaQn5elpKOln56mmJ6Vl5ulo6moorKtqLvAxK+ls7fMwLmuw7O7vsG4rcLCwcCZcHtjWlhdXE1MTUlHRENIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGVWno+djpeOnpKJin+Jn5KEeIV/lX5/kIiKkICVoJmup6OYwr3JxMjG083Ozcu8wrewury0vMq8w8G2truts7+5vK2vqKCpp7atrqmyt5qeraKnoZ2rt7ippa++xLG9ubOnqbOzra6WlaWsp6CRjpKxxaeVjXyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQl5eSlqWaZpmjn7OllqOWrK2rp5yfp5iZlpmVoaSopp62rKm6vMO1prS2y8G4qrass7q4rqi4ur24g25wXFpWV09HS1NNSz9BSEVER0ZHODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqaUnJahl6iWjJCDh6WSiIGHgpyEg5WQkZSOmqKfr76uoce9xsXIx87OztLKvru2sbq7vL7OtsS9t7i3srK1s7iyq6acq6u4q6mosLCXo66kp6SltMCwqqyzvsK6wLmzp7izt7OulaWtrq6ki5OVoY1zwZl9lpmEjpaai7GVmpqVkpOZmqajlaCblpqonJuhoJmLjI+WnWBKlpyalJqll1SWsJ+vnJ+llK+vraaboaaUk5mZjp2gp6KZtKmqs728u6uwssfAuKarq62xsaOhsrK0pHJwZ15cUFJNRVBQUFE7SEtJRkhBQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1SRVdSc2JXRkirl5mfoaiumJCXh4unlo6IkoWfiIScl4+eoJujpbXJtKnGu8PEyMrJyMzOx766s6+5uMDBzbXIusC5tbqxr6+ytKajm6q0tKuppq6smaSupaWorLq/qKu2tr/BwL64s7LCr7e9q6OutKy4pYibl6abdr6ghJicjpOZmouulqGcm5eVm6ChqZ6ooJqaqpmhp56XkI2RnYNudpOimpWdop+QrrKjq5Wpqpirr6WloKWqk5KZm4iUnKKelrGnqqu6t72zsq6+ubafo6eopaecnKypqY1laGJgU0xNR0hOSlZMPU1ETUlKQUNEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1WSH9lXkhGrJScoZ+7rpiUnouTqpuRkpOJq42Hop6MpKyUo6O2x720wbrDw8jJxcLOyMK9ubKvubTAwsq2xrHBvLW6q6itrK+jopmqtLqmqaasqp2or6ekq6q+vKisvLO3vca8trW4wLC9v7OptLarvqSPopeRop+8n4maoJmXnp2Ot5+pnKWjm5yhmqels6KbnaWcqKqemZWPlJqLl4mNpKKUnKKfoLWvpaaTsauaq62fnqWkqpGVlaCDkJ6fnJWppaKhtLW6ta2otbKznpyippqXlZmqoZ54Yl9hX0xJR0hNUUlNRUZGQlJKSEFER0FWU0RIPEFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6ewqybl6WXmamclpqaj6qWlaimla2smaGqtsTBvL+4wcPByMS/zca7vrmysLizv8PItb+wvLe5t6ekq6usoaGbq6vEoqWorKaerK+soqqov7imrL2wt7bHtrS5uL6wvsG2tLK0r76jlqOWk5uUrZ+QoaKlo6OfkL6lqZ2orJ2doZumn72imKSeoqmroZ2WjZWek5+Hj4WNk56koJ21rKaclrKnmbCooJurn6GNmZWfhY6hmpuSpaSamKyxtrGqpamtrJyYoKGSjpCVqZ+UamVbYl5QSklLT01IRkNJQD1PSEA7R0lIW1JPSz1ITlU0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE2imqObncSroZ+snZ2tn5KinpakoKeqrJe2sKOqs7bFwr3AtsDCvMnCv8rItri1tbG0tLfBxre+sbi1uragp62qrJ2en6WkwaWgqq6gpKmtr6Kmp722pbG7t7a1w7Kzt7q+scPAuLits7S1opyklZGToK2gmaGdqairoprDramerK6bm56YpqC9oZ2kmKurq6ahmY2an5KeiY5Yf5aepqGguKqnk5i3o5+zoqGcr5igj5mUnYKPoJeWjaKklZCmrrOrqaKipaWVlZ2Zi4+Rk6SfiWNmXGVhTUpLS09GRUFGSz49SkE5OUpKTl1RUUo9TFdcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXExPnp+hmJ7Dp6Wis6GcsqeTqqSfo5+tqaydu7CorLWyyMPBw7PCxL7HxL3Fyr2wsbeusbWvv8W1urGwuratmqmxqaqbnqahqMKtm6yxnKqirrCppKe9t6a2uryvt8Sts7PCv7HGs7q3q7S2raqipZWVlKOroZ+fmqerr6+vu7KmoKmpmZmXkqKkuKGhpJKur6ykpp+SoZ6Vno+RjZWdmqOfp7Snp42YtJyjr5ufnK+RoJSXlJqAkqGWj46goZOLpqywpaeinKCekpKblIWLko2cnoBjZ1xoZktKTEtTQkNASUc7O0Y/OTlOTVVeUlNKPk9eXj1IUEJNTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugwqijqrGho7SplrKrpqKksqyuqbuyrbC0tMa/xMS1wMW+ysW2wMnCtqu1qbG4rMDEtLeurba6pZmrsquqmKCnl627tZuosJutn660sqequrOnurO3srjAqreywry0xae+rq23tamnrKGXlpGlpKKil5ekr7itsrW2oJ+opJmUlZOjoLejpKWVrrKypamlop6ampqVmKifn5iinq6yoqaNl6+ZpayYm5+mkp2OlZmbhpeflIyQnJ6Ui6mpq6KnoZmeloyPmZCBhpaJlJ96ZWpdbGtPUU5OVD1CQU5DOzpJQDc3UU9dXlJWUUFXYFxCSlNIV0tIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcGlWQ1dGjHlmQzukpJyhpb+mqK+voam1qp25r6ukqrS3sbC5trC3uLjFvcPHvbzEwsfBucHHwbqqt6Wtu63Bw7e4qq2yvKOVrbCtspemqJGquaqgp7Cdqp+wtLOqqba2rLussrK5t6y5sMG5vb6mw6uwt66oqqumnZiYqqGioJGXoLCus6uwuZqbqZ+ZlpKXpqC3qaWioq+xs6uxp6ufm6Cgm56lnaGXnaOzsJufkJSmmqGpm5ajoJeZipaZlJeYnZOIkJuZlI6pqaegpJuYm5OHj5mLfoyWho6ba2puYm5uWFJRWlRBQ0VVQDs6SUE3OlhQZF5QV1dEWV5eTUxST19LSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lgRihAOGx9aFxWOol7Y0M9qJ+coam9oaqwqqOxuKmltbKroa21va+zuLy6vbe2wcO/ycS5xcPBwLnFvsG4r7aoq7eyvL+/taqusrifl6ytqK2XqKmPp7ufpa2znquisbCzrKq2s7W9ra+xtaywtbHAucS2q7yvsbisrKmisaWepKiepJeQmJ+yqrOqqrOZnaebmZSNoKaktK6noqysrrGnsqyyqaObn6iknpWgmZuotamXmZKSn5mfoZ+RrJ+ZmYaWmIyemp2Tio2Wl5qXp6ajoJ6WlZaUgZCVhXuPkoSMl2Ztc2hwc19HWWZWRENOWERaOUhCNj5dUmhcTlpdR1teXU9NUlhkSkpDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFWMTUxPWBWXjgpQzNZVVxnSzWMemZMQKSZoKSst6OsqaWurraqrrS5pqewuMW3sbe+wcK1tLvFvszFucPBur+6xLfBubO1rKq6t7u6vrWrrrG3mZioq6qrm62rj6u9nquusaOqn7Gts66utrK5t6qtrrGnta+0urzJsqq1tLG0r66mobOfmqisoKWVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxq6q1pK6wta+jmZ2tp5uXnpmZrLiil5OQj5icoZmYlK2gnpWCk5mNnpyal5GLlJKemqWjoqGZlpOSlnuMkIV7jYuDi5RsbnlvdXxhRmBqWklIWls9e0pHRTZBYlRpWk1cYUpbXFpSUlNiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkEvSkdQW0czY1lUS0SZl5+vqLGprKWjrq61qba0t6OstLfJurS7ur++tbS3w8HNx7zEvbe+v8C3v72yva6nurq3t8K3rK6yuZWXp66rp6OzqpSvuqStsrGmp6Kys7GysbWxuLKprquyp7ivtbPExLaptLWrsK2pp6K2n56msaCklJuZlLGep5ufqY2pop2blZelpaS3p6Kws6unsaetsLWspJmhrKibnJ2blKq5nJWPjouZnaKYkZioo6CXhJKWkJ2cmJeWiJaPl5qonaShkpaSkJZ3hJCHfIaChI2NbnF4dnx/XUtlbFxKT2RcP2J7R0k4R2dXZVtNXmJNWFlXVVhUaV1QT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JrS0RDkZikraStraumo7Cys6q2sLafq7W5ybmuwbvDt7OytcLDz8TAwr61vcC/ur+9s8SoqrmxtrfAvbCstLSdoaewraWmsaWesrWsq7KwrKmotLqstLO1rLSsqauorKm5rbGwx764pLmvqa2tpqitsKWjo66jqZydm5qvmaKjoqOQrJ+joJ+hqaWluKSrtLSkqquorK62rqKdo6iqnKCZmpKktJmPiY2HkaOglo6Vn6GWlIaOlJOdm5mWlYeYkpWZp52goI2TkY6ReH6OhX19fYeKinJ0c39+flxSZG5eTlpnXUZElltHOk5tWGJbTWFiTlZWVldUWWdeUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NlOzYqSGRISis6ST8zQ0lTLD6Paz5ISY+aqaqhqbCkqKOztLG0tbGxoaytvcu6rsG7xrG0rbTCw9HExr/Bs77Cwry/uLzFqK23rLO4vMGxrLKuoaSnramopLGjq7Gqr6uxrq6tq7O7p7exsqmyqaumpaOtuqyqsMK5tKy5qKioramnsaWppKKuqqiinpuirJWlnZeemKudoaeooaylo62st7GxoKmin6qtsKydnqanqZqjmJmPoKiYhoOOioufoJCMjZeekZCHiJGVoZ2WmJaGlpOTl6WdnZ2MkpCOioB/iIV9d4CHhYd1c3KJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9jXE5VVlVXUFxhX1RPT2hYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlFxATUaVlqynoaqynKmpsLasuLSuqqSrq73Ju7G+t8OvsK2zxMTOzsO/v7TBw8S6wLTJxKyvt66yusC/tK6urKaoqrCppqiyprStqrCurbGvs6yzuqS4s6ysraeroKKesLerqq26tqS1taSpp6ysqqyhqKamsbKkpqWhoauWqqGTmqCmnqOiqqSsop6msbesrKKlopqpqq2pnKGlpKSZoJqVj5idk4GCkIiFnaCNi4+Nm5CSjISNmaWck5GbjJORkZSjm5uai46Li3yHgYKCe3WBhIJ+dXeLpId5a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWFWS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZBSUhElpGvpKKqsJiqqK21q7awq6Srqqm8wcC4ubO8taayr8TJy9G/wbu5wMDCucG6wsSusbWytLvBvrOyr62srKi2qqWtsKu5rqiwsK6xq7WqtrWmtLarrKSpqpyjnbOzqKiks7Sgtq6hqairqKunoKqrqLm2qaqqqaGpn62bkaihnaCjoqaiqZ2cprSup6WpoqOXpaamqZyio6OfmZifkY6PmI1+h42HhZ6eiIWLi4+PkY2Ehpajmo6NmpGSkY6Tn5iZlo2LhH90h4GAf3h1hIB7eH6AiJ2PcHJnZ3F4XGF0iGlPXZhWSG15VWRWUmNPTFZUVVFPWFpiVkhQalRWU0dQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JFO5WNr6ClqqyZq6StrrO0rqqlr6mpu767wbGvuK2ita/Jx8jRwL+9u7zDvbrDwcC/r7Gzsra9vMGysrOrtKmltamkrbOzuK+irbWxr7G5qriuqq62q6qeqqugo6G2raihnq+yobSqnqinqqOqoaGsrai9r6yurKGnp5+smY+vopiioKinnqebmKmwqKKfrKKhkqGioqaYmqilmJiYnY+Kh5WIfY2GhIWkloaDgoyHkI+RhYaVoZeJkp2Rk5CNkZ2Vl4+KhYZ4c4F/fXR4eoF7dHR7aoKIpHZpXmVsgXVniIt8UldwXkt4c1RkU1FfTU1SWmdOTFZZZVhHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWk6MzhfPWFkP0YxQ1BbWytITztYQjSPjrGgpKWqo6WjrKa0s7CppLCnqri+wbywqLmqp66wycfI0MK9wL65vr68ybzCubGwtbK6vLnAs7S7rbmso7Wnp6yytrmypqe6ta20vK+8pa2ttautnKmvpJ+lrKqnnJ2qsqSzqJqqp6qkqZ6iqaipvau0r62eqaOgrpyasqKWpJukpZ+kmpmnqqWemqmhm5GboKSdmJapqZGZmpOQioKPhX2PgoCIno+HgH6Mh5KPkIWBlJuUhpOijZSRi5Gbk5WHiX6Acnp5fnxod3x7dXFyfmmGeoSIZGBoY3KFe21oeV1eVkNYe21UYVBSWUtLTXB0XUhaW2dZRVZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpOxmZ+fqaWjoaqktrKxpKmxp625wb21sKO5raiosMPJyczBt73Atbe/usi2w7W0s7Wyvbm6vbatuba/raKzp6qrr7W3tKqduruosb+yuaCvtLaprJ6tsaOcpaiqo52cpLCmr6Cfq6mnoamco6igrbunrrGuoaqio62enqyml5+boaKcn5qZoqqimpmjo5WWk56hlpuWpqyLnpGQkYyCi4B/j4F7mpSMiX1/jIeQkIyKhpKYkYeUpIqSkoeQmpCTgYh8eWx9dnl4Ynt6cnBxc3hqgnVqg2djaGFuc45tYmpwYG9CXXlrVl5OUVFLSUxTWVZNXF5tV0RYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUV09I5KXrJmfl6ejoZ+no7evraKvr6mrucK6s62fua+rqLS6x8rHv7fCvq+0vrfEtsOysLqxssC2u764qbm4vaqktaeoqrCtubCpmbm8o62/tLShrre1pqansLOgn6WmqKGkmZ6sqKmeoKqup6Cml6Kon7C4n6SxrqCsoa2km6amqZqam5+jlZybmZ2pppaanqiRmJKYnZOZlqGqkJqJjZCHfYh/go58fKGMjIh5hI2Fio2NhYmTmo6JlZ+JkZWDjJeNkX2Ee3NwfHFzdGB5eGpvcXFwa39zZHpsaGZkYmaHgGBbcmpxTU6AaVhaTVFMS0hQUlFITVtfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MFxbNSiWm6WYnJWsoJ6hpKG3qrCjtLSpqbrFtrKuoLesra2wtsXHwLe/wrmwtby3v7u/r6y+sLO/sr3Duam7urinqLaop6uwrLOwppi8tqOqurWun7G4r6mlp6+ym6GkoKSjoZabr6ahn6Oor6GgopOjpKK2sKGmsaufrKOvl5uqpaifmJqdpJOam5mcpamZm5uklJSXlZyOk5eiqaGQiYqPhnqEfoSKeo+Xio2HeoKIhImNj4WOk5iMjpaZio+XfoaXjI96gHpwcXZub3RfeHdlbWxsa2qEb2ZyaWtmaV5kdIFgW2t2aVpKf15bWE9PS0hIUlVGMjldXm1QRFhWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJjViwylaKhl5Sbqp2koaKht6muoLq4pay9xbOwrqO1r62tr7TDw7yzv7q3sbO5uLq4uq+uwLO0ua+/wbisvbq1pqKzqqepsqutsaCawLWkprS1qJ6yvKmopamvrJmjp5ykpZSYobKlmZ+kqKmcoqCTpJ+juKikp66mnaWhqJKfqKKhoZmbnKCSmpuWn6Gqm5qYoJSQk5aZjZOTo6ikkImJj4Z5hHuEhn2djYmKh3qBhIeJiZKFlpOTjJCVlI2OlHuDl46Ld357bHRxbGxzYXd1aWlqZ2dvhmhoaWNmaWpga2NqaFxle2NgU3RUXFtTTEpHSU9TQCEqaF5qTENWVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z08nMp6io5GOpKebnp6do7Wsp6q6t6esxMG2sKyjta6nrq+3wL+8ssG3sK6ytra4tratqr2zrrKxvb+4rry7saWftqulpbSpqq6encCrqKSvsqmstbueqKmrsaWYnqmdpqSRmaatopiepKmhm6Gclp+dp7alr6quoaGdnaGUoKafoaGam5mckZick6Wdq6GXlpyUkoyVl4uPmJqpoJGIiYuIeYV3goKCnYiLgol9gIWIh4aRhJeVkI6QkZGRjJJ7g5WOhnN9fWZ4b2tqa2d1c2tjZ2RkdoFjZWZmZmpqZGtyWl9ZXW1kYU5pWFtgVkpHSUtNUlg+OV9saUhCVFNcW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao5+QjK2hmJiflqSzsaKxvbahsca8urGxpLesqq6puby7u67Bsq6urrausrizqKu5sa+us7a6trC4va2mnrWqoKCwpKqunKLAoLGkrrCut661nq2ura2imp2nqaWflZqnpZ+ZpaKonZqfm5ScnayvpbqorqKhmpqdmZ6kmqSel56Ym5SZoJKolamnmpOampGLlZmOlJSZqaeOjYqJj3yCc4GBipiFh3yJiYWFioyKkoSUnJOSj5CQlo6Qf4CMjYJwgH5meW1oa2lncXJrXGhjY3SBYmZoam5sZ2pqaG5dbGx0cGFVY2lkZVpJRkxNT1hRUVZhZYFVQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGajY6wnpqToZmosq+fuL+2oLTCu726saa2sKiupbe4t7etu6+sqqu2qrO4raWztbKuqbC3trGztbqnqZ+1qJ2eqKKprZqnvpito66vtbWtrJ+xra+popydo6uonJScpqSdmqqipJaan5yQm6Orqqm7n6ekoJiZmZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB4hpSMg25pfnaDcWyGi4Z9hIyHcF5jYWeEmIZsi4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dzhWdfZGZubWpeX2GKj4OEZU5LRDlGVGdeSkdQUFRVS0hSYG90ZUZaUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYaVsJuck6Cbqq2qo73Fr6m4wri9va2nt7Clq6S3s7KzsbmtqaastKavtaKouLa2qKest7OutK2zoqmfs6qeoaScpqeYq7qVpqWvs7etrqSprquspaGfnKCnp5uXoKWlm5unp52Tn5+YkJ6nqqO1r6Ojo5yWl5eXo4igjpKah6GHk5ygf6R/paqekpGakYiEcniNjoWIoXaIjGmXiGZ9cnihb4iHhH6OfX+hoKCZgHyHnnSHjnabimyHgYNsaGVjemtxYVOFbWNsaZhxWWpwb4hYXmlba2tbiHFuenKFZ4aEWl5HTj9HX01GUlZWUVFSV1RnXk1XSVJTUEZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiLppaDnKucmZidn6qqp6m+w6+xur23wL+qpbewqa2ms7Sur7O3q6mlsa2ltLOcrbW2tKanqLOxrbKorp6roLKooKOimqGimq2zlKOlpbW8p6ynq6qsqKWhoJigpqOZmaWjpJicpKmWlKOclJOkpaaht6OjoKSYlJOXkpyIr5CYlImpi5ehm4WxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5oem9ykNh+U2pitrJ/gXKVdJqhqpBXT1diUFZORlRbWFFQUoxcV1xQQFxEUU5FR0o8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaSgKeqn5ecnaWtsqewwr2ytcC1t77Cq6ezraypp66zqa+2tKenprSlp7iunLOytqqlpKeyrq6xpqqep6Sxo6Kfnpebn52uq5Sdop+zuqOqqaKtrqWhnZuaoaefl5unoJ+YnqenkZynmpOdoaaioLCin5+jlpWSmJKZha9raoqNqn5ng5WGrWRwnZ2UmaWUca6hpH54u31roY92sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5ofKSngllfi6tpgJZ4eWqnN0qvXFhTbGRbS05XX1xXVjtOiU9YVy9JVFRKREZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsp6Weo6Sqsrers72+sLbEsre6waepsKuuqKmwrqOwuq+kpK6yo6m4qJ6zsrCjpaCqra+sr6ann6OisJuim5eVl5ubrKWWm6Ges7Oiq5yira2gnZmXoKGonJido5+cmaGmpI+dopqXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl2hrObt36TlpaolH5sgqZ7goaIkpSSd6tna7Fbq3uPh5R0iXGPhoB/iJCXeIKCi5iMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5c3VTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5WFhBI01oRkNFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WHs6amoK6pp7Ksqbu2wrC7wq24tr+pq62trqatsamhr7yqoae0rKOrtaWms7Ono6Kdp6qyqLCopZ6fn6+Wn5iUlZWXnayhmZmkqLSuoamPqaipmp2VmKClp5ufnaKfm6CjpKOVm5+XmZ2iqZulmZycoqCXk5GTk52D1ZOZuXCwwn7FhnzWlJu7fJqVpI+NnI2ke46HpIKlgnqseY+dVq96iH6farlauXaHhH2mgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKlic3OIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObU1bUk9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KTmLGoqKWzqqW0qaS8t8GwucCxtbO6srSmsbCjsLKmn662qJqnua2jr7Ggs7SwoKSen6epsKm0qaScnZ6rl5iXlZeVlaCpnJmWp62wqKOej62ippWel5yhpaGZoqGhoZqhoqabnqGelJmbpqCcp5Wbm5+hmY+RlJGdiLJuaLVxq4dujqZytHNytnual6SLj52No3+RoaV+sHaDkdLRdlyue4V/pG+bqqZrh4V9rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZ0h2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa2BsaFBVR0k4PVZRWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWvraSqvK2mtaWntru8srq/t7WzubmypLS0obGxop+ssKSXprmtpLGwnLS4qqCmnaGppLKorKmkmpyaqJ6VlJeYkpKip5+WkqWqsKailpOtn6SRlKCbpKaflZumpqGaop+tmqCenZCVm6GenKaVnZaZop+VmJWRm4Wse3eodqOOiIapb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9eIV+j52GmZp3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV52d4domIhrXa93lZ6PeGw1eciusl9CU29eZ2BFUG1fcG1WVU0uZWNoUlhRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnZWgubCXtMGtqLOoqbK6t7O4v7m3sbS7tKS3s5+0rJ+fqKyflKe1q6ixsauttKSbqaCgqKG2p6apopmdlaShk5KbmJGUoqWako+mra+moJWZqZ+hjZGimailoJSZpaidnKSerJ2hnaCNlJ6anaGYmZyWl6Ggk5iQpp6GqX19pXihj46CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aIdKiBjpuNkqN8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJnTVthXnFzXkpWNkqbk1hIRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84oZ2amr+rl7TCrqytqaa0sLextb+5ubGwtbqpurSfsKSepaennpOqsKmvqbWsqq+hmKGgpqWkuqKjq6CXm5GioJSTnpmTl56fj42LqLCvpp2Wm6imnouSpJeoq6eUlqmnnp6go62koZ6hjZWhmJ+gkp2XnJWdoZWWj6ucj65tcrRyqYx2iqZztHhzs4CRpKOSnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytX02hfIeRUnOjbHl/fm+Yh3Fcr1Y8nHdlVG9uLlynT2NSa2VibVpjXF9vemJUWlE+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWanJ67oZyywK6uq6unt6m4r7XAtbuvrri2qsG2qamgm6akop2RqqmntaOyp6+qoJecp6Ckq7ido62blpmPpaOVjJ2gmpicn5GTlKq2sKeZlJysqZWLk6WZpa2ikJaqsqOfnqarsJiho4+Zopafm5acl6GSnKmclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2VgaypcXt/dbyIp6BpnWGmjq+hfox0h6p9vm5zvHSyg3V4gYtumohxbo2kdL1ed31bYXm8a1pWW2p6XmphZWdhbHduWVtZQ0FAckBDRys1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivKGXscOwraqrrLGnuK+2xLG5sa26r67Asaukop6joZybkKmjqrKktaatpZ6WmaqZpqy5naOumJSgkKWfkoyco52XnZuRlZKuubKslZejp6eTkJaknKSsnpCgqKufm5+oo7Oeo6WOp6KUopqcmJWjmI+woJKUqZ6FkJm1gJCRjLeVeIKTmrV3bWtuc295j4SOiXSewbu9mnuBsqhwgHSRuYN8hoaMho17ioeNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF6Aen2KaIN5bXlji6xwdYV/WlunakVkWVNmYGNeY1FnZnBsdUJNUExEOlpNP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlYnPjs8p56gob+llrTCtKyrqKyrqbqusMWutLKut6e0uK2poqGlnqCdmZOrpK2qprWop5+blqCjnaykvqahqpeUnJChmpGPoaihk52Yk5eUsbW3rZidpKSiipKSppulqpuWqaWlnJqhqKamo6mhka2elqOel5eXnZ6PsKiUm6ehjmp+aZymeIdyfZqOdHpkh3u9vsC6b5KCcZWHYXNqWl6bimFjiI6Va2CAlWRtnXdilWuAmpWUZV5hY3GaimlyjH2FlWdqfnJ0eH1+Ylt3dIFoUFxuhH18i2tYbHqCc0pKb4ZwTXVNRVdeZmBLWldnY19PW211aXJST0RFTjtISD1MPzItMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPVtPJz8yPqigqKHCo5q0ubWjrKWup6e1savIq7Cyq7SjvrGypqCiqJyim5mZrKavpKS1qaWbl5Whm6atqL6nqKaVk5uVn5mSl6SpqJCdkY+YnK+yv6ybp56nooiTkamaqKOam6ygo5qao6esop+ropqxm5WnoJeVnZ+dl7Gkl6GomZyRnZyipJimopqcmpqZj5WBZ259cXeSl5SRhYu1qo2GmJWOioyYl4eUlYqEkpSRiY6SlJiUmJeaoKKanJShno2CeqSGbGp8kHyAdYmKgXGCeHl2douAfIprc4F0g3Vldn13a3B7bWBjXXBnTFhaZmpgV1pveW1tZlNPRlM5T1lNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOhv6GksbK3oKqmsqelsLSqyKussKW1psCntKCdpKSco5WVoKqnrKOjtqufmZaWn5etqqXBnquklZKcl52XkpOin56ip5ORmainssSvmqudqp+QlpaonaqbnKCsmKGbnKKkr6ahpaifrpiXp52ZmqCenpyvoJyhppWXkpiToKGVo56XoI6Wk4qKjY6XrpB8lZuCkoKLqqiGgZmXioSPn4h7hJCHhpqSiIaKlY+bl42RmJ6jlpqTkZ6Nf45mobOvhYqEdnuQinx2eXpvZnqRgYCJa3WBeYhzaXN/enWDh4JrdWR5ZmBpZWNkZmtZbHtvaWpcUkxQRF9URUA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r7+sq66ysaCrprGtoqyzsMSwqqujs668o7Sbn6aioZyZl6elqaakpbK0npWUnZmZsKWuvqCropCRnZqZlJGUopyXqJyEnqqrorPIs5+qpKqWlpeap52omp+kq5Oen52gqa+ppaOroq6bn6ChmKSenJ+dr6OYnqiTl5ackaSYl6idmpdlgpJ8ZX6NmpBkeY1saGt7kqSqamWamH5nhoplZWloe46hj2tojZeRo3draouZo56Zc2xue4SNh3pYZV6Ggl5si4mAdlxoc3d3koCHgm54gniAc215hHR3iYiOhHxqhllea3RkXXOJaWt8cWtjXlFNV0pkWEFKND1GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsaqlqK2tsKatrbG8samnpK2vsJ+tl6CjnaKZmaarnK2jpaipsq2elaOPoq+mtrmlrqOOjpqhmZOSmqCZmaWVe6Wtoqi0xLikoqevnp2UnqKeo5yjqaiSnqGdoKqwqqukqqCqm6efqKCslqGbpbCkl5uqlaCdmpKll56qmJ5+vYOIcrRyhJ2GrWh4ucS4cZOio3qmmZlzqoJ8y8DAu3GMooiCn32WmImdwL2Cl52djZ3CwXyCfJKNmsPAfWulsm+MgW/Ken+bd5GDjoF2eoGAeXF6f4dxeIWNk3lueJRjZl95ZGBlgmNedGdsZGJXS1VJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JRLyNGWzNQWS9VQUI7LziWo7nDtLCwwKmolKOvqbCuraaztK+ppaamsaufq5iaop+cmqqnop2so6WopKS0pJ2ikqatq7izp6+ikZGZnaWSkJ+hmJufnYenrKSrrcDAsaCpr6mXkZ6doZmio6qjk6ChnZ6trqmsp6Ojp6GmpZ2tqZKkmqitqZucqZysoJaWpZWhopecf86UeHqkgXmVlptfro9ejqeBoqB8p5abdKuDgK9eY42qe6eHhaB0l5OIs2OCq4ahjY2zaoWvdH2XiLdhg61Zos1ukHV72nt/mXB+iJJ2fmV7iHZ2a3yIb32FkZF+bYOQYHJscGhgX3lkXHFoamNmX1FUUlddS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGkqqittKumsqysq6SrprCqoKebmaWXnKKvn6CeqKejpqGfsKyanZWmrayxqqisoJSSm5+kko+epZidp6OerqSrsKi/x7OoqbGulpKdm6GXn6mqn5Wgn52drrCnq6mcp6ikoquTrLOXpaKqqp2jpqWhsKCSmaaZoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xzrX6rh4afdpiSe3yXfqqIooyRjJ1+q3uJlJCfgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+JipKPg22SkGZwdXVxYWdtZV9vaWluZ2NXU1xhWVJTQzhJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytKCco46jo6Ksr7avqLGmqKqnraurp6KjnZmilaClq5+ipaCoqKKfnbCsl5qXqKaurKimqZ6XlJqjoZGToK2bnaajr6yjrLWquc2yraatrJaVnJ2imJ6urJ2WoJmen6qyqaqqm6yrpKOsm6+xoqirrqWYpqqpqbGikpajpJqUkoWkaqR1iXqpdHqycIKmipmMcYigmoekYGFSq4R/roObdq2BpoaGn3qZl4Z7ZoCjiaSZhoKkfal/gpWHrl99qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoFtmpRwbnl4eXBtZmVlcXBmfGliXVdgaVhYVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwr6mtoqemqqurqaSmoJuknp2mp6ejnKyaoqyhpJ+vopybk6qjtbCvoKmbnZaUpqKQmqKooKClnLCmpKixrLbIsrWqq6mVkZ2copifpbOdmqCUnZ+nrKykrpqtq6OjqqKzrqKqs7Ghmqmorq+2opKVoqeYm5F8qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfYJSpg6OIh6B6mJaaeKrJdJmklaiqkZOajICciprGx3hmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI6QnpJ8cZeTgHF7dX58bltmanJwZYFqX2FYZG1cXllJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqbOtrKWinLK5rKqhppqopaqrqqegpqWYqqOfr6udpqCsmp6ppZ2ntZ+il5OoqbWyrJylnKCUj6WskZmbp6OgqaauoaSnqbC0wrGzqq2ok4mXnaSaoaOuppihlZmcpqasm7Cdrqmnnqykt6ygsbmvnZuup7Kzs6STl6eimZ+Ogp1OeJqBf596g6N9g6SEhqaenJ6ThLh7fHm5gn7MxsK2eJuhkIuffpqWl4p2npiKpZikqX+whZ2Fn4SsfZqUYqVspHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Tkox2e3OFf3FcbW54cmqBb1tkX2huYmRdS0xRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq+gm6Gss7Oln6CVpa6trqqnnaammqOnobOuoqmnsqCZqaSUorWiopWXoai0uaObop2ik4+hsZiem6eloaKvrp2kqKK2sMOxramtqZGHkJynnKKknKWXnpiZmqakqZqvoa+lppivpbytoba3rZ2dtbK4sLOml52voKOdhY/RtcO3eYeOhZGTkIGmeJShd4ygkYSlgYpxqoaEtG5yapmjnJWKnnyYmYaHj3OvgqWboo6mi5OdipWQm21wslylc5N6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2MjZSOeX15j4JtaXhpeXJugHVdZWRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/vLq0npanpa21oaKZlaOop66rrJmmop+moKC1p6Opp7GjlKyjjqSto52Qmpqos7SknaScqZGUl62fn52npJ2nnLWaoaqktqrCsKmrqaGMhI6coaCmo5WampyYm5mnpaaYrKiuo6Wbraa+rJS9sKyforCyuau0ppqosaOnl3qokH18sHeKgKSliJxtsm+gh618oY6DqJWYgKyJhK6Fn5SqoaGXhp+AmZWAe5J+q4CdmpeLq3idn5GKlJKBeq9do4F9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWRppmClY6Yjnx7hJh/a21/Y350boB6YGdlcW5oZ2dDWmFbPktUM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVldXWFZVVVFIRklKIygovZOag6nGwrbBtJ+arKCuuKWjjpuko5+wr6qfpJ+drZmeuaCjq6CvqZquoZCrqKSWiZqPrrGspp6mmquWl46soaGdpaGapJytmKCopraov6+lqaSfi4CNm5qfpp6SlJqalJqapqWlm6qsrKSln6qovqSWw6yqoqGrsrmqrqafs66oqZh2r36Qi5yFh326roqYZbCMZZWtfaGPg6aVmoGsioSwhaaZpKGhkYWgW2xqgbNgf617e4KBsW1nb5mYjIixW320XKSDa8iiZJ+Ae7xYdrVasn1SroB6rFiAoW6YkKibi5eRmJh8eo+dfmR0fmKEeHSAfGFqZ3FtZmVlT1VkXEJVXz5KKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBfYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpcXFhXV0dCO9Kfs7K3vbqzwbOjm6ympbaooIuaoJ+cs7Opn6OgnrWYoLSoqqyer62erJuVr6iijoibjq+sqKehppitkZiOqJqhnqSfmaOjpZmfo6qyqLuvpKienI59i5uWoaCZj5Gam5KamKmgopqprqimpqOlqbueoMampKihq7S1rK6mnrusrKyVgKmSo6+Om4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGujgW+rhGycf3qysMeDaquwvax4d6K+vHOBlo6nnJCbkZiee4KSm3pjfXtkjmd5gntgbGVramJQYVpTalxAVWFCTio9OjQvHh8kHiUyIB0kKDA0OTY2Nzg6PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbS0sb+5sr2yop2upqWypp2MmKW/qriyqKG/pqeynJ6xnLqon62vpqaUlLCsl4yDm5GupaKsoKObqJ6XiqOSpp6nnJqhqKKZnqGsrai4raijm5eSe4eZkqabk46RmJiPmJOpm6GZqqmhqqeho6q7nqjEoqCuo6qztKqvqJ+6p66umnN1qqS3hmSJoHBnrY+Kj21vd6SQmZ+Bda6YlHCPi3GVqKObl66kcm1tbGaLeG9ugplxgXpqcWlniZaWmHJpaYSHZ3CGZF2IYmpvWV1nfnemX2FxjpFuZWV/jZOPopiZmZGYoH6IkJV2Zod4aY5reX95ZGxjZmxiS2RYSmxaOlFlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3OTw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqZWts6m5uLKzqqmhrp6jsqmYkr6yxMm+tqqewKyso6GorKC6o6SurK2mjZeuqZCMhZWWrZ6mqqCdo6KekIqkkqeZqJmWo6qglpympqevuqusmpuSknuElo2lmI2RkZiUjZeVqJWfmKqkm7GmnqKruZ+vwKeksqWssLGqraumt6Ktt5aKoKiltp2JlqOZh6makJSdkqmymZqjq6CxlqKgnaCinKCloZWrp42TkoyHk5yclZCak5iRjpWFgaSZl5aOi5OTi4+GhH1niX50gnZ0h4txp2x6lJGTkoGBjZCQj52VoZaamKODiZaNcmmQd3GLeHd8empsZGNvZFVgWEBpW0hjYU9aK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVVlleYGFjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKaWqaqktLaurqKwo62foLWxkI6sx73Fu7mroqaem6afsaijtqedqbSnqJGYrKKLh4mPm6iVrKSfmKadnZGUo5eomqiZlKaho5Cap5mhtbuoq5iZj417gZSMoZSKlZGVkJCTl6WQn5uqoJy2o56nq7enrsGuo7amr6+wrKmpsrigrryZkaWkpraikp6nn42pn42Sn6Osr5qgo7Cor5ejoJyjqp6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2Ui4B9ZouFdYZ1eYiDc5xqhZCUk5CJfIuWkpKXlKKTnpijhYmZiHtylnN6i39yfH9qb2RecGphW19YbWNQYGRQWjpHR0U+Mj09OC8rJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVVBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX19hYWJhYWFgYmJiZGJcW2OXlaSoo6+yrK6jqaatoKe1qpCQnaW0vK+traKjmnqdorGkpbGpl5y4pqOUmaqcjoaKiZyjkK6eopWnnqCRlpibrouplo+omaiMmKmPn7m2pKWYmoyIeYKUjJuTipWSlJCNkpeijZ6fqZ6fuKOAhK+1oq+vdaS9o7Kfd3mgqrG6lHWspJ6JgKp/ZFxidqCOpJ6El31uk7Oco6etqqNlnZ+Sc3mZlnCAmKiXbH+iqIplnKWckZeYloySnJGGnZqQlYOSh4+PkomEd2qOhnaGcHuGgYBhaYeKlJKLWnWUkGhoj49ze6aammZ7moeDeJhqhIuDb3mAa3FlX3ZwbGtoW2ZlYmJwU1w+Tk5OU0c+QFREOTEvHh8mNDozMTY2Nzg8Oz5AQUFGSEJHRklLTVRUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5gX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6CvsKyrqaWprqOmraSSlqu2sLKnm6umrJd0jJ2vn6irp5SXuZ+gj5yknZF/iYmbnoyrmaKUpqCcjZaRnoR1rY6IppqpkZekiJu6s6egmZeKiXV3k42Wk4qUkZCUjJCToI+boaeZnLKWgIybtZ2zjJKPu6egfqeieqKutoCOjqaeg4uGkLGqr4yKlqOaeYCLrIacnaGnqaeHlYWYd6WbeoebgZengoJ7nLJ6ioagl5mUmJaCkZeWhJqZYnmHkISOj5GKg21wjod5gHCAgYV/hnSGhJWReJZnknSgmnR9mYSinoiYf5OKhISZa46OhWx4e3FxZ2R4b2psalpla2pldFxfSVRMUUBFNS5aVFU3KSEwOT0+NzQzNTY4Ozo9Pj5AREk/SkVKS0dTWFtZW2FhaWZZUUg5RUs8PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mra6rqKygqLGmpqmlmZSuyL6xopenqbWej4SdrJynoqCNkL6emo2fmqCQfIaOmJeHqpuglJ6fkY2TiYZ/kKeMhqKdpJSYnoaeubCnnZuTjoVwdZCJlZCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6qtiLeFjK+Cr6yCqY2lmI2dfaiPcnt3nI+nlmiVpHm0jJ+epqiSmMKBf6uImKFynoCapX2XhZWxgKF9oZOgkJiXgY6Tm4qYkYt8hZKGjZWSiYNtcpCFf3lxhoGEfIR1hIGWgI/FZn+ph4+ja56Do5yEmoCNjoaKmXGOk4Vod3R8d2hodXFoaGtdY3BtZ21YZ0ddUk0yRDQ2TmFjNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmptXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKepqaaroKS4sKmqppqUoKOkq6SXpaq3o6+AoaecpZ6diZS9mZONoZKej3mElpaQhqqYmZqZoISPjHeam46ej4eepJyWmpiGorispJqcjIx+Ym2Pi5OQjZCNjZiMkZKgj5ShoZmhp36hp4etnaCWrY+enJ2RhYCgjaqthaONqZmMmn+jdYCZlGuCrHVNq3iHjZyRm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefm5gZFmDl3+Me2Roi3KZfXmVbF18lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhaBqZqBsW26LfGZaYIN/YldQb3dmbXRya2pvXWpwbWxpWGlPXlhGOUE0R0ReazQsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5adoLigqqSmrJGhtbyrrqKZmKCipayuoZ2utaOokqGgn6abmo6ZtJmQi5+MlYt1gZSSjIqmlZOXnZ1+koWFq6OHmo+KmKmZmpuRh6WwpqGVmoiJgGluiIiLj46Ki42SjJCSo4yUn6CcoaR/k4GPo6GUoHeclo+ng6Gnf4aoq4OleIp8hJp+onBzlIiWe56MeW2Hm4yZkJuomo+HnXuConN2pmaefnekX5h6fZJzom6Yt7S6dJOHgn+1qGSBxrh7cJW3i3GAmqRic6yrYH1pnbN+bnyGgo2Ci5hxf6NscqN0n4WBpGCdmLKVcXyXn7N0c1uesoNqYm90dnFpb1hqbHJyZl1pXmNMRD1ENlFBWXEzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1OUUBFX15bWlhgYHxkSEM4TFdVVmNhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe1rq2gmqKdo6Omrpybsq6tk5ihmaGkmZqUn6ubi4iSeIuFcYCWjYqPoY+Rk52YfZCJjaigh5iOipGjlJybjIuoqKWej5eHhH5re4d+fY+Ng4uQkYmQlKCDl56gnaCei4l3nJiijJ9yoYuHqIibpY+Vpql9rYx+eqCZeqOTeIF0loiNnH2Vn4abjpmbpoaiZKF8iJaQm41snmiajW6amXuAi6d9cmh0q4Oeg3SqaJWaXZuFdoSdaKpqgLhmXKhwgZxglYxep3Z1h4l+nmiadYaTkpeOgJ9vmpBtp5lcqH54u2p9qVuOhF2zZ1xucnp4a2lccGp4eWNgZlhiQlFGTzdWQ1JvNUtaWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXVllZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniGOUm6u6srGsnqacnKmfnq6bnrGprJ2XpJqhn5iWlqGkmYaJjWqIgHJ7l4iLlpaEkJOYj3qKhJWjnIqUj4aLnpKdnYmOqKOgmoyRioCAaYCGeH+XjHuJjo6Ij5abf5Sin6Chk5hyaJ+Kn4+McJKMgamHmJ6hpp6me7Cto6K4l3ejs6KkgIiUeZ17qpp/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn90qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcnyObYCIhJl1m3iGibGzf4Cbk6d3gp1tcn2Ub5lyaqNdlXZIZWRhc3F+fm5mYGxpdntkZWJSX1ddVVdAWkVRaERTV1xiWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk5yBsK2ZhFNeoKazubOzqZqijJyrnJyplKGspaKoj5+enZqZlpihnZaIh4l3hoFveZWFkJuLfJCRlohyf4iSoJtzkZCBiJmVoZuFjaicmpWLi4p8g2yEhXGBoYx4ho2Ih5OZlnyTo6Ceo4ithn21hI6enHullnqpgZWcj4mfm3ynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpmAo29eqGd1omNvpWGc05B8e5l4cnNjooaQfqNzpI92a5CzjGCCmIlzqrKovH93g21+vqaptF6cbn1xl25/cqJyXaRnc6ZhaKZtm9SafYWbb3h6l2ube3eXc26ppGdhZXlxgIRrZ2ZkbnV3Z2BjU1xmUVFiSVdKVGFXU1tlalxlUUZDS01KS0JLRThPQFFOWFNZT1NRYWZlalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7CrVFxLfqmvsbSws6ObmYWZqaChpI6lqKCYqYqamJiTmZOSoJiOh4Z7cH2EaH2Pg5SagXePjI6Ib36Fj5KSbJeTfImRkqSWg46qmpOSi4WJeoN2h4BugZ+Gd4CTh4iZopd7lKOkmp+Js6Gitot6rKekrqVwqICakIWAm5F7pICimYaYcp6Eo66vipeMf4ykjZWDraGUdrS1tcmhc5SKgZ5gnZepbXmVhqCbdaGHd6B+kpeLgW9MZqOScJuHc6R7enRhg4FrfqBrcWRfnHF9dJdpemmztbTGpnOYfnqda5ybq3WEm211eJhpmnt1mHJQRX20Xmp2a3mIZmpoYnR1cG5WXlRZaVBTaUpWTFlUVl1oa25WaFdOS0FKTUtISk9BUUtQZWNqbWV1c3N/eXxudYl7e1RQTmxeaFtraVJqaGlsZ2xmY2VgXF1cXmliZGlre19dZGhjamZvbGVpbGWhnIivpoRmP5Shs6uvr7aiopCAmKqio6WMpqednaaCm5eWjpeQj5yTjoiDeWp5h2WDjH+XoHl1jYeLgGeDhZGDjIWdjXqMi5Wmk4OXqZiMkYuBiXqAfYt5cJChhnmBloiJlqCVf5Slp5yWloRmbnicbKJkfHGld5uYcGemgJaLe6R6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmqa3WgbW6mX5ppi5BoloealXWigH2aYIyGjXVviGJooGWefmmbdW9jZoiCbXKiWl9bYqFtXYmMbnt+c3JkpW13omRnp2iZc4yZb6JvU4mQb6BfZqhUi15UmG5tc2tygm1waWt5c2tvUllXV2daVG1KWU9dSVhpaXNqWWtWUVJFVlxMWFNhVWlrX3d0e31wfXxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66kqbCxpp+LgJirnZ+mjaOhm6KigJaZk46aj4uYkI6Ke4ZxgIhoi4t8mJtzdIh8j3pjgYaUiYmVmYJ8iIeWqJGBoqyRhpCKgop+gICOc2mPpYR9hpSOiZigjoiTqqadiaZ4lZt+pYiWjLKYnpCCr5efpXeUh3mpdKWPhJpupKKMkoSMg7tufaWvg4aGhpOVnJ98pXpyqJWglmaefm+rY5aKlZJ4qGypooGJdoiDd6qRpodqkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5/jKWedp99hKSVnaBqm4h3rGefrYy2dHe+jaSTWYOmjathdXJ0cXx0cWNqfm5obFNXW1ZhYl1rTV1SXUpebW52YFtxWVxgW2Z0ZW5vcWJxdGB3en55cnmDc4R/gXt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFgXlxia2JtbHpvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnainrqSZiYOYq5qfpYqbpZ2pnYWMmo+HnJGFko2MjXSGeoiEcI2EfpiTdHSFcpKDbH+LkYeGk499e4KFmKaOf6WmjoGOiYWVdoKHkm9si6mAg4uUjomcn4mMlKqjoI+AdZSXiH6BeZSuo3+Bm3GPhXiPioN+e3KnjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3t9iWuMhVt5eXJ6cGhufpKJcX91gY+Uk3GGhIJljH9egX+Ld3VzlHVveW5uh22EhV52aHiOZYCAhY2pm310fJZqiYhwgXZ9hnZtbWeMc3l7mHiFXGtYeY9pbnhycm94eHBdbIZuaWZWW2BXXGZrZFZiVV9RX3B4eGxrdmZqa2t2fXFydHNhb3VidHuBeHV6g3WAgX+BeYuFg317bX9sZHhuXlduZ2h1a3hqaWplXGBaY2pmbHF1blpbYmxkbGx5bmhsb2GNlLiopouhopqmpJmlnKujoYSEmKySnqGJm6eaqZiDgZuLf5aTh46KiY1yg3yPfX6PhXuXjnNyg3CVhXt9kouGhpCFeH2AhpmkjnynoYuGkJCFloOGjph3coWphY6RnZCInp6IjJuon6Cqg4mOlZp+fomWraiPkqaPd2+ckIJ5kW9+qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgnZ0gVlyboaRgX1+jGpdamR7hYSJgGBpeHqbe4KLgnWBhYJnd4qGa2FwcYF2XnKKgYiPppWFZYyPg253i4Rxho96cGZnZXuDepZbXGpnbnZbe3l4dW5zc4JmXG2Ka2thWVpfWllscVxfYVpfXWZ0fnp0cHRja2trfH1ze3h0ZG11aG18fnZ6fHt6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzeW9oam1gi4uqsKGQo6Ganp6Ynpmoo6N+g5mtjaCViJyikaWVf3uYhX2SmYmIhoeKc32BjHaFi4GElopxb4BymIaEfpKDhIaKgXqAg4uboJCCp6GHeI6YiZWLi5yXhIN6rIKRl5mUip6dh4ihq5+ioqOLiJObnKOZlqqhp6agkpuHlY17d42OhKd+f5KRkpOcsqablZ6QjbKTl4SljIyVm5+JkJuCiJGKa3yOd3hlgoaQi3yJnYSHi5CIiICEhJB3fHl0maGIhomeioSUfn2KgIB1b3OEgn53hoaKj6aQg4WNh4ONkIx9iIyKkYN3bIKEfXqZanJoYXSKcH16d3dwd3SBXV5vhmhuXl5aXV1UaHJWY1xcYmxodXx8c29wZGtraYB8bnl/cWpwcGxngXtygoB4f31/hHttgoyGfHp4fH16g3lOZHdqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnbmelqKhmJWYmZWZpKGefICaq46ejYafnIueln15lIN7jpmJhoSEhm54gIBygYh+iZSEbWt+epeHhIOQf4CGhIZ9h4SOm52Sh6ufhHKLkIaTkYudkX2Ne6qEjZKYlo+cloeGm6afopqdhoKSmpmYkJqmoKWdnZCWf4+JdXyHjoSle3yOkJGGmKqinpOdj42qjZGAnYyJk5qego6XfoaOg294hnJ1YX+Dj4Z1i5iBg4+ChoV+hYSUbnl1dJKiiouFmoSEjHN/iHx8cnJ7h4N6eIqOg5Kmj4WDjoGDiomKd4aJiox9b2x+gXxuaGxtaF96f2h9e3Z1dnV7d1xfcH1udF9jW11eUWduVGVbXmJraXZ6fnFsbWRrameBgGxzgWxsdW95cIV5boeAdoKAfoV2cYKNiH57e3x/e4KKYGl7anVoaYJkamNgaVxkdWhvYnRtbFVjcXllcHp7c2VqbWyLiZ63mqGjn5KRlpiLmp+fnnt4nqeRm4qGpJOLmJl5eo2FfImRg4yCgoJue394c4GFfYuRfWtofYKYiYCHjXx+hoSHfY+BkJubkYmonIBwjIuMk4ehooqFjH2okYiQkpiUlpN4jKOfoJ2WmX+AkJqYkoyao6GkmpeRmn2MhHiAg46GoH9+jIyPfJikoqKTmZCPpoyOgJqRiZOXm36Tkn6HjoF0dIJwdmB+gI2GcYqVfIiMcYx/goWGjmh3cXiLmJGPfpd9h4pygYZ7fHF4eoqEenmQi4KVpZOLhZB7hoaHhXaChImIe2ZyfH95e3FsamZffnNofHV2dH1zgGpeYHN2cHdkY1lfXlJraVRkWV9haGp2eYFxZmtkbGhlgIFrbX5ob3FsfniHemuMgXOBgX6BdHaCjYZ/fHp/gX1/j2pygm1zaWKHaGxiX3FWdG9tbmB4aG1XanR2Y3V6e3Jiam95iY2espKlpZyOkJiPhp2gm518dqWhjpd/jKKKiJqWeHuGh36DiX+IgoF/cX97dHaChX6KkXhnY32Gl4qBiYx5fYCNg3mWgZWYlo2WoJt+cIyCkZSGppuHjImDppWFk4uXmJOSd5GdoKCXk5Z5fo6Yl46Wmp2knZiSlJp4joSCd4SWjZ1+gYmNjHKXo5+ik5mOj6GLioKWmIOSlpl+mIx8iI2AdnF9bnpkgHyKhXCGk3+QgmyHgoGAiYRldW97hpKXjHyTd4qIe3+FfHtxfneIhXmEj4mKl6KVgYOLdoiEgoJ3fIKKhndgeXh9dH94Z2xlYX9pandzdHZ9cXxiY2FzbnVybWFaYV5bbGVSY1hhYWlsdnmGcWNqY21laH2DbGh1aGxwaYB9gnltkIZxgISDf3R8g4yBgH56goN+fJBtdohzdG5limxqYmN1VoRpcW5geGdsYmp2cGZ5fHpxX3FshoWPnK6XpqiejY2Xh4afk5eZfXiqnIqZepaci4yYkHl8gYx+fIN8gIKBeHR5enR9gIR/iYuAZF59i5WHfoSGdX1+in99mISXlJeMpKKYf3OHe5SSiqePjI6Kk6GSg5GQlZiRi4GPmJ+ako+Qc3+NkpSJnZ2eppiYjZWVcoyNiWuFl4+ZeoeIkIlvl56bpJOVio2ei4aBkpx/kpKVh5mIfIqJgXlxemt1bHx+i35thZKClHhwgoN9fop/ZHJpe4CWl4R+jXOPiIN4hn12d398hYB8goyEjJSkj3iEgnSJh32AdHaBiYRvYXt1enF9b2JvY2R7Ym5vdnN4d3N0YXVgb2x1bW9cXF9eXmteUF1YY2JpbXR7iGtfamZqY2h3iG5mbGhqbGiBfXt3bpCIc4GEhH10gYaJe4N9eoGEfX2OcnqKeHhubIdqaF9pcmKHaHFvZXZnbmxheWlrfXt4cGF3bYuAmZmqoKOonYqKkYaLnouVmH53rpmNl32ek5CWlIh3fnuKfXuAdnh/gHB0dHtvhX2BgIp/fGFbfo+Shn+Dg3N6gId6j5KIkpGck6WclYJ9gn2Oi5KkiY6KjZibjYaRmJOWj4qIjJKdk4+LjG6Dj4+RiJ6ZoqGXlomWkG2HmINmhZiOk3qIhJCKcJWalKOSkomLmYyCf5CefZKPkoyZjnuKhIdzcnVrcG51e4t0boaQjpJxdYB7gICHe2RwbHh9mZN9hIh0kIqAc4d5bn99gIV7hYuIhIyVqIx6h3x+i4V3fnFwgYaEZGl5dHVwfGJfcGFrdF5want5eWxzcGV4XW5sc21yWVpfX2JrWlBXWGVjZ3FxfodmXWloZ2JncY1uZGlnZGlogXp3dW+OhXSBgoN7dYKIhXiFfHiDhXqAiXd/i3t6cniDamtfcGh0gGpyb21xZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqCkJ2Hk511gaqVk46HoIyVk5CAdHx2hXh5f3Jze4VrcnB6bYp2gIGHbnFbWH6RjYh/f393dYGAf6CGkYuSnZihlZh4ioCBjYmcnoqPhpKYloWJlZmPlouLjY2NnYqNj4NtiYuQkIqdlqGcmJWFmIdpg6KCZoWdipB+i4OLgXeTmJKfkZCJiZWNf36PmHyRjY+NmpF8ioCCbnVwbG1vcHuFaXODjpiKcXeAdIGHgnhmcm51gZmOe4iEepOReXaHc2+Ie4WLeoqFgoiOm6OHe4N1got/d3lubIGEgl5zdHJwcHlaXnBgcGpeb2p8e3FtbWpsdmBwb2pxbVpYYWFiblhRVFpmZ2N2b4SCYl1rbWRiZmuSbmBmZl9na4F1cnNwi4B1f4OAeHWAi4B5hX93h4Z3g4V8h4x/e3aKf2pxY3xjhnxucWx0amhvbHZ4X3F/eXx0dXSAgn6klZqtnqaWhY2Ef5eUg5CgdYuglJOGi5qMlY6LenJ4dIJwcoVzcXWIa29tdW2IdoN+gG1uVVGBq5WHgnd/d3ODeoKggpKCk5OYnJOaeJJ7g42TpJqTjomVmZKFh5eZjJSLiY+PiJ6Ej4p8couFiY6InJqfm5aUf5N9Z4SbhmeFoIeRg5GCiXGDkZiQm46PjIyPjXh7kpB6jouMkpaMfIh8gGt2am5rbGx7fmF6fo6Wgnd6gHeCjHx5Z3Nsc4eVin6IhnuTj3F5g292jHqJi3qIfYGLkJ6dhHx7d4KLfXZwamyCg3pheHBubHJ0Vl5vYnJgX2xueXFocGZnc3RocGthd2VdVmZgYHJTUU5cZmVeeXCIfF9caHJiYmVmkmpfaGRbZ3B+cGtxdIp9dnyFgHR1fox5e4aBeIiDc4aFfo2NhHx5lXhmcmqDYIh9b29remBqbnR/dV90fXmGeHRzhXx4oI+ZsJyljoKKf4Oah4CMnn+LmpSPhYiYjo6PhHd0dnOAcG+Fc3Bxg29qaXZug259fW11c1JNgt/IktaTfHB1g3aEoIOTd5WSmZyRmXuUc4WQn6GTk5KKkpuUhn6WlomNjYiRjIicfo6Ad3qMfoiMipycnZuVk3mMdWaIkYZsiKKEkYiXgoVjjJGZj5WKl4uNiotxepSIe46IipORiXmFfH5se2Vyb2treXlcgHmQjoB7fX5+hY16emhyanOKj4mChYR8lIprfX5uf4t+i4Z8hHmBjpSamop8dniDkHhybGdxgIVua3VvaGp0bVJeb2RwWV9rcXdna2tiZnhyb3BjX3dgYFZrX152UE5LYWdjXXpwiXRcXGV2YGFlZY9jYWZiWGlzc21qcXaMfXR5hoJ1dn6Lc4CGf3qJfnKJh4GRi4h8fph2ZXNufWWIfm9wa4BabG55eXNhdnt7jXZyd4p3eZ+Lm6+boJCChXeIlX59ip2HhqCRj4WMmISTjoeBdHdweXFuhG9tbn5yZGV4cH1ten1qaGtjpJrB3K7voXNsdoR2haOGkm+XkZahlpyBknKFi6OXiY6Wi5CdloOBlZCFiY+AkYqJln6He3V/iXiGhI2cm5iZjo91iXVthYiKfYqig5CJnISFXouTmIyPiY6KioSJbXuWgX2IhYmRj4Z2hX19a31keHVpbnhzWIh6koeFeX6Af4SLfnhlcml/iY6JgoJ/i5aFa4F1bYeQgY+Ef4J5f4+Vk5iQdXN3iI11c3BndnqEY3VucGJpdmdRYHFnbFVfbnR5YXJkX2h9cHJuWmNyYWJWbllceE5NTGRnYl53c4ltXFxkeV5gZGWFYGNjXllqcmtua3J3jH50d4SBeHd7iXGDhH1+iHt0i4mHloaMf36Xc2h1cXlti3pudHCAV3F6dnlxZXh5h4xpdoCJcn+ch5mnnKOShX1wjJR4eYudhIWhjY58lo2AmoiEe3N3cHNqb4FraW18dV5heHd7cXV7Z2BkfOvatcnD3IhzbHSBd4ubiY5qmZCQnpaUgYlxhYmgjoWLlouMmJR8jpOIg4mPe5CLhY+Bf3Z4g4Ryh4KTm5eUl4aMdYZ+b4SBiYaYoYKTi56DiWGDlI+HioaJjYeBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXN2a1qMfJKDhXx/g4CDiYJ1YXNriIGPioF+fpGQfW2Ba3iFjoWRg3yBfH+QkpCWiG5xeYyGdWxwa3N5gmB1am5da3ZfUWRxaWZTYHB2dGBwYF1ognFzaVdnaGJpWG1WW3VMS0xmZ19icnOFaVtcZXleXmRne2FkX11Za25mb2lzeIp+c3OBfnp2eodzhYN8gId2d4qGjpmBjIJ7k3Vsd3V5eJN0bnh7fFh6hnGAb2d5d5KCZHaGhXGKloWZoZmiiodzb5OLcneOnH6LmomJfJ9/hJp/gXhyc25vZHJ+aGZsd3hbX3l7e3FxgGlgZmF/1baOkKZ4bnF3fHGTkY2Ha5qPiZyTjIZ7aYeLmYaBkpGGh5iOfI2NgYGKjXuPjX2IhHp0eoN7cYeBlpqOk5SBiHSChXWCf4qSnJ2FlI6ffohhf5OIhYmEiY1/gINnfZGAfn+CjI6Qfm2CfIJ0a213dXR2dWpijYGPf4R9fIR/hIh+b19ycIR7joyBfH6QiHlwg2Z5goqGi4J7hH1/k46PkoRub3mMfnVtb2tse35kaWxqWW52WlJpcmliUWJyd2xiZV5aaoNtc2JbZ19kbF9uVVtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmtsYm1qdHeGf3Fwf3t9dHiGeIWCfYCHdXmJgZKWfImGdomBcHd5e4STb218gXdeg390gW1penSUc2dzh3xykpGDmp6an4aIdnaVfm12lJd+iJGEio6afYyadn12cW9samF1fGZiaXV6Wl93fHptcX9lY2dnV52PXnFzlrzEhHZxlImQfnOYjIeclI2IdGuIj5WAe5SMgYSbjHyLhn18iYx/lIh1iYV1dn2BcXWHgp6VhpWPgoJxfod0g3uJl5yWhpONnICIZX2Sg4CGg4mJcoJ+Z32Le3l/f4eLj31pgH2DdmZveXhzdnJrao2FioGJfniCgISDf2pecXd6fYyJhXuAj39+coBoeIKGioSDeIN7gJeMj4x9bmx6iX13dG9paH13ZV5yY1hwc1NUbnNpYk5ndHhmYF5dWG6Ab3NZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebGNaY3B2ZGdcXWBramNsaXN2gYNxbn57f3R1g3qEgnyBhXZ+iYGWkXiDinSBiHN5eX+OkG9vfIFxaYF5en5tbXx2lmtqeIR0a5SNhZ+Xn5mFiG59jHZqeJiPf4KKgpWYinqPlm96c3FsamRgdHpoX2Vye1phcnx5ZnB6YWRkjrGyd0piWqTZ0Jdye5GLkXh/loyFmpKNhm9shpKRenmTh4GEmYp8h394eImKhJaAb4qHcXR9e2p5hoSmkYSTjYN+bX2CdoJ4hZqYk4uSj5SFh296koR+g4OJg2+BeGiAhXhyf3+Diod8ZX1+g3VjcHOAaHhwbnSYjYWCiXp2eICEeYFqW3B8coCHhIl9hYh6iHKAbXCDho2Dg3KDeICYjI2Ed21ufoR/d3plaGp+cmFaeFpZcm1OWHJzZmBKbXZ0YV5bW1l1fXJvV2ddZmpwX29OV2lSP1lnX1twamd5cVxaWWtlWWNxeV9oXV5lbGhmbGlxd3+Hb21/fYB1cIF7gIF/gn92gYWJl4pxgo1xe4Z9enqElIx1anp/a29+dH99b3J8e5Rwb4B/eGaSioKhmJySgoVnh4RwaHqXiX5/hYKZioF8jY1peHJrbGZfYW95bV9ib3lcZGyDeWBwdl9lZdXrvosyOj6LjoByeYWIjo12hJiNf5OOjX9ubIWNjHV9j3+FgpWJfIN4bnaHhYOXd26IhGx1e3RmeYODqIyDj4yDfW1/dHWDeYWaj4uPkZKMi4Z+e5KHeYCEjYNsgHNpf354bXx7gYqDeGJ5hIFxZHFpfm10cXSBm4uAf4R9c3V+gHOAb1trfXR4iYKKe4Z/fIh4enFsiIKOgolxgXh/lYqKfnRtanaAgHV1XGlpeHFZV31TWnFlTFtzcmVbSnB3b11bWllddH50aFliW2dlbmJpTVdmUT1eZl1ddmZfdHBbWVVvZFplcXlaaF5gZ21naWxpcHh9jmxqgoR/eW6Ae32Af4J6dYKBjJOFcICLbnd+gXt7iJOJf2h7fmt0fHKGe3N3fX+MeniEfnxrjIyDm52WjIGAbI1+a2l/j417fn+DlIJ/fYqIa3VxZ2hjW2Jnc29fYWx0YWhwiXlgc3ReY2SboJBuXDVZr7V1aoCJfZKGdoaYh3WPjIp3cGyFg4d0eYl4iX2TiHp/c2d2iH59l29whn1od3luZXqIhKWHgYeNin5ufnZ+gHyLl4aBk5CXiIuEiXyPiXJ8fYV8aX5ta4B7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZWRgXyBfm93eXx0fm1XbX52c4qBhneHdYGJendzbomAjn+Dcn58fZKIiHpubWltgoF1bl1oZnRyUlt7TlxxXE9ccm9kVktzeGpXWVlaYXGAdGBdXWBmZGhoZk5aaE5BYWRbYHZhXHVtWFhTdGFaZG5yV2peYmhrZ21saXB3fJNsaYSKfX1wfn57gX+CeneAgImLhHJ7h29xd4R/e4qNj4NqfntueHl3ind9eICCh3+Df356bYWMiJijjYSDe3aMeWtthImSeX17gpGAgH2Kg3BxcGNmXllnX3BwYGBocGZqb4p0YHNvW2FkaXZ7f76cpqPIuHKFg3OUfXiHlIR0kY2IcnNwhHuDc3WGdIh3lIl5eXFjd4Z5gJNpcoR1Znd2Y2p8g4iegoB/jo59cn5zg3l/kI6Cd5WNlI+Hgoh6iYlteXl+dWh6aWx/eXNpenaAg31oYHeHfmpqc2h7gGl2gYyQlH56fX1xe3Z7dH1hVXV8cnOJg4J8gnCGind4cHCDgot9fHh9fHWNhYJ2aHFobIiCcnBdaGN0b0tldkxeb1VUWnNtYlFPdHhhUldYXGFwgnNbYFxoZWRjamRQW3FJRGRhXGRxXlx3aFVXVndeXGVuaFZsXmFqZ2Vvb2hwd3uTbmmIi3l+c3t+eYKBgnx2fYOIhoNwdoNzbXeDg36Ji5R/cIB8eHl6gYt0g3h/gYGChHmAdm9+iYubnoh9hnp3h3xodIaNkXp/f3yJhoR2j4Bnb21fZFxYZVltc2FgYXFsbGiJbV9zaVleZG2Ad6naqseGh7JyinhwjXV7h5CBepSKgHV0dX53gHBxfm2FdJSGeHVsYHqBeYiOZnGDb2d1blttfYGQk4CBeZKSfXh7bYZ1f4+Kg3OVipCOh4WFe3+FbXV2f25od2ZtfHZtand2f398YWJ4hnpodXVjfntndIaOjJV7dIB1cYB6fGx/WVZyfW90g4Z/f3hriIZzeGt1f4OCfHl8d3tyioB8c2d0ZW2LhG10W2tgdmZIbm9MW2NYV1Z4bWJQU3R2WFBVWF5gcYRvXGBibGRjXm5iVF1yR0NmX11maF5ae2JSVlx1W1tna2FWa19hbmZmbHFocHZ4j3Rrjo11f3Z4fXeBg4F7dH2DiIiDb3GAdXF1foaCiY2Ke3d/eIR8fYWHeId8fYF+hIB7fnN2eYyOn4yJeol3dYN5Xn6Gmo15h4N0hoaEd4l7Ym5sW2JbW2FWanRjYFtob3Bnh3FgcWZXXWNrf3zKzoe5omttbottcoVyfYWLf3uShXp5dHl1dXtqbXVjhHaSgndvZ198gXmLiWVxgWpqcWNYbXuGnImDgnOXlHd+e22HcICJioZwlo6QiIWLg3p5fnFxb31naHJjbnhyamxxd318el1leYB3aXV5ZoJ2Z3SHjI2UfHKHam5+gHltfF1YcH1tc3+KfIFubol/cHZnd36Afn91e3F6c4Z7eXFlcmFujIJsc1hrX3hdSW9sTVdWX1RVfGthT1R1clFRVFZeYnSFaFxgamllYlluYVhjcEdBaF1gZl5dVnteT1ZlcFpbamhdV2dgX3JmamhyaHFzdod4bpWKdH97d355g4eAdXN/hoWOgnBwe3h3dXmHhYeMhnp8f3WLfn2GhISHf35+fYd/fHh1eXeRk59+jH2LbnWAeWSDiJeGdJKKb4WFgnqDdGNuallfW11dVGdzZWBZZHJyZ4FyYWtkV1tgaX94vq57n7duYnOHaHR8cnqDh3t+jYB4eHN3b3t2ZWpuYYd1joFzamJffnh5ioNmcH1oamtbV294iqOBhX9xmZNxgHh0gWx/gY+GcpSHjIeDiIV9eXRyb2h5YWptYW12a2drbHp3endbZ318eGVzfm6EdGV1ho2GlX5wi2ZreoN0bHRiW257a3R8i3qBZnSGfW1waHV+d3x9cXtreXuBeXdwZWxhbYl+bW5Wa2B4VktrbE9ST2lOWXxnYk5VdWtNUFRVXmd2g2ZdYW9nZmFXaV1cbGlKRWpaYmRXWVV5Wk5XbmpZXWxlXFllY150ZmxkcmdzcHSBeHCZhXaAf3h/fIWHfXVzgoeAlYJuc3l7e3NyhYeIiIR5gX12j399hImOg4GDe36Lg3t3fHd3mp2XeoqDh2l2fnxshIWUgHKPgnGGgn6Cf29mbGZXXVtcW1RkcGVfWGNydWl2b2RlYldcXGiAcG9ygHOJZWV5f2p0dnNzg4V4gYR6d3R1bmt6cGJna2eGdI2EbmZeX3xve4l9aG13ZmlkVldycI2nfIR8dpaQc3xye3lsenqPhHaXe4eGgoaDfXVwcm1ndV1taV9tdWRnZml6b3tyWWeBdnVncIB4gnVhd4WLfJSBbotqbXqBcWVyZWBseWdydol6fWF1g3Zpa3F1enB5d3J8Zn1+fnh2bmNlYW2GfG1rVmpicVRMamtQTE5wSF57ZWFNVXRkS05TV2Fqd35lXWdyaGVfVmNXYnBdS0trWGNhVFNUc1ZMWXZlWl9rYFxaY2Vfd2dtYnBpc29xfnV0mYF4gIB4gH6FhHp9doKDfpiFbnJ0fHp0cYWFj4KAeot1dJCAfYGUjoCFhHx+jIZ6foB2e6OminmIhoVsdXx7dYSCjHpvhXN6hX2Cg3VuamllVl1bW1pTY25lW1hhdHtqaW1oYGJXX1ppgGlrb4BnbGFoenlrdHR0b4aCe4B9dnVuemlrempfZW5ogXeQhGdlWGJ3aX6Hem9pb2dmXVVYb2iPp3aBenyRjnh1b35ucnR4jn53lHSFgn+FiHZqcnZnaG9cbWVebnNfZ2JqeGh7bVttg3N0am+Afnl3YHaEhHiPhXOIcXB5f3FjcGhbbnZkcHOHe3hhcoBwZ2l4c3Frd3Z0dmODe353dXBjY2Nse3xra1VpYmdUS21pUEdSbEVheGVhTVRyXUtNVVlka3d6ZV9tcGlkXFZfVW9uVklTaFhmXldMVGtUS1x6X1tfa11dW2JlYHpobGFvb3Vub3d1epd9doCBeYB/h4Z6eXqDfYGThHF0dH55dnSFiJB9gH2QbHOVgXuCn4V/h32AfoaCgIp7doSsn4B6iIeEbHKCeXaBgIJ0bodvfYB0ioBqb25kZFhfWlpbVWJqZ1taX3WCaV5ubFxhVlxca4FlcnR9aWpdbHd2Z3R3cm6HfH5+enZzbHpoanhmXWRyZ3p3koFjY1Rkb2eChHd2ZmhqYVdWWWhkkKdufniAi456cHB8ZnhueYp6do5xg31+f4ZuZHZzZGhoXWxiXnBvW2debXVlemlddIBvcmtxe351dWF0hYp7h4eAf3dydX50YXBsWXByYnFxhHt1ZHKAbGBsem9qaHp3dHFlhHR5eXVxZGFkbHJ9amxUaV5eVUx0Y1FHV2JHY3ZlYEtUcFhKTVhYZ2t2emRlbXBmY1pYXVh2ZlNJXGNYaFhYSFZkUEhieVtdYGxbXlxiZF6AaWpfb3R4bm9udoOXeXKBgH1/iYuGfnV2hniGjH10dXWBeXp6goyOfX6EiWp0loF7ip19foV5gHt+fIaIc3GProx8e4aQfmZxiHp0fX12cm+GbXt+bY96YnBvYmVdZVZaWVdjZmtgXV1zhmlZcW5bXlhaXGx7Y3F3dm1jW21zdGh1dnFthXl/gXl3bm90ZWl1ZVtndGZ2dpF6X11TZWZqgoFzfWFjaVxVWF5iZJClaHl0g4aQeGxueWd3bHuDeXSIcoB4e3h/aGV2bWBmYV9qYF51a1llXW9uYnpmW3h8a25ucHd5dHRkcoOSf4eCiHp2b3F8cmF3Y1pub2FwcYF7c2VxgGRebXZpY2Z4enNsbYF0c3xycWJeZW1ufWVpVGhZWlVOeWBSS1pZSGN0Y2BJVG1USk1aVmlscntjbGxzY2FZWlthd1xTSmNdWGlTVkdYYE5HanZYX2JtW1tfYmNdhWloYW54eWxvanaBkHhtgn6AgpKIhIF2dYl0i4Z0cXZ2gXd8fX6MkIB+k35weJaDfZmSeYCAeHl+f3OIg3NwmqJ7e4CJlXlkdYh5c3l2a3Nwf2x5fHCRcl5wb2FnYmxUW1pXaGNtZlxccolmU3JuW1lYWGBsdmRqdWpqX1ttdHFtdHR0a4Z9f4B8d29vbGVpcWNba3JkdHaPc1xWU2RgcX9+cYJcYWNeU1phXGSTn2VycYSDkHRranlsbm95eXpxgHZ/cnl6emRmdWdeYlthaFxed2lXYl5waGF4YVt7dmpqcm93dHN0aXCBlIOGfoR2cmpwfG1ldldbam1icHKAenNlb35bYG9xYl5pb3tra3N9cnB3a3BgW2VrbXthZ1RnVVhSUXdcU1BZUkhjc2JgR1ZsUklQWlVra2t8ZW1vcWFbWlhZbHBXUk9mV1ZoU1RGWVxPSXJ1WWBkbWNYYWBhXoxqY2RteXhrb2l1eYZ7a4R9gIWZfIKEeX2IbY+GcW93enx0goJ9i4+DgpZ0eIKThoGfiXWBf4F0f4Jwh4J1b6KXdHuGi4d7ZneLb258cGZ4cXtsc3ZzjWtedG5hZ2ZrU15cVmhibGxbXHGMZE5vbl1WWFVnaXRoY3RlZV1abnVucHV1emuIfYB9iHeQc2Nla25hXG5tY3N4h2taVFZiY3d8fHCFXGNfY1RaYFpjlpVjbnCDhIpzamd5bmVydXF6a3l0dW56fnVfZnNjW15XYmRZYXVmVl9hbWNhcV1dfm9oaXNxc3B1dWtshJOBiXuFcXJmbntvcW5TWmVqZXFzgHZzYmx2VWJxa1tebmR7ZGt1fHJycmptYFljaWp4XmZUZVVWUFVvWFFXVFBIZXJfYUZYa09JWFRWbWhkfGlrd2phV1xVW3RkU1JWaFFYZVNTSFlaUE54d1tgZmxpWmJgXl6PbmJma3l1bm5pdnZ/fm2EgH6Gl3t/h4GJfmuTiHJndIB7dYCDfomPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYt3eG57jWBkfHFneXN5bW1xdoNnZHxtY2ZnaFNgX1VnYGxvXF5ujmhNaW1gVVZTb2ZzbGV4ZGVdWXF1bXJ7eHNtiXyBd5x7emxiZWxtXmBuamVweX5nWlZYX2x4e3tvg19iXmhWWWBYZJyIYmtxgYZ8d2tqdmxbdXBqeWl1cm1ue4ByWGpuXlldVmJkWGVxZFRfYmliYm1aYH5rZmtzdW5td3ZraIWMf4l6h21xZm97bHFsYlhfaGhvc4Bzc15pbVNlcGRVYm5heGJvdXt1am9sal9YYGZodV1lVmJWU09ZZ1NPXU9PSGVvXWNHWmpOSmBLWG1kX3hobn1kYFVeVF10W1RSX2ZOXGFUU0pbWVFadnZdX2ZtaFhiYVtejnFjZ2p3cXNtZ3ZzeYNzgoN7iI5+fIqIjnlukIp0bHOBc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2Ojo6Njo6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY6Ojo6Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZxbQURERERDWGhnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIaCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJycn1IxNTU1NTRNYV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHh4iIiIeOkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6OiIaGhoWFhYeJiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5GLko+MjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2Ojo6Ojo6OjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoWOh4iNiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiIyFho+JjJCPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCIjIeIjIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMkIiNh4WMiI+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2PjI+Mi42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5OUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlZWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKSlI+OlJOVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkpGRkpKTfIaUkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSko9+j5KRk4hzjJORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCQkHR2kJGQeHSKkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+RfGh9kYl1domQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6OjpCAYmqKfmx0iI+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjndeamZpY2yKjo2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLiouGZG9tW2lya4GGg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d29jcW9hanNxZWhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoY2VrbnNwcnVsY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXllcYGJjbW9wcG1aWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTU9faGZsbm1nZVFQU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OT0xMVmRtZmptbWpnXFNPT1BRT05OT05PUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0dHT1VgaG5obGxrampoZF9WT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVFU15iZmhqbWxzcGppamxramZYSkpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj8/TVleam1sbnlzampsZlxSTEVFRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7OztHSj5HWWpvd3BraVlHREFFRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs+PTo7RFhtbF9IQT5BQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk6Ozo3N1NjPTc4PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT49PT07RVk5Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APF1uQD5ERT8/QTxFXD09PTs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXZIODs6PT1BPEphPDw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlMRkZ2d003ODg6Oz4/V2lBOzw8Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXx3Vjw9Pz09PkZqdU06PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4ODgH1dPkBDQEA9SnN8WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2EdUxBQ0VAPz5ZfIBdP0NFSUpJSU1NS0VDRkZHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVxQkRFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhGSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIpsQUFWdIeJh4eHiINXSExNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3Z3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbISHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGhIKGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaIiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJioyMi4qJiouMiVQ6ODY1Njc2NjY0NTc3MzU2ODo4NzY1NjU2NzY3Nzg6Njc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BPUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIKDg4ODg4WJi4qJiYqKioqLiYqKgUc2NzY0Njg4NzQ1Nzg1Njc2OTk3NjY3NjU6OTo7Ojs4OTg5ODc3Nzk6OTg4Njg2ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiIiKiouKiYmMej45ODg7PD0+OTo6PDk6Ozk6Ozo5OTs6OT09PT47Ozw9Oj47OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXN1eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA+PT0+QD8+P0A/QD09P0I/QEE/QT89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t9fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUJAQENFQ0JAQkNCP0BESEVDRUNFRUFGRUZERUZEQEI/PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqIVkhNTE1LTkpJS0lJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE5QTkxOS0pMSklJSEpGREZISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hHR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7PD06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1yTlJPTkxMTExKSEdFSUlESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dIRkNCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRUJHSkdMSkZLTktLSkpMTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkFCQlxvcnd4eXp6eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxYVlJSVFNPTEtKREVGS09OT1dVUVBPUlNTTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hXVWthRVJRUVBJOztSVFJgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTlJQUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7enp8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3pucFhaXFtSU1JWVlRbWnWDWVV9kGBcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVRVVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlNVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlRkVX9SUVFOS1JUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXZ1c3N3enp7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZPRkRFRklHSENESEdIS0dEQkFEQE5RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgmtNRz9AOjs+QEA/Pz5qUUthRUZISUVCP0dMTkdNUVVJQkU/Pzw9PD09Pz0/QUNDQD88PUI+Sk1HVW50dHVzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PzxCSD9cc3R1dnV2eHp8fHx9fHx9fX1+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxCPWVzc3Z3d3l6e319fHx7fH19fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aWE1MVFRTUFFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdXWGhza11WYXNrYWFfXmRhX15ZVFFOTk5MSUhKS0lJRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbXJ0eHh5e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1VUTEtUVlVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz88Ojc4NzY1OTk2NzY3NVdwcHR3eXp7fH19fX58fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9ydXh4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydXl7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7P0A+PD1BQEI9PkVIR0NGRklHSklARkFBQEZIRUpPSFFSYVxRUFJOU05PUExMT01LTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZFP0JDPjxCRz9CP0FkcHR3e3p6e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk3Nzk/Qj47P0FAQD5BRElFQ0dHSUZJRUJCPz49Q0JBR0lFTU9iZVFNTk5XS0tNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEpEP0E9OTk5Oj9CPzxAQkFBREVHS0ZDSElHR0hDQz9CPz9AQT5ERURMTVJUTEpJTVRHSUlKTEpLTElKTE1PUFFQS0dDS0dDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSEhHSktJSktER0I9Pj06Ojo7QUI/PUJCQ0NIRklLSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISUtNSEpMSElKS0pNXFJISERORkFES0pNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZFR0VGRkdFR0JDQD08PTk6OjpAQ0A+QkNERUlFSUpMRklJR0ZGREI7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lIRU5JQkZNTE5NT01OTk1LSUhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtxbHNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NDRUBEQj5APzo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1FRUI+QkRDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSkhLSUZIUEtDSU1MUE1PTk9PTkpKSE1SVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxmcWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMR0VFSENCQUJEPUJBPkE9OTo9Pzo9PkBCPkBCREdKRklGSUhGRkdFQ0JBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFRkZEQ0lJSEtKR0tSTUJOT01RT09PTU5PS0tLUFVXVlVUWF9eXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJAREQ8QUBAQzw4OT0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUpJS01LT1NORFFSUFFSTlBNTlBNTE1TV1ZYWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW95TUhHSEhCQkJGRDw/QkJEPDc6Pj46PjpAQj4/P0NFRkRGREVIRkRFRERFRkdKRUVKR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgX2hlY2BkZmhnamloaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkQ9OTo+Pj08PEFCPD8+QUJGQ0VDQ0hFQ0VFRkdHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZXF9fXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZvdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZDRUVESUVGRUdFSEhGSEhJS0lFSkhIS0hGRkxJSEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1NSUFZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpnZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZJRklGRkRJSEdJSEpNSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdER0lHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdISklJS0hKSk5MTkxJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxrVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVLRUVKTU1LTExHR01JR0pLSEtLSUtLTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEQEJCQD5DRkdCRkNGRUZFRENISEdERUtIR0xNTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0hFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHS0pHTU1OTE1OR0xNSUxLSUpNSUpJSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SE1HSURFRUNBQj1CQUJGREhHTEhFQ0NIS0hIRkpMTEZOTExTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnRzdnNIS0hJQkVFRUFAPkREQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTU1JS0tLU2tiW2leX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKSktJSElHS0tLTEdIS0tMTExMSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVpdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQENIREZHQ0lLTEhGREdLTEhER0lQS0xPS0xXTElFRUhJSkhJS0hMSkhGR0dJR0hJRUZMSUpLTkxJUFxXXlBcW2BeTVhZU1xcYl5NWVpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRERCRUlFR0dGS0pLSEVFSkpLRkVISFBKTU1KTVNIR0VBSEZKSUtLSUxKSEZFSUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2ZoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ1dmFTSkpNSURCQkNHSEVIR0hLSUlJREZLS0tFRklKTktOTEhMTkdIRT5HR0xJS0tKTEtJR0VJRENEREJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFSElGR0hIRkZKR0hGSEtJTERES0pNTUxMSEpKSEpGP0dGTkpLS01LS0tJR0dDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHRklGRkZJTEpORkRLSkxOSkxJS0pISUZCSEhRTUtLT01LS0lIR0VEP0VDSEhBQUdHRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTElJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VEV1VFXFVeU1ZfWE5UVU5aWk1KS1RgYVtfWF5eYV1PWWJcYGBfYmNiXWFiV19fVFBOT09XUV1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQQ1ZeSUdHSERGTUpQUEVJSUtLTkxMTE1LSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0JFRkJNSEJLTFBPTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xRU1JVWllXWVhYZFdPU1RQUE5NT1RTW1hYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSUxLTEtOTVVOT0tLTEdHS1BTU05QT05PTk9IS0ZgRURfTERmZEVNW0leW3JtT01VbVlMQ1BgVWtXZ0pdWFVeRE1RVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalNXVlRbXFtgYGFhYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xIRUdGSEVFS09TSUpGYFNISk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUX9RSXxZWXFzWFBtSHFub2FWUHFxc1BCa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1xmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEZJS0VRVkxLTklLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWlJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b315b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0lRUlRZV1dRVFBQUFFLSGd4bGN4cm1bS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anV1cIFgcmd8aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXdybk5LU3ROQ0NGUFBISktKS1BPT09NUFpgWlhLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGZlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUElMTUpLUFFQUFBRV1xYVU1VWVVmWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGR8aXJ8XlRMbGB2dWtpdXx7bX54a3xwXV5fYltfYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElISFJQTE5PTEtSUlJPU1JXUlZUUFdbVlZUVFRhYFBOTUtUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFlSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1hYUl1ZV15WVFBZUlZXV1dYXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlYUE9MTVZUUE5VU05PTUxRUEtKUlFLUU1LS09SVVJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVVWU1pRT1NSWFZUWVZUWVVUUlVUVFVXWFddWl5hXVxaWlxcYGNbXWJjZGZkZWRhWWBhY2FiaGhpbWNhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNRUEtPV1NQTlVQTlFOS1NQTE9VU05STk1OUVRQVFFTVFVOS01PUVRUUlJRVldUWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWmBdVVheXF5dXF1hYV5bYmJjZ2ZlZGJYX2FiXmBoZWZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FbWlhXWFpaWFlWXGpkVlhZWldWU1RPSk5WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUV1ZaXVxaVldRUldYVltbV1FUVlZWVllUWFhVUlJYVlZaXVldX15WXl1eYFxcYF9fX1piYmRoZ2RkYlliYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF5bWVZVV1FMTVZTTU5ST1FST0xQU1JVWlVTUFBMUFdXUldTU1NYTU9QUlRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpXV1xeWl5fYFVhXGFhXmBiX11gXWNgY2doZGZgWmNgYV9fZWRfYGNbWlxbXFlaWFlXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cX1dcXmpxd3mAYlxbVlZYUU1PVlNOUVFQUlRSS1FUVFlaV1VPUk5TWFdUU1VSUlpPUFNTVltWVldUVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVVNTXVhaXV5cYGBgVmJbY2JeYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFtdXl5bYFxgVVxdaWpyfXNsZ1xVWFdQTlJaU1JRVFJUVVRLUVdWW1paU09TUlZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxWVFdeWV1dYF1iYl5ZX1tlYl9kZF5eY2NhXmVmaWRmXl5kYWBhYmJkYGJeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWVFRUXl5gX15iXGBVXV5ia3l0bH1sWlVZVVFQU1xUVVRVVFZZV0xSWlddW11ST1VTWFdWVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paVFVWWllaV1haXFZVWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfX2FhYGNdYFRdX2JlZXWBemhYWVlTVlNWXFhXV1ZWV11YT1VdWl5dXVRSV1NXVlVTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxWV1hbWltZWVpbWFZdX2BeY2JiZWRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9gYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVZWXGBhYmNhY19fVltgZGFfenVvaFlcWlVYVFdbWllcWVhZYFdQVl5cYGFcVFRYUFVXVlRWV1JTVVdaWlxfXlpfXFZfX1leXlleVlNZV1laXWJaXlZXW1xbXFtbWltZWV9fYGBkYmNkZWJkWmJmY2dmZV5hYmBjXmJjaWRjZ19nXmJiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllQV1ZXV1dWVFZUWFxcXmBgXWBcV2FeW15cW15YVlhYW1tfYFxfWFldXF1eXlxbXVhbYGFeYGRjZGVlZmJZY2VlaGdkXmNhYGVjXWVpZGVpX2ZeY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWlhbXFhXWV5gYmFlYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBeXV9aWl5dXl5hXFtbWlxgYl5iZGNlZmVmYlpkZmZpZ2NfY19hZmVaaWljZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMWFdcWVdcW1xdWldcXV9gYmRiYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpiZWNhUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfYFxbXl5gYmNcXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGRnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFgXltgYWJlYl9dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8fHx8e3t7e3t6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKgkU+Pz8/Pz11jYmJiYmGs9bS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzMHOQjIyMjIi/6eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4d3h3d3d3d3d3eHl5eXp5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1en19fXx8e4GEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV5dnZ2ent4e3h3dnd6d3l6en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx7e3t7e3t7enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH15fXp5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHp+fXl7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8enx8enx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHx5fH16fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4eXh6e3l5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh4eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHN0cnFwcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3N0c3NxcHV3b29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzcnNzcnFvkINucG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXaMdXJyb32ge25wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcp2VcXFxlaJ7b3BwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXJvj6+Jb3mionpvcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnCIsqZ2iqyke3BxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycI2zqKSmsah2cXFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3N2oaGjtKabpHxzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHd4eIKnn5ynn6Ojknp5enl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fn18fHx8i6GOj5iamZuVe3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX1+fX+Ip6ejnaCak5iBf399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYGBgI2yp6mioKGrpoR+gIB+f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f3+AgH+Kqa6fqaOgoaWppIx+fH6Af35+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f4GIlaqvpJykoaChoaGpq6CNgYCAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4OGjJumo52cmp+TmKGgnp2eoaCUhYGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYKEjJSWl5eZmIeQnZubnJiRi4eDg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoCCg4SMlpmViZKZnJKLh4WGh4eHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGCgYGEj5eUlpmQhYeHiIiIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SEgoODhJGWiISFg4OFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKCgoKBh5GCg4OBgoCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAgICIkoCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDipaIhIKEgoJ/gIyWgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmIqDhYSEhIKAkpqGgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSk4+MjIqFhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYucjYCCgYGDgoWUk4yBgoGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeMgIOBgYGAj5OLkIGCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p9hISDhIKDg4KOiYWMgoKDgoKCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUk5KSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf359fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKNioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aDgH5+f35/fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhYWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFhoaGhYWFhYaHh4aGhYaFhYaHh4eIh4eHhoaGh4aHhoaHh4eGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoOCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmKi4qKiIiHiIiIh4iIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaGhoWDiZSTkI+QjoqGhIaFg4GBgoGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgYSEgoKCgoKCgoB/fn19fX1+fXx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fnx9fYOHiYqKh4eFhoeHh4eIh4eJh4iGiIeGiYmDg4SDhYSEhYWHiIiGhYOCgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGhoeEg4GDg4SFhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjZCMiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4GDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af36AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/f39/fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gH9/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh9gYCAgYGBf3+Af3+Bf4GAgIGBgoKAfoB+f35+f36BgIKBf39/f4CAf3+Af4GAfn9/gH5/f35/gH99fn59e3yGk5KMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOAgoKBgIKAgoGBg4KCg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTj4mJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX1+fHt5eXl5eHyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSEhISEl5eDg4SBfX6BgoKBgoGCgYSGiIyFg4KCgYSCg4OCg4WEhIWDgoODgoODgoKCgoOCgoKSkIuIiIeJh4aGhIaFhYSEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fXx/gYF9ho+Bfn2Cfn9+gIJ8fIB/goCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMi46OjIiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3t6fIKAgX5/gXx+fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjY2Njo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fX1+gICBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6Njo+OjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjoyPjYuKhoSGhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fnx7fHx8ent6fX+AgISDgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfXx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fX18fHx7fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJioiKiYWIko+MiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx8fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uKiYyRkI6KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3t5enp4eXt+f4ODhIeJioeJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiPjouLh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn5/f319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY6LjIiEhYWEg4OBgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYKCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH9+foB+fX5+gIF/gX9/gH9+f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKi4mIhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKDg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmHh4WFh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl3dHSAgIKCgoKCg4WDhIOCg4SEhISEhIGBgIB+gIKAfn9+gX9+fn+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4OEhIWEhISEg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SDgYB/gH+AgX59fn5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn59f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fX+AfX9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt8fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgICAf4GCgYB/fn+Bfn+AgoKAgYOChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx/gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAe4B+gIB/gYCAf32Bf35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDg4ODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgICAgIB8gH+Afn+BgH9/foF/fn9/fn19fH+AgICAfn9+fn99fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKAgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt7fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf3+AgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBgICAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgoKCg4CAgoGEg4OEgYGDgYKDgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgYGAf4CAf4CHfn58en18e31/eHd2eXl6fHx8fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGBgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/gIR9fX17f316fX97enZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYSBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOCf36Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDg4KEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoSCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7fYF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhYOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhISBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeoR/f39/hISCg4OCgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgIJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6GhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhIaEhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4aDhISDgoF9f357fHt+e3x8fX9+fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9f358fH59gH59f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoaFhISFhYOEh4WDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSFg4GAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4eIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIh4iGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYSFgoN+gYKBf4OBf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSHhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt9fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYWChYWGhYaGh4SGhoaGhYaCg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICBg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18gH59fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoaGhYOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSEg4OBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09PT09PT09TU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2djX19fX19fY19fX19fX1tTT09PT09PU1NTU1NTV1dXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6auubi4uLi4uLi4uLi4t73T09PT09PT09PT09PT09vi4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIaEhISEhISEhISEhISCkqWjo6Ojo6Ojo6Ojo6Kr09LS0tLS0tLS0tLS09Hf6urr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PEJAODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKJh4eHh4eHh4eHh4eHhZWmpKSkpKSkpKSkpKSjrNLS0tLS0tLS0tLS09PR3+rq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjYyaqqmpqampqampqampqLDS0tLS0tLS0tLS0tPS0uDp6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/O0NHS0tLS0tLS0tLS0tLS1NTU1dXV1dbW1tbW1tfZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/P09PPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXW1tbW1tbW1tbW1tfX1tXW1tbW19fX19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/Q0KGWy9LHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZuz1qegq5/PmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6Cqr8qclpChtJWGnZzNz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrO/m6CombW/yZeZxdDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5myzKOgi5/E05GZoc/Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P1aWZsdmYx8mU2K2jv57V0dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NalmbPInJWVpLvNiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpZq3sZqvs52l0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0Y/SEhHRUA8PD4+PD09PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1aWZt7Gem6KcnJGnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQzs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0tajmrLJnaiho56ooqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HVtYLD16+NkaXUmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tIPTU1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHC1NLVwL3W1NO5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT42NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tTV09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6Njk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZJRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT0tLS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0tAOzs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPkhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQT9KTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BQ0NGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9CR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTY2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk1NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNDY0OTg1NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDQ3Mzc4Njc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tre2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2tbW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NDczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsrK2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKeoqKWmqKiop6inqKmpqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo5Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqilpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6enqOkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qcoqCalpWVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqamp6amoJuZm6Ggl5KdoJeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqenpqKenZ+hoJeYqKKUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaWmp6alpaampqWjoKChoZ+aoHSPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqSlpaympKWko6KhoZ2bpoJhlJmbmZuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqS2taWjpKKhoZ6bnKNdZpqZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKCmpZOxoqGgnpybmqeFVW6cmZqcmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaGgoK16jK2fnp2ampymZ11xnJqdnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCgoJ+pjWmcp52cmpqfl2pncp2bnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJyen56dpJZ0famcmpucootraXCbnZ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZybmqCWe3eRnZqcnpx9amlym56cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmZqgoHqKhZCZnZ6SgGtmc5qfnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuZmZmam6CXoH1ymaWbeI6GaXKbn52enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZmZmZyrn4pxYKepnWF6iXl0np6en56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZifrY1wYGmikJNUX3l7haCeoKCfnp2foaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmXp6d0RUZul4B7UD5bdoSdm5uenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qblqmaTERGcJWCcVJHOGB4jpKNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkJWsdV14X4O2r6Vidn5Lan6Igo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg3+SqGCOs4zOw6zApYCVelJ6goGSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+ipdy0NbJ162furNjZHBaboGGjY2Lho2UkouQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhH+CfZF/kM21ws7Iv6yUfKqsX2iJjI6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYx/iI2NjIuIkouYdZiijbSqnZ6HgnBozYBgi4uKkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmRnqGdk5eboZqenKOhnYqQeoajjISJd3RtdqOLZoaPjJiaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaiprKqqr6eZfltmhnh4f21qaHV2fXeEo6GknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipaqop6qsh3FWW3RxcnlpZWJpaXB8i6Opp6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaZnqWloqKwnnFrUlJ2d3R7aGFlZl5fb3yLoKSgoJ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioKOnoaauqLCyrIBoZktOcHV3gGlgYmlaXWJrdYORnaGgnaCjmpaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGnqa22vL69rI1uaGNGVW5vfHxuYF5mWlphYmdweH+OmqChopiWnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevvMbLzca3po9zaGpcQk5wbnRuc2diYVlYX2NhYmpxdXqOoaicnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7TA1N3by7mrm4dwYGBiVUZFdW5gX21tXFtXWlldW1teYmRlaHiSp6+mpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1pdmtwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLS3xdLZ1smukXhmXVpbXFRMQWtqjJiPWVRYV1xcXV1YVVhgcomhssXDtLKgp6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDub2+wcfN0MSgfmldWVhXU0lUbKezqE5VXmFiX19fZnqWr7++vsDCsrW2qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvFwcXGwLy5zMm5l3NcVVhUUVKcs59OWVxeXWBtjqq7wbK2p6axtau1sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2pmaGFrbGdudXJydXFnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEJCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8PGxsGxk7+8y9C/mGpYV1lMkreWTVVZWGB/prywpquus6eqqamrrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3RrbG5kb21pcXhvemppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMS5tcC4s7zBxb+pd1dVUYq9j01TVluDoKa3r6WttLStr6Wko6ikoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpaHVaZnJ4c3lmZl5kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvri9wcO/x7uNY1Fhf2VQU2CNqp+mtLKtrLi1s6upo6GtqaynrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMe/xMfExMbKzsKNUklQUWanurfAvb65vLq8urysraapu7q5t7+ytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGlpdG15bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXFw8XEyczT05ZNTVyqx8DIzcbEwcTHwby+tLGwsMK+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZXVudGNdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPBwsbGx8rNf0mPzc3HzNDFtr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnY2pkYmptbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvr3BwcDAx6ZNpNHMxcnRwa+9vbi5u7u+t7Sxub6zvL6xubW4u7a8tLW5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjY2NqYmdjW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvEvbrAxL+9vbi7wMSwU57NxMDByb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWOvL67w7W6x7e2uLu9ubm1usPIq1SXyL+/u8G+uca9wr+8xbi2t7S4tra7u7m2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmcGpla2hYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDFea3Lvce3ubittrS3urS3s7vFyqBVjsm/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdwa3NmYm5gXFRIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTYr3aEvsjPwsC4rrW1u763urK+wsiWW4jNwsK/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudG53Y2diXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0Zt0d7HR0czKxLW6v8TIvr61v8DAh2h9zcbCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4J0b2xsdGxsbl9jXmFiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysKIdneozMzLzcrGwsPLzsG8ub27sYF6bcDHxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u6rdvDvra+wL6+uqacqrO3xMCmfHp8n8TGy8jBw8DAycrBwLy6sqWWiHmzyMXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3h0aHBdXF9cWlFFRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFtm6vzr22ucC8qn1uaG5tdIKXmXV7f5y+v8bAucC8vsXEvb24sa6mq5aUosrDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bHV7cG5pXF9fWVNQQUZJR0tARUNIPD02Ozk5PDs6Ojs7PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbF2grS9trXBpIZpWl5gTlNbXHB2eoWkuLfCurO7t7u9v7q7u66lrbKhpYfBxcO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d25xYV9mXVtVSj0/P0dGPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmmhHiLorC1nGpmZ1ZZX0lJTVBUb3uLqbC3vrmytbK8uby2ub61mbG+rrN4sMnEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/GqId7doyhmF9TQ1lVSGJqVU9FSmWRpa+vtrq1tLKsvLm4tbjBvY+sxLS0d6fKwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZybmNdZlldXVNPTkE+SkJAS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7OQgXmIkG5OS0BlWUJPeIGTaE1DXoWxtbO1srSvrLu6uLa5v8Z+k7qromirv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLavqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWxdW2pUXVtQTkhER01CRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhXxYRkFPh1hJSll4joNjQVWjubO0srCxrbC5uLa7t7q9lKe0r6d3rbCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh1dG5lVWFjV11RT01IQElSRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZVoTUBTeXFPSUlMaZ2AWkVVsLqxrLOvrqyttraytLWuqaafmpudn6aonqCoqZ+hp5abl5eOnZSPkJaNl5ukqKCgoqKipaWdo6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56em5mml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjd2xuXVFpVFBOR1BNTENQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3BqqW8Z0RTnH5QWElLYUpXjmJlZYOvtaqytK6qq6+wsrOtpZ2Rl5OPl6CfoqCco6SfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+Ym5mbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ua3tkaFZSZE1KSEdPU05LTkg8RUA8Mj84NTk7Pjs5ODs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCrxr/Kn09BdZlwUG1KTGRmdnRhXWJ0krKvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eZoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl5YGJTVWBISUpLU1RJU1FNOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpcfGi1dTSmakWWZ9b3JbUmtkXGdiYG2RtbCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuUlpuWmZ2loaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1tZTVFKT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWpyd3VwY3d2WFdiYGRpW1pXaK2urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgHx4dmp3dV5tW1JgSFJVSEZVV0pDTUc9S0g4Rjw3Nzs+PTw6Ozk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCkf2+CcGBjV0tbUlpMTFFZUkhPTkiZrKqppJ+fmZKSlJiYlpaVjIiLjpWdnJ2dnpeemaafoKilsaqnrqOrrrawtLKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pd21obVxYW0NXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOenIliV15lYFdNUUc9P0BDRD8+QlJ4qa2pqqWfnp+io52enZqcm5STlZSenZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a7u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqCjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF7dHJra3VycWhWXFFGVUhESlBJP0VBNEZIOTU8Pjc7PD49PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFBGRDtDPkY8Pjk2Tn6qsqejo6KgnqWrpp6YnJSRmZ2ZlYyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3w8rJw8HHv7q0uru1u7ewtrKqurKuu7i/u7qruK2rqri7tbyurrmjpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrY2lveGtlWVtGS0xFRFRMRENFNzo/OjU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklZfG9hQT1cjq6soJmbm56emZeXl5KNj5eXk46NkIyCg4J3cnFtcI+mra60ucW7zcfLv8LMzc3Mx8nRzMzMx8nFxszQ0tXO08m9wL/Du8bFyMXR083U0NPTzMrCxcbGysjPwMnRzMfGyMbCvMPBvr+/tr6zrb/Aw8PHxcfEr7+5sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXRzZWJncm9mXlpaQ05MREZQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaWZcVElEQD9Lhp6kmIOgsq2jnpyfmpiXlJKUlpGQj4yHhIOIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fS19LV1tPUyMzHzM3K083O083FycrKwsfMx8nJxr/Ds7PIxcvLy8/Hyr++v73BxsXNzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAe3J1dmdjZ3ZqZFZXUURORkBKUUI+Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DU7DSvbKvppycnKCkoZ2alJOVlIl9eHFrZWJocm9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s7U1tfU09HT1NTTz9HE0NPW2NXW0svJztHLxs3RytLV1tnW19PX2M7Sys/RzM/QzNPQwMjIysTMzMzOz8XHyLa/ysDSzczQx8rJwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYGVyYl1SXElKR0FFSUo+O0E4PTU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFZSUBBREFGUXayr6aalJefnJqgoJ6bnJqViXdpY2FfX2BfXl9fXWFsdXNwcG9scnF1ksTIx9TW19fX09bQ1dTa1NTOz9XU1NHRzNHO09fW09XQz9LT0cnT0cjQ2NfY0djS19nU1czPz8rN0svO0cDGw8jGz87R0dLIzM3Ay8zG08/Mz8jFy8fHyczK1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu32NTV2dnRztC/vMzJtr6upqqooaOrZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cWVjYl9fYV9eYWBfYGBfYGVtcHBua29yd3eczMHT1dPY2NbZ0dLS18/TzsvSzdXU0crPzdPW0tHWzc/V1dHF0dTL0NTV1s7T0djX19jLyM7Eyc/MyszAysDJys7O0MvQzs7Mz8/IzNDQy87Lw8rHyc3LzNLTzdPS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Fva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXpIRkI7V46hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3O1MzO0s3L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXNwsjKw8zExsnLy8/Lzs3QztPMxsnPzcjHy8XHwcbKzM3Q0sfQz87OzNDFx8G4ub3Dw73DuLKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHFoWVhoVk1HTElQUUI7Qz47Njg6ODo6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfDuMrV1tna29jMzM/I1tXEwrWvtKifrZd4bHBxeZCbjYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYGBfYGFhYF9dW11ncnJwcnNxbXJ5pcfTz8vQ0NPUysXJycbGv8PFz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8a6xL/Gyr3Cx8nOxcPHwMfNyMTMy8zPyMTE0MjGwsbIxL/Bx8zLzM/Cy8zJx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG90ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7uto7Z+aIOFpKuUjo2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19dXV5fYGBfW1pcYGxycW9va2xvb3250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIys3JxMLLycHBy9DFy8i/ucK7xse+wMbPy8TAw7vJx8m7ycfFysC+wsvGxcS+xr28wcPFzMXGvMDJw8XH0sXByb/KycbIxtHDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdGZpWmFubVpbWFJETEZCR0VMREZTQDU0MzM1PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1drY2c/L0s3NzsjBtcO+sa+2bF96fKGRi5KWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lrcG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7usbDv7zBzsPGvr61wb3Du73Gu8O6tLzGxMLCt7+2tr6/u8zDvba6yLu/vsvDwcbCxcnHycbQxsLMyLLHycPOzMDFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NWXllKRkpGSEtBRUJGSkA5OjY1ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysnGzc3O0cjQxdXU1dfNys7FycXHwbnFvauupmBkdoOTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25wcnmdvczAw7rBuK2wsaeqraynuLS2tLOztLu2vbG3sLWvsrvCvMHEvL+7tbK6vsC4yLm0u7fBwr24vcfBxLy1r7K2ur+0xbe7tau4vb7AvbG6trC3urPGvLevu7+1t7XFvL7DxcDExcbHy8XAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25dVl5gRktISEpGQkRBRUU/PDo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjJyMrIysTQzdLPzcXHwcbAv7q3ybaqsJlbaHCKj4WIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaWZrbm5yfKTHwLi4tbCrrKeeoqmnnqqss62qrKq0rbaxs6mup6yzu7q2w7m6urGrtbm7tMK6sMCxvry7trzIucO2raqosLLAtri9sLGnsbO0u7yrrrWmrrauu7Kxqrmwrruuu7i7wMC+usO/xsPFwLzGwcfLuMXHxb/Hw8O6xMbCu8bJzMuzucK9u7OJc3d2a2lgYmxoWFhXW0FMS01KRUFDP0ZBOjk6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTQx83Bw8a/xMTDw8rCycq/wLzCurO1tcOuqrCSW2p/koeOj3t4fYmFenuEgXduXl1cXF1fYF9fZGNiY2RiYF9dWltaWl1aWllaXGVub2hmaGlrbnKBrbqwta6lpaenmqCkoJqcpauupKiiq6qsq7Cjpp+qrbS2sb25r7ewqK64tLO8uLS9r7i5trK8wbLArqWoo6uxsrOovaqrqKusrbWzpaiuoaSvqbKmqKiupai3rLGzt7q6u7K8vr6+xL+1wsHHyLe+wMS3xMO/u7/Ewr7EyMzKv7/DwMCph3N0c2ppXGFvY1dWWFBIWVJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8HLvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWqpaylnpyhpJSdpJqXkaGjqaOjn6Wmp6atoJ2cpKassrC2t6exraiqtKu0urG2tq62ubOwurqxt6WgpJ+msairqLmqpKanqKeyraCnpp+bpKasn5+no6Chsa2trLK0s7Swtby2u8HAsru+w8GxubnCs8G+wLW4vL2+vMLHxcPEv8DEoIN4cGxiZmBrb2BVWV9ITmdPVEdGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS2vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLw8a4t8fAzL+4ybe7xbizxLizv8CstbyyrKWvs62ho5FpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGFeXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21viJ2pn5aVmqGWm6KYlYyeoaKnnKCfpKWip56bo5ugq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+jorKlpqm4raKmpqCorauZoJ+emZ2fpZqao5ycnq+pq6iqq62tsLK4r7i5urC2vLu6q7OyubO9tLaxsba1v7a+wL7Dwru6vZeEenNrX2VeZGRYVFddSVdcS09HSkpHQTw/P0A7PzwwNTUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4t763ssK0sbu7rLm6saKeqaunmJ6PbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNp5yTlJSal5qhlpaQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqa+zp7qzpragop+co6Gto6Kqtqujo6aepaajlpmdl5mbnaCal52cnZytoauno6Omrauys6q1sLKrs7m0r6qvsrKzt7Ouqa2usrixura6vcC4s7GUhXl1Zl9mXltZVlNaVUtbUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxwrW2va20uMHMyMa/xbbBwMfOt8DEvbO5ubO/trG5u62ytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCbk5OPk5aWnpaYk5egnaGclqGhqaSfn6mdm5urp6+wq5yjpLiqoaCuqLaqp6etsaS4sKS3oKOcmZmqp6GarLmvoqGknKKgoJOUoZSWlpuYmJaXnJWfqZ6ppKKdo6qqsa2otKyqp62zsKWrrrOxsLCvr6eop7KusbSvvLS6uK6jlIF6dmVfYVZZWFNSU0tNXkxQTEdITEtFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmJjZmmBlZKUi5GTk5qYnJWWnJ+cn5agoKempKann52gpqCqr6afoqO3qKGhoqizoqWopbClsa6stZ6hnZaVqaGilK2xsZ+jo56emJuTi6GUkZOYmJOXmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqK6vr6uoqqqzpaarr7Sxrry2sa+voJJ6d3JlYVxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaast7u8wcW6sbm1xMnJwMPGxce2xcSzwb/Fq7e3vba9uru1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpaW1lZWVtXVVhXVFRWVVJUUlVgYF9gYV9hYWNkaYCSkoiPjZORkpyUlZakmaCXnaCloq2mpaWjpKOdqqulmp+lsaqgoZ6lq56oop+urKmprq2ioqKVl6KbnJCrqbCcn6Kfn5eYk4qekY2Sk5aQmJiTnKGjnaShopWgoqWmm6OrpaKkq6SrrqWusqmmpaamtKapqK2ztbS5urCqrJ6McnBvYFtXVlVSRlBOSFpcUFJJVEtTTEVHSkQ4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTU3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb3Dya2xuMG1vMC8tLWqrKaVmZubiIFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5RWV1cXV1eX19fYmRtjY+DkIWOkI2Zk5SSnJqinJuhqamrqKynqaakmaWvpZWapa+poJyZm6Ger5qcq7Sgpaafo6ShlJOblpaSqaqtmp2goaGblJCMmY6MkYySjZaVkJ2ioKSdnKOVm6CjoZeiqKOjqKugq6+krbemo6SirK2qqKuvs7eyvbWzq6+YhXRzaFtYWVNVUkVYTFFbWE1UTlBMUVJJTkpDPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7evqKevrpupqKy3tqu8yru2v6zLxsW4wc7PyLPEure7wsixrbi/t7y9u7O1pqmglpeYlod6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9hZX2LgIp9io+Jko2WkZeZoqCboKuqpq+sqLGlqZqgraGVlqWop52YkI+anq6XmairmZ+dlKWhn5KRkpGTlairpZqZmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6WmqKiooLGwprG9qJ+jrLSqrqewtbC5tcCxrrGrkX5yc2JWVFZOUkpHVlBSUkxMV01KTU9SR01LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NzYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtre8vcHDsbCxt620tLuztKKjnZ2Xl5SDgHZrZ2xucW5ya3BrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqf3l+dIeMhpCJl4mUlJibmJ6pm6Crpqasnqiaoaack4+fo5qXl4WEkpukkJWjnZaWloiim5uTi46KkJqlp5yVlZebkZKHlI6LgYyNgJCLkpKSoJqhopaUmJmVoqaZjZmkpqmmoaC0sqeyuKGcorasqa2ksrKmtby1q6yxo4l5c25dTlFRTE9ETk5OUEtGTk5KSk5OUUlNSkFITEhIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKWnpKqloKmmpLOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+tqbCepq66r62fmZqdlZSHe4NuX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5xdW+Dh4GHf5CDjoqUkZOdoY+anKOipJmll6KclY2ImZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4qYoKOekJOYloWOg5R+fnSKjXqQh5OQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssKyfmKW4pqaxobCunLC8qqmvqpmDd3NjVk1ST1BNQ1NOTFBNQlBRSElOUk1ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtqKKmkp2mtq2joI+VlpKQfXd+ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11qanFrfoR7c05Yco+Cl4aNnJeLlJGfmJ2VlJaVj5aKgJSJXztWb3yMlIqBjJKMkIaGc4qFl4F5gXuGk52Ug5WOkZCDhn2TeHFwhox9iYGRjZCXmpiTi5CKnYifmIeIlp6aoaCXp66praionpats6Kmrpmsq5iotKOpraOTf3NuX1tOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKapp6Opr6intMK5sLWwx8K3s73Pv7mvrrXCp6rFqqOdmIOUnLGimpiGlI+Lh31zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNT1JUVlhaYGxuZ3qBc1BCP3+VkpF9iJWMhIqNm46WlYqSiIaVh3mJf2BKUW54i5KEfoSNi4V/f25/f5R4dXZ4hI2acFGNiIqGfH54lHZod4aIfoqJlouOkZKWjISKiJWEm42ChJKalp6dlKSjqKmlpJ6bsKqhpKSRpqmWoqqcoqaoiXZtZl5bSFFRU01JVU1SSUxLT0lIRkpOTE1US1FQT0ZJQz03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hr6GnqKWnqK+sqrW8tri2s8G7tqi5yLi2qKi1tqqyvaaelY1/iZOolpWKfo6Dgn13cG9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3J1fWloXFSQiZSIdH6GgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI6OgXp+iquFeXtodnuOcHJteIGLjZJ4eoB7gHZzcpJ4Z3WEhISFfJWKiIqNioB/hIuNgJSEfICPmJSclpGfnamen6CdoKmlnp2YjaekkqCglp6fpIFzaGFdXEpXUFJHS1hST0pMTVJKSkpMUEhMUUxSVE1FSEI8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTI0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK8uLa6tLGft7qyqp2drKmosrChmpGNlICNnI6RfnaGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdoyWmI2OfGd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKBfH91ZnZ8hmxvZ3N8iYyHgGx5cX1xbXaPcWhxgX6OcEOLhYKDhX53d3qMhn2Me3V9jpKPmIuSmpujlpmcmp2eoZyWjYulmo6dl46WmJB4b21mY1pYWFVRSlNVVE9QTlBWS05LT09KUk9JTlBMRkQ8PDc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoaawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlp2lqaSgmJmPhZJ5iI6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybIinqsB+dHlie3hvfHmJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKYbmh4foJtaWRseYWQkoZrc2x8bnJ8hmlucH9zjYmEhnt+f3t2b3R0hoJ5gXlwfI6MipODlpeYmpCSlpeZl52WjIOJnpKLko2GkJaAb2pvbm9YVlhUUlFZT1JUVFJYVU1OSE1KTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrLCjraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGZmZGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+nh2GaaXN5ZX5vbX96i4l2goiGdGyaknRzfGpqnY9NeYWTiYSOZzF2hnNsfn2DdGZldX+EhIWAZmlsdWtxgHxocXF8bpONj3x0fn1xcG51bYJ/d3l1anmJgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFJaV1lZW01QVVZZWE5JSEVKSkhHQ0BHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWo6itnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+yoHF7eGx9bHGDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooV2cId8h3x0jK6NiYBoZ2JqbnJtcIJ1aW9YdXCOm5J3bH96fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gW11eW1lYYF9STltaWFdMSEpGSkc/Q0FCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp5+vlaW0qa6xrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPj82NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9ITE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8foWDf4x+daKZeX6GgYSZhJqcYYaqn52Lg5CNeneIfomJjnOLl4+Eel1kcXR6fHeKbWhqYnlvhZCCem6Bd3SEenB0eXhrbmlddoZ8h3yHh45/ipKXg42FjIZ9cYR/hH11d3t8iXdwc3RmZ2BbW15TW2deV1BUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnJ2fppGgqqCxqK/AsrvFupaOkZSHe4Z2a3+MkYJ9ioSPjHiDgHOghIp9fIF/cIB+emd2a1JXTEBFMjExMzY2Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqkiGrq+vi4GAk4uCi4KEkqmHgJiYipt0bXyBhod9jmhnaHl/boWHgoVxhIZHbIB3cnl2aG1rX3Z9goh/h4SLeZSdnImLiJF/enWLdnx4bW93foB0dHJsW15eW2NjWGdlW1RPUFZZUERMS0ZOSUNGQ0NAQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSl6CeraGmuK+zvbOXjZKLmIt9dHB+iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SKgZF8cYOen5Gcf3aGhYuQh5BpaHCEgXSNh4SKcYaCd4d/e3aFfW52dWZ/lI6GiYiHiIegq6KWiY6Xf3qCiHl5b2dreH57fnRsZV5bW15qXWFmYFpPS05XUlFJUEpETkdDSkRCQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDe4CMf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc5Oz0/QkRISU5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBJSUtLS05WX2N/Z2dtdZ2bj5qSk4uNjpqIk4+di6CgkqOqpaOsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOop+TmJKEioWPmZGWbHB1ioyCloyNjnePhHFthYGKlpGDhYhxiKCVhpKJjo+WpLWpm42UooOHk4N9f2tqanyBgYJ0Yl5kYFtna11sa15XS0dOUlFNTExGSVBDRE1GQUNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYWQh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpaKZoZeilJyeqJ6oq5+orKmqtperv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGIlaKbm3h6fpSYkqGTl5eBlJ57d5WSq7KIjZeffJSem46SlZijoqa2sJ2RmaiHlo+NgYhsc3N9gH1yaWBdYmBiaGRgZ2ZbUkVKS1BPSUlMRkZNQ0hMRkdEQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFCTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK2srKeotKuwtrKyrbuxs72cs8OrusnLt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKWIhZSkoaCroaSpj5uwi5Wjpre6m6CjsJKinaKekKOhq6+ssrWilKSqiJmJkomVenp9hX9oYWhcZWNeZGReZmdfWk9DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhjV2lvWHqFdoGThYeCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4WBjIWGh5KGgoSJhoiHh3BuYUBFNjQ8Mi8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdHRDw+PkZIQ0VBNzs8NUM7PUZLSUdIUk9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubWoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqyvtaKxq7G1u7e0rrSgp6ijp5qpr62yube4p5u2qIykjpGSn4Z4goN2WmJlV2ZiYmRgYGZgW1RJRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeFgY5/gYmOhoCGiIWKh5F6eG5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD9HS0ZGRDs+QDdENz9CSkpFRldUUF6PpK2jsbTDtrjBzMm2u8S9s7PAtrjBtb6vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupq2sp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwre6uL63ure5rKywprGqrb2wvLvCwqyZuqiTrY+Xl6qJfYJ9a1dkYllrZWpmV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpwfo6EgI2DbnpzeIdiuaGZo4mUlJaSlJONkJaSh4Z7hoGNlYqAhIGKenyKh4Z9ioOBioOVfXd6dWVPXGRHRUw7UWNhW15TRj87SFBFWmNRUllYWmdZVGBgTVNQRUE/SUtIRUVBQEM8RTZCPkhHSkxTWlRdk664tbq4yL+6vcnMu7zAu7e1u7q2vbS6scZgdbKksZqeq72qpairq6SisrWgq6eflZafmJ+upaempZ+jlKOnsbSnsrO9tsG+08nJ08fCxczCysPAvr2/u7y3tK+4t7bDucW9wsiwnrmpoauOpKe2iIGBc2BjYl5YYmBpZ1JYYFZRVUlFRU5LQD5HRD1KQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzM0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xyc3OH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLfoOAg3h7i4OHfIt5gYqCl350fXprZXB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktLSEZISEhHQUk5RD9IS1RUVlxaW5O5wLi9t8bAu7nKyrq2ubW4ubK3tbSutraZZHWonK1wXqKsnJigopuknqullJ+fkJSOlpiXp5+ln56amYOknaylqrCtuLC9udTRztbQyczSzM/Oysa/v8LKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5mAe21fYV1ZXmFaY2NQW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU0RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vl5KQlG5sb3V1h7OsoaCfi5mcmYyNlZGbkoWKin6Ih4uQi4h8gYRze4qDhXuJdIGJh5V/c3t5a211e2hyZWlsaWZqaWhgZmlpbFptc5atpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpHSk9fXmJmaWGXt8ewuLK7vbWxxMa1sLiwr7ursrGnq7erjbWnnZqnmk6anYyOn5aRppillYqTk4mQiZCRkZ2boZealZaHnpqnm6yvqLCntLTU1NTW0svP1NXN08/NxcLJ0L/KycrJ0cfMzcLQ0rivw7zEuaW2usOig3BlXl5eWWBXWWZaUV1XT1BCQkhFQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6lloyam5eLjZWRmo59iYuFjYqKipCHfISCcH+IgYZ7h3KDkYuPfXF4dWtxeH5xe254c2xogXBtY2ptcHhpd3x+y7/B36duY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmr7aqrLzAsKu0pqS4pquuoKu0o46xrZqXmIyRk5GEjpuBjaaRnImDi4SKiYSLg5SVl5eTnJGcmJmZn56rrKSnoqytz9LV0c3L0tPU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfPnnpwZl9jXVdgU11aUFFUUE9IPkBGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OW3WGhYp3bHdwfX5/oZ6eoYuMmJOTjIuTj5aEeYWQkI2LioeRh3+Ce3J+gIGHeoR1hZOQiH9vdnJrc3x8d3tzgXdxaoBzcmlwcXp5cnq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hdXWBkXmN4en6LgZipo6Shn6CopaqwuKqls6OhraGjraGnsZ+JppqTkpGJkY+IgZSJapSijJmEgIV+kYODk5ati5WNlZqOhpKRnpensKGgoaWkqMjOz8jCy9HU0dTTztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPDzIx0cGRhYFhUWVRcUEtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5WJj4qIjoePf3iDlJiKjYiIi4l+gnhze32Dh3d/eoeRloCDbndwbXV/dnh9dIV8eWyHdnRufXaEdXh8nbWMO0GKxaV+jHxpZVdJQ2ZjZWNnamRueFteZmhrbmlugIOIkYucnaCdkJeYnqOjprGjo7OfoaWdoKmgo7Gchp6SkpKQio6LhoOPhH6cm4yNgoSFepR+gqmVo4yRipeSi32XipqSq7OYmpyonKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7LzLR5d3BmXltTVlJbVkZHSklFRT06NzpAQEI6R0Q/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhYmCh3x4hZaWiI+Dh4WGeoR5cXp7hIZ1eoWOjZ15i3B8b296f3F7gXGDh4Bujnp1d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeoyHjpORm5WflYeMk5ugm56qn6CsnKGamJ+mnp+rmYuajJCRjYR9iIeDhYuOoJmTiIOHfm2ZeYSYhoiTjI2UjIZ8m4iUj66qlJWYn5mnrrW9qa2+x8vJyczL0MnD0srU19jX2NfV29fT2dvV0Nva0dbI1MuVe31qaVxbUFNUXkhDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1NDIzMjM2NDY1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEf4N8fISYjoeLfoaGgHeCeW97e4eCdHqSno2gdo51gnR1gX10gIRvgY+Bb5KFdHyAhHp2hnuIt8Wkwcm4gpabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5CDiY6WmZeWpZyXn5aekpKXo52Zq5WQkImNkYKMhYiIgYaQkZ6bmYmFjIGGl3qIiJ+Xj4iNiouCfaGJkIu8oZiTl5qcqaalrp+otr/AwLnHyc3Oxc3J0dbV1dnV19vU19na29fb2trYztzGh317aWtnYVRYVVVNTEROQzs9PTw4Ojw+OT1ANj0/QDw/Pjw5ODY3REE2NDU1PTgwNjY1NTQ3NzQ1NjEzODU1NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB+f3yEe36CkYmEhXqEh3p1fXRtfH2GfnN+kp2RnoORfIZ+eI59eIqKboKagHSZhn2BiIR7fZB6j6iOj8OhvYyco519iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmKkJKVj52ak5SQloyLlZ+clKCUkY2Nj4p+kI6Oi4SJkpaanp+JjJSSnZGCi3+lmYiEjYOGhIClh4uLuJidkZSWoqehnZ6do6+3urWswMXK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbuHp7em1rZ1hgXFNQT0lDTEI9PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PURSU1JYX1ZYZm1tbWmBj4pxc3mKe3p/fH97h3t8e4uHgX51g4V5cnpzbYB+hH53hZuhmp6UkoCMiH+Yh4Cbkm6HqIV6oIt8kY2CiISbfZqQioyjoqCQpK6gi5GLhYyBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIyGiIySk4yUlJSPi4+Jh5abnY+VlpCLkpOFgIuIko2Kip2WmaKjhpOdlqCKiYiNnJCDiI+Ag4iFpIaMkLOYnZKUl6GhnpmSnJ2osrmspr3Cx87Hxs/M0MzO19DR1K7W1dja2Nra19bZ2Z9xf3ZpaF9eWFRXWENASEM+Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1ifpKDb214i3h5f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9fpKmo5+lopaKnZCUl4uKqJdyirGNhKeShJmThJmMopWfmJOJmp6jkqmvn5CVkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNx5WOhoeJkJKNjZOUiYWKiYWWmZuPkJSThpSXhH+Pi5mIjZCql5ejo4iZn5aaiI6Hl5eKhI6NgX+IkKWJjZOpmpeTlpmhmZ+Zk52bo7O0pqO8wb7IxcXJyMnCytPNzdSp0tHW1tbY2tTT2s6Dc4FpZWBfX09KVVtCQUZDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfXxtfoh4en56gYGCfnZ2gIJ7bG6Lf3l8eHh8hIeLfoujs6ijq7KhlqegpaSWla6ig5C3lZKzmY2hoIukm6+ipJ2YkKeWqZmtr6SXlZWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcmIWIiY6VjYuTj4eBhoeIk5iUjIuTk4aUmIaDkZCcdJGZspaXpKGInJmTj4qQi5eaiYqWjoZ9jJmfipCQnJqZk5iYn5SgnZWfm6GyrqOlt760xcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmJXYlhQSEpPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj8/Nzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSmdhO0iEi3p7bYWGeXyEeICFgX1weH19fG9zjXp9gXt4houJhYSSqLutqLK9r6Wus7Ooo6KwrIqatZ6iuKWVrKSXqa23pqSjn5mpmKqkr7CpmpmclJWRmKCXmbu7rcmgaba4q7CVmJ+iq5KXvaNeqrKCiYqNlYeRfI+OfYOGjY+UlIiHkpaLj5WNi42XmZKdmrOWlauei5uUko2QkoyYm4qSnpCMiZWfoo2VjpianZObmJ6UoaCUnJylr6iipbO4q8LIxLW7vbvFyMjC0aHGyc3NxNbW0MvTonF8al5cVWBSUEZEPj1DQUI4Pzg3ND5GPDw2PDM1MzU1NDUzQjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj49NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVIYmBjcEpAi4p+gHKGh3yBiXWCioJ+bX19fH9wd4d3jYGHe42PjIaMmqvCwLC+xruytMG8tK2rs7aMqLKurr2qm7ukqK25t6umpqKho6Opr7Kxqp2cpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2wg4uMi5CDj4ORj3qBh5CNjpyIiI+XjYuVl5SQmpacp5qxmpGrnY6Zj5KOlZCQlpePkaCRiJWbpKyUlo+UnJ6UoJ6bmKChlJqeqKekoaOwsqbBxsOwsLu2xcTDvs2nx8PHw7zV0M3Eyol1dGReXGFcT0tCTEBFRj5BP0I7OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxnR2BpZ1pdW5OMjIh7h4uGg4x1hpCKgW5+fIJ/cX6BepV6kpSUmJGTlae0xsnAwszBw7nIvLqvq7m7l7K2urPArqXApKqwu7uqrquiop6nq661sKqboKqcopyVnrC0p4uiurq1wburqJyypKSolISOqcPEpIKLjoeIhIaVlI16g4yRj5GhjIyUkY+JmKCXkpmUl6agrp2MqpyOlY+SkZWVjpCVkY+hlIaXn6CznpSblKChmaSfmqCcoJSYnqakpqekr62lv8TCrqm3tcnDvrbOssW+w7yz0crIwbV2em5eWl1sVE5JQ0xKSklAQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZaJi4iSj4aJeYaTkIFygHyNfneHgYKQeo2hlqiampi6vsjIysLSycrCzbzBs627vqe6v768w7eswamss7u9qrCppKWjq660rra1oJ+un6aimKO0vambqLzAo7a2r6uSr6yqq5aGmqmmpZGCjJOllYmAdYqSeYWNkZCen5OOlIuPjZSjmZeblJSjnqmfkaWajI+Pj5WWiH2PlZKSo5qVoKKctaaRn5elpKOlnp6mmJ6Vl5ulo6moorKsqLvAxK+ls7fMwLmuw7O7vsG4rcLCwcCZcHtjWlhdXE1MTUlHRENIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGVWno+djpeOnpKJin+Jn5KEeIV/lX5/kIiKkICVoJmup6OYwr3IxMjG083Ozcu8wrewury0vMq8w8G2truts7+5vK2vqKCpp7atrqmyt5qeraKooZ2rt7ippa++xLG9ubOnqbOzra6WlaWsp6CRjpKxxaeVjXyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQl5eSlqWaZpijn7OllqOWrK2rp5ufp5iZlpmVoaSopp62q6m6vMO1pbS2y8G4qrass7q4rqi4ur24g25wXFpWV09HS1NNSz9BSEVER0ZHODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqaUnJahl6mWjJCDh6WSiIGHgpyEg5WQkZSOmqKfr76uoce9xcTHx87OztLKvru2sbq7vL7OtsS9t7i3srK1s7iyq6acq6u4qqmnr7CXo66kp6SltMCwqqyzvsK5wLmzp7izt7OulaWtrq6ki5OVoY1zwZl9lpmEjpaai7GVmpmVkpOZmqajlaCblpqonJuhoJmLjI+WnWBKlpyalJqll1SWsJ+vnJ+llK+vraWaoaaUk5mZjp2gp6KZtKmqs728u6uwssfAuKarq62xsaOhsrK0pHJwZ15cUFJNRVBQUFE7SEtJRkhBQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1SRVdSc2JXRkirl5mfoamvmJCXh4unlo6IkoWfiIScl4+eoJujpbXJtKnGu8PEyMrIx8zOx766s6+5uMDBzbXIusC5tbqxr6+ytKejm6q0tKqppq6smaSupaWprbq/qKu2tr7Bv764s7LCr7e9q6OutKy4pYibl6abdr6ghJicjpOZmouvlqGcm5eVm6ChqZ6ooJmaqpmhp56XkI2RnYNudpOimpWdop+QrrKjq5WpqpirrqWkn6WpkpKZm4iUnKKelrCnqau6t76zsq6+ubafo6eopaecnKypqY1laGNgU0xNR0hOSlZMPU1ETUlKQUNEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1WSH9lXkhGrJScoZ+7r5iUnouTqpuRkpOJq42Hop6MpKyUo6O2x720wbrCw8jJxcLOyMG9ubKvubTAwsq2xrHAvLW6q6itrK+jopiqtLqmqaasqp2or6ekq6u+u6isvLO3vca8trW4wLC9v7OptLarvqSPopeRop+8n4mZoJmWnp2Pt5+pnKWjm5yimqils6GbnaWcqKqemZWPlJqLl4mNpKKUnKKfoLWvpaWTsauarKyfnqSjqZKVlaCDkJ6fnJWppaKhtLW6ta2otbKznpyippqXlZmqoZ53Yl5gXktJR0hNUUlNRUZGQlJKSEFER0FWU0RIPEFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6ew62bl6WXmamclpqaj6qWlaimla2smaGqtsTBvL+4wcPByMS+zca7vrmysLizv8PItb+vvLe5t6ekqqusoKCaqqrEoqWorKaerK+soqqovrimrL2wt7bHtrS5uL6wvsG2tLK0r76jlqOWk5uUrZ+QoaKlo6OfkL6lqZ2prJ2doZumn72imKSeoqmroZ2WjZWek5+Hj4WNk56koJ21rKWclrKnmbCon5qqnqCNmZWfhY6hmpuSpaSamKyxtrGqpamtrJyZoKGSjpCVqZ+UaWRaYV1QSklLT01IRUNJQD1PSEA7R0lIW1JPSz1ITlU0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE2imqObnsWsoZ+snZ2tn5KjnpakoKeqrJe2sKOqs7bFwr3AtsDCvMnCvsrItri1tLCztLfBxra+sLi0uragp62qq52en6WkwaWgqq6gpKmtr6Kmp721pbG7t7a1w7Kzt7q+scPAuLits7S1opyklZGToK2gmKGdqairoprDramerK6bm56ZpqC9oZ2kmKurq6ahmY2an5KeiY5Xf5WepqGguKqnk5i2o5+zoqCbr5efj5mUnYKPoJeWjaKklZCmrrOrqaKipaWVlZ2Zi4+Rk6SfiWNlW2RgTElLS09GRUFGSz49SkE5OUpKTl1RUUo9TFdcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXExPnp+hmJ7Ep6Wis6GcsqeTqqSfo5+tqaydu7CorLWyyMPBw7PCxL7HxL3Eyr2wsLausLWvv8W1ubCwuratmqmwqamanqahp8Ktm6yxnKqirrCppKe9t6a2ur2vt8Sts7PCv7HGs7q3q7S2raqipZWVlKOroZ+fmairsK6uu7KmoKmpmZmXk6KkuKGhpJKur6ykpp+SoZ6Vno+RjZSdmqOfp7Snp4yYtJyjsJqem66Rn5SXlJqAkqKWj46goZOLpqywpaeinKCekpKblIWLko2cnoBjZltoZktJTUtTQkNASUc7O0Y/OTlOTVVeUlNKPk9eXj1IUEJNTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ufwqijqrGho7SplrKrpqKksqyuqbuyrbC0tMa/xMS1wMW+ysS1wMjCtau1qLC4rMDEtLeurLa6pZmrsaupmJ+ml627tZuosJutn660sqequrOnurK3srjAqreywry0xae+rq23tamnrKGXlpGlpKKil5ikr7itsrW2oJ+opJmUlZOjn7ejpKWVrrGypamlop6ampqVmKifn5iinq6yoqaNl66ZpayXmp6lkZuOlJiahZaflIyQnJ6Ui6mpq6KnoZmeloyPmZCBhpaJlJ95ZGldbGpOUE5OVD1CQU5DOzpJQDc3UU9dXlJWUUFXYFxCSlNIV0tIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcGlWQ1dGjHlmQzuko5yhpb+mqK+voam1qp25r6ukqrS3sbC5trC3uLjFvcPHvbzEwsfBucHGwbqqtqWtu63Bw7e3qq2yvKOVrbCtsZalqJGquaqgp7Cdqp+vtLOqqba2rLursrK5t6y5sMG5vb6mw6uwt66oqqumnZiYqqGhoJGXoLCus6uwuZqbqZ+ZlpKXpqC2qaWioq+xs6uxp6ufm6Cgm56lnKGXnaOzsJufkJSmmqGpm5Win5aYipWYk5aXnZOJkJuZlI6pqaegpJuYm5OHjpmLfo2Who6ba2ltYW1uWFFRWlRBQ0VVQDs6SUE3OlhQZF5QV1dEWV5eTUxST19LSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lgRihAOGx9aFxWOol7Y0M9qJ+coam9oaqwqqOxuKmltbKroa21va+zuLy6vbe2wcO/ycS5xcPBwLjFvcG4r7anq7eyvL++tamusrifl6ytqK2Xp6mOp7ufpa2znquisbCzrKq2s7W8ra+xtaywtbHAucS2q7yvsbisrKmisaWepKifpJeQmJ+yqrOpqrOZnaebmZSNoKWktK6noqysrrGnsqyyqaObn6eknZWhmJuotamXmZGSn5mfoZ6QrJ+YmIaVmIudmp2Tio2Wl5qXp6ajoJ2WlZaUgY+VhXuPkoSMlmZsc2hwcl9HWWZWRENOWERaOUhCNj5dUmhcTlldR1teXU5NUlhkSkpDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFWMTUxPWBWXjgpQzNZVVxnSzWMemZMQKSaoKSst6OsqaWurraqrrS5pqewuMW3sbe+wcK1tLvFvszFucPBur+6xLjBubO1rKq6t7u6vrWqrbG2mJioq6qrm6yrj6u9nquusaOqn7Gts66utrK5tqmtrrGntbCzurzJsqq1tLG0r66mobOfmqisoKWVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxq6q1pK6wta+jmJ2tp5qXnpmZrLiimJOQj5icoZmXlKyfnZSBk5mNnpyalpCKlJKemqWjoqCZlpKSlnuLkIV7jIqDi5JrbnludXxhRmBqWklIWls9e0pHRTZBYlRpWk1cYUpbXVpSUlNiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkEvSkdQW0czY1lUS0SZl5+vqLGprKWjrq61qba0t6OstLfJurS7ur++tbS3w8HNx7zEvbe+v8C3v72yva6nurq3t8K3rK2xuZWXpq6rp6OyqpSvuqStsrGnp6Kxs7GysbWxuLKorquyp7ivtbPDxbaptLWrsK2pp6K2n56msaCklJuZlLGdp5ufqY2pop2blZelpaS3p6Kws6unsaetsLWspJmhrKibnJ2blKq4nJWOjouZnaKYkJenop+Wg5KWkJ2cmJeWiJePl5qnnaSgkpaRkJZ2hJCHe4WChIyMbnF4dnx/XUtlbFxKT2RcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1QT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JrS0RDkZikraStraumo7Cys6q2sLafq7W5ybmuwbvDt7OytcLDz8TAwb20vcC/ur+9s8Soqrmxtre/va+rs7OdoKewraWmsKWesrWsq7KwrKmotLmstLO1rLSsqauorKm5rbGwx764pLmvqa2tpqitsKWjo66jqZydm5qvmaKjoqOQrJ+joJ+hqaWluKSrtLSkqquorK62r6Kdo6iqm6CZmpKktJqPiY2HkaOglo6UnqCVk4WOlJOdm5mWlIeYkpWZp5ygn42SkY6Rd36OhXx8fYeKiXF0c359flxSZG5eTlpnXUZElltHOk5tWGFbTWBiTlZXVldUWWdeUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NlOzYqSGRISis6ST8zQ0lTLD6Paz5ISY+aqaqhqLCkqKOztLG0tbGxoaytvcu6rsG7xrG0rbTCw9HExr7Asr7Cwry/uLzFqK23rLO4vMGwq7KtoaSnramopLCjq7Gqr6uxrq6tq7O7p7exsqmyqaqmpaOtuqypscK5tKy5qKioramnsaWppKKuqqiinpuirJWknZeemKudoaeooaylo62st7GxoKmin6qtsKydnqanqZmjmJiPoKeYhoOOioufoZCMjZedkJCGiJGVoJ2VmJWGlpOTl6WcnZyLkZCNin9/h4V8d3+HhYd1c3KJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9kXE5VVlVXUFxhX1NPTmhYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlFxATUaVlqynoaqynKmosLWsuLSuqqSrq73Ju7G+t8OvsK2zxMTOzsO/v7TAw8S6wLTJxKyvt66yusC/s66uq6WoqrCppqiypbStqrCurbGvs6yzuqS4tKysrqeroKKesLerqq26tqS1taSpp6ysqqyhqKamsbKkpqWhoauWqaCTmqCmnqOiqqSsop6msbesrKKlopqpqq2pnKGlpKOYoJqVj5idlIGCkIiFnaCNio6Nmo+Ri4SNmKSckpGbjJORkZSjmpuai46Li3yHgYKCe3WAhIF+dXeLo4d5a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWFVS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZBSUhElpGvpKKqsJeqqK21q7awq6Srqqm8wcC4ubO8taayr8TJy9G/wbu5wMDCucG6wsSusbWytLzBvrOyrq2rrKi2qqWtsKq5r6iwsK6xq7WqtrWmtLarrKSpqpyjnbOzqKiktLSgtq6hqairqKunoKqrqLm2qaqpqaGpn62bkaihnaCjoqaiqZ2cprSup6WpoqOXpaanqpyio6OfmZifkY6PmY5+h42HhZ6eiISKi4+OkY2EhpWimo6NmpGSkY6Tn5eYlo2Kg390h4F/f3h1g397eH6AiJ2PcHJnZ3F4XGF0iGlPXZhWSG15VWRWUmNPTFVUVVFPWFpiVkhQalRXU0dQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JFO5WNr5+lqq2Zq6StrrO0rqqlr6mpu767wbGvuK2ita/Jx8jRwL+9urzDvbrDwcC/r7Kzsra9vMGysrOrs6mltamkrbOzua+irbWxr7G5qriuqq62q6qeqqugo6G2rqihnq+yobSqnqinqqOqoaGsrai9r6yurKGnp5+rmI+vopiioKinn6ebmamwqKKfrKGgkqGio6aYmqilmJiYnY+Kh5WIfY2GhIWkl4aCgoyHj46RhYWVoJeJkp2Rk5CNkZ2Vl4+KhYZ4c4F/fXV4eoB7dHR7aoKHo3VpXmVsgXVniIt8UldwXkt4c1RkU1FfTU1TWmdOTFZZZVhHU2pSUj5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWk6MzhfPWFkP0YxQ1BbWytITztYQjSPjrCfpKWqo6WjrKa0s7CppLCnqri+wbywqLmqp66wycfI0MK9wL65vr68ybzCubGwtbK6vLnAs7S7rbmso7Wnp6yytrmypqe6ta20vK+8pa2ttautnKmvpJ+lrKqnnJ2qsqSzqJqqp6qkqZ6iqKipvau0r62eqaOgrpuasqKVpJukpZ+kmpmoqqWemqmhm5GaoKSdmJapqZGZmZOQioKPhX2PgoCIno+HgH6Mh5GPkIWAlJuUhpOijJSRi5GbkpWHiX6Acnp5fnxod3x6dXBxfmmGeYSIZGBoZHKFe21neV1eVkNYe21UYVBSWEtLTXB0XUhaW2dZRVZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpOwmZ+fqaWjoaqktrKxpKmxpq25wb21sKO5raiosMPJyczBt73Atbe/usi2w7W0s7Wyvbm6vbatuba/raKzp6qrr7W3tKqduruosb+yuaCvtLaprJ6tsaOcpaipop2cpLCmr6Cfq6mnoamco6igrbunrrGuoaqio62enqyll5+boKKcn5uZoqqimpmjo5WWk5+hlpuWpqyLnpGQkYyCi4B/j4F7mpSNiX1+jIeQj4yKhZKYkYeUpIqSkoeQmpCTgYh8eWx9dnl4Ynt6cnBwc3hqgnRqgmdjaGFuc45tYmpwYG9CXXlrVl5OUFFKSUxTWVZNXF5tV0RYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUV09I5KXq5ifl6ejoZ+no7evraKvr6mruMK6s62fua+rqLS6x8rHv7fCvq+0vrfEtsOysLqys8C1u764qbm4vauktaeoqrCtubCpmbm8o66/tLShrre1p6ansLOgn6Wmp6ClmZ6sqKmeoKqup6Cml6Kon7C4n6SxrqCsoaykm6amqJqam56jlZ2cmp2pppaanqiRl5KYnZOZlaGqkJqJjZCHfYh/go58fKGMjYl5g42Fio2NhYiTmo6JlZ+JkZWCjJeNkH2Ee3NwfHFzdGB5eGpvcHFwan9zY3psaGZkYWWHgGBbcmpxTU6AaVhaTVBMSkdQUlFITVtfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MFxbNSiWm6WYnJWsn5+hpKG3qrCjtLSpqbnFtrKuoLesra2wtsXHwLe/wrmwtby3v7u/r6y+sLO/sb3Duam7urinqLaop6uwrLOwppm8tqSrurWun7G4r6mlp6+ym6GkoKOkoZabr6ahn6Oor6GgopOjpKK2sKGmsaufrKKul5uqpKiel5qdpJOam5qdpamZm5uklJSXlJyOk5eiqaGQiYqPhXqEfoSKeo+Xio2HeoKIhImMjoWOk5iMjpaZio+Wf4aXi496gHpwcXZucHRfeHdlbWxsa2mEbmZyaWtmaV1jdIFgW2t2aVpKf15bWE9PS0hIUlVGMjldXm1QRFhWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJjViwylaKhl5SbqZykoaKht6muoLq4pay9xbOwrqO1r62tr7TDw7yzv7q3sLO5uLq4uq+uwLO0ubC/wbisvbq1paKzqqepsqutsaGawLWkp7W1qJ6yvKmopamvrJmjp5ykpZSXobKlmZ+kqKmcoqCTpJ+juKikp66mnaWhqJKfqKGhoJianKCSmpuWn6Gqm5qYoJSQk5aZjZSSo6ikkImJj4Z5hHuEhn2djomKh3qBhIeJiZGFlZOTjJCVlI2OlHuCl46Ld357bHRxbGxzYXd0aGhqZ2dvhWdoaGNmaWpgamNpZ1tle2NgU3RUXFtTTEpHSU9TQCEqaF5qTENWVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z08nMp6io5GOo6abnp6do7Wsp6q6t6esxMG2sKyjta6nrq+3wL+8ssG2sK6ytra4tratqr2zrrKxvb+4rry7saWftqulpbSpqq6encGrqKWvsqmstbueqamrsaWYnqmdp6SRmKatopiepKmhm6Gclp+dp7alr6quoaGdnaGUoKafoaCZm5mckZmdlKWdq6GXlpyUkoyVl4uPmJqpoJGIiYuIeYV3goKCnYiLgol9f4WIhoaRhJaVkI6QkZGRjJJ7g5WNhnN9fWZ4b2tqa2d1c2tjZ2RkdoBiZWZmZWpqZGtyWl9ZXW1kYU5pWFtgVkpHSUtNUlg+OV9saUhCVFNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao5+Qi6yhmJiflqSzsaKxvbahsca8urGxpLesqq6puby7u67Asq6urrausrizqKu5sa+us7a6trC4va2mnrWroKCwpKqunKLAoLGkrrCut661nq2vra2imp2nqaWelZqnpZ+ZpKKonZqfm5ScnayvpbqorqKhmpqdmZ6jmqSdl56Ym5SZoJKolamnmpOampGLlJmNlJSZqaeOjYqJj3yCc4GBipiFh3yJiYWFioyKkoSUnJORj5CQlo6Qf4CMjYJwgH5meW1oa2lncXJrXGhjY3OBYWZoam5sZ2pqaG5dbGx0cGFVY2lkZVpJRkxNT1hRUVZhZYFVQFZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGajY+wnZqToZmosq+fuL+2oLTCu725saa2sKiupbe4t7etu6+sqqu2qrO4raWztbKuqbC3trGztbqnqZ+1qJ2eqKKprZqnvpito66vtLWtrJ+xrbCpopyco6uom5ScpqOdmqmipJaan5yQm6Orqqm7n6ekoJiZmZ2hj2uhlpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB4hpSMg25qfnaDcWyGi4Z9hIyHcF5jYWeEmIZsi4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dyhGdfZGZubWpeX2GKj4OEZU5LRDlGVGdeSkdQUFRVS0hSYG90ZUZaUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYaUsJuck6Cbqq2qo73Fr6m4wri9vK2ntrClq6S3s7KzsbmtqaastKavtaKouLa2qKest7OutK2zoqmfs6qeoaScpqaYq7qVpqWvsratrqSprquspaGfnaCnp5uXoKWlm5unp52Tn5+YkJ6nqqO1r6Ojo5yWl5eXo4ihjpKah6GHk5ygf6R/paqekpGakYiEcniNjoWIoXaIjGmXiGZ9cnihb4iHhH6OfX+hoKCZgHyHnnSHjnabimyHgYNsaGVjemtxYVOFbWNsaZhxWWpxb4dYXmlba2tbiHFuenKFZ4aEWl5HTj9HX01GUlZWUVFSV1RnXk1XSVJTT0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiLppaDnKudmZidn6qqp6q/w6+xur23wL+qpbewqa2ms7Sur7O3q6mlsa2ltLOcrbW2tKanqLOxrbKorp6roLKooKOimqChmq2zlKOlpbW8p6ynq6qsqKWhoJigpqOZmaWjpJibo6mWlKOclJOkpaaht6OjoKSYlJOXk5uIro+YlImpi5ehm4WxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5oem5yj9h+U2pitrJ/gXKVdJqhqpBXT1diUFZORlRbWFFQUoxcV1xQQFxEUU5ER0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaSgKeqn5ecnaWtsqixwr2ytcC1t77Cq6azraypp66zqa+2tKenprSlp7iunLOytqqlpKeyrq6xpqqep6Sxo6Kfnpeanpyuq5Sdop+zuqOqqaKtrqWhnZqaoaefl5unoJ+YnaankZynmpOdoaaioLCin5+jlpWSmJKZha9qaoqNqn5ng5WGrWRwnZ2UmaWUca6hpH54u31roY92sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5nfKSngllfi6tpgJZ4eWqnN0qvXFhTbGRbS05XX1xXVjtOiU9YVy9JVFRJQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsp6Weo6SqsrestL2+sLbEsre6wqapsKuuqKmwrqOwuq+jpK6yo6m4qJ6zsrCjpaCqra+sr6ann6OisJuim5eVlpqarKWWm6Ges7Oiq5yira2gnZmXoKGonJmdo5+cmaClpI+dopqXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl2hrObt36TlpaolH5rgaZ7goaIkpSSd6tna7Fbq3uPh5R0iXGPhoB/iJCXeIKCi5iMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5WFhBI01oRUJFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WHs6amoa6pp7Ksqbu2wrC7wq24t8CqrK2trqatsamhr7yqoae0raOrtaSms7Ono6Kdp6qyqLCnpZ6fn6+Wn5iUlZWXnayhmZmkqLSvoqmPqaiqm52VmKClp5qfnKKfm6CjpKOVm5+XmZ2iqZulmZycoqCXk5GTkpyD1ZOZuXCwwn7FhnzWlJu7fJqVpI+NnI2ke46HpIKlgnqseY+dVq96iH6farlauXaHhH2mgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKljdHKIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObU1bUk9ZZlpDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KTmLGoqKWzqqW0qaS8t8GwucCxtbS7s7WnsbCjsLKmn662qJqnua6jr7Ggs7SwoKSen6epsKm0qKSbnZ6rl5iXlpeVlaCqnJmWp62wqaOej6yiqJadl5yhpaGYoqGhoZqhoqebnqGelJmbpqCcp5Wbm5+hmY+RlJGciLJuaLVxq4dujqZytHNytnual6SLj52No3+RoaV+sHaDkdLRdlyue4V/pG+bqqZrh4V9rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa2BsaFBVR0k4PVZRWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWvraSqvK2mtaWntru8srq/t7W0urqzpbS0obGxop+ssKSXprqupLGwnLS4qp+mnaGppLKorKmkmZuaqJ6VlJiZkpKip5+WkqWqsKailpOtn6WSlKCbpKaflJqlpqGaop+tmqCenZCVm6GenKWVnZaZop+VmJWRmoWse3eodqOOiIapb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9eIV+j56GmZl3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV93d4domIhrXa93lZ6PeGw1eciusl9CU29eZ2BFUG1fcG1WVU0uZWNoUlhRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnZSfuLCXtMGtqLOoqbK6t7O4v7m3srW8taS3s5+0rJ+fqKyflKe1q6ixsauttKSbqaCgqKG2p6apopmdlaWhk5KbmJKUoqWakpCmrK+moJWZqZ+ijpGimailoJWapaidnKSerJ2hnaCNlJ6anaGYmZyWl6Ggk5iQpp6GqX19pXihj46DqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aIdKiCjpuNkqN8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJmTVthX3JzX0pWNkqbk1hIRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84oZ2Zmb+rl7TCrqytqaa0sLextb+5ubKwt7upurSfsKSepaennpOqsKmvqrWsqq+hmKGgpqWkuqKjq6CWm5GioJSTnpqUl56fj42LqK+vpp2Wm6imn4ySpJeoq6eUl6mnnp6go62koZ6hjZWhmJ+gkp2XnJWdoZWWjqubj65tcrRyqYx2iqZztHhzs4CRpKOSnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytX02hfIeRUnOjbXp/fm+Yh3Fcr1Y8nHdlVG9uLlynT2NSa2VibVpjXWBwe2NTWlE+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam527oZyywK6uq6unt6m4r7XAtbywr7m4q8G2qamgm6ajop2RqqqotqOyp6+qoJecp6Ckq7ido62blpmPpaKVjJ2hm5icn5GTlKu1sKeZlJysqpeMk6WZpa2ikZaqsaSfnqarsJiho5CZopafm5acl6GSnKmclJCqmYfUkpq7c7DDgMOGftWWm7h4iJCYjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2VgaypcXt/dbyIp6BpnWGmjq+hfox0h6p9vm5zvHSyg3V4gYpumohxbo2kdL1ed31bYXm8a1pWW2p6XmphZWdibXhvWVtZQ0FAckBDRys1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56hvKKXscOwraqqrLGnuK+2xLG6sa66r67Asaukop6jopybkKmkqrKktaatpZ+WmaqZpqy4nKKumJSgkKWfkoyco56XnZuRlZKvubKslZejp6eTkJaknKSsnpGgqKufm5+oo7Oeo6WOp6GUopqcmJWjmI+woJKUqZ6FkJm1gJCRjLeVeIKTmrV3bWtuc295j4SOiXSewbu9mnuBsqhwgHSRuYN8hoaMho17ioeNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF6Aen2KaIN5bXlji6xwdYV/WlunakVlWlRmYGNdY1FnZ3BsdUJNUExEOlpNP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlYnPjs8p56gob+llrTCtKyqqKyrqbuusMWutLKut6e0uK2poqGlnqCdmZOrpK2qprWop5+blqCjnaukvaagqpeUnJChmpGPoqihk52Yk5eUsrW3rZido6OiipKSppulqpuWqaSlnJqhqKamo6mhka2elqOel5eXnZ6PsKiUm6ehjmp+aZymeIdyfZqOdHpkh3u9vsC6b5KCcZWHYXNqWl6bimFjiI6Va2CAlWRtnXdilWuAmpWUZV5hY3GaimlyjH2FlWdqfnJ0eH19Ylt3dIFoUFxuhH18i2tYbHqCc0pKb4ZwTXVNRVddZ2FMWldnY19PW211anFST0RFTjtISD1MPzItMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPVtPJz8yPqigqKHCo5q0ubajrKWup6i1sqvIq7Czq7SjvrGypqCiqJ2jm5mZrKavpKS1qaWbl5WhmqatqL2nqKaVk5uVn5mSl6SpqJCdkY+YnLCyv6ybp52moYiTkamaqKOam6yfo5mao6esop+ropqxm5WnoJeVnZ+dl7Gkl6GomZyRnZyipJimopqcmpqZj5WBZ219cXeSl5SRhYu1qo2GmJWOioyYl4eUlYqEkpSRiY6SlJiUmJeaoKKanJShno2CeqSGbGp8kHyAdImKgXGCeHl2douAfIprc4F0g3Vldn13a3B7bWBjXXBoTVhaZmpgV1pveW1tZlNPRlM5T1lNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOhv6GksbK3oKmlsqelsLWqyKussKW1psCntKCdpKSco5WVoKqnrKOjtqufmZaVn5atqaXAnquklZKcl52XkpOin56ip5ORmainssSvmqucqp6QlpaonaqbnKCsmKGbnKKkr6ahpaifrpiXp52ZmqCenpyvoJyhppWYkpiToKGVo56XoI6Wk4qKjY6WrY98lZuCkoKLqqiGgZmXioSPn4h7hJCHhpqSiIaKlY+bl42RmJ6klpqTkZ6Nf45mobOvhYqEdnqQinx2eXpvZnqRgYCJa3WBeYhzaXN/enWDh4JrdGR5ZmBpZWNkZmtZbHtwaWpcU0xQRF9URUA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r7+sq66ysaCqprGtoqyzsMSwqqujs668o7Sbn6aioZyZl6elqaakpbK0npWUnZmZsKatvqCropCRnZqZlJGUopyXqJyEnqqrorPIs5+qpKqWlpeap52omp+kq5Oenp2gqa+ppaOroq6bn6ChmKSenJ+dr6OYnqiTmJeckaSZmKidmpdlgpJ8ZX6NmY9jeY1saGt7kqSqamWamH5nhoplZWloe46hj2tojZeRo3draouZo56Zc2xue4SNh3pYZV6Ggl5si4mAdlxoc3d3koCHgm54gniAc215hHR3iYiOg3tphllea3RkXXOJaWt9cWtjXlJOV0pkWEFKND1GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsKqlqK2tsKetrbC8samnpK2vsJ+tl6CjnaKZmaarnK2jpaipsq2elaOQoq+mtrmlrqOOjpqhmZOSmqCZmaWVe6WtoqizxLikoqevnp2UnqKeo5yjqamSnqGdoKqwqqukqqCqm6efqKCslqGbpbCkl5uqlaGem5Kll56qmJ5+vYOHcrRyhJ2FrWh4ucS4cZOio3qmmZlzqoJ8y8DAu3GMooiCn32WmImdwL2Cl52djZ3CwXyCfJKNmsPAfWulsm+MgW/Ken+bd5KDjoF2eoGAeXF6f4dxeIWNk3ltd5RjZl95ZGBlgmNedGhsZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JRLyNGWzNQWS9VQUI7LziWo7nDtLCwwKmolKOvqbCuraaztK+ppaamsaufq5iaop+cmqqnop2so6WopKS0pJ2ik6atq7ezp66ikZGZnaWSkJ+hmJufnYenrKSrrcDAsaCpr6mXkZ6doZmio6qjk6ChnZ6trqmsp6Ojp6GmpZ2tqZKkmqitqZucqZysoZaWpZWhopecf86UeHqkgXmUlptfro9ejqeBoqB9p5acdKuDgK9eY42qe6eHhaB0l5OIs2OCq4ahjY2zaoWvdH2XiLhhg61Zo81tkHV72nt/mXB+iJJ2fmV7iHZ2a3yIb36FkZJ+bYKPYHJscGdgX3lkXHFoamNmYFJUUlddS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGkqqittKulsqysq6SrprCqoKebmaWXnKKvn6CfqKejpaGfsKyanZWnrq2xq6isoJSSm5+kko+epZidp6OerqSrsKnAx7OoqbGulpKdm6GXn6mqn5Sgn52drrCnq6mcp6ikoquTrLOXpaKqqZ2jpqWhsKCSmaaZoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xzrX6rh4afdpiSe3yXfqqIooyRjJ1+q3uJlI+fgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+Ki5KQg22SkGZwdXVwYGdtZV9vaWluZ2NXU1xhWVJTQzhJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytKCco46jo6Ksr7avqLGmqKqnraurp6KjnZmilaClqp+hpaCoqKKfnbCsl5qWqKevrKimqZ6XlJqjoZGToK2bnaajr6yjrLWqus6yraatrJaVnJ2imJ6urJ2WoJmen6qyqaqqm6yrpKOsm6+xoqirrqWYpqqpqbGikpajpJqUkoWkaqR1iXqpdHqycIKmipmMcYigmoekYGFSq4R/roObdq2BpoaGn3qZl4Z7ZoCjiaSZhoKkfal/gpWHrl59qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojYyYj4FtmpRwbnl4eG9sZmVlcXBmfGliXVdgaVhYVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwr6mtoqemqqurqaSmoJuknp2mp6ajnKuaoqyhpJ+vopybk6qktbCvoKmbnZaUpqKQmqKooKClnLCmpKiyrbfJsrWqq6mVkZ2copifpbOdmqCUnZ+nrKykrpqtq6OjqqKzrqKqs7Ghmqmorq+2opKWoqeYm5F8qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfYJSpg6OIh6B6mJaaeKrJdJmklaiqkZOajICbipnGxnhmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI+QnpJ8cZeTgHF7dX57bltmanJwZYFqX2FYZG1cXllJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqbOtrKWinLK5rKqhppqopaqrqqegpqWYqqOfr6udpqCsmp6ppZ2ntZ+il5OpqrayrJylm5+Uj6WskZmbp6OgqaauoaSnqrC1wrKzqq2ok4mXnaSaoaOuppihlZmcpqasm7Cdrqmnnqykt6ygsbmvnZuup7Kzs6SUl6eimZ+Ogp1OeJqBf596g6N9g6SEhqaenJ6ThLh7fHm5gn7MxsK2eJuhkIuffpqWl4p2npiKpZikqX+whZ2Fn4SsfZqUYqVspHCPhZCBfZaCcqxgo3NxgJpgvH1SVXWPkqSXe36Tkot1e3OFf3FcbW54cmqBb1tkX2huYmRdS0xRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq+gm6Gss7Oln6CVpa6trqqnnaammqOnobOuoqmmsqCZqaSUorWiopWXoqm1uaObopyhko+hsZiem6eloaKvrp2kqKK2ssSxramtqZGHkJynnKKknKWXnpiZmqakqZqvoa+lppivpbytoba3rZ2dtbK4sLOml52voKOdhY/RtcO3eYeOhZGTkIGmeJShd4ygkYSlgYpxqoaEtG5yapmjnJWKnnyYmYaHj3OvgqWboo6mi5OdipWQmm1wslylc5N6nGyZf3uZfG2pYaNxcX+fYnOyuGh4kJSmmH2MjZSNeH15j4JtaXhpeXJugHVdZWRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/vLq0npanpa21oaKZlaOop66rrJmmop+moKC1p6Kpp7CjlKyjjqSto52QmpqqtLSknaSbp5GUl62fn52npJ2nnLWaoaqktqvDsKmrqaGMhI6coaCmo5WampyYm5mnpaaYrKiuo6Wbraa+rJS9sKyforCyuauzppqosaOnl3qokH18sHeKgaSliJxtsm+gh618oY6DqJWYgKyJhK6Fn5SqoaGXhp+AmZWAe5J+q4CdmpeLq3idn5GJk5KAea9do4F9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWSppmClY6YjXt7hJh/a21/Y350boB6YGdlcW5oZ2dDWmFbPktUM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBgYWFeXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVldXWFZVVVFIRklKIygovZKag6nGwrbBs5+arKCuuKWjjpuko5+wr6qfpJ+drZmeuaCjq6CvqZquoZCrqKSWiZqQrrGspp+mmqyXmI+soaGdpaGapZ2tmKCoprapwK+lqaSfi4CNm5qfpp6SlJqalJqapaSkmqmsrKSln6qovqSWw6yqoqGrsrmqrqegs66oqZh2r36Qi5yFh3y6roqYZbCMZZWtfaGPg6aVmoGsioSwhaaZpKGhkYWgW2xqgbNgf617e4KBsW1nb5mYjIiwW320XKSDa8iiZJ+Ae7xYdrVasn1SroB6rFiAoW6YkKibi5eRmJh8eY+dfmR0fmKEeHSAfGFqZ3FtZmVlT1VkXEJVXz5KKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFhaXmBgYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpcXFhXV0dCO9Kfs7K3vbq0wrOjm6ympbaooIuaoJ+cs7Opn6OgnrWYoLSoqqyer62erJuVr6iijoibjq+sqKeippmukpmPqJqhnaSfmaSjpZmfo6qyqb2vpaienY59i5qVoKCZj5Gam5Kal6ifoZqorqimpqOlqbueoMampKihq7S1rK6mnrutrKyVgKmSo6+Pm4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGujgW+rhGycf3qysMeDaquwvax4d6K+vHSBlo6nnJCbkZideoKRm3pjfXtkjmd5gntgbGVramJQYVpTalxAVWFCTio9OjQvHh8kHiUyIB0kKDA0OTY2Nzg6PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbO0sb+5sb2yop2upqWypp2MmKW/qriyqKG/pqeynJ6xnLqon62vpqaUlLCsl4yDm5GupaKsoaOcqp+Yi6OSpp6nnJqhqKKZnqGsraq5rqijm5eSe4eZkaabk46RmJiPmJOomqCYqamhqqeho6q7nqjEoqCuo6qztKqwqaC6p66umnN1qqS3hmWJoHBnrY+Kj21vd6SQmZ+Bda6YlHCPi3GVqKObl66kcm1tbGaLeG9ugplxgXpqcWlniZaVmHFpaYSHZ3CGZF2IYmpvWV1nfnemX2FxjpFuZmWAjZOPopiZmZGYn32HkJV2Zod4aY5reX95ZGxjZmxiS2RYSmxaOlFlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3OTw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6m5ubKzqqmhrp6jsqmYkr6yxMm+tqqewKyso6GorKC6o6SurK2mjZeuqZCMhZWWrZ6mq6Geo6OfkYukkqeZqJmWo6qglpympqevuqysmpuTknuEl42lmI2RkZiUjZeVqJWfmKmjm7GmnqKruZ+vwKeksqWssLGqraunt6Ott5aKoKiltp2JlqKYh6makJSdkqmzmZujq6CxlqKgnaCinKCloZWrp42TkoyHk5yclZCak5iRjpWFgaSal5WNi5OTi4+GhH1niX50gnZ0h4txp2x6lJGTkoGBjpCQj52VoZaamKKDiJWNcmmQd3GLeHd8empsZGNvZFVgWEBqW0hjYU9aK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhUVlleYGFjXV5VUUpFRD45PUBBU1hbXFpXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbaurqKwo62foLWxkI6sx73Fu7mroqaem6afsaijtqedqbSnqJGYrKKLh4mPm6eWrKWgmaeenpKVo5eomqiZlKaho5Cap5mhtbuoq5iakI17gZSLoJSKlZGVkJCTl6WQn5qqoJy2o56nq7enrsGuo7amr6+wrKmps7igrryZkaWkpraikp2mn42pn42Sn6Osr5uho7Cor5ejoJyjqp6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2Ui4B9ZouFdYZ1eYiDc5xqhZCUk5CJfYyWkpKXlKKTnpiihImZh3tylnN6i39yfH9qb2RecGphW19ZbmNQYGRQWjpHR0U+Mj09OC8rJispJh0mNDA2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVVBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX19hYWJhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaatoKe1qpCQnaW0vK+traKjmnqdorGkpbGpl5y4pqOUmaqcjoaKiZyjj66fopWnn6GSl5ibrouqlo+omaiMmKmPn7m2paaZm42IeYKTi5qTipWSlJCNkpeijZ2eqJ6fuKOAhK+1oq+vdaS9o7Kgd3mgqrK6lHWspJ6JgKp/ZFxidqCOpJ6El31uk7Odo6etqqNlnZ+Sc3mZlnCAmKiXbH+iqIplnKWckZeYloySnJGGnZqQlYOSh4+PkomEd2qOhnaGcHuGgYBhaYeKlJKLWnWVkWhoj49ze6aamWV5mYeDeJhqhIuDb3mAa3FlX3ZwbGtoXGdlYmJwU1w+Tk5OU0c+QFREOTEvHh8mNDozMTY2Nzg8Oz5AQUFGSEJHRklLTVRUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5gX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6GvsayrqaWprqOmraSSlqu2sLKnm6umrJd0jJ2vn6irp5SXuZ+gj5yknZF/iYibno2rmqKVp6GdjpeRnoR1ro+IppqpkZekiZy6tKigmZiLiXV3k42Vk4qUkZCUjJCToI6boaeZnLKWgIybtZ2zjJKPvKegfqeieqKutoGOjqaeg4uGkLGpr4yKlqOaeYCLrIacnaKnqaeHlYWYd6WbeoebgZengoJ7nLJ6ioagl5mUmJaCkZeWhJqZY3mHkISOj5GKg21wjod5gHCAgYV/hnSGhJWReJZoknSgmnR9mYSinoeYf5OLg4SZa46OhWx4e3FxZ2R4b2psalxma2pldFxfSVRMUUBFNS5aVFU3KSEwOT0+NjQzNTY4Ozo9Pj5AREk/SkVKS0dTWFtZW2FhaWZaUUg5RUs8PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mra6rqKygqLGmpqmlmZSuyL6xopenqbWej4SdrJynoqCNkL6emo2fmqCQfIaOmZiIrJyhlp+gkY2TiYaAkaiNh6KdpJSYnoafurKnnpuSjoVwdZCJlJCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6quiLeFjK+CsK6DqY2lmI2dfaiPcnt3nI+nlmiVpHm0jJ+epqiSmMKBf6uImKFynoCapX2XhZWxgKF9oZOgkJiXgY6Tm4qYkYt8hZOGjZWSiYNtcpCFf3lxhoGEfIR1hIGWgI/FZn+ph4+ja56Do5uEmoGOjoaKmXGOk4Vod3R8d2hodXFoaGteZHBtZ21YZ0ddUk0yRDQ2TmFjNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmptXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKepqKaroKS4sKmqppqUoKOkq6SXpaq3o6+AoaecpZ6diZS9mZONoZKej3mElpaRiKuZm5uZoYWPjHebnI+fkIiepJyWmpiHo7mupZqcjIx+Ym2Pi5OQjZCNjZiMkZKfj5ShoZmhp36hp4etnaCWrY+enJ2RhYCgjauuhqONqZmMmn+jdYCZlGuCrHVNq3iHjZyRm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefm5gZFmDl3+Me2Roi3KZfXmVbF18lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhaBpZqBtW26KfGZaYIN/YldQb3dmbXRya2pvXmtwbWxpWGlPXVhGOUE0R0ReazQsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5adoLigqqSmrJGhtbyrrqKZmKCipayuoZ2utaKokqGgn6abmo6ZtJmQi5+MlYt1gZSSjYqmlpWYnp5/koWGrKSHm5CKmKmZmpuSiKaxp6KWmoiJgGluiIiLjo6Ki42SjJCSooyUn6CcoaR/k4GPo6GUoHeclo+ng6Gnf4aprISleIp8hJp+onBzlIiWe56MeW2Hm4yZkJuomo+HnXuConN2pmaefnekX5h6fZJzom6Yt7S6dJOHgn+1qGSBxrh7cJW3i3GAmqRic6yrYH1pnbN+bnyGgo2Ci5hxf6NscqN0noSAo2CdmbOWcXyXn7N0c1uesoNqYm90dnFpb1hrbHJyZl1pXmJLRT1ENlFBWXEzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1OUUBEX15bWVhgYHxkSEM4TFdVVmNhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe1rq2gmqKdo6Omrpybsa2sk5ihmaGkmZqUn6ubi4iSeIuFcYCWjYqPoZCSlJ2XfZCJjaihh5iOipGjlJybjYupqKWekJeHhX5re4d+fY+Ng4uQkYmPlKCDl56gnaCei4l3nJiijJ9yoYuHqIibpY+Wp6p+rYx+eqCZeqOTeIF0loiNnH2Vn4abjpmbpoaiZKF8iJaQm41snmiajW6amXuAi6d9cmh0q4Oeg3SqaJWaXZuFdoSdaKpqgLhmXKhwgZxglYxep3Z1h4l+nmiadYaTkpeOf59umpBtp5pdqH54u2t+qluOhF2zZ1xucnp4a2lccWp4eWNgZlhiQVFGTzdWQ1JvNUtaWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXVllZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniGOUm6u6srGsnqacnKmfnq6bnrCorJ2XpJqhn5iWlqGkmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJaknYqUj4aLnpKdnYmQqaOgmoySioCAaYCGeH+XjHuJjo6Ij5aaf5Sin6Chk5hyaJ+Kn4+McJKMgamHmJ6ip5+nfK+to6K4l3ejs6KkgIiUeZ17qpp/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn90qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcnyObYCIhJl1m3iGibGzf3+bk6d2gp1uc32Ub5lza6RdlXZIZWRhc3F+fm5mYGxpdntkZWJSXlddVVdAWkVRaERTV1xiWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk5yBsK2ZhFReoKazubOzqZqijJyrnJyplKGrpKGoj5+enZqZlpihnZaIh4l3hoFveZWFkJuLfJGTlohyf4iSoZxzkZCBiJmVoZuFjqmcmpWLi4t8g2yEhXGBoYx4ho2IiJOYlXyTo6Ceo4ithn21hI6enHullnqpgZWcj4qgnHynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpmAo29eqGd1o2NvpWGc05B8e5l4cnNjooaQfqNzpI92a5CzjGCCmIlzqrKovH93g21+vqaptF6cbn1xl25/cqJyXaRnc6ZhaKZtm9SZfYWbcHp6l2ubfHiXc26ppGdhZXlwgIRrZ2ZkbnV3Z2BjVFtmUVFiSVdKVGFXU1tlalxlUUZDS01KS0JLRThPQFFOWFNZT1NRYWZlalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7CrVFxLfqmvsbSws6OcmYWZqaChpI6lqKCYqYqZmJiTmZOSoJiOh4Z7cH2EaH2Pg5SagXeQjo+Jb3+Gj5KSbJeTfImRkqSWg46qmpOSi4WJeoN2h4BugZ+Gd4GShoiZopd7lKOkmp+Js6Gitot6rKekrqVwqICakIWAm5F7pICimYaYcp6Eo66vipeMf4ykjZWDraGUdrS1tcmhc5SKgZ9gnZepbXmVhqCbdaGHd6B+kpeLgW9MZqOScJuHcqR7enRhg4FrfqBrcWRfnHF9dJdpemmztbTGpnOYfnqda5ybq3WEm211eJhpmnp1mHJQRX20Xmp2a3mHZmpoYnR1cG5WXlRZaVBTaUlWTVlUVl1oa25WZ1dNSkJKTUtISk9BUUtQZWNqbWV1c3N/eXxudYl7e1RQTmxeaFtraVJqaGlsZ2xmY2VgXF1cXmliZGlre19dZGhjamZvbGVpbWWhnIivpoRmP5Shs6uvr7aiopCAmKqioqWMpaednaaCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1joiMgWmEhZKCjIWdjXqMi5Wmk4OXqZiMkYuBiXqAfYt5cJChhnmBlYeJlqCVf5Slp5yWloRmbnicbKJkfHGld5uYcGemgJaLe6R6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmqa3WgbW6mX5ppi5BoloealXWigH2aYIyGjXVviGJooGWefmmadW9jZoiCbXKiWl9bYqFtXYmMb3t+c3JkpW13omRnp2mZc4yZb6JvU4mQb6BfZahUi15UmG5tc2tygm1waWt5c2tvUllXV2daVG1KWU9dSVhpaXNqWWtWUVJFVlxMWFNhVWlrX3d0e31wfXxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrYmppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66kqbCxpp+LgJirnZ+mjKKhm6KigJaYk42aj4uYkI6Ke4ZxgIhoi4t8mJtzdIl9kHtkgoeViomWmYJ8iIeWqJGBoqyRhpCKgop+gICOc2mPpYR9hpSNiJigjoiTqqadiaZ4lZt+pYiWjLKYnpCCr5efpXeUh3mpdKWPhJpupKKMkoSMg7tufaWvg4aGhpOVnJ98pXpyqJWglmaefm+rY5aKlZJ4qGypooGJdoiDd6qRpodqkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5/jKWedp99hKSVnaBqm4h3rGefrYy2dHe+jaSTWYOmjathdXJ0cHx1cWNqfm5obFNXW1ZhYl1rTV1SXUpebW52YFtxWVtgW2Z0ZW5vcWJxdGB3en55cnmDc4R/gXt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFgXlxia2JtbHpvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnainrqSZiYOYq5qepImbpZ2pnYWMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGk499e4KFmKaOf6WmjoGOiYWVdoKHkm9si6mAg4uUjomcn4mMlKqjoI+AdZSXiH6BeZSuo3+Bm3GPhXiPioN+e3KnjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3t9iWuMhVt5eXJ6cGhufpKJcX91gY+Uk3GGhIJljH9egX+Ld3VzlHVveW5uh22EhV52aHiOZYCAhY2pm310fJZqiYhwgXZ9hnZtbWeMc3l7mHiFW2tYeY9pbndycXB4eHBdbIZuaWdWW2BXXGZrZFZiVV9RX3B4eGxrdmVqa2t2fXFydHNhb3VidHuBeHV6g3WAgX+BeYuFg317bX9sZHhuXlduZ2h1a3hqaWplXGBaY2lmbHF1blpbYmtkbGx5bmhsb2GNlLiopouhopqmpJmlnKujoYSEmKySnqGJmqaaqZiDgZuKfpaTh46KiY1yg3yPfX6PhXuXjnNyg3CVhXt9kouGhpCFeH2AhpmkjnynoYuGkJCFloOGjph3coWphY6RnZCInp6IjJuon6Cqg4mOlZp+fomWraiPkqaPd2+ckIJ5kW9+qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgnZ0gVlyboaRgX1+jGpdamR7hYSJgGBpeHqbe4KLgnWBhYJnd4qGa2FwcYF2XnKKgYiPppWFZYyPg253i4Rxho96cGZnZXuDepZbXGpnbnZbe3l3dW5zc4JmXG2Ka2tiWlpfWllscVxfYVpfXWZ0fnp0b3Rja2trfH1ze3h0ZG11aG18fnZ6fHt6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzeW9oam1gi4uqsKGQo6Ganp6Ynpmoo6N+g5mtjZ+ViJyikaWVf3uYhHySmYmIhoeKc32Ai3aFi4GElopxb4BymIaEfpOEg4aKgXqAg4uboJCCp6GHeI6YiZWLi5yXhYN6rIKRl5mUip6dh4ihq5+ioqOLiJObnKOZlqqhp6egkpuHlY17d42OhKd+f5KRkpOcsqablZ6QjbKTl4SljIyVm5+JkJuCiJGKa3yOd3hlgoaQi3yJnYSHi5CIiICEhJB3fHl0maGIhomeioSUfn2KgIB1b3OEg393hoaKj6aQg4WNh4ONkIx9iIyKkYN3bIKEfXqZanJoYXSKcH16d3dvdnSBXV5vhmhuX15aXV1UaHJWY1xcYmxodXx8c29wZGtqaYB8bnl/cWpwcGxngXtygoB4f31/hHttgoyGfHp4fH16g3lOZHZqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnbmelqKhmJWYmZWZpKGefICaq46ejYagnIueln15lIN7jpmJhoSEhm54gIBygYd+iZSEbWt+epeHhIOQf4CGhIZ9h4SOm52Sh6ufhHKLkIaTkYudkX2NeqqEjZKYlo+cloeGm6afopqdhoKRmpmYkJqmn6WdnZCWgJCJdnuHjoSle3yOkJGGmKqhnZOdj42qjpGAnYyJk5qego6XfoaOg294hnJ1YX+Dj4Z1i5iBg4+ChoV+hYSUbnl1dJKhiouFmoSEjHN/iHx9cnJ7h4N7eIqOg5Kmj4WDjoGEiomKd4aJiox9b2x+gXxuaGxtZ196f2h9e3Z0dnV7d1xfcH1udWBjW11eUWduVGVbXmJraXZ6fnFsbGRramiBgGxzgWxsdW95cIV5boeAdoKAfoV2cYKNiH57e3x/e4KKYGl8anVoaYJlamNgaVxjdWhvYnRtbFVjcXllcHp6cmVqbWyLiZ63mqGjn5KRlpiLmp+fnnt4nqeRnIqHpZSLmJl5eoyFfImRg4yCgoJue394c4GFfYuRfWtofYKYiYGIjnx+hoSHfY+BkJubkYmonIBwjIuMk4ehooqFjHyokYiQkpeTlpN4jKOgoJ2WmX+AkJqYkoyao6GjmZeRm36NhXiAg46GoH9+jIyPfJikoKGTmZCPpo2PgZqRiZOXm36Tkn6HjoF0dIJwdmB+gI2GcYqVfIiMcYx/goWGjmh3cXiLmJGPfpd9h4pygYZ7fHF4eoqEenmQjIKVpZOLhZB7hoeHhXaChImIe2ZyfH95e3FsamZffnNofHV2c3xzgGpeYHN2cHdkY1lfXlJraVRkWV9haGp2eYFxZmtkbGhlgIFrbX5ob3FsfniHemuMgXOBgX6BdHaCjYZ/fHp/gX1/j2pyg25zaWKHaGxiX3FWdG9tbmB4aG1XanR2Y3V6e3Jiam95iY2espKlpZyOkJiPhp2gm518dqWhjpiAjKKKiJqWeHuGh36DiX+IgoF/cX97dHaChX6KkXhnY32Gl4qCiox5fYCNg3mWgZWYlo2WoJt+cIyCkZSGppuHjYmDppWFk4uWl5OSd5GdoKGYk5Z5fo6Yl46Wmp2knZiSlJt5j4WCd4SWjZ1+gYmNjHKXo56hk5mOj6KMi4OWmIOSlpl/mIx8iI2AdnF9bnpkgHyKhXCGk3+QgmyHgoGAiYRldW97hpKXjHyTd4qIe3+FfHtxfneIhXmEj4mKl6KVgYOLd4iEg4J3fIKKhndgeXh9dH94Z2xlYX9pandzdHV9cXxiY2FzbnVybWFaYV5bbGVSY1hgYWhrdnmGcWNqY21laH2DbGh1aGxwaYB9gnltkIZxgISDf3R8g4yBgH56goN+fJBtdol0dG1limxqYmN1VoRpcW5geGdsYmp2cGZ5fHlxX3FshoWPnK6XpqiejY2Xh4afk5eZfXiqnIqZepedi4yYkHl7gIt9fIN8gIKBeHR5enR9gIR/iYuAZF59i5WHf4WHdH1+in99mISXlJeMpKKYf3OHe5SSiqePjI6KkqCRg5GQlJeRi4GPmKCakpCQc3+NkpSJnZ2eppiYjZWWc42OimuFl4+ZeoeIkIlvl52ao5OVio2ejIaCkpx/kpKVh5mIfIqJgXlxemt1bHx+i35thZKClHhwgoN9fop/ZHJpe4CWl4R+jXOPiIN4hn12d398hYB8goyEjJSkj3iEgnSJh32AdHaBiYRvYXt1enF9b2JvY2R7Ym5vdnN4d3N0YXVgb2x1bm9cXF9eXmteUF1YY2FobXR7iGtfamZqY2h3iG5mbGhqbGiBfXt3bpCIc4GEhH10gYaJe4N9eoGEfX2OcnqLeHhubIdqaF9pcmKHaHFvZXZnbmxheWlrfXt4cGF3bYuAmZmqoKOonYqKkYaLnouVmH53rpmNl32fk5GWlIh3fXuKfHuAdnh/gHB0dHtvhX2BgIp/fGFbfo+ShoCEhHN6gId6j5KIkpGck6WclYJ9gn2Oi5KkiY6KjZeajYWRmJOWj4qIjJKdk4+LjG6Dj4+RiJ6ZoqGXlomWkG6ImYNmhZiOk3qIhJCKcJWalKKSkomLmYyCf5CefZKPkoyZjnuKhIdzcnVrcG51e4t0boaQjpJxdYB7gYGIfGRwbHh9mZN9hIh0kIqAc4d5bn99gIV7hYuIhIyVqIx6h3x+i4V4fnFwgYaEY2h5dHVwfGJfcGFrdF5want5eGxzcGV4XW5sc21zWFpfX2JrWlBXWGVjZ3FxfodmXWloZ2JncY1uZGlnZGlogXp3dW+OhXSBgoN7dYKIhXiFfHiDhXqAiXd/i3t6cniDamtfcGh0gGpyb21xZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqCkJ2Hk511gaqVk46HoYyVk5CAdHt2hXh5f3Jze4VrcnB6bYp2gIGHbnFbWH6RjYiAgIB3dYGAf6CGkYuSnZihlZh4ioCBjYmcnoqPhpKXloWJlZmPlouLjY2NnYqNj4NtiYuQkIqdlqGcmJSFmIdqhKOCZoWdipB+i4OLgXeTmJGekZCJiZWNf36PmHyRjY+OmpJ8ioCCbnVwbG1vcHuFaXODjpiKcXeAdIKIgnhmcm51gZmOe4iEepOReXaHc2+Ie4WLeoqFgoiOm6OHe4N1gYt/eHlvbIGEgl5ydHJwcHhaXnBgcGpeb2p9enBtbWpsdmBwb2pxbVpYYWFiblhRVFpmZ2N2b4SCYl1rbWRiZmuSbmBmZl9na4F1cnNwi4B1f4OAeHWAi4B5hX93h4Z3g4V8h4x/e3aKf2pxY3xjhnxucWx0amhvbHZ4X3F/eXx0dXSAgn6klZqtnqeWhY2Ef5eUg5CgdYuglJOGi5uMlY6LenJ4dIJwcoVzcXWIa29tdW2IdoN+gG1uVVGBq5WHgniAd3ODeoKggpKCk5OYnJOaeJJ7g42TpJqTjomVmJKEhpeZjJSLiY+PiJ6Ej4p8c4uFiY6InJqfmpaUf5N+aIWch2eFoIeRhJGCiXGDkZePm46PjIyPjXh7kpB6jouMkpaMfIh8gGt2am5rbGx7fmF6fo6Wgnd6gHiDjHx5Z3Nsc4eVin6IhnuTj3F5g292jHqJi3qIfYGLkJ6dhHx7d4KLfXdxamyCg3pgeHBubHJ0Vl5vYnJgX2xueXBob2Zmc3RocGthd2VdVmZgYHJTUU5cZmVdeXCIfF9caHJiYmVmkmpfaGRbZ3B+cGtxdIp9dnyFgHR1fox5e4aBeIiDc4aFfoyNhHt5lXhmcmqDYIh9b29remBqbnR/dV90fXiGeHRzhXx4oI+ZsZyljoKKf4Oah4CMnn+LmpOPhYiYjo6PhHd0dnOAcG+Fc3Bxg29qaXZug259fW11c1JNgt/IktaTfHB1g3aEoIOTd5SRmZyQmXuUc4WQn6GTk5CKkpuThn6WloiNjYiRjIicfo6AeHqNfoiMipycnZuVk3qNdWeIkYZsiKKEkYiXgoVjjJGZjpWKl4uNiotxepSIe46IipORiXmFfH5se2Vyb2treXlcgHmQjoB7fX5/ho56emhyanOKj4mChYR8lIprfX5uf4t+i4d8hHmBj5WamYp8dniDkHhzbWdxgIRtanRvaGp0blNeb2RwWV9rcXdma2piZnhyb3BjX3dgYFZrX152UE5LYWdjXXpwiXRcXGV2YGFlZY5jYWZiWGlzc21qcXaMfXR5hoJ1dn6Lc4CGf3qJfnKJh4GRi4h8fph2ZXNufWWIfm9wa4BabG55eXNhdnp7jXZyd4p3eZ+Lm66boJCChXeIlX59ip2HhaCRj4WMmISTjoeBdHdweXFuhG9tbn5yZGV4cH1ten1qaGtjpJrB3K7voXNsdoR2haOGkm+WkZWglZyBknKFi6OXiY6VipCdloOAlZCFiY+AkYqJln6He3V/iXiGhI2cm5iZjo92inZuhYiKfYqig5CJnISFXouTl4qOiY6KioSJbXuWgX2IhYmRj4Z2hX19a31keHVpbnhzWIh6koeFeX6AgIWMfnhlcml/iY6JgoJ/i5aFa4F1bYeQgY+EfoJ6f5CVk5iPdXN3iI11c3FndXqDYnRtcGJpdmdSYXFnbFVfbnR5YXJkX2h9cHJuWmNyYWJXbllceE5NTGRnYl53c4ltXFxkeV5gZGWFYGNjXllqcmtua3J3jH50d4SBeHd7iXGDhH1+iHt0i4mHloaMf36Xc2h1cXlti3pudHCAV3F6dnlxZXd5hoxodoCJcn+ch5mnnKOShX1wjJR4eYudhIWhjY58lo2AmoiEe3N3cHNqb4FraW18dV5heHd7cXV7Z2BkfOvatcnD3IhzbHSBd4ubiY5qmJCPnZaTgYlxhYmgjYSLlYqMmJN8jZOIg4mPe5CLhY+Bf3Z4g4Rzh4KTm5eUl4aMdYd/cISBiYaYoYKTi56DiWGDlI+GiYaJjYeBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXN3bFqMfJKDhX1/g4CEioJ1YXNriIGPioF+fpGQfW2Ba3iFjoWRg3yBfH+RkpCWiG5xeoyGdWxxbHJ5gWB0aW5da3ZgUmVxaWZTYHB2dGBvYF1ognFzaVdnaGJpWG1WW3VMS0xmZ19icnOFaVtcZXleXmRne2BkX11Za25mb2lzeIp+c3OBfnp2eohzhYN8gId2d4qGjpmBjIJ7k3Vsd3V5eJN0bnh7fFh6hnGAb2d4d5KCY3aGhXGKloWZoZqiiodzb5OLcneOnH2KmomJfJ9/hJp/gXhyc25vZHJ+aGZsd3hbX3l7e3FxgGphZ2F/1baOkKZ4bnF3fHGTkY2HapmOiZySjIZ7aYeLmYaBkpGGh5iNfI2NgYGKjXuPjX2IhHp0e4N7cYaAlpqOk5SBiHWDhXWDf4qSnJ2FlI6ffohhf5OHhIiEiY1/gINnfZGAfn+CjI6Qfm2CfIJ0a213dHN2dWtjjYGPf4V+fIR/hIh+b19ycIR7joyBfH6QiHlwg2Z5goqGi4J7hH1/k46PkoNub3mMfnVtb2tse35jaGtqWW52WlJqcmliUWJyd2xiZV5aaoNtc2JbZ19kbGBuVVtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmtsYm1qdHeGf3Fwf3t9dXiGeIWCfYCHdXmJgZKWfImGdomBcHd5e4STb218gXdeg390gW1penSUc2dzh3xykpGDmp+boIaIdnaVfm12lJd+iJGEio6afYyadn12cW9samF1fGZiaXV6Wl93fHptcX9lZGhnV52PXnFzlrzEhHZxlImQfnOYjIadk4yIdGuIj5WAe5SLgYSbjHyLhn18iYx/lIh1iYV1dn2BcXWGgZ6VhpWPgoJyf4d0g3uJl5yWhpONnICIZX2Sgn+Fg4mJcoJ+Z32Le3l/f4eLj31pgH2DdmZveHhzdnNsao2FioGKf3mCgISDf2pecXd6fYyJhXuAj39+coBoeIKGioWDeIN8gJeMj4x9bmx6iX13dG9paH13ZV1xY1hwc1NUbnNpYk5ndHhmYF1cWG6Ab3NZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebGNaY292ZGdcXWBramNsaXN2gYNxbn57f3R1g3qEgnyBhXZ+iYGWkXiDinSBiHN5eX+OkG9vfIFxaYF5en5tbXx2lWtqeIR0a5SNhZ+YoJqFiG59jHZqeJiPf4KKgpWYinqPlm96c3FsamRgdHpoX2Vye1phcnx5ZnB6YWVljrGyd0piWqTZ0Jdye5GLkXh+lYuFmZKNhm9shpKRenmShoGEmYp8h394eImKhJaAb4qHcXR9e2p5hYOlkYSTjYN/b36CdoJ4hZqYk4uSj5SFh296koN9g4OJg2+CeGiAhXhyf3+Diod8ZX1+g3VjcHKAaHhxb3WYjYWCint2eICEeYFqW3B8coCHhIl9hYh6iHKAbXCDho6Dg3KDeICZjI2Ed21ufoR/d3plaGp9cmBZd1pZcm1OWHJzZmBKbXZ0YV1bW1l0fXJvV2ddZmpwX29OV2lSP1lnX1twamd5cVxaWWtlWWNweV9oXV5lbGhmbGlxd3+Hb21/fYB1cIF7gIF/gn92gYWJl4pxgo1xe4Z9enqElIx1anp/a29+dH99b3J8e5Rwb4B/eGaSioKhmJySgoVnh4RwaHqXiX5/hYKZioF8jY1peHJrbGZfYW95bV9ib3lcZGyDemFxdl9lZdXrvosyOj6LjoByeYWIjo12hJiNf5OOjX9ubIWNjHV9j3+FgpWIfIN4bnaHhYOXd26IhGx1e3RmeYKDqIyDj4yDfW5/dHWDeYWbkIuPkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7gYqDeGJ5hIFxZHFofm10cXSBm4uAf4V+c3V+gHOAb1trfXR4iYKKe4Z/fIh4eXBriIKPg4lxgXh/loqKfnRtanaAgHV1XGlpeHFZV31TWnFlTFtzcmVbSnB3b11bWllddH50aFliW2dlbmJpTFdmUT1eZl1ddmZfdHBbWFRvZFpkcHlaaF5gZ21naWxpcHh9jmxqgoR/eW6Ae32Af4J6dYKBjJOFcICLbnd+gHt7iJOJf2h7fmt0fHKGe3N3fX+MeniEfnxrjIyDm52WjIGAbI1+a2l/j417fn+DlIJ/fYqIa3VxZ2hjW2Jnc29fYWx0YWhwiXphc3ReY2SboJBuXDVZr7V1aoCJfZKGdoaYh3WPjIp3cGyFg4d0eYl4iX2TiHp+cmd2iH59l29whn1od3luZXqIhKWHgYeNin5ufnV+gHyLmIaBk5CXiIuEiXyPiHF7fYV8aX5taoB7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZWRgXyCf293eXx0fm1XbX52c4qBhneHdYGJeXhybYiAj4CEcn58fZKIiHpubWltgoF1bl1oZnRyUlt7TlxxXE9ccm9kVktzeGpXWVlaYXGAdGBdXWBmZGhoZk5aaE5BYWRbYHZhXHVtWFdSdGFaZG5yV2peYmhrZ21saXB3fJJsaYSKfX1wfn57gX+CeneAgImLhHJ7h29xd4N/e4qNj4NqfntueHl3ind9eICCh3+Df356bYWMiJijjYSDe3aMeWtthImSeX17gpGAgH2Kg3BxcGNmXllnX3BwYGBocGZqb4p1YXRvW2FkaXZ7f76cpqPIuHKFg3OUfXiHlIR0kY2IcnNwhHuDc3WGdIh3lIl5eXFjd4Z5gJNpcoR1Znd2Y2p8g4iegoB/jo59cn5zg3l/kY+Cd5WNlI+Hgoh6iYlreHl+dWh6aWt/eXNpenaAg31oYHeHfmpqc2h7gGl2gYyQlH56fn5xe3Z7dH1hVXV8cnOJg4J8gnCGiXd4cG+Cgot+fXh9fHWNhYN2aHFobIiCcnBdaGN0bktldkxeb1VUWnNtYlFPdHhhUldYXGFwgnNbYFxoZWRjamRQW3FJRGRhXGRxXlx3aFVWVHdeXGVuaFZsXmFqZ2Vvb2hwd3uTbmmIi3l+cnt+eYKBgnx2fYOIhoNwdoNybXeCg36Ji5R/cIB8eHl6gYt0g3h/gYGChHmAdm9+iYubnoh9hnp3h3xodIaNkXp/f3yJhoR2j4Bnb21fZFxYZVltc2FgYXFsbGiJbmBzaVleZG2Ad6naqseGh7JyinhwjXV7h5CBepSKgHV0dX53gHBxfm2FdJSGeHRsYHqBeYiOZnGDb2d1blttfYGQk4CBeZKSfXh7bYZ1gJCLg3OVipCOh4WFe3+FbXV2f25od2VtfHZtand2f398YWJ4hnpodXVjfnpndIaOjJV7dIB1cYB6fGx/WVVyfW90g4Z/f3hriIZzeGp0f4ODfXp8d3tyioB8c2dzZW2LhG10W2pfdmVIbm9MW2NYV1Z4bWJQU3R2WFBVWF5gcYRvXGBjbWRjXm5iVF1yR0NmX11maF5ae2JSVlx1W1tna2FWa19hbmZmbHFocHZ4jnRrjo11f3Z4fXeBg4F7dH2DiIiDb3F/dHF1foaCiY2Ke3d/eIR8fYWHeId8fYF+hIB7fnN2eYyOn4yJeol3dYN5Xn6Gmo15h4N0hoaEd4l7Ym5sW2JbW2FWanRjYFtob3Bnh3JhcWZXXWNrf3zKzoe5omttbottcoVyfYWLf3uShXp5dHl1dXtqbXVjhHaSgndwZ158gXmLiWVxgWpqcWNYbXuGnImDgnOXlHd+e22HcICJioZwlo6QiIWLg3p5fnFxb31naHJibXhyamxxd318el1leYB3aXV4ZoJ2Z3SHjI2UfHKHaW5+gHltfF1XcH1tc3+KfIFubol/cHZndn6AfoF1e3F6c4Z7eXFlcmFujIJsc1hrX3hcSW9sTVdWX1RVfGthT1R1clFRVFZeYnSFaFxga2pmYlluYVhicEdBaF1gZl5dVnteT1ZkcFpbamhdV2dgX3JmamhyZ3Bzd4Z4bpWKdH96d355g4eAdXN/hoWOgnBwe3d3dXmHhYeMhnp8f3WLfn2GhISHf35+fYd/fHh1eXeRk59+jH2LbnWAeWSDiJeGdJKKb4WFgnqDdGNuallfW11dVGdzZWBZZHJyZ4FzYmtkV1tgaX94vq57n7duYnOHaHR8cnqDh3t+jYB4eHN3b3t2ZWpuYYd1joFzamJefnh5ioRmcX1oamtbV294iqOBhX9xmZNxgHh0gW1/gZCGcpSHjIeDiIV9eXRyb2h5YWptYG12a2drbHl3endbZ318eGVzfW6EdGV1ho2GlX5wi2ZreoN0bHRiW257a3R8i3qBZnSGfW1wZ3R+d31+cntreXuBeXdwZWxhbYl+bW5Wa2B3VktrbE9ST2lOWXxnYk5VdWtNUFRVXmd2g2ZdYXBoZ2BXaV1ca2hKRWpaYmRXWVV5Wk5XbmpZXWxlXFllY150ZmxkcmdycHSAeHCZhXZ/fnh/fIWHfXVzgoeAlYJuc3h6enNzhYeIiIR5gX12j399hImOg4GDe36Lg3t3fHd3mp2XeoqDh2l2fnxshIWUgHKPgnGGgn6Cf29mbGdXXVtcWlNkcGVfWGNydWl2cGVlYldcXGiAcG9ygHOJZWV5f2p0dnNzg4V4gYR6d3R1bmt6cGJna2eGdI2EbmZeX3xve4l+aGx3ZmlkVldycI2nfIR8dpaQc3xye3ltenqQhHaXe4eGgoaDfXVwcm1ndV1taF9sdWRnZml6b3tyWWeBdnVocIB4gnVhd4WLfJSBbotqbXqBcWVzZWBseWdydol6fWF1g3Zpa3F0enB5eHJ8ZX5+fnh2bmNlYW2GfG1rVmpicVRMaWtQTE5wSF57ZmFNVXRkSk5TV2Fqd35lXWdzaWVfVmNXYnBdS0trWGNiVVRVc1dNWHVkWl9rYFxaY2Vfd2dtYnBpc29xfnV0mYF4f4B4f36FhHp9doKDfpiFbnJ0e3p0cYWFj4KAeot1dZGAfYGUjoCFhHx+jIZ6foB2e6OminmIhoVsdXx7dYSCjHpvhXN6hX2Cg3VuamhlVl1bW1pTY25lW1hhdHtqaW1oX2JXX1tpgGlrb4BnbGFoenlrdHR0b4aCe4B9dnVuemhqeWpfZW5ogXeQhGdlWGJ3aX6Hem9pb2ZmXVVYb2iPp3aBenyRjnh1b35ucXR4jn53lHSFgn+FiHZqcnZnaG9cbWVebXNfZ2FqeGh7bVttg3N0am+Afnl3YHaEhHiPhXOIcXB5f3FjcGhbbnZkcHOHe3hhcoBwZ2l4c3Frd3Z0dWKDe353dXBjY2NtfH1ra1VpYmdUS2xoUEdSbEVheGZiTVRyXUpMVFlka3d6ZV9tcGlkXFZfVW9vV0pTaFhmXlhNVWxUS1t5X1tfa11dW2JlYHpobGFvb3Vub3d1epd9d3+BeYB/h4Z6eXqDfYGThHF0dH55dnSFiJB9gH2QbHOVgXuCn4V/h32AfoaCgIp7doSsn4B6iIeEbHKCeXaBgIJ0bodvfYB0ioBqcG1kZFhfWlpaVWJqZ1taX3WCaV5ubFxhVlxca4FlcnR9aWpdbHd2Z3R3cm6HfH5+enZzbHpnaXhmXWRyZ3p3koFjY1Rlb2eChHd2ZmhpYFdWWWhkkKdufniAi456cHB8ZnhueYp6do5xg31+f4ZuZHZzZGhoXWxiXW9vW2debHRlemlddIBvcmtxe351dWF0hYp7h4eAf3dydX50YXBsWXByYnFxhHt1ZHKAbGBsem9qaHp3dHBkhHR5enVxZGFkbXN+amxUaV5eVUxzY1FHV2JHY3ZmYUtUcFhKS1dYZ2t2emRlbXBmY1pYXVh2ZlRKXGNYaFhZSVdlUUhieFpeYGxbXlxiZF6AaWpfb3R4bm9udoOXeXKBgH1/iIuGfnV2hniGjH10dXWBeXp6goyOfX6EiWp0loF7ip19foV5gHt+fIaIc3GProx8e4aQfmZxiHp0fX12cm+GbXt+bY96YnBvYWVeZVZZWVdjZmtgXV1zhmlZcW5bXldaXGx7Y3F3dm1jW21zdGh1dnFthXl/gXl3bm90ZWh0ZVtndGZ2dpF6X11SZWZqgoF0fWFjaVxUWF5iY5ClaHl0g4aQeGxueWd3bHuDeXSIcoB4e3h/aGV2bWBmYV9qYF10a1llXW9uYnpmW3h8a25ucHd5dHRkcoOSf4eCiHp2b3F8cmF3Y1pub2FwcYF7c2VxgGRebXZpY2Z4enNsbYF0c3xzcWFeZW1vfWVpVGhZWlVOeWBSS1pZSGJ0ZGFJVG1TSUtaV2lscntjbGxzY2FZWlthd1xTS2NdWGlTV0hZYE5HaXVYXmFtW1tfYmNdhWloYW54eWxvanaBkHhtgn6AgZKIhIF2dYl0i4Z0cXZ2gXd8fX6MkIB+k35weJaDfZmSeYCAeHl+f3OIg3NwmqJ7e4CJlXlkdYh5c3l2a3Nwf2x5fHCRcl5wb2BnYmxUWllXaGNtZlxccolmU3JuW1lYWGBsdmRqdWpqX1ttdHFtdHR0a4Z9f4B8d29vbGVpcWNba3JkdHaPc1xXVGRgcX9+cYJcYWNdU1pgXGOTn2VycYSDkHRranlsbm95eXpxgHd/cnl6emRmdWdeYlthaFxed2hXYl1waGF4YVt7dmpqcm93dHN0aXCBlIOGfoR2cmpwfG1ldldbam1icHKAenNlb35bYG9xYl5pb3xsa3N9cnB4a3BgW2VrbXthZ1RnVVhSUXdcU1BZUkhjc2JgR1ZrUUhPWlVra2t8ZW1vcWFbWlhZbHBXUk9mV1dpU1RGWlxPSXJ0WF9jbWNYYWBhXoxqY2RteXhrb2l1eYZ7a4N9gIWZfIKEeX2IbY+GcW93enx0goJ9i4+DgpZ0eIKThoGfiXWBf4F0f4Jwh4J1b6KXdHuGi4d7ZneLb258cGZ4cXtsc3ZzjWtedG5hZ2VrUl1bVmhibGxbXHGMZE5vbl1WWFVnaXRoY3RlZV1abnVucHV1emuIfYB9iHeQc2Nla25hXG5tY3N4h2taVFZiY3d8fHCFXGNfY1RbYFlilpVjbnCDhIpzamd5bmVydXF6a3l0dG56fnVfZnNjW15XYmRZYXVmVV9gbWNhcV1dfm9oaXNxc3B1dWtshJOBiXuFcXJmbntvcW5TWmVqZXFzgHZzYmx2VWJxa1tebmR8ZWt1fHJycmptX1ljaWp4XmZUZVVWUFVuWFJXVFBIZXJfYUZYak5IV1RWbWhkfGlrd2phV1xVW3RkU1JWaFFZZlRTSFpbUE54dlpeZWxpWmJgXl6PbmJma3l1bm5pdnZ/fm2DgH6Gl3t/h4GJfmuTiHJndIB7dYCDfomPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYt3eG57jWBkfHFneXN5bW1xdoNnZHxsY2ZnaFNfX1VnYGxvXF5ujmhNaW1gVVZTb2ZzbGV4ZGVdWXF1bXJ7eHNtiXyBd5x7emxiZWxtXmBuamVweX5nWlZYYGt3e3pvg15iXmdWWWBXY5yIYmtxgYZ8d2tqdmxbdXBqeWl1cm1ue4ByWGpuXlldVmJkWGVxY1ReYmliYm1aYH5rZmtzdW5td3ZraIWMf4l6h21xZm97bHFsYlhfaGhvc4Bzc15pbVNlcGRVYm5heWJvdXt1am9sal9YYGZodV1lVmJWU09ZZlNPXU9PSGVvXWNHWmlNSV9LWG1kX3hobn1kYFVeVF10W1RSX2ZOXWJUU0pcWlFadXVcXmVtaFhiYVtejnFjZ2p3cXNtZ3ZzeYNzgYN7iI1+fIqIjnlukIp0bHOBc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2Ojo6Njo6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY6Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZxbQURERERFOS8wMDAwLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJycn1IxNTU1NTcnHB0dHR0YOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6OiIaGhoWFhYSDg4OCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5GLkY2Nj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2Ojo6Ojo6Ojo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoWNh4eMhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiIyGhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCIi4eHjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMkIiMhoaIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2PjI6KioyKjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5OUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WVlZWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpKTk5OSkpGSlIiMlJOVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKRkJKRkpOQd4yTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpB3iZKRk4B1jpKRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCQknlujZKOdHaMkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Rf2d4kod1d4uQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo+CYWmGemh0io+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjndga2JnZG6LjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLiouHZG9uW2pybIGFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3BjcHBka3JxZGhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZGVpbXNwcnVrYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpdYGFjbG5vb2taWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTlBeaWZsbmtnY1FQU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OT0xMVWRtZmpta2lmXFNPT1BRT05OT05PUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0dJT1VgaG5oa2xraWpoZF9XT05PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVEUl1iZmhqbmxzb2ppamxraWVVSkpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj4+S1ZcaW1sbnlzampsZltRSkRERUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7OztHSj1GWWtud3BraVlHREJFRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs+PTo7RltubWBJQT5BQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk6Ozo3OFZkPzg4PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT49PT07RVk5Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11uQD5ERT8/QTxEWz09PTs7PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT1BPElgPDw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlNRkZ2d003ODg6Oz4+VWdAOzw8Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dnd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXx3Vjw9Pz09PkVpdEs6PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBIcnlrYoKEg4ODgH1dPkBDQEE9SXN8WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDf32EdUxBQ0VAPz5ZfIBdP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVxQkRFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+fn19fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIpsQUFWdIeJh4eHiINXSExNTE1OTElHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3Z3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbISHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExLSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGhIKGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaIiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJioyMi4qJiouMiVQ6ODY1Njc2NjY0NTc3MzU2ODo4NzY1NjU2NzY3Nzg6Njc4ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIKDg4ODg4WJi4qJiYqKioqLiYqLgUc2NzY0Njg4NzQ1Nzg1Njc2OTk3NjY3NjU6OTo7Ojs4OTg5ODc3Nzk6OTg4Nzg2ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiIiKioyKiYmMej45ODg7PD0+OTo6PDk6Ozk6Ozo5OTs6OT09PT47Ozw9Oj07OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXN2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA/PT0+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZERUZEQEI/PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGV4SCg4SFhYaGh4mJiIeGhoaHiYmKi4yNjIyLioqIVkhNTE1LTkpJS0lJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f3+AgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0pZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE5QTkxOS0pMSklJSEpGREZISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7PD06PkA+P0BDRklKUV+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1yTlJPTkxMTExKSEdFSUlESkhHS0pISkdHR0tMTkxMSEhJSk1RTk9OTU9LSUdJSkhJRElISEZGR0dIR0NCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRUJHSkdMSkZLTktLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRUZJRkVFQkFCQlxvcnd4eXp6eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxYVlJSVFJPTEtKREVGS09OT1dVUVBPUlNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0dWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hXVWthRVJRUVBJOztSVFJgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTlJQUFBRS0xLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVtjYFZZYnJdXVZdWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7ent8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3pucFhaXFtSU1JWVlRaWnSDWVV9kGBcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVRVVFdSUVdVYpaAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT0xLZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlRkVX9SUFFOS1JUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXZ1c3N3enp7e3t9e319fX59fX1+fX5/f39/f39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1dW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZPRkRFRklHSENESEdIS0dEQkFEQE5RTVJkcnR2dXN0dXp8ent7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgmtNRz9AOjs+QEA/Pz5qUUthRUZISUVCP0dMTkdNUVVJQkU/Pjw9PD09Pz0/QUNDQD88PUI+Sk1HVW50dHVzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+AgH9/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqamZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PzxCSD9cc3R1dnV2eHp8fHx9fHx9fX5+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBRUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdYWGhza11WYXNrYWFfXmRhX15ZVFFOTk5MSUhKS0lJRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTlHbnJ0eHh5e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fn9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTUxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz89Ojg4NzY1OTk2NzY3NVdwcHR3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9ydXh4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkREQUBHSEdIRkZISk1MRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydXl7e3t9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7P0A+PD1AQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFBSYlxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSEpLTEpGRkZEP0JDPjxCRz9CP0FkcHR3e3p6e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk4Nzk/Qj47P0JAQD5BRElFQ0dHSUZJRUJCPz49Q0JBR0lETU9iZVFNTk5XS0xNS0xNTU1MS05OU2ROSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7enx6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEpEP0E9OTk5Oj9CPzxAQkJBREVIS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRHSUlKTEpLTElKTE1PUFJQS0dDTEdDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW9qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSEhHSktJSktER0I9Pj06Ojo7QUI/PUJCQ0NIR0pMSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISUtNSEpMSElKS0pNXFJISERORkFES0pNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZFR0VGRkdFR0JDQD08PTk6OjpBQ0A+QkNERUlHS0pMRklJR0ZGREI7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0lIRU5JQkZNTE5NT01OTk1LSUhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtxbHNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NDRUBEQj5APzo7Oz06PT5DQT5BQ0VGSkdKSEtIR0dHRkVDQD1FRUI+QkNDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSkhLSUZIUEtDSU1MUE1PTk9PTkpKSE1SVVRST1dkYGFtZ3Byb3J5emdlaGhkaWxmcWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMR0VFR0NCQUJEPUJBPkE9OTo9Pzo9PkBCPkBCREdKRkpGSUhGRkdFQ0JBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFR0ZEQ0lJSEtKR0tSTUJOT01QT09PTU5PS0tLUFVXVlVUWF9eXGlhbWluaHJzYmVmZWRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJAREQ8QUBAQzw4OT0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUpJS01LT1NORFFSUFFSTlBNTlBNTE1TV1ZXWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW95TUhHSEhCQkJGRTw/QkJEPDc6Pj46PjpAQj4/P0JFRkRGRERIRkRFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkQ9OTo+Pj08PEFCPD8+QUJGQ0VDQ0hFQ0VFRkdHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdqZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZvdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZDRUVESUVGRUdFSEhGSEhJS0lFSkhIS0hGRkxJSEhKR0xMTE1MSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1NSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZIRklGRkRJSEdJSEpNSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJjaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdER0lHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdISklJS0hKSk5MTkxJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxrVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQ0VFREZCRkZHREVLRUVKTU1LTExHR01JR0pLSEtLSUtLTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZmVxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEQEJCQD5DRkdCRkNFRUZFRENISEdERUtIR0xNTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0hFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHS0pHTU1OTE1OR0xOSUxLSUpNSUpJSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SE1HSURFRENBQj1CQUJGREhHTEhFQ0NIS0hIRkpMTEZOTExTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnRzdnNIS0hJQkVFRUFAPkREQkdDSElNSUZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTU1JS0tLU2tiW2leX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKSktJSElHS0tLTEdIS0tMTExMSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVpdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQENIREZHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0hMSkhGR0dJR0hJRUZMSUpLTkxJUFxXXlBcW2BeTVhZU1xcYl5NWVpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGFhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRERCRUlFR0dGS0pLSEVFSkpLRkVISFBKTU1KTVNIR0VBSEZKSUtMSUxKSEZFSUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2ZoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNHSEVIR0hLSUlJREZLS0tGRklKTktOTEhMTkdIRj5HR0xJS0tKTEtJR0VJRENEREJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUNFSElGR0hIRkZKR0hGSEtJTERES0pOTUxMSEpKSEpHP0dGTkpLS01LS0tJR0dDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHRklHRkZJTEpORkRLSkxOSkxJS0pISUZCSElRTUtLT01LS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRW1JbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTElJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VEV1VFXFReU1ZfWE5UVU5aWk1KS1RgYVtfWF5eYV1OWWJcYGBfYmNiXWFiV19fVFBOT1BYUl1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQQ1ZeSUdHSERGTUpQUEVJSUtLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FFRkJNSEJLTFBPTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xRU1JVWllXWVhYZFdPU1RQUE5NT1VUW1hYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSUxLTEtOTVVOT0tLTEdHS1BTU05QT05PTk9IS0ZgRURfTERmY0VNW0leW3JtT01VbVlMQ1BgVWtXZ0pdWFVeRE1RVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhTa1NWVlRbXFtgYGFhYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xIRUdGSEVFS09TSUpGYFNISk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUX9RSXxZWXFzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1xmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEZJS0VRVkxLT0lLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWlJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b315b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0lRUlRZV1dRVFBQUFFLSGd4bGN4cm1bS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en5seHp/b2hvWXZ2anV1cIFgcmd8aWx4fG9eX19iYVteYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0NGUFBISktKS1BPT09NUFpgWlhLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRxbG1ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGZlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBRV1xYVU1VWVVmWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGR8aXJ7XVVMbGB2dWtpdXt7bX54a3xwXV5eYltfYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElISFJQTE5PTEtSUlJPU1JXUlZUUFdbVlZUVFRhYFBOTUtUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFlSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1hYUl1ZV11WVFBZUldXV1dYX1tncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlYUE9MTVZUUE5VU05PTUxRUEtKUlFLUU1LS09SVVJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVVWU1pRT1NSWFZUWVZUWVVUUlVUVFVXWFddWl5hXVxaWlxcYGNbXWJjZGZkZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNRUEtPV1NQTlVQTlFOS1NQTU9VU05STk1OUVRQVFFTVFVOS01PUVRUUlJRVldUWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWl9dVVheXF5dXF1hYV5bYmJjZ2ZkZGJYX2FiXmBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXGpkVlhZWldWU1RPSk5WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUV1ZaXVxaVldRUldYVltbV1FUVlZWVllUWFhVUlJYVlZaXVldX15WXl1eYFxcYF9fX1piYmRoZ2RkYlliYGFeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF5bWVZVV1FMTVZTTU5ST1FST0xQU1JVW1VTUFBMUFdXUldTU1NYTU9QUlRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpXV1xeWl5fYFVhXGFhXmBiX11gXWNgY2doZGZgWmNgYV9fZWRfYGNbWlxbXFlaWFlXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cX1dcXmpxd3mAYlxbVlZYUU1PVlNOUVFQUlRSS1FUVFlbV1VPUk5TWFdUU1VSUlpPUFNTVltWVldUVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVVNTXVhaXV5cYGBgVmJbY2JeYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFteX15bYFxgVVxdaWpyfXNsZ1xVWFdQT1JaU1JRU1JUVVRLUVdWW1paU09TUlZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxVU1ZeWV1dYF1iYl5ZX1tlYl9kZF5eY2NhXmVmaWRmXl5kYWBhYWJkYGJeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWVFRUXl5gX15iXGBVXV5ia3l0bH1sWlVZVVFQU1xUVVRVVFZZV0xSWlddW11ST1VTWFdWVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paVFVWWllaV1haXFZUWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfX2FhYGNdYFRdX2JlZXWBemhYWVlTVlNWXFhXV1ZWV11YT1VdWl5dXVRSV1NXVlVTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxWV1hbWltZWVpbWFZdX19eY2JhZGRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVZWXGBhYmNhY19fVltgZGFfenVvaFlcWlVYVFdbWllcWlhZYFdQVl5cYGFcVFRYUFVXVlRWV1JTVVdaWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWltZWl9fYGBkYmNkZWJkWmJmY2dmZV5hYmBjXmJjaWRjZ19nXmJiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllQV1ZXV1dWVFZUWFxcXmBgXWBcV2FeW15cW15YVlhYW1tfYFxfWFldXF1eX1xbXVhbYGFeYGRjZGVlZmJZY2VlaWdkXmNhYGVjXWVpZGVpX2ZeY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWlhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXlldXllYVldbXGBeXV9aWl5dXl5hXFtbWlxfYl5iZGNlZmVmYlpkZmdqZ2NfY19hZmVaaWljZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMWFdcWVdcW1xdWldcXV9gYmRiYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpiZWNgUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfX1xbXl5gYmNcXFdcXmBiYmNlZGZkZWZkXGVmaGpnY2FiXGRnYFxpaWJoaWZkYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFfXltgYWJlYl9dVFxgYGNkZGZlZ2VmZmVeZWZoaWdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8fHx8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29vb3l+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKgkU+Pz8/Pz11jYmJiYmJi4yMjIyMjYh/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29ueYB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzMHOQjIyMjIyPkJCQkJCQjH9/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXR2d3d3d3d3eHl5eXp5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1en19fXx8fHx9fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnd6eHp6eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH15fX16fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHp9fXl8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8e3x7enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt6fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4eXh6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzcnJycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHN0cnFwcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3Nyb357b29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzdXJycnBzmHtvcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXSVfHByb4igdnBwcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFycJShdXBznaB2cHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFvibGRbn6koHZwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnCDs6l8kK+jd3BxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycI2xp6uor6R0cnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3N1n6Kis6Wbo3pzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHd4eIClnpqln6Sjj3p5enl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fn18e3x9iqKQkJeal5mSe3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX1+fX6GpqmknqCblZV/f399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgIqxqKmioaGro4J+gIB+f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f3+AgICKp66fqKOgoaWppIx/fH6Af35+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B/gIGIlqqupJukoaChoaGpqp+OgYCAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KGjJqmo52cmqCUmaGgnp2eoZ+ShIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYKDipKVmJeZmIiQnZubnJiQiYWDg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoCBgoOMlpmViZGZnJKLh4WGhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEg4KCgYGEkJeTlpmQhYeHiIiIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SEgoODhZGXiYSEg4OFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKCgoKBiJGCg4OBgoCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAgICJk4CBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f42XgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmIqDhYSEhIKAk5uFgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJKSk4+MjIqFhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fIucjYCCgYGCgoWUlIuBgoGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUk5SSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeLgIOBgYGAj5OMj4GCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p9hIWDhIKDg4KOiYWMgoKDgoKCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUk5KSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf359fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMi4iFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aDgH5+f35/fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWGho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFhoaGhYWFhYaHh4aGhYaFhYaHh4eIh4eHhoaGh4aHhoaHh4eGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoeGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iJiYmJiIeGh4eIiYiHh4eHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmKi4qKiIiHiIiIh4iIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhIaFg4GBgoGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fXx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGh4eFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODg4ODhYmKiYeFh4WEhYWCgIGEhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4iJh4iGiIeGiYmDg4SDhYSEhYWGiIiGhYODgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDg4WHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGh4eEg4GDg4SFhYWDg4WEhISEhYSFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4GDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn1/goODgoODg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af3+AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/f39/fn59fn9+f4B/fn9/gH+BgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+BgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gH9/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+fn+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh9gYCBgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf3+Af4GAfn9/gH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f3+Af4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX18fXt6eXl5eXmAgoKChIOAgoOBgIKBgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGBgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkImJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICBgYGBgH9/f4CAgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSEhISEl5eDg4SBfX6BgoKBgoGCgYSGiIyFg4KCgYSCg4OCg4WEhIWDgoODgoODgoKCgoOCgoKSkIuIiIeJh4aGhIaFhYSEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GDhYWGhoSDhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gHp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32DgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMi46KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fXyAgYB9ho+Bfn2Cfn9+gIJ8fIB/goCCgH59e4qCfYB/foGAgIGCgIKAgICBgH+LlI+MjI6OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3t6fIKAgX5/gXx+fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gpSSjY2Njo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoGBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fX1+gICBgH9/fn19fX1+e3x9f39/gH1/fn+MkY2MjY+OjYeEhoaFhISDg4ODgoODg4OCgYGBgYCAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjYyPjYuKhoSGhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fX1+foGBgoOAen19fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fH59fnx7fHx8ent6fX+AgISDgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2MjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx+gIKBgICAfXx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjYqKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4CAf39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fX18fHx7fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomLiYWIko+MiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx8fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgX9+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uKiYyRkI6KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99fn9+e36Bkox8fX+KgI2Mfn59fX1+fn1+fX19fH59fH18fX19fn19fn58e3t7fHx9fHt7e3t5enp4eXt+f4ODhIeJioeJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6enl5eXt7fn6AgYOHhIiPjouKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn5/f319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY6LjIiEhYWEg4OBgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYKCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH99foB+fX5+gIB/gX9/gH9+f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKi4mIhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmHh4WFh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoKCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4OEhIWEhISFg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SDgYB/gH+AgX59fn5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn19f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4J/f4OCf3+Af4F/gH98e3t6fHt8goB/gn9/gICCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDgoOAf3+BgYCCgYGBgICAgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfX9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYOCgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+Af4CAf4GCgYB/fn+Bfn+AgoGAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx+gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f35+fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAe4B+gIB/gYCAf32Bf35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKBgICAfX5+f4B9fH58gICBgICAgIB8gH+Afn+BgH9/foF/fn9/f319fH+AgICAfn9+fn99fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn19e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB/gH99fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KBhIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYGBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/fn+Af39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f356gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gIB/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBgICAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fHh4dXh4eXt8fH18e3x8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgoGCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgIGAgIGBgIKDgoKAgoGBgoGAf4CAf4CHfn58e318e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGBgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgoGCgoCBgICAgoKBhIB+gYOCf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDgoKEgYSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SDhISEhYOEgoGDgoKDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoSCgoOAf4CCgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7fYF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoKCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4KBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhIWEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYB9gXWBeoR/f39/hYSCg4OCgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSBgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhIaEhYWFhYaHhYWFhYWHh4iGhIaFhoaFhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4aDhISDgoF9f357fHt+e3x8fX9+fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYWFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9f358fH59gH59f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoaFhISFhYOEh4WDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4KAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4OCgoJ/gHt9f318fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4eIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYSFgoN+gYKBf4OBf35+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHhIeFhoaIhoWHhYaHiIaGiIiHh4aHiIaEhoaGh4WFh4OEhYSHhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt9fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaCg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICBg4J+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4N/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18gH59fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn1+f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYSFhISGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfn1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoaGhYOEg4aChYGBgH9/gIB+f4GCfX5/f36AgIKCgoSEg4OBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhISGhIaGh4aGhYKEhIOEhoWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4F8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTU1NTU1NTU1NXV1dXV1NTV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXV1dXV1dXV1dXV1djb3N3c3Nzc3dzb29vb29ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dTU1NTU1NTU1NTU1NiufIGCgoKCgoKBgYGBgYOLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oips7T0tLS0tLS0tLS0tLZkTtERERERERDQ0NERENGU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PEJAODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpKfN09LS0tLS0tLR0dHS2ZRASElJSUlJSUhISEhHSldXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsztPS0tLS0tLS0tHS0tmZTVRUVFRUVFRUVFRVVFZgYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tXV1dXV1dXV1dTU1NXV0MvLysrKysrLy8rLy8vLzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M/O0tTPzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXU1NTU1NXX19fX19fX19fX19jY19jY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXR0qig0M/RpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayUzrOeo6fWr5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpauhmpOdwJ6YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZqLm6GctJicop2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmch52WrbmGnpavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGaoo+cgaCWeJuEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKWsm6iInHmfqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLMtrWvppyKva2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0Y/SEhHRUA8PD4+PD09PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPucCjl5edpaeWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQzs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZGoo6ukm9Cfq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQqMmQjbfXwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9DVx8PV0dXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKinqKinqKmpqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6ioqKeoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6am5udnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qboqCalZeWmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Gglp6ikpianJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWkpainpqKenZ+hn56pn5CUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaWmp6alpKWmpqWjoKChoZ6neY6PlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqSlpKuwo6Sko6KhoZyilmGRlZmbmZuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOqsKuio6KhoZ6apnNfl5qZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChrZKopaGgnpybnZ9dZJqbmZqcmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaGgoKiXgayfnp2amKSIWGaZnJqdnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCgoKCjpG+bpJ2cmpqleWJmmJybnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6enqd5h6SbmpydoHhrZpOdnJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZybm5yifoCcmZubnZV1amePn52cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmZqaqn99iZOcnJuIcWhojp+dnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyZmJmZmKJ/hoKCmZ6cgXBiaI6fnp2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZiZmZegm5t8epujm4CHa2WQn56en56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmbqZyIZ26tqoxog4FslJ+eoKCenp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmXoKaIdF9lnpaCV3J7epucm5uenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qblaKedFJNb5WEeElZcHeRlJGOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY+nlVM5QHSJcWdFOlVvgYeGgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CKqHlOaFR0i3dlT1VDX3d+gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+gqBfdYxif6eeiF2Ge1Frf32Fjo2Lho2UkouQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfYyWY7nUj726qbeHdHxpWX+Gio6LjZCZnJSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYx/iI2NjIuHkomVgoHPxJzVrZqwnl+CcVR6kYmJkI+Nj5SUmJCVnJqdnqiusq+wtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmRnqGdk5eboZqdm6OhnG6PuqS40bGorpNss6dVdJSPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mpsKN0jZV+sbyzq5WHXZbEbG+coqGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipamnqKqvkot2e6eXjo9/emptkXpvlqOop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUE9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaanaSlo6Ghq5R8W2mRfnuAcm9rc3F7e5SdoqKgoZ+hoaignJ6hpaGgpqOinqShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioKOnoaatp6eirKd9bFNbd29xdmtnZGpmbniBj56goaCenaCjmpaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKhn5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGnqa60t7a5tq6PamNPVm5ra3NoYmRiW2Bmb3aAjZujpaGhopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqm0wsbGyMe/s6aSdWJgSk9vcW10Z2BnZ1hdW2BnbG91fomTnKSfoaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7LA2OHe1ca3qp2RfGdiX0ZSam5xeGhgYmlZW15bXF1hYmFgZnyhvb2opJihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmxwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW2v8nV1setmI6CdWVgY1xBUWxodXZtYmNkWllaW1hZW1lXZ421wL+2rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDub2+wcjQza2AZl1ZV1xVQkpxaG1ncmdhX1hbV1lXVFNijrzCuLe7sLW2qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV2bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvFwcXFwcHAvY5mVlVXUkhEdGtiYG9nWVtZXVteWGOMusW+paWxtqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2lmaGFrbGdudnFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8PGxsGxlMfKtoVeVlRPR2JogIuMVlVdYGFdYoOxwbmusqerqKiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8fnRrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMS5tcC2tcnPo2tVVVFTX5ippVFWW15eZpXAt6ars7WtrqWko6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt2bmtpaHVaZnJ4c3lmZl5kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvre9w8q6fVVUVEyPrZ5NVFdXaJa7tLGtrLi1sqypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMe/xcfDx8KLWFFLhrCTSU9VaKDBvb+5vLq8urysraapu7q5t7+ytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGlpdG15bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXEw8XHyad0TXqyikdOeK3MzcbEwcTHwby+tLGwsMK+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZXVudGNdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwcHAwMbLw5NkfWRLg8nJy9DFtr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnY2pkYmptbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzBwMDEk1BJc8nOxMjQwa+9vbi5u7u+t7Sxub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjY2NqYmdjW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvEvbrAxL+9vLi7v8V5SaDNxL+/yb+wwb+6t7u+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWOvL67w7W6x7e2ubu8uLm1usTKl02lyMC/u8G+uca9wr+8xbi2t7S4tra7u7m2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHFtZWVmcGpla2hYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDFea3Lvce3ubittrS3ubO1srvFyp9QpMm/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYm5gXFRIS0tESkNDRz46Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTYrnaEvsjPwsC4rrW1u723ubG+w8eYUaLOw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHFmbGludG53Y2diXGNRS1VIRUVDR0I8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0Zlzd7HR0czKxLW6v8TIvr60v8DDjVWWz8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGxsbl9jXmFiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysKHdXeozMzLzcrGwsPLzsG8uL26u4Fdi8zGxMDAv8TAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1teHxgcWNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u6rdvCvra+wL6+uqacqrO3xMCme3l8n8TGy8jBw8DAycrBv7u6sq56bHrHxsXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3h0aHBdXF9cWlFFRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFtm2vzr22ucC8qn1uaG5tdIKXmXV6f5y+v8bAucC8vsXEvb24sbGghntxvMjDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bHV7cG5pXF9fWVNQQUZJR0tARUNIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbF1grS9tbXBpIZpWl5gTlNbXHB2eoWkuLfCurO7t7u9v7q7u62uop+Kg6/Fw8O+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d25xYV9mXVtVSj0/P0dGPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmmhHeLorC1nGpmZ1ZZX0lJTVBUb3uLqbC3vrmytbK8uby2ub6yrbCpl5SVx8fDwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/GqId7doyhmF9TQ1lVSGJqVU9FSmWRpa+vtrq1tLKsvLm4tbjBvaGxsKSjer/Iwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZybmNdZlldXVNPTkE+SkJAS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7OQgXmIj25OS0BlWUJPeIGTaE1DXoWxtbO1srSvrLu6uLa5v8WMtb+urW6svri1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWxdW2pUXVtQTkhER01CRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFPh1hJSll4joNjQVWjubO0srCxrbC5uLa7t7q+nrC1rq9+rLCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh1dG5lVWFjV11RT01IQElSRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZRoTT9TeXFPSUlMaJ1/WkVVsLqxrLOvrqyttraytLWuqaWdmZqcnqeonqCoqZ+hp5abl5eOnZSPkJaNl5ukqKCgoqKipaWdo6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56em5mml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjd2xuXVFpVFBOR1BNTENQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3BqqW8ZkRTnH5QWElLYUlXjWJlZYOvtaqytK6qq6+wsrOtpZ2Rl5OPmKCfoqCco6SfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbo5mXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ua3tkaFZSZE1KSEdPU05LTkg8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCrxr/Knk5BdpluT21KTGRmdnRhXWJ0krKvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJaboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl5YGJTVWBISUpLU1RJU1FNOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfGi1ZTSmajWWZ9b3JbUmtjXGdiYG2RtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1tZTVFKT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlxd3VvY3d2WFdiYGRpW1pXaK2urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgHx4dmp3dV5tW1JgSFJVSEZVV0pDTUc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjf2+CcGBjV0tbUlpMTFFZUkhPTkiZrKqppJ+fmZKSlJiYlpaVjIiLjpWdnJ2dnpeemaafoKilsaqnrqOrrrawtLKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pd21obVxYW0NXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOenIliV15lYFdNUUc9P0BDRD8+QlJ4qa2pqqWfnp+io52enZqcm5STlZSenZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqCjsLGusKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3VycWhWXFFGVUhESlBJP0VBNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFBGRTtCPkY8Pjk2Tn6qsqejo6KgnqWrpZ6XnJSRmZ2ZlYyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNPHvr/Awr7HxsK3w8rJw8HGvrq1uru1u7ewtrKqurKuu7i/u7qruK2rqri7tbyurrmjpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2lveGtlWVtGS0xFRFRMRENFNzo/OjU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklZfG9hQT1cjq6soJmbm56emZeXl5KMjpaXk46NkIyCg4J3cnFtcI+mra60ucW7zcfLv8LMzc3Mx8nRzMzMx8nFxczQ0tXO08m9wL/Du8bFyMXR083U0NPTzMrCxcbGysjPwMnRzMfGyMXCvMPBvr+/tr6zrb/Aw8PHxcfEr7+5sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpaQ05MREZQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaWZcVElEQD9KhZ6kmIOgsq2jnpyfmpiXlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0dfNxsfJzMPFys/K09fS19LV1tPUyMzHzM3K083O083FycrKwcfMx8nJxr/Ds7PIxcvLy8/Hyr++v73BxsXNzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkIuAenJ1dmdjZ3ZqZFZXUURORkBKUUI+Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DU7DSvbKvppycnKCkoZ2alJOVlIl9eHBrZWJocm9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s7U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3RytLV1tnW19PX2M7Sys/RzM/QzNPQwMjHysTMzMzOz8XHyLa/ysDSzczPxsrIv8TDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSUo+O0E4PTU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFZSUBBREFGUXayr6ealJefnJqgoJ6bnJmViXdpY2FfX2BfXl9fXWFsdXNwcG9scnF1ksTIx9TW19fX09bQ1dTa1NTOz9XU1NHRzNDO1NfW09XQz9LT0cnT0cjQ2NfY0dfR19nU1czPz8rN0svO0cDGw8jGz87R0dLIzM3Ay8zG08/MzsjEy8fHyczK1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6upqqooaOrZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cGVjYl9fYV9eYWBfYGBfYGVtcHBua29ydneczMHT1dPY2NbZ0dLS18/TzsvSzdXU0crPzNPW0tHWzc/V1dHF0dTL0NTV1s7S0NjY19jLyM7Eyc/MyszAysDIys7O0MvQzs7Mz8/IzNDQy87Kw8rHyc3LzNLTzdPS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FlbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXlIRkI7V46hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3O1MzO0s3L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXNwsjKw8zExsnKy8/Lzs3QztPMxsnPzcjHy8XHwcbKzM3P0cfQz83OzNDFx8G4ub3Dw73DuLKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHFoWVhoVk1HTElQUUI7Qz47Njg6ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfDuMrV1tna29jMzM/I1tXEwrWvtKifrZd4bHBxeZCbjYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYGBfYGFhYF9dW11ncnJwcnNxbXJ5pcfTz8vQ0NPUysXJycbGv8PFz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8a6xL/Gyr3Cx8nOxcPHwMfNyMTMy8zPyMTE0MjGwsbIxL/Bx8zLy87Cy8zJx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG90ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7uto7Z9aIOFpKuUjo2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19dXV5fYGBfW1pcYGxycW9va2xvb3250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIys3JxMLLycHBy9DFy8i/ucK7xse+wMbPy8TAw7vJx8m7ycfFysC+wsvGxcS+xr28wcPFzMXFvMDJw8XH0sXByb/KycbIxtHDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdGZpWmFubVpbWFJETEZCR0VMREZTQDU0MzM1PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sa+1bF56fKGRi5KWhnqAhYV/dXh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lrcG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8PJv8HJu7e7usbDv7zBzsPGvr61wb3Du73Gu8O6tLzGxMLCt7+2tr6/u8zDvLW6yLq/vsvDwcbCxcnHycbQxsLMyLLHycPOzMDFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NWXllKRkpGSEtBRUJGSkA5OjY1ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysnGzc3O0cjQxdXU1tfNys7FycXHwbnFvauupV9kdYOTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvczAw7rBuK2wsaeqraynuLS2tLOztLu2vbG3sLWvsrvCvMHEvL+7tbK6vsC4yLm0u7fBwr24vcfBxLy1r7K2ur+0xbe7tau4vb7AvbG6trC3urPGvLevu7+1t7XFvL7DxcDExcbHy8XAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25dVl5gRktISEpGQkRBRUU/PDo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjJyMrIysTPzdLPzcXHwcbAv7q3ybaqsJhbaG+Kj4WIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaWZqbW5yfKTHwLi4tbCrrKeeoqmnnqqss62qrKq0rbaxs6mup6yzu7q2w7m6urGrtbm7tMK6sMCxvry7trzIucO2raqosLLAtri9sLGnsbO0u7yrrrWmrrauu7Kxqrmwrruuu7i7wMC+usO/xsPFwLzGwcfLuMXHxb/Hw8O6xMbCu8bJzMuzucK9u7OJc3d2a2lgYmxoWFdXW0FMS01KRUFDP0ZBOjk6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTQx83Bw8a/xMTDw8rCycq/wLzCurO1tcOuqrCRW2p/koeOj3t4fYmFenuEgXduXl1cXF1fYF9fZGNiY2RiYF9dWltaWl1aWllaXGVub2hmaGlrbnKBrbqwta6lpaenmqCkoJqcpautpKiiq6qsq7Cjpp+qrbS2sb25r7ewqK64tLO8uLS9r7i5tbK8wbLArqWoo6uxsrOovaqrqKusrbWzpaiuoaSvqbKmqKiupai3rLGyt7q6u7K8vr6+xL+1wcHHyLe+wMS3xMO/u7/Ewr7EyMzKv7/DwMCph3N0c2ppXGFvY1dWWFBIWVJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8HLvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWqpaylnpyhpJSdpJqXkaGjqaOjn6Wmp6atoJ2cpKassrC2t6exraiqtKu0urG2tq62ubKwurqxt6WgpJ+msairqLmqpKenqKeyraCnpp+bpKasn5+no6Chsa2trLK0s7Swtby2u8HAsru+w8GxubnCs8G+wLW4vL2+vMLHxcPEv8DEoIN4cGxiZmBrb2BVWV9ITmdPVEdGS0Y8PUA9Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS2vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLw8a4t8fAzL+4ybe7xbizxLizv8CstbyyrKWvs62ho5FpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21viJ2pn5aVmqGWm6KYlYyeoaKnnKCfpKWip56bo5ugq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+jorKlpqm4raKmpqCorauZoJ+emZ2fpZqao5ycnq+pq6iqq62tsLK4r7i5urC2vLu6q7OyubO9tLaxsba1v7a+wL7Dwru6vZeEenNrX2VeZGRYVFddSVdcS09HSkpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4t763ssK0sbu7rLm6saKeqaunmJ6PbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNp5yTlJSal5qhlpaQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqa+zp7qzpragop+co6Gto6Kqtqujo6aepaajlpmdl5mbnaCal52cnZytoauno6Omrauys6q1sLKrs7m0r6qvsrKzt7Ouqa2usrixura6vcC4s7GUhXl1Zl9mXltZVlNaVUtbUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxwrW2va20uMHMyMa/xbbBwMfOt8DEvbO5ubO/trG5u62ytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCbk5OPk5aWnpaYk5egnaGclqChqaSfn6mdm5urp6+wq5yjpLiqoaCuqLaqp6etsaS4sKS3oKOcmZmqp6GarLmvoqGknKKgoJOUoZSWlpuYmJaXnJWfqZ6ppKKdo6qqsa2otKyqp62zsKWqrrOxsLCvr6eop7KusbSvvLS6uK6jlIF6dmVfYVZZWFNSU0tNXkxQTEdITEtFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmJjZmmBlZKUi5GTk5qYnJWWnJ+cn5agn6empKann52gpqCqr6afoqO3qKGhoqizoqWopbClsa6stZ6hnZaVqaGilK2xsZ+jo56emJuTi6GUkZOYmJOXmJiXnqebp6KimqSlpaukpbCnpaOrq62mqK6vr6uoqqqzpaarr7Sxrry2sa+voJJ6d3JlYVxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaast7u8wcW6sbm1xMnJwMPGxce2xcSzwb/Fq7e3vba9uru1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpaW1lZWltXVVhXVFRWVVJUUlVgYF9gYV9hYWNkaYCSkoiPjZORkpyUlZakmaCXnaCloq2mpaWjpKOdqqulmp+lsaqgoZ6lq56oop+urKmprq2ioqKVl6KbnJCrqbCcn6Kfn5eZk4qekY2Sk5aQmJiTnKGjnaShopWgoqWlm6OrpaKkq6SrrqWusqmmpaamtKapqK2ztbS5urCqrJ6McnBvYFtXVlVSRlBOSFpcUFJJVEtTTEVHSkQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb3DyKyxuMG1vMC8tLWqrKaVmZubiIFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5RWV1cXV1eX19fYmRtjY+DkIWOkI2Zk5SSnJqinJuhqamrqKynqaakmaWvpZWZpa+poJyZm6Ger5mcq7Ogpaafo6ShlJOblpaSqaqtmp2goaGblJCMmY6MkYySjZaVkJ2ioKSdm6OVm6CjoZiiqKOjqKugq6+krbemo6SirK2qqKuvs7eyvbWzq6+YhXRzaFtYWVNVUkVYTFFbWE1UTlBMUVJJTklCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7evqKivrpupqKy3tqu8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9u7O1pqmglpeYlod6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9hZH2LgIp9io+Jko2WkZeZoqCboKuqpq+sqLGlqZqfraGVlqWop52YkI+anq6XmaiqmZ+dlKWhn5KRkpGTlairpZqZmZ6elo2Mi5OGiY2Dj4uSlZGgnqGkmJWflZqhop6Um6WmqKiooLGwprG9qJ+jrLSqrqewtbC5tcCxrrGrkX5yc2JWVFZOUkpHVlBSUkxMV01KTU9SR01LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtre8vcHDsa+xt620tLuztKKjnZ2Xl5SDgHZrZ2xucW5ya3BrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqf3l+dIeMhpCJl4mUlJibmJ6pm6CrpqasnqiaoKack4+fo5qXl4WEkpukkJWjnZaWloiim5uTi46KkJqlp5yVlZebkZKHlI6LgYyNgJCLkpKSoJqhopaUmJiVoqaZjZmkpqmmoaC0sqeyuKGcorasqa2ksrKmtby1q6yxo4l5c25dTlFRTE9DTU5OUEtGTk5KSk5OUUhNSkFITEhIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKWnpKqloKmmpLOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+tqbCepq66r62fmZqdlZSHe4NuX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5xdW+Dh4GHf5CDjoqUkZOdoY+anKOipJmll6KclY2HmZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4qYoKOekJOYloWOgpR+fnSKjXqQh5OQkJ2bmpqRlpCdjqOjjomaoKGkpJuitK+ssKyfmKW4pqaxobCunLC8qqmvqpmDd3NjVk1ST1BNQ1NOTFBNQlBRSElOUk1ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtp6Kmkp2mtq2joI+VlpKQfXd+ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11panFrfoR7c05Yco+Cl4aNnJeLlJGfmJ2VlJaVj5aJgJSJXztWb3yMlIqAjJKMkIaGc4qFl4F5gXuGk52Ug5WOkZCDhn2TeHFwhox9iYGRjZCXmpiTi5CKnYifmIeIlp6aoaCXp66praionpats6Kmrpmsq5iotKOpraOTf3NuX1tOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKapp6Opr6intMK5sLWwx8K3s73Pv7mvrrXCp6rFqqKdmIOUnLGimpiGlI+Lh31zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNT1JUVlhaYGxuZ3qBc1BCP3+VkpF9iJWMhIqNm46WlYmSiIaVhnmJf2BKUW54i5KEfYSNioV/f25/f5R4dXZ4hI2acFGNiIqGfH54lHZod4aIfoqJlouOkZKWjISKiJWEm42ChJKalp6dlKSjqKmlpJ6bsKqhpKSRpqmWoqqcoqaoiXZtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQz03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hr6GnqKWnqK+sqrW8tri2s8G7tqi5yLi2qKi1tqqyvaaelY1/iZOolpWKfo6Dgn13cG9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3J1fWloXFSQiZSIdH6GgXyFjJOCkpqLj3uGj4B2gHhzb3ZwdI6OgXp+iquEeXtodnuOcHJteIGLjZJ4eoB7gHZzcpJ4Z3WEhISFfJWKiIqNioB/hIuNgJSEfICPmJSclpGfnamen6CdoKmlnp2YjaekkqCglp6fpIFzaGFdXEpXUFJHS1hST0pMTVJKSkpMUEhMUUxSVE1FSEE9Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK8uLa6tLGft7qyqp2drKmosrChmpGNlIGOnI6RfnaGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdoyWmI2OfGd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKBfH91ZnZ8hmxvZ3N8iYyHgGx5cX1xbXaPcWhxgX6OcEOLhYKDhX53d3qMhn2Me3V9jpKPmIuSmpujlpmcmp2eoZyWjYulmo6dl46WmJB4b21mY1pYWFVRSlNVVE9QTlBWS05LT09KUk9ITlBMRkQ8PDc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoaawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlpylqaSgmJmPhZJ5iI6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybIinqsB+dHlie3hve3mJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKYbmh4foJtaWRseYWQkoZrc2x8bnJ8hmlucH9zjYmEhnt+f3t2b3R0hoJ5gXlwfI6MipODlpeYmpCSlpeZl52WjIOJnpKLko2GkJaAb2pvbm9YVlhUUlFZT1JUVFJYVU1OSE1KTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrLCjraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGZmZGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+nh2GaaXN5ZX5vbX96i4l2goiGdGyaknRzfGpqnY9NeYWTiYSOZzF2hnNsfn2DdGZldX+EhIWAZmlsdWtxf3xocXF8bpONj3x0fn1xcG51bYJ/d3l1anmJgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFJaV1lZW01QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWo6itnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+yoHF7eGx9bHGDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooV2cId8h3x0jK6NiYBoZ2JqbnJtcIJ1aW9YdXCOm5J3bH96fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gW11eW1lYYF9STltaWFdMSEpGSkc/Q0FCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp5+vlaW0qa6xrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPj82NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8foWDf4x+daKZeX6GgYSZhJqcYYaqn52Lg5CNeneIfomJjnOLl4+Eel1kcXR6fHeKbWhqYnlvhZCCem6Bd3SEenB0eXhrbmlddoZ8h3yHh45/ipKXg42FjIZ9cYR/hH11d3t8iXdwc3RmZ2BbW15TW2deV1BUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnJ2fppGgqqCxqK/AsbrFupaOkZSHe4Z2a3+MkYJ9ioSPjHiDgHOghIp8fIF/cIB+emd2a1JXTEBFMjExMzY2Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqkiGrq+vi4GAk4uCi4KEkqmHgJiYipt0bXyBhod9jmhnaHl/boWHgoVxhIZHbIB3cnl2aG1rX3Z9goh/h4SLeZSdnImLiJF/enWLdnx4bW93foB0dHJsW15eW2NjWGdlW1RPUFZZUERMS0ZOSUNGQ0NAQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSl6CerKGmuK+zvbOXjZKLmIt9dHB+iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SKgZF8cYOen5Gcf3aGhYuQh5BqaG+DgXSNh4SKcYWCd4d/e3aFfW52dWZ/lI6GiYiHiIegq6KViY6Xf3qCiHp5b2dreH57fnRsZV1aW11qXWFmYFpPS05XUlFJUEpETkdDSkRCQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDe4CMf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WX2N/Z2dtdZ2bj5qSk4uNjpqIko+di6CgkqOqpaOsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOop+TmJKEioWPmZGWbHB1iYyCloyNjnePhHFthYGKlpGDhYhxiKCVhpKJjo+WpLWpm42UooOHk4N9f2tqanyBgYJ0Yl5kX1tna11sa15XS0dOUlFNTExGSVBDRE1GQUNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYWQh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpaKZoZeilJyep56oq5+orKmqtperv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGIlaKbm3h6fpSYkqGTl5eBlJ57d5WSq7KIjZeffJSdm46SlZijoqa2r52RmaiHlo+NgYhsc3N9gH1yaWBdYV9hZ2RgZ2ZbUkVKS1BPSUlMRkZNQ0hMRkdEQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFCTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK2srKeotKuwtrKyrbuxs72cs8OrusnLt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKSIhZSkoaCroaSpj5uwi5Wjpre6m6CjsJKinaKekKOhq6+ssrSilKSqiJmJkomVenp9hX9oYWhcZWJdZGReZmdfWk9DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhjV2lvWHqFdoGThYeCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4WAi4WGh5KGgoSJhoiHh3BuYUBFNjQ8Mi8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdHRDw+PkZIQ0VAODs8NUM7PUZLSUdIUk9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubWoo7StsLGbmZKan4inr6ullHafpJehrLKzmJaqrqiutruyuqyvtaKxq7G1u7e0rrSgp6ijp5qpr62yube4ppu2qIykjpGSn4Z4goN2WmJlV2ZhYWNgYGZgW1RJRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeFgY5/gYmOhoCGiIWKh5F6eG5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD9HS0ZGQzs+QDdENz9CSkpFRldUUF6PpK2jsbTDtrjBzMm2u8S9s7PAtrjBtb6vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupq2sp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwre6uL63ure5rKywprGqrb2wvLvBwauZuqiTrY+Xl6qJfYJ9a1dkYllrZWplV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpwfo6EgI2DbnpzeIdiuaGZo4mUlJaSlJONkJaSh4Z7hoGNlYqAhIGKenyKh4Z9ioOBioOVfXd6dWVPXGRHRUw7UWNhW15TRj87SFBFWmNRUllYWmdZVGBgTVNQRUE/SUpIRUVBQEM8RTZCPkhHSkxTWlRdk664tbq4yL+6vcnMu7zAu7e1u7q2vbS6scZgdbKksZqeq72qpairq6SisrWgq6eflZafmJ+upaempZ+jlKOnsbSnsrO9tsG+08nJ08fCxczCysPAvr2/u7y3tK+4t7bDucW9wsivnrmpoauOpKi2iIGAc2BjYl5YYmBpZ1JYYFZRVUlFRU5LQD5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLfoN/gnh7i4OHfIt5gYqCl350fXprZXB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktLSEZISEhHQUk5RD9IS1RUVlxaW5O4wLi9t8bAu7nKyrq2ubW4ubK3tbSutraYZHWonK1wXqKsnJigopuknqullJ+fkJSOlpiXp5+ln56amYOknaylqrCtuLC9udTRztbQyczSzM/Oysa/v8LKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5mAe2xeYV1ZXmFaY2NRW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vl5KQlG5sb3V1h7OsoaCfi5mcmYyNlZGbkoWKin6Ih4uQi4h8gYRze4qDhXuJdIGJh5V/c3t5a211e2hyZWlsaWZqaWhgZmlobFptc5atpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpHSk9fXmJmaWGXt8ewuLK7vbWxxMa1sLiwr7ursrGnq7esjLWnnZqnmk6anYyOn5aRppillYqTk4mQiZCRkZ2boZealZaHnpqnm6yvqLCntLTU1NTW0svP1NXN08/NxcLJ0L/KycrJ0cfMzcLQ0rivw7zEuaW2usOig29kXV1eWWBXWWZaUV1XT1BCQkhFQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6lloyam5eLjZWRmo59iYuFjYqKipCHfISCcH+IgYZ7h3KDkYuPfXF4dWtxeH5xe254c2xogXBtY2ptcHhpd3x+y7/B36duY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmr7aqrLzAsKu0pqS4pquuoKu0oo6xrZqXmIyRk5GEjpuBjaaRnImDi4SKiYSLg5SVl5eTnJGcmJmZn56rrKSnoqytz9LV0c3L0tPU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfPnnpvZl5iXVdgU11aUFFUUE9IPkBGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OW3WGhYp3bHdwfX5/oZ6eoYuMmJOTjIuTj5aEeYWQkI2LioeRh3+Ce3J+gIGHeYR1hZOQiH9vdnJrc3x8d3tzgXdxaoBzcmlwcXp5cnq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hdXWBkXmN3en6LgZipo6Shn6CopaqwuKqls6OhraGjraGnsZ+JppqTkpGJkY+IgZSJapSijJmEgIV+kYODk5ati5WNlZqOhpKRnpensKGgoaWkqMjOz8jCy9HU0dTTztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPDzIxzb2RhYFhUWVRcUEtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5WJj4qIjoePf3iDlJiKjYiIi4l+gnhze32Dh3d/eoeRloCDbndwbXV/dnh9dIV8eWyHdnRufXaEdXh7nbWMO0GKxaV+jHxpZVdJQ2ZjZWNnamRueFteZmhrbmlugIOIkYucnaCdkJeYnqOjprGjo7OfoaWdoKmgo7Gchp6SkpKQio6LhoOPhH6cm4yNgoSFepR+gqmVo4yRipeSi32XipqSq7OYmpyonKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7LzLR5d29lXltTVlJbVkZHSklFRT06NzpAQEI6R0Q/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhYmCh3x4hZaWiI6Dh4WGeoR5cXp7hIZ1eoWOjZ15i3B8b296f3F7gXGDh4Bujnp1d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeouGjpORm5WflYeLk5ugm56qn6CsnKGamJ+mnp+rmYuajJCRjYR9iIeDhYuOoJmTiIOHfm2ZeYSYhoiTjI2UjIZ7m4iUj66qlJWXn5mnrrW9qa29xsvJyczL0MnD0srU19nX2NfV29fT2dvV0Nva0dbI1MuVenxqaVxbUFNUXkhDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEf4N8fISYjoeLfoaGgHeCeW57e4eCdHqSno2gdo51gnR1gX10gIRvgY+Bb5KFdHyAhHp2hnuJt8Wkwcm4gpWbj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5CDiY6WmZeWpZyXn5aekpKXo52Zq5WQkImNkYKMhYmIgYaQkZ6bmYmFjIGGl3qIiJ+Xj4iNiouCfaGJkIu8oZiTl5qcqaalrp+otr/AwLnHyc3Oxc3J0dbV1dnV19vU19na29fb2trYztzGh3x7aGpmYFRYVVVNTEROQzs9PTw4Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop7foB+f3yEe36BkYmEhXqEh3p1fXRtfH2GfnN+kp2RnoORfIZ+eI59eIqKboKagHSZhn2BiIR7fZB6j6iOj8OgvIyco5x9iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmKkJKVj5yak5SQloyLlZ+clKCUkY2Nj4p+kI6Oi4SJkpaanp+JjJSSnZGCi3+lmYiEjYOGhIClh4uLuJidkZSWoqehnZ6do6+2urWswMXK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbuHl5eW1rZldgXFNQT0lDTEI9PD45OTo6OTk7PTY/Pj48PTk6OzszN0Q/ODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYX1ZYZm1tbWmBjopxcnmKe3p/fH97h3t8e4uHgX51g4V5cnpzbYB+hH53hZuhmp6UkoCMiH+Yh4Cbkm6HqIV6oIt8kY2CiISbfZqQioyjop+Qo66gi5GLhYuBk4ZXcq2Ln6ubj4OYm4+PjluCopGCjJ+TlIyGiIySk4yUlJSPi4+Jh5abnY+VlpCLkpOFgIuIko2Kip2WmaKjhpOdlqCKiYiNnJCDiI9/g4eFpIaMkLOYnZKUl6GhnpmSnJ2nsrispr3Cx87Hxs/M0MzO19DR1K7W1dja2Nra19bZ2Z9xfnVpZ15dWFRXWENASEM+Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1ifpKDb213i3h5f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9fpKmo5+lopaKnZCUl4uKqJdyirGNhKeShJmThJmMopWfmJOJmp2ikqmvn5CVkI2OiJaMbo23hZrEyLKboaWbnJiWkbKRZKTNx5WOhoeJj5KNjZOUiYWKiYWWmZuPkJSThpSXhH+Pi5mIjZCql5ejo4iZn5aaiI6Hl5eKhI6MgX+Hj6WJjZOpmpeTlpmhmZ+Zk52borO0paO8wb7IxcXJyMnCytPNzdSp0tHW1tbY2tTT2s6Dc4FpZF9eXk9KVVtCQUZDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfHxsfYh4en56gYGCfnZ2gIJ7bG6Lf3l8eHh8hIeLfoujs6ijq7KhlqegpaSWla6ig5C3lZKzmY2hoIukm6+ipJ2YkKeWqJmtr6SXlZWUkIuYmZagwI6jybirmqKlrZmRmpyynYaFqKKcmIWIiY6VjYuTj4eBhoeIk5iUjIuTk4aUmIaDkZCcdJGZspaXpKGInJmTj4qQi5eaiYqWjoZ9jJifipCQnJqZk5iYn5SgnZWfm6GxrqOkt760xcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmFWYVdQSEpPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSmdhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9zjXp9gXt4houJhYSSqLutqLK9r6Wus7Ooo6KwrIqatJ6iuKWVrKSXqa23pqSjn5mpmKqjr7CpmpmclJWRl6CXmbu7rcmgaba4q7CUmJ6iq5KXvaNeqrKCiYqNlYeRfI+OfYOGjY+UlIiHkpaLj5WNioyWmZKdmrOWlauei5uUko2QkoyYm4qSnpCMiZWfoo2VjpianZObmJ6UoaCUnJylr6iipbO4q8LIxLW7vbvFyMfC0aHGyc3NxNbW0MvTonF8al5bVV9SUEZEPj1DQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVIYmBjcEpAi4p+gHKGh3yBiXWCioJ+bX19fH9wd4d3jYGHe42PjIaMmqvCwLC+xruytMG8tK2rs7aMqLKurr2qm7ukqK25t6umpqKio6Opr7Kxqp2cpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2wg4uLi5CDj4ORj3qBh5CNjpyIiI+XjYuVl5SQmpacp5qxmpGrnY6Zj5KOlZCQlpePkaCRiJWbpKyUlo+UnJ6UoJ6bmKChlJqeqKekoaOwsqbBxsOwsLq2xcTCvs2nx8PHw7zV0M3Eyol1dGNdW2FbTktDTEBFRj5BP0I7OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxnR2BpZ1pdW5OMjIh7h4uGg4x1hpCKgW5+fIJ/cX6BepV6kpSUmJGTlae0xsnAwszBw7nIvLqvq7m7l7K2urPArqXApKqwu7uqrquiop6nq661sKqboKqcopyVnrC0p4uiurq1wburqJyypKSolISOqcPEpIKLjoeIhIaVlI16g4yRj5GhjIyUkY+JmJ+Xk5mUl6agrp2MqpyOlY+SkZWVjpCVkY+hlIaXn6CznpSblKChmaSfmqCcoJSYnqakpqekr62lv8TCrqm3tcnDvrbOssW+w7yz0crIwbV2em5dWV1rU01JQ0xKSklAQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZaJi4iSj4aJeYaTkIFygHyNfneHgYKQeo2hlqiampi6vsjIysLSycrCzbzBs627vqe6v768w7eswamss7u9qrCppKWjq660rra1oJ+un6aimKO0vambqLzAo7a2r6uSr6yqq5aGmqmmpZGCjJOllYmAdYqSeYWNkZCen5OOlIuPjZSjmZeblJSjnqmfkaWajI+Pj5WWiH2PlZKSo5qVoKKctaaRn5elpKOlnp6mmJ6Vl5ulo6moorKsqLvAxK+ls7fMwLmuw7O7vsG4rcLCwcCZb3pjWVdcXExMTUlHRENIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGVWno+djpeOnpKJin+Jn5KEeIV/lX5/kIiKkICVoJmup6OYwr3IxMjG083Ozcu8wrewury0vMq8w8G2truts7+5vK2vqKCpp7atrqmyt5qeraKooZ2rt7ippa++xLG9uLOnqbOzra6WlaWsp6CRjpKxxaeVjXyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQl5eSlqWaZpijn7OllqOWrK2rp5ufp5iZlpmVoaSopp62q6m6vMO1pbS2y8G4qrass7q4rqi4ur24g25vW1hVVk9GS1NNSz9BSEVER0ZHODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqaUnJahl6mWjJCDh6WSiIGHgpyEg5WQkZSOmqKfr76uoce9xcTHx87OztLKvru2sbq7vL7OtsS9t7i3srK1s7iyq6acq6u4qqmnr7CXo66kp6SltMCwqqyzvsK5wLizp7izt7OulaWtrq6ki5OVoY1zwZl9lpmEjpaai7GVmpmVkpOZmaajlaCblpqonJuhoJmLjI+WnWBKlpyalJqll1SWsJ+vnJ+llK+vraWaoaaUk5mZjp2gp6KZtKmqs728u6uwssfAuaarq62xsaOhsrK0pHJwZl1bT1FMRVBQUFE7SEtJRkhBQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1SRVdSc2JXRkirl5mfoamvmJCXh4unlo6IkoWfiIScl4+eoJujpbXJtKnGu8PEyMrIx8zOx766s6+5uMDBzbXIusC5tbqxr6+ytKejm6q0tKqppq6smaSupaWprbq/qKu2tr7Bv764s7HCr7e9q6OutKy4pYibl6abdr6ghJicjpOZmouvlqGcm5eVm5+hqZ6ooJmaqpmhp56XkI2RnYNudpOimpWdop+QrrKjq5WpqpirrqWkn6WpkpKZm4iUnKKelrCnqau6t76zsq29ubafo6eopaecnKypqY1lZ2FfUkxNR0dOSlZMPU1ETUlKQUNEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1WSH9lXkhGrJScoZ+7r5iUnouTqpuRkpOJq42Hop6MpKyUo6O2x720wbrCwsjJxcLOyMG9ubKvubTAwsq2xrHAvLS6q6mtrK+jopiqtLqmqaasqp2or6ekq6u+u6isvLO3vca8t7W4wLC9v7OptLarvqSPopeRop+8n4mZoJmWnp2Pt5+pnKWjm5yhmqils6GbnaWcqKqemZWPlJqLl4mNpKKUnKKfoLWvpaWTsauarKyfnqSjqZKVlaCDkJ6fnJWppaKhtLW6ta2otbKznpyippqXlZmqoZ53Yl5gXktJRkhNUUlNRUZGQlJKSEFER0FWU0RIPEFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREScb2JHRaiXpJ6ew62bl6WXmamclpqaj6qWlaimla2smaGqtsTCvL+3wcPAx8S/zca7vrmysLizv8PItb+vvLa5t6ajq6usoKCaqqrEoqWorKaerK+soqqovrimrL2wt7bHtrS5uL6wvsG2tLK0r76jlqOWk5uUrZ+QoaKlo6OfkL6lqZ2orJ2doZumn72imKSeoqmroZ2WjZWek5+Hj4WNk56koJ21rKWclrKnmbCon5qqnqCNmZWfhY6hmpuSpaSamKyxtrGqpamtrJyZoKGSjpCVqZ+UaWRaYV1QSkdLT0xIRUNJQD1PSEA7R0lIW1JPSz1ITlU0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV0yimqObnsWsoZ+snZ2tn5KjnpakoKeqrJe2sKOqs7bEw73Atr/CvMjCvsrItri1tLCztLfBxra+sLi0ubWfpq2qq52en6WkwaWgqq6gpKmtr6Kmp721pbG7t7a1w7Kzt7q+scPAuLits7S1opyklZGToK2gmKGdqairoprDramerK6bm56ZpqC9oZ2kmKurq6ahmY2an5KeiY5Xf5WepqGguKqnk5i2o5+zoqCbr5efj5mUnYKPoJeWjaKklZCmrrKrqaKipaWVlZ2Zi4+Rk6SfiWNlW2RgTElKS05GRUFGSz49SkE5OUpKTl1RUUo9TFdcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmJ7Ep6Wis6GcsqeTqqSfo5+tqaydu7CorLWyyMPBwrPCxL3GxL3Eyr2wsLausLWvv8W1ubCwurWsmqiwqamanqahp8Ktm6yxnKqirrCppKe9t6a2ur2vt8Sts7PCv7HGs7q3q7S2raqipZWVlKOroZ+fmairsK6uu7KmoKmpmZmXk6KkuKGhpJKur6ykpp+SoZ6Vno+RjZSdmqOfp7Snp4yYtJyjsJqem66Rn5SXlJqAkqKWj46goZOLpq2wpaeinKCekpKblIWLko2cnoBjZltoZktJTEpTQkNASUc7O0Y/OTlOTVVeUlNKPk9eXj1IUEJMTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ufwqijqrGho7SplrKrpqKksqyuqbuyrbC0tMa/xMS2wMS+ysS1wMjCtau1qLC4rMDEtLeurLa6pZmrsaupmJ+ml627tZuosJutn660sqequrOnurK3srjAqreywry0xae+rq23tamnrKGXlpGlpKKil5ikr7itsrW2oJ+opJmUlZOjn7ejpKWVrrGypamlop6ampqVl6ifn5iinq6yoqaNl66ZpayXmp6lkZuOlJiahZaflIyQnJ6Ui6mpq6KnoZmeloyPmZCBhpaJlJ95ZGldbGpOUE1OVD1CQU5DOzpJQDc3UU9dXlJWUUFXYFxCSlNIV0tIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzuko5yhpb+mqK+voam1qp25r6ukqrS3sbC5trC3uLjFvcPHvbzEwcfAucHGwbqqtqWtu63Bw7e3qq2yvKKVrbCtsZalqJGquaqgp7Cdqp+vtLOqqba2rLursrK5t6y5sMG5vb6mw6uwt66oqqumnZiYqqGhoJGXoLCus6uwuZqbqZ+ZlpKXpqC2qaWioq+xs6uxp6ufm6Cgm56knKGXnaOzsJufkJSmmqGpm5Win5aYipWYk5aXnZOJkJuZlI6pqaefpJuYm5OHjpmLfo2Who6ba2ltYW1uWFFRWlRBQ0VVQDs6SUE3OlhQZF5QVldEWV5eTUxSTl9LSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRihAOGx9aFxWOol7Y0M9qJ+coam9oaqwqqOxuKmltbKroa21va+zuLy6vbe2wcO/ycS5xcPAwLjFvcG4r7anq7eyvL++tamusbefl6utqK2Xp6mOp7ufpa2znquisbCzrKq2s7W8ra+xtaywtbHAucS2q7yvsbisrKmisaWepKifpJeQmJ+yqrOpqrOZnaebmZSNoKWktK6noqysrrGnsqyyqaObn6eknZShmJuotamXmZGSn5mfoZ6QrJ+YmIaVmIudmp2Tio2Wl5qXpqajoJ2WlZaUgY+VhXuPkoSMlmZsc2hwcl9HWWZWRENOWERaOUhCNj5dUmhcTlldR1teXU5NUlhkSkpDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFWMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSaoKSst6OsqaWurraqrrS5pqewuMW3sbe+wcK1tLvFvszFucPBur+6xLjBubO1rKq6t7u6vrWqrbG2mJioq6qrm6yrj6u9nquusaOqn7Gts66utrK5tqmtrrGntbCzurzJsqq1tLG0r66mobOfmqisoKWVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxq6q1pK2wta+jmJ2tp5qXnpmZrLiimJOQj5icoZmXlKyfnZSBk5mNnpyalpCKlJKemqWjoqCZlpKSlnuLkIV7jIqDi5JrbnludXxhRmBqWklIWls9e0pHRTZBYlRpWk1cYUpbXVpSUlNiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkEvSkdQW0czY1lUS0SZl5+vqLGprKWjrq61qba0t6OstLfJurS7ur++tbS3w8HNx7zEvbe+v8C3v72yva6nurq3t8K3rK2xuZWXpq6rp6OyqpSvuqStsrGnp6Kxs7GysbWxuLKorquyp7ivtbPDxbaptLWrsK2pp6K2n56msaCklJuZlLGdp5ufqY2pop2blZelpaS3p6Kws6unsaessLWspJmhrKibnJ2blKq4nJWOjouZnaKYkJenop+Wg5KWkJ2cmJeWiJePl5qnnaSgkpaRkJZ2hJCHe4WChIyMbnF4dnx/XUtlbFxKT2NcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1QT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JrS0RDkZikraStraumo7Cys6q2sLafq7W5ybmuwbvDt7OytcLDz8TAwb20vcC/ur+9s8Soqrmxtre/va+rs7OdoKewraWmsKWesrWsq7KwrKmotLmstLO1rLSsqauorKm5rbGwx764pLmvqa2tpqitsKWjo66jqZydm5qvmaKjoqOQrJ6joJ+hqaWluKSrtLSkqquorK62r6Kdo6iqm6CZmpKktJqPiY2HkaOglo6UnqCVk4WOlJOdm5mWlIeYkpWZp5ygn42SkY6Rd36OhXx8fYeKiXF0c359flxSZG5eTlpmXUZElltHOk5tWGFbTWBiTlZXVldUWWdeUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NlOzYqSGRISis6ST8zQ0lTLD6Paz5ISY+aqaqhqLCkqKOztLG0tbGxoaytvcu6rsG7xrG0rbTCw9HExr7Asr7Cwry/uLzFqK23rLO4vMGwq7KtoaSnramopLCjq7Gqr6uxrq6tq7O7p7exsqmyqaqmpaOtuqypscK5tKy5qKioramnsaWppKKuqqiinpuirJWknZeemKudoaeooaylo62st7GxoKmin6qtsKydnqanqZmjmJiPoKeYhoOOioufoZCMjZedkJCGiJGVoJ2VmJWGlpOTl6WcnZyLkZCNin9/h4V8d3+HhYd1c3KJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9kXE5VVlVXUFxhX1NPTmhYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkowLklnREY4PEIwNUVLWDFAlFxATUaVlqynoaqynKmosLWsuLSuqqSrq73Ju7G+t8OvsK2zxMTOzsO/v7TAw8S6wLTJxKyvt66yusC/s66uq6WoqrCppqiypbStqrCurbGvs6yzuqS4tKysrqeroKKesLerqq26tqS1taSpp6ysqqyhqKamsbKkpqWhoauWqaCTmqCmnqOiqqSsop6msbesrKKkopqpqq2pnKGlpKOYoJqVj5idlIGCkIiFnaCNio6Nmo+Ri4SNmKSckpGbjJORkZSjmpuai46Li3yHgYKCe3WAhIF+dXeLo4d5a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWFVS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZBSUhElpGvpKKqsJeqqK21q7awq6Srqqm8wcC4ubO8taayr8TJy9G/wbu5wMDCucG6wsSusbWytLzBvrOyrq2rrKi2qqWtsKq5r6iwsK6xq7WqtrWmtLarrKSpqpyjnbOzqKiktLSgtq6hqairqKunoKqrqLm2qaqpqaGpn62bkaihnaCkoqaiqZ2cprSup6WpoqOXpKanqZyio6OfmZifkY6PmY5+h42HhZ6eiISKi4+OkY2EhpWimo6NmpGSkY6Tn5eYlo2Kg390h4F/f3h1g397eH6AiJ2PcHJnZ3F4XGFziGlPXZhWSG15VWRWUmNPTFVUVVFPWFpiVkhQalRXU0dQWVVJPklIT1FQeExOVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JFO5WNr5+lqq2Zq6StrrO0rqqlr6mpu767wbGvuK2ita/Jx8jRwL+9urzDvbrDwcC/r7Kzsra9vMGysrOrs6mltaikrbOzua+irbWxr7G5qriuqq62q6qeqqugo6G2rqihnq+yobSqnqinqqOqoaGsrai9r6yurKGnp5+rmI+vopiioKinnqebmamwqKKfrKGgkqGio6aYmqilmJiYnY+Kh5WIfY2GhIWkl4aCgoyHj46RhYWVoJeIkZ2Qk5CNkZ2Vl4+KhYZ4c4F/fXV4eoB7dHR7aoKHo3VpXmVsgXVniIt8UldwXkp4c1RkU1FfTU1TWmdOTFZZZVhHU2pSUj5CTlFhUTpJSExTSXFQTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytITztYQjSPjrCfpKWqo6WjrKa0s7CppLCnqri+wbywqLmqp66wycbI0MK9wL65vr68ybzCubGwtbK6vLnAs7S7rbmso7Wmp6yytrmypqe6ta20vK+8pa2ttautnKmvpJ+lrKqnnJ2qsqSzqJqqp6qkqZ6iqKipvau0r62eqaOgrpuasqKVpJukpZ+kmpqoqqWemqmhm5GaoKSdmJapqZGZmZOQioKPhX2PgoCIno+HgH6Mh5GPkIWAlJuUhZOijJSRi5GbkpWHiX6Acnp5fnxod3x6dXBxfmmGeYSIZGBoZHKFe21neV1eVkJXe21UYVBSWEtLTXB0XUhaW2dZRVZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpOwmZ+fqaWjoaqlt7KxpKmxpq25wb21sKO5raiosMPJyczBt73Atbe/usi2w7W0s7Wyvbm6vbatuba/raKzpqurr7W3tKqduruosb+yuaCvtLaprJ6tsaOcpaipop2cpLCmr6Cfq6mnoamco6igrbunrrGuoaqio62enqyll5+boKKcn5uZoqqimpmjo5WWk5+hlpuWpqyLnpGQkYyCi4B/j4F7mpSNiX1+jIeQj4yKhZKYkYeUpImSkoeQmpCTgYh8eWx9dnl4Ynt6cnBwc3hqgnRqgmdjaGFuc45tYmpwYG9BXXlrVl5OUFFKSUxTWVZNXF5tV0RYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUV09I5KXq5ifl6ejoZ+no7ivraKvr6mruMK6s62fua+rqLS6x8rHv7fCvq+0vrfEtsOysLqys8C1u764qbm4vauktaeoqrCtubCpmbm8o66/tLShrre1p6ansLOgn6Wmp6ClmZ6sqKmeoKqup6Cml6Kon7C4n6SxrqCsoaykm6amqJqam56jlZycmp2pppaanqiRl5KYnZOZlaGqkJqJjZCHfYh/go58fKGMjYl5g42Fio2NhYiTmo6JlZ+IkZWCjJeNkH2Ee3NwfHFzdGB5eGpvcHFwan9zY3psaGZkYWWHgGBbcmpxTU6AaVhaTVBMSkdQUlFITVtfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MFxbNSiWm6WYnJWsn5+hpKG3qrCjtLSpqbnFtrKuoLesra2wtcXHwLe/wrmwtby3v7u/r6y+sLO/sb3Duam7urinqLWop6uwrLOwppm8tqSrurWun7G4r6mlp6+ym6GkoKOkoZabr6ahn6Oor6GgopOjpKK2sKGmsaufrKKul5uqpKiel5qdpJOanJqdpamZm5uklJSXlJyOk5eiqaGQiYqPhXqEfoSKeo+Xio2HeoKIhImMjoWOk5iMjpaZio+Wf4aXi496gHpwcXZucHRfeHdlbWxsa2mEbmZyaWtmaV1jdIFgW2t1aVpKf15bWE9PS0hIUlVGMjldXm1QRFhWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJjViwylaKhl5SbqZykoaKht6muoLq4pay9xbOwrqO1r62tr7TDw7yzv7q3sLO5uLq4uq+uwLO0ubC/wbisvbq1paKzqqepsqutsaGawLWkp7W1qJ6yvKmopamvrJmjp5ykpZSXobKlmZ+kqKmcoqCTpJ+juKikp66mnaWhqJKfqKGhoJianKCSmpuWn6Gqm5qYoJSQk5aZjZSSo6ikkImJj4Z5hHuEhn2djomKh3qBhIeJiZGFlZOTjJCVlI2OlHuCl46Ld357bHRxbGxzYXd0aGhqZ2dvhWdoaGNmaWpgamNpZ1tle2NgU3RUXFtTTEpHSU9TQCEqaF5qTENWVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z08nMp6io5GOo6abnp6do7Wsp6q6t6esxMG2sKyjta6nrq+3wL+8ssG2sK6ytra4tratqr2zrrKxvb+4rry7saSftqulpbSpqq6encGrqKWvsqmstbueqaqrsaWYnqmdp6SRmKatopiepKmhm6Kclp+dp7alr6quoaGdnaGUoKafoaCZm5mckZidlKWdq6GXlpyUkoyVl4uPmJqpoJGIiYuIeYV3goKCnYiLgol9f4WIhoaRhJaVj46QkZGRjJJ7g5WNhnN9fWZ4b2tqa2d1c2tjZ2RkdoBiZWZmZWpqZGtyWl9ZXW1kYU5pWFtgVkpHSUtNUlg+OV9saUhCVFNcW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao5+Qi6yhmJiflqSzsaKxvbahsca8urGxpLesqq6puby7uq7Asq6urrausrizqKu5sa+us7a6trC4va2mnrWqoKCwpKqvnKLAoLGkrrCut661nq2vra2imp2nqaWelZqnpZ+ZpKKpnZqfm5ScnayvpbqorqKhmpqdmZ6jmqSdl56Ym5SZoJKolamnmpOampGLlJmNlJSZqaeOjYqJj3yCc4GBipiFh3yJiYWFioyKkoSUnJORj5CQlo6Qf4CMjYJwgH5meW1oa2lncXJrXGhjY3OBYWZoam5sZ2pqaG5dbGx0cGFVY2lkZVpJRkxNT1hRUVZhZYFVQFZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGajY+wnZqToZmosq+fuL+2oLTCu725saa2sKiupbe4t7etu6+sqqu2qrO4raWztbKuqbC3trGztbqnqZ+1qJ2eqKKprZqnvpito66vtLWtrJ+xrbCpopyco6uom5ScpqOdmqmipJaan5yQm6Orqqm7n6ekoJiZmZ2hj2uhlpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB4hpSMg25qfnaDcWyGi4Z9hIyHcF5jYWeEmIZri4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dyhGdfZGZubWpeX2GKj4OEZU5LRDlGVGdeSkdQUFRVS0hSYG90ZUZaUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYaUsJuck6Cbqq2qo73Fr6m3wri9vK2ntrClq6S3s7GzsbmtqaastKavtaKouLa2qKest7OutK2zoqmfs6qeoaSbpqeYq7qVpqWvsratrqSprquspaGfnaCnp5uXoKWlm5unp52Tn5+YkJ6nqqO1r6Ojo5yWl5eXo4ihjpKah6GHk5ygf6R/paqekpGakYiEcniNjoWIoXaIjGmXiGZ9cnihb4iHhH6OfX+hoKCZgHyHnnSHjnabimyHgYNsaGVjemtxYVOFbWNsaZhxWWpxb4dYXmlba2tbiHFuenKFZ4aEWl5HTj9HX01GUlZWUVFSV1RnXk1XSVJTT0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiLppaDnKudmZidn6qqp6q/w6+xur23wL+qpbewqayms7SurrO3q6mlsa2ltLOcrbW2tKanqLOxrbKorp6roLKooKOimqGjmq2zlKOlpbW8p6ynq6qtqKWhoJigpqOZmaWjpJicpKmWlKOclJOkpaaht6OjoKSYlJOXk5uIro+YlImpi5ehm4WxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5oem5yj9h+U2pitrJ/gXKVdJqhqpBXT1diUFZORlRbWFFQUoxcV1xQQFxEUU5ER0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaSgKeqn5ecnaWtsqixwr2ytcC1t77Cq6azrKypp6+zqa+2tKenprSlp7iunLOytqqlpKexrq6xpqqep6Sxo6Kfnpebn52uq5Sdop+zuqOqqaKtrqWhnZqaoaefl5unoJ+YnqenkZynmpOdoaaioLCin5+jlpWSmJKZha9qaoqNqn5ng5WGrWRwnZyTmaWUca6hpH54u31roY92sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5nfKSngllfi6tpgJZ4eWqnN0qvXFhTbGRbS05XX1xXVjtOiU9YVy9JVFRJQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsp6Weo6SqsrestL2+sLbEsre6wqapsKuuqamwrqOwuq+jpK6yo6i4qJ6zsrCjpaCqra+sr6ann6OisJuim5eVl5ubrKWWmqGes7Oiq5yira2gnZmXoKGonJmdo5+cmaGmpI+do5qXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl2hrObt36TlZaolH5rgaZ7goaIkpSSd6tna7Fbq3uPh5R0iXGPhoB/iJCXeIKCi5iMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5WFhBI01oRUJFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WHs6amoa6pp7Ksqbu2wrC7wq24t8CqrK2trqatsamhr7yqoae0raOrtaSms7Ono6Kdp6qyqLCnpZ6fn6+Wn5iUlZWXnayhmZmkqLSvoqmPqaiqm52VmKClp5qfnKKfm6CjpKOVm5+XmZ2iqZulmZycoqCXk5GTkpyD1ZOZuXCwwn7FhnzWlJu7fJmVpI+NnI2ke46Ho4KlgnqseY+dVq96iH6farlauXaHhH2mgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKljdHKIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObU1bUk9ZZllDRD5FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KTmLGoqKWzqqW0qaS8t8GwucCxtbS7s7WnsbCjsLKmn662qJqnua6jr7Ggs7SwoKSen6epsKm0qKScnZ6ql5iXlpeVlaCqnJmWp62wqaOej6yiqJadl5yhpaGYoqGhoZqhoqabnqGelJmbpqCcp5Wbm5+hmY+RlJGciLJuaLVxq4dujqZytHNytnuZl6OLj52No3+RoaV+sHaDkdLRdlyue4V/pG+bqqZrh4V9rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa19saE9VR0k4PVZRWldYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWvraSqvK2mtaWntru8srq/t7W0urqzpbS0obGxop+ssKSXprqupLGwnLS4qp+mnaGppLKorKmkmpyaqJ6VlJiYkpKip5+WkqWqsKailpOtn6WSlKCbpKaflJqlpqGaop+tmqCenZCVm6GenKWVnZaZop+VmJWRmoWse3eodqOOiIapb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9eIV+j56GmZl3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV93d4domIhrXa93lZ6PeGw1eciusl9CU29eZ2BFUG1fcG1WVU0uZWNoUlhRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnZSfuLCXtMGtqLOoqbK6t7O3v7m3srW8taS3s5+0rJ+fqKyflKe1q6ixsauttKSbqaCgqKG2p6apopmdlaWhk5KbmZKUoqSakpCmrK+moJWZqZ+ijpGimailoJWapaidnKSerJ2hnaCNlJ6anaGYmZyWl6Ggk5iQpp6GqX19pXihj46DqnCti4GnhpWfoYiXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aIdKiCjpuNkqN8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJmTVthX3J0X0pWNkqbk1hIRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84oZ2Zmb+rl7TCrqytqaa0sLextb+5ubKwt7upurSfsKSdpaennpOqsKmvqbWsqq+hmKGgpqWkuqKjq6CXm5GioJSTnpqUl56fj42LqK+vpp2Wm6imn4ySpJeoq6eUl6mnnp6go62koZ6hjZWhmJ+gkp2XnJWdoZWWjqubj65tcrRyqYx2iqZztHhzs4CRpKKRnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytX02hfIeRUnOjbXp/fm+Yh3Fcr1Y8nHdlVG9uLlynT2NSa2VibVpjXWFwe2NTWlE+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam527oZyywK6uq6unt6m4r7XAtbywr7m4q8G2qaqgm6ajop2RqqqotqOyp6+qoJecp6Ckq7ido62blpmPpaKVjJ2hm5icn5GTlKu1sKeZlJysqpeMk6WZpa2ikZaqsaSfnqarsJiho5CZopafm5acl6GSnKmclJCqmYfUkpq7c7DDgMOGftWWm7h4h5CXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2VgaypcXt/dbyIp6BpnWGmjq+hfox0h6p9vm5zvHSyg3V4gYpumohxbo2kdL1ed31bYXm8a1pWW2p6XmphZWdibXdvWVtZQ0FAckBDRys1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56hvKKXscOwraqqrLGnuK+2xLG5sa66r67Asaukop6jopybkKmjqrKktKatpZ+WmaqZpqy5naOumJSgkKWgkoyco56XnZuQlZKvubGslZejp6eTkJaknKStnpGgqKufm5+oo7Oeo6WOp6KUoZqcmJWjmI+woJKUqZ6FkJm1gJCRjLeVeIKTmrV3bWtuc256j4SOiXSewbu9mnuBsqhwgHSRuIN8hoaMho17ioeNl3yku7m9nHV6s6N0dpd1dLB1mZ5mhmmNtXRycHe2jF6Aen2KaIN5bXlji6xwdYV/WlunakVlWlRmYGNdY1FnZ3BsdEJNUExEOlpNP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPjs8p56gob+llrTCtKyqqKyrqbuusMWutLKut6e0uK2poqGlnqCdmZOrpK2pprWop5+blqCjnaykvqahqpeUnJCim5GPoqihk52Yk5eUsrW3rZidpKSiipKSppulqpuWqaSlnJqhqKamo6mhka2elqOel5eXnZ6PsKiUm6ehjmp+aZymeIdyfZqOdHpkh3u9vsC6b5KCcZWHYHJqWl6bimFjiI6Va2B/lWNtnXdilWuAmpWUZV5gY3GaimhyjH2FlWdqfnJ0eH19Ylt3dIFoUFxuhH17i2tYbHqCc0lKb4ZwTXVNRVddZ2FMWldnY19PW211anFST0RFTjtISD1MPzItMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqigqKHCo5q0ubajrKWup6i1sqvIq7Cyq7SjvrGypqCiqJ2jm5mZrKavpKW1qaWbl5Whmqatqb6nqKaVk5uVoJqSl6SpqJCdkY+YnLCyv6ybp52nooiTkamaqKOam6yfo5mao6esop+ropqxm5WnoJeVnZ+dl7Gkl6GomZyRnZyipJimopqcmpqZj5WBZ219cXeSl5SRhYu1qo2GmJWOioyYl4eUlYqEkpSRiY6SlJiUmJeaoKKanJShno2CeqSGbGp8kHyAdImKgXGCeHl2douAe4prc4F0g3Vkd313a3B7bWBjXXBoTVhaZmpgV1pveW5tZlNPRlM5T1lNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOhv6GksbK3oKmlsqelsLWqyKussKW1psCntKCdpKSco5WVoKqmraOjtqufmZaVn5atqaXBnqujlZKcl56Yk5Sin56ip5ORmainssSvmqucq5+QlpaonaqbnKCsmKGbnKKkr6ahpaifrpiXp52ZmqCenpyvoJyhppWYkpiToKGVo56XoI6Wk4qKjY6WrY98lZuCkoKLqqiGgZiWioSPn4h7hJCHhZmSiIaKlY+bl42Ql56jlpqTkZ6Nf45mobOvhYqEdnqQinx2eXpvZnqRgYCJa3WBeYhzaHN/enWDh4JrdGR5ZmBpZWNkZmtZa3twaWpcU0xQRF9URUA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r7+sq66ysaCqprGtoqyzsMSwqqujs668o7Sbn6aioZyZl6elqaakpbO1npWUnZmZsKauvqCropCRnZqZk5GVoZyXqJyEnqqrorPIs5+qpKuWlpeap52omp+kq5Oenp2gqa+ppaOroq6bn6ChmKSenJ+dr6OYnqiTmJeckaSZmKidmpdlgpJ8ZX6NmY9jeY1saGt7kqSqamWamH5nhoplZWloe46hj2tojZeRondraouYo56Zc2xueoSNh3pYZV6Ggl5si4mAdlxoc3d3koCHgm54gniAc215hHR3iYiOg3tphllea3RkXXOJaWp9cWtjXlJOV0pkWEFKND1GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsKqlqK2tsKetrbC8samnpK2vsJ+tl5+jnaKZmaarnK2jpaepsq2elaOQoq+mtrmlrqOOjpqhmZKSm6CZmaWVe6WtoqizxLikoaevnp2UnqKeo5yjqamSnqGdoKqwqqukqqCqm6afqKCslqGbpbCkl5uqlaGem5Kll56qmJ5+vYOHcrRyhJ2FrWh4ucS4cZOio3qmmZlzqoJ8y8DAu3GLooiCn32VmIidwL2Clp2djZ3CwXuCfJKNmsPAfWulsm+MgW/Ken+bd5KDjoF2eoGAeXF6f4dxeIWNk3ltd5RjZl95ZGBlgmNedGhsZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7nDtLCvwKmolKOvqbCuraaytK+ppaamsaufq5iaop+cmqqnop2soqWopaS0pJ2ik6atq7izp6+ikZGZnaWSkaChmJufnYenrKSrrcDAsaGpr6mXkZ6doZmio6qjk6ChnZ2trqmsp6Ojp6GlpZ2tqZKkmqitqZucqZysoZaWpZWhopecf86UeHqkgXiUlptfro9ejqeBoqB8p5abdKuCgK9eY42qeqeHhaB0l5OIs2OCq4ahjY2zaoSvdH2XiLhhg61Zo81tkHV72nt/mXB+h5J2fmV7iHZ2a3yIb36FkZJ+bYKPYHJscGdgX3lkXHFoamNmYFJUUlddS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGkqqits6ulsqysq6SrprCqoKebmaWXnKKvn6CfqKejpaGesKybnZWnrq2xqqisoJSSm5+lk4+fpZidp6OerqSrsKjAxrOoqbGulpKdm6GXn6mqn5Wgn5ydra+nq6mcp6ikoquTrLOXpaKqqZ2jpqWhsKCSmaaZoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xyrX6rh4afdpiSenyXfqqIooyRjJ1+q3uJlI+fgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+Ki5KQg22SkGZwdXVwYGdtZV9vaWluZ2NXU1xhWVJTQzhJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytKCdo46jo6Ksr7auqLGmqKqnraurp6KjnZmilaClqp+hpaCoqKKfna+smJqWqKevrKimqZ6XlJqjopGUoa2bnaajr6yjrLSquc2yraatrJaVnJ2imJ6urJ2WoJmdn6myqaqqm6yrpKOsm6+xoqirrqWYpaqpqbGikpajpJqUkoWkaqR1iXqpdHqycIKmipmMcYigmoekYGBSq4R/roObdq6BpoaGn3qZloZ7ZoCjiaSZhoKkfal/gpWHrl59qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojYyYj4FtmpRwbnl4eG9sZmVlcXBmfGliXVdgaVhYVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwr6mtoqemqqurqaSmoJuknp2mp6ajnKuaoqyhpJ+vop2bk6qktbCvoKmbnZaUpqOQmqKooKClnLCmpKixrbfIsrWqq6mVkZ2copifpbOdmqCUnJ+nrKykrpqtqqOiqqKzrqKqs7Ghmqmorq+2opKWoqeYm5F8qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfX5Spg6OIh6B6mJWaeKrJdJmklaiqkZOajICbipnGxnhmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI+QnpJ8cZeTgHF7dX57bltmanJwZYFqX2FYZG1cXllJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqbOtrKWinLK5rKqhppqopaqrqqegpqWYqqOfr6udpqCsmp6ppZ2ntZ+il5OpqrayrJylnKCVkKWskZmcp6OgqaauoaSnqbC1wrKzqq2ok4mXnaSaoaOuppihlZicpaarm7Cdrqimn6ykt6ygsbmvnZuup7Kzs6SUl6eimZ+Ogp1OeJqBf596g6N9g6SEhqaenJ6ThLh7fHm5gn7MxsK2eJuhkYuffpqWlop2npiKpJikqX+whZ2Fn4SsfZqUYqVspHCPhZCBfZaCcqxgo3NxgJpgvH1SVXWPkqSXe36Tkot1e3OFf3FcbW54cmqBb1tkX2huYmRdS0xRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq+gm6Gss7Oln6CVpa6trqqnnaammqOnobOuoqmmsqCZqaSUo7aiopWXoqm1uaObop2ik5ChsZmenKeloaKvrp2kqKK2ssSxramtqZGHkJynnKKknKWXnpiZmqakqZqvoq6lppivpbytoba3rZ2dtbK4sbOml52voKOdhY/RtcO3eYeOhZGTkIGmeJShd4ygkYSlgYpxqoaEtG5yapmjm5WKnnyYmYaHj3OvgqWboo6mi5OdipWQmm1wslylc5N6nGyZf3uZfG2pYaNxcX+fYnOyuGh4kJSmmH2MjZSNeH15j4JtaXhpeXJugHVdZWRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q0npanpK21oaKZlaOop66rrJmmop+moKC1p6Kpp7CjlKyjjqSuo52QmpqqtLSknaScqJGUl66goJ2npJ2nnLWaoaqktqzDsKmrqaGMhI6coaCmopWampyYm5mmpKaYrKiuo6Wbraa+rJS9sKyforCzuau0ppqosaOnl3qokH18sHeKgaSliJxtsm+gh618oY6Dp5WYgKyIha6Fn5SpoKGXhp+AmZWAe5J+q4CdmpaLqnidn5CJk5KAea9do4F9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWSppmClY6YjXt7hJh/a21/Y350boB6YGdlcW5oZ2dDWmFbPktUM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVldXWFZVVVFIRklKIygovZKag6nGwrbBs5+arKCuuKWjjpuko5+wr6qfpJ+drZmeuaCjq6CvqZquoZCrqaSWiZqQrrGspp+mmqyXmI+soaGdpaGapZ2tmKCoprapwK+lqaSfi4CNm5qfpp6SlJqalJqapaSkmqmsrKSln6qovqSWw6yqoqGrsrmqrqegs66oqZh2r36Qi5yFh3y6roqYZbCMZZWtfaGPg6aVmoGsioSwhaaZpKGhkYWgW2xqgbNgf617e4KBsWxnb5mYjIiwW320W6SDa8iiZJ+Ae7xYdrRasn1SroB6rFiAoW6YkKibi5eRmJh8eY+dfmR0fmKEeHSAfGFqZ3FtZmVlT1VkXEJVXz5KKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBgYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpcXFhXV0dCO9Kfs7K3vbq0wrOjm6ympbaooIuaoJ+cs7Opn6OgnrWYoLSoqqydr62erJuVr6iijoibjq+sqKeippmukpmPqJqhnaSfmaSjpZmfo6qyqb2vpaienY59i5qVoKCZj5Gam5Kal6ifoZqorqimpqOlqbueoMampKihq7S1rK6mnrutrKyVgKmSo6+Om4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+g2ujgW+rhGycf3qysMeDaquwvax4d6K+vHSBlo6nnJCbkZideoKRm3pjfXtkjmd5gntgbGVramJQYVpTalxAVWFCTio9OjQvHh8kHiUyIB0kKDA0OTY2Nzg6PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbO0sb+5sb2yop2upqWypp2MmKW/qriyqKG/pqeynJ6xnLmonq2vpqaUlLCsl4yDm5GupaKsoaOcqp+Yi6OSpp6nnJqhqKKZnqGsraq5rqijm5eSe4eZkaabk46RmJiPmJOomqCYqamhqqeho6q7nqjEoqCuo6qztKqwqaC6p66umnN1qqS3hmWJoHBnrY+Kj21vd6SQmZ+Bda6YlHCPi3GVqKObl66kcm1tbWWKeG9ugplxgXpqcWlniZaVmHFpaYSHZ3CGZF2IYmpvWVxnfnemX2FxjpFuZWSAjZOPopiZmZGYn32HkJV2Zod4aY5reX95ZGxjZmxiS2RYSmxaOlFlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3OTw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6m5ubKzqqmhrp6jsqmYkr6yxMm+tqqewKyso6GorKC6o6SurK2mjZeuqZCMhZWWrZ6mq6Geo6OfkYukkqeZqJmWo6qglpympqevuqysmpuTknuEl42lmI2RkZiUjZeVqJWfmKmjm7GmnqKruZ+vwKeksqWssLGqraunt6Ott5aKoKiltp2JlqKYh6makJSdkqmzmZujq6CxlqKgnZ+inKCloZWrp42TkoyHk5yclZCak5iRjpWFgaSal5WNi5OSio+GhH1niX50gnZ0h4txp2x6lJGTkoGBjpCQj52VoZaamKKDiJWNcmmQd3GLeHd8empsZGNvZFVgWEBqW0hjYU9aK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVVlleYGFjXF5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbaurqKwo62foLWxkI6sx73Fu7mroqaem6afsaijtqedqbSnqJGYrKKLh4mPm6eWrKWgmaeenpKVo5eomqiZlKaho5Cap5mhtbuoq5makI17gZSLoJSKlZGVkJCTl6WQn5qqoJy2o56nq7enrsGuo7amr6+wrKmps7igrryZkaWkpraikp2mn42pn42Sn6Osr5uho7Cor5ejoJyjqZ6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2UioB9ZouFdYZ1eYiDc5xqhZCUk5CJfYyWkpKXlKKTnpiihImZh3tylnN6i39yfH9qb2RecGphW19ZbmNQYGRQWjpHR0U+Mj09OC8rJispJh0mNDA2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVVBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX19hYWJhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaatoKe1qpCQnaW0vK+traKjmnqdorGkpbGpl5u4pqOUmaqcjoaKiZyjj66fopWnn6GSl5ibrouqlo+omaiMmKmPn7m2paaYm42IeYKTi5qTipWSlJCNkpeijZ2eqJ6fuKOAhK+1oq+vdaS9o7Kgd3mgqrK6lHWspJ6JgKp/ZFxidqCOpJ6El31uk7Odo6etqqNlnZ+Sc3mZlnCAmKiXbH+ip4plnKWckZeYloySnJGGnZqQlYOSh4+OkomEd2qOhnaGcHuGgYBhaYeKlJKLWnWVkWhoj49ze6aamWV5mYeDeJhqhIuDb3mAa3FlX3ZwbGtoXGdlYmJwU1w+Tk5OU0c+QFREOTEvHh8mNDozMTY2Nzg8Oz5AQUFGSEJHRklLTVRUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5gX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6GvsayrqaWprqOnraSSlqu2sLKnm6umrJd0jJ2vn6iqp5OXuZ+gj5yknZF/iYibno2rmqKVp6GdjpaRnoR1ro+IppqokZekiZy6tKigmZiLiXV3k42Vk4qUkZCUjJCToI6boKaZnLKWgIybtZ2zjJKPvKegfqeieqKutoGOjqaeg4uGkLGpr4yKlqOaeYCLrIacnaKnqaeHlYWYd6WbeoebgZengoJ7nLF6ioagl5mUmJaCkZeWhJqZY3mHkISOj5GKg21wjod5gHCAgYV/hnSGhJWReJZoknSgmnR9mYSinoeYf5OLg4SZa46OhWx4e3FxZ2R4b2psalxma2pldFxfSVRMUUBFNS5aVFU3KSEwOT0+NjQzNTY4Ozo9Pj5AREk/SUVKS0dTWFtZW2FhaWZZUUg5RUs8PmFWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mra6rqKygqLGmp6mlmZSuyL6xopenqbWej4SdrJynoqCNkL6emo2fmqCQfIaOmZiIrJyhlp+gkY2TiYaAkaiNh6Kdo5OXnoafurKnnpuSjoVwdZCJlJCKlI+Pm4uQkp+Sl6Cklp6rh5+0ibSarYrKh6quiLeFjK+CsK6DqY2lmI2dfaiPcnt3nI+nlmiVpHm0jJ+epqiSmMKBf6uImKFynoCapX2XhZWxgKF9oZOgkJiXgY6Tm4qYkYt8hZOGjZSSiYNtcpCFf3lxhoGEfIR1hIGWgI/FZn+ph4+ja56Do5uEmoGOjoaKmXGOk4Vod3R8d2hodXFoaGteZHBtZ21YZ0ddUk0yRTQ2TmFjNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmptXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKepqKaroKS4saqrp5qUoKOkq6SXpaq3o6+AoaecpZ6diZS9mZONoZKej3mElpaRiKuZm5uZoYWPjHebnI+fkIiepJuVmZiHo7mupZqcjIx+Ym2Pi5OQjZCMjZiMkZKfj5SgoZmhp36hp4etnaCWrY+enJ2RhYCgjauuhqONqZmMmn+jdYCZlGuCrHVNq3iHjZyRm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefm5gZFmDl3+Me2Roi3KZfXmVbF17lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhaBpZqBtW26KfGZaYIN/YldQb3dmbXRya2pvXmtwbWxpWGlPXVhGOUE0R0ReazQsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5adoLigqqSmrJGhtbysrqKZmKCipayuoZ2utaKokqGgn6abmY2YtJmQi5+MlYt1gZSSjYqmlpWYnp5/koWGrKSHm5CKmKmYmZqSiKaxp6KWmoiJgGluiIiLjo6Ki42Si5CSooyUnqCcoaR/k4GPo6GUoHeclo+ng6Gnf4aprISleIp8hJp+onBzlIiWe56MeW2Hm4yZkJuomo+HnXuConN2pmaefnekX5h6fZJzom6Yt7S6dJOHgn+1qGSBxrh7cJW3i3GAmqRic6yrYH1pnbN+bnyGgo2Ci5hxf6NscqN0noSAo2CdmbOWcXyXn7N0c1uesoNqYm90dnFpb1hrbHJyZl1pXmJLRT1ENlFBWXEzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1OUUBFX15bWVhgYHxkSEM4TFdVVmNhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe1rq2gm6Kdo6Omrpybsa2sk5ihmaGkmZqUnqubi4iSeIuFcYCWjYmPoZCSlJ2XfZCJjqigh5iOipGjk5ybjYupqKWekJeHhX5re4d+fY+Ng4uQkImPlKCDl56gnaCei4l3nJiijJ9yoYuHqIibpY+Wp6p+rYx+eqCZeqOTeIF0loiNnH2Vn4abjpmbpoaiZKF8iJaQm41snmiajW6amXuAi6d9cmh0q4Oeg3SqaJWaXZuFdoSdaKpqgLhmXKhwgZxglYxep3Z1h4l+nmiadYaTkpeOf59umpBtp5pdqH54u2t+qluOhF2zZ1xucnp4a2lccWp4eWNgZlhiQVFFTzdWQ1JvNUtaWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXVllZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniGOUm6u6srCsnaacnKmfnq6bnrCorJ2XpJqhn5iWlqCjmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJajnYqUj4aLnpKdnYmQqaOgmoySioCAaYCGeH+XjHuIjo6Ij5aaf5Sin6Chk5hyaJ+Kn4+McJKMgamHmJ6ip5+nfK+to6K4l3ejs6KkgIiUeZ17qpp/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn90qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcnyObYCIhJl1m3iGibGzf3+bk6d2gp1uc32Ub5lza6RdlXZIZWRhc3F+fm5mYGxpdntkZWJSXlddVVdAWkZRaERTV1xiWF5JRD1COD9COklGOExFWEFXUVtWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk5yBsK2ZhFReoKazubOzqZqijJyrnJyplKKrpKGoj5+enZqZlZihnZaIh4l3hoFveZWFkJuLfJGTlohyf4iSoZtzkZCBiZmVoJuFjqmcmpWLi4p8g2yEhXGBoYx4hY2IiJOYlXyTo6Ceo4ithn21hI6enHullnqpgZWcj4qgnHynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpmAo29eqGd1omNvpWGc05B8e5l4cnNjooaQfqNzpI92a5CzjGCCmIlzqrKovH93g21+vqaptF6cbn1xl25/cqJyXaRnc6ZhaKZtm9SZfYWbcHp6l2ubfHiXc26ppGdhZXlwgIRrZ2ZkbnV3Z2BjVFtmUVFiSVdKVGBXU1tlalxlUUZDS01KS0JLRThPQFFOWFJZT1NRYWZlalJjd3l3SUZFY11lWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7CrVFxLfqmvsbSws6ObmYWZqaCgpI6lqKCYqYqZmJiTmZOSoJiOh4Z7cH2EaH2Pg5SagXeQjo+Jb3+Gj5KSbJeTfImRkqSWg46qmpOSi4WJeoN2h4BugZ+GeICShoeZopd7lKOkmp+Js6Gitot6rKekrqVwqICakIWAm5F7pIChmYaYcp6Eo66vipeMf4ykjZWDraGUdrS1tcmhc5SKgZ9gnZepbXmVhqCbdaGHd6B+kpeLgW9MZqOScJuHcqR7enRhg4FrfqBrcWRfnHF9dJdpemmztbTGpnOYfnqda5ybq3WEm211eJhpmnp1mHJQRX20Xmp2a3mHZmpoYnR1cG5WXlRZaVBTaElWTVlTVl1oa25WZ1dNS0FJTUtISk9BUUtQZWNpbWV1c3N/eXxudYl7e1RQTmxeaFtraVJqaGlsZ2xmY2VfXF1cXmliZGlre19dZGhjamZvbWVpbGWhnIivpoRmP5Shs6uvr7aiopCAmKqioqWMpaednaaCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1joiMgWmEhZKCjIWdjXqMi5Wmk4OXqZiMkYuBiXqAfYt5cJChhnmBlYeJlqCVf5Slp5yWloRmbnicbKJkfHGld5uYcGemgJaLe6R6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmranWgbW6mX5ppi5BoloealXWigH2aYIyGjXVviGJooGWefmmadW9jZoiCbXKiWl9bYqFtXYmMb3t+c3JkpW13omRnp2iZc4yZb6JvU4mQb6BfZahUi15UmG5tc2tygm1waWt5c2tvUllXV2daVG1JWU9dSFhpaXNqWWtWUVJFVlxMWFNhVWlrX3d0en1wfXxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrYmppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66kqbCxpp+LgJirnZ+mjKKhm6KigJaYk42aj4uYkI6Ke4ZxgIhoi4t8mJtzdIl9kHtkgoeViomWmYJ8iIeWqJGBoqyRhpCKgop+gICOc2mPpYR9hpSNiJigjoiTqqadiaZ4lZt+pYiWjLKYnpCCr5efpXeUh3mpdKSOhJpupKKMkoSMg7tufaWvg4aGhpOVnJ98pXpxqJWglmaefm+rY5aKlZJ4qGypooGJdoiDd6qRpodqkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5/jKWedp99hKSVnaBqm4h3rGefrYy2dHe+jaSTWYOmjathdXJ0cHx1cWNqfm5obFNXW1ZhYl1rTV1SXUlebm52YFtxWVtgWmd0ZW5vcWJxdGB3en55cnmDc4R/gXt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnainrqSZiYOYq5qepImbpZ2pnYWMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGk499e4KFmKaOf6WmjoGOiYWVdoKHkm9si6mAg4uUjomcn4mMlKqjoI+AdZSWiH6BeZSuo3+Bm3GPhXiPioN+e3KmjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3p9iWuMhVt5eHJ6cGhufpKJcX91gY+Uk3GGhIJljH9egX+Ld3VzlHVveW5uh22EhV52aHiOZYCAhY2pm310fJZqiYhwgXZ9hnZtbWeMc3l7mHiFW2tYeY9pbndycXB4eHBdbIZuaWdWW2BXXGVrY1ViVV9RX3B4eGxrdmVqa2t2fXFydHNhb3VidHuBeHV5g3WAgX+BeYuFg317bX9sZHhuXlduZ2h1a3hqaWplXGBaY2lmbHF1blpbYmtkbGx5bmhsb2GNlLiopouhopqmpJmlnKujoYSEmKySnqGJmqaaqZiDgZuKfpaTh46KiY1yg3yPfX6PhXuXjnNyg3CVhXt9kouGhpCFeH2AhpmkjnynoYuGkJCFloOGjph3coWphY6RnZCInp6IjJuon6Cqg4mNlJp+fomWraiPkqaPd2+ckIJ5kW99qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgXZ0gFhyboaRgX1+jGpdamR7hYSJgGBpeHqbe4KLgnWBhYJnd4qGa2FwcYF2XnKKgYiPppWFZYyPg253i4Rxho96cGZnZXuDepZbXGpnbnZbe3l3dW5zc4JmXG2Ka2tiWlpfWllscVxfYVpeXWZ0fnp0b3Rja2tqe31ze3h0ZG11aG18fnZ6fHt6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzeW9oam1gi4uqsKGQo6Ganp6Ynpmoo6J+g5mtjZ+ViJyikaWVf3uYhHySmYmIhoeKc32Bi3aFi4GElopxb4BymIaEfpOEg4aKgXqAg4uboJCCp6GHeI6YiZWLi5yXhYN6rIKRl5mUip6dh4ihq5+ioqOLiJObnKOZlqqhp6agkpuHlY17d42OhKd+fpKRkpOcsqablZ6QjbKTl4SljIyVm5+JkJuCiJGKa3yNd3hlgoaQi3yJnYSHi5CIiICEhJB3fHl0maGIhomeioSUfn2KgIB1b3OEg393hoaKj6aQg4WNh4ONkIx9iIyKkYN3bIKEfXqZanJoYXSKcH16d3dvdnSBXV5vhmhuX15aXV1TaHJVY1xcYWxodXx8c29wZGtqaX98bnmAcWpwcGxngXtygoB4f31/hHttgoyGfHp4fH16g3lOZHZqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnbmel6KhmJWYmZSZpKGefICaq46ejYagnIueln15lIN7jpmJhoSEhm54gIBygYd+iZSEbWt+epeHhIOQf4CGhIZ9h4SOm52Sh6ufhHKLkIaTkYudkX2Ne6qEjZKYlo+cloeGm6afopqdhYORmpmYkJqmn6WdnZCWgJCJdnuHjoSle3yOkJGGmKqhnZOdj42qjpGAnYyJk5qego6XfoaOg294hXJ0YH+Dj4Z1i5iBg4+ChoV+hYOUbXl1dJKhiouFmoSEjHN/iXx8cnJ7h4N6eIqOg5Kmj4WDjoGDiomKd4aJiox9b2x+gXxuaGxtZ196f2h9e3Z0dnV7d1xfcH1udGBjW11eUWduVGRaXmJraXZ6fnFsbGRrameAgGxzgWxsdG95b4V5boeAdoKAfoV2cYKNiH57e3x/e4KKYGl8anVoaYJlamNgaVxjdWhvYnRtbFVjcXllcHp6c2VqbWyLiZ63mqGkn5KRlpiLmp+fnnt4nqeRnIqHpZSLmJl5eoyFfImRg4yCgoJue394c4GFfYuRfWtofYKYiYGIjnx9hoSHfY+BkJubkYmonIBwjIuMk4ehooqFjHyokYiQkpeTlpN4jKOgoJ2WmX+AkJqYkoyao6GjmZeRm36NhXiAg46GoH9+jIyPfJikoKGTmZCPpo2PgpqRiZOXm36Tkn6HjoF0dIJwdmB+gI2GcYqVfIiMcYx/goWGjmd3cXiLmJGPfpd9h4pygYZ7fHF4eoqEenmQjIKVpZOLhZB7hYaHhXaChImIe2ZyfH95e3FsamZffnNofHV2c3xzgGpeYHN2cHdkY1lfXlJraVRkWV9haGp2eYFxZmtkbGhlgIFrbX5ob3FrfXiGemuMgXOBgX6BdHaCjYZ+fHp/gX1/j2pyg25zaWKHaGxiX3FWdG9tbmB4aG1XanR2Y3V6e3Jiam95iY2espGkpZ2OkJiPhp2gm518dqWhjpiAjKKKiJqWeHuGh36DiX+IgoF/cX97dHaChX6KkXhnY32Gl4qCiox4fYCNg3mWgZWYlo2WoJt+cIyCkZSGppuHjYmDppWFk4uWl5OSd5GdoaGXk5Z5fo6Yl46Wmp2knZiSlJt5j4WCd4SWjZ1+gYmNjHKXo56hk5mOj6KMi4OWmIOSlZl/mIx8iI2AdnF9bnpkgHyKhXCGk3+QgmyHgoGAiYRldW97hpKXjHyTd4qIe4CFfHtxfneIhXmEj4mKl6KVgYOLd4iEg4J3fIKKhndgeXh9dH94Z2xlYX9pandzdHV9cXxiY2FzbnRybWFaYV5bbGVSY1hgYWlrdnmGcWNqY21laH2DbGh1aGxvaYB8gXltkIZxgISDf3R8g4yBgH56goN+fJBtdol0dG1limxqYmN1VoRpcW5geGdsYmp2cGZ5fHlxX3FshoWPnK6XpqiejY2Xh4afk5eZfXiqnIqZepedi4yYkHl7gIt9fIN8gIKBeHR5enR9gIR/iYuAZF59i5WHf4WHdH1+in99mISXlJeMpKKYf3OHe5SSiqePjI6KkqCRg5GQlJeRi4GPmJ+akpCQc3+NkpSJnZ2eppiYjZWWc42OimuFl4+ZeoeIkIlvl52ao5OVio2ejIaCkpx/kpKVh5mIfIqJgXlxeWt1bHx+i35thZKClHhwgoN9fop/ZHJpe4CWl4R+jXOPiIN4hn12d398hYB8goyEjJSkj3iEgnSJh32AdHaBiYRvYXt1enF9b2JvY2R7Ym5vdnN4d3N0YXVgb2x1bm9cXF9eXmteUF1YY2FobXR7iGtfamZqY2h3iG5mbGhqbGiBfHp3bpCIc4GEhH10gYaJeoN9eoGEfX2OcnqLeHhubIdqaF9pcmKHaHFvZXZnbmxheWlrfXt4cGF3bYuAmZmqoKOonoqKkYaKnouVmH53rpmNl32fk5GWlIh3fXuKfHuAdnh/gHB0dHtvhX2BgIp/fGFbfo+ShoCEhHN6gId6j5KIkpGck6WclYJ9gn2Oi5KkiY6KjZeajYWRmJOWj4qIjJKck4+LjG6Dj4+RiJ6ZoqGXlomWkG6ImYNmhZiOk3qIhJCKcJWalKKSkomLmYyCf5CefZKPkoyZjnuKhIdzcnVrcG51e4t0boaQjpJxdYB7gYGIfGRwbHh9mZN9hIh0kIqAc4d5bn99gIV7hYuIhIyVqIx6h3x+i4V4fnFwgYaEY2h5dHVwfGJfcGFrdF5want5eGxzcGV4XW5sc21zWFpfX2JrWlBXWGVjZ3FxfodmXWloZ2JncY1uZGlnZGlogHp3dW+OhXSBgoN7dYKIhXeFfHiDhXqAiXd/i3t6cniDamtfcGh0gGpyb21xZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqBkJ2Hk511gaqVk46HoY2Vk5CAdHt2hXh5f3Jze4VrcnB6bYp2gIGHbnFbWH6RjYiAgIB2dYCAf6CGkYuSnZihlZh4ioCBjYmcnoqPhpKXloWJlZmPlouLjY2MnYqNj4NtiYuQkIqdlqGcmJSFmIdqhKOCZoWdipB+i4OLgXeTmJGekZCJiZWNf36PmHyRjY+OmpF8ioCCbnVwbG1vcHuFaXODjpiKcXeAdYKIgnhmcm51gZmOe4iEepOReXaHc2+Ie4WLeoqFgoiOm6OHe4N1gYt/eHhvbIGEgl5ydHJwcHhaXnBgcGpeb2p9enBtbWpsdmBwb2pxbVpYYWFiblhRU1pmZ2N1b4SCYl1rbWRiZmuSbmBmZl9na4F1cXNwi4B1f4OAeHWAi4B4hX93h4Z3g4V8h4x/e3aKf2pxY3xjhnxucWx0amhvbHZ4X3F/eXx0dXSAgn6klZqtnqaWhY2Ef5eUg5CgdYuglJOGi5uMlY6LenJ4dIJwcoVzcXWIa29tdW2IdoN+gG1uVVGBq5WHgniAd3KCeoKggpKCk5OYnJOaeJJ7g42TpJqTjomVmJKEhpeZjJSLiY+PiJ6Ej4p8couFiY6InJqfmpaUf5N+aIWch2eFoIeShJGCiXGDkZePm46PjIyPjXh7kpB6jouMkZaMfIh8gGt2am5rbGx7fmF6fo6Wgnd6gHiDjHx5Z3Nsc4eVin6IhnuTj3F5g292jHqJi3qIfYGLkJ6dhHx7d4KLfXdxamyCg3pgeHBubHJ0Vl5vYnJgX2xueXBob2Zmc3RocGthd2VdVmZgYHJTUU5cZmVeeXCIfF9caHJiYmVmkmpfaGRbZ3B+cGtxdIp9dnyFgHR1fox5e4aBeIiDc4aFfo2Ng3t5lXhmcmqDYIh9b29remBqbnR/dV90fXiGeHRzhXx4oI+ZsZyljoKKf4Oah4CMnn+LmpOOhYiXjo6PhHZ0dnOAcG+Fc3Bxg29qaXZug259fW11c1JNgt/IktaTfHB1g3aDn4OTd5SRmZyQmXuUc4WQn6GTk5CKkpuThn6WloiNjYiRjIicfo6Ad3qMfoiMipycnZuVk3qNdWeIkYZsiKKEkYiXgoVjjJGZjpWKl4uNiotxepSIe46IipORiXmFfH5se2Vyb2treXlcgHmQjoB7fX5/ho56emhyanOKj4mBhYR8lIprfX5uf4t+i4d8hHmBj5WamYp8dniDkHhzbWdxgIRtanRvaGp0blNeb2RwWV9rcXdma2piZnhyb3BjX3dgYFZrX152UE5LYWdjXXpwiXRcXGV2YGFlZY5jYWZiWGlzc21qcXaMfXR5hoJ1dn6Lc4CGf3qJfnKJh4GRi4h8fph2ZXNufWWIfm9wa4BabG55eXNhdnp7jXZyd4p3eZ6Lm6+boJCChXeIlX59ip2HhaCRj4WMmISSjoeBdHdweXFuhG9tbn5yZGV4cH1ten1qaGtjpJrB3K7voXNsdoR2hKKFkm+WkZWglZyBknKFi6OXiY6VipCdloOAlZCFiY+AkYqJln6HenV/iXiGhI2cm5iZjo92inZuhYiKfYqjhJGJnISFXouTl4qOiY6KioSJbXuWgX2IhYmRj4Z2hX19a31keHVpbnhzWIh6koeFeX6AgIWMfnhlcml/iY6JgoJ/i5aFa4F1bYeQgY+EfoJ6f5CVk5iPdXN3iI11c3FndXqDYnRtcGJpdmdSYXFnbFVfbnR5YXJkX2h9cHJuWmNyYWJXbllceE5NTGRnYl53c4ltXFxkeV5gZGWFYGNjXllqcmtua3J3jH50d4SBeHd7iXGDhH1+iHt0i4mHloaMfn6Xc2h1cXlti3pudHCAV3F6dnlxZXd5hoxodoCJcn+ch5mnnKOShX1wjJR4eYudhIWhjY58lo1/moiEe3J3cHNqb4FraW18dV5heHd7cXV7Z2BkfOvatcnD3IhzbHSBdoqaiY5qmJCPnZaTgYlxhYmgjYSLlYqMmJN8jZOIg4mPe5CLhY+Bf3Z4g4Ryh4KTm5eUl4aMdYd/cISBiYaYoYKTjJ6CiWGDlI+GiYaJjYeBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXN3bFqMfJKDhX1/g4CEioJ1YXNriIGPioF+fpGQfW2Ba3iFjoWRg3yBfH+RkpCWiG5xeoyGdWxxbHJ5gWB0aW5da3ZgUmVxaWZTYHB2dGBvYF1ognFzaVdnaGJpWG1WW3VMS0xmZ19icnOFaVtcZXleXmRne2BkX11Za25mb2lzeIp+c3OBfnp2eohzhYN8gId2d4qGjpmBjIJ7k3Vsd3V5eJN0bnh7fFh6hnGAb2d4d5KCY3aGhXGKloWZoZqiiodzb5OLcneOnH2KmomJfJ9/g5l/gXhxc25vZHJ+aGZsd3hbX3l7e3FxgGphZ2F/1baOkKZ4bnF3fHGSkY2HapmOiZySjIZ7aYeLmYaBkpGGh5iNfI2NgYGJjXuPjX2IhHp0eoJ6cIaAlpqOk5SBiHWDhXWDf4qSnJ6GlY+ffohhf5OHhIiEiY2AgINnfZGAfn+CjI6Qfm2CfIJ0a213dHN2dWtjjYGPf4V+fIR/hIh+b19ycIR7joyBfH6QiHlwg2Z5goqGi4J7hH1/k46PkoNub3mMfnVtb2tse35jaGtqWW52WlNpcmliUWJyd2xiZV5aaoNtc2JbZ19kbF9uVFtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmtsYm1qdHeGf3Fwf3x9dHiGeIWCfX+HdXmJgZKWfIiGdomBcHd5e4STb218gXdeg390gW1penSUc2dzh3xykpGDmp+boIaIdnaVfm12lJd+iJGEio6afIyadn12cW9samF1fGZiaXV6Wl93fHptcX9lZGhnV52PXnFzlrzEhHZxlImQfnOYjIadk4yIdGuIj5WAe5SLgYSbjHyKhn18iYx/lIh1iYV1dn2BcXWGgZ6VhpWPgoJyf4d0g3uJl5yXhpONnICIZX2Sgn+Fg4mJcoF9Z32Le3l/f4eLj31pgH2DdmZveHhzdnNsao2FioGKf3mCgISDf2pecXd6fYyJhXuAj39+coBoeIKGioWDeIN8gJeMj4x9bmx6iX13dG9paH13ZV1xY1hwc1NUbnJpYk5ndHhmYF1cWG6Ab3NZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebGNaY292ZGdcXWBramNsaXN2gYNxbn57f3R1g3qDgnyBhXZ+iYGWkXiDinSBiHJ5eX+OkG9vfIFxaYF5en5tbXx2lWtqeIR0a5SNhZ+YoJqFiG59jHZqeJiPf4KKgpWYinmPlm96c3BsamRgdHpoX2Vye1phcnx5ZnB6YWVljrGyd0piWqTZ0Jdye5GLkXh+lYuFmZGNhnBshpKRenmShoGEmYp8h394eImKhJaAb4qHcXR9eml5hYOlkYSTjYN/b36CdoJ4hZqYk4qTj5SFh296koN9g4OJg2+BeGiAhXhyf3+Diod8ZX1+g3VjcHKAaHhxb3WYjYWCint2eICEeYFqW3B8coCHhYh9hYh6iHKAbXCDho6Dg3KDeICYjI2Ed21ufoR/d3plaGp9cmBZd1pZcm1OWHJzZmBKbXZ0YV1bW1l0fXJvV2ddZmpwX29OV2lSP1lnX1twamd5cVxaWWtlWWNweV9oXV5lbGhmbGlxd3+Hb21/fYB1cIF6f4F/gn92gYWJl4pxgo1xe4Z8enqElIx1anp/a29+dH99b3J8e5Rwb4B/eGaSioKhmJySgoVnh4RwaHqXiX5/hYKZioF8jYxpeHJrbGZfYW95bV9ib3lcZGyDemFxdl9lZdXrvosyOj6LjoByeYWIjo12hJeNf5OOjX9ubIWNjHV9j3+FgZWIfIN4bnaHhIKWd26IhGx1e3RmeYKDp4yDj4yDfW5/dHaCeYWbj4uPkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7gYqDeGF5hIFxZHFofm10cXSBm4uAf4V+c3V9gHOAb1trfXR4iYKKe4Z/fIh4eXBriIKPg4lygXh/loqKfnRtanaAgHV1XGlpeHFZV31TWnFlTFtycmVbSnB3b11bWllddH50aFliW2dlbmJpTVdmUT1eZl1ddmZfdHBbWVVvZFpkcHlaaF5gZ21naWxpcHh9jmxqgoR/eW6Ae32Af4J6dYKBjJOFcICLbnd+gHt7iJOJf2h7fmt0e3KGe3N3fX+MeniEfnxrjIyDm52WjIGAbI1+a2l/j417fn+DlIJ/fYqIa3VxZ2hjW2Jnc29fYWxzYWhwiXphc3ReY2SboJBuXDVZr7V1aoCJfZKGdoaXhnSPjIp3cGyFg4d0eYl4iXyTiHp+cmd2iH59l29whn1odnltZXmIhKWHgYeNin5tfXZ/gHyLmIaBk5CXiIuEiXyPiHF7fYV8aX5taoB7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZWRgXyCf293eXx0fm1XbX52c4uBhneHdYGJeXhybYiAj4CEcn59fZKIiHpubWltgoF1bl1oZnRyUlt7TlxxXE9ccm9kVktzeGpXWVlaYXGAdGBdXWBmZGhoZk5aaE5BYWRbYHZhXHVtWFhTdGFaZG5yV2peYmhrZ21saXB3fJJsaYSKfX1wfn57gX+CeneAgImLhHJ7h29xd4N/e4qNj4NqfntueHl2ind9eICCh3+Df356bYWMiJijjYSDe3aMeWtthImSeX17gpGAgH2Kg3BxcGNmXllnX3BwYGBncGZqb4p1YXRvW2FkaXZ7f76cpqPIuHKFg3OUfXiHlIN0kIyIcnJwhHuDc3WGdIh3lIh5eXFjd4Z5gJJocoR1Znd2Y2p8g4iegoB/jo59cX5zhHh/kY+Cd5WNlI+Hgoh6iYlreHl+dWh6aWt/eXNpenaAg31oYHeHfmpqc2h7gGl2gYyQlH56fn5xe3Z7dH1hVXV8cnKJg4J8gnCGiXd4cG+Cgot+fXh9fHWNhYN2aHFobIiCcnBdaGN0bktldkxeb1VUWXNtYlFPdHhhUldYXGFwgnNbYFxoZWRjamRQW3FJRGRhXGRxXlx3aFVXVndeXGVuaFZsXmFqZ2Vvb2hwd3uTbmmIi3l+cnt+eYKBgnx2fYOIhoNwdoNybXeCg36Ji5R/cIB8eHl6gYt0g3h/gYGChHmAdm9+iYubnoh9hnp3h3xodIaNkXp/f3yJhoR2j4Bnb21fZFxYZVltc2FgYXFsbGiJbmBzaVleZG2Ad6naqseGh7JyinhwjXV7h4+AepOKgHV0dX53gG9xfm2FdJSGeHRsYHqBeYiOZXGDb2d1blttfYGQk4CBeZKSfXd6bYZ1f5CLg3OVipCOh4WFe3+FbXV2f25od2VtfHZtanZ2f398YWJ4hnpodXVjfnpndIaOjJV7dIB1cYB6fGx/WVVyfW90g4Z+f3hriIZzeGp0f4ODfXp8eHtyioB8c2dzZW2LhG10W2pfdmVIbm9MW2JXV1Z4bWJQU3R2WFBVWF5gcYRvXGBjbWRjXm5iVF1yR0NmX11maF5ae2JSVlx1W1tna2FWa19hbmZmbHFocHZ4jnRrjo11f3Z4fXeBg4F7dH2DiIiDb3F/dHF1foaCiY2Ke3d/eIR8fYWHeId8fYF+hIB7fnN2eYyOn4yJeol3dYN5Xn6Gmo15h4N0hoaEd4l7Ym5sW2JbW2FWanRjYFtob3Bnh3JhcWZXXWNrf3zKzoe5omttbottcoVyfYWKf3uShXp5dHl1dHpqbXVjhHaSgndwZ158gXmLiWVxgWpqcWNYbHuGnImDgnOXlHd+e22HcICJioZwlo6QiIWLg3p5fnFxb31naHJibXhyamxxd318el1leYB3aXV4ZoJ2Z3SHjI2UfHKHaW5+gHltfF1XcH1tc3+Ke4Fubol/cHZndn6AfoF1e3F6dIZ7eXFlcmFujIJsc1hrX3hcSW9sTVdWXlRVe2thT1R1clFRVFZeYnSFaFxga2pmYlluYVhicEdBaF1gZl5dVnteT1ZkcFpbamhdV2dgX3JmamhyZ3Bzd4Z4bpWKdH96d355g4eAdXN/hoWOgnBwe3d3dXmHhYeMhnp8f3WLfn2GhISHf35+fYd/fHh1eXeRk59+jH2LbnWAeWSDiJeGdJKKb4WFgnqDdGNuallfW11dVGdzZWBZZHJyZ4FzYmtkV1tgaX94vq57n7duYnOHaHR8cnqDhnt9jYB4eHN2b3t2ZWpuYYd1joFzamJefnh5ioNmcX1oamtaVm94iqOBhX9xmZNxgHh0gW1/gZCGcpSHjIeDiIV9eXRyb2h5YWptYG12a2dra3p3endbZ318eGVzfW6EdGV1ho2GlX5wi2ZreoN0bHRiW257a3R8i3qBZnSGfW1wZ3R+d31+cXtrenuBeXdwZWxhbYl+bW5Wa2B3VktrbE9ST2hOWXxnYk5VdWtNUFRVXmd2g2ZdYXBoZ2BXaV1ca2hKRWpaYmRXWVV5Wk5XbmpZXWxlXFllY150ZmxkcmdycHSAeHCZhXZ/fnh/fIWHfXVzgoeAlYJuc3h6enNzhYeIiIR5gX12j398hImOg4GDe36Lg3t3fHd3mZ2XeoqDh2l2fnxshIWUgHKPgnGGgn6Cf29mbGdXXVtcW1NkcGVfWGNydWl2cGVlYldcXGiAcG9ygHOJZWV5f2p0dnNzg4V4gYR6d3R1bmp6cGJna2eGdI2EbmZeX3xve4l+aGx3ZmlkVVdycI2nfIR8dpaQc3xye3ltenqQhHaXe4eGgoaDfXVwcm1ndV1taF9sdWRnZml6b3tyWWeBdnVncIB4gnVhd4WLfJSAbotqbXqAcGVyZWBseWZydol7fWF1g3Zpa3F0enB5eHJ8Zn5+fnh2bmNlYW2GfG1rVmpicVRMaWtQTE5wR157ZmFNVXRkSk5TV2Fqd35lXWdzaWVfVmNXYnBdS0trWGNiVVRVc1dMWXZkWl9rYFxaY2Vfd2dtYnBpc29xfnV0mYF3f4B4f36FhHp9doKDfpiFbnJ0e3p0cYWFj4KAeot1dZGAfYGUjoCFhHx+jIZ6foB2e6OlinmIhoVsdXx7dYSCjHpvhXN6hX2Cg3VuamhlVl1bW1pTY25lW1hhdHtqaW1oX2JXX1ppgGlrb4BnbGFoenlrdHR0b4WBen99dnVuemhqeWpfZW5ogXeQhGdlWGJ3aX6Hem9pb2ZmXVVYb2iPp3aBenyRjnh1b35ucnR4jn53lHSFgn+FiHZqcnZnaG9cbWVebXNfZ2FqeGh7bVttg3NzaW+Afnl3YHaEhHiPhHOIcXB5f3FjcWhbbnZkcHOIe3hhcoBwZ2l4c3Frd3Z0dmODe353dXBjY2NtfH1ra1VpYmdUS2xoUEdSbEVhd2ZiTVRyXUpMVFlka3d6ZV9tcGlkXFZfVW5uV0pTaFhmXlhNVWxUS1x6X1tfa11dW2JlYHpobGFvb3Vub3d1epd9d3+BeYB/h4Z6eXqDfYGThHF0dH55dnSFiJB9gH2QbHOVgXuCn4V/h32AfoaCgIp7doSsnn96iIeEbHKCeXaBgIJ0boZvfIB0ioBqcG1kZFhfWlpaVWJqZ1taX3WCaV5ubFxhVlxca4FlcnR9aWpdbHd2Z3R3cm6Ge359eXZzbHpnaXhmXWRyZ3p3koFjY1Rlb2eChHd2ZmhpYFdWWWhkkKdufniAi456cHB8ZnhueYt6do5xg31+f4ZuZHZzZGhoXWxiXW9vW2debHRlemlddIBvcmtxe351dWF0hYp6h4eAf3dydX50YW9sWXByYnFxhHt1ZHKAbGBsem9qaHp3dHFlhHR5enVxZGFkbXN+amxUaV5eVUxzY1FHV2JHY3ZmYUtUcFhKS1dYZ2t2emRlbXBmY1pYXVh2ZlRKXGNYaFhZSVdlUUhieVpdYGxbXlxiZF6AaWpfb3R4bm9udoOXeXKBgH1/iIuGfnV2hniGjH1zdXWBeXp6goyOfX6EiWp0loF7ip19foV5gHp+fIaIc3GPrYx7e4aQfmZxiHp0fX12cm+GbHt+bY96YnBvYWVeZVZZWVdjZmtgXV1zhmlZcW5bXldaXGx7Y3F3dm1jW21zdGh1dnFthXl/gHl3bm90ZWh0ZVtndGZ2dpF6X11SZWZqgoF0fWFjaVxUWF5iY5ClaHl0g4aQeGxueWd3bHuEenSIcoB4e3h/aGV2bWBmYV9qYF10a1llXW9uYnpmW3h8a25ucHh5dHRkcoOSf4eCiHp2b3F8cmF3Y1pub2FwcYF8c2VxgGRebXZpY2Z4enNtboF0c3xzcWFeZW1vfWVpVGhZWlVOeWBSS1pZSGJ0ZGFJVG1TSUtaV2lscntjbGxzY2FZWlthdlxTS2NdWGlTV0hZYE5HanZYX2FtW1tfYmNdhWloYW54eWxvanaBkHhtgn6AgZKIhIF2dYlzi4ZzcXZ2gXd8fX6MkIB+k35weJaDfZmSeYCAeHl+f3OIg3NwmaF7e4CJlXlkdYh5c3l2a3Nwf2t5fHCRcl5wb2BnYmxUWllXaGNtZlxccolmU3JuW1lYWGBsdmRqdWpqX1ttdHFtdHR0a4Z8f4B8d29ubGRpcWNba3JkdHaPc1xXVGRgcX9+cYJcYWNdU1pgXGOTn2VycYSDkHRranlsbm96enpxgHd/cnl6emRmdWdeYlthaFxed2hXYl1waGF4YVt7dmppcm93dHN0aXCBlIOGfoR2cmpwe21ldldbam1icHKAenNlb35bYG9xYl5pb3xsa3N9cnB4a3BgW2VrbXthZ1RnVVhSUXdcU1BZUkhjc2JgR1ZrUUhPWlVra2t8ZW1vcWFbWlhZbHBXUk9mV1dpU1RGWlxPSHJ1WWBkbWNYYWBhXoxqY2RteXhrb2l1eYZ7a4N9gIWZfIKEeX2HbY+GcW93enx0goJ9i4+DgpZ0eIKUhYGfiXWBf4F0f4Jwh4J1b6KXdHuGi4d7ZneLb258cGZ4cXpsc3ZzjWtedG5hZ2VrUl1bVmhibGxbXHGMZE5vbl1WWFVnaXRoY3RlZV1abnVucHV1emyHfYB8iHeQc2Nla25hXG5tY3N4h2taVFZiY3d8fHCFXGNfY1RbYFlilpVjbnCDhIpzamd5bmVydXJ6a3l0dG56fnVfZnNjW15XYmRZYXVmVV9gbWNhcV1dfm9oaXNxc3B1dWtshJOBiHuFcXJmbntvcW5TWmVqZXFzgHZzYmx2VWJxa1tebmR8ZWt1fHJycmptX1ljaWp4XmZUZVVWUFVuWFJXVE9IZXJfYUZYak5IV1RWbWhkfGlrd2phV1xVW3RkU1JWaFFZZlRTSFpbUE54d1tgZmxpWmJgXl6PbmJma3l1bm5pdnZ/fm2DgH6Gl3t/h4GJfmuSiHJndIB7dYCDfomPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYt3eG57jWBkfHFnenN5bG1xdoNnZHxsY2ZnaFNfX1VnYGxvXF5ujmhNaW1gVVZTb2ZzbGV4ZGVdWXF1bXJ7eHNtiXuAd5x7emxhZWxtXmBuamVweX5nWlZYYGt3e3pvg15iXmdWWWBXY5yIYmtxgYZ8d2tqdmxbdnBreWl1cm1ue4ByWGpuXlldVmJkWGVxY1ReYmliYm1aYH5rZmtzdW5td3ZraIWLfoh6h21xZm97bHFsYlhfaGhvc4B0c15pbVNlcGRVYm5heWJvdXt1am9sal9YYGZodV1lVmJWU09ZZlNPXU9PSGVvXWNHWmlNSV9LWG1kX3hobn1kYFVeVF10W1RSX2ZOXWJUU0pcWlFadnZdX2ZtaFhiYVtejnFjZ2p3cXNtZ3ZzeYNzgYN7iI1+fIqHjnlukIp0bHOBc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjI2Njo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvMDAwMC5ccG5tbm5vamZnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHhwcHB0dG1NqZ2dnZ2hjX19fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHiIeHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4OEhISEiIqKioqJiomIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5CJkI6NkYiPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+OjY2NjY2NjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiHh4aJhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYaGhYWFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+Hi4SHhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x8fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISKhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIuMi46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5OUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5OSkpGTkoaTlJOVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKRjpGRkpOFfJSTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpJ8hJKRknh/k5ORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCQkoJtjZKJcX+RkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+QhGd9koB0fpCPj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo+GaHCPfHR7jo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjoFdaXZtZXuNjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLiouIZ2ZtXmlndIaFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXV2d3FgdG5hcHRqZWhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hnY2ZubV1sdXBlYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpdZmpvcXFzdGVZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTlFfY2Vub29uYk9RVFBQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OT0xNUF9oZ21ubGdhUk1OT09QT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0hGSU5YZm1obG1samhjXFdVUU9PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCUFpbXWRpb2lrbGppamlra2NSSEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj49TF5nbGtua29taWlqbGVUSUNERUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7PDtHS0ddbW1ueHFpamhWSEFFRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs+OzpPaXB6c2xjST1AQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5OjpBV3RxWD83PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT08Pjs7V186Ojw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11uQD5ERT8/QTtGWDs9PTs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT1BO0lbOjw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUTw9PUlMRUZ1d003ODg6Oz4+UGA7Oz08Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXx3Vjw9Pz09PkJdakE7PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4KDgH1dPkBDQEA+Rm52TTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2EdUxBQ0VAPz9XfIFcP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVxQkRFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIpsQUFWdIeJh4eHiINXSExNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3Z3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINVbISHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUdISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGg4KGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc2ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJiouMi4qJiouMiVQ6ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Njc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIKDg4ODg4WJi4qJiYqKioqLiYqKgUc2NzY0Njg4NzQ1Nzg1Njc2OTk3NjY3NjU6OTo6Ojs4OTg5ODc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiIiKioyKiYmMej45ODg7PD0+OTo6PDk6Ozk6Ozo5OTs6OT09PT47Ozw9Oj07OTs7PDs8PDk5PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXN2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA+PT0+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESERDRUNFRUFGRUZERUZEQEI/PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqIVkhNTE1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0pZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE5QTkxOS0pMSklJSEpGREdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7PD06P0A+P0BDRklKUV+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1yTlJPTkxMTExKSEdFSUlESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dIR0NCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRUJHSkdMSkZLTktLSkpNTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRUdJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKREVGS09OT1dVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9DQkZWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hXVWthRVJRUVBJOztRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTlJQUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVtjYFZZYnJdXVZdWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7enp8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3pucFhaXFtSU1JWVlRaWnSDWVV9kGBcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVRVVFdSUVdVYpaAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT0xLZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlRkVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXZ1c3N3enp7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1dW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZORkRFRklHSENESEdIS0dEQkFEQE5RTVJkcnR2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgmtNRz9AOjs+QEA/Pz5qUUthRUZISUVCP0dMTkdNUVVJQkU/Pjw9PD09Pz0/QUNDQD88PUI+Sk1HVW50dHVzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PzxCSD9cc3R1dnV2eHp8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZHSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUFFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdXWGhza11WYXNrYWFfXmRhX15ZVFFOTk5MSUhKS0lJRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbnJ0eHh5e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz49Ojc4NzY1OTk2NzY3NVdwcHR3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9ydXh4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydXl7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7P0A+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSEpLTEpGRkZEP0JDPjxCRz9CP0FkcHR3e3p6e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk3Nzk/Qj47P0JAQD5BRElFQ0dHSUZJRUJCPz49Q0JBR0lETU9iZVFNTk5XS0xNS0xNTU1MS05OU2ROSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEpEP0E9OTk5Oj9CPzxAQkJBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRGSUlKTEpLTElKTE1PUFJQS0dDTEdDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSEhHSktJSktER0I9Pj06Ojo7QUI/PUJCQ0NHRklMSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISUtNSEpMSElKS0pNXFJISERORkFES0pNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZFR0VGRkdFR0JDQD08PTk6OjpAQ0A+QkNERUlFSUpMRklJR0ZGREI7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0lIRU5JQkZNTE5NT01OTk1LSUhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtxbHNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NDRUBEQj5APzo7Oz06PT5DQT5BQ0VGSkZJSEtIR0dHRkVDQD1FRUI+QkRDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSkhLSUZIUEtDSU1MUE1PTk9QTkpKSE1SVVRST1dkYGFtZ3Byb3J5emdlaGhkaWxmcWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMR0VFR0NCQUJEPUJBPkE9OTo9Pzo9PkBCPkBCREdKRkpGSUhGRkdFQ0JBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFR0ZEQ0lJSEtKR0tSTUJOT01QT09PTU5PS0tLUFVXVlVUWF9eXGlhbWluaHJzYmVmZWRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJAREQ8QUBAQzw4OT0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUpJS01LT1NORFFSUFFSTlBNTlBNTE1TV1ZXWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW95TUhHSEhCQkJGRDw/QkJEPDc6Pj46PjpAQj4/P0JFRkRGRERIRkRFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkU9ODo+Pj08PEFCPD8+QUJGQ0VCQ0hFQ0VFRkdHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdqZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZvdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZCRURESUVGRUdFSEhGSEhJS0lFSkhIS0hGRkxJSEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1NSUFZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSEJGRUZIRklGRkRJSEdJSEpNSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJjaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHR0dGSkdER0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSEVDSElJSElLR0RLSkdISklJS0hKSk5MTkxJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxrVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHRERKRUVKTExKTExHR01JR0lLSEtLSUtLTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEQEJCQD5DRkdCRkNGRUZFRENISEdERUtIR0xNTktNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0hFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHTEpHTU1OTE1OR0xNSUxLSUpNSUpJSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SE1HSURFRUNBQjxCQUJGREhHTEhFQ0NIS0hIRkpMTEZOS0xTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFAPUNEQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTU1JS0tLU2tiWmleX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERURGQUBBRUVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKSktJSElHS0tLTEdIS0tMTExLSUtNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVpdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQENIREZHQ0lLTEhGREdLTEhER0lQS0xPS0xXTElFRUhJSkhJS0hMSkhGR0dJR0hJRUZMSUpLTkxJUFxXXlBcW2BeTVhZU1xcYl5NWVpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRERCRUlFR0dGS0pLSEVFSkpLRkVISFBKTU1KTVNIR0VBSEZKSUtLSUxKSEZFSUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2ZoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNHSEVIR0hLSUlJREZLS0tGRklKTktOTEhMTkdIRj5HR0xJS0tKTEtJR0VJRENEREJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFSElGR0hIRkZKR0hGSEtJTERES0pNTUxLSEpKSEpGP0dGTkpLS01LS0tJR0dDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHRklGRkZJTEpORkRLSkxOSkxJS0pISUZCSEhRTUtLT01LS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTElJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VEV1VFXFReU1ZfWE5UVU5aWk1KS1RgYVtfWF5eYV1OWWJcYGBfYmNiXWFiV19fVFBOT09XUV1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQQ1ZeSUdHSERGTUpQUEVJSUtLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FFRkJNSEJLTFBPTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xRU1JVWllXWVhYZFdPU1RQUE5NT1RTW1hYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSUxLTEtOTVVOT0tLTEdHS1BTU05QT05PTk9IS0ZgRURfTERmY0VNW0leW3JtT01VbVlMQ1BgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalNXVlRbXFtgYGFhYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xIRUdGSEVFS09TSUpGYFNISk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUX9RSXxZWXFzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1xmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEZJS0VRVkxLT0lLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWlJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b315b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0lRUlNZV1dRVFBQUFFLSGd4bGN4cm1bS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anV1cIFgcmd8aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKS1BPT09NUFpgWlhLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRxbG1ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUElMTUpLUFFQUFBRV1xYVU1VWVVmWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ352VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGV8aXJ7XVVMbGB2dWtpdXt7bX54a3xwXV5eYltfYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElJSFFQTE5PTEtSUlJPU1JXUlZUUFdbVlZUVFRhYFBOTUtUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1dYUl1ZV11WVFBZUldXV1dYXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlYUE9MTVZUUE5VU05PTUxRUEtKUlFLUU1LS09SVVJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVVWU1pRT1NSV1ZUWVZUWVVUUlVUVFRXWFddWl5hXVxaWlxcYGNbXWJjZGZkZWRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNRUEtPV1NQTlVQTlFOS1NQTU9VU05STk1OUVRQVFFTVFVOS01PUVRUUlJRVldUWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWl9dVVheXF5dXF1hYV5bYmJjZ2ZkZGJYX2FiXmBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXGpkVlhZWldWU1RPSk5WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUV1ZaXVxaVldRUldYVltbV1FUVlZWVllUWFhVUlJYVlVaXVldX15WXl1eYFxcYF9fX1piYmRoZ2RkYlliYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF5bWVZVV1FMTVZTTU5ST1FST0xQU1JVWlVTUFBMUFdWUVdTU1NYTU9QUlRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpXVlxeWl5fYFVhXGFhXmBiX11gXWNgY2doZGZgWmNgYV9fZWRfYGNbWlxbXFlaWFlXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cX1dcXmpxd3mAYlxbVlZYUU1PVlNOUVFQUlRSS1FUVFhaV1VPUk5TWFdUU1VSUlpPUFNTVltWVldUVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVFNTXVhaXV5cYGBgVmJbY2JeYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFtdXl5bYFxgVVxdaWpyfXNsZ1xVWFdQTlJaU1JRU1JUVVRLUVdWW1paU09TUlZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxUU1ZeWV1dYF1iYl5ZX1tlYl9kZF5eY2NhXmVmaWRmXl5kYWBhYWJkYGJeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWVFRUXl5gX15iXGBVXV5ia3l0bH1sWlVZVVFQU1xUVVRVVFZZV0xSWlddWlxST1VTWFZWVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paVFVWWllaV1haXFZUWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfX2FhYGNdYFRdX2JlZXWBemhYWVlTVlNWXFhXV1ZWV11YT1VdWl5dXVRSV1NXVlRTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxVVlhbWltZWVpaWFZdX19eY2JhZGRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVZWXGBhYmNhY15fVltgZGFfenVvaFlcWlVYVFdbWllcWVhZYFdQVl5cYGFcVFRYUFVXVlRWV1JTVVdaWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVpZWl9fYGBkYmNkZWJkWmJmY2dmZV5hYmBjXmJjaWRjZ19nXmJiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllQV1ZXV1dWVFZUWFxcXmBgXWFcV2FeW15cW15YVlhYW1tfYFxfWFldXF1eXlxaXFhbYGFeYGRjZGVlZmJZY2VlaGdkXmNhYGVjXWVpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWlhbXFhXWV5gYmFlYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXlldXllYVldbXGBeXV9aWl5dXl5hXFtbWlxfYl5iZGNlZmVmYlpkZmZpZ2NfY19hZmVaaWljZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVdcW1xdWldcXV9gYmRiYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpiZWNgUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfX1xaXl5gYmNcXFdcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGRnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFfXVtgYWJlYl9dVFxgYGNkZGZlZ2VmZmVeZWZoaGdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7fHt6enp6enp6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiYyNjY2NjYuwwb6+vr69ytPS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyMj5CQkJCQjrvOy8vMzMvb5uXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXl5enhvb3BwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fXx9gIKCgoKCgoSEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnh7eHl5eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp6eXl5eXl6enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx8e3x7fXx4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eX19fX1+fXh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8en18fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en57fHx7fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHp6enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzcnJycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHN0cnBwcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3JzdHNxc4Nxb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzd3Nzcm+DkW9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcnGRhHBycJePbnBwcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFycIikdW97pJBvcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFwga+MbYenknBxcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnF9rqJwj6aVcXFxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycYKyqZChsZJwcnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3Jzm6qis6erlXJ0c3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHh4d32noKOwn5yhgXt5enl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fn18fHx8iKaXm6ygo6KIenp5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX1+fX6IoJGQnpuVmI9+f399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYGBgYaoqaGanpmYlHyAgYB+f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f39/gYCClbClpqGfoqqliX59fX5/f35+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B/gIKHj6Gyqp6moZ+goqiroJSLhIGAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GGi5qprqmjnKShn6KhoKKko56PgoGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYKDjJmdmZqaoZudoqCcnZqTiIOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoCBhIuUlpmajJKdm5qWjIaGh4eHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEg4GCgYSQmJWIjpqajoeHiIiIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SEgoKLlo2Tl4yDgoOFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKCgoGCkJOEgoOBgoCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAgH+Ij3+BgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/gIqSgIKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmIqDhYSEhIKAjpiDgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+NjIqFhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYucjYCCgYGDgoGVmoaCgoGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeMgIOBgYGAi5WSjoCCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p9hISDhIKDg4KNiYWNgoKDgoKCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aDgH5+f35/fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFhoaGhYWFhYaHh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaHh4aGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4eHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmKi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhIaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJhoeGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDg5GSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGhoaEg4GDg4SFhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4CDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKAgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af36AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/f39/fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gH9/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf3+Af4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOAgoOBgIKAgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkImJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSCg4OCg4WEhIWDgoODgoODgoKCgoOCgoKSkIuIiIeJh4aGhIaFhYSEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fXx/gYF9ho+Bfn2Cfn9+gIJ8fIB/goCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMi46OjIiIh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3t6fIKAgX5/gXx+fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjY2Njo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fn1+gICBgH9/fn19fX1+e3x9f39/gH1/fn+MkY2MjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fH+GhIOAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX5/fn9+hJKNjYyPjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fH59fnx7fHx8e3t6fX5/gISDgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkIyMjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx+gIKBgICAfXx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjIqKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fX18fHx7fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko6LiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uKiYyRj42KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fX19fH59fH18fX19fn19fn58e3t7fHx9fHt6e3t5enl5eXt+f4SDhIeJioeJjpCNi4mJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiPjouKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn5/f319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY6LjIeEhYWEg4OBgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH99foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKi4mIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmHhoSFh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+fn+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4OEhIWEhISFg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SDgYB/gH+AgX59fX6Afn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn19f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYOCgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgICAf4GCgYB/fn+Bfn+AgoGAgYOChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx+gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAe4B+gIB/gYCAf32Bf35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH58f4CBgH+AgIB8gH+Afn+BgH9/foF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB+gH99fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKAgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf3+AgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgoGCg4CAgoGEg4OEgYGDgYKDgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYSBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOBf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDg4KEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhISGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhIaEhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4aDhISDgoF9f357fHt+e3x8fX9+fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9f358fH59gH59f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoaFhISFhYOEh4WDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4KAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4OCgoJ/gHt9f318fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4eIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYSFgoN+gYKBf4OBf35+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSHhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt9fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaCg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICBg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18gH59fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoaGhYOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFg4ODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTU1NTU1NTU1NXV1dXV1NTV1dXV1dXV1NTU1NXV1NLT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXV1dXV1dXV1dXV1djb3N3c3Nzc3dzb29vc2tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dTU1NTU1NTU1NTU1NiufIGCgoKCgoKBgYGBgI/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E9P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oip8/T0tLS0tLS0tLS0tLZkTtERERERERDQ0NEQz9c09PS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSko6jP09LS0tLS0tLS0tLS2ZRASElJSUlJSUhISEhDYNLT0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsz9PS0tLS0tLS0tLS09mZTVRUVFRUVFRUVFRVUWrS09LS0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tTV1dXV1dXV1dTU1NTV0MvLysrKysrLy8rLzMzM09TU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M7O0tTPz9LU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXU1NTU1NXX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXR07mf0NGcgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayUzbOXmrq6lbi5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpa+goqey0ZJ9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI5NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZehx4aatdXTzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmYpNqkmbXU08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGanbfYopm11NSvoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKDS1qKZtdTUo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkFDRkRBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLJ1NWimrbUzp6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPt9DWo5m218OfoNLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTo6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZGm2qKatNmxpKfW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQptqxg8bWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9HT0cPU0tLC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT5BRUxMQT03NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbT0tLV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj0+Nzg2OTY3ODk5Ozs9P0A8PDg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc3Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2ODk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkhART1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAPEQ+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Slpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqalo6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKyopqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqanp6afm5qboqCalpaVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6GflpOTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKenJ+gnpuTkZCUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNAREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChnqm1k5CPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9CQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpKSko6KhoJ2to5aTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjqqmjpKKhoZ2jjYqbmZmYmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKCioqyvoaGgnpyap3OCnpyamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaGgoaGnoqSfnpyZmqBhfJ+bm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoKCfp5aln52bmp6TWXmgm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6dnaSOm56cmpqkhlh0oZucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZyampmkj5Cam5ucpHlfb6KdnJ2cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampucm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJmao46NlZmbnaB4aWmcnpydnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyYmJmZmKWNio+Wm52ceGpllJ+enp2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZmZmJalj4SJkp2dlHdqZI+gnp6fn56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiWn4yAgoqenol0aGKLn56en6Cfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl56KeXp5nJyEbGJejaCcm5uenZ2dnaGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qalouZk4R3d5ieh21hXYqXkpGNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CQkY6NmZuJcpCcnIR7dGSDjYWHgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGgoCBkp2IeFqHk5ZsbntzgYd9gIGSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgX1/cpiUdGRPdYuMYFxxc4N7fXyGjo2Lho2UkouQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiJhH+Cfn2gh19LSXSDfFpKYWt6hISFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYx/iI2Ni4uHkomPnnhJQkV0eG1VPkxkc4uLjYmJkI+Oj5SUmJCVnJqdnqiusq+wtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmRnqGdk5eboZqdnKKfoJRhU1tKdHJjV0ZFU2x/kJGOi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6qpr6SEVoKNVHR8bFxZbVVfd5afn6GknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipamnp6mjdGrAvVB/k4dvX3trVm6boaGop6Cioq6rq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaanaSmoqGhm2WHxr1lqaGTl15xg11gl5yZoqKgoJ+goaignJ6hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqacn5lfjbW+m8qkk6l1aK9yV42bm5+eoJ+enqCjnZeamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1tVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGnqa2xsq+ro6OkbYKVlajGnZKhhEasjViGoZ+dnqWkpaCks6WVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqe4wb65trezrqytr4R9e2ytu6CcmoBXg4Fng6ihl56lopmWsL6gnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3z97e2M3JvLe5uq+JeGRqp6Oalop7aGtydnqHi4WFhHZvjbipo6umpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmxwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW2u8PX4NjOxr26tq6aeGpQY5SEg4R6cm1oaG5rbGxrZl9ad7K0qrW1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDub2/xNTPua6ppJ6UgGRfSlx8bnB3b2loYl1fXmFgXlpUbreyqrS8sLW2qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV2bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvFwcXJzMahkY6IfGhXWElTa2VmbmhiZWBZW1haWllVbLO5oqaxtqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2lmaGFrbGdudnFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8PGxsDCr5R0bWRaVldFTmdiYWpkYGdmWVpZWFhUZrO8sqaqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8fnRrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMS5tMe6gFlTU1dVQE9mZGFpZGBmaVtYV1hTYqm4s7WsrqWko6ikoJ+lmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpaHVaZnJ4c3lmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLEwrJ5UUtOTz1RY2JlbWZfZGheWVdXZKq7qri1s6ypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWpvbnl4Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCvYJPTU1ATWdeZ2tqYGJhXlxZZKXBu7q8urysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGlpdG15bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnOxci/fFNORUdvYGFhbGJcXV5bXZvHwsTHwby+tLGwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFw65/VE1IamNcX25dVFpZW5LIt7+/wMC6u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnY2pkYmptbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHDu4ZUSVlebXmBUFBTVobIw6+9vbi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjZGNqY2djW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvEvbrAxMG6i1dHTn+VkkVLWn64y76wwb+6t7u+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnamZpXVZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdaOu767w7a5x7e1t7q8urmWbkp4nZFAWpC2vMG+uca8wr+8xbi2t7S4tra7u7m2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmb2llbGhYWE5LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDFeKzLvce4ubittrO2ubO2tLSGfJuJVqC/wL69vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYm1gXFRJS0pESkNDRz46Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrXWCvcjPwsC4rrW0ur23uLG/v5uVgZfNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHFmbGludG54Y2diXGNRS1RIRUVDR0I8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0ZhxdbDR0czKxLW6v8PIvr60v8OvfGm1zMXCvsG8v8PMysfFxsC5vrzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmBhTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysGFc3SozMzLzcrGwsPLzsG8uLy6uXVYtsjGxMDAv8TAysrDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1teHxgcWNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u6rdvCvra+wL6+uqacqrO3xMCleXd6nsTGy8jBw8DAycrBv7u6sLZ2VrXGxcXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3hzaHBdW15dWVJGRENNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFtG2vzr22ucC8qn1uaG5tdIKXmHN5fpq+v8fAucC8vsXEvb24sq+ublSpxcbDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bHV7cG5pW19fWVNQQUZIR0tARUNIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbB1grS9tbXBpIZpWl5gTlNbXHB0eISjuLfCurO7t7u9v7q7u62vrGxXnMXDw8O+vL+7u7i1wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9mXVtUSj0/P0dGPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmlhHiMorC1nGpmZ1VZX0lJTVFUbnmJqLC3vrmytbK8uby2ub6xtKhvX4rBw8fDwL2/ubOvsr26rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYlxeT0lCPz1JREZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Gp4d7do2il2BTQ1lVSGJqVU9FSmWQo66vtrq1tLKsvLm4tbjBurqcf2x6vMLHwr+5urWupayzsaawraieoKClrba1wre2tKWoq6iwtrOyura7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZybmNdZ1hdXVNPTUE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7OQgXmIj25OSkBlWUJQeICTaExDXoOxtbO1srSvrLu6uLa5v8Szn5aCeqi8u7i1srGtrZ+kpqedpKWdlpmZmp+prrmsq6ufpaikq66vp7Csr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWxdW2pUXVxQTkhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7i1lYyIhHtYRkJRiFhJSll4joJiQVWkubO0srCxrbC5uLa7t7q/rbGyqp+gua6pq62ro6ihnZ2el5ihlZKWl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWl1dG5kVWFjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yu6mYmZRoTUBUeXFPSUlLaJ1/WkVWsbuxrLOvrqyttraytLWuqaKem5udnqennqCoqZ+hp5abl5ePnZSPkJaOl5ukqKCgoqKhpaWdo6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj5CQk5CXlZaYn56em5mml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXVFoVFBOR1BNTEJQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3BqqW9ZkRToYRQWElLYElYjWFlZYSvtaqytK6qq6+wsrOtpZ2Rl5OPmKCeoqCco6SfnaiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnZ6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbpJmXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFZSZE1KSEdPUk5KTkg8RUA8MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCrxr/Lnk5BdZxvUG5KTGNmdnVhXWJzkrKvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGlopuYnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJTVWBISUpLU1RJUlFNOT9CNjc8NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfGi1ZSS2ajWGd9b3JbUmtjXGdiYW2RtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmpJ6nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruqimq6erq6msrKegoKOxrrKxtKqyrqOZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGZbU1paTVFKT09VTFNNQjc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlxd3VvZHd2WFdiYGRpW1pXaK2urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9t7+wrLGuramqtLGwqKuosra4s7itsrSkoJ2ln6yhoaKhoJqYlpafm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWp3dV5tW1JgSFJVSEZVVkpDTUc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjf2+CcGBjV0xbU1pMTFFZUkhPTkiZrKqppJ+fmZKRk5iYlpaVjIiLjpWdnJ2dnpeemaegoKilsaqnrqOrrrawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXCvLe+s7O1oqyiqaiyqaqop6iamZ6aqqegmaegn5+nqKWkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOenIliV15lYFdNUUc9P0BDRD8+Q1J4qa2pqqWfnp6io52enZqcm5STlZSdnZiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqzta+zrqqvo52sqLaxraOwpqCjr7GusKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3RycWhWXFFGVElESlBJP0VBNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFBGRTtCPkY8Pjk2Tn6qs6ejo6KgnqWrpZ6XnJSRmZ2YlIyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMrJw8HGvrq1uru1u7ewtrKqurKuu7e/u7qruK2rqri7tbyurrmjpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFRNRENFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz49Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklafG9hQT1cjq6soJmbm56emZeXl5KMjpaWk46NkIuCg4J3cnFtcI+mra60ucW7zcfLv8LMzc3Mx8nRzM3Mx8nFxczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfFx8XCvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREZQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E/PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaWZcVElEQD9Khp6kmIOgsq2jnpyfmpiXlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXX0dfNxsfJzMPFys/K09fS19LV1tPUyMzGzM3J0s3O083FyMrKwcfMx8nIxr/Ds7PIxMvLy8/Hyr++v73Bx8XNzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURORkBKUUI+Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+OTo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DVLHRvbKvppycnKCkoZ2alJOVlIl9eHBrZWJocW9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s7U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLV1tnW19PW2M7Sys/RzM/QzNPQv8jHysTMzMzOz8XGx7a/yr/SzczQxsnIwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTU1ODY7ODU6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFZSUBBREFGUXayr6ealJefnJqgoJ6bnJmViXdpY2FfX2BfXl9fXWJsdXRwcG9scnF1ksTIxtTW19fX09bQ1dTa1NTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0svO0MDGwsjGzs7R0dLIy83AyszG08/MzsjFysfHyMzK1NTR1c/SzNPCucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu32NTV2dnRztC/vMzJtr6upqqooaOrZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cGVjYl9fYV9fYWFfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHVzc/V1dHF0dTK0NTV1s7S0NjY2NfLyM7Eyc/MyszAycDIys3O0MvQzc7Lzs/Iy9DQy87KwsnHyczLzNLTzdPS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspayuvrSwwNjS19rc1s7NysPSz8HBsamsramksXlIRkI7V46hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBgYGBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3N1MzO083L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXNwsjJw8zDxcjKy8/Kzc3QztPMxsnPzcjHy8XHwcbKzM3Q0cfQz87NzNDFx8G4ub3Dwr3DubKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHFoWVhoVk1HTElQUUI7Qz47Njg5ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzs8Ozw9ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKifrZd4bHBye5GajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNiYF9fYGFhYF9dW11ncnFxcnNwbXJ5pcfTz8vQ0NPUysXJycbHv8PFz87HxcfNytLIy87OxtHS0M3M1MrHy87Px8fP0svQz8a6xL/Gyr3Cx8nOxMLHwMfNyMTMyszPyMTE0MjGwsbIxb/Bx8zMzM/Cy8zJx8vQxMXHu8fDycnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG90ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vbnNzMbQ1dXZ2tvY0MnPz9HTyMK3u7uto7Z9aIOFpKuUjo2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19cXV5fYGBfW1pcYGtycm9va2xvb3250cjJys/LzcS6wMO7u7u6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLKycHBy9DFy8i/ucK7xse+v8bPy8O/w7vJx8m7yMfFysC+wsvGxcS+xr28wMPFzMXFvMDKw8XH0sXByb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdGZpWmFubVpbWFJETEZCR0RMREZTQDU0MzM1PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sq+2bF55faKRi5KWhnqAhYV/dnh1cnBfWltdYGBiY2RkZWRgW1xdXV9eYFtZWlxib3Jva2lscG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8PJv8HJu7e7usbDv7zBzcPGvr61wb3Du73GvMO6tLzGxMLDt8C2tr6/u8zDvLa6yLq/vsvDwcbCxcnHycbQxsLMyLLHycPOzMHFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2RWXllKRkpFR0tBRUJGSkA5OjY0ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys7FycXHwbnFvayupV9kdYSTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNiYWRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvczAw7rAuK2wsaeqraynuLS2tLOztLu1vrG2sLWvsrzCvMHEvMC7tbK6vsC4yLm0u7fBwr23vMbBw7y1rrK1ur+0xbe7tau4vb7AvbG7trC2urPFvLevu7+1t7TFvL7CxcDDxcbHy8XAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcbAv7q4ybaqsJhbaG+Kj4WIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZrbm5yfKTHwLi4tbCrraeeoqmnnqqss62qrKm0rrexs6mupqyzvLq2w7m6urGrtbm7tMK6sMCxvry7trzHucK3raqosLLAtri9sLGosbO1u7ysrrWmrrauu7Kxqrmwrbuuu7i7wMC+ucO/xsPFwbzGwsjLuMXHxb/Hw8O6xMbCu8bJzMuzucO9u7OJc3d2a2lhYmxoWVdXW0FMS01KRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT05Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xMTDw8rCycq/wLzCurO1tcOuqrCRW2p/koeOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNhZGNiYF9dWltaWl1aWlpaXGVub2hmZ2lrbnKBrbqwta6lpKenmqCkoJqcpautpKiiq6qsq7Cjpp+qrbW2sb25r7ewqK64tLS8uLS9r7i5tbK8wLLAr6Woo6uxsrOovaqrqKusrbW0pqiuoaSvqbKmqKiupqi3rbGyt7q6u7K8vr6+xL+1wsHHyLe+v8W3xMO/u7/Ewr7EyMzKv7/EwMCph3N0c2ppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HKvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYF9dXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWqpaylnpyhpJSdpJuXkaGjqaOjn6Wmp6atoJ2cpKassrC2t6exraiqtau0ubG2tq62ubKwurqxt6WgpJ+msairqLmqpKanqKeyraCnpp+bpKasnp+no6Chsa2trLK0s7Swtb22u8HAsrq+w8GxubnCs8G+wLW4vL2+vMLHxMPEv8DEoIN4cGxiZmBrb2BVWV5ITmdPVEdGS0Y8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk7Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLwsa4tsfAzL+4ybe7xbizxLizv8CstryyrKWvs62ho5FpcoaFhoB8eHVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGFdXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21vh52pn5WVmqGWm6OYlY2eoaKnnKCfpKWip56bo5ugq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+jorKlpqm4raKmpqCorKuZoJ+emZ2fpZqZo5ucnrCpq6erq6ytsLK4r7i5urC2vLu6q7OyubO+tLaysba1v7a+wL3Dwru6vZeEenNrX2VeZGRYVFddSVdcS1BHSkpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4uL+3ssK0sbu7rLq6saKeqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3GMqJyTlJSal5qhlpaQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqa+zp7qzpragop6co6Gto6Kqtqujo6aepaajlpmdl5mbnaCal52cnZytoqunpKOmrauys6q1sLKrsrm0r6qvsrKzuLOuqayusriwura6vcC4s7GUhXl1Zl9mXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLMyMa/xbbBwMfOt8DEvbO5ubO/trG5u62ytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWRoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGbk5OPlJaWn5eZlJegnqGclqChqaSfn6mdm5urp6+wq5ujpLiqoaCuqLaqp6etsaS4sKS3oKKbmZmqp6GarLmvoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK2otKyqp62zsKWrrrOxsLCur6eoqLKtsbSwvLS6uK6jlIF6dmVfYVZZWFNSU0tNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGtvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmmBlZKUi5GTlJqYnJWWnKCcn5agn6empKann52gpqCqr6afoqO3qKGhoqizoqWopbClsa6stZ6hnZWVqaGilK2xsZ+jo52emJuTi6GUkZOYmJOXl5mXnqecp6GimqSlpaukpbCnpaOrq62mqa6vr6uoqqqzpqasr7Sxrry1sa+voJJ6d3NlYVxbXVhOTFFHUWFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaasuLu8wcW6sbm1xMnJwMPGxce2xcSzwr/Fq7e3vba9urq1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVVRWVVJUUlVgYF9gYV9hYWJlaYCSkoiQjpOSk5yUlZajmaCXnaCloq2mpaWjpKOcqqulmp+lsaqgoZ6lqp6oop+urKmprq2ioqKVl6KbnJCrqbCcn6KfnpeZk4qekY2Sk5aQmJiTnKGjnaShopWgoaSlm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5urCqrJ6McnBwYFtXVlZSRlFOSFlbT1JJVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD42OTg6ODg2NTk6Ozw5Nz88OTU3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DJurXAr8XIzLrByszItcm8sb7DyKyxuMG1vMC7tLSqrKaVmpubiIFyiIN7dGlpaWxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RVVlVUVVVSUk5RWV1cXV1eX19fYmRtjY6DkIaPkI6Zk5SSnJqjnJuhqKmrqKynqaakmaWvpZWZpa+poJyZm6Cer5mcq7Ogpaafo6ShlJOblpaSqaqtmp2goaCblJCMmY6MkYySjZaVkJ6ioaSdm6OVm6CjoZeiqKOjqKugq7Ckrbemo6SirK2qqKuvs7ezvrWzq6+YhXRzaFtYWVNVUkVYTFFbWE1UTlBMUVJJTklCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9NTg6Ozg5NzY5ODk6Njo9OTk1Nzc1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7euqaivrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9u7O1pqmglpeYlod6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9hZH2LgIp+io+Jko2XkZeZoqCboKuqpq+sqLClqZqfraCVlqWpp52YkI+anq6XmKiqmZ+dlKWhn5KRkpGTlairpZqZmZ6elo2Mi5OGiI2Dj4uSlZGgnqGkmJWflZqhop6Um6WmqKiooLGwprG9qJ+jrLSqrqewtbC5tcCxrrGrkX5yc2JWVFZOUkpHVlBTUUxMV01KTU9SR01LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NzYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OspbG3qqajsaudqqepsrGktsa0ubqzysW5usHL0Mqxtre8vcHDsa+xt620tLuztKKjnZ2Xl5SDgHZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxdXWFqf3l/dIiMhpCJl4mUk5ibmJ6pm6CrpqasnqiaoKack4+fo5qXl4WEkpujkJWjnZaWloiim5uTi46KkJqkp5yVlZebkZKHlI6LgYuOgJCLkpKSoJqhopaUmJiVoqaZjZmkpqmmoaC0sqeyt6Gcorasqa2ksrKmtby1q6yxo4l5c25dTlFRTE9DTU5OUEtGTk5KSk5OUUhNSkFHS0hIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKWnpKqloKimpbOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+tqbCepq66r66fmZqdlZSHe4NuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5ydW+Dh4GIgJGEjoqUkZOeoY+bnKOipJmll6KclY2HmZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4qYoKOekJOYloWNgpR+fnOJjnqQh5OQkJ2bmpqRlpCdjqOjjomaoKGkpJuitK+sr62fmKW4pqaxobCunLC8qqmvqpmDd3NjVk1ST1BOQ1NOTFBMQlBRSElOUk1ISkpESkxGSks9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpqijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtp6Kmkp2mtqyjoI+VlpKQfXd+ZldWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11pa3FrfoR7c05Yco+Cl4aNnJeLlJGfmJ2VlJaVj5aJgJSJXztWb3yMlImAjJKMkIaGc4qFl4F5gXuGk52Ug5WOkZCDhn2TeHFwhYx9iYGRjZCXmpiTi5CJnYifmIeIlp6aoqCXp66praionpets6Kmrpmsq5iotKKpraOTf3NuX1tOU1JXTERUSlBMTEZOT0lFTFFNS09KSUxQRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKepp6OpsKintMK5sLWwx8K3s73Pv7mvrrXCp6rFqqOdmIOUnLGimpiGlI+Lh31zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYGxuaHqBdE9CP3+VkpF9iJSNhIqNm46WlYmSiIaVhnmJf2BKUW54i5KEfYSNioV/f25/f5R4dXZ4hI2acFGNiIqGe354lHZnd4aIfoqJlouOkZKWjISJiJWEm42ChJKalp+dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoqaoiXZtZl5bSFFRU01JVU1SSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Nzc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKiosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hr6KnqKWnqK+tqrW8tre3s8G7tqi6yLi2qKi1tqqyvaeelY1/iZOolpWKfo6Dgn13cG9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3J1fmloXFSPiZSJdH+GgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI6OgXp+iquEeXtodnuOcHJteIGLjZJ4eoB7gHZzcpJ3aHWEhISFfJWKiIqNioB/hIuNgJSEfICPmJSclpGfnamen6CdoKmlnp2YjKekkqCglp6fpIBzaGFdXUpXUFJHS1hST0pMTVJKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTI0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6mlraywsaq9tLK7uLa6tLGft7qyqp2drKmosrChmpGNlIGOnI6Rf3aGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdo2WmI2OfWd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKBfH91ZnZ8hWxvZ3N8iYyHgGx5cX1xbXaPcWhxgX6OcEOLhYKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdmp2eoZyWjYqkm46el46WmJB3b21mYlpYWFVRSlNVVE9QTlBWS05LT09KUU9ITlBMRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6Woaawra6rqKmxr7GrvLisu764s6ynm7CnrJuPlpylqaSgl5mPhZJ5iI6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZXBybIinqsB+dHlie3hvfHmJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKYbmh4foJtaWRseYWQkoZrc2x8bnJ8hmlucH9zjImEhnt+f3t2b3R0hoJ5gXlwfI6MipODlpeYmpCSlpeZl52WjIOJnpGLko2GkJaAbmlvb29YVlhUUlFZT1JUVFJYVU1OSE5KTU5LQ0hNR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCiraqota+urLS/q7zDv6WimpWkl56NhIuUoaGZmJGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+niGKaaXN5ZX5wbX96i4l2goiGdGyaknRzfGpqnY9NeYWTiYSOZzF2hnNsfn6DdGZldX+EhIWAZmlsdWtxf3xocXF8bpKNj3x0fn1xcG51bYJ/d3l1anmJgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFFaV1lZW01QVVZZWE5JSEVKSkhHQkBHRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEvKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWpKiun7Kep7qvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHF7eGx9bHGDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooV2cYd8h3x0jK6OiYBoZ2JqbnJtcIN1aXBYdXCOm5J3bH97fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2Pe3JwcGxgW11eXFlYYF9STltaWFdMSEpGSUc/QkFCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ6lp5+vlaW0qa6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx3iIh8foWDf4x+daKZeX6GgYWZhJqcYYaqn52Lg5COeneJfomIjnOLl5CEel1kcnR6fHeKbWhqYnlvhpCCem+Bd3SEenB0eXhrbmlddod9h3yHh45/ipKXg42FjIZ9cYR/g311d3t8iXdwc3RmZ2BbW15UXGZeV1BUWFtVR0pLREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnZ2fppGgqqCxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSPjHiDgHOghIp9fIF/cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiXuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqkiGrq+vi4GAk4qCi4KEkqmHgJiYipt0bX2Bhod9jmhnaHl/boaHgoVxhIZHbIB3cnl2aG1rX3Z9g4h/iISLeZSdnImLiJF/enWLdnx4bW93fX90dHJsW15dW2NjWGdlXFVQUFZZUERMS0ZOSUNGQ0NAQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKysrLzAwK251MjI0MjBMgVw1PTxehHR8fomFiJGOlpeSl6CdrKGmuK+zvbOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzk0Ll2WcHOjVUZJS01OUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYuQiJBpaG+DgHWNh4SLcYaCd4d/e3aFfW52dWaAlI6GiYiHiIegq6KWiY6Yf3qCiXp5b2dreH56f3NsZV5aW11qXWFmYFlPS05XUlFJUEpETkdDSkRCQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMf4GQjoqam6Sdoaymq6+xl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4l/bXBqXUJANC0tLy8uLzAyMjM0Nzc4Oz0/QkRISk5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISktLS05WX2N/Z2dtdZ2bj5qSk4uNjpqIko+di6CgkqOqpaOsk6m2oqjBw67Hr3i6lJp8jaGemYSThYKPop+TmJKEi4WPmpGWbHB1iYuCloyNj3ePhHFthYGKlpGDhYhyiKCVhpKJjo+WpLWpm42VooOHk4N+gGtqa3yAgYJ0Yl5kX1tna11sa15XS0dPUlFOTExGSVBDRE1GQUNFRkI9Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1hnF2koZ+l5aalZ6enKegqpaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkYKAgIuMiYaQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZynpaKZoZeilJyep56oq5+orKmqtperv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlqKamnd6fpSYkqGSlpiBlJ57d5WSq7KIjZeffZSdm46SlZijoqa2sJ2RmaiIlo+NgYlsc3J8f31yaWBdYV9hZ2RgZ2ZbUkVKS1BPSUlMRkZNQ0hMRkdEQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFCTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK6srKeotKuwtrKyrbuxs72cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKOXgaaZjaKrqKSIhZSkoaCqoKSpj5yxi5Wjp7e6m6CjsJKinaKekKOhq6+ssrWilKSqiJmJkoqWenp9hX9oYWhcZWJdZGNeZmdfWk9ESUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pvWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4WBjIWGh5KGgoSJhoiHh3BuYUBFNjQ8Mi8xMTAtLCstMS4tMz9EQU1VUVJTVVVWVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubSoo7StsbGbmpKan4mnr6ullHafpJehrLKzmJaqraiutruyuqyvtaKxrLG1u7e1rrWgp6ejp5qpr62yube4p5u2qYyljpGToIZ4goN2WmJlV2ZhYWNfYGZgW1RJRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXGBlH2EhpJ1hX+BjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeFgY5/gYmOhn+GiYWKh5F6eG5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRXE9RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6PpK2jsbTCtrjBzMm2u8S9s7PAt7jBtb6vt3Sxs6W6xaSwxrmxs7G0qKS1tqqxoKKWmqKSpbCtpq2sp6SYoKy0uqKpsrq1u77Mv8XFvb2zwre6uL63ure5rKywprGqrb2wvLrCwqyZuqiUro+XmKuJfoJ9a1dkYllrZWplV1tjWVZTSUdGTFFHQ0hJQUhEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpwfo6EgY2DbnpzeIdiuaGZo4mVlJaTlJONkJaSh4Z7hoGNlYqBhIGKenyLh4Z9ioOBioOVfXd5dWVPXGRHRUw7UWNhW15TRj87SFBFW2NRUllYWmdZVGBgTVNQRUE/SUpIRUZBQEM8RTZCPkhHS0xTWlRek6+4tbq4yb+6vcnMu7zAvLe1u7u3vbS6scZgdbKlsZqeq72qpairqqOisrWhq6ielZafmZ+upaempZ+klKKnsbSnsrO9tsG+08nJ08fCxczCysPAvr2/u7y3tK+4t7bDucW9w8iwnrmqoauOpKe2iYGAc2BiYl5YYmBpZlJYYFZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZmZkY6XkpaWjoaHfYaDjJaLf4N/gnh7i4OHfIt5gYqCl39zfXprZXB1WV1cUGVlYmBlZF1bWFdcTWVtVVJtbV9uX1hnZVVZVUpEQktKSEZISEhHQkk5RD9IS1RUVlxaW5O5wLi9t8bAu7nKyrq2ura4ubK3tbSutraZZHWona1wXqKsnJigo5uknqqllKCfkJSOlpiXqJ+ln56amYOknaylqrCtt7C9udTRztfQyczSzM/OysfAv8LKvcG8wcDExMXKv8jOs6S7sLSvm6u4vJmAemxeYV1ZXmFaY2NRXGBTUEtDQUVGRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vl5KQlG5sb3V1h7OsoaCfi5mcmYyNlZGbkoWKin6Ih4uQi4h8gYRze4qDhXuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJatpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpGS1BfXmJmamKYt8ewuLO7vbWxxMa1sLmwsLursrGnqresjbWnnZunmk+anYyOn5aRppillYqTk4mQiY+RkZ6boZealZaGnpqnm6yvqLCotLTU1NTW0svQ1NXN08/NxcLJ0L7KycrJ0cfMzcPQ0riww7zEuaW2usOig3BkXV1eWWBYWWZaUV1XT1BCQkdEQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6lloybm5eLjZWRmo59iYuFjYqKipCHfISCcH+IgYZ7h3KDkYuPfXF4dWtxeH5xe254c2xpgXBtY2ltcHhpd3x+y7/C36duY3dvY1thYEpQUlVOWV5QXVxOUE5UUVVUW25tdoJxlq24rLOnsLaqrLzAsKu1pqS4pquuoKu0o46xrZqYmIyRk5GEjpuBjaaRnImDi4SKiYSLg5OVl5aTnJGcmJmZn56rrKSnoqytz9LV0c3M0tPT0NTRzsjD1NHHzdLT09fN0dHF0tbFwM7Hx8OovrfPnnpvZl5jXldgU11aUFFVUE5IPkBGQUJFPEBCP0VEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OW3WGhYp3bHdwfX5/oZ6eoYuMmZOTjIuTj5aEeYWQkI2LioiRh3+Ce3J+gIGHeYR1hZKRiX9vdnJrc3x8d3tzgXdxa4BzcmlwcXp5cnq+y5p+jLKEdnKEd2hhal1DWlpbVmVjWGRqU1hdXGBkXmN3en6LgZmppKShn6CopaqwuKqltKOhraGjraGnsZ+JppqTkpGJkY+IgZSJapWijJmEgIV9kYODk5ati5WNlZqOhpKRnpensKGgoaWkqMjOz8jCy9HU0dTTztPNxtbTzNTY1tbY1dfVydTazcnX19HKrMPDzIxzcGNhYFhUWlRcUEtHSkpKQDs6O0RBRDxCQz5IQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3eDlJiKjYiIi4l+gnhze32DiHd/eoeRloCDbnhwbXV/dnh9dIV8eW2HdnRufXaEdXh8nbWMO0GLxaV+jHxpZVZJQ2ZjZWNnamRueFtfZmhrbmlugIOIkYudnqCdkJeYn6OkprKjpLOgoaWdoKmgorGchp6SkpKQi4+LhoOPhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipuSq7OYmpyonKe9w8a5tsbN0tDS0MzSy8nUztHV2tfX2NTZ2M3Y287J2trS1b7LzLR5d29lXlpTVlJbV0ZHSklFRT06NzpAQUI6R0RARUNBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhYmCh3x4hZeXiY+Dh4WHeoR5cXp7hIZ1eoWOjZx6jHB8b296f3F8gXGDh4Bujnp1d318gnV/e4aHsHRYqcK2jZGCcG5iPV5ocnBxcG54doFlaW9ydXhxeouHjpORm5WglYeMk5ugm5+qn6CtnKGamZ+lnp+rmYuajJCRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI2UjIZ7m4iUj66qlJWXn5mnrrW9qa29xsvIyczLz8nD0crU19nX2NfV29fT2dvWz9va0dbJ1MuVenxqaVxbUFNUXkhDRUlIPkE9PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEf4R8fISYjoeLfoaGgHeCeW97e4aBdXqSno2gdo51gnR1gX10gIRvgY+Bb5KEdHyAhXp2hnuJt8alwsm4gpabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R1bZOWlJWPl5CDiY+XmpeWpZyXoJefkpKXo52Zq5WQkYqNkYKMhYmIgYaQkZ6cmYmGjIGGmHqIiJ+Xj4iNioyCfKGJkIu8oZiTl5qcqaalrp+otr/AwLnHyc3Oxc3K0dbV1dnV19vU1tna29fb2trYztzGh3x6aGllYFRYVlVNTEROQzs9PTw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop7foB+gHyFe36BkYmFhXqEh3t1fXRtfH2GfnN+kp2RnoORfIZ+eI59eYqKboKagHSYhX2BiIV7fZB6j6mOj8OgvIycpJx9iYR9iXKMin5zppqcmJOFe4+QiIRoR3CgpJ2Mi5CShYmLkJKVj5yakpSRlo2LlZ+dlKCUkY6NkIt+kI6Oi4SJkpaan5+JjJSSnZGCi3+lmYiEjYOFhIGlh4uLuJidkZSWoqehnZ6do6+2urWswMXK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbuHl5eW1qZldgXFRQT0hDTEI9PT45OTo6OTk7PTY/Pj48PTk6OzszN0Q/ODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97iHp8e4uHgn51g4V5c3pzbYB+hH13hZuhmp2UkoCMiH+Yh4Cbkm6HqIV6oIt8kY6CiIOcfZqRioyjop+QpK+gi5GLhYuBkoZXcq2Ln6ubj4OYm4+PjluCopGCjJ+TlYyHiIySkoyUlJSPjI+Kh5abnY+VlpGLkpOFgIuIko2Kip2WmaKihpOdlqCKiYiNnJCDiI9/g4eFpIaMkLOYnZKUl6GhnpmSnJ2nsrispr3Cx87Hxs/M0MzO19DR1K7W1dja2Nra19bZ2Z9xfnVoZ15dWFRXWENASEM+Pj46NDk6Ozc6OzozOzs/PD43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1ifpKDb213i3h5f3qBfYZ7e3eGhH9zcIWCenV2dnSEg4V9f5Kmo5+lopaKnZCUl4uKqJdyirGMhKeRhJmThZmMopagmJOJm56ikqmvoJGVkI2OiJWLbo23hZrEyLKboaWbnJiWkLKQZKTNx5aPhoeJj5KOjZOUiYWKiYWWmpuPkJSThpSXg3+Pi5mIjZCql5ejo4iZn5ebiI+Hl5eKhI6MgX+Hj6WJjZOpmpeTlpmhmZ+Zk52borO0paO8wb7IxcXJyMnCytPNzdSp0tHW1tbY2tTT2s6DdIFpZF9eXk5LVFpCQUdDO0E9ODM3Ozw6OD42NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfHxsfYh4en56gYGCfnZ2gIN8bG+Lf3l8eHh8hIeLfYqjs6ijq7OhlqegpaSWla6ig5C3lZKzmY2hoIykm6+ipJ2YkKeWqJmtr6SXlZaUkIuYmZagwI6jybirm6KmrZmRmpyynYaFqKKcmIWIiY6VjYuTjoiBhoeIkpiUjIuTk4aUmIaDkZCcdJGZspaXpKGInJqUj4qQi5eaiYqWjoZ9jJifipCQnJqZk5iYn5SgnZWfm6GxrqOkt760xcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmFWYVdRSUlPRUFCRTU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSmdgO0iEi3p6bYWGenyEeICFgH1weHx9fG9zjXp9gXt4houJhYOSp7utqLK9r6Wus7Ooo6KwrIqatJ2juKSVrKSWqa23pqSjn5mpmKqjr7CqmpmclJWRl5+Xmbu7rcmgaba4q7CUmJ6jq5KXvaNeqrKCiYqNlIeRfI6OfYOGjY+UlYiHkpaLkJWNioyXmJKdmbOWlaqei5uUko2QkoyZm4qSnpCLiZWfoo2VjZianZOcmZ6UoaCUnJylr6iipbO4q8LIxLW7vbvFyMfC0aHGyc3NxNbW0MvUonF8al5bVF9SUEdEPjxDQUI4Pzg3ND5GPDw2PDM1MzQ1NDUzQjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo5Nj49NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBjcEpAi4p/gXKGh32BiXWCioN/bX19fH9wd4d3joKGe42PjIaMmqvCwK+9xruytMG8tK2rs7aMqLKurr2qm7ukqK25t6umpqKio6Opr7Kxq52cpJibmJeeoqWlkqO5rqi/u6ytsrmlo6Z9iIacrb2wg4uMi5CDj4ORj3qBh5CNjpyIiI+XjYuVl5SRmpadp5qxmpGrnY6aj5KOlZCQlpePkaCRiZWbo6yUlo+UnJ6UoJ6bmKChlZqep6ekoaSwsqbBxsOwsLq2xcTCvs2nx8PHw7zV0M3Eyoh0c2NdW2FbTktCTEBFRj5BP0I7OjQ+QT09NTw2PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uHg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlqe0xsm/wszBw7nIvLqvq7m7l7K2urLArqXApKqvu7uqrauiop6nq6+1sKqboKqcopyVnrC0p4uiurm1wburqJyypKOok4WNqcPEpIKLj4eIhIaVlI16g4yRj5GhjIyUkY+Jl5+Yk5mUl6agrp2MqpyOlo+SkZWVjpCVkY+hlIaXn6CznpSalKChmaSfmqCboJSYnqakpqekr62lwMTCrqm3tcnDvrbOssW+xLyz0cnIwbV1eW1dWV1rU01JQ0xLS0lAQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmW01lXGZUY2qZjZeKi4iTkIaJeYaTkIFygHyNf3iHgoKQeo2hlqiZmpi6vsfIysLSycrCzb3Bs6y7vqe6v727w7iswamss7u9qrCqo6Wjq660rba1oJ+un6aimKO0vambqLzBo7a2r6uSr6yqq5aGmammpZGCjJOllYmBdYqSeYWNkZCen5OPlIuQjZSjmZeblJSjnqmfkaWajI+PkJWWiH2PlZKSo5uVoKKctaaQn5alpKOlnp6mmJ6Vl5ulo6moorKsqLzAxK+ls7fMwLmuw7O7vsK4rMLCwcCZbnpiWVhdXExMTUpHRENIQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGRWnpCdjpeOnpKJin+In5OEeIV/lX5/kIiKkYCVoZqupqSYw77Iw8jF083Ozcu7wrevur20vMq8w8G2tryts7+5vK6vqKCpp7atrqmyt5qeraKooZ2rt7ippa++w7G9ubOnqbOzrK2WlqSrp6CRjpKxxaeVjnyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuNj4+eiFqQl5eSlqWaZpijn7OllqKWrK2rp5ufppeZlpmVoaSopp62q6m6vMS1pbS2y8G4qbass7u4rqi4ur24g25vW1hVVk9GS1NOSz9BSEVESEZHOTVGTTs+Nz5BSi4zMjAyNUI1NU9WTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqaUnJahl6mWjZCDh6WSiIGHgpyEg5WQkZSOmqKfr76uoce9xcTHxs7OztLKvru2sbq7vL7OtsS9t7i3srK1s7ezrKacq6u4q6mnr7CXo6+kqKSltMCwqqyzvsK5wLmzp7ezt7KulaSsrq6ki5OVoY10wZp9lpmEjpaai7GVmpmVkpOZmaajlaCblpqonJuhoJmLjY+WnWBKlpyalJqll1SWsJ+vnJ+llK+vrKWaoaWUk5mZjp2gp6KZtKmqs7y8u6uwssfAuaWrq62xsaOhsrK0pHFvZlxbT1FMRVBQUVE7SEtJRkhCQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkirl5mgoqivmZCXh4unlo6IkoWfiISdl4+eoJqjpLXItKnGu8PDyMrJx8zOx766sq65uMDBzbXIusC5tbmxr6+ytKejm6q0tKuppq6smaSupaWprLq/qKu2tr7Bv764srLCsLi8q6OutKy4pYibl6abdr6ghJicjpOZmouvlqGcm5eVm5+hqZ6ooJmaqZmhp56XkI2RnYNudpKimpWdop+QrbKjq5WpqpirrqWkoKSokpKZnIiUnKKel7Gnqau6t76zsq29ubago6eopaecnKypqYxlZmFfUkxNR0dOSlZMPU1ETUlKQUNEPFBVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1VSH9lXkhFrJWcoZ+7rpmUnoyTqpuRkpOJq42Hop6MpK2Uo6O2xr20wbrCwsjIxcLOyMK9ubKvuLTAwsq2xrHBvLS6q6itrK+jopmqtLumqaarqp2or6ekq6q9vKitvLO3vca8trW3wK+9v7OotLarvqSPo5eRop+8n4mZoJmWnp2Pt5+pnKWjm5yhmqils6GbnaWcqKmemZWPlJuLl4mNpKGUnKOeoLSvpaWTsKuZq6yenqSjqZGVlaCDkJ6fnJWppaKhtLS6ta2otbKzn5yippqXlZmqoZ53YV5gXkpJRkhNUUlORUZGQlJLSUFER0FWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0Ocb2JHRaeXpJ+fw6ycl6SXmamclpqaj6qWlqimla2tmaGrtsTCu763wcPAx8S+zce7vrmysLizv8PItb+vvLa6t6akqqusoKCaqqvEoqWoq6aeq6+roqmovrimrb2wt7bHtrW5uL6wvsG2tLK0r72jl6OWk5uUrp+QoaKlo6OfkL6lqZ2orJ2doZumn72imaOeoqmroZ2XjZWek5+Hj4WNkp6koJ21rKaclbKnmbCnn5qqnqCNmZWfhI6hmpuTpaSamKyxtrKqpamtrJyZoKGSjpCWqZ+UaWRaYV1PSkhLT01IRURJQT1PSEE7R0lIW1JPSz1IT1U0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV0yimqObnsWsoZ+snZyun5KjnpakoKeqrJe2sKOqs7bEwr2/tsDCvMjCvsrItri1tLCztLfBxra+sLi0ubWfpqyqq52en6WkwaWgqa2gpKmtr6Kmp721pbG8t7W1w7Kzt7m+scPAt7ets7S1opyklZGToK2gmKGdqKmroprDramerK6bm56ZpqC+oZ2kmKurq6ahmY2an5KeiY5Yf5WepaGguKqnk5i2o5+zoaCbr5eejpmUnYKPn5eWjqKklZCmrrKrqaKipaWWlZ2Zi4+Rk6SfiWNlW2RgTElKS09GRUFGSj89SkI5OUpLTl1RUUk9TFdcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmJ7Dp6Wis6CcsqeTqqSfo5+tqaydu7CprLWyx8PBwrPCxL3GxLzFyrywsLausLWvv8W1ubCwurWsmqiwqamanqahp8Ktm6ywnKqirrCppKe9t6a2uryutsOts7PCv7HGs7q2q7S1raqipZWVlKOroZ6fmqirsK6vu7KmoKmpmZmXk6KkuaChpJKur6ylpp+SoZ6Vno+RjpWdmaOfp7Smp42YtJyjr5qem66RnpSXlJqAkqGVj46goZOLpqywpaeinKCek5KblIWLko2cnoBjZltoZUtJTEpTQkNASEc7O0Y/OTlOTVVeUlNKPk9eXj1IUEJMTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugwqijqrKho7WplrKrpqKlsqyuqbuyrbC1tMa/xMS1wMW+ysS2wMjCtau1qLC4rMDEtLeurLa5pZmrsquql5+ml627tZuosJutn660saequrKnubO3srjAqreywryzxae+rq23tKmnrKGXlpGlpKKil5ikrritsbW2oJ+opJmUlZOkoLeipKWWrbGypaqmoZ6ampuWmKifn5iinq+yoqaNl66ZpayXmZ6lkZuOlJiahZaflIyQnJ6Ui6mpqqKnoZmeloyPmZCBhpaJlJ95ZWldbGlOUE1OVD1DQU1DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzuko52hpr+mp6+voKm1q525r6ukqrS3sbC5t7C3uLjFvcPHvbzEwcfAucHGwbqqtqWtu63Bw7e4qq2yu6KVrbCtspalp5Gruaqgp7Cdqp+wtLKqqba1rLussrK5t6y5sMK6vb6mwqqwt6+pqqumnZiYqqGhoJGYoLCus6uwuZqbqZ+ZlpKXpqC2qaWioq+xs6uxp6ufm6Cgm56lnKGXnaOzsJqfkJOlmqGpmpWin5aYiZSYk5aXnZOIkJuZlI6pqKefo5yYm5OHjpmLfo2WhY+ba2ltYW1uWFFRWlVBQ0VUQDs7SEE3OlhQZF5QVldEWV5eTUxSTl5LSj5aZF5OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWOol7Y0M9qJ+coam9oaqwqqOxuKmltbKroa21va+zuLy6vbe2wcK/ycS5xcPAwLjEvsG4r7aoq7eyvL+/tKmusbefl6utqK2Xp6mPp7ufpa2znquisbCzrKm2s7W8ra+xtaywtbHAusS2q7yusbirrKmisaWepKmfo5eQmZ+yqrOpqrOZnaebmZSNoKaktK6noaysrbGnsqyyqaSbn6iknpShmJuotamXmZKSn5meoZ6QrJ+YmIaVmIudmpyTio2Wl5qXpqWjoJ2WlZaUgY+VhXuPkoOMl2Zsc2hwcl9HWWZWRENOWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGNgUEtNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSaoKSst6SsqaWurraprrO5pqexuMa3sbe+wcK1tLrFvszFucPAur+6xLjBubK1rKq6t7q6vrWqrbG2mZinq6qrm6yrj6u9nquusaOqn7Cts66utrG5tqmtrrCntrCzu7zJsqq1tLG0r66mobOfmqitoKWVlZqZsaOtoKWvlqGkmZmSjaKlp7Kpoaaxq6m1pa6wta+jmZ2tp5qXnpmZrLijmJSRj5icoZiXlKyfnZSBk5mNnp2alpCKlJOemqWjoqCZlpKSlnuLkIV7jIuDjJNrbnhudXxhRmBqWUlIWls9e0pHRTZBYlRpWk1cYUpbXVpSUlJiYExLRV9hYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkIvSkdQW0gzY1lVS0SZl6CwqLGprKWjrq61qbe0uKOstLfKu7S7ur++tLS3w8HNx7vDvbe+v8C4v72xva6nurm3t8K3rK2xuZWXpq6rp6OyqZSvuqStsrGnp6Kys7CysLSxt7KorquxprivtbPDxbaptLWrsK2pp6K2n56msaCklJuZlLGep5ufqY2pop2blZelpaW3p6Kxs6unsaessLWspJmhrKibnJ2blKq5nJWOjouZnaKYkJemoZ+WhJKXkJ2cmJaWiJeQl5uonaSgkpaRkJZ2hJCHfIWChI2MbnF4dnx/XUtlbFxLT2NcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1QT0hhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTVE8M3JrSkRDkZmkraStraunpLCys6q3sLafq7W5ybmuwbvCt7OytcLDz8TAwb61vcC/ur+9s8SoqrmwtrfAva+ss7OcoKewraWmsKWesrWsq7KwrKmotLmstLK1rLOsqayorKm5rrGwx764pbmvqa2tpqitsKWjo66jqZydnJqvmaKjoqOQrJ6jn5+hqqamuKWrtLSkqauoq6+2rqKdo6iqm6CampKktJqPiY2IkqOglY2UnaCUk4WOlJOdm5iWlYeYkpWZp5ygn42SkY6Rd36OhX18fYeKinF0cn59flxSZG9eTlpmXUZElltHOk5tWGFbTWBhTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NkOzYqSGRISis6ST8zQklTLD6Paz1HSI+bqaqiqa+kqKSztLG0tbGxoaytvcy6rsG8x7G0rbTCw9HFxr7Asr7Bwry/uLzFqK23rLO4vMGwrLKtoKSnramopLCjqrGqr6uxrq+tq7O7p7exsqmyqaulpaOtuqyqscK5tKy6qKioramosaWppKKuqqiinpuirJWknZeemKudoaepoayloqyrt7GxoKiin6qusKydnqanqZmjmJmPoKeYhoOOioufoI+LjJacj4+GiJGVoJ2WmJWGlpOTl6WcnZyMkZCNin9/iIV9d3+HhYd0c3KJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU5jXE5VVlVXUFxiXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkowLklnREY4PEIwNUVLWDFAlFs/TUaVl6ynoqqynKmpsLasuLWuqqWrq73JvLG+t8Ovsa2zxMTOzsO/v7TAw8S6wLTJxKyvt66yucC/s66uq6WnqrCpp6ixpbStqrCurbGvs6yzu6S4tKysrqern6OesLerqq26tqS2taSpp6ysqq2hqKamsbKkpqWhoauWqaCUmqCmnqSiqqSsop6msbesraKkopqoqq2pnKGlpKSZoJmVj5idlIGCkIiFnaCNi46MmY+Qi4SNmKSckpGbjJOSkpSjmpuai46Li3yHgYKDe3SAhIJ+dHiMpId5a15gbmdXZodkTkBnkkxEYnlXYlhSZVVNVlVWVE9cXWFVS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIZASEhEl5KvpKOqsJeqqa21q7axq6Srqqm8wcC4ubO8taazr8TJy9G+wbu5wL/CucG6wsSusbWys7vBvrOyrq2rrKe2qqWtr6u5r6iwsK6xq7WqtrWntbarrKSpqpyjnbOzqKiktLSgtq6hqairqKynoKusqLm2qaqpqaGpn62bkaihnaCkoqaiqZ2cprSup6WpoqOXpKamqZyipKOfmZmfkY6PmY5+h42HhZ6eiIWKi4+OkI2EhpWjmo6Nm5GSkY+Sn5eZlo2Kg390h4F/f3h1g397eH6AiZ6Pb3FnZ3F4XGF0iGlPXZhWSG14VWRWUWJPTFVUVVFPWFtiVkhQalRXVEdQWVVJPklIT1FQeExOVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjEmLzJSYzAyP2Y9Tlg/Qyw+TFRfL0lrNlFFO5WNr6Clqq2Zq6Str7O0rqqlr6mpur67wbGvuK6itq/Jx8jRwL+9urzDvrrDwcC/r7KzsrW9vMGysrOrs6mltaikrbOzua+jrbWxr7G5qriuqq62q6qeqqufo6C2ramhn6+zobSqnqinqqOqoaGsrai9r6yurKGnp5+rmI+vopiioKinnqebmaqwqKKfrKGhkqGio6aYmqiml5eYnY+Kh5WIfY2GhYSkl4WCgoyHj46RhIWUoZeIkZ2Qk5GNkZ2Vl4+KhYZ4dIF/fXV5eoB7dHR7aoKHo3VpXmVsgnVniIt8UldwXkp4c1NkU1FeTU1SWmdOTFZZZVhHU2lSUT5CTlFhUTpJSExTSXFQTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTGg6MzhfPWFkP0YxQ1BbWytITzpXQjSQjrGfpKaro6akrKa0s7Cpo7Cnqri+wLywqLmqp66wycbI0MK9wL65vr+8ybzCubCwtbK6vLnAs7S7rbmto7Wmp6yxtrmyp6e6ta21vK+8pa2ttautnKmvo5+lrKunnJ6qs6SzqJqqp6mkqZ2jqaipvay0r66dqaOgrpuasqOWpJukpZ+kmpqoqqWemqmhm5GaoKWdmJapqZGYmZOQioKPhX2PgoCIno+Gf36Mh5GPkISAk5uUhZOijJSRi5Gbk5WHiX6Acnp5fnxpd3x6dXBxfmmGeYSIZGBoY3OFem1neV1eVUJXemxUYVBSWUtLTXB0XUhaW2dZRVZmUEM+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGW0Aqj5OxmZ+fqKWkoaukt7KypKiwp6y4wb21sKO5rKiosMPJyczBt73Atbe/usi2w7W0s7Wyvbm6vbatuba/raKzpqurr7W4tKqduruosr+yuqCvtLaprJ6tsKKcpaipo56cpLGmsKCfqqmnoqqbo6igrbyorrCuoauio66enqyml5+boaOcn5uao6mimpmjo5WWk5+hlpuWpqyLnpGQkYyCi4B/joF7mpSNiXx/i4aQj4yJhZKYkYeUo4qSkoeQmpCTgYh8eWx9dnl4Ynt6cnBwc3hqgnRqg2dkaGFvc45tYmpwYG9BXHhrVV5OUFFKSUxTWldNXF5tV0RXYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmRPKT0zUVw9I5KYq5ifl6ekop+opLivrqKvr6mruMK6sq2fuK+rqLS6x8rHv7fCvrC0vrfEtsOyr7qys8C1u764qbm4vquktaeoqrCtubCpmbm8o66/tLShrri1p6ansLOgn6Smp6GlmZ+tqKmeoKqvp6Cml6OpoLC4n6Sxr6Groaykm6amqZqam56jlZycmp2pppaanqeRl5KYnZOZlaGqkJqJjZCHfYd+go18fKGMjYl5g4yFioyNhYiTmo6JlZ+IkZWCi5eNkH2Fe3NwfHFzdGB5eGpvcHFwan9zY3psaWZkYWaGgGBbcmpxTE1/aVhaTVBMSkhQUlFJTVtfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MFxaNSiWnKWYnJatoJ+hpKG3q7CjtLSpqLnFtrKuoLesraywtcXHwLe/wrqxtb23v7u/r6y+sLS/sr3Duam7u7inqLWop6uwrLOwppm8tqSru7Wun7G4sKmlp6+ym6GkoKOkoZacsKahn6Knr6KgopOjpaK3sKGmsaufrKKumJyqpKiel5qdpJOanJqdpamZnJuklJSXlJyOk5eiqaGQiYuPhnqEfYSKeY6Xio2HeoKIhIiMjoWNlJmMjpaZio+XfoaXi496gHpwcXZvb3RfeHdlbWxsammEbmZyaWxmaV1kc4FgW2t1aVpJfV1bWE9PS0hHUlVGMjldXm1QRFdWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzlkbTg0R0FmW0hURFVdaEQuPDJjViwylaKhl5Sbqp2koaKguKquoLq4pqy9xbOwr6O1sK2tr7TDw7yzv7q4sbO5uLq4uq+uwLO0ubC/wbisvbu1pqKzqqepsqutsaGawLWkp7W1qJ6yvKmopqmvrJmjp5yjppSYobKlmZ+jqKmcoqCTpKCkuKikp66mnqWgqJKfqKKhoJibnaCSmpuWoKGqm5uYoZSRlJaZjZSSo6ikkImKj4Z5hHuEhn2djYqKh3qBhIiIiJGFlZOTjJCVlI2OlHuDl46Ld357bHRxbGxzYXh0aGhqZ2dwhmdoaWRmaWpgamJqZ1tle2NgU3NUXFtTTEpHSU9TQCEqaF1qTENWVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc5Z08nMp6jo5GOo6ebnZ6do7Wtpqq5t6esw8G2sKyjta6nrq+3wL+8scG2sa6ytra4t7atqr20r7Kxvb+4rry8saWftqulpbSpqq6fncGrqKWwsqmstbueqaqrsaWYnqqdpqSRmaetopiepKmhm6Kdl6Cdp7alr6qvoaGdnaGUoKafoaCZm5mckpmdlKWdq6GXlp2Uk42Vl4uPmJqooJKIiouIeYV3goKCnIiLgol8f4SIhoWRhJaVj46QkZGRjJN7g5WNhXN9fWZ4b2tqbGd1c2tjZ2RkdoBiZWZmZWpqZGtxWl5ZXW1kYU5oV1pgVkpHSEtNUlg+OV9saUhCVFNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWbo5+Qi6yhmJiglqW0saGxvbehsca8urGxpLesq66puby7uq2/sa+urravs7izqKy6sa+utLa6tq+5vq2mnrWroKCwpKuvnaLAoLGjrrCut661nq2vrK2imp2nqaWelZuopZ+ZpKKpnZqgm5ScnqyvpbqorqKhmpqdmZ6jmqSdl56Ym5SZoJKolqqnmpOampGLlJmNlJSZqaeOjoqJj3yCc4GBi5iFh3yJiYSFioyKk4STnJKSkJCRlo6Qf4CMjYNwgH5meW1oa2pncXJrXGhkY3OBYWZoam5sZ2tqaG1cbGt0cWFUYmhkZVpJRkxNT1hRUVZhZYFUQFZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kqGajY6wnZqToZqpsq+fuL+2oLTCu725saa2sKiupbe4t7esuq6tqqu3qrS5rqaztbKuqbG3trGztbqnqZ+2qZ2eqaKprZqnvpito66vtbWtrJ+xra+popyco6uom5Wcp6OdmqmipJaaoJyRnKSrqqm7n6ekoJiZmZ2hj2uhlpmccYKVmqOAdZKpp56UlJ6QiJeZgJaKoZB4hpSMg25qfnaDcWyGi4Z9hIuGb15jYWeEl4Zri4+Uk3V3i4R+g5B/Z4aAaHVpZldcaHNuTlBqZGdyhGdfZGZubWpeYGGKkISFZU5LRDhGVGdeSkdQUFRVS0hTYW90ZUZaUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WYFsMTZPa1tOXEtbZmI+RzFRZD0rLoykmYaVsJuck6Gbqq2qo73Er6m3wri9vK2ntrClq6S3s7GzsLitqqestKawtaOouLa1qKest7OutK2zoqqftKueoaScpqeYq7qVpqWvsretrqSprquspaGfnKCnp5uXoaWlm5unp52Tn5+YkJ6oqqO1r6Ojo5yWl5eXo4ihjpKah6GHk52gf6V/pqqekpGakYiEcniNjoWIoXaJjWmXiGZ9cnihcIiHhH6NfH+hoKCZgHuHnnSIjnabimyHgYNtaGVjemxxYlSGbWNsaZhxWWpxb4dYXmlba2tbiHFuenKGZ4aEWl5GTT9HX01GUlZWUVFSV1VnXk1XSVJTT0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiLppeDnKudmZmdn6qqp6m+w66yury3wL+qpLewqayms7SurrO2q6mlsa2ltbScrra2tKWnqbOxrbKor5+robKpoKOjmqGjmq2zlKOkpba8p6ynq6qsqKWhoJigpqOZmaajpJicpKmWlKOclJOkpaaht6OjoKSYlJOXk5uIro+YlImpi5eim4WxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGWvJzFe3K2pruQe4BslrGrsHhoa1ixrm5labySvG5oem5yj9h+U2pitrJ+gXKUdJqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQFxEUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaSgaapn5ecnqWtsqiwwr2ytcC1t7/Cq6azrKypp6+zqa+2s6ioprWmp7ivnLOytqqlpKixrq6xpqqep6SxpKGgnpeboJ2uq5SdoZ+0uqOqqaKtrqWinZqaoaefl5uooJ+YnqenkZynm5SdoaaioLCin5+jlpWSmJKZha9qaoqNqn5nhJWGrWRwnZyTmaWUca6hpH54u31roZB2sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox2sWp8sXh0kpNjbW2nbluEoEVoZ4eWRXWcYH5nfKSngllfi6tpgJV4eWqnN0qvXFdTbWNbS05XX1xXVjtOiU9XVy9JVFNJREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GhlYOsp6Weo6WqsristL2+r7bEsre6wqaosKuuqamwrqOxuq+kpa6zo6m5qJ6zsrCjpaCqra+sr6ann6OisJuim5eVl5ubrKWWm6GetLOiq5yira2gnpqXoKKonZmepJ+cmqGnpI+do5qXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl3h7Obt36TlZaolH5rgaZ7goaIkpSSeKtna7Fbq3uPh5R0iHGPhoB/iJCXeIOCi5iMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinC5Rom9bU2toYExLW2RYXFpCPrF4V1hBI01oRUNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5SIs6amoa6pp7Osqru2wrC7wq24t8GqrK2urqausqmhr7yqoae0raSrtaSmsrOno6GdqKqyqLCopZ6fn6+Wn5mUlZaYnayimpmkqLSvoqmPqaiqm56VmKClp5qfnKKfm6CjpaOVm56Ymp2iqpulmZyboqCWk5GTkpyD1ZOZuXCwwn7GhnzWlJu7fJmVpI+NnI2ke46Ho4KlgnqseY+dVq96iH6farlauXeGg3ymgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKljdHKIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhNbEtbUk9ZZllDRD5FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzIlm6GTmLGoqKWzqqW1qKS8t8GwucCxtbS7s7WnsbCjsLKmn662qJuoua6jr7Ggs7SwoKSen6iqsam0qaScnZ6ql5iXlpeVlqCpnZqWqK2wqaOej6yiqJael5yhpaGYoqGhoZqioqebnqGelZmbpqCcp5Wbm5+hmI+SlJGciLJuaLVxq4dvjqZytHNytnuZl6OLjpyNon6RoaV+sHaDkdLRdlyue4V/pG+bqqZrh4R8rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamRmWEFPa19saE9VR0k5PVZSW1hYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGckaWwraSqvK2mtaWntru8srq/t7a0urqzpbSzobGxop+sr6SYprqupLGxnLS4qp+mnaKqpLKorKqkmpyaqJ6VlJiYkpKip5+WkqWrsKailpOtn6WSlKGbpKaflJqlpqGao5+tmqCenZCWm6GdnKWVnZaZop+VmJaSmoWse3eodqOOiYepb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9eIV9jp6GmZp3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV93d4domIhrXq93lZ6PeGw1eciusl9CVG9eZ2BFUG1fcG1WVU0uZWNpU1lRO0JEQUw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk5ODifnZSguLCXtMGtqLOoqbK6t7O4v7m3srW8taW3s5+0rJ+fqKuflae2q6ixsauttKSbqaCgqKG2p6aqo5melaWhlJObmZKUoqWakpCmrK+moJWZqZ+ij5GimailoJWapaidnKSerZ2hnaCNlJ6bnaGYmZyWlqKgk5iQpp2GqX19pXihj46DqnCti4GnhpWfoYiXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aHc6eBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJmTVthX3J0X0pWNkqbk1hIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4wMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMT84oZ2Zmb+rl7TCrqutqaa0sLewtb+5ubKwt7ypurSfsKSepaennpOqsKmwqbWsq6+hmKGgpqWkuqKjq6CXm5GioJWUnpqUmJ6gj42LqK+vpp2Wm6imn4ySpJeoq6eUl6mnnp+go62koZ6hjZWhmZ+gkp2XnJWeoZWWjqubj65tcrRyqYx2iqZztHhzs4CRpKKRnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbXp/fm+Yh3Fcr1Y8nHdlVG9uLlynT2NSa2VibVpjXWBwe2NUWlE+Pm1vM0JCQD9NOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs8MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam526oZyywK6tq6unt6m4r7XAtbywr7m4q8G2qaqgm6akoZ2RqqqotqOyqK+qoJecp6Ckq7ido62blpmPpaOVjZ2hm5icn5CTlKu1sKeZlJysqpeMk6WZpa2ikZaqsaOgnqersJiho5CZopefm5acl6GTnKqclJCrmYfUkpq7c7DDgMOGftWWm7h4h5CXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6p9vm5zvHSyg3V4gYtumohxbo2kdL1ed31bYXm8a1pWW2p6XmphZmdibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QTmnmp6hvKKXscOwraqqrLGnuK+2xbG6sa67sK7Bsqykop6joZybkamkqrKktaatpJ+WmqqZpqy4naOumJWhkKWgkoyco56XnZqQlZKvubGslZejp6eUkZaknaStnZCgqKufm5+po7Oeo6WOp6KVopqcl5WjmI+woJKUqp6FkJm1gJCRjLeVeIKTmrV3bWtuc255j4SOiXSewbu9mnuBsqhwgHSRuIN8hoaMho17i4aNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtnRycHe2jF6Aen2KaIN5bnlji6xwdYV/WVunakVkWVNmYGNdY1FnZnFtdUJNUE1EO1pNPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPjs8p56goL+llrTDtKyrp6yrqbuusMavtbOut6e0uK2poqGlnqCdmZSrpK2qprWop5+blqCjnqykvqehqpeUnZCim5GPoqihk52Xk5eUsrW3rZido6Sii5KRppymq5uWqKSlnJqhqKano6mhka2el6Sel5eXnZ6PsKiUnKeijmp+aZymeIdzfZqPdHplh3q9vsC6b5KCcZWHX3JqWl6aiWFjiI6Va2B/lWNtnXdilWuAmpWUZV5gY3GbimlyjH2GlWdqfnJ0eH19Ylt3dIFoUFxuhH17i2tYbHuCc0lKb4ZwTnVNRVddZmBMW1hnY19PW211aXFSUERFTjxIST1MPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqifqKHBo5u0urajrKWup6i1sazIrK+zq7WjvrGyp6CiqZ2im5qZrKaupKW1qaWbmJWhm6etqb6oqaaVlJyVoJqSl6SpqJCdkY+XnLCyv6ybp52noomTkambqaSbm6ugo5mao6eso5+ropqwm5WnoJaVnZ+dl7GkmKGomZyRnZyjo5mmopqcmpqZj5aBZ219cXeSl5SRhYq1qo2GmJWPioyYl4eUlYqEkpSRiY6SlJiUmJeaoKKanJShnY2CeqWGbGp8kHyAdImKgXGCeHl2douAe4prc4F0g3Vkd313a3B7bWBjXXBnTVlZZmpgV1pwem5sZlNPRlM5T1pNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LkCzoLOiv6GjsbK3oKmlsqelsLWqyaussaW1psCotKGdpKWco5WWoKqmrKOjt6ufmZaWn5etqqbBn6yklZKcl56Yk5Sin56ippORmainssSvmqucqp+PlpapnqucnKCsmKGbnKKkr6eipaierpiXp52ZmqGenpywoJyippWYk5iToKGVo56XoI6Wk4qKjY6WrY98lZuCkoKLqqiGgZiWioSPn4h7hJCHhZmSiIaKlY+bl42Ql56jlpqTkZ2Nfo5mobOvhYqEdnqQinx2eXpvZnqRgYCJa3WBeYhyaHN/enaDiIJrdGR5ZmBqZWNkZmtZa3twaWpcU0xQRF9VRUA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqqyjs668pLScn6WioZ2Zl6ilqaakpbO1npWUnZmZsKauvqCsopCRnpqZk5GVoZyXqJyEnqmrorPIs5+qo6qXlpeap52om56kq5Oen52gqa+qpqOroq2bn6ChmaSenJ6dr6OYnqiTmJeckaSZmKidmpdlgpJ8ZX6NmY9jeY1saGt6kaSra2WamH5nhYplZWloe46hj2tojZeRo3hraouYo56Yc2xueoSNh3pYZV6Fgl5si4qAdlxoc3d3koCHgm54gniAc215hHR3iYiOg3tphllea3RkXXOJaWp8cWxjXlJOV0pkWEFKND1GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsKqlqK2tsKeurbC9samnpK2vsJ+tl5+jnaGamaernK2jpaipsq6elaOQoq+mt7mlrqOOjpqhmZKSm6CZmaWVe6Wsoqi0xLikoaeun56VnqOeo5yjqqiSnqGdoKqwqqujqqCpm6afqKGslqGbpbCkl5yrlaGem5Kll56qmJ5+vYOHcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooiCn32VmImewL2Clp2djZ3CwXuCe5KNmsPAfWqlsW+MgW/Ken+bd5KDjoF2eoGAeXF6f4dxeIWNk3ltd5RjZl94ZGBlgmNedGdtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCuraayta+ppaamsKugq5iaop+cm6qnopyso6WopaS0pJ2ikqauq7izp6+ikZGanaWSkaChl5ufnYemq6SrrcDAsKCpr6mXkp+dopmho6qjk6ChnZ2trqmspqOjp6Glpp6tqZKkm6mtqZudqpysoZaXpZaho5ecf86UeHqkgXmVlptfro9ejqeBoqB8p5WbdKuDgK9eY42qeqeHhaB0l5OIs2OCq4agjo2zaoSudH2Xh7hhg61Zo81ukHV72nt/mXB+iJJ2fmV7iHZ2a32Ibn6FkZJ+bYKPYHFrcGdgX3lkXHFoamNmYFJUUldeS09DNUFIRUQ5PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcK/v7W0sLeXnZGkqqits6ulsqysq6Srp6+qoKebmaSXnKKvn6CeqKejpaGesKybnpWnrq2xqqisoJSSm5+lk4+fpZedp6OeraSqsKjAxrOoqbGulpKdnKKXn6mqn5Shn5ydra+nq6mcp6ikoquSrbSXpqKqqZ2jpqWhsKCSmqeaoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xyrX6rh4afdpiSenyXfqqIooyRjJ1+q3uJlI+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+Ki5KQg22RkWVwdHVwYGdtZWBvaWluZmNXU11hWVJTQzlKSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytJ+do46jo6Gsr7auqbGnqKqnraurp6KjnZmilaCmq5+hpaCoqKKfnbCsmJqWqKevrKinqZ6XlJqjopGUoa2bnaajr6yjq7Squs2yraaurJaUnJ2imZ+urJ2WoJmdn6myqaqqm6yrpKOsm7CxoqisrqWYpqqpqbGikpajpZqUkoSkaqR1iXqpdHqycIKliZmMcYigmoekYGBSq4R/roObdq6BpoaGn3qZloZ7ZoCjiaSZhYKjfal+gZWHrl98qFWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojY2Yj4FtmpNwbnl4d29sZmVlcnBmfGliXVdgaVhYVUxNUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwr6mtoqemqqurqaSmoJuln5ymp6ajnKyaoqyhpJ+vop2akqqktbCuoKmbnZaUp6SQmqKooKClnLGmo6exrLbIsrWqrKqVkZ2copmgpbOdmqCUnJ+nrKukrpqtqqOiq6KzrqKqs7Ghmqmorq+2o5OWo6eYm5F8qmyehId1q3l8sG+CpIqJn5aVn5SB0ri0uMmAgbJfX5Spg6SIh6B5mJWaeKrJdJmjlaepkJOajH+biprGxnhloYKlc4GfjoJ9r15wtWOxdUujhm2nR4KTZI+QnpJ8cJeTgHF7dX17bltmanNxZoFqX2FZZG1cXllJTk1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TBxritqbKtrKWinLK5rKqhppuopaqrqqegpqWYqqOfrqudpqCsmp6ppZ2ntp+il5OoqrayrJumnKCVkKWskZmcp6OfqaauoaOnqbC0wrKzqq2ok4mXnaSaoaOvppehlJicpaarm7Cerqimn6yjt62hsrmvnZuup7Kzs6SUl6ejmZ+Ogp1OeJqBf596g6N9g6SEh6efnJ6ThLh7fHm5gn7MxsK2eJuhkYuffZqWlop2npiKpJijqH6whZ2Fn4SsfZqUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkqSXfH2Tkot1enOFf3FcbW94cmqCb1pkX2huY2RdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu4q6+gm6Gss7Omn6CVpq6trqqnnaamm6OnoLKuoqmmsqCZqqSUo7aiopWXoqm0uKScop2ik5ChsZmenKeloaKvrp2kqKG2ssOxramtqZGHkJynnKKknKWWnZiZmqakqZqvoq6lppivpbytobe3rZ6dtbK4sLOmmJ2voaOehY/RtcO3eYeOhZGTkIGmeJSid4ygkYSlgYpxqoaEtG5yapmjm5WKn3yYmYaHj3OvgqWboo2mi5OdiZWQmm1wslylc5N6nGyZf3uZfW6pYaNxcX+fYnOyuGh4j5SmmX6MjZOMeH15joJtaXhqeXNugHRdZGRubWZnYEpbWVg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q1npanpK21oaOZlaOpp66qq5mmop+moaC1p6Opp7CjlKyjjqSto52QmpqqtLSknaScqJGUl66goJ6mo5ynnLSaoaqjtqvDsKmrqaGMhI6coaCmopWampuYm5mmpKaYrKiuo6Wbrae+rJS9sKyforCyuauzp5qosaSnmHqokH18sHeKgaSliJxtsm+hh618oY6DqJWYgKyIha6Fn5SpoKGWhp+AmZWAe5J+q4CdmpaLqnidoI+JlJKAea9do4F8pqdknYB8l3Rrr12la3CFmV1gW4ygbZWSp5mDlI2XjHt7g5d/a2x/Y351bYB6YGdlcW5oZ2hDWmFbPUtUM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovZKahKnGwrbBtJ+arKCuuKWjjpukop+wr6qfpJ+drZmeuKCjq6CvqZquoZCrqaSWiZqPrrCsp5+nmqyXmI+soqGdpaGapJytmJ+oprapwK+lqaSfi4COm5qfpp6SlZqalJqapqSkmqmsrKSloKqov6WXw6yqoqGrsrmqrqegs66oqZh2r36Qi5yFh3y6roqYZbCMZZWtfaGPg6aVmoGsioSwhaWZpKGhkYWgW2xqgbNgf617e4KBsWxnb5mXjIixW320W6SDa8iiZZ+Ae7tZdrVasn1Sr4B6rFiAoW6YkKibi5eRl5d8eY+dfmRzfmKEeHSAfGFqZ3FtZmVlT1VkXEJVXz5KKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXmBfYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjm6ympbaooIuaoJ+cs7Opn6OfnbWYoLOoqquer62erJuVr6mijoibjq+sqKeip5mukpmPqJminaWfmaOipZmfo6qyqb2vpaienY59i5uVoKCZkJKam5GamKmgoZmorqempqOlqbufoManpamhq7S1rK6mnrutrKyVgKmSo6+Om4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwvax4d6K+vHSBlo6nnJCbkZideoKRm3pjfXtkjWd5gntga2VramJQYVtTalxAVWFDTio9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbO0sb+5sb2yop2upqWypp2MmKW/qrixqKG/pqaynJ6xnLmonq2vpaeUlLCsl4yDm5GupqOsoaScqZ+Yi6OSpp6nnJqgqKKYnqCsraq5rqijm5eSe4eZkaabk4+RmJiPmJSpmqCYqamhqqehoqu7nqnFo6Cvo6qztKqvqaC6p66umnN1qqS3hmWJoHBnrY+Kj21veKSPmZ+Bda6ZlXCPi3GVqKObl66kcm1tbWWKeG9tgplxgXpqcWlniZaVmHFpaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpFvZmSAjZOPopiYmZKXn32Hj5V2Zod4aI5reX95ZGxjZmxiS2RXSmxZOlFlRVInSzorIxwgGiMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqZWts6m5ubKzqqmhrp6jsqmYkr6yw8i+tqqewKuso6CnrJ+6o6StrK2mjZeuqZCMhZWWrZ6mq6Gfo6OgkYukkqeZqJmWo6mglpympqivuqysmpuTknuElo2lmI2RkpiUjpiVqJWfmKmjm7GnnqOsup+wwaeks6assLGqraunuKOtt5aKoKiltp2JlqKYh6makJSdk6qzmZujq6CxlqGhnZ+inKCkoZWrp42TkoyHkpyclJCak5iRjpWFgaSZl5WNi5OSio+GhH1nin90gnZ0h4xxp217lJGUkoGBjpCQj52UoZaZl6KDiJWNcmmQd3CLeHd8empsZGNvZFVgWEBpW0hjYU9aK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTVBQUVhVVlleYGFjXF5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbaurqKwpK2foLWxkI6sxr3Eu7iqoqWem6aesKijtqedqbWmqJGYrKKLiImPnKeWrKWgmaeenpOVo5aomqiZlKaho5CbqJmhtbuoq5makI18gZSLoZSKlZKVkJCUl6WQn5qqoJy2o56orLenrsGuo7enr6+wrKmpsrigrryZkaWkpraikp2mn42pn42Sn6Osr5uho7Cor5ejoJyjqZ6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2UioB9ZouGdYZ2eYiDc5xqhpCUlJCJfYyWkpKXk6GTnZeihImZh3pylnN6in9yfH9qb2RecGphW19ZbmNQYGVQWjpHR0U+Mj0+Ny8rJispJh0mNDA2NjU4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVVBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaetoKe1qpCQnaWzu6+srKKjmnqdorGkpbCplpu4pqOTmaqcjoaKiZyjkK6fo5Wnn6CSlpibroqqlo+omaeMmaiPn7m2paaZnI2JeYKTi5qTipWSlJCNkpeijZ6eqZ6fuKSAhK+1orCvdaS+o7Kgd3mgqrG7lHWspJ6JgKp/ZFxidqCOpJ6El35uk7Odo6etqqNlnZ+Sc3mZl3CAmKiXbH+iqIplnKWckZeYloySnJCGnZqQlYOSho+OkomEd2qOh3aGcXyGgIBhaYiKlJKLWnaVkWhoj45yeqaamWV5mYeCeJhqg4qDb3mAa3FlX3ZwbGtoXGZlYmJwU1w+Tk5OU0c+QFRDOjEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTVRUVVldYGhmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5Wmo6GvsayrqaWprqOnraWSlqu2sLKmmqqnq5dzjJ2wn6irp5OXuaCgj5yknZF/iIibno2rmqKUp6GejpeRnoV1ro+IppqokZekiZy6tKigmZiLiXV3k42Wk4qUkZCUjJCToI6boKeZnLKWgIyctZ2zjJKPvKegfqeieqKut4GOjqaeg4uGkLGpr4yKlqOaeYGLrIacnaKnqaeHlYWYd6WbeoebgZemgoJ7nLF6ioWgl5mUmJWCkZeWhJqZY3mHkISOj5GKg21wj4d5gHGAgYV/hnSGhJWSeJZoknSgmnR9mYShnoeYf5OKg4OZa46NhWx4e3FxZ2R4b2psaltla2pmdFxfSVRMUUBFNS5ZVVU3KSEwOT0+NjQzNTY4Ozo9Pj5ARElASkVKS0dTWFpZW2FgaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mrq6rqKygqLGmp6qlmZSuyL6woZamqbWekISdrJynoqCNkL6emo2fmqCQfYaPmZeIrJyhlp+gkY2TiIaAkaiNh6Kco5OXnoafurKnnpuSjoVwdZCJlZCKlI+Pm4uPkp+Sl6Cklp6siJ+0ibSarYrKh6quiLeFjK+CsK6DqY2lmI2dfKiPcnt3nI+nlmiVpHm0i5+epqiSmMKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qYkYt8hZKGjZSSiYNtc5CFf3pyhoGEfIR1hIGXgI/FZn+ph4+ja56DopuEmoGNjoWKmXGOk4Vod3R8d2hodXFnaGteZHBtZ21YaEddUk0yRTQ2TmFjNyYzPERHRDk2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdhXWpsXFFFPUtNQEpkWV1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKipqKWroKS5saqrppqUoKOkqqOWpaq3o6+AoaecpZ6diZS9mpONoZGdkHmElpaRiKuZm5uZoYWPjHabnI+fkIiepJuVmZiHo7mupJmcjIx+Ym2Pi5OQjZCMjZiLkJKfj5SgoZmhqH6hp4etnaCWrY+enJ2RhYCgjaquhqONqZmMmn6idYCZlGuCrHVNq3iHjZ2Rm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln+Me2Roi3KZfXmVbF17lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhJ9pZqBtW26KfGZaYIN/YldQb3dmbXRya2pvXmpwbWxqWGlPXVhGOUE0R0RfazQsSUNRTU49ODQ4NTk7NkA7Oz1BTz5RUkxNQkpcXV9XXl5idmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhY2lrZGJkZGdkYmdlYWNol5adoLmhqqOmrJGhtrysrqOZl6CipaytoZ2utaOokqGgoKabmY2YtJmQi5+MlYx1gZSSjIqmlpWYnp5/koWFrKSHm5CKmKmYmZqSiKaxp6KVmoiJgGluiIiLjo6Ki42Si5CSooyUnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprISleIp8hJp9onBzlIiWe56MeW2HnIyZkJuomo+HnXuConN2pmaefnakX5h6fZJzom6Yt7S6dJKHgn+1qGSBxrh7cJW3i3GAmqRjc6yrYH1qnbN+bnyGgo6Ci5hxf6NscqNznoSApGCdmbOWcXyXn7R0c1uesoNqYm90dnJob1hrbHNzZl1pXmJLRT1ENVFBWnIyPVNHX0pSPTwzOTU6OjZEOztASVE/VU1OUUBFX15bWVhgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe1rq2gm6Kco6OmrZybsa2sk5ehmaGkmZqUnqubi4mSeIuGcICWjYmPoZCSlJ2XfZCJjqigh5iOipGjk5ybjYypqKWekJaHhH5re4d/fZCNg4uQkImPlKCDl56gnaCfi4l3nJiijJ9yoYuHqIibpY+Wp6p+rYx+eqCZeqOTeIF0loiNnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmh0q4Odg3SqaJWaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z2iIl/nmiadYaTkpeOf59umpBtp5pdqX54u2t+qluOhF20Z1xucnl4a2lccWp5eWNgZlhiQVFFTzdWQ1JuNEtaWl9OWkRAMTUxOzs3SD86Q0hVP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2JhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniWOUm6u6srCsnaacnKifnq6bnrCorJ2XpJqhn5iWlqCjmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJajnYqUj4aLnpKdnImQqaOgmoyRioCAaYCGeX+XjHuIjo6Ij5aaf5Oin6Chk5hyaJ+Kn4+McJKMgamHmJ6ip5+nfK+to6K4l3ejs6KkgIiUeZ17q5p/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmX50qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcXyObYGJhJl1m3iGibGzf3+bk6d2gp1uc32Ub5lza6RdlXZIZWNgc3F+f25mYGxpdntkZWJSXlddVVdAWUZRZ0RTV1tiWF5JRD1COD9BOklFOExFV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk52Bsa2ZhFReoKazubOzqZqijJyrnJyplKGrpKKoj5+enZqZlZignZaIh4l3hYFueZWFkJuLfJGTlohyf4iSoZtzkZCBiZmVoJuFjqmcmpWLi4p8hGyEhXGCoYx4hY2IiJKYlXyTo6Geooiuhn21hI6enHullnqpgZWcj4qgnHynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpqAo29eqGd1o2NvpWGc05B8e5l4cnNjooWQfqNzo491a5CzjGCCmIlzqrKovH93g21+vqaptF6cbn1xl26Ac6JyXaRnc6ZhaKZtm9SZfYWbcHl6l2ube3iXc26ppGdgZXlwgIRrZ2ZkbnZ3Z2BjU1tmUVFiSVdJVGBXU1tlalxlUUZDS01KS0JKRThQQFFOV1JZT1NRYGZlaVNjd3l3SUZFY15lWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7GrVFxLfqmvsbSws6ObmYWZqKCgpI6kqKCYqYqZmJiTmZOSoJiOiIZ7cH2EaH2Pg5SagXeRjo+Jb3+Gj5OSbJeTfIiRkqSWg46qmpSSi4WJeYN3iIBugp+Hd4CThoiZopd7lKKkmp+Js6Gitot6rKekrqVwqICakIWAm5F7pIChmYaYcp6Eo66vipeMgIykjZaDrqGUdrW1tcmhc5SKgZ9gnZepbXmVhqCbdaGHd6B+kpeKgG9MZqOScJuHcqR7eXRhg4JrfqBrcWRgnHJ+dJdpemmztbTGpnOYfnqda5ybq3WEm211d5hpmnp1mHJQRX20Xmp2a3mIZmpoYnR1cG5WXlRZaVBTaElVTFlTVV1oa25WZ1dNS0FKTUtISk5BUUtQZWNpbWV1c3N/eXxudYl7e1RQTmxeaFtraVJqaGlsZ2xmY2VfXF1cXmliZGlre19dZGhjamZvbWVpbGWhnIivpoRmP5Shs6uvr7aiopCAl6mioqWMpaednaaCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1j4mMgWmEhZKDjIWdjXqMipWmk4OXqZiMkYuBiXqAfYt5cJChhnmBlYeJlqCWf5SlqJyWloRmbnicbKJkfHGld5uYcGemgJaLe6R6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmranWgbW6mX5ppi5BoloealXWigH2aYIyGjHRviGJooGWefmmadW9jZoiCbXKiWl9bY6FtXYmMb3t+c3JkpW13omRnp2iZc4yZb6JvU4mQb6BfZahUi15UmG5tc2tygm1waWt5c2tvUllXV2ZaU21JWE9dSVhpaHNqWWtWUVJFVlxMWFJhVWhqX3d0en1wfHxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66kqbCxpp+LgJernZ+ljKKhmqKigJaYk42aj4uYkI6Ke4ZxgIhoi4t8mJtzdIl9kHtkgoeViomVmYJ8iIaWqJCBoqyRhpCKgop+gICOc2iPpYR9hpSNiZigjoiTqqediaZ4lpt/pIiWjLKYnpCCr5efpXeUh3mpdKSOhJpupKKMkoSMg7tufaWvgoaGhpOWnJ98pXpxqJWglmaefm+rY5aKlZJ3qGypooGJdYeCd6uRpodqkbBrdrOMqWuKhm1tn56SlWF/q4uqdn9/jKWedp99hKSVnaBqm4h3rGefrY22dHe+jaSTWYOmjathdXJ0cHx0cWNqfm5obFNWW1ZhYl1rTV1SXUldbW12YFtxWVxgWmd0ZW5vcWNxdGB4en55cnmDc4R+gHt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFfXlxia2JtbHtvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnainrqSZiYOYq5qepImapZ2pnYWMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGk498e4GFmKaOf6WmjoGOiYWVdoKHkm9si6mBg4uUjomcn4mNlKujoI+AdZSWiH6BeZSuo3+Bm3GPhXiPioN+e3KmjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3p9iWuMhVt5eHJ6cGhufpKJcX90go+Uk3GFg4JljH9egX+Ld3VzlHVveW5uh22EhV52aHiOZYCBhY6pm310fJZqiYhvgHZ9hnZtbWeMc3l7mHiFW2tYeY9pbndycW94eHBdbIZuamdWWmBXXWVrY1ZhVV9RX3B4eWxrdmVqa2p2fHFydHNhb3VidHuBeHV6g3aAgH+AeIuFg317bX9sZHhuXlduZ2h1a3hqaWpkXGBaY2plbHF1blpbYmtkbGx5bWhsb2GOlLiopouhopqmpJmlnKuioYSEmKySnqGJmqabqZiDgZuKfpaTh46KiY1yg3yPfX6PhXuXjnNyhHCVhXt9kouGhpCFeH5/hpmkjnynoYuGkJCFloOGjph3coWpho6SnZCInp6IjJuon6Cqg4mNlJp+fomWraiPkqaPd2+dkYJ5kW99qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgXZ0gVlyboeRgX1+jGpdamR6hYOIgF9peHqbe4KLgnWBhoJnd4qGa2FwcoJ2X3KLgYmPppWFZoyPg253i4Rxho96cGZnZHuDepZbXGpnbnZbe3l3dW5zc4JmXG2Ka2xjWVleW1lscVxfYVpeXWZ0fnt1b3Rja2tqe31ye3h0ZG10aG18fnZ6fHx6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VtbGdzeW9oam1gi4upsKGQo6Ganp6Ynpmoo6J+g5itjZ+ViJuikaWVf3uYhHySmYmIhoeKc32Ai3aFi4GElopxb4BymIaEfpOEg4aKgXqAg4uboJCCp6KIeI6YiZWLi52XhYN6rYKRmJmUip6dh4ihq5+ioqOLh5ObnKOZlqqhp6agkpuHlY17d42OhKd+f5KRkpOcsqablZ6QjbKTmISljIyVm5+JkJuCiJGKa3yNd3hlgoaQinyJnYSHi5CIiICFhJB3fHl0mqGIhomeioSUfn2LgYF1cHOFg393h4eKkKaRhIWNh4ONkIx9iIuJkIJ3bIKEfXqZanJoYXSKcH16d3ZvdnSBXV5vh2hvYF5aXF1TaHJVY1xcYWxodXx8c29wZGtqaX98bnl/cWlwcGxmgHtygoB4f31/hXttgoyGfHp4fH16g3lOZHZqcm1wemRrZWJiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZYyHnbmel6KhmJWZmJSZpKGefH+aq46ejYagnIueln15lIN7jpmJhoSEhm54gIBygYd+iZSEbWt+epeHhIOQf4CGhIZ9hoOOm52Sh6ufg3KKkIaTkYydkX2NeqqEjZKYlo+cl4eGm6afopqdhoORmpmZkJqmoKWdnZCWgJCKdnuHjoSle3yOkJGGmKqhnZOdj42qjpGAnoyJk5qego6XfoaOg293hXF1YX6Cj4Z1i5iAg4+ChoV+hYOUbXh1dJKiioyFmYWEjXSAiXx9cnJ7h4R7eIuOhJKmj4aDj4GEioqKd4aIiox8b2t+gXxuaGxtZ156f2h9e3Z0dnV7d1xgcH1udWBjW11eUWduVGVbXmFraXZ6fnFsbGRramiAgGxzgWxsdG95b4V5bYeAdoKAfoV2cYKNiH57e3x/e4KKYGl7anVoaYJlamNgaVxkdWhvYnRtbFVjcXllcHp6cmVqbW2LiZ63mqGkn5KRlpeLmp+fnnt4nqeRnIqHpZSLmJl5eoyFfImRg4yCgoJufH94c4GFfYuRfWtofYKYiYGIjnx+hoSHfY+BkJubkYinnX9wi4uMk4ehoYqFjXyokYiQkpeTlpN4jKOgoZ2Wmn+BkJqYkoyao6GjmpeRm36NhXiAg46HoH99jI2QfJikoKGTmZCPpo2QgZuRiZOXm32Skn6HjoF0c4JwdmB9f42GcoqVfIiMcYx/goWGjmh3cXiMmJGPf5Z+h4pygYZ8fHF5e4uEenqRjIOWpZOLhpB8hoaHhXaChImIemVyfH94enFsamZefnNofHV2dHxzgGpeYHR2cHhkY1lfXlJraFRlWV9haGp2eIFxZmtkbGhmgIFrbn5ob3FrfniGemuMgXOBgX6BdHaCjYZ+fHp/gX1/j2pyg25zaWKHaGxiX3FWdG9tbmB4aG1XanR2Y3V7enJia295iY2espGkpZ2OkJiPhp2hm518dqWhjpiAjKKKiJqWeHuGh36DiX+JgoF/cX97dHaChX6KkXhnY32Gl4qCio14fYCMg3mWgZWYlo2WoJt+b4yCkZSGppuHjYmEppWFk4uWl5OSd5GdoaGXlJd6fo6Yl46Wmp2knZiSlJt5j4WCd4SWjZ1+gYmNjHOXo56hk5mOj6KMjIOXmIOSlpl+mI18iI2BdnF9bnpkgHyKhXCGkn+QgmyHgoGAiYRldW97h5KXjHyTeIuJe3+GfHtxfneJhXmEkIqLl6KVgoSMd4iEg4J3fIKKhnZgeHh9dH54Z2xkYX9pandzdHV9cXxiY2FzbnVzbWFaYV5bbGVSY1hgYWlrdnmGcWJqY21laX2DbGh1aGxvaYB9gXltkIZxgIODf3R8g4yBgH56goN+fJBtdol0dG1limxqYmN1VoRpcW5geGdsYmp2cGZ5e3lxX3JshoWPnK6XpqiejY2Xh4afk5eZfXiqnYqZepedi4yYkHl7gYt9fIN7gIOBeHR5enN9gIR/iYuAZF59i5WHf4WHdX1+in99mISXlJeMpKGYf3KHe5SSiqePjI6Kk6CSg5KQlJeRi4GPmKCakpCRc3+NkpSJnZ2eppeXjZWWc42OimuFl4+ZeoeIkIlvl52ao5OVio2fjIeCkpx/k5KVhpmIfIqJgXpxeWt1bHt9i35thZKClHdwgoN9fop/ZHJpe4CWl4R+jXOQiIN4h352eIB9hoB8g42EjJSkj3mEgnSJh32AdHaBiYRuYXt1enF9b2FvY2R7Ym5vdnN4d3N0YXVfb2x1bm9cW19eXmteUF1YY2FobXR7iGtfamZqY2l3iG5mbGhqbGiBfXt3b5CIc4GDhH10gYaJeoN9eoGEfX2OcnqLeHhubIdraF9pcmKHaHJvZnZnbmxheWlrfXt4cGF4bYuAmZmqoKOonoqLkoaKnouVmH13rpmNl32flJGWlIh3fnuKfHuAdnd/gHB0dHtvhX2BgIp+fGFcfpCShoCEhHN6gIZ6j5KIkpGck6WclYJ+gX2Oi5KkiY6KjZiajYaRmJOWj4qIjJKck5CMjW6Dj4+RiZ6ZoqGXlomWkW6ImYRmhZiOlHqJhZCLcJWalKKSkomLmoyCf5GefZKPkouZjnuKhIdzcnVrcW50e4t0boWQjZJxdIB7gYGIfGRwbHh9mZN9hIh0kIqAc4h5b4B9gIZ8hYyJhIyVqIx7iHx+i4V4fnFwgYaEY2h5dHVwfGJecGBrdF5want5eGxzcGV4XW1sc21zWFpeX2JrWlBXWGVjZ3Fxf4dmXWloZ2JncY5uZGlnZGlogXp3dW+OhXSBgoN7dYOJhXeFfHiEhXqAind/i3t7cniDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKfqKXoaigppuHjIuBkJyHk5x1gaqVk46HoY2Wk5CAdHt2hXh5f3Jze4VrcnB6bYp2gIGHbnFbWX6SjYiAgIB2dYCAgKCGkIuSnZihlJh4in+BjYmcnoqPhpKYloWJlZmPlouLjY2NnYqOkINtiYuQkYmclqGcmJWFl4hphKOCZoWdipF+i4OLgXeTmJGekZCJiZWOf36QmHyRjY+NmpJ8ioCCbnVwbG1vcHuFaXODjpiKcHd/dIKIgnhmcm91gZmOfIiEepSReXaIdHCJe4WMeouGg4mOm6OIfIR2got/eHhvbIGEgl5yc3JxcHhaXnBgcGpeb2p9enBtbWpsdmBwb2pybVpYYWFiblhRVFpmZ2N1cISCYl1rbWRiZmuTbmBmZl9na4F1cnNwi4B1f4OAeHWAi4B4hX93h4Z3g4V8hox/e3aKf2pxY3xjhnxvcW10amhvbHZ4X3F/eXt0dXSAgn6klZqtnqaWhYyEf5eUg5CfdYuglJOGi5uMlY2LenJ4dIJwcoV0cXWIa29tdW2IdoN+gG1uVVGBq5WHgniAd3OCeoKggpKCk5OYnJKaeJJ7g42TpJqTjomVmZKEh5eZjJSLiY+PiJ6EkIp8c4uFiY6InJqfmpaUgJN/aIWch2eFoIeSg5GDiXGDkZePm46PjIyQjXh7kpB6jouMkZaMfIh8gGt2am5ra2x6f2F6fo6WgnZ6gHiDjHx5Z3NsdIeVi36IhnuTkHF6hHB2jHqJjHqJfYKMkJ6dhXx8d4KMfXdxamyCg3pgeG9tbHJ0Vl5vYnJgX2xueXBob2Zmc3RocGthd2VdVmZgYHJTUU5cZmVdeXCIfF9caHJiYmVmkmpfaGRbZ3B+cGtwdIp9dnyFgHR1f4x5e4aBeIiDc4aFfoyMhHt5lXhmcmqDYIh+b29re2BqbnR/dV90fXiGeHRzhXx4oI+ZsJylj4KKf4OaiICMn3+LmpOOhYiXjo6PhHZ0d3OAcG+FdHBxg3BqaXZug259fG11c1JNgt/IktaTfHB1g3aDn4KTd5SRmZyQmXuUc4WQn6GTk5CKk5uUhn6WloiNjYiRjIicf46Ad3qMfoiLipycnZuVk3qNdmeJkodsiKOEkoeXg4ZjjJGZjpWKl4yNiotxe5SIe46IipORinqFfH5se2Vyb2preXlcgHmQjoF6fX5/ho56emhzanOKjomBhYV9lYtrfn9ugIt+i4d8hHqCj5Wamop8dniDkHlzbWdxgIRtanRvaGp0blNeb2RwWV9rcnhma2piZnhyb3BjX3dgYFZrX153UE5LYWdjXXpxiXRcXGV2YGFlZY9kYGViWGlzc25rcXaMfXR5hoF1dn6Lc4CGf3uJfnKJh4GRioh8fph2ZXNufGWHfm9wa39abG55eXNhdnp7jXZzd4p3eZ+Lm6+boJCChXeIlX59ip2HhZ+RjoWMl4STjoeBdHdweXFuhG9tbn5yZGR4cX1teX1qaGxjpJrB3K7voXNsdYR2hKKFkm+WkJWglZyBknGGi6OXiY6VipCdloOAlZCFiY+AkYqJln6HenV/iXiGhI2cm5iZjo92inZuhomLfYqjhJGJnYWFXouTl4qPiY6Li4SKbXyWgX2IhYmRj4Z2hX19a31keHVpbnhzWIh6koaGeX6AgIWLfnhmc2p/iY6JgoKAjJaFa4F2boiQgo+EfoF6f5CVk5mQdHN4iI11c3FndXqDYnRtcGJqdmdSYHFnbFVfbnR5YXJjX2h9cHJuW2NyYGJXblpceE5NTGRnYV52c4ltXFxkeV5gZGaFYGNiXllqcmtua3J3jH50d4SBeHd7iXGDhH1+iHt0i4mIloeMfn6Yc2h1cXlsi3pudHGBV3F6dnlxZXd5hoxpd4CJcn+ch5mnnKOShH1wjJR4eYudhIWhjY17lo1/mYiEe3J3cHNqb4FraW18dF5geHd7cXV7Z2FlfOvatcnD3IhzbHSBd4qaiI1pmJCPnZaTgYlxhYmgjYSLlYqMmJR8jZOIg4mPe5CLhY+Cf3Z4g4Ryh4KTm5aUmIaMdYd/cISCiYeYoYOUjJ+DiWGDlI+HioaKjYeBh2l9lH99g4SJjo6CcYZ+f3F3aHZyaXN3bFqMfJKChn1/g4CEiYJ1YXNriIGPioF+f5KQfW2CbHiGj4aSg3yAfYCRk5CWiG9xeoyGdWxxbHJ5gWB0aW5da3ZgUmVyaWZTX3B2dGBvYF1ognByaldnaGJpWG1WXHVNS0xlZ15icnOFaVtcZXleXmRne2BkX1xZa25mb2lzeIp+c3OBfnp2eohzhYN9gId2d4qGjpiBjIF7k3Zsd3V5eJN0bnh7fVl6hnGAb2d4d5KCZHaGhXGKlYWZoZqiiod0b5OLcneOnH2KmomJfJ9/g5l/gXhxc25vZHJ+aWZsd3hbXnl7e3FxgGphZ2F/1baOkKd4b3F3fHGSkIyHapmOiZySjIZ7aYiLmoeBkpGGh5iNfI2NgYGJjXuPjX6JhXp0e4J6cIaAlpmOk5SCiXWDhnaDf4qTnJ+GlY+ffohhgJOHhYiEio6Af4NnfZGAfn+CjI+Qfm2CfIJ0a212dHN2dWtijYGPf4V+fIR+g4d+b19ycIV7joyBfH6RiHpwg2Z5g4qGi4N8hH6AlI+QkoRub3qMfnVub2tse35jaGtqWW52WlJpcmpiUWJyeGxiZV1aaoNtc2FbZ19kbF9uVFtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmxsYm1qdHeGf3Fvf3x8dHiGeIWCfYCHdXmJgZKWfIiGdomBcHd5e4OTb218gXdeg390gW1penSUc2dzh3xykZGDmp+boIaIdnaVfm12lJd+iJCDio2afIuadn12cW9samF1fGdiaXV6Wl94fHptcX9lZGhnV52PXnFzl7zFhHZxlImQfnKXjIadk4yIdGuJj5aBe5SLgYSbjHyLhn18iYx/lIh1iYV2dn2BcXWGgZ6UhpWPg4Nxf4h0g3uJmJyXhpOOnYCIZX2TgoCGhImJcoF9Z32Le3l/f4eMj31pgH2DdmZveHhzdnNsao2FioGKf3iCgIOCf2pecXh6fYyJhXuBj4B+coFpeIKHi4WEeYN8gZiMj4x9bmx7iX13dG9paH13ZV1xY1hvc1NTbnNpYU5mdHhmYF1cWG6AbnNZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebWNaYm93Y2ZcXWBramNsaXN2gYNxbn57f3R1g3qDgnyBhXZ+iYGWkXiDinSBiHJ5eX6NkG9vfIFxaYF5en5tbXx2lWtqeIR0bJONhZ+YoJmFiG59jHZqeJiPf4KKgpWXinmPlm96c3BsamRgc3ppYGVye1pgcnx5Z3B6YWVljrGyd0piWqTa0Jdye5GLkHh+lYuFmZGNhm9shpKSenmShoGEmIp8h394eImKhJaAb4qHcXR+eml5hYOlkYSTjYN/b36DdoN4hZuYk4qSkJSFh3B7koN9g4OJg2+BeGiAhXhyf3+Di4d8ZX1+g3ZjcHOAaHhwb3SYjIWCint2eH+DeYFqXHB9coCHhYh9hol6iHKBbnGDho6EhHOEeICZjI2EeG5ufoR/d3tlaGp9cmBZd1pZcW5OWHJzZ2BKbHZ0YV1bW1l0fXJvV2ddZmpwX29OV2lSP1lmX1pwa2d5cVtbWGtlWWNweV9oXF5lbGhmbGlxd3+Hb2x/fYB1cIF6gIF/gn92gYWJl4pxgo1xe4Z8enmEk4x0anp/a29+dH99b3J8e5RvboB/eGeSioKhmZySgoZnh4RwaHqWiX5/hYKZioF8jYxpeHJrbGZfYW94bV9ib3lcZGyDemFxdl9lZdTqvooyOj6LjoByeYWIjo12g5eNfpOOjX9ubIWNjHZ9j3+FgpWJfIN4bnaGhIOXd26IhGt1e3RmeYKDp4yDj4yEfW5/dHaDeYWbkIuQkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7gYqEeGF5hIFxZHFofm10cXWBm4uAf4V+c3Z9gHKAb1tsfnR4iYKKe4Z/fIh4enFsiIOPg4pygXl/louKfnRta3aAgHV2XWlpeHFZV3xTWnFlTFtycmVbSnB3b1xbWllddH50aFliW2dlbmNpTVdmUT1eZlxddmVfdHBbWVVvZFllcHlaaF5fZ21namxpcHh9jmxpgoR/eW6Ae32Bf4J6dYKBjJOFcICLbnd+gHt7iJOJf2h7fmp0e3KGe3N3fX+MeXiEfnxrjIyDm52WjIGAbI5+a2l/jo17fn+DlIJ/fYqIa3VxZ2hjW2Jncm9fYWxzYWhwiXphc3ReY2SboI9uXDVZr7V1aoCJfZKGdoaXhnSPi4p3cG2Fg4d1eYp4iX2TiHp/c2d2iH5+mG9whn1odnltZXmIhaWHgYeNin5ufnV/gHyLmYeCk5CYiIuEiXyPiXF7fYV8aX5ta4B7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZSRgXyBf293eXx0fmxXb352c4uBhneHdYGJenhybomAj4CFcn59fpKIiXpubmltgoJ1bl1oZnRyUlt7TlxxXE9ccnBjVktzeGpXWVlaYXGAdGBdXWBnZGhpZk5aaE5BYWRbYHZhXHRtWFhTdGFaZG5yV2peYWhrZ21saXB3fJJraISJfH1wfn57gX+CeneAgImLhHJ7h29xd4N/e4qNj4Nqfntud3l2ind9eICCh3+Df356bYSMiJijjYSDe3aMemtthImReX17gpGAgH6Kg3BycGNmXllnX3BwYGBncGZqb4p1YXRvW2FkanZ7f76cpqPIuHGFhHOUfXiGlIJ0kI2IcnJwhHuDdHWHdIh3lIh5eXFjd4Z6gJNpcoR1Znd2Y2p8g4iegoB/j499cn9zhHh/kZCCeJaNlI+Hgoh7iYlseHl+dWh6aWt/eXNpenaAg31oYHeHfWprdGh7f2l2gYuQlH56fn5we3Z7c35iVXZ8cnKJg4J8gnCGiXd4cHCDgox+fXl+fHWOhYJ1aXFpbIiCcnBeaGNzbktldUxeb1VUWXNuYlBPc3hhUldYXGFwgnNbYVxoZWRjamRQW3FJRGRhXGRxXl13aFVXVndeXGVuaFZrXmFqZ2Vvb2lwd3uTbmmIjHl+c3t+eIKBgnx2fYOIhoNwdoNybneCg36Ji5N/cIB8eHl6gYx0g3h/gYGChHmAdm9+iYuanoh9hXp3h3xodIaNkXp/f3yJhoR2j4Bnb21fZFxYZVltcmFgYXFsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhwjXV7h4+AepOKgHV0dX53gHBxf22FdJSGeHVsYHqCeYiOZnGDb2d1blttfYGQk4CBeZKTfXh7bYd1gJCLg3OWipGOh4WFe4CFbXV2f25od2Vte3ZtanZ2f398YWJ4hnpodHVjfXpndYaOjJV7dIB1cYB6fGx/WVZzfW90g4Z+f3hriIZzeWt0f4ODfXp9eHtyi4B8cmd0ZW2Lg210W2tfdWVIbm5MW2JXV1Z4bWJPU3R2WFBVWF5hcYRvXGBjbWRjXW5iVF1yR0NmX11maF1aemNSVlx1W1tna2FWal9gbmZma3FocHZ4jnRrjox1f3Z4fneBg4F7dH6DiIiDb3F/dHF1foaCiY2Ke3d/eIR8fIWHeId8fYF+hYB7fnN2eYyOn42Jeop2dYN5Xn6Gmox5h4N0hYaFd4l6Ym5sW2JbW2FWanNjYFtnbm9nh3JhcWZXXWNrf3zKzoe5omptbYpscYRxfISKfnuShXp5dHl1dXtqbXVjhHaSgndwZ159gnmLiWVxgWtqcWNYbHuGnImDgnOXlHd+e26HcYGJi4dxlo6QiIWLg3t5fnFxb31naHJibnhxamxxeH18el1leYB3aXV4ZoJ2Z3SHi42UfHKHaW9+gHhtfF1YcX5tc3+Ke4Fubol/cXZnd3+Bf4F2fHF6dIZ8eXJmc2Fui4Jsc1hrX3dcSW9rTldWXlRVe2thT1R1clFRVFZeYnSFaFxga2pmYlluYVhicEdBaF1gZl5dVXteT1ZkcFlbamhdV2dgX3Jma2dyZ3Bzd4Z4bpWKdH96eH55goeAdXOAhoWOgnBwe3d3dXqHhoeMhnp8f3WLfn2FhISHf35+fYd/fHh1eXeRk59/jH2LbXWAeWSDiJeGc5KKb4WFgXqDdGNuallfW11dVGdzZWBZZHJyZ4FzYmtlV1pgaX93vq57n7duYnOGaHR8cnqDhnp9jH94eHN2b3t2ZWpuYYd1joFzamJefnh5ioNmcX1oamtaVm94iqOBhX9xmZNxgHh1gW2AgZCHcpSIjIeDiIV9eXVyb2h5YWptYG12amdrbHp3endbZ318eGVyfW6EdGV1hYyGlX9vi2ZreoN0bHRiXG98a3R8i3qBZnSGfW1xaHV+eH1/cnxsenqBendwZWxibYl+bW5Wa2B3Vktqa09ST2hOWXxoYk5VdWpMUFRVXmZ2g2ZdYXBoZ2BXaV1ba2hKRWpaYmRXWVV5Wk5XbmpZXWxlXFllY150Zm1kcWZycHSAd3CahHZ/fnh/fIWHfXVzgoh/lYJuc3h6enNzhYeJiIR4gH12j399hImOhIKEe36Lg3t3fHd3mp2XeoqDh2l3fnxshIWUgHKPgnGGgn6Cf29mbGdXXVtcW1RkcGVfWGNzdWl1cGRlY1dcXGiAcG9ygHOJZGV4fml0dnNzg4V4gYR5d3R1bmt7cGJoa2eGdI2EbmZdX31ve4l9aGx3ZmlkVVdycI2nfIR8dpaQc3xze3lte3qQhHaXfIeGgoaDfXVwcm1ndV1taF9sdWRnZml6b3tyWWeBd3RncIB4gnVid4WKfJSAbotqbXqAcGVyZWBseWZydol7fWF1g3Zpa3F0enB5eHJ9Zn5/f3h2bmNlYW2GfG1rVmtjcVNMaWtQTE5wR157ZmFNVXRjSk5TV2Bqd31lXWdzaWVfVmNXYXBdTEtrWGNhVVRVc1dNWHVkWl9rYFxaY2Vfd2ZtYnBpc29yfnR0mYF3f4B4f36GhHp9doKEfpiFbnJ0e3p0cYWFj4KAeot1dJF/fYGUjoCFhHx+jIZ6foB2e6OlinmIhoVsdXx7dYSCjHpuhXN6hX2Bg3VuamhlVl1bW1pTYm5lW1hhdHtqaG1oX2JXX1tpgGprb4BnbGFoeXlrdHR0b4WBen99dnVuemhqeWpfZW5ogXePhGdlWGJ3aX6Gem9pb2ZmXVVYb2iPp3aBenyQjnl1b35vcnV5jn93lHSFgn+FiHVqcnZnaG9cbWVebXNfZ2FqeGh7bVttg3NzaW+Afnl3YXeEhHiPhHOIcW95f3FicGhbbnZkcHOIe3hhcoBwZ2p4c3Frd3Z0d2ODe353dnBkY2NufH1ra1VqY2dTS2xoUEdSbEVheGVhTVNyXUpNVFlla3d6ZV5tcGlkXVZfVW5uV0tTaFhmXlhNVWxVS1x5X1tfa11dW2JlYHpobGFvb3Vub3d1epd9d4CBeoB/h4Z6eXqDfoGThHF0dH56d3SFiJB9gH2QbHOVgXuCn4V/h32AfoaCgIp7doSsn396iIeEbHKCenaBgIF1bodvfIBziYBqb21kZFhfWlpaVWJqZ1taX3WCaV5tbFxhVlxca4FmcnR9aWpda3Z2aHR3cm6Ge359eXZybXpoaXdmXWRyZ3p3koFjY1Rlb2aChHd2ZmhpYFdWWWhkkKdufniAi456cHB8ZnhueYt6do5xg31+f4ZuZHZzZGhoXWxiXW9vW2dfbXVlemhddIBvcmtxe351dWJ0hYp6h4aAf3dydX50YXBsWXByYnFxhHt1ZHKAbGFsem9qaHl3dHJmhXV6enVxZGFkbnN+amxUaV9eVExzY1FHV2JHYnZlYEtUcFhKTFhYZ2t2emRlbnBmY1pYXVh2ZVRKXGNYaFhZSVdlUUhieFpdX2xbXlxiZF6AaWpfb3R5bW9udoOXeXKBgH1/iIuGfXZ2hniHjH1zdXWBeXp6goyOfX6EiWp0loF7ip19foV5gHp+fIaIc3GProx7e4aQfmZyiHp0fX12cm+GbHt+bI96YnBvYWVeZVZZWVdjZmtgXV1zhmlYcG1bX1dbXGx7Y3B3dmxiW21zdGd1dnFthXl/gHl3bm90ZWl0ZVtndGZ2dpF6X11SZmZqgoF0fWFjaVxUWF5iY5ClaHl0goWQeG1ueWd3bXuEenSIcoB4fHh/aGV2bWBmYV9qYF10a1llXW9vYnplW3d8a25ucHh4dHRkcoOSfoeCiHp2b3F9cmF3ZFpub2FwcYF8c2VxgGRebnZpY2Z5enRtboF1c31zcWJeZm5vfWVpVGlZWVROeF9SSlpZSGJ0Y2BJVG1USUxaVmlscntibGxzYmFZWlthdltTS2RdWGlTV0hZYE5HaXVYXmFtW1tfYmNdhWloYW54eWxva3aBkHhtg36AgZKIhIF2dYl0jIZzcXZ2gXd8fX6Mj4B+k35weJaDfZmSeYCAeHl+f3OIg3NwmaJ7en+JlXlkdYh5c3h2bHRvfmx5fHCRcl5wbmBnYmxUWlpXaGNtZVxccolmUnJtW1pYWGBsdmRpdWpqXlptc3FsdHR0a4Z8foB8d29ubGRpcWNba3JkdHaPc1tXVGRgcn9+coJcYWNdU1pgXGSTn2VycYWEkXRsanlsb296e3txgHZ/cnp6emRldWdeYlthaFxed2hXYl1vaGF3YVt8dmppcm93dHN0aHCBlIKGfoR2cmpwe2xmdldcam1icHKAenNlb35bYHBxYl5pcHxsbHR+cnF4a3BgXGVsbXthZ1RnVVdSUHZbU1BaUkhjc2JgR1ZrUUlQWlVra2t8ZW1vcWBbWlhZbHBXUlBmV1doU1RGWlxPSHJ1WF9jbWNYYWBhXoxqY2RteXhrb2l1eYZ7a4N9gIWZfIKEeX2Ibo+GcW93enx0goJ8i4+DgpZ0eIKUhYGfiXWBgIF0f4Jwh4J1b6KXdHuGi4d7ZniLb257b2Z4cHpsc3ZzjWtedG5hZ2VrU11bVWdibGxbXHGMZE5vbVxWWFVnaXRoYnRlZV1abnVucHV1emyHfH98iHeQc2Nla29hXG5tY3N4h2taVFZjY3d8fHCFXGNfY1RbYFpjlpVjbnCDhYpzamh6bmVydnN7a3l0dW96fnVfZnJjW15XYmRZYXVmVV9gbWRhcV1dfnBoaXNxc3B1dWtthJOBiHuFcXJmbnxvcW5TWmVqZXFzgHZzYmx2VWJxa1tebmV8ZWx1fHJycmptYFlkamp4XmZUZVVWUFVuWFFXVFBIZXJfYUZXak9IWFRWbWlkfGlrd2thV1xVW3RjU1JXaVFZZlRTSFpbUE54d1tfZmxpWmJgXl6PbmJma3l1bm9pdnZ/fm2DgH6Hl3t/h4GKf2uTiHJndIB7dYCDfYmPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6ljHOBjYx3eG57jWBkfHFmenN5bG1xdoNnZHxsY2ZnaFNfX1RnYGxvXF5ujmhNaWxgVVZTb2Zza2V4ZGVdWXB0bXJ7eHNtiHuAd5x7emxhZWxtXmBuamVweX5nWlZYYGt4e3tvg15iXmdWWWBYZJyIYmtxgYd9d2tqd2xbdnFreWl1cm1ve4ByWGptX1ldVmJkWGVxY1ReYWliYmxaYH5sZmtzdW5td3ZraIWMf4h6h21xZW97bHFsYlhfaGhvc4B0c15pbVNlcGVVYm5heWJwdXt1a29sal9YYWdodV1lVmJWU05ZZlNPXU9PSGVvXWNHWWlNSV9LWG1kX3hobn1kYFVeVF10W1RSYGZOXWFUU0pcWlFadXVdX2ZtaFhiYVtejnFjZ2p3cXNuaHZzeYNzgoN7iI1+fIqHjnpukIp0bHOCdH9/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjI2NjY6Pj4+Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvMDAwMC5ccG5tbm5xSSwwMC8vLEmFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIaCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHhwcHB0dG1NqZ2dnZ2s8GBwcHR0YO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHiIiIiIaNkJCQkJCQjIeHiIeHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4OEhISEiIqKioqJiYaCgoKCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkpKRiYeOipCSk5CKkI2OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+OjY2NjY2NjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiIiImOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYiNiZCJi5CPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+HjYyJj4aNj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+f35/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISLjImNho+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIuOjI2Ljo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7e3x9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6e3t8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e318fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7fH1+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6Qj42KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJWVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTlJKTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkpKRkpKDkJOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpKSkpKLipKSjXqRkpKRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCRkoh3kZKEd4+RkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pi26KkXp1jJCPj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4+KaICPdnWJj46Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjYlpd4x1dYaNjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHgGhtgXFzgYWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXV2d3VoYGdgZGluZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZl9rbGBqaGlnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN2eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpcY3RtZXFwZV1aWV9bWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVJocGxhcHVrVFBRVFBQTk5PTUtNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OVGZsbmNvc3JXTk5OT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRUlNYWhrcXFvbllMTlJWUE9PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVBS09HSE5haGZwb2toY15jaFdISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj5AVF5ZXWhtaW5tbGpqbGxWRkJERUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7PDxFWWZpa29qbW1qamtsV0JGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs8Tmlub2ttbGlpbFVAP0NGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojg3SWlvbXBua2tXPDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT08Smdyd3NsXD89PT4/QEFAPz9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXR0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11uQD5ERT8+R1t5clRAPDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXZIODs6PT5APWdcOTw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUTw9PUlMRUZ2dk03ODg6PD8/U1U5Oz08Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXx3Vjw9Pz0+P0JVWzo7PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4KDgH1dPkBDQEA/PlpjPjs9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2FdUxBQ0VAPz9QcnZMP0NFSUpJSU1NS0VERkdIRkdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRWVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVxQkRFRENXdYeIiH9YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+fn19fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIpsQUFVdIeJh4eHiINXSExNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElISEdIRkZGSEpJSUlJSF1vb3FydHZ3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINVbIWHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD0+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGg4KGhYSFhoaGh4iGinVJSUZCPz9APz8+PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTo/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTFNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf3+AflFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDhISFhYaHiIiIiYmMjmZCQj44ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJiouMi4qJiouMiVQ6ODY1Njc2NjY0Njc2MzU2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIGDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2Ojk3NjY3NjU6OTo7Ojs4OTg5ODc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3p7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiImKioyKiYmMej45ODg7PD0+OTo7Ozg5Ozk6Ozo5OTs6OT09PT47Ozw9Oj47OTs7PDs8PDk5PDg6Ojs6OTk5PD88PEFCRElKTUtJS0xXb3JzdXR2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gH+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkFDRUVBQUFCPkBCQEA+PT0+QD8/P0A/QD09P0I/QUE/QUA9QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4qLXj5DR0lLSklGR0dERkhHRUJAQENFQ0JBQkNCP0BESERDRURFRUJGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFxdHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGWIWCg4SFhYaGh4mJiIeGhoaHiYmKi4yNjIyLioqIV0dMTU1LTklJS0lJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJAQUNCRENDRERDQD07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f3+AgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkJHR0lZhYKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1PTkxOS0pMSklJSEpGREdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA5ODw7Oz06P0A+P0BDRklJUF+Cg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1yTlFPTkxMS0xKSEdFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISFhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRkJHSkdMSkZLTktKSkpNTUxPUE5ISUtMT1FRUFFPT0pISkpNSkxGR0hHRkdIRkVFQkFCQlxvcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxYVlJSVFJPTEtKREVGS09OT1dVUVBPUVNSTVNUT01STFBTVVZSU1FQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHSEdHSEY+QEI9Pz09Qj9DQ0ZWTkZOT1BUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hXVmthRVJRUVBJOztRU1JgdV1VVlRWWVlSWVhSWmZQVVdaXVJUV1FQTlJRUFBRS0xLSEhKSEVGSUlJSElpcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0ZGRT8/QUFFQkNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJdXVZdWlZFUVlaW1lfVFpnUlZWWFVUVlRPT01KTEtJSUxNS09NU29zdnh5eHd6eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3lucFhaW1pSVFJWVlRaWnWDWVV9kGBcWF1fV0lWXV1bW19ZSVlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin9mWVlcWVNVVFdSUVdWY5aAUWVyWFpXX2dQYGZbW1hcZ2FHT1poZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlbXVRZVVZdWkxUWlRTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcXN2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+e3h3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmJh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlRjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1dHR3e3p6e3t9e319fX59fX1+fX5/f39/f39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSENESEdIS0dEQkFEQU9RTVNkc3R2dXN0dnp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT09MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgmxNRz4/Ozs+QEA/Pz5qUUthRUZISUVCP0dMTUdNUVVJQkU/Pzw9PD09Pz0/QUNDQD88PUI+Sk1HVW51dXVzdHZ4enx7fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVRXUVFXVVBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV01IR0BBPDk3NzU5OT07Ozs4OTg5PztCSD9cc3R1dnV2eHp8fHx9fHx9fX1+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJPYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2Njc5NTxCPWVzdHZ4d3l6e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFJMWFlaVlhYVlhZXVdYWGhza11WYXNrYWFfXmRhX15ZVVFNT05MSUhKS0lIRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbXF0eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1ZUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBSUk9NTU5OTkxKRlFQVVlTVE5KT09VU1RcVlJVU1JPTUxJSEhGPz49Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH19fX18fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUFBQTk5PVExNSVBPU1RVMj1YTUlBUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMS09RUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjQ1NjY6ZG9xdXd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0lGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PT08OT1HNjY3N0RtcHR2eXt7fHx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dXVllZVlFRUU9APjs9P0FCQUNAQkVEQUBHSEdIRkZISk1LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydXl7e3t9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT09NUVNMVFZUV1dVTExLST05ODc7P0A+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFBSYlxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSUpMTEpGRkZFP0JDPjxCRj9CP0FkcHR3e3p7e3x7enp3fHd5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0JAQD5BRElFQ0hHSUZJRUJCPz49Q0JBR0pFTU9iZVFNTk5XS0xNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7ent6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkJBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlFUTEpJTVRHSUlKTEpLTElKTE1PUFJQS0dDTEdDQkpKTE1PTUlKSUdDQ0NESEpNTElZcm13eXh6e3t5fHZycHVydHl5dnhqcW5rbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFISkNHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQkNIRkpMSkRJSUZHR0NDO0FAQj5AQENEQ0lNUEdJS0dIS0RISUtNSEpMSElKS0pNXVJISERORkFDS0tNTVBOS01KS0ZHR0pNTlFOTGJtaXZ2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0VGRkdFR0JDQD08PTk6OjpAQ0A+QkNERUlGSkpMRkhJR0ZGREI7QkNDPkBERENFR0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0pIRU5JQkZNTE9NT01OTk1LSUhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZmtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pDRUZFQkNCRUBEQj5APzo7Oz06PT5DQT5BQ0VHSkZJSEtIR0dHRkVDQD1FRUI+QkRDQ0VHSElHTVBKRkZHS05PS0ZISUZFREVJSkhLSUdIUEtESU1MUE1PTk9PTktKSE1SVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSERFR0NCQEJEPUJBPkA9Ojo9Pzs+PkBCPkFCREdLRklGSUhGRkdFQ0NBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFRkVEQ0lJSEtKR0tSTUJOT01QT09PTk9PS0tLT1VXVlVUWF9eXGlhbWluaHJzYmVmZWRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HR0ZIQkJAREU8QUBAQzw4OT0+OT88P0JAQEBERkhFSEZGSEdFRURDRUNESUZDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUpJS01LUFNORFFSUFFSTk9NTlBNTE1TV1ZXWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW96TUhHSEhCQkJGRTxAQkJEPDc6Pj06PjpAQj4/P0NFRkRGRERIRkRFQ0RFRUdKRUVKR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xMT09SVE9JU1VTUVNQUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnaWloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN1bnByc3lOSUlHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPT8+QUJGQ0VCQ0hFQ0VFRkdHR0lGSEtIQ0lIR0lIRkRIS0lHS0hNTEpLTEhMS01LSk5MT05QUlVWT0tVV1RRVFFSTE9RUE9UWVpaXFpZXF5eXmBjXlxhY2tiYGRnaHKFaGdqZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdU1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkI8QD5BQUZDRURESUVGRUdFSEhGSEdJS0pGSkhIS0hGRkxISEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd292SktMSkxHQkVERTxARkREQzs/P0FAQEBEQT9CP0FDSEJGRUZIRklGRkRJSEdJSEpNSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QS09QUlVYVk1OVFZUU1JRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJjaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dLTUxMTUdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQkRBQUVHQ0dIR0dGSkdDR0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkJFR0NDSUZDSEpKSUlLR0RLSkdISklJS0hKSk5MTkxJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KS0pGQj9AQj89REVGRENDQkVFREZCRUZIQ0RKRUVKTE1LTExHR01JR0lLSEtLSUtKTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXhta3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEQEFCPz5CRkdCRkNFREVFRENISEdERUtHR0xNTktNTUdKTkhKS0pJTEtKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncHBqaW9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9QEBGR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xNSUxLSUpNSUpKSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSURFRUNBQjxCQEJGREdGTEhFQ0NIS0hIRkpMTEZOS0xTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFAPkNEQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTUxJS0tLU2tiWmleX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcb2ppZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRUVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRkhIS01JSEpJS0tJSElHS0tMTEZIS0tMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFlcmlUWVdcW1xVWVpdWF1cXGNmYWFlYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NIREZHRElLTEhGREdLTEhER0hQS0xPS0xXTElGRUhJSkhJS0lMSkhGR0dJR0hJRUZMSUpLTkxJT1xXXlBcW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRUlFR0dGS0pLSEVFSkpKR0VISFBKTU1KTVNJSEZBSEZKSUtMSUxKSEZFSUdERkdFRUpIQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2ZpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNHR0VIR0hLSUlJREZLS0tGRklKTktOTEhMTkhIRj5HR0xJS0xKS0tJR0VJRENEREJHSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV5eY2FgYmJiY2NlWlFZVlVcWl1jYF9fY2ViaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFSElGR0hIRkZKR0hGSEtJTERES0pNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0dDREBEQUhJQj9JSkhPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU5eUU9cX2FjZGNjYlxkY2JkY2ZYUVVUUltYWmFfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSkZGRkhHR0lGRkZJTEpORURLSkxOSkxJS0pISUZCSEhRTUtLT01LS0lIR0VEP0VDSUhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11WWWBSUV9fYWJhYGJiYGNiYWRkYlhPUVFRW1NbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFR0lKS05MTElMS0lJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VDV1VFXFReU1ZfWE5UVU5aW01KS1RgYVtfWF5eYV1PWWJcYGBfYmNiXWFiV19fVFBOT1BYUl1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQQ1ZeSUdHSERGTUpQUEVJSUtLTkxLS01MSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FFRkJNSEJLTFBPTkxGTUZHSUpIR0xMTU9QSUxPUE9TUExRU1JVWllXWVhYZFdPU1RQUE5NT1VUW1lZW11cYGFkZWNnY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hNR0hKSEdNTFFRSUxLTEtOTlVOT0tLTEdHS1BUU05QT05PTk9IS0ZgRURfTERmY0VNW0leW3JtT01VbVlMQ1BgVWxXZ0pdV1VeRExRVUxNVFZRUlRYV1RYVVRcVVBmWmhoZFhTa1NWVlVbXFtgYGFhYWJgZmhmbmxocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtGYFRISk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUX9RSXxZWXJzWFBtSHFub2FWUHFxc1BDa3NtcXRwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X192X1hhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEZKTEZSVkxLTklLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWZ6dXhxcXpxfnN9a3V9YlJnfGVzc29zcnt8b315b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQTk1NSk5WXllVTFFTTllaTVNTUk5MT0lRUlRZV1dQVFBQUFFLSGd4bGN4cm1aS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JSaXtsaWp6en1seHp/cGhvWHZ2anV1cIBgcmd9aWx4fG9eX19iYVtdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKTFFPT09NUFpgWlhLVFdQYV5SVlFZU0xPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vY1JncXVubXlwd2x2dHRxbG1cdH56a215fGt0bXxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUElMTUtMUVFRUFBRV1xZVU1VWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ8XVRLbGB2dWtpdnx7bX54a3xwXV5eYltfYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElJSFFQTE5PTEtTU1NPU1JXUlZUUFdbVlZUVFRhYFBOTktUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRUEtKUlJLUU1LS09SVVJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVZWU1pRT1NSV1ZUWVZUWVVUUlVUVFRXWFddWl5hXVxaWlxcYGNcXWJjZGZkZWRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTU9WVE5RTk1OUVRQVVFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWl9dVVleXF5dXF1gYV5bYmJjZ2ZkZGJYX2FiXmBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXGpkVlhZWldWVFRQS09WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVldRUldYVltbV1FUVlZWVllUV1hVU1JYVlVaXVldX15WXl1eYFxcYF9fX1piYmRoZ2RkYVliYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF9bWVZWWFJMTVZTTU5ST1FST0xQU1JVWlVTUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpXVlxeWl5fYFVhXGFhXWBiYF1gXWNhY2doZGZgWWNgYV9fZWRfYGNbWlxbXFlaWFlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cX1dcXmpxd3mAY1xbVlZZUU5PVlNOUVFQUlRSS1FUVFlaV1VPUk5TWFdUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlTVFlcVFNTXVhaXV5cYGBgVmJbY2JeYWNfXWJhYl9kZmlkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFtdXl5bYFxgVVxdaWpyfXNsZ1xVWFdRT1JaU1JRVFJUVVRLUVdWW1paU09TUlZWVlRPVlJTWlJUVVRYXVdYWFNYXFheXVlaXVRVTlZXV19bWFJVVVlZWVVXWVtUU1ZeWV1dYF1iYl5ZYFtlYl9kZF9eY2NhXWVmaWRmXV5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVZVVFRU1xUVVRVVFZZV0xSWlddWlxST1VTWFZWVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paVFVWWllaV1hZXFZUWl5cXmBhX2RjXF5dXWVhYmZkXl9kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdX1RdX2JlZXaCe2hYWVlTVlNWXFdXV1ZWV11YUFVdWl5dXVRTWFNXVlRTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxVVlhbWltZWVpaWFZdXl9eY2JhZGRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVdWXGBhYmNhY15fVltgZGFfenVvaFlcWlVXVVdbWllcWVhZYFdQVl5cYGFcVFVYUFVXVVNXVlJTVVdaWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVpZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBrZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllRV1ZXVldWVFZUWF1cXmBgXWFcV2FeW15cW15YVlhYW1tfYFxfWFldXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgYGVjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWlhbXFhXWV5gYmFlYWRhXV5ZYmNiX2FgYV5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBYV1hZWVdWWFZdXV5gYWBfYl5ZYV1dXlldXllYVldbXGBeXV9aWl5dXl5hXFtbWlxgYl5iZGNlZmVmYlpkZmdpZ2NfY15hZmRaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVdcW1xdWldcXV9gYmRiYmFdYFhiY2JgY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpjZWNgUlxZT1hYWltaWldaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfX1xaXl5gYmNcXFdcXmBiYmNlZGdlZWZkXGVmaGlmY2JiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBjY2JcW1taV1hpcWBcYF9dXGFjX15ZWWRlZGFTX1pRWVhcXVxbWltbY2BjYmNgYmRhYGNeYFxeXl9aWFZbX15dYWFfXVtgYWJlYl9dVFxgYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7fHt6enp6enp7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiYyNjY2NjYuwwb6+vr7BooqMjIyMjYl+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyNj5CQkJCQjrvOy8vMzM+qjZCQkJCSi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eXh4eHh3d3d3d3d3eHl5eXl5endvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fXx8gIOCgoKCgoB8fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dXV5dnZ2ent4e3h3dnh7eHl5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp6enl5eXl6enx7fHx8e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx7e3t5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eXx6e3h7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8eXl7d3x5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en97eXt5fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHt5eXl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKCgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4SEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZF90fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHd8e3t7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidX18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJycXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoKBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4b3BwcnJycnFxcHBxcXFycnNzc3NxcXJwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm5ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3JycnGFc29vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBxcnJ6e3FxeJZxb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFycH6WcW+DnHJvcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFwdqR7bpCfdm9wcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXB2qohvmaF6b3FwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycHarlXGdon1wcnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3N0equie56ifXJ0c3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHh4eHiUsqWkq6d+e3t5enl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fn18fHx9f6amorKkqIt6e3t6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX6GqJyjq5qem35/f398fH2Ag4KAgH99fX18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgY2jk6Ctn6GfhH+AgYB+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f39/gYGAip6MlK6clpuHfX59fn9/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f4ODgH6IpaKZn5uWnJSDhYmNhX+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSkpCLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GEi5CWmKSupqKbnaCnqaGhoJKBf4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYKElKmwsKSdop2en6Gio5+SgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoCClJ+fnZmhnZ2gn52dk4eHh4eHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGCjZSVl5+dnqGem5WIh4mIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEhISEiJOWnZeanpyShIOFhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4KCgoKCi5WXi5GcloSBgoCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4F/gIB/h5KKj5KFgYODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDipaIhIKEgoF+gomMgoKCgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAio6AgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqEhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgI+Mg4F/fn18fYycjYCCgYKCg4CPk4GCgoKCg4OBgYGCg4WDg4ODg4OEhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeMgIOBgYGBgpmZhIGCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p+hISDhIKDg4OFjY2FgoKDg4KDg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUk5KSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhYWCgH59fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhoaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMi4iFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aEgH5+f39/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWGhoWFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhYWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6Fgn9/f39/f39+gICEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4aHhoaGhoeGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CBgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISEgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCMh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357eoCGiIiKiomJiYiJiYmJiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI6QjoqGhIaFg4GBgoGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgYSEgoKCgoKCgoB/fn19fX1+fXx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYqJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoODhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDhISCgYGBgYGDg4SDg5GSkI6PjouHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiYuKhoSGhIKGhoKChISDg4ODgoKBfn19f4B+fn5+fXx9fXx5fIOGhoeEg4GDg4SFhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoKBgoKDg4WDhISFhISGhISEhYOCg4GCg4OEhYSHkpGPjY+MioWEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4GDg4ODg4KCf31+f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgIGAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn5/goODgoODg4J9fX5/gICBgH59fX19fn18enp6f4KCgX9/f39+f3+Afn2Af3+AgIF/gICBf39/gIF+fX1/gIGAf36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX5/gH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gICAf39/fn59fn9+f4B/fn9/gH+BgH9+fn5/f359fH5/gH9+fn9/gH9/f3+AgH+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYKEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+BgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gH9/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f3+AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCBgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf3+Af4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOBgoKBf4GAgYGBg4KCg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIF/goJ/gYCBf4B/f4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4KCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeIh4eHhn99gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjISDhISEl5eDg4SBfX6BgoKBgYGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoSDgoODgoKCgoOCgoKSkIuIiYeJh4aGhIaFhYSEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeIiIaGh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fYGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CAgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOloB9fn+ChoqFg4OEgoGDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4OEfHyBgoSCgH+Hg32DgX+CgoGDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9fH59fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fIB/goCCgH59e4qCfYB/foGAgIGCgYKAgIGBgH+LlJCMi46OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/f4B8eoGBeHuAgoGDhYSDhYWGh4SFgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIKAgX5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gZSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgICAgH9/f317en2AgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYODgIGBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36MhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjIyPjYuKhoSGhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fnx7fHx8e3t6fX+AgISDgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2MjI2LioiEhISDhISDg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9e3x8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhoaGh4WBhJGPjYqKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+fn58fHx8fH18fn57fHt8fHx8fXx9fH58fXx7e3t8ent8e3t9en1+fn+AgIOHiYmJiomKiYWIkY6MiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn2AgIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fXx9fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4eLi4uKiYyRj42KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgn9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3t5enl4eXt+f4ODhIeJioeJjpCNi4mJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf319gH58f3+Jg39+g5CEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjoqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIKAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH9+foB+fX5+gIF/gX5/gH9+f4B/fX9/f39/gH5/f4B+fH18fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKioiIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKEg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICBgICAf358fX19fX5+fYJ9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmHh4WFh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+f3+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4OEhIWEhIOFg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xeXh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SDgYB/gH+AgX59fX6Afn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn19f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKFgIOCgoKDgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgIB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAgICBgYGCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfX9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYGEhIWEhISBg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2d3ZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gICBgYCAgICBgoGAgH6Agn9+gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgIB/f4GCgIB/fYCBfn+AgoKAgYOChIWGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXh5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgICAgICAe4B+gIB/gYCAf32Bf35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDg4ODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWGhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgIB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af319foCCf36AgH9+goSCgoOFhYKCfn19e3t8fHp3fHl3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB+gH99fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KBhIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGg4WDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgYGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgoGCg4B/goGEg4OEgYGDgYKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGCgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIODhoODg4KChIGEg4GCgICCgYSBgoKBgoF/gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4WGhIKDg4OEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHyAgX98fH16enx+gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYKGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIaEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgoKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhISGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WFhISFh4aEhIWGhYV9d4aDhISCgYF9f357fHt+e3x8fX9+fXx+foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoOEg4SBfoCAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4KAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn18fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYOCgYSFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaHhIOEhYKBgoGAhIODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7e3t9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WEgYGDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoaGhYOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCf31+f35+f4R+e399fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1+f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7enp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt9fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXV1dXV1dXV1dXV1dbX19fX19fX19bW1tbW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dTU1NTU1NTU1NTU1NXJu729vb29vb29vb29vrSKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E9P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oip8/T0tLS0tLS0tLS0tLUv6iqqqqqqqqqqqqqqqybU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSko6jP09LS0tLS0tLS0tLS1MGpq6urq6urq6urq6uunVhXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsz9PS0tLS0tLS09PT09XCra+vr6+vr6+vr6+vsaFiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tTV1dXV1dXV1dTT09PU09LS0tLS0tLS0tLS09PRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M/Q1NLPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXU1NTU1NTW1dbW1tbW1tbW1tfW1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXTyJSn0tHHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayUyZqsnLDRmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpqeXiJyexJKGnZzOz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI5NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZeiwMmYmMW8yZeZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmYptaUlp/O0ZKZoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGanbuzn8Ob2q2jv57V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKDTzYqSnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLI1c3bpZmz0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPuMiPp5qgrZCnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZSMp6WooK+noqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQqKGSjbrVmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9LUucfV09O5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKinqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqalo6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqanp6afm5qboqCalpaVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Gfl5KTkpeanJqXl5eYm5qZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ+hn5eRkZCUl5qdmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoaCZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSko6KhoZ6cm5WTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6SkpKKhoZ6bmpmYmZmYmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoaGfnpybm5qbm5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhn5+fnpyZmaKdm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCfoJ+foKCgoJ6bmZyxnpqbnJubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6dnJ2kop+cmpmjrJ6cnJycnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZyampubqaObmpqco4uenZ2dnJ2cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJmbmqaimpmbnpd0npydnpydnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyYmJmZmpmjnpmZm6GOZJudnZ+enp2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZmZmJiYoZqXmpyjglyYoJ2enp6fn56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmKKVlJuco3hakKKdnZ6en6Cfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eikY6dm6FxW4Wlnp6cm5uenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qaloySnY6ImZWcb2J2npaVkpGNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCQj4uRj4uMj5CQkY6KiJaNfouKjnRoaYuIjIWHgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mHhIGGgoCCiZWQiXqKf4V2amSCgId9gIGSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgX1/c3yNjIR6i4SFc2pghop5fXyGjY2Lho2UkouQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouGiIaEiIiKhH+Cf3p7hod+d4eAgm9nW4KLgoSFio+LjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Ni4uHkoqHhpaIdmyBhX5oY1h/jo6KjYmJkI+Oj5SUmJCVnJqdnqiusq+wtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnaCdk5eaoZqdnKKhlY+hi3NsfpiIZWBZgZGRjpGOi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqaeipaiprKqpr6CdppF8e4udmnJiX4eXlJefn6GknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6qspKGipamnp6ioqZyNeHuWjpZ4cG2TnZeeoaGop6Cioq6rq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqaikp6aZnaSmoqGgpKaKemZhjYOFY3Bzi52Wn5qZoqKgoJ+goaignJ6hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatp6acnaacemZWTn57eU5faniam5yZm5+eoJ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1tVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq6xs66roqGskmtRSkl3dG9FUWFrkKOdnZ+dnqSioqGgopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKKqqqevt7a1tbazrquvq4JcSENHcmlmQ0ZYZn6fmpyblqKnpaepn6ObnqGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gqrK4vb28u7q/tK6xvJ5xUFdNRG9hX0hET2BvlZaTmpajq6i2raKjpKumpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmxwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vMHIwLu9xrq5uLyNYVmOckNsYF9OUldaZpGflqKkqKeguqaqq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDub3D1NbHwMK8u7q6iFZ7wqpObm5nUVtkXVyIrKinrKKLlLWmq7S8sLW2qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV2bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwtXg2sq1vLzAwJJQi8C/YX2CeV1KaXBTerO4qJyCb5awo6axtqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2lmaGFrbGdudXFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8LL29nKs8G8wMalVYKionCcj4V8RXeOVWursJR6Y3GrtKaqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8fnRrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExM3Pw724uL7Fr2N0e2uLt5KImVd7j11rkIVyYVqNt7WsrqWko6ikoJ+lmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpZ3VaZnJ4c3lmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTFy8Krqa2yt55wcW1cpLiQiJ1oZ3JoaGplXldopLq1s6ypoqGtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbnh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcvLr5eZnJ2OdnBjYKqqjIuUcGBkZ2FdXFhVi7u8urysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGlpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzsObhoiDeWdfTWChmYeMi3NlYF5YV1hVZ7TJwLy+tLCwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jKtH5xal1RUEJcjIJ/gn1vZltYVFVVVInCwMC6ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2pkYmptbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwsGSXlJNSEtBVXZpbnNvaGddWFRWU2CpwLi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjY2NqYmdjW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvGr25JRkRIQE1kWWBnZmJoZFlTUluMv7+6t7u+ubW4tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamZnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wteNur66w7W5x7ecYEFARTtKXFNYYWFgZ2hcUlN+tMW8wb+8xLe2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmb2llbGhYWE5LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDEdarLvce4ubett49QQEE4TFhTU11fXmVoXVNhocHIw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdxa3NmYm1gXFRJS0pESkNDRz45Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrHKAvcjPwsC3rbWtfU8/OE1VUlNeYFthYl5VjLi9x8vHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHFmbGludG54Y2diXGNRS1RIRUVDR0I8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0pZucq7S0czKxLW6v66CTDxMV09UX2BZWltWb7e9wMPMysfFxsC5vrzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmBhTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysGEcHKmzMzLzcrGwsLJvnVHR15QUlpiVlFSXKLCv8XAysnCw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3xgcWNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u5rdvCvra+wL6+uqacqrO3xMCldnR3ncTGy8jBw8C/ycumbEtdUlBWZk5KWY/EwMDBv8rHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3hzaHBdW15dWVJGRENNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFtG2vzr22ucC8qn1uaG5tdIKYl3B3fJi+v8bAuL+8vcTDvKh0ZlhWY3BNW5DAxLy9v7/Dwr6+x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV7cG5pW19fWVNQQUZIR0tARUNIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbB1grS9tbXBpIZpWV5gTlNbXG9ydoKguLfCurO6t7q8vrq9sY1uZnSEb5m/xMK9u766uri1wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9mXVtUSj0/P0dGPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmlhHiMorC1nGpmZ1VZX0lJTVFUbHWHprC3vrmytbG7uLu1ucCvn3Z5mq29w8XDwLy/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYlxeT0lCPz1JREZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Gp4d7do2hl19TQ1lVSGJqVU5ESWSOoayvtrq1s7Gru7i4tLjBu7uCdZu3vMHGwr65ubWtpayzsaawraieoJ+lrba1wre2tKWoq6iwtrOyura7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3ZybmNdZ1hdXVNPTUE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7OQgXmIj21NSkBlWUJQeIGTZ0xCXYKwtbO1srSvrLu5uLa5v8K3jXWErrW6u7i1srGtrJ+kpqedo6WdlpmZmp+prrmsq6ufpaikq66vp7Csr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWxdW2pUXVxQTkhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7i1lYyIhXtXRUJRiFhJSlh4jYFhQFakubO0s7CxrbC5uLa7t7q+sayqpK6tuK6pqqyro6ihnZ2dl5ehlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVWFjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yu6mYmZRnTD9UeXFOSUlLaJ1+WEVYs7uxrLOvrqyttraytLWuqKKdm5ubnKennp+oqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXVFoVFBOR1BNTEJQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3BqqW9ZkVToYRQV0lLX0lYi2BlZoSvtaqytK6qq6+wsrOtpZyQlpKOl5+eoaCco6SfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6empeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+YnJmbpJmXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFVSZE1KSEdPUk5KTkg8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCsxr/Lnk5BdZxuT21KTWNmdnRgXWJzkbKvrrO1qqasq6KbmZSNkJWWmJebn6Ghm52knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGlopuYnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJTVWBISUpLU1RJUlFNOT9CNjc8NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpcfGi1ZSS2ajWGZ9b3JbUWtjXGdiYGyRtLCwuKymoZydmpSXmpmPjZCVkYuNjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKqyrqOZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKT09VTFNNQjc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4t4VGpxd3ZvZHd2WFdiYGRpW1tWZ62urK+nn56ioJaQk5ugm5iXkZKfnKGjm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpafm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWp3dV1tWlFgSFJVSEZVVkpDTUc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjfm6CcGBjV0xbUlpMTFFZUkhPTUearKqppJ+fmZKRk5iYlpWVjIiKjpWdnJ2dnpaemqagoKilsaqnrqOrrrawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+np6Wkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOem4hhV15lYFdNUUY9P0BDRD8+QlF3qa2pqqWfnp6io52enZqcm5STlJSdnZiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqzta+zrqqvo52rp7ayraKwpqCjr7GusKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3RycWhWXFFGVElESlBJP0VBNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFBGRTtCPkY8Pjk2Tn6qs6ejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMrJw8HGvrq1uru1u7ewtbKqurKuu7e/u7qruK2rqri6tbyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFNNREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklafG9hQT1cjq6soJmbm56emZeXl5KMjpaXk46NkIuCg4J3cnFtcI+mra60ucW7zcfLv8LMzc3Mx8nRzM3Mx8nFxczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfFx8XCvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREVQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ2VaWZcVElEQD9Kh56kmIOgsq2jnpyfmpeWlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fS19LV1tPUyMzGzM3J0s3O083FyMrKwcfMx8nIxr/Ds7PIxMvLy8/Hyr++v73Bx8XNzMjJwMO/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DVLHRvbKvppycnKCkoZ2alJOVlIl9d3BrZWJocW9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s7U1tfU09HT1NTTz9LD0NPW2NXW0svJztHLxs3SytLV1tnW19PX2M7Sys/RzM/QzNPQv8jHysTMzMzOz8XGx7a/yr/SzczQxsnIwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTU1ODY7ODU6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqBZSUBBREFGUXeyr6ealJefnJqgoJ6bnJmViXdpY2BfX2BfXl9fXWJsdXRwcG9scnF1ksTIxtTW19fX09bQ1dTa1NTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0svO0MDGwsjGzs7R0dLIy83AyszG08/MzsjFysfHyMzK1NTR1c/SzNPCucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6upqqooaOqZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cGVjYl9fYV9eYWBfYGBfYGZtcHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0crPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY19fLyM7Eyc/MyszAycDIys3O0MvQzc7Mzs/Iy9DQy87KwsnHyczLzNLTzdPR0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspayuvrSwwNjS19rc1s7NysPSz8HAsKmsramksXlIRkI7V46hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBgYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3N1MzO083L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXMwsjJw8zDxcjKy8/Kzc3QztPMxsnPzcjHy8XGwcbKzM3Q0cbQzs7NzNDFx8G4ub3Dwr3DubKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHBoWVhoVk1HTElQUUI7Qz47Njg6ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKifrZd4bHBye5GajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNiYF9fYGFhYF9dW11ncnFxcnNwbXJ5pcfTz8vQ0NPUysXJycbGv8PFz87HxcfNytLIy87OxtHS0M3M1MrHy87Px8fP0svQz8a6xL/Gyb3Cx8nOxMLHwMfNyMTMyszPyMTE0MjGwsbIxL/Bx8zMzM/CysvJx8vQxMXHu8fDycnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vbnNzMbQ1dXZ2tvY0MnPz9HTyMK2u7uto7Z9aIOFpKuUjo2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19cXV5fYGBfW1pcYWtycm9va2xvb3250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLKycHBy9DFy8i/ucG7xse+v8bPy8O/w7vJx8m7yMfFysC+wsvGxcS+xr28wMPFzMXFvMDJw8XH0sXByb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVe3dydGZpWmFubVpcWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sa+2bF55faKRi5KWhnqAhYV/dnh1cnBfWltdYGBiY2RkZWRgW1xdXV9eYFtZWlxib3Jva2lscG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8PJv8HJu7e7u8bDv7zBzcPGvr61wb3Du73Gu8O6s7zFxMLDt7+1tr6/u8zDvLW6yLq/vsvDwcbCxcnHycbQxsLMx7LHycPOzMHFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NWXllKRkpFR0tBRUJGSkA5OjY0Nzg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys7FycXHwbnFvautpV9kdYSTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNhYWRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvczAw7rAuK2wsaeqraynuLS2tLOztLu1vrG2sLWvsrzCvMHEvMC7tbK6vsC4x7m0u7bBwr23vMbBw7y1rrK1ur+0xLe7tau4vb7AvbG6trC2urPFvLauu7+1t7TFvL7CxcDDxcbHy8XAxca7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcbAv7q3ybaqsJhbaG+Kj4WIiXp4foaGd3eBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZrbm5yfKTHwLi4tbCrraeeoqmnnqqss62qrKm0rrexs6mupqyzvLq2w7m6urGrtbm7s8K6sMCxvry8trzHucK3raqosLLAtri9sLGosbO1u7yrrrWmrravu7Kwqrmwrbuuu7i7wMC+ucO/xsPFwbzGwsjKuMXHxb/Hw8O6xMbCu8bJzMuzucK9u7OJc3Z2a2lhYmxoWVdXW0FMS01KRUFDP0ZBOjk6OTk1NzU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xMTDw8rCycq/wLzCurO0tcOuqbCRW2p/koeOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWllaXGVub2hmZ2lrbnKBrbqwta6lpKenmqCkoJqcpautpKiiq6qsq7Cjpp+qrbW2sb25r7ewqK64tLS8uLS8r7i5tbK8wLLAr6Woo6uxsrOovaqrqKusrbSzpqiuoaSvqbKmp6iupai3rbGyt7q6u7K8vr6+xL+1wsHHyLe+v8W3xMO/u7/Ewr7EyMzKv7/DwMCph3N0cmppXWFvY1dWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWqpaylnpyhpJSdpJuXkaGjqaOjn6Wmp6atoJ2cpKassrC2t6exraiqtau0ubG2tq62ubKwurqxtqWgpJ+msaerqLmqpKenqKeyraCnpp+bpKasnp+no6Chsa2trLK0s7Swtb22u8HAsrq+w8GxubnCs8G+wLW4vL2+vMLHxMPEv8DEoIN4cGxiZl9rb2BVWV5ITmdPVEdGS0Y8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLwsa4tsfAzL+4ybe7xbizxLizv8CstbyyrKWvs62ho5JpcoaFhoB8eHVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21vh52pn5WVmqGWm6KYlY2eoaKnnKCfpKWip56bo5ugq7CtsbWkqaqqrKyktLitt7Css7Wus7WusKqfnp+jorKkpqm4raKmpqCorKuZoJ+emZ2fpZqZo5ybnrCpq6erq6ytsLK4r7i5urC2vLu6q7OyubO+tLaysba1v7a+wL3Dwru6vZeEenNrX2VeZGRYVFddSVdcS1BHSkpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4uL+3ssK0sbu8q7m6saKeqaunmJ6QbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3GMqJyTlJSal5qhlpaQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqK+zp7qzpragop6co6Gto6Kqtqujo6aepaajlpmdl5mbnaCal52cnZytoqunpKOmrauys6q1sLKrsrm0r6qvsrKzuLOuqayusriwura6vcC4s7GUhXp1Zl5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLMyMa/xbbBwMbOt8DEvbO5ubO/trG5u6yytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGbk5OPlJaWn5eZlJegnqGclqChqaSfn6mdm5urp6+wq5ujpLiqoaCuqLaqp6etsaS4sKS3oKKbmZmqpqGarLmvoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK2otKuqp62zsKWrrrOxsLCur6eoqLKtsbSwvLS6uK6jlIF6dmReYVZZWFNSU0tNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIy7LBwsGtvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmmBlZKUi5GTlJqYnJWWnKCcn5agn6empKann52gpqCqr6afoqO3qKGhoqizoqWopbClsK6stJ6hnZWVqaGilK2xsZ+jo52emJuTi6GUkZOYmJOXl5mXnqecp6GimqSlpaukpbCnpaOrq62mqa6vr6uoqqqzpqasr7Sxrry1sa+voJJ6d3JlYVxaXVhOTFFHUWFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaasuLu8wcW6sbm1xMnJwMPGxce2xcSywr/Fq7e3vba9urq1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVJUUlVgYF9gYV9hYWNlaYCSkoiQjpOSk5yUlZajmaCXnaCloq2mpaWjpKOdqqulmp+lsaqgoZ6lqp6oop6trKmprq2ioqKVl6KbnJCrqbCcn6KfnpeZk4qekY2Sk5aQmJiTnKGjnaShopWgoaSlm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5urCqrJ6McnBvYFtXVlVSRlFOSFlbT1JJVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb7DyKyxuMG1vMC7tLSqrKaVmpuciIFyiIN7dGlpamxnamtta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5RWV1cXV1eX19fYmRtjY6DkIaPkI6Zk5SSnJqjnJuhqamrqKynqaakmaWvpZWZpa+poJyZm6Cer5mcq7Ogpaafo6ShlJOblpaSqaqtmpyfoaCblJCMmY6MkYySjZaVkJ6ioKOdm6OVm6CjoZehqKOjqKugq7Ckrbemo6SirK2qqKuvs7ezvrWzq6+YhXRzaFtYWVNVUkVYTFFbWE1UTlBMUFFJTklCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9u7O1pamglpeYl4d6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH2LgIp+io+Jko2XkZeZoqCboKuqpq+sqLClqZqfraCVlqSpp52YkI+anq6XmKiqmZ+dlKWhnpKRkpGTlaeqpZqZmZ6elo2Mi5OGiI2Dj4uSlZGgnqGkmJWflZqhop6Um6WlqKiooLGwprG9qJ+jrLSqrqewtbC5tcCxrrGqkX5yc2JWVFVOUkpHVlBSUUxMV01KTE5SR01LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OspbG3qqWisaudqqepsrGktsa0ubqzysW5usHL0Mqxtre8vcHDsa+xt620tLuztKKjnJ2Xl5SDgHZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqf3l/dIiMhpCJl4mUk5ibmJ6pm6CrpqasnqiaoKack4+fo5qXl4WEkpujkJWjnZaWloiim5uTi46KkJqkp5yVlZebkZKHlI6LgYuOgJCLkpKSoJqgopaUmJiVoqaZjZmkpqimoaC0sqeyt6Gcorasqa2ksrKmtby1q6uxo4l5c25dTlFRTE9DTU5OUEtGTk5KSk1OUUhNSkFHS0hIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKWnpKqloKimpbOqorLDtbWys8bGtrrDyszGs6y5vbS3wK+tqbCepq66r66fmZqdlZSHe4NuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5xdW+Dh4GIgJGEjoqUkZOeoY+bnKOipJmll6KclY2HmZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4qYn6OekJOYloWNgpR+fnOJjnqQh5OQkJybmpqRlpCdjqOjjomaoKGjpJuitK+sr62fmKW4pqaxobCunLC8qqmvqpmDd3NjVk1ST1BOQ1NOTFBMQlBRSElNUk1ISkpESkxGSks9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtp6Gmkp2mtqyjoI+VlpKPfnh+ZldWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11panFrfoR7c05Yco+Cl4aNnJeLlJGfmJ2VlJaVj5aJgJSJXztWb3yMlImAjJKMkIaGc4qFl4F5gXuGk52Tg5WOkZCDhn2TeHFwhYx9iYGRjY+XmpiTi5CJnYifmIeIlp6aoaCXp66praionpets6KmrZmsq5iotKKpraOTfnRuX1tOU1JXTERUSlBMTEZOT0lFTFFNS09KSUxQRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKepp6OpsKintMK5sLWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUnLGimpiGlI+Lh31zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYGxuaHqBdE9CP3+VkpF9iJSNhIqNm46WlYmSiIaVhnmJf2BKUW54i5KEfYSNioV/f25+f5R4dXZ4hI2Zb1GNiIqGe354lHZnd4aIfoqJlouOkZKWjIOJiJWEm42ChJKalp6dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoqaoiXVtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2nKOnnZ+hr6GnqKWnqK+tqrW8tre3s8G7tqi6yLi2qKi1tqqyvaaelY1/iZOolpWKfo6Dgn14cG5YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3N1fmloXFSPiZSJdH+GgXyFjJOCkpqLj3uGj4B2gHhzb3ZwdI6OgXp+iquEeXtodnuOcHJteIGLjZJ4eoB7gHZzcpJ3aHWEhISFe5WKiIqNioB/hIuNgJSEfICPmJSclpGfnamen6CdoKmlnp2YjKekkqCglp6fpIByaGFdXUpXUFJIS1hST0pMTVJKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZicn7Spr6mlraywsaq9tLK7uLa6tLGft7qyqp2drKmosrChmpGNlIGOnI6Rf3aGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdo2WmI2OfWd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKBfH91ZnZ8hWxvZ3N8iYyHgGx5cX1xbXaPcWhxgX6OcEOLhIKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdmp2eoZyWjYqkm46el46WmJB3b21mYlpYWFVRSlNVVE9QTlBWS05LTk9KUU9ITlBMRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlpylqaSgl5mPhZJ5iI6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybIinqsB+dHlie3hvfHmJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKYbmh4foJtaWRseYWQkoZrc2x8bnJ8hmlucH9zjImEhnt9fnt2b3R0hYJ5gXlwfI6MipODlpeYmpCSlpeZl52WjIOJnpGLko2GkJaAbmlvb29YVlhUUlFZT1JUVFJYVUxOSE1KTU5LQ0hNR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCjraqota+urLS/q7zDv6WimZWkl56NhIuUoaGZmJGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+niGKaaXN5ZX5wbX96i4l2goiGdGyaknRzfGpqnY9NeYWTiYSOZzF2hnNsfn6DdGZldX+EhIWAZmlsdWtxf3xocXF8bpKNj3xzfXxxcG51bYJ+d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFFaV1lZW01QVVZZWE5ISEVKSkhHQkBHRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWo6iunrKep7qvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHF7eGx9bHGDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooR2cYZ8h3x0jK2OiYBnZ2JqbnJtcIN1aXBYdXCOm5J3bH96fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2Pe3JwcGxgW11eXFlYYF9STltaWFdMSElGSkc+QkFCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qa6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx3iIh8foWDf4x+daKZeX6GgYWZhJqcYYaqn52Lg5CNeneIfomIjnOKl4+Del1kcnR6fHeKbWhqYnlvhpCCem6Bd3SEenB0eXhrbmlddod8h3yHh45/ipKXg42FjIZ9cYR/g311d3t8iXdwc3RmZ2BbW15UXGZeV1BUWFtVR0pLREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnZ2fppGgqqCxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSPjHiDgHOghIp8fIF/cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqkiGrq+vi4GAk4qCi4KEkqmHgJiYipt0bX2Bhod9jmhnaHl/boaHgoVxhIZHbIB3cnl2aG1rX3Z9goh/h4SLeZSdnImLiJF/enWLdnx4bW93fX90dHJsW15dW2NjWGdlXFVQUFZZUERMS0ZOSUNGQ0NAQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fomFiJGOlpeSl6CdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYuQiJBpaG+DgHWNh4SLcYWCd4d/e3aFfW52dWaAlI6GiYiHiIehq6KWiY6Yf3qCiXp5b2dreH56fnNsZV5aW11qXWFmX1lPS05XUlFJUEpETkdDSkRCQUREQTs6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4l/bXBqXUJANC0tLy8uLzAyMjM0Nzc4Oz0/QkRISk5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WX2N/Z2dtdZ2bj5qSk4uNjpqIko+di6CgkqOqpaOsk6m2oqjBw67Hr3i6lJp8jaGemYSThYKPoZ+TmJKEi4WPmpGWbHB1iYuCloyNj3ePhHFthYGKlpGDhYhyiKCWhpKJjo+WpLWpm42VooOHk4N9f2tqa3yAgYJzYl5kX1tna1xsbF5XS0dPUlFOTExGSVBDRE1GQUNFRkI9Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1hnF2koZ+l5aalZ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkYKAgIuMiYaQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZynpaKZoZeilJyep56oq5+orKmqtpervqu2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlqKamnd6fpSYkqGSlpiBlJ57d5WSq7KIjZeffZSdm46SlZikoqa1sJ2RmaiIlo+NgYhsc3J8f31xaF9dYV9hZ2RgZ2ZbUUVKS1BPSUlMRkZMQ0hMRkZDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbnxhd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFBTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK6srKeotKuwtrKyrbuxs72cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKOXgaaZjaKrqKSIhZSkoaCqoKSpj5yxi5Wjp7e6m6CjsJKinaOekKOhq6+ssrWilKSqiJmJkoqVeXp9hX9oYWhcZWJdZGNeZ2ZfWk9ESUhTTkZITEZKR0VGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pvWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4WBjIWGh5KGgoSJhoiHh3BuYUBFNjQ8Mi8xMTAtLCstMS4tMz9DQU1VUVJTVVVWVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubSoo7StsbGbmpKan4mnr6ullHafpJehrLKzmJaqraiutruyuqyvtaKxrLG1u7e1rrWgp6ejqJqpr62yube4p5u2qYyljpGTn4Z4goN1WmJkVmZhYWNfYGZfW1RJRERMVVFISUpESUdFQUBASkRCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXGBlH2EhpJ1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeFgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRXE9RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6PpK2jsbTCtrjBzMm2u8S9s7PAt7fBtb6vt3Sxs6W6xaOwxrmxs7G0qKS1tqqxoKKWmqKSpbCtpq2rp6SYoKy0u6Kpsrq0u77Mv8XFvb2zwre6uL63ure5rKywprCqrb2wvbvCwqyZuqiUro+XmKuJfYJ9a1djYllqZWplV1tjWVZTSUdGTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpwfo6EgY2DbnpzeYdiuKGZo4mVk5aTlJONkJaSh4Z7hoGNlYqBhIGKenyKh4Z8ioOBioOVfXd5dWVPXGRHRUw6UWNhW15TRj87SFBEW2NRUllYWmdZVGBgTVNQRUE/SUpIRUZBQEM8RTZCPkhHSkxTWlRdk6+4tbq4yb+6vcnMu7zAvLe1u7u2vbS6scZgdbKlsZqeqr2qpairqqOisrWhq6ielZafmZ+upaempZ+jlKKnsbSnsrO9tsG+08nJ08bCxczCysPAvr2/u7y3tK+4t7bDusa9w8iwnrmpoauOpKe2iYB/cmBiYl5YYV9pZ1JYYFZRVUlFRU5LQT5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaLf4N/g3h7i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWVtVVJtbV9uX1hnZVVZVUpEQktLSEZISEhHQkk5RD9IS1RUVlxaW5K5wLi9t8bAu7nKyrq2ura4ubK3tbSutraZZHWonK1wXqGtnJigopuknqqllKCfkJSOlpiXqJ+ln56amoOknaylqrCtt7C9udTRz9fPyczSzM/OysbAv8LKvcG8wcDExMXKv8jOs6S7sLSvm6u4vJl/emxeYVxZXWFaY2NRXGBTUEtDQkVGRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vl5KQlG5sb3V1h7OsoaGfi5mcmYyNlZGbkoWKin6IhoyQi4h8gYRze4qDhXuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJatpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpGS1BfXmJmaWKYt8ewuLO7vbWxxMa1sLmwsLursrGnqresjbWnnZunmk+anYyOn5WRppillYqTk4mQiY+RkZ6boZealZaGnpqnm6yvqLCns7TU1NTW0svQ1NXN08/NxcLJ0L7KycrJ0cfMzcLQ0riww7zEuaW2usOigm9kXV1eWWBYWWVaUV1XT09CQkdEQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6ll4ybm5eLjZWRmo59iYuEjoqKi5CHe4SCcH+IgYZ7h3KDkYuPfXF4dWtxeH5xe214c2xpgXBtY2ltcHhpd3x+y7/C36duY3dvY1thYEpQUlVOWV5QXVxOUE5UUVVUW25tdoJxlq24rLOnsLaqrLzAsKu1pqS4pquuoKu0o46xrZqYmIyRk5GEjpuBjaaRnImDi4SKiYSLg5OVl5aTm5GcmJmZn56rrKSnoqytz9LV0c3M0tPT0NTRzsjD1NHHzdLT09fN0tHF0tbFwM7Hx8KovrfPnnpvZl5iXldfU11aT1BUUE5IPkBGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OW3WGhYp3bHdwfX5/oZ6eoIuMmZOTjIuTj5aEeYWPkI2LioiRh3+Ce3J+gIGHeYR1hZKRiX9vdnJrc3x8d3tzgXdxa4BzcmlwcXp5cnq+y5p+jLKEdnKEd2hhal1DWlpbVmVjWGRqU1hdXGBkXmN3en6LgZmppKShn6CopaqwuKqltKOhraGjraGnsZ+JppqTkpGJkY+IgZSJapWijJmEgIV9kYODk5ati5WNlZqOhpKRnZensKGgoaWkqMjOz8jCy9HU0dTTztPNxtbTzNTY1tbY1NfVydTazcnX19HKrMPDy4xzb2NgX1hUWVNcUEtHSkpKQDs6O0RBRDxCQz5IQj5CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3eDk5mKjYiIi4l+g3hze32DiHd/eoeRloCDbnhwbXV/dnh9dIV8eW2HdnRufXaEdXh8nbWMPEGLxaV+jHxpZVZJQ2ZjZWNnamRueFtfZmhrbmlugIOIkYudnqCdkJeYn6OkprKjpLOgoaWdoKmgorGchp6SkpKQi46LhoOPhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipqRq7OYmpunnKe9w8a5tsbN0tDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1b7LzLR4d29lXVpSVlFaV0ZHSklFRT06NzlAQUI5R0RARUNBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSgomGhYmBh3x4hZaWiI+Dh4WHeoR5cXp7hIZ1eoWOjZx6jHB8b296f3F8gXGDh4Bujnp1d318gnV/e4aHsHRYqcK2jZGCcG5iPV5ocnBxcG54doFlaW9ydXhxeouHjpORm5WglYeMk5ugm5+qn6CtnKGamZ+lnp+rmYuajJCRjYR9iIeDhYuOn5mTiISHfm2ZeYSYhoiTjI2UjIZ7m4iUj66qlJWXn5mnrrW9qa29xsvIyczLz8nD0crU19nX2NfU29fT2dvWz9va0dbJ1MuVentpaFxaUFNUXUhDRUlIPkE9PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEfoN8fISYjoeLfoaGgHeCeW57e4aBdXqSno2gdo51gnR1gX10gIRvgY+Bb5KEdHyAhXp2hnuJt8alwsm4gpabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R1bZOWlJWPl5CDiY+XmpeWpZyXoJefkpKXo52Zq5WQkIqNkYKMhYmIgYaQkZ6cmYmFi4GGmHqIiJ+Xj4iNioyCfKGJkIu8oZiTl5qcqaalrp+otr/AwLnHyc3Oxc3K0dbV1dnV19vU19na29fb2trYztzGh3x6aGllYFRYVlVNTEROQzs9PDw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop7foB+f3yFe36BkYmEhXqEh3t1fXRtfH2GfnN+kp2RnoORfIZ+eI59eYqKboKagHSYhX2BiIV7fZB6j6mOj8OgvIyco5x9iYR9iXKMin5zppqcmJOFe46QiIRoR3CgpJ2Mi5CShYmKkZKVj5yakpSRlo2LlZ+dlKCUkY2NkIt+kI6Oi4SJkpaan5+JjJSSnZGCi3+lmYiEjYOFhIGlh4uLuJidkZSWoqehnZ6do6+2urWswMXK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbuHl5eW1qZldgXFRQT0hDTEI9PT45OTo6OTk7PDY/Pj48PTk6OzszN0Q/ODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97iHp8e4uHgn51g4V5c3pzbYB+hH13hZuhm52UkoCLiH+Yh4Cbkm6HqIV6oIt8kY6CiIOcfZqRioyjop+QpK6gi5GLhYuBkoZXcq2Ln6ubj4OYm4+PjVuCopGCjJ+TlYyHiIySkoyUlJSPjI+Kh5abnY+VlpGLkpOFgIuIko2Kip2WmaKihpKdlqCKiYiNnJCDiI9/g4eFpIaMkLOYnZKUl6GhnpmSnJ2nsrispr3Cx87Hxs/M0MzO19DR1K7W1dja2Nra19bZ2Z9xfnVoZ15dWFRXWENASEM+Pj46NDk6Ozc6OzozOzs/PD43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieG1ifpKDb213i3h5f3qBfIZ7e3eGhH9zcIWCenV2dnSEg4V9f5Kmo5+lopaJnY+Ul4uKqJdyirGMhKeRhJmThZmMopagmJOJm52ikqmvn5GUkI2OiJWLbo23hZrEyLKcoaWbnJiWkLKQZKTNx5aPhoeJj5KOjZOUiYWKiYWWmpuPkJSThpSXg3+Pi5mIjZCql5ejo4iZnpebiI+Hl5eKhI6MgX+Hj6WJjZOpmpeTlpmhmZ+Zk52borO0paO8wL7IxcXJyMnCytPNzdSp0tHW1tbY2tTT2s+Dc4BpZF9eXk5LVFpCQUdDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfHxsfYh4en56gYGDfnZ2gIN8bG6Lf3l8eHh8hIeLfYqjs6ejqrKhlqefpaSWla6ig5C3lZKzmY2hoIykm6+ipJ2YkKeWqJmtr6SXlJaUkIuYmZagwI6jybirmqKmrZiRmpyynYaFqKKcmIWIiY6VjYuTjoiBhoeIkpiUjIuTk4aUmIaDkZCcdJGZspaXpKGInJqTj4qQi5eaiYqWjoZ9jJifipCQnJqZk5iYn5SgnZWfm6GxrqOkt720xcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmFWYVdRSUlPRUFCRTU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSWZgO0iEi3p6bYWGenyEeICFgH1weHx9fG9yjXp9gXt4houJhYOSp7utqLK9r6Sts7Ooo6KwrIqatJ2juKSVrKSWqa23pqSjn5mpl6mjr7CqmpiclJWRl5+Xmbu7rcmgaba4q7CUmJ6jq5KXvaNeqrKCiYqNlIeRfI6OfYOGjY+UlYiHkpaLj5WNioyXmJKdmrOWlauei5uUko2QkoyZm4qSnpCLiZWfoo2VjZianZOcmZ6UoaCUnJylr6iipbO3q8LIxLW6vbvFyMfC0aHGyc3NxNbW0MvUonF8aV5bVF9SUEZEPjxDQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBicElAi4p/gXOGh32BiHWCioN/bX19fH9wd4Z3jYGHe42PjIaMmarCwK+9xruytMG8tK2rs7aMqLKurr2qm7ukqK25t6umpqKio6Opr7Kxqp2cpJial5eeoqWlkqO5rqi/u6ytsrmlo6Z9iIacrb2wg4uMi5CDj4ORj3qBh5CMjpyIiI+XjYuVl5SRmpadp5qxmpGrnY6Zj5KOlZCQlpeOkaCRiZWbo6yUlo+UnJ6UoJ6bmKChlZqep6ekoqSwsqbBx8OwsLq2xcTCvs2nx8PHw7zV0M3Eyoh0c2NdWmBbTktCS0BERj5BP0I7OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uHg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlae0xsm/wszBw7nHvLqvq7m7l7K2urLArqXApKqvu7uqrauiop6nq6+1sKqbn6qboZuVnq+zp4uiurm1wburqJyypKOok4WNqcPEpIKLj4eIhIaVlI16g4yRjpGhjIyUkY+Jl5+Yk5mUl6agrp2MqpyOlY+SkZWVjpCVkY+hlIaXn6CznpSalKChmaSfmqCboJSYnqakpqekr62lwMTCrqi3tcnDvrbOssW+xLyz0cnIwbV1eW1dWVxqU01JQ0xLSkpAQT1CRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmW01lXGZUY2qZjZeKi4iTkIaJeYaTkIFygHyNf3iHgoKQeY2hlqiampi6vsfIysLSyMrCzb3Bs6y7vqe6v727w7iswamss7u9qrCqo6WjrK20rba1oJ+unqaimKOzvKmbqLzBo7a2r6uSr6yqq5aGmammpZGCjJOllYmBdYqSeYWNkZCdn5OPlIuQjZSjmZeblJSjnqmfkaWajI+PkJWWiH2PlZKSo5uVoKKctaaQn5alpKOlnp6mmJ6Vl5ulo6moorKsqLzAxK+ls7fMwLmuw7O7vsK4rMLCwcCZbnpiWVddW0xLTUpHRENJQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGRWnpCdjZeOnpKJin+In5OEd4V/lX5/kIiKkH+VoZqupqOYwr3Iw8jF08zOzcu7wrevur20vMq8w8G2tryts7+5vK6vqKCpp7atrqmyt5qeraKooZ2qt7eppK++w7G9ubOnqbOzrK2WlqSrp6CRjpKxxaeVjnyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuNj4+eiFqQl5eSlqWaZpijn7OllqKWrK2rp5ufppeYlpmVoaSopp62q6m6u8S1pbS2y8G4qbass7u4rqi4ur24g25vW1hVVk9GS1NOSz9BSEVESEZHODVGTTs+Nz5BSi4zMjAyNUI1NU9WTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqWUnJahl6mWjZCDh6WSiIGHgpyEg5WQkJSOmqKfr76uoca9xcTHxs7OztLKvru2sbq7vL7OtsS9t7i3srK1s7ezrKacq6u4qqinr7CXo66kp6SktMCwqqyzvsK5wLmzp7ezt7KulaSsrq6ki5OVoY10wZp9lpmEjpaai7GVmpmVkpOZmaajlaCblpqonJuhoJmLjY+WnWBKlpyalJqll1SWsJ+vnJ+llK+vrKWaoaWUk5mZjp2gp6KZtKmqs7y8u6uwssfAuaWrq62xsaOhsrK0pHFvZlxbT1FMRVBQUFE7R0tIRkhCQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkirl5igoqivmZCXh4unlo6IkoWfiISdl46eoJqjpLXItKnGusPDyMrIx8zOxr66sq65uMDBzbXIusC5tbmxr6+ytKejm6q0tKqppq6smaSupaWorLq/qKu2tr7Bv764srLCsLi8q6OutKy4pYibl6abdr6ghJicjpOZmouvlqGcm5eVm5+hqZ6ooJmaqZmhp56XkI2RnYNudpKimpWdop+QrbKjq5WpqpirrqWkoKSokpKZnIiUnKKel7Gnqau6tr6zsq29ubago6eopaecnKypqYxkZmFfUktMR0dOSlZMPU1ETUlLQUNEPFBVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1VSH9lXkhFq5WcoZ+7rpmUnoyTqpuRkpOJqo2Hop6MpK2Uo6O2xr20wbrBwsfIxcLOyMG9ubKvubTAwsq2xrHBvLS6q6itrK+jopmqtLumqaarqp2or6ekqqq9vKesvLO3vca8trW3wK+9v7OotLarvqWPopeRop+8n4mZoJmWnp2Pt5+pnKWjm5yhmqils6GbnaWcqKmemZWPlJuLl4mMpKGUnKKeoLSvpaWTsKuZq6yenqSjqZGVlaCDkJ6fnJWppaKhtLS6ta2otLKynpyippqXlZmqoZ53YV5gXkpJRkhNUUlORUZGQlJLSUFER0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0Ocb2JHRaeXpJ+fw6ycl6SXmamclpuaj6qWlqemla2smaKrtsTCu763wcLAx8S+zce7vbmysLizv8PItb+vvLa6t6akq6usoKCaqqvEoqWoq6aeq6+roqmovrimrb2wt7bHtrW5uL6wvsG2tLK0r72jlqOWk5uUrp+QoaKlo6OfkL2lqZ2prJ2doZumn72imaOeoqmroZ2XjZWek56Hj4SNk56koJ21rKaclbKnmbCnn5qqnqCNmZWfhI6hmpuSpaSamKyxtrKqpamtrJyYoKGSjpCWqZ+UaWRaYV1PSkdLT0xIRURJQT1PSEE7R0lIW1JPSz1IT1U0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV0yimqObnsWsoZ+snZyun5KjnpakoKepq5e2sKOqsrXEwr2/tsDCu8jCvsrItri1tLGztLfBxra+sLi0ubWfpqyqq52en6WkwaWgqa2gpKmtr6Kmp721pbG8t7W1w7Kzt7m+scPAt7ets7S1opyklZGToK2gmKGdqKmroprDramerK2bm56ZpqC9oZ2kmKurq6ahmY2an5KeiY5Xf5WepaGguKqnk5i2o5+zoaCbr5eejpmUnYKPn5eWjqKklZClrrKrqaKipaWWlZyZi4+Rk6SfiWJlW2RgTElKSk9GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmJ7Dp6Wis6CcsqeTq6Sgo5+tqaydu7CorLWxyMPBwrPCxL3Gw7zFyrywsLausLWvv8W1ubCwurWsmqiwqamanqahp8Ktm6ywnKqirrCppKe9t6a2uryutsOts7PCv7HGs7q2q7S1ramhpZWVlKOroZ6fmqirsK6vu7KmoKmpmZmXk6KkuKChpJKur6ylpp+SoZ6Vno+QjZWdmaOfp7Smp42YtJyjr5qem66RnpSXlJqAkqGVj46foZOLpqywpaainKCek5KalIWLko2cnoBiZltoZUtJTEpTQkNASEc7O0Y/OTlOTVVeUlNKPk9eXj1IUEJMTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugwqijqrKho7WplbKrp6KlsqyuqbuyrLC1tMa/xMS1wMS+ysS2wMjCtau1qLC4rMDEtLeurLa5pZmrsquql5+ml627tZuosJutn660saequrKnubO3srjAqreywryzxae+rq23tKmnq6GWlpGlpKKil5ikrritsbW2oJ+opJmUlZOjoLeipKWWrbGypaqmoZ6ampqWmKifn5iinq+yoqaNl66ZpayXmZ6lkZuOlJiahZaflIyQnJ6Ui6mpqqKnoJmeloyPmZCBhpaJlJ95ZGldbGlOUE1OVD1DQU1DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzuko52hpr+mp6+voKm1qp25r6ujqrS3sbC5t6+2uLfEvcPHvbzDwcfAucHGwbqqtqWtu63Bw7e4qq2yu6KVrbCtspalp5Gruaqgp7Cdqp+wtLKqqba1rLussrK5t6y5sMK6vb6mwqqwt6+pqqumnZiYqqGhoJGYoLCvs6uwuZqbqZ+ZlpKXpqC2qaWioq+xs6uxp6ufm6Cgm56lnKGXnaOzsJqfkJOlmqGpmpWin5aYiZSYk5aXnZOIkJuZlI+pqKefo5uXm5OHjpmLfo2WhY+ba2ltYW1uWFFRWlRBQ0VUQDs7SEE3OlhQZF5QVldEWV5eTUxSTl5LSj5aZF5OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWOol7Y0M9p5+coam9oaqwqqOxuKmltLOroa21va+zuLy6vba2wMK/ycS4xMLAwLjEvcG4r7aoq7eyvL+/tKmusbefl6utqK2Xp6mPp7ufpa2znquisbCzrKm2s7W8ra+xtaywtbHAusS2q7yvsbirrKmisaWepKmfo5eQmZ+yqrOpqrOZnaebmZSNoKaktK6noaysrbGnsqyyqaSbn6ijnZShmJuotamXmZKSnpmeoZ6QrJ+YmIaVmIudmpyTio2Wl5qXpqWjoJ2WlZeUgI+UhXuPkoOMlmZscmhwcl9HWWZWRENOWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJgUEtNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSaoKSst6SsqaWurrapr7O5pqawt8W3sba+wcK1tLrFvszFucPAur+6xLjBubK1rKq6t7q6vrWqrbG2mZinq6qrm6yrj6u8nayusaOqn7Cts66utrG5tqmtrrCnta+zu7zJsqq1tLG0r66moLOfmqitoKWVlZqZsaOtn6WvlqGkmZmSjaKlp7Kpoaaxq6m1pa6wta+jmZ2tp5qXnpmZq7ijl5ORj5icoZiXlKyfnZSBk5mNnZ2alpCKlJOemqWjoqCZlpKTlnuLkIV7jIuDi5JrbnhudXxhRmBqWUlIWVo9e0pHRTZBYlRpWk1cYUpbXVpSUlJiYExLRV9hYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkIvSkdQW0gzY1lVS0SZlqCwqLGprKWjrq61qbe0uKOrtLfKu7S7ur++tLS3w8HNx7vDvbe+v8C4v72xva6nurm3t8K3q62xuZWXpq6rp6OyqZSvu6StsrGnp6Kys7CysLSxt7KorquxprivtbPDxbaotLWrsK2pp6K2n56msaCklJuZlLGep5ufqY2pop2blZelpaW3p6Kxs6unsaessLWspJmgrKibnJ2blKq4m5SOjouYnKKYkJemoZ+WhJKWkJ2cmJaWiJeQl5uonaSgkpaRkZd2hJCHfIWChI2MbnF4dnx/XUtlbFxLT2NcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1QT0hhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTVE8M3JrSkRDkJmkraStraunpLCys6q3sLafq7W5ybmuwbvCt7OytcLDz8TAwb61vcC/ur+9s8Soqrmwtre/va+rs7OcoKewraWmsKWesrWtq7KwrKmotLmstLK1rLOsqayorKm5rbGwx763pLmvqa2tpaitsKWjo66jqZydnJqvmaKjoqOQrJ6jn5+hqqamuKWrtLSkqauoq6+2rqKdo6iqm6CZmpKktJmPiY2HkaKglY2UnaCUk4WPlJKdm5iWlYeYkpWZp5ygn42SkY6Rd36OhX18fYeKinF0cn59flxSZG9eTlpmXUZElltHOk5tWGFbTWBhTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NkOzYqSGRISis6ST8zQklTLD6Paz1HSI+bqaqhqa+kqKSztLG0tbGxoautvMu6rsC7x7G0rbTCw9HFxr7Asr7Bwry/uLzFqK23rLO4vMCwq7KtoKSnramopLCjqrGqr6ywrq+tq7O6prawsqmyqaulpaOtuqyqscK5tKu5qKioramosaWppKKuqqiinpuirJWknZedmKudoaepoayloqyrt7GxoKiin6qusKydnqanqJmjmJiPoKeYhoOOioueoY+LjJacj4+Gh5CVn52WmJWGlpOTl6ScnZyLkY+Oin9/h4V9d3+HhYd0c3KJdmxfWWBuY1FzclxLO4R8Rj9XdVhgWU5jXE1VVlVXUFxiXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkowLklnREY4PEIwNUVLWDFAlFs/TUaVl6ynoqqynKmpsLasuLWuqqWrqr3Ju7C+t8Kvsa2zxMPOzsO/v7TAw8S6wLTJxKyvt66yucC/s62tq6WnqrCpp6ixpbStq7CurbGvs6yzuqS4s6ysrqern6OesLerqq26tqS1taSpp6ysqq2hqKamsbKkpqWhoauWqaCTmqCmnaSiqqSsop6msbesrKKkopqoqq2pnKGlpKOYoJmVj5idk4GCkIiFnKCNi46MmY+Qi4SNmKObkpGbjJOSkpSimZuai42Li3yGgYGDe3SAhIJ+dHiMpId5a15gbmdXZodkTkBnkkxEYnlXYlhSZVVNVlVVVE9cXWFVS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZASEhElpKvpKKqsJeqqa21q7axq6Srqqm8wMC4ubO8taazr8TJy9G+wbu5wL/CucG6wsSusbWys7vBvrOxrq2rrKe2qqWtr6u5r6ixsa6xq7WqtrWntLarrKSpqpyjnbOzqKiktLSgta2hqairqaynoKusqLm2qaqpqaGpn62bkaihnaCkoqaiqZ2cprSup6WpoqOXpKanqZyipKOfmZifkY6PmY1+h4yHhJ6eiIWKi4+OkI2EhpWimo6Nm5GSkY+Sn5eZloyKg390hoF/f3h1g397eH6AiZ6Pb3FnZ3F4XGF0iGlPXZhWSG14VWRWUWJPTFVUVVFPWFtiVkhQalRWVEdQWVVJPklIT1FQeExOVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw+TFRfL0lrNlFFO5WNr6Clqq2Zq6Str7O0rqqlr6mpur67wLGvuK6itrDJx8jQwL+9u7zDvrrDwcC/r7KzsrW9vMKysrOrs6mltamlrbOzua+jrraxr7G5qriuqq62rKqeqqufo6C2raihnq+zobSqnqinqqOqoaGsrai9r6yurKGnp5+rmI+vopihoKinnqebmaqwqKKfrKGhkqGio6aYmqill5eYnY+Kh5WIfI2GhYSkl4WCgoyHj46RhIWUoJeIkZ2Qk5GNkZyVl4+KhYZ4dIF/fXV4eoB6dHR6aYKHo3VpXmVsgnVniIt9UldwXkp4c1NkU1FeTU1SWmdOTFZZZVhHU2lSUT5CTlFhUTpJSExTSXFQTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytITzpWQjSQjrGfpKaro6akrKa0s7Cpo7Cnqri+wLywqLmqp66wycbI0cO9wL65vr+8ybzCubCwtbK6vLnBs7S7rbmto7Wmp6yxtrmyp6e6ta21vK+8pa2ttautnKmvo5+lrKqnnJ6qs6SzqJqqp6mkqZ2jqaipvay0r66dqaOgrpuasqOVpJukpZ+kmpqoqqWemqmhm5GaoKSdmJapqZGYmZOQioKPhX2PgoCIno+Gf36Mh5GPkISAk5uUhZOijJSRi5Gbk5WHiX6Acnp5fnxpd316dXFxfWiGeYSIZGBoY3OFem1neV1eVUJXemxUYVBSWUtLTXB0XUhaW2dZRVZmUEM+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtFWj8qj5OwmZ+fqKWkoaukt7KypKiwp6y4wb21sKO5rKiosMPJyczBt73Atbe/usi2w7W0s7Wyvbm6vretuba/raKzpqqrr7W4tKqeu7uosr+yuqCvtLapq56tsKKcpaipop6cpLGmsKCfqqmnoqqbo6igrbyorrCuoauio66enqyml56aoaOcn5uao6mimpmjo5WWk56hlpuWpqyLnpGQkYyCi4B/joF7mpSNiXx/i4aQj4yJhZKYkYeUo4qSkoeQmpCTgYh8eWx9dnl4Ynt6cXBwc3hpgXRqg2dkaGFvc45tYmpwYG9BXHhrVV5OUFFKSUxTWldNXV5tV0RXYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmRPKTwyUFs9I5KYq5ifl6ekop+opLivrqKvr6mruMK6sq2fuK+rqLS6x8vHv7fCvrC0vrfEtsOyr7qys8C2u764qbm4vquktaeoqrCtubCpmrq8pK6/tLShrre1p6ansLKgn6Smp6ClmZ+tqKieoKqvp6Cml6Opn7C4n6Sxr6Groaykm6amqZqam56jlZycmp2pppaanqeRl5KYnZOZlaGqkJqJjZCHfYd+go18fKGMjYl5g4yFioyNhYiTmo6JlZ+IkZWCi5eNkH2Fe3NwfHFzdGB5eGlvcHFvan9zY3psaWZkYWaGgGBbcmpxTE1/aVhaTVBMSkhQUlFJTlxfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MFpaNSiWnKWYnJatoJ+hpKG3q7CjtLSpqLnFtrKuoLesraywtcbIwLe/wrqxtb23v7u/r6y9sLS/sr3Duqm7u7inqLaop6uwrLOwppq8t6Sru7Wun7C4r6mlpq+xm6GkoKOjoZabsKahnqKnr6KgopOjpaK3sKGmsaufrKKumJyqpKiel5qdpJOanJqdpamZnJuklJSXlJyOk5eiqaGQiYqPhXqEfYSKeY6Xio2HeoKIhIiMjoWNlJmMjpaZio+XfoaXi496gHpwcXZvb3RfeHdlbGxsammEbmZyaWxmaV1kc4FgW2t1aVpJfV1bWE9PS0hHUlVGMjleXm1QRFdWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbDg0R0FmW0hURFVdaEQuPDJiViwylaKhl5Sbqp2koaKgt6quoLq4pqy9xbOwr6O1sK2tr7XExLyzv7q4sbO5uLq4uq+uwLO0uLC/wbisvbq1pqKzqqepsqutsaGbwLakp7W1qJ6yvKmopqivrJmjp5yjppSYorKlmZ6jqKmcoqCTpKCkuKikp66mnqWgqJKfqKKhoJibnaCSmpuWoKGqm5uYoZSRlJaZjZOSo6ikkIiKjoV5hHuEhn2djYqKh3qBhIiIiJGFlZOTjJCVlI2OlHuDl46Ld357bHRxbGxzYXh0aGlqZ2ZvhmdoaWRmaWpgaWJqZ1tle2NgU3NUXFtTS0pHSU9TQCEqaV5qTENWVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc5Zk8nMp6jo5GOo6ebnZ6do7Wtpqq5t6esw8G2sKyjta6nrq+3wMC8ssG3sa6yt7a4t7atqr2zr7Kxvb+4rry8saWftqulpbOpqq6fnsGrqKWwsqmstbueqaqrsaWXnqqdpqSRmaetopiepKmhnKKdl6Cdp7amr6qvoaGdnaGUoKWfoaCZm5mckpmdlKWdq6GXlp2Uk42Vl4uPmJqooJKIioqIeYV3goKBnIiLgol8f4SIhoWRhJaVj46PkZGRjJJ7g5WNhXN9fWZ4b2tqbGd1c2tjZ2VkdYBiZWZmZWpqZGtxWl5ZXW1kYU5oV1pgVkpHSUtNUlg+OV9saUhCVFNcW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQWZIJTWbo5+Qi6yhmJiglqWzsaGxvbehsca8urGxpLarq66pub27u67Asq+urbavs7izqKu5sa+utLa6trC5vq2mnrWroKCwpKuunaPBoLGjrrCut661nq2vrK2imZynqaSelZuopZ+ZpKKonZqgm5ScnaywprmorqKhmpqdmJ2jmqSdl56Ym5SZoJKolqqnmpOampGLlJmNlJSZqaeOjoqJj3uCc4GBipiFh3yJiYSFioyKk4STnJKSj5CRlo6QgICMjYNwgH5meG1oa2pncXJrXGhjY3OBYWZoam5sZ2tqZ21cbGt0cWFUYmhkZVpJRkxNT1hRUVZhZIFUQFZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUplQyc0kqGajY6wnZqToZmpsq+fuL+2oLTCu725saa2sKiupLe4t7etu6+tqqu3qrS5rqaztbKuqbG3trGztbqnqZ+2qZ2eqaKprJuov5ito66vtbWtrZ+xra+popuco6uom5Wcp6OdmqmipJaaoJyQm6Orqqm7n6ekoJiZmZ2gj2uhlpiccYKVmqOAdZKpp56UlJ6QiJeZgJaKoZB4hpSMg25qfnaDcWyGi4Z9hIuGb15jYWeEl4Zri4+Uk3V3i4R+g5CAZ4aAaHVpZldcaHNuTlBqY2dyhGdfZGZubGpeYGGKkISFZU5LRDhGVGdeSkdQUFRVS0hTYW90ZUZbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFRZD0rL4yjmYaVsJuck6Gbqq2qo73Er6m3wri9vK2ntrClq6S4s7KzsbmtqqestKawtaOouLa1qKest7OutK2zo6qftKueoaScpqeZrLuVpqWvsretrqWprauspaGfnKCnppuXoaWlm5unp52Tnp+YkJ6nqqO1r6Ojo5yWl5iXo4ihjpKah6GHk52gf6V/pqqekpGakYiDcniMjoWIoXaJjWmXiGZ9cnihb4iHhH6NfH+hoKCZgHuHnnSIjnabimyHgYJtaGVjemxxYVSGbWNsaZhxWGpwb4dYXmlba2tbiHFuenKGZ4aEWl5GTT9HX01GUlZWUVFSV1VnXk1YSlJST0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiLppeDnKudmZmdn6qqp6m+w66yury3wL+qpLewqaymsrWur7O2q6mlsa2ltbOcrbW2tKWnqbOxrbKor5+robKpoKOimqGim660laOkpba8pq2nq6qsqKWhoJigpqOZmaaipJicpKmWlKOclJOkpaaht6OjoKSYlJOYk5yIro+YlImpi5eim4WxgKOsnZOZnZR5gtSof4eVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGWvJzFe3K2pruQe4BslrGrsHloa1ixrm5labySvG5oem5yj9h+U2pitrJ+gXKUdJqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQFxEUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaWTgKapn5ecnqWtsqiwwr2ytcC1t7/Cq6azrKypp6+zqa+2s6ioprWmp7ivnLOytqqlpKixrq6xpqqep6SxpKGgnpebn52urJSdoZ+0uqKqqKGtrqWinZqZoaefl5unoJ+YnqenkZynmpSdoaaioLCin5+jlpWSmJKZha9qaoqNqn5nhJWGrWRwnZyTmaWUca6hpH54u31roZB2sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox2sWp8sXh0kpRjbW2nbVuEoEVoZ4eWRXWcYH1nfKSngllfi6tpgJV4eWqnN0qvXFdTbWNbS05XX1xXVjtOiU9XVy9JVFNJREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GhlIKsp6Weo6WqsrestL2+r7bEsre6wqaosKuuqamwrqOxuq+kpa6zo6m5qJ6zsrCjpaCqra+sr6ann6OisJuim5eVl5qbraWWm6GetLOhq5uira2gnpmWoKGonJiepJ+cmaGnpI+dopqXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl3h7Obt36TlZaolH5rgaZ6goaIkpSSeKtna7Fbq3uPh5R0iHGPhoB/iJCXeIOCi5eMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinC5Rom9bU2toYExLW2RYXFpCPrF4V1hBI01oRUNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5SIs6amoa6pp7Osqbq2wrC7wq24t8GqrK2urqausqmhr7yqoae0raSrtaSmsrOno6GdqKqyqLCopZ6fn6+Wn5mUlZaYnayhmpmjqLSuoqmPqaiqm56Vl6Ckp5qenKKfm6CjpaOWm56YmZ2iqpulmpyboqCWk5GTkpyD1ZOZuXCwwn7GhnzWlJu7fJmVpI+NnI2ke46HpIKlgnqseY+dVq96iH6farlauXeGg3ymgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiGgIl8Y6QzQp12XVBpaGRQQFhnWmRhSkhNbEtbUk9ZZllDRD5FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzIlm6KTmLGoqKW0qqW1qKS7t8GwucCxtbS7s7WnsbCjsLKmn662qJuoua6jr7Ggs7SwoKSen6iqsam0qaScnZ6ql5iXlpeVlqCpnZqWp62wqKOfj6yiqJael5uhpaGYoqGhoZqioqebnqGelZmbpqCbp5Wbm5+hmI+SlJGciLJuaLVxq4dvjqZytHNytnuZl6OLjpyNon6RoKV+sHaDkdLRdlyue4V/pG+bqqZrhoR8rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFNRamNmWEFPa19saE9VR0k5PVZSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGckaWwraSqu62mtaWntru8srq/t7a0urqzpbSzobGxop+sr6SYprqupLGxnLS4qp+mnaGqpLKorKqkmpyaqJ6VlJiYkpKip5+WkqWrr6ailpOsn6WSlKCbpKaflJqlpqGao5+tmqGfnpCWm6GdnKWVnZWZop+VmJaSmoWse3eodqOOiYepb62KgqeDmJihiZKaiqJ/k5mIroV/grNccrNSrn2DgqR/cdd9d4R9jp6GmZl3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV53d4domIhrXq93lZ6PeGw1eciusl9BVG9eZ2BFUGxfcG1WVU0uZWNpU1lROkFEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk5ODifnZSguLCXtMGtqLOoqbK6uLS4v7m3srW8taW3s5+0rJ+fqKuflae2q6ixsauttKSbqaCgqKG2p6aqo5melaWhlJObmZKUoqWakpCmrK6moZWaqZ+ij5GimailoJWapaidnKSerZ2hnaCNlJ6bnaCYmZyWl6Kgk5iQpp2GqX19pXihj46DqnCti4GnhpWfoYiXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aHc6eBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcWkx0XWJmTVthX3J0X0pWNkqbk1hIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4wMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMT84oZ2Zmb+rl7TCrqutqaW0sLextb+5ubKwt7ypurSfsKSepaennpOqsKmwqbWsq6+hmKGgpqWkuqKjq6CXm5GioJWUnpqUmJ6gj42LqK+vpp2Xm6emn4ySpJenqqeUl6mnnp+go62koZ6hjZWhmZ+gkp2XnJWeoZWWjqubj65tcrRyqYx2iqZztHhzs4CRpKKRnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbXp/fm+Yh3Fcr1Y8nHdlVG9uLlynT2JSa2VibFpjXWBwe2NUWlE+Pm1vM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs8MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam526oZyywK6tq6unt6m4r7XAtbywr7m4q8G2qaqgm6akoZ2RqqqotqOyqK+qoJecp6Ckq7ido62blpmPpaOVjZ2gm5icn5CTlKu1r6eZlJusqZeMk6WYpKyikZaqsaOgnqersZmho5CZopefm5acl6GTnKqclJCrmYfUkpq7c7DDgMOGftWWm7h4h5CXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gYpumohxbo2kdL1ed31bYXm8a1pWW2p6XmphZmdibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QTmnmp6hvKKXscOwraqqrLGnuK+2xbG6sa67sK7Bsaukop6joZybkamkqrKktaatpJ+WmqqZpqy4naOumJWhkKWgko2co56XnZqQlZKvubGslZejp6eUkZaknKOsnpGgqKufnJ+po7Oeo6WOp6KVopqcl5WjmI+woJKUqZ6FkJm1gJCRjLeVeIKTmrV3bWtuc255j4SOiXSewbu9mnuBsqhwgHSRuIN8hoaMho17ioaNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF6Aen2JaIN5bXlji6xwdYV/WVunakRkWVNmYGNdY1FnZnFtdUJNUE1EO1pNPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPTs8p56goL+llrTDtKyrp6yrqbuusMavtbOut6e0uK2poqGlnqCdmZSrpK2qprWop5+blqCjnqykvaahqpeUnZCim5KPoqiik52Xk5eUsrW2rZido6Sii5KRppulqpuWqKSlnJqhqaeno6mhka2el6Sel5eXnZ6PsKiUm6ehjmp+aZymeIdzfZqPdHplh3q9vsC6b5KCcZWHX3JqWl6aiWFjiI6Va2B/lWNtnXdilWt/mpWUZV5gY3GbimlyjH2GlWdqfnJ0eH19Ylt3dIFoUFxuhH17i2tYbHqCc0lKb4ZwTnRNRVddZmBMW1hmY19PW211aXFST0RFTTxIST1MPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqifqKHBo5u0urajrKWup6i1sazIrK+zq7WjvrGyp6CiqZ2im5qZrKaupKW1qaWbmJWhm6etqb6nqaaVlJyVoJqTl6WpqJCdkY+XnLCyv6ybp52noomTkamaqKObm6ugo5qbo6eto5+ropqwm5WnoJaVnZ+dl7GkmKGnmJyRnZyjo5mmopqcmpqZj5aBZ219cXeSl5SRhYq1qo2GmJWPioyYl4eUlYqEkpSRiY6Rk5iUmJeaoKKanJShnY2CeqWGbGp8kHyAdImKgXGCeHl2douAfIprc4F0g3Vkd313a3B6bWBjXXBnTVlZZmlgV1pwem5sZlNPRlM5T1pNUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzoLOiv6GjsbK3oKmlsqelsLWqyaussaW1psCntKGdpKWco5WWoKqmrKOjt6ufmZaWn5etqaXBnquklZKcl56Yk5Sin56ip5ORmainssOvmqucqp+PlpapnaqcnKCsmKGbnaKlsKeipaierpiXp52ZmqGenpywoJyippWYk5iToKGVo56XoI6Wk4qKjY6WrY98lZuCkoKLqqiGgZiWioSPn4h7hJCHhZmSiIaKlY6bl42Ql56jlpqTkZ2Nfo5mobOvhYqEdnqPinx2eXpvZnqRgYCJa3WBeYhyaHN/enaDh4JrdGR5ZmBqZWNkZmtZa3twaWpcUkxQRF9VRUA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqqyjs668pLScn6WioZ2Zl6ilqaakpbO1npWUnZmZsKatvqCsopCRnpqZlJGVoZyXqJyEnqmrorPIs5+qo6qXlpeap52om56kq5Oen52gqq+qpqOroq2bn6ChmaSenJ6dr6OYn6iTmJeckaSZmKidmpdlgpJ8ZX6NmY9jeY1saGt6kaSra2WamH5nhYplZWloe46hj2tojZeRondraouYo56Yc2xueoSNh3pYZV6Fgl5siomAdlxoc3d3koCHgm54gniAc215hHR3iYiOg3tphllea3RkXXOJaWp8cWxjXVJOWEpkWEFKND1GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsKqlqK2tsKeurbC9samnpK2vsJ+tl5+jnaGamaernK2jpaipsq6elaOQoq+mt7mlrqOOjpqhmZOSm6CZmKSVe6Wsoqizw7ekoaeun56VnqOeo5yjqqiSnqGeoKqxqqujqqCpm6afqKGslqGbpbCkl5yqlaGem5Kll56qmJ5+vYOHcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooeCn32VmImewL2Clp2djZ3CwXuCe5KMmsPAfWqlsW+MgG/Ken+bd5KDjoF2eoF/eXF6f4dxeIWNk3ltdpNjZl94ZGBlgmNedGdtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCuraayta+ppaamsKufq5iaop+cm6qnopyso6WopaS0pJ2ikqauq7izp6+ikZGanaWSkaChl5ufnYemq6Srrb/AsaCpr6mXkp+dopmho6qjk6Chnp6tr6mspqOjp6Glpp6tqZKkm6mtqZydqpysoZaXpZaho5ecf86UeHqkgXmVlptfro9ejqeBoqB8p5WbdKuDgK9eY42qeqeHhaB0l5KIs2OCq4agjo2zaoSudH2Wh7hhg61Zo81uj3V72nt/mXB+iJJ2fmV7iHZ2a32Ibn6FkZJ+bYGPYHFrcGdgX3lkXHFoamNmYFJUUldeS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcK/v7W0sLeXnZGkqqits6ulsqysq6Srp6+qoKebmaSXnKKvn6CeqKejpaGesKybnpWnrq2xqqisoJSSm5+lk4+fpZedp6OeraSqsKjAxrOoqbGulpKdnKKXn6mqn5Shn52drrCoq6mcp6ekoquSrbSXpqKqqZ2jp6WhsKCSmqeaoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xyrX6rh4afdpiSenyXfqqIooyRjJ1+q3uJk4+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+Ki5KQg22RkWVwdHVwYGdtZV9vaWluZmNXU11hWVJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytJ+do46jo6Gsr7auqbGnqKqnraurp6KjnZmilaCmq5+hpaCoqKKfnbCsl5qWqKevrKinqZ6XlZqjopGUoa2bnaajr6yjq7Squs2xraauq5aUnJ2imJ+urJ2WoJmen6qzqaqqm6uqpKOsm7CxoqisrqWYpqqpqbGikpajpZqUkoSkaqR1iXqpdHqycIKliZmMcYigmoekYGBSq4R/roObdq6BpoaGn3qZloZ7ZoCjiaSZhYKjfal+gZSHrl58qVWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojY2Yj4FtmpNwbnl4d29sZmVlcnBmfGliXVdgaVhYVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwr6mtoqemqqurqaSmoJuln5ymp6ajnKyaoqyhpJ+vop2akqqktbCuoKmbnZaUpqOQmqKooKClnLGmo6exrLbIsrWqrKmVkZ2copmgpbOdmqCUnZ+nrKykrpqsqqOiq6KzrqKqs7Ghmqqorq+2o5OWo6eYm5F8qmyehId1q3l8sG+CpIqJn5aVn5SB0ri0uMmAgbJfX5Spg6SIh6B5mJWaeKrJdJmjlaepkJOajH+biZrGxnhloYKlc4GfjoJ9r15wtWOxdUujhm2nR4KTZI+QnpJ8cJeTgHF7dX17bltlanNxZoFqX2FZZG1cXllJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TBxritqbKtrKWinLK5rKqhppuopaqrqqegpqWYqqOfrqudpqCsmp6ppZ2ntp+il5OoqrayrJumnKCVkKWskZmcp6OfqaauoaOnqbC0wrGzqq2ok4mXnKSaoaOvppihlZmcpaarm7Cerainnqyjt62hsrmvnZuvp7Ozs6SUl6ejmZ+Ogp1OeJqBf596g6N9g6SEh6efnJ6ThLh7fHm5gn7MxsK2eJuhkYuffZqWlop2npiKpJijqH6whZ2FnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkqSXfH2Tkot1enOFf3FcbW94cmqCb1pkX2huY2RdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu4q6+gm6Gss7Omn6CVpq6trqqnnaammqOnoLKuoqmmsqCZqqSUo7aiopWXoqm0uKScop2ik5ChsZmenKeloaKvrp2kqKG2ssOxrqmtqZGHkJynnKKknKWXnpmamqakqZqvoq6lppivpbytobe3rZ2dtbK4sLOmmJ2voaOehY/RtcO3eYeOhZGTkIGmeJSid4ygkYSlgYpxqoaEtG5yapmjm5WKn3yYmYaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaNxcX+fYnOyuGh4j5SmmX6MjZOMeH15joJtaXhpeXNugHRdZGRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q1npanpK21oaOZlaOpp66qq5mmop+moaC1p6Opp7CjlKyjjqSto52QmpqqtLSknaScqZGUl62goJ6mo5ynnLSaoaqjtqvDr6mrqaGMhI6coaCmopWampyZm5mnpaaYrKiuo6Wbrqe+rJS9sKyforCzuau0p5qosaSnmHqokH18sHeKgaSliJxtsm+hh618oY6Dp5WYgKyIha6Fn5SpoKGWhp+AmZWAe5J+q4CdmpaLqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3CFmV1gW4ygbZWSp5mDlI2XjHt7g5d/a2x/Yn50bYB6YGdlcW5oZ2hDWmFbPUtUMlU4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovZKahKnGwrbBtJ+arKCtuKWjjpukop+wr6qfpJ+drZmeuKCjq6CvqZquoZCrqaSWiZqPrrCspp+nmqyXmI+soqGdpaGapJytmJ+oprapwK+lqaOfi4COm5qfpp6SlZqalJqapqWkmqmsrKOkoKqov6SXw6yqoqGrsrmqrqegs66oqZh2r36Qi5yFh3y6roqYZbCMZZWtfaGPg6aVmoGsioSwhaWZpKGhkYWgW2xqgbNgf617e4KBsWxnb5mXjIiwW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW6YkKibi5eRl5d8eY6dfmRzfmKEeHSAfGFqZ3FtZmVlT1VkXEFUXz5KKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjm6ympbaooIuaoJ+cs7Opn6OfnbWYoLOoqquer62erJuVr6iijoibjq+sqKeip5mukpmPqJminaWfmaOipZmfo6myqLyvpaienY59i5uVoKCZj5Kam5GamKmgoZmorqelpqOlqbufoManpamhq7S1rK6mnrutrKyVgKmSo6+Om4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwvax4d6K+vHSBlo6nnJCbkZideoKRm3pjfXtkjWd5gntga2VramJQYVtTalxAVWFDTio9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbO0sb+5sb2yop2upqWypp2MmKW/qrixqKG/pqaynJ6xnLmonq2vpaeUlLCrl4yDm5GupqOsoaScqZ+Yi6OSpp6nnJqgqKKYnqCsraq5rqijmpeSe4eZkaabko6RmJiPmJSpmqCYqamhqqehoqu7nqnFo6Cvo6qztKqvqaC6p66umnN1qqS3hmWJoHBnrY+Kj21veKSPmZ+Bda6ZlXCPi3GVqKObl66kcm1tbWWKeG9tgplxgHlpcWlniZaVmHFoaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpFvZWSAjZOPopiYmZKXn32HjpV2Zod4aI5reX95ZGxjZmxiS2RXSmxZOlFlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6m5ubKzqqmhrp6jsqmYkr6yw8i+tqqewKuso6CnrJ+6o6StrK2mjZeuqZCMhZWWrZ6mqqGfo6OgkYukkqeZqJmWo6mglpylpqevuqusmpuSknuEl42lmI2RkZiUjpiVqJWfmKmjm7GnnqOsup+wwaeks6assLGqraunuKOtt5aKoKiltp2JlqKYh6makJSdk6qzmZujq6CxlqGhnZ+inKCkoZWrp42TkoyHkpyclJCak5iQjpWFgaSal5WNi5KSio+GhH1nin90gnZ0h4twp217lJGTkoGBjpCQj52UoZaZl6KDiJSNcmmQd3CLeHd8empsZGRvZFVgWEBpW0hjYU9aK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTVBQUVhVVlleYGFjXF5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKaWqaqltbaurqKwpK2foLWxkI6sxr3Eu7iqoqWem6aesKijtqedqbWmqJGYrKKLiImPnKeWrKSgmaeenpOVo5aomqiZlKaho5CbqJmhtbqnq5iakI18gZSLoJSKlJGVkJCUl6WQn5qqoJy2o52nrLenrsGuo7enr6+wrKmpsrigrryZkaWkpraikp2mn42pn42Sn6Osr5uho7Cor5ejoJyjqZ6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2UioB9ZouGdYZ2eYiDc5xqhpCUlJCJfYyWkpKXk6GTnZeihIiYh3pylnN6in9yfH9qb2RecGpgW19ZbmNQYGVQWzpHR0U+Mj09Ny8rJispJh0mNDA2NjU4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaetoKe1qpCQnaWzu6+srKKjmnqdorGkpbCplpu4pqOTmaqcjoaKiZyjkK6fo5Wnn6CSlpibroqqlo+omaeMmaiPnrm2pKWYm42JeYKTi5qTiZWSlJCNkpeijZ6eqZ6euKSAhK+1orCvdaS+o7Kgd3mgqrG7lHWspJ6JgKp/ZFxidqCOpJ6El35uk7Odo6etqqNlnZ+Sc3mZl3CAmKiXbH+iqIplnKWckZeYlYuRnJCGnZqQlYOSho+OkomEd2qOh3aGcXyGgIBhaYeKlJKLWnWVkGhoj45yeqaZmWV5mYeCeJhqg4qDb3mAa3FlX3ZwbGtoXGZlYmJwU1w+TU5OU0c+QFRDOjEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTVRUVVldYGhmZ1dQSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5Wmo6GvsayrqaWprqOnraWSlqu2sLKmmqqnq5dzjJ2wn6irp5OXuaCgj5yknZF/iIibno2smqKUp6GejpeRnoR1ro+IppqokZekiJu6tKegmZiLiXV3k42Wk4qUkZCUjJCToI6boKeZnLKWgIyctZ2zjJKPvKegfqeieqKut4GOjqaeg4uGkLGpr4yKlqOaeYGLrIacnaKnqaeHlYWYd6WbeoebgZemgoJ7nLF6ioWgl5mUmJWBkZeWhJmZY3mHkISOj5GKg21wj4d5gHGAgYV/hnSGhJWSeJZoknSgmnR9mYShnoeYfpKLg4OZa46NhWx4e3FxZ2R4bmpsaltla2pmdFxfSFRMUUBFNS5ZVVU3KSEwOT0+NjQzNTY4Ozo9Pj5ARElASkVKS0dTWFtZW2FgaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mrq6rqKygqLGmp6qlmZSuyL6woZamqbWej4OdrJynoqCNkL6emo2fmqCQfYaPmZeIrJyhlp+gkY2TiIaAkaiNh6Kco5OXnoaeurKnnpuSjoVwdZCJlZCKlI+Pm4uPkp+Sl6Cklp6siJ+0ibSarYrKh6quiLeFjK+CsK6DqY2lmI2dfKiPcnt3nI+nlmiVpHm0i5+epqiSmMKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qXkYt8hZKGjZSSiYNtc5CFf3pyhoGEfIR1hIGXgI/FZn+ph4+ja56DopuDmoCMjoWKmXCOk4Vod3R8d2hodXFnaGteZG9tZ21YaEddUk0yRTQ2TmFjNyYzPERHRDk2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdhXWpsXFFFPUtNQEpkWV1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKipqKWroKS5saqrppqUoKOkqqOWpaq3o69/oaecpZ6diZS9mpONoZGdkHmElpaRiKuZm5uZoYWPjHabnI+fkIiepJuVmZiGormupJmcjIx+Ym2Pi5OQjZCMjZiLkJKfj5SgoZmhqH6hp4etnaCWrY+enJ2RhYCgjaquhqONqZmMmn6idoCZlGuCrHVNq3iHjZ2Rm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln+Me2RoinKZfXmVbF17lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhJ9pZZ9sW26KfGZaYIN/YldQb3dmbXRya2pvXmpwbWxqWGlPXVhGOUE0R0RfazQsSUNRTU49ODQ4NTk7NkA7Oz1BTz5RUkxNQkpcXV9XXl5idmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhY2lrZGJkZGdkYmdlYWNol5adoLmhqqOmrJGhtrysrqOZl6CipaytoZ2utaKokqGgn6abmY2YtJmQi5+MlYx1gZSSjIqmlpWYnp5/koWFrKSHm5CKmKiYmZqRh6Wxp6KVmoiJgGluiIiLjo6Ki42Si5CSooyUnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprISleIp8hJp9onByk4iWe56MeW2HnIyZkJuomo+HnXuConN2pmaefnakX5h6fZJzom6Yt7S6dJKHgn+1qGSBxrh7cJW3i3GAmqRjc6yrYH1qnbN+bnyGgo6Ci5hxf6NscqNznoSApGCcmLOWcXyXn7R0c1uesoNqYm90dnJob1hrbHNzZl1pXmJLRT1ENVFBWnIyPVNHX0pSPTwzOTU6OjZEOztASVE/VU1OUUBFX15bWVhgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe1rq2gm6Kco6OmrZybsa2sk5ehmaGkmZqUnqubi4mSeIuGcICWjYmPoZCSlJ2XfZCJjqigh5iOipGik5uajIqoqKWej5aHhH5re4d/fZCNg4uQkImPlKCDl56gnaCfi4l3nJiijJ9yoYuHqIibpY+Wp6p+rYx+eqCZeqOTeIF0loiNnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmh0q4Odg3SqZ5SaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z2iIl/nmiadYaTkpeOf59umpBtp5ldqH54u2t+qluOhF20Z1xucnl4a2lccWp5eWNgZlhiQVFFTjdWQ1JuNEtaWl9OWkRAMTUxOzs3SD86Q0hVP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniWOUm6u6srCsnaacnKifnq6bnrCorJ2XpJqhn5iWlqCjmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJajnYqUj4WLnZGcnIiPqKOgmYuRioCAaYCGeX+XjHuIjo6Ij5aaf5Oin6Chk5hyaJ+Kn4+McJKMgamHmJ6ip5+nfK+to6K4l3ejs6KkgIiUeZ17q5p/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmX50qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcXyObYGJhJl1m3iGibGzf3+bk6d2gZ1tcn2Ub5lzaqRdlXZIZWNgc3F+f25mYGxpdntkZWJSXlddVVZAWUZRZ0RTV1tiWF5JRD1COD9BOklFOExFV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk52Bsa2ZhFReoKazubOzqZqijJyrnJyplKGrpKGoj5+enZqZlZignZaIh4l3hYFueZWFkJuLfJGTlohyf4iSoZtzkZCAiJiUn5qEjqmcmpSKi4p8g2yEhXGCoYx4hY2IiJKYlXyTo6Geooiuhn21hI6enHullnqpgZWcj4qgnHynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpqAo29eqGd1o2NvpWGc05B8e5l4cnNjooWQfqNzo491a5Czi2CCmIlzqrKovH93g21+vqaptF6cbn1xl26Ac6JyXaRnc6ZhaKZtm9SZfYSab3h6l2ube3eXc22ppGdgZXlwgIRrZ2ZkbnZ3Z2BjU1tmUVFhSFdJVGBXU1tlalxlUUZDS01KS0JKRThQQFFOV1JZT1NRYGZlaVNjd3l3SUZFY15lWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7GrVFxLfqmvsbSws6ObmYWZqKCgpI6kqKCYqYqZmJiTmZOSoJiOiIZ7cH2EaH2Pg5SagXeRjo6Jb3+GkJOSbJeTfIiRkaOVg46qmpSSi4WJeYN2iIBugp+Hd4CThoiZopZ6k6Kkmp+Js6Gitot6rKekrqVwqICakIWAm5F7pIChmYaYcp6Eo66vipeMf4ykjZaDrqGUdrS1tcmhc5SKgZ9gnZepbXmVhqCbdaGHd6B+kZaKgG9MZqOScJuHcqR7eXRhg4FrfqBrcWRgnHJ+dJdpemmztbTGpnOYfnqda5ybq3WEm211d5hpmnp1mHFQRX20Xmp2a3mIZmpoYnR1cG5WXlRZaVBTaElVTFlTVV1oa25WZ1dNSkFKTUtISk5BUUtQZWNpbWV1c3N/eXxudYl7e1RQTmxeaFtraVJqaGlsZ2xmY2VfXF1cXmliZGlre19dZGhjamZvbWVpbGWhnIivpoRmP5Shsquvr7aiopCAl6mioqWMpaednaaCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1j4mMgWmEhZKDjIWdjXqMipWlkoOXqZeMkYuBiXqAfYt5cJChhnmBlYeJlqCVf5SlqJyWloRmbnicbKJkfHGld5uYcGemgJaLe6R6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmranWgbW6mX5ppi5BoloealXWigH2aYIuFjHRviGJooGWefmmadW9jZoiCbXKiWl9bY6FtXYmMb3t+c3JkpW13omRnp2iZc4yZb6JvU4mQb6BfZadUi15UmG5tc2tygm1waWt5c2tvUllXV2ZaU21JWE9dSVhpaHNqWWtWUVJFVlxMWFJhVWhqX3d0en1wfHxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66kqbCxpp+LgJernZ+ljKKhmqKigJaYk42aj4uYkI6Ke4ZxgIhoi4t8mJtzdIl9kHtkgoeViomVmYJ8iIaWp5CAoayQhZCKgop9gICOc2iPpYR9hpSNiJigjoiTqqediaZ4lpt/pIiWjLKYnpCCr5efpXeUh3mpdKSOhJpupKKMkoSMg7tufaWvgoaGhpOWnKB8pXpxqJWglmaefm+rY5aKlZJ3qGypooGJdYeCd6uRpodqkbBrdrOMqWuKhm1tn56SlWF/q4uqdn9/jKWedp99hKSVnaBqm4h3rGefrY22dHe+jaSTWYOmjathdXJ0cHx0cWNqfm5obFNWW1ZhYl1rTV1SXUldbW12YFtxWVtgWmd0ZW5vcWNxdGB4en55cnmDc4R+gHt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnainrqSZiYOYq5qepImapZ2pnYWMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGk498e4GFl6WNf6WmjoGOiYWVdoKHkm9si6mBg4uUjomcn4mNlKujoI+AdZSWiH6BeZSuo3+Bm3GPhXiPioN+e3KmjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3p9iWuMhVt5eHJ6cGhufpKJcX90go+Uk3GFg4JljH9egX+Ld3VzlHVveW5uh22EhV52aHiOZYCBhY6pm310fJZqiYhvgHZ9hnZtbWeMc3l7mHiEW2tYeY9pbndycW94eHBdbIZuamdWWmBXXWVrY1ZhVV9RX3B4eWxrdmVqa2p2fHFydHNhb3VidHuBeHV6g3aAgH+AeIuFg317bX9sZHhuXlduZ2h1a3hqaWpkXGBaY2plbHF1blpbYmtkbGx5bWhsb2GOlLiopouhopqmpJmknKuioYSEmKySnqGJmqabqZiDgZuKfpaTh46KiY1yg3yPfX6PhXuXjnNyhHCVhXt9kouGhpCFeH5/hpijjXunoYuGkJCFloOGjph3coWpho6SnJCInp6HjJuon6Cqg4mNlJp+fomWraiPkqaPd2+dkYJ5kW99qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgXZ0gVlyboeRgX1+jGpdamR6hYOIgF9peHqbe4KLgnaBhoJnd4qGa2FwcoJ2X3KLgYmPppWFZoyPg253i4Rxho96cGZnZHuDepZbXGpnbnZbe3l3dW5zc4JmXG2Ka2xjWVleW1lscVxfYVpeXWZ0fnt1b3Rja2tqe31ye3h0ZG10aG18fnZ6fHx6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VtbGdzeW9oam1gi4upsKGQo6Ganp6Ynpmoo6J+g5itjZ+ViJuikaWVf3uYhHySmYmIhoeKc32Ai3aFi4GElopxb4BymIaDfpOEg4aKgXqAg4ubn4+Cp6GHeI6YiZWLi52XhYN6rYKRmJmUip6dh4ihq5+ioqOLiJObnKOZlqqhp6agkpuHlY17d42OhKd+f5KRkpOcsaablZ6QjbKTmISljIyVm5+JkJuCiJGKa3yNd3hlgoaQinyJnYSHi5CIiICFhJB3fHl0mqGIhomeioSUfn2LgYF1cHOFg393h4eKkKaRhIWNh4ONkIx9iIuJkIJ3bIKEfXqZanJoYXSKcH16d3ZvdnSBXV5vh2hvYF5aXF1TaHJVY1xcYWxodXx8c29wZGtqaX98bnl/cWlwcGxmgXtygoB4f31/hXttgoyFfHp4fH16g3lOZHZqcm1wemRrZWJiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZYyHnbmelqKhmJWZmJSZpKGefH+aq46ejYagnIueln15lIN7jpmJhoSEhm54gIBygYd+iZSEbWt+epeGg4OQf4CGhIZ8hoONm52Sh6qfg3KKkIaTkYudkX2NeqqEjZKYlo+cl4eHm6afopqdhoORmpmZkJqmoKWdnZCWgJCKdnuHjoSle3yOkJGGmKqhnpOdkI6rjpGAnoyIk5qego6XfoaNgm93hXF1YX6Cj4Z1i5iBg4+ChoR+hYOUbXh1dJKiioyFmYWEjXSAiXx9cnJ7h4R7eIuOhJKmj4aDj4GEioqKd4aIiYx8b2t+gXxuaGxtZ156f2h8e3Z0dnV7d1xgcH1udWBjW11eUWduVGVbXmFraXZ6fnFsbGRrameAgGxzgGtsdG95b4R5bYaAdoKAfYR2cYKNh357e3x/e4KKYGl7anVoaYJlamNgaVxkdWhvYnRtbFVjcXllcHp6cmVpbW2LiZ63mqGjn5KRlpeLmp+fnnt4nqaRm4qHpZSLmJl5eoyFfImRg4yCgoJufH94c4GFfYuRfWtofYGXiIGIjnx9hYSHfI+Aj5ubkYinnX9wi4uMk4ehoYqFjXyokYiQkpeTlpN4jKOgoZ2Wmn+AkJqYkoyao6GjmpeRm36NhHiAg46HoH99jI2PfJikoKGTmZCQp42QgZuRiZKXm32Skn6GjYF0c4JwdmB9f42GcoqVfIiMcYx/goWGjmh3cXiMmJGPf5Z+h4pygYZ8fXB4e4uEenqRjIOWpZOLhpB8hoaHhXaChIiIemVyfH94enFsamZefnNofHV2dHxzgGpeYHR2cHhkY1lfXlJraFRlWV9haGp2eIFxZmtjbGhlf4FrbX1ob3FrfXiGemuLgXOBgX6BdHaCjYZ+fHp/gX1/j2pyg25zaWGHaGxiX3FWdG9tbmB4aG1XanR2Y3V7enJiam55iY2espKlpZyOkJiPhp2hm518dqSgjpd/jaKKiJqWeHuGh36DiX+JgoF/cX97dHaChX6KkXhnY32Gl4qCio14fYCMg3mWgJWXlo2VoJt+b4yCkZSGppuHjYmEppWFk4uWl5OSd5GdoaGXlJd6fo6Yl46Wmp2knZiSlJt5j4WCd4SWjZ1+gYmNjHOXop6ik5mOj6KMjIOXmIOSlpl+mI18iI2BdnF9bnpkgHyKhXCGkn+QgmyHgoGAiYRldW97h5KXjHyTeIuJe3+GfHtxfneJhXmEkIqLl6KVgoSMd4iEg4J3fIKJhXZgeHh9dH54Z2xkYX9pandzdHV9cXxiY2FzbnVzbWFaYV5bbGVSY1hgYWlrdnmGcWJqY21laH2DbGh0aGxvaYB8gXltkIZxgIODf3R8g4yBf356goN+fJBtdol0dG1limxqYmN1VoNpcW5geGdsYmp2cGZ5e3lxX3JshoWPnK6XpqiejY2Xh4afk5eZfXiqnIqZepedi4yYkHl7gIt9fIN7gIOBeHR4enN9gIR/iYuAZF59i5WHfoWHdH1+iX99l4SXk5aMo6GYf3KHe5SSiqePjI6Kk6CSg5KQlJeRi4GPmKCakpCRc3+NkpSJnZ2eppeXjZWWc42OimuFl4+ZeoeIkIlvl52ao5OVio2fjIeCkpx/kpKVhpmIfImJgXlxeWt1bHt9i35thZKClHdwgoN9fop/ZHJpe4CWl4R+jXOQiIN4h351eIB9hoB8g4yEjJSkj3mEgnSJh32AdHaBiIRuYXt1enF9b2FvY2R7Ym5vdnN4d3N0YXVfb2x1bm9cW19eXmteUF1YY2FobXR7iGtfamVqY2h3iG5mbGhqbGiBfHt3b5CHc4GDhH1zgYaJeoJ9eoGEfX2OcnqLeHhubIdraF9pcmKHaHJvZXZnbmxheWhrfXt4cGF3bYuAmZmqoKOonYqLkoaKnouVmH13rpiMl32elJGWlIh3fnuKfHuAdnd/gHB0c3tvhX2BgIp/fGFcfo+Rhn+EhHN6gIZ6j5GHkpGbkqWclYJ+gX2Oi5KkiY6KjZiajYaRmJOWjoqIjJKck5CMjG6Dj4+RiZ6ZoqGXlomWkW6ImYRmhZiOlHqJhZCLcJaalKKSkomLmoyCf5GefJKPkouZjnuKhIdzcnVrcW50e4t0boWQjZJxdIB7gYGIfGRwbHh9mZN9hIh0kIqAc4h5b4B9gIZ8hYyIhIyVqIx7iHx+i4V4fnFwgIWDY2h5dHVwfGJecGBrdF5want5eGtzcGV4XW1sc21zWFpeX2JrWlBXWGVjZ3Fxf4dmXWloZ2JncY1vZGlnZGlogHp3dG6OhXSBgoN7dYKJhXeFfHiEhXqAiXd/i3t7cnmDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKfqKXoaigppuHjIuBkJyHk5x1gaqUko6HoI2Wk5CAdHt2hXd4f3Jze4VrcnB6bYp2gIGHbnFbWH6RjYiAgIB2dYCAf6CGkIqSnJehlJh4in+BjYmcnoqPhpKYloWJlZmPlouLjY2NnYqOkINtiIqQkYmclqGcmJWFl4hqhKOCZoWdipF+i4OLgXeTmJKfkpGJiZWOf36QmHuRjY+NmpJ8in+CbnVwbG1vcHuFaXODjpiKcHd/dIKIgnhmcm91gZmOfIiEepSReXaIdHCJe4WMeouGg4mOm6OIfIR2got/eHhva4GDgV5yc3JxcHhaXnBgcGpeb2l8enBtbWpsdmBwb2pybVpYYWFiblhRVFpmZ2N1cISCYl1rbWRiZmuTbWBmZl9na4F1cXJwi4B1f4OAeHWAi4B4hX93h4Z3g4V7hox/e3aKgGpxY3xjhnxvcW10amhvbHZ3X3F/eXt0dXSAgn6klZqtnqaWhYyDf5eUg5CfdYuflJOGi5qMlY2LenJ4dIJwcoV0cXWIa29tdW2IdoN+gG1uVVGBq5SHgniAdnKCeYGggpGBk5KYnJKaeJJ7g42TpJqTjomVmZKEh5eZjJSLiY+PiJ6EkIp8coqFiY6InJqfmpaUgJN+aIWch2eFoIeSg5GDiXGDkZePm46QjYyQjXh7kpB6jouMkZaMfIh8gGt2am5ra2x6f2F6fo6WgnZ6gHiDjHx5Z3NsdIeVi36IhnuTkHF6hHB2jHqJjHuJfYKMkJ6dhXx8d4KMfXdxamyBgnlgeG9tbHJ0Vl5vYnJgX2xueXBncGZmc3RocGthd2VdVmZgYHJTUU5cZmVdeXCIfF9caHJiYmVmkmpfaGRbZ3B+cGtwc4p9dnyFgHR1f4x5e4aBeIiDc4aFfoyMhHt5lXhncmqDYIh+b29remBqbnR/dF90fXiGeHRzhXx4oI+ZsJylj4KKf4OaiICMn3+LmpOOhYiXjo6PhHZ0dnOAcG+Fc3Bxg3BqaXZug259fG11c1JNgt/IktaTfHB1g3WDoIKTd5WRmZuQmXuUc4WQn6GTlJCKk5uUhn6WloiNjYiRjYicf46Ad3qMfoiLipycnZqVk3qNdmeJkYdsiKOEkoeXg4ZjjJGZjpWKl4yNiotxe5SIe46IipKRiXmFe35se2Vyb2preXlcgHmQjoF6fX5/ho56eWhzanOLj4mBhYV9lYtrfn5ugIt+i4d9hHqBj5Wamop8dniDkHlzbWZwgINtanRvaGp0blNeb2RwWV9rcnhma2piZnhyb3BjX3hgYFZrX152UE5LYGdjXXpxiXRcXGV2YGFlZY9kYGVhWGlzc21qcXaMfHR5hoJ1dn6Lc3+Gf3uJfnKJh4GRioh8fph2ZXNufGWHfm9wa39ZbG55eXNhdnp7jXZzd4p3eZ+Lm6+boJCChXeIlX59ip2HhZ+RjoWMl4STjoeBdHdweXFuhG9tbn5yZGR4cX1teX1qaGxjpJrB3K7voXNrdYN1hKKFkm+WkJWglZyBkXGGi6OXiY6Wi5CdloOAlZCFiY+AkoqJln6HenV/iXiGhI2cm5iYjo92inZuhomLfYqjhJGJnYWFXouTl4qPiY6Li4SKbXyWgX2IhYmQj4Z2hX19a31keHVpbnhzWIh6koaGeX6AgIWLfnhlc2p/iY6JgoKAjJaFa4F2boiQgo+Ef4J6f5CVk5mQdHN4h411c3FndXqDYnRtcGJqdmdSYHFnbFVfbnR5YXJjX2h9cHJuW2NyYWJXblpceE1NTGRnYV52c4ltXFxkeV5gZGaFYGNiXllqcmtua3N3i310d4SBeHd7iXGDhH1+iHt0i4mIloeMfn6Yc2h1cXlsi3pudHCAV3F6dnlxZXd5hoxpd4CJcn+ch5mnnKOShH1wjJR4eYudhIWhjY17lo1/mYiEe3J3cHNqb4FraW18dF5geHd7cXV7Z2FlfOvatcnD3IhzbHSBdoqaiI1pmI+PnZWTgYlxhYmgjYSLloqMmJR8jZOIg4mPe5GLhY+Cf3Z4g4Nyh4KTm5aUmIaMdYd/cISCiYaYoYOUjJ+DiWGDlI+HioaKjYeBh2l9lH99g4SJjo2CcYZ+f3F3aHZyaXN3bFqMfJKChn1/g4CEiYJ1YXNriIGPioJ+f5KQfW2CbHiGj4aRg32BfYCSk5CWiG9xeoyGdWxxbHJ4gV90aW5da3ZgUmVyaWZTX3B2dGBvYF1ognByaldnaGNpWG1WXHVMS0xlZ15icnOFaVtcZXleXmRne2BkX1xZa25mbml0d4p+c3OBfnp2eohzhYJ8gId2d4qGjpiBjIF7k3Zsd3V5eJN0bnh6fVh5hXGAb2d4d5KCZHaGhXGKlYWZoZqiiod0b5OLcneOnH2KmomJfJ9/g5l/gXhxc21vZHJ+aWZsd3hbXnl7e3FxgGphZ2F/1baOkKZ4bnF3e3CSkIyHapmOiJySjIV7aYiLmoeBkpGGh5iNfI2NgYGJjnuQjX6JhXp0e4J6cIaAlpmOk5SBiHWDhnaDf4qSnJ+GlY+ffohhgJOHhYiEio6Af4NnfZGAfn+CjI6Qfm2CfIJ0a212dHN2dWtijYGPf4V+fIR/hIh+b19ycIV7j4yCfH6RiHpwg2Z5g4qGi4N8hH6AlI+QkoRub3mMfnVub2tsen1jaGtqWW52WlJpcmpiUWJyeGxiZV1aaoNtc2FbZ19kbF9uVFtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmxsYm1qc3aHf3Fvf3x8dHiGeIWCfYCHdXmJgZKWfIiGdomBcHd5e4OTb218gXdeg390gW1penSUc2dzh3xykZGDmp+boIaIdnaVfm12lJd+iJCDio2afIuadn12cW9samF1fGdiaXV6Wl94fHptcX9lZGhnV52PXnFylrzEhHZxlImQfnKXjIack4yIc2uJj5aBe5SLgYSbjHyLhn18iYx/lIh1iYV2dn2BcXWGgZ6UhpWPg4Jxf4h0g3uJmJyXhpOOnYCIZX2TgoCGhImJcoF9Z32Le3l/f4eLj3xpgH2DdmZveHhzdnNsao2FioGKf3iCgISDf2pecXh6fYyJhXuBj4B+coFpeIKHi4WEeIN8gZiMj4x9bm17iX13dG9oaH12ZFxxY1hvc1NTbnNpYU5mdHhmYF1cWG6AbnNZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebWNaYm93Y2ZcXWBramNsaXN2gYNxbn57f3R1g3qDgnyBhXZ+iYGWkXiDinSBiHJ5eX6NkG9vfIFxaYF5en5tbXx2lWtqeIR0bJONhZ+YoJmFiG59jHZqeJiPf4KKgpWXinmPlm96c3BsamRgc3poX2Vye1pgcnx5Z3B6YWVljrGyd0piWqTZ0Jdxe5GLkHh9lYuFmZGNhm9shpKSenmShoGEmIp8h394eImKhJaAb4qHcXR+eml5hYOlkYSTjYN/b36DdoN4hZuYk4qSkJSFh3B7koN9g4OJg2+BeGiAhXhyf3+Diod8ZX1+g3ZjcHOAaHhwb3SYjIWCint2eICEeYFqXHB9coCHhYl9hol6iHKBbnGDho6EhHOEeICZjI2EeG5ufoR/d3tlaGp9cWBZd1pZcW5OWHJzZ2BLbHZ0YV1bW1l0fXJvV2ddZmpwX29OV2lSP1lmX1pwa2d5cVtbWGtlWWNweV9oXF5lbGhmbGlwd3+Hbmx/fYB1cIF6gIF/gn92gYWJl4pxgo1xe4Z8enmEk4x0anp/a29+dH99b3J8e5RvboB/eGeSioKhmZySgoZnh4RwaHqWiX5/hYKZioF8jYxoeHJrbGZfYW94bV9ib3lcZGyDemFxdl9lZdTqvooyOj6LjoByeYWIjo12g5eNfpOOjX9ubIWNjHZ9j3+FgpWJfIN4bnaHhIOXd26IhGx1e3RmeYKDp4yDj4uEfW5/dHaDeYWbkIuQkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7goqEeGF5hIFxZHFofm10cXWBm4uAf4V+c3Z9gHOAb1tsfnR4ioKLe4aAfIh4enFsiIOPg4pygXl/louKfnRta3aAgHV2XWlpeHBZV3xTWnFlTFtycmVbSnB3b1xbWllddH50aFliW2dlbmNpTVdmUT1eZlxddmZfdHBbWVRvZFllcHlaaF5fZ21namxpb3d9jmxpgoR+eW6Ae3yAf4J6dYKBjJOFcICLbnd+gHt7iJOJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjIyDm52WjIGAbI5+a2l/jo17fn+DlIJ/fYqIa3VxZ2hjW2Jncm9gYWxzYWhwiXphc3ReY2SboI9uXDVZr7V1aoCJfZKGdoaXhnSPi4p3cG2Fg4d1eYl4iX2TiHp/c2d2iH5+mG9whn1odnltZXmIhKWHgYeNiX5ufnV/gHyLmYeCk5CYiIuEiXyPiHF7fYR8aX5ta4B7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZSRgXyBf293eXx0fmxXb352dIuBhneHdYKJenhybomAjoCFcn59fpKIiXpubmltgoJ1bl1oZnRyUlt7TlxxXE9ccnBjVktzeGpXWVlaYXGAdGBdXWBnZGhpZk5aaE5AYWRbYHZhXHRtWFdTdGFaZG5yV2peYWhrZ21saXB3fJJraISJfHxwfn57gX+CeneAgImLhHF7h29xd4N/e4qNj4Nqfntud3l2ind9eICCh3+Dfn56bYSMiJijjYSDe3aMemtthImReX17gpGAgH6Kg3BycGNmXllnX3BwYGBncGZqb4p1YXRvW2FkanZ7f76cpqPIuHGFhHOUfXiGlIJ0kI2IcnJwhHuDdHWHdIh3lIh5eXFjd4Z6gJNpcoR1Znd2Y2p8g4iegoB/j499cn5zhHh/kZCCeJaNlI+Hgoh6iYlseHl/dWh7aWt/eXNpenaAg31oYHeHfWprdGh7f2l2gYuQlH56fn5we3Z7c35iVXZ8cnOKhIJ9g3CGind4cHCDgox+fXl+fHWOhYJ1aXFpbIeCcnBeaGNzbktldUxeb1VUWXNuYlBPc3hhUldYXGFwgnNbYVxoZWRjamRQW3FJRGRhXGNxXl13aFVXVXddW2VuaFZrXmFqZ2Vvb2lwdnuTbmmIjHl9cnt+eIKBgnx2fYOIhoNwdoNybneCg36Ji5N/cIB8eHl6gYx0g3h/gYGChHqAdW9+iYuanoh9hXp3h3xodIaNkXp/f3yJhoR2j4Bnb21fZFxYZVltcmFgYXFsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhwjXV7h4+AepOKgHV0dX53gHBxf22EdJSGeHVsYHqCeYiOZnGDb2d1blttfYCQk4CBeZKSfXh7bYd1gJCLg3OWipGOh4WFe4CFbXV2f25od2Vte3ZtanZ2f398YWJ4hnpodHVjfXpndYaOjJV7dIB1cYB6fGx/WVZzfW90hId/gHlriIZzeWt0f4ODfXp9eHtyi4B8cmd0ZW2Kg210W2tfdWVIbm5MW2JXV1Z4bWJPU3R2WFBVWF5hcYRvXGBjbWRjXW5iVF1yR0NmX11maF1aemNSVVx1W1tna2FWal9gbmZma3FocHV4jnRrjox1f3Z4fneBg4F7dH6DiIiDb3F/dHF1foaCiY2Ke3d/eIR8fIWHeId8fYF+hYB7fnN2eYyOn42Jeop2dYN5Xn6Gmox5h4N0hYaFd4l6Ym5sW2JbW2FWanNjYFtnbm9nh3JhcWZXXWNrf3zKzoe5omptbYpscYRxfISKfnuShXp5dHl1dXtqbXVjhHWRgndwZ159gnmLiWVxgWtqcWNYbHuGnIiCgnOXlHd+e26HcYGJi4dxlo6QiIWLg3t5fnFxb35naHJibnhxamxxd318el1leYB3aXV4ZoJ2Z3SHi42UfHKHaW9+gHhtfF1YcX5tc4CLfIFub4l/cXZnd3+Bf4F2fHF6dIZ8eXJmc2Fui4Jsc1hrX3dcSW9rTldWXlRVe2thT1R1clFRVFZeYnSFaFxga2pmYlluYVhicEdBaF1gZl5dVXteT1ZkcFlbamhdV2dgX3Jma2dyZ3Byd4Z4bpWKdH96d355goeAdXOAhoWOgnBwe3d3dXqHhoeMhnp8f3WLfn2FhISHf35+fYd/fHh2eXeRk59/jH2LbXWAeWSDiJeGc5KKb4WFgXqDdGNuallfW11dVGdzZWBZZHJyZ4FzYmtlV1pgaX93vq57n7duYnOGaHR8cnqDhnp9jH94eHN2b3t2ZWpuYId1joFzamJefnh5ioNmcX1oamtaVm94iqSBhX9xmZNxgHh1gW2AgZCHcpSIjIeDiIV9eXRyb2h6YWptYG12amdra3l3endbZ318eGVyfW6EdGV1hYyGlX9vi2ZreoN0bHRiXG98a3R7i3uCZnWHfW1xZ3V+eH1/cnxsenqBendwZWxibYl+bW5Wa2B3Vktqa09ST2hOWXxoYk5VdWpMUFRVXmZ2g2ZdYXBoZ2BXaV1ba2hKRWtaYmRXWVV5Wk5WbWpZXWxlXFllY150Zm1kcWZyb3SAd3CahXZ/fnd/fIWHfXVzgoh/lIJuc3h6enNzhYeJiIR4gH12j398hImOhIKEe36Lg3t3fHd3mp2XeoqDh2l3fnxshIWUgHKPgnGGgn6Cf29mbGdXXVtcW1RkcGVfWGNzdWl2cGVlYldcXGiAcG9ygHOJZGV4fml0dnNzg4V4gYR5d3R1bmt7cWFna2eGdI2EbmZdX31ve4l9aGx3ZmlkVVdycI2mfIR8dpaQc3xze3lte3qQhHaYfIeGgoaDfXVwcmxndV1taF9sdWRnZml6b3tyWWeBd3VncIB4gnVid4WKfJSAbotqbXqAcGVyZWBseWZyd4p7fmJ1g3Zpa3F0enB5eHJ9Zn5/f3h2bmNlYW2GfG1rVmtjcVNMaWtQTE9wR157ZmFNVXRjSk5TV2Bqdn1lXWdzaWVfVmNXYXBdTEtrWGNhVVRUc1dMWHVkWl9rYFxaY2Vfd2ZtYnBpc25xfnR0mYF3f4B3f36GhHp9dYKEfpeFbnJ0e3p0cYWFj4KAeot1dJCAfYGUjoCFhHx+jIZ6foB2e6OlinmIhYRsdXx7dYSCjHpuhXN6hX2Bg3VuamhlVl1bWlpTYm5lW1hhdHtqaG1pX2JXX1ppgGprb4BnbGFoeXlrdHR0boWBen99dnVuemhqeWpfZW5pgXePhGdlWGJ3aX6Hem9pb2ZmXVVYb2iPp3aBenyQjnl1b35vcnV5jn93lHSFgn+FiHVqcnZnaG9cbWVebXNfZ2FpeGh7bVttgnJzaW+Afnl3YXeEhHiPhHOIcW95f3FicGhbbndkcHOIfHlic4BwZ2p4c3Jrd3Z0d2ODe353dnBkY2NufH1rbFZqY2dTS2xoUEdSbEVheGZhTVNxXUlNVFlla3d6ZV5tcGlkXVZfVW5uV0tTaFhmXlhNVWxVSlx5X1tfa11dWmJlYHpobGFvb3Vub3d1eph9d4CBeoB/h4Z6eXqDfoGThHF0dH56dnSFiJB9gH2QbHOUgXuCn4V/h32AfoaCgIp7doSsn396iIeEbHKCenaBgIF1bodvfIBziYBqb21kZFhfWllaVWJqZ1taX3WCaV5tbFxhVlxca4FmcnR9aWpda3Z2aHR3cW2Ge359eXZybHpoaXdmXWRzaHp3koFjY1Rlb2aChHd2ZmhpYFdWWWhkkKdufniAi456cHB8ZnhueYt7do5xhH1+f4ZuZHZzZGhoXWtiXW9vW2dfbHVlemhddIBvcmtxe351dWJ0hYp6h4aAf3dydX50YXBsWXBzYnFyhXx0ZHKAbGFsem9qaHl3dHFmhXV6enVwZGFkbnN+amxVal5eVExzY1FHV2JHYnZmYUtUb1dKTFhYZ2t2emRlbnBmY1pYXVh2ZVRKXGNYaFhZSFdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bW9udoOXeXKBgH1/iIuGfXZ2hniHjH1zdXWBeHp6goyOfX6EiWp0loF7ip19foV5gHp+fIaIc3GProx7e4aQfmZyiHp0fX12cm+GbHt+bI96YnBvYWVeZVZZWVdjZmtfXV1zhWhZcG5aXldaXGx7Y3B3dmxiW21zdGd1dXBthXl/gHl3bm90ZWl0ZVtndWZ2dpF6X11SZmZqgoFzfWFjaVxUWF5iY5ClaHl0goWQeG1ueWd3bXuEenWIcoB4fHh/aGV2bWBmYV9qYF10a1llXW9vYnplW3d7a25ucHh4dHRkcoOSfoeCiHp2b3F9cmF3ZFpucGFwcYJ8c2ZygGRebnZpY2Z5enRtboF1c3xzcWJeZm5vfWVqVGlZWVROeF9SSlpZSGJ0Y2FJVG1TSUxaVmlscntibGxzYmFZWlthdlxTS2RdWGlTV0dZYE5HaXVYXmFtW1tfYmJdhWhoYW54eWxuanaBkHlug36AgZKIhIF2dIl0jIZzcXd2gXd8fX6Mj4B+k35weJaDfZmSeYCAeHl+f3OIg3NwmaJ7en+JlXlkdYh5c3h2bHRvfmx5fHCRcl5wbmBnYmxUWllXaGNtZVxccYllU3JuW1pYWGBsdmRpdWpqXlptc3FsdHN0aoZ8foB8d29ubGRpcWNbanJkdHaPc1tWU2RgcX9+cYFcYWNdU1pgXGOSn2VycYWEkXRsanlsb296e3pxgHZ+cnp6emRldWdeYlphZ1xed2hXYl1vaGF3YVt7dmppcm93dHN0aHCBlIKGfoR2cmpwe2xmdldbam1icHOBenNmb35bYHBxYl5pcHxsa3N+cnF4a3BgXGVsbXthaFRnVVdSUHZbU1BaUkhjc2JgR1VqUEhPWlVra2t8ZW1vcWBbWlhZbHBXUlBmV1dpU1RGWlxPSHJ1WF9jbWNYYWBhXYtpY2RteXhrbml1eYZ7a4N9f4SZfIKEeX2Ibo+GcW93enx0goJ8i4+DgpZ0eIKUhYGfiXWAgIF0f4Jwh4J1b6KXdHuGi4d7ZniLb257b2Z4cHpsc3ZzjWtedG5hZ2VrUl1bVWdibGxbXHGMZE9vbl1WWFVnaXRoYnRlZV1abnVucHV1emuHfH98iHeQc2Nla29hXG5tY3N4h2taVFZiY3d8fHCFXGNfY1RbYFljlpVjbnCDhYpzamh6bmVydnN7bHp0dW96fnVfZnJjW15XYmRZYXVlVV9gbWRhcV1dfnBoaXNxc3B1dWtthJOBiHuFcXJmbnxvcW5TWmVqZXF0gXZzYm12VWJxa1tebmV8ZWx1fHJycmptYFlkamp4X2dUZVVWUFVuWFFXVFBIZXJfYUZXaU5IWFRWbWlkfGlrd2thV1xVW3RjU1JXaFFZZlRTSFpaUE54d1tfZmxpWmJgXl6PbmJma3l1bm9odnZ/fm2DgH6Gl3t/h4GKf2uTiHJndIB7dYCDfYmPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6ljHOBjYt3eG56jGBkfHFmenN5bG1xdoNnZHxsY2ZnaFNfXlRnYGxvXF5ujmhOaW1gVFZTb2Zza2V4ZGVdWXB0bXJ6eHNtiHuAd5x7emthZWxtXmBvamVweX5nWlZYYGt3e3tvg15iXmdWWWBXZJyIYmtxgYd9d2tqd2xbdnFreWl1cm1ve4ByWGptX1ldVmJjWGVxY1NeYWliYmxaYH5sZmtzdW5td3ZraIWMf4h6h21xZW97bHFsYlhfaGhvdIFzcl5pbVNlcGVVYm5heWJwdnt1a29sal9YYWdodV1lVmJWU05ZZlNPXU9PSGVvXWNHWWlNSV9LWG1kX3hobn1kYFVeVF10W1RSYGZOXWFUU0pcWlFZdXVdX2ZtaFhiYVtejnFjZ2p3cXNtaHZ0eYNzgoN6iI1+fIqHjnpukIp0bHOCdH9/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjIyNjY2NjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvMDAwLyyApKCgoKCjgGNnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHhwcHBwcGH6ppKSkpKd8XF9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHiIeHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4OEhISDjJCPj4+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5CKj4yOj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+NjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiHioaNhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYiKhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+HjYyGjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISJh4aIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIqKi42Kjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpKSkpGRkZGSk5OSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCRkZCRkZKNkJKRkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj4+Pj4iPkH2MkJCPj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj46Oe42MdoqPjo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjI5zh4pzhY6MjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg26CgnB/iIWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXV2d3VxZm1qcXNvZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZ2xnaWZybmhnY2JiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpeXGVmXnJsXV5aWV9bWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTlBTYWJZa2RUUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFloaGJpYlFPT05PUFBRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZDRkpNY3JrZ3BqVU5NTE1PT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQD9AQlBsc21pc3FfT0tLUkxISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj1CSUI8T2lwbWRydGZFSl5URkJERUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7O0FZUT5FZm1pYHBxaVJhZkVFRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5OkdbU1NjampucW1qaG1UPkNGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ok1jY2lsanJvbWtsY0A9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9Pl1tb3BtcW5sa2xPOz4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11tPz5DS2ZycW9wbmprXTw6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXZIODw5S2tyb3Bua2dHOzg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUTw9PUlMRUZ1dk03ODk4SmxycnBtUzs8Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXt3Vjw+Pz09SmZ3bVI9PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4KDgH1dPkBDQEE+RXRWOzw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2EdU1BQ0VAQEFOdmpIQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVwQkRFRENYdYaIiX5YR0lKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3Z3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINVbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGg4KGhYSEhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJiouMi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIKDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo7Ojs4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3p7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiIiKioyKiYmMej45ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT47Ozw9Oj47OTs7PDs8PDk5PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXR2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA+PT0+QD8/P0A/QD09P0I/QUE/QUA9QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5DR0lLSklGR0dERkhHRUJAQENFQ0NBQkNCP0BESERDRURFRUFGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGWIWCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqIV0dMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkJHR0lZhYKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSklJSEpGREdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0dGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA5ODw7PD06P0A+P0BDRklJUF+Cg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1yTlFPTUxMS0xKSEhFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRkJHSkdMSkZLTktLSkpNTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRUdIRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxYVlJSVFJPTEtKREVGS09OT1dVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9DQkZWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hWVWthRVJRUVBJOztRU1JgdV1VVlRWWVlSWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLSEhKSEVGSUlJSElpcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0ZGRT8/QUFFQkNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJdXVZdWlZFUVlaW1lfVFpnUlVWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSVFJWVlRaWnWDWVV9kGBcWF1fV0lWXV1bW19ZSVlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNVVFdSUVdWY5aAUWVyWFpXX2dQYGZbW1hcZ2FHT1poZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpbXF5UUVFQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1dHN3e3p7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dEQkFEQU9QTVNkc3R2dXN0dnp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz8/Ozs+QEA/Pz5qUUthRUZISUVCP0dMTUdNUVVJQkU/Pzw9PD09Pz0/QUNDQD88PUI+Sk1GVW51dXVzdHZ4enx6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZEJAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztCSD9cc3R1dnV2eHp8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJYR0ZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2Njc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUVFVT0xSU1RXWFRUWFJMV1laVlhYVlhZXVdXWGhza11WYXNrYWFfXmRhX15ZVVBNT05MSUhKS0lIRkNRUFNaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbnF0d3h6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBSUk9NTU5OTkxKRlFQVVlTVE5KT09VU1RcVlJVU1JPTUtJSEhGPz49Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMS09SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjQ1NjY6ZG9xdXd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0hGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRUZISk1LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUV1dVTExLSD05ODc7P0A+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSUpMTEpGRkZEP0JDPjxCRj9CP0FkcHN3enp7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0JAQD5BRElFQ0dHSUZJRUJCPz49Q0JBR0pFTU9iZVFNTk5XS0xNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkJBREVHS0ZDSUlHR0hDQz9CPz9AQT5ERUNLTlFUTEpJTVRGSUlKTEpLTElKTE1PUFJQS0dDS0dDQkpKTE1PTUlKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQkNIRkpMSkRJSUZHR0NDO0FAQj5AQENEQ0lNUEdJS0dIS0RISUtNSEpMSElKS0pNXVJISERNR0FES0tNTVBOS01KS0ZHR0pNTlFOTGJtaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjpAQ0A+QkNERUlGSkpMRklJR0ZGREI7QkNDPkBERENFR0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0pIRU5JQkZNTE9NT01OTk1LSUhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pDRUZFQkNCRUBEQj5APjo7Oz06PT5DQT5BQ0VHSkZJSEtIR0dHRkVDQD1FRUI+QkRDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSkhLSUZIUEtESU1MUE1PTk9PTktKSE1SVVRST1dkYGFtZ3Byb3J5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJNSERFR0NCQEJEPUJBPkE9Ojo9Pzs+PkBCPkBCREdLRklGSUhGRkdFQ0JBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFRkVEQ0lJSEtKR0tSTUJOT01QT09PTk9PS0tLT1VXVlVUWF9eXGlhbWluaHJzYmVmZWRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HR0ZIQkJAREU8QUBAQzw4OT0+OT88P0JAQEBERkhFSEZGR0ZFRURDRUNESUZDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUpJS01LT1NORFFSUFFSTk9NTlBNTE1TV1ZXWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW96TUhHSEhCQkJGRTw/QkJEPDc6Pj46PjpAQj4/P0NFRkRGRERHRURFQ0RFRkdKRUVJR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xMT09SVE9IU1VTUVNQUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnlOSUhHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPD8+QUJGQ0VCQ0lFQ0VFRkdHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05QUlVWT0tVV1RRVFFSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdqZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdU1JS0hKRUJFR0U8QEdDREA6PD5APz4/Q0I8QD5BQUZDRURESUVGRUdFSEhGSEdJS0lGSkhIS0hGRkxISEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUFZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd292SktMSkxHQkVERTxARkREQjs/P0FAQEBDQT9CP0FDSEJGRUZIRklGRkRJSEdJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5PS09QUlVYVk1OVFZUU1JRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJjaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dLTUxMTUdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQkRBQUVHQ0dIR0dGSkdDSElHR0pGSUxISUpNS01MR0tJSExLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkJFR0NDSUZDSEpKSUlLR0RLSkdISklJS0hKSk5MTkxJTEhKTUtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KS0pGQz9AQj89REVGRENEQkVFRUZCRUZIQ0RKRUVKTE1LTExHR01KR0lLSEtLSUtKTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXhtbHZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz5CRkdCRkNFREVFRENISEdERUtHR0xNTktNTUdKTkhKS0pJTEtKSktNTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9QEBGR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUpKSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSURFRUNBQjxCQEJGREdGTEhFQ0NIS0hIRkpMTEZOS0xTUkxHTE1ITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25ub29xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFAPkNEQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTUxJS0tLU2tiWmleX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcb2ppZFtwZmRwXFpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRUVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRkhIS01JSEpJS0tJSElHS0tMTEZIS0tMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFlcmlUWVdbW1xVWVpdWF1cXGNmYWFlYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NIREZHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0lMSkhGR0dJR0hJRUZMSUpLTkxJT1xXXlBcW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRUlFR0dGS0pLSEVFSkpKR0VISFBKTU1KTVNJSEZBSEZKSUtMSUxKSEZFSUdERkdFRUpIQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2ZpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNHR0VIR0hLSUlJREZLS0tGRklKTktOTEhMTkhIRj5HR0xJS0tKS0tJR0VJRENEREJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV5eY2FgYmJiY2NlWlFZVlVcWl1jYF9fY2ViaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFSElGR0hIRkZKR0hGSEtJTERES0pOTUxLSEpKSEpHP0dGTkpLS01LS0tJR0dDREBEQUhJQj9JSkhPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU5eUU9cX2FjZGNjYlxkY2JkY2ZYUVVUUltYWmFfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSkZGRkhHR0lGRkZJTEpORURLSkxOSkxJS0pISUZCSEhRTUtLT01LS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11WWWBSUV9fYWJhYGJiYGNiYWRkYlhPUVFRW1NbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFR0hKS05MTElMS0lJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VDV1VFXFReU1ZfWE5UVU5aW01KS1RgYVtfWF5eYV1PWWJcYGBfYmNiXWFiV19fVFBOT1BYUl1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQQ1ZeSUdHSERGTUpQUEVJSUpLTkxLS01MSkpHREpNUVFOTk9NTkxOSEtBREFDREZEQ0FFRkJNSEJLTFBPTkxGTUZHSUpIR0xMTU9QSUxPUE9TUExRU1JVWllXWVhYZFdPU1RQUE5NT1VUW1lZW11cYGFkZWNnY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hNR0hKSEdNTFFRSUxLS0tOTlVOT0tLTEdGS1BTU05QT05PTk9IS0VgRURfTERmY0VNW0leW3JtT01VbVlMQ1BgVWxXZ0pdV1VeRExRVUxNVFZRUlRYV1RYVVRcVVBmWmhoZFhTa1NWVlVbXFtgYGFhYWJgZmhmbmxocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtGYFRISk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzWFBtSHFub2FWUHFxc1BDa3NtcXRwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X192X1hhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEZKTEZRVkxLTklLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWZ6dXhxcXpxfnN9a3V9YlJnfGVzc29zcnt8b315b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQTk1NSk5WXllVTFFTTllaTVNTUk5MT0lRUlRZV1dQVFBQUFFLR2Z4bGN4cm1aS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JSaXtsaWp6en1seHp/b2dvWHZ2anV1cIBgcmd9aWx4fG9eX19iYVtdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKTFFPT09NUFpgWlhLVFdQYV5SVlFZU0xPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vY1JncXVubXlwd2x2dHRxbG1cdH56a215fGt0bXxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUElMTUtMUVFRUFBRV1xZVU1VWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ8XVRLbGB2dWtpdnx7bX54a3xwXV5eYltfYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElJSFFQTE5PTEtTU1NPU1JXUlZUUFdbVlZUVFRhYFBOTktUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVVWU1pRT1NSV1ZUWVZUWVVUUlVUVFRXWFddWl5hXVxaWlxcYGNcXWJjZGZkZWRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWl9dVVleXF5dXF1gYV5bYmJjZ2ZkZGJYX2BiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXGpkVlhZWldWVFRQS09WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVldRUldYVltbV1FUVlZWVllUWFdUU1JYVlVaXVldX15WXl1eYFxcYF9fX1piYmRoZ2RkYVliYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF9bWVZWWFFMTVZTTU5ST1FST0xQU1JVWlVTUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVtbVlJPVVZWW1tXUVRXVldYVlRYWlRTUlpXVlxeWl5fYFVhXGFhXWBiYF1gXWNhY2doZGZgWWNgYV9fZWRfYGNbWlxbXFlaWFlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cX1dcXmpxd3mAY1xbVlZYUU5PVlNOUVFQUlRSS1FUVFlaV1VPUk5TWFdUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlTVFlcVFNTXVhaXV5cYGBgVmJbY2JeYWNfXWJhYl9kZmlkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFtdXl5bYFxgVVxdaWpyfXNsZ1xVWFdRT1JaU1JRVFJUVVRLUVdWW1laU09TUlZWVlRPVlJTWlJUVVRYXVdYWFNYXFheXVlaXVRVTlZXV19bWFFUVVlZWVVXWVtUU1ZeWV1dYF1iYl5ZYFtlYl9kZF9eY2NhXWVmaWRmXV5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVZVVFRU1xUVVRVVFZZV0xSWlddW1xST1VTWFZWVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paU1RWWllaVlhZXFZUWl5cXmBhX2RjXF5dXWVhYmZkXl9kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdX1RdXmJlZXaCe2hYWVlTVlNWXFdXV1ZWV11YUFVdWl5dXVRSWFNXVlRTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxVVlhbWltYWVlaWFZdXl9eY2JhZGRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVdWXGBhYmNhY15fVltgZGFfenVvaFlcWlVXVVdbWllcWVhZYFdQVl5cYGFcVFVYUFVXVVNXVlJTVVZaWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVpZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBrZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVlhRV1ZXVldWU1ZUWFxcXmBgXWFcV2FeW15cW15YVlhYW1tfYFxfWFldXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgYGVjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWlhbXFhXWV5gYmFlYWRhXV5ZYWNiX2FgYV5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBYV1hZWVdWWFZdXV5gYWBfYl5ZYV1dXlldXllYVldbXGBfXV9aWl5dXl5hXFtbWlxgYV5iZGNlZmVmYlpkZmdpZ2NfY15hZmRaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVdcW1xdWldcXV9gYmRiYmFdYFhiY2JgY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpjZWNgUlxZT1hYWltaWVhaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfX1xaXl5gYmNcXFhbXmBiYWNlZGdlZWZkXGVmaGlmY2JiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBjY2JcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pRWVhcXVxbWltbY2BjYmNgYmRhYGNeYFxeXl9aWFZbX15dYWFfXVtgYWJlYl9dVFxgYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7fH19fHx8fXx6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiYyNjY2NjZBGKCoqKioii9vS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyNj5CQkJCQlDsWGhoaGxCP7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fX19dnNzc3Nzc32FhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnh7eHp5eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx8e316fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eXx7fnl8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8eXl8enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en97e3x7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHt6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnBwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBxcXJycXFxcHBwb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXB1cnBwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXpxb4t2b3BwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFxjXNzmHhwcXFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycXCXe3agf3BycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdJ+Ce6SHcXR0c3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4d3d3d3h/p4yIppB3fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3t8fX6pkoallXp7e3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX18fH98gquciqKVfX1/f398fH2Ag4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgICAgoCar6inp5V/f3+AgYB+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f39/gYGAhaympa+mn4J/fn9+fn5/f35/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+fn+Bf36PqZmiqpujj3+Afn+Af4CAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GDg4KBgZ+hk5+kmJ+YgICEjoJ/gIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYOLi4WBmJ2KnaqbnZqEiJuSgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYWVm4ySnZOdrpmTnp+fmoiHh4eHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgo2lqqypo52lmZ2kop2Qh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg5OmqKGcn5qbnp+eloSEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4KChJGXlpidmZyenJqMgICAgH6BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4F/g42SlpqXm6Cdk4SDgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZeIhIKFhpCWmZecn5uIgYSDgYGAgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEipOZlZqckIKChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYycjYCCgYKDh5KNkY6DgYGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZiMgIOAgYKAhImIgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p+hISDhIKDg4OChIOAgoKDg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf35+fX+DhIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aDgH5+f39/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFhoWFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYmDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDg5GSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfn19f4B+fn5+fXx9fXx5fIOGhoeEg4GDg4SFhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4J/f4CDg4ODg4KCf31+f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af36AgIF/gICBf39/gIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gICAfn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOBgoOBf4GAgYGBg4KDg4GBgoCBgH+AgYOBg4KAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fImTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYKIhYKBgYGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjISDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoOCgoKSkIuIiYeJh4aGhIaFhYSEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGSjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYB9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgICCgYKAgIGBgH+LlI+Mi46OjIiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIKAgX5/gXx+fn9/fYCCgYCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjIyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6MjY6NjYeEhoaFhISEg4KDgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19fn9/fX6Afn9+hJKNjIyPjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fnx7fHx8e3t6fX6AgIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2Mi42LiYeEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBf4CAfHx9e3x8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjYqJi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f359f358fHx8fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko6MiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg319fX19fH19fXx9fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uKiYyRj42KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3t5enl5eXt+f4SDhIeJioeJjo+Ni4mJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH9+foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmHh4WFh4WFhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4OEhIWEhIOEg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX6Afn5+foB9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn19f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKDgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4J/f4OCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYGEhIWEhISBg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICBgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9+f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgYB/fn+Bfn+AgoKAgYOChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAe4B+gIB/gYGAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDg4ODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgIB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH17fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHt8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgYGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGEg4OEgYGDgYKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGCgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDg4OEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhIWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgoKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhISGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG52goGBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WFhISFh4aEhIWGhYV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aIhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4KAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaFhYeFhYeFhoWGhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn18fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYOCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WEgICDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoaGhYOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7enp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTV1dTU1NTU1dXV1dXV1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXU1NTU1dXV1dXV1dbX19fX19fX19bW1tbW1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dPT09PT09PT09TU1NXJu729vb29vb29vb29vL/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E9PkA3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oip8/T0tLS0tLS0tLS0tLUv6iqqqqqqqqqqqqqqqiw0tLS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSko6jP09LS0tLS0tLS0tLS1MGpq6urq6urq6urq6uqsdHS0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7PDw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsz9PS0tLS0tLS09PT09XCra+vr6+vr6+vr6+vrrbS0tLS0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tTV1dXV1dXV1dTT09PU09LS0tLS0tLS0tLS09PS1dTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M7R1NTTzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXU1NTU1NTW1dbW1tbW1tbW1tfW1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXUrYODlc/SpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPTo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayVw5u8uJm0s5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpp+ojoCNxZ2YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PD06Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZqMo4ms1rqYop2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmbi6utm6WymZavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGaoKWknJankJqEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKDVpLSrn3+gqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLI18rZwZyAvK2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPucOPoZ+fmaiWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZOTqKuin8Ogq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQT49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQqquNj6zYwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9DWwL/W0tXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbS0tXV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc3Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2ODk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Slpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIFza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYm5qZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6Kkpqempaampqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjntqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo7PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6OjpKKhoJ6bmZmYmZmZmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/OzpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoaGfnpybmpqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56bmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmpmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZmanZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmYm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmJubnJyhnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQlJmZmJWbppabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhIyWi4yKkZyLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZCOloKMfo6SjIiFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32GjZmbkISMe42Kj4p6fX2Gjo2Kho2UkouQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouGiIWEiIiJhH+Cf3p8eomVkZCChWmGhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6JkIt/h42Mi4qHkoqHho2blouRiH9fhoWIjI6LjoqJkI+Oj5SUmJCVnJqdnqiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnaCdk5eaoJmdm6KhlZCbrJGTm5h7WYaPiZGRjpKOi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6qpr6GaoKyKjqGfdlmDmY2YlJigoKGknpuapaekqauvrKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66vqqqrpKGipKmnpqmooqakhYano3Rbc6CZnZifoaKpp6Cioq6sq6qnra+opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKelp6mnqaijp6aZnKSmoqGhoaGlnIKCoaJyY2aZn56Wn5uaoqKgoZ+hoqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fpZKAfp2dcWhfjaKhm5yanKCeoZ+enqCjmZabmKSioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirsKmoqqihn6Cnqa2wsq+so6Kmoa6KfH6lnm9qXISkpaKenaCen6Wiop6fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltaYF9aXFZcaGRuY25qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu5g3d9sqZsaVh+paKjmpycl6KopaGfnqObnaGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eWpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0uHpycbCvZ2ZUgaWen5aVmpekqqamoaSjpKumpZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odWtxaGlpYVlTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW1vLy+vLy+xrq4t7q9tK53bmWst2tgUo2tpaWdl6Skp6ikrqSrq7W1r7Ogp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrapfnVporZ1YFacta6uqqqnrKenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5rY2Jud3V2bmxbYlFWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr63pol+fZWjhG1qqrysr6+0qaqmqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbWZudXFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PJsJaIe4aMkYl5gKG4sJ+asK6spK2wtKeqqaiqrayppqWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3RrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+8u77EvsXIxsbExMS5tMC3tLvFy52CeGZ2hIZ8bHyGpraqmaK3sKawu7WsrqWko6ikoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ4c3lmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GycW/w8DLzc/Kx8TDxMLEvri9yr2JbmFTYn1+aVVncI2zqp2mtLOsssC1s6ypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWtvbnh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczOz8/Mw8fGyMnIx8rOysnHyMe/xsukeV5OSFR3dV5EWWJ5p7fAvr65rLnBurysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGppdG14bF1kW1ZgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzsfMycLCx8HM1dfNy8rOxcm8imtQRT9OcGhYPU5cbJXEzMbGsJm6xLu+tLCwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8S/v77Ey8jKy8m8vMjGydXb1c3JycXJp3ZaTFdFSmhdVj1JVmN7vNDGsJCJucK7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2pkYmptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIycPL2dPIw8LBxqJpTGKVakhhVlhBTVVeaa/WvZN2hby6u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjZGRqY2djW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ytHBvc/TvLS8vb2ubEaAvo9KYFdaRFRfW1+ixqN7aJPDt7u+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmNoamdnaWZpXVZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre1ub+7wtaLur/C2bmhpa+0uHdJg6uOTGhlY0JVc2BXkZ+CbGWoxr+8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeHFtZWVmb2llbGhYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDEc6nLvtzNmo+WorCBTXF+cFd/eHFOVoFlVXh2a2NuwcbFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYm1gXFRJS0pESkJDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC4u7K9vrvEtrW4tbfAvsS8wsTYq3B/vMjU3rKEhY+ZfVVjZlZymYJ+blV0Y1pjYmFchdLHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGludG54Y2diXGNRS1RIRUVDSEM8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm9x8rKw8fJ0pRsca3R0NvUknZ8f3ReYl1OlaWDhIlUXV1cWVlYYarSycfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmBhTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8bTw7q+vMS+t7zAv8nQx8jKysCCbm+jy8vP4LhzamtnYGBXVaihgIOSXlhZVlFVUnnGy8nDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8tru5qtvDvra+wL6+t6KYpq+zwsCjdHJ0mcTHytbXhldVUU9QRVufkXmDiWdaVE9OT1acycvGwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3hzZ3BdW15dWVJFRENNSUFFPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vGtWyrzby1ucC8p3psZ25qcn+Vlm10d5W9v8bB1ahVQkA+QjlaiX1xf39pW1NMTE52t8DBwr6/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f312bHV7cG5pW19fWlNQQUZIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzrF2gLK8tbbBoYVpWl9fTFJbW21ucn2duLfCuL27c0Q1NTk0UnJqanNwZF9XTEtcoMC6ube2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3V2d25xYF9mXVtUSj0/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsqmhHeKoa+0mGhjZlVZYEpKTVBUanOEo6+3vrmztp5oNzA1M0ZdVV5kYmBiXU9MdrS/uLKusry6rru0s6arqK26vrjLwr++rKuwr7O7t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYlteT0hCPz1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Gp4h7do2hlF5TQllUSGJsV1BGSWOLn6qvtrq1tLKtlFAzMTFBUEZRV1hYYGBQXJi5urStpayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZ1hcXVJOTkE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7OQgXmIjmtOSkBoWEJPd4OWbExCV36wtLO1srSvrq13TDAwP0U7RVZXUVhdUXywsrGsrJ6kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c210aWxdW2pUXVxQTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7i1lY2JhHlWRkFSiFdKSlZ2jIBhP1WnuLO0srCxrbC5pHtALT5ae5enopJzVVqVq6yro6egnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVWFjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yu6mYmZVoTUBWem5PSUlMZpp/V0VVr7uxrLOvrqyttbegZmeTqaefmpueoH93nZ6nqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6ajm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXFFoVFBOR1BNTEJPUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Bqqa9ZEVVooNQWUlLYUpYiWNmZoGstaqytK6qqq6wrauwp5yPlpGNlp6goJ+ao6SfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mbpJmXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFVRY01KSEdPUk1KTkc8RUA8MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCsxsDKmk5Cd51uT29LTmJmdXJgX2Z0jbCvrrO1qqarqqKcmJKMj5SVlpeanqKhm5yknpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJSVWBISUpLU1RJUlBMOT9BNjc8NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpcbGiFdSS2aiXml+cnZZUmtjXWlmZWqLtLCwuKymoJudmZSXmZiOjZCUkIqNjZOYopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKqyrqKZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKT09VTFNMQTc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo415VWxydXVtYnVyWFlgX2RpXWBYYqyurK+nn52hn5aQk5ufmpiWkZKem6Gjm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWp3dV1sWlJgSFJVSEZVVkpCTEc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjfm+BbmBkV01bUlhLS1FXUUlST0OXrKqppJ+emJKSk5iXlZSUi4eKjZSdnJ2dnpeemaafoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+np6Wkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnIhhV19mYFZNT0U8Pj9DQz49QlF3qK2pqqWfnZ2io52fnZmbm5OSlJOdnZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6mzraqzta+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3RycWhWXFFGVEhESlBJP0VBNEZIOTU7PjY7PD49PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5N7YF5lX1BFRTpEQEY8Pjk2Tn6qs6ejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeG2IoKOiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMrJw8HGvrq0urq1u7ewtbKqurKuu7e/u7qruK2rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFNNREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdnJl7cmlgVU5EPkpcfXBiQT1cjq6soJmbm56emZeXl5KMjpaXk46NkIuCg4J3cnFtcI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczR0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfGx8XBvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8w8LCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREVQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaGRbU0hEQD9MiqGpmoOgsq2jnpyfmpeWlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fS19LV1tPUyMzGzM3J0s3O083FyMrKwcbLx8nIxr/Ds7PIxMvLy8/Hyr++v73Bx8TMzMjJwMO/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2JTS0lEQj9EVrPSvbKwppycnKCkoZ2alJOVlIl9d3BrZWJocW9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLV1tnW19PX2M7Sys/RzM/QzdPQv8jHysTMzMzOz8XGx7a/yr/SzczQxsnIwMTDyM7N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTQ1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqBZSUBBREBHUXmyrqealJefnJqgoJ6bnJmViXdpY2BfX2BfXl9fXWJsdXRwcG9scnF1ksTIxtTW19fX09bQ1dTa1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0svO0MHGw8jGzs3R0dLJzM3AyszG08/MzsjFysfHyMzK1NTR1c/SzNPCucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaOrZUM4PT5FWIKqqJ+YlZeZmpyfnZicnJJ9cGVjYl9fYV9fYWBfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY19fLyM7Eyc/NyszAysDIys3O0MvQzs7Mzs/Iy9DQy87KwsnHyczLzNLTzdPR0dDQyr3IubCuu7i1qrawrai4rbO+u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPD04Nzg1NTs+QD05PDw4Oz45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramksXpKSEM9WIyhm5WTl5uenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztTLzs7FzsrS0s/Hzs3N1MvO083L19bQzNHUy8zQ0tPKztHU0tXVysDKwsXMwsjJw8zDxcjKys/KzczQztPMxsjPzMjHy8XGwcbKzM3Q0cbQzs3NzM/Fx8G4ub3Dw73DubKyvrG7w8O1qpiloZmWkZWVkouUjZqRlJSPj5SCiYZ5cXJrbWdgYHBoWVhoVkxGTElQUEI7Qz47Njc6ODo6NTc9PUE8Ojw8OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKifrpV4b3N1gpKZjYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNiYF9fYGFhYF9dW11ncnJxcnNwbXJ5pcfTz8vQz9PUysXJycbGv8PGz87HxcfNytLIy87OxtHS0M3M1MrHy87PyMfP0svRz8a6xL/Gyb3Cx8nOxcLIwMfNyMTMyszPyMTE0MjGwsbIxL/Bx8zMzM/CysvIx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsbKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7uto7Z9aIOEpauTjY2Wj4WDg4OBfYSEfnNgW15eXmBeYGNkY19cXV5fYGBfW1pcYGtycm9va2xvcH250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jLycjKyMHFzMbIy83JxMLKycHCzNDFy8i/ucG7xsi+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xr28wMPFzMXFvMDKwsXH0sXAyb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3dydGZpWmFubFpcWFJETEZCR0RMREZTQDU0MzM0Pz0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sa+1bF96fqSQipKWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgW1xdXV9eYFtZWlxib3Jva2lscG9zj8e9ycXMwMbCsLa6srKzsrHCvLy8urjBwcHFvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7u8bDv7zBzcPGvr61wb3Dur3Gu8O6s7zFxMLCt7+1tr6/u8zDvLW6yLq/vsvEwcbCxcnGycbQxsLMx7LHycPOzMHFw8C9s7ewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NXXllKRkpGSEpBRUJFSUA5OjY0ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys/FycXHwbnFvautpV9ldYaTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNhYWRlYl1cW1xeXF5dWltcXmhzcW1nZ25wcnmdvczAw7rAuK6wsaeqraynuLS3tLOztLu1vrK3sLWvsrzCvMHEvMC7tbK6vsC4x7m0u7bBwry4vcbBw7u1r7K2ur+0xLe7tau4vb3AvbG6trC2urPFvLauu7+1t7TFvL7DxcDDxcbIy8XAxsa7x8vAz8nHw8bCw7fDvb22ub7Hv6y1urW3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcXAv7q3ybaqsJlbaXGMj4WIiXp4foaGd3eBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZrbm5yfKTHv7m4tbCrraeeoqmnnquts62qrKm0rrexs6mupqyzvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLGosrO1u7yrrrWmrravu7Kwqrmwrbuuu7i7wMC+ucK/x8PFwLzGwsjKuMXHxb/HxMO6xMbCu8bJzMuzucK9u7OJc3Z2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj49OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXQx83Bw8a/xMTDw8rCycq/wLzCurO0tcOuqbCRW2p/koeOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNhZGNiYF9dWltaWl1aWlpaXGVub2hmZ2lrbnKBrbmwta6lpKenmqCkoZqcpayupKiiq6qtq7Cjpp+qrbW2sb25r7evqK64tLS8uLS8r7i5tbK8wbLArqWpo6uxsrOovaqrqKutrbSzpqitoaSvqbKmp6iupqi3rLGyt7q6vLG8vb6+xL+1wsHHyLe/wMW3xMO/u7/Ewr7EyMzKv7/EwMCph3N0cmppXWFvY1dWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9CO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HKvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairk2VtiIOHi4B7fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWppaulnpuhpZSepZuYkaGjqqOjoKWmp6atoJ2cpKassrC2t6ewrKiqtKu0urG2tq62ubKvurqxtqWgpJ+msaerqLmqpKenqKeyraCnpp+bpKasnp+npKChsa2trLK0s7Swtby2u8HAsrq+w8GyubnDs8G9wLW4vL2+vMLHxMPEv8DEoIN4cGxiZl9rb2BVWV5ITmdPVEhFS0Y8PT89Ojs7ODI1NTM2OTo4Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9tqCelZ2hprq2q7Ozu7PEz8nLwsa4tsfAzL+4ybe7xbizxLizv8CstbyyrKWvs62ho5JpcYaFhoB8eXVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1vh52on5WVmqGWnKOZlo2foaOnnKCgpKWip56bo5ugq7CtsbajqaqqrKyktLmtt7Css7Wus7WusKqfnp+jorKkpqm4raKmpqCorKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2vLy6q7OzubO+tLaysba1v7a+wL3Dwru6vZeEenNsX2VeZGRYVFddSVdcS1BHSUpHQTw/P0A7PzwwNDUzNTo7OTo4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4uL+3ssK0sbu8q7m6saKeqaunl56QbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3GNp5yTlJSbmJuil5aRnKKiqJ6cnaWnoqWcoKGbma+urq6yoKairqunorWxsrKsqK+zp7qzpragop6co6Gto6Kqtaqio6aepaajlpmel5mbnaCal52dnZytoqunpKSmrauztKq1sLOrsrm0r6qvsrKzuLOuqayusriwu7a6vcC4s7GUhXl1Zl5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLMyMa/xbbBwMbOt8DEvbO5ubO/trG5u6yytK+fmqSpn5Saj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGbk5SPlJeXoJeZlZegnqGdlqChqaSfn6mdm5urp6+wq5ujpLiqoaCuqLaqp6etsaS4sKS3oKKbmZmqpqGarLivoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK6otKuqp62zsKWrrrOxsLCur6eoqLKtsbSwvLS6uK6jlIF5dWReYVZZWFNSVEtNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2nqKOqu8C9wLmutLjBzMfFwsO9xbjIy7LBwsGtvLu1u7y1ubmwr7CqnJmhqJSRiouAgHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjY2JjYmNkZmmBlpOVi5KUlJyZnZaWnKCcn5agn6empKann52gpqCqr6afoqS3qKGhoqi0oqWopbClsa6stJ6hnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJOXl5iXnqecp6GimqSlpaukpbCnpaOrq62mqa6vrquoqqqzpqasr7Sxr7y1sa+voJJ6d3JlYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxce2xcSywr/Fq7e3vba9urq1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVNVUlVgYF9gYV9hYWJlaoCTk4mQjpSTlJ2VlpekmaCXnaCloq2mpaWjpKOcqqulmp+lsaqgoZ6lq56oop6trKmprq2ioqKVmKObnJCrqbCcoKKfnpeZk4qekY2Sk5aQmJiUnKGjnaShopWgoqSmm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5uq+qrJ6McnFvYFtXVlZSR1FPSFpbT1JJVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTU3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb7DyKyxuMG1u8C7tLSqrKaVmpuciIByiIN7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eX19fYmRtjo+EkYePkI6ak5WSnJujnJuhqKmrqKynqaakmaWvpZWZpa+qoJyZm6Cer5mcq7Ogpaafo6ShlJOblpaSqaqtmpygoaCblJCMmY6MkIyRjZaVkJ2ioKOdnKOVm6CjoZeiqKOiqKugq7Ckrbelo6Sira2qqKuvs7ezvrWzq6+YhXRzaFtZWVNVUkVYTFFbWE1UTlBMUFFJTklCPT8/QT89NzU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9u7O1pamglpeYl4d6dIB2d25taG1tbXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH6MgYt/i4+Jko2XkZeZoqCboKyqpq+sqLClqZqfraCVlqSpqJ2YkI+anq6XmKiqmZ+dlKWhnpKRkpGTlaeqpZqZmZ6elo2Mi5OGiY2Dj4uSlZGgnqGkmJWflZqhop6Um6Wlp6iooLGxprG8p5+irLWrrqewtbC4tcCxrbGrkX5yc2JWVFVOUkpHVlBSUUxMV01KTE5SR01LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NzYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA5f7OspbG3qqWisaudqqepsrGktsa0ubqzysW5usHL0Mqxtri7vcHDsa+xt620s7uztKKjnJ2Xl5SDf3drZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/dYiMhpCKl4mUk5ibmZ6pm6CrpqasnqiaoKack4+fo5uXl4WEkpujkJWjnZaWloiim5uUi46KkJqkp5yVlZebkZKHlI6LgYuNgJCKkpKSoJqgopaUmJmVoqaZjZmkpqimoaC0sqeyt6Gcoresqq6ksrKmtby1rKuxo4l5c21dTlFRTE9DTU5OUEtGTk5KSk1OUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKSnpKqloKimpbOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq26r66fmZqdlZSHe4NuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW9zdnCEiIKIgJGEjoqUkZSeoY+bnKOipJill6KclY2HmZqMdI2Dfo6XloaRmpCUjo57mY+djIKJf4mYn6OekJOYloWNgpR+fnSKjnqQh5OQkJ2bmpqSlpCdjqOjjomaoKGjpJuitK+sr62fmKW4pqaxobCunLC7qqmvqpmDd3NjVk1ST1BOQ1NOTFFMQlBRSElNUk1ISkpESkxGSko9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWnpqezp6W0wbiwtLDJxLe5wc7GvbOsusGrrcOtp6Gmkp2mtqyjoI+VlpKPfnh+ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVZZW11pbHJsf4V8dE5Yco+Cl4aNnZeLlJGfmJ2VlJaVj5aJgJOKXztXb3yMlImAjJKMkIaGc4qFl4F5gXuGk52Tg5WOkZCDhn2TeHFwhY19iYGRjY+XmpmTi5CJnYifmIiHlp6aoaCXp66pramonpats6KmrZmsq5ios6KpraOTfnJuYFtOU1JXTERUSlBMTEZOT0lFTFFNS09KSUxQRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepqKOqsKintMG5sLWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm7GimpiGlI+Lh31zdV1QTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFFCQH+VkpF9iZWNhIqNm46WlYmSiIaVhnmJf2BKUW54i5KEfYSNioV/f25+f5R4dXZ4hI2Zb1GNiIqGe354lHZnd4aIfYqJlYuNkZKXjISKiJWEmoyChJKalp6dlKSjqKmlpJ6asKuhpKSRpqqWoqqcoqaoiXVtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+hr6GnqKWnqLCtqra8tre3s8G7tqe6yLi2qKi1tqqyvKaelY1/iZOolpWKfo6Dgn14cG5YTUtNTU5LTVFXW1xaWFpVVVZWVldZWVhYWVlYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1KRERESU5PaFlOUVNUVVpug3N2fmppXFWPiZSJdH+GgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gHZycpJ3aHWEhISFe5WJiIqNi4B/hIuMgJSDfICPmJSclpGenamen6CdoKmlnp2YjKekk6Gglp6fpIByaGFcXUpXUFJHSlhST0pMTVJKSkpMUElMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlraywsqq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGNlICOnI6Rf3aGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmd42XmI2PfWh5gXZ4gImQfYSYkoFyh498d3tva36tfHOQin97hpKBfX90ZnZ8hmxvaHN9iYyIgGx5cX1xbXaPcWhxgX6OcEOLhIKDhX93d3qLhX2Me3V+jpKPmIqSmpujlpmdmp2eoZyWjYqkm46el46WmJB3b21lYlpYWFVRSlNVVE9QTlBWS05LTk9KUU5IT09MRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mOhZJ5iI6LinVxfG11cGptalhLRkdFQUBDRElMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybIinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnt9fnt2b3RzhYJ5gXlwfI6MipSDlpeYmpCSlZeZl52WjIOJnpGLko2GkJaAb2pub25YVlhUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCjrKqota+urLS/q7zCv6aimZWkl56NhIuUoaGYmJGTi3OOeoCGjIZ0b3RrcWxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX5wbX96i4l2goiGdGyakXRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxf3xocXF8bpOOj3xzfXxxcG52bYJ/d3l1anmJgoiJhJaSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFFaV1lZW01QVVZZWE5JSEVKSkhHQkBGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfp7uvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4J0h4yGenBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eG19bHGDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiYBnZ2JqbnJtcIN1aW9YdXCOm5J3bH96fW1ybnCAenN2bmJ2g36GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2Pe3JwcGxgW1xeXFlYYV9STltaWFdMSEpGSkc+QkFCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ2kp56vlaW1qq6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+FdYKEbJWIiHt0eHhsd253Y2leSlBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx3iIh8foWDf4x+dqKZeX6GgYWZhZucYYaqn52Lg5CNeneIfomIjXOKl5CDel1kcnR6fHeKbWhqYnlvhpCCem6Bd3SEenB0eXdrbmldd4d8h3yHh49/i5KXg42FjIZ9cYR/g311d3t8iXdwc3RlZ19bW15UXGdeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnJ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF/cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkqiHgJiYipt0bXyBhod9jmhnaHh/boWHgoVxhIZHbIB3cnl2aG1rX3d9g4l/iIWLepWdm4mLiJF/enWLdnx4bW93fX90dHJsW11dW2NjWGdmXFVPUFZZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiJGBmpWCoaGYlZuapa2Tmruxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYqQiJBpaG+DgHSMh4SLcYWCd4d/e3aFfW52dWaAlI+GiYmHiIehqqKWiY6Yf3qCiXp5b2dreH56fnJqZF5aWl1qXWFmYFlPS05XUlFIUEpETkdDSkRCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzIwT4NfND87bnVwZniDe4CMgIGRjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2aj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPoZ+TmJKEi4WPmZGWbHB1iYuCloyNj3ePhHFthYGKlpGDhYhyiKGWh5OJjo+WpbWpm42VooOHk4N9f2tqa3yAgYFzYV1jXlpma1xsa15XS0dPUlFOTUxGSVBDRE1GQUNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+l5aalZ6enKegqZaTmJ5nZaSafoSSkXmAkoiQkn2KhJiSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0VOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZyopaKZoZeilZ2fqJ6oq6CorKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlaKamnh6fpSYkqGSlpiBlJ57d5WSq7OIjZeffZSenI6Tlpmkoqa2sJ2RmaiIlo+NgYhsc3J8f3xxaGBcYF5iZ2NgaGdbUkVKS1BPSUpMRkZNQ0hMRkZDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWDhomBgIZ3X2JQNDYwLTEvLC4wMC8vLi4wMDE1PkFBTVFSU1BSU1VSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYaQd5WLo6eqtL24pK6srKeotKuwtrKyrbuxs76cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKOXgaaZjaKqqKSIhZSkoaCqoaSpj5yxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilKSqiJmJkoqVeXp+hX5nYGhcZWJdZGNfZmZfWk9ESUhTT0ZITEZKR0VGSEFLRUNGR0E7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GPg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS4tMz9EQU1VUVJTVVVXVU5bUEdHRTw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqscHHw6qzxbass7+zuL62v7TBtru7pLjGqLbJx7W+ubSoo7StsbGbmZKan4mor6ullHafpJehq7GzmZaqraiutruyuqyvtaKxrLG1vLe1rrWgp6ejqJqpsK2yuri4p5u2qYyljpGTn4Z4goN1WWFkVmVhYWNgYWZfW1RJRERMVVFISUpESUdFQUBASkRCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFjZFd5dXGBlH2Fh5N2hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjYeEgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6Ppa6jsbTDtrjBzMm2u8S9s7PAt7fBtb+wt3Sxs6a6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupq2rp6SYoKyzuqKpsrq0u77Mv8XFvb2zwre6uL+3ure5rKywprCqrb6wvbvCwqyZuqiUro+Xl6uJfYJ8aldiYVdqZWplV1tkWVZTSUdGTFFHQ0dJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVVadmpwf4+EgY6EbnpzeYdiuKGZooiVk5aTlJONkJaSh4d7hoGNloqAhIGKenyLh4Z8ioOBioOVfXh6dWVPXGRHRUw6UWNhW15TRj87SFBEWmNRUVlYWmdZVGBgTVNQRUE/SUpIRUZBQEM8RTZCPkhHSkxTWlRdk6+4tbq4yb+6vcnMu7zBvLe1u7u3vbS6scZhdbKlsZqeqr2qpairqqOisrWhq6iflZafmJ+upaempZ+jlKKmsbSnsrK9tsG908nK08bCxcvBysPAvr2/u7y3tK+4t7bDusW9w8iwnrmqoquOpai2iYF/cl9hYl1XYV9oZlJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPTtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdsbHGQjYWQc2xycnOI1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKf4N/g3h7i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV9uX1hnZVVZVUtEQUtLSEZJSEhHQkk5RD9IS1RUVlxaW5K5wLi9t8bAu7nKyrq3ura4ubK3tbSutraZZHWonK1wXqGtnJigopuknqqllKCfkJSOlpiXqJ+ln56amoSknaylqrCst7C9udTRz9fPyczRzM/OysbAvsLKvcG8wcDExMXKv8jOtKS7sLSvm6u5vJp/emxdYFxZXmFZY2NRXGBTUEtDQkVHRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KQlG9sb3V1h7OsoaGfi5mcmYyNlZGbkoWKin6IhoyQi4l8gYRze4qDhnuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJetpLyIh2dbb2hdWlpUSEtOT0pLUUtUUUhMQUpHS1BfXmJmaWGXt8ewuLO7vbWxxMe1sLmwsLursrGnqresjbannZunmk+anYyOoJaRppillYqTk4mQiY+RkZ6boZealZaHnpqmm6yvqK+ns7TU1NTW0svP1NXO08/NxcLJ0L/KycrJ0cfMzcLQ0riww7zEuaW2usSigm9jXFxeWGFYWWVaUV1XT09CQkhFQkk7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmIJocW95eYOgqp6ml4ybm5eLjpWRmo59iYuEjoqKi5CHfISCcH+HgYZ7h3KDkYuPfnF4dWtxeH5xe214c2xpgXBtY2lucHhpd3x+y7/C36dtY3huY1thYEpQUlVOWV5QXl1NUE5UUVVUXG5udoJyl624rLOnsLaqrLzAsau1pqS4pquuoau0o46xrpqYmIyRk5GEjpuBjaeSnImDi4SKiYSLg5OVmJeTm5GcmJmZnp6rrKSnoaytz9LV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbFwM7Hx8OovrfQnnpvZl1iXVdgU11bT1BUUE5IPkFGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bHdwfX5/oZ6eoYuNmZOTjIyTj5aFeYWPkI2LioiRh3+Ce3J+gIGHeYR1hZKRiX9vdnJrc3x7d3xzgXdxa4BzcmhvcXp5cnu+y5t+jLKDdnKEdmhhal1DWlpbV2ZkWGVrU1hdXWBkXmN4e36LgZmqpKShn6CopaqwuKqltKOhraGjraKnsZ+JppqUkpGJkY6IgZSJa5WijZmEgIV9kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMjOz8jCy9HU0dTTztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMTDy4tzb2NgX1hUWlNcUEpHSUpKQDs6O0VCRDxCQz5IQj5CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3iEk5mKjYiIi4l+gnhze32Dh3d/eoeRloCDbnhwbXV/dnh+dIV8eW2HdnRufXaEdXl7nbaMPEGLxqV+jXxpZVZJQ2ZjZWNoamRveFtfZmlrbmlugIOJkYudnqCdkJeYn6OkprKkpLOgoaWdoKmgorGchp6SkpKQi46LhoOQhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipqRqrOYmpunnKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1b/LzLR4dm9lXVlSVlFaVkZHSklFRT06NzlAQUI5R0RARUNBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqBh3x4hZaWiI+Dh4WHeoR4cXp7hIZ1eoWOjZx6jHB8b296f3F8gXGDh4Bujnp1d318gnV/fIeIsHRZqcK2jJKCcG5iPV5ocnBxcG54d4FlaW9ydXhyeouHjpSSm5WglYeMk5ugm5+qn6CtnKGamZ+lnp+smYuajJGRjYR9iIeDhYuOn5mTiISHfm2ZeYSYhoiTjI6UjIZ7m4iTj66qlJWXnpinrrW9qa29xsvIyczLz8jD0crU1tjX2NfV29fT2dvW0Nva0dbJ1MuVeXtpaVtaUFJUXkhCRUlJPkE9PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEfoN8fISXjoeLfoaGgHeCeW57e4aBdXqSno2gdo91gnR1gX10gIRvgY+Bb5KEdHyBhXp2hnuJt8alwsm3gZabj3dwZU5mY4F6gXeGopCLeHl3e4N/fIR1bpOWlJWPmJCDio+WmpeXpZyXoJefk5KXo52Zq5WQkIqNkYKMhYmIgYWQkZ6cmYmFi4GGmHqJiJ+Xj4iOioyCfKGJkIu8oZiTl5qcqaalrp+otb7AwLnHyc3Oxc3J0dbW1dnV19vU19na29fb2tnYztzGhnp6aGlkYFRXVlVNSkRORDs9PDw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eot8foB+f3yFe36BkYmEhXqEiHt1fXRtfH2GfnN+kp2RnoOSfIZ+eI59eYqKboKagHSYhX6BiYV8fpB6j6mPkMOgvIyco5x9iYR9iXOMin5zppqcmJSFe4+QiYRoR3CgpJ2Mi5CShYmLkJKVj5yakpSRl42MlZ+dlKGUkY2NkIt+kI6Oi4SIkpWan5+JjJSSnpGCi3+lmYiEjoOGhIClhoqLuJidkZWWoqehnZ6do662urWrv8bK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h4eGxqZFdgW1RQTkdDTEI9PT45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97iHt8e4uHgn51g4Z5c3pzbYB+hH13hZuhm52UkoCLiH+Yh4Cckm6HqIV6oIt8kY6DiIScfpqRio2jop+QpK6gi5GLhYuBkoZXcq2Ln6ubj4OYm5CQjluCopGCjJ+TlYyHiIySk4yUlJSPjI+KiJabnY+VlpGLkpSGgIuIko2JipyWmaKihpKdlqGLioiNnJCDiI+Ag4eFpIaMkLOYnZKUl6GhnpmSnJ6nsbispbzCx83Hxs/M0MzO18/R1K7W1dja2Nra19bZ2p9vfHVoZ1xdWFNXWENASUQ+Pj46NDk6Ozc6OzozOzs/PD43Ozk6MTlHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDb213i3h5f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9f5Kmo5+lopaJnY+Ul4uKqJdyirGMhKeRhJmThZmLopagmJOJm52hkqmvn5GUkI2NiJWLbo23hZrEyLKcoaWbnJiWkLKQZKTNx5aPhYeJkJKOjZOUiYWKioaWmpuPkJSThpSXhH+Pi5mIjZCql5ejo4iZnpabiY+Hl5eKhI6NgX+Hj6WJjZOpmpeTlpmhmZ+Zk52bo7O0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oY19dXk5KVFpCQUdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj46RU1GSFJXU1JCY4FGdYKPfXxtfoh4en56gYGDfnZ2gIN8bG6Lf3l8eHh8hIeLfYqjs6ejqrKhlqefpaSWla6ig5C4lZKzmY2hoIylm6+jpJ2YkKeWp5mtr6SXlJaUkIuYmZagwI6kybirm6KmrZiRmpyynYaFqKKcmIWIiY6VjYuTjoiBhoeIk5iUjIuTk4aUmIaEkZCcdJGZspaXpKGInJmTj4qQi5eaiYqWjoZ9jJieiZCQnJqZk5iYoJSgnZWfm6GxrqKkt760xcfEvcPDv8bNysnSp87N09LQ1tjT0Ni7cnl2XGBVX1dQSElORUJDRTY+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1NjY9OkpGREdOW1xZSWZgO0iEi3p6bYWGenyEeICFgX5weHx9fG9yjXp9gXt4houJhYOSp7utqLK9r6Wts7Ooo6KwrIqatZ2juKSVraSWqa23pqSjn5mpmKmjr7CqmpiclJWRl5+Xmbu7rcmgaba4q7CUmJ6jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHkpaLj5WNi4yXmJKdmbSWlauei5uUko2QkoyZm4qSnpCLiZWgoY2UjZianZOcmZ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8fC0aHGyc3NxNfW0cvToXB6aF1ZU15ST0ZEPjxDQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBicElAi4p+gXOGh32BiHWCioN/bX19fH9wd4Z3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7aMqLKurryqm7ukqK25uKumpqKho6Oor7Kxq52cpJibmJeeoqWlkaO5rqi/vKytsrmlo6d9iIacrb2wg4uMi5CDj4ORj3qBh5CMjpyIh4+XjYuVl5SRmpadp5qxmpGsnY6aj5KOlZCQlpeOkaCRiZWbo6yUlo+UnJ6UoJ6bmKChlZqep6ekoqSwsqbBx8OwsLq2xcTCvs2nx8PHw7zV0c3Eyoh0c2JcWmBbTUpCTEBFRz9BP0I7OjQ+QTw9NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uGg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlae0xsm/wszBw7nHvLqvq7m7l7K2urLArqXApKuvu7yqrauiop2nqq60sKqbn6qboZuVn7C0p4uiurm1wburqZyypaSolIWNqcPEpIKLj4eIhIaVlI16g4yRjpGhjIyUkY+Jl5+Xk5mVl6agrp2MqpyOlo+SkZWVjpCVkY+hlIaXn6CynpSalKChmaSfmqCcoJSYnqakpqekr62lwMTDrqi3tcnDvrbOssS+xLyz0crIwrV0eW1cWFxqU01IRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk1lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoKQeY2hlqiampi6vsjIysHSycrCzL3Bs6y7vqe6v728xLeswamssru9qrCpo6WjrK2zrba1oJ+vnqWimKO0vKmbqLzBo7a2r6uSr6yrrJeGmammpZGCjJOllYmBdYqSeYWNkZCen5OPlIuQjZSjmZeclZSjnqmfkaWajI+PkJWWiH2PlZKSo5uVoKKctaaQnpelpKOlnp6mmJ6Vl5ulo6moorKsqLzAxK+ls7fMwLmuxLO7vsK4rMLDwsCYbXlhWFdcW0tLTUpGRERJQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djZeOnpKJin+Jn5OEd4V/lX9/kIiKkH+VoZqupqOYwr3Iw8fF083Ozcu7wrevur20vMq8w8G1tryts7+5vK6vqKCop7atramxt5qeraKnoZ2rt7eppa++w7G9ubOnqrSzra6WlqSrp6CRjpKxxaeVjnyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuNkI+eiFqQl5eSlqWZZZijnrKllqKWrK2rp5ufppeYlpmVoaSppp+2q6m6vMS1pbS2y8G4qbassrq4rqi4ur24g2xuWldUVU5GSlNOSz9CSEVESEdHOTVGTTs+Nz5BSi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZCDh6aTiIGHgpyEg5WQkJSOmqKfr76uoca9xcTGxs7OztLKvru2sbq7vL7OtsS9t7m3srK1s7izrKacq6u4qqinr7CXo66kp6SktMCwqqyzvsK5wLmzp7i0uLKulaSsrq6ki5OVoY10wZp9lpmEjpaai7GVmpmVkpOZmaajlZ+blpqonJyhoJqLjZCWnWBKlpyalZqlllSWsJ+vnJ+llK+vrKaaoaaUk5mZjp2gp6KZtKmqs7y8u6uwssfAuKWrq62xsaOhsrK0pHFuZlxaTlBLRFBQUFE7R0pJR0hCQz45S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkiql5mgoqivmZGXh4unlo6IkoWfh4Sdl46eoJqjpLXItKnGusPDx8rIyMzNxr66sq65uMDBzbbIusG5trqxr66ytKejm6qztKqopq2smaSupaSorLq/qKu2tr7Bv764srLDsbm9rKOutKy4pYibl6abdr6ghJicjpOZmouul6Gcm5eVm5+hqZ6ooJmaqZmip56YkI2RnYNudpKimpWdop6QrbKjq5WoqpirrqWkn6Wpk5KZnIiVnKKel7Gmqau6tr6zsq29ubago6eopaecnKypqYxjZWFfUktNR0hOSVVMPU1ETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5ScoZ+7r5mUnoyTqpuRkpOJq42Hop6MpK2Uo6O2xr20wbrCwsfIxcHNyMG9ubKvubTAwsq1xrHBvLW6q6itrLCjopmqtLqmqaarqp2or6ejqqq9vKesvLO3vca8t7W4wLC9wLOotLarvqWPopeRop+8n4mZoJmWnp2Pt5+pnKWjm5yhmqils6GbnaWcqKqemZWPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6yenqSjqZGVlaCDkJ6fnJappKKhtLW7ta2otbKznpyipZqXlZmqoZ53YV1gXUpJRkhNUUlNRUZHQlJMSUFFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+fw6ybl6SXmamclpuaj6qWlqemla2tmaGrtsTCu763wcLAx8O9zce7vbmyr7izv8PItb+vvLa6t6ajqqytoKCaqqrEoqWoq6aeq6+soqmovrimrb2wt7bHtrW5uL+wvsG2tLK0r72jlqOWk5uUrp+QoaKlo6OfkL2lqZ2prJ2doZumn72imaOeoqmroZ2WjZWek56Hj4SNk56koJ21rKaclbKnmbCnn5qqnqCNmZWfhI6hmpuTpaSamKyxtrKqpaqtrJyYoKCSjpCWqZ+UaGNaYl1OSUhLT0xIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV02imqOcnsWsoZ+snZyun5KjnpaloKepq5e2sKKqsrXEwr2/tsDCu8jCvcrItri1tLCztLfBxra+sLi0ubWfpqyqq52dnqWjwaWgqa2gpKmtr6Kmp721pbG8t7a1w7Kzt7q+scPAt7ets7S1opyklZGToK2gmKGdqKmroprDramerK2bm56ZpqC9oZ2kmKurrKahmY2an5KeiY5Xf5aepaGguKqnk5i2o5+zoaCbr5eejpmUnYKPn5eWjqKklZClrrKrqaKipqWVlZyYi4+Rk6SfiWJlW2RgTElKS09GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmZ7Dp6Wis6CcsqeTq6SgpJ+tqaydu7CorLWxx8PBwrPCxL3Gw7zEyryvsbatsLWvv8W1ubGwurWsmqiwqamanaWhp8Ktm6ywnKqirrCppKe9t6a2uryutsOts7PCv7HGs7q2q7S1ramhpZWVlKOroZ6fmqirsK6vu7KmoKmpmZmYk6KkuKChpJKur6ylp5+SoZ6Vno+QjZSdmqKfp7Smp42YtJyjr5qem66RnpSXlJqAkqGWj46foZOLpqywpaeinKGekpKak4WLko2cnoBiZltoZkpJTEpTQkNASUc7O0c/OTlOTVVeUlNKPk9eXT1IUEJMTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugw6ikqrKho7WplbKrp6KksqyuqbuyrLC1tMa/xMS1wMS9yMO2wMjCtau1qLC4rMDEtLeurLa5pZmrsauqmJ+ml627tZuosJutn660saequrKnubO3srjAqreywryzxae+rq23tKmnq6GWlpGlpKKil5ikrritsbW2oJ+opJmVlZOkoLeipKWWrrKypqqmoZ6bmpqWmKienpihnq+yoqaNl66ZpayXmZ6lkZuOk5iahZaflIyQnJ6Ui6mpqqKnoJmeloyOmZCChpaJlJ95ZGlda2pNUE5OVD1DQU5DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlVlXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzukpJ2hpr+mqK+voKm1qp25r6ujqrS3sbC5t6+2uLjFvcPHvbzDwcbAucHGwbqqtqStu63Bw7i4qq2yu6KVrbCtspalp5Cquaqgp7CdqqCwtLKqqba1rLussrK5t6y5sMK6vb6mwqqwt6+pqqumnZiYqqGhoJGYoLCvs6uwuZqbqaCZlpKXpqG3qaWioq+xtKuyqKufm6Cgm56lm6GXnaOzsJqfkJOlmqGpmpWin5aYiZSYk5aXnZOIkJuZlI+pqKefo5uXm5OHjpmLfo2WhY+ba2ltYWxuV1BSWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aZF5OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oaqwqqOxuKmltLOroa21va+zuLy6vba2wMK/ycS4xMK/wLjEvsG3r7Woq7eyvL+/tamusbefl6utqK2Wp6iOp7ufpa2znquisbCzrKm2s7W9ra+xtaywtbHAusS2q7yvsbirrKmisaWepKmfo5eQmZ+yqrOpqrOZnaebmpWNoKaktK6noaysrbGns62yqaOcn6ijnZOgmJuotamXmZKSn5mfoZ6QrJ+YmIaVmIudmp2Tio2Wl5qXpqWjoJ2WlZeUgY+UhXuPkoOMlmZscmdwcl9HWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJgUEtNTlhXWFBKVlZXTT1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSZoKSst6SsqaWurrapr7O5pqawt8W3sbe+wcK1tLrFvszFuMK/ur+6xLjBubK1rKq6t7q6vrSqrrC1mJinq6qrm6yrj6u8nayusaOqn7Cts66utrG5t6mtrrGnta+zu7zJsqq1tLG0r66moLOfmqitoKWVlZqZsaOtn6WvlqGkmZmSjaKlp7Kpoaaxq6m1pa+xta+jmZ2tp5qXnpmZrLijl5OQj5icoZiXlKyfnZSBk5mNnZ2alpCKk5KemqWhoaCZlpKTlnuLkIZ7jIqDi5JrbnhudnxhRmFqWUlIWVs9e0pHRTZBYlRpWk1cYUpbXVpSUlJiYExLRV9hYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENeUVwuKkIvSkdQW0gzY1lVS0SZlqCwqLGprKWjrq61qbe0uKOrtLfJu7S7u7++tLS3w8HNx7vDvLa+v8C4v7yxva6nurm3t8G2q62xuJSXpq6rp6OyqZSvu6StsrGnp6Kys7CysLSxuLOprquyp7ivtbPDxbaotLWrsK2pp6K2n56msaCklJuZlLGep5ufqY2pop2blZelpaW3p6Kxs6unsaiusLWspJmgrKibm5yblKm4nJSOjouZnKKYkJemoZ+WhJKWkJ2cmJaWiJaPl5unnKOgkpaRkZd2hJCHe4WBhI2MbnF3dnx/XUxlbFxLTmNcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1PT0hhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydGYUxWJS1CLj1FTVE8M3JrSkRDkJmlrqStraunpLCys6q3sLafq7W5ybmuwbzCt7OytcLDz8S/wb20vcC/ur+8s8Soqbmwtra/vK+ss7KcoKewraWmsKWesrWtq7KwrKmotLmstLK1rbSsqauorKm5rbGwx763pLmvqa2tpaitsKWjo66jqZydnJqvmaKjoqOQrJ6jn5+hqqWmuaWrtLSkqauprK+2rqKdo6iqm5+ZmpKktJqPiY2HkaKglo2UnqCUk4WOlJKdm5iWlYeXkpWZppufn42SkY6Rd36OhXx8fYeKinJ0cn59flxTZG9eTlpmXUZElltIO05tWGFbTWBhTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGRISis6ST8zQklTLD6Paz1ISI+bqqqiqa+kqKOytLG0tbGxoautvMu6rsC7x7G0rbTCw9HFxb7Asr7Bwry/t7zEp623rLO4vMCwq7KtoKSnramopLCjqrGqr6ywrq+tq7O6prawsqmyqaumpaOtuqyqscK5tKu5qKioramosaWppKKuqqiinpuirJWknZeemKudoaepoaylo62st7GxoKiioKuusKydn6eoqZmkmJmPoKeYhoOOiYufoY+LjJacj4+Gh5CVoJ2WmJWHlpOTl6ScnZyLkY+Oin9/iIZ8d3+HhYd0c3KJdmxfWWBuY1FzcVxLO4R8Rj5XdVhgWU5jXE1VVlVXUFxiXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLklnREY4PEIwNUVLWDFAlFs/TUaVmK2noqqynKmor7asuLWuqqWrqr3Ju7C+uMOvsa2zxMPOzsO+v7TAw8S6wLTJxKyvt66yucC/tK6uq6WnqrCpp6ixpbStq7CurbGvs6yzuqS4s6ysrqeroKKesLerqq26tqS1taSpp6ysqq2hqKamsbKkpqWhoauWqaCTmqCmnqSiqqSsop+nsbesrKKkopupqq2pnKKlpKSYoJmWj5idk4GCj4iFnKCMio6MmY+Qi4SNmKSbkpGbjJOSkZSimZuZio6Li3yGgYKDenSAhIJ+dHeMpId5a15gbmdXZYdkTkBnkkxEYnlXYlhSZVVNVlVVVE9cXWFVS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIZASEhEl5KvpKOqsJeqqKy1q7axq6Srqqm8wMC4ubO8taazr8TJy9G/wbu5wL/DucG6wcSusbWys7vBvrOxrqyrq6i2qqWtr6u5r6ixsa6xq7WqtrWntLarrKSpqp2jnbOzqKiktLSgta2hqairqaynoKusqLm2qaqpqaGpn62bkaihnaCkoqaiqZ2cprSup6WpoqOYpKamqZyipKOfmZifkY6PmY5+h4uGhJ6eiIWLi46OkI2EhpWjmo6Nm5GSkY+Sn5eYloyKg390hoF/f3h1g397eH+BiJ2Pb3FnZ3F4XGBziGpPXZhWSG14VWRWUWJPTFVUVVBPWFtiVUhQalRWVEdQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJRYzAyP2Y9Tlg/Qyw+TFRfL0prNlBFO5WOsKClqq2Zq6SsrrO0rqqlr6mpur67wLGvuK6itrDJx8jQwL69u7zCvbrDwcC/rrKysrW9vMKysrOqs6iktaikrLOzua+jrraxr7G5qriuqq62rKueqqyfo6C2raihnq+zobSqnqinqqSqoaGsrai9r6yurKGnp5+rmI+vopiioKinnqebmaqwqaOfrKKhk6Kio6aYmamll5eYnY+Kh5WIfY2GhISkloWCgouGjo6RhIWUoJeIkZ2Qk5CNkZyUlo+KhYV4dIF/fXV4eYB7dHN6aYKHo3VpXmVsgnVniIx9UlhwXkp4c1NkU1FeTU1SWWZOTFZZZVlGU2lSUj9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTGg6NDhfPWFkP0YxQ1BbWytITzpWQjSQj7GgpKaro6akrKa0s7Cpo7Cnqri+wLywqLmqp66wycbI0cK9v765vr+8ybzCubCwtLG6u7nBs7S7rLiso7Wmpquxtrmyp6e6ta21vK+8pa2ttautnKmvo5+lrKqnnJ6qs6SzqJqqp6mkqZ2jqaipvay0r66dqaOgrpuasqOVpJukpZ+kmpqoq6Wem6qhm5KboKSdmJapqZGYmZOQioKPhX2PgoCIno+Gf32LhpCPkISAk5uUhZOijJSSi5GakZSHiX5/cXp5fnxpd3x6dXFxfWiGeISHZGBoY3KFem1neV1eVkJXem1UYVBSWUtLTnF0XUhaW2dZRVVmUEQ+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtFWj8qj5OxmZ+fqKWkoaukt7KypKiwp6y4wb21sKO5rKiosMPJyczBtr2/tbe/usi2w7W0s7Wxvbi6vretubW/raGzpqmqr7W4tKqeu7uosr+yuqCvtLaprJ+usKKcpaipop6cpLGmr6Cfqqmooqqbo6igrbyorrCuoauio66enqyml56aoaOcn5uao6qimpqkpJWWlJ+hlpuWpqyLnpGQkYyCi4B/joF7mpSNiXx+i4WOj4yJhZKYkYeUo4mSkoeQmY+TgYh8eWt9dnl4Ynt6cXBxc3hpgXNqg2dkaGFvc45tYmpwYHBBXHhrVl5OUFFKSk1TWVZNXV5tV0RYYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBCaFkxM1M9ZV9ETDZLV2VPKTwzUFs9I5KYrJmfl6ekop+opLivrqKvr6mruMK6sq2fuK+rqLS6x8vHv7fBvq+0vrfEtsOxrrmyssC1u764qbm3vauktaenqbCtubCpmrq8pK6/tLShrre1p6ensLOgn6Smp6ClmZ6tp6ieoKmup6Cml6Opn7C4n6Sxr6Groaykm6amqZqam56jlZycmp2pppabn6iSmJOYnZOZlaGqkJqJjZCHfYd+go18fKGMjIh5g4yEiYyNhIeTmo6JlZ+JkZWCi5aMkH2Ee3NvfXFzdGB5eGlvcHFvan9yZHpsaWZkYWaGgGBbc2pyTU1/aVhaTVBMSkhQUlBJTlxfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpoSCo/MFpZNSiWnaWYnJatoJ+hpKG3q7CjtLSpqLnFtrKuoLesraywtcbIwLe/wbmwtL23v7u/r6u9sLS/sb3Duqm7urenqLaopqqwrLOwppq8t6Sru7Wun7C4r6mmp6+xm6GkoKOjoZacr6ahn6Knr6KgopOjpaK3sKGmsaufrKKumJyqpKiel5qdpJOanJqdpqqZnJyklZWXlZyOk5eiqaGQiYqPhXqEfYSKeY6Xio2GeYKHhIiMjoSMk5mMjpaZio+WfoaXi496gHpwcndvb3RfeHdkbGxsammEbmZzaWtmaV1kc4FgW2t1aVpJfV5bWE9PS0hHUlVGMjleXm1QRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbDg0R0FmW0hURFVdaEUuPDJiVSwylqOhl5Sbqp2koaKgt6quoLq4pqy9xbOwr6O1sK2tr7XExLyzv7q3sLO5uLq4uq6tv7O0uK+/wbisvbq1pqKzqqaosqutsaGbwLWkp7W1qJ6yvKqopqmvrJmjp5yjppSYorKkmZ+kqKmcoqCTpKCkuKikp66mnqWgqJKfqKKhoJibnaCSmpuWoKGqm5uZoZSRlJaZjZSSo6ikkImKjoV5hHuEhn2djYqKhnmAhIiIiJGElJOTjJCVlI2OlHuDl46Ld357bHRybGxzYXh0aGhqZ2ZvhWdoaWNmaWpgaWJqZ1tle2NgU3NUW1tTS0pHSU9TQCEqaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc5ZU8nMp6jo5GOo6ebnZ6do7Wtpqq5t6esw8G2sKyjta6nrq+3wMC8ssG2sa6ytra4t7asqb2zr7Kxvb+4rru8saWftqulpLSpq66fnsKrqKWwsqmstLueqaqrsaWYnqqdpqSRmaatopiepKmhnKKdl6Cdp7amr6qvoaCdnaGUoKWfoaCZm5mckpmdlKWdrKKYlp2Uk42Vl4uPmJqooJGIiYuIeYV3goKBnIiLgol8f4SIhoWRg5WVj46QkZGRjZJ7g5WNhXN9fWZ4b2tqbGd1c2tjZ2RkdYBiZWZmZWpqZGtxWl5ZXW1kYU5oV1pgVkpHSUtNUlg+OV9saUhCVFNcW0lIRkVBLjw/OUE4OVJHQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFlKVmJmQTozQWdIJTWao56Qi6yhmJiglqWzsaKxvbehsca7ubGxpLarq66pub27u67Asq+urbavs7izqKu5sa+ttLa6trC5vq2mnrWroKCwpauunqTCoLKjrrCut621nq2vrK2imZynqaSelZuopZ+ZpaOonZqgm5Scna2wprmorqKgmpqemZ6jmqSdl56Ym5SaoJKolqqnmpOampGLlZmNlJSZqaeOjYqJj3yCdIKBipiFh3yJiYSEioyIkoSTnJKSj5CRlo6Qf4CMjYJwgH9meW5oa2pncXJrXGhjY3OBYWZoam5sZ2tqZ21cbGx1cWFUYmhkZVpJRkxNT1hRUVZhZYFUQFZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUplQyc0kqCajo6wnZqToZmpsrCfuMC2oLTCu725saa2sKiupLe4t7etu6+tqqu3qrS5rqWztbGuqbG3trGztbqnqZ+2qZ2eqaOqrZypwJmto66vtbWtrZ+xra+popuco6uom5Wcp6OdmqmipJaaoJyQm6Orqqm7n6ikn5eamZ6hj2uilpiccYKWm6SAdZKpp56UlJ6QiJeZgJaKoZB4hpSMg25qfneDcWyGi4Z9hIuGb15jYGeEl4Zri5CUk3V3i4R+g49/Z4aAaHVpZldcaHNuTlBqY2dyhGdfZGZubGpeYGCKkISGZ09LRDhGVGdeSkdRUFVVS0hTYW90ZUZbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFRZD0rL4yjmYeUsJuck6Gbqq2ro73Fr6m3wri9va2ntrClq6S4s7KzsbmtqqestKawtaOouLa1qKest7OutK2zo6qftKueoaScp6eZrLuVpqWvsretrqWorquspaGfnKCnppuXoaWlm5unp52Tnp+YkJ6oqqO1r6Ojo5uWl5iXo4ihjpKah6GHlJ2hf6V/pqqekpGakYiDcniNjoWIoXaJjWmXiGZ9c3ihb4iHhH6NfH+hoJ+ZgHuHnnSIjnabimyHgYNsaGVjemxxYlSGbWNsaZhxWGpwb4dYXmlba2tbiHFuenKGaIeEWl5GTT9HX01GUlZWUVFSV1RnXk1YSlJST0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiMppeDnKudmZmdn6qqp6m/w66xury3wL+qpbewqaymsrWur7O2q6mlsa2ltbOcrbW2tKanqbOxrbKor5+robKpoKOjmqKjnK61laSkpba8pqynqqqsqKWhoJigpqOZmaajpJicpKmWlKKclJOkpaagtqOjoKOYlJKXk5uIro+YlImpi5eim4WxgKOsnZOZnZR5gtSof4eVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGWvJzFe3K2p7qQeoFslrGrsHloa1ixrm5labySvG5oem5yj9h+U2pitrJ/gXKUdZqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQFxEUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaTgaapn5ecnqWtsqiwwr2ytcC1t7/Cq6azrKypp6+zqq+2s6ioprWmp7ivnbOytqqlpKexrq6xpqqep6SxpKGgnpecoJ6vrZWeoZ+0uqKqqKGtrqWinZqZoaefl5unoJ+YnqenkZynm5SdoaaioK+in5+jlpaSl5GYha9qaoqNqn5nhJWHrWRwnZyTmaWUca6hpH54u31roY92sV9qtFulgGackWBmgnpmf2p4aqllvnJnpox2smp8sXh0kpNjbW2nbVuEoEVoZ4eWRXWcYH1ofKSngllfi6tpgJV4emqnN0qvW1dTbWNbS09YX1xXVjtOiE9XVy9JVFNJREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GilYKsp6Weo6WqsrestL2+sLbEsri7wqepsKuuqamwrqSwuq+kpa6zo6m5qZ6zsrCjpaCqra+ssKann6OisJuim5eVl5qcraaXm6GetLOhq5uira2gnpqWoKGonJiepKCcmaGnpJCdo5qXoJ+rn6amn5qfoZaVkJaQmYW1m7V4hamZtZl3h7Obt36TlZaolH5rgaZ6goaIkpSSd6tna7FbrHuPh5R0iHGPhoCAiJCXeIOCi5eMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinS5Rom5bU2toYExLXGRYXFpCPrB4V1hBI01oRUNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dXN0o5YVU1MBuVn5SIs6amoa6pp7Osqbu2wrC7wq24t8GqrK2urqausqmhr7yqoae0raSrtaWmsrOno6KeqKqyqLCopZ6fn6+Wn5mVlZaYnq2impqjqLSuoamPqaiqm56Vl6Ckp5qenaOfm6CjpaOVm5+Ymp2iqpummZuboqCWkpGTk5yD1ZOZuXCwwn7GhnzWlJu7fJmVpI+NnI2ke46HpIKlgnqseY+dVq97iX6farlauXeGg3ymgpN8mHqqeY2ckHuxbY6EdJC8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiGgIl8Y6QzQp12XVFqaGRQQFhnWmRhSkhNbEtbU09ZZlpDRD9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzIlm6KTmLGoqKW0qqW0qKS8t8GwucCxtrW8s7WnsbCjsLKmn662qJuoua6jr7Ggs7SwoKSen6iqsam0qaScnZ6ql5iXlpeVlqGrnZuWp62wqKOej6yiqJael5uhpaGYoaGioZqioqebnqGelZmbpqCcp5Sbmp+hmI+SlZGdiLJuaLVxq4dvjqZytHNytnuZl6OLjpyNon6RoaV+sHaDkdLRdlyufIZ/pG+bqqZrhoR8rX2XmY97sXOTnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa19saE9VR0k5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGckaWwraSqu62mtKWntru8srq/t7a1urqzpbS0obGxop+ssKSYprqupLGxnbS4qp+mnaKqpbKoraqkmpyaqJ6VlJiYkpKjqKCXkqWrr6ailpOtn6WSlKGbpKaflJqmpqGao5+tmqCenZCWm6GdnKWUnJWZop+VmZaSm4Wse3eodqOOiYepb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9d4R9jp2HmZl3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV53d4domIhrXq93lZ6PeGw1eciusl9BVG9eZ2BFUGxfcG1WVU0uZWNpU1lROkFEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk5ODifnZSguLCXtMGtqLKoqrK6uLS4v7m3sra8taS3s5+0rJ+fqKuflae2q6ixsauutKSbqaCgqKG2p6aqo5melaWhlJObmZKUoqWak5CmrK6moJWZqZ+ij5GimailoJWZpaidnKSerZ2hnaCNlJ6bnaCYmZyVl6Kgk5iRpp2GqX19pXihj46DqnCti4GnhpWfoYiXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtuZU9KQ6FcWkx0XmJmTVphX3J0X0pWNkqak1lIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4wMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMT84oZ2Zmb+rl7TCrqutqaW0sLixtb+5urOxt7ypurSfsKSepaennpSqsamwqbWsq6+hmKGgpqSkuqKjq6CXm5GioJWUnpqUmJ6gj42MqK+vpp2Wm6imn4ySpJenqqeUl6mnnp+go62koZ6hjZWhmZ+gkp2XnJWeoZWWj6ubj65tcrRyqYx2iqZztHhzs4CRpKKRnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZOIrWt1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbXp/fm+Yh3Fcr1Y8nHdmVG9uLlynT2JSa2VhbVliXGFwe2NUWlE+Pm1wM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs8MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam526oZyywK6tq6unt6m4r7XAtbyxr7m4qsC1qaqgm6ajoZ2SqqqotqOyqK6qoJecp6Clq7ido62blpmPpaOVjZ2gm5icn5CTlKu1r6eZlJysqpeMk6WZpKyikZeqsqSgnqersJiho5CZopegm5abl6GTnKqclJGrmYfUkpq7c7DDgMOGftWWm7h4h5CXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gYpumohxbo2kdL1dd31bYXm8a1pWW2p6XmpgZGZibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6hvKKXscOwraqqrLGnua+2xLG6sq67sK7Asaykop6joZybkamkqrKktaatpJ+WmqqZpqy4nKKumJWhkKWgko2co56YnZuQlZKvubGslZejp6eUkZaknKOsnpGgqKufm5+oorOeoqWOp6KUoZqcl5akmI+woJKUqp6FkJm1gJCRjLeVeIKTmrV3bWtuc255j4SOiXSewbu9mnuBsqhwgHSRuIN8hoaLh417ioaNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF5/en2JaIN5bXlii6xwdYV/WVunakRkWVNmYGNdY1BnZnFtdUJOUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPTs8p56goL+llrPDtKyrp6yrqbuusMavtbOut6e0uK2poqGlnqCdmZSrpK2qprWop5+blqCjnqykvqahq5eUnZCim5KPoqiik52Xk5eUsrW2rZido6Sii5KRppulqpuWqKSlnJqhqKWmo6mhkq2fl6Oel5aXnZ6PsKmUm6ehjmp+aZymeIdzfpqPdHplh3q9vsC6b5KCcZWHX3JqWl6aiWFjiI6Va2B/lWNtnHZilGt/mpWUZV5gY3GbimlyjH2GlWdqfnJ0eH19Ylt3dIFoUFxug3x7i2tYbHqCcklKb4VwTXRNRVddZmBMW1hnY15PW211aXFRT0RFTTtISTxMPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqifqKHBo5u0urajraWup6i1sazIrLCzq7WjvrGyp6CiqZ2im5qZrKaupKW1qaWbmJWhm6etqL6nqaaVlJyVoJqTmKWpp5GdkY+XnLCyv6ybp52noomTkamaqKSbm6ugo5mbo6asop+qopqwm5WmoJaVnZ+dl7GlmKGnmJyRnZyjo5mmopqcmpqZj5aBZ219cXeSl5SRhYq1qo2GmJWPioyYl4eUlYqEkpORiY2Rk5iUmJeaoKKanJShnY6CeqWFbGp8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vjd312a3B7bWBjXXBnTVlZZWpfV1pwem5tZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzoLOiv6KksbK3oKqlsqelsLWqyautsaW1psCntKGdpKWco5WWoKqmrKOjt6ufmZaWn5etqaXAnquklZKcl56Yk5Sin52ip5ORmainssOvmqucqp+Plpapnaqbm6CtmKGbnKKkr6ahpKierZiXpp2ZmqGenp2woJyippWYkpiToKGVo56XoI6Wk4qKjY6WrY98lZuCkoKLqqiGgZiWioSPn4h7hJCHhZmQh4aJlY6bl42QmJ6klpqTkZ2Nf41mobOvhYmEdnqPinx2eXpvZ3mQgYCJa3WBeYhyaHN/enaDiIJrdGR5ZmBpZGJkZmpZa3twaWpcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqqyjs668pLScn6WioZ2Zl6ilqaakpbO1npWUnZmZsKauvqCro5CRnpqZlJGVoZyWqJyEnqmrorPIs5+qo6qXlpeap52omp2jq5Oen52gqq6ppaOroa2bn6ChmaWenJ6dsKSYn6iTmJeckaSZmKidmpdmg5J8ZX6NmY9jeY1saGt6kaSra2WamH5nhYplZWloe46hjmtojJeRondraouYo5+Zc2xueoSMh3pYZV6FgV5siomAdlxoc3d3kYCHgm54gniAc215g3R3iIiOg3tqhllea3RkXXOJaWp8cWxjXVFNV0pkWEBKND1GNz9GRDcxPD0/QUQ8PERHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsaqlqK2usKaurbC9samnpK2vsJ+tl5+jnaGamaernK2jpaipsq6elaOQoq+mtrmlrqOPjpqhmZOSm6CZmKSVe6Wsoqizw7ekoaeun56VnqOeo5uiqamSnqGeoKqvqqujqp+om6afqKGslqGbpbCkl5yqlaGem5Kll56qmJ5+voOHcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooeCn3yVmImewL2Clp2ejZ3CwXuBe5KNmsPAfWulsW+MgG/Ken+bd5GDjoF2eoF/eXF6f4dxeIWMk3ltd5NiZl94ZF9lgmNedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCuraayta+qpaamsKufq5iaop+cm6qnopyso6WopaS0pJ2ik6atrLezp6+ikpGanaWSkaChl5ufnIemq6Srrb/AsaCpr6mXkp+dopmhoqmjk6ChnZ6trqispqOip6ClpZ6tqZGkm6mtqpydqpysoZaXpZWho5ecf86UeHqkgXmVlptfro9ejqeBoqB8p5WbdKuDgK9eY42qeqeHhaB0l5KIs2OCq4ahjo2zaoSudH2Wh7hhgq1Zo81uj3V72nt/mXB+iJN2fmV7iHZ2a32Ibn6FkZJ+bYGPYHFrcGdgX3lkXHFoamRmYFJUUldeS09DNUFIRUQ4PjY7QD9BOz03QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLeXnpGkqqits6umsqytrKSrp7CqoKebmaWXnKKvn6CeqKejpqGesKybnpWnrq2xqqisoJSSm5+lk4+fpZeeqKOeraSqsKjAxrOoqbGulpKdnKKXnqiqn5Wgn5ydrq+nqqmbp6ekoauSrLSWpqKqqZ2jp6WhsKGTmqeaoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uJk4+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+Ki5KQg22RkGRvdHVwYGdtZV9vaWluZmNXU11hWVJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytJ+do46jo6Gsr7auqLCnqaqorqurp6KknZmilZ+mq5+hpaCoqKKfnbCsl5qWqKevrKinqZ6XlJqjopKUoa2bnaajr6yjq7Squs2xraauq5aUnJ2imZ6srJ2WoJmdnqmxqampm6upo6Ksm6+xoqisrqWYpqqpqbGikpejpZqUkoSkaqR1iXqpdHqycIKliZmMcYigmoekYGBSrIR/roObdq6BpoaGn3qZloZ7ZoCjiaSZhoGjfal+gZSHrl58qVWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojY2Yj4FtmpNvbXl4d29sZmVlcXBmfGliXVdgaVhYVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVwKGZq6ihr6KesLSwr6mso6imqqqrqaSmoJuknp2lp6ajnKyaoqyhpJ+vop2akqqktbCuoKmbnZaUp6OQmqKon6CmnLGmo6exrLbIsrWqrKmVkZ2copmfpLOdmqCUnJ+nq6ujrpqsqaKhqqOzraKqs7Ghmqqorq+2o5OWo6eYm5F8qmyehId1q3l8sG+CpIuJn5aVn5SB0ri0uMmAgbJfX5Spg6SIh6B5mJWaeKrJdJmjlaepkJKbjH+biZrGxnhloYKlc4GfjoJ9r15wtWOxdUujhm2nR4KTZI+QnpJ8cJeTf3B7dX17bltlanJxZoFqX2FZZG1cXllJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TBxrmtqbKtrKWinLK5rKqhppuopqqsqaagpqWYq6OfrqudpqCsmp6ppZ2ntp+il5OoqrayrJumnKCVkKWtkZmcpqKgqqauoaOnqbC0wrGzqq2ok4mXnKSaoKKuppihlZicpaarmq+draimnqyjt6yhsrmvnZuvp7Ozs6WUmKejmZ+Ogp1OeJqBf596g6N9g6SEh6efnJ6ThLh7fHm5gn7MxsK2eJuhkYuffZqWlop2npiKpJijqH6whZyFnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkqSXe32Tkot1enOFf3FcbW53cmqBb1pkX2huY2RdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu4q6+gnKGss7Omn6CVpa6trqqnnaammqOnobKuoqmmsqCZqaSUo7aiopWXoqm0uKScop2jk5ChsZmenKakoaKvrp2kqKG2ssOxrqmtqZGHkJynnKKinKWXnpiZmaWkqJquoa6lppewpbytobe3rZ2dtbK4sLOnmJ6voaOehY/RtcO3eYeOhZGTkIGmeJSid4ygkoSlgYpxqoaEtG5yapmjm5WKn3yYmYaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5SmmH6MjZOLeH15joJtaXhpeHNuf3RdZGRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q1npeopK21oaOZlaOpp66qq5mlop+loKC1pqKpp7CjlKyjj6Wto52QmpqqtLSknaSdqZKUl66goJ2mo5ynnLSaoaqjtqvDr6mrqaGMhI6coaCloZWampyYmpmmpKaYq6etoqSbrae+rJW9sKyforCzuau0p5upsaSnmHqokH18sHeKgaSliJxtsm+hh618oY+DqJWYgKyIha6Fn5SpoKGWhp+AmZWAe5J+q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbZWSp5mClI2XjHt7g5d/a2x/Yn10bYB6YGdlcW5oZ2hDWmFbPUtUMlU4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JNzA1Mi4qLEFUVlZWVVRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovZKahKnGwrbBtJ+arKCuuKWkjpuko6Cvr6qfpJ+drZmeuKCjq6CvqpquoZCqqaSWiZuQrrCsp5+nm62YmI+soqGdpaGZpJytmJ+oprapwK+lqaOei4CNm5qfpp2SlZqalJqapaOkmqisrKOkn6qovqSXw6yqoqGssrqrrqegs66oqZh2r36Qi5yFh3y6roqYZbCMZZWtfaGPg6aVmoGsioSwhaWZpKGhkIWgW2xqgbNgf617e4KAsWxnbpmXjIiwW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW2Yj6ibi5iRlpZ7eY6dfmRzfmKDd3SAfGFqZnFtZmVlT1VkXEJUXj5JKD45PTQhIi0lHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXmBfYGFiXl9cW1hVUE5KR0M1NTMvL0BVWlhXV1dYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wrOjm6ympbaooYuaoJ+ds7OpnqOgnbWYoLOoqquer66fq5uVr6iijoibjq+sqaeip5muk5mPqJqinaWfmaOipZmfo6myqLyvpaidnI59i5uVoKCZj5Kam5KZl6ieoZmorqempqOlqbufoManpamhq7S2ra6mnrutrKyVgKmSo6+Pm4CHpJeYkIGAuMO6g46dk4SnlpyCrIqCr4imm5ulqpB+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwvax4d6K+u3SAlo6mnZCckZeceYKRm3pjfXtkjGZ5gntga2VramJQYltTalxAVGFCTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbO0sb+5sr2yop2upqWzpp6LmKW+qbexqKG/pqaynJ6xnLmonq2vpqeVlLCsl4yDm5GupqOtoaScqqCYi6OSp56nnJqgqKKYnqCsraq5rqijmpaSe4eZkaabko6RmJiPmJOomaCYqamhqqeho6u7nqnFo6Cvo6uztauvqaC6p66umnN1qqS3hmWJoHBnrY+Kj21vd6SQmZ+Bda6ZlXCPi3GVqKObl66kcm1tbWWKeG9tgplxgHlpcWlniZaVmHFoaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpFvZmSAjZKOopiYmZGWnnyHjpV2Zod4aI1qeX55ZGxjZmxiS2VYSmxZOlFlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6q6ubKzqqmhrp6ksqmYkr2yxMi+tqqewKuso6GnrJ+6o6StrK2mjpauqZCMhZWXrZ6mqqKfo6OgkYykkqeZqJmWo6mglpylpqevuqusmpuSknuEl42lmI2RkZiUjZiVp5SfmKmjm7GnnqOsup+wwaeks6assbKrraunuKOtt5aKoailtp2JlqKYh6makJSdk6qzmZujq6CxlqGhnaCinKCkoZWrpoySkoyHkpyclJCak5iQjZWGgaSal5WNi5OSio+GhH5nin90gnZ0h4xxp217lJGUk4GBj4+Pj52UoZaZl6KCiJSNcmmQd3CLd3Z8empsZGRvY1VgWUBpW0hjYU9aK0Y9KyYhNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTU9QUVhUVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKaWqaqltbeurqKwpK2goLWxkI6rxr3EuriqoqWdm6aesamjtqedqbWnqJGYrKKLiImPnKiWrKShmaeenpOVo5eomqiZlKaho5CbqJmhtbqoq5makI18gZSLoJSKlJGVkJCTl6WPn5qqoJy2o52nrLenr8Guo7emr6+wrampsrigrryZkaajpraikp2mn42pn42Sn6Osr5qho7Gor5ejoJyjqZ6enZyWq5ySmaGblJCWqpmNmZmWkJWekYmgnZWUhZKMkIyUioB+ZoyGdYZ2eYiDc5xqhpCUlJGKfYyWkpKYk6GTnpeihIiYh3pylnN6in9xe39qbmRfcGlgW2BabWNQYGRQWzpHR0Q9Mj09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWNhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaetoKi1qpCQnaa0u6+srKKjmnqdorGkpbCplpu5p6OUmaqcjoaKiZyjkK6fo5aooKGSl5ibr4uqlo+omaeMmaiPnrm2pKWZm42JeYKTi5qTiZWSlJCNkZaijJ6eqZ6fuKSAhK+1orCvdKS+o7KgeHqgqrG7lHWspJ6JgKp+ZFxidqCOpJ6El35uk7Oco6euqqNlnZ+Tc3mZl3CAmKiXbH+iqIplnKWckZeYlouRm5GGnZqQlYKSh46OkomFd2uPh3aGcXyGgIBhaYeKlJKLW3aVkWdokI5ye6aZmWV5mYeCeJhqhIqCbnl/a3BlYHZva2toXGZlYmJvU1w+Tk5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJGRklLTVRUVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5Wmo6GwsayrqaWoraOnraSSlau2sLKmmqqnq5dzjJ2wn6irp5OXuaCgj5yknZF/iIibno2rmqOVp6KejpeRnoV1rpCIppqokZekiJy6tKigmZiLiXV3k4yVkomTkZCUjI+ToI6boKeZnLOWgIyctZ2zjJKPvKehfqeieqKut4GOjaaeg4uFj7Gpr4yKlqOaeYGLrIacnaKnqaeHlYWYd6WbeoebgZemgoF7nLF6ioWgl5mUmJaBkJaWhJmZY3mHkISNj5KKg21wj4d5gHGAgYV/hnSGhJWSeJZok3SgmnR9mYShnYeYfpKLg4OZa46NhWt4e3FwZ2R3bmlsaltla2plc1xeSVRMUUBFNS5ZVFU2KSEwOT0+NjQzNTY4Ozo9Pj5AREg/SUVKS0dTWFpZW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mrq6rqKygqLCmp6mlmZSux76woZamqbWej4OdrJynoqCNkL6emY2fmqCQfYaPmZeIq52ilp+gkY2TiYaAkaiOh6Kco5OXnoaeurKnnpuSjoVwdZCIk4+Jk4+Pm4uPkZ6Rl6Gklp6siJ+0ibSarYvKh6quiLeFjbCCsK6DqY2mmY2dfKiPcnt3nI+nlmiVpHm0i5+epqiSmcKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qXkYt8hZOGjZWTiYNtc5GFf3pyhoGEfIR0hYKXgY/FZoCph4+ja56DopqDmoCMjoWKmXCNk4Vod3R7dmdodXBnZ2xeY29sZ21YaEddUUwyRTQ2TWBjNyYzPERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmRjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmUl6KfsKipqKWroKS5sKqrppqUoKSlq6OWpaq3o69/oaecpZ6diZS9mpONoZGdkHmElpaRh6uZm5uZoYWPjHebnI+gkYiepJuVmZiGormupJmcjIx/Ym2PipKPjI+MjZiLkJGejpSgoZmhqH6hp4etnaCWro+enZ2RhoGgjaquhqSNqpqMmn6idoCZlGuCrHVNq3iHjZ2Rm6ingKqrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln+Me2RoinKZfXmVbF17l21fU3CEXF9seYNgWWWCfYSBmHGnqmuDo25ypXCfhJ9qZZ9sW26KfGZaX4N/YldQb3ZlbXRxampvXmpvbWxqWGlPXVhFOUE0R0NeazQsSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNol5adoLmhqqOmrJKhtryrrqKZl6Cipq2toZ2utaKokqGgoKacmY6YtJmQi56MlYx1gZSSjYqmlpWYnp5/koWGrKSHnJGKmKmYmZqSh6Wxp6KVmoiJgGluiIeKjY2Ji42Si5CSoYuUnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprISleYp9hJp9onByk4iWe56MeW2HnIyZkJuomo+HnXyConN2pmaefnakX5h6fZJzom6Yt7S6dJKHgn+1qGSBxrh7cJW3i3GAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoSApGCdmbOWcXyXn7R0c1uesoNqYm90dXFob1hrbHJzZl1pXmJLRD1ENVFBWXEzPVNHX0pSPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWldgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLi1rq2gm6Kco6OmrZybsa2sk5ehmaGkmZqUnqubi4mSeIuGcICWjYqPoJCTlJ2XfZCJjqigh5iPipGik5uajIuoqKWej5aHhH5re4d+fY+Ng4uQkImPlKCClp6gnaCfi4l3nJiijKByoouIqYicppCWp6p+rox9eqCZeqOTeIF0loiNnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmh0q4Odg3SqZ5SaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z1iYp/nmiadYeTkpiOf59umpBtp5ldqH54u2t+qluOhF20Z1xucXp4a2lbcWp4eWNgZlhiQVBFTjdWQlJuNEtaWl9OWkNAMTUxOzs3SD86Q0dUP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniWOUm6y6srCsnaacnKifnq6bnrCorJ2XpJqhn5iWlqCjmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJaknYqUj4WLnZGcnImPqKOgmYuRioCAaYGHeH+Wi3uIjo6Ij5aaf5Sjn6Cik5hyaJ+Kn4+McZKMgamImZ+jp5+nfLCto6K4l3ejs6KkgIiUeZ17q5p/oo6dm5eJl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn50qlpdb3uWi3ieYkx+enqFY3mXQk2fWaJqcXyObYGJhJl1m3mHibGzf3+bk6d1gZ1ucn2Ub5lzaqRdlXZIZWNgc3F+fm5lYGxodnxkZWJSXlddVFZAWUVRZ0RTV1tiWF5JRD1COD9COklFOExEV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZl5hYVxdXmFoYl9lZHZsXmVnZmtkZmxpaGtpk52Bsa2ZhFRfoKezubOzqZqijJyrnJyplKGrpKGoj5+enZqZlZignZaIh4l3hYFueZWFkJuLfJGTlohygImToZxzkZCBiJiUn5qEjqmcmpSKi4p8g2yEhXGBoIt4hY2Ih5KZlXyTo6Gfo4iuhn21hI6enXullnqpgZadkIqgnHynaHZtfpl0oXNxfJ6GmXCTg659pIOmnpqBo29eqGd1o2NvpWGc05B8epl4cnNjooWQfqNzo491a5Czi2CCmIlzqrKovH93g21+vqaptF6cbn1xl2+Bc6JyXaNndKZhaKZtm9SZfISbb3h6l2ube3eXcm2ppGdgZXlwgIRrZ2ZkbXV4Z2BjVFtmUVFiSVdJVF9XU1tlalxkUEVDS01KS0JKRThQP1BNV1NYT1JSYGZlaVJjd3l3SUZFY11kWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebgLGrVFxLfqmvsbSws6OcmYWZqKCgo42kqKCYqYqZmJiTmZOSoJiOiIZ7cH2EaH2Pg5SagXeRjY6Jb3+GkJOSbJeUfYiRkaOVg46qmpSSi4WJeYN2h4Bugp+GeICThoiZopd6k6KkmqCJs6Gitot6rKekrqVwqYCaj4aBnJJ8pICimYaYcp6Eo62uipeMgIykjZaDrqKVdrW1tcmhc5SKgZ9gnZepbXmVhp+adaGHd6B+kZaKgG9MZqOScJqHcqR7eXRhg4JsfqBrcWRgnHJ/dJdpe2mztbTGpnOYfnudapubq3WDmmx0d5dpmnp1mHJQRH2zXmp2a3mHZmpnYnR0cW5WXlRZaE9RaElVTFlTVV1oa25WZ1dNSkFKTUtISk5BUUpQZGNpbWV0cnN+eXtudYl7e1RQT2xeaFtraVJqaGlsZ2xnY2VfXF1cXmliZGhre19dZGhjamZvbWVpbGWhnImwp4RmP5Shsquvr7aiopCAl6mioqWMpaednaaCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1j4iMgWmEhZKDjIWdjXqMipWlkoOXqZeMkYuBiXqAfYt4cJChh3mBlYeJlqCWf5SlqJyWloRnbnicbKJkfHGld5uYcGengZeMe6V6n5aDl3KedoGJlJaPuW6QiqJifZmilYhtcmmranWgbW6mYJtpi5BoloealXWigH2aYIuFjHRviGJooGWefmmadW9jZoiCbnKiWl9bY6FuXYmMb3t/c3JkpW13omRnp2iYc4uYbqFvU4iPb6BfZadUi11UmG1tc2tygmxwaGt4c2tvUlhXVmZZUm1JWE9dSVhpaHNqWWtWUVJFVlxMWFJhVGhqXnd1enxwfHxyg3t/cnaNgIR2XlFyYmdicGdQamhoa2xuZ2RnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKWZpnpldG2Lp66kqbCxpp+LgJernZ6ljKKhmqKigJaYk42aj4uYkI6Ke4dxgIhoi4t8mJtzdIp9kHxkgoeVioqVmYJ8iIaWp5CBoqyQhZCKgop9gICPc2iPpoR9hpSNiZigjoiSqqediaZ4lpx+pYmWjLKYnpCCr5efpXiViHqpdKWPhJpupKKMkoSMg7tufaWvgoaGh5OWnJ98pXpxqJWglmeefm+rY5aKlZJ3qGypooGJdYeCd6uRpohrkbBrdrOMqWuKhm5tn56SlWF/q4uqdoB/jKafd599haWVnaBpmod2rGeerYy3c3e+jaSTWYOmjathdXJ0cHx0cWJqfm5obVNWW1VhYVxrTV1SXUldbW12YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDc4R/gHt7jIGCgHZieGRjbXNkUmxnaG9scmlmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWmqp2BgJ6klqmqnainrqSZiYOYq5qepImapZ2pnYWMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGlI98e4GFl6WNf6WmjoGOiYWVdoKHkm9si6mBg4yUjomcn4mNk6ujoJCAdZSXiH6BeZSuo3+Bm3GPhXmQi4R/e3KmjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3p9iWyMhVt5eHF5cGhufpKJcX90go+Uk3GFg4JljX9fgX+Ld3VzlHVveW5uh22Ehl53aXiNZoGCho6pm350fJdqiYhvgHZ9hnZtbGeMc3l7mHiEW2tYeY9obndycW94eG9dbIZuaWdWWmBXXGVrY1ZhVV9RX3B4eWxrdmVqa2p2fHFydHNhb3Vic3uBeHV5gnWAgH+AeIuFg317bX9sZHhuXlduZ2h1a3hqaWpkXGBaY2plbHB1blpbYmtkbGx5bWhsb2GOlLmpp4uhopqmpJmknKuioYSEmKySnaCJmqabqZiDgZuKfpaTh46KiY1yg3yPfX6PhXuXjnRyg3CWhXt9kouGhpCFeH5/hpijjXunoYuGkJCFloOGjpd2coWqho6SnJCInp6IjJuooKCrg4mOlJp+fomWraiPk6aPd2+dkYN6km9+qIVwfZVxa3B8gZ+Mf5OOjGhtXYOLjJubno5zlYuIcXRrgnZzgFlyboeRgX1+jGpdamR7hYOIgF9peHube4KLgnaBhoJoeYuHa2FxcoN3X3OMgomQp5WGZoyPg253i4Rxho96b2VnZHqDepZbXGpnbnZbe3h3dW5zc4JmXG2Ka2xiWVleWlhsclxfYVpeXWZ0fnt1b3Rja2tqe3xye3h0ZG10Z2x7fnZ6fHt6en9/fm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtoa2pxcm1XW2VubGdzeW9oam1gi4yqsaKQo6Ganp6Xnpmoo6J+g5itjZ+Uh5uikaWVf3uYhHySmYmIhoeKc32Ai3aFi4GElopxb4BymIaEfpKEg4aKgXqAg4ubn4+CpqGHeI6YiZWLi5yXhIN6rYKRmJmUip6dh4ihq6CioqOLiJObnKOZlqqhp6agkpuHlo57eI6OhKd+f5KRkpOcsaablZ6QjbKTmISljIyVm5+JkJuCiZGKa3yNdndlgoaQinuJnYSHi4+IiICFhJB3fHl1mqGIhoqfi4WUf36MgYB2cHSGhH94iIeLkKaQhIWNiIONkIx9iIuJkIF2bIKEfHmZanJoYXSKcH16d3ZvdnSBXV5vhmhuX15aXF1TaHJWY1xcYWxodXx8c29wZGtqaX97bXh/cWlvcGxmgHtygoB4f32AhHptg4yGfHp4fH16g3lOZHZrc21wemRrZWJiYFt0ZnBmcnJtVV1sdG1peXpxZ2lrZYyInbqflqKhmJWZmJSZpKCee3+aq46ejYWfnYueln15lIN7jpmJhoSEhm54gIBygYh+iZSEbWt+epeGhIOQf4CGhIZ8h4ONm52Sh6qfg3KKkIaTkoydkX2Ne6qEjZKYlo+cl4aGm6egopqdhoORmpmZkJqmoKadnZCWgJCKdnyHjoSle3yOkJGGmKqhnpOdkI6rjpGAnoyJk5qego6XfoaNgm94hXF0YH+Cj4Z1i5eAg4+ChoR+hYOUbnh1dJKhi4yFmoWEjXSAiXx8cnJ7iIR7eYuOhJOnj4aEj4KEioqKd4aIiYt8b2t+gHtuaGxtZ156f2h8e3Z0dnV7d1xgcH1udWBjWl1eUWdtU2VbXmFraXZ6fnFsbGRrameAf2xzgGxsdG94boR5boeAdoKAfYR2cYKNiH57e3x/e4KKYGl7anVoaYJkamNgaVxkdWhvYnVtbFRjcXllcHp6cmVpbW2Lip+3mqGjn5KRlpeLmp+fnnt4nqaQm4qGpJSLmJl5eo2FfImRg4yCgYJtfH94c4GFfYuRfWtofYGXiIGIjnx+hoSHfI+Aj5ubkYinnX9wi4uMk4ehoYqFjXyokYiQkpeTlpN4jKOhoZ6Wmn+AkJqYk4ybo6GkmpeRm36NhHh/g4+HoIB9jIyPfJikoKGTmZCQp42PgZuRiZKXm32Skn6GjYF1dIJwdmB9f42GcoqVfIiLcox/goWGjmh3cXiMmJKPf5d+iItygYZ8fXB4e4uEenqRjYOWppOLhpF8hoaHhXaChImIemVye395enFsamZefnNofHV2dHxzgGpeYHR2cHhkY1lfXlNraFRkWV9haGp2eIFxZmtjbGhlf4BqbX5obnFrfXeGemuMgXOBgX2BdHaCjYZ+fHt/gX1/j2pyg25zaWGHaGxiX3FWdG9tbmB4aG1XanR2Y3V7e3Jiam55iY2fspKlpZyOkJiPhpygm5x8dqSgjZd/jKKKiJqWeHuGh36DiX+JgoB/cX97dHaDhX6KkXhnY32Gl4qCio14fYCMg3mWgJWXlo2WoJt+b4yCkZSGppuIjYmEppWFk4uWl5OSdpGeoaGYlJd6fo6Yl46Wm52knZiSlJt5j4WCd4SXjZ1+gYmNjHOXop6ik5mOj6KMjIOXmIOSlpl+mI18iI2BdnF9bnpkgHyKhXCGk3+QgmyHgoGAiYRldW98h5KXjX2TeIuJe3+GfHtxfneJhXmEkIqLmKKVgYSNd4iEg4J3fIKJhnZfeHd9dH54Z2xkYX9pandzdHV9cXxiY2FzbnVzbWFaYV5ba2RSYlhgYWlrdnmGcWNqY21laHyDbGh0aGxvaH98gnltkIZxgIODf3R8g4yBf356goN+fJBtdol0dG1limxqYWN1VoRpcW5geWdsYmp2cGZ5fHpxYHJshoWQnK2XpqiejY2Xh4afk5eYfXiqnIqZepeci4yYkHl7gYt9fIN7gIKAeHR4enN9gIR/iYuAZF59i5WHf4WHdH1+in99l4SXk5aMo6GYf3KHe5OSiqePjI6Kk6GShJKQlJeRi4GPmKCakpCRdH+NkpSJnZ2ep5iYjZWWc42OimuFmI+ZeoeIkIlvl52ao5OVio2fjIeCkpx/kpKVhpmIfImJgXpxeWt1bHt9i35uhZKClHdvgoN9fop/ZHJqe4CWl4R/jXSQiYN4h351eIB9hoB8g4yFjZSkkHmFgnSJh32AdHaBiIRuYHt1enF9b2FvY2R7Ym5vdnN4d3N0YXZfb2x1bm9cXF9eXmpeT11YY2FobXR7iGtfamVqY2h3h21mbGhpbGiAfHp3b5CHc4GDhH1zgYaJeoJ9eoGEfX2OcnqLeHhubIdraF9pcWOHaHFvZXdobmxheWhrfXt4cGF3bYuBmZqqoKSonYqKkYaKnoqVl313rpiMl36ek5GWlIh3fnuKfXuAdnh/gHB0c3tvhn2BgIp/fGFcfo+Rhn+DhHN6gIZ6j5GHkpGbkqWblYJ+gXyOi5KkiY6KjZibjYaRmJOWjomJjJOdk5CMjW6DkI+RiZ6ZoqGXloqXkW6ImYRmhpmOk3qJhZCKcJaalKKSkomLmoyCf5GefJKPkouZjnuKhId0c3VrcW50e4t0boWQjpJxdIB7gYKIfGRxbHl9mZR9hIh0kIuAc4h5b4B9gIZ8hYyIhY2VqI17iH1+i4V4fnFwgIWDY2h4dHVwfGJecGBrdF5xanp4eGtzcGV4XW1sc21zWVpeYGJqWlBXWGVjZ3Fxf4dmXWloZ2JncY5vZGlnZWpogHp3dG6OhXSBgYJ7dYKJhXeFfHiEhXqAiXd/i3t6cnmDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKf6KYoqihppuHjIqBkJyGk5x1gaqUko6HoIyWk5CAdHx2hXd4f3Jze4Vrcm96bop2gIGHbnFbWX6RjYh/gIB2dYCAf6CGkIqSnJehlJh4in+BjYmdnoqPhpKYloWJlZmPloyLjY6NnYqOkINtiIqQkYmclqGbmJWGmIhphKOCZoWdipF+i4OLgXeTmJKfkpGJiZWOf36Ql3yRjY+NmpJ9in+CbnZwbG1vcHuFaXODjpeKcHd/dIKJgnhmc292gZmOfImEepSReXaIdHCJe4WMeouGg4mPnKOIfIR3got/eHhva4GDgV1yc3FwcHhaXnBgcGpeb2l8enBtbWpsdmBwb2pybVpYYWFiblhRU1pmZ2N1cISCYl1qbWRiZmuSbWBmZl9oaoF1cXJwi4B1f4KAeHWAi4B4hX93h4Z3g4V7hox/e3aKf2pxY3xihnxvcWx0amhvbHZ3X3F/eXt0dXSAgn6klZqtn6eWhY2Df5eUg5CfdYuflJOGi5uMlY2LenJ4dIJwcoV0cXWIbG9sdW2Id4N+gG1uVVGBq5SHgniAdnKCeYGggpGBk5KYnJKaeJJ7g42TpJqTjomVmZOFh5eZjJSMiY+PiJ6FkIp8coqFiY6InJqfm5aUgJR/aIWch2eGoIiShJGDiXGDkZePm46QjYyQjXh7kpB6jouMkZaMfIh8gGt2am5ra2x6f2F5fo6VgXZ6gHeDjXx5Z3RsdIeVi3+IhnuUkHF6hHB2jHqJjHuJfYKMkZ+dhX18eIKMfXdxamyBgnlfd29tbHJzVl5vYnJgX2xueXBncGZmc3RocWthd2VdVmZhYHJTUE5cZmVdeXCIfF9daHJiYmVmkmlfaGRbZ3B+cGtwc4p9dnyFgHR1f4x5e4aAeIiDc4aFfoyMhHt5lXdmcmqDYIh+b29remBqbnR/dF90fXmGeHRzhXx4oI+ZsJyljoKKf4OaiICMnn+LmpOPhIiYjo6PhHZ0dnOAcG+Fc3Bxg3BraXZug259fG11c1JOgt/IktaTfG90hHaDoIKTd5WRmZuQmnuUc4WQn6GTk5CKk5uUhn6WlYiNjYiRjYmcgI6BeHqMfoiMipycnZuVk3mNdmeIkYdsiKOEkoeXg4ZjjJGZjpWKl4yNiotxe5SIe46IipKRiXmFe35se2Vyb2treXlcgHmPjoB6fX5/ho56eWhza3OLj4mChYV9lYxrfn5ugIt+i4d9hHqBj5aamop9d3iDkHlzbWdwgIRtanRvaGp0blNeb2RwWV9rcnhma2piZnhycHBjX3hgYFZrX152T05MYGdjXXlxiXRcXGV2YGFlZY9kYGZhWGlzc25rcXaMfHR5hoJ1dn6Lc3+Gf3uJfnKJh4GRioh8fph2ZXNtfGWIfm9wbIBabG55eXNhdnp7jXZzd4p3eZ+Lm66boJCChXeIlX59ip2HhZ+RjoWMl4STjoeBdHdweXFuhG9tbn5yZGR4cX1ten1qaGxjpJrB3K7voXNrdYR2haKFkm+WkJWglJyBknGGi6OXiY6VipCdloOAlZCFiY+AkoqKl3+He3V/iXiGhI2cm5iZj492inZuhoiLfYqjhJGJnYWFXouUl4qPiY6Li4SKbXyWgX2IhYmQj4Z2hX19a31keHVqbnhzWIh6koeFen5/gIWLfnhlc2p/iY6JgoKAjJaFa4F2boiQgo+Ef4J6f5CWk5mQdXR4iI11c3FndXqDYnRtb2JpdmdSYHFnbFVfbnR5YXJjX2h9cHJuW2NyYWJXblpcd01NTGRnYV52c4ltXFxkeV5gZGaFYGNiXllqcmtua3J2jH10d4SBeHd7iXGDhH1+iHt0i4mIloeMfn6Yc2h1cXlti3pudHCBWHF6dnlxZXd5hoxpd4CJcn+ch5mnnKOShHxwjJR4eYudhIWhjY57lY1/mYiEe3J3cHNqb4FraWx8dF5geHd7cXV7Z2FlfOvatcnD3IhzbHOBd4qaiI1pmI+PnZWTgYlxhYmgjYSLlYqMmJR8jZOIg4mPe5GLhpCCf3Z4g4Nyh4KTm5aUmIaMdod/cISBiYeZoYOUjJ6DiWGDlY+HiYaKjYeBh2l9lH99g4SJjo2CcYZ+f3F3aHZyaXN3bFqMfJKChXx/g4CEioJ1YXRsiIGPioJ+f5KQfW2CbHiGj4aRg32BfYCSk5CXiW9yeo2GdWxxbHJ4gV9zaW5ca3ZgUmRyaWZTX3B2dGBvYF1ognFzaldnaGNpWG1WW3VMSkxlZ15icnOFaVtcZXleXmRne2BkX1xZa25lb2pzd4p+c3OBfnp2eohzhYJ8gId2d4qGjpiBjIF7k3ZsdnV5eJN0bnh6fVh5hXGAb2d5d5KCZHaGhXGKlYWZoZuiioZzb5KLcneOnH2KmomJfJ9/g5l/gXhxc25vZHJ+aGZsd3dbX3l7e3FxgGlhZ2F/1baOkKZ4bnF3e3CSkIyHapmOiJySjIV7aYiLmoeBkpGGh5iNfI2NgYGJjnyQjX6KhXp1e4J6cIaAlpmOk5SBiHWDhnaDf4qTnZ6GlY+ffohhgJOHhYiEio6Af4NnfZGAfn+CjI+Qfm2CfIJ0a212dHN2dWtijYGPf4V+fIR/hId+cF9zcYV7j4yCfH6RiHpwg2Z5g4qGi4N8hH6AlI+Rk4RucHqMf3Vub2tsen1iaGppWG12WlJpcmpiUWJyeGxiZV1ZaoNtc2JcZ19kbF9uVFtvTkhPZ2VcZ25xgGxbXGNzYFxjbHdkZV1dWmxsYm1qc3aHf3Fvf3x8dHiGeIWCfYCHdXmJgZKWfIiGdomBb3d5e4STcG18gXdeg390gW1pe3OUc2dzh3xykZGDmp+boIaHdnaUfm12lJd+iJGDio2afIuadn12cW9samF0fGdiaXV6Wl94fHptcX9lZGhoV52PXnFylrzDg3VxlImQfnKXjIack4yIc2uJj5aBe5SLgYSbjHyLhn18iYx/lIh1iYV2d32BcXWGgZ6UhpWPg4Jyf4h1hHuJmJyXhpOOnYCIZX2TgoCGhImJcoF9Z32Le3l/f4eLjnxpgHyDdmZveHhzdnNsao2FioGKf3iBgISDf2tecnh6fYyJhXuBj4B+coFpeIKHi4WEeIN8gZeNkIx9bm17iX13dW9oaH12ZFxwYldwc1NTbnNpYU5mdHhmYF1cWG6Ab3NZZWJdam1gcE9Za1FEU2dhWmtubXtvWltebWNaYm93Y2ZcXWBsamNtanN2goNxbn57f3R1g3qDgnyBhXZ+iYGWkXiDinSBiHJ4eX6NkG9vfIFxaYF5en5tbXx2lWtqeIR0bJOMhp+YoJmFiG59jHZqeJiPf4KKg5WXiXmOlm96c3BsamRgdHpoYGVxelphcn15Z3B6YWVlj7Gyd0piWqTZ0JZxe5CLkHh9lYuFmZGNhm9shpKSenmShoGEmIp8h394eImKhJaAcIyIcXR9eml5hYOlkYSTjYN/b36DdoN3hZuYk4qSkJSFh3B7koN9g4OJg2+BeGiAhXhyf3+DioZ7ZX1+hHVkcHOAaHhwb3WYjIWCint2eICEeYFrXHF9coCHhYl9hol6iHKBbnGDho6EhHOEeICZjY2EeG5vf4R/d3tlaGp9cWBZd1pYcW5OV3JzZ2BLbHZ0YV1bW1l0fXJvV2ddZmpxX29OV2hRP1lmX1pwa2d5cVtbWGtlWWNweV9oXF5lbWhmbGlxd3+Hb2x/fYB1cIF6gIF/gn92gYWJl4pxgo1xe4Z8eXmDk4x1anp/a29+dH99b3J8e5RvboB/eGeSioKhmZ2RgoZnh4NvaHqWin6AhYKZioF8jYxpeHJrbGZfYW95bV9ib3lcZGuCemFxdl9lZtTqvooyOj6LjoByeYWIjo12g5eNfpOOjX9ubIWNjHZ9j3+FgpWJfIN4bnaHhIOXd2+JhWx1e3RmeYKDp4yDj4uEfW5/dHaDeYackIuQkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7gYqDd2F5hIFxZHFofm10cXWBm4uAf4V+cnV9gHKAb1ttfnR4ioKLe4Z/fIh4enFsiIOPg4pygXl/louLf3Rua3eAgHV1XGlpd3BZV3xTWnFlTFtycmVbSnB3b1xbWllddH51aFliW2dmbmNpTFdmUT1eZlxddWVfdHBbWVVvZFlkcXlaaF5fZ21namtpcHd9jmxpgoR+eW6Ae3yAf4J6dYKBjJOFcICLbnh+gHp7iJKJf2h7fmt0e3KGe3N3fX+MeXiEfXxrjIyDm52WjIGAbI5+a2h+jo17fn+DlIJ/fYqIa3VxZ2hjW2Jncm9gYWx0YWhwiXlic3ReY2SboI9uXDVZr7V1aoCJfZKGdoaXhnSPi4p3cG2Fg4d1eYl4iX2TiHp/c2d2iH5+mG9xhn5odnltZXmIhKWHgIeNiX5ufnV/gH2MmYeCk5CYiIuEiXyPiHF7fYR8aX5ta4B7emp6doGHgXJgd4F+cWRyZ3WCbXR7hZSRgXyBf253eXx0fmxYb392dIuBhneHdYGJenhzbomAjoCFcn59fpOJiXpubmpugoJ1bl1nZnNxUVt7TlxxXE9ccnBkVktzeGpXWVlaYXGAdGBdXWBnZGhpZk5ZaE1AYWRbYHZhXHRtWFhTdGFaZG9yV2peYWhrZ21saXB3fJJraISJfHxwfn57gX+CeneAgImLhHF7h29xd4N/e4mNj4Nqfntud3l2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshImSeX17gpGAgH6Kg3BycGNmXllnX3BwYGBncGZqb4p0YXRvW2FkanZ7f76cpqPIuHGFhHOUfXiGlIJ0kI2IcnJwhHuDdHWHdIh3lIh5eXFjd4Z6gJNpcoR2Znd2Y2p8g4iegn9/jo59cn5zhHmAkZCCeJaNlI+Igoh6iYlseHl/dWh7aWt/eXNpenaAgn1oYHeHfWprdGh7f2l2gYyQlH56fn5we3Z7c35iVnd9cnOKhIJ8gnCGiXd4cHCDgox+fXl+fHWOhoN2aXFpbYiCcnBdaGNzbkpldUxeb1ZUWXNuYlFPc3hhUlhYXWJwgnNbYV1oZWRjamRRWnBJRGRhW2NwXl13aFVXVndeXGVuaFZrXmFqZ2Vvb2hwdnqSbmmIjHl9cnt+eIKBgnx2fYOIhoNwdoNybneCgn6Ji5N/cIB8eHl6gYx1g3h/gYGChHqAdW9+iYuanoh9hXp3hntndIWMkHp/f3yJhoR2j4Bnb25fZFxYZVltcmFgYXFsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhwjXV7h4+AepOKgHV0dX53gHBxf22EdJSGeHVsYHqCeYiPZnGDb2d2blttfYCQk4CAeJKSfXh7bYd1gJCLg3OWipGOh4WFe4CFbXV2f25od2Vte3ZtanZ3f398YGJ4hnpodHVjfnpndIWOjJV7dH91cYB6fGx/WVZ0fW90hId/gHhriIZzeGt1f4ODfXp9eHtyi4F9c2d0ZW6LhG10W2pfdWRIbm5MW2JXV1Z4bWJQU3R2WFBVWF5hcYRvXGBjbWVjXm5iVFxyR0JmX11maF1aemNSVlx1W1tna2FWal9gb2Zma3FocHV4jXRrjox1f3Z4fneBg4F7dH6DiIiDb3F/dHF1foWCiY2Ke3d/eIR8fIWHeId8fYF+hIB7fnN2eYyOn42Jeol2dIN5Xn2FmYx5h4N0hYaFd4l7Ym5sW2JbW2FWanNjYFxnbm9mh3FhcWZXXWNrf3zKzoi5omptbYpscYRyfISKfnuShXp5dHl1dXtqbHVjhHWRgndwZ159gnqLiWVygmtqcWNYbHuGnIiCgXOXlHd+e26HcYGKi4dxlo6QiIWLg3t5fnFxb35naHJibnhxamtxd3x8eVxleYB3aXV4ZoJ2Z3SHi42UfHKGaW9+gHhtfF1YcX5sc4CLfIFubol/cXZod3+Bf4F2fHF6dId8enJmc2FujIJsc1hrX3dbSW5rTVZVXlRVe2thT1R1clFRVFZeYnSFaFxgbGpmY1luYVhicEdBaF1gZl9dVXteT1ZkcFpbamhdV2dfXnJma2dyZ3BydoV4bpWKdH96eH55goeAdXOAhoWOgnBwe3h2dHmGhoaLhnp8f3WLfn2FhISHf35+fYd/fHh2eXeSk59/jHyLbXaAeWODh5eGc5KKb4WFgXqDdGNuallfW11dVGdzZWBZZHJyZoFzYmtlV1tgaX93vq57oLdtYnOGaHR8cnqDhnp9jH94eHN2b3t2ZWpuYId1joFzamJefnh5i4RmcX5oamtaVm94iqSBhX9xmZNxgHh1gW2AgpGHcpSIjIeDiIV9eXRyb2h6YWptYG12a2dqa3l3endbZ318eGVyfW6EdGV1hYyGlX9vi2ZreoN0bHRiXG97anR7i3uBZXSGfW1xZ3V+eH1/cnxsenqBenhwZmxibop+bW5Wa2B3VUpqa09ST2hOWXxoYk5VdmpMUFRVX2d2g2ZdYHFoZ2FXaV1ba2hKRWtaYmRXWVV5Wk5XbmpZXWxlXFpkYl50Zm1kcWdyb3SAd3CZhXZ/fnd/fIWHfXVzgoh/lIJuc3h6eXJyhYeIiIR5gX12j398hImOhIKEe36Lg3t3fHd3mp2XeoqDhml3fXxsg4STgHKPgnGGgn6Bf29mbGdXXVtcW1RkcGVfWGNzdWl2cGVlYldcXGiAcG9ygHSJZWV4fml0dnNzg4R4gYR5d3R1bmt7cGFna2eGdI2EbmZdX31we4l+aW13ZmlkVVdycI2mfIR8dpaQc3xze3lte3uRhHaYfIeGg4aDfXVwcmxndV1taF9sdWRnZml6b3tyWWeBd3VncIB3gnVid4WKfJSAbotqbXqAcGVyZWBteWZyd4p7fmJ1gnZpa3F0enB5eHJ9Zn5/f3l3bmNlYm6GfG1rVmpicFNLaWtPTE9wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWVgVmNXYnBdTEtrWGNhVVRVc1dMWXVkWl9rYVxbY2Rfd2ZtYnBpc25xfnR0mYF3f4B3f36GhXp9dYKEfpeFbnJ0e3p0cISFj4GAeot1dJGAfYGUjoCFhH1+jIZ7foB2e6OlinmIhYRsdXx7dYOCjHpuhXN6hH2Bg3VuamhlVl1bWlpTYm5lW1hic3tqaG1pX2JXX1ppgGprb4BobGFoeXhrdHR0boWBe399dnVtemhqeWpfZW5ogXaPhGdlWGJ3aX6He29pb2dmXVVYb2iPp3aBenyQjnl1b35vcnV4jn93lHSFgn+FiHZqcnZnaG9cbWVebXNfZ2FpeGh7bVttgnJzaW+Afnl3YXeEhHiPhHOIcW95f3FicGhcb3dkcXOIfHhic4BwZ2p4c3Jrd3Z0d2ODe393dm9kY2NufH1rbFVpYmZTS21oT0dSbEVheGZhTVNyXUlNVFlla3d6ZV5tcGlkXFZfVW5uV0tUaFhmXlhNVWxUSlx5X1tfa11dWmJlYHpobGFvb3Vub3d1eph9d4CBeoB/h4Z6eXqDfoGThHF0dH56dnSFiJB9gH2QbHOVgXyDn4V/h32AfoaCgIp7doSsn396iIeEbHKCenaAgIF1bodvfH9ziYBqb21kZFhfWllaVWJqZ1taXnWBaV5tbFxhVlxca4FmcnR9ampda3Z2Z3R3cW2Fe319eXZybHpoaXhmXWRzaHp3koFjY1RlcGeChXd3ZmhqYFdWWWhkkKdufniAi456cHB8ZnhueYt7do5xhH1+f4ZuZHZzZGhoXWtiXW9vW2dfbHVlemhddIBvcmtxe311dWJ0hYp6h4aAf3dydX50YXBsWXF0YnFyhXx0ZHJ/bGFsem9qaHl3dHFmhXV6enVwZGFkbnN+aWxUaV5dVEtzY1FHV2JHYnZmYUtUb1dKTFhYZ2x2emRlbnBmY1pXXVh2ZVRKXGNYaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bW9udoOYeXKBgH1/iIuGfXV2hniHjH1zdXWCeHp6goyOfX6EiWp0l4F7i519foV6gXp+fIaIc3GProx7e4aQfmZyiHp0fHx2cm+GbHt+bI96YnBvYWVdZVZZWVZjZmtgXVxzhWlZcG5aXldaXGx7Y3B3dmxiW21zdGd1dXBthHh+gHl3bm50ZWl0ZVtndWZ2dpF6X11SZWZqgoJ0fWJjaVxUWF5iY5ClaHl0goWQeG1ueWd3bXuEenWIcoB4fHh/aGV2bWBmYV9qYF10a1llXW9vYnplW3d7a25ucHd4c3RkcoOSfoeCiHp2b3J9cmF3ZFtvcGJwcYJ8c2ZxgGRebnZpY2Z5enRtboF1dH1zcWJeZm5vfWRqU2hYWVRNd19RSlpZSGJ0Y2FJVG1TSUxaV2lscntibGxzYmFZWlthdltTS2RdWGlTV0hZYE5HaXVYXmFtW1tfYmJdhWhoYW54eWxuanaBkHlug36AgZKIhIF2dIl0jIZzcXd2gXd8fX6Mj4B+k35weJaDfZmSeYCAeHl9f3SIg3NwmaJ7en+JlXlkdYh5c3h1bHRvfmx5fHCRcl5wbmBnYmxUW1pXaGNtZlxccYhlU3JuW1pYWGBtd2RpdWpqXlptc3FtdHN0aoV8fn98d25ubGRpcWNbanJkdHaPc1tXU2RhcoB/coJdYmNdU1pgW2OTn2VycYWEkXRsanlsb296e3pxgHZ+cnp6emRmdmdeYlphZ1xed2hXYl5vaGF3YVt7dmppcm53c3N0aHCBlIKGfoR2c2pwfGxmdldca21icHOBenNmb35bYG9xYl9pcHxsa3N+cnF4a3BgW2VsbXphZ1NnVVdSUHZbUlBaUkhjc2JgR1VqUEhPWlZrbGt8ZW1vcWBbWlhZbHBXUlBmV1dpU1RGWlxPSHJ1WF9jbWNYYWBhXYtqY2RteXhrbml1eYZ7a4N9f4SZfIKEeX2Ibo+GcW93enx0goJ8i4+DgpZ0eIKUhYGfiXWAgIFzf4Fwh4J1b6KXdHuGi4d7ZniLb257b2Z4cHpsc3ZyjGtedG5hZ2VrUl1bVmdibGxaXHGMZE9vbl1WWFVnanVoYnRlZV1abnVucXV1emuHfH98iHeQc2Rka25hXG5tY3N4h2taVFZiY3h9fXGFXWNfY1RbYFljlpVjbnCDhYpzamh6bmVydnN7bHp0dW96fnVfZnJjW15XYmRZYXVlVV9gbWRhcV1dfnBoaXNxc3B1dWtthJOBiHuFcXJmbnxvcW5TW2ZqZnF0gXZzYmx2VWJxaltfbmV8ZWx1fHJyc2ptYFlkamp3XmZUZFVWUFRtV1FXVFBIZXJfYUZXaU5IWFRWbmlkfGlrd2thV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWmJgXl6PbmJma3l1bm9odnZ/f22DgH6Gl3t/iIGKf2uTiHJndIB7dYCDfYmPf4uTcn2KkYWHn4Z7f4aMc4CGc32Ddm6ljHOBjYt3eG56jGBkfHBmenN5bG1xdoJnZHtsY2ZnaFNeXlRnYGxvW15ujWhOaW1gVFZTb2d0bGV4ZGVdWXB0bXJ6eHNtiHuAdpx7emthZWxtXmBvamVweX5nWlZYYGt4fHtwhF9iXmdWWWBXZJyIYmtxgYd9d2tqd2xbdnFreWl1cm1ve4ByWGpuX1ldVmJjWGVxY1NeYWliYmxaYH5sZmtzdW5td3ZraIWMf4h6h21xZnB8bHFsY1lgaGlvdIFzcl5pbFJlcWRUYm5heWJwdnt1a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVvXWNHWWlNSV9LWG1kYHhobn1kYFVeVF10W1RSYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNtaHZ0eoNzgoN6iI1+fIqHjnpukIp0bHOCdH9/iIWHkoSVj3p9jI+IkZuEgHyMhHN/gXN0eHFuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo2NjY2NjY2Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjIyNjY2NjY2Pj46Ojo2OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHx9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvLy8vLyyApKCgoKClXiovLy8wLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHx0dHR0cGH6ppKSkpKpWFRwcHBwXOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHiIeHhomTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4OEhISDjJCPj4+Pj4iCg4OCgoKFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5CKj4uKkImPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+NjIyMjIyMjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiGhYmJhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYaGh4WFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+HjI2JhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISKhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIqJio6Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpKSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f35+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpKSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9+fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyNjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4qKh4eJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VycHFrbHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZ21lamZoZWhnY2JiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpeXF1eYmlgXV5aWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVBQXFdebFdVUlFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBgV11yVU9PT05PUFBRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLTGNUW3RWS1BNTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NHZlRVdVNKUExJSUpISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gH+AgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj48RUQ9P0pjW1VwS0RGSEdGR0JERERGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD0+VWRiXmdPQUVFRkRGRkRGSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYGCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs+PEhibWhmbGBGQz9MQ0NGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc9PTg5VWxya2pwa041Slg+QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN1c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Q0BPQjxYbnFubHNxW0NjVT0/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11tP1JZSlJrb2tncnJmX2pIOz5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZEPjw8PUA9ODo7bnZHQWJdXGluaGNxbmtsZj45Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBaUTw8PUtOSEh2dk04V2poa25qb3FubWxWOjo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5SDxfgIOAent3VjtDYHN0cm91cW5vYEE/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBIcnlrZYOEg4ODgH1dPj9HaHh1cnNwbWxMPkVCQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dHd6fHt8e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH6CgoGEfn2EdUxCQ0NPbHd4e3pxX0VFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRUNkgoeHiIVeRklKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAgHiAhIWDhIltQUFXdYWIh4eHiYJXSExNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINVbYaIhoeGh4iJiHxQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpWgYSEhIKChoaGhIKGhYWFhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUtHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWaFhISEf4GDg4KDhISFhYaHiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaYaEhIF+gYODg4KDhIaJiouLi4qJiouMiVQ6ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIGDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojo6Ojs4OTg5ODc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3p7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXKEgIGDhISEhISGiYqKiIeIiImKioyKiYmMej45ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozw9Oj47OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA+PT4+QD8/P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKDgoKEhYSFhIaJiYiIhoaGh4iJiouMi4qKi4qLXj5ER0lLSklGR0dERkhHRUJAQENFQ0NBQkNCP0BESEVDRURFRUFGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR2d3p5en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGWIWCg4SFhoaGiImJiIeGhoaHiYmKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fX5/fn5+fX5/gH9/gIB/f3+AgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkJHR0pZhYKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1PTUtOS0pMSklJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExOS0dHR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7PD06P0E+QEBDRklKUWCCg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEdFSkhESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dIRkNCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6PDg9Pjs9QT4/QERISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRkJHSkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxvcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKREVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9DQ0ZWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMj4uLi2dWVWthRVJRUVBJOztRU1JgdV1VVlRWWVlSWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLSEhKSEVGSUhJSElpcnZ5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0dGRT8/QUFFQkNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFpnUlVWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3lucFhaW1pSVFJWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSVlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin9mWVlcWVNVVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbU1NRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpbXF5UUVFQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlNjVX9SUVFNS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1c3N3e3p6e3t9e319fX59fX1+fX5/f39/f39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlRSEdPRkRFRkhHSEJDSEdIS0dEQUFEQE9QTVNkc3R1dXN0dXp8ent7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiW1hTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz8/Ozs+QEA/Pz5rUUthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNDPz48PUI+Sk1GVW51dXVzdHZ4enx7fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqamZgW1FSWlxZXklKUFFOS0xRUlFUVlRXUlFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXt4enx8eHd4ZEJAQEI9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV05IR0BCPDk3NzU5OT07Ozs4OTg5PztCSD9cdHR1dnV2eHp8fHx9fHx9fX5+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJYR0ZGSEJBR0lFRUZETVJQYVdSWFFQU1NSVVtPT1FXUE1KQ0Y+Ojo2NDg3OTc5OjM2Njc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYXNrYWFfXWRhX15ZVVBNT05MSUhKS0lIRkNRUFNaV1RUTlFTWVNcZVVPU1RRTkxJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbnJ0eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBSUk9NTU5OTkxKRlFQVVlTVE5KT09UU1RcVlJVU1JPTUtJSEhGPz89Ojc4NzY1OTk2NzY2NVdwcXR3eXp7fH1+fX18fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMS09RUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjQ1NjY7ZXBydnd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0hGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXV3ent7fHx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRUZISk5LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtIRkZFRDxBQT47QEU7PDg5VHFydHl7e3t9fHx7eXx6en5+fHt1dHZydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT09NUVNMVFVUV1dVTExLSD05ODc7P0A+PD1AQEI9PkVIR0RGRklHS0pARkFBQEZIRUpPSFBSYVxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSUpMTEpGRkZFP0JDPjxCRj9CP0FkcXV3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0FAQD5BRElFQ0hISUdJRUJCPz49Q0JBSEpFTU9iZVFNTk5XS0xNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES29wd3p5eXt7ent6d3R4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkFBREVHS0ZDSUlHR0hDQz9CPz9AQT5ERUNLTlFUTEpJTVRHSUlKTEpLTElKTE1PUFJQS0dDS0dDQkpKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW9rbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0RHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQkNIRkpMSkRJSUZHR0NDO0FAQj5AQENEQ0lNUEdJS0dIS0RISUtNSEpMSElKTEtNXVJJSERNR0FES0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjpAREA+QkNERUlGSkpMRklJR0ZGREI7QkNDPkBERENFR0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0pIRU5JQkZNTE9NT01OTk1LSEhKT1JRUk5SZmdmcm9zeHV7enxsaGpuZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pDRUZFQkNCRUBEQj5APjo7Oz06PT5DQT5BQ0VHSkZJSEtIR0dHRkVDQD1FRUI+QkNDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSUhLSUZIUEtESU1MUE1PTk9PTkpKSU1SVVRST1dkYGFtZ3Byb3J5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQEJEPEJBPkE9Ojo9Pzs+PkBCPkBCREdLRklGSUhGRkdFQ0JBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFRkVEQ0lISEtKR0tSTUNOT01RT09PTk9PS0tLT1VXVlVUWGBeXGlhbWluaHJzYmVmZWRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmprc01HR0ZIQkJAREU8QUFAQzw4OT0+OT88P0JAQEBERkhFSEZGR0ZFRURDRUNESUVDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUlKS01LT1NORFFSUFFSTk9NTlBNTE5TV1ZXWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaW96TUhHSEhCQkJGRTxAQkJEPDc6Pj46PjpAQj4/P0NFRkRGRERHRURFQ0RFRkdKRUVJR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xNT09SVE9JU1VUUVNQUU1OUU5NUVdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnamhoamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN1bnByc3lOSUhHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPT8+QUJGQ0VCQ0lFQ0VFRkdHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05QUlVWT0tVVlRRVFFSTE9RUE9UWVpaXFpZW15fXmBiXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZxdU1JS0hKRUJFR0U8QEdDREA6PD5APz4/QkI8QD5BQUZDRURESUVGRUdFSEhGSEdJS0lGSkhIS0hGRkxISEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm92SktMSkxHQkVERTxARkREQjs/P0FAQEBEQT9CP0FDSEJGRUZIRklGRkRJSUdJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTkxOTk5QS09QUlVYVk1OVFZVU1JRUExOVFNSV1teXl9dXWBfYWFhYGJkZWFjaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV1ZXFza3BxanJ2b3dKTUxMTUdEREFEPD9FRUVDPUFBQ0JCQ0VCQkRBQUVHQ0dISEdGSkdDR0lHR0pGSUxISUpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhYmhtZ2JpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xNTExMR0VBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NDSUZDSEpKSUlLR0VLSkdISklJS0hKSk5LTkxJTEhKTUtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVGB3dWhqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5S05KS0pGQz9AQj89REVGRENDQkVFRUZCRkZIQ0RKRUVKTU1LTExHR01JR0lLSEtLSUtKTkxNTUxMSUxMTFtzYmRwXmxtVU1OZnNdZmVxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXlta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEQEJCPz5DRkdCRkNFREVFRENISEdERUtHR0xNTktNTUdKTkhKS0pJTEtKSktNTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncXBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9QEBGR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUtKSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRqdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSURFRENBQjxCQUJHREdGTEhFQ0NIS0hIRkpMTEZOS0xTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25ub29xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnNIS0hJQkVFRUFAPkNEQkdDSElNSUZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTU1JS0tLU2tiWmleX2ljcnJaX1lqb19lZVVrX2NbYWJRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFydXR3ckhIRklERURGQUBBRUVER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpJS0tJSElHS0tMS0ZIS0tMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RT09RSklOUFFkcWlUWVdbW1xVWVpdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSERFR0ZGQUVDP0NIREZHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0hMSkhGSEdKR0hJRUZMSUpLTkxJT1xXXlBcW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWFxZWlhcVllcXWJfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1BQ0RCRElFR0dGS0pLSEVFSkpKR0VISFBKTU1KTVNJSEZBSEZKSUtMSUxKSEZFSkdERkdFRkpIQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFhZXl1jYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNGR0VHR0lLSklJREZLS0tGRklKTkpOTEhMTkhIRj5HR0xJS0tKTEtJR0VJRENDRUFGSkRASkxKT1tjWV9eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV5eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLR0NHRUJFR0hGR0hJRkdKR0hGSEtJTERES0tOTUxMSEpKSEpHP0dGTktLS01LS0tJR0dDREBEQUhJQj9JSkhPXWFaW2RdX1RRU1hdXFxcX1pLV1xMUlxZSU1eUE9cX2FjZGNjYlxkY2JkY2ZYUVVUU1tYWmFeXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSUZGR0lHR0lGRkZJTEpORURLSkxOSkxJS0pISUdCSEhRTUtLT0xLS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJhYGJiYGNiYWRkYlhPUVFSW1NbXV1dXV9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lKS05MTElMS0lJSERIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VDV1VFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJdYGBfYmNiXWFiV19fVFBOUFFYUl1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQRFdfSUdHSERGTUpQUEZKSUpLTkxLS01MSkpHRUpNUVFOTk9NTkxOSEtBREFDREZEQ0FFRkJNSENMTFBPT0xGTUZHSUpIR0xMTU9QSUxPUFBTUExQVFNVWllXWVhYZFdPU1RQUE9OUFVUW1hZWl1cYGFkZWNnY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHSFlNR0hKSEdOTFFRSUxKS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRURfTERmY0VNW0lfXHNtT01WbVlMQ1BgVWxXZ0pdV1VeRE1RVUxNVFZRU1RYV1RYVVRcVVBmWmhoZFhTa1NWVlVbXFtgYGFiYmJgZmhmbmxocnp8fX6BhISEg4ODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtGYFRISk9KSU9NUlFLTEtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzWFBtSHFucGFWUHFxc1BCa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X2B3YFhhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEZKTEZRVkxLT0lLUlhXUU5OTkxRVE5PUVBLTE9HTVBTW1pUUVFPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb3CBXWZ6dXhxcXpxfnN9a3V9YlJnfGVzc29zc3x9b315b39yX2BgYmJaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQT01NSk5WXllVTFFTTlhaTFNTUk5MUElRUlRZV1dRVFBQUFFLSGZ4bGN4cm1aS01VeXB1bXVibnZQZGVJZnZxbXdvgGpmeHhpWHNSaXttaWp6en5seHp/b2dvWHZ2anV1cIBgc2h8aWx4fG9fX19jYlpeY2RmaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV09VUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExoeH14YHl7c25hXm1vZFJncnVubXlwd2x2dHRxbG1cdH56a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGZlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUEpMTUtMUVFRUFBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ7XVRLbGB2dWtpdXt7bX54a3xwXV5eYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobW1yfGttaGt7dG1ta21PSEpLSElJSFJQTE5PTEtTU1NPU1JXUlZUUFdaVlZUVFRhYFFPTktUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZX1tncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKU1FNUVBPTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRT0pJUVJLUU1LS09SVFJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1FSVVVWU1pRT1NSV1ZUWVZUWVVUUlVUVFRXWFddWl5hXVxaWlxcYGNcXWJjZGdlZWRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkZGZoUEpLTE9PTE1UUE5TUVFNWFhVVFVXV1daVlRcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTE5VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVJVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWl9dVVleXF5dXF1gYV5bYmJjaGZlZGJYX2BiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FbWlhXWFpaWFhWXWpkVlhZWldWVFRPS09WVFBPVFBQUE5NUVFPUVhUUlFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVlZRUldYVltbV1FUVlZWVllUWFdUU1JYVlVaXVldX15WXl1eYFxcYF9fX1piYmRoaGVkYVliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1FVWlVUUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVtbVlJPVVZWW1tXUVRXVldYVlRYWlRTUlpXVlxeWl9fYFVhXGFhXWBiX1xgXWNhY2dpZGVgWWNgYV9fZWVfYGNbWlxbXFlaWVlXXFlcW2BeYFteXmFgX2JcWWBaUU5PTlZRUFRRT1VUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSS1FUVFlaV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlTVFlcVFJSXVhaXV5cYGFgV2JbY2JeYWNfXGJhYl9kZ2pkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJSV1JUUFtdXl1bYFxgVVxdaWpyfXNsZ1xVWVdRT1JbU1JRVFJUVVRLUVdWW1laU09TUlZWVVNPVlJTWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZXV15bWFFUVVlZWVVXWVtUU1ZeWV1dYF1iY19ZYFtlYl9kZF5eY2NhXWVnamRmXl5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWU1RUXl5gXl5iXGFVXV5ia3l0bH1sWlVaVVFRU1xUVVRWVFZZV0xSWlZdW1xST1VTWFdWU1BYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paU1RWWllaVlhZXFZVWl5cXmBhX2RkXV5dXWVhYmZkXl5kY2BcZ2VoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRSWFJXVlRSVFhSU1ZUWFhYXV5YXVtVXl9YX19YXVZRWVRZWlphWVxVVlhbWlpYWVlaWFZdXl9eY2JhZWVcYlxgZmJkZmRfX2RiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlNaVlNcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFlcWlVXVVdbWllcWVhZYFdQVV5bYGFcVFVYUFVXVVNWVlJTVVZaWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVpZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bVldYWVxcXF9bWVtiVlRXXl1hY1xSVlhRV1ZXVlZWU1ZUWFxcXmBgXWFdV2FeW15cW15YVlhYW1tfYFxfWFldXF1eXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgX2VjXWZpZGVpX2ZeY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWllbXFlXWV5gYmFkYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXVlhZWVdWV1ZcXV5gYWBfYl5ZYV1dXlldXVlYVldbXGBfXV9aWl5dXl5hXFtbWltfYV5iZGNlZmVmYlpkZmdpZ2NfY15hZmVaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FiXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNgUlxZT1hXWVtaWVhaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfX1xaXl5gYmNcXFhbXWBiYWNlZGdlZWZkXGVmaGlmY2JiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9dXF5cWV1bXl9hY2JhYV1iW2JkYmBjY2JdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pRWFdcXVxbWltbY2BjYmNgYmRhYGNeYFxeXl9aWFZbX15dYWFfXVtgYWJlYl9dVFxfYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WDgYODgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8fHx7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX18fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiY2NjY2NjZBGKCsrKyolY5KMjI2Njol+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyMj5CQkJCQlDsWGxsbGxRdlo+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXl5e3hub29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fX19dnNzc3Nzc3l9fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnh7eXt6eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp8fX19fX19fHt7e3t7fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx9fnp7fXt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eX18fH1+fHd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d8eXl7fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en97fHx8fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHt7enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGCgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnNyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdXNzdHZzdHNzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3d2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh9g3qGiHl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHh4eXl5eHp6enp6ent7e3x9fnx7e3p7fHuSf4ySeXt7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8e359fJqFkJp/fn1/f398fH2Ag4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAf36AgoGBooeTn4WAf3+AgX9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35+gICAgIOmiZaih35/fn5+fX5/f35/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn+Af39/hKiMlKOJfoCAfn5+f4CAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSkpCKiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgYGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GBgYKCgX+FqZGQool+gYF/f39/gIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChYWDg5aro6Ggh4GCgoKDgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCDhIGNrKmrsKWSh4eGiYiHiIeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEhIGCgpuonaWqoKCLhomTi4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSLioSFpJ2UoKKXoZWDkZiGhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoeXkoOZl46cn5eemZGdkoCBgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg5OpmJSWkKCml5ieoZyLf4B/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDipeIh56rqZ+aoauWmZ+dmYeCgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhoSEg4ODgoSOmYuEj6CioJyfo5mcnZyThIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYycj4GHkZKTlpyZm5yak4OCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX18gpeLgYODjZCTl5ecn5mJgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4t+f4B9h4t+hISDhIKJjpKOiY6clIODgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhioCLhX2GiYF/hoWFhYaHg35+fYOHhISDg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFg4KBf36Ch4aEgX9/gICAgICEhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9/fn6FgoCAgICAgIB/gYGEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4aHhoaGhoaGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgIWFf39+f4B/gICAgICAgICBgH+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjYiBgIGCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmKi4qKiIiHiIiIh4eIh4eIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgYGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgYSEgoKCgoKCgoB/fn19fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoODhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEg4KDhIKDhISCgYGBgYGDg4SDg5GSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B+fn5+fXx9fXx5fIOGh4eEg4KDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4J/f4GDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIKDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDgoSCgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoOCg4J9fX5/gICBgH59fX19fX18enp6gIKCgX9/f39+f3+Afn2Af3+AgIF/gICBgH+AgYF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDg4OEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/fn9/fn59fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/f39/fn5+fn6AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+f36BgIKBf39/f4CAf3+Af4GAfn+AgH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODgoODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOBgoKBf4GAgYGBg4KCg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjISDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GDhYWGhoSDhYWDhYSDg4SDhISEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJKRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgICCgYKAgYGBgH+LlI+Mi46OjYiHh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIJ/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gZSRjIyNjo6KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2MjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36MhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuJhoSGhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fnx7fHx8ent6fX+AgIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2Mi42MioeEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/fn9/fn2DfHx9fXx/fX19fXt8fn5/fn5+f358fHx8fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3x9en1+fn+AgIOHiYmJioiKiYWIkY6MiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35/fn1/gIB/f39/gH+Ag4KAf4CBgICAf39/gH9+fHp8fX1+fX1+foyGfX1+fHuDgn19fXx9fH19fXx9fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4ODhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Jgn9+gpCEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f3x9fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn59fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICAg4F/gIGEgX5+gH9+foB+fX5+gIF/gX5/gH9/f4B/fX9/f3+AgH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmGhoWFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoKCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKCgoSCgYGAgIKBgICCgoOBgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Bg4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf35/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH5+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfX9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgYSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39+f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgIB/foCBfn+AgoKAgYOChIWGhIB+fXx8fHx7eXZ5eXp5d3l2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eX13eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgX+Cg4KDhYeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAe4B+gIB/gYGAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e314d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59gICBgH9/gIB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn19e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFyb3h3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+fn18fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/fn+Af39/f4B/gICAgIB/gYCAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf31+gH9/gIKAgICAgH9/gIB/fn1+gH59gIB/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e45+eHd5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5eXt6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgYKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBgICAgICBgYCBgoGBgIGAgIB/f4B+f31+fX5+e318fXt8fHh4dnh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCf3+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGCgIKCgoKAgoGBgYGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGAgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgYCBgICAgYKBhIB+gYOCf36Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4KEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYKDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgYCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX56fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4OEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgYKAfYGCf318fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgIKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODhoKDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WFhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CCgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhISFgoeGhoSFhISFhIWEhISEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgISDgH99fX5+foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN+g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZzhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fX6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fX6BgH5+gYKAgIGEh4aDg4aEhYSGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxte3l5dH6Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goGBfn5/fX16fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYWFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHh4aDh4aFhYOEhoaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISGh4aEhIWGhIV9d4WEhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGhoWGhoWDg4WFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3x7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+f35+fn58fX1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SGhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aIhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e35+fXt8fn1+fn1/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoeGhoSEhoaHhoiGhIWFhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoWHhoeFh4aIiIeHhYeHh4aGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhYWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx+e3x8e3x8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhoeHhoaHh4WHhoiIh4aFh4eHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357fH17ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeHiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f35+fHx9f317fX18fXp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYWFhISDhIKAg4GFgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHg4eFhoaIhoWHhIaHiYaGiIiHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4OCgn2BgYB+g4F+f3+AfH98fX1+fXt9fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCBgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4iHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaDg4OFgYCBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn1+f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISFhoeIh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3uAfX1/gn6AgX1+gX5+fn19f3t/fHt6eXp6eXp7fHl6enp7e3x6e3t7e31+fX2AfX18fH2Af318hoOFhoaGhoOEg4WChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCfn1+f35+f4R+e398fICBfYGAfX6DfH5+fX1+e358e3p5enp5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7enp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTV1dTU1NTU1dXV1dXV1dXU1NXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXU1NTU1dXV1dXV1dXY2NfX19fY19fX19fW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dPT09PT09PT09TU1NXHt7m5uLi4uLi4uLi4ubCKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E9PkA3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oip8/T0tLS0tLS0tLS0tLUvaCjo6Ojo6Ojo6Ojo6WVU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSko6jP09LS0tLS0tLS0tLS1b6ipaWkpKSkpKSkpKSml1dXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7PDw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsz9PS0tLS0tLS09PT09XApqioqampqampqampq55iYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs/Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tTV1dXV1dXV1dTT09PU09LS0tLS0tLS0tLS0tLRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M/O0NPQztLU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXU1NTU1NTW1tbW1tbW1tbW1tfX1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXR0rmPvtScgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPTo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayUzcGUsJyxlri5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpbCmoIuRw5N9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PD06Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZibnIedutTSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmamJ2Qn6DS08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGaoKGsr5GhudevoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKO7npqtm6nYo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLLxZamxZii0Z6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPuMubnJubrcefodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZGqqauknsW0pKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQT49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQp8+SkKfXuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9DVy73V0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbT0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYm5qZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6OjpKKhoJ6bmZmYmZmZmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoaGfnpybmpqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56bmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmpmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZmanZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmYm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkouQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6JkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJCVnJqdnqiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6KhlZCboKSjmpONiIiLiZGRjpKOi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6qpr6Gbn6Gjo6CanqCclI2YlJigoKGknpuapaekqauvrKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66vqqqrpKGipKmnpqmoo6Kdm5ukoaWoo6CYnZifoaKpp6Cioq6sq6qnra+opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKelp6mnqaijp6aZnKSmoqGhoaGgnpmZn6CmpqOinp6Wn5uaoqKgoZ+hoqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+foKqemZybqqShpJ+hm5yanKCeoZ+enqCjmZabmKSioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirsKmoqqihn6Cnqa2wsq+so6KmoaqyoaSio6uipaSipaOenaCen6Wiop6fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltaYF9aXFZcaGRuY25qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu3taSysbCboqeeoqOjm52cl6KopaGfnqObnaGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eWpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7WzuLKetrS5f52qpKKfoJeVmpekqqamoaSjpKumpZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odWtxaGlpYVlTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW1vLy+vLy+xrq4t7q9tLCsk7G7uWuPuLKqpqafmKSkp6ikrqSrq7W1r7Ogp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrOppYeuwbdher7As6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5rY2Jud3V2bmxbYlFWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6wr56ArbyyXmm2w7qtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbWZudXFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtbuUfaq1pV5hoLy7saCbsa+spKyutKeqqaiqrayppqWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3RrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+8u77EvsXIxsbExMO4tMC3tLzBwrnBh3uzxaJhYYa5u7asm6O3sKastLWsrqWko6ikoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ4c3lmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GycW/w8DLzc/KxsTDw8HEvri+wcPBun18v9WmZGJysbO0qp+ntLKuq7i1s6ypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWtvbnh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczOz8/Mw8fGyMnIyMnHxcnHyMe/xcfEx7J0dr3XpGVjZq60t7fAvr66vbq8urysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGppdG14bF1kW1ZgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzsfMycLCx8LLy8jGzMrOxcbFw8iqbHCy159jY161xMHIzMbEwcTHwby+tLCwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8S/v77Ey8jKy8m8vMjHyc3Iw8jJycXFw8LCo2Vpn9KaYGFevs/Hy87Et7+/wMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2pkYmptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIycPFxMDDwcLBw8LDwZxkY4fHnlteY8TNxcjQwa69vri5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjZGRqYmdjW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ytLAu8DBvLvFvbvBxMSjaWR4vaNbXGvGxcDAyb+wwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmNoamdnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdmKssK7w7W6x7e2ubvApnZyd6adaGmAxsC/u8G+uca8wsC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeHFtZWVmb2llbGhYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNHGdqDMvce3ubiut7W+sZ2FhIKTlXt/mcXAv769vL/JwsfIvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYm1gXFRJS0pESkJDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC4u7K9vrvEtrW4tbfAvsS8wsTYrXJ7tsnPwsC4r7W+v6COhH2HhI+BhJmwwsK/vr28x8bLysTHvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGludG54Y2diXGNRS1RIRUVDSEM8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLq9x8rJwsjJ0pZvcKnS0czKxLW7ya+IeHBlfXmFb3OAiLXEvsG8wL+3ysnFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmBhTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8fSwrm+vMS+t7zBv8jPxsjKysCEcHKizcvLzcrGxcGVcGJZT2xze1dYaHKZv8HAv8SopMjEw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8tru4rtzCvra+wL69tJ6Uoquvv76jdnR3otDJy8jBw8OmeFxNRkFfb3BJRVhhfarFv8GyiJnIw8DIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3hzZ3BdW15dWVJGRENNSUFFPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vIrWyxzb21ucC8pHZqZ2xob3yRlG50eaLRxsjBuL+9h2JMQkE6VGhkRTpOWGiSw8C0kHKeyL6/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f312bHV7cG5pW19gWVNQQUZIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnA0Klyg7S9trW/noRoWV9eS1FaWmtvcn2jzb66ubS9tHhQQFFlQEtcWUc5R1Nce7y5nHJprLy1wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3V2d25xYF9mXVtUSj0/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsuggnaLorCzkWZgZVVZX0tKTU9TbHOEpce7oqOtuLCERUBwllFFUlFLOkpSVWyqoX9kcravsry6rru0s6arqK26vrjLwr++rKuwr7O7t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVteT0hCPz1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/FooZ5dY2ijltSQVhUR2FtWVNHSWONo6rDxpmEkKOwpUJHe5pfQlBRTjlTWlJhi39pX4m3payzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTkE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4wrCOf3iHjmhOSUFrV0JPdYWZcE1DVn2wu9GuenaCoaZGSGh3WEJYWFs8VmNSWm9oYF+hs56kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c210aWxdW2pUXVxQTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7izkoyIg3dVRUBUiVZKSlN1i39iQFmpubLHz5JnbIOES0ZTVUlkkZ+pnpd7UVZeXFdyr6ehnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yuqeYmZZoTD9ggGpOSUlNZ5p/VkdZrbqxr9K6clthZFFFUHCVqaWempyen4FUUFNTlK+fp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6ajm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXFFoVFBOR1BNTEJPUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Bqaa9YUJco31PWklLYUtbiWZtc46vtam80pdVT09QbqKwp5yPlZGOl56ijlNJXKWknaiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mbpJmXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFVRY01KSEdPUk1KTkc8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCrxcDJlk5Cdp1rUXFMUGFnd3BfYGuBmbCwrsa6XT5glKWemJKMj5SVl5ebn6aLUHKgnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJSVWBISUpLU1RJUlBMOT9BNjc8NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMbGhldSTWSfXm59dXlXUWtjXmpnbHiOtK+0wn+EoZ+dmZSXmZiPjZCUkIuNkIGKoZ2Xo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKqyrqKZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKT09VTFNMQTc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo495V3N1cnRpX3JuWFldXmRnWWJfaKyuq7Coo5+ioJaQk5ugmpiWkZKem6Glm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWp3dV1sWlJgSFJVSEZVVkpCTEc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCifm97aWBjV01bUlVISk9VUEdSU0qZrKqppJ+fmZKRk5iYlpWUi4eKjZSdnJ2dnpeemaafoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+np6Wkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOfnIhfVl9mX1VMTEQ6Pj5CQz4+Q1N4qa2pqqWfnp+io52enZqcm5OSlJOdnZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6mzraqzta+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3RycWhWXFFGVEhESlBJP0VBNEZIOTU7PjY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5N7YGBmXk5ERTxKRUg8Pzo2Tn6qs6ejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMrJw8HGvrq0urq1u7ewtbKqurKuu7e/u7qquK2rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFNNREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdnJl7cmlfVExEPktggnNlQj1cjq6soJmbm56emZeXl5KMjpaXk46NkIuCg4J3cnFtcI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczR0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfGx8XBvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8w8LCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREVQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaGRbU0hDQEBNkKewnIOgsq2jnpyfmpeWlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LV1tPUyMzGzM3J0s3O083FyMrKwcbLx8nIxr/Ds7PIxMvLy8/Gyr++v73Bx8TMzMjJwMO/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2BSS0hEQ0BGWLbSvLKvppycnKCkoZ2alJOVlIl9d3BrZWJocW9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLV1tnV19PX2M7Sys/RzM/QzdPQv8jHysTMzMzOz8XGx7a/yr/SzczPxsnIv8TDyM7N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTQ1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWfoqFZST9BQ0FJU3yyraaZlJefnJqgoJ6bnJmViXdpY2BfX2BfXl9fXWJsdXRwcG9scnF1ksTIxtTW19fX09bQ1dTa1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0svO0MHGw8jGzs3R0dLJzM3AyszG08/MzsjEysfHyMzK1NTR1c/SzNPCucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaOrZ0M5PT5HWoOrp5+XlZeZmpyfnZicnJJ9cGVjYl9fYV9fYWBfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY19fLyM7Eyc/NyszAysDIys3O0MvQzs7Mzs/Iy9DQy87KwsnHyczLzNLTzdPR0dDQyr3IubCuu7i1qrawrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramksHpLSkU/Wo2hm5WTl5uenp6ck5aXlIhrXl5eYWRiYGBgYWBgYV5fX15cYm1yb29zdHZ2eaS+zNXR1tTT2NbOztTLzs7FzsrS0s/Hzs3N1MvO083L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXMwsjJw8zDxcjKys/KzczQzdPLxsjPzMjHy8XGwcbKzM3Q0cbQzs3NzM/Fx8G4ub3Dw73DubKyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYZ5cXJrbWdgYHBoWVhoVkxGTElQUUI7Qz47Njc6ODo6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKigrpN4cnZ7i5WajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNiYF9fYGFhYF9dW11ncnJxcnNwbXJ5pMbTz8vQz9PUysXJycbGv8PGz87HxcfNytLIy87OxtHS0M3M1MrHy87PyMfP0svRz8a6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL/Bx8zMzM/CysvIx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7uto7Z8ZoODp6yTjo2Wj4WDg4OBfYSEfnNgW15eXmBeYGNkY19cXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jLycjKyMHFzMbIy83JxMLKycHCzNDFy8i/ucG7xsi+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xr28wMPFzMXFvMDKwsXH0sXAyb/KycbIxtDDw8bDr8TLx8TKt7+8urSprKSlmJ+YrKOhpZujoJuUe3dydGZpWmFubFpcWFJETEZCR0RMREZTQDU0MzM0Pz0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sa+1a195f6aQipKWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgW1xdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjBwcHFvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7u8bDv7zBzcPGvr61wb3Dur3Gu8K6s7zFxMLCt7+1tr6/u8zDvLW6yLq/vsvEwcbCxcnGycbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys/FycXHwbnFvautpF9ldIeTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNhYWRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvczAw7rAuK6wsaeqraynuLS3tLOztLu1vrK3sLWvsrzCvMHEvMC7tbK6vsC4x7m0u7bBwry4vcbBw7u1r7K2ur+0xLe7tKu4vb3AvbG6trC2urPFvLauu7+1t7TFvL7DxcDDxcbIy8XAxsa7x8vAz8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcXAv7q3ybaqsJhbaHGMj4WIiXp4foaGd3eBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpcW11fbHBuaGZrbW5yfKTHv7m4tbCrraeeo6qnnquts62qrKm0rrexs6mupqyzvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLCnsrO1u7yrrrWmrravu7Kwqrmwrbuuu7i7wMC+ucK/x8PFwLzGwsjKuMXHxr/HxMO6xMbCu8bJzMuzucK9u7OJc3Z2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXQx83Bw8a/xMTDw8rCycq/wLzBurO0tcOuqbCRXGp+koeOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNhZGNiYF9dWltaWl1aWlpaXGVub2hmZ2lrbnGBrbmwta6mpainmqCloZqcpayupKiiq6qtq7Ckpp+qrbW2sb25r7evqK64tLS8uLS8r7i5tbK8wbLArqWpo6uxsrOovaqrqKutrbSzpqitoaSvqbKmp6iupqi3rLGyt7q6vLG8vb6+xL+1wsHHyLe/wMW3xMO/u7/Ewr7EyMzKv77EwMCph3N0cmppXWFvY1dWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HKvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairk2VsiIOHi4B7fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWppauloJyipZSepZuYkaGjqqOjoKWmp6atoJ2cpKatsrC2t6ewrKiqtKu0urG2tq62urKvurqxtqWgpKCmsaerqLmqpKenqKeyraCnpp+bpKasnp+npKChsa2trLK0s7Swtby2u8HAsrq+w8GyubnDs8G9v7W4vL2/vMLHxMPDvsDEoIN4cGxiZl9rb2BVWV5ITmdPVEdFS0Y8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo2Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9tqCelZ2hprq2q7Ozu7PEz8nLwsa4tsfAzL+4ybe7xbizxLizv8CstbyyrKWvs62ho5JpcYaFhoB8eXVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1vh52poJeWm6KWnKOZlo2foaOnnKCgpKWip56bo5ugq7CtsbajqaqqrKyktLmtt7Css7Wus7WusKqfnp+korKkpqm4raKmpqCorKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2vLy6q7OzubO+tLaysba1v7a+wL3Dwbu7vZeEenNsX2VeZGRYVFddSVdcS1BHSUpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4uL+3ssK0sbu8q7m6saKeqaunl56QbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3GNp52UlZWbmJuil5aRnKKiqJ6cnaWnoqWcoKGbma6urq6yoKairqunorWxsrKsqK+zp7qzpragop+co6Gto6Kqtaqio6aepaajlpmel5mbnaCal52dnZytoqunpKSmrauztKq1sLOrsrm0r6qvsrKzuLOuqayusrixu7a6vb+3s7GUhXl1Zl5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLMyMa/xbbBwMbOt8DEvbO5ubO/trG5u6yytK2emqSpn5Saj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGck5WQlZeXoJeZlZegnqGdlqChqaSfn6mdnJqrp6+wq5ujpLiqoaCuqLaqp6etsaS4sKS3oKObmZmqpqGarLivoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK6otKuqp62zsKWrrrOxsK+ur6aoqLKtsbSwvLS5t66jlIF5dWReYVZZWFNSVEtNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2nqKOqu8C9wLmutLjBzMfFwsO9xbjIy7LBwsGtvLu1u7y1ubmwr7Cpm5mhqJSRiouAgHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmmBlpOWjJKUlJuZnZaWnKCcn5agn6empKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsa6stJ6hnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJOXl5iXnqecp6GimqSlpaukpbCnpaOrq62mqa6vrquoqqmzpqasr7Sxr7y1sa+voJJ6d3JlYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxce2xcSywr/Fq7e3vba9urq1squsp5iYn6OLiXSJiH52bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVNVUlVgYF9gYV9hYWNlaoCUk4qQjpSTlJ2VlpekmaCXnaCloq2mpaWjo6Kcqqulmp+lsaqgoZ6lq56oop6trKmprq2ioqKVmKObnJCrqbCcoKKfnpeZk4qekY2Sk5aQmJiUnKGjnaShopWgoqSmm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5uq+prJ6McnFvYFtXVlZSR1FPSFpbT1JKVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6PDw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb7DyKyxuMG1u8C7tLSqrKaVmpuciIByiIN7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eX19fYmRtjpCEkYePkY+ak5WTnJujnJuhqamrqKynqaakmaWvpZWZpa+qoJyZm6Cer5mcq7Ogpaafo6ShlZOblpaSqaqtmpyfoaCblJCMmY6MkYyRjZaVkJ2ioKOdnKOVm6CjoZeiqKOiqKugq7Ckrbelo6Sira2qqKuvs7ezvrWyq6+YhXRzaFtZWVNVUkVYTFFbWE1UTlBMUFFJTklCPT8/QT89NzU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1NzY1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9u7O1pqmglpeYl4d6dIB2d25taG1tbXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH6MgYt/i5CKko2XkZeZoqCboKuqpq+sqLClqZqfraCVlqSpqJ2YkI+anq6XmKiqmZ+dlKWhnpKRkpGTlaeqpZqZmZ6elo2Mi5OGiY2Dj4uSlZGgnqGkmJWflZqhop6Um6Wlp6iooLGxprG8p5+jrLWrrqewtbC4tcCxrbGrkX5yc2JWVFVOUkpHVlBSUUxMV01KTE5SR01LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OspbG3qqWisaudqqepsrGktsa0ubqzysW5usHL0Mqxtri7vcHDsa+xt620s7uzs6KjnJ2Xl5SDf3drZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/dYmNh5CKl4mUlJibmZ6pm6CrpqasnqiaoKack4+fo5uXl4WEkpujkJWjnZaWloiim5uUi46KkJqkp5yVlZebkZKHlI6LgYuNgJCKkpKSoJqgopaUmJmVoqaZjZmkpqimoaC0sqeyt6Gcoresqq2ksrKmtby1rKuxo4l5c21dTlFRTE9DTU5OUEtGTk5KSk5NUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKSnpKqloKimpbOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq26r62fmZqdlZSHe4NuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW9zdnCEiIKIgJGEj4uUkZSeoY+bnKOipJmll6KclY2HmZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4mYn6OekJOYloWNgpR+fnSKjnqQh5OQkJ2bmpqSlpCdjqOjjomaoKGjpJuitK+sr62fmKW4pqaxobCunLC7qqmvqpmDd3NjVk1ST1BOQ1NOTFFMQlBRSElOUk1ISkpESkxGSko9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWnpqezp6W0wbiwtLDJxLe5wc7GvbOsusGrrcOtp6Gmkp2mtqyjn4+VlpKPfnh+ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11pbHJsf4V8dE5YcpCDl4eOnZeLlJGfmJ2VlJaVj5aJgJOKXztXb3yMlImAjJKMkIaGc4qFl4F5gXuGk52Tg5WOkZCDhn2TeHFwhY19iYGRjY+XmpmTi5CJnYifmIiHlp6aoaCXp66pramonpats6KmrZmsq5ios6KpraOTfnJuYFtOU1JXTERUSlBMTEZOT0lFTFFNS09KSUxQRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepqKOqsKintMG5sLWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm7CimZeGlI+Lh31zdV1QTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFFCQH+VkpJ9iZWNhIqNm46WlYmSiIaVhnmJf2BKUW54i5KEfYSNioV/f25+f5R4dXZ4hI2Zb1GNiIqGe354lHZnd4aIfYqJlYuNkZKXjISKiJWEmoyChJKalp6dlKSjqKmlpJ6asKuhpKSRpqqWoqqcoqaoiXVtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+hr6GnqKWnqLCtqra8tre3s8G7tqe6yLi2qKi1tqqyvKaelY1/iZOolpWKfo6Dgn14cG5YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXFWPiZSJdH+HgXyFjJOCkpqLj3uGj4B2gHhzb3ZwdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gHZycpJ3aHWEhISFe5WKiIqNi4B/hIuMgJSDfICPmJSclpGenamen6CdoKmln52YjKekk6Gglp6fpIByaGFcXUpXUFJISlhST0pMTVJKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlraywsqq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGNlIGOnI6Rf3aGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfHhmd42XmI2PfWh5gXZ4gImQfYSYkoFyh498d3tva36tfHOQin97hpKBfX90ZnZ8hmxvaHN9iYyIgGx5cX1xbXaPcWhxgX6OcEOLhIKDhX93d3qLhX2Me3V+jpKPmIqSmpujlpmdmp2eoZyWjYqkm46el46WmJB3b21lYlpYWFVRSlNVVE9QTlBWS05LTk9KUU5IT09MRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mOhZJ5iI6LinVxfG11cGptalhLRkdFQUBDRElMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnt9fnt2b3RzhYJ5gXlwfI6MipSDlpeYmpCSlZeZl52WjIOJnpGLko2GkJaAb2pub25YVlhUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCjrKqota+urLS/q7zCv6aimZWkl56NhIuUoaGYmJGTi3OOeoCGjIV0b3RrcWxkbGpZTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX9wbX96i4l2goiGdGyakXRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxf3xocXF8bpOOj3xzfXxxcG52bYJ/d3l1anmJgoiJhJaSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFFaV1lZW01QVVZZWE5JSEVKSkhHQkBGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfp7uvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4J0h4yGenBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiYBnZ2JqbnJtcIN1aW9YdXCOm5J3bH96fW1ybnCAenN2bmJ2g36GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2Pe3JwcGxgW1xeXFlYYV9STltaWFdMSEpGSkc+QkFCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ2kp56vlaW1qq6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+FdYKEbJWIiHt0eHhsd253Y2leSVBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgYWZhJucYYaqn52Lg5CNeneIfomIjXOKl5CDel1kcnR6fHeKbWhqYnlvhpCCem6Bd3SEenB0eXdrbmldd4d8h3yHh49/i5KXg42FjIZ9cYR/g311d3t8iXdwc3RlZ19bW15UXGdeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnJ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF/cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxyfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkqiHgJiYipt0bXyBhod9jmhnaHh/boWHgoVxhIZHbIB3cnl2aG1rX3d9g4l/iIWLepWdm4mLiJF/enWLdnx4bW93fX90dHJsW11dW2NjWGdmXFVPUFZZUERMS0ZOSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiJGBmpWCoaGYlZuapa2Tmruxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYqQiJBpaG+DgHSMh4SLcYWCd4d/e3aFfW52dWaAlI+GiYmHiIehqqKWiY6Yf3qCiXp5b2dreH56fnJqZF5aWl1qXWFmYFlPS05XUlFIUEpETkdDSkRCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc4Oz0/QkRISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2aj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPoZ+TmJKEi4WPmZGWbHB1iYuCloyNj3ePhHFthYGKlpGDhYhyiKGWh5OJjo+WpbWpm42VooOHk4N9f2tqa3yAgYFzYV1jXlpma1xsa15XS0dPU1FOTUxGSVBDRE1GQUNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+l5aalZ6enKegqZaTmJ5nZaSafoSSkXmAkoiQkn2KhJiSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0VOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZyopaKZoZeilZ2fqJ6oq6CorKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlaKamnh6fpSYkqGSlpiBlJ57d5WSq7OIjZeffZSenI6Tlpmkoqa2sJ2RmaiIlo+NgYhsc3J8f3xxaGBcYF5iZ2NgaGdbUkVKS1BPSUpMRkZNQ0hMRkZDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWDhomBgIZ3X2JQNDYwLTEvLC4wMC8vLi4wMDE1PkFBTVFSU1BSU1VSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYaQd5WLo6eqtL24pK6srKeotKuwtrKyrbuxs76cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKOXgaaZjaKqqKSIhZSkoaCqoaSpj5yxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilKSqiJmJkoqVeXp+hX5nYGhcZWJdZGNfZmZfWk9DSUhUT0ZITEZKR0VGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GPg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS4tMz9EQU1VUVJTVVVXVU5bUEdHRTw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqscHHw6qzxbass7+zuL62v7TBtru7pLjGqLbJx7W+ubSoo7StsbGbmZKan4mor6ullHafpJehq7GzmZaqraiutruyuqyvtaKxrLG1vLe1rrWgp6ejqJqpsK2yuri4p5u2qYyljpGTn4Z4goN1WWFkVmVhYWNgYWZfW1RKREVMVVFISUpESUdFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFjZFd5dXGBlH2Fh5N2hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjYeEgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6Ppa6jsbTDtrjBzMm2u8S9s7PAt7fBtb+wt3Sxs6a6xaSwxrmxs7G0qKS1tqqxoKGWm6KSpbCupq2rp6SYoKyzuqKpsrq0u77Mv8XFvb2zwre6uL+3ure5rKywprGqrb6wvbvCwqyZuqiUro+Xl6uJfYJ8aldiYVdqZWplV1tkWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVVadmpwf4+EgY6EbnpzeYdiuKGZo4mVk5aTlJONkJaSh4Z7hoGNloqBhIGKenyKh4Z8ioOBioOVfXh6dWVPXGRHRUw6UWNhW15TRj87SFBEWmNRUVlYWmdZVGBgTVNQRUE/SUpIRUZBQEM8RTZCPkhHSkxTWlRdk6+4tbq5yb+6vcnMu7zBvLe1u7u3vbS6scZhdbKlsZqeqr2qpairqqOisrWhq6ielZafmJ+upaempZ+jlKKmsbSnsrK9tsG908nK08bCxcvBysPAvr2/u7y3tLC5t7bDusW9w8iwnrmqoquOpai2iYB/cV9iYl1XYV9oZlJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdsbHGQjYWQc2xycnOI1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKf4N/g3h7i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV9uX1hnZVVZVUtEQUtLSEZJSEhHQkk5RD9IS1RUVlxaW5K5wLm9t8bAurjKy7q3ura4ubK3tbSutraZZHWonK1wXqGtnJigopuknqqllKCfkJSOlpiXqJ+ln56amoSknaylqrCst7C9udTRz9fPyczRzM/OysbAvsLKvcG8wcDExMXKv8jOtKS7sLSvm6u5vJp/eWxdYFxZXmFZY2NRXGBTUEtDQkVHRTxART5CSEJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KQlG9sb3V1h7OsoaGfi5mcmYyNlZGbkoWKin6Ih4yQi4l8gYRze4qDhXuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJetpLyIh2dbb2hdWlpUSEtOT0pLUUtUUUhMQUpHS1BfXmJmaWGXt8ewubO7vrWxxMe1sLmwsLursrGnqresjbannZunmk+anYyOoJaRppillYqTk4mQiY+RkZ6boZealZaHnpqmm6yvqK+ns7TU1NTW0svP1NXO08/NxcLJ0L/KycrJ0sfMzcLQ0riww7zEuaW2usSigm5jXFxeWGFYWWVaUV1XT09CQkhFQkk7QUQ+QUc/P0I3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmIJocW95eYOgqp6ml4ybm5eLjpWRmo59iYuFjoqKi5CHfISCcH+IgYZ7h3KDkouPfnF4dWtxeH5xe214c2xpgXBtY2lucHhpd3x+y7/C36dtY3huY1thYEpQUlVOWV5QXl1NUE5UUVVUXG5udoJyl624rLSnsLarrLzAsau1pqS4pquuoau0o46xrpqYmIyRk5GEjpuBjaeSnImDi4SKiYSLg5OVmJeTm5GcmJmZnp6rrKSnoaytz9LV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbFwM7Hx8OovrfQnnpuZV1iXVdgU11bT1BUUE5IPkFGQUJFPEBCPkVEPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bHdwfX5/oZ6eoYuNmZOTjIyTj5aFeYWPkI2LioiRh3+Ce3J+gIGHeYR1hZORiX9vdnJrc3x7d3xzgXdxa4BzcmhvcXp5cnu+y5t+jLKDdnKEdmhhal1DWlpbV2ZkWGVrU1hdXWBkXmN4e36LgZmqpKShoKGopqqwuKqltKOhraGjraKnsZ+JppqUkpGJkY6IgZSJa5WijZmEgIV9kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMjOz8jCy9HU0dTTztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMTDy4tzb2JgX1hUWlNcUEpHSUlKQDs6O0VCRDxCRD5IQj9CQzs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3iElJmKjYiIi4l+gnhze32Dh3d/eoeRloCDbnhwbXV/dnh+dIV8eW2HdnRufXaEdXl7nbaMPEGLxqV+jXxpZVZJQ2ZjZWNoamRveFtfZmlrbmlugIOJkYudnqCdkJeYn6OkprKkpLOgoaWdoKmgorGchp6SkpKQi46LhoOQhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipqRqrOYmpunnKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1b/LzLR4dm5kXVlSVlFaVkZHSkpFRT06NzlAQUI6SERARUNBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqBh3x4hZaWiI+Dh4WHeoR5cXp7hIZ1eoWOjZ16jHB8b296f3F8gXGDh4Fujnp1d318gnV/fIeIsHRZqcK2jJKCcG5iPV5ocnBxcG54d4FlaW9ydXhye4uHjpSSm5WglYeMk5ugm5+qn6CtnKGamZ+lnp+smYuajJGRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI6UjIZ7m4iTj66qlJWXnpinrrW9qa29xsvIyczLz8jD0crU1tnX2NfU29fT2dvWz9va0dbJ1MuVeXtoaFtZUFJUXkhDRUlJPkE+PTc6PT87Pkg9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEfoN8fISXjoeLfoaGgHeCeW57e4eBdXqSno2gdo91gnR1gX10gIRvgY+Cb5KEdHyBhXp2hnuJt8alwsm3gZabj3dwZU5mY4F6gXeGopCLeHl3e4N/fIR2bpSWlJWPmJCDio+WmpeXppyXoJefk5KXo52Zq5aRkIqNkYKMhYmIgYWQkZ6cmYmFi4GGmHqJiZ+Xj4iOiouCfKGJkIu8oZiTl5qcqaalrp+otb7AwLnHyc3Oxc3K0dbW1dnV19vU19na29fb2tnYztzGhnp5Z2hlYFRXVlVNS0RORDs8PTw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eot8foB+f3yFe36BkYmEhXqEiHt1fXRufH2GfnR+kp2RnoOSfIZ+eI59eYqKboKagHSYhX6BiYV8fpB6j6mPkMOgvIyco5x9iYR9iXOMin5zppqcmJSFe4+QiYRoR3GhpJ2Mi5CShYmLkJKVj52ak5WRl42MlZ+dlKGUko6NkIt+kI6Oi4SIkpaan5+JjJSSnpGCi4CmmYiEjoOGhIClhoqLuJidkZWWoqehnZ6do662urWrv8bK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h4d2tpZFdgW1RQT0hETEI9PT45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97iHt8e4uHgn51g4Z5c3pzbYF+hX13hZuhm52UkoCLiH+Yh4Cckm6HqIV6oIt8kY6DiIScfpqRio2jop+QpK6gi5GLhYuBkoZXcq2Ln6ubj4OYm5CQjlyCopGCjJ+TlYyHiIySk4yUlJSPjI+KiJabnY+VlpGLkpSGgIuIko2JipyWmaOjhpKdlqGLioiOnJCDiI+Ag4eFpIaMkLOYnZKUl6GhnpmSnJ6nsbispbzCx83Hxs/Mz8zO18/R1K7W1dja2Nra19bZ2p9vfHRnZ1xdWFNXWENASUQ+Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTlHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDb213i3h5f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9f5Kmo5+lopaJnY+Ul4uKqJdyirKNhKeRhJmThZmLopagmJOJm52hkqmvn5GUkI2NiJWLbo23hZrEyLKcoaWbnJiWkbKRZKTNx5aPhYeJkJKNjZOUioWKioaWmpuPkJSThpWXhH+Pi5mIjZCql5eko4iZnpabiY+Hl5eKhI+NgX+Hj6WJjZOpmpeTlpmhmZ+Zk52bo7O0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oY19dXk5KVFpCQUdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj46RU1GSFJXU1JCY4FGdYKPfXxtfoh4en56gYGDfnZ2gIN8bG6Lf3l8eHh8hIeLfYqjs6ejqrKhlqefpaSWla6ig5C4lZKzmY2hoIylm6+jpJ2YkKeWp5mtr6SXlJaUkIuYmZagwI6kybirm6KmrZiRm5yynYaFqKKcmIWIiY6VjYuTj4iBhoeIk5iUjIuTk4aUmIaEkZCcdJGZs5aXpaGInJmTj4qQi5eaiYqWjoZ9jJieiZCQnJqZk5iYoJSgnZWfm6GxrqKkt760xcfEvcPDv8bNysnSp87N09LQ1tjT0Ni7cnl2XGBVX1dQSElORUJDRTU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1NjY9OkpGREdOW1xZSWZgO0iEi3p6boWGenyEeICFgX5weHx9fG9yjXp9gXt4houJhoOSp7utqLK9r6Wts7Ooo6KwrIqatJ6juKSVraSWqa23pqSjn5mpmKmjr7CqmpiclJWRl5+Xmbu7rcmhaba4q7CUmJ6jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHk5eMkJWNi4yXmJKdmbSXlquei5uUko2QkoyZm4qSnpCLiZWgoY2UjZianZOcmZ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8jC0aHGyc3NxNfW0cvToXB6aF1ZU15ST0ZEPjxDQUI4Pzg3ND5GPDw2PDM1MzQ1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBicElAi4p+gXOGh32BiHWCioN/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7aMqLKurryqm7ukqK25uKumpqKho6Oor7Kxq52cpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIecrL2wg4yMi5CDj4ORj3qBh5CMjpyIh4+XjYuVl5SRmpadp5qxmpGsnY6aj5KOlJCQlpeOkaCRiZWbo6yUlo+UnJ6UoJ2bmKChlZqep6ekoqSwsqbBx8OvsLq2xcTCvs2nx8PHw7zV0c3Eyoh0c2JcWV9bTUpCTEBFRz9BP0I7OjQ+QTw9NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uGg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlae0xsm/wszBw7nHvLqvq7m7l7K2urLArqXApKuvu7yqrauiop2nqq60sKqbn6qboZuVn7C0p4uiurq1wburqZyypaSolIWOqsPEpIKLj4eIhIaVlI16g4yRjpGhjIyUkY+Jl5+Xk5mVmKagrp2MqpyOlo+SkZSVjpCVkY+hlIaXn6CynpSalKChmaSfmqCcoJSZnqakpqekr62lwMTDrqi3tcnDvrbOssS+xLyz0crIwrV0eW1cWFxpU0xIRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk1lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoKQeY2hlqiampi6vsjIysHSycrCzLzBs627vqe6v728xLeswamssru9qrCpo6WjrK2zrba1oJ+vnqWimKO0vKmbqLzBo7a2r6uSsK2rrJeGmqqmpZGCjJOllYmAdYqSeYWNkpCen5OPlIuQjZSjmZeclZSjn6qfkaWajI+PkJWWiHyPlZKSo5uVoKKctaaQnpelpKOlnp6mmJ6Vl5ulo6moorKsqLzAxK+ls7fMwLmuxLO7vsK4rMLDwsCYbXlhWFdcW0tLTUpGRERJQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djZeOnpKJin+Jn5OEd4V/lX9/kIiKkH+VoZqupqOYwr3Iw8fF083Ozcu7wbevur20vMq8w8G1tryts7+5vK6vqKCop7atramxt5qeraKnoZ2rt7eppa++w7G9ubOnqrSzra6WlqWsqKCRjpKxxaeVjnyRlX2HkZiOqZmYk5OPk5WTpZ6TnZmToaOinJifmYuNkI+eiFqQlpeSlqWZZZijnrKllqKWrK2rp5ufppeYl5mVoaSppp+2q6m6vMS1pbS1y8G4qbassrq4rqi4ur24g2xuWldUVU5GSlNOSz9CSEVESEdHOTVGTTs+Nz5BSi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZCDh6aTiIGHgpyEg5WQkJSOmqKfr76uoca9xcTGxs7OztLKvru1sbq7vL7OtsS9t7m3srK1s7izrKacq6u4qqinr7CXo66kp6SktMCwqqy0vsK5wLmzp7i0uLKulaWtr66li5OVoY10wZp+l5mFjpaZirGVmpmVkpOZmaajlZ+blpqpnZyhoJqLjZCWnWBKlpyalZqlllSWsJ+vnJ+llK+vrKaaoaaUk5mZjp2gp6KZtKmqs7y8u6uwssfAuKWrq62xsaOhsrK0pHFuZlxaTlBLRFBQUFE7R0pJR0hCQz45S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkiql5mgoqivmZGXh4unlo6IkoWfh4Sdl4+eoJqjpLXItKnGusPDx8rIyMzNxr66s665uMDBzbbIusG5trqxr66ytKejm6qztKqopq2smaSupaSorLq/qKu2t7/Bv764srLDsbm9rKOutay5poicmKabdr+ghZmdjpOZmYqul6Gcm5eVm5+hqZ6ooJmaqpqip56YkI2RnYNudpKimpWdop6QrbKjq5WoqpirrqWkn6Wpk5KZnIiVnKKel7Gmqau6tr6zsq2+ubago6eopaecnKypqYxjZWFfUktNR0hOSVVMPU1ETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5ScoZ+7r5mUnoyTqpuRkpOJq42Hop6MpK2Uo6O2xr20wbrCwsfIxcLNyMK9ubKvubTAwsq1xrHBvLS6q6itrLCjopmqtLqmqaarqp2or6ejqqq+vKesvLO3vca8t7W4wLG9wLOptbervqWPo5eRop+8n4maoJmWnp2Ot5+pnKWjm5yhmqils6GbnaacqKqemZWPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6yenqSjqZGVlaCDkJ6fnJappKKhtLW7ta2otbKznpyipZqXlZmqoZ53YVxfXUpIRkdNUUlNRUZHQlJMSUFFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+fw6ybl6SXmamclpqaj6qWlqemla2tmaGrtsTCu763wcLAx8S+zce7vbmyr7izv8PItb+vvLa5t6ajqqytoKCaqqrEoaSoq6aeq6+soqmov7imrb2wt7bHtrW5uL+xv8G2tLO0r76jl6OWk5uUraCRoaKlo6OfkL6lqZ2prJ2doZumn72imaOfoqmroZ2WjZWek56Hj4WNk56koJ21rKaclbKnmbCon5qqnqCNmZWfhI6hmpuTpaSamKyxtrKqpaqtrJyYoKCSjpCWqZ+UaGNZYV1OSUdKTktIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV0yimqOcnsWsoZ+snZyuoJOjn5eloKepq5e2sKKqsrXEw73Atr/Cu8jCvsrItri1tLCzs7fBxra+sLi0ubWfpqyqq52dnqWjwaWgqa2gpKmtr6Kmp722prG8t7a1w7Kzt7m+ssPAt7ius7W1o52klZGToK2gmaKdqairo5rDramerK2bm56ZpqC9op2lmKurrKahmY2an5KeiY5Xf5aepaGguKqnk5i2o5+zoaCbr5eejpmUnYKOn5eWjqKklZCmrrOrqaKipqWVlZyYi4+Rk6SfiWJlWmNgTEhKSk5GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmZ7Dp6Wis6CcsqeTqqSgpJ+tqaydu7CorLWxx8TBwrPCw7zGw7zEyr2vsbatsLSvv8W1ubGwubWsmqiwqamanaWhp8Ksm6yxnKqirrCppKe9t6a3uryutsOts7PCv7LGs7q3rLS2raqippaVlKOsop+fmqirsK+vvLKmoKmpmZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqKfp7Smp42YtJyjr5qem66RnpSXlJqAkqGWj46foZOLpqywpaeinKGekpKak4WLko2cnoBiZltnZUpJTEpSQUNASUc7O0c/OTlOTVVeUlNKPk9eXT1IUEJMTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugw6ikqrKho7WplrKrpqKksqyuqbuyrLC1tMa/xMS1wMS9ycS1wMjCtau1qLC4rMDEtLeurLa5pZmrsauqmJ+ml627tJuosJutn660sqequrOnurO3srjAqreywry0xae+rq23taqorKGXlpGmpaKjmJilr7iusrW2oJ+opJmVlZOkoLeipaaWrrKypqqmoZ6bmpqWmKifoJihnq+yoqaNl66ZpayXmp6lkZuOk5eZhZaflIyQnJ6Ui6mpqqKnoJmeloyOmZCChpaJlJ95ZGlda2pNUE1OVD1DQU5DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlVlXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzukpJ2hpr+mqK+voKm1qp25r6qjqrS3sbC5t6+2uLjFvcPHvbzDwcbAuMHGwbqqtqStu63Bw7i4qq2xu6KVrbCtspalp5Cquamgp7CdqqCwtLKqqba1rLyssrK5t6y5sMK6vb6mw6uwt6+pq6umnpiYq6KioJGYobGvs6uxupucqaCZlpKXpqG3qaWjoq+xtKuyqKufm6Cgm56lnKKWnaOzsJqfkJOlmqGpmpWin5aYiZSYk5aXnZOIkJuZlI+pqKefo5uXm5OHjpmLfo2WhY+ba2ltYWxuV1BRWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aZF5OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oaqwqqOxuKmltLKroa21va+zuLy6vba2wMK/ycS5xMHAwLjEvcG3r7Woq7eyvL+/tamusbael6utqK2Wp6iOp7ufpK2znquisbCzrKm2tLW9ra+xtaywtbHAusS2q7yvsbirraqjsaaepKqgpJeQmZ+zqrOqq7OanaebmpWNoKaktK6noq2trrGns62yqaScn6iknpWhmJuotamXmZKSn5meoZ6RrJ+YmIWVmIudmp2Tio2Wl5qXpqWjoJ2WlZeUgY+UhXuPkoOMlmZscmdwcl9GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJgUEtNTlhXWFBKVlZXTT1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSZoKSst6SsqaWurrapr7O5pqawt8W3sbe+wMG1tLrFvszFucK/ur+5xLjBubK1rKq6tru5vrWqrbG2mZinq6qrm6yrj6u9nqyusaOqn7Cts66utrG5t6mtrrGota+zu7zJsqq1tLG0r66nobOgmqitoKWVlZqZsqOtoKavlqGkmpqSjaKlp7KpoqeyrKq2pa+xta+kmZ2tp5qYn5mZrLijl5OQj5icoZiXlKyfnZSBk5mNnZ2alpCKlJOemqWioqCZlZGTlXqLkIZ7jIqDi5JrbnhudntgRWFqWUlIWVs9e0pHRTZBYlRpW01cYUpbXVpSUlJiYExLRV9gYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENeUVwuKkIvSkdQW0gzY1lVS0SZlqCwqLKpraWjrq61qbe0uKOrtLfJu7S7u7++tLS3w8DMyLvDvLa+vsC4v7yxva6nurm3tsO3q62yuZWXpq6rp6OxqpSvu6StsrKnp6Kys7CxsbWxuLOprquxp7ivtbTDxbaptLWrsK2qp6O2n5+nsqCklJuZlLKep5ygqo2po56blpilpaW3p6KytKynsaetsLWspZmgrKibnJ2blKm4nJSOjouZnKKYkJemoZ+Wg5KWkJ2cmJaWiJeQl5uonaSgkpWQkJZ2hJCHe4WBhI2MbnF3dnx+XEtlbFxLTmNcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydGYUxWJS1CLj1FTVE8M3JrSkRDkJmlrqWtrqunpLCys6q3sLafq7W5ybmuwbzCt7OxtcLDzsW/wb20vb+/ur+8s8SoqbmwtrbAva+rs7OcoKewraWmsKWesratq7KwrKmotLmstLK1rbSsqayorKm5rrGxx7+4pLmvqa2tpqitsKakpK6jqZydm5qwmaKjoqOQrJ6koJ+iqqamuaWstbWkqauprK+2r6Oeo6iqm6CampKktJqPiY2HkaKglo2UnqCUk4WOk5Kdm5iWlYiYk5WZp5ygn4ySkI2Qd36OhXx8fYeKinJ0cn59fVtSZG9eTlpmXUZElltIO05tWGFbTWBiTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGRISis6ST8zQklTLD6Paz1ISI+bqqqiqrCkqKSztLG0tbGxoautvMu6rsC7x7G0rbTCwtHFxb7Asr7Bwry/t7zEp6y3rLO4vMCwq7KtoKSnramopLCjq7Gqr6ywrq+uq7O6p7awsqmyqaulpaSvuqyqscK5tau5qKiorKqosaWqpKKuqqiinpuirJWknZiemaydoqepoq2mo62st7GyoKmioKuusKyen6eoqZmkmJmPoKeYhoOPioufoY+LjJacj4+Gh5CVoJ2WmJWHlpOTl6ScnZyLkY+NiX9+iIZ8d3+HhYd0c3KJdmxfWWBuY1FzcVxLO4R8Rj5XdVhgWk9jXE5VVlVXUFxiXlNPTmhYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLklnREY4PEIwNUVLWDFAlFs/TUaVl62noqqynKmpsLasuLWuqqWrqr3Ju7C+t8KvsKyzxMPOzsO+v7TAwsS6wbTJxKyvt62yuL++s62uq6WnqrCpp6ixpbSuq7CurbGws6yzuqS4s6ysrqern6Kfsbirqq26t6W1taOpp6ysqq2hqaemsbKjpqWhoayWqqGUm6CmnqSiq6Sto5+nsbetraOlopupqq6pnaKlpKSYoJmWj5idk4GCkImFnKCMio6MmY+Qi4SNmKSbkpGbjJOSkZSimZuaio6KinyGgYKDenSAhIJ+dHeMpId5a15gbmdXZYdkTkBnkkxEYnlXYlhSZVVNVlVVVE9cXWFVS01pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIZASEhEl5KvpKOqsJirqa21q7axq6Srqqm8wMC4ubO7taWyr8TJy9G/wbu5wL/CucG6wcSusrWxs7vAvrOxrqyrq6i2qqWtsKu5sKmxsa+yrbaqtrWntLasrKSpqpyjn7WzqKiktLSgta2hqairqaunoKurqLm2qaqpqaKpoK2bkqmhnaCkoqajqp6dprWuqKaqoqOXpaenqpyipKOfmZifkY6PmY5+h4yHhJ6eiIWLi4+OkI2EhpWjmo6Nm5GSkY+Sn5eZloyKg390hoF/f3h1g397eH+BiJ2Pb3FnZ3F4XGBziGpPXZhWSG14VWRWUmNQTVVUVVBPWFtiVUhQaVRWVEdQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJRYzAyP2Y9Tlg/Qyw+TFRfL0prNlBFO5WOsKClq62aq6WtrrO0r6qlr6mpur67wLGuuK6hta/Jx8jRwL69u7zCvbrDwb+/rrKysbW9vMKxsrOqs6iktamlrbOzubCjrbayr7K5qriuqq61q6ueqqyfo6C2raihn6+zobSqnqinqqSroaKsrai9r6yuraGnqJ+rmZCvoZiioainn6ibmaqwqaOfrKKhk6Kjo6eYmqill5eZnY+Kh5WIfY2FhISkloWCgouHj46RhISUoJeIkZ2Qk5GNkZ2Ul4+KhYV4dIF/fXV4eYB7dHN6aYKHpHVpXmVsgnVniIx9UlhwXkp4c1NkU1FeTU1SWWZOTFZZZVlGU2lSUj9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTGg6NDhfPWFkP0YxQ1BbWytITzpWQjSQj7GgpKaro6akrKa0s7GqpLCnqri+wLyvpriqp66wycbI0cO9v765vr+8ybzBuLCwtLG6u7nBs7S7rLisorSmp6yytrmzp6a7ta21vK+8pq2stautnKmvpKClrKqnnJ6qs6SzqJqqp6mkqZ6jqaipvay0r66dqaSgrpybsqOVpJykpZ+kmpqoq6Wem6qhm5KboaWdmJepqZGYmpOQioKPhX6Pgn+Ino+Gf32Mh5GPkIR/k5uUhZOijJSRi5GbkpWHiH5/cXp5fnxpd3x6dXFxfWiGeYWIZGBoY3KFem1neV1eVkJXem1UYU9SWEtMTnF0XUhaW2dZRVVmUEQ+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtFWj8qj5OxmZ+fqaWkoaukt7Kypamwp6y4wb21r6K5raiosMPJyczBtr2/tbe/usi2w7W0s7Wxvbi6vretubW/raGzpqqrsLW4tKqdu7yosr+yuaCvs7WqrJ+usKOcpaipop6cpbGmr6CfqqmooqqcpKmgrbyorrCuoaujpK6enq2ml5+boaOcn5uao6qimpqkpJWWlJ+ilpuWpqyLnpGQkYyCi4GAjoB6mpSNiXx+i4aPj4yKhJKYkYeUo4qSkoeQmo+TgYd8eWt9dnl4Ynt6cXBxc3hpgXRrg2dkaGFvc45tYmpwYHBBXHhrVl5OUVFKSk1TWVZNXV5tV0RYYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBCaFkxM1M9ZV9ETDZLV2VPKTwzUFs9I5KYrJmfl6ekop+opLivrqKvr6iquMK5sq2fua+rqLS6x8rIv7fBvq+0vrfEtsOxr7qyssC1u764qbm3vauktKeoqrCuubGqmbq9pK+/tLSgrre1pqensLOgnqSmp6GlmZ6tp6ieoKmup6Gnl6OpoLC4n6Sxr6GsoKyknKanqZqam5+jlZ2cmp2pppabn6iSmJOYnZKZlqGqkJqJjpCHfYh/go58e6GMjIh5g4yFioyNhYeSmo6JlZ+IkZWCi5eMkX2Ee3NvfXFzdGB5eGlvcHFvan9zZHtsaWZkYWaGgGBbc2pyTU1/aVhaTVBMSkhQUlFJTlxfblNEWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpoSCo/MFpZNSiWnaWYnJatoJ+hpKG3q7CktLOoqLnEtbGuoLesrq2wtcbIwLe/wbmwtL23v7u/r6u9sLS/sb3Duqm7urenqLWop6uwrbOxp5m8t6Sru7avn7G3sKmlp6+ym6GkoKOkoZebr6ahn6Knr6KgopOkpaK3sKGmsaufrKKul5yqpamel5qdpZObnJqdpqqZnJyklZWXlZyOk5eiqaGQiYqQhnqEfoSKeY6Xio2GeYKHhIiMjoWNk5iMjpaZio+XfoaXi496gHpwcndub3RfeHdkbGxsammEbmZzaWtmaV1kc4FgW2t1aVpJfV5bWE9PSkhIUlVGMjlfXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbDg0R0FmW0hURFVdaEUuPDJiVSwylqOhl5Scqp2loaKgt6quoLq4pau9xbKvrqO1r6ytr7XExLyzv7q3sLO5uLq4u66twLO0uK+/wbisvbq1pqKzqqeqs6utsqKawLalp7S1qZ6yu6mnpqmvrJmip5yjppSYorKkmZ+kqKmcoqCTpaCkuKikp66nnqWgp5KfqaKhoJmbnaCSm5yWoKGrm5uZoZSRlJaajpSSo6ikkIiKj4Z5hHyFhn2djYqKhnmAhIiIiJGFlZOSjJCVlI2OlHuDmI+Ld357bHRybGxzYXh0aGhqZ2ZvhWdoaWNmaWpgaWJqZ1tle2NgU3NUW1tTTElHSU9TQCEqaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc5ZU8nMp6jo5GOpKebnp6do7Wtpqq6t6arw8G2r6yjta6nr6+3wMC8ssG2sa6ytra4t7Wsqb2zr7Kxvb+4rru7saWetqulpbSpq66gnsKrqKWvs6qstbudqKqrsaWYnqqepqSRmaatopiepKmhnKKdl6Cdp7Wmr6quoaGenKGVoKafoaCZm5mckpmdlKWdrKKYlp6Uk42Vl4yPmJqpoJGIiouJeYV3goKBnIiLgol8f4SIhoWRhJaVj46QkZGRjJJ7g5WOhnJ9fWZ4b2tqbGd1c2tjZ2VkdYBiZWZmZWpqZGtxWl5ZXW1kYU5oV1pgVkpHSUtNUlg+OWBsaUdCVFNcW0lJR0ZBLjw/OUE4OVJHQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFlKVmJmQTozQWZIJTWao56Qi6yhmJiglqW0saKxvbagsMa7ubGxpLesqq6pub27u63Asq+urbavs7eypqq5sa+ttLa6trC4va2mnbWqn6CwpauunqTCoLKkrrGvt621nq2vra6imZ2oqqWelZuopZ+ZpaOonZqgm5ScnayvpbmnraKhmpuemZ6jmqSdl56Ym5SaoJKolqqnmpObnJKMlZmNlJSZqKeNjYqJj3yCdIKBipiFh3yJiYSEioyIkoSTnJKSj5CRlo6Qf4CMjYNvgH9meW5oa2pncXJrXGhjY3OBYWVoam5sZ2tqZ21cbGx1cWFUYmhkZVpJRkxNT1hRUVZhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUplQyc0kqCajo6wnZqToZqpsrCfuMC1n7PCu725saa2r6iupbe4t7esu6+tqqu3qrS4raSxtbGuqbG3trGztbqnqJ+2qZyeqaOqrZypwJmtpK6wtrWtrZ+xrbCqopucpKyom5Wcp6OdmqmipJaaoJyQm6Oqqam7nqakoJiamZ6hj2uilpiccYKWm6SAdZKpp56UlZ+RiZeZgJaKoI95hpSMg25qfneDcWyGi4Z9hIuGb15jYGeEl4Zri5CUk3V3i4R+g49/ZoaAaHVpZldcaXNuTlBqY2dyhGdfZGZubGpeYGCKkISGZ09LRDhFVGdeSkdRUFVVS0hTYW90ZUZbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFRZD0rL4yjmYeUsJuck6Cbqq2ro73Fr6i2wri9va2ntrClq6S4s7KzsLmtqqestKawtKKnt7W1qKest7OutK2zoqmftKudoaScp6eZrLuVpqWvs7itrqWorquspaGfnKGnppuYoaalm5unp52Tnp+YkJ6oqaK1r6Oio52Wl5iXo4ihjpKah6GHlJ2hf6V/pqqdkpKbkoiEcniNjoSIoXaIjWmXiGZ9c3ihb4iHhH6Ne3+hoJ+ZgHuHnnSIjnabimyHgYNtaGVjemxxYlSGbWNsaZhxWGpwb4dYXmlba2tbiHFuenKGaIeEWl5GTj5GX01GUlZWUVFSV1RnXkxYSlJSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiMppeDnKudmZmdn6qqp6m/w66xury3wL+qpbewqaymsrWur7O2q6mlsa2ltbKbrLS2tKanqbOxrbKnr5+qoLKpoKSjmqKjnK61laSlpra9p62nqqqsqKaioJigp6OZmaajpJicpKmWlKKclJOkpaagtqOkoKOYlZOYk5yIro+YlImpi5eim4WxgKOsnJOanpV5gtSof4eUwZvHeXixpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQeoFslrGrsHloa1ixrm9labySvG5oem5yj9h+U2pitrJ/gXKUdZqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQFxEUE5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaTgaapn5ecnqWtsqmwwr2ytcC1t7/Cq6a0ra2pp6+zqq+2tKioprWmp7itnLKwtaqlpKexrq6xpqqep6SxpKKhnpecoJ6vrZWeop+0uqOrqaGtrqWinZuaoqifmJuooJ+YnqenkZynm5SdoaaioK+in5+jlpaTmJKZha9qaoqNqn5nhJWHrWRwnZyUmqaVca6hpH53u3xroY92sV9qtFulgGackWBmgXpmf2p4aqllvnJnpox2smp8sXh0kpNjbW2nbVuEoEVpZ4eWRXWcYH1ne6Sngllfi6tpgJV4emqnN0qvW1dUbGNbS09YX1xXVjtOiE9XVi9IU1NKREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GilYKsp6Weo6WqsristL2+sLbEsre6wqepsKuvqamwrqSwurCkpa6zo6m4qJ6ysbCjpaCqra+ssKann6OisJyjnJiVl5ucraaXm6KetLOhrJyira2gnpqXoKKpnJmepKCcmaGnpJCdo5qXoJ+rn6amn5qfoZaVkZeRmoW1m7V4hamZtZl3h7Obt36TlpaplH5rgaZ6goWIk5SSd6tna7FbrHuPh5R0iHCPhoB/iJCXeIOCi5eMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinS5RoW5bVGtnYExLXGRYXFpCPrB4V1hBI0xoRUNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dXN0o5YVU1MByVn5SIs6amoa6pp7Osqbu2wrC8wq24t8GqrK2urqausqmhr7yqoae0raSrtaWmsrKno6KeqKqyqLCopZ6fn66Wn5mVlZaYnq2impqkqLWvoamPqaiqm56VmKClqJqfnKOfm6CjpaOVm5+Ymp2iqpummp2boqCXk5GTk5yD1ZOZuXCwwn7GhnzWlJu7fJmVpI+NnI2ke46HpIKlgnqseY+dVq97iX6farlauXeHhH2mgpN8mHqqeY2cj3uxbY6EdJC8hW+UUK+nxYpRoHpjYKpic3KHbZeIYFO1tMiGgIl8Y6QzQp12XVFqaGNQQFhmWmRhSkhNbEtbU09ZZlpDRD9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRNzIlm6KTmLGnqKWzqqW0qKS8t8GwusCxtbW8s7WnsbCjsLKmn662qJuoua6jr7Ggs7OvoKSen6epsKi0qaScnZ6ql5iXlpeVlqGqnZuXqK2wqaOfj6yip5ael5yhpaGYoaGioZqioqebnqGelZmbpqCcp5Wcm5+hmZCSlZGdiLJuaLVxq4dvjqZytHNytnuZl6OLjpyNon6RoKV+sHaDkdLRdlyufIZ/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdISeb55mlFLIi1rCXJ95Yl+tX3Zzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPal9saU9VR0k5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6GckaWvrKSqu62mtKWntru8srq/t7a1urqzpbS0obGxop+ssKSYprqupLGxnbS3qJ+mnaKqpLGnrKmkmpyaqJ6VlJiYkpKjqKCXk6arsKailpOtn6WSlKGbpKaglJqmpqGao5+tmqCenZCWm6GdnKWVnZWaop+WmZaSm4Wse3eodqOOiYepb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9d4V/j52GmZl3r4aKkZyHd7RhmmWagYKUbJJasFhLmnWYeWZgrV52d4domIhrXq93lZ6PeGw1eciusl9BVG9eZ2BFUGxfcW1WVU0uZWNpU1lROkFEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCXtMGtqLKoqbK6uLS4v7m3sra9taW4s5+0rJ+fqKuflae2q6ixsquttKObqaCgqKG1pqaqo5melaWhlJOcmZKVoqWak5CnrK+moJWZqZ+ij5GimaimoJWZpaidnKSerZ2hnaCNlJ6bnaCYmZyWl6Kgk5iRpp2GqX19pXihj46DqnCti4GnhpWfoYiXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pjcnuBa5iHcl2sWomgjmtuZU9KQ6FcWkx0XmJlTVphX3JzX0pWNkqak1lIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4wMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZ2Zmb6rl7TCrqutqaW0sLixtb+5urOxt7yqu7SfsKSepaennpSqsamwqrWsq6+hmKGgpqSjuaKjq6CXm5GioJWUn5qUmJ+gj42MqbCvpp2Wm6imn4ySpJeoq6eUl6mnnp+go62koZ6hjZWhmZ+gkp2XnJWeoZWWj6ubj65tcrRyqYx2iqZztHhzs4CRpKKRnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZOIrWt1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbHl/fm+Yh3Fcr1Y8nHdmVG9uLlynT2JSa2VhbFliXGBwe2NUWlE+Pm1wM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs8MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOKWam526oZuywK6tq6unt6m4r7TAtbyxr7m4q8G2qaqgm6akoZ2SqqqntqOyqK6qoJecp6Clq7mdo62blpmPpaOVjZ2hm5mcn5CTlKu2r6eZlJysqpeMk6WZpayjkZeqsqSgnqersJiho5CZopegm5abl6GTnKqclJGrmYfUkpq7c7DDgMOGftWWm7h4h5CXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohxbo2kdL1dd31bYXm8a1pWW2p6XmpgZGZibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6hvKKXscOwraqqrLGnua+2xbG6sq67sK7Bsqykop6joZybkaqkqrKktKatpJ+WmqqZpqy4nKKumJWhkKWgko2co56YnZqQlpOvubGslZejqKeUkZaknKStnpGgqKufm5+po7OeoqWOp6KUoZqcl5WkmI+woJKVqp6FkJm2gJCRjLeVeIKTm7V3bmtuc255j4SOiXOewbu9mnuBsqhwgHSRuIN8hoaLh417ioaNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF5/eX2JaIN5bXlii6xwdYV/WVunakRkWVNmYGNdY1FnZnFsdUJOUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPTs8p56goL+llrTDtKyrp6yrqbuusMavtbOut6e1uK2po6GlnqCdmZSspK2qprWoqJ+blqCjnqykvqahq5eUnZCim5KPoqiik52XkpiUsrW2rZidpKSii5KRppulq5uWqKSlnJqhqaano6mhkq2fl6Oel5aXnZ6PsKmUnKeijmp+aZymeIdzfpqPdHplh3q+vsC6bpKDcZSGX3JqWl6aiWFkiI6Va2B/lWNtnHZilGt/mpWUZV5gY3GbimlyjH2GlWdqfnJ0eH19Ylt3dIFoUFxug3x7i2tYbHqCcklKb4VwTXRNRVddZmBMW1hnY15PW211aXFRT0RFTTtISTxMPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqifqKHBo5u0urajraWup6i1sazIrLCzrLWjvrGypqCiqZ2im5qZrKeupKS1qaWbl5Whm6etqL6nqaaVlJyVoJqTmKWpp5GekI+YnLCyv6ybpp6noomTkamaqKSam6ufo5mbo6etop+qopqwm5WmoJaVnZ+dl7GlmKKomZyRnZyjo5mmopqcmpqakJaBZ219cXeRl5SRhYq1qo2GmJWOioyYl4eUlYqDkpORiY2Rk5iUmJeaoKKanJShnY6CeqWFbGp8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vjd312a3B7bWBjXXBnTVlZZWpfV1pvem1tZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzoLOiv6KksbK3oKqlsqelsLWqyautsaW1psCotKGepKWco5WWoKumrKOjtqygmZaWn5etqaXAnquklZKcl56Yk5Sin56ip5ORmKinssOvmqudq56PlpapnqqcnKCsmKGanKKlr6ahpKierZiXpp2ZmqGenp2woJ2ippWYk5iUoKGVo56XoI6WlIuKjY6WrY98lZuCkoKLqqiGgZiWioSPn4h7hJCGhZmQh4aJlY6bl42QmJ6klpqTkZ2Nf41mobOvhYmEdnqPinx2eXpvZ3mQgYCJa3WBeYhyaHN/enaDiIJrdGR5ZmBpZGJkZmpZa3twaWpcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqq2js668pLScn6ejoZ2Zl6imqaakprO1npWUnZmZsKauvqCro5CRnpqZlJGVoZyXqZyEnqmsorPIs5+qpKuWlpeap52om5+kq5Sen52gqq6ppaOroa2bn6ChmaWenJ6dsKSZn6iTmJidkaWZmKidmpdmg5J8ZX6OmY9jeY1saGt6kaSra2WamH5nhYplZWloeo2hjmtojJeRondraouYo5+Zc2xueoSMh3pYZV6FgV5siomAdlxoc3d3kYCHgm54gniAc215g3R3iIiOg3tqhllea3RkXXOJaWp8cWxjXVFNV0pkWEBKND1GNz9GRDcxPD0/QUQ8PERHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsaqlqK2usKaurbC9samopK2vsZ+tl5+knqGamaarnKyjpqipsq6elaOQoq+mtrmlrqOPjpqhmZOSm6CZmaWWe6Wsoqizw7ekoqevnp6VnqOeo5yjqqiRnqGeoKqvqqujqp+om6afqKGslqGbpbCkmJyqlaGempOll56qmJ5+voOIcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooeCn3yVmImewL2Clp2ejZ3CwXuBe5KNmsPAfWulsW+MgG/Ken+bd5GDjoF2eoF/eXF6f4dxeIWMk3ltd5NiZl94ZF9lgmNedGhtZGJYTFZJUVpIT0UySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCvraayta+qpqamsaufq5ibo6Ccm6qnop2roqWopaS0o52ik6atrLezp6+ikpGanaWSkaChl5yfnYenq6Srrb/AsKGpr6mXkp+dopmio6qjkqChnZ6trqispqOjp6GlpZ6tqZGkm6mtqpydqpysoZaXpZaho5ecf86UeXqkgXmVlptfro9ejqeBoqB8p5WbdKuDgK9eY42peqeHhaB0l5KIs2OCq4ahjo2zaoSudH2Wh7hhgq1Zo81uj3V72nt/mXB+iJN2fmV7h3Z2a32Ibn6FkZJ+bYGPYHFrcGdgX3lkW3BoamRmYFJUUldeS09DNUFIRUQ4PjY7QD9BOz03QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLiYnpGkqqittKumsqytrKSrp7CqoKebmaWXnKKvn6CeqKejpqGesKybnpWnrq2xqqisoJSSm5+lk4+fpZeeqKOerqSrsKjAxrOoqbGulpKdnKKXn6mqnpShn5ydrq+nqqmbp6ekoquSrLSWpqKrqp6jp6ahsKCTmqeaoJqUlJGXoHCFjJd0hKiHcbF8nXGsfqGegaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uJk4+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+Ki5KQg22QkGVvdHVwYGdtZF9vaWluZmNXU1xhWlFRQjlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytJ+do46jo6Gtr7auqLCnqaqorqurp6KknZmilZ+mq5+ipaCoqKKfnbCsl5qWqKevrKinqZ6XlJqjopKUoa2bnaajr6yjrLWqus2xraeurJaUnJ2imJ+urJyWoJmdnqmxqampm6uqpKOsm6+xoqisrqaZpquqqrGikpejpJqUkoSkaqR1iXqpdHqycYKliZmMcYigmoekYGBSrIR/roObdq6BpoaGn3qYloZ7ZoCjiaSZhoGjfal+gZSHrl58qVWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojY2Yj4FtmpJwbnl3d29sZmRlcXBme2hjXVdgalhYVEtNUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfDydbVwKGZq6ihr6KesLWwr6mso6imqqqrqaSmoJuknp2lp6ajnKyaoqyhpJ+vop2akqqktbCuoKmbnZaUp6OQmqKon6CmnLGmo6exrLbIsrWqrKmVkZ2copmgpbOdmqGUnJ+nq6ujrpqsqqOiq6OzraKqs7Ghm6qor7C2o5OWo6eYm5F8qmyehId1q3l8sG+CpIuJn5aVn5SB0ri0uMmAgbJfX5Spg6SIh6B5mJWaeKrJdJmjlaepkJKbjH+biZrGxnhloYKlc4GfjoJ9r15wtWOxdUujhm2nR4KTZI+QnpJ8cJeSgHB6dHx7bVtmanJxZoFqXmJZY21cXlhITUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TBxrmtqbOurKWinLK5rKqhppuopqqsqaagpqWYq6OfrqudpaCsmp6ppZ2mtZ+il5OoqrayrJumnKCVkKWtkZmcp6OgqqeuoqOnqrC0wrKzqq2ok4mXnaWboaOuppehlZmdpaarmq+drainnqyjt6yhsrmvnZuvp7O0s6SUmKikmp+Ogp1OeJqBf596g6N8gqSEh6efnJ6ThLh7fHm5gn7MxsK2eJuhkYuffZmWl4p2npiKpJijqH6whZyFnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkqSXfH6SkYp0enOEfnBbbW53cmqBb1pkX2huY2RdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamspKu5q6+gnKGss7Omn6CVpa6trqqnnaammqOnobKuoqimsqCZqaSUorWio5WXoqm0uKScop2jk5ChsZmenKemoaKvrp2kqKK1ssOxraqtqpGHkJynnaOknKWXnpmZmqakqJquoa6lppiwpbytobe3rZ6dtbK5sbOnmJ6woqSehY/RtcO3eYeOhZGTj3+meJSid4ygkoSlgYpxqoaEtG5yapmjm5WKn3uWmIaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5SmmH6MjJOKd3x5jYFtaXhpeHNuf3RdZGRubWZoYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q1npeopK21oaOZlaOpp66qq5mlop+loKC1pqKop7CjlKujjqSto52QmpqqtLSknaSdqZKUl66goJ6mpJynnLWaoKqjtavDsKmrqaKMhI6coqGmopWam5yZnJmmpKaYq6eto6Wbrae+rJW+sK2fo7Czuqy0p5upsaWnmHqokH18sHeKgaSliJtssW+hh618oY+DqJWYgKyIha6Fn5SpoKGWhp+AmJWAe5J+q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbZWRp5mDlIyWi3p6gpZ+a2x/Yn10bX96YGdlcW9oZ2hDWWBbPUtUMlU4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovZKahKnGwrfBtJ+braCuuKWkjpuko6Cvr6qfpJ+drZmeuaCiqqCvqpqtoZCqqKSWiZuQrrCsp5+nm62YmI+soqGdpaKapZytmJ+oprapwK+lqqSfi4COnJqfpp6SlZqalJubpqSkmqisrKOkoKqovqSXw6yqoqGssrqrrqegs6+pqph2r36Qi5yFh326rYqYZLCMZZWtfaGPg6aVmoGsioSwhaWZpKGhj4SgW2xqgbNgf617e4KAsWxnbpmXjIiwW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW2Yj6iaipeRlpZ7eI2cfmRzfmKDd3SAfGFqZnFuZmVlT1VjW0JUXj5JKD45PTQhIi0lHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE5KR0M1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wrOjnKympbaooYuaoJ+ds7OpnqOgnbWYoLOoqqudr66fq5uVr6iijoibjq+sqaeip5muk5mPqJqinqWfmqOjpZmfo6myqLyvpaienY59i5uVoKCZj5Kam5KbmKmfoZmorqelpqOlqbufoManpamhq7S2ra6nn7ytrayVgamSo6+Pm4CGpJeYkIGAuMO6g46dk4SnlpyCrIqCr4imm5ulqY9+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwva14d6K+u3SAlo6mnI+bkpedeoGQm3pjfXtkjGZ5gntga2VramJQYltTalxAVGFCTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbO0sb+5sr2zop2upqWzpp6LmKW+qbexqKG/pqaynJ6xnLmonq2vpqeVlLCsl4yDm5GupqOsoaScqqGYi6OSp56nnJqhqKKYnqCsraq5rqijm5eTe4eZkaabko6RmJiPmZSqmqCYqamhqqeho6u7nqnFo6Cvo6uztauwqqC7qK+vmnN1qqS3hmWJn3BnrY+Kj21vd6SQmZ+Bda6ZlXCPi3GVqKObl62jcm1tbWWKeG9tgplxgHlpcGlniZaVmHFoaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpJvZmSAjZKOopiXmZGWn32HjpV2Zod4aI1qeX55ZGxjZmxiS2RYSmtZOlFlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6q6ubKzq6mirp6ksqmYkr2xw8i+tqqewKuso6GnrJ+6o6StrK2mjpauqZCMhZWXrZ6mqqKfo6OgkYykkqeZqZmWo6qglpylpqevuqusmpuTk3uEl42lmI2RkZiUjpiWqJSfmKmjm7GnnqOsup+wwaeks6assbKrrqyouaSuuJaKoailtp2JlqKXh6makJSdk6qzmZujq6CxlqGhnaCinKCkoZWqpoySkoyHkpyclJCak5iQjpWGgaSZl5WNi5OSio+GhH5nin90gnZ0h4xxp2x7lZGUk4GBj4+Pj52UoJaYlqGDh5ONcWmQd3CKd3Z8empsZGRvY1VgWEBpW0hjYU9aK0Y9KyYhNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTU9QUVhVVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbeurqKwpK2foLWxkI6rxbzEu7iqoqWdm6aesamjtqedqbWnqJGYrKKLiImPnKeWrKShmaeenpOVo5eomqmZlKaho5CbqJmhtbqoq5makI18gZSLoJSKlJGVkJCTl6WPn5qqoJy2o52nrLenr8Guo7emr6+wraqqs7mhr72Zkqajpraikp2mno2pn42Sn6Osr5qho7Gor5ejoJyjqZ6enZyWq52SmaGblJCWqpmNmZmWkJafkYmgnZWUhZKMkIyUioB+ZoyGdYZ2eYiDc5xqhpGUlJGKfYyWkpKYk6GTnZagg4eXh3pylnN5iX9xe39qbmRfcGlgW2BZbWNQYGRQWzpHR0Q9Mj09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaetoKi1qpCQnaSzu6+srKKjmnqdorGkpbColpu4p6OUmaqcjoaKiZyjkK6fo5aooKGSl5ibrourlo+omaeMmaiPnrm2pKWZm42JeYKUi5qTiZWSlJCNkZaijJ6eqZ6fuKSAhK+1orCvdKS+o7KgeHqgqrK7lXatpJ+KgKp+ZFxidp+OpJ6El35uk7Oco6euqqNlnZ+Tc3mZl3CAmKiXbH+iqIplnKWckZeYlYuSnJGGnZqQlYKSh46OkomFd2uPh3aGcXyGgIBhaYiLlZOLW3aVkWdokI5ye6WYmGR5mIaCeJhpg4qCbnl/a3BlYHZva2toW2ZlYmJvU1w+Tk5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJGRklLTVRUVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5amo6GwsayrqaWoraOnraSSlqu1r7Kmmqqmq5dzjJ2wn6iqppSWuaCgj5yknZF/iIibno2rmqOVp6KejpeRnoV1rpCIppqokZekiJy6tKigmZiLiXV3k4yWk4qUkZCUjI+ToI6boKeZnLOWgIyctZ2zjJKPvKehfqeieqOvt4GOjqaehIuFj7Gpr4yJlqOaeYGLrIacnaKnqaeHlYWYd6WbeoebgZemgoF7nLF6ioWgl5mUmJaCkZeWhJmZY3mHkISNj5KKg21wj4d5gHGAgYV/hnSGhJaSeJZok3SgmnR8mYOgnIaYfpKJgoOZao2MhWt4e3FwZ2R3bmlsa1tla2plc1xeSVRMUUBFNS5ZVFU2KSEwOT0+NjQzNTY4Ozo9Pj5AREg/SUVKS0dTWFpZW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyYo5+mrq6rqKygqLCmp6mlmZSuxr2woZamqbWej4OdrJynoqCNkL6emY2fmqCQfYWOmZeIq52ilqChko2TiYaAkaiOh6Kco5OXnoaeurKnnpuSjoVwdZCJlZCKlI+Pm4uPkZ+Sl6Cklp6siJ+0ibSarYvKh6quiLeFjbCDsa6DqY2mmI2dfKiPcnt3m4+nlmiVpHm0i5+epqiSmcKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qXkYt8hZOGjZWTiYNtc5GFf3pyhoGEfIR0hYKXgY/FZoCph4+ja56DoZmDmoCMjIOJmHCOkoVod3R7dmdodXBnZ2xeY29sZ21YZ0ddUUwyRTQ2TWBjNyYzPERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmRjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5sKqrppqUoKOkqqSWpam2o69/oaecpZ6diZS9mpONoZGdkHmElpaRh6uZm5uaooWPjHebnI+gkYiepJuVmZiGormupZqcjIx/Ym2Pi5OQjZCMjZiLkJGfj5SgoZmhqH6hp4etnaCWro+enZ2RhoGgjauvhqSNqpqMmn6idoCZk2qCrHVNq3iHjZ2Rm6ingKqrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln+Me2RoinKZfXmVbF17l21fU3CEXF9seYNgWWWCfYSBmHGnqmuDo25ypXCfg55pZZ9sW22Je2VZX4N/YldQb3ZlbXRyampvXmpvbWxqWGlPXVdFOUE0R0NeazQsSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKhtryrrqKZl6Chpa2toZ2ttaKokqGgoKacmY6YtJmQi56MlYt1gZSRjYqmlpWYnp9/koWGrKSHnJGKmKmYmZqSh6Wxp6KVmoiJgGluiIeLjo6Ki42Si5CSooyUnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprYWleYp9hJp9onByk4eWe56MeW2HnIyZkJuomo+HnXyConN2pmaefnakX5h6fZJzom6Yt7S6dJKHgn+1qGSBxrh7cJW3i3GAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN/pGCdmbOVcHyXnrR0c1uesoNqYm9zdXFob1hrbHJzZl1pXmJLRD1ENVFBWXEzPVNHX0pSPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWldgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6CNpLi1rq2gm6Kco6Omrpybsa2sk5ehmaGkmZqUnqubi4mSeIuFcICWjYqPoJCTlJ2XfZCJjqigh5iPipGik5uajIuoqKWej5aHhH5re4d/fY+Ng4uQkImPlKCClp6gnaCfi4l3nJiijKByoouIqYicppCWqKt/rox9eqCZeqOTeIBzloiNnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmh0q4Odg3SqZ5SaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z1iYp/nmiadYeTkpiOf59umpBtp5ldqH53u2t+qluOhF20Z1xucXl3a2lbcWp4eWNgZlhiQVBFTjdWQlJuNEtaWl9OWkNAMTUxOzs3SD86Q0dUP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtpuoiWOUm6y6srCsnaacnKifnq6bnrCoq52XpJqhn5iWlqCjmYaJjWqIgHF7l4iLlpaEkZSYj3qKhJaknYqUj4WLnZGcnImPqKOgmYuRioCAaYGGeX+XjHuIjo6Ij5aaf5Sjn6Cik5hyaJ+Kn4+McZKMgamImZ+jqKCofbCto6K4l3ejs6Kjf4iUeZ17q5p/oo6dm5eJl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn50qlpdb3uWi3ieYkx+enqFY3mXQk2fWaJqcXyObYGJhJl1m3mHibGzf3+bk6d1gZ1ucnyUb5lyaqRdlXZIZWNgc3B9fW5lYGxodnxkZGFRXlZdVFZAWUVRZ0RTV1tiWF5JRD1COD9COklFOExEV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZl5hYVxdXmFoYl9lZHZsXmVnZmtkZmxpaGtpk52Asa6ZhFNfoKezubOzqZqijJyrnJyplKGrpKGoj5+enZqZlZignZaIh4l3hYFueZWFkJqLfJGTlohygImToZxzkZCBiJiUn5qEjqmcmpSKi4p8g2yEhXGBoYx4hY2Ih5KZlXyTpKGfo4iuhn21hI6enXullnqpgpadkIqhnX2naHZtfpl0oXNxfJ2FmXCTg659pIOmnpqBo29eqGd1o2NvpWGc0pB8epl4cnNjooWQfqNzo491a5Czi2CCmIlzqrKovH93g21+vqaptF6cbn1xl2+Bc6JyXaNndKZhaKZtm9SZfISbb3h5l2ubeneXcm2ppGdgZXlwf4NrZ2ZkbXV3Z2BiU1tlUVFhSVdJVF9XU1tlalxkUEVDS01KS0JKRThQP1BNV1NYT1JSYGZlaVJjd3l3SUZFY11kWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebgLGrVFxLfqmvsbSws6OcmIWZqKCgo42kqKCYqYmZmJiTmZOSoJiOiIZ7cH2EaH2PgpSagXeRjY6Jb3+GkJOSbJeUfYiRkaOVg46qmpSSi4WJeYN2iIBugp+Gd4CThoiZopd6lKOlmp+Js6Gitot6rKekrqVwqYCakIWBnJJ8pICimYaYcp6Eoq2uiZeMgIykjZaDraGUdrW1tcmhc5SKgZ9gnZapbXmVhp+adaGHd6B+kZaKgG9MZqOScJqHcqR7eXRhg4JsfqBrcWRgnHJ/dJdpe2q0tbTGpnOYfnudapubq3WDmmx0d5dpmnp1mHJQRH2zXmp2a3iHZmpnYnR0cW5WXlRZaE9SaElVTFlTVV1oa25WZ1dNSkFKTUtISk5BUUpQZGNpbWV0cnN+eXtudYl7e1RQT2xeaFtraVJqaGlsZ2xmY2VfXF1cXmliZGhre19dZGhjamZvbWVpbGWhnImwp4RmP5Shsquvr7Wio5CAl6mioqWMpaednKWCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1j4iMgWmEhZKDjIWdjXqMipWlkoOXqZeMkYuBiXqAfYt5cJChhnmBlYeJlqCWf5WmqZyWloRnbnicbKJkfHGld5yYcGengZeMe6V6n5aDl3KedoGJlJaPuW6QiqJifZihlYhtcmmranWgbW6mYJtoipBoloealXWigH2aYIuFjHRviGJooGWefmmadW9jZoiCbnKiWl9bY6FuXYmMb3t/c3JkpW13omRnp2iYc4uYbqFvU4iPb6BfZadUi11UmG1tc2txgW1waGt4c2tvUlhXVmZZU21JWE9dSFhpaHNqWWtWUVJFVlxMWFJhVGhqXnd1enxwfHxyg3t/cnaNgIR2XlFyYmdicGdQamhoa2xuZ2RnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKWZpnpldG2Lp66kqbCxpp+LgJernZ6ljKKhmqKigJaYk42aj4uYkI6Ke4dxgIhoi4t8mJtzdIp9kHxkgoeVioqVmYJ8iIaWp5CBoqyQhZCKgop9gICOc2iPpoR9hpSNiZigjoiTq6ediaZ4lpx/pYmWjLKYnpCDr5efpXiViHqpdKWPhJpupKKMkoSMg7xufKWvgoaFhpKWnJ98pXpxqJWglmeefW6rY5aKlZJ3qGypooGJdYeCd6uRpohrkbBrdrOMqWuKhm5tn56SlWF/q4uqdoB/jKafd599haWVnaBpmod2rGeerYy3c3e+jaSTWYOmjathdXJzb3t0cWJqfm5obVNWW1VhYVxrTV1SXUlebW12YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDc4R/gHt7jIGCgHZieGRjbXNkUmxnaG9scmlmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWmqp2BgJ6klqmqnainrqSZioOYq5qepImapZ2pnISMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGlI98e4GFl6WNf6WmjoGOiYWVdoKHkm9si6mBg4uUjomcn4mNlKukoJCAdZSXiX+BeZSuo3+Bm3GPhnmQi4R/e3KmjHF9fXqXlpuEjnh7fn6IlJWTinaQmJ+gg3p9iWyMhVt5eHF5cWhufpKJcX90go+Uk3GFg4JljX9fgX+Ld3VzlHVveW5uh22Ehl53aXiNZoGCho6pm350fJdqiYhvgHZ9hXZtbGeMc3l7mHiEW2tYeY9obndycW93eG9dbIZuaWdWWmBXXGVrY1VhVV9SX3B4eWxrdmVqa2p2fHFydHNhb3Vic3uBeHV5gnWAgH+AeIuFg317bX9sZHhuXlduZ2h1a3hqaWpkXGBaY2plbHB1blpbYmtkbGx5bmhsb2GOlLmpp4uhopqmpJmknKujoYSEmKySnaCJmqaaqJiCgZuKfpaTh46KiY1yg3yPfX6PhXuXjnRyg3CWhXt9kouGhpCFeH5/hpijjXunoYuGkJCFloOGjph3coWqho6SnJCInp6IjJuooKCrg4mOlJuAfomWraiPk6aQeG+dkYN6km9+qIVwfZVxa3B8gZ+Lf5KOjGhtXYOLjJubno5zlYuIcXRrgnZzgFlyboeRgX1+jGpdamR7hYOIgF9peHube4KLgnaBhoJoeYuHa2FxcoN3X3OMgomQp5WGZoyPg253i4RxhY15b2VnZHqDepZbXGpnbnZbe3h3dG1zcoJmXG2Ka2xiWVleWlhscVtfYVpeXWZ0fnt1b3Rja2tqe3xye3h0ZG10Z2x7fnZ6fHt6en9/fm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtoa2pxcm1XW2VubGdzem9oam1gi4yqsaGQo6Ganp6Ynpmoo6J+g5itjZ+Uh5uikKWVf3uYhHySmYmIhoeKc32Ai3aFi4GElopxb4BymIaEfpOEg4aKgXqAg4ubn4+CpqGHeI6YiZWLi52XhYN6rYKRmJmUip6dh4ihq6CioqOLiJOcnaOZlqqhp6agkpuIl458eI6OhKd+f5KRkpOcsaablJ6QjbKTmISljIyVm5+JkJuCiZGKa3yNdndlgoaQinuJnYSHi4+IiICFhJB3fHl1mqGIhoqfi4WUf36MgYB2cHSGhH94iIeLkKaRhIWNiIONkIx9iIuIj4F2bIKEfHmZanJoYXSKcH16d3Zvd3SBXV5vhmhuX15aXF1TaHFVY1xcYWxpdXx8c29wZGtqaX97bXh/cWlvcGxmgHtygoB4f32AhHptg4yGfHp4fH16g3lOZHZrc21wemRrZWJiYFt0ZnBmcnJtVV1sdG1oeXpxZ2lrZY2Inbqfl6KhmJWZmJSZpKCee3+aq46ejYWfnIueln15lIN7jpmJhoSEhm54gIBygYh+iJSEbWx+epeGhIOQf4CGhIZ8h4ONm52Sh6qfg3KKkIaTkoydkX2Ne6qEjZKYlY+cl4aGm6egopqdhoORmpqZkJqmoKadnZCWgZGKd3yIjoSle3yOkJGGmKmhnZOdj42rjZGAnoyJk5qego6XfoaNgm94hXF0YH+Cj4Z1i5eAg4+ChoR+hYOUbnl1dJKii4yFmoWEjXSAinx8cnJ7iIR7eYyPhJOnj4aEj4KEioqKd4aIiYt8b2t+gHttaGxtZ155f2h8e3Z0dXV7d1xgcH1udWBjWl1eUWZtU2VaXmFraXZ6fnFsbGRrameAf2xzgGxsdG94boR5boeAdoKAfYR2coONiH57e3x/e4KKYGl7anVoaYJkamNgaVxkdWhvYnVubFRjcXllcHp6c2VpbW2Lip+3m6Kkn5KRlpeLmp+fnnt4nqaQm4qGpJSLmJl5eo2FfImRg4yCgYJtfH94c4GFfYqRfWtofYGXiIGIjnx+hoSHfI+Aj5ubkYinnX9wi4uMk4ehoYqFjXyokYiPkpeTlpN4jKOhoZ6Wmn+AkJqYk4ybo6GkmpeRm3+OhXmAg4+HoIB9jIyPfJekoKCTmZCPpo2PgZuRiZKXm36Skn6GjYF1dIJwdmB9f42GcoqVfIiLcox/goWGjmh3cXiMmJKPf5d+iItzgod8fHB5e4yEenuSjYOWppOLhpF8hoaHhXaCg4iHemVye354enBsamZefXNofHV1c3xygGpeYHR2cHhkY1lfXlNraFRkWV9hZ2p2eIFxZmtjbGhlf4BqbX5obnFrfXeGemuMgXOBgX2BdHaCjYZ+fHt/gX1/j2pyg25zaWGHaGxiX3FWdG9tbmB4aG1XanR2Y3V7e3Jiam55iY2fspKmpZyOkJiPhpygm5x8dqSgjZd/jKKKiJqWeHuGh36DiX6IgoB/cX97dHaChX6KkXhnY32Gl4qCio14fYCMg3mWgJWXlo2WoJt+b4yCkZSGppuIjYmEppWFkouWl5OSdpGeoaGYlJd6fo6Yl46Wm52knZmTlJx6kIaDeIWXjZ1+gYmNjHOXop6hk5mOj6KMi4OWmIOSlpl+mI18iI2BdnF9bnpkf3yKhXCGk3+QgmyHgoGAiYRldW98h5KXjX2TeIuJfICHfHtxfniKhXmFkYqLmKKVgYSNd4iEg4J3fIGJhnZfeHd9c313ZmxkYX5pandzdHR9cXxiY2FzbnVzbWFaYV5ba2RSYldgYWhrdnmGcWJqY21laHyDbGh0aGxvaH98gnltkIZxgIODf3N8g4yBf356goN+fJBtdoh0dG1limxqYWN1VoRpcW5geWdsYmp2cGZ5fHpxYHJshoWQnK6XpqiejY2Xh4afk5eYfXiqnIqYeZeci4yYkHl7gYt9fIN7gIKAeHR5enN9gIR/iYuAZF59i5WHf4WHdH1+in99l4SXk5aMo6GYf3KHe5OSiqePjI6Kk6GSg5GQlJeRi4GPmKCakpCRdH+NkpSJnZ2ep5iYjZWWdI6Oi2yGmI+ZeoeIkIlvl52ao5OVio2fjIaBkpx/kpKVhpmIfImJgXpxeWt1bHt9i35uhZKClHdvgoN9fop/ZHJqe4CWl4R/jXSQiYN5h351eIB9h4B8hI6FjJSkkHmFgnSJh32AdHaBh4NuYHt1enF8b2FuY2V7Ym5vdnJ3d3N0YXZfb2x1bm9cXF9eXmpeT11XY2FobXR7iWtfamVqY2h3h21mbGhpbGiAfHp3b5CHc4GDhH1zgYaJeoJ9eoGEfX2OcnqKeHhubIdraF9pcWOHaHFvZXdobmxheWhrfXt4cGF3bYuBmZqqoKOonYqKkYaKnoqVl313rpiMln2ek5GWlIh3fnuKfXyAdnd/gHB1dHtvhn2BgIp/fGFcfo+Rhn+DhHN6gIZ6j5GHkpGbkqWblYJ+gXyOi5KkiY6KjZibjYaRmJOWjomJjJOdk5CMjW6DkI+RiZ6ZoqGXloqXkW+ImYRnhpmOlHqJhZCKcJWalKGSkoiLmYyCf5CefJKPkouZjnuKhId0c3VrcW51e4t0boWQjpJxdIB7gYKIfGRxbHl9mZR9hIh0kIuBdIh5b4B+gYd8hY2KhY2VqI17iH1+i4V4fnFwgIWDY2h4dHZwe2JecGFrdV5xanp4eGxycGV4XW1sc21zWVpeYGJqWlBXV2VjZ3Fxf4dmXWloZ2JncY5vZGlnZWpogHp3dG6OhXSBgYJ7dYKIhXeFfHiEhXqAiXd/i3t6cnmDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKf6KYoqigppuHjIqBkJyGk5x1gaqUko2GoIyWk5CAdHx2hXd4f3Jze4Vrc3B6bop2gIGHbnFbWX6RjYh/gIB2dYCAf6CGkIqSnJehlJh4in+BjYmdnoqPhpKYloWJlZmPl4yLjY6NnYqOkINtiIqQkYmclqGbmJWGmIhqhaODZ4adipF+i4OLgXeTmJGekZCIiZWNf36Pl3yRjY+NmpJ8in+CbnZwbG1ucHuFaXODjpeKcHd/dIKJgnhmc292gZmOfImEepSReneIdHCJe4aNeouHhImPnKOIfIR3got/eHhva4GCgV1yc3FxcXhaXnBgcWteb2l8eXBtbWpsdmBwb2pybVpYYWFiblhRU1pmZ2N1cISCYl1qbWRiZmuSbWBmZl9oaoF1cXJwi4B1f4KAeHWAi4B4hX93h4Z3g4V7hox/e3aKf2pxY3xihnxvcWx0amhvbHZ3X3F/eXt0dXSAgn6klZqtnqaWhYyDf5eUg4+fdYuflJOFipuMlY2LenJ4dIJwcoRzcXWIbHBtdW2Id4N+gG1uVVGBq5SHgniAdnKCeYGggpGBk5KYnJKaeJJ7g42TpJqTjomVmZOFh5eZjJSMiY+PiJ6FkIp8coqFiY6InJqfm5aUgZR/aYadiGeGoYiShJGDiXGDkZePmo2PjIuPjXd7kpB6jouMkZaMfIh8gGt2am5ra2x6fmF5fo6VgXZ6gHeDjXx5Z3RsdIeVi3+IhnuUkHF6hHB3jHqKjHqJfoOMkZ+dhX18eIKMfXdxamyBgnlfd29tbHJzVl5vYnJhX2xueXBncGZmc3RocWthd2VdV2ZhYHJTUE5cZmVdeHCIfF9caHJiYmVmkmlfaGRbZ3B+cGtwc4p9dnyFgHR1f4x5e4aBeIiDc4aFfoyMg3t5lXdmcmqDYIh+b29remBqbnR/dF90fXmGeHRzhXx4oI+ZsJylj4KKf4OaiH+Lnn+LmpOPhIiYjo6PhHZ0dnOAcG+Fc3Bxg29raXZtgm59fG11c1JOgt/IktaTfG90hHaDoIKTd5WRmZuQmnuUc4WQn6GTk5CJk5uUhn6WlYiNjYiRjYicgI6BeHqMfoiMipycnZuVk3qOdmiJkodsiKOFkoeXg4ZjjJGZj5WJloyNiotxe5SJeo2IipKRiXmFe35se2Vyb2treXlcgHmPjYB6fX5/ho56eWhza3OLj4qChYV9lYxrfn5ugIx/jId9hHuDkJWamop8d3iDkXlzbWZwf4NsanRvaGp0bVNeb2RwWWBrcXdma2piZnhycHBjX3hgYFZrX152T05LYGZjXXlxiXRcXGV2YGFlZY9kYGZhWGlzc25rcXaMfHR5hoJ1dn6Lc3+Gf3uJfnKJh4GQioh8fph2ZXNtfGWIfm9wbIBabG55eXNhdnp7jXZzd4p3eZ+Lm66boJCChXeIlX58iZyHhZ+RjoWMl4STjoeBdHdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYR2haKFkm+WkJWglJyBknGGi6OXiY2VipCdloOAlZCFiY+AkoqKl3+He3V/iXiGhI2cm5iZj493jHZuhomLfYqjhJGJnYWFXouUl4qPiI6Li4SJbHyWgX2IhYmQj4Z2hX19a31keHVqbnhzWIh6kYaFen5/gIWLfnhlc2p/io6Kg4J/jJaFa4F2boiRgpCFf4J7gJGWk5mQdXR4iI11c3FndXmCYnRtb2JpdmdSYHFnbFVfbnR5YHJjX2h9cHJuW2NyYWJXblpcd01NTGRmYV52c4ltXFxkeV5gZGaFYGNiXllqcmtua3J2jH10d4SBeHd7iXGDhH1+iHt0i4mIlYaMfn6Yc2h1cXlti3pudHCBWHF6dnlxZXd5hoxpd4CJcn+ch5innKOShHxwjJR4eYudhIWhjY57lY1/mYiEe3J3cHNqb4FraWx8dF5geHZ7cHV7Z2FlfOvatcnD3IhzbHOBd4qaiI1pmI+PnZWTgYlxhYmgjoWKlYqNmJR8jZOIg4mPe5GLhpCCf3Z4g4Nyh4KTm5aUmIaMd4h/cIWCiYeZooOUjJ6DiWGDlY+HiYaJjYeAh2l9lH99g4SJjo2CcYZ+f3F3aHZyaXN3bFqMfZKBhXx/g4CEioJ1YXRsiIGPi4J+f5KRfW2CbHiGkIaThH2BfoGSk5CXiW9yeo2GdWxxa3J4gF9zaW5ca3ZgUmRyaWZTX3B2dGBvYF1ognFzaldnaGNpWG1XW3VMSkxlZ19icnOFaVtcZXleXmRne2BkX1xZa25lb2pzd4p+c3OBfnp2eohzhYJ8gId2d4qGj5iCjIF7k3ZsdnV5eJN0bnh6fVh5hXGAb2d5d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2KmomJfJ9/g5l/gXhxc25vZHJ+aGZsd3dbX3l7enFxgGlhZ2F/1baOkKZ4bnF3e3CSkIyHapmOiJySjIV7aYiLmoeBkpGGh5iNfI2NgYGJjnyQjX6KhXp1e4J6cIaAlpmOk5SBiHWDhnaDgIuTnZ+GlY+ffohhgJOHhYiEiY1/f4NnfZB/fn+Ci4+Qfm2CfIJ0a212dHN2dWtijYGOf4V+fIR/hId+cF9zcYV8j42CfH+SiXpwg2Z5g4qHjIN8hH6AlJCRk4RucHqMf3Vub2psen1iaGppWGx1WlJpcmpiUWJyeGxhZV1aaoNtc2JcZ19kbF9uVFtvTkhPZ2VcZ25xgGxaW2NzYFxjbHdkZV1dWmxsYm1qc3aHf3Fvf3x8dHiGeIWCfYCHdXmJgZKVfIiGdomBb3d5e4STcG18gXdeg390gW1pe3OUc2dzh3xykpGDmp+boIaHdnaUfm12k5d+iJGDio2afIuadn12cW9samF0fGdiaXV6Wl93fHptcX9lZGhoV52PXnFylrzDg3VxlImQfnKXjIack4yIc2uJj5aBe5SMgYSbjHyLhn18iYx/lIh1iYV2d32BcXWGgZ6UhpWPg4Jyf4h1hHyJmJ2Yh5OOnYCIZX2TgoCFg4mJcoF9Z36Le3h+f4eLjnxpgHyDdmZveHhzdnNsao2FioGKf3iBgISDf2tecnh6fo2KhXuCj4B+coBpeIOHi4aEeIN8gZeNkIx9bm17iX13dW9oZ3x2Y1xwYldvclNTbnNpYU5mdHhlYF1cWG6Ab3NZZWJdam1gcE9Za1FEU2dhWmtubXtvWltebWNaYm93ZGZcXWBsamNtanN2goNxbn57f3R1g3qDgnyBhXZ+iYGWkHiDinSBiHJ4eX6NkG9vfIFxaYF5en5tbXx2lWtqeIR0bJSNhZ6YoJmFiG59jHZqeJiOf4KKgpWXiXmOlm96c3BsamRgdHtoYGVxelphcn15Z3F6YWVlj7Gyd0piWqTZ0JZxe5CLkHh+lYuFmZGNhm9shpKSenmShoCEmIp8h394eImKhJaAb4uIcXR9eml5hYOlkYSTjYN/b36DdoR5hZuYk4uSkJSFh3B7koN9g4OJg26BeGiAhHhyf3+CioZ7ZX1+hHVkcHOAaHhwb3WYjYWCint2eICEeYFrXHF9coGIhYl9hol6iHKAbnGEh46EhXOEeICZjY2EeG5vf4R/d3tlaGp9cF9Zd1pYcW1OV3JzZ2BLbHZ0YF1bW1l0fXJvV2ddZmpxX29OV2hRP1lnX1twamd5cVtbWGtlWWNweV9oXF5lbWhmbGlxd3+Hb2x/fYB1cIF6f4F+gn92gYWJl4pxgo1xe4Z8eXmDk4x1anp/a29+dH99b3J8e5RvboB/eGeSioKhmZ2RgoZnh4NvZ3qViX5/hYGZioF8jYxpeHJrbGZfYW95bV9ib3lcZGuCemFxdl9lZtTqvooyOj6LjoByeYWIjo12g5eMfpKOjX9ubIWNjHZ9j3+FgpWJfIN4bnaGhIOXd2+IhWt1e3RmeYKDp4yDj4uEfW5/dHaDeYackIyQkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7gYqDd2J5hIFxZHFofm10cXWBm4uAf4V+cnV9gHKBcFttfnR4ioOLe4eAfIh4enFsiIOPhItygXl/l4uLf3Rua3eAgHV1XGlod3BZV3xTWnBlTFpycmVbSnB3b1xaWllddH51aFliW2dmbmNpTFdmUT1eZlxddWVfdG9aWVRvZFlkcXlaaF5fZ21namxpcHd9jmxpgoR+eW6Ae32Bf4J6dYKBjZOFcICLbnh+gHp7iJKJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjIyDm52WjIGAbI5+a2h+jox7fn+DlIJ/fYqIa3VxZ2hjW2Jncm9gYWx0YWhwiXlic3ReY2SboI9uXDVZr7V1aoCJfZKGdoWWhXOOi4p3cG2Fg4d1eYl4iX2TiHp/c2d2iH5+mG9xhn5odnltZXmIhKWHgIeNiX5ufnZ/gHyMmYeCk5CYiIuEiXyPiHF7fYR8aX5ta4B7eml6doGHgXJgd4F+cWRyZ3WCbXR7hZSRgXyBf253eXx0fm1Yb392dIyChneIdoKJenhzbomBj4GFcn59fpOJiXpubmpugoJ1blxnZnNxUVt7TlxwXE9bcnBkVktzeGpXWVlaYXGAdGBdXWBnZGhpZk5ZaE1AYWRbYHZhXHRsV1dTdGFaZG9yV2peYWhrZ21saXB3fJJraISJfHxwfn57gYCCeneAgIqLg3F7h29xd4N/e4mNj4Nqfntud3l2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiReH17gZGAgH6Kg3BycGNmXllnX3BwYGBncGZqb4p0YXRvW2FkanZ7f76cpqPIuHGFhHOUfXiGk4JzkY2IcnJwhHuDdHWHdIh3lIh5eXFjd4Z6gJNpcoR2Znd2Y2p8g4iegn9/jo59cn5zhHmAkZCCeJaNlI+Igoh7iYlseXl/dWh7aWt/eXNpenaAgn1oYHeHfWprdGh7f2l2gYyQlH56fn5we3Z7dH5iVnd9cnOKhIJ8g3GGind4cHCDgo1/fXl+fXaOhoN2aXFpbYiCcnBdaGNzbkpldUxeblVUWXNuYlFPc3hhUlhYXWJwgnNbYV1oZWRjamRRWnBJRGRhW2NwXl13Z1RWVnddW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHl9cnt+eIGBgXx2fYSIhoNwdoNybneCgn6Ji5N/cIB7d3l6gYx1g3h/gYGChHqAdW9+iYuanoh9hXp3hntndIWMkHp/f3uJhoR2j4Bnb25fZFxYZVltcmFgYXFsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhwjXV7h4+AepOKgHV0dX53gHBxf22EdJSGeHVsYHqCeYiPZnGDb2d2blttfYCQk4CAeJKSfXh7bYd1gJCLhHSWipGOh4WFe3+FbHV2f21od2Vte3ZtanZ3f398YGJ4hnpodHVjfnpndIWOjJV7dH91cYB6fG1/WVZ0fm91hId/gHlsiIZ0eGt1f4OEfXt9eHtyi4F9c2d0ZW6LhG10W2pfdWRIbm5MW2JXVlV4bWJQU3R2WFBVWF5hcYRvXGBjbWVjXm5iVFxyR0JmX11maF1aemJRVVx1W1tna2FWal9gbmZma3FocHV4jnRrjo11f3Z4fneBg4F7dH6EiIeDb3F/dHF1foWCiY2Ke3d/eIN8fIWHeId8fYF+hIB7fnN2eYyOn42Jeol2dIN5Xn2FmYx5hoN0hYaFd4l7Ym5sW2JbW2FWanNjYFxnbm9mh3FhcWZXXWNrf3zKzoi5omptbYpscYRyfIWKf3uRhXp5dHl1dXtqbHVjhHWRgndwZ159gnqLiWVygmtqcWNYbHuGnIiCgXOXlHd+e26IcYGKi4dxl46QiIWLg3t5fnFxb31maHJibnhxamtxd3x8eVxleYB3aXV4ZoJ2Z3SHi42UfHKGaW9+gHlufF1Ycn9tdICLfIJvb4l/cXZod3+Bf4F2fXF6dId8enJmc2FujIJsc1hrX3dbSW5rTVZVXlRVe2thT1R1clFRVFZeYnSFaFxgbGpmY1luYVhicEdBaF1gZl9dVXteT1ZkcFlbamhdV2hgX3Jma2hyZ3Byd4Z4bpWKdH96eH55goiAdXOAhoWNgnBwe3h3dXmGhoaLhnp8f3WLfn2FhISHf35+fYd/fHh2eXeSk59/jHyLbXaAeWODh5eGc5KLb4WFgXqDdGNuallfW11dVGdzZWBZZHJyZoFzYmtlV1tgaX93vq57oLdtYnOGaHR8cnqDhnt9jH94eHN2b3t2ZWpuYId1joFzamJefnh5i4RmcX5oamtaVm94iqSBhX9xmZNxgHh1gm2AgpGHc5WIjIeEiIV9eHRybmh5YGptYG12a2dqa3l3endbZ318eGVyfW6EdGV1hYyGlX9vi2ZreoN1bXRiXG98a3V8jHyBZnWHfW1xZ3V+eH5/cn1senqBenhwZmxibop+bW5Wa2B3VUpqa09STmhOWXxoYk5VdmpMUFRVX2d2g2ZdYHFoZ2FXaV1ba2hKRWtaYmRXWVV5Wk5WbWpZXWxlXFplY150Zm1kcWdyb3WBd3CZhXZ/fnd/fIWHfXVzgoh/lYJuc3h6enNzhYeIiIR5gX12j398hImOhIKEe36Lg3t3fHd3mp2XeoqDhml3fXxsg4STgHKPgnGFgn6Bf29mbGZXXVtcW1RkcWVfWGNzdWl1cGVlY1dcXGiAcG9ygHSJZWV4fml0dnNzg4V4gIR5d3R1bmt7cGFna2eGdI2EbmZdX31we4l+aW13ZmlkVVdycI2mfIR8dpaQc3tzfHpue3uQhXaYfIeGg4aDfHRwcmxndVxtaF9sdGRnZml6b3tyWWeBd3RncIB3gnVid4WKfJSAbotqbXqBcWZzZWBtemdzd4p8fmJ1g3Zpa3F0enB5eXN9Zn5/f3l3bmNmYm6GfG1rVmpicFNLaWtPTE5wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWZgVmNXYnBdTEtrWGNhVVRVc1ZMWHVkWl9rYVxbY2Vfd2ZtYnBpc25yf3R0moF3f4B3f36GhXp9dYKEfpeFbnJ0e3p1cYSFj4GAeot1dJGAfYGUjoCFhH1+jIZ7foB2e6OlinmIhYRsdXx7dYOCjHpuhXN6hH2Bg3VuamhlVl1bWlpUYm5kW1hic3tpaG1pYGJXX1ppgGprb4BobGFoeXhrdHR0boWBe399dnVtemhqeWpfZW5ogXaPhGdlWGJ3aX6He29pb2dmXVVYb2iPp3aBenyQjnl1b35vc3V5j4B3lXSFgn+FiHZqcnZnaG5bbGRdbHNfZ2FpeGh7bVptgnJzaW+Afnl3YXeEhHiPhHKIcW95f3JjcWhcb3dkcXOIfHhic4BwZ2p4c3JseHd1d2SDe393dm9kZGNufH1rbFVpYmZTS21oT0dSa0VheGdhTVNxXUlNVFlla3d7ZV5tcWlkXVZfVW5uV0tUaFhmXlhOVWxUSlx5X1tfa11dWmJlYHpobGFvb3Vub3d1eph9d4CBeoB/h4Z6eHqDfoGThHF0dH56dnSFiJB9gH2QbHOVgXyDn4V/h32AfoaCgIp7doSsn396iIeEbHKCenaAgIF1bodvfH9ziYBqb21kZFhfWllaVWJqZ1taXnWBaV5ubFxiVlxca4FmcnR9aWpda3Z2Z3R3cW2Fe319eXZybHpoaXhmXWRzaHp3koFjY1RlcGeChXd3ZmhqYFdWWWhkkKdufniAi456cHB8Znlveox7do5xhH1+f4ZuZHZzZGhoXGtiXW9vW2dfbHVkemhddIBvcmtxe311dWJ0hYp6h4Z/f3dydX91YXBsWXF0YnFyhXx1ZHJ/bGFsem9qaXp4dXJmhXV6enVwZGFkbnN+aWxUaV5dVEtzY1FHVmFHYnZmYUtUb1dKTFhYZ2x2emRlbnFmY1pXXVh2ZVRKXGNYaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bW9udoOYeXKBgHx/iIuGfXV2hniHjH10dXWCeHp6goyOfX6EiWp0l4F7i519foV6gXp+fIaIc3GProx7e4aQfmZyiHp0fHx2cm+GbHt+bI96YnBvYmVdZVZZWVdkZmtgXVxzhWhYcW5aXldaXGx7Y3B3dmxiW21zdGd1dXBthHh+gHl3bm50ZWl0ZVtndWZ2dpF6X11SZWZqgoJ0fWJjaVxUWF5iY5ClaHl0goWQeG1ueWd4bXyFe3WIcoB4fHh/aGV2bWBmYF5qX11za1llXW9vYnplW3d7a25ucHd4c3RkcoOSfoeCiHp2b3J9cmJ4ZFtvcGJxcYJ8c2ZxgGRebnZpZGd5enRub4F1dH1zcWJfZm5vfWRqU2hYWVRNd19RSllZSGJ0ZGFJVG1TSUxaV2lscntibGxzY2FaWlthdltTS2RdWGlTV0dZYE5HaXVYXmFtW1tfYmJdhWhoYW54eWxuanaBkHlug36AgZKIhIF2dIl0jIZ0cnd2gXd8fX6Mj4B+k35weJaDfZmSeYCAeHl9f3SIg3NwmaJ7en+JlXlkdYh5c3h1bHRvfmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYhlUnJuW1pYWGBsd2RpdWpqXlptc3FtdHN0aoV8fn98d25ubGRpcWNbanJkdHaPc1tXU2RhcoB/coJdYmNdU1pgW2OTn2VycYWEkXRsanlsb3B6fHtxgHd/cnp6emRmdmddYlphZ1ted2hXYl5vaGF3YFt7dmppcm53c3N0aHCBlIKGfoR2cmpwfG1md1dca21icXOBenNmb35bYG9xYl9qcX1sbHR+c3F4a3BhXGVsbHphZ1NnVVdSUHZbUlBZUkljc2JgR1VqUEhPWlZrbGt8Zm1vcWFcWlhZbHBXUlBmV1dpU1RGWlxPSHJ1WF9jbWNYYWBhXYtqY2RteXhrbml1eYZ7a4N9gISZfIKEeX2Ibo+GcW93enx0goJ8i4+DgpZ0eIKUhYGfiXWAgIFzf4Fwh4J1b6KXdHuGi4d7ZniLb257b2Z4cHpsc3ZyjGtedG5hZ2VrUl1bVmdibGxaXHGMZE9vbl1WWFVnanRoYnRlZV1abnVucXV1eWuHfH98iHeQc2Rka25hXG5tY3N4h2taVFZiY3h9fXGFXWNfY1RbYFljlpVjbnCDhYpzamh6bmVzdnN8bHp0dW96fnVfZnJjW15WYmRYYXVlVV9gbWRhcV1dfnBoaXNxc3B1dWtthJOBiHuEcXJmbn1wcm9TW2ZqZnF0gXdzYmx2VWJxaltfbmV8ZW12fHNyc2ptYFpkamp3XmZUZFVWUFRtV1FXU1BIZXJfYUZYaU5IWFRWbmlkfGlreGtiV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWmJgXl6PbmJma3l1bm9odnZ/f2yDgH2Gl3t/iIGKf2uTiHJndIB7dYCDfYiOf4uTcn2KkYWHn4Z7f4aMc4CGc32Ddm6ljHOBjYt3eG56jGBkfHBmenN5bG1xdoJnZHtsY2ZnaFNeXlRnYGxvW15ujWhOam1gVFZTb2d0a2V4ZGVdWXB0bXJ6eHNtiHuAdpx7emthZWxtXmBvamVweX5nWlZYYGt4fHtwhF9iXmdWWWBXZJyIYmtxgYd9d2treGxbdnFseml2c25ve4ByWGpuX1ldVWFjV2RxY1NeYWliYmxaYH5sZmtzdW5td3ZraIWMf4h6h21xZnB8bXJtY1lgaGlvdIF0cl5pbFJlcWRUYm5iemNxdnt1a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVwXWNGWWlNSV9LWG1kYHhobn5kYFVeVF10W1RSYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNtaHZ0eoNzgYN6iI1+fIqHjnpukIp0bHOCdH9/iIWGkYSVj3p9jI+IkZuEgHyMhHN/gXN0eHFuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Njo6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo+Pj46OjY6Ojo6Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHx9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvLzAwMC8+RERERERDWGhnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHx0dHRwcHC43NTU1NTRNYV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHh4iIiIeOkJCQkJCQjIeHiIeHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4OEhISEhYWGhYWFhYeJiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5CJkI+MjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+Ojo6Ojo6OjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiHh4iNiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYaFho+JjJCPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+Hi4eIjIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISLh4aMiI+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIuMi42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpKSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZ21namdoZWhnY2JiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpeXVlZXmJhXl5aWV9bWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVBRUVFRUlZWUlFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUU9OTU9PT05PUFBRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLSk5JTk5MTU9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NFU0JVUEhLT0tJSUpISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj48RUQ9P0ZZQ1tWPkVFR0dHR0JERERGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09Q11EXmE+QURERkNGRkRGSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozw+PTpDYD5ca0NBQj9BQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6OjY5Ojk5OkZnQFxtPzk4PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/RDs+PT47RmlLXG0+Ojw+PT8/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11wQj5ERj9NZFhdZT49PTs8Pj5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZEPjw8PUA9ODo6bndKNzw5RVpjYGBkSTs8PUQ6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBbUTw8PUxQSUh2d083ODlUaG1naGxgQTtOUTk7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNARXV5SDxhgYSAent3XEY9QWVydGxtcm1PRmZPOj0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFJc3lrZoSEg4KDgH1gWFFGYnFycW91cWBgaUpAQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEdwdH2CgoGDfn2EdEpTZlhhcXJ0dnx0a21jSUpJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWlzfYF8f4R+eYZxQkhkbWx2gYaHh4R0a1ZJTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3iAhIWDhIptQE9zgYWHh4eHiIZnSkxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCg4SDhYeFh4JWbISHh4eGh4iJiHxRS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpWgoSEhIKChoaFg4KFhYWFhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWaFhISEf4CDg4KDhISFhYaHiIiIiImLjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIGDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojs4OTg5ODc3Nzk6OTg4Njg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3p7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXKEgIGDhISEhISGiYqKiIeIiImKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXR1eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA+PT4+QD8/P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKDgoKEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4qLXj5ER0lLSklGR0dERkhHRUJBQENFQ0NBQkNCP0BESEVDRURFRUFGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGWIWCg4SFhoaGiImJiIeGhoaHiYmKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkJHR0pZhYKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSklJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExOS0dHR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7PD06P0E+QEBDRklKUWCCg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEhFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QEVISkxXcoOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4tfUlJQTU5NS0pHRkJHSkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FRUVFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSEtMUFd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKREVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9DQkZWTkZPUFBUWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMj4uLi2dWVWthRVJRUVBJOztRU1JgdV1VVlRWWVlSWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLSEhKSEVGSUhJSElpcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFpnUlVWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx5hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSVFJWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSVlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNVVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpbXF5UUVFQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1c3N3e3p7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dDQkFEQE9QTVNkc3R1dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiW1hTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz8/Ozs+QEA/Pz5rUUthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNDPz48PUI+Sk1GVW51dXVzdHZ4enx6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXt4enx8eHd4ZEJAQEI9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztCSD9cdHR1dnV2eHp8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJYR0ZGSEJBR0lFRUZETVJQYVdSWFFQU1NSVVtPT1FXUE1KQ0Y+Ojo2NDg3OTc5OjM2Njc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYXNrYWFfXWRhX15ZVVBNT05MSEhKS0lIRkNRUFNaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnF0d3h6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KT09UU1RcVlJVU1JPTUtJSEhGPz89Ojc4NzY1OTk2NzY2NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYVFTUVBOUFFQTk5NUE5UUlBSTUlMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjQ1NjY7ZXBxdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0hGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXR2eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRUZISk5LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUV1dVTExLSD05ODc7P0A+PD1BQEI9PkVIR0RGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSUpMTEtGRkZEP0JDPjxCRj9CP0FkcXV4e3p7e3x7enp3fHd5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0JAQD5BRElFQ0hHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xNS0xNTUxMS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkJBREVHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUTEpJTVRGSUlKTEpLS0lJTE1PUFJQS0dDS0dDQkpKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0RHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQ0NHRkpMSkVJSUZHSENDO0FAQj5AQENFRElNUEdJS0dIS0RISUtNSEpMSEhKTEtNXVJJSERNRkFES0tOTVBOS01KS0ZHR0pNTlFOTGNuaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0RFRUdFR0JDQD48PTo7OjpAREA+QkNERUlGSkpMRklJR0ZGREI7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1ISUxHRUZJSUxOS0pIRU5IQ0dNTE9NT01OTk1MSUhKT1JRUk5SZmdmcm9zeHV7enxsaGpuZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQkJCRUBEQj4/Pjo7Oz06PT5DQT9BQ0VHSkZJSUxIR0dHRkVDQD1FRUI+QkRDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSUhLSUZIUEtESU1MUE1PTk9PTkpKSU1SVVRST1dkYGFtZ3Byb3J5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPEJBPkE9Ojo9Pzs+PkBCP0BCREdLRklHSUhGRkdFQ0JBQUZGQ0JDQkRFREdHSEZMUUxJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUJOT01RT09PTk9PS0tLUFVXVlVUWGBeXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmprc01HR0ZIQkJAREU8QUFAQzw4OT0+OT88P0I/QEBERkhFSEZGR0ZFRURDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZISUVDSUlKS01LT1NORFFSUFFSTk9NTlBNTE5TV1ZXWFZYXVpdZGBoYmppZ2tfZWVnY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaW96TUhHSEhCQkJGRTxAQkJEPDc6PT46PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkdKRUVJR0NHSEZIRkVDRkpKR01KTEtJSkxGSUlLSEVLS0xNTk9SVE9JU1VUUVNQUU1OUU5NUVdaVlpZVlpdWlhhYGBgXmhlY2BkZWhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnByc3lOSUhHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPD8+QUJGQ0VCQ0hEQ0VFRkdHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMS01LSU1MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZW15fXmBiXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZxdU1JS0hKRUJFR0U8QEdEREA6PD5APz4/Q0I8QD5BQUZDRURESERGREdFSEhGSEdJS0pGSkhIS0hGRkxISEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUlFMT1NSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm92SktMSkxHQkVERTxARkREQjs/P0FAQEBEQT9CP0FDSEJGRUZHRUlFRkRJSUdJSEpNSEhKSklMSkZKS0hJSkpHS0tNTUpKTkxOTk5PS09QUlVYVk1OVFZVU1JRUExOVFNSV1teXl9dXWBfYWFhYGJjZWFjaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dKTUxMTUdEREFEPD9FRUVDPUFBQ0JCQ0VCQkRBQUVHQ0hISEdGSkZDR0lHR0pGSUxISkpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhYmduaGJpaGhteHZsaGptb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xNTExMR0VBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NDSUZDSEpKSUlLRkRLSkdISklJS0dKSk5LTkxJTEhKTUtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVGB3dWlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5S05KS0pGQz9AQj89REVGRENEQkVFRUZCRkZIQ0RKRUVKTE1LTE1HR01JSElLSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXlta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz1DRkdCRkNFREVFRENISEdERUtHR0xNTUtNTUdKTkhKS0pJTEtKSktNTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncXBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9P0BGR0JHRElFRURCRklISEVHS0pHTU1OTE1OSExNSUxLSEpNSUtKSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdoYWRqdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRUNBQjxCQUJGREdGTEhFQ0NIS0hIRkpMTEZOS0xTUkxITExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2diYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTU1JS0tLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpKS0tJSElHS0tMS0ZIS0tMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RT09RSklOUFFkcWlUWVdbW1xVWVpdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NHQ0VHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0lMSkhGSEdKR0hJRUZMSUlLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWFxZWlhcVllcXWJfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElER0dGS0pLSEVFSkpKR0VISFBKTU1KTVNJSEZBR0ZKSUtLSUxKSUZFSkdERkdFRUpIQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFhZXl1jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tGRklKTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRENDRUFGSkRASkxKT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV5eY2FgYmJiY2NlWlFZVlVcWV5kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLR0NHRUJFR0hGR0hJRkdKR0hGSEtJTERES0tOTUxMSEpKSEpHP0dGTkpLS01LS0tJR0dDREBEQUhJQT9JSkhPXWFaW2RdX1RRU1hdXFxcX1pLV1xMUlxZSU1eUE9cX2FjZGNjYlxkY2JkY2ZYUVVUU1tYWmFeXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSUZGR0hHR0lGRkZJTEpORURLSkxOSkxJS0pISUdCSEhRTUtLT01LS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJhYGJiYGNiYmRkYlhPUVFSW1NbXl1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lKS05MTElMS0lJSERIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VDV1VFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJdYGBfYmNiXWJiV19fVFBOUFFYUl1cW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQRFdfSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOTk9NTkxOSEtBREFDREZEQ0FFRkJNSENMTFBPT0xGTUZHSUpIR0xMTU9QSUxPUFBTUExQVFNVWllXWVhYZFZPU1RQUE9OUFVUXFlZWl1cYGFkZWNnY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHSFlNR0hKSEdOTFFRSUtLS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRURfTERmY0VNW0lfXHNtT01WbVlMQ1BgVWxXZ0pdV1VeRExRVUxNVFZRU1RYV1RYVVRcVFBmWmhoZFhTa1RXVlVbXFtgYGFiYmJgZmhmbmxocnp8fX6BhISEg4ODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtHYFRISk9KSU9NUlFLTEtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzV1BtSHFucGFWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X2B3YFhhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEZKTEZSVkxLTklLUlhXUU5OTkxRVE5PUVBLTE9HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb3CBXWZ6dXhxcXpxfnN9a3V9YlJnfGVzc29zc3x9b315b39yX2BgYmJaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQTk1NSk5WXllVTFFTTlhaTFNTUk5MUElRUlRZV1dQVFBQUFFLR2Z4bGN4cm1aS0xVeXB1bXVibnZQZGVJZnZxbXdvgGpmeHhpWHNSaXttaWp6en1seHp/b2dvWHZ2anV1cIBgc2h8aWx4fG9eX19jYlpdYmRnaWplZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKTFBPT1BNUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExoeH14YHl7c25hXm1vZFJncnVubXlwd2x2dHRxbG1cdH56a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGZlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUEpMTUtMUVFRUVBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ7XVRLbGB2dWtpdXt7bX54a3xwXV5eYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobW1yfGttaGt7dG1ta21PSEpLSElJSFJRTE5PTUxUU1NPVFJXUlZUUFdaVlZUVFRhYFFPTktUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZX1tncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1FSVVVWU1pRT1NSV1VUWVZUWVVUUlVUVFRXWFddWl5hXVxaWlxcYGNcXWJjZGdlZWRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLTE9PTE1UUE5TUVFNWFhVVFVXV1daVlRcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVRZVVdZVVJSWFZVV1tZWl9dVVhfXV5dXF1hYV5bYmJjaGZlZGJYX2BiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FbWlhXWFpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUE5NUVFQUlhUUlFPTU9TVU9XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVlZRUldYVltbV1FUVlZVVlhUV1dUU1JYVlVaXVldX15WXl1eYFxcYGBfX1piYmRoaGVkYVliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVZWW1tXUVRXVVdYVlRYWlRTUVpXVlxeWl9fYFVhXGBhXWBiX1xgXWNhY2doZGZgWWNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeYFteXmFgX2JcWWBaUU5PTlZRUFRST1VUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSS1FUVFlaV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlTVFlcVFJSXFdaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZmlkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1bYFxgVVxdaWpyfXNsZ1xVWVdRT1JbU1JRVFJUVVRLUVdWW1laU09TUlZWVVNPVlJTWlJUVVRYXFdYWFNYXFheXVlaXVRVTlZXV15bWFFUVVhZWVVXWVtUU1ZdWV1dYF1iY15ZYFtlYl9kZF5eY2NhXWVmaWRmXV5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVVZWVFRUXl5gXl5iXGFVXV5ia3l0bH1sWlVaVVFRU1xUVVRVVFZZV0xSWlZdW1xST1VTWFdWU1BYUlNXU1dWVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paU1RWWllaVlhZXFZVWl1cXmFhX2RkXV5dXWVhYmZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRSWFJXVlRSVFhSU1ZUWVhZXV5YXVtVXl9YX19YXVZRWVRZWlphWVxVVlhbWlpYWVlaWFZdXl9eY2JhZWVdYlxgZmJkZmRfX2RiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaVlNcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFlcWlZYVVdbWllcWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdbWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVtZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFZYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xSVlhRV1ZWVlZWU1ZUWFxcX2BgXWBdV2FeW15cW15YVlhYW1tfYFxfWFldXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBYV1hZWVdWWFZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBfXV9ZWV5dXl5hXFtaWVxfYl9iZGNlZmVmYlpkZmdpZ2NfY15hZmRaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FiXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNgUlxZT1hXWVtaWVhaWWBdYGJiYGFjX1xiXV9dW15eWllVWF1dX2BfX1taXl5gYmNcXFdbXWBiYWNlZGdlZWZkXGVmaGlmY2JiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9dXF5cWV1bXl9hY2JhYV1iW2JkYmBjY2JdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFfXVtgYWJlYl9dU1xfYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WDgYODgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHx8e3t7fHx8e3t7e3t6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiY2NjY2NjY2LiYmJiYmGs9bS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyMkJCQkJCQkI2MjIyMjIi/6eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4d3h3d3d3d3d3eHl5eXl5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fX19fHx8fHx8e4GEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV5dnZ2ent4e3h3dnh7eHl6en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp6e3t7e3t7enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx8fXp5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eX1+fXl7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d8enx8enx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en57fX16fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHp6e3l5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh4eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8e358fX5+fn5+fn1/f398fH2Ag4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAf35/gYCAgH+AgYGAf3+AgX9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35+gH9/gICEf4OBfn9/fn5+fX5/f35/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5/f4x+jYV+f39/fn5+f4CAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH+Bl4KUjH5/gIF/f39/gIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCgoaehpeUgIKBgYKCgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCBg4GCiqGImZqHh4aGhoaHiIeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEg4GBgYGLo4qanImGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4OCgI2jiZeciISEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4KCgoKBjaOPlpmEgoOBgYGBgH6BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSOhIGAgIWfpqmol4KCgYOGg39/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDipeJhIOEmK2nq6ygjoGChJCEgYGAgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhoSEg4ODgoSOmY+FhYmloZmlo5ueiYKUlYSDgoGBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fY2dmZOEiJ+UkJ+clJ2Vkp6OgoOBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX58gpeToZ2Mk5KNmJqUmaGhm4eBgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICWn4t+f4B9h4t/hIaVqKWfkpGVj4mVoJ2ZhIKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZKgioCMhX2GiIGAhomcoaKQg39+foKWnZGCg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipCChIqFg4KBf3+DiI+PhoB/f4CAf4KOhoODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGIgX+AgH+Ggn9/gICAgICAgICDhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgIWFf39/f4CAgICAgICAgICBf3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjIiBgIGCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYmDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYGBgYGDg4SDg5GSkI6PjouHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B+fn5+fXx9fXx5fIOGh4eEg4GDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4J/f4GDg4ODg4KCf319f4CAgX99fn59fH19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af3+AgIF/gICBf3+AgYF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDg4OEhYCAf3x9fX59fX6AgH99f359foGDg4KCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gICAfn9/fn59fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn5+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOBgoOBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjISDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhYSDg4SDhYSEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYGDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJKSjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgICCgYKAgIGBgH+LlI+Mi46OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIJ/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRjIyNjo6KhYaHhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2MjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX+AgIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42Mi4iEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4WBhJGOjIuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+f3+AgIOHiYmJiomKiYWIkY2LiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH19fXx9fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fHx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICAg4F/gIGEgX5+gH9+foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICBgICAf358fX19fX5+fYJ9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmGhoWFh4WFhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYWFg4ODhISDg4SCgYB/gH+AgX59fX5/fn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4KDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKDgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9/f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgYB/fn+Bfn+AgoKAgYOChISGhIB+fXx8fHx7eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn6Af31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXh5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgICAgIF/e4B+gIB/gYGAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDg4ODhoSAgX58fXx8e314d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH9/gYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFyb3h3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/gH18fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gYGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgYKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgICBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHh4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg39/goGEg4OEgYGDgYKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEf4CDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGDgYCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4SDgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgYSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgIOEhIWDgoKDg4KBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+fn5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CCgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhISFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fX5+foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZzhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fX6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB1gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3t/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmpveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhISGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxte3p5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEg4GDg4SEhYSFhIWEhoOGh4WGhISGh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhoKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoeGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaFhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeHiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHg4eFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoeHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEg4aChYGBgH9/gIB+f4CCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aFhIaHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTV1dTU1NTU1dXV1dXV1dXU1NXV1dXV1NTU1NTU09LT09PU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXU1NTU1dXV1dXV1dXY2NfX19fY19fX19fX1tPS0tPT1NTT09PT1NTV1dXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dPT09PT09PT09TU1NXHt7m5uLi4uLi4uLi4t73T0tLT09LS0tLS0tPT09vi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E9PkA3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oip8/T0tLS0tLS0tLS0tLUvaCjo6Ojo6Ojo6Ojo6Gr0tLS09LS0tLS0tLS0tDf6+vr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSko6jP09LS0tLS0tLS0tLS1b6ipaWkpKSkpKSkpKSjrdLS0tLS0tLS0tLS09LQ3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7PDw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsz9PS0tLS0tLS09PT09XApqioqampqampqampqLDS0tLS0tLS0tLS0tPT0d/q6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tTV1dXV1dXV1dTT09PU09LS0tLS0tLS0tLS0tLT1NXW1tbW1tbW1tbW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M/P09PPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXU1NTU1NTW1tbW1tbW1tbW1tfX1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXS0KGWy9PHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPTo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayUzqigq5/PmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpqSflpChtJWGnZzOz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PD06Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZqKnaCnmbS/yZeZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmZnaWejKDE0pKZoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGanb2bxcmU2a2jv57V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKLGnZOWo7vNiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLNspuus52l0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPu6yfmqGcnJGnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZOYoamfop6ooqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQT49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQqrONkKXUmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9HWwL3W1NO5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbS0tTV09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT0tLS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYm5qZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6OjpKKhoJ6bmZmYmZmZmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoaGfnpybmpqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56bmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmpmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZmanZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmYm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkouQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6JkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjomJkI+Oj5SUmJCVnJqdnqiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6KhlZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6qpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapaekqauvrKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66vqqqrpKGipKmnpqmoo6Kcm5ukoKWoo6CYnZifoaKpp6Cioq6sq6qnra+opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKelp6mnqaijp6aZnKSmoqGhoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+hoqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZabmKSioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirsKmoqqihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltaYF9aXFZcaGRuY25qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnaGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eWpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKumpZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odWtxaGlpYVlTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW1vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1r7Ogp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5rY2Jud3V2bmxbYlFWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbWZudXFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppqWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3RrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+8u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKastLWsrqWko6ikoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ4c3lmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GycW/w8DLzc/KxsTDw8HEvri+wcPAxL/Bz8/Ox6uvtrS1q6CntLOuq7i1s6ypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczOz8/Mw8fGyMnIyMnHxcnHyMe/xcfExMnMytLP0868uLa0uLjBvr66vbq8urysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGppdG14bF1kW1ZgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzsfMycLCx8LLy8jGzMrOxcbFw8XKx8rQzdDMx8TAw8LJzcfFwcTHwby+tLCwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8S/v77Ey8jKy8m8u8jGyM3Iw8jJycXFw8LAxbXCycrIvsXHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2pkYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nH0MrExMDDwcLBw8LDvr+ht8HBwaC6x8zLxcjRwrC+vri6u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjZGNqYmdjW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8y9S3u8DBvLvFvbvBxL+/kqe9wrt6qcDJxMDAysCxwb+7t7u+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmNoamdmaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre1ub+7wd6Xfsm8w7W6x7e2ubu9vYqbvca2YJXAxcC/vMG+uMa8wr+8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeHFtZWVmb2lla2hYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDLfYC4xMe3ubiut7W4vbWAkb3IrFZ8wMbAwL+9vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYW1gXFRJS0pESkJDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7K9vrvEtrW4tbfAvsS8wsTWqnR3kMbPwsC4r7W1u8OqeYm/yZ1VZrXLw8K/v769x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGludG54Y2diW2NRS1RIRUVDSEM8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7G5vL2yvL68xbixt7m+ysrIw8bLzopzdI7M0czKxLW6wMTOl3GFwceQWFqXzsbCv8K8wMPMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vM/MvLq+vMS+t728sK+/vcHLybF6dXqNxszLzcrGwsTL04Rtgr++hl5YesrGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8tsC4y9i9vra/wL+vhXZve3aEl7SZcXl7j7/Hy8jBw8HAyctzaXu5tHxhV2jGxsXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3hzZ3BdW15dWVJFRENNSUFFPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFcnzBzLy2ucOth2dbY15QW19wf292fJK6v8bAucC8vsbCZWFyrbN1YVZhwcfDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f312bHV7cG5pW19gWVNQQUZIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnFynRnhrW9traebmpnVV9bSUxRU15vc4GeuLjCurO7t7u+vWFaZKC0d11UZ8LDxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3V2d25xYF9mXVtUSj0/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLW3x8Z8dGmFpbaYYlNFX1FNaWVTTEhQcXiIobC3vrmytbK8urtnVVeYvH5TUHLBxMbEwL2/ubOvsby6rru0s6arqK26vrjLwr++rKuwr7O7t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVteT0hCPz1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8O5hXpubo6gb09JQmtSQ1x7h4dbRleIpqewtrq1tLKsvLq6dFVQhbeBTFSCv8HHw7+5urWtpa22saawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTkE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i6vZGBd3KFfldGQleIUUtOYX2HflFDT4a6srO1srSvrLu6uoRmW3ifgVxxl7m7vbi2srGtq6Ctrqido6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c210aWxdW2pUXVxQTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1sr+hh4OEfWZMQFV6cExKTE6Hq29WP3O+ubO0srCxrbC6t6uOg3SFpampqa2uuK+qq62so6istKedl5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+1qpONkJtjRVadeVJXSFFhSXx/Y2N3rrmyrLOvrqytt6mVjZ2kqaSfnJydnaeonqCoqKGpt7GflpePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6ajm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXFFoVFBOR1BNTEJPUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqrmynqK1UUF6nXdYa0pVY2l2dWRqep2ytKqytK6qq6mSlKuvp52Ql5OPmKCeoaCcpKWtp6mgmpaXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mbpJmXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFVRY01KSEdPUk1KTkc8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqKCwwbm9fE9LbKpcan5xdlNeb2FgbWiAlrGvrrO1qqehoaOdmZSNkJWXmJicn6Kim5+tqpCXl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ+cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJSVWBISUpLU1RJUlBMOT9BNjc8NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWdocPBgFVWZnB9dm1menJUX2JkamxibHCUtLCwuKymoZ2empWYmpmQjpGVkYyOjpSco4x2l5qal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKqyrqKZnJ2eoZmbm5qYmZuUlpuWmZ2loaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKTk9VTFNMQTc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6xpZB7bYZwYmVXUVxVV0tOVVpUT19ZbLSzq6+nn56ioJeRlJugm5iXkpOfnKGkmIZsdZ2bn5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWp3dV1sWlJgSFJVSEZVVkpCTEc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaGihGRaX2lhVk5QRj8/QURFQkdSTE+otqqppJ+fmZKSlJiYlpWVjIiLjpWdnZ55YYafmaafoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+np6Wkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdCRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfmYFfXmZgUkVFPEs8RjxCPz5AQU16qa2pqqWfnp6io56fnZqcm5STlZSdnpiWfXSTopqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqzta+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3RycWhWXFFGVEhESlBJP0VBNEZIOTU7Pjc7PD88PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfoIl2amFXTkQ/TF9+bF9DPDM1S3uqsqejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeG+CnaSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMnJw8HGvrq0urq1u7ewtbKqurKuu7e/u7qquK2rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFNNREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdnJlxamBVSUVAQVKNnqSKUEdeja6soZmbm56emZeXl5KMjpaXk46NkIuCg4J3cnFtcY6mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczR0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfFx8XBvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8w8LCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREVQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6UZVhQTEVEQUZevtbDo5Ojs66jnpyfmpeWlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub3LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LV1tPUyMzGzM3J0s3O083FyMnKwcbLx8nIxr/Ds7PIxMvLy8/Gyr++v73Bx8TMzMjJwMO/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm1xMQ0RGREtVeLq4q6+vppycnKCkoZ2alJOVlIl9d3BrZWJocW9xe4WKgHVwbnF0cIWzwr3E0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLV1tnV19PX2M7Sys/RzM/QzdPQv8jHysTMzMzOz8XGx7a/yr/SzczPxsnIv8TDyM7N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTQ1ODY7ODY6PEA+Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWfoqNeRTtBQklabJqurKiblJefnJqgoJ6bnJmViXdpY2BfX19fXl9fXWJsdXRwcG9scnF1ksTHxdTW19fX09bQ1dTa1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0svO0MDGw8jGzs3R0dLJzM3AyszG08/MzsjEysfHyMzK1NTR1c/SzNPCucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaOwc0RAQT9TbZ2wqJ+XlZeZmpyfnZicnJJ9cGVjYl9fYV9fYWBfYGBfYGZucHBua29yd3ecy8DS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY19fLyM7Eyc/NyszAycDIys3O0MvQzs7Mzs/Iy9DRy87KwsnHyczLzNLTzdPR0dDQyr3IubCuu7i1qrawrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramlqn9iZ2Jph52fm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBgYWBgYV5gX15cYm1yb29zdHZ2eaS9y9XR1tTT2NbOztTLzs7FzsrS0s/Hzs3N1MvO083L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXMwsjJw8zDxcjKys/KzczQzdPLxsjPzcjHy8XGwcbKzM3Q0cbQzs3NzM/Fx8G4ub3Dw73DubKyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYZ5cXJrbWdgYHBoWVhoVkxGTElQUUI7Qz47Njc6ODo6NTc9PUE8Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKifrYlzhIehw6qWjIyXlZCTkZGVlpWQi3xlYWJiYF1eYWNiYGBfYGFhYF9dW11ncnJxcnNwbXJ5pMbTz8vQz9PUysXJycbGv8PGz87HxcfNytLIy87OxtHS0M3M1MrHy87PyMfP0svRz8a6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL/Bx8zMzM/CysvIx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7utpLVzY3+AtqyQjo2Wj4WDg4OBfYSEfnNgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvcH240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jLycjKyMHFzMbIy83JxMLKycHCzNDFy8i/ucG7xsi+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xr28wMPFzMXFvMDKwsXH0sXAyb/KycbIxtDDw8bDr8TLx8TKt7+8urSprKSlmJ+YrKOhpZujoJuUe3dydGZpWmFubFpcWFJETEZCR0RMREZTQDU0MzM0Pz0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sbCxZWV6i7aQi5KWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjBwcHFvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7u8bDv7zBzcPGvr61wb3Dur3Gu8K6s7zFxMLCt7+1tr6/u8zDvLW6yLq/vsvEwcbCxcnGycbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NXXllKRkpGSEpBRUJFSUA5OjY0ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys/FycXHwLnFvauvnlxpcpeUi4iKhHh/hoZ/foR7dHRjXFxdXmBgYmNiYmVlYl1cW1xeXF5dWltcXmhzcW1nZ25wcnmdvczAw7rAuK6wsaeqraynuLS3tLOztLu1vrK3sLWvsrzCvMHEvMC7tbK6vsC4x7m0u7bBwry4vcbBw7u1r7K2ur+0xLe7tKu4vb3AvbG7trC2urPFvLauu7+1t7TFvL7DxcDDxcbIy8XAxsa7x8vAz8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcW/vrm3ybaqsZJcbXWRjoaJiXp4foaGd3eBfHNoXV1dXV9gX2BkYV9kZWNfX1xbXlxdXlpcW11fbHBuaGZrbW5yfKTHv7m4tbCrraeeo6qnnquts62qrKm0rrexs6mupqyzvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLCnsrO1u7yrrrWmrravu7Kwqrmwrbuuu7i7wMC+ucK/x8PFwLzGwsjKuMXHxr/HxMO6xMbCu8bJzMuzucK9u7OJc3Z2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXQx83Bw8a/xMTDw8rCycq+wLzBurK0tMOuqbCOX2+AkIiOkHt4fYmFenuEgHduXl1cXF1fYF9fZGJiY2NiYF9eWltaWl1aWlpaXGVub2hmZ2lrbnGBrbmwta6mpKenmqCloZqcpauupKiirKqtq7Ckpp+qrbW2sb25r7evqa64tLS8uLS8r7i5tbK8wbLArqWpo6uxsrOovaqrqKutrbSzpqiuoaSvqbKmp6iupqi3rLGyt7q6vLG8vb6+xL+1wsHHyLe/wMW3xMO/u7/Ewr7EyMzKv77EwMCph3N0cmppXWFvY1dWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9CO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HKvrvJtr3DvrrKt8HDwbS1u7WwrrS7raeqkWlph4SHi4B7fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWppauloJuhpZSepZuYkaGjqqOjoKalqKWtoJ2cpKassrC2t6ewrKiqtKu0urG2tq62ubKwurqxtqWgpKCmsaerqLmqpKenqKeyraCnpp+bpKasnp+npKChsa2trLK0s7Swtby2u8HAsrq+w8GyubnDs8G9v7W4vL2/vMLHxMPDvsDEoIN4cGxiZl9rb2BVWV5ITmdPVEdFS0Y8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9tqCelZ2hprq2q7Ozu7PEz8nLwsa4tsfAzL+4ybe7xbizxLizvsCrtbuxq6Sus62foZBnbIaGhoB8eXVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1vh52poJeVmqGWnKOZlo2foaOnnKCgpKaip56bopufq7CtsbajqaqqrKyktLmtt7Css7Wus7WusKqfnp+korKkpqm4raKmpqCorKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2vLy6q7OzubO+tLaysba1v7a+wL3Dwbu7vZeEenNsX2VeZGRYVFddSVdcS1BHSUpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4uL+3ssK0sbu7q7i5sKGeqKunlp2Qa32Ghn94cm1vbWtiXmFmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1hYWFhaXmJkZGVmZmhpa3GNqJ2TlJSbmJuil5aRnKKiqJ6cnaWmoqWcoKCbma6urq6yoKairqunorWxsrKsqK+yp7qzpragop+co6Gto6Kqtaqio6aepaajlpmel5mbnaCal52dnZytoqunpKSmrauztKq1sLOrsrm0r6qvsrKzuLOuqayusrixu7a6vb+3s7GUhXl1Zl5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLMyMa/xbbBwMbOt8DEvbO5ubO/trG4uqyxtK6emaOpn5OZjXSAhIR/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGck5WQlZeXoJeZlZegnqGdlqGhqaSfnqidnJqrp6+wq5ujpLiqoaCuqLaqpqetsKS4sKS3oKObmZmqpqGarLivoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK6otKuqp62zsKWrrrOxsK+ur6aoqLKtsbSwvLS5t66jlIF5dWReYVZZWFNSVEtNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rp2nqKOqu8C9wLmutLjBzMfFwsO9xbjIy7LBwsGtvLu1u7y1uLmvrq+pm5igqJSQiYh/gX13cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjY2JjYmNkZmmBlpOWjJKUlJuZnZaWnKCcn5ahoKampKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsa6stJ6hnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJOXl5iXnqecp6GimqSlpaukpbCnpaOrq62mqa6vrquoqqmzpqasr7Sxr7y1sa+voJJ6d3JlYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxce2xcSywr/Fq7e3vba9urq1squsp5iXnqOLiHOJiH93bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVNVUlVgYF9gYV9hYWNlaoCUk4qRjpSTlJ2VlpekmaCXnaGloa2mpKSjo6Kcqqulmp+lsaqgoZ2lq56ooZ6trKmprq2ioqKVmKObnJCrqbCcoKKfnpeZk4qekY2Sk5aQmJiUnKGjnaShopWgoqSmm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5uq+prJ6McnFvYFtXVlZSR1FPSFpbT1JKVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb7DyKyxuMG1u8C7tLOpq6aVmpuciIByiIN7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eX19fYmRtjpCEkYePkY+ak5WTnJujnJuhqamrqKynqKakmaWvpZWZpa+qoJyZm6Cer5qcq7Ogpaafo6ShlZOblpaSqaqtmpyfoaCblJCMmY6MkYyRjZaVkJ2ioKOdnKOVm6CjoZeiqKOiqKugq7Ckrbelo6Sira2qqKuvs7ezvrWyq6+YhXRzaFtZWVNVUkVYTFFbWE1UTlBMUFFJTklCPT8/QT89NzU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1NzY1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9urK0pamglpeYl4d6dIB2d25taG1tbXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH6MgYt/jJGKko2XkZeZoqCboKuqpq6sqLCkqZqfraCVlqSpqJ2YkI+anq6XmKiqmZ+dlKWhnpKRkpGTlaeqpZqZmZ6elo2Mi5OGiY2Dj4uSlZGgnqGkmJWflZqhop6Um6Wlp6iooLGxprG8p5+jrLWrrqewtbC4tcCxrbGrkX5yc2JWVFVOUkpHVlBSUUxMV01KTE5SR01LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OspbG3qqWisaudqqepsrGktsa0ubqzysW5usHL0Mqxtri7vcHDsa+xt620s7qysqGinJ2Xl5SDf3drZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domOh5CKl4mUlJibmZ6pm6CqpqWsnqiaoKack4+fo5uXl4WEkpujkJWjnZaWloiim5uUi46KkJqkp5yVlZebkZKHlI6LgYuNgJCKkpKSoJqgopaUmJmVoqaZjZmkpqimoaC0sqeyt6Gcoresqq2ksrKmtby1rKuxo4l5c21dTlFRTE9DTU5OUEtGTk5KSk5NUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKSnpKqloKimpbOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq26r6yemJmclJOHe4NuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOipJmll6KclY2HmZqMc42Dfo2XloaRmpCUjo57mY+djIKJf4mYn6OekJOYloWNgpR+fnSKjnqQh5OQkJ2bmpqSlpCdjqOjjomaoKGjpJuitK+sr62fmKW4pqaxobCunLC7qqmvqpmDd3NjVk1ST1BOQ1NOTFFMQlBRSElOUk1ISkpESkxGSko9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWnpqezp6W0wbiwtLDJxLe5wc7GvbOsusGrrcOtp6Kmkp2mtq2ino6UlZGOfnh+ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11pbHJtf4V8dE5YcpCDl4eOnZeLlJGfmJ2VlJaVj5aJgJOKXztXb3yLlImAjJKMkIaGc4qFl4F5gXuGk52Tg5WOkZCDhn2TeHFwhY19iYGRjY+XmpmTi5CJnYifmIiHlp6aoaCXp66pramonpats6KmrZmsq5ios6KpraOTfnJuYFtOU1JXTERUSlBMTEZOT0lFTFFNS09KSUxQRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepqKOqsKintMG5sLWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm7CimZaFk46Khn1zdV1QTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFFCQH+VkpJ9iZWNhIqNm46WlYmSiIaVhnmJf2BKUW54ipGEfYSNioV/f25+f5R4dXZ4hI2Zb1GNiIqGe354lHZnd4aIfYqJlYuNkZKXjISKiJWEmoyChJKalp6dlKSjqKmlpJ6asKuhpKSRpqqWoqqcoqaoiXVtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+hr6GnqKWnqLCtqra8tre3s8G7tqe6yLi2qKi1tqqyvKaelo5/iZOolZSJfY2DgXx3cG5YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVlYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXFWPiZSJdH+HgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI2NgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gHZycpJ3aHWEhISFe5WKiIqNi4B/hIuMgJSDfICPmJSclpGenamen6CdoKmln52YjKekk6Gglp6epIByaGFcXUpXUFJISlhST0pMTVJKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlraywsqq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGOlIGNm42QfnaFd3t1bm5pWUtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfHhmd42XmI2PfWh5gXZ4gImPfYSYkoFyh498d3tva36tfHOQin97hpKBfX90ZnZ8hmxvaHN9iYyIgGx5cX1xbXaPcWhxgX6OcEOLhIKDhX93d3qLhX2Me3V9jpKPmIqSmpujlpmdmp2eoZyWjYqkm46el46WmI93b21lYlpYWFVRSlNVVE9QTlBWS05LTk9KUU5IT09MRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mPhZJ6iI2KiXVwe210cGlsalhLRkdFQUBDRElMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnt9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCSlZeZl52WjIOJnpGLko2GkJZ/bmlub25YVlhUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCjrKqota+urLS/q7zCv6aimZWkl56NhIuUoaGYmJGTi3OOeoCFi4V0bnRrcGxka2pZTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyakXRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxf3xocXF8bpOOj3xzfXxxcG51bYJ/d3l1anmJgoiJhJaSkpCLjZGUlI6XjYB5iJeIhoqGgJCIdmpqb2hlWFFaV1lZW01QVVZZWE5JSEVKSkhHQkBGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfp7uvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4J0h4yFem9ycG5vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiYBnZ2JqbnJscIN1aW9YdXCOm5J3bH97fW1xbXCAenN1bmJ2g36GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2PenFwb2tgW1xeXFlYYV9STltaWFdMSEpGSkc+QkFCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ2kp56vlaW1qq6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+FdYKEbJWIh3t0eHhsd253Y2leSVBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgISZhJucYYaqn52Lg5CNeneIfomIjXOKl5CDel1kcnR6e3eKbWhqYnlvhpCCem6Bd3SEenB0eXdrbmldd4d8h3yHh49/i5KXg42FjIZ9cYR/g311d3t8iXZwc3RlZ19bW15UXGdeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnJ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF+cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxyfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkqiHgJiYipt0bXyBhod9jmhnaHh/boWHgoVxhIVHbIB3cnl2aG1rX3d9g4h/iIWLepWdm4mLiJF/enWLdnx4bW93fX9zc3JsW11dW2NjWGdmXFVPUFZZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU5HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiJGBmpWCoaGYlZuapa2Tmruxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYqQiJBpaG+DgHSMh4SLcYWCd4d/e3aFfW52dWaAlI+GiYmHiIehqqKWiY6Yf3qCiXp5b2dreH56fnJqZF5aWl1qXWFmYFlPS05XUlFIUEpETkdDSkRCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc4Oz0/QkRISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2aj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPoZ+TmJKEi4WPmZGWbHB1iYuCloyNj3ePhHFthYGKlpGDhYhyiKGWh5OJjo+WpbWpm42VooOHk4N9f2tqa3yAgYFzYV1jXlpma1xsa15XS0dPU1FOTUxGSVBDRE1GQUNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+l5aalZ6enKegqZaTmJ5nZaSafoSSkXmAkoiQkn2KhJiSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0VOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZyopaKZoZeilZ2fqJ6oq6CorKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlaKamnh6fpSYkqGSlpiBlJ57d5WSq7OIjZeffZSdnI6Tlpmkoqa2sJ2RmaiIlo+NgYhsc3J8f3xxaGBcYF5iZ2NgaGdbUkVKS1BPSUpMRkZNQ0hMRkZDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWDhomBgIZ3X2JQNDYwLTEvLC4wMC8vLi4wMDE1PkFBTVFSU1BSU1VSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYaQd5WLo6eqtL24pK6srKeotKuwtrKyrbuxs76cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKOXgaaZjaKqqKSIhZSkoaCqoaSpj5yxi5Wjp7e7m6CjsJOinaOekaSiq6+ts7WilKSqiJmJkoqVeXp+hX5nYGhcZWJdZGNfZmZfWk9DSUhUT0ZITEZKR0VGSEFLRkNGR0E7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GPg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS4tMz9EQU1VUVJTVVVXVU5bUEdHRTw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqscHHw6qzxbass7+zuL62v7TBtru7pLjGqLbJx7W+ubSoo7StsbGbmZKan4mor6ullHafpJehq7GzmZaqraiutruyuqyvtaKxrLG1vLe1rrWgp6ejqJqpsK2yuri4p5u2qYyljpGTn4Z4goN1WWFkVmVhYWNgYWZfW1RKREVMVVFISUpESUdFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFjZFd5dXGBlH2Fh5N2hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjYeEgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6Ppa6jsbTDtrjBzMm2u8S9s7PAt7fBtb+wt3Sxs6a6xaSwxrmxs7G0qKS1tqqxoKGWm6KSpbCupq2rp6SYoKyzuqKpsrq0u77Mv8XFvb2zwre6uL+3ure5rKywprGqrb6wvbvCwqyZuqiUro+Xl6uJfYJ8aldiYVhqZWplV1tkWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVVadmpwf4+EgY6EbnpzeYdiuKGZo4mVk5aTk5ONkJaSh4Z7hoGNloqBhIGKenyLh4Z8ioOBioOVfXh6dWVPXGRHRUw6UWNhW15TRj87SFBEWmNRUVlYWmdZVGBgTVNPRUE/SUpIRUZBQEM8RTZCPkhHSkxTWlRdk6+4tbq5yb+6vcnMu7zBvLe1u7u3vbS6scZhdbKlsZqeqr2qpairqqOisrWhq6ielZafmJ+upaempZ+jlKKmsbSnsrK9tsG908nK08bCxcvBysPAvr2/u7y3tLC5t7bDusW9w8iwnrmqoquOpai2iYB/cV9hYl1XYV9oZlJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdsbHGQjYWQc2xycnOI1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKf4OAg3h7i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV9uX1hnZVVZVEpEQUtLSEZJSEhHQkk5RD9IS1RUVlxaW5K5wLm9t8bAurjKy7q3ura4ubK4tbSutraZZHWonK1wXqGtnJigopuknqullKCfkJSOlpiXqJ+ln56amoSknaylqrCst7C9udTRz9fPyczRzM/OysbAv8LKvcG8wcDExMXKv8jOtKS7sLSvm6u5vJp/eWxdX1xYXWBZY2NRXGBTUEtDQkVHRTxART5CSEJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KQlG9sb3V1h7OsoaGfi5mcmYyNlZGbkoWKin6Ih4yQi4l8gYRze4qDhXuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJetpLyIh2dbb2hdWllUSEtOT0pLUUtUUUhMQUpHS1BfXmJmaWGXt8ewubO7vrWxxMe1sLmwsLurs7GnqresjbannZunmk+anYyOoJaRppillYqTk4mQiY+RkZ6boZealZaHnpqmm6yvqK+ns7TU1NTW0svP1NXO08/NxcLJ0L/KycrJ0sfMzcLQ0riww7zEuaW2usSigm5jXFxdWGBXWGZaUV1XT09CQkhFQkk7QUQ+QUc/P0I3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmIJocW95eYOgqp6ml42bm5eLjpWRmo59iYuFjoqKi5CHfISCcH+IgYZ7h3KDkouPfnF4dWtxeH5xe214c2xpgXBtY2lucHhpd3x+y7/C36dtY3huY1thYEpQUlVOWV5QXl1NUE5UUVVVXG5udoJyl624rLSnsLarrLzAsau1pqW4p6yuoau0o46xrpqYmIyRk5GEjpuBjaeSnImDi4SKiYSLg5OVmJeTm5GcmJmZnp6rrKSnoaytz9LV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbFwM7Hx8OovrfQnnpuZV1iXFZgUl1bT1BUUE5IPkFGQUJFPEBCPkVEPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bHdwfX5/oZ6eoYuNmZOTjIyTj5aFeYWPkI2LioiRh3+Ce3J+gIGHeYR1hZORiX9vdnJrc3x7d3xzgXdxa4BzcmhvcXp5cnu+y5t+jLKDdnKEdmhhal1DWlpbV2ZkWGVrU1hdXWBkXmN4e36LgZmqpKShoKGopqqwuKqltKOhraKjraKnsZ+JppqUkpGJkY6IgZSJa5WijZmEgIV9kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMjOz8jCy9HU0dTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMTDy4tzb2JgX1hUWVJcUEpHSUlKQDs6O0VCRDxCRD5IQj9CQzs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3iElJmKjYiIi4l+g3h0e32Dh3d/eoeRloCDbnhwbXV/dnh+dIV8eW2HdnRufXaEdXl7nbaNPEGLxqV+jXxpZVZJQ2ZjZWNoamRveFtfZmlrbmlugIOJkYudnqCdkJeYn6OkprKkpLOgoaWeoamgorGchp6SkpKQi46LhoOQhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipqRqrOYmpunnKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1b/LzLR4dm5kXVlSVVBaVkZHSkpFRT06NzlAQUI6SERARUNBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqCh3x4hZaXiI+Dh4WHeoR5cXp7hIZ1eoWOjZ16jHB8b296f3F8gXGDh4Fujnp1d318gnV/fIeIsHRZqcK2jJKCcG5iPV5ocnBxcG54d4FlaW9ydXhye4uHjpSSm5WglYeMk5ugm5+qn6CtnKKamZ+lnp+smYuajJGRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI6UjIZ7m4iTj66qlJWXnpinrrW9qa29xsvIycvLz8jD0crU1tjX2NfU29fT2dvWz9va0dbJ1MuVeXtoaFtZUFJTXkhDRUlJPkE+PTc6PT87Pkg9P0FBQURAPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoKEfoR8fISXjoeLfoaGgHeCeW57e4eBdXqSno2gdo91gnR1gX10gIRvgY+Cb5KEdHyBhXp2hnyJt8alwsm3gZabj3dwZU5mY4F6gXeGopCLeHl3e4N/fIR2bZOWlJWPmJCDio+WmpeXppyXoJefk5KXo52Zq5aRkIqNkYKMhYmIgYWQkZ6cmYmFi4GGmHqJiZ+Xj4iOiouCfKGJkIu8oZiTl5mcqaamrp+otb7AwLnHyc3Oxc3K0dbW1dnV19vU19na29fb2tnYztzGhnp5Z2hlYFRXVlVNS0ROQzs8PTw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eot8foB/gH2Fe36BkYmEhXqEiHt1fXRufH2GfnR+kp6Rn4OSfIZ+eI59eYqKboKagHSYhX6BiYV8fpB6j6mPkMOgvIyco5x9iYR9iXOMin5zppqcmJSFe4+QiYRoR3CgpJ2Mi5CShYmLkJKVj52ak5WRl42MlZ+dlKGUko6NkIt+kI6Oi4SIkpaan5+JjJSSnpGCi4CmmYiEjoOGhIClhoqLuJidkpWWoqehnZ6do662urWrv8bK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h4d2tpZFdgW1RQT0hETUI9PT45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmAjopxcnmKe3p/fX98iHp8e4uHgn51g4Z5c3pzbYF+hX13hZuhm56UkoCLiH+Yh4Cckm6HqIV6oIt8kY6DiIScfpqRio2jop+QpK6gi5GLhYuBkoZXcq2Ln6ucj4OYm5CQjlyCopGCjJ+TlYyHiIySk4yUlJSQjI+KiJabnY+VlpGLkpSGgIuIko2JipyWmaOjhpKdlqGLioiOnJCDiI+Ag4eFpIaMkLOYnZKUl6Ghn5mSnJ6nsbispbzCx83Hxs/Mz8zO18/R1K7W1dja2Nra19bZ2p9vfHRnZ1xdWFNXWENASUQ+Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTlHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDbm13i3h5f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9f5Kmo5+lopaJnY+Ul4uKqJdyirKNhKeRhJmThZmLopagmJOJm52hkqmvn5GVkI2NiJWLbo23hZrEyLKcoaWbnJiWkbKRZKTNx5aPhYeJkJKNjZOUioWKioaWmpuPkJSThpWXhH+Pi5mIjZCql5eko4iZnpabiY+Il5eKhI+NgX+Hj6WJjZOpmpeTlpmhmJ+Zk52bo7O0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oY19dXk5KVFpCQUdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj46RU1GSFJXU1JCY4FGdYGOfXxtfoh4en56gYGDfnZ2gIN8bG6Lf3l8eHh8hIeLfYqjs6ejqrOhlqefpaSWla6ig5C4lZKzmY2hoIylm6+jpJ2YkKeWp5mtr6SXlZaUkIuYmZagwI6kybirm6KmrZiRm52ynYaFqKKcmIWIiY6VjYuTj4iBhoeIk5iUjIuTk4aUmIaEkZCcdJGZs5aXpaGInJmTj4qQi5eaiYqWjoZ9jJieiZCQnJqZk5iYn5SgnZWfm6GxrqKkt760xcfEvcPDv8bNysnSp87N09LQ1tjT0Ni7cnl2XGBVX1dQSElORUJDRTU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1NjY9OkpGREdOW1xZSWZgO0iEi3p7boWGenyEeICFgX5weHx9fW9zjXp9gXt4houJhoOSp7usqLK9r6Wts7Ooo6KwrIqatJ6juKSVraSWqa23pqSjn5mpmKmjr7CqmpmclJWRl5+Xmbu7rcmhaba4q7CUmJ6jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHk5eMkJWNi4yXmJKdmbSXlquei5uUko2QkoyZm4qSnpCLiZWgoY2UjZianZObmJ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8jC0aHGyc3NxNfW0cvToXB6aF1ZU15ST0ZEPjxDQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBicElAi4p+gXOGh32BiHWCioN/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7eMqLKurryqm7ukqK25uKumpqKho6Oor7Kxq52cpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIecrL2wg4yMi5CDj4ORj3qBh5CMjpyIh4+YjYuVl5SQmpadp5qxmpGsnY6aj5KOlJCQlpeOkaCRiZWbo6yUlo+UnJ6UoJ2bmKChlJqep6akoqSwsqbBx8OvsLq2xcTCvs2nx8PHw7zV0c3Eyoh0c2JcWV9bTUpCTEBFRz9BP0I7OjQ+QTw9NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uGg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlae0xsm/wszBw7nHvLqvq7m7l7K2urLArqXApKuvu7yqrauiop2nqq60sKqbn6qboZuVn7C0p4uiurq1wburqZyypaSolIWOqsPEpIKLj4eIhIaVlI16g4yRjpGhjIyUko+Jl5+Xk5mVmKagr52MqpyOlo+SkZSVjZCVkY+hlIaXn6CynpSalKChmaSfmqCcoJSYnqakpqakr62lwMTDrqi3tcnDvrbOssS+xLyz0crIwrV0eW1cWFxpU0xIRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk1lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoKQeY2hlqiampi6vsjIysHSycrCzLzBs627vqe6v728xLeswamssru9qrCpo6WjrK2zrba1oJ+vnqWimKO0vKmbqLzBo7a2r6uSsK2rrJeGmqqmpZGCjJOllYmAdYqSeoWNkZCen5OPlIuQjZSjmZeclZSjn6qfkaWajI+PkJWWiHyPlZKSo5uVoKKctaaQnpelpKOlnp6mmJ6Vl5ulo6inorKsqLzAxK+ls7fMwLmuxLO7vsK4rMLDwsCYbXlhWFdcW0tLTUpGRERJQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djZeOnpKJin+Jn5OEd4V/lX9/kIiKkH+VoZqupqOYwr3Iw8fF083Ozcu7wbevury0vMu8w8G1tryts7+5vK6vqKCop7atramxt5qeraKnoZ2rt7eppa++w7G9ubOnqrWzra6WlqWsqKCRjpKxxaeVjnyRlX2IkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuNkI+eiFqQlpeSlqWZZZijnrKllqKWrKyrp5ueppeYl5iVoaSopp+2q6m6vMS1pbS1y8G4qbassrq4rqi4ur24g2xuWldUVU5GSlNOSz9BR0RESEZHOTVGTTs+Nz5BSi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZCDh6aTiIGHgpyEg5WQkJSOmqKfr76uoca9xcTGxs7OztLKvru1sbq7vL7PtsS9t7m3srG1s7izrKacq6u4qqinr7CXo6+kp6SktMCwqqy0vsK5wLmzp7m1uLKulaWtr66li5OVoY10wZp+l5mFj5aajLGVmpmVk5OZmaWjlZ+blpqpnZyhoJqLjZCWnWBKlpyalZqlllSWsJ+vnJ+llK+urKaaoKWUk5mZjpyfp6KZtKmqs7y8u6uwssfAuKWrq62xsaOhsrK0pHFuZlxaTlBLRFBQUFE7R0pJR0hCRD45S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkiql5mgoqivmZGXh4unlo6IkoWfh4Sdl4+eoJqjpLXItKnGusPDx8rIyMzNxr66s665uMHBzbbIusG4tbqxr66ytKejm6qztKqopq2smaSupaSorLq/qKu2t7/Bv764srLDsbm9rKOutay6poicmKabdr+ghZmdjpOZmouvl6Gcm5eVm5+hqZ6ooJmaqpqip56YkI2RnYNudpKimpWdop6QrbKjq5WoqpeqrqWkn6Wpk5KZnIiUnKKelrGmqau6tr6zsq2+ubago6eopaecnKypqYxjZWFfUktNR0hOSVVMPUxETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5ScoZ+7r5mUn4uTqpuRkpOJq42Hop+MpK2Uo6O2xr20wbrCwsfIxcLNyMK9ubKvubTBwsq1xrHBvLS6q6itrLCjopmqtLqmqaarqp2or6ejqqq+vKesvLO3vca8t7W4wLG9wLOptberv6WPo5iRoqC8n4maoJmXnp6Pt5+pnKWjm5yhmqils6GbnaacqKqemZWPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6yenqOjqZGVlaCDkJ6enJWppKKhtLS6ta2otbKznpyipZqXlZmqoZ53YFxfXUpIRkdNUUlNRUZGQlJMSkFFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+fw6ybl6SXmamclpqaj6qWlqimla2tmaGrtsTCu763wcLAx8S+zce7vbmyr7izv8PItb+vvLa5t6ajqqytoKCaqqrEoaSoq6aeq6+soqmov7imrb2wt7bHtrW5uL+xv8G2tLO0r76jl6SXlJyUrqCRoaKlo6OfkL6lqZ2orJ2doZumn72imaOfoqmroZ2WjZWek56Hj4WNk56koJ21rKaclbKnma+on5qpnqCNmZWfhI6hmpuTpaSamKyxtrGqpaqtrJyYoKCSjpCWqJ6UaGJZYV1OSUdKTktIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV0yimqOcnsWsoZ+snZ2uoJOjn5eloKepq5e2saOqsrXEw73Atr/Cu8jCvsrItri1tLCzs7fBxra+sLi0ubWfpqyqq52dnqWjwaWgqa2fpKmtr6Kmp722prG8t7a1w7Kzt7m+ssPAt7ius7W1o52llpKUoa6gmaKdqairo5rDramerK2bm56ZpqC9op2lmKurrKahmY2an5KeiY5Xf5aepaGguKqnk5i2o5+yoaCbrpaejpmUnYKOn5eVjqKklZCmrbKrqaGipaWVlZyYi4+Rk6SeiWFkWmNgTEhKSk5GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmZ7Dp6Wis6Gcs6eTqqSgpJ+tqaydu7CorLWxx8TBwrPCw7zGw7zEyr2vsbatsLSvv8W1ubGwubWsmqiwqamanaWhp8Ksm6yxm6qirrCppKe9t6a3uryutsOts7PCv7LGs7q3rLS2raqippaVlaSsop+fmqirsK+vvLKmoKmpmZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqKfp7Smp42YtJyjr5qem66QnpOXlJqAkqGVj46foZOLpqywpaahnKCekpKak4WLko2cnn9hZVtnZUpJTEpSQUNASUc7O0c/OTlOTVVeUlNKPk9eXT1IUEJMTEk5TWNdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugw6ikqrKhpLWplbKsp6KksqyuqbuyrLC1tMa/xMS1wMS9ycS1wMjCtau1qLC4rMDEtLeurLa5pZmrsauqmJ+ml627tJuosJutn660sqequrOnurO3srjAqreywry0xae+rq23taqorKGXl5KmpaKjmJilr7iusrW2oJ+opJmVlZOkoLeipaaWrrKypqqmoZ6bmpqWmKifoJihnq+yoqaNl66ZpauXmp2kkZuOk5eZhZaflIyQnJ6Ui6mpqqKnoJidlIyOmZCChpaJlJ94Y2hda2pNUE1OVD1DQU5DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzukpJ2hpr+mqK+voam1qp25sKujqrS3sbC5t6+2uLjFvcPHvbzDwcbAuMHGwbqqtqStu63Bw7i4qq2xu6KVrbCtspalp5Cquamgp7CdqqCwtLKqqba1rLyssrK5t6y5sMK6vb6mw6uwt6+pq6unnpiZq6KioJGYobGvs6uxupucqaCZlpKXpqG3qaWjoq+xtKuyqKufm6Cgm56lnKKWnaOzsJqfkJOlmqCompWhnpWYiZSYk5aXnJOIkJuZlI6pqKefo5uXmpKGjpmLfo2WhY+bamhsYWxuV1BRWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aZF5OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oaqvq6OxuKmltbOsoa21va6zuLy6vba2wMK/ycS5xMHAwLjEvcG3r7Woq7eyvL+/tKmusbael6utqK2Wp6iOp7ufpK2znquisbCzrKm2tLW9ra+xtaywtbHAusS3q7yvsbirraqjsaaepaqgpJeQmZ+zqrOqq7OanaebmpWNoKaktK6noq2trrGns62yqaScn6iknpWhmJuotamXmZKSn5meoJ6Qq56Xl4WVmIudmZyTio2Wl5qXpqWioJ2VlZaTgI+UhXuPkoOMlmVscmdwcl9GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTT1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSZoKSst6Ssqaaurrapr7S6p6awt8W3sba+wMG1tLrFvszFucK/ur+5xLjBubK1rKq6tru5vbSqrbC1mJinq6qrm6yrjqu9nquusaOroLGts66utrG5t6mtrrGota+zu7zJsqq1tLG0r66nobOgmqitoKWVlpqasqOtoKavlqGkmpqSjaKlp7KpoqeyrKq2pa+xta+kmZ2tp5qYn5mZrLijl5OQj5icoZiXlKuenJOAk5iNnZyalpGKlJOemqWhoaCYlZGTlXqLkIV7jIqDi5JrbnhudXtgRWFqWUlIWVs9e0pHRTZBYlRpW01cYEpbXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENeUVwuKkIvSkdQW0gzY1lVS0SZlqCwqLKpraWkrq61qbe0uKSrtLfJu7S6ur++tLS3w8DMyLvDvLa+vsC4v7yxva6nurm3tsG2q62xuJSXpq6rp6OxqpSvu6SssrKnqKOys7CxsbWxuLOorquxp7ivtbTDxbaptLWrsK2qp6O2n5+nsqCklZualbKep5ygqo2po56blpilpaW3p6KytKynsaeusLWspZmgrKibnJ2blKm4nJSOjouZnKKXkJiloJ6Vg5GVkJ2cmJaViJeQl5unnKOgkpWQkJZ2hJCHe4WBhI2LbXF3dXx+XEtlbFxLTmNcP2J7R0k4R2dXZVtNXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydGYUxWJS1CLj1FTVE8M3JrSkRDkJmlrqWtrqunpLCys6q3sLafq7W5ybmuwbzCt7OxtcLDzsW/wb20vb+/ur+8s8Soqbmwtra/vK+rs7KcoKewraWlsKWesrWsq7KwrKmotLmstLK1rLStqayoq6m5rbGxx7+4pLmvqa2tpqitsKakpK6jqZyenJuwmqKjo6ORrJ6koJ+iqqamuaWstbWlqquorK+2r6Oeo6iqm6CampKktJqPiY2HkaKglY2UnZ+TkoSOkpKdm5iVlIeYk5WZppufn4ySkI2Qd36OhXx8fYeKiXF0cn59fVxTZG9eTlpmXUZElltIO05tWGFbTWBiTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGRISis6ST8zQklTLD6Paz1ISI+bqqqiqrCkqKSztLG0tbGxoautvcu6rsC7x7G0rbTCwtHFxb7Asr7Bwry/t7zEp6y3rLO4u8Cwq7KtoKSnramopLCjqrGqr6ywrq6trLO7p7awsqmyqaulpaOtuqyqscK5tau5qKiorKqosaWqpKKuqqiinpyjrJWknZiemaydoqepoq2mo62suLGyoamioKuusKyen6eoqZmkmJmPoKeYhoOPioufoI+LjJabjo6Fh5CVoJ2Wl5WGlpOTl6ScnZyKkY+NiX9+iIZ8d3+HhYZ0c3GJdmxfWWBuY1FzcVxLO4R8Rj5XdVhhWU5jW05VVlVXUFxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLklnREY4PEIwNUVLWDFAlFs+TUaUl62noqqynKmpr7asuLWuqqWrqr3Iu7C9t8KvsKyzxMPOzsO+v7TAwsS6wbTJxKyvt62yuL++s62uq6WnqrCpp6ixpbSuq7CurbGvsq2zu6S4s6ysrqern6KesLerqq26tqW1taOpp6ysqq2hqaemsbKkpqahoayWqqGUm6CmnqSiq6Sto5+nsbetraOlopupqq6pnaKlpKSYoJmWj5idk4GCkImFnKCMio6MmY2Qi4OMl6ObkpCbjJOSkZSimZuZio6KinyGgYKDenSAhIJ+dHeLpIh5a15gbmdXZYdkTkBnkkxEYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIZASEhElpKvpKOqsJirqa21q7axq6Wsqqm8wMC4uLO7taWyr8TJy9G/wbu5wL/CucG6wcSusrWxs7vAvrOxrqyrq6i2qqWtr6u5sKixsa+xq7WqtrWntLasrKSpqpyjnrOzqKiktLSgta2hqairqKunoKurqLm2qaqqqqKpoK2bkqmhnaCkoqajqp6dprWuqKaqoqOXpaenqpyipKOfmZifkY6PmY5+h4yHhJ6eh4SKio6NkIyEhpWimo6MmpGSkY+Sn5eYlouKg390hoF/f3h1g397eH6AiJ2Pb3FnZ3F4XGBziGpPXZhWSG14VWRWUmJQTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJRYzAyP2Y9Tlg/Qyw+TFRfL0lrN1BFO5WOsKClqq2Zq6WsrrO0r6qlr6mour68wLCuuK6hta/Jx8jRwL69u7zCvbrDwb+/rrKysbW8vMKxsrOqs6iktamlrbOzubCjrraxr7K6q7muqq61q6qeqaufoqC2raihn6+zobSqnqinqqOqoaKsrai9rqyuraGnqJ+rmZCvoZiioainn6ibmaqwqaOfrKKhk6Kjo6eYmqill5eZnY+Kh5WIfY2GhYSkloWCgouGjo2QhISToJaIkZ2Qk5CNkZyUl4+JhYV4dIF/fXV4eYB7dHR6aYGGo3VpXmVsgnVniIt8UlhwXkp4c1NkU1FeTU1SWWZOTFZZZVlGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTGg6NDhfPWFkP0YxQ1BbWytITzpWQjSQj7GgpKaro6akrKa0s7GqpLCnqri+wbuvp7mqp66wycbI0cK8v765vr+8ybzBuLCwtLG6u7jAsrO7rLisorSmp6yytrmzp6e7ta22vbC8pq2stautnKmvo5+lrKqnnJ6qs6SzqJqqp6mkqZ2jqaepvaqzr66dqaSgrpybsqOVpJykpZ+kmpqoq6Wem6qhm5KboaWdmJepqZGYmpOQioKPhX6PgoCIno+Gf32Lh5COj4R/k5uThZOijJSSi5GbkpWHiH5/cXp5fnxpd3x6dXFxfWiGeISHZGBoY3KFem1neV1eVkJXem1UYU9SWEtMTnF0XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtFWj8qj5SxmZ+fqaWkoaukt7Kypaixp6y4wb21sKO5raiosMPJyczBtr2/tbe/usi2w7W0s7Wxvbi6vratubW/raGzpqqrsLW4tKuevLyossCzuqCvs7WqrJ6usKOcpaipop6cpbGmr6CfqqmooqmbpKigrbunrbCuoaujpK6enq2ml5+boaOcn5uao6qimpqkpJWWlJ+ilpuWpqyLnpGQkYyCi4GAj4F7mpWNiXx+i4aOjYuKhJKYkYeUo4mSkoeQmo+TgYd8eWt9dnl4Ynt6cXBxc3hpgXNqg2dkaGFvc41tYmlwYHBBXHhrVl5OUVFKSk1TWVZNXV5tV0RYYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBCaFkxM1M9ZV9ETDZLV2VPKjwyUFs9I5KZrJmfl6ekop+no7ivrqKvr6mruMK6s62fua+rqLS6x8rIv7fBvq+0vrfEtsOxr7qyssC1u763qbm3vauktKeoqrCuubGqm7u9pLDAtbShrre1pqensbOgnqSmp6GlmZ6tp6ieoKmup6Cml6OooLC4n6Kxr6GsoayknKanqZqam5+jlZ2cmp2pppabn6iSmJOYnZKZlqGqkJqJjpCHfYh/go59fKGNjYh5g4yFiYyMhYeSmo6JlZ+JkZWCi5eMkX2Ee3NvfXFzdGB5eGlvcHFvan9yY3psaWZkYWaGf2BbcmpyTU1/aVhaTVBMSkhQUlFJTlxfblNEWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpoSCo+L1pZNSiXnaWYnJatoJ+hpKG3q7GktLSpqLnEtbKuoLesrq2wtcbIwLe/wbmwtL23v7u/r6u9sLS/sb3Duam7urenqLWop6uwrbOxp5q9t6StvLavn7G3sKilp6+xm6CkoKOkoZebr6ahn6Knr6KgopOkpKO3sKGmsaufrKOvmJyqpamel5qdpZObnJqdpqqZnJyklZWXlZyOk5ejqaGQiYqQhnqEfoSKeo+Xio2GeYKHhIiLjoWNk5iMjpaZio+WfoaXi496gHpwcndub3RfeHdkbGxsammEbWVyaWtmaV1kc4BfWmt1aVpJfV5bWE9PSkhIUlVGMjlfXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbDg0R0FmW0hURFVdaEUuOzJiVSwylqOhl5Scqp2loaKgt6quoLq4pqy9xbOvrqK1r6ytr7TDxLyzv7q3sLO5uLq4u66twLO0uK+/wbisvLq1pqKzqqeps6utsqKcwbalqLW1qZ6yu6qnpqmvrJmip5yjppSYorKkmZ+kqKmcoqCTpaCkuaikp66nnqWhqJKfqaKhoJmbnaCSm5yWoKGrm5uZoZSRlJaajpSTo6ikkIiKj4Z5hHyFhn2djYqLhnmAhIeIh5GFlZOSjJCVlI2OlHuDmI+Ld357bHRybGxzYXh0aGhqZ2ZvhWdnaGNmaWpgaWJpZlple2NgU3NUW1tTTElHSU9TQCEqaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc5ZU8nMp6ko5GOpKebnp6do7Wsp6q5t6esw8G2sKyita6nr6+3wMC8ssG2sa6ytra4t7asqr2zr7Kxvb+3rru7saWetqulpbSpq66gn8KrqKWws6qstbudqKqrsaWYnaqepqSRmaatopiepKmhnKKdl6Cdp7amr6quoaGenaGVoKafoaCZm5mckpmdlKWdrKKYl56Uk42Vl4yPmJqpoJGIiYuJeYV3goKCnYeLgol8f4SIhoSQhJaVj46QkZGRjZN7g5WOhnJ9fWZ4b2tqbGd1c2tjZ2RkdX9hZGZmZWpqY2pxWV5YXm1kYU5oV1pgVklHSEtNUlg+OWBsaUdCVFNcW0lJR0VBLjw/OUE4OVJHQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQWZIJTWbpJ+QjK2hmZiglqS0saKxvbehsca7ubCxo7esqq6pub27u63Asq+urbavs7izqKu5sa+utLa7tq+4va2mnbWroKGwpauunqTCoLKkrrGvt621nq2vra6imZ2oqqWelZuopZ+ZpaOonZqgnJScna2wprmorqOhmpqemZ6jmqSdl56Ym5SaoJKolaqnm5ObnJKMlZmNlJSZqKeNjYqJj3yCdIKBi5iFh3yJiYSEioyIkoSTnJKSj5CRlo6Qf4CMjYNvgH9meW5oa2pncXJrXGhjYnJ/YWVoam5sZ2ppZmxcbG11cWFUYmhkZVlJRkxNT1hRUVZhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUllQyc0k6Kajo6wnZqToZqpsrCfuMC2oLTCu725saW2r6iupbe4t7esu6+tqqu3qrS5rqWztbGuqbG2trCytbqnqJ+2qZ6eqaKqrZypwJmtpK6wtrWtrZ+xrbCqopuco6yom5Wcp6OdmqmipJaaoJyRm6Orqqm7n6ikoJiamZ6hj2uilpiccYKWm6SAdpGpp56VlZ+RiZeZgJaKoI95hpSNg25qfneDcWyGi4Z9hIuGb15jYGeEl4Zri5CUk3V3i4R+g49/ZoaAaHVpZldcaXNuTlBqY2ZxhGdfZGZubGleX1+JkISGZ09LRDhFVGdeSkdQUFVVS0hTYW90ZUZbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFQZD0rL42kmYeVsJuck6Cbqq6ro73Fr6m3wri9vK2mtrClq6S4s7KzsLmtqqestKawtaOouLa1qKestrKutK2zoqmftKueoqScp6iarLuVpqWvs7itrqWorquspaGenKCnppuYoaalm5unp52TnqCZkJ6oqqO1sKOjo52Wl5iXo4ihjpKah6GHlJ2hf6V/pqqekpKbkoiEcniNjoSIoXaIjWmXiGZ9c3ihb4iHhH6Ne3+hoJ+ZgHuHnnSIjnabimyHgYNtaGVjemxxYlSGbWNsaZhxWGpvboZYXmlba2pbiHBteXKGaIeEWl5GTj5GXk1FUlZWUVFSV1RnXkxYSlJSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiMppeDnKydmZmdn6qqp6m/w66xury3wL6qpLewqaymsrWur7O2q6mlsa2ltbOcrbW2tKanqbOxrbKnr5+qoLKon6SjmqGjnK61laSlpra9pqynqqqsqKaioJigp6OZmaajpJicpKmWlKKclZOjpaagt6SkoKOYlZOYk5yIro+YlImpi5eim4WxgKSsnJOZnZV5gtSof4eUwZvHeXexpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQeoFslrGrsHloa1ixrm9labySvG5oeW1yj9h+U2pjtrJ/gXGUdZqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQF1FUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVxdNDEhjaaTgaapn5ecnaWssqiwwr2ytcC1t77Cq6a0ra2pp6+zqq+2tKioprWmp7ivnbOytqqlpKexrq2xpqqep6SxpKKhnpeboJ6vrZWeop+0uqKqqKGtrqWinZuaoqifmJuooJ+YnqenkZynm5SdoaeioLCjn5+jlpaTmJKZha9qaoqNqn5nhJWHrWVxnZyUmaWVca6hpH53u3xroY92sV9qtFulgGackWBmgXpmf2p4aqllvnJnpox2smp8sXh0kpNjbW2nbVuEoEVpZ4eWRXWcYH1ne6Sngllfi6tpgZV4emqnN0qvW1dUbGNbS05XX1xXVjtOiE9XVi9JVFRKREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GilYKsp6Weo6Spsbess72+sLfEsri6wqepsKuvqamwr6SwurCkpa6zo6m5qZ6zsrCjpaCqra+rr6ann6OisJyjnJiVl5ucraaXm6GetLOhq5uira2gnpmXoKKpnJmepKCcmaGnpJCdo5qXoZ+sn6anoJufoZaVkZeRmoW1m7V4hamZtZl3h7Obt36TlZWolH5rgaZ6goWIkpSSd6tna7FbrHuPh5R0iHCPhoCAiJCXeIOCi5eMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinS5RoW5bVGtnYExLW2RYXFpCPrB4V1hBI01pRUNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o5YVU1MByVn5SIs6Wmoa6pp7Osqbu2wrC8wq24t8GqrK2urqausqmhr7yqoae0raSrtaWmsrOno6KeqKqyqLCnpZ6fn6+Wn5mVlZaYn62impqkqLWvoamPqaiqm56VmKClqJqfnKOfm6CjpaOVm5+Ymp2jq5ummp2boqCXk5KTk5yD1ZOZuXCwwn7GhnzWlJu7fJmVpY+NnI2ke46HpIKlgnqseY+dVq97iX6farlauXeGhH2mgpN8mHqqeY6cj3uxbY6EdJC8hW+UUK+nxYpRoHpjYKpic3KHbJeIYFO1tMiGgIl8Y6QzQp12XVFqaGNQQFhmWmRhSkhNbEtbU09ZZlpDRD9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRNzIlm6KTmLGnqKWzqqW0qKS7t8GwusCxtbW8s7WnsbCjsLOmn662qJuoua6jr7Ggs7SwoKSen6epsKi0qaScnZ6ql5iXlpeVlqGrnpqXqK2wqaOfj6yip5ael5yhpaGXoaGioZuioqebnqGelZmbpqCcp5Wcm5+hmZCSlZGdiLJuaLVxq4dvjqZytHNytnuZmKSMj5yNon6RoKV+sHaDkdLRdlyufIZ/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdISeb55mlFLIi1rCXJ95Yl+tX3Zzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPal9saU9VRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6GckaWvrKSqu62mtKWntru8srq/t7a1urqzpbS0obGyo5+ssKSYprqupLGxnbS4qp+mnaKqpLGnrKmkmpyaqJ6VlJiYkpKjqKCXk6aqsaailpOtn6WSlKGbpKaflJqmpqGbo5+tmqCenZCWnKKenKWVnZWaop+WmZaSm4Wse3eodqOOiYepb62KgqeDmJmhiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9d4V/j52GmZl3r4aKkZyHd7RhmmWagYKUbJJasFhLmnWYeWZgrV52d4dnmIhrXq93lZ6PeGw1eciusl9BVG9eZ2BFUGxfcW1WVU0uZWNpU1lROkFEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCXtMGtqLOoqbK6uLO4v7m3sra9taW4s5+0rJ+gqKuflae2q6ixsquutKSbqaCgqKG1pqaqo5melaWhlJOcmZKVoqWak5CnrK+moJWZqZ+ij5Gimailn5SZpaidnKWerJ2hnaCNlJ+bnqCYmZyWl6Kgk5iRpp2GqX19pXihj46DqnCti4GnhpWgoYmXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pjcnuBa5iHcV2sWomgjmtuZU9KQ6FcWkx0XmJlTVphX3JzX0pVNkqak1lIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4wMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZ2Zmb6rl7TCrqutqaW0sLixtb+5urOxt7yqu7SfsKSepaennpSqsamwqrWsq6+hmKGgpqSjuaKjq6CXm5GioJWUn5qUmJ+gj42MqbCvpp2Xm6imn4ySpJeoqqaTl6mnnp+ho62koZ6hjZShmJ+gkp2XnJWeoZWWj6ubj65tcrRyqYx2iqZztHhzs4CRpKKSnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZOIrWp1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbHl/fm+YhnBcr1Y8nHdmVG9uLlynT2JSa2VhbFliXGBwe2NTWVE+Pm1wM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs8MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOKWam526oZuywK6tq6unt6m4r7TAtbyxr7m4q8G2qaqgm6akoZ2SqqqntqOyqK6qoJecp6Clq7mdo62blpmPpaOVjZ2hm5mcn5GTlKu2r6eZlJysqpeMk6WZpayhkZeqsqSgnqirsJiho5CZopegm5abl6GTnKqclJGrmYfUkpq7c7DDgMOGftWWm7h4iJCXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohxbo2kdL1dd31bYXm8a1pWW2p6XmpgZGZibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6hvKKXscOwraqqq7Gnua+2xLG6sq67sK7Bsqylop6joZybkaqkqrKktKetpJ+WmqqZpqy4nKKumJWhkKWgko2co56YnZqQlpOvubCrlZejqKeUkJaknKSsnZGgqKufm5+po7OeoqWOp6KUoZqcl5WkmI+woJKVqp6FkJm2gJCRjLiVeIKTm7V3bmtuc255j4SOiXOewbu9mnuBsqhwf3SRuIN8hoaLh417ioaNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF5/eX2JaIN5bXlii6xwdYV/WVunakRkWVNmYGNdY1FnZnFsdUJOUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPTs8p56goL+llrTDtKyrp6yrqbuusMavtbOut6e1uK2po6KmnqCdmZSspK2qprWoqJ+blqCjnqykvqahq5eUnZCim5KPoqiik52XkpiUsrW2rZidpKSii5KRppulq5uWqKSlnJqhqaano6mhkq2fl6OemJeXnZ6PsKmUnKeijmp+aZyneIlzfpqPdHplh3q+vsC6bpKDcZSGX3JqWl6aiWFkh46Va2B/lWNtnHZilGt/mpWUZV5gY3GbimlyjH2GlWdqfnJ0eH19Ylt3dIFoUFxug3x7i2tYbHqCcklKb4VwTXRNRVdcZmBMW1hnY15PW211aXFST0RFTTtISTxMPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqifqKHBo5u0urajraWup6i1sazIrLCzrLWjvrGypqCjqZ2jm5qZrKeupKS1qaWbl5Whm6etqL6nqaaVlJyVoJqTmKWpp5GekI+YnLCyv6ybpp6noomTkamaqKSam6ufo5mbo6etop+qopqwm5WmoJeVnZ+dl7ClmKKomZyRnZyjpJmno5qcmpqakJaBZ219cXeRl5SRhYq1qo2GmJWOioyXl4eUlYqDkpORiY2Rk5iUmJeaoKKanJShnY6CeqWFbGp8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vjd312a3B7bWBjXHBnTVlZZWpfV1pvem1tZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCyoLOiv6KksbK3oKqlsqelsLWqyautsaW1psCotKCepKWcpJaWoKumrKOjtqygmZaWoJetqaXAnquklZKcl56Yk5Sin56ip5ORmKinssOvmqudq56PlpapnqqcnKCsmKGanKKlr6ahpKierZiXpp2ZmqGenpywoJ2ippWYk5iUoKKWo56XoI6WlIuKjY6WrY98lZuCkoKLqqiGgZiWioSOn4h7hJCGhZmQh4aJlY6bl42QmJ6klpqTkZ2Nf41mobOvhYmEdnqPinx2eXpvZ3mQgYCJa3WBeYhyaHN/enaDiIJrdGN5ZmBpZGJkZmpZa3twaWpcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqq2js668pLScoKaioZ2Zl6imqaakprO1npWUnZmZsKauvqCro5CRnpqZlJGVoZyXqZyEnqmsorPIs5+qpKuWlpeap52om5+kq5Sen52gqq6ppaOroa2bn6ChmaWenJ+dr6OZn6iTmJidkaWZmKmempdmg5J8ZX6OmY9jeY1saGt6kaSra2WamH5nhYplZWloeo2hjmtojJeRondraouYo5+Zc2xueoSMh3pYZV6FgV5siomAdlxoc3d3kYCHgm54gniAc215g3R3iIiOg3tqhVlea3RkXXOIaGp8cWxjXVFNV0pkWEBKND1GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsaqlqK2usKaurbC9samopK2vsZ+tl5+jnqGamaarnKyjpqipsq6elaOQoq+mtrmlrqOPjpqhmZOSm6CZmaWWe6Wsoqizw7ekoqevnp6VnqOeo5yjqaiRnqGeoKqvqqujqp+om6afqKGslqGbpbCkmJyqlaGempOlmJ6rmZ5+voOIcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooeCn3yVmImewL2Clp2ejZ3CwXuBe5KNmsPAfWulsW+MgG/Ken+bd5GDjoF3eoF/eXF6f4dxeIWMk3ltdpJiZl94ZF9kgGJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCvraayta+qpqamsaufq5iaoqCcm6qnop2roqWopaS0o52ik6atrLezp6+ikpGanaWSkaChl5yfnYenq6Srrb/AsKGpr6mXkp+dopmio6qjkqChnZ6trqispqOip6ClpZ6tqZGkm6mtqpydqpysoZaXpZaho5icf86UeXqkgXmVlptfro9ejqeBoqB8p5WbdKuDgK9eY42peqeHhaB0l5KIs2OCq4ahjo2zaoSudH2Wh7hhgq1Zo81uj3V72nt/mXB+iJN2f2V7iHZ2a32Ibn6FkZJ+bYGOYHFrcGdgX3hkW3BoamRmYFJUUldeS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLiYnpGkqqittKumsqytrKSrp7CqoKebmaWXnKKvn6CeqKejpaGfsKybnpWnrq2xq6isoJSSm5+lk4+fpZeeqKOerqSrsKjAxrOoqbGulpKdnKKXoKmqnpShn5ydrq+nqqmbp6ekoauSrbSWpqKrqp6jp6ahsKCSmqeaoZuUlJGXoHCFjJd1hKiHcbF8nXGsfqGegaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uJk4+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+JipGQg22Qj2RvdHVwYGdtZF9vaWluZmNXU1xhWlJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytJ+do46jo6Gtr7auqLCnqaqorqurp6KknZmilZ+mq5+ipaCoqKKfnbCsl5qWqKevrKinqZ6XlJqjopKUoa2bnaajr6yjrLWqus2xraeurJaUnJ2imJ+urJyWoJmdnqmxqampm6upo6Ksm6+xoqisrqaZpquqqrGikpejpZuUkoWkaqR1iXqpdHqycIKliZmMcYigmoekYGBSrIR/roObdq6BpoaGn3qYloZ7ZoCjiaSZhoGjfal+gZSHrl58qVWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojYyYj4FtmpJvbXl3d29sZmRlcXBme2hjXVdgalhYVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfDydbVwKGZq6ihr6KesLWwr6mso6imqqqrqaSmoJuknp2lp6ajnKyaoquhpJ+vop2akqqktbCvoKmbnZaUp6OQmqKon6CmnLGmo6exrLbIsrWqrKqVkZycoZmfpbOdmqGUnJ+nq6ujrpqsqaKhqqOzraKqs7Gim6qor7C2o5OWpKeYm5F8qmyehId1q3l8sG+CpIuJn5aVn5SB0ri0uMmAgbJfX5Spg6SIh6B5mJWaeKrJdJmjlaepkJKbjH+biZrGxnhloYKlc4GfjoJ9r15wtWOxdUujhm2nR4KTZI+QnpN8cJeSf3B6dHx7bVtmanJxZoFqXmJZY21cXllJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TBxrmtqbOurKWinLK5rKqhppuopqqsqaagpqWYq6OfrqudpaCsmp6opZ2mtZ+il5OoqrayrJulnaCVkKWtkZmcp6OgqqeuoqOnqrC0wrKzqq2ok4mXnKSaoaOuppehlZicpaarmq+draimnqyjt6yhsrmvnpuvp7O0s6WUl6ejmZ+Ogp1OeJqBf596hKN8gqSEh6efnJ6ThLh7fHm5gn7MxsK2eJuhkYuffZqWl4p2npiKpJijqH6whZyFnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkaOXfH6SkYp0enOEfnBbbW53cmqBb1pkX2huYmRdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamspKu5q6+gnKGss7Omn6CVpa6trqqnnaammqOnobKuoqimsqCZqaSUorWio5WXoam0uaSbo52jk5ChspmenKemoaKvrp2kqKK1ssOxraqtqpGHkJymnKOknKWXnpmZmaWkqJquoa6lppewpbytobe3rZ6etbK5sbOnmJ2voaOeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgYpxqoaEtG5yapmjm5WKn3yYmYaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5OmmH6MjJOKd3x5jYFtaXhpeHNuf3RdZGRubWZoYEpaWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q1npeopK21oaOZlaOpp66qq5mlop+loKC1pqKop7CjlKujjqSto52QmpqqtLSknaWdqZKUl66goJ6npJynnLWaoKqjtqvDsKmrqaKMhI6coaCmopWam5yZmpmmpKaYq6etoqWbrae+rJW+sK2fo7Czuqy0p5uosaSnmHqokH18sHeKgaSliJxtsm+hh618oY+DqJWYgKyIha6Fn5SpoKGWhp+AmZWAe5J+q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrr12la3GFmV1gW4ygbpWRppmDlI2Wi3p6gpZ/a2x/Yn10bX96YGdlcW9oZ2hDWWBbPUtUMlU4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaV1NQT05JNzA1Mi4qLEFUVlZWVVRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovZKahKnGwrfBtJ+brZ+uuKWkjpuko6Cvr6qfpJ+drZieuaCiqqCvqZmtoZCqqKSWiZuQrrCspp+nm62YmI+soqGdpqKapZ2tmJ+oprapwK+lqqSfi4CNm5qgpp6SlZqalJqapaOjmairq6Okn6movqSXw6yqoqGssrqrrqegs6+pqph2r36Qi5yFh326rYqYZbCMZZWtfaGPg6aVmoGsioSwhaWZpKGhkIWgW2xqgbNgf617e4KAsWxnbpmXjIiwW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW2Yj6iaipeQlpZ7eI2cfWRzfWKDd3SAfGFqZnFuZmVlT1VjW0JUXj5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXl9gYGFiXl9cW1hVUE5KR0M1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbaooYuaoJ+ds7OpnqOgnbSYoLOoqqudr62dq5uVr6mijoibjq+sqaeip5muk5mPqJqinqWfmaOjpZmeo6myqLyvpaienY58i5qVoaCZkJKam5KZl6ieoJioraelpaOlqbufoManpamhq7S2ra6nn7ytrayVgamSo6+Pm4CGpJeYkIGAuMO6g46dk4Wnl5yCrIqCr4imm5qlqpB+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwva14d6K+u3SAlo6mnI+akZaceYGQmnljfXpkjGZ5gntga2VramJQYltTalxAVGFCTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbO0sb+5sr2zop2upqWzpp2LmKW+qbexqKG/pqaym56xnLmonq2upaaVlLCsl4yDm5GupqOsoaScqqGYi6OSp56onJqhqaKZnqCrram5rqijm5eTe4eZkaabk4+RmJiPmJOpmZ+Yqaigqqaho6u7nqnFo6Cvo6uztauwqqC7qK+vmnN1qqS3hmWJn3BnrY+Kj21vd6SQmZ+Bda6ZlXCPi3GVp6ObmK6kcm1tbWWKeG9tgplxgHlpcWlniZaVmHFoaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpJvZmSAjZKOopiXmJCVnnyHjpR1ZoZ3aI1qeX55ZGxjZmxiS2RYSmtZOlFlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6q6ubKzq6mirp6jsqmYkr2xw8i+tqqewKuso6CnrJ+6o6StrKymjpauqZCMhZWXrZ6mqqKfo6OgkYykkqeZqZmWo6qglpylpaevuqusmpuSknuElo2ll42RkZiUjZiVp5Sel6iimrCmnqKsup+wwaeks6assbKrraunuaSuuJaKoailtp2JlqKXh6makJSdk6qzmZujq6CylqKhnaCinKCkoZWrpoySkoyHkpyclJCak5iQjZWGgaSZl5WNi5OSio+GhH5nin90gnZ0h4xxp2x7lZGUk4GBj4+Pj52UoJWYlqCCh5OMcGiPdnCKd3Z8empsZGRvY1VgWEBpW0hjYU9aK0Y9KyYhNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTVBQUVdUVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbeurqKwpK2foLWxkI6rxbzEu7iqoqWdm6WdsKmjtqedqbSmp5GYrKKLiImPnKeWrKShmaeenpOVo5eomqmZlKaho4+ap5mhtbqoq5makI18gZSLoZSKlZGVkJCTl6WPnpmon5y2o52nrLenr8Guo7emr6+wramps7mhr72Zkqajpraikp2mno2pn42Sn6Osr5qho7Gor5ekoJyjqZ6enZyXq5ySmaGbk5CWqpmNmZmWkJWekYmgnZWUhZKMkIyUioB+ZoyGdYZ2eYiDc5xqhpGUlJGKfYyWkpKYk6GTnZagg4eXhnlxlXJ5iX9xe39qbmRfcGlgW2BZbWNQYGRQWzpHR0Q9Mj09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWNhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaetoKi1qpCQnaSzu6+srKKjmnqdorGkpbColpu4pqKUmaqcjoaKiZyjkK6fo5aooKGSl5ibrourlo+omqiMmKiPnrm2pKWZm42JeYGTjJqTipWRlJCNkZaijJ2eqJ6fuKR/hK+1orCvdKS+o7KgeHqfqbK7lXatpJ+KgKp+ZFxidp+OpJ6El35uk7Oco6euq6Jlnp+Tc3mZl3CAmKiXbH+ip4llnKWckZeYlouRm5GGnZqQlYKSh46OkomFd2uPh3aGcXyGgIBhaYiLlZOLW3aVkWdokI5ye6WYmGR5mIaBd5dpg4qCbnl/a3BlYHZva2toW2ZlYmJvU1s+Tk5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJGRklLTFNUVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5amo6GwsayrqaWoraOnraSSlqu1r7Gmmqqmq5dzjJyvn6iqppSWuKCgj5yjnZF/iIibno2rmqOVp6KejpeRnoV1rpCIppqnkZajiJu6tKigmZiLiXV3k42Wk4qUkZCUjI+ToI6an6aZnLKWgIyctZ2zjJKPvKehfqeieqKut4GOjqaehIuFj7Gpr4yJlqOaeYGLrIacnaKnqaiHlYaYdqWbeoebgZemgoF7nLF6ioWgl5mUmJaBkJaWhJmZY3mHkISNj5KKg21wj4d5gHGAgYV/hnSGhJaSeJZok3SgmnR9mYOgnIaYfpGJgYOYao2MhWt4e3FwZ2R3bmlsa1tla2plc1teSVRMUUBFNS5ZVFU2KSEwOT0+NjQzNTY4Ozo9Pj5AREg/SUVKS0dSWFpZW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyYo5+mrq6rqKygqLCmp6mlmZSuxr2woZamqLWej4Ocq5ymoZ+NkL6emY2fmqCQfYWOmZeIq52ilqChko2TiYaAkaiOh6Kco5OWnYafubKnnpuSjoVwdZCJlZCKlI+Pm4uPkZ+Slp+klp6siJ+0ibSarYrKh6quiLeFjbCDsa6DqY2mmI2dfKiPcnt3m46mlmiVpHm0i5+epqiSmcKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qXkYt8hZOGjZWTiYNtc5GFf3pyhoGEfIR0hYKXgY/FZoCph4+ja56DoZmCmYCLjIOJmHCOkoVod3R7dmdodXBnZ2xeY29sZ2xYZ0ddUUwyRTQ2TWBjNyYzPERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmRjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5sKqrppqUoKOkqqOWpKm2o69/oKecpZ6diZO8mZONoJGdkHmElpaRh6uZm5uaooWPjHebnI+gkYiepJuVmJeGoritpZqcjIx/Ym2Pi5OQjZCMjZiLkJGfj5OfoZmhqH6hp4etnaCWro+enZ2RhoGgjauvhqSNqpqMmn6idoCZk2qBq3VNq3iHjZ2Rm6ingKqrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln6Me2RoinKZfXmVbF17l21fU3CEXF9seYNgWWWCfYSBmHGnqmuDo25ypXCfg55pZZ9sW22Je2VZX4N/YldQb3ZlbXRyampvXmpvbWxpWGlPXVdFOUE0R0NeazQsSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKhtryrrqKZl6Chpa2toJyttaKokqCfn6abmY6YtJmQip6MlYt1gZSRjYqmlpWYnp9/koWGrKSHnJGKmKiXmZqRh6WwpqKVmoiJgGluiIeLjo6Ki42Si5CSooyTnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprYWleYp9hJp9onByk4eVep2MeW2HnIyZkJuomo+HnXyConN2pmaefnakX5h6fZJzom6Yt7S6c5KHgX+1qGSBxrh7cJW3i3GAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN/pF+dmbOVcHyXnrR0c1uesoNqYm9zdXFob1hrbHJzZlxpXmJLRD1ENVFBWXEzPVNHX0pSPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWldgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6CNpLi1rq2gm6Kco6Olrpybsa2sk5egmKCkmZqTnqubi4iReIuFcICWjYqPoJCTlJ2XfZCJjqigh5iPipGik5uajIuoqKSej5aHhH5re4d/fY+Ng4uQkYmPlKCClp2gnaCfi4l3nJiijKByoouIqYicppCWqKt/rox9eqCZeqOTeIBzloeMnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmhzqYKcgnOqZ5SaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z1iYp/nmiadYeTkpiOf59umpBsp5lcqH53u2t+qluOhF20Z1xucXl3a2lbcWp4eWJfZlhiQVBFTjdWQlJuNEtaWl9OWkNAMTUxOzs3SD86Q0dUP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtpuoiWOUm6y6srCsnaacnKifnq6bnbCoq52Xopmhn5iWlqCjmYaJjGqIgHF7l4iLlpaEkZSYj3qKhJaknYqUj4WLnZGcm4mPqKOgmYuRioCAaYGGeX+XjHuIjo+Ij5aaf5Oin6Cik5hyaJ+Kn4+McJKMgamImZ+jqKCofbCto6K4l3ejs6Kjf4iUeJ16q5p/oo6dm5eJl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8mnycmX5zqlpdb3uWi3ieYkx+enqFY3mXQk2fWaJqcXyObYGJhJl1m3mHibGzf3+bk6d1gJ1tcXyUb5lyaqRdlXZIZWNgc3B9fW5lYGxodnxjZGFRXlZdVFZAWUVRZ0RTV1tiWF5JRD1COD9COklFOExEV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZl5hYVxdXmFoYl9lZHZsXmVnZmtkZmxpaGtpk52Asa6ZhFNfoKezubOzqZqijJyrnJypk6GrpKGoj56dnJqZlZihnZaHhol3hYFueZWFkJqLfJGTlohygImToZxzkZCBiJiUn5qEjqicmpSKi4p8g2yFhXGBoYx4hY2IiJKZlXySpKGfo4iuhn21hI6enXullnqpgpadkIqhnX2naHZtfpl0oXNxfJ2FmG+Tgq59pIOmnpqBo29eqGd1o2NvpWGc05B8epl4cnNjo4WQfqJyoo51a4+zi2CCmIlzqrKovH93g21+vqaptF6cbn1xl2+Bc6JyXaNndKZhaKZtm9SZfIObb3d5l2ubeneXc22ppGdgZXlwf4NrZ2ZkbXV4Z2BiU1tlUVFiSVdJVF9XU1tlalxkUEVDS01KS0JKRThQP1BNV1NYT1JSYGZlaVJjd3l3SUZFY11kWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7GrVFxLfqmvsbSws6OcmIWYqKCgo42kqKCYqYmZl5iTmZKSoJiOh4V7cH2EaH2PgpSagXeRjY6Jb3+GkJOSbJeUfYiQkaOVg46qmZSSioWJeYN2h4Bugp+Gd4CThoiZopd5k6Kkmp+Js6Gitot6rKekrqVwqYGakIWBnJJ8pICimYaYcp6Eoq2uiZeLf4ykjZaDrqKUdrW2tcmhc5SKgZ9gnZepbXmVhp+adaGHd6B+kZaKgG9MZqOScJqHcqR7eXRhg4JsfqBrcWRgnHJ/dJdpe2mztbTGpnOYfnudapubq3WDmmx0d5dpmnp1mHJQRH2zXmp2a3iHZmpnYnR0cW5WXlRZaE9SaElVTFlSVV1oa25WZ1dNSkFKTUtISk5BUUpQZGNpbWV0cnN+eXtudYl7e1RQT2xeaFtraVJqaGlsZ2xmY2VfXF1cXmliZGhre19dZGhjamZvbWVpbGWhnImwp4RmP5Shsquvr7Wio4+Al6mioqWMpaednKWCmZeWjZeQj5uSjoiCeWp5hmWDjH6WoHl1j4iMgWmEhZKDjIWdjXqMipSlkoOXqJeMkIqBiXqAfYt4cJChhnmBlYeJlqCWf5SlqJyWloRnbnicbKJkfHGld5yYcGengZeMe6V6n5aDl3KedoGJlJaPuW6QiqJifZmilYhtcmmranWgbW6mYJtpi5BoloealXWigH2aYIuFjHVviGJooGWefmmadW9jZoiCbnKiWl9bY6FuXYmMb3t/c3JkpW13omRnp2iYc4uYbqFvU4iPb6BfZadUi11UmG1tc2txgW1waGt4c2tvUlhXVmZZU21JWE9dSFhpaHNqWWtWUVJFVlxMWFJhVGhqXnd1enxwfHxyg3t/cnaNgIR2XlFyYmdicGdQamhoa2xuZ2RnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKWZpnpldG2Lp66kqbCxpp+LgJernJ6ljKKhmqKigJWYk42aj4qXkI6Le4dxgIhoi4t7l5pzdIp9kHtkgoeVioqVmYJ8iIWWpo+BoauQhY+Jgop9gICPc2iPpoR9hpSNiJigjoiSqqediaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupKKMkoSMg7xufKWvgoaGh5OWnJ98pXpxqJWglmeefm+rY5aKlZJ3qGypooGJdYeCd6uRpohrkbBrdrOMqWuKhm5tn56SlWF/q4uqdoB/jKafd599haWVnaBpmod2rGeerYy3c3e+jaSTWYOmjathdXJzb3t0cWJqfm5obVNWW1VhYVxrTVxSXUldbW13YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDc4R/gHt7jIGCgHZieGRjbXNkUmxnaG9scmlmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWmqp2BgJ6klqmqnainrqOZiYKXq5qepImapZ2pnISMmo6GnJGFko2LjHSGeoiEb4yEfZeTdHSGcpKCbX+LkoeGlI98e4GFl6SNf6WljoGNiYSUdYKHkm9si6mBg4uUjomcn4mNk6ujoJCAdZSXiH6BeZSuo3+Bm3GPhnmQjIR/e3KmjHF9fXqXlpuEjnh7fn6IlJWTinaQmJ+gg3p9iWyMhVt5eHF5cGhufpKJcX90go+Uk3GFhIJljX9fgX+Ld3VzlHVveW5uh22Ehl53aXiNZoGCho6pm350fJdqiYhwgHZ8hXZtbGeMc3l7mHiEW2tYeY9obndycW93eG9dbIZuaWdWWmBXXGVrY1VhVV9RX3B4eWxrdmVqa2p2fHFydHNhb3Vic3uBeHV5gnWAgH+AeIuFg317bX9sZHhuXlduZ2h1a3hqaWpkXGBaY2plbHB1blpbYmtkbGx5bmhsb2GOlLmpp4uhopqmpJmknKuioISEl6ySnaCJmqaaqJiCgZuKfpaTh46JiI1ygnyPfX6OhHqXj3Ryg3CVhXt9k4uGhpCFeH5/hpiijHumoIuFj5CElYKGjpd3coWqho6SnJCInp6IjJuooKCrg4mOlJp+fomWraiPk6aQeHCdkYN7km9+qIVwfZVxa3B8gZ+Lf5KOjGhtXYOLjJubno5zlYuIcXRrgnZzgFlyboeQgX1+jGpdamR7hYOIgF9peHube4KLgnaBhoJoeYuHa2FxcoN3X3OMgomQp5WGZoyPg253i4RwhY15b2VnZHqDepZbXGpnbnZbe3h3dG1zcoJmXG2Ka2xiWVleWlhscVtfYFpeXWZ0fnt1b3Rja2tqe3xye3h0ZG10Z2x7fnZ6fHt6en9/fm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtoa2pxcm1XW2VubGdzem9oam1gjIyqsaKQo6Ganp6YnpmooqF9gpitjZ+Uh5uikKWVf3uXhHySmIiIhoaKcnyAi3aFi4GElYpxb4BymIaEfpKEg4aKgXqAg4uano+CpqCGeI6XiJWLi52XhIN6rYKRmJmUip6dh4ihq6CioqOLiJObnKOZlqqhp6agkpuIl458eI6OhKd+f5KRkpOcsaablJ6QjbKTmISljIyVm5+JkJuCiZGKa3yNdndlgoWQinyJnYSHi4+IiICFhJB3fHl1mqGIhoqfi4WUf36MgYB2cHSGhH94iIeLkKaQhIWNiIONkIx8h4qIj4F2bIKEfHmZanJoYXSKcH16d3Zvd3SBXV5vhmhuX15aXF1TaHFVY1tcYWxodXx8c29wZGtqaX97bXh/cWlvcGxmgHtygoB4f32AhHptg4yGfHp4fH16g3lOZHZrc21wemRrZWJiYFt0ZnBmcnJtVV1sdG1oeXpxZ2lrZY2InbqflqKhmJWZmJSZpKCee3+Zq46ejYWfnIqelnx4lIJ7jpmJhoSEhm14gIBygYd+iJOEbWx+epeGhIOQf4CGhIZ8h4ONmpyShqmeg3KKj4WSkYudkX2Ne6qEjZKYlY+cl4aGm6egopqdhoORmpmZkJqmoKadnZCWgZGKd3yHjoSle3yOkJGGmKmhnZOcj42qjpGAnoyJk5qego6XfoaNgm94hXF0YH6Cj4Z1i5eAg4+ChoR+hYOUbnl1dJKii4yFmoSEjXSAinx8cnJ7iIR7eYyOhJOnj4aEj4GEi4qKd4WHiYt8b2t+gHttaGxtZ155f2h8e3Z0dXV7d1xgcH1udWBjWl1eUWZtU2VaXWFqaXZ5fnFrbGRrameAf2xzgGxsdG94boR5boeAdoKAfYR2coKNiH57e3x/e4KKYGl7anVoaYJkamNgaVxkdWhvYnVubFRjcXllcHp6c2VpbW2Lip+3mqGjn5KRlpeLmp+fnnt4naaQm4qGpJSLmJl4eo2Fe4mRg4yCgYJtfH54c4CFfYqQfGtofYGXiIGIjnx+hoSHfI+Aj5qbkYimnH9wi4qLkoegoYqFjHyokYiPkpeTlpN4jKOhoZ6Wmn+AkJqYk4ybo6GkmpeRm36OhXmAg4+HoIB9jIyPfJekoKCSmZCPpo2PgZuRiZKXm36Skn6GjYF1dIJwdmB9f42GcoqVfIiLcox/goWGjmh3cXiMmJKPf5d+iIpzgod8fHB5e4yFenuRjYOWppOLhpF8hoeHhXWCg4iHemVye354enBsamZefXNofHV1c3xygGpeYHR2cHhkY1lfXlJraFRkWV9hZ2p2eIFxZmtjbGhlf4BqbX5obnFrfXeGemuMgXOBgX2BdHaCjYZ+fHt/gX1/j2pyg25zaWGHaGxiX3FWdG9tbmB4aG1XanR2Y3V7e3Jiam55iY2fspKlpZyOkJiPhpygm5x8dqSgjZd/jKKKiJqWeHuGh36DiX6IgoB/cX96dHWChX6JkHhnY32Gl4qCio14fYCMg3mWgJWXlYyWn5p9b4uBkZOGppuHjImEppWFkouWl5OSdpGeoaGYlJd6fo6Yl46Wm52knZmTlJx6kIWDeISXjZ1+gYmNjHOXop6hkpiOj6KMi4OWmIOSlpl+mI18iI2BdnF9bnpkf3yKhXCGk3+QgmyHgoF/iYRldW98h5KXjX2TeIuJfICHfHtxfniKhnmFkYqLmKKVgYSNd4mFg4J2e4GJhnZfeHd9c313ZmxkYX5pandzdHR9cXxiY2FzbnVzbWFaYF5ba2RSYldgYWhrdXiGcGJqY21laHyDbGh0aGxvaH98gnltkIZxgIODf3N8g4yBf356goN+fJBtdoh0dG1limxqYWN1VoRpcW5geWdsYmp2cGZ5fHpxYHJshoWQnK2XpqiejY2Xh4afk5eYfXeqnIqYeZeci4uYj3l7gIt9fIN7gIKAeHR4enN9gIN/iIuAZF59i5WHf4WHdH19iX99l4SWk5aMo6CXfnKHepORiqePjI6Kk6CRg5GQlJeRi4GPmKCakpCRdH+NkpSJnZ2ep5iXjZWWdI6PimyGmI+ZeoeIkIlvl52ao5OVio2fjIaBkpx/kpKVhpmIfImJgXpxeWt1bHt9i35uhZKClHdvgoN9fop/ZHJqe4CWl4R/jXSQiYN5h351eIB9h4F9g42FjZSkkHiFgnSJh32Ac3WAh4NuYHt1enF8b2FuY2R7Ym5vdnJ3d3N0YXZfb2x1bm9cW19dXmpeT11XY2FobXN6iWtfamVqY2h3h21mbGhpbGiAfHp3b5CHc4GDhH1zgYaJeoJ9eoGEfX2OcnqKeHhubIdraF9pcWOHaHFvZXdobmxheWhrfXt4cGF3bYuBmZqqoKSonYqKkYaKnoqVl313rpiMln2ek5GWk4h3fXuKfHyAdnd/gHB0c3pvhXyBgIp+fGBcfo+Rhn+DhHN6f4Z6j5GHkZGbkqSblIF9gHuNipKkiY2KjZiajIaRmJOWjomJjJOdk5CMjW6DkI+RiZ6ZoqGXlomWkW+ImoRnhpmOk3qJhZCKcJWalKGSkoiLmYyCf5CefJKPkouZjnuKhId0c3VrcW51e4t0boWQjpJxdIB7gYGIfGRxbHl9mZR9hIh0kIuBdIh5b4B+gYd8hYyJhY2VqI17iH1+i4V3fnBvgIWDY2h4dHVve2JecGBqdF5xanp4eGxycGV4XW1sc21zWFpeX2FqWlBXV2VjZ3Fxf4dmXWloZ2JncY5vZGlnZWpogHp3dG6OhXSBgYJ7dYKIhXeFfHiEhXqAiXd/i3t6cnmDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKf6KYoqihppuHjIqBkJyGk5x0gaqUko2GoIyWk5B/dHt2hXd4f3Jze4Vrcm95bYp2gICGbnFbWX6RjYh/gIF2dYB/f6CGj4qRnJegk5d3iX6AjIidnoqPhpKYloWJlZmPl4yLjY6NnYqOkINtiIqQkYmclqGbmJWFl4hqhaODZ4adipF+i4OLgXeTmJGekZCIiZWNf36Pl3yRjY+NmpJ8in+CbnZwbG1ucHuFaXODjpeKcHd/dIKJgnhmc292gZmOfImEepSReneIdHCJe4aNe4uGhImPnKOIfIR3gouAeHhuaoCCgV1yc3Fwb3haXnBgcGpeb2l8eXBtbWpsdmBwb2pybVlYYWFhblhRU1pmZ2N1cISCYl1qbWRiZmuSbWBmZl9oaoF1cXJwi4B1f4KAeHWAi4B4hX93h4Z3g4V7hox/e3aKf2pxY3xihnxvcWx0amhvbHZ3X3F/eXt0dXSAgn6klZqtn6eWhYyDf5eUg4+fdYqflJKGipuMlY2LenJ4dIFwcoRzcXWIbG9sdW2IdoN9f21uVVGBq5SHgniAdnKCeYGggZGBkpKXm5GaeJF6goySpJqTjomVmZKEh5eZjJSMiY+PiJ6FkIp8coqFiY6InJqfm5aUf5R/aYadiGeGoYiShJGDiXGDkZePmo2PjIuPjXd7kpB6jouMkZaMfIh8gGt2am5ra2x6fmF5fo6VgXZ6gHeDjXx5Z3RsdIeVi3+IhnuUkHF6hHB3jHqKjXuJfoOMkZ+dhX18eIKMfXZwaWuBgnlfd29ta3FzVl5vYnFhX2xueXBncGZmc3RocWthd2VdVmZhYHJTUE5cZmVdeHCIfF9caHJiYmVmkmlfaGRbZ3B+cGtwc4p9dnyFgHR1f4x5e4aBeIiDc4aFfoyMg3t5lXdmcmqCYIh+b29remBqbnR/dF90fXmGeHRzhXx4oI+ZsJylj4KKf4OaiH+Lnn+KmZOOhIiYjo6PhHZ0dnOAcG+Fc3Bxg29raXZtgm59fG10c1JOgt/IktaTfHB0gnWDn4KTd5SQmJqPmHuTcoWQn6GTk5CJk5uUhn6WlYiNjYiRjYicgI6BeHqMfoiMiZybnZuVk3mNdmiJkodsiKOFkoeXg4ZjjJGYjpWJloyNiotxe5SJeo2IipKRiXmFe35se2Vyb2preXlbgHmPjYB6fX5/ho56eWhza3OLj4qChYV9lYxsfn9vgIx/jId9hHmBj5aamop8d3iDkHlzbWZwf4NsanRvaGlzbVNeb2RwWWBrcXdma2piZnhycHBjX3hgYFZrX112UE5LYGZjXXlxiXRdXGV2YGFlZY9kYGZhWGlzc25rcXaMfHR5hoJ1dn6Lc3+Gf3uJfnKJh4GQioh8fph2ZXNte2WHfm9wbIBabG55eXNhdnp7jXZyd4p3eZ+Lm66boJCChXeIlX58iZyHhZ+QjoWMl4STjoeBdXdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYN1hKKFkW6Vj5Sfk5uBkXCFi6OXiY2VipCdloOAlZCFiY+AkoqKl3+He3V/iXiGhI2bm5iZj492inZuhomLfYqjhJGJnYWFXouUl4qOiI6Li4SJbHyWgX2IhYmQj4Z2hX19a31kd3VqbXhzV4h6kYaFen5/gIWLfnhlc2p/io6Kg4J/jJaFa4J1boiRgpGFf4J5f5CWk5mQdXR4iI11c3FndXmCYnRtb2JodWdSYHFnbFVfbnR5YHJjX2h9cHJuW2NyYWJXbllcd01NTGRmYV52c4ltXFxkeV5gZGaFYGNiXlhqcmtua3J2jH10d4SBeHd7iXGDhH1+iHt0i4mIlYaMfn6Yc2h1cHhsi3pudHCBWHF6dnlxZXd5hoxpdoCJcn+ch5innKOShHxwjJR4eYudhIWhjY57lY1/mYiEe3J3cHNqb4FraWx8dF5geHZ7cHV7Z2BlfOvatcnD3IhzbHOAdoqaiI1pl4+OnJSSgYhwhYigjoWKlYqNmJR8jZOIg4mPe5GLhpCCf3Z4g4Nyh4KSm5aUmIaMdod/cIWCiYeZooOUjJ6DiWGDlY+GiYaJjYeAh2l9lH99g4SJjo2CcYZ+f3F3aHVyaXN3a1qMfZKBhXx/g4CEioJ1YXRsiIGPi4J+f5KRfW6CbHmGkIaThH2BfH+Sk5CXiW9yeo2GdWxwa3J4gF9zaW5canZgUmRyaWZTX3B2dGBvYF1ognFzaldnaGNpWG1XW3VMSkxlZ19icnOFaVtcZXleXmRne2BkX1xZa25lb2pzd4p+c3OBfnp2eohzhYJ8f4Z2d4qGj5iCjIF7k3ZsdnV4eJN0bnh6fVh5hXGAb2d5d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2KmoiJe59/g5l/gXhxc25vZHJ+aGZsd3dbX3l7enFxf2lhZ2F/1baOkKZ4bnF3e3CSkIyHapiNiJuRi4V7aIeLmYaBkpGGh5iNfI2NgYGJjnyQjH6KhXp1e4J6cIaAlZmOk5SBiHWDhnaDgIuTnZ+GlY+ffohhf5OHhIiEiY1/f4NnfZB/fn+Ci4+Qfm2CfIJ0a212dHN2dWtjjYGOf4V+fIR/hId+cF9zcYV8j42CfH+SiXpxg2Z6hIqHjIN8hX1/lJCRk4RucHqMf3Vtbmpsen1iaGppWGx1WlJpcmpiUWJyeGxhZV1aaoNtc2JcZ19kbF9uVFpvTkhPZ2VcZ25xf2taW2NzYFxjbHdkZV1cWmxsYm1qc3aHf3Fvf3x8dHiGeIWCfX+HdXmJgZKVfIiGdomBb3d5e4STcG18gXdeg390gW1pe3OUc2dyiH1ykpGDmp+boIaHdnaUfm12k5d9h5CDio2afIuadn12cW9samF0fGdiaXV6Wl93fHptcX5lY2hoV52PXnFylrzDg3VxlIiQfnKWi4ack4yHcmqIj5aAe5SMgYSbjHyLhn18iYx/lIh1iYV2d32BcXWGgZ6UhpWPg4Jyf4h1hHyJmJ2Yh5OOnYCIZn2Tgn+Fg4mJcoF9Z36Le3h+f4eLjnxpgHyDdmVveHhydnNsao2FioGKf3iBgISDf2tecnh6fo2KhXuCj4B+coBpeYOHi4aEeYR8gJeNkIx9bm17iX13dG5oZ3x2Y1xwYldvclNTbnNpYU5mdHhlYF1cWG6Ab3NZZWJdam1gcE9Za1FEU2dhWmtubXtuWVtebWNaY293ZGZcXWBsamNsanN2goNxbn57f3R1g3uDgnyBhXZ+iYGWkHiDinSBiHJ4eX6NkG9vfIFxaYF5en5tbXx2lWtqd4R0bJSNhZ6YoJmFiG59jHZqeJiOfoGKgpWXinmOlm96c3BsamRgdHtoX2Vxelpgcn15Z3F6YWVlj7Gyd0piWqTZ0JZxe5CKkHd9lIuEmZGLhW5rhZKSenmShoCEmIp8h394eImKhJaAb4yIcXR9eml5hYOlkISTjYN/b36DdoR5hZuYk4uSkJSFh3B7koJ9goOJg26BeGiAhXhyf3+CioZ7ZX1+hHVjcHJ/aHhwb3WYjYWCint2eICEeYFrXHF9coGIhYl9hol6iHKBbnGEh46EhXOEeICZjY2EeG5vf4R/dnplaGp9cF9Zd1pYcW1OV3JzZ2BLbHZ0YF1bW1l0fXJvV2ddZmpxX25OV2hRP1lnX1twamd4cFpaWWtlWWNweV9oXF5lbWhmbGlxd3+Hb2x/fYB1b4J7f4F+gn92gYWJl4pxgo1xe4Z8eXmDk4x1anp/bG9+dH99b3J8e5RvboF/eGaSioKhmZ2RgoZnh4NvZ3qViX5/hYGZioF8jYxpeHJrbGZfYW94bV9ib3hcZGuCemFxdl9lZdTqvooyOj6LjoBxeYWHjo12g5aMfpKNjH9tbIWNjHZ9j3+FgpWJfIN4bnaGhIOXd2+IhWt1e3RmeYKDp4yDj4uEfW5/dHaDeYackIyQkZKMi4Z+e5KGd3+EjYNsgHJpf354bXx7gYqDd2J5hIFxZHFofm10cXWBm4uAf4V+cnV9gHKBcFttfnR4ioOLe4eAfIh4enFsiIOQhItygXl/l4uLf3Rua3Z/gHV1XGlod3BZV3xTWnBlTFpycmVbSnB3blxaWllddH51aFliW2dmbmNpTFdmUT1eZlxddWVfdHBaWVRvZFlkcXlaaF5fZ21namxpcHd9jmxpgoR+eW6AfH2Bf4J6dYKBjZOFcICLbnh+gHp7iJKJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjIyDm52WjIGAbI5+a2h+jox7fn+DlIJ/fYqIa3VxZ2hjW2Jncm5gYWtzYWhwiXlhc3ReY2SboI9uXDVZr7V0aYCIfJKGdoWWhXOOiol3cG2Fg4d1eYl4iX2TiHp/c2d2iH5+mG9xhn5odnltZXmIhKWHgIeNiX5ufnZ/gHyMmYeCk5CYiIuEiXyPiHB7fYR7aH5ta4B7eml6doGHgXJgd4F+cWRyZ3WCbXR7hZSRgXyBf253eXx0fm1Yb392dIyChneIdoKJenhzbomBj4GFcn59fpOJiXpubmptgYJ1bl1nZnNxUVt7TlxwXE9bcnBkVktzeGlXWVlaYXGAdGBdXWBnZGhpZk5ZaE1AYWRbYHZhXXVtWFdTdGFaZG9yV2peYWhrZ21saXB3fJJraISJfHxwfn57gYCCeneAgIqLg3F7h29xd4N/e4mNj4Nqfntud3l2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiReH17gZGAgH6Kg3BycGNmXllnX29wYGBncGZqb4p0YXRvW2FkanZ7f76cpqPIuHGFg3OTfHiGk4JzkYyHcnJwhHuDdHWHdIh3lIh5eXFjd4Z6gJNpcoR2Znd2Y2p8g4iegn9/jo59cn5zhHmAkZCCeJaNlI+Igoh7iIlreHl+dWd6aGt/eXNpenaAgn1oYHeHfWprdGh7f2l2gYyQlH56fn5we3Z7dH5iVnd9cnOKhIJ8g3GGind4cHCDgo1/fXl+fXaOhoN2aXFpbIeCcnBdaGNzbkpldUxeblVUWXNuYlFPc3hgUlhYXWJwgnNbYV1oZWRjamRRWnBJRGRhW2NwXl13aFVXVXddW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHl9cnt+eIGBgXx2fYSIhoNwdoNybneCgn6Ji5N/cIB7d3l6gYx0g3h/gYGChHqAdW9+iYuanoh9hXp3hntndIWMkHp/f3uJhoR2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhvjHV7ho6AepOJf3V0dX53gHBxf22EdJSGeHVsYHqCeYiPZnGDb2d2blttfYCQk4CAeJKSfXh7bYd1gJCLhHSWipGOh4WFe3+FbHR2f21nd2Vte3VtanZ3f398YGJ4hnpodHVjfnpndIWOjJV7dH91cYB6fG1/WVZ0fm91hId/gHlsiIZ0eGt1f4OEfXt9eHtzi4F9c2d0ZW2KhG10W2pfdWRIbm5MW2JXVlV4bWJQU3R2V1BVWF5hcYRvXGBjbWVkXm5iVFxyR0JmXl1maF5be2JRVVx1W1tna2FWal9gbmZma3FocHV4jnRrjo11f3Z4fneBg4F7dH6EiIeDb3F/dHF1foWCiY2Ke3d/eIN8fIWHeId8fYF+hIB7fnN2eYyOn42Jeol2dIN5Xn2FmYx5hoN0hYaFd4l7Ym5sW2JbW2FWanNjYFtnbm9mh3FhcWZXXWNrf3zKzoi5omptbYpscYRxfISJfnuRhHl5dHl1dXtqbHVjhHWRgndwZ159gnqLiWVygmtqcWNYbHuGnIiCgXOXlHd+e26IcYGKi4dxl46QiIWLg3t5fnFxb31maHFibXhxamtxd3x8eVxleYB3aXV4ZoJ2Z3SHi42UfHKGaW9+gHlufF1Ycn9tdICLfIJvb4l/cXZod3+Bf4F3fXF6dId8enJmc2FujIJsc1hrX3dbSW5rTVZVXlRVe2thT1R1clBRVFZeYnSFaFxgbGpmY1luYVhicEdBaFxfZV9dVnteT1ZkcFlbamhdV2hgX3Jma2hyZ3Byd4Z4bpWKdH96eH55goiAdXOAhoWNgnBwe3h3dXmGhoaLhnp8f3WLfn2FhISHf35+fYd/fHh2eXeSk59/jHyLbXaAeWODh5eGc5KLb4WFgXqDdGNuallfW11dVGdzZWBZZHFxZoFzYmtlV1tgaX93vq57oLdtYnOGaHN7cXmChXt9jH53eHN2b3t2ZWpuYId1joFzamJefnh5i4RmcX5oamtaVm94iqSBhX9xmZNxgHh1gm2AgpGHc5WIjIiEiIV9eHRybmh5YGptYG12amdqa3l3endbZ318eGVyfW6EdGR1hYyGlX9vi2ZreoN1bXRiXG98a3V8i3yBZnWHfW1xZ3V+eH5/cn1renqBenhwZmxibol+bW5Wa2B3VUpqa09STmhOWXxoYk5VdWpMUFRVX2d2g2ZdYHFoZ2FXaV1ba2hKRWtZYWNXWVV5Wk5WbWpZXWxlXFplY150Zm1kcWdyb3WBd3CZhXZ/fnd/fIWHfXVzgoh/lYJuc3h6enNzhYeIiIR5gX12j398hImOhIKEe36Lg3t3fHd3mp2XeoqChml3fXxsg4STgHKPgnGFgn6Bf29mbGZXXVtcW1RkcGRfV2NydWl1cGVlY1dcXGiAcG9ygHSJZGR4fml0dXNzgoR4gIR5dnR1bmt7cGFna2eGdI2EbmZdX31we4l+aW13ZmlkVVdycI2mfIR8dpaQc3tzfHpue3uQhXaYfIeGg4aDfHRwcmxndVxtaF9sdGRnZml6b3tyWWeBd3VncIB3gnVid4SKfJSAbotqbXqBcWZzZWBtemdzd4p8fmJ1g3Zpa3F0enF5eXN9Zn5/f3l3bmNmYm6GfG1rVmpicFNLaWtPTE5wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWZgVmNXYnBdTEtrWGNhVVRVc1ZMWHVkWl9rYVxbY2Vfd2ZtYnBpc25xfnR0moF3f4B3f36GhXp9dYKEfpeFbnJ0e3p1cYSFj4GAeot1dJGAfYGUjoCFhH1+jIZ7foB2e6OlinmJhYNrdXx7dYOCjHpuhXN5hH2Bg3VuamhlVl1bWlpUY25lW1hic3tpaG1pYGJXX1ppgGprb4BobGFoeXhqc3R0bYSBe399dnVtemhqeWpfZW5ogXaPhGdlWGJ3aX6He29pb2dmXVVYb2iPp3aBenyQjnl1b35vc3V5j4B3lXSFgn+FiHZqcnZnaG5bbGRdbHNfZ2FpeGh7bVptgnJzaW+Afnl3YHeEhHiPhHKIcW95f3JjcWhcb3dkcXOIfHhic4BwZ2p4c3JseHd1d2SDe393dm9kZGNufH1rbFVpYmZTS21oT0dSa0VheGdhTVNxXElNVFlla3d7ZV5tcWlkXVZfVW5uV0tUaFdmXlhOVWxUSlx5X1tfa11dWmJlYHpobGFvb3Vtb3Z1eph9d4CBeoB/h4Z6eHqDfoGThHF0dH56dnSFiJB9gH2Qa3OVgXyDn4V/h32AfoaCgIp7doSsn396iIeDa3KCenaAgIF1bodvfH9ziYBqb21kZFhfWllaVWJqZ1taXnWBaV5ubFxhVlxca4FmcnR9aWpda3Z1Z3R3cWyFe319eXZybHpoaXhmXWRzaHp3koFjY1RlcGeChXd3ZmhqYFdWWWhkkKdufniAi456cHB8Znlveox7do5xhH1+f4ZuZHZzZGhoXGtiXW9vW2dfbHVkemhddIBvcmtxe311dWF0hYp6h4Z/f3dydX91YXBsWXF0YnFyhXx1ZHJ/bGFsem9qaXp4dXJmhXV6enVwZGFkbnN+aWxUaV5dVEtzY1FHVmFHYnZmYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVh2ZVRKXGNXaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bW9tdoOYeXKBgHx/iIuGfXV2hniHjH10dXWCeHp6goyOfX6EiGpzl4F7i519foV6gXp+fIaIc3GProx7e4ePfWVyiHp0fHx2cm+GbHt9bI96YnBvYmVdZVZZWVdkZmtgXVxzhWhYcW5aXldaXGx7Y3B3dmxiW2xyc2d0dXBshHl+gHl3bm50ZWl0ZVtndWZ2dpF6X11SZWZqgoJ0fWJjaVxUWF5iY5ClaHl0goWQeG1ueWd4bXyFe3WIcoB4fHh/aGV2bWBmYF5qX11za1llXW9vYnplW3d7a25ucHd4c3RkcoOSfoeCiHp2b3J9cmJ4ZFtvcGFxcYJ8c2ZxgGRebnZpZGd5enRub4F1dH1zcWJfZm5vfWRqU2hYWVRNd19RSllZSGJ0ZGFJVG1TSUxaV2lscXtibGxzY2FaWlthdltTS2ReWGlTV0dZYE5HaXVYXmFtW1tfYmJdhWhoYW54eWxvanaBkHltg36AgZKIhIF2dIl0jIZ0cnd2gXd8fX6Mj4B+k35weJaDfZmSeYCAeHl9f3SIg3NwmaJ7e3+IlHhkdYh5c3h1bHRvfmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYhlUnJuW1pYWGBsd2RpdWpqXlptc3Fsc3NzaoV8fn98d25ubGRpcWNbanJkdHaPc1tXU2RhcoB/coJdYmNdU1pgW2OTn2VycYWEkXRsanlsb3B6fHtxgHZ/cnp6emRmdmddYlphZ1ted2hXYl1vaGF3YFt7dmppcm53c3N0aHCBlIKGfoR2cmpwfG1md1dca21icXOBenNmb35bYG9xYl9qcX1sbHR+c3F4a3BhXGVsbHphZ1NnVVdSUHZbUlBZUkljc2JgR1VqUEhQWlVra2t8ZW1vcWFcWlhZbHBXUlBmVldpU1RGWlxPSHJ0WF9jbWNYYWBhXYtqY2RteXhrb2l1eYZ7a4N9gISZfIKEeX2Ibo+GcW93enx0goJ8i4+Dgpd0d4KUhYGfiXWAgIFzf4Fwh4J1b6KXdHuGi4Z7ZXiLb257b2Z4cHpsc3ZyjGtedG5hZ2VrUl1bVmdibGxaXHGMZE9vbl1WWFVnanRoYnRlZV1ZbXRtcHV1eWqHfH98iHeQc2Rka25hXG5tY3N4h2taVFZiY3h9fXGFXWNfY1RbYFljlpVjbnCDhYpzamh6bmVzdnN8bHp0dW96fnVfZnJjW15WYmRYYXVlVV9gbWRhcV1dfnBoaXNxc3B1dWpthJOBiHuEcXJmbn1wcm9TW2ZqZnF0gXdzYmx2VWJxaltfbmV8ZW12fHNyc2ptYFpkamp3XmZUZFVWUFRtV1FXU1BIZXJfYUZYaU5IV1RWbWhkfGlreGtiV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWmJgXl6PbmJma3l1bm9odnZ/f2yDgH2Gl3t/iIGKf2uTiHJndIB7dYCDfYiOf4yTc3yKkYWHn4Z7f4aMc4CGc32Ddm6ljHOBjYt2d216jGBkfHBmenN5bG1xdoJnZHtsY2ZnaFNeXlRnYGxvW15ujWhOam1gVFZTb2dza2V4ZGVdWG90bHJ6d3JsiHuAdpx7emthZWxtXmBvamVweX5nWlZYYGt4fHtwhF9iXmdWWWBXZJyIYmtxgYd9d2treGxbdnFseml1c25ve4ByWGpuX1ldVWFjV2RxY1NeYWlhYmxaYH5sZmtzdW5td3ZraIWMf4h6h21xZnB8bXJtY1lhaGlvdIF0cl5pbFJlcWRUYm5iemNxdnt1a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVwXWNGWWlNSV9LWG1kX3hobn5kYFVeVF10W1RSYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNuZ3Z0eoNygYN6iI1+fIqHjnpukIp0bHOCdH9/iIWGkYSVj3l+jI+IkZuEgHyMhHN/gXN0eHFuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Njo6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo6Ojo+Pjo6Pj46OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHx9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvLy8vMC8+RERERERFOC4vLzAwLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHx0cHBwcHC43NTU1NTYnGxwcHR0YOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHiIeHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4ODg4ODhYWGhYWFhYSDgoKCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5CJj46Nj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+Ojo6Ojo6Ojo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiGhoeMhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYeGhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+Hi4eHjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISKhoaIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIuKioyKjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpKSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZ21namdoZWhnY2JiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpeXVlZXmJhXl5aWV9bWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVBRUVFRUVZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PUFBRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JERERGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUBAQ0Q9QURERkNGRkRGSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozw+PTs8Ozg6QEBBQj9BQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6OjY5Ojk6Ozw/Nz07Ojo4PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw9P0A9PT0/UT49PT08QUw7TEI5Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREA9PD5AQT9BO1p5Tz1DRT5EWDxZTjs8PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZEPjw7PUA9OTo6b3dZNzs6PEdePWBcOTs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BxcnJydHV2ent9fX1+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUNfSTw7RmNnX1d3d1g3ODg4TWJCZWg8Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAT3x0RkZ1hoaGgnx3WTw9PzxTakdnaz47PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBVdnpwdoSDg4GCgH1ZPkBDPlNvTGRoPTs9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQFB0c3+DgIGEfHyFbUZCQ0RCUmlkc3JJQENFSElJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFR2xzfYB5f4WAfYZzRkNERE1nfYeIiH5YR0hRUExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHp/gHyChIaFhYtsQEBWd4aIh4eHiIJYUl5OTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtOXHyDhYSEhIWGiIBWbIWHhoeGh4iIh35pVktLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpag4SEhYCBhYeGg4KFhYSFhoaGh4iGiXtLSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWiFhIWEf4CDg4KDhISFhYaHiIiIiYmMjWZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaYaFhIGAgoSDg4KDhIaJiouLi4qJiouMiVQ6ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JohYOBgYKDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojo6Ojs4OTg5ODc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PnaEgYKDg4SEhISGiYqKiIeIiImKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz1KgYOCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA+PT4+QD8/P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlWEgoKEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4qLXj5ER0lLSklGR0dERkhHRUJBQENFQ0NBQkNCP0BESEVDRURFRUFGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NFWoWCg4SFhoaGiImJiIeGhoaHiYmKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fX5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkNHR0pbhYKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1PTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExOS0dHR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4ODw7PD06P0E+QEBDRklKUWCCg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEhFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QEVJS01WcoOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4tfUlJQTU5NS0pHRkJHSkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FRUVFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxvcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSExNUVd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKREVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0dWTkZPUVFVWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMj4uLi2dWVWthRVJRUVBKOztRU1JgdV1VVlRWWVlSWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLSEhKSEVGSUhJSElpcnZ5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A+QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFpnUlVWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSVlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpbXF5UUVFQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1c3N3e3p7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dDQkFEQE9QTVNkc3R1dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiW1hTUVBVUnNXZVtPT09MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz8/Ozs+QEA/Pz5rUUthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNDPz48PUI+Sk1GVW51dXVzdHZ4enx6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXt4enx8eHd4ZEJAQEI9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztCSD9cdHR1dnV2eHp8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJYR0ZGSEJBRklFRUZETVJQYVdSWFFQU1NSVVtPT1FXUE1KQ0Y+Ojo2NDg2OTc5OjM2Njc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYXNrYWFfXWRhX15ZVVBNT05MSEhKS0lIRkNRUFNaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbnF0eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KT09UU1RcVlJVU1JPTUtJSEhGPz89Ojc4NzY1OTk2NzY2NVdwcHN4eXp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KSE9QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYVFTUVBOUFFQTk5NUE5UUlBSTUlMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjQ1NjY7ZXBxdXh4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkZCRkdHSEZKREhKSEdFSExIS0hGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRUZISk5LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FNT09NSExMSUtLTEtIRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t9fHx7eXx7en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUV1dVTExLSD05ODc7P0A+PD1AQEI9PkVIR0RGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSUpMTEpGRkZEP0JDPjxCRj9CP0FkcXV4e3p7e3x7enp3fHh5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0FAQD5BRElFQ0hISUdJRUJCPz49Q0FBR0lETU9iZVFNT05XS0xNS0xNTUxMS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkFBREVHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTVFUTEpJTVRGSUlKTEpLS0lJTE1PUFJQS0dDS0dDQkpKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW9qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0RHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQ0NHRkpMSkVJSUZHSENDO0FAQj5AQENFQ0lNUEdJS0ZIS0RISUtNSEpMSEhKTEtNXVJJSERNRkFES0pOTVBOS01KS0ZHR0pNTlFOTGNuaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0RFRUdFR0JDQD48PTo7OjpAREA+QkNERUlGSkpMRklJR0ZGREI7QkNDPj9DQ0NFR0xOSEtOSERIRUlMTk1ISUxHRUZJSUxOS0pIRU5IQ0dNTE9NT01OTk1MSUhKT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQkJCRUBEQj4/Pjo7Oz06PT5DQT9BQ0VHSkZKSUxIR0dHRkVDQD1FRUI+QUNDQ0VHSUlHTVBJRkZHS05PS0ZISkZFREVJSUhLSUZIUEtESU1MUE1PTk9PTkpKSU1SVVRST1dkYGFtZ3Byb3J5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzs+PkBCP0BCREdLRklHSUhGRkdFQ0JBQUZGQ0JDQkRFREdHSEZMUUxJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUNOT01RT09PTk9PS0tLUFVXVlVUWGBeXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmprc01HR0ZIQkJBREQ8QUFAQzw4OT0+OT88P0I/QEBERkhFSEZGR0ZGRURDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LT1NORFFSUFFRTk9NTlBNTE5TV1ZXWFZYXVpdZGBoYmppZ2tfZWVnY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaW96TUhHSEhCQkJGRTxAQkJEPDc6PT46PjpAQj4/P0NFRkRGRERHRUNFRERFRkdKRUVJR0NHSEZIRkVDRkpKR01KTEtISkxGSUlLSEVLS0xNTk9SVE9JU1VUUVNQUU1OUU5NUVdaVlpZVlpdWlhhYGBgXmhlY2BkZWhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN1bm9yc3lOSUhHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPD8+QUJGQ0VCQkdEQ0VFRkdHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMS01LSU1MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZW15fXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZxdU1JS0hKRUJFR0U8QEdDREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREdFSEhGSEdJS0pGSkhIS0hGRkxISEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm92SktMSkxHQkVERTxARkREQjs/P0FAQEBEQT9CP0FDSEJFREZIRUlFRkRJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTkxOTk5QTE9QUlVYVk1OVFZVU1JRUExOVFNSV1teXl9dXWBfYWFhYGJkZWFjaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dKTUxMTEdEQ0FEPD9FRUVDPUFBQ0JCQ0VCQkRBQUVHQ0hHSEdGSkZDR0lHR0pGSUxISkpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhYmduaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xNTEtMR0VBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NCSUZDSEpJSElLRkRLSkdISklJS0dKSk5LTkxJTEhKTUtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVGB3dWlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5S05KS0pGQz9AQj89REVGRENEQkVFRUZCRkZIRERKRUVKTExKTE1HR01JSElLSEtKSUtKTkxNTUxMSUxMTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXlta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEQEJCPz1DRkdCRkNFREVFRENISEdERUtHR0xNTUtNTUdKTkhKS0pJTEtKSktNTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncXBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRUVCQkI9P0BGR0JHRElFRURCRklISEVHS0pHTU1OS01OSExNSUxLSEpNSUtKSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdoYWRqdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRENBQjxCQUJGREdGTEhFQ0NIS0hIRkpMTEZOS0xTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2diYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTU1JS0pLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpKS0tJSElHS0tMS0ZISkpMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RT09RSklOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSERFR0ZGQUVDP0NHQ0VHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0lMSkhGSEdKR0hJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWVxZWlhcVllcXWJfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRQQkNETE1CQ0RCRElER0dGS0pLSEVFSkpKRkVISFBKTE1KTVNJSEZBR0ZKSUtLSkxKSUZFSkdERkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFhZXl1jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tFRUhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRENDRUFGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV5eY2FgYmJiY2NlWlFZVlVcWV5kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLR0NHRUJFR0hGR0hJRkdKR0hGSEtJTERES0tOTUxMSEpKSEpHP0dGTktLS01LS0tJR0dDREBEQUhJQT9JSkdPXWFaW2RdX1RRU1hdXFxcX1pLV1xMUlxZSU1eUE9cX2FjZGNjYlxkY2JkY2ZYUVVUU1tYWmFeXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSUZGR0hHR0pGRkZJTEpORURLSkxOSkxJS0pISUdCSEhRTUtLT01LS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJhYGJiYGNiYmRkYlhPUVFSW1NbXl1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lKS05MTElMS0lJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBRkVEV1VFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJdYGBfYmNiXWJiV19fVFBOUFFYUl1cW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQRFdfSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FERkJNSENMTFBPT0xGTUZHSUpIR0xMTU9QSUxPUFBTUExQVFNVWllXWVhYZFZPU1RQUE9OUFVUXFlZWl1cYGFkZWNoY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHSFlNR0hKSEdOTFFRSUtLS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRURfTERmY0RNW0lfXHNtT01WbVlMQ1BgVWxXZ0pdV1VeRE1RVUxNVFZRU1RYV1RYVVRcVFBmWmhoZFhUa1RXVlVbXFtgYGFiYmJgZmhmbmxocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtHYFRISk9KSU9NUlFLTEtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzV1BtSHFucGFWUHFxc1BCa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X2B3YFhhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEZKTEZSVkxLT0lLUlhXUU5OTkxRVE5PUVBLTE9HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb3CBXWV6dXhxcXpxfnN9a3V9YlJnfGVzc29zc3x9b315b39yX2BgYmJaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtKSEpQTk1NSk5WXllVTFFTTlhaTFNTUk5MUElRUlRZV1dQVFBQUFFLR2Z4bGN4cm1aSkxVeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpWHNRaHptaWp6en5seHp/b2dvWHZ2anV1cIBgc2h8aWx4fG9eX19jYltdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKTFBPT1BNUFpgWlhLVFdQYV5SVlFZU01QSVNUVlhXV1BVUE9OUkpLcm91dXF1cWRoYFZuTHFwXkZoeVd2VExoeH14YHl7c25hXm1vZFJncnVubXlwd2x2dHRxbG1cdH56a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUEpMTUtMUVFRUVBRV1xZVU5WWVVmWFJSWV5UTU5JVFRXV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ7XVRLbGB2dWtpdXt7bX54a3xwXV5eYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobG1yfGttaGt7dG1ta21PSEpLSElJSFJQTE5PTUxUU1NPVFJXUlZUUFdaVlZUVFRhYFFPTktUVFNRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZX1tncl5bW1pcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraG96aGdna3VqaGdpbFFJS0tMTUtKU1FNUVBPTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1FSVVVWU1pRT1NSV1VUWVZUWVVTUlVTVFRYWVddWl9hXVxaWlxcYGNcXWJjZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLTE9PTE1UUE5TUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVRZVVdZVFJSV1VVV1xaW19dVllfXV5dXF1hYV5bYmJjaGZlZGJYX2BiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUE5NUVFQUlhUUlFPTU9TVU9XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVlZRUldYVltbV1FUVlZWVllUV1dUUlJYVlVaX1pdX19XX11eYFxcYGBfX1piYmRoaGVkYVliYGJeXmZkZGBiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVZWW1xXUVRXVVZYVlRYWlRTUVpXVlxeW19fYFZiXGBhXWBiX1xgXWNhY2dpZGZgWWNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeYFteXmFgX2JcWWBaUU5PTlZRUFRST1VUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSS1FUU1laV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlTVFlcVFJSXFdaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1bYFxgVVxdaWpyfXNsZ1xVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZWVVNPVlJTWlJUVVRYXFdYWFNYXFheXVlaXVVVTlZXV15bWFFUVVhYWFVXWVtUU1ZdWV1dYF1iY15ZYFtlYl9kZF5eY2NhXWVmaWRmXl1kYWBhYWNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWVteVl5ZXVBPT1JaUFpVVVZWVFRUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVVRWVFZZV0xSWlZdW1xST1VTWFdWU1BYUlNXU1ZWVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paU1RWWllaVlhZXFZVWl1cXmBhX2RkXV5dXWVhYmZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpYVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFdXV1ZWV11YUFVcWV5dXVRSWFJXVlRSVFhSU1ZUWVhZXV5YXVtVXl9YX19YXVZRWVRZWlphWVxVVlhbWlpYWVpaWFZdXl9eY2JhZWVdYlxgZmJkZmRfX2RiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaVlNcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFlcWlZYVVdbWllcWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdbWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVtZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xSVlhRV1ZWVlZWU1ZUWFxcX2BgXWFdV2FeW15cW15YVlhYW1tfYFxfWFldXF1eXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBYV1hZWVdWWFZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBfXV9ZWV5dXl5hXFtaWVxfYV9iZGNlZmVmYlpkZmdpZ2NfY15hZmRaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FiXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNgUlxZT1hXWVtaWVhaWWBdYGJiYGFjX1xiXV9dW15eWllVWF1dX19fX1taXl5gYmNcXFdbXWBiYWNlZGdlZWZkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9dXF5cWF1bXl9hY2JhYV1iW2JkYmBjY2JdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFfXVtgYWJlYl9dU1xfYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WDgYODgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7fHx8e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiYyMjIyMjY2LiYmJiYmJi4yMjIyMjYh+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyNj4+Pj4+QkI2MjIyMjIyPkJCQkJCRi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvb29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fX19fHx8fHx8fHx9fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5dnZ2ent4e3h3dnh7eHp6eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp6e3t7e3t7e3t7e3t7e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx8fX16fHt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eXx9fXl8end4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d8enx8enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en58fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHt6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8e358fX5+fn5+fXx/f398fH2Ag4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAf35/gYCAgH+AgYF/fn+AgX9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35+gH9/gH9/f39+f39+fn5+fX5/f35/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5/fn5/f35/fn9/fn5+f4CAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/gIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCg4KHg4OCgIKBgYKCgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCBg4GChIWFhYaGh4aGhoaHiIeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEg4GBgYKFh4aHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgoaNg4yHhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4KBgoKBiJOAkoiBgoOBgYGBgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgoORh4B/gH+LmoCVjn+CgoODgIB/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKDg4KDiZmMg4KEgY+cg5iSgoKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4OFhYSDg4GAf4OPmo+DhYSCkpyEl5SEgoKChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+AhJCJg4B+fHx7e4ydjoCCgoGRm4SVlYSCgoGCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+Fm5SIf319fIGAgZWIgIOCf4+ckpiUgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgISbnol+g4F9iYl+goODhIKIn6Chk4mBgoKBhIeCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgpWgiIKNhX6DhX9/hoaFhZyfhn59fX+Cg4eWjIODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDi5KChIaEiYF/f36CiIaFiH98fn9/f3+InZqEhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIKBgIGEgX9/foCKgn5/f39/f39+f4WejYOFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISEgYCAgYyHgH5+f4F/f4B/f4CAf3+AfoOHhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICDiYWCgIGCgoGBgYGAf4B/f357eYCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgn+AgoWEgoKCgoKCgoB/fn19fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHh4eEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWDgYKEhIODgoKCg4F+fX5+fn5+fn18fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEg4KDhIKDg4SCgYKBgYGDg4SDhJGSkY6PjouHhYaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoGChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGh4eEg4GDg4SFhYWDg4WEhISEhYSFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4GDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSCgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn6AgoODgoOCg4J9fX5/gICBgH59fX19fX18enp6gIKCgX9/f39+f3+Afn2Af3+AgIF/gICBgH+AgYF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/gIGCg4SBgoKDg4OEhYCAf3x9fX59fX5/gH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gICAfn9/fn59fn9+f4B/fn9/gH+BgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn5+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOBgoKBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjISDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GDhYWGhoSDhYWDhYSDg4SDhYSEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYGDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEgoGDjYl/fX+DhIaFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg3yCgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgICCgYKAgIGBgH+LlI+Mi46OjYiHiIWFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIJ/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX19fXx8fYB/gIB+gH5+gpSRjIyNjo6KhYaHhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoCBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2MjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CLkI2Mi42Mi4iEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gH+BgX9/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+fn58fHx8fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3x9en1+fn+AgIOHiYmJiomKiYWIkY6MiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4OAf4CBgICAf3+AgX9+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH19fXx9fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYSEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Jgn9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fHx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICAg4F/gIGEgX5+gH9+foB+fX5+gIB/gX5/gH9+f4B/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgYCAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmGhoWFh4WFhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIODg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgYOBgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Bg4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf35/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH5+f39/fn1/fH5+foF/gX9/fn+Af4CDgoOAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fX+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9+f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgIB/foCBfn+AgoKAgYOChIWGhIB+fXx8fHx6eXZ5eXp5d3l2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eX13eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/g35+gICBf4GDgoODhoSAgX58fXx8e314d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af319foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6enp4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+fn18fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYGBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gYGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+f3+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/f31+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CBgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXZ2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKAf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gH9/gIGBf4CAgICBgICBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHh4dXh4eXt8fH18e3x8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg39/goGEg4OEgYGDgIKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCf3+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEf4CDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f317fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGDgYCBgICAgYKBhIB+gYOCf36Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4KEgYSEgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYKDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgYCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX56fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgYSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4OEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODhoKDgoOBgoKEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSFhYSFhISEhIOEg4GCg4ODhISGhIWEg4OEhIR8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYB9gXWBeoR/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fX5+foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZzhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fX6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3t/fXyAfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSBgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhISGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3p5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYWFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHh4aDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fn1/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoeGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f35+fHx9f317fX18fXp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WEh4qHg4eFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaHhYaGhIOEhYKBgoGAg4OCgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoeGhYaDg4OFgYCBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4N/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn1+f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOFhoaGhoOEg4WChYGBgH9/gIB+f4CBfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aFhIaHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX6DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4F8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f399fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1NXU1NTV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29zc3Nvc29vb29zb29vb29ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjI2IgYKBgYGBgYGBgYGBgYOLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E9P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZXTkNDQ0NDRERDQ0NERENGU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaW1NISEhISEhISEhISEhHSldXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZWVdU1RUVFRUVVRUVFRVVFZgYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Pzs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzMzMvLy8vLy8vLy8rLzMvLzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz8/O0tTPzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tbX19fX19fX19fX19jY19jY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHP0qig0M/RpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2s1rKeo6fWr5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIianciempOdwJ6YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZusmqGctJicop2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5SirZqWrbmGnpavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEna2YgaCWeJuEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkKOcnaiInHmfqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qickbmvppyKva2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWaoKWml5edpaeWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp5zNoKukm9Cfq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI2218WQjbfXwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dHUx8PV0dXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKQzxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpqampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpual5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYm5qZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6OjpKKhoJ6bmZmYmZmZmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoaGfnpybmpqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56bmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmpmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZmanZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmYm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6JkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6KhlZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6qpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapaekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66vqqqrpKGipKmnpqmoo6Kcm5ukoKWoo6CYnZifoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKelp6mnqaijp6aZnKSmoqGhoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+hoqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKSioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndiX1xVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqsqKirsKmoqqihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltaYF9aXFZcaGRuY25qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnaGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eWpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKumpZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odWtxaGlpYVlTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW1vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1r7Ogp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5rY2Jud3V2bmxbYlFWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbWZudXFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppqWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3RrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKastLWsrqWko6ikoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ4c3lmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDw8HEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6ypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMnIyMnHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd1aGppdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8HLy8jGzMrOxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwLu+tLCwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBwsO/v77Ey8jKy8m8vMjIyc3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8C/wMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2pkYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDubi5vL3Bx8HGu7jO3c7DxMDDwcLBw8LDvr3CwMDBwsvDxszLxcjRwrC+vri6u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjZGNqYmdjW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9v7m+urq0wLi1t7Kuuru2wLfA3p6Qwr/BvLvFvbvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmJnamdmaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre0t7+60MN9hsq+w7W6x7e2ubu9ubq2u8XFyr25xcC/vMG+uMa8wr+8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHFtZWVmb2lla2hYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5ubm/v9edd4GpxMe3ubiut7W4urS3s7vFxsvBvMbAwL+9vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYW1gXFRJS0pESkJDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9vrvEtrW4t7rDv8W8wc7EgHd5lMbPwsC4r7W1vL64urK+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFmbGludG54Y2diW2NRS1RIRUVDSEM8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vr6yvL68xLeyurCjp7mzvcfMonR5epfP0czKxLW6wMTIv7+1v8G/xsa/y8bDv8K8wMPMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLGzwNzbxbm+vMS+uKB3a29xa4CVuIdzfn+ZyszLzcrGwsTLzcW/ub25ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8tsGKrdjEvrbAvp19ZFpnUk5YXHZ8dH6Cn8PGy8jBw8HAycrIwbu7sLO9vcDFxsXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3hzZ3BdW15dWVJGRENNSUFFPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2usC3ZW6mycC2t4ZiYGZUZF1OTlFUaHR7iKS+v8bAucC8vsXEwLW6srCtv7m/w8fDw729v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f312bHV7cG5pW19gWVNQQUZIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLjLtW1nb5i1uIRZTkZmTE90amBPTVh0eo6suLfCurO7t7u9wbWeva6wsLazucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3V2d25xYF9mXVtUSj0/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa4zbZ5dWVznKJeTkdVekxIZn6Ug1tDdYmZq7G3vrmytbK8ub+qiLyzs7efqLi9w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVteT0hCPz1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmztsezgHlxbIt2UUVHdH9NTk9fioFwRlJ+prSwtrq1tLKsvLm+n3e5vLm3dpS9vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTkE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7e9uY2Cenp5ZEtHe3xhTUlRZaelYU5KcK67sLO1srSvrLu4wYxvrcW4rVx2uba8vLi2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c210aWxdW2pUXVxQTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7+dh4eLiFpEdpdyW1pJXmBSkXFubaDBuLO0srCxrbC5uL9yZ6DCsrCnpbGuua6qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+2qZaPk6hPSn2zbGpxXWtedXFjY26HsbmxrbOvrqyttre0XYOlq6SenZ2cnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj4+Qk5CXlZaYn56empiml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXFFoVFBOR1BNTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqbOzoq2VTFRypnN0fYxzTm5tZXBwbpOotqqytK6qq6+wsKGxpp2RmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mao5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFVRY01KSEdPUk1KTkc8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqKCtwb+oV1p4dW5xWl9kYlxZW2lsYmZzg7KvrrO1qqasq6OemZSNkZaXmZmcoKKinJ2lnpukl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJSVWBISUpLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWdnr+3eGNyfGZnZVdaWlFKR0tPUExVYl+bsrCwuKymoZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKqyrqKZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKTk9VTFNMQTc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6pp52HYVhmaFxOSkZEPkBCRUJDTFZPfbGtrK+nn56ioJaQk5ugm5mXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFJVSEZVVkpCTEc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCef2NlZlhKQklPZlJLQUM+QEZJSF+jqqqppJ+fmZKRk5iYlpaVjIiLjpWdnZ2dnpeemaafoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+np6Wkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOgi3drX1JLQ0RWf4t/aEY9Ojo5OFGFqq2pqqWfnp+io52enZqcm5STlZSenpiUhp2aoZqrpKyysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqzta+zrqqvo52rp7axraKvpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3RycWhWXFFGVEhESlBJP0VBNEZHOTU7Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn3VpXlRKRkRGZ7PEwY1dUElCT3uqsqejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeG2IoKSiq6uzvLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMnJw8HGvrq0urq1u7ewtbKqurKuu7e/u7qqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFNNREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdnJdqV05LSUhIU33Ry7STnI6Clq+toZmbm56emZeXl5KMjpaXk46NkIuCg4J3c3FucY6lrLC5vcW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczR0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfFx8XBvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8w8LCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREVQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6TXE1DRklJWWaSuqyNg7S5sayjnpyfmpeWlJKUlpGQj4yHg4OIh4OAgYGAeXJycGx4psHKysXKwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LV1tPUyMzGzM3J0s3O083FyMnKwcbLx8nJxr/Ds7PIxMvLy8/Gyr++v73Bx8TMzMjJwMO/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnl5IPkRFV2aGrJ+eoa2ro5ycnKCkoZ2alJOVlIl9d3BrZWJocW9xe4WKgHZwbnFzb4jDz83I0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLV1tnV19PX2M7Sys/RzM/QzNPQv8jHysTMzMzOz8XGx7a/yr/SzcvPxsnIv8TDx87N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTQ1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoalwR0VFSGKEvMSqq6qblJefnJqgoJ6bnJmViXdpY2BfX2BfXl9fXWJsdXNxcG9scnF1j73JxdTW19fX09bP1dTa1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0cvO0MDGw8jGzs3R0dHIzM3AyszG087MzsjEysfHyMzK1NTR1c/SzNPBucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaOvgmJranqcwr+uqJ+XlZeZmpyfnZicnJJ9cGVjYl9fYV9eYWBfYGBfYGZtcHBua29yd3eZyr/S1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY19fLyM7Eyc/NyszAycDIys3O0MvQzc7Mzs/Iy9DQy87KwsnHyczKy9LTzdPR0dDQyr3IubCuu7i1qrawrai4rbO+u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramnlnuIjKnNzrGbmpWUlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHV2eaS9y9XQ1dPT2NbOztTLzc7FzsrS0s/Hzs3N1MvO083L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXMwsjJw8zDxcjKys/KzczQzdPLxsjPzcjHy8XGwcbKzM3Q0cbQzs3NzM/Fx8G4ub3Dw73DuLKyvrG7w8O1qpilopmWkZWVkouUjZqRlJSPj5SCiYZ5cXJrbWdgYHBoWFhoVkxGTElQUUI7Qz47Njc6ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKigrnhlg4O6zqqUjYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYGBfYGFhYF9dW11ncnFxcnNxbnJ5o8XSzsvQz9PUysXJycbGv8PGz87HxcfNytLIy87OxtHS0M3M1MrHy87PyMfP0svRz8a6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL/Bx8zMzM/CysvIx8vQxMXHu8fDyMnCz8C9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7utpLBmZnyM0auQjo2Wj4aDg4OBfYSEfnNgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3230MfJys7LzcS6wMO7u7q6vsnGwsPAw8jLycjKyMHFzMbIy83JxMLKycHCzNDFy8i/ucG7xsi+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xry8wMPFzMXFvMDKwsXH0sXAyb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3dydGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0Pz0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srKkXWpzpriOipKXhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lrcG9yj8W8ycTLv8bBsLa6srKzsrHCvLy8urjBwcHFvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7u8bDv7zBzcPGvr61wb3Dur3Gu8K6s7zFxMLCtr+1tb6/u8zDvLW6yLq/vsvEwcbCxcnGycbQxsLMx7LHycPOzcDFw8C9s7ewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys/FycXHwLnFvauvkl1udqiSi4iLhXiAhoZ/foR7dHRjXFxdXmBgYmNiYmVlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnicvMu/wrrAt66wsaeqraynuLW3tLOztLu1vrK3sLWvsrzCvMHEvMC7tbK6vsC4x7m0u7bBwry4vcbBw7u1r7K2ur+0xLe7tKu4vb3AvbG6trC2urPFvLauu7+1t7TFvL7DxcDDxcbIy8XAxsa7x8u/z8nHw8bCw7fDvb22ub7Hv6y1urW3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcXAvrm3ybaqsIhecYGXjYWIiXt4foaGdneBfHNoXV1dXV9gX2BkYV9jZWNfX1xbXlxdXlpcW11fa3BuaWZqbW5ye6TGvri3tK+rrKeeoqqnnquts62qrKm0rrexsqmupqyzvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLCnsrO1u7yrrrWmrravu7Kwqrmwrbuuu7i7wMC+ucK/x8PFwLzGwcfKuMXHxb/HxMO6xMbCu8bJzMuzucK9u7OJc3Z2a2lgYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXQx83Bw8a/xMTDw8rBycq+v7zAurK0tMOuqbCMaGyEkoeOj3t4foqFenuEgHduXl1cXF1fYF9fZGNiY2NiYF9dWltaWl1aWlpaXGRub2hnaGlrbnGBrLivtK2lpKenmqCloZqcpauupKiirKqtqrCkpp+qrbW2sb25r7evqa64tLS8uLS8r7i5tbK7wbLArqWpo6uxsrOovaqrqKutrbSzpqiuoaSvqbKmp6iupqi3rLGyt7q6vLG8vb6+xL+1wsHHyLe/wMW3xMO/u7/Ewr7EyMzKv77EwMCph3N0cmppXGFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HKvrvJtr3DvrrJt8HDwbS1u7WwrrS7raepjWlghoSHi4B7fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZWdlaGpvcoWppKqlnpuhpZSepJuYkaGjqqOjoKalqKWtoJ2cpKassrC2t6ewrKiqtKu0urG2tq62ubKvurqxtqSgpKCmsaerqLmqpKenqKeyraCnpp+bpKasnp+no6Chsa2trLK0s7Swtby2u8HBsrq+w8GyubnDs8G9v7W4vL2+vMLHxMLDvsDEoIN4cWxhZl9rb2BUWV5ITmdPVEdFS0Y8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8jLwsa4tsfAzL+4ybe7xbizxLizvsCrtbuxq6SusqygoY1kb4eFhoB8eXVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1vh5yon5WVmqGWnKKZlo2foaOnnKCgpKaip56bopufq7CtsbajqaqqrKyktLmtt7Css7WusrWusKqfnp+korKkpqm4raKmpqCorKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2vLy6q7OzubO+tLaysba1v7a9wL3Dwbu7vZeEenNsX2VeZGRYVFddSVdcS1BHSUpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4t763ssG0sbu7q7i5sKGeqKqml56QZn6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3GMp5yTlJSbmJuil5aRnKKiqZ6cnaWmoqWcoKCbma6urq6yoKairqunorWxsrKsqK+yp7qzprWgop+co6Gto6Kqtaqio6aepaajlpmel5mbnaCal52dnZytoqunpKSmrauztKq1sLOrsrm0r6qvsrKzuLOuqayusrixura6vb+3s7GUhXl1Zl5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLMyMa/xbbBwMbOt8DEvbO5ubK/trG4uqyxtK2emaOon5Kah25/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGbk5SPlZeXoJeZlZegnqGdlqGhqaSfnqidnJqrp6+wq5ujpLiqoaCuqLaqpqetsKS4sKS3oKKcmZmqpqGarLivoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK6otKuqp62zsKWrrrOxsK+ur6anp7KtsbSwvLS5t66jlIF5dWReYVZZV1NSVEtNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2nqKOqu8C9wLmutLjBzMfFwsO9xbjIy7LBwsGtvLu0u7y0uLmvrq+om5igp5OQioB8gHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmmBlpOVi5KUlJyZnZaWnKCcn5ahoKampKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsa6stZ6gnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJKXl5iXnqecp6GimaOlpaukpbCnpaOrq62mqa6vrquoqqmzpaasr7Sxr7y1sa+voJJ6d3JlYVxaXVhOTFJHUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaett7u8wcW6sbm1xMnJwMPGxce2xcSywr/Fqre3vba9urq1squsppiXnqGLiHOFh352bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVNUUlVgYF9gYV9hYWJkaoCTk4mQj5STlJ2VlpekmaCXnaGloa2mpKSjo6Kcqqulmp+lsaqgoZ2lq56ooZ6trKmprq2ioaKVmKObnJCrqbCcoKKfnpeZk4qekY2Sk5aQmJiTnKGjnaSgopWgoqSmm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5uq+prJ6McnFvYFtXVlVSR1FPSFlbT1JJVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kvq7Gtnainr7m5s8DIurXAr8XIzLrByszItcm8sb7DyKyxuMG1u8C7tLOpqqSUmZqbh39xiIN7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eXl9fYmRtjo+EkYePkY+ak5WTnJujnJuhqamrqKynqKakmaSvpZWZpa+qn5yZm6Cer5qcq7OgpaafoqOhlJOblpaSqamsmpyfoaCalJCMmY6MkIyRjZaVkJ2hoKOdm6OVm6CjoZeiqKOiqKugq7Ckrbelo6Sira2qqKuvs7ezvrWyq6+YhXRzaFtYWVNVUkVYTFFbWE1UTlBMUFFJTklCPD8/QT89NzU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqu8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9urK0paiflZaXlYZ5dIB2d25taG1tbXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXVxcXl9gZH6MgYt/jJGKko2XkZeZoqCboKuqpq6sqLCkqZqfraCVlqSop52XkI+anq6XmKiqmZ+dlKWgnpKQkpGTlaeqpZqZmZ6elY2Mi5OGiY2Dj4uSlZGgnqGjmJWflZqhop6Um6Wlp6iooLGxprG8p5+jrLWrrqewtbC4tcCxrbGrkX5yc2JWVFVOUkpHVlBSUUxMV01KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OspbG3qqWisaudqqepsrGktsa0ubqzysW5usHL0Mqxtri7vcHDsa+xt620s7qysqGim5yWlpOCfnZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domOh5CKl4mUlJibmZ6pm6CqpqWsnaiaoKack4+fo5uXl4WEkpujkJWjnZaWloiim5uUi46KkJqkp5yVlZebkZGHlI6LgYuNgJCKkpKSoJqgopaUmJmVoqaZjZmkpqimoaC0sqeyt6Gcoresqq2ksrKmtby1rKuxo4l5c21dTlFRTE9DTU5OUEtGTk5KSk5NUUhNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKSnpKqloKilpbOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq25rqyemJmclJKGeoJtX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOipJmll6KclY2HmJqMc42Dfo2XloaRmpCUjo57mY+cjIKJf4mYn6OekJOYloWNg5R+fnSKjnqQh5OQkJ2ampqRlZCdjqKjjomaoKGjpJuitK+sr62fmKW4pqaxobCunLC7qqmvqpmDd3NjVk1ST1BOQ1NOTFFMQlBRSElOUk1ISkpESkxGS0o9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGrrcOtp6Kmkp2mtauino6UlZGOfXZ9ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11pbHJtf4V8dE5YcpCDl4eOnZeLlJGfmJ2VlJaVj5aJgJOJXztWb3yLlImAjJKMkIaGc4qFloF5gXuGk52Tg5WOkZCDhn2TeHFwhY19iYGRjY+XmpmTi4+JnIifmIiHlp6aoaCXp66pramonpats6KmrZmsq5ios6KpraOTfnJuYFtOU1JXTERUSlBMTEZOT0lFTFFNS09KSU1QRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKeoqKOqsKintMG5sLWwx8K3s73Pv7mvrrXCp6rFqaKdmIOUm6+hmJaFk46KhnxydV1RTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFFCQH+VkpJ9iZWNhIqNm46WlYmSiIaVhnmJf2BKUW54ipGEfYSNioV/f25+f5R3dXZ4hI2Zb1GNiIqGe354lHZnd4aIfYqJlYuNkZKXjISKiJWEmoyChJKalp6dlKSjqKmlpJ6asKuhpKSRpqqWoqqcoqaoiXVtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FRT0ZJQz03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+hr6GnqKWnqK+tqrW8tre3s8G7tqe5yLi2qKi1tqqyvKadlo5/iZOolZSJfY2DgXx3cG5YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXFWPiZSJdH+HgXyFjJOCkpqLj3uGj4B2gHhzbnVwdI2NgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gHZycpJ3aHWEhISFe5WKiIqNi4B/hIuMgJSDfICPmJSclpGenamen6CdoKmln52YjKekk6Gglp6epIByaGFcXUpWT1JHSlhST0pMTVJKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlrKuwsaq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGNlICNm42QfnaFd3t1bm5oWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfHhmd42XmI2PfWh5gXZ4gImPfYSYkoFxh498d3tva36tfHOQin97hpKBfX90ZnZ8hmxvaHN9iYyIgGx5cX1xbXaPcWhxgX6OcEOLhIKDhX93d3qLhX2Me3V9jpKPmIqSmpujlpmdmp2eoZyWjYqkm46el46WmI93b21lYlpYWFVRSlNVVE9QTlBWS05LTk9KUU5IT09MRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mOhJJ5iI2KiXVwe210cGlsaVdLRkdFQUBDRElMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnt9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCSlZeZl52WjIOJnpGLko2GkJZ/bmlub25YVVhUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCjrKqota+urLS/q7zCv6aimZWkl56NhIuUoaGYmJGTi3OOen+Fi4V0bnRrcGxka2pYTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyakXRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxf3xocXF8bpONj3xzfXxxcG51bYJ/d3l1anmJgoiJhJaSkpCLjZGUlI6XjYB5iJeIhoqGgJCIdmpqb2hlWFFZV1lZW01QVVZZWE5JSEVKSkhHQkBGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfp7uvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4Jzh4yFem9ycG5vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgYWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiYBnZmJqbnJscIN1aW9YdXCOm5J3bH97fW1xbXCAenN1bmJ2g36GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2PenFwb2tgW1xeXFlYYF9STltaWFdMSEpGSkc+QkFCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ2kp56vlaW1qq6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+FdYKDbJWIh3t0eHhsd253Y2leSVBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgISZhJucYYaqn52Lg5CNeneIfomIjXOKl5CDel1kcXR6e3eKbWhqYnlvhZCCem6Bd3SEenB0eXdrbmldd4d8h3yHh49/i5KXg42FjIZ9cYR/g311d3t8iXZwc3RlZ19bW11UXGdeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnJ2fppGgq6CxqK/AsbrFupaOkZOHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fIF+cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkqiHgJiYipx0bXyBhod9jmhnaHh+boWHgoVxhIVHbIB3cnl2aG1rX3d9g4h/iIWLepWdm4mLiJF/enWLdnx4bW93fX9zc3JsW11dW2NjWGdmXFVPUFZZUERMS0ZOSUNGQ0NBQENBPTk3Nzo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiJGBmpWCoaGYlZuapa2Tmbuxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYqQiJBpaG+DgHSMh4SLcYWCd4d/e3aFfW52dWaAlI+GiYmHiIehqqKWiY6Yf3qCiXp5b2dreH56fnJqZF5aWl1qXWFmYFlPS05XUlFIUEpETkdDSkRCQEREQTw5ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRjoqam6Sdoaymq6+wl5GRg6GUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc4Oz0/QkRISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2aj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPoZ+TmJKEi4WPmZGWbHB1iYuCloyNj3ePhHFshIGKlpGDhYhyiKGWh5OJjo+WpbWpm42VooOHk4N9f2tqa3yAgYFzYV1jXlpma1xsa15XS0dPU1FOTUxGSVBDRE1GQUNFRkI+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+l5aalZ6enKegqZaTmJ5nZaSafoSSkXmAkoiQkn2KhJiSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0VOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZyopaKZoZeilZ2fqJ6oq6CorKmqtZervqu2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlaKamnh6fpSYkqGSlpiBlJ57dpWSq7KIjZeffZSdnI6Tlpmkoqa2sJ2RmaiIlo+NgYhsc3J8f3xxaGBcYF5iZ2NgaGdbUkVKS1BPSUpMRkZNQ0hMRkZDQkdEQDo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWDhomBgIZ3X2JQNDYwLTEvLC4wMC8vLi4wMDE1PkFBTVFSU1BSU1VSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYaQd5WLo6eqtL24pK6srKeotKuwtrKyrbuxs76cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKKXgaaZjaKqqKSIhZSkoaCqoaSpj5yxi5Wjp7e7m6CjsJOinaOekaSiq6+ts7WilKSqiJmJkoqVeXp+hX5nYGhcZWJdZGNfZmZfWk9DSUhUT0ZITEZKR0VGSEFLRkNGRkE6ODY9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GPg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS4tMz9EQU1VUVJTVVVXVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqscHHw6qzxbass7+zuL62v7TBtru7o7fFqLbJx7W+ubSoo7StsbGbmZKan4mnr6ullHafpJehq7GzmJaqraiutruyuqyvtaKxq7G1u7e0rrWgp6ejqJqpsK2yuri4p5u2qYyljpGTn4Z4goN1WWFkVmVhYWNgYWZfW1RKREVMVVFISUpESUdFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFjZFd5dXGBlH2Eh5N2hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjYeEgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6Ppa2jsbTDtrjBzMm2u8S9s7PAt7fBtb+wt3Sxs6a6xaSvxrmxs7G0qKS1tqqxoKGWm6KSpbCupq2rp6SYoKyzuqKpsrq0u77Mv8XFvb2zwre6uL63ure5rKywprGqrb6wvbvCwqyZuqiUro+Xl6uJfYJ8aldiYVhqZWplV1tkWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVVadmpwf4+EgY6EbnpzeYdiuKGZo4mVk5aTk5ONkJaSh4Z7hoGNloqBhICKenyLh4Z8ioOBioOVfXh6dWVPXGRHRUw6UWNhW15TRj87SFBEWmNRUVlYWWdZVGBgTVNPRUE/SUpIRUZBQEM8RTZCPkhHSkxTWlRdk6+4tbq5yb+6vcnMu7zAvLe1u7u3vbS6scZgdbKlsZqeqr2qpairqqOisrWhq6ielZafmJ+upaempZ+jlKKmsbSnsrK9tsG908nK08bCxcvBysPAvr2/u7y3tLC5t7bDusW9w8iwnrmqoquOpai2iYB/cV9iYl1XYV9oZlJYYVZSVklFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdsbHGQjYWQc2xycnOI1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKf4N/gnh6i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV9uX1hnZVVZVEpEQUtLSEZJSEhHQkk5RD9IS1RUVlxaW5K5wLm9t8bAurjKy7q3uba4ubK3tbSutraYZHWonK1wXqGtnJigopuknqullKCfkJSOlpiXqJ+ln56amoSknaylqrCst7C9udTRz9fPyczRzM/OysbAv8LKvcG8wcDExMXKv8jOtKS7sLSvm6u5vJp/eWxdX1xYXWBZY2NRXGBTUEtDQUVGRDxART5CSEJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KQlG9sb3V1iLOsoaGfi5mcmYyNlZGbkoWKin6Ih4yQi4l8gYNze4qDhXuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJetpLyIh2dbb2hdWllUSEtOT0pLUUtUUUhMQUpHS1BfXmJmaWGXt8ewubO7vrWxxMe1r7mwsLursrGnqresjbannZunmk+anYyOoJaRppillYqTk4mQiY+RkZ6boZealZaHnpqmm6yvqK+ns7TU1NTW0svP1NXO08/NxcLJ0L/KycrJ0sfMzcLQ0riww7zEuaW2usSigm5jXFxdWGBXWGZaUV1XT09CQkhFQkk7QUQ+QUc/P0I3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmIJocW95eYOgqp6ml42bm5eLjpWRmo59iYuFjoqKi5CHfISCcH+HgYZ7h3KDkouPfnF4dWtxeH5xe214c2xpgXBtY2lucHhpd3x+y7/C36dtY3huY1thYEpQUlVOWV5QXl1NUE5UUVVUXG5udoJyl624rLSnsLarrLzAsau1pqW4p6yuoau0o46xrpqYmIyRk5GEjpuBjaaRnImDi4SKiYSLg5OVmJeTm5GcmJmZnp6rrKSnoaytz9LV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbFwM7Hx8OovrfQnnpuZV1iXFZgUl1bT1BUUE5IPkFGQUJFPEBCPkVEPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bHdwfX5/oZ6eoYuNmZOTjIyTj5aFeYWPkI2LioiRh3+Ce3J+f4GHeYR1hZORiX9vdnJrc3x8dnxzgXdxa4BzcmhvcXp5cnu+y5p+jLKDdnKEdmhhal1DWlpbV2VkWGVrU1hdXGBjXWN4e36LgZmqpKShoKGopqqwuKqltKOhraKjraKnsZ+JppqUkpGJkY6IgZSJapWijZmEgIV9kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMjNz8jCy9HU0dTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMTDy4tzb2JgX1hUWVJcUEpHSUlKQDs6O0VBRDxCRD5IQj9CQzs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3iElJmKjYiIi4l+g3hze32Dh3d/eoeRloCDbnhwbXV/dnh9c4V8eW2HdnRufXaEdXl7nbWMPEGLxqV+jXxpZVZJQ2ZjZWNoamRveFtfZmhrbmlugIOJkYudnqCdkJeYn6OkprKkpLOgoaWeoamgo7Gchp6SkpKQi46LhoOQhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipqRqrOYmpunnKe9w8a4tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1b/LzLR4dm5kXVlSVVBaVkZHSkpFRT06NzlAQUI6SERARUNBQ0I7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqCh3x4hZaXiI+Dh4WHeoR5cXp7hIZ1eoWOjZ16jHB8b296f3F7gXGDh4Fujnp0d3x8gnV/fIeIsHRYqcK2jJKCcG5iPV5ocnBxcG54d4FlaW9ydXhye4uHjpOSm5WglYeMk5ugm5+qn6CtnKKamZ+lnp+smYuajJGRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI2Ui4Z7m4iTj66qlJWXnpimrrW9qa29xsvIycvLz8jD0crU1tnX2NfU29fT2dvWz9va0dbJ1MuVeXtoaFtZUFJTXkhDRUlJPkE+PTc6PT87Pkg9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoKEfoR8fISXjoeLfoaGgHeCeW57e4eBdHmSno2gdo91gnR1gX10gIRvgY+Cb5KEdHyBhXp2hnyJt8alwsm3gZabj3dwZU5mY4F6gXeGopCLeHl3e4N/fIR2bZOWlJWPmJCDio+WmpeXppyXoJefk5KXo52Zq5aRkIqNkYKMhYmIgYWQkZ6cmYmFi4GGl3qIiJ+Xj4iNiouCfKGJkIu8oZeTl5mcp6Wlrp6otb7AwLnHyc3Oxc3K0dbW1dnV19vU19na29fb2tnYztzGhnp5Z2hlYFRXVlVNS0ROQzs8PTw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eot8foB/gH2Fe36BkYmEhXqEiHt1fXRufH2GfnR+kp6Rn4OSfIZ+eI59eYqKboKagHSYhX6BiYV8fpB6j6mPkMKgvIyco5x9iYR9iXOMin5zppqcmJSFe4+QiYRoR3CgpJ2Mi5CShYmLkJKVj52ak5WRl42MlZ+dlKGUko6NkIt+kI6Oi4SIkpaan5+JjJSSnpGCi3+lmYiEjoKGhIClhoqLuJidkZWWoaagnZ6do662urWrv8bK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h4d2tpZFdgW1RQT0hETUI9PT45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmAjopxcnmKe3p/fX98iHp8e4uHgn50g4Z5c3pzbYF+hX13hZuhm56UkoCLiH+Yh4Cckm6HqIV6oIt8kI6DiIScfpqRio2jop+QpK6gi5GLhYuBkoZXcq2Ln6ubj4OYm5CQjlyCopGCjJ+TlYyHiIySk4yUlJSPjI+KiJabnY+VlpGLkpSFgIuIko2Jip2WmaOjhpKdlqGKioiOnJCDiI+Ag4eFpIaMkLOYnJKUl6GgnpmSnJ2nsbispbzCx83Hxs/Mz8zO18/R1K7W1dja2Nra19bZ2p9vfHRnZ1xdWFNXWENASUQ+Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTlHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDbm13i3h5fnqBfIZ8e3eGhH9zcIWCenV2dnSEgoR9f5Kmo5+lopaJnY+Ul4uKqJdyirKMhKeRhJmThJmLopagmJOJm52hkqmvn5GVkI2NiJWLbo23hZrEyLKcoaWbnJiWkbKRZKTNx5aPhYeJkJKNjZOUioWKioaWmpuPkJSThpWXhH+Pi5mIjZCql5eko4iZnpabiI+Hl5eKhI+MgX+Hj6WJjZOomZaTlpmhmJ+Zk5yborO0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oY19dXk5KVFpCQUdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj46RU1GSFJXU1JCY4FGdYGOfXxtfoh4en56gYGDfnZ2gIN8bG6Lf3l8eHh8hIeKfYqjs6ejqrOhlqefpaSWla6ig5C4lZKzmYyhoIykm6+jpJ2YkKeWp5mtr6SXlZaUkIuYmZagwI6kybirm6KmrZiRm52ynYaFqKKcmIWIiY6VjYuTj4iBhoeIkpiUjIuTk4aUmIaEkZCcdJGZs5aXpaGInJmTj4qQipeaiYqWjoZ9jJieiZCQnJqZk5iYn5SgnZWem6GxrqKkt760xcfEvcPDv8bNysnSp87N09LQ1tjT0Ni7cnl2XGBVX1dQSElORUJDRTU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1NjY9OkpGREdOW1xZSWZgO0iEi3p7boWGenyEeICFgX5weHx9fW9zjXp9gXt4houJhoOSp7usqLK9r6Wts7Ooo6KwrIqZtZ2juKSVraSWqa23pqSin5mpmKmjr7CpmpmclJWRl5+Xmbu7rcmhaba4q7CUmJ6jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHkpeMkJWNi4yXmJKdmbSXlqudi5uUko2QkoyZm4qSnpCLiZWgoY2UjZianZObmJ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8jC0aHGyc3NxNfW0cvToXB6aF1ZU15ST0ZEPjxDQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBicElAi4p+gXOGh32BiHWCioN/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7aMp7Kurryqm7ukqK25uKumpqKho6Oor7KxqpycpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIecrL2wg4yMi5CDj4ORj3qBh5CMjpyIh4+XjYuVl5SQmpadp5qxmpGsnI6aj5KOlJCQlpeOkaCRiZWbo6yUlo+UnJ6UoJ2bmKChlJqep6akoqSwsqbBx8OvsLq2xcTCvs2nx8PHw7zV0c3Eyoh0c2JcWV9bTUpCTEBFRz9BP0I7OjQ+QTw9NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uGg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlaezxsm/wszBw7nHvLqvq7m7l7K2urLArqXApKuvu7yqrauiop2nqq60sKqbn6qboZuVn7C0p4uiurq1wburqZyypaSolIWOqsPEpIKLj4eIhIaVlI16g4yRjpGhjIyUko6Il5+Xk5mVmKagr52MqpyNlY+SkZSVjZCVkY+hlIaXn6CynpSalKChmaSfmqCcoJSYnqakpqakr62lwMTCrai3tcnDvrbOssS+xLyz0crIwrV0eW1cWFxpU0xIRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk1lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoKQeY2hlqiampi6vcjIysHSycrCzLzBs627vqe5v728xLeswamssru9qrCpo6WjrK2zrba1oJ+unqWimKO0vKmbqLzBo7a2r6uSsK2rrJeGmqqmpZGCjJOllYmAdYqSeoWNkZCen5OPlIuPjZSjmZeclZSjn6qfkaWajI+PkJWWiHyPlZKSo5uVoKKctaaQnpelpKOlnp6mmJ6Vl5ulo6inorKsqLzAxK+ls7fMwLmuxLO7vsG4rMLDwsCYbXlhWFdcW0tLTUpGRERJQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djZeOnpKJin+Jn5OEd4V/lX9/kIiKkH+VoZqupqOYwr7Iw8fF083Ozcu7wbevuby0vMu8w8G1tryts7+5vK6vqKCop7atramxt5qeraKnoZ2rt7eppa++w7G9ubOnqrWzra6WlqWsqKCRjpKxxaeVjn2RlX2IkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQlpeSlqWZZZijnrKllqKWrKyrp5ueppeYl5iVoaSopp+2q6m6vMO0prO1y8G4qbassrq4rqi3ur24g2xuWldUVU5GSlNOSz9BR0RESEZHOTVGTTs+Nz5BSi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZCDh6aTiIGHgpyEg5WQkJSOmqKfr76uoca8xcTGxs7OztLKvru1sbq7vL7PtsS9t7m3srG1s7izrKacq6u4qqinr7CXo6+kp6SktMCwqqy0vsK5wLmzp7m1uLKulaWtr66li5OVoY10wZp+l5mFj5aajLGVmpmVk5OZmaWjlZ+blpqpnZyhoJqLjY+WnWBKlpyalZqlllSWsJ+vnJ+llK+urKaaoKWUk5mZjpyfp6KZtKmqs7y8u6qwssfAuKWrq62xsaOhsbK0pHFuZlxaTlBLRFBQUFE7R0pJR0hCRD45S1U/QTo9RU0wNzU0NDpCMzROV088SktPVU5RSk9ISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkiql5mgoqivmZGXh4unlo6IkoWfh4Sdl4+eoJqjpLXItKnGusPDx8rIyMzNxr66s665uMHBzLbIusG4tbqxr66ytKejm6qztKqopq2smaSupaSorLq/qKu2t7/Bv764srLDsbm9rKOutay6poicmKabdr+ghZmdjpOZmouvl6Gcm5eVm5+hqZ6ooJqaqpqip56YkI2RnYNudpKimpWdop6QrbKjq5WoqpeqrqWkn6Wpk5KZnIiUnKKelrGmqau6tr6zsq6+ubago6eopaecm6ypqYxjZWFfUktNR0hOSVVMPUxETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5ScoZ+7r5mUn4uTqpuRkpOJq42Hop+MpK2Uo6O2xr20wLrCwsfIxcLNyMK9ubKvubTAwsq1xrHBvLS6q6itrLCjopmqtLqmqaarqp2or6ejqqq+u6esvLO3vca8t7W4wLG9wLOptberv6WPo5eRoqC8n4maoJmXnp6Pt5+pnKWjm5yhmqils6GbnaacqKqemZWPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6yenqOjqZGVlaCDkJ6enJWppKKhtLS6ta2otbKznpyipZqXlZmqoZ53YFxfXUpIRkdNUUlNRUZGQlJMSkFFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRKeXpJ+ew6ybl6SXmamclpqaj6qVlaimla2tmaGrtsTCu762wcLAx8S+zce7vbmyr7izv8PItb+vvLa5t6ajqqytoKCaqqrEoaSoq6aeq6+soqmov7emrb2wt7bHtrW5uL+xv8G2tLO0r76jl6OWlJyUrqCRoaKlo6OfkL6lqZ2orJ2doZumn72imKOfoqmroZ2WjZWek56Hj4WNk56koJ21rKaclbKnma+on5qpnqCNmZWfhI6hmpuTpaSamKyxtrGqpaqtrJyYoKCSjpCWqJ6UaGJZYV1OSUdKTktIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGViVkyimqOcnsWsoZ+snZ2uoJOjn5aloKapq5e2saOqsrXEw72/tb/Cu8jCvsrItri1tLCzs7fBxra9sLi0ubWfpqyqq52dnqWjwaWgqa2fpKmtr6Kmp721prG8t7a1w7Kzt7m+ssPAt7ius7W1o52klZKUoa6gmaKdqairo5rDramerK2bm56ZpqC9op2lmKurrKahmY2Zn5KeiY5Xf5aepaGguKqnk5i2o5+yoaCbrpaejpmUnYKOn5eVjqKklZCmrbKrqaGipaWVlZyYi4+Rk6SeiWFkWmNgTEhKSk5GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dySEU2PXVlXEtNnp+hmJ7Dp6Wis6GcsqeTqqSgpJ+sqaydu7CorLWxx8TBwrPCw7zGw7zEyr2vsbatsLSvv8S1ubCwubWsmqiwqamanaWhp8Ksm6yxm6qirrCppKe9tqa3uryutsOts7PCv7LGs7q3rLS2raqippaVlaSsop+fmqirsK+vvLKmoKmpmZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqKfp7Smp42YtJyjr5qem66QnpOXlJqAkqGVj46foZOLpqywpaahnKCekpKak4WLkY2cnn9hZVtnZUpJTEpSQUNASUc7O0c/OTlOTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+jn5ugw6ikqrKho7SplbKsp6KksquuqbuyrLC1tMa/xMO1wMS9ycS1wMjCtau1qLC4rMDEtLeurLa5pZmrsauqmJ+ml627tJuosJutn660saequrKnurO3srjAqreywry0xae+rq23taqorKGXl5KmpaKjmJilr7iusrW2oJ+opJmVlZOkoLeipaaWrrKypqqmoZ6bmpqWmKifoJihnq+yoqaNl66ZpauXmp2kkZuOk5eZhZaflIyQnJ6Ui6mpqqKnoJieloyOmZCBhZWJlJ94Y2hda2pNUE1OVD1DQU5DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGhWQ1dGjHlmQzuko5yhpr+mqK+woam1qp25sKujqrS2sbC5t6+2uLjEvcPHvbzDwcbAuMHGwbqqtqStu63Awre3qqyxu6KVrbCtspalp5Cquamgp7CdqqCwtLKqqba1rLyssrK5t6y5sMK6vb6mw6uwt6+pq6unnpiZq6KioJGYobGvs6uxupucqaCZlpKXpqG3qaWjoq+xtKuyqKufm6Cgm56lnKKWnaOzsJqfkJOlmqCompWhnpWYiZSYk5aXnJOIkJuZlI6pqKefo5uXm5OHjpmLfYuWhY+bamhsYWxuV1BRWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aY15OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oaqwq6OxuKmltbOsoKy0va6zuLy6vba2wMK/yMS5xMHAwLjEvcG3r7Woq7eyvL6/tKmusbael6utqK2Wp6iOp7ufpK2znquisbCzrKm2tLW9ra+xtaywtbHAusS3q7yvsbisraqjsaaepaqgpJeQmZ+zqrOqq7OanaebmpWNoKaktK6noq2trrGns62yqqScn6iknpWhmJuotamXmZKSn5meoJ6Qq56Xl4WVmIudmZyTio2Wl5qXpqWioJ2VlZeTgI+UhXqOkoOMlmVscmdwcV9GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTT1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSaoKSst6OsqaWurrapr7S6p6awt8W3sba+wMG1tLrFvszFucK/ur+5xLjBubK1rKq6tru5vrSqrbC1mJinq6qrm6yrjqu9nquusaOroLGts66utrG5t6mtrrGota+zu7zJsqq1tLG1sK+nobOgmqitoKWVlpuasqOtoKavlqGkmpqSjaKlp7KpoqeyrKq2pa+xta+kmZ2tp5qYn5mZrLiil5OQj5icoZiXlKuenJOAk5iNnZyalpGKlJOemqWhoaCYlZGTlXqLkIV7jIqDi5JrbnhtdXtgRWFqWUlIWVs9e0pHRTZBYlRpW01cYEpbXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENeUVwuKkIvSkdQW0gzY1lUSkSZlqCwqLGpraWkrq61qLe0uKSrtLfJu7S6ur++tLS3w8DMyLvDvLa+vsC4v7yxva6nurm3tsG2q62xuJSXpq6rp6KxqpSvu6SssrKnqKOys7CxsbWxuLOorquxp7ivtbTDxbaptLWssa6qp6O2n5+nsqCklJyalbKep5ygqo2po56blpilpaW3p6KytKynsaeusLWspZmgrKibnJ2blKm4nJSOjouZnKKXkJiloJ6Vg5GVkJ2cmJaViJeQl5unnKOgkpWQkJZ2hJCHe4WBhI2LbXF3dXt+XEtlbFxLTmNcP2J7R0k4R2dXZVtNXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydGYUxWJS1CLj1FTVE8M3JqSkNDkJmlrqWtrqunpLCys6q3sLagq7W5ybmuwbzCt7OxtcLDzsW/wb20vb+/ur+8s8Soqbmwtra/vK+rs7KcoKewraWlsKWesrWsq7KwrKmotLmstLK1rLStqayoq6m5rbGxx7+4pLmwqa2tpqitsKakpK6jqZyenJuvmqKjo6OQrJ6koJ+iqqWmuaWstbWlqquorK+2rqOeo6iqm6CampKktJqOiY2HkaKglY2UnZ+TkoSOkpKdm5iVlIeYk5WZppufn4ySkI2Qd36OhXx8fYeKiXF0cn59fVxTZG9eTlpmXUZEllpHO05tWGFbTWBiTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGRISis6ST8zQklTLD6PazxHSI+bqqqiqbCkqKSztLG0tbGxoautvcu6rsC7x7G0rbTCwtHFxb7Asr7Bwry/t7zEp6y3rLO4u8Cwq7KtoKSnramopLCjqrGqr6ywrq+urLO7p7awsqmyqaulpaOtuqyqscK5tau5qKioraqosaWqpKKuqqiinpyjrJWknZiemaydoqepoqylo62suLGyoKmioKuusKyen6eoqZmkmJmPoKeYhoOPioufoI+LjJabjo6Fh5CVoJ2Wl5WGlpOTl6ScnZyKkY+NiX9+iIZ8d3+HhYZ0c3GIdWxfWWBuY1FzcVxLO4R8Rj5XdVhhWU5jW05VVlVXUFxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLklnREY4PEIwNUVLWDFAlFo+TEWUl62noqqynKmpr7asuLWuqqWrqr3Iu7C9t8KvsKyzxMPOzsO+v7TAwsS6wbTJxKyvt62yuL++s62uq6WnqrCpp6ixpbSuq7CurbGws62zu6S4s6ysrqern6KesLerqq26tqW1taOpp6ysqq2hqaemsbKjpqWhoayWqqGUmqCmnqSiq6Ssop+nsbetraOlopupqq6pnaKlpKSYoJmWj5idk4KCkImFnKCMio6MmY2Qi4OMl6ObkpCbjJOSkZSimZuZio6KinyGgYKDenSAhIJ+dHeLo4d4al5gbmdXZYdkTkBnkkxEYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIY/SEZElpKvpKOqsJirqa21q7axq6Wrqqm8wMC4uLO7taWyr8TJy9G/wbu5wL/CucG6wcSusrWxs7vAvrOxrqyrq6i2qqatr6u5sKixsa+yrLaqtrWntLasrKSpqpyjnrOzqKiktLSgta2gqairqKunoKurqLm2qaqqqaKpoKybkqmhnaCkoqajqZ2cprWuqKapoqOXpaenqpyipKOfmZifkY6PmY5+h4yHhJ6eh4SKio6NkIyEhpWimo6MmpGSkY+Sn5eYlouKg390hoF/f3h1g397eH6BiJ2Pb3FnZ3F4XGBziGpPXZhWSG14VWRWUmJQTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg/Qyw+TFRfL0pqNk9EO5WOsKClq62Zq6WsrrO0r6qlr6mour68wLCuuK6hta/Jx8jRwL69u7zCvbrDwb+/rrKysbW8vMKxsrOqs6iktamlrbOzubCjrraxr7K6q7muqq61q6qeqaufoqC2raihn6+zobSqnqinqqOqoaKsrai9r6yuraGnqJ+rmZCvoZiioainn6iamaqwqaOfrKKhk6Kjo6eYmqill5eYnY+Kh5WIfY2GhYSkl4WCgouGjo2QhISToJaIkZ2Qk5CNkZyUl4+JhYV4dIF/fXV4eYB7dHN6aYGGo3VpXmVrgXVniIt8UlhwXkp4c1NkU1FeTU1SWWZOTFZZZVlGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGg6MzhfPWFkP0YxQ1BbWytITjlVQTSQj7GfpKaro6akrKa0srGqpLCnqri+wbuvp7mqp66wycbI0cK8v765vr+8ybzBuLCwtLG6u7jAsrO7rLisorSmp6yytrmzp6e7ta22vbC8pq2stautnKmvo5+lrKqnnJ6qs6SzqJqqp6mkqZ2jqaepvqu0r66dqaSgrpybsqOVpJykpZ+kmpqoq6Wem6qhm5KboaWdmJepqZGYmpOQioKPhX6PgoCIno+Gf32Lh5COj4R/k5uThZOijJSSi5GbkpWHiH5/cXp5fnxpd3x6dXBwfWiFeISHZGBnY3KFem1neV1eVkJXem1UYU9SWEtMTnF0XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtEWD4qj5SxmZ+fqaWkoaukt7Kypaixp6y4wb21sKO5raiosMPJyczBtr2/tbe/usi2w7W0s7Wxvbi6vratubW/raGzpqqrsLW4tKuevLyossCzuqCvs7WqrJ6usKOcpaipop6cpbGmr6CfqqmooqmbpKigrbyorrCuoaujpK6enq2ml5+boaOcn5uao6qimpqkpJWXlJ+ilpuWpqyLnpGQkYyCioGAj4B7mpWNiXx+i4aOjYuKhJKYkYeUo4mSkoeQmo+TgYd8eWt9dnl4Ynt6cXBxcnhogHNqg2dkaGFuc45tYmlwYHBBXHhrVl5OUVFKSk1TWVZNXV5tV0RYYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBCaFkxM1M9ZV9ETDZLV2VPKjwyT1o9IpKZrJmfl6ekop+no7ivrqKvsKmruMK6s62fua+rqLS6x8rIv7fBvq+0vrfEtsOxr7qyssC1u763qbm3vauktKeoqrCuubGqm7u9pLDAtbShrre1pqensbOgnqSmp6GlmZ6tp6ieoKmup6Cml6OooLC4n6Oxr6GsoayknKamqJqam5+jlZ2cmp2pppabn6iSmJOYnZKZlqGqkJqJjpCHfYd/go58fKGNjYh5g4yFiYyMhYeSmo6JlZ+JkZWCi5eMkX2Ee3NvfXFzdGB5eGlvcHBvaX5xY3psaWVjYWaGf2BbcmpyTU1/aVhaTVBMSkhQUlFJTlxfblNEWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpoSCo+L1lYNSiXnaWYnJasoJ+hpKG3q7GktLSqqLnEtbKuoLesrq2wtcbIwLe/wbmwtL23v7u/r6u9sLS/sb3Duam7urenqLWop6uwrbOxp5q9t6StvLavn7G3sKilp6+xm6CkoKOkoZebr6ahn6Knr6KgopOkpKO3sKGmsaufrKOvmJyqpamfl5qdpZObnJqdpqqZnJyllpWXlZyOk5ejqaGQiYqQhnqEfoSKeo+Xio2GeYKHhIiLjoWNk5iMjpaZio+WfoaXi496gHpwcndub3RfeHdkbGxraWiDbWZyaWtlaFxjc4BfWmt1aVpJfV5bWE9PSkhIUlVGMjlfXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbDg0R0FmW0hURFVdaEUuOzJhVCwylqOhl5Scqp2loaKgt6quoLq5pqy9xLOwrqK1r6ytr7TDxLyzv7q3sLO5uLq4u66twLO0uK+/wbisvLq1pqKzqqeps6utsqKbwbalqLW1qZ6yu6qnpqmvrJmip5yjppSYorKkmZ+kqKmcoqCTpaCkuaikp66nnqWhqJKfqaKhoJmbnaCSm5yWoKGrm5uZoZWSlZaajpSTo6ikkIiKj4Z5hHyFhX2djYqLhnmAhIeIh5GFlZOSjJCVlI2OlHuDmI+Ld357bHRybGxzYXh0aGhqZ2VvhGdnaGNmaGpfaGJpZlple2NgU3NUW1tTTElHSU9TQCEqaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc4ZE4nMp6ko5GOpKabnp6do7Wsp6q5t6isw8C2sKyita6nr6+3wMC8ssG2sa6ytra4t7asqr2zr7Kxvb+3rru7saWetqulpbSpq66gn8KrqKWws6qstbudqKqrsaWYnaqepqSRmaatopiepKmhnKKdl6Cdp7amr6quoaGenaGVoKafoaCZm5mckpmdlKWdrKKYl56VlI6Vl4yPmJqpoJGIiouJeYV3goKCnYeLgol8f4SIhoSQhJaVj46QkZGRjZJ7g5WOhnJ9fWZ4b2tqbGd1c2tjZ2RjdH9hZGVmZWlqY2pxWV5YXm1kYU5oV1pgVklHSEtNUlg+OWBsaUdCVFNcW0lJR0ZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQWZIJTWbpJ+QjK2hmZiglqS0saKxvbehsca7ubCxo7esqq6pub27u63Asq+urbavs7izqKu5sa+utLa7tq+4va2mnbWroKGwpauunqTDoLKkrrGvt621nq2vra6imZ2oqqWelZuopZ+ZpaOonZqgnJScna2wprmorqOhmpqdmZ6jmqSdl56Ym5SaoJKolquom5OcnJKMlZmNlJSZqKeNjYqJj3yCdIKBipiFh3yJiYSEioyIkoSTnJKSj5CRlo6Qf4CMjYNvgH9meG5oa2pncXJrXGhjYnJ/YGRnam1sZ2ppZmxcbG11cWFUYmhkZVlJRkxNT1hRUVZhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUllQyc0k6Kajo6wnZqToZqpsrCfuMC2oLTCu725saW2r6iupbe4t7esu6+tqqu3qrS5rqWztbGuqbG2trCytbqnqJ+2qZ6eqaKqrZypwJitpK6wtrWtrZ+xrbCqopuco6yom5Wcp6OdmqmipJaaoJ2Rm6Orqqm7n6ikoJiZmZ6gj2uilpiccYKWm6SAdZKqp56VlZ+RiZeZgJaKoI95hpSNg25qfneDcWyGi4Z9hIuGb15jYGeEl4Zri5CUk3V3i4R+g49/ZoaAaHVpZldcaXNuTlBqY2ZxhGZeZGZubGleX1+JkISGZ09LRDhFVGdeSkdQUFVVS0hTYW90ZUZbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFQZD0rL42kmYeVsJuck6Cbqq6ro73Fr6m3wri9vK2mtrClq6S4s7KzsLmtqqestKawtaOouLa1qKestrKutK2zoqmftKueoqScp6iarLyVpqWvs7itrqWorquspaGenKCnppuYoaalm5unp52TnqCYkJ6oqqO1sKOjo52Wl5iXo4ihjpKah6GHlJ2hf6V/p6uek5KbkoiEcniNjoSIoXaIjWmXiGZ9c3ihb4iHhH6Ne3+hoJ+ZgHuHnnSIjnabimyHgYNtaGVjemxxYlSGbWNsaZhxWGpvboZXXmlba2pbiHBteXKGaIeEWl5GTj5GXk1FUlZWUVFSV1RnXkxYSlJST0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxVmE3LyiMppeDnKydmZmdn6qqp6m/w66xury3wL6qpLewqaymsrWur7O2q6mlsa2ltbOcrbW2tKanqbOxrbKnr5+qoLKon6SjmqGjnK61laSlpra9pqynqqqsqKaioJigp6OZmaajpJicpKmWlKKclZOjpaagt6SkoKOYlZOYk5yIro+YlImpi5eim4WxgKStnpSanpV5gtSof4eUwZvHeXexpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQeoFslrGrsHloa1ixrm9labySvG5oeW1yj9h+UmtjtrJ/gXGUdZqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQF1FUU5ER0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaTgaapn5ecnaWssqiwwr2ytcC1t77Cq6a0ra2pp6+zqq+2tKioprWmp7ivnbOytqqlpKexrq2xpqqep6SxpKKhnpeboJ+vrZWeop+0uqKqqKGtrqWinZuaoqifmJuooJ+YnqenkZynm5SdoaeioLCjn5+jlpaSmJKZha9qaoqNqn5nhJWHrWVwnp2UmqaVca6hpH53u3xroY92sV9qtFulgGackWBmgXpmf2p4aqllvnJnpox2smp8sXh0kpNjbW2nbVuEoEVpZoeWRXWcYH1ne6Sngllfi6tpgZV4emqnN0qvW1dUbGNbS05XX1xXVjtOiE9XVi9JVFRJQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GilYKsp6Weo6Spsbess72+sLfEsre6wqepsKuvqamwr6SwurCkpa6zo6m4qZ6zsrCjpaCqra+rr6ann6OisJyjnJiVl5ucraaXm6KetLOhq5uira2gnpmXoKKpnJmepKCcmaGnpJCdo5qXoZ+sn6anoJufoZaVkZeRmoW1m7V4hamZtZl3h7Obt3+UlpeplH5rgaZ6gYWIkpSSd6tna7FbrHuPh5R0iHCPhoCAiJCXeIOCi5eMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinS5RoW5bVGtnYExLXGRYXFpCPrB4V1hBI01pRUJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o5YVU1MByVn5SIs6Wmoa6pp7Osqbu2wrC8wq24t8GqrK2urqausqmhr7yqoae0raSrtaWmsrOno6Kdp6qyqLCnpZ6fn6+Wn5mVlZaYn62impqkqLWvoamPqaiqm56VmKClqJmfnKOfnKCjpKOWm5+Ymp2jq5ummp2boqCXk5KTk5yD1ZOZuXCwwn7GhnzWlJu7fJqWpZCNnI2ke46Go4KlgnqseY+dVa97iX6farlauXeGg3ymgpN8mHqqeY6cj3uxbY6EdJC8hW+UUK+nxYpRoHpjYKpic3KHbJeIYFO1tMiGgIl8Y6QzQp12XVFqaGNQQFhmWmRhSkhNbEtbU09ZZlpDRD9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRNzIlm6KTmLGnqKWzqqW0qKS7t8GwusCxtbW8s7WnsbCjsLOmn662qJuoua6jr7Ggs7SwoKSenqepsKi0qaScnZ6rl5mXlpeVlqGrnpqXqK2wqaOfj6yip5ael5yhpaGXoaGioZuioqebnqGelZmbpqCcp5Wcm5+hmZCSlZGdiLJuaLVxq4dvjqZytHNytnuamKSMj5yNon6QoKV+sHaDkdLRdVuufIZ/pG+bqqZrhoR8rX2XmY97sXOTnY54s2WWdISeb55mlFLIi1rCXJ95Yl+tX3Zzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPal9saU9VRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6GckaWvrKSqu62mtKWntru8srq/t7a1urqzpbS0obGyo5+ssKSYprqupLGxnbS4qp+mnaGqpLGnrKmkmpyaqZ6WlZiYkpKjqKCXk6aqsaailpOtn6WSlKGbpKaflJqmpqGbo5+smqGfnpCWnKKenKWVnZWaop+WmZaSm4Wse3eodqOOiYepb62Kg6iDmZmhiZKaiqJ/kpiJroV/grNccrNSrn6DgqR/cdd9d4R9jp2HmZl3r4aKkZyHd7RhmmWagYKUbJJasFhLmnWYeWZgrV52d4dnmIhrXq93lZ6PeGw1eciusl9BVG9eZ2BFUGxfcW1WVU0uZWNpU1lROkFEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCXtMGtqLOoqbK6uLO4v7m3sra9taW4s5+0rJ+gqKuflae2q6ixsquutKSbqaCgqKG1pqaqo5melaWhlJScmZKVoqWak5CnrK+moJWZqZ+ij5GimaimoJWZpaidnKSerJ2hnaCNlJ+bnqCYmZyWl6Kgk5iRpp2GqX19pXihj46DqnCtjIKnhpagoYqXl4ijgpGHlKp8gIudeW+xWqeDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pjcnuBa5iHcV2sWomgjmtuZU9KQ6FcWkx0XmJlTVphX3JzX0pVNkqak1lIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOj4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZ2Zmb6rl7TCrqutqaW0sLixtb+5urOxt7yqu7SfsKSepaennpSqsamwqrWsq6+hmKGgpqSjuaKjq6CXm5GioJWUn5qUmJ+fj42MqbCvpp2Xm6imn4ySpJeoq6eUl6mnnp+ho6ykoZ6hjZShmJ+gkp2XnJWeoJWWj6ubj65tcrRyqYx2iqZztHl0s4CSpKKSnI2JpIePdrhvjHuLomtrtlmhhmWXl2mhoqdtk3K0dJOYf7JqhZOIrWt1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbHl/fm+YhnBcr1Y8nHdmVG9uLlynT2JSa2VhbFliXGBwe2NTWVE+Pm1wM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOKWam526oZuywK6tq6unt6m4r7TAtbyxr7m4q8G2qaqgm6akoZ2SqqqntqOyqK6qoJecp6Ckq7mdo62blpmPpaOWjZ2hm5mcn5CTlKu2r6eZlJysqpeMk6WZpayjkZeqsqOgnqersJiho5CZopegm5abl6GTnKmclJGrmYfUkpq7c7DDgMOGftWWnLh4iJCYjJeJjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohxbo2kdL1dd31bYXm8a1pWW2p6XmpgZGZibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6hvKKXscOwramqq7Gnua+2xbG6sq67sK7Bsqylop6joZybkaqkqrKktKatpJ+WmqqZpqy4nKKtmJWhkKWgk42co56YnZqQlpOvubGrlZejqKeUkJaknKStnpGgqKufm5+po7Keo6WOp6KUoZqcl5WkmI+woJKVqp6FkJm1gJCRjLiVeIKTm7V3bmxuc255j4SOiXOewbu8mnuBsqhwgHSRuIN8hoaLh417ioaNl3yku7m9nHV6s6N0dpd1dLB1mZ5mhmmNtXRycHe2jF5/eX2JZ4N5bXlii6xwdYV/WVunakRkWVNmYGNdY1FnZnFsdUJOUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPTs8p56goL+llrTDtKyqp6yrqbuusMWvtbOut6e1uK2po6KmnqCdmZSspK2qprWoqJ+blqCjnqukvqahqpeUnZCim5KPoqiik52XkpiUsrW2rZidpKSii5KRppulq5uWqKSlnJqhqaano6mhkq2fl6Oel5eXnZ6PsKmUnKeijmp+aZyneIlzfpqPdHplh3q9vsC6bpKDcZSGYHJqWl6aiWFkh46Va2B/lWNtnHZilGt/mpWUZV5gY3GaiWhyjH2GlWdqfnF0eH19Ylt3dIFoUFxug3x7i2pYa3qCcklKb4VwTXRNRVdcZmBMW1hnY15PW211aXFST0RFTTtISTxMPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqigqKHBo5q0urairKWup6i1sazIrLCzrLWjvrGypqCjqZ2jm5qZrKeupKS1qaWbl5Whm6esqL6nqaaVlJuVoJmTmKWpp5GekI+YnbCyv6ybpp6noomTkamaqKSam6ufo5mbo6etop+qopqwm5WmoJeUnZ+dl7ClmKKomZyRnZyjpJmno5qcmpqakJaBaG59cXeRl5SRhYq1qo2GmJWOioyXl4eUlYqDkpORiY2Rk5iUmJeaoKKam5SgnY6CeqWGa2l8kHyAdImKgXGCeHl2doqAe4pqc4F0g3Vjd312a3B7bWBjXHBnTVlZZWpfV1pvem1tZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCyoLOhv6KksbK3oKmlsqelsLWqyautsaW1psCotKCepKWcpJWWoKumrKOjtqygmZaWoJetqaXAnquklZKcl56Yk5Sin56ip5ORmKmnssOvmqudq56PlpapnqqcnKCsmKGanKKlr6ahpKierZiXpp2ZmqGenpywoJ2ippWYk5iToKKWo56XoI6WlIuKjY6XrY98lZuCkoKLqqiGgZiWioSOn4h7hJCGhZmQh4aJlY6bl42QmJ6jlpmTkZ2Nf41mobOuhImEdnqPinx2eXpvZ3mQgYCJa3WBeYhyaHN/enaDiIJrdGN5ZmBpZGJkZmpZa3twaWpcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqq2js668pLScoKaioZ2Zl6ilqaakprO1npWUnZmZsKauvqCro5CRnpqZlJGVoZyXqZyEnqmsorTIs5+qpKuWlpeap52om5+kq5Senpyfqq6ppaOroa2bn6ChmKWenJ+dr6OZn6iTmJidkaWZmKmempdmg5J8ZX6Omo9jeY1saGt6kaSra2WamH5nhYplZWloeo2hjmtojJeRondraouYo5+Yc2xueoSNhnlYZV2FgV5siomAdlxoc3d3kYCHgm53gniAc215g3R3iIiOg3tqhVlea3RkXXOJaWp8cWxjXVFNV0pkWEBKND1GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6uzsKqlqK2usKaurbC9samopK2vsZ+tl5+jnqGamaarnKyjpqipsq6elaOQoq+mtrmlrqOPjpqhmZOSm6CZmaWWe6Wsoqizw7ekoqevnp6VnqOeo5yjqaiRnqCdn6qvqqujqp+om6afp6CslqGbpbCkmJyqlaGempOlmJ6rmZ5+voOIcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooeCn3yVmImewL2Clp2ejZ3BwXuBe5GMmsK/fWulsW+MgG/Ken+bd5GDjoB2eYF/eXF6f4dxeIWMk3ltdpJiZl94ZF9lgmNedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCvraayta+qpqamsaufq5iaoqCcm6qnopyroqWopaS0o52ikqatrLezp6+ikpGanaWSkaChl5yfnYenq6Srrb/AsKGpr6mXkp+dopmio6qjkqChnZ2trqispqOip6ClpZ2tqZGkm6mtqpydqpysoZaXpZaho5icf86UeXqkgXmVlptfro9ejqeBoaB8p5WbdKuDgK9eY42qeqeHhaB0l5KIs2OCq4ahjo2zaYSudH2Wh7hhgq1Zo81uj3V72nt/mXB+iJJ1f2V7iHZ2a32Ibn6FkZJ+bYGOYHFrcGdgX3lkW3BoamRmYFJUUldeS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcK/v7W0sLeYnpGkqqittKumsqytrKSrp7CqoKebmaWXnKKvn6CfqKejpaGfsKybnpWnrq2xq6isoJSSm5+lk4+fpZeeqKOerqSqsKi/xrOoqbGulpKdnKKXoKmqnpSgn5ydrq+nqqmbp6ekoauSrbSWpaOqqp6jp6ahsKCSmqeaoZuUlJGXoHCFjJd1haiHcbB8nXKsfqGegaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uJk4+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+JipGQg22Qj2RvdHVwYGdtZF9vaWluZmNXU1xhWlJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK6/UxsaytJ+do46jo6Gsr7auqLCnqaqorqurp6KknZmilZ+mqp+ipZ+oqKKfnbCsl5qWqKeurKinqZ6XlJqjopKUoa2bnaajr6yjrLSpuc2xraeurJaUnJ2imJ+urJyWoJmdnqmxqampm6upo6Ksm6+xoqisrqaZpquqqrGikpejpZuUkoWkaqR1iXqpdHqycIKliZmMcIigmoekYGBSrIR/roKadq6BpoaGn3qYloZ7ZoCjiaSZhoGjfal+gZSHrl58qVWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojYyYj4FtmpJvbXl3d29sZmRlcXBme2hjXVdfaVhYVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfCydXVwKGZq6ihr6KesLWwr6mso6imqqqrqaSmoJuknp2lp6ajnKyaoquhpJ+vop2akqqktbCvoKmbnZaUp6OQmqKon6CmnLGmo6ixrLbIsrWqrKmVkZydopmfpbOcmqCUnJ+nq6ujrpqsqaKhqqOzraKqs7Ghm6qor7C2o5OWpKeYm5F8qmyehId1q3l8sG+CpIuJn5aVnpSB0ri0uMmAgbJeX5Spg6SIh6B5mJWaeKrJdJmjlaepkJKbjH+biZrGxnhloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI+QnpN8cJeSf3B6dHx7bVtmanJxZoFqXmJYY21cXllJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TAxrmtqLKurKWinLK5rKqhppuopqqsqaagpqWYq6OfrqudpaCsmp6opZ2mtZ6il5OoqrayrJulnKCVkKWtkZmcp6OgqqeuoqOnqbC0wrGyqq2ok4mYnaSaoaOupZehlZicpaarmq+draimnqyjt6yhsbmvnZuvp7O0s6SUmKikmp+Ogp1OeJqBf596hKN8gqSEhqaenJ6ThLh7fHm5gn7MxcK2eJqhkYuffZqWl4p2npiKpJijqH6whZyFnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkaOXfH6SkYp0enOEfnBbbW53cmqBb1pkX2huYmRdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamspKu5q6+gnKGss7Omn6CVpa6trqqnnaammqOnobKuoqimsqCZqaSUorWio5WXoam0uaSbo52jk5ChspmenKemoaKvrp2kqKG1scOxraqtqZGHkZymnKOknKWXnpiZmaWkqJquoa6lppewpbytobe3rZ2dtbK5sbOnmJ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgYpxqoaEtG5yapmjm5WKn3yYmYaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5OmmH6MjJOKd3x5jYFtaXhpeHNuf3RdZGRubWVoYEpaWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWSc42Krb+/u7q1npeopK21oaOZlaOpp66qq5mlop+loKC1pqKop7CjlKujjqSto52QmpqqtLSknaWdqZGUl66goJ6npJynnLWaoKqjtavCsKmrqaGMhI+boaCmopWZmpyYmpmmpKaYq6etoqWbrae+rJW9sKyfo7Czuqy0p5upsqWomHqokH18sHeKgaSliJxtsm+hh618oY6Dp5WYgKyIha6Fn5SooKGWhp+AmZWAe5J+q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbpWRppmDlI2Wi3p6gpZ/a2x/Yn10bX96YGdlcW9nZ2hDWWBbPUtUMlU4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovJKahKnGwrfBtJ+brZ+uuKWkjpuko6Cvr6qfpJ+drZieuaCiqqCvqZmtoZCqqaSWiZqQrrCspp+nm62YmI+soqGdpqKapZ2tmJ+opbaov6+lqaSei4COm5qgpp6SlJqak5qapaOjmairq6Okn6movqSXw6yqo6Gssrqrrqegs6+pqph2r36Qi5yFh326rYqYZLCMZZWtfaCPg6aVmoGsioSwhaWZpKGhkIWgW2xqgbNgf617e4KAsWxnbpmXjIiwW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW2Yj6iaipeQlpZ7eI2cfWRzfWKDd3SAfGFqZnFtZmVlT1VjW0JUXj5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbaooYuaoJ+ds7OpnqOgnbSXoLOoqqudr62dq5uVrqiijoibjq+rqKaip5muk5mPqJqhnqWfmaOjpZmeo6myqLyvpKienY58i5qVoaCZj5Kam5GZl6ieoJioraelpaOlqbufoManpamhq7S2ra6nn7yurayVgamSo6+Om4CGpJeYj4CAuMO6g46dk4Wnl5yCrIqCr4imm5qlqpB+1b3CqmKjv718fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwva14d6K+u3SAlo6mnI+akZaceYGQmnljfXpkjGZ5gntga2VramJQYltTalxAVGFCTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbO0sb+5sr2zop2upqWzpp2LmKW+qbexqKG/pqaxm56xnLmonq2upaaVlK+sl4yDmpGupqOsoaScqqGYi6OSpp6onJqhqaKZnqCrram5raijm5eTe4eZkaabk4+RmJiOmJOpmZ+Yqaigqqaho6u7nqnFo6Cvo6uztauwqqC7qK+vmnN1qqS3hmWJn3BnrI+Kj21vd6SQmZ+Bda6ZlXCPi3GVp6ObmK6kcm1tbWWKd25tgplxgHlpcWlniZWVmHFoaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpJvZmSAjZKOopiXmJCVnnyHjpR1ZoZ3aI1qeX55ZGxjZmxiS2RYSmtZOlFlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6q6ubKzq6mirp6jsqmYkr2xw8i+tqqewKyso6CnrJ+6o6StrKymjpatqZCMhZWWrJ6lqqGfo6OgkYykkqeZqZmWo6qglpylpaevuqusmpuSknuElo2ll42RkZiTjZiVp5Sel6iimrCmnqKsup+wwaiks6assbKrrqyouaOuuJaKoailtp2JlqKXhqmakJSdk6qzmZujq6CylqKhnaCinKCkoZWrpoySkoyHkpyclJCZk5iQjZWGgaSZl5WNi5OSio+GhH5nin90gnZ0h4xxp2x7lZGUk4GBj4+Pj52UoJWYlqCCh5OMcGiPdnCKd3Z8empsZGRvY1VgWEBpW0hjYU9aK0Y9KyYhNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTVBQUVdUVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbeurqKwpK2foLWxkI6rxbzEu7iqoqWdm6WdsKmjtqedqbSmp5GYrKKLiImOnKeWq6ShmaeenpOVo5eom6mZlKaho4+ap5mhtbqoqpiakI18gZSLoZSKlJGVkJCTl6WPnpmon5y2o52nrLeorsGuo7enr6+wraqqs7mhr72Zkqajpraikp2mno2pn42Sn6Osr5qho7Gor5ekoJyjqZ6enZyXq5ySmaGbk5CWqpmNmJiWkJWekYignZWUhZKMkIyUioB+ZoyGdYZ2eYiDc5xqhpGUlJGKfYyWkpKYk6GTnZagg4eXhnlxlXJ5iX9xe39qbmRfcGlgW2BZbWNQYGRQWzpHR0Q9Mj09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaSno7CzrK6jqaetoKi1qpCQnaSzu6+srKKjmnqdorGkpbColpu4pqKUmKmcjoaKiZuikK6eo5Wnn6GSl5ibrourlo+omqiMmKiPnrm2pKWYm42JeYGTjJqTipSRk5CNkZaijJ2eqJ6fuKR/hK+1oq+vdaS+o7KgeHqgq7K7lXetpJ+KgKp+ZFxidp+OpJ2Dl35uk7Oco6euq6Jlnp+Sc3mZl3CAmKiXbH+ip4llnKWckZeYlouRm5GFnZqQlYKSh46OkomFd2uPh3aGcXyGgIBhaYiLlZOLW3aVkWdokI5ye6WYmGR5mIaBd5dpg4qCbnl/a3BlYHZva2toW2ZlYmJvU1s+Tk5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTFNUVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5amo6GwsayrqaWoraOnraSSlqu1r7Gmmqqmq5dzi5yvn6iqppSWuKCgj5yjnZF+iIibnY2rmqOVp6KejpeRnoV1rpCIppqnkZajiJu6tKegmZiLiXR2k42Wk4qUkZCUjI+ToI6an6aZnLKWgIyctZ2zjJKPvKehfqeieqOvt4GOjqefhIuFj7Gpr4yJlqKaeYGLrIacnaKnqaiHlYaYdqWbeoebgZemgoF7nLF6ioWgl5mUmJaBkJaWhJmZY3mHkISNj5KKg21wj4d5gHGAgYV/hnSGhJaSeJZok3SgmnR8mYOgnIaYfpGJgYOYao2MhWt4e3FwZ2R3bmlsa1tla2plc1teSVRMUUBFNS5ZVFU2KSEwOT0+NjQzNTY4Ozo9Pj5AREg/SUVKS0dSWFpZW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyYo5+mrq2rqKygqLCmp6mlmZSuxr2woZamqLWej4Ocq5ymoZ+NkL6emY2fmqCQfYWOmZeIq52ilp+gkY2TiYaAkaiOh6Kco5OWnYafubKnnZqSjoVwdZCJlZCKlI+Pm4uPkZ+Slp+klp6siJ+0ibSarYrKh6quiLeFjbCDsa6DqY2mmI2dfKiPcnt3m46mlmiVpHm0i5+epqiSmcKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qXkYt8hZOGjZWTiYNtc5GFf3pyhoGEfIR0hYKXgY/FZoCph4+ia56DoZmCmYCLjIOJmHCOkoVod3R7dmdodXBnZ2xeY29sZ2xYZ0ddUUwyRTQ2TWBjNyYzPERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmRjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5sKqrppqUoKOkqqOWpKm2o69/oKecpZ6diZO8mZONoJGdkHmElpaRh6uZm5uZoYWPjHebnI+gkYiepJuVmJeGoritpZmbjIx/Ym2Pi5OQjZCMjJeLkJGfj5OfoZmhqH6hp4etnaCWro+enZ2RhoGgjauvhqSNqpqMmn6idoCZk2qBq3VNq3iHjZ2Rm6ingKqrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln6Me2RoinKZfXmVbF17l21fU3CEXF9seYNgWWWCfYSBmHGnqmuDo25ypXCfg55pZZ9sW22Je2VZX4N/YldQb3ZlbXRyampvXmpvbWxpWGlPXVdFOUE0R0NeazQsSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKhtryrrqKZl6Chpa2toJyttaKokqCfn6abmY6YtJmQip6MlYt1gZSRjYqmlpWYnp5/koWGrKSHnJGKmKiXmZqRh6WwpqKVmoiJgGhuiIeLjo6Ji42Si5CSooyTnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprYWleYp9hJp9onByk4eVep2MeW2HnIyZkJuomo+HnHuConN2pmaefnakX5h6fZJzom6Yt7S6c5KHgX+1qGSBxrh7cJW3i3GAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN/pF+dmbOVcHyXnrR0c1uesoNqYm9zdXFob1hrbHJzZlxpXmJLRD1ENVFBWXEzPVNHX0pSPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWldgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLi1rq2gm6Kco6Olrpybsa2sk5egmKCkmZqTnqubi4iReIuFcICWjYqPoJCTlJ2XfZCJjqigh5iPipGik5uajIuoqKSej5aHhH5reoZ/fY+Ng4uQkYmPlKCClp2gnaCfi4l3nJiijKByoouIqYicppCWqKt/rox9eqCZeqOTeIBzloeMnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmhzqYKcgnOqZ5SaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z1iYp/nmiadYeTkpiOf59umpBsp5lcqH53u2t+qluOhF20Z1xucXl3a2lbcWp4eWJfZlhiQVBFTjdWQlJuNEtaWl9OWkNAMTUxOzs3SD86Q0dUP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtpuoiWOUm6y6srCsnaacnKifnq6bnbCoq52Xopmhn5iWlqCjmYaJjGqIgHF7l4iLlpaEkZSYj3qKhJajnYqUj4WLnZGcm4mPqKOgmYuRioCAaYGGeX+XjHuIjo6Hj5aaf5Oin6Cik5hyaJ+Kn4+McJKMgamImZ+jqKCofbCto6K4l3ajs6Kjf4iUeJ16q5p/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8mnycmX5zqlpdb3uWi3ieYkx+enqFY3mXQk2fWaJqcXyObYGJhJl1m3mHibGzf3+bk6d1gJ1tcXyUb5lyaqRdlXZIZWNgc3B9fW5lYGxodnxjZGFRXlZdVFZAWUVRZ0RTV1tiWF5JRD1COD9COklFOExEV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZl5hYVxdXmFoYl9lZHZsXmVnZmxkZmxoaGtpk52Asa6ZhFNfoKezubOzqZqijJyrnJypk6GrpKGoj56dnJqZlZihnZaHhol3hYFueZWFkJqLfJGTlohygImToJxzkZCBiJiUn5qEjqicmpSKi4p8g2yFhXGBoYx4hY2Ih5KZlXySpKGfo4iuhn21hI6enXullnmpgpadkIqhnX2naHZtfplzoHNxfJ2FmG+Tgq59pIOmnpqBo29eqGd1o2NvpWGc05B8epl4cnNjooWQfqJyoo51a4+zi2CCmIlzqrKovH93g21+vqaptF6cbn1xl2+Bc6JyXaNndKZhaKZtm9SZfIObb3d5l2ubeneXc22ppGdgZXlwf4NrZ2ZkbXV4Z2BiU1tlUVFhSVdJVF9XU1tlalxkUEVDS01KS0JKRThQP1BNV1NYT1JSYGZlaVJjd3l3SUZFY11kWmdpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7CrVFxLfqmvsbSws6OcmIWYqKCgo42kqKCYqYmZl5iTmZKSoJiOh4V7cH2EaH2PgpSagXeRjY6Jb3+GkJOSbJeUfYiQkaOVg46qmZSSioWJeYN2h4Bugp+Gd4CShoiZopd5k6Kkmp+Js6Gitot6rKekrqVwqYGakIWBnJJ8pICimYaYcp6Eoq2uiZeLf4ykjZaDrqKUdrS1tcmhc5SKgJ9gnZepbXmVhp+adaGHd6B+kZaKgG9MZqOScJqHcqR7eXRhg4JsfqBrcWRgnHJ/dJdpe2mztbTGpnOYfnudapubq3WDmmx0d5dpmnp0mHFQRH2zXmp2a3iHZmpnYnR0cW5WXlRZaE9SaElVTFlSVVxna25WZ1dNSkFKTUtISk5BUUpQZGNpbWV0cnN+eXtudYl7e1RQT21daFtraVJqaGlsZ2xmY2VfXF1cXmliZGhre19dZGhjamZvbWVpbGWhnImvp4RmP5Shsquvr7Wio4+Al6mioqWMpaednKWCmZeWjZeQj5uSjoiCeWp5hmWDjH6WoHl1j4iMgWmEhZKDjIWdjXqMipSlkoOXqJeMkIqBiXqAfYt4cJChhnmBlYeJlqCWf5SlqJyWloRnbnicbKJkfHGld5yXcGengZeMe6V6n5aDl3KedoGJlJaPuW6QiqJifZmilYhtcmmranWgbG6mYJtpi5BoloealXWigH2aYIuFjHVviGJooGWefmmadW9jZoiCbnKiWl9bY6FuXYmMb3t/c3JkpW13omRnp2iYc4uYbqFvU4iPb6BfZKdUi11UmG1tc2txgW1waGt4c2tvUlhXVmZZU21JWE9dSFhpaHNqWWtWUVJFVlxMWFJhVGhqXnd1enxwfHxyg3t/cnaNgIR2XlFzYWdicGdQamhoa2xuZ2RnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKWZpnpldG2Lp66kqbCxpp+LgJernJ6ljKKhmqKigJWYk42aj4qXkI6Le4dxgIhoi4t7l5pzdIp9kHtkgoeVioqVmYJ8iIWWpo+BoauQhY+Jgop9gICPc2iPpYR9hpSNiJigjoiSqqediaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupKKMkoSMg7xufKWvgoaGh5OWnJ98pXpxqJSglmeefm+rY5aKlZJ3qGypooGJdYeCd6uRpohrkbBrdrOMqWuKhm5tn56SlWF/q4uqdoB/jKafd599haWVnaBpmod2rGeerYy3c3e+jaSTWYOmjathdXJzb3t0cWJqfm5obVNWW1VhYVxrTVxSXUldbW12YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDc4R/gHt7jIGCgHZieGRjbnNkUmxnaG9scmlmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWmqp2BgJ6klqmqnainrqOZiYKXq5qepImapZ2pnISMmo6GnJGFko2LjHSGeoiEb4yEfZeTdHSGcpKCbX+LkoeGlI98e4GFl6SNf6WljoGNiYSUdYKHkm9si6mAg4uUjomcn4mNk6ujoJCAdZSWiH6BeZSuo3+Bm3GPhniQjIR/e3KmjHF9fXqXlpuEjnh7fn6IlJWTinaQmJ+gg3p9iWuMhVt5eHF5cGhufpKJcX90gY+Tk3GFhIJljH9fgX+Ld3VzlHVveW5uh22EhV53aXiNZoGCho6pm350fJdqiYhwgHZ8hXZtbGaMc3l7mHiEW2pYeY9obndycW93eG9dbIZuaWdWWmBXXGVrY1VhVV9RX3B3eWxqdmVqa2p2fHFydHNhb3Vic3uBeHV5gnWAgH+AeIuFg317bX9sZHluXlduZ2h1a3hqaWpkXGBaY2plbHB1blpbYmtkbGx5bmhsb2GOlLmpp4uhopqmpJmknKuioISEl6ySnaCJmqaaqJiCgZuKfpaTh46JiI1ygnyPfX6OhHqXj3Ryg3CVhXt9k4uGhpCFeH5/hpiijHumoIuFj5CElYKGjpd3coWqho6SnJCInp6IjJuooKCrg4mNlJp+fomWraiPk6aQeHCdkYN7km9+qIVwfZVxa3B8gZ+Lf5KOjGhtXYOLjJubno5zlYuIcXRrgnZzgFlyboeQgX1+i2ldaWR7hYOIgF9peHube4KLgnaBhoJoeYuHa2FxcoN3X3OMgomQp5WGZoyPg253i4RwhY15b2VmY3mDepZbXGlmbnZbe3h3dG1zcoJmXG2Ka2xiWVleWlhscVtfYFpeXWZ0fXt0b3Nja2tqe3xye3h0ZG10Z2x7fnZ6fHt6en9/fm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtoa2pxcm1XW2VubGdzem9oam1gjIyqsaKQo6Ganp6YnpmooqF9gpitjZ+Uh5uikKWVf3uXhHySmIiIhoaKcnyAi3aFi4GElYpxb4BymIaEfpKEg4aKgXqAg4uano+CpqCGeI6XiJWLi52XhIN6rYKRmJmUip6dh4ihq6CioqOLiJKbnKOZlqqhp6agkpuIl458eI6OhKd+f5KRkpOcsaablJ6QjbKTmISljIyVm5+JkJuCiJGJa3yNdndlgoWQinyJnYSHi4+IiICFhJB3fHl1mqGIhoqfi4WUf36MgYB2cHSGhH94iIeLkKaQhIWNiIONkIx8h4qIj4F2a4GDfHmZanJoYHOKcH16d3Zvd3SBXV5vhmhuX15aXF1TaHFVY1tcYWxodXt8cm5wZGtqaX97bXh/cWlvcGxmgHtygoB4f32AhHptg4yGfHp4fH56g3hOZHZrc21wemRrZWJiYFt0ZnBmcnJtVV1sdG1oeXpxZ2lrZY2InbqflqKhmJWZmJSZpKCee3+Zq46ejYWfnIqelnx4lIJ7jpmJhoSEhm14gIBygYd+iJOEbWt+epeGhIOQf4CGhIZ8h4ONmpyShqmeg3KKj4WSkYudkX2Ne6qDjZKXlY+cl4aGm6egopqdhoORmpmZkJqmoKadnZCWgZGKd3yHjoSle3yOkJGGmKmhnZOcj42qjpGAnoyJk5qego6XfoaNgm94hXF0YH6Cj4Z1i5eAg4+ChoR+hYOUbXl1dJKii4yFmoSEjXSAinx8cnJ7iIR7eYyOhJOnj4aEj4GEi4qKd4WHiYt8bmt9gHttaGxtZ155f2h8e3Z0dXV7d1xgcH1udWBjWl1eUWZtU2VaXWFqaXZ6fnBrbGRrameAf2xzgGxsdG94boR5boeAdoKAfYR2coONiH57e3x/e4KKYGl7anVoaYJkamNgaVxkdWhvYnVubFRjcXllcHp6c2VpbW2Lip+3mqGjn5KRlpeLmp+fnnt4naaQm4qGpJSLmJl4eo2Fe4mRg4yCgYJtfH54c4CFfYqQfGtofYGXiIGIjnx+hoSHfI+Aj5qbkYimnH9wi4qLkoegoYqFjHyokYiPkpeTlpN4jKOhoZ6Wmn+AkJqYk4ybo6GkmpeRm36OhXmAg4+HoIB9jIyPfJekoKCSmZCPpo2PgZuRiZKXm36Skn6GjYF1dIJwdmB9f42GcoqVfIiLcox/goWGjmh3cXiMmJKPf5d+iIpzgod8fHB5e4yFenuRjYOWppOLhpF8hoeHhXWCg4iHemVye394enBsamZefXNofHV1c3xygGpeYHR2cHhkY1lfXlJraFRkWV9hZ2p2eIFxZmtjbGhlf4BqbX5obnFrfXeGemuLgXOBgX2BdHaCjYZ+fHt/gX1/j2pyg25zaWGHaGxiX3FWdG9tbmB4aG1XanR2Y3V7e3Jiam55iY2fspKlpZyOkJiPhpygm5x8dqSgjZd/jKKKiJqWeHuGh36DiX6IgoB/cX96dHWChX6JkHhnY32Gl4qCio14fYCMg3mWgJWXlYyWn5p9b4uBkZOGppuHjImEppWFkouWl5OSdpGeoaGYlJd6fo6Yl46Wm52knZmTlJx6kIaDeISXjZ1+gYmNjHOXop6hkpiOj6KMi4OWmIOSlpl+mI18iI2BdnF9bXpkf3yKhXCGk3+QgmyHgoF/iYRldW98h5KXjX2TeIuJfICHfHtxfniKhnmFkYqLmKKVgYSNd4mFg4J2e4GJhnZfeHd9c313ZmxkYX5pandzdHR9cXxiY2FzbnVzbWFaYF5ba2RSYldgYWhrdXiGcGJqY21laHyDbGh0aGxvaH98gnhtkIZxgIODf3N8g4yBf356goN+fJBtdoh0dG1limxqYWN1VoRpcW5geWdsYmp2cGZ5fHpxYHJshoWQnK2XpqiejY2Xh4afk5eYfXeqnIqYeZeci4uYj3l7gIt9fIN7gIKAeHR4enN9gIN/iIuAZF59i5WHf4WHdH19iX99l4SWk5aMo6CXfnKHepORiqePjI6Kk6CRg5GQlJeRi4GPmKCakpCRdH+NkpSJnZ2ep5iXjZWWdI6OimyGmI+ZeoeIkIlvl52ao5OVio2fjIaBkpx/kpKVhpmIfImJgXpxeWt1bHt9i35uhZKClHdvgoN9fop/ZHJqe4CWl4R/jXSQiYN5h351eIB9h4F9g42FjZSkkHiFgnSJh32Ac3WAh4NuYHt1enF8b2FuY2R7Ym5vdnJ3d3N0YXZfb2x1bm9cW19dXmpeT11XY2FobXN6iWtfaWVqY2h3h21mbGhpbGiAfHp3bpCHc4GDhH1zgYaJeoJ9eoGEfXyOcnqKeHhubIdraF9pcWOHaHFvZXdobmxheWhrfXt4cGF3bYuBmZqqoKSonYqKkYaKnoqVl313rpiMln2ek5GWk4h3fXuKfHyAdnd/gHB0c3pvhXyBgIp+fGBcfo+Rhn+DhHN6f4Z6j5GHkZGbkqSblIF9gHuNipKkiY2KjZiajIaRmJOWjomJjJOdk5CMjW6DkI6RiZ6ZoqGXlomWkW+ImoRnhpmOk3qJhZCKcJWalKGSkoiLmYyCf5CefJKPkouZjnuKhId0c3VrcW51e4t0boWQjpJxdIB7gYGIfGRxbHl9mZR9hIh0kIuBdIh5b4B+gYd8hYyJhY2VqI17iH1+i4V3fnBvgIWDY2h4dHVve2JecGBqdF5xanp4eGxycGV4XW1sc21zWFpeX2FqWlBXV2VjZ3Fxf4dmXWloZ2JncY5vZGlnZWpogHp3dG6OhXSBgYJ7dYKIhXeFfHiEhXqAiXd/i3t6cnmDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKf6KYoqihppuHjIqBkJyGk5x0gaqUko2GoIyWk5B/dHt2hXd4f3Jze4Vrcm95bYp2gICGbnFbWX6RjYh/gIF2dYB/f6CGj4qRnJegk5d3iX6AjIidnoqPhpKYloWJlZmPl4yLjY6NnYqOkINtiIqPkYqclqGbmJWFl4hqhaODZ4adipF+i4OLgXeTmJGekZCIiZWNf36Pl3yRjY+NmpJ8in+CbnZvbG1ucHuFaXODjpeKcHd/dIKJgnhmc292gZmOfImEepSReneIdHCJe4aNe4uGhImPnKOIfIR3gouAeHhuaoCCgV1yc3Fwb3haXnBgcGpeb2l8eXBtbWpsdmBwb2tybVlYYWFhblhRU1pmZ2N1cISCYl1qbWRiZmuSbWBmZl9oaoF1cXJwi4B1f4KAeHWAi4B4hX93h4Z3g4R7hox/e3aKf2pxY3xihnxvcWx0amhvbHZ3X3F/eXt0dXSAgn6klZqtn6eWhYyDf5eUg4+fdYqflJKGipuMlY2LeXJ4dIFwcoRzcXWIbG9sdW2IdoN9f21uVVGBq5SHgniAdnKCeYGggZGBkpKXm5GaeJF6goySpJqTjomVmZKEh5eZjJSMiY+PiJ6FkIp8coqFiY6InJmfm5aUf5R/aYadiGeGoYiShJGDiXGDkZePmo2PjIuPjXd7kpB6jouMkZaMfIh8gGt2am5ra2x6fmF5fo6VgXZ6gHeDjXx4Z3RsdIeVi3+IhnuUkHF6hHB3jHqKjXuJfoOMkZ+dhX18eIKMfXZwaWuBgnlfd29ta3FzVl1vYnFgX2xueXBncGZmc3RocWxhd2VdVmZhYHJTUE5cZmVdeHCIfF5caHJiYmVmkmlfaGRbZ3B+cGtwc4p9dnyFgHR1f4x5e4aBeIiCc4aEfoyMg3t5lXdmcmqDYIh+b29remBqbnR/dF90fXmGeHRzhXx4oI+ZsJylj4KKf4OaiH+Lnn+KmZOOhIiYjo6OhHZ0dnOAcG+Fc3Bxg29raXZtgm59fG10c1JOgt/IktaTfHB0gnWDn4KTd5SQmJqPmHuTcoWQn6GTk5CJkpuUhn6WlYiNjYiRjYicgI6BeHqMfoiMiZybnZuVk3mNdmiJkodsiKOFkoeXg4ZjjJGYjpSJloyNiotxe5SJeo2IipKRiXmFe35se2Vyb2preXlbgHmPjYB6fX5/ho56eWhza3OLj4qChYV9lYxsfn9vgIx/jId9hHqCj5Wamop8d3iDkHlzbWZwf4NsanRvaGlzbVNeb2RwWV9rcXdma2piZnhycHBjX3dgYFZrX112T05LYGZjXXlxiXRcW2V2YGFlZY5jYWZhWGlzc25rcXaMfHR5hoF1dn6Lc3+Gf3uJfnKJh4GQioh8fph2ZXNtfGWIfm5wa4BabG55eXNhdnp7jXZyd4p3eZ+Lm66boJCChXeIlX58iZyHhZ+QjoWMl4STjoeBdHdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYN1hKKFkW6Vj5Sfk5uBkXCFi6OXiY2VipCdloOAlZCFiY+AkoqKl3+He3V/iXeGhI2bmpiZjo92inZuhomLfYqjhJGJnYWFXouUl4qOiI6LioSJbHyWgX2IhYmQj4Z2hX19a31kd3VqbXhzV4h6kYaFen5/gIWLfnhlc2p/io6Kg4J/jJaFa4J1boiRgpGFf4J6gJGWk5mQdXR4iI11c3FndXmCYnRtb2JodWdSYHFna1VfbnR5YHJjX2h9cHJuW2NyYWJXbllcd01NTGRmYV52c4ptW1xkeF5gZGWFX2NiXlhqcmtua3J2jH1zd4SBeHd7iXGDhH1+iHt0i4iIlYaMfn6Yc2h1cXlti3pudHCBWHF6dnlxZXd5hoxpdoCJcn+ch5innKOShHxwjJR4eYudhIWhjY57lY1/mYeEe3J3cHNqb4FraWx8dF5geHZ7cHV7Z2BlfOvatcnD3IhzbHOAdoqaiI1pl4+OnJSSgYhwhYigjoWKlYqNmJR8jZOIg4mPe5GLhpCCf3Z4g4Nyh4KSm5aUmIaMdod/cIWCiYeZooOUjJ6DiWGDlY+GiYaJjYeAh2l9lH99g4SJjo2CcYZ+f3F3aHVyaXN3a1qMfZKBhXx/g4CEioJ1YXRsiIGPi4J+f5KRfW6CbHmGj4aThH2BfYCSk5CXiW9yeo2GdWxwa3J4gF9zaW5canZgUmRxaGZTX3B2dGBvYF1ognFzaldnaGNpWG1XW3VMSkxlZ19icnOFaFtcZXleXmRne2BkX1xZa25lb2pzd4p+c3KBfnp2eohzhYJ8f4Z2d4qGj5iCjIF7k3ZsdnV5eJN0bnh6fVh5hXGAb2d5d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2KmoiJe59/g5l/gXhxc25vZHJ+aGZsd3dbX3l7enFxf2lhZ2F/1baOkKZ4bnF3e3CSkIyHapiNiJuRi4V7aIeLmYaBkpGGh5iNfI2NgYGJjXyQjH6KhXp1e4J7cIaAlZmOkpSBiHWDhnaDgIuTnZ+GlY+ffohhf5OHhIiEiY1/f4NnfZB/fn+Ci4+Qfm2CfIJ0a212dHN2dWtjjYGOf4V+fIR/hId+cF9zcYR8j42CfH+SiXpxg2Z6g4qHjIN8hX6AlI+Rk4RucHqMf3Vtbmpsen1iaGppWGx1WlJpcmliUWJyeGxhZV1aaoNtc2JbZ19lbF9uVFpvTkhPZ2VcZ25xgGxaW2NyX1xja3dkZV1cWmxsY21qc3aHf3Fvf3x8dHiGeIWCfX+HdXmJgZKVfIiGdomBb3d5e4STcG17gXdeg390gW1pe3OUc2dyiH1ykpGDmp+boIaHdnaUfm12k5d9h5CDio2afIuadn12cW9samF0fGdiaXV6Wl93fHptcX5lY2hoV52PXnFylrzDg3VxlIiQfnKWi4ack4yHcmqIj5aAe5SMgYSbjHyKhn18iYx/lIh1iYV2d32BcXWGgZ6UhZSPg4Jyf4h1hHyJmJ2Yh5OOnYCIZn2Tgn+Fg4mJcoF9Z36Le3h+f4eLjnxpgHyDdmVveHhydnNsao2FioGKf3iBgISDf2tecnh6fY2KhXuCj4B+coBpeYOHi4aEeYR8gZiNkIx9bm17iX13dG5oZ3x2Y1xwYldvclNTbnNoYU5mdHhlYF1cWG6Ab3NZZWFeam5gcE9Za1FEU2dhWmtubXxuWltebGJaY292Y2ZcXWBsaWNsanN2goNxbn57f3R1g3uDgnyBhXZ+iYGWkHiDinSBiHJ4eX6NkG9vfIFxaYF5en5tbXx2lWtqd4R0bJSNhZ6YoJmFiG59jHZqeJiOfoGKgpWXinmOlm96c3BsamRgdHtoX2Vxelpgcn15Z3F6YWVlj7Gyd0piWqTZ0JZxe5CKkHd9lIuEmZGLhW5rhZKSenmShoCEmIp8h394eImKhJaAb4yIcXR9eml4hYOlkISTjIN/b36DdoR5hZuYk4uSkJSFh3B7koJ9goOJg26BeGiAhXhyf3+CioZ7ZX1+hHVjcHJ/aHhwb3WYjYWCint2eICEeYFrXHF9coGIhYl9hol6iHKBbnGEh46EhXOEeYGZjY6EeG5vf4R/dnplaGp9cF9Zd1pYcW1OV3JzZ2BLbHZ0YF1bW1l0fXJvV2ddZmpxX25OV2hRP1lnX1twamd5cVpaWWtlWWNweV9oXF5lbWhmbGlxd3+Hb2x/fYB1b4J7f4F+gn92gYWIl4pxgo1xe4Z8eXmDk4x1anp/a29+dH99b3J8e5RvboF/eGaSioKhmZ2RgoZnh4NvZ3qViX5/hYGZioF8jYxpeHJrbGZfYW94bV9ib3hcZGuCemFxdl9lZdTqvooyOj6LjoBxeYWHjo12g5aMfpKNjH9tbIWNjHZ9j3+FgZWJfIN4bnaHhIOXd2+IhWt1e3RleYKDp4uDjouEfW5/dHaDeYackIyQkZKMi4Z+e5KGd3+EjYNsgHJpf354bXx7gYqDd2J5hIFxZHFofm10cXSBmoqAf4V+cnV9gHKBcFttfnR4ioOLe4eAfIh4enFsiIOPhItygXl/l4uLf3Rua3eAgHV1XGlod3BZV3xTWnBlTFpycmVbSnB3blxaWllddH51aFliW2dlbmNpTFdmUT1eZlxddWVfdHBaWVRvZFlkcXlaaF5fZ21namxpcHd9jmxpgoR+eW6AfH2Bf4J6dYKBjJOFcICLbnh+gHp7iJKJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjIyDm52WjIGAbI5+a2h+jox7fn+DlIJ/fYqIa3VxZ2hjW2Jncm5gYWtzYWhwiXlhc3ReY2SboI9uXDVZr7V0aYCIfJKGdoWWhXOOi4l2cGyFg4d1eYl4iXySiHp/c2d2iX5+mG9xhn5odnltZXmIhKSGgIeNiX5ufnZ/gHyMmYeCk5CYiIuEiXyPiHB7fYR7aH5ta4B7eml6doGHgXJgd4F+cWRyZnWCbXR7hZSRgXyBf253eXx0fm1Yb392dIyChneIdoKJenhzbomBj4GFcn59fpOJiXpubmpugoJ1bl1nZnNxUVt7TlxwXE9bcnBkVUtzeGlXWVlaYXGAdGBdXWBnZGhpZk5ZaE1AYWRbYHZhXXVtWFdTdGFaZG9yV2peYWhrZ21saXB3fJJraISJfHxwfn57gYCCeneAf4qLg3F7h29xd4N/e4mNj4Nqfntud3l2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiReH17gZGAgH6Kg3BycGNmXllnX29wYGBncGZqb4p0YXRvW2FkanZ7f76cpqPIuHGFg3OTfHiGk4JzkYyIcnJvg3uDdHWHdIh3k4h5eXFjd4d6gJNpcoR2Znd1Y2p8g4edgX9/jo59cn5zhHmAkZCCeJaNlI+Igoh7iIlreHl+dWd6aGt/eXNpenaAgn1oYHeHfWprdGd7f2l2gYyQlH56fn5we3Z7dH5iVnd9cnOKhIJ8g3GGind4cHCDgo1/fXl+fXaOhoN2aXFpbYiCcnBdaGNzbkpldUxeblVUWXNuYlFPc3hgUlhYXWJwgnNbYV1oZWRjamRRWnBJRGRhW2NwXl13aFVXVXddW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHl9cnt+eIGBgXx2fYSIhoNwdoNybneCgn6Ji5N/cIB7d3l6gYx0g3h/gYGChHqAdW9+iYuanoh9hXp3hntndIWMkHp/f3uJhoR2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhvjHV7ho6AepOJgHV0dH53gHBxf22EdJSGeHRrYHqCeYiPZnGDb2d2bVttfYCQk3+AeZKSfXh7bYd1gJCLhHSWipGOh4WFe3+FbHR2f21nd2Vte3VtanZ3f398YGJ4hnpodHVifXpndIWOjJV7dH91cYB6fG1/WVZ0fm91hId/gHlsiIZ0eGt1f4OEfXt9eHtzi4F9c2d0ZW6LhG1zW2pfdWRIbm5MW2JXVlV4bWJQUnR2V1BVWF5hcYRvXGBjbWRjXm5iVFxyR0JmX11maF5be2JRVVx1W1tna2FWal9gbmZma3FocHV4jnRrjox1fnZ4fneBg4F7c36EiIeDb3F/dHF1foWCiY2Ke3d/eIN8fIWHeId8fYF+hIB7fnN2eYuOn42Jeol2dIN5Xn2FmYx5hoN0hYaFd4l7Ym5sW2JbW2FWanNjYFtnbm9mh3FhcWZXXWNrf3zKzoi5omptbYpscYRxfISJfnuRhXp5c3l1dXtqbHVjhHWRgndvZl59gnqLiWVygmtqcWNYbHuFm4iCgXOXlHd+e26IcYGKi4dxl46QiIWLg3t5fnFxb31maHFibXhxamtxd3x8eVxleYB3aXV4ZoF2Z3SHi42UfHGGaW9+gHlufF1Ycn9tdICLfIJvb4l/cXZod3+Bf4F3fXF6dId8enJmc2FujIJsclhrX3dbSW5rTVZVXlRVe2thT1R1clBRVFZeYnSFaFxgbGpmY1luYVhicEdBaF1gZl9dVnteT1ZkcFlbamhdV2hgX3Jma2hyZ3Byd4Z4bpWKdH96eH55goiAdXJ/h4WNgnBwe3h3dXmGhoaLhnp8f3WLfn2FhISHf35+fYd/fHh2eXeRk59/jHyLbXaAeWODh5eGc5KLb4WFgXmCdGNuallfW11dVGdzZWBZZHFxZoFzYmtlV1tgaX93vq57oLdtYnOGaHN7cXmChXt9jH93eHJ2b3t2ZWpuYId1joFzamJefnh5i4RmcX5oamtaVm94iaOBhH9xmZNxgHh1gm2AgpGHc5WIjIiEiIR9eHRybmh5YGptYG12amdqa3l3endbZ318eGVyfW2EdGV1hYyGlX9vi2ZreoN1bXRiXG98a3V8i3yBZnWHfW1xZ3V+eH5/cn1renqBe3hwZmxibol+bW1Wa2B3VUpqa09STmhOWXxoYk5VdWpMUFRVX2d2g2ZdYHFoZ2FXaV1ba2hKRWtaYmRXWVV5Wk5WbWpZXWxlXFplY150Zm1kcWdyb3WBd3CZhXZ/fnd/fIWHfXVzgol/lYJuc3h6enNzhYeIiIR5gX12j398hImOhIKEe36Lg3t3fHd3mp2XeoqDhml3fXxsg4STgHKPgnGFgn6Bf29mbGZXXVtcW1RkcGRfV2NydWl1cGVlY1dcXGh/cG9ygHSJZGR4fml0dXNzgoR4gIR5dnN1bmt6cGFna2eGdI2DbmZdX31we4l+aW13ZmlkVVZyb42mfIR7dpaQc3tzfHpue3uQhXaYfIeGg4aDfHRwcmxndVxtaF9sdGRnZml6b3tyWWeBd3VncIB3gXVid4SKfJSAbotpbXqBcWZzZWBtemdzd4p8fmJ1g3Zpa3F0enF5eXN9Zn5/f3h3bmNmYm6GfG1rVmpicFNLaWtPTE5wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWZgVmNXYnBdTEtrWGNhVVRVc1ZMWHVkWl9rYVxbY2Vfd2ZtYnBpc25yf3R0moF3f4B3f36GhHp9dYKEfpeFbnJ0e3p1cYSFj4GAeot1dJB/fIGUjoCFhH1+jIZ7foB2e6OlinmIhYRsdXx7dYOCjHpuhXN5hH2Bg3VuamhlVl1bWlpTYm5kW1hic3tpaG1pYGJXX1ppgGprb4Bna2FoeXhqc3R0bYSBe399dnVte2hqeWpfZW5ogXaPhGdlWGJ3aX6He29pb2dmXVVYb2iPqHeBenyQjnl1b35vc3V5j4B3lXSFgn+Fh3VqcnZnaG5bbGRdbHJfZ2FpeGh7bVptgnJzaW+Afnl3YHeEhHiPhHKHcW95f3JjcWhcb3dkcXOIfHhic4BwZ2p4c3JseHd1d2SDe393dm9kZGNufH1rbFVpYmZTS21oT0dSa0VheGdhTVNxXElNVFlla3d7ZV5tcWlkXVZfVW5uV0tUaFdmXlhOVWxUSlx5X1tfa11dWmJlYHpobGFvb3VucHd1eph9d4CBeoB/h4Z6eHqDfoGThHF0dH56dnSFiJB9gH2Qa3OVgHuCn4V/h32AfoaCgIp7doSsn396iIeEbHKCenaAgIF1bodvfH9ziYBqb21kZFhfWllaVWJqZ1xaXnWBaV5ubFxhVlxca4FmcXR9aWlda3Z1Z3R3cWyFe319eXZybHpoaXhmXWRzaHp3koFjY1RlcGeChXd3ZmhqYFdWWWdjj6dufneAi456cHB8Znlveox7do5xhH1+f4ZuZHVzZGhoXGtiXW9vW2dfbHVkemhddIBvcmtxe311dWF0hYp6h4Z/f3dydX91YXBsWXF0YnFyhXx1ZHJ/bGFsem9qaXp4dXJmhXV6enVwZGFkbnN+aWxUaV5dVEtzY1FHVmFHYnZmYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVh2ZVRKXGNXaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bXBudoOYeXKBgHx/iIuGfnV1hnmHi310dXWCeHp6goyOfX6EiGpzl4F6ip19foV6gXp+fIaIc3GProx7e4aPfmZyiHp0fHx2cm+GbHt9bI96YnBvYmVdZVZZWVZjZmtgXVxzhWhYcW5aXldaXGx7Y3B3dmxiW2xyc2d0dXBshHl+gHl3bm50ZWl0ZVtndWZ2dpF6X11SZWZqgoJ0fWJjaVxUWF1iY5ClaHh0goWQeG1ueWd4bXyFe3WIcoB4fHh/aGV2bGBmYF5qX11za1llXW9vYnplW3d7a25ucHd4c3RkcoOSfoeCiHp1b3J9cmJ4ZFtvcGFxcYJ8c2ZxgGRebnZpZGd5enRub4F1dH1zcWJfZm5vfWRqU2hYWVRNd19RSllZSGJ0ZGFJVG1TSUxaV2lscXtibGxzY2FaWlthdltTS2ReWGlTV0dZYE5HaXVYXmFtW1tfYmJdhWhoYW54eWxva3aBkHltg36AgZKIhIB2dIl0jIZ0cnd2gXd8fX6Mj4B+k35weJaDfJmSeYCAeHl9f3SIg3NwmaJ7e3+IlXhkdYh5c3h1bHRvfmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYhlUnJuW1pYWGBsd2NpdWpqXlptc3Fsc3NzaoV8fn98d25ubGRpcWNbanJkdHaOc1tXU2RhcoB/coJdYmNdU1pgW2OSn2VycYWEkXRsanlsb3B6fHtxgHZ/cnp5eWRldWhdYlphZ1ted2hXYl1vaGF3YFt7dmppcm53c3N0aHCBlIKGfoN1cmpwfG1md1dca21icXOBenNmb35bYG9xYl9qcX1sbHR+c3F4a3BhXGVsbHphZ1NnVVdSUHZbUlBZUkljc2JgR1VqUEhQWlVra2t8ZW1vcWFcWlhZbHBXUlBmVldpU1RGWlxPSHJ0WF9jbWNYYWBhXYtqY2RteXhrb2l1eYZ7a4N9gISZfIKEeX2Ibo+GcW93enx0goJ8i4+Dgpd0d4KUhYGfiXWAgIFzf4Fwh4J1b6KXdHuGi4Z7ZXiLbm57b2Z4cHpsc3ZyjGtedG5hZ2VrUl1bVmdibGxaXHGMZE9vbl1WWFVnanRnYnRlZV1ZbXRtcHV1eWqHfH98iHeQc2Rka25hXG5tY3N4h2taVFZiY3h9fXGFXWNfY1RaYFljlpVjbnCDhYpzamh6bmVzdnN8bHp0dW95fnVeZnJjW15WYmRYYXVlVV9gbWRhcV1dfnBoaXNxc3B1dWpthJOBiHuEcXJmbn1wcm9TW2ZqZnF0gXdzYmx2VWJxaltfbmV8ZW12fHNyc2ptYFpkamp3XmZUZFVWUFRtV1FXU1BIZXJfYUZYaU5IV1RWbWhkfGlreGtiV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWmJgXl6PbmJma3l1bm9odnZ/f2yDgH2Gl3t/iIGJfmuTiHJndIB7dYCDfYiOf4yTc3yKkYWHn4Z7f4aMc4CGc32Ddm6ljHOBjYt2d216jGBkfHBmenN5bG1xdoJnZHtsY2ZnaFNeXlRnYGxvW15ujWhOam1gVFZTb2dza2V3ZGVdWG90bHJ6d3JsiHuAdpx7emthZWxtXmBvamVweH5nWlZYYGt4fHtwhF9iXmdWWF9XZJyIYmtxgYd9d2treGxbdnFseml1c25ve4ByWGpuX1ldVWFjV2RxY1NeYWlhYmxaYH5sZmtzdW5td3ZraIWMf4h6h21wZnB8bXJtY1lhaGlvdIF0cl5pbFJlcWRUYm5iemNxdnt1a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVwXWNGWWlNSV9LWG1kX3hobn5kYFVeVF10W1RSYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNuZ3Z0eoNygYN6iI1+fIqHjnlukIp0bHOCdH9/iIWGkYSVj3l+jI+IkZuEgHyMhHN/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2MjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2trrB/a25ubm5vamZnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0t3xlaGdnZ2hjX19fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRi4qKioqJiomIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5CKkY6NkYiPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyNjY2NjY2NjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeJh4aJhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhoiGhYWFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+JhoWHhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aIhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY6Mi46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7e3x9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpKSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZ21namdoZWhnY2JiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpeXVlZXmJhXl5aWV9bWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PUFBRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JERERGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs8PDxITD09QUE/QkM9QURERkNGRkRGSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTg6PDw+PTs7Ojg6QEBBQj9BQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk6Ozs4Nzg5Ozo4PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PTtLZUA9PT49PDw8Ozs6Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5APz0/PWt4VD1DRT8+QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZEPzw8PUBNTEZId3VZNzw6PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQEluUDs9ZIGCfnV6dlM3ODg6PD4/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkM/V3t5UmWEg4ODhHx4Ujw9Pz1CRkFEPzs8PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBZdHd7goGBg3yAg3tMP0BDP0pSPU1HPDw9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBP1J1c36Ae4CEe36GYkBDQ0U+T1tMbWhJQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRmt1fn95goSFhYZ9SkRGREJjfoWIiX5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHXXh/goOEhIaGh41qQUJWdIWHh4eHh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExMWH+EhYWAg4aHiX1TbYSHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpehISFhH+Bg4aGhIKGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWqGhYWCgIOBgoKDhISFhYaHiIiIiYmMjmZEQz04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJZ4aFgn+Ag4SDgoKDhIaJiouMi4qJiouMiV4/NzY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JqhIGAgYKDg4ODg4WJioqJiYqKioqLiYmKgkg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojs4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I5QXuEgIKDhISEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk5PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz1Qg4KBgoSFhIWGiImIh4aGhoiJiImLjIuJioqMbDw7PkFDRUVBQUFCPkBCQEA+PT4+QD8/P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlmFgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4mLXj5ER0lLSklGR0dERkhHRUJAQENFQ0NBQkNCP0BESEVDRURFRUFGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFARERFXoaCg4SFhoaGiImJiIeGhoaHiYqKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkNISEpdhoKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExNS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw7PD06P0A+QEBDRkpKUWOCg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEhFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QEVJS01WcoOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4tfUVFQTU5NS0pHRkJHSkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FRUVFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSExNUVd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVVFSVFJPTEtKREVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0dWTkZPUVFVWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVWthRVJRUVBKOztRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTVJQUFBRS0tLSEhKSEVGSUhJSElpcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLhmxbZFU6WFhYU1A+QFZVWVtjYFZZYnJeXVZdWlZFUVlaW1lfVFlnUlVWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6enp7enp8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnSDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWFNWVFdSUVdVYpaAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT0xLZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpbXF5UUVFQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1c3N3e3p7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dDQkFEQE9QTVNkc3R1dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiW1hTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz8/Ozs+QD8/Pz5rUUphRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNDPz48PUI+Sk1GVW51dXVzdHZ4e3x6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXt4enx8eHd4ZEJAQEI9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztCSD9cdHR1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJYR0ZGSEJBRklFRUZETVJQYVdSWFFQU1NSVVtPT1FXUE1KQ0Y+Ojo2NDg2OTc5OjM2Njc5NTxCPWV0dHZ3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYXNrYWFfXWRgX15ZVVBNT05MSEhKS0lIRkNRUFNaV1RUTVFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KT09UU1RcVlJVU1JPTUtJSEhGPz89Ojc4NzY1OTk2NzY2NVdwcHN4eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KSE9QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYVFTUVBOUFFQTk5NUE5UUlBSTUlMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjQ1NjY7ZXBxdXh4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVCRkdHSEZKREhKSEdFSExIS0hGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRUZISk5LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t9fHx7eX17en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUV1dVTExLSD05ODc7P0A+PD1BQEI9PkVIR0RGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU09PT0xMT01LTUxNT05bV0tNUU9HSUhDSUpMTEpGRkZEP0JDPjxCRj9CP0FkcXV4e3p7e3x7enp3fHh5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0JAQD5BRElFQ0hHSUdJRUJCPz49Q0JBR0lETU9hZVFNT05XS0xNS0xNTUxMS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkJBREVHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTVFUTEpJTVRGSUlKTEpLS0lJTE1PUFJQS0dDS0dDQkpKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0RHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQ0NHRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0ZIS0RISUtNSEpMSEhKTEpNXVJJSERNRkFES0pOTVBOS01KS0ZHR0pNTlFOTGNuaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0RFRUZFR0JDQD48PTo7OjpAREA+QkNERUlGSkpMRklJR0ZGREI7QkNDPj9DQ0NFR0xOR0tOSERIRElMTk1ISUxHRUZJSUxOS0pIRU5IQ0dNTE9NT01OTk1MSUhKT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQkJCRUBEQj4/Pjo7Oz06PT5DQT9BQ0VHSkdJSUxIR0dHRkVDQD1FRUI+QUNDQ0VHSElHTVBJRkZGS05PS0ZISkZFRERJSUhLSUZIUEtESU1MUE1PTk9PTkpKSU1SVVRST1dkYGFtZ3Byb3J5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzs+PkBCP0BCREdKRkpHSUhGRkdFQ0JBQUZGQ0JDQkRFREdHSEZMUUtJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUNOT01RT09PTk9PS0tLUFVXVlVUWGBeXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmprc01HR0ZIQkJBREQ8QUFAQzw4OT0+OT88P0I/QEBERkhFSEZGR0ZFRURDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LT1NORFFSUFFRTk9NTlBNTE5TV1ZXWFZYXVpdZGBoYmppZ2tfZWVnY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaW96TUhHSEhCQkJGRTxAQkJEPDc6PT46PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkdKRUVJR0NHSEZIRkVDRkpKR01KTEtJSkxGSUlLSEVLS0xNTk9SVE9JU1VUUVNQUU1OUU5NUVdaVlpZVlpdWlhhYGBgXmhlY2BkZWhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnByc3lOSEhHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPD8+QUJGQ0VCQkdEQ0VFRkdHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMS01LSU5MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZW15fXmBiXVxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZxdU1JS0hKRUJFR0U8QEdDREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREdFSEhGSEdJS0pGSkhIS0hGRkxISEhKR0xMTExMSU1LTk1NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm92SktMSUxHQkVERTxARkREQjs/P0FAQEBEQT9CP0FDSEJFREZHRUlFRkRJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QS09QUlVYVk1OVFZVU1JRUExOVFNSV1teXl9dXWBfYWFhYGJjZWFjaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dKTUxMTEdEQ0FEPD9FRUVDPUFBQ0JCQ0VCQkRBQUVHQ0hHSEdFSkZDR0lHR0pGSUxISkpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhYmduaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xNTEtMR0VBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NCSUZDSEpKSElLRkRLSkdISklJS0dKSk5LTkxJTEhKTUtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVGB3dWlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5S05KS0pGQz9AQj89REVGRENEQkVFRUZCRkZIQ0RKRUVKTExKTE1HR01JSElLSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXlta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz1DRkdCRkNFREVFRENISEdERUtHR0xNTUtNTUdKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncXBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRUVCQkI9P0BGR0JHRElFRURCRklISEVHS0pHTU1OTE1OSExNSUxLSEpNSUtKSkpPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdoYWRqdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRUNBQjxCQUJGREdGTEhFQ0NIS0hIRkpMTEZNS0xTUkxHTUxITkpJSE5ISkpJSE5PTU5MSk1NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2diYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTU1JS0pLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpKS0tJSElHS0tLS0ZISkpMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RT09RSklOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NHQ0VHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0lMSkhGSEdKR0dJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWFxZWlhcVllcXWJfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElER0dGS0pLSEVFSkpKR0VISFBKTE1KTVNJSEVBSEZKSUtLSUxKSUZFSkdERkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFhZXl1jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tGRUhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRENDRUFGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV5kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkRHRUJFR0hGR0hJRkdKR0hGSEtJTERES0pOTUxMSEpKSEpHP0dGTkpLS01LS0tJR0dDREBEQUhJQT9JSkdPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUE9cX2FjY2NjYlxkY2JkY2ZYUVVUU1tYWmFeXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSUZGR0hHR0lGRkZJTEpORURLSkxOSkxJS0pISUdCSEhRTUtLT0xLS0lIR0VEP0VCSEhBQUdGRFRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJgYGJiYGNiYmRkYlhPUVFSW1NbXl1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTE1LS0hJQ0RBRUNIR0JBRkVCVlVFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJdYGBfYmNiXWJiV19fVFBOUFFYUl1cW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQRFdfSUdHSERGTUpQUEVKSUpLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FERkFMSENMTFBPT0xGTUZHSUpIR0xMTU9QSUxPUFBTUExQVFNVWllXWVhYZFZPU1RQUE9OUFVUXFlZWl1cYGFkZWNoY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHSFlNR0hKSEdOTFFRSUtKS0tOTlVOT0tLTEdHS1BTU05QT05OTk9IS0VgRURfTERmY0RNW0heXHNtT01WbVlMQ1BgVWxXZ0pdV1VeRExRVUxNVFZRU1RYV1RYVVRcVFBmWmhoZFhTa1RXVlVbXFtgYGFiYmJgZmhmbmxocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtHYFRISk9KSU9NUlFLTEtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzV1BtSHFucGFWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X2B3YFhhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEZKTEZSVkxLT0lLUlhXUU5OTkxRVE5PUVBLTE9HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb3CBXWV6dXhxcXpxfnN9a3V9YlJnfGVzc29zc3x9b315b39yX2BgYmJaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtKSEpQTk1NSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dRVFBQUFFLR2Z4bGN4cm1aSkxVeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3NRaHptaWp6en1seHp/b2dvWHZ2anV1cIBgc2h8aWx4fG9eX19jYltdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk1KU3ROQ0JFUFBISktKTFBPT1BNUFpgWlhLVFdQYV5SVlFZU01QSVNUVlhXV1BVUE9OUkpLcm91dXF1cWRoYFZuTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vZFJncnVubXlwd2x2dHRxbG1cdH56a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tS0tbVkhHRUdSUEpMTUtMUVFRUVBRV1xZVU5WWVVmWFJSWV5UTU5JVFRXV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ7XVRLbGB2dWtpdXt7bX54a3xwXV5eYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobG1yfGttaGt7dG1ta21PSEpLSElJSFJQTE5PTUxUU1NPVFJXUlZUUFdaVlZUVFRhYFFPTktUVFNRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZX1tncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraG96aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1FRVVVWU1pRT1NSV1VUWVZUWVVTUlVTVFRXWFddWl5hXVxaWlxcYGNcXWJjZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLTE9PTE1UUE5TUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVRZVVdZVFJSV1VVV1tZWl9dVVhfXV5dXF1hYV5bYmJjaGZlZGJYX2BiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVU9XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVlZRUldYVltbV1FUVlZVVlhUV1dUUlJYVlVaXVldX15WXl1eYFxcYGBfX1piYmRoaGVkYVliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVZWW1xXUVRXVVdYVVNYWlRTUVpXVlxeWl9fYFVhXGBhXWBiX1xgXWNhY2doZGZgWWNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeYFteXmFgX2JcWWBaUU5PTlZRUFRST1VUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSS1FUU1haV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlSU1lcVFJSXFdaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZmlkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1bYFxgVVxdaWpyfXNsZ1xVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZWVVNPVlJTWlJUVVRYXFdYWFNYXFheXVlaXVRVTlZXV15bWFFUVVhYWFRWWFtUU1ZdWV1dYF1iY15ZYFtlYl9kZF5eY2NhXWVmaWRmXV5kYWBhYWNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVVZWVFRUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVFRVVFZZV0xSWlZdW1xST1VTWFdWU1BYUlNXU1ZWVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paU1RWWllaVldZXFZVWl1cXmFhX2RkXV5dXWVhYmZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRSWFJXVlRSVFhSU1ZUWVhZXV5YXVtVXl9YX19YXVZRWVRZWlphWVxVVlhbWlpYWVlaWFZdXl9eY2JhZWVdYlxgZmJkZmRfX2RiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaVlNcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFlcWlZYVVdbWllbWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdbWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVtZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFZYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xSVlhRV1ZWVlZWVFZUWFxcX2BgXWBdV2FeW15cW15YVlhYW1pfYFxfWFldXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWlhbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBYV1hYWFdWWFZdXV5gYWFfYl5ZYV1dXlldXllYVldbW2BfXV9ZWV5dXl5hXFtaWVxfYl9iZGNlZmVmYlpkZmdpZ2NfY15hZmRaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVdcXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FiXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNgUlxZT1hXWVtaWVhaWWBdYGJiYGFjX1xiXV9dW15eWllVWF1dX2BfX1taXl5gYmNcXFdbXWBiYWNlZGdlZWZkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9cXF5bWF1bXl9hY2JhYV1iW2JkYV9jY2JdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxdXl9aWFZbX11cYWFfXVtgYWJlYl9dU1xfYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent7e3t7e3t6enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6ent6enp6enp6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0s7O7vr6+vr69ytPS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/wMC/v8nMzMzMzMvb5uXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXp6enhvb3BwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2AgYGBgYCAgYKCgoKCgoSEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnh7d3p6eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp5eXl5eXl6enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx7fH17fXx4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHx9fX1+fXh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6fH17fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en18fHx7fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h6enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8e358fX5+fn5+fX1/f398fH2Ag4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAf35/gYCAgH+AgYF/fn+AgX9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35+gH9/gIB/f39+f39+fn5+fX5/f35/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5/fn5/f39/fn9/fn5+f4CAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/gIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCgoKHg4OCgIKBgYKCgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCBg4GChYWFhYaGh4aFhoaHiIeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSDg4ODgoOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCh4KBgoKCgYGBgoGCgoOBgYCAgH6BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKBgYaaiIB/gICAf4CCgYCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgYOEgoKCgYGFjp2Mg4KEgoF/gIKBgoKBgoSDgYGAgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KGhYSDgX59fICTnY2DhYSDh4WBgIGCg4KChIODgoGBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+AhZSLhX58fX1+e42fi4GCgYGLi3+GhIKCgoGCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f36GnpeHfX+AfouFgJGEgYOBf4+SgZOLgIGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIScoIiBjIJ9hoV9goSDhIKBlJiCiYiAgoKDg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZSfhYSIhIeBgH5+hYWFhIWOhX19fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiJCBgoGChX9/fn2Ch4aDgH5+f39/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4KAgICJhH9+fX+FgX9/gIB/f39+gICEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkZGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAg42Gg4B+foB/f3+AgICAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOAgIGFhIKDgoGBgoGBgYF/f4B/f357eoGLjImKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCBhIWEgoKCgoKCgoB/fn19fX1/fnx6fI+MiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWDg4WEg4SDgoKCg4F+fX5+fn5+fn19fn19foOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYmDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDg5GSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhYCBhIODg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGhoeEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4KDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn6Ag4ODgoOCg4J9fX5/gICBgH59fX19fn18enp6f4KCgX9/f39+f3+Afn2Af36AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gICAfn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn5+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCAgIGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOAgoOBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhYSDg4SDhYSEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgICCgYKAgIGBgH+LlI+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRjIyNjo6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2MjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fH+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuKhoSGhISDg4ODgoKCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42Mi4iEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gH+BgYB/fYB/f35/fn5+f398gn5+fX19enx9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4WBhJGOjIuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIkY2LiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH19fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fHx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGBgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICAgoF/gIGEgX5+gH9+foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYKCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmGhoWFh4WFhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9+f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgYB/foCBfn+AgoKAgYOChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/g35+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/gYF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg39/goGEg4OEgYGDgIKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEf4CDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYB/goGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGDgYCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICDhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgYSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fX5+foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWEgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId6bX1yc3Zzdm1ud2xweWx1fX9/fX6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3t/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYSFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhISGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoeGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaFhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx+e3x8e3x8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2AfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEg4aChYGBgH9/gIB+f4CCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aFhIaHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1NXU1NTV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29zc3Nvc29vb29zb29vb2tPS09PT09PU1NTU1NTV1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjI2IgYKBgYGBgYGBgYGBf4/T0tLS0tLS09PT0tPT0t3j4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZXTkNDQ0NDRERDQ0NEREBc0tPS0tLS0tLS0tLS0tDg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/ODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaW1NISEhISEhISEhISEhEYNHT0tLS0tLS0tLS0tLQ3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZWVdU1RUVFRUVVRUVFRVUWvS09LS0tLS0tLS0tLS0t7p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzMzMvLy8vLy8vLy8rLzMvN1NTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz8/P0dPPz9LU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tbX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHP0rif0dGcgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2t1bKXmLi6lbi5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIiancydo6ix0ZJ9fq+w0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZnCxYibttXTzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5Sfy9elm7XU08CgoNDP0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEmNTVopq11NSvoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkJ7C16KZtdTTo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qiZr9qimrbUzp6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWanrTZo5q118OfodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp5zL16KbtNmypKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI221tWyhMbWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dLS0cTV0dHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/Pj5BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw9OTs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc2ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+fn5+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo7PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/OzpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6ChoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QT4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnp6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiZl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVnJqdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipKmnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6mnqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqtqKirsKmoqqihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PjxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGin6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopKGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6impidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYW1odWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0NERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb21ocXhveWppYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3lmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDw8HEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbO/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMnIyMnHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBx8HLy8jGzMrNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVvdGJdYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBwsO/v77Ey8jKy8m8utXWyczIw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnZGplYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDubi5vL3Bx8HGucrKnMHGw8DEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e9xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmdjW1paXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9wLm+urq0wLi1t7Kuuru2wLnam368wr7AvLvEvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vsvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCnoaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmJnamdmaWVpXVZWVFlPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre1uL3JyoOEpce6w7W6x7i2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGhoqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHFtZWVmb2lla2hYWE5LS0tSSUxIQzk9OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88OTc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e5t7q7uru/0al7f4m6v8e3ubitt7W4urS4s7vFxsvBvMbAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJidnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2kr7C2ubK9vrvEtre3ppinpqe2xMiMeX6FucnPwsC4rrW1vL64urK+xMTKxcHKw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFmbGludG54Y2diW2NRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C60dO0u768xbq0jm5ocGNreZ+se3uChbvR0czKxLW6wMPIv761v8G/xsa/y8bDv8G8wMPMysfFxsC5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDPDs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLGzxLLG2by9u8etjnhjYmpOUlpgfnl/hYm8yszLzcrGwsTLzsK8ub25ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8uL1pd73Ov7ivb1liZFNsZ1NRUVtzfYSPu8PHy8jBw8HAycrCwLu6sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpJ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u8HAdGl9q762cFZKVmpJWoF3c1RQZnyFmry9v8bAucC8vsXEvb25srCuuLe/w8fDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f312bHV6cG5pW19fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkNCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnJv3p3aX+pl1ZPSnd0TVFseYN7UFSCiaG3uLfCurO7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGso6irqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9mXVpUSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa4yMCDfnNxk2xPSFyJaE9PT4GufV1LeKSosbK3vrmytbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZxbF9jYVtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8S7jIN7eH5hSWCMal5RT16Bro5eUE57trawtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTUE+SUJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i6wZuMhYl+U02InnhqWlZsXnWHbm96pby2sbS1srSvrLu6uLa6wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7yqkI2WmkxVir1ke4KJZ2J7amJtdqC+uLK0s7CxrbC5uLa+uLu/srKyrrGuua+qq62so6ihnZ6el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ysKSapJ1MYH6PeWx5fWNhamt0eW2CpLeyrbOvrqyutrazvLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj4+Qk5CXlZaYn56empiml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR1BNTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqbS/s7NvYYVvaWlXY11eU1RZY2FccXuitqqytK6qq6+wsrWtpZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mao5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01KSEdPUk1KTkc8RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqKGmw8OQVXVuZm9mV1tRSEVHSUxLTmFle7Ovr7O1qqasq6KcmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHl5YGJSVWBJSUpLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWenbuyg31hX21hVEhGUUtJRElHRUpVWVylsrCwuKymoZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKxtKqyr6KZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk9VTFNMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuim56jp6F/Z2hfVEdJVn1+aFNHQ0JGTFBTirGurK+nn56ioJeRk5ugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFJVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaGPd2pbUUpGTHGgp6BsTkVCQD9CVIOgq6qppJ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+nqKWkn52qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JXTkpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKSgeWdcUk1LSlKN2dnAj3VkVklEU5GsqK2pqqWfnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3VycGhXW1FFVEhESlBJP0VBNEZIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfn5qgnm5WTkxOTVZnodC7oJe4ppCJmK64rqejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsHGvrq0urq0u7ewtbKqurKuu7e/u7qqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGpkWltGS0xFRFNMREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaKdnJVgTkZKTFZrfqe4qoaM1NbGv7eon5qcm56emZeXl5KMjpeXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczQ0tXO08m9wL/Du8bFyMXR1M3T0NPTzMrCxsbHysjOv8jRzMfFx8XBvMPBvr++tb6zrr+/wsPHxMfErr+4sri8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOfnJ6UXEpCSExoeam4oZB/scu7r6minpyfmpiWlJKUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LV1tPTyMzHzM3J0s3O083FyMnKwcbLx8jJxr/Ds7PIxMvKy8/Gyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2gomxKSkxVdaLN0ruhpLOqo5ycnKCkoJ2alJSVlIl8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDW1tbS1s3U1tfU09HT1NTTz9LD0NPW2NXW0svJztHLxs3SytLW1tnV19PW2M7Sys/RzM7QzNLPv8jHysPMzMzOz8XGx7a/yr/RzcvPxsnIv8PDyM7Mz9DPzcrHzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSEk+O0E4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoayBZXJ2kLPR29G9r6mZlZignJqgoJ6bnJmViXdpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ2NfY0djS19nV1szPz8rN0svO0MDGwsfFzs3R0dHIzM3AyszF087LzsjEysfGyMzK09PR1c/SzNPBucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV5WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaWhgoqStNLS1cKtpqCXlpiam5yfnZicnZN9cWVjY19fYV9fYWBfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY2NfLyM7Eyc/MyszAyb/Hyc3Oz8vQzc7Mzs/Iy9DQys7KwsnHyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPTMzPD04Nzg2NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramngWyIh8DVzLCbm5aUl5uenp+clJaYlIhrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29ydHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Hzs3N1MzO083L19bQzNHUy8zQ0tPKztHV0tXVyr/JwcXMwsjJwszDxcjKys/KzczQzdPLxsjPzcjHy8XGwcXKzM3P0cbQzs3NzM/Fx8G4ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV5cHFrbWdgYHBoWFhoVkxGTElQUEI7Qz47Njc6ODk6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKigrGpofpPW0KqVjo2YlpGTkpGWlpaQi3xlYWJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svRz8W6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL7Ax8zLy87Cy8vIx8vQxMXIu8fDycjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7utpaVfbXeq1KqQjo6XkIeEhISCfoWFf3NgW15eXmBeYGNkY19dXV5fYGBfW1pcYGtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLLycHCzNDFzMi/ucG7xse+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xry8wMPFzMXFu8DKwsXH0sXByb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3ZzdGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srKVXnB3uLSPi5OXh3uBhYaAdnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy8urjBwcLFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDv7zBzcPGvb21wb3Dur3Gu8K6s7zFxMHCtr+2tb2/u8zDvLW6yLq/vsvEwcbCxsnGyMbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztHKysrHzc3O0cjQxtXU1tfNys/FycXHwbnFvauvhmBzg7CSjImLhXmBh4eAfoR8dHRjW1xdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLOztLy2vbG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bBwry4vcbBw7u1rrK2ur+0xLe7tau4vb3AvbG6tq+2urPFvLeuu7+1t7TFvL7DxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcXAvrq4ybWpsYZoc5OejIaJint5foaGd3iCfXRpXl1dXV9gX2BkYV9kZWNfX1xbXlxdXlpbW11fbHBtaGZqbW5yfKTHv7i4tbCrrKeeoqqnnquts62qrKm0r7ewsqmupqyyvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLCnsrO1u7yrrrWlrrWuu7Kwqbmwrbuuu7i7wMC9ucK/x8PFwbzGwsjLuMXHxb/Gw8O6xMbCu8bJzMuzucK8u7OIc3Z2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx87Bw8a/xMTDw8rBycq+v7zAurK0tMOuqa+Ja2OJk4iOkHx4foqFenuEgXduXl1cXV1fYF9fZGJhY2NiYF9dW1taWl1aWlpaXGVub2hmZ2lrbnKBrbmwta6mpaenmqCloZqcpauupKiirKqsqrCjpp+qrbW2sb25r7evqa64tLS8uLS8r7i5tbK7wbLArqWpoquxsrOovaqrqKusrbSzpqitoaSvqbKmp6iupqi3rLGyt7q6u7K8vb6+xL+1wsHHyLe/wMW3xMK/u7/Ewr7EyMzKv77EwMCph3N0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvJtr3DvrrJt8HDwbS1u7WwrrS7raioimNni4SIi4B7foB+eHR/fHN3ZV9dXFxeX2BeX2NjYWJgYF9dXVxaWFpbW1lYWlxfZmtmZWdlaWtvcoWqpayloJyipZSepJuYkqGjqqSin6alqKWtoJ2cpaassq+2t6ewq6iqtKu0urG2ta62ubKvurqxtqSgpJ+msaerqLmqpKanqKeyraCnpp+bpKasnp+no6Chsa2trLK0s7Swtby2u8HBsrq+w8GyubnDs8C9v7W4u72+vMLHxMLDvsDEoIN4cGthZl9rb2BUWV5ITmdPVEhFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8jLwsa4t8fBzL+4ybe7xbizxLizvsCrtbuxq6Susqygoo1he4eGhoF8eXV0b21rampxaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeWm6GWm6KYlo2eoaOnm5+gpKaiqJ6bopufq7CssbajqaqqrKyktLmtt7Css7WusrWusKqfnZ+korKkpqm4raKmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2u7u6q7OzurO9tLaxsbW0v7a9wL3Dwbu7vZeDe3NrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vEw8++uce4t763ssG0sbu7q7i5sKGeqKqml56JZYOFhn94cm5wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1hYWFhaXmJkZWVmZmhpa3KNp52UlZWbmJuilpaRnKKiqJ2bnaWmoqacoKCbma6ura6yoKWirqunorWxsrKsqK+yp7qzprWgop6bo6Gto6Kqtaqio6adpqajlpmel5mbnaCal52dnZytoaunpKSmrauztKq1sLOrsrm0r6qvsrKzt7Ouqayusriwura6vb+3s7GUhXl1ZV5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWkmKWxwrW2va20uMLMyMa/xbbBv8fOt8DEvbO5ubK/trG4uqyxtK2emaOon5KafWiAg4R/eG9xdHFpZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqKclJSQlZeXoJeZlZignqGclqGiqaSfn6mdnJqrp6+wqpujpLiqoaCuqLaqpqetsKS4sKS3oKKbmZmqpqGarLiwoqGknKKfn5OUoZSWlpuYl5aXnJWfqp6qpKKdo6qqsK6otKuqp62ysKWrrrOxsLCur6anp7KusbSwvLS5t66jlIF5dWReYVZZV1NSVEtNXkxPS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri9rp2nqKOqu8C9wLmutLjBzMfFwsO9xbfIzLLBwsGtvLu0u7y0uLmvrq+om5igp5OQinR7gHx3cWlscnRwaWhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmqBlpOVjJKUlJuZnZaWnKCcoJahoKempKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsK2rtJ6gnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJKXl5iXnqecp6GimaOlpaukpbCnpaOrq62mqa6vrquoqqmzpaasr7Sxr7y1sa+uoJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxse2xsSzwr/Fqre3vba9urq1squsppiXnqKLiHJ9iH52bmNiZmloZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWVtXVVhXVVRWVVNUUlVgYF9gYV9gYWNkaYGUk4mRj5STlJ2UlZekmaCXnaGmoq2mpKSjo6KcqqulmZ+lsaqgoZ2lq52noZ6trKmprayhoqKVmKObnJCrqbCbn6KfnpeZk4mekY2Sk5aQmJiTnKGjnaSgopWgoqSmm6OrpaKkqqSrrqWusqmmpaamtKapqK2ztbS5uq+prJ6LcnBvYFtXVlVSR1BPSFpbT1JJVEtTTEVGSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4tMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm9sb7EyayxuMG1u8C7tLOoqaSUmZqbiH5wh4N7dGlpaWxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eX19fYmRtjpCEkYeQkY+Zk5WTnJujnJuhqamrqKynqKakmaWupJSZpa+pn5uZm6Cerpmcq7OgpaafoqOhlZOblpaSqaqtmpygoaCalJCMmY6MkYyRjZaVkJ2hoKOcm6OVm6CjoZeiqKOiqKugq6+jrbelo6OirK2qqKuvs7ezvrWzq6+YhHRzaFtYWFNVUUVYTFFbWE1UTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDAtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62os7auqaevrpupqKu3tqy7yru2v6zLxsW4wc7PyLPEu7e7w8ixrbi/t7y9urKzo6eelJaXlYZ4c4B2d25taG1ubXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH6NgYt/jJCKko2XkZeZoqCboKuqpq6sqK+kqZqfrKCVlqSop52XkI+anq6WmKiqmZ+dlKWgnpKQkpGTlaerpZqZmZ6elY2Mi5OGiY2Dj4uSlZGgnqGjl5WflZqhop6Um6Wlp6iooLGwprG8p5+jrLSrrqewtbC5tcCxrbGrkH1yc2JWU1ZOUklGVlBSUUxMV01KTE5SR01KQUNGREM+QDY1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqaisKudqqepsrGltsa0ubqzysW5usHL0Muxtri8vsHDsbCyt620s7qysaGhmpuXlpKCfnZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWFxcXWFqgHp/domNh5CKl4mUlJibmZ6pm6CqpqWrnaiaoaWbk4+fo5uXl4WEkpujj5SjnZaWloiim5uTi46KkJqkp5yVlZebkZGHlI6LgYuNgJCKkpKSoJqfopWUmJmVoqaZjZmkpqimoZ+0sqiyt6Gcoresqq2ksrKmtby1rKuxo4l4c21dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2saWno6mloKilpbOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq25rqudmJmclJKFeoFtX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOho5ill6KclY2HmJqMc42Dfo2XloaRmZCUjo57mY+cjIKJf4qYn6OekJOYloWNgpR+fnSKjnqQh5OQkJ2amZqRlZCdjqKjjomaoKGkpJuitK+sr6yfmKW4pqaxobGunLC8qqmvqpmCd3NjVk1ST1BNQ1NOTFFNQlBRSElOUk1ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6a0wbiwtLDJxLe5wc7FvrOsusGrrcOtqKKmkp2mtauhnI6UlZGOfHZ9ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5YcpCDl4aOnZeLlJCfmJ2VlJaVj5aJgJOJXztXb3yLlImAjJGMkIaGc4qFloF5gXqFlJ2Ug5WOkZCDhn2TeHFwhY19iYGRjY+XmpiTio+JnIifmIiHlp6aoaCXp6+praion5ats6Kmrpmsq5iotKKpraOTfXJuYFtOU1JWTERUSlBNTEZOT0lFTFFNS09KSU1PRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCgrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepqKOqsKintMG5sbWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm66gmJWFk46KhntydFxRTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQH+VkZF9iZSNhIqNm42WlYmSiIaVhnmIf2BKUW54ipGEfYSNioV/f25+f5R3dXV3hI2ZcFGNiIqGe354lHZod4aIfYqJlYuNkZKWi4SKiJWEmoyChJKblp6dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoqaoiXRtZ15bSFFRUk1JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Nzc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+ir6GnqKWnqK+sqrW8tri3s8G7tqe5yLi2qKi1tqqyvKaelY5/iZOnlZSJfY2DgXx2b21YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJOBkpmLj3uGj4B2f3hzbnVwdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gXZycpJ3Z3WEhISEe5WJiIqMi4B/hIuMgJSDfIGPmJWclZGfnamen6CdoKmln52Yjaekk6Gflp6epIByaGFcXUpWT1JHSlhST0pMTVJKSkpMUElMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlrKuwsaq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGNlICNm42QfnaFd3t1b25oWEtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfHhmd42XmI2PfWh5gXZ4gImPfYSYkoFxh498d3tva36tfXOQi397hpKBfX90ZnZ8hmxvaHN8iYyIgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX2Me3V+jpKPmIqSmpujlpmdmp2eop2WjYulm4+el46WmI93b21lYlpYV1RRSlNVVE9QTlBWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzUxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mOhJJ5iI2KiXVwe210cGlsaVdLRkdFQUBDRElMTE1RUlBRU1RUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCSlZeZl56XjIOJn5GLko2GkJZ/bmlub25YVVdUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ozk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCirKqota+urLS/q7zCv6aimZWkl52NhIuUoaGYmJGTi3OOen+Fi4V0bnRrcGxka2pYTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyaknRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxgHxncXF7bpONj3tzfXxxcG51bYJ/eHl1anmJgoiKhJaTkpCLjZGUlI+XjoB5iJeIhoqGgJCIdmpqb2hlWFFaV1lZW01QVVZZWE5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfp7uvq7KwwrG7w8ealo+UmYuNhXmEkJiUjZCMj4Zxh4Jzh4yFem9ycG5vZHBmX1RGSUM/PDs5Oj9AQURERUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgYWBeoSGhnlyoZV0eIFzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBnZmJqbnJtcIN1aW9YdXCOmpJ3bH97fW1xbXCAenN2bmN2hH6GgIWQkYqLiZGLkYyLj4N1eIuPgH6DgH6PenFwb2tgW1xeW1lYYF9STltaWFdMSEpGSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkrKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ6kp56vlaW1qq6xrsGyu8HGlpCMlJCAiH1ugZCSiYOKh4+FdYKDbJWIh3t0eHhsd253Y2leSVBHPkA3NDQ5Ozs8PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgYWZhJucYYaqn52Lg5COeneIfomIjXOKl4+Eel1kcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenB0endrbmled4d9h3yIh4+Ai5KXg42FjYd9cYR/hH11d3t8iXZwc3RlZ19bW11TW2ZeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnZ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF+cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbXyBhod9jmhnaHh+boWHgoVxhIVHa4B3cnl2aG1rX3d9g4l/iIWMepWem4mLiJF/enWLdnx4bW93fn9zc3JsW11dW2NjWGZlXFVQUFZZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEzMzY2ODo9P0BCRUdISkxOUVRUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiJGBmpWCoKGXlZuapa2Tmruxp7vHw6iKjKGlj5SJgZF7cYOen5Gcf3aFhYqPiJBpaG+DgHWNh4SLcYaCd4eAe3aFfW52dWeAlI+GiYiIiIehq6GWiY6Yf3qCiXp6b2dreH56fnJqZF5aWl1qXGFmX1lPS05XUlFIUEpETkdDSkRCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRj4uam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc5Oz0/QkVISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISkxLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKOoZ+UmZKEioWPmJGWbHB1iYuCloyNj3aPhHFshYGKlpKDhYhyiaGWh5OJj4+WpbWpm42VooOHk4R9f2tqa3yAgYFzYV1jXlpma1xra15XS0dPU1FOTUxGSVBDRE1GQUNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+mJaalZ+fnKegqpaTmJ5nZaSafoSSkXmAkoiQkn2KhZmSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjU1Nzs/Q0VOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZ2fqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+ElJKGnKGampmnkZGIlaKamnh6fpSYkqGSl5eBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIlo+OgYhsc3J8f3xxaGBcYF5iZ2NgZ2dcUUVKS1BPSUpMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWDhomBgIZ3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpNT1FZbYaQd5WLo6eqtL24pa6srKeotKuwt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsrauki5aYhaamoKKXgaaZjaKqqKSIhZSkoaCqoaSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWqiJmJkoqWenp+hX5nYGhcZWJdZGNfZmZeW09DSUhUT0ZITEZKR0VGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCnIOSkI2S2sidlnNWl4iPiJyPfIaMjoqKeoiCh5GOg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJTVVVXVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHw6uzxrass7+zuL62v7TBtru7pLjGqbbJx7W+ubSoo7StsbGcmpKan4mnr6uklXafpJehq7GzmJaqrqiutruyuqyvtaKxrLG1vLe1rrWgp6ijqJupsK2yuri4p5u2qYykjpGToId4goN1WWFkVmVhYWNgYWVfWlVKREVMVVFISUpESUdFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hX6AjXu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeFgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjUwLzZDSENRXE9RVVdVXFZPXlVJS0pBQD9HS0ZFRDs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMm2vMW9s7PAt7jCtb+wuHSytKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupa2sp6SYoKyzuqKpsrq1u77Mv8XFvb2zwre6uL+3ure5rK2wprGqrb6wvbvCwqyZuqiUro+YmKuJfoJ8aldiYVhqZWplV1tjWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh203P0ZRTEFMUldUWVVad2pwf4+EgY6FbnpyeYhiuKGZo4mVk5aTk5ONkJeSh4d7hoGNlYqAhICKenyLh4Z8ioOBioOVfXd5dWVPXGRHRUw6UWRhW15TRj87SFBEWmNRUVlYWWdZVGBgTVNPRUE/SUpIRUZBQEM9RTZCPkhHS0xTWlRdk6+4tbq5ycC7vcnMu7zAvLe1vLu3vrW6ssZgdbOlsZqeq72qpairqqOisrWhq6ielZafmKCupaenpZ6klKKnsbSnsrK8tsG908nK08bCxczCysPAvr2/u7y3tLC5t7fDusa9w8mwnrmqoqyPpai3iYF/cV9hYVxXYV9oZlJYYVZSVUlFRk5LQT5HRD1LQj1CQD1GPTtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzM1MjY/OEA+R0tSVFRSUFBRUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWhsbHGQjYWQdG1zcnOI1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaLf4N/gnh6i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV9uX1hnZVVZVEpEQUtKSEZISEhIQkk5RD9IS1RUVlxaW5K5wLm9t8bAu7nKy7q3uba4ubO4tbSutraZZHWonq1wXqKsnJiho5uknqullKCfkJSOlpiXqJ+mn5+amYSknaylqrCtt7C9udTRz9fPyczSzM/OysfAv8LKvcG9wsDFxMbKv8jOtKS7sLWwm6y5vZp/eWxdX1tYXWFZY2NRW2BTUUtDQUVGRDxART5CSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KRlG9sb3V1iLOsoaGfi5mcmYyNlZGbkoWKin6Ih4yQi4l8gYRze4mDhnyJdIKKhpV/c3t4bG11e2hyZWlsaWZqaWhgZmlobVptdJetpLyIh2dbb2hdWllUSEpOUEpLUUxUUUlMQUpHS1BfX2JmaWGYt8ewubO7vrayxMe1r7mwsLuss7Gnqresjbannpunmk+bnYyOoJaRppillYqTk4mQiY+RkZ6boZiblZeHnpqmm6yvqK+ns7TU1NXW0svP09XO08/NxcLJ0L/KycvJ0sjNzcLQ0riwxLzEuqa2u8Sjgm5jXFxdWGBXWGZaUV1XTlBDQkhFQkk7QUQ+QUg/P0I3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmINocW95eYOgqp6ml42bm5eLjpWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfXF4dWxxeH5xe214c2xpgXBtY2ltcHlpd31+y7/C36dtY3huY1thYEpQUlVOWV5QXV1OUU5UUVVUXG5ud4Jylq64rLSnsLarrb3Asau1pqW4p6yuoay0o46xrpqYmIyRlJGEjpuBjaaRnImDi4SKiYSLg5SVmJeUm5GcmJmZnp6rrKSnoaysztLV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbGwM7HyMOpv7jQnnluZV1iXFZfUl1bT1BUUE5IPkFGQUJFPEBCPkVFPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bXdwfX6AoZ6eoYuNmZOTjIyTj5aEeYWQkI2LioiRh3+Ce3J+gIKHeoV1hZORiX9vdnNsc3x7dnxzgXdxa4BzcmlvcXp5cnu+y5p+jLKDdnKEdmhhal1DWlpbVmZkWGVrVFhdXGBjXWN4e3+LgZmqpKShoKGppqqxuKqltKOiraKjraKnsZ+JppqUkpGKko6IgpOJa5WijZmEgIV+kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMfNz8jCy9DT0dTSztPNxtbSzNTY1tbY1dfVydTazcnX1tHKrcTDzIpyb2JgX1hTWVJcUEpHSUlKQDs6O0VBRDxCRD5IQj9CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN5coKJgZ2VnZSFi5aJj4qIjoePf3eElJmLjYiIi4l+g3hze32Dh3eAe4eRl4GDbndwbXV/dnh9c4V8eW2HdnRvfXaEdXl7nbWMPEGLxqV+jXxpZVZJQ2VjZmNoamRveVtfZmhrbmlugIOJkYudnqCdkJeYn6OjprKkpLOgoqWeoamgorGchp6SkpKQi46LhoOPhH6cm4yNg4SFepR+gqmVo4ySipiSi32XipqRq7OYmpunnKe9w8a4tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1r/MzLR3dm5kXVlSVVBZVkZHSkpFRT06NzlAQUI6SERARUNBREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSg4mGhYqCh3x4hZaXiI+Dh4aHeoR5cXp7hIZ1eoWOjZ16jHB8b3B6f3J8gXGDh4Fujnp0d318gnV/fIeIsHRYqcK2jJKCcG5iPV5ocnBxcG54d4JlaW9ydXhye4uHjpSSm5agloeMk5ugm5+qn6CtnKKamZ+lnp+smYuajJGSjYV9iIeDhIuOoJmTiISHfm2ZeYSYhoiTjI2VjIZ7m4iTj66qlJWXnpimrra9qK29xsvIycvL0MnD0crU1tjX2NfV29fT2dvWz9va0dbI1cuVeXtoaFtZUFNTXUhDRUlJPkE+PTc6PT87Pkg9QEFBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1NDIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fISXjoeLfoaHgHeCeW57e4aBdHqSno2hdo91gnR1gX10gIRvgZCCb5KEdHyBhXp2hnuJt8akwsm4gZabj3dwZU5mY4F6gXeGopCLeXl3e4N/fIR2bZSWlJWPl5CDiY+WmpeXppyYoJefk5KXo52aq5aRkYuNkoOMhYmIgYWQkZ6cmYmFjIGGl3uIiJ+XkImNiouCfKGJkIu8oZeTl5mcqKalrp6ntb7AwLnHyc3Oxc3K0dbV1NnV19vU1tna29fb2tnYztvGhnp5ZmhkX1RXVlVNS0RNQzs9PTw5Ojw+OT5BNj4/QD0/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB/gH2Fen6CkYmEhXqFiHt1fXRufH2GfnR/kp6Rn4OSfIZ+eI59eIqKboKagHSYhX6BiYV8fpB6j6mPkMOgvIycpJx9iYR9iXOMin5zppqcmZSFe4+QiYRoR3GhpJ2Mi5CShYiLkZKVj52ak5WRl42MlZ+dlKGUko6OkIt+kI+Oi4SIkpaan5+JjJSSnpGCi3+mmYiFjoKGhIClhoqMuJidkZSWoaegnZ6do662urWrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h4d2ppZFZgW1NPTkhETEI9PT45OTo6OTk8PTZAPj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBj4pxcniKe3t/fX98iHp8e4uHgn51g4Z5c3pzbYF+hH13hpuhm56UkoCLiH+Yh4Cckm6HqIV6oIt8kI6DiIScfpqRio2joqCQpK+gi5GLhYuBkoZXcq2Ln6ycj4OYm5CQjlyDopGCjJ+TlYyGiIySk4yUlZSQjI+KiJabnY+VlpGLkpSGgIuJko2Jip2WmaOjhpOdlqGLioiOnJCDiI+Ag4eFpIaMkLOYnJKUl6GhnpmSm52nsbispbzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2p9vfHRnZlxdWFNWV0NASUQ+Pz46NDk6Ozc6OzozOzw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieGxifpKDbm13i3h5fnqBfYZ8e3aGhIBzcIWCe3Z2dXSEg4V9fpKmo56mopaJnZCUlouKqJdyirKMhKeRhJmThJmMopagmZOJmp2ikqmvn5GVkI6NiJWLbo23hJrEyLKdoqWbnJiWkbKQY6TNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhICPi5mIjZCql5eko4iZnpabiY+Hl5eLhY+MgX+Gj6WJjZOomZaTlpihmJ+Zk52borK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oYl5dXU5JVFlBQkdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdoGOfXxtfoh4en56goKDfnZ2gIJ8bG6Lf3p8eHh8hIeKfoqjs6ejqrOhlqefpaOWla6ig5C4lZKzmYyhoYykm6+jpJ2YkKeWp5msr6SXlZaVkIuYmZagwI6jybmrm6OmrZiRm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4eUmIaEkZCcdJGZs5aXpaGInJqTkIqRipebiYqWjoZ9jJieiZCQnJqZk5iXn5SgnZWem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LQ1tjT0Ni7cnl2XWBVX1ZPSEpOREJDRTU+Ojc3Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OklFTkVEOjZBQEJTPjlETzMyMzU2NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p7boWGenyEeIGFgX5weHx+fW9yjXp9gXx4houJhoSSp7usqLK9r6Sts7Ooo6KwrIqatJ2juKSVraSXqa23pqSjn5mpl6mjr7CpmpmclJWRl6CYmru7rsqhara4q7CUmJ+jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHk5eMkJWNi4yXmJKdmbSXlqudi5yUko2QkoyZm4qRnpCLiZWfoY2UjZianZObmJ6UoaCUnJylr6ihpLO4q8LIxLW6vbvFx8fC0aDGyc3NxNfW0cvUoXB6aFxaU15RT0VDPjxDQUI4Pzg3NT5GPDw1PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQUVANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEpAi4p/gXOGh32CiHWDioJ/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7aLp7Ktrryqm7ukqK25uKumpqKho6Oor7KxqpycpJial5eeoqWlkqS6rqnAvK2tsrmlpKd9iIecrL2wg4yMi5CDj4ORj3qBiJCNjpyIh4+XjYuVl5SQmpadp5qxmpGsnI6aj5KOlZGQlpeOkaCRiZSbo6yUlo+UnJ2Sn52bmKChlJqep6akoqSwsqbBxsOvsLq2xcTCvs2mx8PHw7zV0c3Eyoh0c2JcWV9bTUpCTEBFRz5BP0I7OjQ+QTw9NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxlR2BpZ1pdXJOMjIh7h4uGg4x1hpGKgW9+e4F/cX6BepV6kpSUmJCTlaezxsm/wszBw7nHvLqvq7m6l7K2urLArqXApKuvu7yqrauiop2nqq60sKqbn6qboZuVn7C0p4ujurq2wbysqJyypaSolIWOqsPEpIKLj4eIhIaVlI16g42Rj5GhjIyUko6Il5+Xk5mVmKagr52MqpyNlY+SkZSVjpCVkY+hlIaXn6CynpSalKCgmKSfmqCboJSYnqakpqakr62lwMTCrqi3tcnDvrbOssS+xLyz0crIwrV1eW1cWFxpU0xIRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk5lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoKQeY2hlqiampi6vcfIycHSycrCzbzBs627vqe6v728xLeswamss7u+qrCpo6WjrK2zrba1oJ+unqWimKO0vKmbqL3Bo7e3sKuSsK2rrJeGmqqmpZGCjJOllYmBdoqSeoWNkpCen5OPlIuPjZSjmZeclZSjn6qfkaWajI+PkJWWiHyPlZKSo5qVoKKctaaQnpelo6Klnp2mmJ6Vl5ulo6inorKsqLzAxK+ls7fMwLmuxLO7vsG4rMLDwsCZbXlhWFdcW0tLTUpGRERJQkJBREw6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+JoJOEeIV/lX9/kIiKkH+WoZmupqOYwr7Hw8fF083Ozcu8wrewubyzvMu8w8G1truts7+5vK6vqKCop7atramxt5qeraKnoZ2rt7eppbC/xLG+ubOnqrWzra6WlqWsqKCRjpKxxaeVjn2RlX2IkZmQqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQlpeSlqWZZZijnrKllqKWrKyqp5ueppeYl5iVoaSopp+2q6m6vMO1prO1y8G4qbassrq4rqi3ur24gmxuWldUVU5GSlNOSz9BR0RESEdHOTVGTTs+Nz1ASi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZGDh6aTiIKHgpyEg5WQkJSOmqKfr76uoca8xcTGxs7OztLKvru2sbq7u77PtsS9t7i3srG1s7izq6acq6u4qqinr7CXo6+kp6SktcCwqqy0v8O6wLqzp7m1uLKulaWtr6+li5OVoY10wZp+l5mFj5aajLGVmpqVk5OZmaWjlZ+blpqpnZyhoJqLjY+WnWBKlpyalZqlllSWsJ+vnJ+llK+urKWaoKWUk5mZjpyfp6KZtKmqs7y8vKqwssfAuKWrq62xsaOhsbK0pHBuZlxaTlBLRFBQUFE7R0pJR0hDQz46S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4unlo6Jk4Wfh4Sdl4+eoJqjpLXItKnGusLDx8nIyMzNxr67s665uMDBzbbIusG4tbqwr6+ztKajm6qztKqopq2smaSupaSnrLq/qKu1t7/Bv765s7LEsbm9rKOutay6poicmKabdr+ghZmdjpOZmouvl6GcnJeVm5+hqZ6ooJqaqpqip56YkI2RnYNudpKimpWdop6QrrKiq5WoqpeqrqWkn6WokpKZnIiUnKKelrGmqau6tr6zsq6+ubago6eopaecm6ypqYxiZWFfUktNR0hOSVVMPUxETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5ScoZ+7r5mUn4uTqpuRkpOJq42Hop+MpK2Uo6O2xr20wbrCwsfIxcLNyMG9ubKvubTAwsq1xbHBvLS6qqitrbCiopmqtLumqaarqp2or6ejqqq+u6etvLS3vce8t7W4wbG9wLOptberv6WPo5iRoqC8n4maoJmXnp6Pt5+pnKWjm5yhmqils6GbnaacqKqemZaPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6uenaSjqJGVlaCDj56enJWppKKhtLS6ta2otbKznpyipZqXlZiqoZ53YFxfXUpIRkdNUUlNRUZGQlJMSkJFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+ew62bl6SXmamclpqaj6qWlaemla2tmaGrtsTCu763wcLAx8S+zca7vbmyr7izv8LItb+vu7a4tqakqqytoKCaqqrEoqWoq6aeq6+soqmov7emrb2wt7bHtrW4uL+xv8G2tLO0r76jl6OWlJyUrqCRoqKlo6OfkL6lqZ2oq52doJumn72imKOfoqmroZ2XjZWek56Hj4WNk56koZ21rKWclbKnma+nn5qpnqCNmZWfhI2gmpuTpaSamKuxtbGqpaqtrJyYoKCSjpCWqJ6UaGJZYV1PSUdKTkxIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDPEM+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViV0yimqOcnsWsoZ+snZ2uoJOjn5aloKapq5e2saOqsrXExL2/tr/Cu8jCvsrItri1tbCzs7fBxra+sLi0uLWfpqyqrJ2dnqWjwaWgqq2fpKmtr6Kmp721pbG8uLa2w7Kzt7m+ssPAt7ius7W1o52llZKUoa6gmaKdqairo5rDramerK2bm56ZpqG9op2lmKurrKahmY2Zn5KfiY9Xf5afpqGguKqnk5i2o5+yoaCbrpaejpmUnYKOn5eVjqKklZCmrrKrqaGipaWVlZ2Yi4+Rk6SeiWFkWWNgTEhKSk5GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dySEU2PXVlXEtOnp+hmJ7DqKWis6GcsqiTq6SgpJ+tqaydu7CorLWxyMXBwrPCw7zGw7zEyryvsLatsLSvv8S0ubGwubSsmaiwqamanaWhp8Ktm6yxm6qirrCppKe9tqa3u72vt8Oss7PCv7LGs7q3rLS2raqippaWlaSsop+fmqirsK+vvLKmoKmomZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqOfp7Ompo2YtJyjrpqem66QnpOXlJqAkaGWjo2foZOLpqywpaahnKCekpKak4WLko2cnn9hZVtnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+jn5ugw6ikqrKho7SqlbOsp6KksqyuqbuyrLC1tMbAxMO1wMS9ycS1wMjBtKu1qK+4rL/EtLeurLa5pZmrsauqmJ+ml627tJuosJutn660saequbKnurO3srnAqreywry0xae+r623taqorKGXl5KmpaKjmJilr7iusrW2oJ+ppJmVlZOkoLejpKaWrrKyp6umoZ6bmpuWmKifoJiinq+yoqaNl66ZpauXmZ6kkZuNk5eahZWelIyPnJ6Ui6mpqqGnoJielYyOmZCBhZWJlJ94Y2hda2pNUE1OVD1DQU5DOjpJQDc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko5yhpr+mqK+woam1q525sKujqrS2sbC5t6+2uLjFvsPHvbzEwcbAuMDGwLqptqSsu6zAwre3qayxuqKVrbCtspalp5Cquamgp7CdqqCwtLKqqba2rbuss7O6t6y5sMK6vb6mw6uwt6+pq6unnpiZq6KioJGYobGvs6uxupucqaCZlpKXpqG3qaWjorCxtKuyqKufm6Cgm56lnaKXnaOzsJqfkJOlmqCompSinpWYiZSYk5aWnJOIkJuZlI6pqKafopuXm5OHjpmLfYyWhY+bamhsYWxuV1BRWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aY15OSFBOW1VZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coam9oaqvq6OxuKmltbOsoK21va6zuLy6vba2wMO/yMS5xMHAwLjEvcC3r7Wnq7exu76/tKmusbael6utqK2Wp6iOp7ufpK2znquisbCzrKm2tLW9ra+xtaywtbHAusW3q7yvsbisraqjsaafpaqgpJeQmaCzqrOqq7OanaebmpWOoKaktK6noq2trrGns62yqqScn6iknpWhmZuotamXmZKSn5meoJ6Qq56XmIWVl4udmZuTio2Wl5qXpqSioJ2WlZeTgI+UhXuOkoOMlmVscmdwcV9GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2FVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoaSstqStqaWvrraqr7W6p6awt8W3sbe/wMG1tLrFvszFucK/ur+5w7fAuLG0q6m6trq5vrSqrbG1mJinrKqrm6yrjqu9nquusaOroLGts66utrK5t6qtrrGota+zu73Ksqq2tbG0r66nobOgm6itoKWVlpuasqOtoKavl6GkmpqSjaKlp7KpoqeyrKq2pa6xta+kmZ2tp5qYn5mZrLijl5OQj5icoZiXlKufnJOBk5iNnZyalY+JlJOemqShoaCYlpGTlXqLj4V7jIqDi5JrbnhtdXtgRWFqWUlIWVo9e0pGRDZBYlRpW01cYEpbXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lUS0SZl6CxqLGqraakr661qbe0uaSrtLfJurS6u7++tLS3w8DMyLvDvLa9v7+3vruwvK2nuri3tsK2q62xt5SXpq6rp6OxqpSvu6SssrKnqKOys7CxsbWxuLOprquxp7ivtbTDxbaptbassK2pp6O2n6CnsaCklJyalbGep5ygqo6po56blpilpaW3p6KytKynsqetsLWspZmgrKibnJ2blKq4nJSOjouZnKKXkJiloZ6Vg5GVkJ2cmJaUh5eQl5qmm6OgkpaQkJV2hJCHe4WBhI2LbXF3dXt+XEtlbFxLTmNcPmJ7R0k4R2dXZltMXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0lXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLj1FTFE8M3JrSkNDkZmlrqWtrqunpbGys6q3sbegq7W5yLiuwbzDt7OxtcLCzsW/wb20vb+/ur67scOnqbiwtra/vK+rs7Kcn6exraalsKWesrWsq7KwrKmotLmstLK1rLStqqyoq6m4rbGwx7+4pbmwqa2tpaitsKakpK+kqZyenJuvmaOjoqORrJ6koJ+iqqWmuaWstbWlqquorK+2rqOdo6mqm6CampKktJqPiY6HkaKglY2UnaCUkoWOkpKdm5iVk4aXk5WZppqen4ySkY6Qd36NhXx8fYeKiXF0cn59fVxTZG9eTllmXEZElltHO05tWGJbTWBiTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJV1NcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis6ST8zQklTLD6PazxHSI+cqquiqbGkqaWztLG0tbKyoautvcu6rsC7x7G0rbTCwtHFxb7Asr3Awry/t7zEp6y3rLO4vMCwq7GtoKOnraqopLCjqrGqr6ywrq+urLO7p7awsqmyqaulpaOtuqyqscK5tay6qKmoraqosaWqpKOuqqiin5yjrJWlnpiemaydoaepoqylo62suLGyoKmioKuvsKyen6eoqZmkmJmPoKeYhoSPioueoI+LjJWbjo2Fh5CVoJ2WmJWGlpOTl6SbnJyLkpCNiX5+h4V8d3+HhYZ0c3GIdWtfWWBuY1FzcVxLO4R8Rj5XdFhgWk5jW05VVlVXUFxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlFo+TEWVmK2ooaqznKqqsLatuLWuq6Wqqr3Iu7G9t8KvsKyzxMPOzsO+v7TAwsO6wLPIxKyut62yuMC+s62uq6SnqrCpp6ixpbSuq7CurbGws62zu6S4s6ysrqeroKKesLeqqq26tqW2taOqp6ysqq2hqaemsrKkpqahoayWqqGVmqCmnqSiq6Ssop+nsbetraOlopuqq66pnaKlpKSYoJmWj5idk4KDkImFnaCMio6LmI2PioOMl6ObkpCbjJOSkZSimZuZio6LinyGgIGDenSAhIJ+dHeMpIh4al5gbmdXZYdjTj9nk0xFYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIY+SEZEl5KwpaOqsZirqq21q7axq6Wsqqm8wMC4uLO7taWyr8TJy9G/wbu5v7/BucG6wcSusbWxs7rAvrOxrq2rq6i2qqaur6u5sKixsa+yrLaqtrWntLasrKSpq5yjnrSyqKiktLSgtq2gqairqaunoKusqbm2qaqqqqKpoKyckqmhnaCkoqajqZ2cprWuqKapoqOYpaanqpyipKOfmZifkY6PmY5/h42HhZ6eh4SKio2Mj4yEhpSimo6MmpGSkY+Sn5aYlouKg390hoF/f3h1g397eH+BiJ2Pb3FnZ3F4XGBziGpPXplWSG14VWRWUWJQTVVUVVFPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0pqNk9EO5WOsKClq66arKWtrrO0r6ulr6mour68wLCuuK2htq/Jx8jRwL69urzCvbrDwb+/rrKysbW8vMKxsbOrs6iktamlrbOzubCjrraxr7K6q7muqq62rKqeqayfoqC2raihn6+zobSqnqinqqOroaKsrai9r6yuraGnqJ+rmZCvoZiioainn6iamaqxqaOfraKhk6Kjo6eYmqmlmJeZnY+Kh5WIfY2GhYSkl4WCgouGjo2QhISToJaIkZ2Qk5CNkZyUl4+JhYV4dIF/fXV4eYB7dHN6aYGGo3VpXmVrgXVniIx9U1hwXkp4c1NkU1FeTU1SWWZOTFZZZVlGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGg6NDhfPWFkP0YxQ1BbWytITjlVQTSQj7GfpKaspKekrKa0srGqpLCnqri+wbuvp7mqpq6wycfI0cO8v764vr+8ybzBuLCwtbG6u7jAsrO7rbitorSmp6yytrmzp6e7ta22vbC8pq2stautnKmvo5+lrKunnJ6qs6SzqJqqp6mkqZ6jqaepvqu0r66dqaSgrpybsqOVpJykpZ+kmpqoq6Wem6qhm5KboaWdmJepqJKYmpOQioKPhX6PgoCIno+Gf32Lh5COkIR/k5uThZOijJSSi5GakZWHiH5/cXp5fnxpeHx6dXBwfWiFeISIZGFoY3KFem1neV1eVkJXem1UYVBSWEtLTnF1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mY0JKN0dTYFUqPTtEWD8qj5SxmZ+gqaWkoaukt7Kypqmxp6y4wb21sKO5rKioscPJyc3Btr2/tbe/uci2w7W0s7Wxvbi6vratuba/raGzpqqrsLW4tauevLyossCzuqCvs7WqrJ+usKOcpaipo56cpbGmr6CfqqmooqqcpKigrbyorrCuoaujpK6enq2ml5+boaOcn5uaoqqjmpqkpJWXlJ+ilpuXpquLnpGQkYyCioGAj4B7mpWNiXx+i4aPjoyKhJKYkYeUo4mSkoeQmY+TgIh8eWt9dnl4Y3t6cXBxcnhogHRqg2dkaGFuc45tYmlwYHBBXHhsVV5PUVFKSk1UWVdNXV5tV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBCaFkxM1M9ZV9ETDZLV2VPKjwzT1k9I5KZrJmfmKekop+no7ivrqOvsKmruMK6s62fuK+rqLS7yMvIv7fCvq+0vbfEt8Oxr7qys8C1u763qbm4vauktKeoqrCuubGqm7u9pLDAtbShrre1pqensbOgnqSmp6GlmZ6tp6ieoKmup6CnmKSooLC4n6Oxr6GsoayknKanqZqam5+jlZ2cmp2pppebn6iSmJOYnpOZlqGpkJqJjpCHfYd/go58fKGNjYh5g4yEiYyMhYiSmo6JlZ+JkZWCi5aMkXyEe3NvfXFzdGB5eGlvcXBvaX5xY3psaWVjYGaGf2BbcmpyTU1+aFhaTVBMSkhQUlBJTlxfblREWFtSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpoSCo+L1lYNSiXnaWYnZatoKChpKG3q7Gks7SqqLnEtbKuoLesrq2wtcbIwbe/wbmwtLy3v7u/r6u9sLS/sb3Duam7urenqLWop6uwrbOxp5q9t6StvLavn7G3sKilp7Cym6CkoKSkoZecr6ahn6Knr6KgopOkpKO3sKGmsaufrKOvmJyqpamel5qdpZObnJqdpquanJyllpWXlZ2OlJejqKGQiYqQhnqFfoSLeo+Xio2GeYKHhIiLjoWNk5iMjpaZio+WfoaXi495gHpwcndvb3RfeXdkbGxraWiDbWVyamtlaFxjc4BfWmt1aVpJfV1bWE9PSkhIUlVGMjlfXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0FmW0hURFVdaEUuOzJgVCwylqOhl5WcqZ2loaKgt6qvoLq5pqy9xLOwrqK1r6yur7TExL2zv7q3sLO5uLq4u66uwLO0uK+/wbisvbq1pqKzqqeps6uusqKbwbalqLW1qZ6yu6qnpqmwrJmip5ykppSYorKkmZ+kqKmcoqCTpaCkuaikp66nnqWhqJKfqaKhoJmbnaCSmpyWoKKrm5uZoZWSlZaajZSTo6ekj4iKj4Z5hHyFhX2djYqLhnmAhIeIiJGFlZOSjJCVlI2OlHuDl46Kd357bHRybGx0Ynh1aGhqZ2VvhGdoaGRmaWpgaGJpZlple2NgU3NUW1tTTElHSU9TQCEqaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc4Y04nMp6ko5KOpKacnp6do7Wtp6q6t6isw8C2sKyita2nr6+4wMC9scG3sa6yt7a4t7asqr2zr7Kxvb+3rru7saWftqulpbSpq66gn8KrqKWws6qstLqdqKqrsaWYnaqepqSRmaatopiepKmhnKKdl6Cdp7amr6quoaGenaGVoKafoqCZm5mckpmdlKWeraOYl56VlI6VmIyPmJqooJGIiYqIeYV3goKCnYeLgol8f4SIhoWQhJaVj46QkZGRjZJ7g5WNhnN+fWZ4b2trbGh1c2tjZ2RjdH9iZGVmZWlqY2lxWV5YXW1kYU5oV1pgVklHSEtNUlg/OWBsaUdCVVNcW0lJR0VBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFlKVmJmQTszQWZIJTWbpKCRjK2hmZiglqW0saKxvrehsca7ubCxo7arq66pub28u63Asq+urbavs7izqKu4sa6utLa7tq+4va2mnbWroKGxpauvn6TDoLKkrrGvt621na2vra6jmZynqqWelZuopZ+ZpaKnnJqgnJScna2wprmorqOimpqemZ6jmqSdl56Ym5SaoZKolaypm5SbnJKMlZmOlJSZqaeNjYqJj3uCdIKBipiFh3yJiYSEioyIkoWTnJKSj5CRlo6Qf4CNjYJvgX9meW5oa2pncXJrXGhkYnKAYGRnam1sZ2ppZmxcbG11cWFUYmhjZVlJRkxNT1hRUFVhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUllQyc0k6Kbj46wnZqToZqpsrCfuMC2oLTCu725saW2r6mupbe5t7isu6+tqqu3qrS5rqWytbGuqbG2trCytbqnqJ+2qZ6eqqKqrZypwJitpK6wtrWsrJ6xrbCqopuco6yom5Wcp6Odmqmio5WaoJ2Rm6Orqqm7n6ekoJiamp6hj2uilpiccYKWnKSAdpGrqJ6VlZ+RiZeZgJeLoI95hpOMg21pfneDcWyGi4Z9hIuGb15jYGeEl4Zri5CUknV3i4R+g49/ZoeAaHVpZldcaXNuTlBqZGZxhGZeZGZubGleX1+JkISGaE9LRDhFVGdeSkdQUFVVS0dTYG90ZUVbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzY2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFQZD0rL42kmYeVsJuck6Cbqq2ro73Fr6m3wri9vK2ntrCmq6S4tLKzsLmtqqestKawtaOouLa1qKestrKutK2zoqmftKueoqScp6iarLyVpqWvs7itraSorquspaGenKCop5uYoaalm5unp52Sn6CZkZ6oqqO1sKOjo52WmJiXo4ihj5Kah6GHlJ6hf6V/p6uek5KbkoiEcniMjoSIoXaIjGmXiGZ9c3ihb4iHhH6Ne3+hoJ+Zf3uInnSIjnabimyHgYNtaGVjemxxYlSGbWNtaZhxWGpwboZXXmlba2pbiHBteXKGaIeEWl5GTj5GXk1FUlZXUVFSV1RnXkxZS1JST0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxVmE3LyiMppeEnKydmZmdn6uqqKq/w66xury3wL6qpLexqqyms7Wur7O2q6mlsa2ltbOcrbW2tKWnqLOxrbKnr5+qoLKon6SjmqKknK61laSlpra9pqynqaqsqKaioJmfpqOZmaajpJicpKmWk6KclZOjpaaht6SkoKSYlZOYlJyIrpCYlImpi5ejnIWxgKStnpSanpV5gtSof4eUwZvHeXixpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4FslrGrsHloa1ixrm9labySvG5oem1yj9h+U2pjtrJ/gXGUdZqhqpBXT1dhT1ZORlRbWFFQU4tcV1tQQFxFUU5ER0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjqaTgaapn5ecnaWtsqmxwr2ytcC1t77Cq6a0ra2pqK+0qq+2tKinprWmp7ivnbOxtaqlpKexrq2xpqqep6SxpKKhn5ecoJ+vrZWeop+0uqKpqKCtrqWinZuaoaifmJuooJ+YnqenkZynm5SdoaejoLCjn6CjlpaSmJKZhbBraoqNqn5nhJaHrWVxnp2VmqaVca6hpH53u3xroY92sV9qtFulgGackWBmgXpmf2p4aqllvnJnpox2sWp8sXh0kpNjbW2nbluEoEVpZ4eWRXWcYH5ne6Ongllfi6tpgZV4emqnN0qvW1dUbGNbS05XX1xXVjtOiE9XVi9JVFNJQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5KilYKsp6Weo6SqsbettL2+sLfEsri6wqepsKyvqamxr6SwurCkpa6zo6m4qZ6zsrCjpaCqra+rr6ann6OisJyjnJiVmJudraaXm6KetLOhqpuhra2gnpqXoKKpnJmepKCcmaGnpJCdo5uYoZ+sn6amoJugoZaVkZaRmoa1m7V4hamZtZl3h7Obt3+TlpeplH5rgaZ6gYWIkpSSd6tnarFbrHuPh5R0iHCPhoB/iJCXeIOCi5eMg6CPhbB2d59xa2psfItOpFhIY2OZfmNopmB5cnVTkoZeUKltY3F+h4BinS5Rom5bVGtnYExLXGRYXFpCPrB4V1hBI01oRUJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o5YVU1MByWn5SIs6amoa6pp7Osqru2wrC8wq24t8GqrK2ur6ausqmhr7yqoae1raOrtaWmsrOno6Kdp6qyqLCnpZ6gn6+Wn5mVlpeYn62impqkqLWvoamPqaipm56VmKClqJqfnaOfnKCipaOVm56Ymp2jq5ummZuboqCXk5GTk52D1ZOZuXCwwn7GhnzWlJu7fJqWpZCNm4ykeo2Ho4KlgnqseY+dVa97iX6farlauXeGg32mgpN8mHqqeY2dj3uxbo6EdJC7hW+UT6+nxYpRoHpjYKpic3KHbJeHX1O1tMiGgIl8Y6QzQp12XVFqaGRQQFhmWmRhSkhNbEtaU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRODIlnKGTmLGoqKWzqqW0qKW8t8GwusCxtbW8s7ansbGjsbOmn662qJuouq6ir7Ggs7SwoKSenqepsKi0qaWcnZ6rl5mXl5eWl6GqnZqXqK2wqaOfjqyip5ael5yhpaGYoqGioZqioqebnqCelZmbpqCcp5Sbmp+hmZCSlZGdiLJuaLVxq4hwjqZytHNytnuamKSNj5uNon6QoKV+sHaDkdLRdVuufIZ/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdIWebp5mlFLIi1rCXJ95Yl+tYHdzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPal9saVBVRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6KdkaSvrKSqu62mtKWotru8sru/t7a0u7uzpbW0orKyo5+ssKSYprqupLGwnLS4qqCmnaGqpLGnrKqlmp2aqZ6WlZiZk5Oip6CXk6aqsaahlpKsn6WSlKGbpKaflZump6Gao5+tmqCenpCWnKKenKWUnJWaop+VmJaSm4Wse3eodqOPioepb62Kg6iDmZmiipKZi6J+kpiJroV/grNccrNSrn6DgqR/cdd9d4R+j52GmZp3r4aKkZyHd7RhmmWagoGVbJJasFhLmnWYeWZgrV53d4dnmIhqXa93lZ6PeGw1eciusl9BVG9eaGBFUGxfcG1WVU0vZWNpU1lRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCYtMGtqLKnqrK6uLS4v7q4s7a9taW4tKC0rJ+gqKuflae2rKiwsauttKSbqaCgqKG1pqaqo5melaWhlJScmZOWo6Wbk5CnrK+moJWYqZ+ij5GimaimoJWapqmenaSerJ2gnaCNlJ+bnqCYmZyWl6KglJiRp52GqX19pXmhj4+DqnCtjIKnhpagoYqXl4ijgZCIlKp8gIudeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClGySXKtbWpN/kX9oZ6pkc3uBa5iHcV2sWomgjmtuZU9KQ6FcWkx0XmNmTVphX3N0X0pVNUqakllIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOj4xMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZyZmb6smLTCrqutqaa0sLixtb+6urOxt7yqu7WgsaSepaennpOqsamvqrWsq6+hmKGgpqSjuaKjq6GXnJGioJWUn5qUmaCgkI2MqbCvpp2Xmqemn42SpJeoq6eUl6qon5+go62joJ2hjZWhmJ+gkp2XnJWeoZWXj6ubj65tcrR0qYx3iqZztHl0s4CSpKOSnIyJpIeOdrhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJql1ytYE2hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdmVG9uLlynT2JSa2VibVliXGBxfGNTWVA+Pm1vM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOKWam527opyywK6tq6unt6m4r7XAtbyxr7m4q8G3qqqgm6akoZ2Sq6qntaOyqK6qoJecqKCkq7mdo62clpmPpaOWjZ2hnJmdn5GTlau2r6eZlJusqZeMk6WZpayjkZersqSgnqirsJmhoo+Zopegm5abl6GTnamclJGrmYfUkpq7dLHEgMOGfdWWnLh4iJGXjJeJjKeHeaO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohwbY2kdL1dd31bYXm8a1pWW2p6XmlgZGZibXhvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC45Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmmmZ6ivKKXscOwramqrLGnuK+2xLG7sq67sK7Bsqylop6joZybkaqkqrKktaetpJ+WmqqZpqy4nKKumZWhkKWgk42co56YnpqQlpKvubCrlZejqKeUkZalnKStnpGgqKufnKCppLOeoqSOp6KUoZqcl5WkmI+woJKVqp6FkJm1gJGRjbiVeIKTm7V3bmxuc255j4SOiXOewbu8mnuBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV6s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF5/en2JZ4N5bXlii6xwdYV/WVunakVkWlRmYGNdYlFnZ3FtdUJNUExEO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVjgqT11dPSs7VlYnPTs8pp2gob+llrTDtKyqp6yrqbuusMavtbSvuKe1uK2po6KmnqCdmZSspK2qprWoqJ+blqCjnqykvqahqpiVnJGim5KPoaiik52XkpiUsrW2rZidpKSii5KSppulq5uWqKSlnJuiqaamo6igka2elqKel5eXnZ6PsKmUnKeijmp+aZyneIlzfpqOdXplh3u9vsC6bpKDcZSGX3JqWl6aiWFkh46Va2CAlWNtnHZilGt/mpWUZV5gY3GbimhyjH2GlWdqfnF0eX18Ylt3dIFoUFxug3x7i2pYbHmCcklKb4VwTXRNRVddZmFMW1hnY15PW211aXFST0RFTjtISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFS09IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SVJfSSdTYFY0KVBeTCgzPltPJz8yPqifqKHBo5q0urajrKWup6i1sqzIrLCzrLWjvrGypqCjqZ2jm5qZrKeupKS1qqWbmJWim6atqL6nqaaWlJuVoJqTmKWpp5GekI+YnLCyv6ybpp6noomTkaqaqKSam6ufo5mbo6etop+qoZmwm5SmoJeUnZ+dl7ClmaKomZyRnpyjpJmno5qcmpuakJaCaG58cXaRl5SRhIm0qY2GmJWOioyXl4eUlYqDkpORiY2RlJmTmJeaoKKbm5SgnY6CeqSFa2p8kHyAdImKgXGCeHl2doqAe4pqc4F0g3Vkd312a3B7bWBjXHBoTVlZZWpfV1lvem1tZlNPRlM5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5TMTBUXjorPThdSyw8LUCyoLOhv6KksbK3oKmlsqelsLWqyautsaa1psCotKCepKWcpJWWoKumrKOjt6ygmZaWoJetqqXAnquklpKcl56Yk5Sin56ip5KRmainssOvmqudq56PlpapnqqcnKCsmKGbnaKlr6aipKeerZiWpp2ZmqGenpywoJ2ip5aYk5mUoKKWo5+XoI6WlIuKjY6XrY97lZuCkoGJqaiFgZiWioSOn4h7hJCGhZmQh4aJlY6bl42QmJ6jlpqTkZ2Nfo1morOuhYmEdnqPin12eXpvZ3mQgYCJa3WBeYhyaHR/enaDiIJrdGN5ZmBpZGNkZmpYa3twaWpcUkxQRF9VRkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTUxEL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76tq66ysqCqprKtoqyzsMWwqqyjs6+9pLScoKaioZ2Zl6ilqKakprO1npWUnpmZr6auvqCro5GRnpqZlJGVoZyXqZ2FnqmsorPItKCqpKuWlpiap52om5+kq5Sen56gqq6ppaKqoa2bnp+hmKWenJ+dr6SZn6iTmJedkqWamKmempdmg5J8ZX6Omo9jeI1saGt6kKOra2WamH5nhYplZWloeo2hjmtojJeRondraouYo5+Yc2xueoSNhnlYZV2FgV5rioqBdltoc3d3kYCHgm54gniAc215hHR3iIiPg3tqhVhea3RkXXOIaWp8cWxjXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUlbSS83Wk82KUVZL0RPMVlDOz8uPaWfury5r6uzsKulqK2usKaurrC9samopK2wsZ+tl5+jnqGamaaqm6yjpqips66elaOQoq+mtrmlrqOPjpqhmZOSmqCZmaWWe6Wsoqizw7ikoqevnp6VnqOeo5yjqaiRnqGeoKqvqquiqZ+om6Wep6CslqGbpbCkmJyrlqGem5OlmJ6rmZ5+voOIcrRyhZ6GrWh4ucS4cZKho3ummJlzqoJ8y8DAu3GLooeDn3yVmIiewL2Clp2ejZ3BwXuBepGMmsK/fWulsW+MgW/Ken+bd5GDjoB2eYF/eXF6f4dxeIWMk3ltdpJiZl94Y19lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmplKOvqbCvraayta+rpqamsaufq5iaoqCcm6qnopyroqWopKS0pJ2jk6aurLezp6+ikpGanaWSkaChl5yfnYemq6Srrb/AsKGpr6mXkp+dopmio6qjkqChnp2trqmspaOipqCkpZ2tqZGkm6mtqpydqpysopaXpZaho5icf86UeXqlgnmVlptfro9ejqeAoaF9p5abdKuDgK9eZI2peqeHhaB0l5KIs2OCq4ahjo2zaYSudHyWh7hhgq1Zo81uj3V723t/mXB+iJJ1f2V7h3Z2a32Ibn6FkZJ+bYGOYHFrcGZgX3hkW3BoamNmYFJUUlddSk9DNUFIRUQ4PjY7QD9BOz04QD4+P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKy0tSjAnO1w6TC0hUEBGNC4xrcLAwLW0sLeYnpGkqqittKumsqysrKSsprCqoKebmqaYnKKwn6GfqKejpqGesKybnpamrq2xq6isoJSSm5+lk4+fpZeeqKOerqSrsKi/xrOoqbGulpKdnKKXoKmqn5Sgnpydra+nqqmbp6ajoauSrbSWpqKrqp6jp6ahsKGSmqeaoZuUlJGXoHCFjJd1haiHcbF8nXGsfqGfgqWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uIk4+ggHqtVpzEeo9vksF9gZVtdXCMbWZ2ZYZvYXducm+JipGQg22Qj2VvdHZvYGZtZF9vaWluZmNXU1xhWlJSQzhJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5dXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz5XSi09Jz4xKTNWQEYhHEc6QzEuK6/UxseytJ+do46jo6GsrravqbCnqaqorqurp6KjnZmilZ+mq5+ipZ+oqKKfnbCsl5uWqKevrainqZ6XlJqjopKUoa2bnaajrqyjrLWpuc2yraaurJaUnJ2imJ+urJ2Wn5mdn6mxqampm6upo6Krm6+xoqisrqaZpquqqrGjk5ejpZuUkoWkaqR1iXqpdHqycIKliZmMcIigmoekX2BSq4R/roKbdq6Bp4aGn3qYloV7ZoCjiaSZhoGjfal+gJSHrl58qFWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojYyYj4FtmpJvbnl4d25sZmVkcXBme2hjXVdfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KesLWwr6mso6imqqurqaSmoJuln52lp6ajnKyaoquhpJ+vop2bk6qktrCuoKmbnZaUp6OQmqKon6CmnLCmo6ixrLbIsrWqrKqVkZydopmfpbOdmqCTnJ+nq6ujrpqsqKKhqqKzraKqs7Ghm6qor6+2o5OXpKeYm5F8qmyehId1q3l8sG+CpIuJn5aVn5WB0ri0uMmAgbJeX5Spg6SHh6B6mJWZeKrJdJmjlaepkJKbjH6biZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI+QnpN8cJeSfnB7dX16bVxmanJxZoFqXmJYY21cXllJTU1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTk9QTUZMSlZGKkwwLz4tNE9UUR0cOzxGMiwkqKTBxrmtqLKurKWinLK5rKqhppuopqqsqaegpqWYqqOfrqudpqCsmp+ppZ2mtZ6il5OnqrWyrJumnKCVkKWtkZmcp6OgqqeuoaOnqbC0wrKzqq2ok4mYnaSaoaOupJahlZicpaarmq+draimnqyjt6yhsrmvnZuvp7O0s6WVmKikmp+Ogp1OeJqBf596hKN8gqSEh6efnJ6ThLh8fHm5gn7MxcK2eJuhkIuffpqWl4p2npiKpJijqH6whZyEnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkaOXfH6SkYl1enOEfnBcbW53cmqBb1pkX2huYmRdS0xRVEFIR0ZJOjlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMjpQW1QcGzY/SCwtIIyHmamspKu5q6+gnKGss7Smn6CVpa6urqmmnaammqOnobKuoammsqCZqKSUorWio5WXoam0uaSbo56jk5ChspmenKemoaKvrZ2kqKK1scOxraqtqZGHkZymnKOknKSWnpiZmaWkqJquoa2lppivpbytore3rZ6etbK5srOnmZ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgotxq4aEtG5yapmjnJWJn3yYmYaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5OmmH6MjJKLeH15jYFtaXdpeHNuf3RdZGRubWVoYEpaV1g8R0dAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWSc4yKrr+/u7u1npeopK22oaKZlaOpp66pq5mloZ+loKC1p6Kpp7CjlKujjqSto52Qmpqps7SknaadqZKUl66goJ6npJynnLWaoKqjtqvCsKmrqqGMhI6boaCmopWYmZyYmpimpKaYq6etoqWbrae+rJW+sK2fo7Czuqy0p5upsqWomHqokH18sHeKgaSliJxtsm+hh618oY+DqJaZgKyJhK6Fn5SpoKKWhZ+AmZWAe5J+q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbpWRppmDlI2Wi3p6gpZ+a21+Yn10bn96YGdlcW9nZ2hDWWBbPUpTMlU4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JNzA1Mi4qLEFUVlZWVVRVVVVVVFRVVFNUV1dXWFZVVVFIRklKIygovJKahKnGw7bBtJ+braCuuKWkjpuko6Cvr6qfo56drZieuaCiq6CvqpmtoZCqqaSWiZqQrrCspp+nm6yYmI+soqGdpqKapZytmJ+opraov6+lqaSejICOm5qgpp6SlJmak5qapaSjmairq6Okn6movqSXw6yqo6Kss7qsr6ehtLCpqpl2r36Qi5yFh326roqYZbCMZZWtfaGPg6eVmoGsioSwhaWZpKGikISgW2xqgbNgf617e4KAsWxnbpmXjIixW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW2Yj6iaipeQlZZ7eI2cfWRzfWKDd3SAfGFqZnBtZmVlT1VjW0FUXj5JKD45PTQhIi0lHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBfYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbaooYuZoJ+ds7OpnqKfnbSYoLOoqquesK6dq5uVrqmijoibjq+sqKaip5muk5mPqJqhnqWfmqOjpZmeoqmyqLyvpKienY98i5uVoaCZj5Kam5GZl6ieoZioraelpaOlqbufoManpamiq7S2ra6noL2ura2WgamSo6+Om4CGpJeYkIGAuMO6g46ck4Wnl5yCrIqCr4imm5qlqpF+1b3CqmKjv718fqOCg9e6uLWFlJODnr2+hGqjgW+rhG6df3qysMeDaquwva14d6K+u3SAlo6mnI+akJWceYGQmnlifHpkjGZ5gntga2VramJQYltTalxAVGFCTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzg7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbS0sb+5sr2zop2upqWzpp2MmKW/qrexqKG/pqaxm56xnLmonq2upaaVlK+sl4yDmpGvpqOsoaScqqGYi6OSpp6nnJqhqKKZnqCrram5raijm5eTe4eZkaabk4+RmJiOmJOpmZ+Yqaigqqaho6u7nqnFo6Cvo6uztauwqqG8qLCwmnR1qqS3hmWJn3BnrY+Kj21vd6SQmZ+Bda6ZlXCQjHGVp6ObmK6kcm1tbWWKd25tgplxgHlpcWlniZaVmHFoaYWGZ3CGZF6JY2pvWV1nfnemYGJxjpJvZmSAjZKOopiXmJCVnnyHjpR1ZYZ3aI1qeX55ZGxjZmxiS2RYSmtZOlBlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJSts6q6ubKzqqmirp6ksqmYkr2xw8i+tqqewKuso6Cmq5+6o6StrKymjpatqo+MhZWXrZ+lqqGfo6OgkYykkqeZqZmWo6qglpylpaevuqusmpuSknuEl42ll42RkZiTjZiVp5Sel6iimrCmnqKsup+wwqiks6assbKrrqyouaSvuJaKoailtp2JlqKYh6makJSdk6qzmZujrKCylqKgnqCinKCkoZWrpoySk4yHkpyclJCZk5iQjpWGgaSal5WNi5OSio+GhH5ni390gnZ0iIxxp218lZGUk4GBj4+Pj52UoJWXlqCCh5OMcGiPdnCKd3Z8empsZGRvY1VgWUBpWkdiYE9aK0Y9KyYhNzQwLh8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTU9QUVdUVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbivrqKwpK2foLWxkY6rxbzEu7iqoqWdm6adsKijtqedqbSmp5GYrKOLiImPnKeWq6ShmaeenpOVo5eom6mZlKahpJCap5mhtbqoqpiakI18gZSMoZSKlJGVkJCTl6WPnpmon5y2o52nrLenrsKuo7emr6+wraqqtLqir72Zkqajprajkp2mno2pn42Sn6Osr5qho7Gor5ekoJykqp6dnZyXq5ySmaGbk5CWqpmNmJiWkJaekYignZWUhZKMkIyUi4F+ZoyGdYZ2eYiDc5xqh5GUlJGKfYyWkpKYk6GSnJagg4eXhnlxlXJ5iX9xe39qbmRfcGlgW2BZbWJQYGNQWzpHR0Q9Mj09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZcXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7CzrK6jqaetoKi1qpCPnKWzu6+srKGimXqdorCkpbGplpu4pqKUmamcjoaKiZuikK6eo5ann6GSl5ibrourlo+omaiMmKiPnrm2pKWYm42JeYGTjJqTipSRk5CNkZaijJ2eqJ6fuKR/hK+1orCvdKS+o7KgeHqgq7O8lXaupJ+KgKp+ZFxidp+OpJ6El35uk7Oco6iuq6JlnqCTc3mZlnCAmKiXbH+ip4llnKWbkJeYlouRm5GFnZqQlYKSh46OkomFeGuQh3aGcXyGgYBhaYiLlZOLW3aVkWdokI5yeqSYmGR5mIaBd5dpg4qCbnl/a3BlX3Zva2toW2ZjYmJvU1s+Tk5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTFNUVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJWmo6GwsayrqaWoraOnraSSlqu1r7Gmmqqmq5dzi5yvn6iqp5OWuKCgj5yknZF+iIiano2rmqOUp6KejpeRnoV1rpCIppqokZajiJu6tKegmZiLiXR2k42Vk4qUkJCUjI+ToI6an6aZnLKWgIyctZ20jJKPvaehfqeieqOvuIGOjqefhIuFj7Gpr4yJlqOaeYGLrIacnaKnqqiHlYaYd6WbeoebgZemgoF7nLF6ioWfl5mUmJaBkJaWhJmaY3mHkISOj5KLg25xkIh5gXGAgYZ/hnSHhZaSeJZok3SgmnR8mYOfnIaYfpGJgYKYao2MhGt4e3FwZ2R3bmlsa1tlamllclteSVRMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj5ARElASUVKS0dSWFpZW2FhaGZaUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZSuxr2woJWlqLWej4Ocq5ymoZ+NkL6emY2fmqCQfYWOmZeIq52ilZ+gkY2TiYaAkaiOh6Kco5OWnYafubKnnZqSjoVwdY+Ik5CKlI+Pm4uPkZ+Slp+klp6siJ+0ibSarovKiKuuibeFjbCDsa+EqY2nmI2dfKiPcnt3m46mlmiVpHm0i5+epqiSmcKBf6uImKFxnoCapH2XhZWxgaF8oJOfj5iXgI6Tm4mYkot8hZOGjZWTiYNtc5GGgHtyhoGFfYV0hYKXgY/FZoCph4+iap6DoJiBmX+Ki4OImG+MkoRnd3R7dmdodXBnZ2xeY25sZmxYaEdcUUwyRTQ2TWBjNiY0PERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmRjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5saqrppqUoKOkqqKVo6m2o69/oKecpZ6diZO8mZONoJGdkHmElpaRh6uZm5qZoYWPjHebnI+gkYiepJuVmJeGoritpZmbjIx/Ym2PipKPjZCMjJeLkJGfj5OfoZmhqH6hp4etnqCWro+fnZ2RhoGgjauvh6SNqpqMmn6jdoCYk2uBq3VNq3iHjZ2Rm6ingaqrfYOhe3qnaZ5/kmtnl4aXtoiefW1gY1iDl3+Me2Rni3OZfXmWbF18l25fU3GEXGBseYNgWWWCfYSBmHGnqmuDo25ypXCfg55oZJ9sWmyIemVZX4J+YVdQb3ZlbnRyampvXmpvbGtoV2lPXVdFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9idmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKhtryrrqKZl6Chpaysn5yttaOokqCfn6abmY6YtJmQi56MlYt1gZSRjYqmlpWXnp5/koWGrKSHnJGKmKiXmZqRh6WwpqKVmoiJf2huiIeKjo6Ji42Si5CSooyTnqCcoqV/k4GPo6GUoHeclpCng6GngIaqroWleYt9hJp9onBzk4eWe56MeW2Hm4yZkJuomo+HnXyConN2pmaefnekX5h6fJJzom6Yt7S6dJKHgYC2qGSBxrh7cJW3jHGAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN/pF6dmbOWb3uXnrN0cluesoJpYm90dXFob1hrbHJyZVxpXmJLRD1ENVFBWXEyPFJGX0pSPTwzOTU6OjZEOztASVA/VE1OUUBEX15bWlhgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mayck6CNpLi1rq2gm6Kco6OkrJuasa2sk5egmKCkmZqTnqubi4iSeIuFcICWjYqPoJCTlJ2XfZCJjqihh5iPipGik5uajIuoqKSej5aGg31qeoZ/fY+MgouQkImPlKCClp2gnaCfi4l3nJiijKByoouIqYicp5GXqKt/rox9eqCZeqOTeIBzl4iMnH2Wn4abjZmbpoajZKF8iZaQm41snmiajW6amXp/iqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z1iYp/nmiadYeTkpiOf55umZBrpplcqH53u2p9qVqOhF2zZ1xucXl3a2lbcWl4eWNfZVdiQVBFTjdWQlJtNEpaWl9OWkNAMTUxOzs3SD86Q0dUP1lSWV0+RGJeVmBRYWR9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtpuoiWOUm6y6srCsnaacnKefna2anbCoq52Xopmhn5iWlqCjmYaJjWmIgHF7l4iLlpaEkpWYj3qKhJajnYmUj4WLnZGcm4mPqKOgmYuQiX9/aYGGeX+Wi3qIjY6Hj5aaf5Oin6Cik5hyaJ+KoI+McJKMgqmImZ+jqaCofbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo6dm5eIl3KhfIWNr7V9a5qRoXh+mLSjo6uohJh7mnycmX5zqlpdb3uXi3ieYk1/e3uFY3qXQk2fWaJqcnyObYGJhJl1m3mHibGzf3+akqZ0f51tcXyUb5lyaaNdlXZIZWNgc3B9fm5lYGxodnxkY2BRXlZdVFZAWUVRZ0RSV1tiWF5JRD1COEBCOklFOExEV0FWUVtWREZiXFpgS2BtfnJFQzxVX2JaZWpWZ2hsbmJmZl5hYVxdXmFoYl9lZHZsXmVnZmtkZmxoaGtpk52Bsa6ZhFNfoKezubOzqZqii5upnJuokqGrpKGoj56dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGSlohygImSoJxykZCAiJiUn5qEjqicmpSKiol7g2uEhXGBoIt3hY2Ih5KZlXySpKGfo4iuhn21hI+enXumlnqpgpadkIuhnn6naHdtfplzoHNxfJ2FmG+Tgq59o4OmnpqBo3BeqWd1o2NvpWGc05B8epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKovH93g21/v6aqtF6cb35xl2+Bc6JyXaNndKZhaKZtm9OYe4Obbnd5l2ubenaXcmyppWdfZXlwf4RrZ2ZkbXZ4aF9hUltlUVFiSVdJVF9XU1tlalxkUEZDS0xKS0JKRThQP1BNV1NYT1JSYGZlaVJkeHl3SUZFY11kWWhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJibf7CsVFxLfqmvsrWws6OcmIWYp6Cgo42kqKCYqYmZl5iTmZOSoJeNiIV7cH2EaH2PgpOagXeRjY6JcH+GkJOSbJeTfIiQkaOVg46qmpSSioWJeYN1iIBugp+Gd3+ShoiZopd5k6Kkmp+Js6Gitot6rKekrqVwqYCakIWBnJJ9pICimYaYcp6EoqyuiZeLgIykjZaDrqKUdrW2tcmhc5SKgJ9hnpepbXmVh5+adaGHd6B9kJaKgW9MZqKScJqIc6R7eXRhg4JsfqBscmRgnHJ/dJdpe2mztbTGpnOYfnudapubq3WCmm10d5dpmnl0mHFQRXyzXmp1aniHZmpnYnR0cW5WXlRZaFBSaElVTFhSVlxna25WZ1dNSkFKTUpISk5BUUpQZWNpbWV0cnN+eXtudYl7e1RQT21daFtraVJqaGlsZ2xnY2VfXF1cXmliZGhre19dZGdjamZvbWVpbWWinImvp4VmP5Shs6uvr7WiopCAl6iioqSMpaednKWCmZeWjZeQkJuSjYiDeWp5hmWDjH6XoHl1j4iMgWmEhZKDjIWdjXqMipSlkoKXqZeMkYuAiXl/fIt5cJChhnmAlYeJlqCWf5SlqJyWloRnbnicbKJkfHGld5yYcGengZeMe6V6oJaDl3KfdoCJlJaPuW6QiqJifZmilYhucmmranWgbG6mYJtpi5BoloealXWigH2aX4uFjHVviGJooWWef2mbdW9jZoiCbnKiWl9bZKFuXomMb3t/c3JkpW54omRnp2iYc4uYbqFvU4iPb6BeZKdUi11TmG1tcmpxgW1waGt4c2twUlhXV2ZZU21JWE9cSFhpaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxyg3t/cnaNgIR2XlFzYWdicGdQamhoa2xuZ2RnX11eXWBrYmppdnVdXGNoY2pqc2xma21jnaWYpnpldG2Lp66lqrCxpp+LgJaqnJ6ljKKhmqKigJWYk42aj4uXkI2Ke4ZxgIhoi4t8l5pzdIp9kHtlg4eVioqVmYJ8iIWWpo+BoquQhZCKgYp9f3+Oc2mPpYR8hZONiJigjoiSqqeeiaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupaKMkoSMg7xufKWvgoaFhpSXnKB8pXpxqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWuKhm5tn56SlWF/q4uqdoB/jaefd599haSVnaBpmod2rGeerYy2c3e+jKSTWYOmjathdXFzb3t0cWJqfm5obFNWW1VhYVxrTVxSXUldbW12YFtxWVtgWmdzZW5vcmNxdGB3e355cnmDc4R/gHt7jIGCgHZieGRjbnNkUmxnaG9scmlmaWFfXlxia2JsbHpvXFxiaWJsandtZ2xuYpWmqpyBgJ6klqmqnqinrqOZiYKXqpmepImapZ2pnYSLmo+FnJGFko2LjXSFeoiDb42EfZaTdHSGcpKCbX+MkoeGlI99e4GEl6SNf6WljYCNiYSUdYKHkm9si6mAg4uUjomcn4mNk6ukoJCAdZWXiH6BeZSuo3+Bm3GPhniQjIWAe3KnjHF9fXqXlpuEjnh7fn2IlJWTinaQmJ6gg3p9iWyMhVt5eXJ5cWhufpKJcX90gY+Uk3GFg4FljX9fgYCMd3VzlHVveW9uh22Ehl93aXiOZoGCho6qnH50fZdqiYhvgHZ8hXZtbGeMc3h7l3eEW2pYeI9obXdxcG93eG9dbIZuaWdWWmBXXGVrY1VhVV5RX3B3eWxqdmVqamp1fHFydHNhb3Vic3uBeHV5gnWAgH+AeIuFg317bX9sZHluXlduZ2h1a3hqaWpkXGBaY2plbHB1blpbYmtkbGx5bWhsb2GOlbqpp4uhopqmpJmknauioIODl6uRnaCJmqaaqJiCgZuLfpaUh46JiI1ygnyPfX6PhHqXjnRyg3CVhXt9kouGhpCFeH6AhpiijHunoYuFj4+ElYKGjpd3coWqho6SnJCInp6IjJuooKCrg4mOlZp+fomWraiPkqeQeHCekYN7k29+qYVwfZVxam98gZ+Lf5KOjGhtXYOLjJuano5zlYuIcXRrgnZzgFlyboeQgX1+i2ldaWN6hYOIgF9peHubfIOMg3aBhoJoeYuHa2Fxc4N3YHOMgomQp5WGZo2Pg252i4NwhY15b2VmY3mCepVaXGlmbnZbenl3dG1zcoJmXG2Ka2xiWVleWllscVtfYFleXWZ0fXt0b3Nja2tpe3xxe3h0ZG10aGx8fnV5fHt6en9/fm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtoa2pxcm1XW2VubGdzem9oam1gjIyrsaKQo6Gan56Ynpmpo6F9g5erjJ+Uh5uikKWVf3uXhHySmYiJhoaKcn2Ai3aFi4GElopxb4BymIaEfpKEg4aKgXqAg4qano+CpqCHeI2XiJWLi5yXhYN6rYKRmJmUip6dh4ihq6CioqOMiJObnKOZlqqhp6agkpuIl498eY+OhKh+f5KRkpOcsKWalJ2QjbKTmISmjIyUmp+JkJuCiZGKa3yOdndlgoaQinyJnYSHi4+HiICEg5B3fHp1mqKJh4uei4WUf36MgYF2cXSGhYB4iIeKkaaRhIaOiIONkIx8h4qIj4F2a4GDe3mZaXJoYHOKcH16dnVvd3SBXV5vh2huX19aXF1TaHFVY1tbYWxodXt8cm5wZGtqaH97bXh/cWlvcGxmgXtygYB4gH2AhHptg4yGfHp4fH56g3hOZHZrc21wemRrZWJiYFt0ZnBmcnFsVV1sdG1oeXpxZ2lrZY2InbqflqKhmJWZmJSYpKCde4CZqo2ejYWfnIqelnx5lIJ7jpmJhoOEhm14gYBygId+iJOEbWt+epeGhIOQfoCGhIZ9h4OMmpySh6qegnGKj4WSkYuckX2Ne6qEjZKXlY6cloaGm6egopqdhoOSmpmZkJqmoKadnZCXgZGKd32IjoWle3yPkJGGmKqhnZOcj42rjZGAnoyIkpmego6XfoaNgm94hXF0YH+Dj4Z1i5eAg4+ChoR+hYOUbnl1dJOii42FmoSEjXSAin18cnN7iIR7eYyOhJOnj4aEj4KDiomJdoWHiYt7bmt9f3ttaGtsZ155fmd8e3ZzdXV7d1xgcH1udWBjW1xeUWZtU2VaXWFraXZ6fnFrbGRrameAgGxzgGxsdG94boR5boaAdoKAfYR2cYKNiH57e3x/e4KKYGl7anVoaYJkamNgaVtjdWhvYnVtbFRicXllcHp6c2VqbW2Lip+4mqGjn5KSlpeLmp+enXt4nqWQm4mGpJSLmJl5eo2FfImRg4yCgYJtfH94coCFfYqQfGtofYGXiIGIjnx+hoSHfI+Aj5qbkYinnH9wi4qLkoagoYqFjHyokoiPkpeTlpJ3jaOhoZ6Wmn+BkJqZk4ybo6GkmpeRm3+OhHmAhI+HoYB+jI2PfJekoKCSmZCPpo2PgZuRiZKXm36Skn6GjYF1dIJwdmB9gI2GcoqVfIiLcox/goWGjmh3cXiMmJKPf5d+iIpzgod8fHF5eoyFenuSjYOWppOLhpF8hYaHhHWCg4iHeWRye354eXBsamZefXJofHV1c3xygGpeYHR2cHhkY1leXlJraFRkWF5hZ2p2eIFxZmtjbGhlgIBqbX5obnFrfXeGeWuLgXKBgX2BdHaCjYZ+fHt/gX1/j2pyg25zaWGHaGxiX3FVdG9tbmB4aG1XanR2Y3V7e3Jiam96iY2fspKlpZyOkJiPhp2gmpx8dqSgjZZ/jKKKiJqWeHuGh36DiX6IgoB/cH97dHWChX6JkHhnY32Gl4qCio14fYCMg3mWgJWXlYyWoJp9b4uBkJOGpZuHjImDppaFkoqVl5KRdpGeoaGYlJh6f46Yl46Wm52knpmTlJx6j4WDeIWXjZ5+gYqOjHOXop6hkpiOj6KMi4OWmIOSlpl+mI18iI2BdnF9bXpkgHyKhXCGk3+QgmyHgoF/iYRldW98h5KXjX2TeIuJfICHfHxyf3iKh3mFkYqLmKKVgoSMd4iEgoF2e4GJhXReeHd8c313ZmtkYH5panZzdHR9cXxjY2FzbnVzbWFZYF5bbGRSYldfYGhrdXmGcGJqY21laHyDbGh0aGxvaH98gnhtkIZxgIKCf3R8g4yBf356goN+fJBtdoh0dG1limxqYWN1VoNpcW5geWdsYmp2cGZ5fHpxYHJshoaQna6XpqiejY2Xh4agk5eYfXepnIqYeZeci4uYkHl8gIt9fIN7gIKAeHN4enN9gIR/iIuAZF59i5WHfoSHdH1+in99mISWk5aMo6GXfnKHe5ORiqaPjI6KkqCRg5GPlJeRioGPmKCakpCSdICNkpSJnZ2ep5iYjZWXdI2OimyGmJCZeoeIkIlvl52ao5OVio2fjIaBkpx/kpKVhpmIfImJgXpxeWp1bHt+i35uhZKClHdvgoN9fop/ZHJqe4CWl4R/jXSQiYN5h352eIB9hoF9hI6FjJSkkHmFg3SJh31/c3WAh4NtYHp1eXB7b2FuYmR7YW5vdnJ3d3N0YnZgb2x1bm9dW15dXmpeT11XYmFobXN6iWtfaWVqY2h3iG1mbGhqbWiAfHp3bpCHc4CDhH10gYaJeoJ9eoGEfXyOcnqKeHhubIdraF9pcmOHaHFvZXdobmxhemhrfXt4cGF3bYuBmZqqoKSonYqKkYaKnoqVl312rZiMln2ek5GWk4h3fnuKfHuAdnd/gHB0c3pvhX2BgIp+fGBcfo+Rhn+DhHN6gIZ6j5GHkZGbkqSblIF9gHyNipKkiI2KjZeajYWRmJOVjomJjJOdk5CMjW6EkI+RiZ6ZoqGXlomXkm+JmYRnhpqPlHqJhZCKcJaalKGSkoiLmYyCf5CefJKPkouZjnuKhId0c3VrcW51fIt0boWQjpJxdIB7gYGIfGRxbHl9mZR9hIh0kIuBdIh5bn99gId9hY2KhY2VqI17iH1+i4V3fXBvgIWDY2h3c3RuemJeb2BqdF5wanp4eGxycGV5XW1sc21zWFpeX2FqWlBXWGRjZ3Fxf4dmXWloZ2JncY5vZGlnZWpogHp3dG6OhXOAgYJ7dYKIhXeFfHiEhXqAiXd/i3t6cnmDamtfcGh0f2txbm1xZ29sZXtiboB5dnFsd3eKf6OYoqihppuHjIqBj52Gk5x0gKmUkYyGoIyVk5B/dHt2hXh4f3Jze4Vrcm95bYl2gICGbnFbWX6RjYiAgIB2dYB/f6CGj4qRnJegk5d3iX6AjIicnYmPhpKXlYSIlJmPlouLjY6NnYqOkIRuiYuPkYqclqGbmJWFmIhrhaODZ4adipF/i4SLgXeTmJGekZCIiZWNf36Pl3yRjY+NmpJ8in+CbnZva21vcHuFaXODjpeKcHd/dIKJgnhmc292gZmOfImEepSReneIdHCIe4aMe4uHhImPnKOIfIR3gouAeHhuaoCCgV1ycnBvb3daXnBgb2peb2l8eXBtbWptdmBwb2tybVlYYWFiblhRU1llZmN1cISCYl1qbWRiZmuSbWBmZl9oa4F1cnJwi4B0f4KAeHaAi4B4hX93h4Z3g4R7hox/e3aKf2pxY3xihnxvcGx0amhvbHZ3X3F/eXt0dXSAgn+llZqtn6eWhY2Df5eVg4+fdYqfk5KFipqMlY2LenJ4dIJwcoVzcXWIbG9tdW2Id4N9f21uVVGBq5SHgniAdnKCeYKggZGBk5KXm5GaeJF6goySpJqTjoiVmJKEhpaZjJOLiY+PiJ6FkIp8c4uFiY+InJmfm5aUgJR/aYaciGiHoYiShJGDiXGDkZePmo2PjIuPjXd7kpB6jouMkZaMfIh8gGt2am1ra2x6fmF5fo6VgXZ6gHeDjXx5Z3RsdIeVi3+IhnuUkHF6hHB3jHqKjHuJfoOMkZ+dhXx9eIKLfXZwaWuBgnlfd25sa3FyVV1uYnFgX21ueXBncGZnc3VocGthd2VdVmZgYHJTUE5cZmVdeHCIfF9daHJiYmVmkmpfaGRbZ3B+cGtxc4p9dnyFgHR1f4x5e4aBeIiCc4aEfoyMhHt5lXdmcmqDYId+b29remBqbnR/dF90fXmGeHRzhXx4oI+ZsJylj4KKf4OaiICLnn+KmZOOhIiXjY6PhHZ0dnOAcG+Fc3Bxg29qaXZtgm59fG11c1JOgt/JktaTfHB0gnWDoIKSd5SQmJuPmHuTcoWQn6GTk5CKkpuUhn6WlYiNjYiRjYicgI6BeHqMfoiMipybnZuVk3mNd2iJkodsiaSFk4iXg4ZjjJGYjpSKloyNiotxe5SJeo2IipKRiXmFe35se2Vyb2preXlbgHmPjoB6fX5/ho56emhza3OLj4qChYV9lYxsfn9vgIx/jIh9hHqCkJaam4t8d3iDkHlzbWZwf4NsaXRuZ2hzbVNebmRwWV9rcXdma2piZnhzb3BjX3dgYFZrX152UE5MYGZjXXlxiXRcW2V2YGFlZY5jYWZhWGlzc25rcXaLfHR6hoF1dn6Lc3+Gf3qIfnKJh4GRioh8fph2ZXNufGWHfm5wa4BabG55eXNgdnp7jXZyd4p3eZ+Lm66boJCChXeIlX99iZyHhZ+RjoWMl4STjoeBdXdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYN1hKGFkW6Vj5SflJuBkXCFi6OXiY6VipCdloOAlZCFiY+AkoqKl3+He3V/iXiGhI2bmpiZjpB2i3dvh4mLfYukhZKJnYWFXouUl4qOiY6LioSJbHyWgX2IhYmQj4Z2hX19a31kd3VqbXhzV4h6kYaFen5/gIWMfnllc2p/io6Kg4J/jJaFa4J1boiRgpGFf4J6gJGWlJmQdHR4iI11dHFndXmCYnRtb2FodWZSYHBna1VfbnR5YHJjX2h9cXJtWmJyYWJXbllcd01NTGNmYV52c4ptW1xkeV5gZGaEX2NjXlhqcmtua3J3i31zd4SBeHd7iXGDhH1+iHt0i4mIloaMfn6Yc2h1cXlti3pudHCBWHF6dnlxZHd5hoxpdoCJcn+ch5innKOShH1wjJR4eYudhIWhjY58lYx/moiEe3J3cHNqb4FraWx8dF5geHZ7cHV7Z2BlfOvatcnD3IhzbHOAdomaiI1pl4+OnJSSgYhwhYigjoSLlYqNmJR8jZOIg4mPe5GLhpCCf3Z4g4Ryh4KSm5aUmIaMdod/cYWCiYeZooOUjJ6DiWGDlY6GiYaJjYeAh2l9lH99g4SJjo2CcYZ+f3F3aHVyaXN3a1qMfZKBhXx/g4CEioJ2YnRsiIGPi4J+f5KRfW6CbHmGj4aThH2BfYCSk5GXiW5yeoyGdWxxa3J4gF90aW5canVgUmRxaGZTX3B2dGBvYF1ognFyaVdnaGNpWG1XW3VMSkxlZl5icnOFaFtcZXleXmRnemFkX1xZa25lb2p0d4p+c3OBfnp2eohzhYN8f4d2d4qGj5iBjYJ7k3Zsd3V5eZN0bnh6fVh5hXGAb2d4d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2KmoiJe59/g5l/gXhxc25vZHJ+aGZsd3dbX3l7enFxf2lhZ2F/1baOkKZ4bnF3e3CSkIyHapiNiJuRi4Z7aIeLmYaBkpGGh5iNfI2NgYGKjXyQjH6KhXp1e4J6cYaAlZmOk5SCiXWEh3eEgIuTnZ+Glo+ffohhf5OHhIiEiY1/f4NnfZB/fn+Ci4+Qfm2CfIJ0a212dHN2dWtjjYGOf4V+fIR/hIh/cF9zcYV8j42CfH+SiXpxg2Z6g4qHjIN8hX6AlY+Rk4RucHmMf3Vtbmpren1iaGppWGt1WlJpcmliUGJyeGxhZV1aaoNtc2JbZ19kbF9uVFpvTkhPZmRcZ25xgGxaW2NyX1xjbHdkZV1cWmxsYm1pc3aGf3Fuf3x8dHiGeIWCfICHdXmJgZKWfImGdomBb3h5e4STcG17gXdeg390gW1penOUc2dyiH1ykpGDmp+boIaHdnaUf212k5d9h5CDio2ZfIuadn12cW9samF0fGdiaXV6Wl94fHptcX5lY2hoV52PXnFylrzDg3VxlIiQfnKWi4abkoyHcmqIj5aAe5SMgYSbjHyKhn18iYx/lIh1ioZ2dn2BcXWGgZ6UhZSPg4NygIh1hXyJmJ2Yh5SOnYCIZn2Tgn+Fg4mJcoF9Z36Le3h+f4eLjnxpgHyDdmVveHhzdnNsao2FioGKf3iBgISDf2tecnh6fo2KhXuCj4B+coBpeYOHi4aEeYR8gZiNkIx9bm17iX13dG5oZ3x2Y1xxYlduclNTbnNoYU1mdHhlYF1cWG6Ab3NZZWFeam1gcE9Za1FEU2dgWmtubXxuWltebGNaYm93ZGdcXWBsamNraXN2gYNwbX58f3R1g3uDgnyChXZ+iYGWkXiDinSBiHJ5eH6NkG9vfIFxaYF5en5tbHx2lWtqd4R0bJSNhZ6YoJmFiG59jHZqeJiOfoGKgpWXiXmOlm96c3BsamRgdHtoX2Vxelphcn15Z3F6YWVlj7Gyd0piWqTZ0JZxe5CKkHd9lIuEmZGMhW5rhZKSenmShoGEmIp8h394eImKhJaAcIyIcXR9eml5hYOlkISTjYN/b3+Dd4R5hZuZlIuTkJSFh3B7koJ9goOJg26BeGiAhHhyf3+DioZ7ZX1+hHVjcHJ/aHhwb3WYjYaCint2eICEeYFrXHF9coGIhYl9hol6iHKBbnGEh46EhXOEeYGZjY2EeG5vfoSAd3plaGp8cF9Zd1pYcGxOV3FzZ2BKbHZ0YF1bW1l0fXJvV2ddZmpxX25OV2hRP1lmXlpva2d5cVpaWWtlWWNxeV9oXF5lbWhla2hxd3+Hbmt/foB1b4J7gIF+g392gYWJl4pxgo1xe4Z8eXmEk4x1anp/bG9+dH99b3J7e5RvboF/eGaTioOhmZySgoZnh4NvaHqViH1/hIGYiYF8jYxpeHJrbGZfYW94bV9ib3hcZGyDemFxdl9lZdTqvooyOj6LjoBxeYWHjo12g5aMfpKNjH9tbIWMi3V9j3+FgpWJfIN4bnaHhIOXd2+IhWt1e3RmeYKDp4uCj4uEfW6AdXeDeYackIyQkZKMi4Z+e5KGd3+EjYNsf3JogH54bXx7gYqDd2F5hIFxZHFofm10cXSBm4uAf4V+cnV9gHOBcFttfnR4ioOLe4eAfIh4enFsiIOPhItygnqAl4uLf3Rua3eAgHV1XGlod3BYVntTWW9kTFpycmVbSXB3blxaWllddX50aFliW2dlbmNpTFdmUT1eZVxddWVfdHBaWVRvZFlkcXlaaF5gZ21naWxpcHd9jmxpgoR+eW6AfHyBf4J6dYKBjZOFcICLbnh+gHt7iJKJf2h7fmt0e3KGe3N3fX+MeXiEfXxrjI2Em52WjIGAbI5+a2h+jYx6fn+DlIF+fYqIa3VxZ2hjW2Jncm5gYWtzYWhwiXpic3ReY2SboI9uXDVZr7V0aYCIfJKGdoWWhXOPi4l2cG2FgoZ0eYl4iXySiHp/c2d2iX5+mG9xhn5odnltZXmIhKSHgIeNiX5ufnaAgXyMmYeCk5CYiYuEiXyPiHB7fYR7aH5saoB7eml6doGHgXJgd4F+cWRyZnWCbXV7hJSRgXyBf253eXx0f21Yb392dIyChneIdoKJenhzbomBj4GFc399f5OJiXpubmpugoJ1bl1nZnNxUVp6TVpvXE5bcnBkVUtzeGlXWVlaYXGAdGBdXWBmZGhpZk5ZaE1AYWRbYHVhXHRtWFdTdGFaZG9yV2peYmhrZ21saXB3fJJsaYSJfHxwfn57gX+CeneAf4qLg3F7h29xd4N/e4mNj4Nqfntud3l3ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiQeH17gZF/f36Kg3BycGNmXllnX29wYGBncGZqb4l0YXRvW2FkanZ7f76cpqPIuHGFg3OTfHiGk4JzkIyIcnJwhHuCc3WHdIh3k4h5eXFjd4d6gJNpcoR2Znd2Y2p8g4eegX9/jo99cn90hXmAkZCCeJaNlI+Igoh7iIlreHl+dWd6aGx/eXNpenaAgn1oYHeHfWprdGd7gGl2gIuQlH56fn5we3Z7dH5iVnd9cnOKhIJ8g3GGind4cHCDgo1/fXl+fXaOhoN2aXFpbYiCcnBdaGNzbkpkdUtdblVTWXNuYlFPc3hgUlhYXGFvgnNbYVxoZWVjamRRWnBJRGNhWmNwXl13aFVWVXdeW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHl9cnt+eYKBgXx2fYOIhoNwd4NybnaCg32Ji5N/cIB8eHl6gYx0g3h/gYGChHqAdW9+ioubnoh9hXp3hntndIWLkHp+f3uIhYR2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhvjHV7ho6AepOJgHV0dX53f29xf22EdJSGeHRrYHqCeYiPZnGDb2d2blttfYGQlH+AeZGSfXl7bYd2gJCLhHSWipGOh4WFe3+FbHR2f21ndmVte3VtanZ3f398YGJ4hXlodHVifXtndIaOjJV7dH91cYB6fG1/WVZ0fm91hId/gHlsiIZ0eGt1f4OEfXt9eXtzi4F9c2d0ZW6LhG1zW2pfdWRIbm5MWmFXVlV4bWJQUnR2V1BVWF5hcYRvXGBjbWRkXm5iVFxyR0JmX11maF1aemJRVVx1W1tna2FWal9gbmZma3FocHV4jnRrjox1f3Z4fXeBg4F7c32DiIeDb3F/dHF1foWBiY2Ke3d/eIN8fIaHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN5Xn2FmIx5hoN0hYaEd4l7Ym5sW2JbW2FWanNjYFtnbm9mh3FhcWZXXGNrf3zKzoe5oWptbYpscYRxfIOJfnuRhXp5c3l1dXtqbHVjhHWRgndvZl59gnqLiWVygmtqcWNYbHuGm4iCgXOXlHd/fG2IcYGKi4dxl46QiIWLg3t5fnFxcH1maHFibXhxamtxd3x8eVxkeYB3aXV4ZoF2Z3SHi42UfHGGaW9+gHlufF1Ycn9tdICLfIJvb4l/cXZod3+Bf4F2fXJ7dYd8enJmc2FujIJsclhrX3dbSW5rTVVUXlRVe2thT1R1clBRVFZeYnSFaVxga2pmY1luYVhicEdBaFxgZl9dVXtdT1VkcFpbamhdV2hgX3Jma2hyZ3Byd4Z4bpWKdH96eH54g4d/dXJ/hoWNgnBwe3h3dXqGhYaMhXp8f3WLfn2GhISHf35+fYd/fHh2eXiRk6B/jH2LbXaAeWODhpaFc5GKb4WFgXqDdGNuallfW11dVGdzZWBZZHFyZoFzYmtlV1tgaX94vq57oLdtYnOGaHN7cXmChXt9jH93eHJ2b3t2ZWpuYId1joFzamJefnh5i4RmcX5oamtaVm93iqOBhH9xmZNxgXl0gm2AgpGHc5WIjIiEiYV9eHRybmh5YGptYG12amdqa3l3endbZ318eGVyfW2EdGV1hYyFlX9vi2ZreoN1bXRiXG98a3V8i3yBZnWHfW1xZ3V+eH5/cn1se3uBenhwZmxibol+bW1Wa2B3VUpqa09RTmhNWXxoYk5VdWpMUFRVXmZ1g2ZdYHBoZ2FXaV1ba2hKRWtaYWRXWVV5WU5WbWpZXWxlXFplY150Zm1kcWdyb3WBeHCZhXZ/fnd/fIWHfXVzgoiAlYJuc3h6enNzhYaIiIN4gX12j398hIqOhIKEe36Lg3t3fHd3mp2XeoqChml3fXxsg4STf3KPgnCFgn6Bf29mbGdXXVtcW1RkcGRfV2JydWl1cGVlYldcXGh/cG9ygHOJZGR4fml0dXNzgoR4gIR5dnN1bmt6cGFna2eGdI2DbmZdX31we4l+aW13ZmlkVVZyb42mfIR7dpaQdHxzfHpte3uQhXaYfIeGgoaDfHRwcmxndFxsaF5sdGRnZml6b3tyWWeAdnVncIB3gXVid4SKfJSAbotqbXqBcWZzZWBtemdzd4p8fmJ1g3Zpa3F0enB6eXN+Zn5/f3l3bmRmYm6GfG1rVmpicFNLaGpPS05wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWVgVmNXYnBdTEtrWGNiVVVVc1ZMWHVkWl9rYVxaY2Vfd2ZtYnBpc25yf3V0moF3f4B3f36FhXp8dYKEfpeFbnJ0fHp0cYSFj4GAeYt1dJF/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx6dYOCi3luhXN5hH2Bg3VuamhlVl1bWlpTYm5kW1hhc3tpaG1pYGJXX1tqgGlrb4Bna2FoeXhqc3R0boSBen99dXVuemhqeWpfZW5ogXaPhGdlWGJ3aX6He29pb2dmXVVYb2eOqHeBenyQjnl1b35vcnV5j4B3lXSFgn+Fh3VqcnZnaG5bbGRdbXNfZ2FqeGh7bVptgnJzaW+Afnl3YHeEhHePhHKIcW95gHJjcWlcb3dkcXSIfHhic4BwZ2p4c3JseHd1eGSDe394dnBkY2NufH1rbFVpYmZTS2tnT0dSa0VheGdhTVNxXEpNVFlla3d7ZV5tcWlkXVZgVW5uV0tTaFdmXlhOVWxUSlx5X1tfa11dW2NlYHpobGFvb3Vub3h1eph9d4CBeoB/h4Z6eXqDfoGThHF0dH95dnSFiJB9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSsn396iIiDa3KBeXWAgIFzboZufH9ziYBqb21kZFhfWllaVWJqZ1taXnWCaV5tbFxhVlxcbIFlcXR9aWlda3Z2Z3R3cm2Fe319eXVybHloaXhmXWRzaHp3koFjY1RlcGeChXd3ZmhqYFdWWWdjj6dufneAi456cHB8Znhveo18do5xhH1+f4ZuZHZzZGhoXGtiXW9vW2dfbXVkemhddIBvcmtxe311dWF0hYp6h4eAf3dydX91YXBtWXF0YnFyhXx1ZHJ/bGFsem9qaXt5dnJmhXZ7enVxZWFlbXN+aWxUaV5dVEtyYlBGVmFHYnZnYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVl2ZVVKXGNXaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bm9udoOXeXKBgHx/iIuGfnV1hnmHjH1zdXWCeXp6goyOfX6EiWlzloF6ip19foV6gXp/fIaIc3GProx7e4ePfWVxh3lzfHx1cW6FbHt+bI96YnBvYmVdZVZZWVZjZmtgXVxzhWhYcG5aXldaXGx7YnB2dmxiW2xzc2d1dXBshHl+gHl3bm50ZWl0ZVtndWZ2dpF6X11SZmZrg4J0fWJjaVxUWF1iY4+laHh0goWQeG1ueWd3bXyFe3WIcoB4fHh/aGV2bWBmYF5qX11za1llXW9vYnplW3d7a25ub3d4c3RkcoOSfoeCiHp2b3J9c2J4ZFtvcGFxcYJ8c2ZxgGRebnZpZGd5e3Vub4J1dH1zcWJfZm5vfWRqU2hYWVRNd19RSllYSGJ1ZGFJVG1TSkxaV2lscXtibGxzY2FZWVthdltTTGNdWGlTV0hZYU5HaXVYXmFtW1tfYmJdhWhoYW54eWxvanaBkHhtgn6AgZKIhIF2dIl0jIZzcXd1gnd8fX6Mj4B+k35wd5WDfJmSeYCAeHl+f3SIg3NwmaJ7en+JlHhkdYh4c3h1a3Nufmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYllU3JuW1pYWGBsdmNpdWpqXlptc3Fsc3NzaoV8fn98dm5ubGRpcWNbanJkdHaOc1tXU2VhcoB/coJdYmNdU1pgW2ORnmVycYWEkXRsanptb3B7fHxxgHd/cnp5eWRldWhdYlpgZ1tedmhXYl1waGF3YFt7dmppcm53c3J0aHCBlIKGfoR2cmpwfW1md1dca21icXOBenNmb35bYG9xYl9qcX5sbHV+c3F4a3BhXGVsbHphZ1NnVVdSUHVbUU9ZUkljdGJgR1VqUElQWlVra2t8ZW1vcWFbWlhZbHBXU09mV1dpU1RGWlxPSHJ1WF9jbWNYYGBhXYtqY2RteXhrb2l1eYZ7a4N9f4SZfIKEeX2Ibo+GcW93en10goJ8i4+Dgpd0d4KThYGfiXWAgIFzf4Jxh4J1b6KXdHuGi4Z7ZXeKbm57b2Z3cHpsc3ZyjGtedG5hZ2VrUl1bVWdhbGxaXHCMZE9vbl1WWFVnanRnYnRlZV1ZbnRucHV1eWuHfH98iHaPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGFXGNfY1RaYFljlZVjbnCDhYpzamh7b2Zzd3N8bHp0dW95fnVeZnJjW15WYWRZYXRlVV9gbWRhcV1dfnBoaXNxc3B0dWpthJOBiHuFcXJmbn1wcm9UW2ZqZnF0gXdzYmx2VWJxaltfb2Z9Zm13fXNzc2ptYFpkamp3XmZUZFVWUFRtV1FWU1BIZHNfYUZYaU5IV1RWbWhkfGlreGtiV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWWJgXl6PbmJma3l1bm9odnZ/f2yDf32Gl3t/iIGKfmuTiHJndIB7dYCDfYiOf4uTcnyKkYWHn4Z7f4aMc4GGc32Ddm6ljHOBjYt2d216jGBkfHBmeHJ5bG1xdoJnZHtsY2ZnaFNfXlVnX2xvW15ujWhOaW1gVFZTb2dzbGZ3ZGVdWHB0bHJ6d3JtiHt/dpx6eWthZWxtXmBvamVweH5nWlZYYGx4fHtwg19iXmdWWF9XZJuIYmtxgYd9d2treW1cd3Fseml2c25ve4ByWGpuX1ldVWJjWGRxYlNeYWhiYmxaYH5sZmtzdW5td3ZraIWLfoh6iG1xZXB9bXJtY1lhaGlvdIF0cl5pbFJlcWRUYm5iemNxd3t2a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVwXWNGWWlNSV9LWG1kX3hobn5kYFReVF11XFRTYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNuZ3Z0eoNygYJ5iI1+fIqIjnpukIp0bHOCdH9/iIWGkYSVj3l+jI+HkZuEgHyMhHKAgXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2MjY2NjY2Njo6Pj4+Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2trrB/a25ubm5xSiwwMC8vLEmFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0t3xlaGdnZ2s9Gh0dHBwYO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHh4iIiIeOkJCQkJCQjIeHh4eGh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRi4qKioqJioaDg4OCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5CKkY6OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyNjY2NjY2NjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeKiYmOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhouNiZCJi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+JiIyJj4eNj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aJjIiNho+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Ni42Ljo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fn9/fn59fX9/f39+fn+AgIB/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJWVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f35+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9+fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyNjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt9fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhJR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN2eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUVZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0pISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkNGRkRHSUhDP0A/QEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgICAf4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs9Ozc4Ozw+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzo6QD84Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09Pz8+PT1qaT49PT08PDw8Ozw6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEtJSUlJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQj89P0JERD8+PT4+QEA8SnhzTD1DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZFSj88O1JvbWdleHNIODw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUdISEhKSUpLSkpOTElJX3BxcnJydHV2ent9fXx+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIF2TU5OTU5OTExOUE5MPkE8PD0/PkJDPz9BQUFCQE16Yz1XgYWGhoJ5ckY4ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISEpKSkxKRkZncG9xcXR2dXd7fH19fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXtOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkM/Vnd7Z32DgoN+gn52Rz09Pz49PkNEPzs8PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcG9xdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkVDRUBXdXR/gX2Cg3mBhXJEQEBDQEA/QEA+PTw9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQE50cn59eIKFgYOGXz1DQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTUpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWZ3gIGBhIWHhoiES0NFRENXdYaJin5YR0hKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIRkhJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHWHOBhIWFg4WIiI1lP0FWdIeJh4eGh4JXSUxNTE1NTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExKWIKFhoSBgoaIinxUbIWHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpjhoaGg4GDgoSEg4OFhYSEhYaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSmyHhoSBg4aAgYKDg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT48PD1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaDgX+Ag4SEhIODhIaJiouLi4qJiouMiVQ6ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0VyhYCAgYKDg4SDg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BSV2txcnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I5RoCEgIOEhYSEhISGiYqKiIeHiImKioyKiYmMej45ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8Ozk6PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz1UhYOCg4WGhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPz9BPT48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQl2Hg4OFhoWFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZFRkZEQEI/PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFARERFYYeDg4WFhoaGiImJiIeGhoaHiYqKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkNISEpfhYKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExNS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/f359fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4ODw7PD06P0A+QEBDRkpKUGeDg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEdFSkhESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6PDg9Pjs9QT4/QEVJS01Wc4ODhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMi4uLi4teUVFQTU5NS0pHRkNHSkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxvcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSExNUVd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVVJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0ZWTkZPUVFVWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOzpRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0xLR0hJSEVGSUhJSElqcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f4CAgICAf39/gIB/f39+flRISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A+QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFlnUlVWWFVUVlRPT01KTEpJSUxNS09NU29zdnh5eHd5eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3lucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWVhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH+AgICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWFNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3F5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUFFNS1JUUk1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSVFVaXG1ydnZ1c3N3e3p6e3t9e319fX59fX1+fX5/f3+AgIB/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlQSEZPRkRFRkhHSEJDSEdISkdDQkFEQE9QTVJkc3V2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QEA/Pz5rUEthRUZISUVCP0dMTkdNUVVJQkU/Pjw9PD09Pz0/QUNCPz48PUI+Sk1GVW51dXVzdHZ4e3x6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqamZgW1FSWlxZXklKUFFOS0xRUlFUVlRXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFEQltcT3tOT09OS0xNT09RTEtMV01IR0BBPDk3NzU5OT07Ozs4OTg5PztBSD9cdHV1dnV2d3l8fHx9fHx9fX1+fH59fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZETFFPYVdSWFFQU1NSVVtPT1FWUE1KQ0Y+Ojk2NDg2OTc5OjM2Njc5NjxCPWZ0dXZ3d3l5e319fHx7fH19fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFJMWFlaVlhYVlhZXVdXWGhza11WYXNrYWFfXWRgX15ZVVBNT05MSUhKS0lIRkNQT1NaV1RUTVFTWVNcZVVPU1RSTktJSEM/QTk5ODg5Nzg4NDc1Nzg1ODlHbnN1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KTk9VU1RcVlJVU1JOTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3eXp7fH19fX58fX18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KSE9QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTUlMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVCRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFQUVBRTlFPUE9MSkxMT1BOTlBRUU5RT0pMTU1LR0VFREI7PT08OT1HNjY3N0RucXV3enx7fHx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MRUdDT1JDOEVOU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FNT05NSU1MSUtMTEtHRkZFRDxBQT47QEU7PDg5VHFydXl7e3t9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PD1BQEI9PkVIR0RGRklHS0pARkFBQEZIRUpPSFFSYVxRUFJOU09PT0xMT01LTUxNT05bV0tNUU9ISkhDSUtNTEpGRkZFP0JDPjxCRj9CP0FkcXV4e3p7e3x7enp3fHd5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0FBR0lETU9hZVFNT05XS0xNS0xNTUxMS05OU2RNSkxSSUlJRUFIS01NTktHSUZCQUJAP0VGRUhES29wd3p5eXt7ent6d3R4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUTEpJTVRGSUlKTEpLS0lJTE1PUFJQS0dDS0dDQkpKTE1PTklKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW9rbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGSEhHSktJSktER0I9Pj06Ojo7QUI/PUJDQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNUEdIS0ZIS0RISUtNSEpMSEhKTEtNXVJJSERNRkJFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLQ0ZFR0RFRUZFR0JDQD48PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPj9DQ0NFR0xOSEtOSERIRUlNTk1HSUxHRUZJSUxOS0pIRU5IQ0dNTE5NUE1OTk1MSUhKT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkNCRUBEQj4/Pjo7Oz06PT9DQT9BQ0ZHSkdJSUxIR0dHRkVDQD1FRUI+QUNDQ0VHSElHTVBJRkZHS05PS0ZISUZFRERJSUhLSUdIUEtESk1MUE5QTk9PTkpKSU1SVVRST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzo+P0BCP0BCRUdKRkpHSUhGRkdFQ0JBQUZGQ0JCQkRFREdHSEZMUUxJT0pKTEtJR0hFRkVEQ0lISEtKSEtSTUNPT05RUFBPTk9PTEtLUFVXVlVTWGBeXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmtrc01GRkVIQkJBREQ8QUFAQzw4OT0+Oj88P0I/QEBERkhFSEZGR0ZFRURDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZJSEVDSUlKS01LUFNORFFTUVFST1BNTlBNTE5TV1ZXWFZYXltdZGBoYmppZ2tfZWVnY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUhHR0hCQkJGRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkdKRUVJR0NHSEZIRkVDRkpKR01KTEtJSkxGSUhLSEVLS0xNTk9TVE9JU1VUUVRQUU1OUU5NUVdaVlpZVlpeWlhhYGBgXmhlY2BkZWhnamhoamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN1bm9zc3lOSUhHSURBQ0hFPEBFQ0U9ODo+Pj49PUFCPT8+QUJGQ0VCQ0dEQ0VFRkdHR0lGSEpIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZXF9fXmBjXVxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXdxdU1JS0hKRUJFR0U8QEdEREA5PD5AQD8/QkI8QD5BQUZDRURDSERGREdFSEhGSEdJS0pGSkhIS0hGRkxISEhKR0xMTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW1xeYF9hYGJkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd292SktMSkxHQkVERTxARkREQjs/P0FBQUBEQUBCP0FDSEJFREZHRUlFRkRJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOT05PTE9QUlVYVk1OVFZVU1JRUExOVFNSV1teXl9dXWBgYWFhYGJkZWJjaWJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3BzdnR1dXd2dXV1ZXFza3BxanJ2b3dKTUxMTUdEQ0FEPD9FRUVDPUFBQ0JBQ0VBQ0RBQUVHQ0hHSEdFSkZDR0pHR0pGSUxISUpNSk1MR0tJSExLTlFLUlFMU01LTk5PUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZWFhY2luaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTEtMR0RBQEQ+PkRFRkNAQ0FFRERGQ0JFR0NCSUZDSEpKSElLRkRLSkdISUlJS0dKSk9LTkxJTEhKTUtaZkpkXEtsUkhPTl9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENDQkVFRUZCRkZHQ0RKRUVKTExKTE1HR01KSEpKSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxsVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9ccHVncE1Kcnl2a2Jga2VlbXhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnR0Ym11a3BwbHJycXpLTElJR0VEQEFCPz1CRkdCRkNFREVFRENISEdERUtHR0xNTUpNTUZKTkhJS0pJTEpKSktNTU5OTU1LTk1NW3Jvb25wcGxrTlBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhwY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9P0BGR0JHRElFRURCRklISEVHS0pHTU1OS01OSExOSUxLSUpNSUtJSktPUE9OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRENBQjxCQEJGREdGTEhFQ0NIS0hIRkpMTEZNS0xSUkxHTU1ITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2diYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGSk1MRk5KS1dSS0dLSkpOSUhKTElLSklISkxNTU1JS0tLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYG1oXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFydXR3c0hIRklERURGQUBBRURER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpKS0tJSElHS0tLS0ZISkpMTExLSUtMTlRbXFRQVE1QT05PT1ZRT09RT09RSkpPUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0lQS0xPS0xXTUlFRUhJSkhJS0lMSkhGSEdKR0dJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1BQ0RCRElFR0dGS0pLSEVFSkpKRkVISFBKTE1KTVNJSEVBSEZKSUtLSUxKSUZFSkhFRkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjYFlfYltgXltUWFhaX15kYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNGR0VHR0lKSklJREZLS0tFRkhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUFGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJZVlVcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERDS0tOTUxMSEpKSEpHP0dGTkpLS0xLS0tJR0hEREBEQUhJQT9JSkdPXWFaW2RdX1RRUlddXFxcX1pLV1xMUlxZSU1eUFBdX2FjY2NjYlxkY2JkY2ZYUVVUU1xYW2FfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGRkhHR0pGRkZJTEpORUNLSkxOSkxJS0pISUdCSEhRTUtLT0xLS0lIR0VEP0RCSEhBQUdGRFRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJgYGJiYGNiYmRkYlhPUVFSW1NcXl1dXV9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENRSkZISEhFRktKTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTE1LS0hJQ0VARENIR0JBRkVCVlVFXFReU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJcYGBfYmNiXWJiV19fVFBPUFFYUl1cW1xeX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNQRFZeSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREBCQ0ZEQ0FERUFMSENMTFBPT0xGTUZHSUpIR0xMTU9RSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUFVUXFlZWl5eYWFlZmNoZGtscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXkxHR1hNSEhKSEdOTFFRSUxLS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRENfTERmY0RNW0heXHNtT01WbVlMQ1BgVWxXZ0pdWFZeRExRVUxNVFZRUlRYV1RYVVRcVFBmWmhoZFlUa1RXVlVbXFxgYGFiYmJgZmhmbmxocnp8fX6BhISEg4ODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USUtHYVRISk9KSU9NUlFLTUtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzWFBtSHFub2FWUHFxc1BCa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlaX1ZVV39qdHV1X2F2X1hiXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdJTEZSVkxLT0lLUlhXUU5PT0xRVE5PUVBLTE9HTVBSWlpUUVFPUFBQSkhaeF1UeGRoWVJUUXZndGxwYm5ma1FyT013bWpycHNycXJwb3CAXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zc3x9b355b39yYGBgYmJaYWBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQT01NSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dQVFBQUFFLR2Z4bGN4cW1aSkxVeXB1bXVibnZQZGVJZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGdvWHZ2anZ1cIBhc2h9aWx4fG9fX19jYlteY2RnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3Z6bnx9eXhybk5KU3ROREJFUFBJS0tKTFBPT09NUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRoYVZuTHFwXkZoeVd2VExoeH14YHl7c25hXm1vZFJncnVubXlwd2x2c3RxbG1cc356a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tS0tbVkhHRUdSUEpMTUtMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTE5QTUxUU1JPU1NXUlZUUFdaVlZUVFRhYFFPTktUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRT1BVVFhYWFtbVVNTV1tXWFdaT1NVV1dYUV1YVl1VU09YUldXV1haYFtncl5bXFtdXV9jWl9jY2VmZGNjYlljY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKVFJNUVFQTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTldUUU5VU05QTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhNTk9RUlFRUVRWUlhXXFdTU1FSVVVWU1pRTlNSWFVUWVZUWVVTUlVTVFVYWVdeWl9hXVxbWlxcYGNcXWJjZGdlZGRhWWBhY2FiaWhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkZGZoUEpLTE9PTE1UUU9UUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPWFNQTlVQTlFOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVRZVVdZVFJSV1VVV1xZW2BeVllfXV5dXF1hYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RQUFNRT1FaWVhXWFpaWFhWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFQUlhUUlFPTU9TVU5XUlRVVU9OTlFTVVVUVFJUWFZaXVxaVlZRUldYVltbV1FUVlZVVllUV1dUUlJYVlVaX1peYF9WXl1eYFxcYGBfX1piYmRoaGVkYlliYGJeX2ZkZGBiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUVdTU1NYTU9QUlRYVVVVU1VZWFteXVtbVlJPVVdWW1xXUVRXVVdYVlRYWlRTUVlXVlxeW19fYFVhXGBhXWBiX1xgXWNhY2dpZGZgWmNgYV9fZWVfYGNbWlxbXFlaWVlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSTFFUU1laV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVlZcXFZSVFZWWFlTVFlcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1bYFxgVVxdaWpyfXNsZ1xVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZWVVNPVlJTWlJUVVRYXFdYWFNYXFheXVlbXlVVTlZXV15bWFFVVVhYWFVXWVtUU1ZdWV1dYV5jY15ZYFtlYl9kZF5eY2NhXWVmaWRmXl5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWVteVl5ZXVBPT1JaUFpVVVdWU1RUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVVRVVFZZV0xSWlZdW1xST1VTWFZWU1BYUlNXU1dWVltdWFtZVVpeWF9eWVxaUldSWVhZX1pZU1RWWllaVlhZXFZVWl1cXmBhX2VkXV5dXWVhYmZkXl9kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpYVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFdXV1ZWV11YUFVcWV5dXVRTWFJYVlNSVFhSU1ZTWVhYXV5YXVtVXl9YX19YXFZSWVRZWlpgWFtUVlhbWlpYWVpaWFZdXl9eY2JhZWVdYlxgZmJkZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVpbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFlcWlZYVVdbWllcWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdbWlxfXlpfXFZfX1pdXlleVlNZV1laXWJZXVVWW1xbXFtbWVtZWV5fYGBkYmNlZWJkWmJmY2dmZV5hY2BjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1daWFdcW1xgXVZdXVNQVlpWVlpVWVVYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xTVllQVlZWVlZWVFZUWFxcX2BgXWBdV2BeW15cW15YVlhYW1tfX1teV1hdXF1eXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNhYGVjXWZpZGVpX2ZeY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFkYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBYV1hYWFdWV1ZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBfXV9ZWV5dXl5hXVtaWVxfYV9iZGRlZmdnYlpkZmdpZ2NfY15hZmVaaGljZmljZV5iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWFddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FiXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNhUlxZT1hXWVtaWVhaWWBdYGJiYGFjX1xiXV9dW19eWllVWF1dX2BfX1taXl5gYmNcW1dbXWBiYmNlZGdmZWdkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9dXF5cWF1cXl9hY2JhYV1iW2JkYV9jY2JdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGFUX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxeXl9aWFZbX11cYWFfXVtgYWJlYl9dU1xfYGNkZGZlZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent7e3t7e3p7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6ent6enp6e3p7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0s7O7vr6+vr7BoYqMjIyMjYl+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/wMC/v8nMzMzMzM+qjZCQkJCSi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEg4GCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXp6endvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2AgYGBgYCAgYKDg4ODg398fHx9fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV5dnZ2ent4e3h3dnh7d3p5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp5eXl5enp6e3x7e3x8e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx6fHt5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHt5e3h8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6e3l7d3x5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en17eXx4fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h5eXl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4OBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnJxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbW1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgYOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4GGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fn17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/gICAgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gIB/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4KCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn1/f35/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSkpCLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCBg4GChIWFhYaGh4aFhoaHh4eGhoaHh4aFhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSDg4ODgYOEhYSEhYWEg4KEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGGjYKCgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/f4CBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYKBgoKBgo+bhYB/gICAfoCCgYCBgoODgH9/f4CAgH+AgIGAgoOCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoGAf3+FlpuIhIKEgoF/gIKBgoKBgoSCgYGBgYKDgoKCg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRjo2Mh4WEg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4SEg4GAgoOKiIaAfX19e3+XnImDhYSEhIKBgIGCg4KChISDgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhISFhISEg4SDg4SRlJOSko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgICGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+AhpmQhn1+fn6Hfo2chYGCgIGCgoGAgoKCgoKCg4OCgoGCg4WDg4ODg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYSFhYSDg4ODhIOChpSUkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH5+f36Gnp2GgImAf4eBgIyCgYOBgICBgoSDgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCgoOCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIOaoYiFiYODgYB9gYSDhIODg4OCgICAgoKDg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhISDhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZCdhIKChId+fn19hIWFhIWEf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDhoyCgH+AhYB9fXuCh4aDgH9+fn5/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4KAf4SNhH99fYCGgX9/gIB/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoeGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgICBhYSDg4F/gIB/f3+AgICAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4F/gIOFg4GCgoKCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODg4KDhISEgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYSDg4WDg4SDgoKCg4F+fX1+fn5+fn18fn19fYOHiYqKh4eFhoeHh4eIh4eJh4iGiIeGiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4WCgYGBgYGDg4SDhJGSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhYCChIODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4OEhYOCg4GCg4OEhYSHkpGPjZCMiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4GAgIGDg4ODg4KCf319f4CAgX99fn59fH19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn6AgoODgoODg4J9fX5+gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf3+AgYF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/fn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7f39+f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp5eXl9gH+AgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf3+Af4GAfn9/gH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f3+Af4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoB+fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOAgoOBf4GAgYGBg4KCg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f359fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f4CAgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCg4GBgYGEg4KDgoKCgoCBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf39/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GDhYWGhoSDhYWDhYSDg4SDhISEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHyAgYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgIGCgYKAgYGBgH+Lk4+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX19fXx8fYB/gIB+gH5+gZORjIyNjo6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY6MjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuKhoSFhISEg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fICDfYx+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42Mi4iEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9e317f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYeGh4aBhJGOjIuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn56fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJi4mLiYWIkY2LiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx8fHx8f4B/f39/f4CAf35/fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgX9+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnt9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCAgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4ODhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgoGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Ign9+gpCEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f3x9fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/fn5+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1/f4CAfX5/hIB+fn99fn19ioV9fn59fn6Af319fHx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYKCgYGCgoKCgYGBg4ODgoWGhIOAgICAg4F/gIGDgX5+gH9+foB+fX5+gIB/gX5/gH9+f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fomGhoWFh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dXSAgIKCgoKCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX18fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX5/fn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Bg4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf35/gYB+gYKCg4GBg4OCg4KEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhYSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfX9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgYOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgYSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9/gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgIB/foCBfn+AgoGAgYSChIWGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4F8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH+AgIB/gIF/e4B+gIB/gYCAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/g35+gICBf4GDgoODhoSAgX58fXx8e3x4eHt4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59gICBgH+AgYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af319foCCf36AgH9+gYSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6enp4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f39+fnx9f4CAgIB/f39+fn18fn9/f399fX9/fX5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9e3x9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GBf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f3+Af39/f4B/gICAgIB/gICBgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH19fn5+fXx6fHx7fX17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+f3+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59f4B/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CBgX+AgYB/gYCBgYOCgICAgICAfX6AfYCDgnt+fnt7fXt6fHt7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBgICAgH+BgICBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX6Af4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYGCg4B/goGEg4OEgYGDgYKCgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCf3+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fH19fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYB/goGBgYKDgoKDgYODgoGAgYB/gIR9fX17f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGCgoCBgICAgoKBhIB+gYOCf36Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4J/f4GEhIGDf4KCgYOBgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhIWEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3x6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foB/f4GBgICAgICBgYCAf319fHx9fHZydnh5dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICDhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHyAgX98fH16ent9gH5/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgYSFhYKCg4OEgoOCg4KDgX6AgIKCg4KDg4OEgoKCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgIKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhYB+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODhoKDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CCgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhISFg4eGhoSEhISFhIWEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgX99fn5+foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhIOFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgIJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgYR+g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3x/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WEhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSBgX+BgYB9f3+Bfn9+fX+BgH5+gYKAgIGEh4aDg4aEhYWGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYqIhoSGhoWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX16fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WDhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+f35+fn98fX1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXt8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFhoeFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaHhYWGhoWEg4SEg4SHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fXx8fH18fn17fIF/fXx9fH18fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoWHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhYWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4eHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4SDg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e318e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaEhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgoKCgIOFgoN+gYGBf4OBf35+f31+fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2AfHt7e3t8e4mHhIaEhoSGhoWEhYWFhISDhIKAg4GFgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIiHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4OCgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYWGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4iHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoeGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnt7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn1+f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYSFhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSDhISFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn6AgX5+gX5+fn19f3t/fHt6eXp6eXp6fHl6enp7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoaGhoOEg4WChYGBgH9/gH9+f4CBfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aFhYaHhYeGhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCfn5+f35+f4R+e398fICBfYGAfX2DfH5+fX1+e358e3p5e3p5enp7eXp6ent7fHp7fHx7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4F8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBg4GDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSCg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn99f4J8f399fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt9fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29jW19fX19fX19bW1tbW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjImiv7y9vb29vb29vb29vrSKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZSfK6qqqqqqqqqqqqqqqybU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/ODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaVoCvq6urq6urq6urq6uunVhXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZGGGsq+vr6+vr6+vr6+vsaFiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzLz9PT0tLS0tLS0tLS09PRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz8/Q1NLPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tXV1tXW1tbW1tbW1tfW1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHRyJSn0tHHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2t0ZmsnLDRmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIiancSUiJyexJKGnZzOz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZnCv8mYmMW8yZeZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5SfzNKUlp/O0ZKZoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEmNmvn8Kb2q2jv53V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkJ7DzouTnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qiZr8/bpZmz0NuimbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Nzk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWaoKuRp5mgrZComJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp5+xpKSooK+noqmc0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI221pyRjrrVmpGOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dPTucfW09O4yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnp6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipKmnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6mnqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqsqKirsKmoqqihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYW1odWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb21ocXhveWppYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3lmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDw8HEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMnIyMnHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBzsPKysjGzMrNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVvdGJdYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBwsO/v77Ey8jKy8m6ztPIyM3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnZGplYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDubi5u77Bx8HFw9OJqc/ExMHEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e9xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmdjW1paXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9wLm+urq0wLi1t7Ouuru2vsy2hJ7SvL/BvLvEvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vsvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCnoaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmJnamdmaWVpXVZWVFlPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLewrre1uL/Pm4GKtcG6w7W6x7i2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGhoqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2hYWE5LS0tSSUxIQzk9OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7i0rbiytr3FxYeBgJ/Evse3ubitt7W4urS4s7vFxsvBvMbAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz89PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2kr7G2urG9vrvEtrecfneCdISTwax7gYKcycbPwsC4rrW1vL64urK+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG54Y2diW2NRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuro7C71Nq7ur68xrKdd2NsZFBbYX2PeoWGmcvO0czKxLW6wMPIv761v8G/xsa/y8bDv8G8wMPMysfFxsC5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLGzxKKy27+8vbp9ZG9gYHNbVFVYbHyGiJvIyMzLzcrGwsTLzsK8ub25ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8t8Fvb7DNwbR6WkpkY0twfm5gUVl4gougxcLHy8jBw8HAycrCwLu6sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7/HfW92pL+bVVJPg2dPXHyBg2xGa4KQrMO9v8bAucC8vsXEvb25srCuuLe/w8fDxLy9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pW19fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnHyIJ/bn+lc1FMYpVfUVFVjpZ2TmWLnK64uLjCurO7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9mXVpUSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa4x8iKg3h0jWFMYopxXE9WZLC6d1ZQfq+wsrG3vrmytbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZxbF9jYVtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8PDkYh/f3lWUY6Ua21WZXBnlH5xbV6HvLOwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTUE+SUJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i5w6KQiZB+Sl6Yw3SBipBddnxpanSKtLu1sbS1srSvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1sruvlJCdlkxijZR2cIB6Y2psc356c566ubK0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ytKadqo5XgW9ualxoX11WWV5nY2mAl7iyrbOvrqyutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj4+Qk5CXlZaYn56empiml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR1BNTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6WsqbHAt69oeHhrc2hZXlBKSEpMUU9aa26itqqytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mao5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01KSEdPUk1KTkc8RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqKGlxMOOYGVjcmNUTEZdSVBGTUtLU15dfLavr7O1qqesq6KcmZSOkZaXmJmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHl5YGJSVWBJSUpLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6Xn6WenbmxhXpnamNWSFBejntsU0tHR05UVGSrsrCwuKymoZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKxtKqyr6KZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk9VTFNMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpyim56jp5p9bF1UTElVg6qxn2hQRkNDR01elLCtrK+nn56ioJeRk5ugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFJVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKZnpuhoaGGbmBVUE5PXKvg2rqPdWJTSEJNi5maq6qppJ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+nqKWkn52qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JXTkpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKSgdFlST1JSXXW40rqgqbmehHmJrsSjqK2pqqWfnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHFra3VycGhXW1FFVEhESlBJP0VBNEZIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfn5qgnGZQSU5QXXWNsr2ph6Lc1s7U2ci0rqejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsHGvrq0urq0u7ewtbKqurKuu7e/u7qqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrZGhveGpkWltGS0xFRFNMREJFNzo/OzU0OTk3OD4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaKdnJRdS0VMU3WFs7akkonF49zRxLWmn5mcm56emZeXl5KMjpeXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczQ0tXO08m9wL/Du8bFyMXR1M3T0NPTzMrCxsbHysjOv8jRzMfFx8XBvMPBvr++tb6zrr+/wsPHxMfErr+4sri8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOfnJ6WY0pJTVx+qtHQtqCz08y6r6iin52fmpiWlJKUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LV1tPTyMzHzM3J0s3O083FyMnKwcbLx8jJxr/Ds7PIxMvKy8/Gyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2gpXddZ2iDsNLa2tbKurKqo56dnaGloJ2alJSVlIl8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLW1tnV19PW2M7Sys/RzM7QzNLPv8jHysPMzMzOz8XGx7a/yr/RzcvPxsnIv8PDyM7Mz9DPzcrHzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSEk+O0E4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoaqJgZKvztTZ2s+8r6iblpignJuhop+bnJmViXdpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV19fX09bP1dTa1NTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ2NfY0djS19nV1szPz8rN0svO0MDGwsfFzs3R0dHIzM3AyszF087LzsjEysfGyMzK09PR1c/SzNPBucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaaVe5OSxdbS1cKtpqGYlZeZmp2gnpmcnZJ9cWVjY19fYV9fYWBfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY2NfLyM7Eyc/MyszAyb/Hyc3Oz8vQzc7Mzs/Iy9DQys7KwsnHyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPTMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsrammdml/lNPWzbCcm5aVl5uenp+dlJaYlIhrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Hzs3N1MzO083L19bQzNHUy8zQ0tPKztHV0tXVysDJwcXMwsjJwszDxcjKys/KzczQzdPLxsjPzcjHy8XGwcXKy8zP0cbQzs3NzM/Fx8G4ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV5cHFrbWdgYHBoWFhoVkxGTElQUEI7Qz47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKihqGRvfKjZ0KqVjo2YlpGTkpGWlpaQi3xlYWJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8W6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL7Ax8vLy87Cy8vIx8vQxMXIu8fDycjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7utppxeb3e60KuQjo6XkIeEhISCfoWFf3NgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLLycHCzNDFy8i/ucG7xse+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xry8wMPEy8XFu8DKwsXH0sXByb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3ZzdGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjAtMO+srKNYHKBv7CQi5OXh3uBhYaAdnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy8urjBwcLFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDv7zBzcPGvb21wb3Dur3Gu8K6s7zFxMHCtr+2tb2/usvDvLW6yLq/vsvEwcbCxsnGyMbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztHKysrHzc3O0cjQxtXU1tfNys/FycXHwLjFvauvfmR1kLWSjImLhXmBh4eAfoR8dHRjW1xdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLOztLy2vbG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bBwry4vcbBw7u1rrK2ur+0xLe7tau4vb3AvbG6tq+2urPFvLeuu7+1t7TFvL7DxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcXAvri3ybWpsIJtcZeajYaJint5foaGd3iCfXRpXl1dXV9gX2BkYV5kZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquts62prKm0r7ewsqmupqyyvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLCnsrO1u7yrrrWlrrWvu7Kwqbmwrbuuu7i7wMC9ucK/x8PFwbzGwsjLuMXHxb/Gw8O6xMbCu8bJzMuzucK8u7OIc3Z2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xMTDw8rBycq+v7zAurKztMOuqa6GaGSKkoiOkHx4foqFenuEgXduXl1cXV1fYF9fZGNiY2NiYF9dW1taWl1aWlpaXGRub2hmZ2lrbnKBrbmwta6mpaenmqCloZqcpauupKiirKqsqrCjpp+qrbW2sb25r7evqa64tLS8uLS8r7e5tbK7wbLArqWpoquxsrOovaqrqKusrbSzpqiuoaSvqbKmp6iupqi3rLGyt7q6u7K8vb6+xL+1wsHHyLe/wMW3xMK/u7/Ewr7EyMzKv77EwMCph3N0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvJtr3DvrrJt8HDwbS1u7WwrrS7rainh19xjoOIi4B7foB+eHR/fHN3ZV9dXFxeX2BeX2NjYWJgYF9dXVxaWFpbW1lYWlxfZmtmZWdlaWtvcoWqpayloJyipZSepZuYkaGjqqSin6alqKWtoJ2cpaassq+2t6ewq6iqtKu0urG2ta62ubGvurqxtqSgpJ+msaerqLmqpKeoqKeyraCnpp+bpKasnp+no6Chsa2trLK0s7Swtby2u8HBsrq+w8GyubnDs8C9v7W4u72+vMLHxMLDvsDEoIN4cGthZl9rb2BUWV5ITmdPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8jLwsa4t8fBzL+4ybe7xbizxLizvsCrtbuxq6SusqyfoophgoeGhoF8eXV0b21rampxaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeWm6KWnKOZlo2foaOnm5+gpKaiqJ6bopufq7CssbajqaqqrKyktLmtt7Css7WusrWusKqfnZ+korKkpqm4raKmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2vLy6q7OzurO9tLaxsbW0v7a9wL3Dwbu7vZeDe3NrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vEw8++uce4t763ssG0sbu7q7i5sKGdqKqmlp2CZYKFhn94cm5wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1hYWFhaXmJkZGVmZmhpa3KNp52UlZWbmJuil5aRnKKiqJ2bnaWmoqacoKCbmK6ura6yoKWirqunorWxsrKsqK+yp7qzprWgop6bo6Gto6Kqtaqio6adpqajlpmel5mbnaCal52dnZytoaunpKSmrauztKq1sLOrsrm0r6qvsrKzt7Ouqayusriwura6vb+3s7GUhXl1ZV5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLMyMa/xbbBv8fOt8DEvbO5ubK/trG4uqyxtK2dmKOonpKad2mBg4R/eG9xdHFpZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqKclJSQlZeXoJeZlZegnqGclqGiqaSfn6mdnJqrp6+wqpujpLiqoaCuqLaqpqetsKS3sKS3oKKbmZmqpqGarLiwoqGknKKfn5OUoZSWlpuYl5aXnJWfqp6qpKKdo6qqsK6otKuqp62zsKWrrrOxsLCur6anp7KusbSwvLS5t66jlIF5dWReYVZZV1NSVEtNXkxPS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri9rp2nqKOqu8C9wLmutLjBzMfFwsO9xbfIzLLBwsGtvLu0u7y0uLmvr6+nm5ifp5KPinB6gHx3cWlscnRwaWhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmqBlpOVjJKUlJuZnZaWnKCcoJahoKempKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsK2rtJ6gnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJKXl5iXnqecp6GimaOlpaukpbCnpaOrq62mqa6vrquoqqmzpaasr7Sxr7y1sa+uoJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxse2xsSzwr/Fqre3vba9urq1squrpZiXnaGKh3F8iH52bmNhZmloZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVVRWVVNUUlVgYF9gYV9gYWNkaYGUk4mQjpSTlJ2VlpekmaCXnaGmoq2mpKSjo6KcqqulmZ+lsaqgoJ2lq52nop6trKmprayhoqKVmKObnJCrqbCbn6KfnpeZk4qekY2Sk5aQmJiTnKGjnaSgopWgoqSmm6OrpaKkqqSrrqWusqmmpaamtKapqK2ztbS5uq+prJ6LcnBvYFtXVlVSR1FPSFpbT1JKVEtTTEVGSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6PDw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm9sb7EyayxuMG1u8C7tLOoqaSUmJmah35wh4N7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eXl9fYmRtjpCEkYePkY+ak5WTnJujnJuhqamrqKynqKWkmaWupJSZpa+pn5uZm6Cerpmbq7OgpaafoqOhlZOblpaSqaqtmpyfoaCalJCMmY6MkYySjZaVkJ6hoKOcm6OVm6GjoZeiqKOiqKugq6+jrbelo6OirK2qqKuvs7ezvrWzq6+YhHRzaFtYWFJVUUVYTFFbWE1UTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62os7auqaevrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEu7e7w8ixrbi/t7y9urKzo6eelJWWlIV4c4B2d25taG1ubXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXVxcXl9gZH6NgYt/jJCKko2XkZeZoqCboKuqpq6sqK+kqJqfrKCVlqSop52XkI+anq6WmKiqmZ+dlKWgnpKQkpGTlaerpZqZmZ6elY2Mi5OGiI2DkIuRlZGgnqGjl5WflZqhop6Um6Wlp6iooLGwprG8p5+jrLSrrqewtbC5tcCxrbGrkH1yc2JWU1ZOUklGVlBSUUxMV01KTE5SR01KQUNGREM+QDY1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqaisKudqqepsrGltsa0ubqzysW5usHL0Muxtri8vsHDsbCyt620s7qysaGhmpuWlZKBfnZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKl4mUlJibmZ6pm6CqpqWrnaiZoaWbk4+fo5uXl4WEkpujj5SjnZaWloiim5uTi46KkJqkp5yVlZebkZGHlI6LgYuNf5CKkpKSoJqfopWTmJiVoqaZjZmkpqimoZ+0sqiyt6Gcoresqq2ksrKmtby1rKuxo4l4c21dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2saWno6mloKilpLOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq25rqudmJmblJKFeoFtX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOho5ill6KclY2HmJqMc42Dfo2XloaRmZCUjo57mY+cjIKJf4qYn6OekJOYloWNgpR+fnSJjnmQh5OPkJ2amZqRlZCdjqKjjomaoKGkpJuitK+sr6yfmKW4pqaxobGunLC8qqmvqpmCd3NjVk1ST1BNQ1NOTFFNQlBRSElOUk1ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6a0wbiwtLDJxLe5wc7FvrOsusGrrcOtqKKmkp2mtauhnI6UlZGOfHZ9ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5YcpCDl4aOnZeLlJCfmJ2VlJaVj5aJgJOJXztXb3yLlImAjJGMkIaGc4qFloF5gXqFlJ2Ug5WOkZCDhn2TeHFvhY19iYGRjY+XmpiTio+JnIefmIeIlp6aoaCXp6+praion5ats6Kmrpmsq5iotKKpraOTfXJuYFtOU1JWTERUSlBNTEZOT0lFTFFNS09KSU1PRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6OpsKintMG5sbWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm66gmJWFk46KhntydFxRTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQH+VkZF9iZSNhIqNm42WlYmSiIaVhnmIf2BKUW54ipGEfYSNioV/f25+f5R3dXV3hI2ZcFGNiIqGe354lHZod4aIfoqIlYqNkZKWi4SKiJSEmoyChJKblp6dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoqaoiXRtZ15bSFFRUk1JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+ir6GnqKWnqK+tqrW8tri3s8G7tqe5yLi2qKi1tqqyvKaelY5/iZOnlZSJfY2DgXx2b21YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJOBkpmLj3uGj4B2f3hzbnVwdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gXZycpJ3Z3WEhISEe5WJiIqMi4B/hIuMf5SDfIGQmJWclZGfnamen6CdoKmln52Yjaekk6Gflp6epIBzaGBcXEpWT1JHSlhST0pMTVJKSkpMUElMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlraywsaq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGNlICNm42QfnaFd3t1b25oWEtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfHhmd42XmI2PfWh5gXZ4gImPfYSYkoFxh498d3tva36tfXOQi397hpKBfX90ZnZ8hmxvaHN8iYyIgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX6Me3V+jpKPmIqSmpujlpmdmp2eop2WjYulm4+el46WmI93b21lYlpXV1RRSlNVVE9QTlBWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmwr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mOhJJ5iI2KiXVwe210cGlsaVdLRkdFQUBDRElMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCSlZeZl56XjIOJn5GLko2GkJZ+bmlubm5XVVdUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ozk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCirKqota+urLS/q7zCv6aimZWkl52NhIuUoaGYmJGTi3OOen+Fi4V0bnRrcGxka2pYTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyaknRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxgHxncXF7bpONj3tzfXxxcG51bYJ/eHl1anmJgoiKhJaTkpCLjZGUlI+XjoB5iJeIhoqGgJCIdmpqb2hkV1FaV1lZW01QVVZZWE5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfprqvq7KwwrG7w8ealo+UmYuNhXmEkJiUjZCMj4Zxh4Jzh4yFem9ycG5vZHBmX1RGSUM/PDs5Oj9AQURERUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgYWBeoSGhnlyoZV0eIFzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBnZmJqbnJtcIN1aW9YdXCOmpJ3bH97fW1xbXCAenN2bmN2hH6GgIWQkYqLiZGLkYyLj4N1eIuPgH6DgH6Pe3Jwb2xgW1xdW1lYYF9STltaWFdMSEpGSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ6kp56vlaW1qq6xrsGyu8HGlpCMlJCAiH1ugZCSiYOKh4+FdYKDbJWIh3t0eHhsd253Y2leSVBHPkA3NDQ5Ozs8PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgYWZhJucYYaqn52Lg5COeneIfomIjXOKl4+Eel1kcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenB0endrbmled4d9h3yIh4+Ai5KXg42FjYd9cYR/hH11d3t8iXZwcnNmZ19bW11TW2ZeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnZ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF+cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbXyBhod9jmhnaHh+boWHgoVxhIVHa4B3cnl2aG1rX3d9g4l/iIWMepWem4mLiJF/enWLdnx4bW93fn9zc3FrW15dW2NjWGZlXFVQUFZZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9P0BCRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiJGBmpWCoKGXlZuapa2Tmruxp7vHw6iKjKGlj5SJgZF7coSen5Gcf3aFhYqPiJBqaG+DgHWNh4SLcYaCd4eAe3aFfW52dWeAlI+GiYiIiIehq6GWiY6Yf3uCiXp6b2dreH55fnJqZF5bW11pXGFmX1lPS05XUlFJUEpETkdDSkRCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRj4uam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc5Oz0/QkVISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISkxLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPop+UmZKEioWPmJGWbHB1iYuCloyNj3aPhHFshYGKlpKDhYhyiaGWh5OJj4+WpbWpm42VooOHk4R9f2tqa3yAf4FzYV1jX1pmalxra15XS0dPU1FOTUxGSVBDRE1GQUNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+mJaalZ+fnKegqpaTmJ5nZaSafoSSkXmAkoiQkn2KhZmSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjU1Nzs/Q0VOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZ2fqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+ElJKFnKGampmnkZGIlaKamnd6fpSYkqGSl5eBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N8fnpxaGBcYV9hZmNgZ2dcUUVKS1BPSUpMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWChomBgIZ3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpNT1FZbYaQd5WLo6eqtL24pa6srKiptKuwt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsrauki5aYhaamoKKXgaaZjaKqqKSHhZOkoaCqoaSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWriJqJkoqWent+hH1mYGhcZWJdY2NeZmZeW09DSUhUT0ZITEZKR0VGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCnIOSkI2S2sidlnNWl4iPiJyPfIaMjoqKeoiCh5GOg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJTVVVXVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHw6uzxrattL+zuL62v7TBtru7pLjGqbbJx7W+ubSoo7StsbGcmpKan4mnr6uklXafpJehq7GzmJaqraiutruyuqyvtaKxrLG1vLe1rrWgp6ijqJupsK2yuri4p5u3qY2ljpGToId5gYJ0WGFkVmVhYGJfYGVfWlVKREVMVVFISkpESUdFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hX6AjXu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeFgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjUwLzZDSENRXE9RVVdVXFdQX1VJS0pBQD9HS0ZFRDs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMm2vMW9tLTAt7jCtb+wuHSytKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbGupa2sp6SYoKyzuqKpsrq1u77Mv8XFvb2zwre6uL+3ure5rK2wprGqrb6wvbvCwqyZuqiUro+YmKuJfoF6aldiYVhqZGhkVlpjWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWVVad2pwf4+EgY6FbnpyeYhiuKGZo4mVk5aTk5ONkJeSh4d7hoGNlYqAhICJenyLh4Z8ioOBioOVfXd5dWVPXGRHRUw6UWRhW15TRj87SFBEWmNRUVlYWWdaVGBgTVNPRUE/SUpIRUZBQEM9RTZCPkhHS0xTWlRdk6+4tbq5ycC7vcnMu73Au7e1vLu3vrW6ssZgdbOlsZqeq72qpairqqOisrWhq6eelZafmKCupaenpZ6klKKnsbSnsrK8tsG908nK08bCxczCysPAvr2/u7y3tLC5t7fDusa9w8mwnrmqoqyPpai3iYF+cV9hYVxXYV9oZlJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUFBRUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWhsbHGQjYWQdG1zcnOI1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLf4N/gnh6i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV5vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVlxaW5K5wLm9t8bAu7nKy7q2ura4ubO4tbSutraZZHWonq1wXqKsnJiho5uknqullJ+fkJSOlpiXqJ+mn5+amYSknaylqrCtt7C9udTRz9fPyczSzM/OysfAv8LKvcG9wsDFxMbKv8jOtKS7sLWwm6y5vZp/eWxdYFtYXWFaY2JRW2BTUUtDQUVGRDxART5CSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KRlG9sb3V1iLOsoaGfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYRze4mDhnyJdIKKhpV/c3t4bG11e2hyZWlsaWZqaWhgZmlobVptdJetpLyIh2dbb2hdWllUSEpOUEpLUUxUUUlMQUpHS1BfX2JmaWGYt8ewubO7vrayxMe2sLmxsLuss7Gnqresjbannpunmk+bnYyOoJaRppillYqTk4mQiY+RkZ6boZiblZeHnpqmm6yvqK+ns7TU1NXW0svP09XO08/NxcLJ0L/KycvJ0sjNzcLQ0riwxLzEuqa2u8Sjgm5jXFxdWGBXWmZaUFxXTlBDQkhFQkk7QUQ+QUg/P0I3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmINocW95eYOgqp6ml42bm5eLjZWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfXF4dWxxeH5xe214c2xogHBtY2ltcHlpd31+y7/C36dtY3huY1thYEpQUlVOWV5QXV1OUU5UUVVUXG5ud4Jylq64rLSnsLarrb3Asau1pqW4p6yuoay0o46xrpqYmIyRlJGEjpuBjaaRnImDi4SKiYSLg5SVmJeUm5GcmJmZnp6rrKSnoaysztLV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbGwM7HyMOpv7jQnnluZV1iXFZfUl1bTk9TUE5IPkFGQUJFPEBCPkVFPj8/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bXdwfX6AoZ6eoYuNmZOTjIuTj5aEeYWQkI2LioiRh3+Ce3J+gIKHeoV1hZORiX9vdnNsc3x7dnxzgXdxaoBycmlvcXp5cnu+y5p+jLGDdnKEdmhhal1DWlpbVmZkWGVrVFhdXGBjXWN4e3+LgZmqpKShoKGppqqxuaqmtKOiraKjraKnsZ+JppqUkpGKko6IgpOJa5WijZiEgYV+kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMfNz8jCy9DT0dTSztPNxtbSzNTY1tbY1dfVydTazcnX1tHKrcTDzIpyb2JgX1hTWVJbT0pHSUlKQDs6O0VBRDxCRD5IQj9CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN5coKJgZ2VnZSFi5aJj4qIjoePf3eElJmLjYiIi4l+g3hze32Dh3eAe4eRl4GDbndwbXV/dnh9c4V8eWyHdnRvfXaEdXl7nbWMPEGKxqV+jXxpZVZJQ2VjZmNoamRveVtfZmhrbmlugIOJkYudnqCdkJeYn6OjprKkpLOgoqWeoamgorGchp6SkpKQi46LhoOPhH6cm4yNgoSFepR+gqmVo4ySipiSi32XipqRq7OYmpunnKe9w8a4tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1r/MzLR3dm5kXVlSVVBZVkVGSklFRT06NzlAQUI6SERARUNBREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqCh3x4hZaXiI+Dh4aHeoR5cXp7hIZ1eoWOjZ16jHB8b3B6f3J8gXGDh4Bujnp1d318gnV/fIeIsHRYqcK2jJKBcG5iPV5ocnBxcG54d4JlaW9ydXhye4uHjpSSm5agloeMk5ugm5+qn6GtnKKamZ+lnp+smYuajJGSjYV9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI2VjIZ7m4iTj66qlJWXnpimrra9qK29xsvIycvLz8nD0crU1tjX2NfU29fT2dvWz9va0dbI1cuVeXpoaFtZUFNTXUhCRUlJPkE+PTc6PT87Pkg9QEFBQURBPj86ODdEQjc1NTQ3OS41NjY0MzU1NDIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fISXjoeLfoaHgHeCeW57e4aBdHqSno2hdo91gnR1gX10gIRvgZCBb5KEdHyBhXp2hnuJt8akwsm4gZabj3hwZU5mY4F6gXeGopCLeXl3e4N/fIR2bZSWlJWPl5CDiY+WmpeXppyYoJefk5KXo52Zq5aRkYuNkoOMhYmIgYWQkZ6cmYmFi4GGl3uIiJ+XkImNiouCfKGJkIu8oZiTl5mcqKalrp6ntb7AwLnHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGhnp5ZmhkX1RXVlVNS0RNQzs9PTw5Ojw+OT5BNj4/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB/gH2Fen6CkYmEhXqFiHt1fXRufH2GfnR/kp6Rn4OSfIZ+eI59eIqKboKagHSYhX6BiYV8fpB6j6mPkMOgvIyco5x9iYR9iXOMin5zppqcmZSFe4+QiYRoR3GhpJ2Mi5CShYiLkZKVj52ak5WRl42MlZ+dlKGUko6OkIt+kI+Oi4SJkpaan5+JjJSSnpGCi3+mmYiFjoKGhIClhoqMuJidkZSWoaegnZ6do662urWrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h5d2ppZFZgW1NPTkhETEI9PT45OTo6OTk8PTZAPj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBj4pxcniKe3t/fX98iHp8e4uHgn51g4Z5c3pzbYF+hH13hpuhm56UkoCLiH+Yh4Cckm6HqIV6oIt8kI6DiIScfpqRio2joqCQpK+fi5GLhYuBkoZXcq2Ln6ycj4OYm5CQjlyDopGCjJ+TlYyGiIySk4yUlZSQjI+KiJabnY+VlpGLkpSGgIuJko2Kip2WmaOjhpOdlqGLioiOnJCDiI+Ag4eFpIaMkLOYnJKUl6GhnpmSm52nsbispbzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2p5vfHRnZlxdWFNWV0NASUQ+Pz46NDk6Ozc6OzozOzs/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDbm13i3h5fnqBfYZ8e3aGhIBzcIWCe3Z2dXSEg4V9fpKmo56mopaJnZCUlouKqJdyirKNg6aRhJmThJmMopagmZOJmp2ikqmvn5GUkI6NiJWLbo23hJrEyLKdoqWbnJiWkbKQY6TNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhICPi5mIjZCql5eko4iZnpabiY+Hl5eLhY+MgX+Gj6WJjZOomZeTlpihmJ+Zk52borK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oYl5dXU5JVFlBQkdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdoGOfXxtfoh4en56goKDfnZ2gIJ8bG6Lf3p8eHh8hIeKfoqjs6ejqrOhlqefpaOWla6ig5C4lZKymYyhoYykm6+jpJ2YkKeWp5msr6SXlJaVkIuYmZagwI6jybmrm6OmrZiRm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4eUmIaEkZCcdJGYspaXpaGInJqTkIqRipebiYqWjoZ9jJieiZCQnJqZk5iXn5SgnZWem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LQ1tjT0Ni7cnl2XWBVX1ZPSEpOREJDRTU+Ojc3Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OklFTkVEOjZBQEJTPjlETzMyMzU2NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSWZgO0iEi3p7boWGenyEeIGFgX5weHx+fW9yjXp9gXx4houJhoSSp7usqLK9r6Sts7Ooo6KwrIqatJ2iuKSVraSXqa23pqSjn5mpl6mjr7CqmZiclJWRl6CYmru7rsqhara4q7CUmJ+jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHk5eMkJWNi4yXmJKcmbSXlaudi5yUko6QkoyZm4qRnpCLiZWfoY2UjZiZnJKbmJ6UoaCUnJylr6ihpLO4q8LIxLW6vbvFx8fC0aDGyc3NxNfW0cvUoXB6aFxaU15RT0VEPjxDQUE4Pzg3NT9GPDw1PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEpAi4p/gXOGh32CiHWDioJ/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7aMp7Ktrb2qm7ukqK25uKumpqGio6Oor7Kxqp2cpJibl5eeoqalkqS6rqnAvK2tsrmlpKd+iIacrb2wg4yMi5CDj4ORj3qBiJCNjpyIh4+XjYuVl5SQmpedqJqxmpGsnI6aj5KOlZGQlpeOkaCRiZSbo6yUlo+UnJ2ToJ2bmKChlJqep6akoqSws6fBxsOvsLq2xcTCvs2mx8THw7zV0c3Eyoh0cmFbWV9bTUpCTEBGRz5BP0I7OjQ+QTw9NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFSkhOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxlR2BpZ1pdXJOMjIh7h4uGg4x1hpGKgW9+e4F/cX6BepV6kpSUmJCTlaezxsm/wszBw7nHvLqvq7m7l7K3urLArqXApKuvu7yqraujo56nqq60sKqboKqboZuVn7C0p4ujurq2wbysqJyypaSolIWOqsTEpIKLj4eIhIaVlI16g42Rj5GhjIyUko6Il5+Xk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+hmKSfmqCboJSYnqWjpqakr66lv8TCrqi3tcnDvrbOssS/xLyz0cnIwrV0eGxcWFtpUkxIRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk5lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoGQeo2hlqiampi6vcfIycHSycrCzbzBs627vqe6wL68xLeswamss7u+qrCppKWjrK2zrba1oJ+unqWimKOzvambqL3Bo7e3sKuSsK2rrJeHmqqnpZGCjJOllYmBdoqSeoWNkpCen5OPlIuPjZSjmZeclZWjnqmfkaWajI+Pj5WWiHyPlZKSo5qVoKKctaaQnpeko6Klnp2mmJ6Vl5uko6inorKsqLzAxK+ls7fMwLmuxLO7vsK4rcLDwsCZbXlhWFdbW0tLTUpGRERJQkJBREw6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+JoJOEeIV/lX9/kIiKkICWoZmupqOYwr7Hw8fF083Ozcu8wrewuby0vMu8w8G1truts7+5vK6vqKCop7atramyt5qerKKnoZ2rt7ippLC/xLG+ubOnqrWzra6XlqWsqKCRjpKxxaeVjn2RlX2IkZmQqpmYk5OPk5WTpZ6TnZmUoaOinJifmIuMj4+eiFqQlpeSlqSZZZijnrKllqKWrKyqp5ueppeYlpiVoKOopZ+2q6m5vMO1prO1y8C4qrassrq4rqi4ur24gmtuWldUVE5GSlNOSz9CSERESEdHOTVGTTs+Nz1ASi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZGDh6aTiIKHgpyEg5WQkJOOmqKfr76uoca8xcTGxs7OztLKvru2sbq7vL/PtsS9uLi3srG1s7izq6acq6u4qqinr7CXo66kp6SktcCwq6y0v8O6wLqzp7m1uLKulaWtr6+li5OVoY10wZp+l5mFj5aajLGVmpqVk5OZmaWjlZ+blpqpnZyhoJmKjI+WnWBKlpyalZqlllSWsJ+vnJ+llK+uq6WaoKWUk5iYjpyfpqKZtKmqs7y8vKqwssfAuKWrq62xsaOhsrK0pHBtZlxaTlBLRVBQUFE7SEpJR0lDQz46S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4unlo6Jk4Wfh4Sdl46doZqjpLXItKnGusLDx8rIyMzNxr67s665uMHBzbXHusG4tbqwr6+ztKajm6q0tKqopq6smqStpaSnrLq/qKu2t77Bv765s7LEsbm9rKOutay6poicmKabdr+ghZmdjpOZmouvl6GcnJeVm5+hqZ6ooJqaqpmhp56YkI2RnYNudpKimpWdop6QrrKiq5WoqpeqraOjn6WokpKZnIiUnKKel7Gnqau6tr6zsq2+ubego6eopaecnK2pqYxiZWBfUUtNR0hOSVVMPU1ETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5WcoZ+7r5mUn4uTq5uRkpOJq42Hop+MpK2Uo6O2xr20wbrCwsfIxcLNyMG9ubKvubTAwsq1xbHBvLS6qqitrbCio5iqtLumqaarqp2or6ejqqq+vKetvLS4vce8t7W3wbG9wLOptberv6WPo5iRoqC8n4maoJmXnp6Pt5+pnKWjm5yhmqils6GbnqacqKqemZWPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6udnaSjqJGVlaCDj56em5WppKGhtLS6ta2otbKznpyipZqXlZmqoZ53YFxfXUpIRkdNUUlNRUZHQlJMSkJFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+ew62bl6WYmamclpqaj6qWlaemla2tmaGrtsTCu763wcLAx8S+zca7vbmyr7izv8LItb+vu7a4tqakqqutoKCaq6rEoqWoq6aeq6+soqmov7emrb6xuLbHtrW5uL+yv8G3tbO0r76jl6OWlJyUrqCRoqKlo6OfkL2kqZ2oq52doJumn72imKOfoqmroZ2XjZWek56Hj4WNk56koZ21rKaclrKnma+nn5qpnqCNmZWfhI2gmpuTpaSamKuxtbGqpaqtrJyYoKCSjpCWqJ6UaGJZYV1PSUdKTkxIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDPEM+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViV0yimqOcnsWsoZ+snp2uoJOjn5aloKapq5e3saOqs7XExL2/tr/Cu8jCvsrItri1tbCzs7fBxra+sLi0uLWfpqyqrJ2dnqWkwaWgqq2fpKmtr6Kmp721pbG8ube2w7Kzt7m/ssTAuLius7W1o52llZKUoa6gmaKdqairo5rCramerK2bm56ZpqG9op2lmKurrKahmY2Zn5KfiY9Xf5afpqGguKqnk5i1o5+yoaCbrpaejpmUnYKOn5eVjqKklZCmrrKrqaGipaWVlZ2Yi4+Rk6SeiWFkWWNgTEhKSk5GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dySEU2PXVlXEtOnp+hmZ7DqKWitKKcsqiTq6SgpJ+tqaydvLGorLWxyMXBwrPCw7zGw7zEyryvsLatsLSvv8S0ubGwubSsmaiwqamanaWhp8Ktm6yxm6qirrCppKe9tqa3u72vt8Ots7LCwLLHs7q3rLS2raqippaWlaSsop+fmqirsK+vu7KmoKmomZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqOfp7Ompo2YtJujrpqem62QnpOXlJqAkqGWjo2foZOLpqywpaahnKCekpKak4WLko2cnn9hZVtnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+jn5ygw6ikqrKho7SqlbOsp6KksqyuqbuyrLC0tMbAxMO1wMS9ycS1wMjBtKu1qK+4rL/EtLeurLa5pZmrsauql5+ml627tJuosJutn660sqequbKnurO3srnAqrexw720xqe+r623taqorKGXl5KmpaKjmJilr7iusrW2oJ+opJmVlZOkoLejpKaWrrKyp6umoZ6bmpuWmKifoJiinq+yoqaNl66ZpauXmZ6kkZuNk5eahZaflIyPnJ6Ui6mpqqGnoJmelYyOmZCBhZWJlJ94Y2hda2pNUE1OVD1DQU5DOjpJQDc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko52hpr+mqK+voam0q525sKujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDGwLqptqSsu6zAwre3qayxuqKVrbCtspalp5Gquamgp7CdqqCvtLOqqba2rbuss7O6t6y4sMO6vr+mw6uwt6+pq6unnpiZq6KioJGYobGvs6uwuZqcqaCZlpKXpqG3qaWjorCxtKuyqKufm6Cgm56lnaKXnaOzsJqfkJOlmqCompSinpWYiZSYk5aXnZSIkJuZlI6oqKafo5uXm5OHjpmLfYyWhY+bamhsYWxuV1BRWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aY15OSFBOW1VZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oauwq6OxuKmltbOsoK21vK6zuLy6vba2wMK/yMS5xMHAwLjEvcC3r7anq7exu76/tKmusbael6utqK2Xp6iOp7ufpK2znquisbCzrKm2tLW9ra+xtaywtLHBusW3q7yvsbisraqjsaafpaqgpJeQmaCzqrOqqrOanaebmpWOoKaktK6noqytrrGns62yqqScn6iknpWhmZuotamXmZKSn5meoJ6Qq56Xl4WVl4udmZyUio2Wl5qXpqWioJ2WlZeTgI+UhXuOkoOMlmVscmdwcV9GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2FVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoKSstqStqaWvrraqr7W6p6awt8W3sbe+wcK0tLrFvszFucLAub65w7fAubK1rKq6trq5vrSqrbG1mJinrKqrm6urjqu9nauusaOroLCts66utrK5t6qurrKota+zu73Ksqq2tbG0r66nobOgm6itoKWVlpuasqOtoKavl6GkmpqSjqOlp7OpoaayrKq2pa6xta+kmZ2tp5qYn5mZrLijl5OQj5icoZiXlKufm5KAk5iMnZyZlpGKlJOemqWioaCYlpGTlXqLj4V7jIqDi5JrbnhtdXtgRWFqWUlIWVo9e0pGRDZBYlRpW01cYEpcXVpSU1JiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lUS0SZl6CxqLGqraakr661qbe0uaSss7fKurS6ur++tLO3w8DMyLzDvLa9v7+3v7yxva6nuri3tsK2q62xt5SXpq6rp6OwqpSvu6SssbKnqKOxtLCxsbWxuLOprquyp7evtbTDxbaptbassK2pp6O2n6CnsaCklJyalbGep5ygqo6po56blpimpqW4p6KxtKynsqetsLaspJmgrKibnJ2blKq4nJSOjouZnKKXkJiloZ2UgpKWj5ycmJaViJeQl5qnnKOgkpaQkJV2hJCHe4WBhIyLbXF3dXt+XEtlbFxLTmNcPmJ7R0k4R2dXZltMXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0lXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLj1FTFE8M3JrSkNDkZmlrqWtrqunpbGys6q3sbegq7W5ybiuwbvCt7KxtcLCzsXAwb20vL+/ur+8ssSoqbiwtra/vK6rs7Kcn6exraalr6WdsrWsq7GxramotLqstLK1rLStqqyorKm4rbGwx7+4pbmwqa2tpaitsKakpK+kqZyenJuvmaOjoqORrJ6joKCiqqamuaWstbWkqquorK+2rqOdo6mqm6CampKktJqPiY2HkaKglY2UnaCTkYSOk5KdmpiVlIeXk5WZp5ufnoySkY6Qd36NhX18fIeKiXF0cn59fVxTZG9eTllmXEZElltHO05tWGJbTWBiTlZXVldUWGdeUVJMY1pbVEtHT1RTTkdJV1NcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis6ST8zQklTLD6PazxHSI+cqquiqbGkqaWztLG0tbKyoautvMy6rsC7x7G0rLTCwtHFxr7Asr3Awry/t7zEp6y3rLO4u8Cwq7GtoKOnraqopLCjqrGqr6ywr7Cvq7O7p7axsqmyqaumpaOtuqyqscK5tay6qKmoraqosaWqpKOuqqiin5yjrJWlnpiemaydoqepoqymo62suLGyoKmioKuvsaydn6eoqZmjmJmPoKeYhoSPioueoI+LjJacj46Gh5CUn52WmJWGlpOTl6SbnJyLkpCNiX5+h4V8d36HhYZ0c3GIdWtfWWBuY1FzcVxLO4R8Rj5XdFhgWk5jW05VVlVXUVxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlFo+TEWVmK2ooaqznKqqsLatuLWuq6Wqqr3JvLG9t8KvsayzxMPOzsO+v7PAwsO6wLPIxKyut62yuMC+s62uq6SnqrCpp6ixprSuqrCurbGwtK20u6S4s6ysrqeroKKer7eqqq26tqW2taOqp6ysqq2hqaemsrKkpqahoayWqqGVmqCmnqSiqqWtop+nsbetrqOlopuqq62pnKGlpKSYoJqWj5idk4KDkImFnKCMio6MmY6Qi4OMl6ObkpCbjJOSkZSimZuZio6LinyGgIGDenSAg4F+dHeMo4h4al5gbmdXZYdjTj9nk0xFYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIY+SEZEl5KwpaOqsZirqq21q7axq6Wsqqm8wMC4uLO7taWysMTJy9G/wbu4v7/BucG6wcSusbWxs7rAvrOxrq2rq6i2qqaur6q5sKixsa+yrbaqt7antLesrKSpq5yjnrOzqKiktLSgtq2gqairqaunoKusqbm2qaqqqqKpoKyckqmhnaCkoqajqp6cp7WuqKaqoqOYpaanqpyipKOfmZmgkY6PmY5/h4yHhZ6eh4SKio6NkI2DhpSimo6MmpGSkY+Sn5aYlouKg390hoF/f3l0g396eH+BiJ2Pb3FnZ3F4XGBziGtPXplWSG14VWRWUWJQTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0pqNk9EO5aOsKGmq66arKWtrrO0r6ulsKqpur67wLCuuK2htq/Jx8jRwL68urzCvbrDwb+/rrKysbW8u8KxsbOrs6iktamlrbOyubCjrreyr7K5q7mvqa22rKqeqayfoqC1raihn6+yorSqnqinqqOroaKsrai9r6yuraKoqKCsmZCvoZiioKinnqibmaqwqaOfraKhk6Kjo6eYmqmlmJeZnY+Kh5WIfY2GhIOjl4WCgouGjo2RhISToJaHkJyQk5CNkZyUl4+KhoV4dIF/fHV4eYB7dHN6aYGGo3VpXmVrgXVmiIt9UlhwXUp4c1NkU1FeTU1SWWZOTFZZZFhGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwvS2c6NDhfPWFkP0YxQ1BbWytITjlVQTSRj7KgpKaspKekrKa0srGqpLGoqri+wbuvp7mqpq6wycfI0cO8v764vr+8ybzBuLCwtbG6u7jAsrO7rbitorSnp6yytrmzqKi8ta21vLC9pqystautnKmvo5+kq6qnnJ6qsqSzqJqqp6mkqZ6jqaepvau0r66dqaSgrpybsqOVpJylpZ+km5qpq6Wem6qhm5KboaWdmJepqJKYmpOQioKPhX6Pgn+HnY+Gf36Mh5COkIR/k5uThZOhjJSSi5GakZWGiX5/cnt5fXxod3x6dXBwfWiFeISIZGFoY3KFeWxmeF1dVUFWem1UYVBSWEtLTnF1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtL0ZqSTE0WD1mY0JKN0dTYFUqPTtEWD8qj5SxmZ+gqaWkoaukt7Kypqmxp6y4wb21sKO5rKioscPJyc3Btr2/tbe/uci2w7W0srWxvbi6vratuba/raGzp6qrsLW4taufvbypsr+zu6Cvs7WprJ+usKOcpKiqop6cpLCmsKCfq6mooqqcpKigrbunrrCuoKujpK6enq2ml5+boaOcn5yao6qjmpqkpJWXlJ+ilpuXpquLnpGQkYyCioGAj4B7mZSNiXx/i4aPjoyKhJKYkYaUo4mSkoeQmY+TgIh8eWx9dnh4Y3t6cXBxcnhogHRqg2dkaGFuc41sYWlvX28/W3hsVV5PUVFKSk1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBBaFkxM1M9ZV9ETDZLV2VPKjwzT1k9I5OZrJmfmKekop+no7ivrqOvsKqruMK6s62fuK+rqLS7yMvIv7fCvq+0vbfEt8Oxr7qys8C1u763qbm4vauktKipqrCuubGqm7u9pLC/tbWhrra1pqensbOgnqSmp6GlmZ+sqKmeoKqvp6GnmKSooLC4n6Sxr6CroayknKanqZqanJ+jlZ2dmp6pppebn6iSmJOYnpOZlqGpkJqJjpCHfYd/go59fKCMjIh4g4uFiYyMhYiSmo6JlZ6IkJSCi5aMkXyFe3NwfXFzdGB5eGlvcXBvaX5xY3psaWVjYGaFfl9ac2pxS0x+aFhaTVBMSkhQUlBJTlxfblNEWFtSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUyPGZkMjRNP2VdRk89UlpoSCo+L1lYNSiXnaaZnZatoKChpKG3q7Gks7SqqLnFtbKuoLesrq2wtcbIwbe/wbmwtLy3v7u/r6u9sLS/sb3Duam7urenqLWoqKuwrbOwp5q+t6WtvLWvnrC3sKilp7Cym6CkoKSkoZecr6ahnqKnr6KgopOkpKO3sKGmsauerKOvmJyqpamemJuepZObnZqdpqqanJyllpWXlZ2OlJejqKGQiYqQhnqFfoSKeo6Xio2GeIGHhIiLjoWNk5iNjpaYio6VfoaXi495gHtwcndvb3RfeXdkbGxraWiDbWVyamtlaFxjc39fWmx2aVpIfV1bWE9PSkhIUlVGMjleXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0FmW0hURFVdaEUuOzJgVCwylqOhl5WcqZ2loaKgt6qvoLq5pqy9xbOwrqK1r6yur7TExL2zv7q3sLO5uLq4uq6uwLO0uK+/wbisvbq1pqKzq6ips6uusqOcwramqba0qZ6yu6mmpqmwrJmip5ykppSYobKlmZ6kqamcoqCTpaCkuaikp66nnaWhqJOfqaKhoJmbnaCSm5yXoKKrm5uZoZWSlZaajZSTo6ekj4iKj4Z5hHyFhXycjYmKhniAg4eIiJGFlZOSjJCVlI2Nk3uDl46Kd357bHRybGxzYXh1aGhqZ2VvhGdoaGRmaWpgaGJpZlplemNhUnNUW1tTTElHSU9TQCEpaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc4Y04nMp6ko5KOpKacnp6do7Wtp6q6t6isw8G3sKyitK2nr6+3wMC9scG3sa6yt7a4t7asqr2zr7KxvcC3rry8saWftqympbSpq66gn8Osqaaws6ustLqdqKqrsaWYnaqep6WRmaatopmepKmhm6Kdl6Cdp7alr6quoaGenaGVoKafoqCZnJqckpqelaaeraOYl56VlI6UmIyPmJqooJGIiYqIeYV3goKCnIeLgol7foSIhoWQhJaVj4+PkZGRjJJ7g5WNhnN+fWZ4b2tqbGd1c2tjZ2RjdH9iZGVmZWlqY2lwWV5YXWxkYU1oV1pgVklHSEtNUlg+OV9saUdCVVNcW0lJR0ZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTszQWVIJTWbpKCRjK6gmZiglqW0saKxvrehsca8ubCxo7arq66pub28u63Asq+urbavs7izqKu5sq+ttLa7tq+4va2mnrWroKGxpauvn6XDoLKjrrGvt621na2vrK6jmZynqqWflZuopZ+ZpaOpnZqgnJSbna2wprmorqOimpqemZ6jmqSdl56Ym5SaoZKolaypm5ScnJKMlZmOlJSZqaeNjYqJj3uCdIKBipiFh3yJiISEioyIkoWTnJKSj5CRlo6Qf4CNjYJvgX9meW1oa2pncXJrXGhkYnKAYGRnam1sZ2poZmxcbG11cWFUYmhjZVlJRkxNT1hRUFVhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUllQyc0k6Kbj46xnZuToZqpsrCfuMC2obTCvL25saW2r6mupbe5t7isu6+tqqu3qrS5rqWztrKvqbG2trGytbqoqZ+2qZ6fqqKqrZyqwZmupK6wtrWsrJ6xra+qo5uco6yonJWcp6OdmqmjpZaaoJ2Rm6Orqqm7n6ekoJiamp6hj2uilpiccYKWnKSAdpGrqJ6WlqCRiZeZgJeLoI95hpOMg21pfneDcGyGioZ9hIuGb15jYGeEl4Zri5CUknV3i4R+g49/ZoeAaHVpZldcaXNuTlBqZGZxg2ZeZGZubGleXl+JkIWHaE9LRDhFVGdeSkdQUFVVS0dTYG90ZUVbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTZPa1tOXEtbZmI+RzFQZD0rL42kmYeVsZuck6Cbqq2ro73Fr6m3w7i9vK2ntrCmq6S4tLKzsbmtqqettKawtaOouLe2qaestrOutK2zoqmftKueoqScp6iarbyVp6Wvs7etraSorqqrpqGenKCop5yXoaalm5unp52Tn6CZkJ6nqqO1sKOjo52WmJiXo4ihj5Kah6GHlJ6hf6V/p6uek5Ock4mEcniMjoSIoXaIjGmXiGZ9c3igb4iHhH6NfH+hoJ+Zf3uInnSIjnabimyHgYNtaGVjemxxYlSGbWNtaZhxWGpwboZXXmlba2pbiHBteXKHaYeEWl5GTj5GXk1FUlZXUVFSV1RnXkxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxVmE3LyiMppeEnKucmZmdn6uqqKq/w6+yur23wL6qpLevqqyms7Wur7O2q6mlsa2ltbOcrbW3taanqLOxrbKor5+qobOpoKSkmqKkna+2laSmpra8pqynqaqsp6aioJmfpqOZmaajpJicpKmWlKKclJOipaaht6SkoKSYlZOYlJyIrpCYlImpi5ejnIWxgKStnpSanpV5gtSof4eUwZvHeXixpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4FslrGrsHloa1ixrm9labySvG5oem1yj9h+U2pjtrJ/gHGUdZqhqpBXT1dhT1ZORlRbWFFQU4tcV1tQQFxFUU5ER0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjqaTgaapnpednaWtsqmxwr2ytcC1t77Cq6azrKypqK+0qq+2s6inprWmp7iunbOytqumpKeyrq2xpqqep6SypKKin5ecoJ+wrZWeo5+0uaKpqKGtrqSinpuaoaifmJuooZ+YnqenkZynm5SdoaaioLCjn6CjlpaSmJKZhbBraoqNqn5nhJaHrWVxnp2VmqaVca6hpH53u3xroY92sV9qtFulgGWckWBmgXpmf2p4aqllvnJnpox2sWp8sXh0kpNjbW2nbluEoEVpZ4eWRXWcYH5ne6Ongllfi6tpgJR4emqnN0qvW1dUbGNbS05XX1xXVjtOiE9XVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5KilYKspqWfo6SqsbettL2+sLfFsri6wqepr6uuqamxrqSwurCkpK6zo6m5qZ6zs7GkpaCqrbCsr6aon6OisZ2knZiVmJudrqeXm6GftLKhqpuhra2gnpqXoKKpnZmepKGcmaGnpJCdo5qXoJ+rnqanoJugoZaVkZaRmoa1m7V4hamZtZl3h7Obt3+TlpeplX5rgaZ6gYWIkpSSd6tnarFbrHuOh5R0iXCPhoB/iJCXeIOCi5eMg6CPhbB2d59xa2psfItOpFhIY2OZfmNopmB5cnVSk4ZeUKltY3F9hoBinS5Rom5bVGtnYExLXGRYXFpCPrB4V1hBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o5YVU1MByWn5SIs6amoq6pp7Osqru2wrC8wq24t8GqrK2urqausqmhr7yqoae1raOrtaSls7Ono6Kdp6qyqLCopZ6gn6+Wn5mVlpeYn66jmpqkqLSuoamPqaipm56VmKClqZqfnaOfnKCipaOVm56Ymp2iqpylmpuboqCXk5GTk52D1ZOZuXCwwn7GhnzWlJu7fJqWpZCNm4ykeo2Ho4KlgnqseY+dVa97iX6farlauXeGg32mgpN8mHqqeY2dj3uxbo6EdJC7hW+UT6+nxYpRoHpjYKpic3KHbJeHX1O1tMiGgIl8Y6QzQp12XVFqaGRQQFhmWmRhSkhNbEtaU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRODIlnKGTmLGoqKWzqqW0qKW8t8GwusCxtbW8s7ansbGjsbOmn6+2qJuouq6ir7Ggs7SwoKSenqepsKm0qaWcnZ6rl5mXl5eWl6KrnpqXqK2wqKOfjqyip5ael5yhpqKYoqGioZqioqebnqCelZmapqCcp5Wbm5+hmZCSlZGdiLJuaLVxq4hwjqZytHNytnuamKSNj5uNon6QoKV+sHaDkdLRdVuufIZ/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdIWebp5mlFLIi1rCXJ95Yl+tYHdzhmKXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPal9saVBVRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6KdkaSvrKSqu62mtKWotru8sru/t7a0u7uzpbW0orKyo6CssKSYprqupLGwnLS4qaCmnaGqpbKorKqlmp2aqZ6WlZiZk5OjqaCXk6arsKWilpKsn6WSlKGcpaeglZump6Gao5+tmqCenpCWm6KenKWUnJaaop+VmJaSm4Wse3eodqOPioepb62Kg6iDmZmiipKZi6J+kpiJroV/grNccrNSrn6DgqR/cdd9d4R+j52GmZp3r4aKkZyHd7RhmmWagoGVbJJasFhLmnWYeWZgrV53d4dnmIhqXa93lZ6PeGw1eciusl9CVG9eaGBFUGxfcG1WVU0vZWNpU1lRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCYtMGtqLKnqrK6uLS4v7q4s7a9taW4tKC1rZ+gqauflae2rKiwsauttKSbqaCgqKK1p6aqo5melaWhlJScmZOWo6abk5CnrK+loZWYqZ+ij5GimqmmoZWapqmenaSerJ2gnaCNlJ6bnqCYmJuWl6KglJiRp52GqX19pXmhj4+DqnCtjIKnhpagoYqXl4ijgZCHlKp8gIudeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClGySXKtbWpN/kX9oZ6pkc3uBa5iHcV2sWomgjmtuZU9KQ6FcWk10XWNmTVphX3N0X0pVNUqakllIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZyZmb6smLTCrqutqaa0sLixtb+6urOxt7yqu7WgsaWepaennpOqsamvqrWsqq6hmKGgpqSkuqKjq6GXnJGioJWUn5qUmZ+gkI2MqbCvpp2Xmqemn42SpJioq6iUl6qon5+go62joJ2hjZShmJ+gkpyXnJWeoZWXj6ubj65tcrR0qYx3iqZztHl0s4CSpKOSnIyJpIeOdrhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJql1ytYE2hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdmVG9uLlunT2JTa2VibVliXGBxfGNTWVA+Pm1vM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs8MDAwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOaSam527opyywK6tq6unt6m4r7XAtbyxr7m4q8G3qquhnKekop2Sq6qntaOyqK6qoZecqKCkq7mdo62clpmPpaOWjZ2hnJmdn5GTlau2r6eZlJusqZeMk6aapa2jkZersqOgnqirsJmgoo+Yopefm5abl6GTnamclJGrmYfUkpq7dLHEgMOGfdWWnLh4iJGXjJeJjKeHeaO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohwbY2kdL1dd31bYXm8altWW2l5XmlgZGZibXhvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC45Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QDmnmp6ivKKXscOwramqrLGnuK+2xLG7sq67sK7Bsqylo56koZybkaqkqrKktaetpJ+WmqqZpqy5naOumZWhkKWgk42co56YnpqQlpKvubCrlZejqKeUkZalnaStnpGgqKugnKCppLKeo6WOpqKVoZmcl5WkmI+woJKVqp6FkJm1gJGRjbiVeIKTm7V3bmxuc255j4SOiXOewbu8mnuBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV6s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF6Aen2JZ4N5bXlii6xwdYV/WFunakRlWlRmYGNdYlFnZnFtdUJNUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVjgqT11dPSs7VlYnPTs8p56hob+llrPDtKyqp6yrqbuusMavtbSvuKe1uK2po6Kmn6CdmZSspK2qprWoqJ+blqCjnqykvqahqpiVnJGim5KPoaiik52XkpiUsrW2rZiepKSii5KSppylq5yWqaWmnZuiqaamo6mhkq2fl6Oel5eYnp6PsKmUnKeijmp+aZyneIlzfpqOdXplh3u9vsC6bpKDcZSGX3JqWl6aiWFkh46Va2CAlWNtnHZilGt/mpWUZV5gY3GbimhyjH2GlWdqfnF0eX18Ylt3dIFoUFxuhH17i2pYbHmCcklKb4VwTXRNRVddZmFMW1hnY15PW212anJST0RFTjtISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFS09IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SVJfSSdTYFY0KVBeTCgzPltPJz8yPqigqKHBo5q0urajrKWup6i1sqzIrLCzrLWjvrGypqCjqZ2jm5qZrKeupKW1qqWbmJWim6atqb+oqaaWlJuVoJqTmKWpp5GekI+YnLCyv6ybp56noomTkaqbqKSbm6ygo5qbo6esop+qopqwm5Wmn5aUnZ+dl7ClmaKomZyRnpyjpJmno5qcmpuakJaCaG58cXaRl5SRhIm0qY2GmJWOioyXl4eUlYqDkpORiY2RlJmTmJeaoKKbm5SgnY6CeqSFa2p8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vkd312a3B6bWBjXHBoTVlZZWpfV1lwem5uZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5TMTBUXjorPThdSyw8LUCyoLOhv6KksbK3oKmlsqelsLWqyautsaa1psCotKCepaWcpJaVoKunrKOjt6ygmZaWoJetqqbBn6yklpKcl56Yk5Sin56ip5KRmainssOvmqudq56PlpapnqucnaCtmKGbnaKlr6ahpKifrZiXpp2amqCenpywoJ2ip5aYk5mUoKKWo5+XoI6WlIuKjY6XrY97lZuCkoGJqaiFgZiWioSOn4h7hJCGhZmQh4aJlY6bl42QmJ6jlpqTkZ2Nfo1morOuhYmEdnqPin12eXpvZ3mQgYCJa3WBeYhyaHR/eXWDiIJrdGN5ZmBpZGNkZmpYa3twampcUkxQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RdUTA1TVsxN0U0XEc1PCxAs6C5r76tq66ysqCqprKtoqyzsMWwqqyjs6+9pLScoKeioZ2Zl6imqaakprO1npWUnpmZr6auvqCro5GRnpqZlJGVoZyXqZ2FnqmsorPItKCqpKuWlpiap56pnKCkq5Sen56gqq6ppqOroq2bn6ChmqWenJ+dr6SZn6iTmJedkqWamKmempdmg5J8ZX6Omo9jeI1saGt6kKOra2WamH5nhYplZWloeo2hjmtojJeRondraouYo5+Yc2xueoSNhnlYZV2FgV5rioqBdltoc3d3kYCHgm54gniAc215hHN2iImPg3tqhVhea3RkXXOIaWt8cWxjXVFOV0lkWEBKND5GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS83Wk82KUVZL0RPMVlDOz8uPaWfury5r6uzsKulqK2usKaurrC9samopK2wsZ+tl6CknqGamaarnKyjpqips66elaOQoq+mtrmlrqOPjpqhmZOSmqCZmaWWe6Wsoqizw7iloqevn56VnqOfpJykqqiSnqGeoKqvqqujqqCom6afqKGslaGbpbCkmJyrlqGem5OlmJ6rmZ5+voOIcrRyhZ6GrWh4ucS4cZKho3ummJlzqoJ8y8DAu3GLooeDn3yVmIiewL2Clp2ejZ3BwXuBepGMmsK/fWulsW+MgW/Ken+beJGDjoB2eYF/eXF6f4dvd4WMk3ltdpJiZl94Y19lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX15cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmplKOvqbCvraayta+rpqamsaufq5iboqCcm6qnop2roqWppaS0pJ2jk6aurLi0p6+ikpGZnaWSkaChl5yfnYemq6Srrb/AsaGqr6qXkp+eopmipKqjk6Chnp2trqmspqOjpqClpZ2uqZGkm6mtqpydqpysopaYpZaho5icf86UeXqlgnmVlptfrY9ejqeAoaB8p5WbdKuDgK9eZI2peqeHhaB0l5KIs2OCq4ahjo2zaoSudHyWh7hhgq1Zo81uj3V723t/mXF+iJJ1f2V7h3Z2a32Ibn2FkJJ+bYGOYHFrcGZgX3hkW3FoamNmYFJUUlddSk9DNUFIRUQ4PjY7QD9BOz04QD4+P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKy0tSjAnO1w6TC0hUEBGNC4xrcLAwLW0sLeYnpGkqqmttKqlsqysrKSsprCqoKebmqaYnKKwn6CfqKejpqGfsKybnpamrq2xq6isoJSSm6Clk4+epZeeqKOerqSrsKi/xrOoqbGulpOdnaKXoKmqn5Whnp2drq+nqqmbp6ajoauSrbOWpqOrqp6jp6ahsKGSmqeaoZuUlJGXoHCFjJd1hKiHcbB8nXKsfqGfgaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uIk4+ggHqtVpzEeo9vksF9gZVtdXCMbWZ2ZYZvYXducm+JipGQg22Rj2Vvc3VvYGZtZF9uaWluZmNXVFxhWlJSQzhJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz5XSi09Jz4xKTNWQEYhHEc6QzEuK6/UxseytJ+do46jo6KtrrauqLGnqaqorqurp6KjnZmilZ+mq5+ipZ+oqKKfnrCsmJuWqKevrainqZ6XlZqkopKUoa2bnaajrqyjrLWpuc2yraaurJeVnJ2imZ+urJ2WoZmen6mxqampm6upo6Krm6+xoqisrqaZpquqqrGjk5ejpZqUkoWkaqR1iXqpdHqycYKliZmMcIigmoekX2BSq4R/roKbda6Cp4aGn3qYloV7ZoCjiaSZhoGjfal+gJSHrl58qFWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojYyYj4FtmpJvbnh3d25sZmVkcXBme2ljXFdfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmFhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwrqmso6imqqurqaSmoJuln52lp6ajnKyaoquhpJ+vop6bk6qktrCuoKmbnZaVp6SRm6Gon6CmnLCmo6ixrLbIsrWqrKqVkp2dopmfpbOdmqGUnJ+mq6ujrpqsqKKhqqKzraKqs7Kim6qor6+2o5OWpKeYm5F8qmyehId1q3l8sG6CpIuJoJaVn5WB0ri0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlaipkJKbjH6biZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI+QnpJ7cJeSfnB6dHx6bVxmanJxZoFpXmFYY21cXllJTU1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE9UUR0cOzxGMiwkqKTBxrmtqLKurKWinbK5rKqhpZuopqqsqaegpqWYqqOfrqudpqCsmp+ppZ2ntZ+il5Ooq7ayrJumnKCWkaatkZmcp6OgqqeuoaKmqbC0wrKzqq2olImYnaWboqOvpZehlZmcpaWrmq+draimnqyjt6yhsbmwnZuvp7O0s6WVmKikm6COgp1OeJqBf596hKN8gqSEhqaenJ6ThLh8fHm5gn7MxcK2eJqgkIuffpqWl4p1npeKpJmkqH6whZyEnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkaOWe32SkYl1eXKEfnBbbG53cmqBblpjX2huYmRdS0xRVEFIR0ZJOjlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMjpQW1QcGzY/SCwtIIyHmamspKu5q6+gm6Gss7Smn6CVpa6urqmmnaammqOnobKuoammsqCZqKSUorWio5WXoam1uaSbo56jk5CisZmenKemoaKvrpyjp6K1scOxraqtqpGHkZynnaOknaWXnpiZmaWjqJquoa2lppivpbytore3rp2etbK5srOnmZ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgotxq4aEtG5yaZmjnJWJn3yYmYaHj3KugqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5OmmH2LjJKLeHx4jYFsaHdpeHNuf3RcZGRubWVoYEpaV1g8R0dAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWSc4yKrr+/u7u1npeopK22oaKZlaOpp66pq5mloZ+loKC1p6Kpp7CjlKujjqSto52QmpqqtLSknaadqZKVl66goJ6npJynnLWZn6mjtqvCsKmrqaKNhI+coqGmo5aZmpyYm5ilpKaYq6etoqWbrae+rJW+sK2fo7Czuqy0p5upsqWomHqokH18sHeKgaSliJxtsm+hh618oY+DqJaZgKyJhK6Fn5SooKKWhZ+AmZWAe5J9q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbpWRp5mClI2Wi3p5gZZ/amx+Yn10bn95YGZlcW9oZ2hDWWBbPUpTMlU4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA1Mi4qLEFUVlZWVVRVVVVVVFRVVFNUV1dXWFZVVVFIRklKIygovJKahKnGw7bBtJ+braCuuKWkjpuko6Cvr6qfo56drZieuaCiq6CvqpqtoZCqqaSWiZqQrrGspp+om62YmI+toqGepaKapZytmJ+opraov6+lqaSfjICOm5qgpp6SlJmalJqapaOjmairq6Okn6movqSXw6yqo6Kss7qsr6ehtLCpq5l2r36Qi5yFh326rYqYZLCMZZWtfaCPg6aVmoGsioSwhaWZpKGikISgW2xqgbNgf617e4KBsWxnbpmXjIixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqiaipeQlZZ6eI2cfWRzfWGDeHOAfGFpZnBtZmVlT1VjW0FUXj1JKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdXWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbaooYuZoJ+ds7OpnqKfnbSYoLOoqquesK2eq5uVrqmijoibjq+sqKajqJmuk5mPqZqhnqWfmqOjpZmfoqmyqLyvpaienY98i5uVoaCZkJGam5GZl6ieoZioraelpaOlqbufoManpamiq7S2ra6noL2ura2WgamSo6+Om4CGpJeYj4GAuMO6g46ck4Wnl5yCrIqCr4imm5qlqpF+1b3CqmKjv718fqOCg9e6uLWFlJODnr2+hGqjgW+rhG6df3qysceDaquwva14d6K+u3SAlY2mnI+akJWceYGQmnlifXpjjGd4gXtga2VramJQYltTalxAVGFCTSk8OjQvHh8kHiUyIB0kKDA0OTY2Nzg7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbS0sb+5sr2zop2upqWzpp2MmKW/qrexqKG/pqaxm56xnLmonq2vpaeVlK+sl4yDmpGvpqOsoaWcqqGYi6OSpp6nnJqhqKKZnqCrram5rqikm5eTe4eZkaabk4+RmJiPmJOpmZ+Yqaigqqaho6u7nqnFo6Cvo6uztauwqqG8qLCwmnR1qqS3hmWJn3BnrI+Kj21vd6SQmZ+Bda6ZlXCQjHGVp6ObmK6kcm1tbWWKd25tgplxgHlpcWlniZaVmHFoaYWGZ3CGZF6JY2pwWV1nfnemYGJxjpJvZmSAjZKOopeXmJCVnnyHjpR1ZYZ3aIxqeH55ZGxjZmxiS2RYSmtZOlBlRVEnSzkrIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJSts6q6ubKzqqmirp6ksqmYkr2xw8i9tamewKuso6Cmq5+6o6StrKymjpatqo+MhZWXrZ+lqqKfo6OgkYylk6eZqJmWo6qglpylpaevuqusmpuTknuEl42ll42RkJiUjZiVp5Sel6iimrCmnqKtuqCxwqiktKassbKrrqyouaSvuJaKoailtp2JlqKYhqmakJSdk6qzmZuiq6CylqKgnqCinKCkoZWrpoySk4yHkpyclJCZk5iQjpWGgaSal5WNi5OSio+GhH5ni4B0g3Z0iIxxp218lZGUk4GBj4+Pjp2UoJWXlaCCh5OMcGiPdm+Kd3Z8emlsZGRvY1VgWUBpWkdiYE5ZKkU9KyYiNzQwLh8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbivrqKwpK2foLWxkY6rxbzEureqoaWdm6adsKijtqedqbSmp5GYrKOLiImPnKeWrKShmqeenpOVo5epmqiZlKehpJCap5mhtbqoq5iakI18gZSMoZSKlJGVkI+Tl6WPnpmon5y2o52nrbiosMKuo7inr6+wraqqtLqir72Zkqajprajkp2mno2pn42Sn6Osr5qhorCor5ekoJykqp6dnZyXq5ySmaGbk5CWqpmNmJiWkJaekYignZWUhZKMkIyUi4F+ZoyHdYd2eYiDc5xqh5GUlJGKfYyWkpKYk6GSnJWgg4aXhnlxlXJ4iX9xe35qbmRfcGlgW2BZbWJQYGRQWjpHRkU9Mz09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZcXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7CzrK6jqaetoKi1qpCPnKWzuq6rq6GimXqdorCkpbGplpu4pqOUmamcjoaKiZuikK6epJaooKGSl5mbrouqlo+omaiMmKiPnrm2pKWYm42JeYGTjJqTipWRlJCNkpaijJ2eqJ6fuKR/hLC2o7GwdKS/pLKgeHqgq7O8lXaupJ+KgKp+ZFxidp+OpJ2Dl35uk7Oco6etq6JlnqCTc3mZlnCAmKiXbH+ip4llnKWbkJeYlouRm5GFnZqQlYKSh46OkomFeGuQh3aHcXyGgYBhaYiLlZOLW3aVkWdoj45yeqSYmGV4mIaBd5dpg4mCbnl/a3BlX3Vva2toXGZjYmJvUls+TU5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTFRVVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJWmo6GwsayrqaWpraOnraSSlqu1r7Glmqqmq5dzi5yvn6irp5OWuKCgj5yjnZF+iIiano2rmqOVp6KejpeSnoV1rY+IppqokZajiJu6tKigmZiLiXV2k46Wk4qTkZCUjI+ToI6an6aZnLKWgIyctZ61jZKPvaihfqeieqOvuIGOjqefhIuFj7Gpr4yJlqKaeYGLrIacnaKnqaiHlYaYd6WbeoebgZemgoF7nLF6ioWfl5mUmJaBkJaWhJmaY3mHkISOj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR8mYOfm4aYfpGJgYKYao2MhGp4e3FwZ2R3bmlsaltlamllclteSFNMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj5ARElASUVKS0dSWFpYW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZSuxr2woZanqLWej4Ocq5ynoqCNkL6emY2fmqCQfYWOmZeIq52ilaChko2UiYaAkaeNhqKco5OWnYafubKnnZqTj4VwdZCKlZCKlI+Pm4uPkZ+Rlp+klp6siJ+0ibSarovKh6uuibeFjbCDsa+EqY2nmI2dfKiPcnt3m46mlmiVpHm0i5+epqiSmcKBf6uImKFxnoCapH2XhZWxgaF8oJOfj5iXgI6Tm4mYkot8hZOGjZWTiYNtc5GGgHtyhoGFfYV0hYKXgY/FZoCph4+iap6Cn5iBmYCKi4OImG+NkoRnd3R7dmdodXBnZ2teYm5sZmxYaEdcUUwyRTQ2TWBjNiY0PERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5saqrppqUoKOkqqKWpam2o69/oKecpZ6diZS9mZONoJGdkHmDlpaRh6uZm5qaoYWPjHebnI+fkIiepJuVmJeGoritpZmbjY1/Ym2Qi5OQjY+MjJeLkJGfj5OfoZmhqH6hp4etnqCWro+fnZ2RhoGgjauvh6SNqpqMmn6jdoCYk2uBq3VNq3iHjZ2Rm6ingaqrfYOhe3qnaZ5/kmtnl4aXtoiefW1gY1iDl3+Me2Rni3OZfXmWbF18l25fU3GEXGBseYNgWWWCfYSBmHGnqmuDo25ypXCfg51nZJ9sWmyIemVZX4J+YVdQb3ZlbnRyampvXmpvbGtoV2lPXVdFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9idmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKitryrrqKZl6ChpaysoJ2utaOokaCfoKacmY6YtJmQi56MlYt1gZSRjYqmlpWXnp5+k4WGrKSHm5CKmKiXmZqRh6WwpqKVmYiJgGluiIeLjo6Ji42Si5CSooyTnqCcoqV/k4GPo6GUoHeclpCng6GngIaqroWleYt9hJp9onBzk4eWe56MeW2Hm4yZkJuomo+HnXyConN2pmaefnekX5h6fJJzom6Yt7S6dJKHgYC2qGSBxrh7cJW3jHGAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN+o16dmbOWb3uXnrN0cluesoJpYm90dXFobllrbHNyZVxpXmJLRD1ENVFBWXEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWlhgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mayck6COpbi1rq2gm6Kco6OlrZuasa2sk5egmKCkmpqUnqubi4iSeIuFcICWjYqPoJCTlJyWfZGJjqihh5iPipGik5uajIuoqKSej5aHhH5re4Z+fY+Ng4uQkImPlKCClp2gnaCfi4l3nJiijKByoouIqYicp5GXqKt/rox9eqCZeqOTeIBzl4iMnH2Wn4abjZmbpoajZKF8iZaQm41snmiajW6amXp/iqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z1iYp/nmiadYeTkpiOf55umZBrpplcqH53u2p9qVqOhF2zZ1xucXl3amhbcGp5eWJfZlhiQVBFTjdWQlJtNEpaWl9OWkRAMTUxOzs3SD86Q0dUP1lSWV0+RGJdVmBRYWR9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCsnaacnKefnq6anbCoq52Xopmhn5mWlqCjmYaJjWmIgHF7l4iLlpaEkpWXjnmKhJajnYmUj4WLnZGcm4mPqKOgmouRioCAaYGGeH+WjHuIjY6Hj5aaf5Oin6Cik5hyaJ+KoI+McJKMgqmImZ+jqaCofbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo6dm5eIl3KhfIWNr7V9a5qRoXh+mLSjo6uohJh7mnycmX5zqlpdb3uXi3ieYk1/e3uFY3qXQk2fWaJqcnyObYGJhJl1m3mHibGzf3+akqZ0f51tcXyUb5lyaaNdlXZIZWNgc3B9fW1kX2tpd3xkZGFSXlZdVFZAWUVRZ0RSV1tiWF9JRD1COEBCOklFOExEV0FWUVtWREZhXFpgS2BtfnJFQzxVX2JaZWpWZ2hsbmJmZl5hYVxdXmFoYl9lZHZsXmVnZmxkZWxoaGtpk52Bsa6ZhFNfoae0urOzqZqii5upnJypk6GrpKGoj56dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlYdygImSoJxykZCAiJiUn5qEjqicmpWKi4p8g2yFhXGBoYx4hY2Ih5KZlXySpKCfo4iuhn21hI+enXumlnqpgpadkIuhnn2naHdtfplzoHNxfJ2FmG+Tgq59o4OmnpqBo3BeqWd1o2NvpWGc05B8epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKovH93g21/v6aqtF6bb35xl2+Bc6JyXaNndKZhaKZtm9OYe4Obbnd5l2ubenaXcmyppWdfZXlwf4RqZmZjbnZ4aGBjU1tlUVFiSVdJVF9XU1tlalxlUUVDS0xKS0JKRDhQP1BNV1NYT1JRYGVlaVJkeHl3SUZFY11kWWhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJibf7CsVFxLfqmwsrWws6OcmIWYpqCgo42kqKCYqYmZl5iTmZOSoJeOh4V7cH2EaH2Pg5OagXeRjY6JcH+Gj5OSbJeTfIiQkaOVg46qmpSSioWJeYN2h4BugZ+Gd4CShoiZopd5k6Kkmp+Js6Gitot6rKekrqVwqYCakIWBnJJ9pICimYaYcp6EoqyuiZeLgIykjZaDrqKUdrW2tcmhc5SKgJ9hnpepbXmVh5+adaGHd6B9kJaKgW9MZqKScJqIc6R7eXRhg4JsfqBscmRgnHJ/dJdpe2mztbTGpnOYfnudapubq3WCmm10d5dpmnl0mHFQRXyzXmp2a3iHZmpnYnR1cW5WXlRZaFBSaElVTFhSVl1na25WZ1dNSkFKTUpISk5BUUpQZWNpbWV0cnN+eHtudYl7e1RQT21daFtraVJqaGlsZ2xmY2VfXFxcXmliZGhre19dZGdjamZvbGVpbGWinImvp4VmP5Shs6uvr7WiopCAl6iioqSMpaednKWCmZeWjZeQkJuSjoiDeWp5hmWDjH6WoHl1j4iMgWmEhZKDjIWdjXqMipSlkoOXqZeMkYuAiXqAfYp4cJChhnmBlYeJlqCWf5SlqJyWloRnbnicbKJkfHGld5yYcGengZeMe6V6oJaDl3KfdoCJlJaPuW6QiqJifZmilYhucmmranWgbG6mYJtpi5BoloealXWigH2aX4uFjHVviGJooWWef2mbdXBkZoiCbnKiWl9bZKFuXomMb3t/c3JkpW54omRnp2iYc4uYbqFvU4iPb6BeZKdUi11TmG1tc2txgW1waGt4c2tvUlhXV2ZZU21JWE9cSFhpaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxygnt/cnaNgIR2XlFzYWdicGdQamhoa2xuZ2RnX11eXWBrYmppdnVdXGNoY2pqc2xma21jnaWYpnpldG2Lp66lqrCxpp+LgJaqnJ6ljKKhmqKigJWYk42aj4uXkI6Ke4dxgIhoi4t8l5pzdIp9kHtlg4eVioqVmYJ8iIWWpo+BoqyQhZCKgYp9gICPc2mPpYR9hpSNiJigjoiSqqeeiaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupaKMkoSMg7xufKWvgoaFhpOWnKB8pXpxqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm5tn56SlWF/q4uqdoB/jaefd599haSVnaBpmod2rGeerYy2c3e+jKSTWYOmjathdXJzb3t0cWJqfm5obFNWW1VhYV1rTV1SXUldbG12YFtxWVtgWmdzZW5vcmNxdGB3e355cnmDc4N+gXt7jIGCgHZieGRjbnNkUmxnaG9scmlmaWFfXlxia2JsbHpvXFxiaWJsandtZ2xuYpWmqpyBgJ6klqmqnqinrqOZiYKXqpmepImapZ2pnYSLmo+FnJGFko2MjXSGeoiDb42EfZaTdHSGcpKCbX+MkoeGlI99e4GEl6SNf6WljoGNiYSUdYKHkm9siqiAgouUjomcn4mNk6ujoJCAdZWXiH6BeZSuo3+Bm3GPhniQjIWAe3KnjHF9fXqXlpuEjnh7fn2IlJWTinaQmZ+gg3p9iWyMhVt5eXJ5cWhufpKJcX90gY+Uk3GFg4FljX9fgYCMd3VzlHVvem9uh22Ehl93aXiOZoGCho6qnH50fZdqiYhvgHZ8hXZtbGeMc3h7l3eEW2pYeI9obXdycW93eG9dbIZuaWdWWmBXXGRrZFVhVV5RX3B3eWtqdmVqamp1fHFydHNhb3Vic3uBeHV5gnV/gH+AeIuFg317bX9sZHluXlduZ2h1a3hqaWlkXGBaY2plbHB1blpbYmtkbGx5bWhsb2GOlbmopouhopqmpJmknauioIODl6uRnaCJmqaaqJiCgZuLfpaUh46JiI1ygnyPfX6PhHqXjnRyg3CVhXt9kouGhpCFeH6AhpiijHunoYuFj4+ElYKGjpd3coSphY2SnJCInp6IjJuooKCrg4mOlZp+fomWraiPkqeQeHCekYN7k29+qYVwfZVxam98gZ+Lf5KOjGhtXYOLjJybno5zlYuIcXRrgnZzgFlyboaQgX1+i2ldaWN6hYOIgF9peHubfIOMg3aBhoNpeYuHa2Fxc4N3YHOMgomQp5WGZo2Pg252i4NwhY15b2VmY3mCepVaXGlmbnZbenl3dG1zcoJmXG2Ka2xiWVleWllrcVteYFleXWZzfXtzb3Nja2tpe3xxe3d0ZG10aGx8fnV5fHt6eX+Af2+GioR7fXN+eXN/aVRccWlsdW91Z2tnZF1hWGtoa2pxcm1XW2VubGdzem9oam1gjIyqsKGQo6Gan56Ynpmpo6F9g5erjJ+Uh5uikKWVf3uXhHySmYiIhoaKcn2Ai3aFi4GElopxb4BymIaEfpKEg4aKgXqAg4qano+CpqCHeI6XiJWLi52XhIN6rIGQl5mUip6dh4ihq6CioqOMiJObnKOZlqqhp6agkpuIl498eY+OhKh+f5KRkpOcsKWalJ2QjbKTmISmjIyVm5+JkJuCiZGKa3yOdndlgoaQinyJnYSHi4+HiICEg5B3fHp1mqKJh4ufi4aVf36MgYB2cXSGhYB4iIeKkaaRhIaOiIONkIx8h4qJj4F2a4GDe3mZaXJoYHOKcH16d3Zvd3SBXV5vh2huX19aXF1TZ3FVY1tbYWxodHt8cm5wZGtqaH97bXh/cWlvcGxmgXtygYB3gH1/hHptgoyGfHp4fH56g3hOZHZrc21wemRrZWJiYFt0ZnBmcnFsVV1sdG1oeXpxZ2lrZY2InbqflqKhmJWZmJSYpKCde3+Zqo2ejYWfnIqelnx5lIJ7jpmJhoSEhm14gYBygId+iJOEbWt+eZeGhIOQfoCGhIZ9h4ONmpySh6qeg3KKj4WSkoudkX2NeqmDjZKXlY6cloaGm6egopqdhoOSmpmZkJqmoKadnZCXgZKLd32IjoWle3yPkJGGmKqhnZOcj42qjpKAnoyJk5qego6XfoeOgm94hXF0YH+Dj4Z0i5eAg4+ChoR+hYSUbnl1dZOii42Gm4WFjnSAin19cnN7iYR7eYyOhJOnj4aEj4KDioqKdoWHiIt8bmt9f3ttaGtsZ155fmd8e3Z0dXV7d1xgcH1udWBjWlxeUWZtU2VaXWFraXZ5fnBrbGRraWeAgGxzgGxsdG94boR5boaAdoKAfYV2cYKNiH57enx/e4KKYGl7a3VoaYJkamNgaVtjdWhvYnVtbFRicXllcHp6cmVqbW2Lip+4mqGkn5OSlpeLmp+enXp3naWQm4mGpJSLmJl5eo2FfImRg4yCgYJte394coCFfYqQfGtofICXiIGIjnx+hoSHfI+Bj5qbkYinnH9wi4qLkoegoYqFjHynkYePkpeTlpJ3jaOhoZ6Wmn+BkJqZk4ybo6GkmpeRm3+OhXmAhI+HoYB+jI2PfJekoKCSmZCPpo2QgpuRiZKXm36Skn6HjoF1dIJwdmB9gI2FcYqVfIiMco1+goWFjmh4cnmMmZKQgJh+iItygod8fXF6fIyFenuSjYOWpZOLhpF8hYaHhXWCg4iIemVxen95enBsamZefXJofHV1c3xygGpeYHR2cHhkY1leXlJraFRkWF5hZ2p2eIFxZmtjbGhlf4BqbX5ob3FrfXeGemuLgXKBgX2BdHaCjYZ+fHp/gX1/j2pyg25zaWGHaGxiX3FVdG9tbmB4aG1XanR2YnV6e3Fiam96iY2fspKlpZ2OkJiPhp2gmpx8daOgjZZ/jKKKiJqWeHuGh36DiX6IgoB/cH97dHWChX6JkHhnY3yFl4qCio14fYCMg3mWgJWXlYyWoJp9b4uBkJOGppuHjImDpZWEkoqVl5KRdpGeoaGYlJh6f46Yl46Wm52knpmTlJx6kIaDeIWXjZ5+gYqOjHOXop6hkpiOj6KMjIOWmIOSlpl+mI18iI2BdnF9bXpkgHyKhXCGk3+QgmyHgoF/iYRldW98h5OYjX2UeIyJfICHfXxygHmKh3mFkYqLmKKWgoSMd4iEg4J2e4GJhXVgd3d9dH13ZmtkYH5panZzdHR9cXxjY2FzbnVzbWFZYF5bbGRSYldfYGhrdXmGcGNqY21maHyDbGh0aGxvaH98gnhtkIZxgIKCf3R8g4yBf356goN+fJBtdYl0dG1limxqYWN1VoNpcW5geGZsYmp2cGZ5e3lxYHJshoWQna6Ypqiejo2Xh4agk5eYfHepnIqYeZeci4uYkHl8gIt9fIN7gIKAeHN4enN9gIR/iIuAZF58ipWHfoSHdH1+in99mISWk5aMo6GXfnKHe5ORiqePjI6KkqCRg5GPlJeRioGPmKCakpCSdICNkpSJnZ2ep5iYjZWXdI6PimyGmJCZeoeIkIlvl52ao5OVio2fjIaCkpx/kpKVhpmIe4qJgXpxeWp1bHt+i35thZGClHdwgoN9fouAZHJqfIGXmIV/jnSRiYN5h352eIF+h4F9hI6FjZSkkHmFg3SJh32Ac3SAh4NtYXp0enF8b2FuY2R7YW5vdnJ3d3N0YnZgb2x1bm9dW15dXmpeT11XYmFobXN6iWtfamVqY2h3iG1mbGhqbWiAfHp3bpCHc4CDhH10gYaJeoJ9eoGEfX2OcnmLeXhubIdraF9pcmOHaHFvZnZnbWxhemhqfHp4cGF3bYuBmZqqoKSpnYqKkYaKnoqVl312rZiMln2ek5GWk4h3fnuKfHuAdnd/gHB0c3pvhX2BgIp+fGBcfo+Rhn+DhHN6gIZ6j5GHkZGbkqSblIF9gHyNipKkiY2KjZeajYWRmJOVjomJjJOdk5CMjW6EkI+RiZ6ZoqGXlomXkm+KmoVnhpqPlHqJhZCKcJaalKGSkoiLmYyCgJGefJKPkouZjnuKhId0c3VrcW51fIt0boaQjZFxdIB7gYKIfGVxbXl+mpR9hYl0kYuBdIl5b4F+gYd9hY2KhY2WqI17iH1+i4V3fXBvgIWDY2h3c3VwemJecGFqdF5wanp4eGxycGV5XW1sc21zWFpeX2FqWlBXWGRjZ3Fxf4dmXWloZmJncY5uZGlnZWpogHp3dG6OhXOAgYJ7dYKIhXiEfHeDhXqAiXd/i3x7cnmDamtfcGh0f2txbm1xZ29sZXtibX95dnFsd3eKf6OYoqihp5uHjIqBj52Gk5x0gKmUkYyGoIyVk5B/dHt2hXh4f3Jze4Vrcm95bYl2gICGbnFbWX6RjYiAgIB2dYB/f6CGj4qRnJegk5d3iX6AjIicnoqPhpKXlYSIlJmPlouLjY6NnYqOkIRuiYuPkYqclqGbmJWFmIhrhqSDZ4adipF/i4SLgXeTmJGekZCIiZWOf36Pl3yRjY+NmpJ8in+Cb3Zva21vcHuFaXODjpeKcXeAdIKIgnlmdG92gpqPfImFepWSeneJdHCJfIeNe4uHhImPnKOIfIR3gouAeHhuaoCCgF1ycnFwcHhaXnFhb2peb2l8eXBtbWptdmBwb2tybVlYYWFiblhRU1llZmN1cISCYl1rbWRiZmuSbWBnZl9oa4F1cnJwi4B0f4KAeHaAi4B5hX93h4Z2g4V8h4yAe3aKf2pxY3xihnxvcGx0amhvbHZ3X3F+eXt0dXSAgn+llZqtn6eWhY2Df5eVg4+fdYqfk5KFipqMlY2LenJ4dIJwcoVzcXWIbG9tdW2Id4N9f21uVVGBq5SHgniAdnKCeYKggZGBk5KXm5GaeJF6g4ySpJqTjomVmJKEhpaZjJOLiY+PiJ6FkIp8c4uFiI+InJmfm5aUgJR/aYadiGiHoYiShJGDiXGDkZePmo2PjIuPjXd7kpB6jouMkZaMfIh8gGt2am1ra2x6fmF5fo6VgXZ6gXeDjHx5Z3RsdIeWjH+IhnuUkXF6hXB4jXuLjXuJfoONkZ6ehXx9eIKLfXZwaWuBgnhfd29ta3FyVV5wYnFgX21ueXBncGZnc3VocGthd2VdVmVgYHJTUE5cZWRdeHCIfF9caHJiYmVmkmpfaGRbZ3B+cGtxc4p9dnyFgHR1f4x5e4WAeIiDc4aFfoyMg3t5lXdmcmqDYId+b29remBqbXR/dF90fXiGeHRzhXx5oZCasZymjoOKf4OaiICLnn+KmZOOhIiXjY6OhHZ0dnOAcG+Fc3Bxg29qaXZtgm59fG11c1JOgt/JktaTfHB0g3WDn4KSd5SQmJuPmHuTcoaQn6GTk5CKkpuUhn6WlYiNjYiRjYicgI6BeHqMfoiMipybnZuVk3mNd2iKkohsiaSFkoiXg4ZjjJGYjpSKloyNiotxe5SJe46IipKRiXmFe35se2Vyb2preXlbgHmPjoB6fn5/ho56emhza3OKj4mBhYV9loxsfn9vgY1/jYh+hHuDkJaam4t8d3iDkHlzbWZwf4NsaHRvZ2hzbFNeb2VwWV9rcXhma2piZnhzb3BjX3dgYFZrX152UE5MYGZjXXlxiXRcW2V2YGFlZY5jYWZhWGlzc25rcXaLfHR6hoF1dn6Lc3+Gf3uJf3KJh4GRioh8fph1ZXNufGWIf29wbIBabG55eXNgdnp7jXZyd4p3eZ+Mm6+boJCChXeIlX99iZyHhZ+RjoWMl4STjoeBdXdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYN1hKGFkW6Vj5SflJuBkXGGi6OXiY6VipCdloOAlZCFiY+AkoqKl3+He3V/iXiGhI2bmpiZjpB2i3dvh4qMfoukhZKJnYWFXouUl4qOiY6LioSJbHuXgn2IhYmQj4Z2hX19a31jeHVpbXhzV4h6kYaFen5/gIWMfnllc2p/iY6JgoOAjJeGbIJ2bomRg5GFf4J6gJGWlJmQdHR4iI11dHFndXmCYXNsb2FodWZSYHFna1VebXN5YHJjX2h9cXJtWmJyYWJXblpcd01NTGNmYV52c4ptW1xkeV5gZGaEX2NjXlhqcmtua3J3i31zd4SBd3d8iHGDhH1+iHt0i4iIloaMfn6Xcmd1cXltjHtvdHCBWHF6dnlxZHd5hoxpdoCJcoCdiJmonKOShH1wjJR4eYudhIWhjY58lYx/mYeEe3N3cHNqb4FraWx8dF5geHZ7cHV7Z2BlfOvatcnD3IhzbHOAdomaiI1pl4+OnJSSgYhxhomgjoSLlYqNmJR8jZOIg4mPe5GLhpCCf3Z4g4Ryh4KSm5aUmIaMdod/cYaDioeaooOUjJ6DiWGDlY6GiYaJjYeAh2l9lH99g4SJjo2CcYZ+f3F3Z3ZyaXN3a1qMfZKBhXyAg4CEioJ2YnRsiIGPioJ+gJORfW6CbHmHkIeThH2BfoGSlJGXiW5yeoyGdWxxa3J4gF9yaG5canVgUWVyaWZTX292dF9vYF1ognFyaVdnaGNpWG1XW3VMSkxlZl5icnOFaFtcZXleXmRnemFkX1xZa25lbmp0d4p+c3OBfnp2eodzhYN8f4d3doqGj5iCjYJ7knRrd3V5eZN1b3h6fVh5hXGAb2d4d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2KmoiJe59/g5l/gXlyc25vZHJ+aWZsd3dbX3l7enFxf2lhZ2F/1baOkKZ4bnF3e3GSkIyHapiNiJuRi4Z6aIiLmYaBkpGGh5iNfI2NgYGKjXyQjH6KhXp1e4J6cYaAlZmOk5SCiXWEh3eEgIuTnZ+Glo+ffohhf5OHhIiEiY1/f4JmfZGAfn+Ci4+Qfm2CfIJ0a212dHN2dWtjjYGOf4V+fIR/hIh/cF9zcYV8j42CfH+SiXpxg2Z7hIuHjYR8hX6BlY+Rk4RucHmMf3Vtbmpren1iZ2lpWGt1WlJpcmliUGJyeGxhZV1aaoNtc2JbZ19kbF9uVFpvTkhPZmRcZ25xgGxaW2NyX1xjbHdkZV1cWmxrYm1qc3aGf3Fvf3x8dHiFeIWCfICIdXmJgZKWfImGdomBb3h5e4STb258gXdeg390gW1penOUc2dyiH1ykpGEmp+boIaHdnaUf212k5d9h5CDio2ZfIuadn53cW9samF0fGdiaXV6Wl94fHptcX5lY2hoV52PXnFylrzEhHZxlIiQfnKWi4abkoyHcmqJj5aAe5SMgYSbjHyKhn18iYx/lIh1ioZ2dn2BcXWGgZ6UhZSPg4NygIh1hXyKmZ2Yh5SOnYCIZn2Tgn+Fg4mJcoF9Zn6Le3l+f4eLjnxpgHyDdmZveHhzdnNsao2FioGKf3iCgIWDf2tecnh6fY2KhnyCj4F+coFpeYSIjIaFeYR9gZiNkIx9bm17iX13dG5oZ3x2Y1twYlduclNTbnNoYU1mdHhlYF1cWG6Ab3NZZWFeam1gcE9Za1FEU2dgWmtubXxuWltebGNaYm93ZGdcXWBsaWNsaXN2gYNxbn58f3R1g3qDgnyChXZ+iIGWkXiDinSBiHJ5eH6NkG9ufIFxaYF5en5tbHt1lWtqd4R0bJSOhp6YoJmFiG59jHZqeJiOfoGKgpWXiXmOlm96c3BsamRgc3poYGVxelphcn15Z3F6YWVlj7Gyd0piWqTZ0JZye5CKkHd9lIuEmZGMhW5shpORenmShoGEmIp8h394eImKhJaAcIyIcXR9eml5hYOlkISTjYN/b3+Dd4R5hpyZlIuTkJWFh3B7koJ9goOJg26Bd2iAhXhyf3+DioZ7ZX1+hHVjcHJ/aHhwb3WYjYaCinx2eICEeYFrXHF+coGIhYl+hol7iXKBbnGFh4+FhXOEeoKZjY2EeG5vfoSAd3plaGp8cF9YdlpYcGxOV3FzZ2BKbHZ0YF1bW1l0fXJvV2ddZmpwYG9OV2hRP1lmXlpva2d5cVpaWWtlWWNxeV9oXF5lbWhla2lxd3+Hb2x/foB1b4J7gIF+g392gYWIl4pxgo1xe4Z8eXmEk4x1anp/bG9+dH99b3J7e5RvboF/eGaTi4OhmZySgoZnh4NwaHqViH1+hIGYiYF8jYxpeHJrbGZfYW54bV9ib3hcZGyDemFxdl9lZdTqvooyOj6LjoBxeIWIjo12g5aMfpKNjH9tbIWNjHZ9j3+FgpWIfIJ4bnaHhIOXd2+IhWt1e3RmeYKDp4uCj4uEfW6AdHaEeoedkYyQkpOMioZ+e5KGd3+EjYNsf3JogH54bXx7gYqDd2J5hIFxZHFofm10cXSBm4uAf4V+c3V9gHOBcFttf3V5i4OLe4eAfIh4enFsiYSQhItygnqAl4uLf3Rua3eAgHV1XGlod3BYVntTWnBkTFtycmVbSXB4b1xaWllddX50aFliW2dlbmNpTFdmUT1eZVxddWVfdHBaWVRvZFlkcXlaaF5gZ21naWxpcHd9jmxpgoR+eW6AfHyBf4J6dYKAjZOFcICLbnd+gHt7iJKJf2h7fmp0e3KGe3N3fX+MeXiEfXxrjI2Em52WjIGAbI5+a2h+jYx6fn+DlIF+fYqIa3VxZ2hjW2Jncm5gYWxzYWhwiXpic3ReY2SboI9uXDVZr7V0aYCIfJKGdYWWhXOPiol2cGyFg4d1eYl4iXyTh3p+c2d2iX5+mG9xhn5odnltZXmIhKSHgIeNiX5ufnV/gX2MmYiClJKZiIqEiXyPiHB7fYR7aH5saoB7eml6doKHgHJgd4F+cWRyZnWCbXV7hJSRgXyBf253eXx0f21Yb4B3dYyChniIdoKJenhzboqBkIGGc399f5OJiHpubmpugoJ1bl1nZXNxUVp6TlxvXE9cc3BkVUtzeGlXWVlaYXGAdGBdXWBmZGhpZk5aaE5AYWRbYHVhXHRtWFdTdGFaZG9yV2peYmhrZ21saXB3fJJsaYSJfHxwfn57gX+CeneAf4qLg3F7h29xd4R/e4mNj4Nqfntud3l3ind9eICCh3+Dfn56bYWMiJijjYSDe3aMeWtshIiQeH17gZF/f36Kg3BycGNmXllnX29wYGBncGZqb4l0YXRvW2FkanZ7f76cpqPIuHGFg3KSfHiGk4JzkYyHcnJvg3uDdHWHdIh3k4h5eXFjd4d6gJNpcoR2Znd1Y2p8g4eegX9/jo99cn9zhHmAkpGDeJaOlY6Hgoh7iIhreHl+dWd6aGx/eXNpenaAg31oYHeHfWprdGd7gGl2gIuQlH56fX5we3Z7dH5iVnd+c3OKhIJ9g3GHind4cXCEgo1/fnl+fXaOhoN2aXFpbYiCcnBdaGJybkpkdUxeblVUWnNuYlFPc3hgUlhYXGFvgnNbYVxoZWVja2RRW3BJRGNhWmNwXl13aFVWVXdeW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHh9cnt+eYKBgXx2fYOIhoNwd4NybneDgn2Ji5N/cIB8eHl6gYx0g3h/gYGChHqAdW9+ioubnoh9hXp3h3tndIWLkHp+f3uIhYR2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXdvjHV7ho6AepOJf3V0dH53gHBxf22EdJSFeHRrYHqCeYiPZnGDb2d2blttfYCQlH+BeZKTfnl7bId2gZGMhHSWipGNhoWFe3+EbHV2f21ndmVte3Vtand2f398YGJ4hXlodHVifXtndIaOjZV7dIB1cX96fG1/WVZ0fnB1hYd/gXlsiYZ0eWx1gIOEfnt9eXtzi4F8c2d0ZW6LhG1zW2pfdWRIbm5MWmFXVlZ4bWJQUnR2V1BVWF5hcYRvXGBjbWRkXm9iVF1yR0JmX11maF1aemJRVVx1W1tna2FWal9gbmVma3FocHV4jnRrjo11fnZ4fXeBg4F7c32DiIeDb3F/dHF1f4WBiY2Ke3d/eIN8fIaHeId8fYF+hIB7fnN2eYyOoI2Jeol2dYN5Xn2FmIx5hoN0hYaEd4l7Ym5tXGJbW2FWanNjYFtnbm9mh3FhcWZXXGNrf3zKzoe5oWptbYpscYRxfISJfnuRhXl5c3l1dXtqbHVjhHWSgXZvZl59gnqLiWVygmtqcWNYbXqGm4iCgnSYlXh/fG2IcYKKjIhymI6Qh4SLg3t4fXFxcH1maHFibXhxamtxeH18elxkeYB3aXV4ZoF2Z3SHi46VfHGHam59gXlufF1Ycn9tdIGLfIJvb4p/cXZod3+BgIF3fXF7dYd8enJmc2FujIJsclhrX3dbSW5rTVVUXlRVe2thT1R1clBRVFZeYnSFaVxga2pmY1luYVhicEdBaFxgZl9dVXtdT1VkcFpbamhdV2hgX3JlamhyZ3Byd4Z4bpWKdH96d354g4d/dXJ/hoWNgnBwe3h3dXqGhYaMhXp8f3WLfn2GhISHf35+fYd/fHh2eXiRk6B/jH2LbXaAeWODhpaFc5GKb4WFgXqDdGNua1pfW11dVGdzZWBZZHJyZoFzYmtlV1tgaX94vq57oLdtYnOGaHN7cXmChXt9jH93eHJ2b3t2ZWpuYId1joByaWJef3h5i4RmcX5oamtaVm93iqOBhH9ym5RygXl0gm6BgpKIdJWIjIeDiIV9eHRybmh5YGptYG12amdqa3l3endbZ318eGVyfW2EdGV1hY2Gln9vi2ZqeoN1bXRiXG98a3V9jHyBZnWHfW5xaHV/eH5/c31se3uBenhwZmxibol+bW1Wa2B3VUpqa09RTmhNWXxoYk5VdWpMUFRVXmZ1g2ZdYHBoZ2FXaV1ba2hKRGpaYWRXWVV5WU5WbWpZXWxlXFplY150ZWxkcWdyb3WBeHCZhXZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYaIiIN4gX12j398hIqOhIKEe36Lg3t3fHd3mp2XeoqChml3fXxsg4STgHKPgnCFgn6Bf29mbGdYXVtcW1RkcGRfV2JydWl1b2VlYldcXGh/cG9ygHOJZGR4fml0dXNygoR4gIR5d3R1bmt6cWJna2eGdI2DbWZeX31we4l+aW13ZmlkVVdyb42nfIR8dpeRdHxzfHpufHuRhXeZfYeFgoaDfXRwcmxndFxsaF5sdGRnZml6b3tyWWeAdnRncIB3gXVid4WKfJSAbotqbXqBcWZzZWBtemdzeIp8fmJ2g3Zqa3F0e3F6eXR9Zn5/f3l3bmRmYm6GfG1rVmpicFNLaWpPS05wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWVgVmNXYnBdTEtrWGNiVVVVc1ZMWHVkWl9rYVxaY2Vfd2ZtYnBpc25yf3R0moF3f4B3f3+GhHp8dYKEfpeFbnJ0fHp0cYSFj4GAeYt1dJF/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx7dYOCjHpvhXN5hH2Bg3VuamhlVl1bWlpTYm5kW1hhcnppaGxoX2JXX1tqgGlrb4Bna2BoeXhqc3R0boSBen99dXVuemhqeWpfZW5ogXaPg2ZlWGJ3aX6He29pb2dmXVVYb2iPqXeBenyQjnl1cH9wcnV5jn94lXWGgn+Fh3VqcnZnaG5bbGRdbXNfZ2FqeGh7bVptgnJzam+Afnl3YXeEhHePhHKIcW95f3JjcWlccHhkcXSIfHhic4BwZ2p4c3JseHd1eGSDe394dnBkY2NufH1rbFVpYmZTS2xoT0dSa0VheGdhTVNxXEpNVFlla3d7ZV5tcWlkXVZgVm5uV0tTaFdmXlhOVWxUSlx5X1tfa11dW2NlYHpobGFvb3Vub3h1eph9d4CBeoCAh4V6eXqDfoGThHF0dH95dnSEiJB9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSsn396iIiDa3KCenaBf4F1boZufH9ziYBqb21kZFhfWllaVWJqZ1taXnSBaV5ta1xhVlxcbIFlcXR9aWlca3Z2Z3R3cm2Fe319eXVybHloaXhmXWRzaHp3koBiYlRlcGeChXd3ZmhqYFdWWWdjj6hvfneAi456cHF+aHhveYx7d49yhH1+f4ZuZHZzZGhoXGtiXW9vW2dfbXVkemhddIBvcWtxe311dWF0hYp6h4eAf3dydX91YXBtWnJ0YnFyhXx1ZXKAbGFsem9qaXt5dnJmhXZ7enVxZWFlbXN+aWxUaV5dVEtzY1BHVmFHYnZnYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVl2ZVVKXGNXaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bm9udoOXeXKBgHx/iIuFfXV1hnmHjH1zdXWCeXp6gouOfX6EiWlzloF6ip19foV6gXp/fIaIc3GProx7e4ePfWVyiHp0fXx2cm+FbHt+bI96YnBvYmVdZVZZWVZjZmtgXVxyhGhYb21aXldaXGx7YnB3dm1iWmxzc2d1dXBshHl+gHl3bm50ZWl0ZVtndWZ2dpF5Xl1SZmZrg4J0fWJjaVxUWF1iY5ClaHh0goWQeG1vemh4bXuEe3WJc4B4fHh/aGV2bWBmYF5qX11za1llXW9vYnplW3d7a25ub3d4c3RkcoOSfoeCiHp2b3J9c2J4ZFtvcWJxcYJ8c2dygGRebnZpZGd5e3Vub4J1dH1zcWJfZm5vfWRqU2hYWVRNd19RSllYSGJ1ZGFJVG1TSkxaV2lscXtibGxzY2FZWVthdltTTGNdWGlTV0hZYU5HaXVYXmFtW1tfYmJdhWhoYW54eWxvanaBkHhtgn6AgZKHg4F2dIl0jIZzcXd1gnd8fX6Mj4B+k35wd5WDfJmSeYCAeHl+f3SIg3NwmaJ7en+JlHhkdYh5c3h1bHRvfmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYllU3FtWlpYWGBsdmNpdWppXlltc3Fsc3NzaoV8fn98dm5ubGRpcWNbanJkdHaOc1tXU2VhcoB/coJdYmNdU1pgW2OSn2VycYWEkXRsa3ptb3B7fHxxgXd/cnp5eWRldWhdYlpgZ1tedmhXYl1waGF3YFt7dmlpcm53c3J0aHCBlIKGfoR2cmpwfW1md1dca25icXOBenNnb35bYG9xYl9qcX5sbHV+c3F4a3BhXGVsbHphZ1NnVVdSUHVbUlBZUkhjdGJgR1VqUElQWlVra2t8ZW1vcWFbWlhZbHBXU09mV1dpU1RGWlxPSHJ1WF9jbWNYYGBhXYtqY2RteXhrb2l1eYZ7a4N9f4SZfIKEeX2Ibo+GcW93en10goJ8io6Cgpd0d4KThYGfiXWAgIFzf4Jxh4J1b6KXdHuGi4Z7ZXiLb257b2Z4cHpsc3ZyjGtedG5hZ2VrUl1bVWdhbGxaXHCMZE9ubVxWWFVnanRnYnRlZV1ZbnRucHV1eWuHfH98iHaPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGFXGNfY1RaYFljlZVjbnCDhYpzamh7b2Zzd3N8bHp0dW95fnVeZnJjW15WYWRZYXRlVV9gbWRhcV1dfm9oaXNxc3B0dWpthJKBiHuFcXJmbn1wcm9UW2ZrZnF0gXdzY2x2VWJxaltfb2Z9Zm13fXNzc2ptYFpkamp3XmZUZFVWUFRtV1FXU1BIZHNfYUZYaU5IV1RWbWhkfGlreGtiV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWWJgXl6PbmJmbHl1bm9odnZ/f2yDf32Gl3t/h4GKfmuTiHJndIB7dYCCfIiOf4uTcnyKkYWHn4Z7f4aMc4GGc32Ddm6ljHOBjYt2d216jGBlfHBmenN5bG1xdoJnZHtsY2ZnaFNfXlVnX2xvW15ujWhOaWxfVFZTb2dzbGZ4ZGRcWHB0bHJ6d3JtiHt/dpx6eWthZWxtXmBvamVweH5nWlZYYGx4fHtwg19iXmdWWF9XZJuIYmtxgYd9d2treG1cd3Fse2p2c25ve4ByWGpuX1ldVWJjWGRxYlNeYWhiYmxaYH1rZmtzdW5td3ZraIWLfoh6iG1xZXB9bXJtY1lhaWlvdIF0c19pbFNlcWRUYm5iemNxd3t2a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVwXWNGWWlNSV9LWG1kX3hobn5kYFReVF11XFRTYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNuZ3Z0eoNygYJ5h41+fImHjnpukIp0bHOCdH9/h4SGkYSVj3l+jI+HkZuEgHyMhHKAgXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2tra6kn6CgoKCjgGNnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0taijpKSkpKd8XF9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJmZmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRj4+PkI+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5CKkYyOj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyMjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeKioaNhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhouLho6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+JiI2GjImJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aIh4aIhomPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Ki4yJjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OjY4Ozw+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5ODk6Tj84Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GBgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09Pj49O0Z5Xzs9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEtJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NERD8+PT1ASUhDWHlvQz5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZFTkA6QGV+fnhyd28+OTw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE5MPkE8PD0/PkJDPz9BQUFCQE17ZkBrh4SEg4J6cD85ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkM/VXV5cYGBgoJ8hIByQj09Pz09PkNEPzs8PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBVdXSBf3yDg3yFhWhBQUBDQEA/QEA+PTw9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQExzc39/fYOFhoaHXz5DQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTUpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWZ3gYOEhYaHh4mES0RFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHWHSChIaEgoWIiI1jQEJVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExKW4SGh4OBg4aIiX1XbISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEllh4eGgYOFgIGCg4SFhYSEhYaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSmyHhoOAg4SAgYODg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT48PD1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaYWBgH6AgoSEhIODhIaJiouMi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0V2hX+AgYODg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2tycnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I5SIKDgIOEhYSEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk7PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7PzxXhoOCg4WGhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPz9BPT48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQmCHg4OFhoWFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZFRkZEQEI/PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFARERFY4iDg4WFhoaGiImJiIeGhoaHiYqKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkNISEpghoKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExNS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw7PD06P0A+QEBDRkpKUGiDg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEdFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QEVJS01Wc4OEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4teUVFQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSExNUVd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVVJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0ZWTkZPUVFVWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOzpRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hJSEVGSUhJSElqcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f4CAgICAf39/gIB/f39+flRISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A+QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFlnUlVWWFVUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWVhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH+AgICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWFNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUk1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSVFVaXG1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/gH9/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlQSEZPRkRFRkhHSEJDSEdISkdDQkFEQE9QTVJkc3V2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QD8/Pz5rUUthRUZISUVCP0dMTkdNUVVJQkU/Pjw9PD09Pz0/QUNCPz48PUI+Sk1GVW51dXVzdHZ4e3x6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFEQlxdT3tOT09OS0xNT09RTUtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztBSD9cdHV1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZETVJQYVdSWFFQU1NSVVtPT1FWUE1KQ0Y+Ojo2NDg2OTc5OjM2Njc5NjxCPWZ0dXZ3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNRUFNaV1RUTVFTWVNcZVVPU1RSTktJSEM/QTk5ODg5Nzg4NDc1Nzg1ODhHbnN1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KT09VU1RcVlJVU1JOTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KR09QT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVCRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFQUVBRTlFPUE9MSkxMT1BOTlBRUU5RT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSU1MSUxLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PT1BQEI9PkVIR0RGRklHS0pARkFBQEZIRUpPSFFSYVxRUFJOU09PT0xMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZEP0JDPjxCRj9CP0FkcXR3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87P0FAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVFNT05XS0xNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTktHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBQSEtFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUTEpJTVRGSUlKTEpLTElJTE1PUFJQS0dDTEdDQ0pKTE1PTklKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGSEhHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNUEdIS0ZIS0RISUtNSEpMSEhKTEtNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLQ0ZFR0RFRUZFR0NDQD48PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGREI7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1HSUxHRUZJSUxOS0pIRU9JQ0dNTE5NUE1OTk1MSUhJT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkNCRUBEQj4/Pjo7Oz06PT9DQT9BQ0ZHSkdJSUxIR0dHRkVDQD1FRUI+QURDQ0VHSElHTVBJRkZHS05PS0ZISkZFRERJSUhLSUdIUEtESk1MUE5PTk9PTkpKSE1SVVRST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzo+PkBCP0BCRUdKRkpHSUdGRkZFREJBQUZGQ0JCQkRFREdHSEZMUUxJT0pKTEtJR0hFRkVEQ0lISEtKSEtSTUNPT05RUE9PTk9PS0tLUFVXVlVUWGBeXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmtrc01GRkVIQkJBREQ8QUFAQzw4OT0+Oj89P0I/QEBERkhFSEZGR0ZGRURDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZJSEVDSUlKS01LUFNORFFTUVFSTk9NTlBNTE5TV1ZXWFZYXltdZGBoYmppZ2tfZWVnY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJGRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0NHSEZIRkVDRkpKR01KTEtJSkxGSUhLSEVLS0xNTk9SVE9JU1VUUVRQUU1OUU5NUVdaVlpZVlpeWlhhYGBgX2hlY2BkZWhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9yc3lNSEhHSURBQ0hFPEBFQ0U9ODo+Pjw8PEFCPD8+QUJGQ0VCQkhEQ0RFRkZHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZXF9fXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJFR0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREdGSEhGSEhJS0pFSkhIS0hGRkxISEhKR0xMTExMSU1LTU5NT0xQUFFVVldPSlZWVVNTUlFMT1JSUVZbW11eW1xeYF9hYGJkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd292SUpMSUxHQkVERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFREZIRUlFRkVJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOT05PTE9QUlVYVk1OVFZVU1JRUE1OVFNSV1teXl9dXWBgYWFhYGJkZWJjaGJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3BzdnR1dXd2dXV0ZXFza3BxanJ2b3dKTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0ZCQ0RBQUVHQ0hHSEdGSkZDR0pHR0pGSUxISUpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZWFhY2luaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NCSUVCSEpKSElLRkRLSkdISUlJS0dKSk9LTkxJTEhKTUtaZkpkXEtsUkhPTl9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENEQkVFREdCRkZHQ0RKREVKTExKTE1HR01KSEpKSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxsVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9ccHVncE1Kcnl2a2Jga2VlbXhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz1CRkdCRkNFREVFRENISEdERUtHR0xNTUpNTEZKTkhJS0pJTEpKSktNTU5NTU1LTk1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhwY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9Pz9GR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUtKSktPUE5OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRUNBQjxCQEJGREdGTEhFQ0NIS0hIRkpMTEZNS0xSUkxHTU1ITkpJSE5ISkpJSE5PTk5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2diYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTUxJS0tLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3c0hIRklERURGQUBBRURER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpJS0tJSEpHS0tLS0dISkpMTExLSUtMTlRbXFRQVE1QT05PT1ZRT09RT09RSkpPUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0lQS0xPS0xXTUlFRUhJSkhJS0hMSkhGSEhKR0dJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHh5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKR0VISFBKTE1KTVNJSEVBSEZKSUtLSUxKSEZFSkhFRkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjYFlfYltgXltUWFhaX15kYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh2cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tFRkhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUFGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJZVlVcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERDS0pOTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQUhJQT9JSkdPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUFBdX2FjY2NjYlxkY2JkY2ZYUVVUU1xYW2FfXl9hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0hHR0pGRkZJTEpORUNLSkxOSkxJS0pISUdCSEhRTUtLT01LS0lIR0VEP0VCSEhBQUdGRFRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJgYGJiYGNiYmRkYlhPUVFSW1NcXl1eXl9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lJS05MTElMS0lJR0RIS1FPTUxQTE1LS0hJQ0VBRUNIR0JBRkVCVlVFXFReU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJcYGBfYmNiXWJiV19fVFBPUFFYUl1cXF1eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNQRFdfSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FERUFMSENMTFBPT0xGTUZHSUpIR0xMTU9RSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUFVUXFlZW15eYWFlZmNoY2ttcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXkxHSFlNR0hKSEdOTFFRSUxKS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRURfTERmY0RNW0heXHNtT01WbVlMQ1BgVWxXZ0pdWFZeRExRVUxNVFZRUlRYV1RYVVRcVFBmWmhoZFlUa1RXVlVbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USUtHYFRHSk9KSU9NUlFLTUtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlaX1ZVV39qdHV1X2F2X1hiXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdJTEZSVkxLT0lLUlhXUU5PT01RVE5PUVBLTE9HTVBTW1pUUVJPUFBQSkhaeF1UeGRoWVJUUXZndGxwYm5ma1FyT013bWpycHNycXJwb3CAXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zc3x9b355b39yYGBgYmFaYWBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQT01NSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dRVFBQUFFLR2Z4bGN4cW1aSkxVeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGdvWHZ2anZ1cIBhc2h9aWx4fG9fX19jYlteYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3Z6bnx9eXhybk5KU3ROQ0JFUFBJS0tKTFBPT09NUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRoYVZuTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vZFJncnVubXlwd2x2c3RxbG1cc356a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0tbVkhHRUdSUEpMTUtMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobG1yfGttaGt7dG1ta21PR0pLSEpISFJRTE5QTUxUU1JPU1NXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVNTV1tXWFdaUFNVV1dYUV1YVl1VU09YUldXV1haYFtncl5bXFtdXl9jWl9jZGVmZGNjYlljY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKVFJNUVFQTFZVVFBUVVhVWVVSWl1WVVRXVVlYUE9MTldUUU5VU05QTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhNTk9RUlFRUVRWUlhXXFdTU1BRVVVWVFpRTlNSV1VUWVZUWVVTUlVTVFVYWVdeWl9hXVxbWlxcYGNcXWJjZGdlZGRhWWBhY2FiaWhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLS05PTE1UUU9UUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPWFNQTlVQTVJOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1NPU1VXVVRZVVdZVFJSV1VVV1xZWmBdVllfXV5dXF1hYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RQUFNRT1FaWVhXWFpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFQUlhUUlFPTU9TVU5XUlRVVU9OTlFTVVVUVFJUWFZaXVxaVlZRUldYVltbVlBTVlVVVlhUV1dUUlJYVlVaX1peYF5WXl1eYFxcYGBfX1piYmRoaGVkYlliYGJeX2ZkY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUVdTU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVZWW1tXUVNXVVZYVVNYWlRTUVlXVlxeW19fYFVhXGBhXmBiX1xgXWNhY2dpZGVgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSTFFUU1laV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVlZcXFZRVFZWWFlSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1bYFxgVVxdaWpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZWVVNPVlJTWlJUVVRYXFdYWFNYXFheXVlbXlRVTlZXV15bWFFUVVhYWFRWWFtUU1ZdWV1dYV5jY15ZYFtlYl9kZF5eY2NhXWVmaWRmXV5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtcXFtYWlteVl5ZXVBPT1JaUFpVVVdWVFRUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVFRVVFZZV0xSWlZdW1xST1VTWFZWU1BYUlNXU1dWVltdWFtZVVpeV19eWVxaUldSWVhZX1pZU1RWWllaVldZXFZUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpXVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRTWFJYVlNSVFhSU1ZUWFhYXV5YXVtVXl9YX19YXFZSWVVZWlphWVxVV1daWlpYWVpaWFZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVpbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlRcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFpcWlZYVVdbWllbWlhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdaWlxfXlpfXFZfX1pdXlleVlNZWFlaXWJaXlZXWltbW1pbWVtZWV5fYGBkY2RlZWJkWmJmY2dmZV5hY2BjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1daWFdcW1xgXVZdXVNQVlpXVlpVWFVYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xTVlhQVlZWVlZWU1ZUWFxcX2BgXWFdV2BeW15cW15YVlhYW1tfYFxfWFhdXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNhYGVjXWZpZGVoX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYmNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBYV1hYWFdWV1ZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBfXV9ZWV5dXl5hXVtaWVxfYl9iZGRlZmdnYlpkZmdpZ2NfY15hZmRaaGljZmljZV5iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiYmFdYFhjZGJgY2FjXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNhUlxZT1hXWVtaWVdaWmBdYGJiYGFjX1xiXV9dW19eWVlVWF1dX2BfX1taXl5gYmNcW1dbXWBiYmNlZGdmZWdkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9dXF5cWV1cXl9hY2JhYV1iW2JkYV9jYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGFUX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl9dU1xfYGNkZGZlZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6e319fX18fXx6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0tLhRJisrKyoii9vS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/wMC/xEkUGxsbGxCO7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEg4GCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2AgYGBgYCBd3Nzc3Nzc32FhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5dnZ2ent4e3h3dnh7eHp5eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx6e316fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHt6fXl8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6e3l8ent6d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en18fH17fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h7enl7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4SEgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoWEg4ODgYOEhYSEhYWEg4KEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgICNjIGBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYKBgoGAg5aWg4B/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAgoOCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKBgoSEgn99fXyHmpiGhIKEgoF/gIKBgoKBgoSCgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4SFg4GBg4OLiIV+fHx9fn+ZmoaEhYSEhIKBgIGCg4KChISDgoKBgYSFhIODg4KCg4SEg4ODg4OFhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhIODg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+AhpqRhnyCf4KKfpCag4GCgYGCgoGAgoKCgoGCg4OCgYGCg4WDg4ODg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYSFhYSDg4SDhIOChpSUkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f36FnZ6Fg4uAgIWAgYmBgYOBgYGBgoSDgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIKZoYeEhYiHf39+gYSDhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgpCcg4CAgYF+fn19hIWFhIWCf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDhouBgH+Di4F9fXyDh4aDgH5/fn5/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4J/f4WHhIF/foGFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgH+ChYKChIKBgIB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4F/gISEg4GBgYGCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoGDhIODgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYSBgoSDg4ODgoKCg4F+fX1+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDhJGSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhYCChIODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4KAgIKDg4ODg4KCf319f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoOCg4J9fX5+gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359fn+Cg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB+fn9/fn58fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f35+f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOAgoOBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f359fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhYSDg4SDhYSEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgIGCgYKAgYGBgH+Lk4+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRjIyNjY6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2MjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuKhoSFhISDg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYeGh4aBhJGOjIuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9e31+fn+AgIOHiYmJi4mLiYWIkY2LiImHhYWDgoKDhISDgoKCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICAgoF/gIGDgX5+gH9+foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fomGhoWFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH99fn5/f31+foCBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH+AgIB/gIF/fIB+gIB/gYCAf32Af35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4eHt4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59gICBgH+AgYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn58e3t8fHl3fHl3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/gYF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHt7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGEg4OEgYGDgIKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYB/goGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4KBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhIWEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foB/f4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4KCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCf318fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/f3x9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4KBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+fn9/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISDhIWFg4eGhoSFhISFhIWEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fX59foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhIOFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3x/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKGhoaFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYqIhoSGhoWFg4WGhYaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFh4aGhYSFhYSFhYaJioeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4SDg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e318e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgoKCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2AfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYeGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOFhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEg4aChYGBgH9/gIB+f4CCfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aFhIaHhYeGhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX2DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29jW19fX19fX19bW1tbW1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjImiv7y9vb29vb29vb29vL/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZSfK6qqqqqqqqqqqqqqqiw0tLS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaVoCvq6urq6urq6urq6uqsdHS0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZGGGsq+vr6+vr6+vr6+vrrbS0tLT0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs/Ozs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzLz9PT0tLS0tLS0tLS09PS1NTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz87R1dTTzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tXV1tXW1tbW1tbW1tfW1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHTrYODlc/SpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2ty5q6uJm1s5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIianryijICNxZ6YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZusoIis1rqZoZ2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5Sisaitm6aymZavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEmsGinZWnkJqEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkJ7Ep7Srn3+gqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qiZsM7awZyAvK2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Nzk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWaoKeRoZ+gmaiWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp563pKujnsOgq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI222aePj6zYwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dLVv7/W0tXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnp6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9bXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipKmnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6mnqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqsqKirsKmoqqihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYW1odWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0NERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb21ocXhveWppYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3lmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDw8HEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIyMnHxcnHyMe/xcfExMfIytPP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLCycHKysjGzMrNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVvdGJdYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBwsO/v77Ey8jKy8e91NPHyM3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnZGplYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDubi5u73Bx8HEzb+Qy8bFxMHEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e9xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmdjW1paXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9wLm+urq0wLi1uLOuuru2v9GfiMDOu7/BvLvEvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vsvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmJnamdmaWVpXVZWVFlPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0FAQz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLewrbe2uMTLjIWbyL27w7W6x7i2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGhoqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2hYWE5LS0tSSUxIQzk9OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7m4sLq0ubzJuoOFhrXEvse3ubitt7W4urS4s7vFxsvBvMbAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3ubG9vrvEtrilh4CLe46cxaN8g4Wxy8bPwsC4rrW1vL64urK+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG54Y2diW2NRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuro7C4ydO2ur68xrSieGVyZVVgZoeNfYeHqs7O0czKxLW6wMPIv761v8G/xsa/y8bDv8G8wMPMysfFxsC5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLGzv8vI2769vbyBanZgZ3ZeV1Zcc4CJi6jMyMzLzcrGwsTLzsK8ub25ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8tcaQccHTwLR9W0xvYVB8f3ViVmB+hpGpxsLHy8jBw8HAycrCwLu6sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7vSl3KDtcKbWFRWjWJSZICEhW1JcoaXtMK9v8bAucC8vsXEvb25srCuuLe/w8fDxLy9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pW19gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPkNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnC15h/couudlJPbJlaUlVampR3TG6OorS4uLjCurO7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9mXVpUSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w9WdiX14lWBOao11XVFdbLq1dVRXj7i1srG3vrmytbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZxbF9jYVtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8DKn4mBfYBYWJKPZ3Fgd3J6l3dua1+LvbOwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTUE+SUJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i5xauViYx4TGagw32Gm5Bdf3lsdXmJsbq1sbS1srSvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7u3lpOgik1okpN2b3lyaGlrdoF3eKW8uLK0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yt6adqJNYgHBzbWRrX1lXWFtiX2yBm7myrbOvrqyutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj4+Qk5CXlZaYn56empiml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR1BNTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6WsqbDAsbN8eHZydGVXVk9JSUtOT09ca3CmtaqytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mao5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01KSEdPUk5KTkc8RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaGmx8SmYWZpcmBST0pwVVZKT0pMVF5dgbevr7O1qqesq6KcmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHl5YGJSVWBJSUpLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWenLu8fW9pamFUSldwnIt6WUxGR05UVGiusrCwuKymoZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKxtKqyr6KZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKT09VTFNMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpyim56pq5Z9a11UTU1cncTLqW9ZTEVDR01hmLCtrK+nn56ioJeRk5ugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFJVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKZnpuhoaOKb19VUlFVacDj0rSdh29ZSkVUkZidq6qppJ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+nqKWkn52qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JXTkpHTUdDRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOid1lSUVRWaIPAzLOYsciwlIqYucWiqa2pqqWfnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHFra3VycGhXW1FFVEhESlBIP0VBNEZIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfn5qhnWhQS1BRaYGctbqnh7Pg29bb2si0rqejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsHGvrq0urq0u7ewtbKqurKuu7e/u7qqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrZGhveGpkWltGS0xFRFNMREJFNzo/OzU0OTk3OD4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaKdnJVdTEdOWH6TwLikkJjV5NvRxLSmn5qcm56emZeXl5KMjpeXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszR0tXO08m9wL/Du8bFyMXS1M3T0NPTzMrCxsbHysjOv8jRzMfFx8XBvMPBvr++tb6zrr+/wsPHxMfErr+4sri8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOfnJ6WYUpKTmaKutfTv6/A1Mu5rqiin52fmpiWlJKUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NbY0tfNxsfJzMPFys/K09fR19LV1tPTyMzHzM3J0s3O083FyMnKwcbLx8jJxr/Ds7PIxMvKy8/Gyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2gpHVdZ22NvNjc2tbLurKqo52dnaGloJ2alJSVlIl8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDW1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLW1tnV19PW2M7Sys/RzM7QzNLPv8jHysPMzMzOz8XGx7a/yr/RzcvPxsnIv8PDyM7Mz9DPzcrHzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSEk+O0E4PTQ1ODU7ODY6PEA+Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWfo6yKf5Oz0tXa2s+8rqiblZignJuhop+bnJmViXdpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV19fX09bP1dTa1NTOz9XU1NHRzNHN1NfW09XQz9LT0cnT0cjQ2NfY0djS19nV1szPz8rN0svO0MDGwsfFzs3R0dHIzM3AyszF087LzsjEysfGyMzK09PR1c/SzNPBucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaWcgJSWx9jT1sKtpqGYlZeZm52gnpmdnZN9cWVjY19fYV9fYWBfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0dTV1s7S0NjY2NfLyM7Eyc/MyszAyb/Hyc3Oz8vQzc7Mzs/Iy9DQys7KwsnHyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPTMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramnf2yBlNPWzbCbm5aVl5uenp+dlJaYlIhrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Hzs3N1MzO083L19bQzNHUy8zQ0tPKztHV0tXVysDJwcXMwsjJwszDxcjKys/KzczQzdPLxsjPzcjHy8XGwcXKzM3P0cbQzs3NzM/Fx8G4ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV5cHFrbWdgYHBoWFhoVkxGTElQUEI7Qz47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKigqmhvfafZ0KqVjo2YlpGTkpGWlpaQi3xlYWJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8W6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL7Ax8zMy87Cy8vIx8vQxMXIu8fDycjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7utpaJfb3i50KuQjo6XkIeEhISCfoWFf3NgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLLycHCzNDFy8i/ucG7xse+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xry8wMPFzMXFu8DKwsXH0sXByb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3ZzdGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srKRX3KAvrCQi5OXh3uBhYaAdnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy8urjBwcLFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDv7zBzcPGvb21wb3Dur3Gu8K6s7zFxMHCtr+2tb2/u8zDvLW6yLq/vsvEwcbCxsnGyMbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztHKysrHzc3O0cjQxtXU1tfNys/FycXHwbnFvauvg2N1j7WSjImLhXmBh4eAfoR8dHRjW1xdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLOztLy2vbG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bBwry4vcbBw7u1rrK2ur+0xLe7tau4vb3AvbG6tq+2urPFvLeuu7+1t7TFvL7DxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTPzdLPzcXHwcXAvrq4ybaqsIFrcpmcjYaJint5foaGd3iCfXRpXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquts62prKm0r7ewsqmupqyyvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLHAtri9sLCnsrO1u7yrrrWlrrWuu7Kwqbmwrbuuu7i7wMC9ucK/x8PFwbzGwsjLuMXHxb/Gw8O6xMbCu8bJzMuzucK8u7OIc3Z2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xMTDw8rCycq+v7zAurK0tMOuqa6Ga2SKkoiOkHx4foqFenuEgXduXl1cXV1fYF9fZGNiY2NiYF9eW1taWl1aWlpaXGRub2hnZ2lrbnKBrbmwta6mpaenmqCloZqcpauupKiirKqsqq+jpp+qrbW2sb25r7evqa64tLS8uLS8r7e5tbK7wbLArqWpoquxsrSovaqrqKusrbSzpqiuoaSvqbKmp6iupqi3rLGyt7q6u7K8vb6+xL+1wsHHyLe/wMS3xMK/u7/Ewr7EyMzKv77EwMCph3N0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvJtr3DvrrKt8HDwbS1u7WwrrS7rainiGBtjYOIi4B7foB+eHR/fHN3ZV9dXFxeX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaWtvcoWqpayloJyipZSepZuYkaGjqqSin6Wlp6WtoJ2cpaassq+2t6ewq6iqtKu0urG2ta62ubGvurqxtqSgpJ+msairqLmqpKeoqKeyraCnpp+bpKasnp+npKCgsa2trLK0srSwtby2u8HBsrq+w8GyubnDs8C9v7W4u72+vMLHxMLDvsDEoIN4cGthZl9rb2BUWV5ITmdPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8nLwsa4t8fBzL+4ybe7xbizxLi0vsCrtbuxq6SusqyfoYthgIeGhoF8eXV0b21rampxaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeWm6KWnKOZlo2eoaOnm5+fo6WiqJ6bopufq7CssbajqaqqrKyktLmtt7Css7WusrWusKqfnZ+korKlpqm4raKmpp+orKuZn6CemZ2fpZqao5ybna+pq6eqq6ytsbK4r7i5u7C2vLy6q7OzubO9tLaxsbW0v7a9wL3Dwbu7vZeDe3NrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vEw8++uce4t763ssG0sbu7q7i5sKGdqKqmlp2FZoKFhn94cm5wbmtiXmJmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1hYWFhaXmJkZGVmZmhpa3KNp52UlZWbmJuil5aRnKOiqJ2bnaWmoqacoKCbmK6ura6yoKWirqynorWxsrKsqK+yp7qzprWgop6bo6Kto6Kqtaqio6adpqajlpmel5manaCal56cnJusoauno6SmrauztKq1sLOrsrm0r6mvsrKzt7Ouqayusriwura6vb+3s7GUhXl1ZV5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLMyMbAxbbBv8fOt8DEvbO5ubK/trG4uqyxtK2dmKOonpGaemmBg4R/eG9xdHFpZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqKclJSQlZeXoJeZlZihnqGclqGiqaSfn6mdnJqrp6+wqpujpLiqoaCuqLaqpqetsKS3sKS3oKKbmZmqpqGarLiwoqGknKKfn5OUoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK6otKuqp62zsKWrrrKxsLCur6anp7KusbSwvLS5t66jlIF5dWReYVZZV1NSVEtNXkxPS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri9rp2nqKOqu8C9wLmutLjBzMfFwsO9xbfIzLLBwsGuvLu1u7y1uLmvr6+nm5ifp5KPinJ6gHx3cWlscnRwaWhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjY2JjYmNkZmqBlpOVjJKUlJuZnZeXnKCcoJahoKalpKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsK2rtJ6gnZWVqqGilK2xsZ+io52emJuTi6GUkZOYmJOXl5iXnaabp6GimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaasr7Sxr7y1sa+uoJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxse2xsSzwr/Fq7e3vba9u7q1squrpZiXnaGKh3F7h352bmNhZmloZmdqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1pZWltXVVhXVFRWVVNUUlVgYF9gYV9gYWNkaYGUk4mRj5STlJ2VlpekmaCXnKCloq2mpKSjo6KcqqulmZ+lsaqgoZ2lq52nop6trKmprayhoqKVmKObnJCrqbCbn6KfnpeZk4qekY2Sk5aQmJiTnKGinaSgoZWgoqSmm6OrpaKkqqSrrqWtsqmmpaamtKapqK2ztbS5uq+prJ6LcnBvYFtXVlVSR1FPSFpbT1JKVEtTTEVGSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm9sb7EyayxuMG1u8C7tLOoqaSUmJmah35wh4N7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eX19fYmRtjpCEkYeQkY+ak5WTnJujnJugqKmrqKynqKWkmaWupJSZpa+pn5uZm6Cerpmbq7OgpaafoqOhlZOblpaSqaqtmpyfoaCalJCMmY6LkIySjZaVkJ6hoKOcm6OVm6GjoZeiqKOiqKugq6+jrbelo6OirK2qqKuvs7ezvrWzq6+YhHRzaFtYWFJVUUVYTFFbWE1UTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62os7auqaevrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEu7e7w8ixrbi/t7y9urKzo6eelJWWlIV4c4B2d25taG1ubXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH6NgYt/jJCKko2XkZeZoqCboKyqpq6sqK+kqJqfrKCVlqSop52XkI+anq6WmKiqmZ+dlKWgnpKQkpGTlaerpZqZmZ6elY2Mi5OGiI2DkIuRlZGgnqGjl5WflZqhop6Um6Wlp6iooLGwprG8p5+jrLSrrqewtbC5tcCxrbGrkH1yc2JWU1ZOUklGVlBSUUxMV01KTE5SR01KQUNGREM+QDY1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqaisKudqqepsrGltsa0ubqzysW5usHL0Muxtri8vsHDsbCyt620s7qysaGhmpuWlZKBfnZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKl4mUlJibmZ6pm6CqpqWrnaiZoaWbk4+fo5uXl4WEkpujj5SjnZaWloiim5uTi46KkJqkp5yVlZebkZGHlI6LgYuNf5CKkpKSoJqfopWTmJiVoqaZjZmkpqimoZ+0sqiyt6Gcoresqq2ksrKmtby2rKuxo4l4c21dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2saWno6mloKilpLOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq25rqudmJmblJKFeoFtX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOho5ill6KclY2HmJqMc42Dfo2XloaRmZCUjo57mY+cjIKJf4qYn6OekJOYloWNgpR+fnSJjnmQh5OPkJ2amZqRlZCdjqKjjomaoKGkpJuitK+sr6yfmKW4pqaxobGunLC8qqmvqpmCd3NjVk1ST1BNQ1NOTFFNQlBRSElOUk1ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6a0wbiwtLDJxLe5wc7FvrOsusGrrcOtqKKmkp2mtauhnI6UlZGOfHZ9ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5YcpCDl4aOnZeLlJCfmJ2VlJaVj5aJgJOJXztXb3yLlImAjJGMkIaGc4qFloF5gXqFlJ2Ug5WOkZCDhn2TeHFvhY19iYGRjY+XmpiTio+JnIefmIeIlp6aoaCXp6+praion5ats6Kmrpmsq5iotKKpraOTfXJuYFtOU1JWTERUSlBNTEZOT0lFTFFNS09KSU1PRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6OpsKintMG5sbWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm66gmJWEk46KhntydFxRTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQH+VkZF9iZSNhIqNm42WlYmSiIaVhnmIf2BKUW54ipGEfYSNioV/f25+f5R3dXV3hI2ZcFGNiIqGe354lHZod4aIfoqIlYqNkZKWi4SKiJSEmoyChJKblp6dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoqaoiXRtZ15bSFFRUk1JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+ir6GnqKWnqK+tqrW8tri3s8G7tqe5yLi2qKi1tqqyvKaelY5/iZOnlZSJfY2DgXx2b21YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJOBkpmLj3uGj4B2f3hzbnVwdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gXZycpJ3Z3WEhISEe5WJiIqMi4B/hIuMf5SDfIGQmJWclZGfnamen6CdoKmln52Yjaekk6Gflp6epIByaGBcXEpWT1JHSlhST0pMTVJKSkpMUElMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5NDc3OTU2NzYyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlraywsaq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGOlIGOm42QfnaFeHt1b25oWEtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfXlnd42XmI2PfWh5gXZ4gImPfYSYkoFxh498d3tva36tfXOQi397hpKBfX90ZnZ8hmxvaHN8iYyIgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX6Me3V+jpKPmIqSmpujlpmdmp2eop2WjYqlm4+el46WmI92bm1lYlpXV1RRSlNVVE9QTlBWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmwr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mPhJJ6iI2KinZxfW50cGlsaVdLRkdFQUBDRElMTE1RUlBRU1VUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCTlpeZl56XjIOJn5GLko2GkJZ+bWhtbm5XVVdUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ozk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCirKqota+urLS/q7zCv6aimZWkl52NhIuUoaGYmJGTi3OOeoCFi4Z1b3VscGxka2pYTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVVRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyaknRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxgHxncXF7bpONj3tzfXxxcG51bYJ/eHl1anmJgoiKhJaTkpCLjZGUlI+XjoB5iJeIhoqGgJCHdmpqbmdkV1FaV1lZW01QVVZZWE5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfprqvq7KwwrG7w8ealo+UmYuNhXmEkJiUjZCMj4Zxh4J0h4yFeXBzcW5vZHBmX1RGSUM/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgYWBeoSGhnlyoZV0eIFzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBnZmJqbnJtcIN1aW9YdXCOmpJ3bH97fW1xbXCAenN2bmN2hH6GgIWQkYqLiZGLkYyLj4N1eIuPgH6DgH6PenFwb2tfWlxdW1lYYF9STltaWFdMSEpGSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ6kp56vlaW1qq6xrsGyu8HGlpCMlJCAiH1ugZCSiYOKh4+FdYKEbJWIh3t1eHhsd253Y2leSVBHPkA3NDQ5Ozs8PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgYWZhJucYYaqn52Lg5COeneIfomIjXOKl4+Eel1kcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenB0endrbmled4d9h3yIh4+Ai5KXg42FjYd9cYR/hHx1d3t9iXVvcnNlZl9bW11TW2ZeV1FVWFtVR0pLRUtHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcj0yMzMzMUV+VzQ9OVyMeIqAlIySnZ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgXOhhIt9fYF/cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbXyBhod9jmhnaHh+boWHgoVxhIVHa4B3cnl2aG1rX3d9g4l/iIWMepWem4qLiJF/enWLdnx3bW93fn9zcnFqWl1cW2NjWGZlXFVQUFZZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyImJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1ZLQjYwLi8yMzEzMzY2ODo9P0BCRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoKGXlZuapa2Tmruxp7vHw6iKjKGlj5SJgZF7coSen5Gcf3aFhYqPiJBqaG+DgHWNh4SLcYaCd4eAe3aFfW52dWeAlI+GiYiIiIehq6GWio6Yf3uCiXp6b2dreH54fXFqY11aWl1pXGFmX1lPS05XUlFJUEpETkdDS0RDQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRj4ubm6Scoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBi4uCiY2Df4l/bHBqXUJBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISkxLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPop+UmZKEioWPmJGWbHB1iYuCloyNj3aPhHFshYGKlpKDhYhyiaGWh5OJj4+WpbWpm42VooOHk4R9f2tqa3yAf4ByYVxiXllmalxra15XS0dPU1FOTUxGSVBDRE5GQkNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+mJaalJ+fnKegqpaTmJ5nZaSafoSSkXmAkoiQkn2KhZiSkYKAgIuNiYWQhoSIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjU1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+ElJKFnKGampmnkZGIlaKamnd6fpSYkqGSl5eBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N8fnpwZ2BbX15hZmNgZ2dcUUVKS1BPSUpMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Kjox7ioaPkI6BgoCJjIqEkoWChoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtL24pa6srKeotKywt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsrauki5aYhaamoKKXgaaZjaKqqKSHhZOkoaCqoaSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWriJqJkoqWent+hH1mX2dbZGFdY2NeZmZeW09DSUhUT0ZITEZKR0VGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCm4OSkI2S2sidlnNWl4iPiJyPfIaMjoqJeoiCh5GOg4WAi4WGh5KGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJTVVVXVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHw6uzxrass8Czub62v7TBtru7pLjGqbbJx7a+ubSoo7StsbGcmpKan4mnr6uklXafpJehq7GzmJaqraiutruyuqyvtaKxrLG1vLe1rrWgp6ijqJupsK2yuri4p5u3qY2ljpGToId5gYJ0WGBjVWVhYGJfYGVfWlVKREVMVVFISkpESUdFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hX6AjXu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeFgY5/gYmOhoCGiIWKh5F6eG5dVkBFTTw2OjQ2QUI3NjUwLzZDSENRW09RVVdVXFdQX1VJS0pBQD9HS0ZFRDs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMm2vMW9s7PAt7jCtb+wuHSytKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbGupq2sp6SYoKyzuqKpsrq1u77Mv8XFvb2zwre6uL+3ure5rK2wprGqrb6wvbvCwqyZuqiUro+YmKuJfoF6aVZhYFdpZGhkVlpjWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWVVad2pwf4+EgY6FbnpyeYhiuKGZo4mVk5aTk5ONkJeSh4d7hoGNlYqAhICJenyLh4Z8ioKBioOVfXd5dWVPXGRHRUw6UWRhW15TRj87SFBEWmRRUVlYWWdaVGBgTVNPRUE/SUpIRUZBQEM9RTZCPkhHS0xTWlRdk6+4tbq5ycC7vcnMu73AvLe1vLu3vrW6ssZgdbOlsZqeq72qpairqqOisrWhq6eelZafmZ+upaenpZ6klKKnsLOnsrK8tsG908nK08bCxczCysPAvr2/vLy3tLC5t7fDusa9w8mwnrmqoqyPpai3iYF+cV5hYVxWYV5nZVJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUFBRUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWhsbHGQjYWQc2xzcnOI1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLf4N/gnh6i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV5vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVlxaW5K5wLm9t8bAu7nKy7q2ura4ubO4tbSutraZZHWonq1wXqKsnJiho5uknqullJ+fkJSOlpiXqJ+ln5+amYOknaykqrCtt7C9udTRz9fPyczSzM/OysfAv8LKvcG9wsDFxMbKv8jPtKS7sLWwm6y5vZp+eGtcX1xZXWFZYmJRW2BTUUtDQkVGRTxART5CSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KRlG5sb3V1iLOsoaGfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYRze4mDhnyJdIKKhpV/c3t4bG11e2hyZWlsaWZqaWhgZmlobVptdJetpLyIh2dbb2hdWllUSEpOUEpLUUxUUUlMQUpHS1BfX2JmaWGYt8ewubO7vrayxMe2sLmxsLuss7Gnqresjbannpunmk+bnYyOoJaRppillYqTk4mQiY+Qkp6boZiblZaHnpmmm6yvqK+ns7TU1NXW0svP09XO08/NxcLK0L/KycvJ0sjNzcLQ0riwxLzEuqa2u8SigW1iW1xdWGBXWWVZUFxXTlFDQkhFQkg7QUQ+QUg/P0I3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmINocW95eYOgqp6ml42bm5eLjZWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfXF4dWxxeH5xe214c2xogHBtY2ltcHlpd31+y7/C36dtY3huY1thYEpQUlVOWV5QXV1OUU5UUVVUXG5ud4Jylq64rLSnsLarrb3Asau1pqW4p6yuoay0o46xrpqYmIyRlJGEjpuBjaaRnImDi4SKiYSLg5SVmJeUm5Gcl5mZnp6rrKSnoaysztLV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbGwM7HyMOpv7jQnXhtZFxhXFZfUl1aTk9TUE5IPkFGQkJFPEBCP0VFPj8/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bXdwfX6AoZ6eoYuNmZOTjIuTj5aEeYWQkI2LioiRh3+Ce3J+gIKHeoV1hZORiX9vdnNsc3x7dnxzgXdxaoBycmlvcXp5cnu+y5p+jLGDdnKEdmhhal1DWlpbVmZkWGVrVFhdXGBjXWN4e3+LgZmqpKShoKGppqqxuaqmtKOiraKjraKnsZ+JppqUkpGKko6IgpOJa5WijZiEgYV+kYODk5asi5WNlZmOhZKQnZensKGgoKSkqMfNz8jCy9DT0dTSztPNxtbTzdTY1tbY1dfVydTazcnX1tHKrcTDy4lxbmJfX1dTWVJbT0pHSUlKQDs6O0VCRDxCRD5IQj9CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN5coKJgZ2VnZSFi5aJj4qIjoePf3eElJmLjYiIi4l+g3hze32Dh3eAe4eRl4GDbndwbXV/dnh9c4V8eWyHdnRvfXaEdXl7nbWMPEGKxqV+jXxpZVZJQ2VjZmNoamRveVtfZmhrbmlugIOJkYudn6CdkJeYn6OjprKkpLOgoqWeoamgorGchp6SkpKQi46LhoOPhH6cm4yNgoSFepR+gqmVo4ySipiSi32XipqRq7OYmpunnKe9w8a4tsbN0tDS0MzSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzLR2dW1jXFlSVVBZVkVGSklFRT06NzpAQUM6R0VARUNBREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc1NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqCh3x4hZaXiI+Dh4aHeoR5cXp7hIZ1eoWOjZ16jHB8b3B6f3J8gXGDh4Bujnp1d318gnV/fIeIsHRYqcK2jJKBcG5iPV5ocnBxcG54d4JlaW9ydXhye4uHjpSSm5agloeMk5ugm5+qn6GtnKKamZ+lnp+smYuajJGSjYV9iIeDhYuOoJmTiIOHfm2ZeYSYhoiTjI6VjIZ7m4iTj66rlJWXnpimrra9qK29xsvIycvLz8nE0srU1tjX2NfU29fT2dvW0Nva0dbI1cyVeHpoZ1pZT1JTXUhCRUlJPkE+PTc6PT87Pkg9QEFBQURBPj46ODdEQjc1NTQ3OS41NjY0MzU1NDIzMjM2NDY1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fISXjoeLfoaHgHeCeW57e4aBdHqSno2hdo91gnR1gX10gIRvgZCBb5KEdHyBhXp2hnuJt8akwsm3gZWbj3hwZU5lY4J6gXeGopCLeXl3e4N/fIR2bZSWlJWPl5CDiY+WmpeXppyYoJefk5KXo52aq5aRkYuNkoOMhYmIgYWQkZ6cmYmFi4GGl3uIiJ+XkImNiouCfKGIkIu8oZiTl5mcqKalrp6ntb7AwLnHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGhXl4ZWhjX1NWVlVNS0RNQzs9PTw5Ojw+OT5BNj4/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU1NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB/gH2Fen6CkYmEhXqFiHt1fXRufH2GfnR/kp2Rn4OSfIZ9eI59eIqKboKagHSYhX6BiYV8fpB6j6mPkMOgu4yco5x9iYR9iXKMin5zppqcmZSFe4+QiYRoR3GhpJ2Mi5CShYiLkZKVj52ak5WRl42MlZ+dlKGUko6OkIt+kI+Oi4SIkpaan5+Ji5SRnZGCi3+mmYiFjoKGhICkhoqLuJidkZSWoaegnZ6do662urWrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3d3dmlpZFZfWlNPTkhETEI9PT45OTs6OTk8PTZAPj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBj4pxcniKe3t/fX98iHp8e4uHgn51g4Z5c3pzbYF+hH13hpugmp6UkoCLh3+Yh4Cckm6HqIV6oIt8kI6DiIScfpqRio2jop+Qo66fi5GLhYuBkoZXcq2Ln6ycj4OYm5CQjlyDopGCjJ+TlYyGiIySk4yUlZSQjI+KiJabnY+VlpGLkpSGgIuJko2Kip2WmaOjhpOdlaCLioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispbzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2Z5ue3NmZVtcV1JWV0NASUQ+Pz46NDk6Ozc6OzozOzs/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDbm13i3h5fnqBfYZ8e3aGhIBzcIWCe3Z2dXSEg4V9fpKmo56lopaJnZCUlouKqJdyirKNg6aRhJmThJmMopagmZOJmp2hkqivn5GUkI6OiJWLbo23hJrEyLKdoqWbnJiWkbKQY6TNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhICPi5mIjZCql5eko4iZnpWbiY+Hl5eLhY+MgX+Gj6SIjZOomZeTlpihmJ+Zk52borK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6BcX5nYl1dXE5JVFlBQkdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdoGOfXxtfoh4en56goKDfnZ2gIJ8bG6Lf3p8eHh8hIeKfoqjs6ejqrOhlqefpaOWla6ig5C4lZKymYyhoYykm6+jpJ2YkKeWp5msr6SXlJaVkIuYmZagwI6jybmrm6OmrZiRm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4aUmIaEkZCcdJGYspaXpaGInJqTkIqRipebiYqWjoZ9jJieiZCQnJqZk5iXn5SgnZWem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LQ1tjT0Ni6cXh1XF9UX1VPSEpOREJDRTU+Ojc3Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p7boWGenyEeIGFgX5weHx+fW9yjXp9gXx4houJhoSSp7usqLK9r6StsrOoo6KwrIqatJ2iuKSVraSXqa23pqSjn5mpl6mjr7CpmZiclJWRl6CYmru7rsqhara4q7CUmZ6jq5OXvaNeqrKCiYqNlIeRfI6OfYOGjpCUlIiHk5aMkJWNi4yXmJKcmbSXlqudi5yUko2RkoyZm4qRnpCLiZWfoY2UjZiZnJKbmJ6UoaCUnJylr6ihpLO4q8LIxLW6vbvFx8fC0aDGyc3NxNfW0cvUoW95Z1tZU15QT0VDPjxDQUI4Pzg3NT9GPDw1PDM1MzU1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo5Nj49NDdUS0NVUUo3PDpJQUVANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEpAi4p/gXOGh32CiHWDioJ/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruzs8C8tK2rs7aLp7Ktrb2qm7ukqK25uKumpqGio6Oor7Kxqp2cpJibl5eeoqalkqS6rqnAvK2tsrmmpKd+iIacrb2wg4yMi5CDj4ORj3qBiJCNjZyIh4+XjYuVl5SRmpedqJqxmpGsnI6aj5KOlZGQlpeOkaCRiZSbo6yUlo+UnJ2ToJ2bmKChlJqep6akoqSws6fBxsOvsLq2xcTCv82mx8THw7zV0c3EyodycmBaWV5aTEpCTEBGRz5BP0I7OjQ+QTw9NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxlR2BpZ1pdXJOMjIh7h4uGg4x1hpGKgW9+e4F/cX6BepV6kpSUmJCTlaezxsm/wszBw7nHvLqvq7m6l7K2urLArqXApKuvu7yqraujo56nqq60sKqboKqboZuVn7C0p4ujurq2wbysqJyzpaSplIWOqcTEpIKLj4eIhIaVlI16g42Rj5GhjIyUko+Il6CYk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+hmKSfmqCboJSYnqWjpqakr66lv8TCrqi3tcnDvrbPssS/xLyz0cnIwrVzd2tbV1tpUUxIRExKS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk5lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoGQeo2hlqiampi6vcfIycHSycrCzbzBs627vqe6v768xLeswamss7u+qrCppKWjq62zrba1oJ+unqWimKOzvambqL3Bo7e3sKuTsa2rrJeHmqmnpZGCjJOllYmBdoqSeoWNkpCen5OPlIuPjZSjmZeclZWjnqmfkaWajI+Pj5WWiHyPlZKSo5qVoKKctaWQnpeko6Klnp2mmJ6Vl5uko6inorKsqLzAw6+lsrfMwLmvxLO7v8K4rcLDwsCYbHhgV1ZaWkpLTUpGRERIQkJBREw6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+JoJOEeIV/lX9/kIiKkICWoZmupqOYwr7Hw8fF083Ozcu7wrewubyzvMu8w8G1truts7+5vK6vqKCop7atramyt5qerKKnoZ2rt7ippLC/xLG+ubOnqrW0rq6XlqWsqKCRjpKxxaeVjn2RlX2IkZmQqpmYk5OPk5WTpZ6TnZmUoaOinJifmIuMj4+eiFqQlpeSlqSZZZijnrKklqGWrKyqp5ueppeYlpiVoKOopZ+2q6m5u8O0pbO1y8C4qrassru4rqi4ur24gmttWVZUVE1FSlNOSz9CSEVESEdHOTVGTTs+Nz1ASi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZGDh6aTiIKHgpyEg5WQkJOOmqKfr76uoca8xcTGxs7OztLKvru2sbq7u77PtsS9uLi3srG1s7izq6acq6u5qqinr6+Xo66kp6SktcCwq6y0v8O6wLqzp7m1uLOvlaWtrq6li5OVoY10wZp+l5mFj5aajLGVm5qVk5OamaWjlaCblpqpnZyhoJmKjI+WnWBKlpyalZqlllSWsJ+unJ+klK+uq6WaoKWUk5iYjpyfpqKZtKmqs7y7u6qwsse/uaasrK2xsaOhsrK0pG9sZVtZTk9LRU9QUFE7SEpIR0lDQz46S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4unlo6Jk4Wfh4Sdl46doZqjpLXItKnGusLDx8rIx8zNxr67s665uMDBzLXHusG4tbqwr6+ztKajm6q0tKmopq2smqStpaSorLq/qKu2t77Bv765s7LEsrm9rKOutay5poicmKabdr+ghZmdjpOZmouvl6GcnJeVm5+hqZ+ooJmaqpmhp56YkI2RnYNudpKimpWdop6QrrKiqpSoqpeqraOjn6WokpKZnIiUnKKel7Gnqau6tr2zsq2+ubego6eopaecnK2pqYxiZF9eUUpMRkhOSVVMPU1ETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5WcoZ+7r5mUn4uTq5uRkpOJq42Hop+Mo62Uo6O2xr20wbrCwsfIxcLNyMG9ubKvubTAwsq1xbHBvLS6qqitrLCio5iqtLulqaasqp2or6ejqqq+vKetvLS4vce8t7W3wbG+wLSptberv6WPo5iRoqC8n4maoJmXnp6Pt5+pnKWjm5yhmqils6GbnqacqKqemZWPlJuLl4mMpaKUnaKeoLSvpaSTr6uZq6udnaSjqJGVlaCDj56em5WppKGhtLS6ta2otbKznpyjpZqXlZmqoZ52XltfXUpIRkdNUUlNRUZHQlJMSkJFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoFkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+ew62bl6WYmamclpqaj6qWlaemla2tmaGrtsTCu763wcLAx8S+zca7vbmyr7izv8LItb+vu7a4tqakqqutoKCaq6rEoqWoq6aeq6+soaiov7emrb6xuLbHtrW5uL+yv8G3tLO0r76jl6OWlJyUrqCRoqKlo6OfkL2kqZ2oq52doJumn72imKOfoqmroZ2XjZWek56Hj4WNk56koZ21rKWblbGnma+nn5qpnqCNmJSeg42gmpuTpaSamKuxtbGqpaqtrJyYoKCSjpCWqJ6UZ2JYYF1OSEdKTktIRURJQT5QSEA8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViV0yimqOcnsWsoZ+snp2uoJOjn5aloKapq5e2saOqs7XExL2/tr/Cu8jCvsrItri1tbCzs7fBxra+sLi0uLWfpqyqq52dnqWkwaWgqq2fpKmsr6Kmp721pbG8ube2w7Kzt7m/ssTAuLius7W1o52llZKUoa6gmaKdqairo5rCramerK2bm56ZpqG9op2lmKurrKahmY2Zn5KfiY9Xf5afpqGguKqmk5i1o5+yoaCbrpaejpiUnYGOn5eVjqKklZCmrrKrqaGipaWVlZ2Yi4+Rk6SeiWBkWWNgS0hKSk5GRUFGSj49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dySEU2PXVlXEtOnp+hmZ7DqKWitKKcsqiTq6SgpJ+tqaydu7CorLWxyMXBwrPCw7zGw7zEyryvsLatsLSvv8S0ubGwubSsmaiwqamanaWhp8Ktm6yxnKmjrbCppKe9tqa3u72vt8Ots7LCwLLHs7q3rLS2rqqippaVlaSsop+fmqirsK+vu7KmoKmomZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqOfp7OmpoyYs5ujrpqem62QnpOWk5l/kaGWj42foZOLpqywpaahnKCekpKak4WLko2cnn9gZVpnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+jn5ygw6ikqrKho7SqlbOsp6KksqyuqbuyrLC0tMbAxMO1wMS9ycS1wMjBtKu1qK+4rL/EtLeurLa5pZmrsauql5+ml627tJuosJutn620sqequbKourO3srnAqrexw720xqe+r623tamorKGXl5KmpaKjmJilr7iusrW2oJ+opJmVlZOkoLejpKaWr7Kyp6umoZ6bmpuWmKifoJiinq+yoqaMl66YpKuXmZ6kkZuNk5aZhJWelIyPnJ6Ui6mpqqGnoJmelYyOmZCBhZWJlJ94Y2hcampNUE1OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko52hpr+mqK+voam0q525sKujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDGwLqptqSsu6zAwre3qayxuqKVrbCtspalp5Gquamgp7CdqqCvtLOqqba2rbuss7O6t6y4sMO6vr+mw6uwt66pq6umnpiZq6KioJGYobGvs6uwuZqcqaCZlpKXpqG3qaWjo7CxtKuyqKufm6Cgm56lnaKXnaOzsJqfj5OlmqCpmpSinpWYiZOXkpWWnJOIkJuZlI6oqKafo5uXm5OHjpmLfYyWhY+bamhsYGxuV1BRWlRBQ0VUQDs7SEE3OlhQZF5QVldEWV5dTUxSTl5LSj5aY15OSFBOW1VZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oauwqqOxuKqltbOsoK21vK6zuLy6vba2wMK/yMS5xMHAwLjEvcC3r7anq7exu76/tKiusbael6utqK2Xp6iOp7ufpK2znquisLCzq6m2tLW9ra+xtaywtLHBusW3q7yvsbisraqjsaaepamgpJeQmaCzqrOqqrOanaebmpWOoKaktK6noq2trrGns62yqqScn6ijnpWhmZuotamXmZGSnpmeoJ6Qq56Xl4WUl4qcmJuTio2Wl5qXpqWioJ2WlZeTgI+UhXuOkoOMlmVscmdvcV5GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2FVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoKSstqStqaWurraqr7W6p6awt8W3sbe+wcK0tLrFvszFucLAub65w7fAubK0q6m6trq5vbSprbC1mJinrKqrm6urjqu9nauusaOroLCts66ttrK5t6qurrKota+zu73Ksqq2tbG0r66nobOgm6itoKWVlpuasqOtoKavl6GkmpqSjqOlp7OpoaayrKq2pa6xta+kmZ2tp5qYn5mZq7eil5OQjpecoZeWk6uem5J/kpeMnZyalpCJlJKemaWioaCYlpGTlXqLj4V7jIqDi5JqbXhtdXtgRWFqWUlIWVo9e0pGRDZBYlRpW01cYEpcXVpSU1JiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lUS0SZl6CxqLGqraakr661qbe0uaSss7fKurS6ur++tLO3w8DMyLzDvLa9v7+3v7yxva2nuri3tsG2qqyxt5SXpq6rp6OwqpSvu6SssbKnqKOxtLCxsLWxuLOprquyp7evtbTDxbaptbassK2pqKO2oKCnsaCklJyalbGep5ygqo6po56blpimpqW4p6KxtKynsqetsLaspJmgrKibnJ2blKm4nJSOjoqYnKKXj5eloJ2UgpGVj5ycmJaUh5aPl5qnnKOgkpaQkJV2hJCHe4WBhIyLbXB3dXt+XEtlbFxLTmNcPmJ7R0k4R2dXZlxNXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLj1FTFE8M3JrSkNDkZmlrqWtrqunpLCys6q3sbegq7W5ybiuwbvCt7KxtcLCzsXAwb20vL+/ur68ssSnqbiwtra/vK6qs7Kcn6exraalr6WdsrWsq7GxramotLqss7K1rLStqqyorKm4rbGwx7+4pbqwqa2tpaitsKakpK+kqZyenJuvmaOjoqORrJ6joKCiqqamuaWstbWkqquorK+2rqOdo6iqm6CampKks5mOiY2HkKKglI2TnJ+TkYSNkpKdmpmVk4eXkpWZp5ufnoySkY6Qd36NhX18fIeJiHBzcX59fVxTZG9eTllmXEZElltHO05tWGJbTF9iTlZXVldUWGdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis6ST8zQklTLD6PazxHSI+cqquiqbGkqaWztLK0tbKyoautvMy6rsC7x7G0rLTCwtHFxr7Asr3Awry/t7vEp6y3rLO4u7+vqrGtoKOnraqopLCjqrGqr6ywr7Cvq7O7p7awsqmyqaumpaOtuqyqscK5tay6qKioraqosaWppKOuqqiin5yjrJWlnpiemaydoqepoqymo62suLGyoKmioKuvsaydn6enqZmjmJmPoKeYhoSOiouen46LjJWbjo2Fho+Un5yVl5SGlpOTl6SbnJyLkpCNiX5+h4V8d36HhYZ0cnGIdWtfWWBuY1FzcVxLO4R8Rj5XdFhgWk5jXE5VVlVXUVxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlFo+TEWVmK2ooaqznKqqsLWtuLWuq6Wqqr3JvLG+t8KvsayzxMPOzsO+v7PAwsO6wLPIw6uut62yuL++sq2tq6SnqrCpp6ixprSuqrCurbGwtK20u6S3squsrqeroKKer7eqqq26tqW2taOqp6ysqq2hqaemsrKkpqahoayWqqGVmqCmnqSiqqWtop+nsbetrqOlopuqq62pnKGlpKSYoJqVj5ick4GCj4iFnJ+Lio2LmI2PioKLl6OakZCai5OSkZOimZuZio6LinyGgIGDenSAhIF9c3aLo4h4al5gbmdXZYdjTj9nk0xFYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIY+SEZEl5KwpaOqsZirqq22q7axq6Wsqqm8wMC4uLO7taWysMTJy9G/wbu4v7/BucG5wMStsbWxs7q/vbKwrq2rqqi2qqaur6q5r6ixsa+yrbaqt7ems7WrrKSpq5yjnrOzqKiktLSgtq2gqqirqaynoKusqbm2qaqqqqKpoKyckqmhnaCko6ajqp6cp7WuqKaqoqOYpaanqpyipKOfmZifkI6PmI1+h4yGhJ6dhoOKiY2Nj4yChZSimY2MmZCRkY+Sn5aYlouKg390hoF/f3l0g396d36Ah52Pb3FnZ3F4XGBziGtPXplWSG14VWRWUmJPTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0pqNk9EO5aOsKGmq66arKWtr7O1r6ulsKqpur68wLGuuK2htq/Jx8jRwL68urzCvbrDwL6/rrGysbW8usGxsbKrs6iktamlrbOyubCjrbaxsLO6q7mvqa21q6qeqayfoqC1raihn6+yorSqnqinqqSqoaKsrai9r6yuraKoqKCsmZCwoZiioKennqibmaqwqaOfraKhk6Kjo6eYmqmlmJeZnY6Kh5SIfY2GhISkloSBgoqGjYyQg4OToJaHkJyQkpCNkZyUl4+KhoV4dIF/fHV4eYB7dHN6aICGo3VpXmVrgXVniIt9U1hwXkp4c1NkU1FeTU1SWWZOTFZZZFhGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQTSRj7KgpKaspKekrKe0srGqpLGoqri+wbyvqLmqpq6wycfJ0cO8v764vr+8ybvAuLCvtLG6u7fAsrO7rLisorSnp6yytrmzp6i8ta62vbC9pqystautnKmvo5+kq6qnnJ6qsqSzqJqqp6qkqZ2jqaepvau0r66dqaSgrpybs6OVpJylpZ+km5qpq6Wem6qhm5KcoaWdmJepqJKYmpOQioKPhX6Pgn+Ino+Ffn2LhpCNj4R/kpqThZOhjJORi5GakZWGiX5/cnt5fXxod3x6dXBwfWiFeISIZGFoY3KFem1meF1eVkJXem1UYVBSWEtLTnF1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0JKN0dTYFUqPTpEWD8qj5SxmZ+gqaWloault7Kypqmxp6y4wb21sKO5rKioscPJyc3Btr2/tbe/uci2w7WzsbWxvbe5vbWtubW+raGzp6qrsLW4tKufvbyps8Czu6Cvs7Wpq56tsKOcpKiqo56cpbCmsKCfq6mooqqbpKigrbunrrCuoKujpK6enq2ml5+boaOcn5yao6qjmpqkpJaXlJ+ilpuXpquLnpGQkYyCioCAj4B7mpWNiHt+i4WOjYuKg5GXkIaUo4mRkYeQmY+TgIh8eWx9dnh4Y3t6cXBxcnhogHRqg2dkaGFuc45tYWlwYHBBXHhsVV5PUVFKSk1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDFCaFkxM1M9ZV9ETDZLV2VPKTsyT1k9I5OZrJmfmKeko5+opLivrqOvsKqruMK6s66fuK+rqLS7yMvIv7fCvq+0vbfEtsOxrrmxs8C0ur23qbm4vauktKipqrCuubGqm7u9pLDAtbWhrra1pqansbOgnqSmp6GlmZ+sqKmeoKqvp6GmmKOooLC4n6OxrqCroayknKanqZqam5+jlZ2dmp6pppeboKiSmZOZnpOZlqGpkJqJjpCGfYd/go59fKGNjIh4gouEiYuLhYeSmY6JlZ6IkJWCi5eMkXyFe3NwfXFzdGB5eGlvcXBvaX5xY3psaWVjYGaGf19ac2tyTEx+aFhaTVBMSkhQUlBJTlxfblNEWFtSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo+L1lYNSiXnaaZnZatoKChpKG3q7Gks7SqqLnFtrOuoLesrq2wtcbIwbe/wbmwtLy3v7u+r6u9r7S/sLzCuKm7urenqLWoqKuwrLOwp5q+t6WtvLawnrC3sKilp6+xm6CkoKSkoZecr6ahnqKnr6KgopOkpKO3sKGmsaqerKOvmJyqpamemJqepZObnZqdpqqanJyllpWXlZ2OlJejqKGQiYuPhHqFfoSKeo6Xio2GeIGGg4iLjYWNk5eMjpaYio+WfoaXi495gHtwcndvb3RfeXdkbGxraWiDbWVyamtlaFxjc39fWmx2aVpIfV1bWE9PSkhIUlVGMjpfXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0FmW0hURFVdaEUuOzFgVCwylqOhl5WcqZ2loaOht6qvoLq5pqy9xbOwr6O1r6yur7TExL2zv7q3sLO5uLq4uq6tv7O0uK+/wbisvbq0pqKzq6ips6uusaOcwbamqba1qp6yu6mmpqiwrJmip5ykppSYobKlmZ6kqamcoqCTpZ+kuaikp62mnqWhqJOfqaGhoJmbnaCSm5yXoKKrm5uZoZWSlZaajZSTo6ekj4iKjoV5hHyFhXycjYmKhniAg4eHh5GFlZKSjJCVlI2OlHuDl46Kd357bHRybGxzYXh1aGhqZ2VvhGdoaGRmaWpfaGJpZlplemNhUnNUW1tTTElHSU9TQCEral5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc4Y04nMp6ko5KOpKacnp6epLWsp6q6t6isw8G3sKyitK2nr6+3wMC9scG3sa6xtra4t7Wsqryzr7KxvcC3rry8saWftqympbSpq66goMOrqaaws6ustLqdqKqqsaaYnaqep6WRmaatopmepKqhm6Kdl6Ccp7alr6quoKGdnaGVoKafoaCZm5qckpqelaaeraOYl56VlI6UmIyPmJqnn5GIiYqIeIV3goKCnIeLgol7foSHhoSQhJWVj4+PkZGRjZJ7g5WNhnN+fWZ4b2tqbGd1c2tjZ2RjdH9hZGVmZWlqY2lwWV5YXWxkYU1oV1pgVklHSEtNUlg/OWBsaUdCVVNcW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssMEEqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQTozQWVIJTWbpKCRjK6gmZiglqW0saKxvrehsca8ubCxo7arq66pub28u63Asq+urbavs7izp6u5sK6utLa7tq+4va2mnrWroKGwpauvn6XDobOlr7Gvt621na2vrK6jmZynqqWflZuopaCZpaOpnZqgnJSbnaywpbmnraKhmpqemZ6jmqWdlp6Ym5SaoZKolaypm5ScnJKMlZmOlJSYqKaNjYqJj3uCdIKBipiFh3yJiISEiYyIkoSUnJKSj5CRlo6Qf4CNjYJvgX9meW1oa2pncXJrXGhjYXJ/YGRnam1sZ2poZmxcbG11cWFUYmhjZVlJRkxNT1hRUFVhZYFUQFZTWVRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUlkQic0k6Kbj46xnZuToZqpsrCfuMC2obTCvL25saa2r6mupbe5t7isu6+tqqu3qrS4raWztbGuqbG2trGytbqoqZ+2qZ6fqqKqrZyqwZmupa+wtrWsrJ6xra+qo5uco6yonJWcp6SdmqmjpZaaoJ2Rm6Orqqm6n6akoJiamp6hj2uilZiccYKWnKSAdpGrqJ6WlqCRiZeZgJeLn494hZOMg21pfneDcGyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R+g49/ZoeAaHVpZldcaXRuTlBqZGZxgmZeZGZubGleXl+JkIWHaE9LRDhFVGdeSkdQUFVVS0dTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTZPa1tOXEtbZmI+RzFQYjwrL42kmYeVsZuck6Cbqq2ro73Fr6m3w7i9vK2ntrCmq6S4tLKzsbmtqqestKawtaOnt7a1qKestrOutK2zoqmftKueoqWcp6iarr2Vp6avs7etraSorqqrpqGenKCop5yXoaamnJynp56Tn6CZkJ6nqqO0r6Oio5yWmJiXo4ihj5Kah6GHlJ6hf6V/p6uek5Ock4mEcniMjoOHoHaIjGmXiGZ9c3igb4iHg36MfH+hoJ+Zf3uInnSIjnabimyHgYNtaGVjemxxYlSGbWNtaZhxWGpwboZXXmlba2pbiHBteXKHaYeEWl5GTj5GXk1GUlZXUVFSV1RnXkxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxVmA3LyiMppeEnaydmZmdn6uqqKq/w6+yur23wL6qpLexqqyms7Wur7O2q6mlsa2ltbOcrLW2tKWnqLOxrbKor5+qobOpn6SjmqKjna+2laSmpra8pqynqaqsp6aioJmgp6SZmaajpJmcpKqXlKKclJOipaagtqSjoKOYlZOYlJyIrpCYlImpi5ejnIWxgKStnpSanpV5gtSof4eUwJvHeXixpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4FslrGrsHhoa1ixrm9labySvG5oem1xj9h+U2pjtrJ/gHGUdZqhqpBXT1dhT1ZORlRbWFFQU4tcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtcNDEhjqaTgaeqn5ednaWtsqmxwr2ytcC1t77Cq6a0ra2pqK+0qq+2s6inprWlp7iunLKxtaqlpKeyrq2xpqqep6SypKGhn5ecoKCwrZWeo5+0uaKpqKGtrqSinpuaoqmgmJuooZ+YnqinkZynm5SdoaaioLCjnp+jlpaSmJKZhbBraoqNqn5nhJaHrWVxnp2VmqaVca6hpH53unxroY92sV9qtFulgGWckWBmgXpmf2p4aqllvnJnpox2sWp8sXh0kpNjbW2nbVuEoEVpZ4eWRXWcYH1me6Ongllfi6tpgJR4emqnN0qvW1dUbGNaS09XX1xXVjtOiE9XVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5KilYKtp6Wfo6SqsbettL2+sLfFsri6wqepsKyvqamxrqSwurCkpK6zo6m5qZ6zs7CjpaCqrbCsr6ann6OisZyjnJiVmJydrqeXm6GftLKhqpuhra2gnpqXoKKqnZmepKGcmqGnpJCdo5qXoJ+rn6WmoJqfoZWVkZaRmoW1m7V4hamZtZl3h7Obt3+TlpeplX5rgaZ6gYWHkpSSd6tnarFbrHuOh5R0iHCOhoB/iJCXeIOCi5eMg6CPhbB2d59xa2psfItOpFhIY2OZfmNopmB5cnVSk4ZeUKltY3F9hoBinS5Rom5bVGtnYExLXGRYXFpCPrB4V1hBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8yLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dXN0o5YVU1MByWn5SIs6amoq6pp7Osqru2wrC8wq24t8GqrK2ur6ausqmhr7yqoae1raOrtaSms7Ono6Kdp6qyqLCnpZ6gn7CXoJqVlpeYn66jmpqkqLSuoamPqaipm56VmKClqZqfnaOfnKCjpaOVm56Ymp2iqpylmpuboqCWk5GTk52D1ZOZuXCwwn7GhnzWlJu7fJqWpZCNm4ykeo2Ho4KlgnqseY+dVa97iX6farlauXeGg32mgpN8mHqqeY2dj3uxbo6EdJC7hW+UT6+nxYpRoHpjYKpic3KHbJeHX1O1tMiGgIl8Y6QzQp12XVFqaGRQQFhmWmRhSkhNbEtaU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSguMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRODIlnKGTmLGoqKWzqqW0qKW8t8GwusCxtbW8s7ansbGjsbOmn6+2qJuouq6ir7Ggs7SwoKSenqepsKm0qaWcnZ6rmJmYl5eWl6KrnpqXqK2wqKOfjqyip5ael5yhpqKYoqGioZqioqebnqCelZmapqCcp5Wbm5+gmJCSlZGdiLJuaLVxq4hwjqZytHNytnuamKSNj5uNon6QoKV+sHaDkdLRdVuufIZ/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdIWebp5mlFLIi1rCXJ95Yl+tYHdzhmKXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPal9saVBVRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6KdkaSvrKSqu62mtKWotru8sru/t7a0u7uzpbW0orKyo6Csr6SYprqupLGwnLS4qaCmnaGqpbKorKqlmp2aqZ+WlZiZk5OjqaCXk6arsKWilpKsn6WSlKGcpaeglZump6Gao5+tmqCenpCWm6KenKWUnJWZop6VmJaSm4Wse3eodqOPi4epb62Kg6iDmZmiipKZi6J+kpiJroV/grNccrNSrn6DgqR/cdd9d4R+j52GmZp3r4aKkZyHd7RhmmWagoGVbJJasFhLmnWYeWZgrV53d4dnmIhqXa93lZ6PeGw1eciusl9CVG9eZ2BFT2tfcG1WVU0vZWNpU1lRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCYtMGtqLKnqrK6uLS4v7q4s7a9taW4tKC1rZ+gqauflae2rKiwsauttKSbqaCgqKK1p6aqo5melaWilJScmZOWo6abk5CnrK+loZWYqZ+ij5GimqmmoZWapqmenaSerJ2gnaCNlJ6bnqCYmJuVl6GglJiRp52GqX19pXmhj5CDqnCtjIKnhpagoYqXl4ijgZCHlKp8gIudeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClGySXKtbWpN/kX9oZ6pkc3uBa5iHcV2sWomgjmtuZU9KQ6FcWk10XWJmTVphX3N0X0pVNUqakllIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZyZmb6smLTCrqutqaa0sLixtb+6urOxt7yqu7WgsaWepaennpOqsamvqrWsqq6hmKGgpqSkuqKjq6GXm5GioJWUn5qUmZ+gkI2MqbCvpp2Xmqemn42SpJioq6iUl6qon5+go62joJ2hjZShmJ+gkpyXnJWdoZWXj6ubj65tcrR0qYx3iqZztHl0s4CSpKOSnIyJpIeOdrhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJql1ytYE2hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdmVG9uLlunT2JTa2VibFpiXGBxfGNTWVA+Pm1vM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs8MDAwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOaWam527opyywK6tq6unt6m4r7XAtbyxr7m4q8G3qquhnKekop2Sq6qntaOyqK6qoZecqKCkq7mdo62clpmPpaOWjZ2hnJmdn5GTlau2r6eZlJusqZeMk6aapa2kkpersqSgnqirsJmhoo+Yopegm5abl6GTnKmclJGrmYfUkpq7dLHEgMOGfdWWnLh4iJGXjJeJjKeHeaO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohwbY2kdL1dd31bYXm8alpWW2l5XmlgZGZibXhvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QDmmmZ6ivKKXscOwramqrLGnuK+2xLG7s667sK7Bsqylo56koZybkKqkqrKktaetpJ+WmqqZpqy5naOumZWhkKagk42co56YnpqQlpKvubCrlZejp6eUkZalnaStnpGgqKugnJ+ppLKeoqSOpqGUoZmcl5akmI+woJKVqp6FkJm1gJGRjbiVeIKTm7V3bmxuc255j4SOiXOewbu8mXqBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF6Aen2JZ4N5bXlii6xwdYV/WFunakRkWlRmX2NdYlBnZnFtdUJNUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs7VlYnPTs8pp2gob+mlrPDtKyqp6yrqbuusMavtbSvuKe1uK2qo6Kmn6CdmZOspK2qprWoqJ+blqCjnqykvqahqpiVnJGim5KPoaiik56XkpiUsrW2rZidpKSii5KSppylq5yWqaWmnZuiqaemo6igkayel6Oel5eYnZ6PsKmUnKeijmp+aZyneIlzfpqOdXplh3u9vsC6bpKDcZSGX3JqWl2aiWFkh46Va2CAlWNtm3ZilGt/mpWUZV5gY3GbiWhyjH2GlGZqfnF0eX18Ylt3dIFoUFxuhH17i2pYbHmCcklKb4VwTXRNRVdcZmFMW1dmY15PWm12anJST0RFTjtISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SVJfSSdTYFY0KVBeTCgzPltPJz8yPqifqKHBo5q0urajrKWup6i1sqzIrLC0rLWjvrGyp6CjqZ2jm5qZrKeupKW1qqWbmJWim6atqb+oqaaWlJuVoJqTmKWpqJGekI+YnLCyv6ybp52noYmTkaqbqaScm6ygo5qbo6esop+qoZmvmpWmn5aUnZ+dl7ClmaKomZyRnpyjpJmno5qcmpuakJaCaG58cXaRl5SRhIm0qY2FmJWOioyYl4eUlYqDkpKQiY2RlJmTmJeaoKGam5SgnY6CeqSFbGl8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vkd312a3B6bWBjW29oTVhYZWpfV1lwem9uZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5TMTBUXjorPThdSyw8LUCyoLOhv6KksbK3oKmls6elsLWqyautsaa1psCotKGepaWcpJaVoKunrKOjt6ygmZaWoJetqqbBn6yklpKcl56Yk5Sin56jp5KRmainssOvmaudq56PlpapnqucnqCtmKGbnaKlr6ahpKeerJiXpp2ZmqGenpywoJ2ip5aYk5mUoKKWo5+XoI6WlIuKjY+WrY97lZuCkoGJqaiFgJiWioSOn4h7hJCGhZmQh4aJlY6bl42QmJ6jlpmSkJ2Nfo1lobOuhYmEdnqPin12eXpvZ3mQgYCJa3WBeYhyaHR/enaDiIJrdGN4Zl9oZGNkZmpYa3txampcUkxQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76tq66ysqCqprKtoqyzsMWwqqyjs6+9pLScoKeioZ2Zl6imqaakprO1npWUnpmZr6auvqCro5GRnpqZlJGVoZyXqZ2FnqmsorPItJ+ppKqWlpiap56pnKCkq5Sen56gqq6ppaKqoaybn6CgmKWenJ6cr6SZn6iTmJedkqWamKmempdmg5J8ZX6Omo9jeI1saGt6kKOra2SZmH5nhYplZWloeo2hjmtnjJeRondraouYop+Yc2xueoSNhXlYZV2FgV5rioqBdltoc3d3kYCHgm54gniAc215hHR3iImPg3tohFhdanNkXXOIaWp8cWxjXVFOV0lkWEBKND5GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS83Wk82KUVZL0RPMVlDOz8uPaWfury5r6uzsKulqK2usKeurrC9samopK2wsaCtl6CknqGamaarnKyjpqips66elaOQoq+mtrmlrqOPjpqhmZOSmqCZmaaWe6Wsoqizw7iloqevn56VnqOfpJykqqiSnqGeoKqvqaqiqZ+nm6afp6CslaGbpbCkmJyrlqGem5OlmJ6rmZ5+voOIcrRyhZ6GrWh4ucS4cZKho3ummJlzqoJ8y8DAu3GLooeDnnyVmIiewL2Clp2djZzBwXuBepGMmsK/fWulsW+MgW/Ken+beJGDjoB2eYF/eXF6f4dweIWMk3lsdZFiZV54ZF9lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmplKOvqbCvraayta+rpqamsaugq5iboqCcm6qnop2roqWppaS0pJ2jk6aurLi0p6+ikpGZnaWSkaChmJygnYemq6Srrb/AsaGqrqqWkp+dopmipKqjk6Chnp2srqmrpaOipaCkpZytqZGkm6iuqpydqpysopaXpZaho5icf86UeXqlgnqVlptfrY9ejqeAoaB8p5WbdKuDgK9eZI2peqeHhZ90l5KIs2OCq4agjY2yaoSudHyWh7hhgq1Zo81uj3V723t/mXF+iJJ1f2V7iHZ2a32Ibn6FkJJ+bICNX3Bqb2ZgX3hkXHFoamNmYFJUUlddSk9DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc3MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKy0uSjAnO1w6TC0hUEBGNC4xrcLAwLW0sLeYnpGkqqmttKumsqytrKSsprCqoKebmqaYnKKwn6CfqKejpqGfsKybnpamrq2xq6isoJSSm5+lk4+epZedqKOerqSrsKi/xrOoqbGulpOcnKKXoKmqn5Whnp2drq+nqqibpqajoKqSrbOWpqOrqp6jp6ahsKGSmqeaoZuUlJGXoHCFjJd1hKiHcbB8nXKsfqGfgaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIoYuRi5x+q3uIko6ggHqtVpzEeo9vksF9gZVtdXCMbWZ2ZYZvYXducm6IipGPg22QjmRuc3VvYGZtZF9uaWluZmNXVFxhWlJSQzhJSUBEPD48QEVEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz5XSi08KD0xKTNWQEYhHEc6QzEuK6/UxseytJ+do46jo6KtrravqbCnqaqorqurp6KjnZmilZ+mq5+ipZ+oqKKfnrCtmJuWqKevrainqZ6XlZqkopKUoa2bnaejrqyjrLWpuc2yraaurJeVm5yimZ+urJ2WoZmen6mxqamomqqoo6Grm6+xoqisrqaZpquqqrGjk5ejpZqUkoWkaqR1iXqpdHqycYKliZiMcIigmoekX2BSq4R/roKbda6Cp4aGn3qYloV7ZoCjiaSYhoGjfal+gJSGrl58qFWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnVojIuXj4FsmZFubXh3d25sZmVkcXBme2ljXFdfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwr6mso6imqqurqaSmoJuln52lp6ajnKyaoquhpJ+vo56bk6qktrCuoKmbnZeVp6SRm6Kon6CmnLCmo6ixrLbIsrWqrKqVkZydopmfpbOdmqGUnJ+mq6uirZmrqKGhqaKzraKqs7Kim6qor6+2o5OWpKeYm5F8qmyehId1q3l8sG6CpIuIn5aVn5WB0re0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlKepkJKbjH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTY46PnZJ7cJaRfW96dHx6bVxmanJxZoFpXmFYY21cXllJTU1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTk9QTUZMSlZGKkwwLz4tNE9UUR0cOzxGMiwkqKTBxrmtqLKurKWinbK5rKqhppuopqqsqaegpqWYqqOfrqudpqCsmp+ppZ2ntZ+il5Ooq7ayrJumnKCVkKatkZibpqKgqqeuoaOnqbC0wrKzqq2olImXnaWboqOvpZehlZmcpaWrmq6crKelnqujt6yhsbmwnZuvp7O0s6WVmKikm6COgp1OeJqBf596hKN8gqSEhqaenJ6ThLh7fHm5gn7MxcK2eJqgkIuffpqWl4p1npeKpJijqH6whZyEnoOsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWPkaOWe32RkIhzenKEfnBbbG53cmqBblpjX2huYmRdS0xRVEFISEZJOjlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMjpQW1QcGzY/SCwtIIyHmamspKu5q6+gm6Gss7Smn6CVpa6urqmmnaammqOnobKuoammsqCZqKSUorWio5WXoam1uaSbo52jk5CisZmdm6akoaKvrZ2kqKK1scOxraqtqpGHkZynnaOknaWXnpiZmaWjqJmtoaykpZevpbytore3rp2etbK5srOnmZ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgotxq4aEtG5yaZmjnJWJn3yYmYaHj3KugqWboo2mi5OdiZSQmm1wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5OlmH2Li5GKd3x4jYFsaHdpeHNuf3RcZGRubWVoYEpaV1g8R0dAVDNARj48Kig2My4wMTMpJjQ6Ozw9P0BDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWSc4yKrr+/u7u1npeopK22oaOZlaOpp66pq5mloZ+loKC1p6Kpp7CjlKujjqSto52QmpqqtLSknaacqZKUl66gn52lo5ynnLWaoKqjtqvCsKmrqaKNhI+coqGmo5aZmpyYm5ilpKaYqqasoaSbrKe+rJW+sK2fo7Czuqy0p5upsqWomHqokH18sHeKgKSliJxtsm+gh618oY+DqJaZgKyJhK6Fn5SooKKWhZ+AmZWAe5J9q4CdmpaKqnidoI+Ik5KAea9do4F8pqdknYB8l3Rrr12la3GFmV1gW4ygbpWRppmCk4uVinl5gpZ/amx+Yn10bn95YGZlcW9oZ2hDWWBbPUpUMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVVFIRklKIygovJKahKnGw7bBtJ+braCuuKWkjpuko6Cvrqmfo56drZieuaCiq6CvqpqtoZCqqaSWiZqQrrCspp+om62YmI+toqGepaGapZytmJ+opraov6+lqaSfjICOm5ugpp6SlJmalJqapKOjmairq6KjnqmovqSXw6yqo6Kss7qsr6ehtLCpq5l2r36QipyFh3y6rYmYZLCMZZWtfaCPg6eWmoGsioSwhaWZpKGikISgW2xqgbNgf617e4KBsWxnbpmXi4ixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqiaiZaPlJV5d42bfWNyfWGDeHOAfGFpZnBtZmVlT1VjW0FUXj1JKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdXWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbapoYuZoJ+ds7KonqKfnbSYoLOoqquesK2erJuVrqmijoibjq+tqKajqJmuk5qPqZqhnqWfmaOjpZmeoqmyqLuvpaienY98i5uWoaCakJGam5GZl6eeoZioraakpKKkqbueoManpamiq7S2ra6noL2ura2WgamSo66Om4CGpJeYj4GAuMO6g46ck4Snl5yCrIqCr4imm5qlqpF+1b3CqmKjv718fqOCg9e6uLWFk5KCnr2+hGqjgW+rhG6cf3qysceDaquwva14d6K+u3SAlY2mm46Zj5WbeICPmXlifHpjjGd4gXtga2VramJQYltTalxAVGFCTSk8OjQvHh8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbS0sb+5sr2zop2upqazpp6MmKW/qrewp6C/pqaxm56xnLmonq2vpaeVlK+sl4yDmpGvpqOsoaWcqqCYi6OSpp6nnJqhqKKZnqCrram5rqikm5eTe4eZkqabk4+RmJiPmJOomZ+Yqaifqaahoqq7nqnFo6Cvo6uztauwqqG8qLCwmnR1qqS3hWWJn29nrI+Kj21vd6SQmZ+Bda+ZlXCQjHGVp6ObmK6kcm1tbWWKd25tgplxgHlpcGlniZWVl3FoaYWGZ3CGZF6JY2pwWV1nfnemYGJxjpJvZmSAjZKOopeWl4+UnXuGjZN0ZYZ3aIxqeH55ZGxjZmxiS2RYSmtZOlBlRVEnSzkrIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJSts6q6ubKzqqmirp+ks6qYkr2xw8i9tamewKuso6Cmq5+6o6StrKymjpatqo+MhZWXrZ+lqqKfpKSgkYylk6eZqJmWo6qglpylpqevuausmpuTknuEl42mmI6RkJiUjZeVp5Sel6iimq+mnaKsuZ+wwaiks6assbKrrqyouaSvuJaKoailtpyJlqGXhqmakJSdk6qzmZujrKGzl6KgnqCinKCkoZWrpoySk4yHkpyclJCZk5iQjpWFgKSal5WNi5OSio+GhH1ni4B0g3Z0h4xxp218lZGUk4GBj4+Pjp2ToJWWlZ+BhpOLcGeOdm+Kd3Z8emlsZGRvY1VgWUBpWkdiYE5ZKkU9KyYiNzQwLh8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5VUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbivrqKwpK2gobaxkI6rxLvEureqoaWdm6adsKijtqedqbSmp5GYrKOLiImPnKeWrKShmqeen5OVo5epmqiZlKehpJCap5mhtbqoq5iakI18gZSMoZSKlJGVkI+Tl6WPnpmon5u1o52mq7eorsKuo7emr6+wraqqtLqir72ZkqajprWikZ2mno2pn42Sn6Osr5qho7GpsJikoZykqp6dnZyXq5ySmaGbk5CWqpmNmJiWkJaekYignZSUhZKMkIyUi4B+ZoyHdYd2eYiDc5xqh5GUlJGKfYyWkpKYkqCRm5WfgoaXhXhxlHJ4iX9xe35qbmRfcGlgW2BZbWJQYGRQWjpHRkU9Mz09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZcXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7CzrK6jqaetoKi1qpGQnKOyuq6rq6GimXqdorCkpbGplpu4pqOUmamcjoaKiZuikK6epJaooKGSl5mcrouqlo+omaiMmKiPnrm2pKWYm42JeYGUjJuTipWRlJCNkZahjJ2eqJ6et6N/g6+1orCvdKS+o7KgeHqgq7O8lXaupJ+KgKp+ZFthdp+OpJ2Dl35uk7Oco6iuq6NlnqCTc3mZlnCAmKiXbH+ip4llnKWbkJeYlouRm5CFnZqQlIKSh46OkomFd2uPh3aHcXyGgYBhaYiLlZOLW3aVkWdoj41xeqOXlmR4mIaAdpdog4mCbnl/a3BlX3Zva2toXGZjYmJvUls+TU5OUkc9QFRCOTEuHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTFRVVVlcX2hmZ1dRSjxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraOnraWSlqq0rrGlmammq5Zzi5yvn6irp5OWuKCgj5yknZF+iIiano2rmqSVp6KejpeSnoV1rpCJppqokZajiJu6tKigmZiLiXV2k46Wk4qTkZCUjI+Sn42an6aZm7KWgIybtZ20jJKPvaehfqeieqOvuIGOjqefhIuFj7Cpr4yJlqKZeYGLrIacnaKoqqiIlYaYd6WbeoebgZemgoF7nLF6ioWfl5mUmJaBkJaWhJmaYnmHkISOj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR8mYOem4WYfpGJgYKXaY2MhGp4e3FwZ2R3bWlsaltlamllclteSFNMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5REs8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxrywoZWlqLSdj4Ocq5unoqCNkL6emY2fmqCQfYWOmZeIq52jlqChko2UiYaAkaiOh6Kco5OWnYafubKnnZqTj4VwdZCKlZCKlI+Pm4uPkZ6Rlp+jlZ2siJ+0ibSarovKiKuuibeFjbCDsa+EqY2nmI2dfKiPcnt3m46mlmiVpHm0i5+ep6mSmcKBf6uImKFxnoCapH2XhZWxgaF8oJOfj5iXgI6Tm4mYkot8hZOGjZWTiYNtc5GFgHtyhoGFfYV0hYKXgY/FZoCph4+iap6Cn5iBmYCKi4OImG+NkoRnd3R7dmdodXBmZ2teYm5sZmxYZkZcUEwyRTQ2TWBjNiY0PERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5saqrppqUn6KkqqKVo6m2oq9/oKacpZ6diZS9mZONoJGdkHmDlpaRh6uZnJuaoYWPjHebnI+gkYiepJuVmJeGoritpZmbjY1/Ym2Qi5OQjY+MjJeLkJGejpOfoJihqH6hp4etnaCWro+fnZ2RhoGgjauwh6SNqpqMmn6jdoCYk2uBq3RNq3iHjZ2Rm6mogqqrfYOhe3qnaZ5/kmtnl4aXtoiefW1gY1iDl3+Me2Rni3OZfXmWbF18l25fU3GFXGBseYNgWWWCfYSBmHGnqmuDo25ypXCfg51nZJ9sWmyIemVZX4J+YVdQb3ZlbXRxampvXmpvbGtoV2hOXVdFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9idmBNRDpNT01UYlxbZmZpaWJiZGFkZGJhYmBiZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKitryrrqKZl5+hpaysn5yttKKnkaCfn6acmY6YtJmQi56MlYt1gZSRjYqmlpaYnp5/k4WGrKSHnJGKmKiXmZqRh6WwpqKVmYiJgGluiIeLjo6Ji42Si5CRoYyTnp+boqV/k4GPo6GUoHeclpCng6GngIaqroWleYt9hJp9onBzk4eWe56MeW2Hm4yZkJupm4+HnXyConN2pmaefnekX5h6fJJzom6Yt7S6dJKHgYC2qGSBxrh7cJW3jHGAm6RjdKyrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN+o16dmbOWb3uXnrN0cluesoJpYm9zdXFob1lrbHJyZVxoXWJLRD1ENVFBWXEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWlhgYHxkSUM4TFdVVmJhWmVma2tiYmVhZGNgYWJgY2NfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mayck6COpbi1rq2gmqKco6OkrJuasayrkpegmKCkmpqUnqubi4iSeIuFcICWjYqPoJCTlJ2XfZGJjqihh5iPipKjk5uajIuoqKSej5aHhH5re4Z+fY+Ng4uQkImPk5+Cl56gnaCfi4l3nJiijKByoouIqYicp5GXqKx/rox9eqCZeqOTeIBzl4iMnH2Wn4abjZmbpoajZKF8iZaQm41snmiajW6amXp/iqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z1iYp/nmiadYeTkpiOf55umZBrpplcqH53u2p9qVqOhF2zZ1xtcXh3a2lbcGl4eGJeZVdiQVBETzdWQlJtNEpaWl9OWkRAMTUxOzs3SD86Q0hVP1hSWV0+RGJdVmBRYWR9aUVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCsnaabm6efna2anbCnq52Xopmhn5mWlqCjmYaJjWmIgHF7l4iLlpaEkpWYj3qKhJajnYmVkIaLnZGcm4mPqKOgmouRioCAaYGGeH+WjHuIjY6HjpWafpSjn6Cik5hyaJ+KoI+McJKMgqmImZ+jqaGofbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo6dm5eIl3KhfIWNr7V9a5qRoXh+mLSjo6uohJh7mnycmX5zqlpdb3uXi3ieYk1/e3uFY3qYQk2fWaJqcnyObYGJhJl1m3mHibGzf3+akqZ0f51tcXyUb5lyaaNdlXZIZWNgc3B8fW5lYGtodntiY2BRXlZcVFZAWUVRZ0RSV1tiWF9JRD1COEBCOklFOExFWEFWUVtWREZhXFpgS2BtfnJFQzxVX2JaZWpWZ2hsbmJmZl5hYVxdXmBoYl9lY3ZsXmVnZmxkZWxoaGtpk52Bsa6ZhFNfoae0urOzqZqii5upnJuokqGro6Cnjp6dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGSlohygImSoJxykZCBiJiUn5qEjqicmpWKi4p8hGyEhXGBoYx4hY2Ih5KYlHyTpKCeo4iuhn21hI+enXumlnqpgpadkIuhnn2naHdtfplzoHNxfJ2FmG+Tgq59o4OmnpqBo3BeqWd1o2NvpWGc05B8epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKovH93g21/v6aqtF6bb35xl2+Bc6JyXaNndKZhaKZtm9OYeoKbbnd5l2ubenaXcmyppWdfZHlwfoRrZ2ZjbXZ3Zl9hUltlUVFiSVdJVF9XU1tlalxlUUVDS0xKS0JKRDhQQFFOV1NYT1JRYGVlaVJkeHl3SUZFY11lWmhqU2loam9jamdgYl9cXV1faGJhaGV7ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmwsrWws6OcmIWYpqCgoo2kqJ+XqImZl5iTmZOSoJeNiIV7cH2EaH2Pg5OagXeRjY6JcH+Gj5KSbJeTfIiQkaOVg46qmpSSioWJeYR2h4BugZ+Gd4CShoiZoZZ5k6KjmqCJs6Gitot6rKekrqVwqYCakIWBnJJ9pICimYaYcp6EoqyuiZeLgIykjZaDrqKUdrW2tcmhdJSKgJ9hnpepbXiWhp+adaGHd6B9kJaKgW9MZqKScJqIc6R7eXRhg4JsfqBscmRgnHJ/dJdpe2mztbTGpnOYfnudapuaq3SCmm1zd5dpmnl0mHFQRXyzXmp1aniHZmpnYnR0cG1VXVNZaFBSaElVTFhSVl1na25WZ1dNSkFKTUpISk5BUUpQZWNpbWV0cnN+eHtudYl7e1RQT21daFtraVJqaGlsZ2xmY2VfXFxcXmliZGhre19dZGdjamZubWVpbGWinImvp4VmP5Sis6uvr7WiopCAl6iioaOLpKadnKWBmpeWjZeQkJuSjYiDeWp5hmWDjH6WoHl1j4iMgWmEhZKDjIWdjXqMipSlkoKXqZeMkYuAiXqAfYt5cJChhnmAlIeJlp+Uf5Slp5yWloRnbnicbKJkfHGld5yYcGengZeMe6V6oJaDl3KfdoCJlJaPuW6QiqJifZmilYhucmmqa3WgbG6mYJtpi5BoloealXWigH2aX4uFjHVviGJooWWef2mbdXBkZoiCbnKiWl9bZKFuXomMb3t/c3JkpW54omRnp2iYcouYbqFvUoiPb6BeZKdUi11TmG1tcmpxgWxwaGt4c2tvUVdWVmZZU21JWE9cSFhpaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxygnt/cnaNgIR2XlFzYWdicGdQamhoa2xuZ2RnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWYpnpldG2Lp66lqrCxpp+LgJaqnJ6kjKGhmqGhgJWYk42aj4uXkI2Ke4ZxgIhoi4t8l5pzdIp9kHtlg4eVioqVmYJ8iIWWpo+BoquQhZCKgYp9gICOc2mPpYR9hZONiJifjYeSqqaeiaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupaKMkoSMg7xufKWvgoaFhpOWnKB9pnpxqJSglmeefm+rYpaKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm5tn56SlWF+q4uqdoB/jaefd599haSVnaBpmod1q2aerYy2c3e+jKSTWYOmjathdXFzb3t0cGJqfm5obFJVWlVgYV1rTV1SXUldbG12YFtxWVtgWmdzZW5vcmNxdGB3e355cnmDc4N+gXt7jIGCgHZieGRjbnNkUmxnaG9scmlmaWFfXlxhamJsbHpvXFxiaWJtaXdtZ2xuYpWmqpyBgJ6klqmqnqinrqOZiYKXqpmdo4mapZyonYSLmo+FnJGFko2LjXSFeoiDb42EfZaTdHSGcpKCbX+LkoeGk499e4GEl6SNf6WljYCNiYSUdYOHkm9siqiAgouTjYicnomMk6qjoJCAdZWXiH6BeZSuo3+Bm3GPhniQjIWAe3KnjHF9fXqXlpuEjnh7fn2IlJWTinaQmZ+hhHt9iWuMhVt5eXJ5cGhufZGJcX90gY+Uk3GFg4FljX9fgYCMd3VzlHVvem9uh22Ehl93aHiOZoGCho6qnH50fZdqiYhvf3V8hHVtbGaMc3h7l3eEW2pYeI9obXdxcG93d29dbIZtaWdWWV9XXGRrZFVhVV5RX3B3eWtqd2Vqamp1fHFxdHNhb3Vic3uBeHV5gnV/gH+AeIuFg317bX9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHB1blpbYmtka2t5bWhsb2GOlbqpp4uhopqmpJmknauioIODl6uRnaCJmqaaqJiCgZuLfpaUh46JiI1ygnyPfX6PhHqXjnRyg3CVhXt9kouGhpCFeH6AhpiijHunoYuFj4+ElYKGjpd3coSphY2SnI+Inp6Hi5qnoKCrg4mOlZp+fomWraiPkqeQeHCekYN7k29+qYVwfZVxam98gZ+Lf5KOjGhtXYOLjJybn49zlYuIcXRrgnZzf1lyboaPgX1+i2ldaWN6hYOIgF9peHubfIOMg3aBhoNpeYuHa2Fxc4N3YHOMgomQp5WGZo2Pg252i4NvhIx4bmRmY3mCepVaXGlmbnZbenl3dG1zcoJmXG2Ka2tiWVldWlhrcVteYFleXWZzfXtzb3Rjamppe3xxend0ZG10aGx8fnV5fHt6eX+Af2+GioR7fXN+eXN/aVRccWlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VubGdzeW5oam1gjIyrsaKQo6Gan56Ynpmpo6F9g5erjJ+Uh5uikKSUf3uXhHySmYiJhoaKcn2Ai3aFi4GElopxb4BymIaEfpKDhIaKgXqAg4qano+CpqCHeI2XiJWLi5yXhYN6rIGQl5mTiZ6dh4ihqp+ioqOMiJObnKOZlqqhp6agkpuIl498eY+OhKh+f5KRkpOcsKWalJ2QjrKTmISmjIyVm6CJkJuCiZGKa3yOdndlgoaQinyJnYSHi4+HiICEg5B3fHp1mqKJh4ufi4aVf36MgYB2cXSGhYB4iIeKkaaRhIaOiIONkIx8hoqHjoB1a4GDe3mZaXJoYHOKcH16dnVvd3SBXF5vh2huX15aW1xTZ3FVY1tbYWxodHt8cm5wY2ppaH97bXh+cWhvcGxmgXtygYB3gH1/hHttgoyGfHp4fH56g3hOZHZqc25we2VrZWJiYFtzZnBmcnFsVV1sdG1peXpwZ2lrZY2InbqflqKhmJWZmJSYpKCde3+Zqo2djYWfnIqelnx4lIJ7jpmJhoOEhm14gYBygId+iJOEbWx+epeGhIOQfoCGhIZ9h4OMmpySh6qegnGKj4WSkYuckX2NeqmDjZKXlY6bloaGm6agopqdhoOSmZmYkJqmn6adnZCXgZKLd32IjoWle3yPkJGGmKmhnJOcj42qjpKAno2Jk5qfg4+Xf4eOgm94hXF0YH6Dj4V0i5eAg46ChoR+hYSUbnl1dZOii42Gm4WFjnSAin19cnN7iYR7eYyOhJOnj4aEj4KDiomJdYSHiIp7bmp9f3ttaGtsZ155fmd8e3ZzdXV6dlxgcH1tdGBiWlxeUWZtU2VaXWFraXZ5fnBrbGNrameAgGtygGxrdG94boR5boaAdoKAfYV2coKNiH57enx/e4KKYGl7a3VoaYNlamNgaVtjdWhvYnVtbFRicXlkcHp6cmVqbW2Lip+4mqGkn5OSlpeLmp+enXp3naWQm4mGpJSLmJl5eY2FfImRg4yCgYJtfH94coCFfYqQfWtofYGXiIGIjnx+hoSHfI+Aj5qakYinnH9wi4qLkoagoYqFjHynkYePkpeTlpJ3jaOgoZ2Wmn+BkJmYk4yaoqGjmpeRm3+OhXmAhI+HoYB+jI2PfJekoKCSmZCPpo2QgZuRiZOYm36Skn6HjoF1dIJwdmB9gI2FcYqVfIeLcYx+goWFjmh4cnmMmZKQgJh+iItygod8fXF6fIyFe3uSjYOWpZOLhpF8hYaHhHWBgoaHeWRxen54eXBsamZefXJofHV1c3xzf2peYHN2cHdkY1leXlJqaFRkWF5hZ2p2eIFxZmtjbGhlf4BqbX5ob3BqfXeFemuLgXKBgX2BdHaCjYZ+fHp/gX1/j2pyg25zaWGIaWxiX3FVdG9tbmB4aG1XanR2YnV6e3Fia296iY2fs5KlpZ2OkJiPhp2gmpx8daOgjZZ/jKKKiJqWeHuGh36DiX6IgoB/cH97dHWChX6JkHhnY32Gl4qCio14fYCMg3mWgJSWlY2Wn5p9b4uBkJOGpZuHjImDpZWEkoqVl5KRdpGdoaGYlJh6f46Ylo6WmpyknpmTlJt6kIaDeIWXjZ5+gYqOjHOXop2gkpiOj6KMjIOXmIOTlpp/mI18iI2BdnF9bXpkgHyKhXCGkn+QgmuHgoF/iYRldW98h5OYjX2UeIyJfICHfXxygHmKh3mFkYqLmKKWgoSMd4iEgoF2eoCIhHRfd3d8c313ZmtkYH5panZzc3R9cHtjY2BzbXVybWFZYF5bbGRSYldfYGhrdXmGcGNqY2xmaHyDa2h0aGxvaH98gXltkIZxgIKCf3R8g4yBf356goN+fJBtdYl0dG1limxqYWN1VoNpcW5geGZsYmp2cGZ5e3lxYHJshoWQna6Ypqiejo2Xh4afk5eYfHepnIqYeZeci4uYkHh7gIt9fIN7gIKAeHN4enN9gIR/iIqAZF59i5WHfoSHdH1+in99mISWk5aMoqCXfnKHe5ORiqaPjI6KkqCRg5GPlJeRioGPmKCakpCSdICNkZOJnJ2eppiYjZWXdI6PimyGmJCZeoeIkIlvl52ZopOUioyfjIaCkpx/k5KVh5mIe4mJgXpxeWp1bHt9i31thZGCk3dvgYN9fouAZHJqfIGXmIV/jnSRiYN5h352eIF+h4F9hI6FjZSkkHmFg3SJh31/cnR/hoJsYHp0eXB7b2FuYmR7YW5vdnJ3d3NzYXZfbmt1bm9dW15dXmpdT11XYmFobXN6iWtfamVqY2h3h21mbGhqbGeAfHp3b5CHc4CDhH10gYaJeoJ9eoGEfX2OcnmLeXhubIdraF9pcmOHaHFvZnZnbWxhemhqfHp4cGF3bYuBmZqqoKSpnYqKkYaKnoqVl312rZiMln2ek5GWk4h3fXuKfHuAdnd/gHB0c3pvhX2BgIl9e2Fcfo+Rhn+DhHN6gIZ6j5GHkZGckqSblIF9gHyNipKkiI2KjZeajYWRmJOVjomJjJOdk5CMjW6EkI6RiJ6ZoaCXlomWkm+KmoVnhpqPlHqJhZCKcJaak6GSkoiLmYyCgJGefZKQk4yZj3uJhId0c3VrcW51e4p0boaQjZFxdIB7gYKIfGVxbXl+mpR9hYl0kYuBdIl5b4F+gYd9hY2KhY2WqI17iH1+i4V3fXBuf4SCYmd3c3RuemJeb2BqdF5wanp4eGxycGV4XW1sc21zWFpeX2FqWk9XWGRjZ3Fxf4dmXWloZmJncY1uZGlnZWlogHp3dW+OhXOAgYJ7dYKIhXiEfHeDhXqAiXd/i3x7cnmDamtfcGh0f2txbm1xZ29sZXtibX95dnFsd3eKf6OYoqihp5uHjIqBj5yGk5x0gKqUkYyGoIyVk5B/dHt2hHd4f3Jze4Vrcm95bYl2gICGbXBbWX6RjYiAgIB2dYB/f6CGj4qRnJegk5d3iX6AjIicnYmPhpKXloSIlJmPlouLjY6NnYqOkIRuiYuPkYqclqCbmJWFmIhrhqSDZ4adipF/i4SLgXeTmJGdkZCIiZWOf36PmHyRjY+NmpJ9in+Cb3Zva21vcHqFaXODjpeJcHeAdIKIgnlmdG92gZqPfImFepWSeneJdHCKfIeNe4uHhImPnKOIfIR3gouAeHhuaX+Bf1xxcnFvb3daXnBgb2peb2l8enBtbWptdmBwb2pxbVlYYWFibVdRU1llZmN1cISCYl1rbWRiZmuSbWBmZl9na4F1cXJwi4B0f4KAeHaAi4B5hX93h4Z2g4V8h4yAe3aKf2pxY3xjhnxvcGx0amhvbHZ3X3F+eXt0dXR/gn+llZqtn6eWhY2Df5eVg4+edYqfk5KFipqMlY2LenJ3dIJwcoVzcXWIbG9tdW2Id4N9f2xtVVGBq5SHgniAdnKCeYKggZGBk5KYm5GaeJF6goySpJqTjoiVmJKDhpaZjJOLiY+PiJ6FkIp9c4uFiI+InJmem5aUgJR/aYadiGiHoYiShJGDiXGDkZeOmo6PjIuPjXd7kpB7joyNkZaNfIh8gGt2am1ra2x6fmF5fY6VgXZ6gXeDjHx5Z3VsdYeWjH+IhnuUkXF6hXB4jXuLjXuJfoONkZ6ehXx9eIKLfXZwaGuAgXdedm9ta3ByVV1uYnFgX21ueXBncGZnc3VocGthd2VdVmVgYHJTUE5bZmVdeHCIfF9caHJiYmVmkWlfaGRbZ3B+b2txc4p9dn2FgHR1f4x5e4WAeIiDc4aFfoyMg3t5lXhmcmqDYId+b29remBpbnR/dF90fXiGeHRyhXx5oZCasZymjoOKf4OaiICLnn6KmZKOhIiXjY6OhHZ0dnOAcG+Fc3Bxg29qaXZtgm59fG11c1JOgt/JktaTfHB0g3WDoIKSd5SQmJuPmHuTcoWQn6GTk5CKkpuThX6WlYiNjYiRjYicgI6BeHqMfoiMiZubnJqVk3mNd2iKkohsiaSFk4iXg4ZjjJGYjpSJlouNiotxe5SJe42IipORinqFe35se2Vyb2preXlbgHmPjYB6fX5/ho56emh0a3SLkIqChoV9loxsfn9vgY1/jYh+hHqDkJaam4t8d3iDj3hybGVwf4JraHRvZ2hzbFNebmRwWV9rcXhma2piZnhzb3BjX3dgYFZrX152UE5MYGZjXXlxinRcW2V2YGFlZY5jYWZhWGlzc25rcXaLfHR5hoF1dn6Lc3+Gf3qJf3KJh4GRioh8fph2ZXNufGWIf29wbIBabG55eXNgdnp7jXZyd4p3eZ+Mm6+boJCChXeIlX99iZyGhJ+QjoWMl4STjoeBdXdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYN1hKGFkW6Vj5SflJuBkXCFi6OXiY6VipCdlYKAlZCFiY+AkoqKl3+He3V/iXiGhI2bmpeZjpB2i3dviIqMfoukhZKJnYWFXouUl4qOiI6LioSJbHuXgn2IhYmRj4Z2hX19a31jeHVpbXhzV4h6kYaEeX5/gIWMfnlmdGqAio+Kg4OAjJeGbIJ2bomRg5GFf4J6gJGWlJmQdHR4h411c3BmdHmBYXNsb2FodWZSYHBna1VebXN5YHJjX2h9cXJtWmJyYWJXblpcd01NTGNmYV52c4ptW1xkeV5gZGaEX2NjXlhqcmtua3J3i31zd4SBeHd8iHGDhH1+iHt0i4iIlYaMfn6Xc2h1cXlsjHtudHCBWHF6dnlxZHd5hoxpdoCJcoCdiJmonKOShH1wjJR4eYudhISgjY58lYx/mYeEe3N3cHNqb4FraWx8dF5geHZ7cHV7Z2BlfOvatcnD3IhzbHOAdomaiI1pl4+OnJSSgYhwhYigjoSLlYqMmJN8jZKIg4mPe5GLhpCCf3Z4g4Ryh4KSm5aTmIaMdod/cYaDioeaooOUjJ6DiWGDlY6GiYWJjIeAh2l9lH99g4SJjo6CcYZ+f3F3Z3ZyaXN3a1qMfZKBhHx/g4CEioJ2YnRsiYKQi4J/f5ORfW6CbHmHkIeThH2BfoGSlJGXiW5yeoyGdWxwanF3f15zaG5canVgUmRxaGZTX292dF9vYF1ognFyaVdnaGNpWG1XW3VMSkxlZl5icnOFaFtcZXleXmRnemFkX1xZa25lbmp0d4p+c3OBfnp2eodzhYN8f4d3doqFj5iBjYJ7k3Zsd3V5eZN1bnh6fVh5hnGAb2d4d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2JmYiJe59/g5l/gXlyc25vZHJ+aWZsd3dbX3h6enFxf2lhZ2F/1baOkKZ4bnF3e3GSkIyHapiNiJuRi4Z7aIeLmYaBkpGGh5eNfI2MgICJjXyQjH6KhXp1e4J6cYWAlJiOkpOBiXWEh3eEgIuUnZ+Glo+ffohhf5OHhIeDiY1/f4JmfZGAfn+CjI+Qf22CfIJ0a212dHN2dWtjjYGOf4R+fIR/hIh/cGBzcYZ8j42CfH+SiXpxg2Z7hIuHjYR8hX6BlY+Rk4RucHmMfnVtbmlqeXxhZ2lpWGt1WlJpcmliUGJyeGxhZV1aaoNtc2JbZ19kbF9uVFpvTkhPZmRcZ25xgGtaW2NyX1xjbHdkZV1cWmxrYm1qc3aGf3Fvf3x8dHiFeIWCfICIdXmJgZKVfIiGdoiBcHh5e4STb217gXdeg390gW1penOUc2dyiH1ykpGEmp+boIaHdnaUf212k5d9h5CDio2ZfIuadn53cW9samF0fGdiaXV6Wl94fHltcX5lY2hoV52PXnFylrzEhHZxlIiQfnKWi4abkoyHcmqIj5aAe5SMgYSbjHyKhnx7iYx/lIh1ioZ2dn2BcXWFgZ2ThZSPg4NygIh1hXyKmZ2Yh5SOnYCIZn2Tgn+Fg4mJcYF9Zn6Le3l+f4eLjn1pgHyDdmZveHhzdnNsao2FioGJf3iBgIWDf2tfcnl7fo2KhnyCj4F+coFpeYSIjIaFeYR9gZiNkIx9bm17iX13dG5nZnt1YltwYlduclNTbnNoYU1mdHhlYF1cWG6Ab3NZZWFeam1gcE9Za1FEU2dgWmtubXxuWltebGNaYm93ZGdcXWBsaWNsaXN2gYNxbn58f3R1g3qDgnyChXZ+iIGWkHiDinSBiHJ5eH6NkG9ve4FxaYF5en5tbHt1lWtqd4R0bJSOhp6YoJmFiG59jHZqeJiOfoGKgpWXiXmOlm96c3BsamRgc3poYGVxelphcn15Z3F6YWVlj7Gyd0piWqTZ0JZye5CKkHd+lIqEmZGMhW5rhZKRenmShoCEmIp8h394eImKhJaAcIyIcXR9eml5hYOkkISTjIN+b3+Dd4R5hpyZlYuTkJSFh3B7koJ9goOIg26Bd2iAhXhyf3+Diod8ZX1+hHVjcHJ/aHhwb3WYjIWCinx2eICEeYFrXHF+c4GIhYl+hol7iXKBbnGFh4+FhXOEeoKZjY2EeG5vfoR/dnpkZ2l7b15YdlpYcGxOV3FzZ2BKbHZ0YF1bW1l0fXJvV2ddZmpwYG9OV2hRP1lmXlpvamd6cVpaWWtlWWNxeV9oXF5lbWhla2lxd3+Hb2x/foB1b4J7gIF/g392gYWIl4pxgo1xe4Z8eXmEk4x1anp/bG9+dX99b3J7e5RvboF/eGaTi4OhmZySgoZnh4NwZ3qViH1+hIGYiYF8jYxpeHJrbGZfYW54bV9ib3hcZGyDemFxdl9lZdTqvooyOj6LjoBxeIWIjo12g5aMfpKNjH9tbIWNjHZ9j3+FgZWIfIJ4bnaHhIOXd2+IhWx1e3RmeYKDpouCj4uDfW6AdXeEeoedkYyRkpOMi4Z+e5KGd3+EjINrf3JogH54bXx8goqEd2J5hIFxZHFofm10cXSBm4uAfoV+c3V9gHOBb1ttf3V4i4OLe4eAfIh4enFsiYSQhItygnqAl4uLf3Rta3eAgHV1XGhndm9YVntSWW9kTFpycmVbSXB4b1xaWllddX50aFliW2dlbmNpTFdmUT1eZVxddWVgdXBaWVRvZFlkcXlaaF5gZ21naWxpcHd9jmxpgoR+eW6AfHyBf4J6dYKBjZOFcICLbnd+gHt7iJKJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjI2Em52WjIGAbI1+a2h+jYx6fn+DlIF+fYqIa3VxZ2hjW2Jncm5gYWtzYWhwiXpic3ReY2SboI9uXDVZr7V0aYCIfJKGdYWWhXOPiol2cGyFg4d1eYl4iXyTh3p+c2d2iX5+mHBxhn5odnltZXmIhKSGgIeNiX5ufnaAgX2MmoiClJGYiYuEiXyPiHB7fYR7aH5saoB7eml6doGHgHJgd4F+cWRyZnWCbXV7hJSRgXyBf253eXx0f21YcIB3dYyChniIdoKJenhzboqBkIGGc399f5OJiHpubWpugoJ1bl1nZHJwUVp6TVpvXE5bcnBkVUtzeGlXWVlaYXGAdGBdXWBmZGhpZk5aaE5AYWRbYHVhXXVtWFdTdGFaZG9yV2pdYWhrZ21saXB3fJJsaYSJfHxwfn57gX+CeneAf4qLg3F7h29xd4R/e4mNj4Nqfnttd3h2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiQeH17gZF/f36Kg3BycWNmXllnX29wYGBncGZqb4l0YXRvW2FkanZ7f76cpqPIuHGFg3KSfHiGk4JzkYyHcnJvg3uDdHWHdIh3k4h5eXFjd4d6gJNpcoR2Z3d1Y2p8goedgX9/jo99cn90hXqAkpGDeZaOlY+Igoh7iIhreHl+dWd6aGx/eXNpenaAg31oYHeHfWpqc2d7gGl2gIuQlH56fX5we3Z7dH5iVnd9cnOKhIJ9g3GHind4cXCEgo1/fnl+fXaOhoN2aXFpbYiCcnBdZ2FxbUpldUtdblVTWXNuYlFPc3hgUlhYXGFvgnNbYVxoZWVja2RRW3BJRGNhWmNwXl14aFVWVXdeW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHh9cnt+eYKBgXx2fYOIhoNwd4NybneDgn2Ji5N/cIB7eHl6gYx0g3h/gYGChHqAdW9+ioubnoh9hXp3hntndIWLkHp+f3uIhYR2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXdvjHV7ho6AepOJf3V0dX53gHBxf22EdJSGeHVrYHqCeYmPZnGEcGd2blttfICQk3+AeZGSfXl7bYh3gZKMhHSWipGOh4WFe3+EbHV2f21ndmVte3Vtand2f398YGJ4hXlodHVifXtndIaOjJV7dIB1cX96fG1/WVZ0f3B1hYd/gXlsiYZ0eWx1gIOEfnt9eXtzi4F8c2d0ZW6LhG1zW2pedGRHbW1MWmFXVlV4bWJQUnR2V1BVWF5hcYRvXGBjbWRkXm9iVF1yR0JmX11maF1be2JRVVx1W1pna2FWal9gbmVma3FocHV4jnRrjo11fnZ4fXeBg4F7c32DiIeDb3F/dHF1f4WBiY2Ke3d/eIN7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN5Xn2FmIx5hoN0hYaEd4l7Ym5tXGJbW2FWanNjYFtnbm9mh3FhcWZXXGNrf3zKzoe5oWptbYpscYRxfISJfnuRhXl5c3l1dXxqbHVjhHWSgndvZl59gnqLiWZygmtqcWNYbXqFm4iBgXOXlHd/fG6JcoKLjIhymI6RiYWLg3t4fXFxcH1maHFibXhxamtxeH18elxkeYB3aXV4ZYJ2Z3SHi42UfHGHam59gXlufF1Ycn9udIGLfIJvb4p/cXZod3+BgIF3fXF7dYd8enJmc2FujIJsclhqXXZbSG1qTVVUXlRVe2thT1R1clBRVFZeYnSFaVxga2pmY1luYVhicEdBaFxgZl5dVntdT1VkcFpbamhdV2hgX3JlamhyZ3Byd4Z4bpWKdH96d354g4d/dXJ/hoWNgnBwe3h3dXqGhYaMhXp8f3SLfn2GhISHf35+fYd/fHh2eXiRk6B/jH2LbXWAeWODhpaFc5GKb4WFgXqDdGNuallfW11dVGdzZWBZZHFyZoFzYmtlV1tgaX94vq57oLdtYnOGaHN7cXmChXt9jH93eHJ2b3t2ZWpuYId1joFzamJef3h5i4RncX5oa2taVm93iaOBhH9xmZNxgHl1g26Bg5KIc5WIjYiEiYV9eHRybmh5YGptYG12amdqa3l3endbZ318eGVyfW2EdGV1hYyFlX9vi2ZqeoN1bXRiXHB9bHV9jHyBZnWHfW5xaHV/eH5/c31se3uBenhxZmxibol+bW5Wal92VUppak9RTmhNWXxoYk5VdWpMUFRVXmZ1g2ZdYHBoZ2FXaV1ba2hKRGpaYWRXWVV5WU5WbWpZXWxlXFllY150ZWxkcWdyb3WBeHCZhXZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYaIiIN4gX11j358hIqOhIKEe36Lg3t3fHd3mp2XeoqChml2fXxsg4SSf3KPgnCFgn6Bf29mbGdXXVtcW1RkcGRfV2JydWl1cGVlYldcXGh/cG9ygHOJZGR4fml0dXNygoR4gIR5d3R1bWt6cWJna2eGdI2DbmZdX31we4l+aW14ZmlkVVdyb42mfIN7dpaQdHxzfXtufHyRhXeZfIiGg4aDfXRwcmxndFxsaF5sdGRnZml6b3tyWWeAdnRncIB3gXVid4WKfJSAbotqbXqBcWZzZWFue2dzeIp8fmJ2g3Zqa3F1e3F6enR9Zn5/f3l3bmRmYm6FfG1qVmlhb1JKaGpPS05wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWVgVmNXYnBdTEtrWGNhVVRVc1ZMWHVkWl9rYVxaY2Vfd2ZtYnBpc25yf3V0moF3f4B3f3+GhHp8dYKEfpeFbnJ0fHp0cYSFj4GAeot1dJB/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx6dYOBi3lvhXN5hH2Bg3VuamhlVl1bWlpTYm5kW1hhc3tpaG1pYGJXX1tqgGlrb4Bna2BoeXhqc3R0boSBen99dXVuemhqeWpfZW5ogXaPhGdlWGJ3aX6He29pcGdmXVVYb2eOqHeBenyQjnl1cH9wc3Z6j4B4lXWGg4CFiHZqcnZnaG5bbGRdbXNfZ2FqeGh7bVptgnJzam+Afnl3YXeEhHePhHKIcW95f3FjcGhccHhkcXSIfHhjc4BwZ2p5dHJseHd2eGSDe394dnBkY2NufHxra1VoYWVTSmtnT0dSa0VheGdhTVNxXEpNVFlla3d7ZV9tcWlkXVZgVm5uV0tTaFdlXlhOVWxUSlx5X1tfa11dW2NlYHpoa2Fvb3Vub3h1eph9d4CBeoCAh4V6eXqDfoGThHF0dH95dnSEiJB9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSsn396iIiDa3KBeXWAf4F0boZufH9ziYBqb21kZFhfWllaVWJqZ1taXnWCaV5tbFxhVlxcbIFlcXR9aWlca3Z1Z3R3cm2Fe319eXVybHloaXhmXWVzaHp3koFjY1RlcGeChXd3Z2lqYFdWWWdjj6dufneAi456cHF9aHpveo18d49yhH1/f4ZuZHVzZGhoXGtiXW9vW2dfbXVkemhddIBvcWtxe311dWF0hYp6h4eAf3dydX91YXBtWnJ0YnFyhXx1ZXKAbGFse29qaXt5dnJmhXZ7enVxZGFlbXN+aWxUaF5cVEtyYlBGVmFHYnZnYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVl2ZVVKXGNXZ1hZSVdlUUhieFpdX2xbXlxhZF5/aWpfbnR4bm9udoOXeXKBgHx/iIuFfXV1hnmHjH1zdXWCeXp6gouOfX6EiWlzloF6ip19foV6gXp/fIaIc3GProx7e4ePfWVxh3lzfHt1cm+FbHt+bI96YnBvYmVdZVZZWVZjZmtgXVxzhWhYcG5aXldaXGx7YnB3dm1iWmxzc2d0dXBshHl+gHl3bm50ZWl0ZVtodWZ2dpF6X11SZmZrg4J0fWJjaVxUWF1iY4+laHh0goWQeG1vemh4bnyFe3WJc4B4fHh/aGV2bWBmYF5qX11za1llXW9vYnplW3d7a25ub3d4c3RkcoOSfoeCiHp2b3J9c2J3ZFtvcWJxcYJ8c2dygGVebnZpZGd5e3Vub4J1dH1zcWJfZm5vfWRpU2dYWFRNd19RSllYSGJ1ZGFJVG1TSkxaV2lscntibGxzY2FZWVthdltTTGNdWGlTV0hZYU5HaXVYXmFtW1tfYmJdhWhnYW54eWxvanaBkHhtgn6AgZKHg4F2dIl0jIZzcXd1gnd8fX6Mj4B+k35wd5WDfJmSeYCAeHl+f3SIg3NwmaJ7en+JlHhkdYh4c3d1bHRvfmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYllU3JuW1pYWGBsdmNpdWppXlltc3Fsc3NzaoV8fn98dm5ubGRpcWNba3JkdHaOc1tXU2VhcoB/coJdYmNeU1pgW2ORnmVycYWEkXRsa3ptb3B7fHxxgXd/c3p6emRldWhdYlpgZ1tedmhXYl1waGF3YFt7dmlpcm53c3J0aHCBlIKGfoR2cmpwfW1md1dca25icXOBenNnb35bYHBxYV9qcX5sbHV+c3F4a3BhXGVsbHphZ1NmVFdRT3VbUU9ZUkhjdGJgRlVqUElQWlVra2t8ZW1vcWFbWlhZbHBXU09mV1doU1RGWlxPSHJ0WF9jbWNYYGBhXYtqY2RteXhrb2l1eYZ7a4N9f4SZfIKEeX2Ibo+GcW93en10goJ8io6Cgpd0d4KThYGfiXWAgIFzf4Jxh4J1b6KXdHuGi4Z7ZXeKbm56bmZ4cHprc3ZyjGtedG5hZ2VrUl1bVWdhbGxaXHCMZE9vbl1WWFVnanRnYnRlZV1ZbnRtcHV1eWuHfH98iHaPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGFXGNfY1RaYFljlZVjbnCDhYpzamh7b2Zzd3N8bHp0dW96fnVeZnJjW15WYWRZYXRlVV9gbWRhcV1dfm9oaXNxc3B0dWpthJKBiHuFcXJmbn1wcm9TW2ZrZnF0gXdzY2x2VWJya1pfb2Z9Zm13fXNzc2ptYFpkamp3XmZUZFRVUFRtV1FWU1BIZHNfYUVYaU5IV1RWbWhkfGlreGtiV1xVW3RkU1JXaFFZZVRTSFpaUE14dlpfZWxpWWJgXl6PbmFmbHl1bm9odnZ/f2yDf32Gl3t/h4GKfmuTiHJndIB7dYCCfIiOf4uTcnyKkYWHn4Z7f4aMc4GGc32Ddm6ljHOBjYt2d216jGBke3BmenN4bG1xdoJnZHtsY2ZnaFNfXlVnX2xvW15ujWhOaW1gVFZTb2dzbGZ4ZGRcWHB0bHF6eHJtiHt/dpx6eWthZWxtXmBvamVxeH5nWlZYYGx4fHtwg19iXmdXWF9XZJuIYmtxgYd9d2treG1cd3Fse2p2c25ve4ByWGpuX1ldVWJjWGRxYlNeYWhiYmxaYH1rZmtzdW5td3ZraIWLfoh6iG1xZXB9bXJtY1lhaWlvdIF0c19pbFNlcWRVYm5iemNxd3t2a3Btal9YYWdodFxlVWFVUk5YZVJPXE9PSGVwXWNGWWlNSV9LWG1kX3hobn5kYFReVF11XFRTYGZOXWFUU0pcWVBZdXVdX2VtaFhjYVtejnFiZ2p3cXNuZ3Z0eoNygYJ5h41+fImHjnpukIp0bHOCdH9/h4SGkYSVj3l+jI+HkZuEgHyMhHKAgXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY2Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2NjY2NjY2NjY2Pj46Ojo2OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2tra6kn6CgoKClXiovLy8wLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0taijpKSkpKpWFRwcHBwXOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fn1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRkI+QkI+Pj4iCg4OCgoKFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5CKkIuLkImPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyMjIyMjIyMjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeIhYmLhoiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhoqGh4eFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+JiI6IhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aHh4WIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Kio6Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs8PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs9Ojc6PDw+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5ODk7Szs5Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBgIGAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09Pj49Ok16Ujo9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEtJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/Pj1ASEdAXnppPT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISktLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VESD87QGN8e3VzeGw5OTw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BxcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE5MPkE8PD0/PkJDPz9BQUFCQEVzYj9rhYSEhIF5bDs5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISEpKSkxKRkZncG9xcXR2dXd7fH19fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkM/TXR6bYCAg4F7g35wQD09Pz49PkNEPzw8PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SG1vcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBOc3WAfnuDg3yEhGhBQUBDQEA/QEA+PTw9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQElyc39+fYSFhYWGXT5DQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTUpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRGZ2gISFhYWHh4mCSkRFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHWXmChYeEgYaJiYxhQEJVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExMYISHiIOBg4eIiXtXbISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTElkh4eFgYOFgIGBg4SGhYSEhYaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSmyHhoJ/g4OBgYODg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT48PD1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaYWBgH6AgoSEhIODhIaJiouMi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0V1hX+AgYODg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2tycnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I5R4GDgIOEhYSEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk7PDg6Ojs6OTk5PD88PUFCRElKTUtKTExXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7PzxWhoOCg4WGhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPz9BPT48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQmCHg4OFhoWFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZFRkZEQEI/PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFARERFZIiDg4WFhoaGiImJiIeGhoaHiYqKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AQEE/QkNISEpghoKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA5ODw7PD06P0A+QEBDRkpKUGiDg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEdFSklESkhHTEpISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QEVJS01Wc4ODhISFhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4teUVFQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSExNUVd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVVJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0ZWTkZPUVFVWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOzpRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hJSEVGSUhJSElqcnZ5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f4CAgICAf39/gIB/f39+flRISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A+QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFlnUlVWWFVUVlRPT01KTEpJSUxNS09NVHB0dnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWVhZV1JRTVBRTU1PU1FRVVJidHN2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH+AgICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWFNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYWlpkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUk1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSVFVaXG1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/gIB/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlQSEZPRkRFRkhHSEJDSEdISkdDQkFEQE9QTVJkc3V2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QEA/Pz5rUUthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNCPz48PUI+Sk1GVW51dXVzdHZ4e3x6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV05IR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZETVJQYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojo2NDg2OTc5OjM2Njc5NjxCPWZ0dXZ3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFJMWFlaVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNRUFNaV1RUTVFTWVNcZVVPU1RRTkxJSEM/QTk5ODg5Nzg4NDc1Nzg1ODhHbnJ1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KT09UU1RcVlJVU1JOTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3eXp7fH1+fX58fX18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KR1BQT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFQUVBRTlFPUE9MSkxMT1BOTlBRUU5RT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FNT09NSU1MSUxLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXh7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PD1BQEI9PkVIR0RGRklHS0pARkFBQEZIRUpPSFFSYVxRUFJOU09PUExMT0xKTUxNT05bVktNUU9ISkhDSUpMTEtGRkZEP0JDPjxCRj9CP0FkcXR3enp7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVFNT05XS0xOS0xNTExMS05OU2RNSkxSSUlJRUFISkxNTktHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNvdXRscHByb29vcnZ2clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUTEpJTVRGSUlKTEpKS0lJTE1PUFJQS0dDTEdDQ0pKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW52c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGSEhHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0ZIS0RISUtNSEpMSEhKTEtNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLQ0ZFR0RFRUZFR0NDQD48PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPkBDQ0NFR0xOSEtOSERIRUlNTk1HSUxHRUZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkNCRUBEQj4/Pjo7Oz07PT9DQT9BQ0ZHSkdKSUxIR0dHRkVDQD1FRUI+QURDQ0VHSElHTVBJRkZHS05PS0ZISkZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSE1SVVRST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzs+PkBCP0BCRUdKRklHSUdGRkZFREJBQUZGQ0JCQkRFREdHSEZMUUxJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVTWGBeXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmtrc01GRkVIQkJBREQ8QUFAQzw4OT0+Oj89P0I/QEBERkhFSEZGR0ZGRUNDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZJSEVDSUlKS01LUFNORFFTUVFSTk9NTlBNTE5TV1ZXWFZYXltdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJGRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0NHSEZIRkVDRkpKR01KTEtISkxGSUhLSEVLS0xNTk9SVE9JU1VUUVRQUU1OUU5NUVdaVlpZVlpeWlhhYGBgX2hlY2BkZWdnamloamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9yc3lNSEhHSURBQ0hFPEBFQ0U9ODo+Pjw8PEFCPT8+QUJGQ0VCQkhDQ0RFRkZHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZXF9fXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJFR0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRUVDSERGREdGSEhGSEhJS0pFSkhIS0hGRkxISEhKSExMTExMSU1LTU5NT0xQUFFVVldPSlZWVVNTUlFMT1JSUVZbW11eW1xeYF9hYGJkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd292SUpMSUxHQkVERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFRUZHRUlFRkVJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOT05PTE9QUlVYVk1OVFZVU1JRUE1OVFNSV1teXl9dXWBgYWFhYGJkZWJjaGJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3BzdnR1dXd2dXV0ZXFza3BxanJ2b3dKTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0hHSEdGSkZDR0pHR0pGSUxISUpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZWFhY2luaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NCSUVCSEpJSEhLRkRLSkdISUlJS0dKSk9LTkxJTEhKTUtaZkpkXEtsUkhPTl9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENEQkVFREZCRkZHQ0RKREVKTExKTE1HR01KSEpKSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxsVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9ccHVncE1Kcnl2a2Jga2VlbXhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz1CRkdCRkNFREVFRENISEdERUtHR0xNTUpNTEZKTkhJS0pJTEpKSktNTU5NTU1LTk1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhwY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9Pz9GR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUtKSktPUE5OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRUNBQjxCQEJGREdGS0dFQ0NIS0hIRkpMTEZOS0xSUkxHTU1ITkpJSE5ISkpJSE5PTk5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTUxJS0tLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYG1oXGpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3c0hIRklERURGQUBBRURER0JISkxHRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpJS0tJSEpHS0tLS0dISkpMTExLSUtMTlRbXFRQVE1QT05PT1ZRT09RT09RSkpOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0lQS0xPS0xXTUlFRUhJSkhJS0hMSkhGSEhKR0dJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHh5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKR0VISFBKTE1KTVNJSEVBSEZKSUtLSUxKSEZFSkhFRkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjYFlfYltgXltUWFhaX15kYmJhY2VpZWtycG9wcG5vd4eGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tFRkhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUFGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJZVlVcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERDS0pNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQUhJQT9ISUdPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUFBdX2FjY2NjYlxkY2JkY2ZYUVVUU1xYW2FfXl9hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0hHR0pGRkZJTEpORUNLSkxOSkxJS0pISUdCSEhRTUtLT01LS0lIR0VEP0VCSEhBQUZFRFRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJgYGJiYGNiYmRkYlhPUVJSW1NcXl1eXl9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHiIeFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lJS05MTElMS0lJR0RIS1FPTUxQTExLS0hJQ0VBRUNIR0JBRkVCVlVFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJcYGBfYmNiXWJiV19fVFBPUFFYUl1cXF1eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNQRFdfSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOT09NTkxOSEtBREFDREZEQ0FERUFMSENMTFBPT0xGTUZHSUpIR0xMTU9RSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUFVUXFlZW15eYWFlZmNoY2ttcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXkxHSFlNSEhKSEdOTFFRSUxKS0tOTlVOT0tLTEdHS1BTU09QT05PTk9IS0VgRURfTERmY0RNW0heXHNtT01WbVlMQ1BfVWxXZ0pdWFZeRExRVUxNVFZRUlRYV1RYVVRcVFBmWmhoZFlUa1RXVlVbXFxgYGFiYmJgZmlnbmxocnp8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USUtHYFRISk9KSU9NUlFLTUtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QUEpLUH9RSXxZWXJzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlaX1ZVV39qdHV1X2F2X1hiXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdJTEZSVkxLT0lLUlhXUU5PT01RVE5PUVBLTE9HTVBTW1pUUVJPUFBQS0haeF1UeGRoWVJUUXZndGxwYm5ma1FyT013bWpycHNycXJwb3CAXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zc3x9b355b39yX2BgYmFaYWBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQT01NSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dQVFBQUFFLR2Z4bGN4cW1aSkxVeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGdvWHZ2anZ1cIBhc2h9aWx4fG9fX19jYlteYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3V6bnx9eXhybk5KU3ROQ0JFUFBJS0tKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV1BVUE9OUkpMcm91dXF1cWRoYVZuTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vZFJncnVubXlwd2x2c3RxbG1cc356a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0tbVkhHRUdSUEpMTUtMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobG1yfGttaGt7dG1ta21PR0pLSEpISFJRTE5QTUxTU1JPU1NXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVNTV1tXWFdaUFNVV1dYUV1YVl1VU09YUldXV1haYFtncl5bXFtdXl9jWl9jY2VmZGNjYlljY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKVFJNUVFQTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTldUUU5VU05QTUxRUEtKUVFLUU1LS09SVFJRUVNTSUhNTk9RUlFRUVRWUlhXXFdTU1BSVVVWVFpRTlNSV1VUWVZUWVVTUlVTVFVYWVdeWl9hXVxbWlxcYGNcXWJjZGdlZGRhWWBhY2FiaWhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLS05PTE1UUU9UUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPWFNQTlVQTVJOS1NQTU5VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1NPU1VXVVRZVVdZVFJSV1VVV1xZWmBdVllfXV5dXF1gYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RQUFNRT1FaWVhXWFpaWFhWXWpkVlhZWldWVFRQS09WVFBPVFBQUU5NUVFPUlhUUlFPTU9TVU5XUlRVVU9OTlFTVVVUVFJUWFZaXVxaVlZRUldYVltbVlBTVlVVVlhUV1dUUlJYVlVaX1peYF5WXl1eYF1cYGBfX1piYmRoaGVkYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUVdSU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVdWW1tXUFNXVVZYVVNYWlRTUVlXVlxeW19fYFVhXGBhXmBiX1xgXWNhY2hpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSTFFUU1laV1VPUk5TWFZUUlRSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVlZcXFZRVFZWWFlSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkaF5cZGBhYGFjZV9iX1laXltcW1lYWVdXWltaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1bYFxgVVxdaWpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZWVVNOVlJTWlJUVVRYXFdYWFNYXFheXVlbXlRVTlZXV15bWFFUVVhYWFRWWFtUU1ZdWV1dYV5jY15ZYFtlYl9kZF5eY2NhXWVmaWVnXl1kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVVdWVFRUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVFRVVFZZV0xSWlZdW1xST1VTWFZWU1BXUlNXU1dVVltdWFtZVVpeV19eWVxaUldSWVhZX1paU1RWWllaVldZXFZUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZWViX2RhX2FgYmJfYF5XWF5aXFxaWVpXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRTWFJYVlNSVFhSU1ZUWFhYXV5YXVtVXl9YX19YXFZSWVVZWlphWFxVV1daWlpYWVpaWFZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVpbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlRcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFpcWlZYVVdbWllbWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdaWlxfXlpfXFZfX1pdXlleVlNZWFlaXWJZXlZXWltbW1pbWVtZWV5fYGBkY2RlZWJkWmFmY2dmZV5hY2BjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1daWFdcW1xgXVZdXVNQVlpXVlpVWVVYV1heYGJhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xTVllQVlZWVlZWU1ZUWF1cX2BgXWFdV2BeW15cW15YVlhYW1tfYFteWFhdXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNhYGVjXWZpZGVoX2ZeY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFkYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWVhdYGRkX1JYWVBYVlhYWFdWV1ZdXl5gYWFfYl5ZYV1dXlldXllYVldbXGBfXV9ZWV5dXl5hXVtaWVxfYl9iZGRlZmdnYlplZ2dpZ2NfY15hZmRaaGljZmljZV5iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWFddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcWFpiZWNhUlxZT1hXWVtaWVdaWWBeYWJiYGFjX1xiXV9dW19eWVlVWF1dX2BfX1taXl5gYmNcW1dbXWBiYmNlZGdmZWdkXGZoaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9dXF5cWF1cXl9hY2JhYV1iW2JkYV9jYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGFUX1pRWVdcXVxbWltbZGFjYmNgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl9dU1xfYGNkZGZlZ2ZlZmVfZmdpaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent8fHx8fHx7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6e319fX18fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0tLhRJisrKyolYpKMjI2Njol+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/wMC/xEkUGxsbGxRdlo+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEg4GCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXp6e3hub29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2AgYGBgYCBd3Jzc3Nzcnl9fX1+fn19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnh7eHt6eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp8fX19fX19fHt7e3t7fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx7fXp7fXt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHx8fH1+fHd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6fHp7fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en18fHx8fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h6enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCCg4GChYWGhYaGh4aGhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4SEgoGBgYKEhYiHh4eGhoiHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCg4SEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKCgYGPiIGBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/f4CBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYKBg4KAhJmRgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgn9+fX2Im5WFhIKEgoF/gIKBgoKBgoSDgYGBgYKDgoKCg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4SFg4GBg4KJiIV+fHx9foGamISEhYSEhIKBgIGCg4KChISDgoKBgYSFhIODg4KCg4SEg4ODg4OFhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+NjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAf3+Ag5eRhn2BfoKJfpKYgoKCgYGCgoGAgoKCgoKCg4OCgoGCg4WDg4ODg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUk5SSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9/f3+Dm56FhIp/gIR/gomCgYOBgYGBgoSDgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGYooeFhImGfn5+gYODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZCdhICAgYF9fX19hYWFhIWCf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDho6CgH+FjIF9fX2Dh4aDgH5/fn5/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4F/gIaGg4B/f4GGgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgH+DhoOCg4KBgIB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIKAgYWEg4GCgYGCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODg4KDhIODgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYSCgoSDg4ODgoKCg4F+fX1+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDhJGSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhYCChIODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4GAgIKDg4ODg4KCf319f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoODg4J9fX5+gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn5/gH99f359foCCg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB+fn9/fn58fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f35+f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf3+Af4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOAgoKBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGBgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f359fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhYSDg4SDhISEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAgICAgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgIGCgYKAgYGBgH+Lk4+Mi42OjYiHh4WFhISDgoKBgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpORjIyNjY6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKMjIuOjYuKhoSFhISEg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYOBhYaFhYaGh4aBhJGOjIuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJioiLiYWIkY6LiImHhYWDgoKDhISDgoKCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiYyQjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+Ni4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH+AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjIqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKFhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAg4F/gIGDgX5+gIB9foB+fX5+gIB/gX5/gH9+f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyJioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmFhoWFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX18fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAhoKEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX5/fn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKEf4OCgoKCgoOBgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Bg4F/gIOCf3+Af4F/gH98e3t6fHt8gYB/gn9/gYCCgoGBf35/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH5+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OBf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fX+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYGEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgYSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgIB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9/f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn5/f31+foCBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGBgH5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4eHt4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn58e3t8fHl3fHl3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/gYF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHt7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGEg4OEgYGDgIKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYB/goGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3x6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX56fHx9fXx6e35+foB/f4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgoKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoKCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fX19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+fn9/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODhoKDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISDhIWFg4eGhoSEhYSFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgH99fX59foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhIOFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3x/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WEhYWFhIKGhoaFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fX+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhoSGhoWFg4WGhYaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFh4aGhYSFhYSFhYaJioeGhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaChISChIODhYODgn2Af3t7fH57fHx9f358fH59gH99foB+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhIOFhYKEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn58fXx/fH5+fH2BgH18fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SDgoOHg4SBgoSEg4GAgIB7e35+fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeGhoiFhoWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4eHiIaGhIaFg4SDg4ODhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4eHh4WDhoWCgYKCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIiHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaHhoaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4iHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYeGh4SGhoaFhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4N/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn1+f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYSFhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3uAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEg4WChYGBgH9/gIB+f4CBfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX2DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn99f4J8f399fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29nX19fX19fX2NfW19fW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjIqguri4uLi4uLi4uLi4ubCKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZSeaejo6Ojo6Ojo6Ojo6WVU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaV3yopKSkpKSkpKSkpKSml1dXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZGGDrKmpqampqampqampq5xiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs/Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzLztLS0tLS0tLS0tLS0tLQzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz8/O0NPQztLU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tXW1tbW1tbW1tbW1tfX1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHP0rmPvtScgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2s1cCUsJyxlri5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIianM6joIuRw5N9fq+w0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZm7moedutTSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5SgvpmQn6DS08CgoNDP0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEm76pr5GhudevoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkKGsoJqtm6nYo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qiboJqmxZii0Z6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Nzk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWan6+enJubrcefodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp5zPpquknsW0pKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI221suSkKfXuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dHUy73V0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQEJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9bXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipKmnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb21ocXhueWppYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDw8HEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMnIyMnHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBx8HKysjGzMrNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVvc2JdYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBwsO/v77Ey8jKy8i7usjHyc3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnZGplYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDubi5u73Bx8HEyMbHycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWlpaXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9wLm+urq0wLi1t7Kuury2x9S5y77Bu7/BvLvEvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmJnamdmaWVpXVZWVFlPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre1t9PAmNS7v7y7w7W6x7i2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2hYWE5LS0tSSUxIQzk9OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8t7u9wcS5t7e2tbm5ubrStIy4w8LCvse3ubitt7W4urS4s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2kr7C4u7K9vrvEtrW4trjAwMW7zaiElcLLycbPwsC4rrW1vL64urK+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG54Y2diW2NRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuro7G5vb6yur68xbixuLi2w7m/w8SfhIu5yszO0czKxLW6wMPIv761v8G/xsa/y8bDv8G8wMPMysfFxsC5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDPDs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMK9zcS9u8S/ubGVio56iJWtl4WMrsbJyMzLzcrGwsTLzsK8ub25ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8trq8xsjbwrW/vLCManFxWGJmeImKjajBxsLHy8jBw8HAycrCwLu6sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7y9utKywcm2tJJ0eWhifmlbWlxwio+pu8G9vsbAucC8vsXEvb25srCuuLe/w8fDxLy9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pW19gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLfQtqbGto5nUm5uT3OLf3deWX6Ssbm3uLfCurO7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXVpUSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+2ybSWsaFnWFWLcFNdeoKHgE1omLW2srK3vrmytbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZxbF5iYFtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u8ayk56FWFNnnGZSV1eSqX5YWqfDubOwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNcZlhcXVJOTUE+SUJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i6t7vPuZiTclJljnxmVGJtpb2GY1N2nru2sbS1srSvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7W5x76gkmRSi5lyenmLcoKSdXB1baLBuLO0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yssC+rJxWXpTElYGYkmZ1dXaAfn2vv7ixrLOvrqyutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrn6aim6OclZCMj4+Qk5CXlZaYn56empiml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqe9ybWkVmSFk35pdGxnY2ZrdXFwkK6zs6qytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6WpsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mao5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01KSEdOUk5KTkc8RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaKftM/ArF14dXh0ZGlZUE9TUldXYHeGqbWur7O1qqasq6KcmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHl5YGJSVWBJSUpLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWenqnNzZlvenZ0Y1NNVEhQSVBNTFVkZ4i1sLCwuKymoZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5UTFNMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpyim56kyrBoamtzYlJTVYV1alNPSkpRVlljp6+trK+nn56ioJeRk5ugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFJVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKZnpuhoayYeG5rYFRMWHqqsKBsUkhFR0xRVo2rqqqppJ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLa9s7O1oqyiqaiyqauop6iamZ6aqqefmaegn5+nqKWkn52qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JXTkpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKSgn4htYFVQUVui3eDDjXBbS0RARGGWsK2pqqWfnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7u3s6mzraqztK+zrqquo52rp7ayrKKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHFra3VycGhXW1FFVEhESU9IPkVBNEZIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5RzYldTVFlts9zGsKusjG1VW4GssKajo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3w8nJwsHGvrq0urq0u7ewtbKqurKuu7e/urqqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9eXFrZGhveGpkWltGS0xFRFNMREJFNzo/OzU0OTk3OD4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm52JX1NRVVluh7XFs5Se2Mqso7CsoJmcm56emZeXl5KMjpeXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS083T0NPTzMrCxcbGysjOv8jRzMfFx8XBvMPBvr++tb6zrb+/wsPHxMfErr64sri8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeHRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOfnJ2bfFNKT1Jng6K2sqWJrcy7sayjnpyfmpiWlJKUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K0tfR19LU1tPTyMzHzM3J0s3O083FyMnKwcbLx8jJxr/Ds7PIxMvKy87Fyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ0dmhjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hpXFORU1Vd5PFyq6co7GpopydnKCkoJ2alJSVlIl8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3RydLV1tnV19PW2M7Syc/RzM7QzNLPv8jHysPMzMzOz8XGx7a/yr/RzcvPxcnIv8PDyM7Mz9DPzcrHzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdm9jYGVyYl1SXElKR0FFSEk+O0E4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWfoax4TUlOXoS329W4raqalJefm5ugoZ+bnJmViXdpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDO09fW09XQz9LT0cnT0cfQ2NfY0djS19nV1szPz8nN0svO0MDGwsfFzs3R0dHIy83AyszF087MzsjEycbGyMzK09PR1c/SzNPBucWxpai1rqeaqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooqOzi1tlbYm318avpp+XlZeZmp2gnJmcnZN9cWVjY19fYV9fYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0NTV1s7S0NjY2NfLyM7Eyc/MyszAyb/Hyc3Oz8vQzc7Lzs7Hy9DQys7KwsnGyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp1b3Bua2FkbnBhV1xaSUZGRE1XRTtAPTMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramjs5t4iqfO1LObm5WTl5uenp6clJaYlYhrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVyr/JwcXMwsjJwszDxcjKys/KzczQzdPLxsjPzMjHy8TGwcXKzM3P0cbQzs3NzM/Fx8C4ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV5cHJrbWdgYHBoWFhoVkxGTElQUEI7Qz47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKigq6OIjZK41KyUjY2YlZCUkpGWlpaQi3xlYWJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL7Ax8zMy87Cy8vIx8zQxMXHu8fDycjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7uto7WSaICIxK6QjY6Xj4aDhISCfoWFf3NgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLLycHCy9DEy8i/ucG7xse+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xby8wMPFzMXFu8DKwsXH0sTAyL/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3ZzdGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sa+5gmJ+j7aPipKXh3qAhYaAdnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDv7zBzcPGvb21wb3Dur3Gu8K6s7zFxMHCtr+1tb2/u8zDvLW6yLq/vsvDwcXCxsnGyMbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztHKysrHzc3O0cjQxtXU1tfNys/FycXHwbnFvausrm9ldo+Ti4iKhXmAhoaAfoR8dHRjW1xdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLOztLq0vbG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bBwry4vcbBw7u1rrK2ur+0xLe7tau4vb2/vbG6tq+2urPFvLeuu7+1t7TFvL7DxcDDxcbIy8XAxsa7x8u/z8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTPzdLPzcXHwcXAvrm4ybaqr6NlaXWMj4aIiXt4foaGd3iCfXRpXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquts62pq6m0rrawsqmupqyyvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLHAtri9r7CnsrO0u7yrrbWmrrWvu7Kwqbmwrbuuu7i7wL+9ucK/x8PFwbzGwcfLuMXHxb/Gw8O6xMbCu8bJzMuzucK8u7OIc3Z2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xMTDw8rBycq+wLzBurK0tcSvqq+bYWx/kYiOj3t4foqGenuEgXduXl1cXV1fYF5fZGNiY2NiYF9dW1taWl1aWlpaXGRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCjpp+qrbW2sb25r7evqa63tLS8uLS8r7e5tbK7wbLArqWpoquxsrOovaqrqKusrbSzpqitoaSvqbKmp6iupai3rLGyt7q6u7K8vb++xL+1wsDHyLe/wMS3xMK/u7/Ewr7EyMzKv77DwMCph3N0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvJtr3DvrnKt8HDwbS2vLaxr7W8rqipl2VviIOIi4B7foB+eHR/fHN3ZV9dXFxeX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaWtvcoWqpayloJyipZSepJuYkqGjqqSin6Wlp6WtoJ2bpKassq+2t6ewq6iqtKq0urG2ta62ubGvurqxtqSgpJ+msaerqLmqpKeoqKeyraCnpp+bpKasnp+npKCgsa2trLK0srSwtby2u8HBsrq+w8GyubnDs8C9v7W4u72+vMLHxMLDvsDEoIN4cGthZl9rb2BUWV5ITmdPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8nLwsa4t8fBzL+4ybe7xbizxLezv8CstryyrKWvtK2gopRseIWGhoF8eXVzb21ramlxaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeWm6GWm6KYlo2eoaOnm5+fo6WiqJ6bopufq7CssbajqaqprKyktLmtt7Css7WusrWusKqfnZ+korKkpqm4raKmpp+orKqZn6CemZ2fpZqao5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7OzubO9tLaxsbW0v7a9wL3Dwbu7vZeDe3NrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vEw8++uce4t763ssG0sbu7rLq6saKeqaunl52QcX+Fhn94cm5wbmtiXmJmZlxdXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZWVmZmhpa3KNp52UlZWbmJuilpaRnKKiqJ2bnaWmoqacoKCamK6ura6yoKWiraunobWxsrKsqK+yp7qzprWgop6bo6Kto6Kptaqio6adpqajlpiel5manaCal52cnJusoauno6Smrauzs6q0sLKqsrm0r6mvsrKzt7Ouqayusriwura5vb+3s7GUhXl1ZV5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLMyMbAxbbBv8fOt8DEvbO5ubK/trG4uq2yta+fmqOqoZKZjXl/g4R/eG9xdHFoZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqKclJSQlZeXoJeZlZignqGclqGiqaSfnqmcmpqrp6+wqpujpLipoJ+uqLaqpqetsKS3sKS3oKKbmZmqpqCarLiwoqGknKKfn5OVoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK2otKuqpq2ysKWqrrKxsK+ur6anp7KusbSvvLS5t66jlIF5dWReYVZZV1NSVEtNXkxPS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri9rp2np6Oqu8C9wLmutLjBzMfFwsO9xbfIzLLBwsGtvLu1u7y1ubmwsLGqnJmhqZWQiYyBgHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmqBlpOVjJKUlJuZnZaWnKCcoJahoKalpKann5yfpqCqr6afoqS3qKGhoqi0oqWopbClsK2rtJ6gnZWVqqGhlK2xsZ+io52emJuTi6GUkZOYmJKXl5iXnaabp6GimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaasr7Sxrry1sa+uoJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxse2xsSzwr/Fq7e3vba9u7u2s62tqJmYn6OLiHOJiH52bmNhZmloZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVJUUlVgYF9gYV9gYWNkaYGUk4mRj5STlJ2UlZekmaCXnKCloa2mpKSjo6KcqqulmZ+lsaqgoJ2lq52nop6trKmprayhoqKVmKObnJCrqbCbn6KfnpeZk4qekY2Sk5aQmJiTnKGinaSgoZWgoaSmm6OrpaKkqqSrrqWtsqmmpaamtKapqK2ztbS5uq+prJ6LcnBvYFtXVlVSR1FPSFpbT1JJVEtTTEVGSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb3EyayxuMK1vMG8tLWrrKaVmZubh39yiIN7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eXl9fYmRtjpCEkYeQkY+Zk5WTnJujnJugqKmrqKynqKWjmKSupJSZpa+pn5uZm6Cerpmbq7OgpaafoqOhlZOblpaSqamtmpyfoaCalJCMmY6MkIySjZaVkJ6hoKOcm6OVm6GjoZehqKOiqKugq6+jrbelo6OirK2qqKuvsreyvbWzq6+YhHNzaFtYWFJVUUVYTFFbWE1UTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62os7auqaevrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7w8ixrLi/t7y+u7S3p6qglpaYlYV5dIB2d25taG1ubXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXVxcXl9gZH6NgYt/jJCKko2XkZeZoqCboKuqpq6sqK+jqJqfrKGVlqSop52XkI+anq6WmKiqmZ+dlKWgnpKQkpGTlaeqpZqZmZ6elY2Mi5OGiI2DkIuRlZGgnqGjl5WflZqhop6Um6Wlp6iooLGwprG8p5+jrLSrrqewtbC5tcCxrbGrkH1xcmJWU1ZOUklGVlBSUUxMV01KTE5SR01KQUNGREM+QDY1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqaisKudqqepsrGltsa0ubqzysW5usHL0Muxtre8vsHDsbCyuK20tLu0tqWknZyXlpKBfnZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKl4mUlJibmZ6pm6CqpqWrnaeZoKWbk4+fo5uXl4WEkpujj5SjnZaWloiim5uTi46KkJqkp5yVlZeckZGHlI6LgYuNf5CKkpKSoJqfopWTmJiVoqaZjJmkpqimoZ+0sqiyt6Gcoresqq2ksrKltby1q6uxo4l4cm1dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2saWno6mloKilpLOqorLDtbWys8bGt7rDyszGs6y5vbS3wK+tqbGepq66sLChm5udlZOGeoJtX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOho5illqKblY2HmJqMc42Dfo2XloaRmZCUjo57mY+cjIKJf4qYn6KekJOYloWNgpR+fnSJjnmQh5OPkJ2amZqRlZCdjqKjjomaoKGjo5uitK+sr6yfmKW4pqaxobGunLC7qqmvqpmCdnJiVU1ST1BNQ1NOTFFNQlBRSElOUk1ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTE3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6a0wbivtLDJxLe5wc7FvrOsusGrrcOtqKKnkp2mt66lopCWl5OPfXd9ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5YcpCDl4aNnJeLlJCfmJ2VlJaUjpaJgJOJXztXb3yLlImAjJGMkIaGc4qFloF5gXqFlJ2Ug5aOkZCDhn2TeHFvhY19iYGRjY+XmpiTio+JnIefmIeIlp6aoaCXp6+praion5ats6Kmrpmsq5intKKpraOTfnJtX1tOU1JWTERUSlBNTEZOT0lFTFFNS09KSU1PRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6OpsKintMG5sLWwx8K3s73Pv7mvrrXCp6rFqaOdmYOUnLGknZqIlJCMh3xzdV1RTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQH+VkZF9iZSNhIqNm42WlYmSiIWVhnmIf2BKUW54ipGEfYSNioV/f25+f5R3dXV3hI2ZcFGNiIqGe354lHZod4aIfoqIlYqNkZKWi4SKiJSEmoyChJKalp6clKSjqKmlpJ6bsKqhpKSRpqqWoamcoqaoiXVsZV5bSFFRUk1JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6KnnZ+ir6GnqKWnqK+tqrW8tri3s8G7tqe5yLi2qKi1tqqyvKaelo5/ipSpl5iNf46EhH13cW5YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJOBkpmLj3uGj4B2f3hzbnVwdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gHZycpJ3Z3WEhISEe5WJiIqMi4B/hIuMf5SDe4GQmJWclZGfnamen6CdoKmln52Yjaekk6Cflp6epIByaGBcXEpWT1JHSlhST0pMTVJKSkpMUEhMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpijoZicn7Spr6mlraywsaq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGOlIGOnI+UgXiIen13cHBpWEtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfXlnd42XmI2PfWh5gXZ4gImPfYSYkoFyh498d3tva36tfXOQi397hpKBfX90ZnZ8hmxvaHN8iYyIgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX2Me3V+jpKPmIqSmpujlpmdmp2eop2WjYqlm4+el46WmI92bm1lYlpXV1RRSlNVVE9QTlBWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ+WoKavrK6rqKmwr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mPhZJ6iY+MjXhyf292cWxua1hLRkdFQUBDRElMTE1RUlBRU1VUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFheZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCTlZaZl56XjIOJn5GLko2GkJZ+bWhtbm5XVVdUUlFZT1JUVFNYVU1OSE5KTU5KQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6lrbCirKqota+urLS/qrvCv6aimZWkl52NhIuUoaGYmJGTi3OOeoCGjYh2cHZtcW1mbGtZTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyakXRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxgHxncXF7bpONj3tzfXxxcG51bYJ+d3l1anmJgoiJg5aTkpCLjZGUlI+XjoB5iJeIhoqGgJCHdmpqbmdkV1FaV1lZW01QVVZZWE5JSEVKSkhGQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfprqvq7KwwrG7w8ealo6UmYuNhXmEkJiUjZCMj4Zxh4J0h42Ie3FzcW9wZnFnX1RGSUM/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgYWBeoSGhnlyoJVzeIBzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBnZmJqbnJtcIN1aW9YdXCOmpJ3bH97fW1xbXCAenN1bmN2g36GgIWQkYqLiZGLkYyLj4N1eIuPgH6DgH6PenFwb2tfWlxdW1lYYF5STltaWFdMSEpFSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoeWkZ6kp56vlaW1qq6xrsGyu8HGlo+MlJCAiH1ugZCSiYOKh4+FdYKEbJWIiXx1eHhtd253ZGleSVBHPkA3NDQ4Ozs8PT5AQkVITExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgYWZhJucYYaqn52Lg5COeneIfomIjXOKl4+Eel1kcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenBzendrbmled4d9h3yIh4+Ai5KXg42FjYd9cYR/hHx1d3t9iXVvcnNlZl9bW11TW2ZeV1FVWFtVR0pKREtHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMeIp/lIySnZ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF/cIF+emh2a1JXTEBFMjExMjY3Njg4Ojw+QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbXyBhod9jmhnaHh+boWHgoVxhIVHa4B3cXl2aG1rX3Z9g4l/iIWMepWem4qLiJF/enWLdnx3bW93fn9zcnFqWl1cW2NjWGZlW1VPUFZZUERMS0ZOSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpeSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1ZLQjYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoKGXlZuapa2Tmruxp7vHw6iKjKGlj5SJgZF7coSen5Gcf3aFhYqPiJBqaG+DgHWNhoSLcYaCd4eAe3aFfW52dWeAlI+GiYiIiIehq6GWiY6Yf3uBiXp6b2dreH54fXFqY11aWl1pXGFmX1lPS05XUlFJUEpETkdDS0RDQURDQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnVwZniDe4CMgIGQj4uamqScoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBi4uCiY2Df4p/bHBqXUJBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPop+UmZKEioWPmJGWbHB1iYuBloyNj3aPhHFshYGKlpKDhYhyiaGWh5OJj4+WpbWpm42VooOHk4R9f2tqa3yAf4ByYVxiXllmalxra15XS0dPU1FOTUxGSVBDRE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+l5aalJ+fnKegqpaTmJ5nZaSafoSSkXmAkoiQkn2KhZiSkYKAgIuNiYWQh4SIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+ElJKGnKGampmnkZGIlaKamnd6fpSXkaGSl5eBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N8fnpwZ2BbX15hZmNgZ2dcUUVKS1BPSUpMRkZNQ0hMRkZDQkdEQDo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Kjox7ioaPkI6Bg4CJi4qEkoWDhoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtL24pa6srKeotKywt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsrauki5aYhaamoKKXgaaZjaKqqKSHhZOjoaCqoKSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWqiJqJkoqVent+hH1mX2dbZGFdY2NeZmZeW09DSUhUT0ZITEZKR0VGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqEdoGUhYiCm4OSkI2S2sidlnNWl4iPiJyPfIaMjoqJeoiCh5GOg4WAi4WGh5KGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJTVVVXVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHw6uzxbass8Czub62v7TBtru7pLjGqbbJx7a+ubSoo7StsbGcmpKan4mnr6qklXafpJehq7GzmJaqraiutbuyuqyvtaKxrLG1vLe1rrWgp6ijqJupsK2yuri4p5u3qY2ljpGToId5gYJ0WGBjVWVhYGJfYGVfWlVKREVMVVFISkpESUdFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hX6AjXu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeFgY5/gYmOhn+GiIWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFdQX1VJS0pBQD9HS0ZFRDs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMm2u8S9s7PAt7jCtb+wuHSytKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbGtpa2sp6SYoKyzuqKpsrq1u77Mv8XFvb2zwre6uL+3ure5rK2wprGqrb6wvbvCwqyZuqiUro+YmKqJfoF7alZhYFdpZGhkVlpjWVZUSUdHTFFHQ0hJQUhEPj9CQktAQExDOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWVVad2pwf4+EgY6FbnpyeYhiuKGZo4mVk5aTk5ONkJeSh4d7hoGNlYqAhICJenyLh4Z8ioKBioOVfXd5dWVPXGRHRUw6UWRhW15TRj47SFBEWmRRUVlYWWdaVGBgTVNPRUE/SUpIRUZBQEM9RTZCPkhHS0xTWlRdk6+4tbq5ycC7vcnMu73Au7e1vLu3vrW6ssZgdbOlsZqeq72qpairqqOisrWhq6eelZaemJ+upaenpZ6klKKnsLOnsrK8tsG908nK08bCxczCysPAvr2/u7y3tLC5t7fDusa9w8mwnrmqoqyPpai3iYF+cV5hYFxWYV5nZVJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFNRUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWhsbHGQjYWQc2xzcnOI1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLf4N/gnh6i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV5vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVlxaW5K5wLm9t8bAu7nKy7q2ura4ubO4tbSutraZZHWonq1wXqKsnJihopuknqullJ+fkJSPlpiXqJ+ln56amYOknaykqrCtt7C9udTQz9fPyczSzM/Oyse/v8LKvcG9wsDFxMXKv8jPtKS7sLWwm6y5vZp+eGtcX1tYXWBZYmJRW2BTUUtDQkVGRTxART5CSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KRlG5sb3V1iLOsoaGfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYRze4mDhnyJdIKKhpV/c3t4bG11e2hyZWlsaWZqaWhgZmlobVptdJetpLyIh2dbb2hdWllUSEpOUEpLUUxUUUlMQUpHS1BfX2JmaWGYt8ewubO7vrayxMe2sLmxsLuss7Gnqresjbannpunmk6bnYyOoJaRppillYqTk4mQiY+Qkp6boZiblJaHnpmmm6yvqK+ns7TU1NTW0cvP09XO08/MxcLK0L/KycvJ0sjNzcLQ0riwxLzEuqa2u8SigW1iW1tdV19XWWVZUFxXTlFDQkhFQkg7QUQ+QUg/P0I3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmINocW95eYOgqp6ml42bm5eLjZWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfXF4dWxxeH5xe214c2xogHBtY2ltcHlpd31+y7/C36dtY3huY1thYEpQUlVOWV5QXV1OUU5UUVVUXG5ud4Jylq64rLSnsLarrb3Asau1pqW4p6yuoay0o46xrpqYmIyRlJGEjpuBjaaRnImDi4SKiYSLg5SVmJeUm5Ccl5mZnp6rrKSnoaysztLV0c3M0tPU0NTRzsjD1NHIztLT09fN0tHF0tbGwM7HyMOpv7jQnXhtZFxhXFVeUV1aTk9TUE5IPkFGQkJFPEBCP0VFPj8/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk+NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bXdwfX6AoZ6eoYuNmZOTjIuTj5aEeYWQkI2LioiRh3+Ce3J+gIKHeoV1hZORiX9vdnNsc3x8dnxzgXdxaoBycmlvcXp5cnu+y5p+jLGDdnKEdmhhal1DWlpbVmZkWGVrVFhdXGBjXWN4e3+LgZmqpKShoKGppqqxuaqmtKOiraKjraKnsZ+JppqUkpGKko6IgpOJa5WijZiEgYV+kYODk5asi5WNlZmOhZKQnZensKGgoKSkqMjNz8fBy9DT0dTTztPNxtbTzdTY1tbY1dfVydTazcnX1tHKrcTDy4lxbmJfX1dSWFJbT0pHSUlKQDs6O0VCRDxCRD5IQj9CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTU7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN5coKJgZ2VnZSFi5aJj4qIjoePf3eElJmLjYiIi4l+g3hze32Dh3eAe4eRl4GDbndwbXV/dnh9c4V8eWyHdnRvfXaEdXl7nbWMPEGKxqV+jXxpZVZJQ2VjZmNoamRveVtfZmhrbmlugIOJkYudn6CdkJeYn6OjprKkpLOgoqWeoamgorGchp6SkpKQi46LhoOPhH6cm4yNgoSFepR+gqmVo4ySipeSi32XipqRq7OYmpunnKe9w8a4tsbN0tDS0MvSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzLR2dW1jXFlSVVBZVUVGSklFRT06NzlAQUM6R0VARUNBREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFZPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqCh3x4hZaXiI+Dh4aHeoR5cXp7hIZ1eoWOjZ16jHB8b3B6f3F8gXGDh4Bujnp1d318gnV/fIeIsHRYqcK2jJKBcG5iPV5ocnBxcG54d4JlaW9ydXhye4uHjpSSm5agloeMk5ugm5+qn6GtnKKamZ+lnp+smYuajJGSjYV9iIeDhYuOoJmTiIOHfm2ZeYSYhoiTjI6UjIV7m4iTj66qlJWXnpimrrW8qK29xsvIycvLz8jE0srU1tjX2NfU29fT2dvWz9va0dbI1cyVeHpoZ1pZT1JTXUhCRUlJPkE+PTc6PT87Pkg9QEFBQURBPj46ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fISXjoeLfoaHgHeCeW57e4aBdHqSno2hdo91gnR1gX10gIRvgZCBb5KEdHyBhXp2hnuJt8akwsm3gZWbj3hwZU5lY4J6gXeGopCLeXl3e4N/fIR2bZSWlJWPl5CDiY+WmpeXppyYoJefk5KXo52Zq5aRkYuNkoOMhYiIgYWQkZ6cmYmFi4GFl3uIiJ+XkImNiouCfKGIkIu8oZiTl5mcqKalrp6ntb7AwLnHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGhXl4ZWhjX1JWVlVNS0RNQzs9PTw5Ojw+OT5BNj4/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB/gH2Fen6CkYmEhXqFiHt1fXRufH2GfnR/kp2Rn4OSfIZ9eI59eYqKboKagHSYhX6BiYV8fpB6j6mPkMOgu4yco5x9iYR9iXKMin5zppqcmZSFe4+QiYRoR3GhpJ2Mi5CShYiLkZOVj52ak5WRl42MlZ+dlKGUko6OkIt+kI+Oi4SIkpaan5+JjJSRnZCCi3+mmYiFjoKGhICkhoqLuJidkZSWoaegnZ6do662urWrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3d3dmlpZFZfWlNPTkhETEI9PT45OTo6OTk8PTZAPj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmAjopxcniKe3t/fX98iHp8e4uHgn51g4Z5c3pzbYF+hH13hpugmp6UkoCLh3+Yh4Cckm6HqIV6oIt8kI6DiIScfpqRio2jop+Qo66fi5GLhYuBkoZXcq2Ln6ycj4OYm4+QjluDopGCjJ+TlYyGiIySk4yUlZSQjI+KiJabnY+VlpGLkpSGgIuJko2Kip2WmaOihpOdlaCLioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispbzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2Z5ue3NmZVtcV1JWV0NASUQ+Pz46NDg6Ozc6OzozOzs/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieGxifpKDbm13i3h5fnqBfYZ8e3aGhIBzcIWCe3Z2dXSEg4V9fpKmo56lopaJnZCUlouKqJdyirKNg6aRhJmThJmMopagmZOJmp2hkqivn5GUkI6OiJWLbo23hJrEyLKdoqWbnJiWkbKQY6TNyJWOhoeJkJKNjZOUioWKioaWmpuPkJSTh5WYhICPi5mIjZCql5eko4iZnpabiY+Hl5eLhY+MgX+Gj6SIjZOomZeTlpihmJ+Zk52borK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6BcX5nYl1dXE5JVFlBQkdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdoGPfXxtfoh4en56goKDfnZ2gIJ8bG6Lf3p8eHh8hIeKfoqjs6ejqrOhlqefpaOWla6hg5C4lZKymYyhoYykm6+jpJ2YkKeWp5msr6SXlJaVkIuYmZagwI6jybmrm6OmrZiRm52ynYWFqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4aUmIaEkZCcdJGYspaXpKGInJqTkIqRipebiYqWjoZ9jJieiZCQnJqZk5iXn5SgnZWem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LQ1tjT0Ni6cXh1XF9UX1VPSEpOREJDRTU+Ojc3Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p7boWGenyEeIGFgX5weHx+fW9yjXp9gXx4houJhoSSp7usqLK9r6StsrOoo6KwrIqatZ2iuKSVraSXqa23pqSjn5mpl6mjr7CpmZiclJWRl6CYmru7rsqhara4q7CUmJ6jq5OXvaNeqrKCiYqNlIeRfI6OfYOGjpCUlIiHk5aMkJWNi4yXmJKcmbSXlqudi5yUko6RkoyZm4qRnpCLiZWfoY2UjZiZnJKbmJ6UoaCUnJylr6ihpLO4q8LIxLW6vbvFx8fC0aDGyc3NxNfW0cvUoW95Z1tZU15QTkVDPjxDQUE4Pzg3NT9GPDw1PDM1MzU1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEpAi4p/gXOGh32CiHWDioJ/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruzs8C8s6yrs7aLp7Ktrb2qm7ukqK25uKumpqGio6Oor7Kxqp2cpJibl5eeoqalkqS6rqnAvK2tsrmmpKh+iIacrb2wgoyMi5CDj4ORj3qBh5CNjZyIh4+XjYuVl5SRmpedqJqxmpGsnI6aj5KOlZCQlpeOkaCRiZSbo6yUlo+UnJ2ToJ2bmKChlJqep6akoqSws6fBxsOvsLq2xcTCv82mx8THw7zV0c3EyodycmBaWV5aTEpCS0BGRz5BP0I7OjQ+QTw9NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxlR2BpZ1pdXJOMjIh7h4uGg4x1hpGKgW9+e4F/cX6BepV6kpSUmJCTlaezxsm/wszBw7nHvLqvq7m6l7K2urLArqXApKuvu7yqraujo56nqq60sKqboKqboZuVn7C0p4ujurq2wbysqJyypaSolIWOqcTEpIKLj4eIhIaVlI16g42Rj5GhjIyUkY6Jl5+Yk5mVmKagrp2MqpyOlo+SkZWVjpCVkY+hlIaXn6CynpSalJ+hmKSfmqCboJSYnqWjpqakr66lv8TCrqi3tcnDvrbPssS/xLyz0cnIwrVzd2tbV1tpUUxIQ0xKS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk5lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHuNf3iHgoGQeo2hlqiampi6vcfIycHSycrCzLzBsq27vqe6v768xLeswamss7u+qrCppKWjq62zrba1oJ+unqWimKOzvambqL3Bo7e3sKuTsayrrJeHmqmnpZGCjJOllYmBdoqReoWNkpCen5OPlIuPjZSjmZeclZWjnqmfkaWajI+Pj5WWiHyPlZKSo5qVoKKctaWQnpeko6Klnp2mmJ6Vl5uko6inorKsqLzAw6+lsrfMwLmvxLO7vsK4rcLDwsCYbHhgV1ZaWkpLTUpGRERIQkJBREw6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+JoJOEeIV/lX9/kIiKkICWoZmupqOYwr7Hw8fF083Ozcu7wbewubyzvMu8w8G1truts7+5vK6vqKCop7atramyt5qerKKnoZ2rt7ippLC/xLG+ubOnqrWzra6XlqWsqKCRjpKxxaeVjn2RlH2IkZmQqpmYk5OPkpWTpZ2TnZmUoaOinJifmIuMj4+eiFqQlpeSlqSZZZijnrKklqGWrKyqp5ueppeYlpiVoKOopZ+2q6m5u8O0pbO1y8C4qrassrq4rqi3ur24gmttWVZUVE1FSlNOSz9BSEVESEdHOTVGTTs+Nz1ASi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZGDh6aTiIKHgpyDg5WQkJOOmqKfr76uoca8xcTGxs7OztLKvru2sbq7u77PtsS9uLi3srG1s7izq6acq6u5qqinr6+Xo66kp6SktcCwq6y0v8O6wLqzp7m1uLOvlqWtrq6li5OVoY10wZp9lpmFj5aajLGVm5qVkpOZmaWjlZ+blpqpnZyhoJmKjI+WnWBKlpyalZqlllSWsJ+unJ+klK+uq6WaoKWUk5iYjpyfpqKZtKmqs7y7u6qwsse/uaasq62xsaOhsbK0pG9sZVtZTk9LRU9QUFE7R0pIR0lDQz46S1U/QTo9RU0wNzU0NDpCMzROV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4unlo6JkoWfh4Sdl46doZqjpLXItKnGusLDx8rIx8zNxr67s665uMDBzLXHusG4tbqwr6+ztKajm6q0tKmppq2smqStpaSorLq/qKu2t77Bv765s7LEsrm9rKOutay5poibmKabdr+fhJmdjpOZmouvl6Gcm5aVm5+hqZ+noJmaqpmhp56YkI2RnYNudpKimpWdop6QrrKiqpSoqpeqraOjn6WokpKZnIiUnKKel7Gnqau6tr2zsq2+ubego6eopaecm6ypqYxiZF9eUUpMRkhOSVVMPU1ETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5WcoZ+6r5mUn4uTq5uRkpOJq42Hop+Mo62Uo6O2xr20wbrCwcbIxcLNyMG9ubKvuLTAwsq1xbHBvLS6qqitrLCio5iqtLulqKarqp2or6ejqqq+vKetvLS4vce8t7W3wbG+wLSptberv6WPopiRoqC8n4maoJmXnp6Pt5+pnKWim5yhmqils6GbnaWcqKqemZWPlJuKlomMpKKUnaKeoLSvpaSTr6uZq6qdnaSjqJGVlZ+Dj56em5WppKGhtLS6ta2otbKznpyipZqXlZiqoZ52XltfXUpIRUZNUUlNRUZHQlJMSkJFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+ew62bl6WYmamclpqaj6qWlaemla2tmaGrtsTCu763wMLAx8S+zca7vbmyr7izv8LItb+vu7a4tqakqqutoKCaq6rEoqSoq6aeq6+soaiov7emrb6xuLbHtrW5uL+yv8G3tLO0r76jl6OWlJyUrqCRoqKlo6OfkL2kqZ2oq52doJumn72imKOeoqmroZ2WjZWek56Hj4SNk56koJ21rKWblbGnma6mnpmpnZ+NmJSeg42gmpuTpaSamKuxtbGqpaqtrJyYoKCSjpCWqJ6UZ2JYYF1OSEdKTktIRURJQT5QSEA8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViVkyimqOcnsWsoZ+snp2uoJOjn5aln6apq5e2saOqs7XExL2/tr/Cu8jCvsrItri1tbCzs7fBxra+sLi0uLWfpqyqq52dnqWkwaSfqa2fpKmsr6Kmp721pbG8ube2w7Kzt7m/ssTAuLius7W1o52llZKUoa6gmaKdqairo5rCramerK2bm56ZpqG9oZ2kmKurrKahmY2an5KeiY5Xf5afpqGguKqmk5i1o5+xoJ+arpaejpiUnYGOn5eVjqKklZCmrrKrqaGipaWVlZ2Yi4+Rk6SeiWBkWWNgS0hKSk5FRUFGSj49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dySEU2PXVlXEtOnp+hmZ7DqKWitKKcsqiTq6Sgo5+tqaydu7CorLWxyMXBwrPCw7zGw7zEyryvsLatsLSvv8S0ubGwubSsmaiwqamanaWhp8Ksm6ywnKmjrbCppKe9tqa3u72vt8Ots7LCwLLHs7q3rLS2rqqippaVlaSsop+fmqirsK+vu7KmoKmomZmYk6KkuKChpJOvr6ylp56SoZ6Uno+QjZWdmqKep7OmpoyYs5ujrpqdm62QnpOVk5l/kaGWj42foZOLpqywpaahnKCekpKak4WLko2cnn9gZVpnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+jn5ygw6ikqrKho7SqlbOsp6KksqyuqbuyrLC0tMbAxMO1v8S9ycS1wMjBtKu1qK+4rL/Ds7eurLa5pZmrsauql5+ml627tJunsJutn620sqequbKourO3srnAqrexw720xqe+r623tamoq6GXl5KmpaKimJilr7iusrW2oJ+opJmVlZOkoLeipKWWr7Gyp6qmoZ6bmpqWl6ifn5ihnq+yoqaMl66YpKqXmZ6kkJqNk5eZhJWelIyPnJ6Ui6mpqqGnoJmelYyOmZCBhZWJlJ94Y2hcampNUE1OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko52hpr+mqK+voam0q525sKujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDGwLqptqSsu6zAwre3qayxuqKVrbCtspalp5GquamgprCdqqCvtLOqqba2rbuss7O6t6y4sMO6vr+mw6uwt66pq6unnpiZq6KioJGYobGvs6uwuZqcqaCZlpKXpqG3qaWjorCxtKuyqKufm6Cgm52lnKGXnaOzsJqfj5Olmp+ompSinZSXiZOXkpWWnJOIkJuZlI6oqKafo5uXm5OHjpmLfYyWhY+bamhsYGxuV1BRWlRBQ0VUQDs7SEE3OlhQZF5QVldEWV5dTUxSTl5LSj5aY15OSFBOW1VZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oauwq6OxuKqltbOsoK21vK6zuLy6vba2wMK/yMS5xMG/v7jEvcC3r7anq7exu76/tKiusbael6utqK2Xp6iOp7ufpKyznquisLCzq6m1tLW9ra+xtaywtLHBusW3q7yvsbisraqjsaaepKmfpJeQmZ+zqrOqqrOanaebmpWOoKaktK6noaytrrGns62xqqScn6ijnpWhmZuotamXmZGSnpmdn52Qqp2Wl4SUl4qcmJuTio2Wl5qXpqWioJ2WlZeTgI+UhXuOkoOMlmVscmdvcV5GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2FVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoKSstqStqaWurraqr7W6p6awt8W3sba+wcK0tLrFvszFucLAub65w7fAubK0q6m6trq5vbSprbC1mJinq6qrm6urjqu9nauusaOroLCts66ttrK5t6qurrKota+zu73Ksqq2tbG0r66nobOgm6itoKWVlZqasqOtoKavl6GkmpqSjqKlp7KpoaayrKq2pa6xta+kmZ2tp5qYn5mZq7eil5OQjpecoZeWk6uempJ/kpeMnZyZlZCJlJKemaWioaCYlpGTlXqLj4V7jIqDi5JqbXhtdXthRWBqWUlIWVo9e0pGRDZBYlRpW01cYEpbXVpSU1JiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lUS0SZl6CxqLGqraakr661qbe0uaSss7fKurS6ur++tLO3w8DMyLzDvLa9v7+3v7yxva2nuri3tsG2qqyxt5SXpq6rp6OwqpSvu6SssbKnqKOxtLCxsLWxuLKprquyp7evtbTDxbaptbassK2pqKO2oKCnsaCklJuZlbGep5ygqo6po56blpimpaW3p6KxtKynsqetsLaspJmgrKibnJ2blKm4nJSOjoqYnKKXj5eln52UgpGVj5ybl5WUh5aPl5qnnKOgkpaQkJV2hJCHe4WBhIyLbXB3dHt+XEtlbFxLTmNcPmJ7R0k4R2dXZlxNXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLj1FTFE8M3JrSkNDkJmlrqWtrqunpLCys6q3sbegq7W5ybiuwLvDt7KxtcLCzsXAwb20vL+/ur68ssSnqbiwtra/vK6qs7KcoKewraalr6WdsrWsq7GxramotLqstLK1rLSsqqyorKm4rbGwx7+4pbqwqa2tpaitsKakpK+jqZyenJuvmaOjoqORrJ6joKCiqqWmuaWstbWkqquorK+2rqOdo6iqm6CampKks5mOiY2HkKKglI2TnJ+TkYSNkpKdmpiUk4eXkpWZp5ufnoySkY6Qdn6NhX18fIeJiHBzcX18fVxTZG5eTllmXEZElltHO05tWGJbTF9iTlZXVldUWGdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis6ST8zQklTLD6PazxHSI+cqquiqbGkqaWztLK0tbKyoautvcy6rsC7x7G0rLTCwtHFxr7Asr3Awry/t7vEp6y3rLO4u7+vqrGtoKOnraqopLCjqrGqr6ywr7Cvq7O7praxsqmyqaumpaOtuqyqscK5tay6qKioraqosaWppKKuqqiin5yjrJWlnpiemaydoqepoqymo62suLGyoKmioKuvsaydn6enqZmjmJmPoKeYhoSOiouen46LjJWbjo2Fho+Un5yVl5SGlpOTl6SbnJyLkpCNiX5+h4V8d36HhYZ0cnGIdWtfWWBuY1FzcVxLO4R8Rj5XdFhgWk5jXE5VVlVXUVxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlFo+TEWVmK2ooaqznKqqsLWtuLWuq6Wqqr3JvLG9t8KvsayzxMPOzsO+v7PAwsO6wLPIw6uut62yuL++sq2tq6SnqbCpp6ixprSuqrCurbGwtK20u6S4s6ysrqeroKKer7eqqq26tqW2taOqp6yrqq2hqKamsbKkpqahoayWqqGVmqCmnqSiqqWtop+nsbetrqOlopuqq62pnKGlpKSYoJqVj5ick4GCj4iFnJ+Lio2LmI2PioKLl6OakZCai5OSkZOimZuZio6LinyGgIGDenSAhIF9c3aLo4d4al5gbmZXZYdjTj9nk0xFYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIY+SEZEl5KwpaOqsZirqq22q7axq6Wsqqm8wMC4uLO7taWysMTJy9G/wbu4v7/BucG5wMStsbWxs7q/vbKwrq2rq6i2qqatr6q5r6ixsa+yrbaqt7emtLerrKSpqpyjnrOzqKiktLSgtq2gqqirqKunoKurqLm2qaqqqqKpoKyckqmhnaCko6ajqp6cp7WuqKaqoqOYpaanqpyipKOfmZifkI6PmI1+h4yGhJ6dhoOKiY2Nj4yChZSimY2MmZCRkY+Sn5aYlouKg390hoF/f3l0g396d36Ah52Pb3FnZ3B4XGBziGtPXplWSG14VWRWUmJPTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg/Qyw+TFRfL0pqNk9EO5aOsKGmq66arKWtr7O1r6ulsKqpur68wLCuuK2htq/Jx8jQwL68urzCvbrDwL6/rrGysbW8usGxsbKrs6iktamlrbOzubCjrbaxsLO6q7mvqa22rKqeqayfoqC1raehn6+yorSqnqinqqOqoaKsrai9r6yuraKoqKCsmZCwoZiioKennqibmaqwqaOfraKhk6Kio6eYmqmlmJeZnY6Kh5SHfY2GhISkloSBgoqGjYyQg4OToJaHkJyQk5CNkZyUl46KhoV4dIF/fHV4eYB6dHN5aH+Go3VpXmVrgXRniIt9U1hwXkp4c1NkU1FeTU1SWWZOTFZZZFhGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6MzhfPWFkP0YxQ1BbWypITTlVQTSRj7KgpKaspKekrKe0srGqpLGoqri+wbyvp7mqpq6wycfI0cO8v764vr+8ybvAuLCvtLG6u7fAsrO7rLisorSnp6yytrmzp6i8ta62vbC9pqystautnKmvo5+kq6qnnJ6qsqSzqJqqp6mjqZ2jqaepvau0r66dqaSgrpybs6OVpJylpZ+km5qpq6Wem6qhm5KboaSdmJepqJKYmpOQioKPhX6Ogn+Ino+Ffn2LhpCNj4R/kpqThZOhjJSSi5GakZWGiX6Acnt5fXxod3x6dHBwfGeEeISIZGFnY3GFem1meF1eVkJXem1UYVBSWEtLTnF1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0FKN0dTYFUqPTpEVz4qj5SxmZ+gqaWloault7Kypqmxp6y4wb21sKO5raioscPJyc3Btr2/tbe/uci2w7WzsbWxvbe5vbWtubW+raGzp6qrsLW4tKufvbyps8Czu6Cvs7Wpq56tsKOcpKiqo56cpLCmsKCfq6mnoqqbpKigrbunrrCuoKujpK6enq2ml5+boaOcn5yao6qjmpqkpJaWlJ+hlpuXpquLnpGQkYuCioB/joB7mpWNiHt+i4WOjYuKg5GXkIaUo4mSkoeQmY+TgIh8eWx9dnh4Y3t7cXBwcndnf3Nqg2dkZ2Btc45tYWlwYHBBXHhsVV5PUVFKSk1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzMmLDokNDFCaFkxM1M9ZV9ETDZLVmRPKTsyT1g9I5OZrJmfmKeko5+opLivrqOvsKqruMK6s62fuK+rqLS6yMvIv7fCvq+0vbfEtsOxrrmxs8C0ur23qbm4vauktKipqrCuubGqm7u9pLDAtbWhrra1pqansbOgnqSmp6GlmZ6sqKmeoKqup6CmmKOon7C4n6OxrqCroayknKanqZqam5+jlZ2dmp6pppeboKiSmJOYnpOZlqGpkJmJjo+GfYd+go59fKGNjIh4gouEiYuLhYeSmY6JlZ6IkZWCi5eMkXyFe3NwfXFzdGB5eGlucHBuaH1xY3psaWVjX2WFf19ac2tyTEx+aFhaTVBMSkhQUlBJTlxfblNEV1pSZ09ITEVGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy02Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo+L1hXNSiXnaaZnZatoKChpKG3q7Gks7SqqLnEtbOun7esrq2wtcbIwLe/wbmwtLy3v7u+r6u9r7S/sLzCuKm7urenqLWoqKuwrLOwp5q+t6WtvLawnrC3sKilp6+xm6CkoKSkoZabr6ahnqKnr6GgopOkpKK3r6GmsaqerKOvmJyqpamemJqepZObnZqdpqqanJyllpWXlJyOk5ejqKGQiIuPhXqEfoSKeo6Xio2GeIGGg4iLjYWNk5eMjpaYio+WfoaXi495gHpwcndvb3RfeXdkbGxraWiCbWVyamtkaFtic39fWmx2aVpIfV1bWE9PSkhIUlVGMjpfXmxQQ1dWWWVNSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0FmW0hUQ1RdaEUuOzFfUywylqOhl5WcqZ2loaOht6qvoLq5pqy9xLOwr6K0r6yur7TExLyzv7q3sLO5uLq4uq6tv7O0uK+/wbisvbq0pqKzq6ips6uusaOcwbamqba1qp6yu6mmpqiwrJmip5ykppSYobKlmZ6kqamcoqCTpZ+kuaikp62mnqWhqJOfqaGhoJmbnaCSm5yXoKKrm5uZoZWSlJaajZOTo6ekj4iKjoV5hHyEhXycjYmKhniAg4eHh5GFlZKSjJCVlI2OlHuDl46Kd357bHRybGxzYXh1aGdpZ2VuhGdoaGRmaGpfZ2JpZlplemNhUnNUW1tTTElHSU9TQCEral5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc4Yk4nMp6ko5KOpKacnp6epLWsp6q6t6isw8C3sKyitK2nr6+3wMC9scG3sa6xtra4t7Wsqryzr7KxvcC3rru7saWftqympbSpq66goMOrqaaws6ustLqdqKqqsaaYnaqep6SRmaatopmdpKqhm6Kdl6Ccp7alr6quoKGdnaGVoKafoaCZm5qckpqelaaeraOYl56VlI2Ul4yPmJqnn5GIioqHeIV3goKCnIeLgol7foSHhoSQhJWVj4+PkZGRjZJ7g5WNhnN+fWZ4b2tqbGd1c2tiZ2RjdH9iZGVmZWlqY2hwWV5YXWxkYU1oV1pgVklHSEtNUlg/OWBsaUdCVVNcW0hIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGRHJTWbpKCRjK6gmZiglqW0saKxvrehsca7ubCxorarq66puL28u63Asq+urbavs7izp6u5sK6utLa7tq+4vaymnrWroKGwpauvn6XDobOlr7Gvt621na2vrK6jmZynqqWflZuopZ+ZpKOpnJqfnJSbnaywpbmnraKhmpqemZ6jmqWdlp6Ym5SaoZKolaypm5ScnJKMlZmOlJSYqKaNjYqJjnuCdIKBipiFh3yJiISEiYyIkoSUnJKSj5CRlo6Qf4CNjYJvgX9meW1oa2pncXJrXGhkYnJ/YGRnam1sZ2poZmxcbG11cWFUYmhjZVlJRkxNT1hRUFVhZYFUQFZTWVRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUlkQic0k6Kbj46xnZuToZqpsq+fuMC2oLTBu725saW2r6mupbe5t7isu6+tqqu3qrS4raWztbGuqbG2trGytbqnqZ+2qZ6fqqKqrZyqwZmupa+wtrWsrJ6xra+qo5uco6yonJWcp6SdmqmjpZWaoJ2Rm6Orqqm6n6akoJiamp6hj2uilZiccYKWnKSAdpGrqJ6WlqCRiZeZgJeLn494hZOMg21pfneDcGyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R+g49/ZoeAaHVpZldcaXRuTlBqZGZxgmZeZGZubGleXV+JkIWHaE9LRDhFVGdeSkdQUFVVS0dTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTZPa1tOXEtbZmI+RzFPYjwrL42kmYeVsZuck6Cbqq2ro73Fr6m3wri9va2ntrCmq6S3tLKzsbmtqqestKawtaOnt7a1qKestrOutK2zoqmftKueoqWcp6iarr2Vp6avs7etraSorqqrpqGenKCop5yXoaamnJunp52SnqCZkJ6nqqO0r6Oio5yWmJiXo4ihj5Kah6GHlJ6hf6V/p6uek5Ock4iEcniMjoOHoHaIjGmXiGZ9c3igb4iHg36MfH+hoJ+Zf3uInnSIjnabimyHgYNtaGVjemxxYlSGbWNtaZhxWGpwboZXXmlba2pbiHBteXKHaYeEWl5GTj5GXk1GUlZXUVFSV1RnXkxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxVmA3LyiMppeEnaydmZmdn6uqqKq/w6+yuby3wL+qpLexqqyms7Wur7O2q6mlsa2ltbOcrLW2tKWnqLOxrbKor56qobOpn6SjmqKjna+2laSmpra8pqynqaqsp6aioJmgp6SZmaajpJmcpKmWk6KclJOipaagtqSjoKOYlZOYlJyIrpCYlImpi5ejnIWxgKStnpSanpV5gtSof4eUwJvHeXixpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsHhoa1ixrm9labySvG5oem1xj9h+U2pjtrJ+gHGUdZqhqpBXT1dhT1ZORlRbWFFQU4tcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtcNDEhjqWTgaeqn5ednaWtsqmxwr2ytb+1t77Cq6a0ra2pqK+0qq+2s6inprWlp7iunLKxtaqlpKeyrq2xpqqep6SypKGhn5ecoKCwrZWeo5+0uaKpqKGtrqSinpuaoqmgmJuooZ+YnqenkZynm5SdoaaioLCjnp+jlpaSmJKZhbBraoqNqn5nhJaHrWVxnp2VmqaVca6hpH53unxroY92sV9qtFulgGWckWBmgXpmf2p4aqllvnJnpox2sWp8sXh0kpNjbW2nbVuEoEVpZ4eWRXWcYH1me6Ongllfi6tpgJR4emqnN0qvW1dUbGNaS09XX1xXVjtOiE9XVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5KhlYKsp6Wfo6SqsbettL2+sLfFsri6wqeosKyvqamxrqSwuq+kpK6zo6m5qZ6zs7CjpaCqrbCsr6aon6OisZyjnJiVmJydrqeXm6GftLKhqpuhra2gnpqXoKKqnZmepKGcmqGnpJCdo5qXoJ+rn6WmoJqfoZWVkZaRmoW1m7V4hamZtZl3h7Obt3+TlpeplX5rgaZ6gYWHkpSSd6tnarFbrHuOh5R0iHCOhoB/iJCXeIOCi5eMg6CPhbB2d59xa2psfItOpFhIY2OZfmNopmB5cnVSk4ZeUKltY3F9hoBinS5Rom5bVGtnYExLXGRYXFpCPrB4V1hBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVU1MByWn5SIs6amoq6pp7Osqru2wrC8wq24t8GqrK2ur6ausqmhr7uqoae1raOrtaSms7Ono6Gdp6qyqLCopZ6gn7CXoJqVlZeZn66jmpqkqLSuoamPqaipm56VmKClqZqfnaOfnKCipaOVm56Ymp2iqpylmpuboqCWk5GTk52D1ZOZuXCwwn7GhnzWlJu7fJqWpZCNm4ykeo2GooGlgnqseY+dVa97iX6farlauXeGg32mgpN8mHqqeY2dj3uxbY6EdJC7hW+UT6+nxYpRoHpjYKpic3KGbJeHX1O1tMiGgIl8Y6QzQp12XVFpaGRQQFhmWmRhSkhNbEtaU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFQNzIlnKGTmLGoqKWzqqW0qKW8t8GwusCxtbW8s7ansbGjsbOmn6+2qJuouq6ir7Ggs7SwoKOenqepsKm0qaWcnZ6rmJmYl5eWl6KrnpqXqK2wqKOfjqyip5ael5yhpqKYoqGioZqioqebnqCelZmapqCcp5Wbm5+gmJCSlZGdiLJuaLVxq4hwjqZytHNytnuamKSNj5uNon6Pn6R+sHaDkdLRdVuufIV/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdIWebp5mlFLIi1rCXJ95Yl+tYHZzhmKXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPal9saVBVRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyLqKdkaSvrKSqu62mtKWotru8sru/t7a0u7uzpbS0orKyo6Csr6SYprqupLGwnLS4qaClnaGqpbGorKqlmp2aqZ+WlZiZk5OjqaCXk6arsKWilpKsn6WSlKGcpKeglZump6Kao5+tmqCenpCWm6KenKWUnJWZop6VmJaSm4Wse3eodqOPi4epb62Kg6iDmZmiipKZi6J+kpeHroV/grNccrNSrn2CgqR/cdd9d4R+j52GmZp3r4aKkZyHd7RhmmWagoGVbJJasFhLmnWYeWZgrV53d4dnmIhqXa93lZ6PeGw1eciusl9CVG9daGBFT2tfcW1WVU0vZWNpU1lRO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6NzefnZSguLCYs8GtqLKnqrK6uLS4v7q4s7a9taW4tKC1rZ+gqauflae2rKiwsauttKSbqZ+fqKG1p6aqo5melaWilJScmZOWo6abk5CnrK+loZWYqZ+ij5GimqmmoZWapqmenaSerJ2gnaCNlJ6bnqCYmJuVl6GglJiRp52GqX19pXmhj5CDqnCtjIKnhpagoYqXl4ijgZCHlKp8gIudeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClGySXKtbWpN/kX9oZ6pjcnuBa5iHcV2sWomgjmtuZU9KQ6FcWk10XWNmTVphX3N0X0pVNUqakllIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT03oZyZmb6smLTCrqutqaa0sLixtb+6urOxt7ypu7WgsaWepaennpOqsamvqrWsqq6hmKGgpqSkuaKjq6GXm5GioJWUnpuUmaCgkI2MqbCvpp2Xmqemn42SpJioq6iUl6qon5+go62joJ2hjZShmJ+gkpyXnJWdoZWXj6ubj65tcrR0qYx3iqZztHl0s4CSpKOSnIyJpIeOdbhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJql1ytYE2hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBxfGNTWVA+Pm1vM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs8MDAwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eOTFBOKWam527opyywK6tq6unt6m4r7XAtbyxr7m4q8G3qquhnKekop2Sq6qntaOyqK6qoZecqKCkq7mdo62clpmPpaOWjZ2hm5mdn5GTlau2r6eZlJusqZeMk6aapa2kkpers6SgnqirsJmhoo+Yopegm5abl6GTnKmclJGrmYfUkpq7dLHEgMOGfdWWnLh4iJGXjJeJjKeHeaK2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIptmohwbY2kdL1dd31bYXm8alpWW2l5XmlgZGZibXhvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QDmmmZ6ivKKXscKwramqrLGnuK+2xLG6sq67sK7Bsqylo56koZybkKqkqrKktaetpJ+WmqqZpqy5naOumZWhkKagk42co56YnpqQlpKvubCrlZejp6eUkZalnaStnpGhqKugnJ+ppLKeoqSOpqGUoZmcl5akmI+woJKVqp6FkJm1gJGRjbiVeIKTm7V3bmxuc255j4SOiXKewbu8mXqBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF5/eX2JZ4N5bXlii6xwdYV/WFunakRkWlRmX2NdYlBnZnFtdUJNUExEO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2gob+llrPCtKyqp6yrqbuusMavtbSvuKe1uK2qo6Kmn6CdmZOspa2qprWoqJ+blqCjnqykvqahqpiVnJGim5KPoaihk56XkpiUsrW2rZidpKSii5KSppylq5yWqaWmnZuiqaemo6igkayel6Oel5eYnZ6PsKmUnKeijmp+aZyneIlzfpqOdXplh3u9vsC6bpGCcZSFX3JqWl2aiWFkh46Va2B/lWNtm3ZilGt/mpWUZV5gY3GbiWhyjH2GlGZqfnFzeX18Ylt3dIFoUFxug3x7impYbHmCcklKb4VwTXRNRVdcZmFMW1dmY15PWm12anJST0RFTjtISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPltPJz8yPqifqKHBo5q0urajrKWup6i1sqzIrLCzrLWjvrGypqCjqZ2jm5qZrKeupKW1qqSbmJWim6atqb+oqaaWlJuVoJqTmKWpqJGekI+YnLCyv6ybp52noYmTkaqbqKScm6ygo5qbo6esop+qoZmvmpWmn5aUnZ+dl7ClmaKomZyRnpyjpJmno5qcmpqakJaCaG58cXaQl5SRhIq0qY2FmJWOioyYl4eTlYqDkpKQiY2RlJmTmJeaoKGam5SgnY6CeqSFbGl8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vkd312a3B6bWBjW29oTVhYZWpfV1lwem9uZlNPRlM5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOhv6KksbG3oKmls6elsLWqyautsaa1psCotKGepaWcpJaVoKunrKOjt6ygmZaWoJetqqbBn6yklpKcl56Yk5Sinp6jp5KRmainssOvmaudq56PlpapnqucnqCtmKGbnaKlr6ahpKeerJiXpp2ZmqGenpywoJ2ip5aYk5mUoKKWo5+XoI6WlIuKjY6WrY97lJuCkYGKqaiFgJiWioSOn4h7g5CGhZmQh4aJlY6bl42QmJ6jlpmSkJ2Nfo1lobOuhImEdnqPin12eXpvZ3mQgYCJa3WBeYhyaHR/enaDiIJrdGN4Zl9oZGNkZmpYa3txampcUkxQRF9VRkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAtKC5r76tq62xsqCqprKtoqyzsMWwqqyjsq+8pLScoKeioZ2Zl6imqaakpbO1npWUnpmZr6auvqCro5GRnpqZlJGVoZyXqZ2FnqmsorPHs5+ppKqWlpiap56pnKCkq5Sen56gqq6ppaKqoaybn6CgmKWenJ6cr6SZn6iTmJedkqWamKmempdmg5J8ZX6Omo9jeIxsaGp6kKOra2SZmH5nhYplZWloeo2hjmtnjJeRondraouYop+Yc2xueoSNhXlYZV2FgV5rioqBdltoc3d3kYCHgm54gniAc215hHR3iImPg3tohFhdanNkXXOIaWp8cWxjXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS42Wk82KUVZL0RPMVlDOz8uPaWfury5r6uzsKulqK2usKeurrC9samopK2wsJ+tl6CknqGamaarnKyjpqips66elaOQoq+mtrmlrqOPjpqhmZOSmqCZmaaWe6Wsoqizw7iloqevn56VnqOfpJykqqiSnqGeoKqvqaqiqZ+nm6afp6CslaGbpbCkmJyrlqGem5OlmJ6rmZ5+voOIcrRyhZ2GrWh3ucS4cZKho3ummJlzqoJ8y8DAu3GKooeDnnyVmIiewL2Clp2djZzBwXuBepGMmsK/fWulsW+MgW/Ken+beJGDjoB2eYF/eXF6f4dweIWMk3lsdZFiZV54ZF9lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtLCvv6mplKOvqbCvraaytq+qpqamsaugq5iboqCcm6qnop2roqWppaS0pJ2jk6aurLi0p6+ikpGZnaWSkZ+hmJugnYemq6Srrb/AsaGqrqqXkp+dopmipKqjk6Chnp2srqmrpaOipaCkpZytqZGkm6iuqpydqpysopaXpZaho5icf86UeXqlgXmVlptfrY9djqeAoaB8p5WbdKuCgK9eZIypeqeHhZ90l5KIs2OCq4agjY2yaoSudHyWh7hhgq1Zo81uj3V723t/mXF+iJJ1f2V7iHZ2a32Ibn6FkJJ+bICNX3Bqb2ZgX3hkW3FoamNmYFJUUlddSk9DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrcLAwLW0sLeYnpGkqqmttKumsq2trKSsprCqoKebmqaYnKKwn6CfqKejpqGfsKybnpamrq2xq6isoJSSm5+lk4+epZedqKOerqSrsKi/xrOoqbGulpOdnaKXoKmqn5Whnp2drq+nqqibpqajoKqSrLOWpqKqqp6jp6ahsKGSmqeaoZuUlJGXoHCFjJd1hKiHcbB8nXKsfqGfgaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIoYuRi5x+q3uIko6ggHqtVpzEeo9vksF9gZVtdXCMbWZ2ZYZvYXducm6IipGPg22QjmRuc3VvYGZtZF9uaWluZmNXU1xgWlJSQzhJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08Jz0xKTNWQEYhHEc7QzEtK6/UxseytJ+do46jo6KtrravqbGnqaqorqurp6KjnZmilZ+mq5+ipZ+oqKKfnrCtmJuWqKevrainqZ6XlZqkopKUoa2bnaejrqyjrLWpuc2yraaurJeVnJ2imZ+urJ2WoZmen6mxqamomqqoo6Grm6+xoqirrqaZpquqqrGjk5ejpZqUkoWkaqR1iXqpdHqycYKliZiMcIegmoekX2BSq4R/roKbda6BpoaGn3qYloV7ZoCjiaSYhoGjfal+gJSGrl58qFWdopKBeqOfgHvDr8WMc6+zs7lxYqmvwnVojIuXj4FsmZFubXh3d25sZmVkcXBme2ljXVZfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwr6mto6inqqurqaSmoJuln52lp6aknKyaoquhpJ+vo56bk6qktrCuoKmbnZeVp6SRm6Gon6CmnLCmo6ixrLbIsrWqrKqVkp2dopmfpbOdmqGUnJ+mq6uirZmrqKGhqaKyraKqsrKhm6qor6+2o5OWpKeYm5F8qmyehId1q3l8sG6CpIuIn5aVnpWB0re0uMmAgbJeX5Spg6SIh6B6mJWZeKrJc5mjlKepkJKbjH6aiZrGxndloYKlc4KgjoJ9r15vtWOxdUujhm2nR4KTY46PnZJ7cJaRfW96dHx6bVxmanJxZoFpXmFYY21cXllJTU1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE9UUR0cOzxGMiwkqKTBxrmtqLKurKWinbK5rKqhppuopqusqaegpqWYqqOfrqudpqCsmp+ppZ2ntZ+il5Ooq7ayrJumnKCVkKatkZmcp6OgqqeuoaOnqa+0wrKzqq2olImXnaWboqOvpZehlZmcpaWrmq6crKelnqujt6ygsbiwnZuvp7O0s6WVmKikm6COgp1OeJqBf596hKN8gqSEhqaenJ6ThLh7fHm5gn7MxcK2eJqgkIuffpqWl4p1npeKpJijqH6whZuEnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXSOkaOWe32RkIhzenKEfnBbbG53cmqBblpjX2huYmRdS0xRVEFISEZJOjlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMjpQW1QcGzY/SCwtIIyHmamspKu5q6+gm6Gss7Smn6CVpa+urqmmnaammqOnobKuoammsqCZqKSUorWio5WXoam1uaSbo52jk5CisZmenKeloaKvrZ2kqKK1scOxraqtqpGGkZynnaOknaWXnpiZmaWjqJmtoaykpZeupbusobe3rp2etrO5sbOnmZ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgotxq4aEtG5yaZmjnJWJn3yYmYaHj3KugqWboo2mi5OciJOQmm1wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh3j5OlmH2Li5GKd3x4jYFsaHdpeHNuf3RcZGRtbWVoYEpaV1g8R0dAVDNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWSc4yKrr+/vLu1npeopK22oaOZlaOpp66pq5mloZ+loKC1p6Kpp7CjlKujjqSto52QmpqqtLSknaacqZKUl66goJ6mpJ2nnLWaoKqjtavCsKmrqaKNhI+coqGmo5aZmpyYm5ilpKaYqqasoaSbrKa9rJS9sK2fo7Czuqy0p5upsqWomHqokH18sHeKgaSliJxtsm+gh618oY+DqJaZgKyIhK6Fn5SooKKWhZ+AmZWAe5J9q4CdmpaKqnidn46Ik5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbZSQppmCk4uVinl5gpZ/amx+Yn10bn95X2ZlcW5nZ2hDWWBbPUpUMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVVFIRklKIygovJKahKnGw7bBtJ+braCuuKWkjpuko6Cvrqmfo56drZieuaCiq6CvqpqtoZCqqaSWiZqQrrGspp+om62YmI+toqGepaGapZytmJ+opraov6+lqaSfjICOm5ugpp6SlJmalJqapKOjmaeqq6KjnqmovqSXw6yqo6Krs7qsr6ehtLCpq5l2r36QipyFh3y6rYmYZLCMZZWtfaCPg6eWmoGsioSwhaWZpKGikISgW2xqgbNgf617e4KBsWxnbpmXi4ixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqiaiZaPlJV5d42bfWNyfWGDeHN/fGBpZnBtZmVlT1VjXEFUXj1JKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGBiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbapoYuZoJ+ds7KonqKfnbSYoLOoqquesK2drJuUrqmijoibjq+tqKajqJmuk5qPqZqhnqWfmaOjpZmeoqmyqLuvpaienY98i5qWoaCakJGam5GZl6eeoJinrKakpKKkqbueoManpamiq7S2ra6noL2ura2WgamSo66Om4CGpJeYj4GAuMO6g46ck4Snl5yCrIqCr4imm5qlqpF+1b3CqmKjv718fqOCg9e6uLWFk5KCnr2+hGqjgW+rhG6cf3qysceDaquwva14d6K+u3SAlY2mm46Zj5WbeICPmXlifHpjjGd4gXtga2VramJQYltTaVxAVGFCTSk8OjQvHh8kHiUyIB0kKDA0OTY2Nzg7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbS0sb+5sr2zop2upqazpp6MmKW/qrewp6C/pqaxm56xnLmonq2upaeUlK+sl4yDmpGvpqOsoaWcqqCYi6OSpp6nnJqhqKKZnqCrram5rqikm5eTe4eZkaabk4+RmJiPmJOomZ+XqKifqaahoqq7nqnFo6Cvo6uztauwqqG8qLCwmnR1qqS3hWWJn29nrI+Kj21vd6SQmZ+Bda+ZlXCQjHGVp6ObmK6kcm1tbWWKd25tgplxgHlpcGlniZWVl3FoaYWGZ3CGZF6JY2pwWV1nfnemYGJxjpJvZmSAjZKOopeWl4+UnXuGjZN0ZYZ3aIxqeH54ZGxjZmxiS2RYSmtZOlBlRVEnSzkrIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJSts6m6ubKzqqmirp+ks6qYkr2xw8i9tamewKuso6Cmq5+6o6StrKyljZatqo+MhZWXrZ+lqqKfpKSgkYylk6eZqJmWo6qglpylpqevuausmpuTknuEl42ml42RkJiUjZeVp5Sel6eimq+mnaKsuZ+wwaiks6assbGrrqyouaSvuJaKoailtpyJlqGXhqmakJSdk6qzmZujrKGzl6KgnqCinKCkoZWrpoySk4yHkpyclJCZk5iQjpWFgKSal5WNi5OSio+GhH1ni4B0g3Z0h4xxp218lZGUk4GBj4+Pjp2ToJWWlZ+BhpOLcGeOdm+Kd3Z8eWlrZGRvY1VgWUBpWkdiYE5ZKkU9KyYiNzQwLh8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5VUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbiurqKwpK2gobaxkI6rxLvEureqoaWdm6adsKijtqedqbSmp5GXrKOLiImPnKeWrKShmqeen5OVo5epmqiZlKehpJCap5mhtbqoq5iakIx7gZSMoZSKlJGVkI+Tl6WPnpmonpu1o52mq7eorsKuo7emr6+wraqqtLqir72ZkqajprWikZ2mno2pn42Sn6Osr5qho7GpsJikoZykqp6dnZyXq5ySmaGbk5CWqpmNmJiWkJaekYignZSUhZKMkIyUi4B+ZoyHdYd2eYiDc5xqh5GUlJGKfYyWkpKYkqCRm5WfgoaXhXhxlHJ4iX9xe35pbmRfcGlgW19ZbWJQYGRQWjpHRkU9Mz09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7CzrK6jqaetoKi1qpGQnKOyuq6rq6GimXqdorCkpbGplpu4pqOUmamcjoaKiZuikK6epJaooKGSl5mcrouqlo+omaiMmKiPnrm2pKWYm42IeYGTjJuTipWRlJCNkZahjJ2dp52euKN/g6+1orCvdKS+o7KgeHqgq7O8lXaupJ+KgKp+ZFthdp+OpJ2Dl35uk7Oco6iuq6NlnqCTc3mZlnCAmKiXbH+ip4llnKWbkJeYlouRm5CFnZqQlIKSh46OkomFd2uPh3aHcXyGgYBhaYiLlZOLW3aVkWdoj41xeqOXlmR4mIaAdpdog4mCbnh+anBlX3Vva2toXGVjYmJvUls+TU5OUkc9QFRCOTEuHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTFRVVVlcX2hmZ1dRSjxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraOnraWSlqq0rrGlmammq5Zzi5yvn6irp5OWuJ+gj5yjnZF+iIiano2rmqSVp6KejpeSnoV1rpCJppqokZejiJu6tKigmZiLiXV2k46Wk4qTkZCUjI+Sn42an6aYm7KWgIybtZ20jJKPvaehfqeieqOvuIGOjqefhIuFj7Cpr4yJlqKZeYGLrIacnaKoqqiIlYaYd6WbeoebgZemgoF7nLF6ioWfl5mUmJaBkJaWhJmaYnmHkISNj5KLg25xj4h6gXGAgYZ/hnSHhZaSeJZok3SgmnR8mYOem4WYfpGJgYKXaY2MhGt4enBwZ2R3bWlsaltkamllclteSFNMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5REs8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxrywoZWlqLSdj4Ocq5unoqCNkL6emY2fmqCQfYWOmZeIq52jlqChko2TiYaAkaiOh6Kco5OXnoafubKnnZqTj4VwdZCKlZCKlI+Pm4uPkZ6Rlp+jlZ2siJ+0ibSarovKiKuuibeFjbCDsa+EqY2nmI2dfKiPcnt3m46mlmiVpHm0i5+ep6mSmcKBf6uImKFxnoCapH2XhZWxgaF8oJOfj5iXgI6Tm4mYkot8hZOGjZWTiYNtc5GFgHtyhoGFfYV0hYKXgY/FZoCph4+iap6Cn5iBmYCKi4OImG+NkoRnd3R7dmdodXBmZ2teYm5sZmxYZkZcUEwyRTQ2TWBjNiY0PERHRDo2MzY1ODs4Pj09PkJMP05JSktDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS4saqrppqUn6KkqqKVo6m2oq9/oKacpZ6diZS9mZONoJGdkHmDlpaRh6uZnJuaoYWPjHebnI+gkYiepJuVmZiGoritpZmbjY1/Ym2Qi5OQjY+MjJeLkJGejpOfoJihqH6hp4etnaCWro+fnZ2RhoGgjauvh6SNqpqMmn6idYCYk2uBq3RNq3iHjZ2Rm6mogqqrfYOhe3qnaZ5/kmtnl4aXtoiefW1gY1iDl3+Me2Rni3OZfXmWa118l25fU3GFXGBseYNgWWWCfYSBmHGnqmuDo25ypXCfg51nZJ9sWmyIemVZX4J+YVdQb3ZlbXRxampvXmpvbGtoV2hOXVdFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9idmBNRDpNT01UYlxbZmZpaWJiZGFkZGJhYmBiZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKhtryrrqKZl5+hpaysn5yttKKnkaCfn6acmY6YtJmQi56MlYt1gZSRjYqmlpaYnp5/k4WGrKSHnJGKmKmYmZqSh6WwpqKVmYiJgGluiIeLjo6Ji42Si5CRoYyTnp+boqV/k4GPo6GUoHeclpCng6GngIaqroWleYt9hJp9onBykoeWe56MeW2Hm4yZkJupm4+HnXyConN2pmaefnekX5h6fJJzom6Yt7S6dJKHgYC2qGSBxrh7cJW2jHGAm6RjdKyrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN+o16dmbOWb3uXnrN0cluesoJpYm9zdXFob1lrbHJyZVxoXWJLRD1ENVFBWXEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWlhgYHxkSUM4TFdVVmJhWmVma2tiYmVhZGNgYWJgY2NfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mayck6COpbi1rq2gmqKco6OkrJuasayrkpegmKCkmpqUnqubi4iSeIuFcICWjYqPoJCTlJ2XfZGJjqihh5iPipKjk5uajIuop6Sej5aHhH5re4Z+fY+Ng4uQkImPk5+ClpygnaCfi4l3nJiijKByoouIqYicp5GXqKx/rox9eqCZeaOTeIBzl4iMnH2Wn4abjZmbpoajZKF8iZaQm41snmiajW6amXp/iqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z1iYp/nmiadYeTkpiOf55umZBrpplcqH53u2p9qVqOhF2zZ1xtcXh3a2lbcGl4eGJeZVdiQVBETzdWQlJtNEpaWl9OWkRAMTUxOzs3SD86Q0hVP1hSWV0+RGJdVmBRYWR9aUVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCsnaabm6efna2anbCnq52Xopmhn5mWlqCjmYaJjWmIgHF7l4iLlpaEkpWYj3qKhJajnYmVj4aLnZGcm4mPqKKgmouRioCAaYGGeH+WjHuIjY6HjpWafpOhnqCik5hyaJ+KoI+McJKMgqmImZ+jqaGofbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo6dm5eIl3KhfIWNr7V9a5qRoXh+mLSjo6uohJh7mnycmX5zqlpdb3uXi3ieYkx/e3uFY3qYQk2fWaJqcnyObYGJhJl1m3mHibGzf3+akqZ0f51tcXyUb5lyaaNdlXZIZWNgc3B8fW5lYGtodntiY2BRXlZcVFZAWUVRZ0RSV1tiWF9JRD1COEBCOklFOExFWEFWUVtWREZhXFpgS2BtfnJFQzxVXmJaZWpWZ2hsbmJmZl5hYVxdXmBoYl9lY3ZsXmVnZmxkZWxoaGtpk52Bsa6ZhFNeoae0urOzqZqii5upnJuokqGro6Cnjp6dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlohygImSoJxykZCBiJiUn5qEjqicmpWKi4p8hGyEhXGBoYx4hY2Ih5KYlHySo6Ceo4iuhn21hI+enXumlnqpgpadkIuhnn2naHdtfplzoHNxfJ2FmG+Tgq59o4OmnpqBo3BeqWd1o2NvpWGc0498epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKnvH93g21/v6aqtF6bb35xl2+Bc6JyXaNndKZhaKZtm9OYeoKbbnd5l2ubenaXcmyppWdfZHlwfoRrZ2ZjbXZ3Zl9hUltlUVFhSVdJVF9XU1tlaltlUUVDS0xKS0JKRDhQQFFOV1NYT1JRYGVlaVJkeHl3SUZFY11lWmhqU2loam9jamdgYl9cXV1faGJhaGV7ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmvsrWws6OcmIWYpqCgoo2kqJ+XqImZl5iTmZOSoJeNiIV7cH2EaH2Pg5OagXiRjY6JcH+Gj5KSbJeTfImRkqOVg46qmpSSioWJeYR2h4BugZ+Gd4CShoiZoZZ5k6KjmqCJs6Gitot6rKekrqVwqYCakIWBnJJ9pICimYaYcZ6EoqyuiZeLgIykjZaDrqKUdrW2tcmhdJSKgJ9hnpepbXiWhp+adaGHd6B9kJaKgW9MZqKScJqIc6R7eXRhg4JsfqBscmRgnHJ/dJdpe2mztbTGpnOYfnudapuaq3SCmm1zd5dpmnl0mHFQRXyzXmp1aniHZmpnYnR0cG1VXVNZaFBSaElVTFhSVl1na25WZ1dNSkFKTUpISk5BUUpQZWNpbWV0cnN+eHtudYl7e1RRT2xeaFtraVJqaGlsZ2xmY2VfXFxcXmliZGhre19dZGdjamZubWVpbGWinImvp4VmP5Shs6uvr7WiopCAl6iioaOLpKadnKWBmpeWjZeQkJuSjYiDeWp5hmWDjH6WoHl1j4iMgWmEhZKDjIWdjXqMipWlkoKXqZeMkYuAiXqAfYt5cJChhnmAlIeJlp+Uf5Slp5yWloRnbnicbKJkfHGld5yYcGengZeMe6V6oJaDlnKfdoCJlJaPuW6QiqJifZmilYhucmmqa3WgbG6mYJtpi5BoloealXWigH2aX4uFjHVviGJooWWef2mbdXBkZoiCbnKiWl9bZKFuXomMb3t/c3JkpW54omRnp2iYcouYbqFvUoiPb6BeZKdUi11TmG1tcmpxgWxwaGt4c2tvUVdWVmZZU21JWE9cSFhpaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxygnt/cnaNgIN2XlFzYWdicGdQamhoa2xuZ2RnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWYpnpldG2Lp66lqrCxpp+LgJaqnJ6kjKGhmqGhgJWYk42aj4uXkI2Ke4ZxgIhoi4t8l5pzdYl9kHtlg4eVioqVmYJ8iIaWppCBoquQhZCKgYp9gICOc2mPpYR9hZONiJifjYeSqqaeiaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupaKMkoSMg7xufKWvgoaFhpOWnKB9pnpxqJSglmeefm+rYpaKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm5tn56SlWF+q4uqdoB/jaefd599haSVnaBpmod1q2aerYy2c3e+jKSTWYOmjathdXFzb3t0cGJqfm5obFJVWlVgYV1rTV1SXUldbG12YFtxWVtgWmdzZW5vcmNxdGB3en55cnmDc4N+gXt7jIGCgHZieGRjbnNkUmxnaG9scmlmaWFfXlxhamJsbHpvXFxiaWJtaXdtZ2xuYpWmqpyBgJ6klqmqnqinrqOZiYKXqpmdo4mapZyonYSLmo+FnJGFko2LjXSFeoiDb42EfZaTdHWGcpGDbX+LkoeGk499e4GFl6WNf6WljYCNiYSUdYOHkm9siqiAgouUjomcnomMk6qjoJCAdZWXiH6BeZSuo3+Bm3GPhniQjIWAe3KnjHF9fXqXlpuEjnh7fn2IlJWTinaQmZ+hhHt9iWuMhVt5eXJ5cGhufZGJcX90gY+Uk3GFg4FljX9fgYCMd3VzlHVvem9uh22Ehl93aHiOZoGCho6qnH50fZdqiYhvf3V8hHVtbGaMc3h7l3eEW2pYeI9obXdxcG93d29dbIZtaWdWWV9XXGRrZFVhVV5RX3B3eWtqd2Vqamp1fHFxdHNhb3Vic3uBeHV5gnV/gH+AeIuFgn17bn9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHB1blpbYmtka2t5bWhsb2GOlbqpp4uhopqmpJmknauioIODl6uRnaCJmqaaqJiCgZuLfpaUh46JiI1ygnyPfX6PhHqXjnRzhHCVhXt9kouGhpCFeH6AhpmjjHunoYuFj4+ElYKGjpd3coSphY2SnJCInp6Hi5qnoKCrg4mOlZp+fomWraiPkqeQeHCekYN7k29+qYVwfZVxam98gZ+Lf5KOjGhtXYOLjJybn45zlYuIcXRrgnZzf1hyboaPgX1+i2ldaWN6hYOIgF9peHubfIOMg3aBhoNpeYuHa2Fxc4N3YHOMgomQp5WGZo2Pg252i4NvhIx4bmRmY3mCepVaXGlmbnZbenl3dG1zcoJmXG2Ka2tiWVldWlhrcVteYFleXWZzfXtzb3Rjamppe3xxend0ZG10aGx8fnV5fHt6eX+Af2+GioR7fXR+eXJ/aFRccWlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VubGdzeW5oam1gjIyrsaKQo6Gan56Ynpmpo6F9g5erjJ+Uh5uikKSUf3uXhHySmYiJhoaKcn2Ai3aFi4GElopyb4BymIaEfpKDhIaKgXqAg4qbn4+CpqCHeI2XiJWLi5yXhYN6rIGQl5mUip6dh4ihqp+ioqOMiJObnKOZlqqhp6agkpuIl498eI+OhKh+f5KRkpOcsKWalJ2QjrKTmISmjIyVm6CJkJuCiJGKa3yOdndlgoaQinyJnYSHi4+HiICEg5B3fHp1mqKJh4ufi4aVf36MgYB2cXSGhYB4iIeKkaaRhIaOiIONkIx8hoqHjoB1a4GDe3mZaXJoYHOKcH16dnVvd3SBXF5vh2huX15aW1xTZ3FVY1tbYWxodHt8cm5wY2ppaH97bXh+cWhvcGxmgHtygYB3gH1/hHttgoyFfHp4fH16g3hOZHZqc25we2VrZWJiYFtzZnBmcnFsVV1sdG1peXpwZ2lrZY2InbqflqKhmJWZmJSYpKCde3+Zqo2djYWfnIqdlnx4lIJ7jpmJhoOEhm14gYBygId9iJOEbWt+epeGhIOQfoCGhIZ9h4ONm52Sh6qegnGKj4WSkYuckX2NeqmDjZKXlY6bloaGm6agopqdhoOSmZmYkJqmn6adnZCXgZKLd32IjoWle3yOkJGGmKmhnJOcj42qjpKAno2Ik5qfg4+XfoaOgm94hXF0YH6Dj4V0i5eAg46ChoR+hYSUbnl1dZOii42Gm4WFjnSAin19cnN7iYR7eYyOhJOnj4aEj4KDiomJdYSHiIp7bmp9f3ttaGtsZ155fmd8e3ZzdXV6dlxgcH1tdGBiWlxeUWZtU2VaXWFraXV5fnBrbGNrameAf2tygGxrdG54boR5boaAdoKAfYV2cYKNh317enx/e4KLYGl7a3VoaYNlamNgaVtjdWhvYnVtbFRicXlkcHp6cmVqbW2Lip+4mqGkn5OSlpeLmp+enXp3naWQm4mGpJSKmJl4eo2FfImRg4yCgYJtfH94coCFfYqQfWtofYGXiIGIjnx+hoSHfI+Aj5ubkYinnH9wi4qLkoagoYqFjHynkYePkpeTlpJ3jaOgoZ2Wmn+BkJmYk4yaoqGjmpeRm3+OhXmAhI+HoYB+jIyPfJekoKCSmZCPpo2QgZuRiZOYm36Skn6HjoF1dIJwdmB9gI2FcYqVfIeLcYx+goWFjmh4cnmMmZKQgJh+iItygod8fXF6fIyFenuSjYOWpZOLhpF8hYaHhHWBgoaHeWRxen54eXBsamZefXJoe3V1c3xzf2peYHN2cHdkY1leXlJqaFRkWF5hZ2p2eIFxZmtjbGhlf4BqbX1nbnBqfXeFemuLgXKBgX2BdHaCjYZ+fHp/gX1/j2pyg25zaWGIaWxiX3FVdG9tbmB4aG1XanR2YnV6e3Fia296iY2fs5KlpZ2OkJiPhp2gmpx8daOgjZZ/jKKKiJqWeHuGh36DiX6IgoB/cH97dHWChX6JkHhnY32Gl4qCio14fYCMg3mWgJWXlY2Wn5p9b4uBkJOGpZuHjImDpZWEkoqVl5KRdpGdoaGYlJh6f46Ylo6WmpyknpmTlJt6kIaDeIWXjZ5+gYqNjHOXop2gkpiOj6KMjIOXmIOTlpp/mI18iI2BdnF9bXpkgHyKhXCGkn+QgmuHgoF/iYRldW98h5OYjX2UeIyJfICHfXxygHiKh3mFkYqLmKKWgoSMd4iEgoF2eoCIhHRfd3d8c313ZmtkYH5panZyc3R9cHtjY2BzbXVybWFZYF5bbGRSYldfYGhrdXmGcGNqY2xmaHyDa2h0aGxvaH98gXhtj4ZxgIKCf3R8g4yBf356goN+fJBtdYl0dG1limxqYWN1VoNpcW5geGZsYmp2cGZ5e3lxYHJshoWQna6Ypqiejo2Xh4afk5eYfHepnIqYeZeci4uYj3h7gIt9fIN7gIKAeHN4enN9gIR/iIqAZF59i5WHfoSHdH1+in99mISWlJaMoqCXfnKHe5ORiqaPjI6KkqCRg5GPlJeRioGPmKCakpCSdICNkZOJnJ2eppiYjZWXdI6PimyGmJCZeoeIkIlvl52ZopOUioyfjIaCkpx/k5KVh5mIe4mJgXpxeWp1bHt9i31thZGCk3dvgYN9fouAZHJqfIGXmIV/jnSRiYN5h352eIF+h4F9hI6FjZSkkHmFg3SJh31/cnR/hoJsYHp0eXB7b2FuYmR7YW5udXJ3d3NzYXZfbmt1bm9dW15dXmpdT11XYmFobXN6iWtfamVqY2h3h21lbGhpbGeAfHp3b4+Hc4CDhH10gYaJeoJ9eoGEfX2OcnmLeXhubIdraF9pcWOHaHFvZXZnbWxhemhqfHp4cGF3bYuBmZqqoKSpnYqKkYaKnoqVl312rZiMln2ek5GWlIh2fXuKfHuAdnd/gHB0c3pvhX2BgIl+fGFcfo+Rhn+DhHN6gIZ6j5GHkZGbkqSblIF9gHyNipKkiI2KjZeajYWRmJOVjomJjJOdk5CMjW6EkI6RiJ6ZoaCXlomWkm+KmoVnhpqPlHqJhZCKcJaak6GSkoiLmYyCgJGefZKPk4yZjnuJhId0c3VrcW51e4p0boaQjZFxdIB7gYKIfGVxbXl+mpR9hYl0kYuBdIl5b4F/gYd9hY2KhY2WqI17iH1+i4V3fXBuf4SCYmd3c3RuemJeb2BqdF5waXp4eGxycGV4XW1sc21zWFpeX2FqWk9XWGRjZ3Fxf4dlXWloZmJncY1uZGlnZGlogHp3dW+OhHOAgYJ7dYKIhXiEfHeDhXqAiXd/i3x7cnmDamtfcGh0f2txbm1xZ29sZXtibX95dnFsd3eKf6KYoqihp5uHjIqBj5yGk5x0gKqUkYyGoIyVk5B/c3t2hHd4f3Jze4Vrcm95bYl2gICGbnBbWX6RjYiAgIB2dYB/f6CGj4qRnJegk5Z3iX6AjIicnYmPhpKXloSIlJmPlouLjY6NnYqOkIRuiYuPkYqclqCbmJWFmIhrhqSDZ4adipF/i4SLgXeTmJGdkZCIiZWOf36PmHyRjY+NmpJ9in+Cb3Zva21vcHqFaXODjpeJcHeAdIKIgnlmdG92gpqPfImFepWSeneJdHCKfIeNe4uHhImPnKOIfIR3gouAeHhuaX+Bf1xxcnFvb3daXnBgb2peb2l8eXBtbWptdmBwb2pxbVlYYWFibVdRU1llZmN1cISCYl1rbWRiZmuSbWBmZl9na4F1cXJwi4B0f4KAeHaAi4B5hX93h4Z2g4V8h4yAe3aKf2pxY3xihnxvcGx0amhvbHZ3X3F+eXt0dXR/gn6llZqtn6eWhY2Df5eVg4+edIqfk5KFipqMlY6LenJ3dIJwcoVzcXWIbG9tdW2Id4N9f21uVVGBq5SHgniAdnKCeYKggZGBk5KYm5GZeJF6goySpJqTjoiVmJKDhpaZjJOLiY+PiJ6FkIp9c4uFiI+InJmem5aUgJR/aYadiGiHoYiShJGDiXGDkZeOmo6PjIuPjXd7kpB6jouNkZaNfIh8gGt2am1ra2x6fmF5fY6VgXZ6gXeDjHx5Z3VsdYeWjH+IhnuUkXF6hXB4jXuLjXuJfoONkZ6ehXx9eIKLfXZwaGuAgXdedm9ta3ByVV1uYnFgX21teXBncGZnc3VocGthd2VdVmVgYHJTUE5bZmRdeHCIfF5caHJiYmVmkWlfZ2RaaHB+b2txc4p9dn2FgHR1f4x5e4aAeIiDc4aFfoyMg3t5lXhmcmqDYId+b29remBpbXR/dF90fHiGeHNyhXx5oZCasZymjoOKf4OaiICLnX6KmZKOhIiXjY6OhHZzdnOAcG+Fc3Bxg29qaXZtgm59fG10c1JOgt/JktaTfHB0g3WDoIKSd5SQmJuPmHuTcoWQn6GTk5CKkpuThX6WlYiNjYiRjYicgI6BeHqMfoiMiZubnJqVk3mNd2iKkohsiaSFkoiXg4ZjjJGYjpSJlouNiotxe5SJe42IipORiXqFe35se2Vyb2preXlbgHmPjYB6fX5/ho56emh0a3SLkIqChoV9loxsfn9vgY1/jYh+hHqDkJaam4t8d3iDj3hybGVwf4JraHRvZ2hzbFNebmRwWV9rcHhma2piZnhzb3BjX3dgYFZrX112T01LYGZjXXlxinRcW2V1YGFlZY5jYWZhWGlzc25rcXaLfHR5hoF1dn6Lc3+Gf3uJf3KJh4GRioh8fph2ZXNufGWIf29wa4BZa255eXNgdnp7jXZyd4p3eZ+Mm6+boJCChXeIlX58iZyHhJ+QjoWMl4STjoeBdXdweXFuhG9tbn5yZGR4cHxtenxqaGxjpJrB3K7voXNrdYN1hKGFkW6Vj5SflJuBkXCFi6OXiY6VipCdlYKAlZCFiY+AkoqKl3+He3V/iXiGhI2bmpeZjpB2i3dviIqMfYukhZKJnYWGXouUl4qOiI6LioSJbHuXgn2IhYmRj4Z2hX19a31jeHVpbXhzV4h6kYaEeX5/gIWMfnlmdGqAio+Kg4OAjJeGa4F2bomSg5GFf4J6gJGWlJmQdHR4h411c3BmdHmBYXNsb2FodWZSYHBna1VebXN5YHJjX2h9cXJtWmJyYWJXblpcd01NTGNmYV52c4ptW1xkeF5gZGaEX2NjXlhqcmtua3J3i31zd4SBeHd8iHGDhH1+iHt0i4iIlYaMfn6Xc2h1cXlsjHtudHCBWHB6dnlxZHd5hoxpdoCJcoCdiJmonKOShH1wjJR4eYqdg4SgjY58lYx/mYeEe3N3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IhzbHOAdoqaiI1pl4+OnJSSgYhwhYigjoSLlYqMmJN8jZKIg4mPe5GLhpCCf3Z4g4Ryh4KSm5aTmIaMdod/cIaDioeaooOUjJ6DiWGDlY6GiYWJjIeAh2l9lH99g4SJjo2CcYZ+f3F3Z3ZyaXN3a1qMfZKBhHx/g4CEioJ2YnRsiYKQi4J/f5ORfW6CbHmHkIeThX2BfoGSlJGXiW5yeoyGdWxwanF3f15zaG5canVgUmRxaGZTX292dF9vYF1ognFyaVdnaGNpWG1XW3VMSktlZl5icnOFaFtcZXleXmRnemFkX1xZa25lbmp0d4p+c3OBfnp2eodzhYJ8f4d3doqFj5iBjYJ7k3Zsd3V5eZN1bnh6fVh5hnGAb2d4d5KCZHaGhXGKloWZoZuiioZzb5KLcnaOm32JmYiJe59/g5l/gXlyc25vZHJ+aWZsd3dbX3h6enFxf2lhZ2F/1baOkKZ4bnF3e3GSkIyHapiNiJuRi4Z7aIeLmYaBkpGGh5eNfI2MgICJjXyQjH6KhXp1e4J6cYWAlJiOkpOBiXWEh3eEgIuUnZ+Glo+ff4hhf5OHhIeDiY1/f4JmfZF/fn+CjI+Qfm2CfIJ0a212dHN2dWtjjYGOf4R+fIR/hIh/cGBzcYZ8j42CfH+SiXpxg2Z7hIuHjYR8hX6BlY+Rk4RucHmMfnVtbmlqeXxhZ2lpWGt1WlJpcmliUGJyeGxhZV1aaoNtc2JbZ19kbF9uVFpvTkhOZmRcZ25xgGtaW2NyX1xjbHdkZV1cWmxrYm1qc3aGf3Fvf3x8dHiFeIWCfICIdXmJgZKVfIiGdoiBcHh5e4STb217gXdeg390gW1penOUc2dyiH1ykpGEmp+boIaHdnaUf212k5d9h5CDio2ZfIuadn53cW9samF0fGdiaXV6Wl94fHltcX5lY2hoV52PXnFylrzEhHVxlIiQfnKWi4abkoyHcmqIj5aAe5SMgYSbjHyKhnx7iYx/lIh1ioZ2dn2BcXWFgZ2ThZSPg4NxgIh1hXyKmZ2Yh5SOnYCIZn2Tgn+Fg4mJcYF9Zn6Le3l+f4eLj31pgHyDdmZveHhzdnNsao2FioGJf3iBgIWDf2tfcnl7fo2KhnyCj4F+coFpeYSIjIaFeYR9gZiNkIx9bm17iX13dG5nZnt1YltwYlduclNTbnNoYU1mdHhlYF1cWG6Ab3NZZWFeam1gcE9Za1FEU2dgWmtubXxuWVtebGNaYm93ZGZbXWBsaWNsaXN2gYNxbn58f3R1g3qDgnyBhXZ+iIGWkHiDinSBiHJ5eH6NkG9ve4FxaYF4en5tbHt1lWtqd4R0bJSOhp6YoJmFiG59jHZpeJiOfoCKgpWXiXmOlm96c3BsamRgc3poX2Vxelpgcn15Z3F6YWVlj7Gyd0piWqTZ0JZye5CKkHd9lIqEmZGMhW5rhZKRenmShoCEmIp8h394eImKhJaAcIyIcXR9eml5hYOkkISTjIN+b3+Dd4R5hpyZlYuTkJSFiHB7koJ9goOIg26Bd2iAhXhyf3+Diod8ZX1+hHVjcHJ/aHhwb3WYjIWCinx2eICEeYFrXHF/c4GIhYl+hol7iXKBbnGFh4+FhXOEeoKZjY2EeG5vfoR/dnpkZ2l7b15YdlpYcGxOV3FzZ2BKbHZ0YF1bW1l0fXJvV2ddZmpwYG9OV2hRP1lmXlpvamd6cVpaWWtlWWNxeV9oXF5lbWhla2lxd3+Hb2x/foB1b4J7gIF+gn92gYWIl4pxgo1xe4Z8eXmEk4x1anp/bG9+dH99b3J7e5RvboF/eGaTi4OhmZySgoVnh4NwZ3qWiH1+hIGYiYF8jYxpeHJrbGZfYW54bV9ib3hcZGyDemFxdl9lZdTqvooyOj6LjoBxeIWIjo12g5aMfpKNjH9tbIWNjHZ9j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3RmeYKDpouCj4uDfW6AdXeEeoedkYyRkpOMi4Z/e5KGd3+EjYNrf3JogH54bXx7gYqDd2J5hIFxZHFofm10cXSBm4uAfoV+c3V9gHOBb1ttf3V4i4OLe4eAfIh4enFsiYSQhItygnqAl4uLf3Rta3eAgHV1XGhndm9YVntSWW9kTFpycmVbSXB4b1xaWllddX50aFliW2dlbmNpTVdmUT1eZVxddWVgdXBaWVRvZFlkcXlaaF5gZ21namtpcHd9jmxpgoR+eW6AfHyBf4J6dYKBjZOFcICLbnd+gHt7iJKJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjI2Em52WjICAbI1+a2h+jYx6fn+DlIF+fYqIa3VxZ2hiW2Jncm5gYWtzYWhwiXpic3ReY2SboI9uXDVZr7V0aYCIfJKGdYWWhXOPiol2cGyFg4d1eYl4iXyTh3p+c2d2iX5+mG9xhn5odnltZXmIhKSGgIeNiX5ufnaAgX2MmoiClJGYiYuEiXyPiHB7fYR7aH5saoB7eml6doGHgHJgd4F+cWRyZnWCbXV7hJSRgXyBf253eXx0fmxYcIB3dYyChniIdoKJenhzboqBkIGGc399f5OJiHpubWpugoJ1blxnZHJwUVp6TVpvXE5bcnBkVUtzeGlXWVlaYXGAdGBdXWBmZGhpZU5aaE5AYWRbYHVhXXVtWFdTdGFaZG9yV2pdYWhrZ21saXB3fJJsaYSJfHxwfn57gX+CeneAf4mLg3F7h29xd4R/e4mNj4Nqfnttd3h2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiQeH17gZF/f36Kg3BycWNmXllmX29wYGBncGZqb4l0YXRvW2FkanZ7f76cpqPIuHGFg3KSfHiGk4JzkYyHcnJvg3uDdHWHdIh3k4h5eXFjd4d6gJNpcoR2Z3d1Y2p8goedgX9/jo99cn90hXqAkpGDeZaOlY+Igoh7iIhreHl+dWd6aGx/eXNpenaAg31oYHeHfWpqc2d7gGl2gIuQlH56fX5we3Z7dH5iVnd9cnOKhIJ9g3GHind4cXCEgo1/fnl+fXaOhoN2aXFpbYiCcm9dZ2FxbUpldUtdblVTWXNuYlFPc3hgUlhYXGFvgnNbYVxoZWVja2NQW3BJRGNhWmNwXl13aFVWVXdeW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHh9cnt+eYKBgXx2fYOIhYNwd4NybneDgn2Ji5N/cIB7eHl6gYx0g3h/gYGChHqAdW9+ioubnoh9hXp3hntndIWLkHp+f3uIhYN2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXdvjHV7ho6AepOJf3V0dX53gHBxf22EdJSGeHVrYHqCeYiPZnKEcGd2blttfICQk3+AeZGSfXl7bYh3gZKMhHSWipGOh4WFe3+EbHV2f21ndmVte3Vtand2f398YGJ4hXlodHVifXtndIaOjJV7dIB1cX96fG1/WVZ0f3B1hYd/gXlsiYZ0eWx1gISEfnt9eXtzi4F8c2d0ZW6LhG1zWmledGRHbW1MWmFXVlV4bWJQUnR2V1BVWF5hcYRvXGBjbWRkXm9iVF1yR0JmX11maF1be2JRVVx1W1pna2FWal9gbmVma3FocHV4jnRrjo11fnZ4fXeBg4F7c32DiIeDb3F/dHF1f4WBiY2Ke3d/eIN7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN5Xn2FmIx5hoN0hYaEd4l7Ym5tXGJbW2FWaXNjYFtnbm9mh3FhcWZXXGNrf3zKzoe5oWptbYpscYRxfISJfnuRhXl5c3l1dXxqbHVjhHWSgndvZl59gnqLiWZygmtqcWNYbXqFm4iBgXOXlHd/fG6JcoKLjIhymI6RiYWLg3t4fXFxcH1maHFibXhxamtxeH18elxkeYB3aXV4ZYJ2Z3SHi42UfHGHam59gXlufF1Ycn9udIGLfIJvb4p/cXZod3+BgIF3fXF7dYd8enJmc2FujIJrcldqXXZbSG1qTVVUXlRVe2thT1R1clBRVFZeYnSFaVxga2pmY1luYVhicEdBaFxgZl5dVntdT1VkcFpbamhdV2hgX3JlamdyZ3Byd4Z4bpWKdH96d354g4d/dXJ/hoWNgnBwe3h3dXqGhYaMhXp8f3SLfn2GhISHf35+fYd/fHh2eXiRk6B/jHyLbXWAeWODhpaFc5GKb4WFgXqDdGNuallfW11dVGdzZWBZZHFyZoFzYmtlV1tgaX94vq57oLdtYnOGaHN7cXmChXt9jH93eHJ2b3t2ZWpuYId1joFzamJef3h5i4RncX5oamtaVm93iaOBhH9xmZNxgHl1g26Bg5KIc5WIjYiEiYV9eHRybmh5YGptYG12amdqa3l3enZaZ318eGVyfW2EdGV1hYyFlX9vi2ZqeoN1bXViXHB9bHV9jHyBZnWHfW5xaHV/eH5/c31se3uBenhxZmxibol+bG1WaV92VUppak9RTmhNWXxoYk5VdWpMUFRVXmZ1g2ZdYHBoZ2FXaV1ba2hKRGpaYWRXWVV5WU5WbWpZXWxlXFllY150ZWxkcWdyb3WBeHCZhXZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYaIiIN4gX11j358hIqOhIKEe36Lg3t3fHd3mp2XeoqChml2fXxsg4SSf3KPgnCFgn6Bf29mbGdXXVtcW1RkcGRfV2JydWl1cGVlYldcXGh/cG9ygHOJZGR4fmlzdXNygoR4gIR5d3R1bWt6cWJna2eGdI2DbmZdX31we4l+aW14ZmlkVVdyb42mfIN7dpaQdHxzfXtufHyRhneZfIiGg4aDfXRwcmxndFxsaF5sdGRnZml6b3tyWWeAdnRncIB3gXVid4WKfJSAbotqbXqBcWZzZWFuemdzeIp8fmJ2g3Zqa3F1e3F6eXR9Zn5/f3l3bmRmYm6FfG1qVWlhb1JKaGpPS05wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWVgVmNXYnBdTEtrWGNhVVRVc1ZMWHVkWl9rYVxaY2VfdmZtYnBpc25yf3V0moF3f4B3f3+GhHp8dYKEfpeFbnJ0fHp0cYSFj4GAeYt1dJB/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx6dYOBi3lvhXN5hH2Bg3VuamhlVl1bWlpTYm5kW1hhc3tpaG1pYGJXX1tqgGlrb4Bna2BoeXhqc3N0boSBen99dXVuemhqeWpfZW5ogXaQhWdlWGJ3aX6He29pcGdmXVVYb2eOqHeBenyQjnl1cH9wc3Z6j4B4lXWGg4CFiHZqcnZnaG5bbGRdbXNfZ2FqeGh7bVttgnJzam+Afnl3YXeEhHePhHKIcW95f3FjcGhccHhkcXSIfHlic4BwZ2p5dHJseHd2eGSDe394dnBkY2NufH1ra1VoYWVTSmtnT0dRa0VgeGdhTVNxXEpNVFlla3d6ZV9tcWlkXVZgVm5uV0tTaFdlXlhNVWtUSlx5X1tfa11dW2NlYHloa2Fvb3Vub3h1eph9d4CBeoCAh4V6eHmDfoGThHF0dH95dnSEiJB9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSsn396iIiDa3KBeXWAf4F0boZufH9ziYBqb21kZFhfWllaVWJqZ1taXnWCaV5tbFxhVlxcbIFlcXR9aWlca3Z1Z3R3cmyFe319eXVybHloaXhmXWVyaHp3k4FjY1RlcGeChXd3ZmhqYFdWWWdjj6dufneAi456cHF9aHpveo18d49yhH1/f4ZuZHVzZGhoXGtiXW9vW2dfbXVkemhddIBvcWtxe311dWF0hYp6h4eAf3dydX91YXBtWnJ0YnFyhXx0ZXKAbGFse29qaXt5dnJmhXZ7enVxZGFlbXN+aWxUaF5cVEtyYlBGVmFHYnZnYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVl2ZVVKXGNXZ1hZSFdlUEhieFpdX2xbXlxhY15/aWpfbnR4bm9udoOXeXKBgHx/iIuFfnV1hXiHjH1zdXWCeXp6gouOfX6EiWlzloF6ip19foV6gXp/fIaIc3GProx7e4ePfWVxh3lzfHt1cm6GbHt+bI96YnBvYmVdZVZZWVZjZmtgXVxzhWhYcG5aXldaXGx7YnB3dm1iWmxzc2d0dXBshHl+gHl3bm50ZWl0ZVtndGZ2dpJ6X11SZWZrg4J0fWJjaVxUWF1iY4+laHh0goWQeG1vemh4bnyFe3WJc4B4fHh/aGV2bWBmYF5qX11za1llXW9vYnplXHd7a25ub3d4c3RkcoOSfoeCiHp2b3J9c2J3ZFtvcGJxcYF8c2dygGRebnZpZGd5e3Vub4J1dH1zcWJfZm5vfWRpU2dYWFRNd19RSllYSGJ1ZGFJVG1TSkxaVmlscntibGxzY2FZWVthdltTTGNdWGlTV0dZYE5HaXVYXmFtW1tfYmJdhWhnYW54eWxvanaBkHhtgn6AgZKHg4F2dIl0jIZzcXd1gnd8fX6Mj4B+k35wd5WDfJmSeYCAeHl+f3SIg3NwmaJ7en+JlHhkdYh4c3d1a3Nufmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYllU3JuW1pYWGBsdmNpdWppXlltc3Fsc3NzaYV8fn98dm5ubGRpcWNba3JkdHaOc1tXU2VhcoB/coJdYmNdU1pgW2ORnmVycYWEkXRsa3ptb3B7fHxxgXd/c3p6emRldWhdYlpgZ1tedmhXYl1waGF3YFt7dmlpcm53c3J0aHCBlIKGfoR2cmpwfW1md1dca25icXOBenNmb35bYHBxYV9qcX5sbHV+c3F4a3BhXGVsbHphZ1NmVFdRT3VbUU9YUUhjdGJgRlVqUElQWlVqa2t8ZW1ucWFbWlhZbHBXU09mV1doU1RGWlxOSHJ0WF9jbWNYYGBiXYtqY2RteXhrb2l1eYZ7a4N9f4SZfIKEeXyHbY+GcW93en10goJ8io6Cgpd0d4KThYGfiXWAgIFzf4Jxh4J1b6KXdHuGi4Z7ZXeKbm56bmZ3cHprc3ZyjGtedG5hZ2VrUl1bVWdhbGxaXHCMZE9vbl1WWFVnanRnYnRlZV1ZbnRtcHV1eGqGfH98iHaPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGFXGNfY1RaYFljlZVjbnCDhYpzamh7b2Zzd3N8bHp0dW96fnVeZnJjW15WYWRZYXRlVV9gbWRhcV1dfm9oaXNxc3B0dWpthJKBiHuFcXJmbn1wcm9TW2ZrZnF0gHZzY2x2VWJya1peb2Z9Zm13fXNzc2ptYFpkamp3XmZUZFRVUFRtV1FWU09HZHNfYUVYaU5IV1RWbWhkfGlrd2tiV1xVW3RkU1JXaFFZZVRTSFpaUE14dlpfZWxpWWJgXl6ObmFmbHl1bm9odnZ/f2yDf32Gl3t/h4GJfmuTiHJndIB7dYCCfIiOf4uTcnyKkYWHn4Z7f4aMc4GGc32Ddm6ljHOBjYt2d216jGBke3BmeXJ4bG1xdoJnZHtsY2ZnaFNfXlVnX2xvW15ujWhOaW1gVFZTb2dzbGZ4ZGRcWHB0bHF6eHJsiHt/dpx6eWthZWxtXmBvamVxeX5nWlZYYGx4fHtwg19iXmdXWF9XZJuIYmtxgYd9d2treG1cd3Fse2p2c25ve4ByWGpuX1ldVWJjWGRxYlNeYWhiYmxaYH1rZmtzdW5td3ZraIWLfoh6iG1xZXB9bXJtY1lhaWlvdIF0c15pbFNlcWRVYm5iemNxd3t2a3Btal9YYWdodFxlVWFVUk5YZVJPXE9PSGRwXWNGWWlNSV9LWG1kX3hobn1kYFReVF11XFRTYGZOXWFUU0pcWVBZdXVdX2VtaFhjYVtejXBjZ2p3cXNuZ3Z0eoNygYJ5h41+fImHjnlukIp0bHOCdH9/h4SGkYSVj3l+jI+HkZuEgHyMhHKAgXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2Ojo6Njo6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2Mjo6Ojo6Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2trrFhQERERERDWGhnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0uFkwNTU1NTRNYV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmIiIiIiIeOkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRiYWGhoaGhYeJiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5CKkY+MjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyOjo6Ojo6OjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeKiIiNiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhoqFho+JjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+Jh4eIjIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aIh4aMiI+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY6Mi42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs9OTc5Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5ODk5OTg4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Oz09P0A+PE1MOTw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NEREE+PT5AQT8+am9CPT9DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZEQDw8PUBEREVteUk2Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUBBWEA+W3h8e3l5Uzc6ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNBP0Z4WGOEhISDgntfOz49Pz49PkNEPzs8PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/SnR4gIGCgXuDgWg/QUBDQEA/QEA+PTw9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQUBMc3yAe4KDfoWFWT5DQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk5LSklHR0hLTUpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRUpwfX99g4WGhodoQUVFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpITXJ/g4SEgoWHiIpVQUFVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExMZ4CEhoOAhIiJjHBObYSHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpTgIWGgoCChIaHg4CGhYSEhYaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSl2FhYSAgoWAgoKDhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT48PD1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJYIaEgX6AgoSDgoKDhIaJiouMi4qJiouMiVQ7ODY1Njc2NjY0NTc3MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JehICAgIKDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09RV2tycnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PGqGgYKDhISEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo6Ozg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk7PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5FeoSBgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPz9BPT48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQ1CBg4OEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZFRkZEQEI+PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGVoOCg4WFhoaGiImJiIeGhoaHiYqKi4yNjIyLioqIV0dMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AQEE/QkJHR0pZhIKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA5ODw7PD06P0A+QEBDRklJUGCCg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEdFSklESkhHTEpISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURHSkxWcoOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4teUVFQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVVJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0ZWTkZNT1BUWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOzpRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hJSEVGSUhJSElqcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUFFQkNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A+QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU29zdnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTV1paXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRXWFhaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWFNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUVVTVVRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUk1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSU1RaXG1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/gH9/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlQSEZPRkRFRkhHSEJDSEdISkdDQkFEQE9QTVNkc3V2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXVybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QD8/Pz5rUUthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNCPz48PUI+Sk1GVW51dXVzdHZ4e3x6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZETVJQYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojo2NDg2OTc5OjM2Njc5NjxCPWZ0dXZ3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNRUFNaV1RUTVFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1ODhHbnJ1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KTk9UU1RcVlJVU1JOTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KR1BQT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFQUVBRTlFPUE9MSkxMT1BOTlBRUU5RT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11mUlFTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSU1MSUxLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXh7ent8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0A/PD1BQEI9PkVIR0RGRklHS0pARkFBQEZIRUpPSFBRYVxRUFJOU09PUExMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZEP0JDPjxCRz9CP0FkcXR3enp7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVBMTk5XS0xOS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTktHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUS0pITVRGSUlKTEpLTElJTE1PUFJQS0dDTEdDQ0pKTE1PTklKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGSEhHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0dIS0RISUtNSEpMSEhKTEtNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLQ0ZFR0RFRUZFR0NDQD48PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGREI7QkNDPkBDQ0NFRktNSEtOSERIRUlMTk1HSUxHRUZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkNCRUBEQj4/Pjo7Oz07PT9DQT9BQ0ZHSkdJSUxIR0dHRkVDQD1ERUI+QURDQ0VHSElHTVBJRkZHS05PS0ZISkZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSE1SVVRST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzs+PkBCP0BCRUdKRkpHSUdGRkZFREJBQUZGQ0JCQkRFREdHSEZMUExJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVUWGBeXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmtrc01GRkVIQkJBREQ8QUFAQzw4OT0+Oj89P0I/QEBERkhFSEZGR0ZGRUNDRUJESUZDRkVCRUdFRUZHRUlNS0hRTUpLSEhJRUZJSEVDSUlKS01LUFNORFFTUVFSTk9NTlBNTE5TV1ZXWFZYXltdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJGRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0NHSEZIRkVDRkpKR01KTEtJSkxGSUhLSEVLS0xNTk9SVE9JU1VUUVRQUU1OUU5NUVdaVlpZVlpeWlhhYGBgX2hlY2BkZWdnamloamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9yc3lNSEhHSURBQ0hFPEBFQ0U9ODo+Pjw8PEFCPD8+QUJGQ0VCQkhDQ0RFRkZHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZW19fXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJFR0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRUVDSERGREdGSEhGSEhJS0pFSkhIS0hGRkxISEhKSExMTExMSU1LTU1NT0xQUFFVVldPSlZWVVNTUlFMT1JSUVZaW11eW1xeYGBhYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd293SUpMSUxHQkVERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFRUZHRUlFRkVJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXWBgYWFhYGJkZWJjaGJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3BzdnR1dXd2dXV0ZXFza3BxanJ2b3dKTExLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0hHSEdGSkZDR0pHR0pGSUxISUpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZWFhY2luaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NCSUVCSEpJSEhLRkRLSkdISUlJS0dKSk9LTkxJTEhKTUtaZkpkXEtsUkhOTl9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENEQkVFREZCRkZHQ0RKRUVKTExKTE1HR01KSEpKSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxsVU1OZnNdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9ccHVncE1Kcnl2a2Jga2VlbXhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz1CRUZCRkNFREVFRENISEdERUtHR0xNTUpNTEZKTkhJS0pJS0pKSktNTU5NTU1LTk1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhwY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9Pz9FR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSUxLSElNSUtKSktPUE5OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSURFRUNBQjxCQEJGQ0dGS0dFQ0NIS0hIRkpMTEZOS0xSUkxHTU1ITkpHSE5ISkpJSE5PTk5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQUVDSElNSUZDRkpMSUdGSk1LRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTUxJS0tLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYG1oXGpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURDRkJISkxHRkNGS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpJS0tJSEpHS0tLS0dISkpMTExLSUtMTlRbXFRQVE1QT05PT1ZRT09RT09RSkpOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdKTEhER0lQS0xPS0xXTUlFRUhJSkhJS0hMSkhGSEhKR0dJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKR0VISFBKTE1KTVNJSEVBSEZKSUtLSUxKSEZFSkhFRkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjYFlfYltgXltUWFhaX15kYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tFRkhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUJGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV5eY2FgYmJiY2NlWlJZVlVcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERDS0pNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQUhJQT9ISUdPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUFBdX2FjZGNjYlxkY2JkY2ZYUVVUU1xYW2FfXl9hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0hHR0pGRkZJTEpORUNLSkxOSkxJS0pISUdCSEhRTUtLT01LS0lIR0VEP0VCSEhBQUZGRFRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYWJhYGJiYGNiYmRkYlhPUVJSW1NcXl1eXl9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lJS05MTElMS0lJR0RIS1FPTUxQTExLS0hJQ0VBRUNIR0JBRkVCVlVFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJcYGBfYmNiXWJiV19fVFBPUFFYUl1cXF1eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNQRFdfSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOT09NTkxOSEtBREFDREZEQ0FERUFMSENMTFBPT0xGTUZHSUpIR0xMTU9RSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUFVUXFlZW15eYWFlZmNoY2ttcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXkxHSFlNR0hKSEdOTFFRSUxKS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRURfTERmY0RNW0heXHNtT01WbVlMQ1BfVWxXZ0pdWFZeRExRVUxNVFZRUlRYV1RYVVRcVFBmWmhoZFlUa1RXVlVbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USUtHYFRISk9KSU9NUlFLTUtMT1JVUk9PSkxNR0hNUVtZT1BQTk9QUEpLUH9RSXxZWXJzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlaX1ZVV39qdHV1X2F2X1hiXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdJTEZSVkxLT0lLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQS0haeF1UeGRoWVJUUXZndGxwYm5ma1FyT013bWpycHNycXJwb3CAXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zc3x9b355b39yX2BgYmFaYWBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQT01NSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dRVFBQUFFLR2Z4bGN4cW1aSkxVeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGdvWHZ2anZ1cIBhc2h9aWx4fG9fX19jYlteYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3V6bnx9eXhybk5KUnROQ0JFUFBJS0tKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV1BVUE9OUkpMcm91dXF1cWRoYVZuTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vZFJncnVubXlwd2x2c3RxbG1cc356a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUEpMTUtMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobG1yfGttaGt7dG1ta21PR0pLSEpISFJRTE5QTUxTU1JPU1NXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPTkxNT1BKSFFOUFVMS0tTVFJSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVNTV1tXWFdaUFNVV1dYUV1YVl1VU09YUldXV1haYFtncl5bXFtdXl9jWl9jY2VmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKVFJNUVFQTFZVVFBUVVhVWVVSWl1WVVRXVVlYUE9MTldUUU5VU05QTUxRUEtKUVJLUU1LS09RVFJRUVNTSUhNTk9RUlFRUVRWUlhXXFdTU1BRVVVWVFpRTlNSV1VUWVZUWVVTUlVTVFVYWVdeWl9hXVxbWlxcYGNcXWJiZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLS05PTE1UUU9UUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPWFNQTlVQTVJOS1NQTU5VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1NPU1VXVVRZVVZZVFJSV1VVV1xZWmBdVllfXV5dXF1gYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RQUFNRT1FaWVhXWFpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFPUlhUUlFPTU9TVU5XUlRVVU9OTlFTVVVUVFJUWFZaXVxaVlZRUldYVltcVlBTVlVVVlhUV1dUUlJYVlVaX1peYF5WXl1eYF1cYGBfX1piYmRoaGVkYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUVdTU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVZWW1tXUVNXVVZYVVNYWlRTUVlXVlxeW19fYFVhXGBhXmBiX1xgXWNhY2dpZGVgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWF5cX1dcXmpwd3l/Y1xbVlZYUk5PV1NOUVFQUlRSTFFUU1laV1VPUk5TV1ZUUlRSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVlZbW1ZRVFZWWFlSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZl5cZGBhYGFjZF9iX1laXltcW1lYWVdXWltaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1bYFxgVVxdaGpyfXJsaFxVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZVVVNOVlJTWlJUVVRYXFdYWFNYXFheXVlbXlRVTlZXV15aV1FUVVhYWFRWWFtUU1ZdWV1dYV5jY15ZYFtlYl9kZF5eY2NhXWVmaWRmXV5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVVdWVFRUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVFRVVFZZV0xSWlZdW1xST1VTWFZVU1BXUlNXU1dVVltdWFtZVVpeV19eWVxaUldSWVhZX1pZU1RWWllaVldZXFZUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRTWFJYVlNSVFhSU1ZUWFhYXV5YXVtVXl9YX19YXFZSWVVZWlphWFxVV1daWlpYWVlaWFZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaVlRcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFpcWlZYVVdbWllbWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdaWlxfXlpfXFZfX1pdXlleVlNZWFlaXWJZXlZXWltbW1paWVtZWV5fYGBkY2RlZWJkWmJmY2dmZV5hY2BjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1daWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1heYGJhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xTVlhQVlZWVlZWU1VUWF1cX2BgXWBdV2BeW15cW15YVlhYW1tfX1tfWFhdXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNhYGVjXWZpZGVoX2deY2JjYWFgX19bWFlbWVpaWFlYV1tcWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBYVldYWFdWV1ZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBeXF9ZWl5dXl5hXVtaWVxfYl9iZGRlZmdnYlpkZmdpZ2NfY15hZmRaaGljZmljZV5iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWFddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FjXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNhUlxZT1hXWVtaWVdaWmBdYGJiYGFjX1xiXV9dW19eWVlVWF1dX19eX1taXl5gYmNcW1dbXWBiYmNlZGdmZWdkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9dXF5cWV1bXl9hY2JhYV1iW2JkYV9jYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGFUX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent7e3x7e3t7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6e3t8e3t7e3t6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0s7WVh4mJiYmGs9bS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/v7+/wZqKjIyMjIi/6eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXp5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2AgYGBgICBfnx8fHx9fIGEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV4dnZ2ent4e3h3dnh7d3l6en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp6e3t7e3t7enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx7fHp5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHx9fXl7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6fHx8enx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en18fH16fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h6e3l5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh4eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgYKEgYKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIGCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKBiJGCgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoKEgoKDgoKLmIeFhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KEhYSDgX9+fIibi4OEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgIONhX58fn9/f5mPgYKCgYGCgoGAgoKCgoGCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+Ag5aKfYB/gop/jY2BgYOBgYGBgoSDgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICCmo2Ci4KCg4B/hIODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgoKYjISFh4d9f36AhoWFhIWCf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIaFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWEg5KIgYGAhH9/fn2Fh4aDgH5/fn5/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhoOBgISMgn59fYGGgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhIODgoCBhYSDgoB+foB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgIOFg4KDgoGBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODg4CBhYSEgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWDgoSEg4SDgoKCg4F+fX1+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDhJGSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKCg4ODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4KAgIGDg4ODg4KCf319f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoOCg4J9fX5+gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+Agn+AgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB+fn9+fn58fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af39/fn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f35+f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH59gH9/fn5+f39+fn99fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOAgoOBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgH+AgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWGhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRjIyNjY6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIuOjYuKhoSFhISDg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYOBhYaFhYaGh4aBhJGOjIuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJi4mLiYWIkY2LiImHhYWDgoKDhISDgoKCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiYyQjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+Ni4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjIqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGDgX5+gIB9foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyJioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmFhoWFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAhoKEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoOBgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3t6fHt8gYB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fX+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYGEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgYSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH99fn5/f31+foCBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGBgH5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn58e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/gYF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/gYGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHt7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CBgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGEg4OEgYGDgIKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl5fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYB/goGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgYSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/f3x9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fX1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgH99fX59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhIOFhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3x/fXyAfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKGhoaFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WGhYaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn58fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYSGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhIOFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4SDg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWCgYKCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYeGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEg4aChYGBgH9/gIB+f4CCfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX2DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29nX19fX19fX2NfW19fX1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjIqguri4uLi4uLi4uLi4t73S0tLS0tLS09PT0tPT09zi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6ODc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZSeaejo6Ojo6Ojo6Ojo6Gr0tLS0tLS0tLS0tLS0tHf6urr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaV3yopKSkpKSkpKSkpKSjrNLS0tLS0tLS0tLS0tLR3urq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZGGDrKmpqampqampqampqLDS0tLT0tLS0tLS0tLS0d7p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs/Pzs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzLztLS0tLS0tLS0tLS0tLS1NTU1dXV1dXV1tXW1tbY2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz87P09PPztDU0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tXW1tbW1tbW1tbW1tfX1tXW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHPz6KXytLGkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2s16igq6DOma2as9LOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIiancKclZChs5WGnZ3Oz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZurnZ+nmbTAyZeZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5Sgw6KgjKDF05GYoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEmNqXxcmU2Kyjv53V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkKC2oJSVobvNiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qidi5+vs52l0NuimbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWao5CimqKcnJGomJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojg6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp52+nqmgop6poqmc0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk3Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI222a6OkaXUmpGOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dLVwb3W09O4yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzY7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tTV09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2trZ2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg3OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb2tvb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19jY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tna2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb29vc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tra2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PD0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmJiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/P0A6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiZmpqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkJGSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpGQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJycnJycnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZycnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJycnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVJYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqamon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6impqinqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqGin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Sgpaisp6alpaOjp6SVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3cH15ZltbYF9aXFZcaGRvY25paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKOnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYmxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vL2+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipaenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwcXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87MzMfBw8fHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjIeSi5iYlZqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJCQT1AQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGwMXHy8jUy8rHxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZKJlZGXlZSZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ4ent2bmtpZ3VaZnJ3c3hmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvre+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnZGplYmptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m9urq0v7i1t7Kvu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamdmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2hYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvsPAusTCvse4ubitt7W4urS4s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wtLKxsfKycbPwsG4rrW1vL64urK+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2diXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuro7C5vb6zvL68xbiyuLm9x8nKws3ZyMvJyMzO0czKxLW6wMPIv761v8G/xsa/y8bDv8G8wMPMysfFxsC5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmFhTkhNP0VAP0RDPDs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsbXx6vUxcTKyMzMzcrGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8vrrAysLG08CUwsO/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t7y2ucG6uri4tcTBxMm5jJ28ucG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubjAtrXAs7Wysqqupre5r4uPr7a4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nrK+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXVpVSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDo7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ura20cCywLewnZCMfneKjp+MjKW1s7K3vrmztbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4udLMsL+soYBsfW1gZ2l6io6lt7Owtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SUJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6rqy8sri5t7u/vL7VxbKpgXh+X2yHamNeYXqRqb22sbS2srSvrbu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vL/Czb2ggGRahF1WhYqMfGFbkK/GubS0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PTw8OjpAPTw8O0A+QkBBPz45NTg7PEZCQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ysrq4yMWzh2NZa5ZcV2R4iYt5SoK3xrmyrbOwr6yutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclZCMj4+Qk5CWlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wtqqi1r8vHpnNXXYSPV1ZhZrKldlBot762s6qytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsaOlqJ6gnJWTkI+RkJiQlpWYlp+Ym5mbo5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENBRD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaKgrajCxpliWn+KdmVkenWvo3ZmX3ebr7Sur7O1qqetrKOcmZSOkZaXmJmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZabl5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6Xn6WenqWkvcOVVmibl3SLmYlvjH51fXl6oqqzsbCwuK2noZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmJyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpyim5+hocLIkVFzpbSAhIZ4aXBxe4N4f6ipsK6urLCnoJ+ioJeRlJugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issbSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShn56anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnp6ampKZnpyiop/HzY9UdoqKc29qYFtdXF5lYW6NoKqoqqyqpZ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqaqop6iamZ6aqqefmaagn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOgxtGTYXx6eWhgV0xJS05QT1Fca4Oqr66pqqagnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7u3s6mzraqztK+zrqquo52rp7axrKKvpqGjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHFra3VycGhXW1FFVEhESU9IPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJufoJufoMTIh3F4dmdWUlJuV1dOTURHYY2srqajo6KgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsDGvrq0urq0u7ewtrKqurKuu7e+urqqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrZGhveGplWltGS0xFRFNMREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqoZyeoaKem5qznWtscGhVUFx8ppV5Uk1nlK6soJmcm56emZeXl5KMjpeXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS083T0NPTzMrCxcbHysjOv8jRzMfFx8XBvMPAvr6+tb6zrb+/wsLGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E/PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopaisraqgnaOfnJ2ZrJVybWNXTlJotNPTpI2ks66kn52fmpiWlJKUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K0tfR19LU1tPTyMzHzc3J0s3O08zFx8nKwcbLxsjIxb/Ds7PIxMvKys7Fyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2gpKyYemZYU1JYd9PXv7Kvp52cnaCkoJ2alJSVlIl8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3RydLV1tnV19PW2M7Sys/RzM7QzNLPv8fGysPMzMvOz8XGx7a/yr/RzMvPxcnHv8PDyM7Mz9DPzcrHzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSEk+O0A4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqu1j2daVFVWaJO5rqSalZignJqgoZ+bnJmViXdpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDO09fW09XQz9LT0cnT0cfQ2NfY0djS19nV1szPz8rN0svOz7/FwsfFzs3R0NHIy83AyszF087LzsjEycbGyMzK09PR1c/SzNPBucWxpai1rqeaqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1FNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztDAvMzJtr6upqqooaSxtH9VUFNSZZOtpp+Ylpiam52gnZmcnZN9cWVjY19fYV9fYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0NTV1s7S0NjY2NfLyM3Eyc/Mysu/yb/Hyc3Oz8vQzc7Lzs7Hy8/Qys7KwsnGyczKy9HSzNPR0c/Pyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPDMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsaqsraqlsaltTUpOWJKgm5WUl5yen5+dlJaYlIlrXl5eYWRiYGBgYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVysDKwcXMwsjJwszDxcjKys7KzczQzdPLxcjPzMjHysTGwMXKy83P0cbQzs3NzM/Fx8C4ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbWdgYHBoWFhoVkxGTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWwtaihq6qtYUhEUYubjYyYlZCUkpGWlpaQi3xlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7Gyb3Cx8nOxMLIwMfNx8PLysvPx8PE0MjGwcXHxL7Ax8vLy87CysvIx8zQxMXHu8fDyMjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd250ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK3vLyupbOns2RJS4KYjo2Wj4aDhISCfoWFf3NgXF5eXmBeYGNkY19dXV5fYGBfW1pcYGtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLLycHCy9DEy8i/ucG7xce9v8bPy8O/w7vJxsi7yMbEyr+9wsvGxcS+xby8v8PEy8XEvMDJwsXH0sTAyL/KycbHxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZqjoJuUe3ZzdGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcS/s7G3q7l1V3mWjJOXhnqAhYaAdnh1cnBfWltdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjBwcHFv725vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcPGvb21wb3DurzGu8K5s7zFxMLCtr+1tb2/usvDvLW6yLq/vcvDwcXCxcjGyMbQxsLMx7LHycPOzcHFw8C9srewsqeoqLmwpa2wq62slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGw8TIztHKysrHzc3O0cjQxtXU1tfNys/FycXHwbrHvq2usq6whniRjYqLhXiAhoaAfoR8dHRjW1xdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLOztLq1vrK3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bAwry4vcbBw7u1rrK2ur60xLe7tau4vb2/vbC6tq+2urLFvLauu7+0trTFvb7CxcDDxcbIy8XAxsa7x8u/z8rHw8bCw7bDvb22ub7Hv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxcjNzNDMzcjKyMrJysTPzdLPzcXHwcXBwLu5y7itsLGvl3+PkIaJint4foaGd3iCfXRpXl1dXV9gX2BkYV5kZWNfX1xbXlxdXlpbW11fbHBtaGZqbW5yfKTHv7i4tbCrrKeeoqqnnquts62pq6m0rbaxsqmupqyyvLq2w7m6urGrtbm7tMK6sL+xvby7trzHucK2raqosLG/tbe8r7CnsrO0u7yrrbWlrrauurGwqriwrbuuu7i7wL+9ucK/x8PFwbzGwcfLuMXHxb/Gw8O5xMbCu8bJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xcXDw8rCycq/wL3Cu7S2tsWxq7Cuqnx2k4iPkHx4foqFenuEgXdvXl1cXV1fYF5fZGNiY2NiYF9dW1taWl1aWlpaXGVub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCjpp+qrbS2sb25r7evqK63tLS8uLO8r7i5tLG8wbHArqWooquxsrOnvKqrqKusrbSzpaitoaSvqbKlp6itpai3rLCyt7q6u7G7vb6+xL+1wsDHyLe/wMS3xMK/u7/Ewr7EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvKt77Ev7vKuMHEwra4vreysLa+sKqqqp1ug4OIi4B7foB+eHR/fHN3Zl9dXF1eX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaWtvcoWqpaymoJyhpZSdpJuYkqGjqqOin6WlqKauoJ2bpKWrsq+2t6ewrKeqtKq0urG2ta62ubGvurmxt6Sfo5+msaerqLmqpKenqKeyraCnpp+bpKasnp+npKCgsa2trLK0srSwtby2u8HBsrq+w8GyubnCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZl9rb2BUWV5ITmdPVEhFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzc4NjY2Ozo6Ozk7Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8nLwsa4t8fBzL+4yri8xrm0xbi0wMKuuL60rqext7Gjo6aPdIaGhoF8eXV0b21rampxaV5gXVxcXF5gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeVmqGWm6KYlo2eoaKmm5+fo6WiqJ6bopueqrCtsbWiqaqpq6uktLmtt7Css7WusrWusKqfnZ6jorKkpqm4raKmpp+orKqZn6CemZ2fpZqao5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7OzubO9tLaxsbW0v7a9wL3Dwbq7vZeDenJrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vEw8++uci5ub+4s8K1sr29rry8tKShq66rmaCfin+Ghn94cm5wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZWVmZmhpa3KNqJ2UlJSbmJuhlpaRnKGiqJ2bnaWmoqacoKCamK2ura6yoKWiraumobSwsbGsqK+yp7qzprahop6bo6Gto6Gptaqio6adpaajlpiel5manaCal52cnJusoaumo6Smrauzs6q0sLKqsrm0r6mvsrKzt7Ouqayusriwura5vb+3srGUhXl1ZV5lXltZVlNaVUtcUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLMyMbAxbfCwMfOt8DEvrS6urPAt7O6vK+1t7Ghnaeto5edmIt/hIR/eG9xdHFpZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqmcmpqrp6+wq5ujo7eqoJ+uqLappqetsKS3sKS3n6KbmJiqpqGarLiwoqGknKKgoJOVoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxsK+ur6anp7KusbSvvLS6t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Oqu8C9wLmutLjBzMfFwsO9xrjIzLLBw8Kuvby2vL22uruzs7SsnpykrJeUjZGFgH13cWlscnRwaWhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2NjY2JjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKann5yfpqCqr6afoqO2qKChoqi0oaWopbClsK2stZ6gnZWUqaGilK2xsZ+io52dmJuTi6GUkZOYmJKXl5iXnaabp6GimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaasr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFJIUmFNV1BPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaett7u8wcW6sbm1xMnJwMPGxsi2xsSzwsDGrLi4vre+vL24trCwq5ybo6aPjXaLh391bmNiZmloZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVJVUlVgYF9gYV9gYWNkaYGTk4iQjpSSk5yUlZajmaCWnKCloa2mpKSio6KcqqulmZ6lsamgoJ2lq56noZ6tramprq2hoaKUl6ObnJCrqbCbn6KfnpeZk4qekY2Sk5aQmJiTnKGinaSgoZWgoaSmm6OrpaKkqqSrrqWtsqmmpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlZSR1BPSFpcT1JJVEtTTEVGSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njo4Njk4OTg5OzlAOXu1tK20u7Kvq7Gtnainr7m5s8DIurXAr8bJzbvByszItcq9sb7Eyq6yucO3vcK+t7eusKmZnqCfioV1iIN7dGlpaWxnamxta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eXl9fYmRtjo+EkYeQkY6Zk5SSnJqinJugp6iqqKqmqKWjmKSupJSZpa+pn5uZm6CerpmbqrOfpaafoqOhlJOblpaSqamtmpyfoaCalJCMmY6LkIySjZaVkJ6hoKOcm6KVm6CioJiiqKOiqKugq6+krrelo6SirK2qqKuvsreyvbWzq6+YhHNzaFtYWFNVUUVYTFFbWU1VTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaevrZupqKy3tqy7yru2v6zMx8a5wc7PyLTFvLe7xMmyrrnBuL7Avba5qq6kmpyemol/d392d25taG1ubXBoZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/jJCKko2XkZeZoqCbn6qppq6qp6+jp5mfrKCVlqSop52XkI+anq6Wl6eqmZ+dlKWhnpKQk5KTlaeqpZqZmZ2dlo2MjJSGiI2DkIuSlZGgnqCjl5WflZqgop2Tm6Wlp6iooLGwprG8p6CjrLSrrqewtbC5tcCxrbGrkX1xcmJWU1ZOUklGVlBSUkxMWE1KTE5SR01KQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6u8LL0MuxuLi8vsHEsrGzua62tr22uaeooaKenpiFhnlqZ2xucW5xanBrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKl4mUlJebmZ2omp+ppaSqnaeYoKWbko+eopqXloWEkpqjj5OinJaWloiimpqTi46LkJqkp5yVlZebkJKHlI6MgYuNf5CKkpKSoZqfopWUmJiVoqWZjJmkpqimoZ+0sqiyt6Gdoresqq2ksrKltbu1q6uxo4l4cm1dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8bGt7rDyszGs627vrW4wbCuqrKfqLC9srKkn6ClnZuLf4pwXl9mcnB2cWluaWVoaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEjoqUkZOdoI+am6Kho5iklqGblY2HmJqMc42CfY2XloWQmZCUjo57mY6cjIKKgImYn6KekJOYloSOgpN+fnSJjnmQh5OQkJ2amZqQlZCdjqKjjomaoKGjo5uitK+sr6yfmaW4pqaxobGunLC7qqmvqpmCdnJiVU1ST1BNQ1NOTFFNQlBRSElOU01ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTE3NjQ3ODk6OjY1Ojg3QTd4t6KjtKilpqijpqWmpqazp6W0wbivtLDJxLe5wc7FvrOtu8KsrsSuqaOok5+oubCopZWcnpuWgn2EZ1dWX2dmaWdobmNqaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeLk5Cfl52VlJaUjpaJf5OJXztXb3uLlImAi5KMkIaGc4qEloF5gnqFlJ2Ug5aOkI+Dhn2SeHJvhY19iYGRjY+XmZiTio+JnIeel4eIlp6aoaCXp6+praionpets6Kmrpmsq5intKKpraOTfnJtX1tOU1JWTERUSlBNTEZOT0lGTFFNS09KSU1QRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6KpsKintMG5sLWwx8K3s73Pv7mvr7bDqKvGqqSemoSVnbSmn56MmpeUjYF4e15QTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQX+VkZF9iZSMhIqNmo2VlYqSiIWVhniIf2BKUW54ipGEfYSNiYV/f25+f5R3dXV3hI2ZcFGNiIqHfH54k3Zod4aIfoqIlYqNkJGWi4SKiJSEmoyBhJKalp6clKSjqKmlpJ6bsKqhpKSRpqqWoamcoqaoiXVsZV5bSFFRUk1JVU1TSUxLT0lIR0tOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+tqra8tri3s8K7tqi6yLi2qKi1tqqzvqiflo+Ai5WrmZqQg5SKioN9dnRaTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJKBkpmLj3uGj4B1f3hzbnVwdI2NgXl9iqqFeXpodnuOcHJteIGLjJJ4eoB7gHZycpJ3aHWEhISEe5WJiIqMioB/hIuMf5SDe4CPmJWclZGfnamen6CdoKmln52Yjaekk6Cflp6epIByZ2BcXEpWT1FHSlhST0pNTVJKSkpNUEhMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpijoZicn7Spr6mlraywsaq9tLK7uLa7tbKgt7qyqp2drKmos7Cim5KPlYGPnpGWhHuNf4J8dnVuWktISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfXlnd42XmI6PfWd5gXZ4gImPfISYkoFyh498dntva36tfHOQin97hpKBfX90ZnZ8hmxvaHN8iYyHgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX2LenV+jpKPmIqSmpujlpmdmp2eop2WjYqlm4+el46WmI92bmxlYlpXV1RRSlNVVE9QTlBWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ+WoKavrK6rqKmwr7GrvLisu765s62om7CnrJuPlpylqaWhmJqQhpN6ipGOj3p1gnJ6dnBxb1pLRkdFQUBDRElMTE1RUlBRU1VUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hufHmIkHl8i4VvbYyReHN4amqAgnKWkYuBfZaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXdwfI6MipSDlpeYmpCTlZaZl56XjIOJn5GLko2GkJZ+bWhtbm5XVVdUUlFZT1JUVFNYVU1OSE5KTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDQ1Njc0ODVIQTg5NXeZkZuZmp6lrbCirKqota+urLS/q7zCv6aimpWkl52NhIuUoaGZmZGUi3SOeoGHjop4c3lvdXBqbm5bTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4l2gYiGdGyakXRze2prnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxgHxncXF7bpONj3tzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlI+XjoB5iJeIhoqGgJCHdmpqbmdkV1FaV1lZW01QVVZZWE5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfprquq7KwwrG7w8eblo+VmYuNhXmEkJiUjZCMj4Zxh4J0iI6JfHN1cnFxaHJqYVRGSUM/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHF8eG19bHKDgYWBeoSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBoZmJpbnJtcIN1aW9YdXCOmpJ3bH97fW1xbXCAenN2bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6DgH6PenFwb2teWlxdW1lYYF5STltaWFdMSEpFSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoeWkZ6kp56vlaW1qa2xrsGyu8HGl5CMlJCAiH1ugZCSiYOKh4+FdYKEbJaJin13eXlueHB4ZmpeSVBHPkA3NDQ4Ozs8PT5AQkVJTExMTU5QUVNVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8fYWDf4x+dqKZeX6GgYWZhJucYYaqn52KgpCOeneIfomIjnOKl4+De1xkcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenB0eXdrbmldd4d9h3yIh4+Ai5OXg42FjYZ9cYR/hHx1d3t9iXVvcnNlZl9bWl1TW2ZeV1FVWFtVR0pKREtHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyNeIp/lIySnZ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhYx+foJ/cIB+eml3a1JXTEBFMjExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+MenyJhn6Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbHyBhod9jmhnaHh+boWGgoVxhIVHa4B3cnl2aG1rX3Z9g4h/iIWMepWenIqLiJF/e3WLdnx3bW93fn9ycnFrWlxcW2NjWGZlW1VPUFZZUERMS0ZOSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpeSl6GdrKGmuK+zvbOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1ZLQjYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzk0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoaGXlZuapa2Tmruxp7vHw6iLjKGlj5SJgZF7coSen5Gcf3aFhYqPh5BpaG+DgHSMhoSLcYaCd4eAe3aFfW52dWeAlI+GiYiHiIehq6KWiY6Yf3uCiXp6b2dreH54fXFqY11aWl1pXGFmX1lPS05XUlFJUEtETkdDS0RDQURDQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnVwZ3iDe4CMgIGQj4uamqScoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBi4uCiY2Df4p/bHBqXUNBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPop+UmZKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGWhpOKj4+WpbWpm42VooOHk4R+f2tqa3yAf4ByYFxiXllmalxra15XS0dPU1FOTUxGSVBERE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuaFlwg3B1h3F2koZ+l5aalJ+fnKegqpaTmJ5nZaSafoSSkXmAkoiQkn2KhZiSkYKAgIuNiYWQh4SIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+ElJKGnKGampmnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N8fnpvZ19bX15hZmNgZ2dcUUVKS1BPSUpMRkZNQ0hMRkZDQkdEQDo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcXVgbn1id459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Kjox7ioaPkI6Bg4CJi4qEkoWDhoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtL24pa6srKeotKyxt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsrauki5aYhaamoKKXgaaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWriZqKk4qVent+hH1mX2dbZGFdY2NeZmZeW09DSUhUT0ZITEZLSEVGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljWGpwWHqFdoGUhYiCm4OSkI2S2sidlnNWl4iPiJyPfIaMjoqJeoiCh5GOg4WAi4WGh5KGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJUVVVXVU1bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHw6uzxbass8CzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsbGcmpKan4mnr6qklXafpJehq7GzmJapraiutbuyuqyvtaKxrLG1vLe1rrWgp6ejqJupsK2yuri4p5y3qY2lj5KToIZ5goJ0WGBjVWVhYGJfYGVfWlVKREVMVVFJSkpESkhFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hn6AjXu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeFgY5/gYmOhn+FiIWKh5F6eW5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFdPX1VJS0pBQD9HS0ZFRDs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMm2u8S9s7TBt7jCtb+wt3SxtKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbGtpa2sp6SYoKyyuqKosrm1u77Mv8XFvb2zwre6uL+3ure5ra2xprGqrb6wvbvCwqyZu6iVrY+YmKqJfoJ6aVdhYFdpZGhkVlpjWVZUSUdHTFFHRElKQUhEPj9CQktAQExDOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWlZad2pwf4+EgY6FbnpzeIhiuKGao4mVlJaTlJONkJeSh4d7hoGNlYqAhIGKenyLh4Z9ioKBi4SVfXh5dWVPXGRHRUw6UWRhW15TRj47SFBEWmRRUVlYWmdaVGBhTVNPRUE/SUpIRUZBQEM9RTZCPkhHS01TWlRelK+4tbq5ycC7vcnMu73Au7e1vLu3vrW6ssZgdbKlsZqeq76qpairqqOisrWhq6eelZaemJ+upaempZ+kk6KnsLOosrK8tsG908nJ08bCxczCysPAvr2/u7y3tLC5t7fDusa+w8mwnrqqoqyPpai2iYF+cV5hYFxWYV5nZVJYYVZSVUlFRU5LQD5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzM1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdtbHGQjYWQc21zcnOI1cC1maCNlZmakY6XkZaWjoaHfYaDjJaLf4N/g3h7i4SHe4t5gYqCl390fXprZXB2WV1cUGVlYmBlZF1bWFdcTWRtVVJtbl9vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVl1aXJO5wLm9t8bAu7nKy7u3ura4ubO4tbWutraZZHWpnq1wXqKtnJihopuknqullJ+fkJSPlpiXqJ+ln56amYOknaykqrCtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKv8nPtKS7sbWwm6y5vZp+eGpcX1tYXWBZYmJRW2BTUUtDQkVGRTxART5CSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin6Ih4yQjIl8gYNze4qDhXyKdIKKhpV/c3t4bG11fGlzZWlsaWZqamlgZmlobVptdJetpLyHh2dbb2hdWllUSEpOUEpLUUxUUUhMQUpHS1BfX2JnamKXt8ewubO7vrayxMe2sLmxsLuss7Gnq7esjbannpynmk6bno2OoJaRppillYqTk4iRiY+Qkp6boZiblZaHnpmmmqyvqK+ns7PT1NTW0cvP09XO08/MxsPK0L/KycvJ0sjNzcPR0riwxL3Euqa3u8SigG1iW1tcV19XWWVZUFxXTlFDQkhFQkg7QUQ+QUg/P0I3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CQmYNocW95eYOgqp6ml42bm5iLjZWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfXF4dWxweH9ye254c2xpgHBtY2ltcHlpd31+y7/C36dtY3hvZFthYEpQUlVOWV5QXV1OUE5UUVVUXG5ud4Nylq64rLSosLarrb3Asau1pqW4p6yuoKy0pI+xrpuYmIyRlJGEj5uBjaaRnImDi4SKiYSKg5SVmJeUm5Gbl5mZnp6rrKSnoaysztLV0c3M0tPU0NTRzsjD1NHIztLT09bN0tHF0tbGwM7IyMOpv7jQnXhsZFxhXFVeUV1aTk9TUE5IPkFGQkJFPEBCP0VFPj8/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bXdwfX6AoZ6eoYuNmZOTjIyTkJaFeYaQkI2LioiRh3+Ce3J+gIKHeoV2hZORiX9vdnNsc3x8d3xzgnhxa4BycmlvcXp5cnu+y5p+jLGDdnKFd2hhal1DWlpbV2ZkWGVrVFhdXGBjXWN4e3+LgZmqpKSioKGppqqxuaumtKOiraKjraGnsZ+JppuVk5GKko6IgpSJa5WijZmEgYZ+kYODk5asi5WNlZmOhZKQnZensKKgoKSkqMfNz8fBy9DT0dTSztPNxtbTzdTY1tbY1dfVydTazcnX1tHKrcTDzIpxbWJfXldSWFJbT0pHSUlKQDs6O0VCRDxCRD5IQj9CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKJgZ2VnpSFi5aJjoqIjoiPgHiDlJmLjYiIi4l+g3hze32Eh3eAe4eRl4GDbndwbXV/dnh9dIZ8eWyHdnVvfXaEdXl7nbWMPEGKxqV+jXxqZVdJQ2VjZmNoamRveVtfZmhrbmlugISIkYyen6CekZeYn6OjprKkpbOgoqWeoaiforGch5+SkpORi46LhoOPhH6cm4yNgoSFepR+gqqVo4ySipiSi32XipqRq7OXmpunnKe9w8W5tsXN0tDRz8vSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzbV2dW1jXFhRVVBZVUVGSklFRT06NzpAQUM6R0VARUNBREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXOGjXyXkZ2LfoeSgomGhYqCiH15hZeXiI+Dh4aHeoR5cXp7hIZ2eoaOjZ16jHB8b3B6f3J7gHGEh4Bujnp1d318gnV/fIeJsHRZqcK2jJKBcG5jPV5ocnBxcG54d4JlaW9ydXhye4uHjpOSm5agloiMk5ugm5+qn6GtnKKamZ+lnp+smYyajJGSjoV9iIeDhYuOoJmTiIOHfm2ZeYSZhoiTjI2VjIZ7m4iTj66rlJWXnpimrrW8qK29xsvIycvLz8nD0crU1tjX2NfV29fT2tvW0Nva0dbJ1cyUd3lnZ1pZT1JTXUhCRUlJPkE+PTc6PT87Pkg9QEJBQURBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKEfoR8fYSYjoeMfoaHgHeCeW57e4eCdHqSno2hdo91gnR1gX10gIRvgpCCb5KEdHyBhXp2h3yJuMalw8m3gZWbj3hwZU5lY4J6gXeGopCLeXl3e4R/fIR2bZSWlJWPmJGDiY+WmpeXppyYoJefk5KXo52Zq5aRkYuNkoOMhYmIgYaQkZ6cmYmFi4GFl3uIiZ+XkImNiouCfKGIkIu8oZiTl5mcqKalrp6ntb7AwLnHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvHhXl3ZWhjX1NWVlVNS0RORDs9PTw5Ojw+OT5BNj4/QD1APjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB/f3yFe36CkYqFhnqFiHt1fXVtfX2GfnR/kp6Rn4OSfIZ9eI9+eYuKb4ObgHSZhn2BiYV8fpF7kKmOkMOgvIyco5x9iYR9iXKMi39zppqcmZSFe4+RiYRpR3GhpJ2Mi5CShYiLkZOVj52ak5WRl42MlZ+dlKGUko6OkIt+kI+Oi4SIkpaan5+JjJSRnZCCjH+mmYiFjoKGhICkhoqLuJidkZSWoaegnZ6do662urWrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbt3d3dmlpZFZeWlNPTkhETEI9PT45OTs6OTk8PTZAPj49PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxc3iKe3t/fX97iHt9e4uHg351hIZ5c3p0bYF+hH13hpuhm56UkoCLh3+Yh4Cckm6IqYV6oIt8kI6DiIScfpqRiY2jop+Qo66fi5GLhYuBkoZXcq2Ln6ycj4SYnJCQjlyDopGCjZ+TlYyHiIySk4yUlZSQjI+KiJabnY+VlpGLk5SGgIuJko2Kip2WmaOihpOdlaCKioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispbzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2Z5ue3NmZVtcV1JVV0NASUQ/Pz46NDk6Ozc6OzozOzw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieGxifpKDb213i3h6f3uBfYZ8e3aGhYBzcIWCe3Z3dnSEg4V9f5Kmop+mopaJnZCUl4qKp5dyirKNhKeShJmThJqMo5agmJOJm52hkqivn5GUkI6OiJWLbo23hJrEyLKdoqWbnZiWkbKQZKTNyJWOhoeJkJKNjZOUioWKioaWmpuPkJSTh5WYhICPi5mIjpCql5eko4iZnpaaiY+Gl5eLhY+MgX+Gj6WIjZOomZeTlpihmJ+Zk52borK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6BcX1nYl1dXE5JVFlBQkdEO0E9ODM3Ozw6OD02NDk6PDo3Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdoGPfXxtfoh4en57goKDf3Z2gIN8bW6Lf3p8eHh8hIeKfoujs6ejqrOhlqefpaSWla6ig5G4lZGzmoyhoYykm7CjpJ2YkaeWp5msr6SXlJaVkIuYmZehwI6jybmrnKOmrZmSm52ynYWFqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4aVmIaEkZCcdZGYspaXpKGInZqTkIqQipebiYqWjoZ9jJieiZCQnJqZk5iXn5SgnZWem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LR1tjT0Ni6cXh0W19UX1VPSEpOREJDRTU+Ojc3Oj88PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p6boWGenyEeYGGgX5weHx+fW9yjXp9gXx4houJhoSSp7usqLK9r6Sts7Ooo6GwrIqatZ2iuKWVraSXqa24p6Sjn5qpl6mjr7CpmZiclJWRl6CYmru7rsqhara4q7CUmZ+jrJOXvaNeqrKDioqNlIeRfI6OfYOGjo+UlYiIk5aMkJaNi4yXmJOdmbSXlqudi5yUko6RkoyYm4qRnpCLiZWfoY2UjZiZnJKbmJ6UoaCUnJylr6ihpLO4q8LIxLW6vbvFx8fC0aDGyc3NxdfW0cvUoW95Z1tZU11QT0VDPjxDQUI4Pzg3NT9HPTw2PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEpAi4p/gXOGh32CiHWDioJ/bXx9fX9wd4d3joKHe42PjIaMmarCwK+9xruztMC8tK2rs7aMqLKtrb2rm7ukqK25uKumpqKipKKpr7Kxqp2cpJibmJeeoqalkqS6r6nAvK2tsrmmpKh+iIacrbywg4yMi5CDj4ORjnqBh5CNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpeOkaCRiZSbo6yUlo+UnJ2ToJ2bmKChlJqep6akoqOws6fBxsOvsLq2xcTCv82mx8THw7zV0c3FyodycWBaWF5aTEpCS0BGRz5BP0I7OjQ+QT09NTw2PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRD9DRlxlR2BpZ1pdXJOMjIh7h4yHg4x1hpGKgW9+e4F/cX6Be5V6kpSUmJCTlaezxsm/wszCw7nHvLuvq7m7l7K3urLArqXApKuvu7yqraujo56nq660sKmboKqboZuWn7C1p4ujuru2wbysqJyypaSolIWOqcTDpIKLj4eIhIaVlI16hI2Rj5GijIyUkY6Jl5+Yk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+hmKSfmqCboJSYnqWjpqakr66lv8TDrqi3tsnDvrbPssS/xLyz0cnIwrVzd2tbVlpoUUxIQ0xLS0pBQT1DRDw1QUQ7OzM9OEIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWU5lXGZUY2qZjZeKjIiTkIaJeYaUkIFygHyNf3iHgoKQeo6hlqiampi6vsfIycHSycrCzb3Cs627vqe6v727w7eswamss7u+qrCqpKWkrK6zrba1oJ+un6WimKOzvambqL3BpLe3sKuTsayrrJeHmqmnpZGCjJOllYmBdoqReoWNkpCen5OPlIuPjZSjmZaclJSjnqqfkaWajI+Pj5WWiHyPlZKSo5qVoKKctaWQnpeko6Klnp2mmJ6Wl5uko6mnorKsqLzAxK+lsrfMwLmvxLO7vsK4rcLDwsCYa3hgV1ZaWkpLTUpGRERIQkJBREw6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+JoJOEeIV/lX9/kIiKkICWoZmupqSYwr3Hw8fF083Ozcu8wrewuby0vMu8w8G2truts7+5vK6vqKCpqLatrqmyt5qerKKnoZ6rt7iqpbC/xbG9ubOnqrWzra6XlqWsqKCRjpKyxaeVjn2SlX2IkpmQqpmYk5OPkpWTpZ6SnZmUoaOinJifmIuMj4+eiFqQlpeSlqSZZZijnrOllqGWrKyqp5ueppeYlpiVoKSopZ+2q6m5u8O0pbO1y8C4qrassrq4rqi4ur24gmptWVZTVE1FSlJOSz9BSEVESEdHOTVGTTs+OD1ASi4zMjAyNUI1NVBXTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnBFaUlSZWJMRqWUnJeil6mWjZGDh6aTiIKHgpyDg5WQkJSPmqKfr76voca8xcTGxs7OztLKvru2sbq7vL/PtcO9uLi3srG1s7izq6acq6y5qqmnr6+Xo66kp6SltcCwq6y0v8O6wLqzp7m1uLOvlqWtrq6ki5OVoY10wZp9l5mEj5aajLGVm5qVkpOZmaWjlKCbl5qpnJyhoJmKjZCWnGBKlpyalZqlllSWsJ+vnJ6klK+uq6WaoKWUk5mYjpygp6KZtKmqs7y7u6qwsse/uaasq62xsaOhsbK0pG9sZFtZTk9LRU9QUVE7R0pIR0lDQz46S1U/QTo9RU0wNzU0NDpCMzROV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4unlo6Ik4Wfh4Sdl46doZujpLXItanGusLDx8rIyMzNxr67s665uMHBzbXHusG4tbqwrq+ztKakm6q0taqppq2smqStpaSorLq/qKu2t77Cv765s7LEsrm9rKOutay5poibl6abdr+fhJmdjpOZmouul6Gcm5aVm5+hqZ6nn5maqpmhp56YkI2RnYNudpKimpWdop6QrrKiqpSoqpeqraOjn6WokpKZnIiUnKKdlrGnqau6tr2zsq2+ubego6eopaecm6ypqYxhZGBeUUpMRkhNSVZMPU1ETkpLQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH9lXkhFq5WcoZ+7r5mUn4uTq5uRkpOJq42Hop+MpK2Uo6O2xr60wLrCwsfIxcLNyMG9ubKvuLTAwsq1xbLBvLS6qqitrbCjo5iqtLumqaarqp2prqejqqu+vKitvLS4vse8t7a4wbG+wbSptbervqWPopiSoqC8n4maoJmXnp6Pt5+pnKWim5yhmqils6GbnaacqKqemZWPlJuLl4mMpKKUnaKeoLWvpaSSr6uZq6qdnaSjqJGVlZ+Dj56em5WppKGhtLS6ta2otbKznpyipZqXlZiqoZ52X1tfXUpIRUZNUUhNRUZHQlJMSUJFR0FWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5Z1xGQ0OccGJHRaeXpJ+ew62bl6WYmamclpubj6qWlaemla2smaKrtsTCvL63wcLAx8S+zca7vbmysLizv8LItb+wvLa4tqakq6ytoaGaqqrFoqSpq6aerK+roqmov7emrb6xuLbHtrW5uMCzv8K3tbO0r76jl6OWlJyUrqCQoaOlo6OfkL2kqZ6oq52doJumn72imaOfoqmroZ2WjZWek56Hj4SNk5+koJ61rKWblbGnma6mnpmpnZ+NmJSehI2gmpuTpaSamKuxtbGrpaqtrJyYoKCSjpCVqJ6UZ2JYYF1OSEdKTktIRURJQT5QSEA8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNDZAOTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViVkyimqOcnsWsoZ+snp2uoJKjn5aln6aqrJe2saOqs7bExL2/tb/Cu8jCvsrItri1tLCzs7fBxba+sbi1uLWfpqyqrJ2dnqWkwaSfqq2gpKmtr6KmqL21pbG8uba2xLK0uLq/s8TBuLius7W1o52llZKUoa6gmaKeqKiro5rCramerK2bm56ZpqG+oZ2kmKurrKaimY2an5KfiY5Xf5afpqGguKqmk5i1o5+xoJ+arpaejpiTnYGOn5eVjqKjlpCmrrKrqaGipaWVlZ2Yi4+RkqSeiWBjWWNgS0hKSk5FRUFGSj49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtOnp+hmZ7DqKWitKKcsqiTq6Wgo5+tqaydu7CorLaxyMXBwrLCw73Gw7zEyryvsLatsLSvv8S0ubGwubSsmaiwqaqanaWhqMGsm6ywnKqjrrGppKi9tqa3u76vt8SttLPDwLPHtLu3rLS2raqippaVlaSsop+fmqirsK+vu7KmoKmompmYk6KkuaChpJOvr6ylp5+SoZ6Vno+QjZWemqKep7SmpoyYs5ujrpqdm62QnpOVk5l/kaGWj42foZOLpqywpaahnKCekpKak4WLkY2cnn9gZVpnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+jn5ygw6mkqrKho7SqlrOsp6KksqyuqbuxrbC1tMbAxMO1wMS9ycS1wMjBtKu1qK+4rL/Ds7eurLa5pZmrsquqmJ+ml627tJunsJutoK60sqerubKnurO4srnAqreyxL61xqi/r623tamnrKGXl5KmpaKimJilr7iusrW2oJ+opJqVlZOkoLeipKWWr7Gyp6qmop+bmpuWl6ifoJihnq+yoqaMl66YpKqXmZ6kkJqNk5eZhZWelIyPnJ2Ti6mpqqGnoJmelYyOmY+BhZWIlJ94YmhcampNUE1OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzujo52hpr+nqK+voam1q526saujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDGwLmptqSsu6zAwre3qqyxuqKVrbGtspalp5GquamfprCdq6CwtLOqqra2rbuss7O5t6y4sMO7vr+mw6uwt66pq6umnpiZq6KioZGXobGvs6ywuZqcqaCZlpKXpqG3qaWjorCxtKuzqKyfm6Cgm52lnaKXnaOzsJqfj5Olmp+ompSinZSXiZOWkpWWnJOIkJqZlI6oqKafo5uXm5OGjpiLfYyWhY6aamhsYGxuV1BRWlRBQ0VUQDs7SEE3OlhQZF5QVldFWV9dTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9p5+doqm9oquwq6OxuKqltrSsoK21va6zuLu6vba2wMK/yMS5xMLAwLjEvcG3r7Wnq7exu76/tKmusbael6uuqK6XpqiOp7ufpKyznqyisbCzrKq2tLW9rrCxtaywtbLBu8W3q72vsbisraqjsaaepamfpJiQmZ+zqrOrqrOanaebmpWOoKaltK6noa2trrGntK2yqqScn6ijnpWimZuotamXmZGSnpmdn52Qqp2Wl4SUloqdmZyTio2Wl5qXpqWioJ2WlZeTf4+UhXuOkoOLlmVscmdvcV5GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoaSstqStqqavrreqr7W6p6ext8W3sbe9wcK1tLrFvszFucLAur65xLfAubK0q6m6tru5vrSprbC1mJinrKqsm6urj6u9nauusqOrn7CttK6ttrK5uKqur7Kota+0vL3Ks6q2tbG0sK+nobOgm6itoKaWlpqasqOtoKWvl6GkmpqSjqOlp7OpoaazrKm1pa+xta+kmZ2tp5qYn5qZq7eil5ORjpecoZeWlKuempJ/kpeMnZyZlpCJlJKemaWioaCYlpGTlXqKj4V7jIqDi5JqbXhtdXthRWBqWUlIWVo9e0pGRDZBYlRpW01cYUpbXVpSUlJiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lVS0SZl6GxqLGqraakr662qbe0uaSstLfJu7S6ur+/tLO3w8DMyLzDvLe9v7+3v7yxva2nurm3tsK2qqyxt5SXpq6rqKOwqpSvuqOssbOnqKOytLGxsLWxuLSqrquyp7evtrTExraptrassK2pp6O2oKCnsaGklJyZlbGep5ygqo6oo56clpimpqW4p6KytaynsaeusLaspJmgrKibnJ6clKm4nJSOjoqYm6KXj5iln52UgpGVj5ybl5aViJaPl5qnnKOgkpaQkJV2hJCHe4WBhIyLbXB3dHt+XEtlbFxLTmNcPmJ7R0k4R2dXZlxMXmJNWFlXVFdUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLT1FTFE8M3JrSUNDkJmlrqWtrqunpbGztKq3sbegq7W5ybmuwLvCuLOxtcLCzsXAwb20vb+/ur68ssSnqbmwtra/vK6rs7KcoKexraalr6WesrWrqrGyraqptLuttLK1rLStqqyoram5rbKxyMC4pbqwqa2tpaiusKalo6+kqZyenJuvmaOjoqORrJ6joKCiqqamuaWstbalqquora+2rqOdo6mqm6CampKks5mOiY2HkKGglIyUnJ+TkYSNkpKdmpiVk4eXkpWZp5ufnoySkY6Qdn2OhXx8fIeJiHBzcX18fVxTZG5eTllmXEZElltHO05tWGJbTGBiTlZXVldUWWddUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis7SD8zQkhTLD6QaztHSI+cqquiqbGkqaWztLG0tbKyoayuvcy6rsC6x7G0rbTCwtHFxr7Asr3Awry/t7vEp6y3rLO4u8Cvq7GtoKOnraqopLCkq7Kqr6ywr7Cuq7O8p7axsqmyqaumpaOtuqyqscO6tq27qaioraqps6WppKOuqqiin52krJWlnpiemaydoqiqoqymo62suLGyoamioKyvsaydn6eoqZmkmZmPoKeYhoSOiouen46KjJWbjo2Fho+Un5yVl5SGlpOTl6SbnJyKkpCNiX59h4V8d36HhYZzcnGIdWtfWWBuY1FzcVxLO4R8Rj9XdFhhWk5jW05WVlVXUVxiX1NPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlVo+TEWVmK2ooaqznKqqsLatuLWuq6Wrqr3Ju7C9t8KvsayzxMPOz8O/vrO/wsO6wLPIw6uut62yuL++sq2tq6SnqrCpp6ixprSvqrCurbKxtKy0u6S4s6ysrqeroKOesLerqq27t6W3tqSqp6ysq66hqaemsbKkp6aioqyWqqGUm6CmnqSiq6Wtop+nsbetrqOmopuqq62pnKKlpKSZoJqWj5ick4KCj4iFnJ+Lio6LmI2PioKLl6OakZCajJOSkZOimZuaio6LinyFgIGDenSAhIF9c3aLo4d4al5gbmZXZYdjTj9nk0xFYnlXYllSZVRNVlVWVE9cXWFVS01pV1ZXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxCKzpKT140RIY+SEZEl5KwpaOqsZirqq22rLaxq6Wsqqm8wMC4uLO7taayr8TJy9G/wbq4v7/CucG5wMStsbWxs7q/vbKwrq2rq6e2qqatr6q5sKixsq6yrbeqt7emtLerrKSpqpyjnrOzqKiktLWgt66gqqirqayooKusqbm2qaqpqqOpoKyckqqhnaCko6ajqp6cp7WuqKaqo6OYpaenqpyjpKOgmpigkY6PmI1/h4yHg52dhoSKio2Nj4yDhZSimY2MmZCRkY+Sn5aYlouKg390hoB+f3h0g396d36BiJ2Pb3FnZ3F4XGBziGtPXplWSG14VWRWUWNPTVVUVVBPWFtiVUhQaVVWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTMzMSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EO5aOsKGmq66aq6WssLS1r6umsKqpur67wLCuua6ht6/Jx8jQwb69u7zCvbrDwL6/rrKysbW8usGxsbKrs6iktKilrbOyubCjrbaxsLK7q7qvqa22rKqeqqyfo6C2raihn6+yorSqnqinqqOqoaKsrai9r6yuraKoqKCsmZCwopiioKennqebmaqxqaOgraKhlKOjo6eYmqmlmJiYno6Kh5SIfY2GhIOjloSBgYuGjoyQg4OToJaIkJyQk5CNkZyUl46KhoV4dIF/fHV4eYB6dHN5aH+GpHVpXmRrgXRniIx9U1hwXkt4c1NlU1FeTU1SWWZOTFZZZFhGU2lSUT9DTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS4tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWytITTlVQTSRj7KgpKespKejrKe1s7GrpbGoqri+wLyvp7mqpq+wycfI0cO8v765vr+8ybvBuLCvtLG6u7fAsrO7rLisorSnp6yytrmzp6i8ta62vrC9pqystautnKmvpKClraunnJ6qsqSzqJurp6mjqZ2kqaipvay0r66dqaSgrpybs6OVpJylpZ+km5upq6afm6qim5OcoaWemJepqZKYmpSQioKPhX6Ogn+HnY+Ffn2LhpCNj4R/k5qThZKhjJSRi5GakZWGiX5/cnt6fnxoeHx6dXBwfGeEeISIZGFnYnKFem1neF1dVkFXem1UYVBSWEtMTnF1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0FKN0dTYFUqPTlEVz4qj5SxmZ+gqaaloKqluLOzpqmxp624wb21r6K4raiosMLJyczBtr3Atbe/uci1w7WzsbWxvbe5vbWtuba/raGzp6ursLW4taufvbyps8G0vKCvs7Wqq5+tsKOcpaiqo56bpLCmsKCfq6mooamcpKihrbuorrCuoKujpK6en62ml5+boaOcoJyapKqjm5ulpZaXlZ+ilpuXpqyMnpGRkYuCioCAjoB7mZSMiHt+i4WOjYuKg5KYkYaToomSkoeQmY+TgIh8eWx+dnl4Y3t7cXBwcndogHNqg2dlZ2Btc41sYWlvYG9AW3hrVV5PUVFKSk1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDQvLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDFCaFkxM1M9ZV9ETDZLVmRPKjsyTlg9I5OZrJmgmKeko5+npLiwr6SvsKqruMK6s62fuK+rqLS6yMvIv7fCvrC0vbfEtsOxrrmxs8C0ur23qbm4vauktKipqrCuubGqm7u9pLDBtbahrra1pqensbOgnqSmp6GlmZ+sqKmeoKqvp6CmmKOpoLG5n6OxrqCroayknKanqZqam5+jlZ2dm56pppecoKiSmZSYnpOZlqGqkZqIjo+GfYd/go59fKCMjIh4gouEiYuLhYeSmo+IlZ6IkZWCjJeMkXyFe3NwfXF0dGB5eGlucHBuaH1xY3ttaWVjX2WFfl9ac2tyTEx+aFhaTlBMSkhQUlBJTlxfblNEV1pSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo+MFhWNSiXnaaZnZasoKChpKK4q7KltLSqqbnEtbOtn7etrq2wtcbIwbe/wrmxtLy2v7u+r6u9r7S/sLzCuKm7urenqLWpqKuwrbOwp5q+t6WtvLeyn7C3sKilp6+xm6GkoKSkoZebr6ahnqOor6GgoZOkpKK3sKGmsaqerKOvmJyqpamemJqepZObnZuep6uanZ2llpaYlJ2Ok5eiqKKQiIuPhXqEfoSLeo6Xio2GeIGHg4iLjYWNk5iNjpaYio+XfoaXi495gXpwcndvb3RfeXdkbGxraWiCbWVya2tlaFpic39eWmx2aVpIfV1bWE9PSkhIUlVGMjpfXmxQQ1dWWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0JnW0hUQ1RdaEUuOzFfVCwylqOhl5WdqZ6moaOhuKqvobu5pqy9xLOvrqK1r62tr7TExL2zv7q3sbO5uLq4uq6tv7O0uK+/wbisvbq0pqKzq6iqs6uusqOcwbalqbe3q56yu6mmpaivq5mip5ylppSYobKlmZ6kqqmcoaCUpZ+kuaikp62mnqWhqJOfqaKhoZmbnaCSm52XoKKrnJuZoZWTlZabjpOTo6ekj4iKjoZ5hHyFhXycjYmKhniAg4eHh5GFlZOSjJCVk42OlHuCl46Kd357bHVybWxzYnl1aGdpZ2VuhGdnaGRmaGpfZmJpZlplemNgUnNUW1tTTElHSU9TQCEral5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc4Yk0nMp6ko5KOpaacnp6epLWtqKq6t6isw8C3r6yhta6nr6+3wcC9ssG3sa6ytrW4t7Wsqryzr7KxvcC3rry8saWftqymprSpq66hoMOsqaextKystLqdqKqrsaWYnqqeqKWRmaatopmdpKqhm6Kdl6Cdp7amsKquoKGdnaGVoKafoqCZm5qckpqelaaeraKYl56VlI6VmIyPmJqnoJCHioqIeIV3goKCnIeLgol7foSIhoSQhJaVj4+QkZCRjZN7g5WNhnJ+fWd5cGtqbGd1c2tiZ2RjdH9hZGVmZWlqY2hvWV5YXWxkYU1oV1tgVklHSEtMUlg+OWBsaUdCVVNdW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssMEEqSksuLyorMzcyMig1NyQrNy43Mjc4NVx5TjI+SGlaTFpKVmJmQTozQGVHJTWbpKCRjK6gmpigl6W0sqOyvrehscW7ubCxorarq6+pub69vK3Asq+urravs7iyp6u5sa6utLa7trC4va2mnrWroKGxpauvn6XEobOlr7Kvt621na2vrK6imZ2nqqWflZuopqCZpKOpnJqfnJWcna2wprqoraKhmpqemZ+kmqWdlp6Ym5SaoZKolq2pm5SdnJOMlZmOlJSYp6eNjYqJjnuCdIKBipiFh3yJiISEioyIkoWTnJOSj5CRlo6Qf4CNjYNvgX9meW5oa2pncXJrXGhjYnJ/YGRnam1sZ2pnZGxcbG12cWFUYmhjZVpJRkxNT1hRUFVhZYFUQFZTWVVGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOktqW01bS1hkZEBBMUlkQyc0k6Kbj4+xnZuUoZqpsrCfucC2oLTBu725saW2r6mupbe5uLmtu6+tqqu3qrS5raWytbGuqbG3trGztbqoqZ+2qZ6fqqKqrZyqwpmvpa+xtrWsrJ6xra+qopudpKyonJWcp6SdmamjpZWaoJ2RnKOrqqm7n6akoJiamp6ij2uilZiccYOWnKSAdpGrqJ6WlqGRiZeZgJeKn494hZONg21pfneDcGyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R/g5B/ZoiAaHZpZlhdaXRuTlBqZGZxgmZeZGZubGleXV6JkIWIaE9LRDhFVGdeSkhQUFVVS0hTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOXEtbZmI+RzFPYjwrL42kmYeVsZudk6Ccqq2ro73Fr6m3wri9va2ntrCmq6S4tLO0sbmtqqestKawtaKnuLa1qKestrOutK2zoqmftKueoqScp6iarr2VqKewtLitraSorqqrpqKfnKGop5yXoaamnJunp52SnqCZkJ6oqqO1sKOio5yWmJiYpImhj5Kah6GIlJ6hf6V/p6yelJOdk4iDcniNjoOHoHWIjWmXiGZ9c3igb4iHg36MfH+hoJ+Zf3uHnnSIjnabimyIgoNtaWVke21yYlSGbWNtaZhxWGpwboZXXmlba2pbiHBteXKHaYeEWl5GTj5GXk1FUlZWUVBSV1RnXkxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTlxMXGdfPUsxVWA3LyiMppeEnaydmZmdn6uqqKq/w6+yuby3wL+qpLexqqyms7Wur7O2q6mlsa2ltbObrLW2tKWnqLOxrbKor5+qobOpoKSkmqKknbC3laWmp7a9pqynqaqsp6aioJmgqKSZmaajpZmcpamWk6KclJOjpqagtqSjoKOYlZOYk5yIrpCYlImpi5iknIaxgKStnpSan5V5gtSof4eUwJvGeHexpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4FslrGrsHlobFixrm9labySvG5oem1xj9h+U2pjtrJ+gHGUdZqhqpBXT1hhT1ZORlRbWFFQU4tcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV5nXD5MMVpcNDEhjqaTgaeqn5ednaWtsqmxwr2ytb+1uL/Cq6a0ra2pqK+0qq+2s6inpralp7ivnLKytaqlpKeyr66xpqqep6SypKKin5ecoJ+xrpWfo6C0uqKpqKGtrqWinZuaoqqgmJuooZ+YnaiokZynmpSeoqejoLCjnp+jlpaSmJKZhbBraoqNqn5nhZaHrWVxnp2VmqeWca6hpH53unxroY92sV9qtFulgGWckWBmgXpmf2l4aqllvnJnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4eWRXWcYH1me6Ongllfi6tpgJJ4emqoOEqvW1dUbWNbTE9YX1xXVjtOiE9XVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWTMxG5KilYKsp6Wfo6SqsbettL2+sLfFsri6wqeosKyvqamxr6SxurCkpK+zo6m5qZ6zsrCjpaCqrbCsr6aon6OisZ2knZiVmJudr6iXnKKftLOhq5uhra2gnpqXoKOqnZmepKGcmaGnpJCdo5uYoZ+sn6WmoJqfoZWVkZaRmoa1m7V4hamZtZl3h7Obt3+TlperlX5rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iHCOhoF/iJCXeIOCi5eMg6CPhbB2d59xa2psfItPpVhIY2OZfmNopmB5cXVSk4ZeUKltY3F9hoBhnS9Som5bVGtnYExLXGNYXFpCPrB4V1hBI01oRkNEQUBBMTk+ODk6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDI7RiwwLjg0MCwuKC8yLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o4YVU1MByXoJSIs6amoq6pqLOsqru2wrC8wq24t8GqrK2vrqeus6qir7yqoae1raOrtaSlsrOoo6Gdp6qyqLCopp6goLCWoJqWlpeaoK+jm5qkqLWuoamPqaepmp2WmKClqZufnaOfnKCipaOVm56YmZ2iqpulmpyaoqCWk5GTk52E1ZOZuXGwwn/GhnzWlJy7fJuWppCNnIykeo2GooGlgnqseY+dVq97iX6farlauXeGg32mgpN8mHqqeY6dkHuxbo6EdJC7hW6VUK+nxYpRoHpjYKpic3KGbJeHX1O1tMiFgIl8Y6QzQp11XVBqaGRQQFhmWmRhSkhNa0paU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFQNzIlnKKTmbGoqKWzqqW0p6S8t8GxusCytrS8s7ansrGjsbOmoK+1qJuouq6ir7GgsrSxoaSenqipsKm0qaWcnp6sl5mZl5eWmKKsnpuXqa2wqKOfjqyip5admJyhpqKYoqGjoZqioqebnqCelZmapaCcp5Wbm5+gmJCSlZCdiLJuaLVxq4hwjqZytHRztnubmKSNj5yNon6Pn6R+sHWDkdLRdVuufIV/pG+bqqZrhoV9rX2XmY97sXOTnY94s2WWdIWebp5mlFLJi1rCXJ95Yl+tX3ZzhmKXiF5Zyp1vv4B1TUu1U1XGZFRRamNmWEFPal9saVBVRkk4PVdSW1ZZSUM/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUU+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHJoOSdXaVxCTlRfZVA1Rz1hTTYyLqKdkaWvrKSqu6ymtaWntru8sru/uLe1u7u0prW0orKyo6Csr6SYprqupLGwnLS4qqClnaGqpbKorKqlmp2bqZ+WlZiZkpOjqqGXk6ersKWilpKsn6WSlKGcpKeglZunp6Kao5+tmqCenpCVm6GdnKWVnZWZop6VmZaSm4Wse3eodqOPi4epb62Kg6eEmpmiipKZi6J+kpeHroV/grNccrNSrn2CgqR/cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnmIhqXa93lZ+PeGw1eciusl9CVG9dZ2BFUGxgcW1WVU0uZWJoU1lQO0JEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6NzegnZSguLCYs8GsqLKnqrK6uLS5vrm4s7a9tqa4tKC1raCgqauflae2rKiwsauttKSbqZ+gqKK1p6aqpJmelaWilJScmpKWo6ablJCnra+loZWYqZ+ij5GimqmmoZWapqmenaSerJ2gnaCNlJ6bnqGYmZyWl6GglJiRpp2GqX19pXmhj5CDqnCtjIGmhpagooqXl4ijgZCHlKp7f4udeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClG2TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZU9KQ6FcWk10XWJmTVphX3J0X0pVNUqaklhIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT03opyamr+smLTCrqutqKa0sLixtr+5urOxuL2qu7WgsaWfpqennpOqsamvqrWtqq+hmKGgpqSkuqKjrKGXm5GjoJWVn5uVmaCgkI6MqbCvpp2Xmqimn42SpJioq6iVmKmon5+go62joJ2hjZSgmJ+gkpyXnJWdoZWWj6ubj65ucrR0qYx3iqZztHl0tIGTpaOSnIyJpIeOdbhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6YhnBcr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBwfGNTWVE+Pm1vMkJCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eOTFBOKWam527opyywK6tq6unt6m4r7XBtb2xr7q5rMG2qquhnaekop2Sq6qntaOyqK6qoZecqKClq7mdo62clpmQpaOWjp6hnJmen5GTlau2r6eZlJusqZeMlKaapa2jkpersqSgnqirsJmhoo+YoZegm5abl6GTnKmdlJCqmYfTk5q7dLHEgMOGfdWWm7h5iZKZjJeJjKeHeaK2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+ifox0h6t9vm5zvHSyg3V4gIptmohxbY2kdL1dd31bYXm8alpWW2l5XmlhZGZibXlvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QDmmmZ6ivKKXscKwramqrLGnuK+3xbG7sq68sK7Bsqylo5+koZybkKqkqrKktaetpJ+WmqqZpqy5naOumZWhkKagk42co56YnpqQlpOvubCrlZejp6eUkJalnaStnpGgqKugm5+ppLKeoqSNpqGUoZqbl5akmI+woJKVqZ+FkJm1gJGRjbiVeIKTm7V3bmxvc255j4SOiXOewbu8mXqBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycXe2jF5/eX2IZ4N5bXlii6xwdIV/WFunakRkWVRmX2NdY1FnZ3FtdUJNUE1EO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NhVzgqT11dPSs7VlYnPTo8pp2gob+mlrPCtKuqqKyrqbuuscavtbSuuKe1ua2po6Onn6CdmJOspK2qprWoqJ+blqCjnqylvqehqpiVnJGim5KPoaihk56XkpiUsrW2rJidpKSii5KSppylq5yWqaWmnJmgqKemo6igkayel6Oel5aYnZ6PsKmTnKeijmp+aZyneIlzfpuOdXplh3u+v8C6bpKCcZWFX3JqWl2aiWFkh46Va2B/lWNtnHZilGuAmpWUZV5fY3GbiWhyjHyGlGZqfnF0eX59Ylt4dIFoUFxug3x7impYbHmBcklKb4VwTnNNRVdcZmFMW1dmY15PWm12anJST0RFTTxISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPltPJz8yPqifqKHBpJq0urajrKaup6i1sqzIrLCzrLakvrKzpqCkqp2jm5mZrKeupKW1qqSbmJWim6atqb+oqaaWlJuWoJqTmKWpp5GekI+YnLCyvqybp52noomTkaqbqKSbm6ygpJqaoqesop+poZmvmpWmn5aUnZ+dl7GlmaKomZyRnpyjpJmno5qdmpqakJaCaG59cXaRl5SRg4m0qY2FmJWOioyYloeTlYqDk5OQiI2RlJmTmZeaoKGam5Sfm42CeqSFbGl7kH2AdYmLgnKCeHl2doqAe4lqc4F0g3Vkd312a3B6bWBjW29nTFhZZWpfV1lwem9uZlNPRlI5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOhv6KksbG3oKmms6elsLWqyautsqa1psCotKGepaacpZWVoKunrKOjt6ygmZaWoJetqqbBn6yklpKcl56YlJSinp6jqJKQmainssOvmqudqp6Pl5apnqucnaCtmKGbnKKlr6ahpKeerJiXpp2ZmqGenpywoZ2ip5WYk5mUoKKWo5+YoY6WlIuKjY+XrY97lZuCkYCJqaiFgJiWioSOn4h7g5CGhZqRh4aJlY6bl46QmJ6jlpmSkJyNfo1lobOuhImEd3uQin13eXpvZ3mQgYCJa3WBeYhyaXN/eXWDh4JrdGN4Zl9oZGNkZmpYa3twamtcU0xQRF9VRkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXV1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAtKC5r76sq62xsqCqprKtoqyzsMawq62ks6+8pLScoKeioZ2Zl6imqaakpbO1npWUnpmZr6auvqCso5GRnpqZlJKWoZyXqZ2FnamsorTHs5+ppKqWlpiap56pnKCkq5Sen56gqq6opqOroaybn6CgmKSenJ+csKSZn6iTmJedkqWamKmfm5dmg5J8ZX6Pmo9jeIxsaGp6kKOra2SZl35nhYplZWloeo2hjmtojJeRondraouYop+Yc2xueoSMhnlYZV2Fgl5si4qCdltoc3d3kYCHgm54gnh/c215hHN3iIiOg3tphVhdanNkXXOIaWt8cW1jXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS42Wk82KUVZL0RPMVlCOz8uPaWfury5r6uzsKulqK2usKeurbC9saqopa2wsJ+tmKCknqKamqesnKyjpqips66elaOQoq+mtrmlrqOPjpqhmZOSm6CYmaaWe6Wsoqizw7eloqevn56VnqOfpJykqqiSnqGeoKqvqqqjqp+nm6afp6CslqGcpbGkl5yrlqGem5Oll56rmZ5+voOIcrRyhZ6FrWh3ucS4cZKho3ummJhzqoJ8y8DAu3GKo4eCnnyWmIiewL2Clp2djZzBwHuBepGMmsK/fWulsm+MgW/Ken+bd5GDjoB2eYF/eXF7gIZweIWMk3lsdpFiZV54ZF9lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2FfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtLCvv6mplKOvqbCvraayta+qpqelsaufq5iboqCcm6qnop2roqWppaS0pJ2jk6aurLi0p6+ikpGZnaWSkaChl5ugnYemqqSrrb+/saGprqmXkp+eopmipKqjk6Chnp2srqispqOipaCkpZytqJGkm6mtqpyeqp2topaXpZaho5idf86UeXqlgXqWlptfrY9djqiAoKF8p5WadKuDgK9eZIypeqiHhZ90l5KIs2OCq4agjY2zaoSudHyWh7hhgq1Zo81ukHV723t/mXF+iJJ1f2V7iHZ2bH2Hbn2FkJF+bIGNX3Bqb2ZgX3hkXHFoamNmYFJUU1deSk9DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrcLAwLW0sLeYnpGjqqmttKumsq2trKSsprCqoKebmqaYnKKvn6GfqKejpqGfsKybnpamrq2wq6isoJSSm5+lk4+epZedqKOerqSrsKi/xrOoqbGulpKenKKXoaqqn5Whnp2cra6nqqibpqWjoaqSrLOWpaKqqp6kqKahsaKTmqeaoJqUlJGXoHCFjJh1hKiHcbB8nXKsfaCfgaWPnnergn2tf5xyrX6rh4afdpiSe3yXfqqIoYyRi5x+q3uIko6ggHqtVpzEeo9vksF9gZVtdXCMbWZ3ZYZvYXducm6IipGPg22QjmRuc3VvYGZtZF9vaGpuZmNXU1xgWlJSQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/UxseytJ+do46joqKtrravqbGnqauorqurpqKjnZqjlp+mq5+ipqCoqKKfnrCsmJuXqKivrKinqZ6XlZqkopKUoa2bnaejrqyjrLWpuc2yraaurJaVnJ2imZ+urJ2WoZmenqmwqKmomqqoo6Krm6+xoqisr6aap6yqqrKjk5ejpZqUkYSkaqR1iXqpdXqycYKliZiMcIefmoekX2BSq4R/roKbda6Cp4aGn3qZl4V7ZoCjiaSZhoGjfal/gZSGrl58qFWdopKBeqOfgHvDr8WMc6+0s7lxYqmvwnVojIyXjoFsmZFubXh3d25rZmRkcXBme2ljXVZfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwr6qto6inqqurqaSmoJuln52mp6aknayaoquhpJ+vop6bk6qktrCuoKmbnZeVp6SRm6Gon6CmnLCmo6ixrLbIsrWprKqVkZydopmgpbSdmqGUnJ+mqquirZmrp6GhqqKzraKqs7KinKupr6+3pJSWo6eYm5J8qmyehId1q3l8sG6CpIuIn5aVnpWB0re0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlKipkJOajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI6PnJJ7cJaRfW96dHx6bVtlanJxZoFpXmFYY21cXllJTExLRURCQj1BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTBxrmtqbOurKWinbK5rKqhppuopqusqaagpqWYqqOfrqydpqGsmp+ppZ2ntaCjmJOoq7ayrJumnKCWkaatkZmcp6OgqqauoaOnqbC0wrGyqq2olImYnaWboqSupZehlZmcpaWqmq6crKalnqyjt6ygsrmwnpyvp7O0tKaVmKikm6COgp1OeJqBf596hKN8gqSEhqaenJ6UhLh7fHm5gn/MxsO2d5uhkIuffpqWl4l2n5eKpJikqH6whZyEnoSsfZmUYaVso3CPhZCBfZeEcqxgpHJxgJpgvH1SVXWOkaOWe3ySj4hzenKEfXBcbG53cmqBblpjX2huYmRdTExRU0FIR0ZJOTlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Gss7Smn6GVpq+urqmmnaammqOnobKuoqmnsqCZqKSUorWjpJaXoqq1uaSco52jk5CisZmenKaloaKvrZ2kqKK1scOxraqtqpGHkZynnaOknKWXnpiZmaWjqJmtoaykpZivpbusobe3rp6etbK5srSomZ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ugkoWlgotxq4aFtG5yaZmjnJWJn3yXmYaHkHOugqWboo2mi5OciJSQmm1wslylc5N6nGyZf3uZfm6pYaJxcX+fYnOyuGh3j5OkmH2Ki5GKd3x4jYFsaHdpeHNuf3RcZGRtbWVoYEpaV1g8SEY/VDNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK22oaKZlaOpp66pq5mloZ+loaC1p6Kpp7CjlKujjqStpJ+QmpqqtLSknaacqZKUl66goJ6mpJynnLWaoKqjtavCr6mrqaKMhI+coqCmo5WZmpyYm5imo6aYqqasoaSbraa9rJW+sK2fo7Czuqy1qJypsqWpmHqnkX18sHeKgKSliJxtsm+gh617oY+DqJWagKyJha6FoJSooaKXhZ+AmZWAe5J+q4CdmpaLq3idoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2la3GFmV1gW4ygbZSQpZiBk4yVinl5gZZ+amx9Yn10bX95X2ZlcG5nZ2hCWV9bPUpTMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaV1NQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZWVVFIRklKIygovJKahKnGw7bBtJ+araCuuKWjjpuko6Cvrqmfo56drZieuaCiq6CvqpqtoJCqqaWWiZqQrrCspqCom62YmY+toqGdpaGZpJytmJ+opbaov66kqaOfjICOm5ufpp6SlJmalJmZpKOjmaeqq6KjnqmovqSXw6yro6Kss7qsr6iitLCqq5l2r36QipyFh3y6rYmYZLCMZZWtfaGPg6eWm4GtioSwhaaZpKGikISgW2xqgbNgf617e4KAsmxnbpmXi4ixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqeaiZaPlJV6eI2bfGNzfGGDeHN/fGBpZnBtZmVlT1VjXEFUXj1IKD45PTQhIS0kHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE5KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vbu0wbOjnK2mpbapoIuZoJ+ds7GonqKfnbSYoLOoqquesK2eq5qUrqiijoibjq+sqaejqJmvk5qPqZqhnqWemaOipZmfo6myqLyvpaienY58i5qWoaCZkJGam5GYlqieoJinrKakpKKkqbueoManpamiq7S2ra+ooL2vrq6XgamSo66Om4CGpJeYkIGAuMO6g46dk4SnmJ2CrIqCr4mmm5qlqpF+1b3CqmKjv718fqOCg9e6t7WFk5KCnr2+hGqjgW+rhG6df3qysceDa6uwvax4d6K+u3SAlY2lm46Zj5WbeICQmXlifHpjjGd4gXtga2VramJQYltTaVxAVGBCTCk8OjUvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0sb+6sr2zop2upqWzpp2MmKW/qbawp6G/pqaxm56xnLmon62upaeUk6+sl4yDmpGupqOsoqWcqqCYi6OTpp6nm5qgqKKZnqCsrKm4raejmpeTe4eZkqabk4+RmJiPl5OomZ+XqKifqaahoqu7nqnFo6Cvo6uztauxq6K9qbCwm3R2qqS2hWWJn29nrI+Kj21vd6SQmqCBdbCalnCQjXKWp6ObmK6kcm1tbGWKeG5tgplxgHppcGlmiZaVmHFoaYWGZ3CGZF2KY2lvWV1nfnimYGJyj5JvZmSAjZOOoZeWl4+UnHyGjpR0ZYZ3Z4xqeH54ZGxjZmxiS2RYSmtZOlBkRFAnSjorIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKq7urKzqqmirp6ks6qYkr2xw8i+tKmev6uso6Cmq5+6o6StrK2ljZatqpCMhZWXrZ+lqqKfpKSgkYulkqeZqZmWo6qglpylpqevuaqrmpuTknuEl46ml46RkJiUjZeUppOel6eimrCmnaKsuaCwwqiks6assbKrr62puqWwuZeLoamltpyJlqGXhqmakJSdk6qzmZujrKGzl6OhnqGinKCkoZWrpoySk4yHkpyclJCZk5iQjpWEf6Sal5WOi5OSio+GhH5ni4B0g3Z0h4xxp218lZKUk4GBj4+PjpyToJSWlJ+BhpOLcGeOdm6Jd3V8eWlrZGRvY1VgWUBpWkdiYE5YK0U9KyYhNjQwLx8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKWWqamltriurqKwpa2foLaxkI6qxLvFurepoaWdm6WdsKijtqedqbWmp5GYrKOLiImPnKeWrKSimqien5OVo5eomqmZlKahpJCap5mhtLmnqpiakIx7gZSMoZSKlJGVkI+Sl6SOnpmonpu1o52mrLeor8Kuo7emr6+wraqrtbuisb6akqakprWikZ2mno2pn42Sn6OssJuhpLKpsJmloZ2kq56enZyXq5ySmaKblJCWqpmNmJiWkJaekYegnZWUhZKMkI2Vi4F+Zo2HdYd2eYiEdJxqh5GVlZKKfYyWkpKXkqCRmpSeg4aWhXhxlHJ4iX5xe35pbmRfcGlgW19ZbWJQYGRPWTlHRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7G0rK6jqaetoKi1qpCPnKOyu66qq6GimXqcorCkpbGplpu4pqOUmKmcjoaKiZuikK6fpJeooKGSl5mbrouqlo+omaiMmKiOnri2o6WYm42IeYGTjJuTipWRlJCNkZahi52dp52euKN/g6+1orCvdKS+o7KgeHqhrLO9lneupaCKgKp+ZFthdp+OpJ2Dl35uk7Oco6ivq6Nln6CUdHqalnCAmKiXbH6iqIplnaWbkJeYlouSm5CEnZqQlIOSh46OkomFd2uQiHaHcXyGgYBhaYmLlZOMW3aVkWdoj41yeaKWl2V3l4aAdpdogomCbnl+anBlX3Zva2toW2VjYWFvUlo9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHRklLTFRVVVldYGhnZ1hRSTxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraOnraWSlqq0rrGlmammqpdzi5yvn6irp5OWuJ+gj5yknpB+iIibno2smqSVqKKejpeRnoV0ro+IpZqokZajiJu5s6egmZmLiXV2k42Wk4qTkZCUjI+Tn42anqWYm7KWgIybtZ20jJKPvaehfqeieqSwuYGOjqefhIuFj7Cpr4yJlqKZeYGLrIacnaKoqqiIlYeZd6WbeoebgZemgoF7nLJ6ioafl5mUmJaBkJaWhJmaY3mHkISNj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR8mYKdmoWYfZGJgYKYaYyMhGp4enBwZ2R4bmlsaltkaWllcltdSFRMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5REs8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxryvoJWlqLSdj4Ocq5unoqCNkL6emY2fmqGQfIWOmZeIrJ2jlqGhko6UiYaAkaiOh6Kco5OWnYaeubGnnZqTj4VwdZCJlJCKlI+Pm4uOkZ6RlZ6jlZ2siJ+0ibSarovKiKuvibeFjbCDsa+EqY2nmI2dfKiPcnt3m46mlmiVpHm0i5+epqiTmcKCf6uImKFxnoCapX2XhZWxgaF8oJOfj5iXgI6Tm4mYkot8hZOGjZSTiYNtc5KGgHtyhoGEfYV1hoKYgY/FZoCph4+iap2BnpeAmYCKi4OImG+NkoRnd3R7dmdodXBnaGteYm5sZmtYZ0dcUUwyRTQ2TWFjNyY0PERHRDo2MzY1ODs4Pj08PkJMP05JSktDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZ2hnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5saqrp5qUn6KkqqKVpKm2oq9/oKacpZ6diZS8mZONoJGdj3mDlpaRiKuZnJuaooWPjHebnI6gkYiepJuVmJeGorispZmbjY1/Ym2Qi5OQjY+MjJeLj5GfjpKeoJmhqH6hp4etnaCWrpCgnp2RhoKgjayvh6SNqpqMmn6idYCYk2uBq3RNq3iHjZ2Sm6iogqqrfoShe3qnaZ5/kmxnl4aXtYiefW1gY1iDl3+Me2Rni3OZfXmWa118l25fU3GFXGBseYNgWWWCfoSBmHGnqmuDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbXRxampuXmpvbGtoV2hOXVhFOUA0R0ReazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpbXV9XXl9idmBNRTpNT01UYlxbZmdpaWJiZGFkZGJhYmBiZGNhYmlrZGJkZGdkYmdlYWNomJadoLmgqqOmrJGhtryrr6KZl5+hpayrn5yttKKnkaCfn6abmY2YtJmQi56MlYt1gZSRjIqmlpaYn55/k4WGrKOHnJGKmKmYmZqRh6WwpqKVmYiJgGluiIeLjo6Ji4yRi4+RoYyTnZ+boqV/k4GPo6GUoHeclpCng6KogIaqrYWleYt9hJp9onBykoeWe56MeW2Hm4uZkZypm4+HnXyConN2pmaefnekXph7fZJzom6Yt7S6c5KHgYC2qGSBxrh7cJW2jHGAm6RjdKyrYH1qnbN+bn2Hg4+Ci5dxgKNsc6RznoJ9o16cmbOWb3uXnrN0cluesoJpYm9zdXFoblhrbHJyZFxoXWFLRD1ENVFBWnEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWVhgYHxkSUM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi2ra6gmqKco6Okq5uasayrkpegmKCkmZqUnqubi4iReIuFcICWjYmPoZCTlJ2XfZGKjqigh5iPipKik5uajIqop6Sej5aHhH5re4Z+fY+Ng4uPj4mOk5+ClpygnaCfi4l3nJiijaByoouIqYicp5GYqat/rox9eqCZeaOTeIBzl4iMnH2Wn4abjpmcp4ejZKF9iZaQm4xsnmiajW6amXp/iqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z2iYqAnWiadYeTkpiOf55tmZBqpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGp5eGFeZFZhQVBFTzdWQlJuNEpaWV5OWkRAMTUxOzs3SD86Q0dVP1hSWF0+RGJdVmBRYWN9akVCOU5bXllkZlhmZ21tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCsnaabm6efnayZnbCnq52Xopmhn5mWlqCjmYaJjWmIgHF7l4iLlpeEkpWYj3qKhJajnImVkIaLnZGcm4iPqKKfmoyRioCAaYGGeX+WjHuIjY6HjpWaf5OhnqCik5hyaJ+KoI+McJKMgqmImaCkqqGofbCtpKK4l3ajs6Kjf4iUeJ16qpp+oo+enJiJmHKhfYWNsLV9a5qRoXh+mLSjo6uohJh7mnycmn5zqlpdb3uXi3ieYkx/e3uFZHqYQk2fWaJqcnyOboGKhJl1m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B9fW5mX2todntiY19QXVZcVFZAWUVRZ0VSVlxhWF9JRD1COEBBOklFOExFWEFWUVpWREZhXFpgS2BtfXJFQzxVXmJaZWpWaGhtb2JmZl5hYFxdXmBoYl9lY3ZsXmVnZmxkZWxoaGtplJ2Bsa6ZhFNfoae0urOzqZqii5upnJynkqCro6Cnj56dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlohygImSoJtykpCBiJmUn5qEjqibmZWLiop8g2yEhXGBoYx4hY2Ih5GXlHySo6Ceo4iuhn21hI+enXumlnqpgpaekYuinX2naHdtfplzoHNxfJ2FmG+Tgq59o4Onn5uBpHBeqWh1o2NvpWGc0498epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKnvH93g21/v6aqtF6cb35yl2+Bc6JyXaNndKZgaKZsmtOYeoKbbnd5l2ubeXaXcmyppWdfZHlwf4NrZ2ZjbnZ3Zl9hUVplUFFhSFdJVF9XU1tkaltlUUZDS0xKS0JKRDhQQFBNWFNYT1JRYGVlaVJkeHl3SkZFY11lWmhqU2loam9jamZgY19cXV1faGJhaGV7ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmvsrWws6OcmISXpqCgo4ykp5+XqImZl5iTmZORoJeNiIV7cH2EaH2PgpOagXeRjo6JcH+Gj5OSbJiUfImRkqOVg46qmpOSi4WJeYN2h4BugZ6Gd4CShYeYoZZ5k6KjmqCJs6Gitot6rKekrqVwqYCbkYaBnJJ8pICimYaYcZ6Eoq2uiZeLgIykjZaDrqKUdrW2tcmhdJSLgp5hnZepbXmVh5+adaGHd6B9kJaKgW9MZqOScJqIc6V7eXRig4JsfqBscmRgnHJ/dJdqe2mztbTGpnOYfnqdapuaq3SCmm1zd5dpmXl0mHFQRH2zXmp1aniHZmtnYnR0cG1WXVNYZ09SaElVTFhSVl1na25WZ1dNSkFKTUpISk5BUUpQZGNpbWV0cnN+eHtudYl7e1RRTmxeaFtraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinImvp4VmP5Shsqyvr7Wioo9/lqeioaOLpKacm6WBmpeWjZeQj5uSjYiDeWp5hmWDjH6Wn3l1j4iMgWmEhZKDjIWdjXqMipWlkoKXqZeMkYuAiXl/fIt5cI+ghnmBlIaIlp+Uf5Slp5yWloRnbnicbKJkfHGleJyYcGingpiMfKV6oJaDlnKfdoCJlJWPuW6QiqJifZmilolucmmqa3WgbW+mYJtpi5BploealXWigH2aX4uFjHVviGJooWWef2mbdXBkZ4iCbnOiWl9bZKFuXYmMb3t/c3JkpW54omRmp2iYcouYbqFvUoiPbqBeZKdUi11UmG1tcmpxgW1waGt4c2tvUVhWVWVZU21JWE9cSFhpaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxygnt/c3aNgIN2XlFzYWdicGdQamhoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqrGxpp+Lf5aqnJ2ki6GhmaGhgJWYk42aj4uXkI2Ke4ZxgIhoi4p8l5pzdIl9kHtlg4eViomWmYJ8iIaWppCBoquQhZCKgYp9f3+Oc2mPpYR9hZOMh5ifjYeSqqaeiaZ4lpx+pYmWjLKZnpGDr5efpXmXiHmpdKWPhJpupaKMkoSMg7xufaWvgoaGh5SXnaB9pnpxqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm5un56RlWJ/q4uqd4B/jaefd599haSVnaBpmod1q2aerYy2c3a+jKSTWYOmjathdXFzb3t0cWJqfm5obFNWWlVgYFxqTFxSXUlebG12YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDcoN+gXt7jIGCgHZieGRjbnNkUmxnaG9tcmlmaWFfXlxhamJsbHpvXFxiaWFtaXdtZ2xuYpWmqp2BgJ6klqqqnqinrqOZiIGWqpmdo4mapJyonYSLmo+FnJGFko2LjXSFeoiDb42EfZeTc3WGcpGDbX+LkoaGlI99e4KFl6WNf6WljYCNiYSUdYKHkm9si6iAgouTjYicnomMk6qjoJCAdJSXiH6BeZSvpH+CnHGPhnmSjISAe3KnjHF9fXqXlpuEjXh7fn6IlJWTineRmaChhHt9iWuMhVt5eXN5cGlufpKJcX90gY+Uk3GFg4JljX9fgYCMeHZ0lHVve29uiW6Ehl93aXiOZoKCho6qnH50fZdqiYhvf3V8hHVtbGaMc3d7l3eEW2pYeY9obndxcG93eG9dbIZtaWdWWl9XXGRrZFVhVV5RX3B3eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV6gXV/gH+BeYuFgn17bX9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHB1blpbYmtka2t5bWhsb2GOlbqpp4uhopumpJmknauioIODlqqRnaCImaaaqJiDgZuLfpaUh46KiI1ygnyPfX6PhHqXjnRyhHCVhXt9kouGhpCFeH6AhpijjHunoYuFj4+ElYKGjpd3cYSqhY2RnI+Hnp6Hi5qooKCrg4mOlZt/foqXraiQk6eQeHGek4N7k29+qYVwfZVxam98gZ+Lf5KOjGhtXYOMjJycn45zlYuIcXRrgnZ0gFlyboaQgX1+i2ldaWN6hYOIgF9peHucfIONg3aBh4NpeYyIa2Jxc4N3X3KNgomQp5WGZo2Pg253i4NvhIx4bmRmY3mCepVaXGlmbnZbenh3dG1zcoJmXG2Ka2tiWlldWVhrcVteYFleXWZzfXtzb3Rjamppe3xyend0ZG10aGx7fnV6fHt5eX+Af3CGioR7fXN+eXJ/aFRccWlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VubGdyeW9oam1gjIyrsaGQo6Gan56Ynpmpo6F9gparjJ6Uh5qhkKSUf3uYhHySmYiIhoaKcn2Ai3aFi4GElopyb4BymIaEfpKDhIaKgXqAhIuan4+CpqCHeI2XiJWLi5yXhYN6rIGQl5mTiZ6dh4ihq5+ioqOLiJObnaOZlqqiqKehk5yJmJB8eY+OhKh+f5KRkpOcsaWalJ2QjrKTmISmjIyWnKCJkZuCiZKKa3yOdndlgoaQinyJnYSHi4+HiICFhJB3fHt1m6OJiIufi4aVf36NgoF2cXSGhX94iYeKkaaRhIaOiIOMkIt7homHjoB1a4GDe3mZaXJoYHSKcH16dnVvd3SBXV1vh2huX19aW1xSZ3FVY1tbYWxodHt8cm5wZGppaH97bXh+cGhvb2xmgHtygYB3f31/hHttg4yGfHp4fH56g3hOZHZqc25xe2VrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqKhmJWZmJSYpKCde3+YqY2ejIWfnIqdlnx4lIJ7jpmJhoOEhm14gYBygId+iJOEbWt+epeHhIOQfoCGhIZ9h4ONm52RhqmegnGKj4WSkYuckX2NeqmDjJGXlY6bloaGm6agopqdhoOSmpmYkJqmoKaenpCWgZKLd32IjoSle3yPkJCFmKqgnJOcj42qjpKAno2JlJqfg46XfoaOgm94hnF1YX6Ej4Z0i5eAgo6ChoR+hYSUbnl2dZSjjI6Gm4WFjnWAi319c3N8iYR7eYyPhJOnj4aEj4KDiomJdYWGh4l7bmp9f3ttaGtsZ155fmd8e3Z0dXV6d1xgcH1tdGBjWlteUWZtU2VaXWFqaXV5fnBsbGNqameAf2tyf2tqc254boR5boaAdoKAfYV2cYKNiH57enyAe4KLYGl7a3VoaYNlamNgaVtjdWhvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5ORlpeLmp+enXt3nKWQm4mGpJSKmJl4eY2FfImRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hoSHfI+Aj5ubkIemnH9wi4qLkoagoYqFjHynj4aOkpeTlpJ3jaOgoZ2Wmn+BkJmYk4yaoqGjmpiRm36OhXqBhI6HoH9+jIyOfJekoKCSmZCPpo2QgZuRiZOXnH6SkX2GjYB1dIFwdmB9gI6GcYqVfIeKcYx+goWFjmh4cnmNmZKQgJd+iItzgoh9fXJ6fIyFe3qRjYOWpZOLhZF8hYaHhXWBgoWGeWRxen54eXBsaWZefXNofHV1c3xyf2peYHR2cHdkY1hdXlJqaFRkWF5gZ2p2eIFxZmtjbGdlf4BqbX1nbXBqfXeGemuLgXKBgX2BdHaCjYZ/fHqAgX1/j2lyg250aWKIaWxiX3FVdG9tbmB4aGxXanR2YnV6e3Fia295iY2fs5KlpZ2OkJiPhp2gmpx8daOfjZd/jKGKiJqWeHuGh36DiX6IgoF/cH56dHWChX6JkHdnY32Gl4uCio14fYCNg3mWgJWXlY2Vn5p9b4uBkJOGpZuHjImDpZODkYqWl5KRdpGdoaGYlJh6f46Xlo6WmpyknZmTlJt6kIaEeYWWjZ19gYqNi3KXop6gkpiOj6KMjIOXmIOTlpp/l4x7iIyAdnF9bXpjgHyLhXCGk3+PgWuHgoF/iYRmdm99iJOZjn6UeIyJfYCIfXxygHmKhnqEkYqLmKKWgYOMd4iEgoF2e4CHg3Rfd3d8c313ZmtjYH5panZzdHV9cXxjY2FzbnVybWFZX11aa2RSYldfYGhrdXmGcGJqY2xmaHyDa2h0aGxvaH98gXhtj4ZxgIKCf3R8g4yBgH56goN+fJBtdYl0dG1limxqYmN1VoNpcG5geGdsYWp2cGZ5e3lxX3FshYWQna6Yp6iejo2Xh4Wfk5aYfXaom4mYeZaci4yYj3h7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5WIfoWIdH1+in9+mISWk5aMo6CXfnGHe5OQiqaPjI6Kkp+QgpCPlJeRioGPmKCakpCSdICNkZOJnJ2eppiYjpWWdI6Pi22GmI+ZeoeIkIlvl52aopOUioyfjIaCkpx/k5KWh5mIe4mJgXlxeWp1bHt/i35thZGCk3dvgoN9fouAZXNqfYGXmIV/jnSRiYR6iH52eIF+h4F9g42FjZSkkHmFgnSJh31/cnR/hYFsYHp0eXB8b2FuYmR7YW5vdnN3d3NzYXZgb2t1bm9dW15dXWpdT11XYmFobXN6iWtfaWVqY2h3iG1mbGhpbGeAfHp3b4+Hc4CDhH10gYaJeoN9eoGEfX2OcnmLeXhubIdraF9pcmOHaHFvZXZnbWxhemhrfHt4cGF3bYuBmZqqoaSpnoqKkYaKnoqVl312rJeMlnyek5GWlIh2fXuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+RhoCEhHN6gIZ6j5GHkZGbkqSak4F9gHyNiZGjiI2KjZeZjIWRmJOVjomJjJOdk5CMjW6EkI6RiJ6ZoaCXlomXkW+KmoVnhpmOlHqJhZCKcJaak6GSkoiLmYyCgJGefZKPk4yaj3uKhIZzc3VrcW51fIt0boaQjZFxdIB8gYKIfGVxbXp+m5R+hYl0kYuBdIl6b4F/goh9hYyKhY2WqI17iH1+i4V3fnBufoOBYmd3c3RuemJdb2BqdF5wanp4eGxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4hlXWloZ2JncY1uZGlnZGlogHp3dW+OhHOBgYN7dYKIhXiFfHeDhXqAind/i3t7cnmDamtfcGhzf2txbm1xZ29rZXtibn95dnBrdneJf6OYoqihp5uIjIqBj5yGk5x0gKmUkY2GoIyVk5B/c3t2hHd4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYB/f6CGj4qRnJegk5Z3iX6AjIecnYmPhpKXlYOIlJmPlouLjY6NnYqOkIRuiYuPkYqclqCbmJWGmIhrhaSEZ4edipF+i4SLgXeTmJGdkZCIiZWOf36PmHyRjZCOmpJ9i4CCbnZva21vcHuGaXODjpeKcXeAdIKIgnlndG92gpuPfYqFepWSeneKdXGKfIeNe4uGhImPnKOIfIR2gYuAeHhuan+AflxxcnFvb3haXW9gb2peb2l8enBtbWptd2Bwb2pxbVlYYGFhbVdRU1llZmJ1cISCYl1rbWRjZmuSbWBmZl9na4F1cXJwi4B0f4KAeHaAi4B5hn93h4Z2g4V8hoyAe3aKf2pxYnxihXxvcGx0amhubHZ3X3F+eXt0dXN/gn6llZqtn6eWhYyDfpaUg4+edImfk5KFipqMlY2LenJ3dIJvcoVzcXWIbG5sdW2Id4N9f21uVVGBq5SHgnmAdnKCeYKggpGBkpGXm5GZd5B6gouRo5qTjoiVmJGDhpaZi5OLiI+PiJ6FkIp8c4uFiI+InJmem5aUgJR/aYadiWiHoIiShJGDiXGDkZePmo2PjIuPjXd7kpB7joyNkpeNfIh8gGt2aW1rbGx6f2J5fY6VgXZ6gXeDjHx5aHVtdYiWjH+JhnuUkXJ6hXF4jnuLjXuJfoONkZ+ehX19eIGLfXdwaGuAgHded29ta3FyVl1uYXFhX21ueXBncGZmdHVocWthd2VdVmVgYHJTUE5bZWRdeHCIfF5caHFiYmVmkWlfZ2RbaHB+b2txc4p9dn2FgXR1f4x5e4aAeIiDc4aFfoyMhHx5lXhmcWqDX4d+b29remBpbXR/dF90fHiGd3NzhXx5oZCasZyljoKKf4KZiICLnX6KmJKOhIiXjo6OhHZ0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYmcf46BeHqMf4iMipubnJqVk3mNd2mJkohtiaSFk4iYg4ZjjJGYjZSJlouNiYtwepWJfI6JipKRiXqFfH5tfGVyb2treXlbgHmPjoF6fn5/ho56emh0bHWMkIqDhoV9loxsfn9vgYx/jYh+hHuDkZabm4t8d3iDj3hzbGVwf4JraXRvZ2hzbVNebmRwWl9rcXhma2tiZ3hzb3FjX3dgYFZrX152T01LYGZjXXlxinRcW2V2YGFlZY5jYGZiWGlyc21rcXaLfHR5hoJ1dn6Lc3+Gf3uJf3KJh4GRioh9fpl2ZXNufWWIf29wa4Baa255eXNgdnp7jXZyd4p3eZ+Mm6+boJCChXiIlH58iZyHhJ6QjoWMl4STjoeBdHdweXBuhG9tbn5yY2R4cHxuenxqaGxjpJrB3K7voXNrdYN1hKGEkW6Vj5SflJqBkXCFi6OXiY6VipCdlYOAlI+EiI+AkoqKl36He3V/iXiGhY6bmpeZjo91indwh4mMfoylhZOKnYWGXouUl4mOiI6LioSJbHyXgn2IhYmRj4Z2hX5+a31jeHRpbXhzV4h6kYeFeX5/gIWMfnlmdGuBi4+LhIOAjJeGbIJ2bomRg5GFf4J7gZGXk5mQdHR4h4x1c3FmdHmBYXNtb2FodWZSYHBna1VebXN5YHJjYGl9cXJuWmJyYWJXblpcd01NTGNmYV52c4ptW1xkeF5gZGaEX2NjXllpcmtua3J3i31zd4SBeHd8iHGDhH19iHt0i4iIlYeMf3+Yc2h1cXltjHtudHCAV3B5dnlxZHZ4hoxpdoCKcoCdiJmnnKOShHxwjJR4eYqdg4SfjY58lY2AmYeEe3J3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IhzbHOAdoqaiIxpl4+OnJSSgYhwhYigjoSKlYqMl5N8jZKIgoiPepGLho+CgHd4g4Ryh4KTm5aTmIaMdYd/cYaCioiao4SVjZ+EiWGDlY+FiIaJjIeAh2h9lH99g4SJjo2CcYZ+f3J3Z3ZyaHN3a1qMfZKChXyAg4CEioJ2YnRtioKRjIN/f5ORfW6CbHmHkIeThH2CfoGTlJGXiW5yeoyFdGxwanF3f15zaG5caXVfUmRxaGZTX292dF9vYF1ognFyaldnaGNpWG1XW3VMSkxlZl5icnOFaFtcZXleXmRnemFkX11Za25lbmp0d4p+c3KBfnp2eodzhYN8f4d3doqFj5iCjYJ7k3Zsd3Z5eJN1bnh6fVh5hXGAb2d4dpGCZHaGhXGKloaZoZuiioZzb5KLcnaOm32JmYiJe59/hJl/gXhxdG5vZHJ+aGZsd3dbX3h7enFxf2lhZ2F/1baOkKZ4bnF3e3GSkIyGapiNiJuRi4Z7aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N7cYaAlZmOkpOBiXWEh3eEgIuTnqCHlpCffohhf5OHg4eDiY1/f4JmfZGAfn+CjI+Qfm2DfIJ0a213dXN2dWtjjYGOf4V+fIR/hIh/cGBzcoZ8kI6DfX+SiXpxg2Z7hIuHjYR8hX+BlI+Rk4RucHmMfnRsbmlqeXxhZ2lpWGt1WlJpcmliUGJyeGxiZV5aaoNuc2JbZ19kbV9uVFpvTkhOZmRcZ25xgGtaW2NzX1xjbHdkZV1dWmxsYm1qc3aGf3Fvf3x8dHiFeIWDfICHdXmJgZKVfImGdomBcHh5e4STb217gHZeg390gW1penOUc2dyiH1ykpGEmp+boIaGdXWUfm12k5d9h5CDio2ZfIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lY2hoV52PXnFylrzEhHZxlIiPfXGWi4abkoyHcmqIj5aAe5SMgYSajHyKhXx7iYt/lIh1iYZ2d32BcnWGgZ6UhZSPg4NygIl1hXyKmZ6Zh5WOnICIZn2Tgn6Eg4mJcoF9Zn6MfHl/f4eLj31pgH2DdmZveXhzdnNsa46FioGKf3iCgIWDf2tfcnl7fo6LhnyCj4F+coFpeYSIjIaFeYR9gpiMkIx9bm17iX12c25nZnt1YltwYlducVNTbnNoYU5mdHhlYF5dWW+Ab3NZZWFeam5gcE9Za1FEU2dgWmtubXxuWVtebWNaYm93ZGdcXWBraWNsanN2gYNwbX98f3R1g3qDgnyChXZ+iIGWkHiEi3SBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0bJONhZ+YoJmEiG59jHZqeJiOfoCJgpSXiXmPlm96c3BsaWRgc3poX2Vxelpgcnx5Z3F6YWVlj7Gyd0piWqTZ0JZxe5CKj3d9k4qEmJGMhW5rhZKSenmShoGEmIp8hn94d4mKhJaAb4uIcXV+emp5hYOlkISSjIN/b3+DdoR5hpuZlYyUkZSEiHB7koJ8goOIg26Bd2iAhHhyf4CDiod8ZX1+hHZjcHOAaHhwb3WZjYaDinx2eICEeYFrXHF/c4KJhop+hol7iXKBbnGFh4+FhXOFeoKZjY2EeG5vfoR/dnlkZ2l7cF5YdlpYcGxOV3FzZ2BLbHZ0YF1cWll0fXNvV2ddZmpxYG9OV2hSP1lmXlpvamd6cVpaWWtlWmNxeV9oXF5lbGhla2lxd3+Hbmx/foB1b4J7gIJ+gn92gYWIl4pxgo1xe4Z8enmEk4x1anp/a29+dH99b3J7epNwb4F/eGeSi4OhmZySgoVmhoNvZ3mViH1+hIGYiYF8jYxpeHJra2ZfYW95bV9ib3hcZGuCemFxdl9lZdTqvYsyOj6Ljn9xeIWIjo12gpWMfpKNjH9tbIWMi3V9j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3RmeYKDp4uCjouEfW6AdXeFeoedkY2RkpOMi4Z/e5KGd3+DjIJrf3JogH54bXx8gYqDd2F5hIFxZHFofm11cXWBm4uAf4WAc3V+gXOBb1xuf3V5i4OLe4eAfIh4enFsiYSQhItyg3qAlouKf3Rta3eAgHR0XGhndm9YVntSWXBkTFpycmVbSXB4b1xbW1lddH50aFliW2dlbmNpTVdmUT1eZVxddWZgdXBaWVRvZFlkcXlaaF1fZm1naWtpcHd9jmxpgoR+eW6AfHyBf4J6dYKBjZOEcICLbnd9gHt7iJKJf2h7fWpze3KGe3N3fn+MeniEfXxrjI2Em52WjICAbI19a2h+jYt6fn6Dk4J+fYqIa3VxZ2hiW2Jnc29fYWtzYGhwiHpic3ReY2SboI9uXDVar7V0aYCIfJKGdoWVhXOOiol2cGyFgoZ0eYl4iXyTiHp+cmd1iX5+mG9xhn5odnluZnmHhKSHgIaMiX5uf3aAgn6NmoiClJGYiYuEiXyPiHB7fYR7aH5sa4B7eml6doGHgHJgd4F+cWRyZnSCbXV7hpWRgXyCgW93en11fmxZcIB3dYyChniIdoKJenhzboqBkIGGc399f5OIiXpubWpugoF0bVxnZHJwUVp6TVtvXE9ccm9kVUtzeGlXWVpaYXGAdGBdXWBmZGhpZk5aaE1AYGNbYHZhXXVtWFdTdGFaZG9yV2peYmhrZ21saXB3fJJsaYSJfHxwfn57gX+CeneAf4qLg3F7iG9xd4N/e4mNj4Nqfnttd3h2ind9eICCh3+Dfn56bYSMiJijjYSDenWLeGtsg4eQeH16gZGAgH6Kg3BycWNmXllmX29vX2BncGZqb4l0YXRvW2FkanZ7gL+cpqTIuHGFg3KSfHiGkoJzkIuHcXJvg3qCc3WHdIh3lIh5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgX9/jo99c4B0hXqBkpCDeZaOlY+Igoh7iIhreHl+dGd6aGx/eXNpenaAg31oYHeHfWprdGd6gGl2gYyRlH56fn5wfHd8dH5iVnh+c3OKhIJ9g3GHind4cXCEgo1/fnl+fXaOhYN2aXFpbYiBcG9dZ2FxbUpldUtdbVVUWnNuYlFPc3hgUlhYXWFvgnNbYVxoZWVja2RRW3BJQ2NgW2NwXl14aFVWVXdeW2VuaFZrXmFpZ2VubmhwdnqSbmmIjHh9cnt+eYKBgXx2fYOIhoNwd4RybXeDgn2Ji5N/cIB7d3l6gYx0g3h/gYGChHqAdW9+ioubnoh9hXp3hXtndIWMj3l+f3uIhYN2j4BncG5fZFtYZVltcmFgYHBsa2iJbmF0aVleZG6Ad6naqseGh7JxiXdvjHV7ho1/epKJf3RzdH53f29xf22EdJSGeHVrYHqCeYmPZnGEcGd2blttfICQk3+AeZGSfXh7boh3gZKNhXSWipGOh4WFe3+EbHR2fm1ndmVte3Vtand2f398YWJ4hXlodXVifXtndYaOjZV7dIB2cYB7fW1/WVd1f3B1hYd/gXlsiYZ0eWx1gISEfnt9eXtzi4F9c2d0ZW6Lg2tzWmledGRHbW1MWmFXVlZ3bWJQUnR2V1BWWF5hcYRvXGBjbWRkXm9jVV5yRkJlX11maF1bemJRVVx1W1pna2FWal9gbmVma3FocHV4jnRrjo11fnZ4fXeBg4F7c32DiIeDb3KAdHF1foWBiY2Ke3d/d4N7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN4Xn2FmIt4hoN0hYaEd4l7Ym5tW2FaW2FWaXNjYFtnbm9mh3FhcWZXXGNrf3zKzoe5oWptbYpscYRxfIOJfnqQhHl4c3l1dXxqbHVjhHWSgndvZl59gnqLimVygmtqcWNYbXqFm4iCgXOWk3Z+fG+KcYKLjYhymI6RiYWLg3t4fXFxb3xmaHFibXhxamtxeH18el1leYB3aXZ4ZoJ3Z3SHjI6Ue3GHam9+gHlufF1Zc39udIGLfIJvb4p/cXZod3+BgIF3fXF7dYd9enJmc2Fui4FqcldqXnZbSG1qTVZUXlNVe2thT1R1clBRVFdeYnSFaV1ga2pmY1luYVlkcEdAZ1xgZl9cVXpdT1VkcFpbamhdV2hgXnJma2dxZ3Byd4Z4bpWKdH96d354g4d/dXJ/hoWOg3Bwe3h2dXqGhYaMhXp8f3SLfn2GhISHf35+fYd/fHh2eXiRk59/jHyLbXV/eGSChpWFc5GKb4WFgXqDdGNuallfWl1dVGdyZGBYZHFyZoFzYmtlV1tgan94vq57oLZuYnOGaHN7cXmBhHp9i353d3J2b3t2ZWpuYId1joFzamJef3h5i4RmcX9oa2taVm93iaOBhH9xmZJxgHl2hG6Bg5OJc5WIjYiEiYV9eHRybmh4YGptYG12amdqa3l3enZaZ318eGVyfm6EdGV1hY2Gln5vjGdreoN1bXRiXXF9bHV9jHuBZnWHfW5xaHV/eH5/c31se3uCe3hvZWxibol9a21WaV92VUppak9RTmhNWHtoYU5VdWpMUFRVX2Z1g2ZeYHBoZ2FXaV1cbGhKRGpZYWRXWVR4WU5WbWpZXWtkXFllY150ZmxkcWdyb3WBeHCZhXZ/fnd/fIWHfXVzgoiAlYNuc3l7enNyhYaIiIN4gX11j358hIqOhIKEe36Lg3t3fHd3mp2XeoqChml2fXtsg4SSf3GOgXCFgn6Bf3BmbGdXXVpcW1NkcGReV2JydWl1cGVlYldcXGl/cG9ygHOJZGR4fml0dXRygYN3gIN5dnN1bWt6cWJna2eGdI2DbmZdX31we4l/aW14Z2pkVVdyb42mfIR7dpaQdHxzfXxufHyShneZfIiGg4aDfXRwcWxndFxsaF5sdGRnZml6b3tyWWeAdnVocIB4gnZid4WLfJSAboxqbXuCcWZzZWFuemdzeIp8fmJ2g3Zqa3F1e3F6enR9Zn5/gHl3bmNmYm6GfGxqVWlib1JKaGpPS05vR157ZmFNVXRjSk5TV2Fqdn5lXWdzaWVgVmNXY3BdTEtqWGNhVVRUc1ZMWHVkWl5rYFxaY2VfdmdtYnBpc25yf3V0moF3f4B3f3+GhHp8dIKEfpeFbnJ0fHp0cYSFj4GAeYt1dJB/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx6dYOBi3puhHN5hH2Bg3VuamhlVl1bWlpTYm1kW1hhc3tpaG1pYGJXX1tqgGlrcIBna2BoeXhqc3R0boSAen98dXVuemhqeWpfZW5ogXaQhGdlWGJ3an6He29pcGdmXVVYb2eOqHeBenyRjnl1cH9wc3Z6j4B4lXWGg4CFiHZqcXVnaG5bbGRdbXJfZ2FqeGh7bVtugnJ0am+Afnl4YXeFhHiPhXOIcm95gHJjcWlccXhkcnSJfHlic4BwZ2p5dHFseHh1eGSDe395d3FkZGNufH1ra1VoYWVSSmtnT0dRa0VheGdhTVNyXUpNVFpla3Z6ZV9tcWlkXVZgVm5uV0tTaFdlXlhOVWxUSlx5X1tfa11dW2NlYHlobGBvb3Vub3h1eph9d4CBeoCAh4Z6eHmCfoGThHF0dH95dnSEiJF9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSrn396iIiDa3KBeXWAf4F0boZufIBzioBqb21kZFhfWllaVGFqZ1taXnSCaV5tbFxhVlxcbIFlcXR9aWlca3Z1Z3N2cm2Fe318eHVybHlnaXhmXWVyaHp3k4FjY1RlcGeChXd3Z2hqYFdWWWdjj6dufneAi497cHF+aHpveo18d49yhH1/f4ZuZHVyZGhoXGthXG9vXGdfbXVkemhddIBvcmtxe311dmJ0hYt7iIeBgHhydX91YXBtW3J0Y3FzhX11ZXKAbGFse29qaXt6dXJmhXZ7e3ZxZWJlbXN+aWxUZ11cVEtyYlBGVmFHYndnYUtUb1dKTFhYZ2t1emRlbnFmZFpXXVh2ZlVKXGNXZ1hZSVdlUEhieFpdX2xbXlxhY15+aWpfbnR4bm9udoOXeXKBgHx/iYyGfnV1hnmHjH1zdXWCeXp6goyOfX6EiWlzloF6ip19foV6gXp/fIaIc3GPrYx7e4ePfWVxh3lzfHt1cm6FbHt+bI96YnBvYmVdZVZZWVZjZmtfXVxyhWhYcG5bXldaXGx7YnB3dm1iWmxzc2d0dXBshHh+f3h3bm50ZGl0ZVtndGZ2dpJ5X11SZmZqg4J0fmJjaVxUWF5iY4+kaHh0g4aReG1ve2l4bnyFe3WJc4B4fHh/aGR2bGBmYF5qX1xza1llXW9vYnplW3d8a25ub3d4c3Rkc4OSfoeDiXt2cHJ+c2J4ZFxwcGJxcoJ9dGdygGVebnZpZGZ5fHVub4J1dH10cmJfZm5vfWRpU2dYV1NNd19RSllYSGJ1ZGFJVG1TSk1aV2lscXtibGxzY2JaWlthd1xTTGNdWGlTV0hZYE1GaXVYXmBsW1tfYmJchGlnYW54eWxvanaBkHhtg36AgZOIhIF2c4h0jIZzcXd1gnd8fX6MkIB+k35wd5WDfJmSeYCAeHp+gHSIg3RwmaJ7en+JlHhkdYd4c3h1a3Nufmt4fHCRcl5wb2BnYmxUW1pXaGNtZlxbcYllU3JuW1pYWGBsdmNpdWppXlltc3Bsc3NzaYR8fn57dm9ubGRpcWNba3JkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEkXRsbHtub3B7fHxxgXd/c3p6emNldWhdYlpgZ1tedmhXYl1vaGF3YFt7dmlqcm53c3J1aHGClYOGfYN2c2pxfW5md1hdbG5jcnOBenRnb35bYHBxYV9qcX1sbHV+c3F4a3BhXGVsbHphZ1NmVFZRUHVbUU9YUUhjdGJgRlVrUElQWlVra2p8ZW1ucWBbWlhZbHFXU09mV1doU1RGWVxOSHJ1WF9jbWNYYGBhXYtqY2RteXhrb2l1eYZ7a4N9f4SafIKEeXyHbo+GcW93en10goJ8i4+Cgpd0d4KThYGfiXWBgIF0f4Jxh4J1b6KXc3uGi4Z7ZXeKbm16bmZ3cHprc3ZyjGtedG5hZ2VrUl1bVmdhbGtaXHCMZE9vbl1WWFVnanRnYnRlZV1ZbXRtb3V0eGqGfH97h3aPc2Rka25hXW5tY3N4h2taVFZjZHh9fXGGXWNfY1RaYFlilZVjbnCDhYp0a2h8cGZzd3N8bHp0dW96fnVeZXJjW15WYWRYYXRlVV9gbWRhcV1dfnBoaXNxc3B0dmtthJOBiHqEcXNnb35xc29UXGdrZnF0gXdzY2x2VWJya1peb2Z9ZW13fXNzc2ttYFpkamp3XmZUZFRVUFRtV1FWU09HZHNfYUVYaU9IV1RWbWhkfGlrd2phV11VW3RkU1JXaFFZZVRTSFpaUE14dlpfZWxpWWJgXl6ObmFma3l1bm9odnZ/f2yDgH2Hl3uAh4GJfmuTiHJndIB7dYCCfYiOf4uTcnyKkYWHn4Z7f4aMc4GGc36Cdm6ljHKBjYt2d216jGBke3BmeHJ4bG1xdoJnZHtsY2ZnaFNfXlVnX2xuW15tjWhOaW1gVFZTb2dzbGZ4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVxeX5nWlZYYGx4fHtwhF9iXmdXWF9XZJuIYmtwgYd9eGxreW5cd3Fse2p2c25ve4ByWGltXlldVWJjV2RwY1NeYWhhYmxaYH5rZmtzdW5td3ZsaYWMf4l5h21xZnF9bnNuY1phaWlvdIJ0c19pbFNlcWRVYm5iemNxd3t2a3Bta2BZYWdodFxlVWFVUk5YZVJPXE9PSGRwXWNGWWlNSV9LWG1kX3hobn1jX1RfVF11XFRTYGZOXWFUU0pcWVBZdHVdX2VsaFhjYVtejXFjZ2p4cXNuZ3Z0eoNygoN6iI5+fImHjXlukIp0bHOCdH9/h4WGkoSVj3l+jI+HkZuEgHyMhXOAgXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2Ojo6Njo6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2Mjo6Ojo6OjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2trrFhQERERERFOC4vLy8vK0iFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0uFkwNTU1NTcnHB0dHR0YOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fX59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZqSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRiYWFhYWFhYSDg4OCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5CKkY2Nj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyOjo6Ojo6Ojo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx9fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeJh4eMh4qQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhoqHho6GjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+Jh4iHjIiJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aHh4aIhomPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH1+fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2KioyJjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KHjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eX1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyNjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHR0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo8Pj48RUQ+P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnJ0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTk7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTk1NTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojk5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXFxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QUA/PDs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl7e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA/PDtLRzg4Ojw5PT1APTo8Ozs8Ozg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BxcnJydHV2ent9fXx+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj45N2RsOzg6ODg6Oz0/Pzw7Ozw7Ojs7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fH19fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXtOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNBQD9AQD09RklKa3lNPD49Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx9fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBfVFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkVDREJAQENbQVF0fYF9e1w/QEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD9AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcG9xcHJ1dHd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQUJAQW9jf4SFgoN+aT9CQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHREVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgICAgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRkNKdoCCgYR7gIV0RERFRENXdYaJin5YR0lKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpJSVF2gXyAhIGDiHBEQ0FVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNDREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKVXiBfoKEhoaHg1VObISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N1dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pYfYOEhIGDh4eIfX+GhYSEhoaGh4eGinVJSUZCPz9APz8+PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3J0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISElJS1F2hIaEfoGFg4OEhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lMSHGGhYF+gYOCg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc3MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0RLe4aEgYKDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojo6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09RV2tycnR0dXd6e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PU1+hIKDhISEhISGiYqKiIeIiImKioyKiYmMej46ODg7PD0+OTo6Ozg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8Ozk7PDg6Ojs7OTk5PD88PEFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojk7Pz9BSn2DgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PD5ARENVgoOEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4qLXj5ER0lLSUlGR0hERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p5en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUE/QkNHRWiEg4WFhoaGiIiIiIeGhoaHiYqKi4yNjIyLioqIV0dMTE1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lLS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AQEE/QkJGRktKdYSDhYWHiIiJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA5ODw7PD06P0A+QEBDREhIUFt/hIWEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSUdFSkhESkhHS0pISkdHR0tMTkxMSEhJSk1QTk9OTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDk6PDg9Pjs9QT4/QUNGSEpUcYOEhISFhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4teUlJQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgICAf39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBRklJTlR4hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTlNUT01TTFBTVVZSU1JQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkVHR0dHSEY+QEI9Pz09Qj9CQ0ZWTkVMTk1RVnuGhIWFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0xLR0hJSEVGSUhJSElqc3Z5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQkNHRURFTFhSTVNUU1ZYfIaFh4aFhoeIiIeIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU290dnh5eHd6eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTV1lYWll4hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRXWFhZWm6BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin9mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUVVSVVNXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XlxWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmJh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUFFOS1JUUU1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSU1RaXW1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUENDQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdISkdEQkFDQE9QTVJkdHV2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIOCgoCCgIKBgWtMRz4+Ojs+QD8/Pj5qUEthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNCPz88PUI+Sk1GVW91dXZzdHZ4e3x6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFDQVtcT3tOT09OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx9fX1+fH59fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJTVlhTUllUTllaW1dZXF9fYGVgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZDTFFPYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojo2NDg2OTc5OjM2NTc5NTxCPWZ0dHZ3d3l5e319fHx7fH19fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUFFVT0xSU1RXWVRUWFFMWFlZVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNQT1NaV1RUTVFTWVNcZVVPU1RSTkxJSEM/QTo5ODg5Nzg4NDc1Nzg1ODlHbnJ1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KTk9UU1RcVlJVU1NPTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3enp7fH1+fX58fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9KR1BQT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFPUFBRTlFPUE9MSkxMT1BOTlBRUU5QT0pNTU1LR0VFREI7PT08OT1HNjY3N0RucXV3ent7fHx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUE9SUVBNTU5MSkxLTE5PT1FNT09NSU1MSUxLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PT1BQEI9PkVIRkRGRklHS0pARkFBQEZIRUpPSFFSYVxRUFJOU09PUExMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZFP0NDPj1CRz9CPkFkcXR3e3p7e3x7enp3fHd5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87P0FAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVBNT05XS0xOS0xNTUxMS05OU2RNSkxSSElKRkFJSkxNTktHSUZCQUJAP0VGRUhETG9wd3p6eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUS0pJTVRGSUlKTEpLS0lKTE1PUFJQS0dDTEhEQ0pKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NGR0dHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0ZIS0RISUtNSEpMSElKTEpNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2dnt4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkcEZLQ0ZFRkRFRUZFR0NDQD48PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1HSUxHRkZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1NRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUVEQkNCRUBEQj4/Pjo7Oz07PT9DQT9BQ0ZHSkdKSUxIR0dHRkVDQD1FRUI+QURDQ0VHSUlHTVBJRkZHS05PS0ZISUZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSU1SVVVST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NBQUJEPEJBPkE9Ojo9Pzs+P0BCP0BCRUdKRklHSUdGRkZFRENBQUZGQ0JCQkRFRUdHSEZMUExJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVTWF9eXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01GR0VHQkJBREQ8QUFAQzw4OT0+Oj89P0I/QEBERkhFSEZGSEZFRUNDRUJDSUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9OTlBNTE5TV1ZXWFZYXVpdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJGRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISkxGSUhKSEVLS0xMTk9TVE9JVFVUUVRQUU1OUU5NUVdaVlpZV1pdWlhhYGBgX2hlY2BkZWdnamhoamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURCQ0hFPEBFQkQ8ODo+Pjw8PUJCPT8+QUJGQ0VCQkhDQ0RFRkZHR0lGR0pIQ0lIR0lHRkRIS0lHS0lNS0pLTEhMSk1LSU5MTk5PUlVWT0xWVlRRVFFSTE9RUE9UWVpZXFpaXF9fXmBjXlxhY2tiYGRnaHKFaGdpZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdHJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJFR0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREZGSEhGSEdJS0pFSkhIS0hGRkxISEhKSE1MTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJlXWRgZWdgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXd1dXV3dnV3c2d0cmtxcmtyd293SUpMSUtHQkVERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFREZHRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTUpKTUxNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFhYGNkZWJjaWNkaWpndotsa2lobW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3Bzd3R1dXd2dXV1ZXFza3BxanJ2cHdKTUxMTUdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0hHSEdGSkZER0pHR0pGSUxISUpNSk1MR0tJSEtLTlFLUlFMU01LTk1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZWJhY2luaWNpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0VBQEQ+PkRFRkM/Q0FFQ0RGQ0NFR0NCSUVCSEpJSEhLRkRLSkdISkhJS0dKSk5LTkxJTEhKTUtaZkpkXEtsUkhPTV9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxrVV93dmlqaGhmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGQ0NDQkVFREZCRkZHRERKRUVKTExKTE1HR01KSEpLR0tKSUpKTkxNTUxMSUxNTFtzYmRwXmxsVU1OZnNeZ2ZxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9cb3VncE1Lcnl2a2Jha2VlbHhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FCPz1CRUdCRkNFREVFRENISEdERUtIR0tNTUpNTEZKTkhKS0pJS0pKSktNTU5NTU1LTk1NW3Jvb25wcGxrTlBRbFhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhvY15rZmJncHBqaW9wcHJzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hGRUVCQUI9Pz9FR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSU1LSElNSUtKSktOT05OTUxOTUxcaGR1XWxxV2xOUFFuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWRpdHlrb25xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRkpMS0ZNS0xSUkxHTU1ITkpISE5ISkpJSE5PTk5MSk1NSlpzcHBvcXFtbE9RU29ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnRzdnRIS0hKQ0VFRUBAPkNDQUZDSEpNSUZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTUxJS0tLU2tiWmleX2pjcnJaX1pqb2BlZVVrX2NbYWJRYG1oXGpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga25wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFydXR3ckhIRkpERURGQUBBRURDR0JISkxHRkNGS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpJS0tJSElHS0tLS0dISkpMTExLSUtMTlRbXVRQVU1RUE5PT1VSUE9RT09RSkpOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV6eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdKTEhER0lQS0xPS0xXTUlGRUhJSkhJS0hMSkhGSEhKR0dJRUZLSElLTkxJT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKRkVISFBKTE1KTVJJSEVBSEZKSUtLSUxKSEZFSkhFRkdFRUpHQkpNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjYFlfYltgXltUWVhaX15kYmJhY2ZpZWtycG9wcG5ud4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tFRklJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUJGSkRASktKT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJYVlZcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl4eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERESkpNTUxMSEpKSEpHP0dGTktLS01LS0tJR0hEREBEQUhJQT9JSkdQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUVFdX2FjY2NjYlxkY2JkY2ZYUVZVU1xYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0lHR0pGRkZJTEpORURKSkxOSkxJS0pJSUdCSEhRTUtLT0xLS0lIR0VEP0VCSEhBQUdGRFRdWV5YX1hfW11VWFhQXV1RS0pXXlheW11WWmFSUl9fYmJgYGJiYGNiYmRkYlhPUlFTXFNcXl1eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktKTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTExLS0hJQ0VBRUNIR0JBRkVCVlVFXFRdU1ZgWE5UVU5aW01KS1VgYVtfWF9eYl1PWWJcYGBfYmNiXWJiV19fVFBPUFFZU15cXF1dXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNRRFdfSUdHSERGTUpQUEZKSUpLTkxMS01LSkpHRUpOUVFOT09NTk1OSEtBREFDREZEQ0FERUFMSENMTFBPT01GTUZGSEpIR0xMTU9QSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUVVUXFlZW11cYWFlZmNoZGtscXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1HSFlNSEhKSEdNTFFRSUxKS0tOTVVOT0tLTEdHS1BTU05QT05PT09ITEZgRURfTERmY0RNW0heXHNtT01WbVlMQ1BfVWxXZ0pdV1VeRExRVUxNU1ZRUlRYV1RYVVRcVFBmWmhoZFlUa1RYV1VbXFtgYGFiYmJgZ2lnbmxocnp8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USktHYFRISk9KSU9NUlFLTUtMT1JVUk9PSkxNR0hNUVtZT1BQTk9QUEpLUX9RSXxZWXJzV1BtSHFub2FWUHFxdE9Ca3NucXRwU29fW25YXVZcWFVraFVdVmNZYFlaX1ZVV39qdHV1X2F2X1ljXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxMT0hLUlhXUU5PT0xRVE5PUVBLS05HTVBTW1pUUVJPUFBQS0haeF1UeGRoWVJTUHZndGxwYm5ma1JyT0x3bWpycHNycXJwb3CAXWZ6dXhxcXpxfnJ9a3V9YlJofGVzc29zc3x9cH55b39yX2BgYmJbYWBoa25rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEtRT01OSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dRVFBQUVJLR2d4bGN4cW1aS0xUeXB1bXVibnZQZGVJZXZxbXdvgGpmeHhpWHJSaXttaWp6en5seHp/cGdvWHZ2anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVmaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3V6bnx9eXhybk5KUnROQ0JFUFBIS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWRoYVZuTHFwXkdoeVd2VEtoeX14YHl7c25hXm1vZFNncnVubXlwd2x2c3RxbG1cc356a215fGx1bXxrcHZ1eF5fX2JeXV9lZGpoaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tTEtaVkhHRUdSUEtMTktMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPTk5RSVJtSGl3S2BkdnVVV2xPbmx7cmFqZ392VUtXa2h9bG1seGBbcHp7X2B6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlaGZlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1JXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1BKSFFOUFVMS0tSU1JSVFBWVVFRT1JSWFhRTlBVVFhYWFtbVVNTV1tXWFdaUFNVV1dYUV1YVl1VU09YUlZXV1haYFtncl5bXFtdXV9jWl9jY2VnZWNjYlpjY2dmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJNUlFQTFZWVFBUVVhVWlVSWl1WVVRXVVlYUE9MTldVUU5VU05QTkxRUEtJUVFLUU1LS09RVFJRUVNTSUlNTk9RUlFRUVRWUlhXXFdTU1BSVVVWVFpRTlNSV1VUWVZUWVVTUlVTVFVYWFdeWl9hXVxbWl1dYGNcXWJiZGdlZWViWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkZGZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlRcYFZXVllVWFRRUEtPWFRRTlVQTlFOS1NQTU5VU05STk1OUVNQVFFTVFVOTE5PUVRUUlJRVldVWVpbWVNVUlRYV1dZW1NPU1VXVVRZVVZZVFJSV1VWWFxZW2BdVllfXV5dXF1gYV5bYmJjaGZlZWJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWVFRPS09XVVBPVFBQUU5NUVFPUlhTUlFPTU9TVU5XUVRVVU9OTlFTVVVUVFJUWFZaXVxaVlZRUldYVltcVlBTVlVVVllUV1dUUlJYVlZbX1peYF9WX11eYFxcYGBfX1piYmRoaGVlYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTk5SUFJST0xQU1JVWlVUUFBMUFdVUVZSU1NYTU9QUVRYVVVVU1VZWFteXVxbVlJPVVZWW1tXUVNXVVZYVVNYWlRTUVlXV11fW19fYFZiXGBhXmBiX1xgXWNhY2dpZWdhWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeX1teXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3l/Y1xbVlZZUk5PV1NOUVJRU1RSTFFUU1lbV1VPUk5TWFZTUlRSUlpPUVNTVltWVlZUVlpYXV5cXF5WU05UVlZbXFZRVFZWWFlSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkaF5cZWBhYGFjZF9iX1laX1tcW1lYWVdXWltaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1cYFxgVVxdaGpyfXJsaFxVWVdRT1JbU1JRVFNVVVRLUlZVWlpaU09TUlVVVVNOVlJTWlJUVVRYXVdYWFNYXFheXVlbXlVVTlZXV15aV1FVVVhYWFRWWFtUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVnXl1kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFtVVVdWVFRUXl5gX15iXGBVXV5ia3l0bH1sWlVaVlFRVFxUVFRVVVZZV0xSWlZcWlxSUFVTV1VVU09XUlNXU1dWVltdWFtZVVpeWF9eWVxaUldSWVhZYFpZU1VWWllaVldZXFVUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZmViX2RhX2FhYmJfYF5XWF5aXFxaWVpXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFJXVVNSU1hSU1ZUWVhYXV5YXVtVXl9YX19YXFZRWVVZWlphWFxVVldaWlpYWVlaWFZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYltmYmhmY2ZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaV1RcVVZXWVdWXGBhYmNhY19fVltgZGFfenVvaFpcWlZYVlhbWllcWlhZYFZPVF1bYGFcVVVZUFRWVFJWVlJTVVdbW1xfXlpfXFZfX1pdXlleVlNZWFpZXWJZXlZXWltbW1paWVtZWV9fYGBkY2RlZWJkWmJmY2dmZV5hY2BjXmNjaWVkZ19nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVVYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZWU1ZUWF1dX2BgXWFdV2BeW15cW15YVlhYW1pfX1tfWFhdXF1dXVtaXFhaX2FeYGRjZGZmZmJZY2ZlaGdkXmNhX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFpYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYmNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JZWVBXVldYWFdWV1ZdXV5gYWFfYl5ZYV1dXlldXllYVVdbW2BeXV9ZWV5dXl5gW1paWVtfYV9iZGRlZmdnYlpkZmdpZ2NfY15gZmVaaGljZmljZl9iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcWFpjZWNhUlxZT1hWWVtaWVdaWmBeYWJiYGFjX1xiXV9dW19eWVlUWF1dX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZWdkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXVlhQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9hY2JhYV1iW2JkYV9jYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2ZlZmVfZmZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6e3t8e3t7e3t7enp7e3t8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0s7WVh4mJiYmKjI2NjY6Ojol/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/v7+/wZqKjIyMjIyOkI+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4OEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXp5enhvb29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2BgYGBgYCBfnx8fHx8fH19fX1+fn19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnh7d3p6en55eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp6e3t7e3t7e3t7e3t7e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx7fHx6fXp3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHt8fXl9eXd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6fHx8ent6d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6enx8fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZWZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoKCgoGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcIqQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uJg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMj4uKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiYeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIjIuJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSkpCLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCgoKHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFg4SEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OCgYODgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoOCg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoKCg4SDgoKDg4OCgoSEg4ODgoOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGDgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgYGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgYKCgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKBgoKEgoKDhIKDhYWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GBg4KDhYWDg4OEgoiOg4WEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OFhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+NjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCBgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgIGDgoGAgYF/ipmFgYKCgYGCgoGAgoKDgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGBgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgICDgYB/fnuBmIyAgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgYmDfn5/gn2PlYKDhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOFhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KBgYGBgICAgICAf4CBgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgoGDj4OBgX+KhIOShYWEhIWCf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWEhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhISDg4ODhIWEgoWSgoqGhYKBfoKGh4aDgX5/fn5/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYGAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDh5KChoSHfn5/f4WFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4OEhISFhIOCgoODhIOHjYGBf4eCfn5+gIB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGh4eHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDhISEgYCBi4WAf4CBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhYOBgIODgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWFgoCCg4ODgoKCg4F+fX1+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiEg4SDhYSEhYWGiIiGhYOCgoSFh4aHhoaEgoKDhIKDg4SCgYGBgYGDg4SDhJGSkY6PjouHhYaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiYuKhoSGhIKGh4N/gYSDg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GCg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4OEhYOCg4GCg4OEhYSHkpGPjY+MioWEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoGAgIKAf4GDhIODg4KCf319f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5/fn1+g4SDgoODg4J9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF/fX1/gIF/f35/gIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359fn+Dg4OCgoGBf319fn6AgIB/fn19fXx7e3t6enp6gIB/fn9+fn59fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f35+f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoOBgYKAgYKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp5eXl9gH+AgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIKCg4SCgoKCgoF/fn19fX5+gH19fX19fX19fHt6eXl5eXmAgoKChIOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOChIKAgIGBgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoeFhYWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359f35/gX+AgoGFhYWHhoeHhoeHiIaHh4eGh4eGf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhYR/fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgoGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32DgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+f31+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/gYCBgH59e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gZORjIyNjY6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKMjIuOjYuKhoSFhISEg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42LioiEhISDhISDg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHx7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJGOjIuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3x9en1+fn+AgIOHiYmJioiLiYWIkY2LiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgYB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiYyQjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5/f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn59foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+Ni4iIhYSEgoGCgoKCgoKBgoKCgoGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjIqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGDgX5+gIB+foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXx9fX18fHt8fHt7e3x7fHx8fXyJioiIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgH+AgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoWGh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX18fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX5/fn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKEf4OCgoKCgoOBgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX+Af3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3x6fHt8gYB/gn9/gYCCgoGBf35/gYB+gYKCg4GBg4OCg4KEgoGBgYCBgoB+gIB/f31+fn19fX59fnt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+AfoB8fX1+gH5+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OBf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fX2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn19eH5/f3x8fH59foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgYSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChIWGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4ODgoGCg4KBg4J/gX9/f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH99gH99fn5/f31+foCBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4F8fHp7e3t6e3d2eHVyc3ZxeHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/fIB+gIB/gYCAf32Af35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/fYB/fn9/f319fICAgIGAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6enp4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/gH18fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYGBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/foCAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f356gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fX17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgYGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e41+d3d5fHx7fXx8fHx7fXx9fX19fH18fn5+f39+fHt8fXt9fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYSDgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKAf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBgICAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXx8fHh4dXh4eXt8fH17fHx8fH1+f39/f359fX6Af4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGFg4OEgYGDgIKDgoGAgIGCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAgH+AgYGAgICAgIGBgIKCgoKAgoGBgYGAf3+Af4CHfn58en18e31/eHd2eXl6fH19fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7enl0cXVud3B1enJ2eYWFgoOCg4OCg4SEgICCgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgICBgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKChoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGCgoCBgICAgoKBhIB+gYOCf3+Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6c3B4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4KEgYSEgYOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhIWEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH96e3x6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhYWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgYCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4SDgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX56fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChoaFhISDg4SEgoSFhYKCg4OEgoOCg4KDgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/f3x9gYGCgoODhoOEg4aEgYOIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KDg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKDhIWDgoKDg4KBhIOBg4OEg4SEhIWEhISFhYWFhIODhH99gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4GAgH+AhISDg4SFg4SDhX9/goqLhYSEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KDg4WCgYSEhYWGhIKAg4eEg4SDhYSFhYSBhIODhoKDgoOBgoKEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhIWEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeoN/f39/hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgX9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDg4WFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN+g4N9gX1+fn1+goOBfH+AfX+Afn18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhoOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9f359gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOGhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253Z3d6bnB1gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WEhYWFhIKFhYSFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFh4aGhYSFhYWFhYaJiYeGhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFh4aHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGhoWGhoWDgoWFhoWFg4WDhISFhIWFhIWFg4aHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn58fX1+e3x8f3x7e31/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYSGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaDhoaFhoWEhoaFhISFhYOFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXt8fn1+fnx/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFhoeFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoWGhYaHhYWGhoWEg4SEg4SHg4SBgoSEg4GAgIF7e359fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4aGh4SChIOEhoWGhYSEhISEhYaGhoaGhYeFhYeFhYWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoeHhoaHh4WHhoiIh4aFh4eIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f35/fHx9f317fX18fXp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHhIeFhoaIhoWHhIaHiYaGiIiHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFh4aHhoaFhoaGhYaGhIOEhYKBgoGAg4OCgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYWGhIWEg4eIhoaGhYSGiYaChoSGhoaFhYeFh4iIhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgYCBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIaFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhYKCg4N/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOFhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg39+f4B/f4CDf3uAfX1/gn2AgX1+gX59fX19f3t/fHt6eXp6eXp6fHl6enp7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoaGhoSFg4WChYGBgH9/gIB+f4CCfX5/f36AgIGCgoSEg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAgIKCf319f35+f4R+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHx7fX59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4F8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fXx+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt9fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dTV1NTU1NXU1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19jc3d3d3d3d3d3d3d3d3dzb3Nvb29vc29vb29vb29ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLmzeHNzc3Nzc3Nzc3Nzc3N6goGBgYGBgYGBgYGBgYOLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmTIpKysrKysrKysrKyspNUVDQ0NEQ0NDRENDQ0NGU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpps4LzAwMDAwMDAwMDAwLztJSEhISEhISEhISEhHSldXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaugRT0+Pj4+Pj4+Pj4+Pj1IVVRUVFRVVFRUVFVVVFZgYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Oz87Pzs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crKysrKysrKycnJycnJysvLy8vLy8vLy8vLzMzLzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7O0tTPzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bX19fX19fX19fX19jY19jY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafR0qig0M/RpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs7SqY+t0c7Ozs6bt7akosCTnqzTzs7Ozs/P0Z2PxbSeo6fWr5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvqrifmpOdwJ6YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZ2omqGctJicop2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImen5uWrbmGnpavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBoJibgaCWeJuEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5qFn6iInHmfqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDTdrSwppyKva2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+FoJWml5edpaeWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJjCoqukm9Cfq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iHzsaQjbfXwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTUx8PV0dXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLW2vL2+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnZGpkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwsbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m9urq0v7i1uLOvu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamdmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWRmb2lla2hYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2diXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8G/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmFhTkhNP0VAP0RDPDs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcrGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT0+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBwsO7uLO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDuMCwr7W4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nrK+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXVpVSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBwr7YwLSxtLK3vrmztbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcPQ0rTItLSwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SUJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLJ1cmXzsS0srS2srSvrbu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG7xbzBy83CjqfJubS0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OzpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ysrq6t7e4uLu0r7SssK+knLC2t42JtbqyrbOwr6yutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGvvcqypqitlYuNdnB/hJ+MhaG3tKuytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsaOlqJ6gnJWTkI+RkJiQlpWYlp+Ym5mbo5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpb3Uq6KdnIBsgXRhY2Vyg4qbt7Wvr7O1qqetrKOcmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZabl5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6kqK6trKurr6qvqZ6XnqWdnqWmpJ/Az6mSfHeBXmuRdW9lX26QoL60sbGwuK2noZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmJyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho5+ewseZeGNhilxXgouQiGxSianDs62trLCnoJ+ioJeRlJugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issbSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShn56anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOemaidrp+nnpyhnZ6ampKZnpyhoqCfp8m5iGFadpdaWGFtkI9+TnS0xrOnqqyqpZ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqefmaagn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxoreksKafnp2dl5iVmZ6bnKOfna7RqnNZZIyJWFtvabetdlpZoLqzrq6pq6agnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqquo52rp7axrKKvpqGjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHFra3VycGhXW1FFVEhESU9IPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn52szp5gX4iHd3iFh3WejXJyc5SwrqekpKKgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsDFvrm0ubq0u7ewtbKqurGuu7e+urqqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrZGhveGplWltGS0xFRFNMREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz49Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJuercmYVm+fmXmSnH9renqNprKqoJqdnJ+empeYl5KMj5eXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbHysfOv8jRzMfFxsTBu8PAvr6+tb2zrb+/wsLGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E/PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopaisraqhnaOfnJ2aprfMkVR5oKR6e25mb5Gpsaykn52gm5iXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K0tfR19LU1tPTyMzHzc3J0szO08zFx8nKwcXLxsjIxb7CsrPIxMvKys7Fyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo56ko5+gpKrDzopYeoaEbmhxkK6vpZ2dnaGloZ6alZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTSz9HD0NPW2NXW0svJztHLxs3RydLV1tnV19PW2M7Sys/RzM7QzNLPv8fGysPMzMvOz8XGx7bAyr/RzMvPxcnHv8PCyM7Mz9DPzcrIzri3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSEk+O0A4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wsWxtqiipaahoqu1z8+PZHt9b26Ura2clZignJuhop+cnZqWindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDO09fW09XQz9LT0cnT0cfQ2NfY0djS19nV1szPz8nN0cvOz7/FwsfFzs3R0NHIy8zAysvF087LzsjEycbGyMzK09PR1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1FNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq64qKu319TV2dnRztDAvMzJt7+vp6upo6SxtNHHjG92cYSprKGYlpiam52hnZqcnpN9cWVjYl9fYWBfYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0NTV1s7S0NjY2NfLyM3DyM7Mysu/yb/HyM3Oz8vQzc7Lzs7Hy8/Qys7KwsnGyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPDMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspa2uvrSwwNjS19rc1s/Ny8TT0MLBsaqtrqulsrHEoW1sbpChnJWTl5yen5+dlJaYlIlrXl5eYWRiYGBgYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVyr/KwcXMwsjJwszDxcjKys7KzczQzdPLxcjPzMjHysTGwMXKy83P0cbQzs3NzM/Fx8C3ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbWdgYHFoWVhoVkxGTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzs8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfCuMvV1dna29jMzc/I1tXFw7ewtamiray4vKFvbY6ajYyXlZCUkpGWlpaQjHxlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7Gyb3Cx8nOxMHHwMfNx8PLysvPx8PE0MjGwcXHxL7Ax8vLy87CysvIx8zQxMXHu8fDyMjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrP0NLUycS4vLyupbaqvrqhd4mWjo2Wj4aDhISCfoWFf3RgXF5eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8fKycjKyMHFzMbIy83JxMLLycHCy9DEy8i/ucG7xce9v8bPy8O/w7vJxsi7yMbEyr+9wsvGxcS+xby8v8PEy8XEvMDJwsXH0sTAyL/KycbHxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZqjoJuUe3ZzdGZpWmFubVpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvP0czHwsPHzc7OzNXP1dnY2dDM087O0MrDtsS/tLK6r762iH2VjJOXhnqAhYaAdnh1cnFfWltdYGBiZGRkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcPGvr61wb3DurzGu8K5s7zFxMLCtr+1tb2/usvDvLW6yLq/vcvDwcXCxcjGyMbQxsLMx7LHycPOzcHFw8C9srewsqeoqLmwpa2wq62slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGw8TIztLLysrHzc7P0snQxtXU1tfOzNDGy8fJxLzIv66wtrS3r4KMjYqLhXiAhoaAfoR8dHVkXFxdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLKztLq1vrG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bAwry4vcbBw7u1rrK2ur60xLe7tau4vb2/vbC6tq+2urLFvLauu7+0trTFvb7CxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7bDvb22ub7Hv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDMzsjKycvJysTPzdLPz8bJxMnEwr67zLqusre0squMkIaJiXt4foaGd3iCfXRoXl1dXV9gX2BkYV5kZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquts62pq6m0rbawsqmupqyyvLq2w7m6urGrtbm7tMK6sL+xvby7trzHucK2raqosLG/tbe8r7CnsrO0u7yrrbWlrrauurGwqriwrbuuu7i7wL+9ucK/x8PFwbzGwcjLuMXHxb/Gw8O5xMbCu8bJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs7Sy8PGwsXQx87CxMbAxcXDw8rCycvBwr/Fvre5ucezr7S2r62mkYmPkXx4foqFenuEgXdvXl1cXV1fYF5fZGNiY2NiYF9dW1taWl1aWlpaXGRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCkpp+qrbW2sb25r7evqK63tLS8uLS8r7i5tLG8wbHArqWooquxsrOnvKqrqKusrbSzpaitoaSuqbKlp6itpai3rLCyt7q6u7G7vb6+xL+1wcDHyLe/wMS3xMK/u7/Ewr7EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XR0M3EyLq6zMLMv7zKt77Ev7vLuMLEw7e6wLq1s7nCtbGys6epk4OJjYF8foB+eHR/fHN3Zl9dXF1eX2BeX2NjYWJgYF9dXVxaWFpbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSdpJuYkqGjqqOin6Wlp6Wsn52bpKassq+2t6ewrKeqtKq0urG2ta22ubGvurmxt6SfpJ+msaerqLmqpKeoqKeyraCnpp+bpKWsnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubnCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZl9rb2BUWV5ITmdPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelJ2hprq2q7Ozu7PE0MnLw8e5uMnCzcC5y7i8xrm1xrm1wMOwusG3squ0u7aqrK6lm4SHh4F9enV0b21rampxaV5gXVxcXF5gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeVmqGWm6KYlo2eoaKmm5+fo6Whp56bopufqrCtsbWiqaqpq6uktLmtt7CssrWusrWusKqfnZ6jorKkpqm4raKmpp+orKqZn6CemZ2fpZqao5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7OzubO9tLaxsbW0v7a9wL3Dwbq7vZeDenJrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDIyMHHvLzFxM+/usi5ucC5tMO2sr2+sL6/uKiksLSxoaipnoiGh4B4c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaRnKGiqJ2bnaWmoaWcoKCamK2ura6yoKWiraumobSwsbGsqK+yp7qzprahop6bo6Gto6Gptaqio6adpaajlpiel5manZ+al52dnJysoaumo6Smrauzs6q0sLKqsrm0r6mvsrKzt7Ouqayusriwura5vb+3srGUhXl1ZV5lXltZVlNaVUtcUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLNyMfAxrfBwMjPuMLFvrS7u7TAuLS7vbG3urWloayzqqCnpJR8hISAeXBydHFpZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYWFhYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqmcmpqqpq+wq5ujo7eqoJ+uqLappqetsKO3sKS3n6KbmJiqpqGarLiwoqGknKKgoJOVoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxsLCur6anp7KusbSvvLS6t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Oqu8C9wLmutLjCzcnGw8S+xrjJzLPCw8Kvvb23vb63u7y1tbexoqGqs56elpuGgHx4cmptcnRwaWhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKannpyfpZ+qr6afoqO2qKChoqi0oaWnpK+lsK2stZ6gnZWUqaGilKyxsZ6io52dmJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFJIUmFNV1BPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepKett7u8wcW6sbm1xcrLwcTHx8i3xsW0w8DHrLi5v7i/vb65uLK0r6Cgqq2Wln+Rh391bmRiZ2loZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWVtXVVhXVFRXVlNUUlVgYF9gYV9gYWNkaYGTk4iQjpSSk5yUlZajmaCWnKCloa2lpKOio6GbqqulmZ6lsamgoJ2lq56noZ6sramorq2ioaKUl6ObnJCqqLCbn6KfnpeZk4qekY2Sk5WQmJiTm6GinKSgoZWgoaSmm6OrpaKkqqSrrqWtsqmmpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlZSR1FPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6PDw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njo4Njk4OTg5OzlAOXu1tK20u7Kvq7Gtnaenr7m5s8DIurXAr8bJzbvCy8zItsq+sr/Fyq6zusS4vsO/ubmwtK+eo6inlI59i4R8dWlpaWxnamxta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eXl9fYmRtjo+EkYeQkY6Zk5SSnJqinJugp6iqqKqmqKWjmKSupJSZpa+pn5uZm6Cer5mbqrOfpaafo6OhlJOblpaSqKmsmpyfoaCalJCMmY6MkIySjZaVkJ6hoKOcm6KVm6CioJiiqKOiqKugq6+krrelo6SirK2qqKuusreyvbWzq6+YhHNzaFtYWFJVUkVYTFFbWU1VTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaevrZupqKy3tqy8yru2v6zMx8a5ws/Px7TFvLi8xMqyrrrCub/Bv7i7rLKpn6KmopSKfYF3eG9uaG1ubXBoZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/jJCKko2XkZeZoqCbn6qppq6qp6+jp5mfrKCVlqSop52XkI+anq6Wl6eqmZ+clKWhnpKQk5KTlaeqpJqZmZ2dlo2MjJSGiY2DkIuSlZGgnqCjl5WflZqgop2Tm6Wlp6iooLGwprG8p6CjrLSrrqewtLC5tcCxrbGrkX1xcmJWVFZOUklHVlFSUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6u8LL0MqyuLm9v8LFs7K0uq+3t7+4u6qsp6qmpqGQkn9rZ21ucm5xanBrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKl4mUlJebmZ2omp+ppaSqnaeYoKWbko+eopqXloWEkpqjj5OinJWWlYeimpqTi46LkJqjppuVlZebkJKHlI6MgYuNgJCKkpKSoZqfopWUmJiVoqWZjJikpqimoZ+0sqiyt6Gdoresqq2ksrKmtbu1q6uxo4l4cm1dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8fGuLvEys3GtK27vra5wbGvq7OfqbG+tLWno6WspqaVipd2X2Bnc3F2cWluaWVoaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEjoqUkZOdoI+am6Kho5iklqGblY2HmJqMc42CfY2XloWQmZCTjo57mY6cjIKKgImYn6KekJOYloSOgpN+fnSJjnqQh5OQkJ2amZqQlZCdjqKjjomaoKGjo5uitK+sr6yfmaW4pqawobCunLC7qqmvqpmCdnJiVU1ST1BNQ1NOTFFNQlBRSElOU01ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTE3NjQ3ODk6OjY1Ojg3QTd4t6KjtKilpqijpqWmpqazp6W0wbivtLDKxbi6wc/GvrOtu8Ktr8WvqqSpk6CpurKqqJmgpaShjIeSbFdXX2hnaWdobmNqaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeLk5Cfl52VlJaUjpaJf5OJXztXb3uLlImAi5KMj4WGc4qEloF5gnqFlJ2Ug5aOkI+Dhn2SeHJvhY1+iYGRjY+XmZiTio+JnIeel4eIlp6aoaCXp6+praionpets6KmrZisq5intKKpraOTfnJtX1tOU1JWTERUSlBNTEZOT0lGTFFNS09KSU1QRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6KpsKintMG5sLWwyMO4tL7PwLmvr7bDqKzHq6WfmoSXnrWooaCQn52cmIyDiGNRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQX+VkZF9iZSMhIqNmo2VlYqSiIWVhniIf2BKUW54ipGEfYSNiYV/f25+f5R3dXV3hI2ZcFGNiIqHfH54k3Zod4aIfoqIlYqNkJGWi4SKiJSEmoyBhJKblp6clKSjqKmlpJ6bsKqhpKSQpaqWoamcoqaoiXVsZV5bSFFRUk1JVU1TSUxLT0lIR0tOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+tqra8tri3s8K8t6i6ybm2qKm2t6uzvqigmJCBjJasm5yShpmQkoyHgIBfTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJKBkpmLj3uGj4B1f3hzbnVwdI2NgXl9iqqFeXpodnuOcHJteIGLjJJ4eoB7gHZzcpJ3Z3WEhISEe5WJiIqMioB/hIuMf5SDe4CPmJWclZGfnamen6CdoKmln52YjKekk6Cflp6epIByZ2BcXEpWT1JHS1hST0pNTVJKSkpNUEhMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpijoZicn7Spr6mlraywsaq9tLK7uLa7tbKgt7uzq52eraqqtLCjnJOQloOQn5KYhn6ShIqDfn54YEtJSUhHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfXlnd42XmI6PfWd5gXZ4gImPfISYkoFyh498dntva36tfHOQin97hpKBfX90ZnZ8hmxvaHN8iYyHgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX2LenV+jpKPmIqSmpujlpmdmp2eop2WjYqlm4+el46WmI92bmxlYlpXV1RRSlNVVE9QTlFWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ+WoKavrK6rqKmwr7GrvLisu765s62om7GnrZyQlp2mqqWimZuRhpN7i5KPkXx3hnaAfHh5eGBLRkdGQUBDRElMTE1RUlBRU1VUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZXBybYinqsB+dXlie3hufHmIkHl8i4VvbYyReHN4amqAgnKWkYuBfZaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXdwfI6MipSDlpeYmpCTlZaZl56XjIOJn5GLko2GkJZ+bWhtbm5XVVdUUlFZT1JVVVNYVU1OSE5KTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6lrbCirKqota+urLS/q7zCv6aimpWlmJ6OhYyWoqKZmZKVjXSPe4KIjot5dXtxenRwdHZhT0VHREA8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4l2gYiGdGyakXRze2prnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxf3xncXF7bpONj3tzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlI+XjoB5iJeIhoqGgJCHdmpqbmdkV1FaV1lZW01QVVZZWU5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfprquq7KwwrG7w8eblo+VmYuNhnqFkZmVjpGNkYhyiIN2iY6KfXR1c3V0bHZuZVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHF8eG19bHKDgYWBeoSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBoZmJpbnJtcIJ1aW9YdXCOmpJ3bH97fW1xbXCAenN2bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6DgH6PenFwb2tgW1xdW1lYYF9TTltaWVhMSEpFSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoeWkZ6kp56vlaW1qa2xrsGyu8HGl5CMlJCBiX1ugpGSiYSLiI+HdoOFbZaJi354eXpwenJ7aW1eSlBHPkA3NDQ4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8fYWDf4x+dqKZeX6GgYWZhJucYYaqn52KgpCOeneIfomIjnOKl4+De1xkcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenB0eXdrbmldd4d9h3yIh4+Ai5OXg42FjYZ9cYR/hHx1d3t9iXVvcnNlZ19bWl1TW2ZeV1FVWVxWR0pKREtHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyNeIp/lIySnZ2fppGgq6CxqK/AsbrFupaOkZSIeoV2a4CMkoN+i4SPjXmDgXSihYx+foKAcoKAfGt4a1NXTEBFMjExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+MenyJhn6Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbHyBhod9jmhnaHh+boWGgoVxhIVHa4B3cnl2aG1rX3Z9g4h/iIWMepWenIqLiJF/e3WLdnx3bW93fn9ycnFrW11cW2NjWGdlXFVQUFdZUERMS0ZOSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpeSl6GdrKGmuK+zvbOXjZKLmIt9dHB/iZN/fYyDk5V9hn6GpYiJgIOIhnmIi391hnhfY1ZLQjYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzk0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoaGXlZuapa2Tmruxp7vHw6iLjKGlj5SJgZB7coOdn5GcfnaFhYqPh5BpaG+DgHSMhoSLcYaCd4eAe3aFfW52dWeAlI+GiYiHiIehq6KWiY6Yf3uCiXp6b2dreH54fXFqY11aWl1pXGFmX1pPTE5YUlFJUEtETkdDS0RDQURDQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnVwZ3iDe4CMgIGQj4uamqScoaymq6+wl5GRhKGUhHh3f4yUfX+ShpOWf4qAkpuOhIGCjIuCio6EgIp/bHBqXUNBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jKGemISShYKPoZ+TmJKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGWhpOKj4+WpbWpm42VooOHk4R+f2tqa3x/f4ByYFxjXllmalxsa15YS0hPU1FOTUxGSVBERE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuaFlwg3B1h3F2koZ+l5aalJ+fnKegqpaTmJ5nZaSafoSSknqAkYmRkn2KhZmSkYOAgIuNiYaRh4WIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGampmnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N8fnpvZ19bYF5hZmNgZ2dcUkVLS1BPSUpMRkZNQ0hMRkZDQkdEQDo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcXVgbn1id459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Ljo17ioaPkI6Cg4CJjIqFk4WDhoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dBQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKeotKyxt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsraqji5aYhaamoKKXgqaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWriZqKk4qVent+hH1mX2dbZGFdY2NeZmZfW09ESkhUT0ZITEZLSEVGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljWGpwWHqFdoGUhYiCm4OSkI2S2sidlnNWl4iPiJyPfIaMj4uKeoiCh5GOg4WAi4WFiJKGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJUVVVXVU1bUEdHRDw+PkZIQ0RANzs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHIxKuzxbass8CzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsbGbmZKan4inr6qklHafpJehq7GzmJapraiutbuyuqyvtaKxrLG1vLe1rrWgp6ejqJupsK2yuri4p5y3qY2lj5KToIZ5gYJ0WGBjVWVhYWJfYGZfW1RKREVMVlFJSkpESkhFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hn6AjXu/u6O8grSUk42bj4SIj5OJiXmHgIyTjIeFgY5/gYmPhn+FiIWKh5F6eW5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFdPX1VJS0pBQD9HS0ZFQzs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMq2u8S9s7TBt7jCtb+wt3SxtKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KRpbGtpa2rp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6uL+3ure5ra2xprGqrb6wvbvCwqyZu6iVrY+YmKqJfoF7aVZhYFdpZGlkVltjWVZUSUhHTFFHRElKQUhEPj9CQktAQExDOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWlZad2pwf4+EgY6FbnpzeIhiuKGao4mVlJaTlJONkJeSh4d7h4GNlYqAhIGKenyLh4Z9ioKBi4SVfXh6dWVPXGRHRUw6UWRhW15TRj47SFBEWmRRUVlYWmdaVGBhTVNPRUE/SUpIRUZBQEM9RTZCPkhHS01TWlRelK+4tbq5ycC7vcrMu73Au7e1vLu3vrW6ssZgdbKlsZqeq76qpairqqSisrWhq6eelZaemJ+upaempZ+kk6KnsLOosrK8tsG908nJ08bCxczCysPAvr2/u7y3tLC5t7fDusa+w8mwnrqqoqyPpai2iYF9cV5hYFxWYV5nZVJYYVZSVklFRk1LQD5IRD1LQj1CQD1GPTtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdtbHGQjYWQc2xzcnOI1cC1maCNlZmakY6XkZaWjoaHfYeDjZaLf4N/g3h7i4SHe4t5gYqCl390fXpsZXB2WV1cUGVlYmBlZF1bWFdcTWRtVVJtbl9vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVl1aXJO5wLm9t8bBu7nKy7u3ura4ubO4tbWutraZZHWpnq1wXqKtnJihopuknqullJ+fkJSPlpiXqJ+ln56amYOknaykqrCtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKv8nPtKS7sbWwm6y5vZp+eGpcX1tYXWBZYmJRW2BTUUtDQkVGRTxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQjIl8gYNze4qDhXyKdIKKhpV/c3t5bG11fGlzZWlsaWZqamlgZmlobVptdJetpLyHh2dbb2hdWllUSEpOUEpLUUxUUUhMQUpHS1BfX2JnamKXt8ewubO7vraxxMe2sLmxsLuss7Gnq7esjbannpynmk6bno2OoJaRp5illYqTk4iRiY+RkZ2boZiblZaHnpmmmqyvqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzcPR0rivxLzEuqa3u8SigG1iW1tcV19XWWVZUFxXTlFDQklFQ0k7QUQ+QUg/P0E3O0Q+QEk9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CQmYNocW95eYOgqp6ml42bm5iLjZWRmo59iYyFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2ltcHlpd31+y7/C36dtY3hvZFthYEpQUlVOWV5QXV1OUE5UUVVUXG5ud4Nylq64rLSosLarrb3Bsau1pqW4p6yuoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSKg5OVmJeUm5GbmJmZnp6rrKSnoaysztLV0c3M0tPT0NTRzsjD1NHIztLT09bN0tHF0tbGwc/IyMOpv7jQnXhsZFxhXFVeUV1aT09UUE5IPkFHQkNGPEFCP0ZFPkA/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bXdwfX6AoZ6eoYuNmZOTjIyTkJaFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBwd3Nsc3x8d3xzgnhxa4BycmlvcXp5c3u+y5p+jLGDdnKFd2hhal1DWlpbV2ZkWGVrVFhdXGBjXWN4e3+LgZmqpKSioKGop6qxuaumtKOiraKjrqKnsZ+JppuVk5GKko6IgpSJa5WijZmEgYZ+kYODk5eti5WNlZmOhZKQnZensKKgoKSkqMfNz8fBy9DT0dTSztPNxtbTzdTY1tbY1dfVydTazcrY1tHKrcTDzIpxbWJfXldSWFJbUEpHSklKQDs6O0VDRDxDRD5IQz9DQjs7OTw5R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKJgZ2VnpSFi5aJjoqIjoiPgHiDlJmLjYiIi4l+g3hze32Eh3eAe4eRl4GEb3hwbXV/dnh9dIZ8eWyHdnVufXaEdXl7nbWMPEGKxqV+jXxqZVdJQ2VjZmNoamRveVtfZmhrbmlugISIkYyen6CekZeYn6SkprKkpbOgoqWeoamgorGch5+SkpORi46LhoOPhH6cnIyNgoSFepR+gqqVo4ySipiSi32XipqRq7OYmpunnKe9w8W5tsXN0dDRz8vSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzbV2dW1jXFhSVVBZVUZGSklFRT06NzpAQUI6R0VARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXOGjXyXkZ2LfoeSgomGhYqDiH15hZeXiY+Dh4aHeoR5cXp7hIZ2eoaOjZ16jHB9b3B6f3J7gHGEh4Bujnp1d318gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnBxcG54d4JlaW9ydXhye4uHjpOSm5agloiMk5ugm5+qn6GtnKKamp+mn5+smYyajJGTjoV9iIeDhYuOoJmTiIOHfm2ZeYSZhoiTjI6VjIZ7m4iTj66qlJWXnpimrrW8qK29xsvIycvLz8jD0crU1tjX2NfV29fT2tvW0Nra0dbI1cyUd3lnZlpZT1JTXUhCRUlJPkE+PTg6PT87Pkg9QEJBQURBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fYSYjoeLfoaHgHeCeW57e4eCdHqSno2hdo92g3R1gX10gIRvgpCCb5KEdXyBhXp2h3yJuMalw8q4gpacj3hwZU5lY4J6gXeGopCLeXl3e4R/fIR2bZSWlJWPmJGDiY+XmpeXppyYoJefk5KXo52Zq5aRkYuOkoOMhYmIgYaQkZ6cmYmFi4GFl3uIiZ+XkImOiouCfKGIkIu8oZiTl5mcqKalrZ6ntb7Av7jHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvHhXl3ZWdjXlJWVlVNS0RORDs9PTw5Ojw+OT5BNz4/QD1APjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVtodHp5bImNknd2eop8foB/gH2Fe36CkYqFhnqFiHt1fXVtfX2GfnR/kp6Rn4OSfIZ9eI9+eYuKb4ObgHSZhn2CioV8fpF7kKmOkMOgvYycpJx+ioR9iXKMi39zppqcmZSFe4+RiYRpR3GhpJ2Mi5CShYiLkZOVj52bk5SRl42MlZ+dlKGUko6OkIx+kI+Oi4SIkpaan5+JjJSRnZCCjH+mmYiFjoOGhICkhoqLuJidkZSWoqegnZ2do662urSrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbt3d3dmlpY1VeWlNPTkhETEI9PT45OTs6OTk8PTZAPj49PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxc3iKe3t/fYB8iHt9e4uHg351hIZ5c3p0bYF+hH13hpuhm56UkoCMh3+Yh4Cckm6IqYV6oIt8kY+DiYScfpqRiY2jop+QpK+gi5GLhouBkoZXcq2Ln6ycj4SYnJCQjlyDopGCjZ+TlYyHiIySk4yUlZWQjI+KiJabnY+VlpGLk5SGgIuJko2Kip2XmaOihpOdlaCKioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispLzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2Z5ue3NlZVtbVlJVV0NASUQ/Pz46NDk6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieGxifpKDb213i3h6f3uBfYZ8e3aGhYBzcIWCe3Z3dnSEg4V9f5Kmop+mopeKnZCUl4qKp5dyirKNhKeShJmUhZqMo5agmJOJm56ik6mwoJGVkI6OiJWLbo23hJrEyLKdoqWbnZiWkbKQZKTNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhH+Pi5mIjpCql5eko4iZnpaaiY+Gl5iKhY+Ngn+Gj6WIjZOpmpeTl5mhmJ+Zk5yaorK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6BcX1mYVxcXU5JVFlBQkdEO0E+ODM3Ozw6OD02NDo6PDo3Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGPfXxtfoh4en57goKDf3Z2gIN8bW6Lf3p8eHh8hIeKfoujs6ejqrOil6efpaSWla6ig5G4lZGzmo2hoYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmZehwI6jybmrnKOmrZmSm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4aVmIaEkZCcdZGYspaXpKGInZqTkIqQipebiYuWjod9jJieiZCQnJqZk5iYn5SgnZSem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LR1tjT0Ni6cXh0W19UX1VPSEpOREJDRTU+Ojc3Oj88PDc9NDM2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p6boWGenyEeYGGgX5weHx+fW9yjXp+gnx4houJhoSSp7usqLK9r6Wts7Ooo6GwrIqatZ2iuKWVraSXqa24p6Wjn5qpl6mjr7CqmpmclJWRl6CYmru7rsqhara4q7CUmZ+jrJOXvaNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJaNi42XmJOdmbSXlaudi5yUko6RkoyZm4qSnpCLiZWfoY2UjZianZKcmJ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8fC0aDGyc3NxdfW0cvUoW95Z1tZUl1QT0VDPjxDQUI4Pzg4NT9HPTw2PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEo/i4p/gXOGh32CiXWDioJ/bXx9fX9wd4d3joKHe42PjIaMmarCwK+9xruztMC8tK2rs7aMqLOtrb2rm7ukqK25uKunpqKipKKpr7Kxq52cpJibmJeeoqalkqS6r6nAvK2tsrmlpah+iIacrbywg4yMi5CDjoORj3qBh5CNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpeOkaCRiZSbpKyUlo+UnJ2ToZ2bmKChlJqep6akoqSws6fBxsOvsLq2xcTCv82mx8THw7zV0c3FyodycWBaWF5aTEpCS0BGRz5BP0I7OjU+QT09NTw2PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRD9DRlxlR2BpZ1pdXJOMjIh7h4yHg4x1hpGKgW9+e4F/cX6Be5V6kpSUmJCTlaezxsm/wszCw7nHvLuvq7m7mLO3urLArqXBpKuwvL2rrqujo56nq660sKqcoKqcoZuWn7C1p4ujuru2wbysqZyypaSplIWOqcTDpIKLj4eIhIaVlI16hI2Rj5GijIyUkY6Jl5+Yk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+gmKSfmqCboJSYnqWjpqakr66lwMTDrqi3tsnDvrbPssS/xLyz0cnIwrVzd2tbVlpoUUxIQ0xLS0pBQT1DRDw1QUQ7OzM9OEIzMzIyNjJBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWU5lXGZUY2qZjZeKjIiTkIaJeYeUkIFygHyNf3iHgoKQeo6hlqiampi6vsfIycHSycrCzb3Cs628vqi6v727w7eswqmss7y+qrCqpKWkrK6zrba1oJ+vn6WimKOzvambqL3BpLa3sKyTsa2srZeHmqmnpZGCjJOllYmBdoqReoWNkpCen5OPlIuPjZSjmZaclJSjnqqfkaWajI+Pj5WWiHyPlZKSo5qVn6GctaWQnpelo6Klnp2mmJ6Wl5uko6mnorKsqLzAxK+lsrfMwLmvxLO7vsK4rcLDwsCYa3hgV1ZaWkpLTUpGRERIQ0JBREw6NERIOTs0PDdFLjEyMzUyQjI1U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+KoJOEeIV/lX9/kIiKkICWoZmupqSYwr3Hw8fF083Ozcu8wrewuby0vcu8w8G2t7yts8C6vK6vqKCpqLatrqmyt5ueraKnoZ6rt7iqpbC/xbG9ubSoqrW0rq+XlqWsqKCRjpKyxaeVjn2SlX2IkpmQqpmYk5OPkpWTpZ6SnZmUoaOinJifmIuMj4+eiFqQlpeSl6WZZZijn7OllqGWrKyqp5ueppeYlpiVoKSopZ+2q6q6u8O0pbO1y8C4qrassrq4rqi4ur24gmptWVZTVE1FSlJOSz9BSEVESEhIOTVGTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnBFaUlSZWJMRqWUnJeil6mWjZCDh6aTiIKHgpyDg5WQkJSPmqKfr76voca8xcTGxs7OztLKvru2sbq7u77PtcO9uLm3srG1s7izq6acq6y5qqmnr6+Yo6+kp6SltcCwq6y0v8O6wLq0qLm1ubOvlqWtrq6ki5OVoY10wZp9l5mEj5aajLGVm5qVkpOZmaWjlKCbl5qpnJyhoJmKjZCWnGBKlpyalZqlllWXsJ+vnJ6klK+urKWaoKWUk5mYjpygp6KZtKmqs7y7u6qwsse/uaasq62xsaOhsbK0pG9sZFtZTk9LRU9QUVE7SEpJR0lDQz46S1U/QTo9RU0wNzU0NDpCNDRNV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGYh4uolo6Ik4Wfh4Sdl46doZujpLXItanGusLDx8rJyMzNxr67s665ucHBzLXHusG5tbqwr6+ztaekm6q0taqppq2smqSupaSorLq/qKu2t77Cv765tLPEsrm9rKOvtay5poibl6abdr+fhJmdjpOZmouul6Gcm5aVm5+hqZ6nn5maqpmhp56YkI2RnYNudpKimpWdop6QrrKiqpSoqpeqrqSkn6WokpKZnIiUnKKdlrGnqau6tr2zsq2+ubego6eopaecm6ypqYxhZGBeUUpMRkhNSVZMPU1FTktMQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH9lXkhFq5WcoZ+7r5mUn4yTq5uRkpOJq42Hop+MpK2Uo6O2xr60wLrCwsfIxcLNyMG+ubKvuLTAwsq1xbLBvLS6qqmtrbCjo5iqtLumqaarqp2pr6ejqqu+vKitvbS4vse8t7a4wbK+wbSptbervqWPopiSop+8n4maoJmXnp6Pt5+pnKWim5yhmqils6GbnaacqKqemZWPlJuLl4mMpKKUnaKeobWvpaSTr6uZq6qdnaSjqJGVlZ+Dj56em5WppKGhtLS6ta2otbKznpyipZqXlZiqoZ52X1tfXUpIRUZNUUlNRUZHQ1NMSkJFR0FWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5Z1xGQ0OccGJHRaeXpJ+ew62bl6WYmqmclpubj6qWlaemla2smaKrtsTCvL63wcLAx8O/zca7vbmysLizv8LItb+wvLa4tqakq6ytoaGaqqrFoqSpq6aerK+roqmov7inrb6xuLbHtrW5uMCyv8K3tbO0r76jl6OWlJuUrqCQoaOlo6OfkL2kqZ6oq52doJumn72imaOfoqmroZ2WjZWek56Hj4SNk5+koJ61rKWblbGnma6mnpmpnZ+NmJSehI2gmpuTpaSamKuxtbGrpaqtrJyYoKCSjpCVqJ6UZ2JYYF1OSEdKTktIRURJQD5RSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNDZAOTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViVkyimqOcnsWsoZ+snp6uoJKjn5aln6aqrJe2saOqs7bExL2/tb/Cu8jCvsrHtbi1tLCzs7fBxba+sbi1uLWfpqyqrJ2dnqWkwaSfqq2gpKmtr6KmqL21pbG9uba2xLK0uLq/s8TBuLius7W1o52llZGUoa6gmaKeqKiro5rCramerK2bm56ZpqC+oZ2kmKurrKaimY2an5KfiY5Xf5afpqGguKqmk5i1o5+xoJ+arpaejpiTnYGOn5eVjqKjlpCmrrKrqaGipaWVlZ2Yi4+RkqSeiWBjWWNgS0hKSk5FRUFGSj49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtOnp+hmZ7DqKWitKKdsqiTq6Wgo5+tqaydu7CorLaxyMXBwrLCw73Gw7zEybyvsLatsLSvv8S0ubGwurSsmaiwqaqanaWhqMGsm6ywnKqjrrGppKi9tqe3u76vt8SttLPDwLPHtLu3rLS2raqippaVlKSsop+fmqirsK+vu7KmoKmompmYk6KkuaChpJOvr6ylp5+SoZ6Vno+QjZWemqKep7SmpoyYs5ujrpqdm62QnpOVk5l/kaGWj42foZOLpqywpaahnKCekpKak4WLkY2cnn9gZVpnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+joJygw6mkqrOhpLSqlrOsp6KksqyuqbuxrbC1tMbAxMO1wMS9ycS1v8jCtKu1qK+4rL/Ds7eurLe6pZmrsquqmJ+ml627tJunsJutoK60sqerubOourS4srnAqreyxL61xqi/r623tamnrKGXl5GmpaKimJilr7iusrW2oJ+opJqVlZOkoLeipKWWr7Gyp6qmop+bmpuWl6ifoJihnq+yoqaMl66YpKqXmZ6kkJqNk5eZhZWelIyPnJ2Ti6mpqqGnoJmelYyOmY+BhZWIlJ94YmhcampNUE1OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzukpJ2ipr+nqK+woam1q526saujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDFwLqptqSsu6zAwre3qqyyu6KVrbGtspalp5GquamfprCdq6CwtLOqqba2rbyts7O5t6y4sMO7vr+mw6uwt66pq6unnpiZq6GioZGXobGvs6ywuZqcqaCZlpKXpqG3qaWjorCxtKuzqKyfm6Cgm52lnaKXnaOzsJqfj5Olmp+ompSinZSXiZOWkpWWnJOIkJqZlI6oqKafo5uXm5OGjpiLfYyWhY6aamhsYGxuV1BRWlRBQ0RUQDs7SEE3OlhQZF5QVldFWV9dTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9qJ+doqq9oquwq6OxuKqltrSsoK21va6zuLu6vba2wMK/yMS5xMLAwLjEvcG3r7Wnq7exu76/tKmusbefl6uuqK6XpqiOp7ufpKyznqyisbCzrKq2tLW+rrCxtaywtbLBu8W3q72vsbisraqjsaaepaqfpJiQmZ+zqrOrqrOanaebmpWOoKaltK6noa2trrGntK2yqqScn6ijnpWimZuotamXmZGSnpmdn52Qqp2Wl4SUloqdmZyTio2Wl5qXpqWioJ2WlZeTf4+UhXuOkoKMlmVscmdvcV5GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoaSstqWtqqavrreqr7W7qKext8W3sbe9wcK1tLrFvszGucLAur65w7fAubK0q6m6tru5vrSprbC1mJinrKqsm6urj6u+nqyusqOrn7Cts66utrK5uKqur7Kota+0vL3Ks6q2tbG0sK+oorOgm6itoKaWlpqasqKtoKWvl6GkmpqSjqOmqLOpoaazrKq2pa+xta+kmZ2tp5qYn5qZq7eil5ORjpecoZeWlKuempJ/kpeMnZyZlpCJlJKemaWioaCYlpKTlXmKj4V7jIqDipJqbXhtdXthRWBqWUlIWlo9e0pGRDZBYlRpW01cYUpbXVpSUlJiYUxLRV5gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lVS0SZl6GxqLGqraakr662qbe1uqSstLfJu7S6ur+/tLO3w8DMyLzDvLe9v7+3v7yxva2nurm3tsK2qqyxt5SXpq6rqKOwqpSvu6StsbOnqKOytLGysbWxuLOprquyp7evtrTExraptrassK2qqaS2oKCnsaGklJyZlbGep5ygqo6po56clpimpqW4p6OytayosqeusbaspZmgrKibnJ6clKm4nJSOjoqYm6KXj5iloJyUgpGVj52bl5aViJaPl5qnnKOgkpaRkJV1hJCHe4WBhIyLbXB3dHt+XEtlbFxLTmNcP2J7R0k4R2dXZlxMXmJNWFlXVFdUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLT1FTFE8M3JrSUNDkJmlrqWtr6uopbGztKu3sregq7W5ybmuwLvCuLOxtcLDzsXAwb20vb+/ur68ssSnqbmwtra/vK6rs7KcoKexraalr6WesrWsq7GyraqptLustbO1rbSsqqyoram5rbKxyMC4pbqwqa2tpamusKalo6+kqZyenJuvmqOjoqORrJ6joKCiqqamuaSstbalq6yora+2rqOeo6mqm6CampKks5mOiY2HkKGglIyUnJ+SkYONkpKdmpiVk4eXkpWZp5ufnoySkY2Qdn2OhXx8fIeJiHBzcX18fVxTZG5eTllmXEZElltHO05tWGJbTGBiTlZXVldUWWddUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis7SD8zQkhTLD6QaztHSI+cqquiqrGkqaWztLG1tbKyoquuvcy6rsC6x7G0rbTCwtHFxr7Asr3Awry/t7vEp6y3rLO4u8Cvq7GtoKOnraqopLCkq7Kqr6ywr7Cuq7O8p7exsqmzq6ympaOtuqyqscO6tq27qaioraqps6WppKOuqqiin52krZWlnpiemaydoqiqoq2mpK2ruLKyoamioKyvsayeoKeoqZmkmZmPoKeYhoSOiouen46KjJWbjo2Eho+Un5yVl5SGlpOTl6SbnJyLk5GNiX5+h4V8d36HhYZzcnGIdWtfWWBuY1FzcVxLO4R8Rj9XdFhhWk5jW05WVlVXUVxiX1NPTmdYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlVo+TEWVmK2ooquznKqqsLatubavq6arqr3Ju7C9t8KvsayzxMPOz8O/v7TAwsO6wLPIw6uut62yuL++sq2tq6SnqrCpp6ixprSvqrCurbKxtKy0vKS4s62srqisoKOesLerqq27t6W3tqSqp6ysq66hqaemsbKkp6aioqyXqqGVm6CmnqSiq6Wto5+nsbiurqOmopuqq66pnaKlpKSZoJqWj5ick4KCj4iFnJ+Lio6LmI2PioKLl6OakZCajJOSkZOimZuZio+Li3yGgYGDenSAhIF9c3aLo4d4al5gbmZXZYdjTj9nk0xFYnlXYllSZVRNVlVWVE9cXWFVS01oVlZXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxCKzpKT140RIY+SEZEl5KwpaOrsZirqq22rLayrKasqqm8wMC4uLO7taayr8TJy9K/wbu5wL/CucG5wMStsbWxs7q/vbKwrq2rq6e2qqatr6q5sKixsq6yrbeqt7entLerrKSqq5yjnrOzqKiktLWgt66gqqirqayooKusqbm2qaqpqqOqoK2ckqqhnaCkoqajqp6dp7SvqKaqoqOYpaenqpyjpKOgmpigkY6PmI1/h4yHg52dhoSKio2Nj4uChZSimo2MmZCRkY+Sn5aYloyLhH90h4F+f3h0g396d36BiJ2Pb3FnZ3F4XGFziGtPXplWSG14VWRWUWNPTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EO5aOsaGmq66arKWtsLS1r6umsKqpur67wLCuua6ht6/Jx8jRwL69u7zCvbrDwL6/rrKysbW8usGxsbKrs6iktKilrbOzubCjrreysLK7q7qvqq62rKqeqqyfo6C2raihn6+zorWqnqinqqOqoaKsrai9r6yuraKoqKCsmZCwopiioKeonqebmaqxqqOgraKhlKOjo6eYmqmlmJiYno6Kh5SIfY2GhISkloSBgYuGjoyQg4OToJaIkJyQk5CNkZyUl46KhoZ4dIF/fHV4eYB6dHN5aH+GpHVpXmRrgXRniIx9U1hwXkp4c1NlU1FeTU1SWmZOTFZZZFhGU2lSUT9DTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQTSQj7KhpKaspKekrae1s7GrpbGoqri+wLyvp7mqpq+wycfI0cO8v765vr+8ybvBuLCwtLG6u7fAsrO7rLisorSnp6yytrmzqKi9tq62vrC9p62staytnKmvpKClraunnJ6rs6W0qJurp6mjqZ2kqaipvay0r66dqqSgrpybs6OVpJylpZ+km5upq6afm6qim5OcoaWemJepqZKYmpSQioKPhX6Pg4CIno+Ffn2LhpCNj4R/k5qThZKhjJSRi5GakZWGiX5/cnt6fnxoeHx6dXBwfGeEeISIZGFnYnKFem1neF1dVUBXem1UYVBSWEtMTnJ1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0FKN0dTYFUqPTlEVz4qj5SymaCgqaaloauluLOzpqmxp624wb21r6K4raiosMLJyczBtr3Atbe/uci1w7WzsrWyvLe5vbWtuba/raGzp6ursLW4tayfvr2qs8G0vKGvs7Wqq5+tsKOcpaiqo56bpbGnsKCfq6mooamcpKihrbuorrGuoKujpK6en62ml5+boaOcoJyapKqjm5ulpJaXlZ+ilpuXpqyMnpGRkYuCioCAjoF7mpSNiHt+i4WOjYuKg5KYkYaToomSkoeQmY+TgIh8eWx+dnl4Y3t7cXBwcndogHNqg2dlZ2Btc41sYWlvYG8+WnhrVV5PUVFKSU1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDFCaFkxM1M9ZV9ETDZLVmRPKjsyTlg9I5OZrZqgmKeko5+opLiwr6SvsKqruMK6s62fuK+rqLS6yMvIv7fCvrC0vbfEtsOxrrmys7+0ur23qbm4vauktKipqrGuurGrnLy9pbDBtbair7e1pqensbOgnqSlp6GlmZ+sqKmeoKqvp6CmmKOpoLG5n6Oxr6GsoayknKanqZqam5+klZ2dm56qp5icoKmTmZSYnpOZlqGqkZqIjo+GfYd/go59fKGMjYh4gouEiYuLhYeSmo+IlZ6IkZWCjJeMkXyFe3NwfXF0dGB5eGlucHBuaH1xY3ttaWVjX2WFfl9ac2tyS0t/aFhaTlBMSkhQUlBJTlxfblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo+MFhWNSiXnqeanZasoKChpKK4q7KltLSqqbnEtbOtn7etrq2wtcbIwbe/wrmxtLy2v7u+r6u9sLO+sbzCuKm7urenqLWpqKuxrbOxqJu+t6atvLeyn7G4sKilp6+xm6GkoKSkoZecr6ehn6Oor6GgoZOkpKK3sKGmsaufrKOvmJyqpamel5qepZObnZuep6ybnZ2ml5aYlJ2Ok5eiqKKQiIuPhXqEfoSLeo6WiY2GeIGHg4iLjYWNk5iNjpaYio+XfoaXi495gXpwcndvb3RfeXdkbGxraWiCbWVya2tlaFpic39eWmx2alpIfV1bWE9PSkhIUlVGMjpfXmxQRFhWWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0JnW0hUQ1RdaEUuOzFfVCwylqOimJWdqZ6moaOhuKqvobu5pqy9xLOvrqK1r62tr7TExL2zv7q3sbO5uLq4uq6tv7O0uK+/wbisvbq0pqKzq6iqs6uusqOdwramqbe3q5+yu6mmpaivq5mip5ylppSYobOmmZ6lqqmcoaCUpZ+kuaikp62mnqWhqJOfqaKhoZmbnaGSm52XoKOsnJuaopaTlZabjpOTo6ekj4iKjoZ5hHyFhn2cjYmKhniAg4eHh5GFlZOSjJCVk42OlHuCl46Kd357bHVybWxzYnl1aGdpZ2VuhGdnaGRmaGpfZmJpZlpme2NhUnNUW1tTTElHSU9TQCEral5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc4Yk0nMp6kpJKOpaacnp6epLWtqKq6t6isw8C3r6yhta6nrq+3wcC9ssG3sa+ytrW4t7Wsqry0r7KxvcC3rry8saWftqymprWpq6+hoMSsqqextKustLqeqKqrsaWYnaqeqKWRmaauo5iepKqhm6Kdl6Cdp7amr6quoaGdnaGVoKafoqCZm5qckpqelaaerqOYl5+WlI6VmIyPmJqnoJCHioqIeIV3goKCnIeLgol7foSIhoSQhJaVj4+QkZCRjZN7g5WNhnJ+fWd5cGtqbGd1c2tiZ2RidH9iZGVmZWlqY2dvWV5YXW1kYU1oV1tgVklHSEtMUlg+OWBsaUdCVVNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQWRHJTWcpKCRjK6gmpigl6W0sqOyvrehscW7ubCxo7asq66pub69vK3Asq+vrravs7myp6u5sa+us7a7trC5vqylnrWroKGxpauvn6XEobOlr7Kvt621nq2vrK6imZ2nqqWflZuopqCZpKOpnJqfnJWcna2wprmnraKhmpqemZ+kmqWdlp6Ym5SaoZKolq2pm5SdnJOMlZmOlJSYp6eNjYqJjnuBdIKCipiFh3yJiISEioyIkoWTnJOSj5CRlo6Qf4CNjYNvgX9meW5oa2pncXJrXGhjYXJ/YGRnam5sZmpnZGxcbG12cWFUYmhjZVpJRkxNT1hRUFVhZYFUQFZTWVVGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUlkQic0k6Kcj4+xnZuUoZqpsrCfucC2oLTBu725saa2sKmupbe5uLmtu6+tq6u3qrS5raWytbGvqbG3trGztrunqZ+2qZ2fqqOqrZ2qwpmvpa+xtrWsrJ6xra+qopudpKyonJWcp6SemqmjpZWaoJ2RnKOrqqm6n6akoJiamp6ij2uilZiccYOWnKSAdpGrqJ6WlqGRiZeZgJeKn494hZONg21pfneEcmyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R/g5B/ZoiAaHZpZlhdaXRuTlBqY2ZxgmZeZGZubGleXV6JkIWIaE9LRDhFVGdeSkhQUFVVS0hTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOXEtbZmI+RzFPYjwrL42kmoeVsZudk6Ccqq2ro73Fr6m3wri9vK2ntrGmq6S4tLO0sbmuqqestKWwtaKnuLa1qKestrOutK6zoqmftKueoqWcp6ibrr2VqKewtLitrqSorqqrpqKfnKGop5yXoaamnJynp52SnqCZkJ6oqqO0r6Oio5yWmJiYpImhj5Kah6GIlJ6hf6V/p6yflJOdk4iDcniNjoOHoHWIjWmXiWZ+c3mgb4iHg36MfH+hoKCZf3uHnnSIjnabimyIgoNtaWVke21yYlSGbWNtaZhxWGlwboZXXWlba2pbiHBteXKHaYeEWl5GTj5GXk1FUlZWUVBSV1RnXkxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTlxMW2dfPUsxVWA3LyiNppeEnaydmZmdn6uqqKq/w6+yuby3wL+qpLexqqyms7Wur7O2q6mlsa2ltbObrLW2tKanqLOxrbKorp6qobOpoKSkmqKknbC3laWmp7a9pqynqaqsp6aioJmgqKSZmaajpZmcpamWk6KclJOjpqahtqSjoKOYlZOYk5yIrpCYlImpi5ijnIaxgKSunpWbn5V5gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4FslrGrsHlobFixrm9labySvG5oem1wj9h+U2titrJ+gHGUdZqhqpBXT1hhT1ZORlRbWFFQU4tcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV5nXD5MMVpcNDEhjqaTgaeqn5ednaWtsqmxwr2ytb+1uL/Cq6a0ra2pqK+0qq+2tKiopralqLmvnLKytqqlpKeyr66xpquep6SypKKhn5ecoaCxrpWfo6C0uqKqqKGtrqWinZuaoqqgmJuooZ+YnqinkZynmpSeoqejoLCjnp+jlpaSmJKZhbBraoqNqn5nhZaHrWVxn56VmqeWca6hpH53unxroY92sV9qtFulgGWckWBmgXpmgGl4aqllvnJnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4eWRXWcYH1me6Omgllfi6tpgJJ4emqoOEqvW1dUbWNaTE9YX1xXVjtOiE9XVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWTMxG5KilYKsp6Wfo6SqsbettL2+sLfFsri6w6epsKyvqamxr6SxurCkpa+zo6m5qZ6zsrCjpaCqrbCsr6aon6OisZyjnZiVmJ2dr6iXnKKftLOhq5uhra2gnpqXoKOqnZmepKGcmqGnpJCdo5uYoaCsn6amoJqfoZWVkZaRmoa1m7V4hamZtZl3h7Obt3+Ul5erln5rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iHCOhoCAiJCXeIOCi5eMg6CPhbB2d59xa2psfItPpVhIY2OZfmNopV95cXVSkodeUKltY3F9hoBhnS9Som5bVGtnYExLXGNYXFpCPrB4V1hBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RiwwLjg0MCwuKC8yLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o4YVU1MByXoJSIs6amoq6pqLOsqru2wrC8wq24t8KrrK2vrqeus6qir7yroqe1raOrtqWlsrOoo6Gdp6qyqLCopp6goLCWoJqWlpeaoK+jm5qkqLWuoamPqaiqm52WmKCmqZufnaOfnKCjpaOVm5+Ymp6jq5ulmpyaoqCWk5GTk52E1ZOZuXGwwn/GhnzWlJy7fJuXp5CNnIykeo2GooGlgnqseY+dVq97iX6farlauXeGg32mgpN8mHqqeY6dkHuxbo6EdJC7hW6VUK+nxYpRoHpjYKpic3KGbJeHX1O1tMiFgIl8Y6QzQp11XVBqaGRQQFhmWmRhSkhNa0paU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuMDA0ODMrLSguMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdHOmFQNzIlnKKTmbGoqaWzqqW0qKS8t8GxusCytrW9tLaosrGjsbOmoK+2qZuouq6jsLKhsrSxoaSenqepsam0qaWcnp6sl5mZl5eWmKKsnpuXqa2wqKOfjqyiqJedmJyhp6KYoqGjoZuioqebnqCelZmbpqGcp5Wbm5+gmJCSlZCdiLJuaLVxq4hwjqZytHRztnubmaaNj5yNon6Pn6R+sHWDkdLRdVuufIV/pG+bqqZrhoV9rX2XmY97sXOTnY94s2WWdIWebp5mlFLJi1rCXJ95Yl+tX3ZzhmKXiF5Zyp1vv4B1TUu1U1XGZFRRamNmWEFPal9saVBVRkk4PVdSW1ZZSUM/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHJoOSdXaVxBTlRfZVA1Rz1hTTYyLqKdkaWwraWqu62ntaWntru8sru/uLe1u7u0prW0orKyo6CssKWYp7qupLKxnbS4qqClnaGqpLKorKqlmp2bqZ+WlZiZkpOjqqGXk6ersKWilpKsn6aTlKGcpaeglZunp6Kao5+umqGenpCWnKKenKWVnZWZop6VmZaSm4Wse3eodqOPi4epb62Kg6eDmpqjipKZi6J+kpeHroV/grNccrNSrn2CgqR/cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnmIhqXa93lZ+PeGw1eciusl9CVG9dZ2BFUGxgcW1WVU0uZWJoU1lQO0JEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wMzMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6NzegnZSguLGYs8GtqLKnqrK6uLS5vrm4s7a+tqa4tKC1raCgqayglae2rKixsquttKSbqZ+gqKK1p6aqpJmelaWilJScmpKWo6ablJCnra+loZWYqZ+ij5GimqmmoZWapqmdnaSerZ2hnKCNlJ+bnqGYmZyWl6GglJiRpp2GqX19pXmhj5CDqnCtjIGmhpahooqXloijgZCHlKp7f4udeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClG2TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZU9KQ6FcWk10XWJmTVphX3J0X0pVNUqaklhIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVF9iTDdGSV9DMT03opyamr+smLTCrqutqKa0sLixtr+5urOxuLyqu7WgsaWfpqenn5Sqsamwqratqq+hmKGgpqSkuqKjq6GXm5GjoJWVn5uVmaCgkI6MqbCvpp2Xm6emn42SpJiorKiVmKmonp+gpK2joZ6hjpWhmJ+gkpyXnJWdoZWWj6ubj65ucrR0qYx3iqZztHl0tIGTpaOTnIyJpIeOdbhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6YhnBcr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBwfGNTWVE+Pm1vMkJCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eOTFBOKWam527opyywK6tq6unt6m4r7XBtb2ysLq4q8G2qquhnaekop2Sq6untqOzqK6qoZecqKClq7mdo62clpmQpaOWjp6hm5men5GTlau2r6eZlJusqZeMlKaapa2jkZersqSgnqirsJmhopCZopegm5abl6GTnKmdlJCqmYfTk5q7dLHEgMOGfdWWm7h5iZGYjZeJjKeHeaK2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+ifox0h6t9vm5zvHSyg3V4gIptmohxbY2kdL1dd31bYXm8alpWW2l5XmlhZGZibXlvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QDmnmp+ivKKYscKwramqrLGoua+3xbK8s6+8sK7Bsq2mo5+koZ2ckaqlqrKktaetpKCWmqqZpqy5naOumZWhkKagk42co5+Zn5qQlpOvubCrlZejp6eUkJalnaStn5GgqKufnJ+ppLKeoqSOp6KUoZqcl5akmI+woJKVqZ+FkJm2gJGSjbiVeIKTm7V3bmxuc295j4SOiXOewbu8mXqBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV5s6N1dpd1dLB1mJ5mhmmNtnRycXe2jF5/eX2IZ4N5bXlii6xwdIV/WFunakRkWVRmX2NdY1FmZnFtdUJNUE1EO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlNZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlrPCtKuqqK2rqruvscawtrSvuKe1ua6rpKKnn6CdmZSspK2qprWoqJ+clqCjnqylvqehqpeVnJGim5KPoaiilJ6XkpiUsrW2rZidpKSii5KSppylq52WqaWmnJuiqaemo6ihkqyel6Kel5eYnZ6PsKmTnKeij2t+aZyoeYlzfpuOdXplh3u+v8C6bpKCcZWFX3JqWl2aiWFkh46Va2B/lWNtnHZilGuAmpWUZV5fY3GbiWhzjXyGlGZqfnF0eX59Ylt4dIFoUFxug3x7impYbHmBcklKb4VwTnNNRVdcZmFMW1dmY15PWm12anJST0RFTTxISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMTs6LjAtNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPltPJz8yPqifqKHBpJq0urajrKaup6i1sqzIrbG0rbakvrGzp6Gkqp2jnJqarKeupKW1qqSbmJaim6atqb+oqaWVlJuWoJqTmKWpqJKfkI+YnLCyv6ybp52noomTkaqbqKScnKyfo5qbo6esop+qopqum5WmoJaVnZ+dl7GlmaKomZyRnpyjpZqno5qdmpqakJaCaG59cXaRl5SRg4m0qY2FmJWOioyYl4eTlYqDk5OQiI2RlJmTmZeaoKGam5SgnI6CeqSFbGl7kH2AdYmLgnKCeHl2dYqAe4lqc4F0g3Vkd312a3B6bWBjW29nTFhZZWpfV1lwem9uZlNPRlI5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODEwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KksbG3oKmms6elsLWqyayusqa1psCotKGepaacpZaWoKunrKOjt6ygmZeWoJetqqbBn6yklpKcl56YlJSinp6jqJKQmainssOwmqudqp6Pl5apnqucnqGtmKGbnaKlr6WhpKieq5iXpp2ZmqGenpywoZ2ip5WYlJmUoaOWpJ+YoY6WlIuKjY+XrY97lZuCkYCJqaiFgJiWioSOn4h7g5CGhZqRh4aJlY6bl46QmJ6jlpmSkJ2Nfo1lobOuhImEd3uQin13eXpvZ3mQgYCJa3WBeYhyaXN/eXWDh4JrdGN4Zl9oZGNkZmpYa3twamtcU0xQRF9VRkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXV1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAtKC5r76sq62xsqCqprKtoqyzsMaxrK2ks6+8pLScoKeioZ2Zl6imqaakpbO1npWVnZmZr6auvqCso5KSnpqZlJKWoZyXqZ2FnamsorTHs5+ppKqWlpiap56pnKClq5Sfn52gqq6opKOroaybn5+gmKWenJ+csKSZn6iTmJidkqWamamfm5dmg5J8ZX6Pmo9jeIxsaGp6kKOra2SZl35nhYplZWloeo2hjmtojJeRondraouYop+Yc2xueoSMhnlYZV2Fgl5si4qCdltoc3d3kYCHgm54gnh/c215hHN3iIiOg3tphVhdanNkXXOIaWt8cW1jXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS42Wk82KUVZL0RPMVlCOz8uPaWfury5r6uzsKulqK2usKeurbC9squopa2wsJ+tmKCknqKamqesnKyjpqips66elqOQoq+mtrmlrqOQj5qhmZOSm6CYmaaWe6Wsoqi0w7iloqevn56VnqOeo52kqqiSn6GeoKqvqamjqp6nm6aep6CslqGcpbGkmJyrlqGfm5OlmJ+rmZ5+voOIcrRyhZ6FrWh3ucS4cZKho3ummJhzqoJ8y8DAu3GKo4eCnnyWmIiewL2Clp2djZzBwHuBepGMmsK/fWulsm+MgW/Ken+bd5GDjoB2eYF/eXF7gIZweIWMk3lsdpFiZV54ZF9lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtLCvv6mplKOvqbCvraaytrCrpqelsaugq5iboqCcm6qnop2roqWppaW0pJ6jk6aurLi0p6+jkpKZnaWSkaChl5ugnYemq6Srrb/AsaGprqmXkp+eopmjpKqjk6Chnp2srqerpqOhpZ+kpJytqZGkm6mtqpydq52topeYppeipJidf86UeXqlgXqWlptfrY9djqiAoKF8p5WadKuCgK9eZIypeqiHhZ90l5KIs2OCq4agjY2zaoSuc3yWh7hhgq1Zo81ukHV723t/mXF+iJJ1f2V7iHZ2bH2Hbn2FkJF+bICNX3Bqb2ZgX3hkXHFoamNmYFJUU1deSk9DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NDc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1s6TC0hUEBGNC4xrcLAwLW0sLeYnpGjqqmttKumsq2trKSsprCqoaebmqaYnKKvn6GfqKejpqGfsKybnpamrq2wq6isoJSSm5+lk5CfpZedqKOerqSrsKi/xrOoqbGulpKenKKXoaqqn5Whnp2cra6mqaibpqajoKqSrLOWpaKqqp6kp6eisaKTm6eboZuVlJGXoHCFjJh1hKiHcbB8nXKsfaCfgaWPnnergn2tf5xyrX6rh4afdpiSe3yXfqqIoYuRi5x+q3qIko6ggHqtVpzEeo9vksF9gZVtdXCMbWZ3ZYZvYXducm6IipGPg2yPjmRtc3VvYGZtZF9vaGpuZmNXU1xgWlJSQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/UxseytJ+do46joqKtrravqbGnqauorqurpqKjnZqjlp+mq5+ipqCoqKKfnrCsmJuXqKivrKinqZ6XlZqjopKUoa2bnaejrqyjrLWpuc2yraaurJaVnJ2imZ+urJ2WoZmenqmwp6mpmqqoo6Grm6+xoqisr6aZpquqq7Kkk5ikppuVkoWkaqR1iXqpdXqycYKliZiMcIefmoekX2BSq4R/roKbda6Cp4aGn3qZl4V7ZoCjiaSYhoGjfal/gZSGrl58qFWdopKBeqOfgHvDr8WMc6+0s7lxYqmvwnRojIyXjoFsmJFubHh4d25rZmRkcXBme2ljXFZfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwr6mto6inqqurqaSmn5uln52mp6aknayaoquhpJ+vop6bk6qktrCuoKmbnZeVpqOQmqKon6CmnLCmo6ixrLbIsrWprKqVkZydopmgpbSdmqGUnJ+mqqqirZmqqKGhqaKzraKqs7KinKqosLC3pZSXpKiZnZJ8qmyehId1q3l8sG6CpIuIn5aVnpWB0re0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlKipkJOajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI6PnJJ7b5WQfW55dHx6bVtlanJxZoFqXmFYY21cXllJTExLRURCQj1BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTBxrmtqbOurKWinbK5rKqhppuopqusqaagpqSYq6OfrqydpqGsmp+ppZ2ntaCjmJOoq7ayrJumnKCWkKatkpqcp6OgqqatoaOnqbC0wrGyqq2olImYnaWboqSupZehlZmcpaWpma6crKelnqujt6ygsrmwnpyvqLS0tKaWmKmkm6GPgp1OeJqBf596hKN8gqSEhqaenJ6UhLh7fHm5gn/MxsO2d5uhkIuffpqWl4l2n5eKpJikqH6whZuEnoSsfZmUYaVso3CPhZCBfZeEcqxgpHJxgJpgvH1SVXWOkaOWe3yRjodyeXKDfXBcbG53cmqBb1pjX2huYmRdTExRU0FIR0ZJOTlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Gss7Smn6GVpq+urqmmnaWlmqOnobKuoqmnsqCZqKSUorWjpJaXoqq1uaSco52jk5Chspmem6aloaKurJykqKK1scOxraqtqpGHkZynnaOknKWXnpiZmaWjp5itoaykpZeupbusobe3rp6etbO5srSomZ+xoqWfh4/RtcO3eYeOhZGTj4CmeJSid4ugkoWlgotxq4aFtG5yaZmjnJWJn3yXmYaHkHOugqWboo2mi5OciJSQmm1wslylc5N6nGyZf3uZfm6pYaJxcX+fYnOyuGh3j5OkmH2Ki5CIdnt4jYFsaHdpeHNugHVdZGRtbWVoYEpaV1g8SEY/VDNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK22oaKZlaOpp66pq5mloZ6moaC1p6Kpp7CjlKujjqStpJ6RmpqqtLSknaacqZKUl66goJ6mpJynnLSZoaqjtavCr6mrqaKMhI+coqCmo5WZmpyYm5imo6WXqaasoaSbrKa9rJW+sK2fo7C0u6y1qJ2qs6WpmXuokX18sHeKgaSliJxtsm+gh617oY+DqJaZgKyJha6FoJSooaKXhZ+AmZWAe5J+q4CdmpaLqnidoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2la3GFmV1gW4ygbZSQpZiBk4uTiXh5gZZ+amx9Yn10bYB6YGdlcG5nZ2hCWV9bPUpTMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaV1NQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKahKnGw7bBtJ+araCuuKWjjpuko6Cvrqmfo56drZieuaCiq6CvqpqtoJCqqaWWiZqQrrCspqCom62YmY+toqGdpaGapZytmKCopbaov66kqaOfi4CNm5ufpp6SlJmZk5qapKOjmKeqqqKjnqmovqSXw6yro6Kss7ussKiitbGqrJl2r36QipyFh326rYmYZLCMZZWtfaGPg6eWm4GtioSwhaaZo6GikYWgW2xqgbNgf617e4KAsmxnbpmXi4ixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqeaipaPk5R5eI2bfGNzfGGDeHOAfGFpZnBtZmVlT1VjXEFUXj1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE5KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vbu0wbOjnK2mpbapoIuZoJ+ds7GonqKfnbSYoLOoqquesK2eq5qUrqiijoibjq+sqaejqJmvk5qPqZqhnqWfmqSjpZmeo6myqLyvpaienY58ipqWoaCZkJGZmpGZl6ien5enrKWkpKKkqbueoManpamirLW3rq+ooL2vrq6XgamSo66Om4CGpJeYkIGAuMO6g46dk4SnmJ2CrIqCr4mnnJqlq5F+1b3CqmKjv718fqOCg9e6t7WFk5KCnr2+hGqjgW+rhG6df3qysceDa6uwvax4d6K+u3SAlY2lm4+ZjpSad4CQmXlifHpjjGd4gXtga2VramFQYltTaVxAVGBCTCk8OjUvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0sb+6sr2zop2upqWzpp2MmKW/qbawp6G/pqaxm56xnLmon62upaeUk6+sl4yDmpGupqOsoqWcqqCYi6OTpp6nnJqhqKKZnqCsrKm4raejmpeTe4eYkqabk4+RmJeOmJSomZ6WqKeeqaahoqu7nqnFo6Cvo6u0tauxq6K8qbCwm3R2qqS2hWWJn3BnrI+Kj21vd6SQmqCBdbCalnCQjXKWqKObmK6kcmxtbGWKeG5tgplxgHppcGlmiZaVl3FoaYWGZ3CGZF2KY2lvWV1nfnimYGJyj5JvZmSAjZOOoZeWl46Um3uGjpR0ZYZ3Z4xqeH54ZGxjZmxiS2VXSmtZOlBkRFAnSjorIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKq7urKzqqmirp6ks6qYkr2xw8e9tKmev6uso6Cmq5+6o6StrK2ljZWtqpCMhZWXrZ+lqqKfpKSgkYulkqeZqZmWo6qglpylpqevuaqrmpuTknuDlY2ml46RkZeTjJeVppOdlqehmbCmnaKsuaCwwqiks6assbKrr62puqWwuZeLoamltp2JlqKYhqmakJSdk6qzmZujrKG0l6OhnqGinaGkoZWrp4ySk4yHkpyclJCZk5iQjpWEf6Sal5WOi5OSio+GhH5ni4B0g3Z0h4xxp218lZKUk4GBj4+PjpyTn5SWlJ6AhpOLcGeOdm6Jd3V8eWlrZGRvY1VgWEBpWkdiYE5YK0U9KyYhNjQwLx8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKWWqamltriurqKwpa2foLaxkI6qxLvEubepoaWdm6WdsKijtqedqbWmp5CXrKOLiImPnKeWrKSimqien5OVo5eomqmZlKehpJCap5mhtLmnqpiakI17gJOMoZSKlJGVj46Sl6SOnZinnpu1o52mrLeor8Kuo7ensK+xrqqrtbuisb6akqakprWikp2mno2pn42Sn6OssJuhpLKqsZmloZ2kqp6enZyXrJ2SmqKblJCWqpmNmJiWkJaekYegnZWUhZKMkI2Vi4F+Zo2HdYd2eYiEdJxqh5GVlZKKfYyWkpKXkaCRm5WegoaWhXhxlHJ4iX5xe35pbmRfcGlgW19ZbWJQYGRPWTlHRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7G0rK6jqaetoKi1qpCPnKOyuq2qq6GimXqcorCkpbGplpu4pqOTl6mcjoaKiZuikK6fpJeooKGSl5mbrouqlpComaiMmKiOnri2o6WYm42JeYCSjJuTipWRk4+MkZahi5ycp52et6N/g6+1orCvdKS+o7KgeHuhrLO9lneupaCKgKp+ZFxidp+OpJ2Dl35uk7Oco6ivq6Rln6CUdHqal3GAmamYbICjqIplnKWbkJeYlouSm5CEnZqQlIOSh46OkomFd2uQiHaHcXyGgYBhaYmLlZOMW3aVkWdoj4xxeqOXlmR3l4aAdpdogomCbnl+anBlX3Zva2tnXGVjYWFvUlo9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHRklLTFRVVVldYGhnZ1hRSTxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraSnraWSlqq0rrGlmammqpdzi52vn6irp5OWuKCgjpuknpB+iIiano2smqSVqKKejpeRnoV0rpCJppqokZajiJu5s6egmJmLiXV2ko2Wk4qTkZCTi4+Tn42ZnqWYm7KWgIybtZ20jJKPvaehfqeie6SwuYKOj6efhIuFj7Gpr4yJlqKZeYGLrIacnaKoq6mIlYeZd6WbeoecgZengoF7nbJ6ioafl5mUmJaBkJaWhJmaY3mHkISNj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR7mYKemoSYfZGJgYKYaYyMhGp4enBwZ2R3bWlsalxkaWllcltcSFRMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5REs8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxbyvoJWlqLSdj4Odq5ymoqCNkL6emY2fmqGQfIWOmZiIrJ2jlqGhko6UiYaAkaiOh6Kco5OWnYaeubGnnZqTj4VwdZCJlJCKlI+Om4uOkZ2QlZ6jlJ2siJ+0ibSarovKiKuvibeFjbCDsrCFqY6nmI2dfKiPcnt3m46mlmiVpHm0i5+fp6mTmcKCf6uImKFxnoCapX2XhZWygKF9oJOfj5iXgI6Tm4mYkot8hZOGjZSTiYNtc5KGgHtyhoGEfYV1hoKYgY/FZoCph4+iap2BnpeAmYCKi4OImG+NkoRnd3R7dmdodXBnaGteYm5sZmxYZkZcUUwyRTQ2TWFjNyY0PERHRDo2MzY1ODs4Pj09PkJMP05JSktDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZ2hnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5saqrp5qUnqKkqqKVpKm2oq9/oKacpZ6diZS9mZONoJGdj3mDlpaRiKuZnJuaooWPjHebnI6gkYiepJuVmJeGorispZmbjY1/Ym2Pi5OQjY+MjJeLj5GejZKeoJigqH6hp4etnaCWrpCgnp2RhoKgjayxiKSOq5qMmn6idYCYk2uBq3RNq3iHjZ2Sm6mpgqqrfoShe3qnaZ5/kmxnl4aYtomefm5gY1iDl3+Me2Rni3OZfXmWa118l25fU3GFXGBseYNgWWWCfoSBmHGnqmuDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbXRxampuXmpvbGtoV2dOXVhFOUA0R0ReazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpbXV9XXl9idmBNRTpNT01UYlxbZmdpaWJiZGFkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJadoLmgqqOmrJGhtryrr6KZlp+gpaurn5yttKKnkaCfn6abmY2YtJmQi56MlYt1gZSRjYqmlpaYn55/k4WGrKOHnJGKmKmYmZqRh6WwpqKVmYiJgGluiIeLjo6Ji4yRi4+RoIuSnZ+boaV/k4GPo6GUoHeclpCng6KogIarr4aleot9hJp9onBykoeWe56MeW2Hm4uZkZypnI+HnXyConN2pmaefnekXph7fZNzom6Yt7S6c5KHgYC2qGSBxrh7cJW2jHGAm6RjdKyrYH1qnbN+bn2Hg4+Ci5dxgKNsc6RznoJ9o16cmbOWb3uXnrN0cluesoJpYm9zdXFoblhra3JyZFtoXWJMRD1ENVFBWnEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWVhgYHxkSUM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi2ra6gmqGboqOkq5uasayrkpegmKCkmZqUnqubi4iSeIuFcICWjYqPoZCTlJ2XfZGKjqigh5iPipKik5uajIqop6Sej5aHhH5re4d+fY+Ng4uPj4mOk56BlZufnKCfi4l3nJiijaByoouIqYicp5GXqayArox9eqCZeaOTeIBzl4iMnH2Wn4abjpmcp4ejZKF9iZaQm4xsnmiajW6amXuAiqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z2iYqAnWiadYeTkpiOf55tmZBqpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGl3eGFfZldiQlBFTzdWQlJuNEpaWV5OWkRAMTUxOzs3SD86Q0dVP1hSWF0+RGJdVmBRYWN9akVCOU5bXllkZlhmZ21tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCsnaabmqefnayZnbCnq52Xopmhn5mWlqCjmYaJjWmIgHF7l4iMlpeEkpSYj3qKhJajnImVkIaLnZGcm4iPqKKfmoyRioCAaYGGeX+WjHuIjY6HjpWZfpKhnqCik5hyaJ+KoI+McJKMgqmImaCkqaKpfbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo+enJiJmHKhfYWNsLV9a5qRoXh+mLSjo6uohJh7mnycmn5zqlpdb3uXi3ieYkx/e3uFZHqYQk2fWaJqcnyOboGKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B9fW5mX2todXtiY2BRXldcVFZAWUVRZ0VSVlxhWF9JRD1COEBBOklFOExFWEFWUVpWREZhXFpgS2BtfXJFQzxVXmJaZWpWaGhtb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGtplJ2Bsa6ZhFNfoae0urOzqZqii5qpm5ynkqCro6Cnj56dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlohygImSoJtykpCBiJmUn5qEjqibmZWKiop8hGyEhXGBoYx4hY2Ih5GXk3uRop+eo4iuhn21hI+enXumlnqpgpaekYuinn6naHdtfplzoHNxfJ2FmG+Tgq59o4Onn5uBpHBeqWh1o2NvpWGc0498epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKnvH93g21/v6aqtF6cb35yl2+Bc6JyXqRndKZgaKZsmtOYeoKbbnd5l2ubeXaXcmyppWdfZHlwf4RrZ2ZjbXV3Zl9hUltmUFFhSFdJVF9XU1tkaltlUUZDS0xKS0JKRThQQFBNWFNYT1JRYGVlaVJkeHl3SkZFY11lWmhqU2loam9jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmvsrWws6OcmISXpqCgo4ykp5+XqImZl5iTmZORoJeOiIV7cH2EaH2Pg5OagXeRjo+JcH+Hj5OSbJiUfImRkqOVg46qmpOSioWJeYR3iIBugZ6Gd4CShYeYoJZ5k6KjmqCJs6Gitot6rKekrqVwqYCbkYaBnZN9pICimYaYcZ6Eoq2uiZeLgIykjZWDr6KUdrW2tcmidJSLgp5hnZepbXmVh5+adaGHd6B9kJaKgW9MZqOScJqIc6V7eXRig4JsfqBscmRgnHJ/dJdre2q0tbTGpnOYfnqcapqaq3SBmm1zd5dpmXl0mHFQRH2zXmp1aniHZmtnYnR0cG1WXVNZaE9SaElVTFhSVlxna25VZ1dNSkFKTUpISk5BUUpQZGNpbWV0cnN+eHtudYl7e1RRT21eaFtraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinImvp4VmP5Shsqyvr7Wioo9/lqeioaOLpKacm6WBmpeWjZeQj5uTjoiDeWp5hmWDjH6Wn3l1j4iMgmmEhZKDjIWdjXqMipWlkoKXqZeMkYuAiXqAfYt5cI+ghnmBlIaIlZ6Vf5Olp5yWloRnbnicbKJkfHGleJyYcGingpiNfKV6oJaDlnKfdoCJlJWPuW6QiqJifZmiloluc2qra3WgbW+mYJtpi5BploealXWigH2aX4uFjHVviGJooWWef2mbdXBkZ4iCbnOiWl9bZKFuXYmMcHt/dHJkpW54omRmp2iXcouYbqFvUoiPbqBeZKdUi11UmG1tcmpxgW1waGt4c2tvUVhWVmZZU21JWE9cSFhoaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxygnt/c3aNgIN2XlFzYWdicWdQa2hoa2xvaGRnX11dXWBqYmlpdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqrGxpp+Lf5aqnJ2ki6GhmaGhgJWYk42aj4uXkI6Le4ZxgIhoi4p8l5pzdIl9kHxlg4eViomWmYJ8iIaWppCBoquQhZCKgYp9gICOc2mPpYR9hZOMh5efjoeSqqaeiaZ4lpx+pYmWjLKZnpGDr5efpXmXiXqpdKaPhJpupaKMkoSMg7xufaWvgoeGh5SXnaF9pntyqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm5un56RlWJ/q4uqd4B/jqefd599haSVnaBpmod1rGaerYy2c3a+jKSTWYOmjathdXFzb3t0cWJqfm5obFNWWlZhYFxqTFxSXUldbG12YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDcoN+gXt7jIGCgHZieWRkbnNkUmxnZ29tcmlmaWFfXlxhamJsbHpvXFxiaWFtaXdtZ2xuYpWmqp2BgJ6klqqqnqinrqOZiIGWqpmdo4mapJyonYSLmo+FnJGFko2MjHSFeoiDb42EfZeTc3WGcpGDbn+LkoaGlI99e4KFl6WNf6WljYCNiYSUdYOHkm9si6iAgouTjYibnoiLk6qjoJCAdJSXiH6BeZSvpH+CnHGPhnmSjIWAe3KnjHF9fXqXlpuEjXh7fn6IlJWTi3eRmaChhHt+iWuMhVt5eXN5cGlufpKJcX90gY+Uk3GFg4JljX9fgYCMeHZ0lHVve29uiW6Ehl93aXiOZoKDho+qnH90fZdqiYhvf3V8hHVtbGaMc3d7l3eEW2pYeY9obndycW93eG9dbIZtaWdWWl9XXGRrZFVhVV5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV6gXV/gH+BeYuFgn17bX9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtka2t5bWhsb2GOlbqpp4uhopumpJmknauioIODlqqRnaCImaaaqJiDgZuLfpaUh46KiYxygnyPfX6PhHqXjnRyhHCVhnt9kouGhpCFeH6AhpijjHunoYuFj4+ElYKGjph3cYSqhY2RnI+Hnp2GipqooKCrg4mOlZt/foqXraiQk6eQeHGek4N7k3B/qYZwfZVxam98gZ+Lf5KOi2huXYSMjJycoI9zlYyIcXRrgnZ0gFlyboaQgX1+i2ldaWN6hYOIgF9peHucfIONg3aBh4NpeYyIa2Jxc4N3X3KNgoqQqJaHZ42Pg253i4Jvg4t3bmRmY3mCepVaXGlmbnZbenh3dG1zcoJmXG2Ka2tiWlldWVhrcVteYFleXWZyfXp0b3Rjamppe3xyend0ZG10aGx7fnV6fHt5eX+Af3CGioR7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VubGdyeW9oam1gjIyrsaGQo6Gan56Ynpmpo6F9gparjJ6Uh5qhkKSUf3uYhHySmYiIhoaKcn2Ai3aFi4GElopyb4BymYeEfpKDhIaKgXqAhIuan4+CpqCHeI2XiJWLi5yXhIN6rIGQl5mTiZ2choehq5+ioqOLiJObnaOZlqqiqKehk5yJmJB8eY+Phah+fpKRkpOcsaWalJ2QjbGSmISmjIyWnKCKkZyDiZKKa3yOdndlgoaQinyJnYSHi4+HiICFhJB3fHt1m6OJiIufi4aVf36NgoF2cXSGhX94iYiLkaeRhIeOiIOMkIt7hYmHjYB1a4GDe3mZaXJoYHSKcH16d3ZvdnOBXV1vh2duX19aW1xSZ3FVY1tbYWxodHt8cm5wZGppaH97bXh+cGhvcGxmgHtygYB3f31/hHttg4yGfHp4fH56g3hOZHZqc25xe2VrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqKhmJWZmJSYpKCde3+YqY2ejIWfnIqdlnx4lIJ7jpmJhoOEh214gYBygId9h5OEbWt+epeHhIOQfoCGhIZ9h4ONm52RhqmegnGKj4WSkYuckX2NeqmDjZGXlY6cloWFm6agopqdhoSTmpmZkJmmoKaenpCXgpOLeH2Ij4WmfHyPkJGFmKqgnJOcj42qjZGAno2JlJqfg4+Yf4eOg3B4hnF0YX6Ej4Z1jJiAgo6ChoR+hYSVbnl2dZSjjI6Gm4WFjnWAi319c3N8iYR7eY2PhZOokIeEj4KDiomJdYSGh4l7bmp9f3ttaGtsZ155fmd8e3Z0dXV6d1xgcH1tdWBjWlteUWZtU2VaXWFraXV6fnBrbWNraWeAf2tyf2tqc254boN5boaAdoKAfYV2coKNh357enyAe4KLYGl7a3VoaYNlamNgaVtjdWhvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5ORlpeLmp+enXt3nKWQm4mGpJSKmJl4eY2FfImRg4yCgoJse394coCEfImQfGtofYKXiYGIjnx+hoSHfI+Aj5ubkIemnH9wi4qMkoagoYqFjHynkYiPkpaTlpJ2jKOgoZ2Wmn+CkZqZk42aoqKkm5iRnH+PhnqBhY+IoYB+jI2PfJekoKCSmZCQpoyPgZySipOXnH6Tk36HjoF2dIJwdmB9gI6HcoqWfIeKcYx+goWGj2h4cnmNmZOQgJh/iYxzgoh9fXJ6fIyFe3uSjoSXppSMhpF8hYaHhXSBgoaGeWRxen54eXBsamZefXNofHV1c3xzf2peYHR2cHdkY1hdXlJqaFRkWF5haGp2eIFxZmtjbGhlf4BqbX1nbXBqfXeFemuLgXKBgX2BdHaCjIZ/fHqAgX1/j2pyg250aWKIaWxiX3FVdG9tbmB4aGxXanR2YnV6e3Fia295iY2fs5KlpZ2OkJiPhp2gmpx8daOfjZd/jKGKiJqVeHuGh36DiX6IgoF/cH56dHWChH2IkHdnY32Gl4uCio14fYCNg3mWgJWXlY2Vn5p9b4uBkJOGpZuHjImDppWEkoqVl5KRdpCdoaGYlJh6gI+Yl4+Xmp2knpmTlJx7kYeEeIaXjp5+goqOjHOXop6gkpiOj6KMi4OYmYSTlpp/mI18iY2Bd3J+bntkgHyLhnCGk4CPgWuHg4GAiYVmdm99iJOZjn6UeYyJfYCIfXxygHmKhnqFkoqMmaOXg4SMd4iEgoF2eoCHhHRfd3d8c313ZmtjYH5panZzdHV9cXxjY2FzbnVybWFZX11aa2RSYldfYGlsdXmGcGNqY2xmaHyDa2h0aGxvaH98gXhtj4ZxgIKCf3R8g4yBgH56goN+fJBtdYl0dG1limxqYWN1VoNpcG5geGdsYWp2cGZ5e3lxX3FshYWQna6Yp6iejo2Xh4Wfk5aYfXaom4mYeZaci4yYj3h7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5WIfoWIdH1+in9+mISWk5aMo6CXfnGHe5ORiqaPjI6KkqCRg5GPk5eQioCOl6CbkpCSdIGOkpSJnZ2ep5mYjpWYdY+Qi22GmZCZe4eIkIlvl52aopOUio2ejIaBk51/k5KWh5qJfIqKgXpyemt1bHt/i35uhZKDk3dvgoR+fouAZXNqfYGXmIWAjnSRiYR6iH52eIF+h4F9hI6GjZWlkXmFgnSJh31/cnR/hoJsYHp0eXB8b2FuYmR7YW5vdnN3d3NzYXZgb2x1bm9dW15dXWpdT11XYmFobXN6iWtfamVqY2h3iG1mbGhpbGeAfHp3b4+Hc4CDhH10gYaJeoN9eoGEfX2OcnmLeXhubIdraF9qcmOHaHFvZXZnbWxhemhrfHt4cGF3bYuBmZqqoaSpnoqKkYaKnoqVl312rJeMlnyek5GWlIh2fXuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+RhoCEhHN6gIZ6j5GHkZGbkqSak4F8gXyNipKjiI2KjZeajYWRmJOVjoiIi5KdlJGNjW6EkI+RiZ6ZoqGXl4mXknCLm4Vnh5qPlHqJhZCKcJaak6GSkoiLmYyCf5GefZKPk4yaj3uKhYd0c3ZrcW51fIt0boaRjpJxdIB8goKIfGVxbXp+m5R+hYp1kYuBdIl6b4F/goh9hY2Kho6Wqo57iH1+i4V3fXBuf4SCYmd3c3RuemJecGFqdF5wanp4eGxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4hlXWloZ2JncY1uZGlnZWlngHp3dW+OhHOBgYN8dYKIhXiFfHeDhXqAind/i3t7cnmDampfcWlzf2txbm1xZ29rZXtibn95dnBrdneJf6OYoqihp5uIjIqBj5yGk5x0gKmUkY2GoIyVk5B/c3t2hXd4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYB/f6CGj4qRnJegk5Z3iX6AjIicnYmPhpKXloWIlJiPlouLjI2MnYuPkYRuiYuPkYqclqGcmJaGmIlshqWFZ4eeipF+jISMgXeTmJGdkZCIiZSNfn6QmHyRjZCOmpJ9i4CDb3ZwbG1vcHuGaXODjpiKcHeAdYKJg3lnc292gpuPfYqFe5WSeneKdXGKfIeNe4uHhYqPnKSJfIR2gYuAd3htaX+Bf1xxcnFvb3haXnBhb2peb2l8enBtbWptd2Bwb2txbVlYYGFhbVdRU1llZmJ1cISCYl1rbWRjZmuSbWBmZl9na4F0cXJwi4B0f4KAeXaAi4B5hn93h4Z2g4V7h4yAe3aKf2pxY31jhXxvcGx0amhubHZ3X3F+eXt0dXN/gn6llZqtn6eWhYyDfpaUg4+edImfk5KFipqMlY2LenJ3dIJwcoVzcXWIbG5sdW2Id4N9f21uVVGBq5SHgnmAdnKCeYKggpGBkpGXm5GZd5B6goySpJqTjoiVmJKDhpaYi5OLiI6PiJ6FkYt9c4uFiI+InJmfm5aVgJSAaYeeiWiHoYiShJGEinGDkZePmo6PjIuPjXd7k5B7jouNkpeNfIh8gWt3am5rbG16f2J5fo6WgXZ6gXeDjXx6aHVtdYiWjH+Jh3uUkXJ6hXF4jnuLjXuJfoSOkZ+fhn19eIGLfXdwaGuAgXded29ta3FyVV5vYnFhX21ueXBncGZmdHVocWxhd2VdVmVgYHJTUE5bZWRceHCIfF5caXFiYmVmkWlfZ2RbZ29+b2txc4p9dn2FgHV2f4x5e4aAeIiDc4aFfoyMhHx5lXhmcWuEYId+b29remBpbXR/dF90fHiGd3NzhXx5oZCasZyljoKKf4KZiICLnX6KmJKOhIiXjo6OhHZ0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYmcf46BeHqMf4iMipybnJuWlHqOd2mKk4ltiaSFk4iYg4ZjjJGYjZSJlouNiYtwepWJfI6Ji5ORinqFfH9tfGVzb2tsenlcgHmPjoB7fX5/ho57eml1a3SMkIqDhoZ9lo1sf39wgY2Ajol+hHuDkZabm4t9d3iCkHlzbGVvfoJraXRvZ2hzbVNebmRwWl9rcnlna2tiZ3hzb3FkX3dgYVZrX152T01LYGVjXHlxinRcW2V1YGFlZY5jYGZiWGlyc21rcXaLfHR5hoJ2d36Lc3+Gf3uJf3KJh4GRioh9fpl2ZXNufWWIf29wa4Baa255eXNgdnp7jXZyd4p3eZ+Mm6+boJCChXiIlH58iZyHhJ6QjoWMl4STjoeBdHdweXBuhG9tbn5yY2R4cHxuenxqaGxjpJrB3K7vonNrdYN1hKGFkW6Vj5SflJqBkXCFi6OXiY6VipCdlYOAlI+EiI+AkoqKl36He3V/iXiGhY6bmpeZj5B2i3dwiIqMfoylhZOKnYWGXouUl4mOiI6LioSJbHyXgn2IhYqRj4Z2hX5+a31jeHRqb3hzWIh6kYeFen9/gIWMfnpmdGqBi4+LhISAjJiGbIJ3b4mSg5GFf4J7gZGXk5mRdXR4ho12c3FmdHiBYXNtb2FodWZSYHBna1VebXR6YXJjYGl9cXJuW2NyYWNXblpcd01NTGNlYV12c4ptW1xkeF5gZGaEX2NjXllpcmtua3J3i31zd4SBeHh8iXGDhH19iHt0i4iIlYeMf3+Yc2h1cXltjHtudHCAV3B5dnlxZHZ4hoxpdoCKcoCdiJmnnKOShHxwjJR4eYqdg4SfjY58lY2AmYeEe3J3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IlzbHOAdoqaiI1pl4+OnJSSgYhwhYigjoSKlYqMl5N8jZKIgoiPepGLho+CgHd4g4Ryh4KTm5aUmIaNdod/cYaDioibo4SVjZ+EiWGDlY+FiIaJjIeAh2h9lH99goWJjo6CcYZ+f3J3Z3ZyaXR3bFqMfZKChX2Ag4CEioJ2YnVtioKRjIN/gJOSfm6DbXqIkYiThX2CfoGTlJGXiW9yeoyGdWxwanF3f15zaG5caXVfUmRxaGZTX293dWBvYF1ognFyaldnaWNpWG1XW3VMSkxlZl5hcnOFaFtcZXleXmRnemFkX11Za25lbmp0d4p+c3KBfnt2eod0hYN8f4d3doqFj5iCjYJ7k3Zsd3Z5eJN1bnh6fVh5hXGAb2d4dpGCZHaGhXGKloaZoZuiioZzb5KLcnaOm32JmYiJe59/hJl/gXhxdG5vZHJ+aGZsd3dbX3h7enFxf2lhZ2F/1baOkad4bnF3e3GSkI2HapiNiJuRi4Z7aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N7cYaAlZmOkpSCiXWEiHiEgIyVnqCHlpCgf4hhf5OHg4eDiY1/f4JmfZGAfn+CjI+Qf22DfIJ0a213dXR3dmtjjYGOf4R/fIR/hYh+cGB0coZ9kI6DfYCSinpxhGd7hYyIjYR8hX+BlZCRk4VvcHmLf3RtbmlqeHxhZ2lpWGt1WlJpcmliUGJyeW1iZV5aaoNuc2JcZ19lbV9uVFpvTkhOZmRcZm5ygGtaW2NzX1xjbHdkZV1dWmxsYm1qc3aGgHFvf3x9dHiGeIWDfICHdXmJgZKVfImGdomBcHh5e4STb217gHZeg390gW1penOUc2dyiH1ykpGEmp+boIaGdXWUfm12k5d9h5CDio2ZfIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lY2hoV52PX3Jzl7zEhHZxlIiQfnKWi4abkoyHcmqIj5aAe5SMgYSajHyKhXx7iYt/lIh1iYZ2d32BcnWGgZ6UhZSPg4NygIp2hXyKmp6Zh5WPnYGJZn2Tgn6Eg4mJcoF9Zn6MfHl/f4eLj31pgH2DdmZveXhzd3Nsa46FioGKgHiCgYWDf2tfc3l7fo6LhnyCkIF+c4JpeoSJjIaFeYR9gpmOkYx+bm17iH12c25nZnt1YltwYlducVNTbnNoYU5mdHlmYF5dWW+Ab3NZZWJdam5gcE9Za1FEU2dgWmpubXxuWVtebWNaYm93ZGdcXWBraWNsanN2gYNwbX98f3R1g3qDgnyBhXZ+iIGWkHiEi3SBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0bJONhZ+YoJmEiG59jHZqeJeOfoCJgpSXiXmPlm96c3BsaWRgc3poX2Vxelpgcnx5Z3F6YWVlj7Gyd0tiWqXa0JZxe5CKkHh9k4qEmJGMhW5rhZKRenmShoGEmIp8hn94d4mKhJaAb4uIcXV+emp5hYOlkISTjYN/b3+Ed4R5h52alYyUkZWFiHB7koJ8goOIg26Bd2iAhHhyf4CDiod8ZX1/hHVjcHOAaXlwb3WZjYaDinx2eICFeoFqXHJ/c4KJhop+h4p7iXKCbnKFiI+GhnOEeoKajo6EeG5vfoR/dnlkZ2l7cF5YdlpYcGxOV3FzZ2BLbHZ1YV5cWll0fXNvV2ddZmpyYG9OV2hSP1lmXlpwa2h6cVtaWWtlWmNxeV9oXF5lbGhla2lxd3+Ib2x/foB1b4J7gIJ/gn92gYWIl4pxgo1xe4Z8enmEk4x1anp/a29+dH99b3J7epNwb4F/eGeSi4OhmZySgoVmhoNvZ3mViH1+hIGYiYF8jYxpeHJra2ZfYG95bV9ib3hcZGuCemFxdl9lZdTqvYsyOj6Ljn9xeIWIjo12g5aMfpKNjH9tbIWNjHV8j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3RmeYKDp4uCjouEfm6AdXeFeoiekY2Rk5OOi4d/e5KGd36DjIJrf3JogH54bXx8gYqDd2F5hIJyZHFofm51cXWCm4uAf4WAc3V+gXOBb1xuf3V5i4SLe4eBfYl5e3JtiYSRhYxzgnqAl4yLf3Rta3eAgHR0XGhndm9XVntSWXBkTFpycmVbSXF4b1xbW1lddH50aFliW2dmbmNpTVdmUT1eZVxddWVfdG9aWVRvZFlkcXlaaF1fZm1naWtpcHd9jm1pgoR+eW6AfHyBf4J6dYKBjZOEcICLbnd9gHt7iJOJf2h7fWpze3KGe3N3fn+MeniEfXxsjI2Em52WjICAbI19a2h+jYt6fn6Dk4J+fYqIa3VxZ2hiW2Jnc29fYWtzYGhwiHpic3ReY2SboI9uXDVar7V0aYCIfJKGdYWWhnOOiol2cGyFg4d1eYl4iXyTiHp+cmd1iX5+mG9xhn5odnluZnmHhKSHgIaMiX5uf3aAgn6NmoiDlZKZiouFiXyPiHB6fYR7aH5saoB7emp6d4KHgHJgdoF/cmRyZ3aCbXV7hpWRgXyCgW93enx1f21ZcIB3dYyDh3iIdoOJe3l0b4qBkYKGc39+f5SJiXpvbmpugoF0bl1nZHJwUFp6TVtvXE9ccm9kVUtzeGlXWVlaYXGAdGBdXWBnZGhpZk5aaE1AYGNbYHZhXHRsWFdTdGFaZG9yV2peYmhrZ21saHB3fJNsaISKfHxwf357gX+CeneAf4qLg3F7iG9xd4N/e4qNj4Nqfnttd3h2ind8eICCh3+Dfn56bYSMiJijjYSDenWLeGtsg4eQeH16gZGAgH6Kg3BycWNmXllmX29vX2BncGZqb4l0YXRvW2FkanZ7gL+cpqTIuHGFg3KSfHiGk4NzkIuHcXJvg3uDdHSHdIh3lIh5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgX9/jo99c4B0hXqBkpCDepePlpCIgoh7iIhreHl+dGd6aGt/eXNpenaAg31oYHeHfmtqdGh7gGl2gYyRlH56fn5wfHZ8dH9iVnh+c3OLhYJ9hHGHinh5cXGEg46Af3p+fXaPhoN2aXFpbYiBcW9dZ2FxbUlkdUtdbVVUWnNuYlFPdHhhUlhYXWFvgnNbYV1oZWVka2RRW3BJQ2NgW2NwXlx2Z1VWVXdeW2VuaFZrXmFpZ2Vubmhwd3qTbWmIjHl9cnt+eYKBgXx2fYOIhoNwd4RybXeCgn6KjJN/cIB7d3l6gYt0g3h/gYGChHqAdW9+ioubnoh9hXp3hXtndIWMj3l+f3uIhYN2j4BncG5fZFxYZVltcmFgYHBsa2iJbmF0aVleZG6Ad6naqseGh7JxiXdvjHV7ho6AepKJf3RzdH53gHBxf22EdJSGeHVrYHqCeYmPZnGEcGd2blttfICQk3+AeZGTfnl8boh3gpKMhXWXi5KPh4WGe3+EbHR2fm1ndmRte3VtaXd2f398YWJ4hXpodXVifXtndYaOjZV7dIB2cYB7fW2AWld1f3B2hYh/gXptiYZ0emx2gYSFf3x+eXx0i4J+c2h0ZW6Lg2xzWmledGRHbW1LWmFXVlZ3bWJQUnR2WFBWWF5hcYRvXGBjbWRkXm9jVV5yRkJlX11maF1bemJRVVx1W1pna2FWal9gbmVma3FocHZ4jnRrjo11fnZ4fneBg4F7c32DiIeDb3KAdHF1foWCiY6Ke3eAeIN7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN4Xn2FmIt4hoN0hYaEd4l6Ym5tXGJbW2FWaXNjYFtnbm9mh3FhcWZXXWNsf3zKzoe5oWptbYpscYRxfIOJfnuRhHl4c3l1dXtqbHZjhHWSgndvZl59gnqLimVygmtqcWNYbXqFm4iCgXOXlHh/fW+KcoSLjIhzmI+RiYaLg3t5fXBwb3xmaHFibXhxamtxeH18el1leYB3aXZ4ZoJ3Z3SHjI6UfXKHam9+gXlufV1Zc39udYGLfIJvcIqAcXdpeICCgIJ3fnN7dYd9e3Nnc2Fui4FrclhqXnZbR21qTFZUXlNVe2thT1R1clBRVFdeYnSFaV1gbGpmY1luYVlkcEdAZ1xgZl5dVnteT1VkcFpbamhdV2hgXnJma2dxZ3Bzd4Z4bpWKdH96eH55g4eAdXJ/hoWOg3Bwe3h2dXqGhYeMhnp8f3SLfn2GhISHf35+fYd/fHh2eHiRk59/jHyLbXV/eGSChpWFc5GKb4WFgXqDdGNuallfW1xdVGdyZGBYZHFyZoFzYmtlV1tgan93vq57oLZuYnOGaHN7cXmBhHt+jH53d3J2b3t2ZWpvYId1joFzamJef3h5i4RmcX9oa2taVm93iaOBhH9xmZNygXl2hG+Cg5GIdJaJjYiFiYV9eHRxbmh4X2psX212amdqa3l3enZaZ318eGVyfm6EdGV1hY2Gln9wjGdreoR1bnViXXF9bHV9jHyCZnaHfW5xaXZ/eX+Ac35te3yCe3lxZmxibYl9bG5Xal92VUppak5RTmhNWHtoYU5VdmtMUVRVX2Z1g2ZeYXFoZ2JXaV1cbGhKRGpZYWRXWVV5WU1WbWpZXWtkXFllY150ZmxkcWdycHWBeHCZhXZ/fnd/fIWHfXVzgoiAlYNuc3l7enNyhYeJiIN5gX51j358hIqOhIKEe36Lg3t2e3d3mp2XeoqChml2fXtsg4SSf3GOgXCFgn6Bf3BmbGdYXVtcW1NkcGReV2JydWl1cGVlYldcXGiAcG9ygHOJZGR4fml0dXNygYN3gIR5dnN1bmt6cWJna2eGdI2DbmZdX31we4l/aW15Z2pkVVdyb42mfIR7dpaRdH1zfXtvfXyRhniafYiGg4aDfXVvcWxndFxsZ15sdGRnZWl6b3tyWWeAdnVocIF4gnZid4WLfJSBb4xqbXuCcWdzZmFuemdzeIt8fmJ3g3dqbHJ2e3F7enR+Z39/gHl3b2RmYm6FfGxrVmlib1JKaGpPS05vR157ZmFNVXRjSk5TV2Fqdn5lXWdzaWZgVmNXY3BdTEtqWGNhVVRVc1ZMWHVkWl5rYFxaY2VfdmdtYnBpc29yf3V0mYJ3f4B3f3+GhXp9dIKEfpeFbnN0fHp0cYSFj4GAeot2dJB/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx6dYOBi3puhHN5hH2Bg3VuamhlVl1bWlpTYm1kW1hhc3tpaG1pYGJXX1tqgGprcIBna2BoeXhqc3RzbYOAen98dXVuemhqeWpfZW5ogXaQhGdlWGJ3an6He29qcGdmXVVYb2eOqHeBenyRjnl2cX9wdHd6kIF5lnWGg4CFiHZqcXVnZ25bbGNdbXJfZ2FqeGh7bVtugnJ0am+Bfnp3YXeFhHiPhXOIcm95gHJjcWlccXhkcnSJfHljdIBxaGp6dXJteXh2eWSEfH95d3FkZGNufH1ra1VoYWVSSmxnT0dRa0VheGdhTVNxXUpNVFpla3Z6ZV9tcWlkXVZgVm5uV0tTaFdlXlhOVWxUSlx5X1tfa11dW2NlYHlobGBvb3VucHh1eph9d4CBeoCAh4Z6eHmCfoGThHJ1dH95dnSEiJF9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSrn396iIiDa3KBeXWAf4F0boZufIBzioBqb21kZFhfWllaVGFqZ1taXnSCaV5tbFxhV1xcbIFlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWVzaHp3k4FjY1RlcGeChXd3Z2lqYFdWWWdjj6dvfneAi457cXJ+aHpwe459eJByhH1/f4ZuZHVyZGdnXGphXG9vXGdfbXVkemhddIBvcmtyfH51dmJ0hYt7iIeBgHhydX91YXBtW3J0Y3FzhXx1ZXOAbWFte3Brant5dnNmhnZ7e3ZxZWJlbXJ+amxUaF1cVEtyYlBGVmFHYndnYUtUb1dKTFhYZ2t1emRlbnFmZFpXXVh2ZVRKXGJXZ1hZSVdlUEhieFpdX2xbXlxhY15+aWpfbnR4bXBudoOXeXKBgHx/iYyGfnV1hnmHjH10dnWCeXp6goyOfX6EiWlzloF6ip19foV6gXp/fIaIc3GPrYx7e4ePfWVxh3lzfHt1cm6FbHt+bI96YnBvYmVdZVZZWVdjZmtfXVxyhWhYcG5bXlhaXGx7Y3B3dm1iWmxzc2d0dW9sg3h+gHh3bm50ZGl0ZVtndWZ2dpJ5X11SZmZqg4J0fmJkaVxUWF5iY4+kaHh0g4aQeW5we2l5bnyGfHaKc4F4fHh/aGR2bGBmX15pXlxza1llXW9vYnplW3d8a25ub3h5c3Vkc4OSfoeDiXt2cHJ+c2J4ZFxwcGJxcoJ9dGdygGVebndpZWh6fHVub4J1dH10cmJfZm5ufWVpVGdYV1NNd19RSllYSGJ1ZGFJVG1TSk1aV2lscXtibGxzY2JaWlthd1xTTGRdWGlTV0hZYE1GaXVYXmBsW1tfYmJchGlnYW54eWxvanaBkHhtg36AgZOIhIF2c4h0jIZ0cnd2gnd8fX6MkIB+k35wd5WDfJmSeYCAeHp+gHSIg3RwmaJ7en+JlHhkdYd4c3h1a3Nufmt4fHCRcl5wb2BnYmxUWlpXaGNtZlxbcYllU3JuW1pYWGBsdmNpdWppXlltc3Bsc3NzaYR8f4B8dm9ubGRpcWNba3JkdXaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VycYWEkXRsbHtucHF7fX1ygXiAc3p6emNldWhdYllgZ1pedmhXYl1vaGF3YFt7dmlqcm54c3J1aHGClYOHfoR2c2pxfW5md1hdbG5jcnOBenRnb35bYHByYmBrcn5tbXV/c3F4a3BhXGVsbHphZ1RmVFZRUHVbUU9YUUhjdGJgRlVrUElQWlVra2p8ZW1ucWJbWlhZbHFXUlBnV1doU1RGWVxOSHJ1WF9jbWNYYGBhXYtqY2RteXhrcGl1eYZ7a4N9f4SafIKEeXyHbo+GcW53en10goJ8i4+Cgpd0d4KThYGfiXWBgIF0f4Jxh4J1b6KXc3uGi4Z7ZXeKbm16bmZ3cHprc3ZyjGtedG5hZ2VrUl1bVWdhbGtaXHCMZE9vbl1WWFVnaXRoYnRlZV1ZbXRtb3V0eGqGfH98iHaPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGGXWNfY1RaYFljlZVjbnCDhYp0a2h8cGZ0eHV9bXp1dm96fnVeZXJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXNxdHB1dmtthJOBiXuFcXNnb35xc29UXGdrZnF0gXdzY212VmJybFtfcGd+Zm13fnNzc2ttYFpkamp3X2dUZFRVUFRtV1FWU09HZHNfYUVYaU9IV1RWbWhkfGlrd2tiV11VW3RkU1JXaVJZZlRTSFpaUE14dlpfZWxpWWJgXl6ObmFma3l1bm9pdnZ/f2yDgH2Hl3uAh4GJfmuTiHJndIB7dYCCfYiOf4uTcnyKkYWHn4Z7f4aMc4GGc36Cdm6ljHKBjYt2d216jGBke3BmeHJ4bG1xdoJnZHtsY2ZnaFNfXlVnX2xuW15tjWhOaW1gVFZTbmd0a2V4ZGRcWG9zbHF6d3Jsh3uAd5x6eWthZWxtXmBvamVxeX5nWlZYYGx4fHtwhF9iXmdWWF9XZJuIYmtxgYd9eGxreW5cd3Nte2p2dG9ve4ByWGltXlhcVWFiV2RwY1NeYWhhYmxaYH5rZmtzdm9td3dsaYWMf4l7iG1xZnF9bnNuY1phaWlvdIJ0c15pbVNlcWVVY29je2Ryd3x3a3Bta2BZYWdodF1lVmFVUk5YZVJPXE9PSGRwXWNGWWlNSV9LWG1kX3hobn1kYFVfVF11XFRTYGdPXWFVU0pcWVBZdHVdX2VsaFhjYVtejXFjZ2p4cXNuaHZ0eoNygoN6iI5+fImHjXlukIp0bHOCdH9/h4WGkoSVj3l+jI+HkZuEgHyMhXOAgXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjY2Njo2Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2NyLaW5ubm5vamZnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn64tiZ2dnZ2hjX19fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaTlJSUlJSVjYmKioqJiomIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkZKRiYeOipCSkpOPjo6NkYiPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuLi4uLjIyNjY2NjY2NjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx9fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeJh4aJhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhIeGhYWFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmDhYWHhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjoiHhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Qjo2Mi46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKHjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLioqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyNjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHR0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnJ0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODk6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VzcnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GBgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0JDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgICBgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIF2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg6ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXtOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/QD89PkFAPT49Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkVDREE/QEBAPz1AQDxDY0RAQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjo+PT48PEd7Wz5DQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERGSERAPjw7PkBERURAQUZCUWVucHlxRURERENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdVZWF+hYWFgHpUQUFVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtLSl56gIODgXyDfmNObISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N1dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLZH+BfoOBfYSCe4CGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISElIS0tmf359goSDgYKEhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6fHt8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0hLR2qAgoKCg4KCg4KDhIaJiouMi4qJiouMiVQ7ODY1Njc2NjY1NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODk7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQkRFZoKCgoGDg4ODgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojs6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODg7QT0+PkJBP0FLTE9RUFFPT09RV2tycnR0dXd6e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE6PUNTgYODhISEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8Ozk7PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pz5BP1mEg4SFhYWGh4mIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs8Oz0/Q0JAZ4WEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURGRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PEA+QUBFQk5+g4SFhoaGiIiIiIeGhoaHiYqKi4yNjIyLioqIV0dMTE1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUtJS0lLS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc8Pjs8Oz5AP0E+QUBEREhDaoWChYWHiIiJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtHRUdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw7PD06P0A+Pz9CQ0ZFTFd+g4SEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSUhGSkpFSkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozg8PTs9QT0+QEJERkdRb4SDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMi4uLi4teUlJQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgICAf39/VUVDRUVHR0VEOz9BOz08OT89PUBCR0ZARUdFSlF3hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTlNUT01TTFBTVVdSU1JQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj5CQkZWTURLTElOUnqGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0xLR0hJSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQkNGRURFTFhSTFJSUFNVeoaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU290dnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNSVlhWWFd3hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFNWV1dXWW2BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUVVSVVNWX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XlxWVVNST0tGQ0RBTV6DbFZSU05PUU9RVlJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSU1RaXW1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUENDQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdISkdEQkFDQE9QTVJkdHV2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QD8/Pj5rUUthRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz88PUI+Sk1GVW91dXZzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFDQlxdT3tOT09OS0xNT09QTEtMV05JR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx9fX5+fH59fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJTVlhTUllUTllaW1dZXF9fYGVgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZDTVJQYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojk2NTg2OTc5OjM2NTc5NTxCPWZ0dXZ3d3l5e319fHx7fH19fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUFFVT0xSU1RXWFRUWFFMV1lZVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNRUFNaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OThHbnJ1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWWFhZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KTk9UU1RcVlJVU1NPTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3enp7fH1+fX58fX18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9KR09QT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFPUFBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PT08OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUE9SUVBNTU5MSkxLTE5PT1FNT09NSExLSUtLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHS0pARkFBQEZIRUpPSFFSYVxRUFJOU09PUExMT01LTUxNT05bVktNUU9HSUhESUpMTEtGRkZEP0NDPj1CRz9CPkFkcXR3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVBNT05XS0xOS0xNTUxMS05OU2ROSkxSSUlJRUFJSkxNTktHSUZCQUJAP0VGRUhETG9wd3p6eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5ERUNLTlFUS0pJTVRGSUlKTEpLS0lKTE1PUFJQS0dDTEdDQ0pKTE1PTklKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NGSEhHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0ZIS0RISUtNSEpMSElKTEpNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2dnt4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkcEZLQ0ZFR0RFRUZFR0NDQD08PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1HSUxHRkZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1NRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkJBRUBEQj4/Pjo7Oz07PT9DQT9BQ0ZHSkdKSUxIR0dHRkVDPz1FRUI+QUNDQ0VHSElHTVBJRkZHS05PS0ZISUZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSE1SVVVST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NBQEFEPEJBPkE9Ojo9Pzs+P0BCP0BCRUdKRkpHSUdGRkZFRENBQUZGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVUWWBfXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01GR0VHQUJAQ0Q8QUFAQzw4OT0+Oj89P0I/QEBERkhFSEZGSEZFRUNDREJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9OTlBNTE5TV1ZXWFZYXltdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJFRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9JVFVUUVRQUU1OUU5NUVdaVlpZV1peW1hhYGBgX2hlY2BkZWdnamhoamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURCQ0hFPEBFQkQ8ODo+Pjw8PUJCPD8+QUJGQ0VCQkhDQ0RFRkZHR0lGR0tIQ0lIR0lHRkRIS0lHS0lNS0pLTEhMSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXmBjXlxhY2tiYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJFR0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREZGSEhGSEdJS0pFSkhIS0hGRkxISEhKSE1MTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJlXWRgZmdgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXd1dXV3dnV3c2d0cmtxcmtyd293SUpMSUtHQkVERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFREZIRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTUpKTUxNTk5PTE9QUlVXVk5OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFhYGNkZWJkaWNkaWpndotsa2lobW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3Bzd3R1dXd2dXV1ZXFza3BxanJ2cHdKTExMTUdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0dHR0ZFSkZER0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFMU01LTk1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZmJhY2luaWNpaGhteHZtaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0VBQEQ+PkRFRkM/Q0FFQ0RGQ0NFR0NCSEVCSElJSEhLRkRLSkdISkhJS0dKSk5LTkxJTEhKTUtaZkpkXEtsUkhPTV9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxrVV93dmlqaGhmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENDQkVFREZCRkZHRERLRUVKTExKTE1HR05KSEpLR0tKSUtLTkxNTUxMSUxNTFtzYmRwXmxsVU1OZXNeZ2ZxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9ccHVncU1Lcnl2a2Jha2VlbHhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnR0Ym11a3BwbHJycXpLTElJR0VEP0FCPz1CRUdCRkNFREVFREJISEdERUtIR0tNTUpNTEZKTkhKS0pJS0pKSUpMTU5NTU1LTk1NW3Jvb25wcGxrTlBRbFhNaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhvY15rZmJncHBqaW9wcHJzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQUI9P0BFR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSU1LSEpNSUtJSkpOT05OTUxOTUxcaGR1XWxxV2xOT1FuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWRpdHlrb25xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRkpMS0ZNS0xSUkxHTU1ITkpJSE5ISkpISE5PTk5MSk1NSlpzcHBvcXFtbE9RU29Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXXRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0VFRUBAPkNDQUZDSElNSEZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUlKTElLSklISkxNTUxJS0tLU2tiWmleX2pjcnJaX1prb2BlZVVrX2NbYWJRYG1oXGpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga25wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFydXR3cklIRkpERURGQUBBRURDR0JISkxHRkRHS0xJRUZKTktJT0lMW1FKRkhIS01JSEpKS0tJSEpHS0tLS0dISkpMTExLSUtMTlRbXVRQVU1RUE5PT1VSUE9RT09RSkpOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0hQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKR0dJRUZLSElLTkxJT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1hWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1BQ0RCRElFR0dGS0pLSEVFSkpKR0VISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjX1lfYltgXltUWVhaX15kYmJhY2ZpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNGR0VHR0lKSklJREZLS0tGRklJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUJGSkQ/SUtITltjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJYVlZcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERESkpNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQUhJQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUVFdX2FjY2NjYlxkY2JkY2ZYUVZVU1xYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0lHR0pGRkZJTEpORURKSkxOSkxJS0pISUdCSEhRTUtLT01LS0lISEVEP0VCSEhBQEZFRFRdWV5YX1hfW11VWFhQXV1RS0pXXlheW11WWmFSUl9fYmJgYGJiYGNiYmRkYlhPUlJTXFNcXl1eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTExLS0lJREVBRUNIRkFARkVCVlVFXFReU1ZgWE5UVU5aW01KS1VgYVtfWF9eYl1PWWJcYGBfYmNiXWJiV19fVFBPUVJZU15cXF1eX2BiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNRRFdfSUdHSERGTUpQUEZKSUpLTkxMS01LSkpHRUlOUVFOT09NTk1OSEtBREFDREZEQkFERUFMSENMTFBPT01GTUZGSEpIR0xMTU9QSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUVVUXFlZW15eYWFlZmNoZGtscXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1HSFlNR0hKSEdOTFFRSUxKS0tOTVVOT0tLTEdHS09TU05QT05PT09IS0ZgRURfTERmY0RNW0heXHNtT01WbVlMQ1BfVWxXZ0pdV1VeRExRVUxNU1ZRUlRYV1RYVVRcVFBmWmhoZFlUa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USktHYFRHSk9KSU9NUlFLTUtMT1JVUk9PSkxNR0hNUVtZT1BQTk9QUEpLUX9RSXxZWXJzV1BtSHFub2FWUHFxdE9Ca3NucXRwU29fW25YXVZcWFVraFVdVmNZYFlaX1ZVV39pdHV1X2F2X1liXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4em12fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxMT0hMUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBRS0laeF1UeGRoWVJTUHZndGxwYm5ma1JyTkx3bWpycHNycXJwb3CAXWZ6dXhxcXpxfnJ9a3V9YlJnfGVzc29zc3x9cH55b39yX2BgYmJbYWBoa25rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEtRT01OSk5XXllVTFFTTllZTFNTUk5MT0lRUlRZV1dRVFBQUVNMSGd4bGN4cW1aS0xUeXB1bXVibnZQZGVJZXZxbXdvgGpmeHhpV3JSaXttaWp6en1seHp/cGdvWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVmaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3Z6bnx9eXhybk5KUnROQ0JFUFBJS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWRoYVZuTHFwXkdoeVd2VEtoeH14YHl7c25hXm1vZFNncnVubXlwd2x2c3RxbG1cc316a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tTEtaVkhHRUdSUEtMTktMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnVVV2xObmx7cmFqZ392VUtXa2h9bG1seGBbcHp7X2B6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1JXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFOUFVMS0tSU1JSUk9WVVFRT1JSWFhRTlBVVFhYWFtbVVNTV1tXWFdaUFNVV1dYUV1YVl1VU09YUlZXV1haYFtncl5bXFtdXV9jWl9jY2VmZGNjYlpjY2dmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJNUlFQTFZVVFBUVVhVWlVSWl1WVVRXVVlYUE9MTldUUE5VU05QTkxRUEtKUVFLUU1KS09RVFJRUVNSSUlNTk9RUlFRUVRWUlhXXFdTU1FRVVVWVFpRTlNRV1VUWVZUWVVTUlVTVFVYWVheWl9hXVxbWl1dYGNcXWJiZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlRcYFZXVllVWFRRUEtPWFNQTlVRTlJOTFNQTU5VU05RTk1OUVNQVFFTVFROTE5PUVRUUlJRVldVWVpbWVNVUlRYV1dZW1NPU1RXVVRZVVZZVFJSV1VWWFxaW2BdVllfXV5dXF1gYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFPUlhTUVFPTU9TVU5XUVRUVU9OTlFUVVVUVFJUWFZaXVxaVlZRUldYVltcVlBTVVVVVllUV1dUUlJYVlZbX1teYF9WX11eYFxcYGBfX1piYmRoaGVkYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST01QU1JVWlVTUFBMUFdVUVZSU1NYTU9QUVRYVVVVU1VZWFteXVxbVlJPVVZVW1tWUVNWVVZYVVNYWlRTUVlXV1xfW2BfYFZiXGBhXmBiX1xgXWNhY2dpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5PV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFVTUlRSUlpPUVNTVltWVlZUVlpYXV5cXF5WU05UVlZbW1VRU1RWWFhSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZ15cZWBhYGFjZF9iX1laX1tcW1lYWVdXWltaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1cYFxgVVxdaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVVNOVlJTWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aWFFUVFhYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXV5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFtVVVdWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVU09XUlNXU1dVVltdWFtZVVpeWF9eWVxZUldSWVhZX1lZU1VVWllZVVdZXFVUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZmRiX2RhX2FgYmJfYF5XWV5aXFxaWVpXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFJXVVNSU1hSU1ZUWFhYXV5YXVtVXl9YX19YXFZRWVVZWlphWFxVV1daWlpYWVpaV1ZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYVtmY2hmY2ZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaV1RcVVZXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJWVlJTVVdbW1xfXlpfXFZfX1pdXlleVlNZWFlaXWJZXlZXWltbW1tbWVpYWV9fYGBkY2RlZWJkWmJmY2dmZV5hYmBjXmNjaWVkZ19nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVVYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZWU1VUWF1dX2BgXWFdV2BeW15cW15YVlhYW1pfX1tfWFhcXF1dXltaXFdaX2FeYGVkZGZmZmJZY2ZlaGdkXmNgX2VjXWZpZGVoX2deY2JjYWFgX19bWFlbWVpaWFpYV1tcWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWVhdX2NkX1JZWVBXVldYV1dWV1ZdXV5hYmFfYl5ZYV1dXlldXllYVVdbW2BeXF9ZWV1dXl5gXFpaWVtfYl9iZWRlZmdnYlpkZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxcXVhXW11fXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVpZWVdaWmBeYWJjYGFjX1xiXV9dW19eWVlUWF1dX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZWdkXGVmaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYV9jYmJdXFtbWFhqcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWltbY2BjY2NgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2ZlZmVfZmZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t8e3p6e3p6enp6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycW+pwb6+vr6+ytPS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vbLLQzMzMzMzb5uXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f4B5d3d3d3d3eHl5eXp5enhvb29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6eXl5f4OCgoKCgoSEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dXZ3ent4e3h3dnZ4eHl5eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t6eXl5eXl6enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x7e3x7fXt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnx8fX1+fHd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+fX18fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt8fHx7fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp6enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZWZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMj4uKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIjIuIioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+f39/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCgoKHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFg4SEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoKCg4SDgoKDg4OCgoSEg4ODgoOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgYGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+NjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCBgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYF/gYGAgIKBgoKCgYGCgoGAgoKCgoGCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGBgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/h4KBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKSjIKDhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgoGChoaDgoF+f5GZhoWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIaFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDgoOFiIJ+fX59hZyMhoaDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4mKgIB+hYp/k4+EgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIOCioqDiIKDhYCEhIB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGh4eHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OOiYaGi4N/gICBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhJCHgYKCgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWFiIOCgoKDgoKCg4F+fX5+fn5+fn18fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYGBgYGDg4SDhJGSkY6PjouHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGh4KBgoSDg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GCg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjZCMiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoGAgIKAfn+EhIODg4KCgH19f4CAgX99fn59fH19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn19gISEgoODg4F+fX5/gICBgH59fX19fn18enp6f4KCgX9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f36AgIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359foCDg4OCgoGBf319fn6AgIB/fn19fXx7e3t6enp6gICAfn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36Bfn6AgoSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoOBgYKAgYOEhIGBgYGAgH19fX5+fn9+fX19fX18fHx7enp5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4KDg4OCgoKCgoF+fn19fX5+gH19fX19fX19fHt6eXl5eXmAgoKChIOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeIh4aHh4B9gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgH+AgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eGh4eGf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+f31+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRjIyNjo+KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6OjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIuOjYuKhoSFhISDg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn9/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t9fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJGOjIuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJi4mLiYWIkY6LiImHhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgYB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9fH18fX1+fH59fX19fHt7e3x7fHx7ent7enp6e35+goWIh4iKi4uLiYyQjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+Ni4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjIqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGDgX5+gIB+foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx9fX18fHt8fHt7e3x7fHx8fXyJioiIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoWGh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAhoKEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3t6fHt8gYB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fX2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBhIF/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn19eH5/f3x8fH59foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4ODgoGCg4KBg4J/gX9/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH99fn5/f31+foCBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZxeHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWGhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgIGAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn18e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6enp4c3d1cXFycHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/foCAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f356gZONenx9fHt9eXt6enh5gYF4eXx8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+f3+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/f31+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e41+d3d5fHx7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYSDgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fHd4dXh4eXt8fH17fHx8fH1+f39/f359fX6Af4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYGCg4B/goGFg4OEgYGDgYKCgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAgH+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH19fHx7fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXl0cXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKChoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCAgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t6ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SDhIWEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH96e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KDg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODhH99gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KDg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODhoKDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgH9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfH9zgoN/g4N9gX1+fn1+goOBfH+AfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhoOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9f359gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOGhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYSFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYSGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaDhoaFhoWFhoaFhIOFhYOFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn18fXx/fH5+fH2BgH18fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoWGhYaHhYWGhoWEg4SEg4SHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4aGh4SChIOEhoWHhYSEg4SEhYaGhoaGhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoeHhoaHh4WHhoiIh4aFh4eHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYSFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFh4aHhoaFhoaGhYaGhIOFhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4iHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4J+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn1+f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg35+f4B/f4CDf3yAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2BfX18fH2Af318hoOGhoaGhoSEgoWChYGBgH9/gIB+f4CCfX5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCfn19f35+f4R+e398fICBfYGAfX2DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4F8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dTV1NTU1NXU1NTU1NXV1NLT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19jc3d3d3d3d3d3d3d3d3dzb3Nvb29vc29vb29vc2tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLmzeHNzc3Nzc3Nzc3Nzc3N6goGBgYGBgYGBgYGBgI/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6ODc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmTIpKysrKysrKysrKyspNUVDQ0NEQ0NDRENDQz9c09PS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpps4LzAwMDAwMDAwMDAwLztJSEhISEhISEhISEhDYNLT0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaugRT0+Pj4+Pj4+Pj4+Pj1IVVRUVFRVVFRUVFVVUWrS09LS0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Oz8/Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crKysrKysrKycnJycnJysvLy8vLy8vLy8vLzMzM09TU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7O0NLOz9LU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafR0big0NGcgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8/P0Z2PxLOWmLq6lbi5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvqryfo6iy0ZJ9fq+w0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZu/x4eatNXTzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImavdqjmLXU08CgoNDP0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBm8DXoZi009OvoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5ar2KGYtNPTo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDPk9OhmbXUzZ6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+FnqTZopm118OfoNLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJi/16Gas9mypKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iHy9axg8XWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTR0MPU0dLC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tLV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBCRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLeuqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLW2vL2+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87My8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJCQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFDQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/JzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnZGpkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwsbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m9urq0v7i1uLOvu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vrm8wcHLvr3JxMDAysCxwb+7uLu+urW3s7i8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz05NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88OTc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2diXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmFhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcrGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBwsO7ubO0usG9v8bAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nrK+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXFpVSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDo7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3s7KytLK4vrmztbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SUJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKyL7AuLi2srS2srSvrbu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLavqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vbWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u76/ubS0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PTw8OzpAPTw8Oz8+QkBBPz45NTg7PEZCQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ysrq6t7e1tbyzr7Srtrq4wMTBuru/vbeyrbOwr6yutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7P0BBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6awpK+utcG6tbnVx7WztKuytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsaOlqJ6gnJWTkI+RkJiQlpWYlp+Ym5mbo5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENBRD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaSlrqWsrLS8t6y52bO7rbWvr7O1qqetrKOcmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZabl5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6kqK6trKurr6qvqZ6XnqWdnqWmpKGin6agoq+rrK21sremtdSZwbeysbGwuK2noZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmJyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho5+doJ+ioKKvr6ywsaqoqrLJlqbIsK6trLCnoJ+ioJeRlJugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issbSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShn56anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOemaidrp6nnpyhnp6ampKZnpyhoqCgnaGkrp2fqayjnpeFe4yRsZSIta+oqqyqpaCemZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqefmaagn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKafnp2dl5iVmZ6bnKOfn52jps6jm6WgiXaDc2Joa32Hg6Gzrq6pq6egnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqquo52rp7axrKKvpqGjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3VycGhXW1FFVEhESU9IPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6foZ2cmJufoJugn5+XorDRq5SOiIFicY5sYl1geKCxr6ekpKOgnqWrpp6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsDFvrm0ubq0u7ewtbKqurGuu7e+urqqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGhveGplWltGS0xFRFNMREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkpy6zqKGbmOHX1eHiI+PnLCqoZqdnJ+fmZeYmJKMj5eXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbHysfOv8jRzMfFxsTBu8PAvr6+tb2zrb+/wsLGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6ydn66mpbGqxcbMzs2/sMGopaisraqhnaOfnJ2aqZOZxsKVa1xql1tUcZuws62kn52gm5iXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K0tfR19LU1tPTyMzHzc3J0szO08zFx8nKwcXLxsjIxb7CsrPIxMvKys7Fyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyan8+0gVpcfZFrkK6upZ2dnaGloZ6alZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTSz9HD0NPW2NXW0svJztHLxs3RydLV1tnV19PW2M7Sys/RzM7QzNLPv8fGysPMzMvOz8XGx7bAyr/RzMvPxcnHv8PCyM7Mz9DPzcrIzri3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSEk+O0A4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wsWxtqiipaahoqu1paXSqGpadZWjra2clZignJuhop+cnZqWindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDO09fW09XQz9LT0cnT0cfQ2NfY0djS19nV1szPz8nN0cvOz7/FwsfFzs3R0NHIy8zAysvF087LzsjEycbGyMzK09PR1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1FNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66qqqudpq64qKu319TV2dnRztDAvMzJt7+vp6upo6SxtbGvzaFaZJ+tq6KZlpiam52hnZqcnpN+cmVjYl9fYWBfYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0NTV1s7S0NjY2NfLyM3DyM7Mysu/yb/HyM3Oz8vQzc7Lzs7Hys/Qys7KwsnGyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPDMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWtpa2uvrSwwNjS19rc1s/Ny8TT0MLBsaqtrqulsrG2vsyXWpCinJaTl5yen5+dlJaYlIlrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVysDKwcXMwsjJwszDxcfKys7KzczQzdPLxcjPzMjHysTGwMXKy83P0cbQzs3NzM/Fx8C3uL3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbWdgYHFoWFhoVkxGTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfCuMvV1tna29jMzc/I1tXFw7extaqjray4t8nNl4iajo2YlZCUkpGWlpaQjHxmYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7Gyb3Cx8nOxMHHwMfNx8PLysvPx8PD0MjGwcXHxL7Ax8vLy87CysvIx8zQxMXHu8fDyMjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vbrNzcfQ1dXZ2tvY0MrP0NLUycS5vb6vp7eqvbnOyaGUjo6Xj4aDhISCfoWFf3RgXF5eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsjGwsPAw8fKycjKyMHFzMbIy83JxMLLycHCy9DEy8i/ucG7xce9v8bPy8O/w7vJxsi7yMbEysC9wcvGxcS+xby8v8PEy8XEvMDJwsXH0sTAyL/KycbHxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZqjoJuUe3ZzdGZpWmFubVpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvP0czHwsPHzc/PzNXQ1tnY2dDM087P0MrDt8bAtbW7sL+20rORjJOYh3qAhYaAdnh1cnFfWltdYGBiZGRkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcPGvr61wb3DurzGu8K5s7zFxMHCtr+1tb2/usvDvLW6yLq/vcvDwcXCxcjGyMbQxsLMx7LHycPOzcHFw8C9srewsqeoqLmwpa2wq62slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGw8TIztLLysrHzc7P0snRxtbU1tjOzNDHzMjKxL3JwbG0uba5tLuTjYqLhXmAhoaAfoR8dHVkXFxdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLS3tLKztLq1vrG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bAwry4vcbBw7u1rrK2ur60xLe7tau4vb2/vbC6tq+2urLFvLauu7+0trTFvb7DxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7bDvb22ub7Hv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDMzsjLycvKy8XRztPQz8fJxcnEw7+8z7yyt7u4tbSbjoeJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5kZWNfX1xbXlxdXlpbW11fbHBtaGZqbW5yfKTHv7i4tbCrrKeeoqqnnquss62pq6m0rbawsqmupqyyvLq2w7m6urGrtbm7tMK6sL+xvby7trzHucK2raqosLG/tbe8r7CnsbO0u7yrrbWlrrauurGwqriwrbuuu7i7v7+9ucK/x8PFwbzGwcjLuMXHxb/Gw8O5xMbCu8bJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs7SzMPGwsXQx87CxMfAxsbExMvCysvBw8DGv7i6usm2s7m6s7GpkYmPkHx5foqGenuFgXdvXl1cXV1fYF5fZGNiY2NiYF9dW1taWl1aWlpaXGRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCkpp+qrbW2sb25r7evqK63tLS8uLS8r7i5tLG8wbHArqWooquxsrOnvKqrqKusrbSzpaitoaSuqbKlp6itpai3rLCyt7m6u7G7vb6+xL+1wcDHyLe/wMS3xMK/u7/Ewr7EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XR0M3EyLq6zMLMwLzKuL/FwLvLucLFxLi7wbu3tbvDtrO1tqmtlIOJjYF8foB+eHR/fHN3Zl9dXF1eX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSdpJuYkqGjqqOin6Wlp6Wsn52bpKassq+2t6ewrKeqtKq0urG2ta22ubGvurmxt6Sfo5+msaerqLmqpKeoqKeyraCnpp+bpKWsnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubnCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZl9rb2BVWV5ITmdPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzc4NjY2Ozo6Ozk7Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelJ2hprq2q7Ozu7PE0MnLw8e5uMnCzcC5y7m8x7u1x7q1wsSxu8O5s622vbisr7GpnoSHh4J9enZ0b21rampxaV5gXVxcXF5gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeVmqGWm6KYlo2eoaKmm5+fo6Whp56bopufqrCtsbWiqaqpq6uktLmtt7CssrWusrWusKqfnZ6jorKkpqm4raKmpp+orKqZn6CemZ2fpZqao5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7OzubO9tLaxsbW0v7a9wL3Dwbq7vZeDenJrX2VeZGRYVFhdSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDIycHHvLzFxM+/u8m6usG6tMS3s76/sb/BuaqmsbazpKyto4mGh4B5c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaRnKGiqJ2bnaWmoaWcoKCamK2ura6yoKWiraumobSwsbGsqK+yp7qzprahop6bo6Gto6Gptaqio6adpaajlpiel5manZ+al52dnJysoaumo6Smrauzs6q0sLKqsrm0r6mvsrKzt7Ouqayusriwura5vb+3srGUhXl1ZV5lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLNyMfBxrjCwcjPuMLGv7W8vLXBubW8vrO4vLemo622raOrqJZ9hIWAeXBydHFpZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYWFhYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqmcmpqqpq+wq5ujo7eqoJ+uqLappqetsKO3sKS3n6KbmJiqpqGarLiwoqGknKKgoJOVoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxsLCur6anp7KusbSvvLS6t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Oqu8C9wLmutLjCzcnGw8S+x7nJzbTDxMOwvr64vr+4vb23t7mzpKOtt6Gimp+HgH15cmptcnRwaGhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKannpyfpZ+qr6afoqO2qKChoqi0oaWnpK+lsK2stZ6gnZWUqaGilKyxsZ6io52dmJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepKett7u8wcW6sbm1xcrLwcTHx8i3x8W0xMHIrrm6wLrAvr+7ubS2sqKjrbGZm4OUiIB3b2RiZ2loZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVlNUUlVgYF9gYV9gYWNkaYGTk4iQjpSSk5yUlZajmaCWnKCloa2lpKOio6GbqqulmZ6lsamgoJ2lq56noZ6sramorq2ioaKUl6ObnJCqqLCbn6KfnpeZk4qekY2Sk5WQmJiTm6GinKSgoZWgoaSmm6OrpaKkqqSrrqWtsqmmpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlZSR1FPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4Njk4OTg5OzlAOXu1tK20u7Kvq7Gtnaenr7m5s8DIurXAr8bJzbvCy83It8u/s8DGy6+0u8W5v8XBuruztrGgpqupl5KBjIR8dWpqamxoamxta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eXl9fYmRtjo+EkYeQkY6Zk5SSnJqinJugp6iqqKqmqKWjmKSupJSZpa+pn5uZm6Cer5mbqrOfpaafo6OhlJOblpaSqaqtmpyfoaCalJCMmY6LkIySjZaVkJ6hoKOcm6KVm6CioJiiqKOiqKugq6+krrelo6SirK2qqKuusreyvbWzq6+Yg3NzaFtYWFJVUkVYTFFbWU1VTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaevrZupqKy3tqy8yru2v6zMx8a5ws/QyLXGvbm+xcuzr7vDusDCwLq+r7SroaWpppePgIF3eG9uaW5ubnBoZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/jJCKko2XkZeZoqCbn6qppq6qp6+jp5mfrKCVlqSop52XkI+anq6Wl6eqmZ+clKWhnpKQk5KTlaerpZqZmZ2dlo2MjJSGiI2DkIuSlZGgnqCjl5WflZqgop2Tm6Wlp6iooLGwprG8p6CjrLSqrqewtLC5tcCxrbGrkH1xcmJWVFZOUklHVlFSUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIxLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6u8LL0cyzuLq+wMTGtLK1u7C4ucG6va2vqayoqqWVmIJrZ21ucm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKmImUlJebmZ2omp+ppaSqnaeYoKWbko+eopqXloWEkpqjj5OinJWWlYeimpqTi46LkJqkp5yVlZebkJKHlI6MgYuNgJCKkpKSoZqfopWUmJiVoqWZjJikpqimoaC0sqezt6Gdoresqa2ksrKmtbu1q6uxo4h4cWxdTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHS0hHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8fGuLvEys3Hta+7v7e6w7KxrLShqrLAtreppqevqaqZkJ95X2Bnc3F2cWpuaWVoaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGDjoqUkZOdoI+am6Kho5iklqGblY2HmJqMc42CfY2XloWQmZCTjo57mY6cjIKKgImYn6KekJOYloSOgpN+fnSJjnqQh5OQkJ2amZqQlZCdjqKjjomaoKGjo5uitK+sr6yfmaW4pqWwobCunLC7qqmvqpmBdnJiVU1ST1BNQ1NOTFFNQlBRSElOU01ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTE3NjQ3ODk6OjY1Ojg3QTd4t6KjtKilpqijpqWmpqazp6W0wbivtLDKxbi6wc/Gv7SuvMOusMawq6WqlKGrvLSsq5ujqKelkY6ab1dXYGhnaWhpbmNqaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeLk5Cfl52VlJaUjpaJf5OJXztXb3uLlImAi5KMj4WGc4qEloF5gnqFlJ2Ug5aOkI+Dhn2SeHJvhY1+iYGRjY+XmZiTio+JnIeel4eIlp6aoaCXp6+praionpets6KmrZisq5intKKpraOSfXJtX1tOU1JWTERUSlBNTEZOT0lGTFFNS09KSU1QRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCgrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6KpsKintMG5sLWwyMO4tL7PwLqwsLfEqq3IrKWgm4WYn7eqo6OSoaCfnJGJkGZRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQX+VkZF9iZSMhIqNmo2VlYqSiIWVhniIf2BKUW54ipGEfYSNiYV/f25+f5R3dXV3hI2ZcFGNiIqHfH54k3Zod4WHfoqIlYqNkJGWi4SKiJSEmoyBhJKblp6clKSjqKmlpJ6bsKqhpKSQpaqWoamcoqaoiHRsZV5bSFFRUk1JVU1TSUxLT0lIR0pOTE1US1FRT0ZIQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKiosNDgzMzk3OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+tqra8tri3s8K8t6i6ybm2qKm2t6y0v6mgmZGBjZeunZ6ViZuSlI+LhYZiTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJKBkpmLj3uGj4B1f3hzbnVwdI2NgXl9iqqFeXpodnuOcHJteIGLjJJ4eoB7gHZzcpJ3Z3WEhISEe5WJiIqMioB/hIuMf5SDe4CPmJWclZGfnamen6CdoKmln52YjKekk6Cflp6epH9yZ2BcXEpWT1JHS1hST0pNTVJKSkpNUEhMUUxSVE1FSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5NDc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTM3MjE5ODc5ODc3NTo8Ozd2rpijoZicn7Spr6mlraywsaq9tLK7uLa7tbKgt7uzq52eraqqs7CjnJOQl4SSoZSaiICUhouFgYJ9YktJSUhHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4gImPfISYkoFyh498dntva36tfHOQin97hpKBfX90ZnZ8hmxvaHN8iYyHgGx5cX1wbXWPcWhxgH6OcEOKhIKDhX93d3qLhX2LenV+jpKPmIqSmpujlpmcmp2eop2WjYqlm4+el46WmI92bmxlYlpXV1RRSlNVVE9QTlFWS05LTk9KUU5ITk9LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn5+WoKavrK6rp6mxr7GrvLisu765s62om7GnrZyQlp2mqqWimZuRh5R9jJOQkn15h3iCfnt7fGJLRkdGQUBDRElMTE1RUlBRU1VUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hufHmIkHl8i4VvbYyReHN4amqAgnKWkYuBfZaASZKYbmh4foJsaWNseYWQkoZrc2x8bnJ7hmhtcH9zjYmEhXp9fnt2b3RzhYJ5gXdwfI6MipSDlpeYmpCTlZaZl56XjIOJn5GLko2GkJZ+bWhtbm5XVVdUUlFZT1JVVVNYVU1OSE5KTU5LQ0hOR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDQ1Njc0ODVIQTg5NXeZkZuZmp6lrbCirKqota+urLS/q7zCv6aimpWlmJ6OhYyWoqKZmZKVjXWQfYOJj4x6dnxye3ZydnlkT0VHREA8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4l2gYiGdGyakXRze2prnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtwf3xncHB7bpONjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlI+XjoB5iJeIhoqGgJCHdmpqbmdkV1FaV1lZW01QVVZZWU5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiZkZqWpKiunrKfprquq7KwwrG7w8eblo+VmYuNhnqFkZmVjpGNkYhziIR3io+LfnV2dHZ1bXdxZ1VGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bHKDgYWBeoSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiYBoZmJpbnJtcIN1aW9YdXCOmpJ2bH97fW1xbXCAenN2bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6DgX6PenFwb2teWlxdW1lYYF9TTltaWVhMSEpFSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ6kp56vlaW1qa2xrsGyu8HGl5CMlJCBiX1ugpGSiYSLiI+HdoOFbpeKjH95entxe3N8am5eSlBHPkA3NDQ4Ozs8PT5AQkVJTExMTU5QUVNVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8fYWDf4x+dqKZeX6GgYWZhJucYYaqn52KgpCNenaIfomIjnOKl4+De1xkcXR6e3eKbGdpYXlvhY+Cem6Bd3SEenB0eXdrbmldd4d9h3yIh4+Ai5OXg42FjYd9cYR/hHx1d3t9iXVvcnNlZl9bWl1TW2ZeV1FVWFxWR0pKREtHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyNeIqAlIySnZ2fppGgq6CxqK/AsbrFupaOkZSIeoV2a4CMkoN+i4SPjXmDgnSiho1/f4KBc4OAfGt5bFNXTEBFMjExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+MenyJhn6Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbHyBhod9jmhmZ3h+boWGgoVxhIVHa4B3cnl2aG1rX3Z9g4h/iIWMepWenIqLiJF/e3WLdnx3bW93fn9ycnFqWlxcW2NjWGdlXFVQUFdZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NzU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehXR8foqFiJGPlpiSl6CdrKGmuK+zvbOXjZKLmIt9dHB/iZN/fYyDk5V9hn+HpYiJgYOIhnmIi391hnlfY1ZLQjYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzk0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoaGXlZuapa2Tmruxp7vHw6iLjKGljpOJgZB7coOdn5GcfnaFhYqPh5BpaG+DgHSMhoSLcYaCd4eAe3aFfW52dWeAlI+GiYiHiIehq6KWiY6Yf3uCiXp6b2dreH14fHFpY11aWV1pXGFmX1pPTE5YUlFJUEtETkdDS0RDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnVwZ3iDe4CMgIGQj4uamqScoaymq6+wl5GRhKGUhHh3gI2UfX+ShpOWf4qAkpuOhIGCjIuCio6EgIqAbHBqXUNBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jKGemISShYKPoZ+TmJKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGWhpOKj4+WpbWpm42VooOHk4R+f2tqa3x+fn9xX1xiXllmalxsa15YS0hPU1FOTUxGSVBDRE5GQkNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuaFlwg3B1h3F2koZ+l5aalJ+fnKegqpaTmJ5nZaSafoWTknqAkYmRkn2KhZmSkYOAgIuNiYaRh4SIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDg1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGampmnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N7fXpvZl5bX15gZmNgZ2dcUkVLS1BPSUpMRkZNQ0dNRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcXVgbn1id459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Ljo17ioaPkI6Cg4CJjIqFk4WDhoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dBQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKeotKyxt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsraqji5aYhaamoKKXgqaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWqiZqKk4qVent+g3xlX2ZbZGBdYmNeZmZfW09ESkhUT0ZITEZLSEVGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljWGpwWHqFdoGUhYiCm4OSkI2S2sidlnNWl4iPiJyPfIaMj4uKeoiCh5GOg4WAi4WFiJKGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJUVVVXVU1bUEdHRDw+PkZIQ0RANzs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHIxKuzxbass8CzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4inr6qklHafpJehq7GzmJapraiutbuyuqyvtaKxrLG1vLe1rrWgp6ejqJupsK2yuri4p5y3qY2lj5KToIZ5gYFzV2BiVGVgYGJfX2VfW1RKREVMVlFJSkpESkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hn+AjXu/u6O8grSUk46bj4SIj5OJiXmHgIyTjIeFgY5/gYmPhn+FiIWKh5F6eW5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFdPX1VJS0pBQD9HS0ZFQzs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMq2u8S9s7TBt7jCtb+wt3SxtKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KRpbGtpa2rp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6uL+3ure5ra2xprGqrb6wvbvCwqyZu6iVrY+YmKqJfoB5aVZhX1dpY2lkVVtjWVZUSUhHTFFHRElKQUhEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWlZad2pwf4+EgY6FbnpzeIhiuKGao4mVlJaTlJONkJeSh4d7h4GNlYqAhIGKenyLh4Z9ioKBi4SVfXh6dWVPXGRHRUw6UWRhW15TRj47SFBEWmRRUVlYWmdaVGBhTVNPRUE/SUpIRUZBQEM9RTZCPkhHS01TWlRelK+4tbq5ycC7vcrMu73Au7e1vLy3vrW6ssZgdbKlsZqeq76qpairqqSisrWgq6ielZaemJ+upaempZ+kk6KnsLOosrK8tsG908nJ08bCxczCysPAvr2/u7y3tLC5t7fDusa+w8mwnrqqoqyPpai2iYB9cF5gYFxWYF1nZVJYYVZSVklFRk5LQD5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzM1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdtbHGQjYWQc2xzcnOI1cC1maCNlZmakY6XkZaWjoaHfYeDjZaLf4N/g3h7i4SHe4t5gYqCl390fXpsZXB2WV1cUGVlYmBlZF1bWFdcTWRtVVJtbl9vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVl1aXJO5wLm9t8bAu7nKy7u3ura4ubO4tbWutraZZHWpnq1wXqKtnJihopuknqullJ+fkJSPlpiXqJ+ln56amYOknaykqrCtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKv8nPtKS7sbWwm6y5vZp+eGpcX1tYXWBYYWJRW2BTUUtDQkVGRTxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQjIl8gYNze4qDhXuKdIKKhpV/c3t5bG11fGlzZWlsaWZqamlgZmlobVptdJetpLyHh2dbb2hdWllUSEpOUEpLUUxUUUhMQUpHS1BfX2JnamKXt8ewubO7vraxxMe2sLmxsLuss7Gnq7esjbannpynmk6bno2OoJaRp5illYqTk4iRiY+RkZ2boZiblZaHnpmmmqyvqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzcPR0rivxLzEuqa3u8SigG1iW1tcWF9XWGRZT1xXTlFDQklFQ0k7QUQ+QUg/P0I4O0Q+QEk9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CQmYNocW95eYOgqp6ml42bm5iLjZWRmo59iYyFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2ltcHlpd31+y7/C36dtY3hvZFthYEpQUlVOWV5QXV1OUE5UUVVUXG5ud4Nylq64rLSosLarrb3Bsau1pqW5p6yuoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSKg5OVmJeUm5GbmJmZnp6rrKSnoaysztLV0c3M0tPT0NTRzsjD1NHIztLT09bN0tHF0tbGwc/IyMOpv7jQnHdtZFtgXFVeUV1aT09UUE5IPkFHQkNGPEFCP0ZFPkA/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNTk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bXdwfX6AoZ6eoYuNmZOTjIyTkJaFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBwd3Nsc3x8d3xzgnhxa4BycmlvcXp5c3u+y5p+jLGDdnKFd2hhal1DWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGop6qxuaumtKOirqKkrqKnsZ+JppuVk5GKko6IgpSJa5WijZmEgYZ+kYODk5eti5WNlZmOhZKQnZensKKgoKSkqMfNz8fBy9DT0dTSztPNxtbTzdTY1tbY1dfVydTazcrY1tHKrcTDzIlxbmFeXVdSWFJbT0pHSklKQDs6O0VDRDxDRD5IQz9DQjs7OTw5R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKJgZ2VnpSFi5aJjoqIjoiPgHiDlJmLjYiIi4l+g3hze32Dh3eAe4eRl4GEb3hwbXV/dnh9dIZ8eWyHdnVufXaEdXl7nbWMPEGKxqV+jXxqZVdJQ2VjZmNoamRveVtfZmhrbmlugISIkYyen6CekZeYn6SkprKkpbOgoqWeoamgorGch5+SkpORi46LhoOPhH6cnIyNgoSFepR+gqqVo4ySipiSi32XipqRq7OYmpunnKe9w8W5tsXN0dDRz8vSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzbR1dG1jW1dRVFBYVUVGSklFRT06NzpAQUI6R0VARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXOGjXyXkZ2LfoeSgomGhYqDiH15hZeXiY+Dh4WHeoR5cXp7hIZ1eoaOjZ16jHB9b3B6f3J7gHGEh4Bujnp1d318gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnBxcG54d4JlaW9ydXhye4uHjpOSm5agloiMk5ugm5+qn6GtnKKamp+mn5+smYyajJGTjoV9iIeDhYuOoJmTiIOHfm2ZeYSZhoiTjI6VjIZ7m4iTj66qlJWXnpimrrW8qK29xsvIycvLz8jD0crU1tjX2NfV29fT2dvWz9va0dbI1cyTdnhnZllYT1JTXEdCRUlJPkE+PTg6PT87Pkg9QEJBQURBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fYSYjoeLfoaHgHeCeW57e4eCdHqSno2hdo92g3R1gX10gIRvgpCCb5KEdXyBhXp2h3yJuMalw8q4gpacj3hwZU5lY4J6gXeGopCLeXl3e4N/fIR2bZSWlJWPmJGDiY+XmpeXppyYoJefk5KXo52Zq5aRkYuOkoOMhYmIgYaQkZ6cmYmFi4GFl3uIiZ+XkImOiouCfKGIkIu8oZiTl5mcqKalrZ6ntb7Av7jHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztzGhXh3ZWdjXlNWVlRMS0RNRDs9PTw5Ojw+OT5BNz4/QD1APjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVtodHp5bImNknd2eop8foB/gH2Fe36CkYqFhnqFiHt1fXVtfX2GfnR/kp6Rn4OSfIZ9eI9+eYuKb4ObgHSZhn2CioV8fpF7kKmOkMOgvYycpJx+ioR9iXKMi39zppqcmZSFe4+RiYRpR3GhpJ2Mi5CShYiLkZOVj52bk5SRl42MlZ+dlKGUko6OkIx+kI+Oi4SIkpaan5+JjJSRnZCCjH+mmYiFjoOGhICkhoqLuJidkZSWoqegnZ2do662urSrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbt3d2dWloZFVfWlJPTkhDTEM9PT45OTs6OTk8PTZAPj49PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxc3iKe3t/fYB8iHt9e4uHg351g4Z6c3p0bYF+hH13hpuhm56UkoCMh3+Yh4Cckm6IqYV6oIt8kY+DiYScfpqRiY2jop+QpK+gi5GLhouBkoZXcq2Ln6ycj4OYnJCQjlyDopGCjZ+TlYyHiIySk4yUlZWQjI+KiJabnY+VlpGLk5SGgIuJko2Kip2XmaOihpOdlaCKioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispLzBx83Hxs/Mz8zP18/R1K7W1dja2Nra19bZ2Z1tenJlZVtbVlJVVkNASUQ/Pz46NDk6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieGxifpKDb213i3h6f3uBfYZ8e3aGhYBzcIWCe3V3dnSEg4V9f5Kmop+mopeKnZCUl4qKp5dyirKNhKeShJmUhZqMo5agmJOJm56ik6mwoJGVkI6OiJWLbo23hJrEyLKcoqWbnZiWkbKQZKTNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhH+Pi5mIjpCql5eko4iZnpWaiY+Gl5iKhY+Ngn+Gj6WIjZOpmpeTl5mhmJ+Zk5yaorK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6AcHxlYFtcXE1JU1hBQkdEO0E+ODM3Ozw6OD02NDo6PDo3Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGPfXxtfoh4en57goKDf3Z2gIN8bW6Lf3p8eHh8hIeKfoujs6ejqrOil6efpaSWla6ig5G4lZGzmo2hoYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmZehwI6jybmrm6OmrZmSm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4aVmIaEkZCcdZGYspaXpKGInZqSj4qQipebiYuWjod9jJieiZCQnJqak5iYn5SgnZSem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LR1tjT0Ni6cHdzWl5TXlRPSElNRUJDRDU+Ojc3Oj88PDc9NDM2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p6boWGenyEeYGGgX5weHx+fW9yjXp+gnx4houJhoSSp7usqLK9r6Wts7Ooo6GwrIqatZ2iuKWVraSXqa24p6Wjn5qpl6mjr7CqmpmclJWRl6CYmru7rsqhara4q7CUmZ+jrJOXvaNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJaNi42XmJOdmbSXlaudi5yUko6RkoyZm4qSnpCLiZWfoY2UjZianZKcmJ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8fC0aDGyc3NxNfW0cvToG54ZlpYUVxQTkVDPjxDQUI4Pzg4NT9HPTw2PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEo/i4p+gXOGh32CiXWDioJ/bXx9fX9wd4d3joKHe42PjIaMmarCwK+9xruztMC8tK2rs7aMqLOtrb2rm7ukqK25uKunpqKipKKpr7Kxq52cpJibmJeeoqalkqS6r6nAvK2tsrmlpah+iIacrbywg4yMi5CDjoORjnqBh5CNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpeOkaCRiZSbpKyUlo+UnJ2ToZ2bmJ+hlJqep6akoqSws6fBxsOvsLq2xcTCv82mx8THw7zW0c3EyoZycF9ZV11ZTEpBS0BGRz5BP0I7OjU+QT09NTw2PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRD9DRlxlR2BpZ1pdXJOMi4h7h4yHg4x1hpGKgW9+e4F/cX6Be5V6kpSUmJCTlaezxsm/wszCw7nHvLuvq7m7mLO3urLArqXBpKuwvL2rrqujo56nq660sKqcoKqcoZuWn7C1p4ujuru2wbysqZyypaSplIWOqcTDpIKLj4eIhIaVlI16hI2Rj5GijIyUko+Jl5+Yk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+gmKSfmqCboJSYnqWjpqakr66lwMTDrqi3tcnCvrbPssS/xLyz0cnIwrRydmpZVlloUExIQkxLS0pBQT1DRDw1QUQ7OzM9OEIzMzIyNjJBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWU5lXGZUY2qZjZeKjIiTkIaJeYeUkIFygHyNf3iHgoKQeo6hlqiampi6vcfIycHSycrCzb3Cs628vqi6v727w7eswqmss7y+qrCqpKWkrK6zrba1oJ+vn6WimKOzvambqL3BpLa3sKyTsa2srZeHmqmnpZGCjJOllYmBdoqReoWNkpCen5OPlIyPjZWjmZaclJSjnqqfkaWajI+Pj5WWiHyPlZKSo5qVn6GctaWQnpelo6Klnp2mmJ6Wl5uko6mnorKsqLzAxK+lsrfMv7mvxLO7vsK4rcLDwsCXandgVlVaWUlKTElGRERIQ0JBREw6NERIOTs0PDdFLjEyMzUyQjI1U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+KoJOEeIV/lX9/kIiKkICWoZmupqSYwr3Hw8fF083Ozcu8wrewuby0vcu8w8G2t7yts8C6vK6vqKCpqLatrqmyt5ueraKnoZ6rt7iqpbC/xbG9ubSoqrW0rq+XlqWsqKCRjpKyxaeVjn2SlX2IkpmQqpmYk5OPk5aTpZ6SnZmUoaOinJifmIuMj4+eiFqQlpeSl6WZZZijn7OllqGWrKypp5ueppeYlpeVoKSopZ+2q6q6u8O0pbO1y8C4qrassru5rqi4ur24gWlsWFVTU01ESlJNSz9BSEVESEhIOTVFTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnBFaUlSZWJMRqWUm5eil6mWjZCDh6aTiIKHgpyDg5WQkJSPmqKfr76voca8xMTGxs7OztLKvru2sbq7u77PtcO9uLm3srG1s7izq6acq6y5qqmnr6+Yo6+kp6SltcCwrKy0v8O6wLq0qLm1ubOvlqWtrq6ki5OVoY10wZp9l5mEj5aajLGVm5qVkpOamqWjlKCbl5qpnJyhoJmKjZCWnGBKlpyalZqlllWXsJ+vnJ6klK+uq6WaoKWUk5iYjZygp6KZtKmqs7u7u6qwsse/uaasq62ysqOhsrK0pG5rY1pYTU9KRE9PUFE7SEtJR0lDQz46S1Q/QTo9RU0wNzU0NDpCNDRNV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGYh4uolo6Ik4Wfh4Sdl46doZujpLXItanGucLDx8rJyMzNxr67s665ucHBzLXHusG5tbqwr6+ztaekm6q0taqppq2smqSupaSorLq/qKy2t77Cv765tLPEsrm9rKOvtay5poibl6abdr+fhJmdjpOZmouul6GcnJeVm6ChqJ6nn5maqpmhp56YkI2RnYNudpKimpWdop6QrrKiqpSoqpeqraOjn6SokZGZm4eUnKKelrGnqau5tr2zsq6+ubego6eopaacnK2pqYtgY15eUElLRkdNSVZMPU1FTktMQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VFdOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH9lXkhFq5WboZ+7r5mUn4yTq5uRkpOJq42Hop+MpK2Uo6O2xr60wLrCwsfIxcLNyMG+ubKvuLTAwsq1xbLBvLW6qqmtrbCjo5iqtLumqaarqp2pr6ejqqu+vKitvbS4vse8t7a4wbK+wbSptbervqWPopiSop+8n4maoJmXnp6Pt5+pnKWim5yhmqiks6GbnaacqKmemZWPlJuLl4mMpKKUnaKeobWvpaSTr6uZq6qdnaOjqJCUlJ+Cj56em5WppKGhs7S6ta2otbKznpyipZqXlZmqoZ51XlpdXElHRUZNUEhNRUdHQ1NMSkJFR0FWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OccGJHRaeXpJ+ew62bl6WYmqmclpubj6qWlaemla2smaKrtsTCvL63wcLAx8O/zca7vbmysLizv8LItb+wvLe5t6Wkq6ytoaGaqqrFoqSpq6aerK+roqmov7inrb6xuLbHtrW5uMCyv8K3tbO0r76jl6OWlJuUrqCQoaOlo6OfkL2kqZ6oq52doJuln72imaOfoqmroZ2WjZWek56Hj4SNk5+koJ61rKWblbGnma+mnZmqnJ+NmJSehI2gmpuSpaSamKuxtbGqpaqtrJyYoKCSjpCVqJ6UZmBYX1xOSEdKTktIRURJQT5RSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNDZAOTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm1SRjxLeGViVkyimqOcnsWsoZ+snp6uoJKjn5aln6aqrJe2saOqs7bExL2/tb/Cu8jCvsrHtbi1tLCzs7fBxba+sbi1uLSfpqyqrJ2dnqWkwaSfqq2gpKmtr6KmqL21pbG9uba2xLK0uLq/s8TBuLius7W1o52llZGUoa6gmaKeqKiro5rCramerK2bm52ZpqC9oZ2kmKurrKaimY2an5KfiY5Xf5afpaGguKqmk5i1o5+xoJ6arpadjZiTnYGOn5eVjqKjlpCmrrKrqaGhpaWVlZ2Yi4+RkqSeiV9iWGJfS0hKSk5FRUFHSz49SkI5OUpKTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtOnp+hmZ7DqKWitKKdsqiTq6Wgo5+tqaydu7CorLaxyMXBwrLCw73Gw7zEybyvsLatsLSvv8S0ubGwubSsmaiwqaqanaWhqMGsm6ywnKqjrrGppKi9tqe3u76vt8SttLPDwLPHtLu3q7O2raqippaVlKSsop+fmqirsK+vu7KmoKmomZmXk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWemqKep7SmpoyYs5ujrpmdm6yQnpOVk5l/kaGVj42foZOLpqyvpaahnKCekpKak4WLkY2cnX9fZFpmZEpJTEpSQkNASUg7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+joJygw6mkq7OhpLSqlrOsp6KksqyuqbuxrbC1tMbAxMO1wMS9ycS1v8jCtKu1qK+4rL/Ds7eurLa5pZiqsquqmJ+ml627tJunsJutoK60sqerubOourS4srnAqreyxL61xqi/r622tamnrKGXl5GmpaKimJilr7iusrW2oJ+opJqVlZOkoLeipKWWr7Gyp6qmop+bmpuWl6ifoJihnq+yoqaMl66YpKqXmZ6kkZqMk5eZhZWelIyPnJ2Ti6ipqqGnoJielYyOmY+BhZWIlJ53YmdcamlMT01OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko52ipr+nqK+woam1q526saujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDFwLqptqSsu6zAwre3qayxuqGUrbGtspalp5GquamfprCdq6CwtLOqqba2rbyts7O5t6y4sMO7vr+mw6uwt66pq6unnpiZq6GioZGXobGvs6ywuZqcqaCZlpKXpqG2qaWjorCxtKuzqKyfm6Cgm52lnKKXnaOzsJqfj5Olmp+ompOinpSXiJOWkpWWnJOIkJqZlI6oqKafo5uXm5OGjpiLfYyWhY2ZaWdrYGxtV1BRWlRBQkVUQDs7SEE3OlhQZF5QVldFWV9dTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9qJ+doqq9oquwq6OxuKqltrSsoK21va6zuLu6vba2wMK/yMS5xMLAwLjEvcG3r7Wnq7exu76+tKiusbaelquuqK6XpqiOp7ufpKyznqyisbCzrKq2tLW+rrCxtaywtbLBu8W3q72vsbisraqjsaaepaqfpJiQmZ+zqrOrqrOanaebmpWOoKaltK6noa2trrGntK2yqqScn6ijnpWhmZuotamWmZGSnpmdn52Pq56Wl4SUloqdmJyTiY2Wl5qXpqWioJ2VlZeTf4+UhXuOkoKLlWRrcWdvcV5GWWZWREJNWERaOUhCNj5cUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoaSstqWtqqavrreqr7W7p6axt8W3sbe9wcK1tLrEvszGucLAur65w7fAubG0q6m6tru5vrSprbC1mJinrKqsm6urj6u+nqyusqOrn7Cts66utrK5uKqurrGota+0vL3Ks6q2tbG0sK+nobOgm6itoKaWlpqasqKtoKWvl6GkmpqSjqOmqLOpoaazrKq2pa+xta+kmZ2tp5qYn5qZq7eil5ORjpecoZeWlKuempJ/kpeMnZyZlpCKlJKemaWioaCYlpGTlXmKj4V7jIqCiZFqbXdtdXthRWBrWUlIWlo9e0pGRDZBYlRpW01cYUpbXVpSUlJiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lVS0SZl6GxqLGqraakr662qbe1uqSstLfJu7S6ur+/tLO3w8DMyLzDvLe+vr+3vryxvK2nurm3tsK2qqywt5SWp66rqKOwqpSvu6StsbOnqKOytLGysbWxuLOprquyp7evtrTExraptrassK2pp6O2oKCnsaGklJyZlbGep5ygqo6pop6blpimpqW4p6OytayosqeusbaspZmgrKibnJ6clKm4nJSOjoqYm6KXj5iloJyUgpGVj52bl5aViJaPmJqnnKOgkpaRkJV1hJCHe4SBg4uKbG92dHt+XEtlbVxLTmNcP2J7R0k4R2dXZVxMXmJNWFlXVFdUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLT1FTFE8M3JrSUNDkJmlrqWtr6uopbGztKu3sregq7W5ybmuwLvCuLOxtcLDzsXAwb20vb+/ur68ssSnqbmwtra/vK6rsrGboKexraalr6WdsrWsq7GyraqptLustbO1rbSsqquorKm5rbKxyMC4pbqwqa2tpaiusKalo6+kqZydnJuvmqOjoqORrJ6joJ+iqqamuaSstbalq6yora+2rqOeo6mqm6CampKks5mOiY2HkKGglIyUnJ+SkYONkpKdmpeVk4eXkpWZp5ufnoySkY2Qdn2OhXx7e4aJiHBycX18fVxTZG9eTllmXEZElltHO05tWGJbTGBiTlZWVVdUWWddUVJMY1paVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis7SD8zQkhTLD6QaztHSI+cqquiqrGkqaWztLG1tbKyoquuvcy6rsC6x7G0rbTCw9HFxr7As77Bwru+t7vEp6y3rLO4vMCvq7Gsn6OnraqopLCkqrKqr6ywr7Cuq7O8p7exsqmzqaulpaOtuqyqssO6tq27qaioramosqWppKOuqqiinpyjrZWlnpiemaydoqepoq2mpK2ruLKyoamioKyvsayeoKeoqZmkmZmPoKaXhoSOiouen46KjJWbjo2EhpCUn5yUl5SGlpSTl6SbnJyKkpCNiX5+h4V8d36FhIVycXCIdWtfWmBuY1FzcVxLO4R8Rj9XdFhhWk5jW05WVlVXUVxiX1NPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlVo+TEWVmK2ooquznKqqsLatubavq6arqr3Ju7C9t8KvsayzxMPOz8O/v7TAwsO6v7PIw6uut62yuL++sq2tq6SnqrCpp6ixpbSuqrCurbKxtKy0vKW4s62srqern6OesLerqq27t6W3tqSqp6yrqq2hqaemsbKkp6WhoayXqqGVm6CmnqSiqqSto5+nsbiurqOmopuqq66pnaKlpKSZoJqWj5ickoGCj4iFnJ+Lio6LmI2PioKLl6ObkZCai5OSkZOjmZuaio6Li3yGgYGDenR/goB8cnWLpId4al5gbmZXZYdjTj9nk0xFYnlXYllSZVRNVlVVVE9cXWFVS01oVlVXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxCKzpKT140RIY+SEZEl5KwpaOrsZirqq22rLayrKasqqm8wMC4uLO7taayr8TJy9G/wbu5v77BuMG5wMStsbWxs7q/vbKwrayqq6e2qqatr6q5sKixsq6yrbeqt7entLerrKSpqpyjnrOzqKiktLWgt66gqqirqKunoKusqbm2qaqpqaKqoK2bkqqhnaCkoqajqp6dp7SvqKaqoqOYpaenqpyjpKOgmpigkY6PmI1+h4yHg52dhoSKio2Nj4uChZSimo2MmZCSkY+Tn5aYloyLg390h4F+f3h0gn55dn6Ah52Pb3FnZ3F4XGFziGtPXplWSG14VWRWUWNPTVVUVFBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EO5aOsaGmq66arKWtsLS1sKymsKqpur67wLCuua6ht6/Ix8jRwL69u7zCvbrDwL6/rrKysbW8u8GxsbKrs6iktKilrbOzubGjrreysLK7q7qvqq62rKqeqqyfo6C2raihn7CzorWqnqinqqOqoaKsrai9r6yurKKoqKCsmZCwopiioKennqebmaqxqqOgraKhlKOjo6eYmqmlmJiYno6Kh5SHfYyGhIOjloSBgYuGjYyQg4OToJaIkJyQk5CNkZyUl4+KhYZ4dIF/fHV4eX96c3N5Z3+GpHVpXmRrgHRniIx9U1hwXkp4c1NlU1FeTU1SWmZOTFZZZFhGU2lSUT9DTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQTSQj7KhpKaspKekrae1s7GrpbCnqri+wLyvp7mqpq+wycfI0cK8v765vr+8ybrAuLCvtLG6u7fAsrO7rLisorSnp6yytrmzqKi9tq62vrC9p62staytnKmvpKClraunnJ6rs6W0qJurp6mjqZ6kqaipvay0r62dqqShrpybs6OVpJylpZ+km5qpq6afm6qim5OcoaWemJepqZKYmpSQioKPhX6OgoCHnY+Ffn2Lh5CNj4R/k5qThZKhjJSRi5GbkpWHiX5/cnt6fnxoeHx6dG9we2eEeISIZGFnYXGEem1neF1dVUBXem1UYVBSWEtMTnJ1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0FKN0dTYFUqPTlEVz4qj5SymqCgqaaloauluLOzpqqxp624wb21r6K4raiosMLJyczBtr3Atbe/uci1wrWzsrWyvLe5vbWtuba/raGzp6ursLW4tayfvr2qs8G0vKGvs7Wqq5+tsKOcpaiqo56bpbGnsKCfq6mooamcpKihrbuorrCtoKujpK+fn62ml5+boaOcn5yapKqjm5ulpJaXlZ+ilpuXpqyMnpGRkYuCioCAjoB7mZONiHx+i4aPjYuKg5KYkYaToomSkoeQmo+TgIh8eWx+dnl4Y3t6cW9vcXZngHNqg2dkZ19sco1sYWlvYG8+WnhrVV5PUVFKSU1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDFBaFkxM1M9ZV9ETDZLVmRPKjsyTlg9I5OZrZqgmKeko5+opLiwr6OvsKqruMG5s62fuK+rqLS6yMvIv7bCvrC0vbfEtsOxrrmys7+0u763qbm4vauktKipqrGuurGrnLy9pbDBtbair7e1pqensbOgnqSlp6GlmZ+sqKmeoKqvp6CmmKOpoLG5n6Owr6Gsoa2knKanqZqam5+klZydmp6pppecoKmTmZSYnpOZlqGqkZqIjo+GfYd+go19fKCMjIh4gouEiYuLhYeTmo+IlZ6IkZWCjJeMkX2Fe3NwfXF0dGB5eGhucHBuaH1xY3ttaWViXmSFfl9acmpxS0p/aFhaTlBMSkhQUlBJTlxfblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+MFhWNSiXnqeanZasoKChpKK4q7KltLSqqbnDtbOtn7etrq2wtcbIwbe+wbmxtLy2v7u+r6q9sLO+sbzCuam7urenqLWpqKuxrbOxqJu+uKatvLeyn7G4sKilp6+xm6GkoKSkoJebr6ehn6Oor6GgoZSkpKK3sKGmsKufrKOvmJyqpamel5qepZObnZqdpquanZ2ml5aYlJ2Ok5eiqKKQiIuPhXqEfoSKeo6WiY2GeIGHg4iLjYWNk5iNjpaYio+XfoaXi495gXpwcndvb3RfeXdka2xraGeCbWVya2tlaFlhc39eWmt1aVlHfV1bWE9PSkhIUlVGMjpfXmxQRFhWWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0JnW0hUQ1RdaEUuOzFfVCwylqOimJWdqZ6loaOhuKqwobu5pqy9xLOwrqK1r62tr7TExL2zvrq3sbO5uLq4uq6tv7O0uK+/wbisvbq0pqKzq6iqs6yusqOdwramqbe3q5+yu6mmpaivq5mip5ylppSYobKmmZ6lqamcoaCUpZ+kuaikp62mnqWhqJOfqaKhoZmbnaGSm52XoKKrnJuaopaTlZabjpOTo6ekj4iKjoZ5hHyFhn2cjImKhniAg4eIiJGFlZOSjJCVk42OlHuCl46Ld357bHVybWxzYnl1aGdpZ2VthGdnaGRmaGleZmJpZlplemJgUXNUW1tTTElHSU9TQCEral5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc4Yk0nMp6kpJKOpaacnp6epLWtqKq6t6esw8C3r6yhta6nrq+3wcC9scG3sK+ytrW4t7Wsqry0r7KxvcC3rry8saWftqymprWqq6+hoMSsqqextKustLqeqKmrsaWYnqqeqKWSmqauo5iepaqhm6Kdl6Cdp7amr6quoaGdnaGVoKafoqCZm5qckpqelaaeraKYl5+WlI6VmIyPmJqnoJCHioqIeIV3goKCnIeKgol7foSIhoSQhJaVj4+QkZCRjZJ7g5WOhnN/fWd5cGtqbGd1c2tiZ2RidH9hZGVmZWlpYmdvWV5YXW1kYE1oV1tgVklHSEtMUlg+OWBsaUdCVVNdW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE49QjwwKjxAO0E8LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQWRHJTWcpKCRjK6gmpigl6W0sqOyvrehscW7ubCxo7asq66pub68u63Asq+vrravs7myp6u5sa+us7a7trC5vqylnrWroKGxpauvn6XEobOlr7Kwt621nqyurK6imZ2nqqWflZynpqCZpKOpnJqgnJWcnq2wprmnraKhmpqemJ6jmqWdlp6Ym5SaoZKolq2pm5SdnJOMlZmOlJSYp6eNjYqJjnuBdIKCipiFh3yJiISEioyIkoWTnJKSj5CRlo6Qf4GNjYNvgX9meW5oa2pncXJrW2hjYXJ/YGRnam5rZmpmZGxcbG12cWFUYmhjZVpJRkxNT1hRUFVhZYFUQFZTWVVGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUlkQic0k6Kcj46xnZuUoZqpsrCfucC2oLTBu725saa2sKmupbe5t7isu6+tq6u3qrS5raWytbGvqbG3trGztrunqZ+2qZ2fqqOqrZ2qwpmvpa+xtrWsrJ6xra+qopudpKypnJWcp6SemqmjpZWaoJ2RnKOrqqm6n6akoJiamp2hj2uilZiccYOWnKSAdpGrqJ6WlqGRiZeZgJeKn494hZONg21pfneEcmyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R/g5CAZoiAaHZpZlhdaXRuTlBqY2ZxgmZeZGZua2ldXV6JkIWIaE9LRDhFVGdeSkhQUFVVS0hTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOXEtbZmI+RzFPYjwrL42kmoeVsZudk6Ccqq2ro73Fr6m3wri9vK2ntrGmq6S4tLKzsLmuqqestKWwtaKnuLa1qKestrOutK6zoqmftKueoqWcp6ibrr2VqKewtLitrqSoraqrpqGfnKGoqJyXoaamnJynqJ2SnqCYkJ+oqqO0r6Oio5yWmJiXo4ihj5KahqGIlJ6hf6V/p6yelJOdk4iDcniMjoOHoHWIjWmXiWZ+c3mgb4iHg36MfH+hoJ+Zf3uHnnSIjnabimyHgoNuaWVke21yYlSGbWNtaZhxWGlwboZXXWlba2paiHBteXKHaYeEWl5GTj5GXk1FUlZWUVBSV1RnXUxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTlxMW2dfPUsxVWA3LyiNppeEnaydmZmdn6uqqKq/w6+yuby3wL+qpLexqqyms7Wur7O2q6mlsa2ltbObrLW2tKanqLOxrbKorp6qobOpoKSkmqKknbC3laWmp7e9pqynqaqrp6aioJmgqKSamaejpJmcpaqWk6OclJSkpqahtqSjoKOYlZOYk5yIrpCYlYmpi5ijnIaxgKStnpSan5V5gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsHlobFixrm9labySvG5oem1wj9h+U2titrJ+gHGUdZqhqpBXT1hhT1ZORlRbWFFQUotcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV5nXD5MMVpcNDEhjqaTgaeqn5ednaWtsqmxwr2ytb+1uL/Cq6a0ra2pqK+0qq+2tKiopralqLmvnLKytqqlpKeyr66xpquep6SypKKhn5ecoaCxrpWfo6C0uqKqqKCsraSinZuaoqqgmJupoJ+YnqiokZynm5SeoqejobCjnp+jlpaSmJKZhbBraouNqn5nhZaHrWVxnp2VmqeWca6hpH53unxroY92sV9qtFulgGWckWBmgXpmf2l4aqllvnJnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4eWRXWcYH1me6Omgllfi6tpgJJ4emqoOEqvW1dUbWNaTE9YX1xXVjtOiE9WVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWTMxG5KilYKtp6Weo6SqsbettL2+sLfFsri6w6epsKyvqamxr6SxurCkpa+zo6m5qZ6zsrCjpaGqrbCsr6aon6OisZyjnZiVmJ2er6iXnKKftLOhqpuhrKyfnpqXoKOqnZmepaGcmqGnpJCdo5uYoaCsn6amoJqfoZWVkZaRmoa1m7V5hamZtZl3h7Obt3+Tlperln5rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iHCOhoF/iJCXeIOCi5eMg6CPhbB2d59xa2psfItPpVhIY2OZfmNopV95cXVSkodeUKltY3F9hoBhnS9Som5bVGtnYExLXGNYXFpCPrB3V1hBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8yLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o4YVU1MByXn5SIs6amoa6pqLOsqru2wrC8wq24t8KrrK2vrqeus6qir7yroqe1raOrtqWlsrOoo6Gdp6qyqLCopp6goLCWoJqWlpeaoK+jm5qkqLWuoamPqaepm52WmKCmqZufnaOfnKCjpaOVm5+Ymp6jq5ulmpyaoqCWk5GTk52E1ZOZuXGwwn/GhnzWlJy7fJuWppCNnIykeo2GooGlgnqseY+dVq97iX6farlauXeGg32mgpN8mHqqeY6dkHuxbY6EdJC7hW6VUK+nxYpRoHpjYKpic3KGbJeHX1O1tMiFgIl8Y6QzQp11XVBqaGRQQFhmWWRhSkhNa0paU09ZZlpDQz9FPzA8PDU5Ozc0PDw4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuMDA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpXEpbUF9mVDdHOmFQNzIlnKKTmbGoqaWzqqW0p6S8t8GxusCytrW9tLansrGjsbOmoK+2qZuouq6jsLKhsrSxoaSenqepsam0qaWcnp6sl5mZl5eWmKKsnpuXqa2wqKOfjqyip5admJyhpqKYoqGjoZuioqebnqCelZmbpqGcppSbm5+gmJCSlZCdiLJuaLVxq4hwjqZytHRztnubmKWNj5yNon6Pn6R+sHWDkdLRdVuufIV/pG+bqqZrhoV9rX2XmY97sXOTnY94s2WWdIWebp5mlFLJi1rCXJ95Yl+tX3ZzhmKXiF5Zyp1vv4B1TUu1U1XGZFRRamNlWEFPal9saVBVRkk5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUU+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHJoOSdXaVxBTlRfZVA1Rz1hTTYyLqKdkaWvrKWpuqymtaWntru8sru/uLe1u7u0prW0orKyo6CssKWYp7qupLKxnbS4qqClnaGqpLKorKqlmp2bqZ+WlZiZkpOjqqGYk6ersKWilpKsn6WSlKGcpKeglZunp6Kao5+umqGenpCWnKKenKWUnZWZop6VmZaSm4Wse3eodqOPi4epb62Kg6eEmpmiipKZi6J+kZeHroV/grNccrNSrn2CgqR/cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnmIhqXa93lZ+PeGw1eciusl9CVG9dZ2BFUGxfcG1WVU0uZWJoU1lQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6NzegnZSguLGYs8GsqLKnqrK6uLS5vrm4s7a+tqa4tKC1raCgqayglae2rKixsauttKSbqZ+gqKK1p6aqpJmelaWilJScmpKWo6eblJCnra+loZWYqZ+ij5GimqmmoZWapqmdnaSerZ2hnKCNlJ+bnqCYmJyWl6GglJiRpp2GqX19pXmhj5CDqnCtjIGmhpagooqXloijgZCHlKp7f4udeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClG2TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZU9KQ6FcWk10XWJmTVphX3J0X0pVNUqaklhIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVF9iTDdGSV9DMT03opyamr+smLPCrqutqKa0sLixtr+5urOyuLyqu7WgsaWfpqenn5Sqsamwqratqq+hmKGgpqSkuqKjq6GXm5GjoJWVn5uVmKCgkI6MqbCvpp2Xm6emn42SpJiorKiVmKmonp+gpK2joZ6hjpWhmJ+gkpyXnJWdoZWWj6ubj65ucrR0qYx3iqZztHl0tIGTpaOTnIyJpIeOdbhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6YhnBcr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBwfGNTWVE+Pm1vMkJCQD9NOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eOTFBOKWam527opyxv66tq6unt6m4r7XBtb2ysLu4q8G2qquhnaekop2Sq6untqOzqK6qoZecqKClq7mdo62clpmQpaOWjp6hnJien5GUlau2r6eZlJusqZeMlKaapa2jkZersqSgnqirsJmhopCZopegm5abl6GTnKmdlJCqmYfTk5q7dLHEgMOGfdWWm7h5iZGYjZeJjKeHeaK2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+ifox0h6t9vm5zvHSyg3V4gIptmohxbY2kdL1dd31bYXm8alpWW2l6XmlhZGZibXlvWVtZQ0FAcj9DRyo1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QDmnmZ+ivKKXscKwramqrLGoua+3xbG7s6+8sK7Bsq2mo5+koZ2ckaqlqrKktaetpKCWmquZp6y5naOumZWhkKagk42co56YnpqQlpOvubCrlZejp6eUkJalnaStn5GgqKufnJ+ppLKeoqSOp6KUoZqcl5WkmI+woJKVqZ+FkJm2gJGRjbiVeIKTm7V3bmxuc295j4SOiXOewbu8mXqBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF5/eX2IZ4N5bXlii6xwdIV/WFunaURkWVRmX2NdY1FmZnFtdUJNUE1EO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlNZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlrPCtKuqqK2rqruvscavtbSvuKe1ua6rpKKnn6CdmZSspK6qpraoqJ+clqCjnaykvqehqpeVnJGim5KPoaihk56XkpiUsrW2rJidpKSii5KSppylq52WqaWmnJuiqaemo6ihkqyel6Kel5eYnZ6PsKmTnKeij2t+aZyoeYlzfpuOdXplh3u+v8C6bpKCcZWFX3JqWl2aiWFkh46Va2B/lWNtnHZilGuAmpWUZV5fY3GbiWhyjHyGlGZqfnF0eX59Ylt4dIFoUFxug3x7impYbHmBcklKb4VwTnNNRFZcZmFMW1dmY15PWm12anJST0RFTTxISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPltPJz8yPqifqKHBpJq0urajrKaup6i1sqzIrLC0rbakvrGzp6Gkqp2jnJqarKeupKW1qqSbmJWim6atqb6oqKWVlJuWoJqTmKWpp5GekI+YnLCyvqybp52noomTkaqbqKScnKyfo5qbo6esop+qopqum5WmoJaVnZ+dl7GlmaKomZyRnpyjpZqno5qdmpqakJaCaG59cXaRl5SRg4m0qY2FmJWOioyYloeTlYqDk5OQiI2RlJmTmZeaoKGam5Sfm42CeqSFbGl7kH2AdYmLgnKCeHl2dYqAe4lqc4F0g3Vkd312a3B6bF9iW29nTFhZZWpfV1lwem9tZlNPRlI5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsbG3oKmms6elsLWqyautsqa1psCotKGepaacpZaWoKunrKOkt6ygmZeWoJetqqbBn6uklpKcl56YlJSinp6jqJKQmainssOvmqudqp6Pl5apnqucnqGtmKGbnaKlr6WhpKieq5iXpp2ZmqGenpywoZ2ip5WYlJmUoaOWpJ+YoY6WlIuKjY+XrY97lZuCkYCJqaiFgJiWioSOn4h7g5CGhZqRh4aJlY6bl46QmJ6jlpmSkJyNfo1lobOuhImEd3uPin53eXpvZ3mQgYCJa3WBeYhyaXN/eXWDh4FqdGN4Zl9oZGNkZmpYa3txamtcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r76sq62xsqCqprKtoqyzsMawq62ks6+8pLScoKeioZ2Zl6imqaakprO1npWVnZmZsKauvqCropGRnpqZlJKWoZyXqZ2FnamsorTHs5+ppKqWlpiap56pnKClq5Sfn52gqq6opKOroaybn5+gmKWenJ+csKSZn6iTmJmdkqWamamfm5dmg5J8ZX6Pmo9jeIxsaGp6kKOra2SZl35nhYplZWloeo2hjmtojJeRondraouYop+Yc2xueoSMhnlYZV2Fgl5si4qCdltoc3d3kYCHgm54gnh/c215hHN3iIiOg3tphVhdanNkXXOIaWt8cW1jXVFOV0lkWEBKND1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS42Wk82KUVZL0RPMVlCOz8uPaWfury5r6yysKulqK2usKeurbC9saqopa2wsJ+tmKCknqKamqesnKyjpqips66elqOQo7CmtrmlrqOPj5qhmZOSm6CYmaaWe6Wsoqizw7eloqevn56VnqOeo52kqqiSn6GeoKqvqamjqp6nm6aep6CslqGcpbGkmJyrlqGfm5OlmJ+rmZ5+voOIcrRyhZ6FrWh3ucS4cZKho3ummJhzqoJ8y8DAu3GKo4eCnnyWmIiewL2Clp2djZzBwHuBepGMmsK/fWulsm+MgW/Ken+bd5GDjoB2eYF/eXF7gIZweIWMk3lsdZFiZV54ZF9lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWorjDtLCvv6mplKOvqbCvraayta+rpqelsaugq5iboqCcm6qnop2roqWppaW0pJ6jk6aurLi0p6+ikpGZnaWSkaChl5ugnYemq6Srrb+/saGprqmXkp+eopmjpKqjk6Chnp2srqerpqOhpZ+kpJytqZGkm6mtqpydq52topeYppeipJidf86UeXqlgXqWlptfrY9djqiAoKF8p5WadKuDgK9eZIypeqiHhZ90l5KIs2OCq4agjY2zaoSuc3yWh7hhgq1Zo81ukHV723t/mXF+iJJ1f2V7iHZ2bH2Hbn2FkJF9a4CNX3Bqb2ZgX3hkXHFoamNmYFJUU1deSk9ENUFIRUQ4PjY7QD9BOz04QD4+P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrcG/v7S0sLeYnpGjqqmttKumsq2trKSsprCqoaebmqaYnKKvn6GfqKejpqGfsKybnpamrq2wq6isoJSSm5+lk5CfpJedp6OerqSrsKi/xrOoqbGulpKenKKXoaqqn5Whnp2crq6mqaibpqajoKqSrLOWpaKqqp6kp6eisaKTm6eboZuVlJGXoHCFjJh1hKiHcbB8nXKsfaCfgaWPnnergn2tf5xyrX6rh4afdpiSe3yXfqqIoYuRi5x9q3qIko6ggHqtVpzEeo9vksF9gZVtdXCMbWZ3ZYZvYXducm6IipGPg2yPjmRtc3VvYGZtZF9vaGpuZmNXU1xgWlJSQzhJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txcays6Cdo46joqKtrravqbGnqauorqurpqKjnZqjlp+mq5+ipqCpqKKfnrCsmJuXqKivrKinqZ6XlZqjopKUoayanaajr6yjrLWpuc2yraaurJaVnJ2imZ+urJ2WoZmenqqxp6mpmqqoo6Gqmq+xoqisr6aZpquqq7Kkk5ikppuVkoWkaqR1iXqpdXqycYKliZiMcIefmoekX2BSq4R/roKbda6Cp4aGn3qZl4V7ZoCjiaSYhoGjfal+gZSGrl58qFWdopKBeqOfgHzDr8WMc6+0s7lxYqmvwnRojIyXjoFsmJFubHh4d25rZmRkcXBme2ljXFZfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXVwKGZq6ihr6KfsLWwr6mto6inqqurqaSmn5uln52mp6aknayao6yhpJ+vop2bk6qktrCuoKmbnJeVpqOQmqKnn6CmnLGmo6ixrLbIsrWprKqVkZydopmgpbSdmqGUnJ+nq6mirZmqqKGhqaGzraKqs7KinKqosLC3pZSXpKiZnZJ8qmyehId1q3l8sG6CpIuIn5aVnpWB0re0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlKeokJKajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI6PnJJ7b5WQfW55dHx6bVtlanJxZoFqXmFYY21cXllJTExLRURCQj1BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxdXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKurKWinbK5rKqhppuopqusqaagpqSYq6OfrqydpqGsmp+ppZ2ntZ+il5Ooq7ayrJumnKCWkKWtkpqcpqKgqqatoaOnqbC0wrGyqq2olImYnaWboqSvppehlZmcpaWpma6cq6aknqujtqygsbmwnpyvqLS0tKaWmKmkm6GPgp1OeJqBf596hKN8gqSEhqaenJ6UhLh7fHm5gn/MxsO2d5uhkIuffpqWl4l2n5eKpJikp36vhJuDnoSsfZmUYaVso3CPhZCBfZeEcqxgpHJxgJpgvH1SVXWOkaOWe3yRjodyeXKDfXBcbG53cmqAblpjX2huYmRdTExRU0FIR0ZJOTlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Gss7Smn6GVpq+urqmmnaWlmqOnobKuoqmnsqCZqaSUorWio5WXoqq1uaSco52jk5Chspmem6akoKKvrZykqKK1scOxraqtqpGHkZynnaOknaWXnpiZmaWjp5itoayipJeupbusobe3rp6etbO5srSomZ+xoqWfh4/RtcO3eYeOhZGTj4CmeJSid4ugkoWlgotxq4aFtG5yaZmjnJWJn3yXmYaHkHOugqWbooymipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJxcX+fYnOyuGh3j5OkmH2Ki5CIdnt4jYFsaHdpeHNufnRcZGRtbWVoYEpaV1g8SEY/VDNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krb+/vLu1npeopK22oaKZlaOpp66pq5mloZ6moaC1p6Kpp7CjlKujjqSto52QmpqqtLSknaacqZKUl66goJ6mo5ynnLWZoaqjtavCr6mrqaKMhI+coqCmo5aampyYm5imo6WXqaasoKObrKa9rJS+sK2fo7C0u6y1qJ2qs6WpmXuokX18sHeKgaSliJxtsm+gh617oY+DqJaZgKyJha6FoJSooaKXhZ+AmZWAe5J+q4CdmZaKqnedoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2la3GFmV1gW4ygbZSQpZiCk4uTiXh5gZZ+amx9Yn10bX95YGdlcG5nZ2hCWV9bPUpTMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaV1NQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKahKnGw7bBtJ+araCuuKWjjpuko6Cvrqmfo56drZieuaCiq6CvqpquoZGqqaWWiZqPrrCspqCom62YmY+toqGdpaGZpJytl5+opbaov66kqaOfi4COm5ufpp6SlJmalJqapKOjmKeqqqGjnqmovqWXw6yro6Kss7usr6iitbGqrJl2r36QipyFh326rYmYZLCMZZWtfaGPg6eWm4GtioSwhaaZo6GikYWgW2xqgbNgf617e4KAsWxnbZmXi4ixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqeZiZWPk5R5d4ybfGNzfGGDeHN/fGFpZnBtZmVlT1VjXEFUXj1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBfYGFiX19cW1hVUE5KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9KftLG3vbu0wbOjnK2mpbapoIuZoJ+ds7GonqKfnbSYoLOoqquesK2erJuVrqiijoibjq+sqKejqJmuk5qPqZqhnqWemaOipZieoqmyqLyvpaienY58i5uWoaCZkJKam5GZl6ien5enrKWkpKKkqbueoManpamirLW3rq+oob2vrq6XgamSo66Om4CGpJeYkIGAuMO6g46dk4SnmJ2CrIqCr4mnnJqlq5F+1b3CqmKjv718fqOCg9e6t7WFk5KCnr2+hGqjgW+rhG6df3qysceDa6uwvax4d6K+u3SAlY2lmo2ZjpSad3+PmXhhfHljjGd4gXtga2VramFQYltTaVxAVGBCTCk8OjUvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0sb+6sr2zop2upqWzpp2MmKW/qbawp6G/pqaxm56xnLmon62upaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp6nm5qgqKKYnaCsrKm4raejmpeTe4iZkqabk4+RmJiPmJSomZ6WqKeeqaahoqu7nqnFo6Cvo6u0tauxq6K9qrCwnHR2qqS3hWWJn3BnrI+Kj21vd6SQmqCBdbCalnCQjXKWqKObmK6kcmxtbGWKeG5tgplxgHppcGlmiZaVl3FoaYWGZ3CGZF2KY2lvWV1nfnimYGJyj5JvZmSAjZOOoZaVlo6Um3qFjZN0ZIZ3Z4xqeH54ZGxjZmxiS2VXSmtZOlBkRFAnSjorIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6ubKzqqmirp6ks6qYkr2xw8e9tKmev6uso6Cmq5+6o6StrK2ljpatqpCMhZWXrZ+lqqKfpKOgkYulkqeZqZmWo6qglpylpqevuaqrmpuTknuElo6ml46RkZiTjZeVppOdlqehmbCmnaKsuaCwwqiks6assbKrr62puqWwuZeLoamltZyJlqKYhqmakJSdk6qzmZujrKG0l6OhnqGinKGkoZWsp4ySk4yHkpyclJCZk5iQjpWEf6Sal5WOi5OSio+GhH5ni4B0g3Z0h4xxp218lZKUk4GBj4+PjpySn5SVlJ6AhZKLcGeOdm6Jd3V8eWlrZGRvY1VgWEBpWkdiYE5YK0U9KyYhNjQwLx8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbeurqKwpK2foLaxkI6qxLvEubepoaWdm6WdsKijtqedqbWmp5GYrKOLiImPnKeWrKOhmqienpOVo5eomqmZlKaho4+ap5mhtLmnqpiakI18gZSMoZSKlZGVkI+Sl6SOnZinnpu1o52mrLeor8Kuo7ensK+xrqqrtbuisb6ZkqakprWikp2mno2pn42Sn6OssJuhpLKqsZmloZ2kq56enZyXrJ6SmqKblJCWqpmNmJiWkJaekYegnZWUhZKMkI2Vi4F+Zo2HdYd2eYiEdJxqh5GVlZKKfYyWkpKXkaCRmpSegoaWhXhxlHJ4iX5xe35pbmRfcGlgW19ZbWJQYGRPWTlHRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OXlaSno7CzrK6jqaetoKi1qpCPnKOyuq2qq6GimXqcorCkpbGplpu4pqOUmKmcjoaKiZuikK6epJaooKGSl5mbrouqlo+omaiMmKiOnri2o6WYm42JeYGUjJuTipWRlJCNkZahi5ycp52euKN/g6+1orCvdKS+o7KgeHuhrLS9lneupaCKgKl+ZFxidp+OpJ2Dl35ulLSco6ivrKRln6CUdHqal3GAmamYbICjqIplnKWbkJeYlouSm5CEnZqQlIOSh46OkomFd2uQiHaHcXyGgYBhaYmLlZOMW3aVkWdoj4xxeaKWlmR3l4aAdpdogomCbnl+anBlX3Zva2tnXGVjYWFvUlo9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHR0lLTFRVVVldYGhnZ1hRSTxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraSnraSSlqq0rrGlmammqpdzi52vn6irp5OWuKCgj5yknpB+iIiano2rmqSVp6KejpeRnoV0ro+IpZqokZajiJu5s6egmZmLiXV2k42Wk4qTkZCUjI+Tn42ZnqWYm7KWgIybtZ20jJKPvaehfqeie6SwuYKOj6efhIuFj7Gpr4yJlqKZeYGLrIacnaKoq6mIlYeZd6WbeoecgZengoF7nbJ6ioafl5mUmJaBkJaWhJmaY3mHkISNj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR7mYKdmoSYfZGIgYKYaYyMhGp4enBwZ2R3bWlsalxkaWllcltcSFRMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5REs8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxbyvoJWlp7Sdj4Ocq5ymoqCNkL6emY2fmqGQfIWOmZiIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqTj4VwdZCJlJCKlI+Om4uOkZ2QlZ6jlJ2rh5+0ibSarovKiKuvibeFjbCDsrCFqY6nmI2dfKiPcnt3m46mlmiVpHm0i5+fp6mTmcKCf6uImKFxnoCapX2XhZWygKF9oJOfj5iXgI6Tm4mYkot8hZOGjZSTiYNtc5KGgHtyhoGEfYV1hoKYgY/FZoCph4+iap2BnpeAmYCKi4OImG+NkoRnd3R7dmdodXBnaGteYm5sZmxYZkZcUUwyRTQ2TWFjNyY0PERHRDo2MzY1ODs4Pj09PkJMP05JSktDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZ2hnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5samrppqUnqKkqqKVpKm1oq9/oKacpZ6diZS9mZONoJGdj3mDlpaRiKuZnJuaooWPjHebnI6gkYiepJuVmJeGorispZmbjY1/Ym2Pi5OQjY+MjJeLj5GejZKeoJigp36hp4etnaCWrpCgnp2RhoKgjayxiKSOq5qMmn6idYCYk2uBq3RNq3iHjZ2Sm6mpgqqrfoShe3qnaZ5/kmxnl4aYtomefm5gY1iDl3+Me2Rni3OZfXmWa118l25fU3GFXGBseYNgWWWCfoSBmHGnqmuDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbXRxampuXmpvbGtoV2dOXVhFOUA0R0ReazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpbXV9XXl9idmBNRTpNT01UYlxbZmdpaWJiZGFkZGJhYmBjZGNhYmprZGJkZGdkYmdlYWNomJadoLmgqqOmrJGhtryrrqKZlp+gpaurn5yttKGnkaCfn6abmY2YtJmQi56MlYt1gZSRjYqmlpaYn55+k4WGrKOHnJGKmKmYmZqRh6WwpqKVmYiJgGluiIeLjo6Ji4yRi4+RoIuSnZ+boaV/k4GPo6GUoHeclpCng6KogIarr4aleot9hJp9onBykoeWe56MeW2Hm4uZkZypnI+HnXyConN2pmaefnekXph7fZNzom6Yt7S6c5OHgYC2qGSBxrh7cJW2jHGAm6RjdKyrYH1qnbN+bn2Hg4+Ci5dxgKNsc6RznoJ9o16cmbOWb3uXnrN0cluesoJpYm9zdXFoblhra3JyZFtnXWFLRD1ENVFBWnEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWVhgYHtkSUM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi1ra2gmqGboqOkq5uasayqkpegmKCkmZqUnqubi4iSeIuFcICWjYqPoZCTlJ2XfZGKjqigh5iPipKik5uajIqop6Sej5aHhH5re4d+fY+Ng4uPj4mOk56BlZufnKCfi4l3nJiijaByoouIqYicp5GXqayArox9eqCZeaOTeIBzl4iMnH2Wn4abjpmcp4ejZKF9iZaQm4xsnmiajW6amXuAiqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z2iYqAnWiadYeTkpiOf55tmZBqpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGl3eGFeZFZhQVBFTzdWQlJuNEpaWV5OWkRAMTUxOzs3SD86Q0dVP1hSWF0+RGJdVmBRYWN8aUVCOU5bXllkZlhmZ21tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCrnaWbmqefnayZnbCnqp2Wopmhn5mWlqCjmYaJjWmIgHF7l4iMlpaEkpSYj3qKhJajnImVj4aLnZGcm4iPqKKfmoyRioCAaYGGeX+WjHuIjY6HjpWZfpKhnqCik5hyaJ+KoI+McJKMgqmImaCkqaKpfbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo+enJiJmHKhfYWNsLV9a5qRoXh+mLSjo6uohJh7mnycmn5zqlpdb3uXi3ieYkx/e3uFZHqYQk2fWaJqcnyOboGKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B9fW5mX2todXtiY19QXVZcVFZAWUVRZ0VSVlxhWF9JRD1COEBBOklFOExFWEFWUVpWREZhXFpgS2BtfXFFQzxVXmJaZWpWaGhtb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGtplJ2Bsa6ZhFNfoae0urOzqJqii5qpm5ynkqCro6Cnjp6dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlohygImSoJtykpCBiJmUn5qEjqibmZWLiop8hGyEhXGBoYx4hY2Ih5GXk3uRop+eo4iuhn21hI+enXumlnqpgpaekYuinn6naHdtfplzoHNxfJ2FmG+Tgq59o4Onn5uBpHBeqWh1o2NvpWGc0498epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKnvH93g21/v6aqtF6cb35yl2+Bc6JyXqRndKZgaKZsmtOYeoKbbnZ5l2ubeXaXcmyppWdfZHlwf4RrZ2ZjbXV3Zl9hUVplUFFhSFdJVF9XU1tkaltlUUZDS0xKS0JKRThQQFBNWFNYT1JRYGVlaVJkeHl3SUZFY11lWmhqU2loam9jamZgY19cXV1faWJhaGV8ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmvsrWwsqOcmISXpqCgo4ykp5+XqImZl5iTmZORoJeOiIV7cH2EaH2Pg5OagXeRjo+JcH+Hj5OSbJiUfImRkqOVg46qmpOSi4WJeYR3iIBugZ6Gd4CShYeYoJV5kqKjmaCJs6Gitot6rKekrqVwqYCbkYaBnZN9pICimYaYcZ6Eoq2uiZeLgIykjZWDr6KVdrW2tsmidJSLgp5hnpepbXmVhqCbdaGHd6B9kJaKgW9MZqOScJqIc6V7eXRig4JsfqBscmRgnHJ/dJdre2q0tbTGpnOYfnqcapqaq3SBmmxzd5dpmXl0l3FQRH2zXmp1aniHZmtnYnR0cG1VXFJYZ09SaElVTFhSVVxna25VZ1dNSkFKTUpISk5BUUpQZGNpbWV0cnN+eHtudYl7e1RRT21eaFtraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinIivp4VmP5Shs6yvr7Wioo9/lqeioaOLpKacm6WBmpeWjZeQj5uTjoiDeWp5hmWDjH6Wn3l1j4iMgmmEhZKDjIWdjXqMipWlkoKXqZeMkYuAiXqAfYt5cI+ghnmBlIaIlZ6UfpOlp5yWloRnbnicbKJkfHGleJyYcGingpiNfKR6oJaDlnKfdoCJlJWPuW6QiqJifZmiloluc2qra3WgbW+mYJtpi5BploealXWigH2aX4uFjHVviGJooWWef2mbdXBkZ4iCbnKiWl9bY6FuXYmMcHt/dHJkpW54omRmp2iXcouYbqFvUoiPbqBeZKdUi11UmG1tcmpxgW1waGt4c2tvUVZVVWVZU21JWE9cSFhoaHNqWWtWUFJFVlxMWFJhVWhqXnd1enxwfHxygnt/c3aNgIN2XlFzYWdicWdQa2hoa2xvaGRnX11dXWBqYmlpdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqrCxpp+Lf5aqnJ2ki6GhmaGhgJWYk42aj4uXkI6Le4ZxgIhoi4p8l5pzdIl9kHxlg4eViomWmYJ8iIWWppCBoquQhZCKgYp9gICOc2mPpYR9hZOMh5efjYaRqaadiaZ4lpx+pYmWjLKZnpGDr5efpXmXiXqpdKaPhJpupaKMkoSMg7xufaWvgoeGh5SXnaF9pntyqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm9voJ6RlGF/q4uqd4F/jqefd599haSVnaBpmod1rGaerYy2c3a+jKOTWYOmjatgdXFzb3t1cGJqfm5obFNVWVVgYFxqTFxRXEldbG12YFtxWFtfWmdzZW5vcWNxdGB3en55cnmDcoN+gXt7jIGCgHZieWRkbnNkUmxnZ29scmlmaWFfXlxhamJsbHpvXFxiaWFtaXdtZ2xuYpWmqpyBgJ6klqqqnqinrqOYiIGWqpmdo4mapJyonYSLmo+FnJGFko2MjHSFeoiDb42EfZeTc3WGcpGDbn+LkoaGlI99e4KFl6WNf6WljYCNiYSUdYOHkm9si6iAgouTjYibnoiLkqqioJCAdJSXiH6BeZSvpH+BnHGPhnmSjIWAe3KnjHF9fXqXlpuEjXh7fn6IlJWTi3eRmaChhHt+iWuMhVt5eXN5cGlufpKKcn90gY+Uk3GFg4JljX9fgYCMd3Z0lHVve29viW6Ehl53aXiOZoKDho+qnH90fZdqiYhvf3V8hHVtbGaMc3d7l3eEWmpXeY9obXdycW93eG9dbIZtaWdWWV5XXGRrZFVhVF5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV5gXV/gH+BeYuFgn17bX9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbmpp4uhopumpJmknauin4ODlqqRnaCImaaaqJiDgZuLfpaUh46KiYxygnyPfX6PhHqXjnRyhHCVhnt9kouGhpCFeH6AhpijjHunoYuFj4+ElYKGjph3cYSqhY2RnI+Hnp2Gipqon6Cqg4mOlZt/foqXraiQk6eQeHGek4N7k3B/qYZwfZVxam98gZ+Lf5KOi2huXYSMjJycoI9zloyIcXRrgnZ0gFlyboaRgn5+i2ldaWN6hYOIgF9peHucfIONg3aBh4NpeYyIa2JxcoN3X3KNgoqQqJaHZ42Pg253i4Jvg4t3bmRmY3mCepVaW2lmbXZbenh3dG1zcoJmXG2Ka2tiWVhdWVhrcVteYFleXWVyfXpzb3Rjamppe3xyend0ZG10aGx7fnV6fHt5eX+Af3CGioR7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyqsaGQo6Gan56YnpmooqF9gparjJ6Uh5qhkKSUf3uYhHySmYiIhoaKcn2Ai3aFi4GElopyb4BymYeEfpKDhIaKgXqAhIuan4+CpqCHeI2XiJWLi5yXhIN6rIGQl5mTiZ2choehqp+hoqOLiJObnaOZlqqiqKehk5yJmJB8eY+Phah+fpKRkpOcsaWalJ2QjbGSmISmjIyWnKCKkZyDiZKKa3yOdndlgoaQin2JnYSHi4+HiICFhJB3fHt1m6OJiIufi4aVf36NgoF2cXSGhX94iYiLkaeRhIeOiIOMkIt7hYmHjX91aoGDe3mZaXFoYHOKcH16d3ZvdnOBXF5vh2duX15ZWlxSZ3FVY1tbYWxodHt8cm5wY2ppaH97bXh+cGhvcGxmgHtygYB3f31/hHttg4yGfHp4fH56g3hOZHZqc25xe2VrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqKhmJWZmJSYpKCden+YqY2ejIWfnIqdlnx4lIJ7jpmJhoOEh214gYBygId+iJOEbWx+epeHhIOQfoCGhIZ9h4ONm52RhqmegnGKj4WSkYuckX2NeqmDjZGXlY6cloWFm6afopqdhoOSmpmZkJmmoKaenpCXgpOLeH2Ij4WmfHyPkJGFmKqgnJOcj42qjZGAno2JlJugg4+Xf4eOg3B4hnF0YX6Ej4Z1jJiAg4+ChoR+hYSVbnl2dZOjjI6Gm4WFjnWAjH59cnN8iYR7eY2PhZOokIeEj4KDiYmIdYSGhol6bWp9f3ptaGtsZl55fmd8e3Z0dXV6d1xgcH1tdWBjWlteUWZtU2VaXWFraXV6fnBsbGNqameAf2tyf2tqc254boN5boaAdoKAfYV2coKNh357enx/e4KLYGl7a3VoaYNlamNgaVtjdWhvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5KRlpeLmp+enXp3nKWQm4mGpJSKmJl4eY2FfImRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hoSHfI+Aj5ubkIemnH9wi4qMkoagoYqFjHynkIePkpaTlpJ2jKOgoZ2Wmn+BkJqZk42aoqKkm5iRnH+PhnqBhY+IoYB+jI2PfJekoKCSmZCQpoyPgZySipSYnH6Tk36HjoF2dIJwdmB9gI6HcoqWfIiMcYx+goWFj2l4cnmNmZOQgJh/iYxzgoh9fXF6fIyFe3uSjoSXppSMhpF8hIWGhHSAgYWFeGRxen54eXBramZefXNofHV1c3xzf2peYHR2cHdkY1hdXlJqaFRkWF5haGp2eIFxZmtjbGdlf4BqbX1nbXBqfXeFemuLgXKBgX2BdHaCjIZ/fHqAgX1/j2pyg250aWKIaWxiX3FVdG9tbmB4aGxXanR2Y3R6enFia295iY2fs5KlpZyOkJiPhpygmpt7daOfjZd/jKGKiJqVeHuGh36DiX6IgoF/cH56dHWChX6JkHdnY32Gl4uCio14fYCNg3mWgJWXlY2Vn5p9b4uBkJOGpZuHjImDppWEkoqVl5KRdpCdoaGYlJh6f46Yl4+Xmp2knpmTlJx7kYeEeIaXjp5+goqOjHOXop6gkpiOj6KMi4OYmYSTlpp/mI18iY2Bd3J+bntkgHyLhnCGk4CQgmuHg4GAiYVmdm99iJOZjn6UeYyJfYCIfXxygHmLhnqFkoqMmaOXg4SMd4eDgoF1eX+Gg3Ned3d8c313ZmtjYH5panZzdHV9cXxjY2FzbnVybWFZX11aa2RSYldfYGlsdXmGcGJqY2xmaHyDa2h0aGxvaH98gXhtj4ZxgIKCf3R8g4yBgH56goN+fJBtdYl0dG1limxqYmN1VoNpcG5geGdsYWp2cGV4e3lwX3FshYWQna6YpqiejY2Xh4WfkpaXfHaom4mYeZaci4yYj3h7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5WIfoWIdH1+in9+mISWk5aMo6CXfnGHe5ORiqaPjI6KkqCRg5GPk5eQioCOl6CakpCSdICNkpSJnZ2ep5mYjpWYdY+Qi22GmZCae4eIkIlvl52aopOVio2ejIaBk52Ak5OWh5qJfIqKgXpyemt1bHx/i35uhZKDlHhvgoR+fouAZXNqfYGXmIWAjnSRiYR6iH52eIF+h4F9hI6GjZWlkXmFgnSIhnx/cnN/hYFsX3l0eHB7bmFuYmR7YW5vdnN3d3NzYXZgb2x1bm9dW15dXWpdT11XYmFobXN6iWtfaWVqY2h3iG1mbGhpbGeAfHp3b4+Hc4CDhH10gYaJeoN9eoGEfXyOcnmLeXhubIdraF9pcmOHaHFvZXZnbWxhemhqfHt3cGF3bYuBmZqqoKSonYqKkYaKnYqUl3x2rJeMlnyek5GWlIh2fXuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+RhoCEhHN6gIZ6j5GHkZGbkqSak4F8gXyNipKjiI2KjZeajYWRmJOVjoiIi5Kdk5CMjW6EkI+RiZ6ZoqGXl4mXknCLm4Vnh5qPlHuJhZCKcJaalKGSkoiLmYyCf5GffZKPk4yaj3uKhYd0c3ZrcW52fIt0boaRjpJxdIB8gYKIfGVxbXp+m5R+hYp1kYuBdIh5boB+gYh9hY2Kho6Wqo57iH1+ioV3fW9uf4OBYmd3c3RuemFdb2BqdF5wanp4eGxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4hlXWloZ2JncY1uZGlnZWlngHp3dW+OhHOBgYN8dYKIhXiFfHeDhXqAind/i3t7cnmDamtfcGhzf2txbm1xZ29rZXtibn95d3BrdneJf6OYoqihppuIjIqBj5yGkpt0gKmUkY2GoIyVk5B/c3t2hXd4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYB/f6CGj4qRnJegk5Z3iX6AjIicnYmPhpKXloWIlJiPlouLjI2MnYqOkIRuiYuPkYqclqGcmJaGmIlshqWFZ4eei5J/jISMgXeTmJGdkZCIiZSNfn6QmXyRjZCOmpJ9i4CDb3ZwbG1vcHuGaXODjpiKcHeAdYKJg3lnc292gpuPfYqFe5WSeneJdHCKfIeNe4uHhYqPnKSJfIR2gYp/d3dtan+Af1xxcnFvb3dZXW9gb2peb2l8enBtbWptd2Bwb2txbVlYYGFhbVdRU1llZmJ1cISCYl1rbWRjZmuSbWBmZl9na4F0cXJwi4B0f4KAeXaAi4B5hn93h4Z2g4V7h4yAe3aKf2pxYnxihXxvcGx0amhubHZ3X3F+eHt0dXN/gn6llZqtn6eWhYyDfpaUgo6edIqfk5KFipqMlY2LenJ3dIJwcoVzcXWIbG5sdW2Id4N9f21uVVGBq5SHgnmAdnKCeYKggpGBkpGXm5GZd5B6goySpJqTjoiUmJKDhpaYi5OLiI6PiJ6EkIp8c4uFiI+InJmfm5aVgJSAaYeeiWiHoYiThZGEinGDkZePmo6PjIuPjXd7k5F7jouNkpeNfIh8gWt3am5rbG16f2J5fo6WgXZ6gXeDjX16aHVtdYiWjH+Jh3uUkXJ7hXB3jXuLjXuJfoSOkZ+fhn19eIGKfHZvaGt/gHded29ta3ByVV1uYXFhX21ueXBncGZmc3VocWxhd2VdVmVgYHJTUE5bZWRceHCIfF5caHFiYmVmkWlfZ2RbZ29+b2txc4p9dn2FgHV2f4x5e4aAeIiDc4aFfoyMhHx5lXhmcWqDX4d+b29remBpbXR/dF9zfHiGd3NzhXx5oZCasZyljoKKf4KZiH+KnH6KmJKOhIiXjo6OhHZ0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYmcf46BeHqMf4iMipybnJuWlHqOd2mKk4ltiaWGk4mYg4ZjjJGYjZSJlouNiYtwepWJfI6Ji5ORinqFfH9tfGVzb2tsenlcgHmPjoB7fX5/ho57eml1a3SMkIqDhoZ9lo1sf4Bwgo2Ajol+hHuDkZabm4x9d3iCj3hya2VufYFraXRvZ2hzbFNeb2RwWl9scndma2tiZ3hzb3FkX3dgYVZrX151T01LYGVjXHlxinRcW2V2YGFlZY5jYGZiWGlyc21rcXaLfHR5hoJ2d36Lc3+GfnqJf3KJh4GRioh9fpl2ZXNufGWHf25wa4Baa254eXJgdnp7jXZydop2eZ+Mm6+boJCChXiIlH57iJyGhJ6QjoWMl4STjoeBdHdweXBuhG9tbn5yY2R4cHxuenxqaGxjpJrB3K7vonNrdYN1hKGEkW6Vj5SflJqBkXCFi6OXiY6VipCdlYOAlI+EiI+AkoqKl36He3V/iXiGhY6bmpeZj5B2i3dwiIqMfoylhZKKnYWGXouUl4mOiI6LioSJbHyXgn2IhoqRj4Z2hX5+a31jeHRqb3hzWIh6kYeFen9/gIWMfnpmdGqBi4+LhISAjJiGbIJ3b4mSg5GFf4J7gZGXlJuRdXR4hox1cnBlc3eAYHNsb2FodWZSYHBna1VfbnR5YXJjYGl9cXJuW2NyYWNXblpcd0xMTGNlYV12c4ptW1xkeF5gZGaEX2NjXllpcmtua3J3i31zd4SBeHh8iXGDhHx9iHt0i4mIlYaMf3+Yc2h1cXlsi3tudHCAV3B5dnlxZHZ4hoxodoCJcYCdiJmnnKOShHxwjJR3eImcg4SfjY58lY2AmYeEe3J3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IlzbHOAdoqaiIxpl4+OnJSSgYhwhYigjoSKlYqMl5N8jZKIgoiPepGLho+CgHd4g4Ryh4KTm5aUmIaNdod/cYaDioiapISVjZ+EiWGDlY+FiIaJjIeAh2h9lH99goWJjo+CcYZ/f3J3Z3ZyaXR3bFqMfZKChX2Ag4CEioJ2YnVtioKRjIN/gJOSfm6DbXqIkYiThX2CfoGTlJGYim9yeoyFdGtvaXB2fl5zaG5caXVfUmRxaGZTX3B2dGBvYF1ognFyaldnaWNpWG1XW3RMSkxlZl5hcnOFaFtcZXleXmRnemFkX11Za25lbmp0d4p+c3KBfnt2eod0hYN8f4d3doqFj5iBjYJ7k3Zsd3Z5eJJ1bnd6fVh5hXF/bmZ4dpGCZHaGhXGKloaZoZuiioZzb5KLcnaNmnyJmYiJe59/hJl/gXhxdG5vZHJ+aGZsd3dbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJuRi4Z7aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N7cYaAlZmOkpSCiXWEiHiFgYyVnqCHlpCgf4hhf5OHg4eDiY1/f4JmfZGAfn+CjI+Qf22DfIJ0a213dXR3dmtjjYGOf4R/fIR/hYh/cGB0coZ9kI6DfYCSinpxhGd7hYyIjYR8hX+BlZCSlIVvcHmLf3RsbWlqd3phZ2lpWGt1WlJpcmliUGJyeGxiZV5aaoNuc2JcZ19lbV9uVFpvTkdOZmRcZm5ygGtaW2NzX1xjbHdkZV1dWmxsYm1qc3aGgHFvf3x9dHiGeIWDfICIdniJgZKVe4mGdomBb3h5e4OSb217gHZeg39zgW1oenOUc2dzh3xykpGEmp+boIaGdXWUfm11kpZ9h5CDio2ZfIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lY2hoV52PX3Jzl7zEhHZxlIiPfXGWi4abkoyHcmqIj5aAe5SMgYSajHyKhXx7iYt/lIh1iYZ2d32BcnWGgZ6UhZSPg4NygIp2hn2Lmp6ah5WPnYGJZn2Tgn6Eg4mJcoF9Zn6MfHl/f4eLj31pgH2DdmZveXhzd3Nsa46FioGKgHiCgYWEgWtfc3l7fo6LhnyCkIF+c4JpeoSJjIaFeYR9gpmNkY1+bm17iH12dG5mZXt0YltwYlducVNTbXJoYU5mdHhmYF5dWW+Ab3NZZWJdam5gcE9Za1FEU2dgWmpubXxuWVtebWNaYm93ZGdcXWBraWNsanN2gYNwbX98f3R1g3qDgnyBhXZ+iIGWkHiEi3SBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0a5ONhZ+YoJmEiG59jHZpd5eOfoCJgpSXiXmPlm96c3BsaWRgc3poX2Vxelpgcnx5Z3F6YWVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJGMhW5rhZKRenmShoGEmIp8hn94d4mKhJaAb4uIcXV+emp5hYOlkISTjYN/b3+Ed4V6h52alYyUkZWFiHB7koJ8goOIg26Bd2iAhHhyf4CDiod8ZX1+hHZjcHOAaXlwb3WZjYaDinx2eICFeoNrXHJ/c4KJhop+h4p7iXKCbnKFiI+GhnOEeoKajY6FeW5vfoR/dnpkZmh7b15YdlpYcGxOV3FzZmBLbHd0YV1cWll0fXNvV2ddZmpyYG9OV2hSP1hmXlpwa2h6cVtaWWtlWmNxeV9oXF5lbGhla2lxd3+Ib2x/foB1b4J7gIJ/gn92gYWIl4lxgo1xe4Z8enmDk4x1anl+a29+dH99b3J7epNwb4F+eGeSi4OhmZyRgoVmhoNvZ3mViH1+hIGYiYF8jYxoeHJrbGZfYG95bV9ib3hcZGuCemFxdl9lZdTqvYsyOj6Ljn9xeIWIjo12gpWMfpKNjH9tbIWNjHV8j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3RmeYKDp4uCjouEfm6AdniFe4ieko2Rk5OOi4d/e5KGd36DjIJrf3JogH54bXx8goqDd2F5hIFxZHFofm51cXWCm4uAf4WAc3V+gXOBb1xuf3V5i4SLe4iBfYl4enJtiYSRhYxzgnqAl4yLgHVta3aAgHV0W2dndW5XVntSWXBkS1pycmVbSXB4b1xbW1lddH50aFliW2dmb2RqTVdmUT5eZVxddWVgdXBaWVRuZFlkcXlaaF1fZm1naWtpcHd9jm1pgoR+eW6AfHyBf4J6dYKBjZOEcICLbnd9gHt7h5KJf2h7fWpze3KFenN3fn6MeniEfXxrjI2Em52WjIGAbI19a2h+jYt6fn6Dk4J+fYqIa3VxZ2hiW2Jnc29fYWtzYGhwiHpic3ReY2SboI9uXDVar7V0aYCIfJKGdYWVhXOOiol2cGyFg4d1eYl4iXyTiHp+cmd1iX5+mG9xhn5odnluZnmHhKSHgIaMiX5uf3eBgn6Om4iDlZKZiouFiXyPiHB6fYR7aH5saoB7emp6d4KHgHJgd4F+cWRyZ3aCbXV7hpWRgXyCgW93enx1f21ZcIB3dY2Dh3iIdoOJenhzb4uBkYKHc39+f5SJintvbmptgYF0bVxmZHJwUFp6TVtvXE9bcm9kVUtzeGlXWVlaYXGAdGBdXWBnZGlpZk5ZaE1AYGNbYHVhXXVsWFdTdGFaZG9yV2peYmhrZ21saHB3fJNsaISKfHxwf357gX+CeneAf4qLg3F7iG9xd4N/e4mMj4Nqfnttd3h2ind8eICBh3+Dfn56bYSMiJijjYSDenWLeGtsg4eQeH16gZGAgH6Kg3BycGNmXllmX29vX2BncGZqb4l0YXRvW2FkanZ7gL+cpqTIuHGFg3KSfHiGkoJzkIuHcXJvg3uDdHSHdIh3lIh5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgX9/jo99c4B1hnqBk5GEepePlpCIgoh7iIhreHl+dGd6aGt/eXNpenaAg31oYHeHfWpqdGh7gGl2gYyRlH56fn5wfHZ8dH9iVnh+c3OLhYJ9hHGHind4cXGEg46Af3p+fXaPhoR3anFpbIeBcW9cZmFxbUlkdUtdbVVTWXJuYlFPdHhhUlhYXWFvgnNbYV1oZWVka2RQW3BJQ2NgW2NwXl13aFVWVXZdW2VuaFZrXmFpZ2Vubmhwd3qTbWmIjHl9cnt+eYKBgXx1fIOIhoNwd4RybXeCgn6Ji5N/cIB7d3l6gYt0g3h+gYGChHqAdW9+ioubnoh9hXp3hXtndIWMj3l+f3uIhYN2j39nb25fZFxYZVltcmFgYHBsa2iJbmF0aVleZG6Ad6naqseGh7JxiXdvjHV7ho1/epKJf3RzdH53gHBxf22EdJSGeHVrYHqCeYmPZnGEcGd2blttfICQk3+AeZGTfnl8bol3gpKNhXWXi5KPh4WGe3+EbHR2fm1ndmRte3VtaXd2f398YWJ4hnpodXVifXtndYaOjZV7dIB2cYB7fW2AWld1f3B2hYh/gHptiYZ0eWx2gYSFf3x+eXx0i4J+dGh0ZW6Kg2xzWWhec2RHbW1LWmFXVlV3bWJQUnR2WFBWWF5hcYRvXGBjbWRkXm9jVF1yRkJlX11mZ11be2JRVVx1W1tna2FWal9gbmVma3FocHZ4jnRrjo11fnZ4fneBg4F7c32DiIeDb3KAdHF1foWBiY2Ke3eAeIN7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN4Xn2FmIt4hoN0hYaEd4l6Ym5sW2JbW2FWaXNjYFtnbm9mh3FhcWZXXWNsf3zKzoe5oWptbYpscYRxfIOJfnqQhHl4c3l1dXtqbHZjhHWSgndvZl59gnqLimVygmtqcWNYbXqFm4iCgXOXlHh/fW+JcoSLjYlzmI+RiYaLg3t5fXBwb3xmaHFibXhxamtxeH18el1leYB4aXZ4ZoJ3Z3SHjI6UfXKHam9+gXlvfV5Zc39udYGLfIJvcIqAcXdpeICCgIJ4fnN7dYd9e3Nnc2Fui4FrcVdpXXZbR21qTFZUXlNVe2thT1R1clBRVFdeYnSFaV1gbGpmY1pvYVhjcEdAZ1xgZV5cVnteTlZlcFlbamhdV2hgXnJma2dxZ3Bzd4Z4bpWKdH96eH55g4eAdXF/hoWOg3Bwe3h2dXqGhYeMhnp8f3SLfn2GhISHf35+fYd/fHh2eHiRk59/jH2LbXV/eGSChpWFc5GKb4WFgXqDdGNuallfW1xdVGdyZGBYZHFyZoFzYmtlV1tgan93vq57oLZuYnOGaHN7cXmBhHp9i353d3J2b3t2ZWpvYId1joFzamJef3h5i4RmcX9oa2taVm93iaOBhH9xmZNygXl2hG+Cg5OJdJaKjoiFiYV9eHRxbmh4X2psX212amdqa3l3enZaZ318eGVzfm6EdGV1hY2Gln9wjGdreoR1bnViXXF9bHV9jHuCZnaHfW5xaXZ/eX+Ac35te3yCe3lxZmxibYl9bG1VaV92VUppak5RTmhNWHtoYU5VdmtMUVRVX2Z1g2ZeYHFoZ2JXaV1ca2hKRGpZYWRWWVV5WU1WbWpZXWtkXFllY150ZmxkcWdycHWBeHCZhXZ/fnd/fIWHfXVygoiAlYNuc3l7enNyhYeJiIN5gX51j358hIqOhIKDen6Lg3t2e3d3mp2XeomChml2fXtsg4SSf3GOgXCFgn6Bf3BmbGdYXVtcW1NkcGReV2JydWl1cGVlYldcXGiAcG9ygHOJZGR4fml0dXNygYN3gIN5dnN1bmt6cWJna2eGdI2DbmZdX31we4l/aW15Z2pkVVdyb42mfIR7dpaRdH1zfXtvfXySh3iafYiGg4aDfXVvcWxndFxsZ15sdGRnZWl6b3tyWWiBd3VocIF4gnZid4WLfJSBb4xqbXuCcWdzZmFuemdzeIt8fmJ3g3dqbHJ2e3F7enR+Z39/gHl3b2RmYm6Fe2xqVWhib1JKaGpPS05vR117ZmFNVXRjSk5TV2Fqdn5lXWdzaWZgVmNXYnBdTEtqWGNhVVRVc1ZMWHVkWV5rYFxaY2VfdmdtYnBpc29yfnV0mYJ3f4B3f3+GhXp8dIKEfpeFbnJ0fHp0cYSFj4GAeot2dJB/fIGVjoCFhHx+jIZ7foB2e6OlinmIhYRrdXx6dYOAi3puhHN5hH2Bg3VuamhlVl1bWlpTYm1kW1hhc3tpaG1pYGJXX1tqgGprcIBna2BoeXhqc3RzbYOAen98dXVuemhqeWpfZW5ogXaQhGdlWGJ3an6He29qcGdmXVRYb2eOqHeBenyRjnp2cX9wdHd6kIF5lnSFg4CFiHZqcXVnZ25bbGNdbXJfZ2FqeGh8bVtugnJ0am+Bfnp3YXeFhHiPhXOIcm95gHJjcWlccXhkcnSJfHljdIBxaGp6dXJteXh2eWSEfH95d3FkZGNufHxqalRoYWVTSmtnT0dRa0VgeGZhTVNxXUpNVFpla3Z7ZV9tcWlkXVZgVm5uV0tTaFdlXlhNVWxUSlx5X1tea11dW2NlYHlobGBvb3VucHd1eph9d4CBeoCAh4Z6eHmCfoGThHF0dH95dnSEiJF9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSrn396iIeDa3KBeXWAfoB0boZufIBzioBqb21kZFhfWllaVGFqZ1taXnSCaV5tbFxhV1xcbIFlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWVzZ3p3k4FjY1RlcGeChXd3Z2lqYFdWWWdjj6dufneAi457cXJ+aHpwe459eJBxhH1/f4ZuZHVyZGdnXGphXG9vXGdfbXVkemhddIBvcmtyfH51dmJ0hYt7iIeBgHhydX91YXBtW3J0Y3FzhXx1ZXOAbWFte3Brant5dnNmhnZ7e3ZxZWJlbXN9aWtTZ11cVEtxYlBGVmFHYnZmYUtUb1dKTFhYZ2t1emRlbnFmZFpXXVh2ZVRKXGJXZ1dZSFdlUEhieFpdX2xbXlxhY15+aWpfbnR4bXBudoOXeXKBgHx/iYyGfnV1hnmHjHx0dXWCeXp6goyOfX6EiWlzloF6ip19foV6gXp/fIaIc3GPrYx7e4ePfWRxh3lzfHp1cm+FbHt+bI96YnBvYmVdZVZZWVdjZmtfXVxyhWhYcG5bXlhaXGx7Y3B3dm1iWmxzc2d0dW9sg3h+f3h3bm50ZGl0ZVtndWZ2dpJ5X11SZmZqg4J0fmJkaVxUV11iY4+kaHh0g4aReW1we2l5bnyGfHaJc4B4fHh/aGR2bGBmX15pXlxza1llXW9vYnplW3d8a25ub3h5c3Vkc4OSfoeDiXt3cHJ+c2J4ZFxwcGJxcoJ9dGdygGVebndpZWh6fHVub4J1dH10cmJfZm5ufGRoU2dYV1NMdl9QSllYSGJ0Y2FJVG1TSk1aV2lscXtibWxzY2JaWlthd1xTTGNdWGlTV0dZYE1GaXVYXmBsW1tfYmJchGlnYW54eWxvanaBkHhtg36AgZOIhIF2c4h0jIZ0cnZ1gnd8fX6MkIB+k35wd5WDfJmSeYCAeHp+gHSIg3RwmKB6e3+JlHhjdYd4c3d0a3Rvfmt4fHCRcl5wb2BnYmxUWlpXaGNtZlxbcYllU3JuW1pYWGBsdmNpdWppXlltc3Bsc3NzaYR8fn57dm9ubGRpcWNba3JkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEkXRsbHtucHF7fX1xgXiAc3p6emNldWhdYllgZ1pedmhXYl1vaGF3YFt7dmlqcm54c3J1aHGClYOHfoR2c2pxfW5md1hdbG5jcnOBenRnb35bYHByYmBrcn5tbXV/c3F4a3BhXGVsbHlgZlJlVFZRT3RaUU9YUUhjc2JgRlVrUElQWlVra2t8ZW1vcWJbWlhZbHFXUlBmV1ZoU1RGWlxOSHF0WF9jbWNYYGBhXYtqY2RteXhrcGl1eYZ7a4N9f4SafIKEeXyHbo+Hcm92en10gYJ8i4+Cgpd0eIGThYGfiXWBgIF0f4Jxh4J1b6GWc3uGi4Z6ZXeKbm16bmZ4cHprc3ZyjGtedG5hZ2VrUl1bVWdhbGtaXHCMZE9vbl1WWFVnaXRoYnRlZV1ZbXRtb3V0eGqGfH97h3aPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGGXWNfY1NaX1lilZVjbnCDhYp0a2h8cGZ0eHV9bHp1dm96fnVeZXJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXNxdHB1dmtthJOBiXuFcXNncH5xc29UXGdrZnF0gXdzY212VmJybFtfcGd+Zm13fnNzc2ttYFpkamp2XmZTY1RVUFNsVlBWU09HZHJfYUVYaU9IV1RWbWhkfGlreGtiV11VW3RkU1JXaFFYZVRTSFpaUE13dlpfZWxpWWJgXl6ObmFma3l1bm9pdnZ/f2yDgH2Hl3uAh4GJfmuTiHJndIB7dX+CfYiOf4uTcnyKkYWHn4Z7f4aMc4GGc36Cdm6ki3KBjYt2d2x6jGBke3BmenN4bG1xdoJnZHtsY2ZnaFNfXlVnX2xuW15tjWhOaW1gVFZTbmd0a2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVweX5nWlZYYGx4fHtwhF9iXmdWWF9XY5uIYmtwgYd9eGxreW5cd3Nte2l1dG9ve4ByWGltXlhcVWFiV2RwY1NeYWhhYmxaYH5rZmtzdm9td3dsaYWMf4l7iG1yZ3F9bnNuZFphaWlvdIJ0c15pbVNlcWVVY29je2Ryd3x3a3Bta2BZYWdodFxkVWBVUk5XZFJOW09PR2RvXWJGWWlNSV9LWG1kYHhpbn5kYFVfVF11XFRTYGZOXWFVU0pcWVBZdHVdX2VsaFhjYVtejXFjZ2p4cXNuaHZ0eoNygoN6iI5+fImHjXlukIp1bHOCdH9/h4WGkoSVj3l9jI+HkZuEgHyMhXOAgXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjY2Njo2Ojo6Pj4+Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2NyLaW5ubm5xSSwwMC8vLEmFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn64tiZ2dnZ2w8GBwcHR0YO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fX59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmIiIiIiIeNkJCQkJCQjIeHh4eIh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaTlJSUlJSVjYmKioqJioaCgoKCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkpKRiYeOipCSkpOPjo6OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuLi4uLjIyNjY2NjY2NjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx9fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeKiYmOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhIqNiJCJi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmCiIyIj4eNj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjoiIjIiNho+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH1+fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2QjoyNi42Ljo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KHjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eX1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyNjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4eHp7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ+P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF1eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTk7OzpAOjs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTk1NTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnd5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODk6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Oz08Pj89PD07Ojw9PT08PDw8Ozw6Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXFxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl7e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BxcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg6ODg6Oz0/Pzw7Ozw7Ojs7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXtOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/Pz48PkA/PT09Pz49PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dIRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxwcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBfVFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjo+PD89PDo9PEBCQkVAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHREVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgICAgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFERUNAPUhEQURERENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIRkhJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUFDRkpISUZISEpIRkFAX2hEQkFVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS0xLTEhUX2hxe1dObISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N1dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tMTGBYZ3+EhoR+eX+GhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lIS0xPbXmDhIN/gIGEhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6fHt8fH5/fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSFB1goGAgoKCg4ODhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODk7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRFTXaBf4GCg4OCg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojo6Ojw4OTg5Nzc3Nzk6Ojg4Nzg1ODg7QT0+PkJBP0FLTE9RUFFPT1BRV2tycnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEROeIKCg4OEhISGiYqKiIeHiImKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDo7PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj1AQE9/goOEhIaGh4mIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PDw6Ozs8Oz0+QUE/YoODhYSFhIaJiYiHhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURGRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pj8/PEA+QUBEQU1/g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqIV0dMTE1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUtJS0lLS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc8Pjs8Oj0/P0E9QEBEQ0dCaoWChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtHRUdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw7Ozw5PkA+Pz9BQkVES1Z+g4SEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSUhGSkpFSkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6Ozg8PTs9QT0+P0FERUZOboSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMi4uLi4teUlJQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgICAf39/VUVDRUVHR0VEOz9BOz08OT89PkBCR0Y/REZESE11hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTlNUT01TTFBTVVdSU1JQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj5CQ0ZWTUNKS0hMT3mGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hJSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQkNGRURFTFhSTFFRUFJTeoaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLhmxbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU290dnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNSVldWV1Z2hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3lucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTUtKSUlGQkRAQTpQUVFXWFBQT1FTVFNXV1dYWG2BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TT09NS0pFQz9AO1BQWlpbU1NRT1JSUVVSVVNWX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX59fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XlxWVVNST0tGQ0RBTV6DbFZSU05PUU9RVlJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUFFOS1JUUU1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSU1RaXW1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUENEQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdISkdEQkFDQE5QTVJkdHV2dXN0dXp8ent7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIOCgoCCgIKBgWtMRz4+Ojs+QD8/Pj5qUEphRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz88PUI+Sk1GVW91dnZzdHZ4e3x7fXt8fX19fXx+fX18fn5/f3+Af39/f3t5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVlRXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQkFDQVtcTntOT09OS0xNT09QTEtMV05JR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV2dnV2d3l8fHx9fHx8fX5+fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJTVlhTUllUTllaW1dZXF9fYGVgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZDTFFPYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojk2NTg2OTc5OjM2NTc5NTxCPWZ0dXd4d3l5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUFFVT0xSU1RXWFRUWFFMV1lZVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OThHbnJ1eHl6e3t9fn19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KTk9UU1RcVlJVU1NPTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR4eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9KR09QT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFPUFBRTlFPUE9MSkxMT1BOTlBRUU5QT0pNTU1LR0VFREI7PT08OT1HNjY3N0RucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUE9SUVBNTU5MSkxLTE5PT1FNT09NSExLSUtLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHSkpARkFBQEZIRUpPSFFSYVxRUFJOU09PUExMT01LTUxNT05bVktNUU9HSUhESUpMTEtGRkZEP0NDPj1CRz9CPkFkcXR3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVBNT05XS0xOS0xNTUxMS05OU2ROSkxSSUlJRUFISkxNTktHSUZCQkJAP0VGRUhETG9wd3p6eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUS0pJTVRGSUlKTEpLS0lKTE1PUFJQS0dDTEdDQ0pKTE1PTUlKSUdDQ0NESUpNTElac254eXh6e3t5fHZycHVydHl5dnhqcW9qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NGSEhHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0ZIS0RISUtNSEpMSElKTEpNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuand2dnt4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkcEZLQ0ZFR0RFRUZFR0NDQD08PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPkBDQ0NER0xOSEtOSERIRUlMTk1HSUxHRkZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1NRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkJBRUBEQj4/Pjo7Oz07PT9DQT9BQ0ZHSkdKSUxIR0dHRkVDPz1FRUI+QUNDQ0RHSUlHTVBJRkZHS05PS0ZISUZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSE1SVVVST1dkYWFtZ3Fyb3N5emdlaGhjaWxncWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NBQEFEPEJBPkE9Ojo9Pzs+P0BCP0BCRUdKRkpHSUdGRkZFRENBQUZGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVTWWBfXWlhbmluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01GR0VHQUJAQ0Q8QUFAQzw4Oj0+Oj89P0I/QEBERkhFSEZGSEZFRUNDREJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9OTlBNTE5TV1ZXWFZYXlpdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJFRTxAQ0JEPDc6PT46PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9JVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgX2hlY2BkZWdnamhoamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURBQ0hFPEBFQkQ8ODo+Pj08PEJCPEA+QUJGQ0VCQkhDQ0RFRkZHR0lGR0tIQ0lIR0lHRkRIS0lHS0lNS0pLTEhMSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXmBjXlxhY2tiYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJER0U8QEdEREA5PD5APz4/Q0I8QD5CQUZDRURDSERGREZGSEhGSEdJS0pFSkhIS0hGRkxISEhKSE1MTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGFlXWRgZmdgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXd1dXV3dnV3c2d0cmtxcmtyd293SUpLSUtHQkRERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFREZIRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTEpKTUxNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9cXmBgYWFhYGNkZWJkaWNkaWpndotsa2lobW9zcXBxcHByeXdydXV0c21tc3NtcXNvdHV0c3Bzd3R1dXd2dXV1ZXFza3BxanJ2cHdKTEtLTEdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0dHSEZFSUZDR0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFMU01LTk1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZmJhY2luaWNpaGhteHZtaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0VBQEQ+PkRFRkM/Q0FFQ0RGQ0NFR0NCSEVCSElJSEhLRkRLSkdISkhJS0dKSk5LTktJTEhKTUtaZkpkXEtsUkhPTV9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxrVV93dmlqaGhmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENDQkVFREZCRkZHRERLRERKTExKTE1HR05JSEpLR0tKSUtLTkxNTExMSUxMTFtzYmRwXmxsVU1OZXJdZ2ZxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9cb3VncU1Lcnl2a2Jha2VlbHhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FCPz1CRUdCRkNFREVFREJISEdERUtIR0tNTUpNTEZKTkhKS0pJS0pKSUpMTU5NTU1LTk1NW3Jvb25wcGxrTlBRbFhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcHFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hGRUVCQUI9Pz9FR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSU1LSEpNSUtJSkpOT05OTUxOTUxcaGR1XWxxV2xOT1FuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRkpMS0ZNS0xSUkxHTU1ITkpJSE5ISkpISE5PTk5MSk1NSlpzcHBvcXFtbE9RU29Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXXRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hKQ0VFRUBAPkNDQUZDSElNSEZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUlKTElLSklIS01NTUxJS0tLU2tiWmleX2pjcnJaX1prb2BlZVVrX2NbYWJRYG1oXGpcbmlpZFpvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga25wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURDR0JISkxHRkRHS0xJRUZKTktJT0lMW1FKRkhIS01JSEpKS0tJSEpHTEtLS0dISkpMTExLSUtMTlRbXVRQVU1RUE5PT1VSUE9RT09RSkpOUFFkcWlUWVZbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0hQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKR0dJRUZLSElLTkxJT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGFhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHh5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVGSkpKRkVISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjX1lfYltgXltUWVhaX15kYmJhY2ZpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh2cnl2eHJxeHZ0dmFTSkpNSURCQkNGR0VHR0lKSklJREdLSktGRklJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUJGSkQ/SUtITltjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJYVlZcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJS0RESkpNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hFREBEQUhJQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUVFdX2FjY2NjYlxkY2JkY2ZYUVZVU1xYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0lHR0pGRkZJTEpORURKSkxOSkxJS0pISUdCSEhRTUtLT01LS0lISEVEP0VCSEhBQEZFQ1RdWV5YX1hfW11VWFhQXV1RS0pWXlheW11WWmFSUl9fYmJgYGJiYGNiYmRkYlhPUlJTXFNcXl1eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTExLS0lJQ0VBRUNIRkFBRkRBVlVFXFReU1ZgWE5UVU5aW01KS1RgYVtfWF9eYl1PWWJcYGBfYmNiXWJiV19fVFBPUVJZU15cXF1eX2BiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNRRFdfSUdHSERGTUpQUEZJSUpLTkxMS01LSkpHRUlOUVFOT09NTk1OSEtBREFDREZEQkFDREBMSEJMTFBPT01GTUZGSElIR0xMTU9QSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUVVUXFlZW15eYWFlZmNoZGtscXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1HSFlNR0hKSEdOTFFRSUtKS0tOTVVOT0tLTEdHS09TU09QT05PT09IS0ZgRURfTERmY0NMW0heW3NtT01WbVlMQ1BfVGxXZ0pdV1VeRE1RVUxNU1ZRUlRYV1RYVVRcVFBmWmhoZFlUa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0tJRUZGSEVFS09USktHYFRHSk9KSU9NUlFLTUtMT1JVUk9PSkxNR0hNUVtZT1BQTk9QUEpLUX9RSXxZWXJzV1BtSHFub2FWUHFxdE9Ca3NucXRwU29fW25YXVZcWFVraFVdVmNZYFlaX1ZVV39pdHV1X2F2X1liXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4foB8foCBgoR8gIN6f4F/fnd3TUlFSE1NQkRMTEdKTEZSVkxMT0hMUlhXUU5PT0xRVE5PUVBLS05HTVBTW1pUUVJPUFBRS0laeF1UeGRoWVJTUHZndGxwYm5ma1JyTkx3bWpycHNycXJwb3CAXWZ6dXhxcXpxfnJ9a3V9YlJnfGVzc29zc3x9cH55b39yX2BgYmJbYWBoa25rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpRT01OSk5XXllVTFFTTllZTFNTUk5MT0lRUlRZV1dRVFBQUVNMSGd4bGN4cW1aS0xUeXB1bXVibnZQZGVJZXZxbXdvgGpmeHhpWHJSaXttaWp6en1seHp/cGdvWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVmaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3J1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFBJS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWRoYVZuTHFwXkdoeVd2VEtoeH14YHl7c25hXm1vZFNncnVubXlwd2x2c3RxbG1cc316a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUEtMTktMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnVVV2xObmx7cmFqZ392VUtXa2h9bG1seGBbcHp7X2B6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1JXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFOUFVMS0tSU1JSUk9WVVFRT1JSWFhRTlBVVFhYWFtbVVNTV1tXWFdbT1JUV1dYUV1YVl1VU09YUlZXV1haYFtncl5bW1tdXV9jWl9jY2VmZGNjYlpjY2dmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJNUlFQTFZVVFBUVVhVWlVSWl1WVVRXVVlYUE9MTldUUE5VU05QTkxRUEtKUVFLUU1KS09RVFJRUVNSSUlNTk9RUlFRUVRWUlhXXFdTU1FRVVVWVFpRTlNRV1VUWVZUWVVTUlVTVFVYWVheWl9hXVxbWl1dYGNcXWJjZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkZGZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlRcYFZXVllVWFRRUEtPWFNQTlVRTlJOTFNQTU5VU05RTk1OUVNQVFFTVFROTE5PUVRUUlJRVldVWVpbWVNVUlRYV1dZW1NPU1RXVVRZVVZZVFJSV1VWWFxaW2BdVllfXV5dXF1gYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFPUlhTUVFPTU9TVU5XUVRUVU9OTlFUVVVUVFJUWFZaXVxaVlZRUldYVltcVlBTVVVVVlhUV1dUUlJYVlZbX1teYF9WX11eYFxcYGBfX1piYmRoaGVkYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST01QU1JVWlVTUFBMUFdVUVZSU1NYTU9QUVRYVVVVU1VZWFteXVxbVlJPVVZVW1tWUVNWVVZYVFNYWlRTUVlXV11fW2BfYFZiXGBhXWBiX1xgXWNhY2hpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5PV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFVTUlRSUlpPUVNTVltVVlZUVlpYXV5cXF5WU05UVlZbW1VRU1RWWFhSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZ15cZWBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1cYFxgVVxdaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVVNOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aWFFVVFhYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXV5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFtVVVdWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVU09XUVNXU1dVVltdWFtZVVpeWF9eWVxZUldSWVhZX1lZU1VVWllZVVdZXFVUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZmRiX2RhX2FgYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFJXVVNSU1hSU1ZUWFhYXV5YXVtVXl9YX19YXFZRWVVZWlphWFxVVldaWlpYWVpaV1ZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYVtmYmhmY2ZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaV1RcVVZXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJWVlJUVVdbW1xfXlpfXFZfX1pdXlleVlNZWFlaXWFZXlZXWltaW1tbWVpYWV9fYGBkY2RlZWJkWmJmY2dmZV5hYmBjXmNjaWVkZ19nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVVYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZWU1ZUWF1dX2BgXWFdV2BeW15cW15YVlhYW1pfX1peWFhcXF1dXltaXFdaX2FeYGVkZGZmZmJZY2ZlaGdkXmNgX2VjXWZpZGVoX2deY2JjYWFgX19bWFlbWVpaWFpYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVdcYGNkX1JZWVBXVldYV1ZWV1ZdXV5hYmFfYl5ZYV1dXlldXllYVVdbW2BeXF9ZWV1dXl5gXFpaWVtfYV9iZWRlZmdnYlpkZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcV1piZWNhUlxZT1hWWVtZWVdaWmBeYWJjYGFjX1xiXV9dW19eWVlUWF1dX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZWdkXWVmaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXVlhQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYV9jYmJdXFtaV1hqcWBcYF9dXGFjX11YWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2ZlZmVfZmZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t8e3p6e3p6enp7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycW+pwb6+vr7BooqMjIyMjYl+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vbLLQzMzMzNCqjZCQkJCSi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4OEg4GCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXp6endvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6enl5f4OCgoKCg4B8fH19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV4dnZ2ent4e3h3dnZ4eXh5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t6eXl5eXl6e3t7e3x8e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x7e3x5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnt5e3h8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+e3l7d3x5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt7eXx4fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp5eXl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZWZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcIqQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uJg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMj4uKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKjIiGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4OCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCgoKHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFg4SEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OCgYODgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4SDgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgYKDg4OCgoSEg4ODgoKEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgoKBgYGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4KBg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OFhYSEg4OCgoGCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCBgYCBgYB/gIGBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYGAgYGAgIKBgoKCgYGCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGBgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhISDhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KBgYKBgICAgICAf4CBgICEg4WFhIWFhYWEhYWDhISFg4OEhYSCgoKDgoKEgoGChoWDhYODhISFhoWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgIGAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDgoOEhYWGhYaGh42Hh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYGAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWEg4GHmYyFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYaEhYWGhoeHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIODgoWGgoB+fn6PiX9/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGh4eHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4ODioZ/gYCFgYCAgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhYSPgoWDgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoOCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWEhZGDhIODgoKCg4F+fX5+fn5+fn18fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoSFh4aHhoaDgoKDhIKDhISCgYKBgYGDg4SDhJGSkY6PjouHhYaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWGiIuKhoSGhIKGhoGDkISDg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4OEhYOCg4GCg4OEhYSIkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoGAgIF/fYCGg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx8gIODgoODg4F+fX5/gICBgH59fX19fn18enp6f4KCgX9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f36AgIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359fn+Dg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gICAf39+fn58fn9+f4B/fn9/gH+BgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36Bfn6AgoSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoOBgYJ/gYOEhIGBgYGAgH59fX5+fn9+fX19fX18fHx7enp5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf3+Af4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GCg4OCgoKCgoF/fn19fX5+gH19fX19fX19fHt6eXl5eXmAgoKChIOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGBgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoWEgoKBgYKCg4ODg4OCg4OCgoGAgICBgYGBgH9/f3+AgICAf4CBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYWAgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoCBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeIh4aHhn99gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYSGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359f35/gX+AgoGFhYWHhoeHhoeIiIaGh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoWAfXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhIWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32DgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+f31+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH59e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjYiHh4WFhISDgoKBgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gZORjIyMjY+KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/fn+LkI2LjI6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36MhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJGMjIuOjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn9/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CLj4yMi4yLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t9fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJGOjIuKioeIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJi4mLiYWIkY2LiImHhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgYB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9fH18fX1+fH59fX19fHt7e3x7fHx7ent7enp6e35+goWIh4iKi4uLiYyQjYyJiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4ODhIeJioiJjY+MioiIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Ign9+gpCEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjImJhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiYyJi4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGDgX5+gIB+foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISEhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAhoKEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX5/fn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBf4B/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKEgIOCgoKDgoSCgYGAgIKBgICCgYOBgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOCf3+Af4F/gH98e3t6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhYSEgoSDgYOCgICBfn+AfoB8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fX2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn19eH5/f3x8fH59foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZxeHlyeIWFhYWDhIOCgoOCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/fIB+gIB/gYCAf32Af35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWGhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/fYB/fn9/f319fICAgIGAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/gH18fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39/fn18fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgIGAgIB+fYB/gH+BgoJ/goJ/gIF+f4GBf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f356gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH19fn5+fXx6fHx7fX17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIJ/gICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHt8fXt9fXt5eXt6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYSDgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgYKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKAf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+BgIB/gIB/gIGBf4CAgICBgICBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH17fHx8fH1+f39/f359fX6Af4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYGCg4B/goGFg4OEgYGDgYKCgYGAgIGCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAgH+AgYGAgICAgIGBgIKDgoKBgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl6fH19fH17fH19fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKChoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYKDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhIWEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3x6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Dh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KDgX6AgIKCg4KDg4OEgoGCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gYGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KDg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgIKEhIWDgoKDg4KBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4GAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KDg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIR8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeoN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgH9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN/g4N9gX1+fn1+goOBfH+AfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhoOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9f359gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOGhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB1gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WDhYWFhIKFhYSFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYWFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEg4GDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WDhISFhIWFhIWFg4aHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn58fH1+e3x8f3x7e31/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYSGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaDhoaFhoWFhoaFhISFhYKFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn18fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHiIaGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4eHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYSFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f35+fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiYaGiIiHh4aHiIaEh4aGh4WFh4OEhYSHhoaHhYWEg4WFh4aHhoaFhoaGhYaGhIOFhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYWGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIaFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCgoR/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn1+f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYSFhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg35+f4B/f4CDf3uAfX1/gn2AgX5+gX59fn19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7fH1+fX2BfX18fH2Af318hoOGhoaGhYOEgoWChYGBgH9/gIB+f4CBfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCfn19f35+f4R+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHx7fX59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fc3d3d3d3d3d3d3d3d3drW19fX19fX19bW1tbW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0e3Nzc3Nzc3Nzc3Nzc3CUwLy9vb29vb29vb29vrSKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmjQpKysrKysrKysrKyskZLCpqqqqqqqqqqqqqqybU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp49LjAwMDAwMDAwMDAwKmiyq6urq6urq6urq6uunVhXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaujSzw+Pj4+Pj4+Pj4+PjlxtK+vr6+vr6+vr6+vsaFiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Oz87Ozs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crJysrKysrKycnJycnJzdPT0tLS0tLS0tLS09PRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7Q1NLPztDU0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bV1tXW1tbW1tbW1tfW1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafTyJSo0tDGk6vSzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8/P0Z2PwJyrm7DQma2Zs9LOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvq7WVh5yexZOGnZ3Oz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZu/vsiYmca9yZaZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImavdOUlp/O0ZGYoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBm8Syn8Kb2q2jv53V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5at0IuTnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDPlMrbpZmz0NuimbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+FoJuRp5mgrZComJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJulpqSooK+noqmc0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iIzJ2RjrrVmpGOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTTucfW09O4yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtoZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwsbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m9urq0v7i1t7Ovu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2diXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmFhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcrGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBwsO7ubO0usG9v8bAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXFpVSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3s7KytLK4vrmztbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SUJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKyL7AuLi2srS2srSvrbu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubS0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ysrq6t7e1tbyzr7Srtrq4wMTBu7W8vbeyrbOwr6yutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6awpK+utcG6tbeyt7aztKuytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsaOlqJ6gnJWTkI+RkJiQlpWYlp+Ym5mbo5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaSlrqWsrLS8t62zsa+xrrWvr7O1qqetrKObmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZabl5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOT5CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6kqK6trKurr6qvqZ6XnqWdnqWmpKGin6agoq+rrK21sramr7Orqaq0sbGwuK2noZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmJykoaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc9Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho5+doKCjoKKvr6yvsay2qK6xsKimsa6trLCnn56ioJeRlJugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issbSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShn56anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOemaidrp6nnpyhnZ6ampKZnpyhoqCgnaKgn56fqaunrKmqtKyrrMrApKuoqqyqpaCemZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqefmaagn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKafnp2dl5iVmZ6bnKOfn52knpudnKWipKOiqrCspqjUtKWsr66pq6efnp6hop2enZqcnJSTlZSenZiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqquo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3VycGhXW1FFVEhESU9IPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpJ2Vm5ufm56cn6WmpaCjyLSyrqekpKOgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsDFvrm0ubq0u7ewtbKqurGuu7e+urqqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGhveGpkWltGS0xFRFNMREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkqCfkpmfmZKamJ+Zj4misbOooJqdnJ+empeYl5KMj5aXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbHysfOv8jRzMfFxsTBu8PAvr6+tb2zrb+/wsLGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6ydn66mpbGqxcbMzs2/sMGopaisraqhnaOfnJ2aqZOaoJq+o5KOloyCi5qpsKqjn52gm5iXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K0tfR19LU1dPTyMzHzc3J0szO08zFx8nKwcXLxsjIxb7CsrPIxMvKys7Fyr++v7zBx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/enJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyblqevy6yMjZGLma+vpp2dnaGloZ6blZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTSz9HD0NPW2NXW0svJztHLxs3RydLV1tnV19PW2M7Sys/RzM7QzNLPv8fGysPMzMvOz8XGx7bAyr/RzMvPxcnHv8PDyM7Mz9DPzcrIzri3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wsWxtqiipaahoqu1p5qvxMalhoagr6yclZignJuhop+cnZqVindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDO09fW09XQz9LT0cnT0cfQ2NfY0djS19nV1szPz8nN0cvOz7/FwsfFzs3R0NHIy8zAysvF087LzsjEycbGyMzK09PR1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66qqqudpq64qKu319TV2dnRztDAvMzJt7+vp6upo6SxtbKjt8u7m5Sqq6GYlpiam52gnpmcnpN+cWVjYl9fYV9fYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0NTV1s7S0NjY2NfLyM3DyM7Mysu/yb/HyM3Oz8vQzc7Lzs7Hys/Qys7KwsnGyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bua2FkbnBhV1xaSUZGRE1XRTtAPDMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snnri2tbWtpa2uvrSwwNjS19rc1s/Ny8TT0MLBsaqtrqulsrG4qrvOr6OenJaTl5yen5+dlJeYlIlrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVysDJwcXMwsjJwszDxcjKys7KzczQzdPLxcjPzMjHysTGwMXKy83P0cbQzs3NzM/Fx8C3uL3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbWdgYHFoWFhoVkxGTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfCuMvV1tna29jMzc/I1tXFw7extaqjray4ua+/yqGXjo2YlZCTkpGWlpaQjHxmYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7Gyb3Cx8nOxMHHwMfNx8PLysvPx8PD0MjGwcXHxL7Ax8vLy87CysvIx8zQxMXHu8fDyMjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vbrNzcfQ1dXZ2tvY0MrP0NLUycS5vb6vp7eqvbi3w6ySjo6Xj4aDhISCfoWFf3RgXF5eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsjGwsPAw8fKycjKyMHFzMbIy83JxMLLycHCy9DEy8i/ucG7xce9v8bPy8O/w7vJxsi7yMbEysC9wcvGxcS+xby8v8PEy8XEvMDJwsXH0sTAyL/KycbHxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZqjoJuUe3ZzdGZpWmFubVpbWFFETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvP0czHwsPHzc/PzNXQ1tnY2dDM087P0MrDt8bAtbW7sL+2uLCRjJOYh3qAhYaAdnh1cnFfWltdYGBiZGRkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcPGvr61wb3DurzGu8K5s7zFxMHCtr+1tb2/usvDvLW6yLq/vcvDwcXCxcjGyMbQxsLMx7LHycPOzcHFw8C9srewsqeoqLmwpa2wq62slHl2d2pkZ2Bob2NWXllKRUpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc7P0snRxtbU1tjOzNDHzMjKxL3JwbG0uba5tK6RjYqLhXmAhoaAfoR8dHVkXFxdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLS3tLKztLq1vbG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bAwry4vcbBw7u1rrK2ur60xLe7tau4vb2/vbC6tq+2urLFvLauu7+0trTFvb7DxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7bDvb22ub7Hv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDMzsjLycvKy8XRztPQz8fJxcnEw7+8z7yyt7u4trWbjoeJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquss62pq6m0rbawsqmupqyyvLq2w7m6urGrtbm7tMK6sL+xvby7trzHucK2raqosLG/tbe8r7CnsbO0u7yrrbWlrrauurGwqriwrbuuu7i7v7+9ucK/x8PFwbzGwcjLuMXHxb/Gw8O5xMbCu8bJzMuzucK8urKIcnZ2a2lhYmxoWVdXW0FMS0xJRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs7Sy8PGwsXQx87CxMfAxsbExMvCysvCw8DGv7m7usm2s7q7tLOqkYmPkHx5foqGenuFgXdvXl1cXV1fYF5fZGNiY2NiYF9dW1taWl1aWlpaXGRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCkpp+qrbW2sb25r7evqK63tLS8uLS8r7i5tLG8wbHArqWooquxsrOnvKqrqKusrbSzpaitoaSuqbKlp6itpai3rLCyt7m6u7G7vb6+xL+1wcDHyLe/wMS3xMK/u7/Ewr7EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8XR0M3EyLq6zMLMwLzKuL/FwLvLucLFxLm7wry4trzEt7S3uaywlYOJjYF8foB+eHR/fHN3Zl9dXF1eX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSdpJuYkqGjqqOin6Wlp6Wsn52bpKassq+2t6ewrKeqtKq0urG2ta22ubGvurmxt6SfpJ+msaerqLmqpKeoqKeyraCnpp+bpKWsnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubrCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZl9rb2BVWV5ITmdPVEdFSkY8PUA9Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wbu9taCelJ2hprq2q7Ozu7PE0MnLw8e5uMnCzcC5y7m8x7u1x7q1wsWxvMS6ta63vrqvsbStoYSHh4J9enZ0b21rampxaV5gXVxcXF5gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeVmqGWm6KYlo2eoaKmm5+fo6Whp56bopufqrCtsbWiqaqpq6uktLmtt7CssrWusrWusKqfnZ6jorKkpqm4raKmpp+orKqZn6CemZ2fpZqao5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7KyubK9tLaxsbW0v7a9wL3Dwbq7vZeDenJrX2VeZGRYVFhdSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDIycHHvLzFxM+/u8m6usG6tMS3s8DAssDCu6uos7i1pq+wpoqGiIB5c25wbmtiXmJmZlxdXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaRnKGiqJ2bnaWmoaWcoKCamK2ura6yoKWiraumobSwsbGsqK+yp7qzprahop6bo6Gto6Gptaqio6adpaajlpiel5manZ+al52cnJysoaumo6Smrauzs6q0sLKqsrm0r6mvsrKyt7Ouqayusriwura5vb+3srGUhXl1ZV5lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLNyMfBxrjCwcjPuMLGv7W8vLbCubW9v7S5vbmopK+5r6WvrJl9hIWAeXBydHFoZWRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYWFhYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqmcmpqqpq+wq5ujo7eqoJ+uqLappqetsKO3sKS3n6KbmJiqpqGarLiwoqGknKKgoJOVoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxr7Cur6anp7KusbSvvLS6t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri9rp2np6Oqu8C9wLmutLjCzcnGw8S+x7nJzbTDxMOwvr+4v8C5vr+4uLu1paWuuaSmn6KIgH15cmptcnRwaGhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKannpyfpZ+qr6afoqO2qKChoqi0oaWnpK+lsK2stZ6gnZWUqaGilKyxsZ6io52dmJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepKett7u8wcW6sbm1xcrLwcTHx8i3x8W0xMHIrrm6wbvBv8C8ura4tKSlr7Obn4eXiIB3b2RiZ2lpZmdpZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVlNUUlVgYF9gYV9gYWNkaYGTk4iQjpSSk5yUlZajmaCWnKCloa2lpKOio6GbqqulmZ6lsamgoJ2lq56noZ6sramorq2ioaKUl6ObnJCrqLCbn6KfnpeZk4qekY2Sk5WQmJiTm6GinKSgoZWgoaSmm6OrpaKkqqSrrqWtsammpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlVRRlFPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7KwrLKtnaenr7m5s8DIurXAr8bJzbvCy83It8u/s8DGy6+0vMa6wMXCvL21uLOjqK6smpaEjYN8dWpqamxoamxta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eXl9fYmRtjo+EkYaQkY6Zk5SSnJqinJugp6iqqKqmqKWjmKSupJSZpa+pn5uZm6Cer5mbqrOfpaafo6OhlJOblpaSqKqtmpyfoaCalJCMmY6LkIySjJaUkJ6hoKOcm6KVm6CioJiiqKOiqKugq6+krbelo6SirK2qqKuusreyvbWzq6+Yg3NzaFtYWFJVUkVYTFFbWU1VTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaivrZupqKy3tqy8yru2v6zMx8a5ws/QyLXGvbm+xcu0r7vDu8HDwry/sbatpKisqZuTg4F3eG9uaW5ubnBoZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt+jJCKko2XkZeZoqCbn6qppq6qp6+jp5mfrKCVlqSop52XkI+anq6Wl6eqmZ+clKWhnpKQk5KTlaerpZqZmZ2dlo2MjJSGiI2DkIuSlJCgnqCjl5WflZqgop2Tm6Wlp6iooLGwprC8p5+jrLSqrqewtLC5tcCxrbGrkH1xcmJWVFZOUklHVlFSUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6u8LL0cyzuLq+wMTGtbO2vLG5usK8v6+xq66rraiZnoVrZ21ucm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKmImUlJebmZ2omp+ppaSqnaeYoKWbko+eopqXloWEkpqjj5OinJWWlYeimpqTi46LkJmkqJyVlZebkJKHlI6MgYuNgJCKkpKRoZqfopWUmJiVoqWZjJikpqimoaC0sqeyt6Gdoresqa2ksrKmtbu1q6uxo4h4cWxdTlBRTE9DTU5OUEtGTk5KSk5NUUlNSkFHS0hHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8fGuLvEys3Hta+7v7e6w7KxrbWhq7TBuLmsqKmxrKyck6N7XmBnc3F2cWpuaWVoaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGDjoqUkZOdoI+am6Kho5iklqGblY2HmJqMc42CfY2XloWQmZCTjo57mY6cjIKKf4qYn6KekJOYloSOgpN+fnSJjnqQhpKQkJ2amZqQlZCdjqKjjomaoKGjo5uitK+sr6yfmaW4pqWwobCunLC7qqmvqpmBdnJiVU1ST1BNQ1NOTFFNQlBRSElOU01ISkpDSkxGS0o8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTE3NjQ3ODk6OjY1Ojg3QTd3t6KjtKilpqijpqWmpqazp6W0wbivtLDKxbi6wc/Gv7SuvMOusMawrKaqlKKsvbaurp2lqqqok5GecFdXYGhnaWhpbmNqaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeLk5Cfl52VlJaUjpaJf5OJXztXb3uLlImAi5KMj4WGc4qEloF5gnqFk52Ug5aOkI+Dhn2SeHJvhY1+iYCQjY+XmZiTio+JnIeel4eIlp6aoaCXp6+prainnpets6KmrZisq5intKKpraOSfXJtX1tOU1JWTERUSlBNTEZOT0lFTFFNS09KSU1QRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6KpsKintMG5sLWwyMO4tL7PwLqwsLfEqa3IrKahnIWZoLirpaaUo6Khn5SMk2dRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFBCQX+VkZF9iZSMhIqNmo2VlYqSiIWVhniIf2BKUW54ipGEfYSNiYV/f25+f5R3dXV3hI2ZcFGNiIqHfH54k3Zod4WIfoqIlYqNkJGWi4SKiJSEmoyBhJKblp6clKSjqKmlo56bsKqhpKSQpaqWoamcoqaoiHRsZV5bSFFRUk1JVU1TSUxLT0lIRktOTE1US1FRT0ZIQjw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+tqra8tri3s8K8t6i6ybm2qKm2t6y1v6qhmpGCjpivnqCXi52UlpKPiIpjTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJKBkpmLj3uGj4B1f3hzbnVwdI2NgXl9iqqFeXpodnuOcHJteIGKjJJ4eoB7gHZzcpJ3Z3WEhISEepWJiIqMioB/hIuMf5SDe4CPmJWclZGfnamen6CdoKmln52YjKekk6Cflp6epH9xZ2BcXEpWT1JHS1hST0pNTVJKSkpNUEhMUUxSVE1FSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpijoZicn7Spr6mlraywsaq9tLK7uLa7tbKgt7uzq52eraqrtLKknZWRl4SSopWbioGVh42IhIWBZEtJSUhHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4gImPfISYkoFyh498dntva36tfHOQin97hpKBfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcWhxgH2OcEOKhIKDhX53d3qLhX2LenV+jpKPmIqSmpujlpmdmp2eop2WjYqlm4+el46WmI92bWxlYlpXV1RRSlNVVE9QTlFWS05LTk9KUU5ITk9LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn5+WoKavrK6rqKmxr7GrvLisu765s62om7GnrZyQlp2nq6ajmpySh5R9jZSRk396iHiDgH1+f2RKRkdGQUBDRElMTE1RUlBRU1VUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hufHmIkHl8i4VvbYyReHN4amqAgnKWkYuBfZaASZKYbmh4foFsaWNseYWQkoZrc2x8bnJ7hmhtcH5zjYiEhXp9fnt2b3RzhYJ5gXdwfI6MipODlpeYmpCTlZaZl56XjIOJn5GKko2GkJZ+bWhtbm5XVVdUUlFZT1JVVVNYVU1OSE5KTU5LQ0hOR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6lrbCirKqota+urLS/q7zCv6aimpWlmJ6OhYyWoqOZmpOWjnWQfYSKkI58d31zfHd0d3tmTkVHREA8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4l2gYiGdGyakXRze2prnY9NeYWSiYSOZzF2hnNsfn2DdGZldH6Eg4WAZmlsdWtwf3xncHB7bpKNjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlI+XjoB5iJeIhomGgJCHdWlpbmdkV1FaV1lZW01QVVZZWU5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiZkZqWpKiunrKfprquq7KwwrG7w8eblo+VmYuNhnqFkZmVj5GNkolziIR3io+Mf3Z3dXd2b3hzaVRGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bHKDgYWBeoSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8hnxzjK2NiIBoZmJpbnJtcIN1aW9YdW+OmpJ2bH97fG1xbXB/enN2bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6DgX6PeXBvbmpeWlxdW1lYYF9TTltaWVhMSEpFSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW1qa2xrsGyu8HGl5CMlJCBiX1ugpGSiYSLiJCHdoOFbpeKjH95entxe3R8a29eSlBHPkA3NDQ4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8fYWDf4x+dqKZeX6GgYSZhJucYYaqn52KgpCNenaIfomIjXOKl4+De1xkcXR6e3eKbGdpYXhvhY+Cem6Bd3SEenBzeXdrbmldd4d9h3yIh4+Ai5OXg42FjYd9cYR/hHx1d3t9iXVucXJlZl9bWl1TW2ZeV1FVWFxWR0pLRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMeIqAlIyRnZ2fppGgq6CxqK/AsbrFupaOkZSIeoV2a4CMkoN+i4SQjnmDgnSiho1/f4KBc4OBfWx6bFNXTEBFMjExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+MenyJhn6Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbHyBhod9jmhnZ3h+boWGgoVxhIVHa4B3cXl2aG1rX3Z9g4h/iIWMepWenIqLiJF/e3WLdnx3bW93fn9ycXBqWlxcW2NjWGdlXFVQUFdZUERMTEZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpiSl6CdrKGmuK+zvbOXjZKLmIt9dHB/iZN/fYyDk5V9hn+HpYiJgYOIhnmIi391hnlfY1ZLQjYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoaGXlZuapa2Tmruxp7vHw6iLjKGljpOJgZB7coOdn5GcfnaFhYqPh5BpaG+DgHSMhoSLcYaCd4eAe3aFfW52dWeAlI+GiYiHiIehq6KWiY6Yf3uCiXp6b2dreH14fHFpY11aWV1pXGBmX1pPTE5YUlFJUEtETkdDS0RDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnVwZ3iDe4CMgIGQj4uamqScoaymq6+wl5GRhKGUhHh3gIyUfX+ShpOWf4qAkpuOhIGCjIuCio6EgIqAbHBqXUNBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jKGemISShYKPoZ+TmJKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGWhpOKj4+WpbWpm42VooOHk4R+f2tqa3x+foBxX1xiXllmalxra15YS0hPU1FOTUxGSVBERE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwg3B1h3F2kYZ+l5aalJ+fnKegqpaTmJ5nZaSafoWTkXmAkYmRkn2KhZmSkYOAgIuNiYaRh4SIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGampmnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N7fXpvZl5bX15gZmNgZ2ZcUkVLS1BPSUpMRkZNQ0dNRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcXVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Ljo17ioaPkI6Cg4CJjIqFk4WDhoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49RkdBQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKeotKyxt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsraqji5aYhaamoKKXgqaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWqiZqKk4qVent+g3xlX2ZbZGBdYmNeZmZfW09ESkhUT0ZITEZLR0VGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljWGpwWHqFdoGUhYiCm4OSkI2T2sidlnNWl4iPiJyPfIaMj4qKeoiCh5GOg4WAi4WFiJKGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJUVVVXVU1bUEdHRDw+PkZIQ0RANzs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHIxKuzxbass8CzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4inr6qklHafpJehq7GzmJapraiutbuyuqyvtaKxrLG1vLe1rrWgp6ejqJupsK2yuri4p5y3qY2lj5KToIZ5gYFzV2BiVGVgYGJfX2VfW1RJREVMVlFJSkpESkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFiZFd6dXGBlH2EhpN2hn6AjHu/u6O8grSUk46bj4SIj5OJiXmHgIyTjIeFgY5/gYmPhn+FiIWKh5F6eW5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFdPX1VJS0pBQD9HS0ZFQzs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMq2u8S9s7TBt7jCtb+wt3SxtKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KRpbGtpa2rp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6uL+3ure5ra2xprGqrb6wvbvCwqyZu6iVrY+YmKqJfoB6aVZhX1dpY2lkVVtjWVZUSUhHTFFHRElKQUhEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWVZad2pwf4+EgY6FbnpyeIdiuKGao4mVlJaTlJONkJeSh4d7h4GNlYqAhIGKenyLh4Z9ioKBi4SVfXh6dWVPXGRHRUw6UWRhW15TRj47SFBEWmRRUVlYWmdaVGBhTVNPRUE/SUpIRUZBQEM9RTZCPkhHS01TWlRelK+4tbq5ycC7vcrMu73Au7i1vLy3vrW6ssZgdbKlsZqeq76qpairqqSisrWgq6ielZaemJ+upaempZ+kk6KnsLOosrK8tsG908nJ08bCxczCysPAvr2/u7y3tLC5t7fDusa+w8mwnrqqoqyPpai2iYB9b11gX1xVYF1oZVJYYVZSVklFRk1LQD5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdtbHGQjYWQc2xzcnOI1cC1maCNlZmakY6XkZaWjoaHfYeDjZaLf4N/g3h7i4SHe4t5gYqCl390fXpsZXB2WV1cUGVlYmBlZF1bWFdcTWRtVVJtbl9vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVl1aXJO5wLm9t8bAu7nKy7u3ura4ubO4tbWutraZZHWpnq1wXqKtnJihopuknqullJ+fkJSPlpiXqJ+ln56amYOknaykqrCtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKv8nPtKS7sbWwm6y5vZp9d2lbXlpYW19YYWJRW2BTUUtDQkVGRTxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQjIl8gYNze4qDhXuKdIKKhpV/c3t5bG11fGlzZWlsaWZqaWlgZmlobVptdJetpLyHh2dbb2hdWllUSEpOUEpLUUxUUUhMQUpHS1BfX2JnamKXt8ewubO7vraxxMe2sLmxsLuss7Gnq7esjbannpynmk6ano2OoJaRp5illYqTk4iRiY+RkZ2boZiblZaHnpmmmqyvqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzcPR0rivxLzEuqa3u8Sif2xhWltcV19XWGRZT1xXTlFDQklFQ0k7QUQ+QUg/P0I4O0Q+QEk9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CQmYNocW95eYOgqp6ml42bm5iLjZWRmo59iYyFjoqKi5CIfISCcH+HgYZ7h3KDkYuPfnF5dWxweH9ye254c2xpgHBtY2ltcHlpd31+y7/C36dtY3hvZFthYEpQUlVOWV5QXV1OUE5UUVVUXG5ud4Nylq64rLSosLarrb3Bsau1pqW5p6yuoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSKg5OVmJeUm5GbmJmZnp6rrKSnoaysztLV0c3M0tPT0NTRzsjD1NHIztLT09bN0tHF0tbGwc/IyMOpv7jQnHdsY1tgW1VeUVxaT09UUE5IPkFHQkNGPEFCP0ZFPkA/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bXdwfX6AoZ6eoYuNmZOTjIyTkJaFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBwd3Nsc3x8d3xzgnhxa4BycmlvcXp5c3u+y5p+jLGDdnKFd2hhal1DWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGop6qxuaumtKOirqKkrqKnsZ+JppuVk5GKko+IgpSJa5WijZmEgYZ+kYODk5eti5WNlZmOhZKQnZensKKgoKSkqMfNz8fBy9DT0dTSztPNxtbTzNTY1tbY1dfVydTazcrY1tHKrcTDzIlwbWBeXVZSV1FbT0pHSklKQDs6O0VDRDxDRD5IQz9DQjs7OTw5R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKJgZ2VnpSFi5aJjoqIjoiPgHiDlJmLjYiIi4l+g3hze32Dh3eAe4eRl4GEb3hwbXV/dnh9dIZ8eWyHdnVufXaEdXl7nbWMPEGKxqV+jXxqZVdJQ2VjZmNoamRveVtfZmhrbmlugISIkYyen6CekZeYn6SkprKkpbOgoqWeoamgorGch5+SkpORi46LhoOPhH6cnIyNgoSFepR+gqqVo4ySipiSi32XipqRq7OYmpunnKe9w8W5tsXN0dDRz8vSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR1dGxiW1hRU1BYVUVGSklFRT06NzpAQUI6R0VARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXOGjXyXkZ2LfoeSgomGhYqDiH15hZeXiY+Dh4aHeoR5cXp7hIZ1eoaOjZ16jHB9b3B6f3J7gHGEh4Bujnp1d318gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnBxcG54d4JlaW9ydXhye4uHjpOSm5agloiMk5ugm5+qn6GsnKKamp+mn5+smYyajJGSjoV9iIeDhYuOoJmTiIOHfm2ZeYSZhoiTjI6VjIZ7m4iTj66qlJWXnpimrrW8qK29xsvIycvLz8nD0srU1tjX2NfU29fT2dvWz9va0dbI1cyTdnhmZVlYTlFSXEdCRUlJPkE+PTg6PT87Pkg9QEJBQURBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fYSYjoeLfoaHgHeCeW57e4aCdHqSno2hdo92g3R1gX10gIRvgpCCb5KEdXyBhXp2h3yJuMalw8q4gpacj3hwZU5lY4J6gXeGopCLeXl3e4N/fIR2bZSWlJWPmJGDiY+XmpeXppyYoJefk5KXo52Zq5aRkYuOkoOMhYmIgYaQkZ6cmYmFi4GFl3uIiZ+XkImNiouCfKGIkIu8oZiTl5mcqKWlrZ6ntb7Av7jHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztzGhXh2ZGZiXVJWVVRMS0RNRDs9PTw5Ojw+OT5BNz4/QD1APjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVtodHp5bImNknd2eop8foB/gH2Fe36CkYqFhnqFiHt1fXVtfX2GfnR/kp2Rn4OSfIZ9eI9+eYuKb4ObgHSZhn2CioV8fpF7kKmOkMOgvYybpJx+ioR9iXKMi39zppqcmZSFe4+RiYRpR3GhpJ2Mi5CShYiLkZOVj52bk5SRl42MlZ+dlKGUko6OkIx+kI+Oi4SIkpaan5+JjJSRnZCCjH+mmYiFjoOFhICkhoqLuJidkZSWoaagnZ2do662urSrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbt3d2dWhnY1ReWVJPTkhDTEM9PT45OTs6OTk8PTZAPj49PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PERSU1JYXlVYZm1tbWmBjopxc3iKe3t/fYB8iHt9e4uHg351g4Z6c3p0bYF+hH13hpuhm56UkoCMh3+Yh4Cckm6IqYV6oIt8kY6DiYScfpqRiY2jop+QpK+gi5GLhouBkoZXcq2Ln6ycj4OYnJCQjluDopGCjZ+TlYyGiIySk4yUlZWQjI+KiJabnY+VlpGLk5SGgIuJko2Kip2XmaOihpOdlaCKioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispLzBx83Hxs/Mz8zP18/R1K7W1dja2Nra19bZ2Z1tenJkZFpaVlFVVkNASUQ/Pz46NDk6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieGxifpKDb213i3h6f3uBfYZ8e3aGhYBzcIWCe3V3dnSEg4V9f5Kmop+mopeKnZCUl4qKp5dyirKNhKeShJmUhZqMo5agmJOJm56ik6mwoJGVkI6OiJWLbo23hJrEyLKcoqWbnZiWkbGQZKTNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhH+Pi5mIjpCql5ekooiZnpWaiY+Gl5iKhY+NgX+Gj6WIjZOompeTl5mhmJ+Zk5yaorK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6AcHxlYFtcXE1JU1hBQkdEO0E+ODM3Ozw6OD02NDo6PDo3Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGPfXxtfoh4en57goKDf3Z2gIN8bW6Lf3p8eHh8hIeKfoujs6ejqrOil6efpaSWla6ig5G4lZGzmoyhoYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmZehwI6jybmrm6OmrZmSm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4aVmIaEkZCcdZGYspaWpKGHnZqSj4qQipebiYuWjod9jJieiZCQnJqZk5iXn5OgnZSem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LR1tjT0Ni6cHdzWl5TXlRPSElNRUJDRDU+Ojc3Oj88PDc9NDM2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p6boWGenyEeYGGgX5weHx+fW9yjXp+gnx4houJhoSSp7usqLK9r6Wts7Ooo6GwrIqatZ2iuKWVraSXqa24p6Wjn5qpl6mjrrCqmpmclJWRl5+Xmru7rsqhara4q7CUmZ+jrJOXvaNeqrKDioqNlIeQfI6OfYOGjo+UlYiIkpaMkJWNi42WmJOdmbSXlaudipyUko6RkoyZm4qSnpCLiZWfoY2UjZianZKcmJ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8fC0aDGyc3NxdfW0cvToG54ZlpYUVxQTkVDPjxDQUI4Pzg4NT9HPTw2PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEo/i4p+gXOGh32CiXWDioJ/bXx9fX9wd4d3joKHe42PjIaMmarCwK+9xruztMC8tK2rs7aMqLOtrb2rm7ukqK25uKunpqKipKKpr7Kxq52cpJibmJeeoqalkqS6r6nAvK2tsrmlpKh+iIacrbywg4yMi5CDjoORj3qBh5CNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpeOkaCRiZSbpKyUlo+UnJ2ToZ2bmJ+hlJqep6akoqSws6fBxsOvsLq2xcTCv82mx8THw7zW0c3EyoZycF9ZV11ZTEpBS0BGRz5BP0I7OjU+QT09NTw2PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRD9DRlxlR2BpZ1pdXJOMi4h7h4yHg4x1hpGKgW9+e4F/cX6Be5V6kpSUmJCTlaezxsm/wszCw7nHvLuvq7m7mLO3urLArqXBpKuwvL2rrqujo56nq660sKqcoKqcoZuWn7C1p4ujurq2wbysqZyypaSolIWOqcTDpIKLj4eIhIaVlI16g42Rj5GijIyUko6Jl5+Yk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+gmKSfmqCboJSYnqWjpqakr66lwMTDrqi3tcnCvrbPssS/xLyz0crIwrRydmpZVlloUExIQkxLS0pBQT1DRDw1QUQ7OzM9OEIzMzIyNjJBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWU5lXGZUY2qZjZeKjIiTkIaJeYeUkIFygHyNf3iHgoKQeo6hlqiampi6vcfIycHSycrCzb3Cs628vqi6v727w7eswqmss7y+qrCqpKWkrK6zrba1oJ+vn6WimKOzvambqL3BpLa3sKyTsa2srZeHmqmnpZGCjJOllYmBdoqReYWNkpCen5OPlIyPjZSjmZaclJSjnqqfkaWajI+Pj5WWiHyPlZKSopqVn6GctaWQnpelo6Klnp2mmJ6Wl5uko6mnorKsqLzAxK+lsrfMv7mvxLO7vsG4rMLDwsCXandgVlVaWUlKTElGRERIQ0JBREw6NERIOTs0PDdFLjEyMzUyQjI1U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+KoJOEeIV/lX9/kIiKkICWoZmupqSYwr3Hw8fF083Ozcu8wrewuby0vcu8w8G2t7yts7+6vK6vqKCpqLatrqmyt5ueraKnoZ6rt7iqpa+/xbG9ubSoqrW0rq+XlqWsqKCRjpKyxaeVjn2SlX2HkZmQqpmYk5OPkpaTpZ6SnZmUoaOinJifmIuMj4+eiFqQlpeSl6SZZZijn7OllqGWrKypp5ueppeYlpeVoKSopZ+2q6q6u8O0pbO1y8C4qrassru5rqi4ur24gWlsWFVTU01ESlJNSz9BSEVESEhIOTVFTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnBFaUlSZWJMRqWUm5eil6mWjZCDh6aTiIKHgpyDg5WQkJSPmqKfr76voca8xMTGxs7OztLKvru2sbq7u77PtcO9uLm3srG1s7izq6acq6y5qqmor6+Yo6+kp6SltcCwrKy0vsO6wLq0qLm1ubOvlqWtrq6ki5OVoY10wZp9l5mEjpaajLGVm5qVkpKamqWjlKCbl5qpnJyhoJmKjZCWnGBKlpyalZqlllWXsJ+vnJ6klK+uq6WaoKWUk5iYjZygp6KZtKmqs7u7u6qwsse/uaarq62ysqOhsrK0pG5rY1pYTU9KRE9PUFE7SEtJR0lDQz46S1Q/QTo9RU0wNzU0NDpCNDRNV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGYh4uolo6Ik4Wfh4Sdl46doZujpLXItanGucLDx8rJyMzNxr66s665ucHBzLXHusG5tbqwr6+ztaekm6q0taqppq2smqSupaSorLq/qKy2t77Cv765tLPEsrm9rKOvtay5poibl6abdr+fhJmdjpOZmouul6GcnJeUmqChqJ6nn5maqpmhp56YkI2RnYNudpKjmpWdop2QrrKiqpSoqpeqraOjn6SokZGZm4eUnKKelrGnqau5tr2zsq6+ubego6eopaacm62pqYtgY15eUElLRkdNSVZMPU1FTktMQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VFdOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH9lXkhFq5WboZ+7r5mUn4yTq5uRkpOJq42Gop+MpK2Uo6O2xr60wLrCwsfIxcLNyMG+ubKvuLTBwsq1xbLBvLW6qqmtrbCjo5iqtLumqaarqp2pr6ejqqu+vKitvbS4vse8t7a4wbK+wbSptbervqWPopeSop+8n4maoJmXnp6Pt5+pnKWim5yhmqiks6GbnaacqKmemZWPlJuLl4mMpKGUnaKdoLWvpaSTr6uZq6qdnaOjqJCUlJ+Cj56em5WppKGhs7S6ta2otbKznpyipZqXlJmqoZ51XlpdXElHRUZMUEhNRUdHQ1NMSkJFR0FWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OccGJHRaeXpJ+ew62bl6WYmqmclpubj6qWlaemla2smaKrtsTCvL63wcLAx8O/zca7vbmysLizv8PItb+wvLe5t6Wkq6ytoaGaqqrFoqSpq6aerK+roqmov7inrb6xuLbHtrW5uMCyv8K3tbO0r76jl6OWlJuUrqCQoaOlo6OfkL2kqZ6oq52doJuln72imaOfoqmroZ2WjZWek56Hj4SNk5+koJ61rKWblbGnma+mnZmqnJ+NmJSehI2gmpuSpaSamKuxtbGqpaqtrJyYoKCSjpCVqJ6UZmBYX1xOSEdKTUtIRURJQT5RSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhWktDTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNDZAOTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm1SRjxLeGVhVkuimqOcnsWsoZ+snp6uoJKjn5aln6aqrJe2saOqs7bExL2/tb/Cu8jCvsrHtbi1tLCztLfBxba+sbi1uLSfpqyqrJ2dnqWkwaSfqq2gpKmtr6KmqL21pbG9uba2xLK0uLq/s8TBuLius7W1o52llZGUoa6gmaKeqKiro5rCrKmerK2bm52ZpqC9oZ2kmKurrKaimY2an5KfiY5Xf5afpaGguKqmk5i1o5+xoJ6arpadjZiTnYGOn5eVjqKjlpCmrrKrqaGhpaWVlZ2Yi4+RkqSeiV9iWGJfS0hKSk5FRUFHSz49SkI5OUpKTl1RUUk9TFZcOUZJPURNSThIYltMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtOnp+hmZ7DqKWitKKdsqeTq6Wgo5+tqaydu7CorLaxyMXBwrLCw73Gw7zEybyvsLatsLSvvsS0ubGwubSsmaiwqaqanaWhqMGsm6ywnKqjrrGppKi9tqe3u76vt8SttLPDwLPHtLu3q7O2raqippaVlKSsop+fmqirsK+vu7KmoKmomZmXk6KkuKCho5Ovr6ylp5+SoZ6Vno+QjZWemqKep7OmpoyYs5ujrpmdm6yQnpOVk5l/kaGVj42foZOLpqyvpaahnKCekpKak4WLkY2cnX9fZFpmZEpJS0pSQkNASUg7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TmNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+joJygw6mkqrOhpLSqlrOsp6KksqyuqbuxrbC1tMbAxMO1wMS9ycS1v8jBtKu1qLC4rL/Ds7eurLa5pZiqsquqmJ+ml627tJunsJutoK60sqerubOourS4srnAqreyxL61xqi/r622tamnrKGXl5GmpaKimJilr7iusrW2oJ+opJqVlZOkoLeipKWWr7Gyp6qmop6ampuWl6ifoJihnq6yoqaMl66YpKqXmZ6kkZqMk5eZhZWelIyPnJ2Ti6ipqqGnoJielYyOmY+BhZWIlJ53YmdcamlNT01OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko52ipr+nqK+woam1q526saujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDFwLmptqSsu63Awre3qayxuqGUrbGtspalp5GquamfprCdq6CwtLOqqba2rbyts7O5t6y5sMO7vr+mw6uwt66pq6unnpiZq6GioZGXobGvs6ywuZqcqaCZlpKXpqG2qaWjorCxtKyzqKyfm6Cgm52lnKKXnaOzsJqfj5Olmp+ompOinpSXiJOWkpWWnJOIkJqZlI6oqKafo5uXm5OGjpiLfYyWhY2ZaWdrYGxtV1BRWlVBQkVUQDs7SEE3OlhQZF5QVldFWV9dTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9qJ+doqq9oquwq6OxuKqltrSsoK21va6zuLu6vba2wMK/yMS5xMLAwLjEvcG3r7Wnq7exvL6+tKiusbaelqutqK6XpqiOp7ufpKyznqyisbCzrKq2tLW+rrCxtaywtLLBu8W3q72vsbisraqjsaaepaqfpJiQmZ+zqrOrqrOanaebmpWOoKaltK6noa2trrGntK2yqqScn6ijnpWhmZuotamWmZGRnZmdn52Pq56Wl4SUloqdmJyTiY2Wl5qXpqWioJ2VlZeTf4+UhXuOkoKLlWRrcWdvcV5GWWZWREJNWERaOUhCNj5cUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoaSstqWtqqavrreqr7W7p6axt8W3sbe9wcK1tLrEvszGucLAub65w7fAubG0rKm6trq5vrSprbC1mJinq6qsm6urj6u+nqyusqOrn7Cts66utrK5uKqurrGota+0vL3Ks6q2tbG0r66nobOgm6itoKaWlpqasqKtoKWvl6GkmpqSjqOmqLOpoaazrKq2pa+xta+kmZ2tp5qYn5qZq7eil5ORjpecoZeWlKuempJ/kpeMnZyZlpCJlJKemaWioaCYlpGTlXmKj4V7jIqCiZFqbXdtdXtgRWBrWUlIWlo9e0pGRDZBYlRpW01cYUpbXVpSUlJiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuK0IvSkdQW0gzY1lVS0SZl6GxqLGqraakr662qbe1uqSstLfJu7S6ur+/tLO3w8DMyLzDvLa9v7+3vryxvK2murm3tsK2qqywt5SWp66rqKOwqpSvu6StsbOnqKOytLGysbWxuLOprquyp7evtrTExraptrassK2pp6O2oKCnsaGklJyZlbGep5ygqo6pop6blpimpqW4p6OytayosqeusbaspZmgrKibnJ6clKm4nJSOjoqYm6KXj5iloJyUgpCUj5ybl5aViJaQmJqnnKOgkpaRkJV1hJCHe4SBg4uKbG92dHt+XEtlbVxKTmNcP2J7R0k4R2dXZVxMXmJNWFlXVFdUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLT1FTFE8M3JrSUNDkJmlrqWtr6uopbGztKu3sregq7W5ybmuwLvCuLOxtcLDzsXAwb20vb+/ur68ssSnqbmvtra/vK6qsrGboKexraalr6WdsrWsq7GyraqptLustbO1rbSsqquorKm5rbKxyMC4pbqwqayspaiusKalo6+kqZydnJuvmqOjoqORrJ6joJ+iqqamuaSstbalq6yora+2rqOeo6mqm6CampKks5mOiY2HkKGglIyUnJ+SkYONkpKcmpeVk4eXkpWZp5ufnoySkY2Qdn2OhXx7e4aJiHBycX18fFxTZG5eTllmXEZElltHO05tWGJbTGBiTlZWVVdUWWddUVJMY1paVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6SD8zQkhTLD6QaztHSI+cqquiqrGkqaWztLG1tbKyoquuvcy6rsC6x7G0rbTCw9HFxr7Asr7Bwru+t7vEp6y3q7K3u7+vq7Gsn6OnraqopLCkqrKqr6ywr7Cuq7O8p7exsqmzqaulpaOtuqyqssO6tq27qamnrKmosqWppKOuqqiinpyjrZWlnpiemaydoqepoq2mpK2ruLKyoamioKyvsayeoKeoqZmkmZmPoKaXhoSOiouen46KjJWbjo2Eho+Un5yUl5SGlpSTl6SbnJyKkpCNiX5+h4V8d36FhIVycXCIdWtfWmBuYlFzcVxLO4R8RT9XdFhhWk5jW05WVlVXUVxiX1NPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlVo+TEWVmK2ooquznKqqsLatubavq6arqr3Ju7C9t8KvsayzxMPOz8O+v7TAwsO6v7PIw6uut62yuL6+sqytq6SnqrCpp6ixpbSuqrCurbKxtKy0vKS3s6ysrqern6OesLerqq27t6W3tqSpp6urqq2hqaemsbKkp6WhoayXqqGVm6CmnqSiq6Sto5+nsbiurqOmopuqq66pnaKlpKSZoJqWj5ickoGCj4iFnJ+Lio6LmI2PioKLl6ObkZCai5OSkZOjmZuaio6Li3yGgYGDenR/goB8cnWLpId4al5gbmZXZYdjTj9nk0xFYnlXYllSZVRNVlVVVE9cXWFVS01oVlVXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxCKzpKT140RIY+SEZEl5KwpaOrsZirqq22rLayrKasqqm8wMC4uLO7taayr8TJy9G/wLu5v77BuMG5wMStsbWxs7q/vbKwrayqq6e2qqatr6q5sKixsq6yrbeqt7entLerrKSpqpyjnrOzqKiktLWgt66gqqiqqKunoKusqbm2qaqpqaKqoK2ckqqhnaCkoqajqp6dp7SvqKaqoqOYpaenqpyjpKOgmpigkY6PmI1+h4yHg52dhoOKio2Nj4uChZSimo2MmZCRkY+Tn5aYloyLg390h4F+f3h0gn55dn6Ah52Pb3FnZ3B3XGFziGtPXplWSG14VWRWUWNPTVVUVFBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EO5aOsaGmq66arKWtsLS1sKymsKqpur67wLCuua6ht6/Ix8jRwL69u7zCvbrDwL6/rrKysbW8usGxsbKrs6iktailrbOzubGjrreysLK7q7qvqq62rKqeqqyfo6C2raihn7CzorWqnqinqaOqoaKsrai9r6yurKKoqJ+smZCwoZiioKennqebmaqxqqOgraKhlKOjo6eYmqmlmJiYno6Kh5SHfYyGhIOjloSBgIuGjYuQg4OToJaIkJyQk5CNkZyUl4+KhYZ4dIF/fHV4eX96c3N5Z3+GpHVpXmRqgHRniIx9U1hwXkp3c1NkVFFeTU1SWmZOTFZZZFhGU2lSUT9DTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQTSQj7KhpKaspKekrae1s7GrpbCnqri+wLyvp7mqpq+wycfI0cK8v765vr+8ybrAuLCvtLG6u7fAsrO6rLisorSnp6yytrmzqKi9tq62vrC9p62staytnKmvpKClraunnJ6rs6W0qJqqp6mjqZ6kqaipvay0r62dqqSgrpybs6OVpJylpZ+km5qpq6afm6qim5OcoaWemJepqZKYmpSQioKPhX6OgoCHnY+Ffn2Lh5CNj4R/k5qThZKhjJSRi5GbkpWHiX5/cnt6fnxoeHx6dG9we2eEeISIZGFnYXGEem1neF1dVUBWemxUYlBRWEtMTnJ1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0FKN0dTYFUqPTlEVz4qj5SymqCgqaaloauluLOzpqqxp624wb21r6K4raiosMLJyczBtr3Atbe/uci1wrWzsrWyvLe5vbWtubW/raCzp6ursLW4tayfvr2qs8G0vKGvs7Wqq5+tsKOcpaiqo56bpbGnsKCfq6mnoamcpKihrbuorrCtoKujpK+en62ml5+boaOcn5yapKqjm5ulpJaXlZ+ilpuXpqyMnpGRkYuCioCAjoB7mZONiHt+i4aPjYuKg5KYkYaToomSkoeQmo+TgIh8eWx+dnl4Y3t6cW9vcXZngHNqg2dkZ19sco1sYWlvYG8+WnhrVV5PUFFKSU1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDFBaFkxM1M9ZV9ETDZLVmRPKjsyTlg9I5OZrZqgmKeko5+opLiwr6OvsKqruMG5s62fuK+rqLS6yMvIv7bCvrC0vbfEtsOxrrmys7+0ur23qLm3vaqjtKipqrGuurGqnLy9pbDBtbair7e1pqensbOgnqSlp6GlmZ+sqKmeoKqupqCmmKOpoLG5n6Owr6Gsoa2knKamqZqam5+klZydmp6pppecoKmTmZSYnpOZlqGqkZqIjo+GfYd+go19fKCMjIh4gouEiYuLhYeTmo+IlZ6IkZWCjJeMkX2Fe3NwfXF0dGB5eGhucHBuaH1xY3ttaWViXmSFfl9acmpxS0p+aFhaTlBMSkhQUlBJT1xfblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+L1hWNSiXnqeanZasoKChpKK4q7KltLSqqbnDtbOtn7etrq2wtcbIwbe+wbmxtLy2v7u+r6q9sLO+sLzCuai7uremp7WoqKuxrbOxqJu+t6atvLeyn7G4sKilp6+xm6GkoKSkoJebr6ehn6Oor6GfopSkpKK3sKGmsKufrKOvmJyqpKiel5qepZObnZqdpquanZ2ml5aYlJ2Ok5eiqKKQiIuPhXqEfoSKeo6WiY2GeIGHg4eLjYWNk5iNjpaYio+XfoaXi495gXpwcndvb3RfeXdka2xraGeCbWVya2tlaFlhc39eWmt1aVlHfF1bWE9OSkhIUlVGMjpeXmxQRFhWWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0JnW0hUQ1RdaEUuOzFeUywylqOimJWdqZ6moaOhuKqwobu5pqy9xLOwrqK1r62tr7TExL2zvrq3sbO5uLq4uq6tv7O0uK+/wbesvbq0paKzq6iqs6yusqOdwramqbe3q5+yu6mmpaivq5mjp5ylppSYobOmmZ6lqamboaCUpZ+kuaikp62mnqWhqJOfqaGhoZmbnaGSm52XoKKrnJuaopaTlZabjpOTo6ekj4iKjoZ5hHyFhn2cjImKhniAg4eIh5GFlZOSjJCVk42OlHuCl46Ld357bHVybWxzYnl1aGdpZ2VthGdnaGRmaGleZmJpZlplemJgUXNUW1tTS0lHSU9TQCEraV5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YU0nMp6kpJKOpaacnp6epLWtqKq6t6esw8C3r6yhta6nrq+3wcC9scG3sK+ytrW4t7Wsqry0r7KwvcC3rry8saSftqymprWpq6+hoMSsqqextKustLqeqKmrsaWYnaqeqKWSmqauo5idpKqhm6Kdl6Cdp7amr6mtoaGenaGVoKafoqCZm5qckpqelaaeraKYl5+WlI6VmIyPmJqnoJCHioqIeIV3goKCnIeKgol7foSIhoSQhJaVj4+QkZCRjZJ7g5WOhnN/fWd5cGtqbGd1c2tiZ2RidH9hZGVmZWlpYmdvWV5YXWxjYE1nV1pgVklHSEtMUlg+OWBsaUdCVVNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGNGJTWcpKCRjK6gmpigl6W0sqOyvrehscW7ubCxo7asq66pub68u63Asq+vrravs7myp6u5sa+us7a7trC5vqylnrWroKGxpauvn6XFobOlr7Kwt621nqyurK6imZ2nqqWflZynpqCZpKOpnJqgnJWcnq2wprmnrqKhmpqemJ6jmqWdlp6Ym5SaoZKolq2pm5SdnJOMlZmOlJSYp6eNjYqJjnuBdIKCipiFh3yJiISEioyIkoWTnJKSj5CRlo6Qf4GNjYNvgX9meW5oa2pncXJrW2hjYXJ/YGRnam5rZmpmZGxcbG12cWBTYmhjZVpJRkxNT1hRUFVhZYFUQFZTWVVGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUhjQic0k6Kcj46xnZuUoZqpsrCfucC2oLPBu725saa2sKmupbe5t7isu6+tq6u3qrS5raWytbGvqbG2trGztrunqZ+2qZ2fqqOqrZ2rw5mvpa+xtrWsrJ6xra+qopudpKypnJWcp6SdmamjpZWaoJ2RnKOrqqm6nqekoJeamp2hj2uilZiccYOWnKSAdpGrqJ6WlqGRiZeZgJeKn494hZONg21pfneEcmyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R/g5CAZoiAaHZpZlhdaXRuTlBqY2ZxgmZeZGZua2ldXV6JkIWIaE9LQzdEVGddSkhQUFVVS0hTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOXEtbZmI+RzFPYTwrL42kmoeVsZudk6Ccqq2ro73Fr6m3wri9vK2ntrGmq6S4tLKzsLmuqqestKWwtaKnuLa1qKestrOutK6zoqmftKueoqWcp6ibr76VqKewtLitrqSoraqrpqGfnKGoqJyXoaamnJunqJ2SnqCYkJ+oqqO0r6Oio5yWmJiXo4ihj5KahqGIlJ6hf6V/p6yelJOdk4iDcniMjoOHoHWIjWmXiWZ+c3mgb4iHg36MfH+hoJ+Zf3uHnnSIjnabimyHgoNuaWVke21yYlSGbWNtaZhxWGlwboZXXWlba2paiHBteXKHaIeEWV5GTT5GXk1FUlZWUVBSV1RnXUxZS1JST0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTlxMW2dfPUsxVV83MCiNppeEnaydmZmdn6uqqKq/w66yury3wL+qpLexqqyms7Wur7O2q6mlsa2ltbObrLW2tKanqLOxrbKorp6qobOpoKSkmqKknbC3laWmp7e9pqynqaqrp6aioJmgqKSamaejpJmcpaqWk6OclJSkpqahtqSjoKSYlZOYk5yIrpCYlYmpi5ijnIaxgKStnpSan5V5gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsHlobFixrm9labySvG5oem1wj9h+U2titrJ+gHGUdZqhqpBWTldhT1ZORlRbWFFQUotcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV5nXD5MMVpcNDEhjqaTgaeqn5ednaWtsqmxwr2ytb+1uL/Cq6a0ra2pqK+0qq+2tKiopralqLmvnLKytqqlpKeyr62xpquep6SypKKhn5ecoaCxrpWfo6C0uqKqqKCsraSinZuaoqqgmJupoJ+YnaiokZynm5SeoqejobCjnp+jlpaSmJKZhbBraouNqn5nhZaHrWVxnp2VmqeWca6hpH53unxroY92sV9qtFulgGWckGBmgXpmf2l4aqllvnJnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4eWRXWcYH1me6Omgllfi6tpgJJ4emqoOEqvW1dTbGNaTE9YX1xXVjtOiE9WVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWDMxG5KilYKtp6Weo6SqsbettL2+sLbFsri6w6epsKyvqamxr6SxurCkpa+zo6m5qZ6zsrCjpaGqrbCsr6aon6OisZyjnZiVmJ2esKiXnKKgtLOhqpuhrKyfnpqXoKOqnZmepaGdmqGnpJCdo5uYoaCsn6WmoJqgoZWVkZaRmoa1m7V5hamZtZl3h7Obt3+Tlperln5rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iHCOhoB/iJCXeIOCi5eMg6CPhbB2d59xa2psfItPpVhIY2OZfmNopV95cXVSkodeUKltY3F9hoBhnS9Som5bU2tnX0xLXGNYXFpCPrB3V1hBI01oRkJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVU1MByWn5SIs6amoa6pqLOsqru2wrC8wq24t8KrrK2vrqeus6qir7yroqe1raOrtqWlsrOoo6Gdp6qyqLCopp6goLCWoJqWlpeaoK+jm5qkqLWuoaiPqaepm52WmKCmqZufnaOfnKCjpaOVm5+Ymp6jq5ulmpyaoqCWk5GTk52E1ZOZuXGwwn/GhnzWlJy7fJuWppCNnIykeo2GooGlgnqseY+dVa97iX6farlauXeFg32mgpN8mHqqeY6dkHuxbY6EdJC7hW6VUK+nxYpRoHpjYKpic3KGbJeHX1O1tMiFgIl8Y6QzQp11XVBqaGRQQFhmWWRhSkhNa0paU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdHOmFQNzIlnKKSmLGoqaWzqqW0p6S8t8GxusCytrW9tLansrGjsbOmoK+2qZuouq6jsLKhsrSxoaSenqepsam0qaWcnp6sl5mZl5eWmKKsnpuXqa2wqKOejqyip5admJyhpqKYoqGjoZuioqebnqCelZmbpqGcppSbm5+gmJCSlZCdiLJuaLVxq4hwjqZytHRztnubmKWNj5yNon6Pn6R+sHWDkdLRdVuufIV/pG6bqqZrhoV9rX2XmY97sXOTnY94s2WWdIWebp5mlFLJi1rCXJ95Yl+tX3ZzhmKXiF5Zyp1vv4B1TUu1U1XGZFRRamNlWEFPal9saVBVRkk5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqKdkaWvrKWpuqymtaWntru8sru/uLe1u7u0prW0orKyo6CssKWYp7qupLKxnbS4qqClnaGqpLKorKqkmp2bqZ+WlZiZkpOjqqGYk6ersKWhlpKsn6WSlKGcpKeglZunp6Kao5+umqGenpCWnKKenKWUnZWZop6VmZaSm4Wse3eodqOPi4epb62Kg6eEmpmiipKZi6J+kZeHroV/grNccrNSrn2CgqN+cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnmIhqXa93lZ+PeGw1eciusl9CVG9dZ2BFUGxfcG1WVU0uZWJoU1lQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6NzegnZOguLGYs8GsqLKnqrK6uLS5vrm4s7a+tqa4tKC1raCgqayglae2rKixsauttKSbqZ+gqKK1p6aqo5melaWilJScmpKWo6ablJCnra+loJSYqZ+ij5GimqmmoZWapqmdnaSerZ2hnKCNlJ+bnqCYmJyWl6GglJiRpp2GqX19pXmhj5CDqnCtjIGmhpagooqXloijgZCHlKp7gIudeW+xWqiDgoigeHTYf3aHdKeBjpuNkqR8lZCfhHuyXpxkoH2ClG2TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZU9KQ6FcWk10XWJmTVphX3J0X0pVNUqaklhIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxPZWRBJlVmWz8xVF9iTDdGSV9DMT03opyZmb+smLPCrqutqKa0sLixtr+5urOyuLyqu7WgsaWfpqenn5Sqsamwqratqq+hmKGgpqSkuqKjq6GXm5GjoJWVn5uVmKCgkI6LqbCvpp2Wmqemn42SpJiorKiVmKmonp+gpK2joZ6hjpWhmJ+gkpyXnJWdoZWWj6ubj65ucrR0qYx3iqZztHl0tIGTpaOTnIyJpIeOdbhui3uLomtrtlqhhmWXl2igoqdtlHK0dJOYf7JqhZKIrWp1tGGdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6YhnBcr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBwfGNTWVE+Pm1vMkJCQD9NOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eOTFBOKWanJ26opyxv66tq6unt6m4r7XBtb2ysLu4q8G2qquhnaekop2Sq6untqOzqK6qoZecqKClq7mdo62clpmQpaOWjp6hnJien5GTlau2r6aZk5usqZeMlKaapa2jkZersqSgnqirsJmhopCZopegm5abl6GTnKmdlJCqmYfTk5q7dLHEgMOGftWWm7h5iZGYjZeJjKeHeaK2dH13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+ifox0h6t9vm5zvHSyg3V4gIptmohxbY2kdL1dd31bYXm8alpWW2l6XmlhZGZibXlvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTtMWy02QDmnmZ+ivKKXscKvramqrLGoua+3xbG7s6+8sK7Bsq2mo5+koZ2ckaqlqrKktaetpKCWmquZp6y5naOtmZWhkKagk42co56YnpqQlpKvubCrlZejp6eUkJalnaStn5GgqKufnJ+ppLKeoqSOp6KUoZqbl5WkmI+woJKVqZ+FkJm2gJGRjbiVeIKTm7V3bmxuc295j4SOiXKewbu8mXqBsqhwgHSRuYN7hoaKho17ioaNl3yku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF5/eX2IZ4N5bXlii6xwdIV/WFunaURkWVRmX2NdY1FmZnFtdUJNT0xEO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlrPCs6uqqKyrqruvscavtbSvuKe1ua6rpKKnn6CdmZSspK6qpraoqJ+clqCjnaykvqehqpeVnJGim5KPoaihk56XkpiUsrW2rJieo6Sii5KSppylq52WqaWmnJqhqaemo6ihkqyel6Kel5aYnZ6PsKmTnKeij2t+aZyoeYhzfpuOdXplh3u+v8C6bpKCcZSFX3JqWl2aiWFkh46Va2B/lGNtm3ZilGuAmpWUZV5fYnGaiWhyjHyGlGZqfnF0eX59Ylt4dIFoUFxug3x7impYbHmBcklKb4VwTnNNRFZcZmFMW1dmY15PWm12anJST0RFTTxISTxMPjIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPltPJz8yPqifqKHBpJq0ubajrKaup6i1sqzIrLC0rbakvrGzp6Gkqp2jnJqarKeupKW1qqSbmJWim6atqb6oqKWVlJuWoJqTmKWpp5GekI+YnLCyvqybp52noomTkaqbqKScnKyfo5qbo6esoZ+qopqum5WmoJaUnZ+dl7GlmaKomZyRnpyjpZqno5qdmpqakJaCaG59cXaRl5OQg4m0qY2FmJWOioyYloeTlYmDk5OQiI2RlJmTmZeaoKGam5Sfm42CeqSFbGl7kH2AdYmLgnKCeHl2dYqAe4lqc4F0g3Vkd312a3B6bF9iW29nTFhZZWpfV1lwem9tZlNPRlI5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsbG3oKmms6elsLWqyautsqa1psCotKGepaacpZaWoKunraOkt6ygmZeWoJetqqbBn6uklpKcl56YlJSinp6jqJKQmainssOvmaucqp6Pl5apnqucnqGtmKGbnaKlr6WhpKieq5iXpp2ZmqGenpywoZ2ip5WYlJmUoaOWpJ+YoY6WlIuKjo+XrY97lZuCkYCJqaiFgJiWioSOn4h7g5CFhZqRhoWJlY6bl46QmJ6jlpmSkJyNfo1lobOuhImEd3uPin53eXpvZ3mQgYCJa3WBeYhyaXN/eXWDh4FqdGN4Zl9oZGNkZmpYa3txamtcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r76sq62xsqCqprKtoqyzsMawq62ks6+8pLScoKeioZ2Zl6imqaakprO1npSVnZmZsKauvqCropGRnpqZlJKWoZyXqZ2FnamsorTHs5+ppKqWlpiap56pnKClq5Sfn52gqq6opKOroaybn5+gmKSenJ+csKSZn6iTmJmdkqWamamfm5dmg5J8ZX6Pmo9jeIxsaGp6kKOra2SZl35nhYplZWloeo2hjmpnjJeRondraouYop6YcmtueoSMhnlYZV2Fgl5si4qCdltoc3d3kYCHgm54gnh/c215hHN3iIiOg3tphVhdanNkXXOIaWt8cW1jXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS42Wk82KUVZL0RPMVlCOz8uPaWfury5r6yysKulqK2usKeurbC9saqopa2wsJ+tmKCknqKamqesnKyjpqips66elqOQo7CmtrmlrqOPj5qhmZOSm6CYmaaWe6Wsoqizw7eloqevn56VnqOeo52kqqiSn6GeoKqvqamjqp6nm6aep6CslqGcpbGkmJyrlqGfm5OlmJ+rmZ5+voOIcrRyhZ6FrWh3ucS4cZKho3ummJhzqoJ8y8DAu3GKo4eCnnyWmIiewL2Clp2djJzBwHuBepGMmsK/fWulsm+MgW/Ken+bd5GDjoB2eYF/eXF7gIZweIWMk3lsdZFiZV54Y15lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWorjDtLCvv6mplKOvqbCvraayta+qpqelsaugq5iboqCcm6qnop2roqWopaW0pJ6jk6aurLi0p6+ikpGZnaWSkaChl5ugnYemqqSrrb+/saGprqmXkp+eopmjpKqjk6Chnp2srqerpqOhpZ+kpJytqJGkm6mtqpydq52topeYppeipJidf86UeXqlgXqWlptfrY9djqiAoKF8p5WadKuCgK9eZIypeqiHhZ90l5KIs2OCq4agjY2zaoSuc3yWh7hhgq1Zo81ukHV723t/mXF+iJJ1f2V7iHZ2bH2Hbn2FkJF9a4CNX3Bqb2ZgX3hkW3FoamNmYFJUU1deSk9DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrcG/v7S0sLeYnpGjqqmttKumsq2srKSsprCqoaebmqaYnKKvn6GfqKejpaGfsKybnpamrq2wq6isoJSSm5+lk5CfpJedp6OeraOrsKi/xrOoqbGulpKenKKXoaqqn5Whnp2crq6mqaibpaWjoaqSrLOWpaKqqp6kp6eisaKTm6eboZuVlJGXoHCFjJh1hKiHcbB8nXKsfaCfgaWPnnergn2tf5xyrX6rh4afdpiSe3yXfqqIoYuRi5x9q3qIko+ff3qtVpzEeo9vksF9gZVtdXCMbWZ3ZYZvYXducm6IipGPg2yPjmRtc3VvYGZtZF9vaGpuZmNXU1xgWlJSQzhJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txcays6Cdo46joqKtrravqbGnqKqorqurpqKjnZqjlZ+mq5+ipqCpqKOfnrCtmJuWqKevrKinqZ6XlZqjopKUoayanaajr6yjrLWpuc2yraaurJaVnJ2imZ+urJ2WoZmenqqxp6mpmqmno6Gqmq+xoqisr6aZpquqq7Kkk5ikppuVkoWkaqR1iXqpdXqycYKliZiMcIefmoekX2BSq4R/roKbda6Cp4aGn3qZl4V7ZoCjiaSYhoGjfal+gZSGrl57qFWdopKBeqOfgHzDr8WMc6+0s7lxYqmvwnRojIyXjoFsmJFubHh4d25rZmRkcXBme2ljXFZfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXVwKGZq6ihr6KfsLWwr6mto6inqqurqaSmn5uln52mp6aknayaoqyho5+vo56bk6qktrCuoKmbnJeVpqOQmqKnn6Cmm7Gmo6ixrLbIsrWprKqVkZydopmgpbSdmqGUnJ+nq6mirZmqp6GhqaGzraKqs7KinKqosLC3pZSXpKiZnZJ8qmyehId1q3l8sG6CpIuIn5aVnpWB0re0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlKeokJKajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI6PnJJ7b5WQfW55dHx6bVtlanJxZoFqXmFYY21cXllJTExLRURCQj1BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKurKWinbK5rKqhppuopqqsqaagpqSYq6OfrqudpqGsmp6ppZ2mtZ+il5Ooq7ayrJumnKCWkKWtkpqcpqKgqqatoaKnqbC0wrGyqq2olImYnaWboqSvppehlZmcpaWpma6crKalnaujtqygsbmwnpyvqLS0tKaWmKmkm6GPgp1OeJqBf596hKN8gqSEhqaenJ6UhLh7fHm5gn/MxsO2d5uhkIuffpqWl4l2n5eKpJikp36vhJuDnoSsfZmUYaVso3CPhZCBfZeEcqxgpHJxgJpgvH1SVXWOkaOWe3yRjodyeXKDfXBcbG53cmqAblpjX2huYmRdTExRU0FIR0ZJOTlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Gss7Smn6GVpa+urqmmnaWlmqOnoLKuoqmnsqCZqaSUo7Wjo5WXoqq1uaSco52jk5Chspmem6akoKKvrZyjqKK1scOxraqtqpGHkZynnaOknaWXnpiZmaWjp5itoayjpZeupbusobe3rp6etbO5srSomZ+xoqWfh4/RtcO3eYeOhZGTj4CmeJSid4ugkoWlgotxq4aFtG5yaZmjnJWJn3yXmYaHkHOugqWbooymipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJxcX+fYnOyuGh3j5OkmH2Ki5CIdnt4jYFsaHdpeHNufnRcZGRtbWVoYEpaV1g8SEY/VDNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krb+/vLu1npeopK22oaOZlaOpp66pq5mloZ6moaC1p6Kpp7CjlKujj6Sto52QmpqqtLSknaacqZKUl66goJ6mo5ynnLWZoKqjtavCr6mrqaKMhI+coqCmo5aampyYm5imo6WXqaasoaSbrKa9rJS+sK2fo7C0u6y1qJ2qs6WpmXuokX18sHeKgaSliJxtsm+gh617oY+DqJaZgKyJha6FoJSooaKXhZ+AmZWAe5J+q4CdmZaKqnedoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2la3GFmV1gW4ygbZSQpZiCk4uTiXh5gZZ+amx9Yn10bX95X2dlcG9nZ2hCWV9bPUpTMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKahKnGw7bBtJ+araCuuKWjjpqko6Cvrqmfo56drZieuaCiq6CvqpquoZGqqaWWiZqPrrCspqCom62YmY+toqGdpaGZpJytl5+opbaov66kqaOfi4COm5ufpp6SlJmalJqapKOjmKeqqqGinqmovaSXw6yro6Kss7usr6iitbGqrJl2r36QipyFh326rYmYZLCMZZWtfaGPg6eWm4GsioSwhaaZo6GikYWgW2xqgbNgf617eoKAsWxnbZmXi4ixWn20W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqeZiZWPk5R5d4ybfGNzfGGDeHN/fGBpZnBtZmVlT1VjXEFUXj1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9KftLG3vbu0wbOjnK2mpbapoIuZoJ+ds7GonqKfnbSYoLOoqquesK2erJuVrqiijoibjq+sqKejqJmuk5qPqZqhnqWemaOipZieoqmyqLyvpaienY58i5uWoaCZkJKam5GZl6ien5enrKWjpKKkqbqeoManpamhrLW3rq+oob2vrq6XgamSo66Om4CGpJeYkICAuMO6g46dk4SnmJ2CrIqCr4mnnJqlq5F+1b3CqmKkv719fqOCg9e6t7WFk5KCnr2+hGqjgW+rhG6df3qysceDa6uwvax4d6K+u3SAlY2lmo2ZjpSad3+PmXhhfHljjGd4gXtga2VqaWJQYltTaVxAVGBCTCk8OjUvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0sb+6sr2zop2upqWzpp2MmKW/qbawp6G/pqaxm56xnLmon62upaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp6nm5qgqKKYnaCsrKm4raejmpeTe4iZkqabk4+RmJiPmJSomZ6WqKeeqaahoqu6nqnFo6GwpKu0tauxq6K9qrCwnHR2qqS3hWWJn3BnrI+Kj25vd6SQmqCBdbCalnCQjXKWqKObmK6kcmxtbGWKeG5tgplxgHppcGlmiZWVl3FoaYWGZ3CGZF2KY2lvWV1nfnimYGJyj5JvZmSAjZOOoZaVlo6Um3qFjZN0ZIZ3Z4xqeH54ZGxjZWxiS2VXSmtZOlBkRFAnSjorIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6ubKzqqmirp6ks6qYkr2xw8e9tKmev6uso6Cmq5+6o6StrK2ljpatqpCMhZWXrZ+lqqKfpKOgkYulkqeZqZmWo6qglpylpqevuaqrmpuTknuElo6ml46RkZiUjZeVppOdlqeima+mnaKsuZ+wwqiktKassbKrr62puqWwuZeLoamltZyJlqKYhqmakJSdkqqzmZujrKG0l6OhnqGinKGkoZWsp4ySk4yHkpyclJCZk5iQjpWEf6Sal5WNi5KSio+GhH5ni4B0g3Z0h4xxp218lZKUk4GBj4+PjpySn5SVlJ6AhZKLcGeOdm6Jd3V8eWlrZGRvY1VgWEBpWkdiYE5YK0U9KyYhNjQwLx8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbeurqKwpK2foLaxkI6qxLvEubepoaWdm6WdsKijtqedqbWmp5GYrKOLiImPnKeWrKOhmqienpOVo5eomqmZlKaho4+ap5mhtLmnqpiakI18gZSMoZSKlZGVkI+Sl6SOnZinnpu1o52mq7eor8KvpLinsK+xrqqrtbuisb6ZkqakprWikp2mno2on4yRn6OssJqhpLKqsZmloZ2kq56enZyXrJ6SmqKblJCWqpmNmJiWkJaekYegnZWUhZKMj42Vi4F+Zo2HdYd2eYiEdJxqh5GVlZKJfYyWkpKXkaCRmpSegoaWhXhxlHJ4iX5xe35pbmRecGlgW19ZbWJQYGRPWTlHRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OXlaSno7CzrK6jqaetoKi1qpCPnKOyuq2qq6GimXqcorCkpbGplpu4pqOUmKmcjoaKiZuikK6epJaooKGSl5mbrouqlo+omaiMmKiOnri2o6WYm42JeYGUjJuTipWRk5CNkZahi5ycp52et6N/g6+1orCwdKS/pLKgeHuhrLS9lneupaCKgKl+ZFxidp+Oo52Dln5ulLSco6ivrKRln6CUdHqal3CAmamYbICjqIplnKWckJeYlouSm5CEnZqQlIOSh46OkomFd2uQiHaHcXyGgYBhaYmLlZOMW3aVkWdoj4xxeaKWlmR3l4aAdpdogomCbnl+anBlX3Vva2tnXGVjYWFvUlo9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHRklLTFRVVVldYGhnZ1hRSTxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraSnraSSlqq0rrGlmammqpdzi52vn6irp5OWuJ+gj5yknpB+iIiano2rmqSVp6KejpeRnoV0ro+IpZqokZajiJu5s6egmZmLiXV3k42Wk4qTkZCUjI+Tn42ZnqWYm7KWgIybtZ20jZKPvaehfqeie6SwuYKOj6efhIuFj7Gpr4yJlqKZeYCLrIacnaKoq6mIlYeZd6WbeoecgZengoF7nbJ6ioagl5mUmJaBkJaWhJmaY3mHkISNj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR7mYKdmoSYfZGIgYKYaYyMhGp4enBwZ2R4bWlsalxkaWllcltcSFRMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxbyvoJWlp7Sdj4Ocq5ymoqCNkL6emY2fmqGQfIWOmZiIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqTj4VwdZCJlJCKlI+Om4uOkZ2QlZ6jlJ2rh5+0ibSarovKiKuvibeFjbCDsrCFqY6nmI2dfKiPcnt3m46llmeUpHm0jJ+fp6mTmcKCf6uImKFxnoCapX2XhZWygKF9oJOfj5iXgI6Tm4mYkot8hZOGjZSTiYNtc5KGgHtyhoGEfYV1hoKYgY/FZoCph4+iap2BnpeAmYCKjIOImG+NkoRnd3R7dmdodXBnaGteYm5sZmxYZkZcUUwyRTQ2TWBjNyY0PERHRDo2MzY1ODs4Pj09PkJMP05JSktDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5samrppqUnqKkqqKVpKm1oq9/oKacpZ6diZS8mZONoJGdj3mDlpaRiKuZnJuaooWPjHebnI6gkYiepJuVmJeGorispZmbjY1/Ym2Pi5OQjY+MjJeLj5GejZKeoJigp36hp4etnaCWrpCgnp2RhoKgjayxiKSOq5qMmn6idYCYk2uBqnRMqniHjZ2Sm6mpgqqrfoShe3qnaZ5/kmxnl4aYtomefm5gY1iDl3+Me2Rni3OZfXmWa118l25fU3GFXGBseYNgWWWCfoSBmHGnqmuDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbXRxampuXmpvbGtoV2dOXVhFOUA0R0ReazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpbXV9XXl9idmBNRTpNT01UYlxbZmZpaWJiZGFkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJadoLmgqqOmrJGhtryrrqKZlp+gpaurn5yttKGnkaCfn6abmY2YtJmQi56MlYt1gZSRjYqmlpaYn55+k4WGrKOHnJGKmKmYmZqRh6WwpqKVmYiJgGluiIeLjo6Ji4yRi4+RoIuSnZ+boaV/k4GPo6GUoHeclpCng6KogIarr4aleot9hJp9onBykoeWe52MeW2Hm4uZkZypnI+HnXyConN2pmaefnekXph7fZNzom6Yt7S6c5KIgYC2qGSBxrh7cJW2jHGAm6RjdKyrYH1qnbN+bn2Hg4+Ci5dxgKNsc6RznoJ9o16cmbOWb3uXnrN0cluesoJpYm9zdXFoblhra3JyZFtnXWFLRD1ENVFBWnAyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWVhgYHtkSUM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGNfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi1ra2gmqGboqOkq5uasayqkpegmKCkmZqUnqubi4iReIuFcICWjYqPoZCTlJ2XfZGKjqigh5iPipKik5uajIqop6Sej5aHhH5re4d+fY+Ng4uPj4mOk56BlZufnKCfi4l3nJiijaByoouIqYicp5GXqayArox9eqCZeaOTeIBzl4iLnH2Vn4abjpmcp4ejZKF9iZaQm4xsnmiajW6amXuAiqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z2iYqAnWiadYeTkpiOf55tmZBqpplcqH53u2p9qVqOhF2zZ1tucXh3a2lbcGl3eGFeZFZhQVBFTzdWQlJtNEpaWV5OWkRAMTUxOzs3SD86Q0dVP1hSWF0+RGJdVmBRYWR8aUVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkbnFgZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCrnaWbmqefnayZnbCnqp2Wopmhn5mWlqCjmYaJjWmIgHF7l4iMlpaEkpSYj3qKhJajnImVj4aLnZGcm4iPqKKfmoyRioCAaYGGeX+WjHuIjY6HjpWZfpKhnqCik5hyaJ+KoI+McJKMgqmImaCkqaKpfbCtpKK4l3ajs6Kjf4iUeJx6qpl/oo+enJiJmHKhfYWNsLV9a5qRoXh+mLSjo6uohJh7mnycmn5zqlpdb3uXi3ieYkx/e3uFZHqYQk2fWaJqcnyOboGKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B8fW5mX2todXtiY19QXVZcVFZAWUVRZ0VSVlxhWF9JRD1COEBBOklFOExFWEFWUVpWREZhXFpgS2BtfXFFQzxVXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGtplJ2Bsa6ZhFNfoae0urOzqJqii5qpm5ynkqCro6Cnjp6dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlohygImSoJtykpCBiJmUn5qEjqibmZWLiop8hGyEhXGBoYx4hY2Ih5GXk3uRop+eo4iuhn21hI+enXumlnqpgpaekYuinn6naHdtfplzoHNxfJ2GmW+Sgq18o4Onn5uBpHBeqWh1o2NvpWGc0498epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKnvH93g21/v6aqtF6cb35yl2+Bc6JyXqRndKZgaKZsmtOYeoKbbnZ5l2ubeXaXcmyppWdfZHlwf4RrZ2ZjbXV3Zl9hUVplUFFhSFdJVF9XU1tkaltlUUVDS0xKS0JKRThQQFBNWFNYT1JRYGVlaVJkeHl3SUZFY11lWmhqU2loam9jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmvsrWwsqOcmISXpqCgo4ykp5+XqImZl5iTmZORoJeOiIV7cH2EaH2Pg5OagXeRjo+JcH+Hj5OSbJiUfImRkqOVg46pmpOSi4WJeYN2iIBugZ6Gd4CShYeYoJV5kqKjmaCJs6Gitot6rKekrqVwqYCbkYaBnZN9pICimYaYcZ6Eoq2uiZeLf4ykjZWDr6KVdrW2tcmidJSLgp5hnpepbXmVhqCbdaGHd6B9kJaKgW9MZqOScJqIc6V7eXRig4JsfqBscmRgnHJ/dJdre2q0tbTGpnOYfnqcapqaq3SBmmxzd5dpmXl0l3FQRH2zXml1aniHZmtnYnN0cG1VXFJYZ09SaElVTFhSVVxna25VZ1dNSkFKTUpISk5BUUpQZGNpbWV0cnN+eHtudYl6e1RRT21eaFtraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinIivp4VmP5Shs6yvr7Wioo9/lqeioaOLpKacm6WBmpeWjZeQj5uTjoiDeWp5hmWDjH6Wn3l1j4iMgmmEhZKDjIWdjXqMipWlkoKXqJeMkYuAiXqAfYt5cI+ghnmBlIaIlZ6UfpOlp5yWloRnbnicbKJkfHGleJyYcGingpiNfKR6oJaDlnKfdoCJlJWPuW2PiqJifZmiloluc2qra3WgbW+mYJtpi5BploealXWigH2aX4uFjHVviGJooWWef2mbdXBkZ4iCbnKiWl9bY6FuXYmMcHt/dHJkpW54omRmp2iXcouYbqFvUoiPbqBeZKdUi11UmG1tcmpxgW1waGt4c2tvUVZVVWVZU21JWE9cSFhoaHNqWWtWUFJFVlxMWFJhVWhqXnd1enxwfHxygnt/c3aNgIN2XlFzYWZicWdQa2hoa2xvaGRnX11dXWBqYmlpdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqrCxpp+Lf5aqnJ2ki6GhmaGhgJWYk42aj4uXkI6Le4ZxgIhoi4p8l5pzdIl9kHxlgoeViomWmYJ8iIWWppCBoauQhZCKgYp9gICOc2mPpYR9hZOMh5efjYaRqaadiaZ4lpx+pYmWjLKZnpGDr5efpXmXiXqpdKaPhJpupaKMkoSMg7xtfKWvgoeGh5SXnaF9pntyqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm9voJ6RlGF/q4uqd4F/jqefd599haSVnaBpmod1rGaerYy2c3a+jKOTWYOmjatgdXFzb3t1cGJqfm5nbFNVWVVgYFxqTFxRXEldbG12YFtxWFtfWmdzZW5vcWNxdGB3en55cnmDcoN+gXt7jIGCgHZieWRjbnNkUmxnZ29scmlmaWFfXlxhamJsbHpvXFxiaWFtaXdtZ2xuYpWmqpyBgJ6klqqqnqinrqOYiIGWqpmdo4mapJyonYSLmo+FnJGFko2MjHSFeoiDb42EfZeTc3WGcpGDbn+LkoaGlI99e4KFl6WNf6WljYCNiYSUdYKHkm9si6iAgouTjYibnoiLkqqioJCAdJSXiH6BeZSvpH+BnHGPhnmSjIWAe3KnjHF9fXqXlpuEjXh7fX2IlJWTi3eRmaChhHt+iWuMhVt5eXN5cGlufpKKcn90gY+Uk3GFg4JljX9fgYCMd3Z0lHVve29viW6Ehl53aXiOZoKDho+qnH90fZdqiYhvf3V8hHVtbGaMc3d7l3eEWmpXeY9obXdycW93eG9dbIZtaWdWWV5XXGRrZFVhVF5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV5gXV/gH+AeYuFgn17bX9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbmpp4uhopumpJmknauin4ODlqqRnaCImaaaqJiCgZuLfpaUh46KiYxygnyPfX6PhHqXjnRyhHCVhnt9kouGhpCFeH6AhpijjHunoIuFj4+ElYKGjph3cYSqhY2RnI+Hnp2Gipqon6Cqg4mOlZt/foqXraiQk6eQeHGek4N7k3B/qYZwfZVxam98gZ+Lf5GOi2huXYSMjJycoI9zloyIcXRrgnZ0gFlyboaRgn5+i2ldaWN6hYOIgF9peHucfIONg3aBh4NpeYyIa2JxcoN3X3KNgoqQqJaHZ42Pg253i4Jvg4t3bmRmY3mCepVaW2lmbXZbenh3dG1zcoJmXG2Ka2tiWVhdWVhrcVteYFleXWVyfXpzb3Rjamppe3xyend0ZG10aGx7fnV6fHt5eX+Afm+FiYR7fXN+eXJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyqsaGQo6Gan56YnpmooqF9gparjJ6Uh5qhkKSUf3uYhHySmYiIhoaKcn2Ai3aFi4GElopyb4BymIeDfpKDhIaKgXqAg4uan4+CpqCGeI2XiJWLi5yXhIN6rIGQl5mTiZ2choehqp+hoqOLiJObnaOZlqqiqKehk5yJmJB8eY+Phah+fpKRkpOcsaWalJ2PjbGSmISmjIyWnKCKkZyDiZKKa3yOdndlgoaQin2JnYSHi4+HiICFhJB3fHt1m6OJiIufi4aVf36NgoF2cXSGhX94iYiLkaeRhIeOiIOMkIt7hYmHjX91aoGDe3mZaXFoYHOKcH16d3ZvdnOBXF5vh2duX15ZWlxSZ3FVY1tbYWxodHt8cm5wY2ppaH97bXh+cGhvcGxmgHtygYB3f31/hHttg4yGfHp4fH56g3hOZHZqc25xe2VrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqKhmJWZmJSYpKCden+YqY2ejIWfnIqdlnx4lIJ7jpmJhoOEh214gYBygId+iJOEbWt+epeHhIOQfoCGhIZ9h4ONm52RhqmegnKKj4WSkYuckX2NeqmDjZGXlY6cloWFm6afopqdhoOSmpmZkJmmoKaenpCXgpOLeH2Ij4WmfHyPkJGFmKmgnJOcjo2pjZGAno2JlJugg4+Xf4eOg3B4hnF0YX6Ej4Z1jJiAg4+ChoR+hYSVbnl2dZOjjI2Gm4WFjnWBjH59cnN8iYR7eY2PhZOokIeEj4KDiYmIdYSGhol6bWp9f3ptaGtsZl55fmd8e3Z0dXV6d1xgcH1tdGBjWlteUWZtU2VaXWFqaHV6fnBsbGNqameAf2tyf2tqc254boN5boaAdoKAfYV2coKNh357enx/e4KLYGl7a3VoaYNlamNgaVtjdWhvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5KRlpeLmp+enXp3nKWQm4mGpJSKmJl4eY2FfImRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hoSHfI+Aj5ubkIemnH9vi4qMkoagoYqFjHynkIePkpaTlpJ2jKOgoZ2Wmn+BkJqZk42aoqKkm5iRnH+PhnqBhY+IoYB+jI2PfJekoKCSmY+QpoyPgZuSiZSYnH6Tk36HjoF2dIJwdmB9gI6HcoqWfIiMcYx+goWFj2l4cnmNmZOQgJh/iYxzg4l9fXF6fIyFe3uSjoSXppSMhpF8hIWGhHSAgYWFeGRxen54eXBramZefXNnfHV2c3xzf2peYHR2cHdkY1hdXlJqaFRlWF5gZ2l2eIFxZmtjbGdlf4BqbX1nbXBqfXeFemuLgXKBgX2BdHaCjIZ/fHqAgX1/j2pyg250aWKIaWxiX3FVdG9tbmB4aGxXanR2Y3R6enFia295iY2fs5KlpZyOkJiPhpygmpt7daOfjZd/jKGKiJqVeHuGh36DiX6IgoF/cH56dHWChX6JkHdnY32Gl4uCio14fYCNg3mWgJWXlY2Vn5p9b4uBkJOGpZuHjImDppWEkoqVl5KRdpCdoaGYlJh6f46Yl4+Xmp2knpmTlJx7kYeEeIaXjp5+goqOjHOXop2gkpiNj6GMi4OXmIOTlpp/mI18iY2Bd3J+bntkgHyLhnCGk4CQgmuHg4GAiYVmdm99iJOZjX6UeYyJfYGJfXxygHmLhnqFkouMmaOXg4SMd4eDgoF1en+Gg3Ned3d8c313ZmtjYH5panZzc3V9cXxjY2FzbnVybWFZX11aa2RSYldfYGhrdHmGcGJqY2xmaHyCa2h0aGxvaH98gXlsj4VxgIKCf3R8g4yBgH56goN+fJBtdYl0dG1limxqYmN1VoNpcG5geGdsYWp2cGV4e3lwX3FshYWQna6YpqiejY2Xh4WfkpaXfHaom4mYeZaci4yYj3h7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5WIfoWHdH1+in9+l4SWk5aMo6CXfnGHe5ORiqaPjI6KkqCRg5GPk5eQioCOl6CakpCSdICNkpSJnZ2ep5mYjpWYdY+Qi22GmZCae4eIkIlvl52ZoZOVioyejIaBk5x/k5OWh5qJfIqKgXpyemt1bHx/i35uhZKDlHhvgoR+fouAZXNqfYGXmIWAjnSRiYR5iH52eIF+h4F9hI6GjZWlkXmFgnSIhnx/cXN+hYFsX3l0eHB7bmFuYmR7YW1vdnJ3d3NzYXZgb2x1bm9dW15dXWpdT1xXYmFobXN6iWtfaWVqY2h3h21mbGhpbGeAfHp3bpCIc4CDhH10gYaKeoN9eoGEfXyOcnmLeXhubIdraF9pcmOHaHFvZXZnbWxhemhqfHt3cGF3bYuBmZqqoKSonYqKkYaKnYqUl3x2rJeMlnyek5GWlIh2fXuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+Rhn+EhHN6gIZ6j5GGkZGbkqSak4F8gXyNipKjiI2KjZeajYWRmJOVjoiIi5Kdk5CMjW6EkI+RiZ6ZoqGXl4mXknCLm4Vnh5qPlHuJhZCKcJaak6CRkYiKmYyCf5KffZKPk4yaj3uKhYd0c3ZrcW52fIt0boaRjpJxdIB8gYKIfGVxbXp+m5R+hYp1kYuCdYl6b4F/gYh9hY2Kho6Wqo57iH1+ioV3fW9tfoOBYmd3c3RuemFdb2BqdF5wanp5eGxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4dlXWloZ2JncY1uZGlnZWlngHp3dW6OhXOBgYN8dYKIhXiFfHeDhXqAind/i3t7cnmDamtfcGhzf2txbm1xZ29rZXtibn95d3BrdneJf6OYoqihppuIjIqBj5yGkpt0gKmUkY2GoIyVk5B/c3t2hXd4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYB/f6CGj4qRnJegk5Z3iX6AjIicnYmPhpKXloWIlJiPlouLjI2MnYqOkIRuiYuPkYqclqGcmJaGmIlshqWFZ4eei5J/jISMgXeTmJGdkJCIiZSNfn6QmXyRjZCOmpJ9i4CDb3ZwbG1vcHuGaXODjpiKcHeAdYKJg3lnc292gpuPfYqFe5WSe3eKdXGLfIaNe4uHhYqPnKWJfIR2gYp/d3dsaX6Af1xxcnFvb3dZXW9gb2peb2p8enBtbWptd2Bwb2txbVlYYGFhbVdQU1llZmJ1b4SCYV1rbWRiZmuSbWBmZl9na4F0cXJvi4B0f4KAeXaAi4B5hn93h4Z2g4V7h4yAe3aKf2pxYnxihXxvcGx0amhubHZ3X3F+eHt0dXN/gn6llZqtn6eWhYyDfpaUgo6edIqfk5KFipqMlY2LenJ3dIJwcoVzcXWIbG5sdW2Id4N9f21uVVGBq5SHgniAdnKCeYKggpGBkpGXm5GYd5F6goySpJqTjoiUmJKDhpaYi5OLiI6PiJ6EkIp9c4uFiI+InJmfm5aVgJSAaYeeiWiHoYiThZGEinGDkZePmo2PjIuPjXd7k5F7jouNkpaNfIh8gWt3am5rbG16f2J5fo6WgXZ6gXeDjX16aHVtdYiXjICJh3uUkXJ7hnF4jnuLjXuJfoSOkZ+fhn19eIGKfHZvaGp/gHded29ta3ByVV1uYXFhX2xueXBncGZmc3VocWxhd2VdVmVgYHFTUE5bZWRceHCIe15caHFiYmVlkWlfZ2RbZ29+b2txc4p9dnyFgHV2f4x5e4aAeIiDc4aFfoyMhHx5lXhmcWqDX4d+b29remBpbXR/dF9zfHiGd3NzhXx5oZCasZyljoKKf4KZiH+KnH6KmJKOhIiXjo6OhHZ0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYmcf46BeHqMf4iMipybnJuWlHqOd2mKk4ltiaWGk4mYg4ZjjJGYjZSJlYuMiYtwepWJfI6Ji5ORinqFfH9tfGVzb2tsenlcgHmPjoB7fX5/ho57eml1a3SMkIqDhoZ9lo1sf4BwgY2Ajol+hHuDkZabm4x9d3iCj3hya2VufYFqaXRuZ2hzbFNeb2RwWl9scndma2tiZ3hzb3FjX3dgYVVrX151T01LYGVjXHlxinRcW2V1YGFlZI5jYGZiWGlyc21rcXaLfHR5hoJ2d36Lc3+GfnqJf3KJh4GRioh9fpl2ZXNufGWHf25wa4Baa254eXJgdnp7jXZydop2eZ+Mm6+boJCChXiIlH57iJyGhJ6QjoWMl4STjoeBdHdweXBuhG9tbn5yY2R4cHxuenxqaGxjpJrB3K7vonNrdYN1hKGEkW6Vj5Sfk5qBkXCFi6OXiY6VipCdlYOAlI+EiI+AkoqKl36He3V/iXiGhY6bmpeZj5B2i3dwiIqMfoylhZKKnYWGXouUl4mOiI2KioSJbHyXgn2IhoqRj4Z2hX5+a31jeHRqb3hzWIh6kYeFen9/gIWMfnpmdGqBi4+LhISAjJiGbIJ3b4mSg5GFf4J7gZGXlJuRdXR4hox1cnBlc3eAYHNtb2FodWZSYHBna1VfbnR5YXJjYGl9cXJuW2NyYWNWblpcd0xMTGNlYV12c4ptW1xkeF5gZGWEX2NjXllpcmtua3J3i31zd4SBeHh8iXGDhHx9iHt0i4iIlYaMf3+Yc2h1cXlsi3tudHCAV3B5dnlxZHZ4hoxodoCJcYCdiJmnnKOShHxwjJR3eImcg4SfjY58lYx/mYeEe3J3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IlzbHOAdoqaiIxpl4+OnJORgYhwhYigjoSKlYqMl5N8jZKIgoiPepGLho+CgHd4g4Ryh4KTm5aUmIaNdod/cYaDioiapISVjZ+EiWGDlY+FiIWIjIaAh2h9lH99goWJjo+CcYZ/f3J3Z3ZyaXR3bFqMfZKChX2Ag4CEioJ2YnVtioKRjIN/gJOSfm6DbXqIkYiThX2CfoGTlJGYim9yeoyFdGtvaXB2fl1zaG5caXVfUmRxaGZTX3B2dGBvYFxognFyaldnaWNpWG1XW3RMSkxlZl5hcnOFaVtcZXleXmRnemBkX11Za25lbmp0d4p+c3KBfnt2eoh0hYN8f4d2doqFj5iBjYJ7k3Zsd3Z5eJJ1bnd6fVh5hXF/bmZ4dpGCZHaGhXGKloaZoZuiioZzb5KLcnaNmnyJmYiJe59/g5l/gXhxdG5vZHJ+aGZsd3dbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJuQioV7aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N7cYaAlZmOkpSCiXWEiHiFgYyVnqCHlpCgf4hhf5OHg4eDiIx/f4JmfZGAfn+CjI+Qf22DfIJ0a213dXR3dmtjjYGOf4R/fIR/hYh/cGB0coZ9kI6DfYCSinpxhGd7hYyIjYR8hX+BlZCSlIVvcHmLf3RsbWlqd3phZ2ppWGt1WlJpcmliUGJyeGxiZV5aaoNuc2JcZ19lbV9uVFpvTkdOZmRcZm5ygGtaW2NzX1xja3ZkZV1dWmxsYm1qc3aGgHFvf3x9dHiGeIWDfICIdniJgZKVe4mGdomBb3h5e4OSb217gHZeg39zgW1oenOUc2dzh3xykpGEmp+boIaGdXWUfm11kpZ9h5CDio2ZfIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lY2hoV52PX3Jzl7zEhHZxlIiPfXGWi4abkouHcmqIj5aAe5SMgYSajHyKhXx7iYt/lIh1iYZ2d32BcnWGgZ6UhZSPg4NygIp2hn2Lmp6ah5WPnYGJZn2Tgn6EgoiJcYF9Zn6MfHl/f4eLj31pgH2DdmZveXhzd3Nsa46FioGKgHiCgYWEgWtfc3l7fo6LhnyCkIF+c4JpeoSJjIaFeYR9gpmNkY1+bm17iH12dG5mZXt0YltwYlducVNTbXJoYU5mdHhmYF5cWW+Ab3NZZWJdam5gcE9Za1FEU2dgWmpubXxuWVtdbWNaYnB2ZGdcXWBraWNsanN2gYNwbX98f3R1g3qDgnyBhXZ+iIGWkHiEi3SBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0a5ONhZ+YoJmEiG59jHZpd5eOfoCJgpSXiXmPlW96c3BsaWRgc3poX2Vxelpgcnx5Z3F6YWVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJCLhW5rhZKRenmShoGEmIp8hn94d4mKhJaAb4uIcXV+emp5hYOlkISTjYN/b3+Ed4V6h52alYyUkZWFiHB7koJ8goKIg26Ad2iAhHhyf4CDiod8ZX1+hHZjcHOAaXhwb3WZjYaDinx2eICFeoNrXHJ/c4KJh4p+h4p7iXKCbnKFiI+GhnOEeoKajY6FeW5vfoR/dnpkZmh7b15YdlpXcGxOV3FzZmBLbHd0YV1bWll0fXNvV2ddZmpyYG9OV2hSP1hmXlpwa2h6cVtaWGtlWmNweV9oXF5lbGhla2lxd3+Ib2x/foB1b4J6f4J/gn92gYSIl4lxgo1xe4Z8enmDk4x1anl+a29+dH99b3J7epNwb4F+eGeSi4OhmZyRgoVmhoNvZ3mViH1+hIGYiYF8jYxoeHJrbGZfYG95bV9ib3hcZGuCemFxdl9lZdTqvYsyOj6Ljn9xeIWHjY11gpWMfpGMi39tbIWMjHV8j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3RmeYKDp4uCjouEfm6AdniFe4ieko2Rk5OOi4d/e5KGd36DjIJrf3JogH54bXx8goqDd2F5hIFxZHFofm51cXWCm4uAf4WAc3V+gXOBb1xuf3V5i4SLe4eBfYh5e3JtiYSRhYxzgnqAl4yMgHVta3aAgHV0W2dndW5XVntSWXBkS1pycmVbSXB4b1xbW1lddH50aFliW2dmb2RqTVdmUT5dZVxddWVgdXBaWVRuZFlkcXlaaF1fZm1naWtpcHd9jm1pgoR+eW6AfHyBf4J6dYGBjZOEcICLbnd9gHt7h5KJf2h6fWpze3KFenN3fn6MeniEfXxrjI2Em52WjIGAbI19a2h+jYt6fn6Dk4J+fYqIa3VxZ2hiW2Jnc29fYWtzYGhwiHpic3ReY2SboI9uXDVar7V0aYCIfJKGdYWVhXOOiol2cGyFg4d1eYl4iXyTh3l+cmd1iX5+mG9xhn5odnluZnmHhKSHgIaMiX5uf3eBgn6Om4iDlZKZiouFiXyPiHB6fYR7aH5saoB7emp6d4KHgHJgd4F+cWRyZ3aCbXV7hpWRgXyCgW93enx1f21ZcIB3dY2Dh3iIdoOJe3l0b4uBkYKGc39+f5SJintvbmptgYF0bVxmZHJwUFp6TVtvXE9bcm9kVUtzeGlXWVlaYXCAdGBdXWBnZGlpZk5ZaE1AYGNbYHVhXXVsWFdTdGFaZG9yV2peYmhrZ21saHB3fJNsaISKfHxwf357gX+CeneAf4qLg3F7iG9xd4N/e4mMj4NqfXttd3h2ind8eICBh3+Dfn56bYSMiJijjYSDenWLeGtsg4eQeH16gZF/f36Kg3BycGNmXllmX29vX2BncGZqb4l0YXRvW2FkanZ7gL+cpqTIuHGFg3KSfHeGkoJzkIuHcXJvg3uDdHSHdIh3lIh5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgX9/jo99c4B1hnqBk5GEepePlpCIgol7iIhreHl+dGd6aGt/eXNpenaAg31oYHeHfWpqdGh7gGl2gYyRlH56fn5wfHZ8dH9iVnh+c3OLhYJ9hHGHiXh5cXGEg46Af3p+fXaPhoR3anFpbIeBcW9cZmFxbUlkdUtdbVVTWXJuYlFPdHhhUlhYXWFwgnNbYV1oZWVka2RQW3BJQ2NgW2NwXl13aFVWVXZdW2VuaFZrXmFpZ2Vubmhwd3qTbWmIjHl9cnt+eYKBgXx1fIOIhoNwd4RybXeCgn6Ji5N/cIB7d3l6gYt0g3h+gYGChHqAdW9+ioubnoh9hXp3hXtndIWMj3l+f3uIhYN2j39nb25fZFxYZVltcmFgYHBsa2iJbmF0aVleZG6Ad6naqseGh7JxiXdvjHR6hY1/epKJf3RzdH53gHBxf22EdJSFeHVrYHqCeYmPZnGEcGd2blttfICQk3+AeZGTfnl8bol3gpKNhXWXi5KPh4WFe3+EbHR2fm1ndmRte3VtaXd2f398YWJ4hnpodXVifXtndYaOjZV7dIB2cYB7fW2AWld1f3B2hYh/gHptiYZ0emx2gYSFf3x+eXx0i4J+dGh0ZW6Kg2xzWWhec2RHbW1LWmFXVlV3bWJQUnR2WFBWWF5hcYRvXGBjbWRkXm9jVF1yRkJlX11mZ11be2JRVVx1W1tna2FWal9gbmVma3FocHZ4jnRrjo11fnZ4fnaBg4F7c32DiIeDb3KAdHF1foWBiY2Ke3d/d4N7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN4Xn2FmIt4hoN0hYaEd4l6Ym5sW2JbW2FWaXNjYFtnbm9mh3FhcWZXXWNsf3zKzoe5oWptbYpscYNxe4OJfnqQhHl4c3l1dXtqbHZjhHWSgnZvZl59gnqLimVygmtqcWNYbXqFm4iCgXOXlHh/fW+JcoSLjYlzmI+RiYaLg3t5fXBwb3xmaHFibXhxamtxeH18el1leYB4aXZ4ZoJ3Z3SHjI6UfXKHam9+gXlvfV5Zc39udYGLfIJvcIqAcXdpeICCgIJ3fnN7dYd9e3Nnc2Fui4FrcVdpXXZbR21qTFZUXlNVe2thT1R1clBRVFdeYnSFaV1gbGpmY1pvYVhjcEdAZ1xgZV5cVnteTlZlcFlbamhdV2hgXnJma2dxZ3Bzd4Z4bpWKdH96eH55goeAdXF/hoWOg3Bwe3h2dXqGhYeMhXp8f3SLfn2GhISHf35+fYd/fHh2eHiRk59/jH2LbXV/eGSChpWFc5GKb4WFgXqDdGNuallfW1xdVGdyZGBYZHFyZoFzYmtlV1tgan93vq57oLZuYnOGaHN7cXiBhHp9i353d3J2b3t2ZWpvYId1joBzamJef3h5i4RmcX9oa2taVm93iaOBhH9xmZNygXl2hG+Cg5OJdJaKjoiFiYV9eHRxbmh4X2psX212amdqa3l3enZaZ318eGVzfm6EdGV1hY2Gln9wjGdreoR1bnViXXF9bHV9jHuCZnaHfW5xaXZ/eX+Ac35te3yCe3hxZmxibYl9bG1VaV92VUppak5RTmhNWHtoYU5VdmtMUVRVX2Z1g2ZeYHFoZ2JXaV1ca2hKRGpZYWRWWVV5WU1WbWpZXWtkXFllY150ZmxkcWdycHWBeHCZhXZ/fnd/fIWHfXVygoiAlYNuc3l7enNyhYeJiIN5gX11j358hIqOhIKDen6Lg3t2e3d3mp2XeomChml2fXtsg4SSf3GOgXCFgn6Bf3BmbGdYXVtcW1NkcGReV2JydWl1cGVlYldcXGiAcG9ygHOJZGR4fml0dXNygYN3gIN4dnN1bmt6cWJna2eGdI2DbmZdX31we4l/aW15Z2pkVVdyb42mfIR7dpaRdH1zfXtvfXySh3iafYiHg4aDfXVvcWxndFxsZ15sdGRnZWl6b3tyWWeBd3VocIF4gnZid4WLfJSBb4xqbXuCcWdzZmFuemdzeIt8fmJ3g3dqbHJ2e3F7enR+Z39/gHl3b2RmYm2Fe2xqVWhib1JKaGpPS05vR117ZmFNVXRjSk5TV2Fqdn5lXWdzaWZgVmNXYnBdTEtqWGNhVVRVc1ZMWHVkWV5rYFxaY2VfdmdtYnBpc29yfnV0mYJ3f4B3f3+GhXp8dIKEfpeFbnJ0fHp0cYSFj4GAeot1dJB/fIGVjoCFhHx9jIZ7foB2e6OlinmIhYRrdXx6dYOAi3puhHN5hHyBg3VuamhlVl1bWlpTYm1kW1hhc3tpaG1pYGJXX1tqgGprb4Bna2BoeXhqc3RzbYOAen98dXRtemhqeWpfZW5ogXaQhGhlWGJ3an6He29qcGdmXVRYb2eOqHeBenyQjnp2cX9wdHd6kIF5lnWGg4CFiHZqcXVnZ25bbGNdbXJfZ2FqeGh7bVtugnJ0am+Bfnp3YXeFhHiPhXOIcm95gHJjcWlccXhkcnSJfHljdIBxaGp6dXJteXh2eWSEfH95d3FkZGNufHxqalRoYWVTSmtnT0dRa0VgeGZhTVNyXUpNVFpla3Z6ZV5tcWlkXVZgVm5uV0tTaFdlXlhNVWxUSlx5X1tea11dW2NlYHlobGBvb3VucHd1eph9dn+BeYCAh4Z6eHmCfoGThHF0dH95dnSEiJF9gHyQa3OVgHuCn4V+h32AfoaCgIp7doSrn396iIeDa3KBeXWAfoB0boZufH9zioBqb21kZFhfWllaVGFqZ1taXnSCaV5tbFxhV1xcbIFlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWVzZ3p3k4FjY1RlcGeChXd3Z2lqYFdWWWdjj6dufneAi457cXJ+aHpwe459eJByhH5/f4ZuZHVyZGdnXGphXG9vXGdfbXVkemhddIBvcmtyfH51dmJ0hYt7iIeBgHhydX91YXBtW3J0Y3FzhXx1ZXOAbWFte3Brant5dnNmhnZ7e3ZxZWJlbXJ9aWtTZ11cVEtxYlBGVmFHYnZmYUtUb1dKTFhYZ2t1emRlbnFmZFpXXVh2ZVRKXGJXZ1dZSFdlUEhieFpdX2xbXlxhY15+aWpfbnR4bXBudoOXeXKBgHx/iYyGfnV1hnmHjHx0dXWCeXp6goyOfX6EiWlzloF6ip19foV6gXp/fIaIc3GPrYx7e4ePfWRxh3lzfHp1cm6FbHt+bI96YnBvYmVdZVZZWVdjZmtfXVxyhWhYcG5bXlhaXGx7Y3B3dWxiWWxzc2d0dW9sg3h+f3h2bW50ZGl0ZVtndWZ2dpJ5X11SZmZqg4J0fmJkaVxUV11iY4+kaHh0g4aReW1we2l5bnyGfHaKc4F5fHh/aGR2bGBmX15pXlxza1llXW9vYnplW3d8a25ub3h5c3Vkc4OSfoeDiXt3b3J+c2J4ZFxwcGJxcoJ9dGdygGVebndpZWh6fHVub4J1dH10cmJfZm5ufGRoU2dYV1NMdl9QSllYSGJ0Y2FJVG1TSk1aV2lscXtibWxzY2JaWlthd1xTTGNdWGlTV0dZYE1GaXVYXmBsW1tfYmJchGlnYW54eWxvanaBkHhtg35/gZOIhIF2c4h0jIZ0cnZ1gnd8fX6MkIB+k35wd5WDfJmSeYCAeHp+gHSIg3RwmKB6e3+JlHhjdYd4c3d0a3Nufmt4fHCRcl5wb2BnYmxUWlpXaGNtZlxbcYllU3JuW1pYWGBsdmNpdWppXlltc3Bsc3NzaYR8fn57dm5ubGRpcWNba3JkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEkXRsbHtucHF7fX1zgXeAc3p6emRldWhdYllgZ1pedmhXYl1vaGF3YFt7dmlqcm54c3J1aHGClYOHfoR2c2pxfW5md1hdbG5jcnOBenRnb35bYHByYmBrcn5tbXV/c3F4a3BhXGVsbHlgZlJlVFZRT3RaUU9YUUhjc2JgRlVqUElQWlVra2t8Zm5vcWJbWlhZbHFXUlBmV1ZoU1RGWlxOSHF0WF9jbWNYYGBhXYtqY2RteXhrcGl1eYZ7a4N9f4SafIKEeXyHbo+Hcm92en10gYJ8i4+Cgpd0eIGThYGfiXWBgIF0f4Jxh4J1b6GWc3uGi4Z6ZXeKbm16bmZ3cHprc3ZyjGtedG5hZ2VrUl1bVWdhbGtaXHCMZE9vbl1WWFVnaXRoYnRlZFxYbXRtb3V0eGqGfH97h3aPc2Nka25hXG5tY3N4h2taVFZjZHh9fXGGXWNfY1NaX1lilZVjbnCDhYp0a2h8cGZ0eHV9bXp1dnB6f3ZfZXJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXNxdHB1dmtthJOBiXuFcXNncH5xc29UXGdrZnF0gXdzY212VmJybFtfcGd+Zm13fnNzc2ttYFpkaml2XmZTY1RVUFNsVlBWU09HZHJfYUVYaU5IV1RWbWhkfGlreGtiV11VW3RkU1JXaFFYZVRTSFpaUE13dlpfZWxpWWJgXl6ObmFma3l1bm9pdnZ/f2yDf32Hl3uAh4GJfmuTiHJndIB7dX+CfYiOf4uTcnyKkYWHn4Z7f4aMc4GGc32Cdm6ki3KBjYt2d2x6jGBke3BmeHJ4bG1xdoJnZHtsY2ZnaFNfXlVnX2xuW15tjWhOaW1gVFZTbmd0a2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eGthZWxtXmBvamVweX5nWlZYYGx4fHtwhF9iXmdWWF9XY5uIYmtwgYd9eGxreW5cd3Nte2p2dG9wfIBzWGltXlhcVWFiV2RwY1NeYWhhYmxaYH5rZmtzdm9td3dsaYWMf4l7iG1yZ3F9bnNuZFphaWlvdIJ0c15pbVNlcWVVY29je2Ryd3x3a3Bta2BZYWZndFxkVWBVUk5XZFJOW09PR2RvXWJGWWlNSV9LWG1kYHhpbn5kYFVfVF11XFRTYGZOXWFVU0pcWVBZdHVdX2VsaFhjYVtejXFjZ2p4cXNuaHZ0eoNygoJ6iI5+fImHjXlukIp1bHOCdH9/h4WGkoSVj3l9jI+HkZuEgHyMhXOAgXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjI2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2NqwnaCgoKCjgGNnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn6bago6SkpKd8XF9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaSlJSUlJSUkI+Pj4+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSkpOPjoyOjoePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuKi4uLjIyMjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeJi4aMhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhIqLho6FjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmCh42GjImJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjoiGh4aIhomPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2QjoyKi4yJjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/QD48PkA/PT09Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjo+PD89PDo+PT9CQkVAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PkE/QURFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdISElHR0NERUNEQ0FVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS0xKS0lIRkVHTkdPbISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTkxLTUxISU9wcICGhYSEhYaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXp7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lJS0xPUVRPWGxzeoGFhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSEtUcGV8g4SDgoKDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODk7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRGRF18f4KCgoKCgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojs6Ojw4OTg5Nzc3Nzk6Ojg4Nzg1ODg7QT0+PkJBP0FLTE9RUFFPT09RV2tycnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEQ/ZoOCg4OEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDo7PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj0/QER3g4OEhIaGh4mIh4aGhoiJiImLjIuJioqMbDw7PkFDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PDw6Ozs8Oz0+QUA+YoWDhIOFhIaJiYiHhoaGh4iJiouLioqKi4qLXj5ERklLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURGRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pj4/Oz89QD9DP0t+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqIV0dMTE1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUtJS0lLS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc8Pjs8Oj0/PkA8Pz9DQkVAaISChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtHRUdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw7Ozw5PT89Pj5AQURDSVR+g4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSUhGSkpFSkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h4enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozg8PTo9Pzw9PkBCREVNbYSDhISEhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4teUlJQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OT89PT9BRUU+Q0VDR0x1hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTlNUT01TTFBTVVdSU1JQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj5BQUVVTEJJSkdLTXmGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hJSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQkNGRURES1dRS1BQT1BReYaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU290dnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUpPU1JRVVZWVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTUtKSUlGQkRAQTpQUVFXWFBQT1FTU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TT09NS0pFQz9AO1BQWlpaUlNRT1JSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVlJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSU1RaXW1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUFNbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUENEQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdISkdEQkFDQE5QTVJkdHV2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QD8/Pj5qUEphRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz88PUI+Sk1GVW91dnZzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJpbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFDQVtcTntOT09OS0xNT09QTEtMV05JR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV2dnV2d3l8fHx9fHx8fH59fH19fX1/f39/f35/f399eHV3ent6dnl4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJTVlhTUllUTllaW1dZXF9eX2VgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojk2NTg2OTc5OjM2NTc5NTxCPWZ0dXd4d3l5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHl4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUFFVT0xSU1RXWFRUWFFMV1lZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT01MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OThHbnJ1eHl6e3t9fn19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE5KTk9UU1RcVlJVU1NPTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9KR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFBPTk5NUE5UUlBSTElMS09RUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMT1BOTVBRUU5QT0pMTU1LR0VFREI7PT08OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUFBSUVBNTU5MSkxLTE5PUFFMTk5NSExLSUtLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHSkpARkFBQEZIRUpPSFFSYVxRUFJOU09PT0xMT01LTUxNT05bVkpNUU9HSUhESUpMTEtGRkZEP0NDPj1CRz9CPkFkcXR3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVBNT05XS0xOS0tNTUxMS05OU2RNSkxSSUlJRUFISkxNTktHSUZCQkJAP0VGRUhETG9wd3p6eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPz9AQT1DRUNLTlFUS0pJTVRGSUlKTEpLS0lKTE1PUFJQS0dDTEdDQ0pKTE1PTklKSUdDQ0NESUpNTElac254eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NGR0dHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AP0JFQ0lNT0dIS0ZIS0RISUtNSEpMSElKTEpNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuand2dnt4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkcEZLQ0ZFRkRFRUZFR0NDQD08PTo7OjpAREE/QkNFRUlGSkpMRklJR0ZGREI7QkNDPj9CQ0NER0xOSEtOSERIRElMTk1HSUxHRkZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1NRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUVFQkJBRUBEQj4/Pjo7Oz07PT9DQj9BQ0ZHSkdKSUxIR0dHRkVDPz1FRUI+QUNCQ0VHSElHTVBJRkZGS05PS0ZISUZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSE1SVVVST1dkYWFtZ3Fyb3N5emdlaGhjaWxncWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0RFR0NBQEFEPEJBPkE9Ojo9Pzs+P0BCP0BCRUdKRkpHSUdGRkZEQ0JBQUZGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVUWWBfXWlhbmluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01GR0VHQUJAQ0Q8QUFAQzw4Oj0+Oj89P0I/QEBERkhFSEZGSEZFRUNDRUJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9OTlBNTE5TV1ZXWFZYXlpdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJFRTxAQ0JEPDc6PT46PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9JVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgX2hlY2BkZWdnamloamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURBQ0hFPEBFQkQ8ODo+Pj08PEJCPEA+QUJGQ0VCQkdDQ0RFRkZHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXmBjXlxhY2tiYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtIS0hKRUJER0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREZGSEhGSEdJS0pFSkhISkhGRkxISEhKR0xMTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGFlXWRgZmdgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd293SUpLSUtHQkRERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFREZHRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTEpKTUxNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9cXmBgYWFhYGNkZWJkaWNkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3Bzd3R1dXd2dXV0ZXFza3BxanJ2cHdKTEtLTEdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0dHR0ZFSUZDR0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFMU01LTk1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZmJhY2luaGNpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0VBQEQ+PkRFRkM/Q0FFQ0RGQ0NFR0NCSUVCSElJR0hKRkRLSkdISkhJS0dKSk5LTktJTEhKTUtaZkpkXEtsUkhPTV9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxrVV93dmlqaGhmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENDQkVFREZCRkZHQ0RLRERKTEtJS0xHR05KSEpLR0tKSUpKTkxNTExMSU1MTFtzYmRwXmxsVU1OZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9ccHVncU1Lcnl2a2Fha2VlbHhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FCPz1CRUdCRkNFREVFREJISEdERUtHR0tNTUpNTEZKTkhKS0pJS0pKSUpMTU5NTU1LTk1NW3Jvb25wcGxrTVBRbFhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0hGRUVCQUI9Pz9FR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSU1LSEpNSUtJSkpOT05OTUxOTUxcaGR1XWxxV2xOT1FuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SE1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0xSUkxHTU1ITkpJSE5ISkpISE5PTk5MSk1NSlpzcHBvcXFtbE9RU29Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXXRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0VFRUBAPkNDQUZDSElNSEZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUlKTElLSklIS01NTUxJS0tLU2tiWmleX2pjcnJaX1lrb2BlZVVrX2NbYWJRYG1oXGpcbmlpZFpvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3cklIRklERURGQUBBRURDR0JISkxHRkRHS0xJRUZKTktJT0lMW1FKRkhIS01JSEpKS0tJSEpHTEtLS0dISkpMTExLSUtMTlRbXVRQVU1RUE5PT1VSUE9RT09RSkpPUFFkcWlUWVZbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0hQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKR0dJRUZLSElLTkxJT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVGSkpKRkRISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjX1lfYltgXltUWVhaX15kYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREdLSkpERUlJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRUNERUJGSkQ/SUtITltjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmFiY2NlWlJYVlZcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJS0RESkpNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQUhJQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUVFdX2FjY2NjYlxkYmFkY2ZYUVZVU1xYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0lHR0pGRkZJTEpORURKSkxOSkxJS0pISUdCSEhRTUtLT01LS0lISEVEP0VCSEhBQEZFQ1RdWV5YX1hfW11VWFhQXV1RS0pWXlheW11WWmFSUl9fYmJgYGJiYGNiYWRkYlhPUlJTXFNcXl1eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTExLS0lJREVBRUNIRkFBRkRBVlVFXFReU1ZgWE5UVU5aW01KS1RgYVtfWF9eYl1PWWJcYGBfYmNiXWJiV19fVFBPUVJZU15cXF1eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNRRFdfSUdHSERGTUpQUEZJSUpLTkxMS01LSkpHRUlOUVFOT09NTk1OSEtBREFDREZEQkFDREBMSEJMTFBPT01GTUZGSElIR0xMTU9QSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUVVUXFlZW15eYWFlZmNoZGtscXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1HSFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS09TU05QT05PT09IS0ZgRURfTERmY0NMW0heW3NtT05WbVlMQ1BfVGxXZ0pdV1VeRExRVUxNU1ZRUlRYV1RYVVRcVFBmWmhoZFlUa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0tJRUZGSEVFS09USktHYFRISk9KSU9NUlFLTUtMT1JVUk9PSkxNR0hNUVtZT1BQTk9QUElLUX9RSXxZWXJzV1BtSHFub2FWUnJxdE9Ca3NucXRwU29fW25YXVZcWFVraFVdVmNZYFlaX1ZVV39pdHV1X2F2YFliXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4foB8foCBgoR8gIN6f4F/fnd3TUlFSE1NQkRMTEdKTEZSVkxMT0hLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBRS0laeF1UeGRoWVJTUHZndGxwYm5na1FyT0x3bWpycHNycXJwb3CAXWZ6dXhxcXpxfnJ9a3V9YlJnfGVzc29zc3x9b355b39yX2BgYmJbYWBoa25rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpRT01OSk5WXllVTFFTTllZTFNTUk5MT0lRUlRZV1dRVFBQUVNMSGd4bGN4cW1aS0xUeXB1bXVib3dRZGRJZXZxbXdvgGpmeHhpV3JSaXttaWp6en1seHp/cGdvWHV1anZ1cIBhc2h8aWx4fG9fX19jYlxfZGVmaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3J1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFBJS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWRoYVZuTHFwXkdoeVd2VEtoeH14YHl7c25hXm1vZFNncnVubXlwd2x2c3RxbG1cc316a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUEtMTktMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnVVV2xObmx7cmFqZ391VEtXa2h9bG1seGBbcHp7X2B6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1JXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFOUFVMS0tSU1JSUk9WVVFRT1JSWFhQTlBVVFhYWFtbVVNTV1tXWFdbT1JUV1dYUV1YVl1VU09YUlZXV1haYFtncl5bW1tdXV9jWl9jY2VmZGNjYlpjY2dmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJNUlFQTFZVVFBUVVhVWlVSWl1WVVRXVVlYUE9MTldUUE5VU05QTkxRUEtKUVFLUU1KS09RVFJQUVNSSUlNTk9RUlBQUVRWUlhXXFdTU1FRVVVWVFpRTlJRV1VUWVZUWVVTUVVTVFVYWVheWl9hXVxaWl1dYGNcXWJiZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlRcYFZXVVlVWFRRUEtPWFNQTlVRTlJOTFNQTU5VU05RTk1OUVNQVFBSVFROTE5PUVRUUVFRVldVWVpbWVNVUlRYV1dZW1NPUlRXVVRZVVZZVVFRV1VWWFxaW2BdVllfXV5dXF1gYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFPUlhTUVFPTU9TVU5XUVRUVU9OTlFUVVVSUlJUWFZaXVxaVlZRUldYVltcVlBTVVVVVlhTV1dUUlFYVlZbX1teYF9WX11eYFxcYGBfX1piYmRoaGVkYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST01QU1JVWlVTUFBMUFdVUVZSU1JYTU9QUVRYVVRUU1VZWFteXVxbVlJPVVZVW1tWUVNWVVZYVFNYWlRTUVlXV11fW2BfYFZiXGBhXWBiX1xgXWNgY2dpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5PV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFVTUlRSUlpPUVNTVltWVlZUVlpYXV5cXF5WU05UVlZbW1VRVFRWWFhSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZ15cZWBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1cYFxgVVxdaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVVNOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVRVTlZWV15aWFFUVFhYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXV5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFtVVVdWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVU09XUVNXU1dVVltdWFtZVVpeWF9eWVxZUldSWVhZX1lZUlRVWllZVVdZXFVUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZmRiX2RhX2FgYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFJXVVNSU1dRU1ZUWFhYXV5YXVtVXl9YX19YXFZRWVVZWlphWFtUVldaWlpYWVlaV1ZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYVtmY2hmY2ZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaV1RcVVZXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJWVVFTVVdbW1xfXlpfXFZfX1pdXlleVlNZWFlaXWFZXVVWWltaW1paWVpYWV9fYGBkY2RlZWJkWmJmY2dmZV5hYmBjXmNjaWVkZ19nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVVYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZVU1VUWF1dX2BgXWFdV2BeW15cW15YVlhYW1pfX1peV1hcXF1dXVtaXFdaX2FeYGVkZGZmZmJZY2ZlaGdkXmNgX2VjXWZpZGVoX2deY2JjYWFgX19bWFlbWVpaWFpYV1tcWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVdcYGNkX1JZWVBXVldYV1ZWV1ZdXV5hYmFfYl5ZYV1dXlldXllYVVdbW2BeXF9ZWV1dXl5gXFpaWVtfYl9iZWRlZmdnYlpkZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcV1piZWNhUlxZT1hWWVtZWVdaWmBeYWJjYGFjX1xiXV9dW19eWVlUWF1dX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZWdkXWVmaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYV9jYmJdXFtaV1hpcWBcYF9dXGFjX11YWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2ZlZmVfZmZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t7fH19fX18fXx6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycnQ+KCsrKyoii9vS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vcjIXGxsbGxCO7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6enp6dXNzc3Nzc32FhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnZ4eXp5en55eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x7enx6fXt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnt5fXl9enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+fHl8ent6d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt8fH17fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp7enl7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fX6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoCBgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYF/gYGAgIKBgoKCgYGCgoGAgoKCgoGCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgoGChoWDhYODhISEhYWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIaFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDgoOEhYWGhYaGhYWHh4aDgH5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eGh4eFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIODgoSFhIWHh4WHg4B/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChYSDhIKBgYGBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODhYOIiIOBgYGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWEg4qNgoKCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDhJGSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWGiIuKhoSGhIKGhoKAh4aDg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoGAgIF/fX6Dg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx8f4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgX9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f36AgIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH59fn18fX6Cg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gICAfn9+fn58fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36Afn1/gYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoOBgYF+gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKCgoF+fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eGh4iHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoWAfXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGDg4KDgoKBgYCAf4F+f31+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42NjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gZORjIyNjY+KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoCBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/fn+LkI2MjI6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAfoB+fn99f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJGMi4uOjYuKhoSFhISDg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn9/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CLj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t9fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJGOjIqIioeIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJi4mLiYWIkY2LiIiGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH19fX19fnx9fH18fX1+fH59fX19fHt7e3x7fHx7ent7enp6e35+goWIh4iKi4uLiYyQjYyJiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+MioiIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjImJhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx9fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiYyJi4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGBgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGDgX5+gIB9foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYKCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAhoKEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEgIKCgoKDgoSCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOCf3+Af4F/gH98e3t6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Afn98fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fX2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn19eH5/f3x8fH59foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhIOCgoOCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGCgH5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWGhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH9/gYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgIGAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn58e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYSDgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGFg4OEgYGDgIKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKChoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCAgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Dh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYuJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgH9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2ChHVzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfH9zgoN/g4N9gX1+fn1+goOBfH+AfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhoOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ6eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9f359gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOGhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYSFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYSGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaDhoaFhoWFhoaFhIOFhYKFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn18fXx/fH5+fH2BgH18fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoWGhYaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODgoKDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFh4WHhoaFhoaGhYaGhIOFhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhYaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18f359fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg35+f4B/f4CDf3yAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhYOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCfn19f35+f4R+e398fICBfYGAfX2DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19jc3d3d3d3d3d3d3d3d3drW19fX19fX19bW1tbW1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLmzeHNzc3Nzc3Nzc3Nzc3CUwLy9vb29vb29vb29vL/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmTIpKysrKysrKysrKyskZLCpqqqqqqqqqqqqqqiw0tLS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpps4LzAwMDAwMDAwMDAwKmiyq6urq6urq6urq6uqsdHS0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaugRT0+Pj4+Pj4+Pj4+PjlxtK+vr6+vr6+vr6+vrrbS0tLT0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crKysrKysrKycnJycnJzdPT0tLS0tLS0tLS09LS1dTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7R1NTTzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bV1tXW1tbW1tbV1tbW1tXV1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafUrYODlc/SpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Ozs/P0Z2QuZy8uJm1s5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvrKymjoCNxp+YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PD06Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZ6ooYms1rqYoZ2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImdpKqsm6WymZavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PEJAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBnq2knJWokJqFnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw7Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5atp7Orn3+fqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDPlMjZwZyAvK2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzs7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+FoJePoJ+fmKiWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJuspauin8Ogq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iHz6mOjq3Ywo+Nu9XS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTUv7/V0tXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojw9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk4NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzs4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj47PDk7Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODc4NDs/PD89OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Nzc3NjQ2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NTU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyampubm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87My8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtoZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/JzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwsbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m9urq0v7i1t7Ovu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2diXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxbW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmFhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15dWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9fWVNQQUVJR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXFpVSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3srKytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdT0hBPz1IQ0ZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE/SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKx77AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk1GODY2NTo2Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vbWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubS0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2rqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28t8DBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7a8vbiyrbOwr6yut7aztLWvqqSem5ycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWim6OclZCMj4+Pk5CWlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09MTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6awpK+utcG6tbeyt7aytKuytK6qq6+wsrOupZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlp56gnJWTkI+RkJiQlpWYl5+Ym5mbo5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7REA9Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkpaXmZmcoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+prrKrpaqqoJqYmJiVk5aak5WVmZaal5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOD5CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZydmpSYmpqRjpGVkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKxtKmxr6KZnJ2eoZmbm5qYmZuUlZuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho56doJ+joKKvr6yvsay2p62xraamsK6trLCooJ+ioJeRlJyhnJmYkpOfnaKkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issbSjoJ2loKyhoaKgoJqYlpWfm5uYpKGgnqShoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpyhnZ6ampKZnpyioqCgnaKfn56fqaynrKmqtKurraulpauoqqyqpaCemZKSlJiZl5aWjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oauiqaiyqaqop6iamZ2aqqefmaegn5+nqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5iWmZ6bnKSfn52knZqdnKWipKOiqq+sp6mjoKGsrq6qq6egnp6io56fnpqcnJSTlZSenpiUhp6aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLS7xsS8wru3s6myraqztK+zrqquo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3VycGhXW1FFVEhESU9IPkVBM0VIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpZ2Vm5ufmp6cnqWmp52goKuxrqekpKOgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr3HxsK3w8nIwsDFvrm0ubq1u7ewtbKqurGuu7e+urqqt62rqri6tLyurrmjpqOep6Wio6mmmpufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGhveGplWltGSkxERFNMREJENzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZqdnZ+fmpeYl5KMj5aXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3MyMnRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbGysfOv8nQy8bExsTBu8PBvr6+tb2zrb+/wsPGxMfErr+4sri8xMHBury8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gm5mXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXX0tfNxsfJzMPFys/K09fR19LU1dPTyMzHzc3J0szO083Ex8nKwcXLxsjIxb7Cs7PIxMvKys7Fyr++v7zBx8TMzMjJwMO/rbCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/enJ1dWdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo56ko5+gpKyblqmWjJaNjI2XprCupZ2enaGloZ6blZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTTz9LD0NPW19XW0svJztHLxs3SytLV1tnV19PW2M7Syc7RzM7QzNLPv8fGysPMzMvOz8XGx7bAyr/SzcvPxcnIv8PDyM7Mz9DPzMrIzri3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHdzdm9jYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmq5qjsLGpqLXQ1Nfa0sfGy7S2wsWytqmipaahoqu1p5qxoJidjJCmrauclZihnZuhop+cnZuVindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTPz9XU1NHSzNHO09fW09XQz9LT0cnT0cjQ2NfY0dfS19nV1szOz8nN0cvOz7/FwsfFzs3R0NHIy8zAysvF1M7LzsjEycbGyMzK09PR1c/SzNLBucWypai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamgr66qqqyepq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOjtqqsw6epqaGYlpiam52hnpqdnpR+cmVjYl9fYWBfYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0srPzNPW0tHWzc/V1dHG0dTK0dTV1s7S0NjY2NfLyM3Dyc7Mycu/yL/Iyc3Oz8vQzc7Lzs/Hy8/Qys7KwsnGyczKy9HSzNPS0c/Qyr3IubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bua2FkbnBhV1xaSUZGRExXRTtAPDMzPD04Njg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Onnri2tbWtpa2uvrSxwNnS19rc18/Ny8TT0MLCsqutrqyms7K5q7K8xqKhnJaUl5uen5+dlJaXlYlsXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVysDKwcXMwsjJwszDxcjKys7KzczQzdPLxcjPzMjHysTHwMXJy83Q0cbQzs3NzM/Fx8C3ub3Dw73DubKzvrG8xMS1qpilopmWkZWWkouUjZqRlJSPj5SCiYV4cHFrbmhgYHFoWVhoVk1HTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfDucvV1tna29jNzdDJ1tbFxLiytqqkrqy5ubGyxKyWjY2YlpCTkpGWlpaQjHxlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytHIy87NxtHSz87M1MrHy87Px8fP0svQz8a6xL7Gyb3Cx8nOxMLHwMfNx8PLysvPx8PDz8jGwcXIw77Ax8vLzM7CysvIx8vQxMXHu8fDyMjCz8C9vL+xwcrHur2qsbKnpZ2inZiQmpCkmZeZkZWYiY+Cd250ZGxgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcfQ1dbZ2tvY0MrQ0NLUysW6vr6wqLervrm4s6WRjo6WkIaDhISCfoWFf3RgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsjGwsPAw8fKycjKx8HFzMbIy83JxMLLycLCy9DEy8i/ucG7xce9v8bPy8O/w7vJxsi7yMbEysC9wcvGxcS+xby8v8PEy8XFvMDJwsXH0sXAyL/KysbIxtDDw8bDr8TLx8TKt7+8urSprKWlmJ+YrKOhpZqjoJuUe3ZzdGZqW2FubVpbWFFETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvP0czHwsPHzc/PzdbQ1tnY2dDN1M7P0MvEuMbBtrW8scC2uq2RjJOXh3uAhYaAdnh1cnBfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy7ubjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcLGvr61wb3DurzGu8K5s7zFw8LCtr+1tb6/usvDvLW6yLq/vcvEwcXCxsjGyMbQxsLMyLLHysPOzcHFw8C9s7ews6ioqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRkJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc7P0snRx9bV1tjOzNDIzcjKxb7KwbK1ure6tq+RjYqLhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLS3tLOys7q1vbG3sLWvsrvCvMHEvL+7tbO7vsC4x7m0u7bAwry4vcbBw7y1rrK2ur60xbe7tau4vL3AvbC6tq+2urLFvLavu7+0trTFvb7DxcDDxcbIy8bAxsa7yMu/z8rHw8bCw7fDvr22ub7Hv6y1urW3to54dHhnZ2Via25eVl5gRktISEpGQkNBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLycvKy8bRz9PRz8jKxsrGxMC9z72zuL25t7abjoeJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquss62pq6mzrbawsqmupqyyvLq2w7m6urGrtbm7tMK6sL+xvb27trzIucO3raqosLLAtri8r7CnsbO0u7yrrbWmrrauurGwqrmvrbuuu7i7v7+9ucK/x8PFwbzGwcjLuMXHxb/HxMO6xMbCu8bJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj49OUE9P0A/PD46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs7SzMTGwcXQyM/DxMfBxsbFxczDyszCxMHHwLq8u8q3tLu9tbWrkYmQkHx5foqFenuEgXduXl1dXV1fYF9fZGJiY2NiYF9eW1taWl1aWllaXWVub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCjpp+qrbW2sb25r7evqK64tLS8uLO8r7i5tbK8wbLBrqWpoquxsrOovKqrqKusrbS0pqiuoaSvqbKlp6iupai3rLCyt7m6u7G8vb6+xL+1wcHHyLe/wMW3xMK/u7/Ew77EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwL3KuL/FwLzMusPGxbq8w725t73FuLW4u66ylYOJjYF7foB+eHR/fHN3Zl9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSepJuXkaGjqqOin6Wlp6WsoJ2bpKassq+2t6ewrKeqtKu0ubC2tK22ubKwurmxt6Sfo5+msaerqLmqpKenqKeyraCnpp+bpKasnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubrCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZl9rb2BVWV9ITmhPVEhFSkY8PUA9Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzc4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelZ6hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu3x7u2w8azvcW7tq+4v7uwsrawooSHh4J9eXZ0b21rampxaV9gXVxcXV9gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm5+fo6Whp56bopufqrCtsbWiqaqpq6yktbitt6+ss7Wus7WusKqfnZ6jorKkpqm4raKmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7KyubK9tLaxsbW0v7W9wL3Dwbq7vZeDenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmbpKbAsq+2rLS3xtDJycHHvLzFxdDAvMq6usK7tcW4tcDBs8HDu6yptLm3p7CzqYuGiIB5c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFdXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaQnKGhqJ2bnaWmoaWcoKCamK2ura6yoKWiraunobWwsbGsqK+zp7qzprahop6bo6Gto6Gptaqio6adpaajlpiel5manZ+Zl52cnJusoaumo6Smrauzs6q0sLKqsrm0r6mvsrKyt7Ouqayusbewura5vb+3srGUhXl1ZV9lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va20uMPNycjBxrjCwcjQucPHwLa8vbbDura/wLW6vrqpprC6sKexr5t9hYWAeXBxdHFoZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqmdm5qqpq+wq5ujo7eqoJ+uqLappqetsKS3sKS3oKKbmJiqpqGarLiwoqGknKGfoJOVoZSWlpuYl5aXnJSfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxr7Cur6anp7KusbSvvLS5t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTEtFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp6np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcWxv7+5wMG5v8C5uby3p6awu6WooKSJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKann5yfpJ+qr6afoqO2qKChoqizoaWnpK+lsa2stZ6gnZWUqaGilKyxsZ6iop2emJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62lqK6vrquoqqmzpaarr7Sxrry1sa+voJJ6dnJkYVxbXVhOTFFHUmFNV1BPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKett7u8wcW6sbm1xcrLwcTHx8m4yMa1xcLJr7q8wrvCwMG9u7e5taWmsbWdoYmYiIB3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVVNUUlVgYF9gYV9gYWNkaYGUk4mRjpSSk5yUlZajmaCWnKCloa2lpKSio6GbqqqlmZ6lsamgoJykqp2noZ6sramorq2ioaKUl6ObnI+rqbCbn6KenpeYk4qeko2Sk5WPmJiSm6GinKSgoZWgoaSmm6OrpaKkqqOrrqSusammpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlVRRlFPSFpcT1JKVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Nzs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njo4NTk4OTg5OzlAOXu1tK20u7KwrLKtnaenr7m5s8DIurXAr8bJzrvCy83Jt8u/tMDHzLC2vce7wcfDvb62ubSkqq+unJmHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eX19fYmRtjo+EkYaPkY+Zk5SSnJqinJugp6iqqKqmqKWjmKSupJSZpa+pn5uYm6CerpmbqrOfpaafo6OhlJOblpaSqKqtmpygoaCalJCMmY6LkIySjJaUkJ6hoKOcm6KVm6CioJiiqKOiqKugq6+krbelo6OirK2qqKuvs7iyvbWzq6+YhHNzaFtZWVJVUkZZTFBcWU1UTlBMUFJJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9NTc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaivrZupqKy3tqy8yru2v6zMx8a5ws/QybXGvrq+xsu1sb3EvMLEw73Asriupaquqp2XhoF3eG9uaW5ubnFnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXV1cXl9gZH6NgYt/i5CKko2XkZeZoqCbn6qppq2qp6+jp5mfrKCVlqSop52XkI+anq6Wl6eqmZ+dlKWhnpKQkpKTlaerpZqZmp2dlo2MjJSGiI2DkIuSlJCgnqCjl5WflZqgop6Tm6Wlp6iooLGwprC8p6CjrLSrrqewtLC5tcCxrbGrkH1xcmJWVFVOUklHVlFTUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6vMPL0cyzubq+wMTHtrS3vbK6u8O9wbCzrbCtr6qboohraG5vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/dYmOh5CJmImUlJebmZ2om5+qpaSqnaeYoKWbko+eopqXloWEkpqjj5OinJWWlYeimpqTi46LkJmkp5yVlZebkJKHlI6MgYuNgJCKkpKRoZqfoZWUmJiVoqWZjJmkpqimoaC0sqeyt6Gdoresqq2ksrKmtby1q6uxo4h4cm1dTlBRTE9DTU5OUEtGTk5KSk5NUUlNSkFHS0hIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKmloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOzrrairLTDubqtqauzrq6elqd9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnGFiIKHgJGDjoqUkZOdoI+anKKho5iklqGblY2HmJqMc42CfY2XloWQmZCTjo57mY6cjIKKgIqYn6KekJOYloSOgpN+fnSJjnqQhpKQkJ2amZqQlZCdjqKjjomaoKGko5uitK+sr6yfmKW5pqWwobCunLC7qqmvqpmBdnJjVk1ST1BNQ1NOTFFNQ1BQSElOU01ISkpESkxGS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd3t6KjtKilpaijpqWmpqazp6W0wbivtLDKxrm6ws/Hv7WvvcOvsceyraerlaSuv7ewr5+mrKyqlZSicldWX2hnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeLk5Cfl52VlJaUjpaJf5OJXztXb3uLlIl/i5GMj4WGc4qEloF5gnqFk52Ug5WOkY+Dhn2TeHJvhY1+iYCQjY+XmZiTio+JnIiel4eIlp6aoaCXp6+pramon5ettKKmrZisq5intKKpraOSfXJtX1tOU1JWTERUSlBNTEZPT0lFTFFNS1BKSU1QRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5eLego66hpqaqoKepp6KpsKintMG6sbWwycO5tL/PwLqxsbjEq67JrqejnYaaormspqeVpaSjoJaOlmlRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFBCQH+VkZF9iZSMhIqNm42WlYqSiIaVhniIf2BKUW54ipKEfISMiYR/f25+f5R3dXZ4hI2ZcFGNiIqHfH54lHZod4WIfoqIlYqNkJKWi4SKiJSEmoyBhJKblp6clKSjqKmlo56bsKuhpKSQpqqWoaqcoqaoiHRsZV5bSFFRUk1JVU1TSUxMUElIRktOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXa2nKOnnZ+hrqGnqKWnqK+tqra8tri3s8K8t6i6ybm3qaq3uK22wKqim5KDj5mxn6GZjJ+WmJSRioxlTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgXuFjJKBkpmLj3uGj4B1f3hzbnVwdI2OgXl9iqqFeXpodnuOcHJteIGKjJJ4eoB7gHZzcpJ3Z3WEhISEepWJiIqMi4B/hIuMf5SDe4CPmJWclZGfnamen6CeoKmln52YjKekk6Cglp2epH9xZ2BcXEpWT1FHS1hST0pNTVJKSkpNUEhMUUxSVE1FSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8PDd2rpijoZicnrOpr6mlrKywsaq9tLK8uLa6tbKgt7uzq52fraustbOlnZaSmIaTo5aci4KXiY+JhoaDZkpJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhZWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4f4mPfISYkoFyh498dntva36tfHOQin97hpKBfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcWhxgH2OcEOKhIKDhX53d3qLhX2LenV+jpKPmIqSmpujlpmdm52eop2WjYqkm4+dl46WmI92bWxlYlpYWFRRSlNVVE9QTlFWS05LTk9KUU9JT09LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKavrK6rqKmxr7GsvLisu765s62om7GorZyQl56nrKekm52TiJZ+jpWRlYB8inqFgH9/gWVKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFdZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZWASpKYbmh3foFsaWNseYWQkoZrc2x8bnJ7hmhtcH5zjYiDhXp9fnt2b3R0hYJ5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5GKkoyGkJZ+bWhtbm5XVVdUUVFaT1NVVVRYVU1OSE1KTU5LQ0lOR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6kra+irKqota+urLS/q7zCv6ajmpWlmJ6OhYyWoqSbmpOXj3aRfoWLkY98eH50fXh1d3xmT0VHREA8Pj5BRkdHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4h1gYiGdGyakXRze2prnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3xncHB7bpKNjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdkV1FZV1hZW01QVVZaWU5JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiZkZqWpKitnrKfprquq7Kww7K7w8ebl4+UmYuOhnqFkZqWj5KOkol0ioR3i4+Mf3Z3dnl3b3hzaVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bXGDgYWBeYSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiIBoZmJpbnJtcIN1aW9YdW+OmpF2bH96fG1xbXB/enN1bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6CgH2PeXBvbmpeWlxdW1lYYF9TTltbWVhMSEpGSkc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW1qa2xrsGzu8HGl5CMlJCBiX1ugpGTioSLiJCIdoSFb5iKjH95e3tyfHR8a29eSlBHPkA3NDU4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8fYWDf4x+dqKZeX6GgISZhZucYYaqn52KgpCNenaJfomIjnOKl4+De1xkcXR6e3eKbGdpYXhvhY+Cem6Bd3OEenBzeXdrbmldd4d9h3yIh4+Ai5OXg42GjYZ9cYR/hHx1d3t9iHRucXJlZl5bWl1TW2ZeV1FVWV1WR0tLRUxHP0ZAREM/QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgq6Cxqa/AsrvGupaPkZSIeoZ2a4CMkoN+i4WQjnmEgnWiho1/f4KAc4OBfWx5bFNYTEFFMzExMjY2Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSS2mEiHuJeXtxfI+Me3yJhn6Xh3ahmYiHj5KUpY2sqUiHrbCvioCAk4qCi4KEkamHgJiYipxzbHyBhod9jmhnZ3h+boWGgYVxhIZHa4B3cXl2aG1rX3d9g4h/iIWMepWenIqLiZF/e3WLdnx3bW93fn5ycXBqW1xcW2NiWGdlXFVQUVhaUURMTEdPSURGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NzU2NzY4O0RGTE1NTEM3KyImJyspKysrLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6GdrKGmuK+zvbSXjZKLmIt9dHB/ipN/fo2DlJV9hn+HpYiJgYOIhnmJi4B1hnlfY1dMQzYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVRUVVRUVlVTUU9HQz84MCwjh1s+Pzk0Ll2WcHOjVUZJS01OUFdgWXBaXF9qjZOHlYCEgoWRk36FiZGBmpaCoKGYlZuapa2Tmbuxp7vHw6eKjKGljpOJgZB8coSen5GdfnaFhYuPh5BpaG+DgHSMhoSLcYaCd4d/e3aFfW52dWeBlY+GiYiIiYiiq6OWiY6YgHuCiXp6b2dreH14fHFpY11aWV1pXGFmX1pPTE5YU1FJUUtETkdDS0RDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGQj4ubmqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWfoqBkpyOhIGCjIuCio6EgIuAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUtLS05WYGN/Z2dudZ2bj5qTk4uNjpqIk4+di6ChkqOppaOsk6i2oqjBw67Ir3i6lJp8jKGemISThYKPoZ+TmZKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGXh5OJj4+Xpbapm42VooOHk4R+f2tqa31+fn9xX1tiXllmalxsa19YS0hPU1FOTUxGSVFERE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafoWTknqBkomSkn2LhZmSkYOAgYuNiYaRh4SIhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDg1Mjw/UjVISEhMTE1OUl5vinxzgn2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMm3ydHPvpugcGmrqZ+Ek5KFnKGampqnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ2SmqiIl5COgYhsc3N8fXpuZl5bX15hZ2RgZ2dcUkVLS1FPSUpNRkZNQ0hNRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl5QcXVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mImI15go2Ljo18ioaQkI+Cg4CJjImFk4WDhomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49RkhAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKiptayxt7Kyrbuxs76cs8Ssu8nLuMS/t6WjsLKsraqji5aYhaamoKKYgqaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7nKGjsJOjnaOekaSiq7Cts7WilaaqiZqKk4qVent+g3xlXmZaY2BdYmNeZmdfW09ESkhUT0ZJTEZLR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo1NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljWGpwWHqFdoGUhYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMj4uKe4iDh5GPg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJUVVVXVU1cUUdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHxKuzxbattMCzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4mnr6qklXefpJehq7GzmJapraiutbuyuqyvtaKxrLK1vLi0rrWgqKijqJupsK2zuri4qJy4qY2lj5KToId5gYFzWF9iVWRgYGJfX2ZgW1VKREVMVlFJSktFSkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFiZFd6dXGBlX2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYeFgY6AgYqPhoCGiIWKh5F6eW5dV0BFTjw2OjQ2QUI3NjQvLzZDSENRXE9RVVdVXVdQX1VJS0pBQD9HS0ZGRDs+QDdENz9CSkpFR1dUUF6PpK6ksrTDtrjBzMq2u8S9s7TBt7jCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqxoKKWm6KSpbGtpa2sp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6t7+4uri6ra2xprGqrr6wvbzDw6yZu6iVro+YmauJfoB6aFVgX1ZoY2lkVltjWVZUSUhHTFFHRElKQUlEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Fb3tyeIhiuaGZo4mVlJaTlJSOkJeSh4d7h4KOloqBhIGKe3yLiIZ8ioKBi4SVfXh6dWZPXGRHRUw6UWRgW15TRj87SFBEWmNRUVlZWmdaVGBhTVNPRUE/SUpIRUZBQEM9RTZCP0hHS01TWlRelK+4tbu5ycC7vcrNvL3BvLi2vLy3vrW6s8ZhdbKlsZqeq76qpairqqSisrWgq6ielZaemJ+upaenpZ+kk6KnsLOosrK8tsG908nJ08bCxczCysTAvr7AvLy4tLC5t7fDusa+xMmwnrqroqyPpam3iYB8b11fX11VX11oZVNZYVZSVklFRk5LQT5IRT1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGPjYaQc2xycnSI1cC1mqCNlZmZkY6XkpaWjoaIfYeDjZaLf4OAg3l7i4SHe4t5gYqCl390fXprZXB2WV1cUGVlYmBlZF1bWFhcTWRtVVJtbl9vX1hnZVVZVUtEQktLSEZISEhIQkk5REBIS1RUVl1aXJO5wLm+uMbBu7nKy7u3ura5ubS4tbWutreZZHWpnq1wXqKtnJihopuknqullJ+fkJSOlpiXqJ6mn5+amYOknaykqrGtt7C8uNTQztbPyczSzM/OysfAv8LKvsG9wsDFxMbKwMnPtKS8sbWwnKy5vZp9dmlbXlpYW15YYmJRW2BTUUtDQkZHRTxARj9CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLjAsQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQjIl8gYRze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWlgZmlpbVptdJetpL2Ih2dbb2heWllUSEtPUEpLUUxUUUhMQUpHS1BfX2JnamKXt8ewurS7vraxxce2sLmxsbuts7Goq7itjbaonpynmk6anoyPoJaRp5illYqTk4mRiY+Rkp2boZiblZaHnpmmmqywqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8Sif2xhWltcV15WWGRZT1xXTlFDQklFQ0k8QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYNocm95eYOhqp6ml4ybm5iLjpWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2lucHlpd31+y7/D36duY3hvZFthYEtQUlVOWV9QXl1OUU5UUVVUXG5ud4Nylq64rLWosLarrb3Bsqu1pqW5qKyvoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSLg5SVl5eUm5CcmJmZnp6rrKSnoqysztLV0c3M0tPT0NTRzsjD1NHIztLT09fN0tHF0tbGwc/IyMOpv7jQnHdsY1tgW1VeUVxaT09UUE5IPkFHQkNGPUFCP0ZFPkA/Oj09PTxKQjQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBvd3Nsc318d3xzgnhxa4Bycmlwcnp5c3u+y5p/jbKEdnKFd2lhal1DWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGppqqxuaumtKOirqKkrqKnsZ+JppuVk5GKko+IgpSJa5WijZmEgYZ+kYODk5esi5WOlZqOhpKRnZensKKgoaWkqMjNz8fCy9DT0dTSztPNxtbTzdTY1tbY1dfVytTazcrY1tHLrcTDzIlwbWBeXVZSV1JaT0pHSklKQDs6O0VCRD1DRD5IQz9DQjs8OTw6R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYiIi4l+g3hzfH2Eh3eAe4eRl4GEb3hxbXV/dnh9dIZ8eWyHdnVufXaFdnl7nbWMPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhrbmlugYSJkYyen6CekZeZoKOkprKkpbOgoqWfoamhorGch5+SkpORi46Lh4SPhH6cnIyNgoSFepR/g6qWo4ySi5iTi32XipqRqrOYm5ynnKa9w8W5tsXN0dDS0MvSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzbR1dGxiW1dRU1BYVUVGSklFRT06NzpAQkM6SEVARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6MfoeSg4mGhYqCiH14hZeXiY+Dh4aHeoR5cXt7hYZ1eoaOjp16jXB9cHB6gHJ7gXKEh4Bujnp1d319gnV/fIeJsHRZqsK3jZKCcW5jPV5ocnBxcG54d4JlaW9ydnhye4yHj5OSm5agloiMk5yfm5+roKGsnKKamqCmn5+smYyajZGTjoV9iIiDhYuOoJmTiIOHfmyZeYSZh4iTjI6VjIZ7m4iTj66rlJWXn5imrrW8qa29xsvIycvLz8nE0srU19jX2NfU29fT2dvWz9va0tbJ1cyTdXhmZVhXTlFSXEdCRUlJPkE+PTg6PkA8Pkg9QEJBQUVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmx2gIhxkZCbgHmAjn6DgYKFf4R8fYSYjoeLfoaHgXeDeW57e4eCdHqSno6hdo92g3R1gX50gIRvgZCCb5KFdXyBhXp2h3yJuMalw8q4gpacj3hwZk5lY4J7gXeGopCLeXp3e4SAfIR1bZSWlZaQmJGDiY+XmpeXpp2YoJafk5KXo56aq5aRkYuOk4OMhYmJgYaQkZ6cmYmFi4GGl3uIiZ+XkImOiouCfKGJkIu8oZiTl5qcqKalrZ6ntb7Av7jGyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGg3Z2ZGZhXVJVVVRNS0RNRDs9PDw5Ojw/OT1BNz4/QD0/Pj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs5OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eop8foB/gH6Fe36CkYqFhnqFiHx2fnVtfX2HfnR/kp6Rn4OSfId+eI9+eYuKb4ObgXSZhn2CioV8fpF7kKmPkMOgvYybpJx+ioR9iXOMi39zppqcmJSFe4+RiYRpR3GhpJ6MjJGShYiLkJKVj52bk5SRl42MlZ+dlKGVko6OkYx/kI+Oi4SJk5aan5+JjJSSnZGDjH+mmYiFjoOGhIClhoqLuJidkZWWoaagnZ2do662urSrwMbK0MjHzc/T0tLY0tXXwNfY2dvY2trZ2dfbtnZ1dGdmYlRdWVJPT0hDTEM9PT45OTs6OTk8PTZAPj89PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdPPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PERSU1JYX1ZYZm1tbWmBjopxc3iKe3uAfH98iHt9fIuHg351hIZ6c3pzbYF+hX53hpuhm56UkoCMiH+Yh4Cckm6IqYV7oIx8kY6DiYScfpuRio2jop+RpK+gi5GLhouBk4ZXcq2Ln6ubkIOZnJCPjluDopGCjZ+TlIyGiIySkoyUlZWQjI+KiJabnY+Vl5KMk5SGgIuJk46Kip2XmaOihpOdlqCLiomOnZCDiI+Ag4eFpYWLkLOYnJKUl6GgnpmSm52nsbispL3Cx83Ixs/M0MzO18/R1K7W1dja2Nra19bZ2p1seXFjY1paVlFVV0NASUQ/Pz46NDk6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieGxifpGDb213i3h6f3uBfYd8fHeGhYBzcIWCe3V3dnSFg4V9f5Kmop+mopeKnZCUl4uKqJdyirKNhKiShJmUhZqMo5agmJOJm56ik6mwoJGVkY6OiJaMb423hJrEyLKcoqacnJiWkbGQZKTNx5WOhoeJkJKNjZOVioWKioaWmZuPkJSTh5aYhICPi5mIjpCql5ekooiZnpaaiY+HmJiKhY+NgX+Hj6WIjZOompeUlpihmJ+Zk5yaorK0paO8wb7HxsXJyMnCytPMzdSo0tHW1tbY2tTT2s5/b3tkYFtcW01JU1lCQUdEO0I+ODM3PDw6OD42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGOfXxtfoh4en57goKDf3d2gYN8bW6Lf3t9eHh8hYeKfouis6ejq7Oil6efpaSWla6ig5G4lZKzmoyioYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmpehwI6jybirnKOmrZiSm52ynYWGqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4eVmYaEkZCcdZGYs5aXpaGHnZqTj4uQipebiYuWjoZ9jJieiZCQnJuak5iXn5OgnZSem6CxrqKkt760xcfEvcPDwMbNysnTps7M09LR1tjT0Ni6b3ZyWV5TXlROSElNRUJDRDU+Ojc3Oj88PDc9NDI2Njk3NzQ+NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdNWlxZSmZgO0iEi3p6boWGenyEeIGGgX5weHx+fW9yjXp+gnx4houJhoSSprutqLK9sKWts7Ooo6GwrIqatZ2juKWVraWXqa24p6Sjn5qpmKqkrrCqmpmclJWRl6CYmru7rsqhare4q7CUmZ+jrJOXvqNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJaNi42WmJOdmbSXlqudipyUko6RkoyZm4qSnpCLiZafoY2UjZianZKcmJ6UoaCUnJ2lr6ihpbO4rMLIxLa6vbzFx8fC0aDGyc3NxdfW0cvTn213ZVlXUFxQTkVDPjxDQUI4QDg4NT9HPT02PDM1MzQ1NDU0QjQ5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicEpAi4p+gHOGh32CiHWDioJ/bn18fX9wd4d3joKHfI2PjIaMmarCwK+9xruztMC9tK2rs7aMqLOtrb2rm7ulqK26uKunpqKipKOpr7Kxq52cpJmbmJefoqamkqS6r6nAvK2usrmlpKh+iIacrb2wgouMi5CDjoORj3qBiJCNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpiPkqGRiZSbpKyUlo+UnJ2ToZ2bmJ+hlJqep6akoqSws6fBxsOvsLq3xcTDv82mx8THxL3W0M3EyoVxcF9ZV1xYTEpBS0FGRz9BQEM7OjQ+QT09NT02PjM0MzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRD9DRlxlRmBpZ1pdXJOMjIl7h4yHg4x1h5GKgW9+e4J/cX6Be5V6kpSUmJCTlqezxsm/wszCw7nHvbuvq7m7mLO3urLArqXBpKuwvL2qrqujo56nq660sKqcoKqcoZyWn7C1qIyjurq2wbysqZ2zpaSolIWOqcTDpIKLj4eIhIaVlI15g42Rj5GhjIyUko6Jl5+Yk5mVmKagr52Mq5yNlo+SkZWVjpCVko+hlIaXn6CynpSZk6CgmKSfmqCboJSYnqWkpqakr66mwMTDrqi3tsnDvrbPssS/xLyz0crIwrRydmpaVVlnUExIQkxLTEpBQT5ERDw1QUU7OzM9OEIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGZUYmuZjZaKjIiTkIaJeYeUkIFygHuNf3iHgoKQeo2hlqiampm6vcfIycHSycrCzb3Cs628vqi7wL27w7eswamss7y+qrCqpKWkrK6zrba1oJ+vn6WimKOzvambqL3BpLa4sKyUsqysrJeHmqmmpZGCjJOlloqBdYqSeYWOkpCeoJOPk4yPjZSjmZaclZWjnqqfkaWajI+Pj5WWiHyPlpOSo5qVn6GctaWQnpalo6Klnp2mmJ6Vl5uko6mnorKsqLzAw6+ls7fMv7mvxLO7vsG4rMLDwsCXandfVlVZWEpKTElGRERIQ0NBREw6NERJOjs0PDhFLjEyMzUyQjI1U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGJaY2NWno+cjpeOnpKJin+KoJOEeIV/ln9/kIiKkYCWoZmup6SYwr3Hw8fF083Ozcu8wrewury0vcu8w8G2t7yts7+6va6vqKCpqLatrqmyt5ueraOooZ6rt7iqpbC/xbK+urSoq7a0rq6XlqWsqJ+RjZKyxaeWjnySlXyHkpmPqpmYk5OPkpWTpJ2TnZmUoaOinJifmIuMj4+eiFqQlpeSl6SZZZijn7KllaGWq6upp5ufppeYlpiVoaSopZ+2q6q6u8O0pbS1y8C4qrarsru4rqi4ur24gGhrWFVTU01FSVJNSz9BSEVFSEhIOTVFTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKfr76voce8xMTHxs7OztLKvru2sbq7vL7PtcO9uLm3s7G1s7izq6ecq6y5qqmnr6+Yo6+lp6SltcCxrKy0v8O6wLq0qLq2ubSvlqWtrq6ki5OUoY10wpp9l5mEjpeZjLGVm5qVkpKZmaWjlaCbl5qpnZuhoJmKjZCWnGBKlpyalZqlllWXsKCvnJ+klK6uq6WaoKWUk5iYjZygp6KatKmqs7u7u6qxssfAuaasq62ysqOhsrK0pG1rY1pXTU9KRE9PUFI7R0tJR0lDQz46S1U/QTo9RU0wNzUzNDpCNDRNV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiqlpmgoqiwmZGXh4uolo6Ik4WgiISdl4+doZujpbXJtanGusLDyMrJyMzNxr+7s665ucHBzLXHusG5tbqwr6+ztaekm6q0taqppq2smqSupaSorLu/qKy2t7/Bv765tLPEsrm+raOvtay5poibl6abdr+fhJmdjpOamoyul6GcnJeUm6ChqJ6on5maqpqhp56YkI2RnYNudpKimpWdop2RrrKjqpSoqpeqraOjn6SokZGZnIeUnaKelrGnqau5tr2ysq6+ubago6eopaacm62pqYtgY19eT0pLRkdNSlZMPU1FTktMQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5WboZ+7r5mVn4yTq5yRkpOJq42GoZ6Mo62Uo6S2xr60wLrCwsfJxcLOyMK+ubKvubXBwsq1xbLBvLW6qqitrbCjo5iqtLumqaarqp2pr6ejqqu9vKitvbW4vse8t7a4wbK+wbSqtbervqWQo5iSoqC9n4maoJmXnp6Pt5+pnKWim5yhmqiks6CbnaacqKqemJWPlJuLl4mMpKKUnaKdoLWvpaSTr6uZqqqdnaOjqJCUlJ+Cj56enJWppKGhs7S6tK2otbKznpyjpZqXlZiqoZ51XVpeXElHRUZNUUlNRUdHQlNMSkJFR0FWU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoFkVDQ5LTE5ZlxGQ0OdcGJHRaeXpJ+ew62cl6WYmqqclpubj6qWlaemla2smKKrtsTCvL63wcLAx8S/zca7vbmysLmzv8PItb+wvLa5tqakq6ytoaGaqqvFoqSpq6aerK+roqmpvrinrb+yuLfHtrW5uMCzwMK4tbO0r76jl6OXlJyUrp+QoqOlo6OfkL2kqZ6orJ2doZulnr2hmaOfoqmsoZ2XjZWek56Hj4SNk5+koJ61rKWclbGnma6mnZmpnZ+NmJSeg46gmpuSpaSamKuxtbGqpaqurJuYoKCSj5CVqJ6UZV9XYFxOSEdKTkxIRURJQT5RSUE8R0lIXFJPSz1IT1U0QkY5PkhHNUNhW0tCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNDZAOTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1SRjxLeGVhVkuimqOcnsWsoZ6sn56uoJOjn5akoKaprJi2saKqs7bFxL2/tb/Cu8jCv8rHtbi1tLGztLfBxba+sbi1ubSfp6yqrJ2enqWkwaWfqq6gpamtr6KmqL21prG9ube2xLO0uLq/tMTBubmus7W1o52llZKUoa6gmaKeqKiro5rCrKmerK6bm56ZpqC9oZ2kmKusrKaimo2an5OeiY5Xf5afpaGguKqmk5i1o56xoJ+arpadjZiTnIGOn5eVjqKklpCmrbKqqaKipaWVlZ2Yi4+RkqSeiV9iWGJfS0hKSk5GRUFHSz89SkI5OUpKTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtNnp+hmZ7EqKWitKKds6iTq6Wgo5+sqaydu7CorLaxx8XBwrLCw73GxL3EybyvsLatsLSvv8S0ubGwubSsmaixqaqanaWhp8Ktm6yxnKqjrrGppKi9tqe3u76vt8SttLPDwLTHtLu4rLS2raqippaVlaSsop+gm6ersK+vu7KmoKmpmZmYk6KjuKCho5KvsKylp5+SoZ6VnpCQjZWemqKep7OmpoyYs5uirZqdm6yQnZOVkpl/kaGWj42foZSLpquvpKainKCekZGak4WLkY2bnX9fZFpmZEpITEpTQkNASUg7O0Y/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+joJygw6mkqrOipLWqlrOtp6GksqyuqbuyrbG1tMbAxMO1wMS+ycS1v8jCtKu1qLC5rL/Es7eurLa5pZiqsquqmJ+ml627tJuosJutoK60sqerubOourS5s7nAqreyxL61x6i/r662tamnrKGYl5KmpaKimJilr7iusrW2oJ+opJqVlZSkoLeipaWWr7Kyp6qmop6ampuWmKifoJihnq6yoqaNl66YpKuWmZ6jkJqMkpaYhZWelIyPnJ2Ui6ipqqGnoZielYuOmY+BhZSIk553YmdcamlNT05OVD5DQU5DOzpJPzc3Uk9dX1JWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJb2hVQ1dGjHlmQzuko52ipr+np6+xoam2q566sayjq7S2sbC5t7C3uLjEvcPHvb3EwsbAuMDFwLqptqSsu63Bwre3qayxuqKUrbGtspakp5GquaqfprGdq6CwtLOqqba2rb2ttLO5uK25scO7v7+mxKuxt6+pq6unn5iZq6GioZGYorGvs6ywuZqcqaCal5OYp6C2qaajorGxtKyzqKyfm6Cgm56lnKKXnaOzsJqfkJOlmp+omZSinZSXiJOWkpWWnJOIkJqZlI6pqKafo5yXm5KFjpmLfYuVhI2ZaWdrYGxtV1BRW1VBQkVUQDw7SUE3OlhQZF5QV1dFWV9eTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNjEtLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9qJ+doqq9oqqwrKSyuKqmtrWsoK21va+zuLu6vre2wMK/yMS5xcLAv7jEvcG3r7Wnq7eyvL6+tKiusbaelquuqK6XpqiOp7ufpayzn6yisbCzrKq2tLW+rrCxtaywtLPBu8a3rL2wsbisraqjsqaepaqfpJeRmqCzqrOrqrOanaecmpWOoaaktK6ooa2urrGotK2yqqScn6iknpWimZuotamWmZKSnZmdn52Qq52Wl4SUloqdmJyTio2Wl5qXpqWjn52WlZeSf4+UhXuNkoKLlWRrcWdvcV5GWWZWREJNWERaOUhCNj5cUWhcT1ldR1teXU9NUlhkSkpDXGJfUEtNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVVxnSzaMemZMQKSaoaWtt6Wtqqavrreqr7W7p6axt8W3sba9wcK1tbrEvszGucPAub65w7jAubK0q6m6trq5vrSqrbC1mJinrKqsm6urj6u+nqyusqOroLGts66utrK5uKqur7Gota+1vL3Ks6q3tbG0r66nobSgm6itoKaWlpqasqKtoKavl6GkmpqTjqOlqLOpoaazrKu2pa+yta+kmZ2sp5qYn5qZq7ejl5ORjpecoZeWlKqdmpF/kpeMnZyZlpCKlJOemaWioqCYlpKTlXqLj4V7jIqCipFqbXdtdXthRWBrWUlIWlo9e0pGRDZBYlRpW01cYUtcXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVF9UXy81KENfUVwuK0IvSkdQW0czY1lUS0SZl6GxqbKqraakr662qbe1uqSstLfJu7S7ur+/tLO3w8DMyLzDvLa9v7+3v7yxva2nurm3tsK2q6yxt5SWp66rqKOwqpSvu6StsbOnqKOytLGysbWxuLSpr6yyp7evt7TExreptrassK2pqKO2oKCnsaGklJyZlbGep5ygqo6po56blpimpqW4p6OytayosqeusbaspZmgrKibnJ6clKm4nJSOjoqYm6KXj5iloJyTgpCUj5ybl5aViJaQmJqnnKSgkpaRkJV2hI+He4SBg4uKbG92dHt+XEtlbVxKTmRcP2J7R0k4R2dXZVxMXmNNWFlXVVdUaV1PT0hgXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2YyNydHYkxWJS1CLj1FTFE8M3JrSUNDkZqlr6Wur6uopbGztKu3srihq7W5ybmtwbvCuLOxtcLCzsXAwb20vb+/ur68ssSnqbmwtra/vK6rs7GcoKexraamr6WdsrWtq7GyrKmotbustbO1rbStqqyorKm5rrKxyMC5pbqwqayspaiusaalo6+kqZydnJuvmqOjo6ORrZ+koKCiq6anuaSstbalq6yprbC2rqKeo6mqm6Cbm5KktJmOiY2HkKGglIyUnJ+SkIONkpKcmpeVk4eXk5WZp5ufnoySkY2Qdn2NhXx7fIaJiHBycX18fVxTZG5eTllnXEZElltHO05tWGJbTGBiTlZXVldUWGddUVJMY1lbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6SD4zQkhTLD6QaztHSI+cqquiqrGlqaWztbK1trKyoauuvcy6rcC6x7G0rbTCw9LFxr7Asr7Awru+t7vEp6y3rLK3vMCvq7GsoKOnraqopLCjqrKqsKywr7Cuq7O8p7exsqmzqqulpaOtuq2qssO6tq27qamnrKmosqaqpKOuqqiinpyjrZWlnpiemaydoqepoq2mpK2ruLKyoaqioKyvsayeoKenqZmjmZmPoKaXhoSOioueoI6KjJWajo2EhY+Un5yUl5SGlpSTl6ScnJyKkpCNiX9+h4V8dn6FhIVycXCIdWtfWWBuYlFzcVxLO4R8Rj9XdFhhWk5kW05WVlVXUVxhXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnREY4O0IwNUVLWDFAlVk9TEWVmK2ooquznKqqsLetuLavq6arq73JvLC9tsKvsayzxMPOz8O+v7TAwsO6v7PIw6uut62yuL6+sq2tq6SnqrCop6ixpbSuq7GvrbKxtKy0vKS4s62sr6irn6OesLerqq27t6W3tqSpp6urqq6hqaemsbKkp6WhoayXqqGVm6CmnqWiq6Sto5+nsbiurqOmo5uqq66pnaKlpKSYn5uWj5ickoGCj4iFnJ+Lio6LmI2OiYKLl6KbkZCai5OSkZOjmZuaio6Li32GgYGDenN/goB8cnWLpId4a15gbmZXZYdjTj9nk0xFYnlXYllSZVRNVlVWVE9cXWFVS05oVlZXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZaLjBKZ0FBPDxCKzpKT140RIY9R0ZEl5OxpqOssZirqq22rLayrKasqqm8wMC3uLK7taayr8TJy9G/wLu5v77BucG5wMStsbWxs7rAvrKwrqyqq6i2qqaur6q5sKiysq+zrbeqt7entLerrKWpqpyknrSzqaiktLWgt66gqqiqqKunoKusqbm1qaqpqaKqoK2ck6qhnaCloqajqp+dp7SvqKaqo6OYpaenqpyipKOgmZigkY6PmI1+h4yHg52dhoOKio6NjouChZSimo2MmZCSkY+Tn5eZloyKg390hoF/f3h0gn55dn6Ah52Pb3JnZ3B3XGFziGtPXplWSG14VWRWUWNPTVZUVVBPWFtiVUhPaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjEmLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EPJaOsaKmq6+arKWtsLS1sKymsKqour67wLCuua6htrDIx8jRwL69u7vBvbrCwL6/rrKysbW8u8KxsbOrs6mktailrbOzubGjrriysLK7q7qwqq62q6qfqqyfo6C2ramhn7CzorWqnqinqaOqoaKsrai9r6yuraKoqKCsmZCwoZiioKennqibmaqxqqOgrqKhlKOjo6iYmqilmJeYno+Kh5WIfY2GhISjloSBgYuGjYuQg4OTn5aIkZyQk5CNkZyUl4+KhoZ3dIF/fHV4eX95c3N5Z3+GpHZpX2VrgHRniIx9U1hvXkp4c1NkVFFeTU1SWmZOTFZZZFhHUmhSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQDSRkLOhpaespKekrae1s7KrpbGnqri+wLyvp7mqpq+xycfI0cO8v764vb68yLrBuLCvtLG6u7jAsrK6rLisorSnp6yytrmzqKi9tq62vrC9p66staytnKmvo6ClrauonJ6rs6W0qJuqp6mjqZ6jqaipvay0sK6dqqShrpybs6OWpJylpZ+lnJupq6afnKuinJOcoqWemJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2Lh5CNj4N/k5qThZOijJSRi5GbkpWHiX5/cnt6fnxoeHx5dG9we2eEeISJZGFnYXKEem1neF1eVD9Xe21UYlBRWEtMTnJ1XUhaW2dZRVVlUEQ+Sk9EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0JKN0dTYFUqPTlEVz0qkJWymqCgqqaloauluLOzpqmxpqy4wb21r6K4raiosMLJyczBtr3AtLe/usi1wrWzsrWyvLe5vbWtubW/raCzp6ursLW4tayfvr2qs8G0vKGvs7WqrJ+tsKOcpqmqpJ6bpbGnsKCfq6mnoamcpKihrbyorrGuoaujpK+fn62ml5+boaOcn5yapKujnJulpZaXlaCjl5uXpayMnpGRkYuCioCAjoB7mZSNiHt9i4aPjYuJhJKYkIaUo4mSkoeQmpCTgYl9eWt+dnl4Y3x6cG9vcXZngHNqhGhlZ19sc41sYWlvYG89WnlrVV5PUFFKSU1UWldNXV5sV0RXX09eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBaFkxM1M+ZV9ETDZLVmRPKjsxTlc9I5SZrZqhmKilo5+opLiwr6SvsKmruMG5s62fua+rqLS6yMvIv7bCvq+0vbfEtsOyrrmys7+0ur23qLm4vaqjtKipqrGuurGqnLy9pbDBtbair7a1p6ansLOfnqSmqKKlmZ+sqKmeoKuupqCmmKOooLG5n6Oxr6Gsoa2knKemqZqam5+klZ2dm56qp5ecoaqTmZSZn5OZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo+JlZ6IkZWCjJeNkX2FfHNwfXF0dGB6eGhtb3BuaH1xY3ttaWViXWWFfl9ac2pxSkl/aVhaTlBMSkhQUlFJT1xfblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+L1dVNSiXnqeanZetoaGhpKK4qrGltLSpqLnEtbOtn7etrq2wtMbIwLa+wbmwtLy2vru+r6u9sLO+sLzDuai7urenp7WoqKuxrbOxqJy/uKatvLeyn7G3sKilp6+xm6GkoKWloJebsKehn6Oor6GfoZSkpKK3sKGmsaufrKOvmJyqpKmfl5qepZObnZuep6uanJ6ml5aYlp6Ok5eiqKKQiYuPhnqEfoSKeo6WiY2GeIGHg4eLjYWNk5iNj5aZio+XfoaYjI96gXpwcndvb3RfeXdka2traGeCbWVya2tkaFhhc39eWmx1aVlFfV1bWE9PS0hIUlVHMjpeXmxQRFdVWWVNSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJnW0hUQ1RdaEUuOzFeUSwylqSjmJadqp6moaOhuKmuobu4pay9xLOwrqK1r62tr7TExL2zvrq3sLO5uLq4uq6tv7O0uK+/wbervbq0paKzq6iqs6yusqOdw7emqbe3q5+zu6qnpqivq5mip5ykp5SYobOmmp6lqamcoaCUpZ+kuamkp62mnqWhqJOfqaGhoZmbnaGSm52XoaOsnJyaopaTlZabjpOTo6ekkIiKjoZ5hHyFhn2cjYmKhniAg4eIh5GFlZOSjJGVlI6OlHuCl4+Ld398bHVybWxzYnl0aGZpZ2VthGdnaGRmaGleZWJpZlllemJgUHNUW1tTS0lHSU9TQCEraV5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YUwnMp+kpZOPpaecnp6epLWtp6q6t6esw8C3r6yita6nrq+3wcC9scG3sK6ytrW5uLWsqry0r7KxvcC3rry8saSftqymprWqq6+hoMWsqqextaystLqeqKmrsaWYnaqeqKWSmqauo5mepKqhm6GcmKCdp7amr6quoaGenaGVoKafoqCZnJqck5qelaafrqOYl5+WlY6VmIyPmJqooJCHioqIeIV3goKCnIeKgoh7f4SIhoSQhJaVj4+QkZCRjJN7g5WOhnN/fWd5cGtrbGd1c2thZ2Ric39hZGVmZWlpYmZvWl5YXWxjYU1nV1tgVklHSEtNUlg/OWBsaUdCVVNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGJGJTWdpKGSjK6gmpmgl6W0sqOyvrehsca7urCwo7asq66pub69u63Asq+vrraus7mzp6u5sa+us7a7tq+5vqymnrWroKGxpauwoKbFobOmsLOwt621nqyurK6imZ2nqqaflZynpqCZpaOpnJqfnJWdnq2wprmnrqKhmpqemZ+jmqWdl5+YnJWaoZOpl62om5SenZSNlZqOlZSYp6eNjYqJjnuBdIKCi5iFhnyJiISEioyIkoWTnJKRkJCRl4+Qf4GNjYNwgn9neW5oa2pncXJrW2hjYXJ/YGRna25rZmpmZGxcbW12cWFTYmhjZVpJR0xNT1lRUFZhZYFUQFZSWlRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjQ8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUhiQic0lKOcj4+xnZuUoZups7CfucC2obTCu725saa2sKmupbi6uLisu7Ctq6u3qrW5raWytbGvqbG2trGztrunqaC2qZ2fqqOqrp2rxJmvprCxt7WsrJ6xra+qopudpKypnJWcp6SemaqjpZWaoJ2SnKOrqqm6nqekoJeamp6hj2ujlpmdcYOXnKWBdpKsqJ6Vl6KSipiZgJeKn494hZONg21pfneEcmyGioZ9hIqGb11kYGeEl4Zri5CUknV4i4R/g5CAZ4iAaHZpZlhdaXRuTlBqY2ZxgmZeZGZva2ldXF6JkIWIaE9LQzhFVGddSkhQUFVWTEhTYXB0ZUZbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOXEtbZmI+RzFOYTwrL46kmoiVsZudk6Ccq66ro73Fr6m3wri+vK2ntrGmq6S4tLOzsLmuqqestKWxtaKnuLa1qKettrOutK60oqmftKueo6Wdp6ibsL+VqKextLmtrqSoraqrpqGfnKGoqJyXoaamnJynqJ2TnqCZkZ+oqqO0r6Oio5yWmJmXo4ihj5KaiKGIlZ+if6WAqK2flJSelImEcniMjoOIoHWIjWmXiWZ+c3mgb4eHg36MfH+hoJ+Zf3uHnnSIjnabimyHgoNuaWVke21yYlSGbWNtaZhxWGlwboZXXWlba2paiHBteXKHaIeEWV5GTT5GXk1FUlZWUVBSV1RnXkxaTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTlxMW2dfPUsxVF43LyiNp5iEnaydmZmdn6uqqKq/w6+yury4wb+qpLexqqymtLWur7O2q6mlsa2ltrObrLW2tKanqLOxrbKorp6robOpoKSlm6KlnrG4laanp7e+pqynqaqrp6aioJmhqKSamaejpZmcpaqWk6OclZSkpqahtqSjoKSYlZSYlJyIrpCYlYqqjJijnYaxgaWunpWboJd6gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsXlobFixrm9labySvG5oem1wj9h+U2titrJ+gHGUdZqhqpBWTlhhT1ZORlVcWFFQUotcV1tQQFxEUE5DRkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV5nXD5MMVpbNDEhj6eUgaeqn5ednqWtsqmxwr2ytcC1uL/Cq6a0ra2pqLC1qrC2tKioprWlqLmvnLKytqqlpKeyr66xpquep6SypKKhoJecoqCyr5afpKG1uqKqqKCsraSinZuao6qgmJupoZ+YnqiokZynm5SeoqejobCjnp+jlpeTmJKZha9raouOqn9ohZaHrWZxn56Wm6iXca6hpH53unxsoY92sV9qtFulgGWckGBmgXpmf2l4aqllvnJnpox2sWp8sXh1kZRjbW2nblyEoEVpZ4eWRXWcYH1me6Omgllfi6tof5F4emqoOEqvW1hUbWNaTE9YX1xXVjtOiFBXVi9JU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWDMxG5KilYOtp6Wfo6WrsrittL2+sLfFsri7w6epsKywqaqxr6SxurClpa+zo6q5qZ6zsrCjpaGqrbCsr6aon6OisZyjnZmWmZ2esKmYnKKgtbOhqpuhrKyfnpqXoKOqnZmepaGdmqGopJCdo5uYoaCsn6WmoJqgoZaVkZeRmoa1m7V5hqqatpl3h7Obt3+Ul5isl39rgaZ6gYWHkZSSd6tnarFbrHuOh5R0iHCOhoB/iJCXeIOCipeMg6CPhbB2d59xa2ttfItPpVhIY2OZfmNopV95cXVSkodeUKluY3F8hoBhnS9Som5bVGtnYExLXGRYXFpCPrB3V1hBI01pRkJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7Ri0wLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVQ1MByXoJSJs6amoa6pqLOsqru2wrC8w625t8Krra2vr6evs6qir7yroqi1raOstqWlsrOoo6Kdp6qzqbCopp6goLCWoJqWlpeboLCjm5qkqLWvoaiPqaeqm52WmKCmqZqfnaOgnKCjpaSWm56Ymp6jq5ulmpyaoqCWk5GTk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKPnY2ke42GooGlgnqseY+dVq97iX6farlauXeFhH2mgpR8mXqqeY6dkHuxbY6EdJC7hm+VUK+nxYpRoHpjYKpic3KHbJeHX1K1tMiFf4l8Y6QzQp11XFBqaGRQQFhmWWRhSkhNa0pbU09ZZlpDQz9FPzA8PDU5PDc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbGoqaWzqqW0p6S8t8GwusCyt7W9tLaosrGksrOmoK+2qZuouq6jsLKhsrSxoaSenqipsam0qaWcnp6sl5mZmJiWmaKsnpuXqa6xqaOejqyip5admJyhp6KYoqGioZuio6icn6GelZmbp6GcppSbm5+gmJCSlZCdiLJuaLVxq4hwjqdztHV0tnucmaaOkJ2No36PnqN+sHWDkdLSdVyufIV/pG6bqqZqhoV9rX2YmZB7sXOTnY95s2WWdIWebp9mlFLJi1rCXJ95Yl+tX3ZzhmKXiF5Zyp1vwIB0TUu1U1XGZFVRamNlWEFPal9saVBVRkk5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqOekaWvraWpuqymtaWntru8sru/uLe1vLy0prW1o7Kyo6CssKWYp7qupLKxnbS4qqClnaGqpbKorKqlmp2bqZ+WlZmZk5SkqqGYk6ersaahlpKsn6WSlKGcpaeglZump6Kbo6CumqGenpCWnKOfnKWUnZWZop6VmZaSm4WsfHiodqOPi4epcK6LhKiEmpqji5Oai6J9kpeHroR/grNccrJTr32CgqN+cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnmIhqXa93lZ+PeGw1ecius19DVG9eZ2BFUGxfcG1WVU0uZWNoUllQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdCYEk6NzegnZSft7GZs8GsqLKnqrK6uLS5vrm4s7e+tqa5taG1raCgqayglae2rKixsauttKSbqaCgqKK1p6aqpJmelaWilJScmZKVpKeblJCnrbCloJSYqZ+ij5GimqmmoZWapqmenaSfrZ2hnaCOlZ+cn6CYmJyWl6GglJiRpp2HqX5/pnmhj5CEqnCtjYKnhpehooqYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKeBjpuNkqR8lZCfhHuyXpxkoH2ClW6TXKtcW5N/kX9oZ6pjcnuAapiGcV6rWomgj2tuZU9KQ6FcWk10XWJmTVphX3J0X0pVNkqakVhIRT1HRUFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxPZWRBJlVmWz8xVF9iTDdGSF9DMT03op2ZmL6tmLPCrqutqKa0sLixtb+5urOyubyqu7ahsqWfpqenn5Sqsamwqratqq+hmKKgpqSkuqOjrKGXm5GjoJWVnpqUmKGhkI6MqbCwpp2Wmqemn42SpJiorKiVmKmon5+gpK6joZ6hjpWhmZ+gkpyXnJWdoZWWj6ubj65ucrR0qYx3i6Z0tHp1tIKUpqSUnY2JpIeOdbhui3uLomtrtlqhhmWXl2igoqdtlHK0c5OZf7NqhZKIrWp1tGGdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6YhnBcr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBwfGNTWlE+P2xvMkJCQD5NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFBOKWam5y6o5yxv66tq6unt6m4r7XBtb2ysbu4q8K3qqyhnaekop2Sq6untqOzqK6qoZedqKClq7ido62clpmQpaOWjp2gm5ieoJGTlau2sKaZk5usqZeMlKaapa2jkZersqSgnqissJmho5CZopegm5abl6GTnKmdlJCqmYfUlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsKCmrJhg7p5wHx1uGK1gYyHqX2WgqypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gYptmohxbY2kdL1dd31bYXm8alpWW2l5XmlhZGZibXlvWFtZQ0FAcT9DRys0SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTxMXC02QDmnmp+hu6OYscOvramqrLGoua+3xbG7s6+8sK7Bsq2mo5+kopyckaqlqrKktaetpJ+WmquZp624naOumZWhkKagk46do56Yn5qRlpOvubCrlZejp6eUkJalnaStn5GgqKufm5+ppLKeo6WOp6KVopqcl5WkmZCwoJKVqp+FkJm2gJKSjbiWeIOTm7Z3bmxvdG95j4SOiXKewbu8mXqBsqhwgHSRuYN8hoaKh417ioaNl32ku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycXe2jF5/eX2JZ4N5bXlii6xwdYV/WFunaURkWVRmX2NdY1FnZnFtdUJNT0xEO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+nlrPCs6uqqKyrqruvscavtbSwuKe1ua6rpKKnn6CdmZSspK6qpraoqJ+clqGknqylvqehqpeVnJGim5KQoqiik56XkpiUsrW2rJieo6Sii5OSppymq52WqaWmnJmgqKeno6mhkqyel6Kel5aYnZ6QsKmUnKeij2t/apypeYl0f5uPdntmh3u+v8C6b5KDcZSFX3JqWl2aiWFkh46Va2B/lGNtnHZilGuAmpWUZV5gY3GaiWhyjHyGlGZqfnF0eX59Ylt4dIFoUFxug3x7impYbHmBcklKb4VwTnNNRFZcZmBMWldmY19PWm12anJST0RFTTxISTxMPjIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPlxPJz8yPqifqKHCpJq0ubajrKaup6i1sqzIrLC0rbakvrGzp6Gkqp2jnJqarKeupKW1qqSbmJWinKetqb6oqaWVlJuWoJqTmaapqJGfkI+YnLCyvqybp52noomTkqmbqKScnKyfo5qaoqesop+qopqum5WmoJeVnZ+dmLGlmaKomZ2Sn52kppuopJudmpybkZeCaG59cneRl5SQhIm0qo2FmJWOioyYloeUlYmDk5OQiY2RlJmTmZean6Gam5Sfm42CeqSFbGl7kX2AdYmLgnKCeHl2dYqAe4lqc4J0g3Vkd312a3B6bF9iW29nTVhZZmpfV1lwem9tZlNPRlI5UFpOUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsbG3oKmms6elsLWqyautsqa1psCotKGepaacpZaWoKunraOkt6ygmZeWoJitqqbBn6yklpKcl5+YlJWin56jqJORmaiossOvmaucqp6PlpapnqucnqGtmKGbnKGlr6ahpKierJmXpp2ZmqGenp2woZ2ip5aZlJqUoaOXpKCZoY6XlYuLjpCYro98lZuCkYGJqaiGgJeWioSOn4h7hJGGhZqRh4aKlY6bl46QmJ6jlpmSkJyNf41lobOuhImEd3uQin53eXpvZ3mQgYCJa3WBeYhyaXR/eXWDh4FqdGN3ZV9oZGNkZmpYa3txamtcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r7+tq62xsqCqprKtoqyzsMawq62ks6+8pLScoKijoZ6Zl6imqaakprO1npWVnpqasKauvqGsopGRnpqalJKWopyXqZ2Fnaqso7THs5+ppKqWlpiap56pnKClq5Sfn5yfqq6opaOroaybn5+hmKSenJ+dsKSZn6mUmZmek6abmaqfnJdmhJN9ZX+Pm5BjeYxsaGp6kKOra2SZl35nhYplZWloeo2ijmtojJeRondraouZop+Yc2xueoSMhnlYZV2Fgl5si4qCd1xnc3d3kYCHgm94gnh/c215hHN3iIiOg3tphVhdanNkXXOIaWt8cW1jXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSi42Wk82KUVZL0RPMVlCOz8uPaWfur26r6yzsKulqK2usKaurrC9saqopa6wsJ+tmKCknqKamqesnKyjpqips66elqSQo7CmtrmlrqOPj5qimpOSm6CZmaaWe6Wsoqi0w7eloqevn52VnqOeo52kqqiSn6Cdn6qvqaqjqp6nm6aep6CslqGcpbGkl52slqKfm5SmmaCsmZ9+vYSJc7RzhZ+GrWh3ucS4cZKho3ummJhzqoJ8y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXyBepGMmsLAfWulsm+NgW/Ken+bd5GDjoB3eYGAeXF7gIZweIWLk3lsdZFiZV53Y19lgGJedGhtZGJYS1ZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2FfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziWornDtLCvv6mplKOvqbCvraaytq+qpqemsaugq5ibo6Ccm6qnop2roqWopaW0pJ6jk6aurLi0p6+ikpGZnaaTkaChmJugnoimq6Srrb+/saGpr6mWkp+eopmjpKqjk6ChnZysrqirpqOipZ+kpZytqZGkm6muqpyeq52uo5eYppeipJidf86UenulgnqWl5tfrY9djqiAoaF9p5WbdKuDgK9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq5Zo81ukHZ723t/mXF+iJJ1f2V7iHZ2bH6Hbn2FkJF9a4CMX3Bqb2ZgX3hkW3FoamNmYFJUU1deSk9DNUFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrMHAv7S0sLeYnpGjqqmttaymsq2srKSsprCqoaecmqaYnKKvn6GfqKejpqGfsKybnpamrq2wq6isoJSSm5+lk5CfpZedqKOeraOqsKi/xbOoqbGulpOenKKXoaqqn5Whnpybra6mqaibpqajoKqSrLOWpaKqqp6kp6eisqKTm6eboZuVlJGXoHGGjJh2haiHcbF8nXGsfaCggaWPnnirgn6tf51yrX+sh4afdpiSe3yXfqqIoYuRi5x9q3qIko+ff3qtVpzEe5Bwk8F9gZVtdXCMbWZ3ZYZvYXducm6IipCPg2yPjmRtc3VvYGZtZF9vaWpuZmNXU1xgWlJSQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txseys5+do4+joqKtr7evqbGnqKqorqurp6KknZqjlp+mq6CipqCoqKOfnrCtmJuWqKevrKinqZ6XlZqkopKUoa2anaejr6yirLWpucyxraauq5aVnJ2imZ+urJ2WoZmdnamxp6mom6qoo6Gqm6+xoqirrqaap6urq7Okk5ikppuVkoWkaqR1inqpdXuycYKlipiMcIigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoGjfal/gZSGrl57qFWdopKBeqOfgHzEsMWMc6+0s7lyYqmvwnVojIuXjoFsmJBubHh4d25rZmRkcXFme2ljXFZfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwsKmto6inqqurqKSmoJuln52mp6aknayaoqyho5+vo56bk6qktbCuoKmbnJaVp6SRm6Kon6CmnLCloqixrLbHsbWprKmVkZ2dopmgpbSdmqGUm56nq6mirZqrqKGhqaKzraKqs7KinKupsLC4pZSXpKiZnZJ8qmyehIh2q3l8sG6CpIuJn5aVnpaB0ri0uMmBgrJfYZSpg6WIh6B6mJaaearJdJqjlKeokJKajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4OTZI6PnJF7b5WQfW55dHx6bVtlanJxZoBqXmFYY21cXllJTExKRURCQT1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKuraWinbO5rKuhppuopqqsqaagpqWYqqOfrqydpqGtmp+ppZ2ntaCjmJSoq7ayrJumnKCWkKatkpqcp6OgqqeuoaOnqbCzwbGyqa2olImYnaWboqSvppehlZebpaWpma6cq6aknqujtqyhsbmwnpywqLS0taaWmamkm6GPgp1OeJqCgJ96hKN8gqSEhqafnJ+UhLh8fHq5gn/MxsO2d5uikYuffpmXl4p2n5eKpJikp36vhZuDnoSsfZmUYaVso3CPhZCBfZaEcqxgpHNxgJphvH1SVXWOkaKWe3yRjodyeXKDfXBcbG53cmqAblpjX2huYmRdTExRU0FIR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Kss7Wmn6GVpa+urqinnqWlmqSnobKuoqmns6CaqaSUo7Wjo5WXoam1uaSco52jk5Cispmem6aloaKvrZykqKK1scKwraqtqpGHkZynnaOknaWXnpiYmKWjp5itoayipJevpbusore2rp6etrO6s7Wpmp+xoqWfh4/RtcO3eoeOhZGTj4CmeJSid4yhkoWlg4tyq4eGtG5yaZmknZWKn32XmYeHkHOugqWbooymipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJycn6fYnOyuGh3j5Okl32Ki5CIdnt4jYFsaHdpeHNufnRcZGRtbWVoYEpaV1g8SEY/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK62oqOZlaOpp62pqpmlop+moaC1p6Kpp7GklKujj6StpJ2QmpqqtLSknaacqZKUl6+goJ6mo5ynnLWZoKqjtarCr6mrqaKMhI+coqGmo5aampyYmpelo6WXqaesoKObrKa9rJW+sK2fo7G0u622qZ2rtKWpmXuokX18sHiLgKSliJxtsm+hh618oo+DqJeagayJhq2FoJSooKOXhZ+BmZaBe5J+q4GdmZaKqnedoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2lbHKFmV1gW4ygbZSQpZiCk4uTiXh5gZZ+amx9Yn10bX95X2dlcG5nZ2hCWV9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JODE1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZWVVFIRklKIygovJKbhKnGw7bBtJ+araCuuaajjpqjo6Cvrqmfo56drZmeuaCjq6CvqpquoZGqqaWWiZqPrbCsp6Com62YmY+toqGdpaGZpJytl5+opbaovq6kqaOfjICOm5ugpp6SlJmak5mZpaOimKeqqqGjnqmovaSXw62ro6Kss7utsKmjtbGqrJl2r36QipyFh326rYmYZLCMZZatfaGPg6eXnIKti4WwhqeapKKikYWgXGxrgrNgf617e4KAsWxmbpmXi4ixWn20XKSDa8iiZp+Be7tZdrVasn1Tr4F6rFiAoW2XjqeZiJWOk5R5d4ybfWNzfGKDeHSAfGFqZnBtZmVlT1VjXEFUXj1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vbu0wbOjnK2mpbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVrqiijoibjq+sqaejqJmuk5qPqZqhnqWemaOipZieoqixqLuupKienY99i5uWoaCZkJGam5KZl6ien5enrKWkpKKkqbqfoManpqmhrLW3rrCpob6wrq6XgamSo66Om4CGpJeYkICAuMO6g46dk4SomZ2DrIuDr4qonJumq5F+1b3CqmKkv719f6OCg9e6t7WElJKCnr2+hGqjgW+rhG6df3qysceDa6uwva15eKK+u3SAlY2lmo2ZjpSad3+PmXlifHpkjGd5gXtga2VramFQYltTaVxAVGBCTCk8OjQvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0sb+6sr2zop2up6azpp2Ml6W/qbavp6G/pqaym56xnbmon62vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp6nm5qgqKKYnaCrrKm4rKejmpeTe4iZkqabk4+RmJiPl5OomJ6WqKeeqKahoqu6nqnFo6GwpKu0tauyrKO+qrCwnHR2qqS3hWWJn3BnrJCKj25ud6WPmqCBdrGbl3GRjnKXqaSbmK+kcmxtbWaLeG9ug5lxgHppcGlniZaVl3FoaYWGZ3CGZF2KY2lvWl1nfnimYGJyj5JwZmSAjZKOoZaVl46Tm3qFjZN0ZIZ3aIxqeH55ZGxjZmxiS2VXSmtZOlBkRFAnSjkrIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6ubKzqqmirp+ks6qZkr2xw8e8tKmev6uso6Cnq6C6o6StrKymjpatqpCMhZWXrZ+mqqKfpKOgkYulkqeZqZmWo6mglpylpaauuaqsmZqTknuEl46ml46RkZiUjZeUppOdlqeima+mnaKsuaCwwqiltKessbKrr66qvKawuZeLoamltZyJlqKYhqmbkJSdkqq0mZujrKK0mKSin6KjnaKlopasp4ySk42Hk52dlZCZk5iQjpWEf6Sal5WOi5OSio+GhH5njIF0g3d0h4xxp219lpOUlIGBj4+OjpySnpSVk56AhZOLcGiPdm+Kd3Z8eWlsZWRvY1VhWEBpWkdiYE5YK0U9KyYhNjQwLx8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbeurqKwpa2gobexkY6qxLzDubapoaSdm6WdsKikt6edqbSlp5GYrKOLiImPnKeWraShmqienpOVo5eomqmZlKago4+ap5igtLmnqpiakI18gZWMoZSLlZGVkI+Sl6SOnZinnpu1o52mq7eor8KvpLinsK+xrqustryjsb6ZkqakprWikp2mno2pn42Sn6KtsZqhpLKrspqmop6lq5+fnp2XrZ6TmqKclJCXq5mNmJiWkJaekYegnpSUhZOMj42Vi4F/Zo2IdYh3eomEdJxqiJKWlZKJfYyWkZGXkZ+QmpOdgoaXhXhxlHJ5iX9xe35qbmRfcGlgXF9ZbWJQYGRPWDlGRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7CzrK6jqaetoKi1qpCPm6Oyua2qq6GimXqcorGkprGplpu4paKUmKmcjoaKiZuikK+epJaooKGSl5mbrouqlo+omKeMmKiOnbi1o6WYm42JeYKUjJuTipWRk5CNkZahi5ycp52et6N/g6+1o7CwdaS/pLKgeHqirbW+l3eupaCKgKl+ZFxidp+OpJ6Dln5tlLSco6ivrKVmoKGUdHqbmHCBmaqZbICjqYplnKWckZeYlouSm5CEnZuQlIOTh46OkomFeGuQiHaHcXyGgYFhaYmMlZOMW3aVkWdoj41xeaGWlWR4mIWAdpdog4mCbnl/anBlX3Zva2tnXGVjYWFvUlk9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHR0lLTFRVVVldYGhmZ1hRSTxERzw5VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqWprqSnraWSlqq0rrClmamlqpdzi52vn6irp5SWuZ+gj5yknpF+iIiano2smqSVp6KejpeRnoV1ro+IpZqokZajiJu5s6egmJiLiXV3k42Wk4qTkZCUjI+Tn42ZnqWYm7KWgIybtZ20jZKPvaehfqeje6WxuoOOj6efhIuFj7Gpr4yJlqKaeYCLrIacnqOpq6mJloeZd6ace4icgZing4F7nbN7ioagmJmVmJaBkJaWg5maYnmIkYSOj5KLhG5xkIh6gnGBgYaAh3SHhZeTeJZok3SgmnR7mYKcmoSYfpGIgYKYaYyMhGt4e3FwZ2R4bmlsalxkaWllcltcSFNMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaWZZUUg5REw8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpJ+mrq6rqK2gqbGnp6mlmZStxbyvoJSlp7Sdj4Ocq5ymoqCNkL6emY2fmqGRfYaPmJeIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqTj4VwdZCJlJCKlI+Om4uOkZ2QlZ6jlJ2rh5+0ibSarovKiKuvireFjbCEs7GFqY6nmI2dfKiPcnt3nI6mlmiVpHm0jKCgqKqTmcKCgKuJmaFynoCbpX2XhZWzgaF9oZOfj5iXgI6UnImYkot8hZOGjZWTioRudJKGgHtzh4GEfYV1hoOYgY/FZoCph4+iap2BnpeAmYCKi4OImG+NkoRnd3R7dmdodXBnaGteY25sZmxYZUZdUUwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQElkWF1jZmhnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6OgsKmpqKasoKW5samrppqUnqKkqaGUo6m1oq9/oKacpZ6diZS9mpONoJKdkHmDlpWRiKuZnJuaooWPjHebnI6gkYieo5uWmJeGorispZmbjY1/Ym2Pi5OQjY+MjJeLj5GejZKeoJigp36hp4etnaCWrpCgnp2Rh4Kgja2xiKSOq5qMmn6idoCZlGuBq3VNq3iHjZ2SnKqpgqqrfoShfHunap6Ak2xnl4aYt4mefm5gY1iDl3+Me2Rni3OZfXmXbF18l25gU3GFXGBteoRgWWWCfoWBmXGoq2uDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbXRxampvXmpvbGtoV2dOXVhFOUA0R0ReazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpbXV9XXl9jdWBNRTpNTk1UYlxbZmZpaWJiZGFkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJeeoLmhqqSmrJKitr2rrqKZlp+gpaurn5yttKGnkaCfn6abmY6ZtJmQi56MlYt1gZSRjYqmlpaYn55+k4WGrKSHnJGKmKiYmZmRh6WvpqKVmYiJgGluiIeLjo6Ji42Ri4+RoIuSnZ+boaV/k4GPo6GUoHeclpCng6OpgIasr4eleot9hJp9onBzk4eVe56MeW2HnIyakp2qnI+HnX2DonR3pmeefnelXph7fZNzom6Yt7S6c5KIgYC2qGSBxrh8cJW2jHGAm6NjdKyrYX5qnbN+bn6Ig4+DjJhxgKNsc6RznoJ+o16cmbOWb3uXnrN0cluesoJpYm9zdXFpb1hra3JyZFtnXWFMRD1ENVFBWnAyPFJHX0pSPTwzOTU6OjZDPDtASVA/VE5OUUBFX15bWVhgYHtkSUM4TFdVVmNhWmZma2tiYmVhZGNgYWJgZGNfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi1ra2gmqGboqOkrJqasayrkpegmKCkmZqUnqybi4mReIuFcYCWjYqPoZCTlJ2XfZGJjqigh5iPipKik5uajIqop6Sej5aHhH5re4d+fY+Ng4uQkImOk56BlZufnKCfi4l3nJiijaByoYyJqYmdqJGYqq2Arox9eqCZeaOTeIBzl4iMnH2Vn4ecjpqdp4ijZKF+ipaQm41tnmibjm+amXuAiqd9cmh0qoOdgnOqZ5SaXZuFdoWdaKpqgbhmXKlwgZxhlYxfp3Z3ioqAnWiadYeTkpiOf55tmZBqpplcqH53u2p9qVqOhF2zZ1tucXh3a2lbcGl3eGFeZVZhQlBFTzdWQlJuNEpaWl5OWkRAMTUxOzs3SD86Q0hVP1lTWF0+RGJdVmBRYWN8aUVCOU5bXVhkZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FgZGVla2RjaWhna2mWnYmqtpyoiWOVnKy7srCrnaWbmqefnayZnbCnqp2Wopmhn5mWlqCjmYaJjWmIgHJ7l4eMlpaEkpSYj3qKhJaknYmVkIaLnZGcm4iPqKGfmoyRioCAaYGGeX+WjHuIjY6IjpWZfpKhnqCik5hyaJ+KoI+McJKMgqmJmqGlqqOqfrCtpKK4l3ajs6Kjf4iUeJ16qpl/oo+enZiJmHKhfYeNsLV9bJqRoXh+mbWjo6uohJl8mnycmn5zqlpdb3uXi3ieYk1/e3uFZHqYQk2fWaJqc3yOb4KKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B8fW5mX2xodXtiY19QXVZcVFZAWUVRZ0VSVlxhWF5JRD1COD9BOkhFOExFWEFXUlpWRUZhXFpgS2BtfXFFQzxVXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGtplJ2Bsa6ahFNeoae0urOzqJqii5qpm5unkqCro6Cnj56dnJqZlZihnZaHh4l3hYFueZWEkJuLfZGTlohygImSoZtykpCBiJiUn5qEjqibmZWLiop8g2yEhXGBoYx4hY2Ih5GXk3uRop+eo4iuhn21hI+enXumlnqpgpeekYyjoH6naHdtfplzoHNxfJ2FmG+Tgq18o4Snn5uCpHBeqWh2o2RwpmGc0498e5l4cnNjooaQfqJyoo91a4+zi2CCmIp0qrKovH93g25/v6aqtF6cb39yl3CCc6JyXqRndKZgaKZsmtOYeoKbbnZ5l2ubeXaXcmyppWdfZHlwf4NsaGZkbXV3Zl9hUlplUFFhSFdJVF9XU1tkaltkUEVDS0xKS0FKRDhQQFBNWFNYT1NRYGVlaVNkeHl3SUZFY11lWmhpU2loam9jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7GsVF1LfqmvsrWwsqOcmISXpqCgooykp5+XqYmZl5iTmZOSoJeOh4Z7cH2EaHyPg5OagneRjo+KcICGj5OSbJiUfIiRkqOVg46pmpOSioWJeYR2iIBugZ+Gd4CShYeYoJV5kqKjmaCJs6Gitot6rKekrqVwqYCbkYaBnpR9pIGimoaYcZ6Eoq2uiZeLf4ykjZWDr6OVd7W2tsmic5SLgp9gnpepbXmWh6CbdaGHd6B+kJaLgW9MZqOScZuIc6V7enVig4JtfqBscmRgnHN/dJdre2q0trTGpnOYfnqcapqaq3SBmmxzd5dpmXl0l3FQRH2zXmp2a3iHZmtmYnN0cG1VXFJYZ09SaElVTFhSVVxna25VZ1dNSkFKTUtIS05BUUpQZGNqbWV1c3N+eHtudYl6e1VRT21eaFxraVJqaGlsZ21nY2VfXFxcX2liZGhre19dZGdjamZubGVpbWWinYmwqIVlQJShs6yvr7Wioo9/lqeioaOLpKacm6aCmpeWjZeQkJuSjoiDeWt5hmWDjH+Xn3l1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJeMkYuAiXqAfYt5cI+ghnmBlIaIlZ6UfpOlp5yWloRnbnicbKJkfHKleJyYcGingpmOfaV7oZeDlnKfdoCJlJWPuW2PiqJifZmjl4luc2ura3WgbW+mYJtpi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXBkZ4iCb3KiW19bZKFuXomMcXyAdHJkpW54omRmp2iXcouXbaFvUoiPbqBeZKdUi11UmG1tcmtxgW1waGt4c2tvUVZVVWVZU21JWE9cSFhoaHNqWWtWUVJFVlxNWFNhVWhqXnd1e3xwfXxygnt/c3eOgIR3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqrCxpp+Lf5aqnJ2ki6GhmqGhgJWYk42aj4uXkI6KfIZxgIhoi4p8l5pzdYl9kHxlg4eViomVmoJ8iIaWpo+AoauQhZCKgYp9gICOc2mPpYR9hZOMh5efjYaRqaadiaZ4lpx+pYmWjLKZnpGEr5efpXmYiXupdaeQhJpupaKMkoSMg7xtfKWvgoeGh5WXnaJ+pntyqJSglmiffm+sY5aKlpN4qG2qo4GJdYiCd6uRpohrkrFsd7OMqWyLhm9voJ6SlWJ/q4yqd4GAjqefd599haSVnaBomod1q2aerYy2c3a+jKOTWYOmjathdXJ0b3t1cGJqfm5nbFNVWVVgYFxrTFxSXEldbG12YFtxWFtfWmdzZW5vcWNxdGB3en55cnmDcoN+gXt7jYGCgHdieWRjbnNkUmxnZ29tcmlnaWFfXlxhamJsbHtvXFxiaWJtaXdtZ2xuYpamq52BgJ6klqmqnqinrqOZiIGWqZmdo4mapJyonYSLmo+FnJGFko2MjHSFeoiDb42FfpeTc3WGcpGDbn+LkoeGlJB9e4KFl6SNf6WljYCNiYSUdYKHk29si6iAgouTjYibnoiLkqqioJCAdJSXiH6BeZSvpH+CnHGPhnmSjYaAe3KojXF9fXqXlpuEjXh7fX2IlJWTi3eRmaGihXx/iWuMhVx6eXN6cWlvfpOKcYB0go+Uk3GGhIJljX9fgYGMeHd0lHVwem9viW+Fhl93aXiOZ4KDho+qnH90fZdqiYhvfnV8g3VtbGaMc3h7l3eEWmpXeY9pbndycW93eG9da4VtaWdWWV5WXGRrZFVhVV5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV5gnV/gH+AeYuFgn58boBtZHluXlduZ2l1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbqpp4uhopumpJmknauioIODlqqRnaCJmaaaqJiDgZuLfpaUh46KiYxygnyOfH6PhHuXjnRyhHCVhnx9kouGho+GeX6AhpijjHunoIqFj4+ElYOGjph3cYSqhY2RnI+Hnp2Gipqon6Cqg4mOlZt/foqXraiQk6iReHGfk4R8lHB/qodwfZVxam98gZ+Lf5GOi2huXYSNjZydoJBzl4yIcXRrg3Z0gFlyb4eRgn5/jGpdaWR7hYSIgGBpeHucfIONg3aCh4RpeoyJbGJxc4N3X3ONg4qRqJaHZ42Pg253i4Jvg4t3bWRlY3mCepVaW2lmbXZbe3l3dG1zcoNmXG2Ka2tiWVhdWVhrcVteYFleXWVyfntzb3Rjamppe3xyend0ZG10aGx7f3V6fXt5eX+Af3CGiYR7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsaGQo6Gan56Ynpmoo6F9gparjJ+Uh5qhkKSVf3uYhHySmYmIhoaKcn2Ai3aFi4KElopyb4BymIeEfpODg4aKgnqAhIqan4+CpqCGeI6XiJWLi5yXhIN6rIGQl5mTiZ2choehqp+hoqOLiJObnaOZlquiqKehk5yJmZB9epCQhql/f5KRkpOcsaWalJ2PjbGSmISmjY2WnaGKkZ2DiZKKbH2Od3dmg4aRi3yJnoWHi4+IiIGFhJF3fHt1m6SKiIugjIeWf4CNg4F3cXWGhX95iYiLkaeRhIeOiIOMkIt6hYmHjX91aoCDfHmZaXFoYHOKcH17d3Zvd3SBXV5vh2duX15ZWlxSZ3FVY1tbYWxodHt8cm5wY2ppaH97bXh+cGhvcGxmgHtygoB3f31/hHttg4yGfHp5fH16g3hOZHZqc25xe2VrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqOhmJWZmJSYpKCde3+YqY2djIWfnIqdlnx4lIJ7jpmJhoOEh214gH9ygId+iJOEbWt+epeHhIOQfoCGhId8h4ONm52Rhqmeg3KKj4aSkouckXyNe6mDjZGXlY6bloWFm6afopqdhoOSmpmZkJmmoaaenpCXgpOMeH2Jj4WnfH2PkJGFmKmgnJOcjo2pjZKAno2JlJughI+Yf4iPhHB5hnJ1YX+EkId2jJiBg4+ChoR+hoSVbnp2dZSkjI6Gm4aGkHWBjH5+c3N8iYV7eY2PhZSokIeEj4KDiYmIdIOGhol6bWp8f3ttaGtsZ155fmd8fHZ0dnV6d1xgcH1tdGBjWltdUGZtU2VaXWFqaHV6fnBsbGNqameAf2tyf2tqdG53boR5boaAdoKAfYV3coONh358e3yAe4KLYGl7a3ZoaYNlamNgaVxjdWdvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5OSlpeLmp+enHp3nKWQm4mGpJOKmJl5eY2FfImRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hoSHfY+Aj5ubkIimnH9wi4uMkoagoYqFjHynkIeOkZaSlZJ3jKOgoZ2Wmn+BkJqZk42ao6Kkm5iSnICQh3uBhY+IooF+jY2QfJekoKCSmZCQpYyPgZyRiZSYnH+Tk3+Ij4J2dYJxd2F+gY6Hc4qWfYiMcYx+goWGj2h4cnmNmpORgJh/iYxzg4l9fXJ6fIyFe3uSjoSXppSNhpF8hIWGhHSAgYWFeGRxen54eXBramZefXNnfHV2c3xyf2peYHR2cHdkY1hdXlJqaFRlWF5gZ2l2eIFxZmtjbGdlf4FqbX1nbnBqfXeFemuLgXKBgX6BdXaCjYZ/fHqAgX1/j2pyg250aWKIaWxiX3FWdG9sbmB4aGxXanR2Y3R6enFia295iY2fs5Klpp2OkJiPhpygmpt8daOfjZd/jKGKiJqWd3uGh36DiX6IgoF/cH56dHWChX6JkHdnY32Gl4qCio14fYCNg3mWgJWXlY2Vn5p9b4uBkZOFpZuHjImDppWEkYqVl5KRdpGdoaGYlJh6f46Yl4+Xmp2lnpqUlZ17koiFeYeXjp9/goqOjXOXop2gkpiOj6GMjIOXmIOTlpp/mY59io6Cd3J+bntkgHyLhnGHk4CRgmuHg4GAioVmdm99iJSajn6UeY2LfYKJfnxygHmLhnqFkouMmaOXg4SMd4eDgoF1en+Gg3Ned3d8c313ZmtjYH5panZzc3V9cXxjY2FzbnVybWFZX11aa2RSYldfYGhrdHmGcWJqY2xmaHyCa2h0aGxvaH98gXlsj4VxgIODf3R8g42BgH56goN+fJBtdYl0dG1mimxqYmN1VoNpcG1geWdsYWp2cGV4e3lwX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHeom4mYeZaci4yZkHh7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5WIfoWHdH1/in9+mISWk5aMo6CXfnKHe5ORiqaPjI6KkqCRg5CPk5eQioGPmKCakpCSdICOkpSKnZ2ep5mYjpWYdZCRi22HmZCbe4iJkIlvl52ZopOVioydi4aBk51/k5OWiJqKfIuKgnpyemt2bXx/jH9uhZODlHhvgoR+fouBZXNqfYKYmIWAjnSSioV6iX93eYF+h4F9hI6GjZWlkXmFgnSIhnx/cXN+hYFsYHp0eXB7bmFuYmR7YW1vdnJ3d3NzYXZgb2x1bm9cWl5dXWpdT1xXYmFobXN6iWtfaWVqY2h3h21mbGhpbGeAfHp3bpCIc4CDhH10gYaJeoN9eoGEfXyOcnmLeXhubIdraF9pcmKHaHFvZnZnbWxhemhqfHt3cGF3bYuBmZqroaSpnoqLkYaJnoqUlnx2rJeMlnyek5GWlIh2fXuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+Rhn+EhHN6gIZ6j5GHkZGbkqSbk4F9gXyNipKjiY2KjZaajIWQl5KVjomIjJKdk4+MjW6EkI6RiZ6ZoqGYl4qXk3CLm4ZniJqPlHqKhZGLcJaak6GRkoeJmIyCf5KffZKPk4yZj3yLhoh0c3ZrcW92fYt1b4aRjpNydIB8goKJfWVxbXp/m5V+hYl0koyCdYp7cIJ/goh9hY2Kho6Wqo57iH1+ioV3fW9tfoOBYmd3c3RuemFeb2BqdF5wanp5eGxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4dlXWloZ2JncY1uY2hoZWlngHp3dW+OhXOBgYN8dYKJhXiFfHiEhnqAiXd/i3t7c3mDamtfcGh0f2txb21xZ29rZXtibn96d3Brd3eJf6OZo6ihp5uIjIqBj52Gkpp0gKmUkY2GoIyVk5CAc3t2hXd4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYF/f6CGj4qRnJegk5Z3iX6AjIicnYqPhpKXloWIlJiOloyLjY6MnYqOkYRuiouPkYqclqGcmZaGmYlsh6WFaIieipJ/jISMgXiTmJGdkZCHiJSNf36QmXyRjZCOmpJ9i4GEcHZwbG5vcXyHanODj5mKcXiAdYKJg3pnc292gpuQfYmFepWTe3iKdXGLfIeOe4uHhYqPnKWJfIR3gYp/d3dsaX6Af1xxcnFvb3dZXm9gb2peb2p8enBtbWptd2Bwb2txbVlYYGFhbVdQU1llZmJ1b4SCYl1rbWRjZmuSbWBmZl9naoF1cnJvi4B0f4KAeXaAi4B5hX53h4Z2g4V7h4yAe3eKf2pxYnxihXxvcGx1amhubHZ3X3F+eXt0dXN/gn6llputn6eWhYyDfpeVg46ddIqfk5KFipqMlY6MenJ3dIJwcoVzcXWIbG5sdGyHdoN9f21uVVGBq5SHgniAdnKDeYKggpGBkpGXm5GZd5F6goySpJqTjoiUmJKEhZaYi5OLiY6Ph52EkYt9c4uFiI+InJmfm5eVgZWAaoifiWiIoYiThZKEinGDkZePmo2Pi4qOjXd7k5F7jouNkpeNfIl9gWx3am9sbG17f2J6fo+WgXd6gXiDjX16aHVtdYiXjICJhnyVkXJ7hnF4jnuLjnuJfoSOkZ+fhn19eIGKfHZvZ2p/gHded29ta3ByVV1uYXFhX2xueXBncGZndHVocWxhd2VdVWVgYHFSUE5bZWRdeG+Ie15caHFiYmVlkWlfaGVbZ299b2txc4p9dn2FgHV2f4x5e4aAeIeDc4aFfoyMhHx6lXhncWqDYId+b29re2BpbXR/dF90fHiGeHNzhXx5oZCasZ2mjoKKf4KZiX+KnH6KmJKOhIiXjo6OhHd0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfHB0g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYicf46BeHuMf4iMipycnJuWlHqOeGmLlIpuiqWGlImXg4ZjjJGYjZSJlouMiYtwepWJfI6Ji5SSinqGfX9tfGVzcGtte3pcgXmQjoF7fn+Aho97eml1a3SMkIqDh4Z+l41tf4Bwgo6Ajol+hHuDkZabm4x9d3iCj3hybGVufYFqaXRvZ2hzbFNdb2RwWl9scndma2tjZ3hzb3BjX3dgYVVrX151T05LYGZiXHhwinRcW2V2YGFkZI5jYGZiWGlzc21rcXaLfHR5hoJ2d36Lc3+Gf3qJf3GJh4GRioh9fpl2ZXNufGWHf25va4Baa255eXJgdnp7jXZydop2ep+MnK+boJCChXiIlH57iJyHhJ6QjoWMl4STjoeBdXdweXBuhG9tbn5yY2R4cHxuenxqaGxipJrB3K7vonNsdYN1hKGEkW6Vj5Sfk5qAkXCFi6OXiY6VipCdlYOAlI+FiI+AkoqKl36He3Z/iXiGhY6bm5eZj5B2i3hwiYuNf42mhpOLnYWGXouUl4mOiI2KioSJbHyXgn2IhoqSkIZ2hn5+bH1keHVqb3p0WIh6kYeGen9/gIaNf3pmdGuBi4+LhISBjZiGbYN3b4mTg5KFf4J7gZGXlJuRdXR4h4x0cnBlc3eAYHNtb2FodGZSYHBna1VfbnR5YXNjYGl9cXJuW2NyYWNWblpcd01NTGNmYV12c4ptW1xkeF5gZGaEX2NjXlhpcmtua3J3i31zd4SBeHh8iXGDhH19iHt0i4iIlYaMf3+Yc2h1cXlsi3tudHCAV3B5dnlxZHZ5hoxodoCJcYCdiJmonKKShHxwjJR3eImcg4SfjY58lYx/moiEfHN3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IlzbHSAdoqaiIxpl4+Om5ORgYhwhYigjoWLlYqMl5N8jZKIgoiPepGLho+CgHd4g4Ryh4KTm5aUmIaNdoiAcoeEi4mcpIWWjp+EiWGDlY+FiIWIjIaAh2h9lH99goWKjo+Ccod/gHJ3aHZyaXR4bVqMfZKChn2Ag4GEi4N2YnVtioKRjIOAgJOSfm+DbXqIkYiUhX2CfoGTlJGYim9yeoyFdGtvaXB2fl1zaG5caXRfUWRxaGZTX3B2dGBwYF1ognFyaldnaWNpV21XW3RMSkxlZl5hcnOFaVtcZXleXmRnemBkX11Za25lbmp0d4p+c3KBf3t2eoh0hYN8f4d2doqFj5iBjYJ7k3Zsd3Z5eZN1bnd6fVh5hXGAbmd4dpGCZHaGhXGKloaaoZuhioZzb5KLcXaNmn2JmYiJe59/g5l/gnlxdG5vZHJ+aGZsd3dbX3h6enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJqQioV6aIeLmYaBkpGGhpeNe4yMgICJjXuQjX6JhXp1e4N8cYaAlZmOk5SCiXaEiHiFgo2Vn6GIl5Ggf4hhf5OHg4eDiIx/f4JmfZGAfn+DjI+Rf22DfYN1bG13dXR3dmxjjYGOf4V/fISAhYmAcWB0coZ9kI6DfYCSinpyhWd7hYyIjYV8hX+BlZCSlIVvcHmLf3RsbWlpd3phZ2ppWGt0WVJocmliUGJyeGxiZV5aaoNuc2JcZ19lbV9vVFpvTkhOZmRcZm5ygGtaW2NzX1xja3ZkZV1dWmxsYm1qc3aGgHFvf3x9dHiGeIWDfICIdniJgZKVe4mGdomBb3h5e4OSb217gHZeg390gW1oenOUc2dzh3xykpKEmp+bn4aHdXWUfm11kpZ9h5CDio2ZfIyadn52cW9samF0fGdiaXV6WmB3e3ltcX5lZGhoV52PX3Jzl7zEhHZxlIiPfXGWi4abkouHcmqIj5aAe5WMgYSajHyKhXx7iYt/lIh1iYZ2d36BcnWGgZ6UhZSPhIRygYp3h36Lm5+aiJWPnYGJZn2Tgn6EgoiJcYF9Zn6MfHl/f4eMj31pgX6EdmdweXhzd3Rsa46FioGKgHmCgYWEgWxfc3l7fo6LhnyCkIF/c4JqeoWJjYeFeYR9gpmOkY1+bm17iX12dG5mZXt0YltwYlducVNTbXJoYU5mdHhmYF5dWW+Ab3NZZWJdam5gcE9Za1FEU2dgWmpubXxuWVtdbWNaYnB2Y2ZcXWBraWNsanN2gYNwbX58gHR1g3qDgnyBhXZ+iIGWkHiEinSBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0a5ONhp+ZoJmEiG59jHZpd5eOfoGKgpSXiXmPlW96dHFsaWRgc3poX2Vxelphcnx5Z3F5YGVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJCLhW5rhZKRenmSh4GEmIp8hn94d4mKhJaAb4uIcXV+e2p5hYOlkISTjYR/cICEeIZ7iJ2blo2VkZWFiHB7koJ8gYKIg26Ad2iAhHhyf4CDioh8ZX5/hHZkcXOAaXlxb3WZjYaDi313eYGFeoNrXHJ/c4KJh4p+h4p7iXOCb3KFiJCGhnOFeoKajY6FeW5vfoR/dnpkZmh7b15YdlpYcGtOV3FyZmBLbHd0YV5cW1p1fXJvV2ddZmpxYG9OV2hSP1hmXlpva2d6cVtaWGtlWmNweV5nXF5lbGdla2lxd3+Ib2x/foB1b4J7gIJ/gn92gYWIl4lxgo1xe4Z8enmEk4x1anl+a29+dH99b3J7epNvboF+eGeSi4OhmZyRgoVmhoNvZ3mViH1+hIKYiYF8jo1peHNra2ZfYW95bV9ib3hcZGuCemFxdl9lZdTqvYsyOj6Ljn9xeIWHjY11gpaMfpKNjH5tbIWMjHV8j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3VmeYKDp4uCj4uEfm6BdnmGfIifko2Rk5SOi4d/e5KGd36DjIJrf3JogH54bXx8gouDeGJ6hYJyZHJpfm51cXWCm4uAf4WAc3Z+gXOCcFxuf3V5i4SLe4iBfol5e3JtiYSRhYxzg3qAl4yMgHVua3aAgHVzW2dndW5XVntSWW9kTFpycmVbSXB4b1xbW1lddH50aFliW2dlb2RqTVdmUT1dZVxddWVgdXBaWVVuY1lkcXlaaF1fZ21naWtpcHd9jm1pgoR+eW6AfH2Bf4J5dIGBjZOEcIGLbnd+gHt7iJKJf2h6fWpze3KFenN2fX6MeniEfXxrjI2Em56WjIGAbI19a2h+jYt6fn6Dk4J+fYqIa3ZyZ2hiW2Jnc29fYWtzYGhwiHlic3ReY2SboI9uXDVar7V0aYCIfJKGdYWVhXOOiol2b2yFg4d1eYl4iXyTh3l+cmd1iX5+mG9xhn5odnluZnmHhKSHgIeNin5vgHeCg3+Om4iDlZKZiouFiXyPiHB6fYR7aH5saoB7emp6d4KIgXJgd4F+cmRyZ3aCbXV7hpWRgXyCgW93enx1f21ZcIB3dY2Dh3iIdoOJe3l0b4uBkYKGc4B+f5SJintvbmptgYF0bVxmZHJwUFp6TVtuW09bcm9kVUtzeGlXWVlaYXCAdGBdXWFnZGlpZk5ZaE1AYGNbYHVhXXVsWFdTdGFaZG9yV2peYmhqZ21saHB3fJNsaISKfHxwfn57gYCBenZ/f4qLg3F8h29xd4N/e4mMj4NqfXttd3h2inZ8eH+Ch3+Dfn16bYWMiJmjjYSDe3WLeGtshIeQeH57gpGAgH6Lg3BzcWNmXllmX29vX2BncGZqboh0YXRvW2FkanZ7gL+cpqTIuHGEgnKSfHeGkoJzkIuHcnJvg3uDdHSHdIh3lIh5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgYB/jo9+c4B1h3uCk5GEepePlpCIgol7iIhreHl+dGd6aGt/eXNpenaAg31oYHiIfWtrdGh8gGl2gYyRlH56f39xfHZ8dH9iVnh+c3OLhYJ9hHGHinh5cXGEg46Af3p/fnePhoR3anFpbIeBcW9cZmFxbUlkdUtdbFRTWXJuYlFPdHhhUlhYXWFwgnNbYVxpZWVka2RQW3BJRGNgW2NwXl13aFVXVnZdW2VuaFZrXmFpZ2VubmhwdnqTbWmIjXh9cnt+eYKBgXt1fIOIhoNwd4RybXeCgn6Ji5N/cIB7d3l6gYx0gnh+gYGChHmAdW9+ioubnoh9hXp3hXtndIWLkHl+f3uIhoR2j4BncG5fZFxYZVltcmFgYHBsa2iIbmF0aVleZG6Ad6naqceGh7JxiHdvjHR7hY1/epKJf3RzdH53gHBxf22EdJSFeHVrYHqCeYmPZnGEcGd2blttfYCQk3+AeZGTfnl8bop3gpONhXWXi5KPh4WFe3+EbHR2fmxndmRte3ZtaXd3f398YWJ4hnppdXVjfntndYaOjZV7dIF3cYB7fW6AWld1f3B2hYh/gHptiYZ0emx2gYSFf3x+en10i4F+dGh0ZW6Lg2xzWWhec2RHbW1LWmBXVlV3bWJQUnR2WFBWWF5hcYRvXGBjbWVkXm9jVFxyR0JmX11mZ11be2JRVlx0W1tna2FWal9gbmVma3BncHZ4jnRrjo11fnZ4fneBhIF7c32DiIeDb3KAdHF1foWCiY2Ke3d/eIN7fIaHd4d8fYF+hIB7fnJ1eYyNoIyJeYl1dIN4Xn2Fl4t4hoNzhYaEd4l7Ym5tXGJbW2FWaXNjYFtnbnBmh3FhcWZXXWNrf3zKzoe5oWptbYpscYNxfIOJfnqQhHl4c3l1dXtqbHZjhHWSgnZvZl59gnqLimVygmtqcWNYbXqFm4iCgXOXlHh/fW+KcoSLjYlzmI+RiYaLg3t5fXBwb3xmaHFibXhxamtxeH19el1leoB4anZ4ZoN3Z3SHjI6UfXKIam9+gXlvfV1Zc39udYGLfIJvcIqAcXdpeICCgIJ4fnN8dYd9e3Nnc2Fui4FrcVdpXXZbR21qTFZVXVNVe2thT1R1clBRVFdeYnSFaV1gbGpmY1pvYVhicEhBZ1xgZV5cVnteTlVlcFlbamhdV2hgXnJla2dwZ3Fzd4Z4bpWLdH96eH55g4h/dXJ/hoWOg3Bwe3h3dnmGhoeMhnp8f3SLfn2GhIOHfn5+fYd/fHh1eHiRk59/jHyKbXV/eGSDhpWFc5GKb4WFgXqDdGRuallfW1xdVGdyZGBZZHFyZ4ByYmtlV1tgan93vq57oLZuYXOFaHN7cXiBhHp9i353d3J2b3t2ZWpvYYd1joBzamJef3h5i4RmcX9oa2taVm93iaOBhX9xmZNygXp3hG+Cg5OJdJaKjoiFiYV9eHRxbmh5X2psYG12amdqa3l3enZaZ318eWZzfm2FdGV1hY2Gln9wjGdre4R1bnViXXF9bHV9jHuCZ3aHfm5xaXZ/eX+Ac35te3yCe3lxZmxibol9bG1WaV92VUppak5RTmdMWHtoYU5VdWtMUVRVX2Z1g2ZeYHFoZ2JXal1ca2hKRGpZYWRWWVV5WU1WbWpZXWtkXFllY150ZW1kcGZycHWBeHGZhnZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYeJiYN4gX11j358hIqNg4GEe36Lg3t2e3d3mp2YeomChml2fXtsg4OSf3KOgXCFgn+Cf3BnbGdYXVtcW1NkcGReV2JydWp1b2VlYldcXGh/cG9ygHOJZGR5fWlzdXNygYN3gIN4dnJ1bmt6cWJna2eGdI2DbmZdX31we4l/aW15Z2pkVVdyb42mfIR7dpaRdX10fnxvfXySh3iafYiHg4aDfXVvcWxndFxsZ15sdGRnZWl6b3tyWWiBd3VocIF4gnZid4WLfJSBb4xrbXuCcWd0ZmFuemdzeIt8fmN3hHdqbHJ2e3F7enR/Z39/gHl3b2RmYm6Fe2xqVWhhb1JKaGpPS05vR116ZmFNVXRkSk9TV2Fqdn5lXWdzaWZgVmRXYnBdTEtqWGNhVVRVc1ZMWHVkWV5rYFxaY2VfdmdtYm9pdG9yfnR0moJ3f4B3gH+GhHp9dYKEfpeFbnJ0fHp1cYSFj4GAeot1dJB/fIGVjYCFhH19jIZ6fYB2e6OlinmIhYRrdXx6dYOBi3puhHN5hH2Cg3ZvamllVl1bWlpTYm1kW1hhc3tqaG1pYGJXX1tqgGprb4Bna2BoeXhqcnNzbYOAen98dXRtemhqeWpfZW5ogXaQhGhlWGJ3an6He29qcGdmXVRYb2eOqHeBenyQjnp2cYBxdHd6kIF5lnWGg4CFiHZqcXVnZ25bbGNdbXJfZ2FqeGh7bFtug3N0anCBfnp3YXeFhXmQhnSIcm95gHJjcWldcXhlcnSJfHljdIBxaGp6dXJteXh2eWSEfH95d3FkZGNufHxqalRoYWVTSmtnT0dRakVgd2ZhTVNyXUpNVFpla3Z6ZV5tcWlkXVZhVW5uV0tTaFdmXlhNVWxUSlx5X1tea11dWmNlYHlobGBvb3ZucHd1eph+d3+BeYCAh4Z6eXqDfoGThHF0dH95dnSFiJF9gHyQa3OVgXuCn4Z+h32AfoaCgIp7doSrn396h4eDa3KBeXWAfoF0boZufIBzioBqcG5kZFhfWllaVGFqZ1taX3WCaV5tbFxhV1xcbIFlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWVzaHp3k4FjY1RlcGiChXh4Z2lqYVdWWWdjj6dufneAi457cXJ/aXpwe459eJByhH5/f4ZuZHVyZGdnXGphXG9vXGdfbXRlemhddIBvcmtyfH51dmJ0hYt8iYiBgHhydX91YXBtW3J0Y3FzhXx1ZXOAbWFte3Brant5dnNmhnZ7e3ZxZWJlbXJ9aWtTZ15cVEtxYlBGVWBHYnZmYUtUb1hKTVhYZ2t1emRlbnFmZFpXXlh3ZVRKXGJXaFhZSFdlUEhieFpdX2xaXlxhY15+aWpfbnR4bXBudoOXenKBgHx/iYyGfXV1hnmHjHx0dXWCeXp6goyOfX6EiWlzloF6ip1+foV6gXp/fIaIc3GPrYx7e4aPfWRxh3lzfHp1cm+GbHt+bI96Y3BvYmVdZVZZWVdjZmtfXV1zhWhYcW5bXlhaXGx7Y3B3dWxiWWxzc2d0dW9sg3h+f3h2bW50ZGl0ZVtndWZ2dpJ5X11SZmZrg4J0fmJkalxUV11iY4+kaHh0g4aReW5xfGl6bnyGfHaKc4F5fHh/aGR2bGBmX15pXlxza1llXW9vYnplXHd8a25ucHh5dHVkc4OSf4iEiXt3b3J+c2J4ZFxxcWJxcoJ9dGdygGVebndpZWh6fHVub4J1dH10cmJfZm5ufGRoU2dYWFRNdl9QSllXSGJ0Y2FJVG1TSk1aV2lscXtibWxzY2JaWlthd1xTTGNdWGlTV0dZYE1HaXVYXmBsW1tfYmJchGlnYW54eW1vanaBkHltg3+AgZOIhIF2dIh0jIZ0cnZ1gnd8fX6MkIB+k35wd5aDfJmTeYCAeHp+gHSIg3RwmaF6en+JlHdjdYd4c3d0a3Rvfmt4fHCRc15wbmBnYmxUWlpXaGNtZltccYllU3JuW1pYWGBsdmNpdWppXlltc3Bsc3NzaYR8fn57dm5ubGRpcWNba3JkdXaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEknVsbHtvcHF7fX1zgXeAc3p6emRldWhdYllgZ1pedmhXYl1waGF3YVt8dmlqcm94dHN1aHGClYOHf4V2c2pxfW5md1hdbG5jcnSBenRncH5bYHByYmBrcn5tbXV/c3J4a3FhXGVsbXpgZlJlVFdRUHVbUU9YUUhjc2FgR1ZrUUlQWlVra2t8Zm5vcWJbWlhZbHFXUlBmV1ZoU1RGWlxOSHF0WF9jbGJYYGBhXYtqY2RteXhscGl1eYd7a4N9f4SafIOEeXyHbo+Hcm92en10goJ8i4+Dgpd0eIKUhYGfiXWBgIF0f4Jxh4J1b6GWc3uGi4Z6ZXeKbm16bmZ4cHprc3ZzjWtedW5hZ2VrUl1bVWdhbGtaXHGMZE9vbl1WWFVnanRoYnRlZFxYbXRtb3V0eGqGfH97h3aPc2Nka25hXG5tY3N4h2taVFZjZHh9fXGGXWRfY1RaX1lilZVjbnCDhYp0a2l8cGZ0eHV9bXp1dnB6f3ZfZXJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXRxdHF1dmtthJOBiXyGcXNncH5xc29UXGdrZnJ1gXd0Y212VmJybFtfcGd+Zm13fnN0c2tuYVpkamp3XmVTY1RVUFRsVlBWUlBHZHJfYUZYaU9JWFRWbWhkfGlreGtiV11VW3RkU1JXaFFYZlRTSFpaUE13dlpfZWtpWWFgXl6ObmFma3l1bm9pdnaAf2yDgH2HmHuAh4GJfmuTiHJndIB7dYCDfYmPf4uTcnyKkYWHn4d7f4aMdIGGc32Cdm6ki3KBjYt2d2x6jGBke3BmeXN4bG1xd4NnZHxtY2ZnaFNfXlVnX2xuW15ujWhOaW1gVFZTbmd0a2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVxeX5nWlZYYGx4fHtwhF9jX2dWWF9XY5uIYmtwgYd9eGxsem5cd3Nte2p2dG9wfIBzWGltXlhcVWFiV2RwY1NeYmlhYmxaYX5sZmx0dm9td3dsaYWMf4l8iW1yZ3F9bnNuY1thaWlwdIJ0c15pbVNlcWVVY29je2Ryd3x3bHBta2BZYWZndFxkVWBVUk5XZFJPW05PSGRvXGJHWWlNSl9LWG1kYHhpbn5kYFVfVF11XFRTYGZOXWFVU0pcWVBZdHVdX2VraFhiYVtejXFjZ2p4cXNuaHZ0eoRygoN6iI5+fImHjXlukIp1bHOCdH9/iIWHkYSVj3l9jI+HkZuFgHyMhXOAgXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2NjY2NjY2Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjI2NjY2NjY2Pj46Ojo2OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2NqwnaCgoKClXiovLy8wLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn6bago6SkpKpWFRwcHBwXOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHhomTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaTlJSUlJSUkI+Pj4+Pj4iCg4OCgoKFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkZKRiYeOipCSkpOPjYuKkImPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuKi4uLjIyMjIyMjIyMjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeIhYmKhoiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhImGhoeFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmCh46IhIWIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjoiGh4aIhIqQj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2QjoyKio6Kjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCBgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9/f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX5+fn9+f39/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn19f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn19f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn1+f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYWFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4fHt7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3ent8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTk7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl7e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkVISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dnd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/QD48PkA/PT09Pz49PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkVDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkVAP0BOYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk1LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PUE/QURFRUNXdYaJin5YR0lKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm9wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdISElHR0JERkREQ0FWdIeJh4eGiIJXSUxNTE1NTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExLTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS01KS0lIRkZHRkVQbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9f399fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTU1JRkpWbIGGhYSFhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQUNGSElISEhLTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lJS0xPTk5RTlFecoGFg4SFhYaHiIiIiYmMjmZCQj44ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QTs5OTk9PT47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5/fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njs8Q0BCRkhLSExLT1Vne4SEg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY1NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODo7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRGRkVmeoOEgoKDgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NjY3NjU6Ojo6Ojw4OTg5OTg3Nzo6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BRV2tycnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PERAUX+Dg4OEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj48Ojw7PDs8Ozk6PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3J0dXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj0/QER2g4OEhIWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBDQUA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEFAPz9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PDw6Ozs8Oz0+QUA+YoWDhIOFhIaJiYiHhoaGh4iJiouLi4qKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURGRUFGRUZERkZEQEI/PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj06PDs+Pj4/Oz89QD9DP0p+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRUNERkdGRENFRkRCSElMR0dHRkhHRUtKTElLS0pDRkNDREJBQUNCRENDRERDQT08PkBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc8Pjs8Oj4/PkA9Pz9CQkU/aISChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtGREdISElFRUhGRkVMTE1JSkdHSElKTk1PTUxOS0hGR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6Pj89Pj5AQURDSVN+g4SEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExKSUhGSklESkhHS0pISkdHR0tNTkxMSEhJSk1QTk9OTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVb3F2dnh6e3h4enp8fH5+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozc8PTo8Pzw9PkBCRERNbYSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4teUlJQTU5NS0pHR0NISkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEO0BBOz08OD89PT5ARUU+Q0VDR0t1hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUZGS09OT1dWUVBPUVNSTlNUT01TTFBTVVdSU1JQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3F1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz08QT9BQUVVTEJJSkdKTHmGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0xLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQUNGRENES1ZQS1BQTlBQeYaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLhmxbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU290dnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1JRVVZVVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ11bXF1dV1JOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5UUVFQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fH19fX5/fX59fn19fn9/f3+AgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVlJTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUFFOS1JVUk1PWVFNTlFTVVVNUVNSUE9NTEhDSUdSU1RaXW1ydnZ1dHR3e3p7e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRgZF1eW1lVUUxJTElhbJJ0UFFTTlFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQj9EUENEQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dEQkFDQE5QTVJkdHV2dXN0dnp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIODgoGCgIKBgWtMRz4+Ojo+QD8/Pj5qUEphRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNDQD88PUI+SU1GVW91dXZzdHZ4e3x6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcTntOT09OS0xNT09QTEtMV09JR0FBPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV2d3V2d3l8fHx9fHx8fX59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJTVlhTUllUTllaW1dZXF9eX2VgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FXUE1KREY+Ojk2NTg2OTc5OjM2NTc5NTxCPWZ0dXd4d3l5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT01MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5OTg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE9KTk9VU1RcVlJVU1NPTUxJSEhGPz89Ojc4NzY1OTk2NzU2NVdxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9KR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFBPTk5NUE5UUlBSTElMS09RUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjRAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PT08OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOERNU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FMTk5NSU1MSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHSkpARkFBQEZHRElPSFFSYVxRUFJPU05PT0xMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZFP0JDPj1CRz9CP0BkcnV3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0FAR0lETU9iZVBNT01XS0xOS0tNTUxMS05OU2RNSkxSSUlJRUJJSkxNTkpHSUdCQUJAP0VGRUhETG9wdnp5eXt7ent6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPSEtFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPz9AQD1DRURMTVFUTEpJTVRGSUlKTElKS0lKTE1PUFJQS0dDTEdDQ0tKTE5PTklKSUdDQ0NESUpNTElac254eXh6e3t5fHZycHVydHl5dnhqcW9qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NGR0hHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHR0NEO0FAQj5AP0JFRElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJJSEROR0JFTEtOTlFOTE1KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhlcEZLQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREE/QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPj9DQ0NERkxOSEpOSERIRElMTk1ISUxHRkZJSUxOS0pIRU9JQ0dOTVBOUE5PT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV3dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjo7Oz07PT9EQj9BQ0ZHS0ZKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRkZGS05PS0ZISUZFREVJSUhLSUZIUEtESk1NUU5PTk9QTkpKSU1SVVVSUFhlYWFtZ3Fyb3J5emdlaGhjaWxmcWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFRkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdLRkpHSUdGRkZFRENBQUZGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVEQ0lISEtKR0tSTUNPT05RT09PTk9PS0tLUFVXVlZUWWBfXWlhbmpuaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXV2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01HR0VHQUFAQ0Q8QUFAQzw4Oj0+Oj89QEJAQEBERkhFSEZGSEZFRURDREJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9OT1BNTE5TV1ZXWVZYXlpdZGBoY2ppZ2tfZGVmY2hoZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hBQUJFRTxAQ0JEPDc6PT47PjtBQj4/P0NFRkRGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9JVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURBQ0dFPEBFQkQ8ODo+Pj48PEJCPUA+QUJGQ0VCQkdDQ0RFRkdHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9VWVpZXFpaXF9fXmBjXlxiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJER0U9QUdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREZGSEhGSEdJS0pFSkhISkhGRkxISEhKR0xMTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJlXmRgZmhgZWhqZHNzZmpoZmxwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd3B3SUpLSUtHQkVERTxBRkREQjs/P0FAQEFEQUBCPkFDSEJFREZHRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSklHS0tNTEpKTUtNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFiYGNkZWJkaWNkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV0ZXFza3BxanJ2cHdKTEtLTEdDQ0FFPD9FRUVDPUFBQ0JCQ0VCQ0RBQUVHQ0dGSEZFSUZDR0pHR0pGSUxISUpNSkxLR0tJSEtLTlFLUlFMU01KTk1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY15gZmJhY2luaGNpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0VBQEQ+PURFRkM/Q0FFRERGQ0JFR0NDSUVCSEpJR0hKRkRLSkdISklJS0dKSk9LTUtJTEhKTUtaZkpkXEtsUkdOTl9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbnpmXGx1YGxrVWB4dmlqaGhmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj88REVGRENDQ0VFREZCRkZHRERKRERKTEtJS0xHR05JSEpLR0tKSUtKTkxMTExMSU1MTFtzYmRwXmxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm5ccHZncU5Lcnl2a2Fha2VlbHhta3Zsbm9zcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FBPz1CRUZCRUNFREVFREJISEdERUtIR0tNTUlMTEZKTkhKS0pJS0pKSktNTU5NTU1LTk1NW3Jwb25wcGxrTVBRbFhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcF1gc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hGRUVCQUI9Pz9FR0JHRElFRURCRklISERHS0pHTUxOSkxNR0xOSU1LSEpNSUpKSkpOT05OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0tRUUxITU1ITkpJSE5HSkpISE5PTU5MSk1NSlp0cHBvcXFtbE9RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0VFRUBAPkNDQUZDSElNSEZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUlKTElLSklJS01NTUxJS0tLU2tiWmleX2pjcnJaX1lrb2BlZVVrX2RbYWJRYG1oXGpcbmlpZFpvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3cklIRklERURGQUBBRURDR0JISkxHRkRHS0xJRUZKT0xJT0pMW1FKRkhIS01JSEpKS0tJSEpHTEtLS0dISkpMTExLSUtMTlRbXVRQVU1RUE5PT1VSUFBRT09RSkpOUFFkcWlUWVZbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0lRS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKSEhIRUZMSElLTkxJT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZFxiWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKRkVISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdERUpHQklNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teZF9aXWBjX1lfYltgXltVWVhaX15kYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLSkpFRklJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUFFSUQ/SUtITltjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmJiY2NlWlJZVlddW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkRHRUJFR0hGR0hJRkdKR0hGSEtJS0RESkpNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQEdIQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUVFdX2JjY2NjYlxkY2JkY2VYUldVVF1ZW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSUZHR0lHR0pGRkZJTEpORUNKSkxOSkxJS0pJSUdCSEhRTUtLT01LS0lISEVEP0VCSEhBQEZFQ1RdWV5YX1lfW11VWFhQXV1RS0pWXlheW11WWmFSUl9fYmJgYGJiYGNiYmRkYlhQUlJTXFRcXV5eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0pJR0RIS1FPTUxQTExLS0lKREVBRUNIRkFBRkRBVlVFXFReU1ZfWE5UVU5aW01KS1RgYVtfWF9eYl1PWGJcYGBfYmNiXWJiV19fVFFQUVJZU15cXF1eX2BiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJU2NRRVdfSUdHSERGTUpQUEZJSUpLTkxMS01LSkpHRUlOUVFOT09NTk1OSExCREFDQ0ZEQkFDREBMSEJMTFBPTkxGTUZGSElIR0xMTU9QSUxPUFBTUExRVFJVWlhXWVdYZFZPU1RQUU9PUVVUXFlZW15eYWFlZmNoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BUU05QT05PT09IS0ZgRUReTERmY0NMW0heW3NtT01WbVlMQ1BfVGxXZ0pdV1VeRExRVUxNU1ZRUlRYVlRYVVRcVFBmWmhoZVpUa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USktHYFRHSk9KSU9NUlFLTUtMT1JVUk9QSkxOR0hNUVtZT1BQTk9QUEpLUX9RSXxZWXJzV1BtSHFub2FWUHFxdE9Ca3NucXRwU29fW25YXVZcWFVraFVdVmNZYFlaX1ZVV39pdHV1X2F2X1liXFxmW19hYWFiXmBjZ21wbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT01RVE5PUVBLTE9HTVBTW1pUUVJPUFBRS0laeF1UeGRoWFFTUHZndGxwYm5ma1JyT0x3bWpycHNycXJwb3CAXWZ6dXhxcXpxfnJ9a3V9YVJofGVzc29zc3x9cH54b39yX2BgYmJbYWFoa25rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpRT01OSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dRVFBQUVNMSGd4bGN4cW1aSkxUeXB1bXVibnZQZGRJZXZxbXdvgGpmeHhpWHJSaXttaWp6en1seHp/cGduWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxeZGVmaWplZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFFJS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV09VUE9OU0pLcm91dXF1cWNoYVZuTHFwXkdoeVd2VEtoeH14YHl7c25hXW1vZFNncnVubXlwd2x2c3RxbG1cc316a215fGx1bnxscXZ1eF5fX2JeXV9lZWlnaGZlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUtNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnVVV2xObmx7cmFqZ391VEtXa2h9bG1seF9acHp7X2B6c2Nyb3hxaGR8aXJ7XVRLbF92dWxqdnx7bX55a3xwXV5eYlteYmRlZ2ZmZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1NYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFOUFVMS0tSU1JSUk9WVVFRT1JSWFhRTlBVVFhYWFtbVVFSV1tXWFdbT1JUV1dYUV1YVl1VU09YUldXWFlaYFxncl9bW1pdXV9jWl9jY2VnZGRkY1pkYmdmZm1ubXVmZmdjYGZeXmdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJOUlFQTFZWVFBUVVhVWlZSW11WVVRXVVlYT09MTldUUE5VU05QTkxRUEtKUlFLUU1KSk9RVFJQUVNSSUlNT1BRUlFRUVRVUVhXXFdTUlFRVVVWVFpRTlJSV1VTWVZUWVVTUVVTVVVZWVheWl9hXVxbWl1dYGNcXWJjZGZkZWViWWBhY2FiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlRcYFZXVllVWFRRUEtPWFNQTlVQTlFOTFNQTU5VU05RTk1OUVNQVFBSVFROTE5PUlRUUlJRVlZTWFpbWVNVUlRYV1dZW1NPU1RXVVRZVVZZVVFRV1VWWFxaXGBdV1lfXV5dXF1gYV5bYmJjZ2ZlZWJYYGBiXWBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFhWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFPUVhUUVFPTU9TVU5XUVRUVU9OTlFUVVVUVFJUV1VaXVxaVlZRUldYVltcVlBTVVVVVlhTV1dUUlFYVlZbX1tfYF9WX11eYFxcYGBfX1piY2RoZ2VlYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTldTTU1ST1FST01QU1FVWlVUUFBMUFdVUVZSVFNYTU9QUlVYVVVVU1VYV1teXVxbVlJPVVZWW1tWUVNWVVZYVFNXWlNTUVlXV11fW2BfYFZiXGBhXWBiX1xgXWNhY2dpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFZTUlRSUlpPUVNTVltVVlZUV1pYXV5cXF5WU05UVlZbW1VRVFRWV1hSU1hbU1JSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2llZ11cZWBhYGFjZF9iX1laX1tcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1cYFxgVlxdaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVVNOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVRVTlZWV15aWFFUVVhYWFNWWFtTUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXl5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVldWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVU09XUVNXU1dVVlteWFtZVVpeWF9eWVxZUldSWVhYX1lZUlRVWllZVVdZW1VUWl1dXmFiYGVkXV5dXWVhYmZkXl9kY2BcZ2VoZmRiYGVhX2FhYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFdXV1ZWV11YT1VcWV5dXVRTWFNXVVNSU1dRU1ZUWFhYXl5YXVtVXl9YX19YXFZRWVVZWlphWFtUVldaWlpYWVlaV1ZdX2BfZGNiZWVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlRcVVdXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJWVVFTVVdbW11fX1pfXFZfX1pdXlleVlNZWFlZXGFZXVVWWltaW1paWVpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkaF9nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVZYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZVU1ZUWF1dX2BgXWFdV2BeW15cW15YVlhYW1pfX1peV1hcXF1dXVtaXFdaX2FeYGVkZGZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpZWFpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVldYV1ZWV1ZdXV5hYmFfYl5ZYV1dXlldXllYVVdbW2BeXF9ZWV5dXl5gXFpaWVtfYl9iZWRlZmdoY1plZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdZVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVtZWVdaWmBeYWJjYGFjX1xiXV9dW19eWVlUWF1dX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZmdlXWVnaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYmBjYmJdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2dmZmZgZmdoaGdkZGBbZmdeYWhoY2loZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8fHx7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t7fH19fX18fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycnQ+KCsrKyolYpKMjI2Njol+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vcjIXGxsbGxRdlo+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f4B5d3d3d3d3eHl5eXl5e3hub29wcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6enp6dXNzc3Nzcnl9fX1+fn19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dXZ3ent4e3h3dnZ4eXt6eX15eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t8fX19fX19fHt7e3t7fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x8fXp7fXt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnx8fXx9fHh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+fHh7fXx8eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt8fHx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoF/gIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp6enh7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYKCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgYGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYKCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qKi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhIWCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYWEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLioqLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoKDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GBg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KDhIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAf3+BgICCgYF/gYGAgIKBgoKCgYGCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9/f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgYGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhYSCgoKDg4KEgoGChoWEhYSDhISEhoWEhIWCf319fX6ChIODg4ODg4ODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhoaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+gICEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoeGhoWEg4SFhYaEhYWGhoeHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIODgoOFhIWHh4WEgoB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iJiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OCg4WEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhISFhYODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODg4KDhYmKiYeFh4WEhYWEhIaGg4KCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4iJh4iGiIeHiYiEg4SDhYSEhYWHiIiGhYOCgoOFh4aHhoaDgoKDhIKDhISCgYKBgYGDg4SDhJGSkY6PjouHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoKChISDgoWGiIuKhoWGhIKGhoKAg4ODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GCg4SFhYWDg4WEhISEhYSFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjZCNiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFg4GAgIF/fn2Cg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIKCgoCAgICBgYGBgoGBgoSDg4WEgoKEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx8f4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBgH9/gYJ+fX1/gIF/f35/gIB/gICAgX+AgoCAgoKBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDg4OEhYCBf3x9fX59fX6AgH59fn58fX6Cg4OCgoGBf319fn6AgIB/fn19fXx7e3t6enl6gIB/fn9+fn58fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gICAf3+Afn1/gYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoKBg4SFg4SAgYCAgYCBgIGCgoOBgYF+gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+f36BgIKBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKBgoF+fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgoOBgIKAgYGBg4KCg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoWEgoKBgYKCg4ODg4OCg4KCgoGAgICBgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoCBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYSGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359f35/gX+AgoGFhYWGhoeHhoeHiIaHh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgoKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYmJh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoODg4KDgoKFhoSEhYWEhoSDhIOCgoGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgYCCgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDhIWFhYWDg4OEgoGDg4KDgoKBgYCAf4F/f35+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHyAgYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH59e4qCfYB/foGAgIGCgYKAgYCBgH+Lk4+Mi42OjYiHiIaFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/f4B8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICBgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRi4yNjY+KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317en2AgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fn1+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fHx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKMjIuOjYuKhoSGhISEg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn9/fXx+fX59fXx7fHx8enx6fX5/gISDgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t9fHp6fXp+gn+Bg4SCgYKBhYaFhYaGh4WChJGOjIqJioeIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJiomKiYWIkY2LiIiGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgYB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9fH18fX1+fH59fX19fHt7e3x7fHx7ent7enp6e35+g4WIh4iKi4uKiYyQjYyJiIaFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+MioiIhYSEg4GCgoKCg4KBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6AgYOHhIiNjImJhoWEhIOCgoKDgoKCgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiYyJioeFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB+foB+fX5+gIB/gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX99fn59fnx7fHp8e3qAhYKEhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+gH+Af359e3p7enx7eoKDgIKCgoKDgoOCgYGAgIKBgICCgYOBgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4OBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3x6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fnt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAgICBgIGCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fn2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn1+eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9/gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/foCBfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhIWFg4ODg4ODgoGCg4KBg4J/gYB/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH9+fn5/f31+foGCgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4F8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYCAf32Af35+f399fX1+gIGBgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH9/goB8gH+Afn+BgH9/fYB/fn9/f319fICAgICAf39+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f359fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFh4WFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH9+fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcXB3dHN8hYaDhIKDgoGCgYKCgoGCgYGBgoGAgICAgIB+fYB/gH+BgoJ/goJ/gIF+f4GBf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gICBgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIJ/gICAgH9/gIB/f31+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5eXt6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYSDgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt7fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXZ2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKAf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gH9/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGFg4OEgYGDgIKCgYGAgIGCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCf3+AgoB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDg4OBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgICBgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX17f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKChoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGCgoCAgIGAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4KBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4KEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOBgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH96e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX56fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgoKAfYGCf318fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/f3x9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KDg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4KBhIOBg4OEg4SEhIWEhISFhYWFhIODhH99gYR/fX18fHx8f4F+fn5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WFhYWEgX+ChH9+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeoN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+Ee4WDgYSDgH9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgYN/g4N9gX1+fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9f359gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB1gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeHiIaHhIaGi4qFhIaHh4WEhYWFhIKFhYWFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goGBfn5/fX17fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFhoaGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEg4GDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISDgoF9f357fHt+e3x8fX9+fXx+fYGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFh4aHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoSGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFhIaHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH59foB+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e36AiIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHhoeGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWFhoaFhYOFhYKFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXt8fn1+fnx/fn19fn59fXx/fH5+fH2BgH18fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeGhoiFhoaGhYSCg4KDg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4eHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWHh4eHiIaGhIaFg4KCgoKDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYSFhYaGhoaHhYaGh4eHh4WEhoWDgYGBgIOFgoN+gYGBf4OBf35+f35+fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoeIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4aFh4OEhYSGhoaIhYWEg4WFh4WHhoeFhoaHhoaGhIOEhYKAgYCAg4ODgn2BgYB+g4F+f3+BfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCBgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iIhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaFhYaDg4OFgYCBgICEgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH5+fnt7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCg4R/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18f359fHx9f358e4iFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYSFhISGhoeIh4WFiIaJh4WDhISChYOEhoKEhYSFhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYGDg39+f4B/f3+Df3uAfX1/gn2AgX1+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e316e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIN+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f359fX18fHt7enp6enl7enp6enp6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19jc3d3d3d3d3d3d3d3d3tvX2NfY19fX2NfW19fW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLmzeHNzc3Nzc3Nzc3Nzc3CSu7i4uLi4uLi4uLi4ubCKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmTIpKysrKysrKysrKyolYamkpKOjo6Ojo6Ojo6WVU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpps4LzAwMDAwMDAwMDAwK2WqpaWlpKSkpKSkpKSml1dXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaugRT0+Pj4+Pj4+Pj4+Pjlur6mpqampqampqampq5xiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs/Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crKysrKysrKycnJycnJzNLR0dLS0tLS0tLS0tLQzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7O0NPQztLU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bW1tbW1tbW1tbW1tfX1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafR0rmPvtScgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Ozs/P0Z2Pw8KUsJyxlri5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvqr6koIuRw5N9fq+w0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZu4m4edutTSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImbsJuQn6DS08CgoNDP0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBnqqrr5GhudevoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5mWopqtm6nYo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDRhZWmxZii0Z6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzs7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+Fn6CfnJubrcefodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJjDp6uknsW0pKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iHzc2SkKfXuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTUy73V0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojw9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ojw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk4NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzs4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg3NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2Nzc4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0Nzc3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyampubm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtoZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7q9wLm9urq0v7i1t7Ovu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2dhXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15cWVFFRENNSUFEPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXVtUSjw+P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m4s7KytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdTkhBPz1IQ0ZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTEu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKyL7AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxBRk1GODY2NTo2Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vbWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubS0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIP0hRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7W8vbiyrbOwr6yutraytLSvqqSem5ycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWim6OclZCMj4+Pk5CXlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6avo6+utcG6tbeyt7aytKuytK6qq6+wsrOtpZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsKOlp56gnJWTkI+RkJiQlpWYl5+Ym5mbo5mXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7REA9Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkZaXmZmcoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZabl5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOD5CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZydmpSYm5qRjpGVkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrbGxtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmJyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho56doJ+joKKvrqyvsay2p62xraamsK6trLCnoJ+ioJeRlJyhnJmXkpOfnaKkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7essbSjoJ2loKyhoaKgoJqYlpafm5uYpKGgnqShoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpyhnZ6amZKZnpyioqCgnaKfn56fqaunrKmqtKurraulpauoqqyqpZ+emZKSlJiZlpaWjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oauiqaiyqauop6iamZ6aqqafmaegn5+nqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5iWmZ6bnKSfn52knZqdnKSipKOiqq+sp6mjoKGsrq6qq6agnp6ho56enpudnJSTlZSenpiUhp6aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLS7xcO8wru3s6myraqztK+zrqquo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3VycGhXW1FFVEhESU9IPkVBM0VIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpZ2Vm5ufmp6cnqWmp52goKuxrqekpKOgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr3HxsK3w8nIwsDFvrm0ubq1u7ewtbKqurKuu7a+urqqt62rqri6tLyurbijpaKep6Wio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGhveGplWltGSkxERFNMREJENzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZqdnZ+fmpeYl5KMj5aXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3MyMnRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbGysfOv8nQy8bExsTBu8PBvr6+tb2zrb+/wsPGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gm5mXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LU1dPTyMzHzc3J0szO083Ex8nKwcXLxsjIxb7Cs7PHxMvKys7Fyr++v7zBx8TMzMjJv8O/rbCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/enJ1dWdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyblqmWjZeNjI2XprCupZ2enaGloZ6blZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTTz9LD0NPW19XW0svJztHLxs3SytLV1tnV19PW2M7Syc7RzM7QzNLPv8fGysPMzMvOz8XGx7a/yb/SzcvPxcnIv8PCyM7Mz9DPzMrHzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHdzdm9jYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmq5qjsLGpqLXQ1Nfa0sfGy7S2wsaytqmipaahoqu1p5qxoZWUjJCmrauclZihnZuhop+cnZuVindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTPz9XU1NHSzNHO09fW09XQz9LT0cnT0cjQ2NfY0dfS19nV1szOz8nN0cvOz7/FwsfFzs3R0NHIy8zAysvF087LzsjEycbGyMzK09PR1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamgr66qqqyepq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOjtqmoqKGqqaGYlpiam52hnpqdnpR+cmVjYl9fYWBfYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0srPzNPW0tHWzc/V1dHG0dTK0dTV1s7S0NjY2NfLyM3Dyc7Mycu/yL/Iyc3Nz8vQzc7Lzs/Hy8/Qys7KwsnGyczKy9HSzNPR0M/Pyr3IubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bua2FkbnBhV1xaSUZGRExXRTtAPDMzPD04Njg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabnqOnnri2tbWtpa2uvrSxwNnS19rc1s/Ny8PT0MLCsqutrqyms7G4q7LOuaufnJaUl5uen5+dlJaXlYlsXl5eYWRiYGBgYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVysDKwcXMwsjJwszDxcjKys7KzMzPzdPLxcjPzMjHysTGwMXJy83Q0cbQzs3NzM/Fx8C3ub3Dw73DubKzvrG8xMS1qpiloZmWkZWVkouUjZuRlJSPj5SCiYV4cHFrbmhgYHFoWVhoVk1HTElQUEI7RD47Njc6ODk6NTY9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfDucvV1tna29jMzM/J1tbFxLiytqqkrqy5ubC21aGVjo2YlpCTkpGWlpaQjHxlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7Gyb3CxsjOxMLHwMfNx8PLycvPx8PDz8jGwcbHw77Ax8vLzM7CysvIx8vQxMXHu8fDyMjCz8C9vL+wwcrHur2qsbKnpZ2inJiQm5CkmZeZkZWYiY+Cd250ZGxgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrQ0NLUysW6vr6wqLervrq3wa6Rjo6WkIaDhISCfoWFf3RgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsjGwsPAw8fKycjKyMHFzMbIy83JxMLLycLCy9DEy8i/ucG7xce9v8bPysO/w7vJxsi6x8bEysC9wcvGxcO9xby8v8PEy8XFvMDJwsXH0sXAyL/KysbIxtDDw8bDr8TLx8TKt7+8urSprKWlmJ+YrKOhpZqjoJuUe3ZzdGZqW2FubVpbWFFETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPHzc/OzdXQ1tnY2dDN1M7P0MvEuMbBtrW8scC3urCRjJOXh3uAhYaAdnh1cnBfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy7ubjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcLGvr61wL3DurzGu8K5s7zFw8LCtr+1tb6/usvDvLW6yLq/vcvDwcXCxsjGyMbQxsLMyLLHysPOzcHFwr+9srews6eoqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRkJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc7P0snRxtbV1tjOzNDIzcjKxb7KwbK1ure7trCRjYqLhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLS3tLOys7q1vbG3sLWvsrvCvMHEvL+7tbK6vsC4x7m0u7bAwry3vcbAw7y1rrK2ur6zxLe7tau4vL3AvbC6ta+2urLFvLavu7+0trTFvL7DxcDDxcbIy8bAxsa7yMu/z8rHw8bBw7fDvr22ub7Gv6y1urW3to54dHhnZ2Via25eVl5gRktISEpGQkNBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLyczKy8bRz9PRz8jLxsrGxMC9z72zub25uLecjoeJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7m4tbCsrKeeoqqnnquss62pq6mzrrawsqmupqyyvLq2w7m6urGqtbm7tMK6sL+xvb27tbvHucK3raqosLHAtbi8r7CnsbO0u7yrrbWlrrauurGwqrmvrbuuu7i7v7+9ucK/x8PFwbzGwcjLuMXHxb/Hw8O6xMbCu8XJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj49OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs/SzMTGwcXQyM/CxMfBxsbFxczEy8zCxMHIwbq8u8q3tLy9trWrkYmQkHx5foqFenuEgXduXl1dXV1fYF9fZGNiY2NiYF9eW1taWl1aWllaXWVub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCjpp+qrbW2sb25r7ivqK64tLS8uLO8r7e5tbG7wbHBrqWooqyxsrOnvKqrqKusrbS0pqiuoaSvqbKlp6iupai3rLCyt7m6u7G8vb6+xL+1wcHHyLe/wMW3xMK/u7/Ew77EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWlJTS0ZGRT4/QDk3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwLzKucDGwLzMusPHxbq9xL66t73Guba5u66ylYOJjYF7foB+eHR/fHN3Zl9dXFxeX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSepJuXkaGjqqOin6Wlp6WsoJ2bpKassq+2t6ewrKeqtKu0ubC2tKy2uLGwurmxt6Sfo5+nsaerqLmqpKanqKeyraCnpp+bpKasnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubrCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZV9rb2BVWV9ITmhPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelZ6hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu3yLu3xMazvsW8t7C5wLuxs7ewooSHh4J9eXZ0b21rampxaV9gXVxcXV9gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm5+fo6Whp56bopufqrCtsbWiqaqpq6yktbitt6+ssrSusrWusKqfnZ6jorKkpam4raGmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7KyubK9tLaxsbW0v7a9wL3Dwbq7vZeDenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmbpKbAsq+2rLS3xtDJycHHvLzFxdDAvMq7u8G7tsW4tcHBs8LEvK2qtbq3qLGzqYuGiIB5c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFhXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaQnKGhqJ2bnaWmoaWcoKCamK2ura6yoKWiraunobWwsbGsp66yp7qzprahop6ao6KtoqGptaqio6adpaajlpiel5manZ+Zl52cnJusoaumo6Smrauzs6q0sLKqsrm0r6mvsrKyt7Ouqayusriwura5vb+3srGUhXl1ZV5lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va20uMPNycjBxrjCwcjQusPGwLa8vbbDura/wbW7v7uqprG7saiyr5t9hYWAeXBxdHFoZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqicm5qqpq+wq5ujo7eqoJ+uqLappqassKO3sKS3oKKbmJiqpqGbrLivoqGknKGfoJOVoZSWlpuYl5aXnJSfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxr7Cur6anp7KusbSvvLS5t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTEtFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp6np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcWxv8C5wMG6wMC5ur23qKixu6apoqWJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKann5yfpJ+qr6afoqO2qKChoqizoaWnpK+lsK2stZ6gnZWUqaGhlKyxsJ6iop2emJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62lqK6vrquoqqmzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFFHUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKett7u8wcW6sbm1xcrLwcTHx8m4yMa1xcLJr7q8wrzDwMG9vLe6tqansraeooqZiIB3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVVNUUlVgYF9gYV9gYWNkaYGUk4mRjpSSk5yUlZajmaCWnKCloa2lpKSio6GbqqqlmZ6lsamgoJ2kqp2noZ6srKmora2ioaGUl6ObnJCrqbCbn6KenpeYk4qeko2Sk5WPmJiSm6GinKSgoZWgoaSmm6OrpaKkqqOrrqSusammpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlVRRlFPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Nzs8OD41OTg6ODg2NTk6Ozw5Nz88OTU3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7KwrLKtnaenr7m5s8DIurXAr8bJzrvCy83Jt8u/tMDHzLC2vci7wsfEvb+3urWlq7CunZqHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eXl9fYmRtjo+EkYaPkY+Zk5SSnJqinJugp6iqqKqmqKSjmKSupJSZpa+pn5uYmqCerpmbqrOfpaafo6OhlJOblpWSqKmtmpygoaCalJCMmY6LkIySjJaUkJ2hoKOcm6KVm6CioJeiqKOiqKugq6+krbelo6OirK2pqKuvs7iyvbWzq6+Yg3JyaFtYWVNVUkVZTFBcWU1UTlBMUFJJTklCPD8/QT89NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaivrZupqKy3tqy8yru2v6zMx8a5ws/QybXGvrq+xsu1sb3FvcPGxL3Bs7mvpquvq56XhoF3eG9uaW5ubnFnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/i5CKko2XkZeZoqCbn6qppq2qp6+ip5mfrKCVlqSop52Xj46Zna6Wl6eqmZ+dlKWhnpKQkpKSlaeqpJmZmp2dlo2Mi5SGiI2DkIuSlJCgnqCjl5WflZqgop6Tm6Wlp6iooLGwprC8p6CjrLSrraewtLC5tcCxrbGrkH1wcmJWVFVOUklHVlFTUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NzYxMzIxLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6vMPL0cyzubq+wMTHtrS3vbO7vMS+wrG0rrGusaycoohraG5vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/dYmOh5CJmImUlJebmZ2om5+qpaSqnKeYoKWbko+eopqXloSDkZqjj5OinJWWlYeimpqTi46Kj5mjp5yVlZebkJKHlI6MgYuNgJCKkpKRoZqfoZWTmJiVoqWZjJmkpqimoaC0sqeyt6Gdoresqq2ksrKmtby1q6uxo4h4cm1dTlBRTE9DTk5OUEtGTk5KSk5NUUlNSkFHS0hIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKmloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOzrrairbXEuruvqqy0r6+gl6h9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnGFiIKHgJGDjoqUkZOdoI6anKKho5iklqGblY2HmJqMc42CfY2WloWQmZCTjo57mY6cjIKKf4mYn6KekJOYloSOgpN+fnSJjnqQhpKQkJ2amZqQlY+djqKjjomaoKGko5uitK+sr6yfmKW5pqWwobCunLC7qqmvqpmBdnJiVkxRT1BNQ1NOTFFNQ1BQSElOU01ISkpESkxFSks9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd3t6KjtKilpaijpqWmpqazp6W0wLiwtLDKxrm6ws/Hv7WvvcOvsceyraeslaSuv7ixsJ+nra2rlpWicldWX2hnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeKk5Cfl52VlJaUjpaJf5OJXztXb3uLk4l/i5GMj4WGc4qEloF5gnqFk52Ug5WOkI+Chn2SeHFvhY1+iYCQjY+XmZiTio+InIiel4eIlp6aoaCXp6+oramon5ettKKmrZisq5intKKpraOSfXFtX1pOU1FWTERUSlBNTEZPT0lFTFFNS1BKSU1QRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCgrKy0zODU0Nzc5PDo3OTs4NkE5eLego66hpqaqoKepp6KpsKintMG5sbWwycO5tL/PwLqxsbjEq67Jrqejnoaborqtp6iWpqWkoZePlmlRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFBCQH+VkZF9iZSMhIqNm42WlYqSiIaVhnmIf2BKUW54ipGEfISMiYR/f25+f5R3dXZ4hI2ZcFGNiIqGe354lHZnd4WIfoqIlYqNkJKWi4OJh5SEmoyBhJKblp6clKSjp6mlo56bsKuhpKSQpqqWoaqcoqaoiHRrZV1bSFFRU0xJVU1TSUxMUElIRktOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Nzc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKiosNDgzMzk3OTo5OTo6Ojo/OXa2nKOnnZ+hrqGnqKWnqK+sqra8tri2s8K8t6i6ybm3qaq3uK22wKqim5ODj5myn6KajaCWmZSRi4xlTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgXuFjJKBkpmLj3uGj391f3hzbnVwdI2NgXl9iaqFeXpodnuOcHJteIGKjJJ4eoB7gHZzcpJ3Z3WEhISEepWJiIqMi4B/hIqMf5SDe4CPmJSblZGfnaien6CeoKmln52YjKekk6Cglp2epH9xZ2BcXEpWT1FHS1hST0pNTVJKSkpNUEhMUUxSVE1FSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5NDc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8PDd2rpijoZicnrOpr6mlrKywsaq9tLK8uLa6tbKgt7uzq52fraustbOlnpaSmIaUpJadjIOXiY+JhoaDZkpJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhZWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4f4mPfISYkoFyh498dntva36tfHOQin97hpKAfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcWhxgH2OcEOKhIKDhX53d3qLhX2LenV+jpKPmIqSmpujl5mdm52eop2WjYqkm4+dl46WmI51bWtlYVlXWFRRSlJVVE9QTlFWS05LTk9KUU9JT09LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKavrK6rp6mwr7GsvLisu765s62om7GorZyQl56nrKekm52TiJZ+jpWSlYB8inqFgH9/gWVKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFdZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZZ/SZKYbmh3foFsaWNseYWQkoZrc2x8bnJ7hmhtcH5zjYiDhXp9fnt2b3R0hYJ5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5GKkoyGkJZ9bGhtbm1XVVdUUVFZT1NVVVRYVU1OSE1KTU5LQ0lOR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6kra+iraqota+urLS/q7zCv6ajmpWlmJ6OhYyWoqSbmpSXj3aRfoWLkI98eH50fXh1d3xmT0VHREA8Pj5BRkdHS0tLTVBTUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4h1gYiGdGyZkXRze2prnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3xncHB7bpKNjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdjV1FZV1hZW01QVVZaWU5JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiZkZqWpKitnrKeprquq7KwwrK7w8ebl4+UmYuOhnqFkZqWj5KOkol0ioR3i4+Mf3Z3dXh2b3hzaVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bXGDgYWBeYSGhnlyoJR0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiIBoZmJpbnJtcIN1aW9YdW+OmpF2bH96fG1xbXB/enN1bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6CgH2PeHBubmpeWltdW1lYYF9TTltbWVhMSEpGSkc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qK2xrsGzusHGl5CMlJCBiX1ugpGTioSLiJCIdoSFb5iKjH95e3txe3R8a29eSlBHPkA3NDU4Ozs8PT5AQkVITExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8fYWDf4x+dqKZeX6GgISZhZucYYaqn52LgpCNenaJfomIjnOKl4+De1xkcXR6e3eKbGdpYXhvhY+Cem6Bd3OEenBzeXdrbmldd4d9h3yIh4+Ai5OXg42GjYZ9cYR/hHx1d3t9iHRtcXJkZV5aWl1TW2ZeWFFVWV1WR0tLRUxHP0ZAREM/QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgqp+wqa/AsbvGupaPkZSIeoZ2a4CMkoN+i4WQjXmEgnWiho1+foKAc4OBfWx5bFNYTEFFMzExMjY2Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXtxfI+Me3yJhn6Xh3ahmYiHj5KUpY2sqUiGra+vioCAk4qCi4KEkaiHgJiYipxzbHyBhod9jmhnZ3h+boWGgYVxhIZHa4B3cXl2aG1rX3d9g4h/iIWMepWenIqLiZF/e3WLdnx3bW93fn1xcXBqWltbWmNiV2dlXFVQUVhaUURMTEdPSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6CdrKGmuK+zvbSXjZKLmIt9dHB/ipN/fo2DlJV9hn+HpYeJgIOIhnmJi4B1hXlfY1ZMQzYwLi8yMjEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiZGBmpaCoKGYlZuapa2Tmbuxp7vHw6eKjKGljpOJgZB7coOen5GcfnaFhYuPh5BpaG+DgHSMhoSLcYaCd4d/e3aFfW52dWeBlI+GiYiIiYiiq6OWiY6YgHuCiXp6b2dreH13fHFpY1xZWVxoXGFmX1pPTE5YU1FJUEtETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGQj4uamqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWfoqBkpuOhIGCjIuCio6EgIqAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6ChkqOppaOsk6i2oqfBwq7Ir3i6lJp8jKGemISThYKPoZ6TmZKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGXh5OJj4+Xpbapm42VooOHk4R+f2tqbH1+fX9xX1tiXllmalxsa19YS0hPU1FOTUxGSVFERE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafoWTknqBkomSkn2LhZmSkYOBgYuOiYaRh4SIhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMm3yNHPvpugcGmrqZ+Ek5KFnKCampmnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ2RmaiIl5COgYhsc3N7fHluZl5bX15hZ2NfZ2dcUkVLS1FPSUpNRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl5QcXVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mImI15go2Ljo18ioaPkI6Bg4CJjImFk4WChomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49RkhAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKiptayxt7Kyrbuxs76cs8Ssu8nLuMO/t6WjsLKsraqji5aYhaWmoKKYgqaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7nKGjsJOjnaOekaSiq7Cts7WilaaqiZqKk4qVent+g3tlXmZaY2BdYmJeZmdfW09ESkhUT0ZITEZLR0ZGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo1NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMj4uKe4iDh5GOg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJUVVVXVU1cUUdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHxKuzxbattMCzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4mnr6qklXefpJehq7GzmJapraiutbuyuqyvtaKxrLK1vLi0rrWgqKijqJupsK2zuri4qJy4qY2lj5KToId5gYByV19iVWRgYGFeX2ZgW1VKREVMVlFJSkpFSkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFjZFd6dXGBlX2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYeFgY6AgYqPhoCGiIWKh5F6eW5dV0BFTjw2OjQ2QUI3NjQvLzZDSENRXE9RVVdVXVdPX1VJS0pBQD9HS0ZGRDs+QDdENz9CSkpFR1dUUF6PpK2ksrTDtrjBzMq2u8S9s7TBt7jCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqxoKKWm6KSpbGtpa2sp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6t7+4uri6ra2xprGqrr6wvbzDw6yZu6iVro+YmauJfoB5aFVhX1ZoY2hkVltjWVZUSkhHTFFHRElKQUlEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Fb3tyeIhiuaGZo4mVlJaTlJSOkJeSh4d7h4GOloqBhIGKenyLiIZ8ioKBi4SVfXh6dWZPXGRHRUw6UWRgW15TRj87SFBEWmNRUVlZWmdaU2BhTVNPRUE/SUpIRUZBQEM9RTZCP0hHS01TWlRelK+4tbu5ycC7vcrNvLzBvLi2vLu3vrW6s8ZhdbKlsZqeq76qpairqqSisrWgq6eelZaemJ+upaenpZ+kk6KnsLOosrK8tsG908nJ08bCxczCysTAvr6/vLy4tLC5t7fDusa+xMmwnrqroqyPpam3iYB8bl1fXlxVX11oZVNYYVZTVklFRk5LQT5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGPjYaQc2xycnSI1cC1mqCNlZmZkY6XkpaWjoaIfYeDjZaKfoJ/g3l7i4SHe4t5gYqCl390fXprZXB2WV1cUGVlYmBlZF1bWFhcTWRtVVJtbl9vX1hnZVVZVEtEQktKSEZISEhIQkk5REBIS1RUVl1aXJO5wLm+uMbBu7nKy7u2ura4ubS4tbWutreZZHWpnq1wXqKtnJihopuknqullJ+fkJSOlpiXqJ6mn5+amYOjnaykqrGtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKwMnPtKS8sbWwnKy5vZp9dmlbXVlXW19YYmJRW2FUUkxDQkZHRTxARj9CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLjAsQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQi4l8gYRze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWlgZmlpbVptdJetpL2Ih2dbb2hdWllUSEtPUEpLUEtUUUhMQUpGS1BfX2JnamKXt8ewurS7vraxxce2sLmxsbuts7Goq7itjbaonpynmk6anoyPoJaRp5illYqTk4iRiY+Rkp2boZiblZaHnpmmmqywqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8Sif2xhWltbVl5WWGRZT1xYT1FDQklFQ0k8QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYNocm95eYOhqp6ml4ybm5iLjpWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2lucHlpd31+y7/D36duY3huZFthYEtQUlVOWV5QXl1OUU5UUVVUXG5ud4Nylq64rLWosLarrb3Bsqu1pqW5p6yvoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSLg5SVl5eUm5CcmJmZnp6rrKSnoqysztLV0c3M0tPT0NTRzsjD1NHIztLT09fN0tHF0tbGwc/IyMOpv7jQnHdsY1tgW1ReUVxaT09TUE9JPkFHQkNGPUFCP0ZFPkA/Oj09PTxKQjQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBvd3Nsc318d3xzgnhxa4Bycmlwcnp5cnu+y5p/jbKEdnKFd2lhaV1EWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGppqqxuaumtKOirqKkrqKnsZ+JppuVk5GKko+IgpSJa5WijZmEgYZ+kYODk5esi5WOlZqOhZKQnZensKKgoaWkqMjNz8fCy9DT0dTSztPNxtbTzdTY1tbY1dfVytTazcrY1tHLrcTDy4hwbWBeXVZSV1JaT0pHSkpKQDs6O0VCRD1DRD5IQz9DQjs8OTw6R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYiIi4l+g3hzfH2Eh3eAe4eRl4GEb3hxbXV/dnh9dIZ8eWyHdnVufXaFdXl7nbWMPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhrbmlugYSJkYyen6CekZeZoKOkprKkpbKgoqWfoqmhorGch5+SkpORi46Lh4SPhH6cnIyNgoSFepR/gqqWo4ySi5iTi32XipqRqrOYm5ynnKa9w8W5tsXN0dDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR1c2xiW1dRU1BYVUVGSklGRj06NzpAQkM6SEVARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6LfoeSgomGhYqCiH14hZeXiY+Dh4aHeoR5cXt7hYZ1eoaOjp16jXB9cHB6gHJ7gXKEh4Bujnp1d319gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnFxcG53d4JlaW9ydnhye4yHj5OSm5agloiMk5yfm5+roKGsnKKamqCmn5+smYyajZGTjoV9iIiDhYuOoJmTiIOHfmyZeYSZh4iTjI6VjIZ7m4iTjq2qlJWXn5imrrW8qK29xsvIycvLz8nE0srU19jX2NfU29fT2dvWz9va0tbJ1cyTdXdmZVhXTlFSXEdCRUlJPkI+PTg6PkA8Pkg9QEJBQkVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmx2gIhxkZCbgHmAjn6CgYKFf4R8fYSYjoeLfoaHgXeDeW57e4eCdHqSno6hdo92g3R1gX50gIRvgZCCb5KFdXyBhXp2h3yJuMalw8q4gpacj3hwZk5lY4J7gneFoZCLeXp3e4SAfIR1bZSWlZaQmJGDiY+XmpeXpp2YoJefk5KXo56aq5aRkYuNk4OMhYmJgYaQkZ6cmYiFi4GFl3qIiZ+XkImOiouCfKGJkIu8oJiTl5qcqKalrZ6ntb7Av7jGyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGg3Z2ZGZhXVJVVVRNS0RNRDs9PDw5Ojw/OT1BNz4/QD1APj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs5OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eot8foB/gH6Fe36CkYqFhnqFiHx2fnVtfH2HfnR/kp2Rn4OSfId+eI9+eYuKb4ObgXSZhn2CioV8fpF7kKmPkMOgvYybpJx+ioR9iXOMi39zppqcmJSFe4+RiYRpR3GhpJ6MjJGShYiLkJKVj52bk5SRl42MlZ+dlKGVk46OkIx/kI+Oi4SJk5aZn5+IjJSRnZCCjH+mmYiFjoOGhIClhoqLuJedkZSWoaagnZ2do662urSrwMbK0MjHzc/T0tLY0tXXwNfY2dvY2trZ2dfbtnZ1dGdmYlRdWVJPT0hDTEM9PT45OTs6OTk8PTZAPj49PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdPPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PERSU1JYX1ZYZm1tbWmBjopxc3mKe3uAfH98iHt9fIuHg351hIZ6c3pzbYF+hX53hpuhm56UkoCMiH+Yh4Cckm6IqYV7oIx8kY6DiYScfpuRio2jop+RpK+gi5GLhouBk4ZXcq2Ln6ubkIOZnJCPjluDopGCjZ+TlIyGiIySkoyUlZWQjI+KiJabnY+VlpKMk5SGgIuJk46Kip2XmKOihpOdlaCLiomOnZCDiI+Ag4eFpYWLkLKYnJKUl6GgnpmSm52nsbispL3Cx83Ixs/M0MzO18/R1K7W1dja2Nra19bZ2p1seXFjY1paVlFVV0NASUQ/Pz46NDk6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieGxifpGDb254i3h6f3uBfYd8fHeGhYBzcIWCe3V3dnSFg4V9f5Kmop+mopeKnZCUl4uKqJdyirKNhKiShJmUhZqMo5agmJOJm56ik6mwoJGVkY6OiJaMb423hJrEyLKcoqacnJiWkbGQZKTNx5WOhoeJkJKNjZOVioWKioaWmZuPkJSTh5WYhICPi5mIjpCql5eko4iZnpaaiI+Hl5iKhY+NgX+Hj6WIjZOomZeTlpihmJ+Zk5yaorK0paO8wb7HxsXJyMnCytPMzdSo0tHW1tbY2tTT2s5/b3tkYFtcW01JU1lCQUdEO0I+ODM3PDw6OD42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGOfXxtfoh4en57goKDf3d2gYN8bW6Lf3t9eHh8hIeKfouis6ejq7Oil6efpaSWla6ig5G4lZKzmoyioYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmpehwI6jybirnKOmrZiSm52ynYWGqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4eUmIaEkZCcdZGZspWWpKGHnJmSkIuQipebiYuWjoZ9jJieiZCQnJqak5iXn5OgnZSem6CxrqKkt760xcfEvcPDwMbNysnTps7M09LR1tjT0Ni6b3ZyWV5TXlROSElNRUJDRDU+Ojc3Oj88PDc9NDI2Njk3NzQ+NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdNWlxZSmZgO0iEi3p6boWGenyEeIGGgX5weHx+fW9yjXp+gnx4houJhoSSprusqLG9sKWts7Ooo6KwrIqatZ2juKWVraWXqa24p6Sjn5qpmKqkrrCqmpmclJWRl6CYmru7rsqhara4q7CUmZ+jrJOXvqNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJWNi42WmJOdmbSWlaudipyUko6RkoyYm4qSnpCLiZafoY2UjZiZnZKbmJ6UoaCUnJ2lr6ihpbO4rMLIxLa6vbzFx8fC0aDGyc3NxdfW0cvTn213ZVlXUFxQTkVDPjxDQUI4QDg4NT9HPT02PDM1MzQ1NDU0QjQ5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicEpAi4p+gHOGh32CiHWDioJ/bn18fX9wd4d3joKHfI2PjIaMmanCwK+9xruztMC9tK2rs7aMqLKtrb2rm7ulqK25uKumpqKipKOpr7Kxqp2cpJmbmJefoqalkqS6r6nAvK2usrmlpKh+iIacrb2wgouMi5CDjoORj3qBiJCNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpiPkqGRiZSbpKyUlo+TnJ2ToJ2bmJ+hlJqep6akoqOwsqbBxsOvsLq3xcTDv82mx8THxL3W0M3EyoVwb15ZV1xYTEpBS0FGRz9BQEM7OjQ+QT09NT02PjM0MzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVONzlHRD9DRlxlRmBpZ1pdXJOMjIl7h4yHg4x1h5GKgW9+e4J/cX6Be5V6kpSUmJCTlqezxsm/wszCw7nHvbuvq7m7mLO3urLArqXBpKuvvL2qrqujo56nq661sKqcoKucoZyWn6+1p4ujurq2wbysqZ2zpaSolIWOqcTDpIKLj4eIhIaVlI15g42Rj5GhjIyUko6Jl5+Yk5mVmKagr5yMq5yNlo+SkZWVjpCVko+hlIaXn6CynpSZk5+gmKSemp+boJSYnqWkpqakr62lwMTDrqi3tsnDvrbPssS/xLyz0crIwrRxdWlZVVlnUExIQkxLTEpBQT5ERDw1QUU7OzM9OEIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGZUYmuZjZaKjIiTkIaJeYeUkIFygHuNf3iHgoKQeo2hlqiZmpm6vcfIycHSycvCzb3Cs628vqi6v727w7eswamss7y+qrCqpKWkrK6zrba1oZ+vn6WimKOzvaqbqL3BpLa4r6yUsqysrJeHmqmmpZGCjJOlloqBdYqSeYWOkpCeoJOPk4yPjZSjmZaclZWjnqqekaWajI+Pj5WWiHyPlpOSo5qVn6GctaWQnpako6GlnZ2mmJ2Vl5qko6mnorKsqLvAw6+ls7fMv7mvxLO7vsG4rMLDwsCXanZeVVRZWEpKTElGRERIQ0NBREw6NERJOjs0PDhFLjEyMzUyQjI2U0hPPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGJaY2NWno+cjpeOnpKJin+KoJOEeIV/ln9/kIiKkYCWoZmup6SYwr3Hw8fF087Ozcu8wrewury0vcu8w8G2t7yts7+6va6vqKCpqLatrqmyt5qeraOnoZ2rt7iqpbC/xLK9ubSoq7a0rq6XlqWsqJ+RjZKyxaeWjnySlXyHkpmPqpmYk5OPkpWTpJ2TnZmUoaOinJifmIuMj4+eiFqQlpeSl6SZZZijn7KllaGVq6upppueppaYlpiUoKSopZ+2q6m5u8O0pbS1y8C4qrarsru4rqi4ur24gGhrV1RSU01FSVJNSz9BSEVFSEhIOTVFTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKer76voca8xMTHxs/PztLKv7u2sbq7u77PtcO9uLm3s7G1s7izq6ecq6y5qqmnr7CYo6+lp6OltcCwrKy0v8O6wLq0p7q2ubSvlqWtrq6ki5OUoY10wpp9l5mEjpeZjLGVm5qVkpKZmaWjlaCbl5qpnZugoJmKjZCWnGBKlpyalZqlllWXsKCvnJ+klK6tqqSaoKWTk5iYjZygp6KatKiqs7u7u6qxssfAuaasq62ysqOhsrK0pG1qYllXTU9KRE9PUFI7R0tJR0lDQz46S1U/QTo9RU0wNzUzNDpCNDRNV087SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiqlpmgoqivmZGXh4uolo6Ik4WgiISdl4+doZqjpLXJtanFucLDyMrJyM3Nxr+7s665ucHBzLXHusG5tbqwr6+ztaekm6q0taqppq2smqSupaSorLu/qKy2t7/Bv765s7LEsrm+raOvtay5poibl6abdr+fhJmdjpOamoyul6GcnJeUm6ChqJ6on5qaqpqhp56YkI2RnYNudpKimpWdop2RrrKjqpSoqpepraOinqSnkZGZnIeUnaKelrGmqau5tr2ysq6+ubago6eopaacm62pqYtgYl5dTkpLRkdNSlZMPU1FTktMQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5Wbop+7r5mUn4yTq5uRkpOJq42GoZ6Mo62Uo6O2xr60wLnCwsfJxcLOyMK+ubKvubXBwsq1xrLCvLW6qqitrbCjo5iqtLumqaarqp2pr6ejqqu9u6itvbW4vse8t7a4wrK+wbSqtbervqWPo5iSoqC8n4maoJmXn56Pt5+pnKWim5yhmqiks6CbnaacqKqemJWPlJuLlomMpKGUnaKdoLWvpaSSr6uZqqqcnKOiqJCUlJ+Cj56enJWppKGhs7S6tK2otbKznpyjpZqXlZiqoZ51XVpdW0hHRUZMUUlNRUdHQlNMSkJFR0FWU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OdcGJHRaeXo5+ew62cl6WYmqqclpqaj6qWlaemla2smKKrtsPDvL62wcLAx8S/zca7vbmysLmzv8PItb+wvLe5tqakq6ytoaGZqqrEoqSprKaerK+roqmpvrinrb+yuLfHtrW5uMCzwMK4tbO0r76jl6OXlJyUrp+QoqOlo6OgkL2kqZ6oq52doZulnr2hmaOfoqmsoZ2XjZWek56Hj4SNk5+koJ61rKWblbCmma+lnJmonJ6MmJSeg46gmpuSpaSal6uxtbGqpaqurJuYoKCSj5CVqJ6UZV9XX1tNSEdKTkxIRURJQT5RSUE8R0lIXFJPSz1IT1U0QkY5PkhHNUNhW0tCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1SRjxLeGVhVkuimqOcnsWsoZ6sn56uoJKjn5akoKaprJi2saKqs7bFxL2/tcDCu8jCv8rHtbi1tLGztLfBxba+sbi1ubSfp6yqrJ2enqWkwaWfqq2gpKmtr6GmqL21prG9ube2xLK0uLq/tMTBubmus7W1o52llZKUoa6gmaKeqaiso5rCrKmerK6bm56ZpqC9oZ2kmKusrKaimo2an5KeiY5Xf5afpaGguKqnk5i0op6xn56ZrpWdjZiTnIGOn5eVjqGjlZClrbKqqaKipaWVlZ2Yi4+RkqSeiV9iWGJfS0dKSk5GRUFHSz89SkI5OUpKTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtNnp6hmZ/EqKWitKKds6eTq6Wgo5+sqaydu7CorLaxx8XBwrLDw73GxL3EybyvsLatsLSvv8S0ubGwurSsmaixqaqanaWhp8Ktm6yxm6qjrrCppam8tqe3u76vt8Sts7PDwLTHtLu4rLS2raqippaVlaSsop+gm6eqsK+vu7KmoKmpmZmYk6KjuKCho5KvsKylp5+SoZ6Vno+QjZWem6Kep7OmpoyXspuirZmcmqyPnZKVkpl/kaGWj42foJOLpquvpKainKCekZGak4WLkY2bnX9fY1lmZElITEpTQkNASUg7O0Y/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ6jn5ygw6mkqrOipLWqlrOsp6GksqyuqbuyrbG1tMbAxMK0wMS+ycS1v8jCtKu1qLC5rL/Es7eurba4pZiqsquqmJ+ml627tJuosJqsoK20sqirubKourS5s7jAqreyxL21x6i/r662tamnrKGYl5KmpaKimJilrriusrW2oJ+opJqVlZSkoLeipaWWr7Kyp6qmop6ampuVl6ifoJihnq6yoqaMl62YpKuWmJ2ij5qMkpaYhZWelIyPm52TiqipqqGnoZielYuOmY+BhZSIk553YmdbamlMT05OVD5DQU5DOzpJPzc3Uk9dX1JWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJb2hVQ1dGjHlmQzujo52hpr+np6+xoam2q566sayjq7S2sbC5t7C3uLjEvcPHvb3EwsbAuMDFwLqptqSsu63Bwre3qq2yuqKUrbGtspakp5GquaqfprCcq6CvtLOrqba2rbyttLO5t6y4scO7v7+mxKuxt6+oq6unnpiZq6GioZGYobGvs6ywuZqcqaCal5OYp6C2qaajorGxtKyzqKyfnKCgm56lnKKXnaOzsJqfkJOkmZ+omZOhnZOWiJOWkpWWnJOIkJqYlI6pqKafo5yXm5KFjpmLfYuVhI2ZaWdrYGxtV1BRW1VBQkVUQDw7SUE3OlhQZF5QV1dFWV9eTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEtLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9p5+doqm9oqqwrKSyuKqmtrSsoK21va+zuLu6vre2wMK/ycS5xMLAv7jEvcG3r7Wnq7eyvL6/tKmusbaelquuqK6XpqiOp7ufpayznquisbCzrKm2tLW+rrGytaywtLPBu8a3rL2wsbisrKqjsqaepaqgpJeRmp+zqrOrq7OanaecmpWOoaaktK6ooa2urrGotK2yqqScn6iknpWimZuotamWmZKSnZmdn52QqpyVloSUloqdmJyTio2WlpqWpqWjn52WlZeSf4+UhXuNkoKLlWRrcWZvcV5GWWdWREJNWERaOUhCNj5cUWhcT1ldR1teXU9NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVVxnSzaMemZMQKSaoaWtt6Wsqqavrreqr7W7p6axt8W3sba9wcO1tbrEvszGucPAub65w7jAubK0q6m6trq5vrSqrbC1l5inrKmsm6urjqu+nqyusqOroLGts66utrK5uKqurrGota+1vL3Ks6q3tbG0r66mobSgm6itoKaWlpuasqKtoKavl6GkmpqTjqOlqLOqoaazraq2pa+yta+kmZ2sp5qYn5qZq7ejl5OQjpecoJeWk6qempF/kpeMnZuYlZCKlJKemaSioqCYlpKTlXqLj4V7jIqCipFqbXdtdXthRmFrWUlIWlo9e0pGRDZBYlRpW01cYUtcXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVF9UXy81KENfUVwuK0IvSkdQW0czY1lUS0SZl6GxqbKqrKakr662qbe1uqSstLfJu7S7ur+/tLO3w8DMyLzDvLa9vr+3v7yxvK2nurm3tsK2q6yxt5SWpq6rqKOwqZSvu6StsbOnqKOytLGysbWxuLSpr6yyp7evt7TExreptrassK2pp6O2oKCnsaGklZyalbGep5ygqo6po56blpimpqW4qKOytayosqeusbWspZmgrKibnJ6clKm4nJSOjoqXm6KXj5ekoJyTgpCUj5ybl5aViJaPl5qnnKSgkZaRkJV2hI+He4SBg4uKbG92dHt+XExmbVxKTmRcP2J7R0k4R2dXZlxMXmJNWFlXVVdUaV1PT0hgXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2YyNydHYkxWJS1CLj1FTFE8M3JrSUNDkZmlr6Wur6uopbGztKu3srihq7W5ybmtwbvCuLOxtcLCzsXAwb20vb+/ur68ssOnqbmwtra/vK6rsrGboKexraamr6WdsrWtq7GyrKmotbustbO1rbStqqyorKm5rrKxyMC5pbqwqayspaiusaalo6+kqZyenZuvmqOjo6ORrZ+joKCiq6anuaWstbelq6yprbC2rqKeo6mqm6Cbm5KktJmOio2HkKGglIyUnJ+SkIONkpKcmpeVlIeXkpWZppufnoySkY2Qdn2NhXx7fIaIiHBycX18fVxTZG9eTllnXEZElltHO05tWGJbTGBiTlZXVldUWGddUVJMY1lbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6SD4zQkhTLD6QaztHSI+cqquiqrGkqaWztbK1trKyoauuvcy6rcC6x7G0rbTBw9HFxr7Asr7Awru+t7vEpqy3rLK3vMCvq7Gsn6OnramopLCjqrKqsKywr7Cuq7O8p7exsqmzqqulpaOtuq2qssO6tq27qamnrKmnsaWqpKOuqqiin5yjrZWlnpiemaydoqepoq2mpK2suLKyoqqioKyvsayeoKenqZmjmZmPoKaXhoSOioueoI6KjJWajo2EhY+Un5yUl5WGlpOTl6SbnJyKkpCNiX9+h4V8dn6Fg4VycXCIdWtfWmBuYlFzcVxLO4R8Rj9YdVhgWk5kW05WVlVXUVxhXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnREY4O0IwNUVLWDFAlVk9TEWVmK2ooquznKqqsLetuLavq6arq73JvLC9tsKvsauzw8POz8O+v7TAwsO6v7PHw6qut62yuL6+sq2tqqSnqrCop6ixpbSuq7GvrbKxtKy0vKS4s62sr6irn6OesLerqq27t6W3tqSpp6urqq2hqaemsbKkp6WhoayXqqGVm6CmnqWiq6Sto5+nsbiurqSmo5uqq66pnaKlpKSYn5uWj5ickoGCkImEnJ+Lio6LmI2OiYKLl6KbkJCbi5OSkZOimZuZio6Li32GgYGDenN/goB8cnWLpId4a19gbmZXZYdjTj9nk0xFYnlXYlhSZVRNVlVWVE9cXWFVS05oVlZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZaLjBKZ0FBPDxCKzpKT140RIY9R0ZEl5OwpqOrsZirqq22rLayrKasqqm8wMC3uLK7taWyr8PJy9G/wLu5v77BucG5wMSssbWxs7rAvrKxrqyqq6i2qaaur6q5sKiysq+zrbeqt7entLerrKWpqpyjnrOzqaiktLWgt66gqqiqqKunoKusqbm1qqqpqaKqoK2ck6qhnaCloqajqp+dp7Svqaero6OYpaenqpyipKOgmZigkY6PmI1+h42HhJ2dhoOJiY6NjouChZSimo2NmpCRkY+Sn5eYloyKg390hoF/f3h0gn55dn2Ah52Pb3JnZnB3XGFziGtPXplWSG55VWRWUWNPTVZUVVBPWFtiVUhPaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EPJaOsaKmq6+arKatsLS1sKymsKqour67wLCtua6htq/Ix8jRwL69u7vBvbrCwL6/rrKysrW8u8KxsbOqs6mktKilrbOzubCjrriysLK7q7qwqq62rKqfqqyfo6C2ramhn7CzorWqnqinqaOqoaKsrai9r6yuraKoqKCsmZCwoZiioKennqibmaqxqqOgrqKhlKOjo6eYmqilmJeYno+Kh5SIfY2GhISjloSBgYuGjYuQg4OTn5aIkZyQk5GNkZyUl4+KhoZ3dIF/fHV4eX95c3J4Zn+GpHZpX2RqgHRniIx9U1hvXkp4c1NkU1FeTU1SWmZOTFZZZFhHUmhSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQDSRkLOhpaetpKekrae1s7KrpbGnqri+wLuvp7mqpq+xycfI0cO8v764vb68yLrBuLCvtLG6u7jAsrK6rLisorSnp6yyt7qzqKi9tq62vrC9p66staytnKmvo6ClrauonJ6rs6W0qJuqp6mjqJ2jqaipvay0sK6dqqSgrpybs6OWpJylpZ+lnJupq6afnKuinJOcoqWemJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2Lh5CNj4N/k5qThZOhjJWRi5GbkpWHiX5/cnt6fnxoeHx5dG9ve2aEeISJZGFnYXKEem1neF1eVD9Xe21UYlBRWEtMTnJ1XUhaW2dZRVVlUEQ+Sk9EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mYkFKN0dTYFUqPTlEVz0qkJWymqCgqqaloayluLOzpqmxpqy4wb21r6K4raiosMLJyczBtr3AtLe/usi1wrWzsrWyvbi5vbWtubW+raCzp6ursLa4tayfvr2qs8G0vKGvs7WqrJ+tsKOcpqmqpJ6bpbGnsKCfq6mnoamcpKihrbyorrGuoaujpK6en62ml5+boaOcn5yapKujnJulpZaXlaCjl5uXpayMnpGRkYuCioCAjoB7mZSMiHt9i4aPjYuJhJKYkIaUo4mTkoeRmpCTgYh9eWt+dnl4Y3x6cG9vcXZnf3NphGhlZ19sc41sYWlvYG89WnlrVV5OUFFKSU1UWldNXV5sV0RXX09eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBaFkxNFM9ZV9ETDZLVmRPKjsxTlc9I5SZrZqhmKilpKCopLiwr6SvsKmruMG5sq2fua+rqLS6yMvIv7bCvq+0vbfEtsOyrrmys8C0ur23qLm4vaqjtKipqrGvubGrnLy9pbDBtbair7a1p6ansLOfnqSmqKKlmZ+sqKmeoKqupqCmmKOooLG5n6Oxr6GsoayknKemqZqam5+klZ2dm56qp5ecoaqTmZSZn5OZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo6JlZ6IkZWCi5aNkXyFfHNwfXF0dGB6eGhtb29taH1xYnttaWViXWWFfl9ac2pxSkl/aVhaTVBMSkhQUlFJT1xfblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+L1dVNSiXnqeanZetoaGhpaK4q7KltLSpqLnEtbKtn7etrq2wtMbIwLa+wbmwtLy2vru+r6u9sLS/sLzDuai7urenp7WoqKuxrbSxqJy/uKatvLeyn7G3sKilp6+xm6GkoKWloJebsKehn6Oor6GfoZOkpKK3sKGmsaufrKOvmJyqpKmfl5qepZObnZuep6uanJ6ml5aYlp6Ok5eiqKKQiYuPhnqEfoSKeo+WiY2GeIGHg4eLjYWNk5iNj5aZio+XfoaXjI95gXpwcndvb3RfeXdka2tqZ2eCbGVya2tkaFhhc39eWmx1aVlFfV1bWE9PS0hIUlVHMjpeXmxQRFdVWWVNSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJmW0hUQ1RdaEUuOzFeUSwylqSjmJadqp6moaOhuKqwobu4pay9xLKvrqK1r62tr7TExL2zvrq3sLO5uLq4uq6tv7O0ua6/wbervbq0paKzq6iqs6yusqSdw7emqbe3q5+yvKqnpqivq5mjp5ylppSYobOmmp6lqamcoZ+UpZ+kuamkp62mnqWhqJOfqaGhoZmbnaGSm52XoaOsnJybo5aTlZabjpOTo6ekkIiKjoZ5hHyFhn2cjYmKhniAg4eIh5GFlZOSjJGVlI2OlHuDl4+Kd398bHVybWxzYnl0aGZpZmNthGZnaGRmaGleZWJpZlplemJgUHNUW1tTS0lHSU9TQCEraV5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YUwnMp+kpZOPpqecn56epLatqKq6t6esw8C2r6yita6nrq+3wcC9scG3sK6ytrW5uLWsqry0r7KxvcC3rry8saSftqymprWqq6+hoMWsqqextaystbqeqKmrsaWYnaqep6WSmaWuo5mepKqhm6GcmKCdp7amr6muoaGdnaGVoKafoqCZnJqck5qelaafrqOYmJ+WlY6VmIyPmJqnoJCHioqIeIV3goKCnIeKgol7foWIhoSQhJaVj4+QkZCRjZJ7g5WOhXN/fWd5cGtrbGd1c2thZ2Nic39hY2VmZWlpYmVvWV5YXGxjYUxnV1tgVklHSEtNUlg+OWBsaUdCVVNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyosL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGJGJTWdpKGSja6hmpmgl6W0sqOyvrehsca7ubCwo7asq66pub69u63Asq+vrraus7myp6u5sa+us7a7tq+5vqymnrWroKGypauwn6bFobOmsLOwt661nq2urK6imZ2nqqWelZunpqCZpaOpnJqfnJWdnq2wprinrqKhmpqemJ6jmqWdl5+YnJWaoZOpl62pnJWenZSNlZqOlZSYp6eNjIqJjnuBdIKCi5iFhnyJiISFioyIkoWTnJKRkJCRl4+Qf4GNjoJvgn9neW5oa2pncXJrW2hjYXJ/YGRnam5rZWllY2xcbGx1cWFTYmhjZVpJR0xNT1lRUFVhZYFUQFZSWlRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjQ8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUhiQic0lKOcj4+xnZyUoZups7CfucC2oLTCu725saa2sKmupbi6uLisu7Ctq6u3qrW5raSytbGvqbG2trGztrunqaC2qZ2fqqOqrp2sxJmvprCxt7atrJ6xra+qopudpKypm5Wcp6SemaqjpZWaoJ2SnKOrqqi5nqekoJeamp2hj2ujlpmdcYOXnKWBdpKsqZ+Wl6KSipiZgJeKn454hZKNg21pfneEcWyGioZ9hIqGb11kYGeEl4Zri5CUknV4i4R/g5B/ZoiAaHZpZlhdaXRuTlBqY2Zxg2ZdZGZua2hdW12JkIWHaE9LQzhFVGdeSkhQUFVWS0hSYXB0ZUZbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOW0tbZmI+RzFOYTwrL46kmoiWspudlKGcqq6ro73Fr6m3wri+vK2ntrGmq6S4tLOzsLmuqqestKWxtaKnuLa1qKettrOutK60oqmftKueo6Wdp6ibsL+VqKextLmtrqSoraqrpqGfnKGop5uYoaWmnJynqJ2TnqCZkZ+oqqOzr6Oio5yWmJiXo4ihj5KaiKGIlZ+if6WAqK2flJSelImEcniMjoOIoHWHjWmXiWZ+c3igb4eHhH6MfH+hoJ+Zf3uHnnSIjnabimyHgoNtaGRke21yYlSGbWNtaZhxWGlwboZXXWhaa2paiHBseXKHaIeEWV5GTT5GXk1FUlZWUVBSV1RnXkxaTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTltMW2dfPUsxVF43LyiNp5iEnaydmpqdn6uqqKq/w6+yury3wb+qpLexqqymtLWur7O2q6mlsa2ltrObrLW2tKanqLOxrbKorp6robOpoKSlm6KlnrG4laanp7e+pqynqaqrp6aioJmhqKOZmaejpZmcpaqWk6OclZSkpqahtqSjoKSYlZOYk5yIrpCYlYqqjJmjnYaxgaWun5WboZd6gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsXlobFixrm9labySvG5oem1xj9h9UmtitrJ9f3CUdZqhqpBWTlhhT1ZORlVcWFBQU4tbV1tQQFxEUE5DRkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV1nXD5MMVpbNDEhj6eUgaiqn5idnqWtsqmxwr2ytcC1uL/Cq6a0ra2pqLC1qrC2tKioprWlqLmunLKytqqlpKeyr66xpquep6SypKKhoJecoqCyr5afpKG1uqOqqKGtraSinZuao6mgmJypoJ+YnqiokZynm5SeoqejobCjnp+jlpaSmJKZha9raouOqn9ohZaHrWZxn56Vm6mXca6hpH53unxroI92sV9qtFulgGWckGBmgXpmf2l4aqllvnJnpox2sWp8sXh1kZRjbW2nblyEoEVpZ4eWRXWcYH1me6OmgVhfi6tofY94emqoOEqvW1hUbWNaS09YX1xWVjtOh1BXVi9JU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWDMxG5KilYOtp6afo6SrsrittL2+sLfFsri7w6epsKywqaqxr6SxurClpa+zo6q5qZ2ysrCjpaGqrbCsr6aon6OisZyjnZmWmZ2esKmYnKKgtbOhq5uhrayfnpqXoKOpnZmepaCdmqGopJCdo5uXoaCsn6WmoJqgoZaVkZaRmoa1m7V5hqmatpl3h7Obt3+Ul5isl39rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iXCPhoB/iJCXeIOCipeMg6CPhbB2d59xa2ttfItPpVhIY2OZfmNopV95cXVSkoZdUKluY3B7hYBhnS9Som5bVGtnYExLXGRYXFpCPrB3V1hBI01pRkJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVQ1MByXoJSJs6amoa6pqLOsqru2wrC8w625t8Krra2vr6evs6qir7yroqi2raSstaSlsrOoo6Kdp6qzqbCopp6goLCWoJqWlpeboLCknJukqLWvoaiPqaeqm52WmKCmqZufnaOgnKCjpaSWm5+Ymp6jq5ulmpyaoqCXk5KTk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKPnY2ke42GooGlgnmreY+dVq97iX6farlauXeFhH2mgpR8mXqqeY6dkHuxbY6EdJC7hm+VUK+nxYpRoHpjYKpic3KHa5aHXlK1tMiFfoh8Y6QzQp12XVFqaGRQQFhmWWRhSkdMakpaU09ZZlpDQz9FPzA8PDU5PDc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbGoqaWzqqW0p6S8t8GwusCyt7W9tLaosrGksrOmoK+2qZuouq6ksLGhsrSxoaSenqipsam0qaWcnp6sl5mZmJiWmKOun5yXqK6xqaOejqyip5admJyhp6KYoqGioZuio6icn6GelZmbp6GcppSbm5+hmJCSlZCdiLJuaLVyrIhwjqdztHV0tnucmaaOkJ2No36PnqN+sHWCkNLSdVyufIV/pG6bqqZqhoV9rX2YmZB7sXOTnY95s2WWdIWebp9mlFLJi1rCXJ95Yl+tX3ZzhmGWiF1Zyp1vwIB0TUu1U1XGZFZSamNlWEFPal9saVBVRkg5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqOekaWvraWpuqymtaWntru8sru/uLe1vLy0prW1o7Kyo6CssKWYp7uupbKxnbS4qqClnaGqpbKorKqlmp2bqZ+WlZmZk5Skq6KYk6ersaahlpKsn6WSlKGcpaeglZump6Kbo6CumqGenpCWnKOfnKWUnZWZo5+WmZaTm4WsfHiod6OPi4epcK6LhKiEmpqji5Oai6J9kpeHroR/gbNccrJTr32CgqN+cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnl4hqXa93lZ+Pd2w1ecius2BEVW9eZ2BFUGxfcG1WVU0uZWNoUllQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdCYEk6NzegnZSgt7GZs8GtqLKnqrK6uLS5vrm4s7e+tqa5taG1raCgqayglai2rKixsquttKSbqaCgqKK1p6aqpJmelaWilJSdmpKWpKiclJCnrbCloJSYqZ+ij5GimqmmoZWapqmenaSfrZ2hnaCOlJ+cn6CYmJyWl6KglJiRp56HqX5/pnmhj5CEqnCtjYKnhpehooqYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKeBjpuNkqR8lZCfhHuyXpxkoH2ClW6TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZE9KQ6FcW010XWJmTVphX3J0X0pVNUqakVhIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxPZWRBJlVmWz8xVF9iTDdGSF9DMT03op2amr6tmLPBrqutqKa0sLixtb+5urOyubyqu7ahsqWfpqenn5Orsqmwqratqq+hmKKgpqSkuqOjrKGXm5GjoJWVn5uVmaGhkY6MqbCwpp2Wmqemn42SpJiorKiVmKmon5+gpK6joZ6hjpWhmZ+gkpyXnJaeoZaXj6ycj65ucrR0qYx3i6Z0tHp1tIKUpqSTnY2JpIeOdbhui3uLomtrtlqhhmWXl2igoqdtlHK0c5OZf7NqhZKIrWp1tGGdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdlVG9uLlunT2JSa2VibFliXGBwfGNTWVE+P2xvMkJCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFBOKWanJ66o5yxv66tq6unt6m4r7XBtb2ysbu4q8K3qqyhnaekop2Sq6uotqOzqK6qoZedqKClq7ido62clpmQpaOWjp6hnJmen5GTlau2sKaZk5usqZeMlKaapa2jkZersqSgnqissJmho5CZoZegm5abl6GUnamdlJCrmYfUlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsKCmrJhg7p5wHx1uGK1gYyHqX2WgqypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gYptmohwbY2kdL1dd31bYXm8alpWW2l5XmlgZGZibXlvWFtZQ0FAcT9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTxMWy02QDmnmp+ivKOXsMOvramqrLGoua+3xbG7s6+8sK7Bsq2mo5+kopyckaqlqrKktaetpJ+WmquZp624naOumZWhkKagk46dpJ+Zn5qQlpOvubGrlZejp6eUkJalnaStn5GgqKufnJ+ppLKeoqWOpqGVoZqcl5WkmZCwoJKVqp+FkJm2gJKSjbiWeIOTm7Z3bmxvdG95j4SOiXKewLu8mnuBsqhwgHSRuYN8hoaKh417ioaNl32ku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycXe2jF5/eX2JZ4N5bHlii6xwdIV+WFunaURkWVRmX2NdY1FnZnFtdUJNT0xEO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlbLCs6uqqKyrqruvscavtbSwuKe1ua6rpKKnn6CdmZSspK6qpraoqJ+clqGknqylvqehqpeVnJGim5KQoqiik56XkpiUsrW2rJieo6Sii5OSppymq52WqaWmnJuhqaeno6mhkayel6Kel5aYnZ6PsKmUnKeij2t/apypeYl0f5uPdntmh3u+v8C6b5KDcZSFX3JqWl6biWFjh46Va2B/lGNtnHZilGuAmpWUZV5gY3GaiWhyjHyGlGZqfnB0eH59Ylt4dIFoUFxuhHx8impYbHmBcklKb4VwTnJNRFZcZmBMWldmY19PWm12anJST0RFTTxISTxMPjIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPlxPJz8yPqifqKHBpJm0ubajrKaup6i1sqzIrLC0rbakvrGzp6Gkqp2jnJqarKeupKW1qqSbmJWinKetqb6oqaWVlJuWoJqTmaapqJGfkI+YnLCyvqybp52noomTkqmbqKScnKyfo5qco6etop+qopqum5SmoJeVnZ+dmLGlmaKomZ2Sn52kppuopJudmpybkZeCaG59cneRl5SQhIm0qo2FmJWPioyYloeUlYmDk5OQiY2RlJmTmZean6Gam5Sfm42CeqSFbGl7kH2AdYmLgnKCeHl2doqAfIlqc4J0g3Vkd312a295bF9iW29nTVhZZmpfV1lwem9tZlNPRlI5UFpOUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsLG3oKmms6elsLWqyautsqa1psCotKGepaacpZaWoKunraOkt6ygmZeWoJitqqbBn6yklpKcl5+YlJWin56jqJOQmKiossOvmaucqp6PlpapnqucnqGtmKGbnaKlr6ahpKierJiWpZ2ZmqGenp2woZ2ip5aZlJqUoaOXpKCZoY6XlYuLjpCYro98lZuCkYGJqaiFgJiWi4SOn4h7hJGGhZqRh4aKlY6bl46QmJ6jlpmSkJyNf41lobOuhImEd3uQin53eXpvZ3mRgYGJa3WBeYhyaHN/eXWDhoFqdGJ4ZV9oZGNkZmpYa3txamtcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r76tqq2xsqCqprKtoqyzsMWwq62ks6+8pLScoKijoZ6Zl6imqaakprO1npWVnpqasKauvqGsopGRnpqalJKWopyXqZ2Enamro7THs5+ppKqWlpiap56pnKClq5Sfn52fqq6opaOroauanp+hmKSenJ+dsKSZn6mUmZmek6abmaqfnJdmhJN9ZX+Pm5BjeYxsaGp6kKOramWamH5ohYplZWloeo2ijmtojJeRondraouZop+Yc2xueoSMhnlYZV2FgV5si4qCd1xnc3d3koCIgm94gnh/c215hHN2iIeNgnpohFhdanNkXXOIaWt8cW1jXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSi42Wk82KUVZL0RPMVlCOz8uPaSeur25r6uzsKulqK2usKaurrC9saqopa6wsJ+tmKCknqKamqesnKyjpqips66elqSQo7CmtrmlrqOPj5qimpOSm6CZmaaWe6Sroqi0w7eloaevn52VnqOeo52kqqiSn6GeoKqvqaqjqp6mm6Wep6CslqGcpbGkl52slqKfm5SmmaCsmZ9+vYSJc7RzhZ+GrWh3ucS4cZKho3qmmJl0qoF8y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXyBepGMmsLAfWqlsm+NgW/Ken+beJKEj4B3eYGAeXF7gIZwd4WLknhsdZFiZV53Y19lgGJedGhtZGJYS1ZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2FfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziVornDtK+vv6mplKOvqbCvraaytq+qpqemsaugq5ibo6Ccm6qnop2roqWopaW0pJ6jk6aurbi0p6+ikpGZnaaTkaChmJugnoimq6Srrb+/saGpr6mWkp+eopmjpKqjk6Chnp2srqirpaOhpJ+kpZytqZGkm6muqpyeq52uo5eYppeipJidf86UenulgnqWl5tfrY9djqiAoaF8p5WbdauDgK9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq1Zo81ukHZ723t/mXF+iJN2f2V7iHZ2bH6HbX2Fj5B9a4CMX3Bqb2ZgX3hkW3FoamRmYFJUU1deSk9DNUFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1s6TC0hUEBGNC4xrMHAv7S0sLeYnpGjqqmttaymsq2srKSsprCqoaecmqaYnKKvn6GfqKejpqGfsKybnpamrq2xq6isoJSSm5+lk5CfpZedqKOeraOqsKi/xbOoqbGulpOenKKXoaqqn5Whnp2cra6mqaibpaWjoaqSrLOWpaKqqp6kp6eisqKTm6ecoZyWlZGXoXKFjJh2haiHcbF8nXGsfaCggaWPnnirgn6tf51yrX+sh4afdpiSe3yXfqqIooyRi5x9q3qIko+ff3qtVpzEe5Bwk8F9gZVtdXCMbWZ3ZYZvYXducm6IiY+Og2yPjWNtc3VvYGZtZF9vaWpuZmNXU1xgWlJSQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txseys5+do4+joqKtr7evqbGnqKqorqurp6KknZqjlZ+mq6CipqCoqKOfnrCtmJuWqKevrainqZ6XlZqkopKUoa2anaejr6yirLWpucyxraauq5aVnJ2imZ+urJ2WoZmenqmxp6iom6qno6Kqmq+xoqirrqaap6urq7Okk5ikp5yWk4Wka6R1inqpdXuycYKlipiMcIigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoGjfal/gZSGrl57qFWdopKBeqOfgHzEsMWMc6+0s7lyYqmvwnVoi4uWjYBrl5Bta3h4d25rZmRkcXFme2ljXFZfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLSwsKmto6inqqurqKSmoJuln52mp6aknayaoqyho5+vo56bk6qktbCvoambnJaVp6SRm6Kon6CmnLCloqixrLbHsbWprKmVkZ2dopmgpbOdmqGUnJ6nqqqirZqrp6ChqaKyrKGqs7KinKupsLC4pZSXpamanZN9qm2fhIh2q3l8sG6CpIuJn5aVnpaB0ri0uMmBgrJfYZSpg6WIh6B6mJaaearJdJqjlKipkJKajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4OTZI6Pm5F7b5SPfG15dHx6bVtlanJxZoBpXmFYY21cXllJTExKRURCQT1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKuraWinbO5rKuhppuopqqsqaagpqWYq6Ofr6ydpqGtmp+ppZ2ntaCjmJSoq7azrJumnKCWkKatkpqcp6OgqqeuoaOnqbCzwbGyqa2olImYnaWboqSvppeilZicpaWpma6crKalnaujtqyhsbmwnpywqLS0taaWmamlnKGQg55Od5qCgJ96hKN8gqSEhqafnJ+UhLh8fHq5gn/MxsO2d5uikYuffpmXl4p2n5eKpJikqH6vhZuDnoSsfZmUYaVso3CPhZCBfZaEcqxgpHNxgJphvH1SVXWNkaGVenyQjodyeXKEfm9bbG53cmqBblpjX2huYmRdTExRU0FIR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Kss7Wmn6GVpq+urqinnqWlmqSnobOuoqmns6CaqaSUo7Wjo5WXoam1uaSco52jk5Cispmem6aloaKvrZykqKK1scKwraqtqpGHkZynnaOknKWXnpiYmaWjp5itoayjpJeupbusore2rp6etrO6s7Wpmp+xo6agiJDStcO3eoeOhZGTj4CmeJSid4yhkoWlg4tyq4eGtG5yaZmknZWJn32XmYeHkHOugqWbo42mipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJycn6fYnOyuGh3jpKkl3yJio+IdXt4jYFsaHdpeHNuf3RcZGRtbWZoYEpaV1g8SEY/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK62oqKZlaOqp62pqpmlop+moaC1p6Kpp7GklKujj6StpJ2QmpqqtLSknaWcqZKUl6+goJ6mo5ynnLWZoKqjtarCr6mrqaKMhI+coqGmo5WampyYmpimo6WXqaeroKSbrKa8rJW9sK2fo7G0u622qZ2rtKaqmnyokX18sHiLgKSliJxtsm+hh618oo+DqJeagayJhq2FoJSooKOXhZ+BmZaBe5J+q4GdmZaLq3edoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2lbHKFmV1gW4ygbZSPpJeBkoqTiHd5gZZ+amx+Yn10bX95X2dlcG9oZ2hCWV9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JODE1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKbhKnGw7fBtJ+araCuuaajjpqjpKCvrqmfo56drZieuaCiq6CvqpquoZGqqaWWipuQrrGsp6Com62YmY+toqGepaGZpJytl5+opbaovq6kqaOfjICOm5ugpp6SlJmblJmZpaOimKeqqqGinqiovKSXw62ro6KttLytsKmjtbGqrZp3r36Ri5yFh326rYmYZLCMZZaufaGQhKeXnIKti4WwhqeapKKikYWgXGxrgrNgf618e4KAsmxmbpmXi4ixWn20W6SDa8iiZp+Be7tZdrVasn1Tr4F6rFiAoW2XjaaZiJWOkpN4d4ybfGNzfGKDd3SAfGFqZnBtZmVlT1VjXEFUXT1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vru0wbOjnK2mpbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVrqiijombjq+sqaejqJmuk5qPqZqhnaSemaOipZieoqixqLuupKienY99i5uWoaCZkJGanJGZl6ien5enrKSjpKKkqbqeoManpqmhrLa3rrCpob6wr6+XgqqSo6+Om4CGpJeYkICAuMO6hI+dk4WomZ2DrIuDr4qonJumq5F+1b3CqmKkv719f6OCg9e6t7WElJKCnr2+hGqjgW+rhG6df3qysceDa6uwvax5eKK+u3SAlYykmo2ZjpOZd3+PmXlifHlkjGZ4gXtga2VramJQYltTaVxAVGBCTCk8OjQvHx8kHiUyIBwkKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0scC6sr2zop2up6azpp2Ml6W/qbavp6G/pqaxm56xnLmon62vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp2nm5qgqKKYnaCrrKm4rKejmpeTe4iZkqabk4+QmJmOl5OomJ6WqKeeqKagoqq6nqnFo6GwpKy0tqyyrKO+q7GxnHV2qqW3hWWJn3BnrJCKj25ud6WQm6CCdrGbl3GRjnKXqaSbmK+kcmxtbWaLeG9tg5lxgHppcGlniZaVl3FoaYWGZ3GGZF2KY2lvWl1nfnimYGJykJJwZmSAjZKNoJaVl46TmnqFjZN0ZIZ3Z4xqeH55ZGxjZmxiS2VXSmtZOlBkRFAnSjkrIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6urK0qqmirp+ks6qZkr2xw8e8tKmev6uso6Cnq6C6o6StrK2mjpatqpCMhZWXrZ+mqqKfpKOgkYulkqaZqZmWo6mglpylpaauuaqsmZqTknuEl46ml46RkJeUjZeUppOdlqeima+lnaKruZ+wwailtKetsbOsr66qvKexupiMoqmmtpyJlqKYhqmbkJSdkqq0mpykraK0mKSin6KjnaKlopasp4ySk42Hk52dlZCZk5iQjpWEf6Sal5WOi5OSipCHhH5njIF0g3d0h4xxp219lpOUlIGBj4+OjZuSnpSVk52AhZKLcGiPdm+Jd3Z8eWlsZWRvZFVhWEBpWkdiX01YK0U9KyYhNjQwLx8cICUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbevrqKwpa2gobexkY6qxLzDubapoaSdm6WdsKikt6edqbWnqJGYrKOLiImPnKeWraShmqienpOVpJeomqmZlKago4+ap5igtLmnqpiakI18gZWMoZSLlZGVkI+Sl6SOnZinnpq0o5ymq7eor8KvpLinsLCyrqustryjsr+ak6ekprWikp2mno2pn42Sn6KtsZuipLOrspqmop6lq5+fnp2XrZ6TmqKclJCXq5mNmJiWkJaekYegnpSUhZOMj42VjIF/Zo2IdYh3eomEdJxqiJKWlZKJfYyWkZCWkZ+QmpOdgYaWhXhxlHJ5iX9xe35qbmRfcGlgXF9ZbWJQYGJPWDlGRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7CzrK6jqaetoKi1qpCPm6Oyua2qq6GimXqcobCkprGolpu4pqOUmKmcjoaKiZuikK+epJaooKGSl5mcrouqlo+omKeMmKiOnbi1o6WYm42JeYKUjJuTipWRk5CNkZahi5ycp52dt6J/g661orCwdaS/pLOheXuirbW+l3ivpqGKgKp/ZFxidp+OpJ6Dln5tlLWdpKmwrKVmoKGUdHqbmHCBmaqZbH+kqYplnKWckZeYlouSm5CEnZuQlIOTh46OkoqFeGuQiHaHcXyGgYFhaYmMlZOMW3aVkWdnjoxyeaGWlWR4l4WAdpdogomCbnl/anBlX3Zva2tnXGVjYWFtUVk9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHR0lLTFRVVVldYGhmZ1hRSTxERzw5VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqWprqSnraWSlqq0rrClmamlqpdzi5yvoKirp5OWuaCgj5yknpF+iIiano2smqSVp6KejpeSnoV1ro+IpZqokZajiJu5s6egmJiLiXV3k42Wk4qTkJCUjI+Sn42ZnqWYm7GVgIybtZ20jJKPvaiifqeje6WxuoOOj6ifhIyGj7Gpr4yJlqKaeYCLrIadnqOpq6mJloeZd6ace4icgZing4F7nbN7ioagmJmUmJaBkJaWg5maYnmIkYSNj5KLhG5xkIh6gnGBgYaAh3SHhZeTeJZok3SgmnN7mYKcmYSYfpGIgYKYaYyMhGp4e3FwZ2V4bmlsalxkaWllcVpcR1NMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaWZZUUg5REw8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpJ+mrq6rqK2gqbGnp6qlmZStxbyvoJSlp7Sdj4OcrJynoqCNkL6emY2fmqGRfYaPmJeIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqSjoVwdZCJlZCKlI+Om4uNkJ2QlZ6jlJ2rh5+0ibSarovKiKuvireFjbCEs7GFqY6pmY2dfKiPcnt3nI6mlmiVpHm0jKGgqKqTmcKCgKuJmaFynoCbpX2XhZWzgaF9oZOfj5iYgI6UnImYkot8hZSGjZWTioRudJKGgHtzh4GEfYV1hoOYgY/FZoCph4+iap2BnpeAmYCKi4OImG+NkoRnd3R7dmdodXBnaGteYm5sZmxXZEZdUUwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQElkWF1jZmhnYmJiYmNjX19iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6OgsKmpqKasoKW5saqrppqUnqKkqaGUo6m1oq9/oKedpZ6diZS9mpONoJKdkHmDlpWRiKuZnJuaooWPjHabm46gkYieo5uWmJeGorispZmbjIx/Ym2Pi5OQjY+LjJeLjpCejZKeoJigp36hp4etnaCWrpCgnp2Rh4Kgja2xiKSOrJuMmn6idoCZlGuBq3VNq3iHjZ2TnKqpgqqrfoShfHunap6Ak2xnl4aYt4mefm5gY1iDl3+Ne2Rni3OZfXmXbFx8l25gU3GFXGBteoRgWWWCfoWBmXGoq2uDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbnRxampvXWlvbGtoV2ZNXVhFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpbXV9XXl9jdWBNRTpNTk1UYlxbZmZpaWJiZGJkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJeeoLmhqqSmrJKitr2rr6KZlp+gpaurn5yttKGnkaCfoKecmY6ZtJmQi56MlYt1gZSRjYqmlpaYn55+k4WFrKOHnJGKmKiYmZmRh6WvpqKVmYeJgGluiIiLjo6Jio2Ri46RoIuSnZ+aoaV/k4GPo6GUoHeclpCng6OpgIassIeleox+hJp9onBzk4eVe56MeW2HnIuakpyqnI+HnX2DonR3pmeefnelXph7fZNzom6Yt7S6c5OIgYC2qGSBxrh8cZW2jHGAm6NjdKyrYX5qnbN+bn6Ig4+DjJhxgKNsc6RznoJ+o16cmbOWb3uXnrN0cluesoJpYnB0dXFob1hqa3JyZVtmXGFMRD1ENVFBWXAyPFJHX0pSPTwzOTU6OjZDPDtASVA/VE5OUUBFX15bWVhgYHtkSUM4TFdVVmNhWmZma2tiYmVhZGNgYWJgZGNfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi2ra2gmqGboqOkrJqasayrkpegmaGkmZqUnqybi4mReIuFcYCWjYqPoZCTlJ2XfZGJjqighpiPipKik5uajIqop6Sej5aHhH5re4d/fY+Ng4uQkImOk56BlZufm6Cfi4l3nJiijaByoYyJqYmdqJGYqq2Arox+eqCZeaOTeIBzl4iMnH2Vn4ebjpqdqIijZKF+ipaQm41tnmibjm+amXuAiqd9cmh0qoOeg3OqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxfp3Z3ioqAnWiadYeTkpiNf55tmZBqpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGl3eGFeZFZhQlBFTzdWQlJtNEpaWl5OWkRAMTUxOzs3SD86Q0hVP1lTWF0+RGJdVmBRYWN8aUVCOU5bXVhkZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mWnYmqtpyoiWOVnKy7srCsnaWbmqefnayZnbCnqp2Xo5qin5mWlqCjmYaJjWmIgHJ7l4eMlpaEkpSYj3qKhJaknImVkIaLnZGcm4iPqKGfmouQioCAaYGGeX+XjHuIjY6HjpWZfpKhnqChk5hyaJ+KoI+McJKMgqmJmqGlqqOqfrCtpKK4l3ajs6Kjf4iUeJ16qpl/oo+fnZmJmHKhfYeNsLV9bJqRoXh+mbWjo6uohJl8mnycmn90qlpdb3uXjHieYk1/e3uFZHqYQk2fWaJqc3yOb4KKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B9fW5lX2tndXtiY19QXVZcVFZAWUVQZkRSVlxhWF5JRD1COD9BOkhFOExFWEFXUlpWRUZhXFpgS2BtfXFFQzxVXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGtplJ2Bsa6ahFNfoae0urOzqZqii5qpm5unkqCro6Cnj56dnZqZlZihnZaHh4l3hYFueZWEkJuLfZGTlohygImSoZtykpCBiJiUn5qEjqibmZWKiop8g2yEhXGCoYx4hIyIh5GXk3uRop+eo4iuhn21hI+enXumlnqpgpeekYyjoH+naHhufplzoHNxfJ2FmG+Tgq18o4Snn5uDpHBeqWh2o2RwpmGc0498e5l4cnNjooaQfqJyo5B2a5Czi2CCmIp0qrKovH93g25/v6aqtF6cb39yl3CCc6JyXqRndKZgaKZsmtOYeoKbbnZ5l2ubeXaXcmyppWdfZHlxf4RsaGZjbXV3Zl9hUVplUFFhSFZJVF9XU1tkaltkUEVDS0xKS0FKRDhQQFBNWFNYT1NRYGVlaVNkeHl3SUZFY11lWmhpU2loam5jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7GsVF1Lf6qwsrWws6KcmISXpqCgooykp5+XqYmZmJiUmZOSoJeNh4V7cH2EaHyPg5OagneRjo+KcICGj5OSbJiUfIiRkqOVg42pmZOSioSJeYN2iIBugZ+Gd4CShYeYoJV5kaGimZ+Js6Gitot6rKekrqVwqYCbkYaBnpR9pIGimoaYcZ6Eoq2uiZeLf4ykjZWDr6OVd7W2tsmic5SMg59gnpepbXmWh6CbdaGHd6B+kJaLgW9NZqOScZqIc6V7enVig4JtfqBscmRgnHN/dJdre2q0trTGpnOYfnqcapqaq3SBmmxzd5dpmXl0l3FQRH2zXmp1a3iGZmtmYnN0cG1VW1JYZ09SZ0lVTFhSVVxna25VZ1dNSkFKTUtHSk5BUUpQZGNqbWV1c3N+eHtudYl6e1VRT21eaFxraVJqaGlsZ21nY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinYmwqIVlQJSisqyvr7Whoo9/lqehoaOLpKacm6aCmZeXjpeQkJuSjYeDeWt5hmWDjH+Wn3l1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJaLkYuAiXqAfYt5cI+ghXmBlIaIlZ6UfpKjppuVloNnbnicbKJkfHKleJyYcGingpmOfaV7oZeDlnKfdoCJlJWPuW2PiqJifZmjl4luc2ura3Wgbm+mYJtpi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXBkZ4iCb3KiW19bZKFuXoiMcXyAdHJkpW54omRmp2iXcouXbaFvUoiPbqBeZKdUi11UmG1tcmtxgW1waGt3c2pvUVZVVWVZU2xJWE9cSFhoaHJqWWtWUFJFVlxNWFNhVWhqXnd1e3xwfXxygnt/c3eOgIR3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqbCxpp+Kf5apnJ2ji6GhmqGhgJWZlI6aj4uXkI2Je4ZxgIhoi4p8l5pzdIl9kHxlg4eViomVmoJ8iIaWpo+AoaqPhZCKgYp9gICOc2mPpYR9hZOMh5efjYaQqKWciaZ4lpt+pYmWjLKZnpGEr5efpXmYiXupdaeQhJpupaKMkoSMg7xtfKWvgoeGh5WXnaJ+pntyqJWhlmiffm+sY5aKlpN4qG2qo4GJdYiCd6uRpohrkrFsd7OMqWyLhm9voJ6SlWJ/q4yqd4GAjqefd599haSVnaBomod1q2aerYy2c3a+jKOTWYOmjathdXJ0b3t1cGJqfW5nbVNUWFRgYFxrTFxSXEldbG12X1txWFtfWmdzZW1vcWNxdGB3en55cnmDcoN+gXt7jYGCgHdieWRjbnNkUmxnZ29tcmlmaWFfXlxhamJsbHtvXFxiaWJtaXdtZ2xuYpamq52BgJ6klqqqnqinraOZiIGWqZmdoomapJyonYSMmpCGnJGFko2MjHSFeoiDb42FfZaSc3SGcpGDbn+LkoeGlJB9e4KFl6SNf6WkjYCOiYSUdYKHk25si6iAgouTjYianYiLkqqioI+AdJSXiH6BeZSvpH+CnHGPhnmSjYaAe3KojXJ9fXqXlpuEjXh7fX2IlJWTi3eRmaGihXt/imyMhlx6eXN6cWlvfpOKcYB0go+Uk3GGhIJljX9fgYGMeHZzlHVwem9viW+Fhl93aXiOZoKDho+qnH90fZZqiYhvfnV8g3VtbGaMc3h7l3eEWmpXeY9pbndycW93eG9da4VuaWdWWV5WXGRqY1VgVV5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV5gnV/gH+AeYuFgn58boBtZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbqpp4uhopunpJmknauioIODlqqQnZ+ImaaaqJiDgZyLfpaUh46KiYxygnyOfH6PhHqWjnRyg3CVhnx9kouGho+GeX6AhpijjHumn4qFj4+ElYOGjph3cYSqhY2RnI+HnZyGipqon6Cqg4mNlZt/foqXraiQk6iReHGfk4R8lHB/qodxfpVxam98gZ+Lf5GOi2huXYSNjZydoJBzl4yJcnVsg3Z0gFlyb4eRgn5/jGpdaWR7hYSIgGBpeHucfISNg3aCh4RpeoyJbGJxc4N3X3ONg4qRqJaHZ42Og253i4Jvg4t3bWRlY3mCepVaW2lmbXZbe3l3dG5zcoNmXG2Ja2tiWVhcWVhqcVpeYFleXWVyfXp0b3Rjamppe3xyenZ0ZG10aGx7f3V6fXt5eX+Af3CGiYR7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsaGQo6Gan5+YnpmooqF9gparjJ+ThpqhkKSVf3uYhXySmYmIhoaKcnyAi3aFi4KElYlyb4BzmIaEfpODg4aKgnqAhIqan4+BpZ+Gd46XiJWLi5yXhIN6rIGQl5mTiZybhoehqp+hoqOLiJObnaOZlquiqKehk5yJmZB+epCQhql/gJORkpOcsaWalJ2PjbGSmISmjY2WnaGKkZ2EiZOLbH2Od3dmg4aRi32JnoWHi4+IiIGFhJF3fHp1m6SKh4ugjIeWf4CNg4F3cXWGhH94iYiLkaeRhIeOh4OMkIt6hYmHjX91aoCDfHmZaXFoYHOKcH17d3Zvd3SBXV5vhmduX15ZWlxTZ3BVY1tbYWxoc3t7cm5wY2ppaH97bXh+cGhwcGxmgHtygoB3f31/hHttg4yGfHp5fH16g3hOZHZqc25xe2RrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqOhmJWZmJSYpKCden6XqY2djIWfnIqdlnx4lIN7jpmJhoOEhm14gH9ygId+iJKDbWt+epeHhIOQfoCGhId8h4ONm52RhqmegnKKj4aSkouckXyNe6mDjZGXlY6alYaFm6afopqdhoOSmpmZkJmmoaaenpCXgpOMeH2JkIanfH2PkJGGmKmgnJOcjo2pjZKAno2KlJughI+YgIiPhHF5hnJ1YX+EkId2jJmBg4+ChoV/hoSVb3p2dZSkjI2Gm4aGkHWBjH5+c3N8iYV7eY2PhZSokIeFj4GCiYmIdIOGhol5bWp8f3ttaGtsZl55f2h8fHZ0dnR6d1xgcH1udGBjWlteUWZsU2RaXWFqaHV5fnBsbGNqameAf2tyf2trdG53boR5boaAdoKAfYV3coONh358e3yAe4KLYGl7a3VoaoNkamNgaVxjdWdvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5OSlpeLmp+enHp3nKSQm4mGpJOKmJl4eYyFe4mRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hYSHfI+Aj5ubkIimm39wi4uMkoagoYqFjHynkIeOkZaSlJF3jKOgoZ2Wmn+BkJqZk42ao6Kkm5iSnICQh3uBhZCJoYF+jY2PfJekoKCSmZCQpYyPgZySipSZnX+Tk3+Ij4J2dYJxd2F+gY6Hc4qWfYiMcYx+goWGj2p5cnqOmpORgJh/iYxzg4l9fXJ6fI2GfHuTjoSXppSNhpB8hIWGhHSAgYWFeGRwen54eXBramZefXNofHV1c3xyf2peYHR2cHdkY1hdXlJqaFRlWF5gZ2l2eIFxZmtjbGdlf4BqbX1nbXBqfXeFemuLgXKBgX6BdXaCjYZ/fHqAgX1/j2pyg250aWKIaGxiX3FWdG9sbWB4aGxXanN2Y3R6enFia295iY2fs5Klpp2OkJiPhpygmpt7daOejZd/jKGKiJqWd3qFh36DiX6IgoF/cH56dHWChX6JkHdnY32Gl4qCio14fYCNg3mWgJWXlY2Vn5p9b4uBkZOFpZuHjImDppWEkYqVlpGQdZGdoaGYlJd5f46Yl4+Xmp2lnpqUlZ17koiFeYeYj59/goqOjHOXop2gkpiOj6GMjIOYmISUl5t/mY59io6CeHJ+bntkgHyLhnGHk4CRgmuHg4GAioVnd3B9iJSajn6UeY2LfYKJfnxygHmLhnqFkouMmaOXg4SMd4eDgoF1en+Gg3Nednd8c312ZmtjYH5qa3Zzc3V9cHtjY2FzbnVybWFZX11aa2RSYldfYGhrdHmGcWJqY2xmaHyCa2h0aGxvaH98gXlsj4VxgIODf3R8g42BgH56goN+fJBtdYl0dG1mimxqYmN1VoNpcG1geWdsYWp2cWV4e3lwX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHaomomYeZaci4yZkHh7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5SHf4WHdH1+in9+mISWk5aMo6CXfnKHe5ORiqaPjI6KkqCRg5CPk5eQioCPmKCakpCRdICOkpSKnZ2ep5mYjpWXdZCRi22HmpGbfIiJkIlvl52ZopOVioydi4aBk52AlJOWh5mJfIuKgntxemt2bXx/jH9uhZODlHhvgoR+fouBZnRqfYKYmIWAjnWSioV6iX93eYF+h4F9hI+GjZWlkXmFgnSIhnx/cXN+hYFrYHl0eXB8bmFuYmR7Ym5vdnN4d3JzYXZgb2x1bm9cWl5dXWpdT1xXYmFobXN6iWtfaWVqY2h3h21mbGhpbGeAfHp3bpCIc4CDhH10gYaJeoN9eoGEfXyOcnmLeHhtbIdraF9pcmKHaHFvZnZnbWxhemhqfHt3cGF3bYqBmZqroaSpnoqLkYaJnoqUlnx2rJeMlnyek5GWlIh2fnuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+Shn+EhHJ6gIZ6j5GHkZGbkqSbk4F9gXyNipKjiY2KjZaajIWQl5KVjYiIjJKdk4+MjW6EkI+RiZ6ZoqGYl4qXk3CLm4ZniJuQlXuKhZCKcJaak6GRkoiKmIyCf5KffpOQk4uZj3yLhoh0c3VrcW92fYt1b4aRjpNydIB8goKJfWVybnp/m5V+hYp1koyCdYp7cIJ/god9ho2LhY6Wqo57iH1+ioR3fW5tfoOBYWZ3c3RuemFeb2BqdF5vanp5eWxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4dlXWloZ2JncY1uY2hoZWlngHp3dW+OhXOBgYN8dYKJhXiFfHiEhnqAiXd/i3t6cnmDamtfcGh0f2txb21xZ29rZXtibn96d3Brd3eJf6OZo6ihp5uIjIqBj52Gkpp0f6iTkY2GoIyVk5CAc3x2hXh4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYF/f6CGj4qRnJegk5Z3iX6AjIicnYqPhpKXloWIlJiOlouKjY6MnYqOkYRtiYuPkYqclqGcmZaGmYlsh6WFZ4ifi5OAjYSMgXiTmJGdkZCJiZSNf36QmX2SjpCNmpJ9i4GEcHZwbG5vcXyHanODj5iKcXiAdYKJg3pndHB3gpuQfYqFe5WTe3iKdXKLfIeOe4uHhYqPnKWJfIR3gYp/d3dsaX6Af1txcnFvb3ZZXm9gb2peb2p8enFubWptd2Bwb2txbVlYYGFhbVdQU1llZmJ1b4SCYl1rbWRjZWuSbWBmZl9naoF1cnJvi4B0f4KAeXaAi4B5hX53h4Z2g4V7h4t/e3aKf2pxYnxihXxvcGx1amhubHd4X3F+eXtzdXN/gn6llputn6eXhYyDfpaVg46ddImek5KFipqMlY6MenJ4dIJwcoVzcXWIbG5sdGyHdoN9f21uVVGBq5SHgniAdnKDeYKggpCBkpGXm5GZd5F6goySpJqTjoiUmJKEhZaYi5OLiY6Ph52EkYt9couFiI+InJmfm5eVgZWAaoifiWiIoomUhZKEinGDkZePmo2PjIuPjXd7k5F7j4yNkpeMfIl9gWx3am9rbG17f2J6fo+XgXd6gXiDjX16aHVtdomXjICJh3yVkXJ7hnF4jnuLjnuJf4SOkZ+fhn19eIGKfHZvZ2p/gHdddm5ta3ByVV1uYXFhX2xueXBocGZnc3VocWxhd2VdVWVgYHFTUE5bZWRdeG+Ie15caHFiYmVlkWlfaGVbZ299b2txc4p9dn2FgHV2f4x5e4aAeIeDc4aFfoyMhHx5lXhncWqDYId+b29re2BpbXSAdF90fHiGd3NzhXx5oZCasZymj4OKf4KZiX+KnH6KmJKOhIiXjo6OhHd0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfHB0g3WDn4KRdpSQmJuQmXuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYicf46BeHuMf4iMipycnJuWlHqOeGmLlIpuiqWGlImYhIZjjJGYjZSJlouMiYtwepWJfI+Ji5OSinqGfX9tfGVzcGtte3pcgXqQj4F7fn+Aho97eml1a3SMkIqDh4Z+l4xtf4Bwgo6Ajol+hXuEkZabm4x9d3iCj3hya2VufYFqZ3NuZ2hzbFNdb2RwWl9scndmbGtiZ3hzcHBkX3dgYVVrX150T01LX2ZjXHhwinRcW2V2YGFkZI5jYGZiWGlzc21rcXaLfHR5hoJ2d36Lc3+Gf3qJf3GJh4GQioh8fpl2ZXNufGWHf25wa4Baa255enJgdnp7jXZydop2ep+MnK+boJGDhXiIlX57iJyGhJ6QjoWMl4STjoeBdXdweXBuhG9tbn5yY2R3cHxuenxqaGxipJrB3K7vonNsdYN1hKGEkW6Vj5SflJuAkXCFi6OXiY6VipCdlYOAlI+FiI+AkoqKl36He3Z/iXiGhY6bm5eZj5B2i3hwiYuNf42mhpOLnoaGXouUl4mOiI2KioSJbHyXgn6Kh4qRkIZ2hn5+bH1keHVqb3p0WIh7koeGen9/gIaNf3pmdGqBi5CLhISBjZiGbYN3b4mTg5KGf4R7gpKXlJqRdXR4h4x0cnBlc3eAYHJsb2FodGZSYHBna1VfbnR5YXJjYGl+cXJuW2NyYWNWblpcd0xMS2NmYV12c4ptW1xkeF5gZGaEX2NjXlhpcmtua3J3i31zd4SBeHh8iXGDhHx9iHt0i4iHlYWMf3+Yc2h1cXlsi3tudHCAV3B5dnlxZHZ5hoxodoCJcYCdiJmonKOThX1xjJN4eImcg4SfjI58lYx/moiEfHN3cHNqb4FraWx8dF5gd3Z7cHR6Z2BlfOvatcnD3IlzbHSAdoqaiIxpl4+OnJWSgYhwhYigjoWLlYqMl5N8jZKHgoiPepGLho+CgHd4g4Ryh4KTm5aUmIaNdoiAcoeEi4mcpIWWjqCEimGDlY+FiIWIjIaAh2h9lH99hIWKjo+Ccod/gHJ3aHZyaXR4bVqNfZODhn2Ag4GEi4N2YnVtioKRjISAgJOSfm+DbXqIkYiUhX2Cf4KTlJKYiW9yeoyFdGtvaXB2f11xZ25caXRfUWRxaGZTX3B2dGBwYF1og3FzaldnaWNpV21XW3RMSktlZl5hcnOFaVtcZXleXmRnemBkX11Za25lbmp0d4p+c3KBf3t2eohzhYN8f4d2doqFj5iBjYJ7k3Zsd3Z5eZN1bnd6fVh5hXGAbmd4dpGCZHaGhXGKloaaoZuhioZzb5KLcXaNmnyJmYiJe59/g5l/gnlxdG5vZHJ+aGZsdnZbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJqQi4V6aIeLmYaBkpGGhpeMe4yMgICJjXuQjX6JhXp1e4N8cYaAlZmOk5SCiXaEiHiFgo2Vn6GIl5GhgIlhf5SHhIeDiIx/f4JmfZGAfoGEjI+Qfm2DfYN1bG13dXR3dmxjjoKPgIV/fISAhYl/cGB0coZ9kI6DfX+SinpyhWd7hYyIjYV8hYCBlZCRk4VvcHmLfnRsbWlpd3phZ2ppWGt0WVJocmliUGJyeGxiZV5aaoRudGJcZ19lbV9vVFpuTUdOZmRcZm5ygGtaW2NzX1xja3ZkZV1dWmxsYm1qc3aGgHFvf3x9dHiGeIWDfICHdXiJgZKVe4mGdomBb3h5e4OSb217gHZeg390gWxoenOUc2dzh3xykpKEmp+bn4aHdXWTfm11kpZ9h5CDio2ZfIyadn52cW9samF0fGdiaXN5WmB3e3ltcX5lZGhoV52PX3Jzl7zEhHZxlIiPfXGWi4abkouHcmqIj5aAe5WMgYSai3uKhnx7iYt/lIh1iYZ2d36BcnWGgZ6UhZSPhIRygYp3h36Lm5+aiJWPnoGJZn6Tgn+FgoiJcYF9Zn6MfHmAgIiMj31pgX6EdmdweXhzd3Rsa46Gi4KKgHmCgYWEgWxfc3l7fo6Lh3yCkIF/c4JqeoWJjYeFeYV+gpmOkY1+bm17iX12dG5mZXt0YltwYlducVNTbXJoYU5mdHhmYF5dWW+Bb3NaZWJdam5gcE9ZalFEU2ZgWmpubXxuWVtdbWNaYnB2Y2ZcXWBraWNsanN2gYNwbX58f3R1g3qDgnyBhXZ+iIGWkHiEinSBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0a5ONhp+ZoJmEiG59i3Vpd5eOfoGKgpSXiXmPlW96dHFraWRgc3poYGVweVpgcnx5Z3F5YWVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJCLhW5rhZKSenmSh4GEmIl7hn93d4mKhJaAcIuIcXV+e2p5hYOlkISTjYR/cICEeIZ7iJ2blo2VkpaGiHF7k4N9goKIgm2Ad2iAhHhygIGDioh8ZX5/hHZkcXOAaXlxb3WZjoaDi313eYGFeoNrXHJ/c4KJh4p+h4p7iXOCb3KFiJCGhnOFe4KajY6FeW5vfoR/dnpkZmh7b15YdlpYcGtOV3FyZmBLbHd0YV5cW1p1fnNwWGddZmpyYG9OV2dSP1hmXlpva2d6cVtaWGtlWWNweV5nXF5lbGdla2lxd3+Ib2x/foB1b4J7f4J/gn92gYSJl4lxgo1xe4Z8enmEk4x1anl+a29+dH98b3J7epNvboF+eGeSi4OhmZyRgoVmhoNvZ3mViH1+hIKYiYF8jo1peHNra2ZfYW95bV9ib3hcZGuCeWFxdl9lZdTqvYsyOj6Ljn9xeIWHjY11gpaMfpKNi35ta4SMjHV8j3+FgZSIfIJ3bnaHhIOXd2+IhWx1e3VmeYKDp4uCj4uEfm6BdnmFfImfko6Sk5SOjId/e5KGd36DjIJqf3JogH54bnx9gouEd2J6hYJyZHJpfm51cnWCnIyBgIWAdHZ+gHOCb1xuf3V5i4SLfIiBfol5e3JtioWRhYxzg3qAl4yLgHVua3aAgHV0W2dndW5XVntSWW9kTFpycmVbSXB4b1xbW1lddH50aFliW2dmb2RqTVdmUT1dZVxddWVgdXBaWVRuY1lkcHhZaF1fZ21naWtpcHd9jm1pgoR/eW6AfH2Bf4F6dYKAjZOEcIGLbnd+gHt7iJKJf2h6fWpze3KFenN2fX6MeXiEfXxrjI2Em56WjIGAbI19a2h+jYt6fX6Dk4J+fYqIa3ZyZ2hiW2Jnc29fYWtzYGhwiHlic3ReY2SboI9uXDVar7V0aYCIfJGGdYWVhXOOiol2b2yEgoZ0eYl4iXySh3l+cmd2iX5+mG9xh39pdnluZnmHhKSHgIeNin5vgHeCg3+Pm4mElpOZioyFiXyPiHB6fYR7aH5saoB7emp7d4KIgXJgd4F+cmRyZ3aDbnV7hpaSgn2CgW93enx1f21ZcIB3dY2Dh3iIdoOJe3l0b4uCkYKGc4B+f5SJinxvbmltgYF0bVxmZHJwUFp6TVtuW09bcm9kVUtzeGlXWVlaYXCAdGBdXWFnZGlpZk5ZaE1AYGNbYHVhXXVsWFdTdGFaZG5xVmpeYmhqZ21saHB3fJNsaISKfX1wfn57gYCBend/f4qLg3F8h29xd4N/e4mMj4NqfXttd3h2inZ8eH+Chn+Dfn16bYWMiJmjjYSDe3WLeGtshIeQeH16gpGAgH6Lg3BzcWNmXllmX29vX2BncGZqboh0YXRvW2FkanZ7gL+cpqTIuHGEgnKSe3eFkoJzkIuHcnJvg3uDdHSHdIh3k4h5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgYB/jo9+c4B1h3uClJKFepiPlpCIgol7iIhreHl+dGd6aGt/eXRpeneAg31oYHiIfWtrdGh8gWp2gYyRlX97fn9xfHZ8dH9iVnh+c3SLhYN9hHGHinh5cXGFhI6Af3p/fnePhoR3anFpbIeBcW9cZmFxbUlkdUtdbFRTWXJuYlFPdHhhUlhYXWFwgnNbYVxpZWVka2RQW3BJRGNgW2NwXl13aFVXVnZdW2VtZ1VrXmFpZ2VubmhwdnqTbWmIjXl9cnt+eYKBgXx2fYOIhoNwd4RybXeCgn6Ji5N/cIB7d3h6gIx0gnh+gYGChHmAdW9+ioubnoh9hXp3hXtndIWLkHl+f3uIhoR2j4BncG5fZFxYZVltcmFgYHBsa2iIbmF0aVlfZG6Ad6naqceGh7JxiHdvjHR6hY1/eZKJf3RzdH13f29xf22FdJOFeHRrYHqCeYmPZnKEcGd1blttfYCQk3+AeJGTfnl8bop4g5OOhnaYjJOQiIaGe3+EbHR2fmxndmRte3Ztand3f398YWJ4hnppdXVjfnxndYePjZZ8dYF3cYB7fW6AWld1f3B2hYh/gXptiYZ0emx2gYSFf3x+en10jIJ+dGh0ZW6Kg2xzWWhec2RHbW1LWmBXVlV3bWJQUnR2WFBWWF5hcYRvXGBjbWVkXm9jVFxyR0JmX11mZ11be2JRVlx0W1tna2FVal9gbmVma3FocHZ4jnRrjo11f3Z4fneBhIF7dH2DiIeDb3KAdHF1foWCiY2Ke3d/eIN7fIWHd4d8fYF+hIB7fnJ1eYyNoIyJeYl1dIN4Xn2Fl4t4hoNzhYaEd4l7Ym5tXGJbW2FWaXNjYFtnbnBmh3FhcWZXXWNrf3zKzoe5oWptbYpscYNxe4OJfnqQhHl4c3h1dHtqbHZjhHWRgnZvZl99gnqLimVygmtqcWNYbXqFm4iCgXOXlHh/fW+Kc4WMjol0mZCSiYaLg3x5fXBwb3xmaHFibXhxamxxeH19el1leoB4anZ4ZoN3Z3WIjI6VfXKIam9+gXlvfV1Zc39udYGMfIJvcIqAcXdpeIGCgYJ4fnN8dYd9e3Nnc2Fui4FrcVdpXXZbR21qTFZVXVNVe2thT1R1clBRVFdeYnSFaV1gbGpmY1pvYVhicEhBZ1xgZV5cVnteTlVlcFlbamhdV2hgXnJlamhyaHBzd4Z4bpWLdH96eH55g4h/dXJ/hoWOgnBwe3h3dnmGhoeMhnp8f3SLfX2GhIOHfn5+fYd/fHh1eHiRk59/jHyKbXWAeGSDhpWFc5GKb4WFgXqDdGRuallfW1xdVGdyZGBZZHFyZ4ByYmtlV1tgan94vq57n7duYXOFaHN6cXiBhHp9i353d3J2b3t2ZWpvYYd1joBzamJefnh5i4RmcX9oa2taVm93iaOBhX9xmZNygXp3hG+DhJSKdZeKjomFiYV9eHRxbmh4X2psYG12amdqbHl3enZaZ318eWZzfm2FdGV1ho2GloBwjGdre4R1bnViXXF9bHV9jHyCZ3aHfm5xaXZ/eX+AdH5te3yCe3lxZmxibol9bG1WaV92VUppak5RTmdMWHtoYU5VdWtMUVRVX2Z1g2ZeYHFoZ2JXal1ca2hKRGpZYWRWWVV5WU1WbWpZXWtkXFllY150ZW1kcWdycHWBeHGZhnZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYeJiYN4gX11j358hIqNg4GEe36Lg3t2e3d3mp2YeomChml2fHtsg4OSf3KOgXCFgn+Cf3BnbGdYXVtcW1NkcGReV2JydWp1b2VlY1dcW2h/cG9ygHOJZGR5fWlzdXNygYN3gIN4dnJ1bmt6cWFna2eGc42DbWZdX31we4l/aW14Z2pkVVdyb42mfIR7dpaRdH10fnxvfn2Th3iafYmHg4eDfXVwcWxndFxsZ15sdGRnZWl6b3tyWWiBd3VocIF4gnZid4aLfJWBb4xrbXuCcWd0ZmFuemdzeIt8f2J3hHdqbHJ1fHJ7e3R/aIB/gHl3b2RmYm2Fe2xqVWhhb1JKaGpPS05vR116ZmFNVXRkSk9TV2Fqdn5mXWdzaWZgVmRXYnBcTEtqV2NhVVRVc1ZMWHVkWV5rYFxaY2VfdmdtYnBpdG9yfnR0mYJ3f4B4gH+GhHp9dYKEf5eFbnJ0fHp1cYSFj4GAeot1c5B/fIGVjYCFhH19jIZ6fYB2e6OlinmIhYRrdHt6dYKAi3puhHN5hH2Cg3ZvamllVl1bWlpTYm5kW1hhc3tqaG1pYGJYX1ppf2lrb4BnbGBoeXhqcnNzbYOAen98dXRtemhqeWpfZW5ogXaPhGdlWGJ3an6He29qcGdmXVRYb2eOp3eBenyQjnl2cYBxdXh7kYF6l3aHg4CFiHZqcnVnZ25bbGNdbXJfZ2FqeGh7bFtug3N0anCBfnp4YXeGhXmQhXSJcnB6gXNkcmldcXhlcnSJfHljdIBxZ2p5dXNteXh2eWWEfH95d3FkZGNte3xqalRnYWVTSmtnT0dRakVgd2ZhTVNyXUpNVFpla3d8Zl5tcWlkXVZhVW5uVkpTZ1dmXlhNVWxUSlt4Xltea11dWmNlYHlobGFvb3ZucHd1eph+d3+BeYCAh4Z6eXqDfoGThHF0dH95dnSFiJF9gHyQa3KVgHuCn4V+h32AfoaCgIp7doSrnn96h4eDa3KBeXWAfoB0boZufIBzioBqcG5kZFhfWllaVGJqZ1taX3WCaV5tbFxhV1xca4FlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWRzaHp3koFjY1RlcGiChXh4Z2lqYVdWWWdjjqdvfneAi457cXJ/aXtxfI59eJBzhX5/f4ZuZHVyZGdnXGphXG9vXGdfbXRlemhddIBvcmtxfH51dmJ1hox7iIiBgHlzdYB2YnFuW3J0Y3FzhXx1ZXOAbWFte3Branx6dnNnh3Z7enZxZWJkbXJ9aWtTZ11cVEtxYlBGVWBHYnZmYUtTb1hKTVhYZ2t1e2VlbnFmZFpXXlh3ZVRKXGJXaFhZSFdlUEhhd1pdX2xaXlxhY15+aWpgb3R4bXBudoOXenKAgHx/iYyGfXV1hniHjHx0dXWCeXp6goyOfX6EiWlzloF6ip1+foV6gXp/fIaIc3GPrYx7e4aPfWVxh3lzfHp1cm+GbHt+bI96Y3BvYmVdZVZZWVdjZmtfXV1zhWhYcW5bXlhaXGx7YnB3dWxhWWxzc2d0dW9sg3h+f3h2bW50ZGl0ZVtndWZ2dpF6X11SZmZrg4J0fmJkalxUV11iY4+laHh0g4aReW5xfGp6b32HfXaKdIJ5fHh/aGR2bGBmX15pXlxza1llXW9vYnplXHd8a25ucHh5dHVlc4STf4iDiXx3cHN/dGN4ZVxxcWJxcoJ9dGdygGVfbndqZWh6fXVvcIN2dH10cmJfZm1ufGRoU2dXWFNNdl9QSllXSGJ0Y2FJVG1TSk1aV2lscXxjbWxzY2JaWlthd1xTS2NdWGlTV0dZYE1HaXRYXmBsW1tfYmJchGloYW54eW1vanaBkHltg36AgZOIhIF2dIl0jIZ0cnZ2gnh9fX6MkIB+k35wd5WDfJiSeYCAeHp+gHSIg3RwmaF6en+JlHdjdIZ4c3d0a3Rufmt4fHCRc15wbmBnYmxUWlpXaGNtZltccYllU3JuW1pYV2BsdmNpdWppXlltc3Brc3NzaYR8fn57dm5ubGRpcWNbanJkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEknVsbHtvcHJ8fn1zgniAc3p6emRldWddYllgZ1pedmhXYl1waGF3YVt8dmlqcm94dHN1aXGCloSHf4V3dGtxfm9neFhdbG5jcnSBenRncH5cYHByYmBrcn9tbnZ/c3J4a3FhXGVsbHpgZlJlU1ZRT3VbUU9YUUhjc2FgR1ZqUElQWlVra2t8ZW5vcWJbWlhZbHFXUlBmVlZoU1RGWlxOSHF0WF9jbGJYYGBhXYtqY2RtenhscGl1eYd7a4N9f4SafIOEeXyHbY+Hcm92enx0goJ8i4+Dgpd0eIGThYGeiXWBgIF0f4Jxh4J1b6GWc3qGi4Z6ZHaJbm16bmZ4cHprc3ZzjWtedW5hZ2VrUl1bVWdhbGtaXHGMZE9vbl1WWFVnaXNoYnRlZFxYbXRsb3V0eGqGfH97h3aPc2Nka25hXG5tY3N4h2taVFZjZHh9fXGGXWRfY1RaX1lilZVjbnCDhYp0a2l8cGd1eHV9bXt1dnB6f3ZfZnJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXRxdHF1d2tthZSCiXyGcnNncH5ydHBUXGdrZnJ1gXd0Y212VmNybFtfcGd+Zm54fnR0c2tuYVpkaWp3XmVTY1RVUFNsVlBWUlBHZHJfYUZYaU5JWFRWbWhkfGlreGtiV11VW3RkU1JXaFFYZlRTSFpaUE13dlpfZWtpWWFgXl6ObmJma3l1bm9pdnaAf2yDgH2HmHuAh4GJfmuTiHJndIB7dYCDfYmPf4uTcnyKkYWHn4Z7f4aMc4GGc32Cdm6ki3KAjYt2d2x5i2Bke3BmeXN4bG1xd4NnZHxtY2ZnaFNfXlVnX2xuW15ujWhOaW1gVFZTb2dza2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVweH5nWlZYYGx4fHtwhF9jX2dWWF9XY5uIYmtwgYd9eGxsem5deHNufGt2dG9wfIBzWGpuXlhcVWFiV2RwY1NeYmlhYmxaYX5sZmx0dm9td3dsaYaMgIp7iW5yZnJ+bnRuZFthaWlwdIF0c15pbVNlcWVWY29kfGRzeH13bHBta2BZYWZndFxkVWBVUk5XZFJPW05PSGRvXGJHWWlNSl9LWG1kYHhpbn5kYFVfVF11XFNSYGZOXWFVU0pcWVBZdHVdX2VraFhiYVtejXFjZ2p4cXNuaHZ0eoRygoN6iI5+fImHjXlukIp1bHOCdH9/iIWHkYSVj3l9jI6HkZuEgHyMhXN/gXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2Ojo6Njo6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjY6Ojo6Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2N1tPURERERDWGhnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn7WcuNTU1NTRNYV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmIiIiIiIeNkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWFhYWFhYaTlJSUlJSVioWFhYWFhYeJiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkpKRiYeOipCSkpOPjo+MjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuKi4uLjIuNjo6Ojo6OjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeJiIiNiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhIiFho+JjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmDhoeIjIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjoiHiIaMiI+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Qjo2Mi42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4CBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9/f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhYaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3ent8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl7e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/QD48PkA/PT09Pz49PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkVDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkVAP0BOYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8e3t8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PkE/QURFRENXdYaJin5YR0lKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm9wcXJ2dnl7e3t6fX1+fn19fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdISElHRkJERkREQ0FVdIeJh4eGiIJXSUxNTE1NTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS01KS0hIRkZHRkVQbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZIREVHSUtJSUdISUdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTUxJRkpWbIGGhYSEhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lJS0xPTk5RTlFecoGFg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QTs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5/fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njs8Q0BCRkhLSExLTVRne4SEg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODo7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRGRUpieISEgoKDgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NjY3NjU6Ojs6Ojw4OTg5OTg3Nzo6Ojg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BRV2tycnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEQ/XYSDg4OEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj48Ojw7PDs8Ozk6PDg6Ojs6OTk5PD88PUFCRElKTEtKS0xXb3J0dXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj0/P0R3goOEhIWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUFCPkBDQUA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEFAPz9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6Ozw6Ojo8Oz0+QD89YYWChIOFhIaJiYiHhoaGh4iJiouLioqKi4qLXj5ER0lLSkpGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj06PDo9PT4+Oz48Pz5CP0p+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRUNERkdGRENFRkRCSElLR0hHRkdHRUtKTElLS0pDRkNDREJBQUNCRENDRERDQT08PkBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f3+AgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc7Pjs8Oj0/Pj88Pz5CQUQ+aISChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtGREdISElFRUhGRkVMTE1JSkdHSElKTk1PTUxOS0hHR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6PT88PT0/QENCSFN+g4SEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExKSEhGSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTk9OTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVb3F1dnh6e3h4enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozc8PTo8Pzw8PT9CQ0NMbYSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4teUlJQTU5NS0pHRkNISkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OD89PT5ARUQ9QkRDRkp1hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUZGS09OT1dWUVBPUVNSTlNUT01TTFBTVVdSU1JQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3F1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz08QT9BQURUS0JISUZJS3iGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQUNGRENES1ZQSk9PTlBQeYaFh4aFhoeIiIeIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlbXFlfVFlnUlVWWFRUVlNPT01LTEpJSUxNS09NU290dnh5eHd5eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1FQVFZVVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ1xbXF1dV1JOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5UUVFQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3F5XltWVVNST0tGQ0RBTV6DbFZSU09PUU9RVlFTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JVUk1PWVFNTlFTVVVNUVNSUE9NTEhDSUdSU1RaXW1ydnZ1dHR3e3p6e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRgZF1eW1lVUUxJTElhbJJ0UFFTTVFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQT9EUENEQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dEQkFDQE5QTVJkdHV2dXN0dnl8ent7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZoZWViXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIODgoGCgIKBgWtMRz4+Ojo+QD8+Pj5qUEphRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNDQD88PUI+SU1GVW91dXZzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcTntOT09OS0xNT09QTEtMV05IR0FBPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1d3V2d3l8fHx9fHx8fH59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJTVlhTUllUTllaW1dZXF9eX2VgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FXUE1KREY+Ojk2NTg3OTc5OjM2NTc5NTxCPWZ0dXd4d3l5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT01MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE9KTk9VU1RcVlJVU1NPTUxJSEhGPz49Ojc4NzY1OTk2NzU2NVdxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9JR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFBPTk5NUE5UUlBSTElMS09SUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPTNAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMT1BOTVBRUU5QT0pMTU1LR0VFQ0I7PT08OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JCOERNU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FMTk5NSU1MSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHSkpARkFBQEVHRElPSFFSYVxRUFJPU05PT0xMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZFP0JDPj1CRz9CP0BkcnV3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48QkFAR0lETU9iZVBNT01XS0xOS0tNTUxMS05OU2RNSkxSSUlJRUJJSkxNTkpHSUZCQkJAP0VGRUhETG9wdnp5eXt7enx6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPSEtFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPj8/QD5DRURMTVFUTEpJTVRGSUlKTElKS0lKTE1PUFJQS0dDS0dDQ0tKTE5PTklKSUdDQ0NESUpNTElac254eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFISkNGR0hHSktJSkxER0I8Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHSENDO0FAQj5AP0JFRElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJISUROR0JFTEtOTlFOTE1KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhlcEZKQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREE/QkNFRUlGSkpMRklJR0ZGREI6QUNDPj9DQ0NER0tNSEpOSERIRElMTk1ISUxHRkZJSUxOS0lIRU9JQ0dOTVBOUE5PT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjs7Oz07PT9EQj9BQ0ZHSkZKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRkZGS05PS0ZISUZFQ0RJSUhLSUdIUEtESk1NUU5PTk9QTkpKSU1SVVVSUFhlYWFtZnByb3J5emdlaGhjaWxmcWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VERkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdKRkpHSUdGRkZFRENBQUVGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVDQ0hISEtKR0tSTUNPT05RT09PTk9PS0tLUFVXVlZUWWBfXWlgbWpuaHJzYmVmZmRoaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01HR0VHQUFAQ0Q8QUFAQzw4Oj0+Oj89QEJAQEBERkhFSEZGSEZFRURDREJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9NT1BNTE5TV1ZXWVZYXlpdZGBoY2ppZ2tfZGVmY2hnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hBQUJFRTxAQ0JEPDc6PT47PjtBQj4/P0NFRkRGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9IVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURBQ0dFPEBFQkQ8ODo+Pj48PEJDPUA+QUJGQ0VDQ0dEQ0RFRkdHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhLSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXWBjXlxiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRkJER0U9QUdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREZGSEhGSEdJS0pFSkhISkhGRkxISEhKR0xMTExMSU1KTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJlXmRgZmhgZWhqZHNzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd3B3SUpMSUtHQkVERTxBRkREQjs/P0FAQEFEQUBCPkFDSEJFREZHRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTEpJTEtNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFiYGNkZWJkaWNkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV0ZXFza3BxanJ2cHdKTEtLTEdDQ0FFPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0dHSEZFSUZDR0pHR0pFSUxISUpNS01MR0tJSEtLTlFLUlFMU01KTU1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY15gZmJhY2luaGNpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PURFRkM/Q0FFRERGQ0JFR0NDSUVCSEpJR0hKRkRLSkdISkhJS0dKSk5LTkxJTEhKTUtaZkpkXEtsUkdOTV9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbnpmXGx1YGxrVV93dmlqaGhmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj88REVGRENDQ0VFREZCRUZHRERKRERKTEtJS0xHR05KSEpLR0tKSUtKTkxNTUxMSU1MTFtzYmRwXmxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm5ccHZncE5LcXl2a2Fha2VlbHhta3Zsbm9zcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FBPz1CRUZCRUNFREVFRENISEdERUtIR0tNTUpMTEZKTkhKS0pJS0pKSUtNTU5NTU1LTk1NW3Jwb25wcGxrTVBRbFhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcF1gc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dGRUVCQUI9Pz9FR0JHRElFRURCRklISERHS0pHTUxOSkxNR0xOSU1LSEpNSUpKSkpOT05OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0tSUkxITU1ITkpJSE5HSkpISE5PTU5MSk5NSlp0cHBvcXFtbE9RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0VFRUBAPkNDQUZDSElNSEZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUlKTElLSklJS0xNTUxJS0tLU2tiWWleX2pjcnJaX1lqb19lZVVrX2RbYWJRYG1oXGpcbmlpZFtvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURDR0JISkxHRkRHS0xJRUZKT0xJT0pMW1FKRkhIS01JSEpKS0tJSEpHS0tLS0dIS0pMS0xKSUtMTlRbXVRQVU1RT05PT1VSUFBRT09RSkpOUFFkcWlUWVZbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0lQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKSEhIRUZMSEhKTktIT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZFxhWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1BQ0RCRElFR0dGS0pLSEVFSkpKRkRHSFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklNSUpUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teZF5aXWBjX1lfYltgXltVWVhaX15kY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXp6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLSkpFRUhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRkNERUJGSkQ/SUtJTltjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmJiY2NlWlJZVlddW15kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkRHRUJFR0hGR0hJRkdKR0hGSEtJS0RDS0pNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0lFRUBEQUhJQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1tLV1xMUlxZSU1eUVFdX2JjY2NjYlxkY2JkY2VYUlZVVF1ZW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSUZHR0lHR0pGRkZJTEpORUNLSkxOSkxJS0pJSUdCSEhRTUtLT01LS0lISEZFP0VCSEhBQEZFQ1RdWV5YX1lfW11VWFhQXV1RS0pWXlheW11WWmFSUl9fYmJgYGJiX2NiYmRkYlhQUlJTXFRcXV1eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0pJR0RIS1FPTUxQTUxLS0lKREVBRUNIRkFBRkRBVlVFXFReU1ZfWE5UVU5aW01KS1RgYVtfWF9eYl1PWGJcYGBfYmNhXWJiV19fVFFQUVJZU15cW11eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJU2NRRVdfSUdHSERGTUpQUEZJSUpLTkxMS01LSkpHRUlOUVFOT1BNTk1OSExCREFDQ0ZEQ0FDREBMSENMTFBPTkxGTUZGSElIR0xMTU9QSUxPUFBTUExRVFJVWlhXWVdXY1ZPU1RQUU9PUVVUXFlZW15eYWFlZmNoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BUU05QUE5PT09IS0ZgRUReTERmY0NMW0heXHNtT01WbVlMQ09fVGxXZ0pdV1VeRExRVUxNU1ZRUlRYVlRYVFRcVFBmWmhoZVpUa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USktHYFRISk9KSU9NUlFLTUtMT1JVUk9QSkxOR0hNUVtZT1BQTk9QUEpLUX9RSXxZWXJzV1BtR3Fub2FWUHFxdE9CanNucXRwU29fW25YXVZcWFVraFVdVmNZYFlaXlVVV39pdHV1X2F2X1liXFxmW19hYWFiXmBjZ21vbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT01RVE5PUVBLTE9HTVBTW1pUUVJPUFBQS0laeF1UeGRoWFJTUHZmdGxwYm5ma1JyTkx3bWpycHNycXJwb3CAXWV6dXhxcXpxfnJ9a3V9YVJofGVzc29zc3x9cH54b39yYGBgYmJbYWFobG5rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpRT01OSk5WXllVTFFTTllZTFNSUk5MUElRUlRZV1dRVFBQUVJLSGd4bGN4cW1aSkxUeXB1bXVibnZQZGRIZXZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGhuWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVnamplZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFFIS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWNoYVZuTHFwXkdoeVd2VEtoeH13YHl7c25hXW1vZFNncnVubXlwd2x2c3RxbG1cc356a215fGx1bnxscXZ1eF5fX2JfXV9lZWlnaGZlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUtNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnVVV2xObmx7cmFqZ391VEtXa2d8bG1seF9acHp7X2B6c2Nyb3hxaGR8aXJ7XVRLa192dWxqdnx7bX55a3xwXV5eYltfYmRlZ2ZmZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbG1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1JYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFNT1VMS0tSU1JSUk9WVVFRT1JSWFhQTlBVVFdYWFtbVVFSV1tXWFdbT1JUV1dYUV1YVlxVVE9YUldXWFlaYFxncl9bW1pdXV9jWl9jY2VnZGRkY1pkYmdmZm1ubXVmZmdjYGZeXmdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJOUlFQTFZVVFBUVVhVWlZSW11WVVRXVVlYT09MTldUUE5VU05QTkxRUEtJUVFLUU1KSk9RVFJQUVNSSUlNT1BRUlBQUFRVUlhXXFdTUlBRVVVVU1pRTlJRV1VTWVZUWFRTUVRTVVVZWVheWl9hXVxaWlxcYGNcXmJiZGdlZWViWWBhY2FiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlNcYFZXVllVWFRRUEtPWFNQTlVQTlFOTFNQTU5VU05RTk1OUVNQVFBSVFROTE5PUlRUUVFRVVdVWVpbWlNVUlRYV1ZZXFNPU1RXVVRZVVZYVFJRV1VWWFxaXGBdV1lfXV5dXF1gYV5bYmNjaGdmZWJYYGBiXWBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWU1RPS09WVFBPVFBQUU5NUlFPUVhUUVFPTU9SVE5XUVRUVU9OTlFUVVVSUlJUWFZaXVxaVlZRUldYVVtbVlBTVVVVVlhTV1dUUlFYVlZbX1tfYF9WX11eYFxcYGBfX1piY2VpaGVlYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVlxaWldbW1xZWltkcW1oZF9bWVZWWFJNTldTTU1ST1FST01QU1JVWlVUUFBMUFdVUVZSU1JYTU9QUlVYVVRUU1RZWFteXVxbVlJPVVZVW1tWUVNWVFZYVFNYWlNSUVlXV11fW2BfYFZiXGBhXWBiX1xgXWNhY2hpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFZTUlRSUlpPUVNTVltWVlZTVlpYXV5cXF5WU05UVlZbW1VRVFRVV1hSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2llZ11cZWBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1cYFxgVVxcaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVVNOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aWFFUVFdYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXl5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVldWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVU09XUVNYU1dVVlteWFtZVVpeWF9eWVxZUldSWVhZX1lZUlRVWVlZVVdZXFVUWl1dXmFiYGVkXV5dXWVhYmZkXl9kY2BcZ2VoZmRiYGVhX2FhYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFNXVVRSU1dRU1ZUWFhYXl5YXVtVXV9YX19YXFZRWVRZWlphWFtUVldaWlpYWVlaV1ZdX2BfZGNiZWVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlRcVVdXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVVJWVVFTVVdbW1xfX1pfXFZfX1ldXlleVlNZV1lZXGFZXVVWWltaW1paWVpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkaF9nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVZYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZVU1VUWF1dX2BgXWFdV2FeW15cW15YVlhXW1pfX1peV1hcXFxdXVtaXFdaX2FeYGRkZGZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpZWFpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVVdYV1ZWV1ZdXV5hYmFfYl5ZYV1dXllcXllYVVZbW2BeXF9ZWV5dXl5gXFpaWVtfYl9iZWRlZmdoY1plZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdZVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVtZWVdaWmBeYWJjYGFjX1xiXV9dW15eWVlUWF1cX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZmdlXWVnaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYmBjYmJdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeXl9aWFZbXlxcYWFfXVtgYWJmYl5cU1xfYGNkZGZlZ2dmZmZgZmdoaGdkZGBbZmdeYWhoY2loZmNgYmBjYl9fX11dW1pbWVhYWFZaV1xbWlZWVUxYWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t8e3x8e3t7e3t6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycnGDiomJiYmGs9bS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vboWNjIyMjIi/6eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXp5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6enl6e318fHx8e4GEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV4dnZ2ent4e3h3dnZ4eXl6en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x8fXp5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnx9fXl7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+fHx8enx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt8fH16fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp6e3l5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh4eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGBgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qKi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHg4WCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uHjYmIiYWEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoWDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLioqLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GBg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KDhIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYF/gYGAgIKBgoKCgYGCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH5+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhYWCgYKDgoKEgoGChoWDhYODhISEhoWEhIWCf319fX6ChIODg4ODg4ODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIWFhYWEhoaFhoaFhYWFhIWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+gICEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoeGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4OEhISFhIOCgoODhIODgoOFhIWHh4WEgoB/f39/f4B/f3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChISEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhYOFg4ODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWEg4aFg4KCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDhISCgYGBgYGDg4SDhJGSkY6PjYuHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoKChISDgoWGiIuKhoSGhIKGhoKAhYSDg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjZCNiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFg4GAgIF/fn2Cg4ODg4KCgH19f4CAgX99fn59fH19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICBgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx8f4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f35/gIB/gICAgX+AgoCAgoKBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDg4OEhYCBf3x9fX59fX6AgH59fn17fX6Cg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB/fn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36AfX1/gYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoKBg4SEg4SAgYCAgYCBgIGCgoOBgIF/gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+f36BgIKBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKBgoF+fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgYOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoWEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeIh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWGhoeHhoeHiIaHh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GDhYWGhoSDhYWDhISDg4SDhISEiJKOi4mIiImHh4eFhoWEhYSCgoKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYmJh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoOEg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjYuMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4WFhYWDg4OEgoGDg4KDgoKBgICAf4F+f35+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH59e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjYiHh4WFhISDgoKBgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICBgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX19fXx8fYB/gIB+gH5+gZSRi4yNjY+KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fn1+gICBgH9/fn19fX1+e3t9f39/gH1/foCMkY2LjI2NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19fn9/fX6Afn5+hJKMi4uOjYuKhoSFhISDg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gISDgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgYJ/f4KCf4CKj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn+Bg4SCgYKBhYaFhYaGh4WChJGOjIqJioeIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJiomKiYWIkY2LiIiGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uKiYyQjYyJiIaFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+MioiIhYSEg4GCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6AgYOHhIiNjImJhoWEhIOCgoKDgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiYyJioeFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB9foB+fX5+gIB/gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX1+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX99fn59fnx7fHp8e3qAhYKDhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBf3+AfoCBfoCBgIB/fn5+fn5+f35+hYWAgYB/gIOBf36BgH9+gH+Af359e3p7enx7eoKDf4KCgoKDgoOCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3t6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fn2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSBfnt7fHx8fX19fn16fn1+eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhIWFg4ODg4ODgoGCg4KBg4J/gYB/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH9+fn5/f31+foCBgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGBgX5/fn5+fX19f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH9/goB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYOCgoOFhYKCfn58e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH9+fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKMenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+BgIB/gIB/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGDg4B/goGFg4OEgYGDgIKDgYGAgIGCg4KAgoKFg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDg4OBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgICBgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGDgYCAgIGAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnR9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn91dn+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx8gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYR/fX18fHx8f4F+fX5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WFhIWEgX+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYuJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgISDgH9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfH9zgoN/g4N9gX1+fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeHiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgoF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFhIaHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59f399foB+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHhoeGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWEhoaFhIOFhYKFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn59fXx/fH5+fH2BgH18fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeFhYeFhoaGhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODgoKDhoGDfoKCg4CDg39/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaHhYeGh4aHh4WEhoWDgYOCgIOFgoN+gYGBf4OBf35+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFh4eIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4aFh4OEhYSGhoaHhYWEg4WFh4WHhoeFhoaGhYaGhIOFhYKBgoGAg4ODgn2BgYB+g4F+f3+BfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWGhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgICBgICEgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCg4R/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18f359fHx9f358e4iFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg39+f4B/f3+Df3yAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e316e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaGhYWHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIN+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5+gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f359fX18fHt7enp6enl7enp6enp6ent8eXt9e3x/f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhIWFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo7ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19jc3d3d3d3d3d3d3d3d3tvX2NfY19fX2NfW19fX1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLmzeHNzc3Nzc3Nzc3Nzc3CSu7i4uLi4uLi4uLi4t73S0tLS0tLS09PT0tPT09zi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmTIpKysrKysrKysrKyolYamkpKOjo6Ojo6Ojo6Gr0tLS0tLS0tLS0tLS0tHf6urr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpps4LzAwMDAwMDAwMDAwK2WqpaWlpKSkpKSkpKSjrNLS0tLS0tLS0tLS0tLR3urq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaugRT0+Pj4+Pj4+Pj4+Pjlur6mpqampqampqampqLDS0tLT0tLS0tLS0tLS0d7p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crKysrKysrKycnJycnJzNLR0dLS0tLS0tLS0tLS1NTU1dXV1dXV1tXW1tbY2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7P09PPztDU0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bW1tbW1tbW1tbW1tfX1tXW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafSz6GWy9HGk6vSzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Ozs/P0Z2Pxaqgq5/Oma2Zs9LOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvq7GflY+htJWHnZ3Oz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZ6nnZ+nmbS/yZaZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImbtaSgi5/D0pGYoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PEJAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBm8WZxcmU2Kyjv53V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw7Ojk/QD08PT1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5efopWVobvNiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ozs4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDTeZuws52l0NuimbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzs7OT0+PT07Oz08QENCPz4+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+FooKjm6KdnJGomJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJqyoKmgop6poqmc0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFDQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iIz7CNkaXUmpGOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw5PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTVwL3W1NO4yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojw9Pzo7OTo8PUJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tTV09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Ojw+Ozo4Ojs/Pz9CQkE+QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njs9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk6PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pj9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD9CPzo4Nzc2PT8/QD1AQD8/PT07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT0tLS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+PTw/QD88NTY3Njw+Pz48QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFBPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBDQENDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojs8Pjs9PTs+PDo7ODk6ODlBQUJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I7OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTs/PTo5OTo8OTtFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY7REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc2ODU4QD5AOzw5PDs8Pjo6Ozk6OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODo4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg3NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc3NjY2ODc4NDs/Oz49OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Nzc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODY3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY3NTU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzY2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NjM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3ODYzNzY3OjY2NjU5Pj86PD87Pzk7Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09PD86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc4Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzg5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTY2Njc4ODo8Oz0+Ojs6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFREtQTjw5ODg2NTUzOTU2Njc2ODc5Pjo9Pjo8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk1NDc3NTY3OT06PT47PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNDY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDQ3Mzc4NTc2Njo9Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE4PDs2OjU2NTM0NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NjQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp6goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5aWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJycnJydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWl5eXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeSlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJqbm5ubm5mYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vri2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyampubm5qbmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+s6+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMj4+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouHiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz86PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg6OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxkY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGdiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFFAPzs6ODo4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87MzMfBw8fHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMvQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtoZ3VaZnJ3c3hmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLFyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3YmJgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lodG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZHRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFiY2NqYmZjWllZXFlRTkU9Ozg6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7q9v7m9urq0v7i1t7Ovu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDByr+xwr+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ojo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wbu7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OjY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozo3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2dhXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub66ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW7trnEuLS8trq9wby7vra/wb+8v7rAy8LHyMC/vLzAxcLHy8jBw8DAycvCwLu7sLS8vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdWl5cWVFFRENNSUFEPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypqKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pW19fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7K0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXVtUSjw+P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3srKytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdTkhBPz1IQ0ZNRD83NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsaawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqqvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKx77AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxBRk1GODY2NTo1Oj04Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW+u7+/ubS0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIP0hRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7a8vbiyrbOwr6yut7aytLSvqqSenJycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKqrnqWjm6OclZCMj4+Qk5CWlZaYn56empmml5OPkpadoqClo6akp6CipKOhoayrpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6avo6+utcG6tbeyt7aytKuytK6qq6+wsrOtpZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsKOlp56gnJWTkI+RkZiQlpWYlp+Ym5mbo5mXlJWanaCdp6iloKOjoaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7REA9Mj83NDk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkZaXmZmcoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6ieo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZaal5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh6YGJSVV9ISUlLU1RJUlBMOD5CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZydmpSYm5qRjpGVkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrbGxtKmxr6KZnJ2eoZibm5qYmZuUlZqWmJyloaCao6GanZmfpKKeoJ+ipp2bpaalpKSoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVcU1pZTVFKTk5VTFJMQTc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho56doJ+joKKvrqyvsay2p62xraamsK6trLCnoJ+ioJeRlJyhnJmYkpOfnaKkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7essbSjoJ2loKyhoaKgoJqYlpWfm5uYpKGgnqShoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1tWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpyhnZ6amZKZnpyioqCgnaKfn56fqaunrKmqtKurraulpauoqqyqpZ+emZKSlJiZlpaWjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oauiqaiyqauop6iamZ2aqqafmaegn5+nqKWknp2qoqKem5+ooKWnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imJybpJ+gm6Cco4mFhH52cW1pd21obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQURBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5iWmZ6bnKSfn52knZqdnKSipKOiqq+sp6mjoKGsrq6qq6agnp6ho56enpudnJSTlZSenpiUhp2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLS7xcO8wru3s6myraqzta+zrqquo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOioaSeppmboqSen5ubm5yHhYF7dHFra3VycGhXXFFFVEhESU9IPkVBM0VIOTU7PTY7PD88PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Qz9BQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpZ2Vm5ufmp6cn6Wmp52goKuxrqekpKOgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMHAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr3HxsK3w8nIwsDFvrm0ubq1urewtbKqurGuu7a+u7qqt62rqri6tLyurbiipaKep6Wio6mmmpufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqifnp+inZiZlJiUiIR9enJrZGlveGplWltGSkxERFNMREJENzo/OzU0OTk3OT0+PDw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PUE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZqdnZ+fmpeYl5KMj5aXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3MyMnRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbGysfOv8nQy8bExsTBu8PAvr6+tb2zrb6/wsPGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gm5mXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LU1dPTyMzHzc3J0szO083Ex8nKwcXLxsjIxb7Cs7PHxMvKys7Fyr++v7zBx8TMzMjJv8O/rbCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/enJ1dWdiZ3ZpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj08PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyblqmWjZeNjI2XprCupZ2enaGloZ6blZSWlIp8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dHX1tbS1s3U1tfU09HT1NTSz9HD0NPW19XW0svJztHLxs3SytLV1tnV19PW2M7Syc7RzM/QzNLPv8fGysPMzMvOz8XGx7a/yb/SzMvPxcnIv8PCyM7Mz9DPzMrHzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHdzdm9jYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmq5qjsLGpqLXQ1Nfa0sfGy7S2wsaytqmipaahoqu1p5qxoZaVjJCmrauclZihnZuhop+cnZuVindpY2FfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTPz9XU1NHRzNHO09fW09XQz9LT0cnT0cjQ2NfY0dfS19nV1szOz8nN0cvOz7/FwsfFzs3Q0NHIy8zAysvF087LzsjEycbGyMzK09PR1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66qqqyepq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOktqqfnaGqqaGYlpiam52hnpqdnpR+cmVjYl9fYV9fYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0crPzNPW0tHWzdDV1dHG0dTK0dTV1s7S0NjY2NfLyM3DyM7Mycu/yL/Iyc3Nz8rQzc7Lzs7Hys/Qys7KwsnGyczKzNHSzNPR0M/Pyr3IubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bua2JlbnBhV1xaSUZGRExXRTtAPDM0PD04Njg1NTs+QDw5PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snnri2tbWtpa2uvrSxwNnS19rc1s/Ny8PT0MLCsqutrqyms7G4q7G2qaOfnJaUl5uen5+dlJaXlYlsXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHTy8zQ0dPKztHV0tXVysDJwcXMwsjJwszCxcjJys7KzMzPzdPLxcfPzMfHysTGwMXJy83Q0cbPzs3NzM/Fx8C3ub3Dw73DubKzvrG8xMS1qpiloZmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbmhgYHFoWFhoVk1HTElQUEI7RD47Njc6ODk6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfDucvV1tna29jNzM/J1tbFxLiytqqkrq24u8HFyaGXjo2YlpCTkpGWlpaQjHxlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytHIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7GybzCxsjOxMLHwMbNx8PLycvPx8PDz8jGwcbHw77Ax8vLy87CysvIx8vPxMXHu8fDyMjCz8C9vL+wwcrHur2qsbKnpZ2inJiQm5CkmZeZkZWYiY+Cd250ZGxgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrQ0NLUysW6vr6wqLeqxd3Wx7GRjo6WkIaDhISCfoWFf3RgW15eXmBeYGNkY19dXV5fYGBfW1pcYGtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsjGwsPAw8fKycjKx8HFzMbIy83JxMLLycLCy9DEy8i/ucG6xce9v8bPysO/w7rJx8i6x8bEysC9wcvGxcO9xby8v8PEy8TEvL/JwsXH0cXAyL/KysbIxtDDw8bDr8TLx8TKt7+8urSprKWlmJ+YrKOhpZqjoJuUe3ZzdGZqW2FubVpbWFFETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPHzc/OzdXQ1tnY2dDN1M7P0MvEuMbBtrW8r9jDdX2SjJOXh3uAhYaAdnh1cnBfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy7ubjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e6usXCvrzBzcLGvr21wL3DurzGu8K5s7zFw8LCtr+1tb6/usvDvLW6yLq/vcvDwcXCxsjGyMbQxsLMyLLHysPOzcHFwr+9srews6eoqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRkJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc7P0snRxtbV1tjOzNDIzcjKxb7KwbK1urrTcFaOjoqLhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLS3tLOys7q1vbG3sLWvsrvCvMHEvL+7tbK6vsC4x7i0u7XAwry3vcbAw7u0rrK2ur6zxLe7tau4vL3AvbC6ta+2urLFvLauu7+0trTFvL7DxcDDxcbIy8bAxsa7yMu/z8rHw8bBw7fDvr22ub7Gv6y1urW3to54dHhnZ2Via25eVl5gRktISEpGQkNBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLyczKy8bRz9PRz8jLxsrGxMC9z72zub29uVh/koaJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBtaGZqbW5yfKTHv7m4tbCsrKeeoqqnnquss62pq6mzrbawsqmupqyyvLq2w7m6urGqtbm7tMK6sL+wvby7tbvHucK2raqosLHAtbi8r7CnsbO0u7yrrbWlrrauurGwqrmvrbuuu7i7v7+9ucK/x8PFwbzGwcjLuMXHxb/Hw8O6xMbCu8XJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/PD46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs/SzMTGwcXQyM/CxMfBxsbFxczEy8zCxMHIwbq8u8q3tLy9t613k4mPkHx5foqFenuEgXduXl1dXV1fYF9fZGNiY2NiYF9eW1taWl1aWlpaXWRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6msqrCjpp+qrbW2sb25r7ivqK64tLS8uLO8rre5tLG7wbHBrqWpoqyxsrOnvKqrqKusrbS0pqiuoaSuqbKlp6iupai3rLCyt7m6u7G8vb6+xL+1wcHHyLe/wMW3xMK/u7/Ew77EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwLzKucDGwLzMusPHxbq9xL66t73Guba5u6+ykoSJjYF7foB+eHR/fHN3Zl9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSepJuXkaGjqqOin6Wlp6Ssn52bpKassq+2t6ewrKeqtKu0ubC2tKy2uLGvurmxt6Sfo5+nsaerqLmqpKanqKeyraCnpp6bpKasnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubrCs8C9v7W4u72+vMLHxMLDvr/DoIN3cGthZV9rb2BVWV9ITmhPVEhFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzc4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelZ6hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu3yLu3xMazvsW8t7C5wLuxs7ewo4WHh4J9eXZ0b21rampxaV9gXVxcXV9gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm5+fo6Whp56aopufqrCtsbWiqaqpq6yktbitt6+ssrSusrSusKqfnZ6jorKkpam4raGmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7KyubK9tLaxsbW0v7W9wL3Dwbq6vZeDenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmbpKbAsq+2rLS3xtDJycHHvLzFxdDAvMq7u8G7tsW4tcHBs8LEvK2qtbq3qLGzqYuGiIB5c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFdXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaQnKGhqJ2bnKWmoaSbn6CamK2ura6yoKWiraunobWwsbGsp66yp7mzprWhop6ao6KtoqGptaqio6adpaajlpiel5ianZ+Zl52cnJusoaumo6Smrauzs6q0sLKqsrm0r6mvsrKyt7Otqayusbewura5vb+2srGUhXl1ZV5lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va20uMPNycjBxrjCwcjQusPGwLa8vbbDura/wbW7v7uqprG7saiyr5t9hYWAeXBxdHFoZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnaicmpqqpq+wq5ujo7eqoJ+uqLappqassKO3sKO2oKKbmJiqpqGbrLivoqGknKGfoJOVoZSWlpuYl5aXnJSfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxr7Curqenp7KusbSvvLS5tq6jlIF5dWReYVZZV1NSVEtNXkxQS0dHTEtFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp6np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcWxv8C5wMG6wMC5ur23qKixu6apoqWJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKWmnpyfpJ+qr6afoqO2qKChoqizoaWnpK+lsKyrtJ6gnZWUqaGhlKyxsJ6iop2emJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62lqK6vrquoqqqzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFFHUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKett7u8wcW6sbm1xcrLwcTHx8m4yMa1xcLJr7q8wrzDwMG9vLe6tqansraeooqZh4B3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVVNUUlVgYF9gYV9gYWNkaYGUk4mRjpSSk5yUlZajmaCWnKCloa2lo6Oio6GbqqqlmZ6lsamgoJ2kqp2noZ6srKmorayioaGUl6ObnJCrqbCbn6KenpeYk4qeko2Sk5WPmJiSm6GinKSgoZWgoaSmm6OrpaKkqqOrrqSusammpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlVRRlFPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Nzs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njo4NTk4OTg6OzlAOXu1tK20u7KwrLKtnaenr7m5s8DIurXAr8bJzrvCy83Jt8u/tMDHzLC2vci7wsfEvb+3urWlq7CunZqHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eX19fYmRtjo+EkYaPkY+Zk5SSnJqinJugp6iqp6qlqKSjmKSupJSZpa+pn5uYmqCerpmbqrOfpaaeoqOglJOblpWSqKmtmpygoaCalJCMmY6LkIySjJaUkJ2hoKOcm6KVm6CioJeiqKOiqKugq6+krbelo6OirK2pqKuvs7iyvbWzq6+Yg3JyaFtYWVNVUkVZTFBcWU1UT1BMUFJJTklCPD8/QT89NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaivrZupqKy3tqy8yru2v6zMx8a5ws/QybXGvrq+xsu1sb3FvcPGxL3Bs7mvpquvq56XhoF3eG9uaW5ubnFnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/i5CKko2XkZeZoqCbn6qppq2qpq+ip5mfrKCVlqSop52Xj46Zna6Wl6eqmZ+dk6WgnZGQkpKSlaeqpJmZmp2dlo2Mi5SGiI2DkIuSlJCgnqCjl5WflZqgop2Tm6Wlp6iooLGwprC8p6CjrLSrraewtLC5tcCxrbGrkH1wcmJWVFVOUklHVlFTUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6vMPL0cyzubq+wMTHtrS3vbO7vMS+wrG0rrGusaycoohraG5vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/dYmOh5CJmImUlJebmZ2om5+qpKSqnKeYoKWbko+eopqXloSDkZqjj5OinJWVloehmpqTi46Kj5mjp5yVlZebkJKHlI6MgYuNgJCKkpKRoZqfoZWTmJiVoqWYjJmkpqimoaC0sqeyt6Gdoresqq2ksrKmtby1rKuxo4h4cm1dTlBRTE9DTk5OUEtGTk5LSk5NUUlNSkFHS0hIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKmloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOzrrairbXEuruvqqy0r6+gl6h9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnGFiIKHgJGDjoqUkZOdoI6am6Kgo5iklqGblY2HmJqMc42CfY2WloWQmZCTjY56mI6cjIKKf4mYn6KekJOYloSOgpN+fnSJjnqQhpKQkJ2amZqQlY+djqKjjomaoKGko5uitK+sr6yfmKW5pqWwobCunLC7qqmvqpmBdnJiVkxRT1BNQ1NOTFFNQ1BQSElOU01ISkpESkxFSks9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd3t6KjtKilpaijpqWmpqazp6W0wLiwtLDKxrm6ws/Hv7WvvcOvsceyraeslaSuv7ixsJ+nra2rlpWicldWX2hnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeKk5Cel5yVlJaUjpaJf5OJXztXb3uLk4l/i5GMj4WGcoqEloF5gnqFk52Ug5WOkI+Chn2SeHFvhY1+iYCQjY+XmZiTio+InIiel4eHlp6aoaCXp6+oramon5ettKKmrZisq5intKKpraOSfXFtX1pOU1FWTERUSlBNTEZPT0pGTFFNS1BKSU1QRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5eLego66hpqaqoKepp6KpsKintMG5sbWwycO5tL/PwLqxsbjEq67Jrqejnoaborqtp6iWpqWkoZePlmlRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFBCQH+VkZF9iZSMhIqNmoyWlYqSiIaVhnmIf2BKUW54ipGEfISMiYR/f25+f5R3dXZ4hI2ZcFGNiIqGe354lHZnd4WIfoqIlYqNkJKWi4OJh5SEmoyBhJKblp6clKSjp6mlo56bsKuhpKSQpqqWoaqcoqaoiHRrZV1bSFFRU0xJVU1TSUxMUElIRktPTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXa2nKOnnZ+hrqGnqKWnqK+sqra8tri2s8K8t6i6ybm3qaq3uK22wKqim5ODj5myn6KajaCWmZSQioxkTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgXuFjJKBkpmLj3uGj391f3hzbnVwdI2NgXl9iaqFeXpodnuOcHJteICKjJJ4eoB7gHZzcpJ3Z3WEhISEepWJiIqMi4B/hIqMf5SDe4CPmJSblZGfnaien6CeoKmln52YjKekk6Cglp2epH9xZ2BcXEpWT1FHS1hST0pMTVJKSkpNUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLi8yMDAvLSsoKCkuMTI2MjE5ODc5ODc3Njo8PDd2rpijoZicnrOpr6mlrKywsaq9tLK8uLa6tbKgt7uzq52fraustbOlnpaSmIaUpJadjIOXiY+JhYWCZEtJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4f4mPfISYkoFyh498dntva36tfHOQin97hpKAfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcWhxgH2OcEOKhIKDhX53d3qLhX2LenV+jpKPmIqSmpujl5mdm52eop2WjYqkm4+dl46WmI51bWtlYVlXWFRRSlJVVE9QTlFWS05LTk9KUU9JT09LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKavrK6rp6mwr7GsvLisu765s62om7GorZyQl56nrKekm52TiJZ+jpWSlYB8inqFgH5+f2JKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFdZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZZ/SZKYbmh3foFsaWNseYWQkoZrc2x8bnJ7hmhtcH5zjYiDhXp9fnt2b3R0hYJ5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5GKkoyGkJZ9bGhtbm1XVVdUUVFZT1NVVFRYVU1OSE1KTU5LQ0lOR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6kra+iraqota+urLS/q7zCv6ajmpWlmJ6OhYyWoqSbmpSXj3aRfoWLkI98eH50fXh0d3lkT0VHREA8Pj5BRkdHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4h1gYiGdGyZkXRze2prnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3xncHB7bpKNjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdjV1FZV1hZW01QVVZaWU5JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LSs1Nzc1NDc4aU84OzVukoiZkZqWpKitnrKeprquq7KwwrK7w8ebl4+UmYuOhnqFkZqWj5KOkol0ioR3i4+Mf3Z3dXh2b3hyaFVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bXGDgYWBeYSGhnlyoJR0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiIBoZmJpbnJtcIN1aW9YdW+OmpF2bH96fG1xbXB/enN1bWJ2hH+GgIWQkYqLiZGLkYyLj4N1eIuPgH6CgH2PeHBubmpeWltdW1lYYF9TTltaWVhMSEpGSkc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qK2xrsGzusHGl5CMlJCBiX1ugpGTioSLiJCIdoSFb5iKjH95e3txe3R8a29fSlBHPkA3NDU4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8fYWDf4x+dqKZeX6GgISZhZucYYaqn52LgpCNenaJfomIjnOKl4+De1xkcXR6e3eKbGdpYXhvhY+Cem6Bd3OEenBzeXdrbmldd4d9h3yIh4+Ai5OXg42GjYZ9cYR/hHx1d3t9iHRtcXJkZV5aWl1TW2ZeWFFVWVxWR0tLRUxHP0ZAREM/QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgqp+wqa/AsbvGupaPkZSIeoZ2a4CMkoN+i4WQjXmEgnWiho1+foKAc4OBfWt6bFNYTEFFMzExMjY2Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiXuJeXtxfI+Me3yJhn6Xh3ahmYiHj5KUpY2sqUiGra+vioCAk4qCi4KEkaiHgJiYipxzbHyBhod9jmhnZ3h+boWGgYVxhIZHa4B3cXl2aG1rX3d9g4h/iIWMepWenIqLiZF/e3WLdnx3bW93fn1xcXBqWltbWmNiV2dlXFVQUVhaUURMTEdPSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NzU2NzY4O0RGTE1NTEM3KyImJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6CdrKGmuK+zvbSXjZKLmIt9dHB/ipN/fo2DlJV9hn+HpYeJgIOIhnmJi4B1hXlfY1ZMQzYwLi8yMjEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiZGBmpaCoKGYlZuapa2Tmbuxp7vHw6eKjKGljpOJgZB7coOen5GcfnaFhYuPh5BpaG+DgHSMhoSLcYaCd4d/e3aFfW52dWeBlI+GiYiIiYiiq6OWiY6YgHuCiXp6b2dreH13fHFpY1xZWVxoXGFmX1pPTE5YU1FJUEtETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGQj4uamqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWfoqBkpuOhIGCjIuCio6EgIqAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6ChkqOppaOsk6i2oqfBwq7Ir3i6lJp8jKGemISThYKPoZ6TmZKEioWPmJCWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGXh5OJj4+Xpbapm42VooOHk4R+f2tqbH1+fX9xX1tiXllmalxsa19YS0hQU1FOTUxGSVFERE5GQkNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafoWTknqBkomSkn2LhZmSkYOBgYuOiYaRh4SIhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMm3yNHPvpugcGmrqZ+Ek5KFnKCampmnkZGIlaGZmnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ2RmaiIl5COgYhsc3N7fHluZl5bX15hZ2NfZ2dcUkVLS1FPSUpNRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl5QcXVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mImI15go2Ljo18ioaPkI6Bg4CJjImFk4WChomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49RkhAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKiptayxt7Kyrbuxs76cs8Ssu8nLuMO/t6WjsLKsraqji5aYhaWmoKKYgqaZjaKqp6SHhZOjoKCqoKSpjpyxi5Wjp7e7nKGjsJOjnaOekaSiq7Cts7WilaaqiZqKk4qVent+g3tlXmZaY2BdYmJeZmdfW09ESUhUT0ZITEZLR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo1NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMj4uKe4iDh5GOg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJTVVVXVU1cUUdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHxKuzxbattMCzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4mnr6qklXefpJehq7GzmJapraiutbuyuqyvtaKxrLK1vLi0rrWgqKijqJupsK2zuri4qJy4qY2lj5KToId5gYByV19iVWRgYGFeX2ZgW1VKREVMVlFJSkpFSkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFjZFd6dXGBlX2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYeFgY6AgYqPhoCGiIWKh5F6eW5dV0BFTjw2OjQ2QUI3NjQvLzZDSENRXE9RVVhVXFdPX1VJS0pBQD9HS0ZGRDs+QDdENz9CSkpFR1dUUF6PpK2ksrTDtrjBzMq2u8S9s7TBt7jCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqxoKKWm6KSpbGtpa2sp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6t7+4uri6ra2xprGqrr6wvbzDw6yZu6iVro+YmauJfoB5aFVhX1ZoY2hkVltjWVZUSkdHTFJHRElKQUlEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Fb3tyeIhiuaGZo4mVlJaTlJSOkJeSh4d7h4GOloqBhIGKenyLiIZ8ioKBi4SVfXh6dWZPXGRHRUw6UWRgW15TRj87SFBEWmNRUVlZWmdaU2BhTVNPRUE/SUpIRUZBQEM9RTZCP0hHS01TWlRelK+4tbu5ycC7vcrNvLzBvLi2vLu3vrW6s8ZhdbKlsZqeq76qpairqqSisrWgq6eelZaemJ+upaenpZ+kk6KnsLOosrK8tsG908nJ08bCxczCysTAvr6/vLy4tLC5t7fDusa+xMmwnrqroqyPpam3iYB8blxeXlxVX11nZlNZYVZSVklFRk5LQT5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGPjYaQc2xycnSI1cC1mqCNlZmZkY6XkpaWjoaIfYeDjZaKfoJ/g3l7i4SHe4t5gYqCl390fXpsZXB2WV1cUGVlYmBlZF1bWFhcTWRtVVJtbl9vX1hnZVVZVEtEQktLSEZISEhIQkk5REBIS1RUVl1aXJO5wLm+uMbBu7nKy7u2ura4ubS4tbWutreZZHWpnq1wXqKtnJihopuknqullJ+fkJSOlpiXqJ6mn5+amYOjnaykqrGtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKwMnPtKS8sbWwnKy5vZp9dmlbXFlXW19YYWJRXGFUUkxDQkZHRTxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLjAsQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQi4l8gYRze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWhgZmlpbVptdJetpL2Ih2dbb2hdWllUSEtPUEpLUEtUUUhMQUpGS1BfX2JnamKXt8ewurS7vraxxce2sLmxsbuts7Goq7itjbaonpynmk6anoyPoJaRp5illYqTk4iRiY+Rkp2boZiblZaHnpmmmqywqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8Sif2thWlpbVl5WWWNZUF1YT1JDQklFQ0k7QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYNocm95eYOhqp6ml4ybm5iLjpWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2lucHlpd31+y7/D36duY3huZFthYEtQUlVOWV5QXl1OUU5UUVVUXG5ud4Nylq64rLWosLarrb3Bsqu1pqW5p6yvoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSLg5SVl5eUm5CcmJmZnp6rrKSnoqysztLV0c3M0tPT0NTRzsjD1NHIztLT09fN0tHF0tbGwc/IyMOpv7jQnHZrYlpfW1ReUVxZT1BUUE5JPkFHQkNGPUFCP0ZFPkA/Oj09PDxKQjQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBvd3Nsc318d3xzgnhxa4Bycmlwcnp5cnu+y5p/jbKEdnKFd2lhaV1EWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGppqqxuaumtKOirqKkrqKnsZ+JppuVk5GKko+IgpSJa5WijZmEgYZ+kYODk5esi5WOlZqOhZKQnZensKKgoaWkqMjNz8fCy9DT0dTSztPNxtbTzdTY1tbY1dfVytTazcrY1tHLrcTDy4hvbF9cXFZSV1JaT0pHSUpKQDs6O0VCRD1DRD5IQz9DQjs8OTw6R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYiIi4l+g3hzfH2Eh3eAe4eRl4GEb3hxbXV/dnh9dIZ8eWyHdnRufXaFdXl7nbWMPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhrbmlugYSJkYyen6CekZeZoKOkprKkpbKgoqWfoqmhorGch5+SkpORi4+Lh4SPhH6cnIyNgoSFepR/gqqWo4ySi5iTi32XipqRqrOYm5ynnKa9w8W5tsXN0dDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR1c2thWldQU1BYVUVHSklGRT06NzpAQkM6SEVARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6LfoeSgomGhYqCiH14hZeXiY+Dh4aHeoR5cXt7hYZ1eoaOjp16jXB9cHB6gHJ7gXKEh4Bujnp1d319gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnBxcG53d4JlaW9ydnhye4yHj5OSm5agloiMk5yfm5+roKGsnKKamqCmn5+smYyajZGTjoV9iIeDhYuOoJmTiIOHfmyZeYSZh4iTjI6VjIZ7m4iTjq2qlJWXn5imrrW8qK29x8vIycvLz8nE0srU19jX2NfU29fT2dvWz9va0tbJ1cyTdXdlZFhXTlFSW0dDRklIPkI+PTg6PkA8Pkg9QEJBQUVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmx2gIhxkZCbgHmAjn6CgYKFf4R8fYSYjoeMf4aHgXeDeW57e4eCdHqSno6hdo92g3R1gX50gIRvgZCCb5KFdXyBhXp2h3yJuMalw8q4gpacj3hwZk5lY4J6gneFoZCLeXp3e4SAfIR1bZSWlZaQmJGDiY+XmpeXpp2YoJefk5KXo56aq5aRkYuNk4OMhYmJgYaPkZ6cmYiFi4GFl3qIiZ+XkImOiouCfKGJkIu8oJiTl5qcqKalrZ6ntb+/v7jGyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGg3Z2ZGZhXVJVVFRNS0RNQzs9PDw5Ojw/OT1BNz4/QD0/Pj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs5OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eot8foB/gH6Fe36CkYqFhnuFiHx1fnVtfH2HfnR/kp2Rn4OSfId+eI9+eYuKb4ObgXSZhn2CioV8fpF7kKmPkMOgvYybpJx+ioV9iXOMi39zppqcmJSFe4+RiYRpR3GhpJ6MjJGShYiLkJKVj52bk5SRl42MlZ+dlKGVk46OkIx/kI+Oi4SJkpaZn5+IjJSRnZCCjH+mmYiFjoOGhIClhoqLuJedkZSWoaagnZ2do662ubSrwMbK0MjHzc/T0tLY0tXXwNfY2dvY2trZ2dfbtnZ1dGdmYlRdWVJOTkhDTEM9PT45OTs6OTk8PTZAPj89PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdPPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PERSU1JYX1ZYZm1tbWmBjopxc3mKe3uAfH98iHt9fIuHg351hIZ6c3pzbYF+hX53hpuhm56UkoCMiH+Yh4Cckm6IqYV7oIx8kY6DiYScfpuRio2jop+RpK+gi5GLhYuBk4ZXcq2Ln6ubkIOZnJCPjluDopGCjZ+TlIyGiIySkoyUlZWQjI+KiJabnY+VlpKMk5SGgIyJko6Kip2XmKOihpOdlaCLiomOnZCDiI+Ag4eFpYWLkLKYnJKUl6GgnpmSm52nsrispb3Cx83Ixs/M0MzO18/R1K7W1dja2Nra19bZ2p1seXFjY1paVVFVVkNASUM/Pz46NDg6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieGxifpGDb254i3h6f3uBfYd8fHeGhYBzcIWCe3V3dnSFg4V9f5Kmop+mopeKnZCUl4uKqJdyirKNhKiShJmUhZqMo5agmJOJm56ik6mwoJGVkY6OiJaMb423hJrEyLKcoqacnJiWkbGQZKTNx5WOhoeJkJKNjZOVioWKioaWmZuPkJSTh5WYhICPi5mIjpCrl5eko4iZnpaaiI+Hl5iKhY+NgX+Hj6WIjZOomZeTlpihmJ+Zk5yaorK0paO8wb7HxsXJyMnCytPMzdSo0tHW1tbY2tTT2s5/b3tkYFtbW01IU1lCQUdEO0I+ODM3Ozw6OT42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGOfXxtfoh4en57goKDf3d2gYN8bW+Lf3t9eHh8hIeKfouis6ejq7Oil6efpaSWla6ig5G4lZKzmoyhoYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmpehwI6jybirnKOmrZiSm52ynYWGqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4eUmIaEkZCcdZGZspWWpKGHnJmSkIuQipebiYuWjoZ9jJieiZCQnJqak5iXn5OgnZSem6CxrqKjt760xcfEvcPDwMbNysnTps7M09LR1tjT0Ni6b3ZyWV5TXVROR0lNREFDRDU+Ojc3Oj88PDc9NDI2Njk3NzQ+NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdNWlxZSmZgO0iEi3p6boWGenyEeIGGgX5weHx+fW9zjXp+gnx4houJhoSSprusqLG9sKWts7Ooo6KwrIqatZ2juKWVraWXqa24p6Sjn5qpmKqkrrCqmpmdlJaRl6CYmru7rsqhara4q7CUmZ+jrJOXvqNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJWNi42WmJOdmbSWlaudipyUkY6RkoyYm4qSnpCLiZafoY2UjZiZnZKbmJ6UoaCUnJ2lr6ihpLO4rMLIxLa6vbzFx8fC0aDGyc3NxdfW0cvTn213ZVlXUFtPTkVDPjxCQUI4QDg4NT9HPTw1PDM1MzQ1NDU0QjQ5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicEpAi4p+gHOGh32CiHWDioJ/bn18fX9wd4d3joKHfI2PjIaMmanCwK+9xruztMC9tK2rs7aMqLKurb6rm7ulp625uKumpqKipKOpr7Kxqp2cpZmbmJefoqalkqS6r6nAvK2usrmlpKh+iIacrb2wgouMi5CDjoORj3qBiJCNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpePkaCRiZSbpKyUlo+TnJ2ToJ2bmJ+hlJqep6akoqOwsqbBxsOvsLq3xcTDv82mx8THxL3W0M3EyoVwb15ZV1xYTEpBS0FGRz9BQEM7OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVONzlHRD9DRlxlRmBpZ1pdXJOMjIl7h4yHg4x1h5GKgW9+e4J/cX6Be5V6kpSUmJCTlqezxsm/wczCw7nHvbuvq7m7mLO3urLBrqXApKuvvL2qrqujo56nq661sKqcoKucoZyWn6+1p4ujurq2wbysqZ2zpaSolIWOqcTDpIKLj4eIhIaVlI15g42Rj5GhjIyUko6Jl5+Yk5mVl6agr5yMq5yNlo+RkZWVjpGVko+glIaXn6CynpSZk5+gmKSemp+boJSYnqWkpqakr62lwMTDrqi3tsnDvrbPssS/xLyz0crIwrRxdWlZVVlnUUxIQkxLTEpBQT5ERDw1QUU7OzM9OEIzMzIyNjJBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGZUYmuZjZaKjIiTkIaJeYeUkIFygHuNf3iHgoKQeo2hlqiZmpm6vcfIycHSycvCzL3Cs628vqi6wL67xLeswamss7y+qrCqpKWkrK6zrba1oZ+vn6WimKOzvaqbqL3BpLa4r6yUsqysrJeHmqmmpZGCjJOlloqBdYqSeYWOkpCeoJOPk4yPjZSjmZaclZSjnqqekaWajI+Pj5WWiHyPlZOSo5qVn6KctaWQnpako6GlnZ2mmJ2Vl5qko6mnorKsqLvAw6+ls7fMv7mvxLO7vsG4rMLDwsCXanZeVVRZWEpKTElGRERIQ0NBREw6NERJOjs0PDhFLjEyMjQyQjI2U0hPPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGJaY2NWno+cjpeOnpKJin+KoJOEeIV/ln9+kIiKkYCWoZmup6SYwr3Hw8fF087Ozcu8wrewury0vcu8w8K2t7yts7+6va6vqKCpqLatrqmyt5qeraOnoZ2rt7iqpbC/xLK9ubSoq7a0rq6XlqWsqJ+RjZKyxaeWjnySlXyHkpmPqpmYk5OPkpWTpJ2TnZmToaOinJifmIuMj46diFqQl5eSl6SZZZiin7OllaGVq6upppueppaYlpiUoKSopZ+2q6m5u8O0pbS1y8C4qrarsru4rqi4ur24gGhrV1RSU01FSVJNSz9BSEVFSUhIOTVFTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKer76voca8xMTGxs7PztLKv7u2sbq7u77PtsS9uLm3s7G1s7izq6ecq6y5qqmnr7CYo6+lp6OltcCwrKy0v8O6wLq0p7q2ubSvlqWtr66ki5OUoY10wpp9l5mEjpeZjLGVm5qVkpKZmaWjlaCbl5qpnZugoJmKjY+VnGBKlpyalJqlllSWr5+vnJ+klK6tqqSaoKWTk5iYjZygp6KatKiqs7u7u6qxssfAuaasq62ysqOhsrK0pG1qYllXTU9KRE9PUFI7R0tJR0lDQz46S1U/QTo9RU0wNzU0NDpCNDRNV087SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiqlpmgoqivmZGXh4uolo6Ik4Wgh4Sdl4+doZqjpLXJtanFucLDyMrJyM3Nxr+7s665ucHBzLXHusG5tbqwr6+ztaekm6q0tKqppq2smqSupaSorLu/qKy2t7/Bv765s7LEsrm+raOvtay5poibl6abdr+fhJmdjpOamoyul6GcnJeUm6ChqJ6on5maqpqhp56YkI2RnYNudpKimpWdop2RrrKjqpSoqpepraOinqSnkZGZnIeUnaKelrGmqau5tr2ysq6+ubago6eopaacm62pqYtgYl5dTkpLRkdNSlZMPU1FTktMQkNEPFFWPUFBQkRPMTg9NzY/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5Wbop+7r5mUoIyTq5uRkpOJq42GoZ6Mo62Uo6O2xr60wLnCwsfJxcLNyMK+ubKvubTAwsq1xrLCvLW6qqitrbCjo5iqtLumqaarqp2pr6ejqqu9u6itvbW4vse8t7a4wrK+wbWqtbervqWPo5iSoqC8n4maoJmXn56Pt5+pnKWim5yhmqiks6CbnaacqKqemJWPlJuLlomMpKGUnaKdoLSvpaSSr6uZqqqcnKOiqJCUlJ+Cj56em5WppKGhs7S6tK2otbKznpyjpZqXlZiqoZ51XVpdW0hHRUZMUUlNRUdHQlNMSkJFR0FWU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoFkVDQ5LTE5ZlxGQ0OdcGJHRaeXo5+ew62cl6WYmqqclpqaj6qWlaemla2smKKrtsPDvL62wcLAx8S/zca7vbmysLmzv8LHtb+wvLe5tqakq6utoKGZqqrEoqSprKaerK+roqmpvrinrb+yuLfHtrW5uMCzwMK4tbO0r76jl6OXlJyUrp+QoqOlo6OgkL2lqZ2pq52doZulnr2hmaOfoqmsoZ2XjZWek56Hj4SNk5+koJ61rKaclbCmma+lnJmonJ6MmJSeg46gmZuSpaSal6uxtbGqpaqurJuYoKCSj5CVqJ6UZV9XX1tNSEdKTkxIRURJQT5RSUE8R0lJXFJPSz1IT1U0QkY5PkhHNUNhW0tCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1SRjxLeGVhVkuimqOcnsWsoZ6sn56uoJKjn5akoKaprJi2saKqs7bFxL2/tcDCu8jCvsrHtbi1tLGztLfBxba+sbi1ubSfp6yqrJ2enqWkwaWfqq2gpKmtr6GmqL21prG9ube2xLK0uLq/tMTBubmvs7W1o52llZKUoa6gmaKeqaiso5rCrKmerK6bm56ZpqC9oZ2kmKusrKaimo2an5KeiY5Xf5afpaGguKqnk5i0op6xn56ZrpWdjZiTnIGOn5eVjaGjlZClrbKqqaKipaWVlZ2Yi4+RkqSeiV9iWGJfS0dKSk5GRUFHSz89SkI5OUpLTl5RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtNnp6hmZ/EqKWhtKKds6eTq6Wgo5+sqaydu7CorLaxx8XBwrLDw73GxLzEybyvsLatsLSvvsS0ubGwurSsmaixqaqanaWhp8Ktm6yxm6qjrrCppam8tqe3u76vt8Sts7PDwLTHtLu4rLS2raqippaVlaSsop+gm6eqsK+vu7GmoKmpmpmYk6KjuKCho5KvsKylp5+SoZ6Vno+QjZWem6Kep7SnpoyXspuirZmcmqyPnZKVkpl/kaCVjo2foJOLpquvpKainKCekZGak4WLkY2bnX9fY1lmZElITEpTQkNASUg7O0Y/OTlPTlZeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ6jn5ygw6mkqrOipLWqlrOsp6GksqyuqbuyrbG1tMbAxMK0wMS+ycS1v8jBtKu1qK+4rL/Ds7eurba4pZiqsqurmJ+ml627tJuosJqsoK20sqirubKourS5s7jAqreyxL21x6i/r662tamnrKGYl5KmpaKimJilrriusrW2oJ+ppJqVlpSkoLeipaWWr7Kyp6qmop6ampuVl6ifoJihnq+yoqaMl62YpKuWmJ2ij5qMkpaYhZWek4uQm52TiqipqqGnoZielYuOmY+BhZSIk553YmdbamlMT05OVD5DQU5DOjpJPzc3Uk9dX1JWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJb2hVQ1dGjHlmQzujo52hpr+np6+xoqm2q566sayjq7S2sbC5t7C3uLjEvcPHvb3EwsbAuMDGwLmptqSsu63Awbe3qq2yuqKUrbGtspakp5GquaqfprCcq6CvtLOrqba2rbyttLO5t6y4scO7v7+mxKuxt6+oq6unnpiZq6GioZGYobGvs6ywuZqbqaCal5OYp6C2qaajorGxtKyzqKyfnKCgm56lnKKXnaOzr5ufkJOkmZ+omZOhnZOWiJOWkpWWnJKIkJqYlI6pqKafo5yXm5KFjpmLfYuVhI2ZaWdrYGxtV1BRW1VBQkVUQDs7SUE3OlhQZF5QV1dFWV9eTUxSTl5LSj5ZY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEtLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9p5+doqm9oqqwrKSyuaqmtrSsoK21va+zuLu6vre2wMK/ycS5xMLAv7fDvcC3rrWnq7exu72+tKmusbaelquup66XpqiOp7ufpayznquisbCzrKm2tLW+rrGytaywtLPBu8a3rL2wsbisrKqjsqaepaqgpJeRmp+zqrOrq7OanaecmpWOoaaktK6ooa2urrGotK2yqqScn6iknpWimZuotamXmZKSnZmdn52QqpyVloSUloqdmJuTio2WlpqWpqWjn52WlZeSf4+UhXuNkoKLlWRrcWZvcV5GWWdWREJNWERaOUhCNj5dUWhcT1ldR1teXU9NUlhkSkpCXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVVxnSzaMemZMQKSaoaWtt6Wsqqavrreqr7W7p6axt8W3sba9wcO1tbrEvszGucPAub65w7jAuLK0q6m6trq5vrSprbC1l5inrKmsm6urjqu+nqyusqOroLGus66ttbK5uKqurrGota+1u7zKs6q3tbG0r66mobSgm6itoKaWlpuasqOtoKavl6GkmpqTjqOlqLOqoaazraq1pa+yta+kmZ2sp5qYn5qZq7ejl5OQjpecoJeWk6qempF/kpeMnZuYlZCKlJKemaWioqCYlpKTlXqLj4V7jIqCipFqbXdtdXthRmFrWUlHWlo9e0pGRDZBYlRpW01cYUtcXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVF9UXy81KENfUVwuK0IvSkdQW0czY1lUS0SZl6GxqbKqrKakr662qbe1uqSstLfJu7S7ur+/tLO3w8DMyLzDvLa9vr+3vryxvK2nurm3tcK2qq2xt5SWpq6rqKOwqZSvu6StsbOnqKOytbGxsLWxuLSpr6yyp7evt7TExreptrassK2pp6O2oKCnsaGklZyalbGep5ygqo6po56blpimpqW4qKOytayosaeusbWspZmgrKibnJ6clKm4nJSOjoqXm6KXj5ekoJyTgpCUj5ybl5aViJaQmJqnnKSgkZaRkJV2hI+He4SBg4uKbG92dHt+XExmbVxKTmNcPmJ7R0k4R2dXZlxMXmJNWFlXVVdUaV1PT0hgXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2YyNydHYkxWJS1CLj1FTFE8M3JrSUNDkZmlr6Wur6uopbGztKu3srihq7W5ybmtwbvCuLOxtcLCzsXAwb20vb++ur68ssOnqbmwtbW/vK6ssrGboKexraamr6WdsrWtq7GyrKmotbustLK1rbStqqyorKm4rbKwyMC5pbqwqayspaiusaalo6+kqZyenZuwmqOjo6ORrZ+koKCiq6anuaWstralq6yprbC2rqKeo6mqm6Cbm5KktJmOio2HkKGglIyUnJ+SkIONkpKcmpeVlIeXkpWZp5ufnoySkY2Qdn2NhXx7fIWIiHBycX18fVxTZG9eTlhmXEZElltHO05tWGJbTGBiTlZXVldUWGddUVJMY1lbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6SD4zQkhTLD6QaztHSI+cqquiqrGkqaWztbK1trKyoauuvcy6rcC6x7G0rbTBw9HFxr7Asr7Awru+t7vEpqy2q7K3u8Cvq7Gsn6OnramopLCjqrKqsKywr7Cuq7O9p7awsqmzqqulpaOtuq2qssO6tq27qamnrKmnsaWqpKOuqqiin5yjrZWlnpiemaydoqepoq2mpK2ruLOyoqqioKyvsayeoKenqZmjmZmPoKaXhoSOioueoI6KjJWajo2EhY+Un5yUl5WGlpSTl6SbnJyKkpCNiX9+h4V8dn6Fg4VycXCIdWtfWmBuYlFycFxLO4R8Rj9YdVhgWk5kW05WVlVXUVxhXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnREY4O0IwNUVLWDFAlVk9TEWVmK2ooquznKqqsLetuLavq6arq73JvLC9tsKvsauzw8POz8O+v7TAwcO5v7PHw6qutq2yuL6+sq2tqqSnqrCop6ixpbSuq7GvrrKxtKy0vKS3s6ysr6irn6OesLerqq26t6W3tqSqp6uqqq2hqaemsbKkp6WhoayXqqGVm6CmnqWiq6Sto5+nsbiurqSmo5uqq66pnaKlpKSYn5uWj5ickoGCkImEnJ+Lio6LmI2OiYKLl6KbkJCbjJOSkZOjmZuZio6Li32GgYGDenN/gn98cnWLpId4a19gbmZXZIZjTj9nk0xFYnlXYlhSZVRNVlVWVE9cXWFVS05oVlZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZaLjBKZ0FBPDxCKzpKT140RIY9R0ZEl5OwpqOrsZirqq22rLayrKasqqm8wMC3uLK7taWyr8PJy9G/wLu5v77BuMG5wMSssbSxs7q/vbKwrqyqq6i2qaaur6q5sKiysq+zrbequLimtLarrKWpqpyjnrOzqaiktLSgt66gqqiqqKunoKusqbm1qqqpqaKqoK2bkqqhnaCloqajqp+dp7Svqaero6OYpaenqpyipKOgmZigkY6PmI1+h42HhJ2dhoOJiY6NjouChZSimo2NmpGSkY+Tn5eYloyKg390hoF/gHh0gn54dn2Ah52Pb3JnZnB3XGByh2pPXplWSG55VWRWUWNPTVZUVVBPWFtiVUhPaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EPJaOsaKmq6+arKWtsLS1sKymsKqour67wLCtua6htq/Ix8jRwL69u7vBvbrCv76/rbGxsbW8u8KxsbOqs6mktKilrbOzubCjrriysLO7rLqwqq62rKqfqqyfo6C2ramhn7CzorWqnqinqaOqoaKsrai9r6yuraKoqJ+smZCwoZiioaion6icmaqxqqOgrqKhlKOjo6eYmqilmJeYno+Kh5SIfY2GhISjloSBgYqGjoyQg4OTn5aIkZyQk5GNkZyUl4+KhoZ3dIF/fHV4eX95cnJ4Zn+GpHZpX2RpgHRmiIt8U1hvXkp4c1NkU1FeTU1SWmZOTVZZZFhHUmhSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQDSRkLOhpaetpKekrae1s7KrpbGnqri+wLuvp7mqpq+xycfI0cO8v764vb68yLrAt6+vs7G5u7jAsrK6rLisorSnqKyytrmzqKi9tq63vrC+p62staytnKmvo6ClrauonJ6rs6W0qJqrp6mjqJ2jqaipvqu0sK6dqqShr5ybs6OWpJylpqClnJupq6afnKuinJOcoqWemJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2Lh5GNj4N/k5qThZOhjJSRi5GbkpWHiX5/cnt6fnxoeHx5c25ve2aEeISJZGFnYHKEemxmeF1eVD9Xe21UYlBRWEtMTnJ1XUhaW2dZRVVlUEQ+Sk9EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mYkFKN0dTYFUqPTlEVz0qkJWymqCgqqaloauluLOzpqmxpqy4wb21r6K4raiosMLJyczBtr3AtLe/usi1wrSysrSxvLi5vbWtubW+raCzp6ursLa4tayfvr2qs8G0vKGvs7WqrJ+tsKOcpqmqpJ6bpbCnsKCfq6mnoamcpKihrbyorrGuoaujpK+en62ml5+boaSdn5yapKujnJulpZaXlaCjl5uXpayMnpGRkYuCioCAjoB7mZSMiHt9i4aPjYuJhJKYkIaUo4mTkoeRmpCTgYh9eWt+dnl4Y3x6cG5vcXZnf3NphGhlZ15sc41sYGlvYG89WnlsVV5OUFFKSU1UWldNXV5sV0RXX09eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBaFkxNFM9ZV9ETDZLVmRPKjsxTlc9I5SZrZqhmKilpKCopLiwr6SvsKmruMG5sq2fua+rqLS6yMvIv7bCvq+0vbfEtsKxrbmxs8C0ur23qLm4vaqjtKipqrGuubGrnLy9pbDBtreir7a1p6ansLOfnqSmqKKlmZ+sqKmeoKuupqCmmKOooLG5n6Oxr6Gsoa2knKemqZqam5+llp2dm56qp5ecoaqTmZSZn5OZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo6JlZ6IkZWCi5aNkXyFfHNwfXF0dGB6eGhtb29taH1xYnttaWViXGSEfl5Zc2pxSkl/aVhaTVBMSkhQUlFJT11fblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+L1dVNSiXnqeanZetoaGhpaG4q7KltLSpqLnEtbKtn7etrq2wtMbIwLa+wbmwtLy2vru+r6q9sLS/sLzDuai7urenp7WpqKyxrbSxqJy/uKauvbeyn7G3sKmlp6+xm6GkoKWloJebsKehnqOor6GfoZOkpKK3sKGmsaufrKOvmJyqpKmfl5qepZSbnZuep6uanJ6ml5aYlp6Ok5eiqKKQiYuPhnqEfoSKeo+WiY2GeIGHg4eLjYWNk5iNj5aZio+XfoaXjI95gXpwcndvb3RfeXdkamtqZ2eCbGVya2tkZ1dhcn9eWWt1aVlFfV5bWE9PS0hIUlVHMjpfXm1QRFdVWWVNSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJmW0hUQ1RdaEUuOzFeUSwylqSjmJadqp6moaOhuKqwobu4pay9xLKvrqK1r62tr7TExL2zvrq3sLO5uLq4uq2tv7O0uK6/wbervbq0paKzq6iqs6yusqSdw7emqri3rJ+yvKqnpaivq5mjp5ylppSYobOmmZ6lqamcoZ+UpZ+kuaikp62mnqWhqZOfqaGhoZmbnqGTm52XoaOsnJybo5aTlZabjpOTo6ekkIiKjoZ5hHyFhn2cjYmKhniAg4eIh5GFlJOSjJGVlI2OlHuDl4+Kd398bHVybWxzYnl0Z2ZpZmNthGZnaGRmZ2hdZGJpZVplemJgUHNUW1tTS0lHSU9TQCAqal5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YUwnMp+kpZOPpqecn56epLatqKq6t6esw8C2r6yita6nr6+3wcC9scG3sK6ytrW5uLWsqryzr7KxvcC3rry8saSftqymprWqq6+hoMWsqqiytayttbqeqKqrsaWYnaqep6WSmaWto5idpKqhm6Gcl6Cdp7alr6qtoaGenaKVoKafoqCZnJuck5qelaafrqOYmJ+WlY6VmIyPmJqnoJCHioqIeIV3goKCnIeKgoh7foWIhoSQhJaVj4+QkZCRjZJ7g5WOhXN/fWd5cGxrbGd1c2thZ2Nic39hY2VmZWhoYWVuWV1YXGxjYUxnV1tgVklHSEtNUlg+OWBsaUhCVVNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGJGJTWdpKGSja6hmpmgl6W0sqOyvrehsca8ubCwo7asq6+pub69u63Asq+vrraus7myp6u5sa+us7a7tq+5vqylnrWroKKypauwn6bFobOmsLOwt661nqyvrK6imZ2nqqWelZunpqCZpaOpnJqfm5Wdna2wprmnrqKhmpqemZ+jmqWdl5+Ym5WaoZOql62pnJWenZSNlZqOlZSYp6eNjIqJjnuBdIKCi5iFhnyIiISFioyIkoWUnJKRkJCRl4+Qf4GNjoJvgn9neW5obGpncXJrW2hjYXJ/YGRnam5rZWllY2xcbGx1cGFTYmhjZVpJR0xNT1lRUFVhZYFUQFZSWlRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjQ8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUhiQic0lKOcj4+xnZyUoZups7CfuMC2oLTCu725saa2sKmupbi6uLisu7Ctq6u3qrW5raSytbGvqbG2trGztrunqaC2qp6gqqOqrp2sxJmvprCxt7atrJ6xra+qopudpKypm5WcpqSdmqqjpZaaoJySnKOrqqm6nqakoJeamp6hj2ujlpmdcYOXnKWBdpKsqZ+Wl6KSipiZgJeKn454hZKNg21pfneEcWyGioZ9hIqGb11kYGeEmIZri5CUknV4i4R/g5B/ZoiAaHZpZlhcaXRuTlBqY2Zxg2ZdZGZua2hdW12JkIWHaE5LQzhFVGdeSkhQUFVWS0hSYXB0ZUZbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOW0tbZmI+RzFOYTwrL46kmoiWspudlKGcqq6so73Fr6m3wri+vK2nt7Gmq6S4tLOzsLmuqqestKWxtaKnuLa1qKettrOutK60oqmftKueo6Wdp6ibsL+VqKextLmtrqSoraurpaGfnKGop5uYoaWmnJynqJ2TnqCZkJ+oqqO0r6Oio5yWmJmXo4ihj5KaiKGIlZ+if6WAqK2flJSelImEcniMjoOIoHWHjWmXiWZ+c3igb4eHhH6MfH+hoJ+Zf3yInnSIjnabimyHgoNtaGRke21yYlSGbWNtaZhxWGlwboZXXWhaa2paiHBseXKHaIeEWV5GTj5GXk1FUlZWUVBSV1RnXkxaTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTltMW2dfPUsxVF43LyiNp5iEnaydmpqdn6uqqKq+w66yury3wb+qpLixqqyms7Wur7O2q6mlsa2ltrObrLW2tKanqLOxrbKorp6robOqoKWlm6KlnrG4laanp7e+pqynqaqsp6Whn5mhqKOZmaejpJicpaqWk6OclJOkpqahtqSjn6OYlZSYlJyIrpCYlYqqjJmjnYaxgaWun5WboZd6gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsXlobFixrm9labySvG5oem1xj9h9UmtitrJ9f3CUdZqhqpBWTlhhT1ZORlVcWFBQU4tbV1tQQFxEUE5DRkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV1nXD5MMVpbNDEhj6eUgaiqn5idnqWtsqqwwr2ytcC1uL/Cq6a0rq6pqLC1qq+2tKioprWlqLmunLKytqqlpKeyr66xpquep6WzpaKioJecoqCyr5afpKG1uqOqqKGtraSinZqao6mgmJypoJ+XnqiokZynm5SeoqejobCjnp+jlpeTmJKZha9raouOqn9ohZaHrWZxn56Vm6mXca6hpH53unxroI92sV9qtFulgGWckGBmgXpmf2l4aqllvnJnpox2sWp8sXh1kZRjbW2nblyEoEVpZ4eWRXWcYH1me6OmgVhfi6tofY94emqoOEqvW1hUbWNaS09YX1xWVjtOh1BXVi9JU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWDMxG5KilYOtp6afo6WrsrittL2+sLfFsri7w6epsKywqaqxr6SwurClpa+zo6q5qZ2ysrCjpaGqrbCsr6aooKOisZyknpmWmZ2esKmYnKKgtbOhq5uhra2fnZmXoaOpnZmepaCcmaGnpJCdo5qXoaCsn6amoJqfoZaVkZeRmoa1m7V5hqmatpl3h7Obt3+Ul5isl39rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iXCOhoB/iJCXeIOCipeMg6CPhbB2d59xa2ttfItPpVhIY2OZfmNopV95cXVSkoZdUKluY3B7hYBhnS9Som5bVGtnYExLXGRYXFpCPrB3V1hBI01pRkJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVQ1MByXoJSJs6amoa6pqLOsqru2wrC8w625t8Krra2vr6ivs6qir7yroqi2raSstaSlsrOoo6Kdp6qzqbCopp+goLCXoJuWlpeboLCknJukqLWvoaiPqaeqm52WmKGmqZqfnaOgnKCjpaOWm56Ymp6jq5ymmpyaoqCWk5KUk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKOnY2ke42GooGlgnmreY+dVq97iX6farlauXeGhH2mgpR8mXqqeY6dkHuxbY6EdJC7hm+VUK+nxYpRoHpjYKpic3KGa5aHXlK1tMiFfoh8Y6QzQp11XVBqaGRQQFhmWWRhSkdMakpaU09ZZlpDQz9FPzA8PDU5PDc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbGoqaWzqqW1qKS8t8GwusCyt7W9tLaosrGksrOnoK+2qZuouq6ksLGhsrSxoaSenqipsam0qaacnp+smJmZmJiWmKOun5yXqK2xqaOej6yip5Wdl5yhpqGYoqGioZuioqicn6CelJmbp6Gcp5Wbm5+gmJCSlZCdiLJuaLVyrIhwj6dytHV0tnucmaaOkJ2No36PnqN+sHWCkNLSdVyufIV/pG6bqqZqhoV9rX2YmZB7sXOTnY95s2WWdIWebp9mlFLJi1rCXJ95Yl+tX3ZzhWGWiF1Zyp1vwIB0TUu1U1XGZFVRamNlWEFPal9saVBVRkg5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqOekaWvraWpu62mtaWntru8sru/uLe1vLy0prW1o7Oyo6CssKWYp7uupbKxnbS4qqClnaGqpbKorKqlmp2bqp+WlpmZk5Skq6KYk6arsaahlZKrn6WSlKGcpaeglZump6Kbo5+umqCenpCWnKOfnaWUnZWZop6VmZaTm4WsfHiod6OPi4eqcK6LhKiEmpqji5Oai6J9kpeHroR/gbNccrJTr32CgqN+cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52doZnl4hqXa93lZ+Pd2w1ecius19DVG9eZ2BFUGxfcG1WVU0uZWNoUllQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdCYEk6NzegnZSgt7GZs8GtqLKnqrK6uLS5vrm4s7e+tqa5taG2rqCgqayflai2rKixsquttKSbqaCgqKK1p6aqpJqelqWilJSdmpKWpKiclJCnrbCloJSZqJ+ij5GimqmmoZWapqmenaSfrZ2gnaCNlJ+cn6GZmJyWl6GglJiRp56HqX5/pnmhj5CEqnCtjYOnhpeho4qYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKeBjpuNkqR8lZCfhHuyXpxkoH2ClW6TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZE9KQ6FcWk10XWJmTVphX3J0X0pVNUqakVhIRT1HRUFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxPZWRBJlVmWz8xVF9iTDdGSF9DMT03op2amr6tmLPBrqusqKa0sLixtb+5urOyubyqu7ahsqWfpqennpOrsqmwqratqq+hmKKgpqSkuqOjrKGXnJKjoJaVn5uVmaGhkY6MqbCwpp2Wmqemn42SpJioq6iVmKmon5+gpK2joJ6hjpWhmaCgkpyXnJWdoZWXj6ycj65ucrR0qYx3i6Z0tHp1tIKUp6STnY2JpIeOdbhui3uLomtrtlqhhmWXl2igoqdtlHK0c5OZf7NqhZKIrWp1tGGdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdlVG9uLlunT2JSa2VibFliXGBwfGNTWVE+P2xvMkJCQD5NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFBOKWanJ66o5yxwK6uq6unt6m4r7XBtb2ysbu4rMK3qqyhnaekop2Sq6uotqOzqK6qoZedqKClq7ido66clpmQpqOXjp6hnJmen5GTlau2sKaYk5usqZaMk6aapa2jkZersqSgnqissJihopCZoZegm5abl6GTnKmdlJCrmYfUlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsKCmrJhg7p5wHx1uGK1gYyHqX2WgqypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gYptmohwbY2kdL1dd31bYXm8alpWW2l5XmlgZGZibXlvWFtZQ0FAcT9DRys0SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTxMWy02QDmnmp+ivKOXsMOvraqqrLGoua+3xbG7s6+8sK7Bsq2mo5+kopyckaulqrKltaetpJ+WmquZp624naOumZWhkKagk46do5+Zn5qQlpOvubGrlZajp6aUkJalnaStn5GgqKufnJ+ppLKdoqSOpqGVoZmblpWkmZCwoJKVqp+FkJm2gJKSjbiWeIOTm7Z3bmxvdG95j4SOiXKewLu8mnuBsqhwgHSRuYN8hoaKh417i4aNl32ku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycXe2jF5/eX2IZ4N5bHlii6xwdIV+WFunaURkWVRmX2NdY1FnZnFtdUJNT0xEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlbLCs6uqqKyrqruvscavtbSwuKe1ua6rpKKnn6CdmZStpa6qp7aoqJ+clqGknqylvqehqpeVnJGim5KQoqiik56XkpiUsrW2rJido6Sii5OSppymq52WqaWmnJuhqaenoqigkayel6Kel5aYnZ6PsKmUnKeij2t/apypeYl0f5uPdntmiHu9vsC6b5KDcZSFX3JqWl6biWFjh4+WbGB/lGNtnHZilWuAmpWUZV5gY3GaiWhyjHyGlGZqfnB0eH59Ylt4dIFoUFxuhHx8i2pXbHqBcklKb4VwTnJNRFZcZmBMWldmY19PWm12anJST0RETTxISTxMPjIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPlxPJz8yPqifqKHBpJm0ubajrKaup6i1sqzIrLC0rbakvrKzqKGkqp6jnJqarKeupKW1qqSbmJWinKetqb6oqaWVlJuWoJqTmaapqJGfkI+YnLCyvqyapp2noomTkqmbqKScnKyfo5qco6etop+poZmum5SmoJeUnp+dmLGlmaKomZ2Sn52kppuopJudmpybkZeCaG59cneRl5SQhIm0qo2FmJWPioyYl4iUlYmDk5OQiY2SlJmTmZean6Gam5Sfm42CeqSFbGl7kH2AdYmLgnKCeHl2doqAfIlqc4F0g3Vkd312a295bF9iW29nTVhZZmpfV1lwem9tZlNPRlM5UFpOUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsLG3oKqms6elsLWqyautsqa1psCptKGfpaacpZaWoaunraOkt6ygmZeWoJitqqbBn6yklpKcl5+YlJWjn56jqJOQmKiossOvmaqcqp6PlpapnqucnqGtmKGbnaKlr6ahpKeerJiWpZ2ZmaGenp2woZ2ip5aZlJqUoaOXpKCZoY6XlYuLjpCYro98lZuCkYGJqaiFgJiWi4SOn4h7hJGGhZqRh4aKlY+bl46QmJ6jlpmSkJyNf41lobOuhImEd3uQin53eXpvZ3mRgYGJa3WBeYhyaHN/eXWDhoFqdGJ4ZV9oZGNkZmpYa3txamtcU0xQRF9VRkA+Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r76tqq2xsqCqprKtoqyzsMWwq62ks6+8pLScoaijoZ6al6imqaakprO1npWVnpqasKauvqGsopGRnpqalJKWopyXqZ2Enamro7THs5+po6qWlpiap56pnKClq5Sfn52fqq6opKKroKuanp+hmKSenJ+dsKSZn6mUmZmek6abmaqfnJdmhJN9ZX+Pm5BjeYxsaGp6kKOramWamH5nhYtlZWloeo2ijmtojJiRo3hraouZo5+Yc2xueoSMhnlYZV2FgV5si4qCd1xnc3d3koCIgm93gnh/c215hHN2iIeNgnpohFhdanNkXXOIaWt8cW1jXVFOVklkWEBJMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSi42Wk82KUVZL0RPMVlCOz8uPaSeur25r6uzsKulqK2usKaurrC9saqopa6wsKCtl6GknqKamqesnK2kpqips66elqSQo7CmtrmlrqOPj5qimpOSm6CZmaaWe6Sroqi0w7eloaavnp2VnqOeo52kqqiSn6GeoKqvqqmiqp6mm6Wep6CrlqGcpbGkl52slqKfm5SmmaCsmZ9+vYSJc7RzhZ+GrWh3ucS4cZKho3qmmJl0q4J9y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXyBepGMmsLAfWqlsm+NgW/Ken+beJKEj4B2eYGAeXF7gIZwd4WLknhsdZFiZV53Y19lgGJedGhtZGJYS1VJUVlIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fYGFfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziVornDtK+vv6mplKOwqbCvraaytq+qpqemsaugq5ibo6Ccm6qnop2so6WopaW0pJ6jk6aurbi0p6+ikpGZnaaTkaChmJugnoimq6Srrb+/saCor6mWkZ+dopmjpKqjk6Chnp2srqiqpaOhpJ+jpJytqZGkm6muqpyeq52uo5eYppeipJidf86UenulgnqWl5tfrY9djqiAoaF8p5WbdauDga9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq1Zo81ukHZ723t/mXF+iJN2f2V7iHV2bH6HbX2Fj5B9a4CMX3Bqb2ZgX3hkW3FoamRmYFJUU1deSk9DNUFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xfX19eXV1fYGBfX11bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrMHAv7S0sLeYnpGjqqmttaymsq2srKSsprCqoaecmqaYnKKvn6GfqKejpqGfsKybnpamrq2xq6isoJSSm5+lk5CfpZedqKOeraOqsKi/xbKnqbGtlpKenKKXoaqqn5Whnp2cra6mqaibpaWioKqSrLOWpaKqqp6kp6eisqKTm6ecoZyWlZGXoXKGjJh2hqiHcbF8nXGsfaCggaWPnnirgn6tf51yrX+sh4afdpiSe3yXfqqIooyRi5x9q3qIko+ff3qtVpzEe5Bwk8F9gZVtdXCMbWZ3ZYZvYXhucm6IiY+Og2yPjWNtc3VvYGZtZF9vaWpuZmNXU1xgWlJSQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txseys5+do4+joqKtr7evqbGnqKqorqurp6KknZqjlZ+mq6CipqCoqKOfnrCtmJuWqKevrainqZ6XlZqkopKUoa2anaejr6yirLWpucyxrKatq5aUnJ2imZ+urJ2WoZmenqmxp6iom6qno6Gqmq+xoqirrqaap6urq7Okk5ikp5yWk4Wka6R1inqpdXuycYKlipiMcIigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoGjfal/gZSGrl57qFWdopKBe6OfgHzEsMWMc6+0s7lyYqmvwnVoi4uWjYBrl5Bta3h4d25rZmRkcXFme2ljXFZfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLSwsKmto6enqqurqKSmoJuln52mp6aknayaoqyho5+vo56bk6qktbCvoambnJaVp6SRm6Kon6CmnLCloqixrLbHsbSoq6mVkZ2dopmgpbOdmqGUnJ6nqqqirZqqpqChqaKyrKGqs7KinKupsbC4pZSXpamanZN9qm2fhIh2q3l8sG6CpIuJn5aVnpaB0ri0uMmBgrJfYZSpg6WIh6B6mJaaearJdJqjlKipkJKajH6aiZrGxndloYKlc4GfjoJ9r19vtWOxdUujhm2nR4OTZI6Pm5F7b5SPfG15dHx6bVtlanJxZoBpXmFYY21cXllJTExKRURCQT1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKuraainbO5rKuhpZuopqqsqaagpqWYq6Ofr6ydpqGtmp+ppZ2ntaCjmJSoq7azrJymnKCWkKatkpqcp6OgqqeuoaOnqbCzwbGyqaynlImYnaWboqSvppeilZicpaWpma6cq6WknaujtqyhsbmwnpywqLS0taaWmamlnKGQg55Od5qCgJ96hKN8gqSEhqafnJ+UhLh8fHq5gn/MxsO2d5uikYuffpmXl4p2n5eKpJikqH6vhZuDnoSsfZmUYaVso3CPhZCBfZaEcqxgpHNxgJphvH1SVXWNkaGVenyQjodyeXKEfm9bbG53cmqBblpjX2huYmRdTExRU0FIR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Kss7Wmn6GVpa+urqinnqWlmqSnobOuoqmns6CaqaSUo7Wjo5WXoam1uaSco52jk5Cispmem6aloaKvrZykqKK1scOwramsqZGGkZynnaOknKWXnpiYmaWjp5itoauipJeupbusore2rp6etrS6s7WomqCxo6agiJDStcO3eoeOhZGTj4CmeJSid4yhkoWlg4tyq4eGtG5yaZmknZWJn32XmYeHkHOugqWbo42mipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJycn6fYnOyuGh3jpKkl3yJio+IdXt4jYFsaHdpeHNuf3RcZGRtbWZoYEpaV1g8SEY/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK62oqKZlaOqp62pqpmlop+moKC1pqKpp7GklKujj6StpJ2QmpqqtLSknaWcqZKUl6+goJ6mo5ynnLWZoKqjtarCr6iqqKGMhI+coqGmo5WampyYmpimo6WXqaeroKObrKa8rJW9sK2fo7G1u622qZ6rtKaqmnyokX18sHiLgKSliJxtsm+hh618oo+DqJeagayJhq2FoJSooKOXhZ+BmZaBe5J+q4GdmZaLq3edoI+Ik5J/ea9do4F8pqdknoB8l3Vqrl2lbHKFmV1gW4ygbZSPpJeBkoqTiHd5gZZ+aWx+Yn10bX95X2dlcG9nZ2hCWV9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JODE1Mi4qLEFUVlZWVVRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKbhKnGw7fBtJ+araCuuaajjpqjpKCvrqmfo56drZieuaCjq6GwqpquoZGqqaWWipqQrbGsp6Com62YmY+toqGepaGZpJytl5+opbaovq6kqaOfjICOm5ugpp6SlJmblJmZpaOimKerqqGinqinvKSXw62ro6KttLytsKmjtrGrrZp3r36Ri5yFh3y6rYmYZLCMZZaufaGQhKeXnIKti4WwhqeapKKikYWgXGxrgrNgf618e4KBsmxmbpmXi4ixWn20W6SDa8iiZp+BfLtZdrVasn1Tr4F6rFiAoW2XjaaYiJSNkpN4d4ybfWNzfGKDd3SAfGFqZm9tZmVlT1VjXEFUXT1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdXWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vru0wbOjnK2mpbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVrqiijombjq+sqaejqJquk5qPqZqhnaWfmaOipZieoqixqLuupKienY99i5uWoaCZkJGanJGZl6ien5enraWjpKKkqbqeoManpqmhrLa3rrCpob+wsLCYgqqSo6+Om4CGpJeYkICAuMO6hI+dk4WomZ2DrIuDr4qonJumq5F+1b3CqmKkv719f6OCg9e6t7WElJKCnr2+hGqjgW+rhG6df3qysceDa6uxvax5eKK+u3SAlYykmY2YjZOZd3+PmXlifHlkjGZ4gXtga2VqamJQYltTaVxAVGBCTCk8OjQvHx8kHiUyIBwkKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0scC5sr2zop2up6azpp2Ml6W/qbavp6G/pqaxm56xnLmon66vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp2nm5qgqKKYnaCrrKm4rKejmpeTe4iZkqabk4+QmJmOl5OomJ6WqKieqKagoqq6nqnFo6GwpKy0tqyyrKO/q7KynHV2qqW3hWWKoHBnrJCKj25ud6WQm6CCdrGbl3CRjnKXqaSbmK+kcmxtbWaLeG9tg5lxgXppcGlniZaVl3FoaYWGZ3GGZF2KY2lvWl1nfnimYGJykJNwZmSAjZKNoJWVl42SmnqFjZN0ZIZ3Z4xqeH55ZGxjZmxiSmVXSmtZOlBkRFAnSjkrIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6ubK0qqmirp+ks6qZkr2xw8e8tKmev6uso6Cnq6C6o6SurK2mjpatqpCMhZWWrZ+mqqKfpKOgkYulkqaZqZmWo6mglpylpaauuaqsmZqTknuEl46ml46RkJeUjZeUppOdlqeima+lnaKruZ+wwailtKetsbOssK6qvKexu5iMoqmmtpyJl6OYhqmbkJSdkqq0mpykraK0mKSjn6KjnqKlopasp4ySk42Hk52dlZCZk5iQjZWEf6Sal5WOi5OSipCHhH5njIF0g3d0h4xxp219lpOUlIGBj4+OjZuRnZOUk52AhZKLcGiPdm+Jd3Z8eWlsZWRvY1VhWEBpWkdiX01YK0U9KyYhNjQwLx8cICUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbevrqKwpa2goLaxkY6qxLzDubapoaSdm6WdsKikt6edqbWnqJGYrKOLiImPnKeWraShmqien5OVpJeomqmZlKago4+ap5igtLmnqpiakI18gZWMoZSLlZGVkI+Sl6SOnZionpq0o5ymq7eor8KvpLinsLCyr6ustr2jssCak6ekprWikp2nn42pn42Sn6KtsZuipLOrs5qmo56mrKCfnp2XrZ6TmqKclJCXq5mNmJmXkJaekYegnpSUhpOMj42VjIF/Zo2IdYh3eomEdJxqiJKWlZKJfYyWkZCWkJ6QmZKdgYaWhXhxlHJ5iX9xe35qb2RfcGlgXF9ZbWJQYGJPWDlGRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7CzrK6jqaetoKi1qpCPm6Oyua2qq6GimXqcobCkprGpl5y4pqOUmKmcjoaKiZuikK+epJaooKGSl5mcrourlo+omaeMmKiOnbi1o6WYm42JeYKUjJuTipWRk5CNkZahi5ydp5ydt6J/g661orCwdaS/pLOheXuirbW/l3iwpqGKgKp/ZFxid6COpJ6Dln5tlLWdpKmwrKVmoKGUdHqbmHCBmaqZbH+kqYplnKWckZeYl4uSm5CEnZuQlIOTh46OkoqFeGuQiHaHcXyGgYFhaYmMlZOMW3aVkWdnjoxxeaGVlWR4l4WAdpdogomCbnl/a3BlX3Zva2tnXGVjYWFtUVk9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHR0lLTFRVVVldYGhmZ1hRSTxERzw5VVJbYGFiYF5fX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqWprqOnraWSlaq0rrClmamlqpdzi5yvoKirp5SXuaCgj5yknpF+iIiano2smqSVp6KejpeSnoV1ro+IppqokZajiJu5s6egmJiLiXV3k42Wk4qTkJCUjI+Tn42ZnqWYm7GVgIybtZ20jJKPvaiifqeje6WxuoOOj6ifhIyGj7Gpr4yKlqKaeYCLrIadnqOpq6mJloead6ace4icgZing4F7nbN7ioagmJmUmJaBkJaWg5maYnmIkYSOj5KLhG5xkIh6gnGBgYaAh3SIhZeTeJZok3SgmnN7mYKcmYSYfpGIgYKYaYyMhGp4e3FwZ2V4bmlsalxkaWlkcVpcR1NLUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaWZZUUg5REw8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpJ+mrq6rqK2gqbGnp6qlmZOsxLyvoJSlp7Sdj4OcrJynoqCNkL6emY2fmqGRfYaPmJeIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqSjoVwdZCJlZCKlI+Om4uOkZ6QlZ6jlJ2rh5+0ibSarovKiKuvireFjbCEs7KGqY6pmY2dfKiPcnt3nI6mlmiVpHm0jKGgqKqTmcKCgKuJmaFynoCbpX2XhZWzgaF9oZOfj5iYgI6UnImYkot8hZSGjZWTioRudJKGgHtzh4GEfYV1hoOYgY/FZoCph4+iap2BnpeAmYCKjIOImG+NkoRnd3R7dmdodXBnaGteYm5sZmpXZEVcUEwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQElkWF1jZmhnYmJiYmNjX19iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6OgsKmpqKasoKW5saqrppqUnqGkqaGUo6m1oq9/oKedpZ6diZS9mpONoJKdkHmDlpWRiKuZnJuaooWPjHabm46gkYieo5uWmJeGorispZmbjIx/Ym2Pi5OQjY+LjJeLj5GejZKeoJigp36hp4etnaCWrpCgnp2Rh4Khja2yiKSOrJuMmn6idoCZlGuBq3VNq3iHjZ2TnKqpgqqrfoShfHunap6Ak2xnl4aYt4mefm5gY1iDl3+Ne2Rni3OZfXmXbFx8l25gU3GFXGBteoRgWWWCfoWBmXGoq2uDo25ypW+fgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbnRxampvXWlvbGpnV2ZNXFdFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpbXV9XXl9jdWBNRTpNTk1UYlxbZmZpaWJiZGJkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJeeoLmhqqSmrJKitr2rr6KZlp6gpaurn5yttKGnkaCfoKecmY6ZtJmQi56MlYt1gZSRjYqmlpaYnp9+k4WFrKOHnJGKmKiYmZmRh6WvpqKVmYeJgGluiIiLjo6Jio2Ri4+RoYuSnZ+aoaV/k4GPo6GUoHeclpCng6OpgIassIeleox+hJp9onBzk4eVe56MeW2HnIyakpyqnI+HnX2DonR3pmeefnelXph7fZNzom6Yt7S6c5OIgYC2qGSBxrh8cZW2jHGAm6NjdKyrYX5qnbN+bn6Ig4+DjJhxgKNscqNynoJ+o16cmbOWb3uXnrN0cluesoJpYnB0dXFob1hqa3FwZFtmXGFLRD1ENVFBWXAyPFJHX0pSPTwzOTU6OjZDPDtASVA/VE5OUUBFX15bWVhgYHtkSUM4TFdVVmNhWmZma2tiYmVhZGNgYWJgZGNfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi2ra2gmqGboqOkrJqasayrkpegmaGlmZqUnqybi4mReIuFcYCWjYqPoZCTlJ2XfZGKjqighpiPipKik5uajIqop6Sej5aHhH5re4d/fY+Ng4uQkImOk5+BlZufm6Cfi4l3nJiijaByoYyJqYmdqJGYqq6Brox+eqCZeaOTeIBzl4iMnH2Vn4ebjpqdqIijZKF+ipaQm41tnmibjm+amXuAiqd9cmh0qoOeg3OqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxfp3Z3ioqAnWiadYeTkpiNfp5tmZBqpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGl3d2FeY1ZhQVBFTzdWQlJtNEpaWl5OWkRAMTUxOzs3SD86Q0hVP1lTWF0+RGJdVmBRYWN8aUVCOU5bXVhkZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mWnYmqtpyoiWOVnKy7srCsnaWbmqefnayZnbCnqp2Xo5qioJmWlqCjmYaJjWmIgHJ7l4eMlpaEkpSYj3qLhJaknImVkIaLnZGcm4iPqKGfmouQioCAaYGGeX+XjHuIjY6HjpWZfZKhnqChk5hyaJ+KoI+McJKNg6mJmqGlqqOqfrCtpKK4l3ajs6Kjf4iUeJ16qpl/oo+fnZmJmHKhfYeNsLV9bJqRoXh+mbWjo6uohJl8mnycmn90qlpdb3uXjHieYk1/e3uFZHqYQk2fWaJqc3yOb4KKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B9fW5lX2tndXpiYl5PXVZcVFZAWUVQZkRSVlxhWF5JRD1COD9BOkhFOExFWEFXUlpWRUZhXFpgS2BtfXFFQzxVXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGxplJ2Bsa6ahFNfoae0urOzqZqii5qpm5unkqCro6Cnj56dnZqZlZihnZaHh4l3hYFueZWEkJuLfZGTlohygYmSoZtykpCBiJiUn5qEjqibmZWKiop8g2yEhXGCoYx4hIyIhpGYlHuRop+eo4iuhn21hI+enXumlnqpgpeekYyjoH+naHhufplzoHNxfJ2FmG+Tgq18pISnn5uDpHBeqWh2o2RwpmGd0498e5l4cnNjooaQfqJyo5B2a5Czi2CCmIp0qrKovH93g25/v6aqtF6cb39yl3CCc6JyXqRndKZgaKZsmtOYeoKbbnZ5l2ubeXaXcmyppWdfZHlxf4RsaGZjbXV2Zl5gUVplUFFhSFZJVF9XU1tkaltlUEVDS0xKS0FKRDhQQFBNWFNYT1NRYGVlaVNkeHl3SUZFY11lWmhpU2loam5jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7GsVF1Lf6qwsrWws6KcmISXpqCgooykp5+WqImZmJmUmZOSoJeOiIV7cH2EaHyPg5OagneRjo+KcICGj5OSbJiUfIiRkqOVg42pmZOSioSJeYN2iIBugZ+Gd4CRhYeYoJV5kqGjmZ+Js6Gitot6rKekrqVwqYCbkYaBnpR+pYGjmoaYcZ6Eo62viZeLf4ykjZWDr6OVd7W2tsmic5SMg59gnpepbXmWh6CbdaGHeKB+kJaLgW9NZqOScZqIc6V7enVig4JtfqBscmRgnHN/dJdre2q0trTGpnOYfXmcapqaq3SBmmxzd5dpmXl0l3FQRH2zXmp1a3iGZmtmYnN0b2xVW1JYZ09SZ0lVTFhSVVxna25VZ1dNSkFKTUtHSk5BUUpQZGNqbWV1c3N+eHtudYl6e1RRTm1eaFxraVJqaGlsZ21nY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinYmwqIVlQJSisqyvr7Whoo9/lqehoaOLpKacm6WCmZeXjpeQkJuTjoiDeWt5hmWDjH+Wn3l1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJaLkYuAiXqAfYt5cI+ghXmBlIaIlZ6UfpOkppuVloNnbnicbKJkfHKleJyYcGingpmOfaV7oZeDlnKfdoGJlJWPuW2PiqJifZmjl4luc2ura3Wgbm+mYJtpi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXBkZ4iCb3KiW19bZKFuXoiMcXyAdHJkpW54omNmp2eXcouXbaFvUoiPbqBeZKdUi11UmG1tcmtxgW1waGt3c2puUVZVVWVZU2xJWE9cSFhoaHJqWWtWUFJFVlxNWFNhVWhqXnd1e3xwfXxygnt/c3eOgIN3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqbCxpZ+Lf5apnJ2ji6GhmqGigJWZk46aj4uXkI6Ke4ZxgIhoi4p8l5pzdIl9kHxlg4eViomVmoJ8iIaWpo+AoaqPhZCKgYp9gICOc2mPpYR9hZKMh5efjYaRqaWdiaZ4lpt+pYmWjLKZnpGEr5efpXmYinupdaiQhJpupaKMkoSMg7xtfKWvgoeGh5WXnaJ+pnxyqJWhlmiffm+sY5aKlpN4qG2qo4GJdYiCd6uRpohrkrFsd7OMqWyLhm9voJ6SlWJ/q4yqd4GAjqefd599haSVnaBomod1q2aerYy2c3a+jKOTWYOmjathdXJ0b3t1cGJqfW5nbFJUWFRgYFxrTFxSXEldbG12X1txWFtfWmdzZW1vcWNxdGB3en55cnmDcoN+gXt7jYGCgHZieWRjbnNkUmxnZ29tcmlmaWFfXlxhamJsbHtvXFxiaWJtaXdtZ2xuYpamq52BgJ6klqqqnqinraOYiIGWqZmdoomapJyonISMmo+GnJGFko2MjHSFeoiDb42FfpeTc3SGcpGDbn+LkoeGlJB9e4KFl6SNf6WkjYCOiYSUdYKHk25si6iAgouTjYibnoiLkqqioI+AdJSXiH6BeJSvpH+CnHGPhnmTjoaBe3OpjXJ9fXqXlpuEjXh7fX2IlJWTi3eRmaGihXt/imyMhlx6eXN6cWlvfpOKcYB0go+Uk3GGhIJljX9fgYGMeHZzlHVwem9viW+Fhl93aXiOZoKDho+qnH90fZZpiYhvfnV8g3VtbGaMc3h7l3eEWmpXeY9pbndycW93eG9da4VuaGdWWV5WXGRqY1VgVV5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV5gnV/gH+BeYuFgn17bYBtZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbqpp4uhopunpJmknauhn4ODlqqQnZ+ImaaaqJiCgZyLfpaUh46KiYxygnyOfH6PhHuXjnRyg3CVhnx9kouGho+GeX6AhpijjHumn4qFj4+ElYOGjph3cYSqhY2RnI+Hnp2GipqooKCrg4mNlZt/foqXraiQk6iReHGfk4V9lHB/q4dxfpVxam98gZ+Lf5GOi2huXYSNjZydoJBzl42JcnVsg3Z0gFlyb4eRgn5/jGpdaWR7hYSIgGBpeHucfISNg3aCh4RpeoyJbGJxc4N3X3ONg4qRqJaHZ42Ogmx2ioJug4t3bWRlY3qCepVaW2lmbXZbe3l3dG5zcoNmXG2Ja2tiWVhcWVhqcVpeYFleXWVyfXp0b3Rjamppe3xyenZ0ZG10aGx7f3V6fXt5eX+Af3CGiYN7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsaGQo6Gan5+YnpmooaB9gparjJ+ThpqhkaSVf3uYhXySmYmIhoaKcnyAi3aFi4KElopyb4BzmIaEfpODg4aKgnqAhIqan4+BpZ+Gd46XiJWLi5yXhIN6rIGQl5iTiZ2choehqp+ioqOLiJObnaOZlquiqKehk5yJmZF+epCQhql/gJORkpOcsaWalJ2PjbGSmISmjo2WnaGKkZ2EiZOLbH2Od3dmg4aRi32JnoWHi4+IiIGFhJF3fHt1m6SKh4ugjIeWf4CNg4F3cXWGhH94iYiLkaeRhIeOh4KLj4p6hYmHjX91aoCDfHmZaXFoYHOKcH17d3Zvd3SBXV5vhmduX15ZWlxTZ3BVY1tbYWxodHt7cm5wY2ppaH97bXh+cGhwcGxmgHtygoB3f31/hHttg4yFfHp5fH56g3hOZHZqc25xe2RrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2Inrqfl6OhmJWZmJSYpKCcen6XqY2djIWfnIqdlnx5lYN7jpmJhoOEhm14gH9ygId+iJOEbWt+epeHhIOQfoCGhId8h4ONm52ShqmegnKKj4aSkouckXyNe6mDjZGXlY6bloWFm6afopqdhoOSmpmZkJmmoaaenpCXgpOMeH2JkIanfH2PkJGGmKqhnJOcjo2pjZKAno2JlJughI+YgIiPhHF5hnJ1YX+EkId2jJmBg4+ChoV/hoSVbnp2dZSkjI2Gm4aGkHWBjH5+c3N8iYV7eY2PhZSokIeEj4GCiYiIdIKGhoh5bWp8f3ttaGtsZl55f2h8e3Z0dnV7d1xgcH1udGBjWlteUWZsU2RaXWBqaHR5fnBsbGNqameAf2tyf2trdG53boR5boaAdoKAfYV3coONh357e3yAe4KLYGl7a3VoaoNkamNgaVxjdWdvYnVtbFRicXllb3l6cmVqbW2Lip+4mqKkn5OSlpeLmp+enHp3nKSQm4mGpJOKmJl5eo2Fe4qRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hYSHfI+Aj5ubkIimm39wi4uMkoagoYqFjHynkIeOkZaSlpJ3jKOgoZ2Wmn+BkJqYk42ao6Kkm5iSnICQh3uBhpGJoYF+jY2PfJekoKCSmZCPpYyPgZySipSZnX+Tk3+Ij4J2dYJxd2F+gY6Gc4qWfYiMcYx+goWGj2h4cnqOmpORgJh/iYxzg4l9fXJ6fI2GfHuTjoSXppSNhpB7hIWGhHN/gISFeGRwen54eXBramZefnNpfHV1c3xzgGpeYHR2cHdkY1hdXlJpaFNkWF5fZ2l1eIFxZmtjbGdlf4BqbX1nbXBqfXeFemuLgXKBgX6BdXaCjYZ/fHqAgX1/j2pyg250aWKIaGxiX3FWdG9sbWB4aGxXanR2Y3R6enFia295iY2fs5Klpp2OkJiPhpygmpt7daOejZd/jKGKiJqWeHyGh36Ein6IgoF/cH56dHWChX6JkHdnY32Gl4qCio14fYCNg3mWgJWXlY2Wn5p9b4uBkZOFpZuHjImDppWEkYqVl5KRdpGdoaGYlJd5f46Yl46Wmp2lnpqUlZ17koiFeYeYj59/goqOjHOXop6gkpiOj6GMjIOYmISUl5p/mY59io6CeHJ+bntkgHyLhnGHk4CRgmuHg4GAioVmdnB9iJSajn6UeY2LfYKJfnxygHmLhnqFkouMmaOXgoSLdoeDgYB0eH+GgnNednd8c312ZmtkYH5qa3dzc3V9cXxjY2FzbnVybWFZX11aa2NSYldfX2dqdHmFcGJqY2xmaHyCa2h0aGxvaH98gXlsj4VxgIODf3R8g42BgH56goN+fJBtdYl0dG1mimxqYmN1VoNpcG1geWdsYWp2cGV4e3lwX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHaomomYeZaci4yZkHh8gYt9fYR7gIKBeHN4eXN9gIN/iIqAZF59i5SHf4WHdH1+in9+mISWk5aMo6CXfnKHe5ORiqaPjI6KkqCRg5CPk5eRioGPmKCakpCRdICOkpSJnZ2ep5mYjpWXdZCRi22ImpGbfIiJkIlvl52aopKVioydi4aBk52AlJOWiJqKfYuKgntxemt2bXx/jH9uhZODlHhvgoR+fouBZXNqfYKYmIWAjnWSioV6iX93eYF+h4F9hI+GjZWlkXmFgnSIhnt+cXJ+hIFrYHl0eXB8bmFuYmV7Ym5vdnN4d3N0YXZgb2x1bm9cWl5dXWldT1xXYmBnbHJ6iGpfaWVqY2h3h21mbGhpbGeAfHp3bpCIc4CDhH10gYaJeoN9eoGEfXyOcnmLeHhtbIdraF9pcmKHaHFvZXZnbWxhemhqfHt3cGF3bYqBmZqroaWpnoqLkYaJnoqUlnx2rJeMlnyek5GWlIh2fnuKfHyAdnd/gG90c3pvhX2BgIl+fGFcfo+Shn+EhHJ6gIZ6j5GHkZGbkqSbk4F9gXyNipKjiY2KjZaajIWQl5KVjYiIjJKdk4+MjW6EkI+RiZ6ZoqGYl4qXk3CLm4ZniZuQlXuKhZCKcJaalKGRkYiKmIyCf5KffpOQlI2akHyLhoh0c3VrcW92fYx1b4aRjpNydIB8goKJfWVybnp/m5V+hYp1koyCdYp7cIJ/god9ho2LhY6Wqo57iH1+ioR2fG5sfYKAYWZ3c3RuemFeb2BrdF5want5eWxycGV5Xm5sc21zWFpdX2FpWk9WV2RiZ3Bxf4dlXWloZ2JncY1uY2hoZWlngHp3dW+OhXOBgYN8dYKJhXiFfHiEhnqAiXd/i3t6cnmDamtfcGh0f2txbm1xZ29rZXtibn96d3Brd3eJf6OZo6ihp5uIjIqBj52Gkpp0f6iTkY2GoIyVk5CAc3x2hXh5gHJze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYF/f6CGj4qRnJegk5Z3iX6AjIicnYqPhpKXloWIlJiOlouKjY6MnYqOkYRtiYuPkYqclqGcmZaGmYlsh6WFZ4ifjJOAjYSMgXiTmJKdkZCIiZSNf36QmX2SjpGOm5N9i4GEcHZwbG5vcXyHanODj5iKcXiAdYKJg3pndHB3gpuQfYqFe5WTe3iKdXKLfIeOe4uHhYqPnKWJfIR2gYl+d3dsaH1/fltxcnFvb3ZZXm9gcGpeb2p8enFubWptd2Bwb2txbVlYYGFhbFdQUlllZWJ1b4SBYV1rbWRjZWuSbWBmZl9naoF1cnJvi4B0f4KAeXaAi4B5hX53h4Z2g4V7h4t/e3aKf2pxYnxihXxvcGx1amhubHZ3X3F+eXtzdXN/gn6llputn6eXhYyDfpaVg46ddImek5KGipqMlY6MenJ4dIJwcoV0cXWIbG5sdGyHdoN9f21uVVGBq5SHgniAdnKDeYKggpCBk5KYm5GZd5F6goySpJqTjoiUmJKEhZaYi5OLiY6Ph52EkYt9couFiI+InJmfm5eVgZWAaoifiWiIoomUhZKEinGDkZePmo2PjIuOjXd7k5F7j4yOk5iNfIl9gWx3am9rbG17gGJ6fo+XgXd6gXiDjX16aHVtdomXjICJh3yVkXJ7hnF4jnuLjnuJf4SOkZ+fhn18d4GKfHZvZ2l+f3Zddm5ta3ByVV1uYnJhX21ueXBocGZnc3VocGxhd2VdVWVgYHBTUE5bZWRdeG+Ie15caHFiYmVlkWlfaGVbZ29+b2txc4p9dn2FgHV2f4x5e4aAeIeDc4aFfoyMhHx5lXhncmqDYId+b29re2BpbXR/dF90fHiGd3NzhXx5oZCasZymj4OKf4KZiX+KnH6KmJKOhIiXjo6OhHd0d3OAcHCFc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfHB0g3WDn4KRdpSQmJuQmXuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYicf46BeHuMf4iMipycnJuWlHqOeGmLlIpuiqWGlImYhIZjjJGYjZSJlouMiYtwepWKfI6Ji5OSinqGfX9tfGVzcGtte3pcgXqQj4F7fn+Aho97eml1a3SMkIqDh4Z+l4xtf4Bwgo6Ajol+hXuEkZabnIx9d3iCjndya2RufIBpZ3NuZ2hzbFNdb2RwWl9scXdna2tiZ3hzcHBkYHhgYVVrX150T01KX2ZiXHhwiXRcW2V1YGFkZI5jYGZiWGlzdG5scXaLfHR5hoJ2d36Lc3+Gf3qJf3GJh4GQioh8fpl2ZXNufWWHf25wa4BZa255enJgdnp7jXZydop2ep+MnK+boJGDhXiIlX57iJyGhJ6QjoWMl4STjoeBdXdweXFvhG9tbn5yY2R3cHxuenxqaGxipJrB3K7vonNsdYN1hKGEkW6Vj5SflJuAkXCFi6OXiY6VipCdlYOAlI+FiI+AkoqKl36He3Z/iXiGhY6cmpeZj5B2i3hwiYuOf42mhpOLnoaGXouUl4mOiI2KioSJbHyXg36JhoqRkIZ2hn5+bH1keHVqb3p0WIh7koeGen9/gIaNf3pmdGqBi5CLhISBjZiGbYN3b4mTg5KGf4R7gpKXlJqRdXR4h4t0cnBkcnZ/X3Jsb2FodGZSYHBna1VebnN5YXJjYGl+cXJuW2NyYWNWblpcd0xMS2NmYV12coltW1xkeF5gZGaEX2NjXlhpcmtua3J3i31zd4SBeHh8iXGDhHx9iHt0i4iHlYWMf3+Yc2h1cnlti3tudHCAV3B6dnlxZHZ5hoxodoCJcYCdiJmonKOThX1xjJN4eImcg4SfjI58lo2AmoiEfHN3cHNqb4Fsam18dF5gd3Z7cHR6Z2BlfOvatcnD3IlzbHSAdoqaiIxpl4+OnJWSgYhwhYigjoWLlYqMl5N8jZKHgoiPepGLho+CgHd4g4Ryh4KTm5aTmIaNdoiAcoeEjImcpIWWjqCEimGDlY+FiIWIjIaAh2h9lIB+g4WKjo+Ccod/gHJ3aHZyaXR4bVqNfZODhn2Ag4GEi4N2YnVtioKRjISAgJOSfm+DbXqIkYiUhX2Cf4KTlJKYiW5xeYuEdGpvaW92fl1yaG1caXRfUWRxaGZTX3F2dGBwYF1og3FzalhnaWNpV21XW3RMSktlZl5hcnOFaVtcZXleXmRnemBkX11Za25lbmp0d4p+c3KBf3t2eohzhYN8f4d2doqFj5iBjYJ7k3Zsd3Z5eJN1bnd6fVh5hXGAbmd4dpGCZHaGhXGKloaaoZuhioZzb5KLcXaNmnyJmYiJfJ9/hJl/gnlydG5vZHJ+aWZsd3dbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJqQi4V6aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N8cYaAlZmOkpSCiXaEiHiGg42VoKGIl5GhgIlhf5SHhIeDiIx/f4JmfZGAf4CDjI+Qfm2DfYN1bG13dXR3dmtjjoKPgIV/fISAhYl/cGB0coZ9kI6DfX+SinpyhWd7hYyIjYV8hYCBlZCRk4Vub3iLfnRsbWhpd3pgZ2lpWGt0WVJocmliUGJyeG1iZV5aaoRudGJcaGBlbV9vVFpuTUdOZmRcZm5xgGtaW2NzX1xja3ZkZV1dWmxsYmxqc3aGgHFvf3x9dHiGeIWDfICHdXiJgZKVe4mGdomBb3h5e4STb217gHZeg390gWxoenOUc2dzh3xykpKEmp+bn4aHdXWTfm11kpZ9h5CDio2afIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lZGhoV52PX3Jzl7zEhHZxlIiPfXGWi4abkouHcmqIj5aAe5WLgYSajHyKhXx7iYt/lIh1iYZ2d36BcnWGgZ6UhZSPhINygYp3hn6Mm5+aiJWPnoGJZn6Tgn+FgoiJcYF9Zn6MfHl/gIiMj31pgX6EdmdweXhzd3Rsa46Gi4KKgHmCgYWEgWxfc3l7fo6Lh3yCkIF/c4JqeoWJjYeFeYV+gpmOkY1+bm16iHx1c21lZXtzYVtwYlducVNTbXJoYU5ndXhmYF5dWW+Bb3NaZWJeam5gcE9ZalFEU2ZgWmpubXxuWVtdbWNaYnB2Y2ZcXWBraWNsanN2gYNwbX58f3R1g3qDgnyBhXZ+iIGWkHiEinSBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0a5ONhp+ZoJmEh259i3Vpd5eOfoGKgpSXinmPlW96dHFsamRgc3poYGVxelpgcnx5Z3F5YWVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJCLhW5rhZKSenmShoGEmIp8hn93d4mKhJaAcIuIcXV+e2p5hYOlkISTjYR/cICEeIZ7iJ6blo2VkpaFiHB7k4J9goKIgm2Ad2iAhXlygIGDioh8ZX5/hHZkcXOAaXlxcHWZjoaDi313eYGFeoNrXHJ/c4KJh4p+h4p7iXOCb3KFiJCGhnOFe4KajY6FeW5ufYN+dXljZWh7bl5YdlpXcGtOV3FyZmBLbHd0YV5cW1p1fnNwWGdeZ2tyYG9OV2dSP1hmXlpva2d5cVtaWGtlWWNweV5nXF5lbGdma2lxd3+Ib2x/foB1b4J7f4J/gn92gYSJl4lxgo1xe4Z8enmEk4x1anl+a29+dH98b3J7epNvboF+eGeSi4OhmZyRgoVnhoNvZ3mViH1+hIKYioF8jo1peHNra2ZfYW95bV9ib3hcZGuCeWFxdl9lZdTqvYsyOj6Ljn9xeIWHjY11gpaMfpKNi35ta4SMjHV8j3+FgZSIfIJ3bnaHhIOXd2+IhWx1e3VmeYKDpouCj4uEfm6BdniFfImfko6Sk5SOjId/e5KGd36DjIJqf3JogH55bnx8gouEd2J6hYJyZHJpfm52cnWCnIyBgIWAdHZ+gHOCb1xugHV5i4SLfIiBfol5e3JtioWRhYxzg3qAl4yLgHVtanaAf3RzW2dndW5XVntSWW9kTFpycmVbSXF4b1xbW1lddX50aFliW2hmb2RqTVdlUD1dZVxddWVgdW9aWVRuY1ljcXlaaF1gZ21naWtpcHd9jm1pgoR/eW6AfH2Bf4F6dYKAjZOEcIGLbnd+gHt7iJKJf2h6fWpze3KFenN2fX6MeXiEfXxrjI2Em56WjIGAbI19a2h+jYt6fX6Dk4J+fYqIa3ZxZ2hiW2Jnc29fYWtzYGhwiHlic3ReY2SboI9uXDVar7V0aYCIfJGGdYWVhXOOiol2b2yEgoZ0eYl4iXySh3l+cmd2iX5+mG9xh39pdnluZnmHhKSGgIeNin5vgHeCg3+Pm4mElpOZioyFiXyQiHB6fYR7aH5saoB7emp7d4KIgXJgd4F+cmRyZ3aDbnV8hpaSgn2CgW93enx1f21ZcYF3dY2Dh3iIdoSJe3l0b4uCkYKGc4B+f5SJinxvbmltgYF0bVtlZHFvUFp6TVtuW09bcm9kVUtzeGlXWVpaYXGAdGBdXWBnZGlpZk5ZZ01AYGNbYHVgXXVsWFdTdGBaZG9yV2peYmhqZ21saHB3fJNsaISKfX1wfn57gYCBend/f4qLg3F8h29xd4N/e4mMj4NpfXttd3h2inZ8eH+Chn+Dfn16bYWMiJmjjYSDe3WLeGtshIeQeH16gpGAgH6Lg3BycWNmXllmX29vX2BncGZqboh0YXRvW2FkanZ7gL+cpqTIuHGEgnKSe3eFkoJzkIuHcnJvg3uDdHSHdIh3k4h5eXBjd4d6gJNpcoR2Z3d1Y2p8goedgYB/jo9+c4B1h3uClJKFepiPlpCIgol7iYlreHl+dGd6aGt/eXRpeneAg31oYHiIfWtrdGh8gWp2goyRlX97fn9xfHZ8dH9iVnh+c3SLhYN9hHGHinh5cXGFhI6Af3p/fnaPhoR3anFpbIeBcW9cZmBxbElkdUtdbFRTWXJuYlFPdHhhUlhYXWFwgnNbYVxpZWVka2RQW3BJQ2NgW2NvXV13aFVXVnZdW2VuaFZrXmFqZ2VubmhwdnqTbWmIjXl9cnt+eYKBgXx2fYOIhoNwd4RybXeCgn6Ji5N/cIB7d3h6gIx0gnh+gYGChHmAdW9+ioubnoh9hXp3hXtodIWLkHl+f3uIhoR2j4BncG5fZFxYZVltcmFgYHBsa2iIbmF0aVlfZG6Ad6naqceGh7JxiHdvjHR6hY1/eZKJf3RzdH13f29xf22FdJOFeHRrYHqCeYmPZnKEcGd1blttfYCQk3+AeJGTfnl8bop4g5OOhnaYjJOQiIaGfH+FbHR1fmxndmRte3Ztand3f398YWJ4hnppdXVjfnxodYePjZZ8dYF3cYB7fW6AWld1f3B2hYh/gXptiYZ0emx2goSFf3x+en10jIJ+dGh0ZW6Kg2xzWmhdc2RHbW1LWmBXVlV3bWJQUnR2WFBWWF5hcoRvXGBjbWVkXm9jVFxxRkJlXl1lZ11be2JRVlx0W1pna2BWal9gb2Zma3FocHZ4jnRrjo12f3Z4fneBhIF7dH2DiIeDb3KAdHF1foWCiY2KenZ/eIN7fIWHd4d8fYF+hIB7fnJ1eYyNoIyJeYl2dIN4Xn2Fl4t4hoNzhYaEd4l6Ym5tXGJbW2FWaXNjYFtnbnBmh3FhcWZXXWNrf3zKzoe5oWptbYpscYNxe4OJfnqQhHl4c3h1dHtqbHZjhHWRgnZvZl99gnqLimVygmtqcWNYbHqFm4iCgXOXlHh/fW+Kc4SMjol0mZCSiYaLg3t5fXFwb3xmaHFibXhxamxxeH19el1leoB4anZ4ZoN3aHWJjI6VfXKIam9+gXlvfV1Zc39udYGMfIJvcIqAcXdpeIGCgYJ4fnN8dYd9e3Nnc2Fui4BrcVdpXHZbR21qTFZVXVNVe2thT1R1clBRVFdeY3SFaV1gbGpmY1pvYVhib0dBZ1xgZV1cVnteTlVlcFlbamhdV2dgXnJlamhyaHBzd4Z4bpWLdH96eH55g4h/dXJ/hoWOgnBwe3h3dnmGhoeMhnl7f3SLfX2GhIOHfn5+fYd/fHh1eHiRk59/jHyKbXWAeGSDhpWFc5GKb4WFgXqDdGRuallfW1xdVGdyZGBZZHFyZ4ByYmtlV1tgan94vq57n7duYXOFaHN6cXiBhHp9i353d3J2b3t2ZWpvYYd1joBzamJefnh5i4RmcX9oa2taVm93iKKAhH9xmZNygXp2hG+DhJSKdZeKjomFiYV9eHRxbmh4X2psYG12amdqbHl3enZaZ318eWZzfm2FdWV1h42GloBwjGdre4R1bnViXXF9bHV9jHyCZ3aHfm5xaXaAeX+AdH5te3yCe3lxZmxibol9bGxVaV92VUppak5RTmdMWHtoYU5VdWtMUVRVX2d2g2ZeYHFoZ2JXal1ca2dKRGpZYmNWWVV5WU1WbWpZXWtkXFllY150ZW1kcWdycHWBeHGZhnZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYeJiYN4gX11j358hIqNg4GEe36Lg3t2e3d3mp2YeomChml2fHtsg4OSf3KOgXCFgn+Cf3BnbGdYXVtcW1NkcGReV2JydWp1b2VlY1dcW2h/cG9ygHOJZGR5fWlzdXNygYN3gIN4dnJ1bWp6cWFna2eGc42DbWZdX31we4l/aW14Z2pkVVdyb4ymfIR7dpaRdH10fnxvfn2TiHibfYmHhIeDfXVwcWxndFxsZ15sdGRnZWl6b3tyWWiBd3VocIF4gndid4aLfJWBb4xqbXuCcWd0ZmFuemhzeIt8f2N3hHdqbHJ1fHJ7e3R/aIB/gHl3b2RmYm2Fe2xqVWhhb1JKaGpPS05vR116ZmFNVXRkSk9TV2Frd35mXWdzaWZgVmRXYnBcS0tqV2NhVVRVc1ZMWHVkWV5rYFtaY2VfdmdtYnBpdG9yfnR0mYJ3f4B4gH+GhHp9dYKEf5eFbnJ0fHp1cYSFj4GAeot1c5B/fIGVjYCFhH19jIZ6fYB3e6OlinmIhYRrdHt6dYKAi3puhHN5hH2Cg3ZvamllVl1bWlpTYm5kW1hhc3tqaG1pYGJYX1ppf2lrb4BnbGBoeXhqcnNzbYOAen98dXRtemhqeWpfZW5ogXaPhGdlWGJ3an6He29qcGdmXVRYb2eNp3aAenyQjnp2cYBxdXh7kYF6l3aHg4CGiHZqcnVnZ25bbGRdbXJfZ2FqeGh7bFtug3N0anCBfnp4YXeGhXmRhXSJcnB6gXNkcmldcXhlcnSJfHljdIBxZ2p5dXNteXh2eWWFfH95d3FkZGNte3xqalRnYWVTSmtnT0dRakVgd2ZhTVNyXUpNVVplbHh8Zl9ucWlkXVZhVW5uVkpTZ1dlXVhNVWtUSlt5X1tfa11dWmJlYHlobGFvb3ZucHd1eph+d3+BeYCAh4Z6eXqDfoGTg3F0dH56dnSFiJF9gHyQa3KVgHuCn4V+h32AfoaCgIp7d4Srnn96h4eDa3KBeXWAfoB0boZufIBzioBqcG5kZFhfWllaVGJqZ1taX3WCaV5tbFxhV1xca4FlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWRzaHp3koFjY1RlcGiChXh4Z2lqYVdWWWdjjqdvfneAi457cXJ/aXtxfI59eJBzhX6AgIZuZHVyZGdnXGphXW9vXGdfbXRlemhddIBvcmtxfH51dmJ0hox7iYiBgXlzdYB2YnFuW3J0Y3FzhXx1ZXOAbWFte3Branx6dnRnh3Z7enZxZWJkbXJ9aWtTZ11cVEtxYlBGVWBHYnZmYUtTb1hKTVhYaGt2e2VlbnFmZFpXXlh3ZVRKXGJXZ1dZSFdkUEhieFpdX2xaXlxhY15+aWpgb3R4bXBudoOXenKAgHx/iYyGfXV1hniHjHxzdXWBeXp6goyOfX6EiWlzloF6ip1+foV6gXp/fIaJc3GPrYx7e4aPfWRxh3lzfHp1cm+GbHt+bI96Y3BvYmVdZVZZWVdjZmtfXV1zhWhYcW5bXlhaXGx7YnB3dWxhWWxzc2d0dW9sg3h+f3h2bW50ZGh0ZVtndWZ2dpF6X11SZmZrg4J0fmJkalxUV11iY46kaXhzg4aReW5xfGp6b32HfXaKdIJ5fXmAaWR2bGBmX15pX110a1llXW9vYnplXHd8a25ucHh5dHVlc4STgIiDiXt3cHN/dGN4ZVxxcWJxcoJ9dGdygGVfbndqZWh6fXVvcIN2dH10cmJfZm1ufGRoU2dXWFNNdl9QSllXSGJ0Y2FJVG1TSk1aV2pscnxjbW1zY2JaWlthd1xTS2NdV2hTVkZYYE1HaXVYXmBsW1tfYmJchGloYW54eW1vanaBkHltg36AgZOIhIF2dIl0jIZ0cXZ2gXh9fX6MkIB+k35wd5WDfJiSeYCAeHp+gHSIhHRxmaF6en+JlHdjdYd4c3d0a3Rufmt4fHCRc15wbmBnYmxUWlpXaGNtZltccYllU3JuW1pYV2BsdmNpdWppXlltc3Brc3NzaYR8fn56dm5ubGRpcWNbanJkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEknVsbHtvcHJ8fn1zgniBdHt6e2RldWddYllgZ1tedmhXYl1waGF3YVt8dmlqcm94dHN1aXGCloSHf4V3dGtxfm9neFhdbG5jcnSBenRncH5cYHByYmBrc39tbnZ/c3F4a3FhXGVsbHpgZlJlU1ZRT3VbUU9YUUhjc2FgR1ZqUElQWlZra2t9Zm5vcWJbWlhZbHFXUlBmVlZoU1RFWVtOSHJ1WF9jbGJYYGBhXYtqY2RtenhscGl1eYd7a4N9f4SafIOEeXyHbY+Hcm52enx0goJ8i4+Dgpd0eIGThYGeiXWBgIF0f4JxiIN2cKGWc3qGi4Z6ZXeKbm16bmZ4cHprc3ZzjWtedW5hZ2VrUl1bVWdhbGtaXHGMZE9vbl1WWFVnaXNoYnRlZFxYbXRsb3V0eGqGfH97h3aPc2Nka25hXG5tY3N4h2taVFZjZHh9fXGGXWRfY1RaX1lilZVjbXCDhYp0a2l8cGd1eHV9bXt1dnB7f3ZfZnJjW11WYWNYYXVlVV9gbWRhcV1dfnBoaXRxdHF1d2tthZSCiX2HcnNncH9ydHBUXGdrZnJ1gXd0Y212VmNybFtfcGd+Zm54fnN0c2tuYVpkaWp3XmVTY1RVUFNsVlBWUlBHZHJfYUZYaU5JWFRXbmllfWlseGtiV11VW3RkU1JXaFFYZlRTR1lZT014dltfZWtpWWFgXl6ObmJma3l1bm9pdnaAf2yDgH2HmHuAh4GJfmuTiHJmdIB7dYCDfYmPf4uTcnyKkYWHn4Z7f4aMc4GGc36Cdm6ki3KAjYt2d2x6jGBke3BmeXN4bG1xd4NnZHxtY2ZnaFNfXlVnX2xuW15ujWhOaW1gVFZTb2dza2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVweH5nWlZYYGx4fHtwhF9jX2dWWF9XY5uIYmtwgYd9eGxsem5deHNufGt2dG9wfIFzWGpuXlhcVWFiV2RwY1NeYmlhYmxaYX5sZmx0dm9td3dsaYaNgIp7iW5yZnJ+bnRuZFthaWlwdIF0c15pbVNlcWVWY29kfGRzeH13bHBta2BZYWZndFxkVWBVUk5XZFJPW05PSGRvXGJHWWlNSl9LWW1kYHlpbn5kYFVfVF11XFNSYGZOXGBVUklbWFBZdHVdX2VraFhiYVtejXFjZ2p4cXNuaHZ0e4RygoN6iI5+fImHjXlukIl0a3OBdH9/iIWHkYSVj3l9jI6HkZuEgHyMhXN/gXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2Ojo6Njo6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjY6Ojo6OjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2N1tPURERERFOC4vLy8vK0iFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn7WcuNTU1NTcnHB0dHR0YOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWFhYWFhYaTlJSVlZSVioWFhYWFhYSDg4OCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSkpOPjo2NjoePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuLi4uLjIuNjo6Ojo6Ojo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeIh4eLhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhIiGho6FjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmDhYaHjImJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjomGhoaIhomPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Qjo2LioyJjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4CBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9/f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX5+fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn19f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn9/f4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn19f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn1+f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYWFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4fHt7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e31+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fX59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTk7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnd5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Oz08Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fX5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz1APzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkVISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz4/QD0/Pz48PkA/PT09Pz09PkNEPzs8PT5APT0/QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkVAPz9OYV9KQENFSUlJSUxNS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk1LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8e3t8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PkE/QURERENXdYaJin5YR0hKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm9wcXJ2dnl7e3t6fX1+fn19fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdISElHRkJERkREQ0FVdIeJh4eGiIJXSUxNTE1NTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS01KS0hIRkZHRkVQbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZIREVHSUtJSUdISUdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTUxJRkpWbIGGhYSEhoaGh4iGinVJSUZCPz9APz8+PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUtHSUpNTU5NSkpLS0pMTVNsb3J0c3N3eXp7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf3+AflFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lIS0xPTk5RTlFecoGFg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QTs5OTk9PT47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5/fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSExLTlRne4SEg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0Njc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODo7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BPUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRGQ0NWeISEgoKDgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NjY3NjU6Ojs6Ojw4OTg5OTg3Nzo6Ojg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BRV2tycnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEdSYHyEg4OEhISGiYqKiIeIiImKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozw9Oj48Ojw7PDs8PDo6PDg6Ojs7OTk5PD88PUFCRElKTUtKS0xXb3J0dXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj0+T3eBgoOEhIWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUFCPkBDQUA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEFAPz9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6Ozw6Ojo8Oz0+QD5OfYKDhIOFhIaJiYiHhoaGh4iJiouLioqKi4qLXj5ER0lLSkpGR0dERkhHRUNBQENFQ0JAQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj06PDo9PT4+Oz48Pz5CP0x+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRkRERkdGRENFRkRCSElLR0hHRkdHRUtKTElLS0pDRkNDREJBQUNCRENDRERDQT08PkBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc7Pjs8Oj0/Pj88Pz5CQUQ+Z4OChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtHRUdISElFRUhGRkVMTE1JSkdHSElKTk1PTUxOS0hGR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/f359fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6PT88PT0/QENCSFN+g4SEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExKSUhGSkpFSkhHS0pISkdHR0tMTkxMSEhJSk1QTk9OTE9LSUdJSkhJRElISEZGR0dJR0NCQUNVb3F1dnh6e3h4enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozc8PTo8Pzw8PT9CQ0NMbYSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMi4uLi4teUlJQTU5NS0pHRkNISkdMSkdLT0xLSkpMTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgICAfn9/VUVDRUVHR0VEOz9BOz08OD89PT5ARUQ9QkRDRkp0hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUZGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1JQTEtNTU1LTkdHSkZGSUpEREVFQkRDY3F1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz08QT9BQURUS0JISUZJS3iGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQUNGRENES1ZQSk9PTlBReYaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVZdWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01LTEpJSUxNS09NU290dnh5eHd5enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1FQVFZVV1V2hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dYWG2BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ11bXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX59fn19fn9/f3+AgH9/gH5+enh3dnN1e39/gIB0a35+a3F5XltWVVNST0tGQ0RBTV6DbFZSU09PUU9RVlFTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JVUk1PWVFNTlFTVVVNUVNSUE5MTEhDSUdSU1RaXW1ydnZ1dHR3e3p6e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRgZF1eW1lVUUxJTElhbJJ0UFFTTVFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQT9EUENDQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdISkdEQkFDQE5QTVJkdHV2dXN0dnl8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZoZWViXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXRybnN0c3l4fn6DgIODgoGCgIKBgWtMRz4+Ojo+QD8+Pj5qUEthRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz88PUI+SU1GVW91dXZ0dHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxuamhgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcT3tOT09OS0xNT09QTEtMV05IR0FBPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV2dnV2d3l8fHx9fHx8fX59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJTVlhTUllUTllaW1dZXF9eX2VfXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FXUE1KREY+Ojk2NTg3OTc5OjM2NTc5NTxCPWZ0dXd4d3p5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT01MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE9KTk9VU1RcVlJVU1NPTUxJSEhGPz49Ojc4NzY1OTk2NzU2NVdxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFdZWVlSVU9JR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFBPTk5NUE5UUlBSTElMS09SUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVlFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPTNAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMT1BOTVBRUU5QT0pMTU1LR0VFQ0I7PT08OT1HNjY3NkRucXV3ent7fHx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVVlZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JCOERNU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FMTk5NSU1MSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1AQEI9PkVIRkRGRklHSkpARkFBQEVHRElPSFFSYVxRUFJPU05PT0xMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZFP0JDPj1CRz9CP0BkcnV3e3p7e3x7enp3fHd5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48QkFAR0pFTU9iZVBNT01XS0xOS0tNTUxMS05OU2RNSkxSSUlJRUJJSkxNTkpHSUZCQkJAP0VGRUhETG9wdnp5eXp7enx6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPSEtFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPj8/QD5DRURMTVFUTEpJTVRGSUlKTElKS0lKTE1PUFFQS0dDS0dDQ0tKTE5PTklKSUdDQ0NESUpNTElac254eXh6ent5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFISkNGR0hHSktJSkxER0I8Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHSENDO0FAQj5AP0JERElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJISUROR0JFTEtOTlFOS01KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhlcEZKQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREA/QkNFRUlGSkpMRklJR0ZGREI6QUNDPj9DQ0NER0tOSEpOSERIRUlMTk1ISUxHRkZJSUxOS0lIRU9JQ0dOTVBOUE5OT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjs7Oz07PT9EQj9BQ0ZHS0dKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRkZHS05PS0ZISUZFQ0RJSUhLSUdIUEtESk1NUU5PTk9QTkpKSU1SVVVSUFhlYWFtZnByb3J5emdlaGhjaWxmcWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VERkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdKRklHSUdGRkZEQ0JBQUVGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVDQ0hISEtKR0tSTUNPT05RT09PTk9PS0tLUFVXVlZUWWBfXWlgbWluaHJzYmVmZmRoaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXV2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01HR0VHQUFAQ0Q8QUFAQzw4Oj0+Oj89QEJAQEBERkhFSEZGSEZFRURDRUJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9NT1BNTE5TV1ZXWVZYXlpdZGBoY2ppZ2tfZGVmY2hnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hBQUJFRTxAQ0JEPDc6PT47PjtBQj4/P0NFRkRGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSERLS0xMTk9SVE9IVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSUNBQ0dFPEBFQkQ8ODo+Pj48PEJCPUA+QUJGQ0VDQ0dEQ0RERkdHR0lGSEpIQ0lIR0lHRkRIS0lGS0hNS0pLS0hLSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXV9jXlxiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJER0U9QUdEREA5PD5APz4/Q0I8QD5BQUdDRURDSERFREZGSEhGSEdJS0pFSkhISkhGRkxISEhKR0xMTExMSU1KTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJmXWRgZmhgZWhqZHNzZmpoZmxwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd3B3SUpMSUtHQkVERTxBRkREQjs/P0FAQEBEQUBCPkFDSEJFREZHRUhFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTElJTEtNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFiYGNkZWFkaWNkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV0ZXFza3BxanJ2cHdKTEtLTEdDQ0FFPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0hGSEZFSUZDR0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFMU01KTU1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY15gZmNhYmduaWNpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PURFRkM/Q0FFRERGQ0JFR0NDSUZCSEpJR0hKRkRLSkdISklJS0dKSk5LTkxJTEhKTUtaZkpkXEtsUkdOTV9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbnpmXGx1YGxrVmB3dWhqaGhmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj88REVGRENDQ0VFREZCRUZHRERLRUVKTEtJS0xHR05JSEpLR0tKSUpKTkxNTUxMSU1MTFtzYmRwXmxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm5ccHZncE5Mcnl2a2Fha2VlbHhta3Zsbm9zcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FBPz1CRUZCRkNFREVFRENISEdEREtIR0tNTUpMTEZKT0hKS0pJTEpKSUpNTU5NTU1LTk1NW3Jwb25wcGxrTU9QbVhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcF1gc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRUVCQUI9Pz9FR0JHREhFRURCRklISEVHS0pHTUxOSkxNR0xOSU1LSEpNSUpJSkpOT05OTUxOTUxcaGR1XWxxV2xNT1FuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0tSUkxITU1JTkpJSE5HSkpISU5PTU5MSk1NSlp0cHBvcXFtbE9RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpaXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0RERUBAPkNDQUZDSElNSEZDRkpMSUdGSk1MRk9KSldSS0dLSkpOSUlKTElLSklJS0xNTUxJS0tLU2tiWWleX2pjcnJaX1lqb19lZVVrX2RbYWJRYG1oXGpcbmlpZFtvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRkpERUNGQUBBRURDRkJISkxHRkRHS0xJRUZKT0xJT0pMW1FKRkhIS01JSEpKS0tJSElHS0tLS0dIS0pMS0xKSUtMTlRbXVRQVU1RT05PT1VSUFBRT09RSkpOUFFkcWlUWVZbW1xVWVpdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQEVDP0NHREVHQ0lLTEhGREdLTEhER0lQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKSEhIRUZMSEhKTktIT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZFxhWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKRkRHSFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklNSUpUX1lgWGBhW2BVWFlUXV5aX1JZXFBeXFlOX1xeU1teZF5aXWBjX1lfYltgXltVWVhaX15jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklIREZLSkpFRUhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRkNERUJGSkQ/SUtITltjWV5eYV9SVFNXX19cXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmJiY2NlWlJZVlddWl5kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkRHRUJFR0hGR0hJRkdKR0hGSEtJS0RDS0pNTUxMSEpKSEpHP0dGTktLS01LS0tJR0lFRUBEQUhJQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1tLV1xMUlxZSU1eUVFdX2JjY2NjYlxkY2JkY2VYUldVVF1ZW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSUZHR0lHR0pGRkZJTEpORUNLSkxOSkxJS0pJSUdCSEhRTUtLT01LS0lISEZFP0VCSEhBQEZFQ1RdWV5YX1lfW11VWFhQXV1RS0pWXlheW11WWmFSUl9fYmJgYGJiX2NiYmRkYlhQUlJTXFRcXV1eXl9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0dERk1SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0pJR0RIS1FPTUxQTUxLS0lKREVBRUNIRkFBRkRBVlVFXFReU1ZfWE5UVU5aW01KS1RgYVtfWF9eYl1PWWJcYGBfYmNhXWJiV2BfVFFQUVJZU15cW11eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJU2NRRVdfSUdHSERGTUpQUEZJSUpLTkxMS01LSkpHRUlOUVFOT1BNTk1OSUxCREFDQ0ZEQ0FDREBMSENMTFBPTkxGTUZGSElIR0xMTU9QSUxPUFBTUExRU1JVWlhXWVdXY1ZOUlRQUVBPUVVUXFlZW15eYWFlZmNoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtOXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BUU05QUE5PT09ITEZgRUReTERmY0NMW0heXHNtT01WbVlMQ09fVGxXZ0pdV1VeRE1RVUxNU1ZRUlRYVlRYVFRcVE9lWmhoZVpVa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS1BUSktHYFRISk9KSU9NUlFLTUtMT1JVUk9QSkxOR0hNUVtZT1BQTlBRUEpLUX9RSXxZWXJzV1BtR3Fub2FWUHFxdE9CanNucXRwU29fW25YXVZcWFVraFVdVmNZYFlaXlVVV39pdHV1X2F2X1liXFxmW19hYWFiXmBjZ21vbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT0xRVE5PUVBLTE9HTVBTW1pUUVJPUFBQS0laeF1UeGRoWFJTUHZmdGxwYm5ma1JyTkx3bWpycHNycXJwb2+AXWV6dXhxcXpxfnJ9a3V9YVJofGVzc29zc3x9cH54b39yYGBgYmJbYWFobG5rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpRT01OSk5WXllVTFFTTllZTFNSUk5MUElRUlRZV1dQVFBQUVJLSGd4bGN4cW1aSkxUeXB1bXVibnZQZGRIZXZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGhuWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVnamplaGJjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFFIS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OUkpLcm91dXF1cWNoYFVuS3FwXkdoeVd2VEtoeH13YHl7c25hXW1vZFNncnVubXlwd2x2c3RxbG1cc356a215fGx1bnxscXZ1eF5fX2JfXV9lZGlnaGZlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUtNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnZUVmxObmx7cmFqZ391VEtWa2d8bG1seF9acHp7X2B6c2Nyb3hxaGR8aXJ7XVRLa192dWxqdnx7bX55a3xwXV5eYltfYmRlZ2ZmZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbG1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTExTU1JPU1JYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFNT1VMS0tSU1JRUk9WVVFRT1JSWFhQTU9VVFdYWFtbVVFSV1tXWFdbT1JUV1dYUV1YVlxVVE9YUldXWFlaYFxncl9bW1tdXV9jWl9jY2VnZGRkY1pkYmdmZm1ubXVmZmdjYGZeXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJOUlFQTFZWVFBUVVhVWlZSW11WVVRXVVlYT09MTldUUE5VU05QTkxRUEtJUVFLUU1KSk9RVFFQUVNSSkhNT1BRUlBQUFRWUlhXXFdTUlBRVVVVU1pRTlJRV1VTWVZUWFRTUVRTVVVZWVheWl9hXVxbWlxcYGNcXWJjZGdlZWViWWBhY2FiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVJNWFdVVFZYV1daVlNcYFZXVllVWFRRUEtPWFNQTlVQTlFOTFNQTU5VU05RTk1OUVNQVFBSVFROS01PUlRUUVFRVVdVWVpbWlNVUlRYV1ZZXFNPU1RXVVRZVVZYVFJRV1VWWFxaXGBdV1lfXV5dXF1gYV5bYmJjaGdmZWJYYGBiXWBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWU1RPS09WVFBPVFBQUU5NUlFPUVhUUVFPTU9SVE5XUVNUVU9OTlFUVlVSU1JUWFZaXVxaVlZRUldYVVtbVlBTVVVVVlhTV1dUUlFYVlZbX1teYF9WX11eYF1cYF9fX1piY2VoaGVlYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVVFPVlxaWldbW1xZWltkcW1oZF9bWVZWWFJNTldTTU1ST1FST01QU1FVWlVUUFBMUFdVUVZSU1JYTU9QUlVYVVRUU1RZWFteXVxbVlJPVVZVW1tWUVNWVFZYVFNYWlNSUVlXV11fW2BgYFZiXGBhXWBiX1xgXWNhY2hpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFVTUVRRUllPUVNTVltVVlZTVlpYXV5cXF5WU05UVlZbW1VRVFRVV1hSU1lcVFJSXFhaXV5dYmFgV2JbY2JeYWNfXGJhYl9kZ2llZ11cZGBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSWFNUUFtdXl1cYFxgVVxcaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVFJOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aWFFUVFdYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXl5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVldWVFRUXl5gX15iXWBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVUk9XUVNXU1dVVlteWFtZVVpeWF9eWVxZUldSWVhZX1lZUlRVWVlZVVdZXFVUWl1dXmFiYGVkXV5dXWVhYmZkXl9kY2BcZ2VoZmRiYGVhX2FhYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFNXVVRSU1dRU1ZUWFhYXl5YXVtVXV9YX19YXFZRWVRZWlphWFtUVlhbWVpYWVlaV1ZdX2BfZGNiZWVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaV1RcVVdXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJWVVFTVVdbW1xfX1pfXFZfX1ldXlleVlNZV1lZXGJZXVVWWlxaW1paWVpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkaF9nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVZYV1hdX2JhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZVU1VUWF1dX2BgXWFdV2FeW15cW15YVlhXW1pfX1teV1hcXFxdXVtaXFdaX2FeYGVkZGZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpZWFpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVVdYV1ZWV1ZdXV5hYmFfYl5ZYV1dXllcXVlYVVZbW2BeXF9ZWV5dXl5gXFpaWVtfYl9iZWRlZmdoY1plZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdZVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW1xfXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVtZWVdaWmBeYWJjYGFjX1xiXV9dW15dWVlUWF1cX19eX1taXl5gYmJbW1dbXWBiYmNlZGdmZmdlXWVnaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYmBjYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeXl5aWFVbXlxcYWFfXVtgYWJmYl5bU1xfYGNkZGZlZ2dmZmZgZmdoaGdkZGBbZmdeYWhoY2loZmNgYmBjYl9fX11dW1pbWVhYWFZaV1xbWlZWVUxYWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIeJh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t8e3x8e3t7e3t7enp7e3t8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycnGDiomJiYmKjI2NjY6Ojol/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vboWNjIyMjIyOkI+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXp5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6eXl5e318fHx8fHx9fX1+fn19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnZ4eXp6en55eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x8fXx6fXt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnx9fXl9enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+fXx8ent6d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt9fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoF/gIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp6enp7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYKCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGCgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgYGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYKCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKCgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qKi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhIWCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYWEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHR3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uIioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLioqLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGDgoKBgoGCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgYKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWFhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4KAg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWFhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+NjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYGAgYGAgIKBgoKCgYGCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCgoKCgoODg4KDg4SCgoKDg4OCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWEg4SFg4OEhYSCgoKDgoKEgoGChoWDhYODhISEhoWEhIWCf319fX6ChIODg4ODg4ODg4SEhIOChISEhIOEhISDhIODhYaFhYWEhYWFhYWEhoaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoaGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4eGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CBgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIODgoSFhIWHh4WEgoB/f39/f4B/f3+Af3+FhYaHiIiHh4eHiIiIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aHhYSDhIWGhoWFhYaGhoeHhYaHhoeGh4eHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChISEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIh4eIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhYOFhIODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiImKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWEhIWEg4KCgoKCg4F+fX5+fn5+fn18fn19fYOHiYqKh4eFhoeHh4eIh4iJh4iGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoSFh4aHhoaEgoKDhIKDhIWCgYKBgYGDg4SDhJGSkY6PjYuHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWGiIuKhoWGhIKGhYGEhYODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GCg4SFhYWDg4WEhISEhYSFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYaHiIeGgIGBhYODhIWEh4iFg4GAgIF/gYyGg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICBgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx/h4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF/fX1/gIF/f35/gIB/gICAgX+AgoCAgoKBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCBf3x9fX59fX6AgH59fn17fX6Bg4OCgoGBf319fn6AgIB/fn19fXx7e3t6enl6gIB/fn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36AfX1/gYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZKSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgIB/f36AgYSDgoKBg4SEg4SAgYCAgYCBgIGCgoOBgIF/gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf39/f4GAfn9/gH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKBgoF+fn19fX5+gH19fX19fX19fHt6eXl5eXmAgoKChYOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4KCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeIh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgYB/f359f35/gX+AgoGFhYWGhoeHhoeHiIaHh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgICBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgoCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYmJh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoOEg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgYCCgoCDg4SEhISEgoSDhIWChJGRjYuMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4WFhYWDg4OEgoGDg4KDgoKBgICAf4F+fn5+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjYiIh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/f4B8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICBgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX19fXx8fYB/gIB+gH5+gpSRi4yNjY+KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317en2AgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4d/fXx+gICBgH9/fn19fX1+e3t9f39/gH1/foCMkY2LjI2NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19fn9/fX6Afn5+hJKMjIuOjIuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gISDgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKAf4CAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn+Bg4SCgYKBhYaFhYaGh4WChJGOjIqJioeHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn59f358fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJiomKiYWIkY2Lh4iGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uKiYyQjYyIiIaFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+MioiIhYSEg4GCgoKCg4KBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6AgYOHhIiNjImJhoWEhIOCgoKCgoKCgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKFhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn59fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiYyJioeFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB9foB+fX5+gIB/gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX1+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX59fn59fnx7fHp8e3qAhYKDhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn19fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBf3+AfoCBfoCBf4B/fn5+fn5+f35+hYWAgYB/gIOBf36BgH9+gH6Af359e3p7enx7eoKDf4KCgoKDgoOCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3t6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OBf3+BgYCCgYGBgICBgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fn2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSBfnt7fHx8fX19fn16fn1+eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChIWGg4B+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhIWFg4ODg4ODgoGCg4KBg4J/gYB/f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH99gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGBgX5/fn5+fX19f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgIB/fX5+f4B9fH59f4CBgH9/goB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYOCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39/fn18fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKMenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt7fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKAf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+BgIB/gIB/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGFg4OEgYGDgYKCgoGAgICCg4KAgoKFg3+BgH6Cg4CAgYCAgH+AgH+BgYCCf3+AgYB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX17f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgoGCgYCAgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4KBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYKDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH96e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnR9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn91dn+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoKCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISEhIODhIWEhISDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx8gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgIKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+fX5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fXx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYuJhISDhIWFg4eGhoSEhISFhIWEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeoN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgISDgH99fX59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfH9zgoN/g4N9gX1+fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeHiIaHhIaGi4mFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISDgoF9f357fHt+e3x8fX9+fXx+foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFh4aHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGhoWGhoWDgoWFhoWFg4WEhISFhIWFhIWFhIaHhoaFhIaHhoSEhIWDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn58fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHhoeGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWEhoaFhIOEhIOFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4aFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEgoSDgoSHg4SBgoSEg4GAgIB7e35+fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH18fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoWHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeFhYeFhoWGhYSChIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eGiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODgoKDhoGDfoKCg4CDg39/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaHhYeGh4aHh4WEhYWDgYOCgIOFgoN+gYGBf4OBf39+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYWFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHhIeFhoaIhoWHhIaHiYaGiIiHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFh4WHhoeFhoaGhYaGhIOEhYGBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaFhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4iHhoaHhYSGhYWGhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OEgH+BgICDgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyIhoWGhoaFhYWEhYWEg4KBgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCg4N/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18f359fHx9f358e4iFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg39+f4B/f3+Df3uAfX1/gn2AgX1+gX59fn19f3t/fHt6eXp6eXp6fHl6ent7e316e3t7fH1+fX2BfX18fH2Af318hoOGhoaGhoOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaGhYWHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIN+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHx7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5+gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDg4SDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f399fXx8fHt7enp6enl7enp6enp6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhIWFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318e3x9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo7ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1NXU1NTU1NTV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2tra2dnZ2dnZ2dra2tra2dna29vb29vb29rb3Nvb29vc29vb29vb29vb29vb29ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqJkpmYmJiYmJiYmJiYmJiXjIuKioqKioqKioqKiouGgYKBgYGBgYGBgYGBgYOLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTUWJsa2tra2tra2tra2traVVTU1NTU1NTU1NTU1NUS0NDRENDRENDRERDQ0NGU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1ZlcG9vb29vb29vb29vb21ZV1dXV1dXV1dXV1dXWFBHSEhISEhISEhISEhHSldXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJhb3h3d3d3d3d3d3d3d3d1Y2JiYmJiYmJiYmJiYmJcU1RUVFVVVVVVVVVVVFZgYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Pzs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy83Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzLy8vMzMvLy8vLy8zMy8vMzMzLzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7O0dTU08/O0tTPzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tfX19fX19bX19fX19bX19fX19fX19bW1tbW1tbX19fX19fX19fX19jY19jY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7O0bCCg5PN0qig0M/RpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8mburibsLeeo6fWr5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9HDoo9/icWempOdwJ6YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv56KqNO+mKGctJicop2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P0bqkrZyhtJmWrbmGnpavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz9HAoJ6TqZCbgaCWeJuEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0qawrp+An6iInHmfqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHJ18ScgrivppyKva2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXFjZ6gn5mnl5edpaeWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HJwaGtoaDBoqukm9Cfq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09WrjY+p2MWQjbfXwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MG+1dLUx8PW0tXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHU1dLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ubm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMj4+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxkY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGdiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3Npc2NpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bm1bYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtoZ3VaZnJ3c3hmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3YmJgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lodG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMXJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZHRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8O/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7q9wLm9urq0v7i1t7Ovu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2dhXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdWl5cWVFFRENNSUFEPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG1oXF9fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d21wYF5lXVtUSjw+P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3srKytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdTkhBPz1IQ0ZNRD83NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNcZlhcXVJOTUE+SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKx77AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdWmpUXVxPTUhERkxBRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubS0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIP0hRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7W8vbiyrbOwr6yutraytLSvqqSenJycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclJCMjo+Qk5CXlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFBoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6avo6+utcG6tbeyt7aytKuytK6qq6+wsrOtpZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsKOlp56gnJWTj4+RkJiQlpWYl5+Ym5mbo5mXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7REA9Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkZaXmZmcoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZaal5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh6YGJSVV9ISUlLU1RJUlBMOD5CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZydmpSYm5qRjpGVkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrbGxtKmxr6KZnJ2eoZibm5qYmZuUlZqWmJyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1pZTVFKTk5VTFJMQTc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho56doJ+joKKvrqyvsay2p62xraamsK6trLCnoJ+ioJeRlJyhnJmYkpOfnaKkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwp6uosrW3s7essbSjoJ2ln6uhoaKgn5qYlpWfm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpyhnZ6amZKZnpyioqCgnaKfn56fqaunrKmqtKurraulpauoqqyqpZ+emZKSlJiZlpaWjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oauiqaixqaqop6eamZ2aqqafmaegn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pd21obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5iWmZ6bnKSfn52knZqdnKSipKOiqq+sp6mjoKGsrq6qq6agnp6ho56enpudnJSTlZSenpiUhp2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK6nsa2xwra4wsbAyMrAyr+wubm9ucK9uLO7xcO8wru3s6myraqztK+zrqmuo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3VycGdXXFFFVEhESU9IPkVBM0VIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpZ2Vm5ufmp6cnqWmp52goKuxrqekpKOgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczLzNLHvr/Awr3HxsK3w8nIwsDFvrm0ubq1urewtbKqurGuu7a+u7qqt6yqqri6tLuurbijpaKep6Wio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGlveGplWltGSkxERFNMREJENzo/OzU0OTk3OD4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZqdnZ+fmpeYl5KMj5aXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXR08zTz9PTzMrCxcbGysfOv8jQy8bExsTAu8PAvr6+tb2zrb6/wsPGxMfDrb64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gm5mXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LU1dPTyMzHzc3J0szN083Ex8nJwMbLxsjIxb7Cs7PHxMvKys7Fyb+9v7zBx8TMzMjJv8O/rbCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/enJ1dWdiZ3ZpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyblqmWjZeNjI2XprCupZ2enaGloZ6blZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HS1NTSz9HD0NPW19XW0svJztDLxs3SydLV1tnV19PW2M7Syc7RzM7Qy9LPv8fGycPLy8vOz8XGx7a/yb/SzMvPxcnHv8PCx87M0NDPzMrHzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHdzdm9jYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmq5qjsLGpqLXQ1Nfa0sfGy7S2wsaytqmipaahoqu1p5qxoZaVjJCmrauclZihnZuhop+cnZuVindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNHO09fW09XQz9LT0cnT0cfQ2NfY0dfS19nV1szOz8nM0cvO0L/FwcfFzczQ0NHIy8zAysvF087LzsjEycbGyMvK09PQ1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66qqqyepq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOjtqqfnaGqqaGYlpiam52hnpqdnpR+cmVjYl9fYV9fYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0crPzNPW0tHWzdDV1dHF0dTK0NTV1s7S0NjY2NfLyM3DyM7Mysu/yb/HyM3Nz8rQzc7Lzs7Hys/Qys7KwsjGyczKy9HSzNPR0M/Pyr3IubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bua2JlbnBhV1xaSUZGRExXRTtAPDMzPD04Njg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snnri2tbWtpa2uvrSxwNnS19rc1s/Ny8PT0MLCsqutrqyms7G4q7O3qaOfnJaUl5uen5+dlJaXlYlsXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztPLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHTy8vP0dPJztHV0tXVysDJwcXMwsjJwszCxcjJys7KzMzPzdPLxcfPzMfHysTGwMXJy83P0MbPzs3NzM/Fx8C3ub3Cw73DubKzvrC7w8S1qZiloZmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbWhgYHFoWFhoVk1HTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfDucvV1tna29jNzM/J1tbFxLiytqqkrqy5ubGywKGXjo2YlpCTkpGWlpaQjHxlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycTJycbGv8PFzs7HxcfNytHIy87NxtHSz87M1MrHys3Ox8fP0svQz8W6xL7GybzCxsjOxMLHwMbNx8PLycvPx8PDz8jGwcbHw77Ax8vLy87CysvIx8vPxMXHu8fCyMjCz8C9vL+wwcrHur2qsLKnpZ2inJiQm5CkmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrQ0NLUysW6vr6wqLervrm5s6WSjo6WkIaDhISCfoWFf3RgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6v8O7u7q5vsjGwsPAw8fKycjKx8HFy8bIy83JxMLKycHCy9DEy8i/ucG6xce9v8bPysO/w7rJx8i6x8bEysC9wcvGxcO9xby8v8PEy8TEvL/JwsXH0cXAyL/KycbHxtDDw8bDr8TLx8TKt7+8urSprKWlmJ+YrKOhpZqjoJuUe3ZydGZpWmFubVpbWFFETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPHzc/OzdXQ1tnY2dDN1M7P0MvEuMbBtrW8scC3uq2RjJOXh3uAhYaAdnh1cnBfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbBsLa6srK0srHBvLu7ubjAwcHFvr25vb+5xMrFxsK9xsC3u8TJv8LJu7e6usXCvrzBzcLGvr21wL3DurzGu8K5s7zFw8LCtr+1tb6/usvDvLW6yLq/vcvDwcXCxcjFyMXQxsLMx7LGycPOzcHFwr+9srews6eoqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRkJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc7P0snRxtbV1tjOzNDIzcjKxb7KwbK1ure7trCRjYqLhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rAuK2wsKeqraynuLS2tLOys7q1vbG3sLSusrvCvMHEvL+6tbK6vsC4x7i0u7XAwry3vcbAw7u0rrK2ur6zxLe7tau4vL3AvbC6ta+2urLFvLauu7+0trTFvL7Dxb/DxMXHy8XAxsa7x8u/z8nHw8bBw7fDvr22ub7Gv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkNBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLyczKy8bRz9PRz8jLxsrGxMC9z72zub25uLecjoeJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7m4tbCrrKeeoqqnnquss62pq6mzrbawsqiupqyyvLq2w7m6ubCrtbm7tMK6sL+wvby7tbvHucK2raqosLHAtbi8r7CnsbO0u7yrrbWlrrauurGwqrmvrbuuu7i7v7+9ucK/xsLFwLzGwcjLuMXHxb/Hw8O6xMbCu8XJzMuzucK8urKIcnZ2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs/SzMTGwcXQyM/CxMfBxsbFxczEy8zCxMHIwbq8u8q3tLy9trWrkYmQkHx5foqFenuEgXduXl1dXV1fYF9fZGNiY2NiYF9dW1taWl1aWlpaXWRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauto6eiq6msqrCjpp+qrbW2sb25r7evqK64tLS8uLO8rre5tLG7wbHBrqWpoqyxsrOnvKqrqKusrbS0pqiuoaSuqbKlp6iupai3rLCyt7m6u7G8vb6+xL+1wcHHyLe/wMW3xMK/u7/Ew77EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWlJTS0ZGRT4/QDk3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwLzKucDGwLzMusPHxbq9xL66t73Guba5u66ylYOJjYF7foB+eHR/fHN3Zl9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSepJuXkaGjqqOin6Wlp6Ssn52bpKassq+2t6ewrKeqtKu0ubC2tKy2uLGvurmxt6Sfo5+nsaerqLmqpKanqKeyraCnpp6bpKasnp+npJ+gsa2trLK0srOwtby2u8HBsrq+w8GyubrCs8C9v7W4u72+vMLHxMLDvr/DoIN3cGthZV9rb2BVWV9ITmhPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelJ2hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu3yLu3xMazvsW8t7C5wLuxs7ewooSHh4J9eXZ0b21rampxaV9gXVxcXV9gX2FjYmBgYGBdW1tbXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm5+fo6Whp56aopufqrCtsbWiqaqpq6yktbitt6+ssrSusrSusKqfnZ6jorKkpam4raGmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7KyubK9tLaxsbW0v7W9wL3Dwbq6vZeCenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDJycHHvLzFxdDAvMq7u8G7tsW4tcHBs8LEvK2qtbq3qLGzqYuGiIB5c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFdXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaQnKGhqJ2bnKWmoaSbn6CamK2ura6yoKWiraunobWwsbGsp66yp7mzprWhop6ao6KtoqGptaqio6adpaajlpiel5ianZ+Zl52cnJusoaumo6Smrauys6q0sLKqsrm0r6mvsrKyt7Otqayusbewura5vb+2srGUhHl1ZV5lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va20uMPNycjBxrjCwcjQusPGwLa8vbbDura/wbW7v7uqprG7saiyr5t9hYWAeXBxdHFoZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnaicmpqqpq+wq5ujo7eqoJ+uqLappqassKO3sKO2oKKbmJiqpqGbrLivoqGknKGfoJOVoZSWlpuYl5aXnJSfqZ2po6Gdo6qqsK2otKuqpq2ysKWqrrKxr7Curqenp7KusbSvvLS5tq6jlIF5dWReYVZZV1NSVEtNXkxQS0dHTEtFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcWxv8C5wMG6wMC5ur23qKixu6apoqWJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKWmnpyfpJ+qr6afoqO2qKChoqizoaWnpK+lsKyrtJ6gnZWUqaGhlKyxsJ6iop2emJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpKukpbCnpaOrq62lqK6vrquoqqqzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFFHUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKett7u8wcW6sbm1xcrLwcTHx8m4yMa1xcLJr7q8wrzDwMG9vLe6tqansraeooqZiIB3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVVNUUlVgYF9gYV9gYWNkaYGUk4mRjpSSk5yUlZajmaCWnKCloa2lo6Oio6GbqqqlmZ6lsamgoJ2kqp2noZ6srKmorayioaGUl6ObnJCrqbCbn6KenpeYk4qeko2Sk5WPmJiSm6GinKSgoZWgoaOlm6OrpaKkqqOrrqStsammpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlVRRlFPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7KwrLKtnaenr7m5s8DIurXAr8bJzrvCy83Jt8u/tMDHzLC2vci7wsfEvb+3urWlq7CunZqHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eXl9fYmRtjo+EkYaPkY6Zk5SSnJqinJugp6iqp6qlqKSjmKSupJSZpa+pn5uYmqCerpmbqrOfpaaeoqOglJOblpWSqKmtmpygoaCalJCMmY6LkIySjJaUkJ2hoKOcm6KVm6CioJeiqKOiqKugq6+krbelo6OirK2pqKuvs7iyvbWzq6+Yg3JyaFtYWVNVUkVZTFBcWU1UTlBMUFJJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62os7auqaivrZupqKy3tqy8yru2v6zMx8a5ws/QybXGvrq+xsu1sb3FvcPGxL3Bs7mvpquvq56XhoF3eG9uaW5ubnFnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/i5CKko2XkZeZoqCbn6qppq2qpq+ip5mfrKCVlqSop52Xj46Zna6Wl6eqmZ+dk6WgnZGQkpKSlaeqpJmZmp2dlo2Mi5SGiI2DkIuSlJCgnqCjl5WflZqgop2Tm6Wlp6iooLGwprG8p5+jrLSrraewtLC4tcCxrbGrkH1wcmJWVFVOUklHVlFTUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqaisKudqqepsrGktsa0ubqzy8a6vMPL0cyzubq+wMTHtrS3vbO7vMS+wrG0rrGusaycoohraG5vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWllZWVxcXWFqgHp/domOh5CJmImUlJebmZ2om5+qpKSqnKeYoKWbko+eopqXloSDkZqjj5OinJWVloehmpqTi46Kj5mjp5yVlZebkJKHlI6MgYuNgJCKkpKRoZqfoZWTmJiVoqWYjJmkpqimoaC0sqeyt6Gdoresqq2ksrKmtby1q6uxo4h4cm1dTlBRTE9DTk5OUEtGTk5LSk5NUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKmloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOzrrairbXEuruvqqy0r6+gl6h9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnCEiIKHgJGDjoqUkZOdoI6am6Kgo5iklqGblY2HmJqMc42CfY2WloWQmZCTjY56mI6cjIKKf4mYn6KekJOYloSOgpN+fnOJjXqQhpKQkJ2amZqQlY+djqKjjomaoKGko5uitK+sr6yfmKW5pqWwobCunLC7qqmvqpmBdnJiVkxRT1BNQ1NOTFFNQ1BQSElOU01ISkpESkxFS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd3t6GjtKilpaijpqWmpqazp6W0wLiwtLDKxrm6ws/Hv7WvvcOvsceyraeslaSuv7ixsJ+nra2rlpWicldWX2hnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeKk5Cel5yVlJaUjpaJf5OJXztXb3uLk4l/i5GMj4WGcoqEloF5gnqFk52Ug5WOkI+Chn2SeHFvhYx9iYCQjY+XmZiTio+InIiel4eHlp6aoaCXp6+oramonpattKKmrZisq5ins6GpraOSfXFtX1pOU1FWTERUSlBNTEZPT0lFTFFNS09KSU1QRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5eLego66hpqaqoKepp6KpsKintMG5sbWwycO5tL/PwLqxsbjEq67Jrqejnoaborqtp6iWpqWkoZePlmlRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXqCdFBCQH+VkZF9iZSMhIqNmoyWlYqSiIaVhnmIf2BKUW54ipGEfISMiYR/f25+f5R3dXZ4hI2ZcFGNiIqGe354lHZnd4WHfomIlYqNkJKWi4OJh5SEmoyBhJKblp6clKSjp6mlo56bsauhpKSQpqqWoamcoqaoiHRrZV1bSFFRU0xJVU1TSUxMUElHRktOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXa2nKKnnZ+hrqGnqKWnqK+sqra8tri2s8K8t6i6ybm3qaq3uK22wKqim5ODj5myn6KajaCWmZSRi4xlTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgXuFjJKBkpmLj3uGj391f3hzbnVwdI2NgXl9iaqFeXpodnuOcHJteICKjJJ4eoB7gHZycpJ3Z3WEhISEepWJiIqMi4B/g4qMf5ODe4CPmJSblZGfnaien6CeoKmln52YjKekk6CflZ2epH9xZ2BcXEpWT1FHS1hST0pMTVJKSkpNUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLi8yMDAvLSsoKCkuMTI2MjE5ODc5ODc3NTo8PDd2rpijoZicnrOpr6mlrKywsaq9tLK8uLa6tbKgt7uzq52fraustbOlnpaSmIaUpJadjIOXiY+JhoaDZkpJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhZWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4f4mPfISYkoFyh498dntva36tfHOQin97hpKAfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcWhxgH2OcEOKhIKDhX53d3qLhX2LenV+jpKPmIqSmpujl5mdm52eop2WjYqkm4+dl46WmI51bWtlYVlXWFRRSlJVVE9QTlFWS05LTk9KUU9JTk9LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKavrK6rp6mwr7GsvLisu765s62om7GorZyQl56nrKekm52TiJZ+jpWSlYB8inqFgH9/gWVKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFdZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZZ/SZKYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmhtcH5zjYiDhXp9fnt2b3RzhYJ5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5GKkoyGkJZ9bGhtbm1XVVdUUVFZT1NVVFRYVU1OSE1KTU5LQ0lOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6kra+iraqota+urLS/q7zCv6ajmpWlmJ6OhYyWoqSbmpSXj3aRfoWLkI98eH50fXh1d3xmT0VHREA8Pj5BRkdHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4h1gYiGdGyZkXRze2prnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3xncHB7bpKNjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdjV1FZV1hZW01QVVZaWU5JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LSs1Nzc1NDc4aU84OzVukoiZkZqWpKitnrKeprquq7KwwrK7w8ebl4+UmYuOhnqFkZqWj5KOkol0ioR3i4+Mf3Z3dXh2b3hzaVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bXGDgYWBeYSGhnlyoJR0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8hntzjK2NiIBoZmJpbXFtb4N1aW9YdW+OmpF2bH96fG1xbXB/enN1bWJ2hH+GgIWQkYqLiZGLkYyLj4N1eIuPgH6CgH2PeHBubmpeWltdW1lYYF9TTltaWVhMSEpGSkc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qK2xrsGzusHGl5CMlJCBiX1ugpGTioSLiJCIdoSFb5iKjH95e3txe3R8a29eSlBHPkA3NDU4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8fYWDf4x+dqKZeX6GgISZhZucYYaqn52LgpCNenaJfomHjnOKl4+De1xkcXR6e3eKbGdpYXlvhY+Cem6Bd3OEenBzeXdrbmldd4d9h3yIh4+Ai5OXg42GjYZ9cYR/hHx1d3t9iHRtcXJkZV5aWl1TW2ZeWFFVWVxWR0tLRUxHP0ZAREM/QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgqp+wqa/AsbvGupaPkZSIeoZ2a4CMkoN+i4WQjXmEgnWiho1+foKAc4OBfWx5bFNYTEFFMzExMjY2Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXtxfI+Me3yJhn6Xh3ahmYiHj5KUpY2sqUiGra+vioCAk4qCi4KEkaiHgJiYipxzbHyBhod9jmhnZ3h+bYWGgYVxhIZHa4B3cXl2aG1rX3d9g4h/iIWMepWenIqLiZF/e3WLdnx3bW93fn1xcXBqWltbWmNiV2dlXFVQUVhaUURMTEdPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6CdrKGmuK+zvbSXjZKLmIt9dHB/ipN/fo2DlJV9hn+HpYeJgIOIhnmJi4B1hXlfY1ZMQzYwLi8yMjEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiZGBmpaCoKGYlZuapa2Tmbuxp7vHw6eKjKGljpOJgZB7coOen5GcfnaFhYuPh5BpaG+DgHSMhoSLcYaCd4d/e3aFfW52dWeBlI+GiYiHiYihq6OWiY6YgHuCiXp6b2dreH13fHFpY1xZWVxoXGFmX1pPTE5YU1FJUEtETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGQj4uamqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWfoqBkpuOhIGCjIuCio6EgIqAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6ChkqOppaOsk6i2oqfBwq7Ir3i6lJp8jKGemISThIKPoZ6TmZKEioWPmJCWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGXh5OJj5CXpbapm42VooOHk4R+f2tqbH1+fX9xX1tiXllmalxsa19YS0hQU1FOTUxGSVFERE5GQkNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafoWTknqBkomSkn2LhZmSkYOBgYuOiYaRh4SIhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMm3yNHPvpugcGmrqZ6Ek5GFnKCampmnkZGIlaGZmnd6fpSYkaGSlpeBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ2RmaiIl5COgYhsc3N7fHluZl5bX15hZ2NfZ2dcUkVLS1FPSUpNRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl5QcXVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mImI15go2Ljo18ioaPkI6Bg4CJjImFk4WChomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49RkhAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKiptayxt7Kyrbuxs76cs8Ssu8nLuMO/t6WjsLKsraqjipaYhaWmoKKYgqaZjaKqp6SHhZOjoKCqoaSpjpyxi5Wjp7e7nKGjsJOjnaOekaSiq7Cus7WilaaqiZqKkoqVent+g3tlXmZaY2BdYmJeZmdfW09ESUhUT0ZITEZLR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMj4uKe4iDh5GOg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJTVVVXVU1cUUdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHxKuzxbattMCzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4mnr6qklXefpJehq7GzmJapraiutbuyuqyvtaKxrLK1vLi1rrWgqKijqJupsK2zuri4qJy4qY2lj5KToIZ5gYByV19iVWRgYGFeX2ZgW1VKREVMVlFJSkpFSkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFjZFd6dXGBlX2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYeFgY6AgYqPhoCGiIWKh5F6eW5dV0BFTjw2OjQ2QUI3NjQvLzZDSENRXE9RVVhVXFdPX1VJS0pBQD5HS0ZGRDs+QDdENz9CSkpFR1dUUF6PpK2ksrTDtrjBzMq2u8S9s7TBt7jCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqxoKKWm6KSpbGtpa2sp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6uL+4uri6ra2xprGqrr6wvbzCw6yZu6iVro+YmKuJfoB5aFVhX1ZoY2hkVltjWVZUSkdHTFJHRElKQUlEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Fb3tyeIhiuaGZo4mVlJaTlJSOkJeSh4d7h4GOloqBhIGKenyLiIZ8ioKBi4SVfXh6dWVPXGRHRUw6UWRgW15TRj87SFBEWmNRUVlZWmdaU2BhTVNPRUE/SUpIRUZBQEM8RDZCP0hHS01TWlRelK+4tbu5ycC7vcrNvLzBvLi2vLu3vrW6s8ZhdbKlsZqeq76qpairqqSisrWgq6eelZaemJ+upaenpZ6jk6KnsLOosbK8tsG908nJ08bCxczCysPBvr6/vLy4tLC5t7fDusa+xMmwnrqroqyPpam3iYB8blxeXlxVX11nZlNZYVZSVklFRk5LQT5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGPjYaQc2xycnSI1cC1mqCNlZmZkY6XkpaWjoaIfYeDjZaKfoJ/g3l7i4SHe4t5gYqCl390fXprZXB2WV1cUGVlYmBlZF1bWFhcTWRtVVJtbl9vX1hnZVVZVEpEQktLSEZISEhIQkk5REBIS1RUVl1aXJO5wLm+uMbBu7nKy7u2ura4ubS4tbWutreZZHWpnq1wXqKtnJihopuknqullJ+fkJSOlpiXqJ6mn5+amYOjnaykqrCst7C8uNTQztbPyczSzM/OysfAwMLKvcG9wsDFxMbKwMnPtKS8sbWwnKy5vZp9dmlbXFlXW19YYWJRXGFUUkxDQkZHRTxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQi4l8gYRze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWhgZmlpbVptdJetpL2Ih2dbb2hdWllUSEtPUEpLUExTUUhMQUpGS1BfX2JnamKXt8ewurS7vraxxce2sLmxsbuts7Goq7itjbaonpynmk6anoyPoJaRp5illYqTk4iRiY+Rkp2boZiblJaHnpmmmqyvqK+ns7PU1NTW0cvP09TO08/MxcLK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8Sif2thWlpbVl5WWWNZUF1YT1JDQklFQ0k7QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYNocm95eYOhqp6ml4ybm5iLjpWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2lucHlpd31+y7/D36duY3huZFthYEpQUlVOWV5QXV1NUU5UUVVUXG5ud4Nylq64rLWosLarrb3Bsqu1pqW5p6yvoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSLg5SVl5eUm5CbmJmZnp2rrKSnoqysztLV0c3L0tPT0NTRzsjD1NHIztLT09fN0tHF0tbGwc/IyMOpv7jQnHZrYlpfW1ReUVxZT1BUUE5JPkFHQkNGPUFCP0ZFPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBvd3Nsc318d3xzgnhxa4Bycmlwcnp5cnu+y5p/jbKEdnKFd2lhaV1DWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGppqqxuaumtKOirqKkrqKnsZ+JppuVk5GKko+IgpSJa5WijZmEgYZ+kYODk5esi5WOlZqOhZKQnZensKKgoKWkqMjNz8fCy9HT0dTSztPNxtbTzdTY1tbY1dfVytTazcrY1tHLrcTDy4hvbF9cXFZSV1JaT0pHSUpKQDs6O0VCRD1DRD5IQz9DQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYiIi4l+g3hzfH2Eh3eAe4eRl4GEb3hxbXV/dnh9dIZ8eWyHdnRufXaFdXl7nbWMPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhrbmlugYOJkYyen6CekZeZoKOkprKkpbKgoqWfoqmhorGch5+SkpORi4+Lh4SPhH6cnIyNgoSFepR/gqqWo4ySi5iTi32XipqRqrOYmpynnKa9w8W4tsXN0dDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR1c2thWldQU1BYVUVHSklGRT06NzpAQkM6SEVARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qj48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6LfoeSgomGhYqCiH14hZeXiY+Dh4aHeoR5cXt7hYZ1eoaOjp16jXB9cHB6gHJ7gXKEh4Bujnp1d319gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnBxcG53d4JlaW9ydnhyeouHj5OSm5agloiMk5yfm5+roKGsnKKamqCmn5+smYyajZGTjoV9iIeDhYuOoJmTiIOHfmyZeYSZhoiTjI6VjIZ7m4iTjq2qlJWXn5imrrW8qK29x8vIycvLz8nE0srU19jX2NfU29fT2dvWz9va0tbJ1cyTdXdlZFhXTlFSW0dDRklIPkI+PTg6PkA8Pkg9QEJBQUVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEE8OjlEP0NHUmtfbWRiZmx2gIhxkZCbgHmAjn6CgYKFf4R8fYSYjoeMf4aHgXeDeW57e4eCdHqSno6hdo92g3R1gX50gIRvgZCCb5KFdXyBhXp2h3yJuMalw8q4gpacj3hwZU5lY4J6gneFoZCLeXp3e4SAfIR2bZSWlZaQmJGDiY+XmpeXpp2YoJefk5KXo56aq5aRkYuNk4OMhYmJgYaPkZ6cmYiFi4GFl3qIiZ+Xj4mOiouCfKGJkIq7oZiTl5qcqKalrZ6ntb+/v7jGyc3Oxc3J0dXV1NnV19vU19na29fb2tnYztvGg3Z2ZGZhXVJVVFRNS0RNQzs9PDw5Ojw/OT1BNz4/QD0/Pj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs5OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eot8foB/gH6Fe36CkYqFhnqFiHx1fnVtfH2HfnR/kp2Rn4OSfId+eI9+eYuKb4ObgXSZhn2CioV8fpF7kKmPkMOgvYybpJx9iYV9iXOMi39zppqcmJSFe4+RiYRpR3GhpJ6MjJGShYiLkJKVj52bk5SRl42MlZ+dlKGVk46OkIx/kI+Oi4SJkpaZn5+IjJSRnZCCjH+mmYiFjoOGhICkhoqLt5edkZSWoaagnZ2do662ubSrwMbK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbtnZ1dGdmYlRdWVJOTkhDTEM9PT45OTs6OTk8PTZAPj89PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdPPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PERSU1JYX1ZYZm1tbWmBjopxc3mKe3uAfH98iHt9fIuHgn51g4Z6c3pzbYF+hX53hpuhm56UkoCMiH+Yh4Cckm6IqYV7oIx8kY6DiYScfpuRio2jop+RpK+gi5GLhYuBk4ZXcq2Ln6ubkIOZnJCPjluDopGCjZ+TlIyGiIySkoyUlZWQjI+KiJabnY+VlpKMk5SGgIuJko6Kip2XmKOihpOdlaCLiomOnJCDiI+Ag4eFpISLkLKYnJKUl6GgnpmSm52nsrispb3Cx83Ixs/Lz8zO18/R1K7W1dja2Nra19bZ2p1seXFjY1paVVFVVkNASUM/Pz46NDg6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieGxifpGDb254i3h6f3uBfYd8fHeGhYBzcIWCe3V3dnSFg4V9f5Kmop+mopeKnZCUl4uKqJdyirKNhKiShJmUhZqMo5agmJOJm56ik6mwoJGVkY6OiJaMb423hJrEyLKcoqacnJiWkbGQZKTNx5WOhoeJkJKNjZOVioWKioaWmZuPkJSTh5WYhICPi5mIjpCrl5eko4iZnpaaiI+Hl5eKhY+NgX+Hj6WIjZOompeTlpihmJ+Zk5yaorK0paO8wb7HxsXIyMnCytPMzdSo0tHW1tbY2tTT2s5/b3tkYFtbW01IU1lCQUdEO0I+ODM3Ozw6OT42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGOfXxtfoh4en57goKDf3d2gIN8bW6Lf3t9eHh8hIeKfouis6ejq7Oil6efpaSWla6ig5G4lZKzmoyhoYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmpehwI6jybirnKOmrZiSm52ynYWGqKOcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4eUmIaEkZCcdZGZspWWpKGHnJmSkIuQipebiYuWjoZ9jJieiZCQm5qak5iXn5OgnZSem6CxrqKjt760xcfEvcPDwMbNysnTps7M09LR1tjT0Ni6b3ZyWV5TXVROR0lNREFDRDU+Ojc3Oj88PDc9NDI2Njk3NzQ+NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdNWlxZSmZgO0iEi3p6boWGenyEeIGGgX5weHx+fW9zjXp+gnx4houJhoSSprusqLG9sKWts7Ooo6KwrIqatZ2juKWVraWXqa24p6Sjn5qpmKqkrrCqmpmclJaRl6CYmru7rsqhara4q7CUmZ+jrJOXvqNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJWNi42WmJOdmbSWlaudipyUkY6RkoyZm4qSnpCLiZafoYyUjZeZnZKbmJ6UoaCUnJ2lrqihpLO4rMLIxLW6vbzFx8fC0aDGyc3NxdfW0cvTn213ZVlXUFtPTkVDPjxCQUI4QDg4NT9HPTw1PDM1MzQ1NDU0QjQ5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicEpAi4p+gHOGh32CiHWDioJ/bn18fX9wd4d3joKHfI2PjIaMmanCwK+9xruztMC9tK2rs7aMqLKurr2rm7ulp625uKumpqKipKOpr7Kxqp2cpJmbmJefoqalkqS6r6nAvK2usrmlpKh+iIacrb2wgouMi5CDjoORj3qBiJCNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpePkaCRiZSbpKyUlo+TnJ2ToJ2bmJ+hlJqep6akoqOwsqbBxsOvsLq3xcTDv82mx8THxL3W0M3EyoVwb15ZV1xYTEpBS0BFRz5BQEM7OjU+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVONzlHRD9DRlxlRmBpZ1pdXJOMjIl7h4yHg4x1h5GKgW9+e4J/cX6Be5V6kpSUmJCTlqezxsm/wczCw7nHvbuvq7m7mLO3urLArqXApKuvvL2qrqujo56nq661sKqcoKucoZyWn6+1p4ujurq2wbysqZ2zpaSolIWNqsPDpIKLj4eIhIaVlI15g42Rj5GhjIyUko6Jl5+Yk5mVl6agr5yMq5yNlo+RkZWVjZGVko+glIaXn6CynpSZk5+gmKSemp+boJSYnqWjpqakr62lwMTDrqi3tsnDvrbPssS/xLyz0crIwrRxdWlZVVlnUUxIQkxLS0pBQj1DRDw1QUU7OzM9OEIzMzIyNjJBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGZUYmuZjZaKjIiTkIaJeYeUkIFygHuNf3iHgoKQeo2hlqiZmpm6vcfIycHSycvCzL3Cs628vqi6wL27xLeswamss7y+qrCqpKWkrK6zrba1oZ+vn6WimKOzvaqbqL3BpLa4r6yUsqysrJeGmqmmpZGCjJOlloqBdYqSeYWOkpCeoJOPk4yPjZSjmZaclZSjnqqekaWajI+Pj5WWiHyPlZOSo5qVn6KctaWQnpako6GlnZ2mmJ2Vl5qko6mnorKsqLvAw6+ls7fMv7mvxLO7vsG4rMLDwsCXanZeVVRZWEpKTElGRERIQ0NBREw6NERJOjs0PDhFLjEyMjQyQjI2U0hPPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGJaY2NWno+cjpeOnpKJin+KoJOEeIV/ln9+kIiKkYCWoZmup6SYwr3Hw8fF087Ozcu8wrewury0vcu7w8K2t7yts7+6va6vqKCpqLatrqmyt5qeraOnoZ2rt7iqpbC/xLK9ubSoq7a0rq6XlqWsqJ+RjZKyxaeWjnySlXyHkpmPqpmYk5OPkpWTpJ2TnZmToaOinJifmIuMj46diFqQl5eSl6SZZZiin7OllaGVq6upppueppaYlpiUoaOopZ62q6m5u8O0pbS1y8C4qrarsru4rqi4ur24gGhrV1RSU01FSVJMSz9BSEVFSEdHOTVGTTs+Nz1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKer76voca8xMTGxs7PztLKvru2sbq7u77PtcO9uLm3s7G1s7izq6ecq6y5qqmnr7CYo6+lp6OltcCwrKy0v8O6wLq0p7q2ubSvlqWtrq6ki5OUoY10wpp9l5mEjpeZjLGVm5qVkpKZmaWjlaCbl5qpnZugoJmKjY+VnGBKlpyalJqlllSWr5+vnJ+klK6tqqSaoKWTk5iYjZyfp6KZtKiqs7u7u6qxssfAuaasq62ysqOhsrK0pG1qYllXTU9KRE9PUFI7SEtJR0lDQz46S1U/QTo9RU0wNzU0NDpCNDRNV087SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiqlpmgoqivmZGXh4uolo6Ik4Wgh4Sdl4+doZqjpLXJtanFucLDyMrIyMzNxr+7s665ucHBzLXHusG5tbqwr6+ztaekm6q0tKqppq2smqSupaSorLu/qKy2t7/Bv765s7LEsrm+raOvtay5poibl6abdr+fhJmdjpOamoyul6GcnJeUm6ChqJ6on5maqpqhp56YkI2RnYNudpKimpWdop2RrrKjqpSoqpepraOinqSnkZGZnIeUnaKelrGmqau5tr2ysq6+ubago6eopaacm62pqYtgYl5dTkpLRkdNSlZMPU1FTktMQkNEPFFWPUFBQkRPMTg9NzY/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5Wbop+7r5mUn4yTq5uRkpOJq42GoZ6Mo62Uo6O2xr60wLnCwsfJxcLNyMG+ubKvubTAwsm1xrLCvLW6qqitrbCjo5iqtLumqaarqp2pr6ejqqu9u6itvbW4vse8t7a4wrK+wbWqtbarvqWPo5iSoqC8n4maoJmXn56Pt5+pnKWim5yhmqiks6CbnaacqKqemJWPlJuLlomMpKGUnaKdoLSvpaSSr6uZqqqcnKOiqJCUlJ+Cj56em5WppKGhs7S6tK2otbKznpyjpZqXlZiqoZ51XVpdW0hHRUZMUElNRUdHQlNMSkJFR0FXU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OdcGJHRaeXo5+ew62cl6WYmamclpqaj6qWlaemla2smKKrtsPDvL62wcLAx8S/zca7vbmysLmzv8LHtb+wvLe5tqakq6utoKGZqqrEoqSpq6aerK+roqmpvrinrb+yuLfHtrW5uMCywMK3tbO0r72jl6OXlJyUrp+QoqOlo6OgkL2lqZ2pq5ycoZulnr2hmaOfoqmroZ2XjZWek56Hj4SNk5+koJ61rKaclbCmma+lnJmonJ6MmJSeg46gmZuSpaSal6uxtbGqpaqurJuYoKCSj5CVqJ6UZV9XX1tNSEdJTkxIRURJQT5RSUE8R0lJXFJPSz1IT1U0QkY5PkhHNUNhW0tCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1SRjxLeGVhVkuimqOcnsWsoZ6sn52uoJKjn5akoKaprJi2saKqs7bFxL2/tcDCu8jCvsrHtbi1tLGztLfBxba+sbi1ubSfp6yqrJ2enqWkwaWfqa2gpKmtr6GmqL21prG9ube2xLK0uLq/tMTBuLmus7W1o52llZKUoa6gmaKeqaiso5rCrKmerK6bm56ZpqC9oZ2kmKurrKahmo2an5KeiY5Xf5afpaGguKqnk5i0op6xn56ZrpWdjZiTnIGOn5eVjaGjlZClrbKqqaKipaWVlZ2Yi4+RkqSeiV9iWGJfS0dKSk5GRUFHSz89SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtNnp6hmZ/EqKWhtKKds6eTq6Wgo5+sqaydu7CorLaxx8XBwrLDw73GxLzEybyvsLatsLSvvsS0ubGwurSsmaixqaqanaWhp8Gtm6yxm6qjrrCppam8tqe3u76vt8Sts7PDwLTHtLu3rLO2raqippaVlaSsop+gm6eqsK+vu7GmoKmompmYk6KjuKCho5Kwr6ylpp+SoZ6Vno+QjZWem6Kep7SnpoyXspuirZmcmqyPnZKVkpl/kaCVjo2foJOLpquvpKainKCekZGak4WLkY2bnX9fY1lmZElITElTQUNASUg7O0Y/OTlPTlZeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ6jn5ygw6mkqrOipLWqlrOsp6GksqyuqbuyrbG1tMbAxMK0wMS+ycS1v8jBtKu1qK+4rL/Ds7eurba4pZiqsqurmJ+ml627tJuosJqsoK20sqirubKourS5s7jAqreyxL21xqi/r622tamnrKGYl5KmpaKimJilrriusrW2oJ+ppJqUlpSkoLeipaWWr7Gyp6umop6ampuVl6ifoJihnq+yoqaMl62YpKuWmJ2ij5qMkpaYhZWek4uQm52TiqipqqGnoZielYuOmY+BhZSIk553YmdbamlMT01OVD1CQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJb2hVQ1dGjHlmQzujo52hpr+np6+xoqm1q566sayjq7S2sbC5t7C3uLjEvcPHvb3EwsbAuMDGwLmptqSsu63Awbe3qq2yuqKUrbGtspakp5GquaqfprCcq6CvtLOrqba2rbyttLO5t6y4scO7v7+mw6uwtq6oq6unnpiZq6GioZGYobGvs6ywuZqbqZ+al5OYp6C2qaajorCxtKyzp6yfnKCgm56lnKKXnaOzr5ufkJOkmZ+omZOhnZOWiJOWkpWWnJKIkJqYlI6pqKafo5yXm5KFjpmLfYuVhI2ZaWdrYGxtV1BRW1VBQkVUQDs7SUE3OlhQZF5QV1dFWV9eTUxSTl5LSj5ZY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEtLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9p5+doqm9oqqwrKSyuaqmtrSsoK21va+zuLu6vre2wMK/ycS5xMLAv7fDvcC3rrWnq7exu72+tKmusbaelquup66XpqiOp7ufpKyznquisbCzrKm2tLW+rrGytaywtLPBusW3rL2wsberrKqjsqaepaqgpJeRmp+zqrOrq7OanaecmpWOoaaktK6ooa2urrGotK2yqqScn6iknpWimZuotamXmZKSnZmdn52QqpyVloSUloqdmJuTio2WlpqWpqWjn52WlZeSf4+UhXuNkoKLlWRrcWZvcV5GWWdWREJNWERaOUhCNj5dUWhcTlpdR1teXU9NUlhkSkpCXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVVxnSzaMemZMQKSaoaWtt6Wsqqavrreqr7W7p6axt8W3sba9wcO1tbrEvszGucPAub65w7jAuLK0q6m6trq5vrSprbC1l5inrKmsm6urjqu+nqutsqOroLGus66ttbK5uKqurrGota+1u7zKs6q3tbG0r66mobSgm6itoKaWlpuasqOtoKavl6GkmpqTjqOlp7Oqoaazraq1pa+yta+kmZ2sp5qYn5qZq7ejl5OQjpecoJeWk6qempF/kpeMnZuYlZCKlJKemaSioqCYlpKTlXqLj4V7jIqCipFqbXdsdXphRmFrWUlHWlo9e0pGRDZBYlRpW01cYUtcXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVF9UXy81KENfUVwuK0IvSkdQW0czY1lUS0SZl6GxqbKqrKakr662qbe1uqSstLfJu7S7ur+/tLO3w8DMyLzDvLa9vr+3vryxvK2nurm3tcK2qq2xt5SWpq6rqKOwqZSvu6StsbOnqKOytbGxsLWxuLSpr6yyp7evt7TExreptrassK2pp6O2oKCnsqGklZyalbGep5ygqo6po56blpimpqW4qKOytayosaeusbWspZmgrKibnJ6clKm4m5SOjoqXm6KXj5ekoJyTgpCUj5ybl5aViJaPl5qnnKSgkZaRkJV2hI+He4SBg4uKbG92dHt+XExmbVxKTmNcPmJ7R0k4R2dXZlxMXmJNWFlXVVdUaV1PT0hgXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2YyNydHYkxWJS1CLj1FTFE8M3JrSUNDkZmlr6Wur6uopbGztKu3srihq7W5ybmtwbvCuLOxtcLCzsXAwb20vb++ur68ssOnqbmwtbW/vK6ssrGboKexraamr6WdsrWtqrGxrKmotbustLK1rbStqqyorKm4rbKwyMC5pbqwqayspaiusaalo6+kqZyenZuvmqOjo6ORrZ6joKCiq6amuaWstralq6yprbC2rqKeo6mqm6Cbm5Kjs5mOio2HkKGglIyUnJ+SkIONkpKcmpeVlIeXkpWZp5ufnoySkY2Qdn2NhXx7fIWIiHBycX18fVxTZG9eTlhmXEZElltHO05tWGJbTGBiTlZXVldUWGddUVJMY1lbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6SD4zQkhTLD6QaztHSI+cqquiqrGkqaWztbK1trKyoauuvcy6rcC6x7G0rbTBw9HFxr7Asr7Awru+t7vEpqy2q7K3u8Cvq7Gsn6OnramopLCjqrKqsKuwr7Cuq7O9p7awsqmzqqulpaOtuq2qssO6tq27qamnrKmnsaWqpaOuqqiin5yjrZWlnpiemaydoqepoq2mpK2ruLOyoqqioKyvsayeoKenqZmjmZmPoKaXhoSOioueoI6KjJWajo2EhY+Un5yUl5WGlpSTl6SbnJyKkpCNiX9+h4V8dn6Fg4RycXCIdWtfWmBuYlFycFxLO4R8Rj9YdVhgWk5kW05WVlVXUVxhXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnREY4O0IwNUVLWDFAlVk9TEWVmK2ooquznKqqsLetuLavq6arq73JvLC9tsKvsauzw8POz8O+v7TAwcO5v7PHw6qutq2yuL6+sq2tqqSnqrCop6ixpbSuqrGurrKxtKy0vKS3s6ysr6irn6OesLerqq26t6W3tqSqp6uqqq2hqaensrKkp6WhoayXqqGVm6CmnqWiq6Stop+nsbiurqSmo5uqq66pnaKlpKSYn5uWj5ickoGCkImEnJ+Lio6LmI2OiYKLl6KbkJCbjJOSkZOjmZuZio6Li32GgYGDenN/gn98cnWLpId4a19gbmZXZIZjTj9nk0xFYnlXYlhSZVRNVlVWVE9cXWFVS05oVlVWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZaLjBKZ0FBPDxCKzpKT140RIY9R0ZEl5OwpqOrsZirqq22rLayrKasqqm8wMC3uLK7taWyr8PJy9G/wLu5v77BuMG5wMSssbSxs7q/vbKwrqyqq6i2qaaur6q5sKiysq+yrbequLims7arrKWpqpyjnrOzqaiktLSgt66gqqiqqKunoKusqbq2qqqpqaKqoK2bkqqhnaCloqajqp+dp7Svqaero6OYpaenqpyipKOgmZigkY6PmI1+h42HhJ2dhoOJiY6NjouChZSimo2NmpGSkY+Tn5eYloyKg390hoF/gHh0gn54dn2Ah52Pb3JnZnB3XGByh2pPXplWSG15VGRWUWNPTVZUVVBPWFtiVUhPaVRWU0dPWFVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EPJaOsaKmq6+arKWtsLS1sKymsKqour67wLCtua6htq/Ix8jRwL69u7vBvbrCv76/rbGxsbW8u8KxsbOqs6mktKilrbOzubCjrriysLO7rLqwqa22q6qfqqyfo6C2ramhn7CzorWqnqinqaOqoaKtrai9r6yuraKoqJ+smZCwoZiioaion6ibmaqxqqOgrqKhlKOjo6eYmqilmJeYno+Kh5SIfY2GhISjloSBgYqFjouQg4OTn5aIkZyQk5CNkZyUl4+KhoZ3dIF/fHV4eX95cnJ4Zn+GpHZpX2RpgHRmiIt8U1hvXkp4c1NkU1FfTU1SWmZOTVZZZFhHUmhRUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQDSRkLOhpaatpKekrae1s7KrpbGnqri+wLuvp7mqpq+xycfI0cO8v764vb68yLrAt6+vs7G5u7jAsrK6rLisorSnqKyytrmzqKi9tq63vrC+p62stautnKmvo6ClrauonJ6rs6W0qJqqp6mjqJ2jqaipvqu0sK6dqqShr5ybs6OWpJylpqClnJupq6afnKuinJOcoqWemJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2Lh5CNjoN/k5qThZOhjJSRi5GbkpWHiX5/cnt6fnxoeHx5c25ve2aEeISJZGFnYHKEemxmeF1eVD9Xe2xUYVBRWUtMTnJ1XUhaW2dZRVVlUEQ+Sk5EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mYkFKN0dTYFUqPTlEVz0qkJWymqCgqqaloauluLOzpqmxpqy4wb21r6K4raiosMLJyczBtr3AtLe/usi1wrSysrSxvLi5vbWtubW+raCzp6ursLa4tayfv72qs8G0vKGvsrWqrJ+tsKOcpqmqpJ6bpbCnsKCfq6mnoamcpamhrbyorrGuoaujpK+en62ml5+aoaSdn5yapKujnJulpZaXlaCjl5uXpayMnpGRkYuCioCAjoB7mZSMiHt+i4WPjYuJhJKYkIaUo4mTkoeRmpCTgYh9eWt+dnl4Y3x6cG5vcXZnf3NphGhlZ15sc41sYGlvYG89WnhsVV1OUFJLSU1UWldNXV5sV0RXX09eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBaFkxNFM9ZV9ETDZLVmRPKjsxTlc9I5SZrZqgmKilpKCopLiwr6SvsKmruMG5sq2fua+rqLS6yMvIv7bCvq+0vbfEtsKxrbmxs8C0ur23qLm4vaqjtKipqrGuubGrnLy9pbDBtreir7a1p6ansLOfnqSmqKKlmZ+sqKmeoKqupqCmmKSpoLG5n6Oxr6Gsoa2knKemqZqam5+llp2dm56qp5ecoaqTmZSZn5OZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo6JlZ6IkZWCi5eNkX2FfHNwfXF0dGB6eGhtb29taH1xYnttaWViXGSEfl5Zc2pxSkl+aVhZTVBMSkhQUlFJT11fblNEWFpSaE5HS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+L1dVNSiXnqeanZeuoaGhpaG4q7KltLSpqLnEtbKtn7etrq2wtMbIwLa+wbmwtLy2vru+r6q9sLS/sLzDuai7urenp7WpqKyxrbSxqJu/t6auvbeyn7G3sKmlp6+xm6GkoKWloJebsKehnqOor6GfoZOlpaO3sKGmsaufrKOvmJyqpKmfl5qepZSbnZuep6uanJ6ml5aYlp6Ok5eiqKKQiYuPhnqEfoSKeo+WiY2GeIGHg4eLjYWNk5iNj5aZio+XfoaXjI95gnpwcndvb3RfeXdkamtqZ2eCbGVya2tkZ1dhcn9eWWt1aVlFfV5bWE9PS0hIUlVHMjpfXm1QRFdVWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJmW0hUQ1RdaEUuOzFeUSwylqSjmJadq56moaOhuKqwobu4pay9xLKvrqK1r62tr7TExL2zvrq3sLO5uLq4uq2tv7O0uK6/wbervbq0paKzq6iqs6yusqOdw7emqri3rJ+yu6qnpaivq5mjp5ylppSYobOmmZ6kqamcoZ+UpqCkuaikp62mnqWhqZOfqaGhoZmbnqGTm52XoaOsnJybo5aTlZabjpOTo6ekkIiKjoZ5hHyFhn2cjYmKhniAg4eIh5GFlZOSjJGVlI2OlHuDl4+Kd398bHVybWxzYnl0Z2ZpZmNthGZnaGRmZ2hdZGJpZVplemJgUHJUW1tSS0pHSU9TQCAqal5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YUwnMp+kpZOPpqecn56epLatqKq6t6erw8C2r6yita6nr6+3wcC9scC2sa6ytrW5uLWsqryzr7KwvcC3rry8sKSftqymprWqq6+hocWsqaiytaystLmdqKqrsaWYnaqep6WSmaWto5idpKqhm6GcmKGep7emr6qtoaGenaKVoKafoqCZnJuclJqelaafrqOYmJ+WlY6VmIyPmJqnoJCHioqIeIV3goKCnIeKgoh7foWIhoSQg5aVj4+QkZCRjZJ7g5WOhXN/fWd5cGxrbGd1c2thZ2Nic39hY2VmZWhoYWVuWV1YXGxjYUxnV1pgVklHSEtNUlg+OWBsaUhCVVNcW0hIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGJGJTWdpKGSjK6hmpmgl6W0sqOyvrehscW7ubCwo7asq66pub69u63Asq6vrraus7myp6u5sK+utLa7tq+5vqymnbWroKGypauwn6bFobOmsLKxt620nayvrK6imZ2nqqWelZunpqCZpaOonJqem5Wdna2wprmnrqKhmpqemZ+jmqWdl5+Ym5aboZOql62pnJWenZSNlZqOlZSYp6eNjIqJjnuBdIKCi5iFhnyIiISFioyIkoWUnJKRkJCRl4+Qf4GNjoJvgn9neW5pa2pncXJrW2hjYXF/YGRnam5rZWllY2xcbGx1cGFTYmhjZVpJRkxNT1lRUFVhZYFUQFZSWlRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUhiQic0lKOcj4+xnZyVoZups7CfuMC2oLTBu725saa2sKmupbi6uLisu6+sq6u3qrW5raSztbGvqbG2trGztrunqaC2qp6fqqOqrp2sxJmvprCxt7asq56wra+qopudpKypm5WcpqSdmqqjpJaaoJySnKOsq6m6nqakoJeamp6hj2ujlpmdcYOYnaWBdpKsqZ+Wl6KSipiZgJeKn454hZKNg21pfneEcWyGioZ9hIqGb11kYGeEmIZri5CUknV4i4R/g5B/ZoiAaHZpZldcaXRuTlBqY2Vxg2ZdZGZua2hdW12JkIWHaE5LQzhFVGdeSkhQUFVWS0hSYXB0ZUZbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOW0tbZmI+RzFOYTwrL46kmoiWspudlKGcqq6so73Fr6m3wri+vK2nt7Gmq6S4tLOzsLmtqaestKWxtaKnuLa1qKettrOutK60oqmftKueo6Wdp6ibsL+VqKewtbmtraOorKurpaGfnKGop5uYoaWmnJynqJ2Tnp+ZkJ+oq6S0r6Oio5yWmJmXo4ihj5KbiKGIlZ+igKWAqK2flJSelImEcniMjoOIoHWHjWmXiWZ+c3igb4eHhH6MfH+hoJ+Zf3yHn3SIjnabimyHgoNtaGRke21yYlSGbWNtaZhxWGlvboZXXWhaa2paiHBseXKHaIeEWV5GTj5GXk1FUlZWUVBSV1RnXkxaTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTltMW2dfPUsxVF43LyiNp5iEnqydmpqdn6uqqKq+w6+yuby3wb+qpLexqqyms7Wur7O2q6mlsa2ltrObrLW2taWmqbOxrbKorp6qobOpoKSlm6KlnrG4laanp7e9pqymqamsp6Whn5mhqKOZmaejpJicpaqWlKKclJOkpqehtqSjn6OYlZSYlJyIrpCYlYqqjJmjnYaxgaWun5WboZd6gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsXlobFixrm5labySvG5oeW1xj9h9UmtitrJ9fnCUdZqhqpBWTldhT1ZORlVcWFBQU4tbV1tQQFxEUE5DRkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkFFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV1nXD5MMVpbNDEhj6eUgaiqn5idnqWtsqqwwr2ytcC1t7/Cq6a0rq2pqLC1qq+2tKioprWlqLmunLKytqqlpKeyr66xpquep6WypaKioJecoqCyr5afpKG1uqOpqKCsraSinZqao6mgmJypoJ+XnqiokZynm5SeoqejobCjnp+jlpeTmJKZha9raoyOqn9ohZaHrWZxn56Vm6mXca6hpH53unxroI92sV9qtFulgGWckGBmgXpmf2l4aqllvnJnpox2sWp8sXh1kZRjbW2nblyEoEVpZ4eWRXWcYH1me6OmgVhfi6tofY94emqoOEqvW1hUbGNaS09YX1xWVjtOh1BXVi9JU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWDMxG5KilYOtp6afo6WrsrittL2+sLfFsri6w6epsKywqaqxr6SxurCkpa+zo6q5qZ2ysrCjpKCqrbCsr6aon6OisZyknpmWmZ2esKmYnKKgtbOhqpuhra2fnZmXoaOpnZmepaCcmaGopI+copqXoaCsn6amoJqfoZaVkZeRmoa1m7V5h6matpl3h7Obt3+Ul5isl39rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iXCOhoB/iJCXeIOCipeMg6CPhbB2d59xa2ttfItPpVhIY2OZfmNopV95cXVSkoZdUKluY3B6hYBhnS9Som5bVGtnYExLXGRYXFpCPrB3V1hBI01pRkJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RSwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVQ1MByXoJSJs6amoa6pqLOsqru3wrC8w625tsKrrK2vr6ivs6qir7yroqi2raSstaSlsrOoo6Kdp6qzqbCopp+goLCXoJuWlpeboLCknJukqLWvoaiOqaeqm52WmKGmqZqfnaOgnKCjpaOWm56Ymp6jq5ymmpyaoqCXk5GTk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKPnY2ke42GooGlgnmreY+dVq97iX6farlauXeGhH2mgpR8mXqqeY6dkHuxbY6EdJC7hm+VUK+nxYpRoHpjYKpic3KGa5aHXlK1tMiFfoh8Y6QzQp11XVBqaGRQQFhmWWRhSkdMakpaU09ZZlpDQz9FPzA8PDU5PDc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuMDA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbGoqaWzqqW1qKS8uMGwusCyt7S9tLaosrGksrOnoK+2qZuouq6ksLGhsrSxoaSenqipsam0qaacnp+smJmZmJiWmKOun5yXqK2xqaOej6yip5Wdl5yhpqGYoqGioZuioqicn6CelZmbp6Gcp5Wbmp+hmJCSlZCdiLJuaLVyrIhwj6dytHV0tnucmaaOkJ2No36PnqN+sHWCkNLSdVyufIV/pG6bqqZqhoV9rX2YmZB7sXOTnY95s2WWdIWebp9mlFLJi1rCXJ95Yl+tX3ZzhWGWiF1Zyp1vwIB0TUu1U1XGZFVRamNlWEFPal9saVBVRkg5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqOekaWvraWpu62mtaWotru8s7u/uLe1vLy0prW1o7OypKCssKWYp7uupbKxnbS4qqClnaGqpbKorKqlmp2bqp+WlpmZk5Skq6KYk6arsaahlZKrn6WSlKGcpaeglZump6Kbo5+umqCenpCWnKOfnaWUnZWZo56VmZaTm4WsfHiod6OPi4eqcK6LhaiEmpqji5Oai6J9kpeHroR/gbNccrJTr32CgqN+cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52doZnl4hqXa93lZ+Pd2w1ecius19DVG9eZ2BFUGxfcG1WVU0uZWNoUllQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdCYEk6NzegnZSgt7GZs8GtqLKnqrK6t7W5vrm4s7e+taa5taG2raCgqayflai2rKixsquttKSbqaCgqKK1p6aqpJqelqWhlJSdmpKWpKiclJCnrbCloJSZqJ+ij5GimqmmoZWapqmenaSfrZ2gnaCNlJ+cn6GZmJyVlqKglJiRpp2GqX5/pnmhj5CEqnCtjYOnhpeho4qYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKeBjpuNkqR8lZCfhHuyXpxkoH2ClW6TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZE9KQ6FcWk10XWJmTVphX3J0X0pVNUqakVhIRT1HRUFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxPZWRBJlVmWz8xVF9iTDdGSF9DMT03op2amr6tmLPBrqusqKe1sbixtb+5urOyubyqu7ahsqWfpqennpOrsqmwqratqq+hmKKgpqSkuqOjrKGXnJKjoJaVn5uVmaGhkY6MqbCwpp2Wmqemn42SpJioq6iVmKmon5+gpK2joJ6hjpWhmaCgkpyXm5WeoZaXj6ucj65ucrR0qYx3i6Z0tHp1tIKUp6STnY2JpIeOdbhui3uLomtrtlqhhmWXl2igoqdtlHK0c5OZf7NqhZKIrWp1tGGdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdlVG9uLlunT2JSa2VibFliXGBwfGNTWVE+P2xvMkJCQD5NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFBOKWanJ66o5yxwK6uq6uot6q4r7XBtb2ysbu4rMK3qqyhnKekop2Sq6uotqOzqK6qoZedqKClq7ido66clpmQpqOXjp6hnJmen5GTlau2sKaYk5usqZaMk6aapa2jkZersqSgnqissJihopCZoZegm5abl6GTnamdlJCrmYfTlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsKCmrJhg7p5wHx1uGK1gYyHqX2WgqypcXt/dbyIp6BpnWGmjq+hfYx0h6t9vm5zvHSyg3V4gYptmohwbY2kdL1dd31bYXm8alpWW2l5XmlgZGZibXhvWFtZQ0FAcT9DRys0SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTxMXC02QDmnmp+ivKOXsMOvraqqrbGoua+3xbG7s6+8sK7Bsq2mo5+kopyckaulqrKltaetpJ+WmquZp624naOumZWhkaagk46do5+Zn5qQlpOvubGrlZajp6aUkJalnaStn5GgqKugnJ+ppLKdoqSOpqGVoZmblpWkmZCwoJKVqp+FkJm2gJKSjbiWeIOTm7Z3bmxvdG95j4SOiXKewLu8mnuBsqhwgXSRuYN8hoaLhox7ioeMl32ku7m9nHV5s6N0dZd1dLB1mJ5mhmmNtnRycXe2jF5/eX2IZ4N5bHlii6xwdIV+WFunaURkWVRmX2NdY1FnZnFtdUJNT0xEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlbLCs6uqqKyrqruvscavtbSwuKi1ua6rpKKnn6CdmZStpa6qp7aoqJ+clqGknqylvqehqpeVnJGim5KQoqiik56XkpiUsrW2rJido6Sii5OSppymq52WqaWmnZuhqaenoqigkayel6Kel5aYnZ6PsKmUnKeij2t/apypeYl0f5uPdntmiHu9vsC6b5KDcZSFX3JqWl6biWFjh4+WbGB/lGNtnHZilWyAmZWUZV5gY3GaiWhyjHuGlGZqfnB0eH59Ylt4dIFoUFxuhHx8impXbHqBcklKb4VwTnJNRFZcZmBMWldmY19PWm12anJST0RETTxISTxMPjIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJeSSdTX1Y0KVBeTCgzPlxPJz8yPqifqKHBpJm0ubajrKaup6i1sqzIrLC0rbakvrKzqKGkqp6jnJqarKeupKW1qqSbmJWinKetqb6oqaWVlJuWoJqTmaapqJGfkI+YnLCyvqyapp2noomTkqmbqKScnKygo5qco6etop+poZmum5SmoJeUnp+dmLGlmaKomZ2Sn52kppuopJudmpybkZeCaG59cneRl5SQhIm0qo2FmJWPioyYl4iUlYmDk5OQiY2SlJmTmZean6Gam5Sfm42BeaSFbGl7kH2AdYmLgnKCeHl2dop/fIlqc4F0g3Vkd312a295bF9iW29nTVhZZmpfV1lwem9tZlNPRlM5UFpOUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsLG3oKqms6emsLWqyautsqa1psCptKGfpaacpZaVoaunraOkt6ygmZeWoJitqqbBn6yklpKcl5+YlJWjn56jqJOQmKiossOvmaqcqp6PlpapnqucnqGtmKGbnaKlr6ahpKeerJiWpZ2ZmaGenp2woZ2ip5aZlJqUoaOXpJ+ZoY6YlYuLjpCYro98lZuCkYGJqaiFgJiWi4SOn4h7hJGFhZqRh4aKlY+bl46QmJ6jlpmSkJyNfo1lobOuhImEd3uQin53eXpvZ3mRgIGIanWBeYhyaHN/eXWDhoFqdGJ4ZV9oZGNkZmpYa3txamtcU0xQRF9VRkA+Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r76tqq2xsqCqprKto6yzsMWwq62ks6+8pLScoaijoZ6al6imqaakprO1n5WVnpqasKauvqGsopGRnpqalJKWopyXqZ2Enamro7THs5+po6qWlpiap56pnKClrJSfn52fqq6opKKroKuanp+hmKSenJ+dsKSZn6mUmZmek6abmaqfnJdmhZN9ZX+Pm5BjeYxsaGp6kKOramWamH5nhYtlZWloeo2ijmtojJiRondraouZo5+Yc2tteoSMhnlYZV2FgV5si4qCd1xnc3d3koCIgW53gnh/c215hHN2iIeNgnpohFhdanNkXXOIaWp8cW1jXVFOVklkWEBJMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSi42Wk82KUVZL0RPMVlCOz8uPaSeur25r6uzsKulqK2usKeurrC9saqopa6wsKCtl6GknqKamqasnK2kpqips66elqSQo7CmtrmlrqOPj5qimpOSm6CZmaaWe6Sroqi0w7eloaavnp2VnqOeo52kqqmSn6GeoKqvqqmiqp6mm6Wep6CrlqGcpbGkl52slqKfm5SmmaCsmZ9+vYSJc7RzhZ+GrWh3ucS4cZKho3qmmJl0q4J9y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXuBepGMmsLAfWqlsm+NgW/Ken+beJKEj4B2eYGAeXF7gIZwd4WLknhsdZFiZV53Y19lgGJedGhtZGJYS1VJUVlIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fYGFfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziVornDtK+vv6mplKOwqrCvrqayta+qpqemsaugq5ibo6Ccm6qnop2so6WopaW0pJ6jk6aurbi0p6+ikpGZnaaTkaChmJugnoimq6Srrb+/saCor6mWkZ+dopmjpKqjk6Ghnp2srqiqpaOhpJ+jpJytqZGkm6muqpyeq52uo5eYppeipJief86UenulgnqWl5tfrY9djqiAoaF8p5WbdauDga9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq1Zo81ukHZ723t/mXF+iJN2f2V7iHV2bH6HbX2Fj5B9a4CMX3Bqb2ZgX3hkW3FoamRmYFJUU1deSk9DNUFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xfX19eXV1fYGBfX11bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3OlNMKywtSjAnO1s6TC0hUEBGNC4xrMHAv7S0sLeYnpGjqqmttaumsq2srKSsprCqoaecmqaYnKKvn6GfqKejpqGfsKybnpamrq2xq6isoJSSm5+lk5CfpZedqKOeraOqsKi/xbKnqbGtlpKenKKXoaqqn5Whnp2cra6mqaibpaWioKqSrLOWpaKqqp6kp6eisqKTm6ecoZyWlZGXoXKGjJh2hqiHcbF8nXGsfaCggaWPnnirgn6tf51yrX+sh4afdpiSe3yXfqqIooyRi5x9q3qIko+ff3qtVpzEe5BwksF9gZVtdXCMbWZ3ZYZvYXhucm6IiY+Og2yPjWNtc3VvYGZtZF9vaWpuZmNXU1xgWlJSQzhJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txseys5+do4+joqKtr7evqbGnqKqorqurp6KknZqjlZ+mq6CipqCoqKOfnrCtmJuWqKevrainqZ6XlZqkopKUoa2bnaejr6yirLWpucyxrKatq5aUnJ2imZ+urJ2WoZmenqmxp6iom6qno6Gqmq+xoqirrqaap6urq7Okk5ikp5yWk4Wka6R1inqpdXuycYKlipiMcIigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoGjfal/gZSGrl57qFWdopKBe6OfgHzEsMWMc6+0s7lyYqmvwnRoi4uWjYBrl5Bta3h4d25rZmRkcXFme2ljXFZfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLSwsKmto6enqqurqKSmoJuln52mp6aknayaoqyho5+vo56bk6qktbCvoambnJaVp6SRm6Kon5+mnLCloqixrLbHsbSoq6mVkZ2doZmgpbOdmqGUnJ6nqqqirZqqpqChqaKyrKGqs7KinKupsbC4pZSXpaqanZN9qm2fg4h2q3l8sG6CpIuJn5aVnpaB0ri0uMmBgrJfYZSpg6WIh6B6mJaaearJdJqjlKipkJKajH6aiZrGxndloYKlc4GfjoJ9r19vtWOxdUujhm2nR4OTZI6Pm5F7b5SPfG15dHx6bVtlanJxZoBpXmFYY21cXllJTExKRURCQT1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKuraainLK5rKuhpZuopqqsqaagpqWYq6Ofr6ydpqGtmp+ppZ2ntaCjmJSoq7azrJymnKCWkKatkpqcp6OgqqeuoaOnqbCzwbGyqaynlImYnaWboqSvppeilZicpaWpma6cq6WknaujtqyhsbmwnpywqLS0taaWmaqmnKGQg55Od5qCgJ56hKN8gqSEhqafnJ+UhLh8fHq5gn/MxsO2d5uikYuffpmXl4p2n5eKpJikp36vhZuDnoSsfZmUYaVso3CPhZCBfZaEcqxgpHNxgJphvH1SVXWNkaGVenyQjodyeXKEfm9bbG53cmqBblpjX2huYmRdTExRU0FIR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Kss7Wmn6GVpa+urqinnqWlmqSnobOuoqmns6CaqaSUo7Wjo5WXoam1uaSco52jk5Cispmem6aloKKvrZykqKK1scOwramsqZGGkZynnaOknKWXnpiYmaWjp5itoauipJeupbusore2rp6etrS6s7WomqCxpKagiJDStcO3eYeOhZGTj4CmeJSid4yhkoWlg4tyq4eGtG5yaZmknZWJn32XmYeHkHOugqWbo42mipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJycn6gYnOyuGh3jpKkl3yJio+IdXt4jYFsaHdpeHNuf3RcZGRtbWZoYEpaV1g8SEY/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBfXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK62oqKZlaOqp62pqpmlop+moKC1pqKpp7GklKujj6StpJ2QmpqqtLSknaWcqZKUl6+goJ6mo5ynnLWZoKqjtarCr6iqqKGMhI+coqGmo5WampyYmpimo6WXqaeroKObrKa8rJW9sK2fo7G1u622qZ2rtKarmnyokX18sHiLgKSliJxtsm+hh618oo+DqJeagayJhq2FoJSooKOXhZ+BmZaBe5J+q4GdmZaLq3edoI+Ik5J/ea9do4F8pqdknoB8l3Vqrl2lbHKFmV1gW4ygbZSPpJeBkoqTiHd5gZZ+aWx+Yn10bX95X2dlcG9nZ2hCWV9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JODE1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKbhKnGw7fBtJ+araCuuaajjpqjpKCvrqmfo56drZieuaCjq6GwqpquoZGqqaWWipqQrbGsp6Com62YmY+toqGdpaGZpJytl5+opbaovq6kqaOfi3+Om5ugpp6SlJmblJmZpaOimKerqqGinqinvKSXw62ro6KttLytsKmjtrGrrZp3r36Ri5yGh3y6rYmYZLCMZZaufaGQhKeXnIKti4WwhqiapKKikYWgXGxrgrNgf618e4KBsmxmbpmXi4ixWn20W6SDa8iiZp+BfLtZdrVasn1Tr4F6rFiAoW2XjaaYiJSNkpN4d4ybfGNzfGKDd3SAfGFpZm9tZmVmT1VjXEFUXT1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vru0wbOjnK2mpbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVrqiijombjq+sqaejqJquk5qPqZqhnaWfmaOipZieoqixqLuupKienY58i5qWoaCZkJGanJGZl6ien5enraWjpKKkqbqeoManpqmhrLa3rrCpob+wsLCYgqqSo6+Om4CGpJeYkICAuMO6hI+dk4WomZ2DrIuDr4qpnZqmq5F+1b3CqmKkv719f6OCg9e6t7WElJKCnr2+hGqjgW+rhG6df3qysceDa6uxvax5eKK+u3SAlYykmY2YjZOZd3+PmXlifHlkjGZ4gXtga2VqamJQYltTaVxAVGBCTCk8OjQvHx8kHiUyIBwkKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0scC5sr2zop2up6azpp2Ml6W/qbavp6G/pqaxm56xnLmon66vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp2nm5qgqKKYnaCrrKm4rKejmpeSe4eZkaabko+QmJmOl5OomJ6WqKieqKagoqq6nqnFo6GwpKy0tayyrKO/q7KynHV2qqW3hmWKoHBnrJCKj25ud6WQm6CCdrGbl3CRjnKXqqSbma+kcmxtbWaLeG9tg5lxgHppcGlniZaVl3FoaYWGZ3GGZF2KY2lvWl1nfnimYGJykJJwZmSAjZKNoJWVl42SmnqFjZN0ZIZ3Z4xqeH55ZGxjZmxiSmRXSWpZOlBkRFAnSjkrIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6ubK0qqmirp+ks6qZkr2xw8e8tKmev6uso6Cnq6C6o6SurK2mjpatqpCMhZWWrZ+mqqKfpKOgkYulkqaZqZmWo6mglpylpaauuaqsmZqTknuEl42ml42RkJeUjZeUppOdlqeima+lnaKruZ+wwailtKetsbOssK6qvKexu5iMoqmmtZyJl6OYhqmbkJSdkqq0mpykraK0mKSjn6KjnqOlopesp4ySk42Hk52dlZCZk5iQjZWEf6Sal5WOi5OSipCHhH5njIF0g3d0h4xxp219lpOUlIGBj4+OjZuRnZOUk52AhZKLcGiPdm+Jd3V8eWlrZGRvY1VhWEBpWkdiX01YK0U9KyYhNjQwLx8cICUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbevrqKwpa2goLaxkY6qxLzDubapoaSdm6WdsKikt6edqbWnqJGYrKOLiImPnKeWraShmqien5OVpJeomqmZlKago4+ap5igtLmnqpiakIx7gZSMoZSKlZGVkI+Sl6SOnZionpq0o5ymq7eor8KvpLinsLCyr6ustr2jssCak6ekprWikp2nn42pn42Sn6KtsZuipLOrs5qmo56mrKCfnp2YrZ6TmqKclJCXq5mNmJmXkJaekYegnpSUhpOMj42VjIF/Zo2IdYh3eomEdJxqiJKWlZKJfYyWkZCWkJ6QmZKdgYaWhXhxlHJ5iX9xe35qbmRfcGlgXF9ZbWJQYGJPWDlGRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7CzrK6jqaetoKi1qpCPm6Oyua2qq6GimXqcobCkprGpl5y4pqOUmKmcjoaKiZuikK+epJaooKGSl5mcrourlo+omaeMmKiOnbi1o6WYm42IeYKTjJuTiZWRk5CNkZahi5ydp5ydt6J/g661orCwdaS/pLOgeXuirbW/l3iwpqGKgKp/ZFxid6COpJ6Dln5tlLWdpKmwrKVmoKGUdHqbmXCBmaqZbH+kqYplnKWckZeYl4uSm5CEnZuQlIOTh46OkoqFeGuQiHaHcXyGgYFhaYmMlZOMW3aVkWdnjoxxeaGVlWR4l4WAdpdogomCbnl/a3BkX3Zva2tnW2VjYWFtUVk9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHRklLTFRVVVldYGhmZ1hRSTxERzw5VVJbYGFiYF5fX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqWprqOnraWSlaq0rrClmamlqpdzi5yvoKirp5SXuaCgj5yknpF+iIiano2smqSVp6KejpeSnoV1ro+IppqokZajiJu5s6egmJiLiXR2ko2Wk4mTkJCUjI+Tn42ZnqWYm7GVgIybtZ20jJKPvaiifqeje6WxuoOOj6ifhIyGj7Gpr4yKlqKaeYCLrIadnqOpq6mJloead6Wce4icgZing4F7nbN7ioagmJmUmJaBkJaWg5maYnmIkYSNj5KLhG5xkIh6gnGBgYaAh3SIhZeTeJZok3SgmnN7mYKbmYSYfpGIgYKYaYyMhGp4e3FwZmV4bmlsaltkaWlkcVpcR1NLUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaWZZUUg5REw8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpJ+mrq6rqK2gqbGnp6qlmZOsxLyvoJSlp7Sdj4Ocq5ynoqCNkL6emY2fmqGRfYaPmJeIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqSjoVwdY+JlZCKlI+Om4uOkZ6QlZ6jlJ2rh5+0ibSarovKiKuvireFjbCEs7KGqY6pmY2dfKiPcnt3nI6mlmiVpHm0jKGgqKqTmcKCgKuJmaFynoCbpX2XhZWzgaF9oZOfj5iYgI6UnImYkot8hZSGjZWTioRudJKGgHtzh4GEfYV1hoOYgY/FZoCph4+iap2BnZeAmYCKjIOImG+NkoRnd3R7dmdodXBnaGteYm5sZmpXZEVcUEwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQElkWF1jZmhnYmJiYmNjX19iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6OgsKmpqKasoKW5samrppqUnqGkqaGUo6m1oq9/oKadpZ6diZS9mpONoJKdkHmDlpWRiKuZnJuaooWPjHabm46gkYieo5uWmJeGorispZmbjIx+Ym2Pi5OQjI+LjJeLj5GejZKeoJigp36hp4etnaCWrpCgnp2Rh4Khja2yiKSOrJuMmn6idoCZlGuBq3VNq3iHjZ2TnKqpgqqrfoShfHunap6Ak2xnl4aYt4mefm5gY1iDl3+Ne2Rni3OZfXmXbFx8l25gU3GFXGBteoRgWWWCfoWBmXGoqmuDo25ypW+fgZtnZJ5sWmyIemVZX4J+YVdQb3ZlbnRxampvXWlvbGpnV2ZNXFdFOEE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpbXV9XXl5jdWBNRTpNTk1UYlxbZmZpaWJiZGJkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJeeoLmhqqSmrJKitr2rr6KZlp6gpaurn5yttKGnkaCfoKecmY6ZtJmQi56MlYt1gZSRjYqmlpaYnp9+k4WFrKOHnJGKmKiYmZmRh6WvpqKVmYeJgGluiIiLjo6Jio2Ri4+RoYuSnZ+aoaV/k4GPo6GUoHeclpCng6OpgIassIeleox+hJp9onBzk4eVe56MeW2HnIuakpyqnI+HnX2DonR3pmeefnelXph7fZNzom6Yt7S6c5OIgYC2qGSBxrh8cZW2jHGAm6NjdKyrYX5qnbN+bn6Ig4+DjJhxgKNscqNynoJ9o16cmbOVb3uXnrN0cluesoJpYnB0dXFob1hqa3FwZFtmXGFLQz1ENVFBWXAyPFJHX0pSPTwzOTU6OjZDPDtASVA/VE5OUUBFX15bWVdgYHtkSUM4TFdVVmNhWmZma2tiYmVhZGNgYWJgY2NfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi1ra2gmqGboqOkrJqasayrkpegmaGlmZqUnqybi4mReIuFcYCWjYqPoZCTlJ2XfZGKjqighpiPipKik5uajIqop6Sej5aHhH5re4Z/fY+Ng4uQkImOk5+BlZufm6Cfi4l3nJiijaByoYyJqYmdqJGYqq6Brox+eqCZeaOTeIBzl4iMnH2Vn4ebjpqdqIijZKF+ipaQm41tnmibjm+amXuAiqd9cmh0qoOeg3OqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxfp3Z3ioqAnWiadYeTkpiNfp5smI9qpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGl3d2FeY1ZhQVBFTjdWQlJtNEpaWl5OWkRAMTUxOzs3SD86Q0hVP1lTWF0+RGJdVmBRYWR8aUVCOU5bXVhkZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnYmqtpyoiWOVnKy7srCsnaWbmqefnayZnbCnqp2Xo5qin5mWlqCjmYaJjWmIgHJ7l4eMlpaEkpSYj3qLhJaknImVkIaLnZGcm4iPqKGfmouQioCAaYGGeX+WjHuIjY6HjpWZfZKhnqChk5hyaJ+KoI+McJKNgqmJmqGlqqKqfrCtpKK4l3ajs6Kjf4iUeJ16qpl/oo+fnZmJmHKhfYeNsLV9bJqRoXh+mbWjo6uohJl8mnycmn90qlpdb3uXjHieYk1/e3uFZHqYQk2fWaJqc3yOb4KKhJl2m3mHibGzf36akqZzfZ1tcHyUb5lyaaNdlXZIZWNgc3B9fW5lX2tndXpiYl5PXVZcVFZAWUVQZkRSVlxhWF5JRD1COD9COkhFOExFWEFXUlpWRUZhXFpgS2BtfXFFQzxVXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lY3ZsXmVnZmxkZWxoaGxplJ2Bsa6ahFRfoae0urOzqZqii5qpm5unkqCro6Cnj56dnZqZlZihnZaHh4l3hYFueZWEkJuLfZGTlohygYmSoZtykpCBiJiUn5qEjqibmZWKiop8g2yEhXGCoYx3hIyIhpGYlHuRop+eo4iuhn21hI+enXumlnqpgpeekYyjoH+naHhufplzoHNxfJ2FmG+Tgq18pISnn5uCpHBeqWh2o2RwpmGc0498e5l4cnNjooaQfqJyo5B2a5Czi2CCmIp0qrKovH93g25/v6aqtF6cb39yl3CCc6JyXqRndKZgaKZsm9OYeYGabnZ5l2ubeXaXcmyppWdfZHlxf4RsaGZjbXV2Zl5gUVplUFFhSFZJVF9XU1tkaltlUEVDS0xKS0FKRDhQQFBNWFNYT1NRYGVlalNkeHl3SUZFY11lWmhpU2loam5jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7GsVF1Lf6qwsrWws6KcmISXpqCgooykp5+WqImZmJmUmZOSoJeOiIV7cH2EaHyPg5OagneRjo+KcICGj5OSbJiUfIiRkqOVg42pmZOSioWJeYN2iIBugZ+Gd4CRhYeYoZV4kqGjmZ+Js6Gitot6rKekrqVwqYCbkYaBnpR+pYGjmoaYcZ6Eoq2viZeLf4ykjZWDr6OVd7W2tsmic5SMg59hnZepbXmWh6CbdaGHd6B+kJaLgW9NZqOScZqIc6V7enVig4JtfqBscmRgnHN/dJdre2q0trTGpnOYfXmcapqZq3OBmmxzd5dpmXl0l3FQRH2zXmp1a3iGZmtmYnN0b2xVW1JYZ09RZ0lVTFhSVVxna25VZ1dNSkFJTUpHSk5BUUpQZGNqbWV1c3N+eHtudIl6e1RRTm1eaFxraVJqaGlsZ21nY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinYmwqIVlP5Sisqyvr7Whoo9/lqehoaOLpKacm6WCmZeXjpeQkJuTjoiDeWt5hmWDjH+Wn3l1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJaLkYuAiHqAfYt5cJCghXmBlIaIlZ6UfpOkppuWloNnbnicbKJkfHKleJyYcGingpmOfaV7oZeDlnKfdoGJlJWPuW2PiqJifZmjl4luc2ura3Wgbm+mYZtpi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXBkZ4iCb3KiW19bZKFuXoiMcXyAdHJkpW54omNmp2eXcYuXbaFvUoiPbqBeZKdUi11UmG1tcmtxgW1waGt3c2puUVZVVWVZU2xJWE5bSFdoaHJqWWtWUFJFVlxNWFNhVWhqXnd1e3xwfXxygnt/c3eNgIN3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqbCxpZ+Lf5apnJ2ji6GhmqGigJWZk46aj4uXkI6Ke4ZxgIhoi4p8l5pzdIl9kHxlg4eViomVmoJ8iIaWpo+AoaqPhZCKgYl9gICOc2mPpYN9hZKMh5eejYeRqaWdiaZ4lpt+pYmWjLKZnpGEr5efpXmYinupdaiQhJpupaKMkoSMg7xtfKWvgoeFh5WXnqJ+pnxyqJWhlmiffm+sY5aKlpN4qG2qo4GJdYiCd6uRpohrkrFsd7OMqWyLhm9voJ6SlWJ/q4yqd4GAjqefd599haSVnaBnmYd1rGaerYy2c3a+jKOTWYOmjathdXJ0b3t1cGJqfW5nbFJUWFRgYFxrTFtRW0ldbG12X1txWVtfWmdzZG1vcWNxdGB3en55cnmDc4N+gXt7jIGCgHZieWRjbnNkUmxnZ29tcmlmaWFfXlxhamJsbHtvXFxiaWJtaXdtZ2xuYpamq52BgJ6klqqqnqinraOYiIGWqZmdoomapJyonISMmo+GnJGFko2MjHSFeoiDb42FfpeTc3SGcpGDbn+LkoeGlJB9e4KFl6SNf6WkjYCOiYSUdYKHk25si6iAgouTjYibnoiLkqqioI+AdJSXiH6BeJSvpH+CnHGPhnmTjoaBe3OpjXJ9fXqXlpuEjXh7fX2IlJWTi3eRmaGihXt/imyMhlx6eXN6cWlufpOKcYB0go+Uk3GGhIJljX9fgYGMeHZzlHVwem9viW+Fhl93aXiOZoKDho+qnH90fZZpiYhvfnV7gnRtbGaMc3d7l3eEWmpXeY9pbndycW93eG9da4VuaGdWWV5WXGRqY1VgVF1RXm93eWtqd2Rpamp1fHBxdHNhb3Vic3uBeHV5gnV/gH+BeYuFgn17bYBtZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbqpp4uhopunpJmknauhn4ODlqqQnZ+ImaaaqJiCgZyLfpaUh46KiYxygnyOfH6PhHuXjnRyg3CVhnx9kouGho+GeX6AhpijjHumn4qFj4+ElYKGjph3cYSqhY2RnI+Hnp2Gi5unn6Crg4mNlZt/foqXraiQk6iReHGfk4V9lHB/q4dxfpVxam98gZ+Lf5GOi2huXYSNjZydoJBzl42JcnVsg3Z0gFlyb4eRgn5/jGpdaWR7hYSIgGBpeHucfISNg3aCh4RpeoyJbGJxc4N3X3ONg4qRqJaHZ42Ogmx2ioJugop3bWRlY3mCepVaW2lmbXZbe3l3dG5zcoNmXG2Ja2tiWVhcWVhqcVpeYFldXWRyfXp0b3Riamppe3xxenZ0ZG10aGx7f3V6fXt5eoCAf2+GiYN7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsaGQo6Gan5+YnpmooaB9gparjJ+ThpqhkaSVf3uYhXySmYmIhoaKcnyAi3aFi4KElopyb4BzmIaEfpODg4aKgnqAhIqan4+BpZ+Gd46XiJWKi5yXhIN5rIGQl5iTiZ2choehqp6ioqOLiJObnaOZlquiqKehk5yJmZF+epCQhql/gJORkpOcsaWalJ2PjbGSmISmjY2WnaGKkZ2EiZOLbH2Od3dmgoaRi32JnoWHi4+IiIGFhJF3fHt1m6SKh4ugjIeWf4CNg4F3cXWGhH94iYiLkaeRhIeOh4KLj4p6g4iGjH91aoCDfHmZaXFoYHOKcH17d3Zvd3SBXV5vhmduX15ZWlxTZ3BVY1tbYGxndHt7cm5vY2ppaH97bXh+cGhwcGxmgHtygoB3f31/hHttg4yFfHp5fH56g3hOZHZqc25xe2RrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2Inrqfl6KhmJWZmJSYpKCcen6XqY2djIWfnIqdlnx5lYN7jpmJhoOEhm14gH9ygId+iJOEbWt+epeHhIOQfoCGhId8h4OMmpyShqmdgnKKj4WSkYuckXyNeqmDjZGXlY6bloWFm6afopqdhoOSmpmZkJmmoaaenpCXgpONeH2JkIanfH2PkJGGmKqhnJOcjo2pjZKAno2JlZughI+YgIiPhHF5hnJ1YX+EkId2jJmBg4+ChoV/hoSVbnp2dZSkjI2Gm4aGkHWBjH5+c3N8iYV7eY2PhZSokIeEj4GCiYiIdIKFhoh5bWp8f3ttaGtsZl55f2d8e3Z0dnV7d1xgcH1udGBjWlteUWZsU2RaXWBqaHR5fnBsbGNqameAf2tyf2trdG53boR5boaAdoKAfYV3cYKNh357e3yAe4KLYGl7a3VoaoNkamNgaVxjdWdvYnVtbFRicXllb3l6cmVqbW2Lip+4mqGkn5OSlpeLmp+enHp3nKSQm4mGpJOKmJl5eo2Fe4qRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hYSHfI+AjpubkIemm39wioqLkoagoYqFjHynkIeOkZaSlpJ3jKOgoZ2Wmn+BkJqYk42ao6Kkm5iSnICQh3uBhpGJoYF+jY2PfJekoKCSmZCPpYyPgZySipWZnX+Tk3+Ij4N1dYJxd2F9gY6Gc4qWfYiMcYx+goWGj2h4cnqOmpORgJh/iYxzg4l9fXJ6fI2GfHuTjoSXppSNhpB7hIWGhHN/gISFd2Rwen54eXBramZefnNofHV1c3xzgGpeYHR2cHdkY1hdXlJpaFNkWF5gZ2l1eIFxZmtjbGdlf4BqbX1nbXBqfXeFemuLgXKBgX6BdXaCjYZ/fHqAgX1/j2pyg250aWKIaGxiX3FWdG9sbWB4aGxXanN2Y3R6enFia295iY2fs5Klpp2OkJiPhpygmpt7daOejZd/jKGKiJqWeHyGh36Ein6IgoF/cH56dHWChX6JkHdnY32Gl4qCio14fYCNg3mWgJWXlYyVnpp9b4uBkJOFpZuHjImDppWEkYqVl5KRdpGdoaGYlJd5f46Yl46Wmp2lnpqUlZ17komFeYeYj59/goqOjHOXop6gkpiOj6GMjIOYmISUl5p/mY59io6Cd3J+bntkgHyLhnGHk4CRgmuHg4GAioVmdnB9iJSajn6UeY2LfYKJfnxygHmLhnqFkouMmaOXgoSLdoeDgYB0eH+GgnNednd8c312ZmtkYH5pandzc3V9cXxjY2FzbnVybWFZX11aa2NSYldfX2dqdHmFcGJqY2xmaHyCa2h0aGxvaH98gXhsj4VxgIODf3R8g4yBgH56goN+fJBtdYl0dG1mimxqYWN1VoNpcG1geWdsYWp2cGV4e3lwX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHaomomYeZaci4yZkHh8gYt9fYR7gIKAeHN4eXN9gIN/iIqAZF59i5SHf4WHdH1+in9+mISWk5aMo6CXfnGGe5ORiqaPjI6KkqCRg5CPk5eRioGPmKCakpCRdICOkpSJnZ2ep5mYjpWXdZCRi22ImpGbfIiJkIlvl52aopKVioydi4aBk52AlJSWiJqKfYuKgntxemt2bXt/jH9uhZODlHhvgoR+fouBZXNqfYKYmIWAjnWSioV6iX93eYF+h4F9hI+GjZWlkXmFgnSIhnt+cXJ+hIFrYHl0eXB8bmBtYmV7Ym5vdnN4d3N0YXZgb2x1bm9cWl5dXWldT1xXYmBnbHJ6iGtfaWRqY2h3h21mbGhpbGeAfHp3bpCIc4CDhH10gYaJeoN9eoGEfXyOcnmLeHhtbIdraF9pcWKHaHFvZXZnbWxhemhqfHt3cGF3bYqBmZqroaSpnoqLkYaJnoqUlnx2rJeMlnyek5GWlIh2fnuKfHyAdnd/gHB0c3pvhX2BgIl+fGFcfo+Shn+EhHJ6gIZ6j5GHkZGbkaSak4F9gHyNipKjiY2KjZaajIWQl5KVjYiIjJKdk4+MjW6EkI+RiZ6ZoqGYl4qXk3CMnIZniZuQlXuKhZCKcJaalKGRkYiKmIyCf5KffZORlI2akHyLhoh0c3VrcW91fYt1b4aRjpNydIB8goKJfWVybnp/m5V+hYp1koyCdYp7cIJ/god9ho2LhY6Wqo57iH1+ioR2fG5sfYKAYWZ3c3RuemFeb2BrdF5wanp5eWxycGV5Xm5sc21zWFpdX2FpWk9WV2RiZXBxf4dlXWloZ2JncY1uY2hoZWlngHp3dW+OhXOBgYN8dYKJhXiFfHiEhnqAiXd/i3t6cnmDa2tfb2h0f2txbm1xZ29rZXthbX96d3Brd3eJf6OZo6ihppuIjIqBj52Gkpp0f6iTkY2GoIyVk5CAc3x2hXh5gHJzeoZscm95bYl2f4CGbnFbWX6SjYiAgYF2dYF/f6CGj4qRm5egkpZ3iX6AjIicnYqPhpKXloWIlJiOlouKjY6MnYqOkYRtiYuPkYqclqGcmZaGmYlsh6aFZ4ifjJOAjYSMgXiTmJKdkZCIiZSNf36QmX2SjpGOm5N9i4GEcHZwbG5vcHyGaXODj5iKcXiAdYKJg3pndHB3gpuQfYqFe5WTe3iKdXKLfIeOe4uHhYqPnKWJfIR2gYl+d3dsaH1/fltxcnFvb3ZZXm9gcGpeb2p8enFubWptd2Bwb2txbVlYYGFhbFdQUlllZWF0b4SBYVxrbWRjZWuSbWBmZl9naoF1cnJvi4B0f4KAeXaAi4B5hX53h4Z2g4V7h4t/e3aKf2pxY3xihXxvcGx1amhubHd3X3F+eXtzdXN/gn6llZutn6eWhYyDfpaVg46ddImek5KGipqMlY6MenJ4dIJwcoV0cXWIbG9sdGyHdoN9f21uVVGBq5SHgniAdnKDeYKggpCBkpKYm5GYd5B6goySpJqTjoiUmJKEhZaYi5OLiY6Ph52EkYt9couFiI+InJmfm5eVgZWAaoifimiIoomUhZKEinGDkZePmo2PjIuOjXd7k5F7kIyOk5iNfIl9gWx3am9rbG17gGJ6fo+XgXd6gXiDjX16aHVtdomXjICJh3yVkXJ7hnF4jnuLjnuJf4SOkZ+fhn18d4GKfHZvZ2l+f3Zddm5ta3ByVV1uYnJhX21ueXBocGZnc3VocGxhd2VdVWVgYHFTUE5bZWNcd2+Ie15caHFiYmVlkWlfaGVbZ29+b2txc4p9dn2FgHV2f4x5e4aAeIeDc4aFfoyMhHx5lXhmcmuDYId+b29qe2BpbXSAdF5zfHiGd3NzhXx4oJCbsZ2mjoKKf4KZiX+KnH6KmJKOhIeXjo6OhHd0d3OAcHCFc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfHB0g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYicf46BeHuMf4iMipycnJuWlHqOeGmLlIpuiqWGlImYhIZjjJGYjZSJlouMiYtwepWKfI+Ji5OSinqHfX9tfGVzb2tte3pcgXmQj4F7fn+Aho97eml1a3SMkIqDh4Z+l4xtf4Bwgo6Ajol+hXuEkZabnIx9d3iCjndya2RufIBpZ3NuZ2hzbFNdb2RwWl9scXdna2tiZ3hzcHBkYHhgYFVrX150T01LX2ZiW3dwiXRcW2V1YGFkZI5jYGZiWGlzdG5rcXaLfHR5hoJ2d36Lc3+Gf3qJf3GJh4GQioh8fpl2ZXNufGWHfm5va39Za255enJgdnp7jXZydop2eZ+MnK+boJCChXiIlX57iJyGhJ6QjoWMl4STjoeBdXdveXFvg29tbn5yY2R3cHxuenxqaGxipJrB3K7vonNsdYN1hKGEkW6Vj5Sfk5qAkXCFi6OXiY6VipCdloOAlI+FiI+AkoqKl3+He3Z/iXiGhY6cmpeZj5B2i3hwiYuOf42mh5SLnoaGXouUl4mOiI2KioSJbHyXg36JhoqRkIZ2h35+bH1keHVqb3l0WIh7koeGen9/gIaNf3pndGqBi5CLhISBjZiGbYN3b4mTg5KGf4R7gpKXlJqRdXR4h4t0cnBkcnZ/X3Jsb2FodGZSYHBna1VfbnN5YXJjYGl+cXJuW2NyYWJWblpcd0xMS2NmYF11coltW1xkeV5gZGaEX2NjXlhpcmtua3J3i31zd4SBeHh8iXGDhHx9iHt0i4iHlYWMf3+Yc2h1cnlti3puc3CAV3B6dnlxZHZ5hoxodoCJcYCdh5monKKShH1xjJN4eImcg4SfjI58lo2AmoiEfHN2cHNqb4Fsam18dF5gd3Z7cHR6Z2BlfOvatcnD3IlzbHSAdoqaiIxpl4+Om5ORgYhwhYigjoWLlYqMl5N7jZKHgoiQepGLho+CgHd4g4Ryh4KSm5aTmIaNdoiAcoeEjImcpIWWjqCEimGDlY+FiIWIjIaAh2h9lIB+g4WKjo+Ccod/gHJ3aHZyaXR4bVqMfZODhn2Ag4GEi4N3YnVtioKRjIOAgJOSfm+DbXqIkYiUhX2Cf4KTlJKYiW5xeYuEdGpvaW92fl1yaG1caXRfUWRxaGZTX3F2dGBwYF1og3FyaldnaWNoV21XW3RMSktlZl5hcXOFaVtcZXleXmRnemBkX11Za25lbmpzd4p9c3KBf3t2eohzhYN8f4d2doqFj5iBjYJ7k3Zsd3Z5eJN0bnd6fVh5hXGAbmd4dpGCZHaGhXGKl4aaoZuhioZzb5KLcXaNmnyJmYiJfJ9/hJl/gnlyc25vZHJ+aWZsd3dbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJqQioV6aIeKmYeBkpCGhpeNfIyMgICJjXuQjX2JhXp1e4N8cYaAlZmOkpSCiXaEiHiGg42VoKGImJGhgIlhf5SHhIeDiIx/f4JmfZGAf4CDjI+Qfm2DfYN1bG13dXR3dmtjjoKPgIV/fISAhYl/cGB0coZ9kI6DfX+SinpyhWd7hYyIjYV8hYCBlZCRk4Vub3iLfnRsbWhpd3pgZ2lpWGt0WVJocmliUGJyeG1iZV5aaoRudGJcaGBlbV9vVFpuTUdOZmRbZm1xgGtaW2NzX1xja3ZkZV1dWmxsYmxqc3aGf3Fvf3x9dHiGeIWDfICHdXiJgZKVe4mGdomBb3h5e4SSb216gHZeg390gWxoenOUc2dzh3xykpKEmp+bn4aHdXWTfm11kpZ9h5CDio2afIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lZGhoV52PX3Jzl7zEhHZxlIiPfXGWi4abkouHcmqIjpaAe5WLgYSai3yKhXx7iYt/lIh1iYZ2d36BcnWGgZ2ThZSPhINygYp3hn6Mm5+biJWPnoGJZn6Tgn+FgoiJcYF9Zn6MfHl/gIiMj31pgX6EdmdweXhzd3Rsa46Gi4KLgHmCgYWEgWxfc3l7fo6LhnyCkIF/c4JqeoWJjYeFeYV+gpmOkY1+bm16iHx1c21lZXtzYVtwYlducVNTbXJoYU5ndXhmYF5dWW+Bb3NaZWJeam5gcE9ZalFEU2ZgWWptbXxuWVtdbWNaYnB2Y2ZcXWBraWNsanN2gYNxbX58f3R1g3qDgnyBhXZ+iIGWkHiEinSBiHJ4eX6NkG9veoBxaYF4en5tbHt1lWtqeIR0a5ONhp+ZoJmEh259i3Vpd5eOfoGKgpSXinmPlW96dHFramRgc3poX2Vxelpgcnx5Z3F5YWVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJCLhW5rhZKSenmShoGEmIp8hn93d4mKhJaAb4uIcXV+e2p5hYOkkISTjYR/cICEeIZ7iJ6bl42VkpaFiHB7k4J9goKIgm2AdmiAhXlygIGDioh8ZX5/hXZkcXOAaXlxcHWZjoaDi313eYGFeoNrXHJ/c4KJh4p+h4p7iXOCb3KFiJCGhnOFe4KajY6FeW5ufYN+dXljZWh7bl5YdlpXcGtOV3FyZmBLbHd0YV5cW1p1fnNwWGddZ2pyYG9OV2dSP1hmXlpvamd5cVpaWGtlWWNweV5nXF5lbGdma2lxd3+Hbmx/foB1cIJ7f4J/gn92gYSJl4lxgo1xe4Z8enmDk4x1anl+a29+dH98b3J7epNvboF+eGeSi4KhmZyRgoVnhoNvZ3mViH1+hIKYioF8jY1peHNra2ZfYW95bV9ib3hcZGuCeWFxdl9lZdTqvYsyOj6Ljn9xeIWHjY11gpaMfpKNi35ta4SMjHV8j3+FgZSIfIJ3bnaHhIOXd26IhWx1e3VmeYKDpouCj4uEfm6BdniFfImfko+Sk5SOjId/e5KGd36DjIJqf3FogH55bnx8gouEd2J6hYJyZHJpfm51cnWCnIyBgIWAdHZ+gHOCb1xugHV5i4SLfIiBfol5e3JtioWRhYxzg3qAl4uLgHVtanaAf3RzW2dndW5XVntSWW9kTFpycmVbSXF4b1xbW1lddX91aVliW2hmb2RqTVdlUD1dZVxddWVgdG9aWVRuY1ljcXlaaF1gZ21naWtpcHd9jmxpgoR/eW6AfHyBf4F6dYKAjZOEcIGLbnd+gHt7iJKJf2h6fWpze3KFenN2fX6MeXiEfXxrjI2Dm56WjIGAbIx9a2h+jYt6fX6DlIJ+fYqIa3ZxZ2hiW2Jncm9gYWtzYGhwiHlic3ReY2SboI9uXDVar7V0aYCIfJGGdYWVhXOOiol2b2yEgod0eYl4iXySh3l+cmd2iX5+mG9xh39pdnluZnmHhKSGgIeMin5vgHeCg4CPnImElpOZioyFiXyQiHB6fYR7aH5saoB7emp7d4KIgXJgd4F+cmRyZ3aDbnV8hpaSgn2CgW93enx1f21ZcIB3dY2Dh3iIdoOJe3l0b4uCkYKGc4B+f5SJinxvbmltgYF0bVtlZHFvUFp6TVtuW09bcm9kVUtzeGlXWVpaYXGBdWFeXWBnZGlpZk5ZZ01AYGNbYHVgXXVsV1dTdGBaZG9yV2peYmhqZ21saHB3fJJraISKfXxvfn57gYCBend/f4qLg3F8h29xd4N/e4mMj4NpfXttd3h2inZ8eH+Chn+Dfn16bYSMiJmjjYSDe3WLeGtshIeQeH16gpGAgH6Lg3BycWNmXllmX3BwX2BncGZqboh0YXRvW2FkanZ7gL+cpqTIuHGEgnKSe3eFkoJzkIuHcnJvg3uDc3SGdIh3k4h5eXBjd4d6gJNpcoR2Z3d1Y2p8goedgYB/jo9+c4B1h3uClZKFe5iPlpCIgol7iYlreHl+dGd6aGt/eXRpeneAg31oYHiIfWtrdGh8gWl2goyRlX97fn9xfHZ8dH9iVnh+c3SLhYJ9hHGHinh5cXGFhI6Af3p/fnaPhoN3anFobIeBcW9cZmBxbElkdUtdbFRTWXJuYlFPdHhhUlhYXWFwg3RcYVxpZWVka2RQW3BJQ2NgW2NvXV14Z1RXVnZdW2VuaFZrXmFqZ2VubmhwdnqSbWmIjHl9cnt+eYKBgXx2fYOIhoNwd4RybXeCgn6Ji5N/cIB7d3h6gIx0gnh+gYGChHmAdW9+ioubnoh9hXp3hXtndIWLkHl+f3uIhoR2j4BncG5fZFxYZVltc2FgYHBsa2iIbmF0aVlfZG6Ad6naqceGh7JxiHdvjHR6hY1/eZKJf3RzdH13f29xf22FdJOFeHRrYHqCeYmPZnKEcGd1blttfYCQk3+AeJGTfnl8bop4g5ONhneYjJOQiIaFfH+FbHR2fmxndmRte3Ztand3f398YWJ4hnppdXVjfnxodYePjZZ8dYF3cYB7fW6AWld1f3B2hYh/gXltiYZ0emx2goSFf3x+en10jIJ9dGh0ZW6Kg2xzWmhdc2RHbW1LWmBXVlV3bWJQUnR2WFBWWF5gcoRvXWBjbWVkXm9jVFxxRkJlXl1lZ11bemJRVlx0W1pna2BWal9gb2Zma3FocHZ4jnRqjo11fnZ4fXeBhIF7dH2DiIeDb3KAdHF1foWCiY2KenZ/eIN7fIWHd4d8fYF+hIB7fnJ1eYyNoIyJeYl2dIJ4Xn2Fl4t4hoNzhYaEd4l6Ym5tXGJbW2FWaXNjYFtnbnBmh3FhcWZXXWNrf3zKzoe5oWptbYpscYNxe4OJfnqQhHl4c3h1dHtqbHZjhHWRgnZvZl99gnqMimVygmtqcWNYbHqFm4iCgXKWlHd/fW+Kc4WNjop0mZCSiYaLg3t5fXBwb3xmaHFhbXhxamxxeH19el1leoB4anZ4ZoN3aHSIjI6VfXKIam9+gXlvfV1Zc39udIGLfIJvb4qAcXdpeIGCgYJ4fnN8dYd9e3Nnc2Fui4BrcVdpXHZbR21qTFZVXVNVe2thT1R1clBRVFdeY3WGaV1gbGpmY1pvYVhib0dBZ1xgZV1cVntdTlVlcFlbamhdV2dgXnJlamhyZ3Bzd4Z4bpWLdH96eH55g4h/dXJ/hoWOgnBwe3h3dnmGhYeMhnl7f3SLfX2GhIOHfn5+fYd/fHh1eHiRk59/jHyKbXV/eGSDhpWFc5GKb4WFgXqDdGRuallfW1xdVGdzZWBYY3FyZ4ByYmtlV1tgan94vq57n7duYXOFaHN6cXiBhHp9i353d3J2b3t2ZWpvYYd1joBzamJefnh5i4RmcX9oa2taVm93iKKAhH9xmZNygXp2hG+DhJSKdZeKjomFiYV9eHRxbmh4X2psYG12amdqa3l3enZaZ318eWZzfm2FdWV1ho2Gl4BwjGdre4R1bnViXXF9bHV9jHuCZ3WHfm5xaXaAeX+AdH5te3yCe3hxZmxhbYl9bGxVaV92VUppak5RTmdMWHtoYU5VdWtMUVRVX2d2hGdeYXFoZ2JXal1ca2dKRGpZYmNWWVV5WU1WbWpZXWtkXFlkYl50ZW1kcWdycHWAd3CZhnZ/fnd/fIWHfXVzgoiAlYJuc3l7enNyhIeJiIN4gX11j358hIqNg4GEe36Lg3t2e3d3mp2YeomChml2fHtsg4OSf3KOgXCFgn+Cf3BnbGdYXVtcW1NkcGReV2JydWp1b2VlY1dcW2h/cG9ygHOJZGR5fWlzdXNygYN3gIN4dnJ1bWp6cWFna2eGc42DbWZdX31we4l/aW14Z2pkVVdyb4ymfIR7dpaRdH10fnxvfn2TiHibfYmHg4eDfXVwcWxndFxsZ15sdGRnZWl6b3tyWWeBd3VocIF4gndid4aLfJWCb4xqbXuCcWd0ZmFuemhzeIp7fmJ2hHdqbHJ1fHJ7e3R/aIB/gHl3b2RmYm2Fe2xqVWhhb1JKaGpPS05vR116ZmFNVXRkSk9TV2Frd39mXWd0aWZgVmRXYnBcS0tqV2NhVVRVc1ZMWHVkWV5rYFtaY2RfdmdtYnBpdG9yfnR0mYJ3foB4gH+GhHp9dYKEf5eFbnJ0fHp1cYSFj4GAeot1c5B/fIGVjYCFhH19jIZ6fYB3e6OlinmIhYRrdHt6dYKAi3puhHN5hH2Cg3ZvamllVl1bWlpTYm5kW1hhc3tqaG1pYGJYX1ppf2lrb4BnbGBoeXhqcnNzbYOAen98dXRtemhqeWpfZW5ogXaPhGdlWGJ3an+He29qcGdmXVRYb2eNp3aAenyQjnp2cYBxdXh7koJ6l3aGhICGiHZqcnVnZ25bbGNdbXJfZ2FqeGh7bFtug3J0anCBfnp4YXeGhXmQhXSJcnB6gXJjcmldcXhlcnSIfHljdIBxZ2p5dXNteXl2eWWFfH95d3FkZGNte3xqalRnYWVTSWtmT0dRakVgd2ZhTVNyXUpNVVllbHh8Zl9ucWplXVZhVW5uVkpTZ1dlXVhNVWtUSlt5X1tfa11dWmJlX3lobGFvb3ZucHd1eph+dn+BeYCAh4Z6eXqDfoGTg3F0dH56dnSEiJF9gHyQa3KVgHuCn4V+h32AfoaCgIp7d4Srnn96h4eDa3KBeXWAfoB0boZufIBzioBqcG5kZFhfWllaVGJqZ1taX3WCaV5tbFxhV1xca4FlcnR9aWlca3Z1Z3N2cWyEe318eHVxbHlnaXhmXWRzaHp3koFjY1RlcGiChXh4Z2lqYVdWWWdjjqdvfneAi457cXJ/aXtxfI59eJBzhX6AgIZuZHVyZGdnXGphXW9vW2debXRlemhddIBvcmtxfH51dmJ0hox7iYiBgXlzdYB2YnFuW3J0Y3FzhXx1ZXOAbWFte3Branx6dnRnh3Z7e3ZxZWJkbXJ9aWtTZ11cVEtxYlBGVWBHYnZmYUtTb1hKTVhYaGt2e2VlbnFnZFpXXlh3ZVRKXGJXZ1dZSFdkUEhieFpdX2xaXlxiY11+aWpgb3R4bXBudoOXenKAgHx/iYyGfXV1hniHjHxzdXWBeXp6gYyOfH6EiWlzloF6ip1+foV6gXp/fIaJc3GPrYx7e4aPfWRxh3lzfHp1cm6GbHt+bI96Y3BvYmVdZVZZWVdjZmtfXVxzhWhYcW5bXlhaXGx7YnB3dWxhWWxzc2d0dW9sg3h+f3h2bW5zZGh0ZVtndWZ2dpF6X11SZmdrg4J0fmJkalxUV11iY46kaXhzg4aReW5xfGp6b36IfXaKdIJ5fXmAaWR2bGBmX15pX110a1llXG9vYnplXHd8a25ucHh5dHVlc4STgIiDiXt3cHN/dGN4ZVxxcWJxcoJ8dGdygGVfbndqZWh6fXVvcIN2dH1zcmJfZm1ufGRoU2dXWFNNdl5QSVlXSGJ0Y2FJVG1TSk1aV2pscnxjbW1zY2JaWlthd1xTS2NdV2hTVkZYYE1HaXVYXmBsW1tfYWJchGloYW54eW1vanaBkHltgn6AgZOIhIF2dIl0jIZ0cXZ2gXh9fX6MkH9+k35wd5WDfJiSeYCAeHp+gHSIhHRxmaF6en+JlHdjdYd4c3d0a3Rvfmt4fHCRc15wbmBnYmxUWlpXaGNtZlxccYllU3JuW1pYV2BsdmNpdWppXlltc3Brc3NzaYR8fn56dm5ta2RpcWNbanJkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEknVsbHtvcHJ8fX1zgniBdHt6emRldWddYllgZ1tedmhXYl1waGF3YVt8dmlqcm94dHN1aXGCloSHf4V3dGtxfm9neFhdbG5jcnOAenNncH5cYHByYmBrc39tbnZ/c3F4a3BhXGVsbHpgZlJlU1ZRT3VaUU9YUUhjc2FgR1ZqUElQWlZra2t9Zm5vcmJbWlhZbHFXUlBmVlZoU1RFWVtOSHF0WF9jbGJYYGBhXYtqY2RtenhscGl1eYd7a4N9f4SafIOEeXyHbY+Hcm52enx0goJ8i4+Cgpd0eIGThYGeiXWBgIF0f4JxiIN2cKGWc3qGi4Z6ZXeKbm16bmZ4cHprc3ZzjWtedW5hZ2VrUl1bVWdhbGtaXHGMZE9vbl1WWFVnaXNoYnRlZFxYbXRsb3V0eGqGfH97h3aPcmNka25hXG5tY3N4h2taVFZjZHh9fXGGXWRfY1RaX1lilZVjbXCDhYp0a2l8cGd1eXV9bXt1dnB7f3VfZnJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXRxdHF1d2tthZSCiX2HcnNncH9ydHBUXGdrZnJ0gHZzY212VmNybFtfcGd+Zm54fnN0c2ptYVpkaWp3XmVTY1RVUFNsVlBWUlBHZHJfYUZYaU5JWFRXbmllfWlseGxiV11VW3RkU1JXaFFYZlRTR1lZT013dlpfZWtpWWFgXl2ObmJma3l1bm9pdnaAf2yDgH2HmHuAh4GJfmuTiHJmdIB7dYCDfYmOf4uTcnyKkYWHn4Z7f4aMc4GGc36Cdm6ki3KAjYt2d2x6jGBke3BmeXN4bG1xd4NnZHxtY2ZnaFNfXlVnX2xuW15ujWhOaW1gVFZTb2dza2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVweH5nWlZYYGx4fHtwhF9jX2dWWF9XY5uIYmtwgYd9eGxsem5deHNtfGt2dG9wfIFzWGpuXlhcVWFiV2RwY1NeYmlhYmxaYX5sZmx0dm9td3dsaYaNgIp7iW5yZnJ+bnRuZFthaWlwdIF0c15pbVNlcWVWY29kfGRzeH13bHBta2BZYWZndFxkVWBVUk5XZFFPW05PSGRvXGJHWWlNSl9LWW1kYHlpbn5lYFVfVF11XFNSYGZOXGBVUklbWFBZdHVdX2VraFhiYFtejXFjZ2p4cXNuaHZ0e4RygoN6iI5+fImHjXlukIl0a3OBdH9/iIWHkYSVj3l9jI6HkZuEgHyMhXN/gXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY2NjY2Njo2NjY2NjY2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6OjY2MjIyMjIyNjY2NjY2NjY2Njo6Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmOAvru7u7u9s21mZ2dnZ2dtbm5ubm5vamZnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fW37IxMTExMa7Z15fX19fX2VnZ2dnZ2hjX19fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJjJKRkZGRkZCJiImJiYmJiYqKioqKiomIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkZKRiYeOipCSk46Ijo6NkYiPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6Mi4uLi4uLi42NjY6Ojo6NjY2NjY2NjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCRioaNh4aJhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJGKhImGhYWFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+NhYSHhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4WIhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Mi46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/QD48PkA/PT09Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkVAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8e3t8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/O0FDREI/PkE/QURFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdISElHRkJERkREQ0FVdIeJh4eGiIJXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS01KS0hIRkZHRkVQbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9fn99fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTUxJRkpWbIGGhYSEhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXp7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lJS0xPTk5RTlFecoGFg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QTs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5/fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSExLTlRne4SEg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODo7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRGRkRWeISEgoKDgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NjY3NjU6Ojs6Ojw4OTg5OTg3Nzo6Ojg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09RV2tycnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEQ/UH2Eg4OEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj48Ojw7PDs8PDo6PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj0/P0N2hIOEhIWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUFCPkBDQUA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEFAPz9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6Ozw6Ojo8Oz0+QD89YYWDhIOFhIaJiYiHhoaGh4iJiouLioqKi4qLXj5ER0lLSkpGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj06PDo9PT4+Oz48Pz5CP0p+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRUNERkdGRENFRkRCSElLR0hHRkdHRUtKTElLS0pDRkNDREJBQUNCRENDRERDQT08PkBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc7Pjs8Oj0/Pj88Pz5CQUQ+aISChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtGREdISElFRUhGRkVMTE1JSkdHSElKTk1PTUxOS0hGR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6PT88PT0/QENCSFN+g4SEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExKSUhGSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTk9OTE9LSUdJSkhJRElISEZGR0dJRkNCQUNVb3B1d3h6e3h4enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozc8PTo8Pzw8PT9CQ0NMbYSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4teUlJQTU5NS0pHRkNISkdMSkdLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OD89PT5ARUQ9QkRDRkp1hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUZGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1JQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz08QT9BQURUS0JISUZJS3iGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQUNGRENES1ZQSk9PTlBQeYaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVZdWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01LTEpJSUxNS09NU290dnh5eHd5enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1FQVFZVVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU09PUU9RVlFTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JVUk1PWVFNTlFTVVVNUVNSUE5MS0dDSUdSU1RaXW1ydnZ1dHR3e3p6e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRgZF1eW1lVUUxJTElhbJJ0UFFTTVFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQT9EUENDQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdISkdDQkFDQE5QTVJkdHV2dXN0dnl8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZoZWViXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojo+QD8+Pj5qUEthRUZISUVCP0hMTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz48PUI+SU1GVW91dXZzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxuamhgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcT3tOT09OS0xNT09QTEtMV05IR0FBPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx8fH59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJTVlhTUllUTllaW1dZXF9eX2VfXV5xd2teYGdrd29vbGpvbW5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FXUE1JREY+OTk2NTg3OTc5OjM2NTc5NTxCPWZ0dXd4d3p5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT01MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE9KTk9VU1RcVlJVU1NPTUxJSEhGPz49Ojc4NzY1OTk2NzU2NVdxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFdZWVlSVU9JR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFBPTk5NUE5UUlBSTElMS09SUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVlFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPTNAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMT1BOTVBRUU5QT0pMTU1LR0VFQ0I7PT08OT1HNjY3NkRucXV3ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVVlZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JCOERNU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FMTk5NSU1MSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHSkpARkFBQEVHRElPSFFSYVxRUFJPU05PT0xMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZFP0JDPj1CRz9CP0BkcnV3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU05LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48QkFAR0pFTU9iZVBNT01XS0xOS0tNTUxMS05OU2RNSkxSSUlJRUJJSkxNTkpHSUZCQkJAP0VGRUhETG9wdnp5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPj8/QD1DRURMTVFUTEpJTVRGSUlKTElKS0lJTE1PUFFQS0dDS0dDQ0tKTE5PTklKSUdDQ0NESUpNTElac254eXh6ent5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFISkNGR0hHSktJSkxER0I8Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHSENDO0FAQj5AP0JERElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJISUROR0JFTEtOTlFOS01KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhlcEZKQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREA/QkNFRUlGSkpMRklJR0ZGREI6QUNDPj9DQ0NER0tNSEpOSERIRUlMTk1ISUxHRkZJSUxOS0lIRU9JQ0dOTVBOUE5OT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjs7Oz07PT9EQj9BQ0ZHSkZKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRkVGS05PS0ZISUZFQ0RJSUhLSUdIUEtESk1NUU5PTk9QTkpKSU1SVVVSUFhlYWFtZnByb3J5emdlaGhjaWxmcWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VERkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdKRkpHSUdGRkZEQ0JBQUVGQ0JCQkRFRUdHSEZMUExITklKTEtJRkhFRkVDQ0hISEtKR0tSTUNPT05RT09PTk9PS0tLUFVXVlZUWWBfXWlgbWluaHJzYmVmZmRoaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01HR0VHQUFAQ0Q8QUFAQzw4Oj0+Oj89QEJAQEBERkhFSEZGSEZFRURDRUJESUZDR0VBRUdFRkZHRUlNS0hRTEpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9NT1BNTE5TV1ZXWVZYXlpdZGBoY2ppZ2tfZGVmY2hnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hBQUJFRTxAQ0JEPDc6PT47PjtBQj4/P0NFRkRGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01KTEtISktGSUhKSEVLS0xMTk9SVE9IVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSENBQ0dFPEBFQkQ8ODo+Pj48PEJCPUA+QUJGQ0VDQ0dDQ0RERkdHR0lGR0tIQ0lIR0lHRkRIS0lGS0hNS0pLS0hLSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXV9jXlxiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJSkhKRUJER0U9QUdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERFREZGR0hGSEdJS0pFSkhISkhGRkxISEhKR0xLTExMSU1KTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJmXWRgZmdgZWhqZHNzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd3B3SUpLSUtHQkVERTxBRkREQjs/P0FAQEBEQUBCPkFDSEJFREZHRUhFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0pMTElJTEtNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFiYGNkZWFkaWJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV0ZXFza3BxanJ2cHdKTExLTEdDQ0FFPD9FRURDPUFBQ0JCQ0VBQ0RBQUVHQ0dHSEZFSUZDR0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlBMU01KTU1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY15gZmNhYmduaGJpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PURFRkM/Q0FFRERGQ0JFR0NCSEZCSEpJR0hKRkRLSkdISkhJS0dKSk5LTkxJTEhKTUtaZkpkW0tsUkdOTV9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbnpmXGx1YGxrVmB3dWhqZ2hmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj88RERGRENDQkVFREZCRUZHRERKRUVKTEtJS0xHR05KSEpLR0tKSUpKTkxNTUxMSU1MTFtzYmRwXmxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2lqZ29xdGV0bm5ccHZncE5Mcnl2a2Fha2VlbHhta3Zsbm9zcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FBPz1CRUZCRUNFREVFRENISEdEREtIR0tNTUpMTEZKTkhKS0pJTEpKSUpNTU5NTU1LTk1NW3Jwb25wcGtqTE9QbVhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcF1gc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRUVCQUI9Pz9FR0JHREhFRURCRklISEVHS0pHTUxOSkxNR0xOSU1LSEpNSUpJSkpOT05OTUxOTUxcaGR1XWxxVmtNT1FuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0tSUkxITU1JTkpJSE5HSkpISU5PTU5MSk1NSlp0cHBvcXFsa09RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpaXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0RERUBAPkNDQUZDSElNSEZDRkpMSUdGSk1MRk9KSldSS0dLSkpOSUlKTElLSklJS0xNTUxJS0tLU2tiWWleX2pjcnJaX1lqb19lZVVrX2NbYWFRYG1oXGpcbmlpZFtvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRkpERUNGQUBBRURDRkJISkxHRkNGS0xJRUZKT0xJT0pMW1FKRkhIS01JSEpKS0tJSElHS0tLS0dIS0pMS0xKSUtMTlRbXVRQVU1RT05PT1ZRT1BRTk9RSkpOUFFkcWlUWVZbW1xVWVpdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQEVDPkNHREVHQ0lLTEdGREdKTEhER0lQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKSEhIRUZMSUhKTktIT1xXXk9cXGBeT1hZU1xcYl5NWFpNWGFSS1lhWlNgZFxhWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETExBQ0RBRElFR0dGS0pLR0VFSkpKRkRHSFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklMSUpUX1lgWGBhW2BVWFlUXV5aX1JZXFBeXFlOX1xeU1teZF5aXWBjX1lfYltgXltVWVhaX15jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXp6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSERDQkNGR0VHR0lKSklIREZLS0tFRUhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRkNERUJGSkQ/SUpITlpiWV5eYV9SVFNXX19cXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmJiY2NlWlJZVlddWl5kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkRHRUJFR0hGR0hJRkdKR0hGSEtJS0RDS0pNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0lFRUBEQUhJQT5ISUZPXWBaW2RdX1RRUlhdXFxcX1tLV1xMUlxZSU1eUVFdX2JjY2NjYlxkY2JkY2VYUldVVF1ZW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSUZHR0lHR0pGRkZJTEpORUNLSkxOSkxJS0pJSUdCSEhRTUtLT01LS0lISEZFP0VCSEhBQEZFQ1NdWV5YX1lfW11VWFhPXFxRS0pWXlheW11WWmFSUl9fYmJgYGJiX2NiYmRkYlhQUlJTXFRcXV1eXl9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0dERk1SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0pJR0RIS1FPTUxQTUxLS0lKREVBRUNIRkFBRkNBVVVFXFReU1ZfWE5UVU1ZWkxKS1RgYVtfWF9eYl1PWWJcYGBfYmNhXWJhV2BfVFFQUVJZU15cW11dXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJU2NRRVdfSUdHSERGTUpQUEZJSEpLTkxMS01LSkpHRUpOUVFOTlBNTk1OSUxCREFDQ0ZDQkBDREBMSENMTFBPTkxGTUZGSElHRkxLTU9QSUxPUFBTUExRU1JVWlhXWVdXY1ZOUlRQUVBPUVVUXFlZW11cYWFlZmNoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtOXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BTU05QUE5PT09ITEZgRUReTERmYkNMWkheXHNtT01WbVhLQ09fVGtWZ0ldV1VeRExRVUxNU1ZRUlRYVlRYVFRcVE9lWmhoZVpVa1RYV1VbXFtgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS1BUSktHYFRISk9KSU9NUlFLTUtMT1JVUk9QSkxOR0hNUVtZT1BQTlBRUEpLUX9RSXxZWXJzV1BtR3Fub2FWUHFxdE9CanNucXNwU29fW25YXVZcWFVraFVdVmNZYFlaXlVVV39pdHV1X2F2X1hiXFxmW19hYWFiXmBjZ21vbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TUlFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT01RVE5PUVBLTE9HTVBTW1pUUVJPUFBQS0laeF1UeGRoWFJTUHZmdGxwYm5ma1JyTkx3bWpycHNycXJwb2+AXWV6dXhxcXpxfnJ9a3V9YVJofGVzc29zc3x9b354b39yYGBgYmJbYWFobG5rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NNS0ZgXUdBRU1NSEtLSEpQT01OSk5WXllVTFFTTllZTFNSUk5MUElRUlRZV1dRVFBQUFJLSGd4bGN4cW1aSktUeXB1bXVibnZQZGRIZXZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGhuWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVnamplZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3Z6bnx9eXhybk1JUnROQ0JFUFFIS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWNoYFZuS3FwXkdoeVd2VEtoeH13YHl7c25hXW1vZFNncnVubXlwd2x2c3RxbG1cc356a215fGx1bnxscXZ1eF5fX2JfXV9lZWlnaGZlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUtNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05SSVJtSGl3S2BkdnZUVmxObmx7cmFqZ391VEtXa2d8bG1seF9acHp7X2B6c2Nyb3hxaGR8aXJ7XVRLa192dWxqdnx7bX55a3xwXV5eYltfYmRlZ2ZlZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbG1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTExTU1JPU1JYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFNT1VMS0tSU1JRUk9WVVFRT1JSWFhQTU9VVFdYWFtbVVFSV1tXWFdbT1JUV1dYUV1YVlxVVE9YUldXWFlaYFxncl9bW1pdXV9jWl9jY2VnZGRkY1pkYmdmZm1ubXVmZmdjYGZeXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJOUlFQTFZVVFBUVVhVWlZSW11WVVRXVVlYT09MTldUUE5VU05QTkxRUEtJUVFLUU1KSk9RVFFQUVNSSkhNT1BRUlBQUFRVUlhXXFdTUlBRVVVVU1pRTlJRV1VTWVZUWFRTUVRTVVVZWVheWl9hXVxaWlxcYGNcXmJiZGdlZWViWWBhY2FiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVJNWFdVVFZYV1daVlNcYFZXVllVWFRRUEtPWFNQTlVQTlFOTFNQTU5VU05RTk1OUVNPVFBSVFROS01PUlRUUVFRVVdVWVpbWVJVUlRYV1ZZXFNPU1RXVVRZVVZYVFJRV1VWWFxaXGBdV1lfXV5dXF1gYV5bYmNjaGdmZWJYYGBiXWBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWU1RPS09WVFBPVFBQUU5NUlFPUVhUUVFPTU9SVE1XUVNUVU9OTlFUVlVSUlJUWFZaXVxaVlZRUldYVVtbVlBTVVVVVlhTV1dUUlFYVlZbX1tfYF9WX11eYF1cYF9fX1piY2VpaGVlYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVVFPVlxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVdTTU1ST1FST01QU1JVWlVUUFBMUFdVUFZSU1JYTU9QUlVYVVRUU1RZWFteXVxbVlJPVVZVW1pWUVNWVFZYVFNYWlNSUVlXV11fW2BgYFZiXGBhXWBiX1xgXWNhY2hpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFJUU1lbV1VPUk5TWFVTUVRRUVlPUVNTVltWVlZTVlpYXV5cXF5WU05UVlZbW1VRVFRVV1hSU1lcVFJSXFhaXV5dYmFgV2JbY2JeYWNfXGJhYl9kZ2llZ11cZGBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSWFJUUFtdXl1cYFxgVVxcaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUVZVWlpaU09TUVVVVFJOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aV1FUVFdYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXl5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVldWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVUk9XUVNXU1dVVlteWFtZVVpeWF9eWVxZUldSWVhZX1lZUlRVWVlZVVdZXFVUWl1dXmFiYGVkXV5dXWVhYmZkXl9kY2BcZ2VoZmRiYGVhX2FhYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXFVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFJWVVNRUldRU1ZUWFhYXl5YXVtVXV9YX19YXFZRWFRZWlphWFtUVlhbWVpXWFlaV1ZdXmBfZGNiZWVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlRcVVdXWVdWXGBhYmNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJVVVFTVVdbW1xfX1pfXFZfX1ldXlldVlJYV1lZXGJZXVVWWlxaW1paWVpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkaF9nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVZYV1hdX2JhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVVVU1VUWF1dX2BgXWFdV2FeW15cW15YVVhXW1pfX1teV1hcXFxdXVtaXFdaX2FeYGRkZGZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpZWFpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVVdYV1ZWV1ZdXV5hYmFfYl5ZYV1dXllcXVlYVVZbW2BeXF9ZWV5dXl5gXFpaWVtfYl9iZWRlZmdoY1plZmdpZ2NfY15hZmVaaWljZmljZl9iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYXhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW1xfXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVtZWVdZWmBeYWJjYGFjX1xiXV9dW15dWVlUWF1cX19eX1taXl5gYmJbW1dbXWBiYmNlZGdmZmdlXWVnaGlmY2FiW2NnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXVlhQWFpdYWNmZnJrf0pZV11bWl9dXF5cWF1bXl9iY2JhYV1iW2JkYmBjYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeXl5aWFVbXlxcYWFfXVtgYWJmYl5bU1xfYGNkZGZlZ2dmZmZgZmdoaGdkZGBbZWdeYWhoY2loZmNgYmBjYl9fX11dW1pbWVhYWFZaV1xbWlZWVUxYWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaJh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl6e3t6ent6enp6enp6enp7e3t7enp6enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXp6ent7enp6enp6enp6e3t6e3p6enp6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09PPxMXFxcXFx9LU1NTT09PEvr6+vr6+ytPS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk5eDU1NTU1NTW4+Xl5eXk5dLLzM3Mzczb5uXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f4B5d3d3d3d3eHl6enp6enhvb29wcHBwcnJycnJycnd6eXl6enp+g4ODg4ODg4KCg4ODgoOEhISEhIODgoKCgoKCgoSEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dXZ3ent4e3h3dnl8enp6eX15eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl6enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2enx5fX17fXt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fnt9fX1+fHh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3h5fX17fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eHp6enx8fHx7fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h6enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLioqLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWFhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYF/gYGAgIKBgoKCgYGCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhYSCgoKDgoKEgoGChoWDhYODhISEhoWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIaFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIODgoOFhIWHh4WEgoB/f39/f4B/f3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChISEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhYOFhIODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiHiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWEg4WEg4KCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4ODhJGSkY6PjYuHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWGiIuKhoSGhIKGhoKAg4ODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFg4GAgIF/fn2Cg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICBgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx8f4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f35/gIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCBf3x9fX59fX6AgH59fn17fX6Cg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB/fn9+fn58fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36AfX1/gYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZKSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoOBgIF/gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKBgoF+fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeIh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWGhoeHhoeHiIaHh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYmJh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoOEg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjYuMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGDg4KDgoKBgICAf4F+f35+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICBgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRi4yNjY+KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4d/fXx+gICBgH9/fn19fX1+e3t9f39/gH1/foCMkY2LjI2NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19fn9/fX6Afn5+hJKMi4uOjIuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBf4CAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4WChJGOjIqJioeHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn59f358fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3p8eXt8e3t9e31+fn+AgIOHiYmJiomKiYWIkY2Lh4iGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uKiYyQjYyIiIaFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+MioiIhYSEg4GCgoKCg4KBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6AgYOHhIiNjImJhoWEhIOCgoKCgoKCgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSBgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiYyJioeFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB9foB+fX5+gIB/gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX1+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX59fn59fnx7fHp8e3qAhYKDhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBf3+AfoCBfoCBgIB/fn5+fn59f35+hYWAgYB/gIOBf36BgH9+gH6Af359e3p7enx7eoKDf4KCgoKDgoOCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3t6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAf4CBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fn2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSBfnt7fHx8fX19fn16fn1+eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4ODgoGCg4KBg4J/gYB/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGBgX5/fn5+fX19f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH9/gYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYOCgoOFhYKCfn58e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgH1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYGBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKMenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgYGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+BgIB/gIB/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGFg4OEgYGDgIKDgYGAgICCg4KAgoKFg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICCgYaChIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGDgYCAgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnR9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn91dn+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4F/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhISDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx8gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4KDgX+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+fX5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WBgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fXx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYuJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgISDgH99fX59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfH9zgoN/g4N9gX19fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9+fX6BgIF9gH59gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeHiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoWEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgoF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFhIaHhoaFhIaHhoSEhIWDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59f399foB+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHhoeGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWEhoaFhIOEhIOFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGg4SEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEgoSDgoSHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeFhYeFhoWGhYSChIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eGiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODgoKDhoGDfoKCg4CDg39/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaHhYeGh4aHh4WEhYWDgYOCgIOFgoN+gYGBf4OBf39+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFh4aIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4aFh4OEhYSGhoaHhYWEg4WFh4WHhoeFhoaGhYaGhIOEhYGBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWGhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgH+BgICEgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyHhoWGhoaFhYWEhYWEg4KBgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCg4R/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18f359fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg39+f4B/f3+Df3yAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e316e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIWHhYeFhYKDgoGDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIN+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5+gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDg4SDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6enp6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhIWFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfn2AgX9+f318e3x9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc6PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw4Ojw+Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo7ODk6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk3Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1NXU1NTU1NTV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2tra2dnZ2dnZ2dra2tra2dna29vb29vb29rb3Nvb29vc29vb29vb29vb29vb2tPS09PT09PU1NTU1NTV1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqJkpmYmJiYmJiYmJiYmJiXjIuKioqKioqKioqKiouGgYKBgYGBgYGBgYGBf4/T0tLS0tLS09PT0tPT0t3j4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTUWJsa2tra2tra2tra2traVVTU1NTU1NTU1NTU1NUS0NDRENDRENDRERDQz9d0tPS0tLS0tLS0tLS0tDg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1ZlcG9vb29vb29vb29vb21ZV1dXV1dXV1dXV1dXWFBHSEhISEhISEhISEhEYNHT0tLS0tLS0tLS0tLQ3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJhb3h3d3d3d3d3d3d3d3d1Y2JiYmJiYmJiYmJiYmJcU1RUVFVVVVVVVVVVUWvS09LS0tLS0tLS0tLS0t7p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy83Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzLy8vMzMvLy8vLy8zMy8vMzMvN1NTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7O0dTU08/O0dLOz9LU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tfX19fX19bX19fX19bX19fX19fX19bW1tbW1tbX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7O0bCDhJPO07iez9GcgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8mbu7idr7eXmbm6lbi5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9HDoo+Aicmdo6iy0ZJ9fq+x0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv56Kp9DTwoaatdXTzZ6exNDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P0bqkrJye0dajmLTU08CgoNDQ0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz9HAoJ6TpbfYopm11NWwoqnV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU6OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0qavrpum2aKZtdTVpKG51NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHJ18SYoNmimrbUzp6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzs8OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXFjZ6gnajao5q118OfodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HJwaGtoaC/2KKbtNmypKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09WrjY+p1dayhMbWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MG91dLS0cTV0dHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQD43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHU1dLS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODc4NDs/PD89OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg8OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTY2Njc4ODo9Ozw+Ojw6Oj09OTw8PTw9PTw7PURIRENBPDw8PD4+QDs4PDgxNTpBRkVXrrW1tba3uLi5uLi4uLi3uLm6uri4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODg5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg1NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU5NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTc4Nzk3Ozo6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlqKmmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTo+NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFCPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNAREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9CQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6Ozs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ozk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD4/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5AQD1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo8PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8Ojc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3Ojo7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ubm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuOj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDY8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVj4uUk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODUzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMj4+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEFCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouHiIWEiIiJhICCf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo8Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU3QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIx/h42Mi4uHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI1NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpKOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxkY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGdiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbX15aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MjQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2rpamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk7Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3ODo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFoYGZzb3NpdGNpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bm1bYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw7PkJERT4+PUBDQ0NERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tbPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqTkZmXnqGVmJqSmJSVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJCQD1AQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGwMXHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tL3BwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4uLu2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmbmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3hmZl1kW1JYSUY/Ozc4ODc2MTY5NzU0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw6PTs7Pj5EQUFDQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/JzsnBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvbi+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3YmJgYF1YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNTs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lodG14bF1kW1VfWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw/PT9CP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLysjGzMnNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZHRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8O/v77Ey8jKy8i8u8jHyc3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr7CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZiWllZXFhRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs7Ojo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7q9wLm9urq0v7i1t7Ovu7y3wLe+wr/Bu7/AvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCnoaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVVVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6PD1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wMC3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGhoqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWRmb2lla2dYWE5LS0pSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88OTc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8try8wMS5t7e3trq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8u7q0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYmxfW1RIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz89PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4trfAv8S8wsXFx8fKycbPwsG4rra1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrq/wb+9tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2dhW2JQS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw7Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuro7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmFhTUhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+ts720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+QkVJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PUA+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdWl5cWVFFRENNSUFEPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCOz8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypqKlqqyvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG1oXF9fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcmJqYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d21wYF5lXVtUSjw+P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3srKytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZxbF5iYFtdTkhBPz1IQ0ZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWTmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d298b3VybWNcZlhcXVJOTUE+SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY2OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKx77AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqZqanpqhp6emp6mvtrKrtLavqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c210aWtdW2pUXVxPTUhERkxBRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vbWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubO0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIP0hRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODs9Pjs8PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aipJ6gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7W8vbiyrbOwr6yut7aytLWvqqSem5ycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclZCMj4+Qk5CWlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFBoVFBOR09MTENPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Oj07OTs9Ozw8PT48QD0/PDg7QEBBPz8/OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLm1p6Wsqqi1srGwrq+yp6avo6+utcG6tbeyt7aytKuytK6qq6+wsrSupZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsKOlp56gnJWTkI+RkJiQlpWYl5+Ym5mbo5mXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk1KTUc7REA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkZaXmZmdoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZWal5eYoJ6cnJeboZuemqOnpZ+hoqKjnJuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh6YGJSVV9ISUlLU1RJUlBMOT5BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZyempSYm5qRjpGWkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruqimq6erq6msrKegoKOxrbGxtKmxr6KZnJ2eoZmbm5qYmZuUlZqWmJykoaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVcU1pZTVFKTk9UTFJMQTc+QjY4PDc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpJ+ckpyim5+ho56doJ+joKKvrqyvsay2p62xraamsK6trLCnoJ+ioJeRlJyhnJmYkpOfnaGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwp6uosrW3s7essbSjoJ2loKyhoaKgn5qYlpWfm5uYpKGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1tWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpyhnZ6ampKYnpyioqCgnaKfn56fqaunrKmqtKurraulpaqoq6yqpZ+emZKSlJiZlpaWjIiLj5WdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oauiqaiyqaqop6eamZ6Zqaagmaegn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5mWmZ6bnKSfn52knZqdnKSipKOiqq+sp6mjoKGsr66qq6egnp+io56fnpudnJSUlZWenpiUhp2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK6nsa2xwra4wsbAyMrAyr+wubm9ucK9uLO7xcO8wru3s6myraqztK+zrqmuo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppmboqSen5ubm5yHhoF7dHJra3VycGhXXFFFVEhESVBIPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpZ2Vm5ufmp6dn6Wmp52goKyxr6ekpKOhn6aspp+XnJSRmZ2ZlYyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczLzNLHvr/Awr3HxsK3w8nIwsDFvbmzubq0u7ewtbKqurGuu7a+urqqt6yqqri6tLuurbijpaKep6Wio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR+enJrZGlveGplWltGSkxERFNMREJENzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZudnZ+fmpeYmJONj5aXk46NkIyCg4J3c3FucI+mra60ucW7zcfLv8LMzs3MyMnRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zTz9PTzMrCxcbGysfOv8jQy8bFxsTAu8LAvr6+tb2zrb6/wsPGxMbDrb64sri8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gnJmXlZOUl5GQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXX0tfNxsfJzMPFys/K09fR19LV1dPTyMzHzc3J0szN083Ex8nJwMXLx8jIxb7Cs7PHxMvKys7Fyb+9v7zBxsTMzMjJv8O/ra+yqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/e3J1dmdiaHdpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmflKOYlp+enaSvm6Cwq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyblqmWjZeNjI2XprCupZ2enaGlop6blpWWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTSz9HD0NPW19XW0svJztDLxs3SytLV1tnV19PW2M7Syc7RzM7Qy9LPv8fGycLLy8vOz8XGx7a/yr/SzMvPxcnHv8PCyM7Mz9DOzMrHzbi3u6ifpqunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmrJqksLGpqLXQ1Nfa0sfGy7S2wsaytqmipaahoqu1p5qxoZaVjJCmrauclZmhnZuhop+dnpuWinhpZGFfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTPz9XU1NHRzNHO09fW09XQz9LT0cnT0cjQ2NfY0dfS19nV1szOz8nM0cvO0L/FwcbFzszQ0NHIy8zAysvF087LzsfDycbGyMvK1NPQ1M/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66rqqudpq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOjtqqfnaGqqaGYlpiam52hnpqdnpR+cmZjY19fYWBfYWBfYGBfYGZtcHBua29ydnebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0crPzNPW0tHWzdDV1dHG0dTK0dTV1s7S0NjY2NfLyM7DyM7Lysy/yb/HyM3Nz8rQzc7Lzs/Hys/Qys7KwcjGyczKy9HSzNPR0c/Pyr3HubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bva2JlbnBhV1xaSUZGRExXRTtAPDMzPD04Njg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw9PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snnri2tbWtpa2uvrWxwNnT19rc1s/Ny8PT0MLCsqutrqyms7K5q7O3qaOfnJaUl5yen5+elZaYlYpsX19eYWRiYGBhYWBgYV5fX15dYm1yb29zdHV2eaS+y9XR1tTT2NbOztPLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zP0dPKzdHV0tXVysDJwcXMwsjJwszCxcfKys7KzMzQzdPLxcfPzMfHysTGwMXJy83P0MbPzs3NzM/Fx8C3ub3Cw73DubKzvrC7w8S2qpiloZmWkZWVkouUjZqRlJSPj5SCiYV4cHJrbWhgYHFoWFhoVk1HTElQUEI7RD47Njc6ODk6NTY9PUE8Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfDucvV1tna29jMzc/J1tbFxLiytqqkrq25ubGywKGXjo2YlpCUkpGWl5aRjH1mYmNiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycTJycbGv8PFzs7HxcfNytHIy87NxtHSz87M1MrHys3Ox8bP0svQz8W6xL7GybzCxsjOxMLHwMbNx8PLycvPx8PDz8jGwcbHw7/Ax8vLy87CysvIx8zQxMXHusfDyMjCz8C9vL+wwcrHur2qsbKnpZ2inJiQm5CkmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU8PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTs+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrQ0NLUysW6vr6wqberv7q5s6WSjo6WkIaDhISCfoWFgHRgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6v8O7u7q5vsjGwsPAw8fKycjKx8HFy8bIy83JxMHJycHBy9DEy8i/ucG6xce9v8XOysO/w7rJx8i6x8bEysC9wcvGxcO9xby8v8PEy8TEu7/JwsXH0sXByL7KycbHxtDDw8bDr8TLx8TKt7+8urSprKWlmJ+YrKOhpZqjoJuUe3ZydGZpWmFubVpbWFFETEZCR0RMQ0ZSPzU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvQ0czHwsPHzc/OzdXQ1tnY2dDM1M7P0MvEuMbBtrW8scC2uqyRjJOXh3uAhYaAdnh1c3FfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbBsLa6srK0srHBvLu7ubjAwcHFvr25vb+5xMrFxsK9xsC3u8TJv8LJu7e6usXCvrzBzcLGvr21wL3DurzGu8K5s7zFw8LCtr+2tb6/usvCvLW6yLq/vcvDwcXCxcjFyMXQxsLMx7LGycPOzcHFwr+9srews6eoqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk7PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc3P0snRxtbV1tjPzNDIzcjKxb3KwbK1ure7tq+RjYqMhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rAuK2wsKeqraynuLS2tLOys7q1vbG3sLSusrvCvMHEvL+6tbK6vsC4x7izu7XAwry3vcbAw7u1rrK2ur6zxLe6tau4vL3AvbC6tq+2urLFvLauu7+0trTFvL7Cxb/DxMXHy8XAxsa7x8vAz8nHw8bBw7fDvr62ub7Gv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkNBREU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6ars7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLyczKy8bRz9PRz8fKxsrFxMC8z72zub25uLebjoeJint5foeGd3iBfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBtaGZqbm5yfKTHv7m4tbCrrKeeoqqnnquss62pq6mzrbawsqiupqyyvLq2w7m6ubCrtbm7tMK5r7+wvby7tbvHucK2raqosLHAtbi8r7CnsbO0u7yrrbWlrrauurGwqrmvrbutu7i7v7+9ucK/xsLFwLzGwcjLuMXHxb/Hw8O6xMbCu8XJzMuzucK8urKIcnZ2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOzk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojk7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs/SzMTGwsXQyM/DxMfBxsbFxczDyszDxMHHwLq8u8q3tLu9tbWrkYmQkHx5foqGenuEgXhuXl1dXV1fYF9fZGNiY2NiYF9eW1taWl1aWlpaXWRtb2hnZ2lrbnKBrbmwta6mpaenmqCkoJqcpauto6eiq6msqrCjpp+qrbW2sb25r7evqK64tLS7t7O8rre5tLG7wbHBrqWooquxsrOnvKqrqKusrbS0pqiuoaSvqbKlp6iupai3rLCyt7m6u7G8vb6+xL+1wcHHyLe/wMW3xMLAu7/Ew77EyMzKv77DwMCphnJzcmppXWFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwL3KucDFwLzMusPHxbq9xL66t73FuLa4u66xlYOJjYF7foB/eHR/fHN3Zl9dXVxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSeo5uXkaGjqqOin6Wlp6Wtn52bpKWrsq+2t6ewrKeqtKu0ubC2tKy2uLGvurmxt6Sfo5+msaerp7mqpKanqKeyraCnpp6apKasnp+npJ+gsa2trLGzsrOwtby2u8HBsrq+w8GxubnCs8C9v7W4u72+vMLGxMLDvr/DoIN3cGthZV9rb2BVWV9ITmhPVEdFSkY8PUA9Ojs7ODI1NTM2OTo4Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzc4NjY2Ozo6Ozk7Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelJ2hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu2x7u3xMazvsW8t7C5v7uws7avooSHh4J9eXZ0cG1rampxaV9gXVxcXV9gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm5+fo6Whp56aopufqrCssbWiqaqpq6yktbitt6+ssrSus7WusaqfnZ6jorKkpam4raGmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqq6ytsLK4rri5u7C2u7u6q7OyubK9tLaxsbW0v7W9v73Cwbq6vZeDenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNTo7OTo4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDJycHHvLzFxdDBvMq7u8G7tcW4tcHBs8LEvK2qtbm3p7GyqYuGiIB5c25wbmtjXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFhXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbl5uhlpaQnKGhqJ2bnKWmoaSbn6CamK2tra+yoKWiraunobWwsbGsp66yp7mzprahop6ao6GtoqGptaqio6adpaajlpiel5ibnZ+Zl52cnJusoaumoqOlrauys6q0sLKqsrm0r6mvsrKyt7OtqayusbewurW5vb62s7GUhHl1ZV5lXltZVlNaVUxcUUxKRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va21uMPNycjBxrjCwcjQusPGwLa8vbbDura/wbW7v7uqprG6saexr5p9hYWAeXBxdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlZeXn5eZlJifnqGclqGhqKOfnaicm5qqpq6wq5ujo7eqoJ+uqLappqassKO3sKO2oKKbmJirpqGbrLivoqGknKGfoJOVoZSWlpuYl5aXnJSfqZ2po6Gco6qqsK2otKuqpq2ysKWqrrKxr7Cur6anp7KusbSvu7O5t62jlIF5dWReYVZZV1NSVEtNXkxQTEdITEtFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcSxv7+5wMG6wMC5ur23qKixu6aooaSJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWltcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5KUk5uYnJaWm6Ccn5Wgn6alpKWmnpyfpJ+qr6afoqO2qKChoqizoaWnpK+lsKyrtJ6gnZWUqaGhlKyxsJ6io52emJuTi6GUkZOXmJKXl5iWnaabpqGimaSkpKujpbCnpaOrq62lqK6urquoqamzpaarr7Sxrru1sK+un5J5dnJlYVxaXVhOTFFHUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc8ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKatt7u8wcW6sbm2xcrLwcTHx8m4yMa1xcLIrrq8wrzCwMG9vLe6tqansrWeooqYh4B3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWVtXVVhXVFRXVVNUUlVgYF9gYV9gYWNkaYGUk4mRjpOSk5yUlZajmaCWnKCloa2lo6Oio6GbqqqlmZ6lsamgoJ2kqp2noZ2srKmora2ioaKUl6KanI+rqbCbn6KfnpeYk4qeko2SkpWPmJiTm6GinKSgoZWgoaOkmqOrpaKkqqOrrqWtsammpaamtaapqK2ztbS5uq+prJ6LcnBvYFtXVlVRRlFPSFpcT1JKVEtTTEVHSUM4Ozs9PDg2NjY6OTs6Ojc2OTc3Ojs6PTw9Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4Njk4OTg6OzlAOXu1tK20u7KwrLKtnaenr7m5s7/IurbAr8bJzrzCy83Jt8vAtMDHzLC2vce7wcfDvb+3urWkqq+unZmHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5fX19fYmRtjo+EkYaPkY6Zk5SSnJqinJugp6iqp6qlqKSimKSupJSZpa+pn5uYmqCerpmbqbKfpKafo6SglJOblpWRqamtmpygoaCalJCMmY6LkIySjJaUkJ2hoKKcm6KVm6CioJehqKOiqKugq6+krbeloqOirK2pqKuvs7iyvbWzq6+Yg3JyaFtZWVNVUkVZTFFcWU1UTlBMUVJJTklCPD8/QT89NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqKevrZupqKy3tqy7yru2v6zMx8a5ws/QybXGvrq+xsy1sb3EvMLFw73Bs7mvpaqvq56XhoF3eG9uaW5ubnFnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/i5CKko2XkZaZoqCbn6qppq2qpq+ip5mfrKCUlaSop52Xj46Zna6Wl6apmJ6ck6WhnpGQkpKSlaeqpJmZmp2dlo6Mi5SGiI2DkIqRlJCgnaCjl5WflZqgoZ2Sm6Wlp6iooLGwprG8pp+jrLSrraewtLC5tb+xrbGrkHxwcmJWVFVOUklHVlFSUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo6ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqWisKudqqepsrCktsa0ubqzy8a6vMPL0cyzubq+wMXHtrS3vLK6u8S+wrGzrbCusKycoohraG1vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CJmImUk5iamJ2om5+qpKSqnKeZoKWbko+eopqXloSDkZqjj5OinJWVloeimpqTi46Kj5mjp5yVlZebkJKHlI6MgYuNgJCKkZKRoJmfoZWTmJiUoaSYjJmkpqimoaC0sqeyt6Ccoresqq2ksrKmtby1q6uxo4h4cm1dTlBRTE9DTk5OUExGTk5LSk5OUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOzrrairLXEuruvqqy0r6+gl6h9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnCEiIKHgJGDjoqUkJOdoI6am6Kgo5iklqGblYyHmJqMc42CfYyWloWQmZCTjY56mY+cjIKJf4mYn6KekJOYloSOgpN+fnSJjnqQhpKQkJyamZmQlY+djaKijYmaoKGko5uitK+sr6yfmKW5pqWwobGunLC7qqmvqpmBdnJiVkxRT1BNQ1NOTFFNQ1BQSEhNU01ISkpESkxFSko8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd3t6KjtKilpaijpqWmpaazp6W0wbiwtLDKxrm6ws/Hv7WvvcOvsceyraeslaOtv7ixsKCorayqlpWicldWYGhnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVdZW11pbHJsf4V8dE5Yco+Cl4aNnJeKk5Cel5yVlJaUjpaIf5OJXztXb3uKk4l/i5GMj4WGcoqEloF5gnqFk52Ug5WOkI+Chn2SeHFvhY1+iYCQjY+XmZiTio+InIeel4aHlp6aoaCXp6+oramonpattKKmrZmsq5ins6GpraOSfHFtX1pOU1FWTERUSlBNTUZPT0pFTFFNS09KSU1PRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5eLegoq2hpqapoKeop6KpsKintMK5sbWwycO5tL/PwLqxsbjEq67JrqeinYWaorqtp6iWpqWjoJePlmlQTlJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXqCdFBCQH+VkZF9iZSMhIqNmoyWlYqSiIaVhXiIf2BKUW54ipGEfISMiYR+f25+f5R3dXZ4hI2ZcFGNiIqGe354lHZnd4WIfoqIlYqNkJGWi4OJh5SEmouBhJKblp6clKSjp6mlo56bsauhpKSRpqqWoamcoqaoh3NrZV1bSFFRU01JVU1TSUxMUElHRkpOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXa2nKKmnZ+hrqGnqKWmp6+sqra8tri2s8K8t6i7ybm3qaq3uK22wKqim5KCj5myn6KajaCWmJSRi4xlTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgXuFjJKAkZmLj3uGj391f3hzbnVwdI2NgXl9iaqEeXpodnuOcHJteICKjJJ4eoB7gHZycpJ4Z3WEhISEepWJiIqMioB/g4qMf5ODeoCPmJSblZGfnaien5+doKmln52Yjaikk6CflZ6epH9xZmBcXEpWT1FHS1hST0pNTVNKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI2MjE5ODc5ODc3NTo8PDd2rpijoZicnrOpr6mlrKuwsaq9tLK8uLa7tbOguLuzq52fraustbOlnpaRmIaUpJadjIOXiY+JhoaDZkpJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhZWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gHZ4f4mPfISYkoFyh498dntva36tfHOQin97hpKAfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcmhxgH2OcEOKhIKDhH93d3qKhH2LenR+jpKPmIqSmpujl5mdmp2eop2WjYulm4+dl46WmI51bWtlYVlXWFRRSlNWVE9QT1FXS05LT09KUU9JT09LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKawrK6rp6mwr7GsvLisu765tK6pm7GorZyQl56nrKekm52Th5Z9jpWSlYB8inqFgH9/gWVKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFhZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3dvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZZ/SZKYbmh3foJsaWNseYWQkoZrc2x8bnJ7hWltcH5zjYiDhXp9fnp2b3R0hYF5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5KKko2GkJZ9bGhtbm1XVVdUUlFZT1NVVVRZVk1OSE5LTk5LQ0lOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6kra+iraqota+urLS/q7zCv6ajmpWlmJ+OhYyWoqSbm5SWj3aRfYSLkI98eH50fXh1d3xmT0VHREA8Pj5BRkdHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5vbX96i4h1gYiGdGyZkXRzfGprnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3tncHB7bpKNjntzfX1xcG51bYJ+d3l0anmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdjV1FZV1hZXE5QVldaWU9JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKiwsKyspKCsnKSwsMjI2LSs1Nzc1NDc4aU84OzVukoiZkZqWpKitnrKeprquq7KwwrK7w8ebl4+UmYuOhnqFkZqWj5KOkopziYR3i4+Mf3Z3dXh2b3hzaVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bHGDgYWBeYOGhnlyoJR0eIBzdZSHNXGdqJ2OoaGEooR2cIZ7hntzjK2NiIBoZmJpbXFtb4J1aW9YdW+OmpF2bH97fG1ybnB/enN1bWJ2hH+GgIWQkYqLipKLkYyLj4N2eYuPgH6DgH2OeHBubmpeWltdW1lYYWBTT1xbWVhMSEpGSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qK2wrsGzusHGl5CMlJCBiX1ugpGTioSLiZCId4SFbpiKjH95e3txe3R8a29eSlBHPkA3NDU4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8+koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx3h4d8fYWCf4x+dqKZeX6GgISZhZucYYaqn52LgpCNenaIfomHjnOKl4+De1xkcXR6e3eKbWdpYXlvhY+Cem6Bd3OEenFzeXdrbmldd4d9h3yIh4+Ai5OXg42GjYd9cYWAhHx1d3t8h3RtcXJkZV5aWl1TW2deWFFWWV1XR0tLRUxHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgqp+wqa/AsbvFupaPkZSIeoZ2a4CMkoN+i4WQjXmEgnSihY1/f4OBc4OBfWx5bFNYTEFFMzExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxyfI+LenyIhn6Xh3ahmYiHj5KUpY2sqUiGra+vioCAk4qBi4GEkaiHgJiYipxzbHyBhod9jmhnZ3h+bYWGgYVxhIVHa4B4cXl2aG1rX3d9g4h/iIWMepWenIqLiZKAe3WLdnx4bW93fn1xcXBqWlxbWmNjV2dmXFZQUVhaUURMTEdPSURGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6CdrKCnua+zvbSXjZKLmIt9dHF/ipN/fo2DlJV9h3+GpYeJgIOIhnmJioB1hXlfY1ZMQzYwLi8yMzEzMzY2ODo9Pz9CRUdISkxOUVRUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiZGAmpaCoKGYlZuapa2Tmbuxp7vIxKeKjKGkjpOJgJB7coOen5GcfnaFhYuPh5BpaG+DgHSMhoSLcYaCdoeAe3aFfW52dWeBlI+GiYmIiYiiq6OWiY+YgHuCint6b2dreH13fHFpY1xZWVxpXWFnYFpPTE5YU1JJUUtETkdDS0RDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGRj4uamqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWf4uBkpuOhIGCjIyCio6FgIqAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISktMS05WYGN/Z2dtdZ2bj5qTk4uOj5qIk4+di6ChkqOppaOsk6i2oqfBwq7Ir3i6lJp8jKGemYSShIKPoZ6TmZKEioWPmJCWbHB1iYuBlYyNj3aPhHFshYGKl5KDhYhyiaGXh5OKj5CXpbapm42WooOHk4V+gGtqa31+fX9xX1tiXllmalxsbF9YS0hPU1FOTkxGSVFERE5GQkNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuaFlwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafYWTknqBkomSkn2LhZmSkYOAgYuOiYaSiISJhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFRU1FOUElFRT47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZervqu2yMm3yNHPvpugcGmqqJ+Ek5GFnKCampmnkZGIlaGZmnd6fpSYkaGSlpeBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ6RmqiIl5COgolsc3N7fHluZl5bX19hZ2NgZ2ddUkVLS1FPSkpNRkZNQ0hNRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl9QcXVgbn1hd459fJSOjoqfkpeelZyqmJ6qQkR9h4mImI15go2Ljo18ioaQkY+Cg4GJjIqFk4WChomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSVFVTTlNMRUVAPD49RkhAQUA4NjYyPDk7RkhHSUpOT1FZbYaQd5WLo6eqtb24pa6srKiptayxt7Kyrbuxs76cs8Osu8nLuMO/t6WjsLKsrKqjipaYhaWmoKKYgqaZjaKqp6SHhZOjoKCqoaSpjpywi5Wkp7i7nKGjsJOjnaOekaSirLCts7ajlaariZqKk4uVent+g3tlXmZaY2BdYmNeZmdgW09ESUhUT0ZITEZLR0ZHSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo1NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoKThYiCnIOSkYyS2sidlnNWl4iPiJyPfIaMj4uKe4mDh5GPg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJTVVVXVU1cUUdHRDw+PkZIQ0RBODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHxKuzxbattMCzuL62v7XBtru7pLjGqbbJx7a+ubSoo7StsLCbmZKan4mnr6qklXefpJehq7GzmJapraiutbuyuqyvtaKxrLK1vLi1rrWgp6ijqJupsK6zuri5qJy4qo2lj5KUoIZ6gYByV19iVWRgYGFfX2ZgXFVKREVMVlJJSktFSkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFjZFd6dXGBlH2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYiFgo6AgYmPhn+GiIWKh5F6eW9dV0BFTjw2OjQ2QUI3NjQvLzdDSENRXE9RVVhVXFdPX1VJS0pBQD5HS0ZGRDs+QDdENz9CSkpFR1dUUF6PpK2ksrTDtrjBzMq3vMS9s7TBt7jCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqwoKKWm6KSpbGtpa2sp6SYoKyzuqKpsrm1u77Mv8XFvb2zwri6uL+4u7i6ra2xprGqrr6xvbzDw62Zu6mVro+YmauJfoB5aFVhYFdpY2llVltkWldVSkdHTFJIRElLQUlEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTc6OjY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Eb3tyeIhiuaGao4mVlJaTlJSOkJeSh4d8h4GOloqBhIGKenyLiIZ8ioKBi4SVfXh6dWZQXGRHRUw6UWRgW15TRj87SFBFW2NRUVlZWmdaU2BhTVNPRUE/SUpIRUZBQEM8RDZCP0hHS01UWlRelK+4tbu5ycC7vcrNvL3BvLi2vLu3vrW6ssZhdbKlsZqeq76qpairqqSis7Wgq6eelZaemJ+upaenpZ6jlKKnsLOnsrK8tsG908nJ08bCxczCysPBvr6/vLy4tbC5t7fDusa+xMmxnrqroqyPpqm3ioB8b11eXlxVYF1oZlNZYldTV0lFRk9LQD5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUFBRUlFKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGQjYaQc2xycnOI1cC2mqCNlZmZkY6XkpaWjoaIfYeDjZaKf4OAgnl7i4SHe4t5gYqCl390fXpsZnB2WV1cUGVlYmBlZF1bWFhcTmRtVVJtbl9vX1hnZVVZVEpEQktLSEZISEhIQkk5REBIS1RUVl1aW5O5wLm+uMbBu7nKy7u2ura4ubS4tbWut7eZZHWpnq1wXqKtnJihopuknqullJ+fkJSOlpiYqJ6mn5+amYOjnaykqrCst7C8uNTQztbPyczSzM/OysfAwMLKvcG9wcHFxMbKwMnPtKS8sbWwnKy5vZp9d2lbXVlXW19YYWJRXGFUUkxDQkZIRjxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBwl5ORlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Jh4yQjIl8gYNze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWhgZmlpbVpudJetpL2Ih2dbb2hdWllUSEtPUEpLUExTUUhMQUpGS1BfX2JnamKYuMewurS7vraxxce2sLmxsbuts7KorLitjbaonpynmk6anoyPoJaRp5illYqTk4iRiZCRkp2boZiblZaHnpmmmqyvqK+ns7PU1NTW0cvP09TO08/MxcLK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8WifmxhWlpbVl5WWWRaUF1YT1JDQkhGREo7QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYJocnB5eYOhqp6ml4ybm5iLjpWRmo59iYuGjouLi5CIfIWCcH+HgoZ7h3KDkoyPfnF5dWxxeH9ye254c2xpgHBtY2lucHlpeH1+y7/D36duY3huZFthYEtQUlVOWV5QXV1NUU5UUVVUXG5ud4Nyl664rLWosLarrb3Bsqu1pqW5p6yvoqy0pI+xrpuYmIyRlJGEj5uBjaeSnImDi4SKiYSLhJSVl5eUm5CcmJmZnp2rrKSnoqysztLV0c3L0tPT0NTRzsjD1NHIztLT09bN0tHF0tbGwc/IyMOpv7jQnHZrYlpfW1VeUVxaUFBVUU9JPkFHQkNGPUFCP0ZFPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkY+MioiRh3+De3J+gIKHeoV2hZORiYBvd3Nsc318d3xzgnhxa4Bycmlwcnp5cnu+y5t/jbKEdnKFd2lhaV1EWlpbV2ZkWGVrVFhdXWFjXmN4e3+MgpmqpKSioKGppqqxuaumtKOirqKkrqOnsqCJppuVk5GKko+IgpSJa5WjjZmEgYZ+kYODlJeti5WOlZqOhZKQnZenr6GgoKWkqMjNz8fCy9HT0dTSztPNxtbTzdTY1tbY1dfVytXazcrY1tHLrcTDzIdva2BdXFZSV1JbUEpISkpLQDs6O0VCRD1DRD5IQz9DQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lxgHZ+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYmIi4l/hHlze32Dh3eAe4eRl4GEb3hxbnZ/dnh9dIZ8eWyHdnVufXaEdXl8nraNPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhsbmlugYOJkoyen6CekZeZoKOkprKkpbKgoqWfoqmio7Kch5+SkpORi4+Lh4SPhH6cnIyNgoSFepR/gqqWo4ySi5iTi32XipqRqrOYmpynnKa9w8W4tsXN0dDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR0c2thWldQU1BYVUVHS0pGRj46NzpAQkM6R0VARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc1NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qj48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6Lf4eSg4mGhYqCiH14hZeXiY+Dh4aHe4V5cXt7hIZ2e4aOjp56jXB9cHB6gHJ7gXKEh4Bujnp1d319g3WAfYeJsHRZqsK3jZKBcG5jPV5ocnFxcG53d4JmaW9ydnlyeouHj5SSm5agloiMk5yfm5+roKGsnKKamqCmn6CsmoyajZGTjoV9iIeDhYuOoJmUiIOHfmyZeoSZh4iTjI6VjIZ7m4iTj66rk5WXn5imrrW8qK29x8vIycvLz8nE0srU19jX2NfU29fT2tvW0Nra0tbJ1cyTdXdmZVhXTlFSXEdDRklJP0I+PTg6PkA8Pkk9QEJBQUVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEE8OjlEPkNHUmtfbWRiZmx2gIhxkZCbgHmAjn6DgYKFf4R8fYSYjoeMf4aHgXeDeW97e4eCdHqSno6hdpB2g3R1gX50gIRvgZCCb5KFdX2ChXp3h3yJuMalw8q4gpacj3hwZk5lY4J6gneFoZGLeXl3e4SAfIR2bZSWlZaQmJGDiY+XmpeXpp2YoJefk5OYo56brJaRkYuNk4OMhYmJgYaPkZ6cmoiFjIGGl3uIiZ+Xj4mOi4uCfKCIkIq8oJiTl5qcqKalrZ6ntb+/v7jHyc3Oxc3J0dXV1NnV19vU19na29fb2tnYztvGg3Z2ZGZhXVJVVVRNS0RORDs9PT05Ojw/OT5BNz4/QD0/Pj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs5OzdJUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eop8foB/gH6Ge36CkYqFhnqFiHx2fnVufX2HfnR/kp6RoIOSfIZ+eI9+eYuKb4ObgXSZh36CioV8fpF7kKmPkMOgvYybpJx+ioV9iXOMi4BzppqcmJSFe4+RiYRpR3ChpJ6MjJGShYiLkZOVj52bk5SRl42Mlp+dlKGVk46OkYx+kI+Oi4SJkpaZn5+IjJSRnZGDjH+mmYiFjoOGhICkhYqLt5edkZSWoaagnZ2do662ubSrwMbK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbt3V1dGdmYlRdWVJPTkhETEM+PT85OTs6Ojo8PjZBPj89PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlZYZm1tbWmBjopxc3iKe3uAfH98iHt9fIuHgn51g4Z6c3p0bYF+hH53hZuhm56Uk4CMiH+Yh4Cckm6IqYV7oYx9kY6DiYWdf5uRio2jop+RpK+gi5GLhYuBk4ZXcq2Ln6uckIOZnJCQjluCopGCjZ+TlYyHiIySkoyUlZWQjI+KiJacnY+Wl5KMk5SGgIyJko6Kip2XmKOjhpOdlaCLiomOnJCDiY+Ag4eFpISLkLKYnJKUl6GgnpmSm52nsrispb3Cx83Ixs/Lz8zO18/R1K7W1dja2Nra19bZ2p1seXFjY1paVVFVV0NASUQ/Pz86NDk6Ozc6PDs0PDw/PT43Ozo6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs4ODs8QDtCUUtLU1lQVGNieW1ifpGDb254i3l6f3uBfYd8fHeGhYBzcIWCe3V3dnSFgoR9f5Kmop+mopeKnZCUl4uKqJdyirONhKiShJmUhZqNo5agmJOJm56ik6mwn5GVkY6OiJaMb423hJrEyLKdoqadnJiWkbKQZKTNx5WOhoeJkJKNjZOVioWKioaWmpyPkZWTh5WYhICQjJmIjpCrl5eko4iZnpWaiY+HmJeKhY+NgX+Hj6SIjZOompeTlpihmJ+Zk5yborK0paO9wb7HxsXIyMnCytPMzdSo0tHW1tbY2tTT2s5/b3tkYFtbW0xIVFpCQkhEPEI+ODM3PDw6OT42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFNXU1JCY4JHdoGOfXxtfoh5e357goKDf3d3gIN8bW6Lf3t9eHh8hYeKfoqis6ejqrOil6egpaSWla6ig5G4lZKzmo2ioYylnLCjpJ2ZkaeWqJmsr6SYlZaVkIuYmpehwI6jybirnKOmrpiSm52ynYWGqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIyUk4eUmIaEkpCcdZGZspaXpaGHnJmSj4uRipebiYuXjoZ+jJieiZCQm5qak5iXn5SgnZSem6CxrqKkuL60xcfEvcPDwMbNysnTps7N1NLQ1tjT0Ni6b3ZyWV5TXVVOR0lORUFDRTU/Ozc3Oj88PDc9NDM2Njk3NzQ+NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg0Njc9OkpGREdOWlxZSmZgO0mEi3p6boWGen2EeIGGgX5weH1+fW9zjXp+gnx5houJhoSSprusqLG9r6Wts7OppKKwrIqatZ2juaaVraWWqq24p6SjoJqpmKqkrrCqmpmclJaRl6CYmru7rsqhare4q7CVmZ6jrJOXvqNeqrKDioqNlIeRfI6OfYOGjpCUlYiIk5aMkJWNi42XmJOdmbSXlaudipyUkY6RkoyZm4uTnpCLipafoYyUjZeZnZKbmJ6UoaCUnJ2lrqihpLS4q8LIxLW6vbzFx8fC0aHGys3NxdfW0cvUn213ZVlXUVxQTkVDPz1DQkI4QDg4NT9HPTw2PDM1MzQ1NDU0QjQ5OkJNOkI7QUhDOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicElAi4p+gXOGh32CiHWDioJ/bn18fX9wd4d3joKHfI2PjIaMmanBwK+9xruztMC9ta2rs7aLqLKurr6rm7ulqK25uaunpqKipKOqr7Kxqp6cpJmbmJifo6alkqS6r6nAvK2usrmlpKh+iIecrb2wgouMi5CDjoORj3qBiJCNjZyJiI+XjYyVl5SRmpedqJuxmpGsnI6aj5KOlJCQlpePkaCRiZWbo6yUlo+UnJ2SoJ2bmJ+hlJqepqWkoqOwsqbBxsOvsLq3xcTDv82mx8THxL3W0c3FyoVwb15ZV1xZTEpCS0FGSD9BQEM7OjU+QT49NT03PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OjVCPjc5VktEV09GOD00S0BDPjRFS0hOPkJBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVONzlHRD9DRlxlRmBpZ1pdXZOMjIl7h4yHg4x1h5GKgW9+e4J/cX6BepV6kpSUmJCTlqezxsm/wczCw7nHvbuvq7q7mLO3urLArqXApKuwu72qrqujo56nq661sKqcoKucoZyWn7C1p4yju7u2wbysqZ2zpaSolIWOqsTDpIKLj4eIhIaVlI16g42Rj5GhjIyUko6Jl5+Yk5mVl6agr5yMq5yNlo+RkZWVjpGVko+glIeXn6GznpSZk5+gl6Semp+boJSYnqWjpqakr62lwMTDrqi3tsnDvrbPssS/xLyz0crIwrRxdWlZVVlnUUxIQ01LTEpBQj5ERTw1QUU8OzM9OEIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGVUYmqZjZaKjIiTkIaJeYeUkIFygHuNf3iHgoKQeY2hlqiZmpm6vcfIycHSycrCzb3Cs628vqi6wL27xLeswamss7y/qrCqpKWkrK6zrba1oaCwn6WimaO0vaqcqb3CpLa3r6yUsqysrJeHmqqmpZGCjJOlloqBdYqSeYWOkpCeoJOPk4uPjZSjmZeclZSjnqqekaWajI+Pj5WWiHyPlZOSo5qVoKKctaWQnpako6GlnZ2lmJ2Vl5uko6mnorKsqLvAw6+ls7fMwLmvxLO7vsK5rcLDwsCXaXZeVVRZWEpKTElGRERJRENCREw6NERJOjs0PThGLjEyMjQyQjI2U0hPPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGFaY2NWno+djpeOnpKJin+KoJOEeIV/lX9/kIiKkYCWoZmup6SYwr3Hw8fF087Ozcu8wriwury0vcu7w8K2t7yts7+5va6vqKCpqLauramyt5ufraKnoZ6rt7iqpa+/xbK9urOoq7a0rq6XlqWsp5+RjZKyxaeWjnySlXyHkpmPqpmYk5OPkpWTpZ2TnZmToaOinJifmIuMj46diFqQl5eSl6SZZZiin7KllaGVqqupppqeppeYlpiUoKOopZ62q6m5u8O0pbS2y8C4qrarsru4rqi4ur23f2hrV1RSU01FSlJNSz9CSEVFSUhHOTZGTTs+Nz5BSy4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M+NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKer76voca8xMTGxs7OztLKv7u2sru7u77PtcS+ubm3s7G1s7izq6ecq6y5qqinr7CYpK+kp6SltcCxrKy0v8O6wLq0qLq2ubSvlqWtr66ki5OUoY10wpp9l5qEjpeZjLGVm5qVkpKZmaWjlaCalpqpnZugoJmKjY+VnGBKlpyalJqlllSWr5+vnJ6jlK6tqqSZoKWTk5iYjZufp6KZtKiqs7u7u6qwssjAuaasq62ysqOhsrK0pG1rY1lXTU9KRE9QUFI7SEtJSEpDRD46S1U/QTo9RU0wNzU0NDpCNDRNV087SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4uolo6Ik4Wgh4Sdl4+doJqjpLXJtanFucLEyMrJyMzNx7+7s665ucHBzLXIusK5tbqwr6+ztaajm6q0taqppq2smqWupaSorLq/qKy2uL/CwL65s7PFsrm+raSvtay5poibl6abdr+fhJmejpOamoyul6Gcm5eUmp+hqZ6on5maqpqhp56YkI2RnYNudpKimpWdop2RrrKjq5SnqZeqrKOinqSnkpGZnIeUnKKdlrGmqau5tr2ysq6+ubego6eopaacm62pqYtfYl5dT0pLRkdNSlZNPU5GT0tNQkREPFFWPUFBQkRPMTg9NzY/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5Wbop+7r5mUoIyTq5uRkpOJq42GoZ6Mo6yUo6S2xr60wLnCwsfJxcLNyMK+ubKvurXBwsq1xrLCvLW6qqitrbCio5iqtLumqaarqp2pr6ejqqu9u6itvbW4vse8t7a5wrK/wbWqtresvqWPo5iSoqC9n4maoZmXn56Pt5+pnKaim5yhmqiks6CbnaacqKqemJWQlJuLlomMpKGUnaKdoLSvpaWSr6qZqqmcnKKiqJCUlJ+Cj56em5WppKGhs7S6tK2otrKznp2jpZuXlJiqoZ51XFpdXEhHRUZMUElORUdIQ1NMSkJFR0FXU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlEQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OdcGJHRaeXpJ+ew62cl6WYmqqclpqaj6qWlaemla2smaKrtsTDvL62wcLAx8S/zMW7vbmysLmzv8LHtb+wvLe5tqakq6utoKGZqqrEoqSpq6aerK+roqmpvrenrb+yubfHtrW5ucCzwMO4trO0sL2jl6OXlJyUrqCQoqOlo6OgkL2lqZ2pq5ycoZulnr2imaOfoqmsoZ2Xjpaek56Hj4SNk5+koJ61rKaclbCmma6lnJmonJ+MmJSeg46gmZuSpaSamKuxtbGqpaqurJuYoKCSjpCVqJ6UZV9XX1tNSEdJTkxIRkRJQT5RSUE8R0lJXFJPSz1JT1U1QkY5PkhHNUNhW0tCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTU/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1RRjxLeGVhVkuimqOcnsWsoZ+sn56uoJKjn5akoKaprJi2saOqs7bFxL2/tcDCu8jCvsnHtri1tLGztLfBxba+sbi1ubSfpqyqrJ2enqWkwaWfqa2gpKmtr6KmqLy1prG9ube2xLK0uLvAtMXCubmvs7W1o52llZKUoa6gmaKeqaiso5rCrKmerK6bm56ZpqC9oZ2kmKurrKahmo2an5KeiY5Xf5afpaGguKqmk5i0op6wn52ZrpWdjZiTnIGOn5eVjaGjlpClrbGrqaKipaWVlZ2Yi46RkqSeiF5hWGJfS0dKSk5GRUFHSz89SkI5OUpLTl1RUUk9TFdcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUpMP0g/NUhMWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNba1dxR0U2PXVlXEtNnp6hmZ/EqKahtKKds6iTq6Wgo5+sqaydu7CorLaxx8XBwrLDw73Gw7zEybyvsLatsLWvvsS0ubKwurSsmaixqaqanaWhp8Gtm6yxm6qjrrCppKi8tqe3u76wt8Sts7PDwLTItLy4rLS2raqippaVlaSsop+gm6ersK+vu7GmoKmompmYk6KjuKCho5KwsKylpp+Top6Vno+QjZWem6Kep7SnpoyXspuirZmcmqyPnZOVkpl/kaCVjo2foJSLpauvpaainKCekZKak4WKkY2bnX5fZFlmZElITElTQUNASUg7O0Y/OTlPTlZeUlNKP1BeXT1IUEJMTEk5TmNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF1lcEA4O0iWd2VBNJ6jn5ygw6mkqrOipLWqlrOsp6GksqyuqbuyrbG1tMbAxMK0wMS+ycS1v8fBtKu1qLC5rL/Ds7ivrba5pZiqsqurmJ+ml627tJuosJqsoK20sqerubKourS5s7nAqreyxL62x6jAr663tamnrKGYl5KmpaKimJmlr7iusrW2oJ+ppJqUlpSkoLeipaWWsLKyp6umop+ampuVl6ifoJihnq+yoqaNlq2YpKqWl52ij5qMkpaYhZWek4uQm52TiqioqqKmoZielYuOmY+BhZSIk553YWdbamlMT01OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlVkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDRJb2dVQ1dGjHlmQzujo52hpr+nqK+xoqq1q566sayjq7S2sbC5t7C3uLjFvcPHvb3EwsbAuMDFwLmptqSsu63Awbe3qq2yuqKUrbGtspakp5GquaqfprCcq6CvtLOrqbW2rbyttLO5t6y4scO7wMCnxKuxt6+pq6unnpiZq6GioZGYobGvs6ywuZqbqZ+al5OYp6C3qaajorGxtKyzqK2gnKCgm56lnKKXnaOzr5ufkJOkmZ+nmZOhnZOXiJOWkpWWnJKIkJqYlI6oqKafopyXm5KFjpmLfYuVhI2ZaGZrYGxtV1BRW1VBQkVUQDs7SUE3OlhQZF5QV1dFWV9eTk1STl5LSj5ZY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERUJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEtLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9p5+doqq9oqqwrKSyuaqmtrWsoa21va+zuLu6vre3wMK/ycS5xMPAv7fDvMC2rrWnq7exu72+tKmusbaelquup66XpqiOp7ufpKyznquisbCzrKm1tLW9rrGytaywtLPBu8a3rL2wsbisraqjsqaepaqgpJeQmp+zqrOrq7Oanaecm5aOoaaltK6ooa2urrGotK2yqqScn6iknpWimZuotamXmZGRnZmdn52PqpyVl4SUloqdmJuTio2WlpqWpqWjoJ2WlZeTf4+UhXuNkoKLlGRqcWZvcV5GWWdWRENNV0RaOUhCNj5dUWhcTlpdR1teXk9OUlhkSkpCXGJfUExNT1hXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgqQzNZVVxnSzaMemZMQKSaoaWtt6Wsqqavrreqr7a8qKext8a3sba9wcO1tbrEvszGucPAub65w7fAuLK0rKm6trq5vrSprbC1l5inrKmsm6urjqu+nautsaOroLGts66ttbK4uKqur7Gota+1u7zKs6q3trG0r66mobSgm6mtoKaWlpuasqOuoaavl6GkmpqTjqOmqLOqoqezrau2pa+xta+jmZ2sp5qXn5uZq7eil5OQjpicoZeWk6qdmpJ/kZeMnZuYlpCKlJKemaSioqCYlpKTlXqLj4V7jIqCipFqbXdsdHthRmFrWUlHWlo9e0pGRDZBYlRpW01cYktcXVtSU1JiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYoKDkuJDpLNS4iVV9UXy81KENfUVwuKkEvSkdQW0czY1lVS0SZl6GyqbKqrKakr662qri2uqWstLfKu7S7ur+/tbO3w8DMyLzDvLW9v7+3vryxvK2nurm3tcK2qq2wt5SWp66rqaOwqZSvuqSssbOnqKOytLGysLSxt7Opr6yyp7evt7TExreptressa2pp6O2oKCosqGllZyalbKeqJygqo6po56blpimpqW4qKOytayosqiusbWrpJmgq6ibnJ6clKm4nJSOjoqXm6KXj5ekn5uUgpCVj5ybl5aViJaPl5qnnKSgkZaRkJV2hI+He4SBg4uKbG92dHt+XExmbVxLTmNcPmJ7R0k4R2dXZlxMXmNNWVlXVVhUaV1PT0hgXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2UyNydHYkxWJS1BLj1FTFE8M3JrSUNDkZmlr6Wtr6uopbGztKu4srihrLW5ybmtwbvCuLOxtcLCzsW/wb2zvL++ur68ssOoqbmwtbW/vK6rsrGboKexraamr6WdsrWtqrGxrKmotbuttLK0rbOtqqyorKm4rbKwyMG5pbqxqa2tpaiusaalpK+kqZyenZuwmqOjo6ORrZ+koKCiq6anuqWstramq6yprbC1rqOeo6iqm6Cbm5Kjs5mPiY2GkKGflIyUm56RkYONkpKcmpeVlIeXkpWZp5ygnoyTkY6Qd32OhXx7fIWIiHBycX18fFxTZG9eTlhmXEZElltHO05tWGJcTWBiTlZXVldUWGddUVJMY1lbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6Rz4zQkhTLD6QaztHSI+cqqyiqrGkqaW0tbK1trKyoqyuvcy6rcC6x7G0rbTBw9HFxr7Asr7Awru+t7vEp6y2rLK3vMCvq7Gsn6OnramppbCjqrKqsKuvrrCuq7O8p7awsqmyqaulpaOtuq2qssO6tq27qamorKmnsaWqpaOvqqiin5yjrZWlnpiemaydoqepoq2mpK6suLOyoqqjoKuvsKydn6anqZmkmZmPn6aYh4SOiYudoI6KjJWajY2EhY+Un5yUl5WGlpSTl6ScnZyLkpGOiX5+h4V8dn6Fg4RycXCHdGxfWmFuYlFycFxLPIV8Rj9YdVhhWk5kXE5WVlVXUVxhXlNPTmdYVlZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnREY4PEIvNEVLWDJAlVk9TEWWmK2poquznKqqsbetubevrKarq73JvLC9tsKvsayzw8POz8O+v7PAwcO5v7PHw6uvt62yuL++saytq6SnqrCoqKmxpbSuqrGurbGxtKy0vKS3s6ysrqiroKOesLerqq26t6W3tqSqp6yrqq2hqaensrKkp6ahoayXqqGVm6CmnqWiqqSto6CnsbiurqSmo5uqrK2pnKGko6SYoJuWj5eck4KDj4iFm6CLio6Ll42OiYKLl6ObkJCbjJOSkZOjmpuaio+Li3yGgYGDenN/gn98cnWLpId4a19gbWVXZIZjTj9nk0xFYnlXYllSZVVOVlVWVE9cXWFVS05oVlVWSUpISU9CR0lTUVlvQU5YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZaLjBKZ0FBPDxCKzpKT140RIc9R0ZEl5OwpqOrsZirqq62rLezrKasqqm8wMC3uLK8taaysMPJy9G/wLq4v77BucG5wMSssbSxs7rAvrKwrqyrq6i2qqeur6q5sKiysa6yrbequLimtLarrKSpqp2knrOzqaiktLSgt66gqqiqqKunoKusqbq2qquqqqKqoK2bkqqhnaCloqajqp+dqLWvqaaro6SZpainqZuio6OfmZmgkI2PmI1+h4yHg52dhoOJiY2MjouChZWimo2NmpCSkY+Tn5eZloyLg391h4F/gHh0gn54dn2Ah52Pb3FnZm93XGByh2pPXplWSG55VWVXUWNQTVZUVVBPWFpiVUhPaVRWU0dPWFVJPklIT1FQeExOVz08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzFQYjAyP2Y9Tlg+Qyw+TFRfMEppNU9EPJePsaKmrK+arKatsLS1sKymsKqpur67wLCtua6htrDJx8jRwL68urvBvbrCv76/rbGxsbW8u8GxsbOqs6mktKmmrrOzubGjrriysLO7rLuwqa22rKqeqqufo6C2rqmhn7CzoraqnqinqqOqoaKtrai9r6yuraKoqKCsmZCwoZiioaeon6ibmquxqqOgrqKhlKKko6eYmqilmJeYno+Kh5SIfY2GhISjloSBgYqFjouQg4OTn5aIkZyQk5CNkZyUl4+KhoZ4dIJ/fHV4eX95cnJ4Zn+GpHZpX2RpgHRmiIt8UlhwX0p4c1NkVFFfTU1TWmZOTFZZZFhHUmhSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwS2c6NDhfPWFkP0YxQ1BbWypITDlVQDSSkLOhpaetpKekrae1s7KrpbGnqri+wLuvp7mqpq+xycfI0cO8v764vb68yLrAt6+vs7G5u7jAs7K6rLisorSnqK2zt7qzqKi+tq+3vrC/p62stautnKmvo6ClrayonJ6rs6W0qJqqp6mjqJ2jqaipvqu0sK6dqqShr5ybs6OWpJylpqClm5uqrKagnKuinJOcoqadmJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2Lh5CNj4N/k5qThZOhjJSRi5GbkpWHiX+Acnt6fnxpeHx5c25ve2aEd4WKZGFnX3KEemxmeF1eVD9Xe2xUYVBRWUxMTnJ1XUhaW2dZRVVlT0M+Sk5EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mYkFKN0dTYFUqPTlDVj0qkJWymqChqqaloquluLO0pqqxpqy4wb21r6K5raiosMLKyczBtr3AtLe/usi0wrSysbSxvLi5vbWtuLW+rKGzp6ussba4tayfv72qs8K0vaGvsrWqrJ+tsKOcpqmqpJ6bpbGnsKCfq6mnoamcpamhrbyorrGuoaujpK+fn62mmJ+boaSdoJ2bpKujm5ulpZaXlaCjl5uWpayMnpGRkYuCioCAjoF7mZSMiHt+i4aPjYuJhJKYkIaUo4mTkoeRmpGTgIl9eWx+dnl4Y3x6cG5vcXZnf3JqhGdlZ11sc41sYGhwYG89W3hsVV1OUFJLSk1UWldNXF5sV0RXX09eT0hNREY7N0hFS088cmhLSzlBRTs7PT47Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBaFkxNFM9ZV9ETDZLVmRPKjsxTlc9I5SarZqgmKikpKCopLiwr6SvsKmruMG5sq2fua+rqLS6yMvIvrbCvq+0vbfEtsKxrbixs8C0u723qLm3vaqjtKipq7KvurGrnL2+prDBtreirra1p6ansLOgnqWmqKKlmZ+tqKqeoKqupqCmmKSpoLG5n6Oxr6Gsoa2lnKenqZqam5+llp2dm5+rp5edoaqTmpSZn5SZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo6JlZ6IkZWCi5eOkX2FfHNwfnJ0dGB6eGhtb29taH1xY3ttaWVhXGSEfl5Zc2pySUh+aVhZTVBMS0hQUlFJT1xfblNEWFpSZ05HS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo9L1dUNSiXn6eanZeuoaGhpaG3q7KmtLSqqLnEtLKtoLetrq2wtcbIwLa+wbmwtLy3vru9r6q9sLS/sL3Duam7urenp7WpqKyyrbSxqJy/uKauvbizn7G3sKmlp6+xm6GkoaWloJebr6ahnqOor6GfoZOlpaO3sKGmsaufrKOvmJyqpamfl5qeppSbnZueqKyanZ+ml5eYlp6Ok5eiqKKQiYuPhnqEfoSLeo+XiY2GeIGHg4eLjYWNk5iNj5aZio+XfoaXjY95gXpwcndwcHRfeXdkamtqZ2eCbGVyamtkZ1dhcn9eWWt1aVhFfV5bWE9PS0hIUlVHMjleXm1QRFdVWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJmW0hUQ1RdaEUuOjFdUSwyl6SjmJadq56moaOhuKqwobu4pay9xLKvrqK1sKytr7XExL2zvrq3sLO5uLq4uq6tv7O0uK+/wbirvbq0paKzq6mrtK2us6SexLenqri3rJ+yu6qnpaivq5mjp5ykppSYobKlmZ6kqamcoZ+UpqCkuaikp62mnqWhqJOgqaGhoZmbnqGTnJ2XoaOsnJybo5aTlpacjpSTo6ekkImKjoZ5hHyFhn2djYmKhniAg4eIiJGFlJOSjJGVlI2OlHuDl5CLd398bXVzbW10Ynl0aGZpZmNthGZnaGRmZ2hdZGJpZVplemJgUHJUW1tSS0pISU9TQCAqaV5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTz8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YEwnMp+kpZOPpqecn56epLatqKq6t6esw8C2r6yita6nr6+3wcC9scG3sa6ytrW5uLWsqryzr7KxvcC3rry8sKWftqymp7Wqq6+hocWsqqiyta2stLmdqKqrsaWYnaqfp6WSmaWtopidpKqhm6GcmKGep7emr6qtoaGenaKVoaafoqCZnJqdlJuelaafrqOZmJ+WlY+VmYyPmJqnoJCHioqIeIV3goKCnYeKgoh7f4WIhoWQhJaVj4+QkZCRjZJ7g5WPhXN/fmd5cGxrbGd1c2phZmNhc39hZGVmZGhoYWVuWV1YXGxjYU1nV1pgVklISUtNUlg+OWBsaUhCVVNcWklHRkVBLjw/OUE4OVJHQDc6QjAzNz03NjkzOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGFFJTWdpaGSja6hmpmgl6W0sqOyvrehscW7ubCxo7erq66pub69u63Asq6vrravs7myp6u5sK+utLa7tq+5vq2mnrWroKGypquwoKbFobOmsLKxt620nayvrK6imZ2oq6aflZunpqCZpaOpnZqfm5Wdna2xprqorqKhmpuemZ+kmqWdl5+Ym5aaoZSql62pnJWenZSNlZqOlZSYp6eNjIqJjnuBdIKCi5iFhnyIiISFioyIk4WUnJOSkJCRl4+Qf4GNjoNvgn9neW5pbGpncXJrWmhjYXF/YGRnam5rZWllY2xcbGx1cWJTYmljZVpJR0xNT1lRUFVhZYFUQFZSWlVGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOkxqW01bS1hkY0BBMUdgQSc0lKOcj4+xnZyVoZups7CfuMC2oLTBu725saa2sKmupbi6uLitu7Ctq6u3qrW5raSztbGvqbG2trGztrunqaC2qp6fq6Oqrp2sxJmvprCxt7asq56wra+qopudpK2pm5Wdp6SdmqqjpZaaoJySnKOsq6m7nqakoJeamp6hj2ujlpmdcYOYnaWAdpKsqZ+Wl6KSipiZgJeKn454hZKNgmxpfneEcWyGioZ9hIuGb11kYWeEmIZsi5CUknV5i4R/g5B/ZoiBaHZqZlhcaXRuTU9pYmVwg2ZdZGZua2hdW1yJkISIaE9LRDhGVGdeSkhRUFVWS0hSYXB0ZUZbUVVQRkdGQz4xOz02PTY8NGZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjg2WIFsMTVPa1xOW0tbZmI+RzFOXzsrLo+km4iWsZudlKGcqq6so73Fr6m3wri+vK2nt7Gmq6S4tLO0sLmuqaestKaxtaKnuLa1qKettrOutK60oqqftKueo6adp6mcsL+VqKewtbmtraOorKurpaGfnKGoqJuYoqamnJynqJ2Tnp+ZkJ+oq6S1sKOio5yWmJmYo4ihj5Kah6GIlZ+igKWAqK2flJSelImEcniNjoOIoHWHjGmWiGZ+c3igb4eHhH6MfH+hoKCZgHyHn3SIjnabimuHgoNuaWVke21yYlSGbWRtaZhxWGlvbYZXXWhaa2paiHBreXKHaIeEWV5GTj5GXk1GUlZWUVBSV1RnXk1aTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbT1tMW2dfPUsxVF03LyiOp5iEnqydmpqdn6uqqKq+w6+yuby3wb+qpLexqqymtLWur7O3q6mlsq2ltrObrLW2taWmqbOxrbKor56qobKpoKWlnKKlnrG4laanp7e9pqymqamsp6Whn5mhqKSamaejpJicpaqXlKKclJOkpqeht6Wjn6OYlZSYlJ2IrpCYlYqqjJmknYaxgaWun5WboZd6gtSogIeUwJvGeHexpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Jsl7GrsXlpbFixrm9maryTvG5neW1xj9h+UmtitrJ9fnCVdZqhqpBWTldhT1ZOR1ZcWFBQU4tcV1tQQVxEUE5DRkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkFFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV1nXD5MMVlaNDEhj6eUgaiqn5idnqWtsqqwwr2ytcC1t7/Cq6a0rq2pqLC1qrC2tKiopramqLmunLKytqqlpKeyr66xp6uep6WypaKioJicoqGyr5afpKG1uqOpqKCsraSinZqao6mgmJupoJ+XnqiokZ2nm5SeoqejobCjnp+jlpeTmJKZha9raoyOqn9ohZaHrWZxn56Vm6mXca6hpH93unxroI92sV9qtFulgGWckGBmgXpmf2l4a6plvnNnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4iWRXWcX31me6Ongllfi6tofIx3e2qoOEqvW1hUbGNaS09ZYFxWVjtOiFBXVjBJU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TjVdVzMxG5KjloOtp6afo6WrsrittL2+sLfFsri6w6epsKywqaqxr6Sxu7Glpa+zo6q5qZ2ysrCjpKCqrbCsr6eooKOjsZyknpmXmZ6fsKmYnKKgtbOhqpuhra2fnZqXoaOpnZmepaCcmaGnpJCdopqXoaCsn6amoJqfoZaVkZeRm4a1m7V5h6matpl4iLSbt3+Ul5isl39rgaZ7gYWGkZSSd6tnarFbrHuOh5R0iXCOhoF/iJGXeIODi5eMg6CPhbB2d59ya2ttfItPpVhIZGSZfmNopl94cXRSkoZdUKluY3B6hYBhnS9Tom5bVGtnYExLXWRYXFpCPrB3V1hBI01pRUJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RSwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YFQ1MByXoJWJtKanoa2pqLOsqru3wrC8w625tsKrra2vr6ivs6qisLyroqi2raOstaSlsrOoo6KdqKuzqbCopp+goLCXoJuXlpebobGlnJukqLavoaiOqaeqm52WmKCmqZufnaSgnKCjpaOWm56Ymp6jq5ymmpyaoqCXk5GUk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKPnY2ke42GoYClgnmreY+dVq97iX6farlauXeHhH2mg5R8mXupeY6dkHuxbY6EdZC8hm+VUK+nxYpRoHpjYKphc3KGa5aHXlK1tMiFfol8Y6Q0Q511XVBqaGRQQFhnWWRhSkhNakpaU09ZZlpDRD9FPzA8PDU5PDc0PDw4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuMDA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbKoqaWzqqW1qKS8uMGwusCyt7S9tLaosrGksrSnoK+2qZupu66jsbKhsrSxoaSenqiqsam0qaadnp+smJmZmJiXmaSun5yXqK2xqaOejquip5WdmJuhp6GYoqKjoZuioqicnqCelZmbp6Gcp5Wbmp+hmJCSlZCdiLJuaLVyrIhwj6dytHZ0tnucmqaOkJ2No36PnqN9sHWCkNLSdVyufIV/pG6bqqZrh4V9rX2YmZB7sXOTnY95s2WWdIWeb59mlFLJi1rCXJ95Yl+tX3ZzhWGWiF1Zyp1vv35yTUu1U1XGZFVRamNlWEFPa19saVBVRkg5PVdSW1dYSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqOekaawraWpu62mtaWntru8s7u/uLi1vLy0prW1o7Oyo6CssKWYqLuupbKxnLS4qqClnaGqpbKorKqlmp2bqZ+Wlpqak5Wlq6KYk6arsaahlZKsn6WSlKGcpaeglZump6Kbo6CumqCenZCWm6OfnaaUnZWZo56VmZaSm4WsfHiod6OPi4eqcK2MhaiEmpuji5Obi6J+kZeHroR/gbNccrJTr32CgqN+cdd9d4V+j56HmZp3r4aKkZyId7RhmmWbgoKVbJJbsFdLmnWYeWZgrV52doZnl4hqXa92lZ6Pd2s1ecius19DVG9eZ2BFUGxfcG1WVU0uZWNoUllRO0FDQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITA0NzY3PVBrZT4mVmdcQD1WX2NONkdCYEk6NzegnZSht7GZs8GtqLKnqrO6t7W5v7q4s7e+tqa4taG2rqCgqayflam2q6mysquttKSbqaCgqKK1p6aqpJmelaWhlJSdmpOXpaiclJCnrbCloJSZqJ+ij5GimqmloZWapqmenaSfrZygnZ+NlJ6cn6GZmJyVlqKglJiRp52HqX5/pnmhj5CEqnCtjYOnhpeho4uYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKiCj5uNkqR8lpCfhHuyXpxkoH6ClW6TXatcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2ttZE9KQ6FcWk10XWJmTVphX3J0X0pVNUqakVhIRT1HRUFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4xMDIxNTQrKjA1LzcsJjIxKCQlNjY3MTxPZWRBJlVmWz8xVF9iTDdGSF9DMT03op2amr+tmLPCrqusqKe1sbixtb+6u7OyuLyqu7ahsqWfpqion5Ossamwq7etqq+hmKKgpqWkuqOjrKGXnJKjoJaVn5uVmqKhkY6MqbCwpp2Wmqemn42SpJinq6iWmKmon6ChpK6joJ6hjpWhmaCgkpyXm5WeoZaWj6ycj65ucrR0qYx3i6Z0tHp1tIKUp6SUnY2JpIeOdbhvi3uLomtrtlqhhmWXl2igoqdtlHK0dJOZf7NqhpKIrWp1tGGdZqJvh5JrmF2tYE6hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdlVG9uLlunT2JSa2VibFpiXGBwfGNTWVE+P2xvMkJCQD5NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFBOKWanJ66pJuxwK6uq6uot6q4r7XBtb2ysbu4rMK3qqyhnaekop2SrKuotqS0qK6qoZedqKClq7ido62clpmQpqOXjp6hnJmfn5GUlau2sKaYk5usqZaMlKaapa2jkpirs6SgnqissJihopCZoZegm5abl6GTnamdlJCrmYfUlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsGDmrJhg7p5wHx1uGK1gYyHqX2VgqypcXt/dbyIp6BpnWGmj6+ifo11h6t9vm5zvHSyg3V4gYptmohwbY2kdL1dd31bYXm8alpWW2l5XmlhY2ZibXhvWFtZQ0FAcT9DRys0SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTxMXC02Pzmnmp+ivKOXsMOvraqqrbGoua+3xbG7s6+8sK7Csq2mo5+lop2ckaulqrOltaetpKCWmquZp625naOumJWhkaagk46do56Zn5qQlpOvubGrlZajp6aUkJalnaStn5GhqKygnJ+ppLKdoqSOpqGVoZqcl5WkmZCwoJKVqp6FkJm2gJKSjbiWeYOTm7Z3bmxvdG95j4SOiXKewLu8mnuBsqhwgXSRuYN8hoaLho17ioeMl32ku7m9nHV5s6N0dZd1dLB1mZ5mh2qNtnRzcXe2jF6AeX2IZ4N5bHpii6xwdIV+V1unaURkWVRmX2NdY1FnZnFtdUJNT0xEO1pMPkoyOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlbLCs6uqqK2rqruvscavtbSwuai1ua6rpKKnn6CdmZStpa6rp7aoqJ+clqGknqylvqehqpeVnJGim5KQoqiilJ+XkpiUsrW2rJedo6Oii5KSppymq52WqaWmnJuhqqamoqihkayel6Kel5aYnZ6QsKmUnKeij2t/ap2qeol0f5yPdntmiHu9vsC6b5KDcZSFX3JqWl6bimFkh4+WbGB/lWNtnHZilWyAmZWUZl5gY3GbiWhyjHyGlGZqfnF0eH9+Y1x4dYFoUFxuhHx8impXbHqCcklKb4VwTnFNRFZcZmBMWldmY19PW211anFST0RETTxISDxMPzEsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlVFS09IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJeSSdTX1Y0KVBeTCgzPlxPJz8yPqifqaLBpJqzubajrKavpqi2sqzIrLC0rbakvrKzp6Gkqp2jnJqarKeupKW2qqWbmJainKetqb6oqaWVlJuWoJqTmaapqJKfkI+YnLCyvquapp2noomTkambqaScnKygo5qbo6esop+poZmum5SmoJeUnZ+dmLGlmaKomZ2Sn52kppuopJuem5ybkZeCaG9+cXeRl5SQhIm0qo2FmJWPioyZl4iUlYmDk5ORiY6SlJiUmZean6Gam5Sfm42BeqSFa2p8kX2BdYqLg3KCeHp2dot/fIlqc4F0g3Vkd312a294bF9iW29nTVhZZmpfV1lveW5tZlNPRlM5UFpOUk8nKjtLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0knUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsLG3oKqms6elsLWqyautsqe2psGotaGfpaacpZaVoaynraSkt6ygmZeXoZitqqbBn6yklpKcl5+YlJWjnp2jqJOQmKiossKvmaqcqp6PlZapnqqcnqGtmKGbnaKlr6aho6eerJiWpZ2ZmqGenp2woZ2ip5aZlJqVoqSYpKCZoo+YlYuLjpCYrpB8lZyCkYGJqaiFgJiXi4SPoIh7hJGFhZqRh4aKlY+bl46RmJ6jlpmSkJyNfo1lobOuhYqEd3uQi354eXpwZ3mRgYGIa3WBeYhyaHN/eXWDhoFqdGJ4ZV9oZGNkZmpZa3twampcU0xQRF9VRkA+Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAsp+5r76tq62xsqCqprKto6yzsMWwq66ks6+8pbWcoaijoZ6Zl6mnqqalprO2n5WVnpqasKauv6GsopGRnpqalJKWop2XqZ2Enamro7THs5+po6qWlZeap56pnKClrJSfn52fqq6opKKqoauanp+hmKWfnJ+dsKSZn6mUmZmekqacmqqfnJhmhZN9ZX+Pm5Bjeo1taGp6kKOramWamH5nhYtlZWloeo2ijmtojJiRondraouZo5+Yc2xueoSMhnlYZV2Ggl5si4uDd1xodHd3koCHgW93gnh/c215hHN2iIeNgnpohFhdanNkXXOJaWp8cm1jXVFOVkpkWEBJMz1GOD9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQklbSi42Wk82KUVZL0RPMVlCOz8uPaSeury5r6uysKulqK2vsaeurrC9saqppa6wsaCtl6GknqKamqasna2kpqiqs66elqSQo7Cmt7mlrqOPj5qimpOSm6CZmaaWe6Sroqi0w7ekoaaunp2UnqOfpJ2kqqmSn6CeoKqvqamiqZ6mm6Wep6Csl6KcpbGlmJ2slqKfm5OnmaGsmqB/vYSJc7RzhZ+GrWh3ucS4cZKho3qmmZl0q4J9y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXyBepGMmsLAfWqlsnCOgm/KeoCbeJKDjoB2eYGAeXF7gIZweISKknhsdZFiZV53Y19lgWJddGhtZGJYS1VJUVlIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fYGFfXl5eXl9fX15cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziVobnDtK+vv6mplKOwqrCvrqayta+rpqemsaugq5ibo6Ccm6qno56so6WppaW0pJ6jlKaurbi0p6+ikpGZnaaTkaCimJygnoimq6Srrb+/sKCorqiWkZ+dopmjpKqjk6GhnZ2srqiqpaOipJ+jpJytqZKkm6muqpyeq52uo5eYp5ijpJmef86UenulgnqWl5tfrY9djqiAoaF8p5WbdauDga9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq1Zo81ukXZ723t/mXF+iJJ1f2V7iHZ2bH6HbX2EjpB9a4CMX3Bqb2ZgX3hkW3FoamNmYFJUU1deSk9DNEFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xfX19eXV1fYGBfXl5bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrMHAwLS0sLeYnpGkqqmttaumsqysrKWsprCqoaecmqaYnKKvn6GfqKejpqGfsaycnpWmrq2xq6isoJSSm5+lk5CfpZedqKSeraOqsKi/xbKnqbGtlpKenKKXoaqqn5Whnp2cra6mqaibpaWioKqSrLOWpaKrqp6kqKejsqKUm6icoZyWlZGXoXKGjJh2hqiHcbB8nXGsfaCggqWPnnirgn6tf51yrX+sh4afdpiSe3yXf6qIooyRjJx9q3qIk4+ff3qtVpzEe5Bwk8F9gZVtdXCMbWZ3ZYduYXhucm6HiY+OgmyOjWNuc3VvYGZtZF9vaWpuZmNYU1xgWlJSQzhJSEBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEuK6/Txseys5+do4+jo6Kur7evqbGnqKqprqusp6KknZqjlZ+mq6CipqCoqKOfnrCtmJuWqKevrainqZ6XlZqkopKUoa6anaejrqyirLWpucyxrKatq5aUnJ2imZ+urJ2WoZmenqmxqKiom6qmo6Gqmq+xoqisr6aap6yrq7Okk5mlp5yWk4Wka6R1inqpdXuycYKlipiLcYigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoKjfal/gZSGrl57qFWdopKCe6OfgHzEsMWMc6+0s7lyYqmvwnRoi4uVjYBrlo9tbHh3d25rZmVkcXFmfGljXVZfaVhYVExMUExDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmFhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfBydbWwKGZq6ihr6KfsbSwr6mso6enq6urqaWmoJuln52mp6aknayaoqyhpKCvo56bk6qktbCvoambnJaVp6SRm6Kon5+mnLCloqixrLbHsbSpq6mVkZ2doZmgpbOdmqGUnJ6nqqqirZqqpqChqaKyrKGqs7KhnKuqsbG5ppSYpamanZN9qm2fhIh2q3l8sG6CpIuIn5aVnpaB0ri0uMmBgrJfYJSpg6WIh6B6mJaaearJdJqjlKipkJKajH6aiZrGxndloYKldIKgjoJ9r19vtWOxdUujh22nR4OTZI2PnJB6bpSOfG55dHx6bVtmanJxZ4FpXmFYY21cXllJTExKRURCQj1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fYF5cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE9UUR0cOzxGMi0kp6TAx7mtqbKuraWjnLO5rKuhpZuopqusqaagpqWYq6Ofr6ydpqGtmp+ppZ2ntqCjmJSoq7azrJymnKCWkKatkpqcp6OgqqatoKKmqbCzwbGyqaynk4mXnaWboqSvppeilZicpaWpma6cq6WknaujtqyhsbmwnpywqLW1tqeWmaqmnKGQg55Od5qCgJ97hKN8gqSDhqafnJ+UhLh8fXq5g4DNxsO2eJuikouffpmXl4p2n5eKpJikqH6vhZyDnoSsfZmUYaVso3GQhZCBfZaEcqxgpHNxgJphvH1SVXWNkaGUenuPjYZyeXOEfm9bbG53c2qBblpkX2huYmRdS0tRU0FHR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIYuHmamspKu5q6+gnKGts7Smn6GVpa+urqmnnqWlmqSnobOuoqmns6CaqaSUo7Wjo5aXoam1uaSbo52jk5Cispmem6aloKKvrJujp6K1scOwramsqZGHkJynnaOknKWXnpiYmaWjqJitoauipJeupbusore2rp6etrS6s7apmqCyo6agiJDStcO3eoeOhpGTj4Cmd5Sid4yhkoWlg4xyq4iGtG5zapqknZaKn32XmYeHkHOugqWbo42mipOdiJSQmm1wslylc5N6nGyZf3uZfm6pYaJyc36fYnOyuGh3jpKjlnuJiY6HdXt4jYFsaHdoeHNugHRdZGRtbWZoYEpZV1c8R0Y/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKiWSco2Krb+/vLu1npeopK62oqKZlaOqqK6pq5mlop+moKC1pqKpp7GklKujj6StpJ6RmpqqtLSknaWcqZKUl6+goJ6mo5ynnLOYn6mjtarCr6iqqKGMg4+doqGmo5WampyYmpimo6WXqaeroKObrKa8rJW9sK2fo7K1u623qZ6staarmnyokn18sHiLgKSliJxtsW+gh618oo+DqJeagqyKhq2GoZWooaOYhp+BmZaBe5J+q4GdmZaLq3edoI+Ik5J/eq9do4F9pqdlnoB8l3Vqrl2lbHKGmV1gW4ygbZSPo5aAkYmSiHh5gZZ+aWx+Yn10bYB5YGdlcG9nZ2hCWF9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JODE1Mi4qLEFUVlZWVVRVVVVVVFRVVFNTVldXWFZVVlFIRklKJCkpvJKahKnGw7fBtJ+braCuuaajjpqjpKCvrqmfo56drZieuaCjq6GwqpquoZGqqaWXipqQrrGtp6Com62YmY+toqGdpaGZpZytl5+opbaovq6kqaOfi3+Om5qgpp6Sk5mak5qZpaOimKerqqGinqiovKSXw6yro6KttLutsKmjtrGsrpp3r3+QipyGh3y6rYmYZLCMZJaufaGQhKeXnIKtjIawh6iapKKjkoWgXGxrgrNgf618e4KBsmxnbpmXi4exWn21XKSDa8iiZp+BfLtZdrVasn1Tr4F6rFiAoW2WjaWYiJSNkpN5d4ybfGNzfGKDd3SAfGFpZm9uZmVmT1RiW0FTXT1IKD45PTQhIS0kHzEuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiX19cW1hVUE5KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vru0wrOjnK2npbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVr6mjjombjq+sqaejqJquk5qPqZqhnaWfmaSipZieoqixqLuupKienY58i5uWoaCZj5GZm5GZl6ien5enraWkpKKkqLqfoManpqmhrLa3rrCpob+wsLCYgqqTo66Om4CGpJeYkIGAuMO6hI+dlIWomZ6DrIyEr4qpnZqmq5J/1r3CqmKkv719f6OCg9e7uLWElJKCnr2+hGujgnCrhW+df3qysceDa6uxvax5eKK+u3SAlIyjmY2YjZOZd3+PmXlifHlkjGZ4gXtga2VqamJQYltSaVw/U2BCTCk8OjQvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0ssC6sr6zop2vp6azp52Ml6W/qbavp6G/pqaxm56xnLmon66vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp2nm5qgqKKYnaCsrKm4raejmpeSe4eZkaebk46Pl5iPmJOpmJ6WqKieqKagoqq6nqnFo6GwpKy0tayyrKO/q7OynXV2qqS2hWWKoHBnrJCKj25ud6WQm6GCdrKcmHGRjnKXqqSbmbClcm1tbWaLeG9tg5pxgXpqcWlniZaVl3JpaYWHZ3GHZF6LY2lvWl1nfnimYGJykJJwZmSAjJGOn5WVl42SmnqFjZN0ZIZ3Z4xqeH55ZGxjZWxiSmRXSWpZOU9jRE8nSjkrIxwgGyIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdbXGBgYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6urKzq6mirp+ktKqZkr2xw8e8tKmev6uso6Cnq6C6o6SurK2mjpatqpCMhZWXrZ+mq6KfpKSgkoulkqaZqZqWo6mglZylpaauuaqrmZqTknuEl42ml42RkJeUjpeVppOdlqeima+lnaGruZ+wwailtKetsbOssK6qvKeyu5iMo6mltZyJl6OYh6mbkJSdkqq0mpykrqK1maWjoKOknqOlopesp42Tk42Hk52dlZCZk5iRj5WFf6Sal5aOjJSTipCIhX9ojIF0g3d0h4xxp219lpOUlIGBj4+OjpuRnpOUk52AhZOLcGiPdm+Jd3V8eWlrZWNvY1VhWD9oWkdhXk1XK0U9KyYhNjQwLh8cICUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleYGFiXV5VUUtFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbiur6Kwpa6gobexkY6qxLzDubapoaSdm6WdsKikt6edqbWnqJGYrKOMiIqPnKeWraShmqien5OWpJeomqmZlKago4+ap5igtLmnqpiakI17gZWLoZSKlZGVkI+Sl6SOnpinnpq0o5ymq7eor8KvpLinsLCyr6ustr2jssCak6elprSikp2nn46poI2Sn6KtsZuipbOrs5qmo5+nrKCfnp2YrZ6TmqKclJCXq5mNmZqXkJefkYegnpWUhpSNkI6WjYJ/Zo6IdYh3eomEdJxqiJKWlZKJfYyWkZKWkJ6QmZKdgYaXhXhxlHJ5iX9xe35qbmRecGlgXF9YbGJPX2JOWDlGRkQ9Mjw9Ny4qJSspJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBhaWFlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7C0rK+jqqeuoKi2qpGPm6Oyua2qq6GimXqcobCkprGpl5y4pqOUmKmcjoaKiZyjkK+fpJapoKGTl5mcrourlo+omaeMmKiOnbi1o6WXm42JeYKTjJuTipWRk5COkZahi5ydp52dt6J/g661orCwdaS/pLOgeXuirbW/l3evpqGKgKp+ZFxid6CPpJ6Dln5tlLWdpamxraZmoKKVdXucmXCBmaqZbYCkqYplnKWckZiZl4yTnJGEnZuQlYSUiI+Pk4uGeWyRiHaHcXyGgYFhaYmMlZOMW3aVkGZojoxxeaGVlWR4l4WAdpdogomCbnl/a3BlYHZva2toW2RjYWBsUFk9TU1NUkY9P1NCOTAvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHR0lLTFRVVVldX2dnZ1hRSjxESDw5VlJbYGFiYF5fX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqaprqOnraWSlaq0rrClmamlqpZ0i5yvoKirp5SXuaCgj5yknpF+iImbno6smqSVqKKejpeSnoV1ro+IppqokZajiJu5s6efmJiLiXV3ko2Xk4mTkJCTjI+Sn42ZnqWYm7GVgIybtZ20jJKPvaeifqeje6WxuoOOj6mghIyFj7Gqr4yKlqOaeYGLrIadn6Opq6qJloibd6Wce4icgZinhIJ7nrN7ioagmJmVmJeCkZeWhJqaYnmIkoWOkJOLhG5ykYh6gnGBgYaAh3SIhpeTeJZok3SgmnR7mYKbmYSYfpGIgYKYaYyMhGp4e3FwZ2V4bWlsaltjaWhkcFpbSFNLUEBFNS1ZU1Q2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dTWFtYW2FhaWZZUUg5RUw8P2JWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpKCmrq6rqK2gqbGmp6qlmZOsxLyvoJSlp7SdkIOdrJ2noqCNkL6emY2fmqGRfYaOmJeIrJ2jlqGhko2UiYaAkaiOhqGco5OWnYaeubGnnZqSjoVwdY+JlZCKlI+Om4uOkZ2QlZ6jlJ2rh5+0ibSarovKiKuvireFjbCEs7GGqY+qmo2dfKiPcnt3nI6mlmiVpHm0jKGgqKqUmsKDgauJmaFynoCbpX6XhpaygaF9oZOfj5iYgI+Um4mZkot8hZSHjZaUioVudJOGgHtzh4KEfYV1hoOYgo/FZoCph4+iap2BnZeAmYCKjIOImG+NkoRnd3R7dmdpdnBnaGteYm5sZmpXZEZcUUwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUVpdXFdiXmpsW1FFPUtNQElkWF1jZmhnYmJiYmNjX19iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KgsKmpqKasoKW5samrppqUnqGkqaGUo6m2orB/oKedpZ6diZS9mpONoJKdkHmDlpaRiKuZnJuaooWPjHabm46gkYedo5uWmJeGorispZmbjIx+Ym2Pi5OQjJCMjJeLj5GejZKeoJihp36hp4etnaCWrpCgnp2Rh4Khja2yiaSPrJyMmn6idoCZlGuCq3VNq3iHjZ2TnKqpgqqrf4WifHunap6Ak2xnl4aYt4mefm5gY1iDmH+NfGRnjHOZfXmXbF19mG9hVHKGXWBteoRgWWWCfoWBmXKoqmuDo25ypW+fgZtnZJ5sWmyJe2VZX4J+YVdQb3Zlb3RxampvXWlvbGpnV2ZNXFdFOEE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpcXV9XXl5jdV9NRDpNTk1UYlxcZmZpaWJiZGJkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJedobmhqqSmrJKitryrr6KZlp6gpaurn5yttKKokqCgoaecmY6YtJmQi56MlYt1gZSSjYqmlpaYnp9+k4WFrKOHnJGKmKiXmZqRh6WvpqKVmYeJgGluiIiLjo6Ji4yRi4+RoYqSnZ+aoaR/k4GPo6GUoHeclpCng6OpgIesr4eleo1/hJp9onBzk4eVe56MeW2HnIuakp2qnI+HnX6EonR3pmeefnelX5h7fZNzom6Yt7S6dJOIgoC2qGSBxrh8cZW2jHKBm6RkdKyrYX5qnbN+bn6JhI+DjJhxgKNscqNynoJ9o16cmbOVcHyXnrN0cluesoJpYnF0dXFob1hqa3FwZFtnXGFLQz1ENVFBWXEyPFNHX0pSPTwzOTU6OjZDPDtASVA/VE5OUUBEX15bWldgYHtkSUM3TFdVVmNhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaS5mauck6COpbi2ra6gmqGboqOkrJqasayrk5ehmaGlmpqUnqybi4mReIuFcYCWjYmQoZCTlJ2XfZGKjqighpiOiZGik5uajIuop6Sej5aHhH5re4Z/fY+Ng4uQkImOk5+BlZufnKCfi4l3nJiijaByoYyJqYmdqJKZqq6Bro1+eqCZeaOTeIBzl4eMnH2Vn4ebjpqdqIijZKF+jJeQm41tnmibjm+amXuAiqd9cmh0q4Oeg3OqZ5SaXZuFdoSdaKpqgLlmXKlwgZxhlYxfp3Z3iouAnWiadYeTkpiNfp5smI9qpplcqH53u2p9qVqOhF2zZ1tucnh3a2lbcGl3d2FeZFZhQVBETjZWQlJtNEpaWl5OWkRAMTUxOzs3SD86Q0hVP1lTWF0+RGJdVmBRYWR8aUZCOU5bXVhlZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mWnYmqtpyoiWOVnKy7srCsnaWbmqefnayZnbCnq56Xo5qioJmWlqCkmYaJjWmIgHJ7l4iLlpaEkpWYj3qLhJaknImVj4aKnZKcm4iPqKGfmouQioCAaYGGeX+WjHuIjY6HjpWZfZKhnp+hk5hyaJ+KoI+McJKNgqmJmqGlq6Kqf7GupKK4l3ejs6Kjf4iUeJ16qpl/oo+fnZmJmHKhfoiOsLV9bJqRoXh+mbWjo6uohJl8m32cm390qlpdb3uXi3ieYk1/e3uGZXqYQk2fWaJqc32Pb4KKhJl2m3mHibGzf36akqZzfZ1tcHyUb5lyaaNdlXZIZWNfdHF8fW5lX2tndXpiY19QXVdcU1ZAWUVRZ0RSVlxhWF5JRD1COD9BOkhFOExFWEFXUlpWRUZiXFpgS2BtfXFFQzxWXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lY3ZsXmVnZmxkZWxoaWxplJ6Bsa6ahFNfoae0urOzqJqii5qpm5unkqCro6Coj56enZqZlZignZaHh4l3hYFueJWFkJuLfZGTlohygYmSoZtykpCAiJiUn5qEjqibmZWKiop8g2yEhXGCoYx4hYyIh5GYlHqRo5+eo4iuhn21hI+enXumlnqpgpefkYyjn3+naXhufpl0oHNxfJ2FmG+Tgq18pISnn5uDpHBeqWh2o2RwpmGc0498e5l4cnNjooaRfqJyo5B2a5CzjGCDmIp0qrKovH93hG9/v6aqtF6cb39yl3CCdKNyXqRndKZgaKZsm9OYeYGabnZ5l2ubeXaXcmyppWdfZXlxf4RsaGZjbXV2Zl5hUVplUFFhSFZJVF9XU1tlaltlUEVDS0xKS0FKRDhQQFFOWFNYT1NRYGVlalNkeHl3SkdFZF1lWmhpU2loam5jamZgY19cXV1faWJhaGV8ZF5kZ2RrZGpsZmhtaJibf7CsVF1LfqqvsbSws6KcmISXpqCgooykp5+XqYqZmJmUmpOSoJiOiIV7cH2DaH2PgpOagXeRjo+KcICGj5OSbJiTfIiRkqOVg46pmZOSioWJeYN2iIBugZ+Gd4CRhYeYoZZ4kqGjmZ+Js6Gitot6rKekrqVxqYCbkYaCn5V+pYGjm4aYcZ6Eoq2uiZeLf4ykjZWDr6OVd7W2tsmidJSNg59gnZepbXmWh6CbdaGHd6B+kZeLgW9NZqOTcpuJdKV7enVihINufqFtcmRgnHN/dJhre2q0trTGpnOYfXmcapqZq3OAmmxzd5dpmXl0mHFQRH2zXmp2a3iHZmtmYnN0b2xVW1JZaE9RaElVTFhSVVxna25VZ1dNSkFKTUtISk5BUUpQZWNqbWV1c3N+eHtudIl6e1VRTm1eaFxraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubWVpbWWinYmwqIVlQJSisquvr7Whoo9/lqehoaOLpKadnKaCmZeXjpeQkJuTjoiDeWt5hmWDjH+Xn3l1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJaLkYuAiHqAfYt5cI+ghXmBlIaIlZ6UfpOkppuVloNnbnicbKJkfHKleJyYcGing5qOfaV7opeDlnKfdoCJlJWPuW6QiqJifZmjl4luc2ura3WgbnCnYZtqi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXFlZ4mCb3OiW19bZKFuXomNcXyAdHJkpW54omNmp2eXcYuXbaFvUoiPbqBeZKdUi11UmG1tcmtxgW1waGt3c2puUVZVVWVYU2xJWE5bSFdoaHNqWWtWUFJFVlxNWFJhVWhqXnd1e3xwfXxygnt/c3eNgIN3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Mp66lqbCxpZ+Lf5apnJ2ji6GhmqKigJWZk46akIuXkY6Ke4ZxgIhoi4p8l5pzdYl9kHxlg4eViomVmoJ8iIaWpo+AoaqPhZCKgYl9gICOc2mPpoN9hZKMh5efjYaRqaWdiaZ4lpt+pYmWjLKZnpGEr5efpXqYiXupdaiQhJpupaKMkoSMg7xtfKWvgoeFh5WYnqJ+pnxzqJWhlmmff3CsY5aKlpN4qG2qo4GJdomDd6uRpohrkrFsd7ONqWyLhm9voJ6SlWJ/q4yqeIGAjqefd599haSWnaBomYd1rGaerYy2c3a+jKSTWYOmjathdXJ0b3t1cGJqfW5nbFJUWFRgYFxrTFxRW0ldbG12X1txWFtfWmdzZW5vcWNxdGB3en55cnmDc4N+gXt7jIGCgHZieWRjbnNkUmxnZ29tcmlmaWFfXlxhamJsbHpvXFxiaWJtaXdtZ2xvYpamq52BgJ+llqqqnqenraOYiIGWqZmdoomapJyonYSMmo+GnJGFko2MjHSFeoiDb42FfpeTdHWGcpGDbn+LkoeGlI98e4GFl6SNf6WkjYCOiYSUdYKHk25si6iAgouTjYibnoiLkqqioJCAdJSXiH6BeZSvpH+CnXGPhnmTjoeBe3OpjXF9fXqYlpuEjXh7fX2Hk5WTi3eSmqGihHt/i22Nhlx6eXN7cWlufpOKcoB0go+Uk3GGhINmjX9fgoGMeHd0lXZwem9wiW6Fhl93aXiOZ4KDho+qnH90fZZpiYhvfXV7gnRsbGaMc3h7l3eEW2tXeY9pbndycW93eG9da4VuaWdWWV5WXGVqY1VgVF1RXm93eWtqdmRpamp1fHBxdHNhb3RidHuBeHV5gnV/gH+BeYuFgn57boBtZHluXlduZ2h1a3hqaWpkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbqpp4uho5umpJmknauhn4ODlqqRnZ+ImaaaqJmDgZyLfpaUh46KiYxygnyOfH6PhHuXjnRzhHCVhnx9kouGho+FeH6AhpijjHumn4qFj4+ElYKGjph3cYSqhY2RnI+Hnp2Hi5qnn6Crg4mNlZt/foqXraiQk6iReXGflIV9lXCAq4dxfpVxam98gZ+Lf5GNimdtXYSNjp2eoJBzl42Kc3Vsg3d0gVlyb4eRgn5/jGpdaWR7hYSJgGBpeXycfISNhHeCiIVqeo2JbGJxc4N3YHSNg4qRqJaHZ42Ogmx2ioFugop3bWNlY3mDepVaXGlnbnZbe3l3dG1zcoNmXG2Ka2tiWVhcWVhrcVteYFldXWVyfXp0b3Riampqe3xxenZ0ZG10aG17fnV6fXt5eoCAf2+GiYN7fXN/enN/aFRccmlsdnB1Z2xnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsqKQo6Ganp6YnZmooaB9gparjJ+ThpqikaWVf3uYhXySmYmIhoaKcn2AinaEi4KElopyb4BzmIaEfpODg4aKgnqAg4qan4+BpaCGeI6XiJWKi5yXhIN5rIGQl5iTiZ2choehqp6ioqSLh5ObnaOalquiqKiik52JmZF+epGQhqqAf5ORkpOcsaWalJ6OjLCRmISmjo6WnaGKkZ2EipOLbH2Pd3hmgoaRi32JnoSIjI+IiIGFhJF4fHt1nKSKiIygjIeWgICOg4F3cXWGhYB5iYiLkaeRhIeOh4KLj4p6g4iGjH90aoGDfHmZaXJoYHSKcX57d3ZvdnSBXV5vh2duX15ZWlxTZ3FVY1tbYGxndHt7cm5vY2pqaH97bXh+cGhvb2tmgHtygoB3f31/hXttg4yFfHp5fH16hHhOZHZqc25xe2VsZWJiYFtzZnBmcnFtVV1sdG1oeHpwZ2lrZY2Inrufl6OhmJWZmJSYpKCcen6XqY2djIWfnIuel314lYN7jpmJh4OEhm14gH9ygId+iJOEbWx+epeHhIOQfoCGhId8h4OMmp2ShqmdgnKKj4WSkYudkXyNe6mDjZGXlY6bloWFm6afopqehoOSmpmZkJmmoaaenpCXgpSNeX6KkIanfH2PkJGGmKqhnJKcjo2pjZGAno6KlZyghI+YgIiQhHB5h3J1YX+EkIh3jJmBhI+BhoV/hoSVbnp2dZSkjI2HnIaGj3WCjH5+c3N8ioV8eo6PhZSokIeEj4GCiYeHc4KFhoh5bWp9f3ttaGtsZ155f2d9e3Z1dnV7d1xgcH1udGBjWltdUWZsU2RaXWBqaHV5fnBsbGNrameAf2tyf2trdG53bYR5boaAdoKAfYV3cYKNh357e32Ae4KLYGl7a3VoaoNlamNgaVxjdWdvYnVtbFRicXllb3l6cmVqbW2Lip+4mqKkn5OSlpeLmp+enHp3m6SQm4mGpJSLmJp5eo6FfIqRg4yCgoJse394coCFfYqQfWtofYKXiYGIjnx+hYSHfI+Bj5ubkIimm39vioqLkoagoYqFjHyokIeOkZaSlpJ3jKOgoZ2Wm4CBkJqYk42ao6Kkm5iSnH+QiHuChpCJoYF+jY2PfJekoKCRmZCPpYyPgZySipSZnX+Tk3+IkIN1dYJxd2F+gY6Ic4qWfYmMcY1/g4aHj2h4cnqOmpORgZmAiYxzg4l9fnJ6fI2GfHuTjoSXppSMhpB7hIWFgnN/gISFeGRwen94eXBsamZefnNofHV2dHxzgGpeYHR3cHdkY1hdXlJpaFRkWF5gZ2l1eYFxZmpjbGdlf4BqbX1nbXBqfXeGemuLgXKBgX6BdXaCjYZ/fHuAgX1/j2pyg250aWKIaWxiX3FWdG9sbWB4aG1XanN2Y3R6enFia295iY2fs5Klpp2OkJiPhZyhmpt8daOfjZd/jKGKiJuWeHyGh36Ein6IgoB/cH57dHWChX6JkHdnY32Gl4qCio14fYCMg3mWgJWXlY2Vnpl9b4uBkJOFpZuHjImDppWEkoqVl5KRdpGdoaGYlJh6f4+Yl46Wmp2lnpqUlZ17komFeoiYj59/gouOjHOXop6gkZeOjqGMjIOYmISUl5p/mY59io6CeHJ+bntkgX2Lh3GHlICRgmuHg4KAi4ZmdnB9iJSajn6VeY2LfYKJfn1ygHmLh3uGkouMmaSXgoSMdoeDgH90eH+GgnNednd9c312ZmxlYX9pandzdHV9cXxjZGFzbnVybWFZX11aa2NSYldfX2dqdHmFcGJqYmtmaHyCa2h0aGxuaH98gnlsj4VxgIODf3R8g4yBgH56goN+fJBtdYl0dG1mimxqYWN1VoNpcG5geGdsYWp2cGZ4e3lxX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHeom4qYeZaci4yZkHl8gYx9fYN7gIOAeHN4eXN9gIN/iIuAZF59i5WHf4WIdH1+iX9+mISWlJaMo6CWfnGGe5ORiqaPjI6KkqCRg5CPk5eRioGPl6CakpCSdICOkpSJnZ2ep5mZjpWXdZGSjG2ImpGbe4iJkIlvl52aopGUioudi4aBk52AlJSWiJqKfYuKgntxemt2bXx/jH9uhZODlXhwgoR+f4yBZXNqfYKYmIWAj3WSioV6iX93eIF+h4J+hY+HjZWlkXmFgnSIhnt+cXJ+hIFrYHl0eXB8bmFuY2V7Ym5vdnN4d3R0YXdgb2x1bnBdWl5dXWldT1xXYmBnbHJ6iGtfaWRpY2h3h21mbGhpbGeAfHp3bpCIc4CDhX10gYaJeoN9eoGEfXyOcnmLeHhubIhraF9pcWKHaHFvZXZnbWxhemhqfHt4cGF3bYuBmZqroaWpnouLkYaJnYuUlnx2rJiMlnyek5GXlIl3fnuKfXyAdnh/gHB0c3pvhX2BgIl+fGFcfo+Rh4CEhHJ6f4Z6j5GHkZGbkqSak4F8gXyNipKkiY2KjZaajIWQl5KVjYiIjJKdk4+MjW6EkI+RiZ6ZoqGYmIqXk3CMnIZoiZuQlXuJhZCKcJaalKGQkIiKmIyCf5KffZORlI2akHyLhol1c3VrcW51fYt1b4aRjpJydIB8goKKfmVybnp/m5V+hYp1koyCdYp7cIJ/goh+ho6Lho6Wq457iH1+ioR2fG5sfoKAYWZ3c3RuemJeb2FrdF5wanp5eW10cWV6Xm5sc21zWVldX2BpWk9WV2RiZXBxf4dlXWloZmJncY1uY2hoZWlogXp3dW+OhXOBgoN8doOJhXiFfHiEhnqAiXd/i3t7c3mEa2tfb2h0f2txb21xZ29rZXthbX95d3Bsd3eJf6OZo6ihp5uIi4qBjpyGkpp0f6iUko2GoIyWlJGBdHx2hXh4f3JzeoZscm94bYl2gICHbnFbWX6SjYiAgYF2dYB/f6CGj4qSnJegkpZ3iX6AjIicnoqPhpKXloWIk5iOlouKjY6MnYqOkYRtiYuPkYqclqGcmZaGmYlsiKaFaImfjJOAjYWMgXiTmJKdkI+IiJONf36QmX2SjpGOm5N9i4GFcHZwbG5vcXyHanODj5mLcniAdYKJhHpndHB3gpuQfYqFe5WTe3iKdXKLfIeOfIyIhYqPnKWJfIR2gYl+d3dsaH1/fltxcnFvb3daXnBgcGteb2p8enFubWptd2Bwb2txbllYYGBgbFdQU1llZWF0b4SCYV1rbGRiZmuSbmBmZl9naoF1cnJvi4B0f4OBeXaBi4B5hn94h4Z2g4V7h4t/fHeLf2pxY3xihXxvcGx0amhubHd3X3F+eXt0dXN/gn6llZutn6eXhYyDfpaVg46ddImek5KGi5qMlo6MenJ4dIJwcoR0cXWIbG9sdGyHdoN9f21uVVGBq5SHgniAdnKCeYGggpCBkpKYmpGYd5B6goySo5qTjoiUmJKEhZaYi5OLiY6PiJ2EkYt9couFiI+InJqfm5eWgZWAaomfimmJoomUhZKEinGDkZePmoyOi4uOjXd7k5F7kIyOk5iNfIl+gmx3am9sbG17gGJ6fpCXgnd6gniDjX16aHVtdoiXjICJh3yVknJ8hnJ4jnuMjnyKf4WOkZ+ghn18d4GKfHZvZ2l+f3Zddm5ta3ByVV1uYnJhX21ueXBocGZndHZpcWxhd2ZdVWVgX3FTUE5bZWNcd2+Ie15caHBhYmVmkWpfZ2RbZ29+b2xxc4p9dnyGgXV2f4x5fIaAeIeDc4aFfoyMhHx6lXhncmuDYId+b29re2BpbXSAdF5zfHiGeHRzhXx5oZCasZylj4OKf4KZiH+Jm36KmJKOhIiYjo+PhHd0d3OAcHCFdHBxg29qaXVtgm59fG11c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYmcf46BeHuNf4iMiZycnJuWlHqOeGmLlIpuiqWGlImYhIZjjJGYjZSJlouMiYtwepWKfI+Ji5OSinqHfX9tfGVzb2tte3pcgXqQkIF7fn+Aho97eml1a3SMkIuDh4Z+l41tgIBwgo6Ajol+hXyEkZabnIx9d3iCjndya2RufIBpZ3NuZ2lzbFNdbmRwWV9scXdna2tiZ3l0cHBkYHhhYFVrX150T01LX2ZiW3dwiXRcW2R1YGJlZY5jYGZiWGlzc21rcXaLfHR5h4J2d36Lc4CHf3qJf3KJh4GQioh9fpl2ZXNufGWHfm5va39ZbG55enJgdnp7jXZydol2eZ+MnK+boJCChHiHlH57iJuGhJ6QjoWMl4STj4iBdXdweXFvg3Btbn5yY2R3cHxuenxqaGxipJrB3K7vonNsdoN1hKGEkW6Vj5Wfk5qAkXCFi6OXiY6VipCdloOAlI+FiI+AkoqKl3+He3Z/iniGhY2bm5eZkJB2i3hwiYuOf42mhpOLnoaGXouUl4mOiI2KioSJbHyXg36JhoqRkIZ2h35+bH1keHVqb3p0WIl7koiGen9/gIaNf3pndGqBio+LhISBjZiHbYN3cImSg5KGgIR8gZKXlJuRdXR4h4t0cm9kcnZ/X3Jsb2FodGZSYHBna1VfbnN5YXJjYGl+cXNuW2NzYmNWblpcd0xMS2NmYF11coltW1xkeF5gZGWEX2NjXlhpcmtua3J3i31zd4SBeXh8iXGDhX19iHt0i4mHlYaNf36Yc2d1cXlti3puc3CAV3F6dnlxZHZ5hoxodoCJcYCdiJmonKOShH1wi5N3eImbg4SfjI58lo1/moiFfHN3cHNqb4Fsam18dF5gd3Z7cHR6Z2BlfOvatcnD3IlzbHSBdoqaiIxpl4+Pm5SSgYhwhYigjYWLlYqMl5N7jZKHgoiPepGLho+CgHd4g4Ryh4KSm5aTmIeMdoiAcoeEjImcpIWWjqCEimGDlY+FiIWIjIaAh2h9lIB+g4WKjo+Ccod/gHJ3aHZyaXV4bVqNfZODhn2Ag4GEi4N3YnVtioKRjIN/gJSTf3CDbXqIkYiUhn2Df4GTlJGYiW5xeYuEdGpvaW91fl1yaG1caXRfUWRxaGZTX3F2dGBwYF1ohHFzaldnaWRpWG1XW3RMSktlZl5hcXOFaVtcZXhdXmRnemBkX11Za25lbmpzd4p+c3OCf3t2eohzhYR8f4d2doqGj5iBjYJ7k3Zsd3Z5eJN0bnd6fFh5hnGAbmd4dpGCZHaGhXCKl4aaoZuiioZzbpGKcnaNmnyJmYiJfJ9/hJp/gnlyc25vZHJ+aWZsd3dbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3CSkIyGapiNiJqQi4V6aIeLmYaBkpCGhpeNfIyMgICJjXuQjX6JhXp1e4N8cYaAlZmNkpSCiXaEiHiGg42VoKGIl5GhgIlhf5SHhIeDiIx/f4JmfZGAf4CDjI+Qfm2DfYN1bG13dXR4dmtjjoKPgYV/fISAhYl/cGB0coZ9kI6DfYCSintyhWd7hYyJjoV9hoCBlZCRlIVub3iLfnRsbWhod3lfZ2lpWGt0WVJocmliUGJyeG1iZV5aaoRudGNcaGBlbV9vVFpuTUdOZmRbZm1xgGtaW2JyX1xjbHZkZV1dWmxsYmxqc3aGf3Fvf3x9dHiGeIWDfYCHdXiJgZKVfImGdomBb3h5eoSSb216gHZeg390gWxoenOUc2dyh3xxkpKEmp+boIeGdXWTfm11kpV9h5CDio2afYyadn53cm9samF0fGdiaXV5WmB3e3ltcX5lZGhoV52PX3Jzl7zEhHVxlIiPfXGWi4abkouHcmmIjpWAe5WLgYSai3yKhXx7iYt/lIh1iYZ2d36BcnWFgZ2UhZSPhIRygYp3hn6Mm5+aiJWPnoGJZn6Tgn+FgoiIcYF9Zn6MfHl/gIiMj31pgX6EdmdweXh0eHRsao+Gi4KLgHmCgYWEgWxfc3l7fo6LhnyDkIJ/c4NqeoWJjYiGeYV+gpmOkY1+bm16iHx1c21mZXpzYVtwYlducVNTbXJoYU5ndXhmYF5dWW+Bb3RaZmJea25gcE9ZalFEU2ZgWWptbXxuWVtdbGJaYm92ZGdcXWBraWNranN2gYNxbn98gHR1g3qDg32BhXZ+iIGWkHiEinSBiHJ4eX6NkG9veoBxaYF4en5tbHt1lWpqd4RzbJONhp+Zn5mFh259i3Vpd5aNfoGKgpSXinqQlm97dHFramRgc3toYGVxelpgcnx5Z3F5YGVlj7Gyd0tiWqXZ0JZxepCKj3d9k4qEmJCLhW5rhZGRenmShoGEmIp8hn93d4mKhJaAb4uIcXV+e2p5hYOkkIOTjYSAcICEeIZ7iJ6blo2VkZaFiHB7k4J9goKIgm2BdmiAhXhygIGDioh8ZX5/hXZkcXOAaXlxcHWZjoaDin13eYGFeoNrXHJ/c4KJhop+h4p8iXOCbnKGiJGHh3SGe4KajY6FeW5ufYN+dXljZWd6bl1YdlpXcGtOV3FyZmBLbHd0YV5cW1p1fnNwWGdeZ2pyYG9OV2dSP1hmXlpvamd5cVtaWGplWWNweF9nXF5lbGdma2lxd3+Hb2x/foB1cIJ7gIJ/gn92gYSIl4lxgo1xe4Z8enmElIx1anl+a29+dH98b3J7epNvboF+eGeSi4KhmZyRgoVmhoJvZ3mUiH1+hIKYioF8jo1oeHNra2ZfYW94bV9ib3hcZGuCeWFxdV9lZdTqvYsyOj6Ljn9xeYWHjY11gpaMfpKNi35ta4SMjHV9j3+FgZSIfIJ3bnaHhIOXd26IhWx1e3VmeYKDpouCjouEfm6BdniFfImfko+Sk5SOjId/e5KGd36DjIJrf3FogH55bnx8gouEd2J6hYJyZHJpfm51cnWCnIyBgIaAdHZ/gXSCcFxugHV5jISLfIiBfol5e3JtioWShY10g3qAmIyLgHVtanaAf3RzW2dndW5XVnxTWW9kTFpycmVbSXF4b1xbW1lddX91aVpiW2hmb2RqTVdlUD1dZVxddWVgdG9aWVVuY1lkcXlaaF1gZ21naWtpcHd9jmxpgoR/eW6AfH2Bf4J6dYKBjZOEcIGLbnh+gHt7iJOJf2h6fWpze3KGenN2fX6MeXiEfXxri42Dm56Wi4GAbIx9amh+jYt6fX6DlIJ+fYqIa3VxZ2hiW2Jncm5fYWtzYGhwiHlic3NeY2SboI9uXTZar7V0aYCIfJGGdYWVhXOOiol2b2yEgoZ0eYl4iXySh3l+cmd2iX5+mG9xh39pdnluZnmHhKSHgIeMin9vgHeCg4CPnImElpOZioyFiXyQiHB6fYR7aH5saoB7emp7d4KIgXJgd4F+cmRyZ3aDbnV8hpaSgn2DgXB4enx1gG1ZcIB3dY2Dh3iIdoSJfHl0b4uCkoKHc4B+f5SJinxvbmltgYF0bVtlZHFvUFp6TltuW09bcm9kVUtzeGlXWVpaYXGBdWFeXWBnZGlpZk5ZZ01AYGNbYHVgXXVsV1dTdGBaZG9yV2peYmhrZ21saXB3fJJraISKfXxvfn57gYCBeneAf4qLg3F8h29yeIN/e4mMj4NpfXttd3h2i3Z8eH+Chn+Dfn16bYSLh5ijjISDe3WKeGpsg4eQeH16gpGAgH6Lg3BycGNmXllnX3BvX2BncGZqbol0YXRvW2FkanV6gL+cpqTIuHGEgnKSe3eFkoJzkIuHcnJvg3uDc3SHdIh3k4h5eXBjd4d6gJNpcoR3Z3d1Y2p8goedgYB/jo9+c4B1h3uClZKFe5iPlpCIgol7iYlreHl+dGd6aGt/eXRpeneAg31oYHiIfWtrdGh8gWl2goySlX98f4BxfHd8dIBjVnh+c3SLhYJ9hHKIinl5cnGFg4+AgHp/fneQhoR3anFobIeBcW9cZmBxbElkdUtdbFRTWXJuYlFPdHhhUlhYXWFwgnRdYlxpZWVka2RQW3BJQ2NgW2NvXV14Z1RXVnZeW2ZuaFZrXmFqZ2Vubmlwd3qSbWmIjHl9cnt+eYKBgXx2fYOIhoNwd4RybneCgn6Ii5N/cIB7eHl6gYx0gnh/gYGChHqAdW9+ioubnod9hXl3hXpndIWLkHl+f3uIhYR3kIBncG5fZFxYZVlscmFgYHBsa2iJbmBzaFleY25/d6naqceGh7JxiHdvjHR6hY1/eZKJf3RzdH13f3Bxf22EdJOFeHRrYHqCeYmPZnKEcGh1blttfYCQk3+AeJGTfnl8bop4g5ONhneYjJOQiIaFfH+FbHR2fmxndmRte3Ztand3f398YWJ4hnppdXVjfnxodYePjZZ9doF3cYB7fW6BWld1f3B2hYh/gHptiod1eWx2goSFf31+en10jIJ+dGh0ZW6Kg2xyWWhdc2RGbW1LWmBXVlV3bWJQUnR2WFBWWF5gcoRwXmFjbWVkXm9jVFxxRkJlXl1lZ11bemJRVlx0W1tna2BWal9gb2Zma3BocHZ4jnRrjo11f3Z4fXeBhIF7dH2DiIeDb3KAdHF1foWBiY2KenZ/eIN7fIaHd4d8fYF9hIB7fnJ1eYuNoIyIeYh2dIJ4Xn2Fl4t4hoN0hYaEeIp7Ym5sW2JbW2FWaXNiYFtnbnBmh3JhcWVXXGJrf3zKzoe5oWptbYpscYNxe4OJfnqQhHl4c3h1dHtqbHZjhHWRgnZvZl99gnqMimVygmtqcWNYbHqFm4iCgXKWlXd/fW+Kc4WNjop0mZCSiYaLg3t5fXBwb3xmZ3FhbXhxamxxeH19el1leoB4anZ4ZoN3aHSIjI6WfnOJa29+gnlvfV5Zc39udIGLfIJvcIqAcndpeIGCgYN4f3N7dYh9e3Nnc2Fui4BrcFZpXHZbR21qTVZVXVNVe2thT1R1clBRVFdeY3WGaV1gbGpmY1pvYVhib0dBZ1xgZV5cVntdTlVlcFlbamhdV2dgX3Jma2dxZ3Bzd4Z4bpWLdH96eH55g4h/dXJ/h4WOg3BwfHh3dnqFhYeMhnl7f3SLfX2GhIOHf35+fYZ+fHl1eHeRk59+i3yKbXV/eGOChpWGc5GKb4WFgXuEdWNuallfW1xdVGdzZGBYY3FyZ4ByYmtkVlpfan94vq57n7duYXOFaHN6cXiBhXp9i353d3J2b3t2ZWpvYYd1joBzamJefnl5i4RmcX9oa2taVm93iaOBhX9wmZNygXp2hG+DhJSKdZeKjomFiYV9eHRxbmh4X2psYG12amdqbHl3enZaZ318eWZzfm2FdWV1ho6Gl4BxjWhre4R1bnZjXXF9bHV9jHuCZ3aIfm9yaXeAeoCBdH5te3yDe3hxZmxhbYl9a2xVaV92VUppak5STmdMWHtoYU5VdWtMUFRVX2d2hGdeYXFoZ2JYaV1ca2dKRGpZYmNWWVV5WU1WbWpZXWtkXFlkYl50ZmxkcWdycHWBd3GZhnZ/fnd/fIWHfXVzgoiAlYNuc3l7enRzhIaJiYN4gX11j358hYqNg4KEe36Kg3t3fHd3mpyXeoiChml2fHtsg4OSgHKOgXGGgn+DgHBmbGdYXVtcW1NkcGReV2JydWl1b2VlYldbW2h/cG9ygHOJZGR5fWlzdXNygYN3gIN4dnJ1bWp6cWFna2eGc42DbWZdX31we4l/aW14Z2pkVVdyb4ymfIR7dpaRdH10fnxvfn2TiHibfYmHg4eDfXVwcWxndFxsZ15sdGRnZml6b3tyWWeBd3VocIF4gndid4aLfJWCb41rbnuDcmd0ZmFuemhzeIt7fmN3hHdrbHJ1fHJ7e3V/aH+AgHl3b2RmYm2Fe2xqVWhhb1JKaGpPS05vR156ZmFNVXRkSk9TV2Frd39mXWd0aWZgV2RXYnBcS0tqV2NhVVRVclZLWHVkWl9rYFtaY2RfdmdtYnBpdG9yf3V0mYJ3f4B4gH+GhHp8dYKEfpeFbnJ0fHp1cYSFj4GAeot2c5B/fIGVjYCFhH19jIZ6foB3e6OlinmHhYNrdHt6dYKAi3puhHN5hH2Cg3ZvamllVl1bWlpTYm5kW1hhc3tqaG1pYGJYXlppf2lrcIBnbGBoeXhqcnNzbYOAen98dXRtemdpeWpfZW5ogXaPhGdlWGJ3an6He29qcGdmXVRYb2eNp3aAenyQjnp2cYBxdXh8k4J6l3aGhICGiHZqcnVnZ25bbGRdbXJfaGFqeWh7bFtug3J0anCBfnp4YXeGhXmQhXSJcnB6gXNjcmpdcXhlcnSIfHljdIFxZ2p5dXNteXh2eWWEfIB5d3FkZGNte3xqalRnYWVTSmtmT0dRakVheGZhTVNyXUpOVVllbHh8Zl9ucWplXVZhVW5uVkpTZ1dlXVhNVWtUSVt5X1tfal1dWmJlX3lobGFvb3ZucHh1eph+d3+BeYCAh4Z6eHmDfoGTg3F0dH56dnSEiJF9gXyRa3KVgHuDn4V+h32AfoaCgIp7d4Srnn96h4eCanKAeXWAfoF0boZufYBzioBqcG5kZFlfWllaVGJqZ1taX3WCaV5tbFxhV1tba4FlcXR9aWlca3Z1Z3N2cWyEe318eHVybHlmaXdmXWRzaHp3koFjY1RlcGiChXh4Z2lqYVdWWWdjjqdvfneAi457cXJ/aXtxfY9+eJBzhX6AgIZuZHZyZGdnXGphXW9vW2hfbXVlemhddIBvcmtyfH51dmJ1hox7iYiBgXlzdYB2YnFuW3J0Y3FzhXx1ZXOAbWFte3Branx6dnRnh3d7enZxZWJkbXJ9aWpTZ11cVEtxYlBGVmBHY3ZmYUtTb1hLTVhYaGt2e2VlbnFnZFtXXVh3ZVRKXGJXZ1dZSFdkT0dheFpdX2xaXlxiY15+aWpgb3R4bXBvdoOYenKAgHx/iYyGfXV1hXmHjHxzdXWBeXp6gYyOfH6FiWlzloF6ipx+foV6gXt/fYaJc3GPrYt7e4aPfGVxh3lzfHp1cm6FbHt+bI96Y3BvYmVeZVZZWVdjZmtfXVxzhWhYcW5bXlhaW2t6YnB3dmxhWWxzc2d0dW9sg3h+f3h2bW5zZGh0ZVtndWZ2dpF6X11SZmdrg4J0fmJkalxUV11iY46kaXhzg4aReW5xfGp6b3+JfnaKdIJ5fXmAaWR2bWBmX15pX110a1lmXW9vYnplXHd8a25vcHh5dHVlc4STgIiDiXt3cHN+dGN4ZVxxcWJxcoJ8dGdzgWVfbndqZWh6fXVvcIN2dH1zcmJfZm1ufGRoU2ZXWFNNdl5QSVlXSGJ0Y2FJVG1TSk5aV2pscnxjbW1zY2JaWlthd1xTS2NdV2hTVkZYX01GaXVYXmBsW1tfYWJdhGloYW54eW1wa3aBkHltgn6AgZOIhIF2dIh0jIZ0cXZ2gXh9fX6MkH9+lH5wd5WDfZmSeYCAeHp9f3SIhHRxmaB6en6HlHdjdId4cnd0a3Rvfmt4fHCRc15wb2BnYmxUWlpXaGNtZlxccYllU3JuW1lYV19rdmRpdWppXVltc3Brc3NzaYR8fn56dm5ta2RpcGNbanJkdHaOc1tWU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEknVsbHtvcHJ9f35zgniBdHt6emRldWddYllgZ1tedmhXYl1waWF3YVt8dmlqcm94dHN1aXGCloSHf4V3dGtxfm9neFhdbG5jcnOAenRncH5cYHByYmBrc39tbnZ/c3F4a3BhXGVsbHpgZlJlVFdRT3VaUU9YUUhjc2FgR1ZqUUlRWlZra2t9Zm5vcmJbWlhZbHFXUlBmVlZoU1RFWVtOSHF0WF9jbGJYYGBgXYtqY2RtenhscGl1eYd7a4N9gISafIOEeXyIbo+Hcm52enx0goJ8i4+Cg5h0eIGThYGeiXWBgIJ0f4JxiIN2cKGWc3mFioZ6ZHaKbm56bmZ4cHlrcnZzjWtedW9hZ2VrUl1bVWdhbGtaXHGMZE9vblxWV1RmaXNoYnRlZFxYbnRsb3V0eGqGfH97h3aPc2Nka25gXG5tY3N4h2taVFZjZHh9fXGGXWRfY1RaX1lilZVjbXCDhYp0a2l8cGd1eXZ+bXt1dnB7f3VfZnNjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXRxdHF1d2tthZSCiX2HcnNncH9ydHBUXGdrZnJ0gHZ0Y213VmNybFtfcGd+Zm54fnN0c2ptYVpkaWp3XmVTY1RVUFNsVlBWU1BHZHJfYUZYaU9JWFRXbmllfWpseGxiV11VW3RkU1JXaFFYZlRTR1lZT013dlpfZWtpWWFgXV6ObmJma3l2bm9pdnaAf2yDgH2HmHuAh4CJf2uTiHJmdIB7dYCDfYmOf4yTcnyKkYSHn4Z7f4aNdIGGc36Ddm6ki3KAjIp2dmx5i2Bke3BmeXN4bG1yd4NnZHxtY2ZnaFNfXlVnX2tvW15ujWhOaW1gVVZTbmZza2V4ZWRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVxeH5nWlZYYGx4fHtwhF9jXmdWWF9XY5uIYmtwgYd9eGxsem5deHRufGt2dG9wfIFzWGpuX1lcVWFiV2RwYlNfYmliYmxaYX5sZmx0dm9td3dsaYaNgIp7iW5yZnJ+bnRuZFthaWlwdIF0c19pbVNlcWVWY29kfGRzeH13bHBta2BZYWZndFxkVWBVUk5XZFFPW05PSGRvXGJHWWlNSl9LWW1kYHlpbn5lYFVfVF11XFNSYGZOXGBVUklbWFBZdHVdX2VraFhiYFpejXFjZ2p4cXNuaHZ0e4RygoN6iI5+fImIjXlukIl0a3OBdH9/iIWHkYSWj3l9jI+HkZuEgHyNhXOAgXN0eXNvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fn5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY2NjY2Njo2NjY2NjY2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6OjY2MjIyMjIyNjY2NjY2NjY2Njo6Ojo6Pj4+Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmOAvru7u7u9s21mZ2dnZ2dtbm5ubm9ySiwwMC8vLEmFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fW37IxMTExMa7Z15fX19fX2VnZ2dnaGs9Gh0dHBwYO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmIiIiIiIeNkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJjJKRkZGRkZCJiImJiYmJioqKioqKioaDg4OCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkpKRiYeOipCSk4+IjY6OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6Mi4uLi4uLi42NjY6Ojo6NjY2NjY2NjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCRioaOiYmOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJGKhIuNiZCJi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+NiIyIj4eNj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aJjIiNho+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Ni42Ljo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn19f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/f4B/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYWFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Qjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX1+fX9+f39+fn5/fn99fn9/fn5+fX9/f4CAgIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f39+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f4B/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX1+fn5+fX5/f35/f39/f4CAf4B/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf3+AgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk9PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+f39/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUlFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3ent8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9PT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgIB/gWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09OTE9STllwcHJ3eHd3dHR0d3p8fn1+fn5+fn5+fn5/f4CBgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBwcnh4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gH+AgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzw4OTk7OzpAOjs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnd4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYGCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4ODo4Nzo8OTc4Ozs+PTs7Ojg6QEBCQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7PD9AQUJAPTw5PD08OTc5Ojo5ODk6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklOSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+Af4CAgICBf4CBf4GBgYBWTE5QUE5SUVBQUVFOOD0/PTw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozw6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAgH9/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQj89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFBQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj46Ojo8Ojg5ODg6Oz1APzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dnd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFAO0JDQkNAPz8/QD0/QD48PkA/PT09Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxwcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkA/PUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHx8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkVAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk1LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRWVvcHFxdHZ1eHt8e3x8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PkE/QURFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm9wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gIGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRklISUdISElHRkJERkREQ0FVdIeJh4eGiIJXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExLTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent+fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLS0tKS01KS0hIRkZHRkVQbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZHREVHSUtJSUdISUdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9f359fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTUxJRkpWbIGGhYSEhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lIS0xPTk5RTlFecoGFhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7PDw+QTs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSExLTlRne4SEg4KDhIaJiouMi4qJiouMiVQ6ODY1Njc2NjY0Njc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc4ODo7NzY4ODk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1EQkRGRkRWeISEgoKDgoaJioqJiYqKioqLiYqKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NzY3NjU6Ojs6Ojw4OTk5OTg3Nzo6Ojg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BRV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEQ/UH2Eg4OEhISGiYqKiIeIiImKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo6OTs6Oj49PT87Ozw9Oj48Ojw7PDw9PDo6PDg6Ojs6OTk5PD88PUFCRElJTEtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj87Ozw6ODk5ODk5OTk6Pj0/P0N2hIOEhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUFCPkBDQUA/PT4+QD8/P0A/QD09P0I/QUE/QT89QUFAPz9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6PDw6Ojo8Oz0+QD89YYWDhISFhIaJiYiHhoaGh4iJiouLioqKi4mLXj5ER0lLSkpGR0dERkhHRUNBQENFQ0NAQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3OT06PDs+PT4+Oz48Pz9DPkp+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRkRERkdGRENGR0VCSElLR0hHRkdHRUtKTElKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgH9/gIB/T0E+PT9ETEtAQkJBOTc7Pjs8Oj0/Pj88Pz5CQUU/aISChYWHiIiJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtHRUdISElFRUlHRkVMTE1JSkdHSElKTk1PTUxOS0hHR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6PT88PT0/QENCSFN+g4SEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExJSEhGSkpFSkhHS0pJSkhIR0tMTkxMSEhJSk1QTk9OTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVb3F1d3h6e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6Ozc8PTo8Pzw9PkBCQ0NMbYSDhISFhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4teUlJQTU5NS0pHRkNIS0dMSkZLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pJSkpNS0xGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl7ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OD89PT5ARUQ+QkRDRkp0hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtLRUZGS09OT1dWUVBPUlNSTVNUT01TTFBTVVdSU1JQTEpNTU1MTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkVHR0dHSEY+QEI9Pz08QT9BQURUS0JISUZJS3iGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBLOztRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFFRS0tLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0ZGRT8/QUBFQUNGRENES1ZQSlBQTlBQeYaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJeXVZdWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01LTEpJSUxNS09NVHB0dnh5eHh6eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1JRVFZVVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJidHN2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdHd2dnR3eHh7e3x9fX1+f35+fX59fX1/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBPSU5PV1ZYWlpkcXR3dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f3+AgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU09PUU9RVlFTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JVUk1PWVFNTlFTVVVNUVNSUE5MS0hDSUdSU1RZXW1ydnd1dHR3e3p6e3t9fH19fX59fX1+fX5/f39/gIB/fX1+fn5/f4CAfnt2c3d9fn5kdX1pcXRgZF1dW1lVUUxITElhbJJ0UFFTTVFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQT9EUENDQEM+QkhHVkBITk1HXWlRSEdPRkRFRkhHSEJDSEdISkdEQUFDQE5QTVJkdHV2dXR0dnl8e3t7e319fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUlJQVVlTVVFRVFJPVmBrbHN2ent4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojo+QD8+Pj5qUEthRUZISUVCP0dMTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz48PUI+SU1GVW91dXZzdHZ4e3x7fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVlVXUVFXVlBYW2JdYWdtbWxuamhgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcT3tOT09OS0xNT09QTEtMV05JR0FBPDk3NzU5OT07Ozs4OTg5PztCRz5cdHV2dnV2d3l8fHx9fHx9fX59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJUVlhTUllUTllaW1dZXF9eX2VfXV5xd2teYGdrd29vbGpvbW5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FWUE1JREY+OTk2NTg3OTc5OjM2NTc5NTxCPWZ0dXd4d3p5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdTW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE9KTk9VU1RcVlJVU1JOTUxJSEhGPz49Ojc4NzY1OTk2NzY2NVhxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFdZWVlSVU9JR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlAUT1jYFFTUVBNUFBPTk5NUE5UUlBSTElMS09SUFFSUlRRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVlFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjRAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMUFBOTVBRUU5RT0pMTU1LR0VFQ0I7PT08OT1HNjY3NkVucXV3ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVVlZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOERNU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FMT05NSUxLSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PT1BQEI9PUVIRkRGRklHSkpARkFBQEZHRElPSFFSYVxRUFJPU05PT0xMT01LTUxNT05bVktNUU9HSUhDSUtMTEtGRkZFP0JDPj1CRz9CP0BkcnV3e3p7e3x7enp3fHh5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRUpFQ0hHSUdJRUJCPz48QkBAR0pFTU9iZVBNT01XS0xOS0xNTUxMS05OU2RNSkxSSUlJRkJKS0xNTkpHSUZCQkJAP0VGRUhETG9wdnp5eXt7enx6d3N4dXh8fHl6bnFxbW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPSEtFP0I9OTk6Oj9CPzxBQkFBREVHS0ZESUlHR0hDQz9CPj9AQD1DRURMTVFUTEpJTVRGSUlKTElKS0lJTE1PUFFQS0dDS0hDQ0tLTE5PTklKSUdDQ0NESUpNTElac254eXh6ent5fHZycHVydHl5dnhqcW9rbGxudHRtc3Z7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGR0hHSktJSkxER0I8Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHSENDO0FAQj5AP0JERElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJISUROR0JFTExOTlBOS01KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnp0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGhlcEZKQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREA/QkNFRUlGSkpMRklJR0ZGREI6QUNDPj9DQ0NFR0tNSEpOSERIRUlMTk1ISUxHRkZJSUxOS0lIRU9JQ0dOTU9NUE5OT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZm1saGlrbHRtb3V0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjs7Oz47PT9EQj9BQ0ZHS0dKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRUZHS05PS0ZISUZFQ0RJSkhLSUdIUEtESk5MUU5PTk9QT0pKSU1SVVVSUFhlYWFtZnByb3J5emdlaGhjaWxmcWxmbG1naWtsc21wd3V0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VERkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdKRkpHSUdGRkZEQ0JBQUVGQ0JCQkRFRUdHSEZMUExITkpKTEtJRkhFRkVDQ0hJSEtKR0tSTkNPT05RUE9PTk9QS0tLUFVXVlZUWWBfXWlgbmluaHJzYmVmZmRoaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxc2trc01HR0VGQUJAREU8QUFAQzw4Oj0+OkA9QENAQEFERklFSEZGSEZFRURDRUJESUZDR0VBRUdFRkZHRUlNS0hRTUpLSEhJRUZISEVDSUlJS01LUFNORFJTUlFTTlBNT1BNTE5TV1ZYWVZYXlpdZGBpY2ppZ2tfZGVmY2hnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJFRTxAQ0JEPDc6Pj47PjtBQj4/P0NFR0RGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9IVFVUUVRQUk1OUU9NUVdaVlpZV1peWlhhYGFgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lOSEhHSURCQ0hFPUBFQkQ9ODo+Pj08PEJCPUA+QUJGQ0VDQ0dDQ0RERkdHR0lGSEpIQ0lIR0lHRkRIS0lHS0hNS0pLTEhLSk1LSU5MT05PUlVWT0xWVlRRVFJSTE9RUE9UWlpZXFpaXF9fXV9jX1xiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUxJSkhKRkJER0U9QUdEREA6PD5APz4/Q0I8QD5BQUdDRURDSERFREZGR0hGSEdJS0pFSkhISkhGRkxISEhKR0xLTExMSU1KTU5NT0xQUFJVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJmXWRgZmdgZWlqZHNzZmpoZmxwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3c2d0cmtxcmtyd3B3SkpLSUtHQkVERTxBRkREQjs/P0FAQEFEQUBCPkFDSEJFREZHRUhFRkVJSEZJSEpMSEhKSklLSkZKS0hJS0pHS0tMTElJTUtNTk5PTE9RUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWJiYGRkZWJkaWJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV1ZnFza3BxanJ2cHdKTExLTEdDQ0FFPEBFRURDPUFBQ0JCQ0VBQ0RBQUVHQ0dHSEZFSUZDR0pHR0pGSUxISUpNSk1MR0tJSExLTlFLUlBMUkxKTU1OUFBQVU9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY19hZmNhYmhuaGJpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRxd0xNTExMR0RBQEQ+PkRFRkM/Q0FFRERGQ0JFR0NCSEZCSEpJR0hKRkRLSkdISkhJS0dKSk5LTkxJTEhKTUpaZkpkW0psUkdOTV9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbXpmXGx0YGxrVmB3dmlqZ2hmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3J5TE5KS0pGQj9AQj88RERGRENDQ0VFREZCRUZHRERKRUVKTEtJS0xHR05JSEpLR0tKSUpKTkxNTUxMSU1NTFtzYmRwXWxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9ccHZncE9Mcnl2a2Fha2VlbHhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd5dnR0Ym11a3BwbHJycntLTElIR0VEP0FBPz1CRUZCRUNFREVFRENISEdEREtIR0tNTUpMTEZKT0hKS0pJS0pKSUpNTU5NTU1LTk1OW3Jwb25wcGtqTE9QbVhOaWJ0cnBhbW92XFlsUFttbVpxbWtwbHh4dHNpcFxgc2xxa1V1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRURCQUI9Pz9FR0JHREhFRURCRklISEVHS0pHTUxOSkxNR0xOSU1LSElNSUpJSkpOT05OTUxOTUxcaGR1XWxxVmtNT1FuVVprXmtsdmFsZHRUZWNObFlsXHRvbGpseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cnNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1GSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0tSUkxITU1JTkpJR01HSkpISU5PTU5MSk1NSlp0cHBvcXFsa09RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xc29vdXN0dGpaXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0RERUBAPkNDQUZDSElNSEZDRkpMSUdGSk1MRk9KSldSS0dMS0tOSUlKTElLSklJS0xNTUxJS0tKU2tiWWleX2pjcnJaX1lqb19lZVVrX2NbYWFRYG1oXGpcbmlqZFtvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFydXR3ckhIRkpERUNGQUBBRURDRkJISkxHRkNGS0xJRUZKT0xJT0pMW1FKRkhJTE1JSEpKS0tJSElHS0tLS0dISklLS0xKSUtMTlRbXVRQVU1RT05PT1ZRT1BRTk9RSkpOUFFkcWlUWVZbW1xVWVpdWF1cXGNmYWFmYmNmX15ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzSENFR0ZGQEVDP0NHREZHQ0lLTEdGREdKTEhER0lQS0xPS0xXTUlGRUhKSkhJS0hMSklHSEhKSEhIRUZLSEhKTktIT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZFxhWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRQQkNETE1BQ0NCRElFR0dGS0pLSEVFSkpKRkVISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdGSkhFRkdFRUpGQklMSUpTX1lgWGBhW2BVWFpUXV5aX1JZXFBeXFlOX1xeU1teZF5aXWBjX1lfYltgXltVWVlaX15jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXp6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURDQUNGR0VHR0lKSklJREZLS0tFRklJTkpOTEhMTkdIRj5IR0xJS0tKS0tJR0VJRkNERUJGSkQ/SUtITlpiWV5eYV9SVFNXX19cXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmFiY2NlWlJaV1ddWl1kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WVFKRkRHRUJESEhGR0hJRkdKR0hGSEtJS0RESkpNTUxMSEpKSEpHQEdGTktLS01LS0tJR0lFRUBEQUhJQT5ISUZPXWBaW2RdX1RRUlhdXFxcX1tLV1xMUlxZSU1eUVFdX2JjY2NjYlxkYmFkY2ZYUldVVFxYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoaGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSUZHR0lHR0pHRkZJTEpORUNKSkxOSkxJS0tJSUdDSEhRTUtLT01LS0lISEZFP0VCSEhBQEZFQ1NdWV5YX1hfW11VWFhPXVxRS0pWXlheW11WWmFSUl9fYmJgYGJiX2NiYWRkYVhQUlJTXFNcXV1eXl9fX2RpZ2xrbm5we3t8fnuAgoOEhYWFhYWFhISFg4SFh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTEpMTEpJR0RIS1FPTUxQTU1LTElKREVBRUNIRkFBRkNBVVVFXFReU1dgWE5UVU1ZWkxKS1RgYVtfWF9eYl1PWWJcYGBfYmNhXWJhV2BfVVFQUVJZU15cW11dXmBiZmZmbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJU2NRRVdfSUdHSERGTUpQUEZJSUpLTkxMS01MSkpHRUpOUVFOTlBNTk1OSUxCRUFDQ0ZDQkBDRD9MR0NMTFBPT01GTUZGSElHRkxLTU9QSUxPUFBTUExRVFNVWlhXWVdXY1ZOUlRQUVBPUVZUXFlZW11cYWFlZmRoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtOXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BTU05QUE5PT09JTEZhRUReTERmYkNMWkdeXHNtT01WbllLQ1BfVGtWZ0pdWFVeRExRVUxNU1ZRUlRYVlRYVFRcVE9lWmhoZVpVa1RYV1VbXFtgYGFiYmNhZ2lnbmxoc3p8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFTFBUSktHYFRISk9KSU9NUlFLTUtMT1JVUk9QSkxOR0hNUVtZT1BQTlBRUEpLUX9RSXxZWXJzV1BtR3Fub2FWUHFxdE9Ca3NtcXNwU29fW25YXVZcWFVraFVdVmNZYFlaXlVVV39pdHV1YGF2X1liXFxmW19hYWFiX2FjZ21vbWBwd3R4gYGCg4SCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT01RVE5PUVBMTE9HTVBTW1pUUVJPUFBRTElaeF1UeGRoWFJTUHZmdGxwYm5ma1JyTkx3bWpycHNycXJwb2+AXWV6dXhxcXpxfnJ9a3V9YVJofGVzc3Bzc3x9cH54b39yYGBgYmJbYmFobG5rYmxmZ213foGAg357eHeAdHZ6aXF+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRE1NSEtLSEtQT01OSk5WXllVTFFTTllZTFNTU05MUElRUlRZV1dQVFBQUFNMSGd4bGN4cW1aSktUeXB1bXVibnZQZGRIZXZxbXdvgGpmeHhpV3JRaHptaWp6en5seHp/cGhuWHV1anZ1cYFhc2h9aWx4fG9fX19jYlxfY2VnamplZ2JjZGxtcHBzdHNzc3lxcnhibXRncnl7c3N1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFFIS0xKTFFPT09NUFpgWlhLU1dQYV5SVlFZU01QSlNUVlhXV09VUE9OUktMcm91dXF1cWNoYFVuS3FwXkdoeVd2VEtoeH13YHl7c25hXW1vZFNncnVubXlwd2t1c3RxbG1cc356a215fGx1bnxrcXd1eF5fX2JfXmBlZGlnaGZlXmJiaWlpamtub2txbm1qcGFjZmNvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUtNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRXV1lXT1NPT05SSVJtSGl3S2BkdnZUVmxObmx7cmFqZ391VEtXa2d8bG1seF9acHp7X2B6c2Nyb3hxZ2N8aXJ7XVRLbF92dWxqdnx7bn95bHxwXV5eYltfY2VlZ2ZlZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbG1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTExTU1JPU1JYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FLSFFOUFVMS0tSU1JRUk9WVVFRT1JSWFhQTU9VVFdYWFtbVVFSV1tXWFdbT1JUV1dYUV1YVlxVVE9YUldXWFlaYFxoc19cW1tdXV9jWl9kZGVnZGRkY1pkYmdmZm1ubXVmZmdjYGZeXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJOUlFQTFZWVFBUVVhVWlVSWl1VVVRXVVlYT09MTldUUE5VU05QTkxRUEtJUVFLUU1KSk9RVFFQUVNSSkhNT1BRUlBQUFRVUlhXXFdTU1BRVVVWU1pRTlJSV1RSWFVTWFRTUVVTVVVZWVheWl9hXVxbWlxcYGNcXmJjZGdlZWVjWmBhZGFiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2doUUpLS05PTE1UUU9UUVJNWFdVVFZYV1daVlNcYFZXVllVWFRRUEtPWFNQTlVQTlFPTFNQTU9VU05RTk1OUVNQVFBRVFROS01PUlRUUVFRVVdVWVpbWVJVUlRYV1ZZXFNPU1RXVFNZVFZYVFJRV1ZWWFxaXGBdV1lfXV5dXF1hYV5bYmNjaGdmZGNYYGBiXmBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMUFVQUFRRT1FaWVhXWVpaWFhWXWpkVlhZWldWU1RPS09WVFBPVFBQUU9NUlFPUlhUUVFPTU9SVE1XUVNUVU9OTlFUVlVSUlJUWFZaXVxaVlZRUldYVVtbVlBTVVVVVVhTV1hUUlFYVlZbX1teYF9WX11eYF1cYF9fX1pjY2VoaGVlYlliYGJeX2ZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVlxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVdTTU1ST1JTT01QU1JVW1VUUFBMUFdVUFZRUlJYTU9QUlVYVVRUU1RZWFteXVxbVlJPVVdVW1pWUVNWVFVXVVNYWlNSUVpXV11fW2BgYFZiXGBhXWBiX1xgXWNhY2hpZWdhWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcWmBeX1teXmFgX2NcWWBaUU5PTlZRUFVTUFVVU1BXXFxcWV5dX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFJUVFlbV1VPUk5TWFVTUVJQUlpPUVNUVltWVlZTVlpYXV5cXF5WU05UVlZbW1VRVFVVV1hSU1lbU1JSXFhaXl9dYmFgV2JbY2JeYWNfXGJhYl9kZ2llZ15cZGBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1cYFxgVVxcaGpyfXNsaFxVWVdRT1NbU1JRU1JVVVVLUldWWlpaU09TUVVVVFJNVFBSWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aV1FUVVdYWFNWWVtUUlZdWV1eYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVnX15kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JbUFpVVldWU1RUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRWVFZZV0xSWlZcW1xSUFVTV1VVUk9WUFNYU1dVVlteWFtZVVpeWF9eWVxZUldSWVhZX1lZUlRVWVlZVVdZW1VUWl1dXmFiYGVkXV5dXWVhYmZkXl9kY2BcZ2VoZmViYGVhX2FhYmJfYF5WWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXVVXWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZXV11YT1VcWV5dXVRTWFJWVVNRUldRU1ZUWFhYXl5YXVtVXV9YX19YXFZRWFRaWlphWFtUVldaWVpXWFlZV1ZdXmBfZGNiZmVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYmJhYWBfXlZVXVpbXFtZXFlZXVtbW1hYWVtaWlpdX11UWV1VTlRaVlRcVVdXWVdWXGBhYmNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVV1bYGFcVVVZUFRWVFJVVVFUVVdbW1xfX1pfXFZfX1ldXlldVlJYV1pZXGJZXVVWWltaW1paWFpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkZ2BoXmJiY2FhYF5fWVRbWlpbW1hcWFhcW1pbV1daWFhcW1xgXVZdXVNPVlpWVlpWWVZYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1hZWlxcXF9bWltiVlNXXl1hY1xTVllQVlVVVVVVU1VUWF1dX2BgXWFdV2FeW15cW15YVVhXW1pfX1teV1hcXFxdXVtaXFdaX2FeYGRkZWZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpYGdeY2JjYWFgX19cWFlbWVpZWVpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWldXWllbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYV9cXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVVdYV1ZWV1ZdXV5hYmFfYl5ZYV1dXlldXVlYVVZbW2BeXV9ZWV5dXl5gXFpaWVtfYl9jZmRmZ2ZoY1plZmdpZ2NfY15hZmVaaWljZmpkZl9iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVcXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVtZWVdZWmBeYWJjYGFjX1xiXV9dW15dWVlUWF1cX19eX1taXl5gYmJbW1dbXWBiYmRmZGdmZmhlXWVnaGlmY2FiW2NnYFxpaWNoamdlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXVlhQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYmBjYmJdXVtaV1hqcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeXl5aWFVbXlxcYWFfXVtgYWJmYl5bU1xfYGNkZGZlZ2ZmZ2ZfZmdoaGdkZGBbZWdeYWhoY2hpZ2RgYmBjYl9fX11dW1pbWVhYWFZaVlxbWlZWVUxYWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIeJh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl6e3t6ent6enp6enp6enp7e3t7enp7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXp6ent7enp6enp6enp6e3t6e3p6enp7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODg4KCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09PPxMXFxcXFx9LU1NTT09PEvr6+vr7CooqMjIyMjYl+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk5eDU1NTU1NTW4+Xl5eXk5dLLzM3MzdCqjZCQkJCSi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5enp5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4ODg4KCg4ODgoOEhISEhIODgoKDg4OCg4B8fH19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV4dnZ2ent4e3h3dnh8enl5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl6e3t7e3x8e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2en15e3t5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fnp5e3h7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3h5fHp8d3x5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eHp6en18enx4fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBgICAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3l5enl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eXl5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veHl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKCgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qKi4eHh4SDgoGBgYGBgYGCgYKCgYGBgIGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhIWCgYGBgYGBgYKBgoKBgYGAgYKBgYGCgoKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYGCgoGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoKBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIODgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4SCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGAgYKBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCg4KCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKjIiGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgYGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fX18fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19f4CBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgYGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoWDgoKCgYGBgoKDgoKCgYCBgYKCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioeIio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/f39/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDhIOCgoeSk5CLioqLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgYGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKBgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISEhIWFg4OCgYKDgYCCg4GDhYWFhYaGh4aGhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SFhYSFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKCg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjpCOkJGPi4mHgoKCgoKCgYGBgYKCgoKBgYGBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgoOEhYSEhYWEg4KEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiIiHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgoKBgIGDgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoKBgYGBgYGBgYCAgIGBgIKEg4OCg4KCgoGCg4OIh4eHh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmJh4WEg4GChISDgYGBgoKDgoKDhIKDhIWFhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDhISEg4KBg4KDhYWDg4OEg4SDg4WEhYSEhIGBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWGhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYKCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYGAgYGAgIKBgoKCgYGCgoGAgYKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGBgoODg4OEhYSFhYSDhIWFhoWFhYSEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgoKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeHhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhIWFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOBgYKCg4ODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhYWCgYKDgoKEgoGChoWEhIODhISEhoWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIWFhYWEhYaFhoWFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgIGAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYWFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoeHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4OEhISFhIOCgoODhIODgoSFhIWHh4WEgoB/f39/f4B/f3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHiIaHhYSDhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChISEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qJiIiHiIiIh4eIh4eIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4ODg4SJioeHhISFhIODhIOFhIODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KFiIiIh4eFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoODhYmKiYeFh4WEhYWEg4WEg4KCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoSFh4aHhoaDgoKDhIKDhISCgYGBgYGDg4SDhJGSkY6PjYuHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/gICAf4WGhoWGhoaHh4iHhoGChISDg4WGiIuKhoWGhIKGhoKAg4ODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhYSFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAhISFhIWFhYeHh4eGgIGBhYODhYWEh4iFg4GAgIF/fn2Cg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIGDgoCAgICBgYGBgoGBgoSDg4WEgoKEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4N/fn5/fnx8f4ODgoOCg4F+fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f4CAfn2Af3+AgIF/gICBgH9/gYF/fX1/gIF/f35/gIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCBf3x9fX59fX6AgH59fn18fX6Cg4OCgoGBf319fn6AgIB/fn19fXx7e3t6enl6gIB/fn9+fn58fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36AfX1/gYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39/f36AgH9+gH9/fn5+f39+fn99fHx9hZKSjYyLioiJiISFhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgIB/f36AgYSDgoGBg4SEg4SAgYGAgYCBgIGCgoOBgIF/gIKDg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+fn6BgYKBf39/f4CAf3+Af4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qIh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDgoOCgoKBgoF/fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKDhYOAgYOBgIKAgYGBg4KCg4GBgn+BgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICBgYGBgH9/f3+AgICAf4CBgX9+fX5+f39/foOGh4eIgoaEhYSEhYSFhoWGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyDg4SFgoGEg4KCg4WGgoOEg4GCgoODgYOCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoCBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf39/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeIh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgYB/f359f35/gX+AgoGFhYWGhoeHhoeHiIaHh4eGhoiHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgYKBhYWLg4GChYWGhoSDhYWDhISDg4SDhISEiJKOi4mIiIqHiIeFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAf39/f3+AgICAgICBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiomKh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoOEg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gHp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjYuMjI6KiYmGhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDhIWFhYWDg4OEgoGDg4KDgoKBgICAf4F+f35+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fIB/goCBgH59e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjIiHiIWFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICBgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3t6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX19fXx8fYB/gIB+gH5+gpORi4yMjY+KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgICAgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4d/fXx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYCAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36MhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKMjIuOjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAe359fH5+gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8e3x6fX5/gIODgn9+f3x9fH18fYGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH9+f399fn9/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBf4CAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJCOjIqJioaHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIKCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn59f358fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJiomLiYWIkI2LiIiGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4OAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iLi4uKiYyQjYyJh4aFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5/f4B/gICAf35/foCBf3+AgICBgIKEg4GAgIGBgIF/gIGBgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIiJioiJjY+MioeIhYSEg4GCgoKCg4KBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXl8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6BgYOHhIiNjIqJhYWEhIOCgoKCgoKCgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH6CgIGCgoCAgYCBgYCAgYKCgoKGhYSBgYGBgYOBf4CChIF/foGAfX6Bfn1/f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIN/iIyJioeFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB9foB+fX5+gIB/gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyIiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHV3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gYF/fH5+fX19e3x+fH18fHx7fHt8fYiGhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX1+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX59fn59fnx7fHp8e3qAhYKDhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgoGCgYGDgH+AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBf3+AfoCBfoCBgIB/fn5+fn59f35+hYWAgYB/gIOBf36BgH9+gH6Af359e3p7enx7eoKDf4KCgoKDgoOCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7cnl7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX+Af3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3t6fHt8gYB/gX9/gYGBgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fn2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5+fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn1+eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYSDgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn59fX2Af4CBgYF/fnx+gH5/f4GCf4GBgoOHhYGAf35+gH+AgYCAgICBgoGAgH6Agn9/gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhYOCg4SEg4OCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/foCBfn+AgoKAgYSChIWGg4B+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4KDgoGCg4KBg4J/gYB/f35/gH19fXx/gICAf39/f3yAf3+BgIGAgH99gH9+fn5/f31+foGCgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36GfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZxeHlyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH+AgIB/gIF/e4B+gIB/gYCAf32Af35+f399fX1+gIGCgX5/fn5+fX19f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH59f4CBgH9/gYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYOCgoSFhYKCfn19e3t8fHp3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgH1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39/fn18fn9/f399fX9/fX5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gH+Af4CCgICAfn1+fH9/gYGAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2EfXR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goJ/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f3+Af39/f4B/gICAgIB/gIGBgYGBgoGAgH9/f359f356gZKLenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2Fh4ODgoOCgIGAgoKBgIGBgYGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIJ/gICAgH9/gIB/f31+gH59gIB/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhoh8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fH19fH18fn5+f39+fHp8fXt9fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBgICAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXx8fHd4dXh4eXt8fH17fHx8fH1+f39/f359fX6Af4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYGDg4B/goGFg4OEgYGDgYKCgYGAgICCg4KAgoKFg3+AgH6Cg4GAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH18fHx7fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDg4OBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgoGCgYCBgICAgYKBhIB+gYOCf36Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4KBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGDhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3x6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foB/f4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnR9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn91dn+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KDgX6AgIKCg4KDg4OEgoGCgoODgoOBgoGBg4F/gYSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhISDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx8gYGCgoODhoOEg4aEgYKIh4WEg4OEhIWChIWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4KDgX+Bg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEhISEhYWEhISFhYWFhIODg399gYR/fX18fHx8f4F+fX5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WBgYOEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhIWEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeoN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgISDgX9+fX59fYKDgX17f31+gH59e3x8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIaEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2ChHVzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN/g4N9gX19fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ6eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9+fX6BgIF9gH59gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgX+Afn5/gYB/f4KDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhYaGi4qFhIaHh4WEhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSBgYCBgYB9f3+BfoB+fX6BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYSGhYeGhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dHBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFhoaGhYSFhYWFhYaJiYeFhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDhoaFhYOEhoaFhoSGhIOEhIaEhIGEg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWFhIV9d4WEhISDgoF9f357fHt+e3x8fX9+fXx+foCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4eFhYWFhoaHiIaEhoWGhoWFg4WFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGh4iGhYiHiIWHhoaIhYWGh4WGhoWEg4WFhoWFg4SEhISFhIWFhIWFhIaHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn58fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHh4eGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWEhoaFhIOFhYKFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGg4WEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eGh4aHhoeFiIiHh4WGhoeFh4eFgYSEhYaFhYSEhIOEhYWGhoaFhoSHhoaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e35+fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoWHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeGhoiFhoWGhYSCg4KDg4eBg4CCg4OCgoJ/gHt9fn57fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWHh4eHiIaGhIaFg4OCgoKDhoGDfoKCg4CDg39/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhYSFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaHhYeGh4eHh4WEhYWDgYKBgIOFgoN+gYGBf4OBfn9+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYWFhISDhIKAg4GFgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHhIeFh4aIhoWHhIaHiYaGiIiHh4aHiIaEhoaGh4aFh4OEhYSGhoaHhYWEg4WFh4WHhoeFhoaHhoaGhIOEhYGAgYGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCBgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWGhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaFhYaDg4OEgH+BgICEgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGh4WFhoKCg4N/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx9f358e4iFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISFhoeIh4WFiIaJh4WDhISChYOEhoKDhYWFhoSHhoWFhYaDhIWEhYaFhoSDhYWGg4WFgYGDg39+f4B/fn+Df3uAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6enp7e3x6e3t7fH1+fX2BfX18fH2Af318hoOGhoaGhYOEg4WChYGBgH9/gIB+f4CBfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIWHhYeFhYKDgoGDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIR+e398fICBfYGAfX2DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp7fHt7fX59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4F8fX9/fn5+gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhoSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f359fHx8fHt7enp6enl7enp6enp6ent8eXt9fHx+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEg4OFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhIWFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfn2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc6PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ5Ozw4Ojw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODk6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk3Ojk7Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dTV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2tra2dnZ2dnZ2dra2tra2dna29vb29vb29rb3Nvc29nX19fX19fX19bW1tbW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqJkpmYmJiYmJiYmJiYmJiXjIuKioqKioqKioqKioigv7y9vb29vb29vb29vrSKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTUWJsa2tra2tra2tra2traVVTU1NTU1NTU1NTU1NOeq+qqqqqqqqqqqqqqqybU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3PT87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1ZlcG9vb29vb29vb29vb21ZV1dXV1dXV1dXV1dXU36wrKurq6urq6urq6uunVhXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJhb3h3d3d3d3d3d3d3d3d1Y2JiYmJiYmJiYmJiYl6Fsq+vr6+vr6+vr6+vsaFiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Ozs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy83Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzLy8vLz9PT0tLS0tLS0tLS09PRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7O0dTU087Q1NLPztDU0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tfX19fX19bX19fX19bX19fX19fX19bW1tbW1tXV1tXW1tbW1tbW1tfW1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7O0bCDhJPPyZSo0tDGk6vSzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8mburidrJ6rm7DQma2Zs9LOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9HDoo9/isKUh5yexZOGnZ3Oz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv56KqNDUu8iYmca9yZaZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P0bqlrZye0tGUlp/O0ZGYoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz9HAoJ+Tpbyzn8Kb2q2jv53V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0qavrpun0IuTnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHJ18SYodDapZmz0NuimbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXFjZ6gnqCSp5mgrZComJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HJwaGtoaOlpqSooK+noqmc0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09WrjY+q1pyRjrrVmpGOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MG+1dPTucfW09O4yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQD43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHU1dLS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk4NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg3NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODc4NDs/PD89OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTs8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6uri4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODg5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTc4Nzk3Ozo6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlqKmmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTo+NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFCPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDo7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNAREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9CQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6Ozs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ozk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD4/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5AQD1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo8PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8Ojc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTo7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ubm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVj4uUk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODUzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFS09JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEFCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhICCf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo8Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTEhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxkY1tcWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGdiYVpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJgaF9jU1FYVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbX15aXFZcaGRvY21paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYlpycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWttYV9kYFBPQUA8Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3ODo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV1ZU2FoYGZzb3NpdGNpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0NERDo6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqTkZmXnqGVmJqSl5SUkZSamJOPk52WkouRfnp8f3RrbG5jb2xocXdueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQysbGwMXHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4uLu2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmbmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3hlZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw6PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQi4uMjZKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsnBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvbi+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWlnXWlvbXh3YmJgYF1YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYGd1Z2lpdG14bF1kW1VfWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw/PT9CP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLysjGzMnNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZHRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8i8u8jHyc3Iw8jJycXFw8LBwsfHyMrHzMjHyM3GzM/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjQwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZiWllZXFhRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7q9v7m9urq0v7i1t7Ovu7y3wLe+wr/Bu7/AvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVVVU1lPU0tFOD82Ozs3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz05NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wMC3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0pSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+3vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3trq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8u7q0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYmxfW1RIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9vrvEt7a4trfAv8S8wsXFx8fKycbPwsG4r7W1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrq/wb+9tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2dhW2JQS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC4r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxbW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmFhTUhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+ts720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+QkVJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PUA+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6tbnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdWl5cWVFFRENNSUFEPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bHV6cG1oXF9fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6cnZ2d21wYF5lXVtUSjw+P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3srKytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXN3dHZxbF5iYFtdTkhBPz1IQ0ZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWTmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xci6vb62saeknqGpsa61uLaysKu0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/dm97b3VybWJcZlhcXVJOTUE+SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKx77AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLGusqmmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLavqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXF2c210aWtdW2pUXFxPTUhERkxBRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDs8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubO0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIP0hRQ01DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6efqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28t8DBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7W8vbiyrbOwr6yut7aytLSvqqSem5ycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWim6OclJCMjo+Qk5CWlZaYn56empiml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh5g3x2f3lidmxuXFBoVFBOR09MTENPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpKaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLm1p6Wsqqi1srGwrq+yp6avo6+utcG6tbeyt7aytKuytK6qq6+wsrSupZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsKOlp56gnJWTj4+RkJiQlpWYl5+Ym5mbo5mXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fYB1dX1ta3tkaFVRY01JSEdOUk1KTUc7REA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkZaXmZmdoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrGqpaqqoJqYmJiVk5aak5WVmZWal5eYoJ6cnJeboZqemqKnpZ+hoqKjnJuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOT5BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZyempSYmpqRjpKWkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruqimq6erq6msrKegoKOxrbKwtKmxr6KZnJ2eoZibm5qYmZuUlZqWmJykoaCao6CanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1pZTVFKTk9UTFJMQTc+QjY4PDc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlJmSkpyYoZ2qoqagnqehpJ+ckpyim5+ho56doJ+joKKvrqyvsay2p62xraamsK6trLCnn5+joJeRlJyhnJqYkpOfnaGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwp6uosrW3s7essbSjoJ2ln6uhoaKgn5qYlZWfm5uYpKGgnaOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pzc1OD0+P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpuhnZ6ampKYnpyioqCgnaKfn56fqaunrKmqtKurraulpaqoq6yqpaCfmpKSlJiZlpaWjIiLj5WdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe8srK0oauiqaixqaqop6eamJ2Zqaagmaegn56np6Wknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84Njc8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5mWmZ6bnKSfn52knZqdnKSipKOiqq+sp6mjoKGsr66qq6egn5+io56fnpudm5SUlZWenpiUhp2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK6nsa2xwra4wsbAyMrAyr+wubm9ucK9uLO7xcO8wrq2s6myraqytK+zrqmuo52rprWxrKKvpaCir7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppmboqSen5ubm5yHhYF7dHJra3VycGhXW1FFVEhESVBIPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56goZyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpJ2Vm5uemp6cn6Wmp52goKyxr6ekpKOhn6asp5+XnJWSmp2ZlYyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczLy9LGvr/Awr3HxsK3w8nIwsDFvbmzubq0u7ewtbKqurGuura+urqqt6yqqri6tLuurbijpqKep6Wio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGlveGplWltGSkxERFNMREJENzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZudnZ+fmpeYmJONj5aXlI+NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3MyMnRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXR08zTz9LTzMrCxcbGysfOv8jQy8bExsTAu8LAvr6+tb2zrb6/wsLGxMbDrb64sbi8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE8Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gnJmXlZOUl5KQj4yHhISJh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys7K09fR19LU1dPTyMzGzM3J0szN083ExsnJwMXLx8jIxb7Cs7PHxMvKys7Fyb+9vrzBx8TMzMjJwMO/ra+yqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/e3J1dmdiaHdpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOzk+OTo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmflKOYlp+enaSvm6Cwq6isscnN1NfPxrvHrK20uKyuo5+ko56gpKyblqmWjZeNjI2XprCupZ2enaGlop6blpWWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTSz9HD0NPW19XW0svJztDLxs3RydHV1tnV19LW2M7Syc7RzM7Qy9LPvsbGycLLy8vOz8XGxra/yb7SzMvPxcnHvsLCx87Mz9DOzMrHzbi3u6ifpqunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmrJqksLGpqLXQ1Nfa0sfGy7S2wsaytqmipaahoqu1p5qxoZaVjJCmrauclZihnZuhop+dnpuWinhpZGFfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTPz9XU1NHRzNHO09fW09XQz9LT0cnT0MfQ2NfY0NfS19nV1czOz8nM0cvOz7/FwcbFzszQ0NHIy8u/ycvF083LzsfDycbGyMvK1NPQ1M/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7Oj03NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66rqqudpq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOjtqqfnaGqqaGYlpiam52hnpmdnpR+cmZjY19fYWBfYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0crPzNPW0tHWzdDV1dHF0dTK0NTV1c3R0NjX19fLyM7DyM7Mycy/yL7HyM3Nz8rQzc7Lzs7Hys/Pys7KwcjGyczJy9HSzNPR0c/Pyr3HubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bva2JlbnBhV1xaSUZGRExXRTtAPDMzPD04Njg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw9PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snnri2tbWtpa2uvrWxwNnS19rc1s/Ny8PT0MLCsqutrqyms7G4q7O3qaOfnJaUl5uen5+elZaYlYpsX19eYWRiYGBgYWBgYV5fX15dYm1yb29zdHV2eaS+y9XR1tTT2NbOztPLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHTysvQ0dPJzdHV0tXVysDJwcXMwsfJwszCxcfKys7KzMzPzdPLxcfPzMfHysTGwMXJy8zP0MbPzs3NzM/Fx8C3ub3Cw73DubKzvrC7w8S2qpiloZmWkZWVkouUjZqRlJSPj5SCiYV4cHJrbWhgYHFoWFhoVk1HTElQUEI7RD47Njc6ODk6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ojs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfCucvV1tna29jMzc/J1tbFxLiytqqjrq24ubGywKGXjo2YlpCUkpGWl5aRjH1mYmNiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycTJycbGv8PFzs7HxcfNytHIy87NxtHSz87M1MrHys3Ox8bP0svQz8W6xL7GybzCxsjOxMLHwMbNx8PLycrPx8PDz8jGwcbHw7/AxsvLy87CysvIx8zQxMXHusfDyMjCz8C9vL+wwcrHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU8PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrQ0NLUysW6vr6wqLeqvrm5s6WSjo6WkIaDhISCfoWFgHRgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6v8O7u7q5vsjGwsPAw8fKycjKx8HFy8bIy83JxMHJycHBy9DEy8i/ucG6xce9v8XOysK/w7rJx8i6x8XEyr+9wcvGxcO+xby8v8LEy8TEu7/JwsXH0sXByL7KycbHxtDDw8bDr8TLx8PKt7+8urSprKWlmJ+YrKOgpZqjoJuUe3ZydGZpWmFubVpbWFFETEZCR0RMQ0ZSPzU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvQ0szHwsPHzc/OzdXQ1tnY2dDM1M7P0MvEuMbBtrW8scC2uqyRjJOXh3uAhYaAdnh1c3FfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbBsLa6srK0srHBvLu7ubjAwcHFvr25vb+5xMrFxcK9xsC3u8TJv8LJu7e6usXDvrzBzcLGvr21wL3DurzGusK5s7vFw8LCtr+2tb6/usvCvLW6yLq/vcvDwcXCxcjFyMXQxsLMx7LGycPOzcDFwr+9srews6eoqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc3P0snRxtbV1tjPzNDIzcjKxb3KwbK1ure6tq+RjYqMhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rAuK2wsKeqraynuLS2tLOys7q1vbG3sLSusrvCu8HEvL+6tbK6vsC4x7izu7XAwry3vcbAw7u0r7K2ur6zxLa6tay4vL3AvbC5tq62urLFvLauu7+0trTFvL7Cxb/DxMXHy8XAxsa7x8vAz8nHw8bBw7fDvr62ub7Gv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkNBREU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6ars7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLycvKy8bRz9PRz8fKxsrFxMC8z72zub25uLebjoeJint5foaGd3iBfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7m4tbCrrKeeoqqnnquss62pq6mzrbawsqiup6yyu7q2wrm6ubCrtbm7tMK5r7+wvby7tbvHucK2raqosLHAtbi8r7CnsbO0u7yrrbWlrrauurGwqrmvrbutu7i7v7+9ucK/xsLFwLzGwcfLuMXHxb/Hw8O6xMbCu8XJzMuzucK8urKIcnZ2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOzk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs/SzMTGwsXQyM/DxMfBxsbFxczDyszDxMHHwLq7u8q3tLu9tbWrkYmQkHx5foqFenuEgXhuXl1dXV1fYF9fZGNiY2NiYF9eW1taWl1aWlpaXWRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauto6eiq6msqrCjpp+qrbS2sb25r7evqK64tLS7t7O8rre5tLG7wbHBrqSooquxsrOnvKqrqKusrbSzpaitoKSvqbKlp6iupae2rLCyt7m6u7G8vb6+xL+1wcDHyLe/wMS3xMLAu7/Ew77EyMzKv77DwMCphnJzcmppXWFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwL3KucDFwLzMusPGxbq8xL25trzFuLa4u66xlYOJjYF7foB/eHR/fHN3Zl9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSeo5uXkaGjqqOin6Skp6Ssn52bpKWrsq+2t6ewrKeqtKu0ubC2tKy2uLGvurmwt6Sfo5+msaerp7mqpKanqKeyraCnpp6apKasnp+npJ+gsKysrLGzsrOwtby2u8HBsrq+w8GxubnCs8C9v7W4u72+vMLGxMLDvr/DoIN3cGxhZV9rb2BVWV9ITmhPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelJ2hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu2x7u3w8azvsW7tq+4v7uws7avooSHh4J9eXZ0cG1rampxaV9gXVxcXV9gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm56fo6Wgp56aopufqrCssbWiqaqpq6yktbittq+ssrSusrWusKqfnZ6jorKkpam4raGmpp+orKuZn5+dmZ2fpZqZo5ybna+oq6eqq6ytsLK4rri5urC2u7u6q7OyubK9tLaxsbW0v7W9v73Cwbq6vZeDenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDJycHHvLzFxdDBvMq7u8G7tcW4tcHBs8LDu6yptLm3p7GyqYuGiIB5c25wbmtjXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFhXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbl5uhlpaQnKGhqJ2bnKWloKSbn6CamK2tra+yoKWiraumobWwsbGsp66yp7mypragop6ao6GtoqGptaqio6adpaajlpidl5ibnZ+Zl52cnJusoaumoqOlrauys6q0sLKqsrizrqmvsrKyt7OtqayusbewurW5vb62s7GUhHl1ZV5lXltZVlNaVUxcUUxKRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va21uMPNycjBxrjCwcjQusPGwLa8vbbDura/wbW7v7qqprC6saexr5p9hYWAeXBxdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlZeXn5eZlJifnaGblqChqKOfnaicm5qqpq6wq5ujo7apoJ+uqLWppqassKO2r6O2oKKbmJirpqGbrLivoqGjnKGfoJOVoZSWlpuYl5aXnJWfqJ2po6Gco6qqsK2ns6uqpqyysKWqrrKxr7Cur6anp7KusbSvu7O5t62jlIF5dWReYVZZV1NSVEtNXkxQTEdITEtFPEA+PEI8Ozc1NTMzOTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy1ucKxvri8rp2np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcSxv7+5wMG6v7+5uby3p6awu6aooaSJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5KUk5uYnJaWm6Ccn5Wgn6Wko6WmnpyfpJ+qr6afoqS1p6ChoqezoaWnpK6ksKyrtJ6gnZSUqaGhlKyxsJ6io52emJuTi6GUkZOXmJKXl5iWnaabpqGimaSkpKukpLCmpaKqq6ylqK6urquoqamzpaarrrOxrru1sK+un5J5dnJlYVxaXVhOTFFHUmFNVlBPSk1PRUJEPzk9Njk6NzU0NTk5Ozk4ODc8ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKatt7u8wcW6sbm2xcrLwcTHx8m4yMa1xcLIrrq8wrzCwMG9vLe6tqWnsbWdooqYiIB3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWVtXVVhXVFRXVVNUU1VgYF9gYV9gYWNkaYGUk4mRjpOSk5yUlZakmaCWnJ+koaylo6Oio6GbqqqlmZ6lsKmfn5ykqp2noZ2rq6mora2ioaGUl6KanI+qqLCbn6KfnpeYk4qeko2SkpWPmJiTm6CinKSgoZWgoaOkm6KqpKKkqqKrraWtsammpaamtaaqqK2ztbS5uq+prJ6LcnBvYFtXVlVSRlFPSFpcT1JKVEtTTEVHSUM4Ozs9PDg2NjY6OTs6Ojc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njo4NTk4OTg6OzlAOXu1tK20u7KwrLKtnaenr7m5s7/IurbAr8bJzrzCy83Jt8vAtMDHzLC1vMe7wcfDvb62urWkqq+unZmHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5fX19fYmRtjo+EkYaPkY6Zk5SSnJqinJugp6iqp6qlqKSimKSupJSZpa+pn5uYmqCerpmbqbKfpKafo6OglJOblpWRqKmsmpygoaCalJCMmY6LkIySjJaUkJ2hoKKcm6KVm6CioJehqKKiqKugq6+krbeloqOirK2pqKuvs7iyvbWzq6+Yg3JyaFtYWVNVUkVZTFFcWU1UTlBMUVJJTklCPD8/QT89NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDAtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqKevrZupqKy3tqy7yru2v6zMx8a5ws/QybXGvrq+xsu0sL3EvMLEw7zAsrmvpaqvq56XhoF3eG9uaW5ubnFnaGlnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOT1FZWlpaXVxcXl9gZH6NgYt/i5CKko2XkZaZoqCbn6qqpq2qpq+ip5mfrKCUlaSop52Xj46Zna6Wl6apmJ6ck6WgnZGQkpKSlaeqpJmZmZ2dlo6Mi5OGiI2DkIqRlJCgnaCjl5WflZqgoZ2Sm6Wlp6iooLGwprG8pp+jrLWrraewtLC5tb+xrbGrkHxwcmJWVFVOUklHVlBTUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo6ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqWisKudqqepsrCktsa0ubqzy8a6vMPL0cy0ubq+wMTHtbS2vLK6u8O+wbCzrbCusKuboohraG1vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CJmImUk5iamJ2om5+qpKSrnKaYoKWbko+eopqXloSDkZqjj5OinJWVloehmpqTi46Kj5mjp5yVlZebkJKHlI6MgIuNgJCKkZKRoJmfoZWTmJiUoaSYjJmkpqemoJ+0sqeyt6Ccoresqq2ksrKmtby1q6uxo4h4cm1dTlBRTE9ETk5OUExGTk5LSk5OUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOyrrairLXDurquqqu0r6+fl6d9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnCEiIKHgJGDjoqUkJOdoY6am6KgopeklqGblYyHmJqMc42CfYyWloWQmZCTjY56mY6bi4KJf4mYn6KekJOYloSOgZN+fnOJjnqQhpKQkJyamZmQlY+djaKijYmaoKGjo5uitK+sr6yfmKW4pqWwobGunLC7qqmvqpmBdnJiVkxRT1BNQ1NOTFFNQ1BQSElOU01ISkpESkxFSko8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ4ODk6OjY1Ojg3QTd3t6KjtKilpaijpqWmpaazp6W0wbiwtLDKxrm6ws/Hv7SvvcOvsceyraeslaOtv7ewr5+nrKyqlpSicldWYGhnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJsf4V8dE5Yco+Cl4aNnJeKk5Cel5yVlJWTjpaIf5OJXztXb3uKk4l/i5GMj4WGcoqEloF4gnqFk52Ug5WOkY+ChnySeHFvhY1+iYCQjY+XmZiTio+InIeel4aHlp6aoKCXp6+oramonpattKKmrZmsq5ins6GpraOSfHFtX1pOU1FWTERUSlBNTUZPT0pFTFFNS09KSU1PRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODQ0ODc5PDo3OTs4NkE5eLegoq2hpqapoKeop6KpsKintMK5sbWwycO5tL/PwLqxsbjEq67JrqeinYWaorqtpqeVpaSjoJaOlmlQTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STktIRkhOUVFNUFJUVlhaYG1vaXqCdFBCQH+VkZF9iZSMhIqNmoyWlYqSh4WVhXiIf2BKUW54ipGEfISMiYR+f25+f5N3dXZ4hI2ZcFGNiIqHe354lHZnd4WIfoqIlYqNkJGWi4OJh5SEmouBhJKblp6clKSjp6mlo56bsauhpKSRpqqWoamcoqaoh3NrZV1bSFFRU01JVU1TSUxMUElHRktOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXa2nKKmnZ+hrqGnqKWmp6+sqra8tri2s8K8t6i7ybm3qaq3uK22wKqim5KCj5mxn6GZjJ+WmJSRioxlTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgHuFjJKAkZmLj3uGj391f3hzbnVwdI2NgXl9iaqEeXpodnuOcHJteICKjJJ4eoB7gHZycZJ4Z3WEg4SEepWJiIqMioB/g4qMf5ODeoCPmJSblZGfnaien5+doKmln52Yjaikk6CflZ6epH9xZmBcXEpWT1FHS1hST0pNTVNKSkpNUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLi8yMDAvLSsoKCkuMTI2MjE5ODc5ODc3Njo8PDd2rpijoZicnrSpr6mlrKuwsaq9tLK8uLa7tbOguLuzq52fraustbOlnpaRmIaTpJacjIKWiI+JhoaDZkpJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhZWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gHZ4f4mPfISYkoFyho97dnpva36tfHOQin97hpKAfX90ZnZ8hWxvZ3N8iYyHgGx5cX1wbXWPcmhxgH2OcEOKhIKDhH93d3qKhH2LenR+jpKPmIqSm5ujl5mdmp2eop2WjYulm4+dl46WmI51bWtlYVlXWFRRSlNWVE9QT1FXS05LT09KUU9JT09LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKawrK6rp6mwr7GsvLisu765tK6pm7GorZyQl56nrKekm52Th5Z9jpWRlIB7inqEgH5+gGVKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFdZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3dvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZZ/SZKYbmh3foJsaWNseYWQkoZrc2x8bnJ7hWltcH5zjIiDhXp9fnp2b3R0hYF5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5KKko2GkJZ9bGhtbm1XVVdUUlFZT1NVVVRZVk1OSE5LTk5LQ0lOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6krbCiraqota+urLS/q7zCv6ajmpWlmJ+OhYyWoqSbm5SWj3aRfYSLkI98eH50fXd0d3xmT0VHREA8Pj5BRkdHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5vbX96i4h1gYiGdGyZkXNzfGprnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3tncHB7bpKNjntzfX1xcG51bYJ+d3l0anmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdjV1FZV1hZXE5QVldaWU9JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKiwsKyspKCsnKSwsMjI2LSs1Nzc1NDc4aU84OzVukoiZkZqWpKiunrKeprquq7KwwrK7w8ebl4+UmYuOhnqFkZqWj5KOkopziYR3i4+Mf3Z3dXh2b3hzaVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bHGDgYWBeYOGhnlxn5RzeIBzdZSHNXGdqJ2OoaGEooR2cIZ7hntzjK2NiIBoZmJpbXFtb4J1aW9YdW+NmpF2bH97fG1ybnB/enN1bWJ2hH+GgIaRkYqLipKLkYyLj4N2eYuPgH6DgH2OeHBubmpeWltdW1lYYWBTT1xbWVhMSEpGSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qK2wrsGzusHGl5CMlJCBiX1ugpGTioSLiZCId4SFbpeKjH95e3txe3R8a29eSlBHPkA3NDU4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8+koOprl9ITE1OUEw3Q01SU0RKhnaAfHx2fmx3h4d8fYWCf4x+daGZeX6GgISZhZucYYaqn52LgpCNenaIfomHjnOKl4+De1xkcXR6e3eKbWdpYXluhY+Cem6Bd3OEenFzeXdrbmldd4d9h3yIiI+Ai5OXg42GjYd9cYWAhHx1d3t8h3RtcXJkZV5aWl1TW2deWFFWWV1XR0tLRUxHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQxMDQ2NDY2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgqp+wqa/AsbvFupaPkZSIeoZ2a4CMkoN+i4WQjXmEgnSihY1/f4OAc4OBfWx5bFNYTEFFMzExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxyfI+LenyIhn6Xh3ehmYiGj5KUpY2sqUiGra+vioCAk4qBi4GEkaiHgJiYipxzbHyBhod9jmhnZ3h+bYWGgYVxhIVHa4B4cXl2aG1rX3d9g4h/iIWMepWenIqLiZJ/e3WLdnx4bW93fn1xcXBqWlxbWmNjV2dmXVZQUVhaUURMTEdPSURGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6CdrKCnua+zvbSXjZKLmIt9dHF/ipN/fo2DlJV9h3+GpYeJgIOIhnmIioB1hXlfY1ZMQzYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2VcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiJCAmpaCoKCXlZuapa2Tmbuxp7vIw6eKjKGkjpOJgJB7coOen5GcfnaFhYuPh5BpaG+DgHSMhoSLcYeCdoeAe3aFfW52dWeBlI+GiYmIiYiiq6OWiY+YgHuCint6b2dreX53e3BpY1xZWVxpXWFnYFtQTU5ZU1JJUUtETkdDS0RCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGRj4uamqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWf4uBkpuOhICCjIuCiY6FgIqAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVFJSUtMS05WYGN/Z2dtdZ2bj5qTk4uOj5qIk4+di6ChkqOppKOsk6i2oqfBwq7Hr3i6lJp8jKGemYSShIKPoZ6TmZKEioWPmJCVbG91iYuBlYyNj3eQhHFshYGKl5KDhYhyiaGXh5OKj5CXpbapm42WooOHk4V+gGtqa31+fX9xX1tiXllmalxsbF9ZTEhQU1FOTk1HSVFERE5GQUNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuaFlwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafoWUknqAkYmSkn2LhZmSkYOAgYuOiYaSiISJhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFRU1FOUElFRT47PDpDRj8+PDc1MjxAUjVISEhMTE1OUl5vinxzgX2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZervqu2yMm3yNHPvpugcGmqqJ+Ek5GFnKCampmnkZGIlaGZmnd6fpSYkaGSl5eBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ6RmqiIl5COgolsc3N8fHluZl5bX19hZ2NgZ2ddUkVLS1FPSkpNR0dNQ0hNRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl9QcXVgbn1hd459fJSOjoqfkpeelZyqmJ6qQkR9h4mImY55go2Ljo18ioaQkY+Cg4GJjIqFk4WChomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSVFVTTlNMRUVAPD49RkhAQUA4NjYyPDk8RkhHSUpOT1FZbYaQd5WLo6eqtb24pa6srKiptKywt7Kyrbuxs76cs8Osu8nLuMO/t6WjsLKsrKqjipaYhaWmoKKYgqaZjaKqp6SHhZOjoKCqoaSpjpywi5Wkp7i7nKGjsJOjnaOekaSirLCts7WjlaariZqKk4uVent+g3tlXmZaY2BdYmNeZmdgW1BESkhUT0ZITEdLSEZHSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo1NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoKThYiCnIOSkYyS2sidlnNWl4iPiJyPfYaMj4uKe4mDh5GOg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJTVVVXVU1cUUdHRDw+PkZIQ0RAODs8NUM7PUZLSkdIUk9QV4GToISuo7OqssHHxKuzxbats8CzuL62v7XBtru7pLjGqbbJx7a+ubSoo7StsLCbmZKan4mnr6qklXefpJehq7GymJapraiutbuyuqyvtaKxrLK1vLi1rrWgp6ijqJupsK6zure5qJy4qo2lj5KUoIZ6gYByWF9iVWRgYGFfX2ZgXFVKREVMVlJJSktFS0hFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjU5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFjZFd6dXGBlH2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYiFgo6AgYmPhn+GiIWKh5F6eW9dV0BFTjw2OjQ2QUI3NjQvLzdDSENRXE9RVVhVXFdPX1VJS0pBQD5HS0ZGRDs+QDdENz9CSktFRldUUF6PpK2ksrTDtrjBzMq3vMS9s7TCuLjCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqwoKKWm6KSpbGtpa2sp6SYoKyzuaGosbm1u77Mv8XFvbyzwri6uL+4u7i6ra2xprGqrr6xvbzCwq2Zu6mVro+YmauJfoB5aFVhX1ZoY2llVltkWldVSkhHTVJIRElLQUlEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OjY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Eb3tyeIhiuaGao4mVlJaTlJONj5eSh4d7h4GNlYqBhIGKenyLiIZ8ioKBi4SVfXh6dWZQXGRHRUw6UWRgW15TRj87SFBFW2NRUVlZWmdaU2BhTVNPRUE/SUpIRUZBQEM8RDZCP0hHSkxUWlRelK+4tbu5ycC7vcrNvL3BvLi2vLy3vrW6ssZgdbKlsZqeq76qpairqqSis7Wgq6eelZaemJ+upaenpZ6jlKKnsLOnsrK8tsG908nJ08bCxczCysPBvr6/vL24tbC5t7fDusa+xMmxnrqroqyPpqm3ioB8b1xeXlxVYF1oZlNZYldTV0pGRk5LQT5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUFBRUlFKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGQjYaQc2xycnOI1cC2mqCNlZmZkY+XkpaWjoaIfYeDjJaKf4KAgnl7i4SHe4t5gYqCl390fXpsZnB2WV1cUGVlYmBlZF1bWFhcTmRtVVJtbl9vX1hnZVVZVEpEQktLSEZISEhIQkk5REBIS1RUVl1aW5O5wLm+uMbBu7nKy7u3ura4ubS4tbWut7eZZHWpnq1wXqKtnZihopuknqullJ+fkJSOlpiYqJ6mn5+amYOjnaykqrCst7C8uNTQztbPycvRzM/OysfAwMLKvsG9wcHFxMbKwMnPtKS8sbWwnKy5vZp9d2lbXFlXW19YYWJRXGFUUkxEQkZIRjxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBwl5ORlG5sb3R1h7OsoaGfi5mcmY2NlpGbkoWKin+JhoyQjIl8gYNze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWhgZmlpbVpudJetpL2Ih2dbb2hdWllUSEtPUEpLUExTUUhMQUpGS1BfX2JnamKYuMewurS7vraxxce2sLmxsbuts7KorLitjbaonpynmk6bno2PoJaRp5illYqTk4iRiZCRkp2boZiblZaHnpmmmqyvqK+ns7PU1NTW0cvP09TO08/MxcLK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8WifmxhWVpbVl5WWWRaUF1YT1JDQ0lGREo7QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYJocnB5eYOhqp6ml4ybm5iLjpWRmo59iYuGjoqKi5CIfIWCcH+HgoZ7h3KDkouPfnF5dWxxeH9ye254c2xpgHBtY2lucHlpeH1+y7/D36duY3huZFthYEtQUlVOWV5QXV1NUU5UUVVUXG5ud4Nyl664rLWosLarrb3Bsqu1pqW5p6yvoqy0pI+xrpuYmIyRlJKFj5uBjaeSnImDi4SKiYSLhJSVl5eUm5CcmJmZnp2rrKSnoqysztLV0c3L0tPT0NTRzsjD1NHIztLT09bN0tHF0tbGwc/IyMOpv7jQnHZrYlpfW1VeUVxaUFBVUU9JPkFHQkNGPUFCP0ZFPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkY+MioiRh3+De3J+gIKHeoV2hZORiYBvd3Nsc3x8d3xzgnhxa4Bycmlwcnp5cnu+y5t/jbKEdnKFd2lhaV1EWlpbV2ZkWGVrVFhdXWFjXmN4e3+MgpmqpKSioKGppqqyuqumtKOirqKkrqOnsqCJppuVk5GKko+JgpSJa5WjjZmEgYZ+kYODlJeti5WOlZqOhZKQnZenr6GgoKWkqMjNz8fCy9DT0dTSztPNxtbTzdTY1tbY1dfVytXazcrY1tHLrcTDzIdva19dXFZSV1JbUEpISkpLQDs6PEVDRT1DRD5IQz9DQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lxgHZ+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYmIi4l/hHlze32Dh3eAe4eRl4GEb3hxbnWAdnh9dIZ8eWyHdnVufXaEdXl8nraNPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhrbmlugYOJkoyen6CekZeZoKOkp7OlpLKgoqWfoqmio7Kch5+SkpORi4+Lh4SPhH6cnIyNgoSFepR/gqqWo4ySi5iTi32XipqRqrOYmpynnKa9w8W4tsXN0dDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR0c2phWVZQU1BYVUVHS0pGRj46NzpAQkM6R0VARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qj48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6Lf4eSg4mGhYqCiH14hZeXiY+DiIaHe4V5cXt7hIV1eoWOjZ56jXB9cHB6gHJ7gXKEh4Bujnp1d319g3WAfYeJsHRZqsK3jZKBcG5jPV5ocnFxcG53d4JmaW9ydXlyeouHj5SSm5agloiMk5yfm5+roKGsnKKamqCmn6CsmoyajZGTjoV9iIiDhYuOoJmUiIOHfmyZeoSZh4iTjI6VjIZ7m4iTj66rk5WXnpimrrW8qK29xsvIycvLz8nD0srU19jX2NfU29fT2dvWz9va0tbJ1cySdHdlZFhXTlFSXEdDRklJP0I+PTg6PkA7Pkk9QEJBQkVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw1TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEE8OjlEPkNHUmtfbWRiZmx2gIhxkZCbgHmAjn6DgYKFf4R8fYSYjoeMf4aHgXeDeW97e4eCdHqSno6hdpB2g3R1gX50gIRvgZCCb5KFdX2ChXp3h3yJuMalw8q4gpacj3hwZk5lY4J6gneFoZGLeXl3e4SAfIR2bZSWlZaQmJGDiY+XmpeXpp2YoJefk5OYo56brJaRkIuOk4OMhYmJgoaQkZ6cmoiFjIGGmHuIiZ+Xj4mOi4uCfKCIkIq8oJiTl5mcqKalrZ6ntb+/v7jHyc3OxM3K0dXV1NnV19vU19na29fb2tnYztvGgnV1Y2VhXVJVVVRNS0RORDs9PTw5Ojw/OT5BNj4/QD0/Pj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs5OzdJUFxaUlVYTDlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eop8foB/gH6Ge36CkYqFhnqFiHx2fnVtfX2HfnR/kp6RoIOSfIZ+eI9+eYuKb4ObgXSZh36CioV8fpF7kKmPkMOgvY2cpJx+ioV9iXOMi4BzppqcmJSFe4+RiYRpR3ChpJ6MjJGShYiLkZOVj52bk5SRl42Mlp+dlKGVko6OkYx+kI+Oi4SJkpaZn5+IjJSRnZCDjH+mmYiFjoOGhICkhYqLt5edkZSVoaagnZ2do662ubSrwMbK0MfHzM/T0tLY0tXXwNfY2dvY2trZ2dfctnR0c2ZmYlRdWVJPTkhETEM+PT45OTs6Ojo8PTZBPj89PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdPPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlZYZm1tbWmBjopxc3iKe3uAfH98iHt9fIuHgn51g4Z6c3p0bYF+hX53hpuhm56Uk4CMiH+Yh4Cckm6IqYV7oYx9kY6DiYWdf5uRio2jop+RpK+gi5GLhYuBk4ZXcq2Ln6uckIOZnJCQjluCopGCjZ+TlYyHiIySkoyUlZWQjI+KiJacnY+Wl5KMk5SGgIyJko6Lip2XmKOjhpOdlaCKioiOnJCDiY+Ag4eFpISLkLKYnJKUl6GgnpmSm52nsrispb3Cx83Hxs/Lz8zO1tDR1K3W1dja2Nra19bZ2ZxreHBjY1lZVVFVV0NASUQ/Pz86NDg6Ozc6PDs0PDw/PT43Ozo6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs4ODs8QDtCUUtLU1lQVGNieW1ifpGDb254i3l6f3uBfYd8fHeGhYBzcIWCe3V3dnSEgoV9f5Kmop+mopeKnZCUl4uKqJdyirONhKiShJmUhZqNo5agmJOJm56ik6mwn5GVkY6OiJaMb423hJrEyLKdoqadnJiWkbKQZKTNx5WOhoeJkJKNjZOVioWKioaWmpyPkZWTh5WYhICQjJmJjpCrl5eko4iZnpWaiY+Hl5eKhY+NgX+Hj6SIjZOompeTlpihmJ6Zk5yborK0paO9wb7HxcXIyMnCytLNzdSo0tHW1tbY2tTT2s5/bnpkX1taW0xIVFpCQkhEO0I+ODM3PDw6OT42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFNXU1JCY4JHdoGOfXxtfoh5e357goKDf3d3gIN8bW6Lf3t9eHh8hIeKfouis6ejqrOil6egpaSWla6ig5G4lZKzmo2ioYylnLCjpJ2ZkaeWqZqsr6SYlZaVkIuYmpehwI6jybirnKOmrpiSm52ynYWGqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIyUk4eUmIaEkpCcdZKZs5aXpaGHnJmSj4qRipebiYuXjoZ+jJieiZCQm5qak5iXn5OgnZSem6CxrqKkuL60xcfEvcPDwMbNysnSps7N1NLQ1tjT0Ni5bnVxWV1SXVVOR0lORUFDRTU+Ozc3Oj88PDc9NDM2Njk3NzQ+NTs1PEs8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg0Njc9OkpGREdOWlxZSmZgO0mEi3p6boWGen2EeIGGgX5weH1+fW9zjXp+gnx4houJhoSSprusqLG9r6Wts7OppKKwrIqatZ2juaaVraWWqq24p6SjoJqpmKqkrrCqmpmclJaRl6CYmru7rsqhare4q7CVmZ6jrJOXvqNeqrKDioqNlIeRfI6OfYOGjpCUlYiIk5aMkJWNi42XmZOdmbSXlaudipyUkY2QkoyZm4uTnpCLipafoYyUjZeZnZKbmJ6UoaCUnJ2lrqihpLS4rMLIxbW6vbzFx8jC0aDGys3NxdfW0cvUnmx2ZFlXUFtQTkVDPz1DQkI4QDg4NT9HPTw2PDM1MzQ1NDU0QjQ5OkJMOkI7QUhDOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicElAi4p+gXOGh32CiHWDioJ/bn19fX9wd4d3joKHfI2PjIaMmarCwK+9xruztMC9ta2rs7aMqLKurb2rm7ulqK25uaunpqKipKOqr7Kxqp6cpJmbmJifo6alkqO6r6m/vK2usrmlpah+iIecrb2wg4yMi5CDjoORj3qBiJCNjpyIiI+XjYuVl5SRmpadqJqxmpGsnI6aj5KOlJCQlpePkqCSiZWbo6yUlo+UnJ2SoJ2bmJ+gk5qepqWkoqOwsqbBxsOwsLu3xcPDv82mx8THxL3W0c3FyoVvb15ZV1xZTEpCS0FGSD9BQEM7OjU+QT4+NTw3PTMzMzI0MUExN0BCTT5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OjVCPjc5VktEV09GOD00S0BDPjRFS0hOPkJBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVONzlHRD9DRlxlRmBpZ1pdXZOMjIl7h4yHg4x1h5GKgW9+e4J/cX6BepV6kpSUmJCTlqezxsm/wczCw7nHvbuvq7q7mLO3urLArqbApKuwu72qrqujo56nq661sKmboKqcoZyWn7C1p4yju7q2wbysqZ20paWplIWOqsTDpIKLj4eIhIaVlI16g42Rj5GhjIyUko6Jl5+Yk5mVl6agr5yMq5yNlo+RkZWVjpGVkpChlIeXn6GznpSZk5+gl6Semp+bn5SYnqWjpqakr62lwMTDrqi3tsnDvbbPssS/xLyz0crIwrRwdWlZVVlnUEtIQ01LTEpBQj5ERTw1QUU8OzM9OUIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGVUYmqZjZaKi4iTkIaJeYeUkIFygHuNf3iHgoKQeY2hlqiZmpm6vcfIycHSycrCzb3Cs628vqe6wL27xLeswamss7y/qrCqpKWkrK6zrba1oKCvn6WimaO0vamcqb3Co7a3r6yUsqysrZeHmqqmpZGCjJOlloqBdYqSeYWOkpCdn5OPlIuPjZSjmZeclJSjnqqekaWajI+Pj5WWiHyPlpOTo5uVoKKctaWQnpako6GlnZ2lmJ2Vl5uko6mnorKsqLvAxK+ls7fMv7mvxLO7vsK5rcLDwsCXaHVeVlRYWElKTElGRERJRENCREw6NERJOjs0PThFLjEyMjQyQjI2U0hPPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGFaY2NWno+djpeOnpKJin+KoJOEeIV/lX9/kIiKkYCWoZmtp6SYwr3Hw8fF087Ozcu8wriwury0vcu7w8K2tryts7+5va6vqKCpqLauramyt5qeraKnoZ6rt7iqpa+/xbG9urOoq7e0r6+XlqWsqKCRjpOyxaeWjnySlXyHkpmPqZiXk5OPkpWTpZ2TnZmToaOinJifmIuMj46diFqQl5eSl6SZZZiin7KllaGVqqupppqeppeYlpiUoKOopZ62q6m5u8O0pbS2y8C4qrarsru4rqi4ur23f2dqV1RSU01FSlJNSz9CSEVFSUhHOTZGTTs+Nz5BSi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M+NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKer76voca8xMTGxs7OztLKv7u2sru7u77PtcS+ubm3s7G1s7izq6ecq6y5qqinr6+YpK+kp6SltcCwrKy0v8O5wLq0qLq3ubSwlqWtr66ki5OVoY10wpp9l5qEjpeZjLCVmpqVkpKZmaWjlaCalpqpnZugoJmKjY+VnGBKlpyblZqlllSWr5+vnJ6jlK6tqqSZoKWTk5iYjZufp6KZtKiqs7u7u6uwssi/uKasq62ysqOhsrK0pG1qYllXTU9KRE9QUFI7SEtJSEpDRD46S1U/QTo9RU0wNzU0NDpCNDRNV087SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUrQzUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4uolo6Ik4Wgh4Sdl4+doJujpLTJtanFucLEyMrJyMzNx7+7s665ucHBzLXIusK5tbqwr6+ztaajm6q0taqppq2smqWupaSorLq/qKy2t7/CwL65s7PFs7q+raSvtay5poibmKabdr+fhJmejpOamoyul6Gcm5eUmp+gqJ6on5maqpqhp56YkI2RnYNudpKimpWdop2RrrKjq5SnqZeqrKOinqSnkpGZnIeUnKKdlrGmqau5tr2ysq6+ubago6eopaacm62pqYtfYl5dT0pLRkdNSlZNPU5GT0tNQkREPFFWPUFBQkRPMTg9NzY/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5WboZ+7r5mUoIyTq5yRkpOJq42GoZ6Mo6yUo6S2xr60wLnCwsfJxcLNyMK+ubKvurXBwsm1xrLCvLW6qqitrbCio5iqtLumqaarqp2pr6ejqqu9u6isvbW4vse8t7a5wrO/wbWqtresvqWPo5iSoqC9n4maoZmXn56Pt5+pnKWim5yhmqiks6CbnaacqKqemJWQlJuLlomMpKGUnaKdoLSvpaWSr6qZqqmcnKKiqJCUlJ+Cj56em5WppKGhs7S6tK2otrKynp2jpZuXlJiqoZ51XFldXEhHRUZMUElORUdIQ1NMSkJFR0FXU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlEQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8oOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OdcGJHRaeXo5+ew62cl6WYmqqcl5uaj6qWlaemla2smaKrtsTDvL62wcLAx8O/zMW7vbmysLmzv8LHtb+wvLe5tqWkq6utoKGZqqrEoqSpq6WerK+roqmpvrenrb+yubfHtrW5ucCzwMO4trO0sL2jl6OXlJyUrp+QoqOlo6OgkL2lqZ2pq5ycoZulnr2imaOfoqmsoZ2Xjpaek56Hj4SNk5+koJ61rKaclbCmma6lnJmonJ+MmJSeg46gmZuSpaSamKuxtbGqpaqtrJyYoKCSjpCVqJ6UZV9XX1xNSEdJTkxIRkRJQj5RSUE8R0lJXFJPSz1JT1U1QkY5PkdHNUNhWktCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTU/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1RRjxLeGVhVkuimqOcnsWsoZ+sn56uoJOjn5aloKaprJi2saOqs7bFxL2/tcDCu8jBvsnHtri1tLGztLfBxba+sbi1uLSfpqyqrJ2enqWkwaWfqa2fpKqtr6KmqLy1prG9ube2xLK0uLvAtMXCubmvs7W1o52llZKUoa6fmaKeqaiso5rCrKmerK6bm56ZpaC9oZ2kmKurrKahmo2an5KeiY5Xf5afpaGguKqmk5i0op6wn52ZrZWdjpiTnIGOn5eVjaGjlpClrbGrqaGipaSVlZ2Yio6RkqSeiF5hWGJfS0hKSk5GRUFHSz8+S0I6OUpLTl1RUUk9TFdcOUZJPURNSDhIYltLQ0xQU1lZVldPWl5JQT1XUUpMP0g/NUhMWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNba1dxR0U2PXVlXEtNnp6hmZ/EqKahtKKds6iUq6WgpJ+tqaydu7CorLaxx8XBwrLDw73Gw7zEybyvsLatsLSvvsO0ubKwurSsmaixqaqanaWhp8Gtm6ywm6qjrrGppKi8tqe3u76wt8Sts7PDwLTItLy4rLS2raqippaVlaOsoZ+gm6ersK+vu7GmoKmompmYk6KjuKCho5KwsKylpp+Top6Vno+QjZWem6Kep7SnpoyXspuirZmcmquPnZKVkpl/kaCVjo2foJSLpauvpaahnKCdkZGak4WKkY2bnX5fZFlmZUlITElTQUNASUg7O0c/OTlPTlZeUlNKP1BeXT1IUEJMTEk5TmNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKyZWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF1lcEA4O0iWd2VBNJ6jn5ugw6mkqrOipLWqlrOtp6KksqyuqbuyrbG1tMbAxMK0wMS9ycS1v8fBtKu1qK+4rL/Ds7ivrba5pZiqsqurmJ+ml627tJuosJqtoK20sqerubKourS5s7nAqreyxL62x6jAr663tamnrKGYl5KmpaKimJmlr7iusrW2oJ+ppJqUlpSkoLeipaWWsLKyp6umop+ampuVl6ifoJihnq+yoqaNlq2YpKqWl5yij5qMkpaYhZWek4uQm52TiqioqqKmoJmdlYuOmY+BhZSIk553YWdbamlMT01OVD1DQU5DOzpJQDc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMjM4MDZwW2JIMDRJb2dVQ1dGjHlmQzujo52hpsCnqK+xoqq1q566saykq7S2sbC5t7C3uLjFvcPHvb3EwsW/uMDFwLmptqSsu63Awbe3qq2xuqGTrbGtspakp5GquaqfprGcq6CvtLOrqbW2rbyttLO5t6y4scO7wMCnxKuxt6+pq6unnpiZq6GioZGYobGvs6ywuZqbqZ+al5OYp6C2qaajorGxtKyzqK2gnKCgm56lnKKXnaOzr5ufkJOkmZ+nmZOhnZOXiJOWkpWWnJKIkJqYlI6oqKafopuYm5KFjZmKfYuVhI2ZaGZrYGxtV1BRW1VBQkVUQDw7SUE4OlhQZF5QV1dFWV9eTk1STl5LSj5ZY15PSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERUJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEtLS4sMT0qJys9XHA9PjEuMGRaYz8xNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M+p5+doqq9oqqwrKSyuaqmtrWsoa21va+zuLu7vre2wMK/ycS5xMO/v7fDvMC2rrWmq7exu72+tKmusbaelquup66XpqiOp7ufpKyznqyisbCzrKm1tLW9rrGytaywtLPBu8a3rL2wsbisraqjsqaepaqgpJeQmp+zqrOrq7Oanaecm5aOoaaktK6ooa2urrGotK2zqqScn6iknpWimZuotamXmZGRnZmdn52PqZyVl4SUloqdmJuTio2WlpqWpqWjoJyWlZaSf4+UhXqOkoKLlGRqcWZvcV5GWWdWRENNV0RbOUhDNj5dUWhcTlpdR1teXk9OUlhkSkpCXGJfUUxNT1hXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfXl9UMTUwPWBWXjgqQzNZVVxnSzaMemZMQKSaoaWtt6Ssqqavrreqr7a8qKext8a3sba9wcO1tbrEvszGucPAub65w7fAuLGzq6m6trq5vrSprbC1l5inrKmsm6urjqu+nautsaOroLGts66ttbK4uKqur7Gota+1u7zKs6q3trG0r66mobSgm6mtoKaWlpuasqOuoaavl6GkmpqTjqOmqLOqoqezrau2pa+ytq+jmZ2sp5qXn5uZq7eil5OQjpicoJeWkqmdmpJ/kZeMnJuYlpCKlJKemaShoqCYlpKSlXqLj4V6jIqCipFqbXdsdHthRmFrWUlHWlo9e0pGRDZBYlRpW01cYktcXVtSU1JiYExLRV9gX1FMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYoKDkuJDpLNS4iVV9UXy81KENfUVwuKkEvSkdQW0czY1lVS0SZl6GyqbKqraakr662qri2uqWstLfKu7S7ur+/tbO3w8DMyLzDvLa9v7+3vruwu62mubm2tcK2qq2wt5SWp66rqaOwqZSvuqSssbOnqKOytLGysLSxt7Opr6yyp7evt7TExreptressa2pp6O2oKCosqGllZyalbKeqJygqo6po56blpimpqW4qKOytayosqiusrarpJmgq6ibnJ6clKm4nJSOjoqXm6GXj5akn5uUgpCUj5yal5aViJaPl5qnnKSfkZeRkJV2g4+He4SBg4uKbG92dHt+XExmbVtLTmNcPmJ7R0k4R2dXZlxMXmNNWVlXVVhUaV1PT0hgXF5QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2UyNydHYkxWJSxBLj1FTFE8M3JrSUNDkZmlr6Wur6uopbGztKu4srihrLW5ybmuwbvDuLOxtcLCzsXAwb20vb++ur68ssOnqLiwtbW/vK6rsrGboKexraamr6WdsrWtqrGxrKmotbuttLK0rbOtqqyorKm4rbKwyMG5pbqxqa2tpaiusaalpK+kqZyenZuwmqOjo6ORrZ+koKCiq6anuqWstramq6yprbG2rqOeo6iqm6Cbm5Kjs5mPiY2GkKGflIyTm56RkYOMkpKcmZeVlIeXkpWZp5ugnoyTkY6Qd32NhXx7fIaIiHBycX18fFxTZG9dTlhlXEZElltHO05tWGJcTWBiTlZXVldUWGddUVJMY1laVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISio6Rz4zQkhTLD6QaztHSI+cqqyjqrGkqaW0tbK1trKyoqyuvcy6rsC6x7G0rbTCw9HFxr7Asr7Awru+t7vEpqu2q7K2vMCvq7Gsn6OnramppbCjqrKqr6ywr7CurLS9p7awsqmyqaulpaOtuq2qssO6tq27qamorKmnsaWqpaOvqqiin5yjrZWlnpiemaydoqepoq2mpK6suLOyoqqjoKuvsayen6anqZmkmZmPn6aYh4SOiYudoI6Ki5SajY2EhY+UnpyUl5WGlpSTl6ScnZuLkpCOiX5+h4V8dn6Fg4RycXCHdGxfWmBtYVFycFxLPIV8Rj9YdFhhWk5kXE5WVlVXUVxhXlNPTmdYVlZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnRUY2O0IvNEVLWDJAlVk9TEWWmK2poquznKqqsbetubevrKarq73JvLC9tsKvsauzw8POz8O/v7TAwcO5v7PHw6qutq2yuL++saytq6SnqrCoqKmxpbSuqrGurrKxtK61vaS3s6ysrqiroKOesLerqq26t6W3tqSqp6yrqq2hqaensrKkp6ahoayXqqGVm6CmnqWiqqSto6CnsbiurqSmo5uqrK2qnaKko6SYoJuWj5eck4KDj4iFm6CLiY2Kl42OiYKLl6KakJCbjJOSkZOjmpuaiY+Li3yGgIGDenN/gn98cnWLpId4a19gbGVXZIZjTj9nk0xFYnlXY1lSZVVOVlVWVE9cXWFVS01oVlVWSUpISU9CR0lTUVlvQU5YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZZLjBKZ0FBOztCKzpKT140RIc9R0ZEl5OwpqOrsZirqq62rLezrKasqqm8wMC3uLK8taaysMPJy9HAwLu5v77BucG5wMOssbSxs7rAvrKwrqyrq6i2qqeur6q5sKiysq+zrberubimtLerrKSpqp2knrOzqaiktLSgt66gqqiqqKunoKusqbm2qqqqqqKqoK2ckqqhnaCloqajqp+dqLWvqaaro6SZpainqpyio6OfmZmgkI2PmI1+h4yHg52dhoOIiY2MjouChZWhmY2NmpCSkY+Tn5eZloyLg391h4F/f3h0gn54dn2Ah52Pb3FnZm93XF9yiGpPXplWSG55VWVXUWNQTVZUVVBPWFpiVUhPaVRVU0dPWFVJPklIT1FQeExOVz08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzFQYTAyP2Y9Tlg/Qyw+TFRfMEppNU9EPJePsaKmrK+arKatsLS1sKymsKqpur67v7Ctua6itq/Jx8jRwL69u7vBvbrDv76/rbGxsbW8u8GxsLOqs6mktKmlrrOzubGjrriysbO7q7uwqq62q6qeqqufo6C2rqmhn7CyobaqnqinqqOqoaKtrai+sKyuraKoqKCsmZCwoZiioKeon6ibmquxqqOgrqKhlKKko6eYmqilmJeYno+Kh5SIfY2GhISjloSBgYqFjYuQg4OTn5aHkZ2Qk5CNkZyUl4+KhoZ4dYJ/fHV4eX95cnF3Zn6GpHZpX2NpgHRmiIx8UlhwX0t4c1NkVFFfTU1TWmZOTFZZZFhHUmhSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwS2c6NDhfPWFkP0YxQ1BbWypITDlVQDSSkLOhpaetpKekrae1s7KrpbCnqre9wLuvp7mqpq6wycfI0cO8v764vb68yLrAt6+vs7G6urfAsrK6rLisorSnqK2zt7qzqKi+tq+3vrC/p62stautnKmvo5+krayonJ6qsqS0qJurp6mjqJ2jqaipvqy0sK6dqqSgrpybs6KVpJukpqClm5uqrKagnKuinJOcoqadmJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2LhpCNj4N/k5qShZOijJSRi5GbkpWHiX+Acnt6fnxpeHx5c25uemaDd4WKZGFmX3GDeWxmeF1eVD9Xe21UYlBRWUxMTnJ1XUhaW2dZRVVlT0M+Sk5EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdpSTI0WD1mYkFKN0dTYFUqPTlDVj0qkJWymqChqqaloquluLO0pqqxpqy3wb21r6K5rKensMLKyczBtr3AtLe/usi0wrSysbSxvbe5vbWtuLW+rKGzp6ussba4tayfv72qs8G0vKGvs7WqrJ+tsKOcpamqpJ6cpLClsKCfq6mnoamcpamhrbyorrGuoaujpK6en62ml5+boaSdoJ2bpKujm5ulpZaXlaCjl5uWpayMnpGRkYuCioCAjoF7mZSMiHt+i4WOjYuJhJKXkIaUo4qTkoeRmpGTgIl9eWx+dnl4Y3x6cG5ucHVmf3JqhGhkZl1rcoxsYGhwYG89W3lsVV5OUFJLSk1UWldNXF5sV0RXX09eT0hNREY7N0hFS088cmhLSzlBRTs7PT47Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBZ1kxNFM9ZV9ETDZLVmRPKjsxTlc9I5SarZqgmKikpKCopLiwr6Svr6mruMG5sq2fua+rqLS6yMvIvrbCvq+0vbfEtsKxrbixssC0u723qLm3vaqjtKipq7KvurGrnL2+prDBtreir7a1p6ansLOfnqWmqKKmmZ+sqKmeoaqupqCmmKSpoLG5n6Sxr6GsoayknKenqJmam5+llp2dm5+rp5edoaqTmpSZn5SZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo6JlZ+JkZWCi5eOkX2FfHNwfnJ0dGB6eGhtbm5tZ31xY3ttaWRgW2SEfl5Zc2pySUl/aVhaTVBMS0hQUlFJT1xfblNEWFpSZ05HS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGVjMjRNP2VdRk89UVpnSCo9L1dUNSiXn6eanZeuoaGhpaG3q7KmtLSpqLnDtLKtoLitrq2wtcbIwLa+wbmwtLy3vru9r6q9sLS/sb3Duam7urenp7WpqKyyrrSxqJy/uKauvbizoLG3sKilp6+xm6GkoKWloJecr6ahnqOor6GfoZSlpaK4sKGmsaufrKOvmJyqpaiel5qepZSbnZueqKyanZ+ml5eYlp6Ok5eiqKKQiYuPhnqEfoSLeo+XiY2GeIGGg4eLjYWNk5iNjpaZio+XfoaXjY95gXpwcndwcHRfeXdka2tqZ2aCbGVyamtkZ1dgcn9eWWt1aVhFfl5aWE9PS0hIUlVHMjleXm1QRFdVWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJmW0hUQ1RdaEUuOjFdUSwyl6SjmJadq56moaOhuKqwobu4pay9w7KvrqK1sKytr7XFxL2zvrq3sLO5uLq4uq6tv7O1uK+/wbirvbq0paKzq6mrtK2us6Sew7anqri3rKCzvKqnpaivq5mip5ykppSYobKlmZ6kqamcoZ+UpqCkuaikp62mnqWhqJOgqaGhoJmbnqGTnJ2XoaOsnJybo5aTlpacjpSTo6ekkImKjoZ5hHyFhn2djYmKhniAhIeHiJGFlJOSjJCVlI2OlHuDl5CLd398bXVzbW10Ynh0aGZpZmNtg2ZnaGRmZ2hdZGFoZVplemJgUHNUW1tTS0pISU9TQCAqaV5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTz8uKy03LTExOTUsJi41LTgwNTc2YHNCM0NEaFtLV0dVYGhCMzc3YEwnMp+kpZOPpqecn56epLatqKq6t6esw8C2r6yitq6nr6+3wMC8scG3sa6ytrW5uLWsqryzr7Kxvb+3rry8sKWftqymp7Wqq6+hocWsqqiytayttLqdp6mrsaWXnaqfp6WSmaWtopidpKqhm6GcmKGep7elsKutoaGenaGVoaafoqCZnJqclJuelaafrqOZmJ+WlY+VmYyPmJqnoJCHioqIeIV3goKCnYeKgoh7f4WIhYWQhJaVj4+QkZCRjZJ7g5WPhXN/fmd5cGxrbGd1c2thZmNhc35hZGVmZGhoYmVuWV1YXGxjYUxnV1pgVklHSUtNUlg+OWBsaUhCVVNcWklHRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGFFJTWdpaGSjK+hmpmgl6W0sqOyvrehscW7ubCxo7erq66pub28u63Asq6vrravs7myp6u5sK+utLa7tq+5vq2mnrWroKGypquwoKbFobOmsLKxt620nauurK6imZ2oq6aflZunpqCZpaOpnZqfm5Wdna2xpbqorqKhmpuemZ+kmqWdl5+YnJaaoZSql62qnJWenZSNlZqOlZSYp6eNjIqJjnuBdIKCi5iFhnyIiISFioyIkoWUnJOSkJCRl4+Qf4GNjoNvgn9neW5pbGpncXJrWmhjYXF/YGRnam1qZGhlY2xcbGx1cWJTYmljZVpJR0xNT1lRUFVhZYFUQFZSWlRGR0ZFQC88PTc/NjxFTWE4Oj8yNDlAMzc4MTg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOkxqW01bS1hkY0BBMUdgQSc0lKOdj4+ynZyVoZups7CfuMC2oLTBu725saa2sKmupbi5t7etu7Ctq6u3qrW5raSztbGvqbG2trGztrunqaC2qp6fq6Oqrp2sxJmvp7CyuLWsq56wra+qopudpK2pm5Wdp6SdmqqjpZaaoJySnKOsq6m7nqakoJeamp2hj2ujlpmdcYOYnaWAdpKsqZ6XmKKTipiZgJeKn454hZKNgmxpfneEcWyGioZ9hIuGb11kYWeEmIZsi5CUknV4i4R/g5B/ZoiBaHZqZlhcaXRuTU9pYmVwg2VdZGZuamdcW1yJkISIaE9LRDhGVGdeSkhRUFVWS0hSYXB0ZUZbUVVQRUdGQz4xOz02PTY8NGZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjg2WIFsMTVPa1xOW0tbZmI+RzFOXzsrLo+km4iWspudlKGcqq6so73Fr6m3wri+vK2nt7Gmq6S4tLKzsbmuqaestKaxtaKnuLa1qKettrOutK60oqqftKueo6adp6mcsL+VqKixtbmtraSorKqrpaGfnKGoqJuYoqamnJynqJ2Tnp+ZkJ+oq6S1sKOio5yWmJmXo4ihj5Kah6GIlZ+igKWAqK2flZSelImEcniNjoOIoHWHjGmWiGZ+c3igb4eHhH6MfH+hoKCZgHyHn3SIjnabimuHgoNuaWVke21yYlSGbWRtaZhxWGlvbYZWXWhaa2lZh3BreXKHaIeEWV5GTj5GXk1GU1ZWUVBSV1RnXk1aTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbT1tMW2dfPUsxVF03LyiOp5iEnq2dmpmdn6uqqKq+w66yuby3wb+qpLexqqyms7Wvr7O3q6mlsq2ltrSbrLW2taWmqbOyrbKor56qobKpoKSlnKKlnrG4laaoqLe+pq2mqamsp6Whn5mhqKSamaejpJicpaqXlKKclJOkpqeht6Wjn6OYlZOYlJ2IrpCYlYqqjJmknYaxgaWvoJWboZd6gtSogIeUwJvGeHexpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsXlpbFixrm9maryTvG5neW1xjth9UmpitrJ8fnCVdZqhqpBWTldhT1ZNRlZcWFBQU4tcV1tQQVxEUE5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkFFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV1nXD5MMVlaNDEhj6eUgaiqn5idnqWtsqqwwr2ytcC1t7/Cq6a0rq2pqK+0qrC2tKiopramqLmvnLKytqqlpKeyr66xp6uep6WypaKioJicoqGyr5afpKG1uqOqqKCsraShnZuao6mgmJupoJ+XnqiokZ2nm5SeoqejobCjnp+jlpaTmJKZha9raoyOqn9ohZaHrWZyoJ+Wm6mXca6hpH93unxroI92sV9qtFulgGWckGBmgXpmf2l4a6plvnNnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4iWRXWcX31me6OmgVheiqtnfIx3e2qoOEqvW1hUbGNaS09ZYFxWVjtOiFBXVjBJU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TjVdVzMxG5KjloOtp6Wfo6WrsrittL2+sLfFsri6w6epsKywqaqxr6Sxu7Glpa+zo6q5qZ2zs7GjpKCqrbCsr6eooKOjsZyknpmWmZ2esKmYnKOgtbOhq5qhrKyfnZqXoKOpnZmepaCcmaGnpJCdopuXoaCsn6amoJqfoZWUkZeRm4a1m7V5h6matpl4h7Sbt3+VmJisl39rgaZ7gYWGkZSSd6tnarFbrHuOh5R0iXCOhoF/iJGXeIODi5eMg6CPhbB2d59ya2ttfItPpVhIZGSZfmNopl94cXRSkoZdT6ltYm96hYBhnS9Tom5bVGtnYExLXWRYXFpCPrB3V1hBI01pRUJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RSwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0s5YFQ1MByXoJWJtKenoa2pqLOsqru3wrC8wq25tsKrra2vr6ivs6qisLyroqi2raOstaSls7Soo6KdqKqyqLCopp+goLCXoJuWlpebobGlnJulqbavoaiOqaepm52WmKCmqZufnaSgnKCjpaOWm56Ymp6jq5ymmpyaoqCWk5GTk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKPnY2ke42GoYClgnmreY+dVq97iX6farlauXeHhH2mg5R8mXupeY6dkHuxbY6EdZC8hm+VUK+nxYpRoHpjYKphc3KGa5aHXlK1tMiFfol8Y6Q0Q511XVFpaGRQQFhnWWNhSkhNakpaU09ZZlpDRD9FPzA8PDU5Ozc0PDw4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuMDA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbKoqaWzqqW1qKS8uMGwusCyt7S9tLansrGksrSnoK+2qZupu66jsbKhsrSxoaSenqipsKm0qaadnp+smJmZmJiWmKOuoJyXqa6xqaOejqyip5Wdl5uhp6GYoqKjoZuioqicnqCelZmbp6Gcp5Sbmp+hmJCSlZCdiLJuaLVyrIhwj6dytHZ0tnucmqaOkJ2No36PnqN9sHWCkNLSdVyufIV/pG6bqqZrh4V9rX2YmZB7sXOTnY95s2WWdIWebp9mlFLJi1rCXJ95Yl+tX3ZzhGGWiF1Zyp1vv35yTUu1U1XGZFVRamNlWEFPa19saFBVRkg5PVdSW1dYSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTVRfZVA1Rz1hTTYyLqOekaawraWpu62mtKWntru8s7u+uLi1vLy0prW1o7Oyo6CssKWYqLuupbKxnLS4qqClnaGqpbKorKqlmp2bqZ+WlpmZk5Slq6KYlKersaahlZKsn6WSlKGcpaeglZump6Kbo6CumqCenZCWm6OfnKWUnZWZo56VmZaSm4WsfHiod6OPi4eqcK2MhaiEmpuji5Obi6J+kZeHroR/gbNccrJTr32CgqN+cdd9d4V+j56HmZp3r4aKkZyId7RhmmWbgYGVbJJbsFdLmnWYeWZhrV52doVml4hqXa92lZ6Pd2s1ecius2BEVW9dZ2BFUGxfcG1WVU0uZWNoUllRO0FDQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITA0NzY3PVBrZT4mVmdcQDxVX2NONkdCYEk6NzegnZSht7GZs8GtqLKnqrO6t7W5vrq4s7e+tqa4taG2rqCgqayflam2q6mysquttKSbqaCgqKK1p6aqpJmelaWhlJSdmpKWpaiclJGorbCloJSZqJ6ij5GimqmloZWapqmenaSfrZygnZ+NlJ6cn6GZmJuVlqKglJiRp52HqX5/pnmhj5CEqnCtjYOnhpeho4uYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKiCj5uNkqR8lpCfhHuyXpxkoH2ClW6TXatcW5N/kX9oZ6pjcnqAapiGcV2rWomgj2ttZE9KQ6FcW010XWJmTVphX3J0YEpVNUqakVhIRT1HRUFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4xMDIxNTQrKjA1LzcsJjIxKCQlNjY3MTxPZWRBJlVmWz8wVF9iTDdGSF9DMT03op2amr+tmLPCrqusqKe1sbixtb66u7Oyubyqu7ahsqWfpqion5Ossamwq7etqq+hmKKgpqWkuaOjrKGXnJKjoJaVn5uVmaKhkY6MqrCwpp2Wmqemn4ySpJinq6iWmKmon6ChpK6joJ6hjpWhmaCgkpyXm5WeoZaWj6ycj65ucrR0qYx3i6Z0tHp1tIKUp6SUnY2JpIeOdbhvi3uLomtrtlqhhmWXl2igoqdtlHK0dJOZf7NqhpKIrWp1tGGdZqJvhpJrmF2tYE6hfIeRUnOjbHl+fW6Yhm9cr1Y8nHdlVG9uLlunT2NSa2VibFpiXGBxfGNTWVE+P2xvMkJCQD5NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+LlVeYkw1Rk1eODFBOKWanJ66pJuxwK6tq6uot6q4r7XAtb2ysbu4rMK3qqyhnaekop2SrKuotqS0qK6qoZedqKClq7ido62clpmQpqOXjp6hnJmfoJGUlay2sKaYk5usqZaMlKaZpa2jkpers6SgnqissJihopCZoZegm5abl6CUnamdlJCrmYfUlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsGDmrJhg7p5wHx1uGK1gYyHqX2VgqypcXt/dbyIp6BpnWGmjq+ifo11h6t9vm5zvHSyg3V4gIltmohwbY2kdL1dd31bYXm8alpWXGp6XmlhY2ZibnlvWFtZQ0FAcT9DRys0SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9TXWBLNTxMWy02Pzmnmp+ivKOXsMOvramrrbGoua+3xLG7s6+8sK7Csq2mo5+lop2ckaulqrOltaetpKCWmquZp6y4naOumJWhkaagk46do56Zn5qQlpOwubGrlZajp6eUkJalnaStn5GhqKygnJ+ppLKdoqSOpqGVoZmblpWjmZCwoJKVqp6FkJm2gJKSjbiWeYOTm7Z3bmxvdG95j4SOiXKewLu8mnuBsqhwgXSRuYN8hoaLho17ioeMl32ku7m9nHV5s6N0dZd1dLB1mZ5mh2qNtnRzcXe2i16AeXyIZ4N5bHpii6xwdIV+V1unaURkWlRmX2NdYlBnZnFudUJNT0xEO1pMPkoyOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlbLCs6yqqK2rqruvsMavtbSwuKe1ua6rpKKnn6CdmZStpa6rp7aoqJ+clqGknqykvaehqpeVnJGim5KQoqiilJ+XkpiUsrW2rJedo6Oii5KSppulq5yWqaWmnJuhqqamoqihkayel6Kel5aXnZ6PsKmUnKeij2t/ap2qeol0f5yPdntmiHu9vsC6b5KDcZSFX3JqWl6bimFjh4+WbGB/lWNtnHZilWyAmZWUZl5gY3GbiWhyjHyGlGZqfnF0eH9+Y1x4dYFoUFxuhHx8impYbHqCcUhKb4VwTnFNRFZcZmFMW1dmY15PW211a3JST0RETTxISDxMPzEsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlRFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJeSSdTX1Y0KVBeTCgzPlxPJz8yPqifqaLBpJqzubajrKavpqi2sqzIrLC0rbakvrKzp6Gkqp2jnJqarKeupKW2qqWbmJainKetqb6oqaWVlJuWoJqTmaapqJKfkI+YnLCyvquapp2noomTkambqKScnKygo5qbo6esop+poZmum5SmoJaUnZ+dl7GlmaKomZ2Sn52lppuopJuem5ybkpeCaG9+cXeRl5SQhIm0qo2FmJWPioyZl4iUlYmDk5ORiY6SlJiUmZean6Gam5Sfm42BeqSFa2p8kX2BdYqLg3KCd3l2dot/fIlqc4F0hHRjdn12a294bF9iW29nTVhZZmpfV1lvem9uZlNPRlI5UFpOUk8nKjtLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NSR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0knUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsLG3oKqms6elsLWqyKuts6e2psGotaGfpaacpZaVoaynraSkt6ygmZeWoZitqqXBn6yklpKcl5+YlJWjnp2jqJOQmKiossKvmaqcqp6PlZapnqqcnqGtmaGbnaKlr6aho6eerJiWpZ2ZmqGenp2woZ2ip5aZlJmUoqSYpKCZoo+YlYyLjpCYrpB8lZyCkYGJqaiFgJiXi4SPoIh7hJGFhZqRh4aKlY+bl46RmJ6jlpmSkJyNfo1lobOuhYqEd3uQi354eXpvZnmRgYGIa3WBeYlxaHN/eXWDhoBqc2J3ZV9oZWNkZmpZa3txampcUktQRF9VRkA+Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAsp+5r76tq62xsqCqprKto6yzsMWwq66ks6+8pbWcoaijoZ6Zl6mnqqalprO2n5WVnpqasKauvqGsopGRnpqalJKWoZuXqZ2Enamro7THs5+po6qWlZeap56onKCkrJSfn52fqq6opKKqoauanp+gmKWfnJ6dsKSZn6mUmpmekqacmqqfnJhmhZR9ZX+Pm5Bjeo1taGp6kKOramWamH5nhYtlZWloeo2ijmtojJiRondraouZo5+Yc2xteoSMhnlYZV2Ggl5si4uDd1xodHd3koCHgW94gniAcm14hHN2iIeOg3pohFhdanRkXXOIaGp8cW1jXVFNV0pkWEBJMz1GOD9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX15aVE9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQklbSi42Wk82KUVZL0RPMVlCOz8uPaSeury5r6uysKulqK2vsaeurrC9saqppa6wsaCtl6GknqKamqasna2kpqiqtK6elqSQo7Cmt7mlrqOPj5qimpOSm6CYmKaWe6Sroqi0w7ekoaaunp2UnqOfo52kqqmTn6CeoKqvqamiqZ6mm6Wep6Csl6GbpbGlmJ2slqOfm5OnmaCsmp9/vYSKdLRzhZ+GrWh3ucS4cZKho3qmmZl0q4J9y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXyBepGMmsLAfWqlsnCOgm/KeoCbeJKDjoB3eYGAeXB7f4ZweISKknhsdZFhZV54ZF9lgWJddGhtZGJYTFVJUVlIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fYGFfXl5eXl9fX15cU01QR1VOQT8/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziVobnDtK+vv6mplKOwqrCvrqayta+qp6emsaugq5ibo6Ccm6qno56so6WppaW0pJ6jlKaurLi0p6+ikpGZnaaTkaChl5ugnoimq6Srrb+/sKCorqiWkZ+dopmipKqklKGhnZ2srqiqpaKipJ+jpJytqZKkmqiuqpyeq52uo5eYp5ijpJmef86UenulgnqWl5tfrY9djqiAoaF8p5WbdauDga9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq1Zo81ukXZ723t/mXF+iJJ2f2V7iHV2a32HbX2EjpB+a4CMXnBqcGdgX3hkW3FoamNlYFJUU1deSk9DNEFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xfX19eXV1fYGBfXl5bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrMHAwLS0sLeYnpGkqqmttaumsqysrKWtprCqoaecmqaYnKKvn6GfqKejpqGfsaycn5Wmrq2xq6isoJSSm5+lk5CfpZedqKSeraOqsKi/xbKnqbGtlpKenKKXoaqqn5Whnp2cra6mqaebpqWioKqSrLOWpaKrqp6kqKejsqKTm6mcopyWlZGXoXKGjJh2hqiHcbB8nXGsfaCggqWPnnirgn6tf51yrX+sh4afdpiSe3yXf6qIooyRjJx9q3qIk4+ff3qtVpzEe5Bwk8F9gZVtdXCMbWZ3ZYduYXhucm6HiY+OgmyOjWNuc3VvYGZtZF9vaWpuZmNYU1xgWlJSQzhJSEBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi09KD4xKTNWQEYhHEc7QzEuK6/Txseys6Cdo4+jo6Kur7evqbGnqKqprqusp6KknZqjlZ+mq6CipqCoqKOfnrCsmJuWqKevrainqZ6XlZqkopKUoa6anaejrqyirLWpucyxrKatq5aUnJ2imZ+urJ2WoZmenqmxp6iomqqmo6Gqmq6xoqirr6aap6yrq7Okk5mlp5yWk4Wka6R1inqpdXuycYKlipiLcYigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoKjfal/gZSGrl57qFWdopKCe6OfgHzEsMWMc6+0s7lyYqmvwnRoi4uVjYBrlo9tbHh3d25rZmVkcXFmfGljXVZfaVhYVExMUExDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmFhYF9eXVxdW1NJQjY3OTo2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfBydbWwKCZq6ihr6KfsbSwr6mso6enq6urqaWmoJuln52mp6aknayaoqyhpKCvo56bk6qktbCvoambnJaVp6SRm6Kon5+mnLCloqixrLbHsbSpq6mVkZ2doZmgpbOdmqGUnJ6nqqqirJmqpqChqaGyraGpsrKhnKuqsbC4ppSYpqqanZN9qm2fhIh2q3l8sG6CpIuIn5aVnpaB0ri0uMmBgrJfYJSpg6WIh6B6mJaaearJdJqjlKipkJKajH6aiZrGxndloYKldIKgjoJ9r19vtWOxdUujh22nR4OTZI2PnJB6bpSOfG55dHx6bVtmanJxZ4FpXmFXY21cXllJTExKRURCQj1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fYF5cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwxLz0tNE9UUR0cOzxGMiwkp6TAx7mtqbKuraWjnLO5rKuhpZuopqusqaagpqWYq6Ofr6ydpqGtmp+ppZ2ntaCkmJSoq7azrJymnKCWkKatkpqcp6OgqqatoKOnqbCzwbGyqaynk4mXnaWboqSvppeilZicpaWpma2cq6WknaujtqugsbiwnpywqLW1tqeWmaqmnKGQg55Od5qCgJ97hKN8gqSDhqafnJ+UhLh8fXq5g4DNxsO2eJuikouffpmXl4p2n5eKpJikqH6vhZyDnoOsfZmUYaVso3GQhZCBfZaEcqxgpHNxgJphvH1SVXWNkaGUenuPjYZyeXOFf3BbbG53c2qBblpkXmduYmRdS0tRU0FHR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1McGzY/RywtIIuHmamrpKu5q6+gnKGts7Smn6GVpa+urqmnnqWlmqSnobOuoqmns6CaqaSUo7Wjo5aXoam1uaSbo52jk5Cispmem6aloKKvrJykqKK1scOwramsqZGHkJynnaOknKWXnpiYmaWjqJisoauipJeupLqsoba2rp6etrS6s7apmqCypKagiJDStcO3eoeOhpGTj4Cmd5Sid4yhkoWlg4xyq4iGtG5zapqknZaKn32XmYeHkHOugqWbo42mipOdiJSQmm1wslylc5N6nGyZf3uZfm6pYaJyc36fYnOyuGh3jpKjlnuJiY6HdXt4joJsaHdoeHNugHRdZGNtbWZoYEpZV1c8R0Y/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVVFPUVtVJSEyQUgjKiWSco2Krb+/vLu1npeopK62oqKZlaOqqK6pq5mlop+moKC1pqKpp7GklKujj6StpJ6RmpqqtLSknaWcqZKUl6+goJ6mo5ynnLOZoKqjtarCr6iqqKGMg4+doqGmo5WampyYmpimo6WXqaaroKObrKa8rJS9sK2fo7G1u623qZ6rtaermnyokn18sHiLgKSliJxtsW+gh618oo+DqJeagqyKhq2GoZWooaOYhp+BmZaBe5J+q4GdmZaLq3edoI+Ik5J/eq9do4F9pqdlnoB8l3Vqrl2lbHKGmV1gW4ygbZSPo5aAkYmSiHh5gZd/amx+Yn10bYB5YGhlb29oZ2hCWF9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaV1NQT05JODE1Mi4qLEFUVlZWVVRVVVVVVFRVVFNTVldXWFZVVVFIRklKIygovJKahKnGw7fBtJ+braCuuaajjpqjpKCvrqmfo56drZieuaCjq6GwqpquoZGqqaWXipqQrbGtp6Com62YmY+toqGdpaGZpJytl5+opbaovq6kqaOfi3+Om5qgpp6SlJmak5qZpKOimKeqqqCinqenvKSXwqyro6KttLutsKmjtrKsrpp3r3+QipyFh3y6rYmYZLCMZJaufaGQhKeXnIKtjIWwh6iapKKjkoWgXGxrgrNgf618e4KBsmxnbpmXi4exWn21XKSDa8iiZp+Be7tZdrVasn1Tr4F6rFiAoW2WjaWYh5SNkZJ5d4ycfWNzfGKDd3SAfGFqZm9uZmVmT1RiW0FTXT1IKD45PTQhISwkHzEuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBfYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdXWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vru0wrOjnK2npbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVr6mjjombjq6sqaejqJquk5qPqZqhnaSfmaOipZieoqixqLuupKienY58i5uWoaCZkJKam5GZl6ien5enrKSjpKKjqLqen8anpqmhrLa3rrGqob+xsLCYgqqTo66Om4CGpJeYkICAuMO6hI+dlIWomZ6DrIyEr4qpnZumq5J/1b3CqmKkv719f6OCg9e7uLWElJKCnr2+hGujgnCrhG+dgHqysceDa6uxvax5eKK+u3SAlIyjmYyYjZKZd3+PmXlifHlkjGZ4gXtga2VqamJQYltSaVw/U2BCTCk8OjQvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0ssC6sr6zop2up6Wzp52Ml6W/qbavp6G/pqaxm56xnLmon66vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp2mm5qgqKKYnaCsrKm4raejmpeSe4eZkaebk4+Ql5iPmJOpmJ6WqKeeqKagoaq6najFo6GwpKy0tayyrKO/q7OynXV2qqS2hWWJn3BnrJCKj25ud6WQm6GCdrKcmHGRjnKXq6Sbma+lcm1tbWaLeG9tg5pxgXpqcWlniZaVl3JpaYWHZ3GHZF6LY2pwWl1nfnimYGJykJJwZmSAjJGOn5SUlo2SmnqEjZN0ZIZ3Z4xqeH55ZGxjZWxiSmRXSWpZOU9jRE8nSjkrIxwgGyIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdbXGBgYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6urKzq6mirp+js6qYkr2xw8e8tKmev6uso6Cnq6C6o6SurK2mjpatqpCMhZWWrZ+mq6KfpKSgkoulkqaZqZqWoqmglZylpaauuaqrmZqTknuEl42ml42RkJeUjpeVppOdlqahma6lnKGruJ6wwailtKetsbOssK6qvKeyvJiMo6mltZyJlqKYh6mbj5Sdkqq0mpykrqK1maWkoKOkn6Smopasp42Tk42Hk52dlZCZk5iRj5WFf6Sal5aOjJSTipCIhX9ojIF1g3d1h4xxp219lpOUlIGBj4+OjpuQnZKTkp1/hZOMcGiPdm+Jd3V8eWlrZWNvY1VhWD9oWkdiX05XK0U9KyYhNjQwLh8cICUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdUVlleYGFiXV5VUEtFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbiur6Kwpa6goLexkI6qxLzDubapoaSdm6WdsKikt6edqbWnqJGYrKOMiIqPnKeWraShmqien5OWpJeomqiZk6Wgo4+ap5igtLmnqpiakI17gZWLoZSKlZGVkI+Sl6SOnZinnpqzopylqranrsGvpLinsLCyr6yttr6ks8Gak6elprSikp2mno6poIySn6KtsZuipbOrs5qmo5+nrKCgnp6YrZ6TmqKclJCXq5mNmZqXkJefkYegnZWUhpSNkI6WjYJ/Zo6Idoh3eoiEdJxqiJKWlZKJfYyWkZKWkJ2OmJKdgYWXhnpxlHJ5iX9xe35qbmRecGlgXF9YbGJPX2NPWDlGRkQ9Mjw9Ny4qJSspJh0mNDE2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBhaWFlVVBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7C0rK+jqqeuoKe1qpGPm6Oyua2qq6GimXqcobCkprGpl5y4pqOUmKmcjoaKiZyikK+fpJapoKGTl5mcrouqlo6nmKeMmKiOnbi1o6WXm42JeYKTjJuTipWRk5COkZahi5ydppydtqJ+g660orCvdaS/pLOgeXujrbXAmHiwpqGKgKp+ZFxidp+PpJ6Dln5tlLWdpamxraZmoKKVdXucmXGBmaqZbYCkqYplnKWckZiZl4yTnJGFnZuQlYSUiI+Pk4uGeWyRiHaIcnyGgYFhaYmMlZOMW3aVkGZojotxeJ+VlGR3l4aBd5dogomCbnl/a3BlYHZva2toW2RjYWFtUVk9TU1NUkY9P1NCOTAvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHRklLTFRVVVldX2dnZ1dRSTxESDw5VlJbYGFiYF5fX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqaprqOnraWSlaq0rrClmamlqpZzi5yvoKirp5SXuaCgj5yknpF+iImano2smqSVqKKejpeSnoV1ro+IpZmokZajiJq4s6efmJiLiXR3ko2Xk4mTkJCTjI+Sn4yZnqSYm7CUgIybtZ20jJKPvaeifqeje6Wyu4SOkKmghIyFj7Gqr4yJlqOaeYCLrIadn6Opq6qJloibd6Wce4icgZinhIJ7nrN7ioagmJmVmJeBkZeWhJqaYnmIkoWOkJOLhG5ykYh6gnKBgYaAh3SIhpeTeJZok3SgmnR7mYGbmISYfpCJgYKXaYyMhGp4e3FwZ2V4bWlsaltjaWhkcVpbSFNLUEBFNS1ZU1Q2KSEwOT0+NzQzNTY4Ozo9Pj4/RElASUVKS0dTWFtYW2FhaWZZUUg5RUw8P2JWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpKCmrq6rqK2gqbGmp6qlmZOsxLyvoJSlp7Ocj4OdrJ2noqCNkL6emY2fmqGRfYaOmJeIrJ2jlqGhko2UiYaAkaiOhqGco5OWnYWeuLGonZqSj4VwdZCJlZCKk4+Om4uOkZ2QlZ6ilJ2qhp+0ibSarovKiKuvireFjbCEs7OHqY+qmo2de6iPcnt3nI6mlmiVpHm0jKGgqKqUmsKCgauJmaFynoCbpX6XhpaygaF9oZOfj5iYgI+Um4mZkot9hpSHjZaUioVudJOGgHtzh4KEfYV1hoOYgo/FZoCph4+iaZ2BnZaAmYCKi4OImG+NkoRnd3R8d2dpdnBnaGteYm5sZmpXZEZcUUwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUVpdXFdiXmpsW1FFPUtNQEpkWF1jZmhnYmJiYmNjX19iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KgsKmpqKasoKW5samrppqUnqGkqaGUo6i1oa9/oKedpZ6diZS9mpONoJKdkHmDlpaRiKuZnJuaooWPjHebnI6gkYedo5uWmJeFobitpZmbjIx+Ym2Pi5OPjI+MjJeLj5GejZKen5egpn2hp4etnaCWrpCgnp2Rh4Khja6ziaSPrJyMmn2idYCZlGuCq3VNq3iHjZ2TnKqpgqqrf4WifHunap6Ak2xnl4aYt4mefm5gY1iDmH+NfGRnjHOZfnqYbF19mG9hVHKHXWBteoRgWWWCfoWBmXKoqmuDo25ypW+fgZpnZJ5sWmyJe2VZX4J+YVdQcHZlb3RxampvXWlvbGpnV2ZNXFdFOEE0RkNeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpcXV9XXl5jdV9NRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJedobmhqqSmrJKitryqrqKZlp6gpaurn5yttKGnkaCgoaecmY6YtJmQi56MlYt1gZSRjYqmlpaYnp9+k4WGrKSHnJGKmKiXmZqRh6SvpqKVmYeJgGluiIiLjo2Jio2Ri4+RoYqSnJ6aoaN/k4GPo6GUoHeclpCng6OpgIessYileo1/hJp8onByk4eVe56MeW2Hm4uakp2qnI+HnX6EonR3pmeefnelX5h7fZNzom6Yt7S6dJOIgoC2qGSBxbl8cZW2jHKBm6RkdayrYX5qnbN+bn6JhI+DjJhxgKNrcqNynoF8o16cmbOVcHyXnrN0cluesoNqYnF0dXFob1hqa3FwZFtnXGFLQz1ENlFBWXEyPFNHX0pSPTwzOTU6OTZDPDtASVA/VE5OUUBFX15bWVdgYHtkSUM3TFdVVmNhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaS5mauck6COpbi1rK2gmqGboqOkrJqasayrk5ihmaGlmpqUnqybi4mReIuFcYCVjImQoZCTlJ2XfZGKjqigh5iOiZGik5uajIqop6Sej5aHhH5qeoZ+fY+Ng4qPkImOk5+BlJyem5+ei4l3nJiijaByoYyJqYmdqJKZq66Cro1+eqCZeaOTeIBzl4eMnH2UnoabjpqdqIijZKF+jJeQm41tnmibjm+amXuAiqd9cmh0q4Oeg3OqZ5SaXZuFd4WeaKpqgLlmXKlwgZxhlYxfp3Z3iouAnWiadYeTkpiNfZ5smI9qpplcqH53u2p9qVqOhF2zZ1tucnh3a2lbcGl3d2FeZFZhQVBETjdVQlFtNEpaWl5OWkRAMTUxPDs3SD86Q0hVP1lTWF0+RGJdVmBRYWR8aUZCOU5bXVllZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mWnYmqtpyoiWOVnKy7sa+rnaWbmqefnayZnbCnq56Xo5qioJmWlqCkmYaJjWmIgHJ6loiLlpaEkpSYj3qLhJaknImVj4aKnZKcm4iPqKKfmouQioCAaYCFeX+Wi3qIjY6HjpWZfZKhnZ+hkpdyaJ+KoI+McJKNgqmJmqGlqqOrf7CupKK4l3ajs6Kjf4iUeJ16qZh/oo+fnZmJmHKgfYiOsLV9bJqRoXh+mbWjo6uohJl8m32cm390qlpdb3uXjHmeY01/e3uGZXqYQk2fWaJqc32Pb4KKhJl2m3mHibGzf32ZkqZzfZ1tcHyUb5lyaaNdlXZIZWNfdHF8fW5lX2tndXpiY19QXVdcU1ZAWUVQZ0RSVlxhWF5JRD1COD9COklFN0xFWEFXUltWRUZiXFpgS2BtfXFFQzxWXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lY3ZsXmVnZmxkZWxoaWxplJ6BsK6ahFNfoae0urKyqJqii5qpm5unkqCro6Coj56enZqZlZignZaHh4l3hYFueJSEj5uLfZGTlohygYmSoZtykpCAiJiUn5qEjqicmpWKiop8g2yEhXGCoYt3hIyIh5GYlHqRop+dooethn21hI+enXumlnqpgpefkYykoYCnaXhufplzoHNxfJ2FmG+Tgqx7o4Snn5uDpHBfqWh2o2RwpmGc0498e5l4cnNjooaRfqJyo5B2a5CzjGCDmIt1q7OovH93hG9/v6aqtF6cb39yl3CCdKNyXqRndKZgaKZrmtOYeYGabnZ5l2ubeXaXcmyppWdfZXlxf4RsaGZjbXV2Zl9hUVplUFFhSFZJVF9XU1tlaltlUEVDS0xJS0JLRThQQFFOWFNYT1NRYGVkaVNkeHl3SkdFZF1lWmhpU2loam5jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZ2htaJibf7CsVF1LfqqvsbSwsqKcmISXpqCgooykp5+XqYqZmJmUmpOSoJiOh4V7cH2DaHyPgpOagXeRjo+KcICGj5ORa5iTfIiRkqOVgo2omZOSioWJeYN2iIBugZ+Gd3+RhYaXoJV4kaCimZ+Is6Gitot6rKekrqVxqYCbkYaCn5V+pYGjm4aYcZ6Eoq2vipeLf4ykjZWDr6OVd7W2tsqidJSNg59gnZepbXmWh6CbdaGHd6B+kZeLgW9NZqOTcZuJdKV7enVihINufqBtcmRgnHN/dJhre2q0trTGpnOYfXmcapqZq3OAmmxzd5dpmXl0mHFQRH2zXml2a3iGZmtmYnN0b2xVW1JZaE9RZ0lVTFhSVVxna25VZ1dNSkFJTUtISk5BUUpQZWNqbWV1c3N/eXtudIl6e1VRTm1eaFtraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubGVpbWWinYivp4VlQJSisquvr7Whoo9/lqehoaOLpKadnKaCmZeXjpeQkJuTjoiDeWt5hmWDjH+XoHl1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJaMkYuAiHqAfYt5cI+ghXmAlIaIlZ6UfpKkppuVloRmbnicbKJkfHKleJyYcGing5qOfaV7opeDlnKfdoGJlJaPuW6QiqJifZqjl4ludGura3WgbnCnYZtqi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXFlZ4mCb3OiW19bZKFuXomNcXyAdHJkpW54omNmp2eXcYqXbaFvUoiPbqBeZKdUi11UmG1tc2txgW1waGt3c2puUVZVVWVYUmxJWE9bSFdoaHNqWWtWUFJFVlxMWFJhVWhqXnd1e3xwfXxyg3t/c3eNgIN3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaaZpntldG2Mp66lqbCxpZ+Lf5WpnJ2ji6GhmqKigJWZk46akIuXkY6Ke4ZxgIhoiop8l5tzdYl9kHxlg4eViomVmoJ8iIaWppCAoaqPhJCKgYl9gICOc2mPpoN9hZKMh5efjYaRqKWciKZ4lZt+pYmWjLKZnpGEr5efpXqYiXupdaiRhJpupaKMkoSMg7xtfKWvgoeFh5WYnqN+pnxzqJWhlmmff3CsY5aKlpN4qG2qo4GJdomDd6uRpohrkrFsd7ONqWyLhm9voJ6SlWJ/q4yqeIGAjqefd599haSWnaBnmYZ0q2aerYy2c3a+jKSTWYOmjathdnJ0b3t1cGJqfm5nbFJUWFRgYFxqTFxRW0hdbG12X1txWFtfWmdzZW5vcWNxdGB3en55cnmDc4R+gXt7jIGCgHZieWRjbnNkUmxnZ29tcmlmaWFfXlxhamJsbHpvXFxiaWJtaXdtZ2xvYpamqp2BgJ+llqqqnqenraOYiIGWqZmdoomapJyonYSMmo+GnJGFko2MjHSFeoiDb4yEfpeTdHWGcpGDbn+LkoaFlI98e4GFl6SNf6SkjYCNiYSUdYKHk25si6iAgoqTjYibnYiKkqmin49/dJOXiH6BeZSvpH+CnXGPhnmTjoaBe3OpjXF9fXqXlpuFjnh7fX2Gk5WTi3eSmqGjhXx/i22Nhlx6eXN7cWlufpOKcoB0go+Uk3GGhINmjX9fgoGMeHd0lXZwem9wiW6Fhl93aXiOZ4KDho+qnH90fZZpiYhvfXV7gnRsbGaMc3h7l3eEW2tXeY9pbndycm93eG9ca4VuaWZWWV5WXGVqY1VgVF1QXm93eWtqdmRpamp1e3BxdHNhb3RidHuBeHV6gnV/gH+BeYuFgn57boBtZHluXlduaGh1a3hqaWpkXGBaY2llbHF1blpbYmtkbGt5bWhsb2COlLmpp4uho5umpJmknauhn4ODlqmRnZ+ImaaaqJmDgZyLfpaUh46KiY1ygnyOfH6OhHuXjnRzhHCVhnx9kouGho+FeH6AhpijjHumn4qEj4+ElYKGjph3cYSqhY2Rm46HnZ2Gipqmn6Crg4iNlJt/foqXraiQk6iReXGflIV8lXCArIdxfpVxanB9gZ+Lf5GNimdtXYSMjp2eoZF0l46Kc3Vsg3d0gVlyb4eRgn5/jGpdaWR7hYSJgGBpeXycfISNhHeCiIVqeo2JbGJxc4N3YHSNg4qRqJaHZ42Ogmx2ioFtgop2bWNlY3mDepVaXGlnbnZbe3l3dW5zcoNmW2yJa2tiWVhcWVhrcVteX1ldXGVyfXp0b3Riamppe3txenZ0ZG10aG17fnV6fXt5eoCAf2+GiYN7fXN/enN/aFRccmlsdm91Z2xnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsaKQo6Ganp6YnZmooaB9gparjJ+ThpqikaWVf3uYhXySmYmIh4eKcX2AinaEi4GElopyb4BzmIeEfpODg4aKgnqAg4qan4+BpZ+Gd46XiJWKi5yXhIN5rIGQl5iTiZ2chYegqZ6hoqOLh5KbnaOalquiqKiik52JmZF+epGQhqp/f5ORkpOdsqaalJ6OjLCRmISnjo6WnaKLkp2FipOLbH2Pd3hmgoaRi32JnoSIjI+IiIGFhJF4fHt1nKSKiIygjIeWgICOg4F3cXWGhYB5ioiLkaeRhIeOh4KLj4p5g4iFjH90aoGDfHmZaXJoYXOKcX57d3dwd3SBXV1uhmhuX15ZWlxTZ3FVY1taYGtndHt7cm5vY2pqaH57bHh+cGhvb2tmgHtygoB3f31/hHttg4yFfHp5fH16hHlPZHdrc25wemVsZWJiYFtzZnBmcnFtVV1sdG1oeHpwZ2lrZY2Inrufl6OhmJWZmJSYpKCcen6XqY2djIWfnIuel314lYN7jpmJhoOEhm14gH9ygId+iJOEbWt+epeHhIOQfoCGhId8h4KMmp2ShqmdgnKKj4WSkYudkXyNe6mDjZGWlI2blYWFmqWfopqehoOSmpmZkJmmoKaenpCXgpSNeX6KkIanfH2PkJGGmKqhnZOdjo2ojJGAn46KlZyhhJCZgIiPhHB5h3J1YX+EkIh3jJmBhI+BhoV/hoSVbnp2dZSkjI6HnIaGkHaCjX5+dHN8ioV8eo6PhZSokIeEj4GCiYiIc4KFhYh5bWp9f3ttaGtsZ155f2d9e3Z1dnV7d1xfcH1tdGBjWlteUGZsU2RaXWBqaHR5fnBsbGNrameAf2tyf2trdG53bYR5boaAdoKAfYV2cYKNh357e32Ae4KLYGl8a3VoaYNlamNgaVxjdWdvYnVtbFRicXllb3l6cmVqbW2Lip+4mqKkn5OSlpeLmp+enHp3m6SQm4mGpJSLmJp5eo2GfIqSg4yCgoJte353coCFfYqQfWtofYGXiYGIjnx+hYSHfI+Bj5ubkIimm39wi4qLkoagoYqFjHyokIeOkZWRlJF3jKOgoZ2Wm4CBkJqYk42aoqKkm5iSnH+QiHuChpGJo4F+jY2PfJikoKCSmpCPpYuPgZySipSZnYCUlH+Ij4J1dYJxd2F+gY6Ic4qWfYmMcY1/g4aHj2h4cnqOmpSRgZmAio10hIp+f3N7fI2GfHuTjoSXppSMhpB7hIWGg3N+gISFeGRwen93eXBsamZefXNofHV2dHxzgGpeYHR3cHdkY1hdXlJpZ1RkWF5gZ2l1eIFwZmtjbGdlf4FqbX1nbXBqfHeGemuLgXKBgX6BdXaCjYZ/fHuAgX1/j2pyhG50aWKIaWxiX3FWdG9sbWB4aG1XanN2Y3R6enFia295iY2fs5Klpp2OkJiPhZyhmpt8daKejZd/jKGKiJuWeHyGiH6Ein6IgoF/cH96c3WChX6JkHdnY32Gl4qCio14fYCMg3mWgJWXlY2Vnpl9b4uBkJOFpZuHjImDppSEkYmUlZGQdZGdoaGYlJh6f4+Yl46Wmp2lnpqUlZ17komFeoiZj6B/gouOjHOYo56gkpiOjqCLi4OYmISUl5uAmo99iY6Cd3J+bntkgH2Lh3GHlICRgmuHg4KAi4ZmdnB9iJSajn+VeY6LfoKJfn1zgXmLh3uGkouMmaSXg4SLdoeDgYBzeH+GgnNednd9cn12ZmxlYH9pandzdHV9cXxjZGFzb3VybWFZX11aamNSYldfX2dqdHiGcGJqYmtmaHyCa2h0aGxvaH98gXlsj4VxgIODf3R8g4yBgH56goN+fJBtdYl0dG1mimxqYmN1VoNpcG5geGdsYWp2cGZ4e3lxX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHanm4qYeZeci4yZkHl8gYx9fYN7gIKAeHN4eXN9gIN/iIuAZF59i5WHf4WIdH1+iX9+mISWlJaMo6CWfnGGe5ORiqaPjI6KkqCQgo+Ok5aQioCPl6CakpCSc4COkpSJnZ2ep5mZjpWXdZGSjG2ImpKcfIiJkIlvmJ2aopKVioudi4aBk52AlJSXiJuKfYqKgntxemt2bXx/jH9uhZODlXhwgoR+f4yBZXNqfYKYmIaBj3WSi4Z7iX93eoJ/iIJ+hY+HjZWlkXmFgnSIhnt+cXJ+hIBrYHl0eXB7bmFuY2V7Ym5vdnN4d3R0YXdgb2x1bnBdWl5dXWldT1xXYmBnbHJ6iGpfaWRpY2h3h21mbGhpbGeAfHp3bo+Ic4CDhX10gYaJeoN9eoGEfXyOcnmLeXhubIdraF9pcmKHaHFvZXZnbWxhemhqfHt4cGF3bYuBmZmroaWpnouLkYaJnYuUlnx2rJiMlnyfk5GXlIl3fnuKfHyAdnh/gG9zc3pvhXyAgIl+fGBbfo+Rh4CEhHJ6f4Z6j5GHkZGbkqSak4F8gXyNipKkiY2KjZaajISPl5GUjYiIjJKdk5CMjW6EkI+RiZ6ZoqGYmIqXk3CMnIZoipuRlnuJhZCKcJaalKGRkYiKmIyCf5KffZORlI2akHyLhoh1c3VrcW51fYt1b4aRjpJydIB8goKKfmdzbnp/m5V+hop2ko2DdYp7cYOAg4l+ho6Lho6Wq457iHx+ioR2fG5sfYKAYWZ3c3RuemFeb2FrdF5wanp5eW10cWV6Xm5sc21zWVldX2BpWk9WV2RiZXBwfodlXWloZmJncI1uY2hoZWhngHp3dG+OhXOBgoN8doOJhXiFfHiEhnqAiXd/i3x7c3mDampfcGh0f2txb21xZ29rZXthbX95d3Bsd3eJf6OYo6ihp5uIi4qBjpyGkpp0f6iUkY2HoY2WlJGBdHx2hXh4f3JzeoVscW94bIl2f4CGbnFbWX6SjYiAgYF2dYB/f6CGj4qSnJegkpZ3iX6AjIicnYqPhpKXloWIk5iOlouKjY6MnYqOkYNtiYuPkYqclqGcmZaGmYlsiKaFaImgjJOAjYWMgXiUmJKdkZCIiJONf36QmX2SjpGPm5N9i4GFcHZwbG5vcHyGanODj5mLcniAdYKJg3podXB3gpuQfYqGe5aTfHiKdnKMfYiPfIyIhYqPnKWJfIR2gYp+d3draH5/fltxcnFvb3daXnBhcGteb2p8enFubWptd2Bwb2txbllYYGBgbFdQUlllZWF0b4SBYV1rbGRiZmuSbmBmZl9maoF1cXJvi4B0f4OBeXaBi4B5hn94h4Z2g4V7houAe3eLf2pwY3xihXxvcGx0amhubHd3X3F+eXt0dXN/gn6llZutn6eXhYyDfpaVg46ddImek5KFi5uMlo6MenJ4dIJwcoR0cXWIbG5sdGyHdoJ9f21uVVGBq5SHgniAdnKCeYKggpCBkpKYmpGYd5B6goySo5qTjoiUmJKDhZWYipKLiY6PiJ2EkYt9coqFiI+InJmem5eWgZWAaYmfimmJo4qUhpKEinGDkZiPmo2Pi4uOjXd7k5F7kIyOk5eOfYl+gmx3am9sbG17gGJ6fpCXgnd7gniDjX16aXZtdoiXjICJiH2VknN7hnJ5j3yMj3yKf4WOkZ+gh318d4GKfHZvZ2l+f3Zddm5ta3ByVV1uYnJhX21ueXBocGZndHZpcWxhd2ZdVWVgX3FTUE1bZWNcd2+Ie15caHBhYmVmkWpfZ2RbZ299b2xxc4l9dnyGgXV2f4x5fIaAeIeDc4aFfoyMhHx6lXhncWqDYId+b29re2BpbXSAdF5zfHiGeHRzhXx5oZCasZylj4OKf4KZiH+Jm36JmJKOhIiYjo+PhHd0d3OAcG+EdHBxg29qaXVtgm58fG10c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWPnaGTk5CJkpqThX2VlYeMjYeSjYmcf46BeHuNf4iMiZycnJuWlHuOd2mMlIpui6aHlYqYhIZjjJGYjpSJlouMiYtwepWKfI6Ji5SSi3uHfYBtfGVzb2tte3pbgXqQkIF7fn+Aho97eml1a3SMkIuDh4Z+l41tgIBwgo6Ajol+hXyEkZabnIx9d3iCjndxa2RufIBpZ3NuZ2lzbFNeb2VwWV9scXdna2tiZ3l0cHBkYHhhYFVrX110T01LX2ViW3dwiXNcW2R1YGJlZY5jYGZiWGlzc21rcXaLfHN5hoJ2d36Lc4CHf3qJf3KJh4GQiYl9fpl2ZXNufGWHfm5va39ZbG55enJgdnp7jXZydol2eZ+MnK+boJCChHiHlH57iJuGhJ2QjoWMl4STj4iBdXdweXFvhHBtbX5yY2R3cHxteXxqaGxjpJrB3K7vonNsdoN1hKGEkG6Vj5Wfk5qAkXCFiqGWiY6VipCclYKAlI+FiI+AkoqKl3+He3Z/iniGhY2bm5eZkJB3jHdwiouOgI2nh5SLnoaGXouUl4qOiI2KioSJbHyXg36JhouTkId3h39/bH1keHVqb3p0WIl7koiGe39/gIaNf3pndGqBio+LhISBjZiHbYN3cImSg5KGgIR8gZKXlJuRdXR4h4t0cnBkcnZ/X3Jsb2FodGZSYHFna1VfbnN5YXJjYGl+cXNuW2NzYWNWblpbdkxMS2JlYF11coltW1xkeF5gZGWEX2NjXlhpcmtua3J3i31zdoSBeHh8iXGDhX19iHt0i4iHlYWMf3+Yc2h1cXlti3puc3CAV3F6dnlxZHZ5hoxodoCJcYCdiJmonKOShH1wi5N3eImbg4SfjY58lo1/moiFfHN3cHNqb4Fsamx8dF5gd3Z7cHR6Z2BlfOvatcnD3IlzbHSBdomZiIxol4+Pm5SSgYhwhYifjYWLlYqMl5N7jJKHgoiPepGLho+CgHd4g4Ryh4KSm5aTmIeNdoh/cYiFjIqdpYaXjqCEimGElY+GiIWIjIaAh2h9lIB+g4WLj4+DcoiAgHJ3aHZyaXV3bFqNfZODhn6BhIGEi4N3YnVtioKRjIN/gJSTf3CDbXqIkYiUhn2Df4GTlJGYim5xeYuFdGpvaW91fl1yaG1caXRfUmRxaWZTX3F2dGBwYF1ohHFzaldnaWRpV21XW3NLSUtkZV1hcXKFaVtcZXhdXmRnemBkX11Za25lbmpzd4p+c3OBfnt2eohzhYR8f4d2domFj5iBjIJ8lHZsd3Z5eJN0bnd6fFh5hnGAbmd4dpGCZHaGhXCKl4aaoZuiioZzbpGKcnaNmn2KmYiJfJ9/hJp/gnlyc25vZHJ+aWZsd3dbX3h6enFxf2lhZ2F/1baOkaZ4bnF3e3CSkIyFaZiNiJqQi4V6aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N8cYaAlZmNkpSCiXaFiHmGg46WoKKJmJKhgIlhf5SHhIeDiIx/f4JmfZGAf4CDjpCRf26EfoR1bG13dXR4dmtjjoKPgYZ/fYWAhYl/cGB0coZ9kI6DfYCSintyhWd7hYyJjoV9hoCBlZCRlIVub3iLfnRsbWhpeHpgZ2lpWGt1WVJpcmliUWJyeG1iZV5aaoRudGJcaGBlbV5uVFptTUdOZWNbZm1wf2tZW2JyX1xjbHZkZV1dWmxsYmxqc3aGf3Fvf3x9dHiGeIWDfYCHdXiJgJKVfImGd4mBb3h5eoSSb216gHZeg390gWxoenOUc2dyh3xxkpKEmp+boIeGdXWTfm11kpV9h4+Eio2afYyadn53cm9samF0fGdiaXV5WmB3e3ltcH5lZGhoV52PX3Jzl7zEhHVxlIiPfXGWi4abkouHcmmIjpWAe5WLgYSai3uKhnx6iYt/lIh1iYZ2d36BcnWFgZ2UhZSPhIRzgYp3h3+MnKCciZaPnoGJZn2Tgn+FgoiIcYF9Zn6MfHl/gImNkH5qgX6FdmZweXh0eHRsao+Gi4KLgXmDgYWEgWxfc3l7fo6LhnyDkIJ/c4NqeoWJjYiGeYV+gpmOkY1+bm16iHx1c21mZXt0YltwYlducVNTbnNoYU5ndXhmYF5dWW+Bb3RaZmJea25gcFBZalFEUmZgWWptbHtuWVtdbGJaYm92ZGdcXWBraWNranN2gYJwbn58gHR1g3qDg32BhXZ9iIGWkHiEi3WBiHJ4eX6NkG9veoBxaYF4en5tbHt1lWtqd4RzbJONhp+Zn5mFh259i3Vpd5aNfoCJg5WXinqQlm97dHFramRgc3poX2Vxelphcnx5Z3B5YWVkj7Gyd0tiWqXZ0JZxepCKj3d8k4qEmJCLhW5rhZGRenmShoGEmIl7hn93d4mKhJaAb4uIcXV+e2p5hYOlkIOTjYSAcICFeIZ8iZ+cmI6WkpaFiHB7k4J9goKIgm2BdmiAhXlygIGFi4h9Zn5/hXZkcXOAaXlwcHWZjoaDi313eYGEeoNrXHJ/c4KJhop+h4p8iXOCbnKGiJGHh3SGe4KajY6FeW5ufYN+dXljZmh7b15YdlpXcGxOV3FzZ2BLbHd0YV5cW1p1fnNwWGdeZ2pxYG9OV2dRPlhlXVluamd5cFpaWGplWWNweF9nXF5lbGdma2lxd3+Hbmx/foB1cIJ7gIJ/gn92gYSIl4lxgo1xe4Z8enmElIx1anl+a29+dH98b3J7epNvb4F+eGeSi4KhmZyRgoVmhoJvZ3mUiH1+hIKYiYF8jo1oeHNra2ZfYG94bV9ib3hcZGuCemBxdV9lZdTqvYsyOj6Ljn9xeYWHjYx1gpaMfpKNi35ta4SMjHV9j3+EgZSIe4J3bXWGhIOXd26IhWx1e3VmeYGDpouCj4uEfm6BdnmGfYmgk4+TlJWOjId/e5KGeH+DjIJrf3FogH55bnx8g4uEeGJ6hYJyZXJpf251cnWCnIyBgIaAdHZ/gXSCcFtugHV5jISLfIiBfol5e3JtioWShY10g3qAmIyLgHVuanaAf3RzW2dndW5XVnxTWW9kS1pycmVbSXF4b1xbW1lddX90aVpiW2hmb2NqTVdlUD1dZVxcdWVgdG9aWFRuY1lkcXlaaF1gZ21naWtpcHd9jmxpgoR/eW6AfH2CgIJ6dYKAjZOEcICLbnh+gHt7iJOKf2h6fWpze3KGenN2fX6MeXiEfXxri42Dm56Wi4GAbIx9amh+jYt6fX6DlIJ+fYqIa3VxZ2hiW2Jmcm5fYWtzYGhwiHlic3NeY2SboI9uXTZar7V0aYCIfJGGdYWVhXOOiol2b2uEgod0eYl4iHySh3l+cmZ1iH5+mG9xh39pdnluZnmHhKSGgIeMin9vgHiChICQnIqFl5OaioyFiXyQiHF7fYR7aH5saoB7emp7d4OIgXNgeIJ/cmVzZ3aDbnV8hpaSgn2DgXB4enx1gG1YcIB3dY2Dh3iIdoSJfHl0b4uCkoKHc4B+f5SJinxvbmltgYF0bVtlZHFvUFp6TltvW05bcm9kVUtzeGlXWVpaYXGBdWFeXWBnZGlpZk5ZZ01AYGNbYHVgXXVsV1dTdGBaZG9yV2pdYmhrZ21saHB3fJJraISKfXxvfn58goCBeneAf4qLg3F8h29yeIN/e4mMj4NqfXttdnh2inZ8eH+Chn+Dfn16bYSLh5ijjISDe3WKeGpsg4eQeH16gpGAgH6Lg3BycGNmXllmX3BvX2Bnb2Zqbol0YXRvW2FkanV6gL+cpqTIuHGFgnKSe3eFkoJzkIuHcnJvg3qDc3SHdId3k4d4eXBidod6gJNpcoR3Z3d1Y2p8goedgYB/jo9+c4F1h3yDlpOGe5mQl5CIgol7iYlreHl+dGd6aGt/eXNpeneBhH5oYHiJfmxrdGh8gWl2goySlX98f4BxfHd8dIBiVnh+c3SLhYJ9hHKIinl5cnGFg4+AgHp/fnePhoR3anFobIeBcW9cZmBxbElkdUtdbVVTWXNuYlFPdHhhUlhYXWFwg3NcYlxpZWVka2RRW3BJQ2NgW2NvXV14Z1RWVXZeW2VuaFZrXWBqZ2Vubmhwd3qSbWmIjHl9cnt+eYKBgXx2fYOIhoNvd4RybneCgn6Ii5N/cIB8d3h6gYx0gnh/gYGChHqAdW9+ioubnod9hXl3hXpndIWLkHl+f3uIhYR3kIBncG5fZFxYZFlscmFgYHBsa2iJbmBzaFleY25/d6naqceGh7JxiHdvjHR6hY1/eZKJf3Rzc312f29xf22Ec5OFeHRrYHmCeYmPZnKEcGh1blttfX+Qkn+AeJGTfnl8b4p4hJSOh3eZjZOQiIaFfICFbXR1fmxmdmRte3Zua3d3gIB9YWN5h3ppdnZjfnxodYePjZZ9doF3cYB7fW6BWld1f3B2hYh/gHptiod1eWx2goSFf31+en10jIJ+dGh0ZW6Kg2xyWWhdc2RGbW1LWmFXVlV4bWJQUnR2WFBWWF5gcoRvXWFjbWVkXm9jVFxxRkJlXl1lZ11bemJRVVt0W1pna2BWal5gb2Zma3FocHZ4jnRrjo11f3Z4fneBhIF7dH2DiIeDb3KAdHF1foWBiY2Le3eAeIJ7fIWHd4d8fYF9hIB7fnJ1eYuNoIyIeYh2dIJ4Xn2Fl4t4hYN0hYaEeIp7Ym5sW2JbW2BWaXNiYFtnbm9mh3JhcWVXXGJrf3zKzoe5oWptbYlrcYNxe4OJfnqQhHl4c3h0dHtqbHVig3WRgXZuZl99gnqMimVygmtqcWNYbHqEm4iBgXKWlXd/fXCLc4WNj4p0mpCSiYaLg3t5fnFwb3xkZ3BhbXhxa21xeH5+el1me4F4anZ5ZoN3aHSIjI6WfnOJa29+gnlvfV5ZdIBtdIGLfIJvcIqAcndpeIGCgYN4f3N7dYh9e3NncmFui4BrcFZpXHZbR21qTVZVXVNVe2thT1R1clBRVFdeY3WFaV1gbGpmY1pvYVhib0dBZ1xgZV5cVntdTlVkb1laamhdV2dgX3JmamhyZ3Bzd4Z4bpWLdH96d356g4h/dXJ/h4WOgnBwfHh2dnqFhYeMhnp7f3SKfX2GhIOHf35+fYZ+fHl1eHeRk59+i3yKbXV/eGOChpWGc5GKb4WFgXuEdWNuallfWlxdVGdzZGBYZHFyZ4ByYmtkVlpfan94vq57n7ZtYXOEZ3N6cXiBhXp9i353d3J1b3t2ZWpuYIZ1joBzaWFefnl5i4RmcX9oa2taVm93iaKAhH9wmZNygXp3hXCFhZWLdpiLjomFiYV9eXRyb2h4X2lsYG12a2hra3l4e3dbZ359eWZzfm2FdWV1ho6Gl4BxjWhre4R1bnZjXXJ+bHV9jHuCZ3aIfm9yaXeAeoCBdH5te3yDe3hxZmxhbYl9a2xVaV92VUppak5STmdMWHxoYU5VdWtMUFRVX2d2g2deYXFoZ2JYaV1ca2dKRGpZYmNWWVV5WU1WbWlZXWtkXFlkYl50ZmxkcWdycHWBd3CZhnZ/fnd/fYWHfXVzgoiAlIJuc3l7enRzhIaJiYN5gX51jn58hIqNg4KEe36Kg3t3fHd3mpyXeoiChml2fHtsg4OSf3KOgXGGgn+DgHBmbGZXXVtcWlNkcGReV2JydWl1b2VlYldbW2h/cG9ygHOJZGR5fGhzdXNygYN3gIJ4dnJ1bWp6cWFna2aGc42DbWZdX31we4l/aW14Z2pkVVdyb4ylfIR7dpaRdH10fn1wf36UiHmbfomHg4eDfXVwcWxndFtrZ15sdGRoZml6b3xyWmiBd3VpcYF4gndid4aLfJWCcI1rbnuDcmd0ZmFve2dzeIp8fmN3hHdrbHJ2fHJ8e3V/aH+AgHl3b2RmYm2Fe2xqVWhhb1JKaGlPS05vR156ZmFNVXRkSk9TV2Frd39mXWd0aWZgV2RXYnBcS0tqV2NhVVRVclZLWHVkWV5rYFtaY2RfdmZtYnBpdG9yf3V0mYJ3f4B3f3+GhHp9dYKEfpeFbXJ0fHp1cYSFj4GAeot2c5B/fIGVjYCFhH19jIZ6foF3e6OlinmHhYNrdHt6dYKAi3luhHN5hH2Cg3ZvamhlVl1bWllTYm5kW1hhc3tqaGxpYGJYXlppf2lrcIBnbGBneXdpcnNzbIOAeX57dXRtemdpeWpfZW5ogHaPhGZlWGJ3an+He29qcGdmXVRYb2eNp3aAenyQjnp2cYBxdXh8k4N7l3aGhICGiHZqcnVnZ25bbGRdbXJfaGFqeWh8bVtug3N1a3CBfnp4YXeGhXmRhnSJcnF6gXNjcmpdcHhlcnSIfHljdIFxZ2p6dXNtenl2eWWEfIB5d3FkZGNte3xqalRnYWVTSmtmT0dRakVheGZhTVNyXUpOVVllbHh7Zl9ucWpkXVZhVW5uVkpTZ1dlXVhNVWtUSVt4Xltfa11dWmJlX3lobGFvb3ZucHh1eph+d3+BeYCAh4Z6eXqDfoGTg3F0dH96d3SEiJF9gXyRa3KVgHuCn4V+h32AfoaCgIl7d4Srnn96h4eCanKAeXWAfoB0boZufYBzioBqb21kZFlfWllZVGJqZ1taX3WCaV5tbFxhV1tba4FlcXR9aWlcanZ0ZnN2cWuDen18eHVybHlmaXdmXWRyZ3l3koBiYlRlcGiChXh4Z2lqYVdWWWdijqdvfneAi457cXJ/aXtxfY9/eZFzhX6AgIZuZHZyZGdnXGphXW9vW2hfbXVle2hedYFvcmtyfH51dmJ1hox7iYiCgXlzdoB2YnFuW3J0Y3FyhXx1ZXOAbWFte3Franx7dnNnh3d7enZxZWJkbXJ9aWpTZ11cVEtxYVBGVmBHY3ZmYUtTb1hLTVhYaGt2e2VlbnFnZFpYXVh3ZVRKXGJXZ1dZSFdkT0dheFpdX2xbXlxhY15+aWpgb3R4bXBvdoOYenKAgHx/iYyGfXZ2hniHjHxzdXWCeXt6goyOfH6FiWlzloF6ipx+foV6gXt/fYaJc3GPrYt7e4aPfGVxh3lzfHp1cm6FbHt+bI96Y3BvYmVdZVZZWVZjZmtfXVxzhWhYcG5aXlhaW2t6YnB3dmxhWWxycmZ0dW9rg3d+f3h2bW5zZGh0ZVtndGV1dpF5XlxSZmdrg4J0fmJkalxUV11hYo6kaXhzg4aReW5xfGp6b3+JfneLdIJ5fXmAaWR2bWBmX15pX110a1lmXW9vY3plXHh9bG9vcHh5dHVlc4STgIeEinx4cHN+dGN4ZVxxcWJxcoF8dGdzgWVfbndqZWh7fXVvcIN2dH1zcmJfZm1ufGRoU2ZXWFNNdl5QSVlXSGJ0Y2FJU2xTSk5aV2pscnxkbW1zY2FaWlthd1xTS2NdV2hTVkZYX01GaXVYXmBsW1teYWJdhGloYW54eW1wa3aAkHltgn6AgZOIhIF2dIl0jIZ0cXZ1gnh9fX6MkH9+lH5wd5WDfZmSeYCAeHp9f3SIhHRwmaB6en6HlHdjdId4cnd0a3Rvfmt4fHCRc15wb2BnYmxUWlpXaGNtZlxccYllU3FuW1pYV19rdmRpdWppXllscm9rc3NyaIR8fn97dm5ta2RpcGNba3JkdHaOc1pWVGVhcoB/coJdYmNdU1lgW2OQn2VxcYWEknVsbHtvcHJ9f35zgniBdHt6emRldWddYllgZ1tedmhXYl1waWF4YVx8dmprcm94dHN1aXGCloSHgIV3dGtyfm9neFhdbG5jcnOAenRncH5cYHFzY2Frc4BtbnZ/c3J4a3BhXGVsbHpgZlJlVFdRT3VaUE9YUUhjc2FgRlVqUUpRWlZra2t9Zm5vcmJbWlhZbHFXUlBmVlZoU1RFWVtOSHF0WF9jbGJYYGBgXYtqY2RtenhscGl1eYd7a4N9gISafIOEeXyIbo+Hcm52en10goJ8i4+Cg5h0eIGThYGeiXWBgIJ0f4JxiIN2cKGWc3mFioZ6ZHaKbm56bmZ4cHlrcnZzjWtedG5hZ2VrUl1bVWdhbGtaXHGMZE9vbVxWV1RmaXNoYnRlZFxYbXRsb3V0eGqFfH97h3aPc2Nka25gXG1tY3N4h2tZVFZjZHh9fXGGXWRfY1RaX1hilZVjbXCDhYp0a2l8cGd1eXZ+bXt1dnB7f3VfZnNjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXRxdHF1d2tthZSCiX2HcnNocH9xdHBUXGdrZnF0gHZzY213VmNzbFxgcGh/Z254fnNzc2ptYVpkaWp3XmVTY1RVUFNsVlBWU1BHZHJfYEVXaU9JWFRXbmllfWlseGxiV11VW3RkU1JXaFFYZlRTR1lZT013dVpfZWtpWWFgXV6ObmJma3l2bm9pdXaAf2yDgH2HmHuAh4CJf2uTiHJmdIB7dYCDfYmPf4yTcnyKkYSHn4Z7f4aNdIGGc36Cdm6ki3KAjIp2dmx5i2Bke3BmeXN4bG1yd4NnZHtsYmZnaFNfXlVnX2tvW15ujWhNaWxgVVZTbmZza2V4ZWRcWG9za3F6d3Jrh3p/dpx6eWthZWxtXmBuamVxeH5nWVZYYGx4fHtwhF9jXmdWWF9XY5uIYmtwgYd9eGxsem5deHNufWt2dG9wfIFzWGpuX1lcVWFiV2RwYlNfYmliYmxaYX5sZmx0dm9td3dsaYaNgIp8iW5yZ3F+bnRuZFthaWlvdIB0cl9pbVNlcmVWZHBkfGVzeH13a3Bta2BZYWZndFxkVWBVUk5XZFFOW05PSGRvXGJGWWlNSl9LWW1kYHlpbn5lYFVfVF11XFNSYGZOXGBVUklbWFBZdHVdX2VraFhiYFpejXFjZ2p4cXNuaHZze4NygoN6iI5+fImHjXlukIl0a3OBdH9/iIWHkoSWj3l9jI+HkZuEgHyNhXOAgXN0eHNvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fn5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY2NjY2Njo2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6OjY2MjIyMjIyNjY2NjY2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmOAvru7u7u9s21mZ2dnZ2WQoaCgoKCjgGNnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fW37IxMTExMa7Z15fX19fXZClo6SkpKd8XF9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJjJKRkZGRkZCJiImJiYmJjo+QkI+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk4+IjYyOj4iPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6Mi4uLi4uLi42NjY6Ojo6NjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCRioeOi4eNh4qQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJGKhIyLho+GjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+Nh42GjImJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4WHh4aIhomPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Ki4yJjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn19f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn9/f35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhYaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Qjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX1+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f39+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f4B/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX1+fn5+fX5/f35/f39/f4CAf4B/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39+fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f35+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+BgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUlBRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3ent8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9PT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTk1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NS09STllwcHJ3eHd3dHR0d3p8fn1+fn5+fn5+fn5/f4CBgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT09OUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFFUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUFBQEJBPzs+PD4/Pzw4OTg7OzpAOjs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4ODo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7PD9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+Af4CAgICBf4GBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozw6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0JDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkVISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dnd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/Pz48PkA/PT09Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxwcHBxdHV2eXx8fXx8f359fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQ0RDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHx8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkRAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHREVHRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRWVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PUE/QURFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gIGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRklISUdISElHRkJERkREQ0FVdIeJh4eGiIJXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent+fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4CAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLS0tKS01KS0hIRkZHRkVQbISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZHREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9f359fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTUxJRkpVbIGGhYSEhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lIS0xPTk5RTlFecoGFhISFhYaHh4iIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7PDw+QTs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSExLTlRne4SEg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc4ODo7NzY4ODk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSERCQDU3ODg9OjxEQkRGRkRWeISEgoKDg4WJioqJiYqKioqLiYqKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NzY3NjU6Ojs6Ojw4OTk5OTg3Nzo6Ojg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BRV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBPzw6NTc5ODk3OkE5PEQ/UH2Eg4OEhISGiYqKiIeIiIiKioyKiYmNej46ODg7PD0+OTo7PDg5Ozk6Ozo6OTs6Oj49PT87Ozs9Oj48Ojw7PDw9Ozo6PDg6Ojs6OTk5PD88PUFCRElKTEtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj87Ozw6ODk5ODk5OTk6Pj0/P0N2hIOEhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUFCPkBDQUA/PT4+QD8/P0A/QD09P0I/QUE/QT89QUFAPz9BPD48Ozo7Ojk7Pz06Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODk7OTo6PDw6Ojo8Oz0+QD89YYWDhISFhYaJiYiHhoaGh4iJiouLioqKi4mLXj5ER0lLSkpGR0dERkhHRUNAQENFQ0NBQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj4+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3OT06PDs+PT4+Oz48Pz9DPkp+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRUNERkdGRENGR0VCSElLR0hHRkdHRUtKTElKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgH9/gIB/T0E+PT9ETEtAQkJBOTc7Pjs8Oj0/Pj88Pz5CQUU/aISChYWHh4iIiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtGREdISElFRUlHRkVMTE1JSkdHSElKTk1PTUxOS0hGR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/f359fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6PT88PT0/QENCSFN+g4SEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExJSEhGSklESkhHS0pJSkhIR0tMTkxMSEhJSk1QTk9OTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVb3F1d3h5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6Ozc8PTo8Pzw9PUBCQ0RMbYSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4teUlJQTU5NS0pHRkNISkdMSkdLT0xLS0pMTUxPUE5ISUtMT1FRUFFPT0pJSkpNS0xGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl7ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgICAfn9/VUVDRUVHR0VEOz9BOz08OD89PT5ARUQ+Q0RDRkp1hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtLRUZGS09OT1dWUVBPUlNSTVNUT01TTFBTVVdSU1JQTEpNTU1MTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz08QT9BQURUS0JISUZJTHmGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBLOzpRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFFRS0tLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0ZGRT8/QUBFQUNGRENES1ZQSlBQTk9QeYaFh4aFhoeIiIiIiIiIiIiIiIiJiJScjIqKjH1hiouLh2xbZFU6WFhYU1E+QFZVWVxkYFZZYnJeXVZdWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01LTEpJSUxNS09NVHB0dnh5eHd5eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1JRVFZVVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJidHN2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWVdXV3prWFpcXF5TUFBPSU5PV1ZYWlplcXR3dnR0dnh5eXt7fH19fX5/fX59fn19fn9/f3+AgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU09PUU9RVlFTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JVUk1PWVJOT1FTVVVNUVNSUE5MS0hDSUdSU1RZXW1ydnd1dHR3e3p6e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f4CAfnt2c3d9fn5kdX1pcXRgZF1dW1lVUUxITElhbJJ0UFFTTVFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQT9EUENDQEM+QkhHVkBITk1HXWlRSEZPRkVGRkhHSEJDSEdISkdEQUFDQE5QTVJkdHV2dXR0dnl8e3p7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojo+QD8+Pj5qUEthRUZISUVCP0dMTUdNUVVKQkU/Pz09PD09Pz0/QUNCPz48PUI+SU1GVW91dXZzdHZ4e3x6fHt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVlVXUVFXVlBYW2JdYWdtbWxuamhgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcT3tOT09OS0xNT09QTEtMV05JR0FBPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx9fH59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJUVlhTUllUTllaW1dZXF9eX2VfXV5xd2teYGdrd29vbGpvbW5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FWUE1JREY+OTk2NTg2OTc5OjM2NTc5NTxCPWZ0dXd4d3p5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRUNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fX1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdTW2ZKTFBSUk9NTU5NTUxKRVBQVVlTVE9KTk9VU1NcVlJVU1JOTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVhxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFdZWVlSVU9JR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlAUT1jYFFTUVBNUFBPTk1MUE5UUlBSTElMS09SUFFSUlRRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVlFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjRAPmpvYVJSUUBHVFBPUE9RTlFPUE9MSkxMT1BOTVBRUU5RT0pMTU1LR0VFQ0I7PT08OT1HNjY3NkVucXV3ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVVlZVlFRUU9APjs9P0BCQUM/QkVEQUBHSEdIRkZISk1MREdDT1JDOEVNU11nU1FTQUdVT09RUFBNTU5MSkxLTE5PT1FMT05NSUxLSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PD1BQEI9PUVIRkRGRklHSkpARkFBQEZHRElPSFFSYVxRUFJPU09PT0xNT01LTUxNT05bVktNUU9HSUhDSUtMTEtGRkZFP0JEPj1CRz9CP0BkcnV3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRUpFQ0hHSUdJRUJCPz48QkFAR0pFTU9iZVBNT01WS0xOS0xNTUxMS05OU2RNSkxSSUlJRkJKS0xNTkpHSUZCQkJAP0VGRUhETG9wdnp5eXp7enx6d3N4dHh8fHl6bnFxbW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPSEtFP0I9OTk6Oj9CPzxBQkFBREVHS0ZESUlHR0hDQz9CPj9AQT1DRURMTVFUTEpJTVRGSUlKTElKS0lJTE1PUFJQS0dDS0hDQ0tKTE5PTklKSUdEQ0NESUpNTElac254eXh6ent5fHZycHVydHl5dnhqcW9rbGxudHRtc3Z7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGR0hHSktJSkxER0I8Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHSENDO0FAQj5AP0JERElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJISUROR0JFTEtOTlBOS01KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnp0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGhlcEZKQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREA/QkNFRUlGSkpMRklJR0ZGREI6QUNDPj9DQ0NFR0tNSEpOSERIRUlMTk1ISUxHRkZJSUxOS0lIRU9JQ0dOTU9NUE5OT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZ25saGlrbHRtb3V0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjs7Oz47PT9DQj9BQ0ZHSkdKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRUZHS05PS0ZISUZFQ0RJSUhLSUdIUEtESk5MUE5PTk9QT0pKSU1SVVVST1hlYWFtZnByb3J5emdlaGhjaWxmcWxmbG1naWtsc21wd3V0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFRkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdKRkpHSUdGRkZEQ0JBQUVGQ0JCQkRFRUdHSEZMUExITkpKTEtJRkhFRkVDQ0hISEtKR0tSTkNPT05RUE9PTk9QS0tLUFVXVlVUWWBfXWlhbmluaHJzYmVmZmRoaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxc2trc01HR0VHQUJAREU8QUFAQzw4Oj0+OkA9QENAQEFERklFSEZGSEZFRURDRUJESUZDR0VBRUdFRkZHRUlNS0hRTUpLSEhJRUZISEVDSUlJS01LUFNORFJTUlFTTlBNT1BNTE5TV1ZYWVdZXltdZGBpY2ppZ2tfZGVmY2hnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJFRTxAQ0JEPDc6Pj47PjtAQj4/P0NFR0RGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01KTEtISktGSUhKSEVLS0xMTk9SVE9IVFVUUVRQUk1OUk9NUVdaVlpZV1teWlhhYGBgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURCQ0hFPUBFQkQ9ODo+Pj08PEJCPUA+QUJGQ0VDQ0dDQ0RERkdHR0lGSEtIQ0lIR0lHRkRIS0lHSkhNS0pLTEhLSk1LSU5MT05PUlVWT0xWVlRRVFJSTE9RUE9UWlpZXFpaXWBfXV9jX1xiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUxJSkhKRkJER0U9QUdEREA6PD5APz4/Q0I8QD5BQUZDRURER0RFREZGSEhGSEdJS0pFSkhIS0hFRkxISEhKR0xLTExMSU1KTU5NT0xQUFJVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYF9hYGJmXWRgZmhgZWlqZHNzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3c2d0cmtxcmtyd3B3SkpLSUtHQkVERTxBRkREQjs/P0FAQEFEQUBCPkFDSEJFREZHRUhERkVJSEZJSEpNSEhKSklMSkVKS0hJSkpHS0pMTElJTUtNTk5PTE9RUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFiYGRkZWJkaWJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV1ZnFza3BxanJ2cHdKTExLTEdDQ0FFPEBFRURDPUFBQ0JCQ0VBQ0RBQUVHQ0dHSEZFSUVDR0lHR0pGSUxISUpNS01MRktJSEtLTlFLUlBMUkxKTU1OUFBQVU9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY19hZmNhYmhuaGJpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRxd0xNS0xMR0RBQEQ+PkRFRkM/Q0FFRERGQ0JFR0NCSEZCSElJR0hKRkRLSkdISkhJS0dKSk5LTkxJTEhLTEpaZkpkW0psUkdOTV9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbXpmXGx0YGxrVmB3dmlqZ2hmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3J5TE5KSkpGQj9AQz88RERGRENDQ0VFREZCRUZHRERKRUVJS0tJS0xHR05KSEpLR0tKSUpKTkxNTUxMSU1NTFtzYmRvXWxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9ccHZncE9Mcnl2a2Fha2VlbHhta3Zsbm9zcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd5dnR0Ym11a3BwbHJycntLTElIR0VEP0FBPz1CRUZCRUNFREVFREJISEdEREtIR0tNTUpMTEZKTkhKS0pJS0pKSUpNTU5NTU1LTk1NW3Jwb25wcGtqTE9QbVhOaWJ0cnBhbW92XFlsUFttbVpxbWtwbHh4dHNpcF1gc2xxa1V1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRURCQUI9Pz9FR0JHREhFRURCRklISEVHS0pHTUxOSkxNR0xOSU1LSElNSUpJSkpOT05OTUxOTUxcaGR1XWxxVmtNT1FuVVprXmtsdmFsZHRUZWNObFlsXHRvbGpseGp3dWhvXWBza2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cnNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1GSUVFRENBQjxCQEJGQ0dGS0dFQ0NISkhIRklMS0ZNS0tSUkxITU1JTkpJR01HSkpISU5PTU5MSk1NSlp0cHBvcXFsak9RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xc29vdXN0dGpbXnRjd3hyam56aGFhY2ZhYmptdHVwc3R2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXVwbnNzdnRJS0hKQ0RERUBAPUNDQUZDSElNSEZDRkpMSUdGSk1MRk9KSldSS0dLSkpOSUhJS0lLSklJS0xNTUxJS0tKU2tiWWleXmlicnJaX1lqb19lZVVrX2NbYWFRYG1oXGpcbmlqZFtvZWRwXFpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRkpERUNGQUBBRURDRkJISkxHRkNGS0xJRUZKT0xJT0pMW1FKRkhIS01JSEpJS0tJSElHS0tLS0dISklLS0xKSUpMTVNbXVRQVU1RT05PT1ZRT1BRTk9RSkpOUFFkcWlUWVZbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzSENFR0ZGQEVDP0NHREZHQ0lLTEdGREdKTEhER0lQS0xPS0xXTUlGRUdJSkhJSkhMSklHSEhKSEhIRUVLSEhKTktIT1xWXU9dXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZFxhWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRQQkNETE1BQ0NCRElFR0dGS0pLR0VFSkpKRkVISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdGSkhFRkdFRUpGQklMSUpUX1lfWGBhW2BVWFpUXV5aX1JZXFBeXFlOX1xeU1teZF5aXWBjX1lfYltgXltVWVlaX15jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXp6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURDQUNGR0VHR0lKSklJREZLS0tFRklJTkpOTEhMTkdIRj5IR0xJS0tKS0tJR0VJRkRERUJGSkQ/SUtITlpiWV5eYV9SVFNXX19cXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmFiY2NlWlJaV1ddWl1kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WVFKRkNHRUJESEhGR0hJRkdKR0hGSEtJS0RESkpNTUxMSEpKSElHQEdGTkpLS01LS0tJR0lFRUBEQUhJQT5ISUZPXWBaW2RdX1RRUlhdXFxcX1tLV1xMUlxZSU1eUVFdX2JjY2NjYlxkYmFkY2ZYUldVVFxYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoaGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0VLSUZHR0lHR0pGRkZJTEpORUNKSkxOSkxJS0tJSUdDSEhRTUtLT01LS0lISEZFQEVCSEhBQEZFQ1NdWV5YX1hfW11VWFhQXVxRS0pWXlheW11WWmFSUl9fYmJgYGJiX2NiYWRkYVhQUlJTXFNcXV1eXl9fX2RpZ2xrbm5we3t8fnuAgoOEhYWFhYWFhISFg4SFh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTEpMTEpJR0RIS1FPTUxQTU1LTElKREVBRUNIRkFBRkNBVVVFXFReU1ZgWE5UVU1ZWkxKS1RgYVtfWF9eYl1PWWJcYGBeYmNhXWJhV2BfVVFQUVJZU15cW11dXmBiZmZmbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJU2NRRVdfSUdHSERGTUpQUEZJSUpLTkxMS01MSkpHRUpOUVFOTlBNTkxOSUxCRUFDQ0ZDQkBDRD9MR0NMTE9PT01GTUZGSElHRkxLTU9QSUxPUFBTUExRVFNVWVhXWVdXY1ZOUlRQUVBPUVZUXFlZW11cYWFlZmRoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtOXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BTU05QUE5PT09JTEZhRUReTERmYkNMWkdeXHNtT0xWbllLQ09fVGtWZ0ldV1VeRExRVUxNU1ZRU1RYVlRYVFRcVE9lWmhoZVpVa1RYV1VbXFtgYGFiYmNhZ2lnbmxocnp9fX6Bg4SEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFTFBUSktHYFRISk9KSU9NUlFLTUtMT1JVUk9QSkxOR0lNUVtZT1BQTlBRUEpLUX9RSXxZWXJzV1BtR3Fub2FWUXFxdE9CanNucXNwU29fW25YXVZcWFVraFVdVmNZYFlaXlVVV39pdHV1YGF2X1liXFxmW19hYWFiX2FjZ21vbWBwd3R4gYGCg4OCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT01RVE5PUVBMTE9ITlBTW1pUUVJPUFBRTElaeF1UeGRoWFJTUHZmdGxwYm5ma1JyTkx3bWpycHNycXJwb2+AXWV6dXhxcXpxfnJ9a3V9YVJofGVzc3Bzc3x9cH54b39yYGBgYmJbYmFobG5rYmxmZ213foGAg357eHeAdHZ6aXF+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRE1NSEtLSEtQT01OSk5WXllVTFFTTllZTFNTU05MUElSUlRZV1dRVFBQUFJMSGd4bGN4cW1aSktUeXB1bXVibnZQZGRIZXZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGhuWHV1anZ1cYFhc2h9aWx4fG9fX19jYlxfZGVnamplZ2JjZGxscHBzdHNzc3lxcnhibXRncnl7c3N1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFFIS0xKTFFPT09NUFlgWlhLVFdQYV5SVlFZU01QSlNUVlhXV1BVUE9OUkpMcm91dXF1cWNoYFZuS3FwXkdoeVd2VEtoeH13YHl7c21gXW1vZFNncnVubXlwd2t1c3RxbG1cc356a215fGx1bnxrcXd1eF5fX2JfXmBlZGlnaGZlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUpNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRXV1lXT1NPT05RSVJtSGl3S2BkdnZUVmxObmx7cmFqZ391VEtWa2d8bG1sd15acHp7X2B6c2Nyb3hxZ2N8aXJ7XVRLbF92dWxqdnx7bn95bHxwXV5eYltfY2VlZ2ZlZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtnbG1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTExTU1JPU1JYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FLSFFOUFVMS0tSU1JRUk9WVVFRT1JSWFhQTU9VVFdYWFpaVFFSV1tXV1dbT1JUV1dYUV1YVlxVVE9YUldYWFlaYFxoc19cW1lcXV9jWl9kZGVnZGRjYlpkYmdmZm1ubXVmZmdjYGZeXWdgZGxnZWdraHB6aGdna3VqaGhpbFBJS0tMTUtKVFJOUlFQTFZVVFBUVVhVWlZSW11WVVRXVVlYT09MTldUUE5VU05QTkxRUEtJUVFLUU1KSk9RVFFQUVNSSkhNT1BRUVBQUFNVUlhXXFdSUlBRVVVWU1pRTlJSV1RTWFVTWFRTUVVUVVZZWVheWl9hXVxbWlxcYGNcXmJjZGdlZWVjWmBhZGFiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVJNWFdVVFZYV1daVlNcYFZXVllVWFRRUEtPWFNQTlVQTVFPTFNQTU9VU05RTk1OUVNQVFBRVFROS01PUlRUUVFRVVZTWFpbWVJVUlRYV1ZZXFNPU1RXVFNZVFZYVFJRV1ZWWFxaXGBdVllfXV5dXF1hYV5bYmNjaGdmZGNYYGBiXmBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMUFVQUFRRT1FaWVhXWVtaWFlWXWpkVlhZWldWU1RPS09WVFBPVFBQUU9NUlFPUlhUUVFPTU9SVE1XUVNUVU9NTlFUVlVSUlJUV1VaXVxaVlZRUldYVVtbVlBTVVVUVVhTV1hUUlFYVlZbX1tfYF9WX11eYF1cYF9fX1pjY2VoaGVlYlliYGJeX2ZkY2BiXVxcXFxZWltYW2JcXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVlxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVdTTU1ST1JST0xQU1JVW1VUUFBMT1dVUFZSU1JYTU9QUlVYVVRUUlRYWFteXVxbVlJPVVdVW1pWUVNWVFVXVVNYWlNSUVpXV11fW2BgYFZiXGBhXWBiX1xgXWNhY2hpZWdhWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcWmBeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVVU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFJUVFlbV1VPUk5SV1VSUlRRUllPUVNUVltWVlZTVlpYXV5cXF5WU05UVlZbW1VRVFVVV1hSU1lbU1JSXFhaXl9dYmFgV2JbY2JeYWNeXGJhYl9kZ2llZ15cZGBhYGFjZF9iX1paXltcW1hYWVdXWlpaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSWFJUUFtdXl1cYFxgVVxcaGpyfXNsaFxVWVdRT1NbU1JRU1JVVVVLUldWWlpaU09TUVVVVFJOVlFSWlJUVVRYXVdYWFNXXFheXVlaXVVVTlZWV15aV1FUVVdYWFNWWVtUUlZdWV1eYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVnX15kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JbUFpVVldWVFRUXl5gX15iXGBVXV5ia3l1bX5sW1VaVlFRVFxUVFRVVFZZV0xSWlZcW1xSUFVTV1VVUk9XUVNXU1dVVlteWFtZVVpeWF9eWVxZUldSWVlZX1lZUlRVWVlZVVdZW1VUWl1dXmFiYGVkXV5dXWVhYmZkXl5kY2BcZ2VoZmViYGVhX2FhYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXVVXWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2lZWVpUVlRWXFhXV1ZXV11YT1VcWV5dXVRTWFJWVVNRU1dRU1ZUWFhYXl5YXVtWXV9YX19YXFZRWFRaWlphWFtUVldaWVpXWFlZV1ZdX2BfZGNiZmVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtaWlpdX11UWV1VTlRaVlRcVVdXWVdWXGBhYmNhY19fVltgZGFfenVwaVpcWlZYVlhbWllbWVhZYFZPVV1bYGFcVFVZUFRWVFJVVVFTVVdbW1xfX1pfXFZfX1ldXlldVlJYV1pZXGFZXVVWWltaW1paWFpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkZ2BoXmJiY2FhYF5fWVRbWlpbW1hcWFhcW1pbV1daWFhcW1xgXVZdXVNPVlpWVlpWWVZYV1heYGJhZGFkYV5ZWWFkYmBrZmhfXV1bV1hZWlxcXF9bWltiVlNXXl1hY1xTVllQVlVVVVVVU1VUWF1dX2BgXWFdV2FeW15cW15YVVhXW1pfX1peV1hcXFxdXVtaXFdaX2FeYGRkZWZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpYGdeY2JjYWFgX19cWFlaWVpZWFpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWldXWllbXFhXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXV1YWFxbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVVdXV1ZWV1ZdXV5hYmFfYl5ZYV1dXlldXVlYVVZbW2BeXF9ZWV5dXl5gXFpaWVtfYl9jZmRmZ2ZoY1plZmdpZ2NfY15hZmVaaWljZmljZl9iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdZVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhYXFxfXWBfXVtgZFxcWFpiZWNhUlxZT1hWWFlYWVdZWmBeYWJjYGFjX1xiXV9dW15dWVlUWF1cX19eX1taXl5gYmJbW1dbXWBiYmRmZGdmZmhlXWVnaGlmY2FiW2NnYFxpaWNoaWZlYGJiY2FfYF9dXVxZXFlYV1hZWVdcW1pXVlhQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYmBjYmJdXVtaV1hqcWBcYF9dXGFjX15ZWWNlZGFUX1pRWVdbXFtbWVtbY2BjY2NgYmRhYGNeYFxeXl5ZWFVbXlxcYWFfXVtgYWJmYl5bU1xfYGNkZGZlZ2ZmZ2ZfZmdoaGdkZGBbZWdeYWhoY2loZmNgYmFjYl9fX11dW1pbWVhYWFZaVlxbWlZWVk1YWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl6e3t6ent6enp6enp6ent8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXp6ent7enp6enp6enp6e319fX18fXx6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09PPxMXFxcXFx9LU1NTT09haJSsrKyoii9vS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk5eDU1NTU1NTW4+Xl5eXl61QTGxsbGxCP7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5enp5endvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4ODg4KCg4ODgoOEhISEhIOEd3Nzc3NzcnyFhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnl8enp5eX15eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5eXl5eXl5eXl5eXl5eXl8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2en16ent5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fnp5fXh8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3h5fXl8ent6d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eHp6enx8fH17fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3l6enl7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHl5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veHl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qKi4eHh4SDgoGBgYGBgYGCgYKCgYGBgIGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHg4WCgYGBgYGBgYKBgoKBgYGAgYKBgYGCgoKCgoCAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uHjYmIiYWEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgYGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYGCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoKBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGAgYKBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fX18fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIjIuIioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoWDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39+fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioeIio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSkpCLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCgoKHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCg4SDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aGhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIGCgoKBgYKCgYF/gIGDgYCAgH+AgoKCg4OCgoGDg4OEg4OCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJGPi4mHgoKCgoKCgYGBgYKCgoKBgYGBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDgoOEhYSEhYWEg4KEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiIiHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgoCAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoKBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eHh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKDgoKDhIKDhIWFhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDhIOFg4GBg4KDhYWDg4OEg4SDg4WEhYSEhIGBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoGCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYGAgYGAgIKBgoKCgYKCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGBgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoaGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOAgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOBgYKCg4ODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhYSCgoKDgoKEgoGChoWDhIODhISEhoWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhoWFgoKBgYKDg4ODgoOCgYGCg4ODgoKCgYCBgICAgICAgIB/gICAgIWFhoWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4OEhISFhIOCgoODhIODgoOFhIWHiIWDgoB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHiIaGhYSDhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH+AgIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChISEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4ODg4SJioeHhIWFhIODhYOFhIODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoaEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoODhYmKiYeFh4WEhYWEg4WEg4KCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJh4iGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDhISCgYGBgYGDg4SDhJGSkY6PjYuHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWGiIuKhoWGhIKGhoKAg4ODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4OEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhYWEh4iFg4GAgIF/fn2Cg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIGDgoCAgICBgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fnx8f4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f35/gIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCBf3x9fX59fX6AgH59fn57fX6Cg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB/fn9+fn58fn9+f4B/fn9/gH+BgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36AfX1/gYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39/f36AgH9+gH9/fn5+f39+fn99fHx9hZKSjYyLioiJiISFhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgIB/f36AgYSDgoGBg4SEg4SAgYGAgYCBgIGCgoOBgIF+gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf3+Af4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f3+Af4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKBgoF+fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgYOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f4CAgICAgICBgX9+fX5+f39/foOGh4eIgoaEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgYOCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf39/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgYB/f359f35/gX+AgoGFhYWGhoeHhoeHiIaHh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHiIeFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICAgICAf39/f3+AgICAgICBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEgoGDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiomKh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoOEg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gHp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjYuMjI6KiYmGhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGDg4KDgoKBgICAf4F+f35+fXx8fHx8fHx8fHx8fHx8fX18fH5+ioJ7ent6eHp7enx9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH59e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjYiHiIaFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3t6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gZSRi4yMjY+KhoaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4d/fXx+gICBgH9/fn19fX19enx9f39/gH1/foCMkY2MjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYCAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+ChIaGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fHx8fX59fH19fX19fXx+fH18e318fHp7ent9fX+GhIKAgIF9fn1+f32LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn18fn9/fX6Afn5+hJKMjIuOjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAe359fH5+gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fYGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4uKioyLioiEhIWDhIODg4KCgoKCgoKCgYGBgIKCgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH9+f399fn5/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBf4CAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJCNi4qJioaHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/gIKCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn59f358fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJiomLiYWIkIyKiIiGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4OAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4eLi4uKiYyQjYyJh4aFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5/f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGBgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SChIiJioiJjY+MioeIhYSEg4GCgoKCg4KBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXl8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6AgYOHhIiNjImJhYWEhIOCgoKCgoKCgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH6CgIGCgoCAgYCBgYCAgYKCgoKGhYSBgYGBgYOBf4CChIF/foGAfX6Bfn1/f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIN/iIyJiYeFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB9foB9fX5+gIB+gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyIiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3t6fHx7dnt0d39+dnJ7fn57eHV3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gYF/fH5+fX19e3x+fH18fHx7fHt8fYiFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX1+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX59fn59fnx7fHp8e3qAhYKDhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgoGCgYGDgH+AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBf3+AfoCBfoCBgIB/fn5+fn59f35+hYWAgYB/gIOBf36BgH9+gH6Af359e3p7enx7eoKDf4KCgoKDgoOCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7cnl7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX+Af3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3t6fHt8gYB/gX9/gYGBgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChYSChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fX2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn19eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWFgYSEhYSDgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn59fX2Af4CBgYF/fnx+gH5/f4GCf4GBgoOHhYGAf35+gH+AgYCAgICBgoGAgH6Agn9/gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KBgoOBgoKBgIGBfIB/foB9fn1+f4CAgH9+f358fn9/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4KDgoGCg4KBg4J/gYB/f35/gH59fXx/gICAf3+Af3yAf3+BgIGAgH98gH9+fn5/f31+foCBgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36GfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH+AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGCgX5/fn5+fX19f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGAgICAfX5+f4B9fH59f4CBgH9/gYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYOCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgH1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+f358fn9/f399fX9/fX5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3h6endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgIGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gH+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2EfXR8fXp6enp8eXl6eoaFd3l8fHx8fH17fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKAgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f3+Af39/f4B/gICAgIB/gICBgYGBgoGAgH9/f359f356gZGLenx9fHt9eXt6enh5gYF4eXt8fH18fHt8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2Fh4ODgoOCgIGAgoKBgIGBgYGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB+f31+gH59gIB/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhoh8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fH19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgYF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+BgIB/gIB/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYGCg4B/goGFg4OEgYGDgYKCgoGAf4CCg4KAgoKFg3+AgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH19fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDg4OBgoSAhIOCgoB/goKEgYGCgoSCf4CAf4GDgoGBgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgoGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGDgYCAgICAgYKBhIB+gYOBfn+Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4GCgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4KEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F+f4GEhIGDf4KCgYOCgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgX+AgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foB/f4GBgICAgICBgYCAf319fHx9fHZydnh4dnR+dnV9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYOBf4GDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92dn+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4F+gYSEg4OChH+BhIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhISDgYKAfYGCf318fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx8gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWChIWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4KDgX+BhIODg4KDf4GFg4ODg4SDg4SDgIKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYR/fX18fHx8f4F+fX5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WBgYOEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYuJhISDhIWFg4eGhoSEhISFhISEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+Ee4WDgISDgH9+fX59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2ChHVzcYOGdHB1cnN0g3Z7fXWBf4KDgIJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgYN/g4N9gX19fn1+goOBfH+BfX6AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYSChYaEhYWDgoOEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ6eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9+fX6BgIF9gH59gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiIhYOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/f4KDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WDhYWFhIKFhYWFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYSGhYeGhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dHBvemtzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEhIGEg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWFhIV9d4WDhISDgoF9f357fHt+e3x8fX9+fXx+foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGh4iGhYiHiIWHhoaIhYWGhoWGhoWDgoWFhoWFg4SEhISFhIWFhIWFhIaHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn98fX1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHhoeGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWEhoaFhIOFhYKFh4WDgoKFg4SBfoCAfHt9fXt8e31+fXx8fn1+fnx/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGg4SEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eGh4aHhoeFiIiHh4WGhoeFh4eFgYSEhYaFhYSEhIOEhYWGhoaFhoSHhoaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e359e3x8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeFhYeFhoWGhYSCg4KDg4eBg4CCg4OCgoJ/gHt8fn58fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eGiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWHh4aGh4aGhIaFg4OCgoKDhoGDfoKCg4CDg39/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhYSFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaHhYeGh4aHh4WEhYWDgYKBgIOFgoN+gYGBf4OBfn9+f31/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFh4aIhoWHhIaHiIaGiIiHh4aHiIaEhoaGh4aFh4OEhYSGhoaHhYWEg4WFh4WHhoeFhoaGhYaGhIOEhYGAgYGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4mHhoaHhYSGhYWGhYWHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaFhYaDg4OFgH+BgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5eXp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eHiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGh4WFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx9f358e4iFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeHh4WFiIaJh4aEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYWGg4WFgYGDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e316e3t7fH1+fX2AfX18fH2Af318hoOGhoaGhYOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIKCgoOEg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIWHhYeFhYKDgoGDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIR+e398fICBfYGAfX2DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp7fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5+gYGCg4OCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhoSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f359fHx8fHt7enl6enl7enp6enp6ent8eXt9fHx/f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEg4OFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhYWFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+e32Bf4CDfn2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMTEwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjZGEwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw0NjkgQEAKKzUgMzIgMAorNSAzMiAwCiszMzcgMSAwCiszMjIgMSAyMTMzMworMjc5IDEgNDI2NjYKKzI4MCAxIDY0MDAwCisyODMgMSA4NTMzMworMzE3IDEgMTA2NjY2CiszMTggMSAxMjgwMDAKKzMyMSAxIDE0OTMzMworMzEzIDEgMTcwNjY2CiszMTIgMSAxOTIwMDAKKzMxNyAxIDIxMzMzMworMzMwIDEgMjM0NjY2CiszNTAgMSAyNTYwMDAKKzM1NSAxIDI3NzMzMworMzMzIDEgMjk4NjY2CiszMjUgMSAzMjAwMDAKKzM3NiAxIDM0MTMzMworMzM1IDEgMzYyNjY2CiszNTEgMSAzODQwMDAKKzM1MCAxIDQwNTMzMworMzM5IDEgNDI2NjY2CiszMjkgMSA0NDgwMDAKKzM1MCAxIDQ2OTMzMworMzMwIDEgNDkwNjY2CiszNTkgMSA1MTIwMDAKKzMxNiAxIDUzMzMzMworMzQ1IDEgNTU0NjY2CiszNTcgMSA1NzYwMDAKKzMyNSAxIDU5NzMzMworMzM2IDEgNjE4NjY2CiszMzkgMSA2NDAwMDAKKzMxMiAxIDY2MTMzMworMzUwIDEgNjgyNjY2CiszMzggMSA3MDQwMDAKKzM1MyAxIDcyNTMzMworMzQwIDEgNzQ2NjY2CiszMzIgMSA3NjgwMDAKKzM0MCAxIDc4OTMzMworMzM5IDEgODEwNjY2CiszMzMgMSA4MzIwMDAKKzMzMyAxIDg1MzMzMworMzQ1IDEgODc0NjY2CiszNDAgMSA4OTYwMDAKKzM0MyAxIDkxNzMzMworMzM1IDEgOTM4NjY2CiszMzkgMSA5NjAwMDAKKzM0MiAxIDk4MTMzMworMzQ4IDEgMTAwMjY2NgorMzUwIDEgMTAyNDAwMAorMzUxIDEgMTA0NTMzMworMzQyIDEgMTA2NjY2NgorMzY2IDEgMTA4ODAwMAorMzQwIDEgMTEwOTMzMworMzU0IDEgMTEzMDY2NgorMzQwIDEgMTE1MjAwMAorMzM0IDEgMTE3MzMzMworMzM4IDEgMTE5NDY2NgorMzQwIDEgMTIxNjAwMAorMzUxIDEgMTIzNzMzMworMzQ2IDEgMTI1ODY2NgorMzMxIDEgMTI4MDAwMAorMzIxIDEgMTMwMTMzMworMzQzIDEgMTMyMjY2NgorMzQyIDEgMTM0NDAwMAorMzQ1IDEgMTM2NTMzMworMzI2IDEgMTM4NjY2NgorMzQyIDEgMTQwODAwMAorMzU2IDEgMTQyOTMzMworMzUxIDEgMTQ1MDY2NgorMzQzIDEgMTQ3MjAwMAorMzQ3IDEgMTQ5MzMzMworMzQ5IDEgMTUxNDY2NgorMzUwIDEgMTUzNjAwMAorMzMwIDEgMTU1NzMzMworMzQxIDEgMTU3ODY2NgorMzQwIDEgMTYwMDAwMAorMzMwIDEgMTYyMTMzMworMzQwIDEgMTY0MjY2NgorMzM1IDEgMTY2NDAwMAorMzQ0IDEgMTY4NTMzMworMzU5IDEgMTcwNjY2NgorMzM3IDEgMTcyODAwMAorMzQ2IDEgMTc0OTMzMworMzMwIDEgMTc3MDY2NgorMzUxIDEgMTc5MjAwMAorMzU1IDEgMTgxMzMzMworMzUyIDEgMTgzNDY2NgorMzI1IDEgMTg1NjAwMAorMzQyIDEgMTg3NzMzMworMzI3IDEgMTg5ODY2NgorMzQ5IDEgMTkyMDAwMAorMzI2IDEgMTk0MTMzMworMzM3IDEgMTk2MjY2NgorMzc4IDEgMTk4NDAwMAorMzIxIDEgMjAwNTMzMworMzE5IDEgMjAyNjY2NgorMzQ2IDEgMjA0ODAwMAorMzUyIDEgMjA2OTMzMworMzQ5IDEgMjA5MDY2NgorMzMxIDEgMjExMjAwMAorMzMwIDEgMjEzMzMzMworMzI5IDEgMjE1NDY2NgorMzMzIDEgMjE3NjAwMAorMzY3IDEgMjE5NzMzMworMzYyIDEgMjIxODY2NgorMzM3IDEgMjI0MDAwMAorMzM3IDEgMjI2MTMzMworMzYwIDEgMjI4MjY2NgorMzMzIDEgMjMwNDAwMAorMzE3IDEgMjMyNTMzMworMzQ0IDEgMjM0NjY2NgorMzM1IDEgMjM2ODAwMAorMzM3IDEgMjM4OTMzMworMzQ5IDEgMjQxMDY2NgorMzM2IDEgMjQzMjAwMAorMzQ4IDEgMjQ1MzMzMworMzQ5IDEgMjQ3NDY2NgorMzQyIDEgMjQ5NjAwMAorMzU5IDEgMjUxNzMzMworMzQwIDEgMjUzODY2NgorMzQwIDEgMjU2MDAwMAorMzQ4IDEgMjU4MTMzMworMzM0IDEgMjYwMjY2NgorMzI4IDEgMjYyNDAwMAorMzQxIDEgMjY0NTMzMworMzM5IDEgMjY2NjY2NgorMzM3IDEgMjY4ODAwMAorMzUwIDEgMjcwOTMzMworMzI2IDEgMjczMDY2NgorMzYwIDEgMjc1MjAwMAorMzQ0IDEgMjc3MzMzMworMzQwIDEgMjc5NDY2NgorMzQzIDEgMjgxNjAwMAorMzYxIDEgMjgzNzMzMworMzI5IDEgMjg1ODY2NgorMzQ1IDEgMjg4MDAwMAorMzQ1IDEgMjkwMTMzMworMzMwIDEgMjkyMjY2NgorMzQyIDEgMjk0NDAwMAorMzQ0IDEgMjk2NTMzMworMzMwIDEgMjk4NjY2NgorMzI5IDEgMzAwODAwMAorMzM1IDEgMzAyOTMzMworMzY2IDEgMzA1MDY2NgorMzI4IDEgMzA3MjAwMAorMzQ5IDEgMzA5MzMzMworMzM5IDEgMzExNDY2NgorMzQwIDEgMzEzNjAwMAorMzM1IDEgMzE1NzMzMworMzI3IDEgMzE3ODY2NgorMzQ4IDEgMzIwMDAwMAorMzM5IDEgMzIyMTMzMworMzM0IDEgMzI0MjY2NgorMzUwIDEgMzI2NDAwMAorMzI1IDEgMzI4NTMzMworMzYxIDEgMzMwNjY2NgorMzM4IDEgMzMyODAwMAorMzUwIDEgMzM0OTMzMworMzUzIDEgMzM3MDY2NgorMzI3IDEgMzM5MjAwMAorMzQ2IDEgMzQxMzMzMworMzQ4IDEgMzQzNDY2NgorMzM5IDEgMzQ1NjAwMAorMzQyIDEgMzQ3NzMzMworMzM0IDEgMzQ5ODY2NgorMzUwIDEgMzUyMDAwMAorMzU0IDEgMzU0MTMzMworMzYzIDEgMzU2MjY2NgorMzIyIDEgMzU4NDAwMAorMzM3IDEgMzYwNTMzMworMzU1IDEgMzYyNjY2NgorMzI5IDEgMzY0ODAwMAorMzI0IDEgMzY2OTMzMworMzM4IDEgMzY5MDY2NgorMzU2IDEgMzcxMjAwMAorMzMwIDEgMzczMzMzMworMzIxIDEgMzc1NDY2NgorMzM3IDEgMzc3NjAwMAorMzQ1IDEgMzc5NzMzMworMzM1IDEgMzgxODY2NgorMzQ4IDEgMzg0MDAwMAorMzQyIDEgMzg2MTMzMworMzQ4IDEgMzg4MjY2NgorMzM1IDEgMzkwNDAwMAorMzQ0IDEgMzkyNTMzMworMzU3IDEgMzk0NjY2NgorMzY4IDEgMzk2ODAwMAorMzI0IDEgMzk4OTMzMworMzQzIDEgNDAxMDY2NgorMzQxIDEgNDAzMjAwMAorMzI5IDEgNDA1MzMzMworMzU2IDEgNDA3NDY2NgorMzE3IDEgNDA5NjAwMAorMzUxIDEgNDExNzMzMworMzQwIDEgNDEzODY2NgorMzQwIDEgNDE2MDAwMAorMzMyIDEgNDE4MTMzMworMzU1IDEgNDIwMjY2NgorMzU3IDEgNDIyNDAwMAorMzI3IDEgNDI0NTMzMworMzM4IDEgNDI2NjY2NgorMzIzIDEgNDI4ODAwMAorMzQ2IDEgNDMwOTMzMworMzUyIDEgNDMzMDY2NgorMzQ3IDEgNDM1MjAwMAorMzQzIDEgNDM3MzMzMworMzExIDEgNDM5NDY2NgorMzM4IDEgNDQxNjAwMAorMzY1IDEgNDQzNzMzMworMzQ5IDEgNDQ1ODY2NgorMzI3IDEgNDQ4MDAwMAorMzU1IDEgNDUwMTMzMworMzE5IDEgNDUyMjY2NgorMzQ5IDEgNDU0NDAwMAorMzUxIDEgNDU2NTMzMworMzM3IDEgNDU4NjY2NgorMzQwIDEgNDYwODAwMAorMzQ5IDEgNDYyOTMzMworMzE2IDEgNDY1MDY2NgorMzQ0IDEgNDY3MjAwMAorMzM0IDEgNDY5MzMzMworMzQ0IDEgNDcxNDY2NgorMzQ3IDEgNDczNjAwMAorMzQ4IDEgNDc1NzMzMworMzM0IDEgNDc3ODY2NgorMzM4IDEgNDgwMDAwMAorMzMxIDEgNDgyMTMzMworMzQ0IDEgNDg0MjY2NgorMzQyIDEgNDg2NDAwMAorMzM2IDEgNDg4NTMzMworMzI2IDEgNDkwNjY2NgorMzY0IDEgNDkyODAwMAorMzUwIDEgNDk0OTMzMworMzUwIDEgNDk3MDY2NgorMzYzIDEgNDk5MjAwMAorMzU4IDEgNTAxMzMzMworMzA1IDEgNTAzNDY2NgorMzQ0IDEgNTA1NjAwMAorMzQ2IDEgNTA3NzMzMworMzQyIDEgNTA5ODY2NgorMzMwIDEgNTEyMDAwMAorMzE4IDEgNTE0MTMzMworMzYxIDEgNTE2MjY2NgorMzU0IDEgNTE4NDAwMAorMzEzIDEgNTIwNTMzMworMzMwIDEgNTIyNjY2NgorMzUwIDEgNTI0ODAwMAorMzQ3IDEgNTI2OTMzMworMzQ2IDEgNTI5MDY2NgorMzU3IDEgNTMxMjAwMAorMzI1IDEgNTMzMzMzMworMzM1IDEgNTM1NDY2NgorMzMxIDEgNTM3NjAwMAorMzY2IDEgNTM5NzMzMworMzI5IDEgNTQxODY2NgorMzQ5IDEgNTQ0MDAwMAorMzcxIDEgNTQ2MTMzMworMzI2IDEgNTQ4MjY2NgorMzMzIDEgNTUwNDAwMAorMzE5IDEgNTUyNTMzMworMzI3IDEgNTU0NjY2NgorMzUzIDEgNTU2ODAwMAorMzU2IDEgNTU4OTMzMworMzQ4IDEgNTYxMDY2NgorMzM4IDEgNTYzMjAwMAorMzMxIDEgNTY1MzMzMworMzQxIDEgNTY3NDY2NgorMzYyIDEgNTY5NjAwMAorMzI2IDEgNTcxNzMzMworMzU5IDEgNTczODY2NgorMzE1IDEgNTc2MDAwMAorMzc2IDEgNTc4MTMzMworMzQzIDEgNTgwMjY2NgorMzU0IDEgNTgyNDAwMAorMzUzIDEgNTg0NTMzMworMzQ0IDEgNTg2NjY2NgorMzM0IDEgNTg4ODAwMAorMzQ1IDEgNTkwOTMzMworMzU1IDEgNTkzMDY2NgorMzIyIDEgNTk1MjAwMAorMzM0IDEgNTk3MzMzMworMzUzIDEgNTk5NDY2NgorMzM4IDEgNjAxNjAwMAorMzUxIDEgNjAzNzMzMworMzM0IDEgNjA1ODY2NgorMzM5IDEgNjA4MDAwMAorMzQ1IDEgNjEwMTMzMworMzQ3IDEgNjEyMjY2NgorMzU1IDEgNjE0NDAwMAorMzEyIDEgNjE2NTMzMworMzUyIDEgNjE4NjY2NgorMzU0IDEgNjIwODAwMAorMzE4IDEgNjIyOTMzMworMzQ0IDEgNjI1MDY2NgorMzYzIDEgNjI3MjAwMAorMzIxIDEgNjI5MzMzMworMzM5IDEgNjMxNDY2NgorMzU2IDEgNjMzNjAwMAorMzM0IDEgNjM1NzMzMworMzU0IDEgNjM3ODY2NgorMzI1IDEgNjQwMDAwMAorMzIxIDEgNjQyMTMzMworMzQxIDEgNjQ0MjY2NgorMzM3IDEgNjQ2NDAwMAorMzUxIDEgNjQ4NTMzMworMzQzIDEgNjUwNjY2NgorMzQxIDEgNjUyODAwMAorMzQ0IDEgNjU0OTMzMworMzQxIDEgNjU3MDY2NgorMzY0IDEgNjU5MjAwMAorMzE5IDEgNjYxMzMzMworMzQ4IDEgNjYzNDY2NgorMzMyIDEgNjY1NjAwMAorMzMzIDEgNjY3NzMzMworMzQzIDEgNjY5ODY2NgorMzQ4IDEgNjcyMDAwMAorMzQ3IDEgNjc0MTMzMworMzUwIDEgNjc2MjY2NgorMzQyIDEgNjc4NDAwMAorMzQxIDEgNjgwNTMzMworMzI2IDEgNjgyNjY2NgorMzUxIDEgNjg0ODAwMAorMzI5IDEgNjg2OTMzMworMzIzIDEgNjg5MDY2NgorMzUwIDEgNjkxMjAwMAorMzYxIDEgNjkzMzMzMworMzI2IDEgNjk1NDY2NgorMzQ1IDEgNjk3NjAwMAorMzQ1IDEgNjk5NzMzMworMzExIDEgNzAxODY2NgorMzQ5IDEgNzA0MDAwMAorMzU4IDEgNzA2MTMzMworMzUyIDEgNzA4MjY2NgorMzQ3IDEgNzEwNDAwMAorMzY0IDEgNzEyNTMzMworMzI4IDEgNzE0NjY2NgorMzE4IDEgNzE2ODAwMAorMzUxIDEgNzE4OTMzMworMzQwIDEgNzIxMDY2NgorMzQxIDEgNzIzMjAwMAorMzU1IDEgNzI1MzMzMworMzM2IDEgNzI3NDY2NgorMzUyIDEgNzI5NjAwMAorMzQxIDEgNzMxNzMzMworMzM0IDEgNzMzODY2NgorMzQ4IDEgNzM2MDAwMAorMzQyIDEgNzM4MTMzMworMzM1IDEgNzQwMjY2NgorMzQyIDEgNzQyNDAwMAorMzU5IDEgNzQ0NTMzMworMzQ5IDEgNzQ2NjY2NgorMzI5IDEgNzQ4ODAwMAorMzU2IDEgNzUwOTMzMworMjkyIDEgNzUzMDY2NgorMzE2IDEgNzU1MjAwMAorMzE4IDEgNzU3MzMzMworMzIwIDEgNzU5NDY2NgorMzQyIDEgNzYxNjAwMAorMjg1IDEgNzYzNzMzMworMzI2IDEgNzY1ODY2NgorMzUyIDEgNzY4MDAwMAorMzkyIDEgNzcwMTMzMworMzY0IDEgNzcyMjY2NgorMzg0IDEgNzc0NDAwMAorMzM0IDEgNzc2NTMzMworMzE3IDEgNzc4NjY2NgorMzI2IDEgNzgwODAwMAorMzczIDEgNzgyOTMzMworMzU0IDEgNzg1MDY2NgorMzI5IDEgNzg3MjAwMAorMzQ3IDEgNzg5MzMzMworMzUzIDEgNzkxNDY2NgorMzM4IDEgNzkzNjAwMAorMzE3IDEgNzk1NzMzMworMzU0IDEgNzk3ODY2NgorMzQ1IDEgODAwMDAwMAorMzUwIDEgODAyMTMzMworMzUxIDEgODA0MjY2NgorMzMyIDEgODA2NDAwMAorMzU4IDEgODA4NTMzMworMzE1IDEgODEwNjY2NgorMzM2IDEgODEyODAwMAorMzU4IDEgODE0OTMzMworMzQzIDEgODE3MDY2NgorMzE5IDEgODE5MjAwMAorMzcwIDEgODIxMzMzMworMzQ0IDEgODIzNDY2NgorMzYxIDEgODI1NjAwMAorMzQzIDEgODI3NzMzMworMzM3IDEgODI5ODY2NgorMzU0IDEgODMyMDAwMAorMzMyIDEgODM0MTMzMworMzQ4IDEgODM2MjY2NgorMzI4IDEgODM4NDAwMAorMzQ1IDEgODQwNTMzMworMzQwIDEgODQyNjY2NgorMzQ2IDEgODQ0ODAwMAorMzQxIDEgODQ2OTMzMworMzQ0IDEgODQ5MDY2NgorMzQyIDEgODUxMjAwMAorMzQxIDEgODUzMzMzMworMzQ1IDEgODU1NDY2NgorMzM3IDEgODU3NjAwMAorMzM1IDEgODU5NzMzMworMzM1IDEgODYxODY2NgorMzQwIDEgODY0MDAwMAorMzQ1IDEgODY2MTMzMworMzQxIDEgODY4MjY2NgorMzQyIDEgODcwNDAwMAorMzM4IDEgODcyNTMzMworMzQzIDEgODc0NjY2NgorMzM2IDEgODc2ODAwMAorMzM4IDEgODc4OTMzMworMzUzIDEgODgxMDY2NgorMzM5IDEgODgzMjAwMAorMzI5IDEgODg1MzMzMworMzQ5IDEgODg3NDY2NgorMzIzIDEgODg5NjAwMAorMzUxIDEgODkxNzMzMworMzU5IDEgODkzODY2NgorMzU3IDEgODk2MDAwMAorMzQxIDEgODk4MTMzMworMzMzIDEgOTAwMjY2NgorMzM1IDEgOTAyNDAwMAorMzI4IDEgOTA0NTMzMworMzQ3IDEgOTA2NjY2NgorMzQzIDEgOTA4ODAwMAorMzY5IDEgOTEwOTMzMworMzMxIDEgOTEzMDY2NgorMzQ0IDEgOTE1MjAwMAorMzMwIDEgOTE3MzMzMworMzQ2IDEgOTE5NDY2NgorMzM3IDEgOTIxNjAwMAorMzQxIDEgOTIzNzMzMworMzM4IDEgOTI1ODY2NgorMzI5IDEgOTI4MDAwMAorMzYwIDEgOTMwMTMzMworMzM2IDEgOTMyMjY2NgorMzQxIDEgOTM0NDAwMAorMzQxIDEgOTM2NTMzMworMzQ1IDEgOTM4NjY2NgorMzUxIDEgOTQwODAwMAorMzQ5IDEgOTQyOTMzMworMzM2IDEgOTQ1MDY2NgorMzI2IDEgOTQ3MjAwMAorMzQ5IDEgOTQ5MzMzMworMzQzIDEgOTUxNDY2NgorMzU3IDEgOTUzNjAwMAorMzQyIDEgOTU1NzMzMworMzI1IDEgOTU3ODY2NgorMzQ2IDEgOTYwMDAwMAorMzI2IDEgOTYyMTMzMworNDAyIDEgOTY0MjY2NgorMzMxIDEgOTY2NDAwMAorMzM5IDEgOTY4NTMzMworMzcxIDEgOTcwNjY2NgorMzE0IDEgOTcyODAwMAorMzEwIDEgOTc0OTMzMworMzY0IDEgOTc3MDY2NgorMzM4IDEgOTc5MjAwMAorMzM5IDEgOTgxMzMzMworMzM3IDEgOTgzNDY2NgorMzU1IDEgOTg1NjAwMAorMzUxIDEgOTg3NzMzMworMzMyIDEgOTg5ODY2NgorMzE2IDEgOTkyMDAwMAorNDc0IDEgOTk0MTMzMwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyYWYyMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8KQEAgLTAsMCArMSw0NDMgQEAKKzUgMzIgMAorNSAzMiAwCiszMzcgMSAwCiszMjIgMSAyMTMzMworMjc5IDEgNDI2NjYKKzU2MyAxIDY0MDAwCis2MzUgMSAxMDY2NjYKKzYzNCAxIDE0OTMzMworNjI5IDEgMTkyMDAwCis2ODAgMSAyMzQ2NjYKKzY4OCAxIDI3NzMzMworMTAzNiAxIDMyMDAwMAorMTA0MCAxIDM4NDAwMAorMTAwOSAxIDQ0ODAwMAorMTAyMCAxIDUxMjAwMAorMTM1NyAxIDU3NjAwMAorMTM1MyAxIDY2MTMzMworMTM1MSAxIDc0NjY2NgorMTM1MSAxIDgzMjAwMAorMzQzIDEgOTE3MzMzCiszMzUgMSA5Mzg2NjYKKzMzOSAxIDk2MDAwMAorMzQyIDEgOTgxMzMzCiszNDggMSAxMDAyNjY2CiszNTAgMSAxMDI0MDAwCiszNTEgMSAxMDQ1MzMzCiszNDIgMSAxMDY2NjY2CiszNjYgMSAxMDg4MDAwCiszNDAgMSAxMTA5MzMzCiszNTQgMSAxMTMwNjY2CiszNDAgMSAxMTUyMDAwCiszMzQgMSAxMTczMzMzCiszMzggMSAxMTk0NjY2CiszNDAgMSAxMjE2MDAwCiszNTEgMSAxMjM3MzMzCiszNDYgMSAxMjU4NjY2CiszMzEgMSAxMjgwMDAwCiszMjEgMSAxMzAxMzMzCiszNDMgMSAxMzIyNjY2CiszNDIgMSAxMzQ0MDAwCiszNDUgMSAxMzY1MzMzCiszMjYgMSAxMzg2NjY2CiszNDIgMSAxNDA4MDAwCiszNTYgMSAxNDI5MzMzCiszNTEgMSAxNDUwNjY2CiszNDMgMSAxNDcyMDAwCiszNDcgMSAxNDkzMzMzCiszNDkgMSAxNTE0NjY2CiszNTAgMSAxNTM2MDAwCiszMzAgMSAxNTU3MzMzCiszNDEgMSAxNTc4NjY2CiszNDAgMSAxNjAwMDAwCiszMzAgMSAxNjIxMzMzCiszNDAgMSAxNjQyNjY2CiszMzUgMSAxNjY0MDAwCiszNDQgMSAxNjg1MzMzCiszNTkgMSAxNzA2NjY2CiszMzcgMSAxNzI4MDAwCiszNDYgMSAxNzQ5MzMzCiszMzAgMSAxNzcwNjY2CiszNTEgMSAxNzkyMDAwCiszNTUgMSAxODEzMzMzCiszNTIgMSAxODM0NjY2CiszMjUgMSAxODU2MDAwCiszNDIgMSAxODc3MzMzCiszMjcgMSAxODk4NjY2CiszNDkgMSAxOTIwMDAwCiszMjYgMSAxOTQxMzMzCiszMzcgMSAxOTYyNjY2CiszNzggMSAxOTg0MDAwCiszMjEgMSAyMDA1MzMzCiszMTkgMSAyMDI2NjY2CiszNDYgMSAyMDQ4MDAwCiszNTIgMSAyMDY5MzMzCiszNDkgMSAyMDkwNjY2CiszMzEgMSAyMTEyMDAwCiszMzAgMSAyMTMzMzMzCiszMjkgMSAyMTU0NjY2CiszMzMgMSAyMTc2MDAwCiszNjcgMSAyMTk3MzMzCiszNjIgMSAyMjE4NjY2CiszMzcgMSAyMjQwMDAwCiszMzcgMSAyMjYxMzMzCiszNjAgMSAyMjgyNjY2CiszMzMgMSAyMzA0MDAwCiszMTcgMSAyMzI1MzMzCiszNDQgMSAyMzQ2NjY2CiszMzUgMSAyMzY4MDAwCiszMzcgMSAyMzg5MzMzCiszNDkgMSAyNDEwNjY2CiszMzYgMSAyNDMyMDAwCiszNDggMSAyNDUzMzMzCiszNDkgMSAyNDc0NjY2CiszNDIgMSAyNDk2MDAwCiszNTkgMSAyNTE3MzMzCiszNDAgMSAyNTM4NjY2CiszNDAgMSAyNTYwMDAwCiszNDggMSAyNTgxMzMzCiszMzQgMSAyNjAyNjY2CiszMjggMSAyNjI0MDAwCiszNDEgMSAyNjQ1MzMzCiszMzkgMSAyNjY2NjY2CiszMzcgMSAyNjg4MDAwCiszNTAgMSAyNzA5MzMzCiszMjYgMSAyNzMwNjY2CiszNjAgMSAyNzUyMDAwCiszNDQgMSAyNzczMzMzCiszNDAgMSAyNzk0NjY2CiszNDMgMSAyODE2MDAwCiszNjEgMSAyODM3MzMzCiszMjkgMSAyODU4NjY2CiszNDUgMSAyODgwMDAwCiszNDUgMSAyOTAxMzMzCiszMzAgMSAyOTIyNjY2CiszNDIgMSAyOTQ0MDAwCiszNDQgMSAyOTY1MzMzCiszMzAgMSAyOTg2NjY2CiszMjkgMSAzMDA4MDAwCiszMzUgMSAzMDI5MzMzCiszNjYgMSAzMDUwNjY2CiszMjggMSAzMDcyMDAwCiszNDkgMSAzMDkzMzMzCiszMzkgMSAzMTE0NjY2CiszNDAgMSAzMTM2MDAwCiszMzUgMSAzMTU3MzMzCiszMjcgMSAzMTc4NjY2CiszNDggMSAzMjAwMDAwCiszMzkgMSAzMjIxMzMzCiszMzQgMSAzMjQyNjY2CiszNTAgMSAzMjY0MDAwCiszMjUgMSAzMjg1MzMzCiszNjEgMSAzMzA2NjY2CiszMzggMSAzMzI4MDAwCiszNTAgMSAzMzQ5MzMzCiszNTMgMSAzMzcwNjY2CiszMjcgMSAzMzkyMDAwCiszNDYgMSAzNDEzMzMzCiszNDggMSAzNDM0NjY2CiszMzkgMSAzNDU2MDAwCiszNDIgMSAzNDc3MzMzCiszMzQgMSAzNDk4NjY2CiszNTAgMSAzNTIwMDAwCiszNTQgMSAzNTQxMzMzCiszNjMgMSAzNTYyNjY2CiszMjIgMSAzNTg0MDAwCiszMzcgMSAzNjA1MzMzCiszNTUgMSAzNjI2NjY2CiszMjkgMSAzNjQ4MDAwCiszMjQgMSAzNjY5MzMzCiszMzggMSAzNjkwNjY2CiszNTYgMSAzNzEyMDAwCiszMzAgMSAzNzMzMzMzCiszMjEgMSAzNzU0NjY2CiszMzcgMSAzNzc2MDAwCiszNDUgMSAzNzk3MzMzCiszMzUgMSAzODE4NjY2CiszNDggMSAzODQwMDAwCiszNDIgMSAzODYxMzMzCiszNDggMSAzODgyNjY2CiszMzUgMSAzOTA0MDAwCiszNDQgMSAzOTI1MzMzCiszNTcgMSAzOTQ2NjY2CiszNjggMSAzOTY4MDAwCiszMjQgMSAzOTg5MzMzCiszNDMgMSA0MDEwNjY2CiszNDEgMSA0MDMyMDAwCiszMjkgMSA0MDUzMzMzCiszNTYgMSA0MDc0NjY2CiszMTcgMSA0MDk2MDAwCiszNTEgMSA0MTE3MzMzCiszNDAgMSA0MTM4NjY2CiszNDAgMSA0MTYwMDAwCiszMzIgMSA0MTgxMzMzCiszNTUgMSA0MjAyNjY2CiszNTcgMSA0MjI0MDAwCiszMjcgMSA0MjQ1MzMzCiszMzggMSA0MjY2NjY2CiszMjMgMSA0Mjg4MDAwCiszNDYgMSA0MzA5MzMzCiszNTIgMSA0MzMwNjY2CiszNDcgMSA0MzUyMDAwCiszNDMgMSA0MzczMzMzCiszMTEgMSA0Mzk0NjY2CiszMzggMSA0NDE2MDAwCiszNjUgMSA0NDM3MzMzCiszNDkgMSA0NDU4NjY2CiszMjcgMSA0NDgwMDAwCiszNTUgMSA0NTAxMzMzCiszMTkgMSA0NTIyNjY2CiszNDkgMSA0NTQ0MDAwCiszNTEgMSA0NTY1MzMzCiszMzcgMSA0NTg2NjY2CiszNDAgMSA0NjA4MDAwCiszNDkgMSA0NjI5MzMzCiszMTYgMSA0NjUwNjY2CiszNDQgMSA0NjcyMDAwCiszMzQgMSA0NjkzMzMzCiszNDQgMSA0NzE0NjY2CiszNDcgMSA0NzM2MDAwCiszNDggMSA0NzU3MzMzCiszMzQgMSA0Nzc4NjY2CiszMzggMSA0ODAwMDAwCiszMzEgMSA0ODIxMzMzCiszNDQgMSA0ODQyNjY2CiszNDIgMSA0ODY0MDAwCiszMzYgMSA0ODg1MzMzCiszMjYgMSA0OTA2NjY2CiszNjQgMSA0OTI4MDAwCiszNTAgMSA0OTQ5MzMzCiszNTAgMSA0OTcwNjY2CiszNjMgMSA0OTkyMDAwCiszNTggMSA1MDEzMzMzCiszMDUgMSA1MDM0NjY2CiszNDQgMSA1MDU2MDAwCiszNDYgMSA1MDc3MzMzCiszNDIgMSA1MDk4NjY2CiszMzAgMSA1MTIwMDAwCiszMTggMSA1MTQxMzMzCiszNjEgMSA1MTYyNjY2CiszNTQgMSA1MTg0MDAwCiszMTMgMSA1MjA1MzMzCiszMzAgMSA1MjI2NjY2CiszNTAgMSA1MjQ4MDAwCiszNDcgMSA1MjY5MzMzCiszNDYgMSA1MjkwNjY2CiszNTcgMSA1MzEyMDAwCiszMjUgMSA1MzMzMzMzCiszMzUgMSA1MzU0NjY2CiszMzEgMSA1Mzc2MDAwCiszNjYgMSA1Mzk3MzMzCiszMjkgMSA1NDE4NjY2CiszNDkgMSA1NDQwMDAwCiszNzEgMSA1NDYxMzMzCiszMjYgMSA1NDgyNjY2CiszMzMgMSA1NTA0MDAwCiszMTkgMSA1NTI1MzMzCiszMjcgMSA1NTQ2NjY2CiszNTMgMSA1NTY4MDAwCiszNTYgMSA1NTg5MzMzCiszNDggMSA1NjEwNjY2CiszMzggMSA1NjMyMDAwCiszMzEgMSA1NjUzMzMzCiszNDEgMSA1Njc0NjY2CiszNjIgMSA1Njk2MDAwCiszMjYgMSA1NzE3MzMzCiszNTkgMSA1NzM4NjY2CiszMTUgMSA1NzYwMDAwCiszNzYgMSA1NzgxMzMzCiszNDMgMSA1ODAyNjY2CiszNTQgMSA1ODI0MDAwCiszNTMgMSA1ODQ1MzMzCiszNDQgMSA1ODY2NjY2CiszMzQgMSA1ODg4MDAwCiszNDUgMSA1OTA5MzMzCiszNTUgMSA1OTMwNjY2CiszMjIgMSA1OTUyMDAwCiszMzQgMSA1OTczMzMzCiszNTMgMSA1OTk0NjY2CiszMzggMSA2MDE2MDAwCiszNTEgMSA2MDM3MzMzCiszMzQgMSA2MDU4NjY2CiszMzkgMSA2MDgwMDAwCiszNDUgMSA2MTAxMzMzCiszNDcgMSA2MTIyNjY2CiszNTUgMSA2MTQ0MDAwCiszMTIgMSA2MTY1MzMzCiszNTIgMSA2MTg2NjY2CiszNTQgMSA2MjA4MDAwCiszMTggMSA2MjI5MzMzCiszNDQgMSA2MjUwNjY2CiszNjMgMSA2MjcyMDAwCiszMjEgMSA2MjkzMzMzCiszMzkgMSA2MzE0NjY2CiszNTYgMSA2MzM2MDAwCiszMzQgMSA2MzU3MzMzCiszNTQgMSA2Mzc4NjY2CiszMjUgMSA2NDAwMDAwCiszMjEgMSA2NDIxMzMzCiszNDEgMSA2NDQyNjY2CiszMzcgMSA2NDY0MDAwCiszNTEgMSA2NDg1MzMzCiszNDMgMSA2NTA2NjY2CiszNDEgMSA2NTI4MDAwCiszNDQgMSA2NTQ5MzMzCiszNDEgMSA2NTcwNjY2CiszNjQgMSA2NTkyMDAwCiszMTkgMSA2NjEzMzMzCiszNDggMSA2NjM0NjY2CiszMzIgMSA2NjU2MDAwCiszMzMgMSA2Njc3MzMzCiszNDMgMSA2Njk4NjY2CiszNDggMSA2NzIwMDAwCiszNDcgMSA2NzQxMzMzCiszNTAgMSA2NzYyNjY2CiszNDIgMSA2Nzg0MDAwCiszNDEgMSA2ODA1MzMzCiszMjYgMSA2ODI2NjY2CiszNTEgMSA2ODQ4MDAwCiszMjkgMSA2ODY5MzMzCiszMjMgMSA2ODkwNjY2CiszNTAgMSA2OTEyMDAwCiszNjEgMSA2OTMzMzMzCiszMjYgMSA2OTU0NjY2CiszNDUgMSA2OTc2MDAwCiszNDUgMSA2OTk3MzMzCiszMTEgMSA3MDE4NjY2CiszNDkgMSA3MDQwMDAwCiszNTggMSA3MDYxMzMzCiszNTIgMSA3MDgyNjY2CiszNDcgMSA3MTA0MDAwCiszNjQgMSA3MTI1MzMzCiszMjggMSA3MTQ2NjY2CiszMTggMSA3MTY4MDAwCiszNTEgMSA3MTg5MzMzCiszNDAgMSA3MjEwNjY2CiszNDEgMSA3MjMyMDAwCiszNTUgMSA3MjUzMzMzCiszMzYgMSA3Mjc0NjY2CiszNTIgMSA3Mjk2MDAwCiszNDEgMSA3MzE3MzMzCiszMzQgMSA3MzM4NjY2CiszNDggMSA3MzYwMDAwCiszNDIgMSA3MzgxMzMzCiszMzUgMSA3NDAyNjY2CiszNDIgMSA3NDI0MDAwCiszNTkgMSA3NDQ1MzMzCiszNDkgMSA3NDY2NjY2CiszMjkgMSA3NDg4MDAwCiszNTYgMSA3NTA5MzMzCisyOTIgMSA3NTMwNjY2CiszMTYgMSA3NTUyMDAwCiszMTggMSA3NTczMzMzCiszMjAgMSA3NTk0NjY2CiszNDIgMSA3NjE2MDAwCisyODUgMSA3NjM3MzMzCiszMjYgMSA3NjU4NjY2CiszNTIgMSA3NjgwMDAwCiszOTIgMSA3NzAxMzMzCiszNjQgMSA3NzIyNjY2CiszODQgMSA3NzQ0MDAwCiszMzQgMSA3NzY1MzMzCiszMTcgMSA3Nzg2NjY2CiszMjYgMSA3ODA4MDAwCiszNzMgMSA3ODI5MzMzCiszNTQgMSA3ODUwNjY2CiszMjkgMSA3ODcyMDAwCiszNDcgMSA3ODkzMzMzCiszNTMgMSA3OTE0NjY2CiszMzggMSA3OTM2MDAwCiszMTcgMSA3OTU3MzMzCiszNTQgMSA3OTc4NjY2CiszNDUgMSA4MDAwMDAwCiszNTAgMSA4MDIxMzMzCiszNTEgMSA4MDQyNjY2CiszMzIgMSA4MDY0MDAwCiszNTggMSA4MDg1MzMzCiszMTUgMSA4MTA2NjY2CiszMzYgMSA4MTI4MDAwCiszNTggMSA4MTQ5MzMzCiszNDMgMSA4MTcwNjY2CiszMTkgMSA4MTkyMDAwCiszNzAgMSA4MjEzMzMzCiszNDQgMSA4MjM0NjY2CiszNjEgMSA4MjU2MDAwCiszNDMgMSA4Mjc3MzMzCiszMzcgMSA4Mjk4NjY2CiszNTQgMSA4MzIwMDAwCiszMzIgMSA4MzQxMzMzCiszNDggMSA4MzYyNjY2CiszMjggMSA4Mzg0MDAwCiszNDUgMSA4NDA1MzMzCiszNDAgMSA4NDI2NjY2CiszNDYgMSA4NDQ4MDAwCiszNDEgMSA4NDY5MzMzCiszNDQgMSA4NDkwNjY2CiszNDIgMSA4NTEyMDAwCiszNDEgMSA4NTMzMzMzCiszNDUgMSA4NTU0NjY2CiszMzcgMSA4NTc2MDAwCiszMzUgMSA4NTk3MzMzCiszMzUgMSA4NjE4NjY2CiszNDAgMSA4NjQwMDAwCiszNDUgMSA4NjYxMzMzCiszNDEgMSA4NjgyNjY2CiszNDIgMSA4NzA0MDAwCiszMzggMSA4NzI1MzMzCiszNDMgMSA4NzQ2NjY2CiszMzYgMSA4NzY4MDAwCiszMzggMSA4Nzg5MzMzCiszNTMgMSA4ODEwNjY2CiszMzkgMSA4ODMyMDAwCiszMjkgMSA4ODUzMzMzCiszNDkgMSA4ODc0NjY2CiszMjMgMSA4ODk2MDAwCiszNTEgMSA4OTE3MzMzCiszNTkgMSA4OTM4NjY2CiszNTcgMSA4OTYwMDAwCiszNDEgMSA4OTgxMzMzCiszMzMgMSA5MDAyNjY2CiszMzUgMSA5MDI0MDAwCiszMjggMSA5MDQ1MzMzCiszNDcgMSA5MDY2NjY2CiszNDMgMSA5MDg4MDAwCiszNjkgMSA5MTA5MzMzCiszMzEgMSA5MTMwNjY2CiszNDQgMSA5MTUyMDAwCiszMzAgMSA5MTczMzMzCiszNDYgMSA5MTk0NjY2CiszMzcgMSA5MjE2MDAwCiszNDEgMSA5MjM3MzMzCiszMzggMSA5MjU4NjY2CiszMjkgMSA5MjgwMDAwCiszNjAgMSA5MzAxMzMzCiszMzYgMSA5MzIyNjY2CiszNDEgMSA5MzQ0MDAwCiszNDEgMSA5MzY1MzMzCiszNDUgMSA5Mzg2NjY2CiszNTEgMSA5NDA4MDAwCiszNDkgMSA5NDI5MzMzCiszMzYgMSA5NDUwNjY2CiszMjYgMSA5NDcyMDAwCiszNDkgMSA5NDkzMzMzCiszNDMgMSA5NTE0NjY2CiszNTcgMSA5NTM2MDAwCiszNDIgMSA5NTU3MzMzCiszMjUgMSA5NTc4NjY2CiszNDYgMSA5NjAwMDAwCiszMjYgMSA5NjIxMzMzCis0MDIgMSA5NjQyNjY2CiszMzEgMSA5NjY0MDAwCiszMzkgMSA5Njg1MzMzCiszNzEgMSA5NzA2NjY2CiszMTQgMSA5NzI4MDAwCiszMTAgMSA5NzQ5MzMzCiszNjQgMSA5NzcwNjY2CiszMzggMSA5NzkyMDAwCiszMzkgMSA5ODEzMzMzCiszMzcgMSA5ODM0NjY2CiszNTUgMSA5ODU2MDAwCiszNTEgMSA5ODc3MzMzCiszMzIgMSA5ODk4NjY2CiszMTYgMSA5OTIwMDAwCis0NzQgMSA5OTQxMzMzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MjU5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTYxZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbwpAQCAtMCwwICsxLDQ5NCBAQAorNDEgMSAwCis0MSAxIDIwMDAwCis0MSAxIDQwMDAwCis0MSAxIDYwMDAwCis0MSAxIDgwMDAwCis0MSAxIDEwMDAwMAorNDEgMSAxMjAwMDAKKzQxIDEgMTQwMDAwCis0MSAxIDE2MDAwMAorNDEgMSAxODAwMDAKKzQxIDEgMjAwMDAwCis0MSAxIDIyMDAwMAorNDEgMSAyNDAwMDAKKzQxIDEgMjYwMDAwCis0MSAxIDI4MDAwMAorNDEgMSAzMDAwMDAKKzQxIDEgMzIwMDAwCis0MSAxIDM0MDAwMAorNDEgMSAzNjAwMDAKKzQxIDEgMzgwMDAwCis0MSAxIDQwMDAwMAorNDEgMSA0MjAwMDAKKzQxIDEgNDQwMDAwCis0MSAxIDQ2MDAwMAorNDEgMSA0ODAwMDAKKzQxIDEgNTAwMDAwCis0MSAxIDUyMDAwMAorNDEgMSA1NDAwMDAKKzQxIDEgNTYwMDAwCis0MSAxIDU4MDAwMAorNDEgMSA2MDAwMDAKKzQxIDEgNjIwMDAwCis0MSAxIDY0MDAwMAorNDEgMSA2NjAwMDAKKzQxIDEgNjgwMDAwCis0MSAxIDcwMDAwMAorNDEgMSA3MjAwMDAKKzQxIDEgNzQwMDAwCis0MSAxIDc2MDAwMAorNDEgMSA3ODAwMDAKKzQxIDEgODAwMDAwCis0MSAxIDgyMDAwMAorNDEgMSA4NDAwMDAKKzQxIDEgODYwMDAwCis0MSAxIDg4MDAwMAorNDEgMSA5MDAwMDAKKzQxIDEgOTIwMDAwCis0MSAxIDk0MDAwMAorNDEgMSA5NjAwMDAKKzQxIDEgOTgwMDAwCis0MSAxIDEwMDAwMDAKKzQxIDEgMTAyMDAwMAorNDEgMSAxMDQwMDAwCis0MSAxIDEwNjAwMDAKKzQxIDEgMTA4MDAwMAorNDEgMSAxMTAwMDAwCis0MSAxIDExMjAwMDAKKzQxIDEgMTE0MDAwMAorNDEgMSAxMTYwMDAwCis0MSAxIDExODAwMDAKKzQxIDEgMTIwMDAwMAorNDEgMSAxMjIwMDAwCis0MSAxIDEyNDAwMDAKKzQxIDEgMTI2MDAwMAorNDEgMSAxMjgwMDAwCis0MSAxIDEzMDAwMDAKKzQxIDEgMTMyMDAwMAorNDEgMSAxMzQwMDAwCis0MSAxIDEzNjAwMDAKKzQxIDEgMTM4MDAwMAorNDEgMSAxNDAwMDAwCis0MSAxIDE0MjAwMDAKKzQxIDEgMTQ0MDAwMAorNDEgMSAxNDYwMDAwCis0MSAxIDE0ODAwMDAKKzQxIDEgMTUwMDAwMAorNDEgMSAxNTIwMDAwCis0MSAxIDE1NDAwMDAKKzQxIDEgMTU2MDAwMAorNDEgMSAxNTgwMDAwCis0MSAxIDE2MDAwMDAKKzQxIDEgMTYyMDAwMAorNDEgMSAxNjQwMDAwCis0MSAxIDE2NjAwMDAKKzQxIDEgMTY4MDAwMAorNDEgMSAxNzAwMDAwCis0MSAxIDE3MjAwMDAKKzQxIDEgMTc0MDAwMAorNDEgMSAxNzYwMDAwCis0MSAxIDE3ODAwMDAKKzQxIDEgMTgwMDAwMAorNDEgMSAxODIwMDAwCis0MSAxIDE4NDAwMDAKKzQxIDEgMTg2MDAwMAorNDEgMSAxODgwMDAwCis0MSAxIDE5MDAwMDAKKzQxIDEgMTkyMDAwMAorNDEgMSAxOTQwMDAwCis0MSAxIDE5NjAwMDAKKzQxIDEgMTk4MDAwMAorNDEgMSAyMDAwMDAwCis0MSAxIDIwMjAwMDAKKzQxIDEgMjA0MDAwMAorNDEgMSAyMDYwMDAwCis0MSAxIDIwODAwMDAKKzQxIDEgMjEwMDAwMAorNDEgMSAyMTIwMDAwCis0MSAxIDIxNDAwMDAKKzQxIDEgMjE2MDAwMAorNDEgMSAyMTgwMDAwCis0MSAxIDIyMDAwMDAKKzQxIDEgMjIyMDAwMAorNDEgMSAyMjQwMDAwCis0MSAxIDIyNjAwMDAKKzQxIDEgMjI4MDAwMAorNDEgMSAyMzAwMDAwCis0MSAxIDIzMjAwMDAKKzQxIDEgMjM0MDAwMAorNDEgMSAyMzYwMDAwCis0MSAxIDIzODAwMDAKKzQxIDEgMjQwMDAwMAorNDEgMSAyNDIwMDAwCis0MSAxIDI0NDAwMDAKKzQxIDEgMjQ2MDAwMAorNDEgMSAyNDgwMDAwCis0MSAxIDI1MDAwMDAKKzQxIDEgMjUyMDAwMAorNDEgMSAyNTQwMDAwCis0MSAxIDI1NjAwMDAKKzQxIDEgMjU4MDAwMAorNDEgMSAyNjAwMDAwCis0MSAxIDI2MjAwMDAKKzQxIDEgMjY0MDAwMAorNDEgMSAyNjYwMDAwCis0MSAxIDI2ODAwMDAKKzQxIDEgMjcwMDAwMAorNDEgMSAyNzIwMDAwCis0MSAxIDI3NDAwMDAKKzQxIDEgMjc2MDAwMAorNDEgMSAyNzgwMDAwCis0MSAxIDI4MDAwMDAKKzQxIDEgMjgyMDAwMAorNDEgMSAyODQwMDAwCis0MSAxIDI4NjAwMDAKKzQxIDEgMjg4MDAwMAorNDEgMSAyOTAwMDAwCis0MSAxIDI5MjAwMDAKKzQxIDEgMjk0MDAwMAorNDEgMSAyOTYwMDAwCis0MSAxIDI5ODAwMDAKKzQxIDEgMzAwMDAwMAorNDEgMSAzMDIwMDAwCis0MSAxIDMwNDAwMDAKKzQxIDEgMzA2MDAwMAorNDEgMSAzMDgwMDAwCis0MSAxIDMxMDAwMDAKKzQxIDEgMzEyMDAwMAorNDEgMSAzMTQwMDAwCis0MSAxIDMxNjAwMDAKKzQxIDEgMzE4MDAwMAorNDEgMSAzMjAwMDAwCis0MSAxIDMyMjAwMDAKKzQxIDEgMzI0MDAwMAorNDEgMSAzMjYwMDAwCis0MSAxIDMyODAwMDAKKzQxIDEgMzMwMDAwMAorNDEgMSAzMzIwMDAwCis0MSAxIDMzNDAwMDAKKzQxIDEgMzM2MDAwMAorNDEgMSAzMzgwMDAwCis0MSAxIDM0MDAwMDAKKzQxIDEgMzQyMDAwMAorNDEgMSAzNDQwMDAwCis0MSAxIDM0NjAwMDAKKzQxIDEgMzQ4MDAwMAorNDEgMSAzNTAwMDAwCis0MSAxIDM1MjAwMDAKKzQxIDEgMzU0MDAwMAorNDEgMSAzNTYwMDAwCis0MSAxIDM1ODAwMDAKKzQxIDEgMzYwMDAwMAorNDEgMSAzNjIwMDAwCis0MSAxIDM2NDAwMDAKKzQxIDEgMzY2MDAwMAorNDEgMSAzNjgwMDAwCis0MSAxIDM3MDAwMDAKKzQxIDEgMzcyMDAwMAorNDEgMSAzNzQwMDAwCis0MSAxIDM3NjAwMDAKKzQxIDEgMzc4MDAwMAorNDEgMSAzODAwMDAwCis0MSAxIDM4MjAwMDAKKzQxIDEgMzg0MDAwMAorNDEgMSAzODYwMDAwCis0MSAxIDM4ODAwMDAKKzQxIDEgMzkwMDAwMAorNDEgMSAzOTIwMDAwCis0MSAxIDM5NDAwMDAKKzQxIDEgMzk2MDAwMAorNDEgMSAzOTgwMDAwCis0MSAxIDQwMDAwMDAKKzQxIDEgNDAyMDAwMAorNDEgMSA0MDQwMDAwCis0MSAxIDQwNjAwMDAKKzQxIDEgNDA4MDAwMAorNDEgMSA0MTAwMDAwCis0MSAxIDQxMjAwMDAKKzQxIDEgNDE0MDAwMAorNDEgMSA0MTYwMDAwCis0MSAxIDQxODAwMDAKKzQxIDEgNDIwMDAwMAorNDEgMSA0MjIwMDAwCis0MSAxIDQyNDAwMDAKKzQxIDEgNDI2MDAwMAorNDEgMSA0MjgwMDAwCis0MSAxIDQzMDAwMDAKKzQxIDEgNDMyMDAwMAorNDEgMSA0MzQwMDAwCis0MSAxIDQzNjAwMDAKKzQxIDEgNDM4MDAwMAorNDEgMSA0NDAwMDAwCis0MSAxIDQ0MjAwMDAKKzQxIDEgNDQ0MDAwMAorNDEgMSA0NDYwMDAwCis0MSAxIDQ0ODAwMDAKKzQxIDEgNDUwMDAwMAorNDEgMSA0NTIwMDAwCis0MSAxIDQ1NDAwMDAKKzQxIDEgNDU2MDAwMAorNDEgMSA0NTgwMDAwCis0MSAxIDQ2MDAwMDAKKzQxIDEgNDYyMDAwMAorNDEgMSA0NjQwMDAwCis0MSAxIDQ2NjAwMDAKKzQxIDEgNDY4MDAwMAorNDEgMSA0NzAwMDAwCis0MSAxIDQ3MjAwMDAKKzQxIDEgNDc0MDAwMAorNDEgMSA0NzYwMDAwCis0MSAxIDQ3ODAwMDAKKzQxIDEgNDgwMDAwMAorNDEgMSA0ODIwMDAwCis0MSAxIDQ4NDAwMDAKKzQxIDEgNDg2MDAwMAorNDEgMSA0ODgwMDAwCis0MSAxIDQ5MDAwMDAKKzQxIDEgNDkyMDAwMAorNDEgMSA0OTQwMDAwCis0MSAxIDQ5NjAwMDAKKzQxIDEgNDk4MDAwMAorNDEgMSA1MDAwMDAwCis0MSAxIDUwMjAwMDAKKzQxIDEgNTA0MDAwMAorNDEgMSA1MDYwMDAwCis0MSAxIDUwODAwMDAKKzQxIDEgNTEwMDAwMAorNDEgMSA1MTIwMDAwCis0MSAxIDUxNDAwMDAKKzQxIDEgNTE2MDAwMAorNDEgMSA1MTgwMDAwCis0MSAxIDUyMDAwMDAKKzQxIDEgNTIyMDAwMAorNDEgMSA1MjQwMDAwCis0MSAxIDUyNjAwMDAKKzQxIDEgNTI4MDAwMAorNDEgMSA1MzAwMDAwCis0MSAxIDUzMjAwMDAKKzQxIDEgNTM0MDAwMAorNDEgMSA1MzYwMDAwCis0MSAxIDUzODAwMDAKKzQxIDEgNTQwMDAwMAorNDEgMSA1NDIwMDAwCis0MSAxIDU0NDAwMDAKKzQxIDEgNTQ2MDAwMAorNDEgMSA1NDgwMDAwCis0MSAxIDU1MDAwMDAKKzQxIDEgNTUyMDAwMAorNDEgMSA1NTQwMDAwCis0MSAxIDU1NjAwMDAKKzQxIDEgNTU4MDAwMAorNDEgMSA1NjAwMDAwCis0MSAxIDU2MjAwMDAKKzQxIDEgNTY0MDAwMAorNDEgMSA1NjYwMDAwCis0MSAxIDU2ODAwMDAKKzQxIDEgNTcwMDAwMAorNDEgMSA1NzIwMDAwCis0MSAxIDU3NDAwMDAKKzQxIDEgNTc2MDAwMAorNDEgMSA1NzgwMDAwCis0MSAxIDU4MDAwMDAKKzQxIDEgNTgyMDAwMAorNDEgMSA1ODQwMDAwCis0MSAxIDU4NjAwMDAKKzQxIDEgNTg4MDAwMAorNDEgMSA1OTAwMDAwCis0MSAxIDU5MjAwMDAKKzQxIDEgNTk0MDAwMAorNDEgMSA1OTYwMDAwCis0MSAxIDU5ODAwMDAKKzQxIDEgNjAwMDAwMAorNDEgMSA2MDIwMDAwCis0MSAxIDYwNDAwMDAKKzQxIDEgNjA2MDAwMAorNDEgMSA2MDgwMDAwCis0MSAxIDYxMDAwMDAKKzQxIDEgNjEyMDAwMAorNDEgMSA2MTQwMDAwCis0MSAxIDYxNjAwMDAKKzQxIDEgNjE4MDAwMAorNDEgMSA2MjAwMDAwCis0MSAxIDYyMjAwMDAKKzQxIDEgNjI0MDAwMAorNDEgMSA2MjYwMDAwCis0MSAxIDYyODAwMDAKKzQxIDEgNjMwMDAwMAorNDEgMSA2MzIwMDAwCis0MSAxIDYzNDAwMDAKKzQxIDEgNjM2MDAwMAorNDEgMSA2MzgwMDAwCis0MSAxIDY0MDAwMDAKKzQxIDEgNjQyMDAwMAorNDEgMSA2NDQwMDAwCis0MSAxIDY0NjAwMDAKKzQxIDEgNjQ4MDAwMAorNDEgMSA2NTAwMDAwCis0MSAxIDY1MjAwMDAKKzQxIDEgNjU0MDAwMAorNDEgMSA2NTYwMDAwCis0MSAxIDY1ODAwMDAKKzQxIDEgNjYwMDAwMAorNDEgMSA2NjIwMDAwCis0MSAxIDY2NDAwMDAKKzQxIDEgNjY2MDAwMAorNDEgMSA2NjgwMDAwCis0MSAxIDY3MDAwMDAKKzQxIDEgNjcyMDAwMAorNDEgMSA2NzQwMDAwCis0MSAxIDY3NjAwMDAKKzQxIDEgNjc4MDAwMAorNDEgMSA2ODAwMDAwCis0MSAxIDY4MjAwMDAKKzQxIDEgNjg0MDAwMAorNDEgMSA2ODYwMDAwCis0MSAxIDY4ODAwMDAKKzQxIDEgNjkwMDAwMAorNDEgMSA2OTIwMDAwCis0MSAxIDY5NDAwMDAKKzQxIDEgNjk2MDAwMAorNDEgMSA2OTgwMDAwCis0MSAxIDcwMDAwMDAKKzQxIDEgNzAyMDAwMAorNDEgMSA3MDQwMDAwCis0MSAxIDcwNjAwMDAKKzQxIDEgNzA4MDAwMAorNDEgMSA3MTAwMDAwCis0MSAxIDcxMjAwMDAKKzQxIDEgNzE0MDAwMAorNDEgMSA3MTYwMDAwCis0MSAxIDcxODAwMDAKKzQxIDEgNzIwMDAwMAorNDEgMSA3MjIwMDAwCis0MSAxIDcyNDAwMDAKKzQxIDEgNzI2MDAwMAorNDEgMSA3MjgwMDAwCis0MSAxIDczMDAwMDAKKzQxIDEgNzMyMDAwMAorNDEgMSA3MzQwMDAwCis0MSAxIDczNjAwMDAKKzQxIDEgNzM4MDAwMAorNDEgMSA3NDAwMDAwCis0MSAxIDc0MjAwMDAKKzQxIDEgNzQ0MDAwMAorNDEgMSA3NDYwMDAwCis0MSAxIDc0ODAwMDAKKzQxIDEgNzUwMDAwMAorNDEgMSA3NTIwMDAwCis0MSAxIDc1NDAwMDAKKzQxIDEgNzU2MDAwMAorNDEgMSA3NTgwMDAwCis0MSAxIDc2MDAwMDAKKzQxIDEgNzYyMDAwMAorNDEgMSA3NjQwMDAwCis0MSAxIDc2NjAwMDAKKzQxIDEgNzY4MDAwMAorNDEgMSA3NzAwMDAwCis0MSAxIDc3MjAwMDAKKzQxIDEgNzc0MDAwMAorNDEgMSA3NzYwMDAwCis0MSAxIDc3ODAwMDAKKzQxIDEgNzgwMDAwMAorNDEgMSA3ODIwMDAwCis0MSAxIDc4NDAwMDAKKzQxIDEgNzg2MDAwMAorNDEgMSA3ODgwMDAwCis0MSAxIDc5MDAwMDAKKzQxIDEgNzkyMDAwMAorNDEgMSA3OTQwMDAwCis0MSAxIDc5NjAwMDAKKzQxIDEgNzk4MDAwMAorNDEgMSA4MDAwMDAwCis0MSAxIDgwMjAwMDAKKzQxIDEgODA0MDAwMAorNDEgMSA4MDYwMDAwCis0MSAxIDgwODAwMDAKKzQxIDEgODEwMDAwMAorNDEgMSA4MTIwMDAwCis0MSAxIDgxNDAwMDAKKzQxIDEgODE2MDAwMAorNDEgMSA4MTgwMDAwCis0MSAxIDgyMDAwMDAKKzQxIDEgODIyMDAwMAorNDEgMSA4MjQwMDAwCis0MSAxIDgyNjAwMDAKKzQxIDEgODI4MDAwMAorNDEgMSA4MzAwMDAwCis0MSAxIDgzMjAwMDAKKzQxIDEgODM0MDAwMAorNDEgMSA4MzYwMDAwCis0MSAxIDgzODAwMDAKKzQxIDEgODQwMDAwMAorNDEgMSA4NDIwMDAwCis0MSAxIDg0NDAwMDAKKzQxIDEgODQ2MDAwMAorNDEgMSA4NDgwMDAwCis0MSAxIDg1MDAwMDAKKzQxIDEgODUyMDAwMAorNDEgMSA4NTQwMDAwCis0MSAxIDg1NjAwMDAKKzQxIDEgODU4MDAwMAorNDEgMSA4NjAwMDAwCis0MSAxIDg2MjAwMDAKKzQxIDEgODY0MDAwMAorNDEgMSA4NjYwMDAwCis0MSAxIDg2ODAwMDAKKzQxIDEgODcwMDAwMAorNDEgMSA4NzIwMDAwCis0MSAxIDg3NDAwMDAKKzQxIDEgODc2MDAwMAorNDEgMSA4NzgwMDAwCis0MSAxIDg4MDAwMDAKKzQxIDEgODgyMDAwMAorNDEgMSA4ODQwMDAwCis0MSAxIDg4NjAwMDAKKzQxIDEgODg4MDAwMAorNDEgMSA4OTAwMDAwCis0MSAxIDg5MjAwMDAKKzQxIDEgODk0MDAwMAorNDEgMSA4OTYwMDAwCis0MSAxIDg5ODAwMDAKKzQxIDEgOTAwMDAwMAorNDEgMSA5MDIwMDAwCis0MSAxIDkwNDAwMDAKKzQxIDEgOTA2MDAwMAorNDEgMSA5MDgwMDAwCis0MSAxIDkxMDAwMDAKKzQxIDEgOTEyMDAwMAorNDEgMSA5MTQwMDAwCis0MSAxIDkxNjAwMDAKKzQxIDEgOTE4MDAwMAorNDEgMSA5MjAwMDAwCis0MSAxIDkyMjAwMDAKKzQxIDEgOTI0MDAwMAorNDEgMSA5MjYwMDAwCis0MSAxIDkyODAwMDAKKzQxIDEgOTMwMDAwMAorNDEgMSA5MzIwMDAwCis0MSAxIDkzNDAwMDAKKzQxIDEgOTM2MDAwMAorNDEgMSA5MzgwMDAwCis0MSAxIDk0MDAwMDAKKzQxIDEgOTQyMDAwMAorNDEgMSA5NDQwMDAwCis0MSAxIDk0NjAwMDAKKzQxIDEgOTQ4MDAwMAorNDEgMSA5NTAwMDAwCis0MSAxIDk1MjAwMDAKKzQxIDEgOTU0MDAwMAorNDEgMSA5NTYwMDAwCis0MSAxIDk1ODAwMDAKKzQxIDEgOTYwMDAwMAorNDEgMSA5NjIwMDAwCis0MSAxIDk2NDAwMDAKKzQxIDEgOTY2MDAwMAorNDEgMSA5NjgwMDAwCis0MSAxIDk3MDAwMDAKKzQxIDEgOTcyMDAwMAorNDEgMSA5NzQwMDAwCis0MSAxIDk3NjAwMDAKKzQxIDEgOTc4MDAwMAorNDEgMSA5ODAwMDAwCis0MSAxIDk4MjAwMDAKKzQxIDEgOTg0MDAwMAorNDEgMSA5ODYwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjAwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDQ2MCBAQAorNDEgMSAwCis0MSAxIDIwMDAwCis4MiAxIDQwMDAwCis4MiAxIDgwMDAwCis4MiAxIDEyMDAwMAorODIgMSAxNjAwMDAKKzgyIDEgMjAwMDAwCis4MiAxIDI0MDAwMAorODIgMSAyODAwMDAKKzgyIDEgMzIwMDAwCis4MiAxIDM2MDAwMAorMTIzIDEgNDAwMDAwCisxMjMgMSA0NjAwMDAKKzEyMyAxIDUyMDAwMAorMTIzIDEgNTgwMDAwCisxMjMgMSA2NDAwMDAKKzE2NCAxIDcwMDAwMAorMTY0IDEgNzgwMDAwCisxNjQgMSA4NjAwMDAKKzE2NCAxIDk0MDAwMAorMTY0IDEgMTAyMDAwMAorNDEgMSAxMTAwMDAwCis0MSAxIDExMjAwMDAKKzQxIDEgMTE0MDAwMAorNDEgMSAxMTYwMDAwCis0MSAxIDExODAwMDAKKzQxIDEgMTIwMDAwMAorNDEgMSAxMjIwMDAwCis0MSAxIDEyNDAwMDAKKzQxIDEgMTI2MDAwMAorNDEgMSAxMjgwMDAwCis0MSAxIDEzMDAwMDAKKzQxIDEgMTMyMDAwMAorNDEgMSAxMzQwMDAwCis0MSAxIDEzNjAwMDAKKzQxIDEgMTM4MDAwMAorNDEgMSAxNDAwMDAwCis0MSAxIDE0MjAwMDAKKzQxIDEgMTQ0MDAwMAorNDEgMSAxNDYwMDAwCis0MSAxIDE0ODAwMDAKKzQxIDEgMTUwMDAwMAorNDEgMSAxNTIwMDAwCis0MSAxIDE1NDAwMDAKKzQxIDEgMTU2MDAwMAorNDEgMSAxNTgwMDAwCis0MSAxIDE2MDAwMDAKKzQxIDEgMTYyMDAwMAorNDEgMSAxNjQwMDAwCis0MSAxIDE2NjAwMDAKKzQxIDEgMTY4MDAwMAorNDEgMSAxNzAwMDAwCis0MSAxIDE3MjAwMDAKKzQxIDEgMTc0MDAwMAorNDEgMSAxNzYwMDAwCis0MSAxIDE3ODAwMDAKKzQxIDEgMTgwMDAwMAorNDEgMSAxODIwMDAwCis0MSAxIDE4NDAwMDAKKzQxIDEgMTg2MDAwMAorNDEgMSAxODgwMDAwCis0MSAxIDE5MDAwMDAKKzQxIDEgMTkyMDAwMAorNDEgMSAxOTQwMDAwCis0MSAxIDE5NjAwMDAKKzQxIDEgMTk4MDAwMAorNDEgMSAyMDAwMDAwCis0MSAxIDIwMjAwMDAKKzQxIDEgMjA0MDAwMAorNDEgMSAyMDYwMDAwCis0MSAxIDIwODAwMDAKKzQxIDEgMjEwMDAwMAorNDEgMSAyMTIwMDAwCis0MSAxIDIxNDAwMDAKKzQxIDEgMjE2MDAwMAorNDEgMSAyMTgwMDAwCis0MSAxIDIyMDAwMDAKKzQxIDEgMjIyMDAwMAorNDEgMSAyMjQwMDAwCis0MSAxIDIyNjAwMDAKKzQxIDEgMjI4MDAwMAorNDEgMSAyMzAwMDAwCis0MSAxIDIzMjAwMDAKKzQxIDEgMjM0MDAwMAorNDEgMSAyMzYwMDAwCis0MSAxIDIzODAwMDAKKzQxIDEgMjQwMDAwMAorNDEgMSAyNDIwMDAwCis0MSAxIDI0NDAwMDAKKzQxIDEgMjQ2MDAwMAorNDEgMSAyNDgwMDAwCis0MSAxIDI1MDAwMDAKKzQxIDEgMjUyMDAwMAorNDEgMSAyNTQwMDAwCis0MSAxIDI1NjAwMDAKKzQxIDEgMjU4MDAwMAorNDEgMSAyNjAwMDAwCis0MSAxIDI2MjAwMDAKKzQxIDEgMjY0MDAwMAorNDEgMSAyNjYwMDAwCis0MSAxIDI2ODAwMDAKKzQxIDEgMjcwMDAwMAorNDEgMSAyNzIwMDAwCis0MSAxIDI3NDAwMDAKKzQxIDEgMjc2MDAwMAorNDEgMSAyNzgwMDAwCis0MSAxIDI4MDAwMDAKKzQxIDEgMjgyMDAwMAorNDEgMSAyODQwMDAwCis0MSAxIDI4NjAwMDAKKzQxIDEgMjg4MDAwMAorNDEgMSAyOTAwMDAwCis0MSAxIDI5MjAwMDAKKzQxIDEgMjk0MDAwMAorNDEgMSAyOTYwMDAwCis0MSAxIDI5ODAwMDAKKzQxIDEgMzAwMDAwMAorNDEgMSAzMDIwMDAwCis0MSAxIDMwNDAwMDAKKzQxIDEgMzA2MDAwMAorNDEgMSAzMDgwMDAwCis0MSAxIDMxMDAwMDAKKzQxIDEgMzEyMDAwMAorNDEgMSAzMTQwMDAwCis0MSAxIDMxNjAwMDAKKzQxIDEgMzE4MDAwMAorNDEgMSAzMjAwMDAwCis0MSAxIDMyMjAwMDAKKzQxIDEgMzI0MDAwMAorNDEgMSAzMjYwMDAwCis0MSAxIDMyODAwMDAKKzQxIDEgMzMwMDAwMAorNDEgMSAzMzIwMDAwCis0MSAxIDMzNDAwMDAKKzQxIDEgMzM2MDAwMAorNDEgMSAzMzgwMDAwCis0MSAxIDM0MDAwMDAKKzQxIDEgMzQyMDAwMAorNDEgMSAzNDQwMDAwCis0MSAxIDM0NjAwMDAKKzQxIDEgMzQ4MDAwMAorNDEgMSAzNTAwMDAwCis0MSAxIDM1MjAwMDAKKzQxIDEgMzU0MDAwMAorNDEgMSAzNTYwMDAwCis0MSAxIDM1ODAwMDAKKzQxIDEgMzYwMDAwMAorNDEgMSAzNjIwMDAwCis0MSAxIDM2NDAwMDAKKzQxIDEgMzY2MDAwMAorNDEgMSAzNjgwMDAwCis0MSAxIDM3MDAwMDAKKzQxIDEgMzcyMDAwMAorNDEgMSAzNzQwMDAwCis0MSAxIDM3NjAwMDAKKzQxIDEgMzc4MDAwMAorNDEgMSAzODAwMDAwCis0MSAxIDM4MjAwMDAKKzQxIDEgMzg0MDAwMAorNDEgMSAzODYwMDAwCis0MSAxIDM4ODAwMDAKKzQxIDEgMzkwMDAwMAorNDEgMSAzOTIwMDAwCis0MSAxIDM5NDAwMDAKKzQxIDEgMzk2MDAwMAorNDEgMSAzOTgwMDAwCis0MSAxIDQwMDAwMDAKKzQxIDEgNDAyMDAwMAorNDEgMSA0MDQwMDAwCis0MSAxIDQwNjAwMDAKKzQxIDEgNDA4MDAwMAorNDEgMSA0MTAwMDAwCis0MSAxIDQxMjAwMDAKKzQxIDEgNDE0MDAwMAorNDEgMSA0MTYwMDAwCis0MSAxIDQxODAwMDAKKzQxIDEgNDIwMDAwMAorNDEgMSA0MjIwMDAwCis0MSAxIDQyNDAwMDAKKzQxIDEgNDI2MDAwMAorNDEgMSA0MjgwMDAwCis0MSAxIDQzMDAwMDAKKzQxIDEgNDMyMDAwMAorNDEgMSA0MzQwMDAwCis0MSAxIDQzNjAwMDAKKzQxIDEgNDM4MDAwMAorNDEgMSA0NDAwMDAwCis0MSAxIDQ0MjAwMDAKKzQxIDEgNDQ0MDAwMAorNDEgMSA0NDYwMDAwCis0MSAxIDQ0ODAwMDAKKzQxIDEgNDUwMDAwMAorNDEgMSA0NTIwMDAwCis0MSAxIDQ1NDAwMDAKKzQxIDEgNDU2MDAwMAorNDEgMSA0NTgwMDAwCis0MSAxIDQ2MDAwMDAKKzQxIDEgNDYyMDAwMAorNDEgMSA0NjQwMDAwCis0MSAxIDQ2NjAwMDAKKzQxIDEgNDY4MDAwMAorNDEgMSA0NzAwMDAwCis0MSAxIDQ3MjAwMDAKKzQxIDEgNDc0MDAwMAorNDEgMSA0NzYwMDAwCis0MSAxIDQ3ODAwMDAKKzQxIDEgNDgwMDAwMAorNDEgMSA0ODIwMDAwCis0MSAxIDQ4NDAwMDAKKzQxIDEgNDg2MDAwMAorNDEgMSA0ODgwMDAwCis0MSAxIDQ5MDAwMDAKKzQxIDEgNDkyMDAwMAorNDEgMSA0OTQwMDAwCis0MSAxIDQ5NjAwMDAKKzQxIDEgNDk4MDAwMAorNDEgMSA1MDAwMDAwCis0MSAxIDUwMjAwMDAKKzQxIDEgNTA0MDAwMAorNDEgMSA1MDYwMDAwCis0MSAxIDUwODAwMDAKKzQxIDEgNTEwMDAwMAorNDEgMSA1MTIwMDAwCis0MSAxIDUxNDAwMDAKKzQxIDEgNTE2MDAwMAorNDEgMSA1MTgwMDAwCis0MSAxIDUyMDAwMDAKKzQxIDEgNTIyMDAwMAorNDEgMSA1MjQwMDAwCis0MSAxIDUyNjAwMDAKKzQxIDEgNTI4MDAwMAorNDEgMSA1MzAwMDAwCis0MSAxIDUzMjAwMDAKKzQxIDEgNTM0MDAwMAorNDEgMSA1MzYwMDAwCis0MSAxIDUzODAwMDAKKzQxIDEgNTQwMDAwMAorNDEgMSA1NDIwMDAwCis0MSAxIDU0NDAwMDAKKzQxIDEgNTQ2MDAwMAorNDEgMSA1NDgwMDAwCis0MSAxIDU1MDAwMDAKKzQxIDEgNTUyMDAwMAorNDEgMSA1NTQwMDAwCis0MSAxIDU1NjAwMDAKKzQxIDEgNTU4MDAwMAorNDEgMSA1NjAwMDAwCis0MSAxIDU2MjAwMDAKKzQxIDEgNTY0MDAwMAorNDEgMSA1NjYwMDAwCis0MSAxIDU2ODAwMDAKKzQxIDEgNTcwMDAwMAorNDEgMSA1NzIwMDAwCis0MSAxIDU3NDAwMDAKKzQxIDEgNTc2MDAwMAorNDEgMSA1NzgwMDAwCis0MSAxIDU4MDAwMDAKKzQxIDEgNTgyMDAwMAorNDEgMSA1ODQwMDAwCis0MSAxIDU4NjAwMDAKKzQxIDEgNTg4MDAwMAorNDEgMSA1OTAwMDAwCis0MSAxIDU5MjAwMDAKKzQxIDEgNTk0MDAwMAorNDEgMSA1OTYwMDAwCis0MSAxIDU5ODAwMDAKKzQxIDEgNjAwMDAwMAorNDEgMSA2MDIwMDAwCis0MSAxIDYwNDAwMDAKKzQxIDEgNjA2MDAwMAorNDEgMSA2MDgwMDAwCis0MSAxIDYxMDAwMDAKKzQxIDEgNjEyMDAwMAorNDEgMSA2MTQwMDAwCis0MSAxIDYxNjAwMDAKKzQxIDEgNjE4MDAwMAorNDEgMSA2MjAwMDAwCis0MSAxIDYyMjAwMDAKKzQxIDEgNjI0MDAwMAorNDEgMSA2MjYwMDAwCis0MSAxIDYyODAwMDAKKzQxIDEgNjMwMDAwMAorNDEgMSA2MzIwMDAwCis0MSAxIDYzNDAwMDAKKzQxIDEgNjM2MDAwMAorNDEgMSA2MzgwMDAwCis0MSAxIDY0MDAwMDAKKzQxIDEgNjQyMDAwMAorNDEgMSA2NDQwMDAwCis0MSAxIDY0NjAwMDAKKzQxIDEgNjQ4MDAwMAorNDEgMSA2NTAwMDAwCis0MSAxIDY1MjAwMDAKKzQxIDEgNjU0MDAwMAorNDEgMSA2NTYwMDAwCis0MSAxIDY1ODAwMDAKKzQxIDEgNjYwMDAwMAorNDEgMSA2NjIwMDAwCis0MSAxIDY2NDAwMDAKKzQxIDEgNjY2MDAwMAorNDEgMSA2NjgwMDAwCis0MSAxIDY3MDAwMDAKKzQxIDEgNjcyMDAwMAorNDEgMSA2NzQwMDAwCis0MSAxIDY3NjAwMDAKKzQxIDEgNjc4MDAwMAorNDEgMSA2ODAwMDAwCis0MSAxIDY4MjAwMDAKKzQxIDEgNjg0MDAwMAorNDEgMSA2ODYwMDAwCis0MSAxIDY4ODAwMDAKKzQxIDEgNjkwMDAwMAorNDEgMSA2OTIwMDAwCis0MSAxIDY5NDAwMDAKKzQxIDEgNjk2MDAwMAorNDEgMSA2OTgwMDAwCis0MSAxIDcwMDAwMDAKKzQxIDEgNzAyMDAwMAorNDEgMSA3MDQwMDAwCis0MSAxIDcwNjAwMDAKKzQxIDEgNzA4MDAwMAorNDEgMSA3MTAwMDAwCis0MSAxIDcxMjAwMDAKKzQxIDEgNzE0MDAwMAorNDEgMSA3MTYwMDAwCis0MSAxIDcxODAwMDAKKzQxIDEgNzIwMDAwMAorNDEgMSA3MjIwMDAwCis0MSAxIDcyNDAwMDAKKzQxIDEgNzI2MDAwMAorNDEgMSA3MjgwMDAwCis0MSAxIDczMDAwMDAKKzQxIDEgNzMyMDAwMAorNDEgMSA3MzQwMDAwCis0MSAxIDczNjAwMDAKKzQxIDEgNzM4MDAwMAorNDEgMSA3NDAwMDAwCis0MSAxIDc0MjAwMDAKKzQxIDEgNzQ0MDAwMAorNDEgMSA3NDYwMDAwCis0MSAxIDc0ODAwMDAKKzQxIDEgNzUwMDAwMAorNDEgMSA3NTIwMDAwCis0MSAxIDc1NDAwMDAKKzQxIDEgNzU2MDAwMAorNDEgMSA3NTgwMDAwCis0MSAxIDc2MDAwMDAKKzQxIDEgNzYyMDAwMAorNDEgMSA3NjQwMDAwCis0MSAxIDc2NjAwMDAKKzQxIDEgNzY4MDAwMAorNDEgMSA3NzAwMDAwCis0MSAxIDc3MjAwMDAKKzQxIDEgNzc0MDAwMAorNDEgMSA3NzYwMDAwCis0MSAxIDc3ODAwMDAKKzQxIDEgNzgwMDAwMAorNDEgMSA3ODIwMDAwCis0MSAxIDc4NDAwMDAKKzQxIDEgNzg2MDAwMAorNDEgMSA3ODgwMDAwCis0MSAxIDc5MDAwMDAKKzQxIDEgNzkyMDAwMAorNDEgMSA3OTQwMDAwCis0MSAxIDc5NjAwMDAKKzQxIDEgNzk4MDAwMAorNDEgMSA4MDAwMDAwCis0MSAxIDgwMjAwMDAKKzQxIDEgODA0MDAwMAorNDEgMSA4MDYwMDAwCis0MSAxIDgwODAwMDAKKzQxIDEgODEwMDAwMAorNDEgMSA4MTIwMDAwCis0MSAxIDgxNDAwMDAKKzQxIDEgODE2MDAwMAorNDEgMSA4MTgwMDAwCis0MSAxIDgyMDAwMDAKKzQxIDEgODIyMDAwMAorNDEgMSA4MjQwMDAwCis0MSAxIDgyNjAwMDAKKzQxIDEgODI4MDAwMAorNDEgMSA4MzAwMDAwCis0MSAxIDgzMjAwMDAKKzQxIDEgODM0MDAwMAorNDEgMSA4MzYwMDAwCis0MSAxIDgzODAwMDAKKzQxIDEgODQwMDAwMAorNDEgMSA4NDIwMDAwCis0MSAxIDg0NDAwMDAKKzQxIDEgODQ2MDAwMAorNDEgMSA4NDgwMDAwCis0MSAxIDg1MDAwMDAKKzQxIDEgODUyMDAwMAorNDEgMSA4NTQwMDAwCis0MSAxIDg1NjAwMDAKKzQxIDEgODU4MDAwMAorNDEgMSA4NjAwMDAwCis0MSAxIDg2MjAwMDAKKzQxIDEgODY0MDAwMAorNDEgMSA4NjYwMDAwCis0MSAxIDg2ODAwMDAKKzQxIDEgODcwMDAwMAorNDEgMSA4NzIwMDAwCis0MSAxIDg3NDAwMDAKKzQxIDEgODc2MDAwMAorNDEgMSA4NzgwMDAwCis0MSAxIDg4MDAwMDAKKzQxIDEgODgyMDAwMAorNDEgMSA4ODQwMDAwCis0MSAxIDg4NjAwMDAKKzQxIDEgODg4MDAwMAorNDEgMSA4OTAwMDAwCis0MSAxIDg5MjAwMDAKKzQxIDEgODk0MDAwMAorNDEgMSA4OTYwMDAwCis0MSAxIDg5ODAwMDAKKzQxIDEgOTAwMDAwMAorNDEgMSA5MDIwMDAwCis0MSAxIDkwNDAwMDAKKzQxIDEgOTA2MDAwMAorNDEgMSA5MDgwMDAwCis0MSAxIDkxMDAwMDAKKzQxIDEgOTEyMDAwMAorNDEgMSA5MTQwMDAwCis0MSAxIDkxNjAwMDAKKzQxIDEgOTE4MDAwMAorNDEgMSA5MjAwMDAwCis0MSAxIDkyMjAwMDAKKzQxIDEgOTI0MDAwMAorNDEgMSA5MjYwMDAwCis0MSAxIDkyODAwMDAKKzQxIDEgOTMwMDAwMAorNDEgMSA5MzIwMDAwCis0MSAxIDkzNDAwMDAKKzQxIDEgOTM2MDAwMAorNDEgMSA5MzgwMDAwCis0MSAxIDk0MDAwMDAKKzQxIDEgOTQyMDAwMAorNDEgMSA5NDQwMDAwCis0MSAxIDk0NjAwMDAKKzQxIDEgOTQ4MDAwMAorNDEgMSA5NTAwMDAwCis0MSAxIDk1MjAwMDAKKzQxIDEgOTU0MDAwMAorNDEgMSA5NTYwMDAwCis0MSAxIDk1ODAwMDAKKzQxIDEgOTYwMDAwMAorNDEgMSA5NjIwMDAwCis0MSAxIDk2NDAwMDAKKzQxIDEgOTY2MDAwMAorNDEgMSA5NjgwMDAwCis0MSAxIDk3MDAwMDAKKzQxIDEgOTcyMDAwMAorNDEgMSA5NzQwMDAwCis0MSAxIDk3NjAwMDAKKzQxIDEgOTc4MDAwMAorNDEgMSA5ODAwMDAwCis0MSAxIDk4MjAwMDAKKzQxIDEgOTg0MDAwMAorNDEgMSA5ODYwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5hdjEgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5hdjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2N2FmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmF2MQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzUxMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuaW5mbwpAQCAtMCwwICsxLDMwMCBAQAorNjAyNyAxIDAKKzY4NzkgMCAzMzAwMAorNSAwIDY2MDAwCis1MzIgMCAxMDAwMDAKKzUgMCAxMzMwMDAKKzI0NTggMCAxNjYwMDAKKzUgMCAyMDAwMDAKKzQ3NSAwIDIzMzAwMAorNSAwIDI2NjAwMAorMTI2MiAwIDMwMDAwMAorNSAwIDMzMzAwMAorNTU0IDAgMzY2MDAwCisyNyAwIDQwMDAwMAorNjk3MSAwIDQzMzAwMAorNSAwIDQ2NjAwMAorNjAxIDAgNTAwMDAwCis1IDAgNTMzMDAwCiszMjc2IDAgNTY2MDAwCis1IDAgNjAwMDAwCis2NTggMCA2MzMwMDAKKzUgMCA2NjYwMDAKKzE2ODAgMCA3MDAwMDAKKzUgMCA3MzMwMDAKKzYxMCAwIDc2NjAwMAorMjQgMCA4MDAwMDAKKzY3MjggMCA4MzMwMDAKKzUgMCA4NjYwMDAKKzc2NCAwIDkwMDAwMAorNSAwIDkzMzAwMAorMjY1NiAwIDk2NjAwMAorNSAwIDEwMDAwMDAKKzQ2MiAwIDEwMzMwMDAKKzUgMCAxMDY2MDAwCisxNDU5IDAgMTEwMDAwMAorNSAwIDExMzMwMDAKKzYwOCAwIDExNjYwMDAKKzI0IDAgMTIwMDAwMAorNzAzOCAwIDEyMzMwMDAKKzUgMCAxMjY2MDAwCis3MjEgMCAxMzAwMDAwCis1IDAgMTMzMzAwMAorMzEwMiAwIDEzNjYwMDAKKzUgMCAxNDAwMDAwCis3NTIgMCAxNDMzMDAwCis1IDAgMTQ2NjAwMAorMTgxNSAwIDE1MDAwMDAKKzUgMCAxNTMzMDAwCis3NTUgMCAxNTY2MDAwCisyNSAwIDE2MDAwMDAKKzc2NTcgMCAxNjMzMDAwCis1IDAgMTY2NjAwMAorODUyIDAgMTcwMDAwMAorNSAwIDE3MzMwMDAKKzM1MzcgMCAxNzY2MDAwCis1IDAgMTgwMDAwMAorNjczIDAgMTgzMzAwMAorNSAwIDE4NjYwMDAKKzE3NzQgMCAxOTAwMDAwCis1IDAgMTkzMzAwMAorNTU0IDAgMTk2NjAwMAorMjQgMCAyMDAwMDAwCis4MDI4IDAgMjAzMzAwMAorNSAwIDIwNjYwMDAKKzcxNSAwIDIxMDAwMDAKKzUgMCAyMTMzMDAwCiszMzk1IDAgMjE2NjAwMAorNSAwIDIyMDAwMDAKKzczNiAwIDIyMzMwMDAKKzUgMCAyMjY2MDAwCisxNzU5IDAgMjMwMDAwMAorNSAwIDIzMzMwMDAKKzYwNSAwIDIzNjYwMDAKKzIzIDAgMjQwMDAwMAorNzY1MSAwIDI0MzMwMDAKKzUgMCAyNDY2MDAwCis2MTkgMCAyNTAwMDAwCis1IDAgMjUzMzAwMAorMjc4OCAwIDI1NjYwMDAKKzUgMCAyNjAwMDAwCis1NTYgMCAyNjMzMDAwCis1IDAgMjY2NjAwMAorMTMzNSAwIDI3MDAwMDAKKzUgMCAyNzMzMDAwCis1MjEgMCAyNzY2MDAwCisyNCAwIDI4MDAwMDAKKzIyNzQgMCAyODMzMDAwCis2NzYgMCAyODY2MDAwCisyNSAwIDI5MDAwMDAKKzYyMjQgMCAyOTMzMDAwCis1Nzk4IDAgMjk2NjAwMAorNSAwIDMwMDAwMDAKKzQ0OCAwIDMwMzMwMDAKKzUgMCAzMDY2MDAwCisxOTUwIDAgMzEwMDAwMAorNSAwIDMxMzMwMDAKKzM4NiAwIDMxNjYwMDAKKzUgMCAzMjAwMDAwCisxMjE4IDAgMzIzMzAwMAorNSAwIDMyNjYwMDAKKzEzMTYgMCAzMzAwMDAwCis1IDAgMzMzMzAwMAorNTgwIDAgMzM2NjAwMAorMjYgMCAzNDAwMDAwCis2NjczIDAgMzQzMzAwMAorNSAwIDM0NjYwMDAKKzQ3MyAwIDM1MDAwMDAKKzUgMCAzNTMzMDAwCisyNDY3IDAgMzU2NjAwMAorNSAwIDM2MDAwMDAKKzQyOSAwIDM2MzMwMDAKKzUgMCAzNjY2MDAwCisxNDIwIDAgMzcwMDAwMAorNSAwIDM3MzMwMDAKKzU4MyAwIDM3NjYwMDAKKzI5IDAgMzgwMDAwMAorODQ5MiAwIDM4MzMwMDAKKzUgMCAzODY2MDAwCis3MjAgMCAzOTAwMDAwCis1IDAgMzkzMzAwMAorMzYzNSAwIDM5NjYwMDAKKzUgMCA0MDAwMDAwCis2MjEgMCA0MDMzMDAwCis1IDAgNDA2NjAwMAorMTk2OSAwIDQxMDAwMDAKKzUgMCA0MTMzMDAwCis0OSAwIDQxNjYwMDAKKzI1IDAgNDIwMDAwMAorNzQxNiAwIDQyMzMwMDAKKzUgMCA0MjY2MDAwCis5NDcgMCA0MzAwMDAwCis1IDAgNDMzMzAwMAorMzcxMyAwIDQzNjYwMDAKKzUgMCA0NDAwMDAwCis3MTQgMCA0NDMzMDAwCis1IDAgNDQ2NjAwMAorMjAwMyAwIDQ1MDAwMDAKKzUgMCA0NTMzMDAwCis3NTAgMCA0NTY2MDAwCisyNSAwIDQ2MDAwMDAKKzg0NzAgMCA0NjMzMDAwCis1IDAgNDY2NjAwMAorNzM3IDAgNDcwMDAwMAorNSAwIDQ3MzMwMDAKKzQwOTQgMCA0NzY2MDAwCis1IDAgNDgwMDAwMAorMTAxOSAwIDQ4MzMwMDAKKzUgMCA0ODY2MDAwCisyMTYwIDAgNDkwMDAwMAorNSAwIDQ5MzMwMDAKKzgyOCAwIDQ5NjYwMDAKKzI0IDAgNTAwMDAwMAorOTI4MiAwIDUwMzMwMDAKKzUgMCA1MDY2MDAwCis2NTUgMCA1MTAwMDAwCis1IDAgNTEzMzAwMAorMzQ5MSAwIDUxNjYwMDAKKzUgMCA1MjAwMDAwCis2NTEgMCA1MjMzMDAwCis1IDAgNTI2NjAwMAorMTkwNiAwIDUzMDAwMDAKKzUgMCA1MzMzMDAwCis2NjIgMCA1MzY2MDAwCisyNCAwIDU0MDAwMDAKKzk3MjQgMCA1NDMzMDAwCis1IDAgNTQ2NjAwMAorNjE3IDAgNTUwMDAwMAorNSAwIDU1MzMwMDAKKzMxNDUgMCA1NTY2MDAwCis1IDAgNTYwMDAwMAorNTc4IDAgNTYzMzAwMAorNSAwIDU2NjYwMDAKKzE1OTIgMCA1NzAwMDAwCis1IDAgNTczMzAwMAorNTY5IDAgNTc2NjAwMAorMjUgMCA1ODAwMDAwCisxMDAxNSAwIDU4MzMwMDAKKzUgMCA1ODY2MDAwCis2MDkgMCA1OTAwMDAwCis1IDAgNTkzMzAwMAorMzYxOCAwIDU5NjYwMDAKKzUgMCA2MDAwMDAwCis3MzQgMCA2MDMzMDAwCis1IDAgNjA2NjAwMAorMTc0OCAwIDYxMDAwMDAKKzUgMCA2MTMzMDAwCis1NTAgMCA2MTY2MDAwCisyNCAwIDYyMDAwMDAKKzg4MDYgMCA2MjMzMDAwCis1IDAgNjI2NjAwMAorNDk4IDAgNjMwMDAwMAorNSAwIDYzMzMwMDAKKzI5MTMgMCA2MzY2MDAwCis1IDAgNjQwMDAwMAorNTk3IDAgNjQzMzAwMAorNSAwIDY0NjYwMDAKKzEyMzUgMCA2NTAwMDAwCis1IDAgNjUzMzAwMAorMzYyIDAgNjU2NjAwMAorMjQgMCA2NjAwMDAwCis2NTkyIDAgNjYzMzAwMAorNSAwIDY2NjYwMDAKKzQ2OCAwIDY3MDAwMDAKKzUgMCA2NzMzMDAwCisxOTIwIDAgNjc2NjAwMAorNSAwIDY4MDAwMDAKKzQxOSAwIDY4MzMwMDAKKzUgMCA2ODY2MDAwCis4NDMgMCA2OTAwMDAwCis1IDAgNjkzMzAwMAorMjM3IDAgNjk2NjAwMAorMjQgMCA3MDAwMDAwCisyNjg3IDAgNzAzMzAwMAorNSAwIDcwNjYwMDAKKzM5OSAwIDcxMDAwMDAKKzUgMCA3MTMzMDAwCisyMDAgMCA3MTY2MDAwCisxNDMgMCA3MjAwMDAwCisyNSAwIDcyMzMwMDAKKzEyNjAzIDAgNzI2NjAwMAorMTEzOSAwIDczMDAwMDAKKzUgMCA3MzMzMDAwCis1NiAwIDczNjYwMDAKKzUgMCA3NDAwMDAwCisyNzMgMCA3NDMzMDAwCis1IDAgNzQ2NjAwMAorNDggMCA3NTAwMDAwCis1IDAgNzUzMzAwMAorMTAyIDAgNzU2NjAwMAorNSAwIDc2MDAwMDAKKzM5IDAgNzYzMzAwMAorMjQgMCA3NjY2MDAwCiszNjM1IDAgNzcwMDAwMAorNSAwIDc3MzMwMDAKKzQ2IDAgNzc2NjAwMAorNSAwIDc4MDAwMDAKKzY0NyAwIDc4MzMwMDAKKzUgMCA3ODY2MDAwCis2MSAwIDc5MDAwMDAKKzUgMCA3OTMzMDAwCis4MjQgMCA3OTY2MDAwCis1IDAgODAwMDAwMAorNjkxIDAgODAzMzAwMAorMjcgMCA4MDY2MDAwCis0NTczIDAgODEwMDAwMAorNSAwIDgxMzMwMDAKKzQ3MyAwIDgxNjYwMDAKKzUgMCA4MjAwMDAwCisxNjM3IDAgODIzMzAwMAorNSAwIDgyNjYwMDAKKzQ1MSAwIDgzMDAwMDAKKzUgMCA4MzMzMDAwCis5NjkgMCA4MzY2MDAwCis1IDAgODQwMDAwMAorMjM0IDAgODQzMzAwMAorMjQgMCA4NDY2MDAwCiszMzYxIDAgODUwMDAwMAorNSAwIDg1MzMwMDAKKzE2OCAwIDg1NjYwMDAKKzUgMCA4NjAwMDAwCis2NjIgMCA4NjMzMDAwCis1IDAgODY2NjAwMAorMTI5IDAgODcwMDAwMAorNSAwIDg3MzMwMDAKKzQ0MyAwIDg3NjYwMDAKKzUgMCA4ODAwMDAwCisxODMgMCA4ODMzMDAwCisyMyAwIDg4NjYwMDAKKzI3NjkgMCA4OTAwMDAwCis1IDAgODkzMzAwMAorMTgyIDAgODk2NjAwMAorNSAwIDkwMDAwMDAKKzg5MCAwIDkwMzMwMDAKKzUgMCA5MDY2MDAwCisxNzEgMCA5MTAwMDAwCis1IDAgOTEzMzAwMAorNTk5IDAgOTE2NjAwMAorNSAwIDkyMDAwMDAKKzIzNiAwIDkyMzMwMDAKKzIzIDAgOTI2NjAwMAorMjMxNiAwIDkzMDAwMDAKKzUgMCA5MzMzMDAwCiszMzMgMCA5MzY2MDAwCis1IDAgOTQwMDAwMAorNzU5IDAgOTQzMzAwMAorNSAwIDk0NjYwMDAKKzIxMCAwIDk1MDAwMDAKKzUgMCA5NTMzMDAwCiszMjQgMCA5NTY2MDAwCis1IDAgOTYwMDAwMAorOTggMCA5NjMzMDAwCisyMyAwIDk2NjYwMDAKKzExMDcgMCA5NzAwMDAwCis1IDAgOTczMzAwMAorNDIgMCA5NzY2MDAwCis1IDAgOTgwMDAwMAorMTQ1IDAgOTgzMzAwMAorNSAwIDk4NjYwMDAKKzEwOSAwIDk5MDAwMDAKKzg5IDAgOTkzMzAwMAorMjQgMCA5OTY2MDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuYXYxIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuYXYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWJhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5hdjEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhNzgzMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmluZm8KQEAgLTAsMCArMSwxNjcgQEAKKzEyNTcxIDEgMAorOTg4MSAwIDMzMDAwCis1IDAgNjYwMDAKKzU0NCAwIDEwMDAwMAorNSAwIDEzMzAwMAorMjY0MiAwIDE2NjAwMAorNSAwIDIwMDAwMAorNTMxIDAgMjMzMDAwCis1IDAgMjY2MDAwCisxMzU5IDAgMzAwMDAwCis1IDAgMzMzMDAwCis1NTEgMCAzNjYwMDAKKzI4IDAgNDAwMDAwCisxMDc5MSAwIDQzMzAwMAorNSAwIDQ2NjAwMAorNjU1IDAgNTAwMDAwCis1IDAgNTMzMDAwCiszNzY5IDAgNTY2MDAwCis1IDAgNjAwMDAwCis3MTEgMCA2MzMwMDAKKzUgMCA2NjYwMDAKKzIwMDQgMCA3MDAwMDAKKzUgMCA3MzMwMDAKKzY1NyAwIDc2NjAwMAorMjYgMCA4MDAwMDAKKzg5NjkgMCA4MzMwMDAKKzUgMCA4NjYwMDAKKzYzMCAwIDkwMDAwMAorNSAwIDkzMzAwMAorMjc4NyAwIDk2NjAwMAorNSAwIDEwMDAwMDAKKzQwNCAwIDEwMzMwMDAKKzUgMCAxMDY2MDAwCisxNTE4IDAgMTEwMDAwMAorNSAwIDExMzMwMDAKKzQ5MyAwIDExNjYwMDAKKzI2IDAgMTIwMDAwMAorOTkwMCAwIDEyMzMwMDAKKzUgMCAxMjY2MDAwCis2MjAgMCAxMzAwMDAwCis1IDAgMTMzMzAwMAorMzA3MiAwIDEzNjYwMDAKKzUgMCAxNDAwMDAwCis2NjggMCAxNDMzMDAwCis1IDAgMTQ2NjAwMAorMTgyMSAwIDE1MDAwMDAKKzUgMCAxNTMzMDAwCis2ODIgMCAxNTY2MDAwCisyNiAwIDE2MDAwMDAKKzk1NjAgMCAxNjMzMDAwCis1IDAgMTY2NjAwMAorNjY3IDAgMTcwMDAwMAorNSAwIDE3MzMwMDAKKzMyNDkgMCAxNzY2MDAwCis1IDAgMTgwMDAwMAorNTg5IDAgMTgzMzAwMAorNSAwIDE4NjYwMDAKKzE4MTYgMCAxOTAwMDAwCis1IDAgMTkzMzAwMAorNTQ4IDAgMTk2NjAwMAorMjYgMCAyMDAwMDAwCis5OTE2IDAgMjAzMzAwMAorNSAwIDIwNjYwMDAKKzYyOCAwIDIxMDAwMDAKKzUgMCAyMTMzMDAwCiszMDM0IDAgMjE2NjAwMAorNSAwIDIyMDAwMDAKKzU5MCAwIDIyMzMwMDAKKzUgMCAyMjY2MDAwCisxNTgxIDAgMjMwMDAwMAorNSAwIDIzMzMwMDAKKzUyNCAwIDIzNjYwMDAKKzI2IDAgMjQwMDAwMAorODE4MiAwIDI0MzMwMDAKKzUgMCAyNDY2MDAwCis1NTIgMCAyNTAwMDAwCis1IDAgMjUzMzAwMAorMjQxMiAwIDI1NjYwMDAKKzUgMCAyNjAwMDAwCis0ODkgMCAyNjMzMDAwCis1IDAgMjY2NjAwMAorMTIyNyAwIDI3MDAwMDAKKzUgMCAyNzMzMDAwCis0MzIgMCAyNzY2MDAwCisyNiAwIDI4MDAwMDAKKzIwMTcgMCAyODMzMDAwCis1MTYgMCAyODY2MDAwCisyNiAwIDI5MDAwMDAKKzE2NjE5IDAgMjkzMzAwMAorNjcxMCAwIDI5NjYwMDAKKzUgMCAzMDAwMDAwCis0MjUgMCAzMDMzMDAwCis1IDAgMzA2NjAwMAorMTk2NCAwIDMxMDAwMDAKKzUgMCAzMTMzMDAwCiszODYgMCAzMTY2MDAwCis1IDAgMzIwMDAwMAorMTEyOSAwIDMyMzMwMDAKKzUgMCAzMjY2MDAwCisxMTU2IDAgMzMwMDAwMAorNSAwIDMzMzMwMDAKKzQ4NiAwIDMzNjYwMDAKKzI4IDAgMzQwMDAwMAorMTAzMDQgMCAzNDMzMDAwCis1IDAgMzQ2NjAwMAorNDEyIDAgMzUwMDAwMAorNSAwIDM1MzMwMDAKKzI2MDggMCAzNTY2MDAwCis1IDAgMzYwMDAwMAorMzk3IDAgMzYzMzAwMAorNSAwIDM2NjYwMDAKKzE1MTQgMCAzNzAwMDAwCis1IDAgMzczMzAwMAorNTMzIDAgMzc2NjAwMAorMjYgMCAzODAwMDAwCisxMTY5OCAwIDM4MzMwMDAKKzUgMCAzODY2MDAwCis1NDIgMCAzOTAwMDAwCis1IDAgMzkzMzAwMAorMzMzNCAwIDM5NjYwMDAKKzUgMCA0MDAwMDAwCis1NDcgMCA0MDMzMDAwCis1IDAgNDA2NjAwMAorMTgwOSAwIDQxMDAwMDAKKzUgMCA0MTMzMDAwCis1NSAwIDQxNjYwMDAKKzI2IDAgNDIwMDAwMAorOTQ5NiAwIDQyMzMwMDAKKzUgMCA0MjY2MDAwCis2NTggMCA0MzAwMDAwCis1IDAgNDMzMzAwMAorMzIzMiAwIDQzNjYwMDAKKzUgMCA0NDAwMDAwCis2MDAgMCA0NDMzMDAwCis1IDAgNDQ2NjAwMAorMTc2NiAwIDQ1MDAwMDAKKzUgMCA0NTMzMDAwCis1NTAgMCA0NTY2MDAwCisyNSAwIDQ2MDAwMDAKKzk5NTEgMCA0NjMzMDAwCis1IDAgNDY2NjAwMAorNjI0IDAgNDcwMDAwMAorNSAwIDQ3MzMwMDAKKzM2MTcgMCA0NzY2MDAwCis1IDAgNDgwMDAwMAorNjQ0IDAgNDgzMzAwMAorNSAwIDQ4NjYwMDAKKzE4NDEgMCA0OTAwMDAwCis1IDAgNDkzMzAwMAorNjQ5IDAgNDk2NjAwMAorMjUgMCA1MDAwMDAwCis5OTAxIDAgNTAzMzAwMAorNSAwIDUwNjYwMDAKKzUxNSAwIDUxMDAwMDAKKzUgMCA1MTMzMDAwCisyODE0IDAgNTE2NjAwMAorNSAwIDUyMDAwMDAKKzUxMSAwIDUyMzMwMDAKKzUgMCA1MjY2MDAwCisxNTIxIDAgNTMwMDAwMAorNSAwIDUzMzMwMDAKKzUwOSAwIDUzNjYwMDAKKzI2IDAgNTQwMDAwMAorMTA1NzkgMCA1NDMzMDAwCis1IDAgNTQ2NjAwMAorNTc1IDAgNTUwMDAwMAorNSAwIDU1MzMwMDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExZTc1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1NjMwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYyIEBACisyOCAzMiAwCisxMCAzMiAwCis0NzgwIDEgMzMzMzMKKzk2MCAwIDEwMDAwMAorNDgwIDAgNjY2NjYKKzI0NiAwIDUwMDAwCisyNjQgMCA4MzMzMworMTE2MCAwIDE2NjY2NgorNDA0IDAgMTMzMzMzCisyMzcgMCAxMTY2NjYKKzE5MyAwIDE1MDAwMAorOTM2IDAgMjMzMzMzCiszODQgMCAyMDAwMDAKKzE5OSAwIDE4MzMzMworMjc1IDAgMjE2NjY2CisxMDg2IDAgMzAwMDAwCis1MjAgMCAyNjY2NjYKKzMwMSAwIDI1MDAwMAorMjcwIDAgMjgzMzMzCisxMjMyIDAgMzY2NjY2Cis1NTkgMCAzMzMzMzMKKzI4NyAwIDMxNjY2NgorMjc0IDAgMzUwMDAwCisxMDg0IDAgNDMzMzMzCis0ODUgMCA0MDAwMDAKKzMwNyAwIDM4MzMzMworMjg0IDAgNDE2NjY2CisxMDUyIDAgNTAwMDAwCis1MDQgMCA0NjY2NjYKKzI5OCAwIDQ1MDAwMAorMzI3IDAgNDgzMzMzCisxMTg5IDAgNTY2NjY2CiszNTggMCA1MzMzMzMKKzE3MiAwIDUxNjY2NgorMTg1IDAgNTUwMDAwCisxMTE1IDAgNjMzMzMzCis0NjMgMCA2MDAwMDAKKzIxOCAwIDU4MzMzMworMjU1IDAgNjE2NjY2CisxMTU1IDAgNzAwMDAwCis2MjIgMCA2NjY2NjYKKzM1NiAwIDY1MDAwMAorMzQxIDAgNjgzMzMzCisxMjQwIDAgNzY2NjY2Cis2MTAgMCA3MzMzMzMKKzM0MSAwIDcxNjY2NgorMzgwIDAgNzUwMDAwCisxMzI2IDAgODMzMzMzCis2MjAgMCA4MDAwMDAKKzM5NiAwIDc4MzMzMworMzUzIDAgODE2NjY2CisxMTk2IDAgOTAwMDAwCis2MjMgMCA4NjY2NjYKKzM3NSAwIDg1MDAwMAorMzYyIDAgODgzMzMzCisxMTkyIDAgOTY2NjY2Cis2NTQgMCA5MzMzMzMKKzM1OSAwIDkxNjY2NgorMzUyIDAgOTUwMDAwCis4MjggMCAxMDE2NjY2Cis0MzYgMCA5ODMzMzMKKzQwMSAwIDEwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhjNjhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWYzYjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMjQyIEBACisyOSAzMiAwCis5IDMyIDAKKzM4NDY5IDEgNjY2NjYKKzMyNzAgMCAyMDAwMDAKKzQ0MyAwIDEzMzMzMworMjQ2IDAgMTAwMDAwCisyMTQgMCAxNjY2NjYKKzIyODAgMCAzMDAwMDAKKzM2OCAwIDIzMzMzMworMjM4IDAgMjY2NjY2Cis2ODggMCA0MzMzMzMKKzI4NyAwIDM2NjY2NgorMjM0IDAgMzMzMzMzCisxNzIgMCA0MDAwMDAKKzEzNjMgMCA1NjY2NjYKKzI3MyAwIDUwMDAwMAorMTY2IDAgNDY2NjY2CisxODIgMCA1MzMzMzMKKzM3MzEgMCA3MDAwMDAKKzM0OSAwIDYzMzMzMworMjE2IDAgNjAwMDAwCisyMjkgMCA2NjY2NjYKKzYwNjEgMCA4MzMzMzMKKzQwOCAwIDc2NjY2NgorMjcxIDAgNzMzMzMzCisyNDEgMCA4MDAwMDAKKzcwMDQgMCA5NjY2NjYKKzQ0MiAwIDkwMDAwMAorMjYxIDAgODY2NjY2CisyMjkgMCA5MzMzMzMKKzczNTQgMCAxMTAwMDAwCis0MDQgMCAxMDMzMzMzCisyNjQgMCAxMDAwMDAwCisxOTggMCAxMDY2NjY2Cis0NTQyIDAgMTIzMzMzMworMjg2IDAgMTE2NjY2NgorMjA1IDAgMTEzMzMzMworMTMxIDAgMTIwMDAwMAorMzMyOSAwIDEzMzMzMzMKKzIxNiAwIDEyNjY2NjYKKzEzNiAwIDEzMDAwMDAKKzIzNTMgMCAxMzY2NjY2Cis5ODYgMCAxNDAwMDAwCis4MDggMCAxNDMzMzMzCiszMTggMCAxNDY2NjY2Cis2MiAwIDE1MDAwMDAKKzU1NjQ5IDEgMTUzMzMzMworMTYwNiAwIDE1NjY2NjYKKzI5MzUgMCAxNjAwMDAwCiszNTY0IDAgMTYzMzMzMworMzMyNCAwIDE2NjY2NjYKKzQ1NDMgMCAxNzAwMDAwCisxNzQwIDAgMTczMzMzMworMjczNyAwIDE3NjY2NjYKKzI3NjIgMCAxODAwMDAwCiszMTg1IDAgMTgzMzMzMworMzIzOCAwIDE4NjY2NjYKKzMzOTUgMCAxOTAwMDAwCiszNDIxIDAgMTkzMzMzMworMzQ4MiAwIDE5NjY2NjYKKzMzNzAgMCAyMDAwMDAwCiszNjU2IDAgMjAzMzMzMworMzUwOSAwIDIwNjY2NjYKKzM2ODQgMCAyMTAwMDAwCiszNzMyIDAgMjEzMzMzMworMzM2NiAwIDIxNjY2NjYKKzMzNzQgMCAyMjAwMDAwCiszMjAyIDAgMjIzMzMzMworMzQ0OSAwIDIyNjY2NjYKKzMzNjAgMCAyMzAwMDAwCiszMzcyIDAgMjMzMzMzMworMzQ2MCAwIDIzNjY2NjYKKzM1MTEgMCAyNDAwMDAwCiszNDcxIDAgMjQzMzMzMworMzMzMCAwIDI0NjY2NjYKKzMzNzcgMCAyNTAwMDAwCiszNzQ0IDAgMjUzMzMzMworMzY2NyAwIDI1NjY2NjYKKzM4NjcgMCAyNjAwMDAwCiszNzc2IDAgMjYzMzMzMworMzMyOSAwIDI2NjY2NjYKKzM4NzYgMCAyNzAwMDAwCiszMzg1IDAgMjczMzMzMworMzU2NiAwIDI3NjY2NjYKKzMzMDEgMCAyODAwMDAwCiszNTcwIDAgMjgzMzMzMworMzEzMiAwIDI4NjY2NjYKKzM0ODcgMCAyOTAwMDAwCiszMjcwIDAgMjkzMzMzMworMzQ3MiAwIDI5NjY2NjYKKzM0ODcgMCAzMDAwMDAwCiszNTAzIDAgMzAzMzMzMworMzQ0MyAwIDMwNjY2NjYKKzM1MjggMCAzMTAwMDAwCiszMjU4IDAgMzEzMzMzMworMzcwNyAwIDMxNjY2NjYKKzMxMjAgMCAzMjAwMDAwCiszMzQ3IDAgMzIzMzMzMworMzM3MiAwIDMyNjY2NjYKKzMxNjEgMCAzMzAwMDAwCiszMzkzIDAgMzMzMzMzMworMzM5OSAwIDMzNjY2NjYKKzI5MDUgMCAzNDAwMDAwCiszNTQzIDAgMzQzMzMzMworMzEwMyAwIDM0NjY2NjYKKzMwOTkgMCAzNTAwMDAwCiszNDU3IDAgMzUzMzMzMworMzE5MSAwIDM1NjY2NjYKKzMyOTAgMCAzNjAwMDAwCiszMzEyIDAgMzYzMzMzMworMjk1NSAwIDM2NjY2NjYKKzMzNDEgMCAzNzAwMDAwCiszMTAyIDAgMzczMzMzMworMzE4NiAwIDM3NjY2NjYKKzMxODAgMCAzODAwMDAwCisyODM5IDAgMzgzMzMzMworMzA4OSAwIDM4NjY2NjYKKzMxMTAgMCAzOTAwMDAwCiszMTY1IDAgMzkzMzMzMworMjY4NCAwIDM5NjY2NjYKKzMwODIgMCA0MDAwMDAwCisyNjk0IDAgNDAzMzMzMworMzA1MSAwIDQwNjY2NjYKKzMwMDIgMCA0MTAwMDAwCisyOTI5IDAgNDEzMzMzMworMjY3NiAwIDQxNjY2NjYKKzI0MTEgMCA0MjAwMDAwCisyODc0IDAgNDIzMzMzMworMjU3MiAwIDQyNjY2NjYKKzI0MjAgMCA0MzAwMDAwCisyNTAwIDAgNDMzMzMzMworMjEzNyAwIDQzNjY2NjYKKzIzNDQgMCA0NDAwMDAwCisyMDI4IDAgNDQzMzMzMworMTc1NCAwIDQ0NjY2NjYKKzE2MjcgMCA0NTAwMDAwCisxMzc1IDAgNDUzMzMzMworMTA2OSAwIDQ1NjY2NjYKKzgwMSAwIDQ2MDAwMDAKKzIxNjg5IDEgNDYzMzMzMworMjYxIDAgNDczMzMzMworNzYgMCA0NjY2NjY2Cis0NSAwIDQ3MDAwMDAKKzMzNCAwIDQ4MDAwMDAKKzYxIDAgNDc2NjY2NgorMTU3NyAwIDQ5MzMzMzMKKzI4MCAwIDQ4NjY2NjYKKzcyIDAgNDgzMzMzMworNDc5IDAgNDkwMDAwMAorMjE4MSAwIDUwNjY2NjYKKzkxOSAwIDUwMDAwMDAKKzM0OSAwIDQ5NjY2NjYKKzUzNCAwIDUwMzMzMzMKKzQ4NjAgMCA1MTY2NjY2Cis3NTkgMCA1MTAwMDAwCis2NzcgMCA1MTMzMzMzCiszMTAxIDAgNTMwMDAwMAorNDk4IDAgNTIzMzMzMworMzI3IDAgNTIwMDAwMAorMjEzIDAgNTI2NjY2NgorMTY0MCAwIDU0MzMzMzMKKzI1OSAwIDUzNjY2NjYKKzE2MiAwIDUzMzMzMzMKKzE0OCAwIDU0MDAwMDAKKzIxMzAgMCA1NTY2NjY2CiszOTcgMCA1NTAwMDAwCisxOTEgMCA1NDY2NjY2CisxODAgMCA1NTMzMzMzCisxNzU3IDAgNTcwMDAwMAorMzM4IDAgNTYzMzMzMworMTk0IDAgNTYwMDAwMAorMTQxIDAgNTY2NjY2NgorMTEwMyAwIDU4MzMzMzMKKzI4OSAwIDU3NjY2NjYKKzE0OSAwIDU3MzMzMzMKKzE0OCAwIDU4MDAwMDAKKzM5MTQgMCA1OTY2NjY2CisxMDI1IDAgNTkwMDAwMAorNzE0IDAgNTg2NjY2NgorNDI4IDAgNTkzMzMzMworNDYwNCAwIDYxMDAwMDAKKzE0NTYgMCA2MDMzMzMzCis2OTkgMCA2MDAwMDAwCis4OTIgMCA2MDY2NjY2Cis0NTM1IDAgNjIzMzMzMworMTMwMSAwIDYxNjY2NjYKKzcwOCAwIDYxMzMzMzMKKzU5MiAwIDYyMDAwMDAKKzIxNzUgMCA2MzMzMzMzCis2MDMgMCA2MjY2NjY2Cis0MTEgMCA2MzAwMDAwCisxODEzIDAgNjM2NjY2NgorNTA1NSAwIDY0NjY2NjYKKzE1MzggMCA2NDAwMDAwCisyMjAxIDAgNjQzMzMzMworNjI0OSAwIDY1MzMzMzMKKzE0MjAgMCA2NTAwMDAwCisyMjU0IDAgNjU2NjY2NgorMjQ0MSAwIDY2MzMzMzMKKzI5MyAwIDY2MDAwMDAKKzIwNjIgMCA2NzAwMDAwCisyMTMgMCA2NjY2NjY2CisyNDU1IDAgNjgwMDAwMAorMzQ0IDAgNjczMzMzMworMjA0IDAgNjc2NjY2NgorMzkyMCAwIDY5MzMzMzMKKzc1MSAwIDY4NjY2NjYKKzM3NiAwIDY4MzMzMzMKKzMzNyAwIDY5MDAwMDAKKzI4ODIgMCA3MDY2NjY2Cis0NTcgMCA3MDAwMDAwCisyMjIgMCA2OTY2NjY2CisxODQgMCA3MDMzMzMzCisyNzM0IDAgNzIwMDAwMAorNDcyIDAgNzEzMzMzMworMTg1IDAgNzEwMDAwMAorMjUwIDAgNzE2NjY2NgorMjczNSAwIDczMzMzMzMKKzMwMSAwIDcyNjY2NjYKKzMwNyAwIDcyMzMzMzMKKzEwOSAwIDczMDAwMDAKKzE4NTIgMCA3NDY2NjY2CiszMjIgMCA3NDAwMDAwCisxNTMgMCA3MzY2NjY2CisxOTUgMCA3NDMzMzMzCisxNTA2IDAgNzYwMDAwMAorMzUwIDAgNzUzMzMzMworMTcwIDAgNzUwMDAwMAorMTQ1IDAgNzU2NjY2NgorMjEyMyAwIDc3MzMzMzMKKzQzMCAwIDc2NjY2NjYKKzM2NCAwIDc2MzMzMzMKKzE5MCAwIDc3MDAwMDAKKzEyOTYgMCA3ODAwMDAwCisxOTYgMCA3NzY2NjY2Cis4NTggMCA3ODMzMzMzCiszODY1IDAgNzkzMzMzMworNjkzIDAgNzg2NjY2NgorMTYwNiAwIDc5MDAwMDAKKzQ4ODQgMCA3OTY2NjY2CisyODIxIDAgODAzMzMzMworMjIxMSAwIDgwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5NGQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1NTI5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDE1IEBACis0MiAzMiAwCisxMzg2IDEgMAorMjQwMSAxIDI0MDAwCisyMzIxIDEgNDgwMDAKKzIzNjcgMSA3MjAwMAorMjM3MCAxIDk2MDAwCisyMzM0IDEgMTIwMDAwCisyMzk2IDEgMTQ0MDAwCisyMzc1IDEgMTY4MDAwCisyNDMxIDEgMTkyMDAwCisyNDI4IDEgMjE2MDAwCisyMzM0IDEgMjQwMDAwCisyMjYxIDEgMjY0MDAwCisyMTI0IDEgMjg4MDAwCisyMTUyIDEgMzEyMDAwCisyMjk1IDEgMzM2MDAwCisyMTgzIDEgMzYwMDAwCisyMzkzIDEgMzg0MDAwCisyNDAwIDEgNDA4MDAwCisyMjQ2IDEgNDMyMDAwCisyMjg5IDEgNDU2MDAwCisyNDAwIDEgNDgwMDAwCisyMzM1IDEgNTA0MDAwCisyMjk0IDEgNTI4MDAwCisyMjYwIDEgNTUyMDAwCisyMjA2IDEgNTc2MDAwCisyMTg1IDEgNjAwMDAwCisyMTU1IDEgNjI0MDAwCisyMTE4IDEgNjQ4MDAwCisyMDk0IDEgNjcyMDAwCisyMDUwIDEgNjk2MDAwCisyMDU5IDEgNzIwMDAwCisyMDMwIDEgNzQ0MDAwCisyMDIyIDEgNzY4MDAwCisyMDc4IDEgNzkyMDAwCisyMDgyIDEgODE2MDAwCisyMDk0IDEgODQwMDAwCisyMTExIDEgODY0MDAwCisyMDQzIDEgODg4MDAwCisyMDIzIDEgOTEyMDAwCisyMDI0IDEgOTM2MDAwCisyMDU2IDEgOTYwMDAwCisyMTA4IDEgOTg0MDAwCisyMTM4IDEgMTAwODAwMAorMjE0MCAxIDEwMzIwMDAKKzIxMTEgMSAxMDU2MDAwCisyMTEwIDEgMTA4MDAwMAorMjEzNyAxIDExMDQwMDAKKzIxNTcgMSAxMTI4MDAwCisyMTc0IDEgMTE1MjAwMAorMjIwMCAxIDExNzYwMDAKKzIyMDMgMSAxMjAwMDAwCisyMjM3IDEgMTIyNDAwMAorMjI2MSAxIDEyNDgwMDAKKzIyMTUgMSAxMjcyMDAwCisyMTMzIDEgMTI5NjAwMAorMjA5MSAxIDEzMjAwMDAKKzIwODggMSAxMzQ0MDAwCisyMTIyIDEgMTM2ODAwMAorMjEzOSAxIDEzOTIwMDAKKzIxNDYgMSAxNDE2MDAwCisyMjMxIDEgMTQ0MDAwMAorMjI4MiAxIDE0NjQwMDAKKzIyNzMgMSAxNDg4MDAwCisyMzA0IDEgMTUxMjAwMAorMjI5MiAxIDE1MzYwMDAKKzIyNTUgMSAxNTYwMDAwCisyMTgxIDEgMTU4NDAwMAorMjA4MSAxIDE2MDgwMDAKKzIwMTIgMSAxNjMyMDAwCisyMDExIDEgMTY1NjAwMAorMjA2NiAxIDE2ODAwMDAKKzIwNjkgMSAxNzA0MDAwCisyMTIwIDEgMTcyODAwMAorMjE0MSAxIDE3NTIwMDAKKzIxNDggMSAxNzc2MDAwCisyMTgxIDEgMTgwMDAwMAorMjE3NiAxIDE4MjQwMDAKKzIyNDAgMSAxODQ4MDAwCisyMjk3IDEgMTg3MjAwMAorMjMyNSAxIDE4OTYwMDAKKzIzMzYgMSAxOTIwMDAwCisyMzI5IDEgMTk0NDAwMAorMjI5OSAxIDE5NjgwMDAKKzIzMjIgMSAxOTkyMDAwCisyMzQ3IDEgMjAxNjAwMAorMjI4NyAxIDIwNDAwMDAKKzIyODYgMSAyMDY0MDAwCisyMjY5IDEgMjA4ODAwMAorMjMyMCAxIDIxMTIwMDAKKzIzMDUgMSAyMTM2MDAwCisyMzg0IDEgMjE2MDAwMAorMjQyOSAxIDIxODQwMDAKKzIzNzAgMSAyMjA4MDAwCisyMzY1IDEgMjIzMjAwMAorMjM2MSAxIDIyNTYwMDAKKzIzNzAgMSAyMjgwMDAwCisyMzkzIDEgMjMwNDAwMAorMjM0MiAxIDIzMjgwMDAKKzIzMjUgMSAyMzUyMDAwCisyMzM0IDEgMjM3NjAwMAorMjMxNiAxIDI0MDAwMDAKKzIzMTcgMSAyNDI0MDAwCisyMzA1IDEgMjQ0ODAwMAorMjM2MCAxIDI0NzIwMDAKKzIzMzEgMSAyNDk2MDAwCisyMzMyIDEgMjUyMDAwMAorMjM2MSAxIDI1NDQwMDAKKzI0MTcgMSAyNTY4MDAwCisyNDM4IDEgMjU5MjAwMAorMjQwMyAxIDI2MTYwMDAKKzIzODYgMSAyNjQwMDAwCisyMzgyIDEgMjY2NDAwMAorMjM1MCAxIDI2ODgwMDAKKzIzNTUgMSAyNzEyMDAwCisyMzgzIDEgMjczNjAwMAorMjM4NCAxIDI3NjAwMDAKKzIzODMgMSAyNzg0MDAwCisyMzczIDEgMjgwODAwMAorMjM3NCAxIDI4MzIwMDAKKzIzNDcgMSAyODU2MDAwCisyMzUzIDEgMjg4MDAwMAorMjM4MSAxIDI5MDQwMDAKKzI0MDEgMSAyOTI4MDAwCisyNDAxIDEgMjk1MjAwMAorMjM4NSAxIDI5NzYwMDAKKzIzODIgMSAzMDAwMDAwCisyMzI4IDEgMzAyNDAwMAorMjMwMyAxIDMwNDgwMDAKKzIyNzIgMSAzMDcyMDAwCisyMjcwIDEgMzA5NjAwMAorMjMxMiAxIDMxMjAwMDAKKzIyNzMgMSAzMTQ0MDAwCisyMzMwIDEgMzE2ODAwMAorMjMzOSAxIDMxOTIwMDAKKzIyOTYgMSAzMjE2MDAwCisyMzE3IDEgMzI0MDAwMAorMjQ0MCAxIDMyNjQwMDAKKzIzNTMgMSAzMjg4MDAwCisyMzQ2IDEgMzMxMjAwMAorMjMwMyAxIDMzMzYwMDAKKzIzMDggMSAzMzYwMDAwCisyMjg3IDEgMzM4NDAwMAorMjMxNiAxIDM0MDgwMDAKKzIzNjcgMSAzNDMyMDAwCisyMzM1IDEgMzQ1NjAwMAorMjM1MCAxIDM0ODAwMDAKKzIzOTUgMSAzNTA0MDAwCisyNDA4IDEgMzUyODAwMAorMjQxMyAxIDM1NTIwMDAKKzI0MTUgMSAzNTc2MDAwCisyNDY4IDEgMzYwMDAwMAorMjQzNyAxIDM2MjQwMDAKKzIzNzIgMSAzNjQ4MDAwCisyMzcxIDEgMzY3MjAwMAorMjM0MSAxIDM2OTYwMDAKKzIzMjggMSAzNzIwMDAwCisyMjczIDEgMzc0NDAwMAorMjI0NCAxIDM3NjgwMDAKKzIyMzMgMSAzNzkyMDAwCisyMjI5IDEgMzgxNjAwMAorMjI1MiAxIDM4NDAwMDAKKzIyMzYgMSAzODY0MDAwCisyMjE3IDEgMzg4ODAwMAorMjE3OSAxIDM5MTIwMDAKKzIyNTEgMSAzOTM2MDAwCisyMTkyIDEgMzk2MDAwMAorMjE5OSAxIDM5ODQwMDAKKzIyMTIgMSA0MDA4MDAwCisyMTkwIDEgNDAzMjAwMAorMjEwMiAxIDQwNTYwMDAKKzIxMjAgMSA0MDgwMDAwCisyMTY3IDEgNDEwNDAwMAorMjAyNCAxIDQxMjgwMDAKKzIwMTAgMSA0MTUyMDAwCisyMDY3IDEgNDE3NjAwMAorMjAzNSAxIDQyMDAwMDAKKzIwNTEgMSA0MjI0MDAwCisyMDEyIDEgNDI0ODAwMAorMjA2NiAxIDQyNzIwMDAKKzIwMjUgMSA0Mjk2MDAwCisxOTg3IDEgNDMyMDAwMAorMTk3MiAxIDQzNDQwMDAKKzE5NjYgMSA0MzY4MDAwCisxOTk5IDEgNDM5MjAwMAorMTk4NyAxIDQ0MTYwMDAKKzE5MjIgMSA0NDQwMDAwCisyMDIwIDEgNDQ2NDAwMAorMjA3MiAxIDQ0ODgwMDAKKzIwMjEgMSA0NTEyMDAwCisyMDE3IDEgNDUzNjAwMAorMjA5OSAxIDQ1NjAwMDAKKzIwNjQgMSA0NTg0MDAwCisyMTA5IDEgNDYwODAwMAorMjA5MyAxIDQ2MzIwMDAKKzIwOTAgMSA0NjU2MDAwCisyMTQ4IDEgNDY4MDAwMAorMjE4NCAxIDQ3MDQwMDAKKzIxNzkgMSA0NzI4MDAwCisyMTUyIDEgNDc1MjAwMAorMjE0MyAxIDQ3NzYwMDAKKzIxNTkgMSA0ODAwMDAwCisyMTIzIDEgNDgyNDAwMAorMjEyOSAxIDQ4NDgwMDAKKzIxNDcgMSA0ODcyMDAwCisyMTkyIDEgNDg5NjAwMAorMjA1MSAxIDQ5MjAwMDAKKzIxMTYgMSA0OTQ0MDAwCisyMTI0IDEgNDk2ODAwMAorMjA4OCAxIDQ5OTIwMDAKKzIwNzMgMSA1MDE2MDAwCisyMTQ2IDEgNTA0MDAwMAorMjEzMyAxIDUwNjQwMDAKKzIwNzMgMSA1MDg4MDAwCisyMDU5IDEgNTExMjAwMAorMjA0NCAxIDUxMzYwMDAKKzIwMTIgMSA1MTYwMDAwCisyMDM0IDEgNTE4NDAwMAorMjA1MyAxIDUyMDgwMDAKKzIwMTMgMSA1MjMyMDAwCisxOTgxIDEgNTI1NjAwMAorMjA5NCAxIDUyODAwMDAKKzIwNzYgMSA1MzA0MDAwCisxOTY4IDEgNTMyODAwMAorMjAyOCAxIDUzNTIwMDAKKzIwMzEgMSA1Mzc2MDAwCisyMDIwIDEgNTQwMDAwMAorMjAxOSAxIDU0MjQwMDAKKzIwMzAgMSA1NDQ4MDAwCisyMDE1IDEgNTQ3MjAwMAorMTk2MiAxIDU0OTYwMDAKKzIwNzAgMSA1NTIwMDAwCisyMDg3IDEgNTU0NDAwMAorMTk2NCAxIDU1NjgwMDAKKzIwNjkgMSA1NTkyMDAwCisyMDM0IDEgNTYxNjAwMAorMTk5NCAxIDU2NDAwMDAKKzE5ODUgMSA1NjY0MDAwCisyMDMwIDEgNTY4ODAwMAorMjA2NiAxIDU3MTIwMDAKKzE5NTQgMSA1NzM2MDAwCisxNzMzIDEgNTc2MDAwMAorMTY0OSAxIDU3ODQwMDAKKzE2NTIgMSA1ODA4MDAwCisxNjMxIDEgNTgzMjAwMAorMTY1NiAxIDU4NTYwMDAKKzE2NzIgMSA1ODgwMDAwCisxNjY3IDEgNTkwNDAwMAorMTY5NiAxIDU5MjgwMDAKKzE2NzIgMSA1OTUyMDAwCisxNzAxIDEgNTk3NjAwMAorMTY1MSAxIDYwMDAwMDAKKzE2NzQgMSA2MDI0MDAwCisxNjk1IDEgNjA0ODAwMAorMTcwMiAxIDYwNzIwMDAKKzE3MDcgMSA2MDk2MDAwCisxNjk0IDEgNjEyMDAwMAorMTcyNyAxIDYxNDQwMDAKKzE3MzAgMSA2MTY4MDAwCisxNzA4IDEgNjE5MjAwMAorMTcwNCAxIDYyMTYwMDAKKzE3MzUgMSA2MjQwMDAwCisxNzU4IDEgNjI2NDAwMAorMTc1MyAxIDYyODgwMDAKKzE3NDggMSA2MzEyMDAwCisxNzYzIDEgNjMzNjAwMAorMTczNyAxIDYzNjAwMDAKKzE3ODMgMSA2Mzg0MDAwCisxODM5IDEgNjQwODAwMAorMTg2MSAxIDY0MzIwMDAKKzE4MzIgMSA2NDU2MDAwCisxOTQ3IDEgNjQ4MDAwMAorMTkzOSAxIDY1MDQwMDAKKzE5MjYgMSA2NTI4MDAwCisxODk2IDEgNjU1MjAwMAorMTkwOSAxIDY1NzYwMDAKKzE4NjkgMSA2NjAwMDAwCisxOTAwIDEgNjYyNDAwMAorMTg5NiAxIDY2NDgwMDAKKzE4ODMgMSA2NjcyMDAwCisxOTAzIDEgNjY5NjAwMAorMTg5NSAxIDY3MjAwMDAKKzE4NjUgMSA2NzQ0MDAwCisxODc4IDEgNjc2ODAwMAorMTg4MSAxIDY3OTIwMDAKKzE4NjEgMSA2ODE2MDAwCisxNzkxIDEgNjg0MDAwMAorMTc4NyAxIDY4NjQwMDAKKzE3OTggMSA2ODg4MDAwCisxODExIDEgNjkxMjAwMAorMTgyNCAxIDY5MzYwMDAKKzE4OTUgMSA2OTYwMDAwCisyMDc5IDEgNjk4NDAwMAorMjAzNCAxIDcwMDgwMDAKKzIwMzggMSA3MDMyMDAwCisyMDE4IDEgNzA1NjAwMAorMjAzMCAxIDcwODAwMDAKKzIwNjcgMSA3MTA0MDAwCisxOTgyIDEgNzEyODAwMAorMTkxMSAxIDcxNTIwMDAKKzE5MDQgMSA3MTc2MDAwCisxODc0IDEgNzIwMDAwMAorMTg3NiAxIDcyMjQwMDAKKzE5NDQgMSA3MjQ4MDAwCisxOTc3IDEgNzI3MjAwMAorMTk3NyAxIDcyOTYwMDAKKzE5NzkgMSA3MzIwMDAwCisyMDEyIDEgNzM0NDAwMAorMTk2MSAxIDczNjgwMDAKKzE3NzMgMSA3MzkyMDAwCisxNzgwIDEgNzQxNjAwMAorMTgwMSAxIDc0NDAwMDAKKzE4OTIgMSA3NDY0MDAwCisxODY5IDEgNzQ4ODAwMAorMTkzNiAxIDc1MTIwMDAKKzIxNTQgMSA3NTM2MDAwCisyMjI2IDEgNzU2MDAwMAorMjE1OSAxIDc1ODQwMDAKKzIyNTMgMSA3NjA4MDAwCisyMjg2IDEgNzYzMjAwMAorMjIxNCAxIDc2NTYwMDAKKzIxMTEgMSA3NjgwMDAwCisyMDI3IDEgNzcwNDAwMAorMTk5NCAxIDc3MjgwMDAKKzE4ODIgMSA3NzUyMDAwCisxODg3IDEgNzc3NjAwMAorMTk5MyAxIDc4MDAwMDAKKzE5NjIgMSA3ODI0MDAwCisxOTgyIDEgNzg0ODAwMAorMTk2NiAxIDc4NzIwMDAKKzE5NjIgMSA3ODk2MDAwCisxOTI4IDEgNzkyMDAwMAorMTg3OCAxIDc5NDQwMDAKKzE4NTcgMSA3OTY4MDAwCisxODg1IDEgNzk5MjAwMAorMTkxOSAxIDgwMTYwMDAKKzE5MDQgMSA4MDQwMDAwCisxOTA5IDEgODA2NDAwMAorMTkwOSAxIDgwODgwMDAKKzE5MzMgMSA4MTEyMDAwCisxODI0IDEgODEzNjAwMAorMTc1NiAxIDgxNjAwMDAKKzE3MzMgMSA4MTg0MDAwCisxNzA1IDEgODIwODAwMAorMTc1NSAxIDgyMzIwMDAKKzE3NTYgMSA4MjU2MDAwCisxNzI1IDEgODI4MDAwMAorMTc2MSAxIDgzMDQwMDAKKzE3MzYgMSA4MzI4MDAwCisxNzA2IDEgODM1MjAwMAorMTY2MiAxIDgzNzYwMDAKKzE2MDQgMSA4NDAwMDAwCisxNjEzIDEgODQyNDAwMAorMTY5MiAxIDg0NDgwMDAKKzE3MzYgMSA4NDcyMDAwCisxNzc5IDEgODQ5NjAwMAorMTc2OCAxIDg1MjAwMDAKKzE3NTggMSA4NTQ0MDAwCisxNzA4IDEgODU2ODAwMAorMTY0MiAxIDg1OTIwMDAKKzE2NDUgMSA4NjE2MDAwCisxNTgxIDEgODY0MDAwMAorMTY1MSAxIDg2NjQwMDAKKzE3MzEgMSA4Njg4MDAwCisxNzQzIDEgODcxMjAwMAorMTcxNyAxIDg3MzYwMDAKKzE3MTUgMSA4NzYwMDAwCisxNjQ2IDEgODc4NDAwMAorMTU1MSAxIDg4MDgwMDAKKzE1NjMgMSA4ODMyMDAwCisxNjQ5IDEgODg1NjAwMAorMTc0MiAxIDg4ODAwMDAKKzE3MjQgMSA4OTA0MDAwCisxNjc2IDEgODkyODAwMAorMTY2NCAxIDg5NTIwMDAKKzE1ODcgMSA4OTc2MDAwCisxNDk3IDEgOTAwMDAwMAorMTUwMyAxIDkwMjQwMDAKKzE2NDQgMSA5MDQ4MDAwCisxNjU4IDEgOTA3MjAwMAorMTY4MCAxIDkwOTYwMDAKKzE2MTEgMSA5MTIwMDAwCisxNjk0IDEgOTE0NDAwMAorMTY2OCAxIDkxNjgwMDAKKzE2NzcgMSA5MTkyMDAwCisxNjA0IDEgOTIxNjAwMAorMTU2NyAxIDkyNDAwMDAKKzE2MzkgMSA5MjY0MDAwCisxNTUyIDEgOTI4ODAwMAorMTQ4NiAxIDkzMTIwMDAKKzE0OTQgMSA5MzM2MDAwCisxNDgwIDEgOTM2MDAwMAorMTUwOSAxIDkzODQwMDAKKzE0NTcgMSA5NDA4MDAwCisxNDIzIDEgOTQzMjAwMAorMTQ1OSAxIDk0NTYwMDAKKzE0NDQgMSA5NDgwMDAwCisxNDI0IDEgOTUwNDAwMAorMTQxMyAxIDk1MjgwMDAKKzE0OTggMSA5NTUyMDAwCisxNDU1IDEgOTU3NjAwMAorMTM5MyAxIDk2MDAwMDAKKzE2MzggMSA5NjI0MDAwCisxOTE5IDEgOTY0ODAwMAorMTk3OSAxIDk2NzIwMDAKKzE4OTQgMSA5Njk2MDAwCisyMDAyIDEgOTcyMDAwMAorMjA2MiAxIDk3NDQwMDAKKzIwOTggMSA5NzY4MDAwCisxOTE5IDEgOTc5MjAwMAorMTczOCAxIDk4MTYwMDAKKzE4OTAgMSA5ODQwMDAwCisxOTcxIDEgOTg2NDAwMAorMjQyOSAxIDk4ODgwMDAKKzE4NjEgMSA5OTEyMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmU1NDgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbwpAQCAtMCwwICsxLDEwIEBACis4MTkyIDEgMAorODE5MiAxIDEwMjQwMDAKKzgxOTIgMSAyMDQ4MDAwCis4MTkyIDEgMzA3MjAwMAorODE5MiAxIDQwOTYwMDAKKzgxOTIgMSA1MTIwMDAwCis4MTkyIDEgNjE0NDAwMAorODE5MiAxIDcxNjgwMDAKKzgxOTIgMSA4MTkyMDAwCis1NDYyIDEgOTIxNjAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmM0YTExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3CkBAIC0wLDAgKzEgQEAKK2tvZ0/HxdjVSnZDdXNY09VJdkp+fUt1WV3ByMT09PTK2ElydEJSVPP5x9rG1lTF+ezs4//VT2Vifdn+7enr4cFbc2dnRPTl4ODg5cZeTExLf2VaUUnZ9/HzUHZ4bm1wVeTt5P7cYGgXFGZ2+ejv5ufDdWdtf3Rld1hb319Y2MTUz8/YwVjQ1nllf2dxUtv45f/h+FRHZXNGfE/C9cnQWd9ZdcLm75XmyEprEBFrd/jrkJfnx3diaW1M+eTm7OTYQ3p8eWJww+Xj5+Ho+Ft2eHhKQvT/9f70XXFnYXVf3fvg4+XCxlZlfFXBVE9wSXBgZHHQ9MH35NhMQkZLcmV2dHlzZ2Z9c0/UQnFS3NxGcdzNTk5NcXdawvvn5fv02XNpYdj74+jq7f1bZWJm3OTpl5Xo7/hZeGR4fEr35+TolOri2HN4Z2ZmecT82VBMZGZ7T9rM9vHRQHFgb3pAzuX/y9pffWJsQ/Dl5/ndRmZpbWJkW83k5VZGSHJ8fGR2XNjHX0Xb1klwYX7Q9vrj5/BSfH9gb3Dx7ZTt+PREZG5rZN3kl5aV6+791XBwQ0TY9vHNycT28d1bx8NTf3tS09zMz1TcU1fUUNXOycjVdkZFVvf4zV1xS3JjZ1Xk7efG1Ehga25jfnfD+8lTQUN3eGNmZHh+e2ZnZ3xMZGZ80/XF1fb30E1/Z2dnRufpl5GRl+FCfUzc7ZeTnJOV7dR4fHX05fXx/NLF28DxU3VccWZne1jEQXNLd1tXTV5Yc3ZyYX1FzeD48f9Tcn1gZXJP5eng5/ZcdGoQamTZ4eb6zHZmb2pgQ9Hz8FNOc3p/eGNnYH3Z38Hn5OfIeHp8QPzk5eL/2FVzf0jW5O7o6uLm4fjYXlHE9vfCxvHy89jQzM7Pw0R5Z2ZzRNny/ubu58dfWt9XTXZ9T9NYRNzJyFd4YmttTN/+5cBOZGkXExVz1tvdTXZOf2RjenVHUM79/PnwUHZ+ZUDM5OHk//vC1dN1UPD3z8b04P/QXXljZHDN7e3v4fBcZGFFyvrm+dBEWl5UxuCU6uT1WnVyZHxXxPrj65fg/PBQe2FjSMzw+cRLc2NraRVid9bSV17UfG5rahVrYUHNw99dU2Rsbn3F9//6ykF1fnJyWPzn9cjD/ef95OTx10RFx9XP4e3gykZCREnW1sbC293dU1XT3Vx1SkJcX11VXkBQ2Pj6zMvMRH1nSOXtlZbq7+Tx+v/x5efm5P7h7uD7235rFWJayfrs7vBnFh0QF2tnc3lkbxQREhFvYXFX1NFGfGEVF2llUsD3//z3SWRlcETdwcvXd3RIXMbB9+f48Mfd21d2fGZlVfLl+/vn5VFKS1P24JWX78NAc3ly1OWUlOzj5OTj5vfA1fDk4eiXle/7wvbA2sTFU1hxUsPc3FpxfXtjYmx6TkpzeW8Va2BxX1VBe2lrFxRjSEB9ZmRf2sjN1FdRckHX383Iz15+TsbR2vbx/f7z91pD0fDm5fT1+cJOdlzXV8X44eDi5UdmbWJF5euRkJGV/MjGQdPk7eji4Oz3UFNTzPdRUMTP2sXC32doYmV8dkVxeGNua29tfEZGd2R8dWZoZHpzcEtQS39HU0F0YWRNwtvEwchGfHRc8u2V4MxZVlPf38PLzcLYy/j7wMrSfW1hSNnO5+zt4M5NfHFySlrEx8vk4eTl5PHS9ePv6JSX7v1fS1/P99jYwtpT2MVRSUV3ZWRkeHh9f2FvY2R+c3p7Sn1uExJqbXhQ9v7y3EdKSV7F8eXw0vTNUVpERtb15efN0NtIZGxpe15c2/rl80R5cmJufVtVwN704+bn+1fXx8TtlJedk+n6w8jm5efp5Pn918HN1N7zztx3ekVeSFJOd0F9cEFzeH5sahVqfEB3XE96eHp0XHNmZWZ+S0j3+8NRQU9Y1vb48vXHW0N2Z0nZ9vnzx9BGddHWQFLcVNdUx/bwUHlndnFN9v3+5+Dt4d5AcHNOV8vl5Pr9y/HBzOX8xP76/srN1lTX3fP55vrK01p4ZXBe31XW21hLUnZ/TVdXydNYR0pBfmBgYmJY8OX5xtNQZWF2cdH/ycLPcWNmZGZlZX9zStJVcmxqaGdN/eHJ1dd2TXdsZlBVwPPG2sD+7+vj+sDa8/rj4/n44fri7Ofg48jN8NFMXcX45fTxyP7z0d/DTtfJ2PdbZnlyYH58Z2ZLXtrSTkpIQHN8fH9qYXdxdEh82tlkTHFmcFhf/vdTcXl+enfN/P/t/VBkaGlzWcnm/cXFysj+3nd30FRV8Pvzx9FGWUpwQ/Pz9sxFSVzS8+Dl5ebj/cvOWHXFzMP/8Pzj4PdfeXl1z+2UlOdGcnxlTFFEz/jb2N5/ZmV/S0J3c3x1QnRCfWBySXxZWUL01n5zYGplQVTQWkJNRt1WXs1YdVZGd1tzfEBPQtZMctjJ8fjOQFtSzv7/+tZE2NTF4+HvlODyzlzG5+Tj/tZAWdr/5+zj8vPVZWB6ekXY9/jk98XO38ZVdXBG2frk90B+dnB2195W9sxQS2VmcEhJcnl2dUx8YW1rExEUamBleH1/Y21tY2RT/+flyUh4eX7X8fXM5uD7/vP95uDt6u/n+ebh+vD95ePo75WU7ePgydLFxfDl5OX6wEJydnB5eH1JXN7K8lNnZ3J0Ud7f9vj30VB3c1/KwkNzZWd6entwZWV9e2R6ZXxzYGxjZ2xoYXthYGJqFWxhfn1nc9L+4Ob22sXH8+Tl/efp7uDh4ePo6urq6ePs6O/m+f7l5+Hi7uP5/8RNfXxlZXJxRER9YWF+fH9JRNz1+/rPfGxhen53R1fN9M3aWX5zTEdDRNFQRUZOdnx/dd7N2thbc2Rvbm1pFGhgYWJpFRYWFWlhZ2RwX9VQREtN0f3i6ezt6pGWkZCTnZ2cnJ+SkJCW6ODn5+Dj4fvJdWdncEnfzt3W1FJGfGNgZH5zdU/Uw/b2wVB9c1fe1dxRRVTT3srfQE5zf3l5ZGRmZmFjYmJ6X1xERXxnZmBmfGBsYm5uaRVrbmxnfHNwQlPD3N/eXtHP8Pnk8/3h5/rk5Ozu65aTkJeU7ujo6pSVlpGXleTb1NrEw/TL8/H/+dx0fXBczfPx+f3MzFRWTXNJX0x1S3x6emRnbWlvbGdkYGwVEREVbmNmZHpmbGkVFGl+TFNWRVjR3dVYQEdU8uTl98bGz8TC8v3w8vP1ydjR3PfL9vz8/P/m4eX2zsj0/Obj4+Pp6pXv/vnh7ebl5frl4O7v5/Py5+bk5/3z9c/CVX1taBUVaG1vahVqaBUQFhVpbmpqFhYUb3xMdkJTVNdfc3tkfVnX31Jc0VZQWXFwTdz55/bH9fz65OHn+P777Ojj/sTc0VPQ1Njx5ef+V3RHWsnm4O3m+Pr000dG2/fz5eHl//P8+fTx8Pvs7Oji/vLLysBedHpnenl/cGdhfHtwc2R+Z2xpFBcTHRAXa21vYmFtbWJvYmF3197DQXRFcVrfRF7TxuXn/fD08/b3/NlQyv7h4vvy8vD+5uDn/uT4++fx9Pzx+u/s7O7ole3zRHpcw/Dt5M7I0VfHVNH85OPi4+H1y8VYWHFkfHFwTHVhahRuZ3RyY2BuFxUXF2tteHllYWlsZmNhZmltfn1GQH19ZGRke3xyVvPk4OXbV9jO/+Tk/s/w8/b82cXz+umV4//x9cv198rw4eLj6fvP/vv7/fTLyfHKw/fP2v3l5ef99vrk7ejj8V9RVVvRU3Fxcnl0dH58d0Z3YWoRFxcWahcSExEUb2NhYWZkYmNmYnHBwMjYUdHRUNbUTEpRzvz7915OSnBcxcrPzfXZVllG1P3m7OP8+efn4ub55+bi7eno4Obm+/HMx8P8++b698JCWtH0/vX++vnm/dZbUtre0V5JZ2BibHhnZnl9R3VnYWNgYWFgYWZleX5IfmRzSl1eTnBldkhzcXdwe2d7SXdzd0lU1k5/ZEnfxPP311tS3v/n/vT1/PLCyPf74uHm5Pz+/OTol5Xh4+Dn5Pry+pWVl5aU6OTm5uflyfX0wsd3YGJ8f3x0Z20UFxRoYWtrY2RxZnh4dUR5ZGluYmR1WMV1c3FhfGV+dl/J2t5DfmNgT9f23VjUdkV2e3xwUFHKzUJxfVpdx83L5fnh5uTg+uLj4+3n5uTn4uns4O3n4Ob45v35+vrlwFNf9ePv7OH+VX95fF9GQVRfSW4REhdnfUNCcHB4ZGFkfnp8cEF0ZGdlU0R1T3xweXh8RlJN0sH0x0xxedbJ9MxaW39kYWVGS1pc3cFacHrXysr9xc9USVTT+vnw+fjlz8Pe/+Pj7+fh4fH3yebt4+Lg7OT02/Tt65Xj5PJX1lbf29bTUtJYeG1obWBlYWR1f3hkdkB2fGRwdGRtaWJ7dXlne2NjZnxFUcPUX1hyf3te8OX5UUFwYWZ/VdPRREDWSnJ6dMz18/XCztnawP/l5uPn4eTk/vbh4+7u4OHl5+Tt7ubm+/jxxl1B8/n/+NnWQFtbUvfAxMdQd31ka2FzTMNQdX97eXPd1URHc2dgYGlnQXRNcWJra2luckNJWHVyc3Z4dc738vZQSElCfUhBc13e3NLVc2V0TvXj5uXyw1Da8cf0/fH9/85Q8ubi6uL4+ubn4uvi7ez68cr2wfjh/+TJdn5+eXfI9/T900dMcGBhd3bdwUBCdmRifnRz1dFZXVxxZHx6dkR6ZGdhYmJnY3lDS3Rwe2N0UtH3UEF2eGdmQkpMQH1/e3pjeV/A4Of99/H8/e/u7ez6/czM1N355O3g7evrlezr6+Lv4+D788VSzPb7/tpacn1lc1NWxNFUTX5haXpMwPP1xkVNfXJBQE1CSEhxcXt+QFPVQ0xwcmRsY2BgYGR6c3BkZUfRxNFGcmBjYnhIcHNEWExKdXXD5OPp4//Dw1XW8Pr5+f3C00J5QMn0+uzr7e3h5+3h5+Po7uPi8vT6/vzaTWFme2RC01BE3MvaxEh229LS1dpCfEp/QVTU2cD3TXF+YH1zR1TWQmFkb29gYWVlRkN1fWJlS9XBwsR0TXZ0WnB4ZHFJeGVie3VC28H9xMD3yfv7+OTl5/HAXEff2vj45+T65/vj7+/i7+vp5vLHysPxzl9xbGdnf3Re3dr3/ffUXtP95+Tx+d1HeHh0R111UVp5bG5pY3JbQ1B2emRke35bcUfQ13R5Z2VC1ktAWnN3dF1LU3VD3FJ2ZX1xXvD1xMRHTE3d0+Xs+uXJ1ExPUMLj7OTn9VNGyf/77eTv7+TLwfH94unl/VdyZX9Icc3I9c5WS3DV3vbj+/bZfGBgSV3D9MnMXHJkdU9extrVT2djYXF1QdLRVHBjFWppZVbQXnZmbWBK0sDJzd9KZmtmStH88/PZfWxvcMb67+zs/NNCU9LE4Ovq4PHXWsX84JWVlpbu/NrN9efg5PZbZWJmdkXD9c7GSn5+TNf04ODzVn1kZ3fZ9/RNeGJvaW97RvD723dgaxRuc1rb19FeeGIVYHfb+MhccXxzfNn+7eL+9NrYR1zF9Pv3X3B7ZGBN9fPwyc3e09Ha8fvj4vBYdkBAX/b+5uXz/Pz33snh4Offcnl7f3DL5ufy2sbdVNzE/v3480FyeHFL2fDL3kpOTXVLd8Xxydx7Zm1sYmVDR0JLdHxmYXtLTHBAfWdjZEtW2MfaUkJDXNbTxdjT3E9/ZXlL3vj8w1FZUF1T9+Ds4uPlw0ZNx/Lh5uHm8vX38/jh7eD+yNdMe31x2/3Jw97I9Mn2+OTwxc3EQ3pxdEVZZXh7eX9+Q0bRwV1Cc2Vien9y3UZyZWd/ZHFE2PFEdEF2Z2RNU/b019ZDX9z55vzn8NhaeWdnd3dXw0F2fE9c1ffy7ebD3V9AQtLO8OXyzNbWxPLk++Tn8MzT0lTbz/Ph5cNAXMDw/vrj4/zZWV51Q9zL/cBbeGFkd97w5+fxRWNpaWJycUFJe24UbHhC0NPSRHlnenR9TFLT0k54Y2Va3fH3w8vFW3VBQtHbXVFMcGd418rm7e3j/N7W9fL+4u3v5s9YTtz04e7g5/7DXkJHRtvCwtlAfmZw0f7h5fj1VUxO1NTNydPXc2ZgZUTa//PI1k53fHVGWVB0cHptaW97R8FVR0dCWV/bwtrG3NtFeXp5Wt/85OT+w9VERl/RxlZHcmBsb3rV++bl899FdUjRzfXP8cB1e3hG0/Pn5+f88eX55ebg5vvyz8bawPLn+sdV1UdF0cnl+vTc0XRkZX9ZzPH399p3cUxzSEFDfWVsFhdqb3LVQHdIcnhwfV3O3lRWWHlld03Q8czR0nV4X9zC/OTy0Vt4fndw1//+z8LIyuXk5O3s5fX310hSUdL9+fX38sD0+fzl5P7N0EVxQEh33PbXSnRydFXb8uHl3FFAemBnc9L2xsv2213Q0VzX1HR9YGpqaW5vcEp8d0lexvT85+fxys7AxtDV18LYQUdCdFrHw97eX0t+ZWV4eGVO0VZFRlzH2tzL+vjN1VJNcHxwVPDxyvnk+uXn7e3m+fDy+f33zcL3zVxNWFffxfX1yNxB18LZUlzS0lBGWMff0sH3z1FOeWRhbW1vbG96cWd6c0pW29zewVJ1RkZIeH9JRF90T1JHW93aV9JQc0tQVNva2/f99sn+5ebh4e3i5/fE9tF2d0hS2V1ExMLB/vr6+cn19PHP3t9dTnBzcndDSFfY3c703Vjd1lhTUNDfV8DE1F3WzsHSQEpxeWRjZH9lcExHQ3VM3NNBXNPf28POwtVYSXFwc0TX0sbF3VTXS3BAQUh0SE93QN/Gzcf0/f7n+vDT2MBPdnFd3t7Q1czK8P//+vz99v/n8PXw/cReX1DW0EVVV9fSQEB0VMTX2N7aVdjCV8/Y2MXd301xeH54YmFkent6fmR7cnBHRV3W3NxdxdtdU09xeH9+cFNb19LPyldaQlfNzsj38/3z9sHw5fjn5Pnxy8DU1lTW2tvM1dVVXlFeQVvcwsba0MPKUkdOd01IT3dydUBGUsTczM3B/vry9srD29FS2PDywN1VSHphZ3p3dXRCTXZ3T0hLX1LS0lfRU1TezcPWUlldWnd9f0VCTEdIQExCRV9SW1BHQVxQ0sLz9vPyzsLcU9XD8PfDVFTDzsTM/Prk4fjw/PD85Pr1291TTnZxQ1NbWdBQXdPQ097Jzs3aW05T1tDYV1hXWHdweWR4cH1+fXx4fHx6ZHpzWkB3SlXc0srKzNldQkNBRl9QU0VNTFzZ2dLA8/D0ysb3++Hj5/r7/sJXW0Rf199TTndAUFXfxcnx8/HM3tjd093H9cnFVkFzdklwdEtaRkNR3NjE9P78y93ay/3yzNtVU3Rxcn10Q1pNdn1/fHNLR0ZV3NBSd3ZZ1sTbzvDfTnRMQE1BX1N3cXB9eWR6d1JW2M3NyvfwzMXMw8PE11Tbw9vExNnXU1vExdDP/Pnz+Pv++Ofg5ub9xldxdE1HQNHTUdFeWFxW3Nr28MLf3MTLwV7bz1t1Q3FnYWNnZGd4eXN2dHV0dU5wfEt3fELT2vXy9dRCdUBfX1bGwcTRXnVzcUJR2sv18/zx/fzy+uX88v3N2VVUVVhBTnZ0X9LY3d/dUkRT3d7G8f3z8sjYVFtZW1BU0tPb0EN1d0/Xzf/h5/n88vbK3NjDw9hTSH9nYGdleHxzcENKdkFKSkNbX1fdyfPL3l1AdH58TFNT1F9AWXFycH57dNHO98HBw8TEzcDJ8PL93U9HS1jc2snw88nA3NdbXFTHzMn9/Pjz8fjy9MDWUVXY39jdVdRRQUBfUMbJ9cTQ0lfE9c3T28/MXnF/ZWBsYGRle3N3cnJ/fENGUFXZy8BX1dJXxdJSR0xR0Vda195dRXRGX9Lz/v/8yd31x9HDyPP4/c3HUVhfQF9Q0N1fQ1hDd0RAXcLbxs/GXl9Q0cjQVNbBxdfc3NbRx9Ze1FTZ9PHw8MHK/vL98fDwysRCZGR8eXxMXl1Pc3lwfXZBQVhe11VATHd0XNFRWk51R0FMQERZV9NTTUJRUkHS2lfRwvHyy8L3zcfa3tPY39DGw/bAQdddUd3Sx9jY1MDWU9ZRwfby9s3U0cRUw99UxNjc0NVe2cTJ9MPOzc/a3FHV3EhCd3Nye2VlfWV9ZWNgYHl3SUfX0d7J2MvD2PH/zNRFdVNaW1FQX11cSUpxSl3Wzsz2+eX/+Pv08vDC3FZbUF1IUNnd1UN0cHRQ2FXd3VHHxtLW1NbMzVlOd3VR39La9uXlyNrQXdPZwvbw8f7wzcvN2cTSQE5OdnB5fnd0dHR9fnx0R3V8dkxCW0ZGU9jB98NBdH99Sk1HV8TB0V5DQkTQ2dDYzcXS0N3JyNrw+PP29MHQUF3a98nGUlbLxNnSRVnW19vc1vf/wsfUTUFZVdnfwfDM3N9IckN1WtjL+P7Z3sfZyMvaxtBSVXFlf2dnfWdhZGd/SnN2fGVD0NzAzfbl8svz00dfS0DT0cbLU0JMdEBSVNjAyvPF2ffK/eTxw/Pw8fRadkh1WtPRXFhW1V9HWHVAWHdJ2Mvy+d9TXnZ3RlzX9fP1xdrAxsrH3cX9+vnyVl9QUNjIydLC0UpLSnZ1WEx3eXNPSHd9fnl9fXVDQVFQWlBURdHdQEBZwP/20EFxeXd1XsfF9vzaUNfd9//++/jn4eXPxNVS0NDCwlBeVndxUVdV1ltJRMHy8MTF2lRHQFTY2sr83VTfWVbXWU3a9PT33lVcWlnSy8nTX0Z4ZHN9dEpycEp8e395ZX92c0tMX13fw9Pbz/XP311dwMLJ991AQ0tzQFfazsv129zbw87w8vvj5vjl9tXTUEdbWF9RRn1zdENZW0FJTlbb0M/L1sfSUkdPXsDO08r0x9vbw8nz5+bz8M5bQExHWVPU1017cnJ+d1lWWdXE33dxdHp7f3J+fHFPSHZBREhAVlZS0sr99fbK2VVZRE5fUMHHVdDZ1V/e9/P74ef89Mbex87L9PTI9d9GSFhBS1dUQU1T0tDd3drVX1FRQ01U3FZVx9nezcrJ9PTY0FN0SnVF1MXEyvLAXHRIdXZHV1FTX0xLem1hZGV/d3dKdENfX1XfxMfJw8zKxM/QXllNdkrR38DNy8FTVtjA2PLl+vzK/8vU0MPA2vbKydDRX09aXNXUzMDUWEZcS3ZJWkNB0sHZXVXWU1fE9M7M/eTy9PTbX0hFUlTG8svR1U1yfE1FQ9XE0XR3T35hYXJ9eEhVWXNycnZ0SU9IXdHR1FdXWkxH1VBE2/PIxcHG29zBzs/15eHl//z+ycT28fb65fb33tTVVtDVVdbB0UR1eXhlfFpHX87y9MRX0sfV08TBwvb28MdDTHdwSndN0trVUlnV1VhTX0xXx93cX3ZyZWNlenFFREdPcXJ0Wl1OQcv3y/TYUlVDQVVaVtnY39bcwsz1y9jA8fLk+vTM9cTNysPw+PDE39vUW1BYcHRXxMZQTHd5Zn13ddL398HS0dTZyNtXw/rk/fDxxl1E115E1d/HVVLHxdFSd31zRVdQWkB0fWVhY2Z8d0lyfEN1dkt2c07N9vXY31l0c3RIStf39tHZ//H0x8XS2ffB9vDz8v3zyNjf+OH68vDm5f/DUEVBxdLVWXV2e21iYWVFw/f09PP1wt3UV8P488/O9d9dc318flxVREbVysLeU0Fwd1pHWkJ3SUN5bW5if3B9TlBXW1hHQ0HS9/P+/czdXXd+clrJ9M/O9fD0zlBHVt7x9fH7+vr9z1dbWsLx9P3w5eX+w1FeRdRbWddedXNkY2d4XdfZ8vb32dNdW1ja+fT2/fL32l93T3ZH11Lf3czN3llIdnBGSENZcXBze2dkZHdGd0JHSnx/eXF0WsnD8/jGRXZye3t50ffH9fH98creUFBV9fb44Ofn5fHe1lTK+OXg5vv5+ffVUN/KxdjSQXF6YWBkZElWV8Tbwc/IyMfByf7/9sdU30dyZGBmcE1E0t/LyMbUSUFGVNHS1UJJe2dtaWF0TUZfdUp3SnR13cr4/fLxz99SSX5/fFpQ28DQyPP0VlrV3cr25ODh4Of0XE1NVcH2+f39/MraVNL3/c3YxUROdmVmZHxCVl1RRV3b2NLd9P7wwsHO38jLUU11S0FTVcLK9PfbUnRJXV1XUVFESWVubm1nd15fUEF2cH17fV/Ewdrf2dBRR0hOTl/X1FJX1VJW0FtMRVlR2PDm7e/v4fDCyc72++Hg4eT/xNXGxtrZUVJEdHN5en11SkVZTENfUdjZwv778MjZ0FVZXldOdXZzRkRWxM3EydRJRE5xTkpbXUlyZWBnenlEVFHSV1hSdnfX0FXa0F1fQVhbSltVWdbe1N7R08/XR1FYXsHN8uPt7OP48MPQzfHz5eT+9ldS2FNR01xbUEVASHZDRE5BRHV0QlTM9fzk//LxzNrdV1ZWSUxKd0Vf1cb2ysTS1VB2cURR3NZTSmdjYWZgfnV1dEhNSHdKQVxZWl9ASEZeWVTGU1zVWVpZV9bW01ZZSExUzuXg6+7h5vvHyfP44+3t7ef3x9xXWEXd39HfUEZHTHBfUklDdnJHXdTMyMHb2MzF2M3UXlNOeXZxSlVR3/fZW0R2cnd1V9HYUn96ZWNhcnJLRUdd1VBT1lFT3t1V193R19jc11dSQF9cRVHT11NQTHVE08X/4eHi5fnKxcvy5uTg4/r10tNNX1lERVreV1Vd1t1cVlNEfHl0dF7azMnDxNPewM7y8cnBVkdMXVRSxcPYQ3J+eX98RFLeycJFf3dyeX90Q31xT3R2cndaREFYdX1MSH9P1lZeW1BeX9XawMTfU1xIQNZW/e7u4ufk+OX6++Ls7OPm+czC3VJSXk1D1FVXVFbEztNTX092QkhzXt9UT0xPS1TF29PR2UVIdEHUXsD32lxKSnlwdHFexcBDcXB/eGV/d0JaQEVB0tzWwd/FUEVfWll1TVNXQHBKQEXQ38TE29FDRl3Sz/zj4eTk/PXH9/H8+uT6zM7H2tFU0VbfxdJfQN3f1dnc3FFMc393Q1vd297R0d/J9srxysxUQ3Zw3MPcxcTLVENwcFNEU9DfRHJ8ZXl5ZX52S3ZxcHdaRkJCWNVTRnJzWklwd05wenZKWVDf9sTdR0VH3Pvk5uDs7OHm5OHg7+3l5f/13NjF39LCyMbMw93C9MHE1dDQcWVlcXVyc3Bwd01a18PA9MRaX0J8c1Lb11PWVkxKd3VS1tXRTEp2YWVxdHF2QEh0d0dc08/Yxt/Z00NNTkBHQFBJdnZ2W1DFwdJQQE5/dtTA//nn4+Pj4e3j4uPn+sDdWEFZdV7Q1NbfzdHe9fPz9cvF01xMTXd2dXNwf3F2WNv0+P/3xdnVT01aXtVRU1dXW0lC0NJeXkZ3fX9zdnB1cnlxdHZxQNzSRFBUTUdBTnVxcXB9c3Nyc0PXz83Q31hAR0ZXwPLy/+fi7e3v7uvv4eP82MjL2tTT3Vfdzff09f76+/TA0kFdRXN+c35hZ2BldkvSzffD38RHT0p3Sk5YQ1LS0NvRU9/E1UFbc35KfnNwf2dkcXJIX9zP9MvSxNxWwdZWVHV+eH9lfklWxsHM115NfndGQdLOzPb4++Xi7+/s7+Dk/8DPwNPY1UpK0NdUzv34+Ob59vfT1NBFQ05lbWdgb35Hwfb//8ny31bS1t/a3XVc10pAVd/Q2dlEXkp+c3BzcmVjZn1hYU1WVMTK1dXRU0ReXU52ZGBnYGB8WVNWwlFaR0hPU8b25fvl4OPj4+nq6JXr4Ofk//by9cXfWN3cVMXw5OTj5/P0x1F0SExlYW9raGljf1PR2/fb29RbXFzXUVJIcXV8cUxT3NP320BFdnN1S3x7fmFlZmZwQ9Tb8/TD9cDS1FBAcU1lYmRnfEJXXNrJUtBWTtDMzvX48Mnl5+bi6e7pleD65MrFycRXxd1LQ0dO1v/n5uLh/v3FWlBHeX9/bGhgZnpGXVLGyMDGxNTJ8d3EzVJ0TENG0sDFwd5PcHZ4eHNlYXpnbmxjYXZXVMfIx9dUUEVFS3N2eG9uZmZ5TF7WwNrUxtnA//j9/Of4+OPi65eWlJXu5+T7//v79MDP1k1HWNb8+v7l+M3YVEVWU095YWNpaW5tenNxQlVeR9ndzPPAU1XXQnVDUMXPwtJRdmV+eXlCQH54eWBiZX5Yx8nIzsRbRVBS2M3VcH95YWFmZXRHXtDa1d3Mzv3l+PX2+fz55+Lplevm5P7P9fHx//DfU1dacUTD/fj4+fLL21fWx8n1XX1/ZWJiZmV3X1TT2NvQyP//9cjG1NlRW9fQ2sZHd3JyZWRleHx4Z2NiYm5kQ17c1VNZRE51Q9TaVEl9emRuY2BnS1tFU8bY1c79/Pv45+Hj4O3rlZaW7u3j5//9/vb0983E2tTR9/z45/LMwNNbQlnWVEV8Zm9pa2psZkXQQ9nA2VfG9MXL2t9RQ093TNXY20NJRE98fnJ8cnJlYWF6fnBQxc/S0tdYXl/a9c7FWX1kYW1ge03Q2FdX3NrDwPL5/+f49cvx+/jt6O7j5+TwztjPytvM0EXT2sj25uPn5fXdUVLVVtjXRHJiY29vZ0rZwfXfUs/D3s3+/8zER3R0cFDfz8dVWHxwZWJkc3xiYmkUYmNkRd/T09NzfE1H2Pf1V3Z4bG9tYU/f0V/cSXTI9fHm7eLh+svP/ubolpSU6+fK8/nK+eH/0VtGRcj+5O7u4ufYdXVERVTN1X9tahQVbGRSwVNbcGVKwffy/v/MTGVnZXxXwfDaVFhmZmV9dEddeWwVFGJ/0/P++P3Mdn5Cxfz88NB2ZG9sY3LR2sVBd3pnWs/h4uHi+cVHXMrm6pXq4vrLTFLO+eb+91BzfEjY/+uV6+/kyUxxVcDw9NpMZGJuYXtV8PfHQkt0Sdn35+f00nd6ZGR03fXyyUF2f2BkcUBceW4WEBRuYUL3//Zcd059fd338cdTfWNjYGZIwtrUcWF8TF7E+O3i5/bH8frk4paVlej58vLy/eDv5clafEjN8/LolOrtzNDbxtPN8NNBcm0VaWZnQ9JDTmRhfUNU0vLx2ERlZn9eRtzCVtBJemVzQFHTRHhhahVsckbV/fPz3H9xUFbF8vHQUHNhYHlE0cpSQnFjZ3RWwfjl9vbVR9T3+ufp7+bk98HM9v/j7cdaS3NIU//h6+vm5/POzPL8/frbQn17Z2N11c/xQUt0cHBDy/Hk8FBAdnF+183RwF10cn95fVBaVnBtaxYVFWN0TNPVQ3VLT171wsbL1X1sZ3h7UtzH0ndlZ3JOx/T/4f7JUM38+e/u6Oro+Mr5/+Hi4uz43ndJ0cX74uni5czY98n65PT3xXdsa2JgfURTQ3xma2xmc8LM8cJCf2V2cdb3xNtRTGdhf3HB3EBNfmMUaGN/xMDE29dHQN/S+ubN9tNJYWZydM3D1dBdfG9ld93l/OT8xlZRy/fm7+zj+vBQV8734uDh5dtEc0PQ8uzv4/j+8Mv65u/u4fRIc2FifUfY30B8ZWBsZUjb8ffMWE1KcljFz/bGcX9/YmdKWdNeSWdvaBVsenF0d3h4f3tI1dLJ9cNBd3FkeEFSVldCeWRmeVjZ+ufl+f748+Xi7+/u4P368cDy+OHj7OfOwFbR9+Tk5uH/+/L94uzv4vvITnFlY2RxfXp6bGpoaWd3Wt7f0l5MTklXz8xXX0V/fXZxV8fPxVh8bGJgYXRHS3VAcHNT08v//vffUUhLSnxFX010fWFtenJCyfLy9Pbx9fn65uLm8vbN19jF3PD5+vLIxdDPwvT5/PL+8Pf45uPt6e368MVZT3F/dHdyemZgZntxQ1Xd3NlXR1hX1d3B1FdVW0ZPTE9aXEl/YW9ubWJhfH1/dnJzQlbX1sXbUUBxcnJ+cnV2c3x/eXNIU9j2+f//8+Tm4O3i7ODg4fnz8/zz8/3Px8/K9PH9/Pr6+/n45eTj7+Dn+cvBXE93c3lkZ29vb2htY2V6eHdJS0FSUd3RU1TX1NZXXlBFdX12fWV7e3t7ZX9IQkhORVjW3tvS39pZWE92dUh0fHR2e3J9cV1UxPXyz8Hw/+fh5uTm5v77/PH+y9rV1VdZ2t7G8/Tx+uDk+uHm7ezt4ebmytpTTFpDfn5xfmR6e31KdFtfVV9KWV3X2NnDzc7RX1xEXkByZ2FmbWBjYX55eHl2c3hzQkFcR0FWUkx0T3RBT313cn16Z3NJXdvJ9P/5++fi7+vo7unj5fnz8PDw2lJXV97ZwPH8+f378vP8/efj7Ob55PXdV0dKf3ljbGloYmNmf3RAdndLSllGXtHfVdn03dJQW9zRUkp/f2ZmZHp9cUdGQXZD1VPb2c3HX1tLcUNNXkFIcXx8eHN9WNja2tFU1MH85OPm4+/i5vj49cvA1VFTSEtJXdj1/vrm5/r4+/rm4eDt4Pjw9Pf398pZdH1kY2Blf3JOXl1QXlLZ9fHN39JcQk50c3J2cH99c3thYGZgYWBnYGZhYGRwTHddzdheX0J1c3ZzfWR6fHp+dNjG9vz98fP85+zo7+no4OH65uf68fXA1dZV0tfbzvbz8PT++Pn64+Dl4efl+fHLzV9xcH5hZ2dhZn52d0FCQUZGWUVY0NbTUl5aSExPSUpJfmR8eHpzcXB0S3R1cHN3dUdY1drb3sXd2l90cnJ+ZHlyd3RX3sn1zsvx/uT+/+X+/vz8y8DAwdTZzN7U3tjF3FjYx87198/x//vj6e7g4OT6/P3DV0h2cX1zS15OW1XQRFhNRVfcU1PS1tRXU0J3f3dxcGRnZmBkemRgZmBmemVkfXJwSlJQUVNdRU9MdnB9fHZOT1XHxM//+fX19/H55+Hj7Ozi4uPh+PD0wFRfU1xU28vP9fL88f3w9/74+ufm+PD9/PDJ2NdNc3JxdXdJcH1zdXZzdE1xTNBWVNZQREd0f2Rlf35+eXhze3pzfXN3cXNLT0ha11FZUEVPREJKSEpJTXdLUlNT1NRVw8Lew/f1zfz65Obm5Of+9sj1wNLcRkxGREfW3Mf2/fb9+fn7+uTn5/788/z29srFx9xQ38zQ0dRTREVKS0h2dFpW3MnA39HXdXN+ZmxibWlgZGVkeWV/cH9/d3Bwcnl3cHJxRUJ2d0N0S1td0NnZXFbQ08XLz8n1+eDm4Ozs4+Hm5P3z98jG29jHxN1QVMXa9fDz+Pvl+v328Pb1w8jM2NrE2lZQU9VRXnRDXnZ2dEx0S05LT0dT3MXVV0ZDSnB+ZGZmZHt+ZHp8cnZOTV9UXUVRXU9GRkFZRHZ2cHJ0XcPE39NXUtNWVldV2cj+/f7/5f798PHK2sfE0ExYVtZcRE5d3MDy5eDm5Prn+PT098P0//j88Pf39vHzw9hdUtTcUEdG0dZbU19eR1FWV19BcXd2eWRhYG1jY2JjZWd6fn13T3dwS0l9e3JzdXdxc3FwWF3Z38XN19/E3tDYxvL75f7k4ebl5uf4/Pf++fLCwcLb1V9LQ1vU9fL++ebk++T8zsHf09/e0N3FzvbMyc3dQU9FTEp0c0lFTHZKXEJZW1ZYTUxDT3x+f35nYWFmZn1zWtVEUNnYQENBSnB3d0p3cnVeUNDe3dFcVtbQW0ZcxNPO9cjJyP375/Hy9vbOyM/OxNBSVll2WkRU3cjy+ufk5OTzzvD98/L3zsr1+Prn/fLyzMTEWUxZQVPQ1nFMXkZe21VGQk9NSXZmZ3tkZ2dsb2liZHF2c0NJd3V2Z3t6eWV/ZWZ4S0bVxdXTUNVQx9VR3Mnx/v30/vn45+7h5efh5OX/yM7LxdbSQXVB3srw/OXk+c7199DSwMzYzfTMyvLN/f/c1dVeTE1NdXRHQ1BYcUpdWFTdU0RBR3NIdmV6c3pkeWVnZHl5RVNeU0Z3dnRwdHdzcE5xdkNBQ9ffUVRdW17WXVfT39L08cr8+P385Pr4/Mray8/Z2N1aTEBDRdRS3Pb5/P7/wvX39/H89fT9/Pz68/b++fj9/cPH2NvQ2lZBX1tBV8RU0NLeWFp1fHpnYWFhb29iZ2d4e3BKS3BKcGZkenpme2V6fnx8RkNIR91WRNDc0lZU0Pf19fPm5+Ds7u7v7Obi+/bK9tvT3NxfXVxZysXCyPRTUtPc1tzT3vPGxvXz2svx98/OxN/009fWU0BRWUZCXE5TyVTb0UFydUhzfH9meHJkf3J+eUlEUtVdcEpCcXd2cnxwcHNxdXlIX1PUXERGXdHW0tdWz87B9P3w9uXm5ub/9/D029NWRU1BW0FeXdzN9fbxxVlY08fcwsjw/Pz55OXw8Pj5/fn7+//y98jE28DJ0FDf2N/Y2tZScGdkeGFsYGZmYWdnf3lkfnRwfHN7en5kZ3N8fnNxen9JT0JbXlHRUdLf2d3N9/74+v/n7eXl4ebk4OHn5/rAwc3QVlFZQlXbwszFWVFQTXZPc3BY18PKzNT198Lf2NfO9v35/87U9MnMy8RBVNnf3tpFQl5xcnNkb2BhfnJ9eHdLdUZecXxOS19EdGVwdkld1HByQEfT1Fldx1LW3lJ2XN3b9/H38vrw/PL10cz39/fCUV5GS9fQXEtQ1Mnyztzf1VRVX0xzTVzN8//0/P38/fP08Pr45uHk/OX6+v779tDW3NHV115bQHRlZWJraGNnZGV6eX1/fHNlZmd+ZHh4Z3pyf3RfdXJwT3VTxs/IyNzZwN3b9f/94ePm4efy/uX98PLL09BUU1TQ0MTSUdbb28L3w8XTTHdOcn1IQVve9cPIwcXO8fXy8MLN8fHx//D3/vzDx9FTX9/R1l13eGVjY2R6eHBJdk9bQE1ZQElJcGdlfnlxQUxBUVpYRltPUN/YxsdUXNZV0dv1wvP98vPy9MDLzdjd10hxfXdIUllaV1xZ2c3byPfM0NRPcU5GQd3DxMvx8/T55Ofh5+Xk+/z45eX64OHl+/3Mw8DX0tRGeWRiaWlsY2ZkZXtkeHxxcnNxcnpkYWBgZn53RExJSUJLWdbCwMvKxtHc2cfI9uXn5uTm5Prl5fP0wtRFQ3RxWFfV3NlSUtXT3Nvb0FRFdnJ8eHJNR1tWVllc087//v7+//Lx8v78/OTh4+bk//f3ycvCVUx9Z2BgZGR7eXl/cHJxQVlaQ0FJc3x7ZWV4cnRMQkJNTlxU3c7AwMfc1FfZwc72/fj+/PbL9vXG31NOdH57fXZxQkdEUlRSVtvFxN3dU0VLd0pYUdzc38DCzsv55Ofm5+fh5frk5uDm4ePs4Of6/8rN1kFyZGJubGJhZmRgZGV6e313dXB+eXhnYmdmZ2V+fnN1SVDE2szw9cv39MHMyPzl+/jn4OHn5+f78cPAVUZ0SE50d3dxdnVJWdDTxM/SUVpFdXxwTERFRF5HWlHQ9PHx9vHz8vL45efh5+Xk5+Hh5OTl89pVT356ZGZle2Vken57c3VJQEB3cnx+f357c3RycHd1SETUwfX39vDxy8z19vTx8ffz8/36/Mj0zNZEcXl7ZWV7f3hnZHt4eUNX0dvT1NdASltHQFXZxMzNy/bz8/zl5Prl5/nl4+zv7+Hn5uX4+/ny98rMVnV8ZWRkZmRkYGZnZ3txdnd2f3plZGFlf312S3d8dHV1U9vYy/H08ffI9//y8vLz8uXl5OHm+vPx3lhfRUtDTHd0dnJ8c3N2R19BSXV2d3N4f31ycUBAQFlT0sDNzvbx9PXy+Pvk5ufk5eXg4frk4OT89cfYV090dn5kZX95ZXJCRF9aQkl9en1/fn13QERISV9SUVHG9vf0/P7z/v74+vDM9MjMz/Tx9vTL00J1cHJ/e3t+ZGdnYWFlen92c31yfXJwcnVMRURDRVRQVMDI8vz4+/j+5efm5uHj7ePm4+Dh4Ob69NNdUEBwcnR3fmVnZ2Vke3R3fnJ3cnp/fXN0cXB0d3BOXlLU9v/8/v744eT64ODm5OT6+f7l5uDl8ff10FtdT3VMSnVLeHlwfnlyd3N6Z2ZgZmd4d3d6eXd5ZGd7dnVxR1hEUN7Mys72+f78+eXk4eHt4//z99nVRVvc31RTUFhbS0haWV7VUVZHQ1BVXVtAQ0R1SEBb18vz/PL28Pz38/rm4+Tl5uX++/L3zVVT1099dnd1SHF/fnpnZXt6fk1YdX57e35yeXdFdHFFQXd2TFPX1FDWxNVTxcn29PfDxMj2/uf5/Pj8z1NNf3h2T1ldd0tZREpJXVJbRUJOQ0tDVtJcXFZJcnJ8Tdbey/jk+ufn/vrg7e/s4uDs7uPt4vn88sPY1F5UwcXT1Edwf2VnenxycnR8ZHpmY2VlZX5+e2R6ZHt/eHt/fnxwS0dV98j3ytrBytrBwcXbx83d1lpBXlVeXVtcU1HdxvD0zdrfXFJdUdXc2MHKVUBLQEdTVNrP8vz45Pn7+ubl+vn65eHm4Ob8yt/XdEtAUdPY08Pa1UZMWnF9fHN9cn9zdEl9SVFOSnJ9d01IRVJZdktPfHF0QVHY39/PxlHE2EVbR0RfQHN3THZyTHZ6emV/SlhGV8dXQlRQRdVQVsfD3MbFVl9XWVXR1MPw+Pvh4uHn4OTk5f345+T/5Of99vXGyM/A8f3/8PPzyMzbUl1Nc3dLSndEWlpYT3B9emd6f3B3QXZzcnhlf3llcnJJRVNe1lFfQEFJcEtLQVlRXdDUUk1EdXZER1fb0lbTVFxGVEdHU13Tw9BW1FJeRdxX0dje8Of6//7/8PTwzMnK9vvn/cr1983AytrFxNrN8dnWwMBSXlJeV9bTw/LMzPb229nR0dRRUN/PU0FSU0RSXkJOTkPQ2VhIQEh+eWVmYGFmf3B4eHBzf3x+fHdOQNLSWEJZRE1NdXBxS0xV11ZW39Dd39ZS19zH9vb09ffPz8zA2sv08f7+8vz4+ufm+v389/P98cr12dnG21BR3NPDw8HGyMPA3NZCXlFf1FNaVtZCX1ZZS1tHX9Lf28/ZQ0BBQX5/eX9xd3N3cGR5cHxlcHNaUVNc1lBFU1lCc0pKTUlaRtZQdExcRUZRXNHX0dDeWklNW0dLTUBEUNFVzMDE9fHE2sHI9/Dz8vn0zs3x8fH8/vH5++Th5fn/+vj/8czZyszNzdvew8vH2MzE3/XCwN9TWFJZSnRCfHt+enx9ZWZkZGdlcmR5cXRLd3h7cHRwdkp+QF5cXURLRV9GRFtFSVRd3MTSUdBdXl1VUUBUXMHKzMH0wcnLy9FQ1tX0ztrby8DKz8HQ1tLF8vH38//39M7M2sHS2vbDwfT1yfHx9/T3zfP68Pb3xtra1lJFWUXS31tBRHVIQHV3dXB+SnB+c3F/dndxSk1LdFleWVheQFtaQE1KcHFNd3dzfXx2dnd9fnN1T0hGQV1YX1NQWEZT0d7Fzcv2y/Xz/PDw+eXm4+H6/vfx//DO9/Px+f/w8P785eXxy/f3wvXOy/TK2MbbVlXe01bSXFhTQU9X0VhHTHJ8f2V5f3p5d3B5fnx/dkl0TV5CQV1ASkRBTl5eRVdcdUJSR0NeXlpQUFHSV0ddVEJ0dHFwSUpORE90QV9FXdTaxs/awcPb38H1z8nK9s7w/eTh5+bi4uHm5eX++/3+88jPysrDwMPL2sHdwMTSxcPZ1dfS11hSX9rZVldeQEp0dHZwQk5ZT319cnN8c3x+fn17fGRneXp+fXJ/eHlycU1OQURBRkNaRENAWF3dWUVcWdHf3tHUUNTc2dDW3dvH3dve2MD2/vr6+uX7+vjk5fv74eHn5Pj5/v7w+v/09/3xz9tQXlFSQFNDdkpRUFZSWkReRUBWX0JGU0BMS3RIW0FNRUx2QlZW1lVUVFVETHZ9endcWk50SndKcnNwfXhKQk5xfHByfXl7ZXpncUZaSUdGR1lc1trBx/z6+vDw8/f18fHx/Pb45/7x/fz75OTl5fvz+fjwyfby9sr139Le1s7wy/Xx98rNwdBRUl3X1VtHQUdLdn1kZGR6cXF9dnZ2f3p6ZHhxWNZQWV9aRktIQU1a18Tb1ldUX19PTkh2c3dKcH95fHJwfnF0dktR3d1V1dnBwtr29s/D9vTx8fLk4Obl4uHk/vv8/PP8+PvaXtRPdEfX1djFx8/DU9HEVNTD9vbJ8Pb881FW29Peys7PzMDc98V3c315ckReRHdKc0x/ZHxweH1Kc3R9cHJccX13QHV3dnNzfXFzRHlleH5lcUpPdU9GT1xCXFZdTVzd2dDN8Pz68/37+v3+5+Dh6eji4vvy+/3x5eXl5fr8/f/2ysbY0Nra19HGVFBedklYRVjb3N3E3lTQX0tJRHVKVUFIdUpwRkJNV9VAWtNQVFNEdU9zfXZyZH9LfU1HRUJaSnBKcGV9cmV/eH5+d3JwR3FzQ1tH1t3TVNxU3c7d0MHJzf78/ffy9ff8wvT75/nn5fjw9s7w997C8/nw+Pn89PTD9/bL9fL//OT4+/P13s3C0NTY0VHRQXVzfXdOcH54cHx/T3ZyeHh7fH95eXJydEZOSHR1d0dcTEVfdUZBcX17ZGZlZGZmentKRE9KdHV0UFBaUNLT8/z39Pf0wvj+/P/7/ODi5+bm+vLm//3wztv3ydrXU05109XW3dre8c3T3cRaUcHFyd7Dwvb3wsDPWVDJ0NXXREPVRXFMd2dzd3ZbdUhCRlp2RUp5T09DSH11Ql5WW9RBdk1JSnJmZ2RnZGR4YGBgZ355fElCW1pfVEpIQNTG3sP28v/l4eHl5uDt7ODg4ebh5uX/zszE9fTx8ffPw8HY315TUVRcUFRFWFbayM3A9fHJxMPeRktJd052eXxJcnRcQE5LS3VFSnZ9cmR/TnF+d3B1XUlF1VJ2WUR0cn16cntjbG1ibHNIdHFweHd0dXdGdHdW09jG29n39/z74eXn7+ju4Pr45Pv4/uXz+ufk+/VW1dJU3dbUWdTW3txXQNPDyPL88cHz/eX+9N7Y1Vfa31xa0tLK9tJCWE1d111KdEdHX19we3FyQNVccHZBTk53ZWFibmBnZWBmZWZnZGlramptZmBgfXd1d0ZPQF7S9uf48OTh5+bt4ebg7uqXleqV6unp7+f/8f/95c/EwdNNWNxVVtfBwfHGwcbHVd/FUFpT2sj99PX39drPwdNHRV5ZUEBeVllBVtZTWVhEXFNYXVhBTUx3d3R3dEZZWFJETE1LeWdgYWZhY21hbWhvY2NkeHdaVdbe2dLQ01bXw8DO/ODj6JWV6uru7OLn5Ob7/eX9zcjyyvTF3MPIwvfzzsLYzF1bz9/S+PP67eLm7O3k/vL8yvDGz/RecEVJd0tzSVtdR9NUd3t6bG5paWBhZnhCT3V3RnV1cH12c3llcnlmYGVkf35lSHV2Q9dQXlVSQ1pEUcfY2v3k+eXi4uDs4O3t4+bh4Pv98ffx/vX8+/338MrXRkBxeXt6cXZ1RcfPw8/2w87MwvL+//H5+fTJys3z9/T4/8razN9aQXdlemZjZmZmenxlZXFyZXh5fXZ2fnp5eHlzcHJwfnlzfGV7emdmZmJsYGR4fnBB2NrB8P398vD08Pz/5ODj7Ovr6ujs4+zt5+bn/vz/9dZXRVjR0UVX1l3d29NW0t3ewd5X2cfXV97Sw8PcxcrKxsnb2NPVR099fXxwcHBNSXRCW3R2f397c357e3l+cHdycH5+ZXd5ZH1yZXl4YWFhYGByenp0Q3VW3lfVVEBGxl5a3d7d/v7x5+3g75Tu6JTo4e/h8vz68fP8yPn49M7O1FfdRXdfXEhTVUVRwNj3+PL84eX/5v7N8vPZw8BcWdd3cE18Z3pkZ3N8YGd6bWFlY2Z5ZXlLdnl1TnNaXn52RHRwdHhlfGZgfHZ/Skl1SkNzfEpxfkhbQN7Y3cL99/Tx9/X5+ff++/v9+v339cnZ9/bHzMjP28rH1tFRTVlVUVfe3dz++PDl5/L6+vH28/Xa9vbI9svcy8jczfHD0d9YcHR8Zn5xcXB7Ym1mbW9nYmttYmNnZWBgeX95cX54TURR3drc1tNUVtlQQ1XCw8Pf2drFwcv9yMXGysjO29vE8fbx//f18vj98PX30d7V0VNKeXdPdnZ0THBBTkZHQ0rVw/by8v/85Pj5//D84+Li7e7s4uzh5/NXV8DX1Nfa3dVedHVKfn98f394emR6fGR+eWF+eX9+dnZ/eXB/fGVhdk1BQd3bxfXxw/P9/fn//fD7+fDy/czxyvf88vD2+fbH2NFfUUhOW11cVMr0zPTD3ttU0t7QXl/RVFfeVFtd0dDW39be9vfGzsjI9PH9+/v75eHk++T58/L6+/DMwcXA0FFURnZ3RFtbRVpGX1t2c3Z3SkxNTEJBUcfc0NdQWVNQQXRIQ0tARFhaQk9GXlhc1dHd2tfUUVHVUVRUVMfAz/D2zNDT1NFXWlzc11TS0snPyMr2/P/k4Obn+fzx9PDIwMLYzfXP8/LyyNJRVl1QQVtfU9xU2drN2t3GyNvMw8HEU17Vw8bSQk9aXUNNR0dPWlFHQURCWFRNS1jV08zH29va1dTe1FJXcWd/emRkZGVwcnxKRnl5cHJ8fX1xRUZKTVRGVcHf38/08f79wc/21dLDzM/O9f3y987+5fXx8vD88vT1yszFw8XB/fHLwsH1zsRcQVt2fUt3R09LUddeUtn09cXSUtlUX1NAdUVV2NnfU9bYUFlSWUpOdHNnZ2F6ZGN8R3VJTEteWkVkZHx3TnRlenx9fHt4ZXF3RcXCUVRT1VxEQVrZzvD45eXm5/r49tjB9fX0zNjH29/TVVTUUdTF/f73ycDMx9xcRE1E1thdUtfU2NdST0FBX11Hd3Jd3FBxfHBFQUZWzfT8//bKXnR1SXVa1t/D9M3Z105wfHhmZGVgYGFnfmVvbWdmZ3N0SFpPSEB0Z2FnZ3hKcE7b28b331jTVUVTxtDB9sr9+vHJ/fXN++T+4eLm4+L9zsje3MvYVfbz9/3w1F1QTHdEdHJbV1TX1nV/fmdld3xL0VFBdHJ+e2RkfXVLX8T18c3R2tFSUNZRQkdc3/XWUtRe11fQV97MxsDAQnVxZ2BjbW1kfnZQVEte1UpPQ3J8cXJzUFl2UVt1QUNIXNjey+X328rH09xdVcr28+Xg+Pnh5/rk98/w8Mv45P36/PfCx1Pez8fVydxBTHV8cn5lSnRMX9Jf1N3eVlN3eX9nZH5wf0pPTk1ad0xTR0XQ0tfcV15FQ3xPSX9D3dj1/P7/8/bU1Vt1RV9SWdDW1sVQXldQVsz3/fPM9cJdR01SU17S2sv1w8rAVNjcUFJR18X0w9zx8MTLytna0Fb08cjO+vHH98jAwdjSyfH0/+DwyfRUTXRlekJGTdTCWV3fWHVDc1vD0FtRRH9+c2RneGRM0sXE8shZW0Bxc3Z8Qt3X0s7N1sH1w/H39frh5eT7+PPw8MXf09LH9vT/5eXl5f3J39ncxtXF9MD239DSUnBCQUhAdHVGXkhFUVNzRlrXwc/08fzOwdVTRdbRws3z+Obg5OXw98H39cvAwdveXE90cnl4d0vUU8fK8czf1Fp2ZXN2dHZJR9JU0dZeREdX0N5d1snwz9/AwVBX0dj99uXv6+3g4fn09PX2+/nk7ezm+PXUXd5UV8FQV/X3ycvfcH5xfUFVXML7xEBLfGJtZ2Nlc31S89nZxNnfzNhVychUwvLC9PXfWN/cwvv6/ePn9P7xVVpbfHl/e2FKSXRdQk3UV0pa11Ff8NzQztNOSnd9XcfC8OT2/eb9z8JVRt71xcrl8vrl8PT0xt3198ny+cr/8sFSUVhD08Lax9ZIRkF3eX15fUhJcVtUXtnA3ExFdXN3dn9zf3l9cWRncHJ2W1Rb28zZwffcXVdKcE5PdlbQ3//h8cz30UZcVktbUETWWWRnZGZkdnR23Mff9vLTU1xcRdVWUff1yf32xszWXVDJ2VXNzMPCV1tbQdTW9dvX31tf1VdQXFNRQVBQUNXS9cXawFFGcXx0cHZKcEp/Sk1/cHd0S01CS3ZMc0t9YWJpampraGJ5cH5FSXFwcU9DRlDR0tVax9LFx8fA8/n4/P///Pv1y9jb1tRbWFFSQlpRXFh1WtTdVdvTVlFWUVfd1tVWUlheQUxHUVFadHl8eHtld0NEVcTCx9REU9DQVt7Q2MzKzMrKwc7D3tLEUVXE30xyeGV6emV6c3l8SkJLd3N/S059eXphY2Njb25tbWZ7eXNNT9TPy9vczN/PyMnN9vH85ub7+Pv+4eb68/DOxdjA1tfH0VFDdXxwc0fX105PW0RHTk59R0FJWdVPWVxX2VJAW1BDWNBUd0TSW1zX3FfTzfzIw93V38RQ1cRX0dnC3tpXVtHZRFlZdnR0Sn1Pc3ZFQXNZUkJa3dNAXHd9dndlcnthYXh5f0BNQdj02/b2ys329fT98fnm+vb7+/Hy+vbw/vX18cjd0V9EWUR1WlVY1dNBSFJCQlbR3dvNzfXbVlDa39HEwdnAxdHMzsHb1E1ERnVLUl5a0VJXxt1MX19GWlNZwPHF9P/88fjyyPDN1sbP0dHRTHRESk9X28fx/djOzURwTHJ7e3h+dUpySE1wSNPTV/bx9+T+8M/I0MTM8/T45P7k9PH99tHB9srbx83E9MjxycXb3s7B0NNRU9zH2tLd3tHa111UUdDQwPTK0FLX2lJZ09zS3srPyNrS3d1W3cXT28XE01BGTkNfXc73/Prn5ubn9cTeX1vW093Q39/T0VBU1tLD8MnT011Nc3ZkeH54dURNS1HAyPny8/T7xvTHyd3xy8728fDy+Nv0ysTdz8Xawc/1/d9W2vpHzvDY/PfXWlF8fHRGXlBe08PQXtbdV1XHwtjEws/Z0MDL39PP8fPw/PD1wN7S215NRV5U1Vx1XNxdw/D3/+fg5/3x9M/f2fbETV7F0t7c09/H29rOU0hMdnRRWHVzTExF1HR/cHVNRUVTU1te9fLZU93dx/Dy+f3KyMrHX1JcX8Lw9s71w8jywNbQUNbA1k1LfWdyTndzd3RDXF1Q0lBAVFde1djXxMrPy/bK2cLBwPXY08VQSE9HdnZZWllZSnZIQULW2tPMxlTQ39bVVNHFysj2/MrBxdPTVHVzcnVIcHF0Snd/cXR1X1XY1ldfc3ROdEF0TtHE2sP12EVeWFvZUnV8TFpCSElY3tDU20ZKRl7dUVl0eHF0TXVyc3VbVMfOw9raxMzI0VxX2/fx/Pz/8/38/v3K2MP1wdNwe2d8eGdnZmZ/cnx2eGBnfH9zZWBjZXp6cn18cnJwXVVZ1sHY9vTTVNrN2cvNw/z5+OX/ztjH1MDAQHVGV13H9cDPwlPcwV1TVktPTX5kYGVkfHR5QUdAUcxXcXBkYWViFWlqb2Fwf3B1cn9NRkjZ29zH9cXeyPfK/OXm7uzg4ung5+b65+Xx0tDG0sz32V5JfWRzfmFkYW9tYmJtYWdgeHl5T09lfHxkeXR6ZWRgYWZ8fdXeUt7fX9fI19bfRU9X017QztjJ+eXs6+3v6uzg7+zh+vHZ28nIyPLI28NRWcHTTER8enhnY2JsFWpjbGB5Z21sY21nZGR4Zmd8T1Hd987b9MnC/vL38/P2/Pz8//jl+uPs7Ojv5PLxxMX0zd5XS0NAUFfQzlBFX0tOdn9yYWJjY2diYGVhZ3ZIWFdEd0NMcnRycn9mZmF+SHBc3FnQ2dvy+uHn5+bj7OPi4u3j7JWX6uvg5efl+P/9y9rf11rUWlxdcGV6fGR+cmVgYmJhYWd6cUJJ2vDw98TU097VVtDGU1PU1fX9+eT5/v75+v77ztVFQFBQ0UBG1tXc8PH+/8/Dx9hU1F1FTENe3czL88nQUlNW1dPQXEd2dkdNd3h/f3BDU9reWVvQVFzcx8bYyPL67ezi4uT++uX75OT98vDM8Pj6/P/6/vz4+P/23dJfS0hJTH16cHNb2szxzcDYzfTBy91aU3ZLQUNDcFtQX93E8PLGz8fXWEZPfmRlenFa1s/b11TXwNjCxEbXU1Pc38xV3s3G8v7k4OTl/vzKyPzI28DGz/b28vHAVl5ZWF5ZdnBwckBT0tXX3N/3/P7n5eX89MFR31BAXdzb9fnn4eH6/fnzw9FFdndye31BXVjV0lTG9/3z/Pv88t5U1Ut2Q0daUtXf2c7QTltSXFpFT3N4ZWV/ZGR/eHN1XVJfzdxV301HTEtAUPTL9f/+4+L65+fk//T21lPUUcn38PPDy8/G317ZXHJNcXNxfHZlT9BRx8T1/MLI9vXAxfVSTlBFWNRRVkxHVtDM3s/P3srGTXdxfWFhf3l0TFfZVdzNwsXGytNf0tDZwvD9z9vHxMvAxcRfRF5EXl5BfHxMSnd0QkN/dkJcVkFHfWV4cnZ2TUVIQ9feyv32yMHO9M7F2FFAckpQ3cXG9c/D9fPxzt1fcnlySllPQ0Z2RtHeyNvbwdPY09XeX0d0e3FDQEhIXk1BVNnAX05Lfn5wd3xme2ZgfnJHQHRaS0VVVN/T2tBc1dPPysnxycH2++f798JTW9bbwFTX0kXWxtjF19NSQURHTXd3fGZme3l6fk11SVDcw8DCVUNzc31keHl4enNS1lHAx9TT09VJQVhNSnd1SXZD1kdMWN7ZwPbI3dNTUFbT2E1OTVhSWdzWQVxdXkxA1EF3cXxkZ2dlZWV/c3FPUEx4eX9nZXNycndbVtvw5+Dl+fr8yfP89PDz/8r19snx8fXM3Mnw8cbHzFNS3NRIcHZ9f0ddUtdZVFB1R9BSVEVPeXl9Z2V9SHR3X1ZWWU11Z2BnZmZmeXplSNbZ2vXMU1lZUdLK8PTAw/H1yPX92lLQ2szx8/P09vbDzFVefWR4enRDRVl0SHdzQFDB101LfX1PU1BX1MXM/OTzytjc00FQw8RWUdjH/Prz/czHwNDH8vrzwsbQ2Mv0/fXE19Db8+X89vbwwsnCVFx2fnl/SU1FQnZ3cUpMSXZmYmBtYmRlf3h7eXTezNBcdXVwcVNa38XdyPPm5Pnn/P76+Ofh7+Lm/v/4+/P098nU3cbDyM/EVdfZyF5IQ3Z9fkh0cV1eW1Zc3Nz38sFFc0NDTNzF0FdQ39LHxtzX197ZVVzSXUlbVdrL8//3/f3/++fi4Pv29cv2+/7L2djOyfb39NvRVlNfdH14ZmBtYmdkdnh4emdPVsHUR0hwR9XF8/P28fX+5eb6/fD38Pv8/fz19NrHyvf2xsjG1vXx/PDP9NFQ3cry3NrZ1MzK+P318sjay/DPX052f3NCUFxGW1l2QdrZUkpbdHB1TFxITUpwSFDA2NHbVND1//3Dy8rOzPf88/Dx//jk4+3m+uX+zNLQ3MfT09LG9c7A28fG3NnO2FVCcn1xTENATXdNRUXc1dVVQFBR0dRQ2NbY1F/DX0RcTEVCVttc0EVDX1rK9VfBxMbP9uf85+b/+/Pk/1DewcXc0P7MwPXE99LHzHd2cWRgbXlnYmFvYm1lXn1lcH1/f1ZWckVfXNVW//TWxsbPxvvg//vl/8vO5/rFVtfE3fT78v7/8srL5/jYW1HXVNrw8cr29d9e9fDZU053ZGZxdXZweGRgfkp+YWJmYWd9fWRmZHt6f0pHWE92fHt1Vdva2lBSV8jz8PfNw8P39PLl4Obx/f365M7eW0LWUNLYwcdLT1taUF5Zc2BmYWV3Sl5zeHJ6SlpPcGB9dHh0QV9/ZXB4d1pTVnl+dX1D3creTFBWUfTk5PfO/fL44O7p5uDn/fjg4PfHysfby/r4zthaSHBKXH1nbBVqamFkYmNuahVseWFiYWBhZEzQXER0c3xK2dtQUExxT9X/8PX11lpe8f7L88JQVMX6/v799s7I+uTw9sddVsLy++X+8VFIVsPZVF99YWV/cXRwfGZsY2djZmFoamhhZXlweXlnf0JBWUdOd07SwPfl5/vP9f7l5ebh5fjk4eLi7eLl/vPx8/DPV1nU1dHIz8HWW15Md3R3cXple393cU9LcHZnZmdmeWRleWVxdENHQEFBSEhCdUpydnh9QlPQ0FhPTdHR2svy4fry5ebs4uDh/vvl5OX7+v78/Pjk+v/10U12dHB/cnJ+f3hlcUpIdmBvbW1ubWFnZmd4fndLd3d6fFhNXF5dVEHd9Pzl8/HcxPzz5Ofg4vvk4Ozu7ePywfP9//rw/v3y5+Dh5/7BSUpKdnF/cn5ySEdYSVBEZmZhYWJoY2FhZH5IdVlGf3xydHRzQ3VxRND2yMrw1t3DxffO+OPm4OLo7+Pt+v7/9fXSzfTD8P3k5/vlw0VNSkt4f3N+cV5cQE1fQHd8ZXthY2ZgZ3RASHZZSXJISkRARllJRFb0/Pfg5/TIw/PM8eX54e2Vl+qV6uni5uH/+fr08uTt7Ofn5PHP0kZxeHlnYWd9QEtbVUd0eGZsbGFsbWF7SHRGWkZBSUJwSFFLQ1Ld9MHw8czM3dxJS9zW3PD+5+Du6u/u7eby3/Xzz/P/5OfslOzh+//ERtPRRlpf1ElG2FVcW1xxY2dkYGxjZ21hfndxeHN+YGV3TU1b3tHR5O/j5ubh8vT75efj6OrulJCQl5SU5vH89fXKzcdUxvj68cbBWWRnfGRkcHpkfEleQklHd2RnemdnfXB/e3Vec3VNeGRhfnF+SnVxSVD1yMj31UV1TlZR9P774eOUlJWWle7i5Of55OHx/Prn4Obh+/TfQURBTFlwen9wdX52d2Rgb25pb2FgYXh7fXhxQn1mZmRkdtRRWtz2/P7n4eX3zMVSRc35/eXt7+zolJXp4P7C0Pb/yMrz+P767OL8xFZacFhUS3RwTnd+dkp+ZWdjFRViYm9tbWNhZHFkb2lpFRduZ2d+S1TczOX2xdFeQXde9Mj2++Pp6ZeX6ejv5P3x/fzOyfX39fLh8MLHW0pzQ15GXkpNRndRWn54YW1uaWZgYWVneHp5e2NtaG5oFWB7e3J3VsL1+MTSV3NIdk/LzvP45+nokZbqleLn5/7n+vbD0M/fxvHB2Vp1SHBKTkhOfHFKfXR+YWIVFRQUYmZkfnZGQkJJcHlnZmNje05Mc0fHyvX0z9xST051StfWV/f45Obj7eDl+fbKx8T3093D3szx/vnC2dna19bGVV9aTkxxdnRkZ2BuFRRsYGF8eXNCcn16Ym1oamlkdndB1Mn85eTl/vzJ2N/G8vH85efg7e3t7eHn/PHwzsjPxd9X0sPYwVRZRUhc0NbG2tZGSlNJcXB/cmdmemVwdEJbTd9TfX17emJrb29hf3xLcUdVR19aTXJmfnRJ1M7z8uTv7O3o6ujn5+Hl5Pr899r08vD4+fzE38rJyP3K1EZKTnF8c3pjYmNhZ0zRWVhZVFJDd3B4Z2BmZnh0dEpE2cfX1NxLcXx4cnRQ3N3B/ef6+uzm+OTl+OTn+Pbw/fjh4e7u4OPg5uDi4/nwyFVfXl5BZGNhYmBmfXBwcH54fnxmb2tpFWppZ3lkfEHVx8HYUEpXRndA18DHw/zn5+Hj4eX6+vDw5/v3xd7Gx/Tz/fP8+Pr64OPk/f38w9jA2NFZT0xJWVRU2MXdVEJeW2VmZmNib2Bnekh9enNY10F9dk1KSFtWVNjH9f344eLi6+vs7OHt4Obh+/rk4eLl5OPk5uDt7ebl//ffRUVweHhgZ2Vle3lcUE1edUxPen9haW1sYmFlcWV4cnZRQ3ZLdk5LTl1VzdjVxvT4+vri5uDt4+zj4+H//v/k4ufi4frg5eTi4ub2z91S0lxZTH53cUpdVsPWQFt0Q0FyeW1sbW5kfnJ1fXZLQ9vdX0x2dXZDU9vF0N1e0+Xl+uX75OTu6eLu4ffP9vrl5+Hl5uLv7uno5/LOU9zVUVl8f2RhenxDdHh/Z3p/eXliahUXamlvbG5sbWB5SlNZSEBIWVDf9NjH2VHdzfjm+ufh5ebj4uD69NrN9fD6//P9+eT44OD898zG11LJ2kVMdXdwTdVXXlTY1kbc1nBkYGJibWFgb29tYWBwRXxlfnN8Z393cnZ0SnJDwvfK/+Tn5eHv4uPt4uTn4uPh5uTk+/jh5fHzyNBcV1dLdnJ4ZmJjY2Nkfnl5eXJnYGNjYGJvbGliZmJne3F0fXBMdXR0S3Z0X0tIR1pHRdj9/fj/8M7Yzs3C8P3J28P0wMry8/fL9vz8+fvO1dnGUVZUUXB6cE9V28nUcnR3eH5kemJqa2htYHt3ZHpIdUdf0dRPWlPVzPT+zFDE38z/5uP/9PbO/ODs5MjyycTGzcjeV9VTUdzLx0p3fHl1RE1weGRnf0TOzlZGcWRlS0VwfnpgYXpCXENJf359QN9cXEhkeHPc9N3FRXVB3/vy/uTPwMz/4+fm/NdGXPXIxfHRQF/Y/vzy9UR0dlTZT15wZmZ918HMwEt6ZEnWQVRXdGZlT1nRzV94ZUrS3/f3VnFL0/H45/zQSFXx9PHl+9rE8P7m6e/lwsr+/Pvh59hE3N/D//jGfmF+cHR+emdiZmV9X9JSem1hZXZNdXpgZmBkWsH1U3lxW93K8s1bU9nb/eTk9FNBWNL0+ubx09TH5ePj5PLO1NfH9PPA011dyPL5/MHYWl7B8PBXWFFJXszDzdV1fnxMX9NYdXRhZkpZV1hJZG1yQU5Ad3R/f1HJ8MXZ2EHR/efh5OT2x/vi6e7i58jA9vjk/P7OUN3w/PbLwE90W1TF1lhHcXPf8fTc3HF6c0HGwvXAWE9C1MjEz0V4eH5IQk5wZ3p2W9vU21x3WVLBzsXFQUlAXPHy+/rexfX85uHi5PL1x/bz98JZW1bXyc72213S2PfwytlNc3J4fXZeX3R1cUfb2vTbXVhwTE1XUnF3dUJUxMHFV9fTw/X8+trT1F3c9fj69cLZxPbx//XawV9EVtHcXlpNXtrJ9snHwVBTw9rQT399ZX9MUsbS1ldEwvH09N9SdX10TEVDdnFxT9LaxMz1wtbI//3+99JbT9DcwfTax0VZy8z0w8RTdlNFQFZJdnB+TlBc0NBedkTUUt7KXXN9c0nRysfMRkfF28vx9NxISkp3WFtdTV/Exfb3//fWx8Hz+fT81UvX1Pbn5+TD2N3I+Mj9w0xKeXZPRVB7cHVx10FOR35wcEFRTEZ7Y2dgfURRVEp9ckP0/f/1UEVxQNvYyNdOTU/Xxs3M3tnV2/Pw8sJfRkXeyv303lNCQ8b++PDBX3dCVsXH0k90d03dxNZcRHV3XsXcX3BkZ2RyT0BJdXJ/R8LxwtVTSHF2T0F3fGd7cMD/8fbCw9vw4e3h9FdNUs3L98jEwFxU9Pr699lRR1/Rw85YcHt6d01EQXZMQ1nCwdlaeWRgd0RTUXFyfX9fwc7I01B2c3B/cnhmYGxkTV/XU9FcSUVNWVN3fn93wMvG2NHfU8X+5OLm98NF0VxEUEVadkzV2MbL29zX0MbTxNB1fnl3SkZdXlhOWff+5fvxzUVDdn1KdXB8cktARcTe0ldcUUhNQEx1cEFS2/f1zNze9PXz//TFWV1fUcD09NNFR0Fdxd7XQUZFR1ZQRH1le2R+TVzaxdLKz//h+czWX1twRFdeQnBLRtXMzNr02tdPRt1HcHt5cHba98D01l5BW/XAUNVFRXVG9FxCRndyeUdddFHRXk1Q+fPIwNxXTtj91c3yzc/87OLl5fLYQE/eUFzF10p0yspV3cbXRV7OzNnRVl5a8uf19vn019fy983B2t11WNnUVEVLZW1/fXp/fU1yTcPc1lhLdn1U0lfW2M/SwOHn5ebl89zT2VRTWEFMc1jeR0FYR3VJVFxZ0VBaW9v1393HxNjN9vfFyvTd2/f09vDx0kRMdkN9en1+S9bHxtDfRH91TVFbTVJcUMD85ff9/MXDwvHHU9lZSFxc2NPFzdXN9PLJ1MRHSNba8srO9NzM3/T+yvn2xPHx+/HN9VJbREJIfnR8YXBA0/fD98VeW0xdQ1/WdVnayuX4+vzBx9Pc0VpdTEtHd0lxdEB2cnJxX1pSR3VFTFnE9fP2yffJ9Pf1ztr39Mr5+/fb1VVBdk1FXkF1dXJG3sPG1ddRUNnfwcXUy8j+4eDi5vvywsrywNlAdHR0RE1RWHd+bWF5eXZydn9kc3FT3NbH1Njy9P74+Prz+eXk5vj21VbRU9HXRHBmeXB3QExMc2RwSl7B2cBWVNzO+eTm5PL29Pb38fzY0NTUyvP82Xd+eXF2Z3lyfXxhe0XYU318dkRWUcTKxVBLWsz+/8VXRUle19j11tVdUcv/895dSE5EVc30w91XVsHy/v3xwNBSxM7awVt3f39AU1XZ0VlISFtT1FFOQ1DE9vfM2FdaRldX0sXC317Y8c31xVp3fnB+fkhxeXt7dl5QQFt1c09BWd/eVl/S8fLl5+bk8vf/8/3ly1RZ11fU2NJMfH13cHN0dXphfn5yT1hfcXF1XtnN8cvI8fPg7Ozj+PHG3cDYw9NJdXVIVVBBdHp/fnhlZHlkZX1wUtvxyNnfUsHJ9Pv2zMfaz/b889rTRkZS11FYQnR2fHBxd3RId0tETlxdU97fxfD5+vbO9/T09szz/fXJQ0Pc01NYQVl0fXx6cHVOQHdAWEVPRtTR3NxQXVhSXFhdUFfeXVBOQdTXVVpZ1VFHX3RJSnVbSExZWFdfUdJUwMDc0dLZ29DX28/AxN7A9/n5ydra39RV0Pf98PPx9PbIydjW01JW11zWVVhAdU5STUZKfnd8fnx8eX5nYWNnck5bQV5aQV3H9fbx8PH///L4/Pz79fTx9PXE3dxCdmZgYW1nYW9mdVxZXcbww8zw/Pv9+Pr85ODj5uHv4Pv1987VRX9nY25uaxVobGdkZn9/f3ZlTENxU1lR01P0/PP/8eTg++Pp7OfH2E98f3lmYHhxWdPbycfcxMrx8fbOU3R3SEZHTNbUWMf0++f4yklke39yfXhzeXNa0PfP0FdM1fT3+/72zFNdRNXG29xSV9rJ+/nx3Xd9fn19e3h8fUxF1Mr9+Pb95fv98PDN1VXdUkJU3lFT3fHx2lZZemBnemZnfnJxZX9aVNDU2lDe9sz29cXA0ML1xvHx3trY9PD199ZLfX9Adnh0fWVlckZRzP3w9fPl/Pj7/fDcxMre8/71zdPFwMfQTHJ9ZWNjYmRkYWV4d0Hc8PfF9fXx5OHi4Pnn5P/55+3g5Ofm5+Tx98JbcWdia2tubm9hcXVFUklKSVteWNPSQXd8ck9yX9Hd9vL4+cjIydVbWkNCSl9cTEdR19rTXUR1cVpW08TS3tVZXlDdyPTz5e3r4uDh8P7y8f/Lyfff2/b8+/70y1BZ1VDdRXZ1emR2fXdNdk5LTMbEX01/ZGZhZWdld05HTUPT1sXf09rKzvPl5efl8vHJ8+fh5P7y5+T68tpXcGFjaG9gYHpnZXZ1W93H9Mjy+ubt7+zj5Prl+uTh5P365f/y1193YW1uFRQUam5uZmVhe3x0XdTS3tTf28XK9PTxx8za3sPO9PH13VpxTEd8eGR5S1j19sHM1dva0uTn5ezg5OT85PnCy8/a2Vjbyt/9wUZURd3Ydkh9e3F9Rl50SHxmcHdczNPT11fcUND0x8z0xcfH9+T689xNQ3J6fHt+d3ZLRE1dT3d0dERZV8DEysjf2sby+/7l5fz/8eXh+/fXdHBwcXdIdHZ8cHx7dHB+eGR7fHBNWEx0dnNPT0RFQlZTUd3P//r9xNVHQE9GXERZ1FTZ9P/h4+Di4+3i4Of20tBHSkFLcHFkZHt5fH1ER3F9d3BwfGRyfnlZRdDEzfb09vrl5eXn5vvK9ffA3V5dTnJJTUtISk1HfnB0fUhJc2VjZHh7dE3RV0TUzvfw+OTk9sryysfI9fVXV8XXxM3NwU9DUnF+d0plaBVjZmR6dFpzdtHewvf/5fj35ODm4uHm/MLxys3w9vfXSN/R391MWkl5dnF6eX5mYmB0QH5+dFlxfUdRTkXcVkxJUsBTXtjbVEDR/Mzb3NFFQkXf3Nz3+fb28fPz9/nzzPfy/P7Kzvr2zvX3z1JAVENAUNHVTn12fWd5YWBjZVtAdEN2TnZOwPHx8fX3/vzl+fT2ycv52sTDUdNyZGV8cWdvaBVoYmNmZWVwcXZU2cTdwM7O+ebg5+T65fzM4ejq6PreVndaTnJ1SkZNdEZeRUh3XUBLxcfe3NFaWUxE38L3xcryz8XcTHx1e3N9fUVA1/H2yc7y+vL28cPSRkBcS0JeTHZ/YWdtY3J9enppbWJuYXp+SV/1/fT45uXn5+iXl5CTlOnj5uf77Ojm//Xk4fPB1npjYm1uFBZuaGppa2NnZXF9ZX56fXRFzcDWWVP0+fD4/Ofs6+7i+8HZU0NMRd7L9sJAdHZ0RVFXU1FdS3deXFNX19nO8vr8/f/88VBbWEbQ1k11dExX2Pfx8ffexM/EysnCzdhV0l1OS0x0ZGZ+SFlOfmdtFWxneX1xRdbR8vj64ePr6ezqlpfq6ezh+Prk+PrL3VFJRld1cn5gaWtpaGhiZnl5en5EX1TT2NNV3cDG0NPbX1xFxPbA9P/w8f//9/TO9fTL2/f+/vH5/fTL8PXGwMXdX0BNT0FbdXJzdHB0d13Fx8pdTEdyTk1ydnJ1V1bA2VzS01PZ0sP0wc3F18bYx/X3+c5f1d7O891Ac2ZgY2JhbWJtaWNlcExC1tBdw/fz4efh7uLs7+3o7unu5ubg5PlUdn5uaRQXFBcXaWoVbm9meH5zWV3S9/7h5+Pm8vrk4e/h5uDm7OL/+MnQ0EZ1dnh0TUh3fXZPTFlc0dtWdU5wdnFmYGxuYm9mfnXc0XNzcEJQTFbRWsX95Ons6ejj5Ofi6eLg+MnN1kbWQk1KZ2FiYXR4bW9oa21ifH5+TXB019L75P/89cnz8Ofh5e7j5eTl7Of09dFUwsrE1nB6YW9sbmN6YWdjY2FgZ35hZXJ8SnFEzNze0FHL/vvm5uXi4ub7//jw2d9KenJ0X9BA0F1Cw8n28dTJ1UlU3M3xUNrCUNjL+u3k4fzF19Jf3HRzTEZTUFT30dDB28zz/O3n8fvb0Fd3TUh6emBtemd+Z2luFGtjb2FjaWFjYHdDVNZZxvbm6pSXluqXle7u7e3i8fDk4ePh+flXWF9eW3J9Q3xlYWB6e2ZmY2ZhZnhxSV9FWEJd3sT2ytnGyfz//OX65/7K3NnH98/e2dzdVUdJdU9KS01bW1JPcH59cUB1SEXXx8ffXVlTUkdcRltSUdPawv3z+vr75+X8//H8/fb03l3VRkZxc3F8e3R9fnljZ2BvZ2FwUlHNzNv28P/g6JSV6ZSUlevg7OTC/f/D009SS3d2d3Z4eHhkaW5saG9jZ2RhZ2VmZ2VMQnFJW1FZRVdZdFTO9Pb67pXt5uHj7eyU7+T75u3t5uDk9NjG9NpFRXBmY21kZGBlen5yen59dMb10dZc291fxMvA9vfl+/T8+snQWM389/H59tpPQ1x1XsLSdWZwWnB9fXBkYmB5YG9mf3tkfVLQwvL64OHj6u/plJTq4OTl+vDx/c/D3spcT3BzZGsXFGpqb2RhbG1kcEhV/+T7/Pzk+vrg4frl5PjK0c/1xVVGR1VbU1R3fXVBRkdXxF5CfnJFWNvzxVJHcXFzfHN4ZWJsenlDUENxcEBc09rw8vv5/uf65+Dk5Of75Pn+5crCVktNd0lSRXN7ZH58e3R1fWBrb2JjcUFES35OX1Hc3trbUtXax8r7+v/w5+zt4OPt7eb6/Mr1yMFfdnx8emFjbWxrFGprbGd+eGZkfHVNXtrMVFJRz/7h6OPl+Pvk/8nLx1BGSkFaRNRCd0dF2cdX2t1FdHlxXlDdVFtQWtDJ38jB0NNHdkFX9PTF9vT3+Pjn5uX5+P39+PrKVNREd3dyemBpaGoWFhcVFBdraG5kcUN0dF5UUdPx4OHg6+ns7+nr4vrn+vXByfrw2fX12MHL88JaRV5McU/QVXF2TH9+c0R1cnNxf2Rndkp1d0ZORNX28szby8Lfyv3z8/rm/PX0+fDeU1dSSnRUVkh3TE5zfUZAdHVOV151UFhCTkdRWFjD98ZZTlTd1sbOx8DL8vz98/Pa1FLQ0l9UwtrcxkR0c3N3eGdgYHpmZE1OT1DMwsr44uzl++fh5+Ts7/vx+ufn+Of50HZ2T3Nle3B6YGR8enplcHJmYX97ZHhzc355dnd1QFTRXE1ZUUBd3sfczPrl5+Dv7+Ht6e3+9v3x2dfOzNrAz8tafXVIe2R8dnpgendLdE3cUdP35+TxyMzB3tj3+uXz+/bAxNrOwtFUXkBB08nz21NKdnB2SXRLf2NoaWNhcklFcWR+dkFQ0svVTkpZwvTw/+X5++bt7ezs4fPR3fXzysj010t3d0Nd01VUR3dJTV9HRtDF38L/5uHn9dBISlpYVFxDSU1HV8fx8MvCzcDA983C1UJR9fb98s3ddXBIdGRhaWsQExYUYnpzTk5GxfX+/vP6+Ofs7pSRlJTp4O/olZXi4fRdUnx8TXV1fGZ3cn9zZXx7Y3hwSlpMRkd3WVfRycP1UH1KUFPQ1VXVStfKyPD84eLw/Pvl5vP0yFdAWlXRUURbcG1sZmFhYXl5fWVleXx3Q1LL3Mf9/OXk5OX6//nk5PveV9pIfXhyT3J9dVtWU8L03UFc3VtzdFDRQF3d9v33+uTxz/Tk99bZyN9b38bG0lbG9PD29PfVcEtEXEVAUlBAd3ZwcHlke2RmYGxkYGNlfklMddnbVdXK8MJYR1JJQlpW2V3a5uDn5eLi9sv2yPXY9fn99Pj85OXw5P/W3NVWT2dgYmluaWxgZ3h2f3pkeXZfxvby+vP18/L99/Hl8MP29sry8vb00ddASnVheHxvFWtiZGVzSHBzdVjV39n19MtVR9bV1sz3/vr//MPTwsv1z8DN98DA9/T0xN5UVNRHVtxMfGV9d31PVl5QXUJV01b3z95YcURadF7H8/v9yfXOw8/0zV1McHJMSFLUSlpES9Rc0/H3VEV6YWZte3N/cWZhcHt5WNHYWEdS11fG//71wPfy+/j74+TCzsj45uHs4vzC1kdMcHRXQ39nY2Flclhc0dBcXlHc28HSQXZxSNz3w/T80dVfV/D2/+bxVl3d9/fK/fvDW3RLSnNGRn1gbm1hYWV8dnpsYGdzW1BET39lSlr05+bv4vj++/7/5uX+yF1OTVbVwfbyxltMXVbfx9JWdVPJ3/Pw8/tTdN/D9Obk989JU9FZyfz4w1hyeWV6TlBbQHV3SkHc//LOUnl7emdCSWFtahRtYH3H2FFWTHHVXML/zMnU2Mf0/eDj4efk+fr6/uTx1U5NTN3O/+H3W1tDUMLz5PzGVldTVNjM/stXSX5len5yeH1mZmVnfFrcx9dOXVNS9Pzy8lXTwsj64e7p5vfHXklX2FJGfGBkZGZ+WVTeV3RMe3fY39JYdVtAXfX5/fdRd3B5Wfb0ztxD0cPJ+eDi4efbXUNay8zNydLRx9/c8P7B3XN4enJSXUVCfmVwddP75uf/3dXH9O3g+fLI1FtFTcPKVdFxZmRmfGVnZ21ua29gfUN3cWFse07XxsfzzNzVwcj54uD7yNpd08n39f7z/v/45OPs4/nK31JczMLbXHR4ZHfXwc7RW3FhbWVAUkFMSUpQ1cTYzPT78cPYwv3LxMPYWVXf0lfZ2dhBZ2xjcE5OR0BxfHJ/dtnEwF5zfX9aX3dBUVZT0NrT/Pn9yEBPRsDPwfLz2l9X9P3i7uPxWXN9XdXY2EZ0TkffwPb7yl1S1VH18sDIxXBP2d/c8fDK3nlnfnZFXVpFSHNNUVLcztFAcX94dFZaSEx0X/TE0dreQ3lhY2VwQl5NXVh3QdPd9Obm/dlZ1cf3/PL6/fbl4frm4PvEXEJM09BUWlhET1rRxcn69txOc2Zmc1/WVNtQQEBY3v7EUkNxe3lFXFZeXVHN5e/o6+fGQndzdtnYV0NOfmR4ckvRVnB7ZmNpZXROfHFOTVBXz//9xF3Vw9H3+/7F0lVU2Nz55PZVR3F8fEbE2MLl5+Tk5Ozo4vnJ19VaWsbeR1dQX9rE9vnfcmFob2Njc0ZJQVJGVtr84OXJ1kl2cGR/dntlcnlLSkbFRmNvbmhjeljUSXVeRtHx5emV+s/b0VZXzvDx8eHj5uHg7eP101RQVF3UVNRaVsXy5e3r7/R1fmduam1gYG1heXVB0/fxXXdBW0twVN/cVdPI++fvlevk13R2c3hEQHB7Z2RzfXfS3F51e2VwfktfXljT9eTk+OPg8tVJd3B+dkJ3dUJ1Vsvz7+rh9FBJQUtbwcvM9PH55ufu7uTNUllMf2V6fHB/d1T3yfHk99Ncd39zd05U3lBYXMfN/+3kxF5weGZjYWdkYWVK09DO5flTfHl8ZWdkckl/dN3C/ODrlfrXWHZ+f2Z9WnVZ8eTtlJGX4+Hg5vHTW3Z1c3fT8fPn4eTJR319YG9sYn9yZ3Xc3vLk4OTwVNxYTUlFwUJIRMjw/uX4wNVOcX1lZGVxdklez8j05ef89NV1ZWxhZ2d8QEPb3Nr0/vLfSX51cGR/T1vQ3vfm7uqUlOjhx1Ref3ZR0MzXW1f35e3h9PRedX9meXRYV9XYzuXm4uDwx1FMZW9pYG1memBlXMT3+fzn/d9MYGNxYXdSSUrB/PD/8/PE1XBkYGBgZ3l4clLKzfPz+f/62NDTwvHe8vD9++f75+Dh5eD1d3JyT09HQNHF9/bAzfbb2V16e2NiZ01fXVPNw9fw/PX2UmBjbW5jf0hY3PX/+ODt4u3t8VhHfXZ0eXxIUdDX08RZTHVla25uZHJ8fXBYVtvN8/z/8t58TVVT39nYy/3w5uf5+vr0Wn51VERTRnXB+f3n4u7j5+XOU0RIcHx2cF3J3tTC9NHf21VEd2VjaGlsYXN3WM/3xvf89NBLSnR1c3dIcHx8SFNeVM5RcmVlZUxARVd0Wl3UzvXz4f3AXk5RxMFTxMbByPnj6JXq4PZVTUlH0UhU0VNdV9rO8vPCS3x7ZmZsa2JhbXp12crw/sj13FFBX1hfX1VWU9/18fT32MnXR3F9dnByTnVNUEJBW9nWVEB2dHJKTFpFT1PdxdjJ4eb5wHR9e2BgeFpXwfb//ebr7+3j9czAXlpJSnRBXdzC/O/h5ebyVUV3fk9OZXl7cUNGxMTcw1VLXltxdXR8d3FGxVbe01/QTnTe9F5OSXlxQ1/e2/XHVcDTdHN0enJBe39N1/P898/Qz/zKzP738PLVRlTI5Ofn7eHn/sza8/Tf3sbQTHZIRVNeR1ZOc3HVXE51TF7e2NDYUkZ3cWdmZ09CSVtcR1VW3/j85PP/yFRXUEB3WdFWWtrI/vjwXFJ8YmNhcnh4f2FheXxFy/j28fbd2vXz9vjl/fr+9vjv6PrBUH5xWV7XwMZfR0lZ0P3kzcVTe35Q0ML398XW9MnZyv731lx4a2JjbWVkYGFzdnZB//zX0llfxs/e/PXRQEJASlb18dRXR093cmR9SnRzdU93QVDH3dLbyvPk5ePo7efk/PDl4ezkz8XG39tV3/fbdUtKcEtC3dlUdV1WX1pF29NKdVhGUt7Gxddxd0/X9PX/z05xfWF4QFHS00NMVVnHwvPNXNXVREzS3EZwZmZ0QFPb8vnDXUNGT9729cFOcEbexvzk5uT6+fP1/ef+/c7Pwcje9Pry9cfMx9Pe+PXTW01eWUTb+/TJ1UB3fHxEWkpLcHd3dk1dX9ZVU0p0QF1WXEB+fnJKX871zsBZd0pSz/DC3EFBXl3Y/Pvz8czcVlfaxtvG2crz8Pz5+PD2zdfSx8jB0tJWU0Ld/efn+eX0T3R3SnZ+c2RneHJOU9xUzsxUVlhdU1vcUUFBV1BXw/TyzdRJdETZ01RTSnZDQlvc0PXEXk50SVt2cV1EXNzEwsdcx9RLd3FzfHRS1dRSRNzB/f3y+8jYz8TeVVrWTH/UwtDP2sPK09TfVVRdTndPS0DYXVJV2/TP295XUMzY0t/Y29tXV1lHUU5xd05xfHxxSkDUzNjF39nJ111eRUN/f3N5dE5YXlTV1PVQdHd8eGRnf3xIRMbK8fD14eXk4OT598TD311dVdfQVNL98t1HeWdmbWVze39OSljVVMjx9/f//Pv19PTB9Pz95+Tz+/fG0lpnZmNgZGFhfnxyQlvG9cVfWE53eGR8eHlaR1zf1vXDydj1/P7dcXR8e311SVRVzMvyyNvR1VVdx8rMzcJS09bXVdLMzdvc2tTb115fWdXKwsDZ3NZX0tXXXFFU2tdbX9jZ0vb58NlBQ0xhZ3txQ1FOT0V1Sn9yeHx0SnF9eXh7eXRJWM34//Px897R0Mfw5eTw38388vbExt/TTEtT10ZLVFxXw/L6/dBdR0RBdUtAVtTGVVHVXsb3/+T69F10YWF4Z2BhenVNWsTHUVFYT1XZ9PZbdUBDWkXTxsLYVFZ0c3NPd0tfW0Bzfk/bzs7Cy8H388f19dDFws755uPh+81SSkxKTlvVwtZGRHVKUNfdxsBeTnV9fXx+cE5MX1TRxN1UUV9d2dnTX0RSWEJW9fT998zGW0hDR1vWz/P8yMrIy83Z3ddYS0t/ZGd4cHZ0R8H55+Dm8s1EcUxbSkXb31Bc0/f9+uHi5slUXddbTklBdHFZ01BJdXx6fkRR01l3THZzc3bT8vDw/M/V0c/xzPnj4uD78P76/snc0VBAcHdLcXJ8ZGFC3tPSW3RzfHJ5cXdMU8PP28z65fnj7+7u4+X2wcNU1MnFzVBDcXRJdHhmeXB2V8RV0VPG29nw8vPK0EFHXFXf9Pnn5OX4++fg5tNdQ31+Z2NiY2dkclD19v7lyMDJ8/TcxMvB39nbzvHz/f/28Pb003FwfmdibGdxc3xycXN4StjHzvz988jW2fT9/vD+88/0zcZQzvz7//n/zMRVUV9CX0t1QHxken58dlvPyMr7+/r4yd7S3s7M29nT2/HYXtfay8LP2FtaxMBaSXFOWVfXQkp3dnF8eHl0VFl3Q0dZV/fh4+D799LYwNvbxPfy/Pvz5ebk+ffMwsbf0k12SUxGXNnL/+X9V1XdRnZxSXFxcnJ+f0Zd1M/I9/LI1tzK9dpGUtlX39tcdk5GQFJFXMzIxU1xeX99dEdOQEhxc3t9XcL8+/vh5/D7+uXm5fXC3VBaTkx5fU9TWUTU1tFdQkxY3/3h5/n2291Uw/Pl/83XXURJQHRzd3RCX0RY1NB2Z2FleXdaUlhUUXx2XN3Gyv/30VFHTFLfwsTT19fdz95HV19YV9ZSdn92dn50U8TL+uf/989aT1hTzcr12UJ0QEle3s31yvPCx//4zt1WV1pAXEt/emRtbmxmZHB0d3VzZWV/SFXdzt9bX13dyfD45+Xg+83BV9RFfXBwfXB2fHhkZ3p1Wtbbw1ZMQ3RC0v3k+Pn59cTb9uX6x9VGSUl+emZgZGR5dktBVkJNXVrC8P378PHAQHB2f3ROTU11XUV2cXRJ1VZW19fAxt/J0lHBxPTIxdpeTUZ1X9jRycNYWVhxcGV1xNHH3kRxfXBxdkVFXtRW19VHRFpR29zG9sjWRHdze3FPd0FEdX54QEdMRd5YXt7QUELd9vHh4frn+/3xycVTRVJAd0RWQEpwcnFZy83R8M7TXHJ4eElIdV/RV1VRV9jG9PPO9Pryzt1SX1/U1UTY3kZHd3plcF/SR0pwYGNtbGd7eXtwV1ZRysvC+eDr6emU7uHm9s3OxNnE8cJe1dF2TkVHRUdHRXJ7f2VwT9XG9vzz8PLw9P/++/7x9t5bQU9NWVlGXl1ASXZ9ZGRyTU1A0VBKSnZ4fHN/dkZKfXBLdV/z5Ofh7ezj5/7y9sjMw8bY2dvWVFfXx8HJ8PZQcHd0QNRX087J8fz8/Pz9+vj4/Pv6yNXX1VPfU9DwzFdHfGdnZH19fHVKdnN8fXBzdkpbWFbHwcLG9eTg5u/o7uL+w91UXE50dH50QExAQFD09fX5/P330lZYQNfY9f7998rA387y//Ty/fLyzd/Q0FdXVVFf2NJZcGd+dXda31xXXnR0SXJwT3R+enJwdU1UyeXm7ezu7uH7yd1bUlNfWFtOd394d0BGW0dxQkBKS0p3RVHa9v7j7u/h5uDg+uTm/vfB19BSQVLSTtZ8S1BmdE9ORt3W0cbP1UZ3eGV9fXdOdkN2Q9zE/+Lv7+Dk5PPMXXJwfHt8dkNHSEXV0cv1yMJe1lZa1kZB0FHV1tfQ2sbM0dn58vj7//7bXEVM193Q1UZ2fGRlfXpA1FpfQVpQTHR8ZH1yfU7XyffN9vrm7OLi4uH8xF1OcXNxc399fXJ0QlZW3dnW0dFXT3dBRkdWw8r08v/59c71z/L58fDI2FNDdHJ9fXd8f39xcXxK1dDRUVzdV0BzeHt+eXN9fXF2XdDZzPzg7umU6uLy0tLG3tzXS1pDdnF3SFFX19RB3VxNdn51Rk3czPf6/f3l/f/n+eX29PLdSX5ySkpKdXx/eGFnf3p8WdBVTVhYcWVgZn95c3N8R0NOVtXG+Obg5uTg/9NPcXZHV1FEXlVEV8bEwvr68cPC2l92ck9EVFXV08za3cXB1Mfh7OHg4PPYXlLVwfXG1NVScHl8cn9PR3d+cHxgbGhqFWNmZHh2Tk1e1sz94unu7OPwytnTV1XaXE5PXUxGTE1L1c7A2t/UTE95ZUrE9P/y9vb19/Py/uPk+PnlyddYfXh/d39/f31/fHN3WNPQVFhHS3h5ZGdmZWdleXJNcH1OQFXw+OXn5fPP2dbfyMjGz9vQVF3R2NDRR0pISnR4ZGNjZmRxQcTfw8j29vzh7+js7efl+crA2t3cVF9YT0ZJfmRnfXRwfX59cWdoamhjeHlHRkvV0Mfz5u3t4u7p4PzCzNJBR1NASHVASnx+SkRZX0ZCTUZ9fnJ9c0fTxNnXwt7Rw/Lz9vH38Pzwx9DS2dj38M9ZXVVId0pBd3BBRktyeGBoFWttenZwfkFSSlr35ubs7u3h5OT/zN3C8fP1013a0FZfXkhxTXR9ZHpkYGF+R8DNwsjL+P/l4ebk4OLm+vz69FVFTEpDSnR4eGdneHJ+Z3Z0Q0l1cHx/eX1NVVBSV9fd9/jl/+Ht4OPg5v/38f318vLMztvR2MHSR3ZR3VjV1k11c3FCW8zA1tjez8rJ8vPz5OX/+v7w+crDVkVRdXh4fntyeWRlZXlmZmRiaG9mZXpyQ0JZ1PHn4O/o7urq7ens5+X68/3C3FRLRkF0dnJzd3F1dVhWUkVX3cbB0s/29/7k5eX65+Hk5Obg5vr7883JVHV0emR+fnF9fnF2SE12fnhlYWJmemZ5f2Z8RNTX1Pfn//ri4u3s7u7h7eDy88vSzMbcUnJ0f2BlemV4eXp6dtBDcdPWwP/k7OzolpWVlpXp7uT8z8jFZWNjbm9gY2JvbWZjeE52cHZ9cnt8fHp0SEbd9fP98/rl+Pr8/+X68/Dx99JCT3R9SltFWFpZQUZTUEJBTk5DWtZeWV3R38v38/n75OPu6ZWV6u7t5vLDX3B9cHJ3f2djYmxoamxhY2JtY2NkZWZ6TVXa+O3plZfq7unr7uHn5PLKyVxweX95Z2BibG1neXJPVVle1tZTXt7X19j0//7n5/j65Pvl5OHj4+bxXURyY2JiYGVwcHZOTEhxcHF/eWRlZ2NkZGBmcUNY1dfM+OTm7Ovq6pXq6e3i5cJdUd1ZSGViYmxoa2lhZ2d4enl0d3xwQtvy5+zulZCRlpaUlOnv7fvIVXltaxVqFWpqFmpuaGZydUJNQEpIREVYWF/b9PPn5fL5y8bD9f375ub//MpdS3N0RFnW30Rd01RQUFZU39VZWUxwfGdjZ3x3SEdBwPHy5OLql5Tr7+zm88VES091fmZtFRcQHRITERYXFhVubmhrZnbF/OTol5SRl+qVlZXqlOjs595Kd3pibWgXa2pqbGxmcEdT3dbezvXLwP7l5OPt7+/h5v755+fh5/bWXHJiaxQVb2BnZ3J9f3ZwfX99cU1EREFIeGBjY2Z+en50TlDU2cz64+/p6OuUlent4efwyNZAcGVtaGtuYWZkZ2Vke2Jgfl7B8eHtlZeXl5WVlJSV6+zk+dl0Z2JtahUUFxEWFhYWFxVpYmFlTNHdx8745eTg5+Tn+/3y9fX85fnDWk5wemRnf3xydH13QkRBdEpW9Pf098rxx1JISkNN18bG8fL/+uDt7+7j4u3p7uD4z83TS35nbGgVFxEQERRob2xjYGBnfVTA8uXh7+/u4uDh5OPs7O3h/vDLXUt4Z2RmYGJiaGlsYmd9TEnUyPHk7e3h4O/s7OLj4uPm5ub75//N2Vh2e2RmZmRyeWVzS3J+YWJgZ3BJX1hHSnZyfXBKWV9VzMfewMr55+Dm4ujr6Ovp4v3b2E9/Z2Fia2hvbWN6fHJNT3BB1dLK5eDt7pWUlZSUlZXqle7m/shfSXxmb21vFBUVFhIdEBYUb2FwUc3l4urr6ujo6O7v7+f/+fHE0ddJdnZ2dnd0T01b1VBSUdVQ0Mr1xvD6+v33z9ZET3VH09PBysvBwvjk/vbw+f7l4eb7yMBSdnd+ZmNvFWtoaxRobG5pb2RyTlHM9fT95+bh4ODs6Ojp6e/t5+Tz20h9cWVhYmNta2tpaWJgZUbZ8+Dp7u7rlevu7uqU6Ons7eD6+PfDWHN8fH5/cH1mZXx7emFgYGBhe3l0dnZaWURMQEdd39nfx93bzc3R1tBUxPDy5Of/9fb8xdba0dHZ111GWdXWVkVOUtdX38/y8sr45+Ps7uuVlJGRlurv4uTNWkt5YWxoFxYQEhMSHRMWFG5hcFTb9fzn4Ofn5ubm5OX/8/fP29J0eHt5fX5OSnZ0SFNfdHRb09/B8vnk5OHn8tLawd/czfP0yPT85Pr54ePg5Ofg5vnz/vLTT0t1dmVlZmJoFGoUFhEUb2xtek5dUdzx5fv45u3i65aU7uTm5MFecHZ2YWxubm8VbmFhYGZ3Q1L15Obl5+Lv4+Dj7+ni4eLv4uHn8t5SRV1JSkhxf2ZlemRmY2d+ZWd6dHF5cEFJdXFA311aQ0xJdEdWWVpaVtVARdbJyNv1z8nD19rE01VTWXdJW059ZXhwcHlzcUVITdHQwc7+7OvqlpGWlZWX6+H68MBTe2ZtaRQUFRcQEBEXaGhjZXh/X/f8/Pz65Pr6+ufk/uX90EJxcHRzfn9lYG1kc359SFhVV9jz+v7+5frw9fzl4fjLx1B1ddTH3dDFzcDFy/758fb0wNZRWFJddHF8e2NgZG8VFRQUamhjfn15en9wTNP24e3i7Ozn++bm9dzT1VFHdnV2eWZhZGd6fnZHdEtSU1XB/eT4/v7++f3/5uf75Ob49//z9PbKzcdFdnV1fWd6eHl6enNJcmZjYWJsZ3p2QkFbQE9OW93HV9DQ21BTzcre1VdeQkHS0MHG29jVU1HbxEV3dHdwdNLw/cDa2N3d9vvg7u+VlpSV6uri88vE3V1FX1ZIZmkUFWpsb2BhbG9iYWZwRU1LR11U08ry/PP0wdZFRkN1dmRkZGdkfkJJf3l2RFbB/uPu5v33wMHIyv/58vf09vXNw1dYX9DGzvL65+Lh++Xy+uPg5vv+8sLd3dxdcmwVFBATFhdqb25tY2ZxRMD9++Ps7unr6OPz0XRzfnNDQEx3emNtYmR8dHRIT3VFxvvn+Pvn4+ztlZSWle/s5//9/fz92dRES0hPXlp0fWdkcUlXxfbKxEV3S052cUp3cHN2dtTTWEBxf3F2RdbYUHV1cXN0XM/89/H/8vP95OTx0UpwcXJ/dlpDTHR2TF9Vxf35/f/h7euUl5Xv5/r5+frk5ffO1kJ3T0BBS3hmZ2NsYGZibGBheHZbzeXl5eT75eX5/P320UxLeXt/fmV7emdldlfN8fHy9sP18vn5/Pjy9PXB8+f7yPXD3NDewf/m//fPx8T3/vrk/8z3yNr18dhbSmRgYGBtYG1uaGpqbHhLXN3Zwfz8+ePhyMPeWkZKT1bSQnRLTUtIX9HH1nVAVVbEzsFV3sXD9PPy4Ozn+/jk5uHn5+T49ffMyf/yxkRYXlNW1cL7/srFx11JQnRlYG1uYWxuYWVkYWVxRdfRxPL0w97SV8fx8vb3xNHD39vI10dOdnd2dUNRUkNaUF9YxvP+//7l4ezrl5GU7+Dn+vL38f731URYQ0pBXFlOfXt8eXh4ZG1paW9gZHxLXVxEU1dR0PTw21NAT0p9dEBwYWNnfHZLRtLOxcTy+f755uf898XIzdLf3ER2dE1Tx873//70zfD/++bs7+Lt4+/t4Ob7w1JaWUxxfGR6YRQWFWoVaGxtbWdz383O+Of48fbyy9zU1txGeXp9emRnZGdnZ31EQEReWUxe0tvK+efi4+Tl5uPh4uzi5/j55/nCwMPVSE9fU1BfUtvXXV7HzNrb11hyZ2dlYWxubGoXFWljeHZCXFpEUNZbVlZZTUhG2sFQTURNZWR/d3F3d0NHcXBaXkJbXV1YWNz+5ufk4+Ll++bg5ubh4OTzzvbC0tVTQHVH1NjWREhIZWNgf3F5cEBBcXl+d3F1WVZGQkTQ1Ux2d0t/YWRwfHx8dUx2QVfQ3N7MzV9S0Mv12sfeWEt3QFJcxf/n+uTg7+Pk5uDn/f7m4+f99M7WTHRfWE1JdXBnYGBgYWBjZ2JpYmVIR1/Hy8LN9P/xy8vAXkpOQXdkYGBvFBRvZ2R5cXV0d0vcyfDn4O3g5uLi4Obn5+Tx9cvDzdNXX1tWVNrOycr3y8/x+Ofn/vPw2UdGRUJ1cXxhbGtqb25sZn9KTFbJyMfd2MHQV97F3dRZTXF9eWV+eX5xdn5+fXBwTlDfwNvAyPTw5eLolZXo6ejv6Ovs4Obh5/PI3FxPemd6eXB1S3VzfGV+c3VcVEVDTkpDdXVLSE90dUpzf3J/YWJhZXt7enl4ZHp2Xlffw8TbUkxW28n2/OX+/PbCzcPFwsLM8+Ti4OX+8vn48vrn5ubk+P39/PL39vT32lJfR0lxfX56ZWFjY21iZElEXNvDxMDCxd5XX0ZFTUlxZWBta2tob2NnfnN1cXZD08j8+uTm7O7s7+/t4+b7+f78+Of78ff08fbw/fDH0NTY9fb8+ffO3dbSUl5aQk10fHx+ZXt/e2ZkckJT0NJTTndwdk5AW1FQdXBwc31/e3hkYWFmeHBwd05PRdf08/jm4u7p65SXlerr7uLm5OX/8vPwyt9VV1dV1dnxzMfL9vn78czHzcjcXFpAXdFTRHdxSk1AQkl1d3B9e3p8cXJlZmZnZX91QE9zfnJLdXRbV9bexMn2/vr88cnG9fjh7e/p7u/i4+LplJXo4ubh4ODl88PaVUBNWdHWR3N9fHhleHJ0dHdPWFfH9MLQRUlyemZmZmRlZGRgY2Jsb25vbWBkeXZCRVtTUcf1+eDp6uqVlZXq6Ojo7u/v7+Pk5OTk+/PKzsL2//nn5+bl++Dg4eXzwFJ1dHZ8eWZtaBcXFxVubGNmZ2BvY2Z5f31ycHd0QUJHTn96YWF6d1pR1cHNwvzl4OLj4+Tk4+mVlJeU6Ozj4OPj5vv+/fb38PTQUlpNT0tOQUZCcWVnY2lqbmFgZmRlZWV4eH54enpkZWVkZHp/cndCXlbc3tbZwM7GyP74+fj//f/5/v/65+fm5P7x8P/4+fr7/8va295TQnB8cHB3dEpxcX5kZWR4cUpKd3N5ZX93dHJ8cn9zfXFGQkJbWVlZR1LVUVZW3VHVz8vN0lxaUNPH8f/9//vy//zz/v/4/PPw9///98LZX1pTWVtPcmdnZHt/dkxATUpOWkNJXdPE01lZWUJ0S0dAdUdEWl1SVtHS0tvAzvT0xszMwsj39/f3xtDW1EVwfXh6fHJ4fHx6fHdEXVlY0NBS08DY1F/U0FbT0sDB0UVFTUhH1sXGzcf0zcn/+Pn4+//1xMLCwMDIw95dXdnJxlZfU1Jyf3xlZm1tYm1nfkpFdHJ1R0hKXtnWVlNWUk9CSXVAS3V1dkNF19nc3cjx8eXh4Ofh4OPn+ubn5Pvy8s7B9ff58cLA3F52S1tOcHdwcmRjY2JtaG5uaGxgZntkYWdmZmRzSElPS0lzfnNIQFteWVta3cDx+fz+5ODm4ezi4+Ph5/j8+f3w9NjVRFfa8fr58Pb39vfw88DTRUB0eGVhbWlqahQUamhtb2hubG5vYmF7e3p+d3RPWF1V09vLyfbk4Onrlero7ujo7uzg5+fl+eXk+vL9/fH08/r6+PbO2FZBRERNSHJ/e2FhZ2dkY2FhbG9tYWdhYGFnY2xjZ2RhYmZhY2V3WlxE0Nrcxf3j7e3v6Ovv7Ono7OHh4efk5OXk//f3wNLV3MDY29/V1UVf2tBEdUlPT1Pc28BST0ZDdHBMSX16Z2V4ZHhKcmZ6dXNw0cH18MLL9/T09vLz8Pbx/vzy+Pry9PX0wvDl+Pv598j0wN/a21BaRltZQFtaTXJ9f39wdE1PTEt9c3x+cUJTU1nW2cD2/eX/8/L8//zl5uf+9sLN10deU0d0S1dcTV3W2lZbXV5dX83zyt5WVNVEQV1dWHVDUUJN1ddQSXF2cn91UlNETEtfUk5b0sfNz/b4+uHu6pXp7+/i4u/u7ef/8PHC0sbOx1ZXxdNQ1t7TTn95Z2NjZmdnYGxiY29uY2NgYHp0d0lXx8PRUdzSUd/L9/fG1NvH38bIyMr25Obl4ePg4ebk5f3+5ebn+vvl5Pvx98rT1FTZ00RSV1BbSXVyZ2d7fmVkenh6YWBmZmNjZnlnZH10SXdxdnB4dFT2/fD++/795ODi4eLp7uLslZXv4+3v4Prk5+Hl+f732tvPycXS3NFZdUhOTH16ZWRib2xjYGxsbWNsbG1ib25sYGZhenNycHRaVlnUyf//+uPi5OTm4eLj4OLi4eTn4fv8/vvn5fv6+fH3887d2t5RRU1NdXV0SkdDSU9BUV9LSEl2fHx+Y21mYWFnZ2RnZGRySXZNUNHY09fDy830/uX39Pzw8P38/vj5/OTn5Ofk5+bk+P/2wdLVSXtzc3x+eHplZWRldElzcHx+f31ycXN/c0Z3ckRfUdXZwfX12sv+98zIzszBwNrH31td1kRQ29Pf2dzEzdvdzMPRU15fU1hYQkt1d3F2d0XRV1Td2NjCV0VSWEp1SHZKT3R3dn1zSnF8dNDd2vfz+uTl+eTk5eTk+vvl/ffGwcD1x8Hx9Nnb2sfUXUVJdHtkZGRjY2JsYm9pbWFhZnt+c3RKTHFzc3RJfHh/ZXp3cXdEUtfI/fLn7+zv7+vr7u7s7eDl+/j3yvDxysTZz8/A2cLE0d5URH1nYWBjYmlvbmtubWFkeXp5fXZKX19DT0RSRnFPd35kZnl8cXRE0c7K9vr6+efi4+Dt7ujt4+Lg4fj9/PP++vn4//D8/fbIy/dVRkF3f2dhY29paGhpaWxsbG1jYmNjbmtsY25iYWV6ZH9OWEFAWdzK9P3h4Ofm4uLn5Ozs4eDj4+X45fjz8PHw9c30yvfC2tdZR0tNQ05CSHZ1Sk3Q29PeVVpMRlxfUkN0cnpgb29tbW1tYGBjZX1wdE5DXFTN8/n6+eT6+frk4ePh5vj7+vjm4Ob6+Pjy9fH3zN9UXU1Nd31wdnNxcUlITFlLfXt+cnpkZXhkZWdiY2NjZHNydlnRzff/+vr//fv69sj28c/CwMHc3NHZyMza2tdbXFfa3VxNRkF3dkxWX11aQ0BX0839+fLw9vP/8vzNWFpXWnRNW1pcXUx/dUNcwPPw8fz89vT7//fOzvTB2dzTxMTVWU51TlTXUFJEQUdaU9ZOd3J/TUt/dUh3dXdOQXRLW01HT05HQEZHdXx6e3ZMRllW3drC/OTj7+7u7e/v6ejv7Ozh+PLw8vTG3d1UV1TVU1pKSnF7ZGd/ZWBnZGBvbmJgZ3h0RlPUV9PZV9fcUV1FV99bRlFfQU5bXFDexfHl5eTm4O3i7uns7e3p7+Dh4OTzz8rIz8j0/Pzw9PXLzNLdWnRxe3x+ZmRkY2lpbG9ibmNke2BuYm1sYnpnZmV4cUhxdEJRVcLx8fjl4OPv7urq6urqle7i5uHg5OT6/dtWxsbHxMPG3VdQUFtOTUdIcH1wTlJHR15GTV5SXVFR3VBMdHd0cXh8eWRgY2d+dnVd3sXY9/P//Pvl+ubi7Ozi4eH9/fHx98L1z/fw9cj1zNvaycnbwcLNzNBTVl5ZW1BEQU5MW0FwcEdLfXl7enh7c3N8eHl/eX9PW1PX2vby/fb45Pv65fr+/OXm5ufk5fbWQkRfVV1XX091e3xydU90dHVzd0jVwcLH0VJcUdvIw/Dz++X88vLw983eVl1TXtTf2tzf0trGzMj39s798/b/983HVUVOR1PUV0VMS0NEXFNbS3F6ZWRnenJKcXlnZGRySkZZUEp9eXRAWkRf1F5TXdXEy8jZ3dfX38TD9fzk+PL8+efm4unu7O3l/PX99sbe1NzWTXJ6ZWdgZmNjbhQUFxEXFWlsY3l+eXllcExaWUXW0VTa2cr88/bO29vQwMzy+PXB3sLI9PL75+Dn4eHh6Ojp7Of+9cn28ubn+fDYXHd3T0N0eWdhaRQVFRUXFxUVamhpYm1paxQXF2ppbGNmcnZ5fnREWV7a9PP8+ODj5OTh7e7ol5GWl5WU6u/t7+H+/fnz++X8/s9TTUBEQkRDeWRjbmloaGxibGppbGFlZ2VnZ2BiZ2V5S1pWQHZwdklFxfDzyPf/8OXn5Obl5ufm5eTt7u3g5OT68frn+vH3+/r8/f3wysHXWHFleH15ZmZgYG9vYGJsb2JgYGFme2RtZ2VnYXpc0EVORFFTUfXxxF9TUdzN8uHj5ufj4ubl4O3v5fb/8sjIy8nUQUVS3dTd9vTRR0B0Z2Bke3pjYXx7fH1wcXp7dl1bTcf2w1FTVNnTyf3z8cz95fjy+/r03NDezPbw5OHl8PX00lhc2sNcQFBeS0JEWEtLVlHd3sL8891SRXV6Y21jYm9vY21vbmxuFWtsYWZnT9bR1MX08/P74OPj4O3p6e7p6e3n/vDx9PH4+/Tb015xent/emZleXplc3RwfXB0SE1E3vXER0x0ZGJuaG9ubmNzcXZeUEFB18H28fHh6eHk7Ont7OqVlerrlZeUlJfr4f71zdtVVNHTUkBDcXhkZ398ZWdwWXdLQXR9fElbdHp+dX1nZ2duFxMTEBMQFhVuZHl3S0hHxPP08ebs4uDu7uzp6pCQkJCQkpCQkpHr4vr000lOWkh5fn57ZWZ4cXBzfH95eXBHdn9yTtJCcH13d3dxfnhhYmJtYmFjYWZ9VlZaRVHJ/fzn4OPs6uqV6uiVl5GQk5CRkZaX6OfxwtR2fnllemZlcHJ5f3RBQ1fA2V9YxdpNemFmYGJtbG9ua29tb2liYGBhenZzckzFys3Fzc/J8eTm7env6+rr6Ojv7OuU6+3k5eDlztREcnl7eXt/fnh+fWV7cn5zQlBcdX53T0tyfmRmek5ZVsXe39rE2MzF1tPM8fTNw/H5+P/7/fDx5OPt7u7t7eTl5vz0++b5/ff18PHRRHR+entkZ3twdHF0fntlZGF7ZGZ+Zm1jZmkVbGBjfnZAUNjM8v795OT4+Pzz98D3++fh5ufm4eLg7uvt7u/g+PHKwfTC1FxEQkVZ1FN0cHhib2huY2d7ZXx7ZHt8e3t9cn15fHRBcHBW0VpU3PT44O6Vlenv7+3m5P38++Ti6e/i7O/j4+Hm+/H0yMZXWF5WWEBNdUNDXVBFdHllYWkVamhrbmJjbG5taG9hYG4VFWhsZHFNUdvP9vjm7e/s7e/j5+fk5Prn4eDj4u/qle/ole3nwd7d1VXX2Fff0VBVV9dZdntmZ2ZvbWBtbWJmZWZheH9mc0Fcc2BnZmFhckHa9PH65OXk/v/7/Pz/5eTn4uLu6ejo6evi6ZeU4vj+3Vp1T1nT297BwsjEXURFcWRtbmtpbmoVahUUamsUa2F5YGhoaWtobGBkZUjdzfP//v32z8rDxMv45+bh7O/o6ujs6pGW7/j68cRYTU51SE1c3NvFUFDXXXZ/ZWRkY2Blenpxdnpmc1nSf2xnb2kUbmV/eHRWwPT09f74//L+//3w+eT55O3o6unsl5eU48fbWnF+fHFJcXB3QVtTUFrUVENwcUl2f3lnYm9gYWZpaWVmY2oWFhYWFmlmZntPVML/+/7y8PL19M32/fXx++Th7eLt4+zp7OjnzsFQdHlzdnN3cU1YTkNZ01J0eXhkYGNgZXl4dUt8YWZ0dHZ5YG5raG9gZH9JXlXP8+fh4+/u5vP95Ofm4Ozi4uLu7O2V6O7h9MjSWF9CRE9yZXl3WltERUplYGdnYWNvb29pb29jYWBnZmxqFBQUFxVraGtsenBc0fH//+Hj4eTh4+nv5uPs7O7u6+Pt4eDs//n89MBW0dZISkpBUUdLSkVDdXNxe2BgZ3plZHhydnp5c394Z2VkYG5tZGR6fnF3dVn0/ebu6JXq6JXqlZeWl5Tr7unv7+/p4ub6/vbZy/fMwNRR01FWVdVRTnxnZmNgZ2BiaBUVFRVpb25ib2JibW1tYGZmYWdzdkXZz8zx5uHg4uzt6pTq6+3h4O/g4eD7++Tg7+7s4+Ph/vHy8fby9sjJxVJdWU52eGRnZGdlfmRlZX56e2RmZHllYGdhY2R5fUpM1M754emU6+nr65WUlZSUl+nv7eHh4uzg5OX+8/Py5OH49vb09/X2/fHCRHV2e3pyeWVjbW9pYmNlf3llZmBsb2lvYmsUaWNmc1LSxfT85OLo6pSWlOvo6Ozi4ODl8fLn5P745OTzyMbczvby++Xzyff0zMreUUd/ZXlkeXZPT3J6YGV9SkNMSnJ4emRjYHp/cHBax/bg6ZSXlenp6pWVlZXu7eH7zMr/8fbN0d3A9PL89s7B1lfW2tvZ0VtDdXx7f3tnYmgUFW5sY2xtYm1iYGR+d3Z5fHJwSkTVz/X0yPDn4OiVl5eV7+Pk/vPz9MTe2sfM8/jl//7K9/3z//zz9NhbTnVOd3N9e319eHl7f35kY2pobGBkZXx+ZXt+f3F3TkZf3vT74ezo6e/i4ePolJSV6u/l8Mffwtvf2tDP8vvh4eDk9FJKSlnU1tNfc2dhYmJjb25tbG5vZmNtb2oXEBMRaWJmcnR7YWZ8cUxH1/fy5+3qlZWV4v3A0MTz+Pry9MzF0tvL8Pzl5Ofj4uDl8sFTfGFkfXVLXVFHcmRkZ2ZgYGZibGR4eWRjbWgWERcVbGV5d3V0Td385uDs7+qXkJKQl+vh9lJGVNDJ8fL++/L9+Obk+f30zM3//s5SSXtpFxdrb2Bne3llbmhpaxUXFxUVFW9ibG5qFxMSFmtjZXNfyvz2++Pj4ODg4+bn4fvxxlB1fHJe2/jm7JSXlOju4fjK3FNfQVzcR3d9emBpb2RyR0xJXUN3cntkY21vbG1nd0t4Z2ZtbG1ldNX08efv7+no7uzm+/Py++Tg4f7xzNrUVdv25+Pj7O3k5PffRnlgbhVqbmZnYmNsbxUUb2Z6enJ0cmRnZ2Jobm9uYH9D1VtPT3R0c0Ldz/364ePh5/j9ydvY09/E+eDg5/j/5+X2/uHt7+zg5fVURXBnbGhpaG5kcX15e3hwf35IR3VxdXV0cnN1fWVkf0hZz+Xh4OT5+//38eXk/uTn5uDk5OT++OXm5+Xs6Ons5+Tn/M/A8vXJz9dQW3Z6YhUXERcWFG9tYG5vYmNgYGZ7YWR5eHBzdnV2dnRf2snk4+/v4+b49dxQVltD0MH2/uTh4frn4+/p6ZWVlent5v3I2VTQVNHf3t3W01JxeGVhYWJiZ3h9eWVhbWNmZHl2d05d1t/NwNfQw/b54OmUlOni4Pr/+f3w9vf2+uTl4O3s4uzv7+np7u/k8PTQTHZ6YWJgY2Fle312c3lnY2xsbW9tYmlsYGNhZX9xTFPf9/H8/v7//f3y8fXx/fzww/LwyfP5+Ofh5uPj7e/p6ezj4+Hn5OT6+M7F29VaS0FNd35xSUVfTnRKdHJ8eXJ8c3p7ZWVzcXZCVcHy/eHg4eDn5+T5/vDPzMj5+vP09/3x8/rg7+/u6unv7u3i5f/2wcTf3t1adnh6Z2FnZmFmZ353ZWdmZmFgYGNhZ2R8cXBycEBQ08DA9PP3+eXz9vXB01DWU1zQyvP98Pb9/uTj7e3v7+/p7OHk/PVXR19eQV1Q0d9TR052dkp9fU5bRER1c3N8entxdnN0SUTW38LJzsv08ffJy/H9/vzz/fbL2tDfwM3K8/fx/uX4+fz5/c709PXb1NZdd3tnZmNvbWdnZHt5ZG9oaGxsYmFmZ2ZlfmV6ZmFnZHlM38fYwfTFXFhHWdTXyvbKyffwyMPFx8THyuXk+vn7/sBWXFfRUVTFx9RWVVBHcX9/ZXpwQkxwfHN9Z2BmeHx5e3J7ZX1wfWVlcnR0RsvwzcnI987R3szNzM3Iw9vOyPb29/L8/fTy//D2wMfcUE5PT0lKfHJ8f3x8enp7e2Fib21hbWJgYm9ubGZjZGV5eGdnZ3t+cnVId3FxRFNT0NZRWUdFV9XA9P//8P7n4eHk5vvKxtbS1NHbx8fb2NfRyvfP115d1FJ9ZXFGTnNkeHRMSHB6Z2R6ZmFkdlBEdUna887Yzc/08M3D3sTNxdZBQVZS2c754OH6/OTn+P723cPC98fcwtnQWEFCdXBLTEBfdH9lZGBiZ2dhZ2ZkZmFkZGdlZ2RneEVU11JaWFNYdnRYXEROWFxQVdbGxvXx9/T/4eLg5ubn5/Lw+fr65eT7/fLy/PfZ39RYQ13S3t7QXEZeSE1KdENJdnBIRFtRR0FUUlXA9PP29sPcw8PQU13R3dJdUc318/v6+Pjl5OHt4ubn/Pbyyc3e0sBUUFtBQnZ1SXV1dnFLQVl0SU1wcntlf2VneX9/f3JLS3VPTUJPWVHTxVfZ0llfU1PWUF3e2MHGyfHx++Tl5uTn4ODj7e7t4Obk+/v88PLL3tzd29vAy/XBwvbxy8LfU15PdHdAVlpYXENHU9HHzPf0ycnDwMHUV1BYRHdxSFrFyfb88fPw8/L9/fHy9/P78fD+88jQ197VXVxcRFhUU1zU01hIS0p0cXV9f3tmZ2FgYGNmenl4fndKXNPS0VxaQ3FJTUtLTlpdXtD38+Xg7OzvlZSXkZaWlpeXlJXq7+3g/8veV1ffx8zPz/b39fbK3tJTWV5LdHNzcXlmY2JibGNmZHl6dnVyc3J/e39zdEfQz8j38fP8/vvm4ef4+vrm4OLv4fr4/vP28/P8+P38/c7a0V9GSn17Znh/fn97ZmNtb2lobWBlZ2V+eX13SnN+ZXtzSnBLT3R1WNHW38v+5uzu6pWVl5CQkZeXl5SU6+nj+cvO29HU0tHa29zJ9czBzFdYSUtweGVgYm8VFhYXFhYVa2xvbWdhYGRkZ2RlcVpXwfbx8fXx+f7y9/Py8//75frk5vj/8fby/vjl5uXl+/LzycbGXUx2eXt6ZWVmb2sVFRVqaG1ke358f318eXN8eXh/f3l6e35zfH5zT0Zdwvvg5uPv6uvu6unt4uHk/8DF3FlycXV8e3BCW0JDXlBcWFJZTnd0cXlmYGZuFxEWFBcVY3pwfH55eX13T0FfUlbSx87398zf0tjO9PHz8v3K29/b39jT19bY9PL29/n9wF3X2tpRXlXb1V5Cc3Jzc3tgYGd6e2d6d3VYXVxW0MHC3NRcW1lPd3Fzf3xwcHh9d05H1vb98f76+uT6/8Pb13R/ZWRjbmxsYGdkfnZ0SVbO9/D++vnxw9ZGc2VhbG5oYGdiYmZ/d05ERV9SyOXj7ebk+PH29sjT0dxUXtPPxtPA2lXd2MX3//76/Pv//PPOzNrF2sT19cTBwtRTXl1dQkFDc3h9eHJ9d1pBXlXA987S3t9UU1haQ3F0dndkZ3tmeH1IW0dWwvb28//zysvBxd9STk53fHh8fXF0dnFxQ9r3/ubk+fv7//z03lRER0p/en5/cEhLdXVxTsPy8v/l4OLg4+Dl8/XLwt/b3tfc2cTa2sHN8P/n7ejq6uvo7OHg5/zw8c3F3V9SQklCQUVeRE5HWVpYRkJ1cU1PQFpYWEh0fH12fWdnenl+f3h5cn9ydnZ3XtXf8f/65uX55f3KyPL13NZdSX18emV/cUXE8fDk7O7p6+ju4Pr89M3QXEl/ZXt9fXF3S0ZMVvXw5ebg4u/v4+zi4+b6//bNwsTX19LS1drA9f3k5Obm4eHi7OP68M3Z1F5TQnF+YWZ5f3lkZGRhZ3tmZ2RmYWZle35xd3ZCSnRCSU1PT1Fb1tRb3dzZ29BWVNnJ/OT6//7x/fzy/vP0wtrXU012eWdkZHt/dkJE3cD85/v75OXk5eXw01BNdn9/c3F2QtLazfTw5+Pj7pXq7+zt7ezj5/DeVFhESFteRV9CU8fGx/X9/fn//fff01J1cHpgb2tqFBcXFW5tY2Z6Z2BmenRCQVdcT0hcUFtQUFVdT05eUNfC2NrPw/Hy9vnl+/rl5+fj5uXk/vL88M3b0FJPd316Z3h6YGNlfUrUwM70//j44OLt7+Hk/cvYUE9CS3dxcHZORV1U2vT85+Pu6ejr6ejs5/zOUkplYGdhYG1sbG1vb2Z7QFdQ3t7S0lxFTnhnYGxsb2xvYmBjYGFhZ3h8cXRHXFjQwNzR0cTIzsvP3ddSRNX18ff0zsHaw8DO/OT///3/9sHBwvXx987C3NRSWNbQWUJJSUVcUkZbVNbM9/Hz9/b5+f3499hVVEJ3WVBIRFVc09jZ2NrF3d/B98rI29LUT3Z8YWJjb2lubmsVFBdoY2F7R9rP8Pnx9fTB1VBWX3BhZmNmemFnZ2Zke01SwMHZ9vXy+8z08cDH2cbGUF1PTklIQldQ1d3C9vPw9PDy+ODm5OH58vD2/fHP2t/BxdZcW3R8e2V6f3t6c03c9/fw9+fg+eTg/srfREhxZWFjb25obmNmYWRlfkRRT0TQ0MDIxNZZdXBwfWRlZGNtYm1mZWV4fHJS9/35+/jl5f7wyt9XXlJZTnNyZWB7cXN3QVNcWdHCxN7EwPTz9srMx9Lcz8Xd09DUxv/l4ebm4efi6ejo6ePl5eXx3lFFTUlIWFhH1NfU299QRU90dk1HUF1OdnFP1EBwemdkZmZhY2xoFWptY2JmfEHZ9f/l5+Hl/+Hm8PXcWVp0fHhnZGRmeUxFVtLH9uXm4+/u7+Pi7+P6ytFGcGRhYGFjYGdwT0RTUdrx++Tj7+ns4ePj5vr29/3yysPKxtzf1tbJ8fD18fj//OTolpHq7O7p7fv3XUlESXpsahQVaG9vaBRqY3lxcnN0TUVWWXV0dUxKcX14fHN9cHtlf3FLdUXW9//65+Tn4ODg4+H498HB10B0fHxxfXFBU1Zf087x//P95ebg5vr9wNvUWVhBWFlJXFJT0s3w8/jk4O7r7unp4OTy9cVVUk1zd0xBRljSwPH+5eHi4uDi4Obk//fP0Vt4ZmdhaBUUFhcXERAXa2ltYWN+TVpUxvbKzcDa3FzVRnVNfmd7e3h/c0xHW9PK8eTm4ezu7OPu7Ob68vHC31FzcnF5e2RnfkhATVTB///l7ezv6eju7eDg5/L2xFJeQ05eQUxGUF5b0Mb9//rk5Pjn4ODh+/LL3lFbS3FyeGRhZmRkZHl9SkNCXNFZTlJUU05zcXp7eWZibGZnYWV8c3FxdU5BTkNS1VHT/f3GwszE08HDVVVRXEBLWtHHxdrI8OT45+Hk5OXl88nD2tjdVVJZWdXXVNzY28vM9+Tl5eHh5Pvk5fv7+fDKw9xRWEx1dEpPW/Ty8vL//fDl4Of+/cRfQ0t8Zm1uFRcXEREVampub2hpbGRzTMP29vz4+P7/8/XD0EVCfHtnYWFgYXlycUpMUtDa9vXCycPG2NLK8s7HxtBUR0RfdHFyf3ZeTUfcwvT74eDol5To6Onj5vr/01RdS0pGX092d0x1R9Pex/Hz/fv65+Hj4uPm+8jRVlhMcHlgbWxtZX9+fHJ7ent+cHN/ZGxvbmhob21vYmRneXd1dnZ2f3lxT0lAVNDdzPDz9f778/bF39Hf0UxKdnJzWlfW2dvf2cXP2VRfdXZKRlzZwMP18fP38vn5+Pv8/f/9/Pjm5ubh4eTk5P702EJyfHF2d0tOTV7R3NPey8D18PPxyNxV0FpPdU5Ke2djbG9vb2sVaGhubWBkcVLTw8j19PH598XUTXF7Z2djYWBjZ3txRFdXVFlS1N318PbI9ff3/fj4+vr0ycvC2VxCSHB5Z2dxUFHA9/X85ebh4Ozi5+X6+/L4+/33xNVR1VReQ0l1dVPBxvLn5+Hj4+Ht7eP69M1cdnlnZ2dnYGJsbG1neHxyc2RjZmR/eGV+cHdKVV5PU1BbW1bUdXpkc1vGxV9CSVPK/uX13F1Q3dZUdXlzRFJSTX9ldVTWVVNQXNHe2cfWVdrC/efh7O/s7O3g4Obk+PXNy/Xy+//3zs3Z1FdS1tnSwNvCwMTMyM3L9MXM8PT28fbMwPTHwPHNxdrZUUV0ZWFtaWoVFBYWFBVraWJnS8PIyPX19PTa9fzdUlxIW1t1dXVbXEJMXVRT0t7I8/Pz9/f2zcT2/vb39NzT1UBxcnRLfnhyfHJBUdj09ff8+Obg7euU6uvr6JSU6eb/9cFX1d5RXlXQ2c3Jy97Iysn38ufj4eT49vfaRVlSQk92c3F+ZWVhbWJsaGxlfXBDR3BGU0XSx1dPSXF4fnhlZ2ZkZ2VL0ddX3MTA28/0z/b38Pv5ytFXQXZ2cUhH0djX0NLa2tzUxc/MyMr2/fv6+Pz3ysHB8/r+//Pw8/P0yMLWXFzbxsD3/f//5OTn4eH6/vv/98rJ9/DN0lHU1EVCW0R0eWVne3Z8YWJvaW5vbWBmZGR4dENT3tvZ3VZR2/XI21FdRF9QSU1bW0x2cXJ2TFzXUVNTUtLF2NvDx1TU38vx9/bE01x0SEpITnZ0QtzP9/H2//rn4O/q6Onv7OLm/M7TUUt2c39yd3ZLWk1HXVXewvLn4eHh4ezu4eT6/vH0ysRQSnlhYGBvbm5vbG1tbWJnYGJjZHFLQ3ZwdXNwSk5KdHdKRkddXU5FUVFW18HbxcHC983eUVxHSkFBSXJzR0VcWUh0cXdMT1ne01JHVMn98Pz/+/v8//rh4+Hk//zxw95X1ddZW1TZwffw8fL19vXYwMRUVkVEXFxBRUFIT0TQxd3e0lFHdEFKS3R8fnpkYGBtYWBhZHt2dUdeUVTZV1TfVVdbS3d2f2Vken1kZnhwdV/c0tvQ1M3CzfD2zcTU38TYUddZfXJyd0BMdEh2TFpV0Nbf2PTx5Obl5efg5/rk5Pj0x8bWV17U2dTd39bWV1HS1tz08/Xw5OPj4Obk/srKzNZdSnN6bGgVFBYWFxQVFWxhZ3JOQ15TxPTx9vf19Pbf0FdQ1UFLdnVNT0xYX1ZWx/H0xtPTUUd2cnFxdnF1TEBGQV/T1FdXUNjK9PP59svH08HM28DI9P/6/Pz7+uXw8/nKzcDZ39vBxcbf1tbQxcTD9vL/+fr9/uXl+PL4/PHDVVlYXUZYSnF2dXd2fmBmZ2ZkZ2BmZmNjY2BnZWR9cUpWzvLw8/HI9/L98vL99vH0zd3S3VZGQ1JdUcfJ9fb398jLwNrW0lp/cXJ+dnNwdnd1Qtvw8/bx+Prk4+3plZXp4+Xw8PP10FxQR0ZASE9IWtbX0s32/eXl5ef68P/59/D2yPfw98fXUlx1fH95emBibWxtYmBkeHxySEZe3djGyPT2x9dQVFZRQ3B7YW1mZXxKS0TUxcXJ9Pb9/frn5uPm+PTC319GQUt1dHVLWlfUwPX8/fLx9fX1yttW1FdS3d7M983GwffK9ffy/vXI9/398M/D2Nfb9MnIwVTd3drE0ldX3dHe0tTRV1FRW3FmYmJiY2Bme2dkZnpzc099f0JMXNbXUl1cX9fM99jc0N3Az/bM18FRdVbQVk92dnt7eXN3Tk1MXdzE0NHBz8rwzPX29cH0/MVUVnVLXcbb0sjx+Prj6e7i+P/7/PfF0k1+YW5tZGdmfk/fz8vx//7k4OPv7ODg4fjG11t1SXRwe2FtFRcUaGlvZ2RneHJ0dUl2eXN9T1Xd119SVlVc2cve1lxBXlpVVVxaSnRwW9zS2sbYwfTI9vLIxNdEQk90cXhhYmFnZ311R13T2dPFzvP/5OPj4uno7uzj/8HdUUVIWl5FQlxeUcH28vLKyPTO3VNfWXZ4e3t7c0NPTlndxvTz8snE0t1fdXR8ZGNiYG9raGtsaWtiZHxKU9zK9/Lk5+T6/cRUV0x8cU9IdEBGQlJU1tLGyc7BwPXK3tBFSVxHQ1PSVVfHw8HJyd/ezN9XWdbXRkRQ2djGzMrx/vP2/f39/Pn5+/j89cj39dtX0ddSX9HY2vf9+f7n4OHg4OTzzd9eTn1jahcRExAWFGtuYWRyXd7M9P3z9fTw88rFxddRV0NDRUx5enlycUhS1s3z8vb08vHK9cHUXVt1ckxCcXBxdU1TxPP++fHFzv333VDX0dRV38r38f/k4eDg5uHn8MDZzMddSHJ3S3J7fkzVV1Tc0Nvx8Pjg7+7g5eT7+P/88MbYX1jVWXVKcX5/fHBweHpkYWRnbGsVamtsZn11VsH0//vi7+/v7ebl//Ta01JPdX9mYGBhZHlLXVld19jH9P7+//30y8PB0UdJcnJ8fX57d3B20/P65uLs7+3i7ef7+fP0wMRX1MXa29hUU9Dbx8vCxMRUVNbbz83a1VBR0czIysDHycj0zthQV1BCQEN0SnN7ZHhycn19d0pPQFvX3s7Oy/feXk90cH1/ent5f0ld09PRx/f64eLt5/v92tZTS3xnYGBne393SUN0SFfG9PTw8/by8/78//HExdnXU19d1cXe3trI+f3+5Pv5//DOxsDbUEFNSkJYXFRV1N/L//n7+vLz9MLbWkt+ZmNibWxjY2xpbmNlcnF0VsLBw/P8+OTl+v7/8/XKws7F19FfWF1HWU1wcXB+eH9lZWR+fXZDQVvU0tvK/Prm4OX8ycDaWXRwcnhkZHlzcXVFU9XJ/uHj4u/s5ubk8PXDV1tcf2ZgY2R+fXBxQdHP9/zg4O3j4eHy+vHJ9NzUR3Z+SnRlYGxhent4ZGNtbWNhZ2RhZnpxdX12SkJW9P/z/fvh4OTyxPXy+fVYWF3dV3NwWl11fHJ2SXd9dnVCQ3R0Skhzck5YWV3d2tjTwPH65+T48/XOxvf89M3H1VFdUVhJQkN1QlTbxd7CzNjZ1V5QWE5BWVhbXV9ZRV5TXtPJzszAwNvTVlFHSnZ5ZWdhZmdlZWV+eXl2Wl3TxdrF3MLw987C2lZbQXZKSHZ8ZXxKXlTd3tnJy830/P3x/fbN9vfK3VdHdnd0SUhxT0t8cHF2TUxNWlHXx/b75Prn5Pj5/v3Jy8jOy9Pf2FJJcHd1cnNJT05ZWNDN9v/98vL198rGwcNWd3V2c3lnZmFgZmFjYHh9cEBf0N7Q0djHwPby+/j++vz39MvA3URbRk1BTUlLS010f35yfHh4d1pU0dTT2sLz+fn6+ubn++Xl/MvMwsPAz9vXU1hFWl9YVtTWVNPMxtLV0dzcyfXNwMDf091XRE9KSEFe1d3O9M/H28baxMr39srKwVFcW19FTnVzcn5/e35/ZWZgYHp+cndA1tvAzvL+///8+uTm5P33wd9U1dfXUUdNQUZATXV3c3JzdE1c3t7cVkVGW1fX1V9T19fT1Nfe3NnA9//75eTk5Pj7+Pn7+v/29c7M2ddQRE10cXRycnV2c3N2SF7X2svMy/T29cPb0VJMT1lSU1RSQHd8fXBxSnVyfH58cn1zd05NRlTGzPb88vTAxcHNzc3a2Nzf0F5XV1NGTlnX11fXXUZLTlHYw/T39/T08fXB0Fdad3RCRURcXVpOS0BBR9XZ28bP9/Hw8v3/8vL65uHm5v7O0tVcWllFTXRwS1pfUVFSXkRW39Pd2dFYT0FfXFBXUVBZR05xeWZgYmxtYWdlfElNRtLL/eTj4uDn5Pr//fXG1l9CTFtdXlxPfn9zcXZ1TE1BRVBU0d/f09LaxM3MwM3G1tfexsfFx8HPwcbB39nfVl1ZW1bdxM7K2dXS3trCycPZV19EQEVBSElGWd3I8fP998/18PfOwszE0dfUUV5FT3J8eHp6enh+e2FgZmd6cklYX1xYV9/DycLH2sD09vL5//TA9fH29M7C0VNYR0t0cXh8cHRGWVDU1FVcV9DX1t709/X1yMff31VRXVxXV9zAwszS1sTL8f3l+vjz9PTMwtBHdH1/fHBJQEZOTkRc1FZX0NZXWVhHWF5aVtnNzM71ysPSUV5ASnN/e2VkZ3p+cExGWVfR28j8+/vwzMPY0t/BwcTe1tRXUVNaS3ZxfX1xSkZfX9LNz8DOwsbZ2Mbf19HR1VbT393cxcbF29vb3tzf3N7S1VRRX1vU3FfW2tjYxMfF1l9YWkZW1tLDx8fP98nCwNddREBHTVpTWUdYXVhbXF9eRkJKcX17eHt6fnxyfXFPW1xS397FycLOzcbNwMHM9/f38fbz//7/8snSXVlRXUJDS3V1SkVGRlxbWdTS2sDL9cvNycjQXkdCRkFNQ0dGRERHWlldUFDQxc738PP29MnB2NDW0dfb29Dc19fY3t3f2dHd1tfQ0d3T0tXW3dVSSXFxfH94ZWdmZX5+eHNId0hfVNfcw87L9vTKyPT1yPX2/P388vH28PfZ0FZBQUdMSXdIQUx1TEBGQExNWlLQ29vExsPB3t3d0NXV39zf3trBw8PMzcLA3tPTVFFbQFpFR0RJdURQ1tr38vz++uT6/fbFRnJ/emR7eHl+c0lGX9bX3MPCwc3M2tZdSXZzc3Z1TkFQ1N3Y3t/Gzs/JzsTG39VU1VbV0dfT2VFfQktMTUdBXFJT1N7Y11FRTExBW1/Rwcj09PTKwvb29fH8+P31xtjW09RbXlxbV1bdxsDL8PfB2txQWE11dnF0cHJ3Q0FS1VBfRUZfUdbYwvXz9PTxyczMxd3SV1lPSEBMSkFCTltX1NPYzMvK9/fbU0F2fnplZ2d7fHN0Ut/YwsjGxsrN2sXY0lTUV1ZSVNbSx8/O8f/98/P//vzy98XWUkBPQEZEW11QV1lfUlpFXkFYV9dUV9fVRk1fRkJYU9DN8/r65eX48/32zM/B0FNNcX9yd3VMRFlcVlRUVl1W11xbW0B0cnh6ZXt5cnZJQV/e29fW19Td2MPL8P798fDwzt3WVkRMTUJISkxPWtfd2sLPyM3AzsDCzcTb29PUVFFeRkxFU11V2N7d01RASnRzcHJ0S0XYxcbIyM/CyfT08/7++frl5OTl//fB2t1XREJ1dHRxT0NGR3V3cnpkZGRhZmZnZX5zfH5xdEPU9P7l5+fl+fnzwN1TQUFbXl3R3cfM9PH29vfD39fc0FTXVFZQUlJHSXVzc3J/c3d0dnF0d3RLSEJZ1dvHy/Ly9PT2yNrD9/P85eTl4ePh5uf78snb0FZcWURGXlleUV9DdXB2dXF0SXdKSUhLT3dwcnp+cHVWVVXQUV1QXEVYUdHbxsjJwvTK2t/a11ZdQUFAUt/F9PL8/fXD10R3eWdgYWFnfXF2dnVKSkJc083y+Pj65f/3z9lU193Hwsz1zvT9/f7+/MvH31FSUFxBT1LR3cXfV1tBQU5CU93YwMrw9s/bXnR+en12QFlHUFFSWF5WUdfX1tDW3lVYXVJYXV5AT3V3dndCX9fFzsPExd/Q0FBbR0xJSk1aXEB2fWdkZWV9SlvRx8jy8c3CyPT19fTJyc7AzvH7+vr7//D198r19MvOw8bTRE53c3xyd3Z1Rl9U0tnSVkZMSUBcV9HZwcXT39HU39nDwM/Kw8z08v3+5fnx219PfGdjYHt9c3VCT0tJQEFAREFCSUpKcX1/Z2JvbWZ6c3VY2c738vrl+uTl5fr///bI8f764eLh5PPP31ZZR0Zc0NXX0VJaTXNzd3dxcnZCR0BcVV1fWEVW0sb08f399c719MrLwsHB31JS19nGwvHy9s3TXU1wf35ydU9MWlhaXVJSXkdAT0pDREdZQXRxcnlkent4fnNIT0BR19738/L////++eXm4eHh+v/010RNdHRNWNfT3djf38HD2tneU0FNT0RHTE91TExOQ1tYXt3H2MTI9MjD9cLSVVBFRV3RzfTx8vDz8cnA2VfRwsbZ2d3VUVtRVF1Ad3J9eXl9cnx8f3Jxcnx+ZWV5eXFYVNDZwPb39Mr09/D85OPt4Obl/PfdXkN0d3VLQ0ZBRkVEX9HaxdBXVF1dXERAQE9ITE9NTk5DXNbE9PLl+v/4+/P32tHdVtHb2MTY0dXVWkFaRF9W1tjGxM/B3dreWElxc31/fXZ2cUhKTkxKTkRCSEZT1N/aw8XFzcbY2N7bzvL5+fj6+P79yd7XXXR8dkp0SUxBQkxaXkZOSEhMWVhbWURFSHRITkxDT1vXxMr9/vz5/PL+98rKyc3N28TC2trb0NRfRkF1dUBZUt7Y38HDxtVAQ0p3cXR2cHRJTE1MQUhJWkVf3fTz8/Hz8crL31JX1tLZw8nIyPXx9c3B3dZcRF5SV1NdQU9HWVhBT3VKTURAT0ZDSHROX15GT0tLQlLR28DExMb19cTc2s3F08fI9/HIxMXeVERNQ0xOWNfFzcPNycDVU1VU1F9HQ3d2fXxyc3N8cXR3TVHf09r09fH998zAz/Xx8Pz98vn7//Ly8c3Z0FTQ0N5WW0VLdH15ZWd6eXByfXJ9cXZ0R1HRVFBQ0cfMys/Lzc/0wdPW19Dc3t/excP1w8fB39ZfR0NPTEBeRVpX0NRDdUpPRF9BSkJNS0JFR0x3cXdxS1pX28LByf3l+ffK8PHw//v5+P/9/v33y8PY0FHV3Nre1V9T1VxNSnZwfXN0cH9wfXJwdUlDX1xeXdvNz/b2yvf1zdNSX1FdVNVZX9Dc0NDe2NbV1FFdV1BeXVlFVtHSRU5ARENBQkpOT3RKS013eX58eX1PWlXd0sT19cvEwfDy8Pvn5+fn5fjy8MnY39FSVt7cVVJR11ZfXFpHW0FORl5FRVxQWE1DQExIQFzU2cXGyvXNxN/WV1TX0tPV19LGwsff3tjQVlxV11NfWFtdUF1cQ3Z9eGVlZGVxdEpOTEJPdXR0dVtX1sDMzPX1yMjAxcjJycjK8f78/f3w8fTMw9BV1tZRVlNQ3NLUXUVHQHRLRV/WxsXY3tZRWkFFT0ZW3cXGw8POw8TExvXKzc/MwsbD2FRfVNZU1FJGQ0dBQEZeUdbR1VNbQnB7f31ydE1Icn18ZWRlZ2R8TFvUwc/L9cjJyfD98vDx8v38/PHKyvb39fXC39PZ3dHfx8TdUEZLcXJ9fEtd1trY3dbRUVpAT01HV8TY2sfax9jaw8rx8/D2/Pn+/vPKzvf0wN1UTH15cn58c3FxfH1/fHNwc3FF0dDWV1xNSXRzfX94fHVHVtPcwNrW28L38PXPz8POzs3M9Mv19MDA31TS0tbFyvTJ319BcXJxS0BT09zTXVJQX1NBdEtbVN/P9vfMx8XT0djHwcz19fT9/PHLyvDy/P313lRWX1lR1VlPdHF+ZX99f3N3RF9GT3V2cnN/e2VmZH59dEBTVVNR19bb9/Tw/vz65+fn+vj+98zG1kRTXUNbVdjQWF9Ednd1dkPV0tjd2dnV0cXWXlpBRFbR2MPC9M3bxsXfxdzTw/Tw/PLz8M3Az8bG3lZSU15Y1dFWTnFxfHJxdk5AUNTR19FTQEFMS3dxc3t6eXlyT0NLT0pDWF7R2s3z/Pnl5OT6/fT1zdnF19fSUNfTVFZEd05McXda1trExM/Owsna0tdBSUFGXFfV3NJU0ddU0VRdVNv18v/6+v/99sjKysPGxd7e29jWRU50fX9/fHJyd0JMQVhBTE12c3Nxcnh7fXRIWVXQ2tjc29/awM/x+fP/+/zy9vXLwdnR1FJQUkZBSk9GSUt2cXF3Rlbd19rCwc/J9MrA0UNGXlXfxMPc1t/c111XUlPYy/L85eXy9vX29vHIVFdUUF5GTHZ9fHx/eH12SkJGRV5cVl9CQk1OSHF4fnB1SktaU9XVVdfexMPw8/L++/j+8PT29/XO0lHW2NBZQFhfWlxaT0JIdUNBU1RX097W3vX0xFRZX13Q2lVf1VNfU15ZWVpd1tfK//z98PDz8fHy9tnS397eWVtbT0h2f31xf3lycE1ARl5BTENPd3N9e3h9cHBlcUVAWNXEwc73/fj85eX7+/3z/PnzzczPwtrc1kdYVlJUUlpBT3Zwd3VbXVhdXNPNwN3U1tTR0dnfVNHZ38XN2N3F09fbyfXIwvT1zPb2yc7NwNtVXll0cHd4eXdzfHNzSklEV1JAXkVJRE52cX1wc3t4fH5ySEbVwcXAysvz8v7+88r09cry9s729/b1w8DeVldUXlXTUl9eRVle0dNcW1NR1sbJxsfGztBT01RcRFtQXlBdXlte0dvK9vHx9vz/8vLw8fX1xdHSVlpJdndxc31zc3N2dkhxf3x4eHp5fH5/cnF5fnNzdE9T3Nj39vTw+eX4+vr88ffx9MrKzsHBw9jUUFRbTEVcU11cR0xGR0JBX1hZ0cbO8fD8/fH1x9zX1FdU0VTU1VNfU9na28H1z8fIx8bMxsPS2dhURFlcdXR2dk11S09MWEF3d0pzf3NzdEp2QnV0d354f3F3RFJUxNnP8/3///Lx9cHBxNjCzM329Pfxwtne01FSWlzXU1JQX1lCSkhJQFHQ2cr39ff1zsdRWF9RUVJdXV1ZXd3C9vfK8f3z/fH29vf19/32yNhXUVpLc3J2c31wSnVxfXl7e2V6eHt/eXp5d315f3J3TF/d3M309P/k5+f7//D1wMnJwcnI9/Dy8/Te01RaWlxGV9RbWEN1TkpwdEVT2cDJ/ffx8MzA2lRX3dHW2VfR0F/Rxcz1w8TOycvKzM32yPTwycDeUlxHdXZ0dnF3cXRITnVyfHFxcHZ3cHZ0cHN9fHJ+eXxxSV5QXN3K8P7l5fDIzMDCy/Dx/fj5+f/y8MFeRFNbRVxfUkVBWkJIdXdBUNbBy87w88/CwdzT1F9bW1FUR1pX0tvB9M3Ax/X3yPDw8PL9/PHz9s/SWUVGX0d3cH1ycHJ8e3pkZX5+eWV+f3p6ZXB2fH19dk9XU1LEzPz65Of4/v31yvHy8vny8PL08fXQW3R2dHd3d3R3dXdKQktbVd3P9/375Pv4/fT3zNjdVlFUW1tQU9zNxsHG093ax8Da2sDb0tzc299QUlxAXlRfREZEX1ZYWkFJSkpPS3Z3dn57eHpycXx7ZX9zcHZJXNfF9/bx8/bDz/XP9f38/PPz/fD3w9dZR05JSE5HWkdGQlpdVd719/Ty/vnz8PDN3tvQR09IfXJ2dVjSwM/By8rP9fLw9/bx/PHL9MLd291QVNZX1llNTE1Cd399cn9zcH9+emRlZmd4eXx0c3l9c3RLRlTN/OX7+Pr+9vD29/D9//3298vB2NNeTUNMd3Jzd0tOSXd1QFjVxsnw8Pz4/fz5/fDM2ddbdHFzcExF3MvO9M7HzsvI9crBz8fd3tLR1llfVFJW09RTX0VRVFNWR09HTEtKSHN/eGR7fnJxeHpnYGR5fXdb0M/08fLy8/D09Pbw/f3x98zP9sbX3NRX11hHTExBS3RNR1vUxc339fPy9PTKz/f1VkdMSnR9cndNXNbFwPf19/P2/f/9//3OwsXcxdxW1dPc2t3R1F1aT0lPSHZISHBzfnx/ZGRleHl8f3pkZmRkZXBPXN/A9ff28vz9//n9+Pv5/Pb99MDC3FRU1l1BSUJeTEJbQ0NZU9PazMjI9PH29PL2wsVeX1BERkBfVtTXx8/N98vI8Pf198He0UTV0Fhd1l3R2FfTVlTTWlvT1FzVWUVfdUpwen94ZH56Z2VkZmdmYXp6f0p3XN/e9/Hx++T65fnx8vf198vMyMDFw9nf3FPQ1V/Z3tLa3NbewcDAxsHOxcTE1FRFT0RCTkRYWVBeU9jD9PD/+fr7/vL0zsfb01JcVlHV1dfT1tBXX1xaTUxCSktxcHB+ZXp4entnZmRnentlfHNwcXF3WF3U9fPz+vrk5fLz8fXw9szKy8fG39XRXVdUR0fR0NTY0sbKxc/MzPfI9PH0wNrb2N5QRFZWVlh1WlZR1trL/fLLzsTc1EVT11ZGXdve0lfQ2NjD39zIxtNU19zWXUFJcHl4ZGdmYWNsYWRmZ2RleXtlenBIR1TI/OXk5fn+/PT19/fy8fXz8srP29zGxdJU2MbS08L29crK2s7C1tVV1ldHW9TXXkVaQEJNT0tb2N7N+eTl+P/298je2sbA2NHfx8fQUVFWV1XQ1FdRRkFcWVlESn94eWdnZ2FjbWFnZH55fH58cHROWdzYzPD9/v7/8MrPzszDzsva2sXZx1FX0NXTUNLf2sLM8f35/vD8y97Cx97a3tPEzdDaVUhEQEp3QFHTx8b0yvX02NJSWdHY2sfOwvbAUt9WUdXVV8XO3cXGVcXG0FJPfWR4emFhYGNjYWNjZmZkYWF6dk1F1N/P/fz//v7Mz/f198729PP338PF3snTV93MxcT32sz7//Hx9dLVUV5DSlpAXFdQw9VQ1nVKSdxb1/fe8Pvz/s7C21ZW1s/Qx/HOx9HWWkNYSkdU0FbX1VDe0FdXdE9ycmdnZG9hZmJmYGZkZWRmdHFP1VTZ9P7z8PzJy/b3w8LDw8jF0tRF0V5A1NPPwMzC2Mrw+Pn6/vf898zeUF1f01xXxd/CVU9eU15b0dLZ9vXz8c/JwNFSV9ja28v0xd7bV1xFW0NexdFRUs/AUsbfV1BacHlzZm1iYmBjbW1sYmxsYmZ5fHRd9fH18/Xx9MPN//7O9/v/8fT13V/Q0V3G88vE9fbIyvv9yvr8zs7+VErWSn1SX0bS3EpX1H9SwUfa/cv9+8rw8NDI9FbH8d7GzsvNXFzRSnXSTU3a1EFaxN5fXttddtBIZ3l4bmh+ZmlnZG1mZm1+SntZyF/L+93M89ba9szy/tj3+cbNxNbWQV/YV8blwN3xyc325/vP8OHx2OXDdFfTcnbGU3daRX5xX1vGyV3J+tPI+1LW81NW8Nvx+9fN8llT3lxfQ1Xy31f+X0zw2kRYwdp1d01kYmRtaWJhYm5gZxVteWZyRF3WxfDAVMLDRcH3zPD45/Px5cZV/FFxws3Hy/P93Nb7y1rl5NTx48Nbzcx2dtxHdNrAfXPURH7W/dZR5/hb8+RcRfnPdc7mwc/lxk3D3nFK305DzN1e09pTW9dXd1DNQ3ZZcmxlf2lpcHkVZ3VpaE51bEH2WFvlzHHf+Ul05/5f++7PzuDHTMj1c9Xlw9/k/9v65sX04/DJ5+fN9PBHQ8bXfVT0cH5RdWVW0nZV5N1e/8B1WcpJWf7J1uTgxc391kzH1nfY8F1E9tpP2/VOQM1BdsLFZndTY250fmtkdhUUfG0UfVxgcvzTTfL2c1LkU03j5lXn6NZR4cN5yf911u/1X+Pg1Ofu0s7u8NXn5EHe+ENz9Nh73v57ZPJdZ83lSFfu9Hz5/GZN5UR94PlI5eB0VuBRZPDBesL+fnf+TGH832xR9mFx83pgzX8USkgXZF0UFlpiEUFRa0nmfXPg3Gbw5XrR7sVZ6fl78ON5S+FCeuD7c/nrVsqU81Lr41vg6ETP7kBx5FBm8/RtSvBlfOVYeuTlds7mfXb8TWf083bK41db4PRJ/vZ70eZMcefXZPD3YETzen7yQmH1xWJ9XW5tR2YXZWYQYHdqb95MYcPKZdDlT3Xn8Ubg40Lz4l5G5tZk8PNxzOZTzen+V+HmU/vs1M3u9UTk9HvL/H9I8XFnytpnV/lNRufefvTDZVn2TFLg/lny5tXe4dtM//1PweRNRv5feFBSZ3bDSn/L0HlfX2JkX2Joc2QVYXNoaXZ+ZlDTf1j0WFv2yl/65FPF5NNM8cB9xf90RufGSOfiUcrtwNHj+tPl7MDC4cRL8/BwRPV0fsZQe9H0dV/+V3zB2n9Z80Jb4PFY+edc2uTUXeXyTM7kT0vyXWdNWGF2wXd9zdF/WtJkelNma3x+FWBwFWt9emNB3np18lx0/vla8OFX1//FdN7eeET+XHf++Ujx4FPb7f9Q5+zB9e7+XPjlRNLnUn3Dy3xJxkpzysV53/tyc/5Uesz6ddHmxELl5XLf51TW4vZ1/OR3W/B2Z9xWZ0bwcXD+UWBfxmRmWGQUZEhrFHhjF3tYbGXIX2XN/0HP7sJG5Ph80v59evLDcfTlRNDs/0rz7drN7vhf4e9VxuzHQOX6f1v8dH731mBf+31w/FRz9fd/W/9UTP76QcHjVHfzzXHy4t/d4f9MxftzePJRYlvxZ3vzWG1Fy2Vi0XMWeFEUF01jEGREbmD2UGfC5HdA7vB0+uBaWfpTY9v5f0rhxnjk403H6fZb7exb9pX0Q+LhQPXo1n748WVY+ndjzPdgdeTUf/H/ek/g0Xv+4XZA49hkzvp/1uzHSePtSVHiWXrPxWNz/3Fhystndfx0bEZKFW1GbxBkfxFrRnppXMhkdfradvvhRsXvxXLzymF2/lx9+edFwOn11+zsV8rv9t/j5t3I7fPU5/5LVvN1fthHZljPcULl9XXI/311+dVy8/ta2OfYcsfDdlj/xF7l5VLC+NVz00Jgd9NyecFfZFXMfH/TZWl8fBQVZGoRenZicMFLf87IdNjmwUz950fW/0lh19xnRvlVSOTm0Pvo9t/u4cTjlfDJ4/LG7O3UwOfXc9pQYnJXfXHy8UD1/XZ089B9zfxLU+b2Qvb1fUX/1EHk5Vb25tZT/9xnQMpzc/VRe1vZeVvOc2N0fxQVYRQWYWBpc1FkfcZDf9r3X8Xn0EL4/31O9HF6ycZ90ODb0uPh2/ru9/Tp5sTk4NfQ4/1V/vZwRMx9bHdwYkn3QUXm/3Tb/l5B8tp3x/1Z0eTWd8n0dNb43VHl/UPH+1VN91dl1MF7ed1KZlnRZX1XemtkZhAVf29oSkhmRvZDdfz3S9n+Rlj63nzdyX1K9VRzxPVZ9eLC3u3kzO2V++SV/lH458fJ4cZB/sF6R9ZnYlBXe1n2X1L9zHf05EN3z1F89PV5WvheZfbydMPmwVfl8XX1+kpM/MBy18Vmfsp2bVxEb2dLaBZnbBFhcBRi0Hxn9c503uXVdfPNS8HCfUf733DB/EHW4/FW4ODX+Or58ZXszOfgQN/tx3L880zR93d+0UplVcJ2ReT0Xvrg18Xg1X34/XfT51V15/J/2uFAWO3MePH2fF/zR3L31GRcUmF7zXhvXkJpeUprFXVkEWBGb2LZUHDz+1nH51Z189Z/UNB6dPFNZ8bAT9znVUXl8V/h6f36luNW4+Jc2ubfT/r/WMn5S3T1TWRQ0mVR+9RU5/lO2PJ0TPLQcfb2Tt3k1nbz8UXB/VhE88dz3/NNUMhBd99DZERFY2ZCeGh+fhRic2oXfX9pcs1CdfPMTvflWNLn33HIy3XdzUpe5cJb+/pO3OfDVuPj2efpx93i/3fX8k9Z/NlJ9MJ9XcxGftLUTf3y3PPmU0T7x1v55V/b4stC/vx3Xf7UfcTSe05Wcn7dUmRF0npw3XVkXXRhSkRhYkx4b317aGRFZmf33H/S83RH+8xO9vBzQshKZV9Ef1TKRNXw20D3/NDz4/bw6eH07+zcyuDNUPv/Xtrn1EL52nxTzXRC9tRJ39h2UfnHRuXh1cvhwFLn9Ur0+kZO9196Vt1kdsR7Z8xTe0fZdnHVfGd2cW5gd2NofnprZ0dlZsdCYlHwdFrh91jm7UfQ4UJ69MxzxuRGVvzZR/3zQM3l3sTi59r/5N7N4c1L8fNK1frYU/Pde9r6dU7/0HzFyU3059rA7+HA5ORUVPvNdcrxf3LFf2JFdGx7RmZl30Nm3vd4Q/BAZVNJYndEYWFGZW9PUGd/2HJn3dhzxOHE0eb5WMfEekr1dXzx9HtR+1lB5MB59OLcw+nl9ezmw+bj1dPm9UXz+0dc8Uly9VBhXtxnfMdNc/PlWfaV89Tg+kv14tFR+9d9VNhkc9ZmbURJY03YZUT2SXf3UWBLWWFmRmEVcHEUZERjZ1B6YfXUe8LjyMDo59b68HHW5U1O+dZ/zPF2UftbffXJd83g2cPu88vs5U735kPW4cFx9vV52ft1c/LRZcTwdNbgw8Xq7cjl41Pd4MlL8816dcRnY9R7FH52amfUZWTP3XPC/3JO8Epl2lhvclJvZld6Z1ZDYEDDckbzX1Hi+UP/5XpF/H1699RiU/x8W/tQfMnMcfTi3fGU5vyV6Mrk7cL27clf+8hkXP18fPRzbdveZk34QUXg8MTs5Fr95kHO7VdC5tZnzsNictZubN98bt3WZlfxe3DxcmPaT2lPWRViRmhrXXhqUt9jXPh1TeL8X+/vXPPsTnH60H7IwXpRznxI9XFlxlF/zv9b9+nOwez7VOf+0+DmV/v6dtLmTHfn0Hry8GXZ5EXe7/fO6P9d+/dwzP1J0PNze9Zxb3VyamV2a3nMenr8UXvwxX/K8Hpf8mR622ZtVXFpXdNsXsljTft3Wu/KUuLaf/1WbNPEYFz/ZELkd3L8Wn3l9Eji4FPh6Nr66FfG6ddH7Mh0+MVn9/Zm2/FhRPxlceBBcOz9XO7iQf7hedbiRtLvWn35d2/ZdhVdWGteyGNE/mRy/n5m90pp1FsUc9QUY95sbct/bftSbeX3ZOaVWuSXT1btfXnkWn77XGH53230wG/U/2fE6UjQlcZS6/Nw7fxg5OBw/OxzV+pcT+r0fOTae+TleeTrTv+VX83ocnHgQXDiX2HxWxRbQBZ3ThF+2m565Xlk5HBt5UZo9N5rW/VqdvNicvJkev98Y/xNYPr1eOHiffHkYU7wYXPkemD6SGHg3mb7+Hv270P5ldD9lvHH68tw48B44/9k/Phk9+dlx+Bkded6ZOJQe+n8ce3gcvbgZcDvcFHtS3n5dG3LSGvZQWpB2GNKxntx0WJhUWdmX35sXklvStp6dM5wd/FYcfDOWuTn3uHkdPT8ZVDxc0L0cHT2dHf3dH3LxXbK/F715trZ+t9S99dZ98vQ8crd+fnO/fzbyfTHw87E2Pjyyvj8283RdVvFd1vFdUTDQH9Hc2Z1dnh2cnxOU3R11kl0QXJ2TXR3QHV8WEBB01xC0NBMXt1OUMXV2/zx0cnRfVtDc0RfdUDe0VfdXNz2zMT08cPK/ff38MDP8crNycPPzN3R0sXDxNnAwtrPz9fexdnC9PXM8P7E0MfF383FU9rGVtbXTEpHWEBBdH1zc2VhZ2d7fnt8dnJzcnt/fX9zRVhCXdrN2dn1zPfy9vTz/sjf29FFRVdDTFFTW1BfTkJbXdfd19LY2NVWVlpS2c708vz8/fbK/fP78PXOyfDP8vzw8/35///wws7EWV1XWl9FQ0paUE13T3ByT01GTXR2cXllemd8d3RLR1XVRU9ISUl1WdBTXlfe1dzUUt7Mx9PHz9ZeQnRIRklPR0dFXFHU09Xbwff08czP9sVR0NRd1s709vnl8vL13tLb28XF0lfZ2VDO29v1/f3w/8HLxlfb2PT01sNR199D2VdM1FdWUl9DeH5mbGtpY2F6eHheSXNMfXl/c0Je2V3Sws3x2PH/9+TN9fTTwkRaVlpdVldfTFhaXUVHX9zGVFfbRE1Zd31wSlvfy/f+/vrh9fP+8ufx+fb0+cb0/sv38vj/8cvd29FNQV/GUtfTeFzRSnJHX05S10laRHF4ZmdhYmV4fExJWUNKdEd3dVTX19/0y1LBw9TTysTdwM1GQUNydnJDR0lbQUBbXdNe0MT99MHMwd9RWVZORlFeVMjw9Pb49M318PDz/PH09/XYx9Pawc3Y9P3H2MdUXNr1xcjw2l3aw1JWxcbdx9xcTHV9Zm1vb2xpYGFkZXt7YWR+eH9Y39DO+fDP/f/x/fj+/vjyzttVRENEREJeR0VBR0Z1WF5dwdNE11t3dkBxfndGddnLwfT//Pjm5OHp4ePt4eTn+/H3wcnx9cDH21dSQ1pRWFTQUEVaWXN2W0FJ19rUWNdCeXdzZmVlZXlycUhzZ39yZXl0QtXC9ffw8/zzwc30zsPFVFFTW052c3J1QHxDRllZ0dnRzvvx0sPWX9FdRUl2VMjUUcbDzcHG1cz+/fn4++b8//P02VbD3d3G09TdxdFWzvHH3s7aytFA0FHVyt3Rzt9ZSHR4YGBsbmJtZ2ZgYmJgaG1gbH1f3PP75OTt4uXl5vj68tnGy8HZWHBKdHZzdHBlcElKX1DTxtFWS0ZCTUhnZUJMXlHTzff2yP7l5Ofi4e3o4ePt+s3z8NDaVlhfX9RZRl/WVEda3Ed2RXFwWFJU28zE29ZfWVplYXxkZHZyYHp8YmNnZXp+TVPa8ubk//jk8PT49kdW3V5NQEZ+f3l7cXNC0UJO1MnG9/v22/XI0VxLd3RwWkJC3sHb38b39uXk4eHn4OTk5/vw9s7DR0BXWl3TWNfAxNTdxNTXVEVcX0/SwsHI/8LWzXRgYWdiaWRkY3hjYmBoYGlicn1X0vjh5+7s7+Dk/8vI9d7f3VPUTE9JeH12enFKSEpXz9v08N7C0HF3fXx4SnNx2V7Z9PXw9eDl+ZTk6pT+luTmlUWUZ8fBYvdj9WZfS9FH2ENfRnjAYcZl81vA+N7k0c1FfEpkZXtkfWR9fX1lemZgfmRyTVfFyOX88+LM/fZ0/nfQzWX4bsF2etdjxmfbdMdR/czh8v7h2Pp992BJcWRBZERLRthZ2M735fLh5Obn7OHg4vjlysVeQFR0Stdzz9Ja53L2UUP6b+Zy2PRU5lvk1/d8WGN0aHx6bWVq0xZzbWllaHBgfN9z8vzz4+Ht5uH//PXIwdtVRVtAT3hzek54dllx3l7O/FzN5WXJ0mn/bGD1FvBmf+lq7tXMkUOd8Onu5JD86OHs5frU/UhQd31IYdl89UpfS1pbTFhM2EfJ2Nvf8fDW1kZOQ2B1QBdQf2n2F39bF/oXcMkX62P/5meTdOvVxeB68HHFdlLcxGTGZNdPev9k5kHgzeXzwedH+3lSRWDHan19bMhlTNh3/sPZ7N3m79aW9vmUyOznXuPZfu9v9stjkWDK+GyVY13kFZd42ONqlWL0wmrsF0ZyEfEfcXwQ8B/NbWfMFPxhzsRT59jj/+L45OHT51r1wU7O0tJdc0hPZ1Jwd8Rx9Nd09VhI82zAXRXhFl5EEeBoVfhvkUDll3Ke3+yRcZ5O6pdlnmDhyheUEPxIbekR4Xp89mr+ZtLRX/NL8d/4XPLU1slmzW9If27BFEt+aPQX0XVq4BT5X2aXZpTb2et84XDOVE32Rf1G9HTCc3HZZfNw9PRx533lz3vjbMhxauET1n4V5hDndUPicOrR5OX748Lt+Ojw7v725HTkc8beQuJ7+MR44GjyWGzuauNdYZVr6XRI4Wv6Y0p7a3IUf2hmYX9he017WWX2SVb9VOrB4ONR7VjR5mf79H7rZ8v3bvZgc1dmS8h2dvN/3NJ5zk5kzHl59W/GVm3sf8XifZTwxJFBlO5OntLvlUGWRtT5RlPLTUT6etLFbtd/b/Rif+Zv/fdml3/SlGjjw2CUFtDPHeITfsce4BF0wBPsaVn9b5d85uF+l2ngx22WFezHZ5Zt+MVh+mRx/3r0y2buZNz6au9vW/MW6WlMwxfiFd/abZRo4vx4nGKU7VCeTJTrVpXFz+xP5uZ4lHvB+Bfoanj3EOtpTuAX6GlX5haXavP+F5YS9WQW8hvIamfBFuZuycZ4lGXq/9+SZpFZwu5ukWbl9njuFf53cPYX+mN182jsasLUa+EV53F05GXiZcDWd/Rm/kT99EzrSuLhVJLR6OtallT55ETm1c5Tz1530xXaZ2/CEcB+Yu1i9Ppm7F5Z71LO4lPQ8m1TRRPVbxXYFnJREdxCe+Fxx+119+Rk58h763df7GP422DnenXgetDweeb0Ye1Df+JtUudi+/hu4nRq6BR45hPkymiWYFyTbOjvd5/0w5xZ/pZz6uxgltdllRRc5B/hehfrFsX4EJR0YpZr8+cXk3R+lxD4Qx3hHXxHE/lqWl1m4WTjysmUdpbcRpZt7slkkG3b5xfvYGzvEctYaZRr9PZp72nH1G/nYvlfde5s5XFy4xTgQVrpb+zwSehd5e7V7+fS4830+N/x08BLWtJuXmJnQhHHYHDJaexZdepI5OdN6svV4ELXUXp9ZGVpcmcUUGtKTGjmZM38fZd91+Nk+tBx5llF/9RD90J0zXNZ91BV/f5D/vRx/ENk8Fhi9lhg9XRkynpmy3968ktC50D24t/h7Pvk7eT57eT37v116sVl+nthUWhsw29h+WZz7Xj27mDs/W3qU2fjb3zlEXdEFtlrbvMVR8ht4lRdkF74lnLk5WXpUn3vcVH5bdLNFtBIa/xjdOxq8eBu7U1+4mre/mj5RnLjY/T0ZuZkUvth51PY4HTp/PPsVJXcyO5J7NNc7XrZyG3DYm1WEUByY/Bh8PTR4tTu/tPpTubffeNmTVRrVWxqRRB+f2r0Y9T9ZOPXzuB359PB+HDmVM/KduB2Rvxl2Ndz5dRK4cBa+9Rd9H1H2mVz1H1BUGRXS2RdfEBxc/lfWOH39OLx5Orf5ZXU4ele7ed18sl9Q1ZmZ0JiZFRiefteceL/defxcv/eZP/QYMJabnBzFHx/FEVRY8DmT/zuVPPiU1TsT0PiTXbmTnb4c3nwdGPKQ2f0W3v523L7x3rEymFY/Gff/XnP+GZE+WRl5353633WlEDMlkXTlnPKl2b47Wn8ym7/dm72YWjwbWf9a8L8Z+ryw5dY4O174N1L52Tc12xYbGNmFUtuedNj8E5K73/y/XvuXk/idtn5cM7lTNLhSFficd/mfdv7T1zgUGXlcWPKZ3vPeFvbftRyYsFgY/h7XORG+Pfd49rl5l3o5duV9f7hVf/d1cl09HN78GJEQmz1Zl/leObBcuJxdPp8VvlKQ8hhZ9wVY1FpdttwRf/JQuf9fPr4TMnxXNfdzVpZ9XRc8XddR9BEYPFPYeDefOXSZdzRZEL/T0vtxXbmyWDPyW/Z4GXY7nFGlVZ8ldJll91l6thk7shh59hh51Rm8Vpg0Fhg09tw+M5W5MHCw0f810fhXHPCemR+YmdjfXZhWlRn1vZ8RP9QROXAcPjKfuXke/3odNvqWVPrQHrtVmbsz2nk2hf0VhfNw27y+mzD9W1ZUWFQznHc9k79zkzmX9vtTfrmUu3x0e7DXuPbQOVDcflyeMZlesN0c/REc8hRc8nRdvPV1f1+211s22Rn2WZBxmRU+X1R+H/F5XzH/nne+EjH+kDE51fa+l7S/3Bc1XL9cHDzYV3RY9JHZ83JSOf+duTJevbQfvDEecbAdsnNcMHPdfLwQfnf0eZ1/OVK5MNE81ZE9lt/wHV29nfV837Y8HBT9Fld+N1e/tV/119jct1mZMlzYdxHZVzdSkDP0UvDy1fJyfL11+X3XPn72c3lVlD2SHfXdGNKRm9xUGFB8ERS/tJP1dtLccvWfd7KXnHe9H1f/ldT/vjc+ez1wuf+TPfhZUXhdH300GVf02ZJ2GZ5w39mzVl79fJM2fjSX8dcSE1aRHZbz1p49Nhuz/9gRP9Ac+TydPL9S/Tlc1jnQXH4x3XAxX11WHB5c3Z5eXfVRVfj0EeV8X//+HNJ+kh75d5mysRtXflhUe1z1OvI1u3Pdvr2Y/fmYNDtZU7ieXHhZHjmfmfmcGPlRnPmRELhUXHw12TH3WfFVm301GrR0GtRzGPB+3/86HXWlUhx7l944v194Odl/eBtTeRmYfV/aNVObPTKY/vnZ/zlYtTnZlrnZ1LhZk7kZn32fVrj3PWR+sGUykLtTGT4SnrmUmf43m/awm5ayWh19G5y43Jl7ctl4+d4+8pk+M5m/fNhzf9jXfFpTvxuR5VxU+lcWP5xSfR6eeRPfuNUe+PWbeXEb/fYaVfHYdz1cfvkd+buZsbvZkDuZXbhd2T9QW5RUWpE5HvN60L36nBW7Htl40Rl7NBl40Nm59Fi5cxi+9xh+txm5/Bn+OZh0+VmQP97TPZhcvl7Yf94aMhwZubKcennfu3+ZPnIZvr5fOHkZvbkYd//ZlH1bkf2aXPxeXD2WHb9R3r+WWXl9mX053nc+mFY9WxF+HDe6fXE6v9a4N9m9thj9v9jRfRgTvdiW/BuRvhjfeZ/f+JbTutBdOlCZ+zwZOTzZ/n7Y8j6anXkaXvjcHzt0H7j1GL7VGrP/GBU5WFa42V17nBk7tBi5cJt/fln+OBk8exnROhyf+12ZeJLYeB1FPTRFVDyYFbic8TrSkLuTWfgymb6/GzK/m/D4GHW70h34th65c9m5/Bg++RvV+BkfeZ5ZOVLZ+RfbvHFFNHlbFzsfN/pclzuQHjj/Gfl52Pw52DY4WJP4npn4XZv/1Ft/Mls9eVvVu1hSe5/cu5bSO9dZvvEac3nYNDsdNfpUF/sXXrhz233+ml3+Wxl/2Bk4XBg4sFg5/pk/uZ+/e1k2+xhd+x2c+DUcuPbZ+XAaMvxFUXlbEnnZHDnfmTjVm3n82735GzZ42JT7GFN6Hlh7V1h7chm7/Rs5vsV9OBuVu9mXOhlceljYu1lauZFaebNbuX/bvjtYvbqZETvZHjtZWToQWHuymPj5GDn72P87m/A7ml37WNn4Hlm4k1g4t9o5fAVxvtq3+ZpUeJpTpV9c5bZcpXNYe/0buD8av3lad/lbkrgYHDsZWbscWjkXm/gw2Lj/2Hh5mPE4WdP4WRy7HN673Rt4tFj4f1n5ftszfwUTfprZON6fu58e5VccJf0e+36YfL4bcrmY9jtZV6VTkrvR3jnTW33SmraUxdSwGhd5WLd639E6HZ871Zx7dZ74MFj8vBh9+N81uN0dfh/Z/hNY+X1Yf3kZMblY0XkbXr4Znnhd2DnWWLnzWfg53vm8WPk02ngT2ztdnfuetPqYeHuY+vybe5hZ+kV2uYR7FpikWBQlBTj9xWWbXnrE8LAEetkZJRr5+xul9BhlGB1623B7WzV9G7e+WHP+mZV/mdw9X9y/Flx5PdI8/pwU+ZcfvXdZ1nzd3PxVGdGyX5x+/JzXeRFYN/9ZmL+yWxF79Vh4ZRAd5TuZ3XuUGrQ60Zt/ex9Y+XtfXjg52Fi+v5hYvbBam32wGhm5+Rlc+/if37h4XB84O90YMfnQGXO7dNmWOVSbXD8wGF++Pp0fvblRGXc51BgefTZZnj2/n1n0v5aesPi9HBH//R8e9/wRX1T8MR2UeXk0Vr85NJ/Xs5RcnXOyU530vVUQMX78NVXzvfVT1DERX9wWV9xd8T33V7b98BDTdPZ0V3Vx1B3StPcWUlSxFhzSdPEXkbN/drQz/HJ0dfNyFZERVZRdXdaVVh3d0ZZdFrX0VRFX1BYdHVYXVBAUdnR3sLz/vH2/fDH3trS0tbV3NDc1VXf2sfEwcfFV1jW1V51dUJ0c31KW0RYUN/T1sbB2d/byMjA3tvTXl3QVF9T11BYXFdV1VVUX0fX3FZR09reUVRRUF5eWkBDTEFeQVleV9Lb3lVU1FJHT0JBU1BcUdTW0sPMzs3BzcfY28Tc1dLWUlXd1FNU38POyvT3z8jIzNhUUUJ0dHVJTVhYU1JU0NRUVFNYU1RR1F5ZU1tYXFTT11JS1FXU29vS093Gx9rBwMbexcTWUlfTU0BfXERLSkJCdk5fRnRJR0N1dXVGQUFYWVxX0d/By/L//vzw987Dw87dXNzF3VXd2MbMzMvMwsfE2dHVX0x2cXZ8dE1YRklZVVFTUN7f38DPxt3e01ZRXdXT1t/d01fW2d1TWV1YRFBSVNfX0NRTUt3RVl9fXVhbUFNTXlNQXERHR0lNWUlKRVJYRkRQ0dXQx/XLy/Twyd/Z3FJFX9XQ0Nva3cXK8MvM9vPzyvbxzNZdXEJ0dERESktBRFtTUFpcUlRfXVFeQ0BCWl1X3tvb3d3e2sRW193X0N/b2MPDxNnQ3FBX1VdSXl5R1VpOWkRAcHJxfHh9cHZwTltHTUdfQFjd38Px+uX4+Pzz9M7cU19Wx8LHw/X29/TPysrG2sXf0tzVWkl3c3BJTHR1dE9cXUTUzcPYxcTA09VVU1xX3dvb29nQ1d/UWlhSU15ZXNfVUdTVXFNTU1xfVFdRVNdUXVVX0F1CSXdxcXB2SEJMW1pCRlpEWFPE9Mz0/PTH2MfSXkdU0t3N9Pbz//n58vP58Pf28fXE2dxfd3FKd3N9c3d2dkBNRlHV1dBXUV9GRltZVdDbxtnQ28bUUlTd2d/NysHfw8Ld19DUWExYWkJDXlBHT0dWRUhEdXx4e39/eXNDQ0JaUVBbXt3Y2vbl5f798vDM3NjQ19rMyM3K8v70yvL0xcXMwldbVddMdUJPSnROdHBLQXVLWNPZwcn39N7U1tHXVNPGwNVX09ddWlhbRVTS11TU11BeXVRURVzVWU9BVNRSVtbf0dLe1l5aRHN7fXdxdkZHS3VbU0dFUdfSx/X1zcHa19RV3c7x8Pb9/Pjk5Prw9vP9ys3A2tVbW11YRV9DcHN3THZ2dnV1SFHRVNXVRkVcVdve09zQ1t/DxlpWV13dz831xdHaUFhWUt3VWkB1T05AR0hGX1ddWlJGdXF8fXNKdUJCQUBPUNDR09TE9vX08f7x0VLYwNnL/8/O8fnw9PH/9sbO8MHRV19EdnBOUl9NQFtZdElbX0FFV9TX38neV9PIxd/Nz9pW0MReT15WQHRH19FXUN1WQ0JCV1dX3NxXVNhPRdNVxFhdzcdUUNZad311QXRyd1lEenZcQURKXcXdyszMWnbWV97+5Pbz/uX/8Pvg/PDl5P7389teVEhfWHFPQ3FzfXRxc3NfQ3J7TFVASlJXd1L0zlDT9P7OWFVXU1LBy9bxysDleEr9w3BL9szCxnB5XkZ1cE9H01l10l9ycllHS3pb219bcXZRV9/VR13bwtne9MrV0dvw/NPC/vXJ5OX7/PHwwdv39F1K11TXdUndX09eUNFNT1hcW0Nd0VZdXlVWQtTaVl7FyVHXU9XUdEbRUUPCUUBbUttWd1zFVF/Y9d1aXFRVSEdbVlHUVlBRRFzcS3HXWEZNcUxDdnJfWXXaxdVTVdfWUcLbyv745OT64e3g5ubm/fDz883Txs/QRVfTSHBOQndxTVlPdUJOU0B1dXJ1dnNLTNXS0tPb393XX93W1tnM8djExt3FVlFFQFhY1FxbWVFERUxKSXJzdX1zT0NLdHd1RkZMRXVARlhUU1NYU9JdUlff1FPayfT//v/5++fj4eTl+Pn19Mjf39dW0V9U3VNdTljS2sBWXF7T21xaQF1HZXJPTUpNUVx2dVxQSUBd3cXC9crW1NPE0FheVNBaXlfA0MXAycNYVURPSUBfQEdCWkl2SnR9fXNKTnF2TEhaWEl1dUZOckHW3dX35uf75+zm5uHj4+P/+Pf00NX20dTS0dpJe1nRXlPc0FpG111MTHdDfGdkcXNzSVlCR/TGWV3K2vX44+T+9sD0zNvQx95PSH9yQc5VUdbQw9h+d1F1c3RWTnJ3e3NwRtVMV0R3V1xHUEHUdFBZfHd0ddH7+/nh4+X5xvrm//Hb9MnXU19RVkZMzNBCR3bCUUXFzdLG2dpEd19ETUddQEJ2ckBNfHR3Xn1wWV/3+cL+0s303FZz0nV28dD72PnFSvDL/c/0y8Ba9NpdWEzXT3V2ZXhDZkpGdl12Uk99WHFKeGRydFfDy/Lm5/jn5v3+++X98/f4/f1cTVBb2Ux3eX9GdlJbRFZF1UFBWHB6QkNzVXdFWEBMTVZWW1lSWMH+5+T84Pj08N3T9dLYycXPwt9R1lRT31nTUUJGc0dCcUh0THV3TnR1S0VSW0LWQ01XX19eTEhOQl3A9vb+/Ofn+f7l+uT//Pb658fTX1bfx9LfX1LVX9PQ2dDb0lRYRVhwfn5+eXxJcHNMSkZISEt2cETYx8j08fHHxPXEwNDR9PTAxd7JyNFUxPFQ0VdSVExeSEFye3l8eXxlfHR2fXVFTXRwRk90dEtxSkPUxsTK//zz5efj5OTg+/jk5PDzwcPLwNzFxVxTVFDVXkrUQFxGXlRddElxcERBRUVeQFJR11lKWNPR0tn1//DIyMdU39HUU13WxdnWXdTeUVdRU3VOW11Pc09KcXZKdHVLcXNLS1/UXlJZRVpYX0J0dnZNUNDH9cj8+Pfy5OD65eTl/PH28cXd28HM0dbZUVtbX1DV0VPU2NRWUl9IdUlNTk5aQ0lGRkh1cU1PSkFU1dzaxsTGzMHS0sTb0tzNzMHH9PXAxcbTU1hHQHV3dHd9cHdwfGRkfHt5d090d3Z1TnJwdnZ0SFfSxPbl5Ofh7Onp7Ozs4+Dh4f/y9/bOwNnUV1NFTkhIQEFNR1JER0ZPdHVORVpMW1pZQUFaU0VZ0NXUUNjBxN/M9MxV0dBETV7RUllX2NvT19reWElMdXxzcnNxdHZNSU13dEFHWF1QUllERk1OdEp0SkJBWNLHxvH65Pvk4ef4/Pv7/fT8/PbE9PTfVtDYV1pc11JaUNzSVlfXU1xYU19ST3dBQE5LQEVHQltZWVlSUdbf28zMxN1VUdVSVtPZ0tzM9czF2sXXT0lMdXx7fXB8fnd0fXhwSHdwS0l3c3BxdnZwdEhBTVzb9Pz54e3t7O7i4ebg5eTl+PjO89rW3k1YUEhfS3FSREB1W1dCSEdTV1hSV1BaTFlfQ0JR1VBSVdLa39nPxdvH2NBcR1hHQUdbVtRS09jf39bVX0BOQ0NKdnZ1SU9JWFlaR05YWElPQ09yfHBzfGV9cXN0RN7w/eXm4ebn4+Hk+uTk+vrn5f/1yffB1NDXV19YUNHWWVbXUERMWVNFQEFMTnV2TUZ1SVteXFlQ39nQ2s3Ax9HX1FxdVtTW1dHe2dTdw93WVFVSTElERXVyck93cUNdWEtKTkN0fXBxcn9+c3FzfHxKW1jd8vv7+ubg5ubh4Ob75eXk+P/89MHS0dDVUFTUXVlTU1pNT0RASkNfX0NKRV1BT1JTRUFJXVZW1sXGxtndxd5RX1hbW1pQ0dfW09Ld0tPS1VFRU1JdX19YQnR1QFtRV9XXW0xARUJ2cnN9eHt+eWRkfHVEUcP28//75Ofn5Ofn+/nk5+b6/vjy9fTJwsHY2djQ1lRZWkB0S0NITUpxdHRMRk1CRVpAQktDV1DTxdrD29/E39bV19DU1dfFx9/Y3NDWV1RcQF5WUkVNTndyfXR1TkdfWURMd0p1cXF7e3l6f35/dU1f3trP9vDy5eXm4ODj5f/64Obl++X/zvT0wsbYwMXS119HQU9MdHVNT0xKTEdYW1JTWEZEQUJCR1nV39PR0tbUUVBTXVxERF5R197Bx99SV9NQWFtQ3tPUVVZZTkxEXVpFVFxYRkBFdXdzf3l4f3pkZX93TV/V2NrJ9/7l5Ofn5Pjl5+Hh4Obh5uT4/fHw8/Hz8cHXUF5MdXVLdHJ8c3Nxc3d1QEh3WllBdUFW1FFV0NDT0d/O2MXf0dZU28XEw8LE1lDRXEVDRFPVX0NPSHB/fXdIcHVPR0p3dUJ0fXx9c359d01PRFHf39zE9/Lz+eXl+vj+5Ofn5Ofk5fz9/cvJ9fD2z8La1FxYRkp2dkpNSklBXVpAR1dSTUVTV11T195QUFbQVFJeV9RaRV9VV1Tcz8/PxMDTW0dFXFJXVNRXXkVZRERCS05NQ19eSnV2dnx4eX1/ZXt0TUhPX9FS0cX28/X3/fzz/frn4eHh4uDg5uT49vf88svLxt9XRExKc3BzdnFwdktKdkJJQ0pMXlxHX19eWVxQVNZcXVfd0VTX2d3X2MzI9c/Z3lxGQ1JETUdHRU9AQE10dEpNTkRSXEtxdnZxc3F1SXZLXldfVtbd09DYyvTMy/D88fD45fv65Obm+vv588nK98rBwczFVVpHR0x0T0FBdElBRUxOWlZcSETc3EVeVNRYRV9XTXVPWlhJR1fW1tPG9PXP2NlbSEdQXkBHU9VaWl9QQnRAUURGX1JLcnZ0SXJ+cXZxdkxTWkVY099WUdnK3NDM8fb28vrn5+bj7eb++Pry9PTw9srPzcNUWF5ZRkJMWk52c0tBSkpbU0xC1d1ZQUXU1FhfVF1AQFLVX1pQ0tHV3vP9zd3eVUFPTUNLd3RdX0BDWVpNQV3fUkJJQnRzcEhwZGV2dUpJQ1ZWU9PO2t7ZwM7Nz/Dy9fTw5eTl5OH4/P////H18PLJxsPN3VJZVF1fRUBASnN0RkNIdUFZUVPV0VZZV9ZSRF9QR1hfXFBTWVNX19rPyMDfVNRTRnRPRkNPWFZbWVlTV11T3dBdTEBCSXRwfHh5eXF3dnFAXVTU38fF09HEw8HFyMzP9fnl5fr6+vn//PP39/H/8fTLyNrQVtXT1F5HXERDQERDSHRNQVpERkVZXFlcUlVTR1pTUlBeWFpaVtfY2sDZxMXaVF9ZRENORlNUUlNRVdbc0dVcWUZERk90c3B9cn13dnN2S0Je0MPG2cnLzs3Jz8fTx/X38Pjl+/v+5fv5/fH39s7D98jcVlXWUUdS0VBMWllbT0pAQ01PRlpUWkVYXltZXVhcXFxRWEFERl9EXdDe0d3a2FRFUVRFdUZSW0dHRdTUVlTR3Fxe11ZKd3VLeXp8SndwQ0dcX1fEycXZzffA3NjB3FbSz/H2/frk8vz65Pjw8/zxzsr39N7W3NBZUdHb3VFR0tNDSUBad3JD1VJCQFFZTkbV1kVNQ0N1cHdBRENH08Tf3sDOVVxW0FJHVtFRQ13R0F1d1ddSU1DcWXF8cnJ6ZXx0fX9wQ0FaXNvLxNr09sjc0NtSWNPw8vz64ePm5Obm+fP18vPJwffCU0VfVERHUdFeR1hSRk9NREh1TFzVWEdH1VdfXN7dUV5YWEt1TllYWVDZw8zawcTRUlpWU1hR1FpHXFdTU1hQ0VZRVtVGc3lyfHp8SkdPd0NTXlHd29Pb38TG1FBZW1tT2Pf08uTm5uTk5+T9yvTx9fTNz9tUXVdUVtfBx9VRUVFFREJPdU9aU1pOTUVcWUdb1VJPd0l0cnFPRUJe0MbH3tnY1lxeV9XZxcXE1NHS1F5HUdPVU11fT3N/eH57ZXBOTE5CU1REWdPQ1t/H3tHV09VW38HL+eXl4+Lg5uTn+fTz/PfHwcbYVFpcXFldU9fQXlpRXEBCQUZBQVtYTkhCQEREW9HWU1hZW092T15ZW93C3dXR3FZYRF9R1tzEx9nW1VReQUJTVlhBXkVKdnBwc3Z0RFBTXVTRVENd09DXU9DfV13R11bQwvfz/vrh4eT7+vnx9fL9yMLAx9JV3sTY3NLFxd/UV1dbTUBbWEJJWEl9c0tPd05CR1paWFlASnF0Wl/U3NjZ1VHX1FJW2cXFyff2w9PQ0FNaX9dZSEFBSnNyc3x8c3RCW1BWV1ZeWlpSUFzU3tde1NrY2cz3//n65+fn+Pzz/PDx9vbI2dfT0VHV3dHV19Pf1lZUXUZMRlddQE9ATHdHRURAQ9fe393RUF9DS0JGRlxUVF5MQkFOTkVd0dzZxsfF31ZQU1lbXFNDdHVCTU5CT01EU1RQV9zRVlJZW1bXVFBZUkdY1t3S3sny+Pv65fny9vfz//7y98/HxtrHx9rEwc7D0tjfVlhcWkp1T1tLc3FxfHNwdkpPRFFX1VdHQUxITltQ19bS3VdQ0tPW3tjN9M/My8DeVlBRWVtNSnR2cnZ3d3Z0T0hHR0dRUlhTUFfV29lVXVLX1tPYyPf08Pjl+v/y9sv1z/bz9sr1wsXe39Pe29nFxNre291RQEdHRkxIT0B0d0BNQllWU1FeUlJeUklKd0pJQ0VYREZBQE1AUNTX3M3198zA2N/UV9VXRklOTkJ1TkNeW1taX19dU1JfR13X0FpdUFhNTkdYXdTazMr3//j48fT19Mr09/bx9v3z8fT39vbOzsv3yMbQ0NVETU5CdnxwdHx+dkNHR0FHQk5AT0hxSkJNTUBYU19fUtTdVN/GwtvBy/H0xtnZ1EZBQEJ1dXVxfHBxSkt0SEFaRVtEU1ZW1drTV1zU0Vpc2svKyPX2yvD9/PTL9Mja2sDPwsfPw8nBxM/P297M8vDH3NLaV1pHRk5ITURMRV3U0NTRVVhNSnFxc3Z1dXRxcE9bdXRF0NRXVMLPwcv3ycbFxd5dX1xTWVZYXVhMWlJaTENfUENMUtFdWljVXExLQEhxRlDf3dPHzsfK9fb39/bx9MPNz/TIz/T+/fHw8vD19/zwwsfe2V9DT0t0cXBwdEtJQVJZW01HdHx5c3JzdnV1cE5FXVtUwfT1yMrx987Jy/TG2d3WXk1OWFxaSUBbQnV3dXd1TUZMRllTU1NVVFlBQUZaRFffws3NwfTwyM/28v3w8fDN2t7b1t3ZwcHbxMDNzvX198jAwMLcVkNCR0BNRF9TUFPR01RZRXdxc3BwfH1yfnh2SnVIXtPaxc3DzMnNwMzKzsPZ3NdSWVVRUFfX11FWX0dNWFhHWlxSXFhcXUd1dnR2dnREXVJR3cXMzcn38PL8/vv59czPyNvG9fTJy/f39fb98Pb09s7bVkdIdXRKdEhNTV1QWE9GQUp9fXFzeXlzdn5+d0BCTNfN9/X38//wz/T3ysbY399fRFteRUxFVVFbWEF0d01BREhY1dRcVtRRT3ZOQ0dMWdHE39PL8MzP9/399vD/8dva2t5QVtjCx9/EzsnNz/L49/by8cVeQVhCdklcUFfT3NtQXV1EdHFwdnxle3hlZHt8dHdP187H38Tx8djG8fHCwcPP3FPU0NTR3cTB3FVRXURFT1hbQ1lQWE5OTHV8eXN0cHRDVFRS0MzOyfb/+/v+/Pnzy8DLycLByvHLyPXz9vT9+v7xys7RRXV3SnBwdFpYX1hcRE9KSHVwfHJ0cn5+cnl5ck1eUNbJ9/TL9PD39cr29M3e0NBXWF1VV1RRUVJbSUJ2dnF3SERFXVNGR3d1dEtxTUxBX1Tc3N3b9fby/f75//bx9M/AxMHF3t3FwsPFw8j39fHy/vzxz95XRkdOQEVdVdTc0V1bR0NMdnFzc3hkZmFnZ3pydElDXtfQ1tPE2MLDzvf19M3b2cbGxMDPwsDdxN9SXEFIdHVLW19aS3R0dHJ2S3R1S0FEWkNS1NHGyPD45fr///3x9vX3y8rKz/T3yPfy8v3z8/z99cVRX0VId3RMTUlLQUNKS0xLSnRxd05xenpleHl9dUdc1tnFx8DNwsDFx8DLys3Y2tHU28Xb29vYVV9ZR0J0cXNwdUlaRUJCQVxSR1tWXERYUFJfUN3e3tvL8/3x9fP2zcDAx9jdxcTaxc/PzvX3/fz9//D0ztzc31BEXdVTWkVQUV5TX1pGSndxfmZhYWZkZH9KTUBfVdVV1NPf0NvI9Pb19PD0w8j0ysrJzcTT0NzURHR2cHJ/cnZ2cHB3T0p2TFhLcXVDWEFGVcHN9fz7+P/9//Lw8PL89s7L8PT28vD3yfTx9cfexd1TR0VbT3NxSnV3SlpZTkxdUlxaTXVyeHp4fXF3R1ZVVNnA29HU0tzZ2MHAxsDOzs3F2sff1NXS0FRXVllIdE5KdnF0Q0ZHQV5TXEFHXEdJTVJSWVbawMPCy/T1z8bByPTDzM7Cwcn39vb38/L88vD38fTIwNrT0dFcWFpcUF5eU1lHQUZOS3B4e2ZhYGR4f3xxQkdbWl9dXFXZxcD18fz7/vLz8vDJ9cvPxsDOxt1XQXV2c3J/cXZzcnFKdUh1dXZ2d3VNR1LV38709/Dz8vT29PD88vH38v/8//zz8fX0ycrJxcbDwN1UVFBHREdERURFQUBHW0BDQElxdnF8fH1xdnVCRkRQU1BT1VXV09fQ3cP09vX0ycHGw8fY2N3W09PVV1xETE5OdUlOTkh1S0JATXVPTEpLTFxRVdbCyMzGzvTOwc3L9vf19v388fLy8fTK8fH19ff2yszJ2tDW0ldTVFBTXUVPTnRzfH5+e2VlZXt6eHJ2d3FOQlpFQVbZ0tjM9M7J8vL88vzw8vDIy/P0w9vF01pGXFh2dnZKfXxyfXh4fnh/f3lzSnN0X8XH28jy9/Tw8v3w8v/7/f3++uX58fD9yMnLy9rHz8/c0NDR11BeXFVeW0ZaSHd0Qnd5fnN9ZXh8cHN3d3VMQUNcV19H1M3e0N7Lw9rL8vTO9/D1ycjNzcfYUFfTVV5UV0RCRU1xcnBxf31yc3JycHRKdExf0dRU2/H1z/Tw9vbw8vH28vL5+v72+fny9vL89MbIyt3WwcfUV1DUWVhBdHZJdnxyf2Vke2RkZXx9f3NKdHdNWl1FUMXMw8DA9/PwyvL/8fHw/Pb09Mnc0lFfXlxbT0JAQnR0cH55dn14fnJ+ZX52dkpZUNXRxs/28vzw//r58/3+8fD/+v3y+fj98vP29/TP3tjZ1FHVU1hbXEBKSklJSVhASnF2cnl5f3h8cH1zTkFISUVYRFbZxNPS2sfP9/T18PPw9fz+9MHMxFNW11BZWkVATVtAS3RLcXN2dHFycn56eXR3dVnWUlTEyvfK8f3+/fPz/vz0yvz+/P/l5fLw/fDPzsDc19ZZR1leTU9GT3RPXEJIQEZ3cnZxe3tzc35wT3VITUxKRFXV0Mz0wsf39M73/f798/Dw9vTA0t/TXkVTW0NOT0pKTEZJSU13cHVIcHx+f3h9d0hH0dnX2/T39fH//Pb9+P/8+fP38vn+//r68vTw9MPBxNVTUV5DTVtCd0heQUNSUERETXZ+f39lZXh7ZHxxcXN3d0pBUNPdwc7L9PPw8f77/P35+vLw8cHV09lQUNddQU1CTEtAQ3BwdHJ5cHd7YWVyeGV3T05f0NzH9vT38fz88vjk+Pz4+/j65Ofk5eX99/fJ2dvXWV9eTndCRkt2QlpMTFtFTHV2c31zf3t+fXl5dEF2cUFbRlDMys3L8fT18PDx8fPx9vP99MLF0VlW1lFFXl5DT0VcR01IdHZ1cn1xcXt6fHN9c05FX9TZx8j39vH//PPy+Pry8vjy9/zl+/77/MrAzMfQ3tZcX19HQF5URElfV0dNX1p3cHRwf3l6Z2V4e35LQndKWVdc0s/Owsn29PX39/by/fPy/vbHwcdXX9bcXVvU1VhaXEFOSHZ9c3F5enxzZGd5fmV+S0ZCV8PDyvz7/vrk+vvk5/j8+vv9++fk//L2wdHQU0ZFWUFFV1dbWl5DS0RcQk5HQnZ2dHB/e3t7fHZxdkVSRF/ay8fGy/bO9ffJw8LGwPbz98v0z91V119GWVdSXdTWWE1DT3d0SHZ2dXZ9cnF5e3J2cHBDXlDczPTx//r5++Tk/vv78c738fTw/v33y8DWU1NERlxU19LE311eUVZYV9dESENJc39+ZWZkemV+d3BxR1RQ1cHIx8X09s7PzdnR28LD9fL2yPfK0FXb3FDU2N/U1lBPdXZwc3Z0cnxwcnp6fnllfXZzdF/V18Lw/f7l5Ofg4+fl5Pj09/789Pf89sLY1kBPQUxOXFVdUNFQQkJfRktEXk53T3V9fHJ8eXxxcEtZWVjXx8LC8fP19fDK3NLWXVzU0t/DyMDGx9dbUNZQXtTZ0FBRUVpBRkt1QkJ1dEh3f3FJcXJIQklEVdDSxvT39vrn5eTl//b0yNrayMvD9PzO0dLQX1pR19TT2d7Ew9xV191QQUVSTXJyc3pkeHh7fHBwdERHQ1HZ38fx8/T19MVU0dnVUdnNz8r2ydjH2ldVx9Jc1dhQQF1Zd3BIdHx2S3J/c3B/fXRxfUhZTE7Vx9nC/Prk4O3m5+Dk/P399Mn09s3ExVVBTUBJSkVdQUDV39HS1l1W09VYXNVGdEhPdnZOT3VKQEZEUlRS1M/KyfT3w9/b3FpEUVlHVNvS0MTeVlDX113V0VZV3NBSUFVYSUVTTHVEWklOQ0p1T09xdkxLdVrV19v2+fjl5uTl5frxz/XLzMzO29DRUEBAX0VBWNfU0MzOxMTA29Pd0VhAWkZ0d3d8eXJyfn10THdKWVDVxM3Bzc7Nxcfa0FDW39PbzM3Ax8fG3tjYVFHX0VXVVltERkRMdU5KdEpJdUp1dHd3dXR3SEJGUdvI8f7l5uHg4OTl+/P29PXPxMXWXUdBSXZKdXRBV9fW0d7Y09/f1VFQUlhfX0BOTk9xcUJHQEZbXVTR2MXHxsbExdnQU19cXV9W093S0FRU0ddRWVNR1ddV0dbVUVbVUFBTUFdSW1tFQ05KcXB2dnF1QUVQ2Mz3/OXk5fr7/vH39PXLwsbb0tZTRVhaQ0BR09zEwcLPz8zE3dHUU1tcXkB0d3dzfX1wcHZ2SlhSXFfd2sXZ3N3T19TW1NzYxM/PzsLPw8Xe0NFX191XUdVWX15FR0NAREJORkx3d3RxcHBwc3x1W13XzMr3/OTm5ubh5Pj+8PTx9Mbe3NRYR0ZKc3dOTVpTVVbW0tzZ2NtWUlRcXldQQU1FQ0hJRUdAXVZV0tjf0NvF1lPW0UdGW1tHXNLX1tzT1NfWVlPVVFbV397X2drRV9HfUV3VVVBfWk5LdXN8fHx+dkRcUtfGzcjx/v/9/P/29PfKyPXP2trH0ldQUV5BXNfW3NrGwdjZxdre1FlaUkZITEpxfH1xcHFOQEdeVtPY3Nja0NVV19DXUFHVVFTdw8jFxMPE3dPS0VdQU1dXVVVdUl5AQUZBQkxDSHRKSXRwcXBxSVrV287K9fL4+fnk5P788vPKzMvA39DQV1tbQUlISkxBVlZT19Lc19LY0FNeUlBSWVtaT0tPTUVZUtTf2NrCw8HG2tzW1FBeWEFOdU9GRVxXVVZT0dDVVNVXUNXZ2tnEw8XR1VXX11dWUllHSEhOdHBzdktJR1TS09jByfT28PH09fTKw9ne2NzU0NLT19bXXVxW1dzEwsbEyczF2N3UUlNSRkJCdXNwd3ROR0VaU9fU1tjZ1VTX1VNQVVBZWUFHUNfU1d7F3trMxdTc3V9W2djW0d7RU1JQWFhcQ0pIS3FzSktxdkRFWtLb0sb38ffz/vLw/fL19/HH3NreVl5VVUVEXEJLWkVNXt3RUd3H1lfS015W0FBaW1tMTVFVU9bFxcbIw97AzttXUVdBTFpBdElNSHVNRkZd0dBU1N1RXVZTXdLPw9vCy8HFxd9V0N5TQEdGQkxBQEtOXlxcUFXW2MDE2MXCzcXAwNjAxt3U1tDQ0t3Y1ldUVVFSVNzAzc3Iy/XP39zXX1lZQnd3S05NQFtaXNVUVNVV0NTVV11fVdFRUVBTUdTUUdXYw8fFwtvd1F1aR1PV1dDS3t3YxFRYW0VNdHd2d05CTEJeUdTS2dzZzfXLzcn09Pf1yMvJz9nQ01RX0dNWXlNcR0NJdUNcXF/XxcPGwMDZ3d/TVVZTW1jX2dXUxMDZ0Nze3thVXl5ZQU9HRUJOQ0RDTkNaWVHVUFfQ0V5aXFxW2cbBzfXLyfb1xNrZUUNDWkNCRFtPTVhEWlFWXVfZ3VHU2tNV0N3SxcPc0NrE39rJztPW3VVSWV1X09vexM/0z8bO2tVXUVhDQUJOQ19YQFBXREZcV1fXVVxeVldbX9ZTXdTQVl3c2t7YxdzX3tFHQVxZRlHZ2d/Fx9Ld3lRcXkBxc05NSkhfXltXVl3Xx9jTxszExcrIxsDDxdvG39bT2tJW3dhXWFtNcXdOSU5R0FfeyM7GyvfG39nQUlTT1FHS2tPRxdlQVNzVXVFRR01FT3VCRnR0Qk9LRVZRVNbWVFZUX1zX3NbdzM7J9fHKw/XP09fQWkhEREhIRVtOT0BNQ1BXXl3VVVxS3t3U28Hf08HDxs3D2NvAx9ZXUFtFUlFU3trb2MfPwMDN2tVTV1lEXFtAR1FfTVlRWVtXV19X1FNYUVNbXtRRRl/UVFbd293exd1TUFZYW1FVV9PZ3NzF29HW01dGR15ET01GQUVYR1pfXl1V3NzR3cTFxM3Mw8DE3tDf2dPR0tfU0tNQXllHTUJfWVtU0NHQxMzGxdrY1tPY09fQ1NXW3NPV191VXlZWXkRaW1lfWVtATU11SUdBQFtW1dTV1tfU3NLT2NnS3cbDw8/Jw9nE2VZRUUdIQlpMSENEQkxZXlpdX0RZ0tnewMrYUdzG09ba2dfS3tzfxd9SV9nc0dzcVVfd39LFzdxT09lRUNdRW0VaWl9UUkFR3FVS1NVYWlJUUFXQX0BcUkZbVVJaVtnT1N7YV9LM31Xd3FFc0N9WVdjUW9TTXUVeQUtMWUFIWF9PW9dWX1XQ1t7I9cn39sXUxsHWVNdRW1HTVVfT1UdT2FRaV9BfXd/Z1dzC1lPaxVdVxdxS1dvfVdnF19LH1FlX1UVb0NdHRVVFdEBGSkxEQEdU3dVX28fd28zfV93TXFPe3lDSzNLRz8NQXVxDQkVaS3VcXU5EV0RCXtVU0Mv3wMP1x93B2F5ZVFBe1N1VVMfC3NjG2dHR111R3txX1dJU1d3WXV3WUV7W3VfXxsbR0t7XUFFWW1fZUUZaU0VCXlJBQlFTW1bWUNTCzN7cx95QUFBGWdfUUlTEx9ja29VYXkROQkBMRFxZTUdRUl3R2sDK8/bNzvXD29/VW0VfR0FeUFJR2drU3MPcUlDXUFDR1lPUxNxU0tPW39zd0NnOwd/E29fU1tVcXVBTVlFdRlpfT0xFR0RFRUNGXVXX0dnZ0Nzc1ldXVFbV39/cz8jG2MTE1FFcTUhOTUxNQExMQ0deXNLBw8/Nyc3Awsfd19RSWFpGRVbV1d/e2Mfc0VRS1NbU1VDW3dDQ3NDR39Hd3dXQ29/W1NHWV11TUlPX1lVUVldXXF9dWF9RW1pYRVpc1dHV09nRV9VXXVZVV1HV3NjexdjZ2d3VWVpFQ0JEWkBARUVHW1LUx87MwM7Jw8PB2tzR1F5BRERHWFJQUFXW1FBWVFDQ2dHR2Nrf2cfA2tvE0dXd39LS3dRXVNRWW1bVUVXXVllfXVtaUlNZWFJEQ1tHRF9SVFfU3dbRxd7R09zQ1Nzb2NjA2dbS0VhFWFtGRFlGT0BAT0NSV1ffxd/TxcDFxczE09zTUF5TU1lfUl1cVlVcVtDd19HZ3dDZxd7b2tPW0NLU1N/d1tPRUFNQXVtT0dbV0NNTUFRQXVxQXVtSU0RDREFAWFNTUFTR1NDE29Pf3NfQ3d3d0FVSXlNQWV5QXVPVUV9bRVtDW1TV1tzf0N3YxcfHxdzQ3NVbWV9FRFtYWVldUFNT1NbW3NjZ2sPAwcfa3dPf3dfc2tPW09ZWUFdUV1fUUFxTXl9SVlFdVlFSXF1ZQEJNSEJdUVDR397FxsPBwcTZ2drE3NDXXVlYU1JaXl5FWl5eRVpYRFtcUlPV1FZX1NLZxsLBx9vf1tRUU15aWV1RV1dU1dbQ3dvF3tjb0tDc2t/c2dLQ0tLQ0NZUV1BcX1FVV1JdUVdV19bV1dHd1tFVXkRDTE9GXlxRV1ZV3MfHx8PE2Njf09RVXUVGWkVYXl9fXFTX1VVUXFtRV1JW09BU0dzS3sPD2Nnc0VddX0ZGRVtaRVNRU1FUVdbY2NzHxN/bwcba28Xb39/f09vB0tRVVFxYXltAQ1hFW9VVV9Db3FTX0FBGQU11RlNT1NLe3cTJzsXCy8TYxtnQ1lReQkBGTE9YW0FSVV1ZXl5HRVxHQlbXXFHQ0t7Bzc3Hx9jd39xWUdDVXFxWVFfU01Fd11de1dJXVNPTVdTY01Tfxd3cwd9XVlRWXVZVXlhXUFxV3dzZw8Lb3tnXWVtaTElBRV/V19TcwcDe28PE0tnZ1tVRRU1OTElPX9RSUd3UU9TWUl1UUVpc0tVd093X3cHHxMTb01TUVF5cVF9EXFZeWVHVU1bf11Tf0lTR3NfW28fY2cDA2sHH0NXWVFtaUV1BWVFERFfVVt3B29/G21FeUUVNXFdTVdnc1t7Ax9nCyd7cxNFeUlNHSUJBT0BcRUdWVV5d0FFbX1FYWlFUX1Hc0NLO9M7DzcHc0NBQUtDXWF5UWUNaUlhe0dxX1NdaRlZWU9Xf2N3YxtrexsfX0dnXVlRUWUVTUURe0dTQws/Hw8fc1VJcWltU1VxfVlNR19jbxc/C09fTWEZdXERFXF1YWFpGWldRWVLR119dV1xYUlFTV9/FwPf0xsTH2dVTUFBdUVxBQ0JMQkRSUdfYxNRYUlxcVtfR3sfH2dnExsTGwd3W3dnRUl9ZRVteRUXX3tPS29re3N1XXF1RUFJQWEVQ09DSzfXOwsPcUFXUXV9TUkVbW090TEVCQFxTXlZVWUZdUVtc19ZUx/fJw8vIxMXb1FJV011aUltMRVZYWNTdVlLXXExYVFlY09nR1N3VV8TJxdrIw9PY2FBbVtVbRdVUX97G0dTbwt/d2tVYVNFbRFNdRlPQ0d7P9dLV2t1R0dJdWFXVRUBBSndBWE1F1NVfXlxFRlNVWFLe09HEz9rby8zS0t7VX9VVWltVV0dZUV9fVVRaW9RRWlxWWVnT0lFX09bXx8rPzfXO3dPSVlNUVF1Q3NNQVNRW18bF0tPcVFpcUFhf1lFFUNDS3MTH0dfH29XQ01ZWV11BRl9HSkxeWl7VUEVEXVNfUtZVV97TVNbf2sfF2dDX0tFdUldTUlVRUFZWUFlYUlNQ11BaXVVUV1RUVlXd39PEycPaxdnXVdHRUVbQ0FXX1V5eVdPU0Nre1tDRU1DQ0FBR1tbR09zS3cXa09DS11BVVURDRUdGRUdMQ11ZTUZYWkZeU1LX2dPX1tHV1sPA3MfP29be2tHS29ZeV9hUWl1bTUdTXUFaXURaUFBbUtBUVt3HxcTOz9zYwsTe2cfaxcPc1NLSV1HX1FDV11xFWVJYXVZfWVfS1VbT3tLexdNX0tvWV9BUXFHUU1lU1F5aWFpARFxFQ1/XUV1XXkFbV1ZT0N7c097WVt3Y1lbR3dHc2NBWVdZUUVZQXl1VXVtX1VFV1tfQ2sXR19zdV9DZ1tTYxd3Q0NRR1N9VV9ndVtTd1lfQ2VRT0t7W3dnW197F0lfW119QVFlFWERDR1hZX1ZQQUJFRURZWFhQV1VTUNZQWlbW1N3E29zd3t3fw9tV0Nrf0dLc1F1eX0dBW1pDR1hZUtXUVtfe2dzExd7bxsTbxMbF3t/f0dbQ1tXR09PS0VdfVldbRVBWUlNWVVXS09Hd3dPV1NDVUVdV1FZRUlJXUF9fUVZfXVZTU19YWFlbWlheWUREWlxSUVBQ1NbT3dPbxNva2sXBx9vf0tRUU0dFWltdUtXW1N3Y2dzd097b2N3c2djQUVRUUNXUV9Xc3t3c2NLW0tLWV1RX19LWV9fe3tfQ2N3V1FVfXldXXVNSWltfRk9BREVYV9RdUdddQUReWlhSUlhS09RQ19RSVNzd3drD2t/Gx9zFzsXU19FTW0dNdUhERF/U0NXT3FRU3sTFxszDxMDG11NUVF1W1tZV3MTf0Nzd0dzcVlxUVF5bUFBSV9HQ097e1VBQXFLU3dPW09BWX0VBQVxSXNXd11ZQWUNBRVpFWltaWVxYR15QXVJU1VRV0tHX3MTFxM3DxcbG0lBcXFhYXV1d1tLV1dRTUNHe29jYx9nQVF9cV1ZT1Nzc0tzb29/EwdzaxNPc2NdcUtfQ1tHe39jB3VdUUlpZUldfWVFfTkpLdUxaWllT1VFbREVBWFJcU1VUUFFXUl3U3NdX3d3X1tZWUdfZ3trG29vB21VfUltCQV9cWVTXUl9XVdTS2N7exsHc09RX1N/f0N/a3tbW3NLR2dnS0t3WVFBdQUVU1VbQ3t/FwdnQ3dzVUNTWVtXWU1tbWVlcUF1cVtVZQ0BATUFeXl5SUVpHXlhYV9bVVdDd1lZWUFDX09PZx8HBwcbY0NPRU1leX1hdX0RYUVNfV9ZU1NBXXl5dU1Tc39/ex9vQ3cTG2sfAwcbMw93Q0VfU3NzQ38XZ3MXE39PTUV9dU11bRUBNQVhbW1lZWlleRE1EWVpaU9dXVddWUNTR0dLe3NzY29FSXFJcUlTV097e11fR0VZU1VNbX1xaRlhZXVXQVFHW09bU1VZQ1dLd2MPNx9ra3t3a29HU0tjZ2d7UXVJTU1fR0NLZ3NfQxcbb3tLQ0NDWV1fXVFbU1FBZXF9BQEFHWFJdWVxUVFtbXV9ZU1ZSVdDc09HRUF/V0NXU397S3dLR0d/cVFfR11VUUFlaWVNcXlJeWF9ZQENeUlHW38XawsHe28Xb2NvY3N3fxNvf3t/d393W3cXa3dLf3dDZ39fR3NdSUl1cXVXUXV1cRUBAQUlIRVNd19jTVNRXXlPT01BQ1tHQ3tnRVVdWUFbT1FXRVV9eUlBRVlFTV9PWUFdRXF1W1VddXVlFRVtYU9zf09rLy8DAxtvYw9rW09FVX1NVX1lV0FZU39LX0tLX1d/Z1tzH2tna2NHR39jd0t/WUVBeTElHRkNEV1RX0FReRkZBRFJdRkZSUFhd1FVSVlRV0MTb19LZ1tfb2NVX0tLW3tjR19zUXlNRWU5OT3F2QVle0cfaxczN39/Axdfd2tFUVVBbWVZXVt3a09/Cwdzcxdnd3tnW0cXd1NLQU1LW0VdU1lJER0dPQlJTXdbH2tbd3FBYX0dMQURNTFlZQFjU1V1Q1VfV0NNVVNDRVdPTVFTS3dbcxtrS39xWVlZaT0JGQ0Bf19Hezc7CwMXS09LVXF1UXUZAREJGU1fX39rY2cbB29jCwNvbxsHHw8bb2MTf0dLc1VFVU1tHRVpARF5eUtbXXkVHTUp1dXZ2Skh1TVtYUNPe39/bxN/f2t7dxcTd3dnZ39vH2NnE31RV1lNbRk90dnVOT0dV0t3Bwtjd3N1UV9VRXFZRW19VV1fSxcTFx8PExcLCx8HA2dnHxN/c29JR1NZTV9LVUFZRX0VZXkVY1dRV0NdcRkNMd3N3dnB1T0tDUlJc1dzQVdLcVdTY39zEwNvaw8Pf2MPE093cVNXRUVpbX0NLRkVBX9zb2cTG3NDQUUdZUVlHXlJZXdfT0cXPwcXNw8XHyszHzMvCwcjB09vFVVDW0NXX3NZQVVVZRlhaRltXUF9TU0FJT3dydnVxcU9BQ1lUV1HQ3NbQ2Njf2MXZ28zKycPDxd3ZxdLV0dZWUVZeR0ZDS0tHXlHS3dbW3N/WUVxYRlpcX1LU1tfT3sTHyfXCwc/IycrIwcPOzMbF2NLVV1ZQ1dHS0tbXV1FWU1hEW15fXV1cUVFeQE9JdHV3dnVITERfXVxQ1VZTV1RV0N3d38TDyM7H2tzT09bW1tLT1tRWU1BTWURbWkVW1NXQ2d/Q1VVSWV5FQEVfUVfQ39zYwM3Bwc7Mws7JzM73yMfHxdDQ3dFV19PW0dve1tHf1F9SXVpGRkFCRV9BSUNBdXRPSnZ1SU5DXFxaUNReWFTQ19DY28TI9czAz83c2MTc09zf1dXd1FJQVERCWVtCWFZSVt/ZV1PVXUZEWUVa1dVW0sTZ09rP2sXK9cn38crO9s7c3NjUX1HVUFXc0dfYxdBU0dVaRFhBTkZbQEFfREhNRkt3Q0dKQllaRVJQRkZeWEZT11FU2MfexcjPx8HMxNrC2tbd2dVX28bd091XRVpaQlpXUFPW3tDV1VZbWllBR1JWXFfZ3NfT29jcxsHHzvTLz8jM3tnG39fS01NT1tbR28bY397RXVtET0tARkxCRENISUl0dUBAdU9aR0ZeXkdEWVpaVtDX08bG2cHLzszOzsLO9cHd0tNVVN3d0dbXX0daWkJHUF1bUdZWUlddR1lSXltWVFJU39DW3d7a2MHMyfX39c/MzMTa293V1dVSX11RVtDS19bQVFlbREFAWlhaRFlaTUxNQ0NEWUVGW15fWVlARkRDQ0VcXVbT2NnFxsPNwcbBwdrS0NZUVdHZ39/Z39RQXVBQUdXV0NHW1VVWUlBWXVlYXFlaUdRVV9Dc39/c28fMwcHCzsDEw8zE3tLWU15dXVHW0tDc3ddQXEZNR0RDTUVETUxAQEBGQENNTU9JQERBT0FeRFpR11fW29nZxszCzM/MwszC2tPQ1FNW0t7R0dzTUFBX1VfVV9XXVVJSVV1ZUFVdXlZXXlxU11TU2MXExs3AyPTPw8rM3d/G21XR3tZdUFFcXFRUVFdTW0deWkNEUltAWFJGQFlcW1hRX0ZDQkxBQExOR1lHWlTXV9PFwNjBzcPGxMfZ297XVdRWU9Xb39LZ21VTVNZVVNDQ0dTQ1NDTVFBVVltbV9VdUdLS193b2N/Z2MTGx8PCztjdxcHZ0t7a1lxW1FRTUVBRXFhHWkRDTERbQVpSUV5QVVVfWV5ESHR1dUp1SEZZWlpS09bU3sDF2MbAxsXGwcLE2dPS0FTV3Nve2cfF19XW11xT1NHV1dTU09HXVNVeWlxWUl1Q1tFX0N/c097HzcDCzMnA3NLFwN/bxsTT1VdXXFtaRUFJSk9DSU5NR0VeU9VWXdfTVF9cX1hNT01DT0xBWVtBX9bT1Nzawd7d2MXf39jFxdLS3txXV9PE29zaxdHV1VXUVNPYxdvZ2sDY1tbWUkVdV1ZcUdTVUlBU1NTV1NDY2d/YxN7R38Pb3N/F2tLX0dBXUlJSWkxMRk11Tl9UUVTexddV1tVaQ0ZFQnV1QEJ0dU9EQVtX1tXQ2MXY0N3GxtvEw8zG28XA2NHfxMXT0N7b1FJQ1FVR1cfZ0NjA3lJT1VVERFNVXF5W1lRQ0MTF09LHwtLWxcHc3sHD2NjBwtrT09LRU1tZREh0S0t3c0tbW1lV2Nve0lVXUV5bWlhNSUNAdXdNW1tZVdbQ09nc3d/c3Nre0dPax9PW3sfS0tze1NHU3NNWVtPb3dDC9MDZxMFWWFHQU0BZ1VFERl/UU1zRx9zU0sfWWlba29XYz8bdxc/B3drBx9JRUlNeTElCT0pKRlxd1NvA21VTWV9FQk5BQndxdXRycEZZQEbV3tVT0dre3cH1yNjfzsnQ1sPI3tHbxtbV2MXVUtfd0VbR2sXe39dUX1teX15ZX15aQUFHXNfc39vMwNzX397W08jLx9v19dvRx87f1NLfU0FHU0Bxd0NCd3VYUFtT3NJaQl5RRkJSV0dISE5IdExbW1tQ1NVXVNTX3cTCxMfCx93Q28fe2sLZV9Xa3ldR0tJWVtrNxN7DztxQ0dvUWVDQV1pYU0d0TFNRWFPd3lNfVNPU1sHIwtrN9M3Z2NraxNrc3d/TVVBTX0ZGWVxZRFzWVllYUllAT0RGdXRCdHh/S052SlJQQURU11Jd2M7H38/w9cfEz83d3szD09HE2FVV0tBVVdTW1tPQ1VRdXFfU19TXUVxdW0dbUlBZX9bQ19PE39fYy8nDy/D1zMr1zNvfwcVRX9TRW05EXkBLXtdfQl5XWUlGUl1ZXlJcWURGRk9KQ1pEQERfXlteUl1R0d/c2Nnf2MXeVFXa2tfR2t9VV9DTUF3TxtvW0sPG1VXa29HTxtrUUNPTWUdcUFJZW19aQUJEWEVc0sbHxsj09PT1zsLCwsfHx9vT0tzVXVbR1VNW0NdeRV9YQUNYXUBLT0F3fHNKdXRPW0RBW15fXl9X3NvEwsnKysrKy8zIy8/Awdjc0dDVXVfVUFLVVVNeWVpERVDX19fV0tFSWVFXUFLV1VJfVlFYWFHW0sPI9cr19MvIyMvJwNjY3NNWUlxBQkRSXl5U0VBfXVBcX1BQX15dXFxHQ0NGWl5TUFxbWUdCQ1lSVtTS39zZ3NLT0tHc2sbExcTZ0VVVVdDXVdTf3dfQ3tJX0dja0tjDxNZWVlJeX1ZSWURaR0x0SkJPQFPc28bOy8PDz8vKysvMwMfb0dfW1VZU19bT0NFXUV1dUtVSRVpeREhLdXZwd0tOT0RbWkZMTURZWdDYxcXNyMDFzPTOyfT39cvNxtLU1lXUV1NdUVxaRV5eX1JXV1Xd3NLV1VxdUVRdU1RQWkZaRkFYV1Xfwcr09MrGw87LzcjIwd3TUUVEXkRNR1tZX1ZQXV9WV1FUXV9RVF5HQENOQkFAQ1hWXlpFWkZFX1Nd193Z3dHU1djF29vDwsDGwdjS2NjT19DR1tTUUFfQ397Z2tnawMPe1tTUUFBSX19ZQUp3dnF3TkNHUtzbxMbAw8zIyMr09vXDxd1UV1RQXl1V19HR1tTUVlNXUVlEXF5ASkl1dnNwcXd1S05CQEdfU1ZU09rb3tvFx8DOysnKyvXOyMHb2trT1NHQ1VBRXVhYXVJXUFTR39/X0dzdUVXd01TU1FJATUZCQENbUtfQ3sfNx8DIyMLNysnH3t9WXVhFT0JbRFpdVF1S1dZQV9TQ19RVU11eW0FASHVKQkt3T1hET1tdXFpRVVVW0dnExtrHzczbxMPD2djF2NHYwdvS1tFXVVTVVNzY2NrCxtLS3dddUFBfRkFPSU5Kd0hATUZT09HfwvTIy/bx9cj1ys/Y2N3QUFlZUVhEUldSWFBRX1tSUllaW0ZAQ0JDSHV3d3F0dEhDW1tTVFfW09PQxMbAw/TLws71y8PNwsPZ3d7Z1tHW1FBfX15cXlDW3tPYwMLfxcDa0tfXUFhEWVpBTUZGQUZeUdXR28jKysv0zMXb2tLR1VdcWF5HR0dYRV5TVlHV0d/d0dPQ0VRXUlNaR0ZNd3F0dXR3TkJATEVZW0Rc1NHR3MDDxsTJy8zGz87BxMzLwNvZx9nc0dbXVVTR0tze2MbE2dDf3NZdW0BNSnVPT0t1Q0RaR1LR3NnP8PLx9vH0zcfDwdxWVNFWWFxRU1lZV1BeWlNXU1pYU11aRFpFQUlMS3dxdEtMT0xEXlhHX1ZWXVXYx9rC9fXNwvX0zMTDzcHfxcbZ1NTf01NfVNdQUt3a3NHbxtjS38XeVlheWUBITUBDTEFFW1lS1tLZx8j39MnDzMDd1NPSV1JRVFBeV9HXVdTS0FVU3N/RVlXUUkReUVtMTEFPcXFLS3FxSUBMSk9GRkFYVNDc2MPJyM7Oyc/NzMvPz87OwsXY29rdVNTS0lTV28bY09ja01BU0VFEQFpFTnVJT3V0Q1hERFHf397M8fDKyvfIxdLb2tzQ09/T11TT39ZU1dHUUVdXU19eUlxYRkVETkhISXVxd0tId3REWURPW1NfXlfGzc3P9/HOzcjJwdvDzcHF29rQ19DT1F1QV1BdU9Hf3NDS3tDXVdHTUFxcU1hBQkFFQ01HWVNSVNzb28H1y8LF2NjW0dLW1FTXVFBSVN3R1tDe29HQ3d/XVlVXUV9dU1lFQklPSUp0dHZ1S3R0dEhPSEBe193bw8/Kw8HDzMvCw8j3y8HMwsLa3tjc3NfV0dDd3d/Q0dJXUlBVV1hYUldYTENDQ0p1T0JGRFDSxcbAysvKy8PH28Hb3d/bx9FU1dfWUFHU0NFRVldUXVpYWVtBQ0dFWk9PTUNASU5OT01OTUNFRUZbU9Pd3cXJ98/Az8jP2sfCw9jS2NnZ0NHT19FUUlJR1lTU0dze1dXU3NJV0N/a0FBQU11BTUZbWERfVNLd0NvExN7R09Ld1NXT3dzVVl1dV1JR1dnZ19DZ2tFQ1dRWW0VfXFxEW15bQUtISnVxcXR1T05JQkBaW1LW2cLBwM/19Mr19Pb0w8PNycHZx8bb1FXS3dFX1tDT11FQXVJcW1xQVFBbWkVbTklDRkVBWlDT3N3Ay/XNx8HDwtvYxsDB0tPR1FZZUdXVVlbX1NVWXV5FWkZDQERbRkZYXFtNQkNAT3dKQ1pCT0VZXFhQ38bAwMvKysv19/XKzMTF2dve09DT39RV19PdV1NV3NBQ1dPQUFPQ0NZRU1ZSXFpYWFhFQFpdV9bQ0tjHxNnc3sXc0tjEx9PX1tdWWFPR0tRU097f19XXVF1aWF9ZWV5TX15dX1tAQE13dnVMSnRIRllERFHf3tbdwvXKyvDy9srJy8LF3tjb3tne2dnFxdPVVd3fV1NQ1FBbXlFUWUZYXkFLQ1laQ0NfUFNQ19zexMXb2sbNwMDAw8zG2t7e0lNW1NdRXlNVVFhFXVBcQENZWVlFWV9YWlpeRUFMTk5KSExCQVhTXllW28Dd3830ys708PfPwcDG3NXV39PXVdPf3tzR1VXW1FdW19PXUFTR0lRdXV1aT0JaXlpEUtTVXVxV0dZV1tnFxsHAx8TGxd/R09dSXlFVV1DV1tVeWFPVV1tZVlZSWV9QUl5YW0ZGTnR0dEp1S01bWkFaXNbf0t/Ezs/HzPbz9M7K987Y3MXY09fc29jf0t3T1lRU1dfQVVJTV9RQWFpcWUp1R19EQF9UVFxS0d7d0N3EwcbFx8LMxtrF2d7XXV5TV1NSUFBXXkBGXl5BWFXQV19Q1FVZR1paRk5KTUZCSUNDQkNBQURTVFTW2MLAxMPI98nMz8vO2N/aw8XT3dnY3dfS393X0d7H2tLd3dHVUVJcXF5DSUJbRkNaXldfW1fS01ZQ0Nrf0sbOz8PBwsba3NVRVNVWUFbVVF5EW19cWV1W1lRcUlZWWEBHW0dJdEhNTnRLQEZAQkFZUVBX0tvGwM3LyvTLyc7JycbaxM3B3dPZ2NPU1NLY3dHf29vUV1RVU1tYXVJEQUVEWkRBWlxTXl9Q1dFV1NDYxdnFws/D2dnb2tBU19HXUlJRVFFbWFldXVlQVdHVU1TUVVNfWUVBSUtITk1OT0BFRE9NRVxYXtXYwsLAyfT1zM3Mw8Tc28bG2tjb2Njc0NHf2NDW38XF09XU1lZYRVhcWkBGWV1ZWFJUV1hbUlBQXl1V0NPS3sfB2t/Z29vf0tPQ11NcUtXVUl1X1FdSVd3d1FbU1VRSXl5FQEhLTExJSk5ARVpARFtfXltd0MXa2MD19M/MyMvC28XBwdrf2sTa3t/b2d/WVdbT3dRXVNVXWEdaXkVCR1xXXVzX0VRfX1JTUlhcVd3S1t7Hw9rc3tnZ09TW0NddX1NUUV9SV9bXV9Tc29BX1tDUWUVZWEFOTUZFR0JBR0BDQ0ZFXltEXtXc0dHewM/Gx83Iz8THw8zG28bNwsTEwMbb09HQ3dzR1tzc1l1aRFtFQENbUFNcUNRUWURZX0RPR1JUUVLW2djd0tnY2N7d3d3c0VXU0NPR19bS1lZU09JVU1fT1VhBWFlaQUdYWVtGR0dGQUFaWV5eXlNX1dfU3MTCw8PP9crAxsLLzNrbwcbe3sTb3VVV1tdVUVfQ11FcXF9eXlhcUVfVXVNU1VFdUFZWWFtdUFxbUdPc0FXR3dBXV9HT0dXX09Ld1tXX1NHX19HQ1lbU0dZTWlxSUFleVldSRERHQUNDRkRHRkZFRVteXNXc28XHw8PAxcfL9MjCzsjIwtvBw8Xc0tnT1tVX1lVQXVxcXF9YXlFWXFlcX11fWl1XUFlEWV1cXlHc29zQ3tjS19TS2N/R0Nnc0FRW1NTVVldXUlNZXVZRU1hfU1BcXFTWUUVEWV5bR1pfXkVCRVlZWVLW38Xb2sHGxN7Zx8/MxcXAxtjS2cXb39TQ3dZVV9TVVFNR1VRUVtXW0VVSUdRVU15dUlxATUZERUZY1ddUU1HR19XX3cfF3d3e39NUVNHS09PR0NFVXF1QU1FTUFRUUVBX1FVfRF5eRE9DR0BJdUlDRFpfVdza2dnHwcDEwM7Ly83Czc3A3tvBx9nT39nQUVLV1VNfUlBdXVtfUlBXXVTVV1NeXlpEQUJHXlNTU9Td0FdX0tzT09jExMXd39/Q1VfR0dfUVdVQWUdFX1leXVFU0NdW19DT1VdXVVFFQUZATU5ORlhFWlHW1tfX39nb29nHxsfFxcfHxdnbwcbB29na3tBU1dHUVFfX0NBXV9PT1lXU1FZeREdNQ0xJQVpbWF5TVldRUFXS3t/Yw8Pa3tnaxN3Q2d/d3dHX1FFZWVxcXFhSVlFRUlTW19BUVlZcR05PSUlIT0FFW0dcVFXR1NnFxsDFzc/MwcfDwMPAwcTY29LT09ZVUlHVVFZQVlRUVlLV0NHU19NVXUVaRUZGQFtcU1JSVVTV1dfc3t/S2cTb2NDR0NbX1NbT0FRRV1ZdWV9cXFJTUdTU1tTT3tnZ1tLWUFlHWkRBQk9AQUFNR15eWFlV397e3Nvb29jdxMHGx8fCxsbZ3tnT0VXW1tXWV1Xd1tDc0N3Y1tfSVlNGQ0FNTUhOQkFGQ1lTUlBU0Nna2drAxNre2dvY3tHc2dPWVNfWV1NcU1JRXV1XVNRWV9ZVVVFVXFxcR0RNQUNJRkZDQEdfXVJR097c28XEw8fFx8PNzMbbxd/Z0dBV1VVeXFZTVFJR19ZV1d/T3dLW0tVWUlxdXkRDRkRFWFhQUFJWVtTT3t/S2dnb0tbe09HU1tzX1VHV1VdWXFRVVVdU39Pf0t3Z09HU1VRQU1hbXlpBTExLSUhOREdEWV9U0N3T39vY2NjBw8HAzc7AxsXf2Nzd0VbRVdfV0dzS39DT39PQV9RWX1tHREBOSEhCSUJBWFJSVFfR3tjb3MfGxsfbwcfc0NDe39DU1dJRUl1R1VxWVtXQVdbV1lXVVV1RX19eWF1YXkBHREFHRl1XV1ZR1t3d097Gxdrf2cbYx9raxN/e19HUUFFT1VdX0dfc39nS0tne09TX0VRVXVJcREFPRkJCW0VQUlZUVNPQ0NPQ3N/S0dLc0NFV3dDU1FfU0VRUV9xQ0MTSwVfe3dHY1VdfUFxcWUZZWURCSEJCTk1HXVtfX1XU1tDXxtrAxd7EwMzAx8zBxNjc2dDXUdXQ0dzT39ze3NLb3dRSXERRU1lbQUBJdUhIQEZFXVZW1dHd39/T3sDFxMXYxdrZ097F2dBU1NVXVlLX11VUV9bWV1ZX1FZcWkVeR1taWFxbR01BRFxeWdbQ1tXU3tzT0NnF3t/d28Ta3tnY3NPXVNdWUFBT1tfT1tPf3d7T3tnT1lZWV1FTUFZcWEdDRUREW11UV1RWV9dVVVFV19XXVNHT09PX3N7Q1NTQ11RV09jc0tLYxtjT0NzQVlBfUlxcWFtZQENLSEFPTEFZUFxZWVDVV1fU2dnd2djAwMHAws3F2N7a3tfS0N3Y3t/S39ne09bc1lNZRV5aR0RFRUBNTEZGRl5dUVZRV1fW0NLR3dvf2NzbwcTHxcDAxNnW09VRV1bW11ZQVtVWUlJRVlxeWF5SXFlbWFhaRFtdUlBQVtdUVlFX0NbW0tnb3dzc2Nrf397Y39DXVddWV1dU0NfW0dDS0NPR39nQ1lTR1lZQUNVTXV9fU1hZWFtfWlleXVJeXV5QUVHU1dLe3NzYwcfY3dze0NbT2sTY29jZ0tfQ1NPRVFdTUVtERkJBTkxOTUZDQ0BaWF9cXVVRVNXR397Z2MfBwc3BzM7BwsfBwdjf3N/S0NZU0FVXV1JXU11YW1tBRkNFWkVbW11ZWlpaXVhcUFfR0dLS3Nve2N7EwMXGxcHH2t7T0lRWUFPVUVJTUFFTUFJUUVJRWVJdWFlFX19eWFxWX19dUFdQVFXU1FTR1NHd0dHQ0NfW1tbT1NfX0dLQ0tDc393Q19DT0N3c2Nje3dLTVFRQUFFdUl5eWkdBTEBCTEJCW15eXl1UVFRX19zd3tnFwMbGxsDBx8bHxsTa2N3Y3NDQ0NBVV19dUkVBQk1OSU51S3VLSE1FRFlZXFdX1dfd2Nna2sbMwsDBzMPAwdrHxMTb09PXVVZRVVRWU9XVUVNeUlJYR0FYWFtERkVER0ZFX15cUdHS0tzS2trb29nEx9vZ2cXF2Nzf3dHWVlBTUlBTVlRWVlfVVlJTUFZQU1lYUFJZWl5cWFhaWVldVFfU0NbX19PX09fX3NDT1tDR3tXU0NPT19bQ3dDQ0Njf3trAxMTD2Nnf3FFeU11eRERaRkJMT0JMQEdbUlBRU9VV19TX39Pe3tjDwcfFxcfG2tjFxtvZ393W3NnDycVQ3V9ZVE5ATUxBTndOTFtIdUxBQVJfXtZS01TY3FPGwMbaxt/c3dLC0NDawtzc0N/f11ZW2FbQ3VPV3ldZVVBbR0Nf1EVAXVhCWEBV3lFWwcHFwdrNzNzex9rN28HNzNnG29LF1FHE0lFUWFZeXF/f1lLD1FdRU9FaX15fSlZacFxxW3RG1lBVXFFe3NZW3VvV2FRUUdlX1VFUVVVV2NHW2t9X2sVT2MfL2cT1yt/F9N5V1dLX1VxdSUFDdERyQlted0FWQ0dS1HfTwEXRw9vAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDBiOWNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8KQEAgLTAsMCArMSwxMCBAQAorODE5MiAxIDAKKzgxOTIgMSAxMDI0MDAwCis4MTkyIDEgMjA0ODAwMAorODE5MiAxIDMwNzIwMDAKKzgxOTIgMSA0MDk2MDAwCis4MTkyIDEgNTEyMDAwMAorODE5MiAxIDYxNDQwMDAKKzgxOTIgMSA3MTY4MDAwCis4MTkyIDEgODE5MjAwMAorNTQ2MiAxIDkyMTYwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOGYxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3CkBAIC0wLDAgKzEgQEAKKz9DS17l5ur9XFhgWlRq8v5dWFtQU1xba2/j3OXZ2trc6l1UWmBwfNXP5ejk+Hvnz8TEx9H+Xk1GU+vQxcHAyeNpVUtLZtrNyMjIzeRsXl5cUU1odl3r2dfVdFhPQkVWfczFzNDuSEA8PUpYz8DDysvhW0tFUVpNWWlp7G1q6eX73t7p42r1909NUUtXcOnPzdHJz31lTVVkUl7g2930a+xrW+DKwr7K3Fw/OTo/Wc/AubzL5VlGQUVfz8zKxMzqYU1RT0ZW4c3Hy8nAzmhXTk9bYNrR29Dab1dLSVts787Ix83g43dNUn3ifF5WXVZITFfz2ePYzOpfYGNcVE1YWk9VS0pTVV79YFdw7u5kV+7fXV1fV1lo4M7Lzc7a6lVBSerOx8C/xdNoTUZK7szAvL7Aw89rT0xPUlzZy8zAvL/G6lVOSkpKT+bS6nRfTEpOXuff2Nf3YldIQ01i3c3R3OdsU0ZEYdbNy8/vY0pBRUZMaN/MzXdjXVRSUkxXberkbGbp+F1WSVD02M7Hy9ZwUVFIQ1bWxb3Fz9pmTEI/TO7MvLu+v8LT/lZVYGbp2Nbf3ebY1+5p5eFzUU5w8u7e3n3ucnn8dP7d3d3/WGRneNnP329XXFRHS37MxMvk+11IP0JHUFnhzt1xY2BYT0dJTE9QTkpLSlJfTEpS8tvn/tjZ9F9RS0tLZMvBvLq6vMlgU17uxby4tbi+xfxPUlvazNvW0vDn6eLXcltuV0pLTmrmYlVcWWl6X2xqVVhUSVJn38jP19FxU1JITVRezcHIy9htWj85P0zqycrO31dKQz9IYffV1XFeVU1RT0dLSFPr7ePLzMvcT01RYdLMzcbR6n1UUV35zMLAvsbKyc/pbHXm2Nng49fT1er0397e4WZPS0pVZurU0MrBy+VsaO17X1hTXvJqZe7d3XpPRj9FX+3QzeFeTEE8OD5V+OnuX1heUUxHTVpldd7T0s/Vc1hQTWLfzMnM0c7g/vNbddbY3uTZyNHzb09HTFbfxcXDydZuTEln3M7Kz/NlZ2x95Mi9vsvbaFtUTFJ65c7Gv7zH0tV1TklHXd/Vz+ZcVUdAQD1GWfjweWz7UkI/Pj4/SWLf4e1ucUxEQlPn2dHO3GNaUFRUatLL293h0svSzMzX+2Zn5f7eycXI3GRgZl33+OPg6O/ucX7x725bW2BubW9+bGJ06c/O39zfZlNKXc3Fvru+w8vXztHXzMvKzNDJwsjO6VBAPUZo3c7EwtZLOzY5PD9LVU9MQz06NjpDSVd6/fZkUkk+PEFNcOLZ0dLZXUxNVmbv4tz6WVpcbePj2cvO1uXu6XlYUkpNfdTNzs7LzXVcXHLYyL68w+BiVVBT/M29vcTHzMzHytnh/tbMycC8vsPO4Nji6ObncmpWcOHu7mhXU05HRkROXltVT0M+QEhXbH5iTkE/PD1HXWFTSkxt59zf/Xp3VGP67N/d3mxQXuT36NjX09DV2Whh9tXKzdrbz+BeWG76eufOycjGzWVJRUZmzb+6ubq+0tzjY/PMxcDGyMTZdHJz39h1dOXe6Obg7UtARkxSV2dXT0dCQENFUmRkWUxSW0pATE5VVVx0XFFlcWJaSUxf4Onm49xkUllu1MW+yN9rd3Ht7OHc3+Dq3M/O4dzwU0VIXevdy8TFyN5fUlZUXGjm5dzMyMzNzNfw28fDwL28wtNtXG3e2enp4Ohz6uZ2XWdZTUxMT09SUUlDR0xQVU5OW1NCODc/RU902NDU7mVbXWzn183W8NrfdWhlY/jazcvf8+ldTERBTmxt6c7N1WZPU0ZBUml94uzax8nLznr65ebEvby2uMHO4dzKzcvBzM/T+ePf++zV3e5ZTmZrXXBeWWNTVmNVT1BDPz4+UmJZbl5OT05ablVKTUpQXF3ZzuB2Y15q+NjP1NvkaWFYS13r2M/V5fRkW/f5YnDufPt75djWdU9LV1df2NPQy8jFyetiVlVde9zNzM3T3Nfj383S5tDN0Nvf+Hv679XPys7c8mhPTVZs7X736WlccFdRX3l63fFpZFtjUEhIRkZq1s3P5PF0TUlYV/bR3eDeV0dKTEpNTVFUXPF+U0Q/QEtf08nd//tXX1lESnR+4tXk6OLQw7/HzuLo1c3Hx8/Pyc7GxMvIx93f1vZfb+fPzdrW3NDV9+3hXvnd6dhpSU9USFBSS0pcbOjwXlxdYVVSUlA/SVlXWlxS5+pMX1dKVWps0NhzV09QTVnf0tHF03RMQEFVa93K0ubn3N3Q7FlY83x+1s7V5fZka1xWYdXV2N5nXW7w1cjNzcrH09zdalrn3+HR1tLHyNlsT09b3sW9vctkVFJNX3Zm3s/p6uxRSk1RXGBZVVJbYFpgU0hUXVJramDa+FBVSD9NY3z0aGBfY+54bN9qW3hkWWhVUWJeYPhfVOrd18/eYmlw3tDQzvhm6fznxsnCvcjT3W3ky8zH0Pdia+jRy8TH1NT/TUhNTmfp2c/M2efd7eR9W1Vk6s3M2GJQWFZY+ux41990XE1KVl1dVE9YW19RSEU/ODo9P0hNT1NRR0VFR0xx0MvN3V1PT1D619vfysjO0NXTysjFvsPLz8rJztbTzcfAw769xcfI3fDm5tbNzM3O4mBUWFZPT1Ndbuzb1HFLS1Raduzt2M/Z9nNZVW3b4GFVTUtNTk5WTU1TTktOTVJVSERGS0RASU5JSEY+PkRJUFNLVfDQyMnY6Ofl1MzN08vBwsjJycfAvr6/wcfEwMPKz9DNy8nGwsfP0eVfU1JNTVRXZWZSSUlQUVFdZu7bzs3eUkRJTVBZZHvf2t/na1BVX2VhZvVzZmNeWFJRW+zf6OlpVUxDQkVBPUBISUZBPjs7PkBJS0xWbf9zZlxf99PGwcTFv7q7uri4tra1tbS3ubm7wMfLy8jHyc7dW0tLVl3s3u/4+3BkUkdITFBVW1774djY43RTVXrs/u13Z3zy7NvtYl5VUU9PTExKSklHRkZObW1mZ1JLSkhKUkhERkJCQT4/QURLUlVWYHLh7uzsbPfe1c/M1dPJy87MzMTCv7u4uby9wsDAv72+u7q8vszp/Ofm4dnc1dfRz+5aU1Zu39XXz9Pf33x4X1VdbV9aXFJOTUxLRUFDREtMSEQ+Ojk+QkdKTE5KREE+PUFQX3J3Z2r37/5qYmV71MzN2OTk3ubg1NPW1NXb3er17tnc2NLS0tHKyc3Y3t3Z0srHx8bBv77C0M/JxcrNzc3NyMHDy9XTy8rMy9PV297gfVNFQD4+QEVDPz4/QD45Oj5BQj8+Ozs9Q1JeV2Bye/ptVU5MU2v67XBu9nh1a1dWX+7Py9jk29LOzMnLz9DOxMDH0Obu93P0++rXzcvQe1plaN3KyMXKz87a82Vk6dnVzcnN0dXS0NnX1s7Ew8DG0NTc3OJsWk1LTk9RVUtIUk5WVUxQS0RBPTw4Njk8P0VDRklFRUZDRklZ++zgY1pmV2jtZmzy5M3L09ba1djZ0ut03NDJxs7U1NbQysjL0MzPzsvW2tLXzsPExMLAvsXVZk5u4dbFzN3d9Xrke/bSzMfGx8nb3OdpaldMUldWX1tJPz1CS1pUR0hCPD48PEBFT09NSUFESkdJSkFFUFJkYlNTTExMTlJUeNXMyM3peure0czM0N7W1djS6+bVzsG+x9HX29zb2dzWycbHwc7e0M7O09rc3dfc4dne59PNzcvT2M7MxcDH1213fmn2clZXVE9aWlBRWWRYST86PDw7Pzw3ODo9Q0dJSUpMRkdKRlfj4t3qd/b3dPj8Xlx23tHO2WxdW1Zu59ze39rqeGtk/NPKxMfSz8vLxsrQy8rGxcHAyMrKztff5eHSzsrN2eBgaPba0NvQzs/K0/docejs9WxdSkhFRE5KSk9TZVtLSUdISUlISUpNT1BcUExVW29sXlZMWFxUV1lVTktOXVlVWV18915RTF3s5tXZ+Wlw7NHL0Nrb0tTg3dnOxsnKzNLQ0szAvL7Jx8jLzM7Tzr6+vLu9wMzKycvN3dra4OVZSEZSUVJaS0U8PD1AST8/R0xXSk9PW2ZPTEFCRkxbaeZbVVdJUk1QWGzd6OxhUEdIXvnY72r8WGZYTlJWdHXc32BXU2hu5N/czc/JyczHzcbHx8XLyszKxsDEyMXLyMrPytPPzs7N4nJs28fDxMnQfVFQUm1kYnttXUI6NzxLUmBgVlZOTElMUE5SVmNaTEtNcmVbXlFWT09SY3Bf8ePa5V9XT/jd2t9oaVFMSU1kXGdu7+NoVk7629zT5t58XX3yzs/Wz8/N3uHr0cfHw8vJydfZ3crFx8bIxMza6dnFwL7HzNR6+Xjt6fnycPBqTkVARUhNSUxbUU9MWGJXUkxWWkxFQUZOWk9LTkdHSlJnd+H7bWpUUU5s1s3Pd2NVSUlRfvH1ZmL4W1ROWt/b1Nvg3evo4tHNysfLyczM0NjJx8LCyMjNy8zFwsrKzs7W5G5i1c/Rz+r4YmlpcNni5eV1WVNMQElVX+F0WlFOT1Xv/WVkVEtISEFLY1pfVkZAP0FCVGFdaltUVVhPW97Z1Nh0XV1gU11iVW/s7vH9VU1ZXtvHys3U4XTo1+Xa09fT0d1z1MrGv8bPzsrLxr/GxcTO19vY48/J0czdWFBQT1nd2drT82VfVkhJWVfv4mFgWExGUFpV/vVrbm5XTFJOWGVOTEtJRkZKR09hXFpWTkdacPbZc2NYT0tKYFtfYlNRTk5HUG3iyMrT2dfS0sPCxcTN0t7f/e/Py8XIxb+/vsS/v8bDx8jO1OZx39jO0OhoVFNNVHJ55vV9X1BJQU1f4tXb42dfU1RjYl9gXV1XV05QYnL9YV9WVExER0hISExOVVZMTWX15fVkVEhGRk9dVlVmal9bW1vhzMfBx9Hh4H341s7Pz9Pg82BPYd3azsS/xcXJy8XJy8fAwsfG1NrO0NLoX0lKTkxg8nRm7dzn5lxY6fDw/uhgUltRY3386+LZX1dQSFNUZXv5YElMQ0NISU1NZGFbUkZNXP7i4OZaX1haaFZPTFddT01GTltg6ePT5eHZ3c7OzszNy9fibmTs6M/Py8zOys7Gw8PGw7/BytTl3ODX3m1XREtKUVps7+fZ09n9bPLTyszXz+9lT09aZW9bdWdPREJBR1RpYXRYTUxMTlBoVmX0+lpPS01g+FxiaFVZWW5ccVtg7nBXTVNXbNbb5uVlX1/v8czEzs3d+19edODHxMzL23Fj3dHOxczDw8zc49fTxsHN03tUTFFdV9/d2954XFb+7NfHztjrUkhIXW/h2t3fblRMW15s4+f/XktHSVdaY/H2e1ZHPj9BTXj0bFdKRUhc8OLd3+xcSkBKW/bS1dTqUkRDVuTNw8TE0vJgcfDmyL+/yNf6aOfSyL6+u7vC0uff28vIzNdpTUVKWGfh2t7kW1BQX/rayMjVd1NMS1nr2dpfT0ZDQUNOZNbO6VlIPz1CVWfp+vdsT0Y+SFnpz91uVlJVUuvQxcbQ2ufqZW7m2c7ZbVZOTEhf2tXW3d/s8vfo187HxtZqWGJibNjQys3V0tLZ693JyMvtVE9OUVbcysvU5+TvfO7m0NPP1GNUT1dc6tbc7FxeX1tcWefX3e5OSkVERk1hZWBcWVJKSE5cXlViU0tHS1x56uXocWBgbvjz5+ny7l5RTU9c68/S4HZrdG5z2cjExsfN4WNf5NTJysnK1NvY1c/JxcjQ3flfTlNX6dPd4ezc2t3Yz8zW5t/mYU1WWWdqTU9OUFFQYWT1429gVU1GTVFU72RTTUtRTFdm6tdmWmNYS0tfctfa+vlhbe7PytLL1upoT0tLWVl74WNYUl5u/tnUxcrg721iYPDe1s3U3/j45dTMzsvL1t/x8Hzo3tXJzeFibuLW0M3Hx9Lra2xbYe7c0uJoT0lMWOvWysvXZ0dBQUZUV2JdTkI9RE9g9PHxZk9LTlpTX3Dy8F5PR01o7tfZ4dzmaVtjYPbpbnZfVktP+tvKxcXH0ev429TQxsXDyt5qXu3ayMLIy9DhbGBlZOng4OtiUEpV99DJzc/bfl9d/P3f3fH5VUpITWbn0dXd+F5ZUltka3NaVk1FQUNOZON9ZWVga23p4Ojk7ulnT05QZ+zSy8zQ4f9mZG325HhlVEhEQ039zsrM1exnW13139ve1+FbTk5k8tXLy8vS183PzcrIys7U3uTo4dTLzuR+/mVn993Nzdru9VpMTVFr39fZ2ehZV19VXGJhU01EOzw/Q1T+YlhdVE9WU2/e6315aU9NWV/019/38FtPbe7g0svU9mlPUFlW+tHQ3uDd3M3MzMXDzdvZ+V1xdvDTz9vZ1OHaz9LNzNDf9GZXYV1Z7tj6XFlUWn7o1MnN7XdiTUhLVfDY5NzY6W/19W77/FpTSD8/QUJDVlxSWV1s5NrSy8vX3N7i5PX+++DqY2VgWmjl4ezrbVxQTU1PT01e93hnZG7l5+7czs/f/nBfVlJWfNbX3M/Mzs3LxcXKz9bUz9PZ3+DZ325faXrt59vb3O5i++DrcW7w8HRjauXt8OPY3nVeT0xJRUVDRENOV0tOVVx56e7s4nBbZGRdT1FdZm1aXnBlae7oevB0VVxzfOno6dnT2N3QzcrJycTGy9nm2PZYWF1w629m5uDj0M7Oz93b2dfe7O1vXlZVVFhhXHrq797a72rv+Gpzc/PseeHm/G733uPwYlxXT0tHTFFNVV9lYVpf7vJjbfHt6eHe4P1qXVdWVWb58OTn73v6XFZiYlxaXV5ZYu3k3+Xa0tDLzdXx6eJeWFdu6+z0/t7b1tDRzdLT2NHL1dvW0+VsbXP482d+efnwYmJae+b56uvofunget7q6ubv7V9XT1BPRklMTk5NUExOVFZlZ2/37u5u5+lvc15WT1FQVnNo+fDe3HloYHrf3t3Y1dPV1+LWzc7LzM/X3OL8+X336Onf/f5+bHVrYmjt4OPo9eDccGVeWV9cXllUW2JjcObt39/j0M3U2Nvg6fVw6tbU4u59XU5JS01ZW1pgX1dZXlxcbXHx8Hn2cnvr3+D4cWtvaFlTUGdgX2VdYV5gZ21xaHNlY2508eDV2NXU3uDtcv7h1tnhfH3h3ubf0s3Lyc/W0tbSzM7b6O5yXlhWYXJpavR1bvL08+zd3t/oaF5z+PPqemp6allWT0tPVlNQU1JPUlJNTE1VaGJYXH7u8Nzb3+tvYGFjZG1zcWdfXm7q6/Hi1dba2+TZzsnHy87O0OB6aGVs+uxxXllidH3t593X1dff7Orv8e/l293neWNVV11WWlxnZGB27erm2tDS3O/n3NPU3+l9clpWVFNaYWdfWFNRUlVcZGR+7vRwWVhq+Obp3tbtXlpfYl9jbXJZVlZTT0xOWXB56t/f3NnW3+ff4eHm+nvo4Onm5uv5cWnm5/Te0s/Vz87Qz8vIysrT43pXWl9lYvbxdfZram137ufY1uDt7eXc42zo3mlbYVdLSUdLTEtPT1VYWltaW15WUlxZUmDy6NvU2/xgW2FtbHnj4+b1a1tVV2B36Nza1dLX09HUzs3S1NPf6317fmpjXlhabfDq7+3vcGZy7uzk19PV1N3qe2hraHV98fHo9GBbWV7639HJy8/S1Njc7urg4epxXVFLSEtMT1FVVmBbWGNcXGFpbHnv3dXc625iWlBSX3Jy/G1ha1dUVlBOWvfe2ePi4eXm3+Hd1tTT715lXGru6N3W1d3i7vtpbXvl393T0s/V187U2eH5dX7q7envfvx2Y2JsdOTd2+b18Xvm29/y6N7fbFdQTUhESExNTlVZVFRRUmFkdX7q3OJ5/vB65/BwZV929npo+exvZ1lkbfDU0NHR3e7b5fbh3dXP09/ld2ltYmx08+5tYWlhWWZibuDo5N7jbG119d30fPji5/vt7vf15flr/Hzr2tfW1eLb0NTS19bW3OZgTExST1JfbG9eVU9VU1hiY2ps+n5iX1labvZ2aF5aZWNfYmZre/NzX2B3cGPw6Hr14NfU3ODY3+Xn6/Lq7fPj4djiY/pvdu7w5erq++L5c/h14tjU2N/99+V84e185ert9P9r6ubd2uHd397o7nb+7l1gWFVTTk1NU01TTUdISE9YXWX59uzd6dzh6dfR3/xnW3JoaXZ1bG9uXVtXXG/43t7Yz83Rz87a09bg7ndpc25ddOvv/mFaVlp06n3u73Xl5PH4+/jf32teWVp27fDo2M3N3ejzb/Hr4NjW1tDV39zf6+XxYl5dWFZPUFhaWlpTUFJaZVpSWF9gaGRkceri2OBjWlFTXF9leebj9WtgYGb06/Tp3+fw8+/d3efWz9TY2uP1c2/n2d3kcHfc5uvwZ2v5+uju99nR4OX8X2Nrfuvt4tbf7uxdVGFbZ+rcz9Dq7OXr3dzo5PVxfVdNUUtLU0tJS0tRXFVYUU1h9O7i39jN1NzV8mVsXGLy9+TccWBfWmJwfOni3NXn69nb08zX4NXW19pnWFxbaPL2bmp4/21laltialld6tzUz+xybFhYY27629Xb5ujh5Nzl7ufTzs/Ud210dOrc3fHg91tcXFhbal5ZT1VeXVlTUE9TU1thY3d0aHN7Z/fvYmFr4tHY9WNXT1lbbOXn2NLodPnv2NHQzs/Lyc3e5v1x8/Tg4HRseFlXdnp++GhdZuLU1eXn6HtlYnzq6NvS733ta3n6a1/n2trZ7H5uZ2vw3N3ybGRPTFVTWlxUVlxSTlFPTVBYVVxfbG/t4fPp3tve7W9v4eDd2e9iYVxVYnro3tzb6O7p4N7W1M7Hys/N2P3ydWVpam11ZFNVWmBraWJdXnjp9d7c+OXwcGVea+Le8tza5Onp4d3Vy8rV1t1pYl9la3L8+l9OVFRQWGp3a/3l7VlWWk1OUVRQUldeXVhjZV1ieHhw8NvT29jb635qZl5sdOPlffTq/mzs2dXOycrS2uTs5d3c2tnd2+1kXWpiXHl8Yl9y8PXu7uj+bXd2YV977Xl+5evs39zd2trq9HJaW1pm/Ofm3NThblpdW1hkenZxbV9cTUVJTE1RWVlcWmFtbX7t5uXd4d/c5t71bGtfWFz37eHf3ONxd+ri6tTNztLb0Nz79eHi6Njc3fX2bV5obv/83+L8amNuXFhdaGFi8OLrb375cnrl2t7f08zU2trpbV1mcXvk1Nz2/19UUl9nYf7m9lpZXlBJSVRTTlx+a1VUVFhaXV5db/f1/Ht5aF9l/nNl6NXd5+Pk6O7j3t7bzcnN0dLQ3eXY1tjNzdjZ7Pv+ePP/ffjj9mZbT09NUmhlbN7U2uZ58eT+8ebj4NjX1uRhX1lWW1lf8Oj+cGr+/mpzbV575e7ubVhUTUdNTldnZmVeV1RaaG9eY9zZ3NrpcH5gYn5oeOvp7fju4N/b3Orh19PMztrf2+bf2+HWz9bm7en8aHVqVlp65uN0XllPSlNYW/HZ2ePw9fzr3el64c7M09bX429m+mxm/u3lfnDl5vVwWVNVZ3p1Z2JaU01JR0pSWV1UUWFbWFxYVV3f2Nvq7WpaVVpdXPnZ2PXr0dfa5efx69nj2NbV1NPV3entz8nN1NbKzdHhc2dj5/H9a1tYTkVGSE1n4dnZ2tXb4O/8eeHP1d7e2+1uVVNSUG5+ZmT/2+DscmJVWWhkaGBZXWFPREJGUVZTXnR5aWllYWPw2NXQ097vb1lQVGjd2t7d29Xa3XNld+vX29fOzc7T3nppaODX2tPWzc3Q4HVrZ/1pa/tsW1VMR0tPbvnr09jZ6/JuaWroz9rY09TZ6G1ZXlhk+3Ht79/f7GtdWFZkXWBrVlZVTktMTFlkWWBlW1JQT1dZaN3g1M/kZ1hUTk5P99nl29fT19vsdHR+29fOyMvLzdfr+Hzbz83Iys7Pz9n+c+zb5+nwYldOSUhMTF14eubo4t7c3eXj3dDR2OV77WVTTEhKVV9m8O3c3eT8XWNkfPbx/mBdTkpFQUlaX2RtW1tZXFpb79zP09TX3u1wXVBRUmdz6eH13dXad2j/79zXzMjJyMvabl9ffuLYz9PS0tznfPDZ09/p52VdWE1KTFJgd252Z2/p6vDv2tDW4OPe7d3cdl9bXGNyfuDb2tnpcFpdbm95d3VmXU1CQkVKWWxtdGNYVlNOU23l4+jt6/R1ZF1eXm36/HF7/XF482lfZ2t36tbKxMPDydbg3d3YzsnIyczR5v3k5OfqdnBlWlVPTlNbW2drX2Fsderr4NDO1tzr9X5rbHpeW1hVY2Z45d/l3fxdZV1XXltob11UTUhLTk9lfHXweWpwWFn79H7o9G9tY2lpXGl+a/fr/Oz38975ZXdqbOPf08fFxMfP1uHz39bVzczQ2Hpw6nF38m1pdGdhXVhhZl5jZVtaYH3e2tLM0dTX3+jvenh4XV9bWGds/uPX2+bx/XRYV2Z17vdzW0tHSUpIUFtbWl1fXFhbYm1raG1iXWRsa3vkc27+a2hre/j48XhrXV983s3Iv8LJys7l3dXPx8XFxcvZ5e55aWfv7PbsdGNlX1ZtcF1hWFRlb/vf3ePp6t/n6d/9bHJeT1hXXH527dnqaWZYVFlbevbqcFFOTUdIVFNcZ2Vv/3Rx+XVy6+9++u/1+eru+npxYW1uZ3by+3J0X1pm8ufRycnGzc/c59zUyszIx87b8PJfbWpmZ2fsen1v+e5ueHJmUU9aWmvo393h5vPs4t7U193ieGVeb3tw5uHqYVRQT1FSZnDs3eBnUVlTT1FaYVNXXlpYVFloZWNpW1NeXVFe+HlsaXNrbf3n4ubtcW5cYvh508HCxsvMz8zOzsbExMfJz9/g73Bwa19h/H16fXjl3fJzbV5YYF1VbO18Xl9eXHvn6PP162ZdWWP8a+LZ525bW09WWVds5+JhVlZRT01RWWBnYmdi8O744+3ndGZtZ2tbX3N6YlZcYmb17eXm6fZgZG7w3tLHyczM0trl2dfSzszO397l6PZ89nns5/BtYe/t/+vu7XVfVVFZYGnv6ez29uzd2NvX3N99YVhW7uDt5+bce2FWVnJmc/TsZlRSTU9PTFBYXFdXVllnZGBgav9yZFRVZ11VWV5WTVhba3Tt2ObvZWdk7s7MysjExMnKzMnIw8XNzdDb7urn7PDg3ePe4e/g2uPm//XzV01NVlpTVVVWWF9o+uHi2uZobWBSVXHp+nL4d19cWVtw9/32X1xYSUxXWlZXYl1aWWVu8t7q5O3r8mFfXmJlYnNdWFhYaHXn4/B0Yl5RWP3h0c/Lx8fHycXHxsbLzuLvaWNrW2vz/Pjt3/bs29XV29zn8m5fX1lYW1VWUVdYaunaz9HZ5+r9Xl9oa/12c3l7aV1g9PBsbGNZU1FVWFZbVE9XWlhXYu7wZnR9X2RjXltXV1ZTVVVUVWD63t/z7WpiZWN54dTU0cvGxcXDwr/CycfS6dzc6P3x73ru39na29DOztrh8GJvZlVQVVBJS0hNV1zx39ng7OZlXlxYXF5pYHDw9en2cu3m/WNoVVBbUFVWUUtMV1Rdbe7e2dzx5u544/l4e1tQT1FNUF144+Pf+2xfUFlkY/Hd39jPzs3Gw8PEw8jM0eLe4fLq/Vxb9fp83tPPz8rP2Nny/fVnYF1NRUtHQ1Bl4tjR0d3U7Hjw+Ozo71tu+Vxifu3z6upmbFxQVVZVVE1HSlNJSV93e+bc/v72cWZrb15YTEhLSEhSanJ54HZoZV1ec+TYzc7NyMfHx8G/wL6/yMvM0djT2uftau/ufOfWzMzHy9Ta5XZaXV9NSUNAQEFHUXH26Nnp6f1pbm76d3BdV1tSV15y7vHZ6WJnWFVbXFJOUElMSkpWYfvp1drh2+Lx/HViV19NRkxLUWB6bejdcPN5XvTe3tvP1d3Ny8rGwcHBvsjOzNzn3eZ55+9cYGVe99HLysbJ0NPnaHVlUFFRREBISk5kb3Dk3eLk5v3d1u7m33BaX2Fk8OLn4+xeVlhPT1VNSU5LQkRHSVh7e+Td5fp7dGdmXFVYT0NCSkpPX2z44uj85Orh0c/S0svPz8fGv7y7vb7Cy8zO0c7O2uLe919lavjSztDNzt/qfWZ4cV5PSUdBQEJFTlVXYH1sZerv39Xic337YFthc+be4PB2WE1QT09gYlBPT0hGTVBq5N3d3uZpZ3Rw6t/+VlFPSUlKTVplbPPo/u/f3tPNz9vYz9HPy8bBvr/KzNDe29fX0dbsc3pnV2bh08/Oz9Tc6Xn45N3bblNRTUZGSk1ZbX3y6unz3dHR293k/Op3afv06ORlWVNUTUxNT1JOS0dGRkJMYWzt/nFrZl5bYf3nfF1TTUxCR0hLXGlnceTq/t7T0s7Py8jHyMXAvru7wsXHy9HT0Nja2d/m6Pv32NLPytTe4vFpYGv5e2ZRSkNBPz9ESmf0Yevi63vk2ubc6O13YV5YX/7q6WFdZV5SUFNSVFRNSUlNUFZ0597x8PpqbG3o297ma1NMSUVITl/06np67ujg4dTP0cvP2tzXzs/FwMLHy8zW3ere2+nf82bz6N3YysfLzdvvdnH+eOr5ZlRGRkNDS1zq4trscN7g7N/Q0d/mZVpaVnTt3uR+aVJWTEZMVVFFRkE9RkdMZ+3y8vJVUl9l6tnbelhPRENFSV7s923uXVrd29fKxcbJztze0MrAu7y9v8vc1c/cz8nR9WlkZt3QzMLCxsvqW1pmZnzf/lFFPz0+RExw43NpVk1c49nU0NHfX01LTVJ549bnfGpKSk1TWWVvT0Q+PUZQ8tXQz9PfWFBg59LS1vRYTENER1T35+djWU5LZ97JxsnGz+ZlbdzKv76/xs3cX3Ddz8rQ2XRVUl3q0b++v8PM3V9WfeLW2uhfTEVCSU5+1tjkYFxaXevZy8vZ8FlOTExa79vU3WJXUUhMV2JuT0I7OT1CSWDZ0dhuWV5TUu/Z1+VzU0dHSEpd4Of8V0lSX2vlz8XGy9jl187Mxru9vsDP1NTU08jDzd1oUl3f1dTAvb7F3vPp5PHf1vJjVEQ+QUpLYPBhXkxJU2B88NTX6WZNSlFrY+3gefRdTU1VYnbyZk9JPz5EVGT+09TV7lFXdHjn1Nf1dFVJSE9m9dxwYFdGS1p548/N2Nj+Zf3ZzcvBw8rM2ePf2NHHxOVnXFVdcdDJv7/Ky9Xe39TS0s3pYFNOS0db/97XY1xaVlZg3NfM1nViWFdQ+d/34m9aU1FPU3Rod1ZEPzs+PkdaX/H+YFtcXmvb4OTc/1JES09Oce7l8FlNS1Re5NrRydDddd/Sz8PCwL/Az9zP0cnGxsTP61ld9+fOxsHGzd/q2d3OzNrZ51lEP0ZIU2ZxYVJKP0RKVeDf1+BgUU1YV/jY5uh2X0tJUFbj7mJfUEc9QEZR5uHm6PllYu3wzsrf2PJdSUpUWt/h/vVvUUNNWe/N0szS5Hh23NjKw8THztZ0et3ZxsjIzelmVWH11MTCx87Q1tzOysPCydpdVUlGU2Xp7WJSTUhETV3p1tnfal9bVGrm3tjkV1FRRktba/JsXUtDQD5ETldaWU9PUU5d//Dd2+FiWVZMT2Nwd3pgT0xKT2rrzsvNz9DP1M3Gw8PCyNPO1uLUz8nHxMve4nn22czMysnRztTTxsTDxs7dXldNR0xXU05NRD9AQUtYaOvt8GxeXl153t57bWdRU1dXeuXe52pSREZISVpkXFthVlVx8tzR0Njtdl1cXFJmbF9ZU0lFTVNg3dTT2tjX28/NysXK1Njf+ern7tbPztTd5/Te4NrP0tTQ1tjPysfFwcXO1edrXldRWllTTUpISk5XYX7v7up5ZWp5/+7j/Hp9aWNeX15obl1QSUNCRUZJUlJRWFRVYHj6+OfpdWJXU1RQVFtYVVJRT1VccurXz9HR1czKyMXGxMjIyM/V1dLV1dPe5d7c2tfS0c3Ozs/PzczHw8jLz9zibl5ZVU9MS0NDQkBFR01OT1ldXGJwdu/2cX36/Pl6a3RnW1NYU01OTk5OTVFdYFxeZmr46+nx7Ohral5YWl1aUlpXTlRTV2975dvU3uPW0cvJyszJytDO0dbQ3Oj+/Xpr6Ozk1drXzsjMzsnKxcTFycrK2+hyXmhgUFBXUExOTlNbWmltfm1cam/66uvh3971bG1mbGFUS0lKRUhHSVBPT09YVE9VYGJuZWN5cF5aXlpjXlNZU1NOS1Vdb+nd2tHQzsvGw7/AwsHHzc/U1tbW6HB5euzr4tfSz9LO1NXS08vHxMrPzNvvemRbUU9HREFARkdKUVpiWFlcXGpka/fsfuvZ7vF1ae71cFxRUUpKTE5SV2RjY1hh/nLp69/lbWlcV2Bfa2NdV1JST1VTaurn6PV9/OPSzMfKx8PGys/P29zh/nZyXVxdbunb0M3Ky83Pzs7KycjFyM/V2tjZ2dtrWVNLR0dNUVRdbG90bHDq29ff7fBuYF5aVFRYVlFTVU5JSEpISUhLSEpJSExWX1hv3+prbWBbVVhVU0xOUk1QWunk2NLT19XSy8TAw8HAyMnOysvO19vi/vl+8Prp3tjV1dnQz8/Nx8jNycvNz9fc321XVlBJSktJSlBYWGNgYmRka2Zq9PjycGxoXV9eXVxdUExRT05VV1ZaXFpaVVVZW2Vq/+jp6+fv6GxaVFRQTE9UWVp77N3b3dzX0MzQ0c3Q0NLS3OHi4v3r3+z86+rn7mrp5d7b2d7X0c7HwcLIyMzN0tPhel1XVlNVXGteaH71ZWlfZ3rtcXLw+fx5cWBZUVlWVkxLSkhMTUtISkhKTk1MU1RWW3B1dnNvZ15eWFZTUlheXn7l5t7Rz9va2NfQy8nHxMTGxcfJz9ba4nxtcm196dze29PS19PV2dDPzsvKztbT0tbd6vpfVVRXW1ldVlNVW1hUWl9XX/N3e/h0ZWVaUUxNUVBQT09UTk5VU1VZV1RcXl1o+nZrdGZeZmBcXFtdX1lccXJx/Px+4ODs4Nna39LNzMrKzMvQ2Nzb4vDuZF5kZmX37uXY09jTz8/OzczLy9DS1dLX2Nzm5e517d709vtxZmdbXF1XWmh57d3i7fb6W1VQSkRGRUFITE1MT01QVlFRWVZVVE9ZVlRXZmBYWWFaXGlu9Ovrbnnz8ufc3t3bz8jKyMTEx8nJzNPV2d3k6Onl5u91e+fo29bUz87NztPX1tjb4d3f6efl6Hl0c/52bFphbFhYWl9aXF5cXmRy7uf+e2RgXFZQTEpKTE5QTE5SVFheX218b2d2b15kY2NrZlhYVlRab+Hl7PF6cfN4eHp+69zQ09DRzdDT1tfc6OTl9V9qePhuZl5v7uLTzcjKzM7Lztra2eHa0c/S1dnZ2NfV4Opucfzuc2Vk9/dpc21sZXd4e2xiVllYT0tJSEVGR0ZHTUtOUFNZXllWXF1TTlRVW1lXVVZWaW/q7eff++3m7PTp5NTOzdDMycrNysvP0tnQz9Tg4+Do/m1cYWn729TQz8nMzszR3uPt8+zs9e/n3dfe3d/vY15mX1taVV1nX1dcbWBqaXhqX19gXlJQUVBLSUlKSlNVaP1mdOvqYWFjXFZZWVxZVFtsc/Ps7/VuePnzaWRu5vLd293d3dPOy9fU2Nje3d7e5vVweGtYaGZ9793UzcvMzMvV3tbT1dTZ3tzbz87L09TU3+bma19qYnL191dfbGRs6X1jYF5fXVhJS05MS0pEQ0FGTFZYVWFdWVtYS05OT01RTUpPXGP/5/7xdP905f937t3X0NPZ0M/Py8LJzcvJzM3R3d3c5/jwYltj7NvW0s3Mz93b2fXw4d7q39rf3NTf09Hu/f5sX19fW1plYHNqV1xvan3uc2ZiZVVdWE1OVU5MT01LTE9QZnJscmRYWFpWWllVVV5XWGFjYfvtdXtvaWv4b3nx7PDa19vSz9PSzM3P0dvn3N7r6u9nX2FhZ/xx7tjP0tDR4NrZ2dfS29rT0tLO1djQz8/T0+Hl6un06HljbWljeuZ79PDsaWhbUk5KSUlJQ0NGS0tPTlVcXFZcVkpMTk5KTk1OUFJRZGFdZe55ZvPu8Xl889nb2tTKy8jEwsLDxMrGztjc2Onx7u5sb25q3Ofg3dpxcPHu9+7z7NTk5NvV6NzX2d7d5uza8vr4cmJ1a2Rgbl1y3Xvp9mJUW11VUlFKT1RMUVRQT11mcf5vVlxgV1lYVFJWVlVWW09dbXL8bWZjb/f38ft43t7j2tPV183KysrR2Nba6fF4Zl9iaWJrb+7f29jX52tq8+Xu4N3W0tLPzM3W1s7P09DOztHU2d3m6eLd9XTs6u3q6PhwVktMT0lESEpKSUtLUU9MUFpWUVROTlBMS1VSUFVXTVFdXmBpbHf1d/Ht6+/f2dDPzdHLxc3MycrMyMnLy87i49/zeXZrYH7p4N/na3d0X1heVVZq++Hb3/zb2ODt6fne2NPP0d792t3f3OZjfOvt6+hnYGxXVFVMQ0hJUFRST1lcW2RsV1JeXGxmWk1WWF1v/VZUYmTy+2tu5XD37HBYbe/p2dfZ1M7W0tTb9t/Z2NjgdmxkXPr0blx0/N3U3e7t/nt9bV5VX23f1dHa0tPS09XZ1s7PysnM0s3NztDO2PP37vb9+mtpYlpNTUZAQEdLTE1OT1NRUlVNSktQTE9OS05UUVltW1RWXltz5N7d3e3r4u/p2tHSyMbKycvU0M3T1tTc8vR8cnz08+bxdvfp6ODZ4efzX1hdVFNdY2ns2+Hd4+fe19vU1uDf19fX0dbZ0NLg5fdxbe32929ZT01HR0xNT1ZdWF5pYl9rYl1dVktMUE9XY19jdWhqZGhec+3q5OR9bvl+9unb4NXT1NXU2uHc3+ru+11XU1lccGpneW5r6t/p3dne9PteV15kY+/h5tzX1drPy8vJy83MztLPzc3NyMnMztPf4eL78PtkUExGQUFERkpMTU5MT1JXVFVXVE1MSEhISlBZZV9dXWBca/fg4tzb5PXu6+Td2M3LyszKzM7NzdXZ4PxnYVpXanr+7utwcP7x7unp9HxmWFRRT1RfZGl3eWtt8d3R0NDQ0dTX1NDR0szJx8rM0dnZ3dzgfV9TS0hITExOT09RVlNXY2tnYGNdVVJOTU1PVFpfYGBfXm197t3i4eTu/Xrr4t7Y08/Q0djc2Nvk7HJeWlBOU1hXYGVmcHxweOnn5u/uc2dcWFxqdu7u7OLg3dzPzMvKy8vJzc3MysjKycfEyMvN0dzf92JUTEVCREZJSktITE1OTlNZW1ZQT09LRktKS01QUFVbXXXm6N/W2tzZ2ePf3dLNzs/Kx8nLy8vO1+HifmRaXV5aWVlXWFtda/Ty5t7wd2hnW1JWXmVmZmxlaHX02tfX2NfU1NTOzcvJy83My8nJzMzN1Oh+XlBOTEpNTk1LTlBOVVtdYWJZVFJQUVBOVVlUVllbXWb849vZ2NXX3N/b2NrX19nV1dPN0t3a3/hmV09OTU1OUU9LTE5PT2B69ujz+/piXGlkYn7q5t/f3NjV1dLMzM3Ny8/Nx8TDw8nLys3Pzs/U2dzfeFtSTUxMSkxMSEpLS05XWFlYUU1NTElNUVNYXFlSWlpbcunq3Nfa19jd2dHU1NTV1M3NzMnKztXX7GltZ1xhX1laWFRSVFVYZG1iXVtYWVVPUVNUV2JiYmtz8OLf3tjX2tvUz87MysvMzc3Iyc3MyMzS2+Xqel5aWFBMTVFPTVRgZW1nYF1TTlNRUFNZYmZdXWxwdnbj2Nna0tDV0NDPztbf2tzf3trX2Nnc8WBbVlRRTk5QTEtLSUlNTlFYVVNUU1RWVFtfZ2ZhZ3t1feLc09LPzs/QzcvKysnHxcfKx8jJyMnN2vFvc2JWVFlZUE1LS0xMTllZUFRZVE5RU1VZV1ZZWVZda3D82NHS0NDPycvOyMjKzMzOz9DNysjN19nb9GhuXltfXFtcT09WUE9UWVVOS0pISktPWVlNT1lPS0tOV1tXZWpmdOze3N7Yz9DRz83MycnFx9HV2Or9Z2nu7HtxdGppXF1oamz/dXdlYXN9b2hhYGZbXWFo+tzU0tTY1tLZ1c7Kx8zNys3QztPZ335x+l5TWFlaXVZRUE5LTE5OUF9qWlBOTlBUT1lnWVZnYllYX3L6+3X45f9y593Y2tnh5t3Y0MvP0s/S3nNfUU9YXmtvWVxrZlxdbnFoZmBeYVxgefBtbnhdVFRSX/js3M7MzsvL0M7IxcPExsjEwsfExs/S1OHq/Wx84+fy+2RWUU1LTVJTU1pRTE5KR01NTFBQTkxNTE5RT05RUFJWXGR+2d3Z2+ji2+fi4+fp5d/v+GhjbH5sb2lucXfv5Nba3+jtbnBvdf7u6uPbfmJcYWVyfeje1NLPzM/OzsrNzs/NzcnKyMrR3Oz5WlxhdfHq8eDn/WRfZ1dTUlVTVFFVWl1TXXZeW1RTWV9dZ3BrWFxeUldaY3fq7e3e5Hbl6mZpZGZtYlVZX1hUXlhNTk1RXGlkeeR5YH10Z/9zeeTh7eTnd2x7a371++DWz87JxsnLyMzMzdPPy8zRzMvT2Nvj3d7h19PR1tXV3d/pcG9fVVlcXFllaGhpXlZTTktOUVZZY1hVVE9NUU9NVFRdZ3Jr93VtYmNdVlxcYmt2bvP7cF9mW1hmZHrp8Hjye21ke2VkcW/y4fN3/HBsZu559urr1svO0dDQ1tnV393b2M7K09zb2d/i3Ojn5ujf1+r54uFxbHFse/jy4dTf39jY6er29vx3de3ec2JwcmZwa2BdXmH062pdYl1QT01JSElKUVZPT1ZVUVJQUlleYvDwamBrZl9fW1ZXXF99+nh47PPv7flx+u7l2Nfa29je3t7i6Nza1tDQ1NLPzsvKzdPS2dXT1tzb6uvk6XR37vPg4eLj3eHi7vdgbHdt/HJnePhgbHhrXGlkbfDt6d7rYWJjYlBRT1FXWVVZVkxPVlJNVlVndnFu+HRncmtgVVxcX11oZPh1Wl9uZ2R1bvb79/XsaF1faWVcX2Fldfd93+Lm29fm6OPd2dbU1M/a3d/X1tfS0NfPzszJzc/Rzs/R19/q3N/f3+js4dzl6d/m7dvg4u1xanBrXFpgUk5QTlFTTUpLTEtNVExPV1lcWU9OVlpWV1xQYmxtb2ZcZ21kZmlmXX1v7ubwdfNubG9+d2J9buPb3+Pa493c3PZ09//a3ejp3OLc3uP19/Dm1NfZ1dHZ2t7f6OPx6Njh49rb3dbX2drZ39XO1tjZ5Ofo+XBna2fx7WljZltdYltYW1ZQXFZQVVdRWFhXXF9cWmpsampsYWhnYl9bVldfWVlVU1JYWFlTUFVbXl1kY29qbXJ1amNx9ezn39zY3NvV0tbVz83Kx8nO0NnX0dbe2dXXz9HV1tDSzc3X3NnZ4Nve3Nrc6uTpeH7r8njwbmpxY1569mllX1RSUU1PUU5PWVZPUFJRWF1ZX2tgY29hXGZjXmxsZntuW2BwZWFrbGd0dHfxe2VvfWBZWldWXVxdZl5aY21mb/zo5N7n4+Hp7ePb3t3b2N3V08zJy8rGxsnKzc3QztPQ1d3e3Nzh4uHc5+Pu4ebw5+Hr/frw+WlwbOjreHtsYlxaWlhWYF5rXlNTVFVSVVJQUFNOUkxLT05QU1RRT09UV19dY2ZjZGFnZmFiaW/ua2dta/bt6/f8dPvt6/P37+nk7+ns6eLY0M7Ozc3Ozc/Mzc7OycnLzM7Q0NDVztHa2dLX3uhzbHVwYnJhWFt2dXlwaGZsZ2F4bGBkcmJeXFpcaWNfZ19YYHh4+X19fH1mX1hTTlhuaF5aXFlcVFVWU09cYF5XUlZUUk9OTU5LV2RnXWRkZWtu9+jj5dLOztbW1dnb1tfW0tfPy9DX0tLOzMzNzc7Vz8/W3djU2Nvb7fDs+N3W3NrX2dzf4/N2cG77/2lkYmVcV1NMTExOV1ZTWFhYUU5OTE9Xavh0a2xoZFxdY19n+ebo+Hl9bWxeXlxYVVlbVlFPUlRWUFdZWFx37+99/evi4OjY2N7h2NrX19PMyMrNxsnM0M7S0tXSz87obPteWmX7/ern5N7hcvXmfPzh2Njd1tjS1XV46fLs3N7e3+Hu2edZVVNPVGZsZllcVV9RS1JWT1NbVVpTVlRuV1NZYltZWFVVU1dVZk9NT1BNV1xeW15kXm5gbnlvX27v6/Tf1tLO1dPOzdPQy8jJwcDGxs7UztPWzc3Nzc7S09HX3OTq9Ojo+vbke3RsWF1pZ2rp7u/m63v0bVxdZVtcfWNcW1xWY2Bfef5iaPJ1e3JmWl5VU1hUTFBcU19lZ2BoXFZcVk1SVE1RT1BQWVRWZVdVYWll9+/xfO58797u9OPd39DS09nU29nS4NrOy8/Lzc/W2N3W2ezg1M/Wz8/S2drh2djc29TR0szPztXb69/g9Pzq93b2Y1tVU1ldVlBPVlJRXlhUT09OUlFPT1RUWmReXVpbWWVtXmdtWmRjVlNOTEpNTElKTk5cZl5bWltadXRodPDx1dLY2tna4M/Q0tHO0sjGy8rKztTK0dPW3unZ3ej6c11b8v747ujs19/z7+ZnduPn3ezg4NjZ4OLea3Xd9P36ZmH+Z1dfWUtVWFhpW11gZGhYZ1tPXl5hXVNbYGt3afxiWF9dXFRJS0xLTExPSEhIS1BPUl1gaWhse1tdYvzk7OHY1NDNycnNycjExMjIycrJyszR3t/m29nX19ne4eLq7WxydnxudXtnanfo3d/i29fd5uHrY1xdWV5YT1JdVFptYV5cXFtnXFhTVExRXldQWVZbb11n/XBYa2VaVFNNU05HREVFRFRdWldWT1laW1lkWll48erk6evZ2dLOyc3Lw8DCyM3PzM7O0M3VzcvLztt5/fF87/j7a/v47O55YvLh3NTS1+LV083Q2uvp/3vo7W5o8fDc2PBgaV9u+m9cWmRlbW1WTldUYv9tVlhiXV5ZTUlGQkhLTUhKTUpLTEE/Pz9FSkhIU1laWWReYWvx18rP1szJysrFycrIwr+8vr++vsDBw8vR1tHTzd7l4/Nfau1+efvj4tfk4+Tlfu3ndGhy6N3T2tvZ2+fe4/JlZ2trdGJseGtiePlxa2pmbnJpb2pjX19ZWVlZWmRranBmX19cT0tISUpJR0VJRUBDR0dMT1lofvjs6/Dz8Xj64eLe0sjHwL6+v7/CxMbLzMrO083T39zU3Nrn7uHd4NjV3uDq329p3u3xz9XOxcbKxMXM0NTS29bk3tpsVmZdWVxVXWlvZfJ8WU5OREJBQUhJSk9gXltZZFtbVlJYVU9NU09KSE1MUVBNXVtYYft1bH1xYWhmduXp6NPMz83GxsjEx8XFx8rJyM7S1tnX0NvSztPZ1dv5ZGJXT05NV1haZ+Te4d7Y4d3f4NTQ0dfQz9nd3N/V2drP0dvo3u1oYllNTUpHSkpKTVJNTVdTTE9PU1hYUE1QT09VVlRWUFBUUk1OTktKSkZESExPUFZj6ufj1tLT1Nba1tLRzMjHxMC/v8DEx8TFy8rL0NLR2/h5Z2n29md6+W/v6fJ48O/s4+x66+X7e+zx4OHu59zb5N3p6vP+ZF5TU1JVVlZfXVpgaVpYUVFOVVBOTk9QVllUVlBQTVlPTFJUTU9PSUlJSEhUTk5aYFt47Hv+e2Jk5Gxo7+vv0NDWy8XIw7zCwL3AycPJ1NLN19XS3M/P2d7e+3rvZ1lsblxyfWd24urZz9PSyM3RytDf09Xr4eJta/lZVl9RSk5MS1VSSEtNRUlMR0pPTU9cV09bXlVoa1BYZlpWWk9NUkpIUlhRW11bXGFVUlxXUF1pYuzq7+DT2drX2drPz9nQzs7TztPZ293r2dfl393e6dzl+fd2X2t+dXns7+3Qz9XMy9TNzdfY1dvo2Nfd2Nzu3Nzt39fg9u1pVVpSSlBXV1VORkVKRUNLRj9FRkdLTUhIT1FPV1BPX2Z27uft9/N8eOtzYX7g4eHt6+fn49zT3Obk29ze6enm19jX0djb1M/T1tvZ9ez+9nJbT1leWFhaX1ZiXmRlYFz+4djU1NDSzM/P0dbSx8bGxcLExsTJy9R6e+L6/fno7v5sWltcUFFSUVFPTkxOUkxQT0lQT1FQV1hRT1ZQUk1JWF9jY+/p59vW4dXS0s/R09bOz9bU09/X29nS1NbYz9fl6vdtdl1daW9ue9za39nh6+l88Oz0bG31fXnse2lv9vX37ffs2Njk3dzc2tfTzs7OzMnMzszP1dTNztbf4+fi9Xd8ZFhZZmhpZ2hjbWlYVVdZW19fXmBjdeTu8/t0anJ1Y1pdYVxiZmpoYF5kbGpu/ffv6Pr7dnb+dXx8fOXi3tbY3/Tx/fd5aG7u+3vx8d3e3dvY0tHMyMrL0NLW2tbd4uDp39ve1dTT3fB2d290Y2ltcu576ujf5+/k3enf4eLmc2v+4ePwYF5nb2FfZWVeaHZkY2VganxfXGr/8t7l6Ojo/vzr+3B7V0tRTkxMTE1WVFJcZFBPVlRSU1NXZ2RbX3xjfuPt7d7a19DS497Y/vDg397e29LU2d7QzdvX1NbS1Nrb29/n4Ofi09fc4OPa3uZuY2hXU1xZZV5cdvpscOva2+fxcep7bXJiW2d+6urtcvjqdGtwa1xeWlVLS0lOTEdSZFtdX1xraGdMTFFZXlpMTVJTUU5PTVdZZufgd3tz/m5mY2jr3tbPzc3Ky83P2Orj29va3+rl6e3yfnv8dv3n09DZ3eLf5e5uZl9l+epucPr86vpwXmNjbG9kWVRv7XRXUlZnY2N439rS0djcbFpbXVto+O3g2t/q+V5VUk9KTE1ISElLUE1DREtKS1VaXWheXWJaS0lLS09bVl3o6eTY7WryfmZz4/Tj2NzTztfd09vfzszQycbKx8bT3t3s7tzqftjV2dPV/G90X1lmWlRpenv6+FtQUEtNWVFc9XVjWlRQTkxMU1tcbOba19/26PdwdPh1YGRu7dv4cf1s+3v0euzf4+HiYFtWS0hHRUVMUFd1fVxs/1xeYVRRV1RVdGtYdWlbY2Bcbunr3M3Z6Nvl8+5vftvX1c3Iz9DJys7M2d7W1tzPzNPN0dng5XLs3uX93e5jX1tSVFBNXFpfbfFs++/sd3JZT1FLTFBWUVxeXV9nWF9zZGf18PrtemxnYVJeXVFh7+ra0tDQ1dj9/mlbZ21wavT4+OdzbHlzd9/Z09Xf2+BvZV9wcmvx6Nzb4dvhfOruc3B2+uba4e7X1ubc3Orn83na1tzeztfl2d3i4+rw3dfa0cjW3dp8X1pNTmBkX/zga2/talthVWng9Gl1ZlFQVUxLT0xe8Ofm1N1raGJXVVhSYO/78N7f9+Lb4NfZ283JzczOz9XW1uft8/Hl2NrQzc3NzNPd7evt5P7n2uLY7fTwcFZgY1xiWVtjbFxmdXJVY2j6497Z19Ld4/9zZ/f34N/Vz8rIzM3W2ePZ29zi4+nsbl5aVE9PWVz8cuTb19/t/GhYTVRYWlddZfB89/hsZmV79Oxv+N3W3u3h4nV59+rT183Dv8TIyc/a2tvYzs/MxcTKz9v8but8e+NzetvZ3dztVlBXU2N9buDO5WJcUkZFS0dMVVJw1err5uvt3+p+3d174NTg2tvsau3u4M7N08fL2dDXfWdoUk9RTklcXVpvYF/8eVto+ndt1u703fJeXFlTb+Xg1szY08rT3uB9ZOzb59zN1M7N1tra5O/b2N3T0NvR1OJwdmph8+Do5fhdZGNYT1NPU11dV2l7bOvi7V9nW1VYV1FVUU9TV0xLVlRYaHto6d/r49nub3tbVV1eWHnz7dHJ19/Z9WNtd1xpdGb4a0xLTEpMWFpY7eTs2NTxcW5uZ/94d9nb3dPY5N/5b3Td637f3+Dge2lpY/z52+n67Glt/3p0bXF3Y3NzdP/x2+fo4XdkV1JaVlhbVlxRXF9RVllaXF9gXFhfVVxSSUZBPz8/QEZPVlBmXVdWV15hZHT28P1o5fDm5eXi1c/O0tHR0s7a3Orp9/tpanZwYGh2bWpbaPvvfunyd3Z4d3vu+P15cGlsY15ldnZoWk9ST05NWWFmfubg5ftlcfT0d+v06d/b39vb497h6/Dmd37l7F5UT01OTk1NVU9SXGBcWFVQXF5TT01JR0dHQkJFRUpOT1VfXvze3Onu3+ze3d3f2NbSysrOz87QycrO1Nbd5+ri+Pvl9nVhW1JWVWT7+l5eaWVlXl1TZGNda/9eam1763BiaXRgafV9WWbwaW767Xny39Hd4e797eZ0/eZ59uvg7Oh6ePbrZmtrWFpZW1NeVVhnY1VrcGBo7/JibllTV1lNU05JSU9PUWJfYura6djY3N/Y2trT19DKzdjOztfUztjV0Nvb193v9mxmamZbaH5q/vNjXXBgYHn27+jf39vpeHTo7PXl4+ri5/Xe3ePo/V9mZFtccGxo93F64+9ebW1kaHFr4dfn2tHS18/U3dXf9+Te9vb2X1lmXF566OXX0+rd32ZWX1ROTk9QW1xUXV9WXPPzetjX2czQ1t7d9Obf1drPzNDM2tfT1/Xj2Nvo5d/m2t3X3efp7N3i8/N3cu7l6PDv6/bo+m99dfP04trc9HD66HBr8e3w7Nve3Ojw7u937+fx6ebm8nRkXmFtb97Z0s7LysrL2+brbWn48u/z7ezy9XV8+fDg1d3y825fVVhMTlBPWmZfXHbi3c/U1dnO49rl3e/X3N7Y19bUz+na2+bv3ubo497a0+146M5l3tbq0tn7Z3VSUlpkbHRs8eH0bPfveX7l4Orm4N7r8+Lc7fHe19XW0tbb4ezx6WxfZ2t8/m5bbe5u4dbZ0cvIy9PX2t7t69jmX2zm8Ozu8uzk6ejecl1fWFp1altVX15n/VpRVltfZ2dycWlr29Pqcu/v5NbUz9Pc3dvkbXFubeDW2N7b4dzT4fjzdPjh919cU0tUXlhVWVlhbm908HRhfHpr/er75tze3Njc6+Dj4trq8uZ0XV5lV1hqZ2trW1hdY2D46PLe43v17Pf+fPbn3N3X0tzj5/PzfFpUVFtdVldaXFhRV1pbbH7q93ttVVpeWmNaXvbm6OHb6mdsamnrcVtSXmdgXF1p7PX86WRcZGzudmtaT1daX1tTVVtpfOXe4ejo5d/d9W176dnX0tLR1dPR0NPb6uHa4vJWTktST0tLSUpRVFJYT0hLUVBVTUhHTU5OVFNSVFRWb35r+OPq19rxe+ff6tzf4NLPz83R3unl/OLhYlpkem/l2+He4HLu429xeVxeX1BMSE1MUlpPYmVidt57VlVMSU1GPkE/Q0lWUVZbVFBfY13r6e7k2+fs3dnc0s3KwsTIxsHIy8rOy83X8PTk8N/Z62xdU0xVUElMSENFRkVFSUtIT09QXl5NUlJMT1pOTUxISUpSU/7rcOzsbfvd+/ntZ15682z03urdz83EwMXDv8TIw8TJztfq6N3d3NTc6eF3a+PzX2VSTU9KR0ZEPj9HREhPS0VER0VLTExPSktSXnXv2d7p2t3g0NTZ1dXX0tLS0c7MzsfExMDDzNTX5ufa3+x6XGFidHr03nRnbVxeV1FUSUZHR0tGR01JS1ddaXpmWWFfVFpUVFFKSklQXVZt7Wr06+nTzcnLy8rHxMfGxsTHxL28vr/IzcvNz9HT3Ojt+mj9aG5vVU1NUkxQVE1IRkZJSUtOVmBd6NXW2eb88ez/d/XkcnL8/tvTz8zP0NDPztDO3v9nYnVz9mFj+f/u1tfQ0d7h5el9/G9nXmFs79/c1d30cXN5/vL0bWVYWGVfWU9RUVZgcejsa2j0e27u5eTq3NTOxcTGxszQzs3OzMvT1Nbe1s/O0tHO0NHPz9HY7/BtXF1dX1NOVlVo6N/X3+Hq39rj3O9oclhcY2FhVmh0be/m1dTk3uX7amReUExNTVdo+N7p+3v54ung5mT7cnPu7d9+69/k1NDMyMzN0NLc3NLd6eHk3tfX09fieWtramtrV1ZWVGJx8f777uzZ0tDLzc3S2uN17XNhbu7p28/LyMnO0tDV4fZmWFhUTlNjb2r98Hzk2dPV0s7S1Ot9/VxYYWVocP/t6970XmhwbmhnXlVPTU1RTExRT1Vab3Bt3+5+7V9lX1xhc9rc29HQx8bOy8vM0drY+HL8dt3Z1dXg3N7k7GzqblRfV1VXUlhNXvR25Obb0uDc2Nvi59txXnNnavx2eF9ld/Pf7N7e7NvkX1lXU0lJUU9aXnrrfu7f4Ofk2/Jt8PPr4NbT3unl5tzi5uZtZmxmbGxjUlJfXFlaYGFQWGBtd2JlU01PVFhYX2dcYPnr3NPY3OPe2d7n6ndiVFx17+fk297g29XX3u9tVE9UXGteYWRXY/br3enp4/Lq8f7sbWVaTldhYl1dbF9je+vibV5cUFBVWVJKTkpIUFRlYlpoXGd+fe3y6PRu/vLe3N3X3ePYzsvO2OByaffp4n378Gf55Onn+vFxYmZlX1hZUkpKTk9OUF9bXXTt4OLgfmFVVVNMT1BPTlRx+Hbi5Pvz8f9dY2pfW1lbXVhh+GRfaezq4tjd7vJxdHfy6l9eX2lxau75Y25vbF9h+2JYV1JMS0tNTU1RVVdec19PT1FLTVVUVFlpeOnWy8jNz83S3dTS2tbV0dzb2N3X19vf7t3W1uPl3nFw7vtdVlhTUGVvcPtre3RbZPRwe2ZeUE9TS01TXVpYbXd4a19bS0hLSkpKT05NXPnr59vecmtrdvDc1trh4dfb3dvT53Dz6N7X1dXa2Njh331sU0xPTVphZ2taXVlUYnTj+V9cU1NecXV6/Obf0szV3Oru82J14eZ4durl0s3V0t/l4vXl1M7V4OTz6tza09vm+/Xp1c3S2NjW4N3gfG5YUE9RXV9nYFhYV1xfXVdKRkhFRkxNUU5OT1rs3/NuW1tWV3Jo7ebu3NXKzNDL0tDOz8vJw8bK0NHPztTa2d397+Th3d7lfvrr3WxdYVhTUFxaVm9saXht7e3Z0+NnVWFhX+7m83p07fDl4+36+ezrfW3wb11ofujc1NHZ09LRzsvGyM7Y29zYztDc6+nd3djZ2un3eXJtWlNPSkhFRkpMWE9PTUteeeP8ZF1WZf3n1dXX19vQzcrO09bZ1s7S09La2ujk29jY5N3k+NvX0tbe2vd079zU7ejq/d/bz9Pb1N3o3NbebF1YUVVgdW5kaWtYY+jrcFtpWlZbX25cX1tWXXXi6vbpe/Tb0dPg3Nze3tnS1dbX0c/Mx8TKzc3Q3/H07uTy8/Dk297i6eTk7uve6n1gU1NXX2FiX1hfZ2fu/v1+YnR29vxz6vjp/GzhbWVtXmdgeOlu82dhbGjc2nrj5uTe2MvSysrQztTM0XXr4ufu9NDf4tvl2PDl31lXVkxIRU9LRklDRkVNbFNNVlNQUXl3VGdtbv140dr45OTe5M7I0c7N0dzey87nePnm7trO1NDR1Nvcy8/qaXf6fOjW19vY2+xr29brcV5ZTEpXW1dWT0xIUFxQSUZKSUtTU0tKTE5OUVxlaV5YUk5bfunn6HVwet3V1tnf4ODZ2tTNyMrX09LOzN7raWD4dPDq4+VcXmhndWxrVUhKSU1ZXGtUT1RNXGheVkhTWk9aY2xRTVZPWWdyeE9QW1Nh79zrX3R4ddrMy9ne09TPyMLBycjL0s/Ix9nl3OXp3M7P3upoXVZbbVNKRD4+PklMRkdCPz5DT0lGSUhJTF/0bmZaVVJb6+lzdF9XXv7R1tvb+Gds19Dc1eB1e+bO0NDT2N7czszW2OVud+DUzs3Q1ndceOHrfWxTSU1RV1pWUkpER0tHSklAP0BJTU9WT09LUWBja2VeWV3w4tnNy87e29DNzcrJzc/MycXGxcbN0NTX1dXeeWr8/vfd3uP3aWxfWVpYV05NTlFYV15cVlhLSktKT0xNT01XWmFlYmNiXV1gW1tUWE9TYHLz9GpeX/f259zUyc3UzcrExsjJ0M7NzMzOztDS0c/MztHb9V9XWlZRVFRQUU5NV1xdWEhDRUVCRUlLSktPUFlcWFlOUmpfbmxve2Pu2dLN1dft5dLVzMvIxs7MyMTCxcfU4tXT0M7W0NPUy8jJy9DjXVtcWFdRU1BUXWRqXXNmSklJSUZAR0hJTFBcW2tkUVJUWlpVYVtXZvXY3NzW9+/h5tndz8fKyMXAw8fFzdDR29vx39rh1tPMy87N4WdfXFxPUVRQV2tuYl9tYllSTU5IRkpISlphXFhrXVRdXGViZGpdZnna0tnIy9rc4dTf183PycW+vL++v8HGysnRz87a1MzFxMvLzNfe8GNXT09LSUtTYVxpfmRaTkpERElDRUlOXVpkZ2RjXWBWXXZcYXDu2uPW19/f7u1dXO347dbQysjCv8LCxcrU7dvV3tXRzMvEvcTJztDmZPP1ZGdt/V1k6X5uaG5XR0tMSERHSkVJUFlXTlRQSExYX19p7Pf1zMPHysrJ1NnOzcvHwL/Cvbi5vL29ytfS29vc3+V75M7O1+Tja0xLUkxMVk5MUl1rYF1lWUxLTktLU1ZRTltsVVtfT0xJUFdQW1tXXXTb3dzZ/2dbXXh32tDOyce9vb67vsLGzMvPzMnX0s7Lx8rJztrtY2VjX2tWTlBWW1BYWExIQ0FBQ0lISU9OU05XYFNKSkxLWPx2Z+7Y0tDLyc3Z3+dwZ9/P083Fw8TAvb7ByNDg89jR3dzVz9DNxMbS5nloVmp9XFpVXVlQWFxQTUtHPj5GRkNFRUdJTFdLQ0BBPjtCS0tQXHvu383X5vZsYlls2t3YzsfBwby8wcDDzNLX09Ld3dvY2tTJ1uDlaVtVYWxja1tfZFl2Z1BPSUVCQUpISU1LT05PTkdFQEJAPkhOTlRYeODbz+bwelVdV17c3tXPy8HAuru/vsbLy9DLztjh9N7t49bj62hbXVZcXl1eUldcU1lQSUY+Pj09RkpMUFhkYGBdVlBLSkdHTl5eVWXk3Nva3u5wXl1bW/r3etjPzMrHxcjNz9jc5ebZ8e7g69/X0M/g6+ro+fnjfmxoXV9XV1pMS0hCPj1ESElRT1VgVFNNRkVAP0FMWFlj+93SzczN0NLd6u3j1NbSzcvHxcXFxcnL0tfW3t3e5+158ODp431rZl1u9Pjk6PhkXHJdV1ZRVEpJTk1WWmBoX+1yU1JOTUY/Q0NJUVJcV2V+ZW1oX1RKUFpd/d7V1MzDxMXAv8DLy8nNzM7S2eja1NbP0NLl7dzd3dPb/WRcXldRVU5HRkdJS1/1a2pre3BhWVZPS0hJSk9aWlxm6+T6/O5cV1JPU1p17u/i08vOzsTKz8zNzszLz9jW087JycLCyMfIysjGx8/W3X5sa2xiTEdJRkhKU1ZWVlBPUFJKQ0BBPj9BS09MUmP+5eLqdFt7Y1hi++Lk4dHLy8nHyc3NztbWy87Z5+vj5drV09XSz87OyMfM0tLS4Ori6vVrXl9da3176ubue2BsaU1KSkdGQ0hLTlxSTlVq+mJTV19bXWl4e+nl29POycbGv7/ExMnFyMrJzs7MycbNzMfMysjFxcrN0dntZmdWT09IS01NTk9udV9sW19eTlFJQEVERkhNV01PVFh1YVhcWF5cXm9+3+r95NrPzs3GysjFx8THx8nR0NHMxsvGyc7IzczGxsrY3u9x8G5rX1BZV1tveeH5YmlaYGNTT0VERUJMUFRbUldcYejvbV9YW1dhcejn9e9s8c3Nzs3OzMzCwcbCydne187Ny8nMysbDwsHAy9Tecu7+d2tSUUxJTlJgWk9QS01RUE9GPz48PkFCREJERUhPW3FrXWJda3Ps2url63bv38/KzsvJzcrHxsjN2ujf29bO0NXTz8zPyMjS2N7j+3Hd6GdfW1lVX/55bHzq92Tu+VZMSEZGRUlIQ0NFSUhWZ1JNUFVSS1FZVFhaXFRh4Nnc0czLzcnDxsfFxszLxsfJyszMzs/JzdfV3fRtentcWFRPSkZHR0dMUE9QT1RLSEdHSEZDREFGSkZLTldaU1ZfW1paXFhabVxdZWdlZurS0s/R1t7q3t/g1tPd6eHa4tvU1dnc2NHSz87d/+rkd3l7dlVOVl596d39VFpZT1BMTkU+P0BFSE5ZTE5dWmRt9fteaHL939rQ33Tm7d/RysfR2tje0sjEzN3U3eXj393sev5xdu7c5VtYUk9bZl9WT0xLUWbe3nhkV0xNXGdWUE1ISU5gbmBdUVBTYu1ubl1MT1Xu2u/nZltj7M7U0Mze4t7Qx8vK0vlkbdvd5tf2Ym3q0NLU22ZaWH3rXmxWSkpT+uPf4lxOTF33Ynx7WkpNXmv332xPTVvw7dnZeFdc8dfOy9L0XX3X2tfNzujl1tDKwcPN4NvQ0s7Jy+lm7u3g0c/kUElQVlpQTUtGSk1SbfFwTkVJTVhfW01ISkhMaOLbcVBXae7b1N9pcevp08zM2nFjavHazsrX8/zlzcfHzNTd/Prk2dXi8W5v3dTP0uPqaGzj1tV6aXZdbN/g3/1aUFJfbPNqW1pJSltrempdTEVTY15iWVpRUHbd1ufr6mP208vJzMzY5c7FwcLGy9zh2M/M0tDede/W0tjc4l5aaHzn+WplV1Xt19ru7VdOVWPk4Nvial5g/N3l3mdPT1BdYF1WS01Yaen76G5Za3Dj3ebmY11ibtbTzs7s5tvSysnGzNTb5djV2eBraXj63d7Y6W/w6tnV3OpfVFRPU1hsbVpbV2Xp59rob2pWXl96cFdZW2B95uLme/rz4NvRzejz/G/u28/O2+Dr5tjX0dro421md/btbGhfa+jd2N3l43Nz4efzXlFTTVBfcOTx+Xpm4Nfa2u1wW1NZX2dgWFdXXvDo5d/a4Pjc0dPQ2fBoXvTt49ro5WZr3N/a4OZyWHJnYnldWFZQXnNu9PRsWGb8cOzcb1VTVV323OXeY2Tn6NzX2e5cW1xZamlvX23m59jZ0dn55ePVz9rS/Vz5/NjLy8zh6e7dz93T4F9cT1heZnROVVtX+2NeZVBWVWN3XmNOR0tIU2Z3fFtTU2Da09HbdGdXYunq3PpeX1765N/f7Or96NXW1OBtZGfs3NPa63NgYeTQz9bibFlgd+fk8F5ZWV/v5vluZltZbOfubVZMS0xUXmJdW1RRZeDX4P5yXVdYXmNZUktOVuLR19jg4OjWycTJ2nlfcN/c2dzl4W582c7O2ep2ZW334d5pVk5NWV9mY1hfYWvg4+toT0xIWWZydldUU1Ft497d8nNYVFZRVE9KSERMX236cvZuXWZfa3JZUFFZ4tzk6fbscufQzMbK2eFn9m5mdGdoWF796uPc6e768+Py5vRaUE9ZXGNvbGlea9nQzc7X32ZgWFNcW1ZSU1xhZubs8HltdV1fYl9aVmNw6dnb3+3s2tvV0drna25td+La2vJmZWNv5+z6Y2RmZXh1ZlNNTkxQX27o5/Dc3tHJz9/4bWlWZnpsYFZcZP7e3+ja6PleY+5lVk5PVljn2eHa92xjadvidf5nZ1tj2m5gZFlUT2RvWnb2bF9zz9Xd4e55XurT/t/U397SxMbNzdTqYl7rc27n+lxa3Nt+7+T6Z2ze3+r1eGxo1Mva2M/a+/rU2d/j5+9bauv9fGdcTUVRU05RU19UX+Hu+GpcWFJ78Hr46t7w4snLzcrN1e7x631yaWNfVWrsZWNpZVtdfG5r93Roaena7e7l5urf2Nnn3Nrv6dna2NbX8GZeWGFTTlNQXPjl5PTsZlFaX3ZpX3BtdOLSzdnT0ufg4NflcutqXG5u6vLn3/7f2dTd/OZlXfjo1Nve2u7f7drQ3M/Y5tfXztff23BpZWBdUFpSSVVi89ng2edraF9vYG34W2vn3M3PztLi5fLu92hvX1xlWV1XWmJYVFRXbGdwZFtnX2rm29XY3dnd2tnb3ujZ2tzPztno/X5jWF9nbGNbW1Rj7OHk/vt1dert4+f83NzQyMjFys7U4NvU4utiWlpaZV92aVlQRUlPT1hUV1BMVFdy7vfl/erU2tDPz87Vz8zMys/Y/Xj3cvX6ZVZKT1ZZYV9fVUxWXGzi6+F3e+7ez8zKzNTX2djZ19Lp9P3929XS61lQT1dYS09UUlJJTmbqclNSWGV4deXc53VcaN7Q0eZ7Z11s++nb+f5vdtzQ1exvXF5mfd/a4e96eOPU0NPW4vRw5t3o42lZUVFicn3r9mtdXWly/XZdYXTm2Nnf6npoZHl58Ofg7Wvq19/b52dZUFZQUF1XT05OWGxzYmlbVV5ja+zseG3w19TNy8nM1NnR1dPN3Htr+Xv86vBfUlNZVlVaW05JUFBUXmltV1daa+vf19zd19TIxMTHz9fk7uLq4PFdW1tdfnRjWk5RUE9NTE9LTVJWcejX3evtcOPd2s7Y3+Xo3tjS1OjzZGRw+nZqYFpYUlVXWFpdWVxmXW5vcuvt59XPztjd2Nra2N7V09vdYWHu83FqY2taU1JNVlpeYVliamdeY/z27u5zb2pxbmpuc3vsb3ReY/z5fmhr/3VkbFpdW1ppXV5qanptd/B74uLu9/Dr6fT66d7h5uzi2c/P3ejn7f1+9NnT1tTX2tfd3en58nB3+235fmliW15wX2RcUFlSUFJST1BLSUdLVF5pYmtoYm/l29jX1tfR0dTP0tLO29rX2drm7+5gV0pISUVLSUNKWm5rbuTW4N7W0s7Tzs7SzMjHysnDyM7b2d3+Z1FLR0JCPz5AREtMSlFRUVhNXmFXcWp183La0dTR18zIzsfBw8vl6l5SUU9JSE9Xa/Hp3eXu5dzW1tjec1lZXGRkXvj8auXazsvP3F1MTlFUU09VT1Vo89ne9Htf/drYztDY33NvZv7k6e5weujdzs/X71lTUFNTTk9SU15n/dvSz9fTzc7T1tbf/n3vcGB87HVy7tfX53hqTkhLTkpLUFRWTVFoe/P86HPs2N/Y2+bi9ODb5NfX7Ojq2tXb2flcU1FhWE9aU01NVGN33tPW29XN0s/O09bu5dzs1dDb3/Pn4eXzX1RTTUdHRkxMSU1PWWPu1tnn29vXy8nGyM/LzNHPy8XIzMvKy8zX2eBpV0tGQD9CQkNJV1tncF1bXWhsavLwY1lSVF5TbPXv19TPz93d3f1oaGFgXGxuXmV2+ujxbmVbV2d58+bx6/5rbHTv3drVzcW/xsjJ1dDU19Hc3dns6djSztDa3HRr/3PvZ1hbTUxYU1lfWF5cX+PmbV9RTEpJTUtNWV5lX2Hz9+bs8+jc3dXNzcvN1Nfd1cvJzNDUy8zO1Oh6VklHQENISE5LTVhbae/l2tzUzcrFw8THy83NzszJzNPOzdHU+m1YSUVCPj09P0JCSU1JTlFabvzw7Pzt6efb2trX5d/o6+Dd2tfb7mhXX2VST0xPXGra2OPf/eno8MzLzcTIzMzSzM/g3N7o62no2+zT42N9Z+/pWF1TTldTZGxZXFFKVllu3/Py+3ruc/Pa5d/a5+Tl2czO1e5fYFNNUk5QWVhcZV9vXllZWmZqeuHm3N3t5+TUztDNzdLR183Jztn5WVZWV1ldWlhSVlJOWVZQT0xOUlZfal9ZWFVeXmVmYHdyde/e0c7T5f9kYV5kbmZr/Hvr2tHJx8jGx8XGyMvY8fRlXGJcVldMTE5PUVJlZFdTWVZWUkxUUE9rZ/Tm39jZ2M7Nzc3Lys7c29ni72tuXVRdX1xcXF9lUFZaU11dVU1HTE9OWV/2e2b83djWz8zM2NvU2+Td29t7eeb75d/f415hcFdQWVxNQD5GSkxOWmhUWPfs4NnRzc/ZzMjKxsnK0eDX3N/W2Nj6Xe327e5faF1PWFZOT1BKRkdaYlBQWmpXU2V3XmbueF9dceJxbOrofGL10t7p7fZnYGft7u7Zz9jY19XV2c/U39nU0dDc3c7Y3dvZ3nFifGFic/f9XVNYU0tPSUhGTWlhWmBYXVhe4dfX19vZ0NLNz9nY3dzP6ObgdfFUTE1SV0tDQD5ARkdKTU1WV1h96+Xv4t3dz8rIy8zNzdLfycC/wM7seFloXVRaW2RfWmRsZ1xZbmJc5+Ts7vdna19l7eDZ5tzU3ufuX1JbTlVTU2di+tfX3d3UzdTY1+HwY2JuXGBsX1hRSUtFR1RTTk1BRUZCSU5QXW3b09rPys3Ly8C8vLm4vcHHysvOxMDK0drMydXi+E5HRkVCPDtCQD9BP0dLTVZTTVBNU1ln3+L5anLaz9bP0crEwMHGzuPrcmFfZ+zc2OBiWlhaZ3Z6c3VvXFlsbXJ6++vd1M7S09HR13VoaWT1+V9aWl976tnX19nr5t7m3N3g3+p98G9eXF5aTEpQXWtdUEtFPkRLT1NXZ/n208/Oyce/wcS/u7y+wcTJz87Mz87c73VdZHpbVFBIQT9BQEBGSk9PTVBmbX3y6fJ97+Lk9fHpbG5n5tji2tHV19HR2dre29rc6dnQ0NfP09rc1tvk4ubvbWJfXmNpW1RVWlZaWW/n5dtvX2RUXl9UWFNbenfi6m7x8nPr8OHa49/n+eTq5drZz91t/+ze1e9iVEpIR0ZJRUZFQUdNVl9g+fRv4dnUycvJwsbEw8XAwsHCysrHzNB8WFBCQT08PTw8QT8+QkNKT1BVam/w2dDJy8bK1M7MycPJysjKxMbRz9319GRbWE9aX11ZU1heX2pt9el4W11WV1dKSERCRkNKUFvu9lVVVmB1X3j2aOfTzMHEwcDHzMvGwcbIz93f+GT4YF9bS0lGSVpPRUNAP0RGUlBQX1Za+/HOzNHS293U1crIzcLHzczNxMva2/d84Nvm+VZOSUNEQkdOSUpHR0lIS1BJTFRSW1dm3+7s9Hbc0M7Kys3GxsrO0c/W6+1cTVRabPNh9G9g4d3Y1/zd/l187t/XdOjgc+nczsXMydLn+vBt7lpVXmRxdHzZ9fPi6N7V0sXL187p83pZX11OTkhFTUtQS0FCPT9HQ0lHQUlHSFlhfflq5NjKv728u7+8vsLCxcTG19XMycfJ0M96aW1saFRTYFJNSUhOTklKR0pJSk5XXWxnamBu7OXY2+rk3dLQ0s3Oy9Dc7uvl2d7r6+7vfWRdW15cXF9paXFeVlBTV2JbXWf75eXsb2pxcGVuY2lxdvLo4NPVzc7Oy83R0dfS09fa7G/9ZGRXVVdSTlpSUE9HS0hDS0lWcHbf3+nY1tHIwL2+wL29vr/IxMzg09Hh8V5wXFlYWVhPT09MQUJEQENHS0xJS01KS01fYFddaHZrZ3trWnve2tjOwr7FysnHxcS9w8zOysXFysjM2urj2uhnZ1VKR0RMTEhNTlBUTlBTWuTb9vlu6O5s5tzi2NjNztrSzd30at/S2dfP1+heYW5bbODwW0pWaFZTU1ZMRkhQSENKUE5MU3D14NTNyMnHv8PBvb2/yMzNztbX097h7NxuXlZVTD88PT8/Q0xJREVMVlx90czO0tLMzc3Iyc3MzM/c9t7b5n5jZH1pcXtZUltjZGV65WxgUFNmaunV53BlV1dVUlROTUZETk9hdGFXVmFu8ejW1M7P0MvNy8jMzMvOzM/QzdzgeVxfWV1wZ1VOTFBSTlpbU0g/Q0ZHV2NlXFBdbXbu6+jpcf/o5NvOztHWy8TEyMfFxcrO0dzb3ONtWFJSTUlHRUQ/PT8/REtQTkpMUltfbOjffXB23tDJwMfNzs7M0d3c5XRjW2NnZvtgWWVn6+V65+5nWU9XbHPvfWl0aPTd7N3i9PJlWGJ62trn2NrZz8/Lys3Pz9PTzs7bfftmWVlUTUhBQD87Ozw+PTw/QEJMV2BaWmx7d/HXyMnIv8HEw8G/xs7Lztvi3c7W69rb6uPc1eBoZ2xfV170fldYX1FQVWVaVFVXUUxLV1taWWReZv7Y1N7p3ODt29PV1M7J0tvZz9bscXtwW1p7d11ZXl5VU2RiWlteeWxbc2pgXmR2amnh2eRrXX3v+eTe5eLc1NLT1dXo/XH08G184Oju5GZaVVVZT0tISE1KTF9eXnTf4NzPxcTNzsvJy8vEw87XzcrLzsrP9VdYXlVNTlZOR0xSTk5NVlRKSVFOTE9VVVBPWFlbYnz2bl9rd2Fv7OTu387Ny8jDw8nFwcXQ2NLX6/re3+fi3txoU1tdTkxSWE5ITllcWl/udvLYy8zX3d7j7OrZzc3Vztjh5ujd4PZ8bGJj8d3V6HJcWFZYXVpcUUZAQUdJVF1mV0xQV2Nz8dz/Xlxr4NnW0M3PzsrFxcPEydX279vU3Nza+1xZWWFv8X58ZFldX2xlZPTn7eDRysnL2/VdXGhqfW5hXV9keeXX1tzg3+Li2d/g/mB129jT1N/vW1ZcWkxJQT84ODs9Rk1UXl5k59vQ0NXOz8vEwr26vb3ByMPAvr7GydlvcFJSX1tbUkpYU1FVTVJOR05WXGhfZGVZa3r23eHadFNcc3H1/339W/nc3dbRycbW0s7NytXa3XpiaH33dmVpVkVESUlJSU9PU01MT1JZYXDc7uXT0s3MzMzN0c/MzM7seuhcUk9UXlRSWml4c+Da72Nt72hVWnT2Ym7u2NPYzszX3trM2fnr3e1p7eTk8Hfk2tbY2dn+VlxlbmdicXRiWVhWVlBMTkxKSENMSEdMUF1fW+vpff7b1uBqZXBdYGh3627oysjLzcbG2NzY3Nvq28/T2s/SzM3WzNH57f94XktIRkFCQURIS05XUU5MUFht49jTztTb1dPT2dfN1uDX2NvU1NjZ9vtiXFtJTlJDPj9GTE1VXVZVW2n/7evb2tx+Zff++d/Z0M7R0uHx4Nzb3uLf2eLh2drZ5ex8fP1leO5fUU1TWVJed2x0b2B+8XjZ3uxqV2ZoWmzl1c7T3dvd4d7a325fVlRfXXD9XGhmXP1t8tfZfGZOSUpETlVRVkpJVk5PavbqamRw+nrj0dDb4tnUzs/Ox8zg3t3PysnExtLg+WRfVlp7YVFLR0lNVGpu9vVubHbu6ePwY1hXXe7Z4drS9v5tetbY0crXd2/v2dnc087haVpcXFVjZFNIQUVISUxSV05ESEtUaXRlXlBNW2fay8rDxc/QztDRys3Q3G5dX3n+49jU42hfb3ft5PF5W3Ld7dXV1c5zWu3g2srM2d5dcfZr3dLP4WlUT01NXnRpYltYW2Lt0dTecU9OTktgXUlFPz1ESFPk6nZ5X1b+beDR3t376uXa08jHycvMz87O0MzX/V5fX+/e0cnZaWlgdODVzNLjeHpxferf0Nx6XVBNTVBUT1NKSk1LUmju5fpeb3Fx2tLU1H3x4N3OycLBytnkbF156nBkUUhMS0pQa3zseVpfTlnp7PBqW2lib9vP09h1WVZPatja3u1h9uDdz8jGyMvpb2Bn3N/f3fH25e3u1tDj71VPTVRwb2dgUE1WWvLOysvR7/7l2sXIz9Td/WlnX+DcfvVXSkxKUk1LS0VCP0NIU2FZVklETl375OXV3+3+4t3PxcjO3ehu8d3Z2tDV0NHPzMfEx8/c7XBu3+DpblpPTFn64t73aVdJRU1hcGJfXVt0/ebq39nO1+Dq4NLc5eHqan7s8Xnr6+pjS0RHVl5eZWJXUlRRWOrm4WxVU1FobVlidnly9Ojx0s/T3WFeY+Le4tTU6G162tPGwsfXa1VSb/7q6mRZXmXt4dfO3G9w/Xbb1OLc51Ze6+3u1tbb7E9LUFhmbmhmXVVfdnHu3vVhVlFPWnloXV5abNrl9ejsYU9JR01WYGxfb2lZYvLv2srK0+pr/uTZ0tTO09jNyc7KyM7mbmBf8vR8aGpmXmj3593O2O5eVUpKVW34fOl0YmFp7NDlcGFXTk9nbnhrb3ffzcPAwMvkYFlVWOvqe2BeUExPVFz1eVZOSkdBTVleUlZdX3N53tDT5m/94ffZztDn8H186u3Py9h+ZFdSUmTm6eDNy8zMzMTAxs/d+/9oZ+PsZHp1bejm2M/tU0lAQ0dHVWNdYnFjeejSyM3d911YVkxRWE5NVE9cXGTnZEdDQkBHTmn7XVtsY/XXzcG+zt7p9nh53tbX18nHysnIxcfb8nt0fW/7fPxoeOfTzcW/w9pbUEtCP0VHSEVJT1tj89jWb1ljaFxWfezuffHczsvDvr/M+llYVU9mYVZOS0xVU1nx7mxbTk1WUFxsbGry28zMz8fI1P5dWVZQWGBZW2BbeNzVw7/J2nRdYlxp49ze2tfPysvCwszfcGteUU1OUlVRWXzZ3dfM2fNuWVFUWV597HRpbuXf0cXM5mxVT0pHSUtMSU1b8fTdzc9yUk9STUtMU11QWu/g0ci/vs36alhQUEpTaFtr18zFvbq7x8nIytfxaVhbVVnx19XLyczdZVNSSENERlFUS1vu69PMyMzWe+1pX11n42BdZtzV0M3P4v5dV1NNTExXWF1s3t3azcvS2v1bTURJS0tSYWHp7uja0NTtXVBbVUxRXmj07NnKwr+9vcDJ5XxsUVh389/5aHrZzcXJ2dpsW1FKT1ppef7q3c3KxsjW5XZfTUNASEVKTkhNbubY0NHL0+1eSEdXSVlwXVvj0tbR1dXm/1ZMSEdIS09OVHHc39XVz9HO6vPy4Nfs1NbTzsvOy8jJzMjbWVRUXl5lYvXn2dfi39jo6m9NTkdFS19sbnHf4PrW0tvYcUhHRUJHUVxq7tvRz8jFxsXF12plUlhaT1Jdd/P58uZrX1tNP0FCTFRSU1ZqeOnf1dLR1OtSX31y7Ovq3NPWysvPzc3aaFBbfGZxZFvjz9PLxcLHy83ecWVdVlJYVm7d7Pzg2vbt6X1mWU1HQEFESVVZat7Y49nS2fVcXFpbVVldVlJSXXFrfN52VE1NTV9iZ3paaG/93dvVydPhbF525uJz5uTi3M/HwL6/yNh9X11k9l189nNve+fe1NXgXFJOSkpEQEVJRU5b6tvW0Nzb7XZjbGptbH55c+3b19rZ6t35ZVdTWFZUXltfdWBjaev5fWJYWVRcX2hmXnLu5+rdycrP4llTTkdIT2d749jR08q/w8XH29/ha2hdW1pibu3g0sPJzcrUfWdZUF5eTU9OVmBk5ubu4X5cbGlWW1lSWVdk53fs8mz0Xlrr2mxeXVBXYW3r6NvlfeLyWlVaTlRjTlFf+tXS2d703tLb39DZ1tT/ZHvdzMvLxcnL0N7o1drt7OT0X1ddZnNsZXdeVVf+bl5aX2zr6fXqcGRZV0tJS15gXWluZH557c/SzNXR3Xx7dGJZa/d4aOjd0M7VbnBSRkdJU09PUUlJT1Jm3M/X1tjv6NrV2M/N087Q2M/DwM7jdVBXa2z64uRtZV1r89PM3+dyTlB09ODZ2ef42t3r3NDZ+G1PQEZHRU1MSElVWFhj0dL68Wtt5N7s0tv1YWBiXHjb1/x7ZV5ZVExTXFlUW15ZY3Pl7/Dp29XMzcfAxcvM0tbNyMTM3ufk7el+7dnpWlxbVVxg7+t8W294bGhn6fJbW2pkcOzk5/pXWV762dvR3l5WU0lPYnXx8WFffWvl4NXfbv7+ZV/w7mRWSkpaYnLo1M/hbmBjXuzY2+JdVmTs5NLMyszNz9Xb0svQ0t3e493r2s3U2+Xe5fLrz9vxaF9ra2boztnd/mJYUlFmaFxcVVlZWF9vbPh9cVtaYm95bWFQUFRcbN7b3eJrWVxw3tbg7mNja2/q0s7V19/ueXro4+nk69vU1dLPz9bX3/vx5d3j8fB4c2Du08vLz83aXlpZW1dQVUxLT1Recu593t58d2pvc2ntdWNjenV64drU3/xdWmbr8n1zW1hhYGnu9NrmbF5ZXWhYV29mbu3m4OVu5fxcWVdVUlpw/v1wZu7i09PUzt3q3ubrfWf4X1H84PXe6OHc8/ztfnxvXlleXGHqb3F96dre6ex7dN/p8O3q6Oh6empldl5XWF5XUlFWW2L73+nn7erd+m9sZ2BRUVVPWl1qbHz+/Nt1WVlRT0xLUFJdZeTc19bbyc3MyMzP2eXh7W9vfvrzfPDT1O9kT0tJRU1VTlFdXGn+fd3X2dnR0s7b2trj2tLTy8zVztnk8GhLSkdITEhJUFJUYGnk2+dsal5ZT0xST1BnZW7t+Nvh3erb0tDvV1pSTlNaXXt+3tzU3ej2/35v5Nzf3+Bw8/f6ffHe3+nt6Pvp+2tta/7b4OLr7vd58f/6bnV86PlpbOrq8djP1epjYV9JS05XYXZdXmdbXFFUT1JaXFdTUE9OT1pdat/P0NXX1ev29eTWzczW7d/S1Njm5O3yX1xz+mRcfG554dTN0/RuZGVjW1xiePzkfXf+bOTZ0czO2m9aSUlPS0hJTltfaObldXVqXn3r2thpW2JgZ2fy5ODqfHhaVVVeWVxtaWJVUF7p3d7g3OPZ1eXb2vPn4N7QysfJzt9wW15cXmn+4PhkZltcc/nv5OJsXlpTU1JQVl5fbXz35u59dm1v6+rybWZwaWB529rT2d/jaV1hZWn53tXS3dzd3N/r7/pqXFxRTEpPVlhaZeLQy8jK1N9mV15pW2fp7XRt8tnTzsnGyt17b/tpXl1jWldr8nVdW1JNUGZ28mtZXlhVVVjx1NbW0t799t7W38/HxsjO1dDN0N3u9nRiVllcV1RSTElg7PHwaFpVUVRPV1lfcuHe6N/OzdDHw8LCx83Y4+F9/d3m33RgV1pdWk9KT1ZYeuZ+9nLk6evW1NXc9GNlbX3s2s/LzM3PzsvIyvFvYVNQS0dGRktMVHTb2NDN3eLd1dru5dzi7evp3tfV09HX1tfa8ldWUEtFREtXVVJUV1VPXOrl3dLT1d3569rT0NbQ1d7a3+R13tLO0dDQ3+Z+dm1gbVxbYlJMTlBSWGne3NvOzs7O3ezx7N7f6Ovx6NfqbPro3ODe6mlo5uJnXVZea3r6YFxYWFdSTk9afGtZYWRqednJx8jO2fDq4ujp5tjU0c7VzcrMz9nf4OPt8V9YXV9kbuvc0c3Te33vZFhXXVdXVFNQUWRv+97d2dTc+O7c2+hkcOt67OluWF5kYXBmbt/d519XT1FTWmVeYlxXVU5Tb+DSzs7Jy9bOzs3Kzdvg73NoXl9PU15ya2X79/ZuYF9q7dPJys/Y6e584NTN0d/5b2ZdYlpVWVpgbWVp/fVYS0lNT1locGl8dVJYbu/k3NHZ9nZlXnDt4Obz+vrv3utleW1qevlwWFFYV1BacubczsvR2d5nXmlz39vb6mBaYl1s69/b3NTg5dHP3u54eWhiblxQTUxFQkRKTFZaWVtVTUxRXX7v3u1pbW/v3dbPy83Hzt/jevxnU1ZWU1ZYUk9MS05baPjp4HhfYVpg8NPMz8/P2ubp2M3N5f1kXV1QTkpITExPWFxieWBfbmfg1tPO1dfhYlZYUVpeX19bbmdYV1ld/nd3+frh5O3d8Hbi5trd5+hsX2Rbber23eFqa2pXVk1b5vbl7GVXUlZXV2dnbPt4+/5lZWh36e3k2N35ZllVTldeWWNmW1BPYmRfZ+xqa+z0dGDv19fJyc3LztPX3edyZ3BiWWZ4YVtWVFdr3N/11t7zbVRPT11dW2z1e312eerj2tTe2s7T3u5wbW37/WXq7GRlWU5NVm3wZVxWSEdFREtOT05WeXd33Nzgz8i/wcG9wcnK2N/e5urm1+Br/fZYXmdlZ2VlZ1ROUU1WXv3k2NHV1tTW2tDQztDX2OxpY15fa2tjbG9iXVhTTExUX19h9XVcXFhPUVVRV2RcUlVcW23VzMvJxcPHy9DU2N3e4ePq6uj4e3v65eLd1thzVllaYvx6897d19LS0tLTzs/P0s7O3P76/nPtcvPW33plUktLTFNTUlpbWFVSU1ZVWFxoannl4+Dj28zIysPAwsbQ4e98bl5aWVBaYl9hYnTa29vP0tPZ8HhqYvvq29DT2dzi7d7U0drU09TU3+3z9Hp6fnZt6vFrVktQW1lo7W56bFpaXVRWXlpQTlRVW1983c3KxcPCwsnO3e9pcHFsamheWVFPWWJkaWRXYGJcXFtZZ3fo2NDHwsPJysjIzszK0Nnj+vNwY3DxXvhSXHVKWl5eZO/49+Te/mNZTk1TU1leWGFYYO7l0cbDw8jMzNXeb1RWUk5SWGFkXWf/99zb3OBs93ho+WRj83b++fv16OTe9+vP1M/O0dDpbWdf+u/1/2RXUkxNU05i/GdtY2h0XlpSTFNUU1363dnf2M7KxMbGxsnS5m9eV1VXVVFSU1RZYHh47+v49vZ6XlljZGR54dzZ1NHP2t3b3tTP1tbd6XJhWlRTU1lSUVFXVlJb//T3dW7veWJVT05QT1RTU1dYb/Tr39HIwsG9v8bU8PDk6+77XGhgWFdYXXZ6+/tj725fWFBbZF/u39nO09PN09HLz83Y2tTuXVBUXFtbW1JRTklLUU1Sa/R+X2pqV01ISlFPVVVSZWFed//jz8rIyszI0fJeV1hleXdma35meePl4M7N1+Hg6G1YVF5mfH7/89/o7+fj/OXJxMnIyNXqbHH+49vk/f9wVVBSVFFeZVlQVlJIREA/PkdKTE9YXl9s+N/TxcHCxMfW3OvyeX3nbV5eb19kX19c/d7i5+38X15PTVzm2tHU19fb2dXU0MfMz8/N3fpqUk9RWVFRUVNRUlVZavLzfGllXE9PTEtKTUtNT1RfVlNeYn3Wz83LzdXe6vjs3d3j3uj1fG/26vP1ZVxdW1pPTEdHSUxXY+bt4d3Y2NLJw8DExcvNz9vh6O/ufW1qXmNdUExLU1pWU1BSV0tAP0BGTk9kZFz+9eXUysXFxsLByNLg3vBjZXJhXVthW1JQW2ZqbWRgX2RTUFRSVWTz5ev74Oz24dTU2NfZ1tLW5PXw6+nZ1t5rbn5dWVxjWVZjZFxUT0hAPj9FTlhWUGJxXGfZysrEwsXIzMzR3u7g19Xb8W7o9HltbF1XX1pTS05MSElQZeLf4N3cz9HMycrMyMbKztHO2n5nX1thXFpPTktLTlRQS1haYF1bVlJRT1NffnVwe/rv2c7N0cnFyMfIytHZ19Pa1NTf3un16uLwZVd272r9+V9bVFdgad7i+Orr3tzd1NXVzM3RztDWz9zgeGd1W09PUE5UT0xNTE9KSkxGQENKTU5TYWBr+9fLyMPAwr+/xMHEy83O1dPg7XxcY2NaWFRVWVdbW2p5cGd67+Ti8N7Y2dDMzc3Oy8nMzMrIys3O1d/de1paTkxQUFdTUFdYXV9YUE9NSUZKTklQUUlSZfz6/NnL0c3GxsTEwsLJxcjU1dzw3+PucFRZUUhNTk1PT05OWPVhV/L34tHMxMTAu76+u77BwszS3t3nTUdHQkNIR0ZDRUpHTl1YVlhTVE5SUU5aXWTv2tXT1c3Mz87S0c3N1dbX2fBgXlpTXGhmamhrY2NydGBjXl5haPlsam/27dzY1c/OzMfCwL6+v8LFytThbVZTVlRZUUpHRkRAP0RJR0ZFR0dMTUpOX33oz8XBvry+wsHAwsnKzNTc3W5WT1FQS0hGREVLT1RefWts9/hza+z7++ra0dDLy87OzM7NzMnGx8rXb2ZUR0ZGSE1WVlheX11XVldRT0xNS0dMTEhKVmFq/vrfz8zKxL++vr6/wcXGzeBvde9rXU1GRURAQEBJS0tPTk9ZWVJWYOnUy8TCvrm6u7u9vcHDxc7cfk9FPz4/Pj8/Oz5BQEpUW2BfYlxdZmdqamzp2tXLzdTP3OTh29POysrR0ttuXFVaZmv37GVv8nx0dXl97P1ral5WUktHS1JZXWVj4tfUzMa/vL2/w8TK1edmXF5bUEpFPjw5Njc4Ojs8Oz5CQkA/Sljn0szAvL26vL++vr6/vcDEyutcWU5GRUA8Pz4+RERKVmVx7/jr3tvc4tDNzMfFw8PJytDPy8vJy9j4bVRFQD0+Q0hLS1RTUVhWU1FTV19mZmNdT0hHR0pQTlBaXnT86t/Ox8PBwL+9vcHFycvW3PliVk1FQD9CSUpMS01MTkZIUGzj18nFvry8vL6+vb2+v8TMz+taS0ZFPz49PDo7Ozs7PD5BRklNX/bu5d7PzczIy8zLztPU29vSzc/haF5WTkxLUFJUWlNYYGZjWlx42tnZ2dvX5HBdXGFf+uTk19TQzsfFw8LHxsXBwsjP3t/xXFBKREA+Ozo5Oj1AQ0RHSEhLU3vh1M3Jw8PCxsjJy8fExMXJ0Nbcb1xPS0xKR0ZGQEFERktTX1393dfMxMXJyMPDxMbHxsfKysrOy9Df62pYTkxKSkxUT01VXFRQSUZIS1ZdbWllXFhUU1Zba21+3uXr4tzPy8jKxsC/wL/AxtPp6l5RS0lGP0BDRUdOUlNfXlZj/vHczcjFwb69vr29vr6/vsLJ0NxsXVJKQ0VDPT49Ozc2OTs9Q0lWdt/Nxr6/v8DAwMLDw8vRz9fl9fldWFhYWFlZXl9p/3Vwdv509Nzb5NbNztLY3vllXltk8vLj3Nzj4M/M0NjWz9DNycrO3eJwWFlQSkdDPj9APz1AREJBQ0xUXXbf29rSysrJyMjEwMDAwcPFy8zV6V1TVk1JRkdFPz9BQUZITWTr1cjBwsK/vr/Cwr+9wMHExcjOz9nhalVSUVBRVlNKTVJOTUlISEdJTk9aWFhoa2VfYmVu7Ovt5e/p39/29/N85tbUzMvR2tjS5/fo9vbq+m5ka/34eGdecfp67N7U09zPy8fEwsC+vbq6u77DxszfaFxPSUNAPDs5Nzg3Njg7PUJJVnvo29HLyMvLysrKzM3R1dne6fBaT05PU1BdXFdaXXNsWlpo8+3i1M/MzMnL1PDo4+3u39Xa3dnSzM3PycfIzMvIys/V0NTzXlxbWE1NSkZAPT89Ozo9QkRFTl5ude3Wzc7PysXGv7u9wszKzONsVlhYSURCQkM+QkhJSEpZYXDbzMrNy8bDx8jHw8HGycbDxsnL1OtwZ29dW1xXUUpNTkxKR0tQTEtOWVdPVmNdWldi7W9oYV9dWWV3a2dnd/9hZvfd3ejb3t3h++jl835yalldaV5TTU9WVU9VV2ZdX/X0493QxMC+u7q7vr68wMjN1uFxTklFQD09Pjw5OTo8QEBHTU5RbNnS0tLOzM3OzsvM0M3S9GBXVllVUFFNSEVMVVBSXWp+e+rUztDQzM7W29LNyc7c5HRbWvzk7vTn3+Hn3NDQ1tja4vd2anBvWldSTkdITEM+Pj09P0BHUFNPTlFWX/HYycXGxMTLzsrK2+3y/3ZkWFtYT0pJTEtOUFhkWlxwcn7j08zP0NDQz9PRysvOzMrP2dHU2tjc3+RnWFtaU0tNT09OTlVdVEpHSUZES05YYGNpYl5eaO7levT06XRx39zs/npsYGPw8+Pj6On9cnbp5WdYWllWWvDW0+Hn6u/v187IwsO+u72+v77F1dzm729nbXhdSUE9Pj9EQ0hJRENGSUpWZ19cZW9989vU0tTa4/lmZGFaWExMTEtMUGBdUU9XZnjj0MfCytLY4uPd3NHP1Nna2Nvf4XpqbfXj3dTOy8bJzs3UzcfIys7Q0+Dv7+5vVEQ+PTk4Ojw/Q0JFR0pWZuLTzsfEwsHAwMfV9lpVUFRhYl9ZTUdFRkxSWlpcXlpn5M7Kz87Lx8TFvry7vsPEy9HT0tLT6/xmXFxebGdaU0tMVl1559jc5mdZXF5YV1xZVlVYWPzyamJWUVdYZ/fqdFtbV1Vabt7S2dfR09XTzMzX9VxWV1RRWGhhX1pYX21959PQ09DJxb+9vL7Dy83Pz87Mzdne+GBZXmJjXE9KS0dESEpGREhJT1hp383NzczOzc3P0tPX9l9cT05RUExOTktNWHrf19bU2OHb1NDP0s/U2dvj1cvO3dvh7fPs49HK0dne5ObZ0M7M0d7Z3eja1+poXExISEdFSEVCQD4/RE5cbu/r49HSz8fJ3eHsaGRcXnfwYFpcX1xcbffl+Vtifnnl3eJ+7Ofh2tXUyMTLzs/MysnLy8vP29nf3dHU5GZqbHJ4/eDO0Nzn5W9dYFlNSERCSERCSU1LSU1XZvv25dTa4ezweuXW1NjZ5fbh7ejd+2VeWFlYW2F3cWFodG1q5NXQ0dDNycS/vLq8w8jLztTZ19DY/2ZqYVxjbWtdU05ST09PS0VAQENITFJcb21lcXp289rV6XNhXlxSWmJWSUZLUlhcY/De5+bUz9DPysvS2Ofd3/Hs7mZYWV9y5d7Z0dDa39bRzsrDw8bFxsPFyMrO4XFoa19XUkxNST07Pj8+QERFRUtU7N/ez8vP19jU3O79+O5jT05TTkxLTEtLS1NmYmVsa15s8Oncz8vGx8zNysfJxsTGy87Py9Dg4uH9XV5tc3RtcOn6b2zl3ujp+2lTS0tNSURCRD88PkFHT1hgbmhldPdoeHhrX11k5+J0X2ZfTUxRWVdZWWFlV1ZobGBpbm9pau7QysvMx8bNzsrIysrJyMzV3tjg8P5xYVtl++r4Zl1dTUdIUVdPVWJiV09QWVdba3ljYGb0/V9YWVxRSUxWUlJSW19YY3v07uvf321w9Nzb6OTsalxZYnFu5tDLzszIw8fMycjL0tDKx8vT2t73X1ptal9dWlZLR0hISUhHSkZBRk1cZW3k3ODf2tHX3NzibFtdY1lMSEhDPT1DSkxPV1taWVzt3dbLyMXIysbGyMrLysvX29zh3/F6bGl5e+jd3dzZ3N7Xz8vL0NXV62VkZ2BbV1FJRD8+Q0JDSlFbXnnd3OXu6uP0e+zn7/xqX1dTT01QUFBXWFBQU1ZVXnPt4uni3NrWzcbAvr7AwcDCwL/EyMrJy9Tc7m5eTkpOT1ZbXFtVUk1QVFtufGdgXVxhW1tcXV5aW1tVUVRRSUZJTU5OTk9PTE5Ya3rt4ebocV946d3Y0s3Q0tjg3+Hn4ODf1czGyM3Q1NDP1M3LysrLz9PT0tTZ2NrZ6HBtZF1XU1BOTUlHR0VGTF1mbunh5eLg5+x5bGRmX11XTUhEPz9AQ0dLUFVbV1hh8d3SzszJxMLEw8PFx8rOz9DSzsvO19na19fW0tbk9Pzq29jSz9ne7/fwcGxnYF9aUlJQTU5RTkpMVGBx8/FxXVlWWF1iaXZzW1ZWVVNRTk9MSUlKTlZWWV5eZ/va1c/KxsLBv728vr6/wsbKzM3Q1NXW2+x+e3l9/+vX3+Tc2NDO19/k39ztbmhib/ZxZllWW19hYF1bWVZSTk5SV1RNSkpKTVFbYl5UUFRcW1loevfs5t3Y0M7R193k28/JxcPBwsPGx8bBvb7AxsrJyMjN1eDofWJfa/b5ZVRTUk9NT1NaWlleanrk2uD0Z11UTUpKSktNTExIRkZEQ0JDRUhMUFhgZ2lyduXbz8jBv7++vr6/wMDAwsPDw8fMzMzMztXc3uDY0c/Ly8rNzsjIyc3V4nBbWlhST0lFQDw8PD5CREdKS0hDR0pQUVNUVllaY2BkXVFOSUlOWWh3/+Pf4NLNyMbHx8zMx8G+vby9wMTHyMfHys7Q09fZ1trzcGdfXlxeY2RgV01LR0E/QklISkxNTU1PT1BPTk5MTU1MTE1RVFlga3jt7Pjq4t7k3dDPz8/R09HP0NHOy8vKzNDW1tDO0M7O0dzo6etzYFZSVlZZWlxXV1BMTUxPV1tcWVVPTVFZWlRSU1FVUldkYGBpa2tqZXD+dnd573b+3tzf8G5odfHk19HT0c7U0NLV0NDP0dXW2dHR2eDrbWhyamleVEtLTE5RWF9iX1xeaGFdb/Lm8mpra2BaXGVhW2VmZ29wePXx8Oni3tra49/f4NzZ2djZ5PX4/WZWUk9OUlNPUlJOUlllbmpq8/Nx8uHq/Wz99Xnx8OHj9mdnX11l9+fk3+Xa393Rz9DPztHb5uDg4uLd4exub+rd43hscnBUUVFNSkVFRkVLUFtnWlNbZV1cbOv3eHF4cF5gXVtiXFtbWGFn+uvu7t3X183JyMvJyMfLzcrLzM7U1N3j29nP1+Dh7mxYXGheVllWVExHR0ZFQEJCQERISk5MSUtKSkxVXF1eXF1VUFVdYWlsa2ho7+HXz9HQzMjKycTGx8fJy8/Sz9LW2ur+Znno187P1tjY2NnW1OLzZ2JaT01JRUE/Pj09P0BFQ0BCREJDRklOTk1QWVpeam9+8ujc3dfMyMG/vr7AwsDAwsTIy8vMz83MztTT0tfa1c7Nz9jd6nljZmZfXVNRTklJSktMR0lJRENESUtJSElLR0RHS0xJRklJR01ZaG1m9Oju59LHxcXDwMDDxMHAxMnJycvMzM3M0dnZ4fD+7eLq6e39/mdt6PRmW11eXnLu6eJwXmRhWlZfXVNOS01PTE9cVEpOW1RW9uPb1uDc2dna2NPV1tjW0NLUz87U2dra4NbNz87P2d3a4ezo6XRoZGlrYmhnX1RSUVFWWl9eX1xTVVJQVmBycmv46+HY083Q1dTS0dLNysvQ2ODf+mRsc2VaXHtuX2736Hhpb2tvbd/V3Ox4e/1lY29valtgdmBf/vl1XVZYU1BacHFmXlxtcF5p8OXf3tjPzsnCvr7Bw8PGxsPCxcvR1tfg8OPe5Xh75/Fz+ezyXlFPS0dHSktKSERGR0JCR0dISE1aWV165eH1de7xdu3c2djk/enl7eTd3dvYzMrMycfIycrMzdLQzcrLzs7NzM7X2dzx/Xvq8WZweXVpXVtUS0tOUE1MTk9OSUhKSkdHSk9LTFNaXVlXWFZPWn3Y09bQztDTzMjGycbBwsbEvr7Dx8XCyM7My8nNz9DZ5+ne3efx7vZrW11eX1NOTUxGQ0RHSERERUdDREVGQ0JESEpJTlVUVlpoeWr83dHRzsfGzMzKycbHyMbGyczLyc7S0M7Lzc7Oz9fZ1N7v6Ox3Zl9fWltZXGVhXV5jdW1cXV1YUlJQR0VKSElLS0tLTExTXVhfdffq8fnh3N/a0M3Y2tLW1tPS0M/P0czLzMvMy8rMz9DY4/D+XU5VVVJQT05NTUxNWl1VVlFQUVNUV1VRVWRZVGZtdv7r49ra6NzQ2d/d3t7j4ejl7Wlu+GVz6fPt6+7m3+nu3uD2cmttcmpqYFxbWFdYWWf2e3vv6urgemdwaltaXVhcXlpZWFNVW1dSWvXv59nVzczNz8zMzcvMzs7N09nk4+Lb5OPW2uvp5+X8b2ddWk5LTExHR0ZERkNBRUhJSk5QVVpbX1dVVFpdUk5RTU5ZV1lmcPvd09PLw8PDwr+/wsLExcfNzs/Z29bX3Obr3t7h6+Dm9ut9ZlNLSUhHRkFDQj9CRUlMT01PU1hcbW1gXmZxZFdeWVBMSk9RV1lm997c2M7Oz8vGx8jFwsDFx8bHyc/T0tXQzs/P0NbS09jd3Nl9Y2NZUUtJR0NBQEBBQUREREVHRkdHQj9ER0FGSE1NTFFdamNia+7c2tPJyMvKxsbLzMTEyMjHx83Pzc/V1tfW29/a3Nng6PlrZVxfYV5gXVhbW1/06fHsfmdeZG5scGFaVE5IQ0NFRUVFSEhHTVNWWl5hbXzf1c/Nz8zO0M3MycfJys/Ozs/KyMrOz8/U2tfZ3+x9bl9fWVNWV1VWV11dXmtcU05QVE1MTU5MTUtGR0dHTFVUWGv239nRzs7R087O19zY197g4uPu7fXq3N/o6Plpbnvo725fZGNZWF94bG5oYGJ589/Tz9PW2NXR1NLfaWd6aFpfaWhubl9RW2Ft4tXV19LS2NrO0dne3trj6+7y5eb+al5bXnz7dXBmY2VncvldWVNRX1xRWlxZW1heY1pcaV9lXl5lYWRkWlJOTlhfZGt57+fg0szHw8LCxMPDwMDDxMTJz9TW09rk7+57eXz+cmdcW1dOTEtRTUhKTEhDQkVIS09aZHL7evLrevrtdW9neu1oZHVtY15pbXPs59fNzczKyMXGwsDExcTBw8jJyMzU3tzd3t3a0tHW2tvc3/DvZ1lXTlJQSkxMR0FBRENGQkdMTkhCRkVERk1LSk1OV11XWmB1fuDX18/NyMfDwr6/v7++vsLGysnIy8zO0+h44+Pl5uDj73tzdWleX2VdVlNWXnBlZWxkX2xwb3Z273ReWllaV09ST0xIR0tQWFtv7Ofq2dXR0c7NzsrGxMTGycnT09fX2eDb3tnW293a3+jo3d3p4+Df3/RzeGxraXRmYl1faGNWVmVcU09OTk9OVVVST09RT1FeaHL559jU09jPzM7Ozc7Q0s3KysvMzdj3YGZtfm97bV5bTlJTW15aWltVWV394+Dl9nFud+nc4dbVzs3S1NPW2d/sd29xa/zs5+7t8efj3t3Z2N7T1djR2d/lfWdeZXP8e2dfXGBlbXJpXFdNTUxLTlRbV09LTExUXGNrdVxTT1lhaGVt/Gtzb/7m3Nzq7/v67ebh29LMz9PSz8vKxsDCxMXN0tvT2OTs++73X1ROTUtISkdHQj09PDo8PkFER09QT09NVl5oa2f39nzn69vS1Nje6enz4t/Uztrj7ODd2tTOy8jLycnIwMDBxMvQ293Y1MrLz9bqbVlZXmFZT0tJQT0+Pj48PD0+P0BBRkVBQD08PD9BREdKVFhPUFpla2vo2tXSz8jHzMzJxcLAvLq7vL69vsPFw8nQ08/Vzs3S0N5xX2FlYGZhT0xHQkFAQERFRD9BRElNS0xLS0hGS01PXGh3YlhWWF1m5tbV3dnR1s3LzMrNysvKzczFwcXIzMzO1s7LztfZzs7S0tPV3OP5aldNT1NPSkpIR0NDSEZEQ0ZISElJTkxFS0xLSU5t82deZXZydtvX5m1xdu3f1MnHysvHxsnMyMXDzdjR093c3N39Y2dw7/3v2Nr3ZGJaS0hMTk1HSVJOUlNWV05OWG5pX+XY4Xdxfevy3dPU19/Tzc/Tzs7a7vTr39jWzMnM1tva8Wpu6OFuYnNsXGBlalxceXbu7ODS1e9wZ1tOR0VHRkJDR0VCQkRCPkBESUpLXvj2/Ofa1dXOyMfHyMXBwMLBwcXL0NbX2tfPztrp8mxXTU5QTUpNT01NVVpWU1ZaXV9l7NvmZV9ZTEZCQENCQkdUV1hsc2Nj+uLY19fJwMnMxMHFxL++vr/Avry9vby/ydDb3+l+e/fycGFhV09MS1FSTUtWa1lcY1pTUl1pWk5QWlNLS0tCPDg4OTg5Oz5CTE9ZXFxl5tXa18rExsjCwsTBv7m5ubm5t7m5t7rAxs7a8l1eaFxPUFBOTUpPVlZVUlFPT1ZlWFFUXfFgVlNZWVhXUE5JRkZFRklGSUpTeXloZ3fd09LLyMfEvr++v8C+vLq5uLi5uru8wMvX4PxYUE9NTUpNVlRPUVpjYXvh621q5+dfTklKSEZFRENCQENFQkFGSEhJTldVVF7n29/n397d18zKxcHDv7/AwMDDxL+9v8XMzcjM3vxmVE9OT05RUE5QU01OU1BVYHVuW1BZXlxTUExKTl1qeOfs7ejm6d7n9/Lf19rf4dfPz9HO09bWy8fFwsLFxczNytHazsrP09na1tb2ZVpQTk5MS05WWldaUE5NTElOTEpQSkVHSkE+REdHUFhhc+re1NDTzMzPz9LV2OLZzsvJysvJycbIwr/FwsPIz9bc49rg/W5lYGdr+3NaVk9GQ0BCR0tOTVJOTE5STk5TVFNPUlpjVlZ592d87drPyMG+vsHCw8XKzNPSzszGwcPGw8PHx8nJztfa3eN6amx4aWFfW2Bgb3VmWk9NSUE+P0A/QkZHREJFQENJSEI+PkBETFdfduje2M7KxcPExcPHy8vMy87LycjHxsO/vsPAvsXL4uvu/n766nvt9XV+evprWE5KS0lCRUhFRUZKTUpJT1FKVWNtVUhLSklJVGPo2tbOy83M0NHO0tLQzczLxsbCwcDAwL/Gwby9xs/Q72hbXmry6evj4N3mb2ZnV0xFQkBBQj8+Pz49Pz89P0lPSEBAQT9AREhMTV3u39XR0NPY3tzh5dzPy8rJxMPAv8DEv7q7w8/O1+ZpX15bXF9u7unmc3P7b1hRTUxMR0hNTU5XWE5KVWrxUURLQ0E9Qk1RT1p34tra29DP0dTQ0NPVz8zPzMXAv8HDvLy9x+XpaFdQUlddV1VZY2lyc2j8fGFWV11YUE9LRkNISUpBQU1KRz87Ozs7O0FKSk5efODRztDT1tTb2t/Y0tvXzszJxcbFx8PBw8DL3eN0WlBVWFVZV19qXmBr83BaUE9MSEdITU9PW1xSSUpaWlhPSEI/QENHTFFdbH7e1MvJx8PCytXTzMvKyMTGxsbCxMW+wMLJ2d3waW1gZl5UTU9ZZ2hlZ1tNSEtKSUdDQ0NBQ0NHSEhLSkQ/PT09PD5AQD9ETlZu99fR0cnHyczJxsHDysfExMLCwMfFycjD0c/S2uF49fddW1xidWVcXGdgW1VXTkhIS01NTE5UV01QVVBOS01MSEJFTExOUFdZW2va08rCwL6/wL6/vry7vL2/wsHDwsPBxsrO0Njr3Nnf4fx38nd4ff91XlJLSkdIS0hGQD4+Pj5BQ0JGQ0ZGRUVESEpKSUtVV2fr3t7WycnIxsTFv72/wMTJyMPIycjOzszIw8LEx8fJ0NfU19jU2N3d53Bva15YTkxLTEtNUExNTVBOTkxKTFBNSEtJR0xPU1xf/N7PycG9v8C/v769vr29vMHDxMnJxsTIy83Q1NXUzMnP2Nja2dvY09bgZltYTk5TUE1HRUNBRkdMUU9NSkhEQ0FDRj89QUdKVXDw59rSzMbAv727vb/AwMTGyMjN19TLzNDOzMzV3OTt3tjUzs3V3dnZ39zrdmVQTU9MT1heXlROSE1TW2FfXFROTUxHSE5RVlZo5djIwb28vsHBv76+vr7CxcnO3tzR19ff9e/i2tPS2N3j+Xn46Onr9mlhW1JOUU5LRkA9PkJER0RERkVGSExQWFhPUlRWW2X93tva3NbLx8C+vLy+wsfM0NXV2eXs6OXe1c/N0dDb2dPV0NLV2uppXVteWVVTTlNTT09OUVBMRz9AREdMTVFQTU5QUVdZXmNt7NnOyMTAwcPGycfAvb2+v8PN1uXt4Ojs6PTe1M7JycjM2nBcW2v8+fJsVUtIRkZHQ0JFREJDSkdFQz88OTg6QUZKVFpOSUpRV19l+9nUy8W/vr6+xtPh9OXVz87U2t7n8Onc1tLNzMvHxsjN1ONyUklMU1tcb3ZlVExMS0pISElGRExPT0xHRUA7Ojw+RE1PWVtaX+/SysjEw768uLe5vL/I2HBke/Xd19TQztTTz8rMz9La39/R0N1wXU5BPDw/Q0hLTk9NQkBBPz48PD4+PkNGREI/PDg3O0BHTVVs3NLYzsfHx8jIx8rLyc7X5HVbUlRr6c/KxL28vcDCyc/c7nNsY27uZFlTTkhBQ0xUZF9db2FZVE5MR0VDREVLWVxOS0pFREVNWv7a18vDw8HAwsTKztXUzszIydDX3+f9fenYy8fHxMXMzNntY09IQj4/QklLRkdEQz49Q0pNTVRaVExLS0ZAQkNCSFFh/WleXllaVGDv3tPOycfJy87T3ejq8+3lz8jHy87Ry8zY0MnFw8TIzdt8Z1ZLREBBQEJMV1NPTk9WUVBdZVtXW1taVFVbU01MUV1r3s3JyMvPztHY183M0MzLysjMzMzQz83Ky83DwMHEy8zL0t7i1Nvd3vtzaVdORj48Ojw7PUNFSEJDRkdISEpOSUxPT1ZVWFtYWFpt6N3Mx8PDx8rP2+51eWlg8+PY0MzJyc3Lx8LBwb6+vsHFytPd63z0ffft7O/48XBXT01JSUZGSk9TT01IRUdKTE9YWV1v9+zf4vn04dfPyMG9vcHGyM3Rz9PW2NjYzczNyMXExsTDw8HBwsPM1trzX1hOSUZIR0lNTlJYVU9LR0RERUNFRkFESEdJTVFXX3Ht2dfS0NDR09PU19vX09LW4NTW3dXPzsvJysfHxcPBwcTHx8nLzMzNz93n6P9nXGNfWVBXXWdtXVpcWlRST1RSVU5OTE1VV1hgfuPU0snIycjLy8zQ0NXe3t3QztTa2dPX1c3Iw8LCv8DDwsXGzdHY4uXt7O9oWE9OS0lKSklKS1BZTUpKSklISEdJS0xSV1ZUVmJ08eHi2tXZz83V2Nvj8nT3c23z3NXT1tjT0MzHxcXDw8PBxMnM0tt6ZW1sY2509u1yZF5YV1tTU15oZmZbVVRSTk5XWFVaXWb37eDd3tza19nd3NfT0NLV09jc6PXs4d/c1djX0M3O0NLP093a2dvp+/lvWU5LSUdDRUtLTE5PTENAQERERklKS0pNUE1NSklLTE9f7eXq49rnbmpla/z63Njb3dnW3eHn5eXl3M3Lzs/O0OJ5bnr2dn3n5f14fXNlV1FQTU1WYF9WUlVTS0hKT1JPTlROTVNWUk1MVFlaY9zW393c2d337N7f3t/d4end3djY2dTS09rT0dbY4uXudV1eXl1cUlRSUVFRTk5OTklGQ0VJRUZIRkNCREpHTE1PT0tLS05QVFtdWFdXZnJy9Pl2a2Vnef/i2tHR1tDLycnMys7c5Pfx/PXp5eXp6vv23Nne+Wtu+3BTTVdkXlVMT1lfXVZNS0xNSklMWHVmW13o1d7q397a1t/h6+bf5/ljY3hx697PyMnO0szLztDX7uHg2eXu4Ov0aWNgW1ZcXmFtWlFNTEhGS0pJS0pMSklMTEtNS0xLT2d9+XFoaXJqWFppbmZeaW50fvjj5NvX2dnRycbIysrLy9TW0M7NzczO09TU0tnr7PxqYG/w6+z0bmRsXV9bWmFdWFZdZWh1ZWN8cH7i2tXY2OHu4eH0cm/27/Bvdd/b1c7Oz8/NzMnFxsrK0tfU3d/s8OJ7c2liYFhbXVtbV1dcYmtaXV9VVE5NUU1LT1FRUVRcXFpeX2Bea3bx53rr8WttcnP3dG/s6ePk3dfXzszMyszLyMjHxcLEyMrMzs7R1tTc7O7v6eji3Nvj4NfX3ODtcWxeWVlieGhqbmFlc/bl39na3d3h4uL8e3RqZllXXWjn3djS19XW1NTT09fU2dXO19bQ1d30++z9b25uZml7cW788WpdXFxaV1tSUU5KS0lHSEdKTk9PUFlbbvLw9W5nYVddX1xcXmhvbPTZ1c3IxMTDvb28uru7u7y8vb2/w8XI0dzseXrt5N/e3tjZ29jc6/Bxa2tcWlVVV09KR0ZGREdKTE9OV1tUVVRRTlFVWmX03t3Z19XS0M7KycvPzs3KyMbDyc7P0NTY1dXSz9PS097o9m1kW1NOSk9RUFFOSkdFQ0FARUhNS01QT1NYXFVQTU5VXFZcXllbafb37dzQysTCv76+vLm5ury8vL29v8HHz9ze6fb88Pbo6O7d29/j33pqXVxWT01IRkM+Ozs8Ozs+P0RDRUtJSExLS0xMV2d749fX19vXz9DU2dXU1NHOzc7Mys/R19jU0M7Nys3NztPV3ePkbl9YUE5OTU1KQz8+Pj4+QEVMTlBSUVNST1RST09RUU9OTlBUUlBVXmRu4M7IycfDvr/BvsHFxsnM0eLm7mtUVltSTlZgaGBha3VuaXBrXllaV09KSEpCPDo7PTw+R01WUlBPT1NZXmNtcHnw5N3Z2d/s8Ore2tbV1NPc6e3p7Ory+fjp2tTY2c/T4W/66Oh2bH7p/WtgVVRVVE5ISEtOTktOWVtpbm559OPg7v1uaWpeWFdVUVFWVk9TWV5l99jT19DOzszO0eDp+VpRTUxHQkRESEtLUFhaXXje2dXQzdDX4fdkVU1JREJAR0tGRUpRWV5mZ21x3c3HxcrMz9fY2N3y9e57a/Le5PLh6H7u6ubZ0dDO0s7R0tXe3ujm6Obb2+Xj4PxzbG5vYGJhVU9TT1RTWWhja33i2d7w7O19cmpoYFdaWFlMS05KT1NdaWV54NjY1NHV29zj5+xwXl5ZUk9SU1daWFdXYOjY0MrMz87O0dLa7HxmZVtQTlBRVl1cW1tXXuHT1NHNyMbIx8jN1dvc4O3o7Pvu6+bn6OPf1tDLxcC/v7/AxMnIy9HW19/n721wYF1gY2ZrZV1la2hpY2BbV19eYmhqaV1aUlNYU0tLTk9QUU9PVFFUWFhZbP/t19HOys3PzdPc3dTb7vhvXVNSTU1RV2fm19XMxMLBv8DCyM7R2t/0bl1RTU5TU1ZZXGRfeNvWzcrIxsPDx8TGx8rO0djf4Ob6+vDw/+jh2tPMzMrKycnGxMfO1t/q/WtyYFdQSUpPUVBMTExJS05KS0xKSUpNTlBXWVhgXFpgXV9eXnVp+Pxp7+3r6fV5fOvd0szO0dDX09LU0NXa4Oj6cV9YT0tMTE5QWGBm7+LSy87OzM3Mzc3W8nVfWFFRVFdYYPDo39rWy8fHwr6/w8TFxcPHy9bsfWpmXGlsZ21gcuXj5dvT09DQ09ns8nBbVk5IQj8+PTw8PkJFR0pNS0hKTllgY3puXl1tdGlzdH5vXl5sdPng6uje4dfU2M/Nzs3Ny8vHys3M0NTS1t/o9HBeWVNNS09NSEdNU1z84t3a0c/PyMbFw8nM09zpdF5gXFlXVVheZ25759nSy8fCwcC/wcDEy9LecFxNSEtJSEVEREVDQ0pOYXpz7Ozw8W5nXk9LSEREQ0RDRkhHSElJS09RV1plbmrz4e319+bd3dze7/twZf3b19na3uPo4eLe0szR0dPR1+Lj4NvX2d7g7vtwavj0a2BdXWZucGRofPje2dfV2djP0NLP2el+e2BZa3VdZX1u8urr6ujn7+3j2dzd6fH7XldSSUZHQ0FCQj8+PDxAR0lOZefe1s/X2tnj/3V4bVVJSkdKTUlLS0pLTl9w4uPr2NvUzt/a1+Lk6uTkdG9eXl1dYHl0/e/g2NTV2tbUz8jKzMnP1NbY09fe6Ozi5/ltaVpSTk1NUU5NVV/u2djW2cvH0MzI0NzsZl1WTUlHQ0JAQkdKSUxNUGZ2Xmb18+Ld5vdrW1ZWU0xNTEdFRkVKTU1PUlRw2dPPzs7NzdDW3O16bHFrXlVTTUhOVlVZY3Jua/fg5ezm4drV2Nze5fDu3ubv8fT849HNycrKycvGwcDAwMfNzM3X63ZnX11daWpl/Pv86e1zZ15aWF9ldG9eV1Ze/WFWTktLSkpJR0RAPj9ER0ZKUmPq29HNy8nN0MnK1tvuamhaUk9LTExKT19md/Dl183Kx8PCw8fGw8fO3PZkVkxJSElHSEtWXmVydujXzszHw8HEycfGys7Y2dPU2+Db4+7s9/nd19bb18/R0svAu7q+xMLBxc7Yb11lXU5EPj0+QENDQD0/R09XVFVZX2Z4altaW19cV1JPUlVTVU5NUVdcW2f42dHOy8zLyMjHx8nP2ePj+WJaUlJXU1djcndt8t7W0dXTzcrIys7T4un7a2ljampdbnBy8N/W1c/Mx8K/wsHByMzT2+d9cF9VWV9iZGrw4tfQzcnGxsjGyMrM0dje9mlPSktJQD49Ozw8Ojk8P0FFSUdQX2h849fb3+Lo7m7+ZFtfUEtOTk9RVF9lafHb18zKycTCw8bCxMrN1Nfg7XVVU1dPTkxLUF1iX3zj0dDNxcTDwcDCxcjIy9TY5nBsYV5sY19kdGxo8+TT0c7MzM/LyMjJztTc7HdpXFdUT0xJSkxMTE9TW2FgbvZrXnF8c11VV01OT0pGREpLSU1RVVdXW11jXWBx/Xbz09Pk4N/m8+Phfn52bmFcaPfl5+jd1szPy8nMzM3N1N3h6OrvfXBra/76fe7q6dzf2czNzcnIzM7Lzc7O0Nbb4O52al9bWlteadrU09TR0tXNx8vQ0+ZsYVxSSkRCPjw8Ojo+Pz9CQ0BBRExVX+DX2NLPz9DR1dvh9GdgUk5LSUlISE9UV1xfcPTo2Nvg3eDk6vDc1N3k5PV7ZWZtWVdUUFdrX2Xu4NrOycjAvL3AwMHHys3R8XtuXFxkbV5YWV9aZfPs5dbV087Ny8nHxsfKzt31eGpfVk9HRURFTVFQUlROTk5QVlVRTERDQkBAQ0RDRktLT1lbWFhYUU9XXl1iffTv39bV29DO1Njn7fft9l9bWFRVZ3v36+nt6+fe63ttW1hcZG7r4uHb19XY1M/Pzs7S09HT0s/JysrJyczMy9Da6WBTUlZYWVxeX2v17vLs3OHb1tXW3e1+9GdeW15cTktHRENDQz8+QEBCRUhMV3Dy4d3b2tfP2ef8X1dOS0tHSUhHSk5XZnp6fGtx/O7a1djd29nZ08/Pzs7a3dzg625gXVZQS0tXc3Xi2dvSzcrJyMTGy83OztTPztPY5f53/XxsYV1bW3Hj5NPLy8nHx8nFxcfO2t9uWE9LS0tLSEZEREVLTlJUVUtHSkxRT01QVllcfmxecXVpaXf8Wk1MVWjk521gXXLc0M3b7m907/h8W09VZnBwX1FNW3z4fXF1bvXs6+X4fujg08vJxMPExMXIyMrMz9rf3NvTztHY3t/q/Hpw9+vw4eng4uXe3d/c2uff1trX19ff4trl4tff5ujrd2daTUlFQT8+PTs7PT5AQUZLXODd3drb2trn29LvcW5daWlbW1tobmBfbnxx8Ovd1dTV2dnY3+bY0NjZ2u7y/2FXVFpcUE9UUlRidera29nSz8rIxb+9v7+/wL29wcrR2+N7/ex2a37z6t/d3Ovd293Z08vHyczP2NnoZ2twYF5YVFdQTUxJRUZEQERNU1ZhZVZjcWfw5XleXVdPUE9NSkpMS01c9fp57eXi6d7a3tjZ1s7P2/Z7Y1dXV1xl9er79PDo6O785t7f3dzY087Oz9LY3OPj1c7Q0NXW1dXa3eD3bW7p4+LZ09HRzMzLyMnO0M7R2dzd2dbf8Xf8+2ZgaGVaT0xLTlhSSUZDQUJDRUhKTExPWmFx7Onr7nl16dvc6XdvZmx0XV9oaV9XV1RYX275d3FzcPDm6eng5Xz87dzX2Njm825aXVtcXVhaYO7e2dfY0c3KyMO/wMHDxMbK0d7ydlxYVVFUWVhcZ19lb33s4NTLycnJycPCyczO0Nfa3OV1XE9JSEhDQkJDREVFRUZLSEZHTFdcYFhWW1RWW15cWllbY2Vvbl5ndXd4++Po5uPg2N/sd25kW2NjXVRVZGdua11aVllfXmvs8nFlfd3T1tLQzs7S0c3Jx8nM0dLX4et6/vpqaHzr49nW19Tb2Nvq4uZ9eGdmbm5jZ2NdXmbz5+7s8HZkWmJcXFpSUE5MSEhFSEhJTE5YW2RsdnvreXvsfnpoXFlYUU1MTVNMSk9WW23u8enz/d/g39XY3+b87ebqdvprU1RUWWFfWV1YX2h+9Pjt6trXzMrNzcvIy87MzM/a5eP4emz86vzv7fj4eXXw+O7a1dvWzMfHyMrM0Nvb3vdvXFVNREA+PTs7PD0+PkRJS1ReYWxx5trX2Nnb2tjt9Xl0/mNcWFtfXl9qbXl55NfZ5PPzd2RYVFdXWFdbX2FkY23y+3l6dOnb2tXP2Nzl8+Pf6eLd2tHO0tLOzs3W1c/c3+Lq7eni5uTs9/n05+Xg2NPQz87T0M3Nz9PP0tfhfmtqbmRpXFdYW1lYUEhKS0pMS0hKSUdHR0hLTUxTV1x43tTW1dfd2dTT1NTT2Nfa3+/w73hkYHBvdeXd29jZ2dzc4uj48WdRV1RQWFVWWFlbYOnW1NjXz87Mx8XBvr7Bx83V1tXb9G1zZGRiXV5daPj58d/X0s3NzcvN1tHP2NbX3djW2eX5cG5bUlFPTkhGRURFRkhMT1JUXWRs7+rj3drY5fpzfHh3YFZOSUVKTVFcXGb85ufd2tfS083LysfJz9rg7G1kYlxbWlpcaHr94trR09TX29vb2+l3+3pw7+ze2d/j4tnc2tjU0Nvd2dPT1t7g6frp2t3d433v7+jm8Hp67/Xs8Pz2e3Z3aVdKRkZGRkhKTktMSk1VVV5TUWBfbvf6cG5ubfrf2eru9O/h3tjf++N2W3fzeF5XWE5OT1VYXl9fb+3m9fbj3tzW3tvY2+PZ0ud9eFtcbuPp8N3Xz83HwcLGz9HO0tjn8F9QSEJFTEtKUF7t3tzX0NDMyMfDxMjIyM/j+mlbXVpWTklFPjw9QEFDS0xLT1RaW11XT1VSXn7u+21weX5u69zr+G5jbGh+fW5nXFpWae7x6OPq49rd2NTd5vplYF5aV09JRklLS1JbZG/z6/Ln3dXQzMfHxsHAwsTH0ePvdWddaGxnYG1rduPY1NTb3Nre73Jta1hPTk5OVWFeXmvu49rV1N3m8O9tW1lSTEdGSEM/QEBEQD9GTFFccu3b2dTMy8zO0+Z9eV9SV15cWmJkYHF8+PDk3d7i4tvc6/RnXW5lYHLwfXrl4ePd3e3s3u16a/j6ZGZ06+rk39zX0NXY0tPS0dDPzs/S293Z2ul69vpwbffq6NnT0NDLyMnIyMzV3+1rXlNHPzw6ODk7PT9CSUxUb+ze2tPV29rW1dzn5/t1eWFhZ15PTk9UV11x+N/V09fa1Nfc2+P8b2lbVF5gV1ZWW19z5tXQz9fn3tPZ7nT79fx+7dzZ19HMycjIysnL1uHq3+VvXVRZXFROUF7+eXzu8+nX1s/Iw8HIzczOz9HS1uTqbWr/a1pcVlBQUlZVT05MSUxLRD8+Pz9ESlJbd+Pa0c7Gw8PDxcnN0dro83BeW1FKSEhJTFBcb2tv+url2tDQ0dPa3OHj9WVdVFRSU1BOWVZY8tXNysbEw8XGxcvOz9Xa4uZ7/efo6Op8c/To5dzg5uZ7e/jo3t/o/XR29t/d3OLl3d3a3el0eXRgYmFaW1VOTE9TVFNTWVteYmn57N3e3NnsbF5ZVlNRTk5PUV1v8fL15NjOycbFy87T6PdyXFJLSEhLTlFZXWFaXXrk2trW1djU1NDS0dfl5+v5cm1v/ufs6+jdz9PQzM7Q0dbe5OLpdGNfXGBqbnx+/e3c0c/OztPV2uDoaFxQSkdGRURHR0RBQUdNVFdaeeDj4NXSz8zNztDR1dvc4N3n+/dtam5ka19WV1ZQT1FNTUxQU1dhY2n88enb0s7KyM3S3eLoa1pVVE9MTE9VV1pnc/7d0MnHxsPEysrM1trhe2luUUpIR0xQU1ZXY/Xe2dLIyMXHycnUzdfd2u38ZVhQXFpNSERJTU5PTEdFRUdJS0xJSk5XWlNYXGB42tHV087JyMzU5dvUz9tqam7velVVZ29bUlRYXVlTWFtgYFpaXF1VVF5qa27v6Onx4dfOyszP1Nve5NnS2t/l/3dudWpdYGFbYHzp5uzg3+rr/mt0al5ja2lpb21rZ2xybPHd3t/i4unyeHdlW1hQTUtJSktNTU1QT09YaG/x5+jn7uDW2d7g6HlpY1hcXVhSTVJcbH3v6+vd3N/a0tLW09ff2Nnc7nplWFlaXV1XXlxSVldYX15fZ3b65djOzM7LzM/P0NPd3N3d3PHt6nBdVllaU1VdXl5ravPf2NHS1NTb2Nvk4+F3WVtYVE9LSklISklHSE9TVmJt8+v19erl4djUzs/QztHZ2tzh72ZpZF9jX11cXF9aUVBUUk9PWGd89vzy6ODVz8/OzsrLzs3M0tze4OHi3uj7c2pnZ2xqeP34ffLe4/D+9u7t3dvf4eLt8u95Zl5cXWNr/e/d2t7l6ePo5tzZ2Nzb43ZuaW1mXlpVVFBRTlBRTEpISE5QVFlh9+ni3tTQ0dHSzczKzNPZ4+18/fr5dmVfY2RiX1tZVVNVWl9u7OzueGdkaHr5/W1y+vvy/Prr7uvi2dHOzMzMzM/Oz8/OztHY297f6/p1Zl9aV1lUVFtYVVVYXGz56Nzf3NrY2+Hp9XBfXmtwc3txYllSU1ZXW1tUUlBSVFNVWF5fZHzk39jS1Nnh5uLf39/o6u7t9Wx5enNkXmv6+nv6bmRcXnbq4NrZ2NrZ19vj83pnWVpgZ2ZubmdeXGFjZf/r6eTe2dfW1NPR1NTOysnKytDe8P1uZ2tnX1pWXGdsdnZwbGV57PLu6vZqXmNsbnR5dnRrZF5XT0pHRkRFSUtNUl1fY/Dc08zHxsjLzM7Q09rj+G1gX2hubG5eUFFVV1dbX19jZ3R89uzt8/Do5d/e4t/k9/nr5OTm5ePe4+Tj7OrteW9raXjv5t7c6/3x7Ofg3eDqem1lYWZjXV1ka+/c19XT2d7b1tnd4N/m9vv7d2xnXlRST05OTU9QTklHSktNVF1qbW1peu3g3eDl6OLa2NTQ0dnh29fY2t3g9nNqZVxaV09RVlpka3P8+35tevT5+eza2dvb3eXt7X52b216e+7h4N7w+Obc1tPNzc/V2trf4PRlWlJRUlVdYWNdXmZu/Hh69Ph5amplamtoeOvf3t7b3ODwd2xiXFVRTk1MS01QVl9kanr16N3Szs7W3uHq8Ozj4+bs9/16dnJoXFhWU1NXW2RtbfDf3uLe4OTr6uTs+/f1/njz7e/u5+Tn6Onp6+3t7ezw/nt3bGj97nn35+rp5uXn+G1qaGR5+PDg5eXe2d3g4vpuZmJlX2hza2Vqb2ppbm1rZGBbV1NOT05OUFJUU1ZeaW5w7ezm3eDe3+Tf4uLf2dnZ19jV0dDR1N3xb2t3bmBgXFtbXGZkY25pa/zw6OHc29zf3d30a2VgZGNfYWVkZmZkaGtvdHX1593Z1tXX2d3j6fX59vnp6fTu+frq6+/t6/bv+Pv19+7y8P337/5wXVZXUlFOTUtKTVBQT1VdWVxtffvu4N7c2Nrb3drb3drY0tPS09fY1tnr83ljY2RfXVldY19bXmFkYl9faHD16enm5ODj7O7v9P/97e7t7Ofj4eHf3+Di7PHzfHZpYmhmZWZdW2Z0+OfZ1NHQzczO0tjnZFRQTUxOT09QVV1jbfj67uHg49/e6PhuXVhVVVhbXmJ0/O7q7Ozk3t7d3ebk7f58/3j/9/rx63ZsYFxfX2RjbXFy/ezq+nZ2X19jaW3349za2trc4NjY29bSz9Pb4+n48vtpbG5peXju5OLc1tni5+50al9bWFZZVlRZYWJx/nRsZ2Rtd/jq4NvV2trX3d/f5+/we2teXGJeXGNgXWl7/PPp39zc2dnpc2JYUE1NS0tOUlRacO3q4N3j49zf6Ofp8H39eXhwfPjx5d7e19HT1dXQ0NLU2ef4cWFeYWNmaG9zeWttcWhnbGNpevl9evr+ZF9sZGBqc/Xf1c7Nzc3P1dPY397j9HJfVlFTWVteZmpueX18d294+m5paWJZVE9NTU5QVFhdYm3s6fr3+f3v6eHc1tDS19bW3u/3eGVfX2BcXF5eaPvv5+De3d/i3eLg3+bo6fL8fXdsZF9ncm9+6evv8ntiW1pVVlRaXGfq5uTd3N7g3dra1dDQz87NzMzN0dnj6O97ZWBbWlpXXmFkZFtZVE5LTExJSkpLTVBVUlBXWmH82dDNy8vNz8/V4e9yYmNpa2737+Xf2tfY2Nnh7fvu9Hz6fHhzcHFlXVtVVVRRVFlZWFdaWVpcXGBq/unl3NTU2trY3Ofh2dTSzczNycfJysvO1N3o9HhtamVkbGtsdm1hWlZYWldaXVlcXV1cXllVU05QVlt3fn71dW90bmdqd/fp493d4Nrb6O3n+nhvY2NicO3m2tTS09vg+mVZT0tISUlLU1dYWFtcXGBu8d/Uz8/NzdHY3up7+e/l4N/b3drT09DQ0tzl7XZwdG5jXnD17+fsemljY15gc+/q4tvW2N7pbFpQTVJYYmpldHZwamt4d/r5+PT57H5pb3Bqb2xiXltZWFlgbfrn3uDl5+z09HNpZV5dXF9obWJYU0tMTU1TW2j35d3U19/g3dnb29rd3d7i3tfOzs3O0dbb2dvb2tze4eTyZl5ZVFJUWVdbZGx88evweGRfXWJuefXq4+fx7ff77evh4d7b4d/a1NPQzdDX6GxeUktHSE5TVVtgXlxdYmJiZmJgXVxcV1NRS0ZDRUpOVVtq697Z1M7NzczNzc3Q0djc19DOycbJzNXe7XlrZWRu9P/79XBoX1VVWVlXVFdgZWJufW5tamd38OPa19PT297b2tzc4OPj7XFw+evj4NfU2N/xb19WUVBUW15eaGlnb3Bwa2ViXlxgZmVqYlpXVE9MTk5PUFRdXmJ3+ezZ1dTR0dHQz83KycnJztHZ+mZfWlpfavvy7urt7eLg6OrscWJfXmZkX15bX19eYWhqbO/l6uXd2t3h2+DxfnRnZ2/239rX1NXU193i63r14OTr6+/9dml2fW5iWVRTT09TVFJSUVRXVFJQTU1PT1dpffPr4tjY2tza2dbSzMbFyMrN0tnvbGFaWVtcYWRiZGdmbffo5vR5fG9vbmZiYV5cX15fXl5hbvjm2tTNztHPztTZ6PbvePXp6ubq9v7/aGNoZm139+rk5t7i7+fsal1XVFNRU1hYV1xcXl9cXmVgXWRx/O3o4ebn3+Pq6uvo3tTPz8/Oz9DT3ez5b1pSWFxaXV9jYF9obGReXV1fa2poa2ZnXVpdXl9gXmn75dvT0NLP0tPQ2Nvc3d/f6Obg6Ojo9PtsY2NbW2Fqcezp7ePh4/1iYFxZV1pYVlpdX19fY11daGZt7trV1dfV19zc7XB6+PHr4N3d3dvX29/j7/huZmxwenJuY15la2pjXltbX2ZiXmRhXFpebWtkXlxcYHD26OHm5uTb2+bu6N/n8uTd2dfc5efrfGVfYV9eavrn3+Hf3eH/cn59/G1lYVlYU1JUVVVSV1pZX3bs8eja29fT2d7i3tvX1tLT1M/O0dTU19/r9X308+x4aGdcWlNPTUtNT1ZUUlRTV1haZXf3fHR19eXf3N7c397a4/H5+vXu7O3s5uHb4OXj7PhsZGBeX2JrZ2h68/1hW1teZW1jW2BfXGBnZV9ZV1lXXGh76eDj3dLNz9nb1tfW0c7Pz9HT0NPZ3OHq83b/7ujs/mxx/W5fW1hWU1VaVlFWU1RWW11gbW1rbunf3tjX3Nnb3/JwbXZvff9rbfXt9PPr6vn//HVvenNsb2pmefbxZ15hZmFiYFteXlpcXF9ZUFBST1NeaH3u8eba29zm49XU1s7Ly8vLzc/U1t3q7fZxeOzufnF1+3htbmhlaWNeY2xnZ250aV9hYl9dYm786+fk29rf5u34eX368PL/+fDk4OTt7Or1eG5++3JtamhvdG9uYVhTT01NTE1XWlteX2BeW1paWml69+Le39vb3d3i5t3d3d3c19DS09PW19rf4fR+9/h3eHF17vD8bmdlYlpcZ2345Ofq7Ph1aGJnXmR57+fk4eHd4Obl5Nrc397f4OTh6nxte/h9/HBkYWVjYmNsd/f2/XJpYFZOUVNUWV9cVFJSTUxNS0xSX2n8497c293d3dbT1NbX1NPS0tfb3NjZ29vg7fLq7vXt5ebuc2RcV1RTUVxv+Ofq7/j3dmhiXl9leuXq6OXn5ero4NzX1dbY0s/Q0NXb3tna4e58XlNPVFBSVVdXUlNRUVVWVVdm9vT3e25fXVpVU1FPUltlePLu4uj56ODZ1tve3uHe3d/f2tza2uLh7Xzw8ffm3Nrd7W1iV1RXXGJy8u3yb3F0bXFjWlxpfO3e2Nnf5eby9url497b29rT0dfc29bU0tPb6313bWt2/mteWldQTVFTUVVZZmxkXltXVFRRTk1KTFBTWmJzfnJ2+vjp2dnW0NLOy8vLzs/Q2N7j+GZyb2Fofen1amxmWFlbWGD+8Orv6+v/9ef4bGhjZXj26uHg2t/p4+fs5+7z4drW0dTV1t/i3uTk63dwcWtq/fV4XlZXUlRXWF5idfv2+vdyYmJeXFlXVU5OT09TXmFcXlxhamz259/V0c/NzMzO09rb3+vn+/nwdPrzfHdmWV5fV1lo+Ofm5d7e4N3o8PpiXWNkbXr+7vB99fp79nxve+jb1NHOzdHT2N3c3OHk5uzr6er3Z11aU1FRUlRUWWBfY2ljX19YVFVXVE9OU1lda3306Oru6O3o4d7Xz9TRztLU2Nvc4+v3/XB1cWNjXF5jXVxYV1dZY3nv+ejg497d2tzh92FkbH7t5eHt9+3u+m97cHHp3NTSzc3U2NvY2NfcfHt9dGtjX1hTUlJRT1NYXGBkZ2xud21gYF9eXVZPUFZbW1xnc/79fvvs5uHW1NTQzs/Q1tnX2dre8Xb56vRqYWptZ25oXmBcWmFicn178uz569va5XtrbG/16H5t/nNtcmxqa2hv+Prc0dHT1tXV19fU2Ovw7evsa2lpXlxYUVNXUU9UVl9iY2tiX2BeWVVTTk9TVlZNV2diaf7m497Z08/Szc3OztLV0s/V39/e4Ofu+WRqeXB8cGhjXlhVWVppb2pvbvPf4u/9+fz29+vsfPbr7eff6e/m8vnp3dvd4Nrb39fY3d7f4uh9bGtaVVlPT1lUUlVVXF1menBhbGddZV5YV1NWVU5PUlBUXGT+4+fh29zV09DQ1dva29zU2N7Y2djb4eLsd3l8bH7ycG1sZ2ts9/JtaXF3+ePd5OXj3vNx83xtZml1bHRubGls9unc2NfX2NLR1NTW19vb5/bxeGhdWFlXVFJVVVVYWF1XUFFPT05PUVBRVFdPUFVVWl5z7unZ2NrVz83Pzs7S19nX2tzb3uPj4en7dHxpX2ducm9uZV9kZGBjbGpr9eTd19bS09fb5e75/Xp89nz9/nNscern6ePb3uXd5eTf4+Hw6+p9ZmtuW1pYWF9aXF5famNYWFtVUVVVWlxYYFtaWVBPUVdZZnF85uve1dPR0dTX2+Pi5erg3t/Y2tjX4Ovs8ndwaG36c3BzbWtgXFxdYnb169zZ29nb3uV2aWx2d3Bvbm5rbu/g2Nnc19PV09fY19nb2dPX3ep6dWhcVVRYVVNWXFpXU09OTk1OT05RUE1PWVNPUVRZX23u7t/a2dHMy8vO0dXb4t3d493d2dbU1Nrr8XxoZ25kef1pamFbXltWWmdy6+Ld09nX1t7i6Hx67/b463v282335t/b4eXe3dzb3t/Y3NrW3eHscG5lW1haWFdZVlpcXltUUVdXVlhZVVhaVlVSUlRQT1JXXWxzbu7b1tDNzdbd3+Hg3NbW08/Pz9HU1eNrZnNpZ21tcGZiaGBdW1ljdPfj3N3W1d7g4u3y/GxpaXd7ZGh68enj2t/i5NvZ3NbW1tTT0tfV2N7wa2ZkbWVYVlNUVlRSTk5MTVBQUE1QUU1OTVZYUlNTWF56cXHm39LOzMvP0NPa29bU1NDU1tTZ19v0aVpYWllZWVpZW1lcYFxpfu/e2NPOzM7P09rZ3unvd3V8aWh1c+7f5OPk8e/n5eLn5+Lp8O7u6e1zcG1ia3xtZmRmbXhpaGJdXFteXFhZWFBOT05UV1JOTVFVVVhdbvnn2djW1djg3tve29PS0tTV09bZ4ftqZV5dXV1laGVkYGdvfezb2drT0M/V1tbf7On1ZF5dUlRYWmrw4d7j3Nve29TW2djX0tbc2uDv6e90fPh6+GtfX19gWVFSVFFVVlFQTUxNSktPT1JaVVBTVVlcY3zf0s3Oz87Q2NbY2dbS0dPY2dzj6vFsX2FeWVRVWVxeXVlbYmr+5N3W1tLP09LP0tbf6vtpWldVVl9n7tzd2t3l3dzd29zi3uXv7PD1+GttfHB58f1ybWd2fXJ4ZV5lX1xbXFVRT0xOUFRXT05LSExQUllo9N7a19TU1dba2tjW09PX2N/e2OT57v15+mllX19jXFpfZWj859/Z29XU2trc3tnbd2VfXFpTU1lfbvjn4tnb2dXX09HT0dPe4Oft5+14/vPu6O73/W9oXl1eXFhdXVZVUFJRTExNTk9SUU5MSkxMTVZebuzi29jY1NLT0c/Tz87Q0tfT2uLg7nx9+G5jXWBsX2BpYWFqcfLo39zc2tfY2tTY4OdsbXRmY2JsePv65N7f2dzd1tjb2eLs9mb99Wpv+G726nrxeXvxZ2jy/G7/a2dtW1xWTlFPTFBOS01MSUtKSU1NUVtZbe3s2dbXzszNzdDX1Nnb2dze3eHn4evs7nLz/23r7PDn7vjr4+Hi5OPd5ubl/HxnXmZgXmZqa3Vscunh2tbRz87O0NPa3eXp8nFueHb//vry+fV6bG5oX19gXFxXVlZQTU1PTk5LSkxLTk5NUlVWV1ZYam/729XVzs3MzNTV19vW19/b3OXk7f/1b3p8ZWX29Pvp8ePc5t7f39jd2tfa4ufo6exzZnh3eWpbaHd2+Ojc09Tc3uXt/Gdz+Xhkb+ns8Hv16erg7e7d5PN7+u74b2NdVk9PTEtKSUdESUxKS0xNT05NTlZdZXvd0s3Mzc/Q0trb2djU19vV1Nve6e7k5/F96uTw8+DY29vc6N7g+P99+HlkaPz7bGZnYmBfXlxp6uzfz8zNz9HY2dzs6OTi6vbt5OX0dXZ4en70/Hl2ZGNua2plW1FPT0tLS0lHRUlLTFBPUlBSVlpeau7q39bT0NDR1tze3d/g3tzo5+fq5XZ69f/xdPDt6ODe19PP0NbS3Ovg5evo7PPm3/TnfV1mYVtZYnby5eTa29va6vFwa/Xq5+Te4NjicO14d/3+eufd7+fkfubk9HFeU0xPTUlJSEdHSUdHSkpMSUlNWF9n/O3e09HR0NDe3tnb2d7Y2tXZ7eHn7N3zee/f5+bZ6N/O0dfW2/D/d2xgW2hibnlz4P50+FtbXe5o+dnr1c7V0N7g6Xl5+d705dfe5ff4aGFqXGV783j5/nPs9Xt6Wl5UVEtLTENJSkZKSEpMTUxKWlde/nzr2tDV1tLd3NjZ4eDg4d3n8Pxm9Wti+/He4t/g6tzVz8/N0NnS2d/rdW9s82155+3gfV5scmxp9vDr2NvV197d4vdweurn6dzZ5+zpe21naWFs5/Z3cN7icOTtenVnVk9USkVGRkhHRUVERkRERkpPUlpu29ba1dvW2uHf0dDe2c7R1tra72309m7k1dzm2tjd287S287S3t7QfFv5W1NwbGPw7Vt5+1Fx42Xn09zTztzV1vTd2njl1+vk3tzfbm73XFvxX1/o/GNo5uxsbOluWPNdS09PQkBQSkFLTEVKSkVQXE5q3W3czu/f1ffo2N7U0OrZz+Tf5vf5Y23qeuTN4u/X3d/Yy87e1snX6s3gWnrxVFjkcVloZlBXbGnk3W/dzvPdznD31XJ41ujXzvrf1Gtx625tYX7U7XnQbV/W6GZq4+hbWV9MRkxFQUZJRkJISz5FT0pUZW/359XifeDhZ+PY3tbPy9XXzeR90nZX4N/l3NXT7fnO3GfMzPzXx+Fo399YWO5kWujiU1X9ZVD40/h2y89o1cxuZs/eW97K4t7N5F/h7Fdc7F5h3+9s8+dzaft5WXTfYFhqVERNUUFBVk8+S1tBQF5aRGLYaWjN31ftz11ay9BszsLe3sjlX93bVf3N4e3M0enNyubax9bdy8vf2tZlYeP6UnzaVlB2W0158Fh+zO9s0eJba9xda9Dd+czI59/S+V/l+Fnq1m5m2Ohe6NteYt9jV+DnSlhxR0JaUD9MWD49UkU9Um5IU9LyX9TXVXDMcl/Hyn7LwPh3yeFQ3dFb+MPabcfI/cvC8N7C1v7LzGPrz2FU2upO69BOTNRvS9/NXHvC2lLP0kpfzWZTyM9dzMhad8h2TNbjTuDQUFnQX0nS7ER22ElX1U5I31E9XF08TG89O2dGOmJ2P13KU1XI7UrWzU72wudrwc9O1sdQXMlgTsjOVM+/edy91XC/x2nIwGbewmFXy3RK1dpFXNZNUs1qTszNWN7KU1jRX0va1Vjcx3tpyNpd0NhO9spfV8v6TNXZSGXVTlDUYEnb50ZTb0JFZUo8TUo5SFk/Q+xfSeHbTfPNXlvL12TIx2DVxmxjyvhM1dVX38px38HQesnKcc7E/N/C22bM2k7c0lFc11dL3OhLe89fZMvsUNrgTWvYX3DI0GvUyf7ryelf0dNe48xfZNBtTnRwS1jhW1Hc9E9sbUVMbUZAVUw+SVVAQVhQSnTyUWrZamnX3G3OzHLnzPFf1+JT59FaY8vkXcvGddzE4vbHzvLNxOLgyeZc1dZWZdtaUOR0TvXZWm3QelLi6FFq1WBoyNZqz8tu6Mz9b83UXt7MXlzUb0tfaklY41lT3/VRaPFMTnJKP1FQPkhWPj9TTUZj7E1b1G5a0M9o1sl6+tDnWuvsT2XQblnQz13XyHLpxdFzy8Pi28LQbs/NZfDLcFPh3FJd5FtV3OZP7M5UVdB8Td/OW/bK5mDNzVTty3z5xthb0sxZaNVYS+14S2TVV1bQdkht5ExKaUw9TFw/PU9HPE5pREzcbU3f0WPewuBjzM5S8NBTTtPhV9nNZvTE0VvVxeffws9tycN+5MTkYs3OUWnSWlDZ+EhtzlNV0ntV29lQaNF8X9DOY+PGfFnV31fUxu3vydFf5s5VT9R3RmnXS07VakVm3E1F9VU7Tnc9PF9GOUxmQkjYdEvgzFliwtZazchna85yR+nPUVzI5E/Mx1/lwddoxcRp2L7aYMbJYtvA+FDP101pzllG39lIW8v8UdfRTV7I9U7QyVhix+pM3s5R98TkXcfFXXXGa07e50ZV0VZJ3NxLWtJaRGNcPkVkQzlMUTo/ZE5Bbt1MWs7oV87JZOfD51TV3ElY0G5Tz8tm4cHb+8TEetzD2O3Hyu/dxdX8y9BceNVbUOplSmreV2DN21vd0VNaz/9U1c5o6svpVOXgWGnR5mzMzXDgz/5V82BIWfNUT+JtTH7fUlHxTUFSUjw+TD46TlhGVuNcUd7dWerK41/Ty2T40V1J++5LZM99XczK9M7A2OzCyebHvtbdxtTkxMX84sv7Ved0RlN7UlbU12Lb01ha1fVT39JccsrYYNjbU2bR/GPMzXfYyvly0e1LYdtVVdt1TmjrUGneVUdaUT0+ST07SUhBVXVMU+RhUejZbefL82DP0VNd2ldN3eRT9Mjo8MbJ6M3C2drByubMyPv0x9N+0NhWZd9TRFlWRl3ZY2bK0Vrp0Gxj1OhZ5dNr9cz5Wd3aWvjP73bN02Hlzn5f2XtN/ONOUO9cSmv2TVN7Tj9MSjg+UENAXFxKY9hhW9HZXOrQZGrN7FLu3VNc231V5dtq28bg7MXM38W+zsy+0HfPy+XdyeRj0ONNZfhLRnV6TmvYbXDT31nazGBZ3nVS2dtPZ89rTdjUWuHK43rN11vbzlxf0eFU+uZKUNxYRW5mQ0tcQDtLRDpIVj1G9FJL2t5a7Mz/W9XfXOPgU2XO7Vbj0mP4x9d4yMj5z77P1r7E38vIYu3F5VTS1V/12FlQ9VxNfuBYZ8zabM3I+ebI/lPP0lnzy35by9RR58lhasXfT9fYUm3VZVTZ/ExtcUlO309DbGBBUFw/PlpMOkhkQ0brdVbVzmrly3hb1fhRdPRNWtdfS+ThXu7LfmfN12zJwdPOu8d4x8Zt6MrtXs7Rat3PXFrbX0t08Ex3zvt8y89e6tRaX9T0V9jYXe7M+FjV12fj0mpm1eVV7dVfc91jWe1hTGZmR0pgT0BQUD1GVT88U1FBVN9gWtTfXtnNavHL7Ffd3Fvv31trzeBozs5e7svgd8fH6svB5e/G0Fn7015q0utd2uBTb99kUPH9X9LT7tXKcWbO5WnPzW3pxtxg0NJYb9D8UubxTl53VFDvcExn8E5W71tMb1pJXGZJRl5PQ1NOQExnSkvY7lHw1Vplzt9e2NVVYN1bTW1mUHvbZf/W6WLY0vPVx9jWwcjaw8Tu3Mjfdc7RbOjL/GDP6FFx31pg2Ptd7elYds/kY83J/tzJ4nDL21vazmRe2G1NeO9MWOZOS95yTmTqWFf+UUtXVkFIWUdAUE4/S2VNSuVgRnbVWmjJ2WrKxWX0yWBN2t9V48xkeNLrZdPVYt/N7ObGy+jRzOzfyd9c19Vb/c7qcdXvTujOW17R9VLn3V/ay+fhw8nhzMx9e87fW9zXUVPnUUZnWUROZEpN7WFK7NlPYdZiTHJdRllmSUljTUNec0tR6lRL7upV5snm9srPauXmTlvbW1LX2k52zmtjy+JP2sbu4cHN28TJ4crH//HK22fVzmRu111U23VJbO5LUuVfVdXNa9i+1fzIzlzbxvd2zvtTfOpMVfdKRWZdR1/qTGXYXVnZd0hca0lKZEk+Vlc9TGZHS3ROSdv8TuDH3eLAy/jO1lf5zV9ez/lR39dXds5pU9vdWd/I6+DC1dzEzV7ZymH5yeNX2NtP6s5bVdT2TebWWffI4Oa/xd3Nx3PvyN1c1d9OWuZLR/xOPVBYP0v7TUze7lXg0VRe1ltN52pDVHBDSntNS3dhSGHhVGTVbXXGz2DRzU5n0lNO2fxGcdJSaM50Ut3eV9rG7te9ytG+wNzMxeDYxd1tzt1MbtNRUtpURensSl/PY2fI1uXDzGjTymPexXlgyvhL3uFGU/dCRO1SQu/4SnvXTlbXVEfnXkFeaj5GZEA/b08/cOxHbs9bX8bSbcPDbtXEXlfO9FDd40533VFd21dN5HdR3dFo2cHd48TOe8vQ8cjKes7OWPDKX1nL9E3U1k3rzGbsw9newNFuztlW39Nd9dVVTvhWQ1tUP01XQE/fTk3Sd07W51Db1k5t1ExO6EpFfVdBb/NEbN1HX85ZaMPbcMboUdN5RPHlSG7RTGDMWFTSaFLN2l3Gx3PJwOjOwHrkwPllxN1Zz+dL2dhK6ddJZtFNV8hjVsPTbcLGYtDJT/jFZPDDaFPPWUPrVz5uaj9s3Udl0ExU0FBK2FxB/Gg9Vfw9R+tERdxRRc5xRc3ZTMq+aMy8XnjFU0/MaFDObknP7UXa4kP80EvmwVz0vuRwv9VWxdJIzMhV0sRVe79uXr/ZUszoTszNT8y/XtC+bN/AVFfIY1bGbUnWaD1pYjtZXjpQ6EJOzVBMzFZFzWRA2uw/ads/WNVGVNRMTtFSR9FfSM7bTsnFU9fMSV7WSVXMTUjNXEnI60rOz07Yw2DQvvTTu9fkwNxVx+FOx9FM0s9M2ctN5chMW8tOTMZ0TsHSV8XIVNjITeLDVnfFXE/PWkXcXUDrYj9j6kdc405X90ZJdktKbVBEa11DW+dNWt5VWddqV9beaMzL7MnMWdrSTXTXVWDaVlrYWVnZWlPc51jc0mvayujrzu1x2fpr2dzz19zvz8/d09Lp3drl4d7m6s/U28/S6d/1W2nmWWjnW2bhYlFlVUpbV09YVFFecVpb+F1aY1NYX1pZYltSaWFj8m1g9PVfbO9edOb96dLX9t32U2lgVWZsW2Ls9Xvubu7Y3uXa1uHc09nZ1uLe19vf3eDe3+718efh5eri4Oje3vns5+vg2tve1tDm9OXn7d/ncujkd/n7X1tlamJjWlNUVU1JSktOUE5SWFRVVE5RU1FVZmlgb+jf6+vb39nU2NrV0Nzt6fZmZ3phX3dyaXNsXWBpb/rv+/Dp6v14d2hx697a1NLS09jc09XO1tre3dbe1NLW1dLP0dDW4N7ma295aG1nYFxnc19ZXlZUXl9kX1pYV09NTUtSWVpcZH79Z15cXV1bavRxbHrs/e38cOvf5fLl3vhrYFldY11eZGVnbnb78/7p49na19/e1+d19fxv997a2M/N1NPb7PHp6efn8Hvr6nXe6enb09PV0ePc5Hrp6tra+eB3+uxg63lf/Xp4cW1hT1BKREBBR0lNTk9sXVVfU09RVWBs627w4N/X6dfR2czf2tnz4GVoeWdueHpsX2pob2dlbe7jfHnpZV9rWVNWW2nt3NjQ0M3J29XQ08vWz9jaz+Ta0NzZ1M/R19zu6PVfYm3kcPryT272XFRlbV1w+V1oZldPSktJRk1PUl9da2BbWmVZW336+u3a3HHj4P3y3Obv4d9kY2FUWFRhZV1pY2FobvJs9ebT2uPe4+x3a3ldY3VrfN3W2tfP2t/b1tbV0tfZ2drp5PLo49/q2tPl6uV9bujb593W52/o4XB35+Tv5e5tX1tTSkVDQ0RBSElMTU5OSUxQT1Bq7fXez9be09HX087Q0M/U3ul+ZWFmZmBsZWdiZWNbamxu4/Fl+mlZWGJXUFlkW+rc4tnR0s/JzMnBycfFyczLztfZ4t3X2uLl6XpwYWh2an30c2doa1VYaWNd++f9avpgT1lVSk1NTU9UV11VS1FUTU9ZYP3g29nW1dLV4t/a3eHmfHZyaF1YVVRbYVJhZGtr9ev33s7X8OD4bfVvZ11YfNz8duTh3+Pk/t7Q08/PzsrS0dXa63fh7+/k8/3u5/V43tfl697o3PZh83b+3O/23uxrXVpPSEhDQkZFS0pIRkZIQEVIRFNs7tXOzMzFxs3Nys7N1Ork3OPraVZbWlhVWVZNVl1cbXTz5PZ3XGRgX11LTWBfbHby39nY3dDNzMvGycXAycfEzt/U1vToeGltbfxrZG34e2Ro7mVYZ1dWanB96d/m6fltamdNSVJMTFdUSE5SRkdLTU5QX3Lo1MrM0c/M1trP2GV47mxfYWRQUVBOV1Rg9WBe/N3k2c7Y6dvd921cWVpWaGBg7OLp7OTZ2M3MycnLyMzMys7W197gZGJ6aG/yavni5f3v5vv5fGdubF7x4OPd0eD431pISUtGQUxMR09HRkhASEFFVFN68M/Jy8LEw8jM0dzd2+zs7nP8Xl5dT1NYTldbXVx63una1uzg9VdZUlJPW1VX62vr2tvW28jNz73Mv73Qu8zKvme9S+XjRdlH20psXPZl6mFtZE/iSeNN1Wniz+vL9t9mUVxMTU5LU0xTUlNNTkpIUExUX3nn3M3S1cbf0tha0Fn0303PQuNYTfpH5EvpWuR209/J1NDJ6s5T2UhdV0xjTGZcY+pq6t7ZzdTJzMrKxMnIxs/N3OdsYntaXPpU3vFny1TYd2DOQ8pU6tp9ymnM+tlSakdaQFJORE0/8jtVREFNQFZIUu1V1NLVx8nFysnQ0tvd4+l+Z2liXk9VTl5PV2tX7Gzd0m7fzU3d8EHQQ0jbO9ZKUME/wv7fumG21cHCzLjSwMjEzc380110WVNdSetS21tsXGhoX2lf6WXd6unt19b4+WReYUhbYTx0UEHYPFBpPM48Vt08v0fRyku4Wr/+5shO1lfnWHDu5kzkS/leTtFLyWPI383V48tlzk9xZkjlP1NSRN1NX+lZ0OHrxO/Kw/e718+93MTLbMfrUMND2NxHukfbz0S+R2/MPbxP6cc/vkba4D/EPGNUOtc0V1I51jTfRUvePdJJ3uVyy+rH0cbPzMnzy2jb417d8PFuVV1eS3BWWeZX2vla22pc1UTibz3JO2xmOshAfc5DumHNvFSz7cS6V7NdvrxNs0jJ2zy9OdJdRcE6yU1S1z/QSvD2bNVc1+3PbtT9+d1K30NdUULjPVxQQNo891s/yD3PbEq8Sb3o679RyVbee1/YZ9Nk2lrgVVfrTdVV2dpXylPN3k7HRN1XP8k491A+yjnLW2HGVr72y83Ox+DFz8DWwtDYzFrMVeTsYMZOz+ZPyEDTaUTCP8dvSb4/wVpdyUDOR1tOP1Q9UEBKSVFJTl9Oa03XXXfTfL/iyMd3xWr3yUvO2lC/S9zZQtdIVXlKXN1YWNVQ7fFP3l5M309P20LkeEXEUefGU73W5rpjvcJds/DCvmO7Y/zPY3LcX2bOTvDnQvlRQ9pGUcpD09lKvFHwvUDH4Ui9O/PeNcU4UOUyyDpa4TfEQWrTQ7xSyslQvEHI5UW7PsTlS7tFz+dJzkxX0U7a3ErCTO3OP8NDadQ7wUFf4DzGPuzoRb1AxtJPtUa9xXOzX72/d77n3sReyspPvU7jzzvAP0/ZOb9BXsg8wEF6yju8PtTQPLs320w70zDdPkriO8pC3eRPvU2/0ey3Srpr4MJCukrN2E/CPtBYVtg8zkda1UDEP+D9P8k+y1dazE3GTeL3WNlK0GbT2l+/W8bJe7f3wMBou33PzGXK/d1y3mxZ8T7oS0PgOuFQRsVG2s5KxGxrw3DexnL11EVxZzj9Qz7qOlR3Ou5gTslX5MVb2cxMy9xOv1ltxEfP6UjLTVvITvTWT8raScVgUcZFcMtGzs9Cxlo/wD1PyjjM3EC7SG64RMDDWLTa4bVr0LtVv8RIu/pNvj1uzDTJTTy/O+fOOb1aRrs/1cs8uFpQvDnPYTbJNlJlOM8/aG9KyEzH3N29WLvuZLtFwt1MuEXpyzzDSETDOtxpQb0/2thBw0Hl/EPLRtBtW8JEzVdUxz3IYmfBQ8TWXcBuzcL9w8vwx9/az+3X8uJcaPFCbEZLYDrkSFXdQcRqW79dzMpfv9z/yGD7d01TTE1BVEs9dT9bX0DKTN/SU7xT+8dMzvVXymtn0ftg2WBa31Vr2XR909Bh0NpW0mBM1mpG2GpI2lpL3E5K3FFN1Fxgy2HYxu3JxM7MxczPxczZwtNbvudNzk5IdkBE4UNJz0pVxU/YwkjE00S/ckvHQ1LNOllmO+s/QtQ+ZdxFxnxvuWzPu1TMzEzBcFPDVnbPRfDfO/NdP9JHWsQ/18hCxF9Qxj7s0EDPZFTHR9raSspMcc5Jy3Lqx1rB0tTEfL7t3cJdxPJtxU7r3UXhRkV4OmJUR9ZJ1tr1xvzC0PPBXsrsU8ZKX3s/fkQ/ZzlQUT/aRvzTTMf63sdZy/Ljz1bKe97cWMhYZNJN6vlVzf1cyeJozvtv2lNk6E1V+1JjdEx6XExvUmJXVc9tasnY2sbWzL7szb79ycFsxctb1N1TYXhKS2BGTHtGT85sV8bRW8vXVNHsTNH0R+BoQlZVPVJRPWd2R+LKXtLCfNXGcnvEXmHGX1jKXljPVU/WWkfbYUvaaU7P6VTO5E7m3Elq0Uvt00/ez0pmz0xNy1BZv1P4vWLfu2fxu1XbvErPxUHR3ELRV0LYSUDWRUvSP+DSS7/U4LxqyMVOyO9cy0vu+kRqREdKPlxCT/FH1l5cw1DU007CbF7FWOvPVt7NX/HJXXrGV+3KU+jOXm3Ic03NV0fcS07eT2joUPxTRuNIR89Obsxkz9nvx+fNym/Azem+2tDJftHv/t1a2lVO1kZmYETbSm3NT8rjU8ZXWs5Sec9cYd1JS+4+R3dBWOhWZ9DdYMvTUs3PXt3Xbvvv32hq21pu11lvZfRmSNdeScjsUs3wTe31TGDRXlzF51jK3Uje3UPryE3pwldkvnlSvvFNvO9NvupLwt1Jy+pJy3xK12dI9WpI8ulWz914zOPg4GXS+mXJblXgTkxQRktHU1hJaHxL+NhSZdF0Zs3iVc/bUM3MTtPAWum/a3O/Yk7FeErE3kHM6DzaeDzf4ULTzUTh20VrdUlz3lfu2F3T3l7KbOnFX83KcMXX9sLhbMfpYs1hVs9UT+RNTuBZVdpmVN12Vd33WNX+/9NQ6W5E6UxL60pi5Ex90FJ1z1HnzVLk0E/sz1zlzWLmy3vnzmzx0VZu/VTTVlbVSW/3R/BlS9/dXcvQWMzdTdj0UNbmT+ThV93fVuPeW9TWY9Ds9cpb0c1czOBm1Xhl2GhR4ltY2Fj91VDq1lZx2mtvzu5r0P5R+2xHVO9KTN1USe1lTW7vXGHe9Vzh3Hrd3dTb+s3Zbc/O69/NeXTYXVn5WkdcZENXdElj1mVx0PBe/+lcV9z4U+zca1fs2lNt0Hpz0M/uz8Tb4MvQX9nJTWfJWlPa9E1t8kpd6kpP4VFK32tO29Rf687xbeRuXV9oZVho3mhP2upC3tFIZdFiVczUWtTTXNrNVGnLYlfP5Vvi51JbaVZQVVhPT1n/Z3rH9WW+11DRzlVdzV1OzexK3OZFb89JdcVV/L/c+cXeV83YR9nKSPTFTV7GT1fJS0/KUEvKVkfNZFXKZWDJd1fV+0zl7kvnd0Xa/D/28z9330fjzlDSwFv4vl1Xwm1OxdNTyMtN0shFX8xKSdtRQP5eRNrbR87LS9LNRvvLSmjLS3DJSl7MSlPYU2jH7du6zeO93GDFX0vPW07KcEvP7EPo4EJo3UBb2UJUx1RNxdxNx8tPzttMz91K09VJ39FHb9dBXtJCZb5XcsFtadBXXdpOT8xeUMd8Tsb4RczmQ9nqQXvlSO7bV87MWcrCSuTDSmLCTVjJWUzTY0F3dj5mzE7fv2DZvlZ5xE5Nx2ZNxPRNx2FKy/VGzd9Gzu1Jze1Ky9ZLz8pJ8c1KYtFOX9hJU89OSdFOQNxWSsrbV8HLUMXQTM/cSs7PUsnMStjMSe3RSnfbQmXYQVXXT1bXaljTZU7Qa03N2EzZy0/uzklq20Rnz1bswdvmv9FoyOxK2OlH2NBHZ9pIXdlGadZCZM9HU8pRUcZoXr9iWsFgS8TWTMzVS8/OR9zOPlvMQU7HVVLF9VDH/EbOfT/e0kh7zUlox01awlZMwvRGzeBF089Kz8hM1sRKZsBUUcVYTcZcSchbPdr3PnTUSHjGVea/W2DCX0vI3ErO0kTc0EPhyEn5w11ZxupOzd5Ky9VIzstDe8dMU8pPTM1cSsxtQdfnPffNQ27EUe3BVG7CYU/G0kvMy0fVy0jqyUZexk5LyVhD0XZF0t1E281DeMVJXcFRVMFpXMNvSs7mQd/LSPPEWvrBc2zEb07J3kTZzkFZz0RN0UhMyVZIxuNIy85M0MpQ08VM6MNJWcRYVcj8VMfpS83hQNzXPmfNRF3LTFbLUEzHeEXK1ULZzETrx0ZyxElfwE9JxW9JxdxKw9pEys4+2shCeMNKbsBNV8FHRsVNP8pmQcrfQs3RQs7FRti/TGbDTE/FTUzAY0nC20fHzEjLw0fSwkPhwkFZxUZLyE9Kxl9Ixe1AzdY+5M4+7cpBdsZBXr5TVbvqVL7fScPaQsjSP9PMQe3NQlzISFbETUrDV0DMbEPH4UbH0UjJykfmyUteyUxUxFVOw1pFxfZHydNLzc5E39I9X80/TMZOUMJSTr1uVrzaTsXOSdTORdzKR+rFTWu+XlzDZU/LX0XZXD/ocTxx4kBvzUbvv1FlwFhSw3hXxfhOyONH1NZJ2cdS+cdaW85RS89fR83bSdPMS+TNR2fMRU3PSk/IWUjLakbK30vIy07K10fM8kHIXkTFWFnCTfG/ScjCR7/URcJJS8E+58o6xGhGukh1vT3G2T27RU+/OODhOr9MTL0/ysRCvPRJvUhbv0TixUT92ULsz0nezUp+0EtW21BU0mtXzNld1c5WccptUNvuS2rVWVXXfEtk3VBXztRVb8xnSOzTSkbQ3URnw/9Jyb1iWb3CS1vCdT/0v2RF08RTR83FU07Iy0lGztBJRtjiP0XY4kBKy8xNVcPGUVDJyVVSx8NaSOXLYU3exfJKac1xRVbS4klQz85aUNjNZk3uy3NIT9rrSk/Y0FNL8NBoTuHG2lZl0NpRTu3WZ1Ny1uZYds3M9mjSzPFRbN52VFve3V5Z8Nt7YufO1v953tn9XnTmZ1FWa2xXWeXY72zo2eJgX/Lr92/95HRZW/Lta11w5mlVXfLma2Pf0+j03tfd9/rf3XhmZ3d2W1lofmpZWWRrWmj69nxnbXRqWltqbnRhduv17ODV0NfY09bl7Ojw8Pn97vXu/n7t5+Xm4+Tne2r4/mxbW2BaVVNcaWZqdezy9+Pj6+zo3d3i6+nybG7zfG1y+3Vqbnp+/X58bWX77nh38+jrd3t3dGtraGJhX2NrYmtse/Dp7H19/HBlXmBicnVudfz48eHf3d/j3+Tq6ebu/fD4cX7v/HN77eDe3NrZ3t3d3+p8dWBaWltdX2ppcnB89P17e3Jpcn13/Wxqcmlqbnzy+nBw/H376ejw8+/k5eji4uTs5+X4cHrxcmJtbmZcXGBgWF5tZFpdZWFbW1tkY2Npam569e3j3NTR0NLW2d7h4N3vbe7m737u6uTf39ze4OXm6/b/bV9YV1hSWV9qY11rfnZxdezt7eHe5O7r8nh2bv7z+Ozv8nr46+5ya25qZnNwfPr59PtycO71eG1tb2ppdHFxa3J0bmVlZF1fa11cZ3BqY2Zz9/7z5dvc3NnW3e3q7nFmbf/09Ono7ufc1tzf19XV3NjX3/hubmBaWWZmW1xjZmlxdWhtcH1tb3VsYWFgaG967Ojp7u/r6OZ3++/78+3o6eHh5ur07nR6/XlwbGx1/mhdZ2ZhVlRXUk9TVVhWXmllX2VtYmnv7eHXzs3Pz9LV2t7ucm145eDl4dvX2dre3Nvj6Oft8O7+aF1ZVVZdX1pbWl5ubmb73+Hq5+bi8v5+cm567+jp6ev0/e38aGpwcmxqbvr+dv3+bXFyc25tfHp1fPp7b3559G9gXVlXV1ZYXGBfaWdgZGhmanHm2t7a0trl6uXwbGR88e/f2djV0c/P09XP1tnY19rm6+5sWVdcWVVTVVlYWGJfZHf//vR6d21kZGhqfvTp5Ov06eT7cXzu6+3f2+Ps4eDu+/T8al5qaGBgbHRlXmV4Z11mWlFPTlFRT1VhYWBodnVpbO7q6NjNzdDT1NXe7urz+ujf3d/b09DZ3NTa5uff4HppfftfW2BeW1leWlZcY1tcavHq493Z2uz7+Pf6fPLk4v568vpuaGpoZ33w+Xz7+nRsb3t8Z27/al5ifPxwePft9vHr92xoZlVOU1hXV2RlXFtoc2Vndvrx5Nvb3+Po+vx97t7X1tjS0s/MzM7W2NXT29/i5/9oaG5qZm1hVVVZX1hYWFtaXXb2ff//ZGdufuns8u30+e3h5Gh4eW7u3t/a5/XndWl4cO7/Z2JbXl5iZVxkbXpvZ3BjW1dSU1VcW2BgYmJedfT18/zm2Nva19DW9nHq4uvc0d7e18/W2tfQ2OPe1uL1em1mV1ZdcW1fYmlrWl1pbWNnef367N3revPc5+3f3uh49eVrXmx4Ylpl+fZ7dO94YWBgeXl67u15e+peZvF+5Wpv3+R7dfhoWVNbY1pUWWpmTlhtYmVcbubv29/faFf5euzQzNjV0M3R1c7I0tbNzNDZ1ehsfV1saldeYVdVU1pXVVVsYVNOX31iXHB7WHDZ3nTy2dDean56c3Dj3PnX3OHNT1zS4VZc2N/g41ZPa2RaVl5l8mpb8G1UU2tlXE5p6W1oV1h3e+3+ZG/p4Ovs2tv/9unW0vLg0NvdzM3O0tfV4unZ2m9c+Xz6W13vbV5sdfdfXmpuaWFu93hvbH54YP3oeGvm3XX5c/78WmT3dmHgdmJpcOl4WW7ne23p2+9obnx9XWRpeHb8d3R2Zm7uXFf5aWNfVl5hWFRsa1vn5v5yffr4duDp29DPzMzOycXIysnK0tbV1d/y5N7zZnvzXVZeYFlXX2peWmBec2JaW1RbWFVcXv/w8PHo7e/6be/4+erf1+nm5O7md3dnYmpq+25pandmZ19cXVRVWlNVXmFcWVlbY2RfZltiZGp7c3JqcvBvcHrt/XHo3drR0NHPzsvHyczNz8/a2t3t7fl39m197nJvXmrw5+F5bmvz6W5oYm9kTVReX1xfd25YW250XWFv7+fg29v4/PLm9WpsffVobHrh8+fi3eFqfmVeXWJtYmVgaF1YXFpTU1VcXVdYXl1nal1aW2NeU2L57//ZysvOy8TKysnHx8fRz9na9P7Y9fvx9+hdTmv2a3Lu82dk+m5fXllhUktMVlRVXWtgZdrka2/b6NrPx8zQ2OLa3+n05OxeXFFUY95+dfn14epQWXZbVVp3XlRZTlVWZP9eeWZZe25lc2P8WnRqUllaW/bOztDJx8zP5M7K0dbp2t36c213eGRe3/RgZVjgdmfn3/Hk6+hmWW1mX2RvYmBYVGJfUllZbFNWa2zZ0ODQ8N/a7nlV8FtX1/XO6s/nXNbc097a3OJo2udual/7XltYTU9gSltjWG9YcF5TaldcTkxUWnrg3NTKy8/KytPQzs3T1dnP09NtX3Vo619ZUFFkWHBoZXhn/WNjalZOYGFVfllnamJfX3d3aWtwauPQy8zSx8/a1u7y2/Dp3efe4O12+Hxy7WrydmBkVWRgVlxaX1tYXlpbXGdwaGD4YV95bW1sX11dYG/i2NjQ0svLz9DNzszR0tjOy+XxbHjs5fDtbHD/bfL06/Xp8HtqZ2lWUFBQT1JdVlVfW2RdXVxYVmbp5d3a19fl5tvm4vP22tri5uzd3fV85td09ntwfV5rXWNUTk9ST1JNUllYU1tmX1pWZF5aWlxXXGH94+bc0dLVzcvHy8zIzs/MzNbU4+Dc4u7n525xfHT+bFz7YW5kbH1uWl1XVmZiZ2drYnB1+2pcafL28Orb0dbd3OV77fX7c2745+v5bvzsdXp2cVtdaG9eVV5bV1hbWltcV1VcXG39bHBrZmhqbWBaWFhfdPXl293Sz9nUzMjOzczN0tfY1+fv6ePf9fjqdmlobXT+93H86vx3cW1dW11fXl5oYV1kZF1bV19eXGN8/u7n5Obk3+Pw8Obp8O7f3+Pl2tri5+TycmplYltZWllSVllWUkxLUU5PWV5ZWVhbXlRVWFdaXHrw5tjNzMvJxMHBxMTEx8jJydHU2dje4ev9eXFmXl1dYmNfZXFmZGReWlteZmhfaWhrY2Nncmdr8//8dOri5u3e2t9+9vRmX2z3cGp56enz++fsal1fW1JUVFVXWlhfXV9YWmNlam91cGpmZF9eWlxaXGBjavDl5NfOzM7MycvO0s7O09nS0tjl2trtd/TqeWdt+3FndO7xd3r7c21pcm1wXlljYl1cYmZlYGlra2txdvjt6d/f5u99dv5wd/Lq8O7e29/n6Of6Xl1fW1JOU1ZSUFlaU09VXVlWXF1ZVVZXWFhWWl1jX27p2tLPycXFxMLGycrHzczNz8/e1ej4619qc11tXFdwZmJaaHtgXWRye2lxenVnX2ttYWB2/3RwfvDo7ere5unk6vNuZWllY2Rpeftw8ers7fj/bWJeYWBbWFhbXV5damtoZV5qaV1eYV5UUlZVUk1TV1VaZuzW083KycrLx8nMzczMzs7LzdHb3dnj+/X5em1qdfb5a3n6dGZfanJnYmNfXlpYX2NbXWlrbmt07ev16N/h5fX6+25veP33/fbs6/3v4e/5fH5xXl1mZltUVF5ZV2FualxcXmFaU1ZXVFFQVFdVUVFcaWru1M7OzcrIysrJyMrOzc3MztHR2uPw9vT+dHz9b2tzc2hfXmViXGFsbWFbZ29jXnFyZ2Ndb3h4+Obj5Ovv5+x2bWlpaGh19fr48vDv8PLx/XZ2cXBubW1qYFpbYml3ev/5aV9iZ2BYVFVTT05QT0xMUltmdeHY1dHOzMvKzMvLzs/My8rO0M/U29rd4OPp6ur1+HtqaGJaXGFcX1xXWlpfZF9gZ2hiYFxhenPy5ufh6ezm7fj9+/P7/frm5ezp7vX4e3ttYWx4cGdfXllUU1pbXmVsamZfWVtbV1dOTlBOUVBRW19t7Oje2NbUzc3KyMjHzdHOyMrNzs3Q3dra4OPq4ebw+m1lYl5fWltfXl9bX2VqaXByamRmY2BgZWr+7PH28Pf8dXNybm5mZmx3+ezj5e1we/N0amh07PP9fndrXl9mb2hme25qZGJnW1lVUU9PUU5MTVBZX2396ufd2dDNzMvLzM7Ny8nJyMrJyszP09fW1dfV1+P5dGxfW1tcWlRSVVVXVVlbYl1ZZ2tjW2N4/HV+9PPy9+3d6uft9/h86Obm4eDm+XX2bmdhZXL9bGFeXVZRU1hdVlteZVtZW2BaU1JTVVBTWV9eZnbt7e7m2dPVz83Nzs/QzMrLzMvMzdLT09zd29bY3uDo/G1qZFxXWFxfXF1jbmdiZHpxX2ZzeW9y+uxzc3j0fHFsevtoZ219enzu3t7e5uHyaWVnbnB6ffx6bGdqZmVgXF1fYW1sXFtXWFJPT1NRTU5aX11ebfdw9ufY1dvZ09LV087LycnJxsjIyszP19nS09zc5O16Zl9bVVZVV1ZWWFxcWGBdYVxfbG5kbW1sa211ffdub3vv93z66+/66d/d297r7G5jYXBmX2VlZl5hYl9aWVxfXmVwblxXWFhWVVZaXVhca3psefnv8vPq3Nre3NbS19bPzc7OzMrKzs7P1d3c2dvj49/nfWhlZF5aXmNjWl1jZl9eaHduXWXu7mdsff1qZ216X1peaGpdZHr4+fPj2tve6uppXGRzbGJlcf5naG1zYFpidWZjbXBcVFhaXVNQV1hXWF9yaGdq8ux4duvc7vXe19jY1M7Ly8rHxMrQz83U2trW2Nze3+F7amxqZGBfaF5YVVxjXFtocl5g/u9rY2f7+2lte25hYnD+bWh08Pb+69XS3+/sfmJeX2FcWFpvbWJha2hfYm7tcGBdYFlVVlxWTE1YW1xdYXh3c/Pe6Ovr4d7f3tbU29rVzczNzMnP0tHQ0dfb1tTd4+Df73BqfG9tZ2FhW1VaY2FcW2NrdnP99nhre/dwZm1zZWptbnRxa3J5+uje3eLsffxyZFpeZGBeanhpamtxem9x7/NuX2JgXVlWUk9PT1dZWFdibnv97OXn8/bm4ePm3d/e28/Nzc3Ozs/R0tXY2dfR19rc3ej0eP7z/GxlbmZgYWZhXVpfY2dmY2drbmpucH5yZGhycHRsamhoePrq5+Lr5ufnfW1rZWFdZHN7cHN3fvft9/5ua2NmY15ZVVZSVFNZWFVYXGBs9OHk6t3c3t/d3uTx5NvZ1s/Nzs7Qzc7P0tfZ2N3h2d3td334dmVw9nRfaGppXlxiYV9eZGd7Z2dqa2hqb2pubm12amNmZG1lb/Ps9+/o6ntmdnxnWmRwaWVlZ/z8eHv37m5s+ndbWVtcT01SXFlWYGVubXvm3ebq39nh7urj7nfw3tfX087M1NLNzM7W1dLX3tvZ2uz47vVrdvfp73Z28PNgXWJnWVRh/nBgYnZqXmP992dfYWBbVlljZWFl8+Xt7OHefW559HBld/Z2YW71825u/vlxcnTua1ZSVFNOTVFaU1BWYWNnbunc5efa2N3u9elxavLW1NLOycfKy8rKz9Xb1NXd49ngcWdte2Zld/dsZWpwY15fZVxaX279amRl/3ltbuzvd2tqalxaXWtqa3Pr4d7o4+b3cWh3cWl1+2dkbntxcWlz9Xh2d/5kVU9UUk5SXGVeWWFybHfv6fHp7ebk/HRqaWly6dna1MzKysvMy8zT29rX29rf3ul9b3l8ePrj5f51dnVmZmBeW15nc2heX2duamVp/nBeWV1aVFdeZmBs8+Tl6+rq+G5sef3r5ufm/Pbw/WxldvL+cm9tXlVRT1BOTVZeX11gc3xla/Pz+O3l6/X+8/537eLcz83Nx8bIyszLz9rV0tnl4+Tpe2hubmtvcvrza2h1bmFgYmRjY2lpXV1gYmZlaff3cmlqaV5YXmxrae/g7/717nhpZmx1+O7l5ev4/31sY2BxeGpibGdcWFZWVVhaZnRyb333fGFv8fT6cvPtem/3+3j04NjV0M3JyczOzs/X29TT3eDi5fB97OXp7vDn5+37eXppX2JpamBdal1TVVxeWV5gZWdoaWthW1daaG387unq/nb6/HF46+fn3dnY4fL09HFobflrXWNjW1VUVVJRVVpgaHV4e3hsZ2hwdW397Pls++fq6t/Z0M/NysvLz9LV0tbX2Njc6vrx9nb97/b++vHs+Hh9b2NfZHtvYV5iX1hlZ2ViYPnr7e71dG1hXGBkZG58e2xfYGNeXWdv9+7r4+Xn7Xh0c2pobXFhWltgX15gXl9mc3t1eu72eHBraXj5fHNrcGVp+O/w7N3Uz87Ozc/U2NnV0dDT2d7l5Ojl5efl493h8OrteGpuZ1xbXmlcVVdXUVVWWFxeZnV7/nplY19dXWl1+vfw73pz8fH37Orf2t7f3OHsd3V3a2hfW1pYVFhZWVhaXl1lZWV1cGpxdHv+6Ot9b3D7+PHp3dna1s/NztHU2Nzb3tjV19zb4Obs7fPs6Ovn5ufs6O92YmVlZF9dXmFaWWFfYGp5c3dscHFscF1cWVtdYGZpZmRjYl9idPz67d/b2d/i6uz8ef16ZF1dXmBbXmFsaWlobW1vcnBtZW/69WhvdWlfXmRqbv3o39zZ0M/P19rb2tza2djX2NPV19rZ2Nfd3tzY3eTz8/5mX15gWFJWWlJQV2FlZWNkYF5iXlxXXGBfX2Fqcm1tcPzvfe3k4Ojj3Nfa5Ovr/GRjYmBbW1tXUlZXW1xZXWNoZ2lmcnh5/ujye27892hu6Nzb3dvY29bS0trc2d3o5+Le4OXe4d3j5t7e6ezf09bk7vDoeWhlZF5dX2ZfZm/78/z2fWpfXFdXVVhbW1pXVl5pW1ln9Px6e+De49zZ3ePn5+xubW5ya3lqb2pfaHBoXmFtdGFfcPVuaGr9bl9cYlxXZHTt7/Hl3uXc29jZ2djX2eHf3trc3trQ09fW1NXb2dLW4OXs6m1hXlxaV1ZWWlxdYnBraV9lWlJPVVRUWFtbVl1mb2l849rb3NvW2d3d3Nrk6+/3bF9eaW5nXWFpYFtZW1lbX2RfZGtzcXJ9fWtjY2RoZnrt4N/f49rW3d7X1NPV19bf6Ovo+O/q4+Lp5uHf3tvb2dzi4uDteGFgZWJfZm1ydHL38n1rZ1lXVVVWUlNUUE9XW1tca/Ho59/h3t3f4t/b3uHr7fpwa312dXr6+XV5bGVfamllZ21wbmpub2VbWFpYWFpmb3B37+fe393Z1tTS0M7P2t/e3enk2trd3NnZ29jT1djZ197peGVdW1pcWl1fX250al5kY1tTU1dVUE9VWFBQWWJgXvnf2NvZ1dHW3trZ2+Pq7O1tZWlsZl9nfnZpaWJaWV9iZl1p/fttefx1XldeYWRfa/fm7fHc1t/e2dPT2NbQ1+jo5+t1eOrg5e3l3t3f3tTP2djU1udsYmpgWF1tc3vz7el0bm9mWldWV1JNTk9NTE5SWVle+97l7OXX1urk1tfg4+De7nL79Pz17+bj7X51b2VmXmppYWt0al5eX1tST1VaVlphfHtx9N/d3djRzs7Q0s/V3OHc3eDj3Nfc3dvV2NnTztDX2972Z1tZXFZWWmhpbWptZl5cXVpWUlRaVFBQVE9QVF9sc/nd2drc2tbZ29vY2t/s9PN6am9+e3x1d3BpXWBYWFdZXWVnbnFkZVlbWlxXX15ibXvu7u/p29jU09DQ0djX2t7i5uPn7O/n4OHn4d3Z29fU0NLX3ux7ZGVeYmdufvvt9m5pZWBfWFdVVU9MSklLS05UWl1hbPr19/Ll6eDg3dnb2t/p6+Pk5uLe4OHu5uxxbmNdWltcaGxoXFpaWlRYXFpbXGNmaGFx/fXk3dbPzc7R0dPX19vY3Nvc3trZ3dnU1NPV1NLT2ud2bGddWVpfX11cY2BcXF9cXFpXWV5XTk1NT09TW2Vu+Ovn5eLf4OHm5eLc3N/q6PX96efp6ejqfmxrZWBaVlRWW11oZ2BgY21wZWl3bmVqc3Ftde7s7Onc1dPX29XY3+Li5eru5ubo597e3tvZ0tLT0dba3u7t7XVmb/5yZ2d0dmxxbWhjXFlXUEpJSUlLTFFcX2Jtff5+/PHt9Ojd2tjb2tba4d3a29zd3+by9O39ZVpYVlRQVFhYVlZZXlxYX2pcV1thaWNkfuPf29LOz9HT0dTW1tTS2N7c1trY09bZ3drX2+Xr5+9yZWdoXlRXXFtZW2hrXl5vcG5oX1tUT01PU1dZZXh9fevi6ff88O7r6uLi4+Hd3d/n5+Xt+//w83t6eGtdWl1cWFdaYWNlYmxzbWJkbmRdX3Bwa3jo4uDg3Nrb3uTi3drh397g493Z19jZ1dTS1NbZ1trd4ujy9fduamhudWxscWtkY2RdXFZPTkpJSExPUVJXYGVoZ21vbn3q5uLb1tLO0NTU1Nbd29ze4+Ld5O97Y1tYVFRRV1hVVFdcW11aW1hYWVpfZXD97N3a2dXV1NrX2tbS1NfZ1NDS0dLV19va3dvd5+Th4e98fXNlZmVmZ2ZnY2JlaWJhYV1XWFdSUlNXWFtgZGZ0cnRy/37/8vr17+Ha2Nra3ePk4eXq6u/48/H+eW1mXl1dW11eXl1bXGBiX1teXltcXm51fffg3N/k3tre49/c2Nnb2NPR19PU1trb19fb29nY297d6PP48Htye3NxbmdeXVpVUlBQTk1NTU5OT1RYWVdeYGhnY3nr8Orf2t7d1NPS1NLW1Nbd3NXa4Onn8WhjbWlYWFhbU1JUU09PUE9RUU9VXFVabebl6d3U2NrW09LW1NHO09PQzs3P19bT3d3c3Ojl3t7u9fP3+nRrbX5saGRoXVlaYFlPUFVTTU9SVlVZWVtfY2Fue21l/N/s9Ozc4ejc1Nre2dba3d3f3+TqdHryfmt8eWZgZ19XVFZXUVNUVVRUVlpcWl9t9vx86dfb3trW2NjW1NbX1NTPzdDYz8/U2NPS2uTd3O/34uX8e3X9ampjWlhdWFJUUUxMTkxMTVJTUVVbWVlfaG9ndOff4eHi2dXW3NTR19fW0tja2t3u8HZtbG5pXmBiYFpaVVBPWFNPUFRQTVBYV1trdf325N7Y1NLW0c7P1dPQ19bQztPUz8/T1NXY2dre7Orr+3X+cmlpbmJcW11dXWphW1dXVE9PUE9SVlNVXmNcXWZqZnnr5vPx6OXe2dnb1tXV29LQ2uPf5nJ3+3NraGdhX2liXFpcV1VYWlZUVFBOT1pZW2v4cHvm29nc19PQ09XV0NLa29LQ0tHNzdTW09be3uLu+vhrZWtsX15kXlpebmBdYmRZVFhXTk5UVVBWXltdX15bZn3+9N/Z4OXZ2d7Z09DT1dbW2Nri8O3xa2dxaGBeXlxbXmRdXV9ZVltdVlFQUU9TWV1l9ev66drZ2tfR0tjTz9HSz9XZ1M/Q0c7N1NrW2uHj5v5zdmxgX2lgWV1sY2FxdGZmX1hQUVFNTU9OTFJWV1VYWVxjdPPv4t3c2tXW19DO0tLPztTW1uP+8et1dftvYl9gXlxiYVZWWlRPVllOSU1UTk1ZXl5t8+7l19rZ19LS1M/Mz9LPzs/OzMvMzc3T2dnd6+n6a2xsXVlgZFxYYGhfX2lnX1tYVVNVUU5QU09PWmJYV2NpZHTf3N/c19rb1tXX19TX2NTT2uDm9Wt493dna2xhXmduZF9dWlhbVFJXV05OUlVSVV5nbfzr5N3Z2NfR0dTUz87U08/U2dLNztDO0tvh3+X07PhubWxlYmx9Zl1temVfbGhZVlpWUU9OS01PTlBcYFlcanpu8d7d4N3Y2tvZ2djU09TT0Njk4+V7bfjub2j8/mlobmNeXVhSVVdQTVJVTEtPUE1QXGRge+Hh29LO0M7Mzc7Ly8/Szc7TzsvM0dTY4/X1c2Rna2NnentpaGxhXGVuYF5lYFhYWlVRTk5OUlhXWGdwZm3n3OXk3Njd29jd4ODj4tjV2dza3u9++m1ka3lwb/z3aV9hXlhaXVhYW1hTVFdPTlRYVlZgbHTu39rX0M7PzszM0M7O193Z19rV0NPZ3OH3cnNlY217+fDm7W9rdnhqevtmXWFdVVBQTUpMTk1QWVZXZXt0/+Pd5eba2N7e3+v26eDh29TY3dnc9H3p7XX96u37+HReWlhWVVdaVFJWVE5OUE9NUlhVWmz++eDW09DMzMvIx8vNzM/Z2dDS2tnS2ODp+WJeYl9dbX5vc/V1YGBtZFxmbF5ZXltTUlRST1JXVlxqa2r55eDg19Xb29bb7vH5b2798O3h3eHk5ftpdfl0bPzr83R1dmhiZFxaYGBbWlxZUVZdV1RdYF1mffXx49rZ2M7LzczN0dfa3ejn3dzh2tLe9vDzbWh2+fzy6+zm4e5++u9zY2dwX1RUVU5MT09OUlZVWmZkYXbr7OXX1drb2ud89ev+d+vf3tvY3erk6Hp+5fBt/+p0Ym9rWVZdWlJYXFRRVVZRU1pXU11rXl3+5evg0s7MyMXKysjM0tPT2d3a2N/l5n1iX2JdXGZvY2L/7ffw92948f1qbv9jWlxeWFheXltbYmRmcHxw+97c3drZ4e3o7WhmdmtlfOjw8+bseHX5+27+9Xh97fVwdX5qXWdyX1tlaF1eYVxbXl5XV19cW2j9+unYz8/NyszNzc7X3tvc39/e6fT1dGJibWdjafr89N/e5ubi6fLu9mpiaGRaWVlST1NUUFJaX1lba3P+5d/j397f5uXo9XX47PLp39/i5eXk7Onqe3b5937+eGhmY2VfW11cWlxdW1xbWVlZW1pZXWBkdujd19DNysnIyMzNztXY2tve5uf5bmVjXVhbW1pievr59ezq8uzt/3Z0cWpsbWJdXl5XV2BlYmNpb3z26ufl5OTm5+vzcmxtb2148u/w83t99vp3a3F3/vl+9/j9dnj9dHRzdHtwaWlnYV5bV1ZXWFdbY2d06d/Z0s3Mzc7O0NbZ2dvc4OPp8PdyZ2loYGF28+3m4+De3t/l7/f8cmlubGFZWVlVU1NWVlhYXGpwbnnv5+fr7e/y+vv3/O7q5t7e3uDe4efs8/d5+u96dv54bGtnZGFiZmBeY19ZWVpXVlZWVFJbaW7539zZ0szKysrJzM7Q1tnX2uTr7fxqZGRcVVleX2hzfnj48e3r6ul4cHxtbHp0Y19mYV1dZmVibnd+8Ort9Ojn93L59mVkaWllbvD5+O3x+/v5eHL9fHj+7ez56+j2evbtd2/+fnNtZ15cW1VSUlJQWGVucPrk393W0NDT0tHX2tnc3dve5+jl8HtzdWxjbvv47ejj4urr5+js/GtocGRdXltXUlNXVVdeYmVsefHp7uro9P19+vP6dHb/e33v4d3m5uHm7vPw93p0cnt7fn5vcGthY2RjYF9gXFpbXVpWV1VXXWj+6d7b2tTPz8/MzNDS1NXc3tzi7PX1e2lpY11dXF9jeXhz+/Dt+/Dp9HNrcHRwa2loXlxeX2ZrcPzt6ujg4eLk6O35/XRsaWJdWl5jZ255fndz9vT+ff96c/3r6Orm4ef1/X76+3t3cGtlXVxeWlVVWFxdZXzw8eri3drX1tfa29rc4Ors6e779PDz+/f6b254/u7m4OTm3d/n6e/8cHNwY2BgW1RWWVpeZWdocvr9+Orq/Xv6/3N0fnRra2NldPr8/evn7Ojf5/zu72146+r49+z2c3B0ampuYVxdXFdVW1xXWGVnZ/Dp8OTZ1tnV0NTW09Tb2dfk7ujseGx+fWdmbmBcZ2dfbO/1d+/l93nw8mx39XRoaWlfX3V+cfnm5+Td4ezi3ul7d3pjX2hjWl1fXVtfZGRv9/R8/O92b3lyb/De4Ojg3OLn5+x+8+xzYmVkYF9iYlxea25tdH346uHl6efg3+fi4uni5O799/Pz8O7q93p8fnVwe+7i39/d3Nve7e76bWtqYFlZXF5fYWlobv58ff9+9fz+e29tfvZ1dXVydfz9dv7q4eXn4Onv/W9nZXH+/fPw7O/q5X1qaGdfWllYWV5gX2Brdvzw6+3r39vc393a2tnb3Nzd3uv18Xt69vF4a3JuZWFdW2Ftbm375+Hj4uLq7+zxfXlyaWn66/795uLq9e7s7Ol+bGxrY15lZ2BeYWZgXmFna3b9c3vz9Wxobm536+Tj39vc3djb5ufrdmFhaGFgZmleX2lmZ3V5b3rr73b85/J98+/w5+Hu9Ojl7ejd3vP37n5wa2958ujs5t7a3uTe6P95d2phY2BdYW1qYnR7ZmRuenr6fW1seHppbfhxb/3zeW7u6Ozq5+767PdlY25rZHfr6+3n5PHv7H1ubGJXVV1fXF1tbGl6d2755ery5N7m59zd5OLg5unj7Pnx6PB37up6aWlfV1leXV539Xvs3d7k3Nnk7ev0cHvx/Xbw6PP35+t1fO39b3Z3ZV9nXltgY1laYF5cZ3l3fPj4fXl9bW357vfv397d2tfc4dve8/v0aF1mZl1cZmldXmJfYXR6bG/+fm5x7O/86ePt8eLh49/g6eji5fh6dGlncHV77Ojp6uXe4uLf5/5xeWtmbmhiZXZtX2t2a2l6em16/HJqdnNpa/12Y239fXju6e/s5+9zdHhqaXV+evHr7u7n6ff483tkZGxmXl9kY2dqZWdtbG5+7u727+bn5t/f4eLm7PPt6/H28Pn98fJ0bGtkX2Bta2l89fb05t/k5ufq+fLq8/r1+//47vL++u99bHd4bGZnaGpsamliX19bXWRjYmh3/fz/+Pn77vDx6uvw7+Ph4d7d4evm63h1d2VdYGhfXWBmYF9rbGhubWZr8evs4tzqde7k8fjo6/vw7O3t5+1weuvt9u3ufnvv7fDn3+5y8ut3c/l3aWZoaG18cGN17n5w+/1paHB8c37zbWJucWRpfnBoeOvz/Ozqe/Hf7H7v7nZu8+x4fur8af3ybmdsY1xea2JcaW1eafl3bX3z+Ozd2t3Z1+f95OP4fPp2aXfzfnry/mRy6ntoe/Rsb+3r/e7g93Lo53t95+5w/+ntfuvn+/Dl+2t7/Wdp9PtlZ31mWWJkW15lYmV97/976eTv6d7teu/ybnPr7HXw3/D33uF1b25hYGdoXFtub15memZgbP599NzZ4uHa5e/j6mtrfHNs/O9+feXg7urk6/b3+2927O56//F8/u/4b2/4d2v473r65OT18Ov5c3Z3aXrrd2RocWdga3BjYHZzaXn4dfzg3uzu5et1dXRka/n9cH3m5Oro6f5pa2VeYGJfZm5rX2V3cG735+Lb1djf3dvg6e39aWdtZWJsdHB16+j77uHtcHT5dXT1+XP85u188PL57O3v8+re4+3m6fn79/1ubnVxd3dvZGhtXl5mZWVnZ2Fkb3779+rr9O7u+Xt5fHn97e3t3t3k6ubm+3ZtX11dX19fYl9fYGVsbfDj4d7f3d/i4OXv+vxwamdkZ3f+/u3s6eXu9Xtw+/j7/XX57/P07fT27fXv7/706e34+/f4em9ycHP5+H18d3p6bm1uam11aWdpZ2hu/vb+8+v2ev56b3d9enb/7urs5+nr6+//amdmYWBmaGJiZ2dlaXD95d7f4t7d4eHj6O32/GxjZWZlanBzdH74/HR3fHT16vf36ujt6+Th6Onm9f7v7PDw7vt6fP14aHn9dn77d2ttb2lncHJraXBmYWhlZWxwe3v87/j25uv38e71/e3o6uri6/jw92pmamljZmtkXmFiXmBwe3rt5+3x5+Ln597m8u7ydGtycmttcG9ueH1uePTu+vbr7/Xr5+zp6PL49PD8/e3v9/L3dHNzb2ly9vf+9PNzdH1zb251b2lwcmZhZmJhanJxc332+/Tm6fLs7vr17+/v835xbHNza2xzb3H+dm1pZ2hhaX3++e7t9O/q5+Tk5+3z7v5pa21nZmlqa2tvc3Fy/fj57urr5+Hi4+Xo7vPs7/nu6PH58fd4dXp8eXn8dW5xbGxweXZveHZwbm9rYmBfXWBudnT27evn4+Hj4+br6+jl7fT6b2pqcnBobGxmaGtsZ2hqZmlucXL/+3h6+/Dr5ODj5ent9/17cWxoa293eXt8/vjz7+nn6+ro8PXt6O3u6/D08PDz9Ph7eXNtbXV+eXBvdnp++vj+/vXv+fd+a2ZhX15kbG52e3l+7uXk5ODm6unt8vt9b2dkZ2dqbGxtbXz5/n18bml2eXB58fR79u7w7OHh6urt9XpvbWNkZ2hoZ3F3cXZ7fvfq6u7k5e3p4+To6ebp7e3t8unj8Pt+fG1qbGliYWlnaP5+e/To7Xz59HRjYl9bZHJy/PDs7ubd3ubg3Obq5Ovz+XxsYGJkXl5qaWNwfW9ra2xkZm5lYHn6bnb18Ozj39/l5enu7e54dfX/bm54fHr883Zv+nps//F7fPLyfv3p8n3t5+/u4+x7d3x4b3l+bGp5c2197+7r4eDp7Or7a2hoXl1jZ23/+fvu4uHs6eDm8Ovr9/92Z19eX11ebfxwd+/9cvz3cG97dmhu8P9v8+767+Pl5ubp83z8fWtufW1mbXlsa3f+cnjt+33t8Hv27vr56eXp6+Hh6OPl9f75fGlodW5janZmZnv+ee/j6e3j6XVsdWZfbXtxfuvu+ezi5evg3ezu5vVscHJkXWBjXmJuZmV3fmxv9HZpbXVpZ3V7bXbu9PDd2t3h3+Pu9PV1cPT7amt7a2FocGpr9e56/fpnY3l5cf7s6u7q5Ojs4+X69uv6eXx9a2ZydmZs9/304N7k4eXt/nBuaGh8/25seXN2+uno5t7g8vrzaWRvbmZnbW5qamhkaHl3a3D2+21vem5pcHZye+3n4tna5Obl6/5zc3RvdW5iYWBfYGZwd/vq5f1qcG5tefv36+Xl6urm5Obk4+/57uv3cG1rZmlsZ2f77PLw6ejr7u96bW93dHB1amd08fTw39ve4OHudH78b21xcWdpaV5aX2dgYm5xbHh+a2RvdWlt+fh85dnd4dzd5ufo/XB+8W9ocGhfZ3dqaf3veXD7bV9pfGtq8uv2++/9eubd5+jd4fHq6nRpeP1pZv18bezk9v3o4Ozu6P5pfPZoZnJvZHP09uze2/H+6O929vBvan39ZmFjXFljal9n/P1tbG5nZHJ+aXDs8vbm3ufp3N/w8Oz+bf5+Z2l+emVrdm1tfntoafx1aG14a2vx8Hd58vn55dze39re7/LweXN8fG5z7vN0fPt4+eTm8PPtfGhtdWlt+HVmc/Px7ebl9/rl6f7z8nh4e25jZG1kXF9saGv/dGdmb3JscPh9euzxfPjt6OXm6/X68PZvcHpxcX53dHh3dGtqcHJz+nRob359eX18d37v7fPm3eDo5+v6ffX2dnnz9X75/WxsfvL89Ojs+PP2cXT19HN1+fj28u3w7+bo8vTw+3R9fWZhZ2VkZmVfYW9rX2NqZ2NscnD66/P69/b9+OHi7uXe6Pfs6Pfw6fhseup8aG9oX2Vzb2Nob2ZodHVpcPN8d+7l5+Xe3u7q4Obr6uTo5+Hu/PHxenX5/HP++W1na3Bqb3htanvw/3fz6/Ds5/N78On5evV7bnb7c2t9/GxoamhhZm5nYW36dW57bGNpe3hy9evu8uz4eO7q+Hj27vXu6fN4fvl8dnl0bG9+b2l7/nd++Pn16Of2+u7vevPr+Pzq5+/09Pt1/e1+eevveP3v+Hvz631y8Ov47+v3+uzn8Hv4+m1zfWtmamVhZGprbXlzY2BnZ2Zqampze35ydPh0aHj4/O/m6O7v7O/t4Ol99ejt9vDt/G9sbWViaWdhZWlrcP77ePns6+7l5+zo4+bo5eTn7O3t9fj0+P718/Hw9XpteHlpZ3V4cHJ5fn7w8fbv7/P+/PX+d3t++3l1cHB6c2xtd3htbnlzc21qamtpaGpsamZlaG5wdXV0/fjy7/Lo5uno5+fj5ent8fx9cWVnZ2lvcP34/e/q6+3v8ezp6u7u6+r1dnx7dP/7e/3u7O/u6vD38PD5ent6+/D3efvr7Pr16u/+/H1tbHl5b3JwaGltZF5iZmZqevxvdfpvY2VsaGpwcWlw8v11+/xwfO7v7+fh6Ozk5O3n3uf8+fZyaWVfW11mZmz89f/y7n177OXm5N/h5uLk+XN8e2549/l+7uXt9O7u9+7ueW17fGxodHNxe/X08uzr/3VzbnD87vL48/R5bWZjYm5wbf7v+3dza2BiZ2hnaGloam5qZGx1bnB8/3x+8Pb77ubm5t/h5+Pk8HVtbWlpb25v+PD9/vxxc/fs6erq5er0e21tendy++7t8O7o6ezm4+7o5vHu6vpucPrz+Pbs7erj73t8cGhrcXttandtXltcW19oaGtz/ndoZmdjanBucn59c3Z6cG/87vp57u/5+fd4dfrq7Ojk6Onj6X1tcGlgY21uanz6cG17fvzw6uzs4+Pu8vx5/ezt9O3o6/n37fH16+vw8O/4e3VvY2d8/nj17O3n4+vz7+79dPz3eP75cmhpa2pudG5uef5rYGFiX2JsbGxwdmhlbGpqevf+ffPv+Xh5c3T58vLr5eLi4+Tp9PL2c2tsbWpubWZpdnFtevh7+/N5a2xvc3vu7O3s5enz7+bj6OXi4+Tf4e/z9Xn87u717efr7ufm7PLzdmxvcm9pZ2JfY2lpaGtraGtsZl9ma2docft6fft3dP319vDs7u7q6fZwbnFucXz+8uvs+nr29Xh7/nJpbW5oZGlrb371fXb48/f9/Xhz/vDv6uDf5ejn6+/o6fX98Orr6+z9b3Bycnv39PDr7fvz5+Tp7PD19fT3enr7fXn9/HVrbmxjYmNkaXBvam58fWlpbm1rcXhwffPu8fb3dG3/8//87Ozw7/D29e3tfXn1+X58dWpoanFubHBsam1rYmBrcHf57efo4OPs6efp6unq7e/t5unt6+3v7e/37+fo7/Ds7/Pq7fr27vpwcW9tb337b29uZ2JiYl1dZ3Fv++rye/t7bHLy8nVz+fX07Ov1fnp3c3ny/H32fm1scXR2eXZzevL5dXp3bm95/nlvb2tnZ2lqc+7t8+jc3OHi4+np4ej48/V9bXN+bWt99Xh87fD58fD7/u3r+O7l6Ovn6vf37Orv8Oz4dnRsX11kZGFmenx7831rZGRjZnBvZGRxc2pv+35weHx+8+Xp+/Hr9/np6v968PD57On2++77bHJ2a15eXldYY2ts9eXn597f7e3i5/ru5/d8fnNpa3h7eO/o8u3g4u7t5+vv6+v39ubv+/DzcXD49Xp8+XBmZWReYHFyb/fl6Pfu7nRpbWVfY2ZfXmprYmr9/m51/Xr/9fJ+fPT3ffLye33w7vfu5Ofw7e55eHdoXmBkYGJt+ffr397g4ufw8/D+bm58bmNhZmBkcnv67Ofq6uTj6Ong4uno4+Pl4ePp6ubt9/Hu/XZ9c2hkZ2diZmtscPf5bGdlX1tbW1hYW11bX2lqdPLs7e3p5u3t5+vv5+Xu7+vr7ejl6uvm7Xt++XJpZF5aWFteXmV98O7j4Onv7u98ev51bnh3aGx+enrx5+bn5OHm5+Dg5ePi6uvl5e3t6fB3/Pdze/D+dXd2bGdrbGdq/vx+9fptZGFfWFVZWFZaXlxhcHFt/u70fvDufvzq7O3l4ujo4eHt6uHl8u/ufP72dmdpbWFcY2djbe7p6uXk7vP1dWVqdmtkbHBrb/nx9efe4+ff4efk3N/l3tzg493j8ejnfXX48//67fd1fn5rY2loY2l5dG1zcmNdXlhUV1tXV15jYWt8e3b07vf06urs6ufq6N/b3eDh5+/r5vH+9vh4dndrZWRgXFxlbHbw7vf37u33dm1qZGhtbHD8+Pnz6+bl3dvg497d3dvd4+Hd3+Tn6vD9e3h0//bw8fn6end5cmlmaGxsb29udXdsYl5dWlpZWFtdX2Ztb251/3hyeXx+9O/u7eXh3d7l6O7x8vn49/Hz+f14cXRzamZpaGd4/P/16+3z/n1wa2tnYmZtdnr07e7q4t/j497e4N7d393Z3OXk5vX07vd9+/P49uns+Pft+21xbmhkY2NgZ21iXWFjW1peXFhbXV1hbm5odPxsan31+vTp6ebd297h3t/t6uXu8u7t/v3u/HF0e2Zga2lganlweO3reXP+b2Rla2Zo/f548OXq8eje6Ofb293Z19zd2N7u7un7bHb/c37t9vrq5/V89v5oZWpiXWNoYmNtZV1fY1xZYWRbYGtoZ3F0ZGRsamRy+3Z86uXr593e5ePf5ujg6Pju6/576eTv8+95Z2hoYGd6dHP36/X9/nhoZ2tiZHB4bXrr7vry6eru5OLl3drc3tzf6+vk7frx8nNx+Pj36eTq7ev2b2lmXlxhY19gZmFdXV1ZWmJiW15oZGRsbGVma2dod/X78uPk6uPc3t/d3uDd2+Pv8fN+fO/v9/j7bGVoaGBkc29odvl4cHlvZWtwbGl4e3B77fT57+vn6uLf3dvZ2t7e3ubo6O/+//5wbW92d/Pw+fj0e2tpZmJiaGpoZmtoX19fYWBla2dkaGtsamthZGZgYWZubnjz6urn5OHf4+Ti4ujw8/d9fvXr7Ozr7fxzb3Vzd/7/9fb3/X54cHN4b2tqbWtod/x+e/Pu7Ozt6eTf4+Pg3uLl4d/l7PH3cWtvb3b48PTt7/pzbmNfZGZhX2dmX19iYWFkYmFfX15dYmViXmNsZmh1+3r56err5N7g397f4N7g6PH0/HJ38Oz29+3zdHR7/nr/e/75fnBxfm5rdH1ubHl6bG59+Xz76ebm49/i3dre4dzf7+3j6H337PhvdHZubnx8fHpxaWVrZ2FmcGlianBkYmtuaWl1bWRgYF9jYl5eZWtkaHv6evHn4urj3+Dk5eXq6Oz6fvt4cf7p7fDq6X5xfPh+e/Tz9/z1/PTyfHR9eGlpev5ud/Hw++/p6u3r6ubj5OHg3urv5+Pq8Ovn9254/HtydnV2bmplaGZhX2ZpY2hwdmx0fn5sa2xmXVpbW1xbXWRraGdx8vj86+Hn6uPi5Ofj4+Dm6/Lw833+7enr6+Xm+//4+m5y+/b//vv88/b6ff5saG14cG50+PZ79O3t8+zl3+Lg393i7fHn4u3p4+bz/Xp6bmhnZ2JdXF5hXV5fZWdscf55b/rxe21ubWpfXl9hXl5jamljbfny/e3n4+zv6ufs7Orm5/Hw7O17evLm6e7o5vb//n79fPLq5+nr6OLq+fn5cGdue3ludvz+cHR9/Pv//PTp6+zq5uz27eHp7u3n6PD69/N6cHBwZ19fZF9bXm19dXvs5/t+9/5oYWRnYFtbYmBaW15mY2l7+P706ubq9O/k4+jl4d/k6efi6vft5ufx9Ozp/HB0+351/eXq9eri7HBx/X1mZnN+bmx593119OXn8vDl4PD45+Pu7OLg6unj4Ofz8vH3cmlrZl1aXFxYVVxoaWt96ens8X57d2tpaGpfXWFiW1lfaGhqffjz8+vu7+3u7ejs9fLo5fL47OXx8e3s/Pb77fN4d/Lp7vTg2eLr5uN4anb1c2Jq/XZmZG38cW715O798eT5aHjn6f/p3uPv597j7+jj5fF1cXFsX11gXltcY25v/eni6X1ya21mYF1jYFlWW1pUVmRrYmT/6/5y9+fs7+Pb3ers3t30+ODc7Pbo5Pf+6ub9cPru93j26Ofr7ft9bWlsbWxrbGxoY2Nlbvnu7enf4u367Ov58dzc5ejb2un25d7s/PDscWNlcmJXWWBgWVppc2hx7vBoYGx1ZGBxemVdXV5dWl5paWl0/f95e/v57+bg5eTg5e/z6eXs6ODqe/3o7Ht38PF4eejf5uvg3u509+n8a3T1emhqcmRaX3N1aXHv7HJsffH9+OLc4Off2t/r6ufo5ufu7+3yfnVxbWRka21rZm74eGpqcGtiXmZkW1pgWk9RXF1YW3B0Y2Z7+XBv6t3l7N7W2uXm3t/v7N7g8/Xm6n1+8PV+fv349/L0/ntvbnr9+f36dW5uaWVocHRqbfj0+vLl7fvq3N3h3Nbb39zb3uns4+d1bPz1aF5mbGFcbPlsYGx7a11kcG9rbHBua2ZkZF5bYWdmYmZtbGlscW529e3t6uvs6ebrfH7n6Pr16O19evPxdG/y5On38ODk/37o6Pbz5Of8dPLya2RtdHFraW1oYmBmamZt8ePl49za2trb3uDg4OXl5eny8O39b3j2/3J49ftrZ21qY2BpbmJcXmJZUlVbW1peaWZjaWxtbG167unm4N3c3Nzc3N7d3N7i4+ru9vX+b3n/c3D+fnNsamhmZ3P6+vr98PZwand6dHD+/nBteHZqanb38OHd29vb2tzd3dzd4enp7fJ4cG1jYGVwbGx79nNtb3RtbXRzbWtvbW5kYWFjaGxxdW5pa2RgYGtwePvw7e7r7fHx8Pfu6OTl5+Xr9X59fvT5ffzt7/r16/B79+no8Ong5vh5eXBsbXhwa2ZnZF5aXGBeYnHu6eTe3ODh3tzc29zf4eTp9/v3/nd9+vny9fd5d29vcP9wZmhsZl1cWlhWWVxeXmVpaGRfX2Zqa/Tp5+ff3eLn39rd3drZ29zf5PD8+X79enNvdm5oZmxrbXF7e37v7vD+/m5vdntvcXx0aGNoY2NqeX7t4tza2tzj4d7c393d4+/zdWdma2ZfZWlrbXh1b213enZ7b212fWxlYmFeYGNiYWp5a2hnaGRnbXFv++/r7vb8/urm6Ojh4OLk4+rw6enx+fT3+Pv7c3r07evr6Orn4eHs+Pv8dXNwbW1rY1tZWFZZXWFlcO7p5uTi4d/d3dza2Nvh5u98eXx1bG99+fb39/z8d3J5dmtmbmthXF1bWFVWV1laXF1gYmVtcnh78ujo7Onn5eLe293c29vd3eLp6Ojx/Pf0/nN2bmpqb3F5dHv27ez69u7vdn7v8Xz8/HBiX2RgYmFocPn07OXf5eLd3eDf293k7O14b2pnXmBpZmhufW5w//lzefz0+v1+cm9saGNiXVtcYFxZXmplXmlvbWh3fX159uvl5Ojl39/p5uHh6+nm6vXq4+jx+Pd6fXz+fe3q6efg5PDw7/lvc3NsZGNeXV5cWVxiX2Ry8vft4Nrd3NjX2t3b297p6u71c2trdmplcHpxanV2bWlxcGtoaWRiYWBhXVtZWVdaWl1haGlxe3n48fL05uTi4drc4N7b3ODf4OHr7+zr+fX4/HRtbGxubHP57PLq4uDs5+Ln8Pn7c2pma2djX2RjY2Rsdv716d3c3Nza3+fp6PD2/nluamtlZWVqZ2xyd3b+9+3v9fH19nx7cHJoZWRfWVdaW1lYXWBiX2dqaWZu/ff37uLh4+bd3N/k3t7j5t/c4enr5evu9vn7fXz18O7s6uTm6/Tt7vhvaGJfXFteXlxbYWVoZXD27eve1tTX2Nfa3+Xg4+53ffd4am13c2treXNsaHJ5cmhqcm5oZmhnYl1eXFlXWVxeXl9ma2llbHh3b37q5ejg2tvf4Nva3+bh3+Pt5uPr/fzt8XJtfPt0ce/o7vbo5Orw7efseWpsamJdX2JhX2NnaWtx+fDr5d3Z2t3g3+Lv/PLwenF2fXRsevb5fvzx9H187u32eX77cWZsdWleXmNeV1dcXFdXXWJeXF5jY2Jqe/Tu6uHd3d7e3d7f39ze3t7e4Ofq6ejvffzw8H3+6eTq8uro83R79XVmYmhnXlpdXltaYGpmZnbs7eve19bb3Nnc5/Hp6O708uzx+3zx7fh8/vb8dnp5cm1scG5qY2dmXVxcXVtXWFxdWFpma2VeaHJsa3rk39/e2dfe393d4+nh3+Pn6ejz+vTy/G91e3RvcvXt7fTw7PT7fvbydG1tcWpiYGJnYV9la3JwfO3p6ePb3ODn6er59vD4/Xv7fHNwe+73+PTr6Pfz7+36eH56d21vcWtnYF1eXVxaWlhaXFpaWl1eXWJs+e/p4d7c4ePh39zg4NzZ3OPf4ODo7Oru7vr99/Pv7u309/B6cHR+e2ppcXppX2FhYVxbXmBjZXTw5+Pi29zc3OHl6ePo7+3p5fV9//r3dHb88/Z1eHp7b2hqamljYWVnaF5eX2BiXV5dXl9dX2FnZ2Rpc/Lv7ubd2d7h3t3e5+Xg4Orw6urr8/bz+vd7cHF3+Hz79e3s/v787fB+9O3o9HV0cW9jX2NpamVtfPHu9Onm5ev38fDv/P/z7+7+d29veXB3/evq+vPr5/d1//t3aGdtbm5laWxpY1xdXFtXV1lbXl5dYGFoaXD56uDi4t7b2tzb2tja4OHf3ePr5eTp/X7x7/Z5+PPz+nZ1b3BtaW50fHNpZ2doXl1gZGZjaHXz7u/h3Nvf5OLg4Onp5OHj8PP1+3hrdv3+d3f6/f14bmxnaGRhYmZpZGRqbWlfYGFiXllcYGhgXmdrbmp07eTi4tzc3Nzb2dvc3+bn6uns8vTx7ft9+/HuenJ+7fR0//L0dHL18/l2c3hxbmhpaWlnYmhvefj18Ork5uvt6+fu8Onm5fL6+Pp5anP38fx88evs+v/6e29nam1qa2xxbWtvbWliYl9ZWFteXFpdZGpmZnbt7Pju4Nvb29XU19zd3ODn7Onp7Ors6+vn5/L/fu/te3N1/XVpbHV9a2RqbGJcYWtnYWFsdHN1+u3s5efp6OTf4uLh4d/k6Ozs8HJ4/fl3bHJ+fGlnb3RuYmFra2tna21qaGhrZ2NfXl5cXV9gYmpzbGt46eLv7d/a297a1tne4+Lk7f/+7fH5ffPs7O33/n74+3l3+/H6dX328H1ubm9nXmBobGdmcPz9b25+9vl++evm4+Pi5eXk5+318/pwbHZ+enX+9/9sanH+e2lreHhwa211cGxpaWRkXlpaWlxbXF9oaGNobvnt8O3m3t7l39jV2t7c2d7q7efq8vru6Ont8O/z+Ht8/vv0fnFyevx0amhtaltbZW1lYW19fG5w9uzu9e/m4+Tm5eDf4+jn6+z6b2xxenNxc3R5bGJkbGxian71eWxz+31rZWhoZF1cX2NgXWBhYGFiY2VyfXv46uDi5uHd2d3f3tze6u3o4Oby7+vq7/nx7e/69uzl6PHv7/X9dnBtbWxgXWBpZGFobHptaXnx8nd08+jt8OTe3uHj4OTn7v53e/15c3j/fWxmaW1ua253+XxtcHh5aWFlaWVdWl1fXlpcYWRiYGNqdnR78Onk4t/c3Nrc3d7d3eTn5t/j7/Lr6fL9+/Hq7/bt6On7enx+cmlqb3BmY2ZmaGVjaG5zbG1z/fZ+/PPq5+vn4N7h6+vp5/V8+fX7cHB1fHVpaWtvb2t1fvb9c3z9fXFta2djXVxdXl9eXmFmZl5fZ25qbP7q4ODi3drb39/e4Obu6eTk5+rp6unu9Pft6vX37Ofn8f79+HlpZ2ptaGJka29ranB8emppcXR0bG5+9PHx6+Xj5+3r6Ont8PLz+nJtcP/+cG95+3pwfu/u/Hj9/n1xbGxmYl1cX19dXF5hZ2diZWltbGlv9Ofo6uHb2t7f3dzg6Ofj4+jt6Obo7O3p6+33fvny7/t5fP57aWRoa2dgZW55b27693xtbXFzcGltfu/x+Ozl4efu7Ovr8fz49ftvbXJ7d21wefj6ef3u6PR6+PT7a2draWNeX2RmZGBjZGJhYWNma2hmbP/u9fXr4t7j5N/c3uXl4N7k6ePf4Obm4uTp8vf07+719+7t+W5nZWlmYmFodXNudP17a2ZqbWZeZXB8d3H56+rv8Orq6uvv7+7u9X789fP2+vfw+Hd78/F+cXvz/WpjamtnY2Vqa2lkZGVkY2NoamtsbHJ6/fr77uXg4eDe29zh5ODc3+fp4uTr6+bo735++Pl+d3r1+nVtbW1rbGludnr/b3N7/nZvdHl3aWlvc25pdfPt9H337/R6evbz9v758/Dv+P76/fb5+/f1+Hj89/lyZ21wdGpseHlxZmZlYmBhY2VkZGRnZ2lsbv3u6Obl4OHi5+Tc2t3g3t3c4Oni4efu8Ovz9/96+H10b21tbmxqbHZ3bWtubW9tZ296dWpmam9ua3fu6e707Onw+fzw6uz29Ovu9Hx4/f3/eHp6cHJrb3h2cmptc3Nubnz5d2dma2xoZWdtbGdgZ2pra3D37Ofp6OLk5uzr5d7f5+fi5Orw6+fo7fvz7/d9ev3/fHN2/X18ef749n5wdvx9cmtvcG1iX2RmZ2Rq/vt9c3b2+v767+Xn7+/s7PN8e/fw8/P39PV+bm91cnZxdXx7d3R5/H5tZmxsZl5hZGJdW11hZmdsfe3o6uvl4+Ll4t3c3N/g39/i7Oni5evy7ev0d3D+/3FtcHRvb2htcXV6b33+eXFsbGhmY2Bla3Nxc/zv9Hp68O7x8urm5efu7e30/Xr39/n8fv1za2VnbGtsbnV89Pt4+vPx/np7fnVnY2RiX15eZGlmZ3X5+Pn67evp6Ovl4+Tn5uTl5uvp4+Tj6evo7PV8/vb8fHr59PV6e/Hy+X77/XlrZmVfYF5dYmhoaWxxeHp2dH7w7O3q4eHn7Ovo5u/06+zv7/X7/XVra21tbmpweXd3cHz4+/V7eHhuZV5eXV1cXmNnaWVufH73++vn5OLn397e4+Xh4uDi4ubq6fDz8fh+cHb+fXh0d3x8eHD+9PX8+vJ9b2doZ2NkYmlucXBwfnz+/frt7O3w6+bp6vT28/f5/fjy9Xx1enhva21ubnBxdvv79/zy7Orr9/D3dGpkaGZjYF5iYmJfZGxsamt+7evs7uno6erv5eLk5eTg5OTq7Ovy9n75+f/4eX3v9/Tu9O/q+PvweHFkYGNfX1xeYGJkYWtzcHN79evn6+ji5ujs6+jp7Pbu6/H3fPr4enJucXB2b295e/x5efh+fnZ+bW5uZWZfY2FdZGRgYmVtbnB18+vu6Ofm4OXm5eDf3uPo5+3r9vV+/n5sbnhyfHB1+/l+/e3z7/D38P14cG5vbGZgZGZnampzdHF4ePvz7Ozw6+vp8Pjs8/f9+O75/nf//Xl3bXx+fnl87fLt8O/q8/X7/nx1cmppbGhjX19cXV1dZmVma2x99O/x7enp6urj4OPi397i4+bt6e7u9nf2fvn+9u7w7PTy7fL1ev15bWllZmJeXV1gXWBjanBxfHn27Orp7eXj5OXp4+Tu9PXr7fT7/vB2cG51/m53eP30ffj++H7+fm52bWxsam9qbGJlZmNlZG96end3+e7v8ezk5+fs6+Tp5efo5u3s+vX8c3Vy/3l69vnu7Ovw8evs8fz59n19b3BuZWJeZGBgaWd1cHd8fPL18/H07u3w9vDu9PZ+7/T9/Hn89318eu5z8+bw43rs7/Xq/nptdW5ua2Rra2ZgXGBgXV9lb2ltbX78+PT55Oji5+zm4t/i5d7j5unu6/T7df309u7y7O7s7vHo7/twbmZ2cWtpY2JdW11dYWNnb3h5//bv7ezy7OLn5ufq5+jr8uzm6vV7/P55eHD5+n19evj4enh7/HduaGdrZWlnaW5pZV9jZm5sa/fz+f787O3y9Ovn6+zu6ebo7Ovp7fL6fPp5dXRy9/vz+PLs7+zz7Ovx+Hl5enZzdXhuaWVhZmVmaG58eX13efl+fnV9+v77fPfy8vL57ez0/Pv1+nx+8urt8fDq4+nz9e30eXRscG5uamlqYmFcXWJeX2Jrc21ra3X+enn86+vu6+ri4ePi4N/m6uzo7Pnw9O/q7O3w7Ovs8vju+XJrZmtnZWZnZ2FfX2RkZGtvdnh2enr39PD27uns6u7o4+bl5+Li5uv38f52eXj4+3h0d/94cXF1eW5samxxbmtpampoZmhvcHR0d/t8eXV59Pj58ero7u7u6ujs7ezq7fP6fvp5ent79Pr49vXx8/L27ev1+Hv293d0c/5yb21scWlramltaGtrb3Bsb2t0dXf8/fDs7e7q4+Xq7u3s9Pfz6Obq6Orr8Pr1/PP3e3pzdmlmY2BjXl5eX2RgYWJnamxub351e/327ezr6uXi49/j397i4OTj4+rt7uzw9Pl79H17enB6cm9qaWliZGFnaGdoaW5raGhnb2pudXn29vDw7unr6uzm4ebk5+Pl6Ozx8H13c3P+dnFyc3VxdXB7d3F2anBvamtnbG1sam53bGxvdHtze379/H32/Pbv9fX09fn39/jy/Pr79vDz8fPu7e/1+/Px9e7u6urs7/DzfHxzdHdvcGxsZ2VjX2JgX2BgaGtsa298e3x6++3v7Orm4uTk5OLj5eTl5Obo6u/q7vT09PV9em1vcGdjYF9eXV5bXFtcXV9nZmtrbnp6/vru6uvo6OTf4OLi3+Hi4+jl5ubp8/P5fnh2fnx4c//+d3FscHBqZWNqamhmZGdlZWNnbGxudffw8O7w5+jo6evl5enr6+fn6e7t7/b4d3RzcHRyeHt5eXv9d3FxdXh1cmtqdHBraGxuaWpoa2tve3r88/n5+fL58vv67vXy+PT17P779PLz+vjz7vT09Ort7Ofi5ebg6uvs7XZscm9sZmZoZGBeXmBfYWVpcHV3cv5++vv77fLs6+rh4+Tm5uXk6Onn5Onr7e/47uvh3ed072xrfV5iX15iXlleX2hcW19jY3BsbPdx8nvp7nLk4uTo5Ozu7/Dg9PTo4O7u9e3t+nh46nj073H+63trfnRpZWFt/Gdhb2pgamJ+7Hd44+Pn4+jf3+3s5ejf6ePf3+vj6fDm/Xbm8Hd8anhrbm3t+XDh/Xp2c/VobWxtXHlnVm5XaFpj+HN+bXZs7fd372n+6n18dut7/3Z9fX5+6vf46O156Odx6uXc6ubb3O3m2ux+/vD7/21vXWJhWmZUYGlsWWN3YWRw/Vnz4mb24ejiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmJlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8KQEAgLTAsMCArMSwxNyBAQAorOTc1IDEgMAorOTc1IDEgNjAwMDAwCis5NzUgMSAxMjAwMDAwCis5NzUgMSAxODAwMDAwCis5NzUgMSAyNDAwMDAwCis5NzUgMSAzMDAwMDAwCis5NzUgMSAzNjAwMDAwCis5NzUgMSA0MjAwMDAwCis5NzUgMSA0ODAwMDAwCis5NzUgMSA1NDAwMDAwCis5NzUgMSA2MDAwMDAwCis5NzUgMSA2NjAwMDAwCis5NzUgMSA3MjAwMDAwCis5NzUgMSA3ODAwMDAwCis5NzUgMSA4NDAwMDAwCis5NzUgMSA5MDAwMDAwCis1MjAgMSA5NjAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI1ODFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWJmY2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbwpAQCAtMCwwICsxLDEyMiBAQAorMjYzNjIgMSAwCisxMjAyMyAwIDgzMzMzCisxMDY0NyAwIDE2NjY2NgorMTAyNjkgMCAyNTAwMDAKKzExMDc2IDAgMzMzMzMzCisxMTEwNCAwIDQxNjY2NgorNTkwOSAwIDUwMDAwMAorNDI5MSAwIDU4MzMzMworNTE0OSAwIDY2NjY2NgorNTM1MyAwIDc1MDAwMAorNTE4NSAwIDgzMzMzMworMjczNiAwIDkxNjY2NgorMjE1NzUgMSAxMDAwMDAwCisyMTk2IDAgMTA4MzMzMworNDM0MCAwIDExNjY2NjYKKzMxMDkgMCAxMjUwMDAwCis0NDEwIDAgMTMzMzMzMworMTczMSAwIDE0MTY2NjYKKzQ1NTcgMCAxNTAwMDAwCiszMzc2IDAgMTU4MzMzMworMTM1MiAwIDE2NjY2NjYKKzI4NDQgMCAxNzUwMDAwCisxNzg3IDAgMTgzMzMzMworMTA4OCAwIDE5MTY2NjYKKzM2ODQzIDEgMjAwMDAwMAorMjUyMCAwIDIwODMzMzMKKzM3NDkgMCAyMTY2NjY2CiszNzg0IDAgMjI1MDAwMAorMzQwMiAwIDIzMzMzMzMKKzM3OTUgMCAyNDE2NjY2CisyMzQ1IDAgMjUwMDAwMAorMzE0MiAwIDI1ODMzMzMKKzI5NDggMCAyNjY2NjY2CisyMDE4IDAgMjc1MDAwMAorNTEzMyAwIDI4MzMzMzMKKzIyNzYgMCAyOTE2NjY2CisyMzQ2OCAxIDMwMDAwMDAKKzE1MjIgMCAzMDgzMzMzCisyMjk5IDAgMzE2NjY2NgorMzI3MyAwIDMyNTAwMDAKKzI2MzAgMCAzMzMzMzMzCisyOTE1IDAgMzQxNjY2NgorMzAzMiAwIDM1MDAwMDAKKzE4OTAgMCAzNTgzMzMzCiszNzE4IDAgMzY2NjY2NgorMTk5MCAwIDM3NTAwMDAKKzMxMzkgMCAzODMzMzMzCisxODA2IDAgMzkxNjY2NgorMjMyMDggMSA0MDAwMDAwCisxNDE5IDAgNDA4MzMzMworMjI2MyAwIDQxNjY2NjYKKzMxMzEgMCA0MjUwMDAwCisyNjQ1IDAgNDMzMzMzMworMTg4MCAwIDQ0MTY2NjYKKzIyMzkgMCA0NTAwMDAwCiszNjM3IDAgNDU4MzMzMworMTk0MSAwIDQ2NjY2NjYKKzE1NzcgMCA0NzUwMDAwCiszNzc3IDAgNDgzMzMzMworMTgxNiAwIDQ5MTY2NjYKKzE5NjAxIDEgNTAwMDAwMAorMTEwNCAwIDUwODMzMzMKKzI4MDggMCA1MTY2NjY2CisyNDExIDAgNTI1MDAwMAorMjE1OSAwIDUzMzMzMzMKKzI0MTEgMCA1NDE2NjY2CisyNDA4IDAgNTUwMDAwMAorMjM4OCAwIDU1ODMzMzMKKzI0MTggMCA1NjY2NjY2CisxNDgxIDAgNTc1MDAwMAorMTkyNiAwIDU4MzMzMzMKKzkwMjIgMSA1OTE2NjY2CisyOTIgMCA2MDAwMDAwCis3MDEgMCA2MDgzMzMzCis3NDcgMCA2MTY2NjY2CisyMDU5IDAgNjI1MDAwMAorMTY5MyAwIDYzMzMzMzMKKzIwNzggMCA2NDE2NjY2CisyOTc1IDAgNjUwMDAwMAorMTMxNyAwIDY1ODMzMzMKKzE3NDIgMCA2NjY2NjY2CisxMDE5IDAgNjc1MDAwMAorMTA1MyAwIDY4MzMzMzMKKzE0MTgzIDEgNjkxNjY2NgorMTQ2NyAwIDcwMDAwMDAKKzk5NCAwIDcwODMzMzMKKzE3MDkgMCA3MTY2NjY2Cis4MzggMCA3MjUwMDAwCisxMzI4IDAgNzMzMzMzMworMjI5MiAwIDc0MTY2NjYKKzE4MjkgMCA3NTAwMDAwCisxNzI4IDAgNzU4MzMzMworMjQzNiAwIDc2NjY2NjYKKzE4NTIgMCA3NzUwMDAwCisyMTkwIDAgNzgzMzMzMworMTUxNjcgMSA3OTE2NjY2CisxMTg4IDAgODAwMDAwMAorMjA3MCAwIDgwODMzMzMKKzMzMTYgMCA4MTY2NjY2CisyNjM2IDAgODI1MDAwMAorOTUwIDAgODMzMzMzMworMTI2MCAwIDg0MTY2NjYKKzkwNiAwIDg1MDAwMDAKKzEyOTQgMCA4NTgzMzMzCisxMjk4IDAgODY2NjY2NgorMTg5NyAwIDg3NTAwMDAKKzEzNDggMCA4ODMzMzMzCisxMzE5NCAxIDg5MTY2NjYKKzEwNDIgMCA5MDAwMDAwCisxMjU4IDAgOTA4MzMzMworMTQ1NyAwIDkxNjY2NjYKKzk5MCAwIDkyNTAwMDAKKzkwMCAwIDkzMzMzMzMKKzk2MyAwIDk0MTY2NjYKKzM0NDggMCA5NTAwMDAwCis3NzQgMCA5NTgzMzMzCisxMDc1IDAgOTY2NjY2NgorNzUwIDAgOTc1MDAwMAorMTA1NCAwIDk4MzMzMzMKKzEzMTM5IDEgOTkxNjY2NgorMzEwNCAwIDEwMDAwMDAwCiszMzY2IDAgMTAwODMzMzMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzU3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjEgQEAKKzE2OTUgMzIgMAorMTkzOCAxIDMzMzMzCis0NzEgMCA4MzMzMworMTUzIDAgNjY2NjYKKzk5IDAgNTAwMDAKKzY1NyAwIDE1MDAwMAorMjYwIDAgMTE2NjY2CisxMTUgMCAxMDAwMDAKKzk5IDAgMTMzMzMzCis2MjIgMCAyMTY2NjYKKzIxMSAwIDE4MzMzMworNzkgMCAxNjY2NjYKKzk1IDAgMjAwMDAwCis1OTcgMCAyODMzMzMKKzI4OCAwIDI1MDAwMAorMTQ1IDAgMjMzMzMzCisxNDcgMCAyNjY2NjYKKzY3NiAwIDM1MDAwMAorMjg0IDAgMzE2NjY2CisxNDQgMCAzMDAwMDAKKzEzMSAwIDMzMzMzMworNjU4IDAgNDE2NjY2CisyNzAgMCAzODMzMzMKKzEwMSAwIDM2NjY2NgorMTUxIDAgNDAwMDAwCis1MjkgMCA0ODMzMzMKKzI1NyAwIDQ1MDAwMAorOTggMCA0MzMzMzMKKzE2MCAwIDQ2NjY2NgorNjY0IDAgNTY2NjY2CisxODYgMCA1MzMzMzMKKzE0NyAwIDUwMDAwMAorNjcgMCA1MTY2NjYKKzc4IDAgNTUwMDAwCis1NzUgMCA2MzMzMzMKKzIzMCAwIDYwMDAwMAorMTM0IDAgNTgzMzMzCisxMTQgMCA2MTY2NjYKKzYyOSAwIDcwMDAwMAorMjI0IDAgNjY2NjY2CisxMzggMCA2NTAwMDAKKzEyOSAwIDY4MzMzMworNjQ1IDAgNzUwMDAwCisyNjQgMCA3MzMzMzMKKzE0NSAwIDcxNjY2NgorNzA1IDAgODE2NjY2CiszNjUgMCA3ODMzMzMKKzE1NiAwIDc2NjY2NgorMTYwIDAgODAwMDAwCis3MjUgMCA4ODMzMzMKKzMzMCAwIDg1MDAwMAorMTM4IDAgODMzMzMzCisxNjIgMCA4NjY2NjYKKzYzOCAwIDk1MDAwMAorMzM3IDAgOTE2NjY2CisxNzAgMCA5MDAwMDAKKzEzMyAwIDkzMzMzMworNDMyIDAgMTAxNjY2NgorMjg3IDAgOTgzMzMzCisxMzAgMCA5NjY2NjYKKzEzNiAwIDEwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxZjdjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5NDkxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMzAyIEBACisxMDc1IDMyIDAKKzEwNzUgMzIgMAorNjg2MTMgMSA2NjY4NworMTkwMjUgMCAxOTk2ODcKKzI0MDUgMCAxMzM2ODcKKzc3NyAwIDk5Njg3Cis2ODEgMCAxNjY2ODcKKzIwMjU0IDAgMzMzNjg3CisyOTI3IDAgMjY2Njg3Cis3NjYgMCAyMzM2ODcKKzY1OCAwIDI5OTY4NworMjA3ODYgMCA0NjY2ODcKKzQyMTQgMCAzOTk2ODcKKzYwOSAwIDM2NjY4NworNjYxIDAgNDMzNjg3CisyMDgzOCAwIDU5OTY4NworNDIwOSAwIDUzMzY4NworNTA2IDAgNDk5Njg3Cis1ODYgMCA1NjY2ODcKKzIwNDE1IDAgNzMzNjg3Cis0MjA3IDAgNjY2Njg3Cis0MjcgMCA2MzM2ODcKKzUxNCAwIDY5OTY4NworMjQ0NTcgMCA4OTk2ODcKKzE5MDQgMCA4MzM2ODcKKzkyMSAwIDc2NjY4NworOTkyIDAgNzk5Njg3Cis1NDMgMCA4NjY2ODcKKzI0MzQyIDAgMTA2NjY4NworMTgyMiAwIDk5OTY4NworODQwIDAgOTMzNjg3Cis4OTIgMCA5NjY2ODcKKzcxNSAwIDEwMzM2ODcKKzIyODkzIDAgMTIzMzY4NworMTYxOCAwIDExNjY2ODcKKzg4MSAwIDEwOTk2ODcKKzg5MCAwIDExMzM2ODcKKzc5NCAwIDExOTk2ODcKKzI0MjkyIDAgMTM5OTY4NworMTY3MyAwIDEzMzM2ODcKKzc1NSAwIDEyNjY2ODcKKzgxMCAwIDEyOTk2ODcKKzU4OCAwIDEzNjY2ODcKKzE5ODI4IDAgMTUzMzY4NworMTUzOCAwIDE0NjY2ODcKKzg5NCAwIDE0MzM2ODcKKzkzMyAwIDE0OTk2ODcKKzE5ODUzIDAgMTY2NjY4NworMjAxMSAwIDE1OTk2ODcKKzk4MSAwIDE1NjY2ODcKKzkwMCAwIDE2MzM2ODcKKzIyODY5IDAgMTgzMzY4NworMTU2MiAwIDE3NjY2ODcKKzg0MiAwIDE2OTk2ODcKKzc2NSAwIDE3MzM2ODcKKzY2NSAwIDE3OTk2ODcKKzIyMzQ2IDAgMTk2NjY4NworMjI0NSAwIDE4OTk2ODcKKzUxNiAwIDE4NjY2ODcKKzYwNCAwIDE5MzM2ODcKKzI0MzMzIDAgMjA5OTY4NworMTc2NSAwIDIwMzM2ODcKKzMxOCAwIDE5OTk2ODcKKzMyMCAwIDIwNjY2ODcKKzE4NTc3IDAgMjE5OTY4NworMTEyMyAwIDIxNjY2ODcKKzMzNyAwIDIxMzM2ODcKKzE3NTA5IDAgMjI5OTY4NworODY5IDAgMjI2NjY4NworOTAxIDAgMjIzMzY4NworMjMzNjYgMCAyNDMzNjg3CisxMjE3IDAgMjM2NjY4NworMzgwIDAgMjMzMzY4NworMzQ3IDAgMjM5OTY4NworMTk1NDIgMCAyNTMzNjg3CisxODg3IDAgMjQ5OTY4NworNDY3IDAgMjQ2NjY4NworMTg5MzkgMCAyNjY2Njg3CisyODYzIDAgMjU5OTY4NworMzE3IDAgMjU2NjY4NworMjcyIDAgMjYzMzY4NworMTkzNTMgMCAyNzk5Njg3CisyMDkyIDAgMjczMzY4NworMjAzIDAgMjY5OTY4NworMzEwIDAgMjc2NjY4NworMTg4MDAgMCAyOTMzNjg3CisyMDM4IDAgMjg2NjY4NworMjQyIDAgMjgzMzY4NworMTk5IDAgMjg5OTY4NworMTc0NTIgMCAzMDk5Njg3CisxMDYwIDAgMzAzMzY4NworMzAxIDAgMjk2NjY4NworNDUyIDAgMjk5OTY4NworMjU2IDAgMzA2NjY4NworMjEzNTIgMCAzMTk5Njg3Cis0MDkgMCAzMTY2Njg3CisxNzMgMCAzMTMzNjg3CisxOTE0MiAwIDMyOTk2ODcKKzY0MiAwIDMyNjY2ODcKKzQ2OCAwIDMyMzM2ODcKKzE5MDY2IDAgMzQzMzY4NworNjM1IDAgMzM2NjY4NworMTk3IDAgMzMzMzY4NworMTkwIDAgMzM5OTY4NworMTg4MTMgMCAzNTY2Njg3Cis5NjkgMCAzNDk5Njg3CisxNjUgMCAzNDY2Njg3CisyMDMgMCAzNTMzNjg3CisxNzM2MiAwIDM3MzM2ODcKKzI0NiAwIDM2NjY2ODcKKzIzNiAwIDM1OTk2ODcKKzE3NCAwIDM2MzM2ODcKKzE2NCAwIDM2OTk2ODcKKzE3MDgxIDAgMzg5OTY4NworMzUzIDAgMzgzMzY4NworMjIyIDAgMzc2NjY4NworMTgxIDAgMzc5OTY4NworMTQ4IDAgMzg2NjY4NworMTA4MzUgMCAzOTk5Njg3CisxODUgMCAzOTY2Njg3CisxMzkgMCAzOTMzNjg3Cis3NTEwIDAgNDEzMzY4NworMTQ5IDAgNDA2NjY4NworMTI5IDAgNDAzMzY4NworMTMyIDAgNDA5OTY4NworMTA2MyAwIDQxNjY2ODcKKzgwNSAwIDQyNjY2ODcKKzE1NyAwIDQyMzM2ODcKKzM5NCAwIDQxOTk2ODcKKzkwODQwIDAgNDM5OTY4NworNjE1OSAwIDQzMzM2ODcKKzE3NTIgMCA0Mjk5Njg3Cis5ODUgMCA0MzY2Njg3CiszMTMzOCAwIDQ1MzM2ODcKKzMzOTAgMCA0NDY2Njg3Cis3NzIgMCA0NDMzNjg3Cis3ODEgMCA0NDk5Njg3CiszMTA4NCAwIDQ2NjY2ODcKKzM0OTggMCA0NTk5Njg3Cis4MTggMCA0NTY2Njg3Cis4ODEgMCA0NjMzNjg3CiszMDQxNiAwIDQ3OTk2ODcKKzMyNjUgMCA0NzMzNjg3Cis4MTUgMCA0Njk5Njg3Cis3OTAgMCA0NzY2Njg3CiszMTA1MyAwIDQ5MzM2ODcKKzMxMDYgMCA0ODY2Njg3Cis3MDggMCA0ODMzNjg3Cis3MTMgMCA0ODk5Njg3CiszMDIzMCAwIDUwNjY2ODcKKzMyMTQgMCA0OTk5Njg3Cis2MzkgMCA0OTY2Njg3Cis3NjggMCA1MDMzNjg3CisyOTY1NyAwIDUxOTk2ODcKKzMwMTMgMCA1MTMzNjg3Cis2MjIgMCA1MDk5Njg3Cis3MjAgMCA1MTY2Njg3CisyOTM0NCAwIDUzMzM2ODcKKzMxOTYgMCA1MjY2Njg3Cis3MTMgMCA1MjMzNjg3Cis3NzUgMCA1Mjk5Njg3CiszMDQyMCAwIDU0NjY2ODcKKzMzNzQgMCA1Mzk5Njg3Cis4MDMgMCA1MzY2Njg3Cis3MTcgMCA1NDMzNjg3CisyOTk2MCAwIDU1OTk2ODcKKzMyODMgMCA1NTMzNjg3Cis3OTMgMCA1NDk5Njg3Cis3OTAgMCA1NTY2Njg3CiszMTAxMSAwIDU3MzM2ODcKKzMzOTcgMCA1NjY2Njg3Cis4MDkgMCA1NjMzNjg3Cis4MzEgMCA1Njk5Njg3CiszMTE5NCAwIDU4NjY2ODcKKzM0MDEgMCA1Nzk5Njg3Cis4MDcgMCA1NzY2Njg3Cis4MjcgMCA1ODMzNjg3CiszMDMyNiAwIDU5OTk2ODcKKzMxODYgMCA1OTMzNjg3Cis4MTggMCA1ODk5Njg3Cis4NjMgMCA1OTY2Njg3CiszMTU1OSAwIDYxMzM2ODcKKzMzNjQgMCA2MDY2Njg3Cis4NDAgMCA2MDMzNjg3Cis5MTkgMCA2MDk5Njg3CiszMjAxMyAwIDYyNjY2ODcKKzM0OTUgMCA2MTk5Njg3Cis4NzEgMCA2MTY2Njg3Cis4MDMgMCA2MjMzNjg3CiszMDI5NCAwIDYzOTk2ODcKKzMxNTMgMCA2MzMzNjg3Cis3MTYgMCA2Mjk5Njg3Cis4MTIgMCA2MzY2Njg3CisyOTk1MiAwIDY1MzM2ODcKKzMyOTkgMCA2NDY2Njg3Cis4MDEgMCA2NDMzNjg3Cis3NDkgMCA2NDk5Njg3CiszMDU5OCAwIDY2NjY2ODcKKzM1MzYgMCA2NTk5Njg3Cis4ODcgMCA2NTY2Njg3Cis4NTAgMCA2NjMzNjg3CisxNzI0NiAwIDY2OTk2ODcKKzMxMTEwIDAgNjgzMzY4NworMzE5OCAwIDY3NjY2ODcKKzgwOSAwIDY3MzM2ODcKKzgzNiAwIDY3OTk2ODcKKzI5Nzg0IDAgNjk2NjY4NworMzE1NSAwIDY4OTk2ODcKKzg1OSAwIDY4NjY2ODcKKzk1OCAwIDY5MzM2ODcKKzMwNjY2IDAgNzA5OTY4NworMzM3MSAwIDcwMzM2ODcKKzg4NiAwIDY5OTk2ODcKKzg2MSAwIDcwNjY2ODcKKzMwNDE2IDAgNzIzMzY4NworMzM1MCAwIDcxNjY2ODcKKzkxNyAwIDcxMzM2ODcKKzk4NyAwIDcxOTk2ODcKKzI5NTA5IDAgNzM2NjY4NworMzU3NCAwIDcyOTk2ODcKKzk3MiAwIDcyNjY2ODcKKzg4NSAwIDczMzM2ODcKKzMwODcyIDAgNzQ5OTY4NworMzM5OSAwIDc0MzM2ODcKKzg5OCAwIDczOTk2ODcKKzEwMjcgMCA3NDY2Njg3CiszMTE1NSAwIDc2MzM2ODcKKzM0NTQgMCA3NTY2Njg3Cis5NjUgMCA3NTMzNjg3Cis4NDEgMCA3NTk5Njg3CisyODQ4NyAwIDc3NjY2ODcKKzM2MTYgMCA3Njk5Njg3Cis5MjEgMCA3NjY2Njg3Cis5OTEgMCA3NzMzNjg3CisyMzIwOCAwIDc4OTk2ODcKKzM1NTEgMCA3ODMzNjg3Cis5MTggMCA3Nzk5Njg3Cis4OTQgMCA3ODY2Njg3CisxNjk4MiAwIDgwMzM2ODcKKzM0NTggMCA3OTY2Njg3Cis4NDQgMCA3OTMzNjg3Cis5NDMgMCA3OTk5Njg3CiszMDM5NiAwIDgxOTk2ODcKKzQ5NjMgMCA4MTMzNjg3CisxNDE2IDAgODA2NjY4NworMTYzOSAwIDgwOTk2ODcKKzUyNCAwIDgxNjY2ODcKKzEzNjggMCA4Mjk5Njg3Cis1NjUgMCA4MjY2Njg3CiszOTIgMCA4MjMzNjg3Cis0MTMxNyAxIDgzOTk2ODcKKzE4NSAwIDgzNjY2ODcKKzQ3NyAwIDgzMzM2ODcKKzUzNDIgMCA4NTMzNjg3CisxMjc1IDAgODQ2NjY4NworMTIxIDAgODQzMzY4NworOTgyIDAgODQ5OTY4NworNjQ2NSAwIDg2OTk2ODcKKzI2MDYgMCA4NjMzNjg3CisxMTYzIDAgODU2NjY4NworOTQzIDAgODU5OTY4NworMTE4NiAwIDg2NjY2ODcKKzExNTkzIDAgODgzMzY4NworMzEyMiAwIDg3NjY2ODcKKzEyNzggMCA4NzMzNjg3CisxNTkzIDAgODc5OTY4NworOTA5OSAwIDg5OTk2ODcKKzk3OCAwIDg5MzM2ODcKKzc0OCAwIDg4NjY2ODcKKzgzNSAwIDg4OTk2ODcKKzM2NCAwIDg5NjY2ODcKKzQ3OTkgMCA5MDk5Njg3CiszNjUgMCA5MDY2Njg3CisyMTUgMCA5MDMzNjg3Cis0MzY3IDAgOTE5OTY4NworMzAyIDAgOTE2NjY4NworNDgwIDAgOTEzMzY4NworNjE4MCAwIDkzMzM2ODcKKzc3MSAwIDkyNjY2ODcKKzI0NiAwIDkyMzM2ODcKKzI4MSAwIDkyOTk2ODcKKzQ2MzYgMCA5Mzk5Njg3CisyMTEgMCA5MzY2Njg3Cis0MDM3IDAgOTQ5OTY4NworMzgyIDAgOTQ2NjY4NworNDg2IDAgOTQzMzY4NworMzk3NSAwIDk1OTk2ODcKKzMxMiAwIDk1NjY2ODcKKzQ3NCAwIDk1MzM2ODcKKzY4ODAgMCA5NzMzNjg3CisxMTE2IDAgOTY2NjY4NworMjA2IDAgOTYzMzY4NworNjk4IDAgOTY5OTY4NworNjI1NCAwIDk4OTk2ODcKKzI1ODEgMCA5ODMzNjg3CisxMzAzIDAgOTc2NjY4NworOTg1IDAgOTc5OTY4NworOTY3IDAgOTg2NjY4NworNjQ4NiAwIDEwMDMzNjg3CiszNTU1IDAgOTk2NjY4NworMTQzMCAwIDk5MzM2ODcKKzE2MDUgMCA5OTk5Njg3CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZiZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQxNCBAQAorNTc2IDEgMAorNTc2IDEgMjQwMDAKKzU3NiAxIDQ4MDAwCis1NzYgMSA3MjAwMAorNTc2IDEgOTYwMDAKKzU3NiAxIDEyMDAwMAorNTc2IDEgMTQ0MDAwCis1NzYgMSAxNjgwMDAKKzU3NiAxIDE5MjAwMAorNTc2IDEgMjE2MDAwCis1NzYgMSAyNDAwMDAKKzU3NiAxIDI2NDAwMAorNTc2IDEgMjg4MDAwCis1NzYgMSAzMTIwMDAKKzU3NiAxIDMzNjAwMAorNTc2IDEgMzYwMDAwCis1NzYgMSAzODQwMDAKKzU3NiAxIDQwODAwMAorNTc2IDEgNDMyMDAwCis1NzYgMSA0NTYwMDAKKzU3NiAxIDQ4MDAwMAorNTc2IDEgNTA0MDAwCis1NzYgMSA1MjgwMDAKKzU3NiAxIDU1MjAwMAorNTc2IDEgNTc2MDAwCis1NzYgMSA2MDAwMDAKKzU3NiAxIDYyNDAwMAorNTc2IDEgNjQ4MDAwCis1NzYgMSA2NzIwMDAKKzU3NiAxIDY5NjAwMAorNTc2IDEgNzIwMDAwCis1NzYgMSA3NDQwMDAKKzU3NiAxIDc2ODAwMAorNTc2IDEgNzkyMDAwCis1NzYgMSA4MTYwMDAKKzU3NiAxIDg0MDAwMAorNTc2IDEgODY0MDAwCis1NzYgMSA4ODgwMDAKKzU3NiAxIDkxMjAwMAorNTc2IDEgOTM2MDAwCis1NzYgMSA5NjAwMDAKKzU3NiAxIDk4NDAwMAorNTc2IDEgMTAwODAwMAorNTc2IDEgMTAzMjAwMAorNTc2IDEgMTA1NjAwMAorNTc2IDEgMTA4MDAwMAorNTc2IDEgMTEwNDAwMAorNTc2IDEgMTEyODAwMAorNTc2IDEgMTE1MjAwMAorNTc2IDEgMTE3NjAwMAorNTc2IDEgMTIwMDAwMAorNTc2IDEgMTIyNDAwMAorNTc2IDEgMTI0ODAwMAorNTc2IDEgMTI3MjAwMAorNTc2IDEgMTI5NjAwMAorNTc2IDEgMTMyMDAwMAorNTc2IDEgMTM0NDAwMAorNTc2IDEgMTM2ODAwMAorNTc2IDEgMTM5MjAwMAorNTc2IDEgMTQxNjAwMAorNTc2IDEgMTQ0MDAwMAorNTc2IDEgMTQ2NDAwMAorNTc2IDEgMTQ4ODAwMAorNTc2IDEgMTUxMjAwMAorNTc2IDEgMTUzNjAwMAorNTc2IDEgMTU2MDAwMAorNTc2IDEgMTU4NDAwMAorNTc2IDEgMTYwODAwMAorNTc2IDEgMTYzMjAwMAorNTc2IDEgMTY1NjAwMAorNTc2IDEgMTY4MDAwMAorNTc2IDEgMTcwNDAwMAorNTc2IDEgMTcyODAwMAorNTc2IDEgMTc1MjAwMAorNTc2IDEgMTc3NjAwMAorNTc2IDEgMTgwMDAwMAorNTc2IDEgMTgyNDAwMAorNTc2IDEgMTg0ODAwMAorNTc2IDEgMTg3MjAwMAorNTc2IDEgMTg5NjAwMAorNTc2IDEgMTkyMDAwMAorNTc2IDEgMTk0NDAwMAorNTc2IDEgMTk2ODAwMAorNTc2IDEgMTk5MjAwMAorNTc2IDEgMjAxNjAwMAorNTc2IDEgMjA0MDAwMAorNTc2IDEgMjA2NDAwMAorNTc2IDEgMjA4ODAwMAorNTc2IDEgMjExMjAwMAorNTc2IDEgMjEzNjAwMAorNTc2IDEgMjE2MDAwMAorNTc2IDEgMjE4NDAwMAorNTc2IDEgMjIwODAwMAorNTc2IDEgMjIzMjAwMAorNTc2IDEgMjI1NjAwMAorNTc2IDEgMjI4MDAwMAorNTc2IDEgMjMwNDAwMAorNTc2IDEgMjMyODAwMAorNTc2IDEgMjM1MjAwMAorNTc2IDEgMjM3NjAwMAorNTc2IDEgMjQwMDAwMAorNTc2IDEgMjQyNDAwMAorNTc2IDEgMjQ0ODAwMAorNTc2IDEgMjQ3MjAwMAorNTc2IDEgMjQ5NjAwMAorNTc2IDEgMjUyMDAwMAorNTc2IDEgMjU0NDAwMAorNTc2IDEgMjU2ODAwMAorNTc2IDEgMjU5MjAwMAorNTc2IDEgMjYxNjAwMAorNTc2IDEgMjY0MDAwMAorNTc2IDEgMjY2NDAwMAorNTc2IDEgMjY4ODAwMAorNTc2IDEgMjcxMjAwMAorNTc2IDEgMjczNjAwMAorNTc2IDEgMjc2MDAwMAorNTc2IDEgMjc4NDAwMAorNTc2IDEgMjgwODAwMAorNTc2IDEgMjgzMjAwMAorNTc2IDEgMjg1NjAwMAorNTc2IDEgMjg4MDAwMAorNTc2IDEgMjkwNDAwMAorNTc2IDEgMjkyODAwMAorNTc2IDEgMjk1MjAwMAorNTc2IDEgMjk3NjAwMAorNTc2IDEgMzAwMDAwMAorNTc2IDEgMzAyNDAwMAorNTc2IDEgMzA0ODAwMAorNTc2IDEgMzA3MjAwMAorNTc2IDEgMzA5NjAwMAorNTc2IDEgMzEyMDAwMAorNTc2IDEgMzE0NDAwMAorNTc2IDEgMzE2ODAwMAorNTc2IDEgMzE5MjAwMAorNTc2IDEgMzIxNjAwMAorNTc2IDEgMzI0MDAwMAorNTc2IDEgMzI2NDAwMAorNTc2IDEgMzI4ODAwMAorNTc2IDEgMzMxMjAwMAorNTc2IDEgMzMzNjAwMAorNTc2IDEgMzM2MDAwMAorNTc2IDEgMzM4NDAwMAorNTc2IDEgMzQwODAwMAorNTc2IDEgMzQzMjAwMAorNTc2IDEgMzQ1NjAwMAorNTc2IDEgMzQ4MDAwMAorNTc2IDEgMzUwNDAwMAorNTc2IDEgMzUyODAwMAorNTc2IDEgMzU1MjAwMAorNTc2IDEgMzU3NjAwMAorNTc2IDEgMzYwMDAwMAorNTc2IDEgMzYyNDAwMAorNTc2IDEgMzY0ODAwMAorNTc2IDEgMzY3MjAwMAorNTc2IDEgMzY5NjAwMAorNTc2IDEgMzcyMDAwMAorNTc2IDEgMzc0NDAwMAorNTc2IDEgMzc2ODAwMAorNTc2IDEgMzc5MjAwMAorNTc2IDEgMzgxNjAwMAorNTc2IDEgMzg0MDAwMAorNTc2IDEgMzg2NDAwMAorNTc2IDEgMzg4ODAwMAorNTc2IDEgMzkxMjAwMAorNTc2IDEgMzkzNjAwMAorNTc2IDEgMzk2MDAwMAorNTc2IDEgMzk4NDAwMAorNTc2IDEgNDAwODAwMAorNTc2IDEgNDAzMjAwMAorNTc2IDEgNDA1NjAwMAorNTc2IDEgNDA4MDAwMAorNTc2IDEgNDEwNDAwMAorNTc2IDEgNDEyODAwMAorNTc2IDEgNDE1MjAwMAorNTc2IDEgNDE3NjAwMAorNTc2IDEgNDIwMDAwMAorNTc2IDEgNDIyNDAwMAorNTc2IDEgNDI0ODAwMAorNTc2IDEgNDI3MjAwMAorNTc2IDEgNDI5NjAwMAorNTc2IDEgNDMyMDAwMAorNTc2IDEgNDM0NDAwMAorNTc2IDEgNDM2ODAwMAorNTc2IDEgNDM5MjAwMAorNTc2IDEgNDQxNjAwMAorNTc2IDEgNDQ0MDAwMAorNTc2IDEgNDQ2NDAwMAorNTc2IDEgNDQ4ODAwMAorNTc2IDEgNDUxMjAwMAorNTc2IDEgNDUzNjAwMAorNTc2IDEgNDU2MDAwMAorNTc2IDEgNDU4NDAwMAorNTc2IDEgNDYwODAwMAorNTc2IDEgNDYzMjAwMAorNTc2IDEgNDY1NjAwMAorNTc2IDEgNDY4MDAwMAorNTc2IDEgNDcwNDAwMAorNTc2IDEgNDcyODAwMAorNTc2IDEgNDc1MjAwMAorNTc2IDEgNDc3NjAwMAorNTc2IDEgNDgwMDAwMAorNTc2IDEgNDgyNDAwMAorNTc2IDEgNDg0ODAwMAorNTc2IDEgNDg3MjAwMAorNTc2IDEgNDg5NjAwMAorNTc2IDEgNDkyMDAwMAorNTc2IDEgNDk0NDAwMAorNTc2IDEgNDk2ODAwMAorNTc2IDEgNDk5MjAwMAorNTc2IDEgNTAxNjAwMAorNTc2IDEgNTA0MDAwMAorNTc2IDEgNTA2NDAwMAorNTc2IDEgNTA4ODAwMAorNTc2IDEgNTExMjAwMAorNTc2IDEgNTEzNjAwMAorNTc2IDEgNTE2MDAwMAorNTc2IDEgNTE4NDAwMAorNTc2IDEgNTIwODAwMAorNTc2IDEgNTIzMjAwMAorNTc2IDEgNTI1NjAwMAorNTc2IDEgNTI4MDAwMAorNTc2IDEgNTMwNDAwMAorNTc2IDEgNTMyODAwMAorNTc2IDEgNTM1MjAwMAorNTc2IDEgNTM3NjAwMAorNTc2IDEgNTQwMDAwMAorNTc2IDEgNTQyNDAwMAorNTc2IDEgNTQ0ODAwMAorNTc2IDEgNTQ3MjAwMAorNTc2IDEgNTQ5NjAwMAorNTc2IDEgNTUyMDAwMAorNTc2IDEgNTU0NDAwMAorNTc2IDEgNTU2ODAwMAorNTc2IDEgNTU5MjAwMAorNTc2IDEgNTYxNjAwMAorNTc2IDEgNTY0MDAwMAorNTc2IDEgNTY2NDAwMAorNTc2IDEgNTY4ODAwMAorNTc2IDEgNTcxMjAwMAorNTc2IDEgNTczNjAwMAorNTc2IDEgNTc2MDAwMAorNTc2IDEgNTc4NDAwMAorNTc2IDEgNTgwODAwMAorNTc2IDEgNTgzMjAwMAorNTc2IDEgNTg1NjAwMAorNTc2IDEgNTg4MDAwMAorNTc2IDEgNTkwNDAwMAorNTc2IDEgNTkyODAwMAorNTc2IDEgNTk1MjAwMAorNTc2IDEgNTk3NjAwMAorNTc2IDEgNjAwMDAwMAorNTc2IDEgNjAyNDAwMAorNTc2IDEgNjA0ODAwMAorNTc2IDEgNjA3MjAwMAorNTc2IDEgNjA5NjAwMAorNTc2IDEgNjEyMDAwMAorNTc2IDEgNjE0NDAwMAorNTc2IDEgNjE2ODAwMAorNTc2IDEgNjE5MjAwMAorNTc2IDEgNjIxNjAwMAorNTc2IDEgNjI0MDAwMAorNTc2IDEgNjI2NDAwMAorNTc2IDEgNjI4ODAwMAorNTc2IDEgNjMxMjAwMAorNTc2IDEgNjMzNjAwMAorNTc2IDEgNjM2MDAwMAorNTc2IDEgNjM4NDAwMAorNTc2IDEgNjQwODAwMAorNTc2IDEgNjQzMjAwMAorNTc2IDEgNjQ1NjAwMAorNTc2IDEgNjQ4MDAwMAorNTc2IDEgNjUwNDAwMAorNTc2IDEgNjUyODAwMAorNTc2IDEgNjU1MjAwMAorNTc2IDEgNjU3NjAwMAorNTc2IDEgNjYwMDAwMAorNTc2IDEgNjYyNDAwMAorNTc2IDEgNjY0ODAwMAorNTc2IDEgNjY3MjAwMAorNTc2IDEgNjY5NjAwMAorNTc2IDEgNjcyMDAwMAorNTc2IDEgNjc0NDAwMAorNTc2IDEgNjc2ODAwMAorNTc2IDEgNjc5MjAwMAorNTc2IDEgNjgxNjAwMAorNTc2IDEgNjg0MDAwMAorNTc2IDEgNjg2NDAwMAorNTc2IDEgNjg4ODAwMAorNTc2IDEgNjkxMjAwMAorNTc2IDEgNjkzNjAwMAorNTc2IDEgNjk2MDAwMAorNTc2IDEgNjk4NDAwMAorNTc2IDEgNzAwODAwMAorNTc2IDEgNzAzMjAwMAorNTc2IDEgNzA1NjAwMAorNTc2IDEgNzA4MDAwMAorNTc2IDEgNzEwNDAwMAorNTc2IDEgNzEyODAwMAorNTc2IDEgNzE1MjAwMAorNTc2IDEgNzE3NjAwMAorNTc2IDEgNzIwMDAwMAorNTc2IDEgNzIyNDAwMAorNTc2IDEgNzI0ODAwMAorNTc2IDEgNzI3MjAwMAorNTc2IDEgNzI5NjAwMAorNTc2IDEgNzMyMDAwMAorNTc2IDEgNzM0NDAwMAorNTc2IDEgNzM2ODAwMAorNTc2IDEgNzM5MjAwMAorNTc2IDEgNzQxNjAwMAorNTc2IDEgNzQ0MDAwMAorNTc2IDEgNzQ2NDAwMAorNTc2IDEgNzQ4ODAwMAorNTc2IDEgNzUxMjAwMAorNTc2IDEgNzUzNjAwMAorNTc2IDEgNzU2MDAwMAorNTc2IDEgNzU4NDAwMAorNTc2IDEgNzYwODAwMAorNTc2IDEgNzYzMjAwMAorNTc2IDEgNzY1NjAwMAorNTc2IDEgNzY4MDAwMAorNTc2IDEgNzcwNDAwMAorNTc2IDEgNzcyODAwMAorNTc2IDEgNzc1MjAwMAorNTc2IDEgNzc3NjAwMAorNTc2IDEgNzgwMDAwMAorNTc2IDEgNzgyNDAwMAorNTc2IDEgNzg0ODAwMAorNTc2IDEgNzg3MjAwMAorNTc2IDEgNzg5NjAwMAorNTc2IDEgNzkyMDAwMAorNTc2IDEgNzk0NDAwMAorNTc2IDEgNzk2ODAwMAorNTc2IDEgNzk5MjAwMAorNTc2IDEgODAxNjAwMAorNTc2IDEgODA0MDAwMAorNTc2IDEgODA2NDAwMAorNTc2IDEgODA4ODAwMAorNTc2IDEgODExMjAwMAorNTc2IDEgODEzNjAwMAorNTc2IDEgODE2MDAwMAorNTc2IDEgODE4NDAwMAorNTc2IDEgODIwODAwMAorNTc2IDEgODIzMjAwMAorNTc2IDEgODI1NjAwMAorNTc2IDEgODI4MDAwMAorNTc2IDEgODMwNDAwMAorNTc2IDEgODMyODAwMAorNTc2IDEgODM1MjAwMAorNTc2IDEgODM3NjAwMAorNTc2IDEgODQwMDAwMAorNTc2IDEgODQyNDAwMAorNTc2IDEgODQ0ODAwMAorNTc2IDEgODQ3MjAwMAorNTc2IDEgODQ5NjAwMAorNTc2IDEgODUyMDAwMAorNTc2IDEgODU0NDAwMAorNTc2IDEgODU2ODAwMAorNTc2IDEgODU5MjAwMAorNTc2IDEgODYxNjAwMAorNTc2IDEgODY0MDAwMAorNTc2IDEgODY2NDAwMAorNTc2IDEgODY4ODAwMAorNTc2IDEgODcxMjAwMAorNTc2IDEgODczNjAwMAorNTc2IDEgODc2MDAwMAorNTc2IDEgODc4NDAwMAorNTc2IDEgODgwODAwMAorNTc2IDEgODgzMjAwMAorNTc2IDEgODg1NjAwMAorNTc2IDEgODg4MDAwMAorNTc2IDEgODkwNDAwMAorNTc2IDEgODkyODAwMAorNTc2IDEgODk1MjAwMAorNTc2IDEgODk3NjAwMAorNTc2IDEgOTAwMDAwMAorNTc2IDEgOTAyNDAwMAorNTc2IDEgOTA0ODAwMAorNTc2IDEgOTA3MjAwMAorNTc2IDEgOTA5NjAwMAorNTc2IDEgOTEyMDAwMAorNTc2IDEgOTE0NDAwMAorNTc2IDEgOTE2ODAwMAorNTc2IDEgOTE5MjAwMAorNTc2IDEgOTIxNjAwMAorNTc2IDEgOTI0MDAwMAorNTc2IDEgOTI2NDAwMAorNTc2IDEgOTI4ODAwMAorNTc2IDEgOTMxMjAwMAorNTc2IDEgOTMzNjAwMAorNTc2IDEgOTM2MDAwMAorNTc2IDEgOTM4NDAwMAorNTc2IDEgOTQwODAwMAorNTc2IDEgOTQzMjAwMAorNTc2IDEgOTQ1NjAwMAorNTc2IDEgOTQ4MDAwMAorNTc2IDEgOTUwNDAwMAorNTc2IDEgOTUyODAwMAorNTc2IDEgOTU1MjAwMAorNTc2IDEgOTU3NjAwMAorNTc2IDEgOTYwMDAwMAorNTc2IDEgOTYyNDAwMAorNTc2IDEgOTY0ODAwMAorNTc2IDEgOTY3MjAwMAorNTc2IDEgOTY5NjAwMAorNTc2IDEgOTcyMDAwMAorNTc2IDEgOTc0NDAwMAorNTc2IDEgOTc2ODAwMAorNTc2IDEgOTc5MjAwMAorNTc2IDEgOTgxNjAwMAorNTc2IDEgOTg0MDAwMAorNTc2IDEgOTg2NDAwMAorNTc2IDEgOTg4ODAwMAorNTc2IDEgOTkxMjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4M2E0NDEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NWM3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsMzg1IEBACis1NzYgMSAwCis1NzYgMSAyNDAwMAorMTE1MiAxIDQ4MDAwCisxMTUyIDEgOTYwMDAKKzExNTIgMSAxNDQwMDAKKzExNTIgMSAxOTIwMDAKKzE3MjggMSAyNDAwMDAKKzE3MjggMSAzMTIwMDAKKzE3MjggMSAzODQwMDAKKzE3MjggMSA0NTYwMDAKKzE3MjggMSA1MjgwMDAKKzIzMDQgMSA2MDAwMDAKKzIzMDQgMSA2OTYwMDAKKzIzMDQgMSA3OTIwMDAKKzIzMDQgMSA4ODgwMDAKKzIzMDQgMSA5ODQwMDAKKzU3NiAxIDEwODAwMDAKKzU3NiAxIDExMDQwMDAKKzU3NiAxIDExMjgwMDAKKzU3NiAxIDExNTIwMDAKKzU3NiAxIDExNzYwMDAKKzU3NiAxIDEyMDAwMDAKKzU3NiAxIDEyMjQwMDAKKzU3NiAxIDEyNDgwMDAKKzU3NiAxIDEyNzIwMDAKKzU3NiAxIDEyOTYwMDAKKzU3NiAxIDEzMjAwMDAKKzU3NiAxIDEzNDQwMDAKKzU3NiAxIDEzNjgwMDAKKzU3NiAxIDEzOTIwMDAKKzU3NiAxIDE0MTYwMDAKKzU3NiAxIDE0NDAwMDAKKzU3NiAxIDE0NjQwMDAKKzU3NiAxIDE0ODgwMDAKKzU3NiAxIDE1MTIwMDAKKzU3NiAxIDE1MzYwMDAKKzU3NiAxIDE1NjAwMDAKKzU3NiAxIDE1ODQwMDAKKzU3NiAxIDE2MDgwMDAKKzU3NiAxIDE2MzIwMDAKKzU3NiAxIDE2NTYwMDAKKzU3NiAxIDE2ODAwMDAKKzU3NiAxIDE3MDQwMDAKKzU3NiAxIDE3MjgwMDAKKzU3NiAxIDE3NTIwMDAKKzU3NiAxIDE3NzYwMDAKKzU3NiAxIDE4MDAwMDAKKzU3NiAxIDE4MjQwMDAKKzU3NiAxIDE4NDgwMDAKKzU3NiAxIDE4NzIwMDAKKzU3NiAxIDE4OTYwMDAKKzU3NiAxIDE5MjAwMDAKKzU3NiAxIDE5NDQwMDAKKzU3NiAxIDE5NjgwMDAKKzU3NiAxIDE5OTIwMDAKKzU3NiAxIDIwMTYwMDAKKzU3NiAxIDIwNDAwMDAKKzU3NiAxIDIwNjQwMDAKKzU3NiAxIDIwODgwMDAKKzU3NiAxIDIxMTIwMDAKKzU3NiAxIDIxMzYwMDAKKzU3NiAxIDIxNjAwMDAKKzU3NiAxIDIxODQwMDAKKzU3NiAxIDIyMDgwMDAKKzU3NiAxIDIyMzIwMDAKKzU3NiAxIDIyNTYwMDAKKzU3NiAxIDIyODAwMDAKKzU3NiAxIDIzMDQwMDAKKzU3NiAxIDIzMjgwMDAKKzU3NiAxIDIzNTIwMDAKKzU3NiAxIDIzNzYwMDAKKzU3NiAxIDI0MDAwMDAKKzU3NiAxIDI0MjQwMDAKKzU3NiAxIDI0NDgwMDAKKzU3NiAxIDI0NzIwMDAKKzU3NiAxIDI0OTYwMDAKKzU3NiAxIDI1MjAwMDAKKzU3NiAxIDI1NDQwMDAKKzU3NiAxIDI1NjgwMDAKKzU3NiAxIDI1OTIwMDAKKzU3NiAxIDI2MTYwMDAKKzU3NiAxIDI2NDAwMDAKKzU3NiAxIDI2NjQwMDAKKzU3NiAxIDI2ODgwMDAKKzU3NiAxIDI3MTIwMDAKKzU3NiAxIDI3MzYwMDAKKzU3NiAxIDI3NjAwMDAKKzU3NiAxIDI3ODQwMDAKKzU3NiAxIDI4MDgwMDAKKzU3NiAxIDI4MzIwMDAKKzU3NiAxIDI4NTYwMDAKKzU3NiAxIDI4ODAwMDAKKzU3NiAxIDI5MDQwMDAKKzU3NiAxIDI5MjgwMDAKKzU3NiAxIDI5NTIwMDAKKzU3NiAxIDI5NzYwMDAKKzU3NiAxIDMwMDAwMDAKKzU3NiAxIDMwMjQwMDAKKzU3NiAxIDMwNDgwMDAKKzU3NiAxIDMwNzIwMDAKKzU3NiAxIDMwOTYwMDAKKzU3NiAxIDMxMjAwMDAKKzU3NiAxIDMxNDQwMDAKKzU3NiAxIDMxNjgwMDAKKzU3NiAxIDMxOTIwMDAKKzU3NiAxIDMyMTYwMDAKKzU3NiAxIDMyNDAwMDAKKzU3NiAxIDMyNjQwMDAKKzU3NiAxIDMyODgwMDAKKzU3NiAxIDMzMTIwMDAKKzU3NiAxIDMzMzYwMDAKKzU3NiAxIDMzNjAwMDAKKzU3NiAxIDMzODQwMDAKKzU3NiAxIDM0MDgwMDAKKzU3NiAxIDM0MzIwMDAKKzU3NiAxIDM0NTYwMDAKKzU3NiAxIDM0ODAwMDAKKzU3NiAxIDM1MDQwMDAKKzU3NiAxIDM1MjgwMDAKKzU3NiAxIDM1NTIwMDAKKzU3NiAxIDM1NzYwMDAKKzU3NiAxIDM2MDAwMDAKKzU3NiAxIDM2MjQwMDAKKzU3NiAxIDM2NDgwMDAKKzU3NiAxIDM2NzIwMDAKKzU3NiAxIDM2OTYwMDAKKzU3NiAxIDM3MjAwMDAKKzU3NiAxIDM3NDQwMDAKKzU3NiAxIDM3NjgwMDAKKzU3NiAxIDM3OTIwMDAKKzU3NiAxIDM4MTYwMDAKKzU3NiAxIDM4NDAwMDAKKzU3NiAxIDM4NjQwMDAKKzU3NiAxIDM4ODgwMDAKKzU3NiAxIDM5MTIwMDAKKzU3NiAxIDM5MzYwMDAKKzU3NiAxIDM5NjAwMDAKKzU3NiAxIDM5ODQwMDAKKzU3NiAxIDQwMDgwMDAKKzU3NiAxIDQwMzIwMDAKKzU3NiAxIDQwNTYwMDAKKzU3NiAxIDQwODAwMDAKKzU3NiAxIDQxMDQwMDAKKzU3NiAxIDQxMjgwMDAKKzU3NiAxIDQxNTIwMDAKKzU3NiAxIDQxNzYwMDAKKzU3NiAxIDQyMDAwMDAKKzU3NiAxIDQyMjQwMDAKKzU3NiAxIDQyNDgwMDAKKzU3NiAxIDQyNzIwMDAKKzU3NiAxIDQyOTYwMDAKKzU3NiAxIDQzMjAwMDAKKzU3NiAxIDQzNDQwMDAKKzU3NiAxIDQzNjgwMDAKKzU3NiAxIDQzOTIwMDAKKzU3NiAxIDQ0MTYwMDAKKzU3NiAxIDQ0NDAwMDAKKzU3NiAxIDQ0NjQwMDAKKzU3NiAxIDQ0ODgwMDAKKzU3NiAxIDQ1MTIwMDAKKzU3NiAxIDQ1MzYwMDAKKzU3NiAxIDQ1NjAwMDAKKzU3NiAxIDQ1ODQwMDAKKzU3NiAxIDQ2MDgwMDAKKzU3NiAxIDQ2MzIwMDAKKzU3NiAxIDQ2NTYwMDAKKzU3NiAxIDQ2ODAwMDAKKzU3NiAxIDQ3MDQwMDAKKzU3NiAxIDQ3MjgwMDAKKzU3NiAxIDQ3NTIwMDAKKzU3NiAxIDQ3NzYwMDAKKzU3NiAxIDQ4MDAwMDAKKzU3NiAxIDQ4MjQwMDAKKzU3NiAxIDQ4NDgwMDAKKzU3NiAxIDQ4NzIwMDAKKzU3NiAxIDQ4OTYwMDAKKzU3NiAxIDQ5MjAwMDAKKzU3NiAxIDQ5NDQwMDAKKzU3NiAxIDQ5NjgwMDAKKzU3NiAxIDQ5OTIwMDAKKzU3NiAxIDUwMTYwMDAKKzU3NiAxIDUwNDAwMDAKKzU3NiAxIDUwNjQwMDAKKzU3NiAxIDUwODgwMDAKKzU3NiAxIDUxMTIwMDAKKzU3NiAxIDUxMzYwMDAKKzU3NiAxIDUxNjAwMDAKKzU3NiAxIDUxODQwMDAKKzU3NiAxIDUyMDgwMDAKKzU3NiAxIDUyMzIwMDAKKzU3NiAxIDUyNTYwMDAKKzU3NiAxIDUyODAwMDAKKzU3NiAxIDUzMDQwMDAKKzU3NiAxIDUzMjgwMDAKKzU3NiAxIDUzNTIwMDAKKzU3NiAxIDUzNzYwMDAKKzU3NiAxIDU0MDAwMDAKKzU3NiAxIDU0MjQwMDAKKzU3NiAxIDU0NDgwMDAKKzU3NiAxIDU0NzIwMDAKKzU3NiAxIDU0OTYwMDAKKzU3NiAxIDU1MjAwMDAKKzU3NiAxIDU1NDQwMDAKKzU3NiAxIDU1NjgwMDAKKzU3NiAxIDU1OTIwMDAKKzU3NiAxIDU2MTYwMDAKKzU3NiAxIDU2NDAwMDAKKzU3NiAxIDU2NjQwMDAKKzU3NiAxIDU2ODgwMDAKKzU3NiAxIDU3MTIwMDAKKzU3NiAxIDU3MzYwMDAKKzU3NiAxIDU3NjAwMDAKKzU3NiAxIDU3ODQwMDAKKzU3NiAxIDU4MDgwMDAKKzU3NiAxIDU4MzIwMDAKKzU3NiAxIDU4NTYwMDAKKzU3NiAxIDU4ODAwMDAKKzU3NiAxIDU5MDQwMDAKKzU3NiAxIDU5MjgwMDAKKzU3NiAxIDU5NTIwMDAKKzU3NiAxIDU5NzYwMDAKKzU3NiAxIDYwMDAwMDAKKzU3NiAxIDYwMjQwMDAKKzU3NiAxIDYwNDgwMDAKKzU3NiAxIDYwNzIwMDAKKzU3NiAxIDYwOTYwMDAKKzU3NiAxIDYxMjAwMDAKKzU3NiAxIDYxNDQwMDAKKzU3NiAxIDYxNjgwMDAKKzU3NiAxIDYxOTIwMDAKKzU3NiAxIDYyMTYwMDAKKzU3NiAxIDYyNDAwMDAKKzU3NiAxIDYyNjQwMDAKKzU3NiAxIDYyODgwMDAKKzU3NiAxIDYzMTIwMDAKKzU3NiAxIDYzMzYwMDAKKzU3NiAxIDYzNjAwMDAKKzU3NiAxIDYzODQwMDAKKzU3NiAxIDY0MDgwMDAKKzU3NiAxIDY0MzIwMDAKKzU3NiAxIDY0NTYwMDAKKzU3NiAxIDY0ODAwMDAKKzU3NiAxIDY1MDQwMDAKKzU3NiAxIDY1MjgwMDAKKzU3NiAxIDY1NTIwMDAKKzU3NiAxIDY1NzYwMDAKKzU3NiAxIDY2MDAwMDAKKzU3NiAxIDY2MjQwMDAKKzU3NiAxIDY2NDgwMDAKKzU3NiAxIDY2NzIwMDAKKzU3NiAxIDY2OTYwMDAKKzU3NiAxIDY3MjAwMDAKKzU3NiAxIDY3NDQwMDAKKzU3NiAxIDY3NjgwMDAKKzU3NiAxIDY3OTIwMDAKKzU3NiAxIDY4MTYwMDAKKzU3NiAxIDY4NDAwMDAKKzU3NiAxIDY4NjQwMDAKKzU3NiAxIDY4ODgwMDAKKzU3NiAxIDY5MTIwMDAKKzU3NiAxIDY5MzYwMDAKKzU3NiAxIDY5NjAwMDAKKzU3NiAxIDY5ODQwMDAKKzU3NiAxIDcwMDgwMDAKKzU3NiAxIDcwMzIwMDAKKzU3NiAxIDcwNTYwMDAKKzU3NiAxIDcwODAwMDAKKzU3NiAxIDcxMDQwMDAKKzU3NiAxIDcxMjgwMDAKKzU3NiAxIDcxNTIwMDAKKzU3NiAxIDcxNzYwMDAKKzU3NiAxIDcyMDAwMDAKKzU3NiAxIDcyMjQwMDAKKzU3NiAxIDcyNDgwMDAKKzU3NiAxIDcyNzIwMDAKKzU3NiAxIDcyOTYwMDAKKzU3NiAxIDczMjAwMDAKKzU3NiAxIDczNDQwMDAKKzU3NiAxIDczNjgwMDAKKzU3NiAxIDczOTIwMDAKKzU3NiAxIDc0MTYwMDAKKzU3NiAxIDc0NDAwMDAKKzU3NiAxIDc0NjQwMDAKKzU3NiAxIDc0ODgwMDAKKzU3NiAxIDc1MTIwMDAKKzU3NiAxIDc1MzYwMDAKKzU3NiAxIDc1NjAwMDAKKzU3NiAxIDc1ODQwMDAKKzU3NiAxIDc2MDgwMDAKKzU3NiAxIDc2MzIwMDAKKzU3NiAxIDc2NTYwMDAKKzU3NiAxIDc2ODAwMDAKKzU3NiAxIDc3MDQwMDAKKzU3NiAxIDc3MjgwMDAKKzU3NiAxIDc3NTIwMDAKKzU3NiAxIDc3NzYwMDAKKzU3NiAxIDc4MDAwMDAKKzU3NiAxIDc4MjQwMDAKKzU3NiAxIDc4NDgwMDAKKzU3NiAxIDc4NzIwMDAKKzU3NiAxIDc4OTYwMDAKKzU3NiAxIDc5MjAwMDAKKzU3NiAxIDc5NDQwMDAKKzU3NiAxIDc5NjgwMDAKKzU3NiAxIDc5OTIwMDAKKzU3NiAxIDgwMTYwMDAKKzU3NiAxIDgwNDAwMDAKKzU3NiAxIDgwNjQwMDAKKzU3NiAxIDgwODgwMDAKKzU3NiAxIDgxMTIwMDAKKzU3NiAxIDgxMzYwMDAKKzU3NiAxIDgxNjAwMDAKKzU3NiAxIDgxODQwMDAKKzU3NiAxIDgyMDgwMDAKKzU3NiAxIDgyMzIwMDAKKzU3NiAxIDgyNTYwMDAKKzU3NiAxIDgyODAwMDAKKzU3NiAxIDgzMDQwMDAKKzU3NiAxIDgzMjgwMDAKKzU3NiAxIDgzNTIwMDAKKzU3NiAxIDgzNzYwMDAKKzU3NiAxIDg0MDAwMDAKKzU3NiAxIDg0MjQwMDAKKzU3NiAxIDg0NDgwMDAKKzU3NiAxIDg0NzIwMDAKKzU3NiAxIDg0OTYwMDAKKzU3NiAxIDg1MjAwMDAKKzU3NiAxIDg1NDQwMDAKKzU3NiAxIDg1NjgwMDAKKzU3NiAxIDg1OTIwMDAKKzU3NiAxIDg2MTYwMDAKKzU3NiAxIDg2NDAwMDAKKzU3NiAxIDg2NjQwMDAKKzU3NiAxIDg2ODgwMDAKKzU3NiAxIDg3MTIwMDAKKzU3NiAxIDg3MzYwMDAKKzU3NiAxIDg3NjAwMDAKKzU3NiAxIDg3ODQwMDAKKzU3NiAxIDg4MDgwMDAKKzU3NiAxIDg4MzIwMDAKKzU3NiAxIDg4NTYwMDAKKzU3NiAxIDg4ODAwMDAKKzU3NiAxIDg5MDQwMDAKKzU3NiAxIDg5MjgwMDAKKzU3NiAxIDg5NTIwMDAKKzU3NiAxIDg5NzYwMDAKKzU3NiAxIDkwMDAwMDAKKzU3NiAxIDkwMjQwMDAKKzU3NiAxIDkwNDgwMDAKKzU3NiAxIDkwNzIwMDAKKzU3NiAxIDkwOTYwMDAKKzU3NiAxIDkxMjAwMDAKKzU3NiAxIDkxNDQwMDAKKzU3NiAxIDkxNjgwMDAKKzU3NiAxIDkxOTIwMDAKKzU3NiAxIDkyMTYwMDAKKzU3NiAxIDkyNDAwMDAKKzU3NiAxIDkyNjQwMDAKKzU3NiAxIDkyODgwMDAKKzU3NiAxIDkzMTIwMDAKKzU3NiAxIDkzMzYwMDAKKzU3NiAxIDkzNjAwMDAKKzU3NiAxIDkzODQwMDAKKzU3NiAxIDk0MDgwMDAKKzU3NiAxIDk0MzIwMDAKKzU3NiAxIDk0NTYwMDAKKzU3NiAxIDk0ODAwMDAKKzU3NiAxIDk1MDQwMDAKKzU3NiAxIDk1MjgwMDAKKzU3NiAxIDk1NTIwMDAKKzU3NiAxIDk1NzYwMDAKKzU3NiAxIDk2MDAwMDAKKzU3NiAxIDk2MjQwMDAKKzU3NiAxIDk2NDgwMDAKKzU3NiAxIDk2NzIwMDAKKzU3NiAxIDk2OTYwMDAKKzU3NiAxIDk3MjAwMDAKKzU3NiAxIDk3NDQwMDAKKzU3NiAxIDk3NjgwMDAKKzU3NiAxIDk3OTIwMDAKKzU3NiAxIDk4MTYwMDAKKzU3NiAxIDk4NDAwMDAKKzU3NiAxIDk4NjQwMDAKKzU3NiAxIDk4ODgwMDAKKzU3NiAxIDk5MTIwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0MDY0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvCkBAIC0wLDAgKzEsMjQ5IEBACis2NDU4IDEgNDAwMDAKKzQwNDAgMCA4MDAwMAorMzI1NSAwIDEyMDAwMAorMzAyNiAwIDE2MDAwMAorMzI5MyAwIDIwMDAwMAorMzA4OSAwIDI0MDAwMAorMzMwNSAwIDI4MDAwMAorMTc5NCAwIDMyMDAwMAorMTg0OCAwIDM2MDAwMAorMTI4OCAwIDQwMDAwMAorMTUxMSAwIDQ0MDAwMAorMTUyNyAwIDQ4MDAwMAorNjE0NiAxIDUyMDAwMAorMTI0MyAwIDU2MDAwMAorMTA5OSAwIDYwMDAwMAorMTM1NCAwIDY0MDAwMAorMTM2NiAwIDY4MDAwMAorMTA0MiAwIDcyMDAwMAorMTYwMCAwIDc2MDAwMAorODc1IDAgODAwMDAwCisxNzI4IDAgODQwMDAwCisxMjU0IDAgODgwMDAwCis5OTQgMCA5MjAwMDAKKzE1OTEgMCA5NjAwMDAKKzYyNjUgMSAxMDAwMDAwCisxMDE4IDAgMTA0MDAwMAorODI1IDAgMTA4MDAwMAorODY5IDAgMTEyMDAwMAorOTIxIDAgMTE2MDAwMAorOTc1IDAgMTIwMDAwMAorOTI0IDAgMTI0MDAwMAorODM0IDAgMTI4MDAwMAorMTA2NiAwIDEzMjAwMDAKKzc5MyAwIDEzNjAwMDAKKzg4OSAwIDE0MDAwMDAKKzIwNTAgMCAxNDQwMDAwCis2Mjc2IDEgMTQ4MDAwMAorODgxIDAgMTUyMDAwMAorMjYwIDAgMTU2MDAwMAorNzMwIDAgMTYwMDAwMAorNDMxIDAgMTY0MDAwMAorMzUxIDAgMTY4MDAwMAorMzIxIDAgMTcyMDAwMAorMzgwMiAwIDE3NjAwMDAKKzE0NiAwIDE4MDAwMDAKKzY0NjIgMCAxODQwMDAwCiszMjQ2IDAgMTg4MDAwMAorNTMzIDAgMTkyMDAwMAorNjIzMSAxIDE5NjAwMDAKKzEzNzggMCAyMDAwMDAwCis3MTkgMCAyMDQwMDAwCis4MTggMCAyMDgwMDAwCis4NTYgMCAyMTIwMDAwCis5MzcgMCAyMTYwMDAwCis2MTEgMCAyMjAwMDAwCiszMDMxIDAgMjI0MDAwMAorMTA0MSAwIDIyODAwMDAKKzYwNCAwIDIzMjAwMDAKKzcxNCAwIDIzNjAwMDAKKzEyODMgMCAyNDAwMDAwCis3NTY1IDEgMjQ0MDAwMAorNjAyIDAgMjQ4MDAwMAorNTMwIDAgMjUyMDAwMAorMjU3OSAwIDI1NjAwMDAKKzExNSAwIDI2MDAwMDAKKzEwNTggMCAyNjQwMDAwCis2ODkgMCAyNjgwMDAwCisxMTE5IDAgMjcyMDAwMAorNjk4IDAgMjc2MDAwMAorMTAwNiAwIDI4MDAwMDAKKzU0NSAwIDI4NDAwMDAKKzE2MTcgMCAyODgwMDAwCis5MTIzIDEgMjkyMDAwMAorNTI3IDAgMjk2MDAwMAorMTU3NiAwIDMwMDAwMDAKKzQ2NSAwIDMwNDAwMDAKKzc0MSAwIDMwODAwMDAKKzUyMSAwIDMxMjAwMDAKKzEzMjIgMCAzMTYwMDAwCis3NzUgMCAzMjAwMDAwCis4NjMgMCAzMjQwMDAwCis5MTAgMCAzMjgwMDAwCis5MTUgMCAzMzIwMDAwCis5MjYgMCAzMzYwMDAwCis3NTU2IDEgMzQwMDAwMAorNzQxIDAgMzQ0MDAwMAorNTI3IDAgMzQ4MDAwMAorMjUxNiAwIDM1MjAwMDAKKzQ1OSAwIDM1NjAwMDAKKzQwNCAwIDM2MDAwMDAKKzUwOSAwIDM2NDAwMDAKKzEyMjcgMCAzNjgwMDAwCisxNTYxIDAgMzcyMDAwMAorNDkwIDAgMzc2MDAwMAorNzEyIDAgMzgwMDAwMAorODAzIDAgMzg0MDAwMAorNzUyNCAxIDM4ODAwMDAKKzczMCAwIDM5MjAwMDAKKzQ2MSAwIDM5NjAwMDAKKzI1MjYgMCA0MDAwMDAwCis0NTMgMCA0MDQwMDAwCis2MzIgMCA0MDgwMDAwCis3ODMgMCA0MTIwMDAwCis4NDMgMCA0MTYwMDAwCis5MTggMCA0MjAwMDAwCis5NjEgMCA0MjQwMDAwCis5NDggMCA0MjgwMDAwCis5NTkgMCA0MzIwMDAwCis3NTk4IDEgNDM2MDAwMAorNjc4IDAgNDQwMDAwMAorNTY5IDAgNDQ0MDAwMAorODkzIDAgNDQ4MDAwMAorNjI0IDAgNDUyMDAwMAorNzU1IDAgNDU2MDAwMAorMjIzNCAwIDQ2MDAwMDAKKzU1NiAwIDQ2NDAwMDAKKzk0NCAwIDQ2ODAwMDAKKzczOSAwIDQ3MjAwMDAKKzg2MiAwIDQ3NjAwMDAKKzkzOCAwIDQ4MDAwMDAKKzc1NzQgMSA0ODQwMDAwCis2OTkgMCA0ODgwMDAwCis3MDEgMCA0OTIwMDAwCis1MzAgMCA0OTYwMDAwCis2ODkgMCA1MDAwMDAwCis3NzggMCA1MDQwMDAwCis4NTYgMCA1MDgwMDAwCis5MzAgMCA1MTIwMDAwCis5NzUgMCA1MTYwMDAwCisxMDIxIDAgNTIwMDAwMAorMTA3NCAwIDUyNDAwMDAKKzk3OCAwIDUyODAwMDAKKzgwMjEgMSA1MzIwMDAwCis3MDQgMCA1MzYwMDAwCis2MTAgMCA1NDAwMDAwCis2OTcgMCA1NDQwMDAwCis3MTEgMCA1NDgwMDAwCis4MjAgMCA1NTIwMDAwCis4NDMgMCA1NTYwMDAwCisyNTEgMCA1NjAwMDAwCiszMzY3IDAgNTY0MDAwMAorNTA3IDAgNTY4MDAwMAorMzE2OCAxIDU3MjAwMDAKKzc3OSAwIDU3NjAwMDAKKzMxNiAwIDU4MDAwMDAKKzYzNSAwIDU4NDAwMDAKKzIwNCAwIDU4ODAwMDAKKzk3OCAwIDU5MjAwMDAKKzEyNyAwIDU5NjAwMDAKKzU4OSAwIDYwMDAwMDAKKzYwNCAwIDYwNDAwMDAKKzY2NiAwIDYwODAwMDAKKzU4MiAwIDYxMjAwMDAKKzcyOSAwIDYxNjAwMDAKKzQxNTIgMSA2MjAwMDAwCis4NTggMCA2MjQwMDAwCis3MzkgMCA2MjgwMDAwCis4ODUgMCA2MzIwMDAwCis3NDkgMCA2MzYwMDAwCis5NTAgMCA2NDAwMDAwCis1OTMgMCA2NDQwMDAwCis3NzEgMCA2NDgwMDAwCis2NzggMCA2NTIwMDAwCis1MjkgMCA2NTYwMDAwCis4MzUgMCA2NjAwMDAwCiszOTEgMCA2NjQwMDAwCis0NjkyIDEgNjY4MDAwMAorNDczIDAgNjcyMDAwMAorNzI0IDAgNjc2MDAwMAorMzgxIDAgNjgwMDAwMAorOTA5IDAgNjg0MDAwMAorMzk0IDAgNjg4MDAwMAorNjU5IDAgNjkyMDAwMAorMzY3IDAgNjk2MDAwMAorNjU4IDAgNzAwMDAwMAorNTIzIDAgNzA0MDAwMAorNTU0IDAgNzA4MDAwMAorNTUzIDAgNzEyMDAwMAorNjA4MCAxIDcxNjAwMDAKKzQ5NiAwIDcyMDAwMDAKKzc2MyAwIDcyNDAwMDAKKzkzOSAwIDcyODAwMDAKKzcxNSAwIDczMjAwMDAKKzY3MiAwIDczNjAwMDAKKzYxNCAwIDc0MDAwMDAKKzgxMSAwIDc0NDAwMDAKKzkxNiAwIDc0ODAwMDAKKzExNTMgMCA3NTIwMDAwCis5NDAgMCA3NTYwMDAwCiszMjIgMCA3NjAwMDAwCis2NjEzIDEgNzY0MDAwMAorODUxIDAgNzY4MDAwMAorMTAwNyAwIDc3MjAwMDAKKzUyMCAwIDc3NjAwMDAKKzQ1NiAwIDc4MDAwMDAKKzYzOSAwIDc4NDAwMDAKKzc1OCAwIDc4ODAwMDAKKzg3OSAwIDc5MjAwMDAKKzExNTIgMCA3OTYwMDAwCisxMDYxIDAgODAwMDAwMAorOTQ2IDAgODA0MDAwMAorODU5IDAgODA4MDAwMAorMzYxMCAxIDgxMjAwMDAKKzg3MSAwIDgxNjAwMDAKKzc0NiAwIDgyMDAwMDAKKzM2NyAwIDgyNDAwMDAKKzM5NyAwIDgyODAwMDAKKzkzMCAwIDgzMjAwMDAKKzMzNyAwIDgzNjAwMDAKKzQxOCAwIDg0MDAwMDAKKzc0MCAwIDg0NDAwMDAKKzYzNyAwIDg0ODAwMDAKKzY2NiAwIDg1MjAwMDAKKzYyNyAwIDg1NjAwMDAKKzQzMzggMSA4NjAwMDAwCis3NDUgMCA4NjQwMDAwCis3ODMgMCA4NjgwMDAwCis0NjUgMCA4NzIwMDAwCis0NjAgMCA4NzYwMDAwCis0NTUgMCA4ODAwMDAwCis1MDYgMCA4ODQwMDAwCis0OTIgMCA4ODgwMDAwCis0ODUgMCA4OTIwMDAwCis1MTcgMCA4OTYwMDAwCis1MzQgMCA5MDAwMDAwCiszOTUgMCA5MDQwMDAwCis1NjI2IDEgOTA4MDAwMAorMTE2OSAwIDkxMjAwMDAKKzU2NCAwIDkxNjAwMDAKKzI2MSAwIDkyMDAwMDAKKzMyNyAwIDkyNDAwMDAKKzMwMyAwIDkyODAwMDAKKzExNDUgMCA5MzIwMDAwCisyNTcgMCA5MzYwMDAwCis0OTggMCA5NDAwMDAwCis0NjUgMCA5NDQwMDAwCis0MTQgMCA5NDgwMDAwCis1NTMgMCA5NTIwMDAwCis1NjE3IDEgOTU2MDAwMAorMTA1MiAwIDk2MDAwMDAKKzU5MiAwIDk2NDAwMDAKKzMyMyAwIDk2ODAwMDAKKzQ5NyAwIDk3MjAwMDAKKzQ2NyAwIDk3NjAwMDAKKzcwNSAwIDk4MDAwMDAKKzEwODYgMCA5ODQwMDAwCisxMjUzIDAgOTg4MDAwMAorMTI1MiAwIDk5MjAwMDAKKzc3NiAwIDk5NjAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjkwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdjYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjAgQEAKKzE2NjgwIDEgMTY2NjYKKzE3MDE3IDAgMzMzMzMKKzEwNTM0IDAgNTAwMDAKKzEwMjg5IDAgNjY2NjYKKzM2OTggMCA4MzMzMworMjc3NiAwIDEwMDAwMAorMTkzNiAwIDExNjY2NgorMTQ5MyAwIDEzMzMzMworMTIxNyAwIDE1MDAwMAorOTkzIDAgMTY2NjY2Cis4MDUgMCAxODMzMzMKKzg1NyAwIDIwMDAwMAorNTA4MiAxIDIxNjY2NgorODEyIDAgMjMzMzMzCis3MTggMCAyNTAwMDAKKzc0NiAwIDI2NjY2NgorNzYyIDAgMjgzMzMzCis4NjUgMCAzMDAwMDAKKzc4MiAwIDMxNjY2NgorODMzIDAgMzMzMzMzCis3NTAgMCAzNTAwMDAKKzgxOSAwIDM2NjY2NgorODI2IDAgMzgzMzMzCis4NDYgMCA0MDAwMDAKKzQ1MjIgMSA0MTY2NjYKKzY3OCAwIDQzMzMzMworNzE4IDAgNDUwMDAwCis4MDMgMCA0NjY2NjYKKzc2OSAwIDQ4MzMzMworNzYyIDAgNTAwMDAwCis1ODcgMCA1MTY2NjYKKzYzNSAwIDUzMzMzMworNjU4IDAgNTUwMDAwCis3MTQgMCA1NjY2NjYKKzY3NyAwIDU4MzMzMworNjk5IDAgNjAwMDAwCis0NjE2IDEgNjE2NjY2Cis4MDAgMCA2MzMzMzMKKzgzMSAwIDY1MDAwMAorOTI4IDAgNjY2NjY2Cis4NjkgMCA2ODMzMzMKKzkzMSAwIDcwMDAwMAorOTMwIDAgNzE2NjY2Cis5NzQgMCA3MzMzMzMKKzk3OCAwIDc1MDAwMAorOTMyIDAgNzY2NjY2Cis5MTggMCA3ODMzMzMKKzk3OCAwIDgwMDAwMAorNDY1NSAxIDgxNjY2NgorODk3IDAgODMzMzMzCis4OTYgMCA4NTAwMDAKKzg4MyAwIDg2NjY2NgorOTQ5IDAgODgzMzMzCis5NjUgMCA5MDAwMDAKKzk1MSAwIDkxNjY2NgorOTAxIDAgOTMzMzMzCis5NjUgMCA5NTAwMDAKKzk1NSAwIDk2NjY2NgorOTQ4IDAgOTgzMzMzCis5NjggMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjdjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmE5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDI0MSBAQAorNDcgMzIgMAorMjExMTUgMSAwCisxNjQ1NiAwIDMzMzMzCisxMTg4MCAwIDY2NjY2CisxMjE1NSAwIDEwMDAwMAorMTE0MDIgMCAxMzMzMzMKKzUzNDUgMCAxNjY2NjYKKzI5ODYgMCAyMDAwMDAKKzE5MjQgMCAyMzMzMzMKKzIyNzUgMCAyNjY2NjYKKzI3OTMgMCAzMDAwMDAKKzI3NTYgMCAzMzMzMzMKKzI5MzMgMCAzNjY2NjYKKzIxMTAwIDEgNDAwMDAwCisxMzAyIDAgNDMzMzMzCisyMjA2IDAgNDY2NjY2CisxNTk5IDAgNTAwMDAwCisyNTU4IDAgNTMzMzMzCisyNzg0IDAgNTY2NjY2CisyNDU4IDAgNjAwMDAwCisyNDgwIDAgNjMzMzMzCisxNDQ2IDAgNjY2NjY2CiszMTA5IDAgNzAwMDAwCis5NDQgMCA3MzMzMzMKKzMxMzQgMCA3NjY2NjYKKzIxMzQyIDEgODAwMDAwCis2NTIgMCA4MzMzMzMKKzE3MDggMCA4NjY2NjYKKzIyMDIgMCA5MDAwMDAKKzE2OTUgMCA5MzMzMzMKKzE2NjEgMCA5NjY2NjYKKzE2NTIgMCAxMDAwMDAwCisxNjc5IDAgMTAzMzMzMworMTY5MCAwIDEwNjY2NjYKKzE4MjQgMCAxMTAwMDAwCisxODAzIDAgMTEzMzMzMworMTU5OCAwIDExNjY2NjYKKzIxNTQwIDEgMTIwMDAwMAorMjA1IDAgMTIzMzMzMworMTEyNCAwIDEyNjY2NjYKKzEwNjkgMCAxMzAwMDAwCis4MzggMCAxMzMzMzMzCis3NjUgMCAxMzY2NjY2Cis0MjY1IDAgMTQwMDAwMAorOTQgMCAxNDMzMzMzCisyMDQ2MyAwIDE0NjY2NjYKKzEwMjggMCAxNTAwMDAwCisxNDc1IDAgMTUzMzMzMworMzYzMCAwIDE1NjY2NjYKKzI4MzczIDEgMTYwMDAwMAorNzI1IDAgMTYzMzMzMworMTExOSAwIDE2NjY2NjYKKzE0MjcgMCAxNzAwMDAwCisxNjc5IDAgMTczMzMzMworMTg2NiAwIDE3NjY2NjYKKzExOTcgMCAxODAwMDAwCisxNTcyIDAgMTgzMzMzMworMTY1MSAwIDE4NjY2NjYKKzE2NzggMCAxOTAwMDAwCisxNjg4IDAgMTkzMzMzMworMTY1OSAwIDE5NjY2NjYKKzE5OTAwIDEgMjAwMDAwMAorNTg0IDAgMjAzMzMzMworMTQ3NSAwIDIwNjY2NjYKKzE2NzggMCAyMTAwMDAwCisxMDEwIDAgMjEzMzMzMworMTQzNSAwIDIxNjY2NjYKKzE2MTIgMCAyMjAwMDAwCisxNjAyIDAgMjIzMzMzMworMTcwOSAwIDIyNjY2NjYKKzE3MzcgMCAyMzAwMDAwCisxODM1IDAgMjMzMzMzMworOTI2IDAgMjM2NjY2NgorMjAwOTAgMSAyNDAwMDAwCis2MzEgMCAyNDMzMzMzCisxNTc2IDAgMjQ2NjY2NgorOTQxIDAgMjUwMDAwMAorMjM0OSAwIDI1MzMzMzMKKzExMTIgMCAyNTY2NjY2CisxNTY2IDAgMjYwMDAwMAorMTc3MyAwIDI2MzMzMzMKKzk3OSAwIDI2NjY2NjYKKzIyNDYgMCAyNzAwMDAwCis5MDQgMCAyNzMzMzMzCisxMzQyIDAgMjc2NjY2NgorMjAxNDcgMSAyODAwMDAwCis2MzAgMCAyODMzMzMzCis5ODIgMCAyODY2NjY2CisyMDg5IDAgMjkwMDAwMAorMTAyMSAwIDI5MzMzMzMKKzE1MDYgMCAyOTY2NjY2CisxNjQyIDAgMzAwMDAwMAorOTY4IDAgMzAzMzMzMworMTI2MiAwIDMwNjY2NjYKKzIyNzAgMCAzMTAwMDAwCis4NjQgMCAzMTMzMzMzCisxMjUyIDAgMzE2NjY2NgorMjAxNDUgMSAzMjAwMDAwCis1OTUgMCAzMjMzMzMzCis5MTggMCAzMjY2NjY2CisxMTY3IDAgMzMwMDAwMAorMTM0NyAwIDMzMzMzMzMKKzE1OTcgMCAzMzY2NjY2CisxNjM2IDAgMzQwMDAwMAorOTQ0IDAgMzQzMzMzMworMTI5NSAwIDM0NjY2NjYKKzEzOTcgMCAzNTAwMDAwCisxNDEzIDAgMzUzMzMzMworMTQzMiAwIDM1NjY2NjYKKzIwMTgwIDEgMzYwMDAwMAorNTI1IDAgMzYzMzMzMworMTA2OCAwIDM2NjY2NjYKKzEyMzAgMCAzNzAwMDAwCisxNDI4IDAgMzczMzMzMworOTE2IDAgMzc2NjY2NgorMTk0OCAwIDM4MDAwMDAKKzk2NiAwIDM4MzMzMzMKKzEzNDIgMCAzODY2NjY2CisxMzM4IDAgMzkwMDAwMAorMTM3OSAwIDM5MzMzMzMKKzEyOTYgMCAzOTY2NjY2CisxNzM3OCAxIDQwMDAwMDAKKzU4MyAwIDQwMzMzMzMKKzkzNiAwIDQwNjY2NjYKKzE3NDUgMCA0MTAwMDAwCis5ODcgMCA0MTMzMzMzCisxMzkzIDAgNDE2NjY2NgorMTQ5NSAwIDQyMDAwMDAKKzg2OSAwIDQyMzMzMzMKKzE5MzggMCA0MjY2NjY2Cis4MjggMCA0MzAwMDAwCisxODUxIDAgNDMzMzMzMworODM0IDAgNDM2NjY2NgorMTcyODAgMSA0NDAwMDAwCis1ODAgMCA0NDMzMzMzCis4NjkgMCA0NDY2NjY2CisxNjA1IDAgNDUwMDAwMAorODQzIDAgNDUzMzMzMworNjE0NyAxIDQ1NjY2NjYKKzIyMCAwIDQ2MDAwMDAKKzExMDYgMCA0NjMzMzMzCiszOTUgMCA0NjY2NjY2CiszMDQgMCA0NzAwMDAwCisxOTQ2IDAgNDczMzMzMworMTU0IDAgNDc2NjY2NgorNDgyIDAgNDgwMDAwMAorOTQ5IDAgNDgzMzMzMworMTA4OCAwIDQ4NjY2NjYKKzk3NCAwIDQ5MDAwMDAKKzg3NiAwIDQ5MzMzMzMKKzkxNjQgMSA0OTY2NjY2CisxMDE5IDAgNTAwMDAwMAorOTgzIDAgNTAzMzMzMworMTM3NSAwIDUwNjY2NjYKKzEwNDEgMCA1MTAwMDAwCis3ODkgMCA1MTMzMzMzCisxMDM3IDAgNTE2NjY2NgorODEyIDAgNTIwMDAwMAorNzMyIDAgNTIzMzMzMworOTcyIDAgNTI2NjY2NgorNzA4IDAgNTMwMDAwMAorNjIzIDAgNTMzMzMzMworMTA2NjcgMSA1MzY2NjY2Cis0NjMgMCA1NDAwMDAwCis5MTEgMCA1NDMzMzMzCis4NjEgMCA1NDY2NjY2Cis1MDcgMCA1NTAwMDAwCisxMDE1IDAgNTUzMzMzMworNTAxIDAgNTU2NjY2NgorOTM0IDAgNTYwMDAwMAorODEyIDAgNTYzMzMzMworODU1IDAgNTY2NjY2NgorODA0IDAgNTcwMDAwMAorNzgzIDAgNTczMzMzMworMTA2MTAgMSA1NzY2NjY2Cis5NTAgMCA1ODAwMDAwCisxMjkyIDAgNTgzMzMzMworMTAwMiAwIDU4NjY2NjYKKzcyOCAwIDU5MDAwMDAKKzk2MCAwIDU5MzMzMzMKKzEyMzAgMCA1OTY2NjY2CisxMzE1IDAgNjAwMDAwMAorMTI0OCAwIDYwMzMzMzMKKzk5NSAwIDYwNjY2NjYKKzE0MDEgMCA2MTAwMDAwCis5MDUgMCA2MTMzMzMzCis5MzI2IDEgNjE2NjY2NgorNzI2IDAgNjIwMDAwMAorNjY3IDAgNjIzMzMzMworODMzIDAgNjI2NjY2NgorMTAwNyAwIDYzMDAwMDAKKzExNzIgMCA2MzMzMzMzCisxOTEwIDAgNjM2NjY2NgorMTk1NCAwIDY0MDAwMDAKKzE0OTggMCA2NDMzMzMzCisxMTg4IDAgNjQ2NjY2NgorNzg0IDAgNjUwMDAwMAorMTAwNSAwIDY1MzMzMzMKKzEwMDMwIDEgNjU2NjY2NgorNDUyIDAgNjYwMDAwMAorNzYzIDAgNjYzMzMzMworNjM5IDAgNjY2NjY2NgorNjcxIDAgNjcwMDAwMAorODY3IDAgNjczMzMzMworOTYzIDAgNjc2NjY2NgorOTgyIDAgNjgwMDAwMAorOTk1IDAgNjgzMzMzMworOTgyIDAgNjg2NjY2NgorNzQ3IDAgNjkwMDAwMAorNTc0IDAgNjkzMzMzMworMTIzNTMgMSA2OTY2NjY2Cis0NzQgMCA3MDAwMDAwCis5NjkgMCA3MDMzMzMzCis2MzMgMCA3MDY2NjY2Cis3MjMgMCA3MTAwMDAwCisxMjIxIDAgNzEzMzMzMworNjc0IDAgNzE2NjY2NgorNzc2IDAgNzIwMDAwMAorNTcyIDAgNzIzMzMzMworOTEyIDAgNzI2NjY2NgorNTY0IDAgNzMwMDAwMAorNTk0IDAgNzMzMzMzMworMTY2NjEgMSA3MzY2NjY2Cis1MTggMCA3NDAwMDAwCis2NTYgMCA3NDMzMzMzCis2MjUgMCA3NDY2NjY2Cis1ODMgMCA3NTAwMDAwCis1ODQgMCA3NTMzMzMzCisxMDI3IDAgNzU2NjY2NgorODEyIDAgNzYwMDAwMAorNzI5IDAgNzYzMzMzMworNzY2IDAgNzY2NjY2NgorOTAxIDAgNzcwMDAwMAorOTYwIDAgNzczMzMzMworMTIzMzYgMSA3NzY2NjY2Cis5NDQgMCA3ODAwMDAwCisxMzk4IDAgNzgzMzMzMworMTYyNSAwIDc4NjY2NjYKKzIxMDMgMCA3OTAwMDAwCisxNjMwIDAgNzkzMzMzMworMTIyOCAwIDc5NjY2NjYKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWFkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlZDEyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDk5IEBACisxOSAzMiAwCis4IDMyIDAKKzggMzIgMAorNTI5IDEgMAorMzI5IDEgMTM1MDAKKzM0OSAxIDMzNTAwCiszMzYgMSA1MzUwMAorMzgzIDEgNzM1MDAKKzM1OSAxIDkzNTAwCiszNDQgMSAxMTM1MDAKKzM0MyAxIDEzMzUwMAorMzMyIDEgMTUzNTAwCiszMjAgMSAxNzM1MDAKKzMxOSAxIDE5MzUwMAorMzIzIDEgMjEzNTAwCiszMjAgMSAyMzM1MDAKKzMyOCAxIDI1MzUwMAorMzQwIDEgMjczNTAwCiszMTggMSAyOTM1MDAKKzMxOSAxIDMxMzUwMAorMzM1IDEgMzMzNTAwCis1MTEgMSAzNTM1MDAKKzM5NSAxIDM3MzUwMAorMzI3IDEgMzkzNTAwCis0NzkgMSA0MTM1MDAKKzMzMiAxIDQzMzUwMAorMzIwIDEgNDUzNTAwCiszMjEgMSA0NzM1MDAKKzMxMCAxIDQ5MzUwMAorMzEwIDEgNTEzNTAwCiszMTAgMSA1MzM1MDAKKzMyNiAxIDU1MzUwMAorMzMwIDEgNTczNTAwCiszMTggMSA1OTM1MDAKKzMwOSAxIDYxMzUwMAorMzA0IDEgNjMzNTAwCisyOTggMSA2NTM1MDAKKzI5NCAxIDY3MzUwMAorMzAwIDEgNjkzNTAwCiszMTQgMSA3MTM1MDAKKzMwNCAxIDczMzUwMAorMzA3IDEgNzUzNTAwCiszMjEgMSA3NzM1MDAKKzMzMyAxIDc5MzUwMAorMzM1IDEgODEzNTAwCiszMDYgMSA4MzM1MDAKKzMxNSAxIDg1MzUwMAorMzIwIDEgODczNTAwCiszMTUgMSA4OTM1MDAKKzMwOCAxIDkxMzUwMAorMzIwIDEgOTMzNTAwCiszMTEgMSA5NTM1MDAKKzMxMSAxIDk3MzUwMAorMzEzIDEgOTkzNTAwCiszMTQgMSAxMDEzNTAwCiszMDggMSAxMDMzNTAwCiszMDcgMSAxMDUzNTAwCiszMTcgMSAxMDczNTAwCiszMjggMSAxMDkzNTAwCiszMTcgMSAxMTEzNTAwCiszMTIgMSAxMTMzNTAwCiszMDggMSAxMTUzNTAwCiszMTUgMSAxMTczNTAwCiszMjAgMSAxMTkzNTAwCiszMjIgMSAxMjEzNTAwCiszMjMgMSAxMjMzNTAwCiszMjIgMSAxMjUzNTAwCiszMjIgMSAxMjczNTAwCiszMDEgMSAxMjkzNTAwCiszMDMgMSAxMzEzNTAwCiszMDggMSAxMzMzNTAwCisyOTkgMSAxMzUzNTAwCisyOTcgMSAxMzczNTAwCisyOTMgMSAxMzkzNTAwCisyOTUgMSAxNDEzNTAwCisyOTcgMSAxNDMzNTAwCiszMDAgMSAxNDUzNTAwCisyOTQgMSAxNDczNTAwCisyOTkgMSAxNDkzNTAwCisyOTYgMSAxNTEzNTAwCiszMDMgMSAxNTMzNTAwCiszMTMgMSAxNTUzNTAwCiszMDYgMSAxNTczNTAwCiszMDMgMSAxNTkzNTAwCiszMTEgMSAxNjEzNTAwCiszMDcgMSAxNjMzNTAwCiszMTAgMSAxNjUzNTAwCiszMzkgMSAxNjczNTAwCiszMjUgMSAxNjkzNTAwCiszMjAgMSAxNzEzNTAwCiszMTUgMSAxNzMzNTAwCiszMTYgMSAxNzUzNTAwCiszMzggMSAxNzczNTAwCiszMjUgMSAxNzkzNTAwCiszMjUgMSAxODEzNTAwCiszMjggMSAxODMzNTAwCiszMDQgMSAxODUzNTAwCisyOTcgMSAxODczNTAwCiszMjIgMSAxODkzNTAwCiszMTEgMSAxOTEzNTAwCiszMDcgMSAxOTMzNTAwCiszMDAgMSAxOTUzNTAwCiszMDEgMSAxOTczNTAwCiszMDkgMSAxOTkzNTAwCiszMDAgMSAyMDEzNTAwCiszMDYgMSAyMDMzNTAwCiszMDUgMSAyMDUzNTAwCisyOTggMSAyMDczNTAwCisyOTEgMSAyMDkzNTAwCiszMDEgMSAyMTEzNTAwCiszMDAgMSAyMTMzNTAwCis0MzkgMSAyMTUzNTAwCisyOTIgMSAyMTczNTAwCiszMDggMSAyMTkzNTAwCiszMDUgMSAyMjEzNTAwCisyOTggMSAyMjMzNTAwCisyOTcgMSAyMjUzNTAwCisyOTMgMSAyMjczNTAwCis0MDggMSAyMjkzNTAwCisyOTggMSAyMzEzNTAwCis0NTIgMSAyMzMzNTAwCisyOTcgMSAyMzUzNTAwCiszMDMgMSAyMzczNTAwCiszMDAgMSAyMzkzNTAwCiszMTAgMSAyNDEzNTAwCisyOTkgMSAyNDMzNTAwCiszMDYgMSAyNDUzNTAwCiszMTYgMSAyNDczNTAwCiszMDggMSAyNDkzNTAwCiszMTMgMSAyNTEzNTAwCiszMDkgMSAyNTMzNTAwCiszMTAgMSAyNTUzNTAwCiszMTUgMSAyNTczNTAwCiszMDkgMSAyNTkzNTAwCiszMTcgMSAyNjEzNTAwCiszMTEgMSAyNjMzNTAwCiszMjggMSAyNjUzNTAwCiszMzMgMSAyNjczNTAwCiszMjYgMSAyNjkzNTAwCiszMjMgMSAyNzEzNTAwCiszMTYgMSAyNzMzNTAwCiszMjUgMSAyNzUzNTAwCiszMTYgMSAyNzczNTAwCiszMTkgMSAyNzkzNTAwCiszMjYgMSAyODEzNTAwCiszMjAgMSAyODMzNTAwCiszMjggMSAyODUzNTAwCiszMTIgMSAyODczNTAwCiszMTQgMSAyODkzNTAwCiszMDkgMSAyOTEzNTAwCiszMDYgMSAyOTMzNTAwCisyOTUgMSAyOTUzNTAwCiszMDQgMSAyOTczNTAwCiszMjYgMSAyOTkzNTAwCisyOTEgMSAzMDEzNTAwCisyOTkgMSAzMDMzNTAwCisyOTMgMSAzMDUzNTAwCisyODggMSAzMDczNTAwCisyOTQgMSAzMDkzNTAwCisyOTIgMSAzMTEzNTAwCisyOTIgMSAzMTMzNTAwCisyODggMSAzMTUzNTAwCiszMDggMSAzMTczNTAwCiszMDQgMSAzMTkzNTAwCisyOTIgMSAzMjEzNTAwCiszODIgMSAzMjMzNTAwCiszODEgMSAzMjUzNTAwCisyOTkgMSAzMjczNTAwCiszMTYgMSAzMjkzNTAwCiszMDggMSAzMzEzNTAwCiszMDEgMSAzMzMzNTAwCisyOTcgMSAzMzUzNTAwCisyOTkgMSAzMzczNTAwCisyOTQgMSAzMzkzNTAwCisyOTUgMSAzNDEzNTAwCiszMTcgMSAzNDMzNTAwCisyOTcgMSAzNDUzNTAwCiszMDkgMSAzNDczNTAwCiszMTMgMSAzNDkzNTAwCiszMjAgMSAzNTEzNTAwCiszMjkgMSAzNTMzNTAwCiszMzAgMSAzNTUzNTAwCiszMjQgMSAzNTczNTAwCiszMjQgMSAzNTkzNTAwCiszMDkgMSAzNjEzNTAwCiszMDQgMSAzNjMzNTAwCiszMTMgMSAzNjUzNTAwCiszMTIgMSAzNjczNTAwCisyOTkgMSAzNjkzNTAwCisyOTUgMSAzNzEzNTAwCiszMDEgMSAzNzMzNTAwCisyOTUgMSAzNzUzNTAwCisyOTcgMSAzNzczNTAwCiszMDIgMSAzNzkzNTAwCisyOTggMSAzODEzNTAwCisyOTkgMSAzODMzNTAwCisyOTYgMSAzODUzNTAwCisyOTIgMSAzODczNTAwCiszMDcgMSAzODkzNTAwCiszMDMgMSAzOTEzNTAwCiszMTMgMSAzOTMzNTAwCiszMTggMSAzOTUzNTAwCiszMTMgMSAzOTczNTAwCiszNTMgMSAzOTkzNTAwCiszNzEgMSA0MDEzNTAwCisyOTIgMSA0MDMzNTAwCiszMDAgMSA0MDUzNTAwCiszODEgMSA0MDczNTAwCisyOTQgMSA0MDkzNTAwCiszMDEgMSA0MTEzNTAwCiszMDUgMSA0MTMzNTAwCisyOTkgMSA0MTUzNTAwCiszMDUgMSA0MTczNTAwCiszMjIgMSA0MTkzNTAwCiszMTUgMSA0MjEzNTAwCiszMjYgMSA0MjMzNTAwCiszMzggMSA0MjUzNTAwCiszMjAgMSA0MjczNTAwCiszMTkgMSA0MjkzNTAwCiszMjcgMSA0MzEzNTAwCiszMzAgMSA0MzMzNTAwCiszMTAgMSA0MzUzNTAwCiszMDMgMSA0MzczNTAwCisyOTkgMSA0MzkzNTAwCisyOTMgMSA0NDEzNTAwCisyOTMgMSA0NDMzNTAwCisyOTQgMSA0NDUzNTAwCisyOTUgMSA0NDczNTAwCisyOTUgMSA0NDkzNTAwCiszMjMgMSA0NTEzNTAwCiszMDkgMSA0NTMzNTAwCiszMDkgMSA0NTUzNTAwCiszMDEgMSA0NTczNTAwCis0NzMgMSA0NTkzNTAwCisyOTEgMSA0NjEzNTAwCisyOTcgMSA0NjMzNTAwCisyOTQgMSA0NjUzNTAwCisyOTMgMSA0NjczNTAwCiszMDQgMSA0NjkzNTAwCisyOTIgMSA0NzEzNTAwCiszMDIgMSA0NzMzNTAwCisyOTYgMSA0NzUzNTAwCisyOTggMSA0NzczNTAwCiszMDEgMSA0NzkzNTAwCiszMDcgMSA0ODEzNTAwCisyODUgMSA0ODMzNTAwCisyOTQgMSA0ODUzNTAwCiszMDQgMSA0ODczNTAwCisyOTQgMSA0ODkzNTAwCisyOTUgMSA0OTEzNTAwCiszMjUgMSA0OTMzNTAwCiszMTkgMSA0OTUzNTAwCiszMjMgMSA0OTczNTAwCiszMTMgMSA0OTkzNTAwCiszMDMgMSA1MDEzNTAwCisyOTYgMSA1MDMzNTAwCisyOTUgMSA1MDUzNTAwCisyOTAgMSA1MDczNTAwCisyOTcgMSA1MDkzNTAwCisyOTYgMSA1MTEzNTAwCisyOTYgMSA1MTMzNTAwCisyOTIgMSA1MTUzNTAwCisyOTUgMSA1MTczNTAwCisyODcgMSA1MTkzNTAwCisyOTQgMSA1MjEzNTAwCisyOTAgMSA1MjMzNTAwCisyOTcgMSA1MjUzNTAwCisyOTcgMSA1MjczNTAwCisyOTcgMSA1MjkzNTAwCisyOTIgMSA1MzEzNTAwCisyOTcgMSA1MzMzNTAwCisyOTAgMSA1MzUzNTAwCisyOTMgMSA1MzczNTAwCisyOTMgMSA1MzkzNTAwCisyOTEgMSA1NDEzNTAwCisyOTIgMSA1NDMzNTAwCisyOTAgMSA1NDUzNTAwCisyOTEgMSA1NDczNTAwCisyOTYgMSA1NDkzNTAwCisyOTUgMSA1NTEzNTAwCiszMjcgMSA1NTMzNTAwCisyOTMgMSA1NTUzNTAwCisyOTEgMSA1NTczNTAwCisyOTEgMSA1NTkzNTAwCiszMTEgMSA1NjEzNTAwCisyOTEgMSA1NjMzNTAwCisyOTQgMSA1NjUzNTAwCisyOTYgMSA1NjczNTAwCisyOTUgMSA1NjkzNTAwCisyODkgMSA1NzEzNTAwCisyOTUgMSA1NzMzNTAwCisyOTUgMSA1NzUzNTAwCisyOTcgMSA1NzczNTAwCisyOTIgMSA1NzkzNTAwCisyOTcgMSA1ODEzNTAwCisyOTIgMSA1ODMzNTAwCisyOTUgMSA1ODUzNTAwCisyOTYgMSA1ODczNTAwCisyOTUgMSA1ODkzNTAwCiszMDMgMSA1OTEzNTAwCiszMDQgMSA1OTMzNTAwCiszMDEgMSA1OTUzNTAwCiszMDcgMSA1OTczNTAwCiszMDQgMSA1OTkzNTAwCiszMTAgMSA2MDEzNTAwCiszMTAgMSA2MDMzNTAwCiszMDUgMSA2MDUzNTAwCiszMDEgMSA2MDczNTAwCiszMDIgMSA2MDkzNTAwCiszMDUgMSA2MTEzNTAwCisyOTggMSA2MTMzNTAwCiszMDAgMSA2MTUzNTAwCiszMDAgMSA2MTczNTAwCisyOTIgMSA2MTkzNTAwCisyOTcgMSA2MjEzNTAwCiszMDEgMSA2MjMzNTAwCisyOTcgMSA2MjUzNTAwCisyOTcgMSA2MjczNTAwCisyOTggMSA2MjkzNTAwCisyOTcgMSA2MzEzNTAwCiszMDAgMSA2MzMzNTAwCisyOTMgMSA2MzUzNTAwCisyOTMgMSA2MzczNTAwCisyOTcgMSA2MzkzNTAwCisyOTQgMSA2NDEzNTAwCiszMDcgMSA2NDMzNTAwCiszMDIgMSA2NDUzNTAwCiszMDcgMSA2NDczNTAwCiszMjAgMSA2NDkzNTAwCiszMzAgMSA2NTEzNTAwCiszMzMgMSA2NTMzNTAwCiszMzcgMSA2NTUzNTAwCiszMzEgMSA2NTczNTAwCiszMjMgMSA2NTkzNTAwCiszMTIgMSA2NjEzNTAwCiszMjYgMSA2NjMzNTAwCiszMjggMSA2NjUzNTAwCiszMzIgMSA2NjczNTAwCiszMzMgMSA2NjkzNTAwCiszNDAgMSA2NzEzNTAwCiszMzYgMSA2NzMzNTAwCiszMjQgMSA2NzUzNTAwCiszMTIgMSA2NzczNTAwCiszMDEgMSA2NzkzNTAwCisyODkgMSA2ODEzNTAwCiszMDIgMSA2ODMzNTAwCisyOTYgMSA2ODUzNTAwCisyOTkgMSA2ODczNTAwCisyODkgMSA2ODkzNTAwCisyOTUgMSA2OTEzNTAwCisyOTkgMSA2OTMzNTAwCiszNzQgMSA2OTUzNTAwCiszOTEgMSA2OTczNTAwCiszNjUgMSA2OTkzNTAwCiszNDAgMSA3MDEzNTAwCiszMzAgMSA3MDMzNTAwCiszMzcgMSA3MDUzNTAwCiszMjggMSA3MDczNTAwCiszMjkgMSA3MDkzNTAwCiszMTkgMSA3MTEzNTAwCiszMTIgMSA3MTMzNTAwCiszMDggMSA3MTUzNTAwCiszMDQgMSA3MTczNTAwCiszMTIgMSA3MTkzNTAwCiszMTEgMSA3MjEzNTAwCiszMTYgMSA3MjMzNTAwCisyOTkgMSA3MjUzNTAwCiszMzAgMSA3MjczNTAwCiszMzAgMSA3MjkzNTAwCiszMzAgMSA3MzEzNTAwCiszNDIgMSA3MzMzNTAwCis0MzkgMSA3MzUzNTAwCiszMjIgMSA3MzczNTAwCisyOTggMSA3MzkzNTAwCisyOTMgMSA3NDEzNTAwCiszMTAgMSA3NDMzNTAwCiszMDMgMSA3NDUzNTAwCiszMTcgMSA3NDczNTAwCis0NTMgMSA3NDkzNTAwCiszNzcgMSA3NTEzNTAwCiszNzQgMSA3NTMzNTAwCisyOTIgMSA3NTUzNTAwCisyOTUgMSA3NTczNTAwCisyNzQgMSA3NTkzNTAwCisyOTIgMSA3NjEzNTAwCisyOTEgMSA3NjMzNTAwCiszNjcgMSA3NjUzNTAwCisyOTUgMSA3NjczNTAwCisyOTggMSA3NjkzNTAwCisyOTcgMSA3NzEzNTAwCiszMDEgMSA3NzMzNTAwCisyOTIgMSA3NzUzNTAwCiszNDQgMSA3NzczNTAwCisyOTYgMSA3NzkzNTAwCisyOTcgMSA3ODEzNTAwCiszMDYgMSA3ODMzNTAwCiszMDggMSA3ODUzNTAwCiszMDUgMSA3ODczNTAwCiszMTMgMSA3ODkzNTAwCiszMDYgMSA3OTEzNTAwCiszMjIgMSA3OTMzNTAwCiszMTMgMSA3OTUzNTAwCiszMDUgMSA3OTczNTAwCiszMDQgMSA3OTkzNTAwCiszMTMgMSA4MDEzNTAwCiszMjQgMSA4MDMzNTAwCiszMTIgMSA4MDUzNTAwCiszMTggMSA4MDczNTAwCiszMTEgMSA4MDkzNTAwCiszMDIgMSA4MTEzNTAwCiszMDUgMSA4MTMzNTAwCiszMTIgMSA4MTUzNTAwCiszMTMgMSA4MTczNTAwCiszMTIgMSA4MTkzNTAwCiszMzUgMSA4MjEzNTAwCiszMzMgMSA4MjMzNTAwCiszNDYgMSA4MjUzNTAwCiszMzkgMSA4MjczNTAwCiszMzcgMSA4MjkzNTAwCiszNDEgMSA4MzEzNTAwCiszMzUgMSA4MzMzNTAwCiszMjUgMSA4MzUzNTAwCiszMjQgMSA4MzczNTAwCiszMTcgMSA4MzkzNTAwCiszMTUgMSA4NDEzNTAwCiszMDMgMSA4NDMzNTAwCiszMTcgMSA4NDUzNTAwCis0NTIgMSA4NDczNTAwCiszMjQgMSA4NDkzNTAwCiszMjEgMSA4NTEzNTAwCiszMzUgMSA4NTMzNTAwCiszMjcgMSA4NTUzNTAwCiszMTUgMSA4NTczNTAwCiszMjEgMSA4NTkzNTAwCiszMTkgMSA4NjEzNTAwCiszMDggMSA4NjMzNTAwCiszMTQgMSA4NjUzNTAwCiszMjIgMSA4NjczNTAwCiszMjggMSA4NjkzNTAwCiszMjAgMSA4NzEzNTAwCiszMjQgMSA4NzMzNTAwCiszMzEgMSA4NzUzNTAwCiszMzAgMSA4NzczNTAwCiszMjggMSA4NzkzNTAwCiszMTggMSA4ODEzNTAwCiszMTQgMSA4ODMzNTAwCiszMTggMSA4ODUzNTAwCiszMTggMSA4ODczNTAwCiszMjUgMSA4ODkzNTAwCiszMzggMSA4OTEzNTAwCiszNDEgMSA4OTMzNTAwCiszMzMgMSA4OTUzNTAwCiszMzAgMSA4OTczNTAwCiszMzggMSA4OTkzNTAwCiszMzMgMSA5MDEzNTAwCiszMzAgMSA5MDMzNTAwCiszNDQgMSA5MDUzNTAwCis0NzkgMSA5MDczNTAwCis0NzMgMSA5MDkzNTAwCiszMzMgMSA5MTEzNTAwCiszMzcgMSA5MTMzNTAwCis0OTUgMSA5MTUzNTAwCiszNTMgMSA5MTczNTAwCiszNTIgMSA5MTkzNTAwCiszNDQgMSA5MjEzNTAwCiszMzYgMSA5MjMzNTAwCiszMjQgMSA5MjUzNTAwCiszMjEgMSA5MjczNTAwCiszNTAgMSA5MjkzNTAwCiszNDcgMSA5MzEzNTAwCiszNDMgMSA5MzMzNTAwCiszNDUgMSA5MzUzNTAwCiszMzcgMSA5MzczNTAwCiszMzUgMSA5MzkzNTAwCiszMzMgMSA5NDEzNTAwCiszMzYgMSA5NDMzNTAwCiszMzQgMSA5NDUzNTAwCiszMzMgMSA5NDczNTAwCiszMzEgMSA5NDkzNTAwCiszMjkgMSA5NTEzNTAwCiszMTkgMSA5NTMzNTAwCiszMjEgMSA5NTUzNTAwCiszMTYgMSA5NTczNTAwCiszMjIgMSA5NTkzNTAwCis0NDggMSA5NjEzNTAwCiszMTIgMSA5NjMzNTAwCiszMDYgMSA5NjUzNTAwCiszMDEgMSA5NjczNTAwCiszMDMgMSA5NjkzNTAwCisyOTYgMSA5NzEzNTAwCiszMDAgMSA5NzMzNTAwCisyOTUgMSA5NzUzNTAwCiszMDAgMSA5NzczNTAwCisyOTcgMSA5NzkzNTAwCiszMDAgMSA5ODEzNTAwCisyOTcgMSA5ODMzNTAwCis1MTIgMSA5ODUzNTAwCisyOTIgMSA5ODczNTAwCis0NjggMSA5ODkzNTAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmI4NzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMmY0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ5ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTI0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbwpAQCAtMCwwICsxLDEwIEBACisxNjM4NCAxIDAKKzE2Mzg0IDEgMTAyNDAwMAorMTYzODQgMSAyMDQ4MDAwCisxNjM4NCAxIDMwNzIwMDAKKzE2Mzg0IDEgNDA5NjAwMAorMTYzODQgMSA1MTIwMDAwCisxNjM4NCAxIDYxNDQwMDAKKzE2Mzg0IDEgNzE2ODAwMAorMTYzODQgMSA4MTkyMDAwCisxMDkyNCAxIDkyMTYwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOTFiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4YjJlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTZkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNTIwIEBACiszMCAzMiAwCis0MTQwIDMyIDAKKzMzIDMyIDAKKzUyIDEgMAorNTggMSAyNjY2Cis2MSAxIDUzMzMKKzU2IDEgODAwMAorNTkgMSAxMDY2NgorNjMgMSAxMzMzMworNjYgMSAxNjAwMAorNzEgMSAxODY2NgorNzYgMSAyMTMzMworMzc0IDEgMjQwMDAKKzM2NiAxIDM2MDAwCiszNzggMSA1NzMzMworMzkzIDEgNzg2NjYKKzM5MyAxIDEwMDAwMAorMzg2IDEgMTIxMzMzCiszNzUgMSAxNDI2NjYKKzM4OCAxIDE2NDAwMAorMzc4IDEgMTg1MzMzCiszNzkgMSAyMDY2NjYKKzM3NCAxIDIyODAwMAorMzU2IDEgMjQ5MzMzCiszNTggMSAyNzA2NjYKKzMzMiAxIDI5MjAwMAorMzM1IDEgMzEzMzMzCiszNjMgMSAzMzQ2NjYKKzM0MSAxIDM1NjAwMAorMzYwIDEgMzc3MzMzCiszNDEgMSAzOTg2NjYKKzMzNSAxIDQyMDAwMAorMzU3IDEgNDQxMzMzCiszNTUgMSA0NjI2NjYKKzM2MyAxIDQ4NDAwMAorMzgyIDEgNTA1MzMzCiszNzEgMSA1MjY2NjYKKzM1NyAxIDU0ODAwMAorMzUzIDEgNTY5MzMzCiszNTAgMSA1OTA2NjYKKzMyNyAxIDYxMjAwMAorMzE1IDEgNjMzMzMzCiszMDcgMSA2NTQ2NjYKKzMwMyAxIDY3NjAwMAorMjk1IDEgNjk3MzMzCiszMTIgMSA3MTg2NjYKKzMxNiAxIDc0MDAwMAorMzE1IDEgNzYxMzMzCiszMTggMSA3ODI2NjYKKzMzMCAxIDgwNDAwMAorMzE4IDEgODI1MzMzCiszMTUgMSA4NDY2NjYKKzMyMiAxIDg2ODAwMAorMzE1IDEgODg5MzMzCiszMTAgMSA5MTA2NjYKKzMxNSAxIDkzMjAwMAorMzE0IDEgOTUzMzMzCiszMDIgMSA5NzQ2NjYKKzMxMyAxIDk5NjAwMAorMzIyIDEgMTAxNzMzMworMzIzIDEgMTAzODY2NgorMzE5IDEgMTA2MDAwMAorMzI1IDEgMTA4MTMzMworMzI4IDEgMTEwMjY2NgorMzMwIDEgMTEyNDAwMAorMzMzIDEgMTE0NTMzMworMzMwIDEgMTE2NjY2NgorMzQ0IDEgMTE4ODAwMAorMzMxIDEgMTIwOTMzMworMzQyIDEgMTIzMDY2NgorMzM5IDEgMTI1MjAwMAorMzE0IDEgMTI3MzMzMworMjg1IDEgMTI5NDY2NgorMjk1IDEgMTMxNjAwMAorMzAyIDEgMTMzNzMzMworMzA1IDEgMTM1ODY2NgorMzA5IDEgMTM4MDAwMAorMzI3IDEgMTQwMTMzMworMzA0IDEgMTQyMjY2NgorMzM2IDEgMTQ0NDAwMAorMzUwIDEgMTQ2NTMzMworMzQ2IDEgMTQ4NjY2NgorMzUyIDEgMTUwODAwMAorMzQxIDEgMTUyOTMzMworMzQzIDEgMTU1MDY2NgorMzUxIDEgMTU3MjAwMAorMzE5IDEgMTU5MzMzMworMzI4IDEgMTYxNDY2NgorMzI4IDEgMTYzNjAwMAorMzI0IDEgMTY1NzMzMworMzM4IDEgMTY3ODY2NgorMzE3IDEgMTcwMDAwMAorMzI4IDEgMTcyMTMzMworMzM1IDEgMTc0MjY2NgorMzQxIDEgMTc2NDAwMAorMzM1IDEgMTc4NTMzMworMzQ4IDEgMTgwNjY2NgorMzYyIDEgMTgyODAwMAorMzYxIDEgMTg0OTMzMworMzQ0IDEgMTg3MDY2NgorMzQwIDEgMTg5MjAwMAorMzMzIDEgMTkxMzMzMworMzI5IDEgMTkzNDY2NgorMzI4IDEgMTk1NjAwMAorMzIzIDEgMTk3NzMzMworMzEwIDEgMTk5ODY2NgorMzE4IDEgMjAyMDAwMAorMzEyIDEgMjA0MTMzMworMjk1IDEgMjA2MjY2NgorMzI5IDEgMjA4NDAwMAorMzE4IDEgMjEwNTMzMworMzExIDEgMjEyNjY2NgorMzE3IDEgMjE0ODAwMAorNjIgMSAyMTY5MzMzCis3NSAxIDIxODEzMzMKKzczIDEgMjE4NDAwMAorMzMyIDEgMjE4NjY2NgorMzI3IDEgMjE5ODY2NgorMzMyIDEgMjIyMDAwMAorMzI1IDEgMjI0MTMzMworMzI5IDEgMjI2MjY2NgorMzMwIDEgMjI4NDAwMAorNjEgMSAyMzA1MzMzCis2MSAxIDIzMTczMzMKKzcwIDEgMjMyMDAwMAorNzAgMSAyMzIyNjY2CiszMTkgMSAyMzI1MzMzCiszMDMgMSAyMzM3MzMzCisyOTIgMSAyMzU4NjY2CiszMTMgMSAyMzgwMDAwCiszMTggMSAyNDAxMzMzCiszNDYgMSAyNDIyNjY2CiszMjggMSAyNDQ0MDAwCiszMTYgMSAyNDY1MzMzCiszNDEgMSAyNDg2NjY2CiszMjggMSAyNTA4MDAwCiszMzggMSAyNTI5MzMzCiszNDEgMSAyNTUwNjY2CiszMzcgMSAyNTcyMDAwCiszNDcgMSAyNTkzMzMzCiszODQgMSAyNjE0NjY2CiszNTggMSAyNjM2MDAwCiszNjMgMSAyNjU3MzMzCiszNjMgMSAyNjc4NjY2CiszNTggMSAyNzAwMDAwCiszMzkgMSAyNzIxMzMzCiszNjkgMSAyNzQyNjY2CiszNDMgMSAyNzY0MDAwCiszNDggMSAyNzg1MzMzCiszNjMgMSAyODA2NjY2CiszNTAgMSAyODI4MDAwCiszNTggMSAyODQ5MzMzCiszNTIgMSAyODcwNjY2CiszMzggMSAyODkyMDAwCiszMzUgMSAyOTEzMzMzCiszNDIgMSAyOTM0NjY2CiszMzggMSAyOTU2MDAwCiszNDAgMSAyOTc3MzMzCisyOTIgMSAyOTk4NjY2CisyNzkgMSAzMDIwMDAwCisyOTkgMSAzMDQxMzMzCiszMDMgMSAzMDYyNjY2CisyOTggMSAzMDg0MDAwCisyOTcgMSAzMTA1MzMzCisyODAgMSAzMTI2NjY2CisyOTcgMSAzMTQ4MDAwCisyOTAgMSAzMTY5MzMzCiszMDYgMSAzMTkwNjY2CiszMDEgMSAzMjEyMDAwCiszMDYgMSAzMjMzMzMzCisyODkgMSAzMjU0NjY2CiszMTEgMSAzMjc2MDAwCiszMTcgMSAzMjk3MzMzCiszNDQgMSAzMzE4NjY2CiszMDggMSAzMzQwMDAwCiszMDQgMSAzMzYxMzMzCiszMDQgMSAzMzgyNjY2CiszMTIgMSAzNDA0MDAwCiszMDUgMSAzNDI1MzMzCisyOTkgMSAzNDQ2NjY2CiszMDEgMSAzNDY4MDAwCiszMTggMSAzNDg5MzMzCiszMTMgMSAzNTEwNjY2CiszMzAgMSAzNTMyMDAwCiszMjUgMSAzNTUzMzMzCiszMjUgMSAzNTc0NjY2CiszMjEgMSAzNTk2MDAwCiszNDkgMSAzNjE3MzMzCisyODggMSAzNjM4NjY2CiszMDAgMSAzNjYwMDAwCiszMTIgMSAzNjgxMzMzCiszMDIgMSAzNzAyNjY2CisyNzggMSAzNzI0MDAwCisyODQgMSAzNzQ1MzMzCisyODYgMSAzNzY2NjY2CisyNzQgMSAzNzg4MDAwCisyOTUgMSAzODA5MzMzCisyODEgMSAzODMwNjY2CisyODggMSAzODUyMDAwCisyNzggMSAzODczMzMzCiszMDYgMSAzODk0NjY2Cis2MiAxIDM5MTYwMDAKKzU5IDEgMzkyODAwMAorNjEgMSAzOTMwNjY2Cis1NSAxIDM5MzMzMzMKKzcwIDEgMzkzNjAwMAorNzIgMSAzOTM4NjY2CiszMjQgMSAzOTQxMzMzCiszMDkgMSAzOTUzMzMzCiszMDEgMSAzOTc0NjY2CiszMDEgMSAzOTk2MDAwCisyOTEgMSA0MDE3MzMzCisyODkgMSA0MDM4NjY2CiszMDYgMSA0MDYwMDAwCiszMDUgMSA0MDgxMzMzCisyODYgMSA0MTAyNjY2CisyOTQgMSA0MTI0MDAwCisyOTAgMSA0MTQ1MzMzCisyOTcgMSA0MTY2NjY2CiszMDggMSA0MTg4MDAwCisyOTYgMSA0MjA5MzMzCisyOTIgMSA0MjMwNjY2CisyODcgMSA0MjUyMDAwCisyOTEgMSA0MjczMzMzCisyOTggMSA0Mjk0NjY2CisyOTUgMSA0MzE2MDAwCisyOTQgMSA0MzM3MzMzCisyOTUgMSA0MzU4NjY2CisyNzUgMSA0MzgwMDAwCisyODAgMSA0NDAxMzMzCisyODggMSA0NDIyNjY2CisyODUgMSA0NDQ0MDAwCisyNzQgMSA0NDY1MzMzCisyOTggMSA0NDg2NjY2CiszMDEgMSA0NTA4MDAwCiszMDAgMSA0NTI5MzMzCiszMDUgMSA0NTUwNjY2CisyOTcgMSA0NTcyMDAwCis1OSAxIDQ1OTMzMzMKKzU2IDEgNDYwNTMzMworNTcgMSA0NjA4MDAwCis1NSAxIDQ2MTA2NjYKKzU4IDEgNDYxMzMzMworNTcgMSA0NjE2MDAwCis1OCAxIDQ2MTg2NjYKKzY4IDEgNDYyMTMzMworNjcgMSA0NjI0MDAwCis3MSAxIDQ2MjY2NjYKKzI4OSAxIDQ2MjkzMzMKKzI4MiAxIDQ2NDEzMzMKKzI3MyAxIDQ2NjI2NjYKKzI3OSAxIDQ2ODQwMDAKKzI4NiAxIDQ3MDUzMzMKKzI4MiAxIDQ3MjY2NjYKKzI4NCAxIDQ3NDgwMDAKKzI3OCAxIDQ3NjkzMzMKKzI4MSAxIDQ3OTA2NjYKKzI4MCAxIDQ4MTIwMDAKKzI2MyAxIDQ4MzMzMzMKKzI2MCAxIDQ4NTQ2NjYKKzI3MSAxIDQ4NzYwMDAKKzI3MyAxIDQ4OTczMzMKKzI4MiAxIDQ5MTg2NjYKKzI3OSAxIDQ5NDAwMDAKKzI5NyAxIDQ5NjEzMzMKKzI5MSAxIDQ5ODI2NjYKKzMwOSAxIDUwMDQwMDAKKzI4MyAxIDUwMjUzMzMKKzI5MiAxIDUwNDY2NjYKKzMwNCAxIDUwNjgwMDAKKzI5NiAxIDUwODkzMzMKKzI5MyAxIDUxMTA2NjYKKzI4MiAxIDUxMzIwMDAKKzI3MyAxIDUxNTMzMzMKKzI4NCAxIDUxNzQ2NjYKKzI4MSAxIDUxOTYwMDAKKzI2NSAxIDUyMTczMzMKKzI3MiAxIDUyMzg2NjYKKzI3NyAxIDUyNjAwMDAKKzI4MCAxIDUyODEzMzMKKzI3NiAxIDUzMDI2NjYKKzI3MyAxIDUzMjQwMDAKKzI3OCAxIDUzNDUzMzMKKzI4MCAxIDUzNjY2NjYKKzI4MCAxIDUzODgwMDAKKzI2OCAxIDU0MDkzMzMKKzI4MiAxIDU0MzA2NjYKKzI3NyAxIDU0NTIwMDAKKzI3NCAxIDU0NzMzMzMKKzI3NSAxIDU0OTQ2NjYKKzI3MCAxIDU1MTYwMDAKKzI4MiAxIDU1MzczMzMKKzI3OSAxIDU1NTg2NjYKKzI2MCAxIDU1ODAwMDAKKzI3MiAxIDU2MDEzMzMKKzI3NSAxIDU2MjI2NjYKKzI3MyAxIDU2NDQwMDAKKzI3NiAxIDU2NjUzMzMKKzI4OCAxIDU2ODY2NjYKKzI5NCAxIDU3MDgwMDAKKzI3MSAxIDU3MjkzMzMKKzI3NyAxIDU3NTA2NjYKKzI4OCAxIDU3NzIwMDAKKzI3NiAxIDU3OTMzMzMKKzI4MiAxIDU4MTQ2NjYKKzI3NiAxIDU4MzYwMDAKKzI3NSAxIDU4NTczMzMKKzI2OCAxIDU4Nzg2NjYKKzI3MCAxIDU5MDAwMDAKKzI2NiAxIDU5MjEzMzMKKzI2OCAxIDU5NDI2NjYKKzI4MiAxIDU5NjQwMDAKKzI3OSAxIDU5ODUzMzMKKzI3OSAxIDYwMDY2NjYKKzI4NyAxIDYwMjgwMDAKKzI4NiAxIDYwNDkzMzMKKzI4MCAxIDYwNzA2NjYKKzI5MCAxIDYwOTIwMDAKKzI2NiAxIDYxMTMzMzMKKzI5MiAxIDYxMzQ2NjYKKzI2NCAxIDYxNTYwMDAKKzI3MSAxIDYxNzczMzMKKzI3NyAxIDYxOTg2NjYKKzI5MiAxIDYyMjAwMDAKKzI5OCAxIDYyNDEzMzMKKzI4NCAxIDYyNjI2NjYKKzI4NyAxIDYyODQwMDAKKzI3NSAxIDYzMDUzMzMKKzI5MSAxIDYzMjY2NjYKKzI4NyAxIDYzNDgwMDAKKzI4MyAxIDYzNjkzMzMKKzI4NCAxIDYzOTA2NjYKKzI3MSAxIDY0MTIwMDAKKzI4MiAxIDY0MzMzMzMKKzI3NyAxIDY0NTQ2NjYKKzI4MiAxIDY0NzYwMDAKKzI4NSAxIDY0OTczMzMKKzI4MCAxIDY1MTg2NjYKKzI3MSAxIDY1NDAwMDAKKzI4OSAxIDY1NjEzMzMKKzI4NyAxIDY1ODI2NjYKKzI5NCAxIDY2MDQwMDAKKzI3NyAxIDY2MjUzMzMKKzI4MSAxIDY2NDY2NjYKKzI3NCAxIDY2NjgwMDAKKzI3MSAxIDY2ODkzMzMKKzI3OSAxIDY3MTA2NjYKKzI4OCAxIDY3MzIwMDAKKzI4MCAxIDY3NTMzMzMKKzI4NCAxIDY3NzQ2NjYKKzI3OCAxIDY3OTYwMDAKKzI3NiAxIDY4MTczMzMKKzI3NSAxIDY4Mzg2NjYKKzI2MyAxIDY4NjAwMDAKKzI2NiAxIDY4ODEzMzMKKzI0NyAxIDY5MDI2NjYKKzI2OSAxIDY5MjQwMDAKKzI2MyAxIDY5NDUzMzMKKzI4MyAxIDY5NjY2NjYKKzI4MCAxIDY5ODgwMDAKKzI4MSAxIDcwMDkzMzMKKzI5OSAxIDcwMzA2NjYKKzI4NSAxIDcwNTIwMDAKKzI4OCAxIDcwNzMzMzMKKzI5OSAxIDcwOTQ2NjYKKzI4OCAxIDcxMTYwMDAKKzI3OSAxIDcxMzczMzMKKzI3NiAxIDcxNTg2NjYKKzI3NyAxIDcxODAwMDAKKzI4MiAxIDcyMDEzMzMKKzI4NSAxIDcyMjI2NjYKKzI5NSAxIDcyNDQwMDAKKzI5NCAxIDcyNjUzMzMKKzMwNCAxIDcyODY2NjYKKzI4MiAxIDczMDgwMDAKKzI5OSAxIDczMjkzMzMKKzI4MyAxIDczNTA2NjYKKzI4MiAxIDczNzIwMDAKKzI4NyAxIDczOTMzMzMKKzMwNiAxIDc0MTQ2NjYKKzMwNCAxIDc0MzYwMDAKKzI4OSAxIDc0NTczMzMKKzI5OSAxIDc0Nzg2NjYKKzI4MSAxIDc1MDAwMDAKKzI4MSAxIDc1MjEzMzMKKzY2IDEgNzU0MjY2NgorNjMgMSA3NTU0NjY2CisyODkgMSA3NTU3MzMzCisyNzAgMSA3NTY5MzMzCisyNTcgMSA3NTkwNjY2CisyNDYgMSA3NjEyMDAwCisyNjQgMSA3NjMzMzMzCisyODAgMSA3NjU0NjY2CisyNzMgMSA3Njc2MDAwCisyODUgMSA3Njk3MzMzCisyNjcgMSA3NzE4NjY2CisyNzUgMSA3NzQwMDAwCisyNzggMSA3NzYxMzMzCisyOTMgMSA3NzgyNjY2CisyODEgMSA3ODA0MDAwCisyOTcgMSA3ODI1MzMzCisyOTQgMSA3ODQ2NjY2CisyODYgMSA3ODY4MDAwCisyOTAgMSA3ODg5MzMzCisyOTAgMSA3OTEwNjY2CisyODkgMSA3OTMyMDAwCisyODYgMSA3OTUzMzMzCisyODIgMSA3OTc0NjY2CiszMDYgMSA3OTk2MDAwCisyODcgMSA4MDE3MzMzCiszMTIgMSA4MDM4NjY2CiszMTIgMSA4MDYwMDAwCiszMDcgMSA4MDgxMzMzCisyOTMgMSA4MTAyNjY2CisyODkgMSA4MTI0MDAwCisyODUgMSA4MTQ1MzMzCisyOTAgMSA4MTY2NjY2CisyODUgMSA4MTg4MDAwCiszMTEgMSA4MjA5MzMzCiszMDcgMSA4MjMwNjY2CiszMTQgMSA4MjUyMDAwCiszMTggMSA4MjczMzMzCiszMTkgMSA4Mjk0NjY2CiszMTUgMSA4MzE2MDAwCiszMDAgMSA4MzM3MzMzCisyOTUgMSA4MzU4NjY2CisyOTEgMSA4MzgwMDAwCisyODIgMSA4NDAxMzMzCisyOTUgMSA4NDIyNjY2CisyOTYgMSA4NDQ0MDAwCisyODggMSA4NDY1MzMzCiszMDQgMSA4NDg2NjY2CisyOTkgMSA4NTA4MDAwCisyOTggMSA4NTI5MzMzCiszMDUgMSA4NTUwNjY2CisyOTUgMSA4NTcyMDAwCisyOTYgMSA4NTkzMzMzCisyOTUgMSA4NjE0NjY2CisyODcgMSA4NjM2MDAwCisyOTIgMSA4NjU3MzMzCiszMDggMSA4Njc4NjY2CisyODcgMSA4NzAwMDAwCiszMDcgMSA4NzIxMzMzCisyOTUgMSA4NzQyNjY2CisyOTIgMSA4NzY0MDAwCisyOTIgMSA4Nzg1MzMzCisyNzkgMSA4ODA2NjY2CisyODkgMSA4ODI4MDAwCiszMDMgMSA4ODQ5MzMzCiszMDcgMSA4ODcwNjY2CiszMTAgMSA4ODkyMDAwCiszMDAgMSA4OTEzMzMzCisyOTkgMSA4OTM0NjY2CisyOTkgMSA4OTU2MDAwCisyODggMSA4OTc3MzMzCisyOTAgMSA4OTk4NjY2CisyOTEgMSA5MDIwMDAwCiszMDQgMSA5MDQxMzMzCisyOTkgMSA5MDYyNjY2CiszMDQgMSA5MDg0MDAwCisyOTAgMSA5MTA1MzMzCiszMDkgMSA5MTI2NjY2CiszMDEgMSA5MTQ4MDAwCisyOTYgMSA5MTY5MzMzCisyODggMSA5MTkwNjY2CiszMDUgMSA5MjEyMDAwCiszMTcgMSA5MjMzMzMzCisyOTIgMSA5MjU0NjY2CiszMDAgMSA5Mjc2MDAwCiszMDEgMSA5Mjk3MzMzCisyOTUgMSA5MzE4NjY2CisyODIgMSA5MzQwMDAwCisyOTYgMSA5MzYxMzMzCisyOTUgMSA5MzgyNjY2CisyODcgMSA5NDA0MDAwCisyOTIgMSA5NDI1MzMzCiszMDEgMSA5NDQ2NjY2CiszMTEgMSA5NDY4MDAwCiszMDEgMSA5NDg5MzMzCiszMDcgMSA5NTEwNjY2CiszMDAgMSA5NTMyMDAwCiszMDkgMSA5NTUzMzMzCisyOTggMSA5NTc0NjY2CiszMDQgMSA5NTk2MDAwCis2MCAxIDk2MTczMzMKKzU5IDEgOTYyOTMzMworNjQgMSA5NjMyMDAwCis2NCAxIDk2MzQ2NjYKKzc3IDEgOTYzNzMzMworNzIgMSA5NjQwMDAwCiszMDYgMSA5NjQyNjY2CisyOTcgMSA5NjU0NjY2CisyOTQgMSA5Njc2MDAwCisyOTUgMSA5Njk3MzMzCiszMDggMSA5NzE4NjY2CiszMDMgMSA5NzQwMDAwCiszMDggMSA5NzYxMzMzCisyODkgMSA5NzgyNjY2CiszMDAgMSA5ODA0MDAwCiszMDQgMSA5ODI1MzMzCiszMDggMSA5ODQ2NjY2Cis2NCAxIDk4NjgwMDAKKzYzIDEgOTg4MDAwMAorNjQgMSA5ODgyNjY2Cis2NCAxIDk4ODUzMzMKKzYwIDEgOTg4ODAwMAorNzQgMSA5ODkwNjY2Cis2OSAxIDk4OTMzMzMKKzY4IDEgOTg5NjAwMAorNjEgMSA5ODk4NjY2Cis3MSAxIDk5MDEzMzMKKzc2IDEgOTkwNDAwMAorNzMgMSA5OTA2NjY2Cis3MCAxIDk5MDkzMzMKKzcyIDEgOTkxMjAwMAorNjAgMSA5OTE0NjY2Cis2OSAxIDk5MTczMzMKKzgyIDEgOTkyMDAwMAorMjc4IDEgOTkyMjY2NgorMzAgMSA5OTM0NjY2CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0YzVmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZWE0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACisxMDI3MSAxIDAKKzEwNiAwIDE3MDAwCisxMzQgMCAzMzAwMAorMTQ5IDAgNTAwMDAKKzE1MiAwIDY3MDAwCisxNTkgMCA4MzAwMAorMTE0IDAgMTAwMDAwCis3MjMgMCAxMTcwMDAKKzE3NSAwIDEzMzAwMAorMTg2IDAgMTUwMDAwCisyMDEgMCAxNjcwMDAKKzI3MCAwIDE4MzAwMAorMzgzIDAgMjAwMDAwCisyNTUgMCAyMTcwMDAKKzI4NiAwIDIzMzAwMAorMjczIDAgMjUwMDAwCisxMjI0IDAgMjY3MDAwCisyMjAgMCAyODMwMDAKKzIzMSAwIDMwMDAwMAorMTkyIDAgMzE3MDAwCisxODIgMCAzMzMwMDAKKzI4OSAwIDM1MDAwMAorMjA0IDAgMzY3MDAwCisyMzcgMCAzODMwMDAKKzE4NyAwIDQwMDAwMAorODk4IDAgNDE3MDAwCisyMzEgMCA0MzMwMDAKKzI2NiAwIDQ1MDAwMAorMjc4IDAgNDY3MDAwCisyMDUgMCA0ODMwMDAKKzI1NSAwIDUwMDAwMAorMTY5IDAgNTE3MDAwCisyMzMgMCA1MzMwMDAKKzEwMTEgMCA1NTAwMDAKKzIwMiAwIDU2NzAwMAorMjUxIDAgNTgzMDAwCisyMjMgMCA2MDAwMDAKKzI4MyAwIDYxNzAwMAorMzYyIDAgNjMzMDAwCisyMTcgMCA2NTAwMDAKKzI0NSAwIDY2NzAwMAorOTYwIDAgNjgzMDAwCisyMzMgMCA3MDAwMDAKKzI4NiAwIDcxNzAwMAorMjcyIDAgNzMzMDAwCisyNTQgMCA3NTAwMDAKKzMzMSAwIDc2NzAwMAorMjE4IDAgNzgzMDAwCisyNjEgMCA4MDAwMDAKKzk4MSAwIDgxNzAwMAorMjI2IDAgODMzMDAwCisyMjYgMCA4NTAwMDAKKzI3OSAwIDg2NzAwMAorMjI1IDAgODgzMDAwCisyOTUgMCA5MDAwMDAKKzE3NSAwIDkxNzAwMAorMjQ5IDAgOTMzMDAwCis5OTYgMCA5NTAwMDAKKzE2OSAwIDk2NzAwMAorMjI0IDAgOTgzMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYmE1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzAwYzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMCBAQAorODY5ODAgMSAwCis2NzQxIDAgMzMwMDAKKzk0MzMgMCA2NzAwMAorOTM2MyAwIDEwMDAwMAorODY3MSAwIDEzMzAwMAorOTAwMyAwIDE2NzAwMAorNzc1MSAwIDIwMDAwMAorMTMyMDcgMCAyMzMwMDAKKzg1NDIgMCAyNjcwMDAKKzkzNDQgMCAzMDAwMDAKKzgwNjkgMCAzMzMwMDAKKzg1ODggMCAzNjcwMDAKKzEyMDg3IDAgNDAwMDAwCis3MzE1IDAgNDMzMDAwCis5NjU0IDAgNDY3MDAwCisxMzEwMCAwIDUwMDAwMAorNzgzMiAwIDUzMzAwMAorMTAwNjAgMCA1NjcwMDAKKzg1NDAgMCA2MDAwMDAKKzg2NjcgMCA2MzMwMDAKKzg1MzIgMCA2NjcwMDAKKzYwMTggMCA3MDAwMDAKKzg1MjAgMCA3MzMwMDAKKzE1MzUwIDAgNzY3MDAwCis2MTEwIDAgODAwMDAwCis3ODc2IDAgODMzMDAwCis2MTMzIDAgODY3MDAwCis5NDc2IDAgOTAwMDAwCisxMTAwMiAwIDkzMzAwMAorNzQ4NCAwIDk2NzAwMAorODc2MCAwIDEwMDAwMDAKKzE2NTE1IDAgMTAzMzAwMAorNzQ4MiAwIDEwNjcwMDAKKzY5ODMgMCAxMTAwMDAwCis3NTYxIDAgMTEzMzAwMAorODI2MyAwIDExNjcwMDAKKzEwNjgyIDAgMTIwMDAwMAorODEwOCAwIDEyMzMwMDAKKzc5MjQgMCAxMjY3MDAwCis4NjkzIDAgMTMwMDAwMAorMTQxOTAgMCAxMzMzMDAwCis3MzkzIDAgMTM2NzAwMAorNjg2NCAwIDE0MDAwMDAKKzk0MzEgMCAxNDMzMDAwCis3Njc0IDAgMTQ2NzAwMAorODQ1OCAwIDE1MDAwMDAKKzU4OTkgMCAxNTMzMDAwCis4MjU5IDAgMTU2NzAwMAorNzk2MyAwIDE2MDAwMDAKKzE0Nzc5IDAgMTYzMzAwMAorNjg3NyAwIDE2NjcwMDAKKzcyNjggMCAxNzAwMDAwCis4NTI2IDAgMTczMzAwMAorODQ2NyAwIDE3NjcwMDAKKzExMjAwIDAgMTgwMDAwMAorNzI2MSAwIDE4MzMwMDAKKzgyODAgMCAxODY3MDAwCis2NzE4IDAgMTkwMDAwMAorMTc3NDIgMCAxOTMzMDAwCis1MjA2IDAgMTk2NzAwMAorNTcwMCAwIDIwMDAwMDAKKzU4NzIgMCAyMDMzMDAwCis3OTE1IDAgMjA2NzAwMAorODQ5MyAwIDIxMDAwMDAKKzY1NDUgMCAyMTMzMDAwCis5MDcyIDAgMjE2NzAwMAorMTMyMDAgMCAyMjAwMDAwCis5NjMyIDAgMjIzMzAwMAorMTAwMTYgMCAyMjY3MDAwCis3ODI0IDAgMjMwMDAwMAorMTA2MjggMCAyMzMzMDAwCisxMDQwMSAwIDIzNjcwMDAKKzEwODkyIDAgMjQwMDAwMAorOTAyMyAwIDI0MzMwMDAKKzEwNzM0IDAgMjQ2NzAwMAorMTUwNDUgMCAyNTAwMDAwCis3OTQwIDAgMjUzMzAwMAorOTY1NyAwIDI1NjcwMDAKKzg3NDMgMCAyNjAwMDAwCis4MDc0IDAgMjYzMzAwMAorOTQ0NSAwIDI2NjcwMDAKKzY0OTQgMCAyNzAwMDAwCis4NjAxIDAgMjczMzAwMAorMTM0NzggMCAyNzY3MDAwCis2OTQyIDAgMjgwMDAwMAorODAwMiAwIDI4MzMwMDAKKzc5NDAgMCAyODY3MDAwCis4MzIwIDAgMjkwMDAwMAorMTIyMTUgMCAyOTMzMDAwCis2NjY4IDAgMjk2NzAwMAorMTEzODQgMCAzMDAwMDAwCis4Mzc4IDAgMzAzMzAwMAorMTI5MDggMCAzMDY3MDAwCis4NDIwIDAgMzEwMDAwMAorNzUwMiAwIDMxMzMwMDAKKzg0ODIgMCAzMTY3MDAwCisxMDk2OCAwIDMyMDAwMDAKKzEyMzM4IDAgMzIzMzAwMAorODY1NyAwIDMyNjcwMDAKKzEwNDY4IDAgMzMwMDAwMAorMTM4NzggMCAzMzMzMDAwCis5Mzc0IDAgMzM2NzAwMAorOTg1NyAwIDM0MDAwMDAKKzEwMzgxIDAgMzQzMzAwMAorOTk4NCAwIDM0NjcwMDAKKzk5NTYgMCAzNTAwMDAwCis4OTA1IDAgMzUzMzAwMAorODY3MiAwIDM1NjcwMDAKKzgxMjIgMCAzNjAwMDAwCis5Njc3IDAgMzYzMzAwMAorOTgxMiAwIDM2NjcwMDAKKzk2MjIgMCAzNzAwMDAwCis5MDIzIDAgMzczMzAwMAorNzE0NyAwIDM3NjcwMDAKKzkxNDYgMCAzODAwMDAwCis3NDg4IDAgMzgzMzAwMAorMTA4MTIgMCAzODY3MDAwCis4MzQwIDAgMzkwMDAwMAorMTMyODAgMCAzOTMzMDAwCis1MTY3IDAgMzk2NzAwMAorNjk5MSAwIDQwMDAwMDAKKzY1NDMgMCA0MDMzMDAwCis1OTUyIDAgNDA2NzAwMAorNTE2NCAwIDQxMDAwMDAKKzQwMTEgMCA0MTMzMDAwCiszNzk0IDAgNDE2NzAwMAorMTI5NTkgMCA0MjAwMDAwCis3MTAyMCAxIDQyMzMwMDAKKzUzNTEgMCA0MjY3MDAwCis2MjgzIDAgNDMwMDAwMAorNTA4MCAwIDQzMzMwMDAKKzY3MDcgMCA0MzY3MDAwCis1ODU3IDAgNDQwMDAwMAorNTIyMSAwIDQ0MzMwMDAKKzEwOTcyIDAgNDQ2NzAwMAorNzAyMyAwIDQ1MDAwMDAKKzY5MDcgMCA0NTMzMDAwCis3ODUxIDAgNDU2NzAwMAorNDg0MyAwIDQ2MDAwMDAKKzYwODUgMCA0NjMzMDAwCis0ODY4IDAgNDY2NzAwMAorNTA5MyAwIDQ3MDAwMDAKKzEyODA3IDAgNDczMzAwMAorNjMzMCAwIDQ3NjcwMDAKKzQyMDkgMCA0ODAwMDAwCis0NTk2IDAgNDgzMzAwMAorNjMxNiAwIDQ4NjcwMDAKKzQ5NTQgMCA0OTAwMDAwCis1NTMzIDAgNDkzMzAwMAorNzc0OSAwIDQ5NjcwMDAKKzEyNDg2IDAgNTAwMDAwMAorNTQ2OCAwIDUwMzMwMDAKKzQzNTMgMCA1MDY3MDAwCis1Nzg2IDAgNTEwMDAwMAorNTU1MSAwIDUxMzMwMDAKKzY3MTEgMCA1MTY3MDAwCis1Njg4IDAgNTIwMDAwMAorNjI1OCAwIDUyMzMwMDAKKzEyOTc1IDAgNTI2NzAwMAorNDg3MyAwIDUzMDAwMDAKKzQ1NTIgMCA1MzMzMDAwCis0ODQ0IDAgNTM2NzAwMAorNDc3NCAwIDU0MDAwMDAKKzUwMjUgMCA1NDMzMDAwCis1MjA0IDAgNTQ2NzAwMAorNDgxNCAwIDU1MDAwMDAKKzE0ODM1IDAgNTUzMzAwMAorNTM0MyAwIDU1NjcwMDAKKzQ4MDggMCA1NjAwMDAwCis1MDcxIDAgNTYzMzAwMAorNjMyNCAwIDU2NjcwMDAKKzUyNDMgMCA1NzAwMDAwCis0OTk1IDAgNTczMzAwMAorNTEzNCAwIDU3NjcwMDAKKzExMDU0IDAgNTgwMDAwMAorNDgwNyAwIDU4MzMwMDAKKzUxMTggMCA1ODY3MDAwCis2NDI0IDAgNTkwMDAwMAorNDk4NCAwIDU5MzMwMDAKKzcxODcgMCA1OTY3MDAwCis1NTA1IDAgNjAwMDAwMAorNjk0MSAwIDYwMzMwMDAKKzExNTE3IDAgNjA2NzAwMAorNTY0NiAwIDYxMDAwMDAKKzY4MzIgMCA2MTMzMDAwCis1Mjk0IDAgNjE2NzAwMAorNjIwMCAwIDYyMDAwMDAKKzYzMjggMCA2MjMzMDAwCis0MzQ4IDAgNjI2NzAwMAorNDYwNyAwIDYzMDAwMDAKKzEyOTU4IDAgNjMzMzAwMAorNDMwOCAwIDYzNjcwMDAKKzYwODQgMCA2NDAwMDAwCis0NDk0IDAgNjQzMzAwMAorNTMzOCAwIDY0NjcwMDAKKzU3NDIgMCA2NTAwMDAwCis1NDcyIDAgNjUzMzAwMAorODQ1OSAwIDY1NjcwMDAKKzEzMDc1IDAgNjYwMDAwMAorODk4NiAwIDY2MzMwMDAKKzk1ODMgMCA2NjY3MDAwCis4NzkyIDAgNjcwMDAwMAorOTAwNCAwIDY3MzMwMDAKKzk2MzIgMCA2NzY3MDAwCis5MzkzIDAgNjgwMDAwMAorOTI1OSAwIDY4MzMwMDAKKzExOTI3IDAgNjg2NzAwMAorMTAzMjMgMCA2OTAwMDAwCisxNTI0OCAwIDY5MzMwMDAKKzExMjQ0IDAgNjk2NzAwMAorMTU1NTggMCA3MDAwMDAwCis2MTk3IDAgNzAzMzAwMAorODA0NCAwIDcwNjcwMDAKKzExNDMyIDAgNzEwMDAwMAorODczNyAwIDcxMzMwMDAKKzEzODg1IDAgNzE2NzAwMAorMTExNTggMCA3MjAwMDAwCisxNTE1MiAwIDcyMzMwMDAKKzcwMjUgMCA3MjY3MDAwCis4MDI1IDAgNzMwMDAwMAorMTMzNjIgMCA3MzMzMDAwCis4MDkwIDAgNzM2NzAwMAorMTM2MzcgMCA3NDAwMDAwCis2MTQ4IDAgNzQzMzAwMAorOTI3MCAwIDc0NjcwMDAKKzg2MzMgMCA3NTAwMDAwCisxMDY3MyAwIDc1MzMwMDAKKzE0MjA4IDAgNzU2NzAwMAorODA4NCAwIDc2MDAwMDAKKzEzNzgzIDAgNzYzMzAwMAorMTA2NjAgMCA3NjY3MDAwCis3NDY2IDAgNzcwMDAwMAorMTQ0MzMgMCA3NzMzMDAwCisxMDkzNCAwIDc3NjcwMDAKKzcyMzkgMCA3ODAwMDAwCisxMjU0OCAwIDc4MzMwMDAKKzY1NjQgMCA3ODY3MDAwCisxMDc2MSAwIDc5MDAwMDAKKzEwOTkyIDAgNzkzMzAwMAorMTI5MjQgMCA3OTY3MDAwCisxMjM0OCAwIDgwMDAwMDAKKzY3NzAgMCA4MDMzMDAwCisxNDI4OCAwIDgwNjcwMDAKKzI5MzQ1IDEgODEwMDAwMAorMTgyMiAwIDgxMzMwMDAKKzEwODcgMCA4MTY3MDAwCisxMTA5IDAgODIwMDAwMAorMjAwNyAwIDgyMzMwMDAKKzE3OTggMCA4MjY3MDAwCisxNjM1IDAgODMwMDAwMAorMTk2MDcgMCA4MzMzMDAwCis5MTkgMCA4MzY3MDAwCisyMzU3IDAgODQwMDAwMAorMzU3OCAwIDg0MzMwMDAKKzQ0OTcgMCA4NDY3MDAwCis0MzE0IDAgODUwMDAwMAorMzg1MSAwIDg1MzMwMDAKKzM4MjIgMCA4NTY3MDAwCis0MjUyIDAgODYwMDAwMAorNDc3NSAwIDg2MzMwMDAKKzEyMjAzIDAgODY2NzAwMAorNTA3OCAwIDg3MDAwMDAKKzU4NzYgMCA4NzMzMDAwCis2MTI0IDAgODc2NzAwMAorNDQ5MCAwIDg4MDAwMDAKKzM1MzggMCA4ODMzMDAwCiszNDUwIDAgODg2NzAwMAorMzYxMSAwIDg5MDAwMDAKKzI4NDcgMCA4OTMzMDAwCisyNjA1IDAgODk2NzAwMAorMTIyNDMgMCA5MDAwMDAwCisxOTQ2IDAgOTAzMzAwMAorMTg0NyAwIDkwNjcwMDAKKzIwMzUgMCA5MTAwMDAwCisyNTcyIDAgOTEzMzAwMAorMjMyNiAwIDkxNjcwMDAKKzI2NDUgMCA5MjAwMDAwCisyOTM4IDAgOTIzMzAwMAorMjQ5NSAwIDkyNjcwMDAKKzI2MDkgMCA5MzAwMDAwCis5NzQ0IDAgOTMzMzAwMAorMTc5NiAwIDkzNjcwMDAKKzE5ODUgMCA5NDAwMDAwCisxNzU5IDAgOTQzMzAwMAorMjI1OSAwIDk0NjcwMDAKKzIyMzMgMCA5NTAwMDAwCisyMDQ0IDAgOTUzMzAwMAorMjUwMiAwIDk1NjcwMDAKKzIzMDcgMCA5NjAwMDAwCisyNzM5IDAgOTYzMzAwMAorMTE3MDcgMCA5NjY3MDAwCis1MTY4IDAgOTcwMDAwMAorNDQ4MyAwIDk3MzMwMDAKKzMwNDQgMCA5NzY3MDAwCis0MjQxIDAgOTgwMDAwMAorNDM5MiAwIDk4MzMwMDAKKzQ5MzQgMCA5ODY3MDAwCis1OTM0IDAgOTkwMDAwMAorNTY0NyAwIDk5MzMwMDAKKzUzMjYgMCA5OTY3MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjNDYwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExYTAzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACis2OTM5IDEgMAorNjgxOCAwIDE3MDAwCiszMTAgMCAzMzAwMAorMjczIDAgNTAwMDAKKzI2NyAwIDY3MDAwCisyMzkgMCA4MzAwMAorMjMyIDAgMTAwMDAwCisyMjIgMCAxMTcwMDAKKzE4NiAwIDEzMzAwMAorMTk0IDAgMTUwMDAwCisxODkgMCAxNjcwMDAKKzE4IDAgMTgzMDAwCisyMDE0IDAgMjAwMDAwCisyOTcgMCAyMTcwMDAKKzI4NyAwIDIzMzAwMAorMjM3IDAgMjUwMDAwCisyNjMgMCAyNjcwMDAKKzIzOCAwIDI4MzAwMAorMjU3IDAgMzAwMDAwCisyMjkgMCAzMTcwMDAKKzE4NyAwIDMzMzAwMAorMTkxIDAgMzUwMDAwCisxOCAwIDM2NzAwMAorMjIwMyAwIDM4MzAwMAorMjY1IDAgNDAwMDAwCisyMjQgMCA0MTcwMDAKKzI1NCAwIDQzMzAwMAorMjUyIDAgNDUwMDAwCisyNzMgMCA0NjcwMDAKKzIwOCAwIDQ4MzAwMAorMTU0IDAgNTAwMDAwCisxODIgMCA1MTcwMDAKKzEzOCAwIDUzMzAwMAorMTggMCA1NTAwMDAKKzI1MDIgMCA1NjcwMDAKKzI4NiAwIDU4MzAwMAorMzA0IDAgNjAwMDAwCiszNDEgMCA2MTcwMDAKKzI1OSAwIDYzMzAwMAorMjc1IDAgNjUwMDAwCisyMjIgMCA2NjcwMDAKKzI1NCAwIDY4MzAwMAorMjUzIDAgNzAwMDAwCisyMjUgMCA3MTcwMDAKKzE4IDAgNzMzMDAwCisyNTAxIDAgNzUwMDAwCisyODIgMCA3NjcwMDAKKzI5OCAwIDc4MzAwMAorMjUyIDAgODAwMDAwCisyNDIgMCA4MTcwMDAKKzI1MCAwIDgzMzAwMAorMjYwIDAgODUwMDAwCisyMTggMCA4NjcwMDAKKzIxMyAwIDg4MzAwMAorMTQ0IDAgOTAwMDAwCisxOCAwIDkxNzAwMAorMjMzIDAgOTMzMDAwCisyNTQgMCA5NTAwMDAKKzIyOSAwIDk2NzAwMAorMjM5IDAgOTgzMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MzNjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmU5Njc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMCBAQAorNTQ5MTggMSAwCis0NjI4MCAwIDMzMDAwCisyMDA2IDAgNjcwMDAKKzI4NDEgMCAxMDAwMDAKKzMwNDQgMCAxMzMwMDAKKzM0MjkgMCAxNjcwMDAKKzMxOTYgMCAyMDAwMDAKKzI5MjYgMCAyMzMwMDAKKzI4MjEgMCAyNjcwMDAKKzExNTAgMCAzMDAwMDAKKzM2IDAgMzMzMDAwCiszODA4NCAwIDM2NzAwMAorMzY4OSAwIDQwMDAwMAorMzQ3MyAwIDQzMzAwMAorMzAxMSAwIDQ2NzAwMAorMzA5MCAwIDUwMDAwMAorMjUxNiAwIDUzMzAwMAorMjc3MSAwIDU2NzAwMAorMzI1MCAwIDYwMDAwMAorMTE1OSAwIDYzMzAwMAorMzQgMCA2NjcwMDAKKzM5NjkwIDAgNzAwMDAwCiszNjE1IDAgNzMzMDAwCisyNDk0IDAgNzY3MDAwCisyODkzIDAgODAwMDAwCiszMzI5IDAgODMzMDAwCisyOTM5IDAgODY3MDAwCisyMzUyIDAgOTAwMDAwCisyNzMyIDAgOTMzMDAwCisxNzQ2IDAgOTY3MDAwCiszMyAwIDEwMDAwMDAKKzQxNTAxIDAgMTAzMzAwMAorMjk5NyAwIDEwNjcwMDAKKzI2NjYgMCAxMTAwMDAwCiszNTgyIDAgMTEzMzAwMAorMjYxNiAwIDExNjcwMDAKKzI5MjMgMCAxMjAwMDAwCisyNjk2IDAgMTIzMzAwMAorMTYyOCAwIDEyNjcwMDAKKzE4ODcgMCAxMzAwMDAwCiszMyAwIDEzMzMwMDAKKzQyODc2IDAgMTM2NzAwMAorMjU4OCAwIDE0MDAwMDAKKzMzMTYgMCAxNDMzMDAwCisyMjg3IDAgMTQ2NzAwMAorMzM3NSAwIDE1MDAwMDAKKzIxMDggMCAxNTMzMDAwCisyOTYxIDAgMTU2NzAwMAorMTczMCAwIDE2MDAwMDAKKzE4MDAgMCAxNjMzMDAwCiszNCAwIDE2NjcwMDAKKzQzNzk3IDAgMTcwMDAwMAorMjQ4NCAwIDE3MzMwMDAKKzI1NTYgMCAxNzY3MDAwCisyNjcxIDAgMTgwMDAwMAorMjMzOCAwIDE4MzMwMDAKKzMxMzMgMCAxODY3MDAwCisyMDAyIDAgMTkwMDAwMAorMTc5NCAwIDE5MzMwMDAKKzEyNzkgMCAxOTY3MDAwCiszMiAwIDIwMDAwMDAKKzQyNjQyIDAgMjAzMzAwMAorMjY4NiAwIDIwNjcwMDAKKzIyMDIgMCAyMTAwMDAwCisyMTQ1IDAgMjEzMzAwMAorMjU2NiAwIDIxNjcwMDAKKzIxOTAgMCAyMjAwMDAwCisxNTgwIDAgMjIzMzAwMAorMTcxMSAwIDIyNjcwMDAKKzY0OCAwIDIzMDAwMDAKKzMyIDAgMjMzMzAwMAorNDA0MDkgMCAyMzY3MDAwCisyNjI4IDAgMjQwMDAwMAorMTk3MyAwIDI0MzMwMDAKKzIzNjAgMCAyNDY3MDAwCiszMDQzIDAgMjUwMDAwMAorMTczMCAwIDI1MzMwMDAKKzE0NTYgMCAyNTY3MDAwCisyMzEyIDAgMjYwMDAwMAorMzY5IDAgMjYzMzAwMAorMzIgMCAyNjY3MDAwCis0MTM5MSAwIDI3MDAwMDAKKzI5NjcgMCAyNzMzMDAwCisyNDU0IDAgMjc2NzAwMAorMTgyNSAwIDI4MDAwMDAKKzE4NTMgMCAyODMzMDAwCisxNzQ2IDAgMjg2NzAwMAorMjM0NyAwIDI5MDAwMDAKKzEzNjIgMCAyOTMzMDAwCis0NDEgMCAyOTY3MDAwCiszNCAwIDMwMDAwMDAKKzQyNTAzIDAgMzAzMzAwMAorMTg3NyAwIDMwNjcwMDAKKzE2OTAgMCAzMTAwMDAwCisxMzY3IDAgMzEzMzAwMAorMTUyMCAwIDMxNjcwMDAKKzEyNDAgMCAzMjAwMDAwCisxMDk0IDAgMzIzMzAwMAorNzM5IDAgMzI2NzAwMAorMzkyIDAgMzMwMDAwMAorMzMgMCAzMzMzMDAwCiszNTEwNCAwIDMzNjcwMDAKKzE0NjMgMCAzNDAwMDAwCisyMDI5IDAgMzQzMzAwMAorMTYyNiAwIDM0NjcwMDAKKzE5NTYgMCAzNTAwMDAwCis3OTkgMCAzNTMzMDAwCis1NTYgMCAzNTY3MDAwCis1ODQgMCAzNjAwMDAwCisxOTEgMCAzNjMzMDAwCiszNiAwIDM2NjcwMDAKKzM3NjUyIDAgMzcwMDAwMAorODYyIDAgMzczMzAwMAorNTI0IDAgMzc2NzAwMAorNjQxIDAgMzgwMDAwMAorNTg0IDAgMzgzMzAwMAorMzYwIDAgMzg2NzAwMAorMzY1IDAgMzkwMDAwMAorMzYxIDAgMzkzMzAwMAorMTU0IDAgMzk2NzAwMAorMzYgMCA0MDAwMDAwCisxMjU3NDAgMCA0MDMzMDAwCiszMzIgMCA0MDY3MDAwCiszODEgMCA0MTAwMDAwCis0MjAgMCA0MTMzMDAwCis0NjQgMCA0MTY3MDAwCisyODggMCA0MjAwMDAwCisyNjYwIDAgNDIzMzAwMAorMTI3NTY0IDEgNDI2NzAwMAorMzA2OTYgMCA0MzAwMDAwCiszNDIzIDAgNDMzMzAwMAorMzMxMCAwIDQzNjcwMDAKKzM1MTMgMCA0NDAwMDAwCiszNzM1IDAgNDQzMzAwMAorMzM1OCAwIDQ0NjcwMDAKKzMxMDggMCA0NTAwMDAwCisyODAwIDAgNDUzMzAwMAorMTc1MSAwIDQ1NjcwMDAKKzQxIDAgNDYwMDAwMAorMzk4NjIgMCA0NjMzMDAwCiszNzM5IDAgNDY2NzAwMAorMzc1NSAwIDQ3MDAwMDAKKzM0MDggMCA0NzMzMDAwCiszNzgzIDAgNDc2NzAwMAorMzQyMyAwIDQ4MDAwMDAKKzI4MDEgMCA0ODMzMDAwCisyNTQ5IDAgNDg2NzAwMAorMTQ2MSAwIDQ5MDAwMDAKKzQwIDAgNDkzMzAwMAorNDE2NjcgMCA0OTY3MDAwCiszNjIzIDAgNTAwMDAwMAorMzM1NiAwIDUwMzMwMDAKKzM0MjQgMCA1MDY3MDAwCiszNTQ4IDAgNTEwMDAwMAorMzExOSAwIDUxMzMwMDAKKzI5MDUgMCA1MTY3MDAwCisyNzcyIDAgNTIwMDAwMAorMTYyMyAwIDUyMzMwMDAKKzQzIDAgNTI2NzAwMAorNDY3ODMgMCA1MzAwMDAwCiszNDYyIDAgNTMzMzAwMAorMzQ3MCAwIDUzNjcwMDAKKzM2NzcgMCA1NDAwMDAwCiszNjg0IDAgNTQzMzAwMAorMzI2NiAwIDU0NjcwMDAKKzMxMjcgMCA1NTAwMDAwCisyODA5IDAgNTUzMzAwMAorMTc1MCAwIDU1NjcwMDAKKzQwIDAgNTYwMDAwMAorNDYyMTUgMCA1NjMzMDAwCiszNTk5IDAgNTY2NzAwMAorMzU1OCAwIDU3MDAwMDAKKzM1NDQgMCA1NzMzMDAwCiszNjMyIDAgNTc2NzAwMAorMzU0OCAwIDU4MDAwMDAKKzI5NjggMCA1ODMzMDAwCisyNzE1IDAgNTg2NzAwMAorMTcyOSAwIDU5MDAwMDAKKzQxIDAgNTkzMzAwMAorNDU5NTggMCA1OTY3MDAwCiszNzc2IDAgNjAwMDAwMAorMzUyNSAwIDYwMzMwMDAKKzM2NDQgMCA2MDY3MDAwCiszNzg2IDAgNjEwMDAwMAorMzIyMiAwIDYxMzMwMDAKKzI5MjMgMCA2MTY3MDAwCisyNzUyIDAgNjIwMDAwMAorMTU5MiAwIDYyMzMwMDAKKzQxIDAgNjI2NzAwMAorNDYwMzEgMCA2MzAwMDAwCiszNTIwIDAgNjMzMzAwMAorMzM4MCAwIDYzNjcwMDAKKzMzNzEgMCA2NDAwMDAwCiszNDI3IDAgNjQzMzAwMAorMzEzNSAwIDY0NjcwMDAKKzI5ODggMCA2NTAwMDAwCisyNzMwIDAgNjUzMzAwMAorMTY3MSAwIDY1NjcwMDAKKzQxIDAgNjYwMDAwMAorNDU4NDYgMCA2NjMzMDAwCiszNTM1IDAgNjY2NzAwMAorMzUwNyAwIDY3MDAwMDAKKzM0MjkgMCA2NzMzMDAwCiszNDkxIDAgNjc2NzAwMAorMzMyNSAwIDY4MDAwMDAKKzI5NzkgMCA2ODMzMDAwCisyODAwIDAgNjg2NzAwMAorMTYxMCAwIDY5MDAwMDAKKzQwIDAgNjkzMzAwMAorNDU5NTggMCA2OTY3MDAwCiszNzYyIDAgNzAwMDAwMAorMzI1NCAwIDcwMzMwMDAKKzM0MDggMCA3MDY3MDAwCiszODYwIDAgNzEwMDAwMAorMzE5OCAwIDcxMzMwMDAKKzI5NjYgMCA3MTY3MDAwCisyODgyIDAgNzIwMDAwMAorMTc2MyAwIDcyMzMwMDAKKzQyIDAgNzI2NzAwMAorNDYxMzAgMCA3MzAwMDAwCiszNTkzIDAgNzMzMzAwMAorMzUyMyAwIDczNjcwMDAKKzM5MzkgMCA3NDAwMDAwCiszOTgwIDAgNzQzMzAwMAorMzQ3MCAwIDc0NjcwMDAKKzMxOTEgMCA3NTAwMDAwCisyOTY5IDAgNzUzMzAwMAorMTc0MCAwIDc1NjcwMDAKKzQxIDAgNzYwMDAwMAorNDYzMDAgMCA3NjMzMDAwCiszNzM5IDAgNzY2NzAwMAorMzc4MSAwIDc3MDAwMDAKKzM5NjQgMCA3NzMzMDAwCis0MDIzIDAgNzc2NzAwMAorMzQ4MCAwIDc4MDAwMDAKKzMwNjUgMCA3ODMzMDAwCisyOTM0IDAgNzg2NzAwMAorMTgwNSAwIDc5MDAwMDAKKzQyIDAgNzkzMzAwMAorMzgxNjYgMCA3OTY3MDAwCis0MDYyIDAgODAwMDAwMAorMzg0NCAwIDgwMzMwMDAKKzQ1NDcgMCA4MDY3MDAwCis5MzQgMCA4MTAwMDAwCiszNjUgMCA4MTMzMDAwCisxODEgMCA4MTY3MDAwCis0NjMgMCA4MjAwMDAwCis0MTkgMCA4MjMzMDAwCiszOCAwIDgyNjcwMDAKKzk3MDIgMCA4MzAwMDAwCiszNDQgMCA4MzMzMDAwCisyNzYgMCA4MzY3MDAwCisxMzUwIDAgODQwMDAwMAorMTcwMyAwIDg0MzMwMDAKKzE4NDMgMCA4NDY3MDAwCisxMjI4IDAgODUwMDAwMAorMzU1ODAgMSA4NTMzMDAwCisyNzQ1OCAwIDg1NjcwMDAKKzIxNDQgMCA4NjAwMDAwCisyNDgyIDAgODYzMzAwMAorMjAwNCAwIDg2NjcwMDAKKzI4MjIgMCA4NzAwMDAwCisyNTcwIDAgODczMzAwMAorMTcyNiAwIDg3NjcwMDAKKzEyNDggMCA4ODAwMDAwCis4NDQgMCA4ODMzMDAwCiszNSAwIDg4NjcwMDAKKzE0MjA3IDAgODkwMDAwMAorMTAzNyAwIDg5MzMwMDAKKzc0OSAwIDg5NjcwMDAKKzgyOSAwIDkwMDAwMDAKKzkxNSAwIDkwMzMwMDAKKzY4NSAwIDkwNjcwMDAKKzc2NyAwIDkxMDAwMDAKKzc5OCAwIDkxMzMwMDAKKzM0MiAwIDkxNjcwMDAKKzMxIDAgOTIwMDAwMAorMTI1OTAgMCA5MjMzMDAwCis5MjMgMCA5MjY3MDAwCis4MTkgMCA5MzAwMDAwCis3NzYgMCA5MzMzMDAwCis4NjMgMCA5MzY3MDAwCis3MjkgMCA5NDAwMDAwCis0NzEgMCA5NDMzMDAwCis2MzggMCA5NDY3MDAwCisyNzYgMCA5NTAwMDAwCiszOCAwIDk1MzMwMDAKKzE3MjcyIDAgOTU2NzAwMAorODU2IDAgOTYwMDAwMAorMTE1OCAwIDk2MzMwMDAKKzIxNzIgMCA5NjY3MDAwCisyNzUxIDAgOTcwMDAwMAorMjE0MiAwIDk3MzMwMDAKKzEyNjcgMCA5NzY3MDAwCisxOTY1IDAgOTgwMDAwMAorMTUxMCAwIDk4MzMwMDAKKzM0IDAgOTg2NzAwMAorMjY5MiAwIDk5MDAwMDAKKzI3NzggMCA5OTMzMDAwCisyNTg1IDAgOTk2NzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTIwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYWYyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzZlODEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8KQEAgLTAsMCArMSw4MzMgQEAKKzMyIDEgMAorMzIgMSAyMDAwMAorMzIgMSA0MDAwMAorMzIgMSA2MDAwMAorMzIgMSA4MDAwMAorMzIgMSAxMDAwMDAKKzMyIDEgMTIwMDAwCiszMiAxIDE0MDAwMAorMzIgMSAxNjAwMDAKKzMyIDEgMTgwMDAwCiszMiAxIDIwMDAwMAorMzIgMSAyMjAwMDAKKzMyIDEgMjQwMDAwCiszMiAxIDI2MDAwMAorMzIgMSAyODAwMDAKKzMyIDEgMzAwMDAwCiszMiAxIDMyMDAwMAorMzIgMSAzNDAwMDAKKzMyIDEgMzYwMDAwCiszMiAxIDM4MDAwMAorMzIgMSA0MDAwMDAKKzMyIDEgNDIwMDAwCiszMiAxIDQ0MDAwMAorMzIgMSA0NjAwMDAKKzMyIDEgNDgwMDAwCiszMiAxIDUwMDAwMAorMzIgMSA1MjAwMDAKKzMyIDEgNTQwMDAwCiszMiAxIDU2MDAwMAorMzIgMSA1ODAwMDAKKzMyIDEgNjAwMDAwCiszMiAxIDYyMDAwMAorMzIgMSA2NDAwMDAKKzMyIDEgNjYwMDAwCiszMiAxIDY4MDAwMAorMzIgMSA3MDAwMDAKKzMyIDEgNzIwMDAwCiszMiAxIDc0MDAwMAorMzIgMSA3NjAwMDAKKzMyIDEgNzgwMDAwCiszMiAxIDgwMDAwMAorMzIgMSA4MjAwMDAKKzMyIDEgODQwMDAwCiszMiAxIDg2MDAwMAorMzIgMSA4ODAwMDAKKzMyIDEgOTAwMDAwCiszMiAxIDkyMDAwMAorMzIgMSA5NDAwMDAKKzMyIDEgOTYwMDAwCiszMiAxIDk4MDAwMAorMzIgMSAxMDAwMDAwCiszMiAxIDEwMjAwMDAKKzMyIDEgMTA0MDAwMAorMzIgMSAxMDYwMDAwCiszMiAxIDEwODAwMDAKKzMyIDEgMTEwMDAwMAorMzIgMSAxMTIwMDAwCiszMiAxIDExNDAwMDAKKzMyIDEgMTE2MDAwMAorMzIgMSAxMTgwMDAwCiszMiAxIDEyMDAwMDAKKzMyIDEgMTIyMDAwMAorMzIgMSAxMjQwMDAwCiszMiAxIDEyNjAwMDAKKzMyIDEgMTI4MDAwMAorMzIgMSAxMzAwMDAwCiszMiAxIDEzMjAwMDAKKzMyIDEgMTM0MDAwMAorMzIgMSAxMzYwMDAwCiszMiAxIDEzODAwMDAKKzMyIDEgMTQwMDAwMAorMzIgMSAxNDIwMDAwCiszMiAxIDE0NDAwMDAKKzMyIDEgMTQ2MDAwMAorMzIgMSAxNDgwMDAwCiszMiAxIDE1MDAwMDAKKzMyIDEgMTUyMDAwMAorMzIgMSAxNTQwMDAwCiszMiAxIDE1NjAwMDAKKzMyIDEgMTU4MDAwMAorMzIgMSAxNjAwMDAwCiszMiAxIDE2MjAwMDAKKzMyIDEgMTY0MDAwMAorMzIgMSAxNjYwMDAwCiszMiAxIDE2ODAwMDAKKzMyIDEgMTcwMDAwMAorMzIgMSAxNzIwMDAwCiszMiAxIDE3NDAwMDAKKzMyIDEgMTc2MDAwMAorMzIgMSAxNzgwMDAwCiszMiAxIDE4MDAwMDAKKzMyIDEgMTgyMDAwMAorMzIgMSAxODQwMDAwCiszMiAxIDE4NjAwMDAKKzMyIDEgMTg4MDAwMAorMzIgMSAxOTAwMDAwCiszMiAxIDE5MjAwMDAKKzMyIDEgMTk0MDAwMAorMzIgMSAxOTYwMDAwCiszMiAxIDE5ODAwMDAKKzMyIDEgMjAwMDAwMAorMzIgMSAyMDIwMDAwCiszMiAxIDIwNDAwMDAKKzMyIDEgMjA2MDAwMAorMzIgMSAyMDgwMDAwCiszMiAxIDIxMDAwMDAKKzMyIDEgMjEyMDAwMAorMzIgMSAyMTQwMDAwCiszMiAxIDIxNjAwMDAKKzMyIDEgMjE4MDAwMAorMzIgMSAyMjAwMDAwCiszMiAxIDIyMjAwMDAKKzMyIDEgMjI0MDAwMAorMzIgMSAyMjYwMDAwCiszMiAxIDIyODAwMDAKKzMyIDEgMjMwMDAwMAorMzIgMSAyMzIwMDAwCiszMiAxIDIzNDAwMDAKKzMyIDEgMjM2MDAwMAorMzIgMSAyMzgwMDAwCiszMiAxIDI0MDAwMDAKKzMyIDEgMjQyMDAwMAorMzIgMSAyNDQwMDAwCiszMiAxIDI0NjAwMDAKKzMyIDEgMjQ4MDAwMAorMzIgMSAyNTAwMDAwCiszMiAxIDI1MjAwMDAKKzMyIDEgMjU0MDAwMAorMzIgMSAyNTYwMDAwCiszMiAxIDI1ODAwMDAKKzMyIDEgMjYwMDAwMAorMzIgMSAyNjIwMDAwCiszMiAxIDI2NDAwMDAKKzMyIDEgMjY2MDAwMAorMzIgMSAyNjgwMDAwCiszMiAxIDI3MDAwMDAKKzMyIDEgMjcyMDAwMAorMzIgMSAyNzQwMDAwCiszMiAxIDI3NjAwMDAKKzMyIDEgMjc4MDAwMAorMzIgMSAyODAwMDAwCiszMiAxIDI4MjAwMDAKKzMyIDEgMjg0MDAwMAorMzIgMSAyODYwMDAwCiszMiAxIDI4ODAwMDAKKzMyIDEgMjkwMDAwMAorMzIgMSAyOTIwMDAwCiszMiAxIDI5NDAwMDAKKzMyIDEgMjk2MDAwMAorMzIgMSAyOTgwMDAwCiszMiAxIDMwMDAwMDAKKzMyIDEgMzAyMDAwMAorMzIgMSAzMDQwMDAwCiszMiAxIDMwNjAwMDAKKzMyIDEgMzA4MDAwMAorMzIgMSAzMTAwMDAwCiszMiAxIDMxMjAwMDAKKzMyIDEgMzE0MDAwMAorMzIgMSAzMTYwMDAwCiszMiAxIDMxODAwMDAKKzMyIDEgMzIwMDAwMAorMzIgMSAzMjIwMDAwCiszMiAxIDMyNDAwMDAKKzMyIDEgMzI2MDAwMAorMzIgMSAzMjgwMDAwCiszMiAxIDMzMDAwMDAKKzMyIDEgMzMyMDAwMAorMzIgMSAzMzQwMDAwCiszMiAxIDMzNjAwMDAKKzMyIDEgMzM4MDAwMAorMzIgMSAzNDAwMDAwCiszMiAxIDM0MjAwMDAKKzMyIDEgMzQ0MDAwMAorMzIgMSAzNDYwMDAwCiszMiAxIDM0ODAwMDAKKzMyIDEgMzUwMDAwMAorMzIgMSAzNTIwMDAwCiszMiAxIDM1NDAwMDAKKzMyIDEgMzU2MDAwMAorMzIgMSAzNTgwMDAwCiszMiAxIDM2MDAwMDAKKzMyIDEgMzYyMDAwMAorMzIgMSAzNjQwMDAwCiszMiAxIDM2NjAwMDAKKzMyIDEgMzY4MDAwMAorMzIgMSAzNzAwMDAwCiszMiAxIDM3MjAwMDAKKzMyIDEgMzc0MDAwMAorMzIgMSAzNzYwMDAwCiszMiAxIDM3ODAwMDAKKzMyIDEgMzgwMDAwMAorMzIgMSAzODIwMDAwCiszMiAxIDM4NDAwMDAKKzMyIDEgMzg2MDAwMAorMzIgMSAzODgwMDAwCiszMiAxIDM5MDAwMDAKKzMyIDEgMzkyMDAwMAorMzIgMSAzOTQwMDAwCiszMiAxIDM5NjAwMDAKKzMyIDEgMzk4MDAwMAorMzIgMSA0MDAwMDAwCiszMiAxIDQwMjAwMDAKKzMyIDEgNDA0MDAwMAorMzIgMSA0MDYwMDAwCiszMiAxIDQwODAwMDAKKzMyIDEgNDEwMDAwMAorMzIgMSA0MTIwMDAwCiszMiAxIDQxNDAwMDAKKzMyIDEgNDE2MDAwMAorMzIgMSA0MTgwMDAwCiszMiAxIDQyMDAwMDAKKzMyIDEgNDIyMDAwMAorMzIgMSA0MjQwMDAwCiszMiAxIDQyNjAwMDAKKzMyIDEgNDI4MDAwMAorMzIgMSA0MzAwMDAwCiszMiAxIDQzMjAwMDAKKzMyIDEgNDM0MDAwMAorMzIgMSA0MzYwMDAwCiszMiAxIDQzODAwMDAKKzMyIDEgNDQwMDAwMAorMzIgMSA0NDIwMDAwCiszMiAxIDQ0NDAwMDAKKzMyIDEgNDQ2MDAwMAorMzIgMSA0NDgwMDAwCiszMiAxIDQ1MDAwMDAKKzMyIDEgNDUyMDAwMAorMzIgMSA0NTQwMDAwCiszMiAxIDQ1NjAwMDAKKzMyIDEgNDU4MDAwMAorMzIgMSA0NjAwMDAwCiszMiAxIDQ2MjAwMDAKKzMyIDEgNDY0MDAwMAorMzIgMSA0NjYwMDAwCiszMiAxIDQ2ODAwMDAKKzMyIDEgNDcwMDAwMAorMzIgMSA0NzIwMDAwCiszMiAxIDQ3NDAwMDAKKzMyIDEgNDc2MDAwMAorMzIgMSA0NzgwMDAwCiszMiAxIDQ4MDAwMDAKKzMyIDEgNDgyMDAwMAorMzIgMSA0ODQwMDAwCiszMiAxIDQ4NjAwMDAKKzMyIDEgNDg4MDAwMAorMzIgMSA0OTAwMDAwCiszMiAxIDQ5MjAwMDAKKzMyIDEgNDk0MDAwMAorMzIgMSA0OTYwMDAwCiszMiAxIDQ5ODAwMDAKKzMyIDEgNTAwMDAwMAorMzIgMSA1MDIwMDAwCiszMiAxIDUwNDAwMDAKKzMyIDEgNTA2MDAwMAorMzIgMSA1MDgwMDAwCiszMiAxIDUxMDAwMDAKKzMyIDEgNTEyMDAwMAorMzIgMSA1MTQwMDAwCiszMiAxIDUxNjAwMDAKKzMyIDEgNTE4MDAwMAorMzIgMSA1MjAwMDAwCiszMiAxIDUyMjAwMDAKKzMyIDEgNTI0MDAwMAorMzIgMSA1MjYwMDAwCiszMiAxIDUyODAwMDAKKzMyIDEgNTMwMDAwMAorMzIgMSA1MzIwMDAwCiszMiAxIDUzNDAwMDAKKzMyIDEgNTM2MDAwMAorMzIgMSA1MzgwMDAwCiszMiAxIDU0MDAwMDAKKzMyIDEgNTQyMDAwMAorMzIgMSA1NDQwMDAwCiszMiAxIDU0NjAwMDAKKzMyIDEgNTQ4MDAwMAorMzIgMSA1NTAwMDAwCiszMiAxIDU1MjAwMDAKKzMyIDEgNTU0MDAwMAorMzIgMSA1NTYwMDAwCiszMiAxIDU1ODAwMDAKKzMyIDEgNTYwMDAwMAorMzIgMSA1NjIwMDAwCiszMiAxIDU2NDAwMDAKKzMyIDEgNTY2MDAwMAorMzIgMSA1NjgwMDAwCiszMiAxIDU3MDAwMDAKKzMyIDEgNTcyMDAwMAorMzIgMSA1NzQwMDAwCiszMiAxIDU3NjAwMDAKKzMyIDEgNTc4MDAwMAorMzIgMSA1ODAwMDAwCiszMiAxIDU4MjAwMDAKKzMyIDEgNTg0MDAwMAorMzIgMSA1ODYwMDAwCiszMiAxIDU4ODAwMDAKKzMyIDEgNTkwMDAwMAorMzIgMSA1OTIwMDAwCiszMiAxIDU5NDAwMDAKKzMyIDEgNTk2MDAwMAorMzIgMSA1OTgwMDAwCiszMiAxIDYwMDAwMDAKKzMyIDEgNjAyMDAwMAorMzIgMSA2MDQwMDAwCiszMiAxIDYwNjAwMDAKKzMyIDEgNjA4MDAwMAorMzIgMSA2MTAwMDAwCiszMiAxIDYxMjAwMDAKKzMyIDEgNjE0MDAwMAorMzIgMSA2MTYwMDAwCiszMiAxIDYxODAwMDAKKzMyIDEgNjIwMDAwMAorMzIgMSA2MjIwMDAwCiszMiAxIDYyNDAwMDAKKzMyIDEgNjI2MDAwMAorMzIgMSA2MjgwMDAwCiszMiAxIDYzMDAwMDAKKzMyIDEgNjMyMDAwMAorMzIgMSA2MzQwMDAwCiszMiAxIDYzNjAwMDAKKzMyIDEgNjM4MDAwMAorMzIgMSA2NDAwMDAwCiszMiAxIDY0MjAwMDAKKzMyIDEgNjQ0MDAwMAorMzIgMSA2NDYwMDAwCiszMiAxIDY0ODAwMDAKKzMyIDEgNjUwMDAwMAorMzIgMSA2NTIwMDAwCiszMiAxIDY1NDAwMDAKKzMyIDEgNjU2MDAwMAorMzIgMSA2NTgwMDAwCiszMiAxIDY2MDAwMDAKKzMyIDEgNjYyMDAwMAorMzIgMSA2NjQwMDAwCiszMiAxIDY2NjAwMDAKKzMyIDEgNjY4MDAwMAorMzIgMSA2NzAwMDAwCiszMiAxIDY3MjAwMDAKKzMyIDEgNjc0MDAwMAorMzIgMSA2NzYwMDAwCiszMiAxIDY3ODAwMDAKKzMyIDEgNjgwMDAwMAorMzIgMSA2ODIwMDAwCiszMiAxIDY4NDAwMDAKKzMyIDEgNjg2MDAwMAorMzIgMSA2ODgwMDAwCiszMiAxIDY5MDAwMDAKKzMyIDEgNjkyMDAwMAorMzIgMSA2OTQwMDAwCiszMiAxIDY5NjAwMDAKKzMyIDEgNjk4MDAwMAorMzIgMSA3MDAwMDAwCiszMiAxIDcwMjAwMDAKKzMyIDEgNzA0MDAwMAorMzIgMSA3MDYwMDAwCiszMiAxIDcwODAwMDAKKzMyIDEgNzEwMDAwMAorMzIgMSA3MTIwMDAwCiszMiAxIDcxNDAwMDAKKzMyIDEgNzE2MDAwMAorMzIgMSA3MTgwMDAwCiszMiAxIDcyMDAwMDAKKzMyIDEgNzIyMDAwMAorMzIgMSA3MjQwMDAwCiszMiAxIDcyNjAwMDAKKzMyIDEgNzI4MDAwMAorMzIgMSA3MzAwMDAwCiszMiAxIDczMjAwMDAKKzMyIDEgNzM0MDAwMAorMzIgMSA3MzYwMDAwCiszMiAxIDczODAwMDAKKzMyIDEgNzQwMDAwMAorMzIgMSA3NDIwMDAwCiszMiAxIDc0NDAwMDAKKzMyIDEgNzQ2MDAwMAorMzIgMSA3NDgwMDAwCiszMiAxIDc1MDAwMDAKKzMyIDEgNzUyMDAwMAorMzIgMSA3NTQwMDAwCiszMiAxIDc1NjAwMDAKKzMyIDEgNzU4MDAwMAorMzIgMSA3NjAwMDAwCiszMiAxIDc2MjAwMDAKKzMyIDEgNzY0MDAwMAorMzIgMSA3NjYwMDAwCiszMiAxIDc2ODAwMDAKKzMyIDEgNzcwMDAwMAorMzIgMSA3NzIwMDAwCiszMiAxIDc3NDAwMDAKKzMyIDEgNzc2MDAwMAorMzIgMSA3NzgwMDAwCiszMiAxIDc4MDAwMDAKKzMyIDEgNzgyMDAwMAorMzIgMSA3ODQwMDAwCiszMiAxIDc4NjAwMDAKKzMyIDEgNzg4MDAwMAorMzIgMSA3OTAwMDAwCiszMiAxIDc5MjAwMDAKKzMyIDEgNzk0MDAwMAorMzIgMSA3OTYwMDAwCiszMiAxIDc5ODAwMDAKKzMyIDEgODAwMDAwMAorMzIgMSA4MDIwMDAwCiszMiAxIDgwNDAwMDAKKzMyIDEgODA2MDAwMAorMzIgMSA4MDgwMDAwCiszMiAxIDgxMDAwMDAKKzMyIDEgODEyMDAwMAorMzIgMSA4MTQwMDAwCiszMiAxIDgxNjAwMDAKKzMyIDEgODE4MDAwMAorMzIgMSA4MjAwMDAwCiszMiAxIDgyMjAwMDAKKzMyIDEgODI0MDAwMAorMzIgMSA4MjYwMDAwCiszMiAxIDgyODAwMDAKKzMyIDEgODMwMDAwMAorMzIgMSA4MzIwMDAwCiszMiAxIDgzNDAwMDAKKzMyIDEgODM2MDAwMAorMzIgMSA4MzgwMDAwCiszMiAxIDg0MDAwMDAKKzMyIDEgODQyMDAwMAorMzIgMSA4NDQwMDAwCiszMiAxIDg0NjAwMDAKKzMyIDEgODQ4MDAwMAorMzIgMSA4NTAwMDAwCiszMiAxIDg1MjAwMDAKKzMyIDEgODU0MDAwMAorMzIgMSA4NTYwMDAwCiszMiAxIDg1ODAwMDAKKzMyIDEgODYwMDAwMAorMzIgMSA4NjIwMDAwCiszMiAxIDg2NDAwMDAKKzMyIDEgODY2MDAwMAorMzIgMSA4NjgwMDAwCiszMiAxIDg3MDAwMDAKKzMyIDEgODcyMDAwMAorMzIgMSA4NzQwMDAwCiszMiAxIDg3NjAwMDAKKzMyIDEgODc4MDAwMAorMzIgMSA4ODAwMDAwCiszMiAxIDg4MjAwMDAKKzMyIDEgODg0MDAwMAorMzIgMSA4ODYwMDAwCiszMiAxIDg4ODAwMDAKKzMyIDEgODkwMDAwMAorMzIgMSA4OTIwMDAwCiszMiAxIDg5NDAwMDAKKzMyIDEgODk2MDAwMAorMzIgMSA4OTgwMDAwCiszMiAxIDkwMDAwMDAKKzMyIDEgOTAyMDAwMAorMzIgMSA5MDQwMDAwCiszMiAxIDkwNjAwMDAKKzMyIDEgOTA4MDAwMAorMzIgMSA5MTAwMDAwCiszMiAxIDkxMjAwMDAKKzMyIDEgOTE0MDAwMAorMzIgMSA5MTYwMDAwCiszMiAxIDkxODAwMDAKKzMyIDEgOTIwMDAwMAorMzIgMSA5MjIwMDAwCiszMiAxIDkyNDAwMDAKKzMyIDEgOTI2MDAwMAorMzIgMSA5MjgwMDAwCiszMiAxIDkzMDAwMDAKKzMyIDEgOTMyMDAwMAorMzIgMSA5MzQwMDAwCiszMiAxIDkzNjAwMDAKKzMyIDEgOTM4MDAwMAorMzIgMSA5NDAwMDAwCiszMiAxIDk0MjAwMDAKKzMyIDEgOTQ0MDAwMAorMzIgMSA5NDYwMDAwCiszMiAxIDk0ODAwMDAKKzMyIDEgOTUwMDAwMAorMzIgMSA5NTIwMDAwCiszMiAxIDk1NDAwMDAKKzMyIDEgOTU2MDAwMAorMzIgMSA5NTgwMDAwCiszMiAxIDk2MDAwMDAKKzMyIDEgOTYyMDAwMAorMzIgMSA5NjQwMDAwCiszMiAxIDk2NjAwMDAKKzMyIDEgOTY4MDAwMAorMzIgMSA5NzAwMDAwCiszMiAxIDk3MjAwMDAKKzMyIDEgOTc0MDAwMAorMzIgMSA5NzYwMDAwCiszMiAxIDk3ODAwMDAKKzMyIDEgOTgwMDAwMAorMzIgMSA5ODIwMDAwCiszMiAxIDk4NDAwMDAKKzMyIDEgOTg2MDAwMAorMzIgMSA5ODgwMDAwCiszMiAxIDk5MDAwMDAKKzMyIDEgOTkyMDAwMAorMzIgMSA5OTQwMDAwCiszMiAxIDk5NjAwMDAKKzMyIDEgOTk4MDAwMAorMzIgMSAxMDAwMDAwMAorMzIgMSAxMDAyMDAwMAorMzIgMSAxMDA0MDAwMAorMzIgMSAxMDA2MDAwMAorMzIgMSAxMDA4MDAwMAorMzIgMSAxMDEwMDAwMAorMzIgMSAxMDEyMDAwMAorMzIgMSAxMDE0MDAwMAorMzIgMSAxMDE2MDAwMAorMzIgMSAxMDE4MDAwMAorMzIgMSAxMDIwMDAwMAorMzIgMSAxMDIyMDAwMAorMzIgMSAxMDI0MDAwMAorMzIgMSAxMDI2MDAwMAorMzIgMSAxMDI4MDAwMAorMzIgMSAxMDMwMDAwMAorMzIgMSAxMDMyMDAwMAorMzIgMSAxMDM0MDAwMAorMzIgMSAxMDM2MDAwMAorMzIgMSAxMDM4MDAwMAorMzIgMSAxMDQwMDAwMAorMzIgMSAxMDQyMDAwMAorMzIgMSAxMDQ0MDAwMAorMzIgMSAxMDQ2MDAwMAorMzIgMSAxMDQ4MDAwMAorMzIgMSAxMDUwMDAwMAorMzIgMSAxMDUyMDAwMAorMzIgMSAxMDU0MDAwMAorMzIgMSAxMDU2MDAwMAorMzIgMSAxMDU4MDAwMAorMzIgMSAxMDYwMDAwMAorMzIgMSAxMDYyMDAwMAorMzIgMSAxMDY0MDAwMAorMzIgMSAxMDY2MDAwMAorMzIgMSAxMDY4MDAwMAorMzIgMSAxMDcwMDAwMAorMzIgMSAxMDcyMDAwMAorMzIgMSAxMDc0MDAwMAorMzIgMSAxMDc2MDAwMAorMzIgMSAxMDc4MDAwMAorMzIgMSAxMDgwMDAwMAorMzIgMSAxMDgyMDAwMAorMzIgMSAxMDg0MDAwMAorMzIgMSAxMDg2MDAwMAorMzIgMSAxMDg4MDAwMAorMzIgMSAxMDkwMDAwMAorMzIgMSAxMDkyMDAwMAorMzIgMSAxMDk0MDAwMAorMzIgMSAxMDk2MDAwMAorMzIgMSAxMDk4MDAwMAorMzIgMSAxMTAwMDAwMAorMzIgMSAxMTAyMDAwMAorMzIgMSAxMTA0MDAwMAorMzIgMSAxMTA2MDAwMAorMzIgMSAxMTA4MDAwMAorMzIgMSAxMTEwMDAwMAorMzIgMSAxMTEyMDAwMAorMzIgMSAxMTE0MDAwMAorMzIgMSAxMTE2MDAwMAorMzIgMSAxMTE4MDAwMAorMzIgMSAxMTIwMDAwMAorMzIgMSAxMTIyMDAwMAorMzIgMSAxMTI0MDAwMAorMzIgMSAxMTI2MDAwMAorMzIgMSAxMTI4MDAwMAorMzIgMSAxMTMwMDAwMAorMzIgMSAxMTMyMDAwMAorMzIgMSAxMTM0MDAwMAorMzIgMSAxMTM2MDAwMAorMzIgMSAxMTM4MDAwMAorMzIgMSAxMTQwMDAwMAorMzIgMSAxMTQyMDAwMAorMzIgMSAxMTQ0MDAwMAorMzIgMSAxMTQ2MDAwMAorMzIgMSAxMTQ4MDAwMAorMzIgMSAxMTUwMDAwMAorMzIgMSAxMTUyMDAwMAorMzIgMSAxMTU0MDAwMAorMzIgMSAxMTU2MDAwMAorMzIgMSAxMTU4MDAwMAorMzIgMSAxMTYwMDAwMAorMzIgMSAxMTYyMDAwMAorMzIgMSAxMTY0MDAwMAorMzIgMSAxMTY2MDAwMAorMzIgMSAxMTY4MDAwMAorMzIgMSAxMTcwMDAwMAorMzIgMSAxMTcyMDAwMAorMzIgMSAxMTc0MDAwMAorMzIgMSAxMTc2MDAwMAorMzIgMSAxMTc4MDAwMAorMzIgMSAxMTgwMDAwMAorMzIgMSAxMTgyMDAwMAorMzIgMSAxMTg0MDAwMAorMzIgMSAxMTg2MDAwMAorMzIgMSAxMTg4MDAwMAorMzIgMSAxMTkwMDAwMAorMzIgMSAxMTkyMDAwMAorMzIgMSAxMTk0MDAwMAorMzIgMSAxMTk2MDAwMAorMzIgMSAxMTk4MDAwMAorMzIgMSAxMjAwMDAwMAorMzIgMSAxMjAyMDAwMAorMzIgMSAxMjA0MDAwMAorMzIgMSAxMjA2MDAwMAorMzIgMSAxMjA4MDAwMAorMzIgMSAxMjEwMDAwMAorMzIgMSAxMjEyMDAwMAorMzIgMSAxMjE0MDAwMAorMzIgMSAxMjE2MDAwMAorMzIgMSAxMjE4MDAwMAorMzIgMSAxMjIwMDAwMAorMzIgMSAxMjIyMDAwMAorMzIgMSAxMjI0MDAwMAorMzIgMSAxMjI2MDAwMAorMzIgMSAxMjI4MDAwMAorMzIgMSAxMjMwMDAwMAorMzIgMSAxMjMyMDAwMAorMzIgMSAxMjM0MDAwMAorMzIgMSAxMjM2MDAwMAorMzIgMSAxMjM4MDAwMAorMzIgMSAxMjQwMDAwMAorMzIgMSAxMjQyMDAwMAorMzIgMSAxMjQ0MDAwMAorMzIgMSAxMjQ2MDAwMAorMzIgMSAxMjQ4MDAwMAorMzIgMSAxMjUwMDAwMAorMzIgMSAxMjUyMDAwMAorMzIgMSAxMjU0MDAwMAorMzIgMSAxMjU2MDAwMAorMzIgMSAxMjU4MDAwMAorMzIgMSAxMjYwMDAwMAorMzIgMSAxMjYyMDAwMAorMzIgMSAxMjY0MDAwMAorMzIgMSAxMjY2MDAwMAorMzIgMSAxMjY4MDAwMAorMzIgMSAxMjcwMDAwMAorMzIgMSAxMjcyMDAwMAorMzIgMSAxMjc0MDAwMAorMzIgMSAxMjc2MDAwMAorMzIgMSAxMjc4MDAwMAorMzIgMSAxMjgwMDAwMAorMzIgMSAxMjgyMDAwMAorMzIgMSAxMjg0MDAwMAorMzIgMSAxMjg2MDAwMAorMzIgMSAxMjg4MDAwMAorMzIgMSAxMjkwMDAwMAorMzIgMSAxMjkyMDAwMAorMzIgMSAxMjk0MDAwMAorMzIgMSAxMjk2MDAwMAorMzIgMSAxMjk4MDAwMAorMzIgMSAxMzAwMDAwMAorMzIgMSAxMzAyMDAwMAorMzIgMSAxMzA0MDAwMAorMzIgMSAxMzA2MDAwMAorMzIgMSAxMzA4MDAwMAorMzIgMSAxMzEwMDAwMAorMzIgMSAxMzEyMDAwMAorMzIgMSAxMzE0MDAwMAorMzIgMSAxMzE2MDAwMAorMzIgMSAxMzE4MDAwMAorMzIgMSAxMzIwMDAwMAorMzIgMSAxMzIyMDAwMAorMzIgMSAxMzI0MDAwMAorMzIgMSAxMzI2MDAwMAorMzIgMSAxMzI4MDAwMAorMzIgMSAxMzMwMDAwMAorMzIgMSAxMzMyMDAwMAorMzIgMSAxMzM0MDAwMAorMzIgMSAxMzM2MDAwMAorMzIgMSAxMzM4MDAwMAorMzIgMSAxMzQwMDAwMAorMzIgMSAxMzQyMDAwMAorMzIgMSAxMzQ0MDAwMAorMzIgMSAxMzQ2MDAwMAorMzIgMSAxMzQ4MDAwMAorMzIgMSAxMzUwMDAwMAorMzIgMSAxMzUyMDAwMAorMzIgMSAxMzU0MDAwMAorMzIgMSAxMzU2MDAwMAorMzIgMSAxMzU4MDAwMAorMzIgMSAxMzYwMDAwMAorMzIgMSAxMzYyMDAwMAorMzIgMSAxMzY0MDAwMAorMzIgMSAxMzY2MDAwMAorMzIgMSAxMzY4MDAwMAorMzIgMSAxMzcwMDAwMAorMzIgMSAxMzcyMDAwMAorMzIgMSAxMzc0MDAwMAorMzIgMSAxMzc2MDAwMAorMzIgMSAxMzc4MDAwMAorMzIgMSAxMzgwMDAwMAorMzIgMSAxMzgyMDAwMAorMzIgMSAxMzg0MDAwMAorMzIgMSAxMzg2MDAwMAorMzIgMSAxMzg4MDAwMAorMzIgMSAxMzkwMDAwMAorMzIgMSAxMzkyMDAwMAorMzIgMSAxMzk0MDAwMAorMzIgMSAxMzk2MDAwMAorMzIgMSAxMzk4MDAwMAorMzIgMSAxNDAwMDAwMAorMzIgMSAxNDAyMDAwMAorMzIgMSAxNDA0MDAwMAorMzIgMSAxNDA2MDAwMAorMzIgMSAxNDA4MDAwMAorMzIgMSAxNDEwMDAwMAorMzIgMSAxNDEyMDAwMAorMzIgMSAxNDE0MDAwMAorMzIgMSAxNDE2MDAwMAorMzIgMSAxNDE4MDAwMAorMzIgMSAxNDIwMDAwMAorMzIgMSAxNDIyMDAwMAorMzIgMSAxNDI0MDAwMAorMzIgMSAxNDI2MDAwMAorMzIgMSAxNDI4MDAwMAorMzIgMSAxNDMwMDAwMAorMzIgMSAxNDMyMDAwMAorMzIgMSAxNDM0MDAwMAorMzIgMSAxNDM2MDAwMAorMzIgMSAxNDM4MDAwMAorMzIgMSAxNDQwMDAwMAorMzIgMSAxNDQyMDAwMAorMzIgMSAxNDQ0MDAwMAorMzIgMSAxNDQ2MDAwMAorMzIgMSAxNDQ4MDAwMAorMzIgMSAxNDUwMDAwMAorMzIgMSAxNDUyMDAwMAorMzIgMSAxNDU0MDAwMAorMzIgMSAxNDU2MDAwMAorMzIgMSAxNDU4MDAwMAorMzIgMSAxNDYwMDAwMAorMzIgMSAxNDYyMDAwMAorMzIgMSAxNDY0MDAwMAorMzIgMSAxNDY2MDAwMAorMzIgMSAxNDY4MDAwMAorMzIgMSAxNDcwMDAwMAorMzIgMSAxNDcyMDAwMAorMzIgMSAxNDc0MDAwMAorMzIgMSAxNDc2MDAwMAorMzIgMSAxNDc4MDAwMAorMzIgMSAxNDgwMDAwMAorMzIgMSAxNDgyMDAwMAorMzIgMSAxNDg0MDAwMAorMzIgMSAxNDg2MDAwMAorMzIgMSAxNDg4MDAwMAorMzIgMSAxNDkwMDAwMAorMzIgMSAxNDkyMDAwMAorMzIgMSAxNDk0MDAwMAorMzIgMSAxNDk2MDAwMAorMzIgMSAxNDk4MDAwMAorMzIgMSAxNTAwMDAwMAorMzIgMSAxNTAyMDAwMAorMzIgMSAxNTA0MDAwMAorMzIgMSAxNTA2MDAwMAorMzIgMSAxNTA4MDAwMAorMzIgMSAxNTEwMDAwMAorMzIgMSAxNTEyMDAwMAorMzIgMSAxNTE0MDAwMAorMzIgMSAxNTE2MDAwMAorMzIgMSAxNTE4MDAwMAorMzIgMSAxNTIwMDAwMAorMzIgMSAxNTIyMDAwMAorMzIgMSAxNTI0MDAwMAorMzIgMSAxNTI2MDAwMAorMzIgMSAxNTI4MDAwMAorMzIgMSAxNTMwMDAwMAorMzIgMSAxNTMyMDAwMAorMzIgMSAxNTM0MDAwMAorMzIgMSAxNTM2MDAwMAorMzIgMSAxNTM4MDAwMAorMzIgMSAxNTQwMDAwMAorMzIgMSAxNTQyMDAwMAorMzIgMSAxNTQ0MDAwMAorMzIgMSAxNTQ2MDAwMAorMzIgMSAxNTQ4MDAwMAorMzIgMSAxNTUwMDAwMAorMzIgMSAxNTUyMDAwMAorMzIgMSAxNTU0MDAwMAorMzIgMSAxNTU2MDAwMAorMzIgMSAxNTU4MDAwMAorMzIgMSAxNTYwMDAwMAorMzIgMSAxNTYyMDAwMAorMzIgMSAxNTY0MDAwMAorMzIgMSAxNTY2MDAwMAorMzIgMSAxNTY4MDAwMAorMzIgMSAxNTcwMDAwMAorMzIgMSAxNTcyMDAwMAorMzIgMSAxNTc0MDAwMAorMzIgMSAxNTc2MDAwMAorMzIgMSAxNTc4MDAwMAorMzIgMSAxNTgwMDAwMAorMzIgMSAxNTgyMDAwMAorMzIgMSAxNTg0MDAwMAorMzIgMSAxNTg2MDAwMAorMzIgMSAxNTg4MDAwMAorMzIgMSAxNTkwMDAwMAorMzIgMSAxNTkyMDAwMAorMzIgMSAxNTk0MDAwMAorMzIgMSAxNTk2MDAwMAorMzIgMSAxNTk4MDAwMAorMzIgMSAxNjAwMDAwMAorMzIgMSAxNjAyMDAwMAorMzIgMSAxNjA0MDAwMAorMzIgMSAxNjA2MDAwMAorMzIgMSAxNjA4MDAwMAorMzIgMSAxNjEwMDAwMAorMzIgMSAxNjEyMDAwMAorMzIgMSAxNjE0MDAwMAorMzIgMSAxNjE2MDAwMAorMzIgMSAxNjE4MDAwMAorMzIgMSAxNjIwMDAwMAorMzIgMSAxNjIyMDAwMAorMzIgMSAxNjI0MDAwMAorMzIgMSAxNjI2MDAwMAorMzIgMSAxNjI4MDAwMAorMzIgMSAxNjMwMDAwMAorMzIgMSAxNjMyMDAwMAorMzIgMSAxNjM0MDAwMAorMzIgMSAxNjM2MDAwMAorMzIgMSAxNjM4MDAwMAorMzIgMSAxNjQwMDAwMAorMzIgMSAxNjQyMDAwMAorMzIgMSAxNjQ0MDAwMAorMzIgMSAxNjQ2MDAwMAorMzIgMSAxNjQ4MDAwMAorMzIgMSAxNjUwMDAwMAorMzIgMSAxNjUyMDAwMAorMzIgMSAxNjU0MDAwMAorMzIgMSAxNjU2MDAwMAorMzIgMSAxNjU4MDAwMAorMzIgMSAxNjYwMDAwMAorMzIgMSAxNjYyMDAwMAorMzIgMSAxNjY0MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc2ZWFmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsODA3IEBACiszMiAxIDAKKzMyIDEgMjAwMDAKKzY0IDEgNDAwMDAKKzY0IDEgODAwMDAKKzY0IDEgMTIwMDAwCis5NiAxIDE2MDAwMAorOTYgMSAyMjAwMDAKKzk2IDEgMjgwMDAwCis5NiAxIDM0MDAwMAorMTI4IDEgNDAwMDAwCisxMjggMSA0ODAwMDAKKzEyOCAxIDU2MDAwMAorMTI4IDEgNjQwMDAwCisxMjggMSA3MjAwMDAKKzMyIDEgODAwMDAwCiszMiAxIDgyMDAwMAorMzIgMSA4NDAwMDAKKzMyIDEgODYwMDAwCiszMiAxIDg4MDAwMAorMzIgMSA5MDAwMDAKKzMyIDEgOTIwMDAwCiszMiAxIDk0MDAwMAorMzIgMSA5NjAwMDAKKzMyIDEgOTgwMDAwCiszMiAxIDEwMDAwMDAKKzMyIDEgMTAyMDAwMAorMzIgMSAxMDQwMDAwCiszMiAxIDEwNjAwMDAKKzMyIDEgMTA4MDAwMAorMzIgMSAxMTAwMDAwCiszMiAxIDExMjAwMDAKKzMyIDEgMTE0MDAwMAorMzIgMSAxMTYwMDAwCiszMiAxIDExODAwMDAKKzMyIDEgMTIwMDAwMAorMzIgMSAxMjIwMDAwCiszMiAxIDEyNDAwMDAKKzMyIDEgMTI2MDAwMAorMzIgMSAxMjgwMDAwCiszMiAxIDEzMDAwMDAKKzMyIDEgMTMyMDAwMAorMzIgMSAxMzQwMDAwCiszMiAxIDEzNjAwMDAKKzMyIDEgMTM4MDAwMAorMzIgMSAxNDAwMDAwCiszMiAxIDE0MjAwMDAKKzMyIDEgMTQ0MDAwMAorMzIgMSAxNDYwMDAwCiszMiAxIDE0ODAwMDAKKzMyIDEgMTUwMDAwMAorMzIgMSAxNTIwMDAwCiszMiAxIDE1NDAwMDAKKzMyIDEgMTU2MDAwMAorMzIgMSAxNTgwMDAwCiszMiAxIDE2MDAwMDAKKzMyIDEgMTYyMDAwMAorMzIgMSAxNjQwMDAwCiszMiAxIDE2NjAwMDAKKzMyIDEgMTY4MDAwMAorMzIgMSAxNzAwMDAwCiszMiAxIDE3MjAwMDAKKzMyIDEgMTc0MDAwMAorMzIgMSAxNzYwMDAwCiszMiAxIDE3ODAwMDAKKzMyIDEgMTgwMDAwMAorMzIgMSAxODIwMDAwCiszMiAxIDE4NDAwMDAKKzMyIDEgMTg2MDAwMAorMzIgMSAxODgwMDAwCiszMiAxIDE5MDAwMDAKKzMyIDEgMTkyMDAwMAorMzIgMSAxOTQwMDAwCiszMiAxIDE5NjAwMDAKKzMyIDEgMTk4MDAwMAorMzIgMSAyMDAwMDAwCiszMiAxIDIwMjAwMDAKKzMyIDEgMjA0MDAwMAorMzIgMSAyMDYwMDAwCiszMiAxIDIwODAwMDAKKzMyIDEgMjEwMDAwMAorMzIgMSAyMTIwMDAwCiszMiAxIDIxNDAwMDAKKzMyIDEgMjE2MDAwMAorMzIgMSAyMTgwMDAwCiszMiAxIDIyMDAwMDAKKzMyIDEgMjIyMDAwMAorMzIgMSAyMjQwMDAwCiszMiAxIDIyNjAwMDAKKzMyIDEgMjI4MDAwMAorMzIgMSAyMzAwMDAwCiszMiAxIDIzMjAwMDAKKzMyIDEgMjM0MDAwMAorMzIgMSAyMzYwMDAwCiszMiAxIDIzODAwMDAKKzMyIDEgMjQwMDAwMAorMzIgMSAyNDIwMDAwCiszMiAxIDI0NDAwMDAKKzMyIDEgMjQ2MDAwMAorMzIgMSAyNDgwMDAwCiszMiAxIDI1MDAwMDAKKzMyIDEgMjUyMDAwMAorMzIgMSAyNTQwMDAwCiszMiAxIDI1NjAwMDAKKzMyIDEgMjU4MDAwMAorMzIgMSAyNjAwMDAwCiszMiAxIDI2MjAwMDAKKzMyIDEgMjY0MDAwMAorMzIgMSAyNjYwMDAwCiszMiAxIDI2ODAwMDAKKzMyIDEgMjcwMDAwMAorMzIgMSAyNzIwMDAwCiszMiAxIDI3NDAwMDAKKzMyIDEgMjc2MDAwMAorMzIgMSAyNzgwMDAwCiszMiAxIDI4MDAwMDAKKzMyIDEgMjgyMDAwMAorMzIgMSAyODQwMDAwCiszMiAxIDI4NjAwMDAKKzMyIDEgMjg4MDAwMAorMzIgMSAyOTAwMDAwCiszMiAxIDI5MjAwMDAKKzMyIDEgMjk0MDAwMAorMzIgMSAyOTYwMDAwCiszMiAxIDI5ODAwMDAKKzMyIDEgMzAwMDAwMAorMzIgMSAzMDIwMDAwCiszMiAxIDMwNDAwMDAKKzMyIDEgMzA2MDAwMAorMzIgMSAzMDgwMDAwCiszMiAxIDMxMDAwMDAKKzMyIDEgMzEyMDAwMAorMzIgMSAzMTQwMDAwCiszMiAxIDMxNjAwMDAKKzMyIDEgMzE4MDAwMAorMzIgMSAzMjAwMDAwCiszMiAxIDMyMjAwMDAKKzMyIDEgMzI0MDAwMAorMzIgMSAzMjYwMDAwCiszMiAxIDMyODAwMDAKKzMyIDEgMzMwMDAwMAorMzIgMSAzMzIwMDAwCiszMiAxIDMzNDAwMDAKKzMyIDEgMzM2MDAwMAorMzIgMSAzMzgwMDAwCiszMiAxIDM0MDAwMDAKKzMyIDEgMzQyMDAwMAorMzIgMSAzNDQwMDAwCiszMiAxIDM0NjAwMDAKKzMyIDEgMzQ4MDAwMAorMzIgMSAzNTAwMDAwCiszMiAxIDM1MjAwMDAKKzMyIDEgMzU0MDAwMAorMzIgMSAzNTYwMDAwCiszMiAxIDM1ODAwMDAKKzMyIDEgMzYwMDAwMAorMzIgMSAzNjIwMDAwCiszMiAxIDM2NDAwMDAKKzMyIDEgMzY2MDAwMAorMzIgMSAzNjgwMDAwCiszMiAxIDM3MDAwMDAKKzMyIDEgMzcyMDAwMAorMzIgMSAzNzQwMDAwCiszMiAxIDM3NjAwMDAKKzMyIDEgMzc4MDAwMAorMzIgMSAzODAwMDAwCiszMiAxIDM4MjAwMDAKKzMyIDEgMzg0MDAwMAorMzIgMSAzODYwMDAwCiszMiAxIDM4ODAwMDAKKzMyIDEgMzkwMDAwMAorMzIgMSAzOTIwMDAwCiszMiAxIDM5NDAwMDAKKzMyIDEgMzk2MDAwMAorMzIgMSAzOTgwMDAwCiszMiAxIDQwMDAwMDAKKzMyIDEgNDAyMDAwMAorMzIgMSA0MDQwMDAwCiszMiAxIDQwNjAwMDAKKzMyIDEgNDA4MDAwMAorMzIgMSA0MTAwMDAwCiszMiAxIDQxMjAwMDAKKzMyIDEgNDE0MDAwMAorMzIgMSA0MTYwMDAwCiszMiAxIDQxODAwMDAKKzMyIDEgNDIwMDAwMAorMzIgMSA0MjIwMDAwCiszMiAxIDQyNDAwMDAKKzMyIDEgNDI2MDAwMAorMzIgMSA0MjgwMDAwCiszMiAxIDQzMDAwMDAKKzMyIDEgNDMyMDAwMAorMzIgMSA0MzQwMDAwCiszMiAxIDQzNjAwMDAKKzMyIDEgNDM4MDAwMAorMzIgMSA0NDAwMDAwCiszMiAxIDQ0MjAwMDAKKzMyIDEgNDQ0MDAwMAorMzIgMSA0NDYwMDAwCiszMiAxIDQ0ODAwMDAKKzMyIDEgNDUwMDAwMAorMzIgMSA0NTIwMDAwCiszMiAxIDQ1NDAwMDAKKzMyIDEgNDU2MDAwMAorMzIgMSA0NTgwMDAwCiszMiAxIDQ2MDAwMDAKKzMyIDEgNDYyMDAwMAorMzIgMSA0NjQwMDAwCiszMiAxIDQ2NjAwMDAKKzMyIDEgNDY4MDAwMAorMzIgMSA0NzAwMDAwCiszMiAxIDQ3MjAwMDAKKzMyIDEgNDc0MDAwMAorMzIgMSA0NzYwMDAwCiszMiAxIDQ3ODAwMDAKKzMyIDEgNDgwMDAwMAorMzIgMSA0ODIwMDAwCiszMiAxIDQ4NDAwMDAKKzMyIDEgNDg2MDAwMAorMzIgMSA0ODgwMDAwCiszMiAxIDQ5MDAwMDAKKzMyIDEgNDkyMDAwMAorMzIgMSA0OTQwMDAwCiszMiAxIDQ5NjAwMDAKKzMyIDEgNDk4MDAwMAorMzIgMSA1MDAwMDAwCiszMiAxIDUwMjAwMDAKKzMyIDEgNTA0MDAwMAorMzIgMSA1MDYwMDAwCiszMiAxIDUwODAwMDAKKzMyIDEgNTEwMDAwMAorMzIgMSA1MTIwMDAwCiszMiAxIDUxNDAwMDAKKzMyIDEgNTE2MDAwMAorMzIgMSA1MTgwMDAwCiszMiAxIDUyMDAwMDAKKzMyIDEgNTIyMDAwMAorMzIgMSA1MjQwMDAwCiszMiAxIDUyNjAwMDAKKzMyIDEgNTI4MDAwMAorMzIgMSA1MzAwMDAwCiszMiAxIDUzMjAwMDAKKzMyIDEgNTM0MDAwMAorMzIgMSA1MzYwMDAwCiszMiAxIDUzODAwMDAKKzMyIDEgNTQwMDAwMAorMzIgMSA1NDIwMDAwCiszMiAxIDU0NDAwMDAKKzMyIDEgNTQ2MDAwMAorMzIgMSA1NDgwMDAwCiszMiAxIDU1MDAwMDAKKzMyIDEgNTUyMDAwMAorMzIgMSA1NTQwMDAwCiszMiAxIDU1NjAwMDAKKzMyIDEgNTU4MDAwMAorMzIgMSA1NjAwMDAwCiszMiAxIDU2MjAwMDAKKzMyIDEgNTY0MDAwMAorMzIgMSA1NjYwMDAwCiszMiAxIDU2ODAwMDAKKzMyIDEgNTcwMDAwMAorMzIgMSA1NzIwMDAwCiszMiAxIDU3NDAwMDAKKzMyIDEgNTc2MDAwMAorMzIgMSA1NzgwMDAwCiszMiAxIDU4MDAwMDAKKzMyIDEgNTgyMDAwMAorMzIgMSA1ODQwMDAwCiszMiAxIDU4NjAwMDAKKzMyIDEgNTg4MDAwMAorMzIgMSA1OTAwMDAwCiszMiAxIDU5MjAwMDAKKzMyIDEgNTk0MDAwMAorMzIgMSA1OTYwMDAwCiszMiAxIDU5ODAwMDAKKzMyIDEgNjAwMDAwMAorMzIgMSA2MDIwMDAwCiszMiAxIDYwNDAwMDAKKzMyIDEgNjA2MDAwMAorMzIgMSA2MDgwMDAwCiszMiAxIDYxMDAwMDAKKzMyIDEgNjEyMDAwMAorMzIgMSA2MTQwMDAwCiszMiAxIDYxNjAwMDAKKzMyIDEgNjE4MDAwMAorMzIgMSA2MjAwMDAwCiszMiAxIDYyMjAwMDAKKzMyIDEgNjI0MDAwMAorMzIgMSA2MjYwMDAwCiszMiAxIDYyODAwMDAKKzMyIDEgNjMwMDAwMAorMzIgMSA2MzIwMDAwCiszMiAxIDYzNDAwMDAKKzMyIDEgNjM2MDAwMAorMzIgMSA2MzgwMDAwCiszMiAxIDY0MDAwMDAKKzMyIDEgNjQyMDAwMAorMzIgMSA2NDQwMDAwCiszMiAxIDY0NjAwMDAKKzMyIDEgNjQ4MDAwMAorMzIgMSA2NTAwMDAwCiszMiAxIDY1MjAwMDAKKzMyIDEgNjU0MDAwMAorMzIgMSA2NTYwMDAwCiszMiAxIDY1ODAwMDAKKzMyIDEgNjYwMDAwMAorMzIgMSA2NjIwMDAwCiszMiAxIDY2NDAwMDAKKzMyIDEgNjY2MDAwMAorMzIgMSA2NjgwMDAwCiszMiAxIDY3MDAwMDAKKzMyIDEgNjcyMDAwMAorMzIgMSA2NzQwMDAwCiszMiAxIDY3NjAwMDAKKzMyIDEgNjc4MDAwMAorMzIgMSA2ODAwMDAwCiszMiAxIDY4MjAwMDAKKzMyIDEgNjg0MDAwMAorMzIgMSA2ODYwMDAwCiszMiAxIDY4ODAwMDAKKzMyIDEgNjkwMDAwMAorMzIgMSA2OTIwMDAwCiszMiAxIDY5NDAwMDAKKzMyIDEgNjk2MDAwMAorMzIgMSA2OTgwMDAwCiszMiAxIDcwMDAwMDAKKzMyIDEgNzAyMDAwMAorMzIgMSA3MDQwMDAwCiszMiAxIDcwNjAwMDAKKzMyIDEgNzA4MDAwMAorMzIgMSA3MTAwMDAwCiszMiAxIDcxMjAwMDAKKzMyIDEgNzE0MDAwMAorMzIgMSA3MTYwMDAwCiszMiAxIDcxODAwMDAKKzMyIDEgNzIwMDAwMAorMzIgMSA3MjIwMDAwCiszMiAxIDcyNDAwMDAKKzMyIDEgNzI2MDAwMAorMzIgMSA3MjgwMDAwCiszMiAxIDczMDAwMDAKKzMyIDEgNzMyMDAwMAorMzIgMSA3MzQwMDAwCiszMiAxIDczNjAwMDAKKzMyIDEgNzM4MDAwMAorMzIgMSA3NDAwMDAwCiszMiAxIDc0MjAwMDAKKzMyIDEgNzQ0MDAwMAorMzIgMSA3NDYwMDAwCiszMiAxIDc0ODAwMDAKKzMyIDEgNzUwMDAwMAorMzIgMSA3NTIwMDAwCiszMiAxIDc1NDAwMDAKKzMyIDEgNzU2MDAwMAorMzIgMSA3NTgwMDAwCiszMiAxIDc2MDAwMDAKKzMyIDEgNzYyMDAwMAorMzIgMSA3NjQwMDAwCiszMiAxIDc2NjAwMDAKKzMyIDEgNzY4MDAwMAorMzIgMSA3NzAwMDAwCiszMiAxIDc3MjAwMDAKKzMyIDEgNzc0MDAwMAorMzIgMSA3NzYwMDAwCiszMiAxIDc3ODAwMDAKKzMyIDEgNzgwMDAwMAorMzIgMSA3ODIwMDAwCiszMiAxIDc4NDAwMDAKKzMyIDEgNzg2MDAwMAorMzIgMSA3ODgwMDAwCiszMiAxIDc5MDAwMDAKKzMyIDEgNzkyMDAwMAorMzIgMSA3OTQwMDAwCiszMiAxIDc5NjAwMDAKKzMyIDEgNzk4MDAwMAorMzIgMSA4MDAwMDAwCiszMiAxIDgwMjAwMDAKKzMyIDEgODA0MDAwMAorMzIgMSA4MDYwMDAwCiszMiAxIDgwODAwMDAKKzMyIDEgODEwMDAwMAorMzIgMSA4MTIwMDAwCiszMiAxIDgxNDAwMDAKKzMyIDEgODE2MDAwMAorMzIgMSA4MTgwMDAwCiszMiAxIDgyMDAwMDAKKzMyIDEgODIyMDAwMAorMzIgMSA4MjQwMDAwCiszMiAxIDgyNjAwMDAKKzMyIDEgODI4MDAwMAorMzIgMSA4MzAwMDAwCiszMiAxIDgzMjAwMDAKKzMyIDEgODM0MDAwMAorMzIgMSA4MzYwMDAwCiszMiAxIDgzODAwMDAKKzMyIDEgODQwMDAwMAorMzIgMSA4NDIwMDAwCiszMiAxIDg0NDAwMDAKKzMyIDEgODQ2MDAwMAorMzIgMSA4NDgwMDAwCiszMiAxIDg1MDAwMDAKKzMyIDEgODUyMDAwMAorMzIgMSA4NTQwMDAwCiszMiAxIDg1NjAwMDAKKzMyIDEgODU4MDAwMAorMzIgMSA4NjAwMDAwCiszMiAxIDg2MjAwMDAKKzMyIDEgODY0MDAwMAorMzIgMSA4NjYwMDAwCiszMiAxIDg2ODAwMDAKKzMyIDEgODcwMDAwMAorMzIgMSA4NzIwMDAwCiszMiAxIDg3NDAwMDAKKzMyIDEgODc2MDAwMAorMzIgMSA4NzgwMDAwCiszMiAxIDg4MDAwMDAKKzMyIDEgODgyMDAwMAorMzIgMSA4ODQwMDAwCiszMiAxIDg4NjAwMDAKKzMyIDEgODg4MDAwMAorMzIgMSA4OTAwMDAwCiszMiAxIDg5MjAwMDAKKzMyIDEgODk0MDAwMAorMzIgMSA4OTYwMDAwCiszMiAxIDg5ODAwMDAKKzMyIDEgOTAwMDAwMAorMzIgMSA5MDIwMDAwCiszMiAxIDkwNDAwMDAKKzMyIDEgOTA2MDAwMAorMzIgMSA5MDgwMDAwCiszMiAxIDkxMDAwMDAKKzMyIDEgOTEyMDAwMAorMzIgMSA5MTQwMDAwCiszMiAxIDkxNjAwMDAKKzMyIDEgOTE4MDAwMAorMzIgMSA5MjAwMDAwCiszMiAxIDkyMjAwMDAKKzMyIDEgOTI0MDAwMAorMzIgMSA5MjYwMDAwCiszMiAxIDkyODAwMDAKKzMyIDEgOTMwMDAwMAorMzIgMSA5MzIwMDAwCiszMiAxIDkzNDAwMDAKKzMyIDEgOTM2MDAwMAorMzIgMSA5MzgwMDAwCiszMiAxIDk0MDAwMDAKKzMyIDEgOTQyMDAwMAorMzIgMSA5NDQwMDAwCiszMiAxIDk0NjAwMDAKKzMyIDEgOTQ4MDAwMAorMzIgMSA5NTAwMDAwCiszMiAxIDk1MjAwMDAKKzMyIDEgOTU0MDAwMAorMzIgMSA5NTYwMDAwCiszMiAxIDk1ODAwMDAKKzMyIDEgOTYwMDAwMAorMzIgMSA5NjIwMDAwCiszMiAxIDk2NDAwMDAKKzMyIDEgOTY2MDAwMAorMzIgMSA5NjgwMDAwCiszMiAxIDk3MDAwMDAKKzMyIDEgOTcyMDAwMAorMzIgMSA5NzQwMDAwCiszMiAxIDk3NjAwMDAKKzMyIDEgOTc4MDAwMAorMzIgMSA5ODAwMDAwCiszMiAxIDk4MjAwMDAKKzMyIDEgOTg0MDAwMAorMzIgMSA5ODYwMDAwCiszMiAxIDk4ODAwMDAKKzMyIDEgOTkwMDAwMAorMzIgMSA5OTIwMDAwCiszMiAxIDk5NDAwMDAKKzMyIDEgOTk2MDAwMAorMzIgMSA5OTgwMDAwCiszMiAxIDEwMDAwMDAwCiszMiAxIDEwMDIwMDAwCiszMiAxIDEwMDQwMDAwCiszMiAxIDEwMDYwMDAwCiszMiAxIDEwMDgwMDAwCiszMiAxIDEwMTAwMDAwCiszMiAxIDEwMTIwMDAwCiszMiAxIDEwMTQwMDAwCiszMiAxIDEwMTYwMDAwCiszMiAxIDEwMTgwMDAwCiszMiAxIDEwMjAwMDAwCiszMiAxIDEwMjIwMDAwCiszMiAxIDEwMjQwMDAwCiszMiAxIDEwMjYwMDAwCiszMiAxIDEwMjgwMDAwCiszMiAxIDEwMzAwMDAwCiszMiAxIDEwMzIwMDAwCiszMiAxIDEwMzQwMDAwCiszMiAxIDEwMzYwMDAwCiszMiAxIDEwMzgwMDAwCiszMiAxIDEwNDAwMDAwCiszMiAxIDEwNDIwMDAwCiszMiAxIDEwNDQwMDAwCiszMiAxIDEwNDYwMDAwCiszMiAxIDEwNDgwMDAwCiszMiAxIDEwNTAwMDAwCiszMiAxIDEwNTIwMDAwCiszMiAxIDEwNTQwMDAwCiszMiAxIDEwNTYwMDAwCiszMiAxIDEwNTgwMDAwCiszMiAxIDEwNjAwMDAwCiszMiAxIDEwNjIwMDAwCiszMiAxIDEwNjQwMDAwCiszMiAxIDEwNjYwMDAwCiszMiAxIDEwNjgwMDAwCiszMiAxIDEwNzAwMDAwCiszMiAxIDEwNzIwMDAwCiszMiAxIDEwNzQwMDAwCiszMiAxIDEwNzYwMDAwCiszMiAxIDEwNzgwMDAwCiszMiAxIDEwODAwMDAwCiszMiAxIDEwODIwMDAwCiszMiAxIDEwODQwMDAwCiszMiAxIDEwODYwMDAwCiszMiAxIDEwODgwMDAwCiszMiAxIDEwOTAwMDAwCiszMiAxIDEwOTIwMDAwCiszMiAxIDEwOTQwMDAwCiszMiAxIDEwOTYwMDAwCiszMiAxIDEwOTgwMDAwCiszMiAxIDExMDAwMDAwCiszMiAxIDExMDIwMDAwCiszMiAxIDExMDQwMDAwCiszMiAxIDExMDYwMDAwCiszMiAxIDExMDgwMDAwCiszMiAxIDExMTAwMDAwCiszMiAxIDExMTIwMDAwCiszMiAxIDExMTQwMDAwCiszMiAxIDExMTYwMDAwCiszMiAxIDExMTgwMDAwCiszMiAxIDExMjAwMDAwCiszMiAxIDExMjIwMDAwCiszMiAxIDExMjQwMDAwCiszMiAxIDExMjYwMDAwCiszMiAxIDExMjgwMDAwCiszMiAxIDExMzAwMDAwCiszMiAxIDExMzIwMDAwCiszMiAxIDExMzQwMDAwCiszMiAxIDExMzYwMDAwCiszMiAxIDExMzgwMDAwCiszMiAxIDExNDAwMDAwCiszMiAxIDExNDIwMDAwCiszMiAxIDExNDQwMDAwCiszMiAxIDExNDYwMDAwCiszMiAxIDExNDgwMDAwCiszMiAxIDExNTAwMDAwCiszMiAxIDExNTIwMDAwCiszMiAxIDExNTQwMDAwCiszMiAxIDExNTYwMDAwCiszMiAxIDExNTgwMDAwCiszMiAxIDExNjAwMDAwCiszMiAxIDExNjIwMDAwCiszMiAxIDExNjQwMDAwCiszMiAxIDExNjYwMDAwCiszMiAxIDExNjgwMDAwCiszMiAxIDExNzAwMDAwCiszMiAxIDExNzIwMDAwCiszMiAxIDExNzQwMDAwCiszMiAxIDExNzYwMDAwCiszMiAxIDExNzgwMDAwCiszMiAxIDExODAwMDAwCiszMiAxIDExODIwMDAwCiszMiAxIDExODQwMDAwCiszMiAxIDExODYwMDAwCiszMiAxIDExODgwMDAwCiszMiAxIDExOTAwMDAwCiszMiAxIDExOTIwMDAwCiszMiAxIDExOTQwMDAwCiszMiAxIDExOTYwMDAwCiszMiAxIDExOTgwMDAwCiszMiAxIDEyMDAwMDAwCiszMiAxIDEyMDIwMDAwCiszMiAxIDEyMDQwMDAwCiszMiAxIDEyMDYwMDAwCiszMiAxIDEyMDgwMDAwCiszMiAxIDEyMTAwMDAwCiszMiAxIDEyMTIwMDAwCiszMiAxIDEyMTQwMDAwCiszMiAxIDEyMTYwMDAwCiszMiAxIDEyMTgwMDAwCiszMiAxIDEyMjAwMDAwCiszMiAxIDEyMjIwMDAwCiszMiAxIDEyMjQwMDAwCiszMiAxIDEyMjYwMDAwCiszMiAxIDEyMjgwMDAwCiszMiAxIDEyMzAwMDAwCiszMiAxIDEyMzIwMDAwCiszMiAxIDEyMzQwMDAwCiszMiAxIDEyMzYwMDAwCiszMiAxIDEyMzgwMDAwCiszMiAxIDEyNDAwMDAwCiszMiAxIDEyNDIwMDAwCiszMiAxIDEyNDQwMDAwCiszMiAxIDEyNDYwMDAwCiszMiAxIDEyNDgwMDAwCiszMiAxIDEyNTAwMDAwCiszMiAxIDEyNTIwMDAwCiszMiAxIDEyNTQwMDAwCiszMiAxIDEyNTYwMDAwCiszMiAxIDEyNTgwMDAwCiszMiAxIDEyNjAwMDAwCiszMiAxIDEyNjIwMDAwCiszMiAxIDEyNjQwMDAwCiszMiAxIDEyNjYwMDAwCiszMiAxIDEyNjgwMDAwCiszMiAxIDEyNzAwMDAwCiszMiAxIDEyNzIwMDAwCiszMiAxIDEyNzQwMDAwCiszMiAxIDEyNzYwMDAwCiszMiAxIDEyNzgwMDAwCiszMiAxIDEyODAwMDAwCiszMiAxIDEyODIwMDAwCiszMiAxIDEyODQwMDAwCiszMiAxIDEyODYwMDAwCiszMiAxIDEyODgwMDAwCiszMiAxIDEyOTAwMDAwCiszMiAxIDEyOTIwMDAwCiszMiAxIDEyOTQwMDAwCiszMiAxIDEyOTYwMDAwCiszMiAxIDEyOTgwMDAwCiszMiAxIDEzMDAwMDAwCiszMiAxIDEzMDIwMDAwCiszMiAxIDEzMDQwMDAwCiszMiAxIDEzMDYwMDAwCiszMiAxIDEzMDgwMDAwCiszMiAxIDEzMTAwMDAwCiszMiAxIDEzMTIwMDAwCiszMiAxIDEzMTQwMDAwCiszMiAxIDEzMTYwMDAwCiszMiAxIDEzMTgwMDAwCiszMiAxIDEzMjAwMDAwCiszMiAxIDEzMjIwMDAwCiszMiAxIDEzMjQwMDAwCiszMiAxIDEzMjYwMDAwCiszMiAxIDEzMjgwMDAwCiszMiAxIDEzMzAwMDAwCiszMiAxIDEzMzIwMDAwCiszMiAxIDEzMzQwMDAwCiszMiAxIDEzMzYwMDAwCiszMiAxIDEzMzgwMDAwCiszMiAxIDEzNDAwMDAwCiszMiAxIDEzNDIwMDAwCiszMiAxIDEzNDQwMDAwCiszMiAxIDEzNDYwMDAwCiszMiAxIDEzNDgwMDAwCiszMiAxIDEzNTAwMDAwCiszMiAxIDEzNTIwMDAwCiszMiAxIDEzNTQwMDAwCiszMiAxIDEzNTYwMDAwCiszMiAxIDEzNTgwMDAwCiszMiAxIDEzNjAwMDAwCiszMiAxIDEzNjIwMDAwCiszMiAxIDEzNjQwMDAwCiszMiAxIDEzNjYwMDAwCiszMiAxIDEzNjgwMDAwCiszMiAxIDEzNzAwMDAwCiszMiAxIDEzNzIwMDAwCiszMiAxIDEzNzQwMDAwCiszMiAxIDEzNzYwMDAwCiszMiAxIDEzNzgwMDAwCiszMiAxIDEzODAwMDAwCiszMiAxIDEzODIwMDAwCiszMiAxIDEzODQwMDAwCiszMiAxIDEzODYwMDAwCiszMiAxIDEzODgwMDAwCiszMiAxIDEzOTAwMDAwCiszMiAxIDEzOTIwMDAwCiszMiAxIDEzOTQwMDAwCiszMiAxIDEzOTYwMDAwCiszMiAxIDEzOTgwMDAwCiszMiAxIDE0MDAwMDAwCiszMiAxIDE0MDIwMDAwCiszMiAxIDE0MDQwMDAwCiszMiAxIDE0MDYwMDAwCiszMiAxIDE0MDgwMDAwCiszMiAxIDE0MTAwMDAwCiszMiAxIDE0MTIwMDAwCiszMiAxIDE0MTQwMDAwCiszMiAxIDE0MTYwMDAwCiszMiAxIDE0MTgwMDAwCiszMiAxIDE0MjAwMDAwCiszMiAxIDE0MjIwMDAwCiszMiAxIDE0MjQwMDAwCiszMiAxIDE0MjYwMDAwCiszMiAxIDE0MjgwMDAwCiszMiAxIDE0MzAwMDAwCiszMiAxIDE0MzIwMDAwCiszMiAxIDE0MzQwMDAwCiszMiAxIDE0MzYwMDAwCiszMiAxIDE0MzgwMDAwCiszMiAxIDE0NDAwMDAwCiszMiAxIDE0NDIwMDAwCiszMiAxIDE0NDQwMDAwCiszMiAxIDE0NDYwMDAwCiszMiAxIDE0NDgwMDAwCiszMiAxIDE0NTAwMDAwCiszMiAxIDE0NTIwMDAwCiszMiAxIDE0NTQwMDAwCiszMiAxIDE0NTYwMDAwCiszMiAxIDE0NTgwMDAwCiszMiAxIDE0NjAwMDAwCiszMiAxIDE0NjIwMDAwCiszMiAxIDE0NjQwMDAwCiszMiAxIDE0NjYwMDAwCiszMiAxIDE0NjgwMDAwCiszMiAxIDE0NzAwMDAwCiszMiAxIDE0NzIwMDAwCiszMiAxIDE0NzQwMDAwCiszMiAxIDE0NzYwMDAwCiszMiAxIDE0NzgwMDAwCiszMiAxIDE0ODAwMDAwCiszMiAxIDE0ODIwMDAwCiszMiAxIDE0ODQwMDAwCiszMiAxIDE0ODYwMDAwCiszMiAxIDE0ODgwMDAwCiszMiAxIDE0OTAwMDAwCiszMiAxIDE0OTIwMDAwCiszMiAxIDE0OTQwMDAwCiszMiAxIDE0OTYwMDAwCiszMiAxIDE0OTgwMDAwCiszMiAxIDE1MDAwMDAwCiszMiAxIDE1MDIwMDAwCiszMiAxIDE1MDQwMDAwCiszMiAxIDE1MDYwMDAwCiszMiAxIDE1MDgwMDAwCiszMiAxIDE1MTAwMDAwCiszMiAxIDE1MTIwMDAwCiszMiAxIDE1MTQwMDAwCiszMiAxIDE1MTYwMDAwCiszMiAxIDE1MTgwMDAwCiszMiAxIDE1MjAwMDAwCiszMiAxIDE1MjIwMDAwCiszMiAxIDE1MjQwMDAwCiszMiAxIDE1MjYwMDAwCiszMiAxIDE1MjgwMDAwCiszMiAxIDE1MzAwMDAwCiszMiAxIDE1MzIwMDAwCiszMiAxIDE1MzQwMDAwCiszMiAxIDE1MzYwMDAwCiszMiAxIDE1MzgwMDAwCiszMiAxIDE1NDAwMDAwCiszMiAxIDE1NDIwMDAwCiszMiAxIDE1NDQwMDAwCiszMiAxIDE1NDYwMDAwCiszMiAxIDE1NDgwMDAwCiszMiAxIDE1NTAwMDAwCiszMiAxIDE1NTIwMDAwCiszMiAxIDE1NTQwMDAwCiszMiAxIDE1NTYwMDAwCiszMiAxIDE1NTgwMDAwCiszMiAxIDE1NjAwMDAwCiszMiAxIDE1NjIwMDAwCiszMiAxIDE1NjQwMDAwCiszMiAxIDE1NjYwMDAwCiszMiAxIDE1NjgwMDAwCiszMiAxIDE1NzAwMDAwCiszMiAxIDE1NzIwMDAwCiszMiAxIDE1NzQwMDAwCiszMiAxIDE1NzYwMDAwCiszMiAxIDE1NzgwMDAwCiszMiAxIDE1ODAwMDAwCiszMiAxIDE1ODIwMDAwCiszMiAxIDE1ODQwMDAwCiszMiAxIDE1ODYwMDAwCiszMiAxIDE1ODgwMDAwCiszMiAxIDE1OTAwMDAwCiszMiAxIDE1OTIwMDAwCiszMiAxIDE1OTQwMDAwCiszMiAxIDE1OTYwMDAwCiszMiAxIDE1OTgwMDAwCiszMiAxIDE2MDAwMDAwCiszMiAxIDE2MDIwMDAwCiszMiAxIDE2MDQwMDAwCiszMiAxIDE2MDYwMDAwCiszMiAxIDE2MDgwMDAwCiszMiAxIDE2MTAwMDAwCiszMiAxIDE2MTIwMDAwCiszMiAxIDE2MTQwMDAwCiszMiAxIDE2MTYwMDAwCiszMiAxIDE2MTgwMDAwCiszMiAxIDE2MjAwMDAwCiszMiAxIDE2MjIwMDAwCiszMiAxIDE2MjQwMDAwCiszMiAxIDE2MjYwMDAwCiszMiAxIDE2MjgwMDAwCiszMiAxIDE2MzAwMDAwCiszMiAxIDE2MzIwMDAwCiszMiAxIDE2MzQwMDAwCiszMiAxIDE2MzYwMDAwCiszMiAxIDE2MzgwMDAwCiszMiAxIDE2NDAwMDAwCiszMiAxIDE2NDIwMDAwCiszMiAxIDE2NDQwMDAwCiszMiAxIDE2NDYwMDAwCiszMiAxIDE2NDgwMDAwCiszMiAxIDE2NTAwMDAwCiszMiAxIDE2NTIwMDAwCiszMiAxIDE2NTQwMDAwCiszMiAxIDE2NTYwMDAwCiszMiAxIDE2NTgwMDAwCiszMiAxIDE2NjAwMDAwCiszMiAxIDE2NjIwMDAwCiszMiAxIDE2NjQwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTdlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vQW5kcm9pZC5icApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZ0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcCJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmY2I2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcApAQCAtMCwwICsxLDg5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyX2hpZGxfaGFsX3ZpZGVvX2RlY190ZXN0IgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl92aWRlb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdHJ1Y3QgRnJhbWVJbmZvIHsKKyAgICBpbnQgYnl0ZXNDb3VudDsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsKK307CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRGVjSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRGVjSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzIiLCBtcGVnMn0sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sIHsiYXYxIiwgYXYxfSwKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3Vic3RyaW5nOworICAgICAgICBzdGQ6OnN0cmluZyBjb21wOworICAgICAgICBzdWJzdHJpbmcgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIC8qIFRPRE86IGJldHRlciBhcHByb2FjaCB0byBmaW5kIHRoZSBjb21wb25lbnQgKi8KKyAgICAgICAgLyogImMyLmFuZHJvaWQuIiA9PiAxMXRoIHBvc2l0aW9uICovCisgICAgICAgIHNpemVfdCBwb3MgPSAxMTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN1YnN0cmluZy5maW5kKCIuZGVjb2RlciIsIHBvcyk7CisgICAgICAgIGNvbXAgPSBzdWJzdHJpbmcuc3Vic3RyKHBvcywgbGVuIC0gcG9zKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtVGltZXN0YW1wVXMgPSAwdTsKKyAgICAgICAgbVRpbWVzdGFtcERldlRlc3QgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKworICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIEZvciBkZWNvZGVyIGNvbXBvbmVudHMgY3VycmVudCB0aW1lc3RhbXAgYWx3YXlzIGV4Y2VlZHMKKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDApOworICAgICAgICAgICAgICAgIGlmICghY29kZWNDb25maWcgJiYKKyAgICAgICAgICAgICAgICAgICAgIXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0dFKAorICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKworICAgICAgICAgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHNIaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGl0ID0gbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG1UaW1lc3RhbXBVc2xpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKml0ID09IG1UaW1lc3RhbXBVcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNIaXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0c0hpdCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHRzSGl0LCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRpbWVTdGFtcCBub3QgcmVjb2duaXplZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgSU5GTyAgIF0gUmVjZWl2ZWQgbm9uLXplcm8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCAvIFRpbWVTdGFtcCBub3QgcmVjb2duaXplZCBcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgbUNzZDsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbUNzZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgaDI2MywKKyAgICAgICAgYXZjLAorICAgICAgICBtcGVnMiwKKyAgICAgICAgbXBlZzQsCisgICAgICAgIGhldmMsCisgICAgICAgIHZwOCwKKyAgICAgICAgdnA5LAorICAgICAgICBhdjEsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7CisgICAgdWludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbVRpbWVzdGFtcFVzbGlzdDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KK307CisKK3ZvaWQgdmFsaWRhdGVDb21wb25lbnQoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGl0cyBub3QgYW4gZW5jb2RlciBhbmQgdGhlIGNvbXBvbmVudCB0byBiZSB0ZXN0ZWQgaXMgdmlkZW8KKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBEZWNvZGVyLCBnaXZlbiBFbmNvZGVyIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBjMmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXREb21haW4gPQorICAgICAgICAgICAgKChDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0RG9tYWluLmZpbmQoInZpZGVvLyIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgVmlkZW8gQ29tcG9uZW50Iik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKKyAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7CisgICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOworfQorCisvLyBudW1iZXIgb2YgZWxlbWVudGFyeSBzdHJlYW1zIHBlciBjb21wb25lbnQKKyNkZWZpbmUgU1RSRUFNX0NPVU5UIDIKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogaW5mbywgc2l6ZV90IHN0cmVhbUluZGV4ID0gMSkgeworICAgIHN0cnVjdCBDb21wVG9VUkwgeworICAgICAgICBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKKyAgICAgICAgY29uc3QgY2hhciBtVVJMW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICAgICAgY29uc3QgY2hhciBpbmZvW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICB9OworICAgIEFTU0VSVF9UUlVFKHN0cmVhbUluZGV4IDwgU1RSRUFNX0NPVU5UKTsKKworICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0geworICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphdmMsCisgICAgICAgICB7ImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQiLAorICAgICAgICAgICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0In0sCisgICAgICAgICB7ImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpoZXZjLAorICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyIsCisgICAgICAgICAgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YyJ9LAorICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXBlZzIsCisgICAgICAgICB7ImJiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2IiwKKyAgICAgICAgICAiYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2In0sCisgICAgICAgICB7ImJiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmgyNjMsCisgICAgICAgICB7IiIsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyJ9LAorICAgICAgICAgeyIiLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om1wZWc0LAorICAgICAgICAgeyIiLCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYifSwKKyAgICAgICAgIHsiIiwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dnA4LAorICAgICAgICAgeyJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgiLAorICAgICAgICAgICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4In0sCisgICAgICAgICB7ImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dnA5LAorICAgICAgICAgeyJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkiLAorICAgICAgICAgICJiYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5In0sCisgICAgICAgICB7ImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YXYxLAorICAgICAgICAgeyJiYmJfYXYxXzY0MF8zNjAuYXYxIiwKKyAgICAgICAgICAiYmJiX2F2MV8xNzZfMTQ0LmF2MSJ9LAorICAgICAgICAgeyJiYmJfYXYxXzY0MF8zNjAuaW5mbyIsCisgICAgICAgICAgImJiYl9hdjFfMTc2XzE0NC5pbmZvIn19LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrQ29tcFRvVVJMKSAvIHNpemVvZihrQ29tcFRvVVJMWzBdKTsgKytpKSB7CisgICAgICAgIGlmIChrQ29tcFRvVVJMW2ldLmNvbXAgPT0gY29tcCkgeworICAgICAgICAgICAgc3RyY2F0KG1VUkwsIGtDb21wVG9VUkxbaV0ubVVSTFtzdHJlYW1JbmRleF0pOworICAgICAgICAgICAgc3RyY2F0KGluZm8sIGtDb21wVG9VUkxbaV0uaW5mb1tzdHJlYW1JbmRleF0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGRlY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBsaW5lYXJQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiogSW5mbywKKyAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgcmFuZ2UsIGJvb2wgc2lnbmFsRU9TID0gdHJ1ZSkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBpbnQgZnJhbWVJRCA9IG9mZnNldDsKKyAgICBpbnQgbWF4UmV0cnkgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChmcmFtZUlEID09IChpbnQpSW5mby0+c2l6ZSgpIHx8IGZyYW1lSUQgPT0gKG9mZnNldCArIHJhbmdlKSkgYnJlYWs7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICAgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3b3JrICYmIChtYXhSZXRyeSA+PSBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wID0gKCpJbmZvKVtmcmFtZUlEXS50aW1lc3RhbXA7CisgICAgICAgIGlmICgoKkluZm8pW2ZyYW1lSURdLmZsYWdzKSBmbGFncyA9ICgxIDw8ICgoKkluZm8pW2ZyYW1lSURdLmZsYWdzIC0gMSkpOworICAgICAgICBpZiAoc2lnbmFsRU9TICYmICgoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSAtIDEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSAtIDEpKSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworCisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNpemUgPSAoKkluZm8pW2ZyYW1lSURdLmJ5dGVzQ291bnQ7CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopbWFsbG9jKHNpemUpOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cik7CisKKyAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgc2l6ZSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIHNpemUpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywKKyAgICAgICAgICAgICAgICAgICAgbGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZibG9jaykpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworCisgICAgICAgICAgICAvLyBXcml0ZSBWaWV3CisgICAgICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3Qpc2l6ZSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwdSwgdmlldy5vZmZzZXQoKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LnNpemUoKSk7CisKKyAgICAgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICAvLyBETyBUSEUgREVDT0RJTkcKKyAgICAgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgICAgICBBTE9HVigiRnJhbWUgIyVkIHNpemUgPSAlZCBxdWV1ZWQiLCBmcmFtZUlELCBzaXplKTsKKyAgICAgICAgZnJhbWVJRCsrOworICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgfQorfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCB2aWRlbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCitjbGFzcyBDb2RlYzJWaWRlb0RlY0RlY29kZVRlc3QKKyAgICA6IHB1YmxpYyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjxpbnQzMl90LCBib29sPj4geworfTsKKworLy8gQml0c3RyZWFtIFRlc3QKK1RFU1RfUChDb2RlYzJWaWRlb0RlY0RlY29kZVRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdWludDMyX3Qgc3RyZWFtSW5kZXggPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIGJvb2wgc2lnbmFsRU9TID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8sIHN0cmVhbUluZGV4KTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwIDogMDsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0ICYmICFjb2RlY0NvbmZpZykKKyAgICAgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QucHVzaF9iYWNrKHRpbWVzdGFtcCk7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgLy8gUmVzZXQgdG90YWwgbm8gb2YgZnJhbWVzIHJlY2VpdmVkCisgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICBtVGltZXN0YW1wVXMgPSAwOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCksIHNpZ25hbEVPUykpOworCisgICAgLy8gSWYgRU9TIGlzIG5vdCBzZW50LCBzZW5kaW5nIGVtcHR5IGlucHV0IHdpdGggRU9TIGZsYWcKKyAgICBzaXplX3QgaW5mb1NpemUgPSBJbmZvLnNpemUoKTsKKyAgICBpZiAoIXNpZ25hbEVPUykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgdGVzdElucHV0QnVmZmVyKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgZmFsc2UpKTsKKyAgICAgICAgaW5mb1NpemUgKz0gMTsKKyAgICB9CisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIGlmICghbUVvcykgeworICAgICAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIH0KKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gaW5mb1NpemUpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HVigiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgaW5mb1NpemUpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSBFWFBFQ1RfRVEobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisvLyBEZWNvZGVUZXN0IHdpdGggU3RyZWFtSW5kZXggYW5kIEVPUyAvIE5vIEVPUworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyZWFtSW5kZXhBbmRFT1MsIENvZGVjMlZpZGVvRGVjRGVjb2RlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDAsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMSwgdHJ1ZSkpKTsKKworLy8gQWRhcHRpdmUgVGVzdAorVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEFkYXB0aXZlRGVjb2RlVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJBZGFwdGl2ZSBEZWNvZGUgVGVzdCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBpZiAoIShtQ29tcE5hbWUgPT0gYXZjIHx8IG1Db21wTmFtZSA9PSBoZXZjIHx8IG1Db21wTmFtZSA9PSB2cDggfHwKKyAgICAgICAgICBtQ29tcE5hbWUgPT0gdnA5IHx8IG1Db21wTmFtZSA9PSBtcGVnMikpCisgICAgICAgIHJldHVybjsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOworICAgIHVpbnQzMl90IHRpbWVzdGFtcE9mZnNldCA9IDA7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBTVFJFQU1fQ09VTlQgKiAyOyBpKyspIHsKKyAgICAgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICAgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICAgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgICAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8sIGkgJSBTVFJFQU1fQ09VTlQpOworCisgICAgICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXBNYXggPSAwOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgICAgICB0aW1lc3RhbXAgKz0gdGltZXN0YW1wT2Zmc2V0OworICAgICAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QucHVzaF9iYWNrKHRpbWVzdGFtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGltZXN0YW1wTWF4IDwgdGltZXN0YW1wKSB0aW1lc3RhbXBNYXggPSB0aW1lc3RhbXA7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wT2Zmc2V0ID0gdGltZXN0YW1wTWF4OworICAgICAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICAgICAgLy8gUmVzZXQgVG90YWwgZnJhbWVzIGJlZm9yZSBzZWNvbmQgZGVjb2RlIGxvb3AKKyAgICAgICAgLy8gbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgICAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgKGludCkoSW5mby5zaXplKCkgLSBvZmZzZXQpLCBmYWxzZSkpOworCisgICAgICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBvZmZzZXQgPSAoaW50KUluZm8uc2l6ZSgpOworICAgIH0KKworICAgIC8vIFNlbmQgRU9TCisgICAgLy8gVE9ETyBBZGQgZnVuY3Rpb24gdG8gc2VuZCBFT1Mgd29yayBpdGVtCisgICAgaW50IG1heFJldHJ5ID0gMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQUxPR1YoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9ICgoSW5mby5zaXplKCkpICsgMSkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HVigiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkgKyAxKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgRVhQRUNUX0VRKG1UaW1lc3RhbXBVc2xpc3QuZW1wdHkoKSwgdHJ1ZSk7Cit9CisKKy8vIHRodW1ibmFpbCB0ZXN0CitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgVGh1bWJuYWlsVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIHRodW1ibmFpbCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9JVEVSQVRJT05TOyBpKyspIHsKKyAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgICAgICAvLyByZXF1ZXN0IEVPUyBmb3IgdGh1bWJuYWlsCisgICAgICAgIC8vIHNpZ25hbCBFT1MgZmxhZyB3aXRoIGxhc3QgZnJhbWUKKyAgICAgICAgc2l6ZV90IGogPSAtMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKEluZm9bal0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9bal0uZmxhZ3MgLSAxKTsKKworICAgICAgICB9IHdoaWxlICghKGZsYWdzICYgU1lOQ19GUkFNRSkpOworICAgICAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBqICsgMSkpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBFWFBFQ1RfR0UobUZyYW1lc1JlY2VpdmVkLCAxVSk7CisgICAgICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVsZWFzZSgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAvLyBQcmVwYXJlIEMyV29yaworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAibVdvcmtRdWV1ZSBFbXB0eSBhdCB0aGUgc3RhcnQgb2YgdGVzdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworCisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmIChtV29ya1F1ZXVlLnNpemUoKSAhPSBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Xb3JrUXVldWUuc2l6ZSgpLCAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgRmx1c2ggY2FsbHMiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAvLyBEZWNvZGUgMTI4IGZyYW1lcyBhbmQgZmx1c2guIGhlcmUgMTI4IGlzIGNob3NlbiB0byBlbnN1cmUgdGhlcmUgaXMgYSBrZXkKKyAgICAvLyBmcmFtZSBhZnRlciB0aGlzIHNvIHRoYXQgdGhlIGJlbG93IHNlY3Rpb24gY2FuIGJlIGNvdmVyZWQgZm9yIGFsbAorICAgIC8vIGNvbXBvbmVudHMKKyAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMTI4OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgbnVtRnJhbWVzRmx1c2hlZCwgZmFsc2UpKTsKKyAgICAvLyBmbHVzaAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKworICAgIHsKKyAgICAgICAgLy8gVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgYXV0byBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBTZWVrIHRvIG5leHQga2V5IGZyYW1lIGFuZCBzdGFydCBkZWNvZGluZyB0aWxsIHRoZSBlbmQKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBpbnQgaW5kZXggPSBudW1GcmFtZXNGbHVzaGVkOworICAgIGJvb2wga2V5RnJhbWUgPSBmYWxzZTsKKyAgICBmbGFncyA9IDA7CisgICAgd2hpbGUgKGluZGV4IDwgKGludClJbmZvLnNpemUoKSkgeworICAgICAgICBpZiAoSW5mb1tpbmRleF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9baW5kZXhdLmZsYWdzIC0gMSk7CisgICAgICAgIGlmICgoZmxhZ3MgJiBTWU5DX0ZSQU1FKSA9PSBTWU5DX0ZSQU1FKSB7CisgICAgICAgICAgICBrZXlGcmFtZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIGVsZVN0cmVhbS5pZ25vcmUoSW5mb1tpbmRleF0uYnl0ZXNDb3VudCk7CisgICAgICAgIGluZGV4Kys7CisgICAgfQorICAgIGlmIChrZXlGcmFtZSkgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGRlY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClJbmZvLnNpemUoKSAtIGluZGV4KSk7CisgICAgfQorICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvLyBVcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUZsdXNoZWRJbmRpY2VzLmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIERlY29kZVRlc3RFbXB0eUJ1ZmZlcnNJbnNlcnRlZCkgeworICAgIGRlc2NyaXB0aW9uKCJEZWNvZGUgd2l0aCBtdWx0aXBsZSBlbXB0eSBpbnB1dCBmcmFtZXMiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmcmFtZUlkID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gZmFsc2U7CisgICAgLy8gVGhpcyB0ZXN0IGludHJvZHVjZXMgZW1wdHkgQ1NEIGFmdGVyIGV2ZXJ5IDIwdGggZnJhbWUKKyAgICAvLyBhbmQgZW1wdHkgaW5wdXQgZnJhbWVzIGF0IGFuIGludGVydmFsIG9mIDUgZnJhbWVzLgorICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGZyYW1lSWQgJSA1KSkgeworICAgICAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDIwKSkgZmxhZ3MgPSAzMjsKKyAgICAgICAgICAgIGVsc2UgZmxhZ3MgPSAwOworICAgICAgICAgICAgYnl0ZXNDb3VudCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDAgOiAwOworICAgICAgICB9CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgICAgIGZyYW1lSWQrKzsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBJbmZvLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworLy8gVE9ETyA6IFZpZGVvIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gVGVzdAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczZGM4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcApAQCAtMCwwICsxLDY0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyX2hpZGxfaGFsX3ZpZGVvX2VuY190ZXN0IgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl92aWRlb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitjbGFzcyBHcmFwaGljQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgR3JhcGhpY0J1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaykKKyAgICAgIDogQzJCdWZmZXIoe2Jsb2NrLT5zaGFyZShDMlJlY3QoYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBWaWRlbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJWaWRlb0VuY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUdyYXBoaWNBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1HcmFwaGljUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1HcmFwaGljQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtR3JhcGhpY1Bvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7ImgyNjMiLCBoMjYzfSwgeyJhdmMiLCBhdmN9LCB7Im1wZWc0IiwgbXBlZzR9LAorICAgICAgICAgICAgeyJoZXZjIiwgaGV2Y30sIHsidnA4IiwgdnA4fSwgeyJ2cDkiLCB2cDl9LAorICAgICAgICB9OworCisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBzdWJzdHJpbmc7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXA7CisgICAgICAgIHN1YnN0cmluZyA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgLyogVE9ETzogYmV0dGVyIGFwcHJvYWNoIHRvIGZpbmQgdGhlIGNvbXBvbmVudCAqLworICAgICAgICAvKiAiYzIuYW5kcm9pZC4iID0+IDExdGggcG9zaXRpb24gKi8KKyAgICAgICAgc2l6ZV90IHBvcyA9IDExOworICAgICAgICBzaXplX3QgbGVuID0gc3Vic3RyaW5nLmZpbmQoIi5lbmNvZGVyIiwgcG9zKTsKKyAgICAgICAgY29tcCA9IHN1YnN0cmluZy5zdWJzdHIocG9zLCBsZW4gLSBwb3MpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgbUZhaWxlZFdvcmtSZWNlaXZlZCA9IDA7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICBib29sIHNldHVwQ29uZmlnUGFyYW0oaW50MzJfdCBuV2lkdGgsIGludDMyX3QgbkhlaWdodCk7CisKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAod29yay0+cmVzdWx0ICE9IEMyX09LKSBtRmFpbGVkV29ya1JlY2VpdmVkKys7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBzdGFuZGFyZENvbXAgeworICAgICAgICBoMjYzLAorICAgICAgICBhdmMsCisgICAgICAgIG1wZWc0LAorICAgICAgICBoZXZjLAorICAgICAgICB2cDgsCisgICAgICAgIHZwOSwKKyAgICAgICAgdW5rbm93bl9jb21wLAorICAgIH07CisKKyAgICBib29sIG1Fb3M7CisgICAgYm9vbCBtQ3NkOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIGJvb2wgbUNvbmZpZzsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICB1aW50MzJfdCBtRmFpbGVkV29ya1JlY2VpdmVkOworCisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtR3JhcGhpY1Bvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtR3JhcGhpY0FsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyB2aWRlbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEVuY29kZXIsIGdpdmVuIERlY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgidmlkZW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBWaWRlbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK2Jvb2wgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdDo6c2V0dXBDb25maWdQYXJhbShpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCBpbnB1dFNpemUoMHUsIG5XaWR0aCwgbkhlaWdodCk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZpbnB1dFNpemV9OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIG1Db21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGZhaWx1cmVzLnNpemUoKSA9PSAwdSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KGNoYXIqIFVSTCkgeworICAgIHN0cmNhdChVUkwsICJiYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1diIpOworfQorCit2b2lkIGVuY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBncmFwaGljUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sIHVpbnQzMl90IGZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZyYW1lcywgdWludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgYm9vbCBmbHVzaGVkID0gZmFsc2UsYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworCisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIGludCBieXRlc0NvdW50ID0gbldpZHRoICogbkhlaWdodCAqIDMgPj4gMTsKKyAgICBpbnQzMl90IHRpbWVzdGFtcEluY3IgPSBFTkNPREVSX1RJTUVTVEFNUF9JTkNSRU1FTlQ7CisgICAgdWludDY0X3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAobkZyYW1lcyA9PSAwKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAobkZyYW1lcyA9PSAxKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIGlmIChmbHVzaGVkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBTWU5DX0ZSQU1FOworICAgICAgICAgICAgZmx1c2hlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBmcmFtZUlEOworICAgICAgICB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soZnJhbWVJRCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2MoYnl0ZXNDb3VudCk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKyAgICAgICAgbWVtc2V0KGRhdGEsIDAsIGJ5dGVzQ291bnQpOworICAgICAgICBpZiAoZWxlU3RyZWFtLmlzX29wZW4oKSkgeworICAgICAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmdjb3VudCgpLCBieXRlc0NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgICAgICBBU1NFUlRfRVEoCisgICAgICAgICAgICBDMl9PSywKKyAgICAgICAgICAgIGdyYXBoaWNQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwKKyAgICAgICAgICAgICAgICB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sICZibG9jaykpOworICAgICAgICBBU1NFUlRfVFJVRShibG9jayk7CisgICAgICAgIC8vIEdyYXBoaWMgVmlldworICAgICAgICBDMkdyYXBoaWNWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJHcmFwaGljQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCogcFkgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHVpbnQ4X3QqIHBVID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICB1aW50OF90KiBwViA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgICAgICBtZW1jcHkocFksIGRhdGEsIG5XaWR0aCAqIG5IZWlnaHQpOworICAgICAgICBtZW1jcHkocFUsIGRhdGEgKyBuV2lkdGggKiBuSGVpZ2h0LCAobldpZHRoICogbkhlaWdodCA+PiAyKSk7CisgICAgICAgIG1lbWNweShwViwgZGF0YSArIChuV2lkdGggKiBuSGVpZ2h0ICogNSA+PiAyKSwgbldpZHRoICogbkhlaWdodCA+PiAyKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBHcmFwaGljQnVmZmVyKGJsb2NrKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgZnJlZShkYXRhKTsKKworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICAvLyBETyBUSEUgRU5DT0RJTkcKKyAgICAgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgICAgICBBTE9HVigiRnJhbWUgIyVkIHNpemUgPSAlZCBxdWV1ZWQiLCBmcmFtZUlELCBieXRlc0NvdW50KTsKKyAgICAgICAgbkZyYW1lcy0tOworICAgICAgICB0aW1lc3RhbXAgKz0gdGltZXN0YW1wSW5jcjsKKyAgICAgICAgZnJhbWVJRCsrOworICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgfQorfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCB2aWRlbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCitjbGFzcyBDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QgOiBwdWJsaWMgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxib29sPiB7Cit9OworCitURVNUX1AoQ29kZWMyVmlkZW9FbmNFbmNvZGVUZXN0LCBFbmNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkVuY29kZXMgaW5wdXQgZmlsZSIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIGJvb2wgc2lnbmFsRU9TID0gR2V0UGFyYW0oKTsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgZmlsZSBub3QgZm91bmQiOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKworICAgIGlmICghc2V0dXBDb25maWdQYXJhbShuV2lkdGgsIG5IZWlnaHQpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCBFTkNfTlVNX0ZSQU1FUywgbldpZHRoLCBuSGVpZ2h0LCBmYWxzZSwgc2lnbmFsRU9TKSk7CisKKyAgICAvLyBJZiBFT1MgaXMgbm90IHNlbnQsIHNlbmRpbmcgZW1wdHkgaW5wdXQgd2l0aCBFT1MgZmxhZworICAgIHVpbnQzMl90IGlucHV0RnJhbWVzID0gRU5DX05VTV9GUkFNRVM7CisgICAgaWYgKCFzaWduYWxFT1MpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgMSkpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHRlc3RJbnB1dEJ1ZmZlcihtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIGZhbHNlKSk7CisgICAgICAgIGlucHV0RnJhbWVzICs9IDE7CisgICAgfQorCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFMT0dEKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBpbnB1dEZyYW1lcykgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJWQiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIGlucHV0RnJhbWVzKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmICghbUNzZCAmJiAobUNvbXBOYW1lICE9IHZwOCAmJiBtQ29tcE5hbWUgIT0gdnA5KSkgeworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIkNTRCBCdWZmZXIgbm90IHJlY2VpdmVkIjsKKyAgICB9CisKKyAgICBpZiAobUNzZCAmJiAobUNvbXBOYW1lID09IHZwOCB8fCBtQ29tcE5hbWUgPT0gdnA5KSkgeworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIkNTRCBCdWZmZXIgbm90IGV4cGVjdGVkIjsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKKy8vIEVuY29kZVRlc3Qgd2l0aCBFT1MgLyBObyBFT1MKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEVuY29kZVRlc3R3aXRoRU9TLCBDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyh0cnVlLCBmYWxzZSkpOworCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibVdvcmtRdWV1ZSBFbXB0eSBpcyBub3QgZXhwZWN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0Iik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IG1Xb3JrUXVldWUuc2l6ZSgpOworICAgICAgICBpZiAocXVldWVTaXplIDwgTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIGZsdXNoIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCk7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMDsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSBFTkNfTlVNX0ZSQU1FUzsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgbnVtRnJhbWVzRmx1c2hlZCwgbldpZHRoLCBuSGVpZ2h0KSk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzRmx1c2hlZCwgbnVtRnJhbWVzIC0gbnVtRnJhbWVzRmx1c2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIHRydWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgSW52YWxpZEJ1ZmZlclRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZmVlZGluZyBsYXJnZXIvc21hbGxlciBpbnB1dCBidWZmZXIiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIC8gMjsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgLyAyOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgbldpZHRoLCBuSGVpZ2h0LCBmYWxzZSwgZmFsc2UpKTsKKworICAgIC8vIEZlZWQgbGFyZ2VyIGlucHV0IGJ1ZmZlci4KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAxLCAxLCBuV2lkdGgqMiwgbkhlaWdodCoyLCBmYWxzZSwgZmFsc2UpKTsKKworICAgIC8vIEZlZWQgc21hbGxlciBpbnB1dCBidWZmZXIuCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgbldpZHRoLzIsIG5IZWlnaHQvMiwgZmFsc2UsIHRydWUpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gMykgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogMyIsIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobUZhaWxlZFdvcmtSZWNlaXZlZCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBmYWlsZWQgZnJhbWUgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZhaWxlZEZyYW1lc1JlY2VpdmVkIDogJWQiLCBtRmFpbGVkV29ya1JlY2VpdmVkKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworY2xhc3MgQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCA6IHB1YmxpYyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+ID4geworfTsKKworVEVTVF9QKENvZGVjMlZpZGVvRW5jUmVzb2x1dGlvblRlc3QsIFJlc29sdXRpb25UZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGVuY29kaW5nIGF0IGRpZmZlcmVudCByZXNvbHV0aW9ucyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGludDMyX3QgbldpZHRoID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HRCgiVHJ5aW5nIGVuY29kZSBmb3Igd2lkdGggJWQgaGVpZ2h0ICVkIiwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBtRW9zID0gZmFsc2U7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5QVVRfQlVGRkVSUywgbldpZHRoLCBuSGVpZ2h0KSk7CisKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZFNpemVzLCBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0LCA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICBzdGQ6Om1ha2VfcGFpcig1MiwgMTgpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDM2NSwgMzY1KSwKKyAgICBzdGQ6Om1ha2VfcGFpcig0ODQsIDM2MiksCisgICAgc3RkOjptYWtlX3BhaXIoMjQ0LCA0ODgpKSk7CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ1NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9WSURFT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfVklERU9fSElETF9URVNUX0NPTU1PTl9ICisKKyNkZWZpbmUgRU5DT0RFUl9USU1FU1RBTVBfSU5DUkVNRU5UIDQwMDAwCisjZGVmaW5lIEVOQ19OVU1fRlJBTUVTIDMyCisjZGVmaW5lIEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIDM1MgorI2RlZmluZSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgMjg4CisjZGVmaW5lIE1BWF9JVEVSQVRJT05TIDEyOAorCisvKgorICogQ29tbW9uIHZpZGVvIHV0aWxzCisgKi8KKworCisjZW5kaWYgIC8vIE1FRElBX0MyX1ZJREVPX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmE0OThkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOCBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jbGllbnQiLAorCisgICAgc3JjczogWworICAgICAgICAiY2xpZW50LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgXSwKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMmU1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcApAQCAtMCwwICsxLDEzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQ2xpZW50IgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBjMl9zdGF0dXNfdCB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGh3YmluZGVyIHRyYW5zYWN0aW9uIGZhaWx1cmUuCitjb25zdGV4cHIgYzJfc3RhdHVzX3QgQzJfVFJBTlNBQ1RJT05fRkFJTEVEID0gQzJfQ09SUlVQVEVEOworCisvLyBMaXN0IG9mIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcyBpbiB0aGUgZGVjcmVhc2luZyBvcmRlciBvZiBwcmVmZXJlbmNlLgorY29uc3RleHByIGNvbnN0IGNoYXIqIGtDbGllbnROYW1lc1tdID0geworICAgICAgICAiZGVmYXVsdCIsCisgICAgICAgICJzb2Z0d2FyZSIsCisgICAgfTsKKworLy8gTnVtYmVyIG9mIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4KK2NvbnN0ZXhwciBzaXplX3Qga051bUNsaWVudHMgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrQ2xpZW50TmFtZXMpPjo6dmFsdWU7CisKK3R5cGVkZWYgc3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piwga051bUNsaWVudHM+IENsaWVudExpc3Q7CisKKy8vIENvbnZlbmllbmNlIG1ldGhvZHMgdG8gb2J0YWluIGtub3duIGNsaWVudHMuCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBnZXRDbGllbnQoc2l6ZV90IGluZGV4KSB7CisgICAgdWludDMyX3Qgc2VydmljZU1hc2sgPSA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJkZWJ1Zy5tZWRpYS5jb2RlYzIiLCB1aW50MzJfdCgwKSk7CisgICAgcmV0dXJuIENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBrQ2xpZW50TmFtZXNbaW5kZXhdLAorICAgICAgICAgICAgKHNlcnZpY2VNYXNrICYgKDEgPDwgaW5kZXgpKSAhPSAwKTsKK30KKworQ2xpZW50TGlzdCBnZXRDbGllbnRMaXN0KCkgeworICAgIENsaWVudExpc3QgbGlzdDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbGlzdFtpXSA9IGdldENsaWVudChpKTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK30gLy8gdW5uYW1lZAorCisvLyBDb2RlYzJDb25maWd1cmFibGVDbGllbnQKKworY29uc3QgQzJTdHJpbmcmIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5hbWU7Cit9CisKK0NvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Q29kZWMyQ29uZmlndXJhYmxlQ2xpZW50KAorICAgICAgICBjb25zdCBzcDxJQ29uZmlndXJhYmxlPiYgYmFzZSkKKyAgICAgIDogbUJhc2V7YmFzZX0sCisgICAgICAgIG1OYW1le1tiYXNlXSgpIC0+IEMyU3RyaW5nIHsKKyAgICAgICAgICAgICAgICBDMlN0cmluZyBvdXROYW1lOworICAgICAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UtPmdldE5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBbJm91dE5hbWVdKGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TmFtZSA9IG5hbWUuY19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1N0YXR1cy5pc09rKCkgPyBvdXROYW1lIDogIiI7CisgICAgICAgICAgICB9KCl9IHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygKKyAgICAgICAgICAgIHN0YWNrUGFyYW1zLnNpemUoKSArIGhlYXBQYXJhbUluZGljZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgbnVtSW5kaWNlcyA9IDA7CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgc3RhY2tQYXJhbSA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgIGlmICghc3RhY2tQYXJhbSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSBudWxsIHN0YWNrIHBhcmFtIGVuY291bnRlcmVkLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRpY2VzW251bUluZGljZXMrK10gPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzdGFja1BhcmFtLT5pbmRleCgpKTsKKyAgICB9CisgICAgc2l6ZV90IG51bVN0YWNrSW5kaWNlcyA9IG51bUluZGljZXM7CisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCYgaW5kZXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7CisgICAgfQorICAgIGluZGljZXMucmVzaXplKG51bUluZGljZXMpOworICAgIGlmIChoZWFwUGFyYW1zKSB7CisgICAgICAgIGhlYXBQYXJhbXMtPnJlc2VydmUoaGVhcFBhcmFtcy0+c2l6ZSgpICsgbnVtSW5kaWNlcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cXVlcnkoCisgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZudW1TdGFja0luZGljZXMsICZzdGFja1BhcmFtcywgaGVhcFBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBQYXJhbXMmIHApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBzdGF0dXMgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5IC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1Qb2ludGVyczsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmcGFyYW1Qb2ludGVycywgcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnkgLS0gZXJyb3Igd2hpbGUgcGFyc2luZyBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYXJhbVBvaW50ZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBwYXJhbVBvaW50ZXJzLmVuZCgpOyApIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICBpZiAobnVtU3RhY2tJbmRpY2VzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1udW1TdGFja0luZGljZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gbnVsbCBzdGFjayBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHN0YWNrUGFyYW1zLnNpemUoKSAmJiAhc3RhY2tQYXJhbXNbaV07ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IHN0YWNrUGFyYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5IC0tIHVuZXhwZWN0ZWQgZXJyb3IuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpICE9IHBhcmFtUG9pbnRlci0+aW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gcGFyYW0gc2tpcHBlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc1tpKytdLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW1zW2krK10tPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIHBhcmFtIHVwZGF0ZSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbVBvaW50ZXItPmluZGV4KCkgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIG51bGwgaGVhcCBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYXBQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgZXh0cmEgc3RhY2sgcGFyYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+ZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50Ojpjb25maWcoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgUGFyYW1zIGhpZGxQYXJhbXM7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZoaWRsUGFyYW1zLCBwYXJhbXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSBiYWQgaW5wdXQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25maWcoCisgICAgICAgICAgICBoaWRsUGFyYW1zLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZwYXJhbXMsIGZhaWx1cmVzXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtcyYgbykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29uZmlnIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBmYWlsdXJlcy0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGZhaWx1cmVzLT5yZXNpemUoaSArIGYuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNmIDogZikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmKCpmYWlsdXJlcylbaSsrXSwgc2YpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJjb25maWcgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW52YWxpZCBTZXR0aW5nUmVzdWx0IHJldHVybmVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF1cGRhdGVQYXJhbXNGcm9tQmxvYihwYXJhbXMsIG8pKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImZhaWxlZCB0byBwYXJzZSByZXR1cm5lZCBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIC8vIFRPRE86IENhY2hlIGFuZCBxdWVyeSBwcm9wZXJseSEKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1pbigpLAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpLAorICAgICAgICAgICAgWyZzdGF0dXMsIHBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbURlc2NyaXB0b3I+JiBwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gcGFyYW1zLT5zaXplKCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5yZXNpemUoaSArIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgc3AgOiBwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCYoKnBhcmFtcylbaSsrXSwgc3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIHJldHVybmVkIFBhcmFtRGVzY3JpcHRvci4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgeworICAgIGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGluRmllbGRzKGZpZWxkcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghb2JqY3B5KCZpbkZpZWxkc1tpXSwgZmllbGRzW2ldKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gYmFkIGlucHV0IjsKKyAgICAgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgaW5GaWVsZHMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJmluRmllbGRzLCAmZmllbGRzXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ+JiByKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyLnNpemUoKSAhPSBmaWVsZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgYW5kIG91dHB1dCBsaXN0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhdmUgZGlmZmVyZW50IHNpemVzLiI7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZmllbGRzW2ldLCBpbkZpZWxkc1tpXSwgcltpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmV0dXJuZWQgdmFsdWUuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvLyBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6SGlkbExpc3RlbmVyCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkhpZGxMaXN0ZW5lciA6IHB1YmxpYyBJQ29tcG9uZW50TGlzdGVuZXIgeworICAgIHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjp3ZWFrX3B0cjxMaXN0ZW5lcj4gYmFzZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uV29ya0RvbmUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtczsKKyAgICAgICAgaWYgKCFvYmpjcHkoJndvcmtJdGVtcywgd29ya0J1bmRsZSkpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uV29ya0RvbmUgLS0gcmVjZWl2ZWQgY29ycnVwdGVkIFdvcmtCdW5kbGUuIjsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBpbnB1dCBidWZmZXJzIHBvdGVudGlhbGx5IGhlbGQgYnkgdGhlIGNvbXBvbmVudCBmcm9tIHF1ZXVlCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gc3Ryb25nQ29tcG9uZW50ID0KKyAgICAgICAgICAgICAgICBjb21wb25lbnQubG9jaygpOworICAgICAgICBpZiAoc3Ryb25nQ29tcG9uZW50KSB7CisgICAgICAgICAgICBzdHJvbmdDb21wb25lbnQtPmhhbmRsZU9uV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lKGNvbXBvbmVudCwgd29ya0l0ZW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uV29ya0RvbmUgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4mIHNldHRpbmdSZXN1bHRzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMlNldHRpbmdSZXN1bHRzKAorICAgICAgICAgICAgICAgIHNldHRpbmdSZXN1bHRzLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2V0dGluZ1Jlc3VsdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+IGMyU2V0dGluZ1Jlc3VsdDsKKyAgICAgICAgICAgIGlmICghb2JqY3B5KCZjMlNldHRpbmdSZXN1bHQsIHNldHRpbmdSZXN1bHRzW2ldKSkgeworICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uVHJpcHBlZCAtLSByZWNlaXZlZCBjb3JydXB0ZWQgU2V0dGluZ1Jlc3VsdC4iOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMlNldHRpbmdSZXN1bHRzW2ldID0gc3RkOjptb3ZlKGMyU2V0dGluZ1Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25UcmlwcGVkKGNvbXBvbmVudCwgYzJTZXR0aW5nUmVzdWx0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvblRyaXBwZWQgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25FcnJvcihTdGF0dXMgcywgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIm9uRXJyb3IgLS0iCisgICAgICAgICAgICAgICAgICAgPDwgIiBzdGF0dXMgPSAiIDw8IHMKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBlcnJvckNvZGUgPSAiIDw8IGVycm9yQ29kZQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3IoY29tcG9uZW50LCBzID09IFN0YXR1czo6T0sgPworICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgOiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25FcnJvciAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8UmVuZGVyZWRGcmFtZT4mIHJlbmRlcmVkRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKTsKKyAgICAgICAgaWYgKCFsaXN0ZW5lcikgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25GcmFtZXNSZW5kZXJlZCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgUmVuZGVyZWRGcmFtZSYgcmVuZGVyZWRGcmFtZSA6IHJlbmRlcmVkRnJhbWVzKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25GcmFtZVJlbmRlcmVkKAorICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLmJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRnJhbWUuc2xvdElkLAorICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLnRpbWVzdGFtcE5zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxJbnB1dEJ1ZmZlcj4mIGlucHV0QnVmZmVycykgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCk7CisgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IElucHV0QnVmZmVyJiBpbnB1dEJ1ZmZlciA6IGlucHV0QnVmZmVycykgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJvbklucHV0QnVmZmVyc1JlbGVhc2VkIC0tIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVjZWl2ZWQgZGVhdGggbm90aWZpY2F0aW9uIG9mIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW5wdXQgYnVmZmVyOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyYW1lSW5kZXggPSAiIDw8IGlucHV0QnVmZmVyLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaW5wdXRCdWZmZXIuYXJyYXlJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuZnJhbWVJbmRleCwgaW5wdXRCdWZmZXIuYXJyYXlJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKK307CisKKy8vIENvZGVjMkNsaWVudAorQ29kZWMyQ2xpZW50OjpDb2RlYzJDbGllbnQoY29uc3Qgc3A8SUNvbXBvbmVudFN0b3JlPiYgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgOiBDb25maWd1cmFibGV7CisgICAgICAgICAgICBbYmFzZV0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKQorICAgICAgICB9LAorICAgICAgICBtQmFzZXtiYXNlfSwKKyAgICAgICAgbUxpc3RlZHtmYWxzZX0sCisgICAgICAgIG1TZXJ2aWNlTmFtZXtzZXJ2aWNlTmFtZX0geworICAgIFJldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IHRyYW5zUmVzdWx0ID0gYmFzZS0+Z2V0UG9vbENsaWVudE1hbmFnZXIoKTsKKyAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJnZXRQb29sQ2xpZW50TWFuYWdlciAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICB9IGVsc2UgeworICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyID0gc3RhdGljX2Nhc3Q8c3A8SUNsaWVudE1hbmFnZXI+Pih0cmFuc1Jlc3VsdCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCkgeworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIHNwPENvbXBvbmVudDo6SGlkbExpc3RlbmVyPiBoaWRsTGlzdGVuZXIgPSBuZXcgQ29tcG9uZW50OjpIaWRsTGlzdGVuZXJ7fTsKKyAgICBoaWRsTGlzdGVuZXItPmJhc2UgPSBsaXN0ZW5lcjsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIGhpZGxMaXN0ZW5lciwKKyAgICAgICAgICAgIENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCksCisgICAgICAgICAgICBbJnN0YXR1cywgY29tcG9uZW50LCBoaWRsTGlzdGVuZXJdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudD4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb21wb25lbnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PihjKTsKKyAgICAgICAgICAgICAgICBoaWRsTGlzdGVuZXItPmNvbXBvbmVudCA9ICpjb21wb25lbnQ7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0gZWxzZSBpZiAoISpjb21wb25lbnQpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gbnVsbCBjb21wb25lbnQuIjsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSAoKmNvbXBvbmVudCktPnNldERlYXRoTGlzdGVuZXIoKmNvbXBvbmVudCwgbGlzdGVuZXIpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gZmFpbGVkIHRvIHNldCB1cCBkZWF0aCBsaXN0ZW5lcjogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorCisgICAgKCpjb21wb25lbnQpLT5tQnVmZmVyUG9vbFNlbmRlci5zZXRSZWNlaXZlcihtSG9zdFBvb2xNYW5hZ2VyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBpbnRlcmZhY2VdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudEludGVyZmFjZT4mIGkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPEludGVyZmFjZT4oaSk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVJbnRlcmZhY2UoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiogY29uc3QgaW5wdXRTdXJmYWNlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBbJnN0YXR1cywgaW5wdXRTdXJmYWNlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqaW5wdXRTdXJmYWNlID0gc3RkOjptYWtlX3NoYXJlZDxJbnB1dFN1cmZhY2U+KGkpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlSW5wdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImNyZWF0ZUlucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBDb2RlYzJDbGllbnQ6Omxpc3RDb21wb25lbnRzKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1MaXN0ZWQpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHNMaXN0OworICAgIH0KKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+bGlzdENvbXBvbmVudHMoCisgICAgICAgICAgICBbdGhpc10oU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM+JiB0KSB7CisgICAgICAgICAgICAgICAgaWYgKHMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJsaXN0Q29tcG9uZW50cyAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRyYWl0c0xpc3QucmVzaXplKHQuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJm1UcmFpdHNMaXN0W2ldLCB0W2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAibGlzdENvbXBvbmVudHMgLS0gY29ycnVwdGVkIG91dHB1dC4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1UcmFpdHNMaXN0W2ldLm93bmVyID0gbVNlcnZpY2VOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImxpc3RDb21wb25lbnRzIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgIH0KKyAgICBtTGlzdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gbVRyYWl0c0xpc3Q7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y29weUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgc3JjLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBkc3QpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQ/CisgICAgKHZvaWQpc3JjOworICAgICh2b2lkKWRzdDsKKyAgICBMT0coRVJST1IpIDw8ICJjb3B5QnVmZmVyIG5vdCBpbXBsZW1lbnRlZCI7CisgICAgcmV0dXJuIEMyX09NSVRURUQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPgorICAgICAgICBDb2RlYzJDbGllbnQ6OmdldFBhcmFtUmVmbGVjdG9yKCkgeworICAgIC8vIFRPRE86IHRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGV4cG9zZWQgYXMgQzJQYXJhbVJlZmxlY3RvciBvbiB0aGUgY2xpZW50IHNpZGU7IGluc3RlYWQsIGl0CisgICAgLy8gc2hvdWxkIHJlZmxlY3QgdGhlIEhBTCBBUEkuCisgICAgc3RydWN0IFNpbXBsZVBhcmFtUmVmbGVjdG9yIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworICAgICAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgpIGNvbnN0IHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtSW5kZXg+IGluZGljZXMoMSk7CisgICAgICAgICAgICBpbmRpY2VzWzBdID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oY29yZUluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaXB0b3I7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Z2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgICAgIFsmZGVzY3JpcHRvcl0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U3RydWN0RGVzY3JpcHRvcj4mIHNkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2ltcGxlUGFyYW1SZWZsZWN0b3IgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFN0cnVjdERlc2NyaXB0b3JzKCkgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Quc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJTaW1wbGVQYXJhbVJlZmxlY3RvciAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0U3RydWN0RGVzY3JpcHRvcnMoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgdmVjdG9yIG9mIHNpemUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2Quc2l6ZSgpIDw8ICIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJdCBzaG91bGQgYmUgMS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZGVzY3JpcHRvciwgc2RbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2ltcGxlUGFyYW1SZWZsZWN0b3IgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFN0cnVjdERlc2NyaXB0b3JzKCkgcmV0dXJuZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJ1cHRlZCBkYXRhLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIFNpbXBsZVBhcmFtUmVmbGVjdG9yKHNwPEJhc2U+IGJhc2UpCisgICAgICAgICAgICA6IG1CYXNlKGJhc2UpIHsgfQorCisgICAgICAgIHNwPEJhc2U+IG1CYXNlOworICAgIH07CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVQYXJhbVJlZmxlY3Rvcj4obUJhc2UpOworfTsKKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgY29uc3QgY2hhciogc2VydmljZU5hbWUsIGJvb2wgd2FpdEZvclNlcnZpY2UpIHsKKyAgICBpZiAoIXNlcnZpY2VOYW1lKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzcDxCYXNlPiBiYXNlU3RvcmUgPSB3YWl0Rm9yU2VydmljZSA/CisgICAgICAgICAgICBCYXNlOjpnZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKSA6CisgICAgICAgICAgICBCYXNlOjp0cnlHZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKKyAgICBpZiAoIWJhc2VTdG9yZSkgeworICAgICAgICBpZiAod2FpdEZvclNlcnZpY2UpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ29kZWMyLjAgc2VydmljZSBcIiIgPDwgc2VydmljZU5hbWUgPDwgIlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW5hY2Nlc3NpYmxlLiBDaGVjayB0aGUgZGV2aWNlIG1hbmlmZXN0LiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJDb2RlYzIuMCBzZXJ2aWNlIFwiIiA8PCBzZXJ2aWNlTmFtZSA8PCAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgdW5hdmFpbGFibGUgYXQgdGhlIG1vbWVudC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIFdhaXQgb3IgY2hlY2sgdGhlIGRldmljZSBtYW5pZmVzdC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ+KGJhc2VTdG9yZSwgc2VydmljZU5hbWUpOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkZvckFsbFN0b3JlcygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmtleSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYpPgorICAgICAgICAgICAgcHJlZGljYXRlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfTk9fSU5JVDsgIC8vIG5vIElDb21wb25lbnRTdG9yZXMgcHJlc2VudAorCisgICAgLy8gQ2FjaGUgdGhlIG1hcHBpbmcga2V5IC0+IGluZGV4IG9mIENvZGVjMkNsaWVudCBpbiBnZXRDbGllbnQoKS4KKyAgICBzdGF0aWMgc3RkOjptdXRleCBrZXkySW5kZXhNdXRleDsKKyAgICBzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHNpemVfdD4ga2V5MkluZGV4OworCisgICAgLy8gQnkgZGVmYXVsdCB0cnkgYWxsIHN0b3Jlcy4gSG93ZXZlciwgdHJ5IHRoZSBsYXN0IGtub3duIGNsaWVudCBmaXJzdC4gSWYKKyAgICAvLyB0aGUgbGFzdCBrbm93biBjbGllbnQgZmFpbHMsIHJldHJ5IG9uY2UuIFdlIGRvIHRoaXMgYnkgcHVzaGluZyB0aGUgbGFzdAorICAgIC8vIGtub3duIGNsaWVudCBpbiBmcm9udCBvZiB0aGUgbGlzdCBvZiBhbGwgY2xpZW50cy4KKyAgICBzdGQ6OmRlcXVlPHNpemVfdD4gaW5kaWNlczsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IGtOdW1DbGllbnRzOyBpbmRleCA+IDA7ICkgeworICAgICAgICBpbmRpY2VzLnB1c2hfZnJvbnQoLS1pbmRleCk7CisgICAgfQorCisgICAgYm9vbCB3YXNNYXBwZWQgPSBmYWxzZTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soa2V5MkluZGV4TXV0ZXgpOworICAgIGF1dG8gaXQgPSBrZXkySW5kZXguZmluZChrZXkpOworICAgIGlmIChpdCAhPSBrZXkySW5kZXguZW5kKCkpIHsKKyAgICAgICAgaW5kaWNlcy5wdXNoX2Zyb250KGl0LT5zZWNvbmQpOworICAgICAgICB3YXNNYXBwZWQgPSB0cnVlOworICAgIH0KKyAgICBsb2NrLnVubG9jaygpOworCisgICAgZm9yIChzaXplX3QgaW5kZXggOiBpbmRpY2VzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudChpbmRleCk7CisgICAgICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHByZWRpY2F0ZShjbGllbnQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGtleTJJbmRleFtrZXldID0gaW5kZXg7IC8vIHVwZGF0ZSBsYXN0IGtub3duIGNsaWVudCBpbmRleAorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdhc01hcHBlZCkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJDb3VsZCBub3QgZmluZCBcIiIgPDwga2V5IDw8ICJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIHRoZSBsYXN0IGluc3RhbmNlLiBSZXRyeWluZy4uLiI7CisgICAgICAgICAgICB3YXNNYXBwZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOyAgLy8gcmV0dXJuIHRoZSBsYXN0IHN0YXR1cyBmcm9tIGEgdmFsaWQgY2xpZW50Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvbmVudE5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gRm9yQWxsU3RvcmVzKAorICAgICAgICAgICAgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgIFtvd25lciwgJmNvbXBvbmVudCwgY29tcG9uZW50TmFtZSwgJmxpc3RlbmVyXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXIgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSUNvbXBvbmVudFN0b3JlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6OmNyZWF0ZUNvbXBvbmVudChcIiIgPDwgY29tcG9uZW50TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIikgcmV0dXJuZWQgc3RhdHVzID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkNvdWxkIG5vdCBjcmVhdGUgY29tcG9uZW50IFwiIiA8PCBjb21wb25lbnROYW1lIDw8ICJcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICJTdGF0dXMgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBjb21wb25lbnQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBGb3JBbGxTdG9yZXMoCisgICAgICAgICAgICBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgW293bmVyLCAmaW50ZXJmYWNlLCBpbnRlcmZhY2VOYW1lXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmNyZWF0ZUludGVyZmFjZShpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXIgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSUNvbXBvbmVudFN0b3JlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6OmNyZWF0ZUludGVyZmFjZShcIiIgPDwgaW50ZXJmYWNlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIikgcmV0dXJuZWQgc3RhdHVzID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkNvdWxkIG5vdCBjcmVhdGUgaW50ZXJmYWNlIFwiIiA8PCBpbnRlcmZhY2VOYW1lIDw8ICJcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICJTdGF0dXMgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBpbnRlcmZhY2U7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgdWludDMyX3Qgc2VydmljZU1hc2sgPSA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJkZWJ1Zy5zdGFnZWZyaWdodC5jMmlucHV0c3VyZmFjZSIsIHVpbnQzMl90KDApKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1DbGllbnRzOyArK2kpIHsKKyAgICAgICAgaWYgKCgxIDw8IGkpICYgc2VydmljZU1hc2spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudChpKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlOworICAgICAgICAgICAgaWYgKGNsaWVudCAmJgorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmNyZWF0ZUlucHV0U3VyZmFjZSgmaW5wdXRTdXJmYWNlKSA9PSBDMl9PSyAmJgorICAgICAgICAgICAgICAgICAgICBpbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRTdXJmYWNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIExPRyhJTkZPKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBhbiBpbnB1dCBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICAgImZyb20gYW55IENvZGVjMi4wIHNlcnZpY2VzLiI7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBDb2RlYzJDbGllbnQ6Okxpc3RDb21wb25lbnRzKCkgeworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHNMaXN0ID0gW10oKXsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdDsKKyAgICAgICAgc2l6ZV90IGxpc3RTaXplID0gMDsKKyAgICAgICAgQ2xpZW50TGlzdCBjbGllbnRMaXN0ID0gZ2V0Q2xpZW50TGlzdCgpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+JiBjbGllbnQgOiBjbGllbnRMaXN0KSB7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdFNpemUgKz0gY2xpZW50LT5saXN0Q29tcG9uZW50cygpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0LnJlc2VydmUobGlzdFNpemUpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+JiBjbGllbnQgOiBjbGllbnRMaXN0KSB7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgIGxpc3QuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+bGlzdENvbXBvbmVudHMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmxpc3RDb21wb25lbnRzKCkuZW5kKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0oKTsKKworICAgIHJldHVybiB0cmFpdHNMaXN0OworfQorCisvLyBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyCisKK0NvZGVjMkNsaWVudDo6TGlzdGVuZXI6On5MaXN0ZW5lcigpIHsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UKK0NvZGVjMkNsaWVudDo6SW50ZXJmYWNlOjpJbnRlcmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9IHsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQKK0NvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpDb21wb25lbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbXBvbmVudEludGVyZmFjZT4+IHRyYW5zUmVzdWx0MSA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRyYW5zUmVzdWx0MS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb21wb25lbnRJbnRlcmZhY2U+Pih0cmFuc1Jlc3VsdDEpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdDIuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdDIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkKKyAgICAgICAgfSwKKyAgICAgICAgbUJhc2V7YmFzZX0sCisgICAgICAgIG1CdWZmZXJQb29sU2VuZGVye251bGxwdHJ9IHsKK30KKworQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6On5Db21wb25lbnQoKSB7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkLAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCogYmxvY2tQb29sSWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4qIGNvbmZpZ3VyYWJsZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlkKSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBibG9ja1Bvb2xJZCwgY29uZmlndXJhYmxlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBJZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbmZpZ3VyYWJsZT4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlLT5yZXNldCgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY3JlYXRlQmxvY2tQb29sIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqYmxvY2tQb29sSWQgPSBzdGF0aWNfY2FzdDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdD4ocElkKTsKKyAgICAgICAgICAgICAgICAqY29uZmlndXJhYmxlID0gc3RkOjptYWtlX3NoYXJlZDxDb25maWd1cmFibGU+KGMpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQmxvY2tQb29sIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZGVzdHJveUJsb2NrUG9vbCgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zUmVzdWx0ID0gbUJhc2UtPmRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4obG9jYWxJZCkpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRlc3Ryb3lCbG9ja1Bvb2wgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1Jlc3VsdCkpOworfQorCit2b2lkIENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpoYW5kbGVPbldvcmtEb25lKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpIHsKKyAgICAvLyBPdXRwdXQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgubG9jaygpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBicUlkID0gbU91dHB1dEJxSWQ7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IG1PdXRwdXRHZW5lcmF0aW9uOworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgaWYgKGlnYnApIHsKKyAgICAgICAgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKHdvcmtJdGVtcywgaWdicCwgYnFJZCwgZ2VuZXJhdGlvbik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6cXVldWUoCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSB7CisgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworICAgIGlmICghb2JqY3B5KCZ3b3JrQnVuZGxlLCAqaXRlbXMsICZtQnVmZmVyUG9vbFNlbmRlcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWUgLS0gYmFkIGlucHV0LiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXVlIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpmbHVzaCgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgICh2b2lkKW1vZGU7IC8vIEZsdXNoIG1vZGUgaXNuJ3Qgc3VwcG9ydGVkIGluIEhJREwgeWV0LgorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Zmx1c2goCisgICAgICAgICAgICBbJnN0YXR1cywgZmx1c2hlZFdvcmtdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3QgV29ya0J1bmRsZSYgd2IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJmbHVzaCAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KGZsdXNoZWRXb3JrLCB3YikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImZsdXNoIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKworICAgIC8vIEluZGljZXMgb2YgZmx1c2hlZCB3b3JrIGl0ZW1zLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBmbHVzaGVkSW5kaWNlczsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogKmZsdXNoZWRXb3JrKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5wdXQgaXMgY29tcGxldGUKKyAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPdXRwdXQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgubG9jaygpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBicUlkID0gbU91dHB1dEJxSWQ7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IG1PdXRwdXRHZW5lcmF0aW9uOworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgaWYgKGlnYnApIHsKKyAgICAgICAgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKCpmbHVzaGVkV29yaywgaWdicCwgYnFJZCwgZ2VuZXJhdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmRyYWluKEMyQ29tcG9uZW50OjpkcmFpbl9tb2RlX3QgbW9kZSkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmRyYWluKAorICAgICAgICAgICAgbW9kZSA9PSBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJkcmFpbiAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJkcmFpbiAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+c3RhcnQoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJzdGFydCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzdGFydCAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5zdG9wKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic3RvcCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzdG9wIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZXNldCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5yZXNldCgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInJlc2V0IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInJlc2V0IC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnJlbGVhc2UoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJyZWxlYXNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInJlbGVhc2UgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbikgeworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPQorICAgICAgICAgICAgc3VyZmFjZS0+Z2V0SGFsSW50ZXJmYWNlPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KCk7CisKKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgaWdicCA9IG5ldyBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPihzdXJmYWNlKTsKKyAgICB9CisKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrUG9vbElkKSwgaWdicCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0T3V0cHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzZXRPdXRwdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgpOworICAgICAgICBpZiAobU91dHB1dElnYnAgIT0gc3VyZmFjZSkgeworICAgICAgICAgICAgbU91dHB1dElnYnAgPSBzdXJmYWNlOworICAgICAgICAgICAgaWYgKCFzdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dEJxSWQgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdXJmYWNlLT5nZXRVbmlxdWVJZCgmbU91dHB1dEJxSWQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0T3V0cHV0U3VyZmFjZSAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IG9idGFpbiBidWZmZXJxdWV1ZSBpZC4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1PdXRwdXRHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnF1ZXVlVG9PdXRwdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0KiBvdXRwdXQpIHsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgaWYgKCFnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoYmxvY2ssICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCkgfHwKKyAgICAgICAgICAgIGJxSWQgPT0gMCkgeworICAgICAgICAvLyBCbG9jayBub3QgZnJvbSBidWZmZXJxdWV1ZSAtLSBpdCBtdXN0IGJlIGF0dGFjaGVkIGJlZm9yZSBxdWV1aW5nLgorCisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1PdXRwdXRJZ2JwOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaFRvQnVmZmVyUXVldWUoYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dElnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZicVNsb3QpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGF0dGFjaGluZyBmYWlsZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IG91dHB1dElnYnAtPnF1ZXVlQnVmZmVyKHN0YXRpY19jYXN0PGludD4oYnFTbG90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIG91dHB1dCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIG5vbi1idWZmZXJxdWV1ZS1iYXNlZCBibG9jay4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC5sb2NrKCk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IG91dHB1dEJxSWQgPSBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoIW91dHB1dElnYnApIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBvdXRwdXQgc3VyZmFjZSBpcyBudWxsLiI7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChicUlkICE9IG91dHB1dEJxSWQgfHwgZ2VuZXJhdGlvbiAhPSBvdXRwdXRHZW5lcmF0aW9uKSB7CisgICAgICAgIGlmICghaG9sZEJ1ZmZlclF1ZXVlQmxvY2soYmxvY2ssIG1PdXRwdXRJZ2JwLCBtT3V0cHV0QnFJZCwgbU91dHB1dEdlbmVyYXRpb24pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBtaWdyYXRpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoYmxvY2ssICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGNvcnJ1cHRlZCBidWZmZXJxdWV1ZSBhc3NpZ25tZW50LiI7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dElnYnAtPnF1ZXVlQnVmZmVyKHN0YXRpY19jYXN0PGludD4oYnFTbG90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgb3V0cHV0KTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAib24gYnVmZmVycXVldWUtYmFzZWQgYmxvY2suICIKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICgheWllbGRCdWZmZXJRdWV1ZUJsb2NrKGJsb2NrKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBjYW5ub3QgeWllbGQgIgorICAgICAgICAgICAgICAgICAgICAgICJidWZmZXJxdWV1ZS1iYXNlZCBibG9jayB0byB0aGUgYnVmZmVycXVldWUuIjsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4mIGlucHV0U3VyZmFjZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25uZWN0VG9JbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBpbnB1dFN1cmZhY2UtPm1CYXNlLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29ubmVjdFRvSW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4oYyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25uZWN0VG9JbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBwcm9kdWNlciwgc291cmNlLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29ubmVjdFRvT214SW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4oYyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5kaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRpc2Nvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzZXREZWF0aExpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworCisgICAgc3RydWN0IEhpZGxEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgICAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBiYXNlOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uRGVhdGgoY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25EZWF0aCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3A8SGlkbERlYXRoUmVjaXBpZW50PiBkZWF0aFJlY2lwaWVudCA9IG5ldyBIaWRsRGVhdGhSZWNpcGllbnQoKTsKKyAgICBkZWF0aFJlY2lwaWVudC0+YmFzZSA9IGxpc3RlbmVyOworICAgIGRlYXRoUmVjaXBpZW50LT5jb21wb25lbnQgPSBjb21wb25lbnQ7CisKKyAgICBjb21wb25lbnQtPm1EZWF0aFJlY2lwaWVudCA9IGRlYXRoUmVjaXBpZW50OworICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IGNvbXBvbmVudC0+bUJhc2UtPmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29tcG9uZW50LT5tRGVhdGhSZWNpcGllbnQsIDApOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInNldERlYXRoTGlzdGVuZXIgLS0gbGlua1RvRGVhdGgoKSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPih0cmFuc1Jlc3VsdCkpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAic2V0RGVhdGhMaXN0ZW5lciAtLSBsaW5rVG9EZWF0aCgpIGNhbGwgZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2UKK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9LAorICAgICAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2Vye25ldworICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6CisgICAgICAgICAgICBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoW2Jhc2VdKCkgLT4gc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4odHJhbnNSZXN1bHQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkpfSB7Cit9CisKK3NwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+CisgICAgICAgIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9CisKK3NwPElJbnB1dFN1cmZhY2U+IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpnZXRIYWxJbnRlcmZhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CYXNlOworfQorCisvLyBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24KK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBiYXNlKQorICAgICAgOiBDb25maWd1cmFibGV7CisgICAgICAgICAgICBbYmFzZV0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKQorICAgICAgICB9LAorICAgICAgICBtQmFzZXtiYXNlfSB7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6ZGlzY29ubmVjdCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1Jlc3VsdCA9IG1CYXNlLT5kaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zUmVzdWx0KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4Y2U2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX0NMSUVOVF9ICisjZGVmaW5lIENPREVDMl9ISURMX0NMSUVOVF9ICisKKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyBtaW5pbWFsIGludGVyZmFjZXMgZm9yIHRoZSBmcmFtZXdvcmsgdG8gYWNjZXNzIENvZGVjMi4wLgorICoKKyAqIENvZGVjMkNsaWVudCBpcyB0aGUgbWFpbiBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5uZXIgY2xhc3NlczoKKyAqIC0gTGlzdGVuZXIKKyAqIC0gQ29uZmlndXJhYmxlCisgKiAtIEludGVyZmFjZQorICogLSBDb21wb25lbnQKKyAqCisgKiBDbGFzc2VzIGluIENvZGVjMkNsaWVudCwgaW50ZXJmYWNlcyBpbiBDb2RlYzIuMCwgYW5kICBISURMIGludGVyZmFjZXMgYXJlCisgKiByZWxhdGVkIGFzIGZvbGxvd3M6CisgKiAtIENvZGVjMkNsaWVudCA8PT0+IEMyQ29tcG9uZW50U3RvcmUgPD09PiBJQ29tcG9uZW50U3RvcmUKKyAqIC0gQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciA8PT0+IEMyQ29tcG9uZW50OjpMaXN0ZW5lciA8PT0+IElDb21wb25lbnRMaXN0ZW5lcgorICogLSBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSA8PT0+IFtObyBlcXVpdmFsZW50XSA8PT0+IElDb25maWd1cmFibGUKKyAqIC0gQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UgPD09PiBDMkNvbXBvbmVudEludGVyZmFjZSA8PT0+IElDb21wb25lbnRJbnRlcmZhY2UKKyAqIC0gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgPD09PiBDMkNvbXBvbmVudCA8PT0+IElDb21wb25lbnQKKyAqCisgKiBUaGUgZW50cnkgcG9pbnQgaXMgQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgpLCB3aGljaCBjcmVhdGVzIGEKKyAqIENvZGVjMkNsaWVudCBvYmplY3QuIEZyb20gQ29kZWMyQ2xpZW50LCBJbnRlcmZhY2UgYW5kIENvbXBvbmVudCBvYmplY3RzIGNhbgorICogYmUgY3JlYXRlZCBieSBjYWxsaW5nIGNyZWF0ZUNvbXBvbmVudCgpIGFuZCBjcmVhdGVJbnRlcmZhY2UoKS4KKyAqCisgKiBjcmVhdGVDb21wb25lbnQoKSB0YWtlcyBhIExpc3RlbmVyIG9iamVjdCwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUKKyAqIHVzZXIuCisgKgorICogQXQgdGhlIHByZXNlbnQsIGNyZWF0ZUJsb2NrUG9vbCgpIGlzIHRoZSBvbmx5IG1ldGhvZCB0aGF0IHlpZWxkcyBhCisgKiBDb25maWd1cmFibGUgb2JqZWN0LiBOb3RlLCBob3dldmVyLCB0aGF0IEludGVyZmFjZSwgQ29tcG9uZW50IGFuZAorICogQ29kZWMyQ2xpZW50IGFyZSBhbGwgc3ViY2xhc3NlcyBvZiBDb25maWd1cmFibGUuCisgKi8KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBDb2RlYzIuMCBISURMIGludGVyZmFjZXMKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJQ29uZmlndXJhYmxlOworc3RydWN0IElDb21wb25lbnQ7CitzdHJ1Y3QgSUNvbXBvbmVudEludGVyZmFjZTsKK3N0cnVjdCBJQ29tcG9uZW50U3RvcmU7CitzdHJ1Y3QgSUlucHV0U3VyZmFjZTsKK3N0cnVjdCBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIGMyCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CitzdHJ1Y3QgSUNsaWVudE1hbmFnZXI7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCit9IC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygb3RoZXIgY2xhc3NlcworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBncmFwaGljcyB7CituYW1lc3BhY2UgYnVmZmVycXVldWUgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9IC8vIG5hbWVzcGFjZSBWMV8wCit9IC8vIG5hbWVzcGFjZSBidWZmZXJxdWV1ZQorfSAvLyBuYW1lc3BhY2UgZ3JhcGhpY3MKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2Ugb214IHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJR3JhcGhpY0J1ZmZlclNvdXJjZTsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIG9teAorfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhpcyBjbGFzcyBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUsIGJ1dCBmb3J3YXJkCisvLyBkZWNsYXJhdGlvbiBvZiBhbiBpbm5lciBjbGFzcyBpcyBub3QgcG9zc2libGUuCitzdHJ1Y3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlIEJhc2U7CisKKyAgICBjb25zdCBDMlN0cmluZyYgZ2V0TmFtZSgpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0OworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb2RlYzJDb25maWd1cmFibGVDbGllbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisgICAgQzJTdHJpbmcgbU5hbWU7CisKKyAgICBmcmllbmQgc3RydWN0IENvZGVjMkNsaWVudDsKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQgOiBwdWJsaWMgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUgQmFzZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKKworICAgIHR5cGVkZWYgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IENvbmZpZ3VyYWJsZTsKKworICAgIHN0cnVjdCBDb21wb25lbnQ7CisKKyAgICBzdHJ1Y3QgSW50ZXJmYWNlOworCisgICAgc3RydWN0IElucHV0U3VyZmFjZTsKKworICAgIHN0cnVjdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOworCisgICAgdHlwZWRlZiBDb2RlYzJDbGllbnQgU3RvcmU7CisKKyAgICBzdGQ6OnN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1TZXJ2aWNlTmFtZTsgfQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpOworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlKTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+KiBjb25zdCBpbnB1dFN1cmZhY2UpOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIGxpc3RDb21wb25lbnRzKCkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgc3JjLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgZHN0KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpOworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IENyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgY29uc3QgY2hhciogc2VydmljZU5hbWUsCisgICAgICAgICAgICBib29sIHdhaXRGb3JTZXJ2aWNlID0gdHJ1ZSk7CisKKyAgICAvLyBUcnkgdG8gY3JlYXRlIGEgY29tcG9uZW50IHdpdGggYSBnaXZlbiBuYW1lIGZyb20gYWxsIGtub3duCisgICAgLy8gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIgPSBudWxscHRyKTsKKworICAgIC8vIFRyeSB0byBjcmVhdGUgYSBjb21wb25lbnQgaW50ZXJmYWNlIHdpdGggYSBnaXZlbiBuYW1lIGZyb20gYWxsIGtub3duCisgICAgLy8gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiBDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyID0gbnVsbHB0cik7CisKKyAgICAvLyBMaXN0IHRyYWl0cyBmcm9tIGFsbCBrbm93biBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBMaXN0Q29tcG9uZW50cygpOworCisgICAgLy8gQ3JlYXRlIGFuIGlucHV0IHN1cmZhY2UuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+IENyZWF0ZUlucHV0U3VyZmFjZSgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb2RlYzJDbGllbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UsIHN0ZDo6c3RyaW5nIHNlcnZpY2VOYW1lKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgLy8gRmluZHMgdGhlIGZpcnN0IHN0b3JlIHdoZXJlIHRoZSBwcmVkaWNhdGUgcmV0dXJucyBPSywgYW5kIHJldHVybnMgdGhlIGxhc3QKKyAgICAvLyBwcmVkaWNhdGUgcmVzdWx0LiBVc2VzIGtleSB0byByZW1lbWJlciB0aGUgbGFzdCBzdG9yZSBmb3VuZCwgYW5kIGlmIGNhY2hlZCwKKyAgICAvLyBpdCB0cmllcyB0aGF0IHN0b3JlIGJlZm9yZSB0cnlpbmcgYWxsIHN0b3JlcyAob25lIHJldHJ5KS4KKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgRm9yQWxsU3RvcmVzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4mKT4gcHJlZGljYXRlKTsKKworICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgbXV0YWJsZSBib29sIG1MaXN0ZWQ7CisgICAgc3RkOjpzdHJpbmcgbVNlcnZpY2VOYW1lOworICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0c0xpc3Q7CisKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI+CisgICAgICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyOworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6SW50ZXJmYWNlIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50SW50ZXJmYWNlIEJhc2U7CisKKyAgICBJbnRlcmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgcHJvZHVjZXMgc29tZSBvdXRwdXQuCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBnb2VzIGludG8gYSB0cmlwcGVkIHN0YXRlLgorICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzCisgICAgICAgICAgICApID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBlbmNvdW50ZXJzIGFuIGVycm9yLgorICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wLAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBwcm9jZXNzIHRoYXQgaG9zdHMgdGhlIGNvbXBvbmVudCBzaHV0cyBkb3duCisgICAgLy8gdW5leHBlY3RlZGx5LgorICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGJ1ZmZlciBpcyBubyBsb25nZXIgaW4gdXNlIGJ5IHRoZSBjb2RlYy4KKyAgICAvLyBJbnB1dCBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IG9uV29ya0RvbmUoKSBvciBmbHVzaCgpIHdpbGwgbm90CisgICAgLy8gdHJpZ2dlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGJlY29tZXMgYXdhcmUgb2YgYSBmcmFtZSBiZWluZworICAgIC8vIHJlbmRlcmVkLgorICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lUmVuZGVyZWQoCisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJRdWV1ZUlkLAorICAgICAgICAgICAgaW50MzJfdCBzbG90SWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnQgQmFzZTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkLAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QqIGJsb2NrUG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbmZpZ3VyYWJsZT4qIGNvbmZpZ3VyYWJsZSk7CisKKyAgICBjMl9zdGF0dXNfdCBkZXN0cm95QmxvY2tQb29sKAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICBjMl9zdGF0dXNfdCBxdWV1ZSgKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKTsKKworICAgIGMyX3N0YXR1c190IGZsdXNoKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspOworCisgICAgYzJfc3RhdHVzX3QgZHJhaW4oQzJDb21wb25lbnQ6OmRyYWluX21vZGVfdCBtb2RlKTsKKworICAgIGMyX3N0YXR1c190IHN0YXJ0KCk7CisKKyAgICBjMl9zdGF0dXNfdCBzdG9wKCk7CisKKyAgICBjMl9zdGF0dXNfdCByZXNldCgpOworCisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6CisgICAgICAgICAgICBRdWV1ZUJ1ZmZlcklucHV0IFF1ZXVlQnVmZmVySW5wdXQ7CisgICAgdHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjoKKyAgICAgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0IFF1ZXVlQnVmZmVyT3V0cHV0OworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZSBIR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworICAgIC8vIFNldCB0aGUgb3V0cHV0IHN1cmZhY2UgdG8gYmUgdXNlZCB3aXRoIGEgYmxvY2twb29sIHByZXZpb3VzbHkgY3JlYXRlZCBieQorICAgIC8vIGNyZWF0ZUJsb2NrUG9vbCgpLgorICAgIGMyX3N0YXR1c190IHNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbik7CisKKyAgICAvLyBFeHRyYWN0IGEgc2xvdCBudW1iZXIgZnJvbSBvZiB0aGUgYmxvY2ssIHRoZW4gY2FsbAorICAgIC8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyKCkuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgb3V0cHV0IHN1cmZhY2UgaGFzIG5vdCBiZWVuIHNldCwgTk9fSU5JVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwKKyAgICAvLyBhdHRhY2hCdWZmZXIoKSB3aWxsIGJlIGNhbGxlZCwgZm9sbG93ZWQgYnkgcXVldWVCdWZmZXIoKS4KKyAgICAvLworICAgIC8vIElmIHRoZSBibG9jayBoYXMgYSBicUlkIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGlkIG9mIHRoZSBvdXRwdXQgc3VyZmFjZSwKKyAgICAvLyBERUFEX09CSkVDVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGNhbGwgdG8gcXVldWVCdWZmZXIoKSBpcyBzdWNjZXNzZnVsIGJ1dCB0aGUgYmxvY2sgY2Fubm90IGJlCisgICAgLy8gYXNzb2NpYXRlZCB0byB0aGUgb3V0cHV0IHN1cmZhY2UgZm9yIGF1dG9tYXRpYyBjYW5jZWxsYXRpb24gdXBvbgorICAgIC8vIGRlc3RydWN0aW9uLCBVTktOT1dOX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBxdWV1ZUJ1ZmZlcigpIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgc3RhdHVzX3QgcXVldWVUb091dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgIGNvbnN0IFF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCk7CisKKyAgICAvLyBDb25uZWN0IHRvIGEgZ2l2ZW4gSW5wdXRTdXJmYWNlLgorICAgIGMyX3N0YXR1c190IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgYzJfc3RhdHVzX3QgY29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgYzJfc3RhdHVzX3QgZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKTsKKworICAgIC8vIGJhc2UgY2Fubm90IGJlIG51bGwuCisgICAgQ29tcG9uZW50KGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworICAgIH5Db21wb25lbnQoKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIKKyAgICAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVyOworCisgICAgc3RkOjptdXRleCBtT3V0cHV0QnVmZmVyUXVldWVNdXRleDsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBtT3V0cHV0R2VuZXJhdGlvbjsKKworICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBzZXREZWF0aExpc3RlbmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisKKyAgICBzdHJ1Y3QgSGlkbExpc3RlbmVyOworICAgIHZvaWQgaGFuZGxlT25Xb3JrRG9uZShjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2UgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworcHVibGljOgorICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlIEJhc2U7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KKyAgICAgICAgICAgIENvbm5lY3Rpb25CYXNlOworCisgICAgdHlwZWRlZiBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24gQ29ubmVjdGlvbjsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdDsKKworICAgIC8vIFJldHVybiB0aGUgdW5kZXJseWluZyBJSW5wdXRTdXJmYWNlLgorICAgIHNwPEJhc2U+IGdldEhhbEludGVyZmFjZSgpIGNvbnN0OworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnQ7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBCYXNlOworCisgICAgYzJfc3RhdHVzX3QgZGlzY29ubmVjdCgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfQ0xJRU5UX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NTI1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOSBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZSIsCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorICAgIHNvY19zcGVjaWZpYzogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgc3JjczogWworICAgICAgICAidmVuZG9yLmNwcCIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgcmVxdWlyZWQ6IFsiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSJdLAorICAgICAgICB9LAorICAgICAgICB4ODY6IHsKKyAgICAgICAgICAgIHJlcXVpcmVkOiBbImNvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tayBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliMjhlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIHZlbmRvciBzZXJ2aWNlIHNlY2NvbXAgcG9saWN5CitpZmVxICgkKFRBUkdFVF9BUkNIKSwkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeQorTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvc2VjY29tcF9wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kKK2lmZGVmIFRBUkdFVF8yTkRfQVJDSAorICAgIGlmbmVxICgkKFRBUkdFVF9UUkFOU0xBVEVfMk5EX0FSQ0gpLHRydWUpCisgICAgICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfMk5EX0FSQ0gpLnBvbGljeQorICAgIGVsc2UKKyAgICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF9BUkNIKS5wb2xpY3kKKyAgICBlbmRpZgorZWxzZQorICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfQVJDSCkucG9saWN5CitlbmRpZgoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorZW5kaWYKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwgJChMT0NBTF9QQVRIKSkKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwNmJkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjCkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBhbmRyb2lkLWhhcmR3YXJlLW1lZGlhLWMyLWhhbC0xLTAgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZQorICAgIGNsYXNzIGhhbAorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBtZWRpYWRybSBkcm1ycGMKKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4NzFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kKQEAgLTAsMCArMSw3MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPcmdhbml6ZWQgYnkgZnJlcXVlbmN5IG9mIHN5c3RlbWNhbGwgLSBpbiBkZXNjZW5kaW5nIG9yZGVyIGZvcgorIyBiZXN0IHBlcmZvcm1hbmNlLgorZnV0ZXg6IDEKK2lvY3RsOiAxCit3cml0ZTogMQorcHJjdGw6IDEKK2Nsb2NrX2dldHRpbWU6IDEKK2dldHByaW9yaXR5OiAxCityZWFkOiAxCitjbG9zZTogMQord3JpdGV2OiAxCitkdXA6IDEKK3Bwb2xsOiAxCittbWFwMjogMQorZ2V0cmFuZG9tOiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzCittdW5tYXA6IDEKK21wcm90ZWN0OiAxCittYWR2aXNlOiAxCitvcGVuYXQ6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorc2V0cHJpb3JpdHk6IDEKK2dldHVpZDMyOiAxCitmc3RhdDY0OiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK2ZhY2Nlc3NhdDogMQorcmVhZGxpbmthdDogMQorZXhpdDogMQorcnRfc2lncHJvY21hc2s6IDEKK3NldF90aWRfYWRkcmVzczogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3BpcGUyOiAxCitnZXR0aW1lb2ZkYXk6IDEKK3NjaGVkX3lpZWxkOiAxCituYW5vc2xlZXA6IDEKK2xzZWVrOiAxCitfbGxzZWVrOiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWF4OiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWluOiAxCitzdGF0ZnM2NDogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCitmc3RhdGF0NjQ6IDEKK3VnZXRybGltaXQ6IDEKK2dldGRlbnRzNjQ6IDEKK2dldHJhbmRvbTogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNzYyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kKQEAgLTAsMCArMSw1NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVhZDogMQorbXByb3RlY3Q6IDEKK3ByY3RsOiAxCitvcGVuYXQ6IDEKK2dldHVpZDMyOiAxCit3cml0ZXY6IDEKK2lvY3RsOiAxCitjbG9zZTogMQorbW1hcDI6IDEKK2ZzdGF0NjQ6IDEKK21hZHZpc2U6IDEKK2ZzdGF0YXQ2NDogMQorZnV0ZXg6IDEKK211bm1hcDogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitsc2VlazogMQorY2xvbmU6IDEKK3NpZ2FsdHN0YWNrOiAxCitzZXRwcmlvcml0eTogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3VnZXRybGltaXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCitkdXA6IDEKK3NldF90aWRfYWRkcmVzczogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorCisjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKK2dldHRpZDogMQorc2NoZWRfeWllbGQ6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODcxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE9yZ2FuaXplZCBieSBmcmVxdWVuY3kgb2Ygc3lzdGVtY2FsbCAtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yCisjIGJlc3QgcGVyZm9ybWFuY2UuCitmdXRleDogMQoraW9jdGw6IDEKK3dyaXRlOiAxCitwcmN0bDogMQorY2xvY2tfZ2V0dGltZTogMQorZ2V0cHJpb3JpdHk6IDEKK3JlYWQ6IDEKK2Nsb3NlOiAxCit3cml0ZXY6IDEKK2R1cDogMQorcHBvbGw6IDEKK21tYXAyOiAxCitnZXRyYW5kb206IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorbXByb3RlY3Q6IDEKK21hZHZpc2U6IDEKK29wZW5hdDogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitzZXRwcmlvcml0eTogMQorZ2V0dWlkMzI6IDEKK2ZzdGF0NjQ6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorZmFjY2Vzc2F0OiAxCityZWFkbGlua2F0OiAxCitleGl0OiAxCitydF9zaWdwcm9jbWFzazogMQorc2V0X3RpZF9hZGRyZXNzOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQorcGlwZTI6IDEKK2dldHRpbWVvZmRheTogMQorc2NoZWRfeWllbGQ6IDEKK25hbm9zbGVlcDogMQorbHNlZWs6IDEKK19sbHNlZWs6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9tYXg6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9taW46IDEKK3N0YXRmczY0OiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZ2V0ZGVudHM2NDogMQorZ2V0cmFuZG9tOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzc2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZWFkOiAxCittcHJvdGVjdDogMQorcHJjdGw6IDEKK29wZW5hdDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQoraW9jdGw6IDEKK2Nsb3NlOiAxCittbWFwMjogMQorZnN0YXQ2NDogMQorbWFkdmlzZTogMQorZnN0YXRhdDY0OiAxCitmdXRleDogMQorbXVubWFwOiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2xzZWVrOiAxCitjbG9uZTogMQorc2lnYWx0c3RhY2s6IDEKK3NldHByaW9yaXR5OiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQordWdldHJsaW1pdDogMQorcmVhZGxpbmthdDogMQorX2xsc2VlazogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCittcmVtYXA6IDEKK2R1cDogMQorc2V0X3RpZF9hZGRyZXNzOiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCisKKyMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgorZ2V0dGlkOiAxCitzY2hlZF95aWVsZDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UiCisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1pbmlqYWlsLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisvLyBPbXhTdG9yZSBpcyBhZGRlZCBmb3IgdmlzaWJpbGl0eSBieSBkdW1wc3RhdGUuCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oPgorCisvLyBUaGlzIGlzIGNyZWF0ZWQgYnkgbW9kdWxlICJjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5Ii4gVGhpcyBjYW4gYmUgbW9kaWZpZWQuCitzdGF0aWMgY29uc3RleHByIGNoYXIga0Jhc2VTZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiOworCisvLyBBZGRpdGlvbmFsIGRldmljZS1zcGVjaWZpYyBzZWNjb21wIHBlcm1pc3Npb25zIGNhbiBiZSBhZGRlZCBpbiB0aGlzIGZpbGUuCitzdGF0aWMgY29uc3RleHByIGNoYXIga0V4dFNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5leHQucG9saWN5IjsKKworY2xhc3MgRHVtbXlDMlN0b3JlIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworcHVibGljOgorICAgIER1bW15QzJTdG9yZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkR1bW15QzJTdG9yZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJkZWZhdWx0IjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIC8qbmFtZSovLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgLypjb21wb25lbnQqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgLyogbmFtZSAqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IC8qIGludGVyZmFjZSAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PgorICAgICAgICAgICAgbGlzdENvbXBvbmVudHMoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBzcmMgKi8sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBkc3QgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiAvKiBzdGFja1BhcmFtcyAqLywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+JiAvKiBoZWFwUGFyYW1JbmRpY2VzICovLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCAvKiBoZWFwUGFyYW1zICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiAvKiBwYXJhbXMgKi8sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IC8qIGZhaWx1cmVzICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IC8qIHBhcmFtcyAqLykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgLyogZmllbGRzICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KK307CisKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgeworICAgIEFMT0dEKCJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIHN0YXJ0aW5nLi4uIik7CisKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgYW5kcm9pZDo6U2V0VXBNaW5pamFpbChrQmFzZVNlY2NvbXBQb2xpY3lQYXRoLCBrRXh0U2VjY29tcFBvbGljeVBhdGgpOworCisgICAgLy8gdm5kYmluZGVyIGlzIG5lZWRlZCBieSBCdWZmZXJRdWV1ZS4KKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIC8vIEV4dHJhIHRocmVhZHMgbWF5IGJlIG5lZWRlZCB0byBoYW5kbGUgYSBzdGFja2VkIElQQyBzZXF1ZW5jZSB0aGF0CisgICAgLy8gY29udGFpbnMgYWx0ZXJuYXRpbmcgYmluZGVyIGFuZCBod2JpbmRlciBjYWxscy4gKFNlZSBiLzM1MjgzNDgwLikKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg4LCB0cnVlIC8qIGNhbGxlcldpbGxKb2luICovKTsKKworICAgIC8vIENyZWF0ZSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4KKyAgICB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElDb21wb25lbnRTdG9yZT4gc3RvcmU7CisKKyAgICAgICAgLy8gVmVuZG9yJ3MgVE9ETzogUmVwbGFjZSB0aGlzIHdpdGgKKyAgICAgICAgLy8gc3RvcmUgPSBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAvLyAgICAgICAgIC8qIGltcGxlbWVudGF0aW9uIG9mIEMyQ29tcG9uZW50U3RvcmUgKi8pOworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBDb2RlYzIncyBkdW1teSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4uLiIpOworICAgICAgICBzdG9yZSA9IG5ldyB1dGlsczo6Q29tcG9uZW50U3RvcmUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxEdW1teUMyU3RvcmU+KCkpOworCisgICAgICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoImRlZmF1bHQiKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgQ29kZWMyJ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIklDb21wb25lbnRTdG9yZSBzZXJ2aWNlLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29kZWMyJ3MgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIElPbXhTdG9yZSBzZXJ2aWNlLgorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CisgICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIik7CisgICAgICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMTI2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icApAQCAtMCwwICsxLDU5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlYyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMk9NWE5vZGUuY3BwIiwKKyAgICAgICAgIkNDb2RlYy5jcHAiLAorICAgICAgICAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAorICAgICAgICAiQ0NvZGVjQ29uZmlnLmNwcCIsCisgICAgICAgICJDb2RlYzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkNvZGVjMkluZm9CdWlsZGVyLmNwcCIsCisgICAgICAgICJQaXBlbGluZVdhdGNoZXIuY3BwIiwKKyAgICAgICAgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAiLAorICAgICAgICAiU2tpcEN1dEJ1ZmZlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlY2Jhc2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Q4NTlhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyT01YTm9kZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorCisjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQnVmZmVyMkQgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcjJEKEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2spIDogQzJCdWZmZXIoeyBibG9jayB9KSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0MyT01YTm9kZTo6QzJPTVhOb2RlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApCisgICAgOiBtQ29tcChjb21wKSwgbUZyYW1lSW5kZXgoMCksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSwKKyAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcygwKSwgbUZpcnN0SW5wdXRGcmFtZSh0cnVlKSB7CisgICAgLy8gVE9ETzogcmVhZCBmcm9tIGludGYoKQorICAgIGlmICghc3RybmNtcChjb21wLT5nZXROYW1lKCkuY19zdHIoKSwgImMyLmFuZHJvaWQuIiwgMTEpKSB7CisgICAgICAgIG1Vc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKyAgICB9IGVsc2UgeworICAgICAgICBtVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVOb2RlKCkgeworICAgIG1Db21wLnJlc2V0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIHsKKyAgICBpZiAoY21kID09IE9NWF9Db21tYW5kU3RhdGVTZXQgJiYgcGFyYW0gPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgIC8vIFJlc2V0IGZpcnN0IGlucHV0IGZyYW1lIHNvIGlmIEMyT01YTm9kZSBpcyByZWN5Y2xlZCwgdGhlIHRpbWVzdGFtcCBkb2VzIG5vdCBiZWNvbWUKKyAgICAgICAgLy8gbmVnYXRpdmUuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBIVyBjb2RlY3MgdGhhdCBkbyBub3QgaGFuZGxlIHRpbWVzdGFtcCByb2xsb3Zlci4KKyAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXR1c190IGVyciA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIHN3aXRjaCAoKHVpbnQzMl90KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0czogeworICAgICAgICAgICAgT01YX1UzMiAqdXNhZ2UgPSAoT01YX1UzMiAqKXBhcmFtczsKKyAgICAgICAgICAgICp1c2FnZSA9IG1Vc2FnZTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwRGVmID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwYXJhbXM7CisgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHRoZXNlIGZyb20gaW50ZigpCisgICAgICAgICAgICBwRGVmLT5uQnVmZmVyQ291bnRBY3R1YWwgPSAxNjsKKyAgICAgICAgICAgIHBEZWYtPmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIGhhbmRsZSBtYXgvZml4ZWQgZnJhbWUgZHVyYXRpb24gY29udHJvbAorICAgIGlmIChpbmRleCA9PSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbU1heEZyYW1lRHVyYXRpb25Gb3JCaXRyYXRlQ29udHJvbAorICAgICAgICAgICAgJiYgcGFyYW1zICE9IE5VTEwKKyAgICAgICAgICAgICYmIHNpemUgPT0gc2l6ZW9mKE9NWF9QQVJBTV9VMzJUWVBFKSkgeworICAgICAgICAvLyBUaGUgaW5jb21pbmcgbnVtYmVyIGlzIGFuIGludDMyX3QgY29udGFpbmVkIGluIE9NWF9VMzIuCisgICAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA9IChpbnQzMl90KSgoT01YX1BBUkFNX1UzMlRZUEUqKXBhcmFtcyktPm5VMzI7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydEluZGV4LCBJT01YOjpQb3J0TW9kZSBtb2RlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKW1vZGU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICBPTVhfVTMyIG1heEZyYW1lV2lkdGgsIE9NWF9VMzIgbWF4RnJhbWVIZWlnaHQpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpZW5hYmxlOworICAgICh2b2lkKW1heEZyYW1lV2lkdGg7CisgICAgKHZvaWQpbWF4RnJhbWVIZWlnaHQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZCl0dW5uZWxlZDsKKyAgICAodm9pZClhdWRpb0h3U3luYzsKKyAgICAqc2lkZWJhbmRIYW5kbGUgPSBudWxscHRyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRHcmFwaGljQnVmZmVyVXNhZ2UoT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9VMzIqIHVzYWdlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICp1c2FnZSA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldElucHV0U3VyZmFjZShjb25zdCBzcDxJT01YQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlKSB7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQywKKyAgICAgICAgICAgICZtQWxsb2NhdG9yKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU291cmNlID0gYnVmZmVyU291cmNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjphbGxvY2F0ZVNlY3VyZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgdm9pZCAqKmJ1ZmZlckRhdGEsIHNwPE5hdGl2ZUhhbmRsZT4gKm5hdGl2ZUhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClzaXplOworICAgICh2b2lkKW5hdGl2ZUhhbmRsZTsKKyAgICAqYnVmZmVyID0gMDsKKyAgICAqYnVmZmVyRGF0YSA9IG51bGxwdHI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnVzZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClvbXhCdWY7CisgICAgKmJ1ZmZlciA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpYnVmZmVyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpmaWxsQnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIHsKKyAgICAodm9pZClidWZmZXI7CisgICAgKHZvaWQpb214QnVmOworICAgICh2b2lkKWZlbmNlRmQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmVtcHR5QnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKKyAgICAvLyBUT0RPOiBiZXR0ZXIgZmVuY2UgaGFuZGxpbmcKKyAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZW5jZUZkKTsKKyAgICAgICAgZmVuY2UtPndhaXRGb3JldmVyKExPR19UQUcpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBtQ29tcC5sb2NrKCk7CisgICAgaWYgKCFjb21wKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHVpbnQzMl90IGMyRmxhZ3MgPSAoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAob214QnVmLm1CdWZmZXJUeXBlID09IE9NWEJ1ZmZlcjo6a0J1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+c3RyaWRlKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworICAgIH0gZWxzZSBpZiAoIShmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWMyRmxhZ3M7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKyAgICAvLyBXT1JLQVJPVU5EOiBhZGp1c3QgdGltZXN0YW1wIGJhc2VkIG9uIGdhcFVzCisgICAgeworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSB0aW1lc3RhbXA7IC8vIHNhdmUgaW5wdXQgdGltZXN0YW1wCisgICAgICAgIGlmIChtRmlyc3RJbnB1dEZyYW1lKSB7CisgICAgICAgICAgICAvLyBncmFiIHRpbWVzdGFtcHMgb24gZmlyc3QgZnJhbWUKKyAgICAgICAgICAgIG1QcmV2SW5wdXRUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA+IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0KKyAgICAgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICArIGMyX21pbigodGltZXN0YW1wIC0gbVByZXZJbnB1dFRpbWVzdGFtcCkucGVlaygpLCBtQWRqdXN0VGltZXN0YW1wR2FwVXMpOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA8IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gbVByZXZDb2RlY1RpbWVzdGFtcCAtIG1BZGp1c3RUaW1lc3RhbXBHYXBVczsKKyAgICAgICAgfQorICAgICAgICBtUHJldklucHV0VGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsOworICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgICAgIEFMT0dWKCJhZGp1c3RpbmcgJWxsZCB0byAlbGxkIChnYXA9JWxsZCkiLAorICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCisgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1BZGp1c3RUaW1lc3RhbXBHYXBVcyk7CisgICAgfQorCisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgaWYgKGJsb2NrKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpLAorICAgICAgICAgICAgICAgIFtidWZmZXIsIHNvdXJjZSA9IGdldFNvdXJjZSgpXShDMkJ1ZmZlciAqcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICh2b2lkKXNvdXJjZS0+b25JbnB1dEJ1ZmZlckVtcHRpZWQoYnVmZmVyLCAtMSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXAtPnF1ZXVlKCZpdGVtcyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlck5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgKHZvaWQpcGFyYW1ldGVyTmFtZTsKKyAgICAqaW5kZXggPSBPTVhfSW5kZXhNYXg7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmRpc3BhdGNoTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSYgbXNnKSB7CisgICAgaWYgKG1zZy50eXBlICE9IG9teF9tZXNzYWdlOjpFVkVOVCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIGlmIChtc2cudS5ldmVudF9kYXRhLmV2ZW50ICE9IE9NWF9FdmVudERhdGFTcGFjZUNoYW5nZWQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSAoYW5kcm9pZF9kYXRhc3BhY2UpbXNnLnUuZXZlbnRfZGF0YS5kYXRhMTsKKyAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCA9IG1zZy51LmV2ZW50X2RhdGEuZGF0YTM7CisKKyAgICAvLyBUT0RPOiBzZXQgZGF0YXNwYWNlIG9uIGNvbXBvbmVudCB0byBzZWUgaWYgaXQgaW1wYWN0cyBjb2xvciBhc3BlY3RzCisgICAgQUxPR0QoImRhdGFzcGFjZSBjaGFuZ2VkIHRvICUjeCBwaXhlbCBmb3JtYXQ6ICUjeCIsIGRhdGFTcGFjZSwgcGl4ZWxGb3JtYXQpOworICAgIHJldHVybiBPSzsKK30KKworc3A8SU9NWEJ1ZmZlclNvdXJjZT4gQzJPTVhOb2RlOjpnZXRTb3VyY2UoKSB7CisgICAgcmV0dXJuIG1CdWZmZXJTb3VyY2U7Cit9CisKK3ZvaWQgQzJPTVhOb2RlOjpzZXRGcmFtZVNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhODE1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfT01YX05PREVfSF8KKyNkZWZpbmUgQzJfT01YX05PREVfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIElPbXhOb2RlIGltcGxlbWVudGF0aW9uIGFyb3VuZCBjb2RlYyAyLjAgY29tcG9uZW50LCBvbmx5IHRvIGJlIHVzZWQgaW4KKyAqIElHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUuIE9ubHkgc3Vic2V0IG9mIElPbXhOb2RlIEFQSSBpcyBpbXBsZW1lbnRlZAorICogYW5kIG90aGVycyBhcmUgbGVmdCBhcyBzdHViLiBBcyBhIHJlc3VsdCwgb25lIGNhbm5vdCBleHBlY3QgdGhpcyBJT214Tm9kZQorICogdG8gd29yayBpbiBhbnkgb3RoZXIgdXNhZ2UgdGhhbiBJR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAqLworc3RydWN0IEMyT01YTm9kZSA6IHB1YmxpYyBCbk9NWE5vZGUgeworICAgIGV4cGxpY2l0IEMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKTsKKyAgICB+QzJPTVhOb2RlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gSU9NWE5vZGUKKyAgICBzdGF0dXNfdCBmcmVlTm9kZSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydF9pbmRleCwgSU9NWDo6UG9ydE1vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0R3JhcGhpY0J1ZmZlclVzYWdlKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gJmJ1ZmZlclNvdXJjZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVTZWN1cmVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHZvaWQgKipidWZmZXJfZGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlX2hhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgYnVmZmVyX2lkICpidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZyZWVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZpbGxCdWZmZXIoCisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAorICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsCisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKmluZGV4KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgb3ZlcnJpZGU7CisKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBnZXRTb3VyY2UoKTsKKyAgICB2b2lkIHNldEZyYW1lU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcDsKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBtQnVmZmVyU291cmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50NjRfdCBtVXNhZ2U7CisKKyAgICAvLyBXT1JLQVJPVU5EOiB0aW1lc3RhbXAgYWRqdXN0bWVudAorCisgICAgLy8gaWYgPjA6IHRoaXMgaXMgdGhlIG1heCB0aW1lc3RhbXAgZ2FwLCBpZiA8MDogdGhpcyBpcyAtMSB0aW1lcyB0aGUgZml4ZWQgdGltZXN0YW1wIGdhcAorICAgIC8vIGlmIDA6IG5vIHRpbWVzdGFtcCBhZGp1c3RtZW50IGlzIG1hZGUKKyAgICAvLyBub3RlIHRoYXQgQzJPTVhOb2RlIGNhbiBiZSByZWN5Y2xlZCBiZXR3ZWVuIGVuY29kaW5nIHNlc3Npb25zLgorICAgIGludDMyX3QgbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgIGJvb2wgbUZpcnN0SW5wdXRGcmFtZTsgLy8gdHJ1ZSBmb3IgZmlyc3QgaW5wdXQKKyAgICBjMl9jbnRyNjRfdCBtUHJldklucHV0VGltZXN0YW1wOyAvLyBpbnB1dCB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisgICAgYzJfY250cjY0X3QgbVByZXZDb2RlY1RpbWVzdGFtcDsgLy8gYWRqdXN0ZWQgKGNvZGVjKSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX09NWF9OT0RFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMTBjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApAQCAtMCwwICsxLDE3ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL0lPTVhCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMk9NWE5vZGUuaCIKKyNpbmNsdWRlICJDQ29kZWMuaCIKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJDaGFubmVsLmgiCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorCitleHRlcm4gIkMiIGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlICpDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBCR3JhcGhpY0J1ZmZlclNvdXJjZSA9IDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJTb3VyY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2U7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENDb2RlY1dhdGNoZG9nIDogcHVibGljIEFIYW5kbGVyIHsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0V2F0Y2gsCisgICAgfTsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludDY0X3Qga1dhdGNoSW50ZXJ2YWxVcyA9IDMzMDAwMDA7ICAvLyAzLjMgc2VjcworCitwdWJsaWM6CisgICAgc3RhdGljIHNwPENDb2RlY1dhdGNoZG9nPiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIHNwPENDb2RlY1dhdGNoZG9nPiBpbnN0YW5jZShuZXcgQ0NvZGVjV2F0Y2hkb2cpOworICAgICAgICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgZmxhZzsKKyAgICAgICAgLy8gQ2FsbCBJbml0KCkgb25seSBvbmNlLgorICAgICAgICBzdGQ6OmNhbGxfb25jZShmbGFnLCBJbml0LCBpbnN0YW5jZSk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICB+Q0NvZGVjV2F0Y2hkb2coKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHdhdGNoKHNwPENDb2RlYz4gY29kZWMpIHsKKyAgICAgICAgYm9vbCBzaG91bGRQb3N0ID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+OjpMb2NrZWQgY29kZWNzKG1Db2RlY3NUb1dhdGNoKTsKKyAgICAgICAgICAgIC8vIElmIGEgd2F0Y2ggbWVzc2FnZSBpcyBpbiBmbGlnaHQsIHBpZ2d5LWJhY2sgdGhpcyBpbnN0YW5jZSBhcyB3ZWxsLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwb3N0IGEgbmV3IHdhdGNoIG1lc3NhZ2UuCisgICAgICAgICAgICBzaG91bGRQb3N0ID0gY29kZWNzLT5lbXB0eSgpOworICAgICAgICAgICAgY29kZWNzLT5lbXBsYWNlKGNvZGVjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hvdWxkUG9zdCkgeworICAgICAgICAgICAgQUxPR1YoInBvc3Rpbmcgd2F0Y2ggbWVzc2FnZSIpOworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdhdGNoLCB0aGlzKSktPnBvc3Qoa1dhdGNoSW50ZXJ2YWxVcyk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgIGNhc2Uga1doYXRXYXRjaDogeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+OjpMb2NrZWQgY29kZWNzKG1Db2RlY3NUb1dhdGNoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigid2F0Y2ggZm9yICV6dSBjb2RlY3MiLCBjb2RlY3MtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gY29kZWNzLT5iZWdpbigpOyBpdCAhPSBjb2RlY3MtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPENDb2RlYz4gY29kZWMgPSBpdC0+cHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZWMtPmluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29kZWNzLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgVFJFU1BBU1MoIkNDb2RlY1dhdGNoZG9nOiB1bnJlY29nbml6ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIENDb2RlY1dhdGNoZG9nKCkgOiBtTG9vcGVyKG5ldyBBTG9vcGVyKSB7fQorCisgICAgc3RhdGljIHZvaWQgSW5pdChjb25zdCBzcDxDQ29kZWNXYXRjaGRvZz4gJnRoaXopIHsKKyAgICAgICAgQUxPR1YoIkluaXQiKTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+c2V0TmFtZSgiQ0NvZGVjV2F0Y2hkb2ciKTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXopOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5zdGFydCgpOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisKKyAgICBNdXRleGVkPHN0ZDo6c2V0PHdwPENDb2RlYz4+PiBtQ29kZWNzVG9XYXRjaDsKK307CisKK2NsYXNzIEMySW5wdXRTdXJmYWNlV3JhcHBlciA6IHB1YmxpYyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDMklucHV0U3VyZmFjZVdyYXBwZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+ICZzdXJmYWNlKSA6CisgICAgICAgIG1TdXJmYWNlKHN1cmZhY2UpIHsKKyAgICB9CisKKyAgICB+QzJJbnB1dFN1cmZhY2VXcmFwcGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChjb21wLT5jb25uZWN0VG9JbnB1dFN1cmZhY2UobVN1cmZhY2UsICZtQ29ubmVjdGlvbikpOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gSW5wdXRTdXJmYWNlIGRvZXMgbm90IGRpc3Rpbmd1aXNoIHN0YXJ0ZWQgc3RhdGUKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7CisgICAgICAgIEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nIGVvcyh0cnVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtU3VyZmFjZS0+Y29uZmlnKHsmZW9zfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgY29uZmlndXJlKENvbmZpZyAmY29uZmlnIF9fdW51c2VkKSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IG1TdXJmYWNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24+IG1Db25uZWN0aW9uOworfTsKKworY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgSW5wdXRTdXJmYWNlV3JhcHBlciB7CitwdWJsaWM6CisvLyAgICBleHBsaWNpdCBHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcihjb25zdCBzcDxCR3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSkgOiBtU291cmNlKHNvdXJjZSkge30KKyAgICBHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQpCisgICAgICAgIDogbVNvdXJjZShzb3VyY2UpLCBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCkgeworICAgICAgICBtRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKyAgICB9CisgICAgfkdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSBvdmVycmlkZSB7CisgICAgICAgIG1Ob2RlID0gbmV3IEMyT01YTm9kZShjb21wKTsKKyAgICAgICAgbU5vZGUtPnNldEZyYW1lU2l6ZShtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgIC8vIE5PVEU6IHdlIGRvIG5vdCB1c2UvcGFzcyB0aHJvdWdoIGNvbG9yIGFzcGVjdHMgZnJvbSBHcmFwaGljQnVmZmVyU291cmNlIGFzIHdlCisgICAgICAgIC8vIGNvbW11bmljYXRlIHRoYXQgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudC4KKyAgICAgICAgbVNvdXJjZS0+Y29uZmlndXJlKG1Ob2RlLCBtRGF0YVNwYWNlKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Ob2RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzcDxJT01YQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtTm9kZS0+Z2V0U291cmNlKCk7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIkdCU1dyYXBwZXI6OmRpc2Nvbm5lY3Q6IG5vZGUgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCBPTVhCdWZmZXJTb3VyY2UuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc291cmNlLT5vbk9teElkbGUoKTsKKyAgICAgICAgc291cmNlLT5vbk9teExvYWRlZCgpOworICAgICAgICBtTm9kZS5jbGVhcigpOworICAgIH0KKworICAgIHN0YXR1c190IEdldFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmc3RhdHVzKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBzdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYmluZGVyIHN0YXR1cyBmYWlsZWQsIGJ1dCB0aGVyZSBpcyBubyBzZXJ2aWUgb3IgdHJhbnNhY3Rpb24gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gc291cmNlID0gbU5vZGUtPmdldFNvdXJjZSgpOworICAgICAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIGNvbnN0ZXhwciBzaXplX3Qga051bVNsb3RzID0gMTY7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVNsb3RzOyArK2kpIHsKKyAgICAgICAgICAgIHNvdXJjZS0+b25JbnB1dEJ1ZmZlckFkZGVkKGkpOworICAgICAgICB9CisKKyAgICAgICAgc291cmNlLT5vbk9teEV4ZWN1dGluZygpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEdldFN0YXR1cyhtU291cmNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCkpOworICAgIH0KKworICAgIHN0YXR1c190IGNvbmZpZ3VyZShDb25maWcgJmNvbmZpZykgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdGF0dXM7CisgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgICAgIC8vIGhhbmRsZSBlYWNoIGNvbmZpZ3VyYXRpb24gZ3JhbnVhbGx5LCBpbiBjYXNlIHdlIG5lZWQgdG8gaGFuZGxlIHBhcnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgLy8gZWxzZXdoZXJlCisKKyAgICAgICAgLy8gVFJJQ0tZOiB3ZSBkbyBub3QgdW5zZXQgZnJhbWUgZGVsYXkgcmVwZWF0aW5nCisgICAgICAgIGlmIChjb25maWcubU1pbkZwcyA+IDAgJiYgY29uZmlnLm1NaW5GcHMgIT0gbUNvbmZpZy5tTWluRnBzKSB7CisgICAgICAgICAgICBpbnQ2NF90IHVzID0gMWU2IC8gY29uZmlnLm1NaW5GcHMgKyAwLjU7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXModXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIG1pbkZwcz0iIDw8IGNvbmZpZy5tTWluRnBzIDw8ICIgPT4gcmVwZWF0RGVsYXlVcz0iIDw8IHVzOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubU1pbkZwcyA9IGNvbmZpZy5tTWluRnBzOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHRzIGdhcAorICAgICAgICBpZiAoY29uZmlnLm1NaW5BZGp1c3RlZEZwcyA+IDAgfHwgY29uZmlnLm1GaXhlZEFkanVzdGVkRnBzID4gMCkgeworICAgICAgICAgICAgaWYgKG1Ob2RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBPTVhfUEFSQU1fVTMyVFlQRSBwdHJHYXBQYXJhbSA9IHt9OworICAgICAgICAgICAgICAgIHB0ckdhcFBhcmFtLm5TaXplID0gc2l6ZW9mKE9NWF9QQVJBTV9VMzJUWVBFKTsKKyAgICAgICAgICAgICAgICBwdHJHYXBQYXJhbS5uVTMyID0gKGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBjMl9taW4oSU5UMzJfTUFYICsgMC4sIDFlNiAvIGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgKyAwLjUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGMyX21heCgwLiAtIElOVDMyX01BWCwgLTFlNiAvIGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyAtIDAuNSk7CisgICAgICAgICAgICAgICAgKHZvaWQpbU5vZGUtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtTWF4RnJhbWVEdXJhdGlvbkZvckJpdHJhdGVDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgJnB0ckdhcFBhcmFtLCBzaXplb2YocHRyR2FwUGFyYW0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1heCBmcHMKKyAgICAgICAgLy8gVFJJQ0tZOiB3ZSBkbyBub3QgdW5zZXQgbWF4IGZwcyB0byAwIHVubGVzcyB1c2luZyBmaXhlZCBmcHMKKyAgICAgICAgaWYgKChjb25maWcubU1heEZwcyA+IDAgfHwgKGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyA+IDAgJiYgY29uZmlnLm1NYXhGcHMgPT0gMCkpCisgICAgICAgICAgICAgICAgJiYgY29uZmlnLm1NYXhGcHMgIT0gbUNvbmZpZy5tTWF4RnBzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0TWF4RnBzKGNvbmZpZy5tTWF4RnBzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBtYXhGcHM9IiA8PCBjb25maWcubU1heEZwczsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1NYXhGcHMgPSBjb25maWcubU1heEZwczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubVRpbWVPZmZzZXRVcyAhPSBtQ29uZmlnLm1UaW1lT2Zmc2V0VXMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRUaW1lT2Zmc2V0VXMoY29uZmlnLm1UaW1lT2Zmc2V0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHRpbWVPZmZzZXQgIiA8PCBjb25maWcubVRpbWVPZmZzZXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVRpbWVPZmZzZXRVcyA9IGNvbmZpZy5tVGltZU9mZnNldFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tQ2FwdHVyZUZwcyAhPSBtQ29uZmlnLm1DYXB0dXJlRnBzIHx8IGNvbmZpZy5tQ29kZWRGcHMgIT0gbUNvbmZpZy5tQ29kZWRGcHMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9CisgICAgICAgICAgICAgICAgR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFRpbWVMYXBzZUNvbmZpZyhjb25maWcubUNvZGVkRnBzLCBjb25maWcubUNhcHR1cmVGcHMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHRpbWVMYXBzZSAiIDw8IGNvbmZpZy5tQ2FwdHVyZUZwcyA8PCAiZnBzIGFzICIgPDwgY29uZmlnLm1Db2RlZEZwcyA8PCAiZnBzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1DYXB0dXJlRnBzID0gY29uZmlnLm1DYXB0dXJlRnBzOworICAgICAgICAgICAgbUNvbmZpZy5tQ29kZWRGcHMgPSBjb25maWcubUNvZGVkRnBzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tU3RhcnRBdFVzICE9IG1Db25maWcubVN0YXJ0QXRVcworICAgICAgICAgICAgICAgIHx8IChjb25maWcubVN0b3BwZWQgIT0gbUNvbmZpZy5tU3RvcHBlZCAmJiAhY29uZmlnLm1TdG9wcGVkKSkgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFN0YXJ0VGltZVVzKGNvbmZpZy5tU3RhcnRBdFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBzdGFydCBhdCAiIDw8IGNvbmZpZy5tU3RhcnRBdFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tU3RhcnRBdFVzID0gY29uZmlnLm1TdGFydEF0VXM7CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wcGVkID0gY29uZmlnLm1TdG9wcGVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3VzcGVuZC1yZXN1bWUKKyAgICAgICAgaWYgKGNvbmZpZy5tU3VzcGVuZGVkICE9IG1Db25maWcubVN1c3BlbmRlZCkgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFN1c3BlbmQoY29uZmlnLm1TdXNwZW5kZWQsIGNvbmZpZy5tU3VzcGVuZEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiICIgPDwgKGNvbmZpZy5tU3VzcGVuZGVkID8gInN1c3BlbmQiIDogInJlc3VtZSIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgYXQgIiA8PCBjb25maWcubVN1c3BlbmRBdFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tU3VzcGVuZGVkID0gY29uZmlnLm1TdXNwZW5kZWQ7CisgICAgICAgICAgICBtQ29uZmlnLm1TdXNwZW5kQXRVcyA9IGNvbmZpZy5tU3VzcGVuZEF0VXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1TdG9wcGVkICE9IG1Db25maWcubVN0b3BwZWQgJiYgY29uZmlnLm1TdG9wcGVkKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3RvcFRpbWVVcyhjb25maWcubVN0b3BBdFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBzdG9wIGF0ICIgPDwgY29uZmlnLm1TdG9wQXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgZGVsYXlVcyI7CisgICAgICAgICAgICAgICAgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPmdldFN0b3BUaW1lT2Zmc2V0VXMoJmNvbmZpZy5tSW5wdXREZWxheVVzKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIj0iIDw8IGNvbmZpZy5tSW5wdXREZWxheVVzIDw8ICJ1cyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25maWcubUlucHV0RGVsYXlVcyA9IGNvbmZpZy5tSW5wdXREZWxheVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tU3RvcEF0VXMgPSBjb25maWcubVN0b3BBdFVzOworICAgICAgICAgICAgbUNvbmZpZy5tU3RvcHBlZCA9IGNvbmZpZy5tU3RvcHBlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbG9yIGFzcGVjdHMgKGFuZHJvaWQuX2NvbG9yLWFzcGVjdHMpCisKKyAgICAgICAgLy8gY29uc3VtZXIgdXNhZ2UKKyAgICAgICAgQUxPR0QoIklTQ29uZmlnJXMiLCBzdGF0dXMuc3RyKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHNwPEMyT01YTm9kZT4gbU5vZGU7CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgQ29uZmlnIG1Db25maWc7Cit9OworCitjbGFzcyBDb2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisKK3B1YmxpYzoKKyAgICBDb2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCkKKyAgICAgICAgOiBtQ2xpZW50KGNsaWVudCkgeyB9CisKKyAgICB2aXJ0dWFsIH5Db2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5jb25maWcocGFyYW1zLCBDMl9NQVlfQkxPQ0ssIGZhaWx1cmVzKTsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPikgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb25zdCBjb21wb25lbnQpIHsKKyAgICAgICAgY29tcG9uZW50LT5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICpjb25zdCBpbnRlcmZhY2UpIHsKKyAgICAgICAgaW50ZXJmYWNlLT5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgQzJfTUFZX0JMT0NLLCBoZWFwUGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIEMyX01BWV9CTE9DSyk7CisgICAgfQorCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Z2V0TmFtZSgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Z2V0UGFyYW1SZWZsZWN0b3IoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+KCk7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIENDb2RlYzo6Q2xpZW50TGlzdGVuZXIKKworc3RydWN0IENDb2RlYzo6Q2xpZW50TGlzdGVuZXIgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisKKyAgICBleHBsaWNpdCBDbGllbnRMaXN0ZW5lcihjb25zdCB3cDxDQ29kZWM+ICZjb2RlYykgOiBtQ29kZWMoY29kZWMpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICBzcDxDQ29kZWM+IGNvZGVjKG1Db2RlYy5wcm9tb3RlKCkpOworICAgICAgICBpZiAoIWNvZGVjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29kZWMtPm9uV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiYgc2V0dGluZ1Jlc3VsdAorICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICAodm9pZClzZXR0aW5nUmVzdWx0OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPCisgICAgICAgICh2b2lkKWNvbXBvbmVudDsKKyAgICAgICAgKHZvaWQpZXJyb3JDb2RlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCkgb3ZlcnJpZGUgeworICAgICAgICB7IC8vIExvZyB0aGUgZGVhdGggb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9IGNvbXBvbmVudC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMyIGNvbXBvbmVudCBkaWVkLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMyIGNvbXBvbmVudCBcIiVzXCIgZGllZC4iLCBjb21wLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdG8gTWVkaWFDb2RlYy4KKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKCFjb2RlYyB8fCAhY29kZWMtPm1DYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvZGVjLT5tQ2FsbGJhY2stPm9uRXJyb3IoREVBRF9PQkpFQ1QsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZVJlbmRlcmVkKHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNsb3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgICAgICh2b2lkKWJ1ZmZlclF1ZXVlSWQ7CisgICAgICAgICh2b2lkKXNsb3RJZDsKKyAgICAgICAgKHZvaWQpdGltZXN0YW1wTnM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKGNvZGVjKSB7CisgICAgICAgICAgICBjb2RlYy0+b25JbnB1dEJ1ZmZlckRvbmUoZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgd3A8Q0NvZGVjPiBtQ29kZWM7Cit9OworCisvLyBDQ29kZWNDYWxsYmFja0ltcGwKKworY2xhc3MgQ0NvZGVjQ2FsbGJhY2tJbXBsIDogcHVibGljIENDb2RlY0NhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDQ29kZWNDYWxsYmFja0ltcGwoQ0NvZGVjICpjb2RlYykgOiBtQ29kZWMoY29kZWMpIHt9CisgICAgfkNDb2RlY0NhbGxiYWNrSW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgb25FcnJvcihzdGF0dXNfdCBlcnIsIGVudW0gQWN0aW9uQ29kZSBhY3Rpb25Db2RlKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKGVyciwgYWN0aW9uQ29kZSk7CisgICAgfQorCisgICAgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgICAgIHtSZW5kZXJlZEZyYW1lSW5mbyhtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zKX0pOworICAgIH0KKworICAgIHZvaWQgb25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ0NvZGVjICptQ29kZWM7Cit9OworCisvLyBDQ29kZWMKKworQ0NvZGVjOjpDQ29kZWMoKQorICAgIDogbUNoYW5uZWwobmV3IENDb2RlY0J1ZmZlckNoYW5uZWwoc3RkOjptYWtlX3NoYXJlZDxDQ29kZWNDYWxsYmFja0ltcGw+KHRoaXMpKSkgeworfQorCitDQ29kZWM6On5DQ29kZWMoKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gQ0NvZGVjOjpnZXRCdWZmZXJDaGFubmVsKCkgeworICAgIHJldHVybiBtQ2hhbm5lbDsKK30KKworc3RhdHVzX3QgQ0NvZGVjOjp0cnlBbmRSZXBvcnRPbkVycm9yKHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gam9iKSB7CisgICAgc3RhdHVzX3QgZXJyID0gam9iKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgYXV0byBzZXRBbGxvY2F0aW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJFTEVBU0VEKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FUSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0QWxsb2NhdGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPFJlZkJhc2U+IGNvZGVjSW5mbzsKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZjb2RlY0luZm8pKTsKKyAgICAvLyBGb3IgQ29kZWMgMi4wIGNvbXBvbmVudHMsIGNvbXBvbmVudE5hbWUgPT0gY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKS4KKworICAgIHNwPEFNZXNzYWdlPiBhbGxvY01zZyhuZXcgQU1lc3NhZ2Uoa1doYXRBbGxvY2F0ZSwgdGhpcykpOworICAgIGFsbG9jTXNnLT5zZXRPYmplY3QoImNvZGVjSW5mbyIsIGNvZGVjSW5mbyk7CisgICAgYWxsb2NNc2ctPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmFsbG9jYXRlKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmY29kZWNJbmZvKSB7CisgICAgaWYgKGNvZGVjSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR0QoImFsbG9jYXRlKCVzKSIsIGNvZGVjSW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgIG1DbGllbnRMaXN0ZW5lci5yZXNldChuZXcgQ2xpZW50TGlzdGVuZXIodGhpcykpOworCisgICAgQVN0cmluZyBjb21wb25lbnROYW1lID0gY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQ7CisKKyAgICAvLyBzZXQgdXAgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSB0byBhY2Nlc3MgdmVuZG9yIHN0b3JlIHBhcmFtZXRlcnMKKyAgICBjbGllbnQgPSBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCJkZWZhdWx0IiwgZmFsc2UpOworICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgQUxPR0koInNldHRpbmcgdXAgJyVzJyBhcyBkZWZhdWx0ICh2ZW5kb3IpIHN0b3JlIiwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpLmNfc3RyKCkpOworICAgICAgICBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXI+KGNsaWVudCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9CisgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1DbGllbnRMaXN0ZW5lciwKKyAgICAgICAgICAgICZjbGllbnQpOworICAgIGlmICghY29tcCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIENyZWF0ZSBjb21wb25lbnQ6ICVzIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HSSgiQ3JlYXRlZCBjb21wb25lbnQgWyVzXSIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgbUNoYW5uZWwtPnNldENvbXBvbmVudChjb21wKTsKKyAgICBhdXRvIHNldEFsbG9jYXRlZCA9IFt0aGlzLCBjb21wLCBjbGllbnRdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FURUQpOworICAgICAgICBzdGF0ZS0+Y29tcCA9IGNvbXA7CisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldEFsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgY29uZmlnIGhlcmUgaW4gY2FzZSBzZXRQYXJhbWV0ZXJzIGlzIGNhbGxlZCBwcmlvciB0byBjb25maWd1cmUKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5pbml0aWFsaXplKG1DbGllbnQsIGNvbXApOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCIpOworICAgICAgICAvLyBUT0RPOiByZXBvcnQgZXJyb3Igb25jZSB3ZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB9CisgICAgY29uZmlnLT5xdWVyeUNvbmZpZ3VyYXRpb24oY29tcCk7CisKKyAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50QWxsb2NhdGVkKGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHJldHVybiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgPyBVTktOT1dOX0VSUk9SIDogT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja0FsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cobmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrQWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBkb0NvbmZpZyA9IFttc2csIGNvbXAsIHRoaXNdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBlbmNvZGVyOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlbmNvZGVyIiwgJmVuY29kZXIpKSB7CisgICAgICAgICAgICBlbmNvZGVyID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIGZyb20gaW50ZigpCisgICAgICAgIGlmICgoIWVuY29kZXIpICE9IChjb21wLT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHN0b3JlTWV0YTsKKyAgICAgICAgaWYgKGVuY29kZXIKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIk9ubHkgQU5XIGJ1ZmZlcnMgYXJlIHN1cHBvcnRlZCBmb3IgbGVnYWN5IG1ldGFkYXRhIG1vZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoYW5uZWwtPnNldE1ldGFNb2RlKENDb2RlY0J1ZmZlckNoYW5uZWw6Ok1PREVfQU5XKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopKSB7CisgICAgICAgICAgICBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgc2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gc3VyZmFjZSAhPSBudWxscHRyOworCisgICAgICAgIC8vIEVuZm9yY2UgcmVxdWlyZWQgcGFyYW1ldGVycworICAgICAgICBpbnQzMl90IGkzMjsKKyAgICAgICAgZmxvYXQgZmx0OworICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfU0FNUExFX1JBVEUsICZpMzIpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInNhbXBsZSByYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9DSEFOTkVMX0NPVU5ULCAmaTMyKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjaGFubmVsIGNvdW50IGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1pbWUuZXF1YWxzSWdub3JlQ2FzZShNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKQorICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kSW50MzIoS0VZX0JJVF9SQVRFLCAmaTMyKQorICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kRmxvYXQoS0VZX0JJVF9SQVRFLCAmZmx0KSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJiaXRyYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBlbmNvZGVycy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19JTUFHRSB8IENvbmZpZzo6SVNfVklERU8pKSB7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9XSURUSCwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgid2lkdGggaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGltYWdlL3ZpZGVvIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0hFSUdIVCwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiaGVpZ2h0IGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBpbWFnZS92aWRlbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfVklERU8pKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfQklUX1JBVEUsICZpMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kRmxvYXQoS0VZX0JJVF9SQVRFLCAmZmx0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYml0cmF0ZSBpcyBtaXNzaW5nLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgdmlkZW8gZW5jb2RlcnMuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0lfRlJBTUVfSU5URVJWQUwsICZpMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kRmxvYXQoS0VZX0lfRlJBTUVfSU5URVJWQUwsICZmbHQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJJIGZyYW1lIGludGVydmFsIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB2aWRlbyBlbmNvZGVycy4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBIYW5kbGUgaW5wdXQgc3VyZmFjZSBjb25maWd1cmF0aW9uCisgICAgICAgICAqLworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpCisgICAgICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLnJlc2V0KG5ldyBJbnB1dFN1cmZhY2VXcmFwcGVyOjpDb25maWd7fSk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1NaW5GcHMgPSAwOworICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KEtFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIsICZ2YWx1ZSkgJiYgdmFsdWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluRnBzID0gMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEZsb2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZX01BWF9GUFNfVE9fRU5DT0RFUiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tTWF4RnBzKTsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkFkanVzdGVkRnBzID0gMDsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bUZpeGVkQWRqdXN0ZWRGcHMgPSAwOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NChLRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiwgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwICYmIHZhbHVlID49IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1GaXhlZEFkanVzdGVkRnBzID0gLTFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8PSBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAxZTYgLyB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kRG91YmxlKCJ0aW1lLWxhcHNlLWZwcyIsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1DYXB0dXJlRnBzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZjb25maWctPm1JU0NvbmZpZy0+bUNvZGVkRnBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMgPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVELCAmdmFsdWUpICYmIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBIYW5kbGUgZGVzaXJlZCBjb2xvciBmb3JtYXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpKSB7CisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCA9IC0xOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfQ09MT1JfRk9STUFULCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQWxzbyBoYW5kbGUgZGVmYXVsdCBjb2xvciBmb3JtYXQgKGVuY29kZXJzIHJlcXVpcmUgY29sb3IgZm9ybWF0LCBzbyB0aGlzIGlzIG9ubHkKKyAgICAgICAgICAgICAgICAgKiBuZWVkZWQgZm9yIGRlY29kZXJzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICghKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gKHN1cmZhY2UgPT0gbnVsbHB0cikgPyBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgOiBDT0xPUl9Gb3JtYXRTdXJmYWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOworICAgICAgICAvLyBOT1RFOiBXZSB1c2VkIHRvIGlnbm9yZSAidmlkZW8tYml0cmF0ZSIgYXQgY29uZmlndXJlOyByZXBsaWNhdGUKKyAgICAgICAgLy8gICAgICAgdGhlIGJlaGF2aW9yIGhlcmUuCisgICAgICAgIHNwPEFNZXNzYWdlPiBzZGtQYXJhbXMgPSBtc2c7CisgICAgICAgIGludDMyX3QgdmlkZW9CaXRyYXRlOworICAgICAgICBpZiAoc2RrUGFyYW1zLT5maW5kSW50MzIoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFLCAmdmlkZW9CaXRyYXRlKSkgeworICAgICAgICAgICAgc2RrUGFyYW1zID0gbXNnLT5kdXAoKTsKKyAgICAgICAgICAgIHNka1BhcmFtcy0+cmVtb3ZlRW50cnlBdChzZGtQYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZShQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUpKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25maWctPmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgICAgICAgICAgY29tcCwgc2RrUGFyYW1zLCBDb25maWc6OklTX0NPTkZJRywgQzJfRE9OVF9CTE9DSywgJmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gY29udmVydCBjb25maWd1cmF0aW9uIHRvIGMyIHBhcmFtcyIpOworICAgICAgICB9CisgICAgICAgIGVyciA9IGNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBjb25maWdVcGRhdGUsIEMyX0RPTlRfQkxPQ0spOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGNvbmZpZ3VyZSBjMiBwYXJhbXMiKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQgdXNhZ2UoMHUsIDB1KTsKKyAgICAgICAgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQgbWF4SW5wdXRTaXplKDB1LCAwdSk7CisKKyAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzIHsKKyAgICAgICAgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wLT5xdWVyeSgKKyAgICAgICAgICAgICAgICB7ICZ1c2FnZSwgJm1heElucHV0U2l6ZSB9LAorICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIGMyZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBjb21wb25lbnQgaW50ZXJmYWNlOiAlZCIsIGMyZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IGluZGljZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29tcG9uZW50IHJldHVybnMgd3JvbmcgbnVtYmVyIG9mIHBhcmFtczogZXhwZWN0ZWQgJXp1IGFjdHVhbCAlenUiLAorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnNpemUoKSwgcGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAodXNhZ2UgJiYgKHVzYWdlLnZhbHVlICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKSB7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5PVEU6IHdlIGRvbid0IGJsaW5kbHkgdXNlIGNsaWVudCBzcGVjaWZpZWQgaW5wdXQgc2l6ZSBpZiBzcGVjaWZpZWQgYXMgY2xpZW50cworICAgICAgICAvLyBhdCB0aW1lcyBzcGVjaWZ5IHRvbyBzbWFsbCBzaXplLiBJbnN0ZWFkLCBtaW1pYyB0aGUgYmVoYXZpb3IgZnJvbSBPTVgsIHdoZXJlIHRoZQorICAgICAgICAvLyBjbGllbnQgc3BlY2lmaWVkIHNpemUgaXMgb25seSB1c2VkIHRvIGFzayBmb3IgYmlnZ2VyIGJ1ZmZlcnMgdGhhbiBjb21wb25lbnQgc3VnZ2VzdGVkCisgICAgICAgIC8vIHNpemUuCisgICAgICAgIGludDMyX3QgY2xpZW50SW5wdXRTaXplID0gMDsKKyAgICAgICAgYm9vbCBjbGllbnRTcGVjaWZpZWRJbnB1dFNpemUgPQorICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2xpZW50SW5wdXRTaXplKSAmJiBjbGllbnRJbnB1dFNpemUgPiAwOworICAgICAgICAvLyBURU1QOiBlbmZvcmNlIG1pbmltdW0gYnVmZmVyIHNpemUgb2YgMU1CIGZvciB2aWRlbyBkZWNvZGVycworICAgICAgICAvLyBhbmQgMTZLIC8gNEsgZm9yIGF1ZGlvIGVuY29kZXJzL2RlY29kZXJzCisgICAgICAgIGlmIChtYXhJbnB1dFNpemUudmFsdWUgPT0gMCkgeworICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSBlbmNvZGVyID8gMTYzODQgOiA0MDk2OworICAgICAgICAgICAgfSBlbHNlIGlmICghZW5jb2RlcikgeworICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IDEwNDg1NzZ1OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgQ1NEIGZpdHMgaW50byB0aGlzIHNpemUgKGlmIGRlZmluZWQpCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19ERUNPREVSKSAmJiBtYXhJbnB1dFNpemUudmFsdWUgPiAwKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2Q7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IG1zZy0+ZmluZEJ1ZmZlcihTdHJpbmdQcmludGYoImNzZC0lenUiLCBpeCkuY19zdHIoKSwgJmNzZCk7ICsraXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NkICYmIGNzZC0+c2l6ZSgpID4gbWF4SW5wdXRTaXplLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IGNzZC0+c2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGRvIHRoaXMgYmFzZWQgb24gY29tcG9uZW50IHJlcXVpcmluZyBsaW5lYXIgYWxsb2NhdG9yIGZvciBpbnB1dAorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikgfHwgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50U3BlY2lmaWVkSW5wdXRTaXplKSB7CisgICAgICAgICAgICAgICAgLy8gV2FybiB0aGF0IHdlJ3JlIG92ZXJyaWRpbmcgY2xpZW50J3MgbWF4IGlucHV0IHNpemUgaWYgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgIGlmICgodWludDMyX3QpY2xpZW50SW5wdXRTaXplIDwgbWF4SW5wdXRTaXplLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJjbGllbnQgcmVxdWVzdGVkIG1heCBpbnB1dCBzaXplICVkLCB3aGljaCBpcyBzbWFsbGVyIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hhdCBjb21wb25lbnQgcmVjb21tZW5kZWQgKCV1KTsgb3ZlcnJpZGluZyB3aXRoIGNvbXBvbmVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNvbW1lbmRhdGlvbi4iLCBjbGllbnRJbnB1dFNpemUsIG1heElucHV0U2l6ZS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJUaGlzIGJlaGF2aW9yIGlzIHN1YmplY3QgdG8gY2hhbmdlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcCBkZXZlbG9wZXJzIGRvdWJsZSBjaGVjayB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4IGlucHV0IHNpemUgaXMgaW4gcmVhc29uYWJsZSByYW5nZS4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSBjbGllbnRJbnB1dFNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUGFzcyBtYXggaW5wdXQgc2l6ZSBvbiBpbnB1dCBmb3JtYXQgdG8gdGhlIGJ1ZmZlciBjaGFubmVsIChpZiBzdXBwbGllZCBieSB0aGUKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBvciBieSBhIGRlZmF1bHQpCisgICAgICAgICAgICBpZiAobWF4SW5wdXRTaXplLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZX01BWF9JTlBVVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKGMyX21pbihtYXhJbnB1dFNpemUudmFsdWUsIHVpbnQzMl90KElOVDMyX01BWCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpKSB7CisgICAgICAgICAgICAvLyBwcm9wYWdhdGUgSERSIHN0YXRpYyBpbmZvIHRvIG91dHB1dCBmb3JtYXQgZm9yIGJvdGggZW5jb2RlcnMgYW5kIGRlY29kZXJzCisgICAgICAgICAgICAvLyBpZiBjb21wb25lbnQgc3VwcG9ydHMgdGhpcyBpbmZvLCB3ZSB3aWxsIHVwZGF0ZSBmcm9tIGNvbXBvbmVudCwgYnV0IG9ubHkgdGhlIHJhdyBwb3J0LAorICAgICAgICAgICAgLy8gc28gZG9uJ3QgcHJvcGFnYXRlIGlmIGNvbXBvbmVudCBhbHJlYWR5IGZpbGxlZCBpdCBpbi4KKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGhkckluZm87CisgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJJbmZvKQorICAgICAgICAgICAgICAgICAgICAmJiAhY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJJbmZvKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sIGhkckluZm8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZXQgZGVzaXJlZCBjb2xvciBmb3JtYXQgZnJvbSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcgorICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQ7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvcGFnYXRlIGVuY29kZXIgZGVsYXkgYW5kIHBhZGRpbmcgdG8gb3V0cHV0IGZvcm1hdAorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pKSB7CisgICAgICAgICAgICBpbnQgZGVsYXkgPSAwOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlbmNvZGVyLWRlbGF5IiwgJmRlbGF5KSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImVuY29kZXItZGVsYXkiLCBkZWxheSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcGFkZGluZyA9IDA7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVuY29kZXItcGFkZGluZyIsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImVuY29kZXItcGFkZGluZyIsIHBhZGRpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IGNoYW5uZWwtbWFzaworICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgaW50MzJfdCBtYXNrOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKEtFWV9DSEFOTkVMX01BU0ssICZtYXNrKSkgeworICAgICAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKEtFWV9DSEFOTkVMX01BU0ssIG1hc2spOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NIQU5ORUxfTUFTSywgbWFzayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUxPR0QoInNldHVwIGZvcm1hdHMgaW5wdXQ6ICVzIGFuZCBvdXRwdXQ6ICVzIiwKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoZG9Db25maWcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisKKyAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50Q29uZmlndXJlZChjb25maWctPm1JbnB1dEZvcm1hdCwgY29uZmlnLT5tT3V0cHV0Rm9ybWF0KTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHN0YXR1c190IGVyciA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBBTExPQ0FURUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHJlYWQgaXQgZnJvbSBpbnRmKCkgcHJvcGVybHkuCisgICAgICAgIGlmIChzdGF0ZS0+Y29tcC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRpb25GYWlsZWQoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRDcmVhdGVJbnB1dFN1cmZhY2UsIHRoaXMpKS0+cG9zdCgpOworfQorCitzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ0NvZGVjOjpDcmVhdGVPbXhJbnB1dFN1cmZhY2UoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6dXRpbHM7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OlN0YXR1cyBPbXhTdGF0dXM7CisgICAgYW5kcm9pZDo6c3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZSBIR3JhcGhpY0J1ZmZlclNvdXJjZTsKKyAgICBPbXhTdGF0dXMgczsKKyAgICBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYnA7CisgICAgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdiczsKKyAgICBhbmRyb2lkOjpSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBvbXgtPmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIFsmcywgJmdicCwgJmdic10oCisgICAgICAgICAgICAgICAgICAgIE9teFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBzID0gc3RhdHVzOworICAgICAgICAgICAgICAgIGdicCA9IHByb2R1Y2VyOworICAgICAgICAgICAgICAgIGdicyA9IHNvdXJjZTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICh0cmFuc1N0YXR1cy5pc09rKCkgJiYgcyA9PSBPbXhTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVudFN1cmZhY2UoCisgICAgICAgICAgICAgICAgbmV3IEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihnYnApLAorICAgICAgICAgICAgICAgIHNwPDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJTb3VyY2U+KG5ldyBMV0dyYXBoaWNCdWZmZXJTb3VyY2UoZ2JzKSkpOworICAgIH0KKworICAgIHJldHVybiBudWxscHRyOworfQorCitzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ0NvZGVjOjpDcmVhdGVDb21wYXRpYmxlSW5wdXRTdXJmYWNlKCkgeworICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlKENyZWF0ZUlucHV0U3VyZmFjZSgpKTsKKworICAgIGlmIChzdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3VyZmFjZSA9IENyZWF0ZU9teElucHV0U3VyZmFjZSgpOworICAgIH0KKworICAgIHJldHVybiBzdXJmYWNlOworfQorCit2b2lkIENDb2RlYzo6Y3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHN0YXR1c190IGVycjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKKworICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpbnB1dEZvcm1hdCA9IGNvbmZpZy0+bUlucHV0Rm9ybWF0OworICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CisgICAgfQorCisgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHBlcnNpc3RlbnRTdXJmYWNlID0gQ3JlYXRlQ29tcGF0aWJsZUlucHV0U3VyZmFjZSgpOworCisgICAgaWYgKHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCkpIHsKKyAgICAgICAgc3A8SUlucHV0U3VyZmFjZT4gaGlkbElucHV0U3VyZmFjZSA9IElJbnB1dFN1cmZhY2U6OmNhc3RGcm9tKAorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCkpOworICAgICAgICBpZiAoIWhpZGxJbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3JydXB0ZWQgaW5wdXQgc3VyZmFjZSIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPihoaWRsSW5wdXRTdXJmYWNlKTsKKyAgICAgICAgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxDMklucHV0U3VyZmFjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIGlucHV0U3VyZmFjZSkpOworICAgICAgICBidWZmZXJQcm9kdWNlciA9IGlucHV0U3VyZmFjZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCk7CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpOworICAgICAgICBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0QnVmZmVyU291cmNlKCksIHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgYnVmZmVyUHJvZHVjZXIgPSBwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0QnVmZmVyUHJvZHVjZXIoKTsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHVwIGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRlZCgKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0LAorICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgbmV3IEJ1ZmZlclByb2R1Y2VyV3JhcHBlcihidWZmZXJQcm9kdWNlcikpOworfQorCitzdGF0dXNfdCBDQ29kZWM6OnNldHVwSW5wdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSkgeworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICBjb25maWctPm1Vc2luZ1N1cmZhY2UgPSB0cnVlOworCisgICAgLy8gd2UgYXJlIG5vdyB1c2luZyBzdXJmYWNlIC0gYXBwbHkgZGVmYXVsdCBjb2xvciBhc3BlY3RzIHRvIGlucHV0IGZvcm1hdCAtIGFzIHdlbGwgYXMKKyAgICAvLyBnZXQgZGF0YXNwYWNlCisgICAgYm9vbCBpbnB1dEZvcm1hdENoYW5nZWQgPSBjb25maWctPnVwZGF0ZUZvcm1hdHMoY29uZmlnLT5JU19JTlBVVCk7CisgICAgQUxPR0QoImlucHV0IGZvcm1hdCAlcyB0byAlcyIsCisgICAgICAgICAgICBpbnB1dEZvcm1hdENoYW5nZWQgPyAiY2hhbmdlZCIgOiAidW5jaGFuZ2VkIiwKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgLy8gY29uZmlndXJlIGRhdGFzcGFjZQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludDMyX3QpID09IHNpemVvZihhbmRyb2lkX2RhdGFzcGFjZSksICJkYXRhc3BhY2Ugc2l6ZSBtaXNtYXRjaCIpOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKKyAgICAodm9pZCljb25maWctPm1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCopJmRhdGFTcGFjZSk7CisgICAgc3VyZmFjZS0+c2V0RGF0YVNwYWNlKGRhdGFTcGFjZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2hhbm5lbC0+c2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgLy8gdW5kbyBpbnB1dCBmb3JtYXQgdXBkYXRlCisgICAgICAgIGNvbmZpZy0+bVVzaW5nU3VyZmFjZSA9IGZhbHNlOworICAgICAgICAodm9pZCljb25maWctPnVwZGF0ZUZvcm1hdHMoY29uZmlnLT5JU19JTlBVVCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9IHN1cmZhY2U7CisKKyAgICBpZiAoY29uZmlnLT5tSVNDb25maWcpIHsKKyAgICAgICAgc3VyZmFjZS0+Y29uZmlndXJlKCpjb25maWctPm1JU0NvbmZpZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIklTQ29uZmlnOiBubyBjb25maWd1cmF0aW9uIik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldElucHV0U3VyZmFjZSwgdGhpcyk7CisgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBzdXJmYWNlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgIH0KKyAgICBhdXRvIGhpZGxUYXJnZXQgPSBzdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCk7CisgICAgaWYgKGhpZGxUYXJnZXQpIHsKKyAgICAgICAgc3A8SUlucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0KKyAgICAgICAgICAgICAgICBJSW5wdXRTdXJmYWNlOjpjYXN0RnJvbShoaWRsVGFyZ2V0KTsKKyAgICAgICAgaWYgKCFpbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGlucHV0IHN1cmZhY2U6IENvcnJ1cHRlZCBzdXJmYWNlLiIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZURlY2xpbmVkKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKHN0ZDo6bWFrZV9zaGFyZWQ8QzJJbnB1dFN1cmZhY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPihpbnB1dFN1cmZhY2UpKSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHVwIGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCk7CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBzdXJmYWNlLT5nZXRCdWZmZXJTb3VyY2UoKSwgd2lkdGgsIGhlaWdodCkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCB1cCBpbnB1dCBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlRGVjbGluZWQoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQWNjZXB0ZWQoaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVN0YXJ0KCkgeworICAgIGF1dG8gc2V0U3RhcnRpbmcgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFNUQVJUSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0U3RhcnRpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6c3RhcnQoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tTdGFydGluZyA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gU1RBUlRJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tTdGFydGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXAtPnN0YXJ0KCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IodG9TdGF0dXNUKGVyciwgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQ7CisgICAgc3RhdHVzX3QgZXJyMiA9IE9LOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpbnB1dEZvcm1hdCA9IGNvbmZpZy0+bUlucHV0Rm9ybWF0OworICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CisgICAgICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIGVycjIgPSBjb25maWctPm1JbnB1dFN1cmZhY2UtPnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVycjIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlcnIyID0gbUNoYW5uZWwtPnN0YXJ0KGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOworICAgIGlmIChlcnIyICE9IE9LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIHNldFJ1bm5pbmcgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gU1RBUlRJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUlVOTklORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldFJ1bm5pbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNhbGxiYWNrLT5vblN0YXJ0Q29tcGxldGVkKCk7CisKKyAgICAodm9pZCltQ2hhbm5lbC0+cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSB7CisgICAgaWYgKGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKKyAgICAgICAgaW5pdGlhdGVTdG9wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5pdGlhdGVSZWxlYXNlKCk7CisgICAgfQorfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTdG9wKCkgeworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IEFMTE9DQVRFRAorICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSAgPT0gUkVMRUFTRUQKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgPT0gU1RPUFBJTkcKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTSU5HKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IHN0b3BwZWQsIHJlbGVhc2VkLCBvciBkb2luZyBpdCByaWdodCBub3cuCisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25TdG9wQ29tcGxldGVkKCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChTVE9QUElORyk7CisgICAgfQorCisgICAgbUNoYW5uZWwtPnN0b3AoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzdG9wKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgLy8gV2UncmUgYWxyZWFkeSBzdG9wcGVkIG9yIHJlbGVhc2UgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uU3RvcENvbXBsZXRlZCgpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLT5nZXQoKSAhPSBTVE9QUElORykgeworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gY29tcC0+c3RvcCgpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgLy8gVE9ETzogY29udmVydCBlcnIgaW50byBzdGF0dXNfdAorICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gU1RPUFBJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoQUxMT0NBVEVEKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uU3RvcENvbXBsZXRlZCgpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVSZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrIC8qID0gdHJ1ZSAqLykgeworICAgIGJvb2wgY2xlYXJJbnB1dFN1cmZhY2VJZk5lZWRlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEIHx8IHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgcmVsZWFzZWQgb3IgZG9pbmcgaXQgcmlnaHQgbm93LgorICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gQUxMT0NBVElORykgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNJTkcpOworICAgICAgICAgICAgLy8gV2l0aCB0aGUgYWx0ZXJlZCBzdGF0ZSBhbGxvY2F0ZSgpIHdvdWxkIGZhaWwgYW5kIGNsZWFuIHVwLgorICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gU1RBUlRJTkcKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgPT0gUlVOTklORworICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBTVE9QUElORykgeworICAgICAgICAgICAgLy8gSW5wdXQgc3VyZmFjZSBtYXkgaGF2ZSBiZWVuIHN0YXJ0ZWQsIHNvIGNsZWFuIHVwIGlzIG5lZWRlZC4KKyAgICAgICAgICAgIGNsZWFySW5wdXRTdXJmYWNlSWZOZWVkZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTSU5HKTsKKyAgICB9CisKKyAgICBpZiAoY2xlYXJJbnB1dFN1cmZhY2VJZk5lZWRlZCkgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+ZGlzY29ubmVjdCgpOworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1DaGFubmVsLT5zdG9wKCk7CisgICAgLy8gdGhpeiBob2xkcyBzdHJvbmcgcmVmIHRvIHRoaXMgd2hpbGUgdGhlIHRocmVhZCBpcyBydW5uaW5nLgorICAgIHNwPENDb2RlYz4gdGhpeih0aGlzKTsKKyAgICBzdGQ6OnRocmVhZChbdGhpeiwgc2VuZENhbGxiYWNrXSB7IHRoaXotPnJlbGVhc2Uoc2VuZENhbGxiYWNrKTsgfSkuZGV0YWNoKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpyZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEKSB7CisgICAgICAgICAgICBpZiAoc2VuZENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgIH0KKyAgICBjb21wLT5yZWxlYXNlKCk7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgIHN0YXRlLT5jb21wLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENDb2RlYzo6c2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHJldHVybiBtQ2hhbm5lbC0+c2V0U3VyZmFjZShzdXJmYWNlKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbEZsdXNoKCkgeworICAgIHN0YXR1c190IGVyciA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBGTFVTSEVEKSB7CisgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KEZMVVNISU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0oKTsKKyAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBjYXNlIEFMUkVBRFlfRVhJU1RTOgorICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkZsdXNoQ29tcGxldGVkKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpmbHVzaCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgYXV0byBjaGVja0ZsdXNoaW5nID0gW3RoaXMsICZjb21wXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBGTFVTSElORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja0ZsdXNoaW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wLT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Pjo6TG9ja2VkIHF1ZXVlKG1Xb3JrRG9uZVF1ZXVlKTsKKyAgICAgICAgZmx1c2hlZFdvcmsuc3BsaWNlKGZsdXNoZWRXb3JrLmVuZCgpLCAqcXVldWUpOworICAgIH0KKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIC8vIFRPRE86IGNvbnZlcnQgZXJyIGludG8gc3RhdHVzX3QKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+Zmx1c2goZmx1c2hlZFdvcmspOworCisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHN0YXRlLT5zZXQoRkxVU0hFRCk7CisgICAgfQorICAgIG1DYWxsYmFjay0+b25GbHVzaENvbXBsZXRlZCgpOworfQorCit2b2lkIENDb2RlYzo6c2lnbmFsUmVzdW1lKCkgeworICAgIGF1dG8gc2V0UmVzdW1pbmcgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gRkxVU0hFRCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSRVNVTUlORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldFJlc3VtaW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKHZvaWQpbUNoYW5uZWwtPnN0YXJ0KG51bGxwdHIsIG51bGxwdHIpOworCisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gUkVTVU1JTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFJVTk5JTkcpOworICAgIH0KKworICAgICh2b2lkKW1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworfQorCit2b2lkIENDb2RlYzo6c2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrU3RhdGUgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja1N0YXRlKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTk9URTogV2UgdXNlZCB0byBpZ25vcmUgImJpdHJhdGUiIGF0IHNldFBhcmFtZXRlcnM7IHJlcGxpY2F0ZQorICAgIC8vICAgICAgIHRoZSBiZWhhdmlvciBoZXJlLgorICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBtc2c7CisgICAgaW50MzJfdCBiaXRyYXRlOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihLRVlfQklUX1JBVEUsICZiaXRyYXRlKSkgeworICAgICAgICBwYXJhbXMgPSBtc2ctPmR1cCgpOworICAgICAgICBwYXJhbXMtPnJlbW92ZUVudHJ5QXQocGFyYW1zLT5maW5kRW50cnlCeU5hbWUoS0VZX0JJVF9SQVRFKSk7CisgICAgfQorCisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworCisgICAgLyoqCisgICAgICogSGFuZGxlIGlucHV0IHN1cmZhY2UgcGFyYW1ldGVycworICAgICAqLworICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkKKyAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpICYmIGNvbmZpZy0+bUlucHV0U3VyZmFjZSAmJiBjb25maWctPm1JU0NvbmZpZykgeworICAgICAgICAodm9pZClwYXJhbXMtPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCAmY29uZmlnLT5tSVNDb25maWctPm1UaW1lT2Zmc2V0VXMpOworCisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQ2NCgic2tpcC1mcmFtZXMtYmVmb3JlIiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tU3RhcnRBdFVzKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLT5maW5kSW50NjQoInN0b3AtdGltZS11cyIsICZjb25maWctPm1JU0NvbmZpZy0+bVN0b3BBdFVzKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZGVkID0gdmFsdWU7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRBdFVzID0gLTE7CisgICAgICAgICAgICAodm9pZClwYXJhbXMtPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX1NVU1BFTkRfVElNRSwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMpOworICAgICAgICB9CisKKyAgICAgICAgKHZvaWQpY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5jb25maWd1cmUoKmNvbmZpZy0+bUlTQ29uZmlnKTsKKyAgICAgICAgaWYgKGNvbmZpZy0+bUlTQ29uZmlnLT5tU3RvcHBlZCkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5fc3RvcC10aW1lLW9mZnNldC11cyIsIGNvbmZpZy0+bUlTQ29uZmlnLT5tSW5wdXREZWxheVVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOworICAgICh2b2lkKWNvbmZpZy0+Z2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgIGNvbXAsIHBhcmFtcywgQ29uZmlnOjpJU19QQVJBTSwgQzJfTUFZX0JMT0NLLCAmY29uZmlnVXBkYXRlKTsKKyAgICAvLyBQcmVmZXIgdG8gcGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSBidWZmZXIgY2hhbm5lbCwgc28gdGhleSBjYW4gYmUgc3luY2hyb25pemVkIHdpdGggdGhlIGZyYW1lcy4KKyAgICAvLyBQYXJhbWV0ZXIgc3luY2hyb25pemF0aW9uIGlzIG5vdCBkZWZpbmVkIHdoZW4gdXNpbmcgaW5wdXQgc3VyZmFjZS4gRm9yIG5vdywgcm91dGUKKyAgICAvLyB0aGVzZSBkaXJlY3RseSB0byB0aGUgY29tcG9uZW50LgorICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UgPT0gbnVsbHB0cgorICAgICAgICAgICAgJiYgKHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfZGVsYXllZF9wYXJhbXMiLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgY29tcC0+Z2V0TmFtZSgpLmZpbmQoImMyLmFuZHJvaWQuIikgPT0gMCkpIHsKKyAgICAgICAgbUNoYW5uZWwtPnNldFBhcmFtZXRlcnMoY29uZmlnVXBkYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAodm9pZCljb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgY29uZmlnVXBkYXRlLCBDMl9NQVlfQkxPQ0spOworICAgIH0KK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgbUNhbGxiYWNrLT5vblNpZ25hbGVkSW5wdXRFT1MobUNoYW5uZWwtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxSZXF1ZXN0SURSRnJhbWUoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEKSB7CisgICAgICAgICAgICBBTE9HRCgibm8gSURSIHJlcXVlc3Qgc2VudCBzaW5jZSBjb21wb25lbnQgaXMgcmVsZWFzZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgfQorICAgIEFMT0dWKCJyZXF1ZXN0IElEUiIpOworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICBwYXJhbXMucHVzaF9iYWNrKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4oMHUsIHRydWUpKTsKKyAgICBjb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgcGFyYW1zLCBDMl9NQVlfQkxPQ0spOworfQorCit2b2lkIENDb2RlYzo6b25Xb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpIHsKKyAgICBpZiAoIXdvcmtJdGVtcy5lbXB0eSgpKSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj46OkxvY2tlZCBxdWV1ZShtV29ya0RvbmVRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5zcGxpY2UocXVldWUtPmVuZCgpLCB3b3JrSXRlbXMpOworICAgIH0KKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0V29ya0RvbmUsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6b25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIHsKKyAgICBtQ2hhbm5lbC0+b25JbnB1dEJ1ZmZlckRvbmUoZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIFRpbWVQb2ludCBub3cgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBDQ29kZWNXYXRjaGRvZzo6Z2V0SW5zdGFuY2UoKS0+d2F0Y2godGhpcyk7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0QWxsb2NhdGU6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxNTBtcywgImFsbG9jYXRlIik7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZvYmopKTsKKyAgICAgICAgICAgIGFsbG9jYXRlKChNZWRpYUNvZGVjSW5mbyAqKW9iai5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6Y29tbWl0X3NtKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAyNTBtcywgImNvbmZpZ3VyZSIpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6c3RhcnQoKSBzaG91bGQgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgNTUwbXMsICJzdGFydCIpOworICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6c3RvcCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1NTBtcywgInN0b3AiKTsKKyAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRGbHVzaDogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OmZsdXNoX3NtKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1MG1zLCAiZmx1c2giKTsKKyAgICAgICAgICAgIGZsdXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOiB7CisgICAgICAgICAgICAvLyBTdXJmYWNlIG9wZXJhdGlvbnMgbWF5IGJlIGJyaWVmbHkgYmxvY2tpbmcuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDEwMG1zLCAiY3JlYXRlSW5wdXRTdXJmYWNlIik7CisgICAgICAgICAgICBjcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTZXRJbnB1dFN1cmZhY2U6IHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2Ugb3BlcmF0aW9ucyBtYXkgYmUgYnJpZWZseSBibG9ja2luZy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTAwbXMsICJzZXRJbnB1dFN1cmZhY2UiKTsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKKyAgICAgICAgICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlKHN0YXRpY19jYXN0PFBlcnNpc3RlbnRTdXJmYWNlICo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgc2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFdvcmtEb25lOiB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAgICAgYm9vbCBzaG91bGRQb3N0ID0gZmFsc2U7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Pjo6TG9ja2VkIHF1ZXVlKG1Xb3JrRG9uZVF1ZXVlKTsKKyAgICAgICAgICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsuc3dhcChxdWV1ZS0+ZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHNob3VsZFBvc3QgPSAhcXVldWUtPmVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hvdWxkUG9zdCkgeworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXb3JrRG9uZSwgdGhpcykpLT5wb3N0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgaW4gd29yayBkb25lCisgICAgICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIENvbmZpZzo6V2F0Y2hlcjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBpbml0RGF0YSA9CisgICAgICAgICAgICAgICAgY29uZmlnLT53YXRjaDxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PigpOworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICYmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIEMyRnJhbWVEYXRhOjpGTEFHX0RJU0NBUkRfRlJBTUUpID09IDApIHsKKworICAgICAgICAgICAgICAgIC8vIGNvcHkgYnVmZmVyIGluZm8gdG8gY29uZmlnCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiB1cGRhdGVzID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHN0cmVhbSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWYgOiB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+ICZpbmZvIDogYnVmLT5pbmZvKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgYWxsIGluZm8gaW50byBvdXRwdXQtc3RyZWFtICMwIGRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weUFzU3RyZWFtKCppbmZvLCB0cnVlIC8qIG91dHB1dCAqLywgc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA6IGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQUxPR1YoImdvdCBvdXRwdXQgYnVmZmVyIHdpdGggY3JvcCAldSwldSsldSwldSBhbmQgc2l6ZSAldSwldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS5sZWZ0LCBibG9jay5jcm9wKCkudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay5jcm9wKCkud2lkdGgsIGJsb2NrLmNyb3AoKS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbUNyb3BSZWN0SW5mbzo6b3V0cHV0KHN0cmVhbSwgYmxvY2suY3JvcCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBibG9jay53aWR0aCgpLCBibG9jay5oZWlnaHQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGZvciBub3cgb25seSBkbyB0aGUgZmlyc3QgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK3N0cmVhbTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gY29uZmlnLT51cGRhdGVDb25maWd1cmF0aW9uKHVwZGF0ZXMsIGNvbmZpZy0+bU91dHB1dERvbWFpbik7CisKKyAgICAgICAgICAgICAgICAvLyBjb3B5IHN0YW5kYXJkIGluZm9zIHRvIGdyYXBoaWMgYnVmZmVycyBpZiBub3QgYWxyZWFkeSBwcmVzZW50IChvdGhlcndpc2UsIHdlCisgICAgICAgICAgICAgICAgLy8gbWF5IG92ZXJ3cml0ZSB0aGUgYWN0dWFsIGludGVybWVkaWF0ZSB2YWx1ZSB3aXRoIGEgZmluYWwgdmFsdWUpCisgICAgICAgICAgICAgICAgc3RyZWFtID0gMDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHN0ZEdmeEluZm9zID0geworICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogc3RkR2Z4SW5mb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1Zi0+aGFzSW5mbyhpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqcGFyYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShpeC53aXRoU3RyZWFtKHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBpbmZvKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPnNldEluZm8oc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMySW5mbz4oaW5mbykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrc3RyZWFtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DaGFubmVsLT5vbldvcmtEb25lKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUod29yayksIGNoYW5nZWQgPyBjb25maWctPm1PdXRwdXRGb3JtYXQgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBpbml0RGF0YS5oYXNDaGFuZ2VkKCkgPyBpbml0RGF0YS51cGRhdGUoKS5nZXQoKSA6IG51bGxwdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFdhdGNoOiB7CisgICAgICAgICAgICAvLyB3YXRjaCBtZXNzYWdlIGFscmVhZHkgcG9zdGVkOyBuby1vcC4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnJlY29nbml6ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc2V0RGVhZGxpbmUoVGltZVBvaW50OjptYXgoKSwgMG1zLCAibm9uZSIpOworfQorCit2b2lkIENDb2RlYzo6c2V0RGVhZGxpbmUoCisgICAgICAgIGNvbnN0IFRpbWVQb2ludCAmbm93LAorICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0LAorICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaW50MzJfdCBtdWx0ID0gc3RkOjptYXgoMSwgcHJvcGVydHlfZ2V0X2ludDMyKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfdGltZW91dF9tdWx0IiwgMSkpOworICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobURlYWRsaW5lKTsKKyAgICBkZWFkbGluZS0+c2V0KG5vdyArICh0aW1lb3V0ICogbXVsdCksIG5hbWUpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGJvb2wgcGVuZGluZ0RlYWRsaW5lID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1EZWFkbGluZSk7CisgICAgICAgIGlmIChkZWFkbGluZS0+Z2V0KCkgPCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSkgeworICAgICAgICAgICAgbmFtZSA9IGRlYWRsaW5lLT5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYWRsaW5lLT5nZXQoKSAhPSBUaW1lUG9pbnQ6Om1heCgpKSB7CisgICAgICAgICAgICBwZW5kaW5nRGVhZGxpbmUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgY29uc3RleHByIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGtXb3JrRHVyYXRpb25UaHJlc2hvbGQgPSAzczsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gZWxhcHNlZCA9IG1DaGFubmVsLT5lbGFwc2VkKCk7CisgICAgICAgIGlmIChlbGFwc2VkID49IGtXb3JrRHVyYXRpb25UaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIG5hbWUgPSAicXVldWUiOworICAgICAgICB9CisgICAgICAgIGlmIChlbGFwc2VkID4gMHMpIHsKKyAgICAgICAgICAgIHBlbmRpbmdEZWFkbGluZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICAvLyBXZSdyZSBub3Qgc3R1Y2suCisgICAgICAgIGlmIChwZW5kaW5nRGVhZGxpbmUpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBub3Qgc3R1Y2sgeWV0IGJ1dCBzdGlsbCBoYXMgZGVhZGxpbmUgY29taW5nIHVwLAorICAgICAgICAgICAgLy8gcG9zdCB3YXRjaCBtZXNzYWdlIHRvIGNoZWNrIGJhY2sgbGF0ZXIuCisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0V2F0Y2gsIHRoaXMpKS0+cG9zdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVygicHJldmlvdXMgY2FsbCB0byAlcyBleGNlZWRlZCB0aW1lb3V0IiwgbmFtZS5jX3N0cigpKTsKKyAgICBpbml0aWF0ZVJlbGVhc2UoZmFsc2UpOworICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgYW5kcm9pZDo6Q29kZWNCYXNlICpDcmVhdGVDb2RlYygpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OkNDb2RlYzsKK30KKworLy8gQ3JlYXRlIENvZGVjIDIuMCBpbnB1dCBzdXJmYWNlCitleHRlcm4gIkMiIGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlICpDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgLy8gQXR0ZW1wdCB0byBjcmVhdGUgYSBDb2RlYzIncyBpbnB1dCBzdXJmYWNlLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlSW5wdXRTdXJmYWNlKCk7CisgICAgaWYgKCFpbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2UoCisgICAgICAgICAgICBpbnB1dFN1cmZhY2UtPmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZDo6c3A8YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+PigKKyAgICAgICAgICAgIGlucHV0U3VyZmFjZS0+Z2V0SGFsSW50ZXJmYWNlKCkpKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjNjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENfQ09ERUNfSF8KKyNkZWZpbmUgQ19DT0RFQ19IXworCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorI2luY2x1ZGUgPG5hdGl2ZWJhc2UvbmF0aXZlYmFzZS5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQ29uZmlnLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDsKK2NsYXNzIElucHV0U3VyZmFjZVdyYXBwZXI7CitzdHJ1Y3QgTWVkaWFDb2RlY0luZm87CisKK2NsYXNzIENDb2RlYyA6IHB1YmxpYyBDb2RlY0Jhc2UgeworcHVibGljOgorICAgIENDb2RlYygpOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyQ2hhbm5lbEJhc2U+IGdldEJ1ZmZlckNoYW5uZWwoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGZhbHNlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRmx1c2goKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKTsKKyAgICB2b2lkIG9uV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKTsKKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkNDb2RlYygpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgVGltZVBvaW50OworCisgICAgc3RhdHVzX3QgdHJ5QW5kUmVwb3J0T25FcnJvcihzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGpvYik7CisKKyAgICB2b2lkIGluaXRpYXRlU3RvcCgpOworICAgIHZvaWQgaW5pdGlhdGVSZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrID0gdHJ1ZSk7CisKKyAgICB2b2lkIGFsbG9jYXRlKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmY29kZWNJbmZvKTsKKyAgICB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBzdGFydCgpOworICAgIHZvaWQgc3RvcCgpOworICAgIHZvaWQgZmx1c2goKTsKKyAgICB2b2lkIHJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnB1dCBzdXJmYWNlIGZvciB0aGUgY3VycmVudCBkZXZpY2UgY29uZmlndXJhdGlvbiBjb21wYXRpYmxlIHdpdGggQ0NvZGVjLgorICAgICAqIFRoaXMgY291bGQgYmUgYmFja2VkIGJ5IHRoZSBDMiBIQUwgb3IgdGhlIE9NWCBIQUwuCisgICAgICovCisgICAgc3RhdGljIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBDcmVhdGVDb21wYXRpYmxlSW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLy8gQ3JlYXRlcyBhbiBpbnB1dCBzdXJmYWNlIHRvIHRoZSBPTVggSEFMCisgICAgc3RhdGljIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBDcmVhdGVPbXhJbnB1dFN1cmZhY2UoKTsKKworICAgIC8vLyBoYW5kbGUgYSBjcmVhdGUgaW5wdXQgc3VyZmFjZSBjYWxsCisgICAgdm9pZCBjcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICB2b2lkIHNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpOworICAgIHN0YXR1c190IHNldHVwSW5wdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSk7CisKKyAgICB2b2lkIHNldERlYWRsaW5lKAorICAgICAgICAgICAgY29uc3QgVGltZVBvaW50ICZub3csCisgICAgICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0LAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRBbGxvY2F0ZSwKKyAgICAgICAga1doYXRDb25maWd1cmUsCisgICAgICAgIGtXaGF0U3RhcnQsCisgICAgICAgIGtXaGF0Rmx1c2gsCisgICAgICAgIGtXaGF0U3RvcCwKKyAgICAgICAga1doYXRSZWxlYXNlLAorICAgICAgICBrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwKKyAgICAgICAga1doYXRTZXRJbnB1dFN1cmZhY2UsCisgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycywKKworICAgICAgICBrV2hhdFdvcmtEb25lLAorICAgICAgICBrV2hhdFdhdGNoLAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAgUkVMRUFTRUQsCisgICAgICAgIEFMTE9DQVRFRCwKKyAgICAgICAgRkxVU0hFRCwKKyAgICAgICAgUlVOTklORywKKworICAgICAgICBBTExPQ0FUSU5HLCAgLy8gUkVMRUFTRUQgLT4gQUxMT0NBVEVECisgICAgICAgIFNUQVJUSU5HLCAgICAvLyBBTExPQ0FURUQgLT4gUlVOTklORworICAgICAgICBTVE9QUElORywgICAgLy8gUlVOTklORyAtPiBBTExPQ0FURUQKKyAgICAgICAgRkxVU0hJTkcsICAgIC8vIFJVTk5JTkcgLT4gRkxVU0hFRAorICAgICAgICBSRVNVTUlORywgICAgLy8gRkxVU0hFRCAtPiBSVU5OSU5HCisgICAgICAgIFJFTEVBU0lORywgICAvLyB7QU5ZIEVYQ0VQVCBSRUxFQVNFRH0gLT4gUkVMRUFTRUQKKyAgICB9OworCisgICAgc3RydWN0IFN0YXRlIHsKKyAgICAgICAgaW5saW5lIFN0YXRlKCkgOiBtU3RhdGUoUkVMRUFTRUQpIHt9CisgICAgICAgIGlubGluZSBpbnQgZ2V0KCkgY29uc3QgeyByZXR1cm4gbVN0YXRlOyB9CisgICAgICAgIGlubGluZSB2b2lkIHNldChpbnQgbmV3U3RhdGUpIHsgbVN0YXRlID0gbmV3U3RhdGU7IH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG1TdGF0ZTsKKyAgICB9OworCisgICAgc3RydWN0IE5hbWVkVGltZVBvaW50IHsKKyAgICAgICAgTmFtZWRUaW1lUG9pbnQoKSA6IG1UaW1lUG9pbnQoVGltZVBvaW50OjptYXgoKSksIG1OYW1lKCIiKSB7fQorCisgICAgICAgIGlubGluZSB2b2lkIHNldCgKKyAgICAgICAgICAgICAgICBjb25zdCBUaW1lUG9pbnQgJnRpbWVQb2ludCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgICAgICAgICBtVGltZVBvaW50ID0gdGltZVBvaW50OworICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIFRpbWVQb2ludCBnZXQoKSBjb25zdCB7IHJldHVybiBtVGltZVBvaW50OyB9CisgICAgICAgIGlubGluZSBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBwcml2YXRlOgorICAgICAgICBUaW1lUG9pbnQgbVRpbWVQb2ludDsKKyAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgfTsKKworICAgIE11dGV4ZWQ8U3RhdGU+IG1TdGF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbD4gbUNoYW5uZWw7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtQ2xpZW50TGlzdGVuZXI7CisgICAgc3RydWN0IENsaWVudExpc3RlbmVyOworCisgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD4gbURlYWRsaW5lOworICAgIHR5cGVkZWYgQ0NvZGVjQ29uZmlnIENvbmZpZzsKKyAgICBNdXRleGVkPENvbmZpZz4gbUNvbmZpZzsKKyAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+IG1Xb3JrRG9uZVF1ZXVlOworCisgICAgZnJpZW5kIGNsYXNzIENDb2RlY0NhbGxiYWNrSW1wbDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENDb2RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENfQ09ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjZhZjkzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC0wLDAgKzEsMjkyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDQ29kZWNCdWZmZXJDaGFubmVsIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIgorI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlci5oIgorI2luY2x1ZGUgIlNraXBDdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CisKK3VzaW5nIENhc1N0YXR1cyA9IGhhcmR3YXJlOjpjYXM6OlYxXzA6OlN0YXR1czsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciByZXByZXNlbnRhdGlvbiBvZiBidWZmZXJzIGF0IG9uZSBwb3J0LgorICovCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiQnVmZmVycyIpCisgICAgICAgIDogbUNvbXBvbmVudE5hbWUoY29tcG9uZW50TmFtZSksCisgICAgICAgICAgbUNoYW5uZWxOYW1lKHN0ZDo6c3RyaW5nKGNvbXBvbmVudE5hbWUpICsgIjoiICsgbmFtZSksCisgICAgICAgICAgbU5hbWUobUNoYW5uZWxOYW1lLmNfc3RyKCkpIHsKKyAgICB9CisgICAgdmlydHVhbCB+QnVmZmVycygpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNldCBmb3JtYXQgZm9yIE1lZGlhQ29kZWMtZmFjaW5nIGJ1ZmZlcnMuCisgICAgICovCisgICAgdm9pZCBzZXRGb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICAgICAgQ0hFQ0soZm9ybWF0ICE9IG51bGxwdHIpOworICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvcHkgb2YgY3VycmVudCBmb3JtYXQuCisgICAgICovCisgICAgc3A8QU1lc3NhZ2U+IGR1cEZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuIG1Gb3JtYXQgIT0gbnVsbHB0ciA/IG1Gb3JtYXQtPmR1cCgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlcnMgYXJlIG9wZXJhdGluZyB1bmRlciBhcnJheSBtb2RlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvKioKKyAgICAgKiBGaWxscyB0aGUgdmVjdG9yIHdpdGggTWVkaWFDb2RlY0J1ZmZlcidzIGlmIGluIGFycmF5IG1vZGU7IG90aGVyd2lzZSwKKyAgICAgKiBuby1vcC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqKSBjb25zdCB7fQorCisgICAgLyoqCisgICAgICogUmV0dXJuIG51bWJlciBvZiBidWZmZXJzIHRoZSBjbGllbnQgb3ducy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgPSAwOworCisgICAgdm9pZCBoYW5kbGVJbWFnZURhdGEoY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YUNhbmRpZGF0ZSA9IGJ1ZmZlci0+Z2V0SW1hZ2VEYXRhKCk7CisgICAgICAgIGlmIChpbWFnZURhdGFDYW5kaWRhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YTsKKyAgICAgICAgaWYgKCFtRm9ybWF0LT5maW5kQnVmZmVyKCJpbWFnZS1kYXRhIiwgJmltYWdlRGF0YSkKKyAgICAgICAgICAgICAgICB8fCBpbWFnZURhdGFDYW5kaWRhdGUtPnNpemUoKSAhPSBpbWFnZURhdGEtPnNpemUoKQorICAgICAgICAgICAgICAgIHx8IG1lbWNtcChpbWFnZURhdGFDYW5kaWRhdGUtPmRhdGEoKSwgaW1hZ2VEYXRhLT5kYXRhKCksIGltYWdlRGF0YS0+c2l6ZSgpKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyBpbWFnZS1kYXRhIiwgbU5hbWUpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5ld0Zvcm1hdCA9IGR1cEZvcm1hdCgpOworICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRCdWZmZXIoImltYWdlLWRhdGEiLCBpbWFnZURhdGFDYW5kaWRhdGUpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgKmltZyA9IChNZWRpYUltYWdlMiopaW1hZ2VEYXRhQ2FuZGlkYXRlLT5kYXRhKCk7CisgICAgICAgICAgICBpZiAoaW1nLT5tTnVtUGxhbmVzID4gMCAmJiBpbWctPm1UeXBlICE9IGltZy0+TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOworICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1NUUklERSwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyBzdHJpZGUgPSAlZCIsIG1OYW1lLCBzdHJpZGUpOworICAgICAgICAgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAxICYmIHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2c3RyaWRlID0gKGltZy0+bVBsYW5lWzFdLm1PZmZzZXQgLSBpbWctPm1QbGFuZVswXS5tT2Zmc2V0KSAvIHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfU0xJQ0VfSEVJR0hULCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgdnN0cmlkZSA9ICVkIiwgbU5hbWUsIHZzdHJpZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEZvcm1hdChuZXdGb3JtYXQpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRGb3JtYXQobmV3Rm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOyAvLy88IG5hbWUgb2YgY29tcG9uZW50IGZvciBkZWJ1Z2dpbmcKKyAgICBzdGQ6OnN0cmluZyBtQ2hhbm5lbE5hbWU7IC8vLzwgbmFtZSBvZiBjaGFubmVsIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIGNoYW5uZWwgbmFtZQorICAgIC8vIEZvcm1hdCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBNZWRpYUNvZGVjLWZhY2luZyBidWZmZXJzLgorICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEJ1ZmZlcnMpOworfTsKKworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlcnMgeworcHVibGljOgorICAgIElucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIklucHV0W10iKQorICAgICAgICA6IEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgdmlydHVhbCB+SW5wdXRCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0IGEgYmxvY2sgcG9vbCB0byBvYnRhaW4gaW5wdXQgbWVtb3J5IGJsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFBvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeyBtUG9vbCA9IHBvb2w7IH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBNZWRpYUNvZGVjQnVmZmVyIGZvciBpbnB1dCBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgaW5kZXguCisgICAgICogUmV0dXJucyBmYWxzZSBpZiBubyBuZXcgYnVmZmVyIGNhbiBiZSBvYnRhaW5lZCBhdCB0aGUgbW9tZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSBhbmQgZ2V0IHRoZQorICAgICAqIGFzc29jaWF0ZWQgQzJCdWZmZXIgb2JqZWN0IGJhY2suIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIHdhcyBvbiBmaWxlCisgICAgICogYW5kIHJlbGVhc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgYnVmZmVyIHRoYXQgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlIGNvZGVjIHByb2Nlc3MuIFJldHVybgorICAgICAqIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZSBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggaW50ZXJuYWwgc3RhdGUuIEFmdGVyIHRoaXMgY2FsbCwgbm8gaW5kZXggb3IgYnVmZmVyIHByZXZpb3VzbHkKKyAgICAgKiByZXR1cm5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXJyYXktYmFja2VkIHZlcnNpb24gb2YgaW5wdXQgYnVmZmVycy4gVGhlIHJldHVybmVkIG9iamVjdAorICAgICAqIHNoYWxsIHJldGFpbiB0aGUgaW50ZXJuYWwgc3RhdGUgc28gdGhhdCBpdCB3aWxsIGhvbm9yIGluZGV4IGFuZAorICAgICAqIGJ1ZmZlciBmcm9tIHByZXZpb3VzIGNhbGxzIG9mIHJlcXVlc3ROZXdCdWZmZXIoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBQb29sIHRvIG9idGFpbiBibG9ja3MgZm9yIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtUG9vbDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbnB1dEJ1ZmZlcnMpOworfTsKKworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6T3V0cHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiT3V0cHV0IikKKyAgICAgICAgOiBCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorICAgIHZpcnR1YWwgfk91dHB1dEJ1ZmZlcnMoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBvdXRwdXQgQzJCdWZmZXIgZnJvbSB0aGUgY29tcG9uZW50IGFuZCBvYnRhaW4gY29ycmVzcG9uZGluZworICAgICAqIGluZGV4IGFuZCBNZWRpYUNvZGVjQnVmZmVyIG9iamVjdC4gUmV0dXJucyBmYWxzZSBpZiByZWdpc3RyYXRpb24KKyAgICAgKiBmYWlscy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGNvZGVjIHNwZWNpZmljIGRhdGEgYXMgYSBidWZmZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoCisgICAgICogTWVkaWFDb2RlYyBiZWhhdmlvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqIC8qIGNzZCAqLywKKyAgICAgICAgICAgIHNpemVfdCAqIC8qIGluZGV4ICovLAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKiAvKiBjbGllbnRCdWZmZXIgKi8pID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIHJlZ2lzdGVyQnVmZmVyKCkgYW5kIGdldCB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIEMyQnVmZmVyIG9iamVjdCBiYWNrLiBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZQorICAgICAqIGFuZCByZWxlYXNlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggaW50ZXJuYWwgc3RhdGUuIEFmdGVyIHRoaXMgY2FsbCwgbm8gaW5kZXggb3IgYnVmZmVyIHByZXZpb3VzbHkKKyAgICAgKiByZXR1cm5lZCBmcm9tIHJlZ2lzdGVyQnVmZmVyKCkgaXMgdmFsaWQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXJyYXktYmFja2VkIHZlcnNpb24gb2Ygb3V0cHV0IGJ1ZmZlcnMuIFRoZSByZXR1cm5lZCBvYmplY3QKKyAgICAgKiBzaGFsbCByZXRhaW4gdGhlIGludGVybmFsIHN0YXRlIHNvIHRoYXQgaXQgd2lsbCBob25vciBpbmRleCBhbmQKKyAgICAgKiBidWZmZXIgZnJvbSBwcmV2aW91cyBjYWxscyBvZiByZWdpc3RlckJ1ZmZlcigpLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIFNraXBDdXRCdWZmZXIgb2JqZWN0LgorICAgICAqLworICAgIHZvaWQgaW5pdFNraXBDdXRCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IGRlbGF5LCBpbnQzMl90IHBhZGRpbmcsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgQ0hFQ0sobVNraXBDdXRCdWZmZXIgPT0gbnVsbHB0cik7CisgICAgICAgIG1EZWxheSA9IGRlbGF5OworICAgICAgICBtUGFkZGluZyA9IHBhZGRpbmc7CisgICAgICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgc2V0U2tpcEN1dEJ1ZmZlcihkZWxheSwgcGFkZGluZywgY2hhbm5lbENvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIFNraXBDdXRCdWZmZXIgb2JqZWN0LiBOby1vcCBpZiBpdCdzIG5ldmVyIGluaXRpYWxpemVkLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlU2tpcEN1dEJ1ZmZlcihpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBkZWxheSA9IG1EZWxheTsKKyAgICAgICAgaW50MzJfdCBwYWRkaW5nID0gbVBhZGRpbmc7CisgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBkZWxheSA9ICgoaW50NjRfdClkZWxheSAqIHNhbXBsZVJhdGUpIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICBwYWRkaW5nID0gKChpbnQ2NF90KXBhZGRpbmcgKiBzYW1wbGVSYXRlKSAvIG1TYW1wbGVSYXRlOworICAgICAgICB9CisgICAgICAgIHNldFNraXBDdXRCdWZmZXIoZGVsYXksIHBhZGRpbmcsIGNoYW5uZWxDb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VibWl0IGJ1ZmZlciB0byBTa2lwQ3V0QnVmZmVyIG9iamVjdCwgaWYgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgdm9pZCBzdWJtaXQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNraXBDdXRCdWZmZXItPnN1Ym1pdChidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmZXIgU2tpcEN1dEJ1ZmZlciBvYmplY3QgdG8gdGhlIG90aGVyIEJ1ZmZlcnMgb2JqZWN0LgorICAgICAqLworICAgIHZvaWQgdHJhbnNmZXJTa2lwQ3V0QnVmZmVyKGNvbnN0IHNwPFNraXBDdXRCdWZmZXI+ICZzY2IpIHsKKyAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBzY2I7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3A8U2tpcEN1dEJ1ZmZlcj4gbVNraXBDdXRCdWZmZXI7CisKK3ByaXZhdGU6CisgICAgaW50MzJfdCBtRGVsYXk7CisgICAgaW50MzJfdCBtUGFkZGluZzsKKyAgICBpbnQzMl90IG1TYW1wbGVSYXRlOworCisgICAgdm9pZCBzZXRTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2tpcCwgaW50MzJfdCBjdXQsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzaXplX3QgcHJldlNpemUgPSBtU2tpcEN1dEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKHByZXZTaXplICE9IDB1KSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlenUgYnl0ZXMiLCBtTmFtZSwgcHJldlNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoc2tpcCwgY3V0LCBjaGFubmVsQ291bnQpOworICAgIH0KKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE91dHB1dEJ1ZmZlcnMpOworfTsKKworbmFtZXNwYWNlIHsKKworY29uc3Qgc3RhdGljIHNpemVfdCBrU21vb3RobmVzc0ZhY3RvciA9IDQ7Citjb25zdCBzdGF0aWMgc2l6ZV90IGtSZW5kZXJpbmdEZXB0aCA9IDM7Citjb25zdCBzdGF0aWMgc2l6ZV90IGtMaW5lYXJCdWZmZXJTaXplID0gMTA0ODU3NjsKKy8vIFRoaXMgY2FuIGZpdCA0SyBSR0JBIGZyYW1lLCBhbmQgbW9zdCBsaWtlbHkgY2xpZW50IHdvbid0IG5lZWQgbW9yZSB0aGFuIHRoaXMuCitjb25zdCBzdGF0aWMgc2l6ZV90IGtNYXhMaW5lYXJCdWZmZXJTaXplID0gMzg0MCAqIDIxNjAgKiA0OworCisvKioKKyAqIFNpbXBsZSBsb2NhbCBidWZmZXIgcG9vbCBiYWNrZWQgYnkgc3RkOjp2ZWN0b3IuCisgKi8KK2NsYXNzIExvY2FsQnVmZmVyUG9vbCA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPExvY2FsQnVmZmVyUG9vbD4geworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBMb2NhbEJ1ZmZlclBvb2wgb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xDYXBhY2l0eSAgbWF4IHRvdGFsIHNpemUgb2YgYnVmZmVycyBtYW5hZ2VkIGJ5IHRoaXMgcG9vbC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gIGEgbmV3bHkgY3JlYXRlZCBwb29sIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gQ3JlYXRlKHNpemVfdCBwb29sQ2FwYWNpdHkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+KG5ldyBMb2NhbEJ1ZmZlclBvb2wocG9vbENhcGFjaXR5KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIEFCdWZmZXIgb2JqZWN0IHdob3NlIHNpemUgaXMgYXQgbGVhc3QgfGNhcGFjaXR5fC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGNhcGFjaXR5ICByZXF1ZXN0ZWQgY2FwYWNpdHkKKyAgICAgKiBccmV0dXJuICBudWxscHRyIGlmIHRoZSBwb29sIGNhcGFjaXR5IGlzIHJlYWNoZWQKKyAgICAgKiAgICAgICAgICBhbiBBQnVmZmVyIG9iamVjdCBvdGhlcndpc2UuCisgICAgICovCisgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgIG1Qb29sLmJlZ2luKCksIG1Qb29sLmVuZCgpLAorICAgICAgICAgICAgICAgIFtjYXBhY2l0eV0oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnZlYykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVjLmNhcGFjaXR5KCkgPj0gY2FwYWNpdHk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChpdCAhPSBtUG9vbC5lbmQoKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IFZlY3RvckJ1ZmZlcihzdGQ6Om1vdmUoKml0KSwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgICAgIG1Qb29sLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Vc2VkU2l6ZSArIGNhcGFjaXR5ID4gbVBvb2xDYXBhY2l0eSkgeworICAgICAgICAgICAgd2hpbGUgKCFtUG9vbC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbVVzZWRTaXplIC09IG1Qb29sLmJhY2soKS5jYXBhY2l0eSgpOworICAgICAgICAgICAgICAgIG1Qb29sLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVVzZWRTaXplICsgY2FwYWNpdHkgPiBtUG9vbENhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIm1Vc2VkU2l6ZSA9ICV6dSwgY2FwYWNpdHkgPSAlenUsIG1Qb29sQ2FwYWNpdHkgPSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVVzZWRTaXplLCBjYXBhY2l0eSwgbVBvb2xDYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjKGNhcGFjaXR5KTsKKyAgICAgICAgbVVzZWRTaXplICs9IHZlYy5jYXBhY2l0eSgpOworICAgICAgICByZXR1cm4gbmV3IFZlY3RvckJ1ZmZlcihzdGQ6Om1vdmUodmVjKSwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQUJ1ZmZlciBiYWNrZWQgYnkgc3RkOjp2ZWN0b3IuCisgICAgICovCisgICAgY2xhc3MgVmVjdG9yQnVmZmVyIDogcHVibGljIDo6YW5kcm9pZDo6QUJ1ZmZlciB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGEgVmVjdG9yQnVmZmVyIGJ5IHRha2luZyB0aGUgb3duZXJzaGlwIG9mIHN1cHBsaWVkIHZlY3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZlYyAgIGJhY2tpbmcgdmVjdG9yIG9mIHRoZSBidWZmZXIuIHRoaXMgb2JqZWN0IHRha2VzCisgICAgICAgICAqICAgICAgICAgICAgICBvd25lcnNoaXAgYXQgY29uc3RydWN0aW9uLgorICAgICAgICAgKiBccGFyYW0gcG9vbCAgYSBMb2NhbEJ1ZmZlclBvb2wgb2JqZWN0IHRvIHJldHVybiB0aGUgdmVjdG9yIGF0CisgICAgICAgICAqICAgICAgICAgICAgICBkZXN0cnVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIFZlY3RvckJ1ZmZlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiAmJnZlYywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gJnBvb2wpCisgICAgICAgICAgICA6IEFCdWZmZXIodmVjLmRhdGEoKSwgdmVjLmNhcGFjaXR5KCkpLAorICAgICAgICAgICAgICBtVmVjKHN0ZDo6bW92ZSh2ZWMpKSwKKyAgICAgICAgICAgICAgbVBvb2wocG9vbCkgeworICAgICAgICB9CisKKyAgICAgICAgflZlY3RvckJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IHBvb2wgPSBtUG9vbC5sb2NrKCk7CisgICAgICAgICAgICBpZiAocG9vbCkgeworICAgICAgICAgICAgICAgIC8vIElmIHBvb2wgaXMgYWxpdmUsIHJldHVybiB0aGUgdmVjdG9yIGJhY2sgdG8gdGhlIHBvb2wgc28gdGhhdAorICAgICAgICAgICAgICAgIC8vIGl0IGNhbiBiZSByZWN5Y2xlZC4KKyAgICAgICAgICAgICAgICBwb29sLT5yZXR1cm5WZWN0b3Ioc3RkOjptb3ZlKG1WZWMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVZlYzsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Qb29sOworICAgIH07CisKKyAgICBNdXRleCBtTXV0ZXg7CisgICAgc2l6ZV90IG1Qb29sQ2FwYWNpdHk7CisgICAgc2l6ZV90IG1Vc2VkU2l6ZTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp2ZWN0b3I8dWludDhfdD4+IG1Qb29sOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGNvbnN0cnVjdGluZyBub24tbWFuYWdlZCBMb2NhbEJ1ZmZlclBvb2wuCisgICAgICovCisgICAgZXhwbGljaXQgTG9jYWxCdWZmZXJQb29sKHNpemVfdCBwb29sQ2FwYWNpdHkpCisgICAgICAgIDogbVBvb2xDYXBhY2l0eShwb29sQ2FwYWNpdHkpLCBtVXNlZFNpemUoMCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgYmFjayB0aGUgb3duZXJzaGlwIG9mIHZlYyBmcm9tIHRoZSBkZXN0cnVjdGVkIFZlY3RvckJ1ZmZlciBhbmQgcHV0CisgICAgICogaXQgaW4gZnJvbnQgb2YgdGhlIHBvb2wuCisgICAgICovCisgICAgdm9pZCByZXR1cm5WZWN0b3Ioc3RkOjp2ZWN0b3I8dWludDhfdD4gJiZ2ZWMpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgbVBvb2wucHVzaF9mcm9udChzdGQ6Om1vdmUodmVjKSk7CisgICAgfQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTG9jYWxCdWZmZXJQb29sKTsKK307CisKK3NwPEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiAmbG9jYWxCdWZmZXJQb29sKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSB8fCAhZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgIEFMT0dEKCJmb3JtYXQgbGFja3Mgd2lkdGggb3IgaGVpZ2h0Iik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiZmV0Y2ggZ3JhcGhpYyBibG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBibG9jaywKKyAgICAgICAgICAgIFtsb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEJ1ZmZlclBvb2wtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICB9KTsKK30KKworY2xhc3MgQnVmZmVyc0FycmF5SW1wbDsKKworLyoqCisgKiBGbGV4aWJsZSBidWZmZXIgc2xvdHMgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEZsZXhCdWZmZXJzSW1wbCB7CitwdWJsaWM6CisgICAgRmxleEJ1ZmZlcnNJbXBsKGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogbUltcGxOYW1lKHN0ZDo6c3RyaW5nKG5hbWUpICsgIi5JbXBsIiksCisgICAgICAgICAgbU5hbWUobUltcGxOYW1lLmNfc3RyKCkpIHsgfQorCisgICAgLyoqCisgICAgICogQXNzaWduIGFuIGVtcHR5IHNsb3QgZm9yIGEgYnVmZmVyIGFuZCByZXR1cm4gdGhlIGluZGV4LiBJZiB0aGVyZSdzIG5vCisgICAgICogZW1wdHkgc2xvdCwganVzdCBhZGQgb25lIGF0IHRoZSBlbmQgYW5kIHJldHVybiBpdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBidWZmZXJbaW5dICBhIG5ldyBidWZmZXIgdG8gYXNzaWduIGEgc2xvdC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgICAgaW5kZXggb2YgdGhlIGFzc2lnbmVkIHNsb3QuCisgICAgICovCisgICAgc2l6ZV90IGFzc2lnblNsb3QoY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAmJiBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmV4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBidWZmZXIsIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCkgfSk7CisgICAgICAgIHJldHVybiBtQnVmZmVycy5zaXplKCkgLSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIHNsb3QgZnJvbSB0aGUgY2xpZW50LCBhbmQgZ2V0IHRoZSBDMkJ1ZmZlciBvYmplY3QgYmFjayBmcm9tCisgICAgICogdGhlIHByZXZpb3VzbHkgYXNzaWduZWQgYnVmZmVyLiBOb3RlIHRoYXQgdGhlIHNsb3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlZQorICAgICAqIHVudGlsIHRoZSByZXR1cm5lZCBDMkJ1ZmZlciBvYmplY3QgaXMgZnJlZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBidWZmZXJbaW5dICAgICAgICB0aGUgYnVmZmVyIHByZXZpb3VzbHkgYXNzaWduZWQgYSBzbG90LgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luLG91dF0gIHBvaW50ZXIgdG8gQzJCdWZmZXIgdG8gYmUgcG9wdWxhdGVkLiBJZ25vcmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVsbC4KKyAgICAgKiBccmV0dXJuICB0cnVlICBpZiB0aGUgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSByZWxlYXNlZCBmcm9tIGEgc2xvdAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgcmVsZWFzZVNsb3QoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleCA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKHJlbGVhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdICVzOiBObyBtYXRjaGluZyBidWZmZXIgZm91bmQiLCBtTmFtZSwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gcmVzdWx0ID0gbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIubG9jaygpOworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgcmVzdWx0ID0gY2xpZW50QnVmZmVyLT5hc0MyQnVmZmVyKCk7CisgICAgICAgICAgICBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYzJidWZmZXIpIHsKKyAgICAgICAgICAgICpjMmJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY29tcEJ1ZmZlciB8fCBjb21wQnVmZmVyICE9IGMyYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBidWZmZXIgIyV6dSIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGFuIHVua25vd24gYnVmZmVyIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgQUxPR1YoIlslc10gYnVmZmVycyBhcmUgZmx1c2hlZCAlenUiLCBtTmFtZSwgbUJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuYmVnaW4oKSwgbUJ1ZmZlcnMuZW5kKCksCisgICAgICAgICAgICAgICAgW10oY29uc3QgRW50cnkgJmVudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZW50cnkuY2xpZW50QnVmZmVyICE9IG51bGxwdHIpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQnVmZmVyc0FycmF5SW1wbDsKKworICAgIHN0ZDo6c3RyaW5nIG1JbXBsTmFtZTsgLy8vPCBuYW1lIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIG5hbWUKKworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyOworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IG1CdWZmZXJzOworfTsKKworLyoqCisgKiBTdGF0aWMgYnVmZmVyIHNsb3RzIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgZml4ZWQtc2l6ZSBhcnJheS4KKyAqLworY2xhc3MgQnVmZmVyc0FycmF5SW1wbCB7CitwdWJsaWM6CisgICAgQnVmZmVyc0FycmF5SW1wbCgpCisgICAgICAgIDogbUltcGxOYW1lKCJCdWZmZXJzQXJyYXlJbXBsIiksCisgICAgICAgICAgbU5hbWUobUltcGxOYW1lLmNfc3RyKCkpIHsgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBidWZmZXIgYXJyYXkgZnJvbSB0aGUgb3JpZ2luYWwgfGltcGx8LiBUaGUgYnVmZmVycyBrbm93biBieQorICAgICAqIHRoZSBjbGllbnQgaXMgcHJlc2VydmVkLCBhbmQgdGhlIGVtcHR5IHNsb3RzIGFyZSBwb3B1bGF0ZWQgc28gdGhhdCB0aGUKKyAgICAgKiBhcnJheSBzaXplIGlzIGF0IGxlYXN0IHxtaW5TaXplfC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbXBsW2luXSAgICAgIEZsZXhCdWZmZXJzSW1wbCBvYmplY3QgdXNlZCBzbyBmYXIuCisgICAgICogXHBhcmFtIG1pblNpemVbaW5dICAgbWluaW11bSBzaXplIG9mIHRoZSBidWZmZXIgYXJyYXkuCisgICAgICogXHBhcmFtIGFsbG9jYXRlW2luXSAgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYSBjbGllbnQgYnVmZmVyIGZvciBhbiBlbXB0eSBzbG90LgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKSB7CisgICAgICAgIG1JbXBsTmFtZSA9IGltcGwubUltcGxOYW1lICsgIltOXSI7CisgICAgICAgIG1OYW1lID0gbUltcGxOYW1lLmNfc3RyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1wbC5tQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXIgPSBpbXBsLm1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgIGJvb2wgb3duZWRCeUNsaWVudCA9IChjbGllbnRCdWZmZXIgIT0gbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoIW93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBhbGxvY2F0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgY2xpZW50QnVmZmVyLCBpbXBsLm1CdWZmZXJzW2ldLmNvbXBCdWZmZXIsIG93bmVkQnlDbGllbnQgfSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gY29udmVydGVkICV6dSBidWZmZXJzIHRvIGFycmF5IG1vZGUgb2YgJXp1IiwgbU5hbWUsIG1CdWZmZXJzLnNpemUoKSwgbWluU2l6ZSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBpbXBsLm1CdWZmZXJzLnNpemUoKTsgaSA8IG1pblNpemU7ICsraSkgeworICAgICAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYWxsb2NhdGUoKSwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSwgZmFsc2UgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHcmFiIGEgYnVmZmVyIGZyb20gdGhlIHVuZGVybHlpbmcgYXJyYXkgd2hpY2ggbWF0Y2hlcyB0aGUgY3JpdGVyaWEuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXhbb3V0XSAgICBpbmRleCBvZiB0aGUgc2xvdC4KKyAgICAgKiBccGFyYW0gYnVmZmVyW291dF0gICB0aGUgbWF0Y2hpbmcgYnVmZmVyLgorICAgICAqIFxwYXJhbSBtYXRjaFtpbl0gICAgIGEgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHRoZSBidWZmZXIgbWF0Y2hlcyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpYSBvciBub3QuCisgICAgICogXHJldHVybiBPSyAgICAgICAgICAgaWYgc3VjY2Vzc2Z1bCwKKyAgICAgKiAgICAgICAgIFdPVUxEX0JMT0NLICBpZiBzbG90cyBhcmUgYmVpbmcgdXNlZCwKKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSAgICBpZiBubyBzbG90IG1hdGNoZXMgdGhlIGNyaXRlcmlhLCBldmVuIHRob3VnaCBpdCdzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlCisgICAgICovCisgICAgc3RhdHVzX3QgZ3JhYkJ1ZmZlcigKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+ICpidWZmZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmKT4gbWF0Y2ggPQorICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJikgeyByZXR1cm4gdHJ1ZTsgfSkgeworICAgICAgICAvLyBhbGxCdWZmZXJzRG9udE1hdGNoIHJlbWFpbnMgdHJ1ZSBpZiBhbGwgYnVmZmVycyBhcmUgYXZhaWxhYmxlIGJ1dAorICAgICAgICAvLyBtYXRjaCgpIHJldHVybnMgZmFsc2UgZm9yIGV2ZXJ5IGJ1ZmZlci4KKyAgICAgICAgYm9vbCBhbGxCdWZmZXJzRG9udE1hdGNoID0gdHJ1ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKCFtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ICYmIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIuZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPnNldFJhbmdlKDAsICgqYnVmZmVyKS0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICppbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsbEJ1ZmZlcnNEb250TWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsQnVmZmVyc0RvbnRNYXRjaCA/IE5PX01FTU9SWSA6IFdPVUxEX0JMT0NLOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYnVmZmVyIGZyb20gdGhlIGNsaWVudCwgYW5kIGdldCB0aGUgQzJCdWZmZXIgb2JqZWN0IGJhY2sgZnJvbQorICAgICAqIHRoZSBidWZmZXIuIE5vdGUgdGhhdCB0aGUgc2xvdCBpcyBub3QgY29tcGxldGVseSBmcmVlIHVudGlsIHRoZSByZXR1cm5lZAorICAgICAqIEMyQnVmZmVyIG9iamVjdCBpcyBmcmVlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlcltpbl0gICAgICAgIHRoZSBidWZmZXIgcHJldmlvdXNseSBncmFiYmVkLgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luLG91dF0gIHBvaW50ZXIgdG8gQzJCdWZmZXIgdG8gYmUgcG9wdWxhdGVkLiBJZ25vcmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVsbC4KKyAgICAgKiBccmV0dXJuICB0cnVlICBpZiB0aGUgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSByZXR1cm5lZAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgcmV0dXJuQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICAgICAgYm9vbCByZWxlYXNlKSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzaXplX3QgaW5kZXggPSBtQnVmZmVycy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPT0gYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENsaWVudCByZXR1cm5lZCBhIGJ1ZmZlciBpdCBkb2VzIG5vdCBvd24gYWNjb3JkaW5nIHRvIG91ciByZWNvcmQ6ICV6dSIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyID0gbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChyZWxlYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gJXM6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCIsIG1OYW1lLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gJXM6IG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCAoaW5kZXg9JXp1KSIsIG1OYW1lLCBfX2Z1bmNfXywgaW5kZXgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IHJlc3VsdCA9IG1CdWZmZXJzW2luZGV4XS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNsaWVudEJ1ZmZlci0+YXNDMkJ1ZmZlcigpOworICAgICAgICAgICAgbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIgPSByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMyYnVmZmVyKSB7CisgICAgICAgICAgICAqYzJidWZmZXIgPSByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNvbXBCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjMmJ1ZmZlciA9PSBjb21wQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29kZWMgcmVsZWFzZWQgYSBidWZmZXIgb3duZWQgYnkgY2xpZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihpbmRleCAlenUpIiwgbU5hbWUsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYnVmZmVyICMlenUoYXJyYXkgbW9kZSkiLCBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYW4gdW5rbm93biBidWZmZXIgKGFycmF5IG1vZGUpIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGUgfGFycmF5fCB3aXRoIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBhcnJheS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhcnJheVtvdXRdICBhbiBhcnJheSB0byBiZSBmaWxsZWQgd2l0aCB0aGUgdW5kZXJseWluZyBidWZmZXIgYXJyYXkuCisgICAgICovCisgICAgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgY29uc3QgeworICAgICAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICAgICAgZm9yIChjb25zdCBFbnRyeSAmZW50cnkgOiBtQnVmZmVycykgeworICAgICAgICAgICAgYXJyYXktPnB1c2goZW50cnkuY2xpZW50QnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGllbnQgYWJhbmRvbmVkIGFsbCBrbm93biBidWZmZXJzLCBzbyByZWNsYWltIHRoZSBvd25lcnNoaXAuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgZm9yIChFbnRyeSAmZW50cnkgOiBtQnVmZmVycykgeworICAgICAgICAgICAgZW50cnkub3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZWFsbG9jKHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvYykgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGFsbG9jKCksIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCksIGZhbHNlIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OmNvdW50X2lmKAorICAgICAgICAgICAgICAgIG1CdWZmZXJzLmJlZ2luKCksIG1CdWZmZXJzLmVuZCgpLAorICAgICAgICAgICAgICAgIFtdKGNvbnN0IEVudHJ5ICZlbnRyeSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkub3duZWRCeUNsaWVudDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbUltcGxOYW1lOyAvLy88IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgbmFtZQorCisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXI7CisgICAgICAgIGJvb2wgb3duZWRCeUNsaWVudDsKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPEVudHJ5PiBtQnVmZmVyczsKK307CisKK2NsYXNzIElucHV0QnVmZmVyc0FycmF5IDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgSW5wdXRCdWZmZXJzQXJyYXkoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJJbnB1dFtOXSIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorICAgIH5JbnB1dEJ1ZmZlcnNBcnJheSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKSB7CisgICAgICAgIG1JbXBsLmluaXRpYWxpemUoaW1wbCwgbWluU2l6ZSwgYWxsb2NhdGUpOworICAgIH0KKworICAgIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiB0cnVlOyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCkgZmluYWwgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbCB7CisgICAgICAgIG1JbXBsLmdldEFycmF5KGFycmF5KTsKKyAgICB9CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyQnVmZmVyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSW1wbC5ncmFiQnVmZmVyKGluZGV4LCAmYzJCdWZmZXIpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBjMkJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKGMyQnVmZmVyKTsKKyAgICAgICAgICAgICpidWZmZXIgPSBjMkJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJldHVybkJ1ZmZlcihidWZmZXIsIGMyYnVmZmVyLCByZWxlYXNlKTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgICAgIG1JbXBsLmZsdXNoKCk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbCB7CisgICAgICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEJ1ZmZlcnNBcnJheUltcGwgbUltcGw7Cit9OworCitjbGFzcyBMaW5lYXJJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBMaW5lYXJJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIxRC1JbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1JbXBsKG1OYW1lKSB7IH0KKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIGludDMyX3QgY2FwYWNpdHkgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgKHZvaWQpbUZvcm1hdC0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNhcGFjaXR5KTsKKyAgICAgICAgaWYgKChzaXplX3QpY2FwYWNpdHkgPiBrTWF4TGluZWFyQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICAgICAgY2FwYWNpdHkgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IGlucHV0IHNpemUKKyAgICAgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXIgPSBhbGxvYygoc2l6ZV90KWNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG5ld0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgICAgICAqYnVmZmVyID0gbmV3QnVmZmVyOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJlbGVhc2VTbG90KGJ1ZmZlciwgYzJidWZmZXIsIHJlbGVhc2UpOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgICAgICBtSW1wbC5mbHVzaCgpOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIGZpbmFsIHsKKyAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAodm9pZCltRm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgICAgICBpZiAoKHNpemVfdCljYXBhY2l0eSA+IGtNYXhMaW5lYXJCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCAlZCwgY2FwcGVkIHRvICV6dSIsIGNhcGFjaXR5LCBrTWF4TGluZWFyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHByb3BlciBtYXggaW5wdXQgc2l6ZQorICAgICAgICAvLyBUT0RPOiByZWFkIHVzYWdlIGZyb20gaW50ZgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMUQtSW5wdXRbTl0iKSk7CisgICAgICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbdGhpcywgY2FwYWNpdHldICgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geyByZXR1cm4gYWxsb2MoY2FwYWNpdHkpOyB9KTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbCB7CisgICAgICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jKHNpemVfdCBzaXplKSB7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1Qb29sLT5mZXRjaExpbmVhckJsb2NrKHNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUobUZvcm1hdCwgYmxvY2spOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7Cit9OworCitjbGFzcyBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgTGluZWFySW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMoCisgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gJmRlYWxlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8sCisgICAgICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0sCisgICAgICAgICAgICBzaXplX3QgY2FwYWNpdHksCisgICAgICAgICAgICBzaXplX3QgbnVtSW5wdXRTbG90cywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiRW5jcnlwdGVkSW5wdXQiKQorICAgICAgICA6IExpbmVhcklucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtVXNhZ2UoezAsIDB9KSwKKyAgICAgICAgICBtRGVhbGVyKGRlYWxlciksCisgICAgICAgICAgbUNyeXB0byhjcnlwdG8pLAorICAgICAgICAgIG1IZWFwU2VxTnVtKGhlYXBTZXFOdW0pIHsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgbVVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpSRUFEX1BST1RFQ1RFRCwgMCB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbW9yeSA9IG1EZWFsZXItPmFsbG9jYXRlKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIGlmIChtZW1vcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBkZWFsZXI6IG9ubHkgJXp1IHNsb3RzIGFsbG9jYXRlZCIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZW1vcnlWZWN0b3IucHVzaF9iYWNrKHtzdGQ6OndlYWtfcHRyPEMyTGluZWFyQmxvY2s+KCksIG1lbW9yeX0pOworICAgICAgICB9CisgICAgfQorCisgICAgfkVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygpIG92ZXJyaWRlIHsKKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jKHNpemVfdCBzaXplKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElNZW1vcnk+IG1lbW9yeTsKKyAgICAgICAgc2l6ZV90IHNsb3QgPSAwOworICAgICAgICBmb3IgKDsgc2xvdCA8IG1NZW1vcnlWZWN0b3Iuc2l6ZSgpOyArK3Nsb3QpIHsKKyAgICAgICAgICAgIGlmIChtTWVtb3J5VmVjdG9yW3Nsb3RdLmJsb2NrLmV4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgIG1lbW9yeSA9IG1NZW1vcnlWZWN0b3Jbc2xvdF0ubWVtb3J5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtZW1vcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1Qb29sLT5mZXRjaExpbmVhckJsb2NrKHNpemUsIG1Vc2FnZSwgJmJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSyB8fCBibG9jayA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIG1NZW1vcnlWZWN0b3Jbc2xvdF0uYmxvY2sgPSBibG9jazsKKyAgICAgICAgcmV0dXJuIG5ldyBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcihtRm9ybWF0LCBibG9jaywgbWVtb3J5LCBtSGVhcFNlcU51bSk7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyTWVtb3J5VXNhZ2UgbVVzYWdlOworICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKyAgICBzcDxJQ3J5cHRvPiBtQ3J5cHRvOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgc3A8SU1lbW9yeT4gbWVtb3J5OworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IG1NZW1vcnlWZWN0b3I7Cit9OworCitjbGFzcyBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1NZXRhSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSksCisgICAgICAgICAgbVN0b3JlKEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKSkgeyB9CisgICAgfkdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2M7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1TdG9yZS0+ZmV0Y2hBbGxvY2F0b3IobVBvb2wtPmdldEFsbG9jYXRvcklkKCksICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzcDxHcmFwaGljTWV0YWRhdGFCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIobUZvcm1hdCwgYWxsb2MpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgcmVsZWFzZSk7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgZmluYWwgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtU3RvcmUtPmZldGNoQWxsb2NhdG9yKG1Qb29sLT5nZXRBbGxvY2F0b3JJZCgpLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMkQtTWV0YUlucHV0W05dIikpOworICAgICAgICBhcnJheS0+c2V0UG9vbChtUG9vbCk7CisgICAgICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgIGFycmF5LT5pbml0aWFsaXplKAorICAgICAgICAgICAgICAgIG1JbXBsLAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgW2Zvcm1hdCA9IG1Gb3JtYXQsIGFsbG9jXSgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcihmb3JtYXQsIGFsbG9jKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbCB7CisgICAgICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEZsZXhCdWZmZXJzSW1wbCBtSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gbVN0b3JlOworfTsKKworY2xhc3MgR3JhcGhpY0lucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNJbnB1dEJ1ZmZlcnMoCisgICAgICAgICAgICBzaXplX3QgbnVtSW5wdXRTbG90cywgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1CQi1JbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1JbXBsKG1OYW1lKSwKKyAgICAgICAgICBtTG9jYWxCdWZmZXJQb29sKExvY2FsQnVmZmVyUG9vbDo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAga01heExpbmVhckJ1ZmZlclNpemUgKiBudW1JbnB1dFNsb3RzKSkgeyB9CisgICAgfkdyYXBoaWNJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IGlucHV0IHNpemUKKyAgICAgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBzcDxHcmFwaGljQmxvY2tCdWZmZXI+IG5ld0J1ZmZlciA9IEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICBtUG9vbCwgbUZvcm1hdCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLCB1c2FnZSwgbUxvY2FsQnVmZmVyUG9vbCk7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKG5ld0J1ZmZlcik7CisgICAgICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgcmVsZWFzZSk7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgZmluYWwgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMkQtQkItSW5wdXRbTl0iKSk7CisgICAgICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbcG9vbCA9IG1Qb29sLCBmb3JtYXQgPSBtRm9ybWF0LCBsYnAgPSBtTG9jYWxCdWZmZXJQb29sXSgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geworICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCwgZm9ybWF0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIsIHVzYWdlLCBsYnApOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Mb2NhbEJ1ZmZlclBvb2w7Cit9OworCitjbGFzcyBEdW1teUlucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIER1bW15SW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKiwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJiwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqLCBib29sKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICYpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90KSBmaW5hbCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbCB7CisgICAgICAgIGFycmF5LT5jbGVhcigpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gMHU7CisgICAgfQorfTsKKworY2xhc3MgT3V0cHV0QnVmZmVyc0FycmF5IDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIE91dHB1dEJ1ZmZlcnNBcnJheShjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dFtOXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+T3V0cHV0QnVmZmVyc0FycmF5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGwuaW5pdGlhbGl6ZShpbXBsLCBtaW5TaXplLCBhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCkgZmluYWwgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBmaW5hbCB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoCisgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgJmMyQnVmZmVyLAorICAgICAgICAgICAgICAgIFtidWZmZXJdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyLT5jYW5Db3B5KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlcnIgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGJ1ZmZlcnMgdGVtcG9yYXJpbHkgbm90IGF2YWlsYWJsZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBncmFiQnVmZmVyIGZhaWxlZDogJWQiLCBtTmFtZSwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgaWYgKCFjMkJ1ZmZlci0+Y29weShidWZmZXIpKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb3B5IGJ1ZmZlciBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgc3VibWl0KGMyQnVmZmVyKTsKKyAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKGMyQnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICBBTE9HVigiWyVzXSBncmFiYmVkIGJ1ZmZlciAlenUiLCBtTmFtZSwgKmluZGV4KTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqY3NkLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIGZpbmFsIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjMkJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUltcGwuZ3JhYkJ1ZmZlcigKKyAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAmYzJCdWZmZXIsCisgICAgICAgICAgICAgICAgW2NzZF0oY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnRCdWZmZXItPmJhc2UoKSAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2xpZW50QnVmZmVyLT5jYXBhY2l0eSgpID49IGNzZC0+ZmxleENvdW50KCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGMyQnVmZmVyLT5iYXNlKCksIGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGMyQnVmZmVyLT5zZXRSYW5nZSgwLCBjc2QtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJldHVybkJ1ZmZlcihidWZmZXIsIGMyYnVmZmVyLCB0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKWZsdXNoZWRXb3JrOworICAgICAgICBtSW1wbC5mbHVzaCgpOworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNraXBDdXRCdWZmZXItPmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbCB7CisgICAgICAgIG1JbXBsLmdldEFycmF5KGFycmF5KTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWxsb2MoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jOworICAgICAgICBzd2l0Y2ggKGMyYnVmZmVyLT5kYXRhKCkudHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6TElORUFSOiB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2sgPSBjMmJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCk7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrLnNpemUoKSA8IGtNYXhMaW5lYXJCdWZmZXJTaXplIC8gMikgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gYmxvY2suc2l6ZSgpICogMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzaXplID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFsbG9jID0gW2Zvcm1hdCA9IG1Gb3JtYXQsIHNpemVdIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbExpbmVhckJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHNpemUpKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydAorICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkdSQVBISUM6ICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpJTlZBTElEOiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1M6ICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6R1JBUEhJQ19DSFVOS1M6ICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIlVuc3VwcG9ydGVkIHR5cGU6ICVkIiwgKGludCljMmJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1JbXBsLnJlYWxsb2MoYWxsb2MpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBCdWZmZXJzQXJyYXlJbXBsIG1JbXBsOworfTsKKworY2xhc3MgRmxleE91dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgRmxleE91dHB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJPdXRwdXRbXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSkgeyB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gd3JhcChidWZmZXIpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgbmV3QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKG5ld0J1ZmZlcik7CisgICAgICAgICpjbGllbnRCdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIEFMT0dWKCJbJXNdIHJlZ2lzdGVyZWQgYnVmZmVyICV6dSIsIG1OYW1lLCAqaW5kZXgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJDc2QoCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICpjc2QsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgZmluYWwgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBMb2NhbExpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtRm9ybWF0LCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgdHJ1ZSk7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKSBmbHVzaGVkV29yazsKKyAgICAgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzQXJyYXk+IGFycmF5KG5ldyBPdXRwdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSkpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+dHJhbnNmZXJTa2lwQ3V0QnVmZmVyKG1Ta2lwQ3V0QnVmZmVyKTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbdGhpc10oKSB7IHJldHVybiBhbGxvY2F0ZUFycmF5QnVmZmVyKCk7IH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCBmb3IgdGhlIHR5cGUgb2YgYnVmZmVycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBidWZmZXIgIEMyQnVmZmVyIG9iamVjdCB0byB3cmFwLgorICAgICAqCisgICAgICogXHJldHVybiAgYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCB0byB3cmFwIHxidWZmZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFwcHJvcHJpYXRlIENvZGVjMkJ1ZmZlciBvYmplY3QgZm9yIHRoZSB0eXBlIG9mIGJ1ZmZlcnMsIHRvIGJlCisgICAgICogdXNlZCBhcyBhbiBlbXB0eSBhcnJheSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuICBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IHdoaWNoIGNhbiBjb3B5KCkgZnJvbSBDMkJ1ZmZlcnMuCisgICAgICovCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jYXRlQXJyYXlCdWZmZXIoKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworfTsKKworY2xhc3MgTGluZWFyT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgTGluZWFyT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjFELU91dHB1dCIpCisgICAgICAgIDogRmxleE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisKKyAgICB2b2lkIGZsdXNoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIEZsZXhPdXRwdXRCdWZmZXJzOjpmbHVzaChmbHVzaGVkV29yayk7CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHVzaW5nIGEgZHVtbXkgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbExpbmVhckJ1ZmZlcihtRm9ybWF0LCBuZXcgQUJ1ZmZlcigwKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gbm9uLWxpbmVhciBidWZmZXIgJWQiLCBtTmFtZSwgYnVmZmVyLT5kYXRhKCkudHlwZSgpKTsKKyAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBsaW5lYXIgb3V0cHV0IGJ1ZmZlcnMgZnJvbSB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgQUxPR1YoIlslc10gbm8gbGluZWFyIGJ1ZmZlcnMiLCBtTmFtZSk7CisgICAgICAgICAgICAvLyBXZSBleHBlY3Qgb25lIGFuZCBvbmx5IG9uZSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXIgPSBDb25zdExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZShtRm9ybWF0LCBidWZmZXIpOworICAgICAgICBpZiAoY2xpZW50QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlIGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHN1Ym1pdChjbGllbnRCdWZmZXIpOworICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyOworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIG1heCBvdXRwdXQgc2l6ZQorICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKGtMaW5lYXJCdWZmZXJTaXplKSk7CisgICAgfQorfTsKKworY2xhc3MgR3JhcGhpY091dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgRmxleE91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gd3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0LCBidWZmZXIpOworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0KTsKKyAgICB9Cit9OworCitjbGFzcyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoCisgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0U2xvdHMsIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtQkItT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtTG9jYWxCdWZmZXJQb29sKExvY2FsQnVmZmVyUG9vbDo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAga01heExpbmVhckJ1ZmZlclNpemUgKiBudW1PdXRwdXRTbG90cykpIHsgfQorICAgIH5SYXdHcmFwaGljT3V0cHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gd3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyYnVmZmVyID0gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGMyYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMmJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICByZXR1cm4gYzJidWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiBhbGxvY2F0ZUFycmF5QnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBbbGJwID0gbUxvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Mb2NhbEJ1ZmZlclBvb2w7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVHdWFyZDo6UXVldWVHdWFyZCgKKyAgICAgICAgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jICZzeW5jKSA6IG1TeW5jKHN5bmMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtU3luYy5tR3VhcmRMb2NrKTsKKyAgICAvLyBBdCB0aGlzIHBvaW50IGl0J3MgZ3VhcmFudGVlZCB0aGF0IG1TeW5jIGlzIG5vdCB1bmRlciBzdGF0ZSB0cmFuc2l0aW9uLAorICAgIC8vIGFzIHdlIGFyZSBob2xkaW5nIGl0cyBtdXRleC4KKworICAgIE11dGV4ZWQ8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jOjpDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1TeW5jLm1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgICsrY291bnQtPnZhbHVlOworICAgICAgICBtUnVubmluZyA9IHRydWU7CisgICAgfQorfQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOjp+UXVldWVHdWFyZCgpIHsKKyAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgLy8gV2UgYXJlIG5vdCBob2xkaW5nIG1HdWFyZExvY2sgYXQgdGhpcyBwb2ludCBzbyB0aGF0IFF1ZXVlU3luYzo6c3RvcCgpIGNhbgorICAgICAgICAvLyBrZWVwIGhvbGRpbmcgdGhlIGxvY2sgdW50aWwgbUNvdW50IHJlYWNoZXMgemVyby4KKyAgICAgICAgTXV0ZXhlZDxDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OkNvdW50ZXI+OjpMb2NrZWQgY291bnQobVN5bmMubUNvdW50KTsKKyAgICAgICAgLS1jb3VudC0+dmFsdWU7CisgICAgICAgIGNvdW50LT5jb25kLmJyb2FkY2FzdCgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1HdWFyZExvY2spOworICAgIC8vIElmIHN0b3BwZWQsIGl0IGdvZXMgdG8gcnVubmluZyBzdGF0ZTsgb3RoZXJ3aXNlIG5vLW9wLgorICAgIE11dGV4ZWQ8Q291bnRlcj46OkxvY2tlZCBjb3VudChtQ291bnQpOworICAgIGlmIChjb3VudC0+dmFsdWUgPT0gLTEpIHsKKyAgICAgICAgY291bnQtPnZhbHVlID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1HdWFyZExvY2spOworICAgIE11dGV4ZWQ8Q291bnRlcj46OkxvY2tlZCBjb3VudChtQ291bnQpOworICAgIGlmIChjb3VudC0+dmFsdWUgPT0gLTEpIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBIb2xkaW5nIG1HdWFyZExvY2sgaGVyZSBibG9ja3MgY3JlYXRpb24gb2YgYWRkaXRpb25hbCBRdWV1ZUd1YXJkIG9iamVjdHMsIHNvCisgICAgLy8gbUNvdW50IGNhbiBvbmx5IGRlY3JlbWVudC4gSW4gb3RoZXIgd29yZHMsIHRocmVhZHMgdGhhdCBhY3F1aXJlZCB0aGUgbG9jaworICAgIC8vIGFyZSBhbGxvd2VkIHRvIGZpbmlzaCBleGVjdXRpb24gYnV0IGFkZGl0aW9uYWwgdGhyZWFkcyB0cnlpbmcgdG8gYWNxdWlyZQorICAgIC8vIHRoZSBsb2NrIGF0IHRoaXMgcG9pbnQgd2lsbCBibG9jaywgYW5kIHRoZW4gZ2V0IFF1ZXVlR3VhcmQgYXQgU1RPUFBFRAorICAgIC8vIHN0YXRlLgorICAgIHdoaWxlIChjb3VudC0+dmFsdWUgIT0gMCkgeworICAgICAgICBjb3VudC53YWl0Rm9yQ29uZGl0aW9uKGNvdW50LT5jb25kKTsKKyAgICB9CisgICAgY291bnQtPnZhbHVlID0gLTE7Cit9CisKKy8vIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaAorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OlJlb3JkZXJTdGFzaCgpIHsKKyAgICBjbGVhcigpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6Y2xlYXIoKSB7CisgICAgbVBlbmRpbmcuY2xlYXIoKTsKKyAgICBtU3Rhc2guY2xlYXIoKTsKKyAgICBtRGVwdGggPSAwOworICAgIG1LZXkgPSBDMkNvbmZpZzo6T1JESU5BTDsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmZsdXNoKCkgeworICAgIG1QZW5kaW5nLmNsZWFyKCk7CisgICAgbVN0YXNoLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXREZXB0aCh1aW50MzJfdCBkZXB0aCkgeworICAgIG1QZW5kaW5nLnNwbGljZShtUGVuZGluZy5lbmQoKSwgbVN0YXNoKTsKKyAgICBtRGVwdGggPSBkZXB0aDsKK30KK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXRLZXkoQzJDb25maWc6Om9yZGluYWxfa2V5X3Qga2V5KSB7CisgICAgbVBlbmRpbmcuc3BsaWNlKG1QZW5kaW5nLmVuZCgpLCBtU3Rhc2gpOworICAgIG1LZXkgPSBrZXk7Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpwb3AoRW50cnkgKmVudHJ5KSB7CisgICAgaWYgKG1QZW5kaW5nLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbnRyeS0+YnVmZmVyICAgICA9IG1QZW5kaW5nLmZyb250KCkuYnVmZmVyOworICAgIGVudHJ5LT50aW1lc3RhbXAgID0gbVBlbmRpbmcuZnJvbnQoKS50aW1lc3RhbXA7CisgICAgZW50cnktPmZsYWdzICAgICAgPSBtUGVuZGluZy5mcm9udCgpLmZsYWdzOworICAgIGVudHJ5LT5vcmRpbmFsICAgID0gbVBlbmRpbmcuZnJvbnQoKS5vcmRpbmFsOworICAgIG1QZW5kaW5nLnBvcF9mcm9udCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6ZW1wbGFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgaW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmb3JkaW5hbCkgeworICAgIGF1dG8gaXQgPSBtU3Rhc2guYmVnaW4oKTsKKyAgICBmb3IgKDsgaXQgIT0gbVN0YXNoLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChsZXNzKG9yZGluYWwsIGl0LT5vcmRpbmFsKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbVN0YXNoLmVtcGxhY2UoaXQsIGJ1ZmZlciwgdGltZXN0YW1wLCBmbGFncywgb3JkaW5hbCk7CisgICAgd2hpbGUgKCFtU3Rhc2guZW1wdHkoKSAmJiBtU3Rhc2guc2l6ZSgpID4gbURlcHRoKSB7CisgICAgICAgIG1QZW5kaW5nLnB1c2hfYmFjayhtU3Rhc2guZnJvbnQoKSk7CisgICAgICAgIG1TdGFzaC5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpkZWZlcigKKyAgICAgICAgY29uc3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpFbnRyeSAmZW50cnkpIHsKKyAgICBtUGVuZGluZy5wdXNoX2Zyb250KGVudHJ5KTsKK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6Omhhc1BlbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICFtUGVuZGluZy5lbXB0eSgpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6bGVzcygKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKSB7CisgICAgc3dpdGNoIChtS2V5KSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6Ok9SRElOQUw6ICAgcmV0dXJuIG8xLmZyYW1lSW5kZXggPCBvMi5mcmFtZUluZGV4OworICAgICAgICBjYXNlIEMyQ29uZmlnOjpUSU1FU1RBTVA6IHJldHVybiBvMS50aW1lc3RhbXAgPCBvMi50aW1lc3RhbXA7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkNVU1RPTTogICAgcmV0dXJuIG8xLmN1c3RvbU9yZGluYWwgPCBvMi5jdXN0b21PcmRpbmFsOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBrZXk7IGRlZmF1bHQgdG8gdGltZXN0YW1wIik7CisgICAgICAgICAgICByZXR1cm4gbzEuZnJhbWVJbmRleCA8IG8yLmZyYW1lSW5kZXg7CisgICAgfQorfQorCisvLyBDQ29kZWNCdWZmZXJDaGFubmVsCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OkNDb2RlY0J1ZmZlckNoYW5uZWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKQorICAgIDogbUhlYXBTZXFOdW0oLTEpLAorICAgICAgbUNDb2RlY0NhbGxiYWNrKGNhbGxiYWNrKSwKKyAgICAgIG1OdW1JbnB1dFNsb3RzKGtTbW9vdGhuZXNzRmFjdG9yKSwKKyAgICAgIG1OdW1PdXRwdXRTbG90cyhrU21vb3RobmVzc0ZhY3RvciksCisgICAgICBtRGVsYXkoMCksCisgICAgICBtRnJhbWVJbmRleCgwdSksCisgICAgICBtRmlyc3RWYWxpZEZyYW1lSW5kZXgoMHUpLAorICAgICAgbU1ldGFNb2RlKE1PREVfTk9ORSksCisgICAgICBtSW5wdXRNZXRFb3MoZmFsc2UpIHsKKyAgICBtT3V0cHV0U3VyZmFjZS5sb2NrKCktPm1heERlcXVldWVCdWZmZXJzID0ga1Ntb290aG5lc3NGYWN0b3IgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBEdW1teUlucHV0QnVmZmVycygiIikpOworfQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjp+Q0NvZGVjQnVmZmVyQ2hhbm5lbCgpIHsKKyAgICBpZiAobUNyeXB0byAhPSBudWxscHRyICYmIG1EZWFsZXIgIT0gbnVsbHB0ciAmJiBtSGVhcFNlcU51bSA+PSAwKSB7CisgICAgICAgIG1DcnlwdG8tPnVuc2V0SGVhcChtSGVhcFNlcU51bSk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgbUNvbXBvbmVudCA9IGNvbXBvbmVudDsKKyAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC0+Z2V0TmFtZSgpICsgU3RyaW5nUHJpbnRmKCIjJWQiLCBpbnQodWludHB0cl90KGNvbXBvbmVudC5nZXQoKSkgJSA5OTcpKTsKKyAgICBtTmFtZSA9IG1Db21wb25lbnROYW1lLmNfc3RyKCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKSB7CisgICAgQUxPR1YoIlslc10gc2V0SW5wdXRTdXJmYWNlIiwgbU5hbWUpOworICAgIG1JbnB1dFN1cmZhY2UgPSBzdXJmYWNlOworICAgIHJldHVybiBtSW5wdXRTdXJmYWNlLT5jb25uZWN0KG1Db21wb25lbnQpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgeworICAgIGlmIChtSW5wdXRTdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gbUlucHV0U3VyZmFjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIGlmIChtSW5wdXRNZXRFb3MpIHsKKyAgICAgICAgQUxPR0QoIlslc10gYnVmZmVycyBhZnRlciBFT1MgaWdub3JlZCAoJWxsZCB1cykiLCBtTmFtZSwgKGxvbmcgbG9uZyl0aW1lVXMpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaW50MzJfdCBmbGFncyA9IDA7CisgICAgaW50MzJfdCB0bXAgPSAwOworICAgIGJvb2wgZW9zID0gZmFsc2U7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZ0bXApICYmIHRtcCkgeworICAgICAgICBlb3MgPSB0cnVlOworICAgICAgICBtSW5wdXRNZXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigiWyVzXSBpbnB1dCBFT1MiLCBtTmFtZSk7CisgICAgfQorICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmdG1wKSAmJiB0bXApIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHOworICAgIH0KKyAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXItPnNpemUoKSA9ICV6dSIsIG1OYW1lLCBidWZmZXItPnNpemUoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgIC8vIFdPUktBUk9VTkQ6IHVudGlsIGNvZGVjcyBzdXBwb3J0IGhhbmRsaW5nIHdvcmsgYWZ0ZXIgRU9TIGFuZCBtYXggb3V0cHV0IHNpemluZywgdXNlIHRpbWVzdGFtcAorICAgIC8vIG1hbmlwdWxhdGlvbiB0byBhY2hpZXZlIGltYWdlIGVuY29kaW5nIHZpYSB2aWRlbyBjb2RlYywgYW5kIHRvIGNvbnN0cmFpbiBlbmNvZGVkIG91dHB1dC4KKyAgICAvLyBLZWVwIGNsaWVudCB0aW1lc3RhbXAgaW4gY3VzdG9tT3JkaW5hbAorICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVVczsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisKKyAgICB1aW50NjRfdCBxdWV1ZWRGcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gcXVldWVkQnVmZmVyczsKKworICAgIGlmIChidWZmZXItPnNpemUoKSA+IDB1KSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMmJ1ZmZlcjsKKyAgICAgICAgaWYgKCEoKmJ1ZmZlcnMpLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgJmMyYnVmZmVyLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyYnVmZmVyKTsKKyAgICAgICAgcXVldWVkQnVmZmVycy5wdXNoX2JhY2soYzJidWZmZXIpOworICAgIH0gZWxzZSBpZiAoZW9zKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgfQorICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIC8vIFRPRE86IGZpbGwgaW5mbydzCisKKyAgICB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUgPSBzdGQ6Om1vdmUobVBhcmFtc1RvQmVTZXQpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrUXVldWVkKAorICAgICAgICAgICAgcXVldWVkRnJhbWVJbmRleCwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShxdWV1ZWRCdWZmZXJzKSwKKyAgICAgICAgICAgIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya0RvbmUocXVldWVkRnJhbWVJbmRleCk7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBlb3MgJiYgYnVmZmVyLT5zaXplKCkgPiAwdSkgeworICAgICAgICB3b3JrLnJlc2V0KG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICAgICAgLy8gV09SS0FST1VORDoga2VlcCBjbGllbnQgdGltZXN0YW1wIGluIGN1c3RvbU9yZGluYWwKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZVVzOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgICAgIHF1ZXVlZEZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgcXVldWVkQnVmZmVycy5jbGVhcigpOworCisgICAgICAgIGl0ZW1zLmNsZWFyKCk7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtRdWV1ZWQoCisgICAgICAgICAgICAgICAgcXVldWVkRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocXVldWVkQnVmZmVycyksCisgICAgICAgICAgICAgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCkpOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrRG9uZShxdWV1ZWRGcmFtZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgYm9vbCByZWxlYXNlZCA9ICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyLCB0cnVlKTsKKyAgICAgICAgQUxPR1YoIlslc10gcXVldWVJbnB1dEJ1ZmZlcjogYnVmZmVyICVzcmVsZWFzZWQiLCBtTmFtZSwgcmVsZWFzZWQgPyAiIiA6ICJub3QgIik7CisgICAgfQorCisgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBzZXRQYXJhbWV0ZXJzIGlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZSBydW5uaW5nIHN0YXRlLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorICAgIG1QYXJhbXNUb0JlU2V0Lmluc2VydChtUGFyYW1zVG9CZVNldC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IocGFyYW1zLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihwYXJhbXMuZW5kKCkpKTsKKyAgICBwYXJhbXMuY2xlYXIoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlSW5wdXRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR0QoIlslc10gTm8gbW9yZSBidWZmZXJzIHNob3VsZCBiZSBxdWV1ZWQgYXQgY3VycmVudCBzdGF0ZS4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKyAgICByZXR1cm4gcXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGJvb2wgc2VjdXJlLCBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIE5vIG1vcmUgYnVmZmVycyBzaG91bGQgYmUgcXVldWVkIGF0IGN1cnJlbnQgc3RhdGUuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisKKyAgICBpZiAoIWhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSkgeworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisgICAgc3A8RW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI+IGVuY3J5cHRlZEJ1ZmZlcigoRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIgKilidWZmZXIuZ2V0KCkpOworCisgICAgc3NpemVfdCByZXN1bHQgPSAtMTsKKyAgICBzc2l6ZV90IGNvZGVjRGF0YU9mZnNldCA9IDA7CisgICAgaWYgKG1DcnlwdG8gIT0gbnVsbHB0cikgeworICAgICAgICBJQ3J5cHRvOjpEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0aW5hdGlvbjsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlOworICAgICAgICAgICAgZGVzdGluYXRpb24ubUhhbmRsZSA9IGVuY3J5cHRlZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnk7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5ID0gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICAgICAgfQorICAgICAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgc291cmNlOworICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmZpbGxTb3VyY2VCdWZmZXIoJnNvdXJjZSk7CisgICAgICAgIHJlc3VsdCA9IG1DcnlwdG8tPmRlY3J5cHQoCisgICAgICAgICAgICAgICAga2V5LCBpdiwgbW9kZSwgcGF0dGVybiwgc291cmNlLCBidWZmZXItPm9mZnNldCgpLAorICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsIGRlc3RpbmF0aW9uLCBlcnJvckRldGFpbE1zZyk7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7CisgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmNvcHlEZWNyeXB0ZWRDb250ZW50KG1EZWNyeXB0RGVzdGluYXRpb24sIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBIZXJlIHdlIGNhc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgdG8gaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTdWJTYW1wbGUKKyAgICAgICAgLy8gZGlyZWN0bHksIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIGFzIGNoZWNrZWQgaW4gRGVzY3JhbWJsZXJJbXBsLmNwcC4KKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBoaWRsU3ViU2FtcGxlczsKKyAgICAgICAgaGlkbFN1YlNhbXBsZXMuc2V0VG9FeHRlcm5hbCgoU3ViU2FtcGxlICopc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZmFsc2UgLypvd24qLyk7CisKKyAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgc3JjQnVmZmVyOworICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmZpbGxTb3VyY2VCdWZmZXIoJnNyY0J1ZmZlcik7CisKKyAgICAgICAgRGVzdGluYXRpb25CdWZmZXIgZHN0QnVmZmVyOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6Ok5BVElWRV9IQU5ETEU7CisgICAgICAgICAgICBkc3RCdWZmZXIuc2VjdXJlTWVtb3J5ID0gaGlkbF9oYW5kbGUoZW5jcnlwdGVkQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlk7CisgICAgICAgICAgICBkc3RCdWZmZXIubm9uc2VjdXJlTWVtb3J5ID0gc3JjQnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgQ2FzU3RhdHVzIHN0YXR1cyA9IENhc1N0YXR1czo6T0s7CisgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgICAgICAgIFNjcmFtYmxpbmdDb250cm9sIHNjdHJsID0gU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVEOworCisgICAgICAgIGlmIChrZXkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2N0cmwgPSAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdOworICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB0aGUgUEVTIG9mZnNldAorICAgICAgICAgICAgY29kZWNEYXRhT2Zmc2V0ID0ga2V5WzJdIHwgKGtleVszXSA8PCA4KTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKKyAgICAgICAgICAgICAgICBzY3RybCwKKyAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJlc3VsdCwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIENhc1N0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzc2l6ZV90KV9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBDYXNTdGF0dXM6Ok9LIHx8IHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcywgc3RhdHVzPSVkLCByZXN1bHQ9JXpkIiwKKyAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQgPCBjb2RlY0RhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIlslc10gZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIG1OYW1lLCByZXN1bHQpOworCisgICAgICAgIGlmIChkc3RCdWZmZXIudHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CisgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmNvcHlEZWNyeXB0ZWRDb250ZW50RnJvbU1lbW9yeShyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRSYW5nZShjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCAtIGNvZGVjRGF0YU9mZnNldCk7CisgICAgcmV0dXJuIHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCkgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR1YoIlslc10gV2UncmUgbm90IHJ1bm5pbmcgLS0tIG5vIGlucHV0IGJ1ZmZlciByZXBvcnRlZCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpIHsKKyAgICBpZiAobUlucHV0TWV0RW9zIHx8CisgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5oYXNQZW5kaW5nKCkgfHwKKyAgICAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPnBpcGVsaW5lRnVsbCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCgqYnVmZmVycyktPm51bUNsaWVudEJ1ZmZlcnMoKSA+PSBtTnVtT3V0cHV0U2xvdHMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gaW5CdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICAgICAgaWYgKCgqYnVmZmVycyktPm51bUNsaWVudEJ1ZmZlcnMoKSA+PSBtTnVtSW5wdXRTbG90cykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKCpidWZmZXJzKS0+cmVxdWVzdE5ld0J1ZmZlcigmaW5kZXgsICZpbkJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBubyBuZXcgYnVmZmVyIGF2YWlsYWJsZSIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBuZXcgaW5wdXQgaW5kZXggPSAlenUgWyVwXSIsIG1OYW1lLCBpbmRleCwgaW5CdWZmZXIuZ2V0KCkpOworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIGluQnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlbmRlck91dHB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgaW50NjRfdCB0aW1lc3RhbXBOcykgeworICAgIEFMT0dWKCJbJXNdIHJlbmRlck91dHB1dEJ1ZmZlcjogJXAiLCBtTmFtZSwgYnVmZmVyLmdldCgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyOworICAgIGJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoKmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gKCpidWZmZXJzKS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsICZjMkJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gTk9URTogc29tZSBhcHBzIHRyeSB0byByZWxlYXNlT3V0cHV0QnVmZmVyKCkgd2l0aCB0aW1lc3RhbXAgYW5kL29yIHJlbmRlcgorICAgIC8vICAgICAgIHNldCB0byB0cnVlLgorICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgLy8gaW5wdXQgYnVmZmVyIGZlZWRpbmcgbWF5IGhhdmUgYmVlbiBnYXRlZCBieSBwZW5kaW5nIG91dHB1dCBidWZmZXJzCisgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICBpZiAoIWMyQnVmZmVyKSB7CisgICAgICAgIGlmIChyZWxlYXNlZCkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gVGhlIGFwcCBpcyBjYWxsaW5nIHJlbGVhc2VPdXRwdXRCdWZmZXIoKSB3aXRoICIKKyAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgb3IgcmVuZGVyPXRydWUgd2l0aCBub24tdmlkZW8gYnVmZmVycy4gQXBwcyBzaG91bGQgIgorICAgICAgICAgICAgICAgICAgImNhbGwgcmVsZWFzZU91dHB1dEJ1ZmZlcigpIHdpdGggcmVuZGVyPWZhbHNlIGZvciB0aG9zZS4iLAorICAgICAgICAgICAgICAgICAgbU5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyNpZiAwCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm9QYXJhbXMgPSBjMkJ1ZmZlci0+aW5mbygpOworICAgIEFMT0dWKCJbJXNdIHF1ZXVpbmcgZ2Z4IGJ1ZmZlciB3aXRoICV6dSBpbmZvcyIsIG1OYW1lLCBpbmZvUGFyYW1zLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGluZm9QYXJhbXMpIHsKKyAgICAgICAgQVN0cmluZyByZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggKyAzIDwgaW5mby0+c2l6ZSgpOyBpeCArPSA0KSB7CisgICAgICAgICAgICBpZiAoaXgpIHJlcy5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICByZXMuYXBwZW5kKCooKGludDMyX3QqKWluZm8uZ2V0KCkgKyAoaXggLyA0KSkpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIgIFslc10iLCByZXMuY19zdHIoKSk7CisgICAgfQorI2VuZGlmCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ+IHJvdGF0aW9uID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKTsKKyAgICBib29sIGZsaXAgPSByb3RhdGlvbiAmJiAocm90YXRpb24tPmZsaXAgJiAxKTsKKyAgICB1aW50MzJfdCBxdWFydGVycyA9ICgocm90YXRpb24gPyByb3RhdGlvbi0+dmFsdWUgOiAwKSAvIDkwKSAmIDM7CisgICAgdWludDMyX3QgdHJhbnNmb3JtID0gMDsKKyAgICBzd2l0Y2ggKHF1YXJ0ZXJzKSB7CisgICAgICAgIGNhc2UgMDogLy8gbm8gcm90YXRpb24KKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyBIQUxfVFJBTlNGT1JNX0ZMSVBfSCA6IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvLyA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gKEhBTF9UUkFOU0ZPUk1fRkxJUF9WIHwgSEFMX1RSQU5TRk9STV9ST1RfOTApCisgICAgICAgICAgICAgICAgICAgIDogSEFMX1RSQU5TRk9STV9ST1RfMjcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLy8gMTgwIGRlZ3JlZXMKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyBIQUxfVFJBTlNGT1JNX0ZMSVBfViA6IEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8vIDkwIGRlZ3JlZXMgY2xvY2t3aXNlCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gKEhBTF9UUkFOU0ZPUk1fRkxJUF9IIHwgSEFMX1RSQU5TRk9STV9ST1RfOTApCisgICAgICAgICAgICAgICAgICAgIDogSEFMX1RSQU5TRk9STV9ST1RfOTA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dD4gc3VyZmFjZVNjYWxpbmcgPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworICAgIHVpbnQzMl90IHZpZGVvU2NhbGluZ01vZGUgPSBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1c7CisgICAgaWYgKHN1cmZhY2VTY2FsaW5nKSB7CisgICAgICAgIHZpZGVvU2NhbGluZ01vZGUgPSBzdXJmYWNlU2NhbGluZy0+dmFsdWU7CisgICAgfQorCisgICAgLy8gVXNlIGRhdGFzcGFjZSBmcm9tIGZvcm1hdCBhcyBpdCBoYXMgdGhlIGRlZmF1bHQgYXNwZWN0cyBhbHJlYWR5IGFwcGxpZWQKKyAgICBhbmRyb2lkX2RhdGFzcGFjZV90IGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsgLy8gdGhpcyBpcyAwCisgICAgKHZvaWQpYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCAqKSZkYXRhU3BhY2UpOworCisgICAgLy8gSERSIHN0YXRpYyBpbmZvCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PiBoZHJTdGF0aWNJbmZvID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworCisgICAgLy8gSERSMTAgcGx1cyBpbmZvCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiBoZHIxMFBsdXNJbmZvID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworCisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBjYW5ub3QgcmVuZGVyIGJ1ZmZlciB3aXRob3V0IHN1cmZhY2UiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBibG9ja3MgPSBjMkJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKTsKKyAgICBpZiAoYmxvY2tzLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiWyVzXSBleHBlY3RlZCAxIGdyYXBoaWMgYmxvY2ssIGJ1dCBnb3QgJXp1IiwgbU5hbWUsIGJsb2Nrcy5zaXplKCkpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgPSBibG9ja3MuZnJvbnQoKTsKKworICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyBhZnRlciBDMkZlbmNlIGltcGxlbWVudGF0aW9uLgorICAgIGFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcWJpKAorICAgICAgICAgICAgdGltZXN0YW1wTnMsCisgICAgICAgICAgICBmYWxzZSwgLy8gZHJvcHBhYmxlCisgICAgICAgICAgICBkYXRhU3BhY2UsCisgICAgICAgICAgICBSZWN0KGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5sZWZ0LAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkudG9wLAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkucmlnaHQoKSwKKyAgICAgICAgICAgICAgICAgYmxvY2tzLmZyb250KCkuY3JvcCgpLmJvdHRvbSgpKSwKKyAgICAgICAgICAgIHZpZGVvU2NhbGluZ01vZGUsCisgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UsIDApOworICAgIGlmIChoZHJTdGF0aWNJbmZvIHx8IGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgSGRyTWV0YWRhdGEgaGRyOworICAgICAgICBpZiAoaGRyU3RhdGljSW5mbykgeworICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfc21wdGUyMDg2X21ldGFkYXRhIHNtcHRlMjA4Nl9tZXRhID0geworICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeVJlZCA9IHsKKyAgICAgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLnJlZC54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcucmVkLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUdyZWVuID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcuZ3JlZW4ueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmdyZWVuLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUJsdWUgPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ibHVlLngsIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ibHVlLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC53aGl0ZVBvaW50ID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLndoaXRlLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWF4THVtaW5hbmNlLAorICAgICAgICAgICAgICAgIC5taW5MdW1pbmFuY2UgPSBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWluTHVtaW5hbmNlLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEgY3RhODYxX21ldGEgPSB7CisgICAgICAgICAgICAgICAgLm1heENvbnRlbnRMaWdodExldmVsID0gaGRyU3RhdGljSW5mby0+bWF4Q2xsLAorICAgICAgICAgICAgICAgIC5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gaGRyU3RhdGljSW5mby0+bWF4RmFsbCwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGhkci52YWxpZFR5cGVzID0gSGRyTWV0YWRhdGE6OlNNUFRFMjA4NiB8IEhkck1ldGFkYXRhOjpDVEE4NjFfMzsKKyAgICAgICAgICAgIGhkci5zbXB0ZTIwODYgPSBzbXB0ZTIwODZfbWV0YTsKKyAgICAgICAgICAgIGhkci5jdGE4NjEzID0gY3RhODYxX21ldGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgICAgIGhkci52YWxpZFR5cGVzIHw9IEhkck1ldGFkYXRhOjpIRFIxMFBMVVM7CisgICAgICAgICAgICBoZHIuaGRyMTBwbHVzLmFzc2lnbigKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSArIGhkcjEwUGx1c0luZm8tPmZsZXhDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBxYmkuc2V0SGRyTWV0YWRhdGEoaGRyKTsKKyAgICB9CisgICAgLy8gd2UgZG9uJ3QgaGF2ZSBkaXJ0eSByZWdpb25zCisgICAgcWJpLnNldFN1cmZhY2VEYW1hZ2UoUmVnaW9uOjpJTlZBTElEX1JFR0lPTik7CisgICAgYW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgcWJvOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1Db21wb25lbnQtPnF1ZXVlVG9PdXRwdXRTdXJmYWNlKGJsb2NrLCBxYmksICZxYm8pOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0koIlslc10gcXVldWVCdWZmZXIgZmFpbGVkOiAlZCIsIG1OYW1lLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBBTE9HVigiWyVzXSBxdWV1ZSBidWZmZXIgc3VjY2Vzc2Z1bCIsIG1OYW1lKTsKKworICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAwOworICAgICh2b2lkKWJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcyk7CisgICAgbUNDb2RlY0NhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKG1lZGlhVGltZVVzLCB0aW1lc3RhbXBOcyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OmRpc2NhcmRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIEFMT0dWKCJbJXNdIGRpc2NhcmRCdWZmZXI6ICVwIiwgbU5hbWUsIGJ1ZmZlci5nZXQoKSk7CisgICAgYm9vbCByZWxlYXNlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoKmJ1ZmZlcnMgJiYgKCpidWZmZXJzKS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpKSB7CisgICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCpidWZmZXJzICYmICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyKSkgeworICAgICAgICAgICAgcmVsZWFzZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZWxlYXNlZCkgeworICAgICAgICBzZW5kT3V0cHV0QnVmZmVycygpOworICAgICAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJbJXNdIE1lZGlhQ29kZWMgZGlzY2FyZGVkIGFuIHVua25vd24gYnVmZmVyIiwgbU5hbWUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Z2V0SW5wdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgeworICAgIGFycmF5LT5jbGVhcigpOworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKworICAgIGlmICghKCpidWZmZXJzKS0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1JbnB1dFNsb3RzKTsKKyAgICB9CisKKyAgICAoKmJ1ZmZlcnMpLT5nZXRBcnJheShhcnJheSk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Z2V0T3V0cHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIHsKKyAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKworICAgIGlmICghKCpidWZmZXJzKS0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1PdXRwdXRTbG90cyk7CisgICAgfQorCisgICAgKCpidWZmZXJzKS0+Z2V0QXJyYXkoYXJyYXkpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdGFydCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCBpU3RyZWFtRm9ybWF0KDB1KTsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQgb1N0cmVhbUZvcm1hdCgwdSk7CisgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKKyAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQgaW5wdXREZWxheSgwKTsKKyAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0IG91dHB1dERlbGF5KDApOworICAgIEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZyBwaXBlbGluZURlbGF5KDApOworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJmlTdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgJm9TdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgJnJlb3JkZXJEZXB0aCwKKyAgICAgICAgICAgICAgICAmcmVvcmRlcktleSwKKyAgICAgICAgICAgICAgICAmaW5wdXREZWxheSwKKyAgICAgICAgICAgICAgICAmcGlwZWxpbmVEZWxheSwKKyAgICAgICAgICAgICAgICAmb3V0cHV0RGVsYXksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAge30sCisgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgbnVsbHB0cik7CisgICAgaWYgKGVyciA9PSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgaWYgKCFpU3RyZWFtRm9ybWF0IHx8ICFvU3RyZWFtRm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+OjpMb2NrZWQgcmVvcmRlcihtUmVvcmRlclN0YXNoKTsKKyAgICAgICAgcmVvcmRlci0+Y2xlYXIoKTsKKyAgICAgICAgaWYgKHJlb3JkZXJEZXB0aCkgeworICAgICAgICAgICAgcmVvcmRlci0+c2V0RGVwdGgocmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVvcmRlcktleSkgeworICAgICAgICAgICAgcmVvcmRlci0+c2V0S2V5KHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDMyX3QgaW5wdXREZWxheVZhbHVlID0gaW5wdXREZWxheSA/IGlucHV0RGVsYXkudmFsdWUgOiAwOworICAgIHVpbnQzMl90IHBpcGVsaW5lRGVsYXlWYWx1ZSA9IHBpcGVsaW5lRGVsYXkgPyBwaXBlbGluZURlbGF5LnZhbHVlIDogMDsKKyAgICB1aW50MzJfdCBvdXRwdXREZWxheVZhbHVlID0gb3V0cHV0RGVsYXkgPyBvdXRwdXREZWxheS52YWx1ZSA6IDA7CisKKyAgICBtTnVtSW5wdXRTbG90cyA9IGlucHV0RGVsYXlWYWx1ZSArIHBpcGVsaW5lRGVsYXlWYWx1ZSArIGtTbW9vdGhuZXNzRmFjdG9yOworICAgIG1OdW1PdXRwdXRTbG90cyA9IG91dHB1dERlbGF5VmFsdWUgKyBrU21vb3RobmVzc0ZhY3RvcjsKKyAgICBtRGVsYXkgPSBpbnB1dERlbGF5VmFsdWUgKyBwaXBlbGluZURlbGF5VmFsdWUgKyBvdXRwdXREZWxheVZhbHVlOworCisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBpbnB1dCBmb3JtYXQKKyAgICBib29sIHNlY3VyZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKS5maW5kKCIuc2VjdXJlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgaW50IHBvb2xNYXNrID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0LmMyLXBvb2xtYXNrIiwKKyAgICAgICAgICAgIDEgPDwgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04gfAorICAgICAgICAgICAgMSA8PCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKTsKKworICAgIGlmIChpbnB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIGJvb2wgZ3JhcGhpYyA9IChpU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKworICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgorICAgICAgICAgICAgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT047CisKKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0IGZyb20gY29tcG9uZW50LiBJZiBhbiBhbGxvY2F0b3IgSUQgaXMgb2J0YWluZWQKKyAgICAgICAgICAgIC8vIGZyb20gY29tcG9uZW50LCBjcmVhdGUgdGhlIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBnaXZlbiBJRC4gT3RoZXJ3aXNlLCB1c2UgZGVmYXVsdCBJRHMuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IGlucHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgKmlucHV0QWxsb2NhdG9ycyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0QWxsb2NhdG9ycyAmJiBpbnB1dEFsbG9jYXRvcnMtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKGlucHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+aW5wdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBpbnB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaW5wdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBDMkNvbXBvbmVudCB3cmFwcGVyIHRvIGFzc29jaWF0ZSB0aGlzIHBvb2wgd2l0aCBvdXJzZWx2ZXMKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQpICYgMSkgeworICAgICAgICAgICAgICAgIGVyciA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbChwb29scy0+aW5wdXRBbGxvY2F0b3JJZCwgbnVsbHB0ciwgJnBvb2wpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENyZWF0ZWQgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIGFsbG9jYXRvcklEICV1ID0+IHBvb2xJRCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShwb29sID8gcG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpbnB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKGlucHV0UG9vbElkLCBudWxscHRyLCAmcG9vbCk7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gVXNpbmcgYmFzaWMgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHBvb2wgPyBwb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9vbHMtPmlucHV0UG9vbCA9IHBvb2w7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZvcmNlQXJyYXlNb2RlID0gZmFsc2U7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKGdyYXBoaWMpIHsKKyAgICAgICAgICAgIGlmIChtSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IER1bW15SW5wdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1NZXRhTW9kZSA9PSBNT0RFX0FOVykgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEdyYXBoaWNJbnB1dEJ1ZmZlcnMobU51bUlucHV0U2xvdHMsIG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgICh2b2lkKWlucHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgICAgICAgICAgICAgIGlmICgoc2l6ZV90KWNhcGFjaXR5ID4ga01heExpbmVhckJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobURlYWxlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIG1EZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKGNhcGFjaXR5LCBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAobU51bUlucHV0U2xvdHMgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzIik7CisgICAgICAgICAgICAgICAgICAgIG1EZWNyeXB0RGVzdGluYXRpb24gPSBtRGVhbGVyLT5hbGxvY2F0ZSgoc2l6ZV90KWNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1DcnlwdG8gIT0gbnVsbHB0ciAmJiBtSGVhcFNlcU51bSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSBtQ3J5cHRvLT5zZXRIZWFwKG1EZWFsZXItPmdldE1lbW9yeUhlYXAoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZSwgbURlYWxlciwgbUNyeXB0bywgbUhlYXBTZXFOdW0sIChzaXplX3QpY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBtTnVtSW5wdXRTbG90cywgbU5hbWUpKTsKKyAgICAgICAgICAgICAgICBmb3JjZUFycmF5TW9kZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBMaW5lYXJJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAoKmJ1ZmZlcnMpLT5zZXRGb3JtYXQoaW5wdXRGb3JtYXQpOworCisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICgqYnVmZmVycyktPnNldFBvb2wocG9vbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvcmNlQXJyYXlNb2RlKSB7CisgICAgICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1JbnB1dFNsb3RzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRTdXJmYWNlOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBtTnVtT3V0cHV0U2xvdHMgKyByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlID0gb3V0cHV0LT5zdXJmYWNlID8KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgOiBudWxscHRyOworICAgICAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQob3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uID0gb3V0cHV0LT5nZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBncmFwaGljID0gKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKTsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkXzsKKworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOworCisgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBhbGxvY2F0b3IgSUQuCisgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOworCisgICAgICAgICAgICAvLyBxdWVyeSBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQgZnJvbSBjb21wb25lbnQsIG9yIHVzZSBkZWZhdWx0IGFsbG9jYXRvciBpZgorICAgICAgICAgICAgLy8gdW5zdWNjZXNzZnVsLgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgfHwgcGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUXVlcnkgb3V0cHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0ICpvdXRwdXRBbGxvY2F0b3JzID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEFsbG9jYXRvcnMgJiYgb3V0cHV0QWxsb2NhdG9ycy0+ZmxleENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgYWxsb2NhdG9yIElEcyBhbmQgcmVzb2x2ZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3Iob3V0cHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSBhbGxvY2F0b3ItPmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb21wb25lbnQgcmVxdWVzdGVkIGludmFsaWQgb3V0cHV0IGFsbG9jYXRvciBJRCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBvdXRwdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVzZSBidWZmZXJxdWV1ZSBpZiBvdXRwdXR0aW5nIHRvIGEgc3VyZmFjZS4KKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dCBmcm9tIGNvbXBvbmVudCwgb3IgdXNlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAvLyBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgfHwgcGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IG91dHB1dCBzdXJmYWNlIGFsbG9jYXRvciByZXR1cm5lZCAlenUgcGFyYW1zID0+ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQgKnN1cmZhY2VBbGxvY2F0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlQWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBhbGxvY2F0b3IgSURzIGFuZCByZXNvbHZlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3Ioc3VyZmFjZUFsbG9jYXRvci0+dmFsdWUsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29tcG9uZW50IHJlcXVlc3RlZCBpbnZhbGlkIHN1cmZhY2Ugb3V0cHV0IGFsbG9jYXRvciBJRCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgc3VyZmFjZUFsbG9jYXRvci0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID09IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQworICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXJyICE9IEMyX09LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHBvb2xNYXNrID4+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkKSAmIDEpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQsICZwb29scy0+b3V0cHV0UG9vbElkLCAmcG9vbHMtPm91dHB1dFBvb2xJbnRmKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBDcmVhdGVkIG91dHB1dCBibG9jayBwb29sIHdpdGggYWxsb2NhdG9ySUQgJXUgPT4gcG9vbElEICVsbHUgLSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwb29scy0+b3V0cHV0UG9vbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgYmFzaWMgcG9vbCBpbnN0ZWFkCisgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBvdXRwdXQgYmxvY2sgcG9vbCBJRCBhcyBwYXJhbWV0ZXIgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0IHRvCisgICAgICAgICAgICAvLyBjb21wb25lbnQuCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0PiBwb29sSWRzVHVuaW5nID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSh7IHBvb2xzLT5vdXRwdXRQb29sSWQgfSk7CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7IHBvb2xJZHNUdW5pbmcuZ2V0KCkgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgQUxPR0QoIlslc10gQ29uZmlndXJlZCBvdXRwdXQgYmxvY2sgcG9vbCBpZHMgJWxsdSA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgIG1OYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xJZHNUdW5pbmctPm0udmFsdWVzWzBdLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgIG91dHB1dFBvb2xJZF8gPSBwb29scy0+b3V0cHV0UG9vbElkOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisKKyAgICAgICAgaWYgKGdyYXBoaWMpIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEdyYXBoaWNPdXRwdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycyhtTnVtT3V0cHV0U2xvdHMsIG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgTGluZWFyT3V0cHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICB9CisgICAgICAgICgqYnVmZmVycyktPnNldEZvcm1hdChvdXRwdXRGb3JtYXQtPmR1cCgpKTsKKworCisgICAgICAgIC8vIFRyeSB0byBzZXQgb3V0cHV0IHN1cmZhY2UgdG8gY3JlYXRlZCBibG9jayBwb29sIGlmIGdpdmVuLgorICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgbUNvbXBvbmVudC0+c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9vbElkXywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0R2VuZXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkxJTkVBUgorICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmZpbmQoImMyLnF0aS4iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgLy8gV09SS0FST1VORDogaWYgd2UncmUgdXNpbmcgZWFybHkgQ1NEIHdvcmthcm91bmQgd2UgY29udmVydCB0bworICAgICAgICAgICAgLy8gICAgICAgICAgICAgYXJyYXkgbW9kZSwgdG8gYXBwZWFzZSBhcHBzIGFzc3VtaW5nIHRoZSBvdXRwdXQKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgIGJ1ZmZlcnMgdG8gYmUgb2YgdGhlIHNhbWUgc2l6ZS4KKyAgICAgICAgICAgICgqYnVmZmVycykgPSAoKmJ1ZmZlcnMpLT50b0FycmF5TW9kZShtTnVtT3V0cHV0U2xvdHMpOworCisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5ID0gMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHBhZGRpbmcgPSAwOzsKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJlbmNvZGVyLWRlbGF5IiwgJmRlbGF5KSkgeworICAgICAgICAgICAgICAgICAgICBkZWxheSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImVuY29kZXItcGFkZGluZyIsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlbGF5IHx8IHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB3cml0ZSBhY2Nlc3MgdG8gdGhlIGJ1ZmZlcnMsIGFuZCB3ZSdyZSBhbHJlYWR5IGluCisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVycyktPmluaXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCB1cCBwaXBlbGluZSBjb250cm9sLiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIG1JbnB1dEJ1ZmZlcnMgYW5kCisgICAgLy8gbU91dHB1dEJ1ZmZlcnMgYXJlIGluaXRpYWxpemVkIHRvIG1ha2Ugc3VyZSB0aGF0IGxpbmdlcmluZyBjYWxsYmFja3MKKyAgICAvLyBhYm91dCBidWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIGdlbmVyYXRpb24gZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZQorICAgIC8vIG5ld2x5IGluaXRpYWxpemVkIHBpcGVsaW5lIGNhcGFjaXR5LgorCisgICAgeworICAgICAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj46OkxvY2tlZCB3YXRjaGVyKG1QaXBlbGluZVdhdGNoZXIpOworICAgICAgICB3YXRjaGVyLT5pbnB1dERlbGF5KGlucHV0RGVsYXlWYWx1ZSkKKyAgICAgICAgICAgICAgICAucGlwZWxpbmVEZWxheShwaXBlbGluZURlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLm91dHB1dERlbGF5KG91dHB1dERlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLnNtb290aG5lc3NGYWN0b3Ioa1Ntb290aG5lc3NGYWN0b3IpOworICAgICAgICB3YXRjaGVyLT5mbHVzaCgpOworICAgIH0KKworICAgIG1JbnB1dE1ldEVvcyA9IGZhbHNlOworICAgIG1TeW5jLnN0YXJ0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpyZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpIHsKKyAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG9TdHJlYW1Gb3JtYXQoMHUpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgJm9TdHJlYW1Gb3JtYXQgfSwge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiB0b0JlUXVldWVkOworICAgIC8vIFRPRE86IHVzZSBwcm9wZXIgYnVmZmVyIGRlcHRoIGluc3RlYWQgb2YgdGhpcyByYW5kb20gdmFsdWUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgICAgIGlmICghKCpidWZmZXJzKS0+cmVxdWVzdE5ld0J1ZmZlcigmaW5kZXgsICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBzdGFydDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBhdCBhbGwiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3RhcnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnksIG9ubHkgJXp1IGJ1ZmZlcnMgYWxsb2NhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj46OkxvY2tlZCBjb25maWdzKG1GbHVzaGVkQ29uZmlncyk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBpbnB1dCBidWZmZXIgJXp1IGF2YWlsYWJsZSIsIG1OYW1lLCBpbmRleCk7CisgICAgICAgICAgICBib29sIHBvc3QgPSB0cnVlOworICAgICAgICAgICAgaWYgKCFjb25maWdzLT5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY29uZmlnID0gY29uZmlncy0+ZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5jYXBhY2l0eSgpID49IGNvbmZpZy0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmJhc2UoKSwgY29uZmlnLT5kYXRhKCksIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBjb25maWctPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIDEpOworICAgICAgICAgICAgICAgICAgICBwb3N0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gYnVmZmVyIGNhcGFjaXR5IHRvbyBzbWFsbCBmb3IgdGhlIGNvbmZpZyAoJXp1IDwgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGJ1ZmZlci0+Y2FwYWNpdHkoKSwgY29uZmlnLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkxJTkVBUiAmJiBpID09IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZmluZCgiYzIucXRpLiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgLy8gV09SS0FST1VORDogU29tZSBhcHBzIGV4cGVjdCBDU0QgYXZhaWxhYmxlIHdpdGhvdXQgcXVldWVpbmcKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBhbnkgaW5wdXQuIFF1ZXVlIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgdGhlIENTRC4KKyAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgICAgICAgICAgcG9zdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvc3QpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIGJ1ZmZlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRvQmVRdWV1ZWQuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyIDogdG9CZVF1ZXVlZCkgeworICAgICAgICBpZiAocXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcikgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIEVycm9yIHdoaWxlIHF1ZXVlaW5nIGluaXRpYWwgYnVmZmVycyIsIG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c3RvcCgpIHsKKyAgICBtU3luYy5zdG9wKCk7CisgICAgbUZpcnN0VmFsaWRGcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBpZiAobUlucHV0U3VyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1JbnB1dFN1cmZhY2UucmVzZXQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Zmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIHsKKyAgICBBTE9HVigiWyVzXSBmbHVzaCIsIG1OYW1lKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj46OkxvY2tlZCBjb25maWdzKG1GbHVzaGVkQ29uZmlncyk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgaWYgKCEod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8IHdvcmstPmlucHV0LmJ1ZmZlcnMuZnJvbnQoKS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBubyBsaW5lYXIgY29kZWMgY29uZmlnIGRhdGEgZm91bmQiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMlJlYWRWaWV3IHZpZXcgPQorICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGZhaWxlZCB0byBtYXAgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YTogJWQiLCBtTmFtZSwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZ3MtPnB1c2hfYmFjayhBQnVmZmVyOjpDcmVhdGVBc0NvcHkodmlldy5kYXRhKCksIHZpZXcuY2FwYWNpdHkoKSkpOworICAgICAgICAgICAgQUxPR1YoIlslc10gc3Rhc2hlZCBmbHVzaGVkIGNvZGVjIGNvbmZpZyBkYXRhIChzaXplPSV1KSIsIG1OYW1lLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICAoKmJ1ZmZlcnMpLT5mbHVzaCgpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICAoKmJ1ZmZlcnMpLT5mbHVzaChmbHVzaGVkV29yayk7CisgICAgfQorICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5mbHVzaCgpOworICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5mbHVzaCgpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6Om9uV29ya0RvbmUoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmssIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSkgeworICAgIGlmIChoYW5kbGVXb3JrKHN0ZDo6bW92ZSh3b3JrKSwgb3V0cHV0Rm9ybWF0LCBpbml0RGF0YSkpIHsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6b25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uSW5wdXRCdWZmZXJSZWxlYXNlZChmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICBib29sIG5ld0lucHV0U2xvdEF2YWlsYWJsZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgbmV3SW5wdXRTbG90QXZhaWxhYmxlID0gKCpidWZmZXJzKS0+ZXhwaXJlQ29tcG9uZW50QnVmZmVyKGJ1ZmZlcik7CisgICAgfQorICAgIGlmIChuZXdJbnB1dFNsb3RBdmFpbGFibGUpIHsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6aGFuZGxlV29yaygKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKSB7CisgICAgaWYgKCh3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggLSBtRmlyc3RWYWxpZEZyYW1lSW5kZXgubG9hZCgpKS5wZWVrKCkgPCAwKSB7CisgICAgICAgIC8vIERpc2NhcmQgZnJhbWVzIGZyb20gcHJldmlvdXMgZ2VuZXJhdGlvbi4KKyAgICAgICAgQUxPR0QoIlslc10gRGlzY2FyZCBmcmFtZXMgZnJvbSBwcmV2aW91cyBnZW5lcmF0aW9uLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh3b3JrLT53b3JrbGV0cy5zaXplKCkgIT0gMXUKKyAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5mcm9udCgpCisgICAgICAgICAgICB8fCAhKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpKSB7CisgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtEb25lKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICB9CisKKyAgICBpZiAod29yay0+cmVzdWx0ID09IEMyX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRCgiWyVzXSBmbHVzaGVkIHdvcms7IGlnbm9yZWQuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAod29yay0+cmVzdWx0ICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHdvcmsgZmFpbGVkIHRvIGNvbXBsZXRlOiAlZCIsIG1OYW1lLCB3b3JrLT5yZXN1bHQpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3Iod29yay0+cmVzdWx0LCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBNZWRpYUNvZGVjIHVzYWdlIHN1cHBvc2VkbHkgaGF2ZSBvbmx5IG9uZSB3b3JrbGV0CisgICAgaWYgKHdvcmstPndvcmtsZXRzLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HSSgiWyVzXSBvbldvcmtEb25lOiBpbmNvcnJlY3QgbnVtYmVyIG9mIHdvcmtsZXRzOiAlenUiLAorICAgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT53b3JrbGV0cy5zaXplKCkpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gJndvcmtsZXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgLy8gTk9URTogTWVkaWFDb2RlYyB1c2FnZSBzdXBwb3NlZGx5IGhhdmUgb25seSBvbmUgb3V0cHV0IHN0cmVhbS4KKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgQUxPR0koIlslc10gb25Xb3JrRG9uZTogaW5jb3JyZWN0IG51bWJlciBvZiBvdXRwdXQgYnVmZmVyczogJXp1IiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgd29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAod29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpID09IDF1KSB7CisgICAgICAgIGJ1ZmZlciA9IHdvcmtsZXQtPm91dHB1dC5idWZmZXJzWzBdOworICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogbnVsbHB0ciBmb3VuZCBpbiBidWZmZXJzOyBpZ25vcmVkLiIsIG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbTsKKyAgICAgICAgd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5iYWNrKCkuc3dhcChwYXJhbSk7CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUucG9wX2JhY2soKTsKKyAgICAgICAgc3dpdGNoIChwYXJhbS0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyRGVwdGgudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5zZXREZXB0aChyZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIgZGVwdGggdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBtTnVtT3V0cHV0U2xvdHMgKyByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IGZhaWxlZCB0byByZWFkIHJlb3JkZXIgZGVwdGgiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzo6Q09SRV9JTkRFWDogeworICAgICAgICAgICAgICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKKyAgICAgICAgICAgICAgICBpZiAocmVvcmRlcktleS51cGRhdGVGcm9tKCpwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPnNldEtleShyZW9yZGVyS2V5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRlZCByZW9yZGVyIGtleSB0byAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZW9yZGVyS2V5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBmYWlsZWQgdG8gcmVhZCByZW9yZGVyIGtleSIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVucmVjb2duaXplZCBjb25maWcgdXBkYXRlICglMDhYKSIsCisgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVzIiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAoKmJ1ZmZlcnMpLT5zZXRGb3JtYXQob3V0cHV0Rm9ybWF0KTsKKworICAgICAgICBBU3RyaW5nIG1lZGlhVHlwZTsKKyAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZFN0cmluZyhLRVlfTUlNRSwgJm1lZGlhVHlwZSkKKyAgICAgICAgICAgICAgICAmJiBtZWRpYVR5cGUgPT0gTUlNRVRZUEVfQVVESU9fUkFXKSB7CisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAoKmJ1ZmZlcnMpLT51cGRhdGVTa2lwQ3V0QnVmZmVyKHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IG91dHB1dCBFT1MiLCBtTmFtZSk7CisgICAgfQorCisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gb3V0QnVmZmVyOworICAgIHNpemVfdCBpbmRleDsKKworICAgIC8vIFdPUktBUk9VTkQ6IGFkanVzdCBvdXRwdXQgdGltZXN0YW1wIGJhc2VkIG9uIGNsaWVudCBpbnB1dCB0aW1lc3RhbXAgYW5kIGNvZGVjCisgICAgLy8gaW5wdXQgdGltZXN0YW1wLiBDb2RlYyBvdXRwdXQgdGltZXN0YW1wIChpbiB0aGUgdGltZXN0YW1wIGZpZWxkKSBzaGFsbCBjb3JyZXNwb25kIHRvCisgICAgLy8gdGhlIGNvZGVjIGlucHV0IHRpbWVzdGFtcCwgYnV0IGNsaWVudCBvdXRwdXQgdGltZXN0YW1wIHNob3VsZCAocmVwb3J0ZWQgaW4gdGltZVVzKQorICAgIC8vIHNoYWxsIGNvcnJlc3BvbmQgdG8gdGhlIGNsaWVudCBpbnB1dCB0aW1lc2FtcCAoaW4gY3VzdG9tT3JkaW5hbCkuIEJ5IHVzaW5nIHRoZQorICAgIC8vIGRlbHRhIGJldHdlZW4gdGhlIHR3bywgdGhpcyBhbGxvd3MgZm9yIHNvbWUgdGltZXN0YW1wIGRldmlhdGlvbiAtIGUuZy4gaWYgb25lIGlucHV0CisgICAgLy8gcHJvZHVjZXMgbXVsdGlwbGUgb3V0cHV0LgorICAgIGMyX2NudHI2NF90IHRpbWVzdGFtcCA9CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCArIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbAorICAgICAgICAgICAgICAgIC0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogaW5wdXQgJWxsZCwgY29kZWMgJWxsZCA9PiBvdXRwdXQgJWxsZCA9PiAlbGxkIiwKKyAgICAgICAgICBtTmFtZSwKKyAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCisgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgd29ya2xldC0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgIHRpbWVzdGFtcC5wZWVrbGwoKSk7CisKKyAgICBpZiAoaW5pdERhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCgqYnVmZmVycyktPnJlZ2lzdGVyQ3NkKGluaXREYXRhLCAmaW5kZXgsICZvdXRCdWZmZXIpID09IE9LKSB7CisgICAgICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVzdGFtcC5wZWVrKCkpOworICAgICAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJmbGFncyIsIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGNzZCBpbmRleCA9ICV6dSBbJXBdIiwgbU5hbWUsIGluZGV4LCBvdXRCdWZmZXIuZ2V0KCkpOworCisgICAgICAgICAgICBidWZmZXJzLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgb3V0QnVmZmVyKTsKKyAgICAgICAgICAgIGJ1ZmZlcnMubG9jaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogdW5hYmxlIHRvIHJlZ2lzdGVyIGNzZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgYnVmZmVycy5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJ1ZmZlciAmJiAhZmxhZ3MpIHsKKyAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogTm90IHJlcG9ydGluZyBvdXRwdXQgYnVmZmVyICglbGxkKSIsCisgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3VsbCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+ICZpbmZvIDogYnVmZmVyLT5pbmZvKCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHByb3Blcmx5IHRyYW5zbGF0ZSB0aGVzZSB0byBtZXRhZGF0YQorICAgICAgICAgICAgc3dpdGNoIChpbmZvLT5jb3JlSW5kZXgoKS5jb3JlSW5kZXgoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpDT1JFX0lOREVYOgorICAgICAgICAgICAgICAgICAgICBpZiAoKChDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm8gKilpbmZvLmdldCgpKS0+dmFsdWUgJiBDMkNvbmZpZzo6U1lOQ19GUkFNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD46OkxvY2tlZCByZW9yZGVyKG1SZW9yZGVyU3Rhc2gpOworICAgICAgICByZW9yZGVyLT5lbXBsYWNlKGJ1ZmZlciwgdGltZXN0YW1wLnBlZWsoKSwgZmxhZ3MsIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsKTsKKyAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgICAgICAvLyBGbHVzaCByZW9yZGVyIHN0YXNoCisgICAgICAgICAgICByZW9yZGVyLT5zZXREZXB0aCgwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZW5kT3V0cHV0QnVmZmVycygpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNlbmRPdXRwdXRCdWZmZXJzKCkgeworICAgIFJlb3JkZXJTdGFzaDo6RW50cnkgZW50cnk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gb3V0QnVmZmVyOworICAgIHNpemVfdCBpbmRleDsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPjo6TG9ja2VkIHJlb3JkZXIobVJlb3JkZXJTdGFzaCk7CisgICAgICAgIGlmICghcmVvcmRlci0+aGFzUGVuZGluZygpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlb3JkZXItPnBvcCgmZW50cnkpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSAoKmJ1ZmZlcnMpLT5yZWdpc3RlckJ1ZmZlcihlbnRyeS5idWZmZXIsICZpbmRleCwgJm91dEJ1ZmZlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0QnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICBpZiAoISgqYnVmZmVycyktPmlzQXJyYXlNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcnMgPSAoKmJ1ZmZlcnMpLT50b0FycmF5TW9kZShtTnVtT3V0cHV0U2xvdHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPdXRwdXRCdWZmZXJzQXJyYXkgKmFycmF5ID0gKE91dHB1dEJ1ZmZlcnNBcnJheSAqKWJ1ZmZlcnMtPmdldCgpOworICAgICAgICAgICAgICAgIGFycmF5LT5yZWFsbG9jKGVudHJ5LmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIlslc10gc2VuZE91dHB1dEJ1ZmZlcnM6IHVuYWJsZSB0byByZWdpc3RlciBvdXRwdXQgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICAgICAgcmVvcmRlci0+ZGVmZXIoZW50cnkpOworCisgICAgICAgICAgICBidWZmZXJzLnVubG9jaygpOworICAgICAgICAgICAgcmVvcmRlci51bmxvY2soKTsKKworICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgcmVvcmRlci51bmxvY2soKTsKKworICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIGVudHJ5LnRpbWVzdGFtcCk7CisgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBlbnRyeS5mbGFncyk7CisgICAgICAgIEFMT0dWKCJbJXNdIHNlbmRPdXRwdXRCdWZmZXJzOiBvdXQgYnVmZmVyIGluZGV4ID0gJXp1IFslcF0gPT4gJXAgKyAlenUiLAorICAgICAgICAgICAgICAgIG1OYW1lLCBpbmRleCwgb3V0QnVmZmVyLmdldCgpLCBvdXRCdWZmZXItPmRhdGEoKSwgb3V0QnVmZmVyLT5zaXplKCkpOworICAgICAgICBtQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBvdXRCdWZmZXIpOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmbmV3U3VyZmFjZSkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pY191aW50MzJfdCBzdXJmYWNlR2VuZXJhdGlvbnswfTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gKGdldHBpZCgpIDw8IDEwKSB8CisgICAgICAgICAgICAoKHN1cmZhY2VHZW5lcmF0aW9uLmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSArIDEpCisgICAgICAgICAgICAgICAgJiAoKDEgPDwgMTApIC0gMSkpOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgaWYgKG5ld1N1cmZhY2UpIHsKKyAgICAgICAgbmV3U3VyZmFjZS0+c2V0U2NhbGluZ01vZGUoTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKKyAgICAgICAgcHJvZHVjZXIgPSBuZXdTdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgIHByb2R1Y2VyLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJbJXNdIHNldHRpbmcgb3V0cHV0IHN1cmZhY2UgdG8gbnVsbCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4gb3V0cHV0UG9vbEludGY7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKyAgICAgICAgb3V0cHV0UG9vbElkID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKyAgICAgICAgb3V0cHV0UG9vbEludGYgPSBwb29scy0+b3V0cHV0UG9vbEludGY7CisgICAgfQorCisgICAgaWYgKG91dHB1dFBvb2xJbnRmKSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgIG91dHB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0koIlslc10gc2V0U3VyZmFjZTogY29tcG9uZW50IHNldE91dHB1dFN1cmZhY2UgZmFpbGVkIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgbmV3U3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgb3V0cHV0LT5zdXJmYWNlID0gbmV3U3VyZmFjZTsKKyAgICAgICAgb3V0cHV0LT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1BpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OmR1cmF0aW9uIENDb2RlY0J1ZmZlckNoYW5uZWw6OmVsYXBzZWQoKSB7CisgICAgLy8gV2hlbiBjbGllbnQgcHVzaGVkIEVPUywgd2Ugd2FudCBhbGwgdGhlIHdvcmsgdG8gYmUgZG9uZSBxdWlja2x5LgorICAgIC8vIE90aGVyd2lzZSwgY29tcG9uZW50IG1heSBoYXZlIHN0YWxsZWQgd29yayBkdWUgdG8gaW5wdXQgc3RhcnZhdGlvbiB1cCB0bworICAgIC8vIHRoZSBzdW0gb2YgdGhlIGRlbGF5IGluIHRoZSBwaXBlbGluZS4KKyAgICBzaXplX3QgbiA9IG1JbnB1dE1ldEVvcyA/IDAgOiBtRGVsYXk7CisgICAgcmV0dXJuIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5lbGFwc2VkKFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpLCBuKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRNZXRhTW9kZShNZXRhTW9kZSBtb2RlKSB7CisgICAgbU1ldGFNb2RlID0gbW9kZTsKK30KKworc3RhdHVzX3QgdG9TdGF0dXNUKGMyX3N0YXR1c190IGMycywgYzJfb3BlcmF0aW9uX3QgYzJvcCkgeworICAgIC8vIEMyX09LIGlzIGFsd2F5cyB0cmFuc2xhdGVkIHRvIE9LLgorICAgIGlmIChjMnMgPT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIE9wZXJhdGlvbi1kZXBlbmRlbnQgdHJhbnNsYXRpb24KKyAgICAvLyBUT0RPOiBBZGQgYXMgbmVjZXNzYXJ5CisgICAgc3dpdGNoIChjMm9wKSB7CisgICAgY2FzZSBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0OgorICAgICAgICBzd2l0Y2ggKGMycykgeworICAgICAgICBjYXNlIEMyX05PX01FTU9SWToKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEJhY2t1cCBvcGVyYXRpb24tYWdub3N0aWMgdHJhbnNsYXRpb24KKyAgICBzd2l0Y2ggKGMycykgeworICAgIGNhc2UgQzJfQkFEX0lOREVYOgorICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIGNhc2UgQzJfQkFEX1ZBTFVFOgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGNhc2UgQzJfQkxPQ0tJTkc6CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBjYXNlIEMyX0RVUExJQ0FURToKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIGNhc2UgQzJfTk9fSU5JVDoKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgY2FzZSBDMl9OT19NRU1PUlk6CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgY2FzZSBDMl9OT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBjYXNlIEMyX1RJTUVEX09VVDoKKyAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICBjYXNlIEMyX0JBRF9TVEFURToKKyAgICBjYXNlIEMyX0NBTkNFTEVEOgorICAgIGNhc2UgQzJfQ0FOTk9UX0RPOgorICAgIGNhc2UgQzJfQ09SUlVQVEVEOgorICAgIGNhc2UgQzJfT01JVFRFRDoKKyAgICBjYXNlIEMyX1JFRlVTRUQ6CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KGMycyk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhMjliNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXworCisjZGVmaW5lIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisjaW5jbHVkZSAiUGlwZWxpbmVXYXRjaGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVtb3J5RGVhbGVyOworCitjbGFzcyBDQ29kZWNDYWxsYmFjayB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q0NvZGVjQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyLCBlbnVtIEFjdGlvbkNvZGUgYWN0aW9uQ29kZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKSA9IDA7Cit9OworCisvKioKKyAqIEJ1ZmZlckNoYW5uZWxCYXNlIGltcGxlbWVudGF0aW9uIGZvciBDQ29kZWMuCisgKi8KK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWwKKyAgICA6IHB1YmxpYyBCdWZmZXJDaGFubmVsQmFzZSwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q0NvZGVjQnVmZmVyQ2hhbm5lbD4geworcHVibGljOgorICAgIGV4cGxpY2l0IENDb2RlY0J1ZmZlckNoYW5uZWwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0NhbGxiYWNrPiAmY2FsbGJhY2spOworICAgIHZpcnR1YWwgfkNDb2RlY0J1ZmZlckNoYW5uZWwoKTsKKworICAgIC8vIEJ1ZmZlckNoYW5uZWxCYXNlIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVJbnB1dEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgYm9vbCBzZWN1cmUsCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICppdiwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLAorICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywKKyAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVuZGVyT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgaW50NjRfdCB0aW1lc3RhbXBOcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjYXJkQnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBnZXRJbnB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0T3V0cHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyBiZWxvdyBhcmUgaW50ZXJmYWNlIGZvciBDQ29kZWMgdG8gdXNlLgorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21wb25lbnQgb2JqZWN0IGZvciBidWZmZXIgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisgICAgLyoqCisgICAgICogU2V0IG91dHB1dCBncmFwaGljIHN1cmZhY2UgZm9yIHJlbmRlcmluZy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIC8qKgorICAgICAqIFNldCBHcmFwaGljQnVmZmVyU291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjb21wb25lbnQgZXh0cmFjdHMgaW5wdXQKKyAgICAgKiBidWZmZXJzLgorICAgICAqLworICAgIHN0YXR1c190IHNldElucHV0U3VyZmFjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpOworCisgICAgLyoqCisgICAgICogU2lnbmFsIEVPUyB0byBpbnB1dCBzdXJmYWNlLgorICAgICAqLworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKworICAgIC8qKgorICAgICAqIFNldCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHF1ZXVlaW5nIGJ1ZmZlcnMgdG8gdGhlIGNvbXBvbmVudC4gVGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIHF1ZXVlCisgICAgICogYnVmZmVycyBiZWZvcmUgdGhpcyBjYWxsIGhhcyBjb21wbGV0ZWQuCisgICAgICovCisgICAgc3RhdHVzX3Qgc3RhcnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpOworCisgICAgLyoqCisgICAgICogUmVxdWVzdCBpbml0aWFsIGlucHV0IGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJ5IGNsaWVudC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworCisgICAgLyoqCisgICAgICogU3RvcCBxdWV1ZWluZyBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuIFRoaXMgb2JqZWN0IHNob3VsZCBuZXZlciBxdWV1ZQorICAgICAqIGJ1ZmZlcnMgYWZ0ZXIgdGhpcyBjYWxsLCB1bnRpbCBzdGFydCgpIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3AoKTsKKworICAgIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspOworCisgICAgLyoqCisgICAgICogTm90aWZ5IGlucHV0IGNsaWVudCBhYm91dCB3b3JrIGRvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd29ya0l0ZW1zICAgZmluaXNoZWQgd29yayBpdGVtLgorICAgICAqIEBwYXJhbSBvdXRwdXRGb3JtYXQgbmV3IG91dHB1dCBmb3JtYXQgaWYgaXQgaGFzIGNoYW5nZWQsIG90aGVyd2lzZSBudWxscHRyCisgICAgICogQHBhcmFtIGluaXREYXRhICAgIG5ldyBpbml0IGRhdGEgKENTRCkgaWYgaXQgaGFzIGNoYW5nZWQsIG90aGVyd2lzZSBudWxscHRyCisgICAgICovCisgICAgdm9pZCBvbldvcmtEb25lKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGFuIGlucHV0IGJ1ZmZlciBhdmFpbGFibGUgZm9yIHRoZSBjbGllbnQgYXMgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZAorICAgICAqIGJ5IHRoZSBjb2RlYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZUluZGV4IFRoZSBpbmRleCBvZiBpbnB1dCB3b3JrCisgICAgICogQHBhcmFtIGFycmF5SW5kZXggVGhlIGluZGV4IG9mIGJ1ZmZlciBpbiB0aGUgaW5wdXQgd29yayBidWZmZXJzLgorICAgICAqLworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpOworCisgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6ZHVyYXRpb24gZWxhcHNlZCgpOworCisgICAgZW51bSBNZXRhTW9kZSB7CisgICAgICAgIE1PREVfTk9ORSwKKyAgICAgICAgTU9ERV9BTlcsCisgICAgfTsKKworICAgIHZvaWQgc2V0TWV0YU1vZGUoTWV0YU1vZGUgbW9kZSk7CisKKyAgICAvLyBJbnRlcm5hbCBjbGFzc2VzCisgICAgY2xhc3MgQnVmZmVyczsKKyAgICBjbGFzcyBJbnB1dEJ1ZmZlcnM7CisgICAgY2xhc3MgT3V0cHV0QnVmZmVyczsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBRdWV1ZUd1YXJkOworCisgICAgLyoqCisgICAgICogU3BlY2lhbCBtdXRleC1saWtlIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgKgorICAgICAqIC0gQXQgU1RPUFBFRCBzdGF0ZSAoaW5pdGlhbCwgb3IgYWZ0ZXIgc3RvcCgpKQorICAgICAqICAgLSBRdWV1ZUd1YXJkIG9iamVjdCBnZXRzIGNyZWF0ZWQgYXQgU1RPUFBFRCBzdGF0ZSwgYW5kIHRoZSBjbGllbnQgaXMKKyAgICAgKiAgICAgc3VwcG9zZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAqIC0gQXQgUlVOTklORyBzdGF0ZSAoYWZ0ZXIgc3RhcnQoKSkKKyAgICAgKiAgIC0gRWFjaCBRdWV1ZUd1YXJkIG9iamVjdAorICAgICAqLworICAgIGNsYXNzIFF1ZXVlU3luYyB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQXQgY29uc3RydWN0aW9uIHRoZSBzeW5jIG9iamVjdCBpcyBpbiBTVE9QUEVEIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIFF1ZXVlU3luYygpIHt9CisgICAgICAgIH5RdWV1ZVN5bmMoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyYW5zaXRpb24gdG8gUlVOTklORyBzdGF0ZSB3aGVuIHN0b3BwZWQuIE5vLW9wIGlmIGFscmVhZHkgaW4gUlVOTklORworICAgICAgICAgKiBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc3RhcnQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQXQgUlVOTklORyBzdGF0ZSwgd2FpdCB1bnRpbCBhbGwgUXVldWVHdWFyZCBvYmplY3QgY3JlYXRlZCBkdXJpbmcKKyAgICAgICAgICogUlVOTklORyBzdGF0ZSBhcmUgZGVzdHJveWVkLCBhbmQgdGhlbiB0cmFuc2l0aW9uIHRvIFNUT1BQRUQgc3RhdGUuCisgICAgICAgICAqIE5vLW9wIGlmIGFscmVhZHkgaW4gU1RPUFBFRCBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc3RvcCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgTXV0ZXggbUd1YXJkTG9jazsKKworICAgICAgICBzdHJ1Y3QgQ291bnRlciB7CisgICAgICAgICAgICBpbmxpbmUgQ291bnRlcigpIDogdmFsdWUoLTEpIHt9CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQ29uZGl0aW9uIGNvbmQ7CisgICAgICAgIH07CisgICAgICAgIE11dGV4ZWQ8Q291bnRlcj4gbUNvdW50OworCisgICAgICAgIGZyaWVuZCBjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOworICAgIH07CisKKyAgICBjbGFzcyBRdWV1ZUd1YXJkIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFF1ZXVlR3VhcmQoUXVldWVTeW5jICZzeW5jKTsKKyAgICAgICAgflF1ZXVlR3VhcmQoKTsKKyAgICAgICAgaW5saW5lIGJvb2wgaXNSdW5uaW5nKCkgeyByZXR1cm4gbVJ1bm5pbmc7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFF1ZXVlU3luYyAmbVN5bmM7CisgICAgICAgIGJvb2wgbVJ1bm5pbmc7CisgICAgfTsKKworICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB2b2lkIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKTsKKyAgICBzdGF0dXNfdCBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CisgICAgYm9vbCBoYW5kbGVXb3JrKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSk7CisgICAgdm9pZCBzZW5kT3V0cHV0QnVmZmVycygpOworCisgICAgUXVldWVTeW5jIG1TeW5jOworICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKyAgICBzcDxJTWVtb3J5PiBtRGVjcnlwdERlc3RpbmF0aW9uOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7IC8vLzwgY29tcG9uZW50IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgY29tcG9uZW50IG5hbWUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQ2FsbGJhY2s+IG1DQ29kZWNDYWxsYmFjazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1JbnB1dEFsbG9jYXRvcjsKKyAgICBRdWV1ZVN5bmMgbVF1ZXVlU3luYzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IG1QYXJhbXNUb0JlU2V0OworCisgICAgc2l6ZV90IG1OdW1JbnB1dFNsb3RzOworICAgIHNpemVfdCBtTnVtT3V0cHV0U2xvdHM7CisgICAgc2l6ZV90IG1EZWxheTsKKworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+IG1JbnB1dEJ1ZmZlcnM7CisgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+PiBtRmx1c2hlZENvbmZpZ3M7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+IG1PdXRwdXRCdWZmZXJzOworCisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbUZyYW1lSW5kZXg7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbUZpcnN0VmFsaWRGcmFtZUluZGV4OworCisgICAgc3A8TWVtb3J5RGVhbGVyPiBtYWtlTWVtb3J5RGVhbGVyKHNpemVfdCBoZWFwU2l6ZSk7CisKKyAgICBzdHJ1Y3QgT3V0cHV0U3VyZmFjZSB7CisgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIGludCBtYXhEZXF1ZXVlQnVmZmVyczsKKyAgICB9OworICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT4gbU91dHB1dFN1cmZhY2U7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29scyB7CisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlucHV0QWxsb2NhdG9ySWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gaW5wdXRQb29sOworICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBvdXRwdXRBbGxvY2F0b3JJZDsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+IG91dHB1dFBvb2xJbnRmOworICAgIH07CisgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPiBtQmxvY2tQb29sczsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiBtSW5wdXRTdXJmYWNlOworCisgICAgTWV0YU1vZGUgbU1ldGFNb2RlOworCisgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+IG1QaXBlbGluZVdhdGNoZXI7CisKKyAgICBjbGFzcyBSZW9yZGVyU3Rhc2ggeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgpIDogYnVmZmVyKG51bGxwdHIpLCB0aW1lc3RhbXAoMCksIGZsYWdzKDApLCBvcmRpbmFsKHswLCAwLCAwfSkge30KKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYiwKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8pCisgICAgICAgICAgICAgICAgOiBidWZmZXIoYiksIHRpbWVzdGFtcCh0KSwgZmxhZ3MoZiksIG9yZGluYWwobykge30KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICBpbnQzMl90IGZsYWdzOworICAgICAgICAgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgICAgICB9OworCisgICAgICAgIFJlb3JkZXJTdGFzaCgpOworCisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgdm9pZCBmbHVzaCgpOworICAgICAgICB2b2lkIHNldERlcHRoKHVpbnQzMl90IGRlcHRoKTsKKyAgICAgICAgdm9pZCBzZXRLZXkoQzJDb25maWc6Om9yZGluYWxfa2V5X3Qga2V5KTsKKyAgICAgICAgYm9vbCBwb3AoRW50cnkgKmVudHJ5KTsKKyAgICAgICAgdm9pZCBlbXBsYWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm9yZGluYWwpOworICAgICAgICB2b2lkIGRlZmVyKGNvbnN0IEVudHJ5ICZlbnRyeSk7CisgICAgICAgIGJvb2wgaGFzUGVuZGluZygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtUGVuZGluZzsKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtU3Rhc2g7CisgICAgICAgIHVpbnQzMl90IG1EZXB0aDsKKyAgICAgICAgQzJDb25maWc6Om9yZGluYWxfa2V5X3QgbUtleTsKKworICAgICAgICBib29sIGxlc3MoY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKTsKKyAgICB9OworICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPiBtUmVvcmRlclN0YXNoOworCisgICAgc3RkOjphdG9taWNfYm9vbCBtSW5wdXRNZXRFb3M7CisKKyAgICBpbmxpbmUgYm9vbCBoYXNDcnlwdG9PckRlc2NyYW1ibGVyKCkgeworICAgICAgICByZXR1cm4gbUNyeXB0byAhPSBudWxscHRyIHx8IG1EZXNjcmFtYmxlciAhPSBudWxscHRyOworICAgIH0KK307CisKKy8vIENvbnZlcnNpb24gb2YgYSBjMl9zdGF0dXNfdCB2YWx1ZSB0byBhIHN0YXR1c190IHZhbHVlIG1heSBkZXBlbmQgb24gdGhlCisvLyBvcGVyYXRpb24gdGhhdCByZXR1cm5zIHRoZSBjMl9zdGF0dXNfdCB2YWx1ZS4KK2VudW0gYzJfb3BlcmF0aW9uX3QgeworICAgIEMyX09QRVJBVElPTl9OT05FLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfY29ubmVjdFRvT214SW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfY3JlYXRlQmxvY2tQb29sLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZGVzdHJveUJsb2NrUG9vbCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2Rpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZHJhaW4sCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9mbHVzaCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3F1ZXVlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfcmVsZWFzZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3Jlc2V0LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc2V0T3V0cHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RvcCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY29weUJ1ZmZlciwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY3JlYXRlQ29tcG9uZW50LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jcmVhdGVJbnB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NyZWF0ZUludGVyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX2NvbmZpZywKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX3F1ZXJ5LAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfcXVlcnlTdXBwb3J0ZWRQYXJhbXMsCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9xdWVyeVN1cHBvcnRlZFZhbHVlcywKKyAgICBDMl9PUEVSQVRJT05fSW5wdXRTdXJmYWNlX2Nvbm5lY3RUb0NvbXBvbmVudCwKKyAgICBDMl9PUEVSQVRJT05fSW5wdXRTdXJmYWNlQ29ubmVjdGlvbl9kaXNjb25uZWN0LAorfTsKKworc3RhdHVzX3QgdG9TdGF0dXNUKGMyX3N0YXR1c190IGMycywgYzJfb3BlcmF0aW9uX3QgYzJvcCA9IEMyX09QRVJBVElPTl9OT05FKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDQ09ERUNfQlVGRkVSX0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwMmU3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCkBAIC0wLDAgKzEsMTYxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQ29uZmlnIgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKworI2luY2x1ZGUgIkNDb2RlY0NvbmZpZy5oIgorI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgNjQgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgMSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgtMSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncworI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUICAgICAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDQ29kZWNDb25maWcKKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBtYXBwaW5nIGJldHdlZW4gU0RLIGFuZCBDb2RlYyAyLjAgY29uZmlndXJhdGlvbnMuCisgKi8KK3N0cnVjdCBDb25maWdNYXBwZXIgeworICAgIC8qKgorICAgICAqIFZhbHVlIG1hcHBlciAoQzJWYWx1ZSA9PiBDMlZhbHVlKQorICAgICAqLworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxDMlZhbHVlKEMyVmFsdWUpPiBNYXBwZXI7CisKKyAgICAvLy8gc2hvcnRoYW5kCisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICBDb25maWdNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFLZXksIEMyU3RyaW5nIGMyc3RydWN0LCBDMlN0cmluZyBjMmZpZWxkKQorICAgICAgICA6IG1Eb21haW4oRG9tYWluOjpBTEwpLCBtTWVkaWFLZXkobWVkaWFLZXkpLCBtU3RydWN0KGMyc3RydWN0KSwgbUZpZWxkKGMyZmllbGQpIHsgfQorCisgICAgLy8vIExpbWl0cyB0aGlzIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gZG9tYWluCisgICAgQ29uZmlnTWFwcGVyICZsaW1pdFRvKHVpbnQzMl90IGRvbWFpbikgeworICAgICAgICBDMl9DSEVDSyhkb21haW4gJiBEb21haW46OkdVQVJEX0JJVCk7CisgICAgICAgIG1Eb21haW4gPSBEb21haW4obURvbWFpbiAmIGRvbWFpbik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPT4gQ29kZWMgMi4wIG1hcHBlciAoc2hvdWxkIG5vdCBiZSBpbiB0aGUgU0RLIGZvcm1hdCkKKyAgICBDb25maWdNYXBwZXIgJndpdGhNYXBwZXIoTWFwcGVyIG1hcHBlcikgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPD0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXJzCisgICAgQ29uZmlnTWFwcGVyICZ3aXRoTWFwcGVycyhNYXBwZXIgbWFwcGVyLCBNYXBwZXIgcmV2ZXJzZSkgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIG1SZXZlcnNlID0gcmV2ZXJzZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBBZGRzIFNESyA8PT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBlcnMgYmFzZWQgb24gQzJNYXBwZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDMlR5cGUsIHR5cGVuYW1lIFNka1R5cGU9aW50MzJfdD4KKyAgICBDb25maWdNYXBwZXIgJndpdGhDMk1hcHBlcnMoKSB7CisgICAgICAgIEMyX0NIRUNLKCFtTWFwcGVyKTsKKyAgICAgICAgQzJfQ0hFQ0soIW1SZXZlcnNlKTsKKyAgICAgICAgbU1hcHBlciA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBTZGtUeXBlIHNka1ZhbHVlOworICAgICAgICAgICAgQzJUeXBlIGMyVmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnNka1ZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHNka1ZhbHVlLCAmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH07CisgICAgICAgIG1SZXZlcnNlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIFNka1R5cGUgc2RrVmFsdWU7CisgICAgICAgICAgICBDMlR5cGUgYzJWYWx1ZTsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8QzJUeXBlPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMlZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKGMyVmFsdWUsICZzZGtWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIE1hcHMgZnJvbSBTREsgdmFsdWVzIGluIGFuIEFNZXNzYWdlIHRvIGEgc3VpdGFibGUgQzJWYWx1ZS4KKyAgICBDMlZhbHVlIG1hcEZyb21NZXNzYWdlKGNvbnN0IEFNZXNzYWdlOjpJdGVtRGF0YSAmaXRlbSkgY29uc3QgeworICAgICAgICBDMlZhbHVlIHZhbHVlOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlOworICAgICAgICBpZiAoaXRlbS5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBpbnQzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gaW50NjRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGZsb2F0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gKGZsb2F0KWRvdWJsZVZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS50eXBlKCkgIT0gQzJWYWx1ZTo6Tk9fSU5JVCAmJiBtTWFwcGVyKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG1NYXBwZXIodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLy8gTWFwcyBmcm9tIGEgQzJWYWx1ZSB0byBhbiBTREsgdmFsdWUgaW4gYW4gQU1lc3NhZ2UuCisgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIG1hcFRvTWVzc2FnZShDMlZhbHVlIHZhbHVlKSBjb25zdCB7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIHVpbnQzMl90IHVpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIHVpbnQ2NF90IHVpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBpZiAodmFsdWUudHlwZSgpICE9IEMyVmFsdWU6Ok5PX0lOSVQgJiYgbVJldmVyc2UpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbVJldmVyc2UodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5nZXQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQzMlZhbHVlKSAmJiB1aW50MzJWYWx1ZSA8PSB1aW50MzJfdChJTlQzMl9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQzMl90KXVpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQ2NFZhbHVlKSAmJiB1aW50NjRWYWx1ZSA8PSB1aW50NjRfdChJTlQ2NF9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQ2NF90KXVpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChmbG9hdFZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICBEb21haW4gZG9tYWluKCkgY29uc3QgeyByZXR1cm4gbURvbWFpbjsgfQorICAgIHN0ZDo6c3RyaW5nIG1lZGlhS2V5KCkgY29uc3QgeyByZXR1cm4gbU1lZGlhS2V5OyB9CisgICAgc3RkOjpzdHJpbmcgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1GaWVsZC5zaXplKCkgPyBtU3RydWN0ICsgJy4nICsgbUZpZWxkIDogbVN0cnVjdDsgfQorICAgIE1hcHBlciBtYXBwZXIoKSBjb25zdCB7IHJldHVybiBtTWFwcGVyOyB9CisgICAgTWFwcGVyIHJldmVyc2UoKSBjb25zdCB7IHJldHVybiBtUmV2ZXJzZTsgfQorCitwcml2YXRlOgorICAgIERvbWFpbiBtRG9tYWluOyAgICAgICAgIC8vLzwgcGFyYW1ldGVyIGRvbWFpbiAobWFzaykgY29udGFpbmluZyBwb3J0LCBraW5kIGFuZCBjb25maWcgZG9tYWlucworICAgIHN0ZDo6c3RyaW5nIG1NZWRpYUtleTsgIC8vLzwgU0RLIGtleQorICAgIEMyU3RyaW5nIG1TdHJ1Y3Q7ICAgICAgIC8vLzwgQ29kZWMgMi4wIHN0cnVjdCBuYW1lCisgICAgQzJTdHJpbmcgbUZpZWxkOyAgICAgICAgLy8vPCBDb2RlYyAyLjAgZmllbGQgbmFtZQorICAgIE1hcHBlciBtTWFwcGVyOyAgICAgICAgIC8vLzwgb3B0aW9uYWwgU0RLID0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXIKKyAgICBNYXBwZXIgbVJldmVyc2U7ICAgICAgICAvLy88IG9wdGlvbmFsIENvZGVjIDIuMCA9PiBTREsgdmFsdWUgbWFwcGVyCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUE9SVCwgdHlwZW5hbWUgU1RSRUFNPgorQVN0cmluZyBRdWVyeU1lZGlhVHlwZUltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7fSwgeyBQT1JUOjpQQVJBTV9UWVBFLCBTVFJFQU06OlBBUkFNX1RZUEUgfSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUE9SVCAqcG9ydE1lZGlhVHlwZSA9CisgICAgICAgICAgICBQT1JUOjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgICAgICBpZiAocG9ydE1lZGlhVHlwZSkgeworICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgcG9ydE1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgc3Rybmxlbihwb3J0TWVkaWFUeXBlLT5tLnZhbHVlLCBwb3J0TWVkaWFUeXBlLT5mbGV4Q291bnQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1RSRUFNICpzdHJlYW1NZWRpYVR5cGUgPSBTVFJFQU06OkZyb20ocXVlcmllZFswXS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoc3RyZWFtTWVkaWFUeXBlKSB7CisgICAgICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbU1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4oc3RyZWFtTWVkaWFUeXBlLT5tLnZhbHVlLCBzdHJlYW1NZWRpYVR5cGUtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoInJlYWQgbWVkaWEgdHlwZTogJXMiLCBtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBtZWRpYVR5cGU7Cit9CisKK0FTdHJpbmcgUXVlcnlNZWRpYVR5cGUoCisgICAgICAgIGJvb2wgaW5wdXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIHR5cGVkZWYgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyBQOworICAgIHR5cGVkZWYgQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nIFM7CisgICAgaWYgKGlucHV0KSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6aW5wdXQsIFM6OmlucHV0Pihjb21wb25lbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6b3V0cHV0LCBTOjpvdXRwdXQ+KGNvbXBvbmVudCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLyoqCisgKiBTZXQgb2Ygc3RhbmRhcmQgcGFyYW1ldGVycyB1c2VkIGJ5IENDb2RlYyB0aGF0IGFyZSBleHBvc2VkIHRvIE1lZGlhQ29kZWMuCisgKi8KK3N0cnVjdCBTdGFuZGFyZFBhcmFtcyB7CisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICAvLyBzdGFuZGFyZCAoTWVkaWFDb2RlYykgcGFyYW1zIGFyZSBrZXllZCBieSBtZWRpYSBmb3JtYXQga2V5CisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZyBTZGtLZXk7CisKKyAgICAvLy8gdXNlZCB0byByZXR1cm4gcmVmZXJlbmNlIHRvIG5vIGNvbmZpZyBtYXBwZXJzIGluIGdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBOT19NQVBQRVJTOworCisgICAgLy8vIFJldHVybnMgQ29kZWMgMi4wIGVxdWl2YWxlbnQgcGFyYW1ldGVycyBmb3IgYW4gU0RLIGZvcm1hdCBrZXkuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiAmZ2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleShzdGQ6OnN0cmluZyBrZXkpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1Db25maWdNYXBwZXJzLmZpbmQoa2V5KTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgibm8gYzIgZXF1aXZhbGVudHMgZm9yICVzIiwga2V5LmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX01BUFBFUlM7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImZvdW5kICV6dSBlcXMgZm9yICVzIiwgaXQtPnNlY29uZC5zaXplKCksIGtleS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIFNESyA8PT4gQ29kZWMgMi4wIHBhcmFtZXRlciBtYXBwaW5nLiBNdWx0aXBsZSBDb2RlYyAyLjAgcGFyYW1ldGVycyBtYXkgbWFwIHRvIGEKKyAgICAgKiBzaW5nbGUgU0RLIGtleSwgaW4gd2hpY2ggY2FzZSB0aGV5IHNoYWxsIGJlIG9yZGVyZWQgZnJvbSBsZWFzdCBhdXRob3JpdGF0aXZlIHRvIG1vc3QKKyAgICAgKiBhdXRob3JpdGF0aXZlLiBXaGVuIGNvbnN0cnVjdGluZyBTREsgZm9ybWF0cywgdGhlIGxhc3QgbWFwcGVkIENvZGVjIDIuMCBwYXJhbWV0ZXIgdGhhdAorICAgICAqIGlzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50IHdpbGwgZGV0ZXJtaW5lIHRoZSBleHBvc2VkIHZhbHVlLiAoVE9ETzogcGVyaGFwcyByZXN0cmljdCB0aGlzCisgICAgICogYnkgZG9tYWluLikKKyAgICAgKi8KKyAgICB2b2lkIGFkZChjb25zdCBDb25maWdNYXBwZXIgJmNtKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ29uZmlnTWFwcGVycy5maW5kKGNtLm1lZGlhS2V5KCkpOworICAgICAgICBBTE9HVigiJWMlYyVjJWMgJWMlYyVjICUwNHggJTlzICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfSU5QVVQpID8gJ0knIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfT1VUUFVUKSA/ICdPJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX0NPREVEKSA/ICdDJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1JBVykgPyAnUicgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19DT05GSUcpID8gJ2MnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUEFSQU0pID8gJ3AnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUkVBRCkgPyAncicgOiAnICcpLAorICAgICAgICAgICAgICBjbS5kb21haW4oKSwKKyAgICAgICAgICAgICAgaXQgPT0gbUNvbmZpZ01hcHBlcnMuZW5kKCkgPyAiYWRkaW5nIiA6ICJleHRlbmRpbmciLAorICAgICAgICAgICAgICBjbS5tZWRpYUtleSgpLmNfc3RyKCksIGNtLnBhdGgoKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+IGVxcyA9IHsgY20gfTsKKyAgICAgICAgICAgIG1Db25maWdNYXBwZXJzLmVtcGxhY2UoY20ubWVkaWFLZXkoKSwgZXFzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQucHVzaF9iYWNrKGNtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIHBhdGhzIGZvciBhIHNwZWNpZmljIGRvbWFpbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbnkgbWF4aW11bSBkb21haW4gbWFzay4gUmV0dXJuZWQgcGFyYW1ldGVycyBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgZG9tYWlucworICAgICAqICAgICAgICAgICAgaW4gdGhlIG1hc2suCisgICAgICogXHBhcmFtIGFsbCBtaW5pbXVtIGRvbWFpbiBtYXNrLiBSZXR1cm5lZCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2ggYWxsIG9mIHRoZSBkb21haW5zIGluIHRoZQorICAgICAqICAgICAgICAgICAgbWFzay4gVGhpcyBpcyByZXN0cmljdGVkIHRvIHRoZSBiaXRzIG9mIHRoZSBtYXhpbXVtIG1hc2suCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldFBhdGhzRm9yRG9tYWluKAorICAgICAgICAgICAgRG9tYWluIGFueSwgRG9tYWluIGFsbCA9IERvbWFpbjo6QUxMKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXM7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtQ29uZmlnTWFwcGVycykgeworICAgICAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogZWwuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImZpbHRlcmluZyAlcyAleCAleCAleCAleCIsIGNtLnBhdGgoKS5jX3N0cigpLCBjbS5kb21haW4oKSwgYW55LAorICAgICAgICAgICAgICAgICAgICAgICAgKGNtLmRvbWFpbigpICYgYW55KSwgKGNtLmRvbWFpbigpICYgYW55ICYgYWxsKSk7CisgICAgICAgICAgICAgICAgaWYgKChjbS5kb21haW4oKSAmIGFueSkgJiYgKChjbS5kb21haW4oKSAmIGFueSAmIGFsbCkgPT0gKGFueSAmIGFsbCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soY20ucGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIFNESyA8PT4gQ29kZWMgMi4wIG1hcHBpbmdzLgorICAgICAqCisgICAgICogVE9ETzogcmVwbGFjZSB0aGVzZSB3aXRoIGJldHRlciBtZXRob2RzIGFzIHRoaXMgZXhwb3NlcyB0aGUgaW5uZXIgc3RydWN0dXJlLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6bWFwPFNka0tleSwgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gZ2V0S2V5cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db25maWdNYXBwZXJzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxTZGtLZXksIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+IG1Db25maWdNYXBwZXJzOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBTdGFuZGFyZFBhcmFtczo6Tk9fTUFQUEVSUzsKKworCitDQ29kZWNDb25maWc6OkNDb2RlY0NvbmZpZygpCisgICAgOiBtSW5wdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKKyAgICAgIG1PdXRwdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKKyAgICAgIG1Vc2luZ1N1cmZhY2UoZmFsc2UpIHsgfQorCit2b2lkIENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCkgeworICAgIHR5cGVkZWYgRG9tYWluIEQ7CisgICAgbVN0YW5kYXJkUGFyYW1zID0gc3RkOjptYWtlX3NoYXJlZDxTdGFuZGFyZFBhcmFtcz4oKTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29uZmlnTWFwcGVyICYpPiBhZGQgPQorICAgICAgICBbcGFyYW1zID0gbVN0YW5kYXJkUGFyYW1zXShjb25zdCBDb25maWdNYXBwZXIgJmNtKSB7CisgICAgICAgICAgICBwYXJhbXMtPmFkZChjbSk7CisgICAgfTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29uZmlnTWFwcGVyICYpPiBkZXByZWNhdGVkID0gYWRkOworCisgICAgLy8gYWxsb3cgaW50MzIgb3IgZmxvYXQgU0RLIHZhbHVlcyBhbmQgcmVwcmVzZW50IHRoZW0gYXMgZmxvYXQKKyAgICBDb25maWdNYXBwZXI6Ok1hcHBlciBtYWtlRmxvYXQgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAvLyBjb252ZXJ0IGZyb20gaTMyIHRvIGZsb2F0CisgICAgICAgIGludDMyX3QgaTMyVmFsdWU7CisgICAgICAgIGZsb2F0IGZwVmFsdWU7CisgICAgICAgIGlmICh2LmdldCgmaTMyVmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGZsb2F0KWkzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKHYuZ2V0KCZmcFZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZwVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworCisgICAgQ29uZmlnTWFwcGVyOjpNYXBwZXIgbmVnYXRlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUlNRSwgICAgIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUsICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUICYgRDo6UkVBRCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01JTUUsICAgICBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSwgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6Ok9VVFBVVCkpOworICAgIC8vIHdlIGFsc28gbmVlZCB0byBwdXQgdGhlIGJpdHJhdGUgaW4gdGhlIG1heCBiaXRyYXRlIGZpZWxkCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0JJVF9SQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6UkVBRCAmIEQ6Ok9VVFBVVCkpOworICAgIGFkZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8gJiBEOjpQQVJBTSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0JJVFJBVEVfTU9ERSwgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQzJDb25maWc6OmJpdHJhdGVfbW9kZV90IG1vZGU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmbW9kZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZIGFuZCBuZXcgbW9kZXMKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfQklUUkFURV9NT0RFLCAiY29kZWQuYml0cmF0ZS1tb2RlIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9GUkFNRV9SQVRFLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTykKKyAgICAgICAgLndpdGhNYXBwZXJzKG1ha2VGbG9hdCwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIC8vIHJlYWQgYmFjayBhbHdheXMgYXMgaW50CisgICAgICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQzMl90KXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0lOUFVUX1NJWkUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU5QVVQpKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX01BWF9JTlBVVF9TSVpFLCAiY29kZWQubWF4LWZyYW1lLXNpemUiLCAidmFsdWUiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6SU5QVVQpKTsKKworICAgIC8vIFJvdGF0aW9uCisgICAgLy8gTm90ZTogU0RLIHJvdGF0aW9uIGlzIGNsb2NrLXdpc2UsIHdoaWxlIEMyIHJvdGF0aW9uIGlzIGNvdW50ZXItY2xvY2std2lzZQorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1JPVEFUSU9OLCBDMl9QQVJBTUtFWV9WVUlfUk9UQVRJT04sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhuZWdhdGUsIG5lZ2F0ZSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1JPVEFUSU9OLCBDMl9QQVJBTUtFWV9ST1RBVElPTiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpSQVcpCisgICAgICAgIC53aXRoTWFwcGVycyhuZWdhdGUsIG5lZ2F0ZSkpOworCisgICAgLy8gYW5kcm9pZCAndmlkZW8tc2NhbGluZycKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl92aWRlby1zY2FsaW5nIiwgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6REVDT0RFUiAmIEQ6OlJBVykpOworCisgICAgLy8gQ29sb3IgQXNwZWN0cworICAgIC8vCisgICAgLy8gY29uZmlndXJlIGRlZmF1bHQgZm9yIGRlY29kZXJzCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOworCisgICAgLy8gcmVhZCBiYWNrIGZpbmFsIGZvciBkZWNvZGVyIG91dHB1dCAoYWxzbywgY29uZmlndXJlIGZpbmFsIGFzcGVjdHMgYXMgd2VsbC4gVGhpcyBzaG91bGQgYmUKKyAgICAvLyBvdmVyd3JpdHRlbiBiYXNlZCBvbiBjb2RlZC9kZWZhdWx0IHZhbHVlcyBpZiBjb21wb25lbnQgc3VwcG9ydHMgY29sb3IgYXNwZWN0cywgYnV0IGlzIHVzZWQKKyAgICAvLyBhcyBmaW5hbCB2YWx1ZXMgaWYgY29tcG9uZW50IGRvZXMgbm90IHN1cHBvcnQgYXNwZWN0cyBhdCBhbGwpCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpKTsKKworICAgIC8vIGNvbmZpZ3VyZSBzb3VyY2UgYXNwZWN0cyBmb3IgZW5jb2RlcnMgYW5kIHJlYWQgdGhlbSBiYWNrIG9uIHRoZSBjb2RlZCghKSBwb3J0LgorICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIG11eGluZyB0aGUgZGVzaXJlZCBhc3BlY3RzIGludG8gdGhlIGNvbnRhaW5lci4KKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKSk7CisKKyAgICAvLyByZWFkIGJhY2sgY29kZWQgYXNwZWN0cyBmb3IgZW5jb2RlcnMgKG9uIHRoZSByYXcgcG9ydCksIGJ1dCBhbHNvIGNvbmZpZ3VyZQorICAgIC8vIGRlc2lyZWQgYXNwZWN0cyBoZXJlLgorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykpOworCisgICAgLy8gRGF0YXNwYWNlCisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgQzJfUEFSQU1LRVlfREFUQV9TUEFDRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisKKyAgICAvLyBIRFIKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYucmVkLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcucmVkLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYucmVkLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcucmVkLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuZ3JlZW4ueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ncmVlbi54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmdyZWVuLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuZ3JlZW4ueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ibHVlLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuYmx1ZS54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmJsdWUueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ibHVlLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYud2hpdGUueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy53aGl0ZS54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LndoaXRlLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcud2hpdGUueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLm1heC1sdW1pbmFuY2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5taW4tbHVtaW5hbmNlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3RhODYxLm1heC1jbGwiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXgtY2xsIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3RhODYxLm1heC1mYWxsIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWF4LWZhbGwiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoc3RkOjpzdHJpbmcoS0VZX0ZFQVRVUkVfKSArIEZFQVRVUkVfU2VjdXJlUGxheWJhY2ssCisgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9TRUNVUkVfTU9ERSwgInZhbHVlIikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigicHJlcGVuZC1zcHMtcHBzLXRvLWlkci1mcmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUFJFUEVORF9IRUFERVJfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX1RPX0FMTF9TWU5DKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX1RPX05PTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKCJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGluZy5hZGQtY3NkLXRvLXN5bmMtZnJhbWVzIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTykpOworICAgIC8vIGNvbnZlcnQgdG8gdGltZXN0YW1wIGJhc2UKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9JX0ZSQU1FX0lOVEVSVkFMLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMLCAidmFsdWUiKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgLy8gY29udmVydCBmcm9tIGkzMiB0byBmbG9hdAorICAgICAgICAgICAgaW50MzJfdCBpMzJWYWx1ZTsKKyAgICAgICAgICAgIGZsb2F0IGZwVmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJmkzMlZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnQ2NF90KDEwMDAwMDApICogaTMyVmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYuZ2V0KCZmcFZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnQ2NF90KGMyX21pbigxMDAwMDAwICogZnBWYWx1ZSArIDAuNSwgKGRvdWJsZSlJTlQ2NF9NQVgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIHByb3BlciBjb2RpbmcuZ29wIChhZGQgc3VwcG9ydCBmb3IgY2FsY3VsYXRpbmcgZ29wKQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKCJpLWZyYW1lLXBlcmlvZCIsICJjb2RpbmcuZ29wIiwgImludHJhLXBlcmlvZCIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCwgQzJfUEFSQU1LRVlfSU5UUkFfUkVGUkVTSCwgInBlcmlvZCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6RU5DT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXJzKG1ha2VGbG9hdCwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIC8vIHJlYWQgYmFjayBhbHdheXMgYXMgaW50CisgICAgICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQzMl90KXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1FVQUxJVFksIEMyX1BBUkFNS0VZX1FVQUxJVFksICJ2YWx1ZSIpKTsKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICJjb2RpbmcucmVxdWVzdC1zeW5jIiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlKSAtPiBDMlZhbHVlIHsgcmV0dXJuIHVpbnQzMl90KDEpOyB9KSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlKSAtPiBDMlZhbHVlIHsgcmV0dXJuIHVpbnQzMl90KDEpOyB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9PUEVSQVRJTkdfUkFURSwgICBDMl9QQVJBTUtFWV9PUEVSQVRJTkdfUkFURSwgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNIHwgRDo6Q09ORklHKSAvLyB3cml0ZS1vbmx5CisgICAgICAgIC53aXRoTWFwcGVyKG1ha2VGbG9hdCkpOworICAgIC8vIEMyIHByaW9yaXRpZXMgYXJlIGludmVydGVkCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJJT1JJVFksICAgICAgICAgQzJfUEFSQU1LRVlfUFJJT1JJVFksICAgICAgICAgICAidmFsdWUiKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX09QRVJBVElOR19SQVRFLCAgICJjdHJsLm9wZXJhdGluZy1yYXRlIiwgICAgICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAud2l0aE1hcHBlcihtYWtlRmxvYXQpKTsKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfUFJJT1JJVFksICAgICAgICAgImN0cmwucHJpb3JpdHkiLCAgICAgICAgICAgInZhbHVlIikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfV0lEVEgsICAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFLCAgICAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSEVJR0hULCAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFLCAgICAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC1sZWZ0IiwgICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAibGVmdCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLXRvcCIsICAgICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJ0b3AiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC13aWR0aCIsICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC1oZWlnaHQiLCAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX1dJRFRILCAgICAgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSwgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0hFSUdIVCwgICAgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSwgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigiY3NkLTAiLCAgICAgICAgICAgQzJfUEFSQU1LRVlfSU5JVF9EQVRBLCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GTywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpQQVJBTSAmIEQ6OklOUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6T1VUUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgIiIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTyAmIEQ6Ok9VVFBVVCkpOworCisgICAgLy8gUGl4ZWwgRm9ybWF0ICh1c2UgbG9jYWwga2V5IGZvciBhY3R1YWwgcGl4ZWwgZm9ybWF0IGFzIHdlIGRvbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAvLyBTREsgbGF5b3V0cyBmb3IgZmxleGlibGUgZm9ybWF0IGFuZCB3ZSBuZWVkIHRoZSBhY3R1YWwgU0RLIGNvbG9yIGZvcm1hdCBpbiB0aGUgbWVkaWEgZm9ybWF0KQorICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0U3VyZmFjZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdClIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KUhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc29tZSBzb3J0IG9mIHBhc3N0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ09MT1JfRm9ybWF0U3VyZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzb21lIHNvcnQgb2YgcGFzc3Rocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQsICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7IC8vIHJlYWQgYmFjayB0byBib3RoIGZvcm1hdHMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9DT0RFRF9DSEFOTkVMX0NPVU5ULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9TQU1QTEVfUkFURSwgICBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSwgICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7IC8vIHJlYWQgYmFjayB0byBib3RoIHBvcnQgZm9ybWF0cworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1NBTVBMRV9SQVRFLCAgIEMyX1BBUkFNS0VZX0NPREVEX1NBTVBMRV9SQVRFLCAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUENNX0VOQ09ESU5HLCAgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HLCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHRvOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdmFsdWU7CisgICAgICAgICAgICBpbnQzMl90IHRvOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZSh2YWx1ZSk+Ojp0eXBlOworICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSopJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSVNfQURUUywgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lORywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlID09IEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKG1Db2RpbmdNZWRpYVR5cGUpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJPRklMRSwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCwgInByb2ZpbGUiKQorICAgICAgICAubGltaXRUbyhEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cHJvZmlsZV90IGMyID0gUFJPRklMRV9VTlVTRUQ7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoJnNkaykgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHNkaywgJmMyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBQUk9GSUxFX1VOVVNFRDsKKyAgICAgICAgfSwgW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgYzI7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUoYzIpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoKEMyVmFsdWVUeXBlKikmYzIpICYmIG1hcHBlci0+bWFwUHJvZmlsZShjMiwgJnNkaykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTEVWRUwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwsICJsZXZlbCIpCisgICAgICAgIC5saW1pdFRvKEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMoW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyID0gTEVWRUxfVU5VU0VEOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KCZzZGspICYmIG1hcHBlci0+bWFwTGV2ZWwoc2RrLCAmYzIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIExFVkVMX1VOVVNFRDsKKyAgICAgICAgfSwgW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKGMyKT46OnR5cGU7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyKSAmJiBtYXBwZXItPm1hcExldmVsKGMyLCAmc2RrKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGRCRlMgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KC0wLjI1ICogYzJfbWluKHZhbHVlLCAxMjcpKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byAwLTEgKCUpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0NVVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGMyX21pbih2YWx1ZSwgMTI3KSAvIDEyNy4pOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIDAtMSAoJSkgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGMyX21pbih2YWx1ZSwgMTI3KSAvIDEyNy4pOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGNvbXByZXNzaW9uIHR5cGUgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlksIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IDEgPyBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZIDogQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVDsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBkQkZTIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTCwgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoLTAuMjUgKiBjMl9taW4odmFsdWUsIDEyNykpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGVmZmVjdCB0eXBlICh0aGVzZSBtYXAgdG8gU0RLIHZhbHVlcykgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19FRkZFQ1RfVFlQRSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgLTEgfHwgdmFsdWUgPiA4KSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCk7CisgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHZhbHVlIGlzIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gOCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfU0JSX01PREUsIEMyX1BBUkFNS0VZX0FBQ19TQlJfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpFTkNPREVSICYgRDo6Q09ORklHKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfQVVUTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9PRkY7CisgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfU0lOR0xFX1JBVEU7CisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfRFVBTF9SQVRFOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9BVVRPICsgMTsgLy8gaW52YWxpZCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9RVUFMSVRZLCBDMl9QQVJBTUtFWV9RVUFMSVRZLCAidmFsdWUiKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpFTkNPREVSKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29tcGxleGl0eSIsIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFksICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0dSSURfQ09MVU1OUywgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJjb2x1bW5zIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9HUklEX1JPV1MsIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VULCAicm93cyIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfVElMRV9XSURUSCwgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJ0aWxlLndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9USUxFX0hFSUdIVCwgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJ0aWxlLmhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9MQVRFTkNZLCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWV9SRVFVRVNULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkVOQ09ERVIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENILCBDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsICJ2YWx1ZSIpKTsKKworICAgIC8qIHN0aWxsIHRvIGRvCisgICAgY29uc3RleHByIGNoYXIgS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QW10gPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKKworICAgICAgIG5vdCB5ZXQgdXNlZCBieSBNZWRpYUNvZGVjLCBidXQgZGVmaW5lZCBhcyBNZWRpYUZvcm1hdAorICAgIEtFWV9BVURJT19TRVNTSU9OX0lEIC8vIHdlIHVzZSAiYXVkaW8taHctc3luYyIKKyAgICBLRVlfT1VUUFVUX1JFT1JERVJfREVQVEgKKyAgICAqLworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW4oQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUik7CisgICAgQzJDb21wb25lbnRLaW5kU2V0dGluZyBraW5kKEMyQ29tcG9uZW50OjpLSU5EX09USEVSKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoeyAmZG9tYWluLCAma2luZCB9LCB7fSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiUXVlcnkgZG9tYWluICYga2luZCBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhjMmVycikpOworICAgICAgICAvLyBURU1QOiBkZXRlcm1pbmUga2luZCBmcm9tIGNvbXBvbmVudCBuYW1lCisgICAgICAgIGlmIChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX09USEVSKSB7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAga2luZC52YWx1ZSA9IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIGtpbmQudmFsdWUgPSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVEVNUDogZGV0ZXJtaW5lIGRvbWFpbiBmcm9tIG1lZGlhIHR5cGUgKHBvcnQgKHByZWZlcnJlZCkgb3Igc3RyZWFtICMwKQorICAgICAgICBpZiAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVIpIHsKKyAgICAgICAgICAgIEFTdHJpbmcgbWVkaWFUeXBlID0gUXVlcnlNZWRpYVR5cGUodHJ1ZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbURvbWFpbiA9IChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTyA/IERvbWFpbjo6SVNfVklERU8gOgorICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UgPyBEb21haW46OklTX0lNQUdFIDoKKyAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPID8gRG9tYWluOjpJU19BVURJTyA6IERvbWFpbjo6T1RIRVJfRE9NQUlOKQorICAgICAgICAgICAgfCAoa2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSID8gRG9tYWluOjpJU19ERUNPREVSIDoKKyAgICAgICAgICAgICAgIGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA/IERvbWFpbjo6SVNfRU5DT0RFUiA6IERvbWFpbjo6T1RIRVJfS0lORCk7CisKKyAgICBtSW5wdXREb21haW4gPSBEb21haW4oKChtRG9tYWluICYgSVNfREVDT0RFUikgPyBJU19DT0RFRCA6IElTX1JBVykgfCBJU19JTlBVVCk7CisgICAgbU91dHB1dERvbWFpbiA9IERvbWFpbigoKG1Eb21haW4gJiBJU19FTkNPREVSKSA/IElTX0NPREVEIDogSVNfUkFXKSB8IElTX09VVFBVVCk7CisKKyAgICBBTE9HVigiZG9tYWluIGlzICUjeCAoJXUgJXUpIiwgbURvbWFpbiwgZG9tYWluLnZhbHVlLCBraW5kLnZhbHVlKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBwYXJhbUluZGljZXM7CisgICAgc3dpdGNoIChraW5kLnZhbHVlKSB7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOgorICAgICAgICBtQ29kaW5nTWVkaWFUeXBlID0gUXVlcnlNZWRpYVR5cGUodHJ1ZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KS5jX3N0cigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZShmYWxzZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KS5jX3N0cigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBtQ29kaW5nTWVkaWFUeXBlID0gIiI7CisgICAgfQorCisgICAgYzJlcnIgPSBjb21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZtUGFyYW1EZXNjcyk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBzdXBwb3J0ZWQgcGFyYW1zIGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHZhbHVlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgbVBhcmFtRGVzY3Muc2l6ZSgpLCBhc1N0cmluZyhjMmVycikpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogbVBhcmFtRGVzY3MpIHsKKyAgICAgICAgbVN1cHBvcnRlZEluZGljZXMuZW1wbGFjZShkZXNjLT5pbmRleCgpKTsKKyAgICB9CisKKyAgICBtUmVmbGVjdG9yID0gY2xpZW50LT5nZXRQYXJhbVJlZmxlY3RvcigpOworICAgIGlmIChtUmVmbGVjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgcGFyYW0gcmVmbGVjdG9yIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIGVudW1lcmF0ZSBhbGwgZmllbGRzCisgICAgbVBhcmFtVXBkYXRlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVmbGVjdGVkUGFyYW1VcGRhdGVyPigpOworICAgIG1QYXJhbVVwZGF0ZXItPmNsZWFyKCk7CisgICAgbVBhcmFtVXBkYXRlci0+c3VwcG9ydFdob2xlUGFyYW0oCisgICAgICAgICAgICBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpDT1JFX0lOREVYKTsKKyAgICBtUGFyYW1VcGRhdGVyLT5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbVBhcmFtRGVzY3MpOworCisgICAgLy8gVEVNUDogYWRkIHNvbWUgc3RhbmRhcmQgZmllbGRzIGV2ZW4gaWYgbm90IHJlZmxlY3RlZAorICAgIGlmIChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIpIHsKKyAgICAgICAgbVBhcmFtVXBkYXRlci0+YWRkU3RhbmRhcmRQYXJhbTxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9JTklUX0RBVEEpOworICAgIH0KKyAgICBpZiAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UgfHwgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fVklERU8pIHsKKyAgICAgICAgaWYgKGtpbmQudmFsdWUgIT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUikgeworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbUNyb3BSZWN0SW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9DUk9QX1JFQ1QpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm86Om91dHB1dCgwdSwgMXUsIDF1KSwKKyAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUElYRUxfQVNQRUNUX1JBVElPKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQoMHUsIDApLCBDMl9QQVJBTUtFWV9ST1RBVElPTik7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgwdSksIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfREFUQV9TUEFDRSk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8pOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dCgwdSwgVklERU9fU0NBTElOR19NT0RFX1NDQUxFX1RPX0ZJVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoMHUpLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpOworCisgICAgLy8gc3Vic2NyaWJlIHRvIGFsbCBzdXBwb3J0ZWQgc3RhbmRhcmQgKGV4cG9zZWQpIHBhcmFtcworICAgIC8vIFRPRE86IGxpbWl0IHRoaXMgdG8gcGFyYW1zIHRoYXQgYXJlIGFjdHVhbGx5IGluIHRoZSBkb21haW4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZm9ybWF0S2V5cyA9IG1TdGFuZGFyZFBhcmFtcy0+Z2V0UGF0aHNGb3JEb21haW4oRG9tYWluKDEgPDwgMzApKTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbUluZGljZXNGb3JLZXlzKGZvcm1hdEtleXMsICZpbmRpY2VzKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSk7CisKKyAgICAvLyBhbHNvIHN1YnNjcmliZSB0byBzb21lIG5vbi1TREsgc3RhbmRhcmQgcGFyYW1ldGVycworICAgIC8vIGZvciBudW1iZXIgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlcnMKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZzo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAvLyBmb3Igb3V0cHV0IGJ1ZmZlciBhcnJheSBhbGxvY2F0aW9uCisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAvLyBpbml0IGRhdGEgKENTRCkKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcpIHsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSk7CisgICAgLy8gVE9ETzogZW5hYmxlIHRoaXMgd2hlbiBjb21wb25lbnRzIG5vIGxvbmdlciBjcmFzaCBvbiB0aGlzIGNvbmZpZworICAgIGlmIChtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpICE9IG1TdWJzY3JpYmVkSW5kaWNlc1NpemUgJiYgZmFsc2UpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGluZGljZXM7CisgICAgICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBtU3Vic2NyaWJlZEluZGljZXMpIHsKKyAgICAgICAgICAgIGluZGljZXMucHVzaF9iYWNrKGl4KTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPiBzdWJzY3JpYmVUdW5pbmcgPQorICAgICAgICAgICAgQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOjpBbGxvY1VuaXF1ZShpbmRpY2VzKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHJlc3VsdHM7CisgICAgICAgIGMyX3N0YXR1c190IGMyRXJyID0gY29tcG9uZW50LT5jb25maWcoeyBzdWJzY3JpYmVUdW5pbmcuZ2V0KCkgfSwgYmxvY2tpbmcsICZyZXN1bHRzKTsKKyAgICAgICAgaWYgKGMyRXJyICE9IEMyX09LICYmIGMyRXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBzdWJzY3JpYmUgdG8gcGFyYW1ldGVycyA9PiAlcyIsIGFzU3RyaW5nKGMyRXJyKSk7CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJTdWJzY3JpYmVkIHRvICV6dSBwYXJhbXMiLCBtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpKTsKKyAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzU2l6ZSA9IG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpxdWVyeUNvbmZpZ3VyYXRpb24oCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIC8vIHF1ZXJ5IGFsbCBzdWJzY3JpYmVkIHBhcmFtZXRlcnMKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcyhtU3Vic2NyaWJlZEluZGljZXMuYmVnaW4oKSwgbVN1YnNjcmliZWRJbmRpY2VzLmVuZCgpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJFcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBDMl9NQVlfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJFcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0koInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHZhbHVlcyAoJXMpIiwgcXVlcmllZC5zaXplKCksIGFzU3RyaW5nKGMyRXJyKSk7CisgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgfQorCisgICAgdXBkYXRlQ29uZmlndXJhdGlvbihxdWVyaWVkLCBBTEwpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDQ29kZWNDb25maWc6OnVwZGF0ZUNvbmZpZ3VyYXRpb24oCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwgRG9tYWluIGRvbWFpbikgeworICAgIEFMT0dWKCJ1cGRhdGluZyBjb25maWd1cmF0aW9uIHdpdGggJXp1IHBhcmFtcyIsIGNvbmZpZ1VwZGF0ZS5zaXplKCkpOworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwIDogY29uZmlnVXBkYXRlKSB7CisgICAgICAgIGlmIChwICYmICpwKSB7CisgICAgICAgICAgICBhdXRvIGluc2VydGlvbiA9IG1DdXJyZW50Q29uZmlnLmVtcGxhY2UocC0+aW5kZXgoKSwgbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uLnNlY29uZCB8fCAqaW5zZXJ0aW9uLmZpcnN0LT5zZWNvbmQgIT0gKnApIHsKKyAgICAgICAgICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQocC0+aW5kZXgoKSkgfHwgbUxvY2FsUGFyYW1zLmNvdW50KHAtPmluZGV4KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdHJhY2sgY2hhbmdlcyBpbiBzdXBwb3J0ZWQgKHJlZmxlY3RlZCBvciBsb2NhbCkgaW5kaWNlcworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYW4gdW5saXN0ZWQgY29uZmlnIHdhcyAlczogJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb24uc2Vjb25kID8gImFkZGVkIiA6ICJ1cGRhdGVkIiwgcC0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zZXJ0aW9uLmZpcnN0LT5zZWNvbmQgPSBzdGQ6Om1vdmUocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigidXBkYXRlZCBjb25maWd1cmF0aW9uIGhhcyAlenUgcGFyYW1zICglcykiLCBtQ3VycmVudENvbmZpZy5zaXplKCksCisgICAgICAgICAgICBjaGFuZ2VkID8gIkNIQU5HRUQiIDogIm5vIGNoYW5nZSIpOworICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgIHJldHVybiB1cGRhdGVGb3JtYXRzKGRvbWFpbik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDQ29kZWNDb25maWc6OnVwZGF0ZUZvcm1hdHMoRG9tYWluIGRvbWFpbikgeworICAgIC8vIGdldCBhZGRyZXNzZXMgb2YgcGFyYW1zIGluIHRoZSBjdXJyZW50IGNvbmZpZworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBtQ3VycmVudENvbmZpZykgeworICAgICAgICBwYXJhbVBvaW50ZXJzLnB1c2hfYmFjayhpdC5zZWNvbmQuZ2V0KCkpOworICAgIH0KKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCByZWZsZWN0ZWQgPSBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbXMocGFyYW1Qb2ludGVycyk7CisgICAgQUxPR0QoImMyIGNvbmZpZyBpcyAlcyIsIHJlZmxlY3RlZC5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGRvbWFpbiAmIG1JbnB1dERvbWFpbikgeworICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gbUlucHV0Rm9ybWF0OworICAgICAgICBtSW5wdXRGb3JtYXQgPSBtSW5wdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIGZvcm1hdCBjaGFuZ2VkCisgICAgICAgIG1JbnB1dEZvcm1hdC0+ZXh0ZW5kKGdldFNka0Zvcm1hdEZvckRvbWFpbihyZWZsZWN0ZWQsIG1JbnB1dERvbWFpbikpOworICAgICAgICBpZiAobUlucHV0Rm9ybWF0LT5jb3VudEVudHJpZXMoKSAhPSBvbGRGb3JtYXQtPmNvdW50RW50cmllcygpCisgICAgICAgICAgICAgICAgfHwgbUlucHV0Rm9ybWF0LT5jaGFuZ2VzRnJvbShvbGRGb3JtYXQpLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlucHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZG9tYWluICYgbU91dHB1dERvbWFpbikgeworICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gbU91dHB1dEZvcm1hdDsKKyAgICAgICAgbU91dHB1dEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIG91dHB1dCBmb3JtYXQgY2hhbmdlZAorICAgICAgICBtT3V0cHV0Rm9ybWF0LT5leHRlbmQoZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKHJlZmxlY3RlZCwgbU91dHB1dERvbWFpbikpOworICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+Y291bnRFbnRyaWVzKCkgIT0gb2xkRm9ybWF0LT5jb3VudEVudHJpZXMoKQorICAgICAgICAgICAgICAgIHx8IG1PdXRwdXRGb3JtYXQtPmNoYW5nZXNGcm9tKG9sZEZvcm1hdCktPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVl9JRihjaGFuZ2VkLCAiZm9ybWF0KHMpIGNoYW5nZWQiKTsKKyAgICByZXR1cm4gY2hhbmdlZDsKK30KKworc3A8QU1lc3NhZ2U+IENDb2RlY0NvbmZpZzo6Z2V0U2RrRm9ybWF0Rm9yRG9tYWluKAorICAgICAgICBjb25zdCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgJnJlZmxlY3RlZCwgRG9tYWluIHBvcnREb21haW4pIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtU3RhbmRhcmRQYXJhbXMtPmdldEtleXMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBlbC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBwb3J0RG9tYWluKSA9PSAwIC8vIGlucHV0LW91dHB1dC1jb2RlZC1yYXcKKyAgICAgICAgICAgICAgICB8fCAoY20uZG9tYWluKCkgJiBtRG9tYWluKSAhPSBtRG9tYWluIC8vIGNvbXBvbmVudCBkb21haW4gKyBraW5kICh0aGVzZSBtdXN0IG1hdGNoKQorICAgICAgICAgICAgICAgIHx8IChjbS5kb21haW4oKSAmIElTX1JFQUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSByZWZsZWN0ZWQuZmluZChjbS5wYXRoKCkpOworICAgICAgICAgICAgaWYgKGl0ID09IHJlZmxlY3RlZC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgICAgICAgICBBU3RyaW5nIHN0clZhbHVlOworICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW07CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5maW5kKCZjMlZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0gPSBjbS5tYXBUb01lc3NhZ2UoYzJWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zZWNvbmQuZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXQoYnVmVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2Vjb25kLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHN0clZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGNtLnBhdGgoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0SXRlbShlbC5maXJzdC5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBmcm9tIENvZGVjIDIuMCByZWN0IHRvIE1lZGlhRm9ybWF0IHJlY3QgYW5kIGFkZCBjcm9wIHJlY3QgaWYgbm90IHByZXNlbnQKKyAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY3JvcC1sZWZ0IiwgJmxlZnQpICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLXdpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLXRvcCIsICZ0b3ApICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLWhlaWdodCIsICZoZWlnaHQpCisgICAgICAgICAgICAgICAgJiYgbGVmdCA+PSAwICYmIHdpZHRoID49MCAmJiB3aWR0aCA8PSBJTlQzMl9NQVggLSBsZWZ0CisgICAgICAgICAgICAgICAgJiYgdG9wID49IDAgJiYgaGVpZ2h0ID49MCAmJiBoZWlnaHQgPD0gSU5UMzJfTUFYIC0gdG9wKSB7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtbGVmdCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC10b3AiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3Atd2lkdGgiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtaGVpZ2h0IikpOworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgbGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGggLSAxLCB0b3AgKyBoZWlnaHQgLSAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCB0ZW1wb3JhbCBsYXllcmluZyB0byBzY2hlbWEKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCAmdG1wKSAmJiB0bXAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nICpsYXllcmluZyA9CisgICAgICAgICAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpGcm9tKEMyUGFyYW06OkZyb20odG1wLT5kYXRhKCksIHRtcC0+c2l6ZSgpKSk7CisgICAgICAgICAgICBpZiAobGF5ZXJpbmcgJiYgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYkxheWVyQ291bnQgPCBsYXllcmluZy0+bS5sYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB3ZWJydGMgY29tcGF0aWJsZQorICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kU3RyaW5nKEtFWV9NSU1FLCAmbWltZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC40ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMV0gPT0gLjZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC4yNWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzFdID09IC40ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMl0gPT0gLjZmKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJydGMudnA4LiV1LWxheWVyIiwgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJpbmctPm0uYkxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmdlbmVyaWMuJXUrJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmxheWVyQ291bnQgLSBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJpbmctPm0uYkxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmdlbmVyaWMuJXUiLCBsYXllcmluZy0+bS5sYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgY29sb3IgaW5mbworICAgICAgICBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXM7CisgICAgICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1wcmltYXJpZXMiLCAoaW50MzJfdCopJnByaW1hcmllcykKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiY29sb3ItbWF0cml4IiwgKGludDMyX3QqKSZtYXRyaXgpKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkOworCisgICAgICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChwcmltYXJpZXMsIG1hdHJpeCwgJnN0YW5kYXJkKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY29sb3ItcHJpbWFyaWVzIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjb2xvci1tYXRyaXgiKSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkYXRhc3BhY2UgZm9yIHJhdyBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IHNwZWNpZmllZCBieSBjb21wb25lbnQsIG9yIGlmCisgICAgICAgIC8vIHVzaW5nIHN1cmZhY2Ugd2l0aCB1bnNwZWNpZmllZCBhc3BlY3RzIChhcyB0aG9zZSBtdXN0IGJlIGRlZmF1bHRlZCB3aGljaCBtYXkgY2hhbmdlCisgICAgICAgIC8vIHRoZSBkYXRhc3BhY2UpCisgICAgICAgIGlmICgocG9ydERvbWFpbiAmIElTX1JBVykgJiYgKG1Eb21haW4gJiAoSVNfSU1BR0UgfCBJU19WSURFTykpKSB7CisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhc3BhY2U7CisgICAgICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0cyA9IHsKKyAgICAgICAgICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQsIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkCisgICAgICAgICAgICB9OworICAgICAgICAgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChtc2csIGFzcGVjdHMpOworICAgICAgICAgICAgQ29sb3JBc3BlY3RzIG9yaWdBc3BlY3RzID0gYXNwZWN0czsKKyAgICAgICAgICAgIGlmIChtVXNpbmdTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IGltYWdlIHNpemUgKGRlZmF1bHQgdG8gSEQpCisgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9IDEyODA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQgPSA3MjA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZFJlY3QoImNyb3AiLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJpZ2h0IC0gbGVmdCArIDE7CisgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGJvdHRvbSAtIHRvcCArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kSW50MzIoS0VZX1dJRFRILCAmd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRJbnQzMihLRVlfSEVJR0hULCAmaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0RGVmYXVsdENvZGVjQ29sb3JBc3BlY3RzSWZOZWVkZWQoYXNwZWN0cywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0Q29sb3JBc3BlY3RzSW50b0Zvcm1hdChhc3BlY3RzLCBtc2cpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCopJmRhdGFzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tUmFuZ2UgIT0gb3JpZ0FzcGVjdHMubVJhbmdlCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVByaW1hcmllcyAhPSBvcmlnQXNwZWN0cy5tUHJpbWFyaWVzCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVRyYW5zZmVyICE9IG9yaWdBc3BlY3RzLm1UcmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgIT0gb3JpZ0FzcGVjdHMubU1hdHJpeENvZWZmcykgeworICAgICAgICAgICAgICAgIGRhdGFzcGFjZSA9IENvbG9yVXRpbHM6OmdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCB0cnVlIC8qIG1heUV4cGFuZCAqLyk7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgZGF0YXNwYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEhEUiBzdGF0aWMgaW5mbworCisgICAgICAgIEMySGRyU3RhdGljTWV0YWRhdGFTdHJ1Y3QgaGRyOworICAgICAgICBpZiAobXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5yZWQueCIsICZoZHIubWFzdGVyaW5nLnJlZC54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYucmVkLnkiLCAmaGRyLm1hc3RlcmluZy5yZWQueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmdyZWVuLngiLCAmaGRyLm1hc3RlcmluZy5ncmVlbi54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueSIsICZoZHIubWFzdGVyaW5nLmdyZWVuLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ibHVlLngiLCAmaGRyLm1hc3RlcmluZy5ibHVlLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ibHVlLnkiLCAmaGRyLm1hc3RlcmluZy5ibHVlLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni53aGl0ZS54IiwgJmhkci5tYXN0ZXJpbmcud2hpdGUueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LndoaXRlLnkiLCAmaGRyLm1hc3RlcmluZy53aGl0ZS55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsICZoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCAmaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoImN0YTg2MS5tYXgtY2xsIiwgJmhkci5tYXhDbGwpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoImN0YTg2MS5tYXgtZmFsbCIsICZoZHIubWF4RmFsbCkpIHsKKyAgICAgICAgICAgIGlmIChoZHIubWFzdGVyaW5nLnJlZC54ID49IDAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnkgPj0gMCAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnggPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnkgPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueCA+PSAwICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS55ID49IDAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS54ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS55ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPj0gMCAgJiYgaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPD0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgPj0gMCAgJiYgaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgPD0gNi41NTM1CisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhDbGwgPj0gMCAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhDbGwgPD0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heEZhbGwgPj0gMCAgICAgICAgICAgICAgICAgJiYgaGRyLm1heEZhbGwgPD0gNjU1MzUpIHsKKyAgICAgICAgICAgICAgICBIRFJTdGF0aWNJbmZvIG1ldGE7CisgICAgICAgICAgICAgICAgbWV0YS5tSUQgPSBtZXRhLmtUeXBlMTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tUi54ID0gaGRyLm1hc3RlcmluZy5yZWQueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVIueSA9IGhkci5tYXN0ZXJpbmcucmVkLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1HLnggPSBoZHIubWFzdGVyaW5nLmdyZWVuLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1HLnkgPSBoZHIubWFzdGVyaW5nLmdyZWVuLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1CLnggPSBoZHIubWFzdGVyaW5nLmJsdWUueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUIueSA9IGhkci5tYXN0ZXJpbmcuYmx1ZS55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tVy54ID0gaGRyLm1hc3RlcmluZy53aGl0ZS54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tVy55ID0gaGRyLm1hc3RlcmluZy53aGl0ZS55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSA9IGhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgLyAwLjAwMDEgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0gaGRyLm1heENsbCArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IGhkci5tYXhGYWxsICsgMC41OworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmdyZWVuLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ibHVlLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuYmx1ZS55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYud2hpdGUueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWNsbCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtZmFsbCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJm1ldGEsIHNpemVvZihtZXRhKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgaW52YWxpZCBIRFIgc3RhdGljIG1ldGFkYXRhICVzIiwgbXNnLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJjb252ZXJ0ZWQgdG8gU0RLIHZhbHVlcyBhcyAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbXNnOworfQorCisvLy8gY29udmVydHMgYW4gQU1lc3NhZ2UgdmFsdWUgdG8gYSBQYXJhbVVwZGF0ZXIgdmFsdWUKK3N0YXRpYyB2b2lkIGNvbnZlcnQoY29uc3QgQU1lc3NhZ2U6Okl0ZW1EYXRhICZmcm9tLCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlICp0bykgeworICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgIGRvdWJsZSBkb3VibGVWYWx1ZTsKKworICAgIGlmIChmcm9tLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoaW50MzJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoaW50NjRWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICB0by0+c2V0KGJ1ZlZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoc3RyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZmbG9hdFZhbHVlKSkgeworICAgICAgICB0by0+c2V0KEMyVmFsdWUoZmxvYXRWYWx1ZSkpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgLy8gY29udmVydCBkb3VibGUgdG8gZmxvYXQKKyAgICAgICAgdG8tPnNldChDMlZhbHVlKChmbG9hdClkb3VibGVWYWx1ZSkpOworICAgIH0KKyAgICAvLyBpZ25vcmUgYWxsIG90aGVyIEFNZXNzYWdlIHR5cGVzCit9CisKKy8vLyByZWxheGVzIENvZGVjIDIuMCBzcGVjaWZpYyB2YWx1ZSB0eXBlcyB0byBTREsgdHlwZXMgKG1haW5seSByZW1vdmVzIHNpZ25lZG5lc3MgYW5kIGNvdW50ZXJuZXNzCisvLy8gZnJvbSAzMi82NC1iaXQgdmFsdWVzLikKK3N0YXRpYyB2b2lkIHJlbGF4VmFsdWVzKFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgJml0ZW0pIHsKKyAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAodm9pZClpdGVtLmZpbmQoJmMyVmFsdWUpOworICAgIGlmIChjMlZhbHVlLmdldCgmaW50MzJWYWx1ZSkgfHwgYzJWYWx1ZS5nZXQoKHVpbnQzMl90KikmaW50MzJWYWx1ZSkKKyAgICAgICAgICAgIHx8IGMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJmludDMyVmFsdWUpKSB7CisgICAgICAgIGl0ZW0uc2V0KGludDMyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpCisgICAgICAgICAgICB8fCBjMlZhbHVlLmdldCgodWludDY0X3QqKSZpbnQ2NFZhbHVlKQorICAgICAgICAgICAgfHwgYzJWYWx1ZS5nZXQoKGMyX2NudHI2NF90KikmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgaXRlbS5zZXQoaW50NjRWYWx1ZSk7CisgICAgfQorfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgQ0NvZGVjQ29uZmlnOjpnZXRSZWZsZWN0ZWRGb3JtYXQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zXywgRG9tYWluIGNvbmZpZ0RvbWFpbikgY29uc3QgeworICAgIC8vIGNyZWF0ZSBhIG1vZGlmaWFibGUgY29weSBvZiBwYXJhbXMKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gcGFyYW1zXy0+ZHVwKCk7CisgICAgQUxPR1YoImZpbHRlcmluZyB3aXRoIGNvbmZpZyBkb21haW4gJXgiLCBjb25maWdEb21haW4pOworCisgICAgLy8gY29udmVydCBzb21lIG1hY3JvIHBhcmFtZXRlcnMgdG8gQ29kZWMgMi4wIHNwZWNpZmljIGV4cHJlc3Npb25zCisKKyAgICB7IC8vIG1ha2UgaS1mcmFtZS1pbnRlcnZhbCBmcmFtZSBiYXNlZAorICAgICAgICBmbG9hdCBpRnJhbWVJbnRlcnZhbDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0lfRlJBTUVfSU5URVJWQUwsICZpRnJhbWVJbnRlcnZhbCkpIHsKKyAgICAgICAgICAgIGZsb2F0IGZyYW1lUmF0ZTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImktZnJhbWUtcGVyaW9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZVJhdGUgPD0gMCB8fCBpRnJhbWVJbnRlcnZhbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IC0xIC8qIG5vIHN5bmMgZnJhbWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQzMl90KWMyX21pbihpRnJhbWVJbnRlcnZhbCAqIGZyYW1lUmF0ZSArIDAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClJTlQzMl9NQVgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRG9tYWluID09IChJU19WSURFTyB8IElTX0VOQ09ERVIpKSB7CisgICAgICAgIC8vIGNvbnZlcnQgY2FwdHVyZS1yYXRlIGludG8gaW5wdXQtdGltZS1zdHJldGNoCisgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSwgY2FwdHVyZVJhdGU7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgaWYgKCFwYXJhbXMtPmZpbmRBc0Zsb2F0KCJ0aW1lLWxhcHNlLWZwcyIsICZjYXB0dXJlUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgIXBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0NBUFRVUkVfUkFURSwgJmNhcHR1cmVSYXRlKSkgeworICAgICAgICAgICAgICAgIGNhcHR1cmVSYXRlID0gZnJhbWVSYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhcHR1cmVSYXRlID4gMCAmJiBmcmFtZVJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdChDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsIGNhcHR1cmVSYXRlIC8gZnJhbWVSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsgICAvLyByZWZsZWN0IHRlbXBvcmFsIGxheWVyaW5nIGludG8gYSBiaW5hcnkgYmxvYgorICAgICAgICBBU3RyaW5nIHNjaGVtYTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsICZzY2hlbWEpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTGF5ZXJzID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1CTGF5ZXJzID0gMDsKKyAgICAgICAgICAgIGludCB0YWdzOworICAgICAgICAgICAgY2hhciBkdW1teTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gbGF5ZXJpbmc7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHNjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJmR1bW15KSA9PSAxCisgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtTGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwgMHUsIDF1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLjZmIH0sIDB1LCAydSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC40ZiwgLjZmIH0sIDB1LCAzdSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuMjVmLCAuNGYsIC42ZiB9LCAwdSwgNHUsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhZ3MgPSBzc2NhbmYoc2NoZW1hLmNfc3RyKCksICJhbmRyb2lkLmdlbmVyaWMuJXUlYyV1JWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJmR1bW15LCAmbnVtQkxheWVycywgJmR1bW15KSkKKyAgICAgICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgZHVtbXkgPT0gJysnKSkKKyAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwICYmIG51bUxheWVycyA8IFVJTlQzMl9NQVggLSBudW1CTGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICB7fSwgMHUsIG51bUxheWVycyArIG51bUJMYXllcnMsIG51bUJMYXllcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiSWdub3JpbmcgdW5zdXBwb3J0ZWQgdHMtc2NoZW1hIFslc10iLCBzY2hlbWEuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGF5ZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEJ1ZmZlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkobGF5ZXJpbmcuZ2V0KCksIGxheWVyaW5nLT5zaXplKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBmcm9tIE1lZGlhRm9ybWF0IHJlY3QgdG8gQ29kZWMgMi4wIHJlY3QKKyAgICAgICAgaW50MzJfdCBvZmZzZXQ7CisgICAgICAgIGludDMyX3QgZW5kOworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLWxlZnQiLCAmb2Zmc2V0KSAmJiBwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1yaWdodCIsICZlbmQpCisgICAgICAgICAgICAgICAgJiYgb2Zmc2V0ID49IDAgJiYgZW5kID49IG9mZnNldCAtIDEpIHsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLXJpZ2h0Iik7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5TmFtZUF0KGl4LCAiY3JvcC13aWR0aCIpOworICAgICAgICAgICAgaXRlbS5zZXQoZW5kIC0gb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5QXQoaXgsIGl0ZW0pOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC10b3AiLCAmb2Zmc2V0KSAmJiBwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1ib3R0b20iLCAmZW5kKQorICAgICAgICAgICAgICAgICYmIG9mZnNldCA+PSAwICYmIGVuZCA+PSBvZmZzZXQgLSAxKSB7CisgICAgICAgICAgICBzaXplX3QgaXggPSBwYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1ib3R0b20iKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlOYW1lQXQoaXgsICJjcm9wLWhlaWdodCIpOworICAgICAgICAgICAgaXRlbS5zZXQoZW5kIC0gb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5QXQoaXgsIGl0ZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGNvbG9yIGluZm8KKyAgICAgICAgaW50MzJfdCBzdGFuZGFyZDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgJnN0YW5kYXJkKSkgeworICAgICAgICAgICAgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzOworICAgICAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworCisgICAgICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChzdGFuZGFyZCwgJnByaW1hcmllcywgJm1hdHJpeCkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJjb2xvci1wcmltYXJpZXMiLCBwcmltYXJpZXMpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImNvbG9yLW1hdHJpeCIsIG1hdHJpeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiBoZHJNZXRhOworICAgICAgICBpZiAocGFyYW1zLT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJNZXRhKQorICAgICAgICAgICAgICAgICYmIGhkck1ldGEtPnNpemUoKSA9PSBzaXplb2YoSERSU3RhdGljSW5mbykpIHsKKyAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gKm1ldGEgPSAoSERSU3RhdGljSW5mbyopaGRyTWV0YS0+ZGF0YSgpOworICAgICAgICAgICAgaWYgKG1ldGEtPm1JRCA9PSBtZXRhLT5rVHlwZTEpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYucmVkLngiLCBtZXRhLT5zVHlwZTEubVIueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5yZWQueSIsIG1ldGEtPnNUeXBlMS5tUi55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmdyZWVuLngiLCBtZXRhLT5zVHlwZTEubUcueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ncmVlbi55IiwgbWV0YS0+c1R5cGUxLm1HLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS54IiwgbWV0YS0+c1R5cGUxLm1CLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS55IiwgbWV0YS0+c1R5cGUxLm1CLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueCIsIG1ldGEtPnNUeXBlMS5tVy54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LndoaXRlLnkiLCBtZXRhLT5zVHlwZTEubVcueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgbWV0YS0+c1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsIG1ldGEtPnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSAqIDAuMDAwMSk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgiY3RhODYxLm1heC1jbGwiLCBtZXRhLT5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJjdGE4NjEubWF4LWZhbGwiLCBtZXRhLT5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGhpcyBpcyB0byB2ZXJpZnkgdGhhdCB3ZSBzZXQgcHJvcGVyIHNpZ25lZG5lc3MgZm9yIHN0YW5kYXJkIHBhcmFtZXRlcnMKKyAgICBib29sIGJlVmVyeVN0cmljdCA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfc3RyaWN0X3R5cGUiLCBmYWxzZSk7CisgICAgLy8gdGhpcyBpcyB0byBhbGxvdyB2ZW5kb3JzIHRvIHVzZSB0aGUgd3Jvbmcgc2lnbmVkbmVzcyBmb3Igc3RhbmRhcmQgcGFyYW1ldGVycworICAgIGJvb2wgYmVWZXJ5TGF4ID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19sYXhfdHlwZSIsIGZhbHNlKTsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBmaWx0ZXJlZDsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGFyYW1zLT5jb3VudEVudHJpZXMoKTsgKytpeCkgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBBU3RyaW5nIG5hbWUgPSBwYXJhbXMtPmdldEVudHJ5TmFtZUF0KGl4LCAmdHlwZSk7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBtc2dJdGVtID0gcGFyYW1zLT5nZXRFbnRyeUF0KGl4KTsKKyAgICAgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZSBpdGVtOworICAgICAgICBjb252ZXJ0KG1zZ0l0ZW0sICZpdGVtKTsgLy8gY29udmVydCBpdGVtIHRvIHBhcmFtIHVwZGF0ZXIgaXRlbQorCisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInZlbmRvci4iKSkgeworICAgICAgICAgICAgLy8gdmVuZG9yIHBhcmFtcyBwYXNzIHRocm91Z2ggYXMgaXMKKyAgICAgICAgICAgIGZpbHRlcmVkLmVtcGxhY2UobmFtZS5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIHN0YW5kYXJkIHBhcmFtZXRlcnMgbWF5IGdldCBtb2RpZmllZCwgZmlsdGVyZWQgb3IgZHVwbGljYXRlZAorICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBtU3RhbmRhcmRQYXJhbXMtPmdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkobmFtZS5jX3N0cigpKSkgeworICAgICAgICAgICAgLy8gbm90ZTogd2UgaWdub3JlIHBvcnQgZG9tYWluIGZvciBjb25maWd1cmF0aW9uCisgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgY29uZmlnRG9tYWluKQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgZG9tYWluICsga2luZCAodGhlc2UgbXVzdCBtYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGNtLmRvbWFpbigpICYgbURvbWFpbikgPT0gbURvbWFpbikgeworICAgICAgICAgICAgICAgIC8vIG1hcCBhcml0aG1ldGljIHZhbHVlcywgcGFzcyB0aHJvdWdoIHN0cmluZyBvciBidWZmZXIKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vdyBvbmx5IG1hcCBzZXR0aW5ncyB3aXRoIG1hcHBlcnMgYXMgd2UgYXJlIG5vdCBjcmVhdGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkIDw9PiB1bnNpZ25lZCBtYXBwZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBiZSBwcmVjaXNlIGFib3V0IHNpZ25lZCB1bnNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlVmVyeVN0cmljdCB8fCBjbS5tYXBwZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KGNtLm1hcEZyb21NZXNzYWdlKHBhcmFtcy0+Z2V0RW50cnlBdChpeCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGFsbG93IHRvIHJlbGF4IHR5cGUgc3RyaWN0bmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZVZlcnlMYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXhWYWx1ZXMoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsdGVyZWQuZW1wbGFjZShjbS5wYXRoKCksIGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJmaWx0ZXJlZCAlcyB0byAlcyIsIHBhcmFtcy0+ZGVidWdTdHJpbmcoNCkuY19zdHIoKSwKKyAgICAgICAgICAgIGZpbHRlcmVkLmRlYnVnU3RyaW5nKDQpLmNfc3RyKCkpOworICAgIHJldHVybiBmaWx0ZXJlZDsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpnZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzZGtQYXJhbXMsIERvbWFpbiBjb25maWdEb21haW4sCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbmZpZ1VwZGF0ZSkgY29uc3QgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBwYXJhbXMgPSBnZXRSZWZsZWN0ZWRGb3JtYXQoc2RrUGFyYW1zLCBjb25maWdEb21haW4pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UocGFyYW1zLCAmaW5kaWNlcyk7CisgICAgaWYgKGluZGljZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRCgibm8gcmVjb2duaXplZCBwYXJhbXMgaW46ICVzIiwgcGFyYW1zLmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb25maWdVcGRhdGUtPmNsZWFyKCk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHN1cHBvcnRlZEluZGljZXM7CisgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IGluZGljZXMpIHsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGl4KSkgeworICAgICAgICAgICAgc3VwcG9ydGVkSW5kaWNlcy5wdXNoX2JhY2soaXgpOworICAgICAgICB9IGVsc2UgaWYgKG1Mb2NhbFBhcmFtcy5jb3VudChpeCkpIHsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGxvY2FsIHBhcmFtZXRlciBoZXJlCisgICAgICAgICAgICBhdXRvIGl0ID0gbUN1cnJlbnRDb25maWcuZmluZChpeCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUN1cnJlbnRDb25maWcuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb25maWdVcGRhdGUtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCppdC0+c2Vjb25kKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHsgfSwgc3VwcG9ydGVkSW5kaWNlcywgYmxvY2tpbmcsIGNvbmZpZ1VwZGF0ZSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgcGFyYW1zID0+ICVzIiwgY29uZmlnVXBkYXRlLT5zaXplKCksIGFzU3RyaW5nKGVycikpOworICAgIH0KKworICAgIGlmIChjb25maWdVcGRhdGUtPnNpemUoKSkgeworICAgICAgICBtUGFyYW1VcGRhdGVyLT51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShwYXJhbXMsIGNvbmZpZ1VwZGF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzZXRQYXJhbWV0ZXJzKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7CisgICAgaWYgKGNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHBhcmFtVmVjdG9yOworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSA6IGNvbmZpZ1VwZGF0ZSkgeworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQocGFyYW0tPmluZGV4KCkpKSB7CisgICAgICAgICAgICAvLyBjb21wb25lbnQgcGFyYW1ldGVyCisgICAgICAgICAgICBwYXJhbVZlY3Rvci5wdXNoX2JhY2socGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2socGFyYW0tPmluZGV4KCkpOworICAgICAgICB9IGVsc2UgaWYgKG1Mb2NhbFBhcmFtcy5jb3VudChwYXJhbS0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBsb2NhbCBwYXJhbWV0ZXIgaGVyZQorICAgICAgICAgICAgTG9jYWxQYXJhbVZhbGlkYXRvciB2YWxpZGF0b3IgPSBtTG9jYWxQYXJhbXMuZmluZChwYXJhbS0+aW5kZXgoKSktPnNlY29uZDsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDMlBhcmFtOjpDb3B5KCpwYXJhbSk7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yKSB7CisgICAgICAgICAgICAgICAgZXJyID0gdmFsaWRhdG9yKGNvcHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1cGRhdGVkIGxvY2FsIHBhcmFtZXRlciB2YWx1ZSBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1OYW1lKHBhcmFtLT5pbmRleCgpKS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnW3BhcmFtLT5pbmRleCgpXSA9IHN0ZDo6bW92ZShjb3B5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBzZXQgcGFyYW1ldGVyIHZhbHVlIGZvciAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbU5hbWUocGFyYW0tPmluZGV4KCkpLmNfc3RyKCksIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyB1cGRhdGUgc3Vic2NyaWJlZCBwYXJhbSBpbmRpY2VzCisgICAgc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoY29tcG9uZW50LCBpbmRpY2VzLCBibG9ja2luZyk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcG9uZW50LT5jb25maWcocGFyYW1WZWN0b3IsIGJsb2NraW5nLCAmZmFpbHVyZXMpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoImNvbmZpZyBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgLy8gVGhpcyBpcyBub24tZmF0YWwuCisgICAgfQorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJmZhaWx1cmUgOiBmYWlsdXJlcykgeworICAgICAgICBzd2l0Y2ggKGZhaWx1cmUtPmZhaWx1cmUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU6CisgICAgICAgICAgICAgICAgQUxPR0QoIkJhZCBwYXJhbWV0ZXIgdmFsdWUiKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsdXJlID0gJWQiLCBpbnQoZmFpbHVyZS0+ZmFpbHVyZSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmUtcXVlcnkgcGFyYW1ldGVyIHZhbHVlcyBpbiBjYXNlIGNvbmZpZyBjb3VsZCBub3QgdXBkYXRlIHRoZW0gYW5kIHVwZGF0ZSB0aGUgY3VycmVudAorICAgIC8vIGNvbmZpZ3VyYXRpb24uCisgICAgY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgZXJyID0gY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgYmxvY2tpbmcsICZjb25maWdVcGRhdGUpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHBhcmFtcyA9PiAlcyIsIGNvbmZpZ1VwZGF0ZS5zaXplKCksIGFzU3RyaW5nKGVycikpOworICAgIH0KKyAgICAodm9pZCl1cGRhdGVDb25maWd1cmF0aW9uKGNvbmZpZ1VwZGF0ZSwgQUxMKTsKKworICAgIC8vIFRPRE86IGVycm9yIHZhbHVlCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworY29uc3QgQzJQYXJhbSAqQ0NvZGVjQ29uZmlnOjpnZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3QgeworICAgIGF1dG8gaXQgPSBtQ3VycmVudENvbmZpZy5maW5kKGluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUN1cnJlbnRDb25maWcuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWZlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENfQ09ERUNfQ09ORklHX0hfCisjZGVmaW5lIENfQ09ERUNfQ09ORklHX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorI2luY2x1ZGUgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBTdGFuZGFyZFBhcmFtczsKKworLyoqCisgKiBTdHJ1Y3QgbWFuYWdpbmcgdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gZm9yIENDb2RlYy4KKyAqLworc3RydWN0IENDb2RlY0NvbmZpZyB7CisKKyAgICAvKioKKyAgICAgKiBEb21haW4gY29uc2lzdHMgb2YgYSBiaXRtYXNrIGRpdmlkZWQgaW50byBmaWVsZHMsIGFuZCBzcGVjaWZpZXJzIHdvcmsgYnkgZXhjbHVkaW5nIG90aGVyCisgICAgICogdmFsdWVzIGluIHRob3NlIGRvbWFpbnMuCisgICAgICoKKyAgICAgKiBDb21wb25lbnQgZG9tYWlucyBhcmUgY29tcG9zZWQgYnkgb3ItaW5nIHRoZSBpbmRpdmlkdWFsIElTXyBjb25zdGFudHMsIGUuZy4KKyAgICAgKiBJU19ERUNPREVSIHwgSVNfQVVESU8uCisgICAgICoKKyAgICAgKiBDb25maWcgc3BlY2lmaWVycyBhcmUgY29tcG9zZWQgYnkgb3ItaW5nIHRoZSBpbmRpdmlkdWFsIG1hc2sgY29uc3RhbnRzLCBhbmQKKyAgICAgKiBhbmQtaW5nIHRoZXNlIGdyb3VwczogZS5nLiAoREVDT0RFUiB8IEVOQ09ERVIpICYgQVVESU8uCisgICAgICoKKyAgICAgKiBUaGUgbmFtaW5nIG9mIHRoZXNlIGNvbnN0YW50cyB3YXMgdG8gbGltaXQgdGhlIGxlbmd0aCBvZiBtYXNrIG5hbWVzIGFzIHRoZXNlIGFyZSB1c2VkIG1vcmUKKyAgICAgKiBjb21tb25seSBhcyBtYXNrcy4KKyAgICAgKi8KKyAgICBlbnVtIERvbWFpbiA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8gY29tcG9uZW50IGRvbWFpbiAoZG9tYWluICYga2luZCkKKyAgICAgICAgR1VBUkRfQklUICAgPSAoMSA8PCAxKSwgICAvLy88IHRoaXMgaXMgdG8gcHJldmVudCBhZ2FpbnN0IGFjY2lkZW50YWwgJiYgb3IgfHwgdXNhZ2UKKyAgICAgICAgSVNfQVVESU8gICAgPSAoMSA8PCAyKSwgICAvLy88IGZvciBhdWRpbyBjb2RlY3MKKyAgICAgICAgSVNfVklERU8gICAgPSAoMSA8PCAzKSwgICAvLy88IGZvciB2aWRlbyBjb2RlY3MKKyAgICAgICAgSVNfSU1BR0UgICAgPSAoMSA8PCA0KSwgICAvLy88IGZvciBpbWFnZSBjb2RlY3MKKyAgICAgICAgT1RIRVJfRE9NQUlOID0gKDEgPDwgNSksICAvLy88IGZvciBvdGhlciBkb21haW5zCisKKyAgICAgICAgSVNfRU5DT0RFUiAgPSAoMSA8PCA2KSwgICAvLy88IGZvciBlbmNvZGVycworICAgICAgICBJU19ERUNPREVSICA9ICgxIDw8IDcpLCAgIC8vLzwgZm9yIGRlY29kZXJzCisgICAgICAgIE9USEVSX0tJTkQgID0gKDEgPDwgOCksICAgLy8vPCBmb3Igb3RoZXIgZG9tYWlucworCisgICAgICAgIC8vIGNvbmZpZyBkb21haW4KKyAgICAgICAgSVNfUEFSQU0gICAgPSAoMSA8PCA5KSwgICAvLy88IGZvciBzZXRQYXJhbWV0ZXIKKyAgICAgICAgSVNfQ09ORklHICAgPSAoMSA8PCAxMCksICAvLy88IGZvciBjb25maWd1cmUKKyAgICAgICAgSVNfUkVBRCAgICAgPSAoMSA8PCAxMSksICAvLy88IGZvciBnZXRGb3JtYXQKKworICAgICAgICAvLyBwb3J0IGRvbWFpbgorICAgICAgICBJU19JTlBVVCAgICA9ICgxIDw8IDEyKSwgIC8vLzwgZm9yIGlucHV0IHBvcnQgKGdldEZvcm1hdCkKKyAgICAgICAgSVNfT1VUUFVUICAgPSAoMSA8PCAxMyksICAvLy88IGZvciBvdXRwdXQgcG9ydCAoZ2V0Rm9ybWF0KQorICAgICAgICBJU19SQVcgICAgICA9ICgxIDw8IDE0KSwgIC8vLzwgZm9yIHJhdyBwb3J0IChpbnB1dC1lbmNvZGVyLCBvdXRwdXQtZGVjb2RlcikKKyAgICAgICAgSVNfQ09ERUQgICAgPSAoMSA8PCAxNSksICAvLy88IGZvciBjb2RlZCBwb3J0IChpbnB1dC1kZWNvZGVyLCBvdXRwdXQtZW5jb2RlcikKKworICAgICAgICBBTEwgICAgID0gfjBVLAorICAgICAgICBOT05FICAgID0gMCwKKworICAgICAgICBBVURJTyAgID0gfihJU19JTUFHRSB8IElTX1ZJREVPIHwgT1RIRVJfRE9NQUlOKSwKKyAgICAgICAgVklERU8gICA9IH4oSVNfQVVESU8gfCBJU19JTUFHRSB8IE9USEVSX0RPTUFJTiksCisgICAgICAgIElNQUdFICAgPSB+KElTX0FVRElPIHwgSVNfVklERU8gfCBPVEhFUl9ET01BSU4pLAorCisgICAgICAgIERFQ09ERVIgPSB+KElTX0VOQ09ERVIgfCBPVEhFUl9LSU5EKSwKKyAgICAgICAgRU5DT0RFUiA9IH4oSVNfREVDT0RFUiB8IE9USEVSX0tJTkQpLAorCisgICAgICAgIFBBUkFNICAgPSB+KElTX0NPTkZJRyB8IElTX1JFQUQpLAorICAgICAgICBDT05GSUcgID0gfihJU19QQVJBTSAgfCBJU19SRUFEKSwKKyAgICAgICAgUkVBRCAgICA9IH4oSVNfQ09ORklHIHwgSVNfUEFSQU0pLAorCisgICAgICAgIElOUFVUICAgPSB+KElTX09VVFBVVCB8IElTX1JBVyAgICB8IElTX0NPREVEKSwKKyAgICAgICAgT1VUUFVUICA9IH4oSVNfSU5QVVQgIHwgSVNfUkFXICAgIHwgSVNfQ09ERUQpLAorICAgICAgICBSQVcgICAgID0gfihJU19JTlBVVCAgfCBJU19PVVRQVVQgfCBJU19DT0RFRCksCisgICAgICAgIENPREVEICAgPSB+KElTX0lOUFVUICB8IElTX1JBVyAgICB8IElTX09VVFBVVCksCisgICAgfTsKKworICAgIC8vIHRoaW5ncyByZXF1aXJlZCB0byBtYW5hZ2UgZm9ybWF0cworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1QYXJhbURlc2NzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlZmxlY3RlZFBhcmFtVXBkYXRlcj4gbVBhcmFtVXBkYXRlcjsKKworICAgIERvbWFpbiBtRG9tYWluOyAvLyBjb21wb25lbnQgZG9tYWluCisgICAgRG9tYWluIG1JbnB1dERvbWFpbjsgLy8gaW5wdXQgcG9ydCBkb21haW4KKyAgICBEb21haW4gbU91dHB1dERvbWFpbjsgLy8gb3V0cHV0IHBvcnQgZG9tYWluCisgICAgc3RkOjpzdHJpbmcgbUNvZGluZ01lZGlhVHlwZTsgIC8vIG1lZGlhIHR5cGUgb2YgdGhlIGNvZGVkIHN0cmVhbQorCisgICAgLy8gc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U3RhbmRhcmRQYXJhbXM+IG1TdGFuZGFyZFBhcmFtczsKKworICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBtU3VwcG9ydGVkSW5kaWNlczsgLy8vPCBpbmRpY2VzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IG1TdWJzY3JpYmVkSW5kaWNlczsgLy8vPCBpbmRpY2VzIHRvIHN1YnNjcmliZSB0bworICAgIHNpemVfdCBtU3Vic2NyaWJlZEluZGljZXNTaXplOyAvLy88IGNvdW50IG9mIGN1cnJlbnRseSBzdWJzY3JpYmVkIGluZGljZXMKKworICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisKKyAgICBib29sIG1Vc2luZ1N1cmZhY2U7IC8vLzwgdXNpbmcgaW5wdXQgb3Igb3V0cHV0IHN1cmZhY2UKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiBtSW5wdXRTdXJmYWNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyOjpDb25maWc+IG1JU0NvbmZpZzsKKworICAgIC8vLyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBVcGRhdGVkIGFmdGVyIGNvbmZpZ3VyZSgpIGFuZCBiYXNlZCBvbiBjb25maWdVcGRhdGUgaW4KKyAgICAvLy8gb25Xb3JrRG9uZQorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IG1DdXJyZW50Q29uZmlnOworCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYpPiBMb2NhbFBhcmFtVmFsaWRhdG9yOworCisgICAgLy8vIFBhcmFtZXRlciBpbmRpY2VzIHRyYWNrZWQgaW4gY3VycmVudCBjb25maWcgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50LgorICAgIC8vLyB0aGVzZSBhcmUgcHJvdmlkZWQgc28gdGhhdCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiByZW1haW4gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgICAvLy8gYXMgc3VjaCwgdGhlc2UgcGFyYW1ldGVycyBoYXZlIG5vIGRlcGVuZGVuY2llcy4gVE9ETzogdXNlIEMySW50ZXJmYWNlSGVscGVyIGZvciB0aGlzLgorICAgIC8vLyBGb3Igbm93IHN1cHBvcnQgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uLgorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBMb2NhbFBhcmFtVmFsaWRhdG9yPiBtTG9jYWxQYXJhbXM7CisKKyAgICBDQ29kZWNDb25maWcoKTsKKworICAgIC8vLyBpbml0aWFsaXplcyB0aGUgbWVtYmVycyByZXF1aXJlZCB0byBtYW5hZ2UgdGhlIGZvcm1hdDogZGVzY3JpcHRvcnMsIHJlZmxlY3RvciwKKyAgICAvLy8gcmVmbGVjdGVkIHBhcmFtIGhlbHBlciwgZG9tYWluLCBzdGFuZGFyZCBwYXJhbXMsIGFuZCBzdWJzY3JpYmVzIHRvIHN0YW5kYXJkCisgICAgLy8vIGluZGljZXMuCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbG9jYWxseSBtYWludGFpbmVkIHBhcmFtZXRlci4gVGhpcyBpcyB1c2VkIGZvciBvdXRwdXQgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZQorICAgICAqIGFwcGVuZGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVycyBpbiBjYXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4ID0gVDo6UEFSQU1fVFlQRTsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGluZGV4KSB8fCBtTG9jYWxQYXJhbXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0QoImlnbm9yaW5nIGxvY2FsIHBhcmFtICVzICglI3gpIGFzIGl0IGlzIGFscmVhZHkgJXMiLAorICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksICh1aW50MzJfdClpbmRleCwgbVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpID8gInN1cHBvcnRlZCIgOiAibG9jYWwiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYWxyZWFkeSBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudCBvciBhbHJlYWR5IGFkZGVkCisgICAgICAgIH0KKworICAgICAgICAvLyB3cmFwIHR5cGVkIHZhbGlkYXRvciBpbnRvIHVudHlwZWQgdmFsaWRhdG9yCisgICAgICAgIExvY2FsUGFyYW1WYWxpZGF0b3IgdmFsaWRhdG9yOworICAgICAgICBpZiAodmFsaWRhdG9yXykgeworICAgICAgICAgICAgdmFsaWRhdG9yID0gW3ZhbGlkYXRvcl9dKHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYgcCl7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiB0eXBlZChzdGF0aWNfY2FzdDxUKj4ocC5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICAvLyBpZiBwYXJhbWV0ZXIgaXMgY29ycmVjdGx5IHR5cGVkCisgICAgICAgICAgICAgICAgaWYgKFQ6OkZyb20odHlwZWQuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRvcl8odHlwZWQpOworICAgICAgICAgICAgICAgICAgICBwLnJlc2V0KHR5cGVkLnJlbGVhc2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgbUxvY2FsUGFyYW1zLmVtcGxhY2UoaW5kZXgsIHZhbGlkYXRvcik7CisgICAgICAgIG1QYXJhbVVwZGF0ZXItPmFkZFN0YW5kYXJkUGFyYW08VD4obmFtZSwgYXR0cmliKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGxvY2FsbHkgbWFpbnRhaW5lZCBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gZGVmYXVsdF8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPSBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4gdmFsaWRhdG9yXyA9CisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4oKSkgeworICAgICAgICBpZiAoYWRkTG9jYWxQYXJhbTxUPihuYW1lLCBhdHRyaWIsIHZhbGlkYXRvcl8pKSB7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yXykgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHZhbGlkYXRvcl8oZGVmYXVsdF8pOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImRlZmF1bHQgdmFsdWUgZm9yICVzIGlzIGludmFsaWQgPT4gJXMiLCBuYW1lLmNfc3RyKCksIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1cnJlbnRDb25maWdbVDo6UEFSQU1fVFlQRV0gPSBzdGQ6Om1vdmUoZGVmYXVsdF8pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgVCAqZGVmYXVsdF8sIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIHJldHVybiBhZGRMb2NhbFBhcmFtKHN0ZDo6dW5pcXVlX3B0cjxUPihkZWZhdWx0XyksIG5hbWUsIGF0dHJpYiwgdmFsaWRhdG9yXyk7CisgICAgfQorCisgICAgLy8vIEFwcGxpZXMgY29uZmlndXJhdGlvbiB1cGRhdGVzLCBhbmQgdXBkYXRlcyBmb3JtYXQgaW4gdGhlIHNwZWNpZmljIGRvbWFpbi4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGZvcm1hdHMgd2VyZSB1cGRhdGVkCisgICAgLy8vIFxwYXJhbSBkb21haW4gaW5wdXQvb3V0cHV0IGJpdG1hc2sKKyAgICBib29sIHVwZGF0ZUNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsIERvbWFpbiBkb21haW4pOworCisgICAgLy8vIFVwZGF0ZXMgZm9ybWF0cyBpbiB0aGUgc3BlY2lmaWMgZG9tYWluLiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBmb3JtYXRzIGhhdmUgY2hhbmdlZC4KKyAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzaworICAgIGJvb2wgdXBkYXRlRm9ybWF0cyhEb21haW4gZG9tYWluKTsKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgU0RLIGNvbmZpZ3VyYXRpb25zIGluIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkb21haW4uCisgICAgICogVXBkYXRlcyByZWxldmFudCBpbnB1dC9vdXRwdXQgZm9ybWF0cyBhbmQgc3Vic2NyaWJlcyB0byBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqIFxwYXJhbSBkb21haW4gY29uZmlnL3NldFBhcmFtIGJpdG1hc2sKKyAgICAgKiBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzZGtQYXJhbXMsIERvbWFpbiBkb21haW4sCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uZmlnVXBkYXRlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgYSBjb25maWd1cmF0aW9uIHVwZGF0ZSB0byB0aGUgY29tcG9uZW50LgorICAgICAqIFVwZGF0ZXMgcmVsZXZhbnQgaW5wdXQvb3V0cHV0IGZvcm1hdHMgYW5kIHN1YnNjcmliZXMgdG8gcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICogY29uZmlndXJhdGlvbi4KKyAgICAgKiBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyk7CisKKyAgICAvLy8gUXVlcmllcyBzdWJzY3JpYmVkIGluZGljZXMgKHdoaWNoIGNvbnRhaW5zIGFsbCBTREstZXhwb3NlZCB2YWx1ZXMpIGFuZCB1cGRhdGVzCisgICAgLy8vIGlucHV0L291dHB1dCBmb3JtYXRzLgorICAgIHN0YXR1c190IHF1ZXJ5Q29uZmlndXJhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCk7CisKKyAgICAvLy8gUXVlcmllcyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHZhbHVlLiBSZXR1cm5zIG51bGxwdHIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QKKyAgICAvLy8gcGFydCBvZiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCisgICAgY29uc3QgQzJQYXJhbSAqZ2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogT2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhbmQgaWYgdGhleSBjaGFuZ2UuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgV2F0Y2hlciB7CisgICAgICAgIH5XYXRjaGVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZAorICAgICAgICBib29sIGhhc0NoYW5nZWQoKSBjb25zdCB7CisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSA9IG1QYXJlbnQtPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKG1JbmRleCk7CisgICAgICAgICAgICBpZiAodmFsdWUgJiYgbVZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICp2YWx1ZSAhPSAqbVZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbVZhbHVlLmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIHVwZGF0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHJldHVybnMgaXQKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+IHVwZGF0ZSgpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlID0gbVBhcmVudC0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUobUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgICAgIG1WYWx1ZSA9IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtVmFsdWU7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFdhdGNoZXIoQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IENDb2RlY0NvbmZpZyAqcGFyZW50KQorICAgICAgICAgICAgOiBtUGFyZW50KHBhcmVudCksIG1JbmRleChpbmRleCkgeworICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgc3RydWN0IENDb2RlY0NvbmZpZzsKKworICAgICAgICBjb25zdCBDQ29kZWNDb25maWcgKm1QYXJlbnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPiBtVmFsdWU7CisgICAgICAgIEMyUGFyYW06OkluZGV4IG1JbmRleDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHdhdGNoZXIgb2JqZWN0IGZvciBhIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFdhdGNoZXI8VD4gd2F0Y2goQzJQYXJhbTo6SW5kZXggaW5kZXggPSBUOjpQQVJBTV9UWVBFKSBjb25zdCB7CisgICAgICAgIGlmIChpbmRleC50eXBlKCkgIT0gVDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgX19idWlsdGluX3RyYXAoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gV2F0Y2hlcjxUPihpbmRleCwgdGhpcyk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgLy8vIGluaXRpYWxpemVzIHRoZSBzdGFuZGFyZCBNZWRpYUNvZGVjIHRvIENvZGVjIDIuMCBwYXJhbXMgbWFwcGluZworICAgIHZvaWQgaW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCk7CisKKyAgICAvLy8gQWRkcyBpbmRpY2VzIHRvIHRoZSBzdWJzY3JpYmVkIGluZGljZXMsIGFuZCB1cGRhdGVkIHN1YnNjcmlwdGlvbiB0byBjb21wb25lbnQKKyAgICAvLy8gXHBhcmFtIGJsb2NraW5nIGJsb2NraW5nIG1vZGUgdG8gdXNlIHdpdGggdGhlIGNvbXBvbmVudAorICAgIHN0YXR1c190IHN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyA9IEMyX0RPTlRfQkxPQ0spOworCisgICAgLy8vIEdldHMgU0RLIGZvcm1hdCBmcm9tIGNvZGVjIDIuMCByZWZsZWN0ZWQgY29uZmlndXJhdGlvbgorICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCisgICAgc3A8QU1lc3NhZ2U+IGdldFNka0Zvcm1hdEZvckRvbWFpbigKKyAgICAgICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCAmcmVmbGVjdGVkLCBEb21haW4gZG9tYWluKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbiBhbiBBTWVzc2FnZSB0byBhIGxpc3Qgb2YgcGF0aC1iYXNlZCBDb2RlYworICAgICAqIDIuMCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gZG9tYWluIGNvbmZpZy9zZXRQYXJhbSBiaXRtYXNrCisgICAgICovCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IGdldFJlZmxlY3RlZEZvcm1hdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmY29uZmlnLCBEb21haW4gZG9tYWluKSBjb25zdDsKK307CisKK0RFRklORV9FTlVNX09QRVJBVE9SUyhDQ29kZWNDb25maWc6OkRvbWFpbikKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDX0NPREVDX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkNTczMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwCkBAIC0wLDAgKzEsODAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKworI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIENvZGVjMkJ1ZmZlcgorCitib29sIENvZGVjMkJ1ZmZlcjo6Y2FuQ29weUxpbmVhcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IHsKKyAgICBpZiAoY29uc3RfY2FzdDxDb2RlYzJCdWZmZXIgKj4odGhpcyktPmJhc2UoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBjb3B5LCBzbyB3ZSBjYW4gY29weSBieSBkb2luZyBub3RoaW5nLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgPT0gMHUpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBjb3B5LCBzbyB3ZSBjYW4gY29weSBieSBkb2luZyBub3RoaW5nLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSA+IDF1KSB7CisgICAgICAgIC8vIFdlIGRvbid0IGtub3cgaG93IHRvIGNvcHkgbW9yZSB0aGFuIG9uZSBibG9ja3MuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLnNpemUoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgLy8gSXQgd29uJ3QgZml0LgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVjMkJ1ZmZlcjo6Y29weUxpbmVhcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAvLyBXZSBhc3N1bWUgdGhhdCBhbGwgY2FuQ29weUxpbmVhcigpIGNoZWNrcyBwYXNzZWQuCisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpID09IDB1CisgICAgICAgICAgICB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5zaXplKCkgPT0gMHUpIHsKKyAgICAgICAgc2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5tYXAoKS5nZXQoKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJFcnJvciB3aGlsZSBtYXBwaW5nOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZpZXcuY2FwYWNpdHkoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0QoIkMyQ29uc3RMaW5lYXJCbG9jayBsaWVkIC0tLSBpdCBhY3R1YWxseSBkb2Vzbid0IGZpdDogdmlldygldSkgPiB0aGlzKCV6dSkiLAorICAgICAgICAgICAgICAgIHZpZXcuY2FwYWNpdHkoKSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KGJhc2UoKSwgdmlldy5kYXRhKCksIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgc2V0UmFuZ2UoMCwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlYzJCdWZmZXI6OnNldEltYWdlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhKSB7CisgICAgbUltYWdlRGF0YSA9IGltYWdlRGF0YTsKK30KKworLy8gTG9jYWxMaW5lYXJCdWZmZXIKKworYm9vbCBMb2NhbExpbmVhckJ1ZmZlcjo6Y2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FuQ29weUxpbmVhcihidWZmZXIpOworfQorCitib29sIExvY2FsTGluZWFyQnVmZmVyOjpjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHJldHVybiBjb3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKKy8vIER1bW15Q29udGFpbmVyQnVmZmVyCisKK3N0YXRpYyB1aW50OF90IHNEdW1teUJ5dGVbMV0gPSB7IDAgfTsKKworRHVtbXlDb250YWluZXJCdWZmZXI6OkR1bW15Q29udGFpbmVyQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIoc0R1bW15Qnl0ZSwgMSkpLAorICAgICAgbUJ1ZmZlclJlZihidWZmZXIpIHsKKyAgICBzZXRSYW5nZSgwLCBidWZmZXIgPyAxIDogMCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gRHVtbXlDb250YWluZXJCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShtQnVmZmVyUmVmKTsKK30KKworYm9vbCBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6Y2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICYpIGNvbnN0IHsKKyAgICByZXR1cm4gIW1CdWZmZXJSZWY7Cit9CisKK2Jvb2wgRHVtbXlDb250YWluZXJCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgbUJ1ZmZlclJlZiA9IGJ1ZmZlcjsKKyAgICBzZXRSYW5nZSgwLCBtQnVmZmVyUmVmID8gMSA6IDApOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBMaW5lYXJCbG9ja0J1ZmZlcgorCisvLyBzdGF0aWMKK3NwPExpbmVhckJsb2NrQnVmZmVyPiBMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKSB7CisgICAgQzJXcml0ZVZpZXcgd3JpdGVWaWV3KGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgaWYgKHdyaXRlVmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IExpbmVhckJsb2NrQnVmZmVyKGZvcm1hdCwgc3RkOjptb3ZlKHdyaXRlVmlldyksIGJsb2NrKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBMaW5lYXJCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihtQmxvY2stPnNoYXJlKG9mZnNldCgpLCBzaXplKCksIEMyRmVuY2UoKSkpOworfQorCitib29sIExpbmVhckJsb2NrQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIHJldHVybiBjYW5Db3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKK2Jvb2wgTGluZWFyQmxvY2tCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgcmV0dXJuIGNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworTGluZWFyQmxvY2tCdWZmZXI6OkxpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgQzJXcml0ZVZpZXcmJiB3cml0ZVZpZXcsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcih3cml0ZVZpZXcuZGF0YSgpLCB3cml0ZVZpZXcuc2l6ZSgpKSksCisgICAgICBtV3JpdGVWaWV3KHdyaXRlVmlldyksCisgICAgICBtQmxvY2soYmxvY2spIHsKK30KKworLy8gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcgorCisvLyBzdGF0aWMKK3NwPENvbnN0TGluZWFyQmxvY2tCdWZmZXI+IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKCFidWZmZXIKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUgorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBDMlJlYWRWaWV3IHJlYWRWaWV3KGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLm1hcCgpLmdldCgpKTsKKyAgICBpZiAocmVhZFZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBDb25zdExpbmVhckJsb2NrQnVmZmVyKGZvcm1hdCwgc3RkOjptb3ZlKHJlYWRWaWV3KSwgYnVmZmVyKTsKK30KKworQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6Q29uc3RMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIEMyUmVhZFZpZXcmJiByZWFkVmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIoCisgICAgICAgICAgICAvLyBOT1RFOiBBQnVmZmVyIG9ubHkgdGFrZXMgbm9uLWNvbnN0IHBvaW50ZXIgYnV0IHRoaXMgZGF0YSBpcworICAgICAgICAgICAgLy8gICAgICAgc3VwcG9zZWQgdG8gYmUgcmVhZC1vbmx5LgorICAgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90ICo+KHJlYWRWaWV3LmRhdGEoKSksIHJlYWRWaWV3LmNhcGFjaXR5KCkpKSwKKyAgICAgIG1SZWFkVmlldyhyZWFkVmlldyksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlcikgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShtQnVmZmVyUmVmKTsKK30KKworLy8gR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlcgorCituYW1lc3BhY2UgeworCitjbGFzcyBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgQzJHcmFwaGljVmlldyA8PT4gTWVkaWFJbWFnZSBjb252ZXJ0ZXIKKyAgICAgKgorICAgICAqIFxwYXJhbSB2aWV3IEMyR3JhcGhpY1ZpZXcgb2JqZWN0CisgICAgICogXHBhcmFtIGNvbG9yRm9ybWF0IGRlc2lyZWQgU0RLIGNvbG9yIGZvcm1hdCBmb3IgdGhlIE1lZGlhSW1hZ2UgKGlmIHRoaXMgaXMgYSBmbGV4aWJsZSBmb3JtYXQsCisgICAgICogICAgICAgIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzaW1wbHkgcmVwcmVzZW50IHRoZSBncmFwaGljIHZpZXcgYXMgYSBmbGV4aWJsZSBTREsgZm9ybWF0CisgICAgICogICAgICAgIHdpdGhvdXQgYSBtZW1jcHkpCisgICAgICovCisgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlcigKKyAgICAgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGludDMyX3QgY29sb3JGb3JtYXQpCisgICAgICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgICAgICBtVmlldyh2aWV3KSwKKyAgICAgICAgICBtV2lkdGgodmlldy53aWR0aCgpKSwKKyAgICAgICAgICBtSGVpZ2h0KHZpZXcuaGVpZ2h0KCkpLAorICAgICAgICAgIG1Db2xvckZvcm1hdChjb2xvckZvcm1hdCksCisgICAgICAgICAgbUFsbG9jYXRlZERlcHRoKDApLAorICAgICAgICAgIG1CYWNrQnVmZmVyU2l6ZSgwKSwKKyAgICAgICAgICBtTWVkaWFJbWFnZShuZXcgQUJ1ZmZlcihzaXplb2YoTWVkaWFJbWFnZTIpKSkgeworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB2aWV3LmVycm9yKCkgPSAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1lZGlhSW1hZ2UyICptZWRpYUltYWdlID0gKE1lZGlhSW1hZ2UyICopbU1lZGlhSW1hZ2UtPmJhc2UoKTsKKyAgICAgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzID09IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IDAgcGxhbmVzIik7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbXNldChtZWRpYUltYWdlLCAwLCBzaXplb2YoKm1lZGlhSW1hZ2UpKTsKKyAgICAgICAgbUFsbG9jYXRlZERlcHRoID0gbGF5b3V0LnBsYW5lc1swXS5hbGxvY2F0ZWREZXB0aDsKKyAgICAgICAgdWludDMyX3QgYml0RGVwdGggPSBsYXlvdXQucGxhbmVzWzBdLmJpdERlcHRoOworCisgICAgICAgIC8vIGFsaWduIHdpZHRoIGFuZCBoZWlnaHQgdG8gc3VwcG9ydCBzdWJzYW1wbGluZyBjbGVhbmx5CisgICAgICAgIHVpbnQzMl90IG1TdHJpZGUgPSBhbGlnbihtV2lkdGgsIDIpICogZGl2VXAobGF5b3V0LnBsYW5lc1swXS5hbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICB1aW50MzJfdCBtVlN0cmlkZSA9IGFsaWduKG1IZWlnaHQsIDIpOworCisgICAgICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWOworICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBZVVYgbGF5b3V0IiwgbGF5b3V0Lm51bVBsYW5lcyk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbMF0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzFdLmNoYW5uZWwgIT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1swXS5jb2xTYW1wbGluZyAhPSAxCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzBdLnJvd1NhbXBsaW5nICE9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMV0uY29sU2FtcGxpbmcgIT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1sxXS5yb3dTYW1wbGluZyAhPSAyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzJdLmNvbFNhbXBsaW5nICE9IDIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0ucm93U2FtcGxpbmcgIT0gMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBub3QgWVVWNDIwIGZvciBZVVYgbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgeyAgLy8gdHJ5IHRvIG1hcCBkaXJlY3RseS4gY2hlY2sgaWYgdGhlIHBsYW5lcyBhcmUgbmVhciBvbmUgYW5vdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWluUHRyID0gbVZpZXcuZGF0YSgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWF4UHRyID0gbVZpZXcuZGF0YSgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwbGFuZVNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBtaW5PZmZzZXQgPSBwbGFuZS5taW5PZmZzZXQobVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG1heE9mZnNldCA9IHBsYW5lLm1heE9mZnNldChtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW5QdHIgPiBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUHRyID0gbVZpZXcuZGF0YSgpW2ldICsgbWluT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UHRyIDwgbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFB0ciA9IG1WaWV3LmRhdGEoKVtpXSArIG1heE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVTaXplICs9IHN0ZDo6YWJzKHBsYW5lLnJvd0luYykgKiBhbGlnbihtSGVpZ2h0LCA2NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZyAqIGRpdlVwKG1BbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1heFB0ciAtIG1pblB0ciArIDEpIDw9IHBsYW5lU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIHJpc2t5IGFzIHJlYWRpbmcvd3JpdGluZyBkYXRhIG91dCBvZiBib3VuZCByZXN1bHRzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIGFuIHVuZGVmaW5lZCBiZWhhdmlvciwgYnV0IGdyYWxsb2MgZG9lcyBhc3N1bWUgYSBjb250aWd1b3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tT2Zmc2V0ID0gbVZpZXcuZGF0YSgpW2ldIC0gbWluUHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubUNvbEluYyA9IHBsYW5lLmNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Sb3dJbmMgPSBwbGFuZS5yb3dJbmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tSG9yaXpTdWJzYW1wbGluZyA9IHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZyA9IHBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV3JhcHBlZCA9IG5ldyBBQnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihtaW5QdHIpLCBtYXhQdHIgLSBtaW5QdHIgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1PZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Db2xJbmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Sb3dJbmMgPSBtU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Ib3JpelN1YnNhbXBsaW5nID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tVmVydFN1YnNhbXBsaW5nID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1PZmZzZXQgPSBtU3RyaWRlICogbVZTdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVJvd0luYyA9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1PZmZzZXQgPSBtU3RyaWRlICogbVZTdHJpZGUgKiA1IC8gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IG1TdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IG1TdHJpZGUgKiBtVlN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tQ29sSW5jID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tUm93SW5jID0gbVN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gbVN0cmlkZSAqIG1WU3RyaWRlICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tQ29sSW5jID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gbVN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogaW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgWVVWIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVVkE7CisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbiBTREsgWVVWQSBmb3JtYXQKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBpbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBZVVZBIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1lZGlhIGltYWdlCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IGluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQiBsYXlvdXQiLCBtQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gMykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFJHQiBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQkE7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBtZWRpYSBpbWFnZQorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJHQkFGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1I4ODg4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQkEgbGF5b3V0IiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBSR0JBIGxheW91dCIsIGxheW91dC5udW1QbGFuZXMpOworICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047CisgICAgICAgICAgICAgICAgQUxPR0QoIlVua25vd24gbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVkaWFJbWFnZS0+bU51bVBsYW5lcyA9IGxheW91dC5udW1QbGFuZXM7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1XaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgbWVkaWFJbWFnZS0+bUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1CaXREZXB0aCA9IGJpdERlcHRoOworICAgICAgICBtZWRpYUltYWdlLT5tQml0RGVwdGhBbGxvY2F0ZWQgPSBtQWxsb2NhdGVkRGVwdGg7CisKKyAgICAgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsYXlvdXQubnVtUGxhbmVzOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICBpZiAocGxhbmUuYWxsb2NhdGVkRGVwdGggPCBwbGFuZS5iaXREZXB0aAorICAgICAgICAgICAgICAgICAgICB8fCBwbGFuZS5yaWdodFNoaWZ0ICE9IHBsYW5lLmFsbG9jYXRlZERlcHRoIC0gcGxhbmUuYml0RGVwdGgpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgicmlnaHRTaGlmdCB2YWx1ZSBvZiAldSB1bnN1cHBvcnRlZCIsIHBsYW5lLnJpZ2h0U2hpZnQpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBsYW5lLmFsbG9jYXRlZERlcHRoID4gOCAmJiBwbGFuZS5lbmRpYW5uZXNzICE9IEMyUGxhbmVJbmZvOjpOQVRJVkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZW5kaWFubmVzcyB2YWx1ZSBvZiAldSB1bnN1cHBvcnRlZCIsIHBsYW5lLmVuZGlhbm5lc3MpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBsYW5lLmFsbG9jYXRlZERlcHRoICE9IG1BbGxvY2F0ZWREZXB0aCB8fCBwbGFuZS5iaXREZXB0aCAhPSBiaXREZXB0aCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJkaWZmZXJlbnQgYWxsb2NhdGVkRGVwdGgvYml0RGVwdGggcGVyIHBsYW5lIHVuc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJTaXplICs9IG1TdHJpZGUgKiBtVlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAvIHBsYW5lLnJvd1NhbXBsaW5nIC8gcGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgIH0KKworICAgICAgICBtQmFja0J1ZmZlclNpemUgPSBidWZmZXJTaXplOworICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gbUluaXRDaGVjazsgfQorCisgICAgdWludDMyX3QgYmFja0J1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBtQmFja0J1ZmZlclNpemU7IH0KKworICAgIC8qKgorICAgICAqIFdyYXAgQzJHcmFwaGljVmlldyB1c2luZyBhIE1lZGlhSW1hZ2UyLiBOb3RlIHRoYXQgaWYgbm90IHdyYXBwZWQsIHRoZSBjb250ZW50IGlzIG5vdCBtYXBwZWQKKyAgICAgKiBpbiB0aGlzIGZ1bmN0aW9uIC0tLSB0aGUgY2FsbGVyIHNob3VsZCB1c2UgQ29weUdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2UoKSBmdW5jdGlvbiB0byBjb3B5IHRoZQorICAgICAqIGRhdGEgaW50byBhIGJhY2tpbmcgYnVmZmVyIGV4cGxpY2l0bHkuCisgICAgICoKKyAgICAgKiBccmV0dXJuIG1lZGlhIGJ1ZmZlci4gVGhpcyBpcyBudWxsIGlmIHdyYXBwaW5nIGZhaWxlZC4KKyAgICAgKi8KKyAgICBzcDxBQnVmZmVyPiB3cmFwKCkgY29uc3QgeworICAgICAgICBpZiAobUJhY2tCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgc2V0QmFja0J1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYmFja0J1ZmZlcikgeworICAgICAgICBpZiAoYmFja0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhY2tCdWZmZXItPmNhcGFjaXR5KCkgPCBtQmFja0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBiYWNrQnVmZmVyLT5zZXRSYW5nZSgwLCBtQmFja0J1ZmZlclNpemUpOworICAgICAgICBtQmFja0J1ZmZlciA9IGJhY2tCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgQzJHcmFwaGljVmlldyB0byBNZWRpYUltYWdlMi4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjb3B5VG9NZWRpYUltYWdlKCkgeworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEltYWdlQ29weShtQmFja0J1ZmZlci0+YmFzZSgpLCBnZXRNZWRpYUltYWdlKCksIG1WaWV3KTsKKyAgICB9CisKKyAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhKCkgY29uc3QgeyByZXR1cm4gbU1lZGlhSW1hZ2U7IH0KKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgY29uc3QgQzJHcmFwaGljVmlldyBtVmlldzsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90IG1Db2xvckZvcm1hdDsgIC8vLzwgU0RLIGNvbG9yIGZvcm1hdCBmb3IgTWVkaWFJbWFnZQorICAgIHNwPEFCdWZmZXI+IG1XcmFwcGVkOyAgLy8vPCB3cmFwcGVkIGJ1ZmZlciAoaWYgd2UgY2FuIG1hcCBDMkJ1ZmZlciB0byBhbiBBQnVmZmVyKQorICAgIHVpbnQzMl90IG1BbGxvY2F0ZWREZXB0aDsKKyAgICB1aW50MzJfdCBtQmFja0J1ZmZlclNpemU7CisgICAgc3A8QUJ1ZmZlcj4gbU1lZGlhSW1hZ2U7CisgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBtQWxsb2M7CisKKyAgICBzcDxBQnVmZmVyPiBtQmFja0J1ZmZlcjsgICAgLy8vPCBiYWNraW5nIGJ1ZmZlciBpZiB3ZSBoYXZlIHRvIGNvcHkgQzJCdWZmZXIgPD0+IEFCdWZmZXIKKworICAgIE1lZGlhSW1hZ2UyICpnZXRNZWRpYUltYWdlKCkgeworICAgICAgICByZXR1cm4gKE1lZGlhSW1hZ2UyICopbU1lZGlhSW1hZ2UtPmJhc2UoKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gR3JhcGhpY0Jsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpIHsKKyAgICBDMkdyYXBoaWNWaWV3IHZpZXcoYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJDMkdyYXBoaWNCbG9jazo6bWFwIGZhaWxlZDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcih2aWV3LCBjb2xvckZvcm1hdCk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBib29sIHdyYXBwZWQgPSB0cnVlOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IGNvbnZlcnRlci53cmFwKCk7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGJ1ZmZlciA9IGFsbG9jKGNvbnZlcnRlci5iYWNrQnVmZmVyU2l6ZSgpKTsKKyAgICAgICAgaWYgKCFjb252ZXJ0ZXIuc2V0QmFja0J1ZmZlcihidWZmZXIpKSB7CisgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyIGZhaWxlZCB0byBzZXQgYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHdyYXBwZWQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICBzdGQ6Om1vdmUodmlldyksCisgICAgICAgICAgICBibG9jaywKKyAgICAgICAgICAgIGNvbnZlcnRlci5pbWFnZURhdGEoKSwKKyAgICAgICAgICAgIHdyYXBwZWQpOworfQorCitHcmFwaGljQmxvY2tCdWZmZXI6OkdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIEMyR3JhcGhpY1ZpZXcgJiZ2aWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSwKKyAgICAgICAgYm9vbCB3cmFwcGVkKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgYnVmZmVyKSwKKyAgICAgIG1WaWV3KHZpZXcpLAorICAgICAgbUJsb2NrKGJsb2NrKSwKKyAgICAgIG1XcmFwcGVkKHdyYXBwZWQpIHsKKyAgICBzZXRJbWFnZURhdGEoaW1hZ2VEYXRhKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBHcmFwaGljQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgdWludDMyX3Qgd2lkdGggPSBtVmlldy53aWR0aCgpOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1WaWV3LmhlaWdodCgpOworICAgIGlmICghbVdyYXBwZWQpIHsKKyAgICAgICAgKHZvaWQpSW1hZ2VDb3B5KG1WaWV3LCBiYXNlKCksIGltYWdlRGF0YSgpKTsKKyAgICB9CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgbUJsb2NrLT5zaGFyZShDMlJlY3Qod2lkdGgsIGhlaWdodCksIEMyRmVuY2UoKSkpOworfQorCisvLyBHcmFwaGljTWV0YWRhdGFCdWZmZXIKK0dyYXBoaWNNZXRhZGF0YUJ1ZmZlcjo6R3JhcGhpY01ldGFkYXRhQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2MpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpKSwKKyAgICAgIG1BbGxvYyhhbGxvYykgeworICAgICgoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWJhc2UoKSktPnBCdWZmZXIgPSBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyNpZm5kZWYgX19MUDY0X18KKyAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICptZXRhID0gKFZpZGVvTmF0aXZlTWV0YWRhdGEgKiliYXNlKCk7CisgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmZmVyID0gKEFOYXRpdmVXaW5kb3dCdWZmZXIgKiltZXRhLT5wQnVmZmVyOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiVmlkZW9OYXRpdmVNZXRhZGF0YSBjb250YWlucyBudWxsIGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBBTE9HVigiVmlkZW9OYXRpdmVNZXRhZGF0YTogJWR4JWQiLCBidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCk7CisgICAgQzJIYW5kbGUgKmhhbmRsZSA9IFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgYnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICBidWZmZXItPndpZHRoLAorICAgICAgICAgICAgYnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICBidWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgIGJ1ZmZlci0+dXNhZ2UsCisgICAgICAgICAgICBidWZmZXItPnN0cmlkZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvYy0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIHdyYXAgVmlkZW9OYXRpdmVNZXRhZGF0YSBpbnRvIEMyR3JhcGhpY0FsbG9jYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisKKyAgICBtZXRhLT5wQnVmZmVyID0gMDsKKyAgICAvLyBUT0RPOiBmZW5jZQorICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGJsb2NrLT5zaGFyZShDMlJlY3QoYnVmZmVyLT53aWR0aCwgYnVmZmVyLT5oZWlnaHQpLCBDMkZlbmNlKCkpKTsKKyNlbHNlCisgICAgQUxPR0UoIkdyYXBoaWNNZXRhZGF0YUJ1ZmZlciBkb2VzIG5vdCB3b3JrIG9uIDY0LWJpdCBhcmNoIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYKK30KKworLy8gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKSB7CisgICAgaWYgKCFidWZmZXIKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUMKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0QoIkMyQnVmZmVyIHByZWNvbmQgZmFpbCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXcoc3RkOjptYWtlX3VuaXF1ZTxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiBob2xkZXI7CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigqdmlldywgY29sb3JGb3JtYXQpOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgYm9vbCB3cmFwcGVkID0gdHJ1ZTsKKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gY29udmVydGVyLndyYXAoKTsKKyAgICBpZiAoYUJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGFCdWZmZXIgPSBhbGxvYyhjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSk7CisgICAgICAgIGlmICghY29udmVydGVyLnNldEJhY2tCdWZmZXIoYUJ1ZmZlcikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgZmFpbGVkIHRvIHNldCBiYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgd3JhcHBlZCA9IGZhbHNlOworICAgICAgICBjb252ZXJ0ZXIuY29weVRvTWVkaWFJbWFnZSgpOworICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSB2aWV3LgorICAgICAgICBob2xkZXIgPSBzdGQ6Om1vdmUodmlldyk7CisgICAgfQorICAgIHJldHVybiBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBhQnVmZmVyLAorICAgICAgICAgICAgc3RkOjptb3ZlKHZpZXcpLAorICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgY29udmVydGVyLmltYWdlRGF0YSgpLAorICAgICAgICAgICAgd3JhcHBlZCk7Cit9CisKKy8vIHN0YXRpYworc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgIHx8ICFmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgQUxPR0QoImZvcm1hdCBoYWQgbm8gd2lkdGggLyBoZWlnaHQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIoYWxsb2Mod2lkdGggKiBoZWlnaHQgKiA0KSk7CisgICAgcmV0dXJuIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGFCdWZmZXIsCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICBmYWxzZSk7Cit9CisKK0NvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhQnVmZmVyLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gJiZ2aWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEsCisgICAgICAgIGJvb2wgd3JhcHBlZCkKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIGFCdWZmZXIpLAorICAgICAgbVZpZXcoc3RkOjptb3ZlKHZpZXcpKSwKKyAgICAgIG1CdWZmZXJSZWYoYnVmZmVyKSwKKyAgICAgIG1XcmFwcGVkKHdyYXBwZWQpIHsKKyAgICBzZXRJbWFnZURhdGEoaW1hZ2VEYXRhKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICBtVmlldy5yZXNldCgpOworICAgIHJldHVybiBzdGQ6Om1vdmUobUJ1ZmZlclJlZik7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKG1XcmFwcGVkIHx8IG1CdWZmZXJSZWYpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiAlc3dyYXBwZWQgOyBidWZmZXIgcmVmICVzIiwKKyAgICAgICAgICAgICAgICBtV3JhcHBlZCA/ICIiIDogIm5vdCAiLCBtQnVmZmVyUmVmID8gImV4aXN0cyIgOiAiZG9lc24ndCBleGlzdCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gY29weSwgc28gd2UgY2FuIGNvcHkgYnkgZG9pbmcgbm90aGluZy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogYnVmZmVyIHByZWNvbmRpdGlvbiB1bnNhdGlzZmllZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogdG9vIG1hbnkgYmxvY2tzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgLy8gRklYTUU6IGZvcm1hdCgpIGlzIG5vdCBjb25zdCwgYnV0IHdlIGNhbm5vdCBjaGFuZ2UgaXQsIHNvIGRvIGEgY29uc3QgY2FzdCBoZXJlCisgICAgY29uc3RfY2FzdDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciAqPih0aGlzKS0+Zm9ybWF0KCktPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLCBjb2xvckZvcm1hdCk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBpbnN1ZmZpY2llbnQgY2FwYWNpdHk6IHJlcSAldSBoYXMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHNldFJhbmdlKDAsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgIGZvcm1hdCgpLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwgY29sb3JGb3JtYXQpOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjb3B5OiBjb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gbmV3IEFCdWZmZXIoYmFzZSgpLCBjYXBhY2l0eSgpKTsKKyAgICBpZiAoIWNvbnZlcnRlci5zZXRCYWNrQnVmZmVyKGFCdWZmZXIpKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y29weTogc2V0IGJhY2sgYnVmZmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnZlcnRlci5jb3B5VG9NZWRpYUltYWdlKCk7CisgICAgc2V0SW1hZ2VEYXRhKGNvbnZlcnRlci5pbWFnZURhdGEoKSk7CisgICAgbUJ1ZmZlclJlZiA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIKKworRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSwKKyAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIobWVtb3J5LT5wb2ludGVyKCksIG1lbW9yeS0+c2l6ZSgpKSksCisgICAgICBtQmxvY2soYmxvY2spLAorICAgICAgbU1lbW9yeShtZW1vcnkpLAorICAgICAgbUhlYXBTZXFOdW0oaGVhcFNlcU51bSkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKG1CbG9jay0+c2hhcmUob2Zmc2V0KCksIHNpemUoKSwgQzJGZW5jZSgpKSk7Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciAqc291cmNlKSB7CisgICAgc291cmNlLT5tU2hhcmVkTWVtb3J5ID0gbU1lbW9yeTsKKyAgICBzb3VyY2UtPm1IZWFwU2VxTnVtID0gbUhlYXBTZXFOdW07Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyICpzb3VyY2UpIHsKKyAgICBzc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIG1IaWRsTWVtb3J5ID0gaGFyZHdhcmU6OmZyb21IZWFwKG1NZW1vcnktPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSkpOworICAgIHNvdXJjZS0+aGVhcEJhc2UgPSAqbUhpZGxNZW1vcnk7CisgICAgc291cmNlLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgc291cmNlLT5zaXplID0gc2l6ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnQoCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkZWNyeXB0ZWQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBDMldyaXRlVmlldyB2aWV3ID0gbUJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZpZXcuc2l6ZSgpIDwgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KHZpZXcuZGF0YSgpLCBkZWNyeXB0ZWQtPnBvaW50ZXIoKSwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHNpemVfdCBsZW5ndGgpIHsKKyAgICByZXR1cm4gY29weURlY3J5cHRlZENvbnRlbnQobU1lbW9yeSwgbGVuZ3RoKTsKK30KKworbmF0aXZlX2hhbmRsZV90ICpFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQmxvY2stPmhhbmRsZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDYxOGFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfQlVGRkVSX0hfCisKKyNkZWZpbmUgQ09ERUMyX0JVRkZFUl9IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENvcGllcyBhIGdyYXBoaWMgdmlldyBpbnRvIGEgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBDb3BpZXMgYSBtZWRpYSBpbWFnZSBpbnRvIGEgZ3JhcGhpYyB2aWV3LgorICoKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkoQzJHcmFwaGljVmlldyAmdmlldywgY29uc3QgdWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKK2NsYXNzIENvZGVjMkJ1ZmZlciA6IHB1YmxpYyBNZWRpYUNvZGVjQnVmZmVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBNZWRpYUNvZGVjQnVmZmVyOjpNZWRpYUNvZGVjQnVmZmVyOworICAgIH5Db2RlYzJCdWZmZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuICBDMkJ1ZmZlciBvYmplY3QgcmVwcmVzZW50cyB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpID0gMDsKKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgd2UgY2FuIGNvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIGNvcHkuCisgICAgICogXHJldHVybiAgdHJ1ZSAgICBpZiB0aGUgY29udGVudCBvZiBidWZmZXIgY2FuIGJlIGNvcGllZCBvdmVyIHRvIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgZmFsc2UgICBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgICAgICh2b2lkKWJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0CisgICAgICogY2FuQ29weSgpIGNoZWNrIGFscmVhZHkgcGFzc2VkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyICBDMkJ1ZmZlciBvYmplY3QgdG8gY29weS4KKyAgICAgKiBccmV0dXJuICB0cnVlICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgKHZvaWQpYnVmZmVyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gZ2V0SW1hZ2VEYXRhKCkgY29uc3QgeyByZXR1cm4gbUltYWdlRGF0YTsgfQorCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogY2FuQ29weSgpIGltcGxlbWVudGF0aW9uIGZvciBsaW5lYXIgYnVmZmVycy4KKyAgICAgKi8KKyAgICBib29sIGNhbkNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIGNvcHkoKSBpbXBsZW1lbnRhdGlvbiBmb3IgbGluZWFyIGJ1ZmZlcnMuCisgICAgICovCisgICAgYm9vbCBjb3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBzZXRzIE1lZGlhSW1hZ2UgZGF0YSBmb3IgZmxleGlibGUgZ3JhcGhpYyBidWZmZXJzCisgICAgICovCisgICAgdm9pZCBzZXRJbWFnZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSk7CisKKyAgICBzcDxBQnVmZmVyPiBtSW1hZ2VEYXRhOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIG9uIHRvcCBvZiBsb2NhbCBsaW5lYXIgYnVmZmVyLiBUaGlzIGNhbm5vdAorICogY3Jvc3MgcHJvY2VzcyBib3VuZGFyeSBzbyBhc0MyQnVmZmVyKCkgcmV0dXJucyBvbmx5IG51bGxwdHIuCisgKi8KK2NsYXNzIExvY2FsTGluZWFyQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgdXNpbmcgQ29kZWMyQnVmZmVyOjpDb2RlYzJCdWZmZXI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CisgICAgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBvbmx5IGFzIGEgZHVtbXkgd3JhcHBlciBhcm91bmQgYQorICogQzJCdWZmZXIgb2JqZWN0LgorICovCitjbGFzcyBEdW1teUNvbnRhaW5lckJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIER1bW15Q29udGFpbmVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIgPSBudWxscHRyKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJMaW5lYXJCbG9jay4KKyAqLworY2xhc3MgTGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBMaW5lYXJCdWZmZXJCbG9jayB3cmFwcGluZyBhcm91bmQgQzJMaW5lYXJCbG9jayBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICBDMkxpbmVhckJsb2NrIG9iamVjdCB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIExpbmVhckJsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworCisgICAgdmlydHVhbCB+TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJXcml0ZVZpZXcgJiZ3cml0ZVZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKTsKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgQzJXcml0ZVZpZXcgbVdyaXRlVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbUJsb2NrOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkNvbnN0TGluZWFyQmxvY2suCisgKi8KK2NsYXNzIENvbnN0TGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdExpbmVhckJsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkJ1ZmZlciBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYnVmZmVyICBsaW5lYXIgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCByZWFkYWJsZSBtYXBwaW5nLgorICAgICAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIH5Db25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJSZWFkVmlldyAmJnJlYWRWaWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBDMlJlYWRWaWV3IG1SZWFkVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXJSZWY7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyR3JhcGhpY0Jsb2NrLgorICoKKyAqIFRoaXMgb2JqZWN0IGV4cG9zZXMgdGhlIHVuZGVybHlpbmcgYml0cyB2aWEgYWNjZXNzb3IgQVBJcyBhbmQgImltYWdlLWRhdGEiCisgKiBtZXRhZGF0YSwgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworY2xhc3MgR3JhcGhpY0Jsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgR3JhcGhpY0Jsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkdyYXBoaWNCbG9jayBvYmplY3QuCisgICAgICogSWYgfGJsb2NrfCBpcyBub3QgaW4gZ29vZCBjb2xvciBmb3JtYXRzLCBpdCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG92ZXIgYXQgYXNDMkJ1ZmZlcigpLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJsb2NrICAgQzJHcmFwaGljQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgR3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB+R3JhcGhpY0Jsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgJiZ2aWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICAgICAgYm9vbCB3cmFwcGVkKTsKKyAgICBHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIGlubGluZSBNZWRpYUltYWdlMiAqaW1hZ2VEYXRhKCkgeyByZXR1cm4gKE1lZGlhSW1hZ2UyICopbUltYWdlRGF0YS0+ZGF0YSgpOyB9CisKKyAgICBDMkdyYXBoaWNWaWV3IG1WaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbUJsb2NrOworICAgIGNvbnN0IGJvb2wgbVdyYXBwZWQ7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIFZpZGVvTmF0aXZlTWV0YWRhdGEuCisgKi8KK2NsYXNzIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIgd2l0aCBsb2NhbCBsaW5lYXIgYnVmZmVyIGZvcgorICAgICAqIFZpZGVvTmF0aXZlTWV0YWRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgICAgICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqLworICAgIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvYyk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgfkdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBHcmFwaGljTWV0YWRhdGFCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBncmFwaGljIEMyQnVmZmVyIG9iamVjdC4KKyAqCisgKiBUaGlzIG9iamVjdCBleHBvc2VzIHRoZSB1bmRlcmx5aW5nIGJpdHMgdmlhIGFjY2Vzc29yIEFQSXMgYW5kICJpbWFnZS1kYXRhIgorICogbWV0YWRhdGEsIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhdCBhbGxvY2F0aW9uIHRpbWUuCisgKi8KK2NsYXNzIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgd3JhcHBpbmcgYXJvdW5kIEMyQnVmZmVyIG9iamVjdC4KKyAgICAgKiBJZiB8YnVmZmVyfCBpcyBub3QgaW4gZ29vZCBjb2xvciBmb3JtYXRzLCBpdCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG9mIHxidWZmZXJ8IG92ZXIgdG8gZXhwb3NlLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgZ3JhcGhpYyBDMkJ1ZmZlciBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgYWxsb2MgICBhIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJhY2tpbmcgQUJ1ZmZlciBpZiBuZWVkZWQuCisgICAgICogXHJldHVybiAgICAgICAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCByZWFkYWJsZSBtYXBwaW5nLgorICAgICAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYyk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciB3aGljaCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG9mIHxidWZmZXJ8IG92ZXIgdG8gZXhwb3NlLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggbm8gd3JhcHBpbmcgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYyk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgfkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYUJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiAmJnZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICAgICAgYm9vbCB3cmFwcGVkKTsKKyAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgc3A8QUJ1ZmZlcj4gbUltYWdlRGF0YTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gbVZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyUmVmOworICAgIGNvbnN0IGJvb2wgbVdyYXBwZWQ7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyTGluZWFyQmxvY2sgZm9yIGNvbXBvbmVudAorICogYW5kIElNZW1vcnkgZm9yIGNsaWVudC4gVW5kZXJseWluZyBDMkxpbmVhckJsb2NrIHdvbid0IGJlIG1hcHBlZCBmb3Igc2VjdXJlCisgKiB1c2VjYXNlcy4uCisgKi8KK2NsYXNzIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEVuY3J5cHRlZExpbmVhckJ1ZmZlckJsb2NrIHdyYXBwaW5nIGFyb3VuZCBDMkxpbmVhckJsb2NrCisgICAgICogb2JqZWN0IGFuZCB3cml0YWJsZSBJTWVtb3J5IHJlZ2lvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgICAgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICAgICAgQzJMaW5lYXJCbG9jayBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgbWVtb3J5ICAgICAgSU1lbW9yeSBvYmplY3QgdG8gc3RvcmUgZW5jcnlwdGVkIGNvbnRlbnQuCisgICAgICogXHBhcmFtICAgaGVhcFNlcU51bSAgSGVhcCBzZXF1ZW5jZSBudW1iZXIgZnJvbSBJQ3J5cHRvOyAtMSBpZiBOL0EKKyAgICAgKi8KKyAgICBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnksCisgICAgICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0gPSAtMSk7CisgICAgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHZpcnR1YWwgfkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBGaWxsIHRoZSBzb3VyY2UgYnVmZmVyIHN0cnVjdHVyZSB3aXRoIGFwcHJvcHJpYXRlIHZhbHVlIGJhc2VkIG9uCisgICAgICogaW50ZXJuYWwgSU1lbW9yeSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gc291cmNlICBzb3VyY2UgYnVmZmVyIHN0cnVjdHVyZSB0byBmaWxsLgorICAgICAqLworICAgIHZvaWQgZmlsbFNvdXJjZUJ1ZmZlcihJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgKnNvdXJjZSk7CisgICAgdm9pZCBmaWxsU291cmNlQnVmZmVyKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgKnNvdXJjZSk7CisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50IG9mIHxkZWNyeXB0ZWR8IGludG8gQzJMaW5lYXJCbG9jayBpbnNpZGUuIFRoaXMgc2hhbGwKKyAgICAgKiBvbmx5IGJlIGNhbGxlZCBpbiBub24tc2VjdXJlIHVzZWNhc2VzLgorICAgICAqCisgICAgICogXHBhcmFtICAgZGVjcnlwdGVkICAgZGVjcnlwdGVkIGNvbnRlbnQgdG8gY29weSBmcm9tLgorICAgICAqIFxwYXJhbSAgIGxlbmd0aCAgICAgIGxlbmd0aCBvZiB0aGUgY29udGVudAorICAgICAqIFxyZXR1cm4gIHRydWUgICAgICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgICAgICBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBjb3B5RGVjcnlwdGVkQ29udGVudChjb25zdCBzcDxJTWVtb3J5PiAmZGVjcnlwdGVkLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgaW50ZXJuYWwgSU1lbW9yeSBvYmplY3QgaW50byBDMkxpbmVhckJsb2NrIGluc2lkZS4KKyAgICAgKiBUaGlzIHNoYWxsIG9ubHkgYmUgY2FsbGVkIGluIG5vbi1zZWN1cmUgdXNlY2FzZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBsZW5ndGggICAgICBsZW5ndGggb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBccmV0dXJuICB0cnVlICAgICAgICBpZiBzdWNjZXNzZnVsCisgICAgICogICAgICAgICAgZmFsc2UgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgY29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHNpemVfdCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIG5hdGl2ZSBoYW5kbGUgb2Ygc2VjdXJlIGJ1ZmZlciB1bmRlcnN0b29kIGJ5IElDcnlwdG8uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNlY3VyZSBidWZmZXIgaGFuZGxlCisgICAgICovCisgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSBjb25zdDsKKworcHJpdmF0ZToKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtQmxvY2s7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKyAgICBzcDxoYXJkd2FyZTo6SGlkbE1lbW9yeT4gbUhpZGxNZW1vcnk7CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkMGE5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkluZm9CdWlsZGVyIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPHN0cmluZ3MuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKworI2luY2x1ZGUgPE9NWF9BdWRpby5oPgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPE9NWF9UeXBlcy5oPgorI2luY2x1ZGUgPE9NWF9WaWRlby5oPgorI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE9ic2VydmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Tm9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorCisjaW5jbHVkZSAiQ29kZWMySW5mb0J1aWxkZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBUcmFpdHMgPSBDMkNvbXBvbmVudDo6VHJhaXRzOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2Jvb2wgaGFzUHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgICBzaXplX3QgcHJlZml4TGVuID0gc3RybGVuKHByZWZpeCk7CisgICAgcmV0dXJuIHMuY29tcGFyZSgwLCBwcmVmaXhMZW4sIHByZWZpeCkgPT0gMDsKK30KKworYm9vbCBoYXNTdWZmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGNvbnN0IGNoYXIqIHN1ZmZpeCkgeworICAgIHNpemVfdCBzdWZmaXhMZW4gPSBzdHJsZW4oc3VmZml4KTsKKyAgICByZXR1cm4gc3VmZml4TGVuID4gcy5zaXplKCkgPyBmYWxzZSA6CisgICAgICAgICAgICBzLmNvbXBhcmUocy5zaXplKCkgLSBzdWZmaXhMZW4sIHN1ZmZpeExlbiwgc3VmZml4KSA9PSAwOworfQorCit2b2lkIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciAqY2FwcywKKyAgICAgICAgY29uc3QgVHJhaXRzJiB0cmFpdCwgY29uc3Qgc3RkOjpzdHJpbmcgJm1lZGlhVHlwZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKHRyYWl0Lm1lZGlhVHlwZSk7CisgICAgLy8gaWYgd2UgZG9uJ3Qga25vdyB0aGUgbWVkaWEgdHlwZSwgcGFzcyB0aHJvdWdoIGFsbCB2YWx1ZXMgdW5tYXBwZWQKKworICAgIC8vIFRPRE86IHdlIGNhbm5vdCBmaW5kIGxldmVscyB0aGF0IGFyZSBsb2NhbCAnbWF4aW1hJyB3aXRob3V0IGtub3dpbmcgdGhlIGNvZGluZworICAgIC8vIGUuZy4gSC4yNjMgbGV2ZWwgNDUgYW5kIGxldmVsIDMwIGNvdWxkIGJlIHR3byB2YWx1ZXMgZm9yIGhpZ2hlc3QgbGV2ZWwgYXMKKyAgICAvLyB0aGV5IGRvbid0IGluY2x1ZGUgb25lIGFub3RoZXIuIEZvciBub3cgd2UgdXNlIHRoZSBsYXN0IHN1cHBvcnRlZCB2YWx1ZS4KKyAgICBib29sIGVuY29kZXIgPSB0cmFpdC5raW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvIHBsKGVuY29kZXIgLyogb3V0cHV0ICovLCAwdSk7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBwcm9maWxlUXVlcnkgPSB7CisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkKCZwbCwgJnBsLnByb2ZpbGUpKQorICAgIH07CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhwcm9maWxlUXVlcnksIEMyX0RPTlRfQkxPQ0spOworICAgIEFMT0dWKCJxdWVyeSBzdXBwb3J0ZWQgcHJvZmlsZXMgLT4gJXMgfCAlcyIsIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKHByb2ZpbGVRdWVyeVswXS5zdGF0dXMpKTsKKyAgICBpZiAoZXJyICE9IEMyX09LIHx8IHByb2ZpbGVRdWVyeVswXS5zdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdlIG9ubHkgaGFuZGxlIGVudW1lcmF0ZWQgdmFsdWVzCisgICAgaWYgKHByb2ZpbGVRdWVyeVswXS52YWx1ZXMudHlwZSAhPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyBIRFIKKyAgICBib29sIHN1cHBvcnRzSGRyID0gZmFsc2U7CisgICAgYm9vbCBzdXBwb3J0c0hkcjEwUGx1cyA9IGZhbHNlOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1EZXNjczsKKyAgICBjMl9zdGF0dXNfdCBlcnIxID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJnBhcmFtRGVzY3MpOworICAgIGlmIChlcnIxID09IEMyX09LKSB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKHVpbnQzMl90KWRlc2MtPmluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEU6CisgICAgICAgICAgICAgICAgc3VwcG9ydHNIZHIxMFBsdXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRToKKyAgICAgICAgICAgICAgICBzdXBwb3J0c0hkciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRm9yIFZQOSwgdGhlIHN0YXRpYyBpbmZvIGlzIGFsd2F5cyBwcm9wYWdhdGVkIGJ5IGZyYW1ld29yay4KKyAgICBzdXBwb3J0c0hkciB8PSAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOSk7CisKKyAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSBwcm9maWxlIDogcHJvZmlsZVF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMpIHsKKyAgICAgICAgcGwucHJvZmlsZSA9IChDMkNvbmZpZzo6cHJvZmlsZV90KXByb2ZpbGUucmVmPHVpbnQzMl90PigpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGVyciA9IGludGYtPmNvbmZpZyh7JnBsfSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgQUxPR1YoInNldCBwcm9maWxlIHRvICV1IC0+ICVzIiwgcGwucHJvZmlsZSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gbGV2ZWxRdWVyeSA9IHsKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudChDMlBhcmFtRmllbGQoJnBsLCAmcGwubGV2ZWwpKQorICAgICAgICB9OworICAgICAgICBlcnIgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhsZXZlbFF1ZXJ5LCBDMl9ET05UX0JMT0NLKTsKKyAgICAgICAgQUxPR1YoInF1ZXJ5IHN1cHBvcnRlZCBsZXZlbHMgLT4gJXMgfCAlcyIsIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKGxldmVsUXVlcnlbMF0uc3RhdHVzKSk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgfHwgbGV2ZWxRdWVyeVswXS5zdGF0dXMgIT0gQzJfT0sKKyAgICAgICAgICAgICAgICB8fCBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy50eXBlICE9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUworICAgICAgICAgICAgICAgIHx8IGxldmVsUXVlcnlbMF0udmFsdWVzLnZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDMlZhbHVlOjpQcmltaXRpdmUgbGV2ZWwgPSBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMuYmFjaygpOworICAgICAgICBwbC5sZXZlbCA9IChDMkNvbmZpZzo6bGV2ZWxfdClsZXZlbC5yZWY8dWludDMyX3Q+KCk7CisgICAgICAgIEFMT0dWKCJzdXBwb3J0aW5nIGxldmVsOiAldSIsIHBsLmxldmVsKTsKKyAgICAgICAgaW50MzJfdCBzZGtQcm9maWxlLCBzZGtMZXZlbDsKKyAgICAgICAgaWYgKG1hcHBlciAmJiBtYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpCisgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBMZXZlbChwbC5sZXZlbCwgJnNka0xldmVsKSkgeworICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKCh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgLy8gYWxzbyBsaXN0IEhEUiBwcm9maWxlcyBpZiBjb21wb25lbnQgc3VwcG9ydHMgSERSCisgICAgICAgICAgICBpZiAoc3VwcG9ydHNIZHIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGhkck1hcHBlciA9IEMyTWFwcGVyOjpHZXRIZHJQcm9maWxlTGV2ZWxNYXBwZXIodHJhaXQubWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoaGRyTWFwcGVyICYmIGhkck1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKCh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNIZHIxMFBsdXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaGRyTWFwcGVyID0gQzJNYXBwZXI6OkdldEhkclByb2ZpbGVMZXZlbE1hcHBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdC5tZWRpYVR5cGUsIHRydWUgLyppc0hkcjEwUGx1cyovKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhkck1hcHBlciAmJiBoZHJNYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIW1hcHBlcikgeworICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKHBsLnByb2ZpbGUsIHBsLmxldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvciBILjI2MyBhbHNvIGFkdmVydGlzZSB0aGUgc2Vjb25kIGhpZ2hlc3QgbGV2ZWwgaWYgdGhlCisgICAgICAgIC8vIGNvZGVjIHN1cHBvcnRzIGxldmVsIDQ1LCBhcyBsZXZlbCA0NSBvbmx5IGNvdmVycyBsZXZlbCAxMAorICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gc29tZSBmb3JtIG9mIGEgc2V0dGluZyBzbyBpdCBkb2VzIG5vdAorICAgICAgICAvLyBoYXZlIHRvIGJlIGhlcmUKKyAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IMjYzKSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBuZXh0TGV2ZWwgPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgdiA6IGxldmVsUXVlcnlbMF0udmFsdWVzLnZhbHVlcykgeworICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsID0gKEMyQ29uZmlnOjpsZXZlbF90KXYucmVmPHVpbnQzMl90PigpOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1ICYmIGxldmVsID4gbmV4dExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXh0TGV2ZWwgIT0gQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICAmJiBuZXh0TGV2ZWwgIT0gcGwubGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyCisgICAgICAgICAgICAgICAgICAgICYmIG1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBMZXZlbChuZXh0TGV2ZWwsICZzZGtMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBhZGRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciAqY2FwcywKKyAgICAgICAgY29uc3QgVHJhaXRzJiB0cmFpdCwgY29uc3Qgc3RkOjpzdHJpbmcgJm1lZGlhVHlwZSkgeworICAgICh2b2lkKWludGY7CisKKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGludGYoKSBhcyB3ZWxsLCBidXQgaG93IGRvIHdlIG1hcCB0aGVtIHRvCisgICAgLy8gTWVkaWFDb2RlYyBjb2xvciBmb3JtYXRzPworICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICBpZiAobWVkaWFUeXBlLmZpbmQoInZpZGVvIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgLy8gdmVuZG9yIHZpZGVvIGNvZGVjcyBwcmVmZXIgb3BhcXVlIGZvcm1hdAorICAgICAgICBpZiAodHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICB9CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcik7CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpOworICAgICAgICAvLyBmcmFtZXdvcmsgdmlkZW8gZW5jb2RlcnMgbXVzdCBzdXBwb3J0IHN1cmZhY2UgZm9ybWF0LCB0aG91Z2ggaXQgaXMgdW5jbGVhcgorICAgICAgICAvLyB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvIG1hcCBpdCBpZiBpdCBpcyBvcGFxdWUKKyAgICAgICAgaWYgKGVuY29kZXIgJiYgdHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK3N0YXR1c190IENvZGVjMkluZm9CdWlsZGVyOjpidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIHsKKyAgICAvLyBUT0RPOiBSZW1vdmUgcnVuLXRpbWUgY29uZmlndXJhdGlvbnMgb25jZSBhbGwgY29kZWNzIGFyZSB3b3JraW5nCisgICAgLy8gcHJvcGVybHkuIChBc3N1bWUgImZ1bGwiIGJlaGF2aW9yIGV2ZW50dWFsbHkuKQorICAgIC8vCisgICAgLy8gZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjIHN1cHBvcnRzIDUgdmFsdWVzLgorICAgIC8vICAgMCAtIE5vIENvZGVjIDIuMCBjb21wb25lbnRzIGFyZSBhdmFpbGFibGUuCisgICAgLy8gICAxIC0gQXVkaW8gZGVjb2RlcnMgYW5kIGVuY29kZXJzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZQorICAgIC8vICAgICAgIGFuZCByYW5rZWQgZmlyc3QuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIHdpdGgKKyAgICAvLyAgICAgICB0aGVpciBub3JtYWwgcmFua3MuCisgICAgLy8gICAgICAgQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIudmRhLiIgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbAorICAgIC8vICAgICAgIHJhbmtzLgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIHdpdGggc3VmZml4ICIuYXZjLmRlY29kZXIiIG9yICIuYXZjLmVuY29kZXIiCisgICAgLy8gICAgICAgYXJlIGF2YWlsYWJsZSBidXQgcmFua2VkIGxhc3QuCisgICAgLy8gICAyIC0gQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUgYW5kIHJhbmtlZAorICAgIC8vICAgICAgIGZpcnN0LgorICAgIC8vICAgICAgIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLnZkYS4iIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwKKyAgICAvLyAgICAgICByYW5rcy4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyB3aXRoIHN1ZmZpeCAiLmF2Yy5kZWNvZGVyIiBvciAiLmF2Yy5lbmNvZGVyIgorICAgIC8vICAgICAgIGFyZSBhdmFpbGFibGUgYnV0IHJhbmtlZCBsYXN0LgorICAgIC8vICAgMyAtIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIGFuZCByYW5rZWQKKyAgICAvLyAgICAgICBmaXJzdC4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsIHJhbmtzLgorICAgIC8vICAgNCAtIEFsbCBjb21wb25lbnRzIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwgcmFua3MuCisgICAgLy8KKyAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSAoYm9vdCB0aW1lKSBpcyAxLgorICAgIC8vCisgICAgLy8gTm90ZTogQ3VycmVudGx5LCBPTVggY29tcG9uZW50cyBoYXZlIGRlZmF1bHQgcmFuayAweDEwMCwgd2hpbGUgYWxsCisgICAgLy8gQ29kZWMyLjAgc29mdHdhcmUgY29tcG9uZW50cyBoYXZlIGRlZmF1bHQgcmFuayAweDIwMC4KKyAgICBpbnQgb3B0aW9uID0gOjphbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjIiwgMSk7CisKKyAgICAvLyBPYnRhaW4gQ29kZWMyQ2xpZW50CisgICAgc3RkOjp2ZWN0b3I8VHJhaXRzPiB0cmFpdHMgPSBDb2RlYzJDbGllbnQ6Okxpc3RDb21wb25lbnRzKCk7CisKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXIoCisgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFNlYXJjaERpcnMsCisgICAgICAgICAgICAibWVkaWFfY29kZWNzX2MyLnhtbCIsCisgICAgICAgICAgICAibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlX2MyLnhtbCIpOworICAgIGlmIChwYXJzZXIuZ2V0UGFyc2luZ1N0YXR1cygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJYTUwgcGFyc2VyIG5vIGdvb2QiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGZvciAoY29uc3QgVHJhaXRzJiB0cmFpdCA6IHRyYWl0cykgeworICAgICAgICBDMkNvbXBvbmVudDo6cmFua190IHJhbmsgPSB0cmFpdC5yYW5rOworCisgICAgICAgIC8vIEludGVyZmFjZSBtdXN0IGJlIGFjY2Vzc2libGUgZm9yIHVzIHRvIGxpc3QgdGhlIGNvbXBvbmVudCwgYW5kIHRoZXJlIGFsc28KKyAgICAgICAgLy8gbXVzdCBiZSBhbiBYTUwgZW50cnkgZm9yIHRoZSBjb2RlYy4gQ29kZWMgYWxpYXNlcyBsaXN0ZWQgaW4gdGhlIHRyYWl0cworICAgICAgICAvLyBhbGxvdyBhZGRpdGlvbmFsIFhNTCBlbnRyaWVzIHRvIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBhbGlhcy4gVGhlc2Ugd2lsbAorICAgICAgICAvLyBiZSBsaXN0ZWQgYXMgc2VwYXJhdGUgY29kZWNzLiBJZiBubyBYTUwgZW50cnkgaXMgc3BlY2lmaWVkIGZvciBhbiBhbGlhcywKKyAgICAgICAgLy8gdGhvc2Ugd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFkZGl0aW9uYWwgYWxpYXMgc3BlY2lmaWVkIGluIHRoZSBYTUwgZW50cnkKKyAgICAgICAgLy8gZm9yIHRoZSBpbnRlcmZhY2UgbmFtZS4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVBbmRBbGlhc2VzID0gdHJhaXQuYWxpYXNlczsKKyAgICAgICAgbmFtZUFuZEFsaWFzZXMuaW5zZXJ0KG5hbWVBbmRBbGlhc2VzLmJlZ2luKCksIHRyYWl0Lm5hbWUpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lT3JBbGlhcyA6IG5hbWVBbmRBbGlhc2VzKSB7CisgICAgICAgICAgICBib29sIGlzQWxpYXMgPSB0cmFpdC5uYW1lICE9IG5hbWVPckFsaWFzOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmID0KKyAgICAgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUludGVyZmFjZUJ5TmFtZShuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgIGlmICghaW50ZikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgY3JlYXRlIGludGVyZmFjZSBmb3IgJXMnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxpYXMgPyAiYWxpYXMgIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyc2VyLmdldENvZGVjTWFwKCkuY291bnQobmFtZU9yQWxpYXMpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNBbGlhcykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGJhc2VDb2RlY0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5maW5kTWVkaWFDb2RlY0luZm8odHJhaXQubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlQ29kZWNJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYWxpYXMgJyVzJyBub3QgZm91bmQgaW4geG1sIGJ1dCBjYW5vbmljYWwgY29kZWMgaW5mbyAnJXMnIG1pc3NpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdC5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImFsaWFzICclcycgbm90IGZvdW5kIGluIHhtbDsgdXNlIGFuIFhNTCA8QWxpYXM+IHRhZyBmb3IgdGhpcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxpYXMgaW50byBleGlzdGluZyBjb2RlYworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUNvZGVjSW5mby0+YWRkQWxpYXMobmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcG9uZW50ICclcycgbm90IGZvdW5kIGluIHhtbCIsIHRyYWl0Lm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2Fub25OYW1lID0gdHJhaXQubmFtZTsKKworICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgYmxvY2sgb25jZSBhbGwgY29kZWNzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIudmRhLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLmFuZHJvaWQuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWl0LmRvbWFpbiA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZGVjb2RlciIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5lbmNvZGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUocmFuayk+OjptYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIudmRhLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLmFuZHJvaWQuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZGVjb2RlciIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5lbmNvZGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUocmFuayk+OjptYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIuYW5kcm9pZC4iKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJhZGRpbmcgY29kZWMgZW50cnkgZm9yICclcyciLCBuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gY29kZWNJbmZvID0gd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpOworICAgICAgICAgICAgY29kZWNJbmZvLT5zZXROYW1lKG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRPd25lcigoImNvZGVjMjo6IiArIHRyYWl0Lm93bmVyKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgJmNvZGVjID0KKyAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0Q29kZWNNYXAoKS5hdChuYW1lT3JBbGlhcyk7CisKKyAgICAgICAgICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRycyA9IDA7CisKKyAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNFbmNvZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWl0Lm93bmVyID09ICJzb2Z0d2FyZSIpIHsKKyAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1NvZnR3YXJlT25seTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNWZW5kb3I7CisgICAgICAgICAgICAgICAgaWYgKHRyYWl0Lm93bmVyID09ICJ2ZW5kb3Itc29mdHdhcmUiKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzU29mdHdhcmVPbmx5OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWMucXVpcmtTZXQuZmluZCgiYXR0cmlidXRlOjpzb2Z0d2FyZS1jb2RlYyIpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBjb2RlYy5xdWlya1NldC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRBdHRyaWJ1dGVzKGF0dHJzKTsKKyAgICAgICAgICAgIGlmICghY29kZWMucmFuay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeG1sUmFuazsKKyAgICAgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgICAgIGlmIChzc2NhbmYoY29kZWMucmFuay5jX3N0cigpLCAiJXUlYyIsICZ4bWxSYW5rLCAmZHVtbXkpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHhtbFJhbms7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRSYW5rKHJhbmspOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZhbGlhcyA6IGNvZGVjLmFsaWFzZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWRkaW5nIGFsaWFzICclcyciLCBhbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb2RlY0luZm8tPmFkZEFsaWFzKGFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGF1dG8gdHlwZUl0ID0gY29kZWMudHlwZU1hcC5iZWdpbigpOyB0eXBlSXQgIT0gY29kZWMudHlwZU1hcC5lbmQoKTsgKyt0eXBlSXQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlID0gdHlwZUl0LT5maXJzdDsKKyAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZhdHRyTWFwID0gdHlwZUl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQorICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm8tPmFkZE1lZGlhVHlwZShtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGF0dHJJdCA9IGF0dHJNYXAuYmVnaW4oKTsgYXR0ckl0ICE9IGF0dHJNYXAuZW5kKCk7ICsrYXR0ckl0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleSwgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGllKGtleSwgdmFsdWUpID0gKmF0dHJJdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5maW5kKCJmZWF0dXJlLSIpID09IDAgJiYga2V5LmZpbmQoImZlYXR1cmUtYml0cmF0ZS1tb2RlcyIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW50VmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHRyYWlsaW5nIGJhZCBjaGFyYWN0ZXJzIGFuZCBkZWZhdWx0IHRvIDAuCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClzc2NhbmYodmFsdWUuY19zdHIoKSwgIiVkIiwgJmludFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZERldGFpbChrZXkuY19zdHIoKSwgaW50VmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKGtleS5jX3N0cigpLCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICAgICAgYWRkU3VwcG9ydGVkQ29sb3JGb3JtYXRzKGludGYsIGNhcHMuZ2V0KCksIHRyYWl0LCBtZWRpYVR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiBhbmRyb2lkOjpNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICpDcmVhdGVCdWlsZGVyKCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6Q29kZWMySW5mb0J1aWxkZXI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzE4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSU5GT19CVUlMREVSX0hfCisjZGVmaW5lIENPREVDMl9JTkZPX0JVSUxERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ29kZWMySW5mb0J1aWxkZXIgOiBwdWJsaWMgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSB7CitwdWJsaWM6CisgICAgQ29kZWMySW5mb0J1aWxkZXIoKSA9IGRlZmF1bHQ7CisgICAgfkNvZGVjMkluZm9CdWlsZGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworICAgIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9JTkZPX0JVSUxERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzRlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTlBVVF9TVVJGQUNFX1dSQVBQRVJfSF8KKyNkZWZpbmUgSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFdyYXBwZXIgaW50ZXJmYWNlIGFyb3VuZCBJbnB1dFN1cmZhY2UuCisgKi8KK2NsYXNzIElucHV0U3VyZmFjZVdyYXBwZXIgeworcHVibGljOgorICAgIElucHV0U3VyZmFjZVdyYXBwZXIoKQorICAgICAgICA6IG1EYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlV3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdGhlIHN1cmZhY2Ugd2l0aCB8Y29tcHwuIEEgc3VyZmFjZSBjYW4KKyAgICAgKiBjb25uZWN0IHRvIGF0IG1vc3Qgb25lIGNvbXBvbmVudCBhdCBhIHRpbWUuCisgICAgICoKKyAgICAgKiBccmV0dXJuIE9LICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB8Y29tcHwKKyAgICAgKiBccmV0dXJuIEFMUkVBRFlfRVhJU1RTICAgYWxyZWFkeSBjb25uZWN0ZWQgdG8gYW5vdGhlciBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCkgPSAwOworCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCB0aGUgc3VyZmFjZSBmcm9tIHRoZSBjb21wb25lbnQgaWYgYW55LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgPSAwOworCisgICAgLyoqCisgICAgICogU3RhcnQgcHVzaGluZyBidWZmZXJzIHRvIHRoZSBzdXJmYWNlLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWY6IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgPSAwOworCisgICAgLy8vIElucHV0IFN1cmZhY2UgY29uZmlndXJhdGlvbgorICAgIHN0cnVjdCBDb25maWcgeworICAgICAgICAvLyBJTiBQQVJBTVMgKEdCUykKKyAgICAgICAgZmxvYXQgbU1pbkZwczsgLy8gbWluaW11bSBmcHMgKHJlcGVhdCBmcmFtZSB0byBhY2hpZXZlIHRoaXMpCisgICAgICAgIGZsb2F0IG1NYXhGcHM7IC8vIG1heCBmcHMgKHZpYSBmcmFtZSBkcm9wKQorICAgICAgICBmbG9hdCBtQ2FwdHVyZUZwczsgLy8gY2FwdHVyZSBmcHMKKyAgICAgICAgZmxvYXQgbUNvZGVkRnBzOyAgIC8vIGNvZGVkIGZwcworICAgICAgICBib29sIG1TdXNwZW5kZWQ7IC8vIHN1c3BlbmRlZAorICAgICAgICBpbnQ2NF90IG1UaW1lT2Zmc2V0VXM7IC8vIHRpbWUgb2Zmc2V0IChpbnB1dCA9PiBjb2RlYykKKyAgICAgICAgaW50NjRfdCBtU3VzcGVuZEF0VXM7IC8vIHN1c3BlbmQvcmVzdW1lIHRpbWUKKyAgICAgICAgaW50NjRfdCBtU3RhcnRBdFVzOyAvLyBzdGFydCB0aW1lCisgICAgICAgIGJvb2wgbVN0b3BwZWQ7IC8vIHN0b3BwZWQKKyAgICAgICAgaW50NjRfdCBtU3RvcEF0VXM7IC8vIHN0b3AgdGltZQorCisgICAgICAgIC8vIE9VVCBQQVJBTVMgKEdCUykKKyAgICAgICAgaW50NjRfdCBtSW5wdXREZWxheVVzOyAvLyBkZWxheSBiZXR3ZWVuIGVuY29kZXIgaW5wdXQgYW5kIHN1cmZhY2UgaW5wdXQKKworICAgICAgICAvLyBJTiBQQVJBTVMgKENPREVDIFdSQVBQRVIpCisgICAgICAgIGZsb2F0IG1GaXhlZEFkanVzdGVkRnBzOyAvLyBmaXhlZCBmcHMgdmlhIFBUUyBtYW5pcHVsYXRpb24KKyAgICAgICAgZmxvYXQgbU1pbkFkanVzdGVkRnBzOyAvLyBtaW5pbXVtIGZwcyB2aWEgUFRTIG1hbmlwdWxhdGlvbgorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGlucHV0IHN1cmZhY2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gY29uZmlnIGNvbmZpZ3VyYXRpb24uIFRoaXMgY2FuIGJlIHVwZGF0ZWQgZHVyaW5nIHRoaXMgY2FsbCB0byBwcm92aWRlIG91dHB1dAorICAgICAqICAgICAgICAgICAgICAgcGFyYW1ldGVycywgYnV0IG5vdCB0byBwcm92aWRlIGNvbmZpZ3VyZWQgcGFyYW1ldGVycyAodG8gYXZvaWQgY29udGludWFsbHkKKyAgICAgKiAgICAgICAgICAgICAgIHJlY29uZmlndXJpbmcpCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcpID0gMDsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgZGVzaXJlZCBkYXRhIHNwYWNlLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGFTcGFjZSBkZXNpcmVkIGRhdGEgc3BhY2UKKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXREYXRhU3BhY2UoYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgICAgIG1EYXRhU3BhY2UgPSBkYXRhU3BhY2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbURhdGFTcGFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9QaXBlbGluZVdhdGNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODFkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJQaXBlbGluZVdhdGNoZXIiCisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiUGlwZWxpbmVXYXRjaGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OmlucHV0RGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtSW5wdXREZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OnBpcGVsaW5lRGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtUGlwZWxpbmVEZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6Om91dHB1dERlbGF5KHVpbnQzMl90IHZhbHVlKSB7CisgICAgbU91dHB1dERlbGF5ID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCitQaXBlbGluZVdhdGNoZXIgJlBpcGVsaW5lV2F0Y2hlcjo6c21vb3RobmVzc0ZhY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIG1TbW9vdGhuZXNzRmFjdG9yID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIFBpcGVsaW5lV2F0Y2hlcjo6b25Xb3JrUXVldWVkKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiAmJmJ1ZmZlcnMsCisgICAgICAgIGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZxdWV1ZWRBdCkgeworICAgIEFMT0dWKCJvbldvcmtRdWV1ZWQoZnJhbWVJbmRleD0lbGx1LCBidWZmZXJzKHNpemU9JXp1KSwgcXVldWVkQXQ9JWxsZCkiLAorICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCwKKyAgICAgICAgICBidWZmZXJzLnNpemUoKSwKKyAgICAgICAgICAobG9uZyBsb25nKXF1ZXVlZEF0LnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKKyAgICBhdXRvIGl0ID0gbUZyYW1lc0luUGlwZWxpbmUuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgIT0gbUZyYW1lc0luUGlwZWxpbmUuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIm9uV29ya1F1ZXVlZDogRHVwbGljYXRlIGZyYW1lIGluZGV4ICglbGx1KTsgcHJldmlvdXMgZW50cnkgcmVtb3ZlZCIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCk7CisgICAgICAgICh2b2lkKW1GcmFtZXNJblBpcGVsaW5lLmVyYXNlKGl0KTsKKyAgICB9CisgICAgKHZvaWQpbUZyYW1lc0luUGlwZWxpbmUudHJ5X2VtcGxhY2UoZnJhbWVJbmRleCwgc3RkOjptb3ZlKGJ1ZmZlcnMpLCBxdWV1ZWRBdCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gUGlwZWxpbmVXYXRjaGVyOjpvbklucHV0QnVmZmVyUmVsZWFzZWQoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSB7CisgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZChmcmFtZUluZGV4PSVsbHUsIGFycmF5SW5kZXg9JXp1KSIsCisgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICBhdXRvIGl0ID0gbUZyYW1lc0luUGlwZWxpbmUuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUZyYW1lc0luUGlwZWxpbmUuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZDogZnJhbWVJbmRleCBub3QgZm91bmQgKCVsbHUpOyBpZ25vcmVkIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChpdC0+c2Vjb25kLmJ1ZmZlcnMuc2l6ZSgpIDw9IGFycmF5SW5kZXgpIHsKKyAgICAgICAgQUxPR0QoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZDogYnVmZmVycyBhdCAlbGx1OiBzaXplICV6dSwgcmVxdWVzdGVkIGluZGV4OiAlenUiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgsIGl0LT5zZWNvbmQuYnVmZmVycy5zaXplKCksIGFycmF5SW5kZXgpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIoc3RkOjptb3ZlKGl0LT5zZWNvbmQuYnVmZmVyc1thcnJheUluZGV4XSkpOworICAgIEFMT0dEX0lGKCFidWZmZXIsICJvbklucHV0QnVmZmVyUmVsZWFzZWQ6IGJ1ZmZlciBhbHJlYWR5IHJlbGVhc2VkICglbGx1OiV6dSkiLAorICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKwordm9pZCBQaXBlbGluZVdhdGNoZXI6Om9uV29ya0RvbmUodWludDY0X3QgZnJhbWVJbmRleCkgeworICAgIEFMT0dWKCJvbldvcmtEb25lKGZyYW1lSW5kZXg9JWxsdSkiLCAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgpOworICAgIGF1dG8gaXQgPSBtRnJhbWVzSW5QaXBlbGluZS5maW5kKGZyYW1lSW5kZXgpOworICAgIGlmIChpdCA9PSBtRnJhbWVzSW5QaXBlbGluZS5lbmQoKSkgeworICAgICAgICBBTE9HRCgib25Xb3JrRG9uZTogZnJhbWVJbmRleCBub3QgZm91bmQgKCVsbHUpOyBpZ25vcmVkIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAodm9pZCltRnJhbWVzSW5QaXBlbGluZS5lcmFzZShpdCk7Cit9CisKK3ZvaWQgUGlwZWxpbmVXYXRjaGVyOjpmbHVzaCgpIHsKKyAgICBtRnJhbWVzSW5QaXBlbGluZS5jbGVhcigpOworfQorCitib29sIFBpcGVsaW5lV2F0Y2hlcjo6cGlwZWxpbmVGdWxsKCkgY29uc3QgeworICAgIGlmIChtRnJhbWVzSW5QaXBlbGluZS5zaXplKCkgPj0KKyAgICAgICAgICAgIG1JbnB1dERlbGF5ICsgbVBpcGVsaW5lRGVsYXkgKyBtT3V0cHV0RGVsYXkgKyBtU21vb3RobmVzc0ZhY3RvcikgeworICAgICAgICBBTE9HVigicGlwZWxpbmVGdWxsOiB0b28gbWFueSBmcmFtZXMgaW4gcGlwZWxpbmUgKCV6dSkiLCBtRnJhbWVzSW5QaXBlbGluZS5zaXplKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc2l6ZV90IHNpemVXaXRoSW5wdXRSZWxlYXNlZCA9IHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICBtRnJhbWVzSW5QaXBlbGluZS5iZWdpbigpLAorICAgICAgICAgICAgbUZyYW1lc0luUGlwZWxpbmUuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBkZWNsdHlwZShtRnJhbWVzSW5QaXBlbGluZSk6OnZhbHVlX3R5cGUgJnZhbHVlKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIgOiB2YWx1ZS5zZWNvbmQuYnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc2l6ZVdpdGhJbnB1dFJlbGVhc2VkID49CisgICAgICAgICAgICBtUGlwZWxpbmVEZWxheSArIG1PdXRwdXREZWxheSArIG1TbW9vdGhuZXNzRmFjdG9yKSB7CisgICAgICAgIEFMT0dWKCJwaXBlbGluZUZ1bGw6IHRvbyBtYW55IGZyYW1lcyBpbiBwaXBlbGluZSwgd2l0aCBpbnB1dCByZWxlYXNlZCAoJXp1KSIsCisgICAgICAgICAgICAgIHNpemVXaXRoSW5wdXRSZWxlYXNlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBBTE9HVigicGlwZWxpbmUgaGFzIHJvb20gKHRvdGFsOiAlenUsIGlucHV0IHJlbGVhc2VkOiAlenUpIiwKKyAgICAgICAgICBtRnJhbWVzSW5QaXBlbGluZS5zaXplKCksIHNpemVXaXRoSW5wdXRSZWxlYXNlZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpkdXJhdGlvbiBQaXBlbGluZVdhdGNoZXI6OmVsYXBzZWQoCisgICAgICAgIGNvbnN0IFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OnRpbWVfcG9pbnQgJm5vdywgc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBpZiAobUZyYW1lc0luUGlwZWxpbmUuc2l6ZSgpIDw9IG4pIHsKKyAgICAgICAgcmV0dXJuIENsb2NrOjpkdXJhdGlvbjo6emVybygpOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxDbG9jazo6ZHVyYXRpb24+IGR1cmF0aW9uczsKKyAgICBmb3IgKGNvbnN0IGRlY2x0eXBlKG1GcmFtZXNJblBpcGVsaW5lKTo6dmFsdWVfdHlwZSAmdmFsdWUgOiBtRnJhbWVzSW5QaXBlbGluZSkgeworICAgICAgICBDbG9jazo6ZHVyYXRpb24gZWxhcHNlZCA9IG5vdyAtIHZhbHVlLnNlY29uZC5xdWV1ZWRBdDsKKyAgICAgICAgQUxPR1YoImVsYXBzZWQ6IGZyYW1lSW5kZXggPSAlbGx1IGVsYXBzZWQgPSAlbGxkbXMiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXZhbHVlLmZpcnN0LAorICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihlbGFwc2VkKS5jb3VudCgpKTsKKyAgICAgICAgZHVyYXRpb25zLnB1c2hfYmFjayhlbGFwc2VkKTsKKyAgICB9CisgICAgc3RkOjpudGhfZWxlbWVudChkdXJhdGlvbnMuYmVnaW4oKSwgZHVyYXRpb25zLmVuZCgpLCBkdXJhdGlvbnMuYmVnaW4oKSArIG4sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmdyZWF0ZXI8Q2xvY2s6OmR1cmF0aW9uPigpKTsKKyAgICByZXR1cm4gZHVyYXRpb25zW25dOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjMxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUElQRUxJTkVfV0FUQ0hFUl9IXworI2RlZmluZSBQSVBFTElORV9XQVRDSEVSX0hfCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyV29yay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUGlwZWxpbmVXYXRjaGVyIHdhdGNoZXMgdGhlIHBpcGVsaW5lIGFuZCBpbmZlcnMgdGhlIHN0YXR1cyBvZiB3b3JrIGl0ZW1zIGZyb20KKyAqIGV2ZW50cy4KKyAqLworY2xhc3MgUGlwZWxpbmVXYXRjaGVyIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2sgQ2xvY2s7CisKKyAgICBQaXBlbGluZVdhdGNoZXIoKQorICAgICAgICA6IG1JbnB1dERlbGF5KDApLAorICAgICAgICAgIG1QaXBlbGluZURlbGF5KDApLAorICAgICAgICAgIG1PdXRwdXREZWxheSgwKSwKKyAgICAgICAgICBtU21vb3RobmVzc0ZhY3RvcigwKSB7fQorICAgIH5QaXBlbGluZVdhdGNoZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIG5ldyBpbnB1dCBkZWxheSB2YWx1ZQorICAgICAqIFxyZXR1cm4gIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgUGlwZWxpbmVXYXRjaGVyICZpbnB1dERlbGF5KHVpbnQzMl90IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgbmV3IHBpcGVsaW5lIGRlbGF5IHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJnBpcGVsaW5lRGVsYXkodWludDMyX3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBuZXcgb3V0cHV0IGRlbGF5IHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJm91dHB1dERlbGF5KHVpbnQzMl90IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgbmV3IHNtb290aG5lc3MgZmFjdG9yIHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJnNtb290aG5lc3NGYWN0b3IodWludDMyX3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogQ2xpZW50IHF1ZXVlZCBhIHdvcmsgaXRlbSB0byB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHBhcmFtIGZyYW1lSW5kZXggIGlucHV0IGZyYW1lIGluZGV4IG9mIHRoaXMgd29yaworICAgICAqIFxwYXJhbSBidWZmZXJzICAgICBpbnB1dCBidWZmZXJzIG9mIHRoZSBxdWV1ZWQgd29yayBpdGVtCisgICAgICogXHBhcmFtIHF1ZXVlZEF0ICAgIHRpbWUgd2hlbiB0aGUgY2xpZW50IHF1ZXVlZCB0aGUgYnVmZmVyCisgICAgICovCisgICAgdm9pZCBvbldvcmtRdWV1ZWQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gJiZidWZmZXJzLAorICAgICAgICAgICAgY29uc3QgQ2xvY2s6OnRpbWVfcG9pbnQgJnF1ZXVlZEF0KTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21wb25lbnQgcmVsZWFzZWQgaW5wdXQgYnVmZmVycyBmcm9tIGEgd29yayBpdGVtLgorICAgICAqCisgICAgICogXHBhcmFtIGZyYW1lSW5kZXggIGlucHV0IGZyYW1lIGluZGV4CisgICAgICogXHBhcmFtIGFycmF5SW5kZXggIGluZGV4IG9mIHRoZSBidWZmZXIgYXQgdGhlIG9yaWdpbmFsIHxidWZmZXJzfCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgICBvbldvcmtRdWV1ZWQoKS4KKyAgICAgKiBccmV0dXJuICBidWZmZXJzW2FycmF5SW5kZXhdCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBvbklucHV0QnVmZmVyUmVsZWFzZWQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcG9uZW50IGZpbmlzaGVkIHByb2Nlc3NpbmcgYSB3b3JrIGl0ZW0uCisgICAgICoKKyAgICAgKiBccGFyYW0gZnJhbWVJbmRleCAgaW5wdXQgZnJhbWUgaW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIG9uV29ya0RvbmUodWludDY0X3QgZnJhbWVJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgcGlwZWxpbmUuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgcGlwZWxpbmUgZG9lcyBub3QgbmVlZCBtb3JlIHdvcmsgaXRlbXMgdG8gcHJvY2VlZAorICAgICAqICAgICAgICAgICAgICAgIHNtb290aGx5LCBjb25zaWRlcmluZyBkZWxheXMgYW5kIHNtb290aG5lc3MgZmFjdG9yOworICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBpcGVsaW5lRnVsbCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGVsYXBzZWQgcHJvY2Vzc2luZyB0aW1lIG9mIGEgd29yayBpdGVtLCBudGggZnJvbSB0aGUgbG9uZ2VzdAorICAgICAqIHByb2Nlc3NpbmcgdGltZSB0byB0aGUgc2hvcnRlc3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gbm93IGN1cnJlbnQgdGltZXN0YW1wCisgICAgICogXHBhcmFtIG4gICBudGggd29yayBpdGVtLCBmcm9tIHRoZSBsb25nZXN0IHByb2Nlc3NpbmcgdGltZSB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIHNob3J0ZXN0LiBJdCdzIGEgMC1iYXNlZCBpbmRleC4KKyAgICAgKiBccmV0dXJuICBlbGFwc2VkIHByb2Nlc3NpbmcgdGltZSBvZiBudGggd29yayBpdGVtLgorICAgICAqLworICAgIENsb2NrOjpkdXJhdGlvbiBlbGFwc2VkKGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZub3csIHNpemVfdCBuKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtSW5wdXREZWxheTsKKyAgICB1aW50MzJfdCBtUGlwZWxpbmVEZWxheTsKKyAgICB1aW50MzJfdCBtT3V0cHV0RGVsYXk7CisgICAgdWludDMyX3QgbVNtb290aG5lc3NGYWN0b3I7CisKKyAgICBzdHJ1Y3QgRnJhbWUgeworICAgICAgICBGcmFtZShzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiAmJmIsCisgICAgICAgICAgICAgIGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZxKQorICAgICAgICAgICAgOiBidWZmZXJzKGIpLAorICAgICAgICAgICAgICBxdWV1ZWRBdChxKSB7fQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzOworICAgICAgICBjb25zdCBDbG9jazo6dGltZV9wb2ludCBxdWV1ZWRBdDsKKyAgICB9OworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBGcmFtZT4gbUZyYW1lc0luUGlwZWxpbmU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFBJUEVMSU5FX1dBVENIRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwZDRhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnN0cmluZyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3Q6OmRlYnVnU3RyaW5nKHNpemVfdCBpbmRlbnRfKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgaW5kZW50KGluZGVudF8sICcgJyk7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gczsKKyAgICBzIDw8ICJEaWN0IHsiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiAqdGhpcykgeworICAgICAgICBzIDw8IGluZGVudCA8PCAiICAiOworCisgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICB1aW50MzJfdCB1aW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICB1aW50NjRfdCB1aW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgICAgIGlmIChpdC5zZWNvbmQuZmluZCgmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYzJWYWx1ZS50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OklOVDMyOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmaW50MzJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjppMzIgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OlVJTlQzMjoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJnVpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OnUzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkNOVFIzMjoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCBjb3VudGVyIHZhbHVlIGFzIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJnVpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmMzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OklOVDY0OgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmaW50NjRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjppNjQgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OlVJTlQ2NDoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJnVpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OnU2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkNOVFI2NDoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCBjb3VudGVyIHZhbHVlIGFzIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KChjMl9jbnRyNjRfdCopJnVpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmM2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkZMT0FUOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmZmxvYXRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjpmbG9hdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGZsb2F0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGR1bXAgdW5zdXBwb3J0ZWQgdmFsdWVzIGZvciBkZWJ1Z2dpbmcsIHRoZXNlIHNob3VsZCBub3QgYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6dW5zdXBwb3J0ZWQgIiA8PCBpdC5maXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHMgPDwgImludDMyX3QgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0LnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiaW50NjRfdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDY0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAic3RyaW5nICIgPDwgaXQuZmlyc3QgPDwgIiA9IFwiIiA8PCBzdHJWYWx1ZS5jX3N0cigpIDw8ICJcIiI7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiQnVmZmVyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICI7CisgICAgICAgICAgICBpZiAoYnVmVmFsdWUgIT0gbnVsbHB0ciAmJiBidWZWYWx1ZS0+ZGF0YSgpICE9IG51bGxwdHIgJiYgYnVmVmFsdWUtPnNpemUoKSA8PSA2NCkgeworICAgICAgICAgICAgICAgIHMgPDwgInsiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHRtcDsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGJ1ZlZhbHVlLT5kYXRhKCksIGJ1ZlZhbHVlLT5zaXplKCksIGluZGVudF8gKyA0LCAmdG1wKTsKKyAgICAgICAgICAgICAgICBzIDw8IHRtcC5jX3N0cigpIDw8IGluZGVudCA8PCAiICB9IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA8PCAodm9pZCopYnVmVmFsdWUuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBkdW1wIHVuc3VwcG9ydGVkIHZhbHVlcyBmb3IgZGVidWdnaW5nLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCisgICAgICAgICAgICBzIDw8ICJ1bnN1cHBvcnRlZCAiIDw8IGl0LmZpcnN0OworICAgICAgICB9CisgICAgICAgIHMgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBzIDw8IGluZGVudCA8PCAifSI7CisKKyAgICByZXR1cm4gcy5zdHIoKTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmFkZFBhcmFtRGVzYygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZwYXJhbURlc2NzKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1EZXNjcykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0gcmVmbGVjdG9yLT5kZXNjcmliZSgKKyAgICAgICAgICAgICAgICBkZXNjLT5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKHN0cnVjdERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBkZXNjcmliZSAlcyIsIGRlc2MtPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGFkZFBhcmFtRGVzYyhkZXNjLCAqc3RydWN0RGVzYywgcmVmbGVjdG9yLCB0cnVlIC8qIG1hcmtWZW5kb3IgKi8pOworICAgIH0KKworICAgIC8vIFRFTVA6IGFsc28gYWRkIHZlbmRvciBwYXJhbWV0ZXJzIGFzIG5vbi12ZW5kb3IKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbURlc2NzKSB7CisgICAgICAgIGlmICghZGVzYy0+aW5kZXgoKS5pc1ZlbmRvcigpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0gcmVmbGVjdG9yLT5kZXNjcmliZSgKKyAgICAgICAgICAgICAgICBkZXNjLT5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKHN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtRGVzYyhkZXNjLCAqc3RydWN0RGVzYywgcmVmbGVjdG9yLCBmYWxzZSAvKiBtYXJrVmVuZG9yICovKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmFkZFBhcmFtU3RydWN0RGVzYygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBkZXNjLAorICAgICAgICBDMlN0cmluZyBwYXRoLAorICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnN0cnVjdERlc2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0RGVzYy5iZWdpbigpOyBpdCAhPSBzdHJ1Y3REZXNjLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEMyU3RyaW5nIGZpZWxkTmFtZSA9IHBhdGggKyAiLiIgKyBpdC0+bmFtZSgpOworICAgICAgICBpZiAoaXQtPnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgaWYgKHJlZmxlY3RvciA9PSBudWxscHRyIHx8IGl0LT5leHRlbnQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImlnbm9yZWQgc3RydWN0IGZpZWxkICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzY18gPSByZWZsZWN0b3ItPmRlc2NyaWJlKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXgoaXQtPnR5cGUoKSkuY29yZUluZGV4KCkpOworICAgICAgICAgICAgaWYgKHN0cnVjdERlc2NfID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IGRlc2NyaWJlIHN0cnVjdHVyZSBvZiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZFBhcmFtU3RydWN0RGVzYyhkZXNjLCBmaWVsZE5hbWUsIG9mZnNldCArIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoKml0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0RGVzY18sIHJlZmxlY3Rvcik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSBleHRlbnQgYW5kIHR5cGUKKyAgICAgICAgc3dpdGNoIChpdC0+dHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6CisgICAgICAgICAgICAgICAgaWYgKGl0LT5leHRlbnQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJleHRlbnQoKSAhPSAxIGZvciBzaW5nbGUgdmFsdWUgdHlwZTogJXMiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCB0eXBlOiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIlcyByZWdpc3RlcmVkIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAvLyBUT0RPOiBnZXQgdGhlIHByb3BlciBzaXplIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBmaWVsZHMuCisgICAgICAgIC8vIG9ubHkgaW5zZXJ0IGZpZWxkcyB0aGUgdmVyeSBmaXJzdCB0aW1lCisgICAgICAgIG1NYXAuZW1wbGFjZShmaWVsZE5hbWUsIEZpZWxkRGVzYyB7CisgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgICAgIGl0LT50eXBlKCksIGl0LT5leHRlbnQoKSwgaXQtPm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqaXQpLAorICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZSgqaXQpKSwKKyAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgfSk7CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6YWRkUGFyYW1EZXNjKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IGRlc2MsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsIGJvb2wgbWFya1ZlbmRvcikgeworICAgIEMyU3RyaW5nIHBhcmFtTmFtZSA9IGRlc2MtPm5hbWUoKTsKKworICAgIC8vIHByZWZpeCB2ZW5kb3IgcGFyYW1ldGVycworICAgIGlmIChkZXNjLT5pbmRleCgpLmlzVmVuZG9yKCkgJiYgbWFya1ZlbmRvcikgeworICAgICAgICBwYXJhbU5hbWUgPSAidmVuZG9yLiIgKyBwYXJhbU5hbWU7CisgICAgfQorICAgIG1QYXJhbU5hbWVzLmVtcGxhY2UoZGVzYy0+aW5kZXgoKSwgcGFyYW1OYW1lKTsKKworICAgIC8vIGFsc28gYWxsb3cgc2V0dGluZyB3aG9sZSBwYXJhbWV0ZXJzIGluIGEgYmluYXJ5IGZhc2hpb24gdmlhIEJ5dGVCdWZmZXIKKyAgICAvLyB0aGlzIGlzIG9wdC1pbiBmb3Igbm93CisgICAgYXV0byBpdCA9IG1XaG9sZVBhcmFtcy5maW5kKHBhcmFtTmFtZSk7CisgICAgaWYgKGl0ICE9IG1XaG9sZVBhcmFtcy5lbmQoKSAmJiBpdC0+c2Vjb25kLmNvcmVJbmRleCgpID09IGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgbU1hcC5lbXBsYWNlKHBhcmFtTmFtZSwgRmllbGREZXNjeyBkZXNjLCBudWxscHRyLCAwIC8qIG9mZnNldCAqLyB9KTsKKyAgICAgICAgLy8gZG9uJ3QgYWRkIGZpZWxkcyBvZiB3aG9sZSBwYXJhbWV0ZXJzLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYWRkUGFyYW1TdHJ1Y3REZXNjKGRlc2MsIHBhcmFtTmFtZSwgMCAvKiBvZmZzZXQgKi8sIHN0cnVjdERlc2MsIHJlZmxlY3Rvcik7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpzdXBwb3J0V2hvbGVQYXJhbShzdGQ6OnN0cmluZyBuYW1lLCBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICBtV2hvbGVQYXJhbXMuZW1wbGFjZShuYW1lLCBpbmRleCk7Cit9CisKK3N0ZDo6c3RyaW5nIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1OYW1lKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdCB7CisgICAgYXV0byBpdCA9IG1QYXJhbU5hbWVzLmZpbmQoaW5kZXgpOworICAgIGlmIChpdCAhPSBtUGFyYW1OYW1lcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXQ7CisgICAgcmV0IDw8ICI8dW5rbm93biAiIDw8IGluZGV4IDw8ICI+IjsKKyAgICByZXR1cm4gcmV0LnN0cigpOworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UoCisgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgeworICAgIENIRUNLKHZlYyAhPSBudWxscHRyKTsKKyAgICB2ZWMtPmNsZWFyKCk7CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgcGFyc2VNZXNzYWdlQW5kRG9Xb3JrKAorICAgICAgICAgICAgcGFyYW1zLAorICAgICAgICAgICAgWyZpbmRpY2VzXShjb25zdCBzdGQ6OnN0cmluZyAmLCBjb25zdCBGaWVsZERlc2MgJmRlc2MsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSB7CisgICAgICAgICAgICAgICAgaW5kaWNlcy5pbnNlcnQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgfSk7CisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCAmaW5kZXggOiBpbmRpY2VzKSB7CisgICAgICAgIHZlYy0+cHVzaF9iYWNrKGluZGV4KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbUluZGljZXNGb3JLZXlzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmtleXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0IHsKKyAgICBDSEVDSyh2ZWMgIT0gbnVsbHB0cik7CisgICAgdmVjLT5jbGVhcigpOworICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGtleU1hcChrZXlzLmJlZ2luKCksIGtleXMuZW5kKCkpOworCisgICAgQUxPR1YoImluIGdldFBhcmFtSW5kaWNlc0ZvcktleXMgd2l0aCAlenUga2V5cyBhbmQgbWFwIG9mICV6dSBlbnRyaWVzIiwKKyAgICAgICAgICAgIGtleU1hcC5zaXplKCksIG1NYXAuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBzdGQ6OnN0cmluZywgRmllbGREZXNjPiAma3YgOiBtTWFwKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lID0ga3YuZmlyc3Q7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzYyAmZGVzYyA9IGt2LnNlY29uZDsKKyAgICAgICAgQUxPR1YoImNvdW50IG9mICVzIGlzICV6dSIsIG5hbWUuY19zdHIoKSwga2V5TWFwLmNvdW50KG5hbWUpKTsKKyAgICAgICAgaWYgKGtleU1hcC5jb3VudChuYW1lKSA+IDApIHsKKyAgICAgICAgICAgIGluZGljZXMuaW5zZXJ0KGRlc2MucGFyYW1EZXNjLT5pbmRleCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggJmluZGV4IDogaW5kaWNlcykgeworICAgICAgICB2ZWMtPnB1c2hfYmFjayhpbmRleCk7CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6dXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UoCisgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0IHsKKyAgICBDSEVDSyh2ZWMgIT0gbnVsbHB0cik7CisKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+Kj4gcGFyYW1zTWFwOworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSA6ICp2ZWMpIHsKKyAgICAgICAgaWYgKHBhcmFtICYmICpwYXJhbSkgeworICAgICAgICAgICAgcGFyYW1zTWFwW3BhcmFtLT5pbmRleCgpXSA9ICZwYXJhbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhcnNlTWVzc2FnZUFuZERvV29yaygKKyAgICAgICAgICAgIHBhcmFtcywKKyAgICAgICAgICAgIFsmcGFyYW1zTWFwXShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29uc3QgRmllbGREZXNjICZkZXNjLCBjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICpwYXJhbSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgYXV0byBwYXJhbUl0ID0gcGFyYW1zTWFwLmZpbmQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbUl0ID09IHBhcmFtc01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiJXMgZm91bmQsIGJ1dCBwYXJhbSAjJWQgaXNuJ3QgcHJlc2VudCB0byB1cGRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgKGludDMyX3QpZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhcmFtID0gcGFyYW1JdC0+c2Vjb25kOworCisgICAgICAgICAgICAgICAgc3RydWN0IF9DMlBhcmFtIDogcHVibGljIEMyUGFyYW0geworICAgICAgICAgICAgICAgICAgICB1c2luZyBDMlBhcmFtOjpDMlBhcmFtOworICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbSh1aW50MzJfdCBzaXplLCB1aW50MzJfdCBpbmRleCkgOiBDMlBhcmFtKHNpemUsIGluZGV4KSB7IH0KKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBoYW5kbGUgd2hvbGUgcGFyYW0gdXBkYXRlcyBhcyBwYXJ0IG9mIGEgZmxleGlibGUgcGFyYW0gdXBkYXRlIHVzaW5nCisgICAgICAgICAgICAgICAgLy8gYSB6ZXJvIG9mZnNldC4KKyAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBzaXplX3QgbWluT2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgZGVzY3JpcHRvciBoYXMgYSBmaWVsZCwgdXNlIHRoZSBvZmZzZXQgYW5kIHNpemUgYW5kIGVuc3VyZSB0aGF0IG9mZnNldAorICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBwYXJ0IG9mIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy5maWVsZERlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluT2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSkgKyBkZXNjLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqZGVzYy5maWVsZERlc2MpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgb3IgdHJpbSBmbGV4aWJsZSBwYXJhbSAob3Igd2hvbGUgcGFyYW0pIGFzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmICghZGVzYy5maWVsZERlc2MgLyogd2hvbGUgcGFyYW0gKi8gfHwgZGVzYy5maWVsZERlc2MtPmV4dGVudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBwYXJhbSBpZiBtb3JlIHNwYWNlIGlzIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0tPmdldCgpLT5zaXplKCkgPCBvZmZzZXQgKyBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAtIG9mZnNldCB8fCBvZmZzZXQgPCBtaW5PZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIHRvbyBsb25nIG9yIG9mZnNldCB0b28gZWFybHkgLSBhYmFuZG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSAqbmV3UGFyYW0gPSAoQzJQYXJhbSAqKTo6b3BlcmF0b3IgbmV3KG9mZnNldCArIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IChuZXdQYXJhbSkgX0MyUGFyYW0ob2Zmc2V0ICsgc2l6ZSwgcGFyYW0tPmdldCgpLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobmV3UGFyYW0gKyAxLCBwYXJhbS0+Z2V0KCkgKyAxLCBvZmZzZXQgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnJlc2V0KG5ld1BhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS0+Z2V0KCktPnNpemUoKSA+IG9mZnNldCArIHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaW0gcGFyYW1ldGVyIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpUcmltUGFyYW0ocGFyYW0tPmdldCgpLCBvZmZzZXQgKyBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzYy5maWVsZERlc2MtPnR5cGUoKSA9PSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQikgeworICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIGZpbGwgYmxvYnMgaWYgdXBkYXRpbmcgd2l0aCBzbWFsbGVyIGJsb2IKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MuZmllbGREZXNjLT5leHRlbnQoKSA+IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodWludDhfdCAqKShwYXJhbS0+Z2V0KCkpICsgb2Zmc2V0ICsgc2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCkgLSBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKShwYXJhbS0+Z2V0KCkpICsgb2Zmc2V0LCBwdHIsIHNpemUpOworICAgICAgICAgICAgfSk7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpwYXJzZU1lc3NhZ2VBbmREb1dvcmsoCisgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nICYsIGNvbnN0IEZpZWxkRGVzYyAmLCBjb25zdCB2b2lkICosIHNpemVfdCk+IHdvcmspIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBzdGQ6OnN0cmluZywgRmllbGREZXNjPiAma3YgOiBtTWFwKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lID0ga3YuZmlyc3Q7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzYyAmZGVzYyA9IGt2LnNlY29uZDsKKyAgICAgICAgYXV0byBwYXJhbSA9IHBhcmFtcy5maW5kKG5hbWUpOworICAgICAgICBpZiAocGFyYW0gPT0gcGFyYW1zLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSB3aG9sZSBwYXJhbWV0ZXJzCisgICAgICAgIGlmICghZGVzYy5maWVsZERlc2MpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IHRtcDsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+c2Vjb25kLmZpbmQoJnRtcCkgJiYgdG1wICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBDMlBhcmFtICp0bXBBc1BhcmFtID0gQzJQYXJhbTo6RnJvbSh0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGlmICh0bXBBc1BhcmFtICYmIHRtcEFzUGFyYW0tPnR5cGUoKS50eXBlKCkgPT0gZGVzYy5wYXJhbURlc2MtPmluZGV4KCkudHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgdG1wLT5kYXRhKCksIHRtcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiUGFyYW0gYmxvYiBkb2VzIG5vdCBtYXRjaCBwYXJhbSBmb3IgJyVzJyAoJXAsICV4IHZzICV4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCB0bXBBc1BhcmFtLCB0bXBBc1BhcmFtID8gdG1wQXNQYXJhbS0+dHlwZSgpLnR5cGUoKSA6IDB4REVBRHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5wYXJhbURlc2MtPmluZGV4KCkudHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICBDMlZhbHVlIGMyVmFsdWU7CisKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBmaWVsZFR5cGUgPSBkZXNjLmZpZWxkRGVzYy0+dHlwZSgpOworICAgICAgICBzaXplX3QgZmllbGRFeHRlbnQgPSBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCk7CisgICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoJmludDMyVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQzMlZhbHVlLCBzaXplb2YoaW50MzJWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoKHVpbnQzMl90KikmaW50MzJWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDMyVmFsdWUsIHNpemVvZihpbnQzMlZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgoYzJfY250cjMyX3QqKSZpbnQzMlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQ2NFZhbHVlLCBzaXplb2YoaW50NjRWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoKHVpbnQ2NF90KikmaW50NjRWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDY0VmFsdWUsIHNpemVvZihpbnQ2NFZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgoYzJfY250cjY0X3QqKSZpbnQ2NFZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0VmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogeworICAgICAgICAgICAgICAgIGZsb2F0IHRtcDsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgmdG1wKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZ0bXAsIHNpemVvZih0bXApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IHsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHRtcDsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcmFtLT5zZWNvbmQuZmluZCgmdG1wKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkRXh0ZW50ID4gMCAmJiB0bXAuc2l6ZSgpID49IGZpZWxkRXh0ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdHJ1bmNhdGVkKHRtcCwgMCwgZmllbGRFeHRlbnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlN0cmluZyB2YWx1ZSB0b28gbG9uZyB0byBmaXQ6IG9yaWdpbmFsIFwiJXNcIiB0cnVuY2F0ZWQgdG8gXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAuY19zdHIoKSwgdHJ1bmNhdGVkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB0cnVuY2F0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgdG1wLmNfc3RyKCksIHRtcC5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjogeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IHRtcDsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcmFtLT5zZWNvbmQuZmluZCgmdG1wKSB8fCB0bXAgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmllbGRFeHRlbnQgPiAwICYmIHRtcC0+c2l6ZSgpID4gZmllbGRFeHRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkJsb2IgdmFsdWUgdG9vIGxvbmcgdG8gZml0LiBUcnVuY2F0aW5nLiIpOworICAgICAgICAgICAgICAgICAgICB0bXAtPnNldFJhbmdlKHRtcC0+b2Zmc2V0KCksIGZpZWxkRXh0ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCB0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dEKCJVbnN1cHBvcnRlZCBkYXRhIHR5cGUgZm9yICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0CitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFBhcmFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXNfKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtczsKKyAgICBwYXJhbXMucmVzaXplKHBhcmFtc18uc2l6ZSgpKTsKKyAgICBzdGQ6OnRyYW5zZm9ybShwYXJhbXNfLmJlZ2luKCksIHBhcmFtc18uZW5kKCksIHBhcmFtcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYgcCkgLT4gQzJQYXJhbSogeyByZXR1cm4gcC5nZXQoKTsgfSk7CisgICAgcmV0dXJuIGdldFBhcmFtcyhwYXJhbXMpOworfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zKSBjb25zdCB7CisgICAgRGljdCByZXQ7CisKKyAgICAvLyBjb252ZXJ0IHZlY3RvciB0byBtYXAKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgQzJQYXJhbSAqPiBwYXJhbXNNYXA7CisgICAgZm9yIChDMlBhcmFtICpwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAocGFyYW0gIT0gbnVsbHB0ciAmJiAqcGFyYW0pIHsKKyAgICAgICAgICAgIHBhcmFtc01hcFtwYXJhbS0+aW5kZXgoKV0gPSBwYXJhbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+ICZrdiA6IG1NYXApIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUgPSBrdi5maXJzdDsKKyAgICAgICAgY29uc3QgRmllbGREZXNjICZkZXNjID0ga3Yuc2Vjb25kOworICAgICAgICBpZiAocGFyYW1zTWFwLmNvdW50KGRlc2MucGFyYW1EZXNjLT5pbmRleCgpKSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDMlBhcmFtICpwYXJhbSA9IHBhcmFtc01hcFtkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKV07CisgICAgICAgIFZhbHVlIHZhbHVlOworCisgICAgICAgIC8vIGhhbmRsZSB3aG9sZSBwYXJhbXMgZmlyc3QKKyAgICAgICAgaWYgKCFkZXNjLmZpZWxkRGVzYykgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHBhcmFtLCBwYXJhbS0+c2l6ZSgpKTsKKyAgICAgICAgICAgIHZhbHVlLnNldChidWYpOworICAgICAgICAgICAgcmV0LmVtcGxhY2UobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pICsgZGVzYy5vZmZzZXQKKyAgICAgICAgICAgICAgICArIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoKmRlc2MuZmllbGREZXNjKTsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopcGFyYW0gKyBvZmZzZXQ7CisgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgZmllbGRUeXBlID0gZGVzYy5maWVsZERlc2MtPnR5cGUoKTsKKyAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogeworICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHBhcmFtLT5zaXplKCkgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5zaXplKCkgPCBsZW5ndGggfHwgcGFyYW0tPnNpemUoKSAtIGxlbmd0aCA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgicGFyYW0gdG9vIHNtYWxsIGZvciBzdHJpbmc6IGxlbmd0aCAlenUgc2l6ZSAlenUgb2Zmc2V0ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBwYXJhbS0+c2l6ZSgpLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0KEFTdHJpbmcoKGNoYXIgKilkYXRhLCBzdHJubGVuKChjaGFyICopZGF0YSwgbGVuZ3RoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGRlc2MuZmllbGREZXNjLT5leHRlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gcGFyYW0tPnNpemUoKSAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNpemUoKSA8IGxlbmd0aCB8fCBwYXJhbS0+c2l6ZSgpIC0gbGVuZ3RoIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJwYXJhbSB0b28gc21hbGwgZm9yIGJsb2I6IGxlbmd0aCAlenUgc2l6ZSAlenUgb2Zmc2V0ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBwYXJhbS0+c2l6ZSgpLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZS5zZXQoYnVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIHNpemVfdCB2YWx1ZVNpemUgPSBDMlZhbHVlOjpTaXplRm9yKChDMlZhbHVlOjp0eXBlX3QpZmllbGRUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNpemUoKSA8IHZhbHVlU2l6ZSB8fCBwYXJhbS0+c2l6ZSgpIC0gdmFsdWVTaXplIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJwYXJhbSB0b28gc21hbGwgZm9yIGMydmFsdWU6IHNpemUgJXp1IG9mZnNldCAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5zaXplKCksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogIGMyVmFsdWUgPSAqKChpbnQzMl90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGMyVmFsdWUgPSAqKCh1aW50MzJfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOiBjMlZhbHVlID0gKigoYzJfY250cjMyX3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgYzJWYWx1ZSA9ICooKGludDY0X3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogYzJWYWx1ZSA9ICooKHVpbnQ2NF90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6IGMyVmFsdWUgPSAqKChjMl9jbnRyNjRfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICBjMlZhbHVlID0gKigoZmxvYXQgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVW5zdXBwb3J0ZWQgZGF0YSB0eXBlIGZvciAlcyIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0KGMyVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldC5lbXBsYWNlKG5hbWUsIHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmNsZWFyKCkgeworICAgIG1NYXAuY2xlYXIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM2YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRUZMRUNURURfUEFSQU1fQlVJTERFUl9IXworI2RlZmluZSBSRUZMRUNURURfUEFSQU1fQlVJTERFUl9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gcXVlcnkgYW5kIHVwZGF0ZSBDb2RlYyAyLjAgY29uZmlndXJhdGlvbiB2YWx1ZXMuIFVzZSBjdXN0b20gZGljdGlvbmFyeSBhcworICogQU1lc3NhZ2UgY2Fubm90IHJlcHJlc2VudCBhbGwgdHlwZXMgb2YgQ29kZWMgMi4wIHBhcmFtZXRlcnMgYW5kIEMyVmFsdWUgY2Fubm90IHJlcHJlc2VudAorICogYWxsIHR5cGVzIG9mIFNESyB2YWx1ZXMuIFdlIHdhbnQgdG8gYmUgcHJlY2lzZSB3aGVuIHNldHRpbmcgc3RhbmRhcmQgcGFyYW1ldGVycyAodXNlIEMyVmFsdWUKKyAqIGZvciBhcml0aG1ldGljIHZhbHVlcyksIGJ1dCBhbHNvIHN1cHBvcnQgaW50MzIgYW5kIGludDY0IGZvciBTREsgdmFsdWVzIHNwZWNpZmljYWxseSBmb3IKKyAqIHZlbmRvciBwYXJhbWV0ZXJzIChhcyBTREsgQVBJIGRvZXMgbm90IGFsbG93IHNwZWNpZnlpbmcgcHJvcGVyIHR5cGUuKSBXaGVuIHF1ZXJ5aW5nIGZpZWxkcywKKyAqIHdlIGNhbiB1c2UgQzJWYWx1ZXMgYXMgdGhleSBhcmUgZGVmaW5lZC4KKyAqCisgKiAgICAgIEl0ZW0gPT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBpbmdzOgorICogICAgIENWYWx1ZTo6dHlwZSA9PiB0eXBlCisgKiAgICAgaW50MzIgPT4gaW50MzIsIGN0cjMyIG9yIHVpbnQzMgorICogICAgIGludDY0ID0+IGludDY0LCBjdHI2NCBvciB1aW50NjQKKyAqICAgICBBU3RyaW5nID0+IHN0cmluZworICogICAgIEFCdWZmZXIgPT4gYmxvYgorICogICAgICdSZWN0JyA9PiBDMlJlY3RTdHJ1Y3QgKG5vdCBleHBvc2VkIGluIFNESyBhcyBhIHJlY3RhbmdsZSkKKyAqLworY2xhc3MgUmVmbGVjdGVkUGFyYW1VcGRhdGVyIHsKK3B1YmxpYzoKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIoKSA9IGRlZmF1bHQ7CisgICAgflJlZmxlY3RlZFBhcmFtVXBkYXRlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIEVsZW1lbnQgZm9yIHZhbHVlcworICAgICAqLworICAgIHN0cnVjdCBWYWx1ZSA6IHB1YmxpYyBBRGF0YTxDMlZhbHVlLCBpbnQzMl90LCBpbnQ2NF90LCBBU3RyaW5nLCBzcDxBQnVmZmVyPj46OkJhc2ljIHsKKyAgICAgICAgLy8gYWxsb3cgY29uc3RydWN0aW9uIGZyb20gYmFzZSB0eXBlcworICAgICAgICBWYWx1ZSgpID0gZGVmYXVsdDsKKyAgICAgICAgZXhwbGljaXQgVmFsdWUoQzJWYWx1ZSBpKSAgICAgICAgICAgIHsgc2V0KGkpOyB9CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKGludDMyX3QgaSkgICAgICAgICAgICB7IHNldChpKTsgfQorICAgICAgICBleHBsaWNpdCBWYWx1ZShpbnQ2NF90IGkpICAgICAgICAgICAgeyBzZXQoaSk7IH0KKyAgICAgICAgZXhwbGljaXQgVmFsdWUoY29uc3QgQVN0cmluZyAmaSkgICAgIHsgc2V0KGkpOyB9CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKGNvbnN0IHNwPEFCdWZmZXI+ICZpKSB7IHNldChpKTsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgRGljdCA6IHB1YmxpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVmFsdWU+IHsKKyAgICAgICAgRGljdCgpID0gZGVmYXVsdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVidWdTdHJpbmcoc2l6ZV90IGluZGVudCA9IDApIGNvbnN0OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIGFsbCBmaWVsZHMgb2YgdGhlIHBhcmFtZXRlciBkZXNjcmlwdG9ycyBzdXBwbGllZCwgc28gdGhhdCB0aGlzIG9wYmplY3QgY2FuIGxhdGVyCisgICAgICogcXVlcnkgYW5kIHVwZGF0ZSB0aGVzZS4KKyAgICAgKgorICAgICAqIEZvciBub3cgb25seSBmaXJzdC1sZXZlbCBmaWVsZHMgYXJlIHN1cHBvcnRlZC4gQWxzbywgYXJyYXkgZmllbGRzIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogXHBhcmFtIHJlZmxlY3RvciAgIEMyUGFyYW1SZWZsZWN0b3Igb2JqZWN0IGZvciBDMlBhcmFtIHJlZmxlY3Rpb24uCisgICAgICogXHBhcmFtIHBhcmFtRGVzY3MgIHZlY3RvciBvZiBDMlBhcmFtRGVzY3JpcHRvciBvYmplY3RzIHRoYXQgdGhpcyBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd291bGQgcmVjb2duaXplIHdoZW4gYnVpbGRpbmcgcGFyYW1zLgorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1EZXNjKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmcGFyYW1EZXNjcyk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGZpZWxkcyBvZiBhIHN0YW5kYXJkIHBhcmFtZXRlciAodGhhdCBtYXkgbm90IGJlIHN1cHBvcnRlZCBieSB0aGUgcGFyYW1ldGVyIHJlZmxlY3RvcgorICAgICAqIG9yIG1heSBub3QgYmUgbGlzdGVkIGFzIGEgc3VwcG9ydGVkIHZhbHVlIGJ5IHRoZSBjb21wb25lbnQpLiBJZiB0aGUgcGFyYW1ldGVyIG5hbWUgaXMKKyAgICAgKiB1c2VkIGZvciBhbm90aGVyIHBhcmFtZXRlciwgdGhpcyBvcGVyYXRpb24gaXMgYSBuby1vcC4gKFRlY2huaWNhbGx5LCB0aGlzIGlzIGJ5IGZpZWxkcykuCisgICAgICoKKyAgICAgKiBccGFyYW0gVCBzdGFuZGFyZCBwYXJhbWV0ZXIgdHlwZQorICAgICAqIFxwYXJhbSBuYW1lIHBhcmFtZXRlciBuYW1lCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGFkZFN0YW5kYXJkUGFyYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZKSB7CisgICAgICAgIGFkZFBhcmFtRGVzYyhzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpJbmRleChUOjpQQVJBTV9UWVBFKSwgYXR0cmliLCBuYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgIEMyU3RydWN0RGVzY3JpcHRvcigoVCopbnVsbHB0ciksIG51bGxwdHIgLyogZGVzY3JpcHRvciAqLyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUgKG9yIGEgcGFyYW1lYXRlcikgZGVzY3JpYmVkIGJ5IHRoZSBzdHJ1Y3QgZGVzY3JpcHRvci4gSWYKKyAgICAgKiByZWZsZWN0b3IgaXMgcHJvdmlkZWQsIGZpZWxkcyBvZiBzdWItc3RydWN0dXJlcyBhcmUgYWxzbyBhZGRlZC4gT3RoZXJ3aXNlLCBvbmx5IHRvcC1sZXZlbAorICAgICAqIGZ1bmRhbWVudGFsIHR5cGVkIGZpZWxkcyAoYXJpdGhtZXRpYywgc3RyaW5nIGFuZCBibG9iKSBhcmUgYWRkZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1EZXNjIHBhcmFtZXRlciBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIGZpZWxkRGVzYyBmaWVsZCBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIHBhdGggcGF0aC9uYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgKGZpZWxkIG9yIHBhcmVudCBwYXJhbWV0ZXIpCisgICAgICogXHBhcmFtIG9mZnNldCBvZmZzZXQgb2YgdGhlIHN0cnVjdHVyZSBpbiB0aGUgcGFyYW1ldGVyCisgICAgICogXHBhcmFtIHJlZmxlY3RvciAgQzJQYXJhbVJlZmxlY3RvciBvYmplY3QgZm9yIEMyUGFyYW0gcmVmbGVjdGlvbiAobWF5IGJlIG51bGwpCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbVN0cnVjdERlc2MoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IHBhcmFtRGVzYywgQzJTdHJpbmcgcGF0aCwgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgZmllbGRzIG9mIGEgcGFyYW1ldGVyIGRlc2NyaWJlZCBieSB0aGUgc3RydWN0IGRlc2NyaXB0b3IuIElmIHJlZmxlY3RvciBpcyBwcm92aWRlZCwKKyAgICAgKiBmaWVsZHMgb2Ygc3ViLXN0cnVjdHVyZXMgYXJlIGFsc28gYWRkZWQuIE90aGVyd2lzZSwgb25seSB0b3AtbGV2ZWwgZnVuZGFtZW50YWwgdHlwZWQgZmllbGRzCisgICAgICogKGFyaXRobWV0aWMsIHN0cmluZyBhbmQgYmxvYikgYXJlIGFkZGVkLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtRGVzYyBwYXJhbWV0ZXIgZGVzY3JpcHRvcgorICAgICAqIFxwYXJhbSBmaWVsZERlc2MgZmllbGQgZGVzY3JpcHRvcgorICAgICAqIFxwYXJhbSByZWZsZWN0b3IgIEMyUGFyYW1SZWZsZWN0b3Igb2JqZWN0IGZvciBDMlBhcmFtIHJlZmxlY3Rpb24gKG1heSBiZSBudWxsKQorICAgICAqIFxwYXJhbSBtYXJrVmVuZG9yIFRFTVAgaWYgdHJ1ZSwgcHJlZml4IHZlbmRvciBwYXJhbWV0ZXIgbmFtZXMgd2l0aCAidmVuZG9yLiIKKyAgICAgKi8KKyAgICB2b2lkIGFkZFBhcmFtRGVzYygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcGFyYW1EZXNjLCBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnN0cnVjdERlc2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgICAgIGJvb2wgbWFya1ZlbmRvciA9IHRydWUpOworCisgICAgLyoqCisgICAgICogQWRkIHN1cHBvcnQgZm9yIHNldHRpbmcgYSBwYXJhbWV0ZXIgYXMgYSBiaW5hcnkgYmxvYi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIFxwYXJhbSBjb3JlSW5kZXggcGFyYW1ldGVyIChjb3JlKSBpbmRleAorICAgICAqLworICAgIHZvaWQgc3VwcG9ydFdob2xlUGFyYW0oc3RkOjpzdHJpbmcgbmFtZSwgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgZm9yIGFuIGluZGV4LgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIGdldFBhcmFtTmFtZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXQgbGlzdCBvZiBwYXJhbSBpbmRpY2VzIGZyb20gZmllbGQgbmFtZXMgYW5kIHZhbHVlcyBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBUT0RPOiBUaGlzIHNob3VsZCBiZSBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBsaXN0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXNbaW5dICBEaWN0IG9iamVjdCB3aXRoIGZpZWxkIG5hbWUgdG8gdmFsdWUgcGFpcnMuCisgICAgICogXHBhcmFtIHZlY1tvdXRdICAgIHZlY3RvciB0byBzdG9yZSB0aGUgaW5kaWNlcyBmcm9tIHxwYXJhbXN8LgorICAgICAqLworICAgIHZvaWQgZ2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UoCisgICAgICAgICAgICBjb25zdCBEaWN0ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gKnZlYyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldCBsaXN0IG9mIHBhcmFtIGluZGljZXMgZnJvbSBmaWVsZCBuYW1lcyAob25seSkgaW4gQU1lc3NhZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gIFZlY3RvciBvYmplY3Qgd2l0aCBmaWVsZCBuYW1lcy4KKyAgICAgKiBccGFyYW0gdmVjW291dF0gICAgdmVjdG9yIHRvIHN0b3JlIHRoZSBpbmRpY2VzIGZyb20gfHBhcmFtc3wuCisgICAgICovCisgICAgdm9pZCBnZXRQYXJhbUluZGljZXNGb3JLZXlzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZrZXlzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgQzJQYXJhbSBvYmplY3RzIGZyb20gZmllbGQgbmFtZSBhbmQgdmFsdWUgaW4gQU1lc3NhZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gICAgRGljdCBvYmplY3Qgd2l0aCBmaWVsZCBuYW1lIHRvIHZhbHVlIHBhaXJzLgorICAgICAqIFxwYXJhbSB2ZWNbaW4sb3V0XSAgIHZlY3RvciBvZiB0aGUgQzJQYXJhbSBvYmplY3RzIHRvIGJlIHVwZGF0ZWQuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVQYXJhbXNGcm9tTWVzc2FnZSgKKyAgICAgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKnZlYyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldCBmaWVsZHMgZnJvbSBDMlBhcmFtIG9iamVjdHMgaW4gQU1lc3NhZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gICAgdmVjdG9yIG9mIHRoZSBDMlBhcmFtIG9iamVjdHMgdG8gYmUgcXVlcmllZAorICAgICAqIFxyZXR1cm4gYSBEaWN0IG9iamVjdCBjb250YWluaW5nIHRoZSBrbm93biBwYXJhbWV0ZXJzCisgICAgICovCisgICAgRGljdCBnZXRQYXJhbXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIERpY3QgZ2V0UGFyYW1zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ2xlYXIgcGFyYW0gZGVzY3JpcHRvcnMgaW4gdGhpcyBvYmplY3QuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBGaWVsZERlc2MgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IHBhcmFtRGVzYzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZERlc2M7CisgICAgICAgIHNpemVfdCBvZmZzZXQ7CisgICAgfTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgRmllbGREZXNjPiBtTWFwOworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnN0cmluZz4gbVBhcmFtTmFtZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEMyUGFyYW06OkNvcmVJbmRleD4gbVdob2xlUGFyYW1zOworCisgICAgdm9pZCBwYXJzZU1lc3NhZ2VBbmREb1dvcmsoCisgICAgICAgICAgICBjb25zdCBEaWN0ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcgJiwgY29uc3QgRmllbGREZXNjICYsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KT4gd29yaykgY29uc3Q7CisKKyAgICBDMl9ET19OT1RfQ09QWShSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBSRUZMRUNURURfUEFSQU1fQlVJTERFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMWRlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5jcHAKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNraXBDdXRCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSAiU2tpcEN1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NraXBDdXRCdWZmZXI6OlNraXBDdXRCdWZmZXIoc2l6ZV90IHNraXAsIHNpemVfdCBjdXQsIHNpemVfdCBudW0xNkJpdENoYW5uZWxzKSB7CisKKyAgICBtV3JpdGVIZWFkID0gMDsKKyAgICBtUmVhZEhlYWQgPSAwOworICAgIG1DYXBhY2l0eSA9IDA7CisgICAgbUN1dEJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICBpZiAobnVtMTZCaXRDaGFubmVscyA9PSAwIHx8IG51bTE2Qml0Q2hhbm5lbHMgPiBJTlQzMl9NQVggLyAyKSB7CisgICAgICAgIEFMT0dXKCIjIGNoYW5uZWxzIG91dCBvZiByYW5nZTogJXp1LCB1c2luZyBwYXNzdGhyb3VnaCBpbnN0ZWFkIiwgbnVtMTZCaXRDaGFubmVscyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IG51bTE2Qml0Q2hhbm5lbHMgKiAyOworICAgIGlmIChza2lwID4gSU5UMzJfTUFYIC8gZnJhbWVTaXplIHx8IGN1dCA+IElOVDMyX01BWCAvIGZyYW1lU2l6ZQorICAgICAgICAgICAgfHwgY3V0ICogZnJhbWVTaXplID4gSU5UMzJfTUFYIC0gNDA5NikgeworICAgICAgICBBTE9HVygib3V0IG9mIHJhbmdlIHNraXAvY3V0OiAlenUvJXp1LCB1c2luZyBwYXNzdGhyb3VnaCBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICBza2lwLCBjdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNraXAgKj0gZnJhbWVTaXplOworICAgIGN1dCAqPSBmcmFtZVNpemU7CisKKyAgICBtRnJvbnRQYWRkaW5nID0gbVNraXAgPSBza2lwOworICAgIG1CYWNrUGFkZGluZyA9IGN1dDsKKyAgICBtQ2FwYWNpdHkgPSBjdXQgKyA0MDk2OworICAgIG1DdXRCdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgY2hhclttQ2FwYWNpdHldOworICAgIEFMT0dWKCJza2lwY3V0YnVmZmVyICV6dSAlenUgJWQiLCBza2lwLCBjdXQsIG1DYXBhY2l0eSk7Cit9CisKK1NraXBDdXRCdWZmZXI6On5Ta2lwQ3V0QnVmZmVyKCkgeworICAgIGRlbGV0ZVtdIG1DdXRCdWZmZXI7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0KE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBpZiAobUN1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIHBhc3N0aHJvdWdoIG1vZGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgb2Zmc2V0ID0gYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBpbnQzMl90IGJ1ZmxlbiA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICAvLyBkcm9wIHRoZSBpbml0aWFsIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGlmIG5lZWRlZAorICAgIGlmIChtRnJvbnRQYWRkaW5nID4gMCkgeworICAgICAgICAvLyBzdGlsbCBkYXRhIGxlZnQgdG8gZHJvcAorICAgICAgICBpbnQzMl90IHRvX2Ryb3AgPSAoYnVmbGVuIDwgbUZyb250UGFkZGluZykgPyBidWZsZW4gOiBtRnJvbnRQYWRkaW5nOworICAgICAgICBvZmZzZXQgKz0gdG9fZHJvcDsKKyAgICAgICAgYnVmbGVuIC09IHRvX2Ryb3A7CisgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKG9mZnNldCwgYnVmbGVuKTsKKyAgICAgICAgbUZyb250UGFkZGluZyAtPSB0b19kcm9wOworICAgIH0KKworCisgICAgLy8gYXBwZW5kIGRhdGEgdG8gY3V0YnVmZmVyCisgICAgY2hhciAqc3JjID0gKChjaGFyKikgYnVmZmVyLT5kYXRhKCkpICsgb2Zmc2V0OworICAgIHdyaXRlKHNyYywgYnVmbGVuKTsKKworCisgICAgLy8gdGhlIG1lZGlhYnVmZmVyIGlzIG5vdyBlbXB0eS4gRmlsbCBpdCBmcm9tIGN1dGJ1ZmZlciwgYWx3YXlzIGxlYXZpbmcKKyAgICAvLyBhdCBsZWFzdCBtQmFja1BhZGRpbmcgYnl0ZXMgaW4gdGhlIGN1dGJ1ZmZlcgorICAgIGNoYXIgKmRzdCA9IChjaGFyKikgYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IGNvcGllZCA9IHJlYWQoZHN0LCBidWZmZXItPnNpemUoKSk7CisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgY29waWVkKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFNraXBDdXRCdWZmZXI6OnN1Ym1pdEludGVybmFsKGNvbnN0IHNwPFQ+JiBidWZmZXIpIHsKKyAgICBpZiAobUN1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIHBhc3N0aHJvdWdoIG1vZGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgb2Zmc2V0ID0gYnVmZmVyLT5vZmZzZXQoKTsKKyAgICBpbnQzMl90IGJ1ZmxlbiA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgLy8gZHJvcCB0aGUgaW5pdGlhbCBkYXRhIGZyb20gdGhlIGJ1ZmZlciBpZiBuZWVkZWQKKyAgICBpZiAobUZyb250UGFkZGluZyA+IDApIHsKKyAgICAgICAgLy8gc3RpbGwgZGF0YSBsZWZ0IHRvIGRyb3AKKyAgICAgICAgaW50MzJfdCB0b19kcm9wID0gKGJ1ZmxlbiA8IG1Gcm9udFBhZGRpbmcpID8gYnVmbGVuIDogbUZyb250UGFkZGluZzsKKyAgICAgICAgb2Zmc2V0ICs9IHRvX2Ryb3A7CisgICAgICAgIGJ1ZmxlbiAtPSB0b19kcm9wOworICAgICAgICBidWZmZXItPnNldFJhbmdlKG9mZnNldCwgYnVmbGVuKTsKKyAgICAgICAgbUZyb250UGFkZGluZyAtPSB0b19kcm9wOworICAgIH0KKworCisgICAgLy8gYXBwZW5kIGRhdGEgdG8gY3V0YnVmZmVyCisgICAgY2hhciAqc3JjID0gKGNoYXIqKSBidWZmZXItPmRhdGEoKTsKKyAgICB3cml0ZShzcmMsIGJ1Zmxlbik7CisKKworICAgIC8vIHRoZSBtZWRpYWJ1ZmZlciBpcyBub3cgZW1wdHkuIEZpbGwgaXQgZnJvbSBjdXRidWZmZXIsIGFsd2F5cyBsZWF2aW5nCisgICAgLy8gYXQgbGVhc3QgbUJhY2tQYWRkaW5nIGJ5dGVzIGluIHRoZSBjdXRidWZmZXIKKyAgICBjaGFyICpkc3QgPSAoY2hhciopIGJ1ZmZlci0+YmFzZSgpOworICAgIHNpemVfdCBjb3BpZWQgPSByZWFkKGRzdCwgYnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICBidWZmZXItPnNldFJhbmdlKDAsIGNvcGllZCk7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0KGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpIHsKKyAgICBzdWJtaXRJbnRlcm5hbChidWZmZXIpOworfQorCit2b2lkIFNraXBDdXRCdWZmZXI6OnN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgc3VibWl0SW50ZXJuYWwoYnVmZmVyKTsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjpjbGVhcigpIHsKKyAgICBtV3JpdGVIZWFkID0gbVJlYWRIZWFkID0gMDsKKyAgICBtRnJvbnRQYWRkaW5nID0gbVNraXA7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6d3JpdGUoY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbnVtKSB7CisgICAgaW50MzJfdCBzaXpldXNlZCA9IChtV3JpdGVIZWFkIC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoc2l6ZXVzZWQgPCAwKSBzaXpldXNlZCArPSBtQ2FwYWNpdHk7CisKKyAgICAvLyBFdmVyeXRoaW5nIG11c3QgZml0LiBNYWtlIHN1cmUgdGhlIGJ1ZmZlciBpcyBhIGxpdHRsZSBsYXJnZXIgdGhhbiBuZWVkZWQsCisgICAgLy8gc28gdGhlcmUgaXMgbm8gYW1iaWd1aXR5IGFzIHRvIHdoZXRoZXIgbVdyaXRlSGVhZCA9PSBtUmVhZEhlYWQgbWVhbnMgYnVmZmVyCisgICAgLy8gZnVsbCBvciBlbXB0eQorICAgIHNpemVfdCBhdmFpbGFibGUgPSBtQ2FwYWNpdHkgLSBzaXpldXNlZCAtIDMyOworICAgIGlmIChhdmFpbGFibGUgPCBudW0pIHsKKyAgICAgICAgaW50MzJfdCBuZXdjYXBhY2l0eSA9IG1DYXBhY2l0eSArIChudW0gLSBhdmFpbGFibGUpOworICAgICAgICBjaGFyICogbmV3YnVmZmVyID0gbmV3IGNoYXJbbmV3Y2FwYWNpdHldOworICAgICAgICBtZW1jcHkobmV3YnVmZmVyLCBtQ3V0QnVmZmVyLCBtQ2FwYWNpdHkpOworICAgICAgICBkZWxldGUgW10gbUN1dEJ1ZmZlcjsKKyAgICAgICAgbUNhcGFjaXR5ID0gbmV3Y2FwYWNpdHk7CisgICAgICAgIG1DdXRCdWZmZXIgPSBuZXdidWZmZXI7CisgICAgICAgIEFMT0dWKCJyZWFsbG9jYXRlZCBidWZmZXIgYXQgc2l6ZSAlZCIsIG5ld2NhcGFjaXR5KTsKKyAgICB9CisKKyAgICBzaXplX3QgY29weWZpcnN0ID0gKG1DYXBhY2l0eSAtIG1Xcml0ZUhlYWQpOworICAgIGlmIChjb3B5Zmlyc3QgPiBudW0pIGNvcHlmaXJzdCA9IG51bTsKKyAgICBpZiAoY29weWZpcnN0KSB7CisgICAgICAgIG1lbWNweShtQ3V0QnVmZmVyICsgbVdyaXRlSGVhZCwgc3JjLCBjb3B5Zmlyc3QpOworICAgICAgICBudW0gLT0gY29weWZpcnN0OworICAgICAgICBzcmMgKz0gY29weWZpcnN0OworICAgICAgICBtV3JpdGVIZWFkICs9IGNvcHlmaXJzdDsKKyAgICAgICAgQ0hFQ0tfTEUobVdyaXRlSGVhZCwgbUNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG1Xcml0ZUhlYWQgPT0gbUNhcGFjaXR5KSBtV3JpdGVIZWFkID0gMDsKKyAgICAgICAgaWYgKG51bSkgeworICAgICAgICAgICAgbWVtY3B5KG1DdXRCdWZmZXIsIHNyYywgbnVtKTsKKyAgICAgICAgICAgIG1Xcml0ZUhlYWQgKz0gbnVtOworICAgICAgICB9CisgICAgfQorfQorCitzaXplX3QgU2tpcEN1dEJ1ZmZlcjo6cmVhZChjaGFyICpkc3QsIHNpemVfdCBudW0pIHsKKyAgICBpbnQzMl90IGF2YWlsYWJsZSA9IChtV3JpdGVIZWFkIC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoYXZhaWxhYmxlIDwgMCkgYXZhaWxhYmxlICs9IG1DYXBhY2l0eTsKKworICAgIGF2YWlsYWJsZSAtPSBtQmFja1BhZGRpbmc7CisgICAgaWYgKGF2YWlsYWJsZSA8PTApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChhdmFpbGFibGUgPCBpbnQzMl90KG51bSkpIHsKKyAgICAgICAgbnVtID0gYXZhaWxhYmxlOworICAgIH0KKworICAgIHNpemVfdCBjb3B5Zmlyc3QgPSAobUNhcGFjaXR5IC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoY29weWZpcnN0ID4gbnVtKSBjb3B5Zmlyc3QgPSBudW07CisgICAgaWYgKGNvcHlmaXJzdCkgeworICAgICAgICBtZW1jcHkoZHN0LCBtQ3V0QnVmZmVyICsgbVJlYWRIZWFkLCBjb3B5Zmlyc3QpOworICAgICAgICBudW0gLT0gY29weWZpcnN0OworICAgICAgICBkc3QgKz0gY29weWZpcnN0OworICAgICAgICBtUmVhZEhlYWQgKz0gY29weWZpcnN0OworICAgICAgICBDSEVDS19MRShtUmVhZEhlYWQsIG1DYXBhY2l0eSk7CisgICAgICAgIGlmIChtUmVhZEhlYWQgPT0gbUNhcGFjaXR5KSBtUmVhZEhlYWQgPSAwOworICAgICAgICBpZiAobnVtKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0LCBtQ3V0QnVmZmVyLCBudW0pOworICAgICAgICAgICAgbVJlYWRIZWFkICs9IG51bTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlOworfQorCitzaXplX3QgU2tpcEN1dEJ1ZmZlcjo6c2l6ZSgpIHsKKyAgICBpbnQzMl90IGF2YWlsYWJsZSA9IChtV3JpdGVIZWFkIC0gbVJlYWRIZWFkKTsKKyAgICBpZiAoYXZhaWxhYmxlIDwgMCkgYXZhaWxhYmxlICs9IG1DYXBhY2l0eTsKKyAgICByZXR1cm4gYXZhaWxhYmxlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiNTY5MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0tJUF9DVVRfQlVGRkVSX0hfCisKKyNkZWZpbmUgU0tJUF9DVVRfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIHV0aWxpdHkgY2xhc3MgdG8gY3V0IHRoZSBzdGFydCBhbmQgZW5kIG9mZiBhIHN0cmVhbSBvZiBkYXRhIGluIE1lZGlhQnVmZmVycworICoKKyAqLworY2xhc3MgU2tpcEN1dEJ1ZmZlcjogcHVibGljIFJlZkJhc2UgeworIHB1YmxpYzoKKyAgICAvLyAnc2tpcCcgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gc2tpcCBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAvLyAnY3V0JyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBjdXQgZnJvbSB0aGUgZW5kCisgICAgLy8gJ251bTE2Qml0Q2hhbm5lbHMnIGlzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMsIHdoaWNoIGFyZSBhc3N1bWVkIHRvIGJlIDE2IGJpdCB3aWRlIGVhY2gKKyAgICBTa2lwQ3V0QnVmZmVyKHNpemVfdCBza2lwLCBzaXplX3QgY3V0LCBzaXplX3QgbnVtMTZDaGFubmVscyk7CisKKyAgICAvLyBTdWJtaXQgb25lIE1lZGlhQnVmZmVyIGZvciBza2lwcGluZyBhbmQgY3V0dGluZy4gVGhpcyBtYXkgY29uc3VtZSBhbGwgb3IKKyAgICAvLyBzb21lIG9mIHRoZSBkYXRhIGluIHRoZSBidWZmZXIsIG9yIGl0IG1heSBhZGQgZGF0YSB0byBpdC4KKyAgICAvLyBBZnRlciB0aGlzLCB0aGUgY2FsbGVyIHNob3VsZCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBidWZmZXIgYXMgdXN1YWwuCisgICAgdm9pZCBzdWJtaXQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdm9pZCBzdWJtaXQoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlcik7ICAgIC8vIHNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIGFuIEFCdWZmZXIKKyAgICB2b2lkIHN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiYgYnVmZmVyKTsgICAgLy8gc2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYW4gQUJ1ZmZlcgorICAgIHZvaWQgY2xlYXIoKTsKKyAgICBzaXplX3Qgc2l6ZSgpOyAvLyBob3cgbWFueSBieXRlcyBhcmUgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgYnVmZmVyCisKKyBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U2tpcEN1dEJ1ZmZlcigpOworCisgcHJpdmF0ZToKKyAgICB2b2lkIHdyaXRlKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG51bSk7CisgICAgc2l6ZV90IHJlYWQoY2hhciAqZHN0LCBzaXplX3QgbnVtKTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHN1Ym1pdEludGVybmFsKGNvbnN0IHNwPFQ+JiBidWZmZXIpOworICAgIGludDMyX3QgbVNraXA7CisgICAgaW50MzJfdCBtRnJvbnRQYWRkaW5nOworICAgIGludDMyX3QgbUJhY2tQYWRkaW5nOworICAgIGludDMyX3QgbVdyaXRlSGVhZDsKKyAgICBpbnQzMl90IG1SZWFkSGVhZDsKKyAgICBpbnQzMl90IG1DYXBhY2l0eTsKKyAgICBjaGFyKiBtQ3V0QnVmZmVyOworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNraXBDdXRCdWZmZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPTVhfQ09ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3ZjU1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTIgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJjY29kZWNfdW5pdF90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlJlZmxlY3RlZFBhcmFtVXBkYXRlcl90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibWNfc2FuaXR5X3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiTWVkaWFDb2RlY19zYW5pdHlfdGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL3NmcGx1Z2luIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9NZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9NZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTM2ODdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL01lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUNvZGVjU2FuaXR5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIE1lZGlhQ29kZWNTYW5pdHlUZXN0KCkKKyAgICAgICAgOiBsb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgICAgIGNmZyhuZXcgQU1lc3NhZ2UpLAorICAgICAgICAgIGlmbXQobmV3IEFNZXNzYWdlKSwKKyAgICAgICAgICBvZm10KG5ldyBBTWVzc2FnZSkgeworICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgICAgIGxvb3Blci0+c3RhcnQoKTsKKyAgICB9CisKKyAgICB+TWVkaWFDb2RlY1Nhbml0eVRlc3QoKSB7CisgICAgICAgIGlmIChjb2RlYyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIGxvb3Blci0+c3RvcCgpOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IGxvb3BlcjsKKyAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYzsKKyAgICBzcDxBTWVzc2FnZT4gY2ZnOworICAgIHNwPEFNZXNzYWdlPiBpZm10OworICAgIHNwPEFNZXNzYWdlPiBvZm10OworfTsKKworY29uc3Qgc3RhdGljIHNpemVfdCBrTGluZWFyQnVmZmVyU2l6ZSA9IDEwNDg1NzY7CisKKy8vIGRhdGEgZm9yIGEgY29kZWMgaW5wdXQgZnJhbWUKK3N0cnVjdCBGcmFtZURhdGEgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgdGVtcGxhdGU8c2l6ZV90IE4+CisgICAgY29uc3RleHByIEZyYW1lRGF0YShjb25zdCB1aW50OF90KCZkYXRhXylbTl0pIDogZGF0YShkYXRhXyksIHNpemUoTikgeyB9Cit9OworCisvLyBvbmUgeWVsbG93IGZyYW1lIG9mIDI0MHgxODAgKGFsYmVpdCA0OjQ6NCkKK2NvbnN0IHVpbnQ4X3QgYXZjU3RyZWFtX0ExW10gPSB7IC8vIElEUiBmcmFtZQorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjcsIDB4NjQsIDB4MDAsIDB4MGQsIDB4YWMsIDB4ZDksIDB4NDEsIDB4NDEsIDB4ZmEsIDB4MTAsIDB4MDAsIDB4MDAsCisgICAgMHgwMywgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHgyMCwgMHhmMSwgMHg0MiwgMHg5OSwgMHg2MCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjgsIDB4ZWIsIDB4ZTMsIDB4Y2IsIDB4MjIsIDB4YzAsCisKKyAgICAweDAwLCAweDAwLCAweDAxLCAweDY1LCAweDg4LCAweDg0LCAweDAwLCAweDJiLCAweGZmLCAweGZlLCAweGQ4LCAweGU3LCAweGYzLCAweDJjLCAweGE1LCAweDYwLAorICAgIDB4Y2EsIDB4YmIsIDB4ZjEsIDB4NWMsIDB4NDQsIDB4N2MsIDB4OWEsIDB4YTUsIDB4YzMsIDB4YWIsIDB4MmYsIDB4NzcsIDB4MGEsIDB4OTQsIDB4MGQsIDB4MTksCisgICAgMHg0MywgMHgzYiwgMHg0ZiwgMHgyNSwgMHhlYSwgMHg2NiwgMHgwMCwgMHgwMSwgMHgyNCwgMHhjZCwgMHgzNSwgMHg1ZiwgMHhjMiwgMHgzNCwgMHg4OSwgMHhkMSwKKyAgICAweGE1LCAweDYwLCAweDA5LCAweDk4LCAweDAwLCAweDAxLCAweDFiLCAweDBlLCAweGNiLCAweDBkLCAweDA0LCAweDg2LCAweDk0LCAweGUyLCAweDMyLCAweDNjLAorICAgIDB4ZGQsIDB4MGYsCit9OworCitGcmFtZURhdGEgYXZjU3RyZWFtX0FbXSBfX3VudXNlZCA9IHsgYXZjU3RyZWFtX0ExIH07CisKKy8vIEFWQyBzdHJlYW0gb2YgMiB5ZWxsb3cgZnJhbWVzICgyNDB4MTgwKQorY29uc3QgdWludDhfdCBhdmNTdHJlYW1fQjFbXSA9IHsgLy8gSURSIGZyYW1lCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg2NCwgMHgwMCwgMHgwYywgMHhhYywgMHhkOSwgMHg0MSwgMHg0MSwgMHhmYSwgMHgxMCwgMHgwMCwgMHgwMCwKKyAgICAweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAzLCAweDAyLCAweDgwLCAweGYxLCAweDQyLCAweDk5LCAweDYwLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhlYiwgMHhlMywgMHhjYiwgMHgyMiwgMHhjMCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjUsIDB4ODgsIDB4ODQsIDB4MDAsIDB4MzMsIDB4ZmYsIDB4ZmUsIDB4ZGYsIDB4MzIsIDB4ZjgsIDB4MTQsIDB4ZDYsIDB4MjUsCisgICAgMHhkMCwgMHg3NCwgMHg0MiwgMHg1MCwgMHg4NCwgMHg2ZiwgMHhmNCwgMHhjMiwgMHg1YywgMHg3NiwgMHgzNywgMHgxNywgMHg3MiwgMHhhYywgMHg1MiwgMHhmYywKKyAgICAweGQ2LCAweDFmLCAweGQyLCAweGQwLCAweDYwLCAweGIyLCAweDIwLCAweDAwLCAweDEwLCAweDNkLCAweDJhLCAweGMwLCAweGU0LCAweDI3LCAweGNiLCAweGNlLAorICAgIDB4ZWEsIDB4MjUsIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4NDAsIDB4YmMsIDB4ODEsIDB4MTUsIDB4YzEsIDB4NjUsIDB4MjAsIDB4ODAsIDB4ODEsCisgICAgMHg3YSwgMHg1NywgMHg1MSwKK307CisKK2NvbnN0IHVpbnQ4X3QgYXZjU3RyZWFtX0IyW10gPSB7IC8vIFAgZnJhbWUKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQxLCAweDlhLCAweDIxLCAweDZjLCAweDQyLCAweGJmLCAweGZlLCAweDM4LCAweDQwLCAweDAwLCAweDBkLCAweDQ4LAorfTsKKworRnJhbWVEYXRhIGF2Y1N0cmVhbV9CW10gPSB7IGF2Y1N0cmVhbV9CMSwgYXZjU3RyZWFtX0IyIH07CisKK2NsYXNzIE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0IDogcHVibGljIE1lZGlhQ29kZWNTYW5pdHlUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworVEVTVF9QKE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0LCBUZXN0QXZjRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgIGlmIChJbnB1dFNpemUgPiAwKSB7CisgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIElucHV0U2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0dFKG1heElucHV0U2l6ZSwgMSA8PCAyMCk7IC8vIDEgTUIKKyAgICB9CisgICAgRVhQRUNUX0VRKGNvZGVjLT5zdGFydCgpLCAgT0spOworICAgIHNpemVfdCBpeDsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgIEVYUEVDVF9HRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUpOworICAgIEVYUEVDVF9MRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUgKyA0MDk2dSk7Cit9CisKK1RFU1RfUChNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgVGVzdFZpZGVvRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQudnA4LmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX1ZQOCk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgIGlmIChJbnB1dFNpemUgPiAwKSB7CisgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIElucHV0U2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0dFKG1heElucHV0U2l6ZSwgMSA8PCAyMCk7IC8vIDEgTUIKKyAgICB9CisgICAgRVhQRUNUX0VRKGNvZGVjLT5zdGFydCgpLCAgT0spOworICAgIHNpemVfdCBpeDsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgIEVYUEVDVF9HRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUpOworICAgIEVYUEVDVF9MRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUgKyA0MDk2dSk7Cit9CisKK1RFU1RfUChNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgVGVzdEF1ZGlvRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYWFjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIDQ0MTAwKTsKKyAgICBjZmctPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgMik7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgY29uc3QgaW50MzJfdCBJbnB1dFNpemUgPSBHZXRQYXJhbSgpOworICAgIGlmIChJbnB1dFNpemUgPj0gMCkgeworICAgICAgICBjZmctPnNldEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsIElucHV0U2l6ZSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRGb3JtYXQoJmlmbXQpLCBPSyk7CisgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CisgICAgaWYgKElucHV0U2l6ZSA+IDApIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaWZtdC0+ZmluZEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsICZtYXhJbnB1dFNpemUpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1heElucHV0U2l6ZSwgSW5wdXRTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaWZtdC0+ZmluZEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsICZtYXhJbnB1dFNpemUpKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEobWF4SW5wdXRTaXplLCAxIDw8IDE5KTsgLy8gNTEyIEtCCisgICAgICAgIH0KKyAgICAgICAgbWF4SW5wdXRTaXplID0ga0xpbmVhckJ1ZmZlclNpemU7IC8vIGlucHV0IHNpemUgaXMgc2V0IGJ5IGNoYW5uZWwKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgc2l6ZV90IGl4OworICAgIEVYUEVDVF9FUShjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpeCwgMTAwMDAwMCksIE9LKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpeCwgJmJ1ZiksICBPSyk7CisgICAgRVhQRUNUX0dFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSk7CisgICAgRVhQRUNUX0xFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSArIDQwOTZ1KTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5wdXRTaXplcywgTWVkaWFDb2RlY0lucHV0QnVmZmVyU2l6ZVRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKC0xLCAxMjM0LCAxMjM0NTY3OCkpOworCitURVNUX0YoTWVkaWFDb2RlY1Nhbml0eVRlc3QsIFRlc3RBdmNEZWNvZGVySGRyU3RhdGljSW5mbykgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgSERSU3RhdGljSW5mbyBpbmZvID0geyAubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxLCAuc1R5cGUxID0geworICAgICAgICAubVIgPSB7IC54ID0gMzU0MDAsIC55ID0gMTQ2MDAgfSwgLm1HID0geyAueCA9IDg1MDAsICAueSA9IDM5ODUwIH0sCisgICAgICAgIC5tQiA9IHsgLnggPSA2NTUwLCAgLnkgPSAgMjMwMCB9LCAubVcgPSB7IC54ID0gMTU2MzUsIC55ID0gMTY0NTAgfSwKKyAgICAgICAgLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gMTAwMCwgLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gMTAwMCwKKyAgICAgICAgLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IDEwMDAsIC5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IDEyMCB9CisgICAgfTsKKyAgICBjZmctPnNldEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCZpbmZvLCBzaXplb2YoaW5mbykpKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBzcDxBQnVmZmVyPiBvaW5mbzsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgLy8gYXNzdW1lIHdlIGNhbiBzdWJtaXQgYWxsIGlucHV0IGJlZm9yZSBkZXF1ZXVpbmcgb3V0cHV0CisgICAgc2l6ZV90IGZyYW1lSXggPSAwOworICAgIHNpemVfdCBpeDsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgZm9yIChjb25zdCBGcmFtZURhdGEgJmZyYW1lIDogYXZjU3RyZWFtX0IpIHsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICAgICAgQVNTRVJUX0dFKGJ1Zi0+Y2FwYWNpdHkoKSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPmJhc2UoKSwgZnJhbWUuZGF0YSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIEVYUEVDVF9FUShidWYtPnNldFJhbmdlKDAsIGZyYW1lLnNpemUpLCBPSyk7CisgICAgICAgIGJvb2wgZW9zID0gKytmcmFtZUl4ID09IE5FTEVNKGF2Y1N0cmVhbV9CKTsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGl4LCAwLCBmcmFtZS5zaXplLCBmcmFtZUl4ICogMzMzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb3MgPyBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNIDogMCksICBPSyk7CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZTsKKyAgICBpbnQ2NF90IHRzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGJvb2wgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSB0cnVlOworICAgIGJvb2wgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigmaXgsICZvZmZzZXQsICZzaXplLCAmdHMsICZmbGFncywgMTAwMDAwMCk7CisgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCAmJiBtSW5mb0Zvcm1hdENoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEICYmIG1JbmZvQnVmZmVyc0NoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCBPSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEJ1ZmZlcihpeCwgJmJ1ZiksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdChpeCwgJm9mbXQpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgJm9pbmZvKSk7CisgICAgQVNTRVJUX0VRKG9pbmZvLT5zaXplKCksIHNpemVvZihpbmZvKSk7CisgICAgRVhQRUNUX0VRKG1lbWNtcChvaW5mby0+ZGF0YSgpLCAmaW5mbywgc2l6ZW9mKGluZm8pKSwgIDApOworfQorCitURVNUX0YoTWVkaWFDb2RlY1Nhbml0eVRlc3QsIFRlc3RWaWRlb0RlY29kZXJIZHJTdGF0aWNJbmZvKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIik7CisgICAgY2ZnLT5zZXRJbnQzMigid2lkdGgiLCAzMjApOworICAgIGNmZy0+c2V0SW50MzIoImhlaWdodCIsIDI0MCk7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9WSURFT19NUEVHNCk7CisgICAgSERSU3RhdGljSW5mbyBpbmZvID0geyAubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxLCAuc1R5cGUxID0geworICAgICAgICAubVIgPSB7IC54ID0gMzU0MDAsIC55ID0gMTQ2MDAgfSwgLm1HID0geyAueCA9IDg1MDAsICAueSA9IDM5ODUwIH0sCisgICAgICAgIC5tQiA9IHsgLnggPSA2NTUwLCAgLnkgPSAgMjMwMCB9LCAubVcgPSB7IC54ID0gMTU2MzUsIC55ID0gMTY0NTAgfSwKKyAgICAgICAgLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gMTAwMCwgLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gMTAwMCwKKyAgICAgICAgLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IDEwMDAsIC5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IDEyMCB9CisgICAgfTsKKyAgICBjZmctPnNldEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCZpbmZvLCBzaXplb2YoaW5mbykpKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBzcDxBQnVmZmVyPiBvaW5mbzsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7Cit9CisKK2NsYXNzIE1lZGlhQ29kZWNCeXRlQnVmZmVyVGVzdCA6IHB1YmxpYyBNZWRpYUNvZGVjU2FuaXR5VGVzdCwKKyAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludDMyX3Q+IHsKK307CisKK1RFU1RfUChNZWRpYUNvZGVjQnl0ZUJ1ZmZlclRlc3QsIFRlc3RWaWRlb0RlY29kZXI0MjBQbGFuYXIpIHsKKyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIik7CisvLyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBjb25zdCBpbnQzMl90IENvbG9yID0gR2V0UGFyYW0oKTsKKyAgICBpZiAoQ29sb3IgPj0gMCkgeworICAgICAgICBjZmctPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBDb2xvcik7CisgICAgfQorICAgIGludDMyX3QgeGNvbG9yID0gQ29sb3IgPT0gLTEgPyBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgOiBDb2xvcjsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBpbnQzMl90IG9jb2xvciA9IC0xOworICAgIEVYUEVDVF9UUlVFKG9mbXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJm9jb2xvcikpOworICAgIEVYUEVDVF9FUShvY29sb3IsIHhjb2xvcik7CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgLy8gYXNzdW1lIHdlIGNhbiBzdWJtaXQgYWxsIGlucHV0IGJlZm9yZSBkZXF1ZXVpbmcgb3V0cHV0CisgICAgc2l6ZV90IGZyYW1lSXggPSAwOworICAgIHNpemVfdCBpeDsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgZm9yIChjb25zdCBGcmFtZURhdGEgJmZyYW1lIDogYXZjU3RyZWFtX0EpIHsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICAgICAgQVNTRVJUX0dFKGJ1Zi0+Y2FwYWNpdHkoKSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPmJhc2UoKSwgZnJhbWUuZGF0YSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIEVYUEVDVF9FUShidWYtPnNldFJhbmdlKDAsIGZyYW1lLnNpemUpLCBPSyk7CisgICAgICAgIGJvb2wgZW9zID0gKytmcmFtZUl4ID09IE5FTEVNKGF2Y1N0cmVhbV9BKTsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGl4LCAwLCBmcmFtZS5zaXplLCBmcmFtZUl4ICogMzMzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb3MgPyBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNIDogMCksICBPSyk7CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZTsKKyAgICBpbnQ2NF90IHRzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGJvb2wgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSB0cnVlOworICAgIGJvb2wgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigmaXgsICZvZmZzZXQsICZzaXplLCAmdHMsICZmbGFncywgMTAwMDAwMCk7CisgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCAmJiBtSW5mb0Zvcm1hdENoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEICYmIG1JbmZvQnVmZmVyc0NoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCBPSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEJ1ZmZlcihpeCwgJmJ1ZiksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdChpeCwgJm9mbXQpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmb2NvbG9yKSk7CisgICAgRVhQRUNUX0VRKG9jb2xvciwgeGNvbG9yKSA8PCBvZm10LT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpIDw8IGJ1Zi0+bWV0YSgpLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpOworICAgIC8vIGV4cGVjdCBhbiBpbWFnZS1kYXRhIGluIGJvdGggZm9ybWF0IGFuZCBtZXRhCisgICAgc3A8QUJ1ZmZlcj4gaW1nQnVmLCBpbWdCdWYyOworICAgIEFTU0VSVF9UUlVFKG9mbXQtPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1nQnVmKSk7CisgICAgQVNTRVJUX1RSVUUoYnVmLT5tZXRhKCktPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1nQnVmMikpOworICAgIEVYUEVDVF9FUShpbWdCdWYtPnNpemUoKSwgc2l6ZW9mKE1lZGlhSW1hZ2UyKSk7CisgICAgQVNTRVJUX0VRKGltZ0J1Zi0+c2l6ZSgpLCBpbWdCdWYyLT5zaXplKCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoaW1nQnVmLT5kYXRhKCksIGltZ0J1ZjItPmRhdGEoKSwgaW1nQnVmLT5zaXplKCkpKTsKKyAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyKilpbWdCdWYtPmRhdGEoKTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tVHlwZSwgaW1nLT5NRURJQV9JTUFHRV9UWVBFX1lVVik7CisgICAgRVhQRUNUX0VRKGltZy0+bU51bVBsYW5lcywgM3UpOworICAgIEVYUEVDVF9FUShpbWctPm1XaWR0aCwgMzIwdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUhlaWdodCwgMjQwdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUJpdERlcHRoLCA4dSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUJpdERlcHRoQWxsb2NhdGVkLCA4dSk7CisKKyAgICAvLyByZWFkIHN0cmlkZXMgZnJvbSBmb3JtYXQKKyAgICBpbnQzMl90IHN0cmlkZSwgdnN0cmlkZTsKKyAgICBvZm10LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpICAgICAgICAgIHx8IG9mbXQtPmZpbmRJbnQzMigid2lkdGgiLCAmc3RyaWRlKTsKKyAgICBvZm10LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZ2c3RyaWRlKSAgIHx8IG9mbXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJnZzdHJpZGUpOworCisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubUhvcml6U3Vic2FtcGxpbmcsIDF1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tVmVydFN1YnNhbXBsaW5nLCAxdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUhvcml6U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tVmVydFN1YnNhbXBsaW5nLCAydSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubUhvcml6U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tVmVydFN1YnNhbXBsaW5nLCAydSk7CisKKyAgICBzd2l0Y2ggKHhjb2xvcikgeworICAgICAgICAvLyBkZWZpbmVkIGZvcm1hdHMKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubU9mZnNldCwgMHUpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubUNvbEluYywgMSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tT2Zmc2V0LCAodWludDMyX3QpKHN0cmlkZSAqIHZzdHJpZGUpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1Db2xJbmMsIDEpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubVJvd0luYywgc3RyaWRlIC8gMik7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0KSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Sb3dJbmMsIHN0cmlkZSAvIDIpOworCisgICAgICAgICAgICBFWFBFQ1RfR0Uoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0ICsgc3RyaWRlIC8gMiAqIDExOSArIDE2MCkpOworICAgICAgICAgICAgRVhQRUNUX0xFKHNpemUsIChzaXplX3QpKHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tT2Zmc2V0LCAwdSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUNvbEluYywgMik7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tT2Zmc2V0LCAodWludDMyX3QpKHN0cmlkZSAqIHZzdHJpZGUgKyAxKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tQ29sSW5jLCAyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9HRShzaXplLCAoc2l6ZV90KShzdHJpZGUgKiB2c3RyaWRlICsgc3RyaWRlICogMTE5ICsgMzIwKSk7CisgICAgICAgICAgICBFWFBFQ1RfTEUoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgLy8gYW55dGhpbmcgZ29lcywgYnV0IHN0cmlkZSBzaG91bGQgbWF0Y2ggWSBwbGFuZQorICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYywgc3RyaWRlKTsKKworICAgICAgICAgICAgRVhQRUNUX0dFKHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+WV0ubU9mZnNldCArIDIzOSAqIGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAzMTkgKiBpbWctPm1QbGFuZVtpbWctPlldLm1Db2xJbmMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+VV0ubU9mZnNldCArIDExOSAqIGltZy0+bVBsYW5lW2ltZy0+VV0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNTkgKiBpbWctPm1QbGFuZVtpbWctPlVdLm1Db2xJbmMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+Vl0ubU9mZnNldCArIDExOSAqIGltZy0+bVBsYW5lW2ltZy0+Vl0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNTkgKiBpbWctPm1QbGFuZVtpbWctPlZdLm1Db2xJbmMgKyAxIH0pKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB2YWxpZGF0ZSBhbGwgcGl4ZWxzCisjaWYgMAorICAgIGZwcmludGYoc3RkZXJyLCAiTWVkaWFJbWFnZSB7IEYoJXV4JXUpIEAldSslZCslZCBAJXUrJWQrJWQgQCV1KyVkKyVkIH1cbiIsCisgICAgICAgICAgICBpbWctPm1XaWR0aCwgaW1nLT5tSGVpZ2h0LAorICAgICAgICAgICAgaW1nLT5tUGxhbmVbMF0ubU9mZnNldCwgaW1nLT5tUGxhbmVbMF0ubUNvbEluYywgaW1nLT5tUGxhbmVbMF0ubVJvd0luYywKKyAgICAgICAgICAgIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQsIGltZy0+bVBsYW5lWzFdLm1Db2xJbmMsIGltZy0+bVBsYW5lWzFdLm1Sb3dJbmMsCisgICAgICAgICAgICBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0LCBpbWctPm1QbGFuZVsyXS5tQ29sSW5jLCBpbWctPm1QbGFuZVsyXS5tUm93SW5jKTsKKyNlbmRpZgorICAgIGZvciAoaXggPSAwOyBpeCA8IDM7ICsraXgpIHsKKyAgICAgICAgY29uc3Qgc3RhdGljIHVpbnQ4X3QgZXhwZWN0ZWRbXSA9IHsgMjEwLCAxNiwgMTQ2IH07CisgICAgICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCBpbWctPm1IZWlnaHQgLyBpbWctPm1QbGFuZVtpeF0ubVZlcnRTdWJzYW1wbGluZyA7ICsreSkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IGltZy0+bVdpZHRoIC8gaW1nLT5tUGxhbmVbaXhdLm1Ib3JpelN1YnNhbXBsaW5nOyArK3gpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHZhbCA9IGJ1Zi0+ZGF0YSgpW2ltZy0+bVBsYW5lW2l4XS5tT2Zmc2V0ICsgaW1nLT5tUGxhbmVbaXhdLm1Db2xJbmMgKiB4CisgICAgICAgICAgICAgICAgICAgICAgICArIGltZy0+bVBsYW5lW2l4XS5tUm93SW5jICogeV07CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHZhbCwgZXhwZWN0ZWRbaXhdKSA8PCAiaW5jb3JyZWN0IHZhbHVlIGZvciBwbGFuZSAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpeCA8PCAiIGF0IHg9IiA8PCB4IDw8ICIsIHk9IiA8PCB5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnB1dFNpemVzLCBNZWRpYUNvZGVjQnl0ZUJ1ZmZlclRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAtMSwKKyAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGIwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworCisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPFJlZmxlY3RlZFBhcmFtVXBkYXRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2VudW0geworICAgIGtQYXJhbUluZGV4VGVzdFN0YXJ0ID0gMHgxMDAwLAorICAgIGtQYXJhbUluZGV4SW50LAorICAgIGtQYXJhbUluZGV4U3RyaW5nLAorICAgIGtQYXJhbUluZGV4Q29tcG9zaXRlLAorICAgIGtQYXJhbUluZGV4RmxleFN0cmluZywKKworICAgIGtQYXJhbUluZGV4TG9uZyA9IEMyUGFyYW06OlRZUEVfSU5ERVhfVkVORE9SX1NUQVJULAorfTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleEludD4gQzJJbnRJbmZvOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQ2NFZhbHVlLCBrUGFyYW1JbmRleExvbmc+IEMyTG9uZ0luZm87CisKK3N0cnVjdCBDMkZpeGVkU2l6ZVN0cmluZ1N0cnVjdCB7CisgICAgY2hhciB2YWx1ZVsxMl07CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QoRml4ZWRTaXplU3RyaW5nKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJGaXhlZFNpemVTdHJpbmdTdHJ1Y3QsIGtQYXJhbUluZGV4U3RyaW5nPiBDMlN0cmluZ0luZm87CisKK3N0cnVjdCBDMkNvbXBvc2l0ZVN0cnVjdCB7CisgICAgaW50MzJfdCBpMzI7CisgICAgdWludDY0X3QgdTY0OworICAgIGNoYXIgc3RyWzEyXTsKKyAgICB1aW50OF90IGJsb2JbOF07CisgICAgdWludDhfdCBmbGV4QmxvYltdOworCisgICAgQzJDb21wb3NpdGVTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfRkxFWF9DMlNUUlVDVChDb21wb3NpdGUsIGZsZXhCbG9iKQorICAgIEMyRklFTEQoaTMyLCAiaTMyIikKKyAgICBDMkZJRUxEKHU2NCwgInU2NCIpCisgICAgQzJGSUVMRChzdHIsICJzdHIiKQorICAgIEMyRklFTEQoYmxvYiwgImJsb2IiKQorICAgIEMyRklFTEQoZmxleEJsb2IsICJmbGV4LWJsb2IiKQorfTsKK3N0YXRpY19hc3NlcnQoQzJDb21wb3NpdGVTdHJ1Y3Q6OkZMRVhfU0laRSA9PSAxLCAiIik7CitzdGF0aWNfYXNzZXJ0KF9DMkZsZXhIZWxwZXI8QzJDb21wb3NpdGVTdHJ1Y3Q+OjpGTEVYX1NJWkUgPT0gMSwgIiIpOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJDb21wb3NpdGVTdHJ1Y3QsIGtQYXJhbUluZGV4Q29tcG9zaXRlPiBDMkNvbXBvc2l0ZUluZm87CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4RmxleFN0cmluZz4gQzJGbGV4U3RyaW5nSW5mbzsKKworI2RlZmluZSBTVVBQT1JURURfVFlQRVMgICBcCisgICAgQzJJbnRJbmZvLCAgICAgICAgICAgIFwKKyAgICBDMkxvbmdJbmZvLCAgICAgICAgICAgXAorICAgIEMyU3RyaW5nSW5mbywgICAgICAgICBcCisgICAgQzJDb21wb3NpdGVJbmZvLCAgICAgIFwKKyAgICBDMkZsZXhTdHJpbmdJbmZvCisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZGVzY3JpYmVfaW1wbDsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZGVzY3JpYmVfaW1wbDxULCBUWVBFUy4uLj4geworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID09IFQ6OkNPUkVfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oVDo6Q09SRV9JTkRFWCwgVDo6RmllbGRMaXN0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlX2ltcGw8VFlQRVMuLi4+OjpkZXNjcmliZShpbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBkZXNjcmliZV9pbXBsPD4geworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgY2hhciAqR2V0TmFtZSgpICAgICAgICB7IHJldHVybiBudWxscHRyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJJbnRJbmZvPigpICAgICAgIHsgcmV0dXJuICJpbnQiOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJMb25nSW5mbz4oKSAgICAgIHsgcmV0dXJuICJsb25nIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyU3RyaW5nSW5mbz4oKSAgICB7IHJldHVybiAic3RyaW5nIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyQ29tcG9zaXRlSW5mbz4oKSB7IHJldHVybiAiY29tcG9zaXRlIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyRmxleFN0cmluZ0luZm8+KCkgeyByZXR1cm4gImZsZXgtc3RyaW5nIjsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUWVBFUz4gc3RydWN0IGZpbGxfZGVzY3JpcHRvcnNfaW1wbDsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZmlsbF9kZXNjcmlwdG9yc19pbXBsPFQsIFRZUEVTLi4uPiB7CisgICAgc3RhdGljIHZvaWQgZmlsbChzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqdmVjKSB7CisgICAgICAgIGZpbGxfZGVzY3JpcHRvcnNfaW1wbDxUWVBFUy4uLj46OmZpbGwodmVjKTsKKyAgICAgICAgdmVjLT5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgVDo6UEFSQU1fVFlQRSwgQzJQYXJhbURlc2NyaXB0b3I6OklTX1BFUlNJU1RFTlQsIEdldE5hbWU8VD4oKSkpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGZpbGxfZGVzY3JpcHRvcnNfaW1wbDw+IHsKKyAgICBzdGF0aWMgdm9pZCBmaWxsKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICopIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUICpDYXN0UGFyYW0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSkgeworICAgIHJldHVybiAoVCAqKXBhcmFtLmdldCgpOworfQorCitjbGFzcyBQYXJhbVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICBQYXJhbVJlZmxlY3RvcigpID0gZGVmYXVsdDsKKyAgICB+UGFyYW1SZWZsZWN0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZGVzY3JpYmVfaW1wbDxTVVBQT1JURURfVFlQRVM+OjpkZXNjcmliZShwYXJhbUluZGV4KTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlclRlc3QoKSA6IG1SZWZsZWN0b3IobmV3IFBhcmFtUmVmbGVjdG9yKSB7CisgICAgICAgIGZpbGxfZGVzY3JpcHRvcnNfaW1wbDxTVVBQT1JURURfVFlQRVM+OjpmaWxsKCZtRGVzY3JpcHRvcnMpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1EZXNjcmlwdG9yczsKK307CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBTaW5nbGVWYWx1ZVRlc3QpIHsKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgdXBkYXRlcjsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBtc2c7CisgICAgbXNnLmVtcGxhY2UoImludC52YWx1ZSIsIGludDMyX3QoMTIpKTsKKyAgICBtc2cuZW1wbGFjZSgidmVuZG9yLmxvbmcudmFsdWUiLCBpbnQ2NF90KDM0KSk7CisKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyRmxleFN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2sobmV3IEMySW50SW5mbyk7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhuZXcgQzJMb25nSW5mbyk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMkludEluZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyTG9uZ0luZm8+KHBhcmFtc1sxXSktPnZhbHVlKTsKKworICAgIHVwZGF0ZXIudXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UobXNnLCAmcGFyYW1zKTsKKyAgICBFWFBFQ1RfRVEoMTIsIENhc3RQYXJhbTxDMkludEluZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMzQsIENhc3RQYXJhbTxDMkxvbmdJbmZvPihwYXJhbXNbMV0pLT52YWx1ZSk7CisKKyAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlID0gMDsKKyAgICBpbnQ2NF90IGludDY0VmFsdWUgPSAwOworICAgIG1zZyA9IHVwZGF0ZXIuZ2V0UGFyYW1zKHBhcmFtcyk7CisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoImludC52YWx1ZSIpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgbXNnWyJpbnQudmFsdWUiXS5maW5kKCZjMlZhbHVlKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIGMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDEyLCBpbnQzMlZhbHVlKTsKKworICAgIEFTU0VSVF9FUSgxdSwgbXNnLmNvdW50KCJ2ZW5kb3IubG9uZy52YWx1ZSIpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgbXNnWyJ2ZW5kb3IubG9uZy52YWx1ZSJdLmZpbmQoJmMyVmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMzQsIGludDY0VmFsdWUpOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgU3RyaW5nVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgic3RyaW5nLnZhbHVlIiwgQVN0cmluZygiNTYiKSk7CisgICAgbXNnLmVtcGxhY2UoImZsZXgtc3RyaW5nLnZhbHVlIiwgQVN0cmluZygiU29tZSBzdHJpbmciKSk7CisgICAgdXBkYXRlci5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbURlc2NyaXB0b3JzKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHVwZGF0ZXIuZ2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UobXNnLCAmaW5kaWNlcyk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkludEluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyTG9uZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyU3RyaW5nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJDb21wb3NpdGVJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkZsZXhTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmluZ0luZm8pOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZVswXSk7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkZsZXhTdHJpbmdJbmZvOjpBbGxvY1VuaXF1ZSgwKSk7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+ZmxleENvdW50KCkpOworICAgIGNoYXIgKmZsZXhTdHJpbmdEYXRhID0gJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9TVFJFUSgiNTYiLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZSk7CisgICAgRVhQRUNUX0VRKDEydSwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1swXSktPmZsZXhDb3VudCgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlNvbWUgc3RyaW5nIiwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWUpOworICAgIEVYUEVDVF9ORShmbGV4U3RyaW5nRGF0YSwgJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdKTsKKyAgICBmbGV4U3RyaW5nRGF0YSA9ICZDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+bS52YWx1ZVswXTsKKworICAgIC8vIHZlcmlmeSB0cnVuY2F0aW9uIGFuZCBpbi1wbGFjZSB1cGRhdGUKKyAgICBtc2dbInN0cmluZy52YWx1ZSJdID0gUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZShBU3RyaW5nKCIxMjM0NTY3ODkwQUJDREUiKSk7CisgICAgbXNnWyJmbGV4LXN0cmluZy52YWx1ZSJdID0gUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZShBU3RyaW5nKCJhYmMiKSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9TVFJFUSgiMTIzNDU2Nzg5MEEiLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZSk7CisgICAgRVhQRUNUX0VRKDR1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9TVFJFUSgiYWJjIiwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWUpOworICAgIEVYUEVDVF9FUShmbGV4U3RyaW5nRGF0YSwgJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdKTsKKworICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgbXNnID0gdXBkYXRlci5nZXRQYXJhbXMocGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoMXUsIG1zZy5jb3VudCgic3RyaW5nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbInN0cmluZy52YWx1ZSJdLmZpbmQoJnN0clZhbHVlKSk7CisgICAgRVhQRUNUX1NUUkVRKCIxMjM0NTY3ODkwQSIsIHN0clZhbHVlLmNfc3RyKCkpOworCisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoImZsZXgtc3RyaW5nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbImZsZXgtc3RyaW5nLnZhbHVlIl0uZmluZCgmc3RyVmFsdWUpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImFiYyIsIHN0clZhbHVlLmNfc3RyKCkpOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgQ29tcG9zaXRlVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLmkzMiIsIGludDMyX3QoNzgpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnU2NCIsIGludDY0X3QoOTEwKSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5zdHIiLCBBU3RyaW5nKCIxMTEyIikpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiYnVmZmVyMDgiLCA4KSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5mbGV4LWJsb2IiLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoImZsZXgtYnVmZmVyLTE0IiwgMTQpKTsKKworICAgIHVwZGF0ZXIuYWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1EZXNjcmlwdG9ycyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICB1cGRhdGVyLmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKG1zZywgJmluZGljZXMpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJJbnRJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkxvbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMlN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyQ29tcG9zaXRlSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkNvbXBvc2l0ZUluZm86OkFsbG9jVW5pcXVlKDApKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0clswXSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiXDBcMFwwXDBcMFwwXDBcMCIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uYmxvYiwgOCkpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIHVpbnQ4X3QgKmZsZXhCbG9iRGF0YSA9ICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSg3OCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSg5MTB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnU2NCk7CisgICAgRVhQRUNUX1NUUkVRKCIxMTEyIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5zdHIpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImJ1ZmZlcjA4IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVN0cmluZyBoZXg7CisgICAgaGV4ZHVtcChDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgsIDAsICZoZXgpOworICAgIHByaW50ZigiJXNcbiIsIGhleC5jX3N0cigpKTsKKyAgICBBU1NFUlRfRVEoMTR1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiZmxleC1idWZmZXItMTQiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCAxNCkpOworICAgIEVYUEVDVF9ORShmbGV4QmxvYkRhdGEsICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdKTsKKyAgICBmbGV4QmxvYkRhdGEgPSAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXTsKKworICAgIC8vIHRlc3Qgc2V0dGluZyBhbmQgemVybyBleHRlbmRpbmcgc2hvcnRlciBibG9iIHRoYW4gYWxsb3dlZAorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiYnVmMDUiLCA1KSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImJ1ZjA1XDBcMFwwIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVNTRVJUX0VRKDE0dSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImZsZXgtYnVmZmVyLTE0IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYiwgMTQpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7CisKKyAgICAvLyB0ZXN0IHNldHRpbmcgYW5kIHRyaW1taW5nIGxhcmdlciBibG9iIHRoYW4gYWxsb3dlZAorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiUmVhbGx5TG9uZ0J1ZmZlciIsIDE2KSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoIlJlYWxseUxvIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVNTRVJUX0VRKDE0dSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImZsZXgtYnVmZmVyLTE0IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYiwgMTQpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7CisKKyAgICAvLyB0ZXN0IHRyaW1taW5nIGZsZXggYmxvYiBpbi1wbGFjZQorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuZmxleC1ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJidWYwNSIsIDUpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgQVNTRVJUX0VRKDV1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiYnVmMDUiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCA1KSk7CisgICAgRVhQRUNUX0VRKGZsZXhCbG9iRGF0YSwgJkNhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2JbMF0pOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgQ29tcG9zaXRlUGFydGlhbFRlc3QpIHsKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgdXBkYXRlcjsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBtc2c7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5pMzIiLCBDMlZhbHVlKDEzMTQpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnN0ciIsIEFTdHJpbmcoIjE1MTYiKSk7CisKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2soQzJDb21wb3NpdGVJbmZvOjpBbGxvY1VuaXF1ZSgxMnUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0clswXSk7CisKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDEzMTQsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uaTMyKTsKKyAgICBFWFBFQ1RfRVEoMHUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0udTY0KTsKKyAgICBFWFBFQ1RfU1RSRVEoIjE1MTYiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0cik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4ZjAyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQ29kZWMyQnVmZmVyVXRpbHMuY3BwIiwKKyAgICAgICAgIkNvZGVjMk1hcHBlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ5dXZfc3RhdGljIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4NjYzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaWJ5dXYuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogQSBmbGlwcGFibGUsIG9wdGltaXphYmxlIG1lbWNweS4gQ29uc3RydWN0cyBzdWNoIGFzIChmcm9tID8gc3JjIDogZHN0KSBkbyBub3Qgd29yayBhcyB0aGUgcmVzdWx0cyBhcmUKKyAqIGFsd2F5cyBjb25zdC4KKyAqLwordGVtcGxhdGU8Ym9vbCBUb0EsIHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgY29weShBICphLCBjb25zdCBCICpiLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBfX2J1aWx0aW5fbWVtY3B5KGEsIGIsIHNpemUpOworICAgIH0KK307CisKK3RlbXBsYXRlPHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllcjxmYWxzZSwgUz4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CisgICAgaW5saW5lIHN0YXRpYyB2b2lkIGNvcHkoY29uc3QgQSAqYSwgQiAqYiwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgTWVtQ29waWVyPHRydWUsIFM+Ojpjb3B5KGIsIGEsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogQ29waWVzIGJldHdlZW4gYSBNZWRpYUltYWdlIGFuZCBhIGdyYXBoaWMgdmlldy4KKyAqCisgKiBccGFyYW0gVG9NZWRpYUltYWdlIHdoZXRoZXIgdG8gY29weSB0byAob3IgZnJvbSkgdGhlIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldyAoY291bGQgYmUgQ29uc3RHcmFwaGljVmlldyBvciBHcmFwaGljVmlldyBkZXBlbmRpbmcgb24gZGlyZWN0aW9uKQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZSAoY291bGQgYmUgY29uc3QgdWludDhfdCogb3IgdWludDhfdCogZGVwZW5kaW5nIG9uIGRpcmVjdGlvbikKKyAqLwordGVtcGxhdGU8Ym9vbCBUb01lZGlhSW1hZ2UsIHR5cGVuYW1lIFZpZXcsIHR5cGVuYW1lIEltYWdlUGl4ZWw+CitzdGF0aWMgc3RhdHVzX3QgX0ltYWdlQ29weShWaWV3ICZ2aWV3LCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBJbWFnZVBpeGVsICppbWdCYXNlKSB7CisgICAgLy8gVE9ETzogbW9yZSBlZmZpY2llbnQgY29weWluZyAtLS0gZS5nLiBjb3B5IGludGVybGVhdmVkIHBsYW5lcyB0b2dldGhlciwgZXRjLgorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIGNvbnN0IHNpemVfdCBicHAgPSBkaXZVcChpbWctPm1CaXREZXB0aEFsbG9jYXRlZCwgOHUpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPFRvTWVkaWFJbWFnZSwgdWludDhfdCwgY29uc3QgdWludDhfdD46OnR5cGUgKmltZ1JvdyA9CisgICAgICAgICAgICBpbWdCYXNlICsgaW1nLT5tUGxhbmVbaV0ubU9mZnNldDsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxUb01lZGlhSW1hZ2UsIGNvbnN0IHVpbnQ4X3QsIHVpbnQ4X3Q+Ojp0eXBlICp2aWV3Um93ID0KKyAgICAgICAgICAgIHZpZXdSb3cgPSB2aWV3LmRhdGEoKVtpXTsKKyAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgaWYgKHBsYW5lLmNvbFNhbXBsaW5nICE9IGltZy0+bVBsYW5lW2ldLm1Ib3JpelN1YnNhbXBsaW5nCisgICAgICAgICAgICAgICAgfHwgcGxhbmUucm93U2FtcGxpbmcgIT0gaW1nLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZworICAgICAgICAgICAgICAgIHx8IHBsYW5lLmFsbG9jYXRlZERlcHRoICE9IGltZy0+bUJpdERlcHRoQWxsb2NhdGVkCisgICAgICAgICAgICAgICAgfHwgcGxhbmUuYWxsb2NhdGVkRGVwdGggPCBwbGFuZS5iaXREZXB0aAorICAgICAgICAgICAgICAgIC8vIE1lZGlhSW1hZ2Ugb25seSBzdXBwb3J0cyBNU0IgdmFsdWVzCisgICAgICAgICAgICAgICAgfHwgcGxhbmUucmlnaHRTaGlmdCAhPSBwbGFuZS5hbGxvY2F0ZWREZXB0aCAtIHBsYW5lLmJpdERlcHRoCisgICAgICAgICAgICAgICAgfHwgKGJwcCA+IDEgJiYgcGxhbmUuZW5kaWFubmVzcyAhPSBwbGFuZS5OQVRJVkUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgcGxhbmVXID0gaW1nLT5tV2lkdGggLyBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgdWludDMyX3QgcGxhbmVIID0gaW1nLT5tSGVpZ2h0IC8gcGxhbmUucm93U2FtcGxpbmc7CisKKyAgICAgICAgYm9vbCBjYW5Db3B5QnlSb3cgPSAocGxhbmUuY29sSW5jID09IDEpICYmIChpbWctPm1QbGFuZVtpXS5tQ29sSW5jID09IDEpOworICAgICAgICBib29sIGNhbkNvcHlCeVBsYW5lID0gY2FuQ29weUJ5Um93ICYmIChwbGFuZS5yb3dJbmMgPT0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYyk7CisgICAgICAgIGlmIChjYW5Db3B5QnlQbGFuZSkgeworICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoaW1nUm93LCB2aWV3Um93LCBwbGFuZS5yb3dJbmMgKiBwbGFuZUgpOworICAgICAgICB9IGVsc2UgaWYgKGNhbkNvcHlCeVJvdykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBwbGFuZUg7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICBpbWdSb3csIHZpZXdSb3csIHN0ZDo6bWluKHBsYW5lLnJvd0luYywgaW1nLT5tUGxhbmVbaV0ubVJvd0luYykpOworICAgICAgICAgICAgICAgIGltZ1JvdyArPSBpbWctPm1QbGFuZVtpXS5tUm93SW5jOworICAgICAgICAgICAgICAgIHZpZXdSb3cgKz0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBwbGFuZUg7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgZGVjbHR5cGUoaW1nUm93KSBpbWdQdHIgPSBpbWdSb3c7CisgICAgICAgICAgICAgICAgZGVjbHR5cGUodmlld1Jvdykgdmlld1B0ciA9IHZpZXdSb3c7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCBwbGFuZVc7ICsrY29sKSB7CisgICAgICAgICAgICAgICAgICAgIE1lbUNvcGllcjxUb01lZGlhSW1hZ2UsIDA+Ojpjb3B5KGltZ1B0ciwgdmlld1B0ciwgYnBwKTsKKyAgICAgICAgICAgICAgICAgICAgaW1nUHRyICs9IGltZy0+bVBsYW5lW2ldLm1Db2xJbmM7CisgICAgICAgICAgICAgICAgICAgIHZpZXdQdHIgKz0gcGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbWdSb3cgKz0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYzsKKyAgICAgICAgICAgICAgICB2aWV3Um93ICs9IHBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBJbWFnZUNvcHkodWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGlmICh2aWV3LndpZHRoKCkgIT0gaW1nLT5tV2lkdGggfHwgdmlldy5oZWlnaHQoKSAhPSBpbWctPm1IZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKChJc05WMTIodmlldykgJiYgSXNJNDIwKGltZykpIHx8IChJc0k0MjAodmlldykgJiYgSXNOVjEyKGltZykpKSB7CisgICAgICAgIC8vIFRha2Ugc2hvcnRjdXRzIHRvIHVzZSBsaWJ5dXYgZnVuY3Rpb25zIGJldHdlZW4gTlYxMiBhbmQgSTQyMCBjb252ZXJzaW9uLgorICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfeSA9IHZpZXcuZGF0YSgpWzBdOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdSA9IHZpZXcuZGF0YSgpWzFdOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdiA9IHZpZXcuZGF0YSgpWzJdOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfeSA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzBdLnJvd0luYzsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3UgPSB2aWV3LmxheW91dCgpLnBsYW5lc1sxXS5yb3dJbmM7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV92ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMl0ucm93SW5jOworICAgICAgICB1aW50OF90KiBkc3RfeSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVswXS5tT2Zmc2V0OworICAgICAgICB1aW50OF90KiBkc3RfdSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0OworICAgICAgICB1aW50OF90KiBkc3RfdiA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0OworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfeSA9IGltZy0+bVBsYW5lWzBdLm1Sb3dJbmM7CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gaW1nLT5tUGxhbmVbMV0ubVJvd0luYzsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3YgPSBpbWctPm1QbGFuZVsyXS5tUm93SW5jOworICAgICAgICBpZiAoSXNOVjEyKHZpZXcpICYmIElzSTQyMChpbWcpKSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYxMlRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfeSwgZHN0X3N0cmlkZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgdmlldy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5oZWlnaHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgdmlldy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5oZWlnaHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9JbWFnZUNvcHk8dHJ1ZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICBpZiAodmlldy53aWR0aCgpICE9IGltZy0+bVdpZHRoIHx8IHZpZXcuaGVpZ2h0KCkgIT0gaW1nLT5tSGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICgoSXNOVjEyKGltZykgJiYgSXNJNDIwKHZpZXcpKSB8fCAoSXNJNDIwKGltZykgJiYgSXNOVjEyKHZpZXcpKSkgeworICAgICAgICAvLyBUYWtlIHNob3J0Y3V0cyB0byB1c2UgbGlieXV2IGZ1bmN0aW9ucyBiZXR3ZWVuIE5WMTIgYW5kIEk0MjAgY29udmVyc2lvbi4KKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMV0ubU9mZnNldDsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3YgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMl0ubU9mZnNldDsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3kgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfdSA9IGltZy0+bVBsYW5lWzFdLm1Sb3dJbmM7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV92ID0gaW1nLT5tUGxhbmVbMl0ubVJvd0luYzsKKyAgICAgICAgdWludDhfdCogZHN0X3kgPSB2aWV3LmRhdGEoKVswXTsKKyAgICAgICAgdWludDhfdCogZHN0X3UgPSB2aWV3LmRhdGEoKVsxXTsKKyAgICAgICAgdWludDhfdCogZHN0X3YgPSB2aWV3LmRhdGEoKVsyXTsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3kgPSB2aWV3LmxheW91dCgpLnBsYW5lc1swXS5yb3dJbmM7CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMV0ucm93SW5jOworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfdiA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzJdLnJvd0luYzsKKyAgICAgICAgaWYgKElzTlYxMihpbWcpICYmIElzSTQyMCh2aWV3KSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMTJUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHZpZXcud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuaGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Okk0MjBUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHZpZXcud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuaGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBfSW1hZ2VDb3B5PGZhbHNlPih2aWV3LCBpbWcsIGltZ0Jhc2UpOworfQorCitib29sIElzWVVWNDIwKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpIHsKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICByZXR1cm4gKGxheW91dC5udW1QbGFuZXMgPT0gMworICAgICAgICAgICAgJiYgbGF5b3V0LnR5cGUgPT0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jaGFubmVsID09IEMyUGxhbmVJbmZvOjpDSEFOTkVMX1kKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmFsbG9jYXRlZERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmJpdERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLnJpZ2h0U2hpZnQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sU2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0ucm93U2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uYWxsb2NhdGVkRGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uYml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucmlnaHRTaGlmdCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb3dTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jaGFubmVsID09IEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5hbGxvY2F0ZWREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5iaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yaWdodFNoaWZ0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbFNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJvd1NhbXBsaW5nID09IDIpOworfQorCitib29sIElzTlYxMihjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgaWYgKCFJc1lVVjQyMCh2aWV3KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIHJldHVybiAobGF5b3V0LnJvb3RQbGFuZXMgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJvb3RJeCA9PSBsYXlvdXQuUExBTkVfVQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ub2Zmc2V0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1UKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLm9mZnNldCA9PSAxKTsKK30KKworYm9vbCBJc0k0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGlmICghSXNZVVY0MjAodmlldykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICByZXR1cm4gKGxheW91dC5yb290UGxhbmVzID09IDMKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1UKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLm9mZnNldCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucm9vdEl4ID09IGxheW91dC5QTEFORV9WCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5vZmZzZXQgPT0gMCk7Cit9CisKK2Jvb2wgSXNZVVY0MjAoY29uc3QgTWVkaWFJbWFnZTIgKmltZykgeworICAgIHJldHVybiAoaW1nLT5tVHlwZSA9PSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYKKyAgICAgICAgICAgICYmIGltZy0+bU51bVBsYW5lcyA9PSAzCisgICAgICAgICAgICAmJiBpbWctPm1CaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBpbWctPm1CaXREZXB0aEFsbG9jYXRlZCA9PSA4CisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVswXS5tSG9yaXpTdWJzYW1wbGluZyA9PSAxCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVswXS5tVmVydFN1YnNhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzFdLm1Ib3JpelN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzFdLm1WZXJ0U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubUhvcml6U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubVZlcnRTdWJzYW1wbGluZyA9PSAyKTsKK30KKworYm9vbCBJc05WMTIoY29uc3QgTWVkaWFJbWFnZTIgKmltZykgeworICAgIGlmICghSXNZVVY0MjAoaW1nKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAoaW1nLT5tUGxhbmVbMV0ubUNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tQ29sSW5jID09IDIKKyAgICAgICAgICAgICYmIChpbWctPm1QbGFuZVsyXS5tT2Zmc2V0IC0gaW1nLT5tUGxhbmVbMV0ubU9mZnNldCA9PSAxKSk7Cit9CisKK2Jvb2wgSXNJNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICBpZiAoIUlzWVVWNDIwKGltZykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKGltZy0+bVBsYW5lWzFdLm1Db2xJbmMgPT0gMQorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubUNvbEluYyA9PSAxCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0ID4gaW1nLT5tUGxhbmVbMV0ubU9mZnNldCk7Cit9CisKK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpIHsKKyAgICByZXR1cm4gTWVkaWFJbWFnZTIgeworICAgICAgICAubVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYsCisgICAgICAgIC5tTnVtUGxhbmVzID0gMywKKyAgICAgICAgLm1XaWR0aCA9IHdpZHRoLAorICAgICAgICAubUhlaWdodCA9IGhlaWdodCwKKyAgICAgICAgLm1CaXREZXB0aCA9IDgsCisgICAgICAgIC5tQml0RGVwdGhBbGxvY2F0ZWQgPSA4LAorICAgICAgICAubVBsYW5lID0geworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUgKiA1IC8gNCwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgIH07Cit9CisKK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFNlbWlQbGFuYXJNZWRpYUltYWdlMigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKSB7CisgICAgcmV0dXJuIE1lZGlhSW1hZ2UyIHsKKyAgICAgICAgLm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWLAorICAgICAgICAubU51bVBsYW5lcyA9IDMsCisgICAgICAgIC5tV2lkdGggPSB3aWR0aCwKKyAgICAgICAgLm1IZWlnaHQgPSBoZWlnaHQsCisgICAgICAgIC5tQml0RGVwdGggPSA4LAorICAgICAgICAubUJpdERlcHRoQWxsb2NhdGVkID0gOCwKKyAgICAgICAgLm1QbGFuZSA9IHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAxLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAyLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUgKyAxLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMiwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICB9OworfQorCitzdGF0dXNfdCBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLCBzaXplX3QgYnVmZmVyU2l6ZSwKKyAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmc3JjKSB7CisgICAgQ0hFQ0soZHN0WSAhPSBudWxscHRyKTsKKyAgICBDSEVDSygoc3JjLndpZHRoKCkgJiAxKSA9PSAwKTsKKyAgICBDSEVDSygoc3JjLmhlaWdodCgpICYgMSkgPT0gMCk7CisKKyAgICBpZiAoZHN0U3RyaWRlICogZHN0VlN0cmlkZSAqIDMgLyAyID4gYnVmZmVyU2l6ZSkgeworICAgICAgICBBTE9HRCgiY29udmVyc2lvbiBidWZmZXIgaXMgdG9vIHNtYWxsIGZvciBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVViIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RZICsgZHN0U3RyaWRlICogZHN0VlN0cmlkZTsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0VSArIChkc3RTdHJpZGUgPj4gMSkgKiAoZHN0VlN0cmlkZSA+PiAxKTsKKworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSBzcmMubGF5b3V0KCk7CisgICAgY29uc3QgdWludDhfdCAqcFJlZCAgID0gc3JjLmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfUl07CisgICAgY29uc3QgdWludDhfdCAqcEdyZWVuID0gc3JjLmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfR107CisgICAgY29uc3QgdWludDhfdCAqcEJsdWUgID0gc3JjLmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfQl07CisKKyNkZWZpbmUgQ0xJUDMoeCx5LHopICgoKHopIDwgKHgpKSA/ICh4KSA6ICgoKHopID4gKHkpKSA/ICh5KSA6ICh6KSkpCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuaGVpZ2h0KCk7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy53aWR0aCgpOyArK3gpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVkID0gKnBSZWQ7CisgICAgICAgICAgICB1aW50OF90IGdyZWVuID0gKnBHcmVlbjsKKyAgICAgICAgICAgIHVpbnQ4X3QgYmx1ZSA9ICpwQmx1ZTsKKworICAgICAgICAgICAgLy8gdXNpbmcgSVRVLVIgQlQuNjAxIGNvbnZlcnNpb24gbWF0cml4CisgICAgICAgICAgICB1bnNpZ25lZCBsdW1hID0KKyAgICAgICAgICAgICAgICBDTElQMygwLCAoKChyZWQgKiA2NiArIGdyZWVuICogMTI5ICsgYmx1ZSAqIDI1KSA+PiA4KSArIDE2KSwgMjU1KTsKKworICAgICAgICAgICAgZHN0WVt4XSA9IGx1bWE7CisKKyAgICAgICAgICAgIGlmICgoeCAmIDEpID09IDAgJiYgKHkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgVSA9CisgICAgICAgICAgICAgICAgICAgIENMSVAzKDAsICgoKC1yZWQgKiAzOCAtIGdyZWVuICogNzQgKyBibHVlICogMTEyKSA+PiA4KSArIDEyOCksIDI1NSk7CisKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBWID0KKyAgICAgICAgICAgICAgICAgICAgQ0xJUDMoMCwgKCgocmVkICogMTEyIC0gZ3JlZW4gKiA5NCAtIGJsdWUgKiAxOCkgPj4gOCkgKyAxMjgpLCAyNTUpOworCisgICAgICAgICAgICAgICAgZHN0VVt4ID4+IDFdID0gVTsKKyAgICAgICAgICAgICAgICBkc3RWW3ggPj4gMV0gPSBWOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFJlZCAgICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdLmNvbEluYzsKKyAgICAgICAgICAgIHBHcmVlbiArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXS5jb2xJbmM7CisgICAgICAgICAgICBwQmx1ZSAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0uY29sSW5jOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh5ICYgMSkgPT0gMCkgeworICAgICAgICAgICAgZHN0VSArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgICAgIGRzdFYgKz0gZHN0U3RyaWRlID4+IDE7CisgICAgICAgIH0KKworICAgICAgICBwUmVkICAgLT0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0uY29sSW5jICogc3JjLndpZHRoKCk7CisgICAgICAgIHBHcmVlbiAtPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXS5jb2xJbmMgKiBzcmMud2lkdGgoKTsKKyAgICAgICAgcEJsdWUgIC09IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdLmNvbEluYyAqIHNyYy53aWR0aCgpOworICAgICAgICBwUmVkICAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0ucm93SW5jOworICAgICAgICBwR3JlZW4gKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfR10ucm93SW5jOworICAgICAgICBwQmx1ZSAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0ucm93SW5jOworCisgICAgICAgIGRzdFkgKz0gZHN0U3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogQSBibG9jayBvZiByYXcgYWxsb2NhdGVkIG1lbW9yeS4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbEJsb2NrIHsKKyAgICBNZW1vcnlCbG9ja1Bvb2xCbG9jayhzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBtRGF0YShuZXcgdWludDhfdFtzaXplXSksIG1TaXplKG1EYXRhID8gc2l6ZSA6IDApIHsgfQorCisgICAgfk1lbW9yeUJsb2NrUG9vbEJsb2NrKCkgeworICAgICAgICBkZWxldGVbXSBtRGF0YTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2l6ZTsKKyAgICB9CisKKyAgICBDMl9ET19OT1RfQ09QWShNZW1vcnlCbG9ja1Bvb2xCbG9jayk7CisKK3ByaXZhdGU6CisgICAgdWludDhfdCAqbURhdGE7CisgICAgc2l6ZV90IG1TaXplOworfTsKKworLyoqCisgKiBBIHNpbXBsZSByYXcgbWVtb3J5IGJsb2NrIHBvb2wgaW1wbGVtZW50YXRpb24uCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9ja1Bvb2xJbXBsIHsKKyAgICB2b2lkIHJlbGVhc2Uoc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgYmxvY2spIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgLy8gcmV0dXJuIGJsb2NrIHRvIGZyZWUgYmxvY2tzIGlmIGl0IGlzIHRoZSBjdXJyZW50IHNpemU7IG90aGVyd2lzZSwgZGlzY2FyZAorICAgICAgICBpZiAoYmxvY2stPnNpemUoKSA9PSBtQ3VycmVudFNpemUpIHsKKyAgICAgICAgICAgIG1GcmVlQmxvY2tzLnNwbGljZShtRnJlZUJsb2Nrcy5iZWdpbigpLCBtQmxvY2tzSW5Vc2UsIGJsb2NrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CbG9ja3NJblVzZS5lcmFzZShibG9jayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBmZXRjaChzaXplX3Qgc2l6ZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtRnJlZUJsb2Nrcy5yZW1vdmVfaWYoW3NpemVdKGNvbnN0IE1lbW9yeUJsb2NrUG9vbEJsb2NrICZibG9jaykgLT4gYm9vbCB7CisgICAgICAgICAgICByZXR1cm4gYmxvY2suc2l6ZSgpICE9IHNpemU7CisgICAgICAgIH0pOworICAgICAgICBtQ3VycmVudFNpemUgPSBzaXplOworICAgICAgICBpZiAobUZyZWVCbG9ja3MuZW1wdHkoKSkgeworICAgICAgICAgICAgbUJsb2Nrc0luVXNlLmVtcGxhY2VfZnJvbnQoc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmxvY2tzSW5Vc2Uuc3BsaWNlKG1CbG9ja3NJblVzZS5iZWdpbigpLCBtRnJlZUJsb2NrcywgbUZyZWVCbG9ja3MuYmVnaW4oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1CbG9ja3NJblVzZS5iZWdpbigpOworICAgIH0KKworICAgIE1lbW9yeUJsb2NrUG9vbEltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICBDMl9ET19OT1RfQ09QWShNZW1vcnlCbG9ja1Bvb2xJbXBsKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+IG1GcmVlQmxvY2tzOworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz4gbUJsb2Nrc0luVXNlOworICAgIHNpemVfdCBtQ3VycmVudFNpemU7Cit9OworCit9IC8vIG5hbWVzcGFjZQorCitzdHJ1Y3QgTWVtb3J5QmxvY2tQb29sOjpJbXBsIDogTWVtb3J5QmxvY2tQb29sSW1wbCB7Cit9OworCitzdHJ1Y3QgTWVtb3J5QmxvY2s6OkltcGwgeworICAgIEltcGwoc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgYmxvY2ssCisgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5QmxvY2tQb29sSW1wbD4gcG9vbCkKKyAgICAgICAgOiBtQmxvY2soYmxvY2spLCBtUG9vbChwb29sKSB7CisgICAgfQorCisgICAgfkltcGwoKSB7CisgICAgICAgIG1Qb29sLT5yZWxlYXNlKG1CbG9jayk7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbG9jay0+ZGF0YSgpOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsb2NrLT5zaXplKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIG1CbG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5QmxvY2tQb29sSW1wbD4gbVBvb2w7Cit9OworCitNZW1vcnlCbG9jayBNZW1vcnlCbG9ja1Bvb2w6OmZldGNoKHNpemVfdCBzaXplKSB7CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgcG9vbEJsb2NrID0gbUltcGwtPmZldGNoKHNpemUpOworICAgIHJldHVybiBNZW1vcnlCbG9jayhzdGQ6Om1ha2Vfc2hhcmVkPE1lbW9yeUJsb2NrOjpJbXBsPigKKyAgICAgICAgICAgIHBvb2xCbG9jaywgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PE1lbW9yeUJsb2NrUG9vbEltcGw+KG1JbXBsKSkpOworfQorCitNZW1vcnlCbG9ja1Bvb2w6Ok1lbW9yeUJsb2NrUG9vbCgpCisgICAgOiBtSW1wbChzdGQ6Om1ha2Vfc2hhcmVkPE1lbW9yeUJsb2NrUG9vbDo6SW1wbD4oKSkgeworfQorCitNZW1vcnlCbG9jazo6TWVtb3J5QmxvY2soc3RkOjpzaGFyZWRfcHRyPE1lbW9yeUJsb2NrOjpJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeworfQorCitNZW1vcnlCbG9jazo6TWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7CisKK01lbW9yeUJsb2NrOjp+TWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7CisKK2NvbnN0IHVpbnQ4X3QqIE1lbW9yeUJsb2NrOjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbCA/IG1JbXBsLT5kYXRhKCkgOiBudWxscHRyOworfQorCitzaXplX3QgTWVtb3J5QmxvY2s6OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsID8gbUltcGwtPnNpemUoKSA6IDA7Cit9CisKK01lbW9yeUJsb2NrIE1lbW9yeUJsb2NrOjpBbGxvY2F0ZShzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBNZW1vcnlCbG9ja1Bvb2woKS5mZXRjaChzaXplKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhZGYwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfQlVGRkVSX1VUSUxTX0hfCisjZGVmaW5lIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENvbnZlcnRzIGFuIFJHQiB2aWV3IHRvIHBsYW5hciBZVVYgNDIwIG1lZGlhIGltYWdlLgorICoKKyAqIFxwYXJhbSBkc3RZICAgICAgIHBvaW50ZXIgdG8gbWVkaWEgaW1hZ2UgYnVmZmVyCisgKiBccGFyYW0gZHN0U3RyaWRlICBzdHJpZGUgaW4gYnl0ZXMKKyAqIFxwYXJhbSBkc3RWU3RyaWRlIHZlcnRpY2FsIHN0cmlkZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBidWZmZXJTaXplIG1lZGlhIGltYWdlIGJ1ZmZlciBzaXplCisgKiBccGFyYW0gc3JjIHNvdXJjZSBpbWFnZQorICoKKyAqIFxyZXR2YWwgTk9fTUVNT1JZIG1lZGlhIGltYWdlIGlzIHRvbyBzbWFsbAorICogXHJldHZhbCBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IENvbnZlcnRSR0JUb1BsYW5hcllVVigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICZzcmMpOworCisvKioKKyAqIFJldHVybnMgYSBwbGFuYXIgWVVWIDQyMCA4LWJpdCBtZWRpYSBpbWFnZSBkZXNjcmlwdG9yLgorICoKKyAqIFxwYXJhbSB3aWR0aCB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHN0cmlkZSBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gdnN0cmlkZSB2ZXJ0aWNhbCBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKi8KK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpOworCisvKioKKyAqIFJldHVybnMgYSBzZW1pcGxhbmFyIFlVViA0MjAgOC1iaXQgbWVkaWEgaW1hZ2UgZGVzY3JpcHRvci4KKyAqCisgKiBccGFyYW0gd2lkdGggd2lkdGggb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gaGVpZ2h0IGhlaWdodCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBzdHJpZGUgc3RyaWRlIG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHZzdHJpZGUgdmVydGljYWwgc3RyaWRlIG9mIGltYWdlIGluIHBpeGVscworICovCitNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBTZW1pUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSk7CisKKy8qKgorICogQ29waWVzIGEgZ3JhcGhpYyB2aWV3IGludG8gYSBtZWRpYSBpbWFnZS4KKyAqCisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcKKyAqCisgKiBccmV0dXJuIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgSW1hZ2VDb3B5KHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcsIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIENvcGllcyBhIG1lZGlhIGltYWdlIGludG8gYSBncmFwaGljIHZpZXcuCisgKgorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weShDMkdyYXBoaWNWaWV3ICZ2aWV3LCBjb25zdCB1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgdmlldyBoYXMgYSBZVVYgNDIwIDg4OCBsYXlvdXQuCisgKi8KK2Jvb2wgSXNZVVY0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIHZpZXcgaGFzIGEgTlYxMiBsYXlvdXQuCisgKi8KK2Jvb2wgSXNOVjEyKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSB2aWV3IGhhcyBhIEk0MjAgbGF5b3V0LgorICovCitib29sIElzSTQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgTWVkaWFJbWFnZTIgaGFzIGEgWVVWIDQyMCA4ODggbGF5b3V0LgorICovCitib29sIElzWVVWNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSBNZWRpYUltYWdlMiBoYXMgYSBOVjEyIGxheW91dC4KKyAqLworYm9vbCBJc05WMTIoY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIE1lZGlhSW1hZ2UyIGhhcyBhIEk0MjAgbGF5b3V0LgorICovCitib29sIElzSTQyMChjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworLyoqCisgKiBBIHJhdyBtZW1vcnkgYmxvY2sgdG8gdXNlIGZvciBpbnRlcm5hbCBidWZmZXJzLgorICoKKyAqIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIEMyTGluZWFyQmxvY2tzIGZyb20gYSBwcml2YXRlIEMyQmxvY2tQb29sCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9jayA6IHB1YmxpYyBDMk1lbW9yeUJsb2NrPHVpbnQ4X3Q+IHsKKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBpbmxpbmUgdWludDhfdCAqZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y29uc3QgTWVtb3J5QmxvY2sqPih0aGlzKS0+ZGF0YSgpKTsKKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZXMgYW4gdW5tYW5hZ2VkIGJsb2NrIChub3QgaW4gYSBwb29sKQorICAgIHN0YXRpYyBNZW1vcnlCbG9jayBBbGxvY2F0ZShzaXplX3QpOworCisgICAgLy8gbWVtb3J5IGJsb2NrIHdpdGggbm8gYWN0dWFsIG1lbW9yeSAoc2l6ZSBpcyAwLCBkYXRhIGlzIG51bGwpCisgICAgTWVtb3J5QmxvY2soKTsKKworICAgIHN0cnVjdCBJbXBsOworICAgIE1lbW9yeUJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlCbG9jaygpOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSByYXcgbWVtb3J5IG1pbmktcG9vbC4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbCB7CisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJsb2NrIHdpdGggYSBnaXZlbiBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgc2l6ZSBpbiBieXRlcworICAgICAqLworICAgIE1lbW9yeUJsb2NrIGZldGNoKHNpemVfdCBzaXplKTsKKworICAgIE1lbW9yeUJsb2NrUG9vbCgpOworICAgIH5NZW1vcnlCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhMTMxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwCkBAIC0wLDAgKzEsOTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyTWFwcGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4gIC8vIGZvciBJTlQzMl9NQVgKKworI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQWFjUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsICAgICAgICAgQUFDT2JqZWN0TEMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19NQUlOLCAgICAgICBBQUNPYmplY3RNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU1NSLCAgICAgICAgQUFDT2JqZWN0U1NSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTFRQLCAgICAgICAgQUFDT2JqZWN0TFRQIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsICAgICAgICAgQUFDT2JqZWN0SEUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TQ0FMQUJMRSwgICBBQUNPYmplY3RTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX0xDLCAgICAgIEFBQ09iamVjdEVSTEMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSwgQUFDT2JqZWN0RVJTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELCAgICAgICAgIEFBQ09iamVjdExEIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsICAgICAgQUFDT2JqZWN0SEVfUFMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsICAgICAgICBBQUNPYmplY3RFTEQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEUsICAgICAgICBBQUNPYmplY3RYSEUgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNBdmNMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzEsICAgIEFWQ0xldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xQiwgICBBVkNMZXZlbDFiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSwgIEFWQ0xldmVsMTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yLCAgQVZDTGV2ZWwxMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMsICBBVkNMZXZlbDEzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzIsICAgIEFWQ0xldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18yXzEsICBBVkNMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiwgIEFWQ0xldmVsMjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMywgICAgQVZDTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSwgIEFWQ0xldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfM18yLCAgQVZDTGV2ZWwzMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180LCAgICBBVkNMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xLCAgQVZDTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180XzIsICBBVkNMZXZlbDQyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzUsICAgIEFWQ0xldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ181XzEsICBBVkNMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMiwgIEFWQ0xldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNiwgICAgQVZDTGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzZfMSwgIEFWQ0xldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNl8yLCAgQVZDTGV2ZWw2MiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXZjUHJvZmlsZXMgPSB7CisgICAgLy8gdHJlYXQgcmVzdHJpY3RlZCBwcm9maWxlcyBhcyBmdWxsIHByb2ZpbGUgaWYgdGhlcmUgaXMgbm8gZXF1aXZhbGVudCAtIHdoaWNoIHdvcmtzIGZvcgorICAgIC8vIGRlY29kZXJzLCBidXQgbm90IGZvciBlbmNvZGVycworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0JBU0VMSU5FLCAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVCYXNlbGluZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiwgICAgICAgICAgICAgICAgICAgQVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FWFRFTkRFRCwgICAgICAgICAgICAgICBBVkNQcm9maWxlRXh0ZW5kZWQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdILCAgICAgICAgICAgICAgICAgICBBVkNQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsICAgICAgIEFWQ1Byb2ZpbGVIaWdoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCwgICAgICAgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTAsICAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwLCAgICBBVkNQcm9maWxlSGlnaDEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjIsICAgICAgICAgICAgICAgQVZDUHJvZmlsZUhpZ2g0MjIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9QUkVESUNUSVZFLCAgICBBVkNQcm9maWxlSGlnaDQ0NCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEsICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMl9JTlRSQSwgICAgICAgICBBVkNQcm9maWxlSGlnaDQyMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBLCAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoNDQ0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBLCAgICAgICAgQVZDUHJvZmlsZUhpZ2g0NDQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCBpbnQzMl90PiBzQml0cmF0ZU1vZGVzID0geworICAgIHsgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsICAgICAgQklUUkFURV9NT0RFX0NCUiB9LAorICAgIHsgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUsICAgQklUUkFURV9NT0RFX1ZCUiB9LAorICAgIHsgQzJDb25maWc6OkJJVFJBVEVfSUdOT1JFLCAgICAgQklUUkFURV9NT0RFX0NRIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6Om1hdHJpeF90LCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcz4gc0NvbG9yTWF0cmljZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgIENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDcwOSwgICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQ3MDlfNSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0ZDQzQ3XzczXzY4MiwgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDQ3MF82TSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUNjAxLCAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDYwMV82IH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfMjQwTSwgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhTTVBURTI0ME0gfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAsICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQyMDIwIH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwX0NPTlNUQU5ULCBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUMjAyMENvbnN0YW50IH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfT1RIRVIsICAgICAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeE90aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnByaW1hcmllc190LCBDb2xvckFzcGVjdHM6OlByaW1hcmllcz4gc0NvbG9yUHJpbWFyaWVzU2YgPSB7CisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsICBDb2xvckFzcGVjdHM6OlByaW1hcmllc1Vuc3BlY2lmaWVkIH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQ3MDksICAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNzA5XzUgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDQ3MF9NLCAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ0NzBfNk0gfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDYwMV82MjUsICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ2MDFfNl82MjUgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDYwMV81MjUsICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ2MDFfNl81MjUgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19HRU5FUklDX0ZJTE0sIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzR2VuZXJpY0ZpbG0gfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAsICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQyMDIwIH0sCisvLyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19SUDQzMSwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLi4uIH0sCisvLyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19FRzQzMiwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLi4uIH0sCisvLyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19FQlUzMjEzLCAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLi4uIH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIsICAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc090aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnJhbmdlX3QsIGludDMyX3Q+IHNDb2xvclJhbmdlcyA9IHsKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0ZVTEwsICAgIENPTE9SX1JBTkdFX0ZVTEwgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIENPTE9SX1JBTkdFX0xJTUlURUQgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6cmFuZ2VfdCwgQ29sb3JBc3BlY3RzOjpSYW5nZT4gc0NvbG9yUmFuZ2VzU2YgPSB7CisgICAgeyBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkIH0sCisgICAgeyBDMkNvbG9yOjpSQU5HRV9GVUxMLCAgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZUZ1bGwgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsICAgICBDb2xvckFzcGVjdHM6OlJhbmdlTGltaXRlZCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfT1RIRVIsICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VPdGhlciB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjp0cmFuc2Zlcl90LCBpbnQzMl90PiBzQ29sb3JUcmFuc2ZlcnMgPSB7CisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9MSU5FQVIsIENPTE9SX1RSQU5TRkVSX0xJTkVBUiB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfMTcwTSwgICBDT0xPUl9UUkFOU0ZFUl9TRFJfVklERU8gfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCwgQ09MT1JfVFJBTlNGRVJfU1QyMDg0IH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9ITEcsICAgIENPTE9SX1RSQU5TRkVSX0hMRyB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjp0cmFuc2Zlcl90LCBDb2xvckFzcGVjdHM6OlRyYW5zZmVyPiBzQ29sb3JUcmFuc2ZlcnNTZiA9IHsKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0xJTkVBUiwgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyTGluZWFyIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9TUkdCLCAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNSR0IgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSXzE3ME0sICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU01QVEUxNzBNIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTIyLCAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckdhbW1hMjIgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0dBTU1BMjgsICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyR2FtbWEyOCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0LCAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTVDIwODQgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0hMRywgICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVySExHIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl8yNDBNLCAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNNUFRFMjQwTSB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfWFZZQ0MsICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJYdllDQyB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfQlQxMzYxLCAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJCVDEzNjEgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NUNDI4LCAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU1Q0MjggfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSLCAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyT3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNEb2xieVZpc2lvbkxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0hEXzI0LCAgRG9sYnlWaXNpb25MZXZlbEhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0hEXzMwLCAgRG9sYnlWaXNpb25MZXZlbEhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0ZIRF8yNCwgRG9sYnlWaXNpb25MZXZlbEZoZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9GSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fRkhEXzYwLCBEb2xieVZpc2lvbkxldmVsRmhkNjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF8yNCwgRG9sYnlWaXNpb25MZXZlbFVoZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzQ4LCBEb2xieVZpc2lvbkxldmVsVWhkNDggfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF82MCwgRG9sYnlWaXNpb25MZXZlbFVoZDYwIH0sCisKKyAgICAvLyBoaWdoIHRpZXJzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBvbiBhbmRyb2lkLCBmb3Igbm93IG1hcCB0aGVtIHRvIG1haW4gdGllcgorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfSERfMjQsICBEb2xieVZpc2lvbkxldmVsSGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfSERfMzAsICBEb2xieVZpc2lvbkxldmVsSGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfRkhEXzI0LCBEb2xieVZpc2lvbkxldmVsRmhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0ZIRF8zMCwgRG9sYnlWaXNpb25MZXZlbEZoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9GSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQ2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzI0LCBEb2xieVZpc2lvbkxldmVsVWhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF8zMCwgRG9sYnlWaXNpb25MZXZlbFVoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfNDgsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzYwLCBEb2xieVZpc2lvbkxldmVsVWhkNjAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0RvbGJ5VmlzaW9uUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9BVl9QRVIsIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZXIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0FWX1BFTiwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfREVSLCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV9ERU4sIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA0LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wNSwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0biB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfRFRILCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wNywgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0YiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfMDgsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfQVZfMDksIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0gyNjNMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwgSDI2M0xldmVsMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwLCBIMjYzTGV2ZWwyMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAsIEgyNjNMZXZlbDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwgSDI2M0xldmVsNDAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1LCBIMjYzTGV2ZWw0NSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNTAsIEgyNjNMZXZlbDUwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M182MCwgSDI2M0xldmVsNjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzcwLCBIMjYzTGV2ZWw3MCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzSDI2M1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19CQVNFTElORSwgICAgICAgICAgSDI2M1Byb2ZpbGVCYXNlbGluZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19IMzIwLCAgICAgICAgICAgICAgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX1YxQkMsICAgICAgICAgICAgICBIMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMiwgICAgICAgICAgICAgSDI2M1Byb2ZpbGVJU1dWMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMywgICAgICAgICAgICAgSDI2M1Byb2ZpbGVJU1dWMyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19ISUdIX0NPTVBSRVNTSU9OLCAgSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb24gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJORVQsICAgICAgICAgIEgyNjNQcm9maWxlSW50ZXJuZXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJMQUNFLCAgICAgICAgIEgyNjNQcm9maWxlSW50ZXJsYWNlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfTEFURU5DWSwgICAgICBIMjYzUHJvZmlsZUhpZ2hMYXRlbmN5IH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzSGV2Y0xldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSwgICAgICBIRVZDTWFpblRpZXJMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiwgICAgICBIRVZDTWFpblRpZXJMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xLCAgICBIRVZDTWFpblRpZXJMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsICAgICAgSEVWQ01haW5UaWVyTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWwzMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80LCAgICAgIEhFVkNNYWluVGllckxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEsICAgIEhFVkNNYWluVGllckxldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNSwgICAgICBIRVZDTWFpblRpZXJMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xLCAgICBIRVZDTWFpblRpZXJMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiwgICAgSEVWQ01haW5UaWVyTGV2ZWw1MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82LCAgICAgIEhFVkNNYWluVGllckxldmVsNiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzEsICAgIEhFVkNNYWluVGllckxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8yLCAgICBIRVZDTWFpblRpZXJMZXZlbDYyIH0sCisKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNCwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNF8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzUsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzIsICAgIEhFVkNIaWdoVGllckxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNiwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDYgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMiwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw2MiB9LAorCisgICAgLy8gbWFwIGhpZ2ggdGllciBsZXZlbHMgYmVsb3cgNCB0byBtYWluIHRpZXIKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwzMSB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzSGV2Y1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLCBIRVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTCwgSEVWQ1Byb2ZpbGVNYWluU3RpbGwgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSwgSEVWQ1Byb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTBfSU5UUkEsIEhFVkNQcm9maWxlTWFpbjEwIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIZXZjSGRyUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0hldmNIZHIxMFBsdXNQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXMgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNNcGVnMkxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVywgICAgICAgICBNUEVHMkxldmVsTEwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4sICAgICAgICBNUEVHMkxldmVsTUwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCwgICBNUEVHMkxldmVsSDE0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdILCAgICAgICAgTVBFRzJMZXZlbEhMIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIUCwgICAgICAgTVBFRzJMZXZlbEhQIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNNcGVnMlByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZVNpbXBsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU05SX1NDQUxBQkxFLCAgICAgICAgICBNUEVHMlByb2ZpbGVTTlIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFLCAgICBNUEVHMlByb2ZpbGVTcGF0aWFsIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgTVBFRzJQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl80MjIsICAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZTQyMiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc01wZWc0TGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMCwgICBNUEVHNExldmVsMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsICBNUEVHNExldmVsMGIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsICAgTVBFRzRMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzIsICAgTVBFRzRMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMsICAgTVBFRzRMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzNCLCAgTVBFRzRMZXZlbDNiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80LCAgIE1QRUc0TGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSwgIE1QRUc0TGV2ZWw0YSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNSwgICBNUEVHNExldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNiwgICBNUEVHNExldmVsNiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzTXBlZzRQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFLCAgICAgICAgICAgIE1QRUc0UHJvZmlsZVNpbXBsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUsICAgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRSwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUNvcmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTUFJTiwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTkJJVCwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZU5iaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQVJUUywgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TQ0FMQUJMRSwgICAgIE1QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BQ0UsICAgICAgICAgICAgICAgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfQ09SRSwgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9TSU1QTEUsICAgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnBjbV9lbmNvZGluZ190LCBpbnQzMl90PiBzUGNtRW5jb2RpbmdzID0geworICAgIHsgQzJDb25maWc6OlBDTV84LCBrQXVkaW9FbmNvZGluZ1BjbThiaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fMTYsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fRkxPQVQsIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNWcDlMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsICAgIFZQOUxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsICBWUDlMZXZlbDExIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzIsICAgIFZQOUxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEsICBWUDlMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzMsICAgIFZQOUxldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8zXzEsICBWUDlMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsICAgIFZQOUxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsICBWUDlMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzUsICAgIFZQOUxldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV81XzEsICBWUDlMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMiwgIFZQOUxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNiwgICAgVlA5TGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMSwgIFZQOUxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8yLCAgVlA5TGV2ZWw2MiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5UHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwgVlA5UHJvZmlsZTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8xLCBWUDlQcm9maWxlMSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yLCBWUDlQcm9maWxlMkhEUiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMsIFZQOVByb2ZpbGUzSERSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIxMFBsdXMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUjEwUGx1cyB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5SGRyUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5SGRyMTBQbHVzUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIxMFBsdXMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUjEwUGx1cyB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0F2MUxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMiwgICAgQVYxTGV2ZWwyICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEsICBBVjFMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMiwgIEFWMUxldmVsMjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8zLCAgQVYxTGV2ZWwyMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8zLCAgICBBVjFMZXZlbDMgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMSwgIEFWMUxldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yLCAgQVYxTGV2ZWwzMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8zXzMsICBBVjFMZXZlbDMzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzQsICAgIEFWMUxldmVsNCAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8xLCAgQVYxTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV80XzIsICBBVjFMZXZlbDQyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMywgIEFWMUxldmVsNDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNSwgICAgQVYxTGV2ZWw1ICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV81XzEsICBBVjFMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMiwgIEFWMUxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8zLCAgQVYxTGV2ZWw1MyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV82LCAgICBBVjFMZXZlbDYgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMSwgIEFWMUxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8yLCAgQVYxTGV2ZWw2MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV82XzMsICBBVjFMZXZlbDYzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzcsICAgIEFWMUxldmVsNyAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfN18xLCAgQVYxTGV2ZWw3MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83XzIsICBBVjFMZXZlbDcyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMywgIEFWMUxldmVsNzMgfSwKK307CisKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXYxUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8xLCBBVjFQcm9maWxlMSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzIsIEFWMVByb2ZpbGUyIH0sCit9OworCisKKy8qKgorICogQSBoZWxwZXIgdGhhdCBwYXNzZXMgdGhyb3VnaCB2ZW5kb3IgZXh0ZW5zaW9uIHByb2ZpbGUgYW5kIGxldmVsIHZhbHVlcy4KKyAqLworc3RydWN0IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciA6IEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSA9IDA7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICAgIGJvb2wgcGFzc1Rocm91Z2hNYXAoVCBmcm9tLCBVICp0bykgeworICAgICAgICAvLyBhbGxvdyAoYW5kIHBhc3MgdGhyb3VnaCkgdmVuZG9yIGV4dGVuc2lvbnMKKyAgICAgICAgaWYgKGZyb20gPj0gKFQpQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgJiYgZnJvbSA8IChUKUlOVDMyX01BWCkgeworICAgICAgICAgICAgKnRvID0gKFUpZnJvbTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzaW1wbGVNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoTWFwKGZyb20sIHRvKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworLy8gQUFDIG9ubHkgdXNlcyBwcm9maWxlcywgbWFwIGFsbCBsZXZlbHMgdG8gdW51c2VkIG9yIDAKK3N0cnVjdCBBYWNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QsIGludDMyX3QgKnRvKSB7CisgICAgICAgICp0byA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQWFjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQWFjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgQXZjUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgRG9sYnlWaXNpb25Qcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvbkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25MZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25Qcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvblByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IEgyNjNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgSGV2Y1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgSGV2Y1Byb2ZpbGVMZXZlbE1hcHBlcihib29sIGlzSGRyID0gZmFsc2UsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSkgOgorICAgICAgICBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIoKSwKKyAgICAgICAgbUlzSGRyKGlzSGRyKSwgbUlzSGRyMTBQbHVzKGlzSGRyMTBQbHVzKSB7fQorCisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0hldmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0hldmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzSGV2Y0hkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0hldmNIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNIZXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzSGV2Y0hkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0hldmNIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNIZXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNIZHI7CisgICAgYm9vbCBtSXNIZHIxMFBsdXM7Cit9OworCitzdHJ1Y3QgTXBlZzJQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzJMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzJQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMlByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IE1wZWc0UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWc0TGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWc0UHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKKy8vIFZQOCBoYXMgbm8gcHJvZmlsZXMgYW5kIGxldmVscyBpbiBDb2RlYyAyLjAsIGJ1dCB3ZSB1c2UgbWFpbiBwcm9maWxlIGFuZCBsZXZlbCAwIGluIE1lZGlhQ29kZWMKKy8vIG1hcCBhbGwgcHJvZmlsZXMgYW5kIGxldmVscyB0byB0aGF0Lgorc3RydWN0IFZwOFByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gVlA4TGV2ZWxfVmVyc2lvbjA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90ICp0bykgeworICAgICAgICAqdG8gPSBWUDhQcm9maWxlTWFpbjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gQzJDb25maWc6OlBST0ZJTEVfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVnA5UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICBWcDlQcm9maWxlTGV2ZWxNYXBwZXIoYm9vbCBpc0hkciA9IGZhbHNlLCBib29sIGlzSGRyMTBQbHVzID0gZmFsc2UpIDoKKyAgICAgICAgUHJvZmlsZUxldmVsTWFwcGVySGVscGVyKCksCisgICAgICAgIG1Jc0hkcihpc0hkciksIG1Jc0hkcjEwUGx1cyhpc0hkcjEwUGx1cykge30KKworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNWcDlMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc1ZwOUxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNWcDlIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNWcDlIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNWcDlQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNWcDlIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNWcDlIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNWcDlQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIG1Jc0hkcjsKKyAgICBib29sIG1Jc0hkcjEwUGx1czsKK307CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+CitDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSkgeworICAgIHN0ZDo6dHJhbnNmb3JtKG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmVuZCgpLCA6OnRvbG93ZXIpOworICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfQVVESU9fQUFDKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEFhY1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QXZjUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxEb2xieVZpc2lvblByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IMjYzKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEgyNjNQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIZXZjUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX01QRUcyKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPE1wZWcyUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX01QRUc0KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPE1wZWc0UHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxWcDhQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFZwOVByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+CitDMk1hcHBlcjo6R2V0SGRyUHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSwgYm9vbCBpc0hkcjEwUGx1cykgeworICAgIHN0ZDo6dHJhbnNmb3JtKG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmVuZCgpLCA6OnRvbG93ZXIpOworICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIZXZjUHJvZmlsZUxldmVsTWFwcGVyPih0cnVlLCBpc0hkcjEwUGx1cyk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFZwOVByb2ZpbGVMZXZlbE1hcHBlcj4odHJ1ZSwgaXNIZHIxMFBsdXMpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb25maWc6OmJpdHJhdGVfbW9kZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgcmV0dXJuIHNCaXRyYXRlTW9kZXMubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QgKnRvKSB7CisgICAgcmV0dXJuIHNCaXRyYXRlTW9kZXMubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb25maWc6OnBjbV9lbmNvZGluZ190IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgcmV0dXJuIHNQY21FbmNvZGluZ3MubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgKnRvKSB7CisgICAgcmV0dXJuIHNQY21FbmNvZGluZ3MubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cmFuZ2VfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICAvLyBtYXAgU0RLIGRlZmluZWQgdmFsdWVzIGRpcmVjdGx5LiBGb3Igb3RoZXIgdmFsdWVzLCB1c2Ugd3JhcHBpbmcgZnJvbSBDb2xvclV0aWxzLgorICAgIGlmICghc0NvbG9yUmFuZ2VzLm1hcChmcm9tLCB0bykpIHsKKyAgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZSBzZlJhbmdlOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yUmFuZ2VzU2YubWFwKGZyb20sICZzZlJhbmdlKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgaWYgKGZyb20gPCBDMkNvbG9yOjpSQU5HRV9WRU5ET1JfU1RBUlQgfHwgZnJvbSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgc2ZSYW5nZSA9IENvbG9yQXNwZWN0czo6UmFuZ2VPdGhlcjsKKyAgICAgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICp0byA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JSYW5nZShzZlJhbmdlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbG9yOjpyYW5nZV90ICp0bykgeworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JSYW5nZXMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlIHNmUmFuZ2U7CisgICAgICAgICh2b2lkKUNvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclJhbmdlKGZyb20sICZzZlJhbmdlKTsKKworICAgICAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgICAgICBpZiAoIXNDb2xvclJhbmdlc1NmLm1hcChzZlJhbmdlLCB0bykpIHsKKyAgICAgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgICAgICp0byA9IChDMkNvbG9yOjpyYW5nZV90KXNmUmFuZ2U7CisgICAgICAgICAgICBpZiAoKnRvIDwgQzJDb2xvcjo6UkFOR0VfVkVORE9SX1NUQVJUIHx8ICp0byA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgKnRvID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnJhbmdlX3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpSYW5nZSAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yUmFuZ2VzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQ29sb3JBc3BlY3RzOjpSYW5nZSBmcm9tLCBDMkNvbG9yOjpyYW5nZV90ICp0bykgeworICAgIHJldHVybiBzQ29sb3JSYW5nZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXMsIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeCwgaW50MzJfdCAqc3RhbmRhcmQpIHsKKyAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcyBzZlByaW1hcmllczsKKyAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyBzZk1hdHJpeDsKKyAgICBib29sIHJlcyA9IHRydWU7CisKKyAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHByaW1hcmllcywgJnNmUHJpbWFyaWVzKSkgeworICAgICAgICAvLyBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZSBhbmQgdXNlIHN0YXRpYyBjYXN0CisgICAgICAgIGlmIChwcmltYXJpZXMgPCBDMkNvbG9yOjpQUklNQVJJRVNfVkVORE9SX1NUQVJUIHx8IHByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgLy8gdW5kZWZpbmVkIG5vbi1leHRlbnNpb24gdmFsdWVzIG1hcCB0byAnT3RoZXInCisgICAgICAgICAgICBzZlByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzT3RoZXI7CisgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNmUHJpbWFyaWVzID0gKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzKXByaW1hcmllczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc0NvbG9yTWF0cmljZXNTZi5tYXAobWF0cml4LCAmc2ZNYXRyaXgpKSB7CisgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgaWYgKG1hdHJpeCA8IEMyQ29sb3I6Ok1BVFJJWF9WRU5ET1JfU1RBUlQgfHwgbWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAvLyB1bmRlZmluZWQgbm9uLWV4dGVuc2lvbiB2YWx1ZXMgbWFwIHRvICdPdGhlcicKKyAgICAgICAgICAgIHNmTWF0cml4ID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhPdGhlcjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2ZNYXRyaXggPSAoQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMpbWF0cml4OworICAgICAgICB9CisgICAgfQorCisgICAgKnN0YW5kYXJkID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKHNmUHJpbWFyaWVzLCBzZk1hdHJpeCk7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IHN0YW5kYXJkLCBDMkNvbG9yOjpwcmltYXJpZXNfdCAqcHJpbWFyaWVzLCBDMkNvbG9yOjptYXRyaXhfdCAqbWF0cml4KSB7CisgICAgLy8gZmlyc3QgbWFwIHRvIHN0YWdlZnJpZ2h0IGZvdW5kYXRpb24gYXNwZWN0cyA9PiB0aGVzZSBhY3R1YWxseSBtYXAgbmVhcmx5IDE6MSB0bworICAgIC8vIENvZGVjIDIuMCBhc3BlY3RzCisgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgc2ZQcmltYXJpZXM7CisgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMgc2ZNYXRyaXg7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgICh2b2lkKUNvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclN0YW5kYXJkKHN0YW5kYXJkLCAmc2ZQcmltYXJpZXMsICZzZk1hdHJpeCk7CisKKyAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHNmUHJpbWFyaWVzLCBwcmltYXJpZXMpKSB7CisgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgKnByaW1hcmllcyA9IChDMkNvbG9yOjpwcmltYXJpZXNfdClzZlByaW1hcmllczsKKyAgICAgICAgaWYgKCpwcmltYXJpZXMgPCBDMkNvbG9yOjpQUklNQVJJRVNfVkVORE9SX1NUQVJUIHx8ICpwcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICpwcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc0NvbG9yTWF0cmljZXNTZi5tYXAoc2ZNYXRyaXgsIG1hdHJpeCkpIHsKKyAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAqbWF0cml4ID0gKEMyQ29sb3I6Om1hdHJpeF90KXNmTWF0cml4OworICAgICAgICBpZiAoKm1hdHJpeCA8IEMyQ29sb3I6Ok1BVFJJWF9WRU5ET1JfU1RBUlQgfHwgKm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgKm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cHJpbWFyaWVzX3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclByaW1hcmllc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzIGZyb20sIEMyQ29sb3I6OnByaW1hcmllc190ICp0bykgeworICAgIHJldHVybiBzQ29sb3JQcmltYXJpZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjptYXRyaXhfdCBmcm9tLCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yTWF0cmljZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyBmcm9tLCBDMkNvbG9yOjptYXRyaXhfdCAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yTWF0cmljZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjp0cmFuc2Zlcl90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyIHNmVHJhbnNmZXI7CisKKyAgICAgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICAgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnNTZi5tYXAoZnJvbSwgJnNmVHJhbnNmZXIpKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICAgICBpZiAoZnJvbSA8IEMyQ29sb3I6OlRSQU5TRkVSX1ZFTkRPUl9TVEFSVCB8fCBmcm9tID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBzZlRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2Zlck90aGVyOworICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnRvID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclRyYW5zZmVyKHNmVHJhbnNmZXIpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29sb3I6OnRyYW5zZmVyX3QgKnRvKSB7CisgICAgLy8gbWFwIFNESyBkZWZpbmVkIHZhbHVlcyBkaXJlY3RseS4gRm9yIG90aGVyIHZhbHVlcywgdXNlIHdyYXBwaW5nIGZyb20gQ29sb3JVdGlscy4KKyAgICBpZiAoIXNDb2xvclRyYW5zZmVycy5tYXAoZnJvbSwgdG8pKSB7CisgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXIgc2ZUcmFuc2ZlcjsKKyAgICAgICAgKHZvaWQpQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yVHJhbnNmZXIoZnJvbSwgJnNmVHJhbnNmZXIpOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yVHJhbnNmZXJzU2YubWFwKHNmVHJhbnNmZXIsIHRvKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgKnRvID0gKEMyQ29sb3I6OnRyYW5zZmVyX3Qpc2ZUcmFuc2ZlcjsKKyAgICAgICAgICAgIGlmICgqdG8gPCBDMkNvbG9yOjpUUkFOU0ZFUl9WRU5ET1JfU1RBUlQgfHwgKnRvID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICAqdG8gPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoCisgICAgICAgIEMyQ29sb3I6OnJhbmdlX3QgcmFuZ2UsIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllcywKKyAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4LCBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyLCB1aW50MzJfdCAqZGF0YVNwYWNlKSB7CisjaWYgMAorICAgIC8vIHB1cmUgcmVpbXBsZW1lbnRhdGlvbgorICAgICpkYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047IC8vIHRoaXMgaXMgMAorCisgICAgc3dpdGNoIChyYW5nZSkgeworICAgICAgICBjYXNlIEMyQ29sb3I6OlJBTkdFX0ZVTEw6ICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9SQU5HRV9GVUxMOyAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpSQU5HRV9MSU1JVEVEOiAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfUkFOR0VfTElNSVRFRDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAodHJhbnNmZXIpIHsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9MSU5FQVI6ICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfTElORUFSOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfU1JHQjogICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX1NSR0I7ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSXzE3ME06ICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TTVBURV8xNzBNOyBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTIyOiAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfR0FNTUEyXzI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfR0FNTUEyODogKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX0dBTU1BMl84OyAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NDogICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TVDIwODQ7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9ITEc6ICAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfSExHOyAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAocHJpbWFyaWVzKSB7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzUyNToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfMjQwTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDkpCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV81MjVfVU5BREpVU1RFRAorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNTI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzYyNToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfMjQwTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDkpCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV82MjVfVU5BREpVU1RFRAorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNjI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMDoKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwX0NPTlNUQU5UCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDIwMjBfQ09OU1RBTlRfTFVNSU5BTkNFCisgICAgICAgICAgICAgICAgICAgIDogSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDIwMjApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNDcwX006CisgICAgICAgICAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ0NzBNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNzA5OgorICAgICAgICAgICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUNzA5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyNlbHNlCisgICAgLy8gZm9yIG5vdyB1c2UgbGVnYWN5IGltcGxlbWVudGF0aW9uCisgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgaWYgKCFzQ29sb3JSYW5nZXNTZi5tYXAocmFuZ2UsICZhc3BlY3RzLm1SYW5nZSkpIHsKKyAgICAgICAgYXNwZWN0cy5tUmFuZ2UgPSBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHByaW1hcmllcywgJmFzcGVjdHMubVByaW1hcmllcykpIHsKKyAgICAgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFzQ29sb3JNYXRyaWNlc1NmLm1hcChtYXRyaXgsICZhc3BlY3RzLm1NYXRyaXhDb2VmZnMpKSB7CisgICAgICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghc0NvbG9yVHJhbnNmZXJzU2YubWFwKHRyYW5zZmVyLCAmYXNwZWN0cy5tVHJhbnNmZXIpKSB7CisgICAgICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkOworICAgIH0KKyAgICAqZGF0YVNwYWNlID0gQ29sb3JVdGlsczo6Z2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUgLyogbWF5RXhwYW5kICovKTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjp0cmFuc2Zlcl90IGZyb20sIENvbG9yQXNwZWN0czo6VHJhbnNmZXIgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclRyYW5zZmVyc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6VHJhbnNmZXIgZnJvbSwgQzJDb2xvcjo6dHJhbnNmZXJfdCAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yVHJhbnNmZXJzU2YubWFwKGZyb20sIHRvKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM2ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NPREVDMl9NQVBQRVJfSF8KKyNkZWZpbmUgQU5EUk9JRF9DT0RFQzJfTUFQUEVSX0hfCisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgY2xhc3MgdG8gbWFwIENvZGVjIDIuMCB2YWx1ZXMgdG8gYW5kcm9pZCB2YWx1ZXMuCisgICAgICovCisgICAgc3RydWN0IEMyTWFwcGVyIHsKKyAgICAgICAgc3RydWN0IFByb2ZpbGVMZXZlbE1hcHBlciB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90KikgPSAwOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcFByb2ZpbGUoaW50MzJfdCwgQzJDb25maWc6OnByb2ZpbGVfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChpbnQzMl90LCBDMkNvbmZpZzo6bGV2ZWxfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgflByb2ZpbGVMZXZlbE1hcHBlcigpID0gZGVmYXVsdDsKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFByb2ZpbGVMZXZlbE1hcHBlcj4KKyAgICAgICAgR2V0UHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSk7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQcm9maWxlTGV2ZWxNYXBwZXI+CisgICAgICAgIEdldEhkclByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSk7CisKKyAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIGJpdHJhdGVzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBwY20gZW5jb2RpbmdzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBwaWN0dXJlIHR5cGVzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBjb2xvciBhc3BlY3RzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpyYW5nZV90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbG9yOjpyYW5nZV90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCwgQzJDb2xvcjo6bWF0cml4X3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29sb3I6OnByaW1hcmllc190KiwgQzJDb2xvcjo6bWF0cml4X3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29sb3I6OnRyYW5zZmVyX3QqKTsKKworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoCisgICAgICAgICAgICAgICAgQzJDb2xvcjo6cmFuZ2VfdCwgQzJDb2xvcjo6cHJpbWFyaWVzX3QsIEMyQ29sb3I6Om1hdHJpeF90LCBDMkNvbG9yOjp0cmFuc2Zlcl90LAorICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkYXRhU3BhY2UpOworCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpyYW5nZV90LCBDb2xvckFzcGVjdHM6OlJhbmdlKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6OlJhbmdlLCBDMkNvbG9yOjpyYW5nZV90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLCBDMkNvbG9yOjpwcmltYXJpZXNfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6bWF0cml4X3QsIENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcywgQzJDb2xvcjo6bWF0cml4X3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QsIENvbG9yQXNwZWN0czo6VHJhbnNmZXIqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6VHJhbnNmZXIsIEMyQ29sb3I6OnRyYW5zZmVyX3QqKTsKKyAgICB9OworfQorCisjZW5kaWYgIC8vIEFORFJPSURfQ09ERUMyX01BUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U2ZTIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3OSBAQAorY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl9jb3JlX3BhcmFtX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJQYXJhbV90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgLy8gcGFyYW0gdGVzdHMgbXVzdCBub3QgZGVwZW5kIG9uIGFueSBjb2RlYzIgbGlicmFyaWVzIGFzIGFsbCBwYXJhbXMgc2hvdWxkIGJlIHRlbXBsYXRlZAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl92bmRrX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJfdGVzdC5jcHAiLAorICAgICAgICAiQzJTYW1wbGVDb21wb25lbnRfdGVzdC5jcHAiLAorICAgICAgICAiQzJVdGlsVGVzdC5jcHAiLAorICAgICAgICAidm5kay9DMkJ1ZmZlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl92bmRrX2ludGVyZmFjZV90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjczM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAKQEAgLTAsMCArMSw3MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdCIKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworI2lmICFkZWZpbmVkKFVOVVNFRCkKKyNkZWZpbmUgVU5VU0VEKGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHZvaWQpKGV4cHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8vIWRlZmluZWQoVU5VU0VEKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdGQ6OnVuaXF1ZV9wdHI8VD4gYWxsb2NfdW5pcXVlX2NzdHIoY29uc3QgY2hhciAqY3N0cikgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oY3N0cik7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHB0ciA9IFQ6OkFsbG9jVW5pcXVlKGxlbik7CisgICAgbWVtY3B5KHB0ci0+bS52YWx1ZSwgY3N0ciwgbGVuKTsKKyAgICByZXR1cm4gcHRyOworfQorCitjbGFzcyBDMkNvbXBJbnRmVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIEMyQ29tcEludGZUZXN0KCkge30KKyAgICB+QzJDb21wSW50ZlRlc3QoKSBvdmVycmlkZSB7fQorCisgICAgdm9pZCBzZXRDb21wb25lbnQoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKSB7CisgICAgICAgIG1JbnRmID0gaW50ZjsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0UmVzdWx0cygpIHsKKyAgICAgICAgbUludGYgPSBudWxscHRyOworICAgICAgICBtUGFyYW1SZXN1bHRzLmNsZWFyKCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdFVuc3VwcG9ydGVkUGFyYW0oKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHRlc3RTdXBwb3J0ZWRQYXJhbSgpOworCisgICAgLy8gdGVzdFJlYWRPbmx5UGFyYW0oKSBhbmQgdGVzdFdyaXRhYmxlUGFyYW0oKSBhcmUgdGhlIG1haW4gZnVuY3Rpb25zIGZvciB0ZXN0aW5nIGEgcGFyYW1ldGVyLgorICAgIC8vIEEgY2FsbGVyIHNob3VsZCBmaW5kIG91dCBpZiBhIHRlc3RlZCBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IG9yIHdyaXRhYmxlIGJlZm9yZSBjYWxsaW5nIHRoZW0KKyAgICAvLyBhbmQgaXQgbXVzdCBjYWxsIG9uZSBvZiB0aGUgY29ycmVzcG9uZGVkIHRoZW0uCisKKyAgICAvLyBJZiBhIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgdGhpcyBpcyBjYWxsZWQuCisgICAgLy8gVGVzdCByZWFkLW9ubHkgcGFyYW1ldGVyIHxwcmVQYXJhbXwuIFRoZSB0ZXN0IGV4cGVjdHMgZmFpbHVyZSB3aGlsZSBjb25maWcoKSB3aXRoIHxuZXdQYXJhbXwsCisgICAgLy8gYW5kIG1ha2Ugc3VyZSB8cHJlUGFyYW18IHN0YXkgdW5jaGFuZ2VkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgdGVzdFJlYWRPbmx5UGFyYW0oY29uc3QgVCAmcHJlUGFyYW0sIGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIElmIGEgcGFyYW1ldGVyIGlzIHdyaXRhYmxlIHRoaXMgaXMgY2FsbGVkLgorICAgIC8vIFRlc3Qgb25lIGZpbGVkIHx3cml0YWJsZUZpZWxkfCBmb3IgZ2l2ZW4gd3JpdGFibGUgcGFyYW1ldGVyIHxwYXJhbXwuCisgICAgLy8gfHZhbGlkVmFsdWVzfCBjb250YWlucyBhbGwgdmFsdWVzIG9idGFpbmVkIGZyb20gcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoKSBmb3IgfHdyaXRhYmxlRmllbGR8LgorICAgIC8vIFRoZSB0ZXN0IGNoZWNrcyB2YWxpZGl0eSBmb3IgY29uZmlnKCkgd2l0aCBlYWNoIHZhbHVlLCBhbmQgbWFrZSBzdXJlIHZhbHVlcyBhcmUgY29uZmlnLWVkCisgICAgLy8gYnkgcXVlcnkoKSB0aGVtIG91dC4gfGludmFsaWRWYWx1ZXN8IGNvbnRhaW5zIHNvbWUgdmFsdWVzIHdoaWNoIGFyZSBub3QgaW4gfHZhbGlkVmFsdWVzfC4KKyAgICAvLyBUaGUgdGVzdCBleHBlY3RzIEMyX0JBRF9WQUxVRSB3aGlsZSBjb25maWcoKSB3aXRoIHRoZXNlIHZhbHVlcywKKyAgICAvLyBhbmQgfHBhcmFtfCBzaG91bGQgc3RheSB1bmNoYW5nZWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRQYXJhbSwgdHlwZW5hbWUgVFJlYWxGaWVsZCwgdHlwZW5hbWUgVEZpZWxkPgorICAgIHZvaWQgdGVzdFdyaXRhYmxlUGFyYW0oVFBhcmFtICpjb25zdCBwYXJhbSwgVFJlYWxGaWVsZCAqY29uc3Qgd3JpdGFibGVGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJnZhbGlkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmaW52YWxpZFZhbHVlcyk7CisKKyAgICAvLyBUZXN0IGFsbCB0aGUgZGVmaW5lZCBwYXJhbWV0ZXJzIGluIEMyUGFyYW0uaC4KKyAgICB2b2lkIHRlc3RNYWluKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjb21wb25lbnROYW1lKTsKKworICAgIC8vIENoZWNrIHBlcm1pc3Npb24gb2YgcGFyYW1ldGVyIHR5cGUgfFR8IGZvciB0ZXN0aW5nIGludGVyZmFjZS4KKyAgICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZmlyc3Qgb2YgdGhlIHRlc3RpbmcgcGVyIHBhcmFtZXRlciB0eXBlLAorICAgIC8vIHRoZXJlZm9yZSBkaWZmZXJlbnQgdGVzdGluZyBwcm9jZXNzIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBwZXJtaXNzaW9uIHR5cGUuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBjaGVja1BhcmFtUGVybWlzc2lvbigKKyAgICAgICAgICAgIGludCAqY29uc3Qgd3JpdGFibGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmc3VwcG9ydGVkUGFyYW1zKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFBhcmFtUGVybWlzc2lvbiA6IGludCB7CisgICAgICAgIFdSSVRBQkxFLAorICAgICAgICBSRUFET05MWSwKKyAgICAgICAgVU5TVVBQT1JURUQsCisgICAgfTsKKworICAgIHN0cnVjdCBwYXJhbVRlc3RJbmZvIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgcGFyYW1UZXN0SW5mbyhjb25zdCBjaGFyICpuYW1lXywgaW50IHJlc3VsdF8pCisgICAgICAgICAgICA6IG5hbWUobmFtZV8pLCByZXN1bHQocmVzdWx0Xykge30KKyAgICB9OworCisgICAgLy8gcXVlcnlPblN0YWNrKCkgYW5kIHF1ZXJ5b25IZWFwKCkgYm90aCBjYWxsIGFuIGludGVyZmFjZSdzIHF1ZXJ5X3ZiKCkgYW5kCisgICAgLy8gY2hlY2sgaWYgYSBjb21wb25lbnQgaGFzIGEgcGFyYW1ldGVyIHdob3NlIHR5cGUgaXMgfFR8LgorICAgIC8vIElmIGEgY29tcG9uZW50IGhhcywgdGhlIHZhbHVlIHNob3VsZCBiZSBjb3BpZWQgaW50byBhbiBhcmd1bWVudCwgdGhhdCBpcworICAgIC8vIHxwfCBpbiBxdWVyeU9uU3RhY2soKSBhbmQgfGhlYXBQYXJhbXN8IGluIHF1ZXJ5T25IZWFwKCkuCisgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBjMl9zdGF0dXNfdCAoZS5nLiBDMl9PSykuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGMyX3N0YXR1c190IHF1ZXJ5T25TdGFjayhUICpjb25zdCBwKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIGMyX3N0YXR1c190IHF1ZXJ5T25IZWFwKGNvbnN0IFQgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcyk7CisKKyAgICAvLyBHZXQgYSB2YWx1ZSB3aG9zZSB0eXBlIGlzIHxUfCBpbiBhIGNvbXBvbmVudC4gVGhlIHZhbHVlIGlzIGNvcGllZCB0byB8cGFyYW18LgorICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIGEgY29tcG9uZW50IGhhcyB0aGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGdldFZhbHVlKFQgKmNvbnN0IHBhcmFtKTsKKworICAgIC8vIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBpbiBjb21wb25lbnQgaXMgZXF1YWwgdG8gfGV4cGVjdGVkfCBhbmQKKyAgICAvLyBxdWVyeU9uU3RhY2soKSBhbmQgcXVlcnlPbkhlYXAoKSBhcmUgc3VjY2VlZGVkLiBXaGVuIHRoaXMgZnVuY3Rpb24gY2FsbGVkLAorICAgIC8vIGl0IHNob3VsZCBiZSBndWFyYW50ZWVkIGEgY29tcG9uZW50IGhhcyB0aGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKGNvbnN0IFQgJmV4cGVjdGVkKTsKKworICAgIC8vIFRlc3QgaWYgcXVlcnkgZnVuY3Rpb25zIHdvcmtzIGNvcnJlY3RseSBmb3Igc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgLy8gIlN1cHBvcnQiIG1lYW5zIGhlcmUgYSBjb21wb25lbnQgaGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlTdXBwb3J0ZWRQYXJhbSgpOworCisgICAgLy8gVGVzdCBxdWVyeSBmdW5jdGlvbnMgd29ya3MgY29ycmVjdGx5IGZvciB1bnN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgIC8vICJVbnN1cHBvcnQiIG1lYW5zIGhlcmUgYSBjb21wb25lbnQgZG9lc24ndCBoYXZlIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlVbnN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICAvLyBFeGVjdXRlIGFuIGludGVyZmFjZSdzIGNvbmZpZ192YigpLiB8VHwgaXMgYSBzaW5nbGUgcGFyYW1ldGVyIHR5cGUsIG5vdCBzdGQ6OnZlY3Rvci4KKyAgICAvLyBjb25maWcoKSBjcmVhdGVzIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4ge3B9IGFuZCBwYXNzZXMgaXQgdG8gY29uZmlnX3ZiKCkuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgYzJfc3RhdHVzX3QKKyAgICBjb25maWcoVCAqY29uc3QgcCwKKyAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcyk7CisKKyAgICAvLyBUZXN0IGlmIGNvbmZpZyB3b3JrcyBjb3JyZWN0bHkgZm9yIHJlYWQtb25seSBwYXJhbWV0ZXJzLgorICAgIC8vIEJlY2F1c2UgdGhlIGZhaWx1cmUgb2YgY29uZmlnKCkgaXMgYXNzdW1lZCwgfG5ld1BhcmFtfCBkb2Vzbid0IG1hdHRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdSZWFkT25seVBhcmFtKGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBmb3Igd3JpdGFibGUgcGFyYW1ldGVycy4KKyAgICAvLyBUaGlzIGNoYW5nZXMgdGhlIHBhcmFtZXRlcidzIHZhbHVlIHRvIHxuZXdQYXJhbXwuCisgICAgLy8gfHN0Q29uZmlnfCBpcyBhIHJldHVybiB2YWx1ZSBvZiBjb25maWcoKS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSwgYzJfc3RhdHVzX3QgKnN0Q29uZmlnKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBpbiB0aGUgY2FzZSBhbiBpbnZhbGlkIHZhbHVlIHxuZXdQYXJhbXwgaXMgdHJpZWQgdG8gd3JpdGUKKyAgICAvLyB0byBhbiB3cml0YWJsZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgY29uZmlnV3JpdGFibGVQYXJhbUludmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSk7CisKKyAgICAvLyBDcmVhdGUgdmFsdWVzIGZvciB0ZXN0aW5nIGZyb20gfHZhbGlkVmFsdWVJbmZvc3wuIFRoZSB2YWx1ZXMgYXJlIHJldHVybmVkIGFzIGFyZ3VtZW50cy4KKyAgICAvLyB8dmFsaWRWYWx1ZXN8IDogdmFsaWQgdmFsdWVzLCB3aGljaCBjYW4gYmUgd3JpdHRlbiBmb3IgdGhlIHBhcmFtZXRlci4KKyAgICAvLyB8SW52YWxpZFZhbHVlc3wgOiBpbnZhbGlkIHZhbHVlcywgd2hpY2ggY2Fubm90IGJlIHdyaXR0ZW4gZm9yIHRoZSBwYXJhbWV0ZXIuCisgICAgLy8gICAgICAgICAgICAgICAgICAgY29uZmlnKCkgc2hvdWxkIGJlIGZhaWxlZCBpZiB0aGVzZSB2YWx1ZXMgYXJlIHVzZWQgYXMgbmV3IHZhbHVlcy4KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBmb3Igd3JpdGFibGUgYW5kIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBURmllbGQ+CisgICAgdm9pZCBnZXRUZXN0VmFsdWVzKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbGlkVmFsdWVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgdmFsaWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRGaWVsZD4gKmNvbnN0IGludmFsaWRWYWx1ZXMpOworCisgICAgLy8gT3V0cHV0IHRoZSBzdW1tYXJ5IG9mIHRlc3QgcmVzdWx0cy4gQ2F0ZWdvcml6ZXMgcGFyYW1ldGVycyB3aXRoIHRoZWlyIGNvbmZpZ3VyYXRpb24uCisgICAgdm9pZCBvdXRwdXRSZXN1bHRzKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7CisgICAgc3RkOjp2ZWN0b3I8cGFyYW1UZXN0SW5mbz4gbVBhcmFtUmVzdWx0czsKKyAgICBzdGQ6OnN0cmluZyBtQ3VycmVudFBhcmFtTmFtZTsKK307CisKKy8vIGZhY3RvcnkgZnVuY3Rpb24KKy8vIFRPRE8oaGlyb2gpOiBBZGQgZmFjdG9yeSBmdW5jdGlvbnMgZm9yIG90aGVyIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0ZDo6dW5pcXVlX3B0cjxUPiBtYWtlUGFyYW0oKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8VD4oKTsKK30KKwordGVtcGxhdGUgPD4gc3RkOjp1bmlxdWVfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtYWtlUGFyYW0oKSB7CisgICAgLy8gVE9ETyhoaXJvaCk6IFNldCBtb3JlIHByZWNpc2UgbGVuZ3RoLgorICAgIHJldHVybiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6QWxsb2NVbmlxdWUoMTAwKTsKK30KKworI2RlZmluZSBUUkFDRURfRkFJTFVSRShmdW5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0NPUEVEX1RSQUNFKG1DdXJyZW50UGFyYW1OYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICBmdW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7ICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoZmFsc2UpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjMl9zdGF0dXNfdCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlPblN0YWNrKFQgKmNvbnN0IHApIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gc3RhY2tQYXJhbXN7cH07CisgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92YihzdGFja1BhcmFtcywge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2MyX3N0YXR1c190IEMyQ29tcEludGZUZXN0OjpxdWVyeU9uSGVhcCgKKyAgICAgICAgY29uc3QgVCAmcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgeworICAgIHVpbnQzMl90IGluZGV4ID0gcC5pbmRleCgpICYgfjB4MDNGRTAwMDA7CisgICAgaWYgKHAuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgaW5kZXggfD0gKChwLnN0cmVhbSgpIDw8IDE3KSAmIDB4MDFGRTAwMDApIHwgMHgwMjAwMDAwMDsKKyAgICB9CisgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92Yih7fSwge2luZGV4fSwgQzJfRE9OVF9CTE9DSywgaGVhcFBhcmFtcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpnZXRWYWx1ZShUICpjb25zdCBwYXJhbSkgeworICAgIC8vIFdoZW4gZ2V0VmFsdWUoKSBpcyBjYWxsZWQsIGEgY29tcG9uZW50IGhhcyB0byBoYXZlIHRoZSBwYXJhbWV0ZXIuCisgICAgQVNTRVJUX0VRKEMyX09LLCBxdWVyeU9uU3RhY2socGFyYW0pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0OjpxdWVyeVBhcmFtQXNFeHBlY3RlZChjb25zdCBUICZleHBlY3RlZCkgeworICAgIC8vIFRPRE8oaGlyb2gpOiBEb24ndCBjcmVhdGUgcGFyYW0gb24gc3RhY2sgYW5kIGNhbGwgcXVlcnlPblN0YWNrIGZvciBmbGV4IHBhcmFtcy4KKyAgICAvLyBOb3RlIHRoYXQgYWxsIHRoZSBjdXJyZW50IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBub24tZmxleCBwYXJhbXMuCisgICAgVCBzdGFjazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcEhlYXAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25TdGFjaygmc3RhY2spKTsKKworICAgIC8vIHxzdGFja3wgaXMgYSBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBwYXJhbWV0ZXIgc2l6ZSBzaG91bGRuJ3QgYmUgMC4KKyAgICBFWFBFQ1RfTkUoMHUsIHN0YWNrLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0YWNrLCBleHBlY3RlZCk7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25IZWFwKCpwSGVhcCwgJmhlYXBQYXJhbXMpKTsKKworICAgIC8vIHwqaGVhcFBhcmFtc1swXXwgaXMgYSBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBzaXplIG9mIHxoZWFwUGFyYW1zfCBoYXMgdG8gYmUgb25lLgorICAgIEFTU0VSVF9FUSgxdSwgaGVhcFBhcmFtcy5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKGhlYXBQYXJhbXNbMF0pOworICAgIEVYUEVDVF9FUSgqaGVhcFBhcmFtc1swXSwgZXhwZWN0ZWQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlTdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKyAgICAvLyBUaGUgY3VycmVudCBwYXJhbWV0ZXIncyB2YWx1ZSBpcyBhY3F1aXJlZCBieSBnZXRWYWx1ZSgpLCB3aGljaCBzaG91bGQgYmUgc3VjY2VlZGVkLgorICAgIGdldFZhbHVlKHBhcmFtLmdldCgpKTsKKyAgICBxdWVyeVBhcmFtQXNFeHBlY3RlZCgqcGFyYW0pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlVbnN1cHBvcnRlZFBhcmFtKCkgeworICAgIC8vIFRPRE8oaGlyb2gpOiBEb24ndCBjcmVhdGUgcGFyYW0gb24gc3RhY2sgYW5kIGNhbGwgcXVlcnlPblN0YWNrIGZvciBmbGV4IHBhcmFtcy4KKyAgICAvLyBOb3RlIHRoYXQgYWxsIHRoZSBjdXJyZW50IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBub24tZmxleCBwYXJhbXMuCisgICAgVCBzdGFjazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcEhlYXAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisgICAgLy8gSWYgYSBjb21wb25lbnQgZG9lc24ndCBoYXZlIHRoZSBwYXJhbWV0ZXIsIHF1ZXJ5T25TdGFjaygpIGFuZCBxdWVyeU9uSGVhcCgpCisgICAgLy8gc2hvdWxkIHJldHVybiBDMl9CQURfSU5ERVguCisgICAgQVNTRVJUX0VRKEMyX0JBRF9JTkRFWCwgcXVlcnlPblN0YWNrKCZzdGFjaykpOworICAgIEVYUEVDVF9GQUxTRShzdGFjayk7CisgICAgQVNTRVJUX0VRKEMyX0JBRF9JTkRFWCwgcXVlcnlPbkhlYXAoKnBIZWFwLCAmaGVhcFBhcmFtcykpOworICAgIEVYUEVDVF9FUSgwdSwgaGVhcFBhcmFtcy5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2MyX3N0YXR1c190IEMyQ29tcEludGZUZXN0Ojpjb25maWcoCisgICAgICAgIFQgKmNvbnN0IHAsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3B9OworICAgIHJldHVybiBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgZmFpbHVyZXMpOworfQorCisvLyBDcmVhdGUgYSBuZXcgcGFyYW1ldGVyIGNvcGllZCBmcm9tIHxwfC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnVuaXF1ZV9wdHI8VD4gbWFrZVBhcmFtRnJvbShjb25zdCBUICZwKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHJldFAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBFWFBFQ1RfVFJVRShyZXRQLT51cGRhdGVGcm9tKHApKTsKKyAgICBFWFBFQ1RfVFJVRShtZW1jbXAocmV0UC5nZXQoKSwgJnAsIHNpemVvZihUKSkgPT0gMCk7CisgICAgcmV0dXJuIHJldFA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnUmVhZE9ubHlQYXJhbShjb25zdCBUICZuZXdQYXJhbSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwID0gbWFrZVBhcmFtRnJvbShuZXdQYXJhbSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3AuZ2V0KCl9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIC8vIGNvbmZpZ192YiBzaG91bGQgYmUgZmFpbGVkIGJlY2F1c2UgYSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5LgorICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpKTsKKyAgICBBU1NFUlRfRVEoMXUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKEMyU2V0dGluZ1Jlc3VsdDo6UkVBRF9PTkxZLCBmYWlsdXJlc1swXS0+ZmFpbHVyZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoY29uc3QgVCAmbmV3UGFyYW0sIGMyX3N0YXR1c190ICpjb25maWdSZXN1bHQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcCA9IG1ha2VQYXJhbUZyb20obmV3UGFyYW0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtc3twLmdldCgpfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgLy8gSW4gbW9zdCBjYXNlcywgY29uZmlnX3ZiIHJldHVybiBDMl9PSyBhbmQgdGhlIHBhcmFtZXRlcidzIHZhbHVlIHNob3VsZCBiZSBjaGFuZ2VkCisgICAgLy8gdG8gfG5ld1BhcmFtfCwgd2hpY2ggaXMgY29uZmlybWVkIGluIGEgY2FsbGVyIG9mIGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWx1ZVZhbHVlKCkuCisgICAgLy8gSG93ZXZlciwgdGhpcyBjYW4gcmV0dXJuIH5+fn4gYW5kIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZXMgaXMgbm90IGNoYW5nZWQsCisgICAgLy8gYmVjYXVzZSB0aGVyZSBtYXkgYmUgZGVwZW5kZW50IGxpbWl0YXRpb25zIGJldHdlZW4gZmllbGRzIG9yIGJldHdlZW4gcGFyYW1ldGVycy4KKyAgICAvLyBUT0RPKGhpcm9oKTogSSBoYXZlIHRvIGZpbGwgdGhlIHJldHVybiB2YWx1ZS4gQ29tbWVudHMgaW4gQzJDb21wb25lbnQuaCBkb2Vzbid0IG1lbnRpb24KKyAgICAvLyBhYm91dCB0aGUgcmV0dXJuIHZhbHVlIHdoZW4gY29uZmxpY3QgaGFwcGVucy4gSSBzZXQgQzJfQkFEX1ZBTFVFIHRvIGl0IHRlbXBvcmFyaWx5IG5vdy4KKyAgICBjMl9zdGF0dXNfdCBzdENvbmZpZyA9IG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdENvbmZpZyA9PSBDMl9PSykgeworICAgICAgICBFWFBFQ1RfRVEoMHUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgc3RDb25maWcpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlNldHRpbmdSZXN1bHQ6OkNPTkZMSUNULCBmYWlsdXJlc1swXS0+ZmFpbHVyZSk7CisgICAgfQorICAgICpjb25maWdSZXN1bHQgPSBzdENvbmZpZzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojpjb25maWdXcml0YWJsZVBhcmFtSW52YWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHAgPSBtYWtlUGFyYW1Gcm9tKG5ld1BhcmFtKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cC5nZXQoKX07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIC8vIEFsdGhvdWdoIGEgcGFyYW1ldGVyIGlzIHdyaXRhYmxlLCBjb25maWdfdmIgc2hvdWxkIGJlIGZhaWxlZCwKKyAgICAvLyBiZWNhdXNlIGEgbmV3IHZhbHVlIGlzIGludmFsaWQuCisgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcykpOworICAgIEFTU0VSVF9FUSgxdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUUsIGZhaWx1cmVzWzBdLT5mYWlsdXJlKTsKK30KKworLy8gVGhlcmUgaXMgb25seSB1c2VkIGVudW0gdHlwZSBmb3IgdGhlIGZpZWxkIHR5cGUsIHRoYXQgaXMgQzJDb21wb25lbnQ6OmRvbWFpbl90LgorLy8gSWYgYW5vdGhlciBmaWVsZCB0eXBlIGlzIGFkZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIGZ1bmN0aW9uIGZvciB0aGF0LgordGVtcGxhdGUgPD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmdldFRlc3RWYWx1ZXMoCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbGlkVmFsdWVJbmZvcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OmRvbWFpbl90PiAqY29uc3QgdmFsaWRWYWx1ZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50Ojpkb21haW5fdD4gKmNvbnN0IGludmFsaWRWYWx1ZXMpIHsKKyAgICBVTlVTRUQodmFsaWRWYWx1ZUluZm9zKTsKKyAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKEMyQ29tcG9uZW50OjpET01BSU5fVklERU8pOworICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTyk7CisgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSKTsKKworICAgIC8vIFRoZXJlIGlzIG5vIGludmFsaWQgdmFsdWUuCisgICAgVU5VU0VEKGludmFsaWRWYWx1ZXMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVEZpZWxkPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Z2V0VGVzdFZhbHVlcygKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsaWRWYWx1ZUluZm9zLAorICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCB2YWxpZFZhbHVlcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgaW52YWxpZFZhbHVlcykgeworICAgIHVzaW5nIFRTdG9yYWdlID0gdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxURmllbGQ+Ojp0eXBlOworCisgICAgLy8gVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGJ5IEMyVmFsdWVzLiBDMlZhbHVlOjpQcmltaXRpdmUgbmVlZHMgdG8KKyAgICAvLyBiZSB0cmFuc2Zvcm1lZCB0byBhIHByaW1pdGl2ZSB2YWx1ZS4gVGhpcyBmdW5jdGlvbiBpcyBvbmUgdG8gZG8gdGhhdC4KKyAgICBhdXRvIHByaW0yVmFsdWUgPSBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnByaW0pIC0+IFRGaWVsZCB7CisgICAgICAgIHJldHVybiAoVEZpZWxkKXByaW0ucmVmPFRTdG9yYWdlPigpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgaW50MzJfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFRTdG9yYWdlLCB1aW50MzJfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFRTdG9yYWdlLCBpbnQ2NF90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIHVpbnQ2NF90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIGZsb2F0Pjo6dmFsdWUsICJJbnZhbGlkIFRGaWVsZCB0eXBlLiIpOworICAgIH07CisKKyAgICAvLyBUaGUgc2l6ZSBvZiB2YWxpZFZhbHVlSW5mb3MgaXMgb25lLgorICAgIGNvbnN0IGF1dG8gJmMyRlNWID0gdmFsaWRWYWx1ZUluZm9zOworCisgICAgc3dpdGNoIChjMkZTVi50eXBlKSB7CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OkVNUFRZOiB7CisgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoMCkpOworICAgICAgICAvLyBUT0RPKGhpcm9oKSA6IFNob3VsZCBvdGhlciBpbnZhbGlkIHZhbHVlcyBiZSB0ZXN0ZWQ/CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6UkFOR0U6IHsKKyAgICAgICAgY29uc3QgYXV0byAmcmFuZ2UgPSBjMkZTVi5yYW5nZTsKKyAgICAgICAgYXV0byBybWluID0gcHJpbTJWYWx1ZShyYW5nZS5taW4pOworICAgICAgICBhdXRvIHJtYXggPSBwcmltMlZhbHVlKHJhbmdlLm1heCk7CisgICAgICAgIGF1dG8gcnN0ZXAgPSBwcmltMlZhbHVlKHJhbmdlLnN0ZXApOworCisgICAgICAgIEFTU0VSVF9MRShybWluLCBybWF4KTsKKworICAgICAgICBpZiAocnN0ZXAgIT0gMCkgeworICAgICAgICAgICAgLy8gSW5jcmVhc2UgbGluZWFyCisgICAgICAgICAgICBmb3IgKGF1dG8gdiA9IHJtaW47IHYgPD0gcm1heDsgdiA9IFRGaWVsZCh2ICsgcnN0ZXApKSB7CisgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayh2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWluID4gc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptaW4oKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1pbiAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWF4IDwgc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptYXgoKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1heCArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBOID0gdmFsaWRWYWx1ZXMtPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID49IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjppc19zYW1lPFRGaWVsZCwgZmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoMCkgKyB2YWxpZFZhbHVlcy0+YXQoMSkpIC8gMikpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoTiAtIDIpICsgdmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJzdGVwID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoMCkgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHZhbGlkVmFsdWVzLT5hdChOIC0gMSkgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgdHdvIGNhc2VzLCBleGNlcHQgbGluZWFyIGNhc2UuCisgICAgICAgICAgICAvLyAxLiBpbnRlZ2VyIGdlb21ldHJpYyBjYXNlCisgICAgICAgICAgICAvLyAyLiBmbG9hdCBnZW9tZXRyaWMgY2FzZQorCisgICAgICAgICAgICBhdXRvIG51bSA9IHByaW0yVmFsdWUocmFuZ2UubnVtKTsKKyAgICAgICAgICAgIGF1dG8gZGVub20gPSBwcmltMlZhbHVlKHJhbmdlLmRlbm9tKTsKKworICAgICAgICAgICAgLy8gSWYgYm90aCByYW5nZS5udW0gYW5kIHJhbmdlLmRlbm9tIGFyZSAxIGFuZCBzdGVwIGlzIDAsIHdlIHNob3VsZCB1c2UKKyAgICAgICAgICAgIC8vIFZBTFVFUywgc2hvdWxkbid0IHdlPworICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKG51bSA9PSAxICYmIGRlbm9tID09IDEpOworCisgICAgICAgICAgICAvLyAobnVtIC8gZGVub20pIGlzIG5vdCBsZXNzIHRoYW4gMS4KKyAgICAgICAgICAgIEFTU0VSVF9GQUxTRShkZW5vbSA9PSAwKTsKKyAgICAgICAgICAgIEFTU0VSVF9MRShkZW5vbSwgbnVtKTsKKyAgICAgICAgICAgIGZvciAoYXV0byB2ID0gcm1pbjsgdiA8PSBybWF4OyB2ID0gVEZpZWxkKHYgKiBudW0gLyBkZW5vbSkpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKHYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocm1pbiA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWluKCkpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHJtaW4gLSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm1heCA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWF4KCkpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHJtYXggKyAxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBOID0gdmFsaWRWYWx1ZXMtPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID49IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjppc19zYW1lPFRGaWVsZCwgZmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoMCkgKyB2YWxpZFZhbHVlcy0+YXQoMSkpIC8gMikpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoTiAtIDIpICsgdmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkVmFsdWVzLT5hdCgxKSAtIHZhbGlkVmFsdWVzLT5hdCgwKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KDApICsgMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZFZhbHVlcy0+YXQoTiAtIDEpIC0gdmFsaWRWYWx1ZXMtPmF0KE4gLSAyKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OlZBTFVFUzogeworICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcHJpbSA6IGMyRlNWLnZhbHVlcykgeworICAgICAgICAgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhwcmltMlZhbHVlKHByaW0pKTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIG1pbnYgPSAqc3RkOjptaW5fZWxlbWVudCh2YWxpZFZhbHVlcy0+YmVnaW4oKSwgdmFsaWRWYWx1ZXMtPmVuZCgpKTsKKyAgICAgICAgYXV0byBtYXh2ID0gKnN0ZDo6bWF4X2VsZW1lbnQodmFsaWRWYWx1ZXMtPmJlZ2luKCksIHZhbGlkVmFsdWVzLT5lbmQoKSk7CisgICAgICAgIGlmIChtaW52IC0gMSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWluKCkpIHsKKyAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQobWludiAtIDEpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4diArIDEgPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1heCgpKSB7CisgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKG1heHYgKyAxKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpGTEFHUzogeworICAgICAgICAvLyBUT0RPKGhpcm9oKSA6IEltcGxlbWVudCB0aGUgY2FzZSB0aGF0IHBhcmFtLnR5cGUgaXMgRkxBR1MuCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdFJlYWRPbmx5UGFyYW0oY29uc3QgVCAmcHJlUGFyYW0sIGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnUmVhZE9ubHlQYXJhbShuZXdQYXJhbSkpOworICAgIC8vIFBhcmFtZXRlciB2YWx1ZSBtdXN0IG5vdCBiZSBjaGFuZ2VkCisgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQocHJlUGFyYW0pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRQYXJhbSwgdHlwZW5hbWUgVFJlYWxGaWVsZCwgdHlwZW5hbWUgVEZpZWxkPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdFdyaXRhYmxlUGFyYW0oCisgICAgICAgIFRQYXJhbSAqY29uc3QgcGFyYW0sIFRSZWFsRmllbGQgKmNvbnN0IHdyaXRhYmxlRmllbGQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJnZhbGlkVmFsdWVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxURmllbGQ+ICZpbnZhbGlkVmFsdWVzKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RDb25maWc7CisKKyAgICAvLyBHZXQgdGhlIHBhcmFtZXRlcidzIHZhbHVlIGluIHRoZSBiZWdpbm5pbmcgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHZhbHVlIGF0IHRoZSBlbmQuCisgICAgVFJBQ0VEX0ZBSUxVUkUoZ2V0VmFsdWUocGFyYW0pKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBkZWZhdWx0UGFyYW0gPSBtYWtlUGFyYW1Gcm9tKCpwYXJhbSk7CisKKyAgICAvLyBUZXN0IHZhbGlkIHZhbHVlcworICAgIGZvciAoY29uc3QgYXV0byAmdmFsIDogdmFsaWRWYWx1ZXMpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRQYXJhbT4gcHJlUGFyYW0gPSBtYWtlUGFyYW1Gcm9tKCpwYXJhbSk7CisKKyAgICAgICAgLy8gUGFyYW0gaXMgdHJ5IHRvIGJlIGNoYW5nZWQKKyAgICAgICAgKndyaXRhYmxlRmllbGQgPSB2YWw7CisgICAgICAgIFRSQUNFRF9GQUlMVVJFKGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWxpZFZhbHVlKCpwYXJhbSwgJnN0Q29uZmlnKSk7CisgICAgICAgIGlmIChzdENvbmZpZyA9PSBDMl9PSykgeworICAgICAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKnBhcmFtKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQYXJhbSBpcyB1bmNoYW5nZWQgYmVjYXVzZSBhIGZpZWxkIHZhbHVlIGNvbmZsaWN0cyB3aXRoIG90aGVyIGZpZWxkIG9yIHBhcmFtZXRlci4KKyAgICAgICAgICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKCpwcmVQYXJhbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIGluIG9yZGVyIHRvIHRlc3QgfHBhcmFtfCBpcyB1bmNoYW5nZWQKKyAgICAvLyBhZnRlciB0cnlpbmcgdG8gd3JpdGUgYW4gaW52YWxpZCB2YWx1ZS4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBsYXN0VmFsaWRQYXJhbSA9IG1ha2VQYXJhbUZyb20oKnBhcmFtKTsKKworICAgIC8vIFRlc3QgaW52YWxpZCB2YWx1ZXMKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZhbCA6IGludmFsaWRWYWx1ZXMpIHsKKyAgICAgICAgLy8gUGFyYW0gaXMgY2hhbmdlZAorICAgICAgICAqd3JpdGFibGVGaWVsZCA9IHZhbDsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbUludmFsaWRWYWx1ZSgqcGFyYW0pKTsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKmxhc3RWYWxpZFBhcmFtKSk7CisgICAgfQorICAgIC8vIFJlc2V0IHRoZSBwYXJhbWV0ZXIgYnkgY29uZmlnKCkuCisgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoKmRlZmF1bHRQYXJhbSwgJnN0Q29uZmlnKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0VW5zdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBUUkFDRURfRkFJTFVSRShxdWVyeVVuc3VwcG9ydGVkUGFyYW08VD4oKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0U3VwcG9ydGVkUGFyYW0oKSB7CisgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlTdXBwb3J0ZWRQYXJhbTxUPigpKTsKK30KKworYm9vbCBpc1N1cHBvcnRlZFBhcmFtKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnNQYXJhbXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBkIDogc1BhcmFtcykgeworICAgICAgICBpZiAocGFyYW0udHlwZSgpID09IHBkLT5pbmRleCgpLnR5cGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmNoZWNrUGFyYW1QZXJtaXNzaW9uKAorICAgIGludCAqY29uc3QgcmVzdWx0LAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZzdXBwb3J0ZWRQYXJhbXMpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKworICAgIGlmICghaXNTdXBwb3J0ZWRQYXJhbSgqcGFyYW0sIHN1cHBvcnRlZFBhcmFtcykpIHsKKyAgICAgICAgLy8gSWYgYSBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLCBpdCBqdXN0IGZpbmlzaCBhZnRlciBjYWxsaW5nIHRlc3RVbnN1cHBvcnRlZFBhcmFtKCkuCisgICAgICAgIHRlc3RVbnN1cHBvcnRlZFBhcmFtPFQ+KCk7CisgICAgICAgICpyZXN1bHQgPSBQYXJhbVBlcm1pc3Npb246OlVOU1VQUE9SVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGVzdFN1cHBvcnRlZFBhcmFtPFQ+KCk7CisKKyAgICBUUkFDRURfRkFJTFVSRShnZXRWYWx1ZShwYXJhbS5nZXQoKSkpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAvLyBDb25maWcgZG9lcyBub3QgY2hhbmdlIHRoZSBwYXJhbWV0ZXIsIGJlY2F1c2UgcGFyYW0gaXMgdGhlIHByZXNlbnQgcGFyYW0uCisgICAgLy8gVGhpcyBjb25maWcgaXMgZXhlY3V0ZWQgdG8gZmluZCBvdXQgaWYgYSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IG9yIHdyaXRhYmxlLgorICAgIGMyX3N0YXR1c190IHN0U3RhY2sgPSBjb25maWcocGFyYW0uZ2V0KCksICZmYWlsdXJlcyk7CisgICAgaWYgKHN0U3RhY2sgPT0gQzJfQkFEX1ZBTFVFKSB7CisgICAgICAgIC8vIFJlYWQtb25seQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gbmV3UGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKyAgICAgICAgdGVzdFJlYWRPbmx5UGFyYW0oKnBhcmFtLCAqbmV3UGFyYW0pOworICAgICAgICAqcmVzdWx0ID0gUGFyYW1QZXJtaXNzaW9uOjpSRUFET05MWTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXcml0YWJsZQorICAgICAgICBFWFBFQ1RfRVEoc3RTdGFjaywgQzJfT0spOworICAgICAgICAqcmVzdWx0ID0gUGFyYW1QZXJtaXNzaW9uOjpXUklUQUJMRTsKKyAgICB9Cit9CisKK3ZvaWQgQzJDb21wSW50ZlRlc3Q6Om91dHB1dFJlc3VsdHMoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFyYW1zWzNdOworICAgIGZvciAoY29uc3QgYXV0byAmdGVzdEluZm8gOiBtUGFyYW1SZXN1bHRzKSB7CisgICAgICAgIGludCByZXN1bHQgPSB0ZXN0SW5mby5yZXN1bHQ7CisgICAgICAgIEFTU0VSVF9UUlVFKDAgPD0gcmVzdWx0ICYmIHJlc3VsdCA8PSAyKTsKKyAgICAgICAgcGFyYW1zW3Jlc3VsdF0uZW1wbGFjZV9iYWNrKHRlc3RJbmZvLm5hbWUpOworICAgIH0KKyAgICBjb25zdCBjaGFyICpyZXN1bHRTdHJpbmdbXSA9IHsiV3JpdGFibGUiLCAiUmVhZC1Pbmx5IiwgIlVuc3VwcG9ydGVkIn07CisgICAgcHJpbnRmKCJcbi0tLS1URVNUIFJFU1VMVFMgKCVzKS0tLS1cblxuIiwgbmFtZS5jX3N0cigpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBwcmludGYoIlsgJXMgXVxuIiwgcmVzdWx0U3RyaW5nW2ldKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0IDogcGFyYW1zW2ldKSB7CisgICAgICAgICAgICBwcmludGYoIiVzXG4iLCB0LmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIGZpZWxkX25hbWVfKSBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW1fPiBwYXJhbSA9IG1ha2VQYXJhbTxUUGFyYW1fPigpOyAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gdmFsaWRWYWx1ZUluZm9zID0geyAgICBcCisgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1GaWVsZChwYXJhbS5nZXQoKSwgJmZpZWxkX3R5cGVfbmFtZV86OmZpZWxkX25hbWVfKSkgXAorICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBU1NFUlRfRVEoQzJfT0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKHZhbGlkVmFsdWVJbmZvcywgQzJfRE9OVF9CTE9DSykpOyAgICAgXAorICAgICAgICBBU1NFUlRfRVEoMXUsIHZhbGlkVmFsdWVJbmZvcy5zaXplKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGQ6OnZlY3RvcjxkZWNsdHlwZShwYXJhbS0+ZmllbGRfbmFtZV8pPiB2YWxpZFZhbHVlczsgICAgICAgICAgXAorICAgICAgICBzdGQ6OnZlY3RvcjxkZWNsdHlwZShwYXJhbS0+ZmllbGRfbmFtZV8pPiBpbnZhbGlkVmFsdWVzOyAgICAgICAgXAorICAgICAgICBnZXRUZXN0VmFsdWVzKHZhbGlkVmFsdWVJbmZvc1swXS52YWx1ZXMsICZ2YWxpZFZhbHVlcywgJmludmFsaWRWYWx1ZXMpOyAgIFwKKyAgICAgICAgdGVzdFdyaXRhYmxlUGFyYW0ocGFyYW0uZ2V0KCksICZwYXJhbS0+ZmllbGRfbmFtZV8sIHZhbGlkVmFsdWVzLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXykgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB3aWR0aCk7ICBcCisgICAgICAgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCBoZWlnaHQpOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBURVNUX1UzMl9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKSAgICAgICAgICAgICAgXAorICBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdmFsdWUpCisKKyNkZWZpbmUgVEVTVF9FTlVNX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pICAgICAgICAgICAgIFwKKyAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIHZhbHVlKQorCisvLyBUT0RPKGhpcm9oKTogU3VwcG9ydCBwYXJhbWV0ZXJzIGJhc2VkIG9uIGNoYXJbXSBhbmQgdWludDMyX3RbXS4KKy8vI2RlZmluZSBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKQorLy8gVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIG0udmFsdWUpCisvLyNkZWZpbmUgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRChUcGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKQorLy8gVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRwYXJhbV8sIHVpbnQzMl90W10sIGZpZWxkX3R5cGVfbmFtZV8sIHZhbHVlcykKKworI2RlZmluZSBFQUNIX1RFU1QoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdGVzdF9uYW1lKSAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IHJlc3VsdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGhpcy0+bUN1cnJlbnRQYXJhbU5hbWUgPSAjVFBhcmFtXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hlY2tQYXJhbVBlcm1pc3Npb248VFBhcmFtXz4oJnJlc3VsdCwgc3VwcG9ydGVkUGFyYW1zKTsgICAgICAgICAgXAorICAgICAgaWYgKHJlc3VsdCA9PSBQYXJhbVBlcm1pc3Npb246OldSSVRBQkxFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHRlc3RfbmFtZShUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbVBhcmFtUmVzdWx0cy5lbXBsYWNlX2JhY2soI1RQYXJhbV8sIHJlc3VsdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBFQUNIX1RFU1RfU0VMRih0eXBlXywgdGVzdF9uYW1lKSBFQUNIX1RFU1QodHlwZV8sIHR5cGVfLCB0ZXN0X25hbWUpCisjZGVmaW5lIEVBQ0hfVEVTVF9JTlBVVCh0eXBlXywgdGVzdF9uYW1lKSBFQUNIX1RFU1QodHlwZV86OmlucHV0LCB0eXBlXywgdGVzdF9uYW1lKQorI2RlZmluZSBFQUNIX1RFU1RfT1VUUFVUKHR5cGVfLCB0ZXN0X25hbWUpIEVBQ0hfVEVTVCh0eXBlXzo6b3V0cHV0LCB0eXBlXywgdGVzdF9uYW1lKQordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdE1haW4oc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvbXBvbmVudE5hbWUpIHsKKyAgICBzZXRDb21wb25lbnQoaW50Zik7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBzdXBwb3J0ZWRQYXJhbXM7CisgICAgQVNTRVJUX0VRKEMyX09LLCBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoJnN1cHBvcnRlZFBhcmFtcykpOworCisgICAgRUFDSF9URVNUX1NFTEYoQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX1NFTEYoQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRBY3R1YWxEZWxheVR1bmluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRTdHJlYW1Db3VudFR1bmluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0U3RyZWFtQ291bnRUdW5pbmcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIEVBQ0hfVEVTVF9TRUxGKEMyQ29tcG9uZW50RG9tYWluU2V0dGluZywgVEVTVF9FTlVNX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIC8vIFRPRE8oaGlyb2gpOiBTdXBwb3J0IHBhcmFtZXRlcnMgYmFzZWQgb24gdWludDMyX3RbXSBhbmQgY2hhcltdLgorICAgIC8vIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRNZWRpYVR5cGVTZXR0aW5nLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX09VVFBVVChDMlBvcnRNZWRpYVR5cGVTZXR0aW5nLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtTWltZUNvbmZpZywgVEVTVF9TVFJJTkdfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1NaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlN1cHBvcnRlZFBhcmFtc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9TRUxGKEMyUmVxdWlyZWRQYXJhbXNJbmZvLCBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlJlYWRPbmx5UGFyYW1zSW5mbywgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX1NFTEYoQzJSZXF1ZXN0ZWRJbmZvc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworCisgICAgRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtUGljdHVyZVNpemVJbmZvLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyU3RyZWFtUGljdHVyZVNpemVJbmZvLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisKKyAgICBvdXRwdXRSZXN1bHRzKGNvbXBvbmVudE5hbWUpOworICAgIHJlc2V0UmVzdWx0cygpOworfQorCitURVNUX0YoQzJDb21wSW50ZlRlc3QsIEMyVjRMMkNvZGVjSW50ZikgeworCisgICAgLy8gUmVhZCBhIHNoYXJlZCBvYmplY3QgbGlicmFyeS4KKyAgICB2b2lkKiBjb21wTGliID0gZGxvcGVuKCJzeXN0ZW0vbGliL2xpYnY0bDJfY29kZWMyLnNvIiwgUlRMRF9OT1cpOworCisgICAgaWYgKCFjb21wTGliKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IG9wZW4gbGlicmFyeTogJXMuXG4iLCBkbGVycm9yKCkpOworICAgICAgICBGQUlMKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlZGVmIEMyQ29tcG9uZW50U3RvcmUqIGNyZWF0ZV90KCk7CisgICAgY3JlYXRlX3QqIGNyZWF0ZV9zdG9yZT0gKGNyZWF0ZV90KikgZGxzeW0oY29tcExpYiwgImNyZWF0ZV9zdG9yZSIpOworICAgIGNvbnN0IGNoYXIqIGRsc3ltX2Vycm9yID0gZGxlcnJvcigpOworICAgIGlmIChkbHN5bV9lcnJvcikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBsb2FkIHN5bWJvbCBjcmVhdGU6ICVzLlxuIiwgZGxzeW1fZXJyb3IpOworICAgICAgICBGQUlMKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlZGVmIHZvaWQgZGVzdHJveV90KEMyQ29tcG9uZW50U3RvcmUqKTsKKyAgICBkZXN0cm95X3QqIGRlc3Ryb3lfc3RvcmUgPSAoZGVzdHJveV90KikgZGxzeW0oY29tcExpYiwgImRlc3Ryb3lfc3RvcmUiKTsKKyAgICBkbHN5bV9lcnJvciA9IGRsZXJyb3IoKTsKKyAgICBpZiAoZGxzeW1fZXJyb3IpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgbG9hZCBzeW1ib2wgZGVzdHJveTogJXMuXG4iLCBkbHN5bV9lcnJvcik7CisgICAgICAgIEZBSUwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZShjcmVhdGVfc3RvcmUoKSwgZGVzdHJveV9zdG9yZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjb21wb25lbnRJbnRmOworICAgIGNvbXBvbmVudFN0b3JlLT5jcmVhdGVJbnRlcmZhY2UoInY0bDIuZGVjb2RlciIsICZjb21wb25lbnRJbnRmKTsKKyAgICBhdXRvIGNvbXBvbmVudE5hbWUgPSAiQzJWNEwyQ29kZWMiOworICAgIHRlc3RNYWluKGNvbXBvbmVudEludGYsIGNvbXBvbmVudE5hbWUpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NGQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcApAQCAtMCwwICsxLDI1MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJQYXJhbV90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorCit2b2lkIFByaW50VG8oY29uc3QgX0MyRmllbGRJZCAmaWQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgICpvcyA8PCAiQCIgPDwgaWQuX21PZmZzZXQgPDwgIisiIDw8IGlkLl9tU2l6ZTsKK30KKwordm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgOjpzdGQ6Om9zdHJlYW0gKm9zKSB7CisgICAgdXNpbmcgRkQ9QzJGaWVsZERlc2NyaXB0b3I7CisgICAgc3dpdGNoIChmZC50eXBlKCkpIHsKKyAgICBjYXNlIEZEOjpJTlQzMjogKm9zIDw8ICJpMzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpJTlQ2NDogKm9zIDw8ICJpNjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UMzI6ICpvcyA8PCAidTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDY0OiAqb3MgPDwgInU2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkZMT0FUOiAqb3MgPDwgImZsb2F0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6U1RSSU5HOiAqb3MgPDwgImNoYXIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpCTE9COiAqb3MgPDwgInU4IjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGZkLnR5cGUoKSAmIEZEOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgKm9zIDw8ICJzdHJ1Y3QtIiA8PCAoZmQudHlwZSgpICYgfkZEOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqb3MgPDwgInR5cGUtIiA8PCBmZC50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgKm9zIDw8ICIgIiA8PCBmZC5uYW1lKCk7CisgICAgaWYgKGZkLmV4dGVudCgpID4gMSkgeworICAgICAgICAqb3MgPDwgIlsiIDw8IGZkLmV4dGVudCgpIDw8ICJdIjsKKyAgICB9IGVsc2UgaWYgKGZkLmV4dGVudCgpID09IDApIHsKKyAgICAgICAgKm9zIDw8ICJbXSI7CisgICAgfQorICAgICpvcyA8PCAiICgiOworICAgIFByaW50VG8oZmQuX21GaWVsZElkLCBvcyk7CisgICAgKm9zIDw8ICIqIiA8PCBmZC5leHRlbnQoKSA8PCAiKSI7Cit9CisKK2VudW0gQzJQYXJhbUluZGV4VHlwZSA6IEMyUGFyYW06OnR5cGVfaW5kZXhfdCB7CisgICAga1BhcmFtSW5kZXhOdW1iZXIsCisgICAga1BhcmFtSW5kZXhOdW1iZXJzLAorICAgIGtQYXJhbUluZGV4TnVtYmVyMiwKKyAgICBrUGFyYW1JbmRleFZlbmRvclN0YXJ0ID0gQzJQYXJhbTo6VFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQsCisgICAga1BhcmFtSW5kZXhWZW5kb3JOdW1iZXJzLAorfTsKKwordm9pZCBmZmZmKGludCgqKShpbnQpKSB7fQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVFJVQ1QgREVDTEFSQVRJT04gQU5EIERFU0NSSVBUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3R5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3IgRkQ7CisKK2NsYXNzIEMyUGFyYW1UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitjbGFzcyBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdAorICAgICAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PiB7Cit9OworCitlbnVtIHsKKyAgICBrUGFyYW1JbmRleFNpemUsCisgICAga1BhcmFtSW5kZXhUZXN0QSwKKyAgICBrUGFyYW1JbmRleFRlc3RCLAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhTMzIsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFMzMiwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4UzY0LAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTNjQsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleFNpemUsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemUsCit9OworCitzdHJ1Y3QgQzJTaXplU3RydWN0IHsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFNpemUgfTsgICAgICAgICAgICAgICAgICAgICAgICAvLyA8PSBuZWVkZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOyAgLy8gPD0gbmVlZGVkIGZvciBDMkZpZWxkRGVzY3JpcHRvcgorICAgIGNvbnN0IHN0YXRpYyBGRDo6dHlwZV90IFRZUEUgPSAoRkQ6OnR5cGVfdCkoQ09SRV9JTkRFWCB8IEZEOjpTVFJVQ1RfRkxBRyk7Cit9OworCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihDMlNpemVTdHJ1Y3QpCisKKy8vIFRlc3QgMS4gZGVmaW5lIGEgc3RydWN0dXJlIHdpdGhvdXQgYW55IGhlbHBlciBtZXRob2RzCisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYSwgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmIpIHsKKyAgICByZXR1cm4gYS50eXBlKCkgPT0gYi50eXBlKCkKKyAgICAgICAgICAgICYmIGEuZXh0ZW50KCkgPT0gYi5leHRlbnQoKQorICAgICAgICAgICAgJiYgYS5uYW1lKCkgPT0gYi5uYW1lKCkKKyAgICAgICAgICAgICYmIGEuX21GaWVsZElkID09IGIuX21GaWVsZElkOworfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0EgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBzaWduZWQ2NFsyXTsKKyAgICB1aW50MzJfdCB1bnNpZ25lZDMyWzFdOworICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CisgICAgZmxvYXQgZnAzMjsKKyAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgdWludDhfdCBibG9iWzEwMF07CisgICAgY2hhciBzdHJpbmdbMTAwXTsKKyAgICBib29sIHllc05vWzEwMF07CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0EgX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0E6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUID0KKyAgICB7IHsgRkQ6OklOVDMyLCAgICAxLCAiczMyIiwgICAwLCA0IH0sCisgICAgICB7IEZEOjpJTlQ2NCwgICAgMiwgInM2NCIsICAgNCwgOCB9LAorICAgICAgeyBGRDo6VUlOVDMyLCAgIDEsICJ1MzIiLCAgMjAsIDQgfSwKKyAgICAgIHsgRkQ6OlVJTlQ2NCwgICAxLCAidTY0IiwgIDI0LCA4IH0sCisgICAgICB7IEZEOjpGTE9BVCwgICAgMSwgImZwIiwgICAzMiwgNCB9LAorICAgICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDMsICJzaXplIiwgMzYsIDggfSwKKyAgICAgIHsgRkQ6OkJMT0IsICAgMTAwLCAiYmxvYiIsIDYwLCAxIH0sCisgICAgICB7IEZEOjpTVFJJTkcsIDEwMCwgInN0ciIsIDE2MCwgMSB9LAorICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJ5LW4iLCAyNjAsIDEgfSB9OworCitURVNUX1AoQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIFZlcmlmeVN0cnVjdCkgeworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBHZXRQYXJhbSgpLCBleHBlY3RlZCA9IEMyVGVzdFN0cnVjdF9BOjpfRklFTERfTElTVDsKKworICAgIC8vIHZlcmlmeSBmaXJzdCBmaWVsZCBkZXNjcmlwdG9yCisgICAgRVhQRUNUX0VRKEZEOjpJTlQzMiwgZmllbGRzWzBdLnR5cGUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJzMzIiLCBmaWVsZHNbMF0ubmFtZSgpLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzWzBdLmV4dGVudCgpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgZmllbGRzWzBdLl9tRmllbGRJZCk7CisKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbMF0sIGZpZWxkc1swXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzFdLCBmaWVsZHNbMV0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFsyXSwgZmllbGRzWzJdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbM10sIGZpZWxkc1szXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzRdLCBmaWVsZHNbNF0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFs1XSwgZmllbGRzWzVdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbNl0sIGZpZWxkc1s2XSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzddLCBmaWVsZHNbN10pOworICAgIGZvciAoc2l6ZV90IGkgPSA4OyBpIDwgZmllbGRzLnNpemUoKSAmJiBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBmaWVsZHNbaV0pOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5pdGlhbGl6ZXJMaXN0LCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUKSk7CisKKy8vIGRlZmluZSBmaWVsZHMgdXNpbmcgQzJGaWVsZERlc2NyaXB0b3IgcG9pbnRlciBjb25zdHJ1Y3RvcgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BX0ZEX1BUUl9maWVsZExpc3QgPQorICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnNpZ25lZDMyLCAgICJzMzIiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5zaWduZWQ2NCwgICAiczY0IiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+dW5zaWduZWQzMiwgInUzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnVuc2lnbmVkNjQsICJ1NjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5mcDMyLCAgICAgICJmcCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnN6LCAgICAgICAic2l6ZSIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPmJsb2IsICAgICAgICJibG9iIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c3RyaW5nLCAgICAgInN0ciIpLAorICAgIC8vICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+eWVzTm8sICAgICAgInktbiIpCisgICAgfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUG9pbnRlckNvbnN0cnVjdG9yLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0FfRkRfUFRSX2ZpZWxkTGlzdCkpOworCisvLyBkZWZpbmUgZmllbGRzIHVzaW5nIEMyRmllbGREZXNjcmlwdG9yIG1lbWJlci1wb2ludGVyIGNvbnN0cnVjdG9yCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0FfRkRfTUVNX1BUUl9maWVsZExpc3QgPQorICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDMyLCAgICJzMzIiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQ2NCwgICAiczY0IiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMiwgInUzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQsICJ1NjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpmcDMyLCAgICAgICJmcCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN6LCAgICAgICAic2l6ZSIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmJsb2IsICAgICAgICJibG9iIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nLCAgICAgInN0ciIpLAorICAgIC8vICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8sICAgICAgInktbiIpCisgICAgfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTWVtYmVyUG9pbnRlckNvbnN0cnVjdG9yLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0FfRkRfTUVNX1BUUl9maWVsZExpc3QpKTsKKworLy8gVGVzdCAyLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCB0d28tc3RlcCBoZWxwZXIgbWV0aG9kcworCitzdHJ1Y3QgQzJUZXN0QVN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IHNpZ25lZDY0WzJdOworICAgIHVpbnQzMl90IHVuc2lnbmVkMzJbMV07CisgICAgdWludDY0X3QgdW5zaWduZWQ2NDsKKyAgICBmbG9hdCBmcDMyOworICAgIEMyU2l6ZVN0cnVjdCBzelszXTsKKyAgICB1aW50OF90IGJsb2JbMTAwXTsKKyAgICBjaGFyIHN0cmluZ1sxMDBdOworICAgIGJvb2wgeWVzTm9bMTAwXTsKKworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBERUZJTkVfQzJTVFJVQ1QoVGVzdEEpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RBLCB7CisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChzaWduZWQ2NCwgInM2NCIpCisgICAgQzJGSUVMRCh1bnNpZ25lZDMyLCAidTMyIikKKyAgICBDMkZJRUxEKHVuc2lnbmVkNjQsICJ1NjQiKQorICAgIEMyRklFTEQoZnAzMiwgImZwIikKKyAgICBDMkZJRUxEKHN6LCAic2l6ZSIpCisgICAgQzJGSUVMRChibG9iLCAiYmxvYiIpCisgICAgQzJGSUVMRChzdHJpbmcsICJzdHIiKQorICAgIC8vIEMyRklFTEQoeWVzTm8sICJ5LW4iKQorfSkgLy8gOyBvcHRpb25hbAorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChEZXNjcmliZVN0cnVjdDJTdGVwLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0QVN0cnVjdDo6RmllbGRMaXN0KCkpKTsKKworLy8gVGVzdCAzLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBvbmUtc3RlcCBoZWxwZXIgbWV0aG9kCisKK3N0cnVjdCBDMlRlc3RCU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CisgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICB1aW50NjRfdCB1bnNpZ25lZDY0OworICAgIGZsb2F0IGZwMzI7CisgICAgQzJTaXplU3RydWN0IHN6WzNdOworICAgIHVpbnQ4X3QgYmxvYlsxMDBdOworICAgIGNoYXIgc3RyaW5nWzEwMF07CisgICAgYm9vbCB5ZXNOb1sxMDBdOworCitwcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAorICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEIpCisKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKHNpZ25lZDY0LCAiczY0IikKKyAgICBDMkZJRUxEKHVuc2lnbmVkMzIsICJ1MzIiKQorICAgIEMyRklFTEQodW5zaWduZWQ2NCwgInU2NCIpCisgICAgQzJGSUVMRChmcDMyLCAiZnAiKQorICAgIEMyRklFTEQoc3osICJzaXplIikKKyAgICBDMkZJRUxEKGJsb2IsICJibG9iIikKKyAgICBDMkZJRUxEKHN0cmluZywgInN0ciIpCisgICAgLy8gQzJGSUVMRCh5ZXNObywgInktbiIpCit9OworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChEZXNjcmliZVN0cnVjdDFTdGVwLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0QlN0cnVjdDo6RmllbGRMaXN0KCkpKTsKKworLy8gVGVzdCA0LiBmbGV4aWJsZSBtZW1iZXJzCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3Byb3RlY3RlZDoKKyAgICB1c2luZyB0eXBlX3Q9RkQ6OnR5cGVfdDsKKworICAgIC8vIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKyAgICAgICAgICAgIEdldExpc3RzKCk7CisKKyAgICBjb25zdGV4cHIgc3RhdGljIHR5cGVfdCBGbGV4VHlwZSA9CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgaW50MzJfdD46OnZhbHVlID8gRkQ6OklOVDMyIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBpbnQ2NF90Pjo6dmFsdWUgPyBGRDo6SU5UNjQgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQzMl90Pjo6dmFsdWUgPyBGRDo6VUlOVDMyIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50NjRfdD46OnZhbHVlID8gRkQ6OlVJTlQ2NCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgZmxvYXQ+Ojp2YWx1ZSA/IEZEOjpGTE9BVCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlID8gRkQ6OkJMT0IgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSA/IEZEOjpTVFJJTkcgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIEMyU2l6ZVN0cnVjdD46OnZhbHVlID8gQzJTaXplU3RydWN0OjpUWVBFIDogKHR5cGVfdCkwOworICAgIGNvbnN0ZXhwciBzdGF0aWMgc2l6ZV90IEZMRVhfU0laRSA9IHNpemVvZihUKTsKK307CisKK3R5cGVkZWYgOjp0ZXN0aW5nOjpUeXBlczxpbnQzMl90LCBpbnQ2NF90LCBDMlNpemVTdHJ1Y3Q+IEZsZXhUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QsIEZsZXhUeXBlcyk7CisKK1RZUEVEX1RFU1QoQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpIHsKKyAgICBmb3IgKGF1dG8gYSA6IHRoaXMtPkdldExpc3RzKCkpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGE7CisgICAgICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDJ1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcihGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0KSwgZmllbGRzWzBdKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcih0aGlzLT5GbGV4VHlwZSwgMCwgImZsZXgiLCA0LCB0aGlzLT5GTEVYX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1sxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKHRoaXMtPkZsZXhUeXBlLCAwLCAiZmxleCIsIDAsIHRoaXMtPkZMRVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgZmllbGRzWzBdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4UzMyIHsKKyAgICBpbnQzMl90IG1GbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXgsIEZMRVhfU0laRSA9IDQgfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4UzMyIF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50MzJfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDAsICJmbGV4IiwgMCwgNCB9Cit9OworCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50MzJfdCBtRmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4RW5kLCBGTEVYX1NJWkUgPSA0IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleEVuZCBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIGludDMyX3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAorICAgIHsgRkQ6OklOVDMyLCAwLCAiZmxleCIsIDQsIDQgfSwKK307CisKK2NvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzJfcHRyX2ZpZWxkTGlzdCA9IHsKKyAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiopMCktPnNpZ25lZDMyLCAiczMyIiksCisgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIqKTApLT5tRmxleCwgImZsZXgiKSwKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4UzMyU3RydWN0IHsKKyAgICBpbnQzMl90IG1GbGV4U2lnbmVkMzJbXTsKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgQzJUZXN0RmxleFMzMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTMzIsIG1GbGV4U2lnbmVkMzIpCisgICAgQzJGSUVMRChtRmxleFNpZ25lZDMyLCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFMzMlN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQzMl90IG1GbGV4U2lnbmVkMzJbXTsKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgQzJUZXN0RmxleEVuZFMzMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleEVuZFMzMiwgbUZsZXhTaWduZWQzMikKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTMzIsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkMzIsICJmbGV4IikKK30pIC8vIDsgb3B0aW9uYWwKKwordGVtcGxhdGU8Pgorc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CitDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3Q8aW50MzJfdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMl9wdHJfZmllbGRMaXN0LAorICAgICAgICBDMlRlc3RGbGV4UzMyU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFMzMlN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4UzY0IHsKKyAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0RmxleFM2NCwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTNjQgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQ2NF90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCAwLCA4IH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IG1TaWduZWQ2NEZsZXhbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQsIEZMRVhfU0laRSA9IDggfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0IF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50NjRfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCisgICAgeyBGRDo6SU5UNjQsIDAsICJmbGV4IiwgNCwgOCB9LAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTNjRTdHJ1Y3QgeworICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOworICAgIEMyVGVzdEZsZXhTNjRTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4UzY0LCBtRmxleFNpZ25lZDY0KQorICAgIEMyRklFTEQobUZsZXhTaWduZWQ2NCwgImZsZXgiKQorfTsKKworc3RydWN0IEMyVGVzdEZsZXhFbmRTNjRTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBtRmxleFNpZ25lZDY0W107CisgICAgQzJUZXN0RmxleEVuZFM2NFN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleEVuZFM2NCwgbUZsZXhTaWduZWQ2NCkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTNjQsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkNjQsICJmbGV4IikKK30pIC8vIDsgb3B0aW9uYWwKKwordGVtcGxhdGU8Pgorc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CitDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3Q8aW50NjRfdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQ6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4UzY0U3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFM2NFN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZSB7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4U2l6ZSwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTaXplIF90eXBlOworICAgIC8vIHR5cGVkZWYgQzJTaXplU3RydWN0IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6Ol9GSUVMRF9MSVNUID0geworICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAwLCAiZmxleCIsIDAsIHNpemVvZihDMlNpemVTdHJ1Y3QpIH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1TaXplRmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUsIEZMRVhfU0laRSA9IDggfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIEMyU2l6ZVN0cnVjdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplOjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKKyAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMCwgImZsZXgiLCA0LCBzaXplb2YoQzJTaXplU3RydWN0KSB9LAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTaXplU3RydWN0IHsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0RmxleFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4U2l6ZSwgbUZsZXhTaXplKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworICAgIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KCkge30KKworICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kU2l6ZSwgbUZsZXhTaXplKQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFNpemUsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCitzdHJ1Y3QgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0JBU0VfRkxFWF9DMlNUUlVDVChUZXN0QmFzZUZsZXhFbmRTaXplLCBtRmxleFNpemUpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RCYXNlRmxleEVuZFNpemUsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCitzdHJ1Y3QgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfRkxFWF9DMlNUUlVDVChUZXN0QmFzZUZsZXhFbmRTaXplMiwgbUZsZXhTaXplKQorICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9OworCit0ZW1wbGF0ZTw+CitzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KK0MyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxDMlNpemVTdHJ1Y3Q+OjpHZXRMaXN0cygpIHsKKyAgICByZXR1cm4geworICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4U2l6ZVN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBGaWVsZElkKSB7CisgICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5mcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5ibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT55ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwKS0+bUZsZXhTaXplKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCktPm1GbGV4U2l6ZSkpOworCisgICAgLy8gbWVtYmVyIHBvaW50ZXIgY29uc3RydWN0b3IKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8pKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBzYW5zIHR5cGUgcG9pbnRlcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp5ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6Om1GbGV4U2l6ZSkpOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q+IEMyVGVzdEZsZXhFbmRTaXplSW5mbzsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTaXplPiBDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTsKKworICAgIC8vIHBvaW50ZXIgY29uc3RydWN0b3IgaW4gQzJQYXJhbQorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI4LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT51bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+eWVzTm8pKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mbyopMCktPm0uc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5tRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlKikwKS0+bS5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZSopMCktPm0ubUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBpbiBDMlBhcmFtCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp5ZXNObykpOworCisgICAgLy8gTk9URTogY2Fubm90IHVzZSBhIG1lbWJlciBwb2ludGVyIGZvciBmbGV4IHBhcmFtcyBkdWUgdG8gaW50cm9kdWN0aW9uIG9mICdtJworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm86Om0uc2lnbmVkMzIpKTsKKyAgICAvLyBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mbzo6bS5tRmxleFNpemUpKTsKKworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTo6bS5zaWduZWQzMikpOworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2U6Om0ubUZsZXhTaXplKSk7CisKKworfQorCitzdHJ1Y3QgUzMyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgUzMyKGNvbnN0IFQqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBhbiBhcnJheSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxCLCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworICAgIH0KK307CisKK3N0cnVjdCBGTFggeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBGTFgoY29uc3QgVCosIGNvbnN0IFUqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19hcnJheTxUPjo6dmFsdWUsICJzaG91bGQgYmUgYW4gYXJyYXkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmV4dGVudDxUPjo6dmFsdWUgPT0gMCwgInNob3VsZCBiZSBhbiBhcnJheSBvZiAwIGV4dGVudCIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxCLCBVPjo6dmFsdWUsICJzaG91bGQgYmUgdHlwZSBVIik7CisgICAgfQorfTsKKworc3RydWN0IE1QIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFeHBlY3RlZFUsIHR5cGVuYW1lIFVuZXhwZWN0ZWRVPgorICAgIGlubGluZSBNUChUIFU6OiosIGNvbnN0IEV4cGVjdGVkVSosIGNvbnN0IFVuZXhwZWN0ZWRVKikgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8VSwgVW5leHBlY3RlZFU+Ojp2YWx1ZSwgInNob3VsZCBub3QgYmUgbWVtYmVyIHBvaW50ZXIgb2YgdGhlIGJhc2UgdHlwZSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxVLCBFeHBlY3RlZFU+Ojp2YWx1ZSwgInNob3VsZCBiZSBtZW1iZXIgcG9pbnRlciBvZiB0aGUgZGVyaXZlZCB0eXBlIik7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgQiwgdHlwZW5hbWUgRD4KKyAgICBpbmxpbmUgTVAoVCBEOjoqLCBjb25zdCBEKikgeyB9Cit9OworCit2b2lkIGNvbXBpbGVkU3RhdGljX2FycmF5VHlwZVByb3BhZ2F0aW9uVGVzdCgpIHsKKyAgICAodm9pZClTMzIoJigoQzJUZXN0RmxleEVuZFMzMlN0cnVjdCAqKTApLT5zaWduZWQzMik7CisgICAgKHZvaWQpRkxYKCYoKEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QgKikwKS0+bUZsZXhTaWduZWQzMiwgKGludDMyX3QqKTApOworICAgICh2b2lkKUZMWCgmKChDMlRlc3RGbGV4UzMyU3RydWN0ICopMCktPm1GbGV4U2lnbmVkMzIsIChpbnQzMl90KikwKTsKKworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEFTdHJ1Y3Q+IEMyVGVzdEFJbmZvOworCisgICAgLy8gVFJJQ0tZOiAmZGVyaXZlZENsYXNzOjpiYXNlTWVtYmVyIGhhcyB0eXBlIG9mIGJhc2VDbGFzczo6KgorICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIpLCBpbnQzMl90IEMyVGVzdEFTdHJ1Y3Q6Oio+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJiYXNlIG1lbWJlciBwb2ludGVyIHNob3VsZCBoYXZlIGJhc2UgY2xhc3MgaW4gdHlwZSIpOworCisgICAgLy8gdGhlcmVmb3JlLCBtZW1iZXIgcG9pbnRlciBleHBhbmRzIHRvIGJhc2VDbGFzczo6KiBpbiB0ZW1wbGF0ZXMKKyAgICAodm9pZClNUCgmQzJUZXN0QUluZm86OnNpZ25lZDMyLAorICAgICAgICAgICAgIChDMlRlc3RBU3RydWN0KikwIC8qIGV4cGVjdGVkICovLCAoQzJUZXN0QUluZm8qKTAgLyogdW5leHBlY3RlZCAqLyk7CisgICAgLy8gYnV0IGNhbiBiZSBjYXN0IHRvIGRlcml2ZWRDbGFzczo6KgorICAgICh2b2lkKU1QKChpbnQzMl90IEMyVGVzdEFJbmZvOjoqKSZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsCisgICAgICAgICAgICAgKEMyVGVzdEFJbmZvKikwIC8qIGV4cGVjdGVkICovLCAoQzJUZXN0QVN0cnVjdCopMCAvKiB1bmV4cGVjdGVkICovKTsKKworICAgIC8vIFRSSUNLWTogYmFzZUNsYXNzOjoqIGRvZXMgbm90IGF1dG9jb252ZXJ0IHRvIGRlcml2ZWRDbGFzczo6KiBldmVuIGluIHRlbXBsYXRlcworICAgIC8vICh2b2lkKU1QKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsIChDMlRlc3RBSW5mbyopMCk7Cit9CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgTWVtYmVyUG9pbnRlckNhc3QpIHsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RBU3RydWN0PiBDMlRlc3RBSW5mbzsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0QUluZm8sIHNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QVN0cnVjdDo6KiBzMzJwdHIgPSAmQzJUZXN0QUluZm86OnNpZ25lZDMyOworICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFJbmZvOjoqIHMzMnB0cl9kZXJpdmVkID0gKGludDMyX3QgQzJUZXN0QVN0cnVjdDo6KikmQzJUZXN0QUluZm86OnNpZ25lZDMyOworICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFJbmZvOjoqIHMzMnB0cl9jYXN0MmRlcml2ZWQgPSAoaW50MzJfdCBDMlRlc3RBSW5mbzo6KilzMzJwdHI7CisgICAgQzJUZXN0QUluZm8gKmluZm8gPSAoQzJUZXN0QUluZm8gKikyNTY7CisgICAgQzJUZXN0QVN0cnVjdCAqc3RydWt0ID0gKEMyVGVzdEFTdHJ1Y3QgKilpbmZvOworICAgIGludDMyX3QgKmluZm9fczMyX2Rlcml2ZWQgPSAmKGluZm8tPipzMzJwdHJfZGVyaXZlZCk7CisgICAgaW50MzJfdCAqaW5mb19zMzJfY2FzdDJkZXJpdmVkID0gJihpbmZvLT4qczMycHRyX2Nhc3QyZGVyaXZlZCk7CisgICAgaW50MzJfdCAqaW5mb19zMzIgPSAmKGluZm8tPipzMzJwdHIpOworICAgIGludDMyX3QgKnN0cnVrdF9zMzIgPSAmKHN0cnVrdC0+KnMzMnB0cik7CisKKyAgICBFWFBFQ1RfRVEoMjU2dSwgKHVpbnRwdHJfdClpbmZvKTsKKyAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClzdHJ1a3QpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyX2Rlcml2ZWQpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyX2Nhc3QyZGVyaXZlZCk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzIpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KXN0cnVrdF9zMzIpOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q+IEMyVGVzdEZsZXhFbmRTaXplSW5mbzsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mbywgbS5zaWduZWQzMikgPT0gOCwgIm9mZnNldCBzaG91bGQgYmUgOCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvLCBtLm1GbGV4U2l6ZSkgPT0gMTIsICJvZmZzZXQgc2hvdWxkIGJlIDEyIik7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTaXplPiBDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlLCBtLnNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZSwgbS5tRmxleFNpemUpID09IDEyLCAib2Zmc2V0IHNob3VsZCBiZSAxMiIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBBUkFNIFVTQUdFIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RydWN0IEMyTnVtYmVyU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXI7CisgICAgQzJOdW1iZXJTdHJ1Y3QoKSB7fQorICAgIEMyTnVtYmVyU3RydWN0KGludDMyX3QgX251bWJlcikgOiBtTnVtYmVyKF9udW1iZXIpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKE51bWJlcikKKyAgICBDMkZJRUxEKG1OdW1iZXIsICJudW1iZXIiKQorfTsKKworc3RydWN0IEMyTnVtYmVyQmFzZVN0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyOworICAgIEMyTnVtYmVyQmFzZVN0cnVjdCgpIHt9CisgICAgQzJOdW1iZXJCYXNlU3RydWN0KGludDMyX3QgX251bWJlcikgOiBtTnVtYmVyKF9udW1iZXIpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QoTnVtYmVyQmFzZSkKKyAgICBDMkZJRUxEKG1OdW1iZXIsICJudW1iZXIiKQorfTsKKworc3RydWN0IEMyTnVtYmVyc1N0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyc1tdOworICAgIEMyTnVtYmVyc1N0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoTnVtYmVycywgbU51bWJlcnMpCisgICAgQzJGSUVMRChtTnVtYmVycywgIm51bWJlcnMiKQorfTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cnVjdCkgPT0gMCwgIkMyTnVtYmVyc1N0cnVjdCBoYXMgaW5jb3JyZWN0IHNpemUiKTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVySW5mbzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJUdW5pbmc7Cit0eXBlZGVmICAgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclBvcnRUdW5pbmc7Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclN0cmVhbVR1bmluZzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1R1bmluZzsKK3R5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJzU3RydWN0PiBDMk51bWJlcnNQb3J0VHVuaW5nOwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1N0cmVhbVR1bmluZzsKKworLy8KKyNpZiAwCisKK3ZvaWQgdGVzdCgpIHsKKyAgICBDMk51bWJlclN0cnVjdCBzKDEwKTsKKyAgICAodm9pZClDMk51bWJlclN0cnVjdDo6RmllbGRMaXN0KCk7Cit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50NjRWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXJCPiBDMk51bWJlckNvbmZpZzQ7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyPiBDMk51bWJlckNvbmZpZzM7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyPiBDMlZpZGVvTmFtZUNvbmZpZzsKKwordm9pZCB0ZXN0MygpIHsKKyAgICBDMk51bWJlckNvbmZpZzMgcygxMCk7CisgICAgcy52YWx1ZSA9IDExOworICAgIHMgPSAxMjsKKyAgICAodm9pZClDMk51bWJlckNvbmZpZzM6OkZpZWxkTGlzdCgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlZpZGVvTmFtZUNvbmZpZz4gbiA9IEMyVmlkZW9OYW1lQ29uZmlnOjpBbGxvY1NoYXJlZCgyNSk7CisgICAgc3RyY3B5KG4tPm0udmFsdWUsICJsYWpvcyIpOworICAgIEMyTnVtYmVyQ29uZmlnNCB0KGZhbHNlLCAwLCAxMSk7CisgICAgdC52YWx1ZSA9IDE1OworfTsKKworc3RydWN0IEMyTnVtYmVyc1N0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyc1tdOworICAgIGVudW0geyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhOdW1iZXIgfTsKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgQzJOdW1iZXJzU3RydWN0KCkge30KKworICAgIEZMRVgoQzJOdW1iZXJzU3RydWN0LCBtTnVtYmVycyk7Cit9OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJ5ZXMiKTsKKworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc0luZm87CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMk51bWJlcnNTdHJ1Y3Q6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJOdW1iZXJzU3RydWN0OjpfRklFTERfTElTVCA9CisvLyAgICB7IHsgRkQ6OklOVDMyLCAwLCAid2lkdGhzIiB9IH07CisgICAgeyBDMkZpZWxkRGVzY3JpcHRvcigmKChDMk51bWJlcnNTdHJ1Y3QqKShudWxscHRyKSktPm1OdW1iZXJzLCAibnVtYmVyIikgfTsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyQ29uZmlnOworCitzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gbXlMaXN0ID0gQzJOdW1iZXJDb25maWc6OkZpZWxkTGlzdCgpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBfX3Rlc3RfZGVzY3JpYmUodWludDMyX3QgcGFyYW1UeXBlKSB7CisgICAgICAgIHN0ZDo6bGlzdDxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZGVzY3JpYmVDMlBhcmFtczxDMk51bWJlckNvbmZpZz4oKTsKKworICAgICAgICBhdXRvIHdpZHRocyA9IEMyTnVtYmVyc0luZm86OkFsbG9jU2hhcmVkKDUpOworICAgICAgICB3aWR0aHMtPmZsZXhDb3VudCgpOworICAgICAgICB3aWR0aHMtPm0ubU51bWJlcnNbNF0gPSAxOworCisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgdGVzdDMoKTsKKworICAgICAgICBDMk51bWJlckNvbmZpZyBvdXRwdXRXaWR0aChmYWxzZSwgMTIzKTsKKworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleChwYXJhbVR5cGUpOworICAgICAgICBzd2l0Y2ggKHBhcmFtVHlwZSkgeworICAgICAgICBjYXNlIEMyTnVtYmVyQ29uZmlnOjpDT1JFX0lOREVYOgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4obmV3IEMyUGFyYW1EZXNjcmlwdG9yeworICAgICAgICAgICAgICAgIHRydWUgLyogaXNSZXF1aXJlZCAqLywKKyAgICAgICAgICAgICAgICAibnVtYmVyIiwKKyAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgorLy8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgY2FuU2V0UG9ydChUICZvLCBib29sIG91dHB1dCkgeyByZXR1cm4gby5zZXRQb3J0KG91dHB1dCk7IH0KK2Jvb2wgY2FuU2V0UG9ydCguLi4pIHsgcmV0dXJuIGZhbHNlOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKCgoUyopMCktPnNldFBvcnQodHJ1ZSkpPgorc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIF9jYW5DYWxsU2V0UG9ydChpbnQpOwordGVtcGxhdGU8dHlwZW5hbWU+CitzdGF0aWMgc3RkOjpmYWxzZV90eXBlIF9jYW5DYWxsU2V0UG9ydCguLi4pOworI2RlZmluZSBjYW5DYWxsU2V0UG9ydCh4KSBkZWNsdHlwZShfY2FuQ2FsbFNldFBvcnQ8c3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKHgpPjo6dHlwZT4oMCkpOjp2YWx1ZQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RBVElDIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8aW50Pjo6dmFsdWUsICJpbnQgaXMgbm90IGNvbXBhcmFibGUiKTsKK3N0YXRpY19hc3NlcnQoIV9DMkNvbXBhcmFibGU8dm9pZD46OnZhbHVlLCAidm9pZCBpcyBjb21wYXJhYmxlIik7CisKK3N0cnVjdCBDMl9ISURFIF90ZXN0MCB7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF90ZXN0MCYpOworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfdGVzdDAmKTsKK307CitzdHJ1Y3QgQzJfSElERSBfdGVzdDEgeworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfdGVzdDEmKTsKK307CitzdHJ1Y3QgQzJfSElERSBfdGVzdDIgeworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfdGVzdDImKTsKK307CitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QwPjo6dmFsdWUsICJjbGFzcyB3aXRoID09IGFuZCAhPSBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0MT46OnZhbHVlLCAiY2xhc3Mgd2l0aCA9PSBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0Mj46OnZhbHVlLCAiY2xhc3Mgd2l0aCAhPSBpcyBub3QgY29tcGFyYWJsZSIpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQzJQQVJBTSBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNUZXN0KCk7CisgICAgc3RhdGljIHZvaWQgU3RhdGljRnJvbUJhc2VUZXN0KCk7CisgICAgc3RhdGljIHZvaWQgU3RhdGljRmxleFRlc3QoKTsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNGbGV4RnJvbUJhc2VUZXN0KCk7Cit9OworCisvLyBURVNUX0YoX0MyUGFyYW1JbnNwZWN0b3IsIFN0YXRpY1Rlc3QpIHsKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY1Rlc3QoKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJOdW1iZXJTdHJ1Y3Q6IENPUkVfSU5ERVggPSBrSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cnVjdCkgPT0gNCwgImJhZCBzaXplIik7CisKKyAgICAvLyBDMk51bWJlclR1bmluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyVHVuaW5nOjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclR1bmluZzo6UEFSQU1fVFlQRSA9PSAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJUdW5pbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJUdW5pbmcsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclR1bmluZywgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyVHVuaW5nLCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDogIGtJbmRleCB8IHR1biB8IHBvcnQgfCBpbnB1dCAgICAgKGFyZ3MpCisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZykgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0lOUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY0Zyb21CYXNlVGVzdCgpIHsKKyAgICBlbnVtIHsga1BhcmFtSW5kZXhNeSA9IDMxMDIgfTsKKyAgICB0eXBlZGVmIEMyTnVtYmVyQmFzZVN0cnVjdCBDMk15U3RydWN0OworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlTZXR0aW5nOworICAgIHR5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlQb3J0U2V0dGluZzsKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJTZXR0aW5nLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15U3RyZWFtU2V0dGluZzsKKworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTXlTdHJ1Y3QgaGFzIG5vIENPUkVfSU5ERVgKKyAgICAvL3N0YXRpY19hc3NlcnQoQzJNeVN0cnVjdDo6Q09SRV9JTkRFWCA9PSBrUGFyYW1JbmRleE15LCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cnVjdCkgPT0gNCwgImJhZCBzaXplIik7CisKKyAgICAvLyBDMk15U2V0dGluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTZXR0aW5nOjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTZXR0aW5nOjpQQVJBTV9UWVBFID09IChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U2V0dGluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U2V0dGluZywgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTZXR0aW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVNldHRpbmcsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6ICAgICAgICAga0luZGV4IHwgdHVuIHwgcG9ydCAgICAgICAgICAgICAoYm9vbCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydFNldHRpbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX0lOUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfU0VUVElORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15U3RyZWFtU2V0dGluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtU2V0dGluZykgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworfQorCit2b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNGbGV4VGVzdCgpIHsKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7CisKKyAgICAvLyBDMk51bWJlcnNTdHJ1Y3Q6IENPUkVfSU5ERVggPSBrSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RydWN0KSA9PSAwLCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTnVtYmVyc1R1bmluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1R1bmluZzo6Q09SRV9JTkRFWCA9PSAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzVHVuaW5nOjpQQVJBTV9UWVBFID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzVHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBtLm1OdW1iZXJzKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJOdW1iZXJzUG9ydFR1bmluZzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQpID09IDgsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6ICAgICAgIGtJbmRleCB8IHR1biB8IHN0ciAgICAgICAgICAgICAgKGJvb2wsIHVpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0IGtJbmRleCB8IHR1biB8IHN0ciB8IGlucHV0ICAgICAgKGludCwgYXJncykKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3RlbXBsYXRlPGJvb2wsIHVuc2lnbmVkIC4uLk4+CitzdHJ1Y3QgX3ByaW50X2FzX3dhcm5pbmcgeyB9OworCit0ZW1wbGF0ZTx1bnNpZ25lZCAuLi5OPgorc3RydWN0IF9wcmludF9hc193YXJuaW5nPHRydWUsIE4uLi4+IDogc3RkOjp0cnVlX3R5cGUgeyB9OworCisjZGVmaW5lIHN0YXRpY19hc3NlcnRfZXF1YWxzKGEsIGIsIG1zZykgXAorc3RhdGljX2Fzc2VydChfcHJpbnRfYXNfd2FybmluZzwoYSkgPT0gKGIpLCBhLCBiPjo6dmFsdWUsIG1zZykKKwordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljRmxleEZyb21CYXNlVGVzdCgpIHsKKyAgICBlbnVtIHsga1BhcmFtSW5kZXhNeSA9IDEyMDMgfTsKKyAgICB0eXBlZGVmIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCBDMk15U3RydWN0OworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlJbmZvOworICAgIHR5cGVkZWYgICBDMlBvcnRQYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlQb3J0SW5mbzsKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15U3RyZWFtSW5mbzsKKworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTXlTdHJ1Y3QgaGFzIG5vIENPUkVfSU5ERVgKKyAgICAvL3N0YXRpY19hc3NlcnQoQzJNeVN0cnVjdDo6Q09SRV9JTkRFWCA9PSAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTXlJbmZvOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnRfZXF1YWxzKEMyTXlJbmZvOjpDT1JFX0lOREVYLCAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0X2VxdWFscyhDMk15SW5mbzo6UEFSQU1fVFlQRSwgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfR0xPQkFMKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlJbmZvKSA9PSAxMiwgImJhZCBzaXplIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlJbmZvLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeUluZm8sIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15SW5mbywgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlQb3J0SW5mbzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0SW5mbykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlQb3J0SW5mbzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTXlQb3J0SW5mbzo6b3V0cHV0OiBrSW5kZXggfCB0dW4gfCBwb3J0IHwgb3V0cHV0ICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydEluZm86OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRJbmZvOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6aW5wdXQsIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQsIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15U3RyZWFtSW5mbzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtSW5mbykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlTdHJlYW1JbmZvOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJNeVN0cmVhbUluZm86Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtSW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX0lOUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtSW5mbzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBQYXJhbU9wc1Rlc3QpIHsKKyAgICBjb25zdCBDMk51bWJlclN0cnVjdCBzdHIoMTAwKTsKKyAgICBDMk51bWJlclN0cnVjdCBic3RyOworCisgICAgeworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBzdHIubU51bWJlcik7CisgICAgICAgIGJzdHIubU51bWJlciA9IDEwMDsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgIH0KKworICAgIGNvbnN0IEMyTnVtYmVyVHVuaW5nIHR1bigxMDApOworICAgIEMyTnVtYmVyVHVuaW5nIGJ0dW47CisKKyAgICB7CisgICAgICBDMk51bWJlckluZm8gaW5mKDEwMCk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzVHVuaW5nPiB0dW5fID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1VuaXF1ZSgxKTsKKworICAgICAgRVhQRUNUX0VRKHR1bi5jb3JlSW5kZXgoKSwgaW5mLmNvcmVJbmRleCgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4uY29yZUluZGV4KCksIHR1bl8tPmNvcmVJbmRleCgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4udHlwZSgpLCBpbmYudHlwZSgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4udHlwZSgpLCB0dW5fLT50eXBlKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IHR1biwgYnR1biB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZQorICAgICAgICBFWFBFQ1RfRVEoMTAwLCB0dW4ubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBidHVuLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuID09IGJ0dW4pOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuLm9wZXJhdG9yPT0oYnR1bikpOworICAgICAgICBFWFBFQ1RfVFJVRSh0dW4gIT0gYnR1bik7CisgICAgICAgIEVYUEVDVF9UUlVFKHR1bi5vcGVyYXRvciE9KGJ0dW4pKTsKKyAgICAgICAgYnR1bi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfRVEodHVuLCBidHVuKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4udHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4udHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEodHVuLnR5cGUoKSwgQzJOdW1iZXJUdW5pbmc6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEodHVuLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyVHVuaW5nOjpDT1JFX0lOREVYOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJUdW5pbmc6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZ0dW4pLCAmdHVuKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGJ0dW4pKSwgYnR1bik7CisgICAgICAgIGJ0dW4uaW52YWxpZGF0ZSgpOworICAgICAgICBFWFBFQ1RfRkFMU0UoQzJQYXJhbTo6Q29weShidHVuKSk7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nIG91dHAxKHRydWUsIDEwMCksIGlucDEoZmFsc2UsIDEwMCk7CisgICAgQzJOdW1iZXJQb3J0VHVuaW5nIGJvdXRwMSwgYmlucDEsIGJpbnAzKGZhbHNlLCAxMDApOworICAgIGNvbnN0IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQgaW5wMigxMDApOworICAgIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQgYmlucDI7CisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQgb3V0cDIoMTAwKTsKKyAgICBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCBib3V0cDI7CisKKyAgICBFWFBFQ1RfRVEoaW5wMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0cDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJpbnAxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShib3V0cDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGlucDIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKG91dHAyLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworCisgICAgRVhQRUNUX0VRKGlucDEudHlwZSgpLCBpbnAyLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKG91dHAxLnR5cGUoKSwgb3V0cDIudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMS50eXBlKCksIG91dHAxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDIudHlwZSgpLCBvdXRwMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAxLnR5cGUoKSwgYmlucDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUob3V0cDEudHlwZSgpLCBib3V0cDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMS50eXBlKCksIHR1bi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAyLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmlucDMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5wMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnAxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGJpbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDEsIGlucDEsIGJvdXRwMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGlucDIsIGJpbnAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDIsIGJvdXRwMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0cDEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxLmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5wMS5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMSwgaW5wMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLm1OdW1iZXIpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDIsIGJvdXRwMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnAyLCBiaW5wMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBib3V0cDEgfSApIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC5tTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnAyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRwMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDIubU51bWJlcik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSAhPSBvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgPT0gaW5wMik7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IG91dHAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmlucDEgPT0gYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmlucDIgIT0gYm91dHAyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IGJpbnAxKTsKKyAgICAgICAgYmlucDEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSAhPSBiaW5wMSk7CisgICAgICAgIGJpbnAxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpYmlucDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoIWJpbnAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMiAhPSBiaW5wMik7CisgICAgICAgIGJpbnAyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDIgPT0gYmlucDIpOworCisgICAgICAgIGJpbnAxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSA9PSBiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgIT0gYm91dHAxKTsKKyAgICAgICAgYm91dHAxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxICE9IGJvdXRwMSk7CisgICAgICAgIGJvdXRwMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCFib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSA9PSBib3V0cDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAyICE9IGJvdXRwMik7CisgICAgICAgIGJvdXRwMi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMiA9PSBib3V0cDIpOworCisgICAgICAgIGJvdXRwMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgPT0gYm91dHAxKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDIudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDIuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMS50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDIudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDIudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICB0eXBlID0gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnAxKSwgJmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnAyKSwgKEMyTnVtYmVyUG9ydFR1bmluZyopJmlucDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZvdXRwMSksICZvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHAyKSwgKEMyTnVtYmVyUG9ydFR1bmluZyopJm91dHAyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDEpLCAoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCopJmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMiksICZpbnAyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDEpLCAoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQqKSZvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDIpLCAmb3V0cDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoaW5wMSkpLCBpbnAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnAyKSksIGlucDIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHAxKSksIG91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShvdXRwMikpLCBvdXRwMik7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmcgb3V0czEodHJ1ZSwgMXUsIDEwMCksIGluczEoZmFsc2UsIDF1LCAxMDApOworICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nIGJvdXRzMSwgYmluczEsIGJpbnMzKGZhbHNlLCAxdSwgMTAwKTsKKyAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQgaW5zMigxdSwgMTAwKTsKKyAgICBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQgYmluczI7CisgICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCBvdXRzMigxdSwgMTAwKTsKKyAgICBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0IGJvdXRzMjsKKworICAgIEVYUEVDVF9FUShpbnMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRzMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYmluczEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJvdXRzMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoaW5zMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisKKyAgICBFWFBFQ1RfRVEoaW5zMS50eXBlKCksIGluczIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoaW5zMS50eXBlKCksIGJpbnMyLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKG91dHMxLnR5cGUoKSwgb3V0czIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBib3V0czIudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMS50eXBlKCksIG91dHMxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczIudHlwZSgpLCBvdXRzMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMxLnR5cGUoKSwgYmluczEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUob3V0czEudHlwZSgpLCBib3V0czEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMS50eXBlKCksIHR1bi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMyLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmluczMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5zMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnMxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGJpbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czEsIGluczEsIGJvdXRzMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGluczIsIGJpbnMyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czIsIGJvdXRzMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0czEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxLmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5zMS5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMSwgaW5zMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLm1OdW1iZXIpOworICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBwLnN0cmVhbSgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMyLCBib3V0czIgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5zMiwgYmluczIgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgYm91dHMxIH0gKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAubU51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5zMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0czIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMS5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnMyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMyLm1OdW1iZXIpOworCisgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5zMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgb3V0czIuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMxLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMxLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czIuc3RyZWFtKCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gb3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxID09IGluczIpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSA9PSBvdXRzMik7CisgICAgICAgIEVYUEVDVF9UUlVFKGJpbnMxID09IGJvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGJpbnMyICE9IGJvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7CisgICAgICAgIGJpbnMxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gYmluczEpOworICAgICAgICBiaW5zMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gYmluczEpOworICAgICAgICBiaW5zMS5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxID09IGJpbnMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMyICE9IGJpbnMyKTsKKyAgICAgICAgYmluczIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMiAhPSBiaW5zMik7CisgICAgICAgIGJpbnMyLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczIgPT0gYmluczIpOworCisgICAgICAgIGJpbnMxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSA9PSBiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxICE9IGJvdXRzMSk7CisgICAgICAgIGJvdXRzMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IGJvdXRzMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czIgIT0gYm91dHMyKTsKKyAgICAgICAgYm91dHMyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMyICE9IGJvdXRzMik7CisgICAgICAgIGJvdXRzMi5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMiA9PSBib3V0czIpOworCisgICAgICAgIGJvdXRzMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gYm91dHMxKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnMxLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnMyLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMxLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRzMi50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmaW5zMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnMxKSwgJmluczEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmluczIpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmcqKSZpbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRzMSksICZvdXRzMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0czIpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmcqKSZvdXRzMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmluczEpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0KikmaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmluczIpLCAmaW5zMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMSksIChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0Kikmb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czIpLCAmb3V0czIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoaW5zMSkpLCBpbnMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnMyKSksIGluczIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHMxKSksIG91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShvdXRzMikpLCBvdXRzMik7CisgICAgfQorCisgICAgeworICAgICAgICB1aW50MzJfdCB2aWRlb1dpZHRoW10gPSB7IDEydSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSwgMTAwIH07CisgICAgICAgIEMyUGFyYW0gKnAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkpOworICAgICAgICBFWFBFQ1RfTkUocDEsIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwMS0+c2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLT50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKyAgICB9Cit9CisKK3ZvaWQgU3RhdGljVGVzdEFkZENvcmVJbmRleCgpIHsKKyAgICBzdHJ1Y3Qgbm9iYXNlIHt9OworICAgIHN0cnVjdCBiYXNlIHsgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IDEgfTsgfTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9DMkFkZENvcmVJbmRleDxub2Jhc2UsIDI+OjpDT1JFX0lOREVYID09IDIsICJzaG91bGQgYmUgMiIpOworICAgIHN0YXRpY19hc3NlcnQoX0MyQWRkQ29yZUluZGV4PGJhc2UsIDE+OjpDT1JFX0lOREVYID09IDEsICJzaG91bGQgYmUgMSIpOworfQorCitjbGFzcyBUZXN0RmxleEhlbHBlciB7CisgICAgc3RydWN0IF9GbGV4IHsKKyAgICAgICAgaW50MzJfdCBhOworICAgICAgICBjaGFyIGJbXTsKKyAgICAgICAgX0ZsZXgoKSB7fQorICAgICAgICBGTEVYKF9GbGV4LCBiKTsKKyAgICB9OworCisgICAgc3RydWN0IF9Cb0ZsZXggeworICAgICAgICBfRmxleCBhOworICAgICAgICBfQm9GbGV4KCkge30KKyAgICAgICAgRkxFWChfQm9GbGV4LCBhKTsKKyAgICB9OworCisgICAgc3RydWN0IF9Ob25GbGV4IHsKKyAgICB9OworCisKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNUZXN0KCkgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPGNoYXI+OjpGbGV4VHlwZSwgdm9pZD46OnZhbHVlLCAic2hvdWxkIGJlIHZvaWQiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxjaGFyW10+OjpGbGV4VHlwZSwgY2hhcj46OnZhbHVlLCAic2hvdWxkIGJlIGNoYXIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxfRmxleD46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhciIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8X0JvRmxleD46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgdm9pZCIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoX0MyRmxleGlibGU8X0ZsZXg+Ojp2YWx1ZSwgInNob3VsZCBiZSBmbGV4aWJsZSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFfQzJGbGV4aWJsZTxfTm9uRmxleD46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBmbGV4aWJsZSIpOworICAgIH0KK307CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgRmxleFBhcmFtT3BzVGVzdCkgeworLy8gICAgY29uc3QgQzJOdW1iZXJzU3RydWN0IHN0cnsxMDB9OworICAgIEMyTnVtYmVyc1N0cnVjdCBic3RyOworICAgIHsKKy8vICAgICAgICBFWFBFQ1RfRVEoMTAwLCBzdHItPm0ubU51bWJlcnNbMF0pOworICAgICAgICAodm9pZCkmYnN0ci5tTnVtYmVyc1swXTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzVHVuaW5nPiB0dW5fID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1VuaXF1ZSgxKTsKKyAgICB0dW5fLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNUdW5pbmc+IHR1biA9IHN0ZDo6bW92ZSh0dW5fKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzVHVuaW5nPiBidHVuID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1NoYXJlZCgxKTsKKworICAgIHsKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNUdW5pbmcgKlRbXSA9IHsgdHVuLmdldCgpLCBidHVuLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogVCkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIHR1bi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBidHVuLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCp0dW4gPT0gKmJ0dW4pOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuLT5vcGVyYXRvcj09KCpidHVuKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCp0dW4gIT0gKmJ0dW4pOworICAgICAgICBFWFBFQ1RfVFJVRSh0dW4tPm9wZXJhdG9yIT0oKmJ0dW4pKTsKKyAgICAgICAgYnR1bi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX0VRKCp0dW4sICpidHVuKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4tPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKHR1bi0+dHlwZSgpLCBDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEodHVuLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNUdW5pbmc6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbSh0dW4uZ2V0KCkpLCB0dW4uZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKnR1bikpLCAqdHVuKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZz4gb3V0cDFfKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jVW5pcXVlKDEsIHRydWUpKSwKKyAgICAgICAgICAgIGlucDFfID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NVbmlxdWUoMSwgZmFsc2UpOworICAgIG91dHAxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBpbnAxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZz4gb3V0cDEgPSBzdGQ6Om1vdmUob3V0cDFfKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZz4gaW5wMSA9IHN0ZDo6bW92ZShpbnAxXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc+IGJvdXRwMShDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1NoYXJlZCgxKSksCisgICAgICAgICAgICBiaW5wMSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jU2hhcmVkKDEpLAorICAgICAgICAgICAgYmlucDMgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1NoYXJlZCgxLCBmYWxzZSk7CisgICAgYmlucDMtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBpbnAyXyhDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6QWxsb2NVbmlxdWUoMSkpOworICAgIGlucDJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dD4gaW5wMiA9IHN0ZDo6bW92ZShpbnAyXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBiaW5wMihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ+IG91dHAyXyhDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKDEpKTsKKyAgICBvdXRwMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dD4gb3V0cDIgPSBzdGQ6Om1vdmUob3V0cDJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBib3V0cDIoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgxKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnAzKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnAxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnAxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QgJiB0eXBlKSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqYmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUFtdID0geyBvdXRwMS5nZXQoKSwgaW5wMS5nZXQoKSwgYm91dHAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCAqUElbXSA9IHsgaW5wMi5nZXQoKSwgYmlucDIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQSSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQgKlBPW10gPSB7IG91dHAyLmdldCgpLCBib3V0cDIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQTykgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0cDEtPmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMS0+Zm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEtPmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5wMS0+Zm9yT3V0cHV0KCkpOworCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlAyW10gPSB7IG91dHAxLmdldCgpLCBpbnAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUDIpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUE8pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUEkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlAzW10gPSB7IGJvdXRwMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFAzKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSghKCpwKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5wMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMS0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDItPm0ubU51bWJlcnNbMF0pOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICppbnAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpvdXRwMik7CisgICAgICAgIEVYUEVDVF9UUlVFKCpiaW5wMSA9PSAqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnAyICE9ICpib3V0cDIpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpiaW5wMSk7CisgICAgICAgIGJpbnAxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSAhPSAqYmlucDEpOworICAgICAgICBiaW5wMS0+c2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkqYmlucDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoISpiaW5wMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICpiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDIgIT0gKmJpbnAyKTsKKyAgICAgICAgYmlucDItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAyID09ICpiaW5wMik7CisKKyAgICAgICAgYmlucDEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKmJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgIT0gKmJvdXRwMSk7CisgICAgICAgIGJvdXRwMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxICE9ICpib3V0cDEpOworICAgICAgICBib3V0cDEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCEqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpib3V0cDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMiAhPSAqYm91dHAyKTsKKyAgICAgICAgYm91dHAyLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDIgPT0gKmJvdXRwMik7CisKKyAgICAgICAgYm91dHAxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICpib3V0cDEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEtPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEtPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnAyLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDItPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMS0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDItPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAyLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGlucDEuZ2V0KCkpLCBpbnAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nKilpbnAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0cDEuZ2V0KCkpLCBvdXRwMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHAyLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmcqKW91dHAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKGlucDEuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQqKWlucDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMi5nZXQoKSksIGlucDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMS5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQqKW91dHAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG91dHAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnAxKSksICppbnAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqaW5wMikpLCAqaW5wMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKm91dHAxKSksICpvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKm91dHAyKSksICpvdXRwMik7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gb3V0czFfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NVbmlxdWUoMSwgdHJ1ZSwgMXUpKTsKKyAgICBvdXRzMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gb3V0czEgPSBzdGQ6Om1vdmUob3V0czFfKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBpbnMxXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jVW5pcXVlKDEsIGZhbHNlLCAxdSkpOworICAgIGluczFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGluczEgPSBzdGQ6Om1vdmUoaW5zMV8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJvdXRzMShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBiaW5zMShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBiaW5zMyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEsIGZhbHNlLCAxdSkpOworICAgIGJpbnMzLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBpbnMyXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpBbGxvY1VuaXF1ZSgxLCAxdSkpOworICAgIGluczJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBpbnMyID0gc3RkOjptb3ZlKGluczJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dD4gYmluczIoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gb3V0czJfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgxLCAxdSkpOworICAgIG91dHMyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ+IG91dHMyID0gc3RkOjptb3ZlKG91dHMyXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0PiBib3V0czIoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDEpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmluczMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmluczEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmluczEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCpiaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7CisKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmcgKlNbXSA9IHsgb3V0czEuZ2V0KCksIGluczEuZ2V0KCksIGJvdXRzMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCAqU0lbXSA9IHsgaW5zMi5nZXQoKSwgYmluczIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTSSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCAqU09bXSA9IHsgb3V0czIuZ2V0KCksIGJvdXRzMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNPKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRzMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnMxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nICpTMltdID0geyBvdXRzMS5nZXQoKSwgaW5zMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMyKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgcC0+c3RyZWFtKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU08pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU0kpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZyAqUzNbXSA9IHsgYm91dHMxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUzMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnMyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0czItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRzMi0+bS5tTnVtYmVyc1swXSk7CisKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbnMyLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgb3V0czItPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMS0+c3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMyLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMxLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMyLT5zdHJlYW0oKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKm91dHMxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgPT0gKmluczIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKm91dHMyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnMxID09ICpib3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmluczIgIT0gKmJvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKKyAgICAgICAgYmluczEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7CisgICAgICAgIGJpbnMxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7CisgICAgICAgIGJpbnMxLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSA9PSAqYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMyICE9ICpiaW5zMik7CisgICAgICAgIGJpbnMyLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMiAhPSAqYmluczIpOworICAgICAgICBiaW5zMi0+c2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczIgPT0gKmJpbnMyKTsKKworICAgICAgICBiaW5zMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgIT0gKmJvdXRzMSk7CisgICAgICAgIGJvdXRzMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKmJvdXRzMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMyICE9ICpib3V0czIpOworICAgICAgICBib3V0czItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMiAhPSAqYm91dHMyKTsKKyAgICAgICAgYm91dHMyLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czIgPT0gKmJvdXRzMik7CisKKyAgICAgICAgYm91dHMxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxID09ICpib3V0czEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEtPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnMxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnMyLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShvdXRzMi0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICB0eXBlID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIGluczEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKilpbnMyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG91dHMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmcqKW91dHMyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMS5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0KilpbnMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMi5nZXQoKSksIGluczIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQqKW91dHMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMyLmdldCgpKSwgb3V0czIuZ2V0KCkpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmluczEpKSwgKmluczEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnMyKSksICppbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0czEpKSwgKm91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0czIpKSwgKm91dHMyKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMySW50MzJWYWx1ZSBpbnQzMlZhbHVlKElOVDMyX01JTik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGludDMyVmFsdWUudmFsdWUpLCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworICAgICAgICBFWFBFQ1RfRVEoSU5UMzJfTUlOLCBpbnQzMlZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGludDMyVmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6SU5UMzIsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBDMlVpbnQzMlZhbHVlIHVpbnQzMlZhbHVlKFVJTlQzMl9NQVgpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSh1aW50MzJWYWx1ZS52YWx1ZSksIHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKKyAgICAgICAgRVhQRUNUX0VRKFVJTlQzMl9NQVgsIHVpbnQzMlZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHVpbnQzMlZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlVJTlQzMiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMySW50NjRWYWx1ZSBpbnQ2NFZhbHVlKElOVDY0X01JTik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGludDY0VmFsdWUudmFsdWUpLCBpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50NjRfdCIpOworICAgICAgICBFWFBFQ1RfRVEoSU5UNjRfTUlOLCBpbnQ2NFZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGludDY0VmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6SU5UNjQsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBDMlVpbnQ2NFZhbHVlIHVpbnQ2NFZhbHVlKFVJTlQ2NF9NQVgpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSh1aW50NjRWYWx1ZS52YWx1ZSksIHVpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDY0X3QiKTsKKyAgICAgICAgRVhQRUNUX0VRKFVJTlQ2NF9NQVgsIHVpbnQ2NFZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHVpbnQ2NFZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlVJTlQ2NCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyRmxvYXRWYWx1ZSBmbG9hdFZhbHVlKDEyMy40Zik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGZsb2F0VmFsdWUudmFsdWUpLCBmbG9hdD46OnZhbHVlLCAic2hvdWxkIGJlIGZsb2F0Iik7CisgICAgICAgIEVYUEVDVF9FUSgxMjMuNGYsIGZsb2F0VmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZmxvYXRWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpGTE9BVCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgaW5pdFZhbHVlW10gPSAiQUJDRCI7CisgICAgICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyQmxvYlZhbHVlLCAwPiBCbG9iU2V0dGluZzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJsb2JTZXR0aW5nPiBibG9iVmFsdWUgPSBCbG9iU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgQzJDb25zdE1lbW9yeUJsb2NrPHVpbnQ4X3Q+KGluaXRWYWx1ZSkpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShibG9iVmFsdWUtPm0udmFsdWUpLCB1aW50OF90W10+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50OF90W10iKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CisgICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBibG9iVmFsdWUtPkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OkJMT0IsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisKKyAgICAgICAgYmxvYlZhbHVlID0gQmxvYlNldHRpbmc6OkFsbG9jVW5pcXVlKDMsIEMyQ29uc3RNZW1vcnlCbG9jazx1aW50OF90Pihpbml0VmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkMiLCAzKSk7CisgICAgICAgIEVYUEVDVF9FUSgzdSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBjb25zdGV4cHIgY2hhciBpbml0VmFsdWVbXSA9ICJBQkNEIjsKKyAgICAgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTdHJpbmdWYWx1ZSwgMD4gU3RyaW5nU2V0dGluZzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmluZ1NldHRpbmc+IHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgQzJDb25zdE1lbW9yeUJsb2NrPGNoYXI+KGluaXRWYWx1ZSkpOworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKDYsIGluaXRWYWx1ZSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHN0cmluZ1ZhbHVlLT5tLnZhbHVlKSwgY2hhcltdPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhcltdIik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CisgICAgICAgIEVYUEVDVF9FUSg2dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHN0cmluZ1ZhbHVlLT5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpTVFJJTkcsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSgzLCBDMkNvbnN0TWVtb3J5QmxvY2s8Y2hhcj4oaW5pdFZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQiIsIDMpKTsKKyAgICAgICAgRVhQRUNUX0VRKDN1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworCisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoMTEsICJpbml0VmFsdWUiKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgImluaXRWYWx1ZVwwIiwgMTEpKTsKKyAgICAgICAgRVhQRUNUX0VRKDExdSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKGluaXRWYWx1ZSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQkNEIiwgNSkpOworICAgICAgICBFWFBFQ1RfRVEoNXUsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSh7ICdBJywgJ0InLCAnQycsICdEJyB9KTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCQyIsIDQpKTsKKyAgICAgICAgRVhQRUNUX0VRKDR1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxMnUsIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFLCAxMDAgfTsKKyAgICAgICAgQzJQYXJhbSAqcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSk7CisgICAgICAgIEVYUEVDVF9ORShudWxscHRyLCBwMSk7CisgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAxLT5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEocDEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0ICp2c3QgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShwMSk7CisgICAgICAgIEVYUEVDVF9ORShudWxscHRyLCB2c3QpOworICAgICAgICBpZiAodnN0KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIHZzdC0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgdnN0LT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZpZGVvV2lkdGhbXSA9IHsgMTZ1LCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSwgMTAxLCAxMDIgfTsKKworICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKDE2dSwgcDEtPnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShwMS0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQgKnZwdCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKHAxKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHZwdCk7CisgICAgICAgIGlmICh2cHQpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgydSwgdnB0LT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAxLCB2cHQtPm0ubU51bWJlcnNbMF0pOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMiwgdnB0LT5tLm1OdW1iZXJzWzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKyAgICB9Cit9CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgQzJWYWx1ZVRlc3QpIHsKKyAgICBDMlZhbHVlIHZhbDsKKyAgICBpbnQzMl90IGkzMiA9IC0zMjsKKyAgICBpbnQ2NF90IGk2NCA9IC02NDsKKyAgICB1aW50MzJfdCB1MzIgPSAzMjsKKyAgICB1aW50NjRfdCB1NjQgPSA2NDsKKyAgICBmbG9hdCBmcCA9IDEuNWY7CisKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6Tk9fSU5JVCwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyLCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gaW50MzJfdCgtMzIxNik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OklOVDMyLCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gdWludDMyX3QoMzIxNik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OlVJTlQzMiwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gaW50NjRfdCgtNjQzMik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OklOVDY0LCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0dSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKKworICAgIHZhbCA9IHVpbnQ2NF90KDY0MzIpOworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpVSU5UNjQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjQzMnUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSAxNS4yNWY7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OkZMT0FULCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQzMiwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NDMydSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMTUuMjVmLCBmcCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU2ODM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU2FtcGxlQ29tcG9uZW50X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJFbnVtLmg+CisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCitjbGFzcyBDMlNhbXBsZUNvbXBvbmVudFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK3ZvaWQgUHJpbnRUbyhjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIDo6c3RkOjpvc3RyZWFtICpvcykgeworICAgIHVzaW5nIEZEPUMyRmllbGREZXNjcmlwdG9yOworICAgIHN3aXRjaCAoZmQudHlwZSgpKSB7CisgICAgY2FzZSBGRDo6SU5UMzI6ICpvcyA8PCAiaTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6SU5UNjQ6ICpvcyA8PCAiaTY0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDMyOiAqb3MgPDwgInUzMiI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlVJTlQ2NDogKm9zIDw8ICJ1NjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpGTE9BVDogKm9zIDw8ICJmbG9hdCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlNUUklORzogKm9zIDw8ICJjaGFyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6QkxPQjogKm9zIDw8ICJ1OCI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChmZC50eXBlKCkgJiBGRDo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgICpvcyA8PCAic3RydWN0LSIgPDwgKGZkLnR5cGUoKSAmIH5GRDo6U1RSVUNUX0ZMQUcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm9zIDw8ICJ0eXBlLSIgPDwgZmQudHlwZSgpOworICAgICAgICB9CisgICAgfQorICAgICpvcyA8PCAiICIgPDwgZmQubmFtZSgpOworICAgIGlmIChmZC5leHRlbnQoKSA+IDEpIHsKKyAgICAgICAgKm9zIDw8ICJbIiA8PCBmZC5leHRlbnQoKSA8PCAiXSI7CisgICAgfSBlbHNlIGlmIChmZC5leHRlbnQoKSA9PSAwKSB7CisgICAgICAgICpvcyA8PCAiW10iOworICAgIH0KKyAgICAqb3MgPDwgIiAoIiA8PCBmZC5fbUZpZWxkSWQgPDwgIioiIDw8IGZkLmV4dGVudCgpIDw8ICIpIjsKK30KKworQzJFTlVNKAorICAgIE1ldGFkYXRhVHlwZSwgaW50MzJfdCwKKyAgICBrSW52YWxpZCA9IC0xLAorICAgIGtOb25lID0gMCwKKyAgICBrR3JhbGxvYywKKyAgICBrTmF0aXZlSGFuZGxlLAorICAgIGtBTmF0aXZlV2luZG93LAorICAgIGtDYW1lcmEsCispCisKK2VudW0geworICAgIGtQYXJhbUluZGV4VmlkZW9Db25maWcgPSAweDEyMzQsCit9OworCitzdHJ1Y3QgQzJWaWRlb0NvbmZpZ1N0cnVjdCB7CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgTWV0YWRhdGFUeXBlIG1ldGFkYXRhVHlwZTsKKyAgICBpbnQzMl90IHN1cHBvcnRlZEZvcm1hdHNbXTsKKworICAgIEMyVmlkZW9Db25maWdTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFZpZGVvQ29uZmlnLCBzdXBwb3J0ZWRGb3JtYXRzKQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorICAgIEMyRklFTEQobWV0YWRhdGFUeXBlLCAibWV0YWRhdGEtdHlwZSIpCisgICAgQzJGSUVMRChzdXBwb3J0ZWRGb3JtYXRzLCAiZm9ybWF0cyIpCit9OworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlZpZGVvQ29uZmlnU3RydWN0PiBDMlZpZGVvQ29uZmlnUG9ydFR1bmluZzsKKworY2xhc3MgTXlDb21wb25lbnRJbnN0YW5jZSA6IHB1YmxpYyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLy8gXHRvZG8gdGhpcyBzZWVtcyB0b28gc3BlY2lmaWMKKyAgICAgICAgcmV0dXJuICJzYW1wbGUuaW50ZXJmYWNlIjsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9ub2RlX2lkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vLyBcdG9kbyBob3cgYXJlIHRoZXNlIHNoYXJlZD8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgKHZvaWQpZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXRhcmdldENvbXBvbmVudDsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHBhcmFtIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAgICAgaWYgKCEqcGFyYW0pIHsgLy8gcGFyYW0gaXMgYWxyZWFkeSBpbnZhbGlkIC0gcmVtZW1iZXIgaXQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm90ZTogdGhpcyBkb2VzIG5vdCBoYW5kbGUgc3RyZWFtIHBhcmFtcyAoc2hvdWxkIHVzZSBpbmRleC4uLikKKyAgICAgICAgICAgIGlmICghbU15UGFyYW1zLmNvdW50KHBhcmFtLT5pbmRleCgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QgbXkgcGFyYW0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQzJQYXJhbSAmIG15UGFyYW0gPSBtTXlQYXJhbXMuZmluZChwYXJhbS0+aW5kZXgoKSktPnNlY29uZDsKKyAgICAgICAgICAgIGlmIChteVBhcmFtLnNpemUoKSAhPSBwYXJhbS0+c2l6ZSgpKSB7IC8vIGluY29ycmVjdCBzaXplCisgICAgICAgICAgICAgICAgcGFyYW0tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyYW0tPnVwZGF0ZUZyb20obXlQYXJhbSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGluZGV4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICAgICAgaWYgKG1NeVBhcmFtcy5jb3VudChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBDMlBhcmFtICYgbXlQYXJhbSA9IG1NeVBhcmFtcy5maW5kKGluZGV4KS0+c2Vjb25kOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbUNvcHkoQzJQYXJhbTo6Q29weShteVBhcmFtKSk7CisgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShwYXJhbUNvcHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0gJj4gbU15UGFyYW1zOworCisgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIG1Eb21haW5JbmZvOworCisgICAgTXlDb21wb25lbnRJbnN0YW5jZSgpIHsKKyAgICAgICAgbU15UGFyYW1zLmluc2VydCh7bURvbWFpbkluZm8uaW5kZXgoKSwgbURvbWFpbkluZm99KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCl0YXJnZXRDb21wb25lbnQ7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGNsYXNzIE15UGFyYW1SZWZsZWN0b3IgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7CisgICAgICAgIGNvbnN0IE15Q29tcG9uZW50SW5zdGFuY2UgKmluc3RhbmNlOworCisgICAgcHVibGljOgorICAgICAgICBNeVBhcmFtUmVmbGVjdG9yKGNvbnN0IE15Q29tcG9uZW50SW5zdGFuY2UgKmkpIDogaW5zdGFuY2UoaSkgeyB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3dpdGNoIChwYXJhbUluZGV4LnR5cGVJbmRleCgpKSB7CisgICAgICAgICAgICBjYXNlIGRlY2x0eXBlKGluc3RhbmNlLT5tRG9tYWluSW5mbyk6OkNPUkVfSU5ERVg6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPihuZXcgQzJTdHJ1Y3REZXNjcmlwdG9yeworICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+bURvbWFpbkluZm8udHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShpbnN0YW5jZS0+bURvbWFpbkluZm8pOjpGaWVsZExpc3QoKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBmb3IgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgIGlmIChxdWVyeS5maWVsZCgpID09IEMyUGFyYW1GaWVsZCgmbURvbWFpbkluZm8sICZDMkNvbXBvbmVudERvbWFpblNldHRpbmc6OnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlcyA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGZsYWcgKi8sCisgICAgICAgICAgICAgICAgICAgICZtRG9tYWluSW5mby52YWx1ZQorICAgICAgICAgICAgICAgICAgICAvLywKKyAgICAgICAgICAgICAgICAgICAgLy97KGludDMyX3QpQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFT30KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX09LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfSU5ERVg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPihuZXcgTXlQYXJhbVJlZmxlY3Rvcih0aGlzKSk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIHRydWUgLyogcmVxdWlyZWQgKi8sICJfZG9tYWluIiwgJm1Eb21haW5JbmZvKSk7CisgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgbmV3IEMyUGFyYW1EZXNjcmlwdG9yKHRydWUgLyogcmVxdWlyZWQgKi8sICJfZG9tYWluIiwgJm1Eb21haW5JbmZvKSkpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+TXlDb21wb25lbnRJbnN0YW5jZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEUsIGJvb2wgUz1zdGQ6OmlzX2VudW08RT46OnZhbHVlPgorc3RydWN0IGdldHRlciB7CisgICAgaW50MzJfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBpbnQzMl90KikgeworICAgICAgICByZXR1cm4gcC5pMzI7CisgICAgfQorICAgIGludDY0X3QgZ2V0KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgaW50NjRfdCopIHsKKyAgICAgICAgcmV0dXJuIHAuaTY0OworICAgIH0KKyAgICB1aW50MzJfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCB1aW50MzJfdCopIHsKKyAgICAgICAgcmV0dXJuIHAudTMyOworICAgIH0KKyAgICB1aW50NjRfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCB1aW50NjRfdCopIHsKKyAgICAgICAgcmV0dXJuIHAudTY0OworICAgIH0KKyAgICBmbG9hdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBmbG9hdCopIHsKKyAgICAgICAgcmV0dXJuIHAuZnA7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRT4KK3N0cnVjdCBnZXR0ZXI8RSwgdHJ1ZT4geworICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZSBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBFKikgeworICAgICAgICAgdXNpbmcgdT10eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKKyAgICAgICAgIHJldHVybiBnZXR0ZXI8dT4oKS5nZXQocCwgKHUqKTApOworICAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEU9c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KK3N0cnVjdCBsYXhfdW5kZXJseWluZ190eXBlIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGxheF91bmRlcmx5aW5nX3R5cGU8VCwgZmFsc2U+IHsKKyAgICB0eXBlZGVmIFQgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEU+Cit0eXBlbmFtZSBsYXhfdW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIGdldCgKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBFKikgeworICAgIHJldHVybiBnZXR0ZXI8RT4oKS5nZXQocCwgKEUqKTApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBkdW1wRlNWKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnN2LCBUKnQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGNvdXQgPDwgKHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUgPyAoc3RkOjppc19zaWduZWQ8dHlwZW5hbWUgbGF4X3VuZGVybHlpbmdfdHlwZTxUPjo6dHlwZT46OnZhbHVlID8gImkiIDogInUiKQorICAgICAgICAgICAgIDogc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgPyBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUgPyAiaSIgOiAidSIgOiAiZiIpCisgICAgICAgICA8PCAoOCAqIHNpemVvZihUKSk7CisgICAgaWYgKHN2LnR5cGUgPT0gc3YuUkFOR0UpIHsKKyAgICAgICAgY291dCA8PCAiLnJhbmdlKCIgPDwgZ2V0KHN2LnJhbmdlLm1pbiwgdCk7CisgICAgICAgIGlmIChnZXQoc3YucmFuZ2Uuc3RlcCwgdCkgIT0gc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIjoiIDw8IGdldChzdi5yYW5nZS5zdGVwLCB0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0KHN2LnJhbmdlLm51bSwgdCkgIT0gMSB8fCBnZXQoc3YucmFuZ2UuZGVub20sIHQpICE9IDEpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIjoiIDw8IGdldChzdi5yYW5nZS5udW0sIHQpIDw8ICIvIiA8PCBnZXQoc3YucmFuZ2UuZGVub20sIHQpOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgZ2V0KHN2LnJhbmdlLm1heCwgdCkgPDwgIikiOworICAgIH0KKyAgICBpZiAoc3YudmFsdWVzLnNpemUoKSkgeworICAgICAgICBjb3V0IDw8IChzdi50eXBlID09IHN2LkZMQUdTID8gIi5mbGFncygiIDogIi5saXN0KCIpOworICAgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIjsKKyAgICAgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAgOiBzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgc2VwIDw8IGdldChwLCB0KTsKKyAgICAgICAgICAgIHNlcCA9ICIsIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICIpIjsKKyAgICB9CisgICAgY291dCA8PCBlbmRsOworfQorCit2b2lkIGR1bXBUeXBlKEMyUGFyYW06OlR5cGUgdHlwZSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAodHlwZS5pc1ZlbmRvcigpID8gIlZlbmRvciIgOiAiQzIiKTsKKyAgICBpZiAodHlwZS5mb3JJbnB1dCgpKSB7CisgICAgICAgIGNvdXQgPDwgIklucHV0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUuZm9yT3V0cHV0KCkpIHsKKyAgICAgICAgY291dCA8PCAiT3V0cHV0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUuZm9yUG9ydCgpICYmICF0eXBlLmZvclN0cmVhbSgpKSB7CisgICAgICAgIGNvdXQgPDwgIlBvcnQiOworICAgIH0KKyAgICBpZiAodHlwZS5mb3JTdHJlYW0oKSkgeworICAgICAgICBjb3V0IDw8ICJTdHJlYW0iOworICAgIH0KKworICAgIGlmICh0eXBlLmlzRmxleGlibGUoKSkgeworICAgICAgICBjb3V0IDw8ICJGbGV4IjsKKyAgICB9CisKKyAgICBjb3V0IDw8IHR5cGUudHlwZUluZGV4KCk7CisKKyAgICBzd2l0Y2ggKHR5cGUua2luZCgpKSB7CisgICAgY2FzZSBDMlBhcmFtOjpJTkZPOiBjb3V0IDw8ICJJbmZvIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpTRVRUSU5HOiBjb3V0IDw8ICJTZXR0aW5nIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpUVU5JTkc6IGNvdXQgPDwgIlR1bmluZyI7IGJyZWFrOworICAgIGNhc2UgQzJQYXJhbTo6U1RSVUNUOiBjb3V0IDw8ICJTdHJ1Y3QiOyBicmVhazsKKyAgICBkZWZhdWx0OiBjb3V0IDw8ICJLaW5kIiA8PCAoaW50MzJfdCl0eXBlLmtpbmQoKTsgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGR1bXBUeXBlKEMyUGFyYW06OkNvcmVJbmRleCB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8ICh0eXBlLmlzVmVuZG9yKCkgPyAiVmVuZG9yIiA6ICJDMiIpOworICAgIGlmICh0eXBlLmlzRmxleGlibGUoKSkgeworICAgICAgICBjb3V0IDw8ICJGbGV4IjsKKyAgICB9CisKKyAgICBjb3V0IDw8IHR5cGUudHlwZUluZGV4KCkgPDwgIlN0cnVjdCI7Cit9CisKK3ZvaWQgZHVtcFR5cGUoQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiBjb3V0IDw8ICJibG9iICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiBjb3V0IDw8ICJmbG9hdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogY291dCA8PCAiaW50MzJfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogY291dCA8PCAiaW50NjRfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGNvdXQgPDwgInVpbnQzMl90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogY291dCA8PCAidWludDY0X3QgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiBjb3V0IDw8ICJjaGFyICI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGNvdXQgPDwgInN0cnVjdCAiOworICAgICAgICBkdW1wVHlwZSgoQzJQYXJhbTo6VHlwZSl0eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGR1bXBTdHJ1Y3QoY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzZCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgZHVtcFR5cGUoc2QuY29yZUluZGV4KCkpOworICAgIGNvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIC8vQzJGaWVsZERlc2NyaXB0b3IgJmY7CisgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZiA6IHNkKSB7CisgICAgICAgIFByaW50VG8oZiwgJmNvdXQpOworICAgICAgICBjb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaWYgKGYubmFtZWRWYWx1ZXMoKS5zaXplKCkpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIi5uYW1lZCgiOworICAgICAgICAgICAgY29uc3QgY2hhciAqc2VwID0gIiI7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlVHlwZSAmcCA6IGYubmFtZWRWYWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIGNvdXQgPDwgc2VwIDw8IHAuZmlyc3QgPDwgIj0iOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogY291dCA8PCBnZXQocC5zZWNvbmQsIChpbnQzMl90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGludDY0X3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKHVpbnQzMl90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogY291dCA8PCBnZXQocC5zZWNvbmQsICh1aW50NjRfdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogY291dCA8PCBnZXQocC5zZWNvbmQsIChmbG9hdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBjb3V0IDw8ICI/Pz8iOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VwID0gIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY291dCA8PCAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb3V0IDw8ICJ9OyIgPDwgZW5kbDsKK30KKwordm9pZCBkdW1wRGVzYyhjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcGQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGlmIChwZC5pc1JlcXVpcmVkKCkpIHsKKyAgICAgICAgY291dCA8PCAicmVxdWlyZWQgIjsKKyAgICB9CisgICAgaWYgKHBkLmlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgIGNvdXQgPDwgInBlcnNpc3RlbnQgIjsKKyAgICB9CisgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgZHVtcFR5cGUoQzJQYXJhbTo6VHlwZShwZC5pbmRleCgpLnR5cGUoKSkpOworICAgIGNvdXQgPDwgIiAiIDw8IHBkLm5hbWUoKSA8PCAiOyIgPDwgZW5kbDsKK30KKworVEVTVF9GKEMyU2FtcGxlQ29tcG9uZW50VGVzdCwgUmVmbGVjdG9yVGVzdCkgeworICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW5JbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNeUNvbXBvbmVudEluc3RhbmNlPiBteUNvbXAobmV3IE15Q29tcG9uZW50SW5zdGFuY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gY29tcCA9IG15Q29tcDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2N7CisgICAgICAgIG15Q29tcC0+Z2V0UGFyYW1SZWZsZWN0b3IoKS0+ZGVzY3JpYmUoQzJDb21wb25lbnREb21haW5TZXR0aW5nOjpDT1JFX0lOREVYKX07CisgICAgZHVtcFN0cnVjdCgqZGVzYyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5ID0geworICAgICAgICB7IEMyUGFyYW1GaWVsZCgmZG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluU2V0dGluZzo6dmFsdWUpLAorICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVCB9LAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5TZXR0aW5nOjp2YWx1ZSksCisgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UKSwKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDdXJyZW50KEMyUGFyYW1GaWVsZCgmZG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluU2V0dGluZzo6dmFsdWUpKSwKKyAgICB9OworCisgICAgRVhQRUNUX0VRKEMyX09LLCBjb21wLT5xdWVyeVN1cHBvcnRlZFZhbHVlc192YihxdWVyeSwgQzJfRE9OVF9CTE9DSykpOworCisgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnEgOiBxdWVyeSkgeworICAgICAgICBkdW1wRlNWKHEudmFsdWVzLCAmZG9tYWluSW5mby52YWx1ZSk7CisgICAgfQorfQorCitURVNUX0YoQzJTYW1wbGVDb21wb25lbnRUZXN0LCBGaWVsZFN1cHBvcnRlZFZhbHVlc1Rlc3QpIHsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCAwPiBVaW50MzJUZXN0SW5mbzsKKyAgICBVaW50MzJUZXN0SW5mbyB0OworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IHZhbHVlczsKKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoMCwgMTAsIDEpKTsgIC8vIG1pbiwgbWF4LCBzdGVwCisgICAgdmFsdWVzLnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKDEsIDY0LCAyLCAxKSk7ICAvLyBtaW4sIG1heCwgbnVtLCBkZW4KKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoZmFsc2UsIHsxLCAyLCAzfSkpOyAgLy8gZmxhZ3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdAorICAgIHVpbnQzMl90IHZhbFtdID0gezEsIDMsIDUsIDd9OworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB2KHN0ZDo6YmVnaW4odmFsKSwgc3RkOjplbmQodmFsKSk7CisgICAgdmFsdWVzLnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGZhbHNlLCB2KSk7ICAvLyBmbGFncywgc3RkOjp2ZWN0b3IKKworICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmc3YgOiB2YWx1ZXMpIHsKKyAgICAgICAgZHVtcEZTVihzdiwgJnQudmFsdWUpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2QzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyVXRpbFRlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPF9DMk1hY3JvVXRpbHMuaD4KKyNpbmNsdWRlIDxDMkVudW0uaD4KKworLyoqIFxmaWxlCisgKiBUZXN0cyBmb3Igdm5kay91dGlsLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfQzJNYWNyb1V0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWNfYXNzZXJ0KDAgPT0gX0MyX0FSR0MoKSwgInNob3VsZCBiZSAwIik7CitzdGF0aWNfYXNzZXJ0KDEgPT0gX0MyX0FSR0MoMSksICJzaG91bGQgYmUgMSIpOworc3RhdGljX2Fzc2VydCgyID09IF9DMl9BUkdDKDEsIDIpLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoNjQgPT0gX0MyX0FSR0MoCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCisgICAgICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0KSwgInNob3VsZCBiZSA2NCIpOworCitzdGF0aWNfYXNzZXJ0KDAgPT0gX0MyX0FSR0MoLCksICJzaG91bGQgYmUgMCIpOworc3RhdGljX2Fzc2VydCgxID09IF9DMl9BUkdDKDEsKSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KDIgPT0gX0MyX0FSR0MoMSwgMiwpLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoNjQgPT0gX0MyX0FSR0MoCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCisgICAgICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCksICJzaG91bGQgYmUgNjQiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfQzJFbnVtVXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjbGFzcyBDMlV0aWxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitDMkVOVU0oRW51bTEsIHVpbnQzMl90LAorICAgIEVudW0xVmFsdWUxLAorICAgIEVudW0xVmFsdWUyLAorICAgIEVudW0xVmFsdWU0ID0gRW51bTFWYWx1ZTIgKyAyLAorKTsKKworQzJFTlVNX0NVU1RPTV9QUkVGSVgoRW51bTIsIHVpbnQzMl90LCAiRW51bSIsCisgICAgRW51bTJWYWx1ZTEsCisgICAgRW51bTJWYWx1ZTIsCisgICAgRW51bTJWYWx1ZTQgPSBFbnVtMVZhbHVlMiArIDIsCispOworCitDMkVOVU1fQ1VTVE9NX05BTUVTKEVudW0zLCB1aW50OF90LAorICAgICh7IHsgInZhbHVlMSIsIEVudW0zVmFsdWUxIH0sCisgICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKKyAgICAgICB7ICJ2YWx1ZTQiLCBFbnVtM1ZhbHVlNCB9LAorICAgICAgIHsgImludmFsaWQiLCBJbnZhbGlkIH0gfSksCisgICAgRW51bTNWYWx1ZTEsCisgICAgRW51bTNWYWx1ZTIsCisgICAgRW51bTNWYWx1ZTQgPSBFbnVtM1ZhbHVlMiArIDIsCisgICAgSW52YWxpZCwKKyk7CisKK1RFU1RfRihDMlV0aWxUZXN0LCBFbnVtVXRpbHNUZXN0KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nLCBFbnVtMz4+IHBhaXJzICggeyB7ICJ2YWx1ZTEiLCBFbnVtM1ZhbHVlMSB9LAorICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKKyAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCisgICAgICB7ICJpbnZhbGlkIiwgSW52YWxpZCB9IH0pOworICAgIEVudW0zIGUzOworICAgIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcihlMyk7CisKKyAgICAvLyB1cHBlciBjYXNlCisgICAgRVhQRUNUX0VRKCJ5ZXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVMiKSk7CisgICAgRVhQRUNUX0VRKCJubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk5PIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWUVTX05PIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWUVTX19OTyIpKTsKKyAgICBFWFBFQ1RfRVEoImEyZHAiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJBMkRQIikpOworICAgIEVYUEVDVF9FUSgibXAyLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVAyX1RTIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCTE9DS18yRCIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QRUdfMl9UUyIpKTsKKyAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSElEREVOX1ZBTFVFIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUyIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19ISURERU5fVkFMVUUyIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUtMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSElEREVOX1ZBTFVFXzIiKSk7CisKKyAgICAvLyBjYW1lbCBjYXNlCisgICAgRVhQRUNUX0VRKCJ5ZXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXMiKSk7CisgICAgRVhQRUNUX0VRKCJubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk5vIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWWVzTm8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXNfTm8iKSk7CisgICAgRVhQRUNUX0VRKCJtcDItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJUcyIpKTsKKyAgICBFWFBFQ1RfRVEoImJsb2NrLTJkIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQmxvY2syRCIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1wZWcydHMiKSk7CisgICAgRVhQRUNUX0VRKCJfaGlkZGVuLXZhbHVlIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX0hpZGRlblZhbHVlIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUtMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSGlkZGVuVmFsdWUyIikpOworCisgICAgLy8gbWl4ZWQgY2FzZQorICAgIEVYUEVDVF9FUSgibXAydC1zIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVAyVF9zIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCbG9ja18yRCIpKTsKKyAgICBFWFBFQ1RfRVEoImJsb2NrLTItZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJsb2NrMl9EIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTXBlZ18ydHMiKSk7CisgICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNcGVnXzJfVFMiKSk7CisgICAgRVhQRUNUX0VRKCJfaGlkZGVuLXZhbHVlIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX0hpZGRlbl9fVkFMVUUiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19IaWRkZW5WYWx1ZV8yIikpOworICAgIEVYUEVDVF9FUSgiXzIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfMiIpKTsKKyAgICBFWFBFQ1RfRVEoIl9fMjMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfXzIzIikpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkYTlmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMl90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyLmg+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFUSUMgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3RlbXBsYXRlPGludCBOPgorc3RydWN0IGMyX2NvbnN0X2NoZWNrZXIKK3sKKyAgICBpbmxpbmUgY29uc3RleHByIHN0YXRpYyBpbnQgbnVtKCkgeyByZXR1cm4gTjsgfQorfTsKKworY29uc3RleHByIGF1dG8gbWluX2kzMl9pMzIgPSBjMl9taW4oaW50MzJfdCgxKSwgaW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5faTMyX2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtaW5faTMyX2k2NCA9IGMyX21pbihpbnQzMl90KDMpLCBpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pMzJfaTY0KSwgY29uc3QgaW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1pbl9pOF9pMzIgPSBjMl9taW4oaW50OF90KDB4ZmYpLCBpbnQzMl90KDB4ZmZmZmZmZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pOF9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX2kzMl9pMzI+OjpudW0oKSA9PSAxLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5faTMyX2k2ND46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl9pOF9pMzI+OjpudW0oKSA9PSAweGZmZmZmZmZmLCAic2hvdWxkIGJlIDB4ZmZmZmZmZmYiKTsKKworY29uc3RleHByIGF1dG8gbWluX3UzMl91MzIgPSBjMl9taW4odWludDMyX3QoMSksIHVpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTMyKSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWluX3UzMl91NjQgPSBjMl9taW4odWludDMyX3QoMyksIHVpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTY0KSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWluX3UzMl91OCA9IGMyX21pbih1aW50MzJfdCgweGZmZmZmZmZmKSwgdWludDhfdCgweGZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5fdTMyX3U4KSwgY29uc3QgdWludDhfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ4X3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl91MzJfdTMyPjo6bnVtKCkgPT0gMSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX3UzMl91NjQ+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5fdTMyX3U4Pjo6bnVtKCkgPT0gMHhmZiwgInNob3VsZCBiZSAweGZmIik7CisKK2NvbnN0ZXhwciBhdXRvIG1heF9pMzJfaTMyID0gYzJfbWF4KGludDMyX3QoMSksIGludDMyX3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X2kzMl9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWF4X2kzMl9pNjQgPSBjMl9tYXgoaW50MzJfdCgzKSwgaW50NjRfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaTMyX2k2NCksIGNvbnN0IGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7Citjb25zdGV4cHIgYXV0byBtYXhfaThfaTMyID0gYzJfbWF4KGludDhfdCgweGZmKSwgaW50MzJfdCgweGZmZmZmZmZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaThfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF9pMzJfaTMyPjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X2kzMl9pNjQ+OjpudW0oKSA9PSAzLCAic2hvdWxkIGJlIDMiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfaThfaTMyPjo6bnVtKCkgPT0gMHhmZmZmZmZmZiwgInNob3VsZCBiZSAweGZmZmZmZmZmIik7CisKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTMyID0gYzJfbWF4KHVpbnQzMl90KDEpLCB1aW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3UzMiksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTY0ID0gYzJfbWF4KHVpbnQzMl90KDMpLCB1aW50NjRfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3U2NCksIGNvbnN0IHVpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTggPSBjMl9tYXgodWludDMyX3QoMHg3ZmZmZmZmZiksIHVpbnQ4X3QoMHhmZikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X3UzMl91OCksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF91MzJfdTMyPjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X3UzMl91NjQ+OjpudW0oKSA9PSAzLCAic2hvdWxkIGJlIDMiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfdTMyX3U4Pjo6bnVtKCkgPT0gMHg3ZmZmZmZmZiwgInNob3VsZCBiZSAweDdmZmZmZmZmIik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDT1VOVEVSIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIGMyX2NudHJfc3RhdGljX3Rlc3QoKSB7CisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3IgY29uc3RydWN0aW9uL2Fzc2lnbm1lbnQKKyAgICBjb25zdGV4cHIgYzJfY250cjMyX3QgYzMyX2EoMTIzKTsKKyAgICBjb25zdGV4cHIgYzJfY250cjY0X3QgYzY0X2EoLTQ1Nik7CisgICAgYzJfY250cjMyX3QgYzMyX2IgX191bnVzZWQgPSBjNjRfYTsKKyAgICAvLyBjMzJfYiA9IDY0LjsgLy8gRElTQUxMT1dFRAorICAgIC8vIGMyX2NudHI2NF90IGM2NF9iID0gYzMyX2E7IC8vIERJU0FMTE9XRUQKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIHNvbWUgY29uc3RleHByIG9wZXJhdG9ycworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICsgYzY0X2EpLCBkZWNsdHlwZShjNjRfYSArIGMzMl9hKT46OnZhbHVlLCAiKyBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKyBjNjRfYSA9PSBjMl9jbnRyMzJfdCgtMzMzKSwgIjEyMyArIC00NTYgPSAtMzMzIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSArIGMzMl9hID09IGMyX2NudHIzMl90KDI0NiksICIxMjMgKyAxMjMgPSAyNDYiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hICsgYzMyX2EgPT0gYzJfY250cjMyX3QoLTMzMyksICItNDU2ICsgMTIzID0gNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgKyAxKSwgZGVjbHR5cGUoMSArIGMzMl9hKT46OnZhbHVlLCAiKyBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKyA0NTYgPT0gYzJfY250cjMyX3QoNTc5KSwgIjEyMyArIDQ1NiA9IDU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2ICsgYzY0X2EgPT0gYzJfY250cjY0X3QoMCksICI0NTYgKyAtNDU2ID0gMCIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hIC0gYzY0X2EpLCBkZWNsdHlwZShjNjRfYSAtIGMzMl9hKT46OnZhbHVlLCAiLSBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSBjNjRfYSA9PSBjMl9jbnRyMzJfdCg1NzkpLCAiMTIzIC0gLTQ1NiA9IDU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSBjMzJfYSA9PSBjMl9jbnRyMzJfdCgwKSwgIjEyMyAtIDEyMyA9IDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hIC0gYzMyX2EgPT0gYzJfY250cjMyX3QoLTU3OSksICItNDU2IC0gMTIzID0gLTU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hIC0gMSksIGRlY2x0eXBlKDEgLSBjMzJfYSk+Ojp2YWx1ZSwgIi0gc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hIC0gNDU2ID09IGMyX2NudHIzMl90KC0zMzMpLCAiMTIzIC0gNDU2ID0gLTMzMyIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2IC0gYzY0X2EgPT0gYzJfY250cjY0X3QoOTEyKSwgIjQ1NiAtIC00NTYgPSA5MTIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSAqIGM2NF9hKSwgZGVjbHR5cGUoYzY0X2EgKiBjMzJfYSk+Ojp2YWx1ZSwgIiogc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogYzY0X2EgPT0gYzJfY250cjMyX3QoLTU2MDg4KSwgIjEyMyAqIC00NTYgPSAtNTYwODgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogYzMyX2EgPT0gYzJfY250cjMyX3QoMTUxMjkpLCAiMTIzICogMTIzID0gMTUxMjkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hICogYzMyX2EgPT0gYzJfY250cjMyX3QoLTU2MDg4KSwgIi00NTYgKiAxMjMgPSAtNTYwODgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSAqIDEpLCBkZWNsdHlwZSgxICogYzMyX2EpPjo6dmFsdWUsICIqIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAqIDQ1NiA9PSBjMl9jbnRyMzJfdCg1NjA4OCksICIxMjMgKiA0NTYgPSA1NjA4OCIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2ICogYzY0X2EgPT0gYzJfY250cjY0X3QoLTIwNzkzNiksICI0NTYgKiAtNDU2ID0gLTIwNzkzNiIpOworCisgICAgc3RhdGljX2Fzc2VydCgoYzMyX2EgPDwgMjZ1KSA9PSBjMl9jbnRyMzJfdCgweEVDMDAwMDAwKSwgIjEyMyA8PCAyNiA9IDB4RUMwMDAwMDAiKTsKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIHVuYXJ5IG9wZXJhdG9ycworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gK2MyX2NudHIzMl90KDEpLCAiMSA9PSArMSIpOworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gLWMyX2NudHIzMl90KC0xKSwgIjEgPT0gLS0xIik7CisKKyAgICAvLyBzYW5pdHkgY2hlY2tzIGZvciBjb21wYXJpc29uCisgICAgdXNpbmcgYzhfdCA9IGMyX2NudHJfdDx1aW50OF90PjsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID4gYzhfdCgweDdmKSwgIjgwID4gN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID49IGM4X3QoMHg3ZiksICI4MCA+PSA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA+IGM4X3QoMHg3ZSksICI3RiA+IDdFIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2YpID49IGM4X3QoMHg3ZSksICI3RiA+PSA3RSIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA+IGM4X3QoMCkpLCAiODAgIT4gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPj0gYzhfdCgwKSksICI4MCAhPj0gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPiBjOF90KC0weDgwKSksICI4MCAhPiA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPj0gYzhfdCgtMHg4MCksICI4MCA+PSA4MCIpOworCisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSA9PSBjOF90KDB4ODApLCAiODAgPT0gODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPT0gYzhfdCgwKSksICI4MCAhPSAwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSAhPSBjOF90KDB4N2YpLCAiODAgIT0gN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgweDdmKSAhPSBjOF90KDB4N2YpKSwgIjgwICE9IDdGIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPCBjOF90KC0weDgwKSwgIjdGIDwgODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPD0gYzhfdCgtMHg4MCksICI3RiA8IDgwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2UpIDwgYzhfdCgweDdmKSwgIjdFIDwgN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZSkgPD0gYzhfdCgweDdmKSwgIjdFIDwgN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg0MCkgPCBjOF90KDB4NDApKSwgIi00MCAhPCA0MCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDQwKSA8PSBjOF90KDB4NDApKSwgIi00MCAhPD0gNDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg0MCkgPCBjOF90KC0weDQwKSksICItNDAgITwgLTQwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDQwKSA8PSBjOF90KC0weDQwKSwgIi00MCA8PSAtNDAiKTsKKworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoLTB4N2ZmZmZmZmYgLSAxKSA+IGMyX2NudHIzMl90KDB4N2ZmZmZmZmYpLCAiODAgPiA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoIShjMl9jbnRyMzJfdCgtMHg3ZmZmZmZmZiAtIDEpID4gYzJfY250cjMyX3QoMCkpLCAiODAgIT4gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMyX2NudHIzMl90KDEpID09IGMyX2NudHIzMl90KGMyX2NudHI2NF90KDB4MTAwMDAwMDAxdWwpKSwgIjEgPT0gMSIpOworfQorCitjbGFzcyBDMlRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihDMlRlc3QsIENvdW50ZXJUZXN0KSB7CisgICAgYzJfY250cjMyX3QgYzMyX2EoMTIzKTsKKyAgICBjMl9jbnRyNjRfdCBjNjRfYSgtNDU2KTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgKz0gMywgYzJfY250cjMyX3QoMTI2KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hICs9IGM2NF9hLCBjMl9jbnRyMzJfdCgtMzMwKSk7CisgICAgRVhQRUNUX0VRKGMzMl9hIDw8PSAydSwgYzJfY250cjMyX3QoLTEzMjApKTsKKyAgICBFWFBFQ1RfRVEoYzY0X2EgKj0gMywgYzJfY250cjY0X3QoLTEzNjgpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgLT0gYzY0X2EsIGMyX2NudHIzMl90KDQ4KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hIC09IDQwLCBjMl9jbnRyMzJfdCg4KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hICo9IGMzMl9hLCBjMl9jbnRyMzJfdCg2NCkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA5OTRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcApAQCAtMCwwICsxLDc2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJCdWZmZXJVdGlsc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNTZWdtZW50VGVzdCgpIHsKKyAgICAgICAgLy8gY29uc3RydWN0b3IKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkub2Zmc2V0ID09IDEyMywgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5zaXplID09IDQ1NiwgIiIpOworCisgICAgICAgIC8vIGVtcHR5CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pc0VtcHR5KCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpLmlzRW1wdHkoKSwgIiIpOworCisgICAgICAgIC8vIHZhbGlkCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmlzVmFsaWQoKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuaXNWYWxpZCgpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmlzVmFsaWQoKSwgIiIpOworCisgICAgICAgIC8vIGJvb2woKQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KChib29sKUMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghYm9vbChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghYm9vbChDMlNlZ21lbnQoMTIzdSwgMCkpLCAiIik7CisKKyAgICAgICAgLy8gIQorICAgICAgICBzdGF0aWNfYXNzZXJ0KCEhQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoISFDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAwKSwgIiIpOworCisgICAgICAgIC8vIGNvbnRhaW5zCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMCkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAwKSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjJ1LCAydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyNHUsIDJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDN1KS5jb250YWlucyhDMlNlZ21lbnQoMTI1dSwgMnUpKSwgIiIpOworCisgICAgICAgIC8vID09CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU1dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyMnUsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjR1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgPT0gQzJTZWdtZW50KDEyNHUsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSA9PSBDMlNlZ21lbnQoMTI0dSwgMSArIH4xMjR1KSwgIiIpOworCisgICAgICAgIC8vICE9CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyM3UsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjJ1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTI0dSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpICE9IEMyU2VnbWVudCgxMjR1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgIT0gQzJTZWdtZW50KDEyM3UsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpICE9IEMyU2VnbWVudCgxMjR1LCAxICsgfjEyNHUpKSwgIiIpOworCisgICAgICAgIC8vIDw9CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPD0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDQ1N3UpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTI0dSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDB1KSA8PSBDMlNlZ21lbnQoMTIzdSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgPD0gQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAwdSkgPD0gQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSA8PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDw9IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKworICAgICAgICAvLyA8CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDwgQzJTZWdtZW50KDEyM3UsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDwgQzJTZWdtZW50KDEyMnUsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPCBDMlNlZ21lbnQoMTI0dSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMHUpIDwgQzJTZWdtZW50KDEyM3UsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpIDwgQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAwdSkgPCBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpIDwgQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIDw9CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID49IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgNDU3dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID49IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjR1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPj0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSA+PSBDMlNlZ21lbnQoMTIydSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPj0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPj0gQzJTZWdtZW50KDEyMnUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPj0gQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPj0gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKworICAgICAgICAvLyA8CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1N3UpID4gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDQ1N3UpID4gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTI0dSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgMHUpID4gQzJTZWdtZW50KDEyMnUsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgMXUpID4gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPiBDMlNlZ21lbnQoMTIydSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpID4gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIGVuZAorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5lbmQoKSA9PSA1Nzl1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KS5lbmQoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5lbmQoKSA9PSAweGZmZmZmZmZmdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmVuZCgpID09IDB1LCAiIik7CisKKyAgICAgICAgLy8gaW50ZXJzZWN0CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDU2dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyM3UsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjR1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDEyNHUsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoNTc5dSwgNDYwdSkpID09IEMyU2VnbWVudCg1Nzl1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCg1ODl1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDU4OXUsIH45dSAvKiAtMTAgKi8pLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDU1dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTV1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyMnUsIDQ1NnUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMTIzdSkpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMHUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyMnUgLyogLTEyMyAqLyksICIiKTsKKworICAgICAgICAvLyBub3JtYWxpemUgKGNoYW5nZSBpbnZhbGlkIHNlZ21lbnRzIHRvIGVtcHR5IHNlZ21lbnRzKQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisKKyAgICAgICAgLy8gbm90ZTogbm9ybWFsaXplIGNhbm5vdCBiZSB1c2VkIHRvIG1ha2UgdGhpcyB3b3JrCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTUwdSwgfjE1MHUpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpKS5ub3JtYWxpemUoKSAhPSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgMHUpLCAiIik7CisKKyAgICAgICAgLy8gc2F0dXJhdGUgKGNoYW5nZSBpbnZhbGlkIHNlZ21lbnRzIHRvIGZ1bGwgc2VnbWVudHMgdXAgdG8gbWF4KQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5zYXR1cmF0ZSgpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuc2F0dXJhdGUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuc2F0dXJhdGUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisKKyAgICAgICAgLy8gbm90ZTogc2F0dXJhdGUgY2FuIGJlIHVzZWQgdG8gbWFrZSB0aGlzIHdvcmsgYnV0IG9ubHkgcGFydGlhbGx5CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTUwdSwgMSArIH4xNTB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMTAwdSkuc2F0dXJhdGUoKSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEwMDB1LCAxMDB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSAhPSBDMlNlZ21lbnQoNTc5dSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTAwMHUsIDEwMHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMDAwdSwgMHUpLCAiIik7CisKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNMaW5lYXJSYW5nZUFuZENhcGFjaXR5VGVzdCgpIHsKKyAgICAgICAgY2xhc3MgVGVzdENhcGFjaXR5IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKKyAgICAgICAgICAgIHVzaW5nIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0OjpfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdDsKKyAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBDMkJ1ZmZlclV0aWxzVGVzdDsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBUZXN0UmFuZ2UgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworICAgICAgICAgICAgdXNpbmcgX0MyTGluZWFyUmFuZ2VBc3BlY3Q6Ol9DMkxpbmVhclJhbmdlQXNwZWN0OworICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEMyQnVmZmVyVXRpbHNUZXN0OworICAgICAgICB9OworCisgICAgICAgIC8vIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdENhcGFjaXR5KDB1KS5jYXBhY2l0eSgpID09IDB1LCAiIik7CisgICAgICAgIGNvbnN0ZXhwciBUZXN0Q2FwYWNpdHkgY2FwKDEyM3UpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RDYXBhY2l0eSgmY2FwKS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0Q2FwYWNpdHkobnVsbHB0cikuY2FwYWNpdHkoKSA9PSAwdSwgIiIpOworCisgICAgICAgIC8vIF9DMkxpbmVhckNhcGFjaXR5UmFuZ2UKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkuY2FwYWNpdHkoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLm9mZnNldCgpID09IDB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLnNpemUoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLmVuZE9mZnNldCgpID09IDEyM3UsICIiKTsKKworICAgICAgICBjb25zdGV4cHIgVGVzdFJhbmdlIHJhbmdlKCZjYXAsIDUwdSwgMTAwdSk7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5vZmZzZXQoKSA9PSA1MHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5zaXplKCkgPT0gNzN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQocmFuZ2UuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjB1LCAzMHUpLm9mZnNldCgpID09IDIwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkuc2l6ZSgpID09IDMwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkuZW5kT2Zmc2V0KCkgPT0gNTB1LCAiIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5vZmZzZXQoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwMHUsIDMwdSkuc2l6ZSgpID09IDB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwMHUsIDMwdSkuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgfQorCit9OworCisKK2NsYXNzIEMyQnVmZmVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIEMyQnVmZmVyVGVzdCgpCisgICAgICAgIDogbUJsb2NrUG9vbElkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCksCisgICAgICAgICAgbUxpbmVhckFsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9ySW9uPignaScpKSwKKyAgICAgICAgICBtU2l6ZSgwdSksCisgICAgICAgICAgbUFkZHIobnVsbHB0ciksCisgICAgICAgICAgbUdyYXBoaWNBbGxvY2F0b3Ioc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvckdyYWxsb2M+KCdnJykpIHsKKyAgICB9CisKKyAgICB+QzJCdWZmZXJUZXN0KCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBhbGxvY2F0ZUxpbmVhcihzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUxpbmVhckFsbG9jYXRvci0+bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRpb24pOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtTGluZWFyQWxsb2NhdGlvbi5yZXNldCgpOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkFsbG9jYXRvcjo6bmV3TGluZWFyQWxsb2NhdGlvbigpIGZhaWxlZDogIiA8PCBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG1hcExpbmVhcihzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDhfdCAqKmFkZHIpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobUxpbmVhckFsbG9jYXRpb24pOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtTGluZWFyQWxsb2NhdGlvbi0+bWFwKAorICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAmbUFkZHIpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtQWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyTGluZWFyQWxsb2NhdGlvbjo6bWFwKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgbUFkZHIpOworICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgICphZGRyID0gKHVpbnQ4X3QgKiltQWRkcjsKKyAgICB9CisKKyAgICB2b2lkIHVubWFwTGluZWFyKCkgeworICAgICAgICBBU1NFUlRfVFJVRShtTGluZWFyQWxsb2NhdGlvbik7CisgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCBtQWRkcik7CisgICAgICAgIEFTU0VSVF9ORSgwdSwgbVNpemUpOworCisgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbUxpbmVhckFsbG9jYXRpb24tPnVubWFwKG1BZGRyLCBtU2l6ZSwgbnVsbHB0cikpOworICAgICAgICBtU2l6ZSA9IDB1OworICAgICAgICBtQWRkciA9IG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtYWtlTGluZWFyQmxvY2tQb29sKCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwgbUJsb2NrUG9vbElkKyspOworICAgIH0KKworICAgIHZvaWQgYWxsb2NhdGVHcmFwaGljKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUdyYXBoaWNBbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgJm1HcmFwaGljQWxsb2NhdGlvbik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1HcmFwaGljQWxsb2NhdGlvbi5yZXNldCgpOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkFsbG9jYXRvcjo6bmV3R3JhcGhpY0FsbG9jYXRpb24oKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBtYXBHcmFwaGljKEMyUmVjdCByZWN0LCBDMlBsYW5hckxheW91dCAqbGF5b3V0LCB1aW50OF90ICoqYWRkcikgeworICAgICAgICBBU1NFUlRfVFJVRShtR3JhcGhpY0FsbG9jYXRpb24pOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtR3JhcGhpY0FsbG9jYXRpb24tPm1hcCgKKyAgICAgICAgICAgICAgICByZWN0LAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgICAgICAgICAgICAgYWRkcik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0gbnVsbHB0cjsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiQzJHcmFwaGljQWxsb2NhdGlvbjo6bWFwKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgICAgICBtTWFwcGVkUmVjdCA9IHJlY3Q7CisgICAgICAgIG1lbWNweShtQWRkckdyYXBoaWMsIGFkZHIsIHNpemVvZih1aW50OF90KikgKiBDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVMpOworICAgIH0KKworICAgIHZvaWQgdW5tYXBHcmFwaGljKCkgeworICAgICAgICBBU1NFUlRfVFJVRShtR3JhcGhpY0FsbG9jYXRpb24pOworCisgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbUdyYXBoaWNBbGxvY2F0aW9uLT51bm1hcChtQWRkckdyYXBoaWMsIG1NYXBwZWRSZWN0LCBudWxscHRyKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtYWtlR3JhcGhpY0Jsb2NrUG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w+KG1HcmFwaGljQWxsb2NhdG9yKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtTGluZWFyQWxsb2NhdGlvbjsKKyAgICBzaXplX3QgbVNpemU7CisgICAgdm9pZCAqbUFkZHI7CisgICAgQzJSZWN0IG1NYXBwZWRSZWN0OworICAgIHVpbnQ4X3QqIG1BZGRyR3JhcGhpY1tDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtR3JhcGhpY0FsbG9jYXRvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gbUdyYXBoaWNBbGxvY2F0aW9uOworfTsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgTGluZWFyQWxsb2NhdGlvblRlc3QpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1ICogMTAyNHU7CisKKyAgICBhbGxvY2F0ZUxpbmVhcihrQ2FwYWNpdHkpOworCisgICAgdWludDhfdCAqYWRkciA9IG51bGxwdHI7CisgICAgbWFwTGluZWFyKDB1LCBrQ2FwYWNpdHksICZhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtDYXBhY2l0eTsgKytpKSB7CisgICAgICAgIGFkZHJbaV0gPSBpICUgMTAwdTsKKyAgICB9CisKKyAgICB1bm1hcExpbmVhcigpOworICAgIGFkZHIgPSBudWxscHRyOworCisgICAgbWFwTGluZWFyKGtDYXBhY2l0eSAvIDMsIGtDYXBhY2l0eSAvIDMsICZhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrQ2FwYWNpdHkgLyAzOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDAsIGFkZHJbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEJsb2NrUG9vbFRlc3QpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1ICogMTAyNHU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGJsb2NrUG9vbChtYWtlTGluZWFyQmxvY2tQb29sKCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEFTU0VSVF9FUShDMl9PSywgYmxvY2tQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmYmxvY2spKTsKKyAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IHdyaXRlVmlld0hvbGRlciA9IGJsb2NrLT5tYXAoKTsKKyAgICBDMldyaXRlVmlldyB3cml0ZVZpZXcgPSB3cml0ZVZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCB3cml0ZVZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtDYXBhY2l0eSwgd3JpdGVWaWV3LmNhcGFjaXR5KCkpOworICAgIEFTU0VSVF9FUSgwdSwgd3JpdGVWaWV3Lm9mZnNldCgpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5LCB3cml0ZVZpZXcuc2l6ZSgpKTsKKworICAgIHVpbnQ4X3QgKmRhdGEgPSB3cml0ZVZpZXcuZGF0YSgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdyaXRlVmlldy5zaXplKCk7ICsraSkgeworICAgICAgICBkYXRhW2ldID0gaSAlIDEwMHU7CisgICAgfQorCisgICAgd3JpdGVWaWV3LnNldE9mZnNldChrQ2FwYWNpdHkgLyAzKTsKKyAgICBkYXRhID0gd3JpdGVWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3cml0ZVZpZXcuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBkYXRhW2ldKSA8PCAiIGF0IGkgPSAiIDw8IGkKKyAgICAgICAgICAgIDw8ICI7IGRhdGEgPSAiIDw8IHN0YXRpY19jYXN0PHZvaWQgKj4oZGF0YSk7CisgICAgfQorCisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgY29uc3RCbG9jayA9IGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIGtDYXBhY2l0eSAvIDMsIGtDYXBhY2l0eSAvIDMsIGZlbmNlKTsKKworICAgIEMyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiByZWFkVmlld0hvbGRlciA9IGNvbnN0QmxvY2subWFwKCk7CisgICAgQzJSZWFkVmlldyByZWFkVmlldyA9IHJlYWRWaWV3SG9sZGVyLmdldCgpOworICAgIEFTU0VSVF9FUShDMl9PSywgcmVhZFZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtDYXBhY2l0eSAvIDMsIHJlYWRWaWV3LmNhcGFjaXR5KCkpOworCisgICAgLy8gVE9ETzogZmVuY2UKKyAgICBjb25zdCB1aW50OF90ICpjb25zdERhdGEgPSByZWFkVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkVmlldy5jYXBhY2l0eSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBjb25zdERhdGFbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaQorICAgICAgICAgICAgICAgIDw8ICI7IGRhdGEgPSAiIDw8IHN0YXRpY19jYXN0PHZvaWQgKj4oZGF0YSkKKyAgICAgICAgICAgICAgICA8PCAiOyBjb25zdERhdGEgPSAiIDw8IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQgKj4oY29uc3REYXRhKTsKKyAgICB9CisKKyAgICByZWFkVmlldyA9IHJlYWRWaWV3LnN1YlZpZXcoMzMzdSwgMTAwdSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCByZWFkVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoMTAwdSwgcmVhZFZpZXcuY2FwYWNpdHkoKSk7CisKKyAgICBjb25zdERhdGEgPSByZWFkVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkVmlldy5jYXBhY2l0eSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsgMzMzdSArIGtDYXBhY2l0eSAvIDMpICUgMTAwdSwgY29uc3REYXRhW2ldKSA8PCAiIGF0IGkgPSAiIDw8IGk7CisgICAgfQorfQorCit2b2lkIGZpbGxQbGFuZShjb25zdCBDMlJlY3QgcmVjdCwgY29uc3QgQzJQbGFuZUluZm8gaW5mbywgdWludDhfdCAqYWRkciwgdWludDhfdCB2YWx1ZSkgeworICAgIGZvciAodWludDMyX3Qgcm93ID0gMDsgcm93IDwgcmVjdC5oZWlnaHQgLyBpbmZvLnJvd1NhbXBsaW5nOyArK3JvdykgeworICAgICAgICBpbnQzMl90IHJvd09mZnNldCA9IChyb3cgKyByZWN0LnRvcCAvIGluZm8ucm93U2FtcGxpbmcpICogaW5mby5yb3dJbmM7CisgICAgICAgIGZvciAodWludDMyX3QgY29sID0gMDsgY29sIDwgcmVjdC53aWR0aCAvIGluZm8uY29sU2FtcGxpbmc7ICsrY29sKSB7CisgICAgICAgICAgICBpbnQzMl90IGNvbE9mZnNldCA9IChjb2wgKyByZWN0LmxlZnQgLyBpbmZvLmNvbFNhbXBsaW5nKSAqIGluZm8uY29sSW5jOworICAgICAgICAgICAgYWRkcltyb3dPZmZzZXQgKyBjb2xPZmZzZXRdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgdmVyaWZ5UGxhbmUoY29uc3QgQzJSZWN0IHJlY3QsIGNvbnN0IEMyUGxhbmVJbmZvIGluZm8sIGNvbnN0IHVpbnQ4X3QgKmFkZHIsIHVpbnQ4X3QgdmFsdWUpIHsKKyAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHJlY3QuaGVpZ2h0IC8gaW5mby5yb3dTYW1wbGluZzsgKytyb3cpIHsKKyAgICAgICAgaW50MzJfdCByb3dPZmZzZXQgPSAocm93ICsgcmVjdC50b3AgLyBpbmZvLnJvd1NhbXBsaW5nKSAqIGluZm8ucm93SW5jOworICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHJlY3Qud2lkdGggLyBpbmZvLmNvbFNhbXBsaW5nOyArK2NvbCkgeworICAgICAgICAgICAgaW50MzJfdCBjb2xPZmZzZXQgPSAoY29sICsgcmVjdC5sZWZ0IC8gaW5mby5jb2xTYW1wbGluZykgKiBpbmZvLmNvbEluYzsKKyAgICAgICAgICAgIGlmIChhZGRyW3Jvd09mZnNldCArIGNvbE9mZnNldF0gIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEdyYXBoaWNBbGxvY2F0aW9uVGVzdCkgeworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGggPSAzMjA7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWlnaHQgPSAyNDA7CisKKyAgICBhbGxvY2F0ZUdyYXBoaWMoa1dpZHRoLCBrSGVpZ2h0KTsKKworICAgIHVpbnQ4X3QgKmFkZHJbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKyAgICBDMlJlY3QgcmVjdChrV2lkdGgsIGtIZWlnaHQpOworICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dDsKKyAgICBtYXBHcmFwaGljKHJlY3QsICZsYXlvdXQsIGFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworCisgICAgdWludDhfdCAqeSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIEMyUGxhbmVJbmZvIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgdWludDhfdCAqdSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIEMyUGxhbmVJbmZvIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdWludDhfdCAqdiA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIEMyUGxhbmVJbmZvIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBmaWxsUGxhbmUocmVjdCwgeUluZm8sIHksIDApOworICAgIGZpbGxQbGFuZShyZWN0LCB1SW5mbywgdSwgMCk7CisgICAgZmlsbFBsYW5lKHJlY3QsIHZJbmZvLCB2LCAwKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KTsKKworICAgIHVubWFwR3JhcGhpYygpOworCisgICAgbWFwR3JhcGhpYyhyZWN0LCAmbGF5b3V0LCBhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKworICAgIHkgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICB5SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHUgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICB1SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHYgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB2SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHlJbmZvLCB5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHVJbmZvLCB1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHZJbmZvLCB2LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHlJbmZvLCB5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHVJbmZvLCB1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHZJbmZvLCB2LCAwKSk7Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEdyYXBoaWNCbG9ja1Bvb2xUZXN0KSB7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aCA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodCA9IDI0MDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sKG1ha2VHcmFwaGljQmxvY2tQb29sKCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgsCisgICAgICAgICAgICBrSGVpZ2h0LAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmYmxvY2spKTsKKyAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gZ3JhcGhpY1ZpZXdIb2xkZXIgPSBibG9jay0+bWFwKCk7CisgICAgQzJHcmFwaGljVmlldyBncmFwaGljVmlldyA9IGdyYXBoaWNWaWV3SG9sZGVyLmdldCgpOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY1ZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtXaWR0aCwgZ3JhcGhpY1ZpZXcud2lkdGgoKSk7CisgICAgQVNTRVJUX0VRKGtIZWlnaHQsIGdyYXBoaWNWaWV3LmhlaWdodCgpKTsKKworICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhID0gZ3JhcGhpY1ZpZXcuZGF0YSgpOworICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IGdyYXBoaWNWaWV3LmxheW91dCgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKworICAgIHVpbnQ4X3QgKnkgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICBDMlBsYW5lSW5mbyB5SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHVpbnQ4X3QgKnUgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICBDMlBsYW5lSW5mbyB1SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVpbnQ4X3QgKnYgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICBDMlBsYW5lSW5mbyB2SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgZmlsbFBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IH0sIHlJbmZvLCB5LCAwKTsKKyAgICBmaWxsUGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgfSwgdUluZm8sIHUsIDApOworICAgIGZpbGxQbGFuZSh7IGtXaWR0aCwga0hlaWdodCB9LCB2SW5mbywgdiwgMCk7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB5SW5mbywgeSwgMHgxMik7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB1SW5mbywgdSwgMHgzNCk7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB2SW5mbywgdiwgMHg1Nik7CisKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIEMyQ29uc3RHcmFwaGljQmxvY2sgY29uc3RCbG9jayA9IGJsb2NrLT5zaGFyZShDMlJlY3Qoa1dpZHRoLCBrSGVpZ2h0KSwgZmVuY2UpOworICAgIGJsb2NrLnJlc2V0KCk7CisKKyAgICBDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4gY29uc3RWaWV3SG9sZGVyID0gY29uc3RCbG9jay5tYXAoKTsKKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IGNvbnN0R3JhcGhpY1ZpZXcgPSBjb25zdFZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBjb25zdEdyYXBoaWNWaWV3LmVycm9yKCkpOworICAgIEFTU0VSVF9FUShrV2lkdGgsIGNvbnN0R3JhcGhpY1ZpZXcud2lkdGgoKSk7CisgICAgQVNTRVJUX0VRKGtIZWlnaHQsIGNvbnN0R3JhcGhpY1ZpZXcuaGVpZ2h0KCkpOworCisgICAgY29uc3QgdWludDhfdCAqY29uc3QgKmNvbnN0RGF0YSA9IGNvbnN0R3JhcGhpY1ZpZXcuZGF0YSgpOworICAgIGxheW91dCA9IGdyYXBoaWNWaWV3LmxheW91dCgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb25zdERhdGEpOworCisgICAgY29uc3QgdWludDhfdCAqY3kgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgY29uc3QgdWludDhfdCAqY3UgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgY29uc3QgdWludDhfdCAqY3YgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIGN5LCAweDEyKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCBjdSwgMHgzNCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB2SW5mbywgY3YsIDB4NTYpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgeUluZm8sIGN5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHVJbmZvLCBjdSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB2SW5mbywgY3YsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgeUluZm8sIGN5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHVJbmZvLCBjdSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB2SW5mbywgY3YsIDApKTsKK30KKworY2xhc3MgQnVmZmVyRGF0YSA6IHB1YmxpYyBDMkJ1ZmZlckRhdGEgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyRGF0YShibG9ja3MpIHt9CisgICAgZXhwbGljaXQgQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyRGF0YShibG9ja3MpIHt9Cit9OworCitjbGFzcyBCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXIoYmxvY2tzKSB7fQorICAgIGV4cGxpY2l0IEJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyKGJsb2Nrcykge30KK307CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEJ1ZmZlckRhdGFUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBsaW5lYXJCbG9ja1Bvb2wobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGdyYXBoaWNCbG9ja1Bvb2wobWFrZUdyYXBoaWNCbG9ja1Bvb2woKSk7CisKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga1dpZHRoMSA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodDEgPSAyNDA7CisgICAgY29uc3RleHByIEMyUmVjdCBrQ3JvcDEoa1dpZHRoMSwga0hlaWdodDEpOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGgyID0gMTc2OworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0MiA9IDE0NDsKKyAgICBjb25zdGV4cHIgQzJSZWN0IGtDcm9wMihrV2lkdGgyLCBrSGVpZ2h0Mik7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkxID0gMTAyNHU7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkyID0gMjA0OHU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbGluZWFyQmxvY2sxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBsaW5lYXJCbG9jazI7CisgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJCbG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHkxLAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmbGluZWFyQmxvY2sxKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJCbG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHkyLAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmbGluZWFyQmxvY2syKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2sxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gZ3JhcGhpY0Jsb2NrMjsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGdyYXBoaWNCbG9ja1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAga1dpZHRoMSwKKyAgICAgICAgICAgIGtIZWlnaHQxLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmZ3JhcGhpY0Jsb2NrMSkpOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY0Jsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgyLAorICAgICAgICAgICAga0hlaWdodDIsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZncmFwaGljQmxvY2syKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJEYXRhPiBkYXRhKG5ldyBCdWZmZXJEYXRhKHsgbGluZWFyQmxvY2sxLT5zaGFyZSgwLCBrQ2FwYWNpdHkxLCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfRVEoQzJCdWZmZXJEYXRhOjpMSU5FQVIsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDF1LCBkYXRhLT5saW5lYXJCbG9ja3MoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5ncmFwaGljQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsKKyAgICAgICAgbGluZWFyQmxvY2sxLT5zaGFyZSgwLCBrQ2FwYWNpdHkxLCBDMkZlbmNlKCkpLAorICAgICAgICBsaW5lYXJCbG9jazItPnNoYXJlKDAsIGtDYXBhY2l0eTIsIEMyRmVuY2UoKSksCisgICAgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1MsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDJ1LCBkYXRhLT5saW5lYXJCbG9ja3MoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfRVEobGluZWFyQmxvY2syLT5oYW5kbGUoKSwgZGF0YS0+bGluZWFyQmxvY2tzKCkuYmFjaygpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5ncmFwaGljQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsgZ3JhcGhpY0Jsb2NrMS0+c2hhcmUoa0Nyb3AxLCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfRVEoQzJCdWZmZXJEYXRhOjpHUkFQSElDLCBkYXRhLT50eXBlKCkpOworICAgIEFTU0VSVF9FUSgxdSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX1RSVUUoZGF0YS0+bGluZWFyQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsKKyAgICAgICAgZ3JhcGhpY0Jsb2NrMS0+c2hhcmUoa0Nyb3AxLCBDMkZlbmNlKCkpLAorICAgICAgICBncmFwaGljQmxvY2syLT5zaGFyZShrQ3JvcDIsIEMyRmVuY2UoKSksCisgICAgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTLCBkYXRhLT50eXBlKCkpOworICAgIEFTU0VSVF9FUSgydSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazItPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuYmFjaygpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKTsKK30KKwordm9pZCBEZXN0cm95Q2FsbGJhY2soY29uc3QgQzJCdWZmZXIgKiAvKiBidWYgKi8sIHZvaWQgKmFyZykgeworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gKmNiID0gKHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gKilhcmc7CisgICAgKCpjYikoKTsKK30KKworZW51bSA6IHVpbnQzMl90IHsKKyAgICBrUGFyYW1JbmRleE51bWJlcjEsCisgICAga1BhcmFtSW5kZXhOdW1iZXIyLAorfTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE51bWJlcjE+IEMyTnVtYmVyMUluZm87Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyMj4gQzJOdW1iZXIySW5mbzsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgQnVmZmVyVGVzdCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYWxsb2MobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYWxsb2MtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZibG9jaykpOworCisgICAgc3RkOjphdG9taWNfYm9vbCBkZXN0cm95ZWQoZmFsc2UpOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYXJnID0gWyZkZXN0cm95ZWRdKCl7IGRlc3Ryb3llZCA9IHRydWU7IH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcihuZXcgQnVmZmVyKCB7IGJsb2NrLT5zaGFyZSgwLCBrQ2FwYWNpdHksIEMyRmVuY2UoKSkgfSkpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX0RVUExJQ0FURSwgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgRVhQRUNUX1RSVUUoZGVzdHJveWVkKTsKKworICAgIGJ1ZmZlci5yZXNldChuZXcgQnVmZmVyKCB7IGJsb2NrLT5zaGFyZSgwLCBrQ2FwYWNpdHksIEMyRmVuY2UoKSkgfSkpOworICAgIGRlc3Ryb3llZCA9IGZhbHNlOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX05PVF9GT1VORCwgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssIG51bGxwdHIpKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX05PVF9GT1VORCwgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IGluZm8xKG5ldyBDMk51bWJlcjFJbmZvKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBpbmZvMihuZXcgQzJOdW1iZXIySW5mbygyKSk7CisgICAgYnVmZmVyLnJlc2V0KG5ldyBCdWZmZXIoIHsgYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSwgQzJGZW5jZSgpKSB9KSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5pbmZvKCkuZW1wdHkoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+c2V0SW5mbyhpbmZvMSkpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoKmluZm8xLCAqYnVmZmVyLT5pbmZvKCkuZnJvbnQoKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8yKSk7CisgICAgRVhQRUNUX0VRKDJ1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzEtPnR5cGUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVtb3ZlZCk7CisgICAgRVhQRUNUX0VRKCpyZW1vdmVkLCAqaW5mbzEpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoKmluZm8yLCAqYnVmZmVyLT5pbmZvKCkuZnJvbnQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0ZBTFNFKHJlbW92ZWQpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gaW5mbzMobmV3IEMyTnVtYmVyMkluZm8oMykpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8zKSk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICByZW1vdmVkID0gYnVmZmVyLT5yZW1vdmVJbmZvKGluZm8yLT50eXBlKCkpOworICAgIEFTU0VSVF9UUlVFKHJlbW92ZWQpOworICAgIEVYUEVDVF9FUSgqaW5mbzMsICpyZW1vdmVkKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmluZm8oKS5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgTXVsdGlwbGVMaW5lYXJNYXBUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sKG1ha2VMaW5lYXJCbG9ja1Bvb2woKSk7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkgPSA1MjQyODh1OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJXcml0ZVZpZXc+IHdWaWV3czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJSZWFkVmlldz4gclZpZXdzOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywgcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICB3Vmlld3MucHVzaF9iYWNrKGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgICAgICAgICBDMkNvbnN0TGluZWFyQmxvY2sgY0Jsb2NrID0gYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSAvIDIsIEMyRmVuY2UoKSk7CisgICAgICAgICAgICByVmlld3MucHVzaF9iYWNrKGNCbG9jay5tYXAoKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNmExMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTA1IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfaW50ZXJuYWwiLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIHRoaXMgbW9kdWxlIGlzIG1vdmVkIGJhY2sgdG8gZnJhbWV3b3Jrcy9hdi4KKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorfQorCisvLyAhISFETyBOT1QgREVQRU5EIE9OIFRISVMgU0hBUkVEIExJQlJBUlkgRElSRUNUTFkhISEKKy8vIHVzZSBsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl92bmRrIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAorCisgICAgc3JjczogWworICAgICAgICAiQzJBbGxvY2F0b3JJb24uY3BwIiwKKyAgICAgICAgIkMyQWxsb2NhdG9yR3JhbGxvYy5jcHAiLAorICAgICAgICAiQzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkMyQ29uZmlnLmNwcCIsCisgICAgICAgICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIiwKKyAgICAgICAgIkMyU3RvcmUuY3BwIiwKKyAgICAgICAgInBsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIiwKKyAgICAgICAgInV0aWwvQzJEZWJ1Zy5jcHAiLAorICAgICAgICAidXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAiLAorICAgICAgICAidXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcCIsCisgICAgICAgICJ1dGlsL0MyUGFyYW1VdGlscy5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbnRlcm5hbCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgaW1wbGVtZW50aW5nIENvZGVjIDIgY29tcG9uZW50cworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyIsCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsIC8vIGZvciBDMl9MT0cKKyAgICAgICAgImxpYmxvZyIsIC8vIGZvciBBTE9HCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBpbXBsZW1lbnRpbmcgQ29kZWMgMiBmcmFtZXdvcmsgdXRpbGl0aWVzCisvLyBUSElTIElTIE9OTFkgRk9SIEZSQU1FV09SSyBVU0UgT05MWQorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaW50ZXJuYWwtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwgLy8gZm9yIHByb3BlcnRpZXMKKyAgICBdLAorCisgICAgLy8gVE9ETzogc2VwYXJhdGUgaW50ZXJuYWwgaGVhZGVycyBzbyB0aGV5IGNhbiBiZSBleHBvc2VkIGhlcmUKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5OGJmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKQEAgLTAsMCArMSw4NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQWxsb2NhdG9yR3JhbGxvYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYWxsb2NhdG9yLzIuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9tYXBwZXIvMi4wL0lNYXBwZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIGVudW0gOiB1aW50NjRfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2FnZSBtYXNrIHRoYXQgaXMgcGFzc2VkIHRocm91Z2ggZnJvbSBncmFsbG9jIHRvIENvZGVjIDIuMCB1c2FnZS4KKyAgICAgICAgICovCisgICAgICAgIFBBU1NUSFJPVUdIX1VTQUdFX01BU0sgPQorICAgICAgICAgICAgfihHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSyB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSyB8IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKQorICAgIH07CisKKyAgICAvLyB2ZXJpZnkgdGhhdCBwYXNzdGhyb3VnaCBtYXNrIGlzIHdpdGhpbiB0aGUgcGxhdGZvcm0gbWFzaworICAgIHN0YXRpY19hc3NlcnQoKH5DMk1lbW9yeVVzYWdlOjpQTEFURk9STV9NQVNLICYgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSykgPT0gMCwgIiIpOworfQorCitDMk1lbW9yeVVzYWdlIEMyQW5kcm9pZE1lbW9yeVVzYWdlOjpGcm9tR3JhbGxvY1VzYWdlKHVpbnQ2NF90IHVzYWdlKSB7CisgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBzdXBwb3J0IFdSSVRFX1BST1RFQ1RFRAorICAgIHJldHVybiBDMk1lbW9yeVVzYWdlKAorICAgICAgICAgICAgKCh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLKSA/IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIDogMCkgfAorICAgICAgICAgICAgKCh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSykgPyBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgOiAwKSB8CisgICAgICAgICAgICAoKHVzYWdlICYgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpID8gQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQgOiAwKSB8CisgICAgICAgICAgICAodXNhZ2UgJiBQQVNTVEhST1VHSF9VU0FHRV9NQVNLKSk7Cit9CisKK3VpbnQ2NF90IEMyQW5kcm9pZE1lbW9yeVVzYWdlOjphc0dyYWxsb2NVc2FnZSgpIGNvbnN0IHsKKyAgICAvLyBncmFsbG9jIGRvZXMgbm90IHN1cHBvcnQgV1JJVEVfUFJPVEVDVEVECisgICAgcmV0dXJuICgoKGV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpID8gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIDogMCkgfAorICAgICAgICAgICAgKChleHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkgPyBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOIDogMCkgfAorICAgICAgICAgICAgKChleHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OlJFQURfUFJPVEVDVEVEKSA/IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEIDogMCkgfAorICAgICAgICAgICAgKGV4cGVjdGVkICYgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSykpOworfQorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YWxsb2NhdG9yOjpWMl8wOjpJQWxsb2NhdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6QnVmZmVyVXNhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OkJ1ZmZlckRlc2NyaXB0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpFcnJvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OklNYXBwZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpZQ2JDckxheW91dDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBCdWZmZXJEZXNjcmlwdG9ySW5mbyB7CisgICAgSU1hcHBlcjo6QnVmZmVyRGVzY3JpcHRvckluZm8gbWFwcGVySW5mbzsKKyAgICB1aW50MzJfdCBzdHJpZGU7Cit9OworCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gR1JBTExPQyBBTExPQ0FUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGMyX3N0YXR1c190IG1hcGVycjJlcnJvcihFcnJvciBtYXBlcnIpIHsKKyAgICBzd2l0Y2ggKG1hcGVycikgeworICAgICAgICBjYXNlIEVycm9yOjpOT05FOiAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICBjYXNlIEVycm9yOjpCQURfREVTQ1JJUFRPUjogcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjo6QkFEX0JVRkZFUjogICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3I6OkJBRF9WQUxVRTogICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yOjpOT19SRVNPVVJDRVM6ICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgY2FzZSBFcnJvcjo6VU5TVVBQT1JURUQ6ICAgIHJldHVybiBDMl9DQU5OT1RfRE87CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK3N0YXRpYworYm9vbCBuYXRpdmVfaGFuZGxlX2lzX2ludmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUpIHsKKyAgICAvLyBwZXJmb3JtIGJhc2ljIHZhbGlkYXRpb24gb2YgYSBuYXRpdmUgaGFuZGxlCisgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIG51bGwgaGFuZGxlIGlzIGNvbnNpZGVyZWQgdmFsaWQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKChzaXplX3QpaGFuZGxlLT52ZXJzaW9uICE9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpIHx8CisgICAgICAgICAgICBoYW5kbGUtPm51bUZkcyA8IDAgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtSW50cyA8IDAgfHwKKyAgICAgICAgICAgIC8vIGZvciBzYW5pdHkgYXNzdW1lIGhhbmRsZXMgbXVzdCBvY2N1cHkgbGVzcyBtZW1vcnkgdGhhbiBJTlRfTUFYIGJ5dGVzCisgICAgICAgICAgICBoYW5kbGUtPm51bUZkcyA+IGludCgoSU5UX01BWCAtIGhhbmRsZS0+dmVyc2lvbikgLyBzaXplb2YoaW50KSkgLSBoYW5kbGUtPm51bUludHMpOworfQorCitjbGFzcyBDMkhhbmRsZUdyYWxsb2MgOiBwdWJsaWMgQzJIYW5kbGUgeworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgRXh0cmFEYXRhIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0OworICAgICAgICB1aW50MzJfdCB1c2FnZV9sbzsKKyAgICAgICAgdWludDMyX3QgdXNhZ2VfaGk7CisgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgdWludDMyX3QgaWdicF9pZF9sbzsKKyAgICAgICAgdWludDMyX3QgaWdicF9pZF9oaTsKKyAgICAgICAgdWludDMyX3QgaWdicF9zbG90OworICAgICAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIE5VTV9JTlRTID0gc2l6ZW9mKEV4dHJhRGF0YSkgLyBzaXplb2YoaW50KSwKKyAgICB9OworICAgIGNvbnN0IHN0YXRpYyB1aW50MzJfdCBNQUdJQyA9ICdceGMyZ3JceDAwJzsKKworICAgIHN0YXRpYworICAgIGNvbnN0IEV4dHJhRGF0YSogZ2V0RXh0cmFEYXRhKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgfHwgbmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGhhbmRsZSkKKyAgICAgICAgICAgICAgICB8fCBoYW5kbGUtPm51bUludHMgPCBOVU1fSU5UUykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXh0cmFEYXRhKj4oCisgICAgICAgICAgICAgICAgJmhhbmRsZS0+ZGF0YVtoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cyAtIE5VTV9JTlRTXSk7CisgICAgfQorCisgICAgc3RhdGljCisgICAgRXh0cmFEYXRhICpnZXRFeHRyYURhdGEoQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxFeHRyYURhdGEgKj4oZ2V0RXh0cmFEYXRhKGNvbnN0X2Nhc3Q8Y29uc3QgQzJIYW5kbGUgKmNvbnN0PihoYW5kbGUpKSk7CisgICAgfQorCitwdWJsaWM6CisgICAgdm9pZCBnZXRJZ2JwRGF0YSh1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICplZCA9IGdldEV4dHJhRGF0YSh0aGlzKTsKKyAgICAgICAgKmdlbmVyYXRpb24gPSBlZC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgKmlnYnBfaWQgPSB1bnNpZ25lZChlZC0+aWdicF9pZF9sbykgfCB1aW50NjRfdCh1bnNpZ25lZChlZC0+aWdicF9pZF9oaSkpIDw8IDMyOworICAgICAgICAqaWdicF9zbG90ID0gZWQtPmlnYnBfc2xvdDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICpjb25zdCBvKSB7CisgICAgICAgIGlmIChvID09IG51bGxwdHIpIHsgLy8gbnVsbCBoYW5kbGUgaXMgYWx3YXlzIHZhbGlkCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKG8pOworICAgICAgICAvLyB3ZSBjYW5ub3QgdmFsaWRhdGUgd2lkdGgvaGVpZ2h0L2Zvcm1hdC91c2FnZSB3aXRob3V0IGFjY2Vzc2luZyBncmFsbG9jIGRyaXZlcgorICAgICAgICByZXR1cm4geGQgIT0gbnVsbHB0ciAmJiB4ZC0+bWFnaWMgPT0gTUFHSUM7CisgICAgfQorCisgICAgc3RhdGljIEMySGFuZGxlR3JhbGxvYyogV3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsCisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQgPSAwLCB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwKSB7CisgICAgICAgIC8vQ0hFQ0soaGFuZGxlICE9IG51bGxwdHIpOworICAgICAgICBpZiAobmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGhhbmRsZSkgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtSW50cyA+IGludCgoSU5UX01BWCAtIGhhbmRsZS0+dmVyc2lvbikgLyBzaXplb2YoaW50KSkgLSBOVU1fSU5UUyAtIGhhbmRsZS0+bnVtRmRzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBFeHRyYURhdGEgeGQgPSB7CisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVpbnQzMl90KHVzYWdlICYgMHhGRkZGRkZGRiksIHVpbnQzMl90KHVzYWdlID4+IDMyKSwKKyAgICAgICAgICAgIHN0cmlkZSwgZ2VuZXJhdGlvbiwgdWludDMyX3QoaWdicF9pZCAmIDB4RkZGRkZGRkYpLCB1aW50MzJfdChpZ2JwX2lkID4+IDMyKSwKKyAgICAgICAgICAgIGlnYnBfc2xvdCwgTUFHSUMKKyAgICAgICAgfTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzICsgTlVNX0lOVFMpOworICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cykpOworICAgICAgICAgICAgKmdldEV4dHJhRGF0YShyZXMpID0geGQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIYW5kbGVHcmFsbG9jICo+KHJlcyk7CisgICAgfQorCisgICAgc3RhdGljIEMySGFuZGxlR3JhbGxvYyogV3JhcE5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCA9IDAsIHVpbnQzMl90IGlnYnBfc2xvdCA9IDApIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNsb25lID0gbmF0aXZlX2hhbmRsZV9jbG9uZShoYW5kbGUpOworICAgICAgICBpZiAoY2xvbmUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgQzJIYW5kbGVHcmFsbG9jICpyZXMgPSBXcmFwQW5kTW92ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICBjbG9uZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgc3RyaWRlLCBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworICAgICAgICBpZiAocmVzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoY2xvbmUpOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGNsb25lKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgbmF0aXZlX2hhbmRsZV90KiBVbndyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIgfHwgeGQtPm1hZ2ljICE9IE1BR0lDKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJlcyA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKGhhbmRsZS0+bnVtRmRzLCBoYW5kbGUtPm51bUludHMgLSBOVU1fSU5UUyk7CisgICAgICAgIGlmIChyZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbWVtY3B5KCZyZXMtPmRhdGEsICZoYW5kbGUtPmRhdGEsIHNpemVvZihpbnQpICogKHJlcy0+bnVtRmRzICsgcmVzLT5udW1JbnRzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgbmF0aXZlX2hhbmRsZV90KiBVbndyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIgfHwgeGQtPm1hZ2ljICE9IE1BR0lDKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAqZ2VuZXJhdGlvbiA9IHhkLT5nZW5lcmF0aW9uOworICAgICAgICAqaWdicF9pZCA9IHVuc2lnbmVkKHhkLT5pZ2JwX2lkX2xvKSB8IHVpbnQ2NF90KHVuc2lnbmVkKHhkLT5pZ2JwX2lkX2hpKSkgPDwgMzI7CisgICAgICAgICppZ2JwX3Nsb3QgPSB4ZC0+aWdicF9zbG90OworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJlcyA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKGhhbmRsZS0+bnVtRmRzLCBoYW5kbGUtPm51bUludHMgLSBOVU1fSU5UUyk7CisgICAgICAgIGlmIChyZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbWVtY3B5KCZyZXMtPmRhdGEsICZoYW5kbGUtPmRhdGEsIHNpemVvZihpbnQpICogKHJlcy0+bnVtRmRzICsgcmVzLT5udW1JbnRzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgQzJIYW5kbGVHcmFsbG9jKiBJbXBvcnQoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LAorICAgICAgICAgICAgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgICp3aWR0aCA9IHhkLT53aWR0aDsKKyAgICAgICAgKmhlaWdodCA9IHhkLT5oZWlnaHQ7CisgICAgICAgICpmb3JtYXQgPSB4ZC0+Zm9ybWF0OworICAgICAgICAqdXNhZ2UgPSB4ZC0+dXNhZ2VfbG8gfCAodWludDY0X3QoeGQtPnVzYWdlX2hpKSA8PCAzMik7CisgICAgICAgICpzdHJpZGUgPSB4ZC0+c3RyaWRlOworICAgICAgICAqZ2VuZXJhdGlvbiA9IHhkLT5nZW5lcmF0aW9uOworICAgICAgICAqaWdicF9pZCA9IHhkLT5pZ2JwX2lkX2xvIHwgKHVpbnQ2NF90KHhkLT5pZ2JwX2lkX2hpKSA8PCAzMik7CisgICAgICAgICppZ2JwX3Nsb3QgPSB4ZC0+aWdicF9zbG90OworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDMkhhbmRsZUdyYWxsb2MgKj4oaGFuZGxlKTsKKyAgICB9Cit9OworCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUpOworfQorCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUsIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK0MySGFuZGxlICpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsIHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCwgdWludDMyX3QgaWdicF9zbG90KSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6V3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK2NsYXNzIEMyQWxsb2NhdGlvbkdyYWxsb2MgOiBwdWJsaWMgQzJHcmFwaGljQWxsb2NhdGlvbiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QzJBbGxvY2F0aW9uR3JhbGxvYygpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAoCisgICAgICAgICAgICB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovLCBDMlJlY3QgcmVjdCwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQWxsb2NhdG9ySWQ7IH0KKyAgICB2aXJ0dWFsIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtTG9ja2VkSGFuZGxlID8gOiBtSGFuZGxlOyB9CisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGludGVybmFsIG1ldGhvZHMKKyAgICAvLyB8aGFuZGxlfCB3aWxsIGJlIG1vdmVkLgorICAgIEMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvICZpbmZvLAorICAgICAgICAgICAgICBjb25zdCBzcDxJTWFwcGVyPiAmbWFwcGVyLAorICAgICAgICAgICAgICBoaWRsX2hhbmRsZSAmaGlkbEhhbmRsZSwKKyAgICAgICAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkKTsKKyAgICBpbnQgZHVwKCkgY29uc3Q7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8gbUluZm87CisgICAgY29uc3Qgc3A8SU1hcHBlcj4gbU1hcHBlcjsKKyAgICBjb25zdCBoaWRsX2hhbmRsZSBtSGlkbEhhbmRsZTsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKm1IYW5kbGU7CisgICAgYnVmZmVyX2hhbmRsZV90IG1CdWZmZXI7CisgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICptTG9ja2VkSGFuZGxlOworICAgIGJvb2wgbUxvY2tlZDsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBtQWxsb2NhdG9ySWQ7CisgICAgc3RkOjptdXRleCBtTWFwcGVkTG9jazsKK307CisKK0MyQWxsb2NhdGlvbkdyYWxsb2M6OkMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8gJmluZm8sCisgICAgICAgICAgY29uc3Qgc3A8SU1hcHBlcj4gJm1hcHBlciwKKyAgICAgICAgICBoaWRsX2hhbmRsZSAmaGlkbEhhbmRsZSwKKyAgICAgICAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCkKKyAgICA6IEMyR3JhcGhpY0FsbG9jYXRpb24oaW5mby5tYXBwZXJJbmZvLndpZHRoLCBpbmZvLm1hcHBlckluZm8uaGVpZ2h0KSwKKyAgICAgIG1JbmZvKGluZm8pLAorICAgICAgbU1hcHBlcihtYXBwZXIpLAorICAgICAgbUhpZGxIYW5kbGUoc3RkOjptb3ZlKGhpZGxIYW5kbGUpKSwKKyAgICAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgIG1CdWZmZXIobnVsbHB0ciksCisgICAgICBtTG9ja2VkSGFuZGxlKG51bGxwdHIpLAorICAgICAgbUxvY2tlZChmYWxzZSksCisgICAgICBtQWxsb2NhdG9ySWQoYWxsb2NhdG9ySWQpIHsKK30KKworQzJBbGxvY2F0aW9uR3JhbGxvYzo6fkMyQWxsb2NhdGlvbkdyYWxsb2MoKSB7CisgICAgaWYgKG1CdWZmZXIgJiYgbUxvY2tlZCkgeworICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIGFkZHJlc3NzIGFuZCByZWN0CisgICAgICAgIHVpbnQ4X3QqIGFkZHJbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXSA9IHt9OworICAgICAgICB1bm1hcChhZGRyLCBDMlJlY3QoKSwgbnVsbHB0cik7CisgICAgfQorICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgIG1NYXBwZXItPmZyZWVCdWZmZXIoY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlcikpOworICAgIH0KKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihyZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqPihtSGFuZGxlKSkpOworICAgIH0KKyAgICBpZiAobUxvY2tlZEhhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90ICo+KG1Mb2NrZWRIYW5kbGUpKSk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25HcmFsbG9jOjptYXAoCisgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgKmxheW91dCAvKiBub25udWxsICovLCB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovKSB7CisgICAgdWludDY0X3QgZ3JhbGxvY1VzYWdlID0gc3RhdGljX2Nhc3Q8QzJBbmRyb2lkTWVtb3J5VXNhZ2U+KHVzYWdlKS5hc0dyYWxsb2NVc2FnZSgpOworICAgIEFMT0dWKCJtYXBwaW5nIGJ1ZmZlciB3aXRoIHVzYWdlICUjbGx4ID0+ICUjbGx4IiwKKyAgICAgICAgICAobG9uZyBsb25nKXVzYWdlLmV4cGVjdGVkLCAobG9uZyBsb25nKWdyYWxsb2NVc2FnZSk7CisKKyAgICAvLyBUT0RPCisgICAgKHZvaWQpIGZlbmNlOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcHBlZExvY2spOworICAgIGlmIChtQnVmZmVyICYmIG1Mb2NrZWQpIHsKKyAgICAgICAgQUxPR0QoImFscmVhZHkgbWFwcGVkIik7CisgICAgICAgIHJldHVybiBDMl9EVVBMSUNBVEU7CisgICAgfQorICAgIGlmICghbGF5b3V0IHx8ICFhZGRyKSB7CisgICAgICAgIEFMT0dEKCJ3cm9uZyBwYXJhbSIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICBtTWFwcGVyLT5pbXBvcnRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUhpZGxIYW5kbGUsIFsmZXJyLCB0aGlzXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IHN0YXRpY19jYXN0PGJ1ZmZlcl9oYW5kbGVfdD4oYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiaW1wb3J0QnVmZmVyIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiaW1wb3J0QnVmZmVyIHJldHVybmVkIG51bGwgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICB1aW50NjRfdCBpZ2JwX2lkID0gMDsKKyAgICAgICAgdWludDMyX3QgaWdicF9zbG90ID0gMDsKKyAgICAgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgICAgIG1IYW5kbGUtPmdldElnYnBEYXRhKCZnZW5lcmF0aW9uLCAmaWdicF9pZCwgJmlnYnBfc2xvdCk7CisgICAgICAgIH0KKyAgICAgICAgbUxvY2tlZEhhbmRsZSA9IEMySGFuZGxlR3JhbGxvYzo6V3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgbUJ1ZmZlciwgbUluZm8ubWFwcGVySW5mby53aWR0aCwgbUluZm8ubWFwcGVySW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KW1JbmZvLm1hcHBlckluZm8uZm9ybWF0LCBtSW5mby5tYXBwZXJJbmZvLnVzYWdlLCBtSW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1JbmZvLm1hcHBlckluZm8uZm9ybWF0KSB7CisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OlJHQkFfMTAxMDEwMjogeworICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIGlzIHVzZWQgZm9yIG1lZGlhIGFzIFlVVjQ0NCBpbiB0aGUgY2FzZSB3aGVuIGl0IGlzIHF1ZXVlZCBkaXJlY3RseSB0byBhCisgICAgICAgICAgICAvLyBTdXJmYWNlLiBJbiBhbGwgb3RoZXIgY2FzZXMgaXQgaXMgUkdCQS4gV2UgZG9uJ3Qga25vdyB3aGljaCBjYXNlIGl0IGlzIGhlcmUsIHNvCisgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIFlVViBmb3Igbm93LgorICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBtTWFwcGVyLT5sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmcG9pbnRlcl0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gbWFwUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRyZWF0IGFzIDMyLWJpdCB2YWx1ZXMKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0FdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQTsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gNDsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDE7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9BXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9BLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6UkdCQV84ODg4OgorICAgICAgICAgICAgLy8gVE9ETzogYWxwaGEgY2hhbm5lbAorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OlJHQlhfODg4ODogeworICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBtTWFwcGVyLT5sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmcG9pbnRlcl0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gbWFwUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfR10gPSAodWludDhfdCAqKXBvaW50ZXIgKyAxOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfQl0gPSAodWludDhfdCAqKXBvaW50ZXIgKyAyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9SLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9HLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9CLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6WUNCQ1JfNDIwXzg4ODoKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpZVjEyOgorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIFlDYkNyTGF5b3V0IHljYmNyTGF5b3V0OworICAgICAgICAgICAgbU1hcHBlci0+bG9ja1lDYkNyKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmeWNiY3JMYXlvdXRdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjckxheW91dCA9IG1hcExheW91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2tZQ2JDciBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0Lnk7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY2I7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY3I7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQueVN0cmlkZSwgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLCAgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCwgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNTdHJpZGUsICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgICAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwgICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXAsICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jU3RyaWRlLCAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICAgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyBoYW5kbGUgaW50ZXJsZWF2ZWQgZm9ybWF0cworICAgICAgICAgICAgaW50cHRyX3QgdXZPZmZzZXQgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSAtIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICAgICAgaWYgKHV2T2Zmc2V0ID4gMCAmJiB1dk9mZnNldCA8IChpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLm9mZnNldCA9IHV2T2Zmc2V0OworICAgICAgICAgICAgfSBlbHNlIGlmICh1dk9mZnNldCA8IDAgJiYgdXZPZmZzZXQgPiAtKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXApIHsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ub2Zmc2V0ID0gLXV2T2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbUxvY2tlZCA9IHRydWU7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbkdyYWxsb2M6OnVubWFwKAorICAgICAgICB1aW50OF90ICoqYWRkciwgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSB7CisgICAgLy8gVE9ETzogY2hlY2sgYWRkciBhbmQgc2l6ZSwgdXNlIGZlbmNlCisgICAgKHZvaWQpYWRkcjsKKyAgICAodm9pZClyZWN0OworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcHBlZExvY2spOworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIG1NYXBwZXItPnVubG9jaygKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgWyZlcnIsICZmZW5jZV0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZyZWxlYXNlRmVuY2UpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgKHZvaWQpIGZlbmNlOworICAgICAgICAgICAgICAgICh2b2lkKSByZWxlYXNlRmVuY2U7CisgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgbUxvY2tlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitib29sIEMyQWxsb2NhdGlvbkdyYWxsb2M6OmVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG90aGVyICYmIG90aGVyLT5oYW5kbGUoKSA9PSBoYW5kbGUoKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBHUkFMTE9DIEFMTE9DQVRPUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2NsYXNzIEMyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlKTsKKworICAgIGlkX3QgZ2V0SWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhaXRzLT5pZDsKKyAgICB9CisKKyAgICBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0cy0+bmFtZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0czsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pOworCisgICAgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXQ7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I6OlRyYWl0cz4gbVRyYWl0czsKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzcDxJQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIHNwPElNYXBwZXI+IG1NYXBwZXI7CisgICAgY29uc3QgYm9vbCBtQnVmZmVyUXVldWU7Cit9OworCit2b2lkIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCx1aW50NjRfdCAqdXNhZ2UsIHVpbnQzMl90ICpzdHJpZGUsCisgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgICh2b2lkKUMySGFuZGxlR3JhbGxvYzo6SW1wb3J0KGhhbmRsZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK0MyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbDo6SW1wbChpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlKQorICAgIDogbUluaXQoQzJfT0spLCBtQnVmZmVyUXVldWUoYnVmZmVyUXVldWUpIHsKKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGFsbG9jYXRvcgorICAgIEMyTWVtb3J5VXNhZ2UgbWluVXNhZ2UgPSB7IDAsIDAgfSwgbWF4VXNhZ2UgPSB7IH4odWludDY0X3QpMCwgfih1aW50NjRfdCkwIH07CisgICAgVHJhaXRzIHRyYWl0cyA9IHsgImFuZHJvaWQuYWxsb2NhdG9yLmdyYWxsb2MiLCBpZCwgQzJBbGxvY2F0b3I6OkdSQVBISUMsIG1pblVzYWdlLCBtYXhVc2FnZSB9OworICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yOjpUcmFpdHM+KHRyYWl0cyk7CisKKyAgICAvLyBncmFsbG9jIGFsbG9jYXRvciBpcyBhIHNpbmdsZXRvbiwgc28gYWxsIG9iamVjdHMgc2hhcmUgYSBnbG9iYWwgc2VydmljZQorICAgIG1BbGxvY2F0b3IgPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCk7CisgICAgbU1hcHBlciA9IElNYXBwZXI6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAobUFsbG9jYXRvciA9PSBudWxscHRyIHx8IG1NYXBwZXIgPT0gbnVsbHB0cikgeworICAgICAgICBtSW5pdCA9IEMyX0NPUlJVUFRFRDsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbDo6bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHVpbnQ2NF90IGdyYWxsb2NVc2FnZSA9IHN0YXRpY19jYXN0PEMyQW5kcm9pZE1lbW9yeVVzYWdlPih1c2FnZSkuYXNHcmFsbG9jVXNhZ2UoKTsKKyAgICBBTE9HVigiYWxsb2NhdGluZyBidWZmZXIgd2l0aCB1c2FnZSAlI2xseCA9PiAlI2xseCIsCisgICAgICAgICAgKGxvbmcgbG9uZyl1c2FnZS5leHBlY3RlZCwgKGxvbmcgbG9uZylncmFsbG9jVXNhZ2UpOworCisgICAgQnVmZmVyRGVzY3JpcHRvckluZm8gaW5mbyA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAxdSwgIC8vIGxheWVyQ291bnQKKyAgICAgICAgICAgIChQaXhlbEZvcm1hdClmb3JtYXQsCisgICAgICAgICAgICBncmFsbG9jVXNhZ2UsCisgICAgICAgIH0sCisgICAgICAgIDB1LCAgLy8gc3RyaWRlIHBsYWNlaG9sZGVyCisgICAgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBCdWZmZXJEZXNjcmlwdG9yIGRlc2M7CisgICAgbU1hcHBlci0+Y3JlYXRlRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGluZm8ubWFwcGVySW5mbywgWyZlcnIsICZkZXNjXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJmRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvLyBJQWxsb2NhdG9yIHNoYXJlcyBJTWFwcGVyIGVycm9yIGNvZGVzLgorICAgIGhpZGxfaGFuZGxlIGJ1ZmZlcjsKKyAgICBtQWxsb2NhdG9yLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAxdSwKKyAgICAgICAgICAgIFsmZXJyLCAmYnVmZmVyLCAmaW5mb10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZzdHJpZGUsIGF1dG8gJmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcnMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXJzWzBdOworICAgICAgICAgICAgfSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworCisgICAgYWxsb2NhdGlvbi0+cmVzZXQobmV3IEMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgICBpbmZvLCBtTWFwcGVyLCBidWZmZXIsCisgICAgICAgICAgICBDMkhhbmRsZUdyYWxsb2M6OldyYXBBbmRNb3ZlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIGluZm8ubWFwcGVySW5mby53aWR0aCwgaW5mby5tYXBwZXJJbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWluZm8ubWFwcGVySW5mby5mb3JtYXQsIGluZm8ubWFwcGVySW5mby51c2FnZSwgaW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIDAsIDAsIG1CdWZmZXJRdWV1ZSA/IH4wIDogMCksCisgICAgICAgICAgICBtVHJhaXRzLT5pZCkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICBCdWZmZXJEZXNjcmlwdG9ySW5mbyBpbmZvOworICAgIGluZm8ubWFwcGVySW5mby5sYXllckNvdW50ID0gMXU7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBpZ2JwX2lkOworICAgIHVpbnQzMl90IGlnYnBfc2xvdDsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKmdyYWxsb2NIYW5kbGUgPSBDMkhhbmRsZUdyYWxsb2M6OkltcG9ydCgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICZpbmZvLm1hcHBlckluZm8ud2lkdGgsICZpbmZvLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgKHVpbnQzMl90ICopJmluZm8ubWFwcGVySW5mby5mb3JtYXQsICh1aW50NjRfdCAqKSZpbmZvLm1hcHBlckluZm8udXNhZ2UsICZpbmZvLnN0cmlkZSwKKyAgICAgICAgICAgICZnZW5lcmF0aW9uLCAmaWdicF9pZCwgJmlnYnBfc2xvdCk7CisgICAgaWYgKGdyYWxsb2NIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGhpZGxfaGFuZGxlIGhpZGxIYW5kbGU7CisgICAgaGlkbEhhbmRsZS5zZXRUbyhDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShncmFsbG9jSGFuZGxlKSwgdHJ1ZSk7CisKKyAgICBhbGxvY2F0aW9uLT5yZXNldChuZXcgQzJBbGxvY2F0aW9uR3JhbGxvYyhpbmZvLCBtTWFwcGVyLCBoaWRsSGFuZGxlLCBncmFsbG9jSGFuZGxlLCBtVHJhaXRzLT5pZCkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjpDMkFsbG9jYXRvckdyYWxsb2MoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSkKKyAgICAgICAgOiBtSW1wbChuZXcgSW1wbChpZCwgYnVmZmVyUXVldWUpKSB7fQorCitDMkFsbG9jYXRvckdyYWxsb2M6On5DMkFsbG9jYXRvckdyYWxsb2MoKSB7IGRlbGV0ZSBtSW1wbDsgfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRvckdyYWxsb2M6OmdldElkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0SWQoKTsKK30KKworQzJTdHJpbmcgQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0TmFtZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRUcmFpdHMoKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUltcGwtPm5ld0dyYXBoaWNBbGxvY2F0aW9uKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHJldHVybiBtSW1wbC0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsIGFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXR1cygpOworfQorCitib29sIEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OmlzVmFsaWQobyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjIxNTNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwCkBAIC0wLDAgKzEsNjM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkFsbG9jYXRvcklvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxpb24vaW9uLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gZ2V0cGFnZXNpemUsIHNpemVfdCwgY2xvc2UsIGR1cAorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkVycm5vVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIGNvbnN0ZXhwciBzaXplX3QgVVNBR0VfTFJVX0NBQ0hFX1NJWkUgPSAxMDI0OworfQorCisvKiBzaXplX3QgPD0+IGludChsbyksIGludChoaSkgY29udmVyc2lvbnMgKi8KK2NvbnN0ZXhwciBpbmxpbmUgaW50IHNpemUyaW50TG8oc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gaW50KHMgJiAweEZGRkZGRkZGKTsKK30KKworY29uc3RleHByIGlubGluZSBpbnQgc2l6ZTJpbnRIaShzaXplX3QgcykgeworICAgIC8vIGNhc3QgdG8gdWludDY0X3QgYXMgc2l6ZV90IG1heSBiZSAzMiBiaXRzIHdpZGUKKyAgICByZXR1cm4gaW50KCh1aW50NjRfdChzKSA+PiAzMikgJiAweEZGRkZGRkZGKTsKK30KKworY29uc3RleHByIGlubGluZSBzaXplX3QgaW50czJzaXplKGludCBpbnRMbywgaW50IGludEhpKSB7CisgICAgLy8gY29udmVydCBpbiAyIHN0YWdlcyB0byA2NCBiaXRzIGFzIGludEhpIG1heSBiZSBuZWdhdGl2ZQorICAgIHJldHVybiBzaXplX3QodW5zaWduZWQoaW50TG8pKSB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChpbnRIaSkpIDw8IDMyKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEhBTkRMRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKioKKyAqIElPTiBoYW5kbGUKKyAqCisgKiBUaGVyZSBjYW4gYmUgb25seSBhIHNvbGUgaW9uIGNsaWVudCBwZXIgcHJvY2VzcywgdGhpcyBpcyBjYXB0dXJlZCBpbiB0aGUgaW9uIGZkIHRoYXQgaXMgcGFzc2VkCisgKiB0byB0aGUgY29uc3RydWN0b3IsIGJ1dCB0aGlzIHNob3VsZCBiZSBtYW5hZ2VkIGJ5IHRoZSBpb24gYnVmZmVyIGFsbG9jYXRvci9tYXBwZXIuCisgKgorICogaW9uIHVzZXMgaW9uX3VzZXJfaGFuZGxlX3QgZm9yIGJ1ZmZlcnMuIFdlIGRvbid0IHN0b3JlIHRoaXMgaW4gdGhlIG5hdGl2ZSBoYW5kbGUgYXMKKyAqIGl0IHJlcXVpcmVzIGFuIGlvbl9mcmVlIHRvIGRlY3JlZi4gSW5zdGVhZCwgd2Ugc2hhcmUgdGhlIGJ1ZmZlciB0byBnZXQgYW4gZmQgdGhhdCBhbHNvIGhvbGRzCisgKiBhIHJlZmNvdW50LgorICoKKyAqIFRoaXMgaGFuZGxlIHdpbGwgbm90IGNhcHR1cmUgbWFwcGVkIGZkLXMgYXMgdXBkYXRpbmcgdGhhdCB3b3VsZCByZXF1aXJlIGEgZ2xvYmFsIG11dGV4LgorICovCisKK3N0cnVjdCBDMkhhbmRsZUlvbiA6IHB1YmxpYyBDMkhhbmRsZSB7CisgICAgLy8gaW9uIGhhbmRsZSBvd25zIGlvbkZkKCEpIGFuZCBidWZmZXJGZAorICAgIEMySGFuZGxlSW9uKGludCBidWZmZXJGZCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogQzJIYW5kbGUoY0hlYWRlciksCisgICAgICAgICAgbUZkc3sgYnVmZmVyRmQgfSwKKyAgICAgICAgICBtSW50c3sgaW50KHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0geyB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3Qgbyk7CisKKyAgICBpbnQgYnVmZmVyRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1CdWZmZXI7IH0KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0cnVjdCB7CisgICAgICAgIGludCBtQnVmZmVyOyAvLyBzaGFyZWQgaW9uIGJ1ZmZlcgorICAgIH0gbUZkczsKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgbVNpemVMbzsgLy8gbG93IDMyLWJpdHMgb2Ygc2l6ZQorICAgICAgICBpbnQgbVNpemVIaTsgLy8gaGlnaCAzMi1iaXRzIG9mIHNpemUKKyAgICAgICAgaW50IG1NYWdpYzsKKyAgICB9IG1JbnRzOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJIYW5kbGVJb24gX3R5cGU7CisgICAgZW51bSB7CisgICAgICAgIGtNYWdpYyA9ICdceGMyaW9ceDAwJywKKyAgICAgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIHZlcnNpb24gPSBzaXplb2YoQzJIYW5kbGUpCisgICAgfTsKKyAgICAvL2NvbnN0ZXhwciBzdGF0aWMgQzJIYW5kbGUgY0hlYWRlciA9IHsgdmVyc2lvbiwgbnVtRmRzLCBudW1JbnRzLCB7fSB9OworICAgIGNvbnN0IHN0YXRpYyBDMkhhbmRsZSBjSGVhZGVyOworfTsKKworY29uc3QgQzJIYW5kbGUgQzJIYW5kbGVJb246OmNIZWFkZXIgPSB7CisgICAgQzJIYW5kbGVJb246OnZlcnNpb24sCisgICAgQzJIYW5kbGVJb246Om51bUZkcywKKyAgICBDMkhhbmRsZUlvbjo6bnVtSW50cywKKyAgICB7fQorfTsKKworLy8gc3RhdGljCitib29sIEMySGFuZGxlSW9uOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3QgbykgeworICAgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMkhhbmRsZUlvbiAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBDMkhhbmRsZUlvbio+KG8pOworICAgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworLy8gVE9ETzogaXMgdGhlIGR1cCBvZiBhbiBpb24gZmQgaWRlbnRpY2FsIHRvIGlvbl9zaGFyZT8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElPTiBBTExPQ0FUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjbGFzcyBDMkFsbG9jYXRpb25Jb24gOiBwdWJsaWMgQzJMaW5lYXJBbGxvY2F0aW9uIHsKK3B1YmxpYzoKKyAgICAvKiBJbnRlcmZhY2UgbWV0aG9kcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgIHZvaWQgKiphZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlRmQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgfkMyQWxsb2NhdGlvbklvbigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgaWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGludGVybmFsIG1ldGhvZHMKKyAgICBDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLCB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKyAgICBDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBjbGFzcyBJbXBsVjI7CisgICAgSW1wbCAqbUltcGw7CisKKyAgICAvLyBUT0RPOiB3ZSBjb3VsZCBtYWtlIHRoaXMgZW5jYXBzdWxhdGUgc2hhcmVkX3B0ciBhbmQgY29waWFibGUKKyAgICBDMl9ET19OT1RfQ09QWShDMkFsbG9jYXRpb25Jb24pOworfTsKKworY2xhc3MgQzJBbGxvY2F0aW9uSW9uOjpJbXBsIHsKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgV2UgYWx3YXlzIGNyZWF0ZSBhbiBpb24gYWxsb2NhdGlvbiwgZXZlbiBpZiB0aGUgYWxsb2NhdGlvbiBvciBpbXBvcnQgZmFpbHMKKyAgICAgKiBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlIHRoZSBlcnJvci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGJ1ZmZlckZkICBidWZmZXIgaGFuZGxlIChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpLiBNdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICBpbnZhbGlkIGlmIGVyciBpcyBub3QgMC4KKyAgICAgKiBccGFyYW0gYnVmZmVyICAgIGlvbiBidWZmZXIgdXNlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkuIE11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGludmFsaWQgaWYgZXJyIGlzIG5vdCAwLgorICAgICAqIFxwYXJhbSBlcnIgICAgICAgZXJybm8gZHVyaW5nIGJ1ZmZlciBhbGxvY2F0aW9uIG9yIGltcG9ydAorICAgICAqLworICAgIEltcGwoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCwgaW50IGVycikKKyAgICAgICAgOiBtSW9uRmQoaW9uRmQpLAorICAgICAgICAgIG1IYW5kbGUoYnVmZmVyRmQsIGNhcGFjaXR5KSwKKyAgICAgICAgICBtQnVmZmVyKGJ1ZmZlciksCisgICAgICAgICAgbUlkKGlkKSwKKyAgICAgICAgICBtSW5pdChjMl9tYXBfZXJybm88RU5PTUVNLCBFQUNDRVMsIEVJTlZBTD4oZXJyKSksCisgICAgICAgICAgbU1hcEZkKC0xKSB7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgLy8gY2xvc2UgaW9uRmQgbm93IG9uIGVycm9yCisgICAgICAgICAgICBpZiAobUlvbkZkID49IDApIHsKKyAgICAgICAgICAgICAgICBjbG9zZShtSW9uRmQpOworICAgICAgICAgICAgICAgIG1Jb25GZCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQzJfQ0hFQ0soYnVmZmVyRmQgPCAwKTsKKyAgICAgICAgICAgIC8vIEMyX0NIRUNLKGJ1ZmZlciA8IDApOworICAgICAgICB9CisgICAgfQorCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBieSBpbXBvcnRpbmcgYSBzaGFyZWQgYnVmZmVyIGZkLgorICAgICAqCisgICAgICogXHBhcmFtIGlvbkZkICAgICBpb24gY2xpZW50IChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICBzaXplIG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gYnVmZmVyRmQgIGJ1ZmZlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3JlYXRlZCBpb24gYWxsb2NhdGlvbiAoaW1wbGVtZW50YXRpb24pIHdoaWNoIG1heSBiZSBpbnZhbGlkIGlmIHRoZQorICAgICAqIGltcG9ydCBmYWlsZWQuCisgICAgICovCisgICAgc3RhdGljIEltcGwgKkltcG9ydChpbnQgaW9uRmQsIHNpemVfdCBjYXBhY2l0eSwgaW50IGJ1ZmZlckZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uIGJ5IGFsbG9jYXRpbmcgYW4gaW9uIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBzaXplICAgICAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGFsaWduICAgICBkZXNpcmVkIGFsaWdubWVudCBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGhlYXBNYXNrICBtYXNrIG9mIGhlYXBzIGNvbnNpZGVyZWQKKyAgICAgKiBccGFyYW0gZmxhZ3MgICAgIGlvbiBhbGxvY2F0aW9uIGZsYWdzCisgICAgICoKKyAgICAgKiBccmV0dXJuIGNyZWF0ZWQgaW9uIGFsbG9jYXRpb24gKGltcGxlbWVudGF0aW9uKSB3aGljaCBtYXkgYmUgaW52YWxpZCBpZiB0aGUKKyAgICAgKiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgSW1wbCAqQWxsb2MoaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLCB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKworICAgIGMyX3N0YXR1c190IG1hcChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsIHZvaWQgKiphZGRyKSB7CisgICAgICAgICh2b2lkKWZlbmNlOyAvLyBUT0RPOiB3YWl0IGZvciBmZW5jZQorICAgICAgICAqYWRkciA9IG51bGxwdHI7CisgICAgICAgIGlmICghbU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJtdWx0aXBsZSBtYXAiKTsKKyAgICAgICAgICAgIC8vIFRPRE86IHRlY2huaWNhbGx5IHdlIHNob3VsZCByZXR1cm4gRFVQTElDQVRFIGhlcmUsIGJ1dCBvdXIgYmxvY2sgdmlld3MgZG9uJ3QKKyAgICAgICAgICAgIC8vIGFjdHVhbGx5IHVubWFwLCBzbyB3ZSBlbmQgdXAgcmVtYXBwaW5nIGFuIGlvbiBidWZmZXIgbXVsdGlwbGUgdGltZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50IHByb3QgPSBQUk9UX05PTkU7CisgICAgICAgIGludCBmbGFncyA9IE1BUF9TSEFSRUQ7CisgICAgICAgIGlmICh1c2FnZS5leHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSB7CisgICAgICAgICAgICBwcm90IHw9IFBST1RfUkVBRDsKKyAgICAgICAgfQorICAgICAgICBpZiAodXNhZ2UuZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpIHsKKyAgICAgICAgICAgIHByb3QgfD0gUFJPVF9XUklURTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBhbGlnbm1lbnRCeXRlcyA9IG9mZnNldCAlIFBBR0VfU0laRTsKKyAgICAgICAgc2l6ZV90IG1hcE9mZnNldCA9IG9mZnNldCAtIGFsaWdubWVudEJ5dGVzOworICAgICAgICBzaXplX3QgbWFwU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgTWFwcGluZyBtYXAgPSB7IG51bGxwdHIsIGFsaWdubWVudEJ5dGVzLCBtYXBTaXplIH07CisKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbWFwSW50ZXJuYWwobWFwU2l6ZSwgbWFwT2Zmc2V0LCBhbGlnbm1lbnRCeXRlcywgcHJvdCwgZmxhZ3MsICYobWFwLmFkZHIpLCBhZGRyKTsKKyAgICAgICAgaWYgKG1hcC5hZGRyKSB7CisgICAgICAgICAgICBtTWFwcGluZ3MucHVzaF9iYWNrKG1hcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB1bm1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSAqZmVuY2UpIHsKKyAgICAgICAgaWYgKG1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRCgidHJpZWQgdG8gdW5tYXAgdW5tYXBwZWQgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1NYXBwaW5ncy5iZWdpbigpOyBpdCAhPSBtTWFwcGluZ3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChhZGRyICE9ICh1aW50OF90ICopaXQtPmFkZHIgKyBpdC0+YWxpZ25tZW50Qnl0ZXMgfHwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArIGl0LT5hbGlnbm1lbnRCeXRlcyAhPSBpdC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVyciA9IG11bm1hcChpdC0+YWRkciwgaXQtPnNpemUpOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIm11bm1hcCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZlbmNlKSB7CisgICAgICAgICAgICAgICAgKmZlbmNlID0gQzJGZW5jZSgpOyAvLyBub3QgdXNpbmcgZmVuY2VzCisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCltTWFwcGluZ3MuZXJhc2UoaXQpOworICAgICAgICAgICAgQUxPR1YoInN1Y2Nlc3NmdWxseSB1bm1hcHBlZDogJWQiLCBtSGFuZGxlLmJ1ZmZlckZkKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgICAgIEFMT0dEKCJ1bm1hcCBmYWlsZWQgdG8gZmluZCBzcGVjaWZpZWQgbWFwIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgdmlydHVhbCB+SW1wbCgpIHsKKyAgICAgICAgaWYgKCFtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0QoIkRhbmdsaW5nIG1hcHBpbmdzISIpOworICAgICAgICAgICAgZm9yIChjb25zdCBNYXBwaW5nICZtYXAgOiBtTWFwcGluZ3MpIHsKKyAgICAgICAgICAgICAgICAodm9pZCltdW5tYXAobWFwLmFkZHIsIG1hcC5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobU1hcEZkID49IDApIHsKKyAgICAgICAgICAgIGNsb3NlKG1NYXBGZCk7CisgICAgICAgICAgICBtTWFwRmQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyID49IDApIHsKKyAgICAgICAgICAgICAgICAodm9pZClpb25fZnJlZShtSW9uRmQsIG1CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZSgmbUhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Jb25GZCA+PSAwKSB7CisgICAgICAgICAgICBjbG9zZShtSW9uRmQpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICZtSGFuZGxlOworICAgIH0KKworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIHZpcnR1YWwgaW9uX3VzZXJfaGFuZGxlX3QgaW9uSGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJ1ZmZlcjsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcEludGVybmFsKHNpemVfdCBtYXBTaXplLCBzaXplX3QgbWFwT2Zmc2V0LCBzaXplX3QgYWxpZ25tZW50Qnl0ZXMsCisgICAgICAgICAgICBpbnQgcHJvdCwgaW50IGZsYWdzLCB2b2lkKiogYmFzZSwgdm9pZCoqIGFkZHIpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgICAgIGlmIChtTWFwRmQgPT0gLTEpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBpb25fbWFwKG1Jb25GZCwgbUJ1ZmZlciwgbWFwU2l6ZSwgcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBtYXBPZmZzZXQsICh1bnNpZ25lZCBjaGFyKiopYmFzZSwgJm1NYXBGZCk7CisgICAgICAgICAgICBBTE9HVigiaW9uX21hcChpb25GZCA9ICVkLCBoYW5kbGUgPSAlZCwgc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAib2Zmc2V0ID0gJXp1KSByZXR1cm5lZCAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIG1Jb25GZCwgbUJ1ZmZlciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1hcE9mZnNldCwgcmV0KTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBtTWFwRmQgPSAtMTsKKyAgICAgICAgICAgICAgICAqYmFzZSA9ICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBlcnIgPSBjMl9tYXBfZXJybm88RUlOVkFMPigtcmV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKSpiYXNlICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYmFzZSA9IG1tYXAobnVsbHB0ciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1NYXBGZCwgbWFwT2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJtbWFwKHNpemUgPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCwgbWFwRmQgPSAlZCwgb2Zmc2V0ID0gJXp1KSAiCisgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtYXBTaXplLCBwcm90LCBmbGFncywgbU1hcEZkLCBtYXBPZmZzZXQsIGVycm5vKTsKKyAgICAgICAgICAgIGlmICgqYmFzZSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgKmJhc2UgPSAqYWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYWRkciA9ICh1aW50OF90ICopKmJhc2UgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBtSW9uRmQ7CisgICAgQzJIYW5kbGVJb24gbUhhbmRsZTsKKyAgICBpb25fdXNlcl9oYW5kbGVfdCBtQnVmZmVyOworICAgIEMyQWxsb2NhdG9yOjppZF90IG1JZDsKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBpbnQgbU1hcEZkOyAvLyBvbmx5IG9uZSBmb3Igbm93CisgICAgc3RydWN0IE1hcHBpbmcgeworICAgICAgICB2b2lkICphZGRyOworICAgICAgICBzaXplX3QgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIHNpemVfdCBzaXplOworICAgIH07CisgICAgc3RkOjpsaXN0PE1hcHBpbmc+IG1NYXBwaW5nczsKK307CisKK2NsYXNzIEMyQWxsb2NhdGlvbklvbjo6SW1wbFYyIDogcHVibGljIEMyQWxsb2NhdGlvbklvbjo6SW1wbCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBmb3IgcGxhdGZvcm1zIHdpdGggbmV3IChpb25fNC4xMi5oKSBhcGkKKyAgICAgKgorICAgICAqIFxub3RlIFdlIGFsd2F5cyBjcmVhdGUgYW4gaW9uIGFsbG9jYXRpb24sIGV2ZW4gaWYgdGhlIGFsbG9jYXRpb24gb3IgaW1wb3J0IGZhaWxzCisgICAgICogc28gdGhhdCB3ZSBjYW4gY2FwdHVyZSB0aGUgZXJyb3IuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW9uRmQgICAgIGlvbiBjbGllbnQgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgIHNpemUgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBidWZmZXJGZCAgYnVmZmVyIGhhbmRsZSAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KS4gTXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgaW52YWxpZCBpZiBlcnIgaXMgbm90IDAuCisgICAgICogXHBhcmFtIGVyciAgICAgICBlcnJubyBkdXJpbmcgYnVmZmVyIGFsbG9jYXRpb24gb3IgaW1wb3J0CisgICAgICovCisgICAgSW1wbFYyKGludCBpb25GZCwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgYnVmZmVyRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkLCBpbnQgZXJyKQorICAgICAgICA6IEltcGwoaW9uRmQsIGNhcGFjaXR5LCBidWZmZXJGZCwgLTEgLypidWZmZXIqLywgaWQsIGVycikgeworICAgIH0KKworICAgIHZpcnR1YWwgfkltcGxWMigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgaW9uX3VzZXJfaGFuZGxlX3QgaW9uSGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhhbmRsZS5idWZmZXJGZCgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwSW50ZXJuYWwoc2l6ZV90IG1hcFNpemUsIHNpemVfdCBtYXBPZmZzZXQsIHNpemVfdCBhbGlnbm1lbnRCeXRlcywKKyAgICAgICAgICAgIGludCBwcm90LCBpbnQgZmxhZ3MsIHZvaWQqKiBiYXNlLCB2b2lkKiogYWRkcikgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICAgICAgKmJhc2UgPSBtbWFwKG51bGxwdHIsIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtSGFuZGxlLmJ1ZmZlckZkKCksIG1hcE9mZnNldCk7CisgICAgICAgIEFMT0dWKCJtbWFwVjIoc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCBtYXBGZCA9ICVkLCBvZmZzZXQgPSAlenUpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICglZCkiLAorICAgICAgICAgICAgICBtYXBTaXplLCBwcm90LCBmbGFncywgbUhhbmRsZS5idWZmZXJGZCgpLCBtYXBPZmZzZXQsIGVycm5vKTsKKyAgICAgICAgaWYgKCpiYXNlID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgICAgICpiYXNlID0gKmFkZHIgPSBudWxscHRyOworICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKSpiYXNlICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKK307CisKK0MyQWxsb2NhdGlvbklvbjo6SW1wbCAqQzJBbGxvY2F0aW9uSW9uOjpJbXBsOjpJbXBvcnQoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaWQpIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiAoaW9uX2lzX2xlZ2FjeShpb25GZCkpIHsKKyAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyID0gLTE7CisgICAgICAgIHJldCA9IGlvbl9pbXBvcnQoaW9uRmQsIGJ1ZmZlckZkLCAmYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsKGlvbkZkLCBjYXBhY2l0eSwgYnVmZmVyRmQsIGJ1ZmZlciwgaWQsIHJldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsVjIoaW9uRmQsIGNhcGFjaXR5LCBidWZmZXJGZCwgaWQsIHJldCk7CisgICAgfQorfQorCitDMkFsbG9jYXRpb25Jb246OkltcGwgKkMyQWxsb2NhdGlvbklvbjo6SW1wbDo6QWxsb2MoaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLAorICAgICAgICB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKSB7CisgICAgaW50IGJ1ZmZlckZkID0gLTE7CisgICAgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyID0gLTE7CisgICAgc2l6ZV90IGFsaWduZWRTaXplID0gYWxpZ24gPT0gMCA/IHNpemUgOiAoc2l6ZSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7CisgICAgaW50IHJldDsKKworICAgIGlmIChpb25faXNfbGVnYWN5KGlvbkZkKSkgeworICAgICAgICByZXQgPSBpb25fYWxsb2MoaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCAmYnVmZmVyKTsKKyAgICAgICAgQUxPR1YoImlvbl9hbGxvYyhpb25GZCA9ICVkLCBzaXplID0gJXp1LCBhbGlnbiA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIDsgYnVmZmVyID0gJWQiLAorICAgICAgICAgICAgICBpb25GZCwgYWxpZ25lZFNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIHJldCwgYnVmZmVyKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAvLyBnZXQgYnVmZmVyIGZkIGZvciBuYXRpdmUgaGFuZGxlIGNvbnN0cnVjdG9yCisgICAgICAgICAgICByZXQgPSBpb25fc2hhcmUoaW9uRmQsIGJ1ZmZlciwgJmJ1ZmZlckZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlvbl9mcmVlKGlvbkZkLCBidWZmZXIpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSW1wbChpb25GZCwgYWxpZ25lZFNpemUsIGJ1ZmZlckZkLCBidWZmZXIsIGlkLCByZXQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gaW9uX2FsbG9jX2ZkKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgJmJ1ZmZlckZkKTsKKyAgICAgICAgQUxPR1YoImlvbl9hbGxvY19mZChpb25GZCA9ICVkLCBzaXplID0gJXp1LCBhbGlnbiA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIDsgYnVmZmVyRmQgPSAlZCIsCisgICAgICAgICAgICAgIGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgcmV0LCBidWZmZXJGZCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsVjIoaW9uRmQsIGFsaWduZWRTaXplLCBidWZmZXJGZCwgaWQsIHJldCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246Om1hcCgKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsIHZvaWQgKiphZGRyKSB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXAob2Zmc2V0LCBzaXplLCB1c2FnZSwgZmVuY2UsIGFkZHIpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246OnVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSkgeworICAgIHJldHVybiBtSW1wbC0+dW5tYXAoYWRkciwgc2l6ZSwgZmVuY2UpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXR1cygpOworfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRpb25Jb246OmdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0QWxsb2NhdG9ySWQoKTsKK30KKworYm9vbCBDMkFsbG9jYXRpb25Jb246OmVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoIW90aGVyIHx8IG90aGVyLT5nZXRBbGxvY2F0b3JJZCgpICE9IGdldEFsbG9jYXRvcklkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBnZXQgdXNlciBoYW5kbGUgdG8gY29tcGFyZSBvYmplY3RzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdGlvbklvbj4gb3RoZXJBc0lvbiA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkFsbG9jYXRpb25Jb24+KG90aGVyKTsKKyAgICByZXR1cm4gbUltcGwtPmlvbkhhbmRsZSgpID09IG90aGVyQXNJb24tPm1JbXBsLT5pb25IYW5kbGUoKTsKK30KKworY29uc3QgQzJIYW5kbGUgKkMyQWxsb2NhdGlvbklvbjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFuZGxlKCk7Cit9CisKK0MyQWxsb2NhdGlvbklvbjo6fkMyQWxsb2NhdGlvbklvbigpIHsKKyAgICBkZWxldGUgbUltcGw7Cit9CisKK0MyQWxsb2NhdGlvbklvbjo6QzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhlYXBNYXNrLCB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpCisgICAgOiBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZSksCisgICAgICBtSW1wbChJbXBsOjpBbGxvYyhpb25GZCwgc2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgaWQpKSB7IH0KKworQzJBbGxvY2F0aW9uSW9uOjpDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKQorICAgIDogQzJMaW5lYXJBbGxvY2F0aW9uKHNpemUpLAorICAgICAgbUltcGwoSW1wbDo6SW1wb3J0KGlvbkZkLCBzaXplLCBzaGFyZUZkLCBpZCkpIHsgfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEFMTE9DQVRPUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQzJBbGxvY2F0b3JJb246OkMyQWxsb2NhdG9ySW9uKGlkX3QgaWQpCisgICAgOiBtSW5pdChDMl9PSyksCisgICAgICBtSW9uRmQoaW9uX29wZW4oKSkgeworICAgIGlmIChtSW9uRmQgPCAwKSB7CisgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgICAgY2FzZSBFTk9FTlQ6ICAgIG1Jbml0ID0gQzJfT01JVFRFRDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICBtSW5pdCA9IGMyX21hcF9lcnJubzxFQUNDRVM+KGVycm5vKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBDMk1lbW9yeVVzYWdlIG1pblVzYWdlID0geyAwLCAwIH07CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgbWF4VXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgVHJhaXRzIHRyYWl0cyA9IHsgImFuZHJvaWQuYWxsb2NhdG9yLmlvbiIsIGlkLCBMSU5FQVIsIG1pblVzYWdlLCBtYXhVc2FnZSB9OworICAgICAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxUcmFpdHM+KHRyYWl0cyk7CisgICAgICAgIG1CbG9ja1NpemUgPSA6OmdldHBhZ2VzaXplKCk7CisgICAgfQorfQorCitDMkFsbG9jYXRvcklvbjo6fkMyQWxsb2NhdG9ySW9uKCkgeworICAgIGlmIChtSW5pdCA9PSBDMl9PSykgeworICAgICAgICBpb25fY2xvc2UobUlvbkZkKTsKKyAgICB9Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQWxsb2NhdG9ySW9uOjpnZXRJZCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0cy0+aWQ7Cit9CisKK0MyU3RyaW5nIEMyQWxsb2NhdG9ySW9uOjpnZXROYW1lKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzLT5uYW1lOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gQzJBbGxvY2F0b3JJb246OmdldFRyYWl0cygpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0czsKK30KKwordm9pZCBDMkFsbG9jYXRvcklvbjo6c2V0VXNhZ2VNYXBwZXIoCisgICAgICAgIGNvbnN0IFVzYWdlTWFwcGVyRm4gJm1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLCB1aW50NjRfdCBibG9ja1NpemUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICBtVXNhZ2VNYXBwZXJDYWNoZS5jbGVhcigpOworICAgIG1Vc2FnZU1hcHBlckxydS5jbGVhcigpOworICAgIG1Vc2FnZU1hcHBlciA9IG1hcHBlcjsKKyAgICBUcmFpdHMgdHJhaXRzID0geworICAgICAgICBtVHJhaXRzLT5uYW1lLCBtVHJhaXRzLT5pZCwgTElORUFSLAorICAgICAgICBDMk1lbW9yeVVzYWdlKG1pblVzYWdlKSwgQzJNZW1vcnlVc2FnZShtYXhVc2FnZSkKKyAgICB9OworICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWl0cz4odHJhaXRzKTsKKyAgICBtQmxvY2tTaXplID0gYmxvY2tTaXplOworfQorCitzdGQ6OnNpemVfdCBDMkFsbG9jYXRvcklvbjo6TWFwcGVyS2V5SGFzaDo6b3BlcmF0b3IoKShjb25zdCBNYXBwZXJLZXkgJmspIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPHVpbnQ2NF90Pnt9KGsuZmlyc3QpIF4gc3RkOjpoYXNoPHNpemVfdD57fShrLnNlY29uZCk7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9ySW9uOjptYXBVc2FnZSgKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IGNhcGFjaXR5LCBzaXplX3QgKmFsaWduLCB1bnNpZ25lZCAqaGVhcE1hc2ssIHVuc2lnbmVkICpmbGFncykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworICAgIC8vIGFsaWduIGNhcGFjaXR5CisgICAgY2FwYWNpdHkgPSAoY2FwYWNpdHkgKyBtQmxvY2tTaXplIC0gMSkgJiB+KG1CbG9ja1NpemUgLSAxKTsKKyAgICBNYXBwZXJLZXkga2V5ID0gc3RkOjptYWtlX3BhaXIodXNhZ2UuZXhwZWN0ZWQsIGNhcGFjaXR5KTsKKyAgICBhdXRvIGVudHJ5ID0gbVVzYWdlTWFwcGVyQ2FjaGUuZmluZChrZXkpOworICAgIGlmIChlbnRyeSA9PSBtVXNhZ2VNYXBwZXJDYWNoZS5lbmQoKSkgeworICAgICAgICBpZiAobVVzYWdlTWFwcGVyKSB7CisgICAgICAgICAgICByZXMgPSBtVXNhZ2VNYXBwZXIodXNhZ2UsIGNhcGFjaXR5LCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICphbGlnbiA9IDA7IC8vIFRPRE8gbWFrZSB0aGlzIDEKKyAgICAgICAgICAgICpoZWFwTWFzayA9IH4wOyAvLyBkZWZhdWx0IG1hc2sKKyAgICAgICAgICAgICpmbGFncyA9IDA7IC8vIGRlZmF1bHQgZmxhZ3MKKyAgICAgICAgICAgIHJlcyA9IEMyX05PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkIHVzYWdlIHRvIGNhY2hlCisgICAgICAgIE1hcHBlclZhbHVlIHZhbHVlID0gc3RkOjptYWtlX3R1cGxlKCphbGlnbiwgKmhlYXBNYXNrLCAqZmxhZ3MsIHJlcyk7CisgICAgICAgIG1Vc2FnZU1hcHBlckxydS5lbXBsYWNlX2Zyb250KGtleSwgdmFsdWUpOworICAgICAgICBtVXNhZ2VNYXBwZXJDYWNoZS5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKGtleSwgbVVzYWdlTWFwcGVyTHJ1LmJlZ2luKCkpKTsKKyAgICAgICAgaWYgKG1Vc2FnZU1hcHBlckNhY2hlLnNpemUoKSA+IFVTQUdFX0xSVV9DQUNIRV9TSVpFKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgTFJVIGVudHJ5CisgICAgICAgICAgICBNYXBwZXJLZXkgbHJ1S2V5ID0gbVVzYWdlTWFwcGVyTHJ1LmZyb250KCkuZmlyc3Q7CisgICAgICAgICAgICBtVXNhZ2VNYXBwZXJDYWNoZS5lcmFzZShscnVLZXkpOworICAgICAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtb3ZlIGVudHJ5IHRvIE1SVQorICAgICAgICBtVXNhZ2VNYXBwZXJMcnUuc3BsaWNlKG1Vc2FnZU1hcHBlckxydS5iZWdpbigpLCBtVXNhZ2VNYXBwZXJMcnUsIGVudHJ5LT5zZWNvbmQpOworICAgICAgICBjb25zdCBNYXBwZXJWYWx1ZSAmdmFsdWUgPSBlbnRyeS0+c2Vjb25kLT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6dGllKCphbGlnbiwgKmhlYXBNYXNrLCAqZmxhZ3MsIHJlcykgPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JJb246Om5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIGlmIChhbGxvY2F0aW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBhbGxvY2F0aW9uLT5yZXNldCgpOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgc2l6ZV90IGFsaWduID0gMDsKKyAgICB1bnNpZ25lZCBoZWFwTWFzayA9IH4wOworICAgIHVuc2lnbmVkIGZsYWdzID0gMDsKKyAgICBjMl9zdGF0dXNfdCByZXQgPSBtYXBVc2FnZSh1c2FnZSwgY2FwYWNpdHksICZhbGlnbiwgJmhlYXBNYXNrLCAmZmxhZ3MpOworICAgIGlmIChyZXQgJiYgcmV0ICE9IEMyX05PX0lOSVQpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0aW9uSW9uPiBhbGxvYworICAgICAgICA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0aW9uSW9uPihkdXAobUlvbkZkKSwgY2FwYWNpdHksIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIG1UcmFpdHMtPmlkKTsKKyAgICByZXQgPSBhbGxvYy0+c3RhdHVzKCk7CisgICAgaWYgKHJldCA9PSBDMl9PSykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IGFsbG9jOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvcklvbjo6cHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIGlmICghQzJIYW5kbGVJb246OmlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFRPRE86IGdldCBjYXBhY2l0eSBhbmQgdmFsaWRhdGUgaXQKKyAgICBjb25zdCBDMkhhbmRsZUlvbiAqaCA9IHN0YXRpY19jYXN0PGNvbnN0IEMySGFuZGxlSW9uKj4oaGFuZGxlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0aW9uSW9uPiBhbGxvYworICAgICAgICA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0aW9uSW9uPihkdXAobUlvbkZkKSwgaC0+c2l6ZSgpLCBoLT5idWZmZXJGZCgpLCBtVHJhaXRzLT5pZCk7CisgICAgYzJfc3RhdHVzX3QgcmV0ID0gYWxsb2MtPnN0YXR1cygpOworICAgIGlmIChyZXQgPT0gQzJfT0spIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBhbGxvYzsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPigKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCo+KGhhbmRsZSkpKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBDMkFsbG9jYXRvcklvbjo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUlvbjo6aXNWYWxpZChvKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwYjUzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcApAQCAtMCwwICsxLDEzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorCituYW1lc3BhY2UgeworCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvckdyYWxsb2M7Cit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlclBvb2xBbGxvY2F0aW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVyUG9vbEFsbG9jYXRvcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpJTlZBTElEX0NPTk5FQ1RJT05JRDsKKworLy8gVGhpcyBhbm9ueW1vdXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBoZWxwZXIgY2xhc3NlcyB0aGF0IGFsbG93IG91ciBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUKKy8vIGJsb2NrL2J1ZmZlciBvYmplY3RzLgorLy8KKy8vIEluaGVyaXQgZnJvbSB0aGUgcGFyZW50LCBzaGFyZSB3aXRoIHRoZSBmcmllbmQuCitjbGFzcyBSZWFkVmlld0J1ZGR5IDogcHVibGljIEMyUmVhZFZpZXcgeworICAgIHVzaW5nIEMyUmVhZFZpZXc6OkMyUmVhZFZpZXc7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdExpbmVhckJsb2NrOworfTsKKworY2xhc3MgV3JpdGVWaWV3QnVkZHkgOiBwdWJsaWMgQzJXcml0ZVZpZXcgeworICAgIHVzaW5nIEMyV3JpdGVWaWV3OjpDMldyaXRlVmlldzsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgQ29uc3RMaW5lYXJCbG9ja0J1ZGR5IDogcHVibGljIEMyQ29uc3RMaW5lYXJCbG9jayB7CisgICAgdXNpbmcgQzJDb25zdExpbmVhckJsb2NrOjpDMkNvbnN0TGluZWFyQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIExpbmVhckJsb2NrQnVkZHkgOiBwdWJsaWMgQzJMaW5lYXJCbG9jayB7CisgICAgdXNpbmcgQzJMaW5lYXJCbG9jazo6QzJMaW5lYXJCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkJhc2ljTGluZWFyQmxvY2tQb29sOworfTsKKworY2xhc3MgQWNxdWlyYWJsZVJlYWRWaWV3QnVkZHkgOiBwdWJsaWMgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0TGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlV3JpdGVWaWV3QnVkZHkgOiBwdWJsaWMgQzJBY3F1aXJhYmxlPEMyV3JpdGVWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIEdyYXBoaWNWaWV3QnVkZHkgOiBwdWJsaWMgQzJHcmFwaGljVmlldyB7CisgICAgdXNpbmcgQzJHcmFwaGljVmlldzo6QzJHcmFwaGljVmlldzsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0R3JhcGhpY0Jsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyR3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgQWNxdWlyYWJsZUNvbnN0R3JhcGhpY1ZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlR3JhcGhpY1ZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyR3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgQ29uc3RHcmFwaGljQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkNvbnN0R3JhcGhpY0Jsb2NrIHsKKyAgICB1c2luZyBDMkNvbnN0R3JhcGhpY0Jsb2NrOjpDMkNvbnN0R3JhcGhpY0Jsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyR3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgR3JhcGhpY0Jsb2NrQnVkZHkgOiBwdWJsaWMgQzJHcmFwaGljQmxvY2sgeworICAgIHVzaW5nIEMyR3JhcGhpY0Jsb2NrOjpDMkdyYXBoaWNCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbDsKK307CisKK2NsYXNzIEJ1ZmZlckRhdGFCdWRkeSA6IHB1YmxpYyBDMkJ1ZmZlckRhdGEgeworICAgIHVzaW5nIEMyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQnVmZmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAxRCBCTE9DSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCAxRCBibG9jayBhbmQgdmlldyBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogVGhpcyBpcyBiYXNpY2FsbHkganVzdCBhIHBsYWNlaG9sZGVyIGZvciB0aGUgdW5kZXJseWluZyAxRCBhbGxvY2F0aW9uIGFuZCB0aGUgcmFuZ2Ugb2YgdGhlCisgKiBhbGxvdGVkIHBvcnRpb24gdG8gdGhpcyBibG9jay4gVGhlcmUgaXMgYWxzbyBhIHBsYWNlaG9sZGVyIGZvciBhIGJsb2NrcG9vbCBkYXRhLgorICovCitjbGFzcyBDMl9ISURFIF9DMkJsb2NrMURJbXBsIDogcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICBfQzJCbG9jazFESW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJnBvb2xEYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwLCBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApCisgICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoYWxsb2MuZ2V0KCksIG9mZnNldCwgc2l6ZSksCisgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLAorICAgICAgICAgIG1Qb29sRGF0YShwb29sRGF0YSkgeyB9CisKKyAgICBfQzJCbG9jazFESW1wbChjb25zdCBfQzJCbG9jazFESW1wbCAmb3RoZXIsIHNpemVfdCBvZmZzZXQgPSAwLCBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApCisgICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoJm90aGVyLCBvZmZzZXQsIHNpemUpLAorICAgICAgICAgIG1BbGxvY2F0aW9uKG90aGVyLm1BbGxvY2F0aW9uKSwKKyAgICAgICAgICBtUG9vbERhdGEob3RoZXIubVBvb2xEYXRhKSB7IH0KKworICAgIC8qKiByZXR1cm5zIHBvb2wgZGF0YSAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gcG9vbERhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9vbERhdGE7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgbmF0aXZlIGhhbmRsZSAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5oYW5kbGUoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgdGhlIGFsbG9jYXRvcidzIElEICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgICAgIC8vIEJBRF9JRCBjYW4gb25seSBoYXBwZW4gaWYgdGhpcyBJbXBsIGNsYXNzIGlzIGluaXRpYWxpemVkIGZvciBhIHZpZXcgLSBuZXZlciBmb3IgYSBibG9jay4KKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmdldEFsbG9jYXRvcklkKCkgOiBDMkFsbG9jYXRvcjo6QkFEX0lEOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGdldEFsbG9jYXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IG1Qb29sRGF0YTsKK307CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgbWFwcGVkIGRhdGEgcG9pbnRlciwgYW5kIHRoZSBwb3RlbnRpYWwgZXJyb3IuCisgKgorICogcmFuZ2UgaXMgdGhlIG1hcHBlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBhbGxvdHRlZAorICogcmFuZ2UpLgorICovCitjbGFzcyBDMl9ISURFIF9DMk1hcHBlZEJsb2NrMURJbXBsIDogcHVibGljIF9DMkJsb2NrMURJbXBsIHsKK3B1YmxpYzoKKyAgICBfQzJNYXBwZWRCbG9jazFESW1wbChjb25zdCBfQzJCbG9jazFESW1wbCAmYmxvY2ssIHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJCbG9jazFESW1wbChibG9jaywgb2Zmc2V0LCBzaXplKSwgbURhdGEoZGF0YSksIG1FcnJvcihDMl9PSykgeyB9CisKKyAgICBfQzJNYXBwZWRCbG9jazFESW1wbChjMl9zdGF0dXNfdCBlcnJvcikKKyAgICAgICAgOiBfQzJCbG9jazFESW1wbChudWxscHRyKSwgbURhdGEobnVsbHB0ciksIG1FcnJvcihlcnJvcikgeworICAgICAgICAvLyBDSEVDSyhlcnJvciAhPSBDMl9PSyk7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEoKSB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1FcnJvcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDhfdCAqbURhdGE7CisgICAgYzJfc3RhdHVzX3QgbUVycm9yOworfTsKKworLyoqCisgKiBCbG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgQzJCbG9jazFEOjpJbXBsIDogcHVibGljIF9DMkJsb2NrMURJbXBsIHsKKyAgICB1c2luZyBfQzJCbG9jazFESW1wbDo6X0MyQmxvY2sxREltcGw7Cit9OworCitjb25zdCBDMkhhbmRsZSAqQzJCbG9jazFEOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYW5kbGUoKTsKK307CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQmxvY2sxRDo6Z2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRBbGxvY2F0b3JJZCgpOworfTsKKworQzJCbG9jazFEOjpDMkJsb2NrMUQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSkKKyAgICAvLyBhbHdheXMgY2xhbXAgc3VicmFuZ2UgdG8gcGFyZW50IChpbXBsKSByYW5nZSBmb3Igc2FmZXR5CisgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdChpbXBsLmdldCgpLCByYW5nZS5vZmZzZXQoKSwgcmFuZ2Uuc2l6ZSgpKSwgbUltcGwoaW1wbCkgeworfQorCisvKioKKyAqIFJlYWQgdmlldyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiByYW5nZSBvZiBJbXBsIGlzIHRoZSBtYXBwZWQgcmFuZ2Ugb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiAod2hpY2ggaXMgcGFydCBvZiB0aGUgYWxsb3R0ZWQKKyAqIHJhbmdlKS4gcmFuZ2Ugb2YgVmlldyBpcyAwIHRvIGNhcGFjaXR5KCkgKG5vdCByZXByZXNlbnRlZCBhcyBhbiBhY3R1YWwgcmFuZ2UpLiBUaGlzIG1hcHMgdG8gYQorICogc3VicmFuZ2Ugb2YgSW1wbCByYW5nZSBzdGFydGluZyBhdCBtSW1wbC0+b2Zmc2V0KCkgKyBfbU9mZnNldC4KKyAqLworY2xhc3MgQzJSZWFkVmlldzo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwZWRCbG9jazFESW1wbCB7CisgICAgdXNpbmcgX0MyTWFwcGVkQmxvY2sxREltcGw6Ol9DMk1hcHBlZEJsb2NrMURJbXBsOworfTsKKworQzJSZWFkVmlldzo6QzJSZWFkVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKQorICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoQzJMaW5lYXJDYXBhY2l0eShpbXBsLT5zaXplKCkpLnJhbmdlKG9mZnNldCwgc2l6ZSkuc2l6ZSgpKSwKKyAgICAgIG1JbXBsKGltcGwpLAorICAgICAgbU9mZnNldChDMkxpbmVhckNhcGFjaXR5KGltcGwtPnNpemUoKSkucmFuZ2Uob2Zmc2V0LCBzaXplKS5vZmZzZXQoKSkgeyB9CisKK0MyUmVhZFZpZXc6OkMyUmVhZFZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCgwdSksIG1JbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oZXJyb3IpKSwgbU9mZnNldCgwdSkgeworICAgIC8vIENIRUNLKGVycm9yICE9IEMyX09LKTsKK30KKworY29uc3QgdWludDhfdCAqQzJSZWFkVmlldzo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmVycm9yKCkgPyBudWxscHRyIDogbUltcGwtPmRhdGEoKSArIG1PZmZzZXQ7Cit9CisKK2MyX3N0YXR1c190IEMyUmVhZFZpZXc6OmVycm9yKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXJyb3IoKTsKK30KKworQzJSZWFkVmlldyBDMlJlYWRWaWV3OjpzdWJWaWV3KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgQzJMaW5lYXJSYW5nZSBzdWJSYW5nZSgqdGhpcywgb2Zmc2V0LCBzaXplKTsKKyAgICByZXR1cm4gQzJSZWFkVmlldyhtSW1wbCwgbU9mZnNldCArIHN1YlJhbmdlLm9mZnNldCgpLCBzdWJSYW5nZS5zaXplKCkpOworfQorCisvKioKKyAqIFdyaXRlIHZpZXcgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEMyV3JpdGVWaWV3OjpJbXBsIDogcHVibGljIF9DMk1hcHBlZEJsb2NrMURJbXBsIHsKKyAgICB1c2luZyBfQzJNYXBwZWRCbG9jazFESW1wbDo6X0MyTWFwcGVkQmxvY2sxREltcGw7Cit9OworCitDMldyaXRlVmlldzo6QzJXcml0ZVZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwpCisvLyBVR0xZOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCByZXF1aXJlcyBhIGJvbmEtZmlkZSBvYmplY3QgZm9yIGNhcGFjaXR5IHRvIHByZXZlbnQgc3Bvb2ZpbmcsIHNvCisvLyB0aGlzIGlzIHdoYXQgd2UgaGF2ZSB0byBkby4KKy8vIFRPRE86IHVzZSBjaGlsZFJhbmdlCisgICAgOiBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0KHN0ZDo6bWFrZV91bmlxdWU8QzJMaW5lYXJDYXBhY2l0eT4oaW1wbC0+c2l6ZSgpKS5nZXQoKSksIG1JbXBsKGltcGwpIHsgfQorCitDMldyaXRlVmlldzo6QzJXcml0ZVZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgOiBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0KG51bGxwdHIpLCBtSW1wbChzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGVycm9yKSkge30KKwordWludDhfdCAqQzJXcml0ZVZpZXc6OmJhc2UoKSB7IHJldHVybiBtSW1wbC0+ZGF0YSgpOyB9CisKK3VpbnQ4X3QgKkMyV3JpdGVWaWV3OjpkYXRhKCkgeyByZXR1cm4gbUltcGwtPmRhdGEoKSArIG9mZnNldCgpOyB9CisKK2MyX3N0YXR1c190IEMyV3JpdGVWaWV3OjplcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1JbXBsLT5lcnJvcigpOyB9CisKKy8qKgorICogQ29uc3QgbGluZWFyIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkNvbnN0TGluZWFyQmxvY2s6OkMyQ29uc3RMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlLCBDMkZlbmNlIGZlbmNlKQorICAgIDogQzJCbG9jazFEKGltcGwsIHJhbmdlKSwgbUZlbmNlKGZlbmNlKSB7IH0KKworQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IEMyQ29uc3RMaW5lYXJCbG9jazo6bWFwKCkgY29uc3QgeworICAgIHZvaWQgKmJhc2UgPSBudWxscHRyOworICAgIHVpbnQzMl90IGxlbiA9IHNpemUoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnJvciA9IG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPm1hcCgKKyAgICAgICAgICAgIG9mZnNldCgpLCBsZW4sIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIDAgfSwgbnVsbHB0ciwgJmJhc2UpOworICAgIC8vIFRPRE86IHdhaXQgb24gZmVuY2UKKyAgICBpZiAoZXJyb3IgPT0gQzJfT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlYWRWaWV3QnVkZHk6OkltcGw+IHJ2aSA9IHN0ZDo6c2hhcmVkX3B0cjxSZWFkVmlld0J1ZGR5OjpJbXBsPigKKyAgICAgICAgICAgICAgICBuZXcgUmVhZFZpZXdCdWRkeTo6SW1wbCgqbUltcGwsICh1aW50OF90ICopYmFzZSwgb2Zmc2V0KCksIGxlbiksCisgICAgICAgICAgICAgICAgW2Jhc2UsIGxlbl0oUmVhZFZpZXdCdWRkeTo6SW1wbCAqaSkgeworICAgICAgICAgICAgICAgICAgICAodm9pZClpLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKGJhc2UsIGxlbiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIEFjcXVpcmFibGVSZWFkVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFJlYWRWaWV3QnVkZHkocnZpLCAwLCBsZW4pKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVJlYWRWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgUmVhZFZpZXdCdWRkeShlcnJvcikpOworICAgIH0KK30KKworQzJDb25zdExpbmVhckJsb2NrIEMyQ29uc3RMaW5lYXJCbG9jazo6c3ViQmxvY2soc2l6ZV90IG9mZnNldF8sIHNpemVfdCBzaXplXykgY29uc3QgeworICAgIEMyTGluZWFyUmFuZ2Ugc3ViUmFuZ2UoKm1JbXBsLCBvZmZzZXRfLCBzaXplXyk7CisgICAgcmV0dXJuIEMyQ29uc3RMaW5lYXJCbG9jayhtSW1wbCwgc3ViUmFuZ2UsIG1GZW5jZSk7Cit9CisKKy8qKgorICogTGluZWFyIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkxpbmVhckJsb2NrOjpDMkxpbmVhckJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAmcmFuZ2UpCisgICAgOiBDMkJsb2NrMUQoaW1wbCwgcmFuZ2UpIHsgfQorCitDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IEMyTGluZWFyQmxvY2s6Om1hcCgpIHsKKyAgICB2b2lkICpiYXNlID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBsZW4gPSBzaXplKCk7CisgICAgYzJfc3RhdHVzX3QgZXJyb3IgPSBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT5tYXAoCisgICAgICAgICAgICBvZmZzZXQoKSwgbGVuLCB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwgbnVsbHB0ciwgJmJhc2UpOworICAgIC8vIFRPRE86IHdhaXQgb24gZmVuY2UKKyAgICBpZiAoZXJyb3IgPT0gQzJfT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFdyaXRlVmlld0J1ZGR5OjpJbXBsPiBydmkgPSBzdGQ6OnNoYXJlZF9wdHI8V3JpdGVWaWV3QnVkZHk6OkltcGw+KAorICAgICAgICAgICAgICAgIG5ldyBXcml0ZVZpZXdCdWRkeTo6SW1wbCgqbUltcGwsICh1aW50OF90ICopYmFzZSwgMCwgbGVuKSwKKyAgICAgICAgICAgICAgICBbYmFzZSwgbGVuXShXcml0ZVZpZXdCdWRkeTo6SW1wbCAqaSkgeworICAgICAgICAgICAgICAgICAgICAodm9pZClpLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKGJhc2UsIGxlbiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIEFjcXVpcmFibGVXcml0ZVZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBXcml0ZVZpZXdCdWRkeShydmkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVdyaXRlVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFdyaXRlVmlld0J1ZGR5KGVycm9yKSk7CisgICAgfQorfQorCitDMkNvbnN0TGluZWFyQmxvY2sgQzJMaW5lYXJCbG9jazo6c2hhcmUoc2l6ZV90IG9mZnNldF8sIHNpemVfdCBzaXplXywgQzJGZW5jZSBmZW5jZSkgeworICAgIHJldHVybiBDb25zdExpbmVhckJsb2NrQnVkZHkobUltcGwsIEMyTGluZWFyUmFuZ2UoKnRoaXMsIG9mZnNldF8sIHNpemVfKSwgZmVuY2UpOworfQorCitDMkJhc2ljTGluZWFyQmxvY2tQb29sOjpDMkJhc2ljTGluZWFyQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHsgfQorCitjMl9zdGF0dXNfdCBDMkJhc2ljTGluZWFyQmxvY2tQb29sOjpmZXRjaExpbmVhckJsb2NrKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgYmxvY2stPnJlc2V0KCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdMaW5lYXJBbGxvY2F0aW9uKGNhcGFjaXR5LCB1c2FnZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYyk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0cnVjdCBDMl9ISURFIEMyUG9vbGVkQmxvY2tQb29sRGF0YSA6IF9DMkJsb2NrUG9vbERhdGEgeworCisgICAgdmlydHVhbCB0eXBlX3QgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIFRZUEVfQlVGRkVSUE9PTDsKKyAgICB9CisKKyAgICB2b2lkIGdldEJ1ZmZlclBvb2xEYXRhKHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmRhdGEpIGNvbnN0IHsKKyAgICAgICAgKmRhdGEgPSBtRGF0YTsKKyAgICB9CisKKyAgICBDMlBvb2xlZEJsb2NrUG9vbERhdGEoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmZGF0YSkgOiBtRGF0YShkYXRhKSB7fQorCisgICAgdmlydHVhbCB+QzJQb29sZWRCbG9ja1Bvb2xEYXRhKCkgb3ZlcnJpZGUge30KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IG1EYXRhOworfTsKKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4gJmRhdGEsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlclBvb2xEYXRhKSB7CisgICAgaWYgKGRhdGEgJiYgZGF0YS0+Z2V0VHlwZSgpID09IF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUE9PTCkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgIHBvb2xEYXRhLT5nZXRCdWZmZXJQb29sRGF0YShidWZmZXJQb29sRGF0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9jazFEOjpJbXBsPiBpbXBsID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJsb2NrMUQ6OkltcGw+KGFsbG9jLCBkYXRhLCBvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4obmV3IEMyTGluZWFyQmxvY2soaW1wbCwgKmltcGwpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IF9DMkJsb2NrRmFjdG9yeTo6R2V0TGluZWFyQmxvY2tQb29sRGF0YSgKKyAgICAgICAgY29uc3QgQzJCbG9jazFEICZibG9jaykgeworICAgIGlmIChibG9jay5tSW1wbCkgeworICAgICAgICByZXR1cm4gYmxvY2subUltcGwtPnBvb2xEYXRhKCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcklvbj4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JJb24+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9ySW9uOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYyk7CisgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY0hhbmRsZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmZGF0YSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcklvbj4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JJb24+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9ySW9uOjppc1ZhbGlkKGNIYW5kbGUpKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbmZpZyBwYXJhbXM/CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9OworCisvKioKKyAqIFdyYXBwZWQgQzJBbGxvY2F0b3Igd2hpY2ggaXMgaW5qZWN0ZWQgdG8gYnVmZmVyIHBvb2wgb24gYmVoYWxmIG9mCisgKiBDMkJsb2NrUG9vbC4KKyAqLworY2xhc3MgX0MyQnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICBfQzJCdWZmZXJQb29sQWxsb2NhdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworICAgIH5fQzJCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgICAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyBmb3IgY29kZWMyIGNvbXBvbmVudCAoQzJCbG9ja1Bvb2wpLgorICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgbGluZWFyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgQzJBbGxvY2F0b3IgdG8gcGFyYW1ldGVycworICAgICAqIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXBhY2l0eSAgICAgIHNpemUgb2YgbGluZWFyIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gdXNhZ2UgICAgICAgICBtZW1vcnkgdXNhZ2UgcGF0dGVybiBmb3IgbGluZWFyIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIGJ1ZmZlciBwb29sCisgICAgICovCisgICAgdm9pZCBnZXRMaW5lYXJQYXJhbXModWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGdyYXBoaWMgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBDMkFsbG9jYXRvciB0byBwYXJhbWV0ZXJzCisgICAgICogZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoICAgICAgICAgd2lkdGggb2YgZ3JhcGhpYyBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGhlaWdodCAgICAgICAgaGVpZ2h0IG9mIGdyYXBoaWMgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBmb3JtYXQgICAgICAgIGNvbG9yIGZvcm1hdCBvZiBncmFwaGljIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBhbGxvY2F0aW9uIHBhcmFtZXRlciBmb3IgYnVmZmVyIHBvb2wKKyAgICAgKi8KKyAgICB2b2lkIGdldEdyYXBoaWNQYXJhbXModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZSB0byBhbiBDMkxpbmVhckFsbGNhdGlvbi4KKyAgICAgKiBXcmFwcGVyIHRvIEMyQWxsb2NhdG9yI3ByaW9yTGluZWFyQWxsb2NhdGlvbgorICAgICAqLworICAgIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZSB0byBhbiBDMkdyYXBoaWNBbGxjYXRpb24uCisgICAgICogV3JhcHBlciB0byBDMkFsbG9jYXRvciNwcmlvckdyYXBoaWNBbGxvY2F0aW9uCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbik7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEludFBhcmFtcyA9IDU7IC8vIGxhcmdlIGVub3VnaCBudW1iZXI7CisKKyAgICBlbnVtIEFsbG9jVHlwZSA6IHVpbnQ4X3QgeworICAgICAgICBBTExPQ19OT05FID0gMCwKKworICAgICAgICBBTExPQ19MSU5FQVIsCisgICAgICAgIEFMTE9DX0dSQVBISUMsCisgICAgfTsKKworICAgIHVuaW9uIEFsbG9jUGFyYW1zIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIEFsbG9jVHlwZSBhbGxvY1R5cGU7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlOworICAgICAgICAgICAgdWludDMyX3QgcGFyYW1zW2tNYXhJbnRQYXJhbXNdOworICAgICAgICB9IGRhdGE7CisgICAgICAgIHVpbnQ4X3QgYXJyYXlbMF07CisKKyAgICAgICAgQWxsb2NQYXJhbXMoKSA6IGRhdGF7QUxMT0NfTk9ORSwgezAsIDB9LCB7MH19IHt9CisgICAgICAgIEFsbG9jUGFyYW1zKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHVpbnQzMl90IGNhcGFjaXR5KQorICAgICAgICAgICAgOiBkYXRhe0FMTE9DX0xJTkVBUiwgdXNhZ2UsIHtbMF0gPSBjYXBhY2l0eX19IHt9CisgICAgICAgIEFsbG9jUGFyYW1zKAorICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0KQorICAgICAgICAgICAgICAgIDogZGF0YXtBTExPQ19HUkFQSElDLCB1c2FnZSwge3dpZHRoLCBoZWlnaHQsIGZvcm1hdH19IHt9CisgICAgfTsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK3N0cnVjdCBMaW5lYXJBbGxvY2F0aW9uRHRvciB7CisgICAgTGluZWFyQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jKQorICAgICAgICA6IG1BbGxvY2F0aW9uKGFsbG9jKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247Cit9OworCitzdHJ1Y3QgR3JhcGhpY0FsbG9jYXRpb25EdG9yIHsKKyAgICBHcmFwaGljQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYykKKyAgICAgICAgOiBtQWxsb2NhdGlvbihhbGxvYykge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKK307CisKK1Jlc3VsdFN0YXR1cyBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZwYXJhbXMsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICAgIEFsbG9jUGFyYW1zIGMyUGFyYW1zOworICAgIG1lbWNweSgmYzJQYXJhbXMsIHBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihBbGxvY1BhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9CQURfVkFMVUU7CisgICAgc3dpdGNoKGMyUGFyYW1zLmRhdGEuYWxsb2NUeXBlKSB7CisgICAgICAgIGNhc2UgQUxMT0NfTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX0xJTkVBUjogeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYzJMaW5lYXI7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5uZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1swXSwgYzJQYXJhbXMuZGF0YS51c2FnZSwgJmMyTGluZWFyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgYzJMaW5lYXIpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGMyTGluZWFyLT5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgTGluZWFyQWxsb2NhdGlvbkR0b3IoYzJMaW5lYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmFsbG9jU2l6ZSA9IChzaXplX3QpYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFMTE9DX0dSQVBISUM6IHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBjMkdyYXBoaWM7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF0sCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzFdLAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1syXSwKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS51c2FnZSwgJmMyR3JhcGhpYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGMyR3JhcGhpYykgeworICAgICAgICAgICAgICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYzJHcmFwaGljLT5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgR3JhcGhpY0FsbG9jYXRpb25EdG9yKGMyR3JhcGhpYykpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NTaXplID0gYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF0gKiBjMlBhcmFtcy5kYXRhLnBhcmFtc1sxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK2Jvb2wgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZuZXdQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICAmb2xkUGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgbmV3QWxsb2M7CisgICAgQWxsb2NQYXJhbXMgb2xkQWxsb2M7CisgICAgbWVtY3B5KCZuZXdBbGxvYywgbmV3UGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKEFsbG9jUGFyYW1zKSwgbmV3UGFyYW1zLnNpemUoKSkpOworICAgIG1lbWNweSgmb2xkQWxsb2MsIG9sZFBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihBbGxvY1BhcmFtcyksIG9sZFBhcmFtcy5zaXplKCkpKTsKKworICAgIC8vIFRPRE86IHN1cHBvcnQgbm90IGV4YWN0IG1hdGNoaW5nLiBlLmcpIG5ld0NhcGFjaXR5IDwgb2xkQ2FwYWNpdHkKKyAgICBpZiAobmV3QWxsb2MuZGF0YS5hbGxvY1R5cGUgPT0gb2xkQWxsb2MuZGF0YS5hbGxvY1R5cGUgJiYKKyAgICAgICAgICAgIG5ld0FsbG9jLmRhdGEudXNhZ2UuZXhwZWN0ZWQgPT0gb2xkQWxsb2MuZGF0YS51c2FnZS5leHBlY3RlZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhJbnRQYXJhbXM7ICsraSkgeworICAgICAgICAgICAgaWYgKG5ld0FsbG9jLmRhdGEucGFyYW1zW2ldICE9IG9sZEFsbG9jLmRhdGEucGFyYW1zW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Z2V0TGluZWFyUGFyYW1zKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICAgIEFsbG9jUGFyYW1zIGMyUGFyYW1zKHVzYWdlLCBjYXBhY2l0eSk7CisgICAgcGFyYW1zLT5hc3NpZ24oYzJQYXJhbXMuYXJyYXksIGMyUGFyYW1zLmFycmF5ICsgc2l6ZW9mKEFsbG9jUGFyYW1zKSk7Cit9CisKK3ZvaWQgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Z2V0R3JhcGhpY1BhcmFtcygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgYzJQYXJhbXModXNhZ2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgICAgcGFyYW1zLT5hc3NpZ24oYzJQYXJhbXMuYXJyYXksIGMyUGFyYW1zLmFycmF5ICsgc2l6ZW9mKEFsbG9jUGFyYW1zKSk7Cit9CisKK2MyX3N0YXR1c190IF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OnByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbikgeworICAgIHJldHVybiBtQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCBjMkFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbikgeworICAgIHJldHVybiBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgYzJBbGxvY2F0aW9uKTsKK30KKworY2xhc3MgQzJQb29sZWRCbG9ja1Bvb2w6OkltcGwgeworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICAgICAgOiBtSW5pdChDMl9PSyksCisgICAgICAgICAgICAgIG1CdWZmZXJQb29sTWFuYWdlcihDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpKSwKKyAgICAgICAgICAgICAgbUFsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I+KGFsbG9jYXRvcikpIHsKKyAgICAgICAgaWYgKG1BbGxvY2F0b3IgJiYgbUJ1ZmZlclBvb2xNYW5hZ2VyKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlclBvb2xNYW5hZ2VyLT5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKSA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Jbml0ID0gQzJfTk9fSU5JVDsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgaWYgKG1Jbml0ID09IEMyX09LKSB7CisgICAgICAgICAgICBtQnVmZmVyUG9vbE1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgIGJsb2NrLT5yZXNldCgpOworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJhbXM7CisgICAgICAgIG1BbGxvY2F0b3ItPmdldExpbmVhclBhcmFtcyhjYXBhY2l0eSwgdXNhZ2UsICZwYXJhbXMpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlclBvb2xEYXRhOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUJ1ZmZlclBvb2xNYW5hZ2VyLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBwYXJhbXMsICZjSGFuZGxlLCAmYnVmZmVyUG9vbERhdGEpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oYnVmZmVyUG9vbERhdGEpOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yTGluZWFyQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSAmJiBhbGxvYykgeworICAgICAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jLCBwb29sRGF0YSwgMCwgY2FwYWNpdHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgeworICAgICAgICBibG9jay0+cmVzZXQoKTsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFyYW1zOworICAgICAgICBtQWxsb2NhdG9yLT5nZXRHcmFwaGljUGFyYW1zKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZwYXJhbXMpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlclBvb2xEYXRhOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUJ1ZmZlclBvb2xNYW5hZ2VyLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBwYXJhbXMsICZjSGFuZGxlLCAmYnVmZmVyUG9vbERhdGEpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oYnVmZmVyUG9vbERhdGEpOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSAmJiBhbGxvYykgeworICAgICAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvYywgcG9vbERhdGEsIEMyUmVjdCh3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtSW5pdCAhPSBDMl9PSyA/IElOVkFMSURfQ09OTkVDVElPTklEIDogbUNvbm5lY3Rpb25JZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgY29uc3QgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbUJ1ZmZlclBvb2xNYW5hZ2VyOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOyAvLyBsb2NhbGx5CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitDMlBvb2xlZEJsb2NrUG9vbDo6QzJQb29sZWRCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSwgbUxvY2FsSWQobG9jYWxJZCksIG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0MyUG9vbGVkQmxvY2tQb29sOjp+QzJQb29sZWRCbG9ja1Bvb2woKSB7Cit9CisKK2MyX3N0YXR1c190IEMyUG9vbGVkQmxvY2tQb29sOjpmZXRjaExpbmVhckJsb2NrKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hMaW5lYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsIGJsb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJQb29sZWRCbG9ja1Bvb2w6OmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hHcmFwaGljQmxvY2sod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCitpbnQ2NF90IEMyUG9vbGVkQmxvY2tQb29sOjpnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gMkQgQkxPQ0sgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCAyRCBibG9ja3MgYW5kIHZpZXdzLgorICoKKyAqIEZvciBibG9ja3MnIEltcGwncyBjcm9wIGlzIGFsd2F5cyB0aGUgYWxsb3R0ZWQgY3JvcCwgZXZlbiBpZiBpdCBpcyBhIHN1YiBibG9jay4KKyAqCisgKiBGb3Igdmlld3MnIEltcGwncyBjcm9wIGlzIHRoZSBtYXBwZWQgcG9ydGlvbiAtIHdoaWNoIGZvciBub3cgaXMgYWx3YXlzIHRoZQorICogYWxsb3R0ZWQgY3JvcC4KKyAqLworY2xhc3MgQzJfSElERSBfQzJCbG9jazJESW1wbCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBJbXBsJ3MgY3JvcCBpcyBhbHdheXMgdGhlIG9yIHBhcnQgb2YgdGhlIGFsbG90dGVkIGNyb3Agb2YgdGhlIGFsbG9jYXRpb24uCisgICAgICovCisgICAgX0MyQmxvY2syREltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgY29uc3QgQzJSZWN0ICZhbGxvdHRlZENyb3AgPSBDMlJlY3QofjB1LCB+MHUpKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoYWxsb2MuZ2V0KCksIGFsbG90dGVkQ3JvcCksCisgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLAorICAgICAgICAgIG1Qb29sRGF0YShwb29sRGF0YSkgeyB9CisKKyAgICB2aXJ0dWFsIH5fQzJCbG9jazJESW1wbCgpID0gZGVmYXVsdDsKKworICAgIC8qKiByZXR1cm5zIHBvb2wgZGF0YSAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gcG9vbERhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9vbERhdGE7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgbmF0aXZlIGhhbmRsZSAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5oYW5kbGUoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgdGhlIGFsbG9jYXRvcidzIElEICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgICAgIC8vIEJBRF9JRCBjYW4gb25seSBoYXBwZW4gaWYgdGhpcyBJbXBsIGNsYXNzIGlzIGluaXRpYWxpemVkIGZvciBhIHZpZXcgLSBuZXZlciBmb3IgYSBibG9jay4KKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmdldEFsbG9jYXRvcklkKCkgOiBDMkFsbG9jYXRvcjo6QkFEX0lEOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBnZXRBbGxvY2F0aW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb247CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhOworfTsKKworY2xhc3MgQzJfSElERSBfQzJNYXBwaW5nQmxvY2syREltcGwKKyAgICA6IHB1YmxpYyBfQzJCbG9jazJESW1wbCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsPiB7CitwdWJsaWM6CisgICAgdXNpbmcgX0MyQmxvY2syREltcGw6Ol9DMkJsb2NrMkRJbXBsOworCisgICAgdmlydHVhbCB+X0MyTWFwcGluZ0Jsb2NrMkRJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgbWFwcGVkIGRhdGEgcG9pbnRlciwgYW5kIHRoZSBwb3RlbnRpYWwgZXJyb3IuCisgICAgICovCisgICAgc3RydWN0IE1hcHBlZCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzIF9DMk1hcHBpbmdCbG9jazJESW1wbDsKKworICAgICAgICBNYXBwZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrMkRJbXBsPiAmaW1wbCwgYm9vbCB3cml0YWJsZSwgQzJGZW5jZSAqZmVuY2UgX191bnVzZWQpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpLCBtV3JpdGFibGUod3JpdGFibGUpIHsKKyAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICBjb25zdCBDMlJlY3QgY3JvcCA9IG1JbXBsLT5jcm9wKCk7CisgICAgICAgICAgICAvLyBncmFsbG9jIHJlcXVpcmVzIG1hcHBpbmcgdGhlIHdob2xlIHJlZ2lvbiBvZiBpbnRlcmVzdCBhcyB3ZSBjYW5ub3QKKyAgICAgICAgICAgIC8vIG1hcCBtdWx0aXBsZSByZWdpb25zCisgICAgICAgICAgICBtRXJyb3IgPSBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT5tYXAoCisgICAgICAgICAgICAgICAgICAgIGNyb3AsCisgICAgICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIHdyaXRhYmxlID8gQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIDogMCB9LAorICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAmbUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgbURhdGEpOworICAgICAgICAgICAgaWYgKG1FcnJvciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIG1lbXNldCgmbUxheW91dCwgMCwgc2l6ZW9mKG1MYXlvdXQpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgICAgIG1lbXNldChtT2Zmc2V0RGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHZhbGlkYXRlIHBsYW5lIGxheW91dCBhbmQKKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgZGF0YSBwb2ludGVycyB0byB0aGUgY3JvcCByZWdpb24ncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICAgICAgICAgICAgLy8gZmFpbCBpZiBpdCBpcyBub3Qgb24gYSBzdWJzYW1wbGluZyBib3VuZGFyeQorICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IHBsYW5lSXggPSAwOyBwbGFuZUl4IDwgbUxheW91dC5udW1QbGFuZXM7ICsrcGxhbmVJeCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjb2xTYW1wbGluZyA9IG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCByb3dTYW1wbGluZyA9IG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcC5sZWZ0ICUgY29sU2FtcGxpbmcgfHwgY3JvcC5yaWdodCgpICUgY29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjcm9wLnRvcCAlIHJvd1NhbXBsaW5nIHx8IGNyb3AuYm90dG9tKCkgJSByb3dTYW1wbGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGNhbGN1bGF0ZSBkYXRhIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKG1EYXRhLCBjcm9wLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmbUxheW91dCwgMCwgc2l6ZW9mKG1MYXlvdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobU9mZnNldERhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUVycm9yID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1PZmZzZXREYXRhW3BsYW5lSXhdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhW3BsYW5lSXhdICsgKHNzaXplX3QpY3JvcC5sZWZ0ICogbUxheW91dC5wbGFuZXNbcGxhbmVJeF0uY29sSW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHNzaXplX3QpY3JvcC50b3AgKiBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5yb3dJbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhwbGljaXQgTWFwcGVkKGMyX3N0YXR1c190IGVycm9yKQorICAgICAgICAgICAgOiBtSW1wbChudWxscHRyKSwgbVdyaXRhYmxlKGZhbHNlKSwgbUVycm9yKGVycm9yKSB7CisgICAgICAgICAgICAvLyBDSEVDSyhlcnJvciAhPSBDMl9PSyk7CisgICAgICAgICAgICBtZW1zZXQoJm1MYXlvdXQsIDAsIHNpemVvZihtTGF5b3V0KSk7CisgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgbWVtc2V0KG1PZmZzZXREYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgICB+TWFwcGVkKCkgeworICAgICAgICAgICAgaWYgKG1EYXRhWzBdICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT51bm1hcChtRGF0YSwgbUltcGwtPmNyb3AoKSwgbnVsbHB0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogcmV0dXJucyBtYXBwaW5nIHN0YXR1cyAqLworICAgICAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1FcnJvcjsgfQorCisgICAgICAgIC8qKiByZXR1cm5zIGRhdGEgcG9pbnRlciAqLworICAgICAgICB1aW50OF90ICpjb25zdCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1PZmZzZXREYXRhOyB9CisKKyAgICAgICAgLyoqIHJldHVybnMgdGhlIHBsYW5lIGxheW91dCAqLworICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQoKSBjb25zdCB7IHJldHVybiBtTGF5b3V0OyB9CisKKyAgICAgICAgLyoqIHJldHVybnMgd2hldGhlciB0aGUgbWFwcGluZyBpcyB3cml0YWJsZSAqLworICAgICAgICBib29sIHdyaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gbVdyaXRhYmxlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2syREltcGw+IG1JbXBsOworICAgICAgICBib29sIG1Xcml0YWJsZTsKKyAgICAgICAgYzJfc3RhdHVzX3QgbUVycm9yOworICAgICAgICB1aW50OF90ICptRGF0YVtDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworICAgICAgICB1aW50OF90ICptT2Zmc2V0RGF0YVtDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworICAgICAgICBDMlBsYW5hckxheW91dCBtTGF5b3V0OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoZSBhbGxvdHRlZCByZWdpb24uCisgICAgICoKKyAgICAgKiBJZiBhbHJlYWR5IG1hcHBlZCBhbmQgaXQgaXMgY3VycmVudGx5IGluIHVzZSwgcmV0dXJucyB0aGUgZXhpc3RpbmcgbWFwcGluZy4KKyAgICAgKiBJZiBmZW5jZSBpcyBwcm92aWRlZCwgYW4gYWNxdWlyZSBmZW5jZSBpcyBzdG9yZWQgdGhlcmUuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4gbWFwKGJvb2wgd3JpdGFibGUsIEMyRmVuY2UgKmZlbmNlKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NYXBwZWRMb2NrKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4gZXhpc3RpbmcgPSBtTWFwcGVkLmxvY2soKTsKKyAgICAgICAgaWYgKCFleGlzdGluZykgeworICAgICAgICAgICAgZXhpc3RpbmcgPSBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPihuZXcgTWFwcGVkKHNoYXJlZF9mcm9tX3RoaXMoKSwgd3JpdGFibGUsIGZlbmNlKSk7CisgICAgICAgICAgICBtTWFwcGVkID0gZXhpc3Rpbmc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBtYXBwZWQgdGhlIHJlZ2lvbiByZWFkLW9ubHksIHdlIGNhbm5vdCByZW1hcCBpdCByZWFkLXdyaXRlCisgICAgICAgICAgICBpZiAod3JpdGFibGUgJiYgIWV4aXN0aW5nLT53cml0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPihuZXcgTWFwcGVkKEMyX0NBTk5PVF9ETykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZlbmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqZmVuY2UgPSBDMkZlbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4aXN0aW5nOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPE1hcHBlZD4gbU1hcHBlZDsKKyAgICBzdGQ6Om11dGV4IG1NYXBwZWRMb2NrOworfTsKKworY2xhc3MgQzJfSElERSBfQzJNYXBwZWRCbG9jazJESW1wbCA6IHB1YmxpYyBfQzJCbG9jazJESW1wbCB7CitwdWJsaWM6CisgICAgX0MyTWFwcGVkQmxvY2syREltcGwoY29uc3QgX0MyQmxvY2syREltcGwgJmltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nKQorICAgICAgICA6IF9DMkJsb2NrMkRJbXBsKGltcGwpLCBtTWFwcGluZyhtYXBwaW5nKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+X0MyTWFwcGVkQmxvY2syREltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcoKSBjb25zdCB7IHJldHVybiBtTWFwcGluZzsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbU1hcHBpbmc7Cit9OworCisvKioKKyAqIEJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBDMkJsb2NrMkQ6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsIHsKK3B1YmxpYzoKKyAgICB1c2luZyBfQzJNYXBwaW5nQmxvY2syREltcGw6Ol9DMk1hcHBpbmdCbG9jazJESW1wbDsKKyAgICB2aXJ0dWFsIH5JbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworfTsKKworY29uc3QgQzJIYW5kbGUgKkMyQmxvY2syRDo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFuZGxlKCk7Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQmxvY2syRDo6Z2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRBbGxvY2F0b3JJZCgpOworfQorCitDMkJsb2NrMkQ6OkMyQmxvY2syRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbikKKyAgICAvLyBhbHdheXMgY2xhbXAgc3Vic2VjdGlvbiB0byBwYXJlbnQgKGltcGwpIGNyb3AgZm9yIHNhZmV0eQorICAgIDogX0MyUGxhbmFyU2VjdGlvbkFzcGVjdChpbXBsLmdldCgpLCBzZWN0aW9uLmNyb3AoKSksIG1JbXBsKGltcGwpIHsKK30KKworLyoqCisgKiBHcmFwaGljIHZpZXcgaW1wbGVtZW50YXRpb24uCisgKgorICogcmFuZ2Ugb2YgSW1wbCBpcyB0aGUgbWFwcGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24uIHJhbmdlIG9mIFZpZXcgaXMgdGhlIGN1cnJlbnQKKyAqIGNyb3AuCisgKi8KK2NsYXNzIEMyR3JhcGhpY1ZpZXc6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGVkQmxvY2syREltcGwgeworcHVibGljOgorICAgIHVzaW5nIF9DMk1hcHBlZEJsb2NrMkRJbXBsOjpfQzJNYXBwZWRCbG9jazJESW1wbDsKKyAgICB2aXJ0dWFsIH5JbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworfTsKKworQzJHcmFwaGljVmlldzo6QzJHcmFwaGljVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbikKKyAgICA6IF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdChpbXBsLmdldCgpLCBzZWN0aW9uLmNyb3AoKSksIG1JbXBsKGltcGwpIHsKK30KKworY29uc3QgdWludDhfdCAqY29uc3QgKkMyR3JhcGhpY1ZpZXc6OmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmRhdGEoKTsKK30KKwordWludDhfdCAqY29uc3QgKkMyR3JhcGhpY1ZpZXc6OmRhdGEoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmRhdGEoKTsKK30KKworY29uc3QgQzJQbGFuYXJMYXlvdXQgQzJHcmFwaGljVmlldzo6bGF5b3V0KCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5sYXlvdXQoKTsKK30KKworY29uc3QgQzJHcmFwaGljVmlldyBDMkdyYXBoaWNWaWV3OjpzdWJWaWV3KGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3QgeworICAgIHJldHVybiBDMkdyYXBoaWNWaWV3KG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCByZWN0KSk7Cit9CisKK0MyR3JhcGhpY1ZpZXcgQzJHcmFwaGljVmlldzo6c3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpIHsKKyAgICByZXR1cm4gQzJHcmFwaGljVmlldyhtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgcmVjdCkpOworfQorCitjMl9zdGF0dXNfdCBDMkdyYXBoaWNWaWV3OjplcnJvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+ZXJyb3IoKTsKK30KKworLyoqCisgKiBDb25zdCBncmFwaGljIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkNvbnN0R3JhcGhpY0Jsb2NrOjpDMkNvbnN0R3JhcGhpY0Jsb2NrKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbiwgQzJGZW5jZSBmZW5jZSkKKyAgICA6IEMyQmxvY2syRChpbXBsLCBzZWN0aW9uKSwgbUZlbmNlKGZlbmNlKSB7IH0KKworQzJBY3F1aXJhYmxlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IEMyQ29uc3RHcmFwaGljQmxvY2s6Om1hcCgpIGNvbnN0IHsKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZyA9CisgICAgICAgIG1JbXBsLT5tYXAoZmFsc2UgLyogd3JpdGFibGUgKi8sICZmZW5jZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+IGd2aSA9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPihuZXcgR3JhcGhpY1ZpZXdCdWRkeTo6SW1wbCgqbUltcGwsIG1hcHBpbmcpKTsKKyAgICByZXR1cm4gQWNxdWlyYWJsZUNvbnN0R3JhcGhpY1ZpZXdCdWRkeSgKKyAgICAgICAgICAgIG1hcHBpbmctPmVycm9yKCksIGZlbmNlLCBHcmFwaGljVmlld0J1ZGR5KGd2aSwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCgpKSkpOworfQorCitDMkNvbnN0R3JhcGhpY0Jsb2NrIEMyQ29uc3RHcmFwaGljQmxvY2s6OnN1YkJsb2NrKGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3QgeworICAgIHJldHVybiBDMkNvbnN0R3JhcGhpY0Jsb2NrKG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKCkuaW50ZXJzZWN0KHJlY3QpKSwgbUZlbmNlKTsKK30KKworLyoqCisgKiBHcmFwaGljIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkdyYXBoaWNCbG9jazo6QzJHcmFwaGljQmxvY2soCisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pCisgICAgOiBDMkJsb2NrMkQoaW1wbCwgc2VjdGlvbikgeyB9CisKK0MyQWNxdWlyYWJsZTxDMkdyYXBoaWNWaWV3PiBDMkdyYXBoaWNCbG9jazo6bWFwKCkgeworICAgIEMyRmVuY2UgZmVuY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nID0KKyAgICAgICAgbUltcGwtPm1hcCh0cnVlIC8qIHdyaXRhYmxlICovLCAmZmVuY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPiBndmkgPQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4obmV3IEdyYXBoaWNWaWV3QnVkZHk6OkltcGwoKm1JbXBsLCBtYXBwaW5nKSk7CisgICAgcmV0dXJuIEFjcXVpcmFibGVHcmFwaGljVmlld0J1ZGR5KAorICAgICAgICAgICAgbWFwcGluZy0+ZXJyb3IoKSwgZmVuY2UsIEdyYXBoaWNWaWV3QnVkZHkoZ3ZpLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKCkpKSk7Cit9CisKK0MyQ29uc3RHcmFwaGljQmxvY2sgQzJHcmFwaGljQmxvY2s6OnNoYXJlKGNvbnN0IEMyUmVjdCAmY3JvcCwgQzJGZW5jZSBmZW5jZSkgeworICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZGR5KG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKSwgZmVuY2UpOworfQorCisvKioKKyAqIEJhc2ljIGJsb2NrIHBvb2wgaW1wbGVtZW50YXRpb25zLgorICovCitDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbDo6QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworYzJfc3RhdHVzX3QgQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w6OmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBibG9jay0+cmVzZXQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbih3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYWxsb2MpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSwgY29uc3QgQzJSZWN0ICZhbGxvdHRlZENyb3ApIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9jazJEOjpJbXBsPiBpbXBsID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJsb2NrMkQ6OkltcGw+KGFsbG9jLCBkYXRhLCBhbGxvdHRlZENyb3ApOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+KG5ldyBDMkdyYXBoaWNCbG9jayhpbXBsLCAqaW1wbCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgKKyAgICAgICAgY29uc3QgQzJCbG9jazJEICZibG9jaykgeworICAgIGlmIChibG9jay5tSW1wbCkgeworICAgICAgICByZXR1cm4gYmxvY2subUltcGwtPnBvb2xEYXRhKCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY0hhbmRsZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmZGF0YSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvckdyYWxsb2M+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yR3JhbGxvYz4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjSGFuZGxlKSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoY0hhbmRsZSk7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uZmlnIHNldHVwPworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9OworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCVUZGRVIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworY2xhc3MgQzJCdWZmZXJEYXRhOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVHlwZShibG9ja3Muc2l6ZSgpID09IDEgPyBMSU5FQVIgOiBMSU5FQVJfQ0hVTktTKSwKKyAgICAgICAgICBtTGluZWFyQmxvY2tzKGJsb2NrcykgeworICAgIH0KKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVHlwZShibG9ja3Muc2l6ZSgpID09IDEgPyBHUkFQSElDIDogR1JBUEhJQ19DSFVOS1MpLAorICAgICAgICAgIG1HcmFwaGljQmxvY2tzKGJsb2NrcykgeworICAgIH0KKworICAgIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZsaW5lYXJCbG9ja3MoKSBjb25zdCB7IHJldHVybiBtTGluZWFyQmxvY2tzOyB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmdyYXBoaWNCbG9ja3MoKSBjb25zdCB7IHJldHVybiBtR3JhcGhpY0Jsb2NrczsgfQorCitwcml2YXRlOgorICAgIHR5cGVfdCBtVHlwZTsKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IG1MaW5lYXJCbG9ja3M7CisgICAgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gbUdyYXBoaWNCbG9ja3M7Cit9OworCitDMkJ1ZmZlckRhdGE6OkMyQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogbUltcGwobmV3IEltcGwoYmxvY2tzKSkge30KK0MyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpIDogbUltcGwobmV3IEltcGwoYmxvY2tzKSkge30KKworQzJCdWZmZXJEYXRhOjp0eXBlX3QgQzJCdWZmZXJEYXRhOjp0eXBlKCkgY29uc3QgeyByZXR1cm4gbUltcGwtPnR5cGUoKTsgfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IEMyQnVmZmVyRGF0YTo6bGluZWFyQmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bGluZWFyQmxvY2tzKCk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IEMyQnVmZmVyRGF0YTo6Z3JhcGhpY0Jsb2NrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdyYXBoaWNCbG9ja3MoKTsKK30KKworY2xhc3MgQzJCdWZmZXI6OkltcGwgeworcHVibGljOgorICAgIEltcGwoQzJCdWZmZXIgKnRoaXosIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVGhpcyh0aGl6KSwgbURhdGEoYmxvY2tzKSB7fQorICAgIEltcGwoQzJCdWZmZXIgKnRoaXosIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpCisgICAgICAgIDogbVRoaXModGhpeiksIG1EYXRhKGJsb2Nrcykge30KKworICAgIH5JbXBsKCkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtTm90aWZ5KSB7CisgICAgICAgICAgICBwYWlyLmZpcnN0KG1UaGlzLCBwYWlyLnNlY29uZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBDMkJ1ZmZlckRhdGEgJmRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQorCisgICAgYzJfc3RhdHVzX3QgcmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgbU5vdGlmeS5iZWdpbigpLCBtTm90aWZ5LmVuZCgpLAorICAgICAgICAgICAgICAgIFtvbkRlc3Ryb3lOb3RpZnksIGFyZ10gKGNvbnN0IGF1dG8gJnBhaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXIuZmlyc3QgPT0gb25EZXN0cm95Tm90aWZ5ICYmIHBhaXIuc2Vjb25kID09IGFyZzsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGl0ICE9IG1Ob3RpZnkuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9EVVBMSUNBVEU7CisgICAgICAgIH0KKyAgICAgICAgbU5vdGlmeS5lbXBsYWNlX2JhY2sob25EZXN0cm95Tm90aWZ5LCBhcmcpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgICAgICBtTm90aWZ5LmJlZ2luKCksIG1Ob3RpZnkuZW5kKCksCisgICAgICAgICAgICAgICAgW29uRGVzdHJveU5vdGlmeSwgYXJnXSAoY29uc3QgYXV0byAmcGFpcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpci5maXJzdCA9PSBvbkRlc3Ryb3lOb3RpZnkgJiYgcGFpci5zZWNvbmQgPT0gYXJnOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoaXQgPT0gbU5vdGlmeS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBtTm90aWZ5LmVyYXNlKGl0KTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBpbmZvKCkgY29uc3QgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gcmVzdWx0KG1JbmZvcy5zaXplKCkpOworICAgICAgICBzdGQ6OnRyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICBtSW5mb3MuYmVnaW4oKSwgbUluZm9zLmVuZCgpLCByZXN1bHQuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICBbXSAoY29uc3QgYXV0byAmZWxlbSkgeyByZXR1cm4gZWxlbS5zZWNvbmQ7IH0pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGMyX3N0YXR1c190IHNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pIHsKKyAgICAgICAgLy8gVG8gInVwZGF0ZSIgeW91IG5lZWQgdG8gZXJhc2UgdGhlIGV4aXN0aW5nIG9uZSBpZiBhbnksIGFuZCB0aGVuIGluc2VydC4KKyAgICAgICAgKHZvaWQpIG1JbmZvcy5lcmFzZShpbmZvLT5jb3JlSW5kZXgoKSk7CisgICAgICAgICh2b2lkKSBtSW5mb3MuaW5zZXJ0KHsgaW5mby0+Y29yZUluZGV4KCksIGluZm8gfSk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBib29sIGhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUluZm9zLmNvdW50KGluZGV4LmNvcmVJbmRleCgpKSA+IDA7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gZ2V0SW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5mb3MuZmluZChpbmRleC5jb3JlSW5kZXgoKSk7CisgICAgICAgIGlmIChpdCA9PSBtSW5mb3MuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGQ6OmNvbnN0X3BvaW50ZXJfY2FzdDxjb25zdCBDMkluZm8+KGl0LT5zZWNvbmQpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZUluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgeworICAgICAgICBhdXRvIGl0ID0gbUluZm9zLmZpbmQoaW5kZXguY29yZUluZGV4KCkpOworICAgICAgICBpZiAoaXQgPT0gbUluZm9zLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiByZXQgPSBpdC0+c2Vjb25kOworICAgICAgICAodm9pZCkgbUluZm9zLmVyYXNlKGl0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJCdWZmZXIgKiBjb25zdCBtVGhpczsKKyAgICBCdWZmZXJEYXRhQnVkZHkgbURhdGE7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6Q29yZUluZGV4LCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPj4gbUluZm9zOworICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8T25EZXN0cm95Tm90aWZ5LCB2b2lkICo+PiBtTm90aWZ5OworfTsKKworQzJCdWZmZXI6OkMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICA6IG1JbXBsKG5ldyBJbXBsKHRoaXMsIGJsb2NrcykpIHt9CisKK0MyQnVmZmVyOjpDMkJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgIDogbUltcGwobmV3IEltcGwodGhpcywgYmxvY2tzKSkge30KKworY29uc3QgQzJCdWZmZXJEYXRhIEMyQnVmZmVyOjpkYXRhKCkgY29uc3QgeyByZXR1cm4gbUltcGwtPmRhdGEoKTsgfQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlcjo6cmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgcmV0dXJuIG1JbXBsLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShvbkRlc3Ryb3lOb3RpZnksIGFyZyk7Cit9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyOjp1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgIHJldHVybiBtSW1wbC0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShvbkRlc3Ryb3lOb3RpZnksIGFyZyk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBDMkJ1ZmZlcjo6aW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmluZm8oKTsKK30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXI6OnNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pIHsKKyAgICByZXR1cm4gbUltcGwtPnNldEluZm8oaW5mbyk7Cit9CisKK2Jvb2wgQzJCdWZmZXI6Omhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFzSW5mbyhpbmRleCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+IEMyQnVmZmVyOjpnZXRJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEluZm8oaW5kZXgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBDMkJ1ZmZlcjo6cmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSB7CisgICAgcmV0dXJuIG1JbXBsLT5yZW1vdmVJbmZvKGluZGV4KTsKK30KKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoY29uc3QgQzJDb25zdExpbmVhckJsb2NrICZibG9jaykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+KG5ldyBDMkJ1ZmZlcih7IGJsb2NrIH0pKTsKK30KKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4obmV3IEMyQnVmZmVyKHsgYmxvY2sgfSkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2ODBhNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcApAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb25maWciCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8qKgorICogRGVmaW5lIGFuZCBpbml0aWFsaXplIGdsb2JhbCBjb25maWcgZmllbGQgZGVzY3JpcHRvcnMgaW4gdGhpcyBjcHAgZmlsZQorICovCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJDb25maWc6OnByb2ZpbGVfdCwgKHsKKyAgICAgICAgeyAidW51c2VkIiwgQzJDb25maWc6OlBST0ZJTEVfVU5VU0VEIH0sCisgICAgICAgIHsgImFhYy1sYyIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQyB9LAorICAgICAgICB7ICJhYWMtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19NQUlOIH0sCisgICAgICAgIHsgImFhYy1zc3IiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU1NSIH0sCisgICAgICAgIHsgImFhYy1sdHAiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTFRQIH0sCisgICAgICAgIHsgImFhYy1oZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSB9LAorICAgICAgICB7ICJhYWMtc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAiYWFjLWVyLWxjIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX0xDIH0sCisgICAgICAgIHsgImFhYy1lci1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJhYWMtbGQiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQgfSwKKyAgICAgICAgeyAiYWFjLWhlLXBzIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTIH0sCisgICAgICAgIHsgImFhYy1lbGQiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxEIH0sCisgICAgICAgIHsgImFhYy14aGUiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFIH0sCisgICAgICAgIHsgIm1wMnYtc2ltcGxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUgfSwKKyAgICAgICAgeyAibXAydi1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOIH0sCisgICAgICAgIHsgIm1wMnYtc25yLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TTlJfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAibXAydi1zcGF0aWFsbHktc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NQQVRJQUxMWV9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX0hJR0ggfSwKKyAgICAgICAgeyAibXAydi00MjIiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWXzQyMiB9LAorICAgICAgICB7ICJtcDJ2LW11bHRpdmlldyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTVVMVElWSUVXIH0sCisgICAgICAgIHsgImgyNjMtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImgyNjMtaDMyMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSDMyMCB9LAorICAgICAgICB7ICJoMjYzLXYxYmMiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX1YxQkMgfSwKKyAgICAgICAgeyAiaDI2My1pc3d2MiIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjIgfSwKKyAgICAgICAgeyAiaDI2My1pc3d2MyIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjMgfSwKKyAgICAgICAgeyAiaDI2My1oaWdoLWNvbXByZXNzaW9uIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19ISUdIX0NPTVBSRVNTSU9OIH0sCisgICAgICAgIHsgImgyNjMtaW50ZXJuZXQiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTkVUIH0sCisgICAgICAgIHsgImgyNjMtaW50ZXJsYWNlIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUkxBQ0UgfSwKKyAgICAgICAgeyAiaDI2My1oaWdoLWxhdGVuY3kiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfTEFURU5DWSB9LAorICAgICAgICB7ICJtcDR2LXNpbXBsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAibXA0di1jb3JlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFIH0sCisgICAgICAgIHsgIm1wNHYtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTUFJTiB9LAorICAgICAgICB7ICJtcDR2LW5iaXQiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX05CSVQgfSwKKyAgICAgICAgeyAibXA0di1hcnRzIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BUlRTIH0sCisgICAgICAgIHsgIm1wNHYtY29yZS1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDR2LWFjZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQUNFIH0sCisgICAgICAgIHsgIm1wNHYtYWR2YW5jZWQtY29yZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfQ09SRSB9LAorICAgICAgICB7ICJtcDR2LXNpbXBsZS1zdHVkaW8iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRV9TVFVESU8gfSwKKyAgICAgICAgeyAibXA0di1jb3JlLXN0dWRpbyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TVFVESU8gfSwKKyAgICAgICAgeyAibXA0di1hZHZhbmNlZC1zaW1wbGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FEVkFOQ0VEX1NJTVBMRSB9LAorICAgICAgICB7ICJtcDR2LWZncyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfRkdTIH0sCisgICAgICAgIHsgImF2Yy1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtY29uc3RyYWluZWQtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiB9LAorICAgICAgICB7ICJhdmMtZXh0ZW5kZWQiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfRVhURU5ERUQgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSCB9LAorICAgICAgICB7ICJhdmMtcHJvZ3Jlc3NpdmUtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1jb25zdHJhaW5lZC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF8xMCB9LAorICAgICAgICB7ICJhdmMtcHJvZ3Jlc3NpdmUtaGlnaC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQyMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMiB9LAorICAgICAgICB7ICJhdmMtaGlnaC00NDQtcHJlZGljdGl2ZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9QUkVESUNUSVZFIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDIyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDIyX0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQ0NC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtY2F2bGMtNDQ0LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NBVkxDXzQ0NF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWNvbnN0cmFpbmVkLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0NPTlNUUkFJTkVEX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWNvbnN0cmFpbmVkLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfSElHSCB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtaGlnaC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9ISUdIX0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1tdWx0aXZpZXctaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NVUxUSVZJRVdfSElHSCB9LAorICAgICAgICB7ICJhdmMtc3RlcmVvLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU1RFUkVPX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLW1mYy1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01GQ19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1tdWx0aXZpZXctZGVwdGgtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NVUxUSVZJRVdfREVQVEhfSElHSCB9LAorICAgICAgICB7ICJhdmMtbWZjLWRlcHRoLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUZDX0RFUFRIX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLWVuaGFuY2VkLW11bHRpdmlldy1kZXB0aC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0VOSEFOQ0VEX01VTFRJVklFV19ERVBUSF9ISUdIIH0sCisgICAgICAgIHsgImhldmMtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLXN0aWxsIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtbW9ubyIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTU9OTyB9LAorICAgICAgICB7ICJoZXZjLW1vbm8tMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01PTk9fMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1tb25vLTE2IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NT05PXzE2IH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4taW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTE2LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LXN0aWxsIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF9TVElMTCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTE2LXN0aWxsIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9TVElMTCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0LTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xMCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0LTE0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0LTE2LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9NQUlOXzEwIH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbi00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0IH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbi00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtc3gtaGlnaC00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0IH0sCisgICAgICAgIHsgImhldmMtc3gtaGlnaC00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtc3gtaGlnaC00NDQtMTQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0XzE0IH0sCisgICAgICAgIHsgImhldmMtbXVsdGl2aWV3LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01VTFRJVklFV19NQUlOIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1haW4tMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tb25vIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbW9uby0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xMiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1vbm8tMTYiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTYgfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tYWluLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy0zZC1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ18zRF9NQUlOIH0sCisgICAgICAgIHsgInZwOS0wIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzAgfSwKKyAgICAgICAgeyAidnA5LTEiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMSB9LAorICAgICAgICB7ICJ2cDktMiIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yIH0sCisgICAgICAgIHsgInZwOS0zIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMgfSwKKyAgICAgICAgeyAiYXYxLTAiLCBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCB9LAorICAgICAgICB7ICJhdjEtMSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8xIH0sCisgICAgICAgIHsgImF2MS0yIiwgQzJDb25maWc6OlBST0ZJTEVfQVYxXzIgfSwKK30pKQorCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKEMyQ29uZmlnOjpsZXZlbF90LCAoeworICAgICAgICB7ICJ1bnVzZWQiLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEIH0sCisgICAgICAgIHsgIm1wMnYtbG93IiwgQzJDb25maWc6OkxFVkVMX01QMlZfTE9XIH0sCisgICAgICAgIHsgIm1wMnYtbWFpbiIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4gfSwKKyAgICAgICAgeyAibXAydi1oaWdoLTE0NDAiLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIXzE0NDAgfSwKKyAgICAgICAgeyAibXAydi1oaWdoIiwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSCB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2hwIiwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSFAgfSwKKyAgICAgICAgeyAiaDI2My0xMCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwIH0sCisgICAgICAgIHsgImgyNjMtMjAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCB9LAorICAgICAgICB7ICJoMjYzLTMwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAgfSwKKyAgICAgICAgeyAiaDI2My00MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwIH0sCisgICAgICAgIHsgImgyNjMtNDUiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M180NSB9LAorICAgICAgICB7ICJoMjYzLTUwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNTAgfSwKKyAgICAgICAgeyAiaDI2My02MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzYwIH0sCisgICAgICAgIHsgImgyNjMtNzAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M183MCB9LAorICAgICAgICB7ICJtcDR2LTAiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wIH0sCisgICAgICAgIHsgIm1wNHYtMGIiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wQiB9LAorICAgICAgICB7ICJtcDR2LTEiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xIH0sCisgICAgICAgIHsgIm1wNHYtMiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzIgfSwKKyAgICAgICAgeyAibXA0di0zIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMyB9LAorICAgICAgICB7ICJtcDR2LTNiIiwgQzJDb25maWc6OkxFVkVMX01QNFZfM0IgfSwKKyAgICAgICAgeyAibXA0di00IiwgQzJDb25maWc6OkxFVkVMX01QNFZfNCB9LAorICAgICAgICB7ICJtcDR2LTRhIiwgQzJDb25maWc6OkxFVkVMX01QNFZfNEEgfSwKKyAgICAgICAgeyAibXA0di01IiwgQzJDb25maWc6OkxFVkVMX01QNFZfNSB9LAorICAgICAgICB7ICJtcDR2LTYiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl82IH0sCisgICAgICAgIHsgImF2Yy0xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xIH0sCisgICAgICAgIHsgImF2Yy0xYiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMUIgfSwKKyAgICAgICAgeyAiYXZjLTEuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8xIH0sCisgICAgICAgIHsgImF2Yy0xLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMiB9LAorICAgICAgICB7ICJhdmMtMS4zIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMgfSwKKyAgICAgICAgeyAiYXZjLTIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzIgfSwKKyAgICAgICAgeyAiYXZjLTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8xIH0sCisgICAgICAgIHsgImF2Yy0yLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiB9LAorICAgICAgICB7ICJhdmMtMyIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMyB9LAorICAgICAgICB7ICJhdmMtMy4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzEgfSwKKyAgICAgICAgeyAiYXZjLTMuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfM18yIH0sCisgICAgICAgIHsgImF2Yy00IiwgQzJDb25maWc6OkxFVkVMX0FWQ180IH0sCisgICAgICAgIHsgImF2Yy00LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMSB9LAorICAgICAgICB7ICJhdmMtNC4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ180XzIgfSwKKyAgICAgICAgeyAiYXZjLTUiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzUgfSwKKyAgICAgICAgeyAiYXZjLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8xIH0sCisgICAgICAgIHsgImF2Yy01LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMiB9LAorICAgICAgICB7ICJhdmMtNiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNiB9LAorICAgICAgICB7ICJhdmMtNi4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ182XzEgfSwKKyAgICAgICAgeyAiYXZjLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNl8yIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0yLjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMyIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMyB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMy4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzQgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNF8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi01IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81IH0sCisgICAgICAgIHsgImhldmMtbWFpbi01LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNS4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTYiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzYgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi02LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzZfMiB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNCIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNC4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTUiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzUgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8xIH0sCisgICAgICAgIHsgImhldmMtaGlnaC01LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMiB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNiB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNi4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8yIH0sCisgICAgICAgIHsgInZwOS0xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8xIH0sCisgICAgICAgIHsgInZwOS0xLjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzFfMSB9LAorICAgICAgICB7ICJ2cDktMiIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMiB9LAorICAgICAgICB7ICJ2cDktMi4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEgfSwKKyAgICAgICAgeyAidnA5LTMiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzMgfSwKKyAgICAgICAgeyAidnA5LTMuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfM18xIH0sCisgICAgICAgIHsgInZwOS00IiwgQzJDb25maWc6OkxFVkVMX1ZQOV80IH0sCisgICAgICAgIHsgInZwOS00LjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzRfMSB9LAorICAgICAgICB7ICJ2cDktNSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNSB9LAorICAgICAgICB7ICJ2cDktNS4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV81XzEgfSwKKyAgICAgICAgeyAidnA5LTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNV8yIH0sCisgICAgICAgIHsgInZwOS02IiwgQzJDb25maWc6OkxFVkVMX1ZQOV82IH0sCisgICAgICAgIHsgInZwOS02LjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMSB9LAorICAgICAgICB7ICJ2cDktNi4yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV82XzIgfSwKKyAgICAgICAgeyAiYXYxLTIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzIgfSwKKyAgICAgICAgeyAiYXYxLTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8xIH0sCisgICAgICAgIHsgImF2MS0yLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMiB9LAorICAgICAgICB7ICJhdjEtMi4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzMgfSwKKyAgICAgICAgeyAiYXYxLTMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzMgfSwKKyAgICAgICAgeyAiYXYxLTMuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18xIH0sCisgICAgICAgIHsgImF2MS0zLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMiB9LAorICAgICAgICB7ICJhdjEtMy4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV8zXzMgfSwKKyAgICAgICAgeyAiYXYxLTQiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzQgfSwKKyAgICAgICAgeyAiYXYxLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8xIH0sCisgICAgICAgIHsgImF2MS00LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMiB9LAorICAgICAgICB7ICJhdjEtNC4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV80XzMgfSwKKyAgICAgICAgeyAiYXYxLTUiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzUgfSwKKyAgICAgICAgeyAiYXYxLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8xIH0sCisgICAgICAgIHsgImF2MS01LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMiB9LAorICAgICAgICB7ICJhdjEtNS4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV81XzMgfSwKKyAgICAgICAgeyAiYXYxLTYiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzYgfSwKKyAgICAgICAgeyAiYXYxLTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8xIH0sCisgICAgICAgIHsgImF2MS02LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMiB9LAorICAgICAgICB7ICJhdjEtNi4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV82XzMgfSwKKyAgICAgICAgeyAiYXYxLTciLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzcgfSwKKyAgICAgICAgeyAiYXYxLTcuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfN18xIH0sCisgICAgICAgIHsgImF2MS03LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMiB9LAorICAgICAgICB7ICJhdjEtNy4zIiwgQzJDb25maWc6OkxFVkVMX0FWMV83XzMgfSwKK30pKQorCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKEMyQnVmZmVyRGF0YTo6dHlwZV90LCAoeworICAgICAgICB7ICJpbnZhbGlkIiwgICAgICAgIEMyQnVmZmVyRGF0YTo6SU5WQUxJRCB9LAorICAgICAgICB7ICJsaW5lYXIiLCAgICAgICAgIEMyQnVmZmVyRGF0YTo6TElORUFSIH0sCisgICAgICAgIHsgImxpbmVhci1jaHVua3MiLCAgQzJCdWZmZXJEYXRhOjpMSU5FQVJfQ0hVTktTIH0sCisgICAgICAgIHsgImdyYXBoaWMiLCAgICAgICAgQzJCdWZmZXJEYXRhOjpHUkFQSElDIH0sCisgICAgICAgIHsgImdyYXBoaWMtY2h1bmtzIiwgQzJCdWZmZXJEYXRhOjpHUkFQSElDX0NIVU5LUyB9LAorfSkpCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzMzBlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyIgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmgiCisKKy8qIHN0YXRpYyAqLyBhbmRyb2lkOjpNdXRleCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OnNNdXRleDsKKy8qIHN0YXRpYyAqLyBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OnNJbnN0YW5jZTsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitjb25zdGV4cHIgY29uc3QgY2hhciBrU3RvcmVQbHVnaW5QYXRoW10gPSAibGliYzJwbHVnaW5fc3RvcmUuc28iOworCit9ICAvLyB1bm5hbWVkCisKK0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpCisgICAgOiBtQ3JlYXRlQmxvY2tQb29sKG51bGxwdHIpIHsKKyAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XIHwgUlRMRF9OT0RFTEVURSk7CisgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGxvYWQgbGlicmFyeTogJXMgKCVzKSIsIGxpYlBhdGgsIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNyZWF0ZUJsb2NrUG9vbCA9IChDcmVhdGVCbG9ja1Bvb2xGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVCbG9ja1Bvb2wiKTsKKyAgICBpZiAobUNyZWF0ZUJsb2NrUG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUJsb2NrUG9vbCAoJXMpIiwgZGxlcnJvcigpKTsKKyAgICB9CisgICAgbUNyZWF0ZUFsbG9jYXRvciA9IChDcmVhdGVBbGxvY2F0b3JGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVBbGxvY2F0b3IiKTsKKyAgICBpZiAobUNyZWF0ZUFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUFsbG9jYXRvciAoJXMpIiwgZGxlcnJvcigpKTsKKyAgICB9Cit9CisKK0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6fkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcigpIHsKKyAgICBpZiAobUxpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJDbG9zaW5nIGhhbmRsZSIpOworICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgIDo6QzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQsIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4qIHBvb2wpIHsKKyAgICBpZiAobUNyZWF0ZUJsb2NrUG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJIYW5kbGUgb3IgQ3JlYXRlQmxvY2tQb29sIHN5bWJvbCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPDo6QzJCbG9ja1Bvb2w+IHB0cihtQ3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBibG9ja1Bvb2xJZCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgQUxPR0QoIkZhaWxlZCB0byBDcmVhdGVCbG9ja1Bvb2wgYnkgYWxsb2NhdG9yIGlkOiAldSIsIGFsbG9jYXRvcklkKTsKKyAgICByZXR1cm4gQzJfQkFEX0lOREVYOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OmNyZWF0ZUFsbG9jYXRvcigKKyAgICAgICAgOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKSB7CisgICAgaWYgKG1DcmVhdGVBbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUFsbG9jYXRvciBzeW1ib2wgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX0NPUlJVUFRFRDsKKyAgICBhbGxvY2F0b3ItPnJlc2V0KG1DcmVhdGVBbGxvY2F0b3IoYWxsb2NhdG9ySWQsICZyZXMpKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gQ3JlYXRlQWxsb2NhdG9yIGJ5IGlkOiAldSwgcmVzOiAlZCIsIGFsbG9jYXRvcklkLCByZXMpOworICAgICAgICBhbGxvY2F0b3ItPnJlc2V0KCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gc3RhdGljCitjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiYgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpHZXRJbnN0YW5jZSgpIHsKKyAgICBhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgX2woc011dGV4KTsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBBTE9HVigiTG9hZGluZyBsaWJyYXJ5Iik7CisgICAgICAgIHNJbnN0YW5jZS5yZXNldChuZXcgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKGtTdG9yZVBsdWdpblBhdGgpKTsKKyAgICB9CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3NTg0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwCkBAIC0wLDAgKzEsOTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDMlN0b3JlIgorI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPiAvLyBnZXRwYWdlc2l6ZQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBjb21wb25lbnQgc3RvcmUgaW4gdGhpcyBwcm9jZXNzIHRvIGFjY2VzcyBpdHMgaW50ZXJmYWNlLgorICovCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoKTsKKworLyoqCisgKiBUaGUgcGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlIHByb3ZpZGVzIGJhc2ljIGFsbG9jYXRvci10eXBlcyBmb3IgdGhlIGZyYW1ld29yayBiYXNlZCBvbiBpb24gYW5kCisgKiBncmFsbG9jLiBBbGxvY2F0b3JzIGFyZSBub3QgbWVhbnQgdG8gYmUgdXBkYXRhYmxlLgorICoKKyAqIFx0b2RvIFByb3ZpZGUgYWxsb2NhdG9yIGJhc2VkIG9uIGFzaG1lbQorICogXHRvZG8gTW92ZSBpb24gYWxsb2NhdGlvbiBpbnRvIGl0cyBISURMIG9yIHByb3ZpZGUgc29tZSBtYXBwaW5nIGZyb20gbWVtb3J5IHVzYWdlIHRvIGlvbiBmbGFncworICogXHRvZG8gTWFrZSB0aGlzIGFsbG9jYXRvciBzdG9yZSBleHRlbmRhYmxlCisgKi8KK2NsYXNzIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwgOiBwdWJsaWMgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlIHsKK3B1YmxpYzoKKyAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCk7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAqY29uc3QgYWxsb2NhdG9yKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+PiBsaXN0QWxsb2NhdG9yc19uYigpCisgICAgICAgICAgICBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+KCk7IC8vLyBcdG9kbworICAgIH0KKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJhbmRyb2lkLmFsbG9jYXRvci1zdG9yZSI7CisgICAgfQorCisgICAgdm9pZCBzZXRDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpOworCisgICAgfkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGlvbiBhbGxvY2F0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoSW9uQWxsb2NhdG9yKCk7CisKKyAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gZ3JhbGxvYyBhbGxvY2F0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoR3JhbGxvY0FsbG9jYXRvcigpOworCisgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGJ1ZmZlcnF1ZXVlIHN1cHBvcnRpbmcgZ3JhbGxvYyBhbGxvY2F0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoQnVmZmVyUXVldWVBbGxvY2F0b3IoKTsKKworICAgIC8vLyBjb21wb25lbnQgc3RvcmUgdG8gdXNlCisgICAgc3RkOjptdXRleCBfbUNvbXBvbmVudFN0b3JlU2V0TG9jazsgLy8gcHJvdGVjdHMgdGhlIGVudGlyZSB1cGRhdGluZyBfbUNvbXBvbmVudFN0b3JlIGFuZCBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMKKyAgICBzdGQ6Om11dGV4IF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jazsgLy8gbXVzdCBwcm90ZWN0IG9ubHkgcmVhZC93cml0ZSBvZiBfbUNvbXBvbmVudFN0b3JlCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IF9tQ29tcG9uZW50U3RvcmU7Cit9OworCitDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaEFsbG9jYXRvcigKKyAgICAgICAgaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAqY29uc3QgYWxsb2NhdG9yKSB7CisgICAgYWxsb2NhdG9yLT5yZXNldCgpOworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAvLyBUT0RPOiBzaG91bGQgd2UgaW1wbGVtZW50IGEgZ2VuZXJpYyByZWdpc3RyeSBmb3IgYWxsLCBhbmQgdXNlIHRoYXQ/CisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjoKKyAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOgorICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hJb25BbGxvY2F0b3IoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQzoKKyAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQzoKKyAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoR3JhbGxvY0FsbG9jYXRvcigpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRToKKyAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoQnVmZmVyUXVldWVBbGxvY2F0b3IoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIGFsbG9jYXRvciBmcm9tIHBsYXRmb3JtIHN0b3JlIHBsdWdpbnMuCisgICAgICAgIGMyX3N0YXR1c190IHJlcyA9CisgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpHZXRJbnN0YW5jZSgpLT5jcmVhdGVBbGxvY2F0b3IoaWQsIGFsbG9jYXRvcik7CisgICAgICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgqYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCituYW1lc3BhY2UgeworCitzdGQ6Om11dGV4IGdJb25BbGxvY2F0b3JNdXRleDsKK3N0ZDo6d2Vha19wdHI8QzJBbGxvY2F0b3JJb24+IGdJb25BbGxvY2F0b3I7CisKK3ZvaWQgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpIHsKKyAgICBDMkFsbG9jYXRvcklvbjo6VXNhZ2VNYXBwZXJGbiBtYXBwZXI7CisgICAgdWludDY0X3QgbWluVXNhZ2UgPSAwOworICAgIHVpbnQ2NF90IG1heFVzYWdlID0gQzJNZW1vcnlVc2FnZShDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKS5leHBlY3RlZDsKKyAgICBzaXplX3QgYmxvY2tTaXplID0gZ2V0cGFnZXNpemUoKTsKKworICAgIC8vIHF1ZXJ5IG1pbiBhbmQgbWF4IHVzYWdlIGFzIHdlbGwgYXMgYmxvY2sgc2l6ZSB2aWEgc3VwcG9ydGVkIHZhbHVlcworICAgIEMyU3RvcmVJb25Vc2FnZUluZm8gdXNhZ2VJbmZvOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcXVlcnkgPSB7CisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkOjpNYWtlKHVzYWdlSW5mbywgdXNhZ2VJbmZvLnVzYWdlKSksCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkOjpNYWtlKHVzYWdlSW5mbywgdXNhZ2VJbmZvLmNhcGFjaXR5KSksCisgICAgfTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBzdG9yZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20ocXVlcnkpOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgaWYgKHF1ZXJ5WzBdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmZnN2ID0gcXVlcnlbMF0udmFsdWVzOworICAgICAgICAgICAgaWYgKGZzdi50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTICYmICFmc3YudmFsdWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtaW5Vc2FnZSA9IGZzdi52YWx1ZXNbMF0udTY0OworICAgICAgICAgICAgICAgIG1heFVzYWdlID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSB2IDogZnN2LnZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICBtYXhVc2FnZSB8PSB2LnU2NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXJ5WzFdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmZnN2ID0gcXVlcnlbMV0udmFsdWVzOworICAgICAgICAgICAgaWYgKGZzdi50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFICYmIGZzdi5yYW5nZS5zdGVwLnUzMiA+IDApIHsKKyAgICAgICAgICAgICAgICBibG9ja1NpemUgPSBmc3YucmFuZ2Uuc3RlcC51MzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYXBwZXIgPSBbc3RvcmVdKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsaWduLCB1bnNpZ25lZCAqaGVhcE1hc2ssIHVuc2lnbmVkICpmbGFncykgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgaWYgKGNhcGFjaXR5ID4gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMlN0b3JlSW9uVXNhZ2VJbmZvIHVzYWdlSW5mbyA9IHsgdXNhZ2UuZXhwZWN0ZWQsIGNhcGFjaXR5IH07CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7IC8vIFRPRE86IHJlbW92ZQorICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gc3RvcmUtPmNvbmZpZ19zbSh7JnVzYWdlSW5mb30sICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgKmFsaWduID0gdXNhZ2VJbmZvLm1pbkFsaWdubWVudDsKKyAgICAgICAgICAgICAgICAqaGVhcE1hc2sgPSB1c2FnZUluZm8uaGVhcE1hc2s7CisgICAgICAgICAgICAgICAgKmZsYWdzID0gdXNhZ2VJbmZvLmFsbG9jRmxhZ3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9OworICAgIH0KKworICAgIGFsbG9jYXRvci0+c2V0VXNhZ2VNYXBwZXIobWFwcGVyLCBtaW5Vc2FnZSwgbWF4VXNhZ2UsIGJsb2NrU2l6ZSk7Cit9CisKK30KKwordm9pZCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpzZXRDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpIHsKKyAgICAvLyB0ZWNobmljYWxseSB0aGlzIHNldCBsb2NrIGlzIG5vdCBuZWVkZWQsIGJ1dCBpcyBoZXJlIGZvciBzYWZldHkgaW4gY2FzZSB3ZSBhZGQgbW9yZQorICAgIC8vIGdldHRlciBvcmRlcnMKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbUNvbXBvbmVudFN0b3JlU2V0TG9jayk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbUNvbXBvbmVudFN0b3JlUmVhZExvY2spOworICAgICAgICBfbUNvbXBvbmVudFN0b3JlID0gc3RvcmU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ0lvbkFsbG9jYXRvck11dGV4KTsKKyAgICAgICAgYWxsb2NhdG9yID0gZ0lvbkFsbG9jYXRvci5sb2NrKCk7CisgICAgfQorICAgIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgICAgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoYWxsb2NhdG9yLCBzdG9yZSk7CisgICAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoSW9uQWxsb2NhdG9yKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdJb25BbGxvY2F0b3JNdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9ySW9uPiBhbGxvY2F0b3IgPSBnSW9uQWxsb2NhdG9yLmxvY2soKTsKKyAgICBpZiAoYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGNvbXBvbmVudFN0b3JlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbUNvbXBvbmVudFN0b3JlUmVhZExvY2spOworICAgICAgICAgICAgY29tcG9uZW50U3RvcmUgPSBfbUNvbXBvbmVudFN0b3JlOworICAgICAgICB9CisgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JJb24+KEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OKTsKKyAgICAgICAgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoYWxsb2NhdG9yLCBjb21wb25lbnRTdG9yZSk7CisgICAgICAgIGdJb25BbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hHcmFsbG9jQWxsb2NhdG9yKCkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9yPiBncmFsbG9jQWxsb2NhdG9yOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvciA9IGdyYWxsb2NBbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yR3JhbGxvYz4oQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DKTsKKyAgICAgICAgZ3JhbGxvY0FsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICB9CisgICAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaEJ1ZmZlclF1ZXVlQWxsb2NhdG9yKCkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9yPiBncmFsbG9jQWxsb2NhdG9yOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvciA9IGdyYWxsb2NBbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yR3JhbGxvYz4oCisgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwgdHJ1ZSk7CisgICAgICAgIGdyYWxsb2NBbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKK25hbWVzcGFjZSB7CisgICAgc3RkOjptdXRleCBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmVNdXRleDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlOworCisgICAgc3RkOjptdXRleCBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZU11dGV4OworICAgIHN0ZDo6d2Vha19wdHI8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4gZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlTXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPiBzdG9yZSA9IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlLmxvY2soKTsKKyAgICBpZiAoc3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBzdG9yZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4oKTsKKyAgICAgICAgc3RvcmUtPnNldENvbXBvbmVudFN0b3JlKEdldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKCkpOworICAgICAgICBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSA9IHN0b3JlOworICAgIH0KKyAgICByZXR1cm4gc3RvcmU7Cit9CisKK3ZvaWQgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGNvbXBvbmVudFN0b3JlKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOyAvLyBkb24ndCBpbnRlcmxldmUgc2V0LXMKKworICAgIC8vIHVwZGF0ZSBwcmVmZXJyZWQgc3RvcmUKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZU11dGV4KTsKKyAgICAgICAgZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlID0gY29tcG9uZW50U3RvcmU7CisgICAgfQorCisgICAgLy8gdXBkYXRlIHBsYXRmb3JtIGFsbG9jYXRvcidzIHN0b3JlIGFzIHdlbGwgaWYgaXQgaXMgYWxpdmUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4gYWxsb2NhdG9yU3RvcmU7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZU11dGV4KTsKKyAgICAgICAgYWxsb2NhdG9yU3RvcmUgPSBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZS5sb2NrKCk7CisgICAgfQorICAgIGlmIChhbGxvY2F0b3JTdG9yZSkgeworICAgICAgICBhbGxvY2F0b3JTdG9yZS0+c2V0Q29tcG9uZW50U3RvcmUoY29tcG9uZW50U3RvcmUpOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZU11dGV4KTsKKyAgICByZXR1cm4gZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlID8gZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlIDogR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworfQorCituYW1lc3BhY2UgeworCitjbGFzcyBfQzJCbG9ja1Bvb2xDYWNoZSB7CitwdWJsaWM6CisgICAgX0MyQmxvY2tQb29sQ2FjaGUoKSA6IG1CbG9ja1Bvb2xTZXFJZChDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQgKyAxKSB7fQorCisgICAgYzJfc3RhdHVzX3QgX2NyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPQorICAgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX05PVF9GT1VORDsKKworICAgICAgICBzd2l0Y2goYWxsb2NhdG9ySWQpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT046CisgICAgICAgICAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOgorICAgICAgICAgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvciwgcG9vbElkKTsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0M6CisgICAgICAgICAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQzoKKyAgICAgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUMsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4oYWxsb2NhdG9yLCBwb29sSWQpOworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUU6CisgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvciwgcG9vbElkKTsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIGJsb2NrIHBvb2wgZnJvbSBwbGF0Zm9ybSBzdG9yZSBwbHVnaW5zLgorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyOworICAgICAgICAgICAgICAgIHJlcyA9IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6R2V0SW5zdGFuY2UoKS0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9ySWQsIHBvb2xJZCwgJnB0cik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICAgICAgcmV0dXJuIF9jcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGNvbXBvbmVudCwgbUJsb2NrUG9vbFNlcUlkKyssIHBvb2wpOworICAgIH0KKworICAgIGJvb2wgZ2V0QmxvY2tQb29sKAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9uZSBpdGVyYXRvciBmb3IgbXVsdGlwbGUgYmxvY2twb29sIHR5cGUgc2NhbGFiaWxpdHkuCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyOworICAgICAgICBhdXRvIGl0ID0gbUJsb2NrUG9vbHMuZmluZChibG9ja1Bvb2xJZCk7CisgICAgICAgIGlmIChpdCAhPSBtQmxvY2tQb29scy5lbmQoKSkgeworICAgICAgICAgICAgcHRyID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIXB0cikgeworICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50cy5lcmFzZShibG9ja1Bvb2xJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1dG8gZm91bmQgPSBtQ29tcG9uZW50cy5maW5kKGJsb2NrUG9vbElkKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ID09IGZvdW5kLT5zZWNvbmQubG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sU2VxSWQ7CisKKyAgICBzdGQ6Om1hcDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCwgc3RkOjp3ZWFrX3B0cjxDMkJsb2NrUG9vbD4+IG1CbG9ja1Bvb2xzOworICAgIHN0ZDo6bWFwPEMyQmxvY2tQb29sOjpsb2NhbF9pZF90LCBzdGQ6OndlYWtfcHRyPGNvbnN0IEMyQ29tcG9uZW50Pj4gbUNvbXBvbmVudHM7Cit9OworCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPF9DMkJsb2NrUG9vbENhY2hlPiBzQmxvY2tQb29sQ2FjaGUgPQorICAgIHN0ZDo6bWFrZV91bmlxdWU8X0MyQmxvY2tQb29sQ2FjaGU+KCk7CitzdGF0aWMgc3RkOjptdXRleCBzQmxvY2tQb29sQ2FjaGVNdXRleDsKKworfSAvLyBhbnlueW1vdXMgbmFtZXNwYWNlCisKK2MyX3N0YXR1c190IEdldENvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgcG9vbC0+cmVzZXQoKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzQmxvY2tQb29sQ2FjaGVNdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX05PVF9GT1VORDsKKworICAgIGlmIChpZCA+PSBDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQpIHsKKyAgICAgICAgaWYgKHNCbG9ja1Bvb2xDYWNoZS0+Z2V0QmxvY2tQb29sKGlkLCBjb21wb25lbnQsIHBvb2wpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOgorICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZhbGxvY2F0b3IpOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAqcG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJCYXNpY0xpbmVhckJsb2NrUG9vbD4oYWxsb2NhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDOgorICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgKnBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmFzaWNHcmFwaGljQmxvY2tQb29sPihhbGxvY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzLiB0aGlzIGlzIHRlbXBvcmFyeQorICAgIGNhc2UgQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUOgorICAgICAgICByZXMgPSBzQmxvY2tQb29sQ2FjaGUtPl9jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwgY29tcG9uZW50LCBpZCwgcG9vbCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDcmVhdGVDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICBwb29sLT5yZXNldCgpOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0Jsb2NrUG9vbENhY2hlTXV0ZXgpOworICAgIHJldHVybiBzQmxvY2tQb29sQ2FjaGUtPmNyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBwb29sKTsKK30KKworY2xhc3MgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworcHVibGljOgorICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBsaXN0Q29tcG9uZW50cygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICpjb25zdCBpbnRlcmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBzcmMsIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IGRzdCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlOworICAgIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworCisgICAgdmlydHVhbCB+QzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IGVuY2Fwc3VsYXRpbmcgYSBsb2FkZWQgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgKgorICAgICAqIFx0b2RvIHByb3ZpZGUgYSB3YXkgdG8gYWRkIHRyYWl0cyB0byBrbm93biBjb21wb25lbnRzIGhlcmUgdG8gYXZvaWQgbG9hZGluZyB0aGUgLnNvLXMKKyAgICAgKiBmb3IgbGlzdENvbXBvbmVudHMKKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29tcG9uZW50TW9kdWxlIDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSwKKyAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPENvbXBvbmVudE1vZHVsZT4geworICAgICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICBDb21wb25lbnREZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50PigpKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudEludGVyZmFjZT4oKSkgb3ZlcnJpZGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFxyZXR1cm5zIHRoZSB0cmFpdHMgb2YgdGhlIGNvbXBvbmVudCBpbiB0aGlzIG1vZHVsZS4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiBnZXRUcmFpdHMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBuYW1lW2luXSAgY29tcG9uZW50IG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIE9ubHkgdXNlZCBieSBDb21wb25lbnRMb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBDb21wb25lbnRNb2R1bGUoKQorICAgICAgICAgICAgOiBtSW5pdChDMl9OT19JTklUKSwKKyAgICAgICAgICAgICAgbUxpYkhhbmRsZShudWxscHRyKSwKKyAgICAgICAgICAgICAgY3JlYXRlRmFjdG9yeShudWxscHRyKSwKKyAgICAgICAgICAgICAgZGVzdHJveUZhY3RvcnkobnVsbHB0ciksCisgICAgICAgICAgICAgIG1Db21wb25lbnRGYWN0b3J5KG51bGxwdHIpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplcyBhIGNvbXBvbmVudCBtb2R1bGUgd2l0aCBhIGdpdmVuIGxpYnJhcnkgcGF0aC4gTXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBcbm90ZSBPbmx5IHVzZWQgYnkgQ29tcG9uZW50TG9hZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gbGliUGF0aFtpbl0gbGlicmFyeSBwYXRoCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgbW9kdWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gbG9hZGluZyB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBjb3VsZCBub3QgbG9jYXRlIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBjb21wb25lbnQgbW9kdWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQgKHVuZXhwZWN0ZWQpCisgICAgICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIHBlcm1pc3Npb24gZGVuaWVkIHRvIGxvYWQgdGhlIGNvbXBvbmVudCBtb2R1bGUgKHVuZXhwZWN0ZWQpCisgICAgICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBsb2FkIHRoZSBtb2R1bGUgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgaW5pdChzdGQ6OnN0cmluZyBsaWJQYXRoKTsKKworICAgICAgICB2aXJ0dWFsIH5Db21wb25lbnRNb2R1bGUoKSBvdmVycmlkZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggbUxvY2s7IC8vLzwgbG9jayBwcm90ZWN0aW5nIG1UcmFpdHMKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpUcmFpdHM+IG1UcmFpdHM7IC8vLzwgY2FjaGVkIGNvbXBvbmVudCB0cmFpdHMKKworICAgICAgICBjMl9zdGF0dXNfdCBtSW5pdDsgLy8vPCBpbml0aWFsaXphdGlvbiByZXN1bHQKKworICAgICAgICB2b2lkICptTGliSGFuZGxlOyAvLy88IGxvYWRlZCBsaWJyYXJ5IGhhbmRsZQorICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jIGNyZWF0ZUZhY3Rvcnk7IC8vLzwgbG9hZGVkIGNyZWF0ZSBmdW5jdGlvbgorICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYyBkZXN0cm95RmFjdG9yeTsgLy8vPCBsb2FkZWQgZGVzdHJveSBmdW5jdGlvbgorICAgICAgICBDMkNvbXBvbmVudEZhY3RvcnkgKm1Db21wb25lbnRGYWN0b3J5OyAvLy88IGxvYWRlZC9jcmVhdGVkIGNvbXBvbmVudCBmYWN0b3J5CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCBlbmNhcHN1bGF0aW5nIGEgbG9hZGFibGUgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgKgorICAgICAqIFx0b2RvIG1ha2UgdGhpcyBhbHNvIHdvcmsgZm9yIGVudW1lcmF0aW9ucworICAgICAqLworICAgIHN0cnVjdCBDb21wb25lbnRMb2FkZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogTG9hZCB0aGUgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybnMgdGhlIGNvbXBvbmVudCBtb2R1bGUgaWYgaXQgaXMgYWxyZWFkeSBjdXJyZW50bHkgbG9hZGVkLCBvcgorICAgICAgICAgKiBhdHRlbXB0cyB0byBsb2FkIGl0IGlmIGl0IGlzIG5vdC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIG1vZHVsZVtvdXRdIHBvaW50ZXIgdG8gdGhlIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBsb2FkZWQgbW9kdWxlIHNoYWxsIGJlIHN0b3JlZC4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBiZSBudWxscHRyIG9uIGVycm9yLgorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IG1vZHVsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvYWRpbmcgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgY291bGQgbm90IGxvY2F0ZSB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgY29tcG9uZW50IG1vZHVsZSBjb3VsZCBub3QgYmUgbG9hZGVkCisgICAgICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIHBlcm1pc3Npb24gZGVuaWVkIHRvIGxvYWQgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IGZldGNoTW9kdWxlKHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+ICptb2R1bGUpIHsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IGxvY2FsTW9kdWxlID0gbU1vZHVsZS5sb2NrKCk7CisgICAgICAgICAgICBpZiAobG9jYWxNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGxvY2FsTW9kdWxlID0gc3RkOjptYWtlX3NoYXJlZDxDb21wb25lbnRNb2R1bGU+KCk7CisgICAgICAgICAgICAgICAgcmVzID0gbG9jYWxNb2R1bGUtPmluaXQobUxpYlBhdGgpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbU1vZHVsZSA9IGxvY2FsTW9kdWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICptb2R1bGUgPSBsb2NhbE1vZHVsZTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBsb2FkZXIgZm9yIGEgc3BlY2lmaWMgbGlicmFyeSBwYXRoIChvciBuYW1lKS4KKyAgICAgICAgICovCisgICAgICAgIENvbXBvbmVudExvYWRlcihzdGQ6OnN0cmluZyBsaWJQYXRoKQorICAgICAgICAgICAgOiBtTGliUGF0aChsaWJQYXRoKSB7fQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7IC8vLzwgbXV0ZXggZ3VhcmRpbmcgdGhlIG1vZHVsZQorICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudE1vZHVsZT4gbU1vZHVsZTsgLy8vPCB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgbG9hZGVkIG1vZHVsZQorICAgICAgICBzdGQ6OnN0cmluZyBtTGliUGF0aDsgLy8vPCBsaWJyYXJ5IHBhdGgKKyAgICB9OworCisgICAgc3RydWN0IEludGVyZmFjZSA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0b3JlSW9uVXNhZ2VJbmZvPiBtSW9uVXNhZ2VJbmZvOworCisgICAgICAgIEludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3RvcikKKyAgICAgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIocmVmbGVjdG9yKSB7CisgICAgICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgICAgIHN0cnVjdCBTZXR0ZXIgeworICAgICAgICAgICAgICAgIHN0YXRpYyBDMlIgc2V0SW9uVXNhZ2UoYm9vbCAvKiBtYXlCbG9jayAqLywgQzJQPEMyU3RvcmVJb25Vc2FnZUluZm8+ICZtZSkgeworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5oZWFwTWFzayA9IH4wOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5hbGxvY0ZsYWdzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubWluQWxpZ25tZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlvblVzYWdlSW5mbywgImlvbi11c2FnZSIpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0b3JlSW9uVXNhZ2VJbmZvKCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgdXNhZ2UpLmZsYWdzKHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgY2FwYWNpdHkpLmluUmFuZ2UoMCwgVUlOVDMyX01BWCwgMTAyNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBoZWFwTWFzaykuYW55KCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBhbGxvY0ZsYWdzKS5mbGFncyh7fSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBtaW5BbGlnbm1lbnQpLmVxdWFsVG8oMCkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjo6c2V0SW9uVXNhZ2UpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY29tcG9uZW50IG1vZHVsZSBmb3IgYSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kdWxlIHBvaW50ZXIgdG8gYSBzaGFyZWRfcG9pbnRlciB3aGVyZSB0aGUgY29tcG9uZW50IG1vZHVsZSB3aWxsIGJlIHN0b3JlZCBvbgorICAgICAqICAgICAgICAgICAgICAgc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgbG9hZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBsb2NhdGUgdGhlIGNvbXBvbmVudCBsb2FkZXIKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBjb3VsZCBub3QgbG9jYXRlIHRoZSBjb21wb25lbnQgdG8gYmUgbG9hZGVkCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIGNvbXBvbmVudCBsb2FkZXIgY291bGQgbm90IGJlIGlkZW50aWZpZWQgZHVlIHRvIHNvbWUgbW9kdWxlcyBiZWluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvcnJ1cHRlZCAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBuYW1lIGRvZXMgbm90IHJlZmVyIHRvIGFuIGFscmVhZHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVkIGNvbXBvbmVudCBidXQgc29tZSBjb21wb25lbnRzIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYmFkIGxpYnJhcnkpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgcGVybWlzc2lvbiBkZW5pZWQgdG8gZmluZCB0aGUgY29tcG9uZW50IGxvYWRlciBmb3IgdGhlIG5hbWVkIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIG5hbWUgZG9lcyBub3QgcmVmZXIgdG8gYW4gYWxyZWFkeSBpZGVudGlmaWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGJ1dCBzb21lIGNvbXBvbmVudHMgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8gbGFjayBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGZpbmRDb21wb25lbnQoQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gKm1vZHVsZSk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBlYWNoIGNvbXBvbmVudCBtb2R1bGUgYW5kIGRpc2NvdmVyIGl0cyBjb250ZW50cy4KKyAgICAgKi8KKyAgICB2b2lkIHZpc2l0Q29tcG9uZW50cygpOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7IC8vLzwgbXV0ZXggZ3VhcmRpbmcgdGhlIGNvbXBvbmVudCBsaXN0cyBkdXJpbmcgY29uc3RydWN0aW9uCisgICAgYm9vbCBtVmlzaXRlZDsgLy8vPCBjb21wb25lbnQgbW9kdWxlcyB2aXNpdGVkCisgICAgc3RkOjptYXA8QzJTdHJpbmcsIENvbXBvbmVudExvYWRlcj4gbUNvbXBvbmVudHM7IC8vLzwgcGF0aCAtPiBjb21wb25lbnQgbW9kdWxlCisgICAgc3RkOjptYXA8QzJTdHJpbmcsIEMyU3RyaW5nPiBtQ29tcG9uZW50TmFtZVRvUGF0aDsgLy8vPCBuYW1lIC0+IHBhdGgKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IG1Db21wb25lbnRMaXN0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtUmVmbGVjdG9yOworICAgIEludGVyZmFjZSBtSW50ZXJmYWNlOworfTsKKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmluaXQoCisgICAgICAgIHN0ZDo6c3RyaW5nIGxpYlBhdGgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgQUxPR1YoImxvYWRpbmcgZGxsIik7CisgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLmNfc3RyKCksIFJUTERfTk9XfFJUTERfTk9ERUxFVEUpOworICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gY291bGQgYmUgYWNjZXNzL3N5bWJvbCBvciBzaW1wbHkgbm90IGJlaW5nIHRoZXJlCisgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgZGxvcGVuICVzOiAlcyIsIGxpYlBhdGguY19zdHIoKSwgZGxlcnJvcigpKTsKKyAgICAgICAgbUluaXQgPSBDMl9DT1JSVVBURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3JlYXRlRmFjdG9yeSA9CisgICAgICAgICAgICAoQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYylkbHN5bShtTGliSGFuZGxlLCAiQ3JlYXRlQ29kZWMyRmFjdG9yeSIpOworICAgICAgICBkZXN0cm95RmFjdG9yeSA9CisgICAgICAgICAgICAoQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkRlc3Ryb3lDb2RlYzJGYWN0b3J5Iik7CisKKyAgICAgICAgbUNvbXBvbmVudEZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KCk7CisgICAgICAgIGlmIChtQ29tcG9uZW50RmFjdG9yeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiY291bGQgbm90IGNyZWF0ZSBmYWN0b3J5IGluICVzIiwgbGliUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgIG1Jbml0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluaXQgPSBDMl9PSzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZjsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBjcmVhdGVJbnRlcmZhY2UoMCwgJmludGYpOworICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoImZhaWxlZCB0byBjcmVhdGUgaW50ZXJmYWNlOiAlZCIsIHJlcyk7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6OlRyYWl0cz4gdHJhaXRzKG5ldyAoc3RkOjpub3Rocm93KSBDMkNvbXBvbmVudDo6VHJhaXRzKTsKKyAgICBpZiAodHJhaXRzKSB7CisgICAgICAgIHRyYWl0cy0+bmFtZSA9IGludGYtPmdldE5hbWUoKTsKKworICAgICAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nIGtpbmQ7CisgICAgICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW47CisgICAgICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHsgJmtpbmQsICZkb21haW4gfSwge30sIEMyX01BWV9CTE9DSywgbnVsbHB0cik7CisgICAgICAgIGJvb2wgZml4RG9tYWluID0gcmVzICE9IEMyX09LOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICB0cmFpdHMtPmtpbmQgPSBraW5kLnZhbHVlOworICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBkb21haW4udmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBmYWxsLWJhY2sKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlIGZvciBraW5kIGFuZCBkb21haW46ICVkIiwgcmVzKTsKKworICAgICAgICAgICAgdHJhaXRzLT5raW5kID0KKyAgICAgICAgICAgICAgICAodHJhaXRzLT5uYW1lLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgPyBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSIDoKKyAgICAgICAgICAgICAgICAodHJhaXRzLT5uYW1lLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgPyBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSIDoKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9PVEhFUjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IG1lZGlhVHlwZUluZGV4ID0KKyAgICAgICAgICAgICAgICB0cmFpdHMtPmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA/IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dDo6UEFSQU1fVFlQRQorICAgICAgICAgICAgICAgIDogQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICByZXMgPSBpbnRmLT5xdWVyeV92Yih7fSwgeyBtZWRpYVR5cGVJbmRleCB9LCBDMl9NQVlfQkxPQ0ssICZwYXJhbXMpOworICAgICAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZTogJWQiLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZTogdW5leHBlY3RlZCB2ZWN0b3Igc2l6ZTogJXp1IiwgcGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyAqbWVkaWFUeXBlQ29uZmlnID0gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICBpZiAobWVkaWFUeXBlQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgbWVkaWEgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIHRyYWl0cy0+bWVkaWFUeXBlID0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKG1lZGlhVHlwZUNvbmZpZy0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4obWVkaWFUeXBlQ29uZmlnLT5tLnZhbHVlLCBtZWRpYVR5cGVDb25maWctPmZsZXhDb3VudCgpKSk7CisKKyAgICAgICAgaWYgKGZpeERvbWFpbikgeworICAgICAgICAgICAgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgImF1ZGlvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgInZpZGVvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgImltYWdlLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGdldCB0aGlzIHByb3Blcmx5IGZyb20gdGhlIHN0b3JlIGR1cmluZyBlbXBsYWNlCisgICAgICAgIHN3aXRjaCAodHJhaXRzLT5kb21haW4pIHsKKyAgICAgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOgorICAgICAgICAgICAgdHJhaXRzLT5yYW5rID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdHJhaXRzLT5yYW5rID0gNTEyOworICAgICAgICB9CisKKyAgICAgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHt9LCB7IEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc6OlBBUkFNX1RZUEUgfSwgQzJfTUFZX0JMT0NLLCAmcGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSyAmJiBwYXJhbXMuc2l6ZSgpID09IDF1KSB7CisgICAgICAgICAgICBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nICphbGlhc2VzU2V0dGluZyA9CisgICAgICAgICAgICAgICAgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZzo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgaWYgKGFsaWFzZXNTZXR0aW5nKSB7CisgICAgICAgICAgICAgICAgLy8gU3BsaXQgYWxpYXNlcyBvbiAnLCcKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGxvb2tzIHNpbXBsZXIgaW4gcGxhaW4gQyBhbmQgZXZlbiBzdGQ6OnN0cmluZyB3b3VsZCBzdGlsbCBtYWtlIGEgY29weS4KKyAgICAgICAgICAgICAgICBjaGFyICphbGlhc2VzID0gOjpzdHJuZHVwKGFsaWFzZXNTZXR0aW5nLT5tLnZhbHVlLCBhbGlhc2VzU2V0dGluZy0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgICAgIEFMT0dEKCInJXMnIGhhcyBhbGlhc2VzOiAnJXMnIiwgaW50Zi0+Z2V0TmFtZSgpLmNfc3RyKCksIGFsaWFzZXMpOworCisgICAgICAgICAgICAgICAgZm9yIChjaGFyICp0b2ssICpwdHIsICpzdHIgPSBhbGlhc2VzOyAodG9rID0gOjpzdHJ0b2tfcihzdHIsICIsIiwgJnB0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICB0cmFpdHMtPmFsaWFzZXMucHVzaF9iYWNrKHRvayk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJhZGRpbmcgYWxpYXM6ICclcyciLCB0b2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKGFsaWFzZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1UcmFpdHMgPSB0cmFpdHM7CisKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKK0MyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjp+Q29tcG9uZW50TW9kdWxlKCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBpZiAoZGVzdHJveUZhY3RvcnkgJiYgbUNvbXBvbmVudEZhY3RvcnkpIHsKKyAgICAgICAgZGVzdHJveUZhY3RvcnkobUNvbXBvbmVudEZhY3RvcnkpOworICAgIH0KKyAgICBpZiAobUxpYkhhbmRsZSkgeworICAgICAgICBBTE9HVigidW5sb2FkaW5nIGRsbCIpOworICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICppbnRlcmZhY2UsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIHsKKyAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlID0gc2hhcmVkX2Zyb21fdGhpcygpOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1Db21wb25lbnRGYWN0b3J5LT5jcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBpZCwgaW50ZXJmYWNlLCBbbW9kdWxlLCBkZWxldGVyXShDMkNvbXBvbmVudEludGVyZmFjZSAqcCkgbXV0YWJsZSB7CisgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBtb2R1bGUgc28gdGhhdCB3ZSBlbnN1cmUgd2Ugc3RpbGwgaGF2ZSBpdCB3aGlsZSBkZWxldGluZyBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBkZWxldGVyKHApOyAvLyBkZWxldGUgaW50ZXJmYWNlIGZpcnN0CisgICAgICAgICAgICAgICAgbW9kdWxlLnJlc2V0KCk7IC8vIHJlbW92ZSBtb2R1bGUgcmVmIChub3QgdGVjaG5pY2FsbHkgbmVlZGVkKQorICAgIH0pOworICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjpjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjpDMkNvbXBvbmVudCopPiBkZWxldGVyKSB7CisgICAgY29tcG9uZW50LT5yZXNldCgpOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZSA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50RmFjdG9yeS0+Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgaWQsIGNvbXBvbmVudCwgW21vZHVsZSwgZGVsZXRlcl0oQzJDb21wb25lbnQgKnApIG11dGFibGUgeworICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgbW9kdWxlIHNvIHRoYXQgd2UgZW5zdXJlIHdlIHN0aWxsIGhhdmUgaXQgd2hpbGUgZGVsZXRpbmcgY29tcG9uZW50CisgICAgICAgICAgICAgICAgZGVsZXRlcihwKTsgLy8gZGVsZXRlIGNvbXBvbmVudCBmaXJzdAorICAgICAgICAgICAgICAgIG1vZHVsZS5yZXNldCgpOyAvLyByZW1vdmUgbW9kdWxlIHJlZiAobm90IHRlY2huaWNhbGx5IG5lZWRlZCkKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmdldFRyYWl0cygpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0czsKK30KKworQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKQorICAgIDogbVZpc2l0ZWQoZmFsc2UpLAorICAgICAgbVJlZmxlY3RvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyUmVmbGVjdG9ySGVscGVyPigpKSwKKyAgICAgIG1JbnRlcmZhY2UobVJlZmxlY3RvcikgeworCisgICAgYXV0byBlbXBsYWNlID0gW3RoaXNdKGNvbnN0IGNoYXIgKmxpYlBhdGgpIHsKKyAgICAgICAgbUNvbXBvbmVudHMuZW1wbGFjZShsaWJQYXRoLCBsaWJQYXRoKTsKKyAgICB9OworCisgICAgLy8gVE9ETzogbW92ZSB0aGlzIGFsc28gaW50byBhIC5zbyBzbyBpdCBjYW4gYmUgdXBkYXRlZAorICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2FhY2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2FhY2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYW1ybmJlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hbXJ3YmRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYXYxZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYXZjZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYXZjZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfZmxhY2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfZ3NtZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfaDI2M2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2gyNjNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9oZXZjZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfaGV2Y2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X21wM2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfbXBlZzRkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9vcHVzZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfcmF3ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfdnA4ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfdnA4ZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfdnA5ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfdnA5ZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfeGFhY2RlYy5zbyIpOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSB7CisgICAgKHZvaWQpc3JjOworICAgICh2b2lkKWRzdDsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIEMyX01BWV9CTE9DSywgaGVhcFBhcmFtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y29uZmlnX3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgIHJldHVybiBtSW50ZXJmYWNlLmNvbmZpZyhwYXJhbXMsIEMyX01BWV9CTE9DSywgZmFpbHVyZXMpOworfQorCit2b2lkIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6dmlzaXRDb21wb25lbnRzKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1WaXNpdGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvICZwYXRoQW5kTG9hZGVyIDogbUNvbXBvbmVudHMpIHsKKyAgICAgICAgY29uc3QgQzJTdHJpbmcgJnBhdGggPSBwYXRoQW5kTG9hZGVyLmZpcnN0OworICAgICAgICBDb21wb25lbnRMb2FkZXIgJmxvYWRlciA9IHBhdGhBbmRMb2FkZXIuc2Vjb25kOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGU7CisgICAgICAgIGlmIChsb2FkZXIuZmV0Y2hNb2R1bGUoJm1vZHVsZSkgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMgPSBtb2R1bGUtPmdldFRyYWl0cygpOworICAgICAgICAgICAgaWYgKHRyYWl0cykgeworICAgICAgICAgICAgICAgIG1Db21wb25lbnRMaXN0LnB1c2hfYmFjayh0cmFpdHMpOworICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lVG9QYXRoLmVtcGxhY2UodHJhaXRzLT5uYW1lLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyU3RyaW5nICZhbGlhcyA6IHRyYWl0cy0+YWxpYXNlcykgeworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZVRvUGF0aC5lbXBsYWNlKGFsaWFzLCBwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbVZpc2l0ZWQgPSB0cnVlOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6bGlzdENvbXBvbmVudHMoKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICB2aXNpdENvbXBvbmVudHMoKTsKKyAgICByZXR1cm4gbUNvbXBvbmVudExpc3Q7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6ZmluZENvbXBvbmVudCgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gKm1vZHVsZSkgeworICAgICgqbW9kdWxlKS5yZXNldCgpOworICAgIHZpc2l0Q29tcG9uZW50cygpOworCisgICAgYXV0byBwb3MgPSBtQ29tcG9uZW50TmFtZVRvUGF0aC5maW5kKG5hbWUpOworICAgIGlmIChwb3MgIT0gbUNvbXBvbmVudE5hbWVUb1BhdGguZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG1Db21wb25lbnRzLmF0KHBvcy0+c2Vjb25kKS5mZXRjaE1vZHVsZShtb2R1bGUpOworICAgIH0KKyAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBjb21wb25lbnQtPnJlc2V0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgIGMyX3N0YXR1c190IHJlcyA9IGZpbmRDb21wb25lbnQobmFtZSwgJm1vZHVsZSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBnZXQgYSB1bmlxdWUgbm9kZSBJRAorICAgICAgICByZXMgPSBtb2R1bGUtPmNyZWF0ZUNvbXBvbmVudCgwLCBjb21wb25lbnQpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgIGMyX3N0YXR1c190IHJlcyA9IGZpbmRDb21wb25lbnQobmFtZSwgJm1vZHVsZSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBnZXQgYSB1bmlxdWUgbm9kZSBJRAorICAgICAgICByZXMgPSBtb2R1bGUtPmNyZWF0ZUludGVyZmFjZSgwLCBpbnRlcmZhY2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBDMl9NQVlfQkxPQ0spOworfQorCitDMlN0cmluZyBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJhbmRyb2lkLmNvbXBvbmVudFN0b3JlLnBsYXRmb3JtIjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Z2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SZWZsZWN0b3I7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHBsYXRmb3JtU3RvcmU7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSA9IHBsYXRmb3JtU3RvcmUubG9jaygpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIHN0b3JlID0gc3RkOjptYWtlX3NoYXJlZDxDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU+KCk7CisgICAgICAgIHBsYXRmb3JtU3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgcmV0dXJuIHN0b3JlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQ5ODllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9HUkFMTE9DX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFVud3JhcCB0aGUgbmF0aXZlIGhhbmRsZSBmcm9tIGEgQ29kZWMyIGhhbmRsZSBhbGxvY2F0ZWQgYnkgQzJBbGxvY2F0b3JHcmFsbG9jLgorICoKKyAqIEBwYXJhbSBoYW5kbGUgYSBoYW5kbGUgYWxsb2NhdGVkIGJ5IEMyQWxsb2NhdG9yR3JhbGxvYy4gVGhpcyBpbmNsdWRlcyBoYW5kbGVzIHJldHVybmVkIGZvciBhCisgKiBncmFwaGljIGJsb2NrIGFsbG9jYXRpb24gaGFuZGxlIHJldHVybmVkLgorICoKKyAqIEByZXR1cm4gYSBuZXcgTk9OLU9XTklORyBuYXRpdmUgaGFuZGxlIHRoYXQgbXVzdCBiZSBkZWxldGVkIHVzaW5nIG5hdGl2ZV9oYW5kbGVfZGVsZXRlLgorICovCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSk7CisKKy8qKgorICogV3JhcCB0aGUgZ3JhbGxvYyBoYW5kbGUgYW5kIG1ldGFkYXRhIGludG8gQ29kZWMyIGhhbmRsZSByZWNvZ25pemVkIGJ5CisgKiBDMkFsbG9jYXRvckdyYWxsb2MuCisgKgorICogQHJldHVybiBhIG5ldyBOT04tT1dOSU5HIEMySGFuZGxlIHRoYXQgbXVzdCBiZSBkZWxldGVkIHVzaW5nIG5hdGl2ZV9oYW5kbGVfZGVsZXRlLgorICovCitDMkhhbmRsZSAqV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwLCB1aW50NjRfdCBpZ2JwX2lkID0gMCwgdWludDMyX3QgaWdicF9zbG90ID0gMCk7CisKKy8qKgorICogXHRvZG8gR2V0IHRoaXMgZnJvbSB0aGUgYnVmZmVyCisgKi8KK3ZvaWQgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LCB1aW50NjRfdCAqdXNhZ2UsIHVpbnQzMl90ICpzdHJpZGUsCisgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCk7CisKK2NsYXNzIEMyQWxsb2NhdG9yR3JhbGxvYyA6IHB1YmxpYyBDMkFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgQzJBbGxvY2F0b3JHcmFsbG9jKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUgPSBmYWxzZSk7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yR3JhbGxvYygpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBJbXBsICptSW1wbDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfR1JBTExPQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjA1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9ySW9uLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfSU9OX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfSU9OX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJBbGxvY2F0b3JJb24gOiBwdWJsaWMgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIC8vIFVzYWdlIG1hcHBlciBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBhbGxvY2F0b3IKKyAgICAvLyAgICh1c2FnZSwgY2FwYWNpdHkpID0+IChhbGlnbiwgaGVhcE1hc2ssIGZsYWdzKQorICAgIC8vCisgICAgLy8gY2FwYWNpdHkgaXMgYWxpZ25lZCB0byB0aGUgZGVmYXVsdCBibG9jay1zaXplIChkZWZhdWx0cyB0byBwYWdlIHNpemUpIHRvIHJlZHVjZSBjYWNoaW5nCisgICAgLy8gb3ZlcmhlYWQKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3QoQzJNZW1vcnlVc2FnZSwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgIC8qID0+ICovIHNpemVfdCosIHVuc2lnbmVkKiwgdW5zaWduZWQqKT4gVXNhZ2VNYXBwZXJGbjsKKworICAgIHZpcnR1YWwgaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICBDMkFsbG9jYXRvcklvbihpZF90IGlkKTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXQ7IH0KKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9ySW9uKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIHVzYWdlIG1hcHBlciBmb3Igc3Vic2VxdWVudCBuZXcgYWxsb2NhdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN1cHBvcnRlZAorICAgICAqIG1pbmltdW0gYW5kIG1heGltdW0gdXNhZ2UgbWFza3MgYW5kIGRlZmF1bHQgYmxvY2stc2l6ZSB0byB1c2UgZm9yIHRoZSBtYXBwZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWFwcGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBtYXAgQ29kZWMgMi4wIGJ1ZmZlciB1c2FnZSB0byBpb24gZmxhZ3MKKyAgICAgKiAgICAgICAgcmVxdWlyZWQgYnkgdGhlIGlvbiBkZXZpY2UKKyAgICAgKiBccGFyYW0gbWluVXNhZ2UgbWluaW11bSBidWZmZXIgdXNhZ2UgcmVxdWlyZWQgZm9yIHN1cHBvcnRlZCBhbGxvY2F0aW9ucyAoZGVmYXVsdHMgdG8gMCkKKyAgICAgKiBccGFyYW0gbWF4VXNhZ2UgbWF4aW11bSBidWZmZXIgdXNhZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBpb24gYWxsb2NhdG9yIChkZWZhdWx0cyB0byBTV19SRUFECisgICAgICogICAgICAgIHwgU1dfV1JJVEUpCisgICAgICogXHBhcmFtIGJsb2NrU2l6ZSBhbGlnbm1lbnQgdXNlZCBwcmlvciB0byBjYWxsaW5nIHxtYXBwZXJ8IGZvciB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqICAgICAgICBUaGlzIGFsc28gaGVscHMgcmVkdWNlIHRoZSBzaXplIG9mIGNhY2hlIHJlcXVpcmVkIGZvciBjYWNoaW5nIG1hcHBlciByZXN1bHRzLgorICAgICAqICAgICAgICAoZGVmYXVsdHMgdG8gdGhlIHBhZ2Ugc2l6ZSkKKyAgICAgKi8KKyAgICB2b2lkIHNldFVzYWdlTWFwcGVyKAorICAgICAgICAgICAgY29uc3QgVXNhZ2VNYXBwZXJGbiAmbWFwcGVyLCB1aW50NjRfdCBtaW5Vc2FnZSwgdWludDY0X3QgbWF4VXNhZ2UsIHVpbnQ2NF90IGJsb2NrU2l6ZSk7CisKK3ByaXZhdGU6CisgICAgYzJfc3RhdHVzX3QgbWFwVXNhZ2UoQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBzaXplX3QgKmFsaWduLCB1bnNpZ25lZCAqaGVhcE1hc2ssIHVuc2lnbmVkICpmbGFncyk7CisKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBpbnQgbUlvbkZkOworCisgICAgLy8gdGhpcyBsb2NrcyBtVHJhaXRzLCBtQmxvY2tTaXplLCBtVXNhZ2VNYXBwZXIsIG1Vc2FnZU1hcHBlckxydSBhbmQgbVVzYWdlTWFwcGVyQ2FjaGUKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVVzYWdlTWFwcGVyTG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBtVHJhaXRzOworICAgIHNpemVfdCBtQmxvY2tTaXplOworICAgIFVzYWdlTWFwcGVyRm4gbVVzYWdlTWFwcGVyOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHVpbnQ2NF90LCBzaXplX3Q+IE1hcHBlcktleTsKKyAgICBzdHJ1Y3QgTWFwcGVyS2V5SGFzaCB7CisgICAgICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgTWFwcGVyS2V5ICYpIGNvbnN0OworICAgIH07CisgICAgdHlwZWRlZiBzdGQ6OnR1cGxlPHNpemVfdCwgdW5zaWduZWQsIHVuc2lnbmVkLCBjMl9zdGF0dXNfdD4gTWFwcGVyVmFsdWU7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8TWFwcGVyS2V5LCBNYXBwZXJWYWx1ZT4gTWFwcGVyS2V5VmFsdWU7CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8TWFwcGVyS2V5VmFsdWU+OjppdGVyYXRvciBNYXBwZXJLZXlWYWx1ZVBvaW50ZXI7CisgICAgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPiBtVXNhZ2VNYXBwZXJMcnU7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPE1hcHBlcktleSwgTWFwcGVyS2V5VmFsdWVQb2ludGVyLCBNYXBwZXJLZXlIYXNoPiBtVXNhZ2VNYXBwZXJDYWNoZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3MWE3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQlFfQlVGRkVSX1BSSVZfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0JRX0JVRkZFUl9QUklWX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKK2NsYXNzIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpOworCisgICAgdmlydHVhbCB+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfTsKKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxvY2FsSWQ7CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ2NF90IHByb2R1Y2VyLCBpbnQzMl90IHNsb3QsIGludDY0X3QgbnNlY3MpPiBPblJlbmRlckNhbGxiYWNrOworCisgICAgLyoqCisgICAgICogU2V0cyByZW5kZXIgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVuZGVyQ2FsbGJhayBjYWxsYmFjayB0byBjYWxsIGZvciBhbGwgZGVxdWV1ZSBidWZmZXIuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHNldFJlbmRlckNhbGxiYWNrKGNvbnN0IE9uUmVuZGVyQ2FsbGJhY2sgJnJlbmRlckNhbGxiYWNrID0gT25SZW5kZXJDYWxsYmFjaygpKTsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgYW4gSUdCUCBpbiBvcmRlciB0byBjcmVhdGUgYmxvY2tzLiBBIG5ld2x5IGNyZWF0ZWQgYmxvY2sgaXMKKyAgICAgKiBkZXF1ZXVlZCBmcm9tIHRoZSBjb25maWd1cmVkIElHQlAuIFVuaXF1ZSBJZCBvZiBJR0JQIGFuZCB0aGUgc2xvdCBudW1iZXIgb2YKKyAgICAgKiBibG9ja3MgYXJlIHBhc3NlZCB2aWEgbmF0aXZlX2hhbmRsZS4gTWFuYWdpbmcgSUdCUCBpcyByZXNwb25zaWJpbGl0eSBvZiBjYWxsZXIuCisgICAgICogV2hlbiBJR0JQIGlzIG5vdCBjb25maWd1cmVkLCBibG9jayB3aWxsIGJlIGNyZWF0ZWQgdmlhIGFsbG9jYXRvci4KKyAgICAgKiBTaW5jZSB6ZXJvIGlzIG5vdCB1c2VkIGZvciBVbmlxdWUgSWQgb2YgSUdCUCwgaWYgSUdCUCBpcyBub3QgY29uZmlndXJlZCBvciBwcm9kdWNlcgorICAgICAqIGlzIGNvbmZpZ3VyZWQgYXMgbnVsbHB0ciwgdW5pcXVlIGlkIHdoaWNoIGlzIGJ1bmRsZWQgaW4gbmF0aXZlX2hhbmRsZSBpcyB6ZXJvLgorICAgICAqCisgICAgICogXHBhcmFtIHByb2R1Y2VyICAgICAgdGhlIElHQlAsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBmZXRjaCBibG9ja3MKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlUHJvZHVjZXIoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJnByb2R1Y2VyKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgY29uc3QgbG9jYWxfaWRfdCBtTG9jYWxJZDsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworCisgICAgZnJpZW5kIHN0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTsKK307CisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQlVGRkVSX1BSSVZfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCdWZmZXJQcml2LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnVmZmVyUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNWY2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnVmZmVyUHJpdi5oCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQlVGRkVSX1BSSVZfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lBY2Nlc3Nvci5oPgorCitjbGFzcyBDMkJhc2ljTGluZWFyQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDMkJhc2ljTGluZWFyQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICB2aXJ0dWFsIH5DMkJhc2ljTGluZWFyQmxvY2tQb29sKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBCQVNJQ19MSU5FQVI7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIC8vIFRPRE86IGZldGNoQ2lyY3VsYXJCbG9jaworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK2NsYXNzIEMyQmFzaWNHcmFwaGljQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgdmlydHVhbCB+QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2woKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEJBU0lDX0dSQVBISUM7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK2NsYXNzIEMyUG9vbGVkQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBDMlBvb2xlZEJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICB2aXJ0dWFsIH5DMlBvb2xlZEJsb2NrUG9vbCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTG9jYWxJZDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY29ubmVjdGlvbiBJZCBmb3IgdW5kZXJseWluZyBidWZmZXJwb29sCisgICAgICovCisgICAgaW50NjRfdCBnZXRDb25uZWN0aW9uSWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgYWNjZXNzb3Igd2hpY2ggaXMgdXNlZCBieSB1bmRlcmx5aW5nIGJ1ZmZlcnBvb2wuIChJdCBjYW4gYmUKKyAgICAgKiBwYXNzZWQgdG8gcmVjZWl2aW5nIHByb2Nlc3MuKQorICAgICAqCisgICAgICogXHBhcmFtIGFjY2Vzc29yICAgICAgICAgIElBY2Nlc3NvciB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcyBvdXQgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogXHJldHVybiB0cnVlICAgICAgICAgICAgIElBY2Vzc29yIGlzIHdyaXRlbiBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHVybiBmYWxzZSAgICAgICAgICAgIElBY2Nlc3NvciBpcyBub3Qgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBib29sIGdldEFjY2Vzc29yKGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBjb25zdCBsb2NhbF9pZF90IG1Mb2NhbElkOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7Cit9OworCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQ29tcG9uZW50RmFjdG9yeS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkNvbXBvbmVudEZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ4Yjk4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkNvbXBvbmVudEZhY3RvcnkuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQ09NUE9ORU5UX0ZBQ1RPUllfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0NPTVBPTkVOVF9GQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qKgorICogQ29tcG9uZW50IGZhY3Rvcnkgb2JqZWN0IHRoYXQgZW5hYmxlcyB0byBjcmVhdGUgYSBjb21wb25lbnQgYW5kL29yIGludGVyZmFjZSBmcm9tIGEgZHluYW1pY2FsbHkKKyAqIGxpbmtlZCBsaWJyYXJ5LiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBjb21wb25lbnQvaW50ZXJmYWNlcyBhcmUgbWFuYWdlZCBvYmplY3RzLCBidXQgd2UKKyAqIGNhbm5vdCBzYWZlbHkgY3JlYXRlIGEgbWFuYWdlZCBvYmplY3QgYW5kIHBhc3MgaXQgaW4gQy4KKyAqCisgKiBDb21wb25lbnRzL2ludGVyZmFjZXMgdHlwaWNhbGx5IGluaGVyaXQgZnJvbSBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLCBidXQgQyByZXF1aXJlcworICogcGFzc2luZyBzaW1wbGUgcG9pbnRlciwgYW5kIHNoYXJlZF9wdHIgY29uc3RydWN0b3IgbmVlZHMgdG8ga25vdyB0aGUgY2xhc3MgdG8gYmUgY29uc3RydWN0ZWQKKyAqIGRlcml2ZXMgZnJvbSBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAqCisgKi8KK2NsYXNzIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjpDMkNvbXBvbmVudCopPiBDb21wb25lbnREZWxldGVyOworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnRJbnRlcmZhY2UqKT4gSW50ZXJmYWNlRGVsZXRlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgICBjb21wb25lbnQgSUQgZm9yIHRoZSBjcmVhdGVkIGNvbXBvbmVudAorICAgICAqIFxwYXJhbSBjb21wb25lbnQgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgY29tcG9uZW50IGlzIHN0b3JlZC4gQ2xlYXJlZCBvbgorICAgICAqICAgICAgICAgICAgICAgICAgZmFpbHVyZSBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudAorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBDb21wb25lbnREZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50PigpKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50IGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gaWQgICAgICAgIGNvbXBvbmVudCBpbnRlcmZhY2UgSUQgZm9yIHRoZSBjcmVhdGVkIGludGVyZmFjZQorICAgICAqIFxwYXJhbSBpbnRlcmZhY2Ugc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgaW50ZXJmYWNlIGlzIHN0b3JlZC4gQ2xlYXJlZCBvbgorICAgICAqICAgICAgICAgICAgICAgICAgZmFpbHVyZSBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIEludGVyZmFjZURlbGV0ZXIgZGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnRJbnRlcmZhY2U+KCkpID0gMDsKKworICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50RmFjdG9yeSgpID0gZGVmYXVsdDsKKworICAgIHR5cGVkZWYgOjpDMkNvbXBvbmVudEZhY3RvcnkqICgqQ3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMpKHZvaWQpOworICAgIHR5cGVkZWYgdm9pZCAoKkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYykoOjpDMkNvbXBvbmVudEZhY3RvcnkqKTsKK307CisKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9DT01QT05FTlRfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkRlYnVnLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjFjZGFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkRlYnVnLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0hfCisKKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctbG9nLmg+CisKKy8vIFRvIGFsbG93IGFyYml0cmFyeSBvcmRlcmluZyBvZiBDMkRlYnVnLmggYW5kIEFQSSBoZWFkZXJzIGFuZCB0byBrZWVwIGRlYnVnIHV0aWxpdGllcyBzZXBhcmF0ZWx5CisvLyBmcm9tIHRoZSBBUEkgZGVmaW5pdGlvbnMsIHdlIHByb3ZpZGUgQVBJIGhlYWRlciBzcGVjaWZpYyBkZWJ1ZyBoZWFkZXJzLgorI2lmZGVmIEMyUEFSQU1fSF8KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctcGFyYW0uaD4KKyNlbmRpZgorCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJFcnJub1V0aWxzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRXJybm9VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOTk1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRXJybm9VdGlscy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0VSUk5PX1VUSUxTX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9FUlJOT19VVElMU19IXworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisvLyBzdGFuZGFyZCBFUlJOTyBtYXBwaW5ncwordGVtcGxhdGU8aW50IE4+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGwoKTsKK3RlbXBsYXRlPD4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbDwwPigpICAgICAgIHsgcmV0dXJuIEMyX09LOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RUlOVkFMPigpICB7IHJldHVybiBDMl9CQURfVkFMVUU7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbDxFQUNDRVM+KCkgIHsgcmV0dXJuIEMyX1JFRlVTRUQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbDxFUEVSTT4oKSAgIHsgcmV0dXJuIEMyX1JFRlVTRUQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbDxFTk9NRU0+KCkgIHsgcmV0dXJuIEMyX05PX01FTU9SWTsgfQorCisvLyBtYXAgc3RhbmRhcmQgZXJybm8tcyB0byB0aGUgZXF1aXZhbGVudCBjMl9zdGF0dXNfdAordGVtcGxhdGU8aW50Li4uIE4+IHN0cnVjdCBfYzJfbWFwX2Vycm5vX2ltcGw7Cit0ZW1wbGF0ZTxpbnQgRSwgaW50IC4uLiBOPiBzdHJ1Y3QgX2MyX21hcF9lcnJub19pbXBsPEUsIE4uLi4+IHsKKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgbWFwKGludCByZXN1bHQpIHsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFKSB7CisgICAgICAgICAgICByZXR1cm4gX2MyX2Vycm5vMnN0YXR1c19pbXBsIDxFPigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIF9jMl9tYXBfZXJybm9faW1wbDxOLi4uPjo6bWFwKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgX2MyX21hcF9lcnJub19pbXBsPD4geworICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBtYXAoaW50IHJlc3VsdCkgeworICAgICAgICByZXR1cm4gcmVzdWx0ID09IDAgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTxpbnQuLi4gTj4KK2MyX3N0YXR1c190IGMyX21hcF9lcnJubyhpbnQgcmVzdWx0KSB7CisgICAgcmV0dXJuIF9jMl9tYXBfZXJybm9faW1wbDxOLi4uPjo6bWFwKHJlc3VsdCk7Cit9CisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfRVJSTk9fVVRJTFNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxMDY0MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DMl9QTEFURk9STV9TVE9SRV9QTFVHSU5fTE9BREVSX0hfCisKKyNkZWZpbmUgU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPEMyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworLyoqCisgKiBFeHRlcm4gQyBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGJsb2NrIHBvb2wgZnJvbSBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgKgorICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3IgdHlwZS4KKyAqIFxwYXJlbSBibG9ja1Bvb2xJZCB0aGUgSUQgb2YgY3JlYXRlZCBibG9jayBwb29sLgorICoKKyAqIFxyZXR1cm4gcG9pbnRlciBvZiBjcmVhdGVkIEMyQmxvY2tQb29sLCBudWxscHRyIG9uIGVycm9yLgorICovCit0eXBlZGVmIDo6QzJCbG9ja1Bvb2wqICgqQ3JlYXRlQmxvY2tQb29sRnVuYykoOjpDMkFsbG9jYXRvcjo6aWRfdCwgOjpDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCk7CisKKy8qKgorICogRXh0ZXJuIEMgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhbGxvY2F0b3IgZnJvbSBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgKgorICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYWxsb2NhdG9yIHRvIGNyZWF0ZS4KKyAqIFxwYXJhbSBzdGF0dXMgICAgICB0aGUgcmV0dXJuZWQgc3RhdHVzIGZyb20gY3JlYXRpbmcgYWxsb2NhdG9yLgorICoKKyAqIFxyZXR1cm4gcG9pbnRlciBvZiBjcmVhdGVkIEMyQWxsb2NhdG9yLCBudWxscHRyIG9uIGVycm9yLgorICovCit0eXBlZGVmIDo6QzJBbGxvY2F0b3IqICgqQ3JlYXRlQWxsb2NhdG9yRnVuYykoOjpDMkFsbG9jYXRvcjo6aWRfdCwgOjpjMl9zdGF0dXNfdCopOworCitjbGFzcyBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiYgR2V0SW5zdGFuY2UoKTsKKyAgICB+QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGJsb2NrIHBvb2wgZnJvbSBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBiYWNraW5nIGFsbG9jYXRvciB0eXBlLgorICAgICAqIFxwYXJhbSBibG9ja1Bvb2xJZCB0aGUgSUQgb2YgY3JlYXRlZCBibG9jayBwb29sLgorICAgICAqIFxwYXJhbSBwb29sICAgICAgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBibG9jayBwb29sIGlzIHN0b3JlZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBibG9jayBwb29sIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGUgZXh0ZW5zaW9uIHN5bWJvbCB3YXMgbm90IGZvdW5kLgorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSBpbnB1dCBhbGxvY2F0b3JJZCBpcyBub3QgZGVmaW5lZCBpbiBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKDo6QzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4qIHBvb2wpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbGxvY2F0b3IgZnJvbSBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBhbGxvY2F0b3IgaXMgbm90IGNyZWF0ZWQgYXMgc2hhcmVkIHNpbmdsZXRvbiBhcyBDMkFsbG9jYXRvclN0b3JlIGRvZXMsIGJlY2F1c2UKKyAgICAgKiBDIGludGVyZmFjZSBvbmx5IGFsbG93cyByYXcgcG9pbnRlciB0cmFuc21pc3Npb24gZm9yIGV4dGVuc2lvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGFsbG9jYXRvciB0byBjcmVhdGUuCisgICAgICogXHBhcmFtIGFsbG9jYXRvciAgIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGFsbG9jYXRvciBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdG9yIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBhbGxvY2F0b3Igd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBhbGxvY2F0b3IgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIGV4dGVuc2lvbiBzeW1ib2wgd2FzIG5vdCBmb3VuZC4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgaW5wdXQgYWxsb2NhdG9ySWQgaXMgbm90IGRlZmluZWQgaW4gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgYWxsb2NhdG9yCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQWxsb2NhdG9yKDo6QzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4qIGNvbnN0IGFsbG9jYXRvcik7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpOworCisgICAgc3RhdGljIGFuZHJvaWQ6Ok11dGV4IHNNdXRleDsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4gc0luc3RhbmNlOworCisgICAgdm9pZCAqbUxpYkhhbmRsZTsKKyAgICBDcmVhdGVCbG9ja1Bvb2xGdW5jIG1DcmVhdGVCbG9ja1Bvb2w7CisgICAgQ3JlYXRlQWxsb2NhdG9yRnVuYyBtQ3JlYXRlQWxsb2NhdG9yOworfTsKKworI2VuZGlmICAvLyBTVEFHRUZSSUdIVF9DMl9QTEFURk9STV9TVE9SRV9QTFVHSU5fTE9BREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxMjgyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN1cHBvcnQuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX1BMQVRGT1JNX1NVUFBPUlRfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX1BMQVRGT1JNX1NVUFBPUlRfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnRGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUuCisgKiBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBsYXRmb3JtIGFsbG9jYXRvciBzdG9yZSBjb3VsZCBub3QgYmUgb2J0YWluZWQKKyAqLworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKworLyoqCisgKiBQbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUgSURzCisgKi8KK2NsYXNzIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSA6IHB1YmxpYyBDMkFsbG9jYXRvclN0b3JlIHsKK3B1YmxpYzoKKyAgICBlbnVtIDogaWRfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiB0aGUgaW9uIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEMySGFuZGxlIGNvbnNpc3RzIG9mOgorICAgICAgICAgKiAgIGZkICBzaGFyZWQgaW9uIGJ1ZmZlciBoYW5kbGUKKyAgICAgICAgICogICBpbnQgc2l6ZSAobG8gMzIgYml0cykKKyAgICAgICAgICogICBpbnQgc2l6ZSAoaGkgMzIgYml0cykKKyAgICAgICAgICogICBpbnQgbWFnaWMgJ1x4YzJpb1x4MDAnCisgICAgICAgICAqLworICAgICAgICBJT04gPSBQTEFURk9STV9TVEFSVCwKKworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgdGhlIGdyYWxsb2MgYmFja2VkIHBsYXRmb3JtIGFsbG9jYXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQzJIYW5kbGUgbGF5b3V0IGlzIG5vdCBwdWJsaWMuIFVzZSBDMkFsbG9jYXRvckdyYWxsb2M6OlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUKKyAgICAgICAgICogdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIGdyYWxsb2MgaGFuZGxlIGZyb20gYSBDMkhhbmRsZSwgYW5kIFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGNyZWF0ZSBhIEMySGFuZGxlIGZyb20gYSBncmFsbG9jIGhhbmRsZSAtIGZvciBDMkFsbG9jYXRvcjo6cHJpb3JBbGxvY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgR1JBTExPQywKKworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgdGhlIGJ1ZmZlcnF1ZXVlIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEMySGFuZGxlIGxheW91dCBpcyBub3QgcHVibGljLiBVc2UgQzJBbGxvY2F0b3JHcmFsbG9jOjpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGdldCB0aGUgdW5kZXJseWluZyBoYW5kbGUgZnJvbSBhIEMySGFuZGxlLCBhbmQgV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUKKyAgICAgICAgICogdG8gY3JlYXRlIGEgQzJIYW5kbGUgZnJvbSBhIGhhbmRsZSAtIGZvciBDMkFsbG9jYXRvcjo6cHJpb3JBbGxvY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgQlVGRkVSUVVFVUUsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIGluZGljYXRpbmcgdGhlIGVuZCBvZiBwbGF0Zm9ybSBhbGxvY2F0b3IgZGVmaW5pdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogXG5vdGUgYWx3YXlzIHB1dCB0aGlzIG1hY3JvIGluIHRoZSBsYXN0IHBsYWNlLgorICAgICAgICAgKgorICAgICAgICAgKiBFeHRlbmRlZCBwbGF0Zm9ybSBzdG9yZSBwbHVnaW4gc2hvdWxkIHVzZSB0aGlzIG1hY3JvIGFzIHRoZSBzdGFydCBJRCBvZiBpdHMgb3duIGFsbG9jYXRvcgorICAgICAgICAgKiB0eXBlcy4KKyAgICAgICAgICovCisgICAgICAgIFBMQVRGT1JNX0VORCwKKyAgICB9OworfTsKKworLyoqCisgKiBSZXRyaWV2ZXMgYSBibG9jayBwb29sIGZvciBhIGNvbXBvbmVudC4KKyAqCisgKiBccGFyYW0gaWQgICAgICAgIHRoZSBsb2NhbCBJRCBvZiB0aGUgYmxvY2sgcG9vbAorICogXHBhcmFtIGNvbXBvbmVudCB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBibG9jayBwb29sIChtdXN0IGJlIG5vbi1udWxsKQorICogXHBhcmFtIHBvb2wgICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBvYnRhaW5lZCBibG9jayBwb29sIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgKiAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICoKKyAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBjb21wb25lbnQgaXMgbnVsbAorICogXHJldHZhbCBDMl9OT1RfRk9VTkQgaWYgdGhlIGJsb2NrIHBvb2wgZG9lcyBub3QgZXhpc3QKKyAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGZldGNoIHRoZSBibG9jayBwb29sICh0aGlzIHJldHVybiB2YWx1ZSBpcyBvbmx5CisgKiAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBmb3IgYmFzaWMgcG9vbHMpCisgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dCAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seSBwb3NzaWJsZSBmb3IgYmFzaWMgcG9vbHMpCisgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uICh0aGlzIHJldHVybiB2YWx1ZSBpcyBvbmx5CisgKiAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBmb3IgYmFzaWMgcG9vbHMpCisgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgb3BlcmF0aW9uICh1bmV4cGVjdGVkLAorICogICAgICAgICAgICAgICAgICAgICAgdGhpcyByZXR1cm4gdmFsdWUgaXMgb25seSBwb3NzaWJsZSBmb3IgYmFzaWMgcG9vbHMpCisgKi8KK2MyX3N0YXR1c190IEdldENvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKTsKKworLyoqCisgKiBDcmVhdGVzIGEgYmxvY2sgcG9vbC4KKyAqIFxwYXJhbSBhbGxvY2F0b3JJZCAgdGhlIGFsbG9jYXRvciBJRCB3aGljaCBpcyB1c2VkIHRvIGFsbG9jYXRlIGJsb2NrcworICogXHBhcmFtIGNvbXBvbmVudCAgICAgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgYmxvY2sgcG9vbCAobXVzdCBiZSBub24tbnVsbCkKKyAqIFxwYXJhbSBwb29sICAgICAgICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGNyZWF0ZWQgYmxvY2sgcG9vbCBzaGFsbCBiZSBzdG9yZSBvbiBzdWNjZXNzLgorICogICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAqCisgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgY29tcG9uZW50IGlzIG51bGwKKyAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBhbGxvY2F0b3IgZG9lcyBub3QgZXhpc3QKKyAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBhIGJsb2NrIHBvb2wKKyAqLworYzJfc3RhdHVzX3QgQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUuCisgKiBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBsYXRmb3JtIGNvbXBvbmVudCBzdG9yZSBjb3VsZCBub3QgYmUgb2J0YWluZWQKKyAqLworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKworLyoqCisgKiBTZXRzIHRoZSBwcmVmZXJyZWQgY29tcG9uZW50IHN0b3JlIGluIHRoaXMgcHJvY2VzcyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBhY2Nlc3NpbmcgaXRzCisgKiBpbnRlcmZhY2UuIElmIHRoaXMgaXMgbm90IGNhbGxlZCwgdGhlIGRlZmF1bHQgSUNvbXBvbmVudFN0b3JlIEhBTCAoaWYgZXhpc3RzKSBpcyB0aGUgcHJlZmVycmVkCisgKiBzdG9yZSBmb3IgdGhpcyBwdXJwb3NlLiBJZiB0aGUgZGVmYXVsdCBJQ29tcG9uZW50U3RvcmUgSEFMIGlzIG5vdCBwcmVzZW50LCB0aGUgcGxhdGZvcm0KKyAqIGNvbXBvbmVudCBzdG9yZSBpcyB1c2VkLgorICovCit2b2lkIFNldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvYW5kcm9pZC1DMkRlYnVnLWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTAyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCisjZGVmaW5lIEMyVVRJTFNfQU5EUk9JRF9ERUJVR19MT0dfSF8KKworLyoKKyAqIEFuZHJvaWQgcHJvdmlkZXMgbG9nZ2luZyBhbmQgZGVidWcgbWFjcm9zLiBSZWRlZmluZSB0aGVtIHdpdGggQzIgcHJlZml4IGFuZCBhZGQgc3VwcG9ydCBmb3IKKyAqIG9wdGluZyBvdXQgb2YgdmVyYm9zZSBsb2dzLgorICovCisKKyNpZmRlZiBDMl9MT0dfVEFHCisjZGVmaW5lIExPR19UQUcgQzJfTE9HX1RBRworI2VuZGlmCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaWZkZWYgQzJfTE9HX1ZFUkJPU0UKKyNkZWZpbmUgQzJfTE9HKExFVkVMKSBMT0coOjphbmRyb2lkOjpiYXNlOjpMRVZFTCkKKyNlbHNlCisvKioKKyAqIFVzZSBhcyBmb2xsb3dzOgorICoKKyAqICNkZWZpbmUgQzJfTE9HX1RBRyAidGFnIgorICogLy8jZGVmaW5lIEMyX0xPR19WRVJCT1NFICAvLyBlbmFibGUgdmVyYm9zZSBsb2dzIGluIHRoaXMgZmlsZQorICogI2luY2x1ZGUgPEMyRGVidWcuaD4KKyAqCisgKiBDMl9MT0coREVCVUcpIDw8IGV4cHIgLi4uOworICoKKyAqIExvZyBsZXZlbHMgYXJlOiBWRVJCT1NFLCBERUJVRywgSU5GTywgV0FSTklORywgRVJST1IsIEZBVEFMIChhYm9ydHMpLgorICoKKyAqIE5vIGVuZGwgaXMgcmVxdWlyZWQuCisgKi8KKyNkZWZpbmUgQzJfTE9HKExFVkVMKSBcCisgICAgICAgICg6OmFuZHJvaWQ6OmJhc2U6OkxFVkVMICE9IDo6YW5kcm9pZDo6YmFzZTo6VkVSQk9TRSkgJiYgTE9HKDo6YW5kcm9pZDo6YmFzZTo6TEVWRUwpCisjZW5kaWYKKworI2RlZmluZSBDMl9DSEVDSyAgICBDSEVDSworI2RlZmluZSBDMl9DSEVDS19MVCBDSEVDS19MVAorI2RlZmluZSBDMl9DSEVDS19MRSBDSEVDS19MRQorI2RlZmluZSBDMl9DSEVDS19FUSBDSEVDS19FUQorI2RlZmluZSBDMl9DSEVDS19HRSBDSEVDS19HRQorI2RlZmluZSBDMl9DSEVDS19HVCBDSEVDS19HVAorI2RlZmluZSBDMl9DSEVDS19ORSBDSEVDS19ORQorCisjZGVmaW5lIEMyX0RDSEVDSyAgICBEQ0hFQ0sKKyNkZWZpbmUgQzJfRENIRUNLX0xUIERDSEVDS19MVAorI2RlZmluZSBDMl9EQ0hFQ0tfTEUgRENIRUNLX0xFCisjZGVmaW5lIEMyX0RDSEVDS19FUSBEQ0hFQ0tfRVEKKyNkZWZpbmUgQzJfRENIRUNLX0dFIERDSEVDS19HRQorI2RlZmluZSBDMl9EQ0hFQ0tfR1QgRENIRUNLX0dUCisjZGVmaW5lIEMyX0RDSEVDS19ORSBEQ0hFQ0tfTkUKKworI2VuZGlmICAvLyBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MGU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWJhc2UuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0JBU0VfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19CQVNFX0hfCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworLyoqCisgKiBEZWJ1ZyBwcmludCB1dGlsaXRpZXMgZm9yIENvZGVjIDIuMCBiYXNlIG9iamVjdHMuCisgKi8KKworI2RlZmluZSBDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQodHlwZSkgXAorY29uc3QgY2hhciAqYXNTdHJpbmcodHlwZSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKTsgXAoraW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCB0eXBlICZpKSB7IFwKKyAgICByZXR1cm4gb3MgPDwgYXNTdHJpbmcoaSk7IFwKK30KKworQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKGMyX3N0YXR1c190KQorCisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19CQVNFX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzMTg3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCisKKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSk7CisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1YzRjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfTE9HX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfTE9HX0hfCisKKy8vIFBsYXRmb3JtIHNwZWNpZmljIGRlYnVnIHV0aWxpdGllcworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC1DMkRlYnVnLWxvZy5oPgorI2Vsc2UKKy8vIFRPRE86IGltcGxlbWVudCBiYXNlIGRlYnVnIHV0aWxzCisjZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctcGFyYW0uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjMWRlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19QQVJBTV9IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX1BBUkFNX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWJhc2UuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisvKioKKyAqIERlYnVnL3ByaW50IGRlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBkZWZpbmVkIGluIEMyUGFyYW0uaAorICovCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCkKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6VHlwZSAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6SW5kZXggJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IF9DMkZpZWxkSWQgJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpOworCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfUEFSQU1fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiNDNhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oCkBAIC0wLDAgKzEsNzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0lOVEVSRkFDRV9IRUxQRVJfSF8KKyNkZWZpbmUgQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKioKKyAqIEludGVyZmFjZSBIZWxwZXIKKyAqLwordXNpbmcgQzJSID0gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRT1zdGQ6OmlzX2VudW08VD46OnZhbHVlPgorc3RydWN0IF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGUgeworICAgIHR5cGVkZWYgVCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPFQsIHRydWU+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHR5cGU7Cit9OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBpbXBsZW1lbnQgcGFyYW1ldGVyIHJlZmxlY3RvcnMuIFRoaXMgY2xhc3MgaXMgZHluYW1pYyBhbmQgaXMgZGVzaWduZWQgdG8gYmUKKyAqIHNoYXJlZCBieSBtdWx0aXBsZSBpbnRlcmZhY2VzLiBUaGlzIGFsbG93cyBpbnRlcmZhY2VzIHRvIGFkZCBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgYXMgbmVlZGVkLgorICovCitjbGFzcyBDMlJlZmxlY3RvckhlbHBlciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICBDMlJlZmxlY3RvckhlbHBlcigpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5DMlJlZmxlY3RvckhlbHBlcigpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKAorICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IHBhcmFtSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIFBhcmFtcyB0eXBlcyBvZiBjb2RlYyAyLjAgc3RydWN0cyAob3IgcGFyYW1ldGVycykgdG8gZGVzY3JpYmUKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgQzJfSU5MSU5FIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0czsKKyAgICAgICAgYWRkU3RydWN0RGVzY3JpcHRvcnMoc3RydWN0cywgKF9UdXBsZTxQYXJhbXMuLi4+ICopbnVsbHB0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIGEgc3BlY2lmaWMgc3RydWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHN0cnVrdCBkZXNjcmlwdG9yIGZvciB0aGUgc3RydWN0IHRoYXQgd2lsbCBiZSBtb3ZlZCBvdXQuCisgICAgICovCisgICAgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9yKEMyU3RydWN0RGVzY3JpcHRvciAmJnN0cnVrdCk7CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gUGFyYW1zPgorICAgIGNsYXNzIEMyX0hJREUgX1R1cGxlIHsgfTsKKworICAgIC8qKgorICAgICAqIEFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZGVzY3JpcHRvcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gc3RydWN0cyBMaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB0byBhZGQgc3VwcG9ydCBmb3IKKyAgICAgKi8KKyAgICB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPD4gKik7CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZGVzY3JpcHRvcnMgaW4gYSByZWN1cnNpdmUgbWFubmVyCisgICAgICogb25lIHN0cnVjdHVyZSBhdCBhIHRpbWUgdXNpbmcgYSBsaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB0ZW1wb3JhcnkuCisgICAgICoKKyAgICAgKiBccGFyYW0gVCB0aGUgdHlwZSBvZiBjb2RlYyAyLjAgc3RydWN0IHRvIGRlc2NyaWJlCisgICAgICogXHBhcmFtIFBhcmFtcyByZXN0IG9mIHRoZSBzdHJ1Y3RzCisgICAgICogXHBhcmFtIHN0cnVjdHMgVGVtcG9yYXJ5IGxpc3Qgb2Ygc3RydWN0dXJlIGRlc2NyaXB0b3JzIHVzZWQgdG8gb3B0aW1pemUgdGhlIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgQzJfSU5MSU5FIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+ICZzdHJ1Y3RzLCBfVHVwbGU8VCwgUGFyYW1zLi4uPiAqKSB7CisgICAgICAgIHN0cnVjdHMuZW1wbGFjZV9iYWNrKChUKiludWxscHRyKTsKKyAgICAgICAgYWRkU3RydWN0RGVzY3JpcHRvcnMoc3RydWN0cywgKF9UdXBsZTxQYXJhbXMuLi4+ICopbnVsbHB0cik7CisgICAgfQorCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IF9tTXV0ZXg7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6Q29yZUluZGV4LCBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3I+IF9tU3RydWN0czsgLy8vPCBkZXNjcmlwdG9ycworfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY29kZWMgMi4wIGludGVyZmFjZSBBUEktcyBmb3Igc29tZSBwYXJhbWV0ZXJzLgorICoKKyAqIFRoaXMgY2xhc3MgbXVzdCBiZSBzdWJjbGFzc2VkLgorICovCitjbGFzcyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmFzZSBvZmZzZXQgb2YgYSBmaWVsZCBhdCB8b2Zmc2V0fCB0aGF0IGNvdWxkIGJlIHBhcnQgb2YgYW4gYXJyYXkgb3IgcGFydCBvZiBhCisgICAgICogc3ViLXN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIGZpZWxkIHNpemUgdmVyaWZpY2F0aW9uLCBlLmcuIGlmIG9mZnNldCBpZiBvYnRhaW5lZCBmcm9tIGEgc3RydWN0dXJlLAorICAgICAqIGl0IHdpbGwgbm90IHN0b3AgYXQgdGhlIHN0cnVjdHVyZSBib3VuZGFyeSAtIHRoaXMgaXMgb2theSwgYXMgd2UganVzdCB3YW50IHRoZSBiYXNlIG9mZnNldAorICAgICAqIGhlcmUsIHdoaWNoIGlzIHRoZSBzYW1lLgorICAgICAqLworICAgIHN0YXRpYworICAgIHNpemVfdCBHZXRCYXNlT2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIHNpemVfdCBvZmZzZXQpOworCisgICAgLyoqCisgICAgICogVGhlIGludGVyZmFjZSBoZWxwZXIgY2xhc3MgdXNlcyByZWZlcmVuY2VzIHRvIHN0ZDo6c2hhcmVkX3B0cjxUPiBjb25maWcgcGFyYW1ldGVycy4KKyAgICAgKiBJbnRlcm5hbGx5LCB0aGVzZSBuZWVkIHRvIGJlIGdlbmVyYWxpemVkIHRvIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiByZWZzLCBidXQgdGhlIGNhc3QgaXMKKyAgICAgKiBub3QgYWxsb3dlZCAoYXMgdGhlc2UgYXJlIHJlZmVyZW5jZXMpLiBBcyBzdWNoLCB0aGlzIGNsYXNzIG5ldmVyIHJldHVybnMgcG9pbnRlciB0byB0aGUKKyAgICAgKiBzaGFyZWRfcHRycy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgUGFyYW1SZWYgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBlbmFibGU9CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxULCBDMlBhcmFtPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpbmxpbmUgQzJfSElERSBQYXJhbVJlZihzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtKQorICAgICAgICAgICAgOiBfbVJlZihyZWludGVycHJldF9jYXN0PHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPio+KCZwYXJhbSkpIHsgfQorCisgICAgICAgIC8vIHVzZWQgYnkgY29tcGFyaXNvbiBvcGVyYXRvciBmb3IgY29udGFpbmVycworICAgICAgICBvcGVyYXRvciBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gKigpIGNvbnN0IHsgcmV0dXJuIF9tUmVmOyB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGdldCgpIGNvbnN0IHsgcmV0dXJuICpfbVJlZjsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+ICpfbVJlZjsKKyAgICB9OworCisgICAgLyoqCisgICAgICogRmllbGQgaGVscGVyLgorICAgICAqCisgICAgICogQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpZWxkOiBwb3NzaWJsZSB2YWx1ZXMsIGFuZCBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICogdmFsdWVzLgorICAgICAqLworICAgIGNsYXNzIEZpZWxkSGVscGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGhlbHBlciBmb3IgYSBmaWVsZCB3aXRoIGdpdmVuIHBvc3NpYmxlIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciByZWZlcmVuY2UuIFRoZSBwYXJhbWV0ZXIgZG9lcyBub3QgaGF2ZSB0byBiZSBpbml0aWFsaXplZCBhdCB0aGlzCisgICAgICAgICAqICAgICAgICBwb2ludC4KKyAgICAgICAgICogXHBhcmFtIGZpZWxkIGZpZWxkIGlkZW50aWZpZXIKKyAgICAgICAgICogXHBhcmFtIHZhbHVlcyBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBmaWVsZAorICAgICAgICAgKi8KKyAgICAgICAgRmllbGRIZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHBhcmFtLWZpZWxkIGlkZW50aWZpZXIgZm9yIHRoaXMgZmllbGQuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUKKyAgICAgICAgICogdW5kZXJseWluZyBwYXJhbWV0ZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFxhcmFtIGluZGV4CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQzJQYXJhbUZpZWxkCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGQgbWFrZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZhbHVlcyBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyB0aGF0IHdpbGwgYmUgbW92ZWQgb3V0CisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldFN1cHBvcnRlZFZhbHVlcyhzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gVGhpcyBkZWZhdWx0cyB0byB0aGUgcG9zc2libGUgdmFsdWVzCisgICAgICAgICAqIGlmIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIHdlcmUgbmV2ZXIgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZ2V0U3VwcG9ydGVkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmdldFBvc3NpYmxlVmFsdWVzKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIFRPRE86IG1vdmUgdG8gaW1wbCBmb3Igc2FmZXR5CisgICAgICAgIFBhcmFtUmVmIG1QYXJhbTsKKyAgICAgICAgX0MyRmllbGRJZCBtRmllbGRJZDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IG1Qb3NzaWJsZTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IG1TdXBwb3J0ZWQ7IC8vLzwgaWYgZGlmZmVyZW50IGZyb20gcG9zc2libGUKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgQzJfSElERSBQYXJhbTsKKyAgICBjbGFzcyBQYXJhbUhlbHBlcjsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgaXMgYW4gaW50ZXJmYWNlIHRvIGdldCB0aGUgcGFyYW1ldGVyIGhlbHBlcnMgZnJvbSBhIHN0ZDo6c2hhcmVkX3B0cjxUPiAmLgorICAgICAqLworICAgIGNsYXNzIEZhY3RvcnkgeworICAgICAgICAvLyBcdG9kbyB0aGlzIG1heSBiZSBhbHJlYWR5IGluIFBhcmFtSGVscGVyCisgICAgICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFJlZmxlY3RvcigpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gZ2V0UGFyYW1IZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtKSBjb25zdCA9IDA7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkZhY3RvcnkoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgUGFyYW08VD4gZ2V0KHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxUPiBhbHRWYWx1ZSA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBQYXJhbTxUPihnZXRQYXJhbUhlbHBlcihQYXJhbVJlZihwYXJhbSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdFZhbHVlID09IG51bGxwdHIgPyBwYXJhbSA6IGFsdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZmxlY3RvcigpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlZCBmaWVsZCBoZWxwZXIuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgRmllbGQgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBoZWxwZXIgaGVscGVyIGZvciB0aGlzIGZpZWxkCisgICAgICAgICAqIFxwYXJhbSBpbmRleCAgcGFyYW1ldGVyIGluZGV4ICh0aGlzIGlzIG5lZWRlZCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlIGR1cmluZyBwYXJhbWV0ZXIKKyAgICAgICAgICogICAgICAgIGNvbnN0cnVjdGlvbikgXHRvZG8gcmVtb3ZlCisgICAgICAgICAqLworICAgICAgICBGaWVsZChzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciwgQzJQYXJhbTo6SW5kZXggaW5kZXgpOworCisgICAgICAgIGJvb2wgc3VwcG9ydHNBdEFsbChUIHZhbHVlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPigqX21IZWxwZXItPmdldFBvc3NpYmxlVmFsdWVzKCkpLnN1cHBvcnRzKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgc3VwcG9ydHNOb3coVCB2YWx1ZSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oKl9tSGVscGVyLT5nZXRTdXBwb3J0ZWRWYWx1ZXMoKSkuc3VwcG9ydHModmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjb25mbGljdCByZXNvbHV0aW9uIHN1Z2dlc3Rpb24gYnVpbGRlciBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gc2hvdWxkQmUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGJ1aWxkZXIgZm9yIHRoaXMgZmllbGQuIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQKKyAgICAgICAgICogZm9yIG5vbi1jb25zdCBmaWVsZHMgdG8gZGlzYWxsb3cgc2V0dGluZyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBkZXBlbmRlbmNpZXMuCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IG11c3RCZSgpOworCisgICAgICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBfbUZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETworICAgICAgICBDMlIgdmFsaWRhdGVQb3NzaWJsZShjb25zdCBUICZ2YWx1ZSBfX3VudXNlZCkgY29uc3QgeworICAgICAgICAgICAgLy8vIFRPRE8KKyAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gX21IZWxwZXI7CisgICAgICAgIEMyUGFyYW1GaWVsZCBfbUZpZWxkOworICAgIH07CisKKyAgICBjbGFzcyBQYXJhbUhlbHBlciB7CisgICAgcHVibGljOgorICAgICAgICBQYXJhbUhlbHBlcihQYXJhbVJlZiBwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvciAmJik7CisgICAgICAgIFBhcmFtSGVscGVyKFBhcmFtSGVscGVyICYmKTsKKyAgICAgICAgflBhcmFtSGVscGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmRzIGEgZmllbGQgZGVzY3JpcHRvci4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gZmluZEZpZWxkKHNpemVfdCBiYXNlT2Zmcywgc2l6ZV90IGJhc2VTaXplKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHJlZiBmb3IgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgY29uc3QgUGFyYW1SZWYgcmVmKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgYXMgbW9kaWZpYWJsZS4gVGhlIGNvbnN0bmVzcyBvZiB0aGlzCisgICAgICAgIC8vLyBvYmplY3QgZGV0ZXJtaW5lcyB0aGUgY29uc3RuZXNzIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlKCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgYXMgY29uc3QKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW0+IHZhbHVlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UgcmVxdWVzdCBmb3IgdGhpcyBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSB2YWx1ZSAgICB0aGUgdmFsdWUgdGhhdCBpcyBiZWluZyBhc3NpZ25lZCB0byB0aGlzIHBhcmFtZXRlci4KKyAgICAgICAgICogICAgICAgICAgICAgICAgIFRoaXMgY291bGQgYmUgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuIFRoaXMgbXVzdCBub3QgY2hhbmdlLgorICAgICAgICAgKiBccGFyYW0gbWF5QmxvY2sgd2hldGhlciBibG9ja2luZyBpcyBhbGxvd2VkCisgICAgICAgICAqIFxwYXJhbSBlbmRWYWx1ZSB0aGUgcmVzdWx0aW5nIHZhbHVlCisgICAgICAgICAqIFxwYXJhbSBmYWN0b3J5ICBwYXJhbWV0ZXIgZmFjdG9yeSAodG8gYWNjZXNzIGRlcGVuZGVuY2llcykKKyAgICAgICAgICogXHBhcmFtIGZhaWx1cmVzIHZlY3RvciBvZiBmYWlsdXJlcyB0byBhcHBlbmQgYW55IGZhaWx1cmVzIGZyb20gdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgICAgb3BlcmF0aW9uCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGNvbmZpZ3VyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdmFsdWUgaXMgaW5jb3JyZWN0IChUQkQpCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQKKyAgICAgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY29uZmlndXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgY29uZmlndXJhdGlvbiByZXF1aXJlcyBibG9ja2luZyB0byBiZSBhbGxvd2VkCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIGludGVyZmFjZSBpcyBjb3JydXB0ZWQKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IHRyeVNldCgKKyAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICBib29sICpjaGFuZ2VkLAorICAgICAgICAgICAgICAgIEZhY3RvcnkgJmZhY3RvcnksCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKKyAgICAgICAgLy8vIHJldHVybnMgcGFyYW1ldGVyIGluZGljZXMgdGhhdCBkZXBlbmQgb24gdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGdldERvd25EZXBlbmRlbmNpZXMoKSBjb25zdDsKKworICAgICAgICAvLy8gYWRkcyBhIGRlcGVuZGVudCBwYXJhbWV0ZXIKKyAgICAgICAgdm9pZCBhZGREb3duRGVwZW5kZW5jeShDMlBhcmFtOjpJbmRleCBpbmRleCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhhdCBwYXJhbWV0ZXIgcmVmcyBmb3IgcGFyYW1ldGVycyB0aGF0IGRlcGVuZCBvbiB0aGlzCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBnZXREZXBlbmRlbmNpZXNBc1JlZnMoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyBhbmQgbW92ZXMgb3V0IHN0b3JlZCBzdHJ1Y3QgZGVzY3JpcHRvcgorICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3IgcmV0cmlldmVTdHJ1Y3REZXNjcmlwdG9yKCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgQzJTdHJpbmcgbmFtZSgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+IGdldERlc2NyaXB0b3IoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVmFsaWRhdGVzIHBhcmFtIGhlbHBlci4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIG5vdywgdGhpcyBmaWxscyBmaWVsZCBpbmZvIGZvciBjb25zdCBwYXJhbXMuCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBwYXJhbWV0ZXIgY2Fubm90IGJlIGFkZGVkIGFzIHN1Y2gKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IHZhbGlkYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdHlwZWRlZiBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliX3Q7CisgICAgICAgIGF0dHJpYl90JiBhdHRyaWIoKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZGVmYXVsdF8pOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBzZXR0ZXIgbWV0aG9kCisgICAgICAgIHZvaWQgc2V0U2V0dGVyKHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBnZXR0ZXIgbWV0aG9kCisgICAgICAgIHZvaWQgc2V0R2V0dGVyKHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBnZXR0ZXIpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgdm9pZCBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZmllbGRzIGFuZCB0aGVpciBzdXBwb3J0ZWQgdmFsdWVzCisgICAgICAgIHZvaWQgc2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpOworCisgICAgICAgIC8vLyBidWlsZCB0aGlzIGludG8gYSBmaW5hbCBQYXJhbUhlbHBlciBvYmplY3QKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBidWlsZCgpOworCisgICAgICAgIGNsYXNzIEltcGw7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogVHlwZWQgcGFyYW1ldGVyIGhlbHBlci4gVGhpcyBwcm92aWRlcyBhY2Nlc3MgdG8gbWVtYmVycyBhcyB3ZWxsIGFzIGZpZWxkIGhlbHBlcnMuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgQzJfSElERSBQYXJhbSB7CisgICAgICAgIFBhcmFtKAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gaGVscGVyLCBzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgICAgICA6IHYoKnBhcmFtLmdldCgpKSwKKyAgICAgICAgICAgICAgX21UeXBlZFBhcmFtKHBhcmFtKSwKKyAgICAgICAgICAgICAgX21IZWxwZXIoaGVscGVyKSwKKyAgICAgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICB1c2luZyBGaWVsZFR5cGUgPSBGaWVsZDwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxTPjo6dHlwZT46OnR5cGU+Ojp0eXBlPjsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICBGaWVsZFR5cGU8Uz4gRihTICZmaWVsZCkgeworICAgICAgICAgICAgc2l6ZV90IG9mZnMgPSAodWludHB0cl90KSZmaWVsZCAtICh1aW50cHRyX3QpJmdldCgpOworICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGZhbGwgZWl0aGVyIHdpdGhpbiBzaXplb2YoVCkgKyBGTEVYX1NJWkUgb3IgcGFyYW0tPnNpemUoKQorICAgICAgICAgICAgLy8gc2l6ZV90IHNpemUgPSBzaXplb2YoZmllbGQpOworICAgICAgICAgICAgLy8gbVBhcmFtIG1heSBiZSBudWxsCisgICAgICAgICAgICBzaXplX3QgYmFzZVNpemUgPSBzaXplb2YodHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFM+Ojp0eXBlKTsKKyAgICAgICAgICAgIHNpemVfdCBiYXNlT2ZmcyA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIF9tUmVmbGVjdG9yLCBUOjpDT1JFX0lOREVYLCBvZmZzIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgICAgIGlmICh+YmFzZU9mZnMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEMyX0xPRyhGQVRBTCkgPDwgInVua25vd24gZmllbGQgYXQgb2Zmc2V0ICIgPDwgb2ZmcyA8PCAiIHNpemUgIiA8PCBzaXplb2YoUykKKyAgICAgICAgICAgICAgICAvLyAgICAgICA8PCAiIGJhc2Utc2l6ZSAiIDw8IGJhc2VTaXplOworICAgICAgICAgICAgICAgIC8vIF9fYnVpbHRpbl90cmFwKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJhc2VPZmZzICs9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBoZWxwZXIgPSBfbUhlbHBlci0+ZmluZEZpZWxkKGJhc2VPZmZzLCBiYXNlU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlPFM+KGhlbHBlciwgX21UeXBlZFBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbnN0IFBhcmFtIGhhdmUgY29uc3QgRmllbGRzOyBob3dldmVyLCByZW1vdmUgY29uc3QgZnJvbSBTCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIGNvbnN0IEZpZWxkVHlwZTxTPiBGKFMgJmZpZWxkKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBGaWVsZFR5cGU8Uz4+KGNvbnN0X2Nhc3Q8UGFyYW0gKj4odGhpcyktPkYoZmllbGQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBSZXR1cm5zIGEgY29uc3QgcmVmIHZhbHVlIG9mIHRoaXMgY29uc3QgcGFyYW0uCisgICAgICAgIGNvbnN0IFQgJmdldCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAqX21UeXBlZFBhcmFtLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYSBtb2RpZmlhYmxlIHJlZiB2YWx1ZSBvZiB0aGlzIG5vbi1jb25zdCBwYXJhbS4KKyAgICAgICAgVCAmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICpfbVR5cGVkUGFyYW0uZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gQ29uc3QtcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZS5zCisgICAgICAgIFQgY29uc3QgJnY7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gX21UeXBlZFBhcmFtOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IF9tSGVscGVyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdXNpbmcgQzJQID0gUGFyYW08VD47CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZWQgbW92ZSBidWlsZGVyIGNsYXNzIGZvciBhIHBhcmFtZXRlciBoZWxwZXIuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBDMl9ISURFIFBhcmFtQnVpbGRlciA6IHByaXZhdGUgUGFyYW1IZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIENvbnN0cnVjdCB0aGUgcGFyYW1ldGVyIGJ1aWxkZXIgZnJvbSBtaW5pbWFsIGluZm8gcmVxdWlyZWQuICovCisgICAgICAgIFBhcmFtQnVpbGRlcihzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSkKKyAgICAgICAgICAgIDogUGFyYW1IZWxwZXIocGFyYW0sIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvcigoVCopbnVsbHB0cikpLAorICAgICAgICAgICAgICBtVHlwZWRQYXJhbSgmcGFyYW0pIHsKKyAgICAgICAgICAgIGF0dHJpYigpID0gYXR0cmliX3Q6OklTX1BFUlNJU1RFTlQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgcmVxdWlyZWQuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJnJlcXVpcmVkKCkgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1JFUVVJUkVEOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIHRyYW5zaWVudCAobm90IHBlcnNpc3RlbnQpLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ0cmFuc2llbnQoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSAmPSB+YXR0cmliX3Q6OklTX1BFUlNJU1RFTlQ7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgaGlkZGVuIChub3QgZXhwb3NlZCBpbiBKQVZBIEFQSSkuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJmhpZGRlbigpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19ISURERU47CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgaW50ZXJuYWwgKG5vdCBleHBvc2VkIHRvIHF1ZXJ5L3NldHRpbmdzKS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmaW50ZXJuYWwoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfSU5URVJOQUw7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBkZWZhdWx0IHZhbHVlLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aERlZmF1bHQoc3RkOjpzaGFyZWRfcHRyPFQ+IGRlZmF1bHRfKSB7CisgICAgICAgICAgICAvLyBDSEVDSyghbURlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICAvLyBXQVJOX0lGKCFkZWZhdWx0Xyk7IC8vIGNvdWxkIGJlIG51bGxwdHIgaWYgT09NCisgICAgICAgICAgICAvLyB0ZWNobmljYWxseSwgdGhpcyBjb3VsZCBiZSBpbiB0aGUgcGFyZW50CisgICAgICAgICAgICAqbVR5cGVkUGFyYW0gPSBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCpkZWZhdWx0XykucmVsZWFzZSgpKSk7CisgICAgICAgICAgICBzZXREZWZhdWx0VmFsdWUoZGVmYXVsdF8pOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICp0eXBlZFBhcmFtID0gbVR5cGVkUGFyYW07CisgICAgICAgICAgICBzZXRHZXR0ZXIoW3R5cGVkUGFyYW1dKGJvb2wpIC0+IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlBhcmFtPigqdHlwZWRQYXJhbSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGRlZmF1bHQgdmFsdWUuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoRGVmYXVsdChUICpkZWZhdWx0XykgeworICAgICAgICAgICAgcmV0dXJuIHdpdGhEZWZhdWx0KHN0ZDo6c2hhcmVkX3B0cjxUPihkZWZhdWx0XykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgYWxsIGZpZWxkcyB0byB0aGlzIHBhcmFtZXRlciB3aXRoIHRoZWlyIHBvc3NpYmxlIHZhbHVlcy4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzXykgeworICAgICAgICAgICAgc2V0RmllbGRzKHN0ZDo6bW92ZShmaWVsZHNfKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIGNvbnN0YW50IHZhbHVlIChhbHNvIGFzIGRlZmF1bHQpLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQ29uc3QgcGFyYW1ldGVycyBieSBkZWZpbml0aW9uIGhhdmUgbm8gZGVwZW5kZW5jaWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aENvbnN0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPFQ+IGRlZmF1bHRfKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfQ09OU1Q7CisgICAgICAgICAgICBzZXRTZXR0ZXIoW2RlZmF1bHRfXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2sgX191bnVzZWQsIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJikgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCp0eXBlZFZhbHVlICE9ICpkZWZhdWx0XykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBSZWFkT25seSgqZGVmYXVsdF8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiB3aXRoRGVmYXVsdChkZWZhdWx0Xyk7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBjb25zdGFudCB2YWx1ZSAoYWxzbyBhcyBkZWZhdWx0KS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhDb25zdFZhbHVlKFQgKmRlZmF1bHRfKSB7CisgICAgICAgICAgICByZXR1cm4gd2l0aENvbnN0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPFQ+KGRlZmF1bHRfKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIGEgc3RyaWN0IHNldHRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgc3RyaWN0IHNldHRlcgorICAgICAgICAgKiBccGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgKHJlZmVyZW5jZXMpCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gRGVwcz4KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICBDMlIgKCpmbikoYm9vbCwgY29uc3QgQzJQPFQ+ICYsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERlcHM+JiAuLi4gZGVwcykgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1NUUklDVDsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqdHlwZWRQYXJhbSA9IG1UeXBlZFBhcmFtOworICAgICAgICAgICAgc2V0U2V0dGVyKFt0eXBlZFBhcmFtLCBmbiwgJmRlcHMuLi5dKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZmFjdG9yeSkgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG8gY29weS1vbi1jaGFuZ2UgZm9yIHBhcmFtZXRlcnMgaW4gdGhpcyBoZWxwZXIgc28gY2hhbmdlIGNhbiBiZSBkZXRlY3RlZCBieQorICAgICAgICAgICAgICAgIC8vIGEgY2hhbmdlIG9mIHRoZSBwb2ludGVyLiBEbyB0aGlzIGJ5IHdvcmtpbmcgb24gYSBwcm9wb3NlZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcHJvcG9zZWRWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcG9zZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok5vTWVtb3J5KHZhbHVlLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQzJQPFQ+IG9sZFZhbHVlID0gZmFjdG9yeS5nZXQoKnR5cGVkUGFyYW0pOworICAgICAgICAgICAgICAgIC8vIEdldCBhIHBhcmFtZXRlciBoZWxwZXIgd2l0aCB2YWx1ZSBwb2ludGluZyB0byBwcm9wb3NlZFZhbHVlCisgICAgICAgICAgICAgICAgQzJQPFQ+IGhlbHBlciA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtLCBwcm9wb3NlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICBDMlIgcmVzdWx0ID0gZm4obWF5QmxvY2ssIG9sZFZhbHVlLCBoZWxwZXIsIGZhY3RvcnkuZ2V0KGRlcHMpLi4uKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHZhbHVlIGNoYW5nZWQsIGNvcHkgcmVzdWx0IHRvIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiAoaGVscGVyLmdldCgpICE9ICp0eXBlZFBhcmFtLT5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAqdHlwZWRQYXJhbSA9IHByb3Bvc2VkVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PnsgZGVwcy0+aW5kZXgoKS4uLiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPnsgUGFyYW1SZWYoZGVwcykuLi4gfSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIGEgbm9uLXN0cmljdCBzZXR0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBmbiAgIG5vbi1zdHJpY3Qgc2V0dGVyCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgIEMyUiAoKmZuKShib29sLCBDMlA8VD4gJiwgY29uc3QgQzJQPERlcHM+ICYuLi4pLCBzdGQ6OnNoYXJlZF9wdHI8RGVwcz4mIC4uLiBkZXBzKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKnR5cGVkUGFyYW0gPSBtVHlwZWRQYXJhbTsKKyAgICAgICAgICAgIHNldFNldHRlcihbdHlwZWRQYXJhbSwgZm4sICZkZXBzLi4uXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmZhY3RvcnkpIC0+IEMyUiB7CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICp0eXBlZFZhbHVlID0gVDo6RnJvbSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBCYWRWYWx1ZS9JbnZhbGlkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvIGNvcHktb24tY2hhbmdlIGZvciBwYXJhbWV0ZXJzIGluIHRoaXMgaGVscGVyIHNvIGNoYW5nZSBjYW4gYmUgZGV0ZWN0ZWQgYnkKKyAgICAgICAgICAgICAgICAvLyBhIGNoYW5nZSBvZiB0aGUgcG9pbnRlci4gRG8gdGhpcyBieSB3b3JraW5nIG9uIGEgcHJvcG9zZWQgdmFsdWUuCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHByb3Bvc2VkVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCp2YWx1ZSkucmVsZWFzZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2VkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpOb01lbW9yeSh2YWx1ZS0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEdldCBhIHBhcmFtZXRlciBoZWxwZXIgd2l0aCB2YWx1ZSBwb2ludGluZyB0byBwcm9wb3NlZFZhbHVlCisgICAgICAgICAgICAgICAgQzJQPFQ+IGhlbHBlciA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtLCBwcm9wb3NlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICBDMlIgcmVzdWx0ID0gZm4obWF5QmxvY2ssIGhlbHBlciwgZmFjdG9yeS5nZXQoZGVwcykuLi4pOworCisgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWUgY2hhbmdlZCwgY29weSByZXN1bHQgdG8gY3VycmVudCB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChoZWxwZXIuZ2V0KCkgIT0gKnR5cGVkUGFyYW0tPmdldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICp0eXBlZFBhcmFtID0gcHJvcG9zZWRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+eyBkZXBzLT5pbmRleCgpLi4uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+eyBQYXJhbVJlZihkZXBzKS4uLiB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXJrcyB0aGlzIGEgY2FsY3VsYXRlZCAocmVhZC1vbmx5KSBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgbm9uLXN0cmljdCBzZXR0ZXIgKGNhbGN1bGF0b3IpCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZjYWxjdWxhdGVkQXMoCisgICAgICAgICAgICAgICAgQzJSICgqZm4pKGJvb2wsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksIHN0ZDo6c2hhcmVkX3B0cjxEZXBzPiYgLi4uIGRlcHMpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19SRUFEX09OTFk7CisgICAgICAgICAgICByZXR1cm4gd2l0aFNldHRlcihmbiwgc3RkOjpmb3J3YXJkPGRlY2x0eXBlKGRlcHMpPihkZXBzKS4uLik7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBQYXJhbUhlbHBlcjo6YnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKm1UeXBlZFBhcmFtOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBQYXJhbUJ1aWxkZXI8VD4gRGVmaW5lUGFyYW0oc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIFBhcmFtQnVpbGRlcjxUPihwYXJhbSwgbmFtZSk7CisgICAgfQorCitwdWJsaWM6CisgICAgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogSGVscGVyIGltcGxlbWVudGluZyBjb25maWcgY2FsbHMgYXMgd2VsbCBhcyBvdGhlciBjb25maWd1cmF0aW9uIHVwZGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB2aXJ0dWFsLCBzbyBpbXBsZW1lbnRhdGlvbnMgbWF5IHByb3ZpZGUgd3JhcHBlcnMgYXJvdW5kIGl0IChhbmQgcGVyZm9ybQorICAgICAqIGFjdGlvbnMganVzdCBiZWZvcmUgYW5kIGFmdGVyIGEgY29uZmlndXJhdGlvbikuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zCisgICAgICogXHBhcmFtIG1heUJsb2NrCisgICAgICogXHBhcmFtIGZhaWx1cmVzCisgICAgICogXHBhcmFtIHVwZGF0ZVBhcmFtcyBpZiB0cnVlLCB0aGUgdXBkYXRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBjb3BpZWQgYmFjayBpbnRvIHRoZSBhcmd1bWVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBpbiB8cGFyYW1zfAorICAgICAqIFxwYXJhbSBjaGFuZ2VzICAgICAgcG9pbnRlZCB0byBhIHZlY3RvciB0byByZWNlaXZlIHNldHRpbmdzIHdpdGggdGhlaXIgdmFsdWVzIGNoYW5nZWQuIElmIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc2V0dGluZ3Mgd2l0aCB0aGVpciB2YWx1ZXMgY2hhbmdlZCBhcmUgYWRkZWQgdG8gdGhpcy4KKyAgICAgKiBccmV0dXJuIHJlc3VsdCBmcm9tIGNvbmZpZworICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzLAorICAgICAgICAgICAgYm9vbCB1cGRhdGVQYXJhbXMgPSB0cnVlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+PiAqY2hhbmdlcyA9IG51bGxwdHIpOworCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gZ2V0UmVmbGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbVJlZmxlY3RvcjsKKyAgICB9CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gTG9jazsKKworICAgIC8qKgorICAgICAqIExvY2tzIHRoZSBpbnRlcmZhY2UgYW5kIHJldHVybnMgYSBsb2NrLiBUaGlzIGxvY2sgbXVzdCBiZSB1bmxvY2tlZCBvciByZWxlYXNlZCB3aXRob3V0CisgICAgICogY2FsbGluZyBhbnkgb3RoZXIgYmxvY2tpbmcgY2FsbC4KKyAgICAgKi8KKyAgICBMb2NrIGxvY2soKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB2b2lkIHNldEludGVyZmFjZUFkZHJlc3NCb3VuZHModWludHB0cl90IHN0YXJ0LCB1aW50cHRyX3QgZW5kKSB7CisgICAgICAgIC8vIFRPRE86IGV4Y2x1ZGUgdGhpcyBoZWxwZXIKKyAgICAgICAgKHZvaWQpc3RhcnQ7CisgICAgICAgICh2b2lkKWVuZDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvcjsKKyAgICBzdHJ1Y3QgRmFjdG9yeUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEZhY3RvcnlJbXBsPiBfbUZhY3Rvcnk7CisKKyAgICBDMkludGVyZmFjZUhlbHBlcihzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGFyYW1ldGVyIHRvIHRoaXMgaW50ZXJmYWNlLgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIENIRUNLcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwYXJhbWV0ZXIgdG8gYWRkLgorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1ldGVyKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVwZW5kZW5jeSBpbmRleCBmb3IgYSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaXggdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBzaXplX3QgZ2V0RGVwZW5kZW5jeUluZGV4X2woQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0OworCisgICAgdmlydHVhbCB+QzJJbnRlcmZhY2VIZWxwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHN1YmNsYXNzIGluc3RhbmNlJ3MgYWRkcmVzcyBhbmQgc2l6ZS4KKyAgICAgKgorICAgICAqIFx0b2RvIGFsbG93IHN1YmNsYXNzIHRvIHNwZWNpZnkgcGFyYW1ldGVyIGFkZHJlc3MgcmFuZ2UgZGlyZWN0bHkgKGUuZy4gZG8gbm90IGFzc3VtZSB0aGF0CisgICAgICogICAgICAgdGhleSBhcmUgbG9jYWwgdG8gdGhlIHN1YmNsYXNzIGluc3RhbmNlKQorICAgICAqCisgICAgICogXHBhcmFtIFQgdHlwZSBvZiB0aGUgZGVyaXZlZCBpbnN0YW5jZQorICAgICAqIFxwYXJhbSBpbnN0YW5jZSBwb2ludGVyIHRvIHRoZSBkZXJpdmVkIGluc3RhbmNlCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJfSElERSB2b2lkIHNldERlcml2ZWRJbnN0YW5jZShUICppbnN0YW5jZSkgeworICAgICAgICBzZXRJbnRlcmZhY2VBZGRyZXNzQm91bmRzKCh1aW50cHRyX3QpaW5zdGFuY2UsICh1aW50cHRyX3QpKGluc3RhbmNlICsgMSkpOworICAgIH0KKworICAgIEMyX0RPX05PVF9DT1BZKEMySW50ZXJmYWNlSGVscGVyKTsKK307CisKKy8qKgorICogQ3JlYXRlcyBhIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgY2xhc3MgZm9yIGEgZmllbGQgb2YgYSBwYXJhbWV0ZXIKKyAqCisgKiBccGFyYW0gc3BQYXJhbSBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGluIGFuIGludGVyZmFjZSBjbGFzcyBzdWJjbGFzc2VkIGZyb20gQzJJbnRlcmZhY2VIZWxwZXIuCisgKiBccGFyYW0gZmllbGQgICBhIGZpZWxkIG9mIHN1Y2ggcGFyYW1ldGVyCisgKi8KKyNkZWZpbmUgQzJGKHNwUGFyYW0sIGZpZWxkKSBcCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjwgXAorICAgICAgICAgICAgdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTwgXAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKHNwUGFyYW0tPmZpZWxkKT46OnR5cGU+Ojp0eXBlPjo6dHlwZT4oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKHNwUGFyYW0uZ2V0KCksICZzcFBhcmFtLT5maWVsZCkpCisKKyNlbmRpZiAgLy8gQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTAzN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaApAQCAtMCwwICsxLDExMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIG1hcCB1bmRlcmx5aW5nIHR5cGVzIHRvIEMyVmFsdWUgdHlwZXMgYXMgd2VsbCBhcyB0byBwcmludCBmaWVsZCB2YWx1ZXMuIFRoaXMgaXMKKyAqIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBzaW1wbHkgdGhlIHVuZGVybHlpbmcgdHlwZSBleGNlcHQgZm9yIGNoYXJhY3RlcnMgKFNUUklORykgYW5kIGJ5dGVzIChCTE9CKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMl9ISURFIF9DMkZpZWxkVmFsdWVIZWxwZXIgeworICAgIHR5cGVkZWYgVCBWYWx1ZVR5cGU7CisgICAgaW5saW5lIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IHAucmVmPFQ+KCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEMyX0hJREUgX0MyRmllbGRWYWx1ZUhlbHBlcjx1aW50OF90PiB7CisgICAgdHlwZWRlZiB1aW50MzJfdCBWYWx1ZVR5cGU7CisgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSYgcHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCk7Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQzJfSElERSBfQzJGaWVsZFZhbHVlSGVscGVyPGNoYXI+IHsKKyAgICB0eXBlZGVmIGludDMyX3QgVmFsdWVUeXBlOworICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApOworfTsKKworLyoqCisgKiBTdXBwb3J0ZWQgdmFsdWUgcmFuZ2UgdXRpbGl0eSBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKgorICogVGhpcyBtaW1pY3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlIGZvciBSQU5HRSB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworCisvL3ByaXZhdGU6CisgICAgY29uc3RleHByIHN0YXRpYyBUIE1JTl9WQUxVRSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBNQVhfVkFMVUUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICBjb25zdGV4cHIgc3RhdGljIFQgTUlOX1NURVAgPSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IDAgOiAxOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSByYW5nZSB3aXRoIG5vIHN1cHBvcnRlZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGlzIGEgc3BlY2lhbGl6YXRlZCBzdXBwb3J0ZWQgcmFuZ2UgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogdGhpcyBvYmplY3QgLSBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBFTVBUWSB0eXBlIGluIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShNQVhfVkFMVUUsIE1JTl9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggYWxsIHZhbHVlcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBBbnkoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBhIHNpbmdsZSBzdXBwb3J0ZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHNvbGUgc3VwcG9ydGVkIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgQzJTdXBwb3J0ZWRSYW5nZTxUPiBHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gTUFYX1ZBTFVFID8gTm9uZSgpIDoKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKHN0ZDo6bmV4dGFmdGVyKHZhbHVlLCBNQVhfVkFMVUUpLCBNQVhfVkFMVUUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUgKyBNSU5fU1RFUCwgTUFYX1ZBTFVFKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IEdyZWF0ZXJUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUsIE1BWF9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKGFrYSBub3QgbGVzcyB0aGFuKSBhIGdpdmVuCisgICAgICogdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb3RMZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBHcmVhdGVyVGhhbk9yRXF1YWxUbyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IExlc3NUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gKGFrYSBub3QgZ3JlYXRlciB0aGFuKSBhIGdpdmVuCisgICAgICogdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb3RHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBMZXNzVGhhbk9yRXF1YWxUbyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKHZhbHVlID09IE1JTl9WQUxVRSA/IE5vbmUoKSA6CisgICAgICAgICAgICAgICAgc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPworICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIHN0ZDo6bmV4dGFmdGVyKHZhbHVlLCBNSU5fVkFMVUUpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgdmFsdWUgLSBNSU5fU1RFUCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBjb250aW51b3VzIG9yIGFyaXRobWV0aWMgcmFuZ2UgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgdmFsdWUKKyAgICAgKiBccGFyYW0gbWF4IHRoZSBoaWdoZXIgdmFsdWUgKGlmIHRoaXMgaXMgbG93ZXIgdGhhbiB8bWlufCB0aGUgcmFuZ2Ugd2lsbCBiZSBlbXB0eSkKKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgc3RlcCBvZiB0aGUgYXJpdGhtZXRpYyByYW5nZS4gKElmIHRoaXMgaXMgMCBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMgb3IgMSBmb3IKKyAgICAgKiAgICAgICAgaW50ZWdlciB0eXBlcywgdGhlIGNvbnN0cnVjdGVkIHJhbmdlIGlzIGNvbnRpbnVvdXMpCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBNSU5fU1RFUCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShtaW4sIG1heCwgc3RlcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIG92ZXIgYSBnZW9tZXRyaWMgc2VyaWVzIGJldHdlZW4gdHdvIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgcmFuZ2UKKyAgICAgKiAgICAgICAgYXMgbG9uZyBhcyBpdCBpcyBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqIFxwYXJhbSBtYXggdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCisgICAgICogICAgICAgIHJhbmdlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIG51bSB0aGUgbnVtZXJhdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluU2VyaWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIDAsIG51bSwgZGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBvdmVyIGEgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCByYW5nZQorICAgICAqICAgICAgICBhcyBsb25nIGFzIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICogXHBhcmFtIG1heCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIG9ubHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKKyAgICAgKiAgICAgICAgcmFuZ2UgaWYgaXQgaXMgcGFydCBvZiB0aGUgc2VyaWVzLgorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBhY2N1bXVsYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMKKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBJbk1hY1NlcmllcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIHN0ZXAsIG51bSwgZGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIGVtcHR5CisgICAgICogcmFuZ2UgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBSQU5HRSB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFJhbmdlKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByYW5nZSBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tTWluID4gX21NYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgdmFsaWQuCisgICAgICoKKyAgICAgKiBSYW5nZXMgYXJlIHZhbGlkIGlmIHRoZXkgYXJlIGNvbnRpbnVvdXMgb3IgbW9ub3RvbmljLgorICAgICAqLworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgb3ZlcmZsb3cgb3IgbmVnYXRpdmUgc2VyaWVzCisgICAgICAgIHJldHVybiBfbURlbm9tID4gMCAmJiBfbU51bSA+PSBfbURlbm9tICYmIF9tTWluICogKF9tRGVub20gLSBfbU51bSkgPCBfbVN0ZXAgKiBfbURlbm9tOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIHBhcnQgb2YgdGhpcyByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgcmFuZ2UgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgcmFuZ2UgYW5kIGFub3RoZXIsIGlmIGl0IGlzCisgICAgICogcmVwcmVzZW50YWJsZSBhcyBhIHJhbmdlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgcmFuZ2UKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIGlubGluZSBvcGVyYXRvciBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhfbU1pbiwgX21NYXgsIF9tU3RlcCwgX21OdW0sIF9tRGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvd2VyIGJvdW5kIGFuZCBzdGFydGluZyBwb2ludCBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG1pbigpIGNvbnN0ICAgeyByZXR1cm4gX21NaW47ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdXBwZXIgYm91bmQgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBtYXgoKSBjb25zdCAgIHsgcmV0dXJuIF9tTWF4OyAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0ZXAgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBzdGVwKCkgY29uc3QgIHsgcmV0dXJuIF9tU3RlcDsgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWVyYXRvciBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG51bSgpIGNvbnN0ICAgeyByZXR1cm4gX21OdW07ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVub21pbmF0b3Igb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBkZW5vbSgpIGNvbnN0IHsgcmV0dXJuIF9tRGVub207IH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBhbGwgdmFsdWVzIGJldHdlZW4gX21NaW4gYW5kIF9tTWF4LgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzU2ltcGxlUmFuZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVN0ZXAgPT0gTUlOX1NURVAgJiYgX21OdW0gPT0gMSAmJiBfbURlbm9tID09IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgZGVmaW5lZCBhcyBzdWNoOgorICAgICAqIHhbaSArIDFdID0geFtpXSArIF9tU3RlcCwgd2hlcmUgX21TdGVwID4gMCBhbmQgX21NaW4gPD0geFtpXSA8PSBfbU1heAorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzQXJpdGhtZXRpY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCA+IE1JTl9TVEVQICYmIF9tTnVtID09IDEgJiYgX21EZW5vbSA9PSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2ldID0geFswXSAqIChfbU51bSAvIF9tRGVub20pIF4gaSAod2l0aCByb3VuZGluZyksIHdoZXJlIF9tTnVtID4gX21EZW5vbSA+IDAgYW5kIHhbMF0gPiAwCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNHZW9tZXRyaWNTZXJpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU1pbiA+IDAgJiYgX21TdGVwID09IDAgJiYgX21OdW0gPiBfbURlbm9tICYmIF9tRGVub20gPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2kgKyAxXSA9IHhbaV0gKiBfbU51bSAvIF9tRGVub20gKyBfbVN0ZXAgKHdpdGggcm91bmRpbmcpLCB3aGlsZSB4W2kgKyAxXSA+IHhbaV0sIHdoZXJlCisgICAgICogX21TdGVwICE9IDAsIF9tRGVub20gPiAwIGFuZCBfbU51bSA+IDAKKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc01hY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCAhPSAwICYmIF9tTnVtID4gMCAmJiBfbURlbm9tID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGFyaXRobWV0aWMgb3IgY29udGludW91cyByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIHZhbHVlCisgICAgICogXHBhcmFtIG1heCB0aGUgaGlnaGVyIHZhbHVlIChpZiB0aGlzIGlzIGxvd2VyIHRoYW4gfG1pbnwgdGhlIHJhbmdlIHdpbGwgYmUgZW1wdHkpCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIHN0ZXAgb2YgdGhlIGFyaXRobWV0aWMgcmFuZ2UuIChJZiB0aGlzIGlzIDAgZm9yIGZsb2F0aW5nIHBvaW50IHR5cGVzIG9yIDEgZm9yCisgICAgICogICAgICAgIGludGVnZXIgdHlwZXMsIHRoZSBjb25zdHJ1Y3RlZCByYW5nZSBpcyBjb250aW51b3VzKQorICAgICAqLworICAgIGNvbnN0ZXhwciBDMl9ISURFIEMyU3VwcG9ydGVkUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBUKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDEpKQorICAgICAgICA6IF9tTWluKG1pbiksIF9tTWF4KG1heCksIF9tU3RlcChzdGVwKSwgX21OdW0oMSksIF9tRGVub20oMSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugb3ZlciBhIGdlb21lcnRpYyBzb3IgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgYWx3YXlzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIHJhbmdlCisgICAgICogICAgICAgIGFzIGxvbmcgYXMgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKiBccGFyYW0gbWF4IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgb25seSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAorICAgICAqICAgICAgICByYW5nZSBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBhY2N1bXVsYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuIFRoaXMgaXMgMCBmb3IgYSBwdXJlIGdlb21ldHJpYworICAgICAqICAgICAgICBzZXJpZXMKKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIGRlbm9tIHRoZSBkZW5vbWluYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJfSElERSBDMlN1cHBvcnRlZFJhbmdlKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW4pCisgICAgICAgIDogX21NaW4obWluKSwgX21NYXgobWF4KSwgX21TdGVwKHN0ZXApLCBfbU51bShudW0pLCBfbURlbm9tKGRlbikgeyB9CisKKyAgICBUIF9tTWluOyAvLy88IGxvd2VyIGJvdW5kIGFuZCBzdGFydGluZyBwb2ludAorICAgIFQgX21NYXg7IC8vLzwgdXBwZXIgYm91bmQKKyAgICBUIF9tU3RlcDsgLy8vPCBzdGVwIG9mIGFuIGFyaXRobWV0aWMgc2VyaWVzICgwIGlmIGNvbnRpbnVvdXMgZmxvYXRpbmcgcG9pbnQgcmFuZ2UpCisgICAgVCBfbU51bTsgLy8vPCBudW1lcmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzCisgICAgVCBfbURlbm9tOyAvLy88IGRlbm9taW5hdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcworfTsKKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCBmbGFnIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZEZsYWdzIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IGZsYWcgc2V0LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWxpemF0ZWQgc3VwcG9ydGVkIGZsYWdzIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgb25seSB1c2VkIGZvcgorICAgICAqIHRoaXMgb2JqZWN0IC0gaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgRU1QVFkgdHlwZSBpbiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJWYWx1ZTo6UHJpbWl0aXZlPigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZ3Mgc2V0IG9mIGdpdmVuIGZsYWdzLgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncyBhcyBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAqIFxwYXJhbSBtaW4gbWluaW11bSBzZXQgb2YgZmxhZ3MgdG8gYmUgc2V0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBGbGFncyhjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhtaW4sIGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZ3Mgc2V0IG9mIGdpdmVuIGZsYWdzLgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncy4KKyAgICAgKiBccGFyYW0gbWluIG1pbmltdW0gc2V0IG9mIGZsYWdzIHRvIGJlIHNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkRmxhZ3M8VD4gRmxhZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3MobWluLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiBzZXQgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBGTEFHUyB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzPFQ+KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzLnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1MpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmluc2VydChfbVZhbHVlcy5lbmQoKSwgdmFsdWVzLnZhbHVlcy5iZWdpbigpLCB2YWx1ZXMudmFsdWVzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHNldCBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoaXMgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBmbGFnIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGFub3RoZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHZhbHVlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoIWlzRW1wdHkoKSAvKiBmbGFncyAqLywgX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgc2V0IG9mIGZsYWdzIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+IGZsYWdzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHNldCBvZiBmbGFncyBmb3IgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgVCBtaW4oKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGlzIHN1cHBvcnRlZCB2YWx1ZSBzZXQuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBkaXJlY3RseSBmcm9tIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyBhIHZlY3RvciBjb250YWluaW5nIHRoZSBtaW5pbXVtIGZsYWcgc2V0IGZvbGxvd2VkIGJ5IHRoZSBzZXQgb2YgZmxhZ3MKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gJiZ2YWx1ZXMpCisgICAgICAgIDogX21WYWx1ZXModmFsdWVzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBzZXQgb2YgZmxhZ3MgYW5kIGEgbWluaW11bSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFncyhUIG1pbiwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzKSB7CisgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhtaW4pOworICAgICAgICBmb3IgKFQgZWxlbSA6IGZsYWdzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZnJvbSBhIHNldCBvZiBpbml0aWFsaXplciBsaXN0IHZhbHVlcyBhbmQgYSBtaW5pbXVtIGZsYWcgc2V0CisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3MoVCBtaW4sIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBmbGFncykgeworICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2sobWluKTsKKyAgICAgICAgZm9yIChUIGVsZW0gOiBmbGFncykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiBfbVZhbHVlczsgLy8vPCB0aGUgbWluaW11bSBmbGFnIHNldCBmb2xsb3dlZCBieSB0aGUgc2V0IG9mIGZsYWdzCit9OworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIHZhbHVlIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IHZhbHVlIHNldC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgaXMgYSBzcGVjaWFsaXphdGVkIHN1cHBvcnRlZCByYW5nZSByZXByZXNlbnRhdGlvbiB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdCAtIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIEVNUFRZIHR5cGUgaW4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoeyB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IG9mIGdpdmVuIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcyBhcyBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBPbmVPZihjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBvZiBnaXZlbiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IE9uZU9mKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQodmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiBzZXQgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBWQUxVRVMgdHlwZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICAgICAgX21WYWx1ZXMuaW5zZXJ0KF9tVmFsdWVzLmVuZCgpLCB2YWx1ZXMudmFsdWVzLmJlZ2luKCksIHZhbHVlcy52YWx1ZXMuZW5kKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgZW1wdHkuCisgICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tVmFsdWVzLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgcGFydCBvZiB0aGlzIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYW5vdGhlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgdmFsdWUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2YWx1ZSBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhIHZhbHVlIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciByYW5nZQorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgZmxhZyBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIG9wZXJhdG9yIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGZhbHNlIC8qIGZsYWdzICovLCBfbVZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+IHZhbHVlcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoaXMgc3VwcG9ydGVkIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgX21WYWx1ZXMuY2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIEMyVmFsdWU6OlByaW1pdGl2ZSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gJiZ2YWx1ZXMpCisgICAgICAgIDogX21WYWx1ZXModmFsdWVzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbHVlcykgeworICAgICAgICBmb3IgKFQgZWxlbSA6IHZhbHVlcykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIGluaXRpYWxpemVyIGxpc3QgdmFsdWVzCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICAgICAgZm9yIChUIGVsZW0gOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gX21WYWx1ZXM7IC8vLzwgdGhlIHN1cHBvcnRlZCBzZXQgb2YgdmFsdWVzCit9OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgQzJGaWVsZFN1cHBvcnRlVmFsdWVzIG9iamVjdCBmb3IgZmllbGRzIG9mIHZhcmlvdXMgdHlwZXMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyOworCisvLyB0ZW1wbGF0ZWQgb3BlcmF0b3IgbXVzdCBiZSBwcmVkZWNsYXJlZCBmb3IgZnJpZW5kIGRlY2xhcmF0aW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGhlbHBlciBmb3IgYSBzcGVjaWZpYyB0eXBlIGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgc3RydWN0LgorICAgICAqLworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworICAgIC8vIFRSSUNLWTogbmVlZGVkIGZvciBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gZGVjbGFyYXRpb24KKyAgICB+QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcigpOworCisgICAgLy8gc3VwcG9ydCBjb3B5IGNvbnN0cnVjdG9yL29wZXJhdG9yCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICYpOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXImIG9wZXJhdG9yPShjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICYpOworCisgICAgYm9vbCBzdXBwb3J0cyhUIHZhbHVlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB1c2UgcGltcGwgYXMgaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlCisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IF9tSW1wbDsKKworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgPFQ+KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworICAgIC8vZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICZpKTsKK307CisKKy8qKgorICogQnVpbGRlciBmb3Igc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKgorICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIHN1Y2Nlc3NpdmVseSByZXN0cmljdCB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZC4gVXBvbgorICogY3JlYXRpb24sIHRoZXJlIGFyZSBubyBzdXBwb3J0ZWQgdmFsdWVzIHNwZWNpZmllZCAtIHdoaWNoIGZvciB0aGlzIGJ1aWxkZXIgbWVhbnMgdGhhdCBhbGwKKyAqIHZhbHVlcyBhcmUgc3VwcG9ydGVkLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1aWxkZXIgd2l0aCBubyBkZWZpbmVkIHZhbHVlcyAtIGJ1dCBpbXBsaWNpdGx5IGFueSB2YWx1ZSBhbGxvd2VkLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgQzJQYXJhbUZpZWxkVmFsdWVzIGZyb20gdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogRGVmaW5lIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBvZiB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmYW55KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBub25lLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyByZWFsbHkgc2hvdWxkIG5vdCBiZSB1c2VkIGZyb20gdGhlIGJ1aWxkZXIgYXMgYWxsIHBhcmFtcyBtdXN0IGhhdmUgc3VwcG9ydGVkCisgICAgICogICAgICAgdmFsdWVzLCBidXQgaXMgaGVyZSBpbiBjYXNlIHRoaXMgaXMgcmVhbGx5IHRoZSBjYXNlLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vbmUoKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHx2YWx1ZXwgYWxvbmUuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZXF1YWxUbyhUIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZ3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpHcmVhdGVyVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZncmVhdGVyVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkdyZWF0ZXJUaGFuT3JFcXVhbFRvKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vdExlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Tm90TGVzc1RoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGVzc1RoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpMZXNzVGhhbk9yRXF1YWxUbyh2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZub3RHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Ok5vdEdyZWF0ZXJUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGxlc3MgdGhhbiB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6TGVzc1RoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIFsgfG1pbnwsIHxtYXh8IF0KKyAgICAgKiB3aXRoIG9wdGlvbmFsIHxzdGVwfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZpblJhbmdlKAorICAgICAgICAgICAgVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IFQoMCkgOiBUKDEpKSAgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJblJhbmdlKG1pbiwgbWF4LCBzdGVwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHRoZSBnZW9tZXRyaWMgc2VyaWVzIHN0YXJ0aW5nCisgICAgICogZnJvbSB8bWlufCB3aXRoIGZhY3RvciB8bnVtfCAvIHxkZW5vbXwsIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmaW5TZXJpZXMoVCBtaW4sIFQgbWF4LCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJblNlcmllcyhtaW4sIG1heCwgbnVtLCBkZW5vbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMKKyAgICAgKiBzdGFydGluZyBmcm9tIHxtaW58IHdpdGggZmFjdG9yIHxudW18IC8gfGRlbm9tfCBhbmQgfHN0ZXB8LCBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmluTWFjU2VyaWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJbk1hY1NlcmllcyhtaW4sIG1heCwgc3RlcCwgbnVtLCBkZW5vbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB8dmFsdWVzfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvbmVPZihjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB8dmFsdWVzfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvbmVPZihjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGZsYWdzIGluIHxmbGFnc3wgd2l0aCBhdCBsZWFzdCB8bWlufAorICAgICAqIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZmbGFncyhjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZEZsYWdzPFQ+OjpGbGFncyhmbGFncywgbWluKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gZmxhZ3MgaW4gfHZhbHVlc3wgd2l0aCBhdCBsZWFzdCB8bWlufAorICAgICAqIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZmbGFncyhjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZEZsYWdzPFQ+OjpGbGFncyhmbGFncywgbWluKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcigpOworCisgICAgLy8gc3VwcG9ydCBjb3B5IGNvbnN0cnVjdG9yL29wZXJhdG9yCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyICYpOworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXImIG9wZXJhdG9yPShjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyICYpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHJhbmdlLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpOworCisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IF9tSW1wbDsKK307CisKKy8qKgorICogQnVpbGRlciBmb3IgYSBsaXN0IG9mIHNldHRpbmcgY29uZmxpY3RzLgorICovCitjbGFzcyBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGxpc3Qgb2Ygc2V0dGluZyBjb25mbGljdHMuCisgICAgICovCisgICAgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxpc3QgY29udGFpbmluZyBhIHNpbmdsZSBzZXR0aW5nIGNvbmZsaWN0LgorICAgICAqLworICAgIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIGNvbmZsaWN0IHRvIHRoZSBjdXJyZW50IGxpc3Qgb2YgY29uZmxpY3RzIGFuZCByZXR1cm5zIHRoaXMKKyAgICAgKi8KKyAgICBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyJiB3aXRoKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbGlzdCBvZiBjb25mbGljdHMgKGFuZCBtb3ZlcyB0aGVtIG91dCBvZiB0aGlzIGJ1aWxkZXIuKQorICAgICAqICh0aGlzIGlzIHdoeSBpdCBpcyBub3QgY29uc3QpCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiByZXRyaWV2ZUNvbmZsaWN0cygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGxpc3QgaXMgZW1wdHkuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfbUNvbmZsaWN0cy5lbXB0eSgpOyB9CisKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGVtcHR5KCk7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IF9tQ29uZmxpY3RzOworfTsKKworLyoqCisgKiBTZXR0aW5nIHJlc3VsdCBidWlsZGVyIGZvciBhIHBhcmFtZXRlci4KKyAqLworc3RydWN0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSByZWFkLW9ubHkgc2V0dGluZyByZXN1bHQgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgdGFrZSBGU1YgYXMgb25seSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmllbGQgaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIHN0YXRpYyBDMlNldHRpbmdSZXN1bHQgUmVhZE9ubHkoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYmFkLXZhbHVlIG9yIGluZm9pbmZvcm1hdGlvbmFsIGJhZC12YWx1ZSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyBkb2VzIG5vdCB0YWtlIEZTViBhcyB0aGUgdmFsdWUgaXMgb3V0c2lkZSBvZiB0aGUgcG9zc2libGUgdmFsdWVzLiBBcyBzdWNoLCB0aGVyZSBhcmUgbm8KKyAgICAgKiBjb25mbGljdHMgZm9yIHRoaXMgY2FzZSBlaXRoZXIuCisgICAgICovCisgICAgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdCBCYWRWYWx1ZShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtRmllbGQsIGJvb2wgaXNJbmZvID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbmZsaWN0IChvciBpbmZvcm1hdGlvbmFsIGNvbmZsaWN0KSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyB0YWtlcyBGU1Ygc28gdXNlIHBhcmFtRmllbGRWYWx1ZXMgYW5kIG9wdGlvbmFsIGNvbmZsaWN0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0IENvbmZsaWN0KAorICAgICAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzICYmcGFyYW1GaWVsZFZhbHVlcywgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciAmY29uZmxpY3RzLAorICAgICAgICAgICAgYm9vbCBpc0luZm8gPSBmYWxzZSk7CisKKyAgICAvLyBUT0RPOiByZXRyaWV2ZSByZXN1bHRzCisKKworcHJpdmF0ZToKKyAgICBDMlBhcmFtRmllbGQgX21QYXJhbUZpZWxkOworICAgIEMyU2V0dGluZ1Jlc3VsdCBfbVJlc3VsdDsKKworICAgIEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIoY29uc3QgQzJTZXR0aW5nUmVzdWx0QnVpbGRlciAmKSA9IGRlbGV0ZTsKK307CisKKy8qKgorICogU2V0dGluZyByZXN1bHRzIChQTFVSQUwpIGJ1aWxkZXIuCisgKgorICogU2V0dGluZyByZXN1bHRzIGNvbnRhaW4gYSBmYWlsdXJlIHN0YXR1cyBhbG9uZyB3aXRoIGEgbGlzdCBvZiBmYWlsaW5nIGZpZWxkcyBvciBwYXJhbXMuCisgKi8KK3N0cnVjdCBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciB7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoY29uc3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImKSA9IGRlbGV0ZTsKKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmKSA9IGRlZmF1bHQ7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgJm9wZXJhdG9yPShDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmKSA9IGRlZmF1bHQ7CisKKyAgICAvKiogXHJldHVybnMgKGRlZmF1bHQpIHN1Y2Nlc3NmdWwgcmVzdWx0IHdpdGggbm8gZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIE9rKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfT0spOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBJbnRlcmZhY2UgaXMgaW4gYmFkIHN0YXRlLCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIEJhZFN0YXRlKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfQkFEX1NUQVRFKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGNvbm5lY3Rpb24gdGltZWQgb3V0LCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIFRpbWVkT3V0KCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfVElNRURfT1VUKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGNvbm5lY3Rpb24gaXMgY29ycnVwdGVkLCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIENvcnJ1cHRlZCgpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX0NPUlJVUFRFRCk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBOb01lbW9yeShDMlBhcmFtOjpJbmRleCBpbmRleF8gX191bnVzZWQpIHsKKyAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGFkZCBmYWlsdXJlIHJlc3VsdAorICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfTk9fTUVNT1JZKTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBub3QgYmUgYSBjb25zdHJ1Y3RvcgorICAgIC8qKiBDcmVhdGVzIGEgYnVpbGRlciB3aXRoIGEgc2luZ2xlIGJhZCB2YWx1ZSBzZXR0aW5nIHJlc3VsdC4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMlNldHRpbmdSZXN1bHQgJiZyZXN1bHQpOworCisgICAgLyoqIENvbWJpbmVzIHRoaXMgcmVzdWx0cyB3aXRoIG90aGVyIHJlc3VsdHMuICovCisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgcGx1cyhDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmIHJlc3VsdHMpOworCisgICAgLyoqIFJldHJpZXZlIChnZXQgYW5kIG1vdmUgb3V0KSBmYWlsdXJlcyBhbmQgcmV0dXJuIHRoZSBmYWlsdXJlIHN0YXR1cy4gKi8KKyAgICBjMl9zdGF0dXNfdCByZXRyaWV2ZUZhaWx1cmVzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpOworCitwcml2YXRlOgorICAgIC8qKiBTZXR0aW5nIHJlc3VsdHMgYmFzZWQgb24gYSBzaW5nbGUgc3RhdHVzLiBUaGlzIGlzIHVzZWQgd2hlbiBhY3R1YWwgc2V0dGluZyBjb3VsZCBub3QgYmUKKyAgICAgKiAgYXR0ZW1wdGVkIHRvIGdldCBhIHNpbmdsZSBDMlNldHRpbmdSZXN1bHQsIG9yIHdoZW4gYSBzZXR0aW5nIHN1Y2NlZWRlZCB3aXRob3V0CisgICAgICogICdjb21wbGFpbnRzJy4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihjMl9zdGF0dXNfdCBzdGF0dXMpOworICAgICAgICAvLyBzdGF0dXMgbXVzdCBiZSBvbmUgb2YgT0ssIEJBRF9TVEFURSwgVElNRURfT1VULCBDT1JSVVBURUQgb3IgTk9fTUVNT1JZCisgICAgICAgIC8vIG1haW5seTogQkxPQ0tJTkcsIEJBRF9JTkRFWCwgQkFEX1ZBTFVFIGFuZCBOT19NRU1PUlkgcmVxdWlyZXMgYSBzZXR0aW5nIGF0dGVtcHQsIGJ1dAorICAgICAgICAvLyBOT19NRU1PUlkgbWF5IG5vdCBhbGxvdyB1cyB0byBjcmVhdGUgYSByZXN1bHRzIHN0cnVjdHVyZS4KKworICAgIC8qKgorICAgICAqIE9uZSBvZiBPSywgQkFEX0lOREVYLCBCQURfVkFMVUUsIEJBRF9TVEFURSwgTk9fTUVNT1JZLCBUSU1FRF9PVVQsIEJMT0NLSU5HIG9yIENPUlJVUFRFRC4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBfbVN0YXR1cyBfX3VudXNlZDsKKworICAgIC8qKgorICAgICAqIFZlY3RvciBvZiBpbmRpdmlkdWFsIHNldHRpbmcgcmVzdWx0IGRldGFpbHMuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IF9tUmVzdWx0czsKK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBlbnVtZXJhdGUgZmllbGRzIG9mIHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHMgeworICAgIHN0cnVjdCBfSW5zcGVjdG9yOworCisgICAgLyoqCisgICAgICogQW4gZXh0ZW5kZWQgZmllbGQgZGVzY3JpcHRvciBvYmplY3Qgd2l0aCBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIChsaW5lYWdlIGJhY2sgdG8gdGhlIHJvb3Qgb2YKKyAgICAgKiB0aGUgcGFyYW0pLgorICAgICAqLworICAgIHN0cnVjdCBJbmZvIHsKKyAgICAgICAgdHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IHR5cGVfdDsgLy8vPCBmaWVsZCB0eXBlCisgICAgICAgIHR5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBOYW1lZFZhbHVlc1R5cGU7IC8vLzwgbmFtZWQgdmFsdWVzIGxpc3QgdHlwZQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgICAgICBDMlN0cmluZyBuYW1lKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorICAgICAgICB0eXBlX3QgdHlwZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZWZpbmVkIG5hbWUtdmFsdWUgcGFpcmluZ3MgZm9yIHRoaXMgZmllbGQuIFRoZSByZXR1cm5lZCByZWZlcmVuY2UgaXMKKyAgICAgICAgICogb25seSB2YWxpZCBkdXJpbmcgdGhlIHZhbGlkaXR5IG9mIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBjb25zdCBOYW1lZFZhbHVlc1R5cGUgJm5hbWVkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGlzIGZpZWxkLiBFLmcuIHBhcmFtLmZpZWxkIG9yIHBhcmFtLmZpZWxkWzBdIGhhcyBhbiBpbmRleCBvZiAwLCBhbmQKKyAgICAgICAgICogcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIGhhcyBhbiBpbmRleCBvZiAzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGluZGV4KCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW4gY2FzZSBpdCBpcyBhbiBhcnJheS4gUmV0dXJucyAwIGZvcgorICAgICAgICAvLy8gVFtdIGFycmF5cyBpZiB0aGlzIGluZm8gY29tZXMgZnJvbSBhIEMyUGFyYW06OkluZGV4IG9iamVjdCwgYW5kIHRoZSBjdXJyZW50bHkgdXNlZAorICAgICAgICAvLy8gZXh0ZW50IGlmIGl0IGNvbWVzIGZyb20gYSBDMlBhcmFtIG9iamVjdC4gUmV0dXJucyAxIGZvciBUWzFdIGFycmF5cyBhcyB3ZWxsIGFzIGlmIHRoZQorICAgICAgICAvLy8gZmllbGQgaXMgbm90IGFuIGFycmF5LgorICAgICAgICBzaXplX3QgZXh0ZW50KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAoc3RydWN0dXJhbCkgZGVwdGggb2YgdGhpcyBmaWVsZC4gRS5nLiBwYXJhbS5maWVsZCBvciBwYXJhbS5maWVsZFswXSBoYXMgYSBkZXB0aCBvZgorICAgICAgICAgKiAgMCwgYW5kIHBhcmFtLnN0cnVjdC5maWVsZCBvciBwYXJhbS5zdHJ1Y3RbMF0uZmllbGRbMF0gaGFzIGEgZGVwdGggb2YgMS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBkZXB0aCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCBpbiB0aGUgcGFyYW1ldGVyIGluIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IG9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgZmllbGQgaW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2Zmc2V0IG9mIHRoaXMgZmllbGQncyBhcnJheS4gRS5nLiBmb3IgcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIHRoaXMgaXMgdGhlIG9mZnNldAorICAgICAgICAgKiBvZiBpdHMgc21hbGxlc3Qgc2libGluZzogcGFyYW0uc3RydWN0WzJdLmZpZWxkWzBdLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGFycmF5T2Zmc2V0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhpcyBmaWVsZCdzIGFycmF5LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gZXh0ZW50KCkgKiBzaXplKCkKKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBhcnJheVNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9mZnNldCBvZiB0aGUgYmFzZSBmaWVsZC4gVGhlIGJhc2UgZmllbGQgaXMgYSBjb3VzaW4gb2YgdGhlIGN1cnJlbnQgZmllbGQgd2hlcmUKKyAgICAgICAgICogYWxsIGluZGljZXMgYXJlIDAuIEUuZy4gdGhlIHRoZSBiYXNlIGZpZWxkIGZvciBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbM10gaXMKKyAgICAgICAgICogcGFyYW0uc3RydWN0WzBdLmZpZWxkWzBdLiBCYXNlIGZpZWxkcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yCisgICAgICAgICAqIGFsbCBjb3VzaW4gZmllbGRzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGJhc2VGaWVsZE9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhbiBhcml0aG1ldGljIChpbnRlZ3JhbCwgY291bnRlciBvciBmbG9hdCkgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBib29sIGlzQXJpdGhtZXRpYygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBjYW4gaGF2ZSBhIGZsZXhpYmxlIGV4dGVudC4gZXh0ZW50KCkgcmV0dXJucyB0aGUgY3VycmVudAorICAgICAgICAgKiBleHRlbnQuCisgICAgICAgICAqLworICAgICAgICBib29sIGlzRmxleGlibGUoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgaW5mbyBpcyB2YWxpZAorICAgICAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gX21JbXBsICE9IG51bGxwdHI7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgaW5mbyBmb3IgdGhlIHBhcmVudCBvZiB0aGlzIGZpZWxkLCBvciBhbiBpbnZhbGlkIEluZm8gb2JqZWN0IGlmIGl0IGhhcyBubworICAgICAgICAvLy8gcGFyZW50cworICAgICAgICBJbmZvIHBhcmVudCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBpbmZvIGlzIHZhbGlkCisgICAgICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaXNWYWxpZCgpOyB9CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIEluZm8oc3RkOjpzaGFyZWRfcHRyPEltcGw+KTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBfbUltcGw7CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0luc3BlY3RvcjsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gKGlucHV0KSBpdGVyYXRvciBvYmplY3Qgb3ZlciBmaWVsZHMgdXNpbmcgSW5mbyBvYmplY3RzLgorICAgICAqLworICAgIHN0cnVjdCBJdGVyYXRvciB7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCB2YWx1ZV90eXBlOworICAgICAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCAqIHBvaW50ZXI7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCByZWZlcmVuY2U7CisgICAgICAgIHR5cGVkZWYgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgICAgLy8vIHJldHVybiBJbmZvIGF0IGN1cnJlbnQgcG9zaXRpb24KKyAgICAgICAgdmlydHVhbCByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIG1vdmUgdG8gdGhlIG5leHQgZmllbGQKKyAgICAgICAgdmlydHVhbCBJdGVyYXRvciYgb3BlcmF0b3IrKygpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yICYpIGNvbnN0OworICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOyB9CisKKyAgICAgICAgdmlydHVhbCB+SXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIEl0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gKGlucHV0KSBpdGVyYWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgbGlzdCBvZiBmaWVsZHMuCisgICAgICovCisgICAgc3RydWN0IExpc3QgeworICAgICAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3IgZW5kKCkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCB+TGlzdCgpID0gZGVmYXVsdDsKKworICAgICAgICBzdHJ1Y3QgSW1wbDsKKyAgICAgICAgTGlzdChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4pOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIChiYXNlKSBmaWVsZHMgYXQgaW5kZXggMCBvZiB0aGUgcGFyYW1ldGVyLiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIHRoZQorICAgICAqIGZvbGxvd2luZzoKKyAgICAgKiAgIEZpZWxkcyBvZiBhIHN0cnVjdHVyZSBhcmUgZW51bWVyYXRlZCBpbiBmaWVsZCBvcmRlci4gSG93ZXZlciwgc3ViLWZpZWxkcyBvZiBhIHN0cnVjdHVyZQorICAgICAqICAgYXJlIGVudW1lcmF0ZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBmaWVsZCwgYW5kIHByaW9yIHRvIHNpYmxpbmcgZmllbGRzLgorICAgICAqCisgICAgICogSW4gZXNzZW5jZSB0aGUgb3JkZXIgb2YgZW51bWVyYXRpb24gaXMgZmlyc3QgYnkgaW5jcmVhc2luZyBvZmZzZXQsIHRoZW4gYnkgZGVjcmVhc2luZyBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciB0byBlbnVtZXJhdGUgaXRzIGZpZWxkcworICAgICAqIFxwYXJhbSByZWZsZWN0b3IgcGFyYW1ldGVyIHJlZmxlY3RvciB1c2VkIGZvciBlbnVtZXJhdGlvbgorICAgICAqCisgICAgICogXHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QKKyAgICAgKi8KKyAgICBzdGF0aWMgTGlzdCBlbnVtZXJhdGVGaWVsZHMoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIGNvdXNpbiBmaWVsZHMgdXAgdG8gZGVwdGggLSBsZXZlbCBmb3IgYSBmaWVsZC4gSWYgbGV2ZWwgaXMgMCwgaXQgZW51bWVyYXRlcworICAgICAqIG9ubHkgdGhlIGZpZWxkLiBGb3IgbGV2ZWwgMSwgaXQgZW51bWVyYXRlcyBhbGwgZmllbGRzIGluIGl0cyBjdXJyZW50IGFycmF5ICh3aGljaCBtYXkgYmUKKyAgICAgKiBpdHNlbGYgaWYgZXh0ZW50IGlzIDEpLiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIGJ5IGluY3JlYXNpbmcgZmllbGQgb2Zmc2V0LgorICAgICAqLworICAgIHN0YXRpYyBMaXN0IGVudW1lcmF0ZUNvdXNpbnMoCisgICAgICAgICAgICBjb25zdCBJbmZvICZmaWVsZCwKKyAgICAgICAgICAgIHVpbnQzMl90IGxldmVsID0gfjApOworCisgICAgLyoqCisgICAgICogTG9jYXRlcyB0aGUgZmllbGQgaW4gYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBsaXN0IG9mIDIgZWxlbWVudHMgLSB0aGUgbW9zdC1zcGVjaWZpYyBmaWVsZAorICAgICAqIGFycmF5IG9mIHRoZSBwYXJhbWV0ZXIgdGhhdCBjb250YWlucyB0aGUgZW50aXJlIGZpZWxkLiBJZiB0aGUgZmllbGQgaXMgbm90IGEgdmFsaWQgZmllbGQKKyAgICAgKiBzcGVjaWZpZXIgZm9yIHRoaXMgcGFyYW1ldGVyIChlLmcuIGl0IGlzIG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgcGFyYW1ldGVyKSwgaXQgcmV0dXJucworICAgICAqIGFuIGVtcHR5IGxpc3QuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEluZm8+IGxvY2F0ZUZpZWxkKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEluZm8+IGxvY2F0ZUZpZWxkKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkICZwZiwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCit9OworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWludGVyZmFjZS5oPgorCisjZW5kaWYgIC8vIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxYmQ5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvKiogXGZpbGUKKyAqIFV0aWxpdGllcyBmb3IgcGFyYW1ldGVyIGhhbmRsaW5nIHRvIGJlIHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworc3RydWN0IEMyUGFyYW07CisKK2NsYXNzIEMyUGFyYW1VdGlscyB7CisgICAgZnJpZW5kIGNsYXNzIEMyVXRpbFRlc3RfUGFyYW1VdGlsc1Rlc3RfVGVzdDsKKworcHVibGljOgorCisgICAgLy8vIHNhZmUocikgcGFyc2luZyBmcm9tIHBhcmFtZXRlciBibG9iCisgICAgc3RhdGljCisgICAgQzJQYXJhbSAqUGFyc2VGaXJzdChjb25zdCB1aW50OF90ICpibG9iLCBzaXplX3Qgc2l6ZSk7Cit9OworCisvLy8gXGVuZGNvbmQKKworI2VuZGlmICAvLyBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiZjNhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NUQUdFRlJJR0hUX0MyQkxPQ0tfSU5URVJOQUxfSF8KKyNkZWZpbmUgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhOworCit9Cit9Cit9Cit9CisKKy8qKgorICogU3RvcmVzIGluZm9ybWF0aW9ucyBmcm9tIEMyQmxvY2tQb29sIGltcGxlbWVudGF0aW9ucyB3aGljaCBhcmUgcmVxdWlyZWQgYnkgQzJCbG9jay4KKyAqLworc3RydWN0IEMyX0hJREUgX0MyQmxvY2tQb29sRGF0YSB7CisgICAgZW51bSB0eXBlX3QgOiBpbnQgeworICAgICAgICBUWVBFX0JVRkZFUlBPT0wgPSAwLAorICAgICAgICBUWVBFX0JVRkZFUlFVRVVFLAorICAgIH07CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgX0MyQmxvY2tQb29sRGF0YSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfl9DMkJsb2NrUG9vbERhdGEoKSA9IGRlZmF1bHQ7Cit9OworCitzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKy8qKgorICogSW50ZXJuYWwgb25seSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGJsb2NrcyBieSBibG9jayBwb29sL2J1ZmZlciBwYXNzaW5nIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBcdG9kbyB0aGlzIG11c3QgYmUgaGlkZGVuCisgKi8KK3N0cnVjdCBfQzJCbG9ja0ZhY3RvcnkgeworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpbmVhciBibG9jayBmcm9tIGFuIGFsbG9jYXRpb24gZm9yIGFuIGFsbG90dGVkIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jIHBhcmVudCBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGRhdGEgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIG9mZnNldCBhbGxvdHRlZCByYW5nZSBvZmZzZXQKKyAgICAgKiBccGFyYW0gc2l6ZSAgYWxsb3R0ZWQgc2l6ZQorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwLAorICAgICAgICAgICAgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdyYXBoaWMgYmxvY2sgZnJvbSBhbiBhbGxvY2F0aW9uIGZvciBhbiBhbGxvdHRlZCBzZWN0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jIHBhcmVudCBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGRhdGEgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIGNyb3AgIGFsbG90dGVkIGNyb3AgcmVnaW9uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmYWxsb3R0ZWRDcm9wID0gQzJSZWN0KH4wdSwgfjB1KSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBibG9jayBwb29sIGRhdGEgZnJvbSAxRCBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaGFyZWQgcG9pbnRlciB0byB0aGUgMUQgYmxvY2sgd2hpY2ggaXMgYWxyZWFkeSBjcmVhdGVkLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgY29uc3QgQzJCbG9jazFEJiBibG9jayk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBibG9jayBwb29sIGRhdGEgZnJvbSAyRCBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaGFyZWQgcG9pbnRlciB0byB0aGUgMkQgYmxvY2sgd2hpY2ggaXMgYWxyZWFkeSBjcmVhdGVkLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IEMyQmxvY2syRCYgYmxvY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGluZWFyIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIG5hdGl2ZSBoYW5kbGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgdG8gYSBsaW5lYXIgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZ3JhcGhpYyBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBuYXRpdmUgaGFuZGxlLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIHRvIGEgZ3JhcGhpYyBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgZ3JhcGhpYyBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgYnVmZmVycG9vbCBkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGEgIGJ1ZmZlcnBvb2wgZGF0YSB0byBhIGxpbmVhciBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhPiAmZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBncmFwaGljIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIGJ1ZmZlcnBvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhICBidWZmZXJwb29sIGRhdGEgdG8gYSBncmFwaGljIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE+ICZkYXRhKTsKKworICAgIC8qKgorICAgICAqIEdldCBidWZmZXJwb29sIGRhdGEgZnJvbSB0aGUgYmxvY2twb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgICAgICAgICAgYmxvY2twb29sIGRhdGEKKyAgICAgKiBccGFyYW0gYnVmZmVyUG9vbERhdGEgICAgcG9pbnRlciB0byBidWZmZXJwb29sIGRhdGEgd2hlcmUgdGhlIGJ1ZmZlcnBvb2wKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHtcY29kZSB0cnVlfSB3aGVuIHRoZXJlIGlzIHZhbGlkIGJ1ZmZlcnBvb2wgZGF0YSwge1xjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBHZXRCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlclBvb2xEYXRhKTsKKworICAgIC8qCisgICAgICogTGlmZSBDeWNsZSBNYW5hZ2VtZW50IG9mIEJ1ZmZlclF1ZXVlLUJhc2VkIEJsb2NrcworICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKgorICAgICAqIEEgYmxvY2sgdGhhdCBpcyBjcmVhdGVkIGJ5IGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sIHJlcXVpcmVzIHNvbWUKKyAgICAgKiBzcGVjaWFsIHRyZWF0bWVudCB3aGVuIGl0IGlzIGRlc3Ryb3llZC4gSW4gcGFydGljdWxhciwgaWYgdGhlIGJsb2NrCisgICAgICogY29ycmVzcG9uZHMgdG8gYSBoZWxkIChkZXF1ZXVlZC9hdHRhY2hlZCkgR3JhcGhpY0J1ZmZlciBpbiBhIHNsb3Qgb2YgYQorICAgICAqIGJ1ZmZlcnF1ZXVlLCBpdHMgZGVzdHJ1Y3Rpb24gc2hvdWxkIHRyaWdnZXIgYSBjYWxsIHRvCisgICAgICogSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y2FuY2VsQnVmZmVyKCkuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUKKyAgICAgKiBHcmFwaGljQnVmZmVyIGlzIG5vdCBoZWxkLCBpLmUuLCBpZiBpdCBoYXMgYmVlbiBxdWV1ZWQgb3IgZGV0YWNoZWQsCisgICAgICogY2FuY2VsQnVmZmVyKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdXBvbiB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGJsb2NrLgorICAgICAqCisgICAgICogX0MyQmxvY2tQb29sRGF0YSBjcmVhdGVkIGJ5IGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sIGluY2x1ZGVzIHR3bworICAgICAqIG1haW4gcGllY2VzIG9mIGluZm9ybWF0aW9uOgorICAgICAqICAgLSAiaGVsZCIgc3RhdHVzOiBXaGV0aGVyIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBiZSBjYWxsZWQgdXBvbgorICAgICAqICAgICBkZXN0cnVjdGlvbiBvZiB0aGUgYmxvY2suCisgICAgICogICAtIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQ6IFRoZSBxdWFkcnVwbGUgKGlnYnAsIGdlbmVyYXRpb24sIGJxSWQsCisgICAgICogICAgIGJxU2xvdCksIHdoZXJlIGlnYnAgaXMgdGhlIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgaW5zdGFuY2Ugb2YgdGhlCisgICAgICogICAgIGJ1ZmZlcnF1ZXVlLCBnZW5lcmF0aW9uIGlzIHRoZSBsYXRlc3QgZ2VuZXJhdGlvbiBudW1iZXIsIG9mIHRoZQorICAgICAqICAgICBidWZmZXJxdWV1ZSwgYnFJZCBpcyB0aGUgZ2xvYmFsbHkgdW5pcXVlIGlkIG9mIHRoZSBidWZmZXJxdWV1ZSwgYW5kCisgICAgICogICAgIGJxU2xvdCBpcyB0aGUgc2xvdCBpbiB0aGUgYnVmZmVycXVldWUuCisgICAgICoKKyAgICAgKiBpZ2JwIGlzIHRoZSBpbnN0YW5jZSBvZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIG9uIHdoaWNoIGNhbmNlbEJ1ZmZlcigpCisgICAgICogd2lsbCBiZSBjYWxsZWQgaWYgImhlbGQiIHN0YXR1cyBpcyB0cnVlIHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZC4KKyAgICAgKiAoYnFTbG90IGlzIGFuIGlucHV0IHRvIGNhbmNlbEJ1ZmZlcigpLikgSG93ZXZlciwgb25seSBnZW5lcmF0aW9uLCBicUlkCisgICAgICogYW5kIGJxU2xvdCBhcmUgcmV0YWluZWQgd2hlbiBhIGJsb2NrIGlzIHRyYW5zZmVycmVkIGZyb20gb25lIHByb2Nlc3MgdG8KKyAgICAgKiBhbm90aGVyLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYm90aCB0aGUgc2VuZGluZyBhbmQgcmVjZWl2aW5nCisgICAgICogcHJvY2Vzc2VzIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IG9mICJoZWxkIiBzdGF0dXMgYW5kIGlnYnAuIEJlbG93IGFyZQorICAgICAqIGZ1bmN0aW9ucyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlOgorICAgICAqCisgICAgICogICAtIEdldEJ1ZmZlclF1ZXVlRGF0YSgpOiBSZXR1cm5zIGdlbmVyYXRpb24sIGJxSWQgYW5kIGJxU2xvdC4KKyAgICAgKiAgIC0gSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCk6IFNldHMgImhlbGQiIHN0YXR1cyB0byB0cnVlLgorICAgICAqICAgLSBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpOiBTZXRzICJoZWxkIiBzdGF0dXMgdG8gZmFsc2UuCisgICAgICogICAtIEFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgpOiBTZXRzIHRoZSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IGFuZAorICAgICAqICAgICAiaGVsZCIgc3RhdHVzLgorICAgICAqCisgICAgICogQWxsIHRoZXNlIGZ1bmN0aW9ucyBvcGVyYXRlIG9uIF9DMkJsb2NrUG9vbERhdGEsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBieQorICAgICAqIGNhbGxpbmcgR2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoKS4KKyAgICAgKgorICAgICAqIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpIHdpbGwgbWFyayB0aGUgYmxvY2sgYXMgaGVsZCwgd2hpbGUKKyAgICAgKiBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpIHdpbGwgZG8gdGhlIG9wcG9zaXRlLiBUaGVzZSB0d28gZnVuY3Rpb25zIGRvCisgICAgICogbm90IG1vZGlmeSB0aGUgYnVmZmVycXVldWUgYXNzaWdubWVudCwgc28gaXQgaXMgbm90IHdyb25nIHRvIGNhbGwKKyAgICAgKiBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKSBhZnRlciBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpIGlmIGl0IGNhbiBiZQorICAgICAqIGd1YXJhbnRlZWQgdGhhdCB0aGUgYmxvY2sgaXMgbm90IGRlc3Ryb3llZCBkdXJpbmcgdGhlIHBlcmlvZCBiZXR3ZWVuIHRoZQorICAgICAqIHR3byBjYWxscy4KKyAgICAgKgorICAgICAqIEFzc2luZ0Jsb2NrVG9CdWZmZXJRdWV1ZSgpIGhhcyBhICJoZWxkIiBzdGF0dXMgYXMgYW4gb3B0aW9uYWwgYXJndW1lbnQuCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgKgorICAgICAqIE1haW50YWluaW5nIENvbnNpc3RlbmN5IHdpdGggSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBPcGVyYXRpb25zCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKgorICAgICAqIGRlcXVldWVCdWZmZXIoKQorICAgICAqICAgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYmxvY2twb29sLiBJdCBzaG91bGQgbm90IGJlIGNhbGxlZAorICAgICAqICAgICBtYW51YWxseS4gVGhlIGJsb2NrcG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdGhlIGNvcnJlY3QKKyAgICAgKiAgICAgaW5mb3JtYXRpb24gZm9yIF9DMkJsb2NrUG9vbERhdGEsIHdpdGggImhlbGQiIHN0YXR1cyBzZXQgdG8gdHJ1ZS4KKyAgICAgKgorICAgICAqIHF1ZXVlQnVmZmVyKCkKKyAgICAgKiAgIC0gQWZ0ZXIgcXVldWVCdWZmZXIoKSBpcyBjYWxsZWQsIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgc2hvdWxkIGJlCisgICAgICogICAgIGNhbGxlZC4KKyAgICAgKgorICAgICAqIGF0dGFjaEJ1ZmZlcigpCisgICAgICogICAtIEFmdGVyIGF0dGFjaEJ1ZmZlcigpIGlzIGNhbGxlZCwgQXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKCkgc2hvdWxkIGJlCisgICAgICogICAgIGNhbGxlZCB3aXRoICJoZWxkIiBzdGF0dXMgc2V0IHRvIHRydWUuCisgICAgICoKKyAgICAgKiBkZXRhY2hCdWZmZXIoKQorICAgICAqICAgLSBBZnRlciBkZXRhY2hCdWZmZXIoKSBpcyBjYWxsZWQsIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpIHNob3VsZCBiZQorICAgICAqICAgICBjYWxsZWQuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBHZXQgYnVmZmVycXVldWUgZGF0YSBmcm9tIHRoZSBibG9ja3Bvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIFxwIGdlbmVyYXRpb24gc2V0IHRvIG51bGxwdHIgd2lsbCByZXR1cm4KKyAgICAgKiB3aGV0aGVyIHRoZSBibG9jayBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLCBidXQgd2lsbCBub3QKKyAgICAgKiBmaWxsIGluIHRoZSB2YWx1ZXMgZm9yIFxwIGdlbmVyYXRpb24sIFxwIGJxSWQgb3IgXHAgYnFTbG90LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgcG9vbERhdGEgICBibG9ja3Bvb2wgZGF0YS4KKyAgICAgKiBccGFyYW1bb3V0XSBnZW5lcmF0aW9uIEdlbmVyYXRpb24gbnVtYmVyIGF0dGFjaGVkIHRvIHRoZSBidWZmZXIuCisgICAgICogXHBhcmFtW291dF0gYnFJZCAgICAgICBJZCBvZiB0aGUgYnVmZmVycXVldWUgb3duaW5nIHRoZSBidWZmZXIgKGJsb2NrKS4KKyAgICAgKiBccGFyYW1bb3V0XSBicVNsb3QgICAgIFNsb3QgbnVtYmVyIG9mIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIFxjIHRydWUgd2hlbiB0aGVyZSBpcyB2YWxpZCBidWZmZXJxdWV1ZSBkYXRhOworICAgICAqICAgICAgICAgXGMgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgR2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSwKKyAgICAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHVpbnQ2NF90KiBicUlkID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogU2V0IGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQgYW5kICJoZWxkIiBzdGF0dXMgdG8gYSBibG9jayBjcmVhdGVkIGJ5IGEKKyAgICAgKiBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICogXHBhcmFtIGlnYnAgICAgICAgXGMgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBpbnN0YW5jZSBmcm9tIHRoZSBkZXNpZ25hdGVkCisgICAgICogICAgICAgICAgICAgICAgICAgYnVmZmVycXVldWUuCisgICAgICogXHBhcmFtIGdlbmVyYXRpb24gR2VuZXJhdGlvbiBudW1iZXIgdGhhdCB0aGUgYnVmZmVyIGJlbG9uZ3MgdG8uCisgICAgICogXHBhcmFtIGJxSWQgICAgICAgSWQgb2YgdGhlIGJ1ZmZlcnF1ZXVlIHRoYXQgd2lsbCBvd24gdGhlIGJ1ZmZlciAoYmxvY2spLgorICAgICAqIFxwYXJhbSBicVNsb3QgICAgIFNsb3QgbnVtYmVyIG9mIHRoZSBidWZmZXIuCisgICAgICogXHBhcmFtIGhlbGQgICAgICAgV2hldGhlciB0aGUgYmxvY2sgaXMgaGVsZC4gVGhpcyAiaGVsZCIgc3RhdHVzIGNhbiBiZQorICAgICAqICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgbGF0ZXIgYnkgY2FsbGluZyBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkuCisgICAgICoKKyAgICAgKiBccmV0dXJuIFxjIHRydWUgaWYgXHAgcG9vbERhdGEgaXMgdmFsaWQgYnVmZmVycXVldWUgZGF0YTsKKyAgICAgKiAgICAgICAgIFxjIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIE5vdGU6IFxwIGdlbmVyYXRpb24gc2hvdWxkIG1hdGNoIHRoZSBsYXRlc3QgZ2VuZXJhdGlvbiBudW1iZXIgc2V0IG9uIHRoZQorICAgICAqIGJ1ZmZlcnF1ZXVlLCBhbmQgXHAgYnFJZCBzaG91bGQgbWF0Y2ggdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGJ1ZmZlcnF1ZXVlCisgICAgICogKG9idGFpbmFibGUgYnkgY2FsbGluZyBpZ2JwLT5nZXRVbmlxdWVJZCgpKS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEsCisgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgICAgIGJvb2wgaGVsZCA9IHRydWUpOworCisgICAgLyoqCisgICAgICogSG9sZCBhIGJsb2NrIGZyb20gdGhlIGRlc2lnbmF0ZWQgYnVmZmVycXVldWUuIFRoaXMgY2F1c2VzIHRoZSBkZXN0cnVjdGlvbgorICAgICAqIG9mIHRoZSBibG9jayB0byB0cmlnZ2VyIGEgY2FsbCB0byBjYW5jZWxCdWZmZXIoKS4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IFxwIHBvb2xEYXRhIGNvbWVzIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZAorICAgICAqIGJsb2NrLiBJdCBkb2VzIG5vdCBjaGVjayBpZiB0aGF0IGlzIHRoZSBjYXNlLgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xEYXRhIGJsb2NrcG9vbCBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIGJsb2NrLgorICAgICAqIFxwYXJhbSBpZ2JwICAgICBcYyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGluc3RhbmNlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBibG9jay4gVGhpcyBpcyBub3QgbmVlZGVkIHdoZW4gdGhlIGJsb2NrIGlzIGxvY2FsLgorICAgICAqCisgICAgICogXHJldHVybiBUaGUgcHJldmlvdXMgaGVsZCBzdGF0dXMuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogWWllbGQgYSBibG9jayB0byB0aGUgZGVzaWduYXRlZCBidWZmZXJxdWV1ZS4gVGhpcyBjYXVzZXMgdGhlIGRlc3RydWN0aW9uCisgICAgICogb2YgdGhlIGJsb2NrIG5vdCB0byB0cmlnZ2VyIGEgY2FsbCB0byBjYW5jZWxCdWZmZXIoKTsKKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IFxwIHBvb2xEYXRhIGNvbWVzIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZAorICAgICAqIGJsb2NrLiBJdCBkb2VzIG5vdCBjaGVjayBpZiB0aGF0IGlzIHRoZSBjYXNlLgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xEYXRhIGJsb2NrcG9vbCBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBUaGUgcHJldmlvdXMgaGVsZCBzdGF0dXMuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEpOworCit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJQYXJhbUludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhOGYyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NUQUdFRlJJR0hUX0MyUEFSQU1fSU5URVJOQUxfSF8KKyNkZWZpbmUgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKK3N0cnVjdCBDMl9ISURFIF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQpIHsKKyAgICAgICAgcmV0dXJuIGZkLl9tRmllbGRJZC5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgU2V0T2Zmc2V0KEMyRmllbGREZXNjcmlwdG9yICZmZCwgdWludDMyX3Qgb2Zmc2V0KSB7CisgICAgICAgIGZkLl9tRmllbGRJZC5fbU9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldEVuZE9mZnNldChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHVpbnQzMl90IHBhcmFtU2l6ZSA9IDApIHsKKyAgICAgICAgdWludDMyX3QgZW5kT2Zmc2V0ID0gZmQuX21GaWVsZElkLl9tT2Zmc2V0ICsgZmQuX21FeHRlbnQgKiBmZC5fbUZpZWxkSWQuX21TaXplOworICAgICAgICAvLy8gZm9yIGZsZXggcGFyYW1ldGVycyByZXR1cm4gcGFyYW1TaXplIGlmIGdpdmVuCisgICAgICAgIHJldHVybiBmZC5fbUV4dGVudCA/IGVuZE9mZnNldCA6IHN0ZDo6bWF4KGVuZE9mZnNldCwgcGFyYW1TaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkKSB7CisgICAgICAgIHJldHVybiBmZC5fbUZpZWxkSWQuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0SW5kZXgoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21JbmRleDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUZpZWxkSWQuX21PZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRTaXplKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZC5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRPZmZzZXQoY29uc3QgX0MyRmllbGRJZCAmZikgeworICAgICAgICByZXR1cm4gZi5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgX0MyRmllbGRJZCAmZikgeworICAgICAgICByZXR1cm4gZi5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBfQzJGaWVsZElkIEdldEZpZWxkKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCkgeworICAgICAgICByZXR1cm4gZmQuX21GaWVsZElkOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0QXR0cmliKGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yICZwZCkgeworICAgICAgICByZXR1cm4gcGQuX21BdHRyaWI7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBfQzJGaWVsZElkIEdldEZpZWxkKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJQYXJhbUZpZWxkIENyZWF0ZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkKGluZGV4LCBvZmZzZXQsIHNpemUpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMlBhcmFtRmllbGQgQ3JlYXRlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgX0MyRmllbGRJZCBmaWVsZCkgeworICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkKGluZGV4LCBmaWVsZC5fbU9mZnNldCwgZmllbGQuX21TaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgdm9pZCBUcmltUGFyYW0oQzJQYXJhbSAqcGFyYW0sIHVpbnQzMl90IG5ld1NpemUpIHsKKyAgICAgICAgaWYgKHBhcmFtICYmICpwYXJhbSAmJiBwYXJhbS0+c2l6ZSgpID4gbmV3U2l6ZSAmJiBuZXdTaXplID49IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgcGFyYW0tPl9tU2l6ZSA9IG5ld1NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgQWRkTmFtZWRWYWx1ZXMoCisgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgJiZuYW1lZFZhbHVlcykgeworICAgICAgICBmZC5fbU5hbWVkVmFsdWVzID0gc3RkOjptb3ZlKG5hbWVkVmFsdWVzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIENyZWF0ZVN0cnVjdERlc2NyaXB0b3IoQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmJmZpZWxkcykgeworICAgICAgICByZXR1cm4gQzJTdHJ1Y3REZXNjcmlwdG9yKGluZGV4LCBzdGQ6Om1vdmUoZmllbGRzKSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyRmllbGREZXNjcmlwdG9yIE9mZnNldEZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHNpemVfdCBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGREZXNjcmlwdG9yKGZkLCBvZmZzZXQpOworICAgIH0KKworICAgIC8vIGV4cG9zZSBhdHRyaWJ1dGVzCisgICAgdHlwZWRlZiBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliX3Q7Cit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhNWIzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCkBAIC0wLDAgKzEsNDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkJxQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlRGVmcy5oPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKwordXNpbmcgOjphbmRyb2lkOjpBbndCdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OkJ1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UUzsKK3VzaW5nIDo6YW5kcm9pZDo6QzJBbGxvY2F0b3JHcmFsbG9jOwordXNpbmcgOjphbmRyb2lkOjpDMkFuZHJvaWRNZW1vcnlVc2FnZTsKK3VzaW5nIDo6YW5kcm9pZDo6RmVuY2U7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OkhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6c3RhdHVzX3Q7Cit1c2luZyA6OmFuZHJvaWQ6OndwOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdDsKKworc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhIDogcHVibGljIF9DMkJsb2NrUG9vbERhdGEgeworCisgICAgYm9vbCBoZWxkOworICAgIGJvb2wgbG9jYWw7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBicUlkOworICAgIGludDMyX3QgYnFTbG90OworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnA7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+IGxvY2FsUG9vbDsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBUWVBFX0JVRkZFUlFVRVVFOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIHJlbW90ZSBCbG9ja1Bvb2xEYXRhLgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIgPSBudWxscHRyKTsKKworICAgIC8vIENyZWF0ZSBhIGxvY2FsIEJsb2NrUG9vbERhdGEuCisgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiYgcG9vbCk7CisKKyAgICB2aXJ0dWFsIH5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgpIG92ZXJyaWRlOworCit9OworCitib29sIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLCB1aW50NjRfdCogYnFJZCwgaW50MzJfdCogYnFTbG90KSB7CisgICAgaWYgKGRhdGEgJiYgZGF0YS0+Z2V0VHlwZSgpID09IF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUVVFVUUpIHsKKyAgICAgICAgaWYgKGdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICAgICAgKmdlbmVyYXRpb24gPSBwb29sRGF0YS0+Z2VuZXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChicUlkKSB7CisgICAgICAgICAgICAgICAgKmJxSWQgPSBwb29sRGF0YS0+YnFJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChicVNsb3QpIHsKKyAgICAgICAgICAgICAgICAqYnFTbG90ID0gcG9vbERhdGEtPmJxU2xvdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6QXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgYm9vbCBoZWxkKSB7CisgICAgaWYgKGRhdGEgJiYgZGF0YS0+Z2V0VHlwZSgpID09IF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUVVFVUUpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgcG9vbERhdGEtPmlnYnAgPSBpZ2JwOworICAgICAgICBwb29sRGF0YS0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisgICAgICAgIHBvb2xEYXRhLT5icUlkID0gYnFJZDsKKyAgICAgICAgcG9vbERhdGEtPmJxU2xvdCA9IGJxU2xvdDsKKyAgICAgICAgcG9vbERhdGEtPmhlbGQgPSBoZWxkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6SG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgIGlmICghcG9vbERhdGEtPmxvY2FsKSB7CisgICAgICAgIHBvb2xEYXRhLT5pZ2JwID0gaWdicDsKKyAgICB9CisgICAgaWYgKHBvb2xEYXRhLT5oZWxkKSB7CisgICAgICAgIHBvb2xEYXRhLT5oZWxkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgIGlmICghcG9vbERhdGEtPmhlbGQpIHsKKyAgICAgICAgcG9vbERhdGEtPmhlbGQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yR3JhbGxvYz4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JHcmFsbG9jPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0OworICAgICAgICB1aW50NjRfdCB1c2FnZTsKKyAgICAgICAgdWludDMyX3Qgc3RyaWRlOworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICB1aW50NjRfdCBicUlkOworICAgICAgICB1aW50MzJfdCBicVNsb3Q7CisgICAgICAgIGFuZHJvaWQ6Ol9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgaGFuZGxlLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwgJnN0cmlkZSwgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBpZiAoYnFJZCB8fCBicVNsb3QpIHsKKyAgICAgICAgICAgICAgICAvLyBCUUJCUAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClicVNsb3QpOworICAgICAgICAgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NsYXNzIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiB7Citwcml2YXRlOgorICAgIGMyX3N0YXR1c190IGZldGNoRnJvbUlnYnBfbCgKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgLy8gV2UgaGF2ZSBhbiBJR0JQIG5vdy4KKyAgICAgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKCk7CisgICAgICAgIEMyQW5kcm9pZE1lbW9yeVVzYWdlIGFuZHJvaWRVc2FnZSA9IHVzYWdlOworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIFBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0ID0gc3RhdGljX2Nhc3Q8UGl4ZWxGb3JtYXQ+KGZvcm1hdCk7CisgICAgICAgIGludCBzbG90OworICAgICAgICBBTE9HVigidHJpZXMgdG8gZGVxdWV1ZSBidWZmZXIiKTsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbVByb2R1Y2VyLT5kZXF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCBhbmRyb2lkVXNhZ2UuYXNHcmFsbG9jVXNhZ2UoKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzbG90LCAmZmVuY2VdKAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0U3RhdHVzLCBpbnQzMl90IHRTbG90LCBoaWRsX2hhbmRsZSBjb25zdCYgdEZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdFRzKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHNsb3QgPSB0U2xvdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8oZmVuY2UuZ2V0KCksIHRGZW5jZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgdFRzOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAvLyBkZXF1ZXVlQnVmZmVyIHJldHVybnMgZmxhZy4KKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkgfHwgc3RhdHVzIDwgYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJjYW5ub3QgZGVxdWV1ZSBidWZmZXIgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgaWYgKHRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gYW5kcm9pZDo6SU5WQUxJRF9PUEVSQVRJT04gfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6OlRJTUVEX09VVCB8fAorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6V09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVxdWV1ZSBidWZmZXIgaXMgYmxvY2tlZCB0ZW1wb3JhcmlseS4gUmV0cnlpbmcgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJkZXF1ZXVlZCBhIGJ1ZmZlciBzdWNjZXNzZnVsbHkiKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG51bGxwdHI7CisgICAgICAgIGhpZGxfaGFuZGxlIGZlbmNlSGFuZGxlOworICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmZmVuY2VIYW5kbGUsICZuaCwgKmZlbmNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtGZW5jZVdhaXRUaW1lTXMgPSAxMDsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmVuY2UtPndhaXQoa0ZlbmNlV2FpdFRpbWVNcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IC1FVElNRSkgeworICAgICAgICAgICAgICAgIC8vIGZlbmNlIGlzIG5vdCBzaWduYWxsZWQgeWV0LgorICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJidWZmZXIgZmVuY2Ugd2FpdCBlcnJvciAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgZmVuY2VIYW5kbGUpLmlzT2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVuZGVyQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBuc2Vjc190IHNpZ25hbFRpbWUgPSBmZW5jZS0+Z2V0U2lnbmFsVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzaWduYWxUaW1lID49IDAgJiYgc2lnbmFsVGltZSA8IElOVDY0X01BWCkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyQ2FsbGJhY2sobVByb2R1Y2VySWQsIHNsb3QsIHNpZ25hbFRpbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgZmVuY2Ugc2lnbmFsIHRpbWUgb2YgJWxsZCIsIChsb25nIGxvbmcpc2lnbmFsVGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gJnNsb3RCdWZmZXIgPSBtQnVmZmVyc1tzbG90XTsKKyAgICAgICAgaWYgKHN0YXR1cyAmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT04gfHwgIXNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgIGlmICghc2xvdEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTi5CLiBUaGlzIGFzc3VtZXMgcmVxdWVzdEJ1ZmZlciMgcmV0dXJucyBhbiBleGlzdGluZyBhbGxvY2F0aW9uCisgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGEgbmV3IGFsbG9jYXRpb24uCisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtUHJvZHVjZXItPnJlcXVlc3RCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc2xvdEJ1ZmZlcl0oaW50MzJfdCB0U3RhdHVzLCBBbndCdWZmZXIgY29uc3QmIHRCdWZmZXIpeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW5kcm9pZDo6Y29udmVyc2lvbjo6Y29udmVydFRvKHNsb3RCdWZmZXIuZ2V0KCksIHRCdWZmZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2xvdEJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR1YoImJ1ZmZlciB3cmFwcyAlbGx1ICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltUHJvZHVjZXJJZCwgc2xvdCk7CisgICAgICAgICAgICBDMkhhbmRsZSAqYzJIYW5kbGUgPSBhbmRyb2lkOjpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+aGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmdldEdlbmVyYXRpb25OdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQsIHNsb3QpOworICAgICAgICAgICAgaWYgKGMySGFuZGxlKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oYzJIYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkLCBzbG90LCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQmxvY2sgd2FzIG5vdCBjcmVhdGVkLiBjYWxsIHJlcXVlc3RCdWZmZXIjIGFnYWluIG5leHQgdGltZS4KKyAgICAgICAgICAgIHNsb3RCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtSW5pdChDMl9PSyksIG1Qcm9kdWNlcklkKDApLCBtQWxsb2NhdG9yKGFsbG9jYXRvcikgeworICAgIH0KKworICAgIH5JbXBsKCkgeworICAgICAgICBib29sIG5vSW5pdCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgeworICAgICAgICAgICAgaWYgKCFub0luaXQgJiYgbVByb2R1Y2VyKSB7CisgICAgICAgICAgICAgICAgUmV0dXJuPGludDMyX3Q+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGkpKTsKKyAgICAgICAgICAgICAgICBub0luaXQgPSAhdHJhbnNSZXN1bHQuaXNPaygpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odHJhbnNSZXN1bHQpID09IGFuZHJvaWQ6Ok5PX0lOSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgIGJsb2NrLT5yZXNldCgpOworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBpbnQga01heElnYnBSZXRyeSA9IDIwOyAvLyBUT0RPOiBzbWFsbCBudW1iZXIgY2FuIGNhdXNlIGNyYXNoIGluIHJlbGVhc2luZy4KKyAgICAgICAgc3RhdGljIGludCBrTWF4SWdicFJldHJ5RGVsYXlVcyA9IDEwMDAwOworCisgICAgICAgIGludCBjdXJUcnkgPSAwOworCisgICAgICAgIHdoaWxlIChjdXJUcnkrKyA8IGtNYXhJZ2JwUmV0cnkpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgLy8gVE9ETzogcmV0dXJuIEMyX05PX0lOSVQKKyAgICAgICAgICAgIGlmIChtUHJvZHVjZXJJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICh1aW50NjRfdCkwLCB+MCwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb25maWc/CisgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGVkIGEgYnVmZmVyIHN1Y2Nlc3NmdWxseSIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZmV0Y2hGcm9tSWdicF9sKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfQkxPQ0tJTkcpIHsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIDo6dXNsZWVwKGtNYXhJZ2JwUmV0cnlEZWxheVVzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgIH0KKworICAgIHZvaWQgc2V0UmVuZGVyQ2FsbGJhY2soY29uc3QgT25SZW5kZXJDYWxsYmFjayAmcmVuZGVyQ2FsbGJhY2spIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVJlbmRlckNhbGxiYWNrID0gcmVuZGVyQ2FsbGJhY2s7CisgICAgfQorCisgICAgdm9pZCBjb25maWd1cmVQcm9kdWNlcihjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpIHsKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBhbmRyb2lkOjpPSzsKKyAgICAgICAgdWludDY0X3QgcHJvZHVjZXJJZCA9IDA7CisgICAgICAgIGlmIChwcm9kdWNlcikgeworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gcHJvZHVjZXItPmdldFVuaXF1ZUlkKAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnByb2R1Y2VySWRdKGludDMyX3QgdFN0YXR1cywgaW50NjRfdCB0UHJvZHVjZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VySWQgPSB0UHJvZHVjZXJJZDsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25maWd1cmVQcm9kdWNlciAtLSBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgcHJvZHVjZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIGJvb2wgbm9Jbml0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICghbm9Jbml0ICYmIG1Qcm9kdWNlcikgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48aW50MzJfdD4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9Jbml0ID0gIXRyYW5zUmVzdWx0LmlzT2soKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0cmFuc1Jlc3VsdCkgPT0gYW5kcm9pZDo6Tk9fSU5JVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm9kdWNlciAmJiBzdGF0dXMgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXIgPSBwcm9kdWNlcjsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCA9IHByb2R1Y2VySWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Qcm9kdWNlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKyAgICB2b2lkIGNhbmNlbCh1aW50NjRfdCBpZ2JwX2lkLCBpbnQzMl90IGlnYnBfc2xvdCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAoaWdicF9pZCA9PSBtUHJvZHVjZXJJZCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKGlnYnBfc2xvdCwgbnVsbHB0cikuaXNPaygpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgdWludDY0X3QgbVByb2R1Y2VySWQ7CisgICAgT25SZW5kZXJDYWxsYmFjayBtUmVuZGVyQ2FsbGJhY2s7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtQnVmZmVyc1tOVU1fQlVGRkVSX1NMT1RTXTsKK307CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlcikgOgorICAgICAgICBoZWxkKHByb2R1Y2VyICYmIGJxSWQgIT0gMCksIGxvY2FsKGZhbHNlKSwKKyAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCisgICAgICAgIGlnYnAocHJvZHVjZXIpLAorICAgICAgICBsb2NhbFBvb2woKSB7Cit9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiYgcG9vbCkgOgorICAgICAgICBoZWxkKHRydWUpLCBsb2NhbCh0cnVlKSwKKyAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCisgICAgICAgIGlnYnAocG9vbCA/IHBvb2wtPm1Qcm9kdWNlciA6IG51bGxwdHIpLAorICAgICAgICBsb2NhbFBvb2wocG9vbCkgeworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgeworICAgIGlmICghaGVsZCB8fCBicUlkID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobG9jYWwgJiYgbG9jYWxQb29sKSB7CisgICAgICAgIGxvY2FsUG9vbC0+Y2FuY2VsKGJxSWQsIGJxU2xvdCk7CisgICAgfSBlbHNlIGlmIChpZ2JwKSB7CisgICAgICAgIGlnYnAtPmNhbmNlbEJ1ZmZlcihicVNsb3QsIG51bGxwdHIpOworICAgIH0KK30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpLCBtTG9jYWxJZChsb2NhbElkKSwgbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2woKSB7fQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hHcmFwaGljQmxvY2sod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OmNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y29uZmlndXJlUHJvZHVjZXIocHJvZHVjZXIpOworICAgIH0KK30KKwordm9pZCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjaykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+c2V0UmVuZGVyQ2FsbGJhY2socmVuZGVyQ2FsbGJhY2spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJEZWJ1Zy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWE3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctcGFyYW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFzU3RyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKGMyX3N0YXR1c190IGksIGNvbnN0IGNoYXIgKmRlZikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEMyX09LOiAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgIGNhc2UgQzJfQkFEX1ZBTFVFOiByZXR1cm4gIkJBRF9WQUxVRSI7CisgICAgICAgIGNhc2UgQzJfQkFEX0lOREVYOiByZXR1cm4gIkJBRF9JTkRFWCI7CisgICAgICAgIGNhc2UgQzJfQ0FOTk9UX0RPOiByZXR1cm4gIkNBTk5PVF9ETyI7CisgICAgICAgIGNhc2UgQzJfRFVQTElDQVRFOiByZXR1cm4gIkRVUExJQ0FURSI7CisgICAgICAgIGNhc2UgQzJfTk9UX0ZPVU5EOiByZXR1cm4gIk5PVF9GT1VORCI7CisgICAgICAgIGNhc2UgQzJfQkFEX1NUQVRFOiByZXR1cm4gIkJBRF9TVEFURSI7CisgICAgICAgIGNhc2UgQzJfQkxPQ0tJTkc6ICByZXR1cm4gIkJMT0NLSU5HIjsKKyAgICAgICAgY2FzZSBDMl9DQU5DRUxFRDogIHJldHVybiAiQ0FOQ0VMRUQiOworICAgICAgICBjYXNlIEMyX05PX01FTU9SWTogcmV0dXJuICJOT19NRU1PUlkiOworICAgICAgICBjYXNlIEMyX1JFRlVTRUQ6ICAgcmV0dXJuICJSRUZVU0VEIjsKKyAgICAgICAgY2FzZSBDMl9USU1FRF9PVVQ6IHJldHVybiAiVElNRURfT1VUIjsKKyAgICAgICAgY2FzZSBDMl9PTUlUVEVEOiAgIHJldHVybiAiT01JVFRFRCI7CisgICAgICAgIGNhc2UgQzJfQ09SUlVQVEVEOiByZXR1cm4gIkNPUlJVUFRFRCI7CisgICAgICAgIGNhc2UgQzJfTk9fSU5JVDogICByZXR1cm4gIk5PX0lOSVQiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgaSwgY29uc3QgY2hhciAqZGVmKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6ICAgcmV0dXJuICJ1OCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjogcmV0dXJuICJjMzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6IHJldHVybiAiYzY0IjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICByZXR1cm4gImZwIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6ICByZXR1cm4gImkzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgcmV0dXJuICJpNjQiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IHJldHVybiAiY2hyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiByZXR1cm4gInUzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogcmV0dXJuICJ1NjQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gKGkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpID8gInN0cnVjdCIgOiBkZWY7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJQYXJhbUZpZWxkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RkOjpzdHJpbmcgYXR0cmliUGFyYW1Db3JlSW5kZXgoY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4ICZpKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJWMlYyUwM3giLAorICAgICAgICAgICAgaS5pc0ZsZXhpYmxlKCkgPyAnRicgOiAnLScsCisgICAgICAgICAgICBpLmlzVmVuZG9yKCkgPyAnVicgOiAnLScsCisgICAgICAgICAgICBpLmNvcmVJbmRleCgpKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF0dHJpYlBhcmFtSW5kZXgoCisgICAgICAgIGNvbnN0IEMyUGFyYW06OlR5cGUgJmksIGJvb2wgYWRkU3RyZWFtLCB1bnNpZ25lZCBzdHJlYW1JZCkgeworICAgIHN0ZDo6c3RyaW5nIHYgPSBTdHJpbmdQcmludGYoIiVjJWMiLAorICAgICAgICAgICAgaS5mb3JJbnB1dCgpID8gJ0knIDogaS5mb3JPdXRwdXQoKSA/ICdPJyA6ICctJywKKyAgICAgICAgICAgIGkuZm9yU3RyZWFtKCkgPyAnUycgOiBpLmZvclBvcnQoKSA/ICdQJyA6ICdHJyk7CisgICAgaWYgKGFkZFN0cmVhbSkgeworICAgICAgICBpZiAoaS5mb3JTdHJlYW0oKSkgeworICAgICAgICAgICAgdiArPSBTdHJpbmdQcmludGYoIiUwMmQiLCBzdHJlYW1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ICs9ICItLSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdgorICAgICAgICAgICAgKyBTdHJpbmdQcmludGYoIiVjICIsCisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlNUUlVDVCAgPyAnUycgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpJTkZPICAgID8gJ2knIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6VFVOSU5HICA/ICd0JyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlNFVFRJTkcgPyAncycgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpOT05FICAgID8gJy0nIDogJz8nKQorICAgICAgICAgICAgKyBhdHRyaWJQYXJhbUNvcmVJbmRleChpKTsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSkgeworICAgIHJldHVybiBvcyA8PCAiUGFyYW06OkNvcmVJbmRleCgiIDw8IGF0dHJpYlBhcmFtQ29yZUluZGV4KGkpIDw8ICIpIjsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OlR5cGUgJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCJQYXJhbTo6VHlwZSglMDh4OiAiLCBpLnR5cGUoKSkKKyAgICAgICAgICAgIDw8IGF0dHJpYlBhcmFtSW5kZXgoaSwgZmFsc2UsIDApIDw8ICIpIjsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkluZGV4ICZpKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiUGFyYW06OkluZGV4KCUwOHg6ICIsICh1aW50MzJfdClpKQorICAgICAgICAgICAgPDwgYXR0cmliUGFyYW1JbmRleChpLCB0cnVlLCBpLnN0cmVhbSgpKSA8PCAiKSI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdHRyaWJGaWVsZElkKGNvbnN0IF9DMkZpZWxkSWQgJmkpIHsKKyAgICByZXR1cm4gU3RyaW5nUHJpbnRmKCJGaWVsZChAJTAyeCslMDJ4KSIsCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGkpLAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoaSkpOworfQorCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBfQzJGaWVsZElkICZpKSB7CisgICAgcmV0dXJuIG9zIDw8ICI8IiA8PCBhdHRyaWJGaWVsZElkKGkpIDw8ICI+IjsKK30KKworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmkpIHsKKyAgICBvcyA8PCBhdHRyaWJGaWVsZElkKF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChpKSkgPDwgIiAiOworICAgIGlmIChpLm5hbWVkVmFsdWVzKCkuc2l6ZSgpKSB7CisgICAgICAgIG9zIDw8ICJlbnVtICI7CisgICAgfQorICAgIHJldHVybiBvcyA8PCBhc1N0cmluZyhpLnR5cGUoKSkgPDwgIiAiIDw8IGkubmFtZSgpCisgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIlslenVdIiwgaS5leHRlbnQoKSk7Cit9CisKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW1GaWVsZCAmaSkgeworICAgIG9zIDw8ICI8IiA8PCBDMlBhcmFtOjpJbmRleChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0SW5kZXgoaSkpCisgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjo6RmllbGQoQCUwMngrJTAyeCk+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKGkpKTsKKyAgICByZXR1cm4gb3M7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gX0MyRmllbGRWYWx1ZUhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGQ6Om9zdHJlYW0mIF9DMkZpZWxkVmFsdWVIZWxwZXI8Y2hhcj46OnB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIHsKKyAgICBpZiAoaXNwcmludChwLmkzMikpIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiJyVjJyIsIHAuaTMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCInXFx4JTAyeCciLCAodWludDMyX3QpcC5pMzIpOworICAgIH0KK30KKworc3RkOjpvc3RyZWFtJiBfQzJGaWVsZFZhbHVlSGVscGVyPHVpbnQ4X3Q+OjpwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiMHglMDJ4IiwgcC51MzIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IGMyX2NudHJfdDxUPiAmdikgeworICAgIHJldHVybiBvcyA8PCAiY3RyKCIgPDwgdi5wZWVrdSgpIDw8ICIpIjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZpKSB7CisgICAgb3MgPDwgIlJhbmdlKCI7CisgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCBpLm1pbigpKTsKKyAgICBvcyA8PCAiLi4iOworICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5tYXgoKSk7CisgICAgb3MgPDwgIiAqPSAiIDw8IGkubnVtKCkgPDwgIiAvPSAiIDw8IGkuZGVub20oKSA8PCAiICs9ICIgPDwgaS5zdGVwKCkgPDwgIikiOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZpKSB7CisgICAgb3MgPDwgIkZsYWdzWyI7CisgICAgaWYgKCFpLmlzRW1wdHkoKSkgeworICAgICAgICBvcyA8PCAibWluPSI7CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5taW4oKSk7CisgICAgfQorICAgIGJvb2wgY29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IFQgJnYgOiBpLmZsYWdzKCkpIHsKKyAgICAgICAgaWYgKGNvbW1hKSB7CisgICAgICAgICAgICBvcyA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgdik7CisgICAgICAgIGNvbW1hID0gdHJ1ZTsKKyAgICB9CisgICAgb3MgPDwgIl0iOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZpKSB7CisgICAgb3MgPDwgIlZhbHVlc1siOworICAgIGJvb2wgY29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IFQgJnYgOiBpLnZhbHVlcygpKSB7CisgICAgICAgIGlmIChjb21tYSkgeworICAgICAgICAgICAgb3MgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIHYpOworICAgICAgICBjb21tYSA9IHRydWU7CisgICAgfQorICAgIG9zIDw8ICJdIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgX21UeXBlOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VmFsdWVUeXBlPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbVZhbHVlczsKKyAgICBDMlN1cHBvcnRlZEZsYWdzPFZhbHVlVHlwZT4gX21GbGFnczsKKworcHVibGljOgorLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCAmaSk7CisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEltcGwgJmkpOworICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbDo6c3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0IHsKKyAgICBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFKSB7CisgICAgICAgIG9zIDw8IF9tUmFuZ2U7CisgICAgfSBlbHNlIGlmIChfbVR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgIG9zIDw8IF9tVmFsdWVzOworICAgIH0gZWxzZSBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTKSB7CisgICAgICAgIG9zIDw8IF9tRmxhZ3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3MgPDwgIlVua25vd24gRlNWIHR5cGU6ICIgPDwgKHVpbnQzMl90KV9tVHlwZTsKKyAgICB9CisgICAgcmV0dXJuIG9zOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpIHsKKyAgICByZXR1cm4gaS5fbUltcGwtPnN0cmVhbU91dChvcyk7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGZsb2F0PiAmaSk7CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0N2ZiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwCkBAIC0wLDAgKzEsODQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmbGVjdG9ySGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEMyUmVmbGVjdG9ySGVscGVyOjphZGRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPD4gKikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tTXV0ZXgpOworICAgIGZvciAoQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1a3QgOiBzdHJ1Y3RzKSB7CisgICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHN0cnVjdHVyZSBkZXNjcmlwdGlvbnMgY29uZmxpY3Qgd2l0aCBleGlzdGluZyBvbmVzCisgICAgICAgIGFkZFN0cnVjdERlc2NyaXB0b3Ioc3RkOjptb3ZlKHN0cnVrdCkpOworICAgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4KK0MyUmVmbGVjdG9ySGVscGVyOjpkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBfbVN0cnVjdHMuZmluZChwYXJhbUluZGV4KTsKKyAgICBpZiAoaXQgPT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oaXQtPnNlY29uZCk7CisgICAgfQorfTsKKwordm9pZCBDMlJlZmxlY3RvckhlbHBlcjo6YWRkU3RydWN0RGVzY3JpcHRvcihDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpIHsKKyAgICBpZiAoX21TdHJ1Y3RzLmZpbmQoc3RydWt0LmNvcmVJbmRleCgpKSAhPSBfbVN0cnVjdHMuZW5kKCkpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBhZGRlZAorICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSB0aGF0IGRlc2NyaXB0b3IgbWF0Y2hlcyBzdG9yZWQgZGVzY3JpcHRvcgorICAgIH0KKyAgICAvLyB2YWxpZGF0ZSB0aGF0IGFsbCBzdHJ1Y3QgZmllbGRzIGFyZSBrbm93biB0byB0aGlzIHJlZmxlY3RvcgorICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkIDogc3RydWt0KSB7CisgICAgICAgIGlmIChmZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXggPSBmZC50eXBlKCkgJn4gQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHOworICAgICAgICAgICAgaWYgKF9tU3RydWN0cy5maW5kKGNvcmVJbmRleCkgPT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKElORk8pIDw8ICJtaXNzaW5nIHN0cnVjdCBkZXNjcmlwdG9yICMiIDw8IGNvcmVJbmRleCA8PCAiIGZvciBmaWVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBmZC5uYW1lKCkgPDwgIiBvZiBzdHJ1Y3QgIyIgPDwgc3RydWt0LmNvcmVJbmRleCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9tU3RydWN0cy5lbXBsYWNlKHN0cnVrdC5jb3JlSW5kZXgoKSwgc3RydWt0KTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhcmFtSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2xhc3MgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KQorICAgICAgICA6IG1QYXJhbShwYXJhbSksIG1OYW1lKG5hbWUpLCBfbVN0cnVjdChzdHJ1a3QpIHsgfQorCisgICAgSW1wbChJbXBsJiYpID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpIHsKKyAgICAgICAgbURvd25EZXBlbmRlbmNpZXMucHVzaF9iYWNrKGluZGV4KTsKKyAgICB9CisKKyAgICBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYl90JiBhdHRyaWIoKSB7CisgICAgICAgIHJldHVybiBtQXR0cmliOworICAgIH0KKworICAgIHZvaWQgYnVpbGQoKSB7CisgICAgICAgIC8vIG1vdmUgZGVwZW5kZW5jaWVzIGludG8gZGVzY3JpcHRvcgorICAgICAgICBtRGVzY3JpcHRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIGluZGV4KCksIChDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QpbUF0dHJpYiwKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUobU5hbWUpLCBzdGQ6Om1vdmUobURlcGVuZGVuY2llcykpOworICAgIH0KKworICAgIHZvaWQgY3JlYXRlRmllbGRzQW5kU3VwcG9ydGVkVmFsdWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZFV0aWxzOjpJbmZvICZmIDoKKyAgICAgICAgICAgICAgICBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZUZpZWxkcygqbURlZmF1bHRWYWx1ZSwgcmVmbGVjdG9yKSkgeworICAgICAgICAgICAgaWYgKCFmLmlzQXJpdGhtZXRpYygpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gZnN2UG9pbnRlcjsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgYnJlYWthYmxlIHN0cnVjdHVyZQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgZnN2OworICAgICAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGludDY0X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGZsb2F0Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiAgIGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDhfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGNoYXI+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGJyZWFrIG91dCBvZiBkbyB7fSB3aGlsZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmc3ZQb2ludGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPihmc3YpOworICAgICAgICAgICAgfSB3aGlsZSAoZmFsc2UpOworCisgICAgICAgICAgICBtRmllbGRzLmVtcGxhY2VfaGludCgKKyAgICAgICAgICAgICAgICAgICAgbUZpZWxkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgX0MyRmllbGRJZChmLm9mZnNldCgpLCBmLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8RmllbGRIZWxwZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbSwgX0MyRmllbGRJZChmLm9mZnNldCgpLCBmLnNpemUoKSksIHN0ZDo6bW92ZShmc3ZQb2ludGVyKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gZmluZEZpZWxkKHNpemVfdCBiYXNlT2Zmcywgc2l6ZV90IGJhc2VTaXplKSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtRmllbGRzLmZpbmQoX0MyRmllbGRJZChiYXNlT2ZmcywgYmFzZVNpemUpKTsKKyAgICAgICAgaWYgKGl0ID09IG1GaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBnZXREZXBlbmRlbmNpZXNBc1JlZnMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGVwZW5kZW5jaWVzQXNSZWZzOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4gZ2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBnZXREb3duRGVwZW5kZW5jaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURvd25EZXBlbmRlbmNpZXM7CisgICAgfQorCisgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdCB7CisgICAgICAgIGlmICghbURlZmF1bHRWYWx1ZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBtaXNzaW5nIGRlZmF1bHQgdmFsdWVcbiIsIG1OYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRGVmYXVsdFZhbHVlLT5pbmRleCgpOworICAgIH0KKworICAgIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisKKyAgICBjb25zdCBQYXJhbVJlZiByZWYoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGFyYW07CisgICAgfQorCisgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIHJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShfbVN0cnVjdCk7CisgICAgfQorCisgICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGRlZmF1bHRfKSB7CisgICAgICAgIG1EZWZhdWx0VmFsdWUgPSBkZWZhdWx0XzsKKyAgICB9CisKKyAgICB2b2lkIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpIHsKKyAgICAgICAgbURlcGVuZGVuY2llcyA9IGluZGljZXM7CisgICAgICAgIG1EZXBlbmRlbmNpZXNBc1JlZnMgPSByZWZzOworICAgIH0KKworICAgIHZvaWQgc2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpIHsKKyAgICAgICAgLy8gZG8gbm90IGFsbG93IGFkZGluZyBmaWVsZHMgbXVsdGlwbGUgdGltZXMsIG9yIHRvIGNvbnN0IHZhbHVlcworICAgICAgICBpZiAoIW1GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiVHJ5aW5nIHRvIGFkZCBmaWVsZHMgdG8gcGFyYW0gIiA8PCBtTmFtZSA8PCAiIG11bHRpcGxlIHRpbWVzIjsKKyAgICAgICAgfSBlbHNlIGlmIChtQXR0cmliICYgYXR0cmliX3Q6OklTX0NPTlNUKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJUcnlpbmcgdG8gYWRkIGZpZWxkcyB0byBjb25zdCBwYXJhbSAiIDw8IG1OYW1lOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChDMlBhcmFtRmllbGRWYWx1ZXMgJnBmdiA6IGZpZWxkcykgeworICAgICAgICAgICAgbUZpZWxkcy5lbXBsYWNlX2hpbnQoCisgICAgICAgICAgICAgICAgICAgIG1GaWVsZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIC8vIF9DMkZpZWxkSWQgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldEZpZWxkKHBmdi5wYXJhbU9yRmllbGQpLAorICAgICAgICAgICAgICAgICAgICAvLyBGaWVsZCBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEZpZWxkSGVscGVyPihtUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZnYucGFyYW1PckZpZWxkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBmdi52YWx1ZXMpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldEdldHRlcihzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKSB7CisgICAgICAgIG1HZXR0ZXIgPSBnZXR0ZXI7CisgICAgfQorCisgICAgdm9pZCBzZXRTZXR0ZXIoc3RkOjpmdW5jdGlvbjxDMlIoY29uc3QgQzJQYXJhbSAqLCBib29sLCBib29sICosIEZhY3RvcnkgJik+IHNldHRlcikgeworICAgICAgICBtU2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHRyeVNldCgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgICAgICBDMlIgcmVzdWx0ID0gbVNldHRlcih2YWx1ZSwgbWF5QmxvY2ssIGNoYW5nZWQsIGYpOworICAgICAgICByZXR1cm4gcmVzdWx0LnJldHJpZXZlRmFpbHVyZXMoZmFpbHVyZXMpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHZhbGlkYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgICAgIGlmICghbVNldHRlciAmJiBtRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEMyX0xPRyhXQVJOSU5HKSA8PCAiUGFyYW0gIiA8PCBtTmFtZSA8PCAiIGhhcyBubyBzZXR0ZXIsIG1ha2luZyBpdCBjb25zdCI7CisgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMgYXJlIGVtcHR5IGluIHRoaXMgY2FzZQorICAgICAgICAgICAgbUF0dHJpYiB8PSBhdHRyaWJfdDo6SVNfQ09OU1Q7CisgICAgICAgIH0gZWxzZSBpZiAoIW1TZXR0ZXIpIHsKKyAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlBhcmFtICIgPDwgbU5hbWUgPDwgIiBoYXMgbm8gc2V0dGVyIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQXR0cmliICYgYXR0cmliX3Q6OklTX0NPTlNUKSB7CisgICAgICAgICAgICBjcmVhdGVGaWVsZHNBbmRTdXBwb3J0ZWRWYWx1ZXMocmVmbGVjdG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHVwZGF0ZSBkZWZhdWx0IGJhc2VkIG9uIHNldHRlciBhbmQgdmVyaWZ5IHRoYXQgRlNWIGNvdmVycyB0aGUgdmFsdWVzCisgICAgICAgIH0KKworICAgICAgICBpZiAobUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJQYXJhbSAiIDw8IG1OYW1lIDw8ICIgaGFzIG5vIGZpZWxkcyI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlKCkgeworICAgICAgICByZXR1cm4gbVBhcmFtLmdldCgpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtPiB2YWx1ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QYXJhbS5nZXQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBfQzJQYXJhbUluc3BlY3Rvcjo6YXR0cmliX3QgYXR0cmliX3Q7CisgICAgUGFyYW1SZWYgbVBhcmFtOworICAgIEMyU3RyaW5nIG1OYW1lOworICAgIEMyU3RydWN0RGVzY3JpcHRvciBfbVN0cnVjdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gbURlZmF1bHRWYWx1ZTsKKyAgICBhdHRyaWJfdCBtQXR0cmliOworICAgIHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBtU2V0dGVyOworICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBtR2V0dGVyOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBtRGVwZW5kZW5jaWVzOworICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBtRGVwZW5kZW5jaWVzQXNSZWZzOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBtRG93bkRlcGVuZGVuY2llczsgLy8gVE9ETzogdGhpcyBkb2VzIG5vdCB3b3JrIGZvciBzdHJlYW0gZGVwZW5kZW5jaWVzCisgICAgc3RkOjptYXA8X0MyRmllbGRJZCwgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPj4gbUZpZWxkczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IG1EZXNjcmlwdG9yOworfTsKKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpQYXJhbUhlbHBlcigKKyAgICAgICAgUGFyYW1SZWYgcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpCisgICAgOiBtSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6SW1wbD4oCisgICAgICAgICAgICBwYXJhbSwgbmFtZSwgc3RkOjptb3ZlKHN0cnVrdCkpKSB7IH0KKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpQYXJhbUhlbHBlcihDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXIgJiYpID0gZGVmYXVsdDsKKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp+UGFyYW1IZWxwZXIoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphZGREb3duRGVwZW5kZW5jeShDMlBhcmFtOjpJbmRleCBpbmRleCkgeworICAgIHJldHVybiBtSW1wbC0+YWRkRG93bkRlcGVuZGVuY3koaW5kZXgpOworfQorCitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYl90JiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYigpIHsKKyAgICByZXR1cm4gbUltcGwtPmF0dHJpYigpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyPiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmJ1aWxkKCkgeworICAgIG1JbXBsLT5idWlsZCgpOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcj4oc3RkOjptb3ZlKCp0aGlzKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZmluZEZpZWxkKGJhc2VPZmZzLCBiYXNlU2l6ZSk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbVJlZj4KK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4KK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERlc2NyaXB0b3IoKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERvd25EZXBlbmRlbmNpZXMoKTsKK30KKworQzJQYXJhbTo6SW5kZXggQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjppbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmluZGV4KCk7Cit9CisKK0MyU3RyaW5nIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6bmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm5hbWUoKTsKK30KKworY29uc3QgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtUmVmIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6cmVmKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+cmVmKCk7Cit9CisKK0MyU3RydWN0RGVzY3JpcHRvciBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gbUltcGwtPnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0XykgeworICAgIG1JbXBsLT5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdF8pOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RGVwZW5kZW5jaWVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpIHsKKyAgICBtSW1wbC0+c2V0RGVwZW5kZW5jaWVzKGluZGljZXMsIHJlZnMpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpIHsKKyAgICByZXR1cm4gbUltcGwtPnNldEZpZWxkcyhzdGQ6Om1vdmUoZmllbGRzKSk7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXRHZXR0ZXIoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBnZXR0ZXIpIHsKKyAgICBtSW1wbC0+c2V0R2V0dGVyKGdldHRlcik7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXRTZXR0ZXIoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpIHsKKyAgICBtSW1wbC0+c2V0U2V0dGVyKHNldHRlcik7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dHJ5U2V0KAorICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgIHJldHVybiBtSW1wbC0+dHJ5U2V0KHZhbHVlLCBtYXlCbG9jaywgY2hhbmdlZCwgZiwgZmFpbHVyZXMpOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnZhbGlkYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIHJldHVybiBtSW1wbC0+dmFsaWRhdGUocmVmbGVjdG9yKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dmFsdWUoKSB7CisgICAgcmV0dXJuIG1JbXBsLT52YWx1ZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp2YWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnZhbHVlKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmllbGRIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlBhcmFtRmllbGQgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjptYWtlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlUGFyYW1GaWVsZChpbmRleCwgbUZpZWxkSWQpOworfQorCitDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OkZpZWxkSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpCisgICAgOiBtUGFyYW0ocGFyYW0pLAorICAgICAgbUZpZWxkSWQoZmllbGQpLAorICAgICAgbVBvc3NpYmxlKHN0ZDo6bW92ZSh2YWx1ZXMpKSB7CisgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJDcmVhdGluZyBmaWVsZCBoZWxwZXIgIiA8PCBmaWVsZCA8PCAiICIKKyAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDMyX3Q+KCptUG9zc2libGUpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6c2V0U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpIHsKKyAgICBtU3VwcG9ydGVkID0gc3RkOjptb3ZlKHZhbHVlcyk7Cit9CisKK2NvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKkMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6Z2V0U3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiAobVN1cHBvcnRlZCA/IG1TdXBwb3J0ZWQgOiBtUG9zc2libGUpLmdldCgpOworfQorCitjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OmdldFBvc3NpYmxlVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBtUG9zc2libGUuZ2V0KCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogV3JhcHBlciBhcm91bmQgZmllbGQtc3VwcG9ydGVkLXZhbHVlcyBidWlsZGVyIHRoYXQgZ2V0cyBzdG9yZWQgaW4gdGhlCisgKiBmaWVsZCBoZWxwZXIgd2hlbiB0aGUgYnVpbGRlciBnb2VzIG91dCBvZiBzY29wZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdXBwb3J0ZWRWYWx1ZXNCdWlsZGVyIDogQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiB7CisgICAgU3VwcG9ydGVkVmFsdWVzQnVpbGRlcigKKyAgICAgICAgICAgIEMyUGFyYW1GaWVsZCAmZmllbGQsIHN0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+IGhlbHBlcikKKyAgICAgICAgOiBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+KGZpZWxkKSwgX21IZWxwZXIoaGVscGVyKSwgX21GaWVsZChmaWVsZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgYnVpbGRlciB2YWx1ZXMgb24gZGVzdHJ1Y3Rpb24uCisgICAgICovCisgICAgdmlydHVhbCB+U3VwcG9ydGVkVmFsdWVzQnVpbGRlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgX21IZWxwZXItPnNldFN1cHBvcnRlZFZhbHVlcyhzdGQ6Om1vdmUoQzJQYXJhbUZpZWxkVmFsdWVzKCp0aGlzKS52YWx1ZXMpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcj4gX21IZWxwZXI7CisgICAgQzJQYXJhbUZpZWxkIF9tRmllbGQ7Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6c2hvdWxkQmUoKSBjb25zdCB7CisgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4oX21GaWVsZCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6bXVzdEJlKCkgeworICAgIHJldHVybiBTdXBwb3J0ZWRWYWx1ZXNCdWlsZGVyPFQ+KF9tRmllbGQsIF9tSGVscGVyKTsKK30KKworLyoKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6dmFsaWRhdGVQb3NzaWJsZShUICZ2YWx1ZSkKK2NvbnN0IHsKKyAgICAvLy8gVE9ETworICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6T2soKTsKK30KKyovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OkZpZWxkKHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gaGVscGVyLCBDMlBhcmFtOjpJbmRleCBpbmRleCkKKyAgICA6IF9tSGVscGVyKGhlbHBlciksIF9tRmllbGQoaGVscGVyLT5tYWtlUGFyYW1GaWVsZChpbmRleCkpIHsgfQorCit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPHVpbnQ4X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxjaGFyPjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8aW50MzJfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGludDY0X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50NjRfdD47CisvL3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGYWN0b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZhY3RvcnlJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyOjpGYWN0b3J5IHsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRSZWZsZWN0b3IoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBfbVJlZmxlY3RvcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4KKyAgICBnZXRQYXJhbUhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIF9tUGFyYW1zLmZpbmQocGFyYW0pLT5zZWNvbmQ7CisgICAgfQorCitwdWJsaWM6CisgICAgRmFjdG9yeUltcGwoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgOiBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgdmlydHVhbCB+RmFjdG9yeUltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZFBhcmFtKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pIHsKKyAgICAgICAgX21QYXJhbXMuaW5zZXJ0KHsgcGFyYW0tPnJlZigpLCBwYXJhbSB9KTsKKyAgICAgICAgX21JbmRleFRvSGVscGVyLmluc2VydCh7cGFyYW0tPmluZGV4KCksIHBhcmFtfSk7CisKKyAgICAgICAgLy8gYWRkIGRvd24tZGVwZW5kZW5jaWVzIChhbmQgdmFsaWRhdGUgZGVwZW5kZW5jaWVzIGFzIGEgcmVzdWx0KQorICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IFBhcmFtUmVmICZyZWYgOiBwYXJhbS0+Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkpIHsKKyAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llcyBtdXN0IGFscmVhZHkgYmUgZGVmaW5lZAorICAgICAgICAgICAgaWYgKCFfbVBhcmFtcy5jb3VudChyZWYpKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiUGFyYW1ldGVyICIgPDwgcGFyYW0tPm5hbWUoKSA8PCAiIGhhcyBhIGRlcGVuZGVuY3kgYXQgaW5kZXggIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaXggPDwgIiB0aGF0IGlzIG5vdCB5ZXQgZGVmaW5lZCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbVBhcmFtcy5maW5kKHJlZiktPnNlY29uZC0+YWRkRG93bkRlcGVuZGVuY3kocGFyYW0tPmluZGV4KCkpOworICAgICAgICAgICAgKytpeDsKKyAgICAgICAgfQorCisgICAgICAgIF9tRGVwZW5kZW5jeUluZGV4LmVtcGxhY2UocGFyYW0tPmluZGV4KCksIF9tRGVwZW5kZW5jeUluZGV4LnNpemUoKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBnZXRQYXJhbShDMlBhcmFtOjpJbmRleCBpeCkgY29uc3QgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgc3RyZWFtcyBzZXBhcmF0ZWx5CisgICAgICAgIGNvbnN0IGF1dG8gaXQgPSBfbUluZGV4VG9IZWxwZXIuZmluZChpeCk7CisgICAgICAgIGlmIChpdCA9PSBfbUluZGV4VG9IZWxwZXIuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IHRoaXMgY291bGQgcmV0dXJuIGEgY29weSB1c2luZyBwcm9wZXIgcG9pbnRlciBjYXN0LgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBnZXRQYXJhbVZhbHVlKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gaGVscGVyID0gZ2V0UGFyYW0oaXgpOworICAgICAgICByZXR1cm4gaGVscGVyID8gaGVscGVyLT52YWx1ZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IF9tUGFyYW1zKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgcXVlcnlTdXBwb3J0ZWRQYXJhbXMgc2lnbmF0dXJlPworICAgICAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29uc3RfcG9pbnRlcl9jYXN0PEMyUGFyYW1EZXNjcmlwdG9yPihpdC5zZWNvbmQtPmdldERlc2NyaXB0b3IoKSkpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBlcnJvcnMKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHNpemVfdCBnZXREZXBlbmRlbmN5SW5kZXgoQzJQYXJhbTo6SW5kZXggaXgpIHsKKyAgICAgICAgLy8gaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBoZWxwZXIgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzdHJlYW0gc28KKyAgICAgICAgLy8gd2UgY2FuIGxvb2sgdXAgZGlyZWN0bHkgYnkgaW5kZXgKKyAgICAgICAgYXV0byBpdCA9IF9tRGVwZW5kZW5jeUluZGV4LmZpbmQoaXgpOworICAgICAgICByZXR1cm4gaXQgPT0gX21EZXBlbmRlbmN5SW5kZXguZW5kKCkgPyBTSVpFX01BWCA6IGl0LT5zZWNvbmQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bWFwPFBhcmFtUmVmLCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+PiBfbVBhcmFtczsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPj4gX21JbmRleFRvSGVscGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc2l6ZV90PiBfbURlcGVuZGVuY3lJbmRleDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhc1N0cmluZyhDMlBhcmFtICpwKSB7CisgICAgY2hhciBhZGRyWzIwXTsKKyAgICBzcHJpbnRmKGFkZHIsICIlcDpbIiwgcCk7CisgICAgc3RkOjpzdHJpbmcgdiA9IGFkZHI7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwLT5zaXplKCk7ICsraSkgeworICAgICAgICBjaGFyIGRbNF07CisgICAgICAgIHNwcmludGYoZCwgIiAlMDJ4IiwgKigoKHVpbnQ4X3QgKilwKSArIGkpKTsKKyAgICAgICAgdiArPSBkICsgKGkgPT0gMCk7CisgICAgfQorICAgIHJldHVybiB2ICsgIl0iOworfQorCit9CisKK0MySW50ZXJmYWNlSGVscGVyOjpDMkludGVyZmFjZUhlbHBlcihzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3RvcikKKyAgICA6IG1SZWZsZWN0b3IocmVmbGVjdG9yKSwKKyAgICAgIF9tRmFjdG9yeShzdGQ6Om1ha2Vfc2hhcmVkPEZhY3RvcnlJbXBsPihyZWZsZWN0b3IpKSB7IH0KKworCitzaXplX3QgQzJJbnRlcmZhY2VIZWxwZXI6OkdldEJhc2VPZmZzZXQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgc2l6ZV90IG9mZnNldCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHBhcmFtID0gcmVmbGVjdG9yLT5kZXNjcmliZShpbmRleCk7CisgICAgaWYgKHBhcmFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIH4oc2l6ZV90KTA7IC8vIHBhcmFtIHN0cnVjdHVyZSBub3QgZGVzY3JpYmVkCisgICAgfQorCisgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmllbGQgOiAqcGFyYW0pIHsKKyAgICAgICAgc2l6ZV90IGZpZWxkT2Zmc2V0ID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChmaWVsZCk7CisgICAgICAgIHNpemVfdCBmaWVsZFNpemUgPSBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShmaWVsZCk7CisgICAgICAgIHNpemVfdCBmaWVsZEV4dGVudCA9IGZpZWxkLmV4dGVudCgpOworICAgICAgICBpZiAob2Zmc2V0IDwgZmllbGRPZmZzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBub3QgZm91bmQKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ID09IGZpZWxkT2Zmc2V0KSB7CisgICAgICAgICAgICAvLyBleGFjdCBtYXRjaAorICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmllbGQuZXh0ZW50KCkgPT0gMCB8fCBvZmZzZXQgPCBmaWVsZE9mZnNldCArIGZpZWxkU2l6ZSAqIGZpZWxkRXh0ZW50KSB7CisgICAgICAgICAgICAvLyByZWR1Y2UgdG8gZmlyc3QgZWxlbWVudCBpbiBjYXNlIG9mIGFycmF5CisgICAgICAgICAgICBvZmZzZXQgPSBmaWVsZE9mZnNldCArIChvZmZzZXQgLSBmaWVsZE9mZnNldCkgJSBmaWVsZFNpemU7CisgICAgICAgICAgICBpZiAoZmllbGQudHlwZSgpID49IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgb2Zmc2V0IGlzIHdpdGhpbiBhIGZpZWxkCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3RvciwgZmllbGQudHlwZSgpICYgfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtIGZpZWxkT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gfm9mZnNldCA/IGZpZWxkT2Zmc2V0ICsgb2Zmc2V0IDogb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBub3QgZm91bmQKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6YWRkUGFyYW1ldGVyKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIG1SZWZsZWN0b3ItPmFkZFN0cnVjdERlc2NyaXB0b3IocGFyYW0tPnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwYXJhbS0+dmFsaWRhdGUobVJlZmxlY3Rvcik7CisgICAgaWYgKGVyciAhPSBDMl9DT1JSVVBURUQpIHsKKyAgICAgICAgX21GYWN0b3J5LT5hZGRQYXJhbShwYXJhbSk7CisKKyAgICAgICAgLy8gcnVuIHNldHRlciB0byBlbnN1cmUgY29ycmVjdCB2YWx1ZXMKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpcGFyYW0tPnRyeVNldChwYXJhbS0+dmFsdWUoKS5nZXQoKSwgQzJfTUFZX0JMT0NLLCAmY2hhbmdlZCwgKl9tRmFjdG9yeSwgJmZhaWx1cmVzKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpjb25maWcoCisgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcywgYm9vbCB1cGRhdGVQYXJhbXMsCisgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+PiAqY2hhbmdlcyBfX3VudXNlZCAvKiBUT0RPICovKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBib29sIHBhcmFtV2FzSW52YWxpZCA9IGZhbHNlOyAvLyBUT0RPIGlzIHRoaXMgdGhlIHNhbWUgYXMgYmFkIHZhbHVlPworICAgIGJvb2wgcGFyYW1Ob3RGb3VuZCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1CYWRWYWx1ZSA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Ob01lbW9yeSA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1CbG9ja2luZyA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1UaW1lZE91dCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Db3JydXB0ZWQgPSBmYWxzZTsKKworICAgIC8vIGRlcGVuZGVuY2llcworICAgIC8vIGRvd24gZGVwZW5kZW5jaWVzIGFyZSBtYXJrZWQgZGlydHksIGJ1dCBwYXJhbXMgc2V0IGFyZSBub3QgaW1tZWRpYXRlbHkKKyAgICAvLyBtYXJrZWQgZGlydHkgKHVubGVzcyB0aGV5IGJlY29tZSBkb3duIGRlcGVuZGVuY3kpIHNvIHRoYXQgd2UgY2FuCisgICAgLy8gYXZvaWQgc2V0dGluZyB0aGVtIGlmIHRoZXkgZGlkIG5vdCBjaGFuZ2UKKworICAgIC8vIFRPRE86IHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGluZGljZXMgZm9yIHRoZSBzYW1lIGRlcGVuZGVuY3kgaW5kZXgKKyAgICAvLyB7IGRlcEl4LCBwYXJhbUl4IH0gbWF5IGJlIGEgc3VpdGFibGUga2V5CisgICAgc3RkOjptYXA8c2l6ZV90LCBzdGQ6OnBhaXI8QzJQYXJhbTo6SW5kZXgsIGJvb2w+PiBkZXBlbmRlbmNpZXM7CisKKyAgICAvLyB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBsYXN0IHZhbGlkIHBhcmFtZXRlciwgc28gYWRkIGFuIGV4dHJhCisgICAgLy8gbG9vcCBpdGVyYXRpb24gYWZ0ZXIgdGhlIGxhc3QgcGFyYW1ldGVyCisgICAgZm9yIChzaXplX3QgcF9peCA9IDA7IHBfaXggPD0gcGFyYW1zLnNpemUoKTsgKytwX2l4KSB7CisgICAgICAgIEMyUGFyYW0gKnAgPSBudWxscHRyOworICAgICAgICBDMlBhcmFtOjpJbmRleCBwYXJhbUl4ID0gMHU7CisgICAgICAgIHNpemVfdCBwYXJhbURlcEl4ID0gU0laRV9NQVg7CisgICAgICAgIGJvb2wgbGFzdCA9IHBfaXggPT0gcGFyYW1zLnNpemUoKTsKKyAgICAgICAgaWYgKCFsYXN0KSB7CisgICAgICAgICAgICBwID0gcGFyYW1zW3BfaXhdOworICAgICAgICAgICAgaWYgKCEqcCkgeworICAgICAgICAgICAgICAgIHBhcmFtV2FzSW52YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJhbUl4ID0gcC0+aW5kZXgoKTsKKyAgICAgICAgICAgIHBhcmFtRGVwSXggPSBnZXREZXBlbmRlbmN5SW5kZXhfbChwYXJhbUl4KTsKKyAgICAgICAgICAgIGlmIChwYXJhbURlcEl4ID09IFNJWkVfTUFYKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBmaXJzdCBpbnNlcnQgLSBtYXJrIG5vdCBkaXJ0eQorICAgICAgICAgICAgLy8gaXQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgZGlydHkgYnkgYSBkZXBlbmRlbmN5IHVwZGF0ZQorICAgICAgICAgICAgLy8gdGhpcyBkb2VzIG5vdCBvdmVycndyaXRlKCEpCisgICAgICAgICAgICAodm9pZClkZXBlbmRlbmNpZXMuaW5zZXJ0KHsgcGFyYW1EZXBJeCwgeyBwYXJhbUl4LCBmYWxzZSAvKiBkaXJ0eSAqLyB9fSk7CisgICAgICAgICAgICBhdXRvIGl0ID0gZGVwZW5kZW5jaWVzLmZpbmQocGFyYW1EZXBJeCk7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm1hcmtpbmcgZGVwZW5kZW5jeSBmb3Igc2V0dGluZyBhdCAjIiA8PCBwYXJhbURlcEl4IDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgaXQtPnNlY29uZC5maXJzdCA8PCAiLCB1cGRhdGUgIgorICAgICAgICAgICAgICAgICAgICA8PCAoaXQtPnNlY29uZC5zZWNvbmQgPyAiYWx3YXlzIChkaXJ0eSkiIDogIm9ubHkgaWYgY2hhbmdlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcHJvY2VzcyBhbnkgcmVtYWluaW5nIGRlcGVuZGVuY2llcworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImhhbmRsaW5nIGRpcnR5IGRvd24gZGVwZW5kZW5jaWVzIGFmdGVyIGxhc3Qgc2V0dGluZyI7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIGFueSBkaXJ0aWVkIGRvd24tZGVwZW5kZW5jaWVzIHVudGlsIHRoZSBuZXh0IHBhcmFtCisgICAgICAgIHdoaWxlIChkZXBlbmRlbmNpZXMuc2l6ZSgpICYmIGRlcGVuZGVuY2llcy5iZWdpbigpLT5maXJzdCA8PSBwYXJhbURlcEl4KSB7CisgICAgICAgICAgICBhdXRvIG1pbiA9IGRlcGVuZGVuY2llcy5iZWdpbigpOworICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXggaXggPSBtaW4tPnNlY29uZC5maXJzdDsKKyAgICAgICAgICAgIGJvb2wgZGlydHkgPSBtaW4tPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICBkZXBlbmRlbmNpZXMuZXJhc2UobWluKTsKKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW0oaXgpOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJvbGQgdmFsdWUgIiA8PCBhc1N0cmluZyhwYXJhbS0+dmFsdWUoKS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoIWxhc3QpIHsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm5ldyB2YWx1ZSAiIDw8IGFzU3RyaW5nKHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsYXN0ICYmICFkaXJ0eSAmJiBpeCA9PSBwYXJhbUl4ICYmICpwYXJhbS0+dmFsdWUoKSA9PSAqcCkgeworICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBpbiB2YWx1ZSAtIGFuZCBkZXBlbmRlbmNpZXMgd2VyZSBub3QgdXBkYXRlZAorICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlCisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJpZ25vcmluZyBzZXR0aW5nIHVuY2hhbmdlZCBwYXJhbSAiIDw8IGl4OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhcHBseSBzZXR0aW5nCisgICAgICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAic2V0dGluZyBwYXJhbSAiIDw8IGl4OworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG9sZFZhbHVlID0gcGFyYW0tPnZhbHVlKCk7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBwYXJhbS0+dHJ5U2V0KAorICAgICAgICAgICAgICAgICAgICAoIWxhc3QgJiYgcGFyYW1JeCA9PSBpeCkgPyBwIDogcGFyYW0tPnZhbHVlKCkuZ2V0KCksIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAmY2hhbmdlZCwgKl9tRmFjdG9yeSwgZmFpbHVyZXMpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG5ld1ZhbHVlID0gcGFyYW0tPnZhbHVlKCk7CisgICAgICAgICAgICBDMl9DSEVDS19FUShvbGRWYWx1ZSA9PSBuZXdWYWx1ZSwgKm9sZFZhbHVlID09ICpuZXdWYWx1ZSk7CisgICAgICAgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICAgICAgICAgIGNhc2UgQzJfT0s6IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQkFEX1ZBTFVFOiBwYXJhbUJhZFZhbHVlID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9OT19NRU1PUlk6IHBhcmFtTm9NZW1vcnkgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX1RJTUVEX09VVDogcGFyYW1UaW1lZE91dCA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQkxPQ0tJTkc6ICBwYXJhbUJsb2NraW5nID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9DT1JSVVBURUQ6IHBhcmFtQ29ycnVwdGVkID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogOy8vIFRPRE8gZmF0YWwKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSBiYWNrIHJlc3VsdCBmb3IgY29uZmlndXJlZCB2YWx1ZXMgKG9yIGludmFsaWRhdGUgaWYgaXQgZG9lcyBub3QgZml0IG9yIG1hdGNoKQorICAgICAgICAgICAgaWYgKHVwZGF0ZVBhcmFtcyAmJiAhbGFzdCAmJiBwYXJhbUl4ID09IGl4KSB7CisgICAgICAgICAgICAgICAgaWYgKCFwLT51cGRhdGVGcm9tKCpwYXJhbS0+dmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29tcGFyZSBwdHJzIGFzIHBhcmFtcyBhcmUgY29weSBvbiB3cml0ZQorICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInBhcmFtICIgPDwgaXggPDwgIiB2YWx1ZSBjaGFuZ2VkIjsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBjaGFuZ2VkIHVwZGF0ZSBkb3duLWRlcGVuZGVuY2llcyBhbmQgbWFyayB0aGVtIGRpcnR5CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCBpeCA6IHBhcmFtLT5nZXREb3duRGVwZW5kZW5jaWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IDE7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaW5zZXJ0X3JlcyA9IGRlcGVuZGVuY2llcy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnZXREZXBlbmRlbmN5SW5kZXhfbChpeCksIHsgaXgsIHRydWUgLyogZGlydHkgKi8gfX0pOworICAgICAgICAgICAgICAgICAgICBpZiAoIWluc2VydF9yZXMuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKmluc2VydF9yZXMuZmlyc3QpLnNlY29uZC5zZWNvbmQgPSB0cnVlOyAvLyBtYXJrIGRpcnR5CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gZGVwZW5kZW5jaWVzLmZpbmQoZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgQzJfQ0hFQ0soaXQtPnNlY29uZC5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm1hcmtpbmcgZG93biBkZXBlbmRlbmNpZXMgdG8gdXBkYXRlIGF0ICMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpIDw8ICI6ICIgPDwgaXQtPnNlY29uZC5maXJzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHBhcmFtQ29ycnVwdGVkID8gQzJfQ09SUlVQVEVEIDoKKyAgICAgICAgICAgIHBhcmFtQmxvY2tpbmcgPyBDMl9CTE9DS0lORyA6CisgICAgICAgICAgICBwYXJhbVRpbWVkT3V0ID8gQzJfVElNRURfT1VUIDoKKyAgICAgICAgICAgIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICAgKHBhcmFtQmFkVmFsdWUgfHwgcGFyYW1XYXNJbnZhbGlkKSA/IEMyX0JBRF9WQUxVRSA6CisgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDogQzJfT0spOworfQorCitzaXplX3QgQzJJbnRlcmZhY2VIZWxwZXI6OmdldERlcGVuZGVuY3lJbmRleF9sKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgcmV0dXJuIF9tRmFjdG9yeS0+Z2V0RGVwZW5kZW5jeUluZGV4KGl4KTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2sgX191bnVzZWQgLyogVE9ETyAqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgYm9vbCBwYXJhbVdhc0ludmFsaWQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm90Rm91bmQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtRGlkTm90Rml0ID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbU5vTWVtb3J5ID0gZmFsc2U7CisKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHAgOiBzdGFja1BhcmFtcykgeworICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICBwYXJhbVdhc0ludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlID0gX21GYWN0b3J5LT5nZXRQYXJhbVZhbHVlKHAtPmluZGV4KCkpOworICAgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXAtPnVwZGF0ZUZyb20oKnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtRGlkTm90Rml0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGl4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUgPSBfbUZhY3RvcnktPmdldFBhcmFtVmFsdWUoaXgpOworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwID0gQzJQYXJhbTo6Q29weSgqdmFsdWUpOworICAgICAgICAgICAgaWYgKHAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPnB1c2hfYmFjayhzdGQ6Om1vdmUocCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbU5vTWVtb3J5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDoKKyAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIG5vdCBtYXJrZWQgaW4gdGhlIHJldHVybiB2YWx1ZQorICAgICAgICAgICBwYXJhbURpZE5vdEZpdCA/IEMyX09LIDoKKyAgICAgICAgICAgcGFyYW1XYXNJbnZhbGlkID8gQzJfT0sgOiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICByZXR1cm4gX21GYWN0b3J5LT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworfQorCisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrIF9fdW51c2VkKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBmb3IgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBmaWVsZHMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJxdWVyeWluZyBmaWVsZCAiIDw8IHF1ZXJ5LmZpZWxkKCk7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGl4ID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KHF1ZXJ5LmZpZWxkKCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtID0gX21GYWN0b3J5LT5nZXRQYXJhbShpeCk7CisgICAgICAgIGlmICghcGFyYW0pIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiYmFkIHBhcmFtIjsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBvZmZzID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICBtUmVmbGVjdG9yLCBpeCwKKyAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KHF1ZXJ5LmZpZWxkKCkpIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgaWYgKH5vZmZzID09IDApIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiZmllbGQgY291bGQgbm90IGJlIGZvdW5kIjsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG9mZnMgKz0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImZpZWxkIHJlc29sdmVkIHRvICIKKyAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIkAlMDJ6eCslMDJ4Iiwgb2ZmcywgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUocXVlcnkuZmllbGQoKSkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpZWxkID0KKyAgICAgICAgICAgIHBhcmFtLT5maW5kRmllbGQob2ZmcywgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUocXVlcnkuZmllbGQoKSkpOworICAgICAgICBpZiAoIWZpZWxkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBmaWVsZCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKnZhbHVlcyA9IG51bGxwdHI7CisgICAgICAgIHN3aXRjaCAocXVlcnkudHlwZSgpKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UOgorICAgICAgICAgICAgdmFsdWVzID0gZmllbGQtPmdldFN1cHBvcnRlZFZhbHVlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRToKKyAgICAgICAgICAgIHZhbHVlcyA9IGZpZWxkLT5nZXRQb3NzaWJsZVZhbHVlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBxdWVyeSB0eXBlOiAiIDw8IHF1ZXJ5LnR5cGUoKTsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVzKSB7CisgICAgICAgICAgICBxdWVyeS52YWx1ZXMgPSAqdmFsdWVzOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfT0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDMl9MT0coREVCVUcpIDw8ICJubyB2YWx1ZXMgcHVibGlzaGVkIGJ5IGNvbXBvbmVudCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IEMySW50ZXJmYWNlSGVscGVyOjpsb2NrKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+KG1NdXRleCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWVjOTExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcApAQCAtMCwwICsxLDEyOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXBhcmFtZXRlciIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YWx1ZSIKKworI2RlZmluZSBDMl9MT0dfVkVSQk9TRQorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSk7CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU3VwcG9ydGVkUmFuZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3Igc3VwcG9ydGVkIHZhbHVlcyByYW5nZSBjYWxjdWxhdGlvbnMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRlA9c3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWU+CitzdHJ1Y3QgX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlciB7CisgICAgLyoqCisgICAgICogdHlwZSBvZiByYW5nZSBzaXplOiBhIC0gYiBpZiBhID49IGIgYW5kIGEgYW5kIGIgYXJlIG9mIHR5cGUgVAorICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPFQ+Ojp0eXBlIERpZmZUeXBlOworCisgICAgLyoqCisgICAgICogY2FsY3VsYXRlIChoaWdoIC0gbG93KSBtb2Qgc3RlcAorICAgICAqLworICAgIHN0YXRpYyBEaWZmVHlwZSBtb2QoVCBsb3csIFQgaGlnaCwgVCBzdGVwKSB7CisgICAgICAgIHJldHVybiBEaWZmVHlwZShoaWdoIC0gbG93KSAlIERpZmZUeXBlKHN0ZXApOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlcjxULCB0cnVlPiB7CisgICAgdHlwZWRlZiBUIERpZmZUeXBlOworCisgICAgc3RhdGljIERpZmZUeXBlIG1vZChUIGxvdywgVCBoaWdoLCBUIHN0ZXApIHsKKyAgICAgICAgcmV0dXJuIGZtb2QoaGlnaCAtIGxvdywgc3RlcCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkUmFuZ2U8VD46OkMyU3VwcG9ydGVkUmFuZ2UoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKSB7CisgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFKSB7CisgICAgICAgIF9tTWluID0gdmFsdWVzLnJhbmdlLm1pbi5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICBfbU1heCA9IHZhbHVlcy5yYW5nZS5tYXgucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21TdGVwID0gdmFsdWVzLnJhbmdlLnN0ZXAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21OdW0gPSB2YWx1ZXMucmFuZ2UubnVtLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tRGVub20gPSB2YWx1ZXMucmFuZ2UuZGVub20ucmVmPFZhbHVlVHlwZT4oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfbU1pbiA9IE1BWF9WQUxVRTsKKyAgICAgICAgX21NYXggPSBNSU5fVkFMVUU7CisgICAgICAgIF9tU3RlcCA9IE1JTl9TVEVQOworICAgICAgICBfbU51bSA9IDA7CisgICAgICAgIF9tRGVub20gPSAwOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIC8vIHZhbHVlIG11c3QgZmFsbCBiZXR3ZWVuIG1pbiBhbmQgbWF4CisgICAgaWYgKHZhbHVlIDwgX21NaW4gfHwgdmFsdWUgPiBfbU1heCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHNpbXBsZSByYW5nZXMgY29udGFpbiBhbGwgdmFsdWVzIGJldHdlZW4gbWluIGFuZCBtYXgKKyAgICBpZiAoaXNTaW1wbGVSYW5nZSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBtaW4gaXMgYWx3YXlzIHBhcnQgb2YgdGhlIHJhbmdlCisgICAgaWYgKHZhbHVlID09IF9tTWluKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBzdGVwcGVkIHJhbmdlcyByZXF1aXJlICh2YWwgLSBtaW4pICUgc3RlcCB0byBiZSB6ZXJvCisgICAgaWYgKGlzQXJpdGhtZXRpY1NlcmllcygpKSB7CisgICAgICAgIHJldHVybiBfQzJUeXBlZFN1cHBvcnRlZFJhbmdlSGVscGVyPFQ+Ojptb2QoX21NaW4sIHZhbHVlLCBfbVN0ZXApID09IDA7CisgICAgfQorICAgIC8vIHB1cmUgZ2VvbWV0cmljIHNlcmllcyByZXF1aXJlICh2YWwgLyBtaW4pIHRvIGJlIGludGVnZXIgbXVsdGlwbGUgb2YgKG51bS9kZW5vbSkKKyAgICBpZiAoaXNHZW9tZXRyaWNTZXJpZXMoKSkgeworICAgICAgICBpZiAodmFsdWUgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBsb2cyYmFzZSA9IGxvZzIoX21OdW0gLyBfbURlbm9tKTsKKyAgICAgICAgZG91YmxlIHBvd2VyID0gbGxyb3VuZChsb2cyKHZhbHVlIC8gZG91YmxlKF9tTWluKSkgLyBsb2cyYmFzZSk7CisgICAgICAgIC8vIFRPRE86IHZhbGlkYXRlIHRoYXQgcmVzdWx0IGZhbGxzIHdpdGhpbiBwcmVjaXNpb24gKG90aGVyIHRoYW4gcm91bmQpCisgICAgICAgIHJldHVybiB2YWx1ZSA9PSBUKF9tTWluICogcG93KF9tTnVtIC8gX21EZW5vbSwgcG93ZXIpICsgTUlOX1NURVAgLyAyKTsKKyAgICB9CisgICAgLy8gbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMgcmVxdWlyZSB2YWxpZGF0aW5nIGJ5IHdhbGtpbmcgdGhyb3VnaCB0aGUgc2VyaWVzCisgICAgaWYgKGlzTWFjU2VyaWVzKCkpIHsKKyAgICAgICAgZG91YmxlIGxhc3RWYWx1ZSA9IF9tTWluOworICAgICAgICBkb3VibGUgYmFzZSA9IF9tTnVtIC8gX21EZW5vbTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY2FzdCBpcyBzYWZlIGFzIF9tTWluIDw9IGxhc3RWYWx1ZSA8PSBfbU1heAorICAgICAgICAgICAgaWYgKFQobGFzdFZhbHVlICsgTUlOX1NURVAgLyAyKSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIG5leHRWYWx1ZSA9IGZtYShsYXN0VmFsdWUsIGJhc2UsIF9tU3RlcCk7CisgICAgICAgICAgICBpZiAobmV4dFZhbHVlIDw9IGxhc3RWYWx1ZSB8fCBuZXh0VmFsdWUgPiBfbU1heCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gc2VyaWVzIGlzIG5vIGxvbmdlciBtb25vdG9uaWMgb3Igd2l0aGluIHJhbmdlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0VmFsdWUgPSBuZXh0VmFsdWU7CisgICAgICAgIH07CisgICAgfQorICAgIC8vIGlmIHdlIGFyZSBoZXJlLCB0aGlzIG11c3QgYmUgYW4gaW52YWxpZCByYW5nZQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkUmFuZ2U8VD4gQzJTdXBwb3J0ZWRSYW5nZTxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgLy8gVE9ETyAtIHRoaXMgb25seSB3b3JrcyBmb3Igc2ltcGxlIHJhbmdlcworICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKHN0ZDo6bWF4KF9tTWluLCBsaW1pdC5fbU1pbiksIHN0ZDo6bWluKF9tTWF4LCBsaW1pdC5fbU1heCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChfbVN0ZXAsIGxpbWl0Ll9tU3RlcCkpOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU3VwcG9ydGVkRmxhZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCBmbGFnIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KKy8vIGZsb2F0IGZsYWdzIGFyZSBub3Qgc3VwcG9ydGVkLCBidXQgZGVmaW5lIGEgZmV3IG1ldGhvZHMgdG8gc3VwcG9ydCBnZW5lcmljIHN1cHBvcnRlZCB2YWx1ZXMgY29kZQordGVtcGxhdGU8PgorYm9vbCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6Y29udGFpbnMoZmxvYXQgdmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPGZsb2F0PigpOworfQorCit0ZW1wbGF0ZTw+CitDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+ICZsaW1pdCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gdmFsdWVzOworICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8PgorZmxvYXQgQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46Om1pbigpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRGbGFnczxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIC8vIHZhbHVlIG11c3QgY29udGFpbiB0aGUgbWluaW1hbCBtYXNrCisgICAgVCBtaW5NYXNrID0gbWluKCk7CisgICAgaWYgKH52YWx1ZSAmIG1pbk1hc2spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWx1ZSAmPSB+bWluTWFzazsKKyAgICAvLyBvdGhlcndpc2UsIHJlbW92ZSBmbGFncyBmcm9tIHZhbHVlIGFuZCBzZWUgaWYgd2UgYXJyaXZlIGF0IDAKKyAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdiA6IF9tVmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKH52YWx1ZSAmIHYucmVmPFZhbHVlVHlwZT4oKSkgPT0gMCkgeworICAgICAgICAgICAgdmFsdWUgJj0gfnYucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdmFsdWUgPT0gMDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPFQ+IEMyU3VwcG9ydGVkRmxhZ3M8VD46OmZsYWdzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHMoYzJfbWF4KF9tVmFsdWVzLnNpemUoKSwgMXUpIC0gMSk7CisgICAgaWYgKCFfbVZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKF9tVmFsdWVzLmNiZWdpbigpICsgMSwgX21WYWx1ZXMuY2VuZCgpLCB2YWxzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCktPlQgeworICAgICAgICAgICAgcmV0dXJuIHAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIHJldHVybiB2YWxzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRGbGFnczxUPiBDMlN1cHBvcnRlZEZsYWdzPFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIFQgbWluTWFzayA9IG1pbigpIHwgbGltaXQubWluKCk7CisgICAgLy8gbWluaW11bSBtYXNrIG11c3QgYmUgY292ZXJlZCBieSBib3RoIHRoaXMgYW5kIG90aGVyCisgICAgaWYgKGxpbWl0LmNvbnRhaW5zKG1pbk1hc2spICYmIGNvbnRhaW5zKG1pbk1hc2spKSB7CisgICAgICAgIHZhbHVlc1swXSA9IG1pbk1hc2s7CisgICAgICAgIC8vIGtlZXAgb25seSBmbGFncyB0aGF0IGFyZSBjb3ZlcmVkIGJ5IGxpbWl0CisgICAgICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXQsIG1pbk1hc2tdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgICAgICBUIHZhbHVlID0gdi5yZWY8VmFsdWVUeXBlPigpIHwgbWluTWFzazsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBtaW5NYXNrIHx8ICFsaW1pdC5jb250YWlucyh2YWx1ZSk7IH0pOworICAgICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gZG8gaXQgdmljZSB2ZXJzYQorICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdiA6IF9tVmFsdWVzKSB7CisgICAgICAgICAgICBUIHZhbHVlID0gdi5yZWY8VmFsdWVUeXBlPigpIHwgbWluTWFzazsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBtaW5NYXNrICYmIGNvbnRhaW5zKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soKFZhbHVlVHlwZSl2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCBDMlN1cHBvcnRlZEZsYWdzPFQ+OjptaW4oKSBjb25zdCB7CisgICAgaWYgKCFfbVZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBfbVZhbHVlcy5mcm9udCgpLnRlbXBsYXRlIHJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFQoMCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjY0X3Q+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZFZhbHVlU2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgdmFsdWUgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoX21WYWx1ZXMuY2JlZ2luKCksIF9tVmFsdWVzLmNlbmQoKSwKKyAgICAgICAgICAgIFt2YWx1ZV0oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gcC5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICAgICAgfSkgIT0gX21WYWx1ZXMuY2VuZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6dmFsdWVzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHMoX21WYWx1ZXMuc2l6ZSgpKTsKKyAgICBzdGQ6OnRyYW5zZm9ybShfbVZhbHVlcy5jYmVnaW4oKSwgX21WYWx1ZXMuY2VuZCgpLCB2YWxzLmJlZ2luKCksIFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgLT4gVCB7CisgICAgICAgIHJldHVybiBwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSk7CisgICAgcmV0dXJuIHZhbHM7Cit9CisKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDhfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGNoYXI+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDMyX3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGMyX2NudHIzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50NjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ2NF90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyNjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGZsb2F0PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsIHsKKyAgICBJbXBsKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykKKyAgICAgICAgOiBfbVR5cGUodmFsdWVzLnR5cGUpLAorICAgICAgICAgIF9tUmFuZ2UodmFsdWVzKSwKKyAgICAgICAgICBfbVZhbHVlcyh2YWx1ZXMpLAorICAgICAgICAgIF9tRmxhZ3ModmFsdWVzKSB7IH0KKworICAgIGJvb2wgc3VwcG9ydHMoVCB2YWx1ZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdCBfbVR5cGU7CisgICAgQzJTdXBwb3J0ZWRSYW5nZTxWYWx1ZVR5cGU+IF9tUmFuZ2U7CisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxWYWx1ZVR5cGU+IF9tVmFsdWVzOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbUZsYWdzOworCisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IDxUPihzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsICZpKTsKKy8vICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSW1wbCAmaSk7CisgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW1PdXQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsOjpzdXBwb3J0cyhUIHZhbHVlKSBjb25zdCB7CisgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRTogcmV0dXJuIF9tUmFuZ2UuY29udGFpbnModmFsdWUpOworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzogcmV0dXJuIF9tVmFsdWVzLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUzogcmV0dXJuIF9tRmxhZ3MuY29udGFpbnModmFsdWUpOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsPih2YWx1ZXMpKSB7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46On5DMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKCkgPSBkZWZhdWx0OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpzdXBwb3J0cyhUIHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+c3VwcG9ydHModmFsdWUpOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsIHsKKyAgICBJbXBsKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpCisgICAgICAgIDogX21QYXJhbUZpZWxkKGZpZWxkKSwKKyAgICAgICAgICBfbVR5cGUodHlwZV90OjpSQU5HRSksCisgICAgICAgICAgX21EZWZpbmVkKGZhbHNlKSwKKyAgICAgICAgICBfbVJhbmdlKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkFueSgpKSwKKyAgICAgICAgICBfbVZhbHVlcyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpOb25lKCkpLAorICAgICAgICAgIF9tRmxhZ3MoQzJTdXBwb3J0ZWRGbGFnczxUPjo6Tm9uZSgpKSB7IH0KKworICAgIC8qKgorICAgICAqIEdldCBDMlBhcmFtRmllbGRWYWx1ZXMgZnJvbSB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3QgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgIGNhc2UgdHlwZV90OjpFTVBUWToKKyAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbVZhbHVlcyk7CisgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbVJhbmdlKTsKKyAgICAgICAgY2FzZSB0eXBlX3Q6OkZMQUdTOgorICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQsIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKV9tRmxhZ3MpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVFJFU1BBU1MKKyAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQorICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIERlZmluZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgb2YgdGhpcyBidWlsZGVyLiAqLworICAgIHZvaWQgYW55KCkgeworICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBub25lLiAqLworICAgIHZvaWQgbm9uZSgpIHsKKyAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgX21UeXBlID0gdHlwZV90OjpWQUxVRVM7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHx2YWx1ZXwgYWxvbmUuICovCisgICAgdm9pZCBlcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHt2YWx1ZX0pKTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuICovCisgICAgdm9pZCBsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSB7CisgICAgICAgIGlmICghX21EZWZpbmVkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIk5BLmxpbWl0VG8oIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgIC8vIHNob3J0Y3V0IGZvciBmaXJzdCBsaW1pdCBhcHBsaWVkCisgICAgICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgICAgICAgICAgX21WYWx1ZXMgPSBsaW1pdDsKKyAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6VkFMVUVTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IF9tVmFsdWVzLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlJBTkdFOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gbGltaXQubGltaXRlZFRvKF9tUmFuZ2UpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IGxpbWl0LmxpbWl0ZWRUbyhfbUZsYWdzKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBmbGFncworICAgICAgICB9CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIGZsYWcgc2V0LiAqLworICAgIHZvaWQgbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJOQS5saW1pdFRvKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAvLyBzaG9ydGN1dCBmb3IgZmlyc3QgbGltaXQgYXBwbGllZAorICAgICAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9tRmxhZ3MgPSBsaW1pdDsKKyAgICAgICAgICAgIF9tVHlwZSA9IF9tRmxhZ3MuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6RkxBR1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21GbGFncykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbUZsYWdzID0gX21GbGFncy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tRmxhZ3MuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6RkxBR1M7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbUZsYWdzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJsaW1pdGluZyByYW5nZXMgdG8gZmxhZ3MgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgICAgICAgICAgX21UeXBlID0gdHlwZV90OjpFTVBUWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKTsgLy8gc2hvdWxkIG5vdCBiZSBoZXJlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiTkEubGltaXRUbygiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgLy8gc2hvcnRjdXQgZm9yIGZpcnN0IGxpbWl0IGFwcGxpZWQKKyAgICAgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgICAgICBfbVJhbmdlID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbVJhbmdlLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlJBTkdFOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6VkFMVUVTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJsaW1pdGluZyBmbGFncyB0byByYW5nZXMgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgICAgICAgICAgX21UeXBlID0gdHlwZV90OjpFTVBUWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisgICAgICAgICAgICAgICAgX21SYW5nZSA9IF9tUmFuZ2UubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBDMl9EQ0hFQ0soX21WYWx1ZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVJhbmdlLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlJBTkdFOworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgaW5zdGFudGlhdGUoKSBfX3VudXNlZCB7CisgICAgICAgICh2b2lkKV9tVmFsdWVzLnZhbHVlcygpOyAvLyBpbnN0YW50aWF0ZSBub24tY29uc3QgdmFsdWVzKCkKKyAgICB9CisKKyAgICB2b2lkIGluc3RhbnRpYXRlKCkgY29uc3QgX191bnVzZWQgeworICAgICAgICAodm9pZClfbVZhbHVlcy52YWx1ZXMoKTsgLy8gaW5zdGFudGlhdGUgY29uc3QgdmFsdWVzKCkKKyAgICB9CisKKyAgICB0eXBlZGVmIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdCB0eXBlX3Q7CisKKyAgICBDMlBhcmFtRmllbGQgX21QYXJhbUZpZWxkOworICAgIHR5cGVfdCBfbVR5cGU7CisgICAgYm9vbCBfbURlZmluZWQ7CisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gX21WYWx1ZXM7CisgICAgQzJTdXBwb3J0ZWRGbGFnczxUPiBfbUZsYWdzOworCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6b3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiAoQzJQYXJhbUZpZWxkVmFsdWVzKSgqX21JbXBsLmdldCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZCkKKyAgICA6IF9tSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KGZpZWxkKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjphbnkoKSB7CisgICAgX21JbXBsLT5hbnkoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+Ojpub25lKCkgeworICAgIF9tSW1wbC0+bm9uZSgpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmVxdWFsVG8oVCB2YWx1ZSkgeworICAgIF9tSW1wbC0+ZXF1YWxUbyh2YWx1ZSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvdGhlcikKKyAgICA6IF9tSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KCpvdGhlci5fbUltcGwuZ2V0KCkpKSB7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46Om9wZXJhdG9yPSgKKyAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb3RoZXIpIHsKKyAgICBfbUltcGwgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KCpvdGhlci5fbUltcGwuZ2V0KCkpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46On5DMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKCkgPSBkZWZhdWx0OworCit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTZXR0aW5nUmVzdWx0QnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OkMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoKSA6IF9tQ29uZmxpY3RzKCkgeyB9CisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OkMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpIHsKKyAgICBfbUNvbmZsaWN0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNvbmZsaWN0KSk7Cit9CisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXImIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OndpdGgoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpIHsKKyAgICBfbUNvbmZsaWN0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNvbmZsaWN0KSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OnJldHJpZXZlQ29uZmxpY3RzKCkgeworICAgIHJldHVybiBzdGQ6Om1vdmUoX21Db25mbGljdHMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU2V0dGluZ1Jlc3VsdC9zQnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0MyU2V0dGluZ1Jlc3VsdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpSZWFkT25seShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtKSB7CisgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7IEMyU2V0dGluZ1Jlc3VsdDo6UkVBRF9PTkxZLCB7IHBhcmFtIH0sIHsgfSB9OworfQorCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbUZpZWxkLCBib29sIGlzSW5mbykgeworICAgIHJldHVybiB7IGlzSW5mbyA/IEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19CQURfVkFMVUUgOiBDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRSwKKyAgICAgICAgICAgICB7IHBhcmFtRmllbGQgfSwgeyB9IH07Cit9CisKK0MyU2V0dGluZ1Jlc3VsdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpDb25mbGljdCgKKyAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzICYmcGFyYW1GaWVsZFZhbHVlcywgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciAmY29uZmxpY3RzLCBib29sIGlzSW5mbykgeworICAgIEMyX0NIRUNLKCFjb25mbGljdHMuZW1wdHkoKSk7CisgICAgaWYgKGlzSW5mbykgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0IHsKKyAgICAgICAgICAgIEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19DT05GTElDVCwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShwYXJhbUZpZWxkVmFsdWVzKSwgY29uZmxpY3RzLnJldHJpZXZlQ29uZmxpY3RzKCkKKyAgICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0IHsKKyAgICAgICAgICAgIEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1QsCisgICAgICAgICAgICBzdGQ6Om1vdmUocGFyYW1GaWVsZFZhbHVlcyksIGNvbmZsaWN0cy5yZXRyaWV2ZUNvbmZsaWN0cygpCisgICAgICAgIH07CisgICAgfQorfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6QzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJTZXR0aW5nUmVzdWx0ICYmcmVzdWx0KQorICAgICAgICA6IF9tU3RhdHVzKEMyX0JBRF9WQUxVRSkgeworICAgIF9tUmVzdWx0cy5lbXBsYWNlX2JhY2sobmV3IEMyU2V0dGluZ1Jlc3VsdChzdGQ6Om1vdmUocmVzdWx0KSkpOworfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6cGx1cyhDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmIHJlc3VsdHMpIHsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZyIDogcmVzdWx0cy5fbVJlc3VsdHMpIHsKKyAgICAgICAgX21SZXN1bHRzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocikpOworICAgIH0KKyAgICByZXN1bHRzLl9tUmVzdWx0cy5jbGVhcigpOworICAgIC8vIFRPRE86IG1TdGF0dXMKKyAgICByZXR1cm4gc3RkOjptb3ZlKCp0aGlzKTsKK30KKworYzJfc3RhdHVzX3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OnJldHJpZXZlRmFpbHVyZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZyIDogX21SZXN1bHRzKSB7CisgICAgICAgIGZhaWx1cmVzLT5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHIpKTsKKyAgICB9CisgICAgX21SZXN1bHRzLmNsZWFyKCk7CisgICAgcmV0dXJuIF9tU3RhdHVzOworfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6QzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoYzJfc3RhdHVzX3Qgc3RhdHVzKSA6IF9tU3RhdHVzKHN0YXR1cykgeworICAgIC8vIHN0YXR1cyBtdXN0IGJlIG9uZSBvZiBPSywgQkFEX1NUQVRFLCBUSU1FRF9PVVQgb3IgQ09SUlVQVEVECisgICAgLy8gbWFpbmx5OiBCTE9DS0lORywgQkFEX0lOREVYLCBCQURfVkFMVUUgYW5kIE5PX01FTU9SWSByZXF1aXJlcyBhIHNldHRpbmcgYXR0ZW1wdAorfQorCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMyX0hJREUgQzJGaWVsZFV0aWxzOjpfSW5zcGVjdG9yIHsKKyAgICAvLy8gcmV0dXJucyB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0CisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW5mbzo6SW1wbD4gR2V0SW1wbChjb25zdCBJbmZvICZpbmZvKSB7CisgICAgICAgIHJldHVybiBpbmZvLl9tSW1wbDsKKyAgICB9Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6SW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbCB7CisgICAgQzJGaWVsZERlc2NyaXB0b3IgZmllbGQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IHBhcmVudDsKKyAgICB1aW50MzJfdCBpbmRleDsKKyAgICB1aW50MzJfdCBkZXB0aDsKKyAgICB1aW50MzJfdCBiYXNlRmllbGRPZmZzZXQ7CisgICAgdWludDMyX3QgYXJyYXlPZmZzZXQ7CisgICAgdWludDMyX3QgdXNlZEV4dGVudDsKKworICAgIC8vLyBjcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdCBpbmNsdWRpbmcgY29waWVzIG9mIGl0cyBwYXJlbnQgY2hhaW4KKyAgICBJbXBsIGNsb25lKCkgY29uc3Q7CisKKyAgICAvLy8gY3JlYXRlcyBhIGNvcHkgb2YgYSBzaGFyZWQgcG9pbnRlciB0byBhbiBvYmplY3QKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEltcGw+IENsb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiAmKTsKKworICAgIEltcGwoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkXywgc3RkOjpzaGFyZWRfcHRyPEltcGw+IHBhcmVudF8sCisgICAgICAgICAgICB1aW50MzJfdCBpbmRleF8sIHVpbnQzMl90IGRlcHRoXywgdWludDMyX3QgYmFzZUZpZWxkT2Zmc2V0XywKKyAgICAgICAgICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0XywgdWludDMyX3QgdXNlZEV4dGVudF8pCisgICAgICAgIDogZmllbGQoZmllbGRfKSwgcGFyZW50KHBhcmVudF8pLCBpbmRleChpbmRleF8pLCBkZXB0aChkZXB0aF8pLAorICAgICAgICAgIGJhc2VGaWVsZE9mZnNldChiYXNlRmllbGRPZmZzZXRfKSwgYXJyYXlPZmZzZXQoYXJyYXlPZmZzZXRfKSwgdXNlZEV4dGVudCh1c2VkRXh0ZW50XykgeyB9Cit9OworCitzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBDMkZpZWxkVXRpbHM6OkluZm86OkltcGw6OkNsb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiAmaW5mbykgeworICAgIGlmIChpbmZvKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGluZm8tPmNsb25lKCkpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbDo6Y2xvbmUoKSBjb25zdCB7CisgICAgSW1wbCByZXMgPSBJbXBsKCp0aGlzKTsKKyAgICByZXMucGFyZW50ID0gQ2xvbmUocmVzLnBhcmVudCk7CisgICAgcmV0dXJuIHJlczsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvOjpJbmZvKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogX21JbXBsKGltcGwpIHsgfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjphcnJheU9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5hcnJheU9mZnNldDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YXJyYXlTaXplKCkgY29uc3QgeworICAgIHJldHVybiBleHRlbnQoKSAqIHNpemUoKTsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YmFzZUZpZWxkT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmJhc2VGaWVsZE9mZnNldDsKK307CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmRlcHRoKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmRlcHRoOworfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpleHRlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+dXNlZEV4dGVudDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6aW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+aW5kZXg7Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJbmZvOjppc0FyaXRobWV0aWMoKSBjb25zdCB7CisgICAgc3dpdGNoIChfbUltcGwtPmZpZWxkLnR5cGUoKSkgeworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBDMkZpZWxkVXRpbHM6OkluZm86OmlzRmxleGlibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQuZXh0ZW50KCkgPT0gMDsKK30KKworQzJTdHJpbmcgQzJGaWVsZFV0aWxzOjpJbmZvOjpuYW1lKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLm5hbWUoKTsKK30KKworY29uc3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpOYW1lZFZhbHVlc1R5cGUgJkMyRmllbGRVdGlsczo6SW5mbzo6bmFtZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQubmFtZWRWYWx1ZXMoKTsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6b2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KF9tSW1wbC0+ZmllbGQpOworfQorCitDMkZpZWxkVXRpbHM6OkluZm8gQzJGaWVsZFV0aWxzOjpJbmZvOjpwYXJlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8oX21JbXBsLT5wYXJlbnQpOworfTsKKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoX21JbXBsLT5maWVsZCk7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6dHlwZV90IEMyRmllbGRVdGlsczo6SW5mbzo6dHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5maWVsZC50eXBlKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpJdGVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwgOiBwdWJsaWMgX0MyUGFyYW1JbnNwZWN0b3IgeworICAgIEltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworCisgICAgLy8vIGltcGxlbWVudHMgb2JqZWN0IGVxdWFsaXR5CisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlciAhPSBudWxscHRyICYmIG1IZWFkID09IG90aGVyLT5tSGVhZDsKKyAgICB9OworCisgICAgLy8vIHJldHVybnMgdGhlIGluZm8gcG9pbnRlZCB0byBieSB0aGlzIGl0ZXJhdG9yCisgICAgdmlydHVhbCB2YWx1ZV90eXBlIGdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEluZm8obUhlYWQpOworICAgIH0KKworICAgIC8vLyBpbmNyZW1lbnRzIHRoaXMgaXRlcmF0b3IKKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgeworICAgICAgICAvLyBub3RlOiB0aGlzIGNhbm5vdCBiZSBhYnN0cmFjdCBhcyB3ZSBpbnN0YW50aWF0ZSB0aGlzIGZvciBMaXN0OjplbmQoKS4gaW5jcmVtZW50IHRvIGVuZCgpCisgICAgICAgIC8vIGluc3RlYWQuCisgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgSW1wbChzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBoZWFkKQorICAgICAgICA6IG1IZWFkKGhlYWQpIHsgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEluZm86OkltcGw+IG1IZWFkOyAvLy88IGN1cnJlbnQgZmllbGQKK307CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3I6Okl0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeyB9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3I6OnZhbHVlX3R5cGUgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0KCk7Cit9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3ImIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7CisgICAgbUltcGwtPmluY3JlbWVudCgpOworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXF1YWxzKG90aGVyLm1JbXBsKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6Okxpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6Okxpc3Q6OkltcGwgeworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEl0ZXJhdG9yOjpJbXBsPiBiZWdpbigpIGNvbnN0ID0gMDsKKworICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJdGVyYXRvcjo6SW1wbD4gZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxJdGVyYXRvcjo6SW1wbD4oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworfTsKKworQzJGaWVsZFV0aWxzOjpMaXN0OjpMaXN0KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeyB9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3IgQzJGaWVsZFV0aWxzOjpMaXN0OjpiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJGaWVsZFV0aWxzOjpJdGVyYXRvcihtSW1wbC0+YmVnaW4oKSk7Cit9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3IgQzJGaWVsZFV0aWxzOjpMaXN0OjplbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6SXRlcmF0b3IobUltcGwtPmVuZCgpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZUZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogSXRlcmF0b3IgYmFzZSBjbGFzcyBoZWxwZXIgdGhhdCBhbGxvd3MgZGVzY2VuZGluZyBpbnRvIHRoZSBmaWVsZCBoaWVyYXJjaHkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlciA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIHsKKyAgICB2aXJ0dWFsIH5DMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vLyByZXR1cm5zIHRoZSBiYXNlLWZpZWxkJ3Mgb2Zmc2V0IG9mIHRoZSBwYXJlbnQgZmllbGQgKG9yIHRoZSBwYXJhbSBvZmZzZXQgaWYgbm8gcGFyZW50KQorICAgIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gcGFyZW50KSB7CisgICAgICAgIHJldHVybiBwYXJlbnQgPT0gbnVsbHB0ciA/IHNpemVvZihDMlBhcmFtKSA6IHBhcmVudC0+YmFzZUZpZWxkT2Zmc2V0OworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIHBhcmVudCBmaWVsZCAob3IgdGhlIHBhcmFtKQorICAgIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgR2V0UGFyZW50T2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHBhcmVudCkgeworICAgICAgICByZXR1cm4gcGFyZW50ID09IG51bGxwdHIgPyBzaXplb2YoQzJQYXJhbSkgOiBHZXRPZmZzZXQocGFyZW50LT5maWVsZCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yLAorICAgICAgICAgICAgdWludDMyX3QgcGFyYW1TaXplLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gaGVhZCA9IG51bGxwdHIpCisgICAgICAgIDogQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbChoZWFkKSwKKyAgICAgICAgICBtUGFyYW1TaXplKHBhcmFtU2l6ZSksCisgICAgICAgICAgbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgLy8vIHJldHVybnMgYSBsZWFmIGluZm8gb2JqZWN0IGF0IGEgc3BlY2lmaWMgaW5kZXggZm9yIGEgY2hpbGQgZmllbGQKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBtYWtlTGVhZigKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZCwgdWludDMyX3QgaW5kZXgpIHsKKyAgICAgICAgdWludDMyX3QgcGFyZW50T2Zmc2V0ID0gR2V0UGFyZW50T2Zmc2V0KG1IZWFkKTsKKyAgICAgICAgdWludDMyX3QgYXJyYXlPZmZzZXQgPSBwYXJlbnRPZmZzZXQgKyBHZXRPZmZzZXQoZmllbGQpOworICAgICAgICB1aW50MzJfdCB1c2VkRXh0ZW50ID0gZmllbGQuZXh0ZW50KCkgPyA6CisgICAgICAgICAgICAgICAgKHN0ZDo6bWF4KGFycmF5T2Zmc2V0LCBtUGFyYW1TaXplKSAtIGFycmF5T2Zmc2V0KSAvIEdldFNpemUoZmllbGQpOworCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4oCisgICAgICAgICAgICAgICAgT2Zmc2V0RmllbGREZXNjcmlwdG9yKGZpZWxkLCBwYXJlbnRPZmZzZXQgKyBpbmRleCAqIEdldFNpemUoZmllbGQpKSwKKyAgICAgICAgICAgICAgICBtSGVhZCAvKiBwYXJlbnQgKi8sIGluZGV4LCBtSGVhZCA9PSBudWxscHRyID8gMCA6IG1IZWFkLT5kZXB0aCArIDEsCisgICAgICAgICAgICAgICAgR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KG1IZWFkKSArIEdldE9mZnNldChmaWVsZCksCisgICAgICAgICAgICAgICAgYXJyYXlPZmZzZXQsIHVzZWRFeHRlbnQpOworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBzdHJ1Y3QgaW5kZXggaGF2ZSBiZWVuIHRyYXZlcnNlZCB0byBnZXQgdG8gdGhpcyBmaWVsZAorICAgIGJvb2wgdmlzaXRlZChDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc2QgOiBtSGlzdG9yeSkgeworICAgICAgICAgICAgaWYgKHNkLT5jb3JlSW5kZXgoKSA9PSBpbmRleCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtUGFyYW1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+PiBtSGlzdG9yeTsgLy8gc3RydWN0dXJlIHR5cGVzIHZpc2l0ZWQKK307CisKKy8qKgorICogSXRlcmF0b3IgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpIHRoYXQgdmlzaXRzIGVhY2ggYmFzZSBmaWVsZC4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yIDogcHVibGljIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyIHsKKyAgICAvLy8gZW51bWVyYXRlIGJhc2UgZmllbGRzIG9mIGEgcGFyYW1ldGVyCisgICAgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3IoY29uc3QgQzJQYXJhbSAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIocmVmbGVjdG9yLCBwYXJhbS5zaXplKCkpIHsKKyAgICAgICAgZGVzY2VuZEludG8ocGFyYW0uY29yZUluZGV4KCkpOworICAgIH0KKworICAgIC8vLyBlbnVtZXJhdGUgYmFzZSBmaWVsZHMgb2YgYSBmaWVsZAorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcj4gaW1wbCkKKyAgICAgICAgOiBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcihpbXBsLT5tUmVmbGVjdG9yLCBpbXBsLT5tUGFyYW1TaXplLCBpbXBsLT5tSGVhZCkgeworICAgICAgICBtSGlzdG9yeSA9IGltcGwtPm1IaXN0b3J5OworICAgICAgICBpZiAobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0geyBtSGVhZC0+ZmllbGQudHlwZSgpICZ+QzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHIH07CisgICAgICAgICAgICBpZiAoIXZpc2l0ZWQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgZGVzY2VuZEludG8oaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gSW5jcmVtZW50cyB0aGlzIGl0ZXJhdG9yIGJ5IHZpc2l0aW5nIGVhY2ggYmFzZSBmaWVsZC4KKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBkb24ndCBnbyBwYXN0IGVuZAorICAgICAgICBpZiAobUhlYWQgPT0gbnVsbHB0ciB8fCBfbUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXNjZW5kIGludG8gc3RydWN0dXJlcworICAgICAgICBpZiAobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0geyBtSGVhZC0+ZmllbGQudHlwZSgpICZ+QzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHIH07CisgICAgICAgICAgICAvLyBkbyBub3QgcmVjdXJzZSBpbnRvIHRoZSBzYW1lIHN0cnVjdHMKKyAgICAgICAgICAgIGlmICghdmlzaXRlZChpbmRleCkgJiYgZGVzY2VuZEludG8oaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYXNjZW5kIGFmdGVyIHRoZSBsYXN0IGZpZWxkIGluIHRoZSBjdXJyZW50IHN0cnVjdAorICAgICAgICB3aGlsZSAoIW1IaXN0b3J5LmVtcHR5KCkgJiYgX21GaWVsZHMuYmFjaygpID09IG1IaXN0b3J5LmJhY2soKS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIG1IZWFkID0gbUhlYWQtPnBhcmVudDsKKyAgICAgICAgICAgIG1IaXN0b3J5LnBvcF9iYWNrKCk7CisgICAgICAgICAgICBfbUZpZWxkcy5wb3BfYmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZG9uZSBpZiBoaXN0b3J5IGlzIG5vdyBlbXB0eQorICAgICAgICBpZiAoX21GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gd2UgY291bGQgYmUgdHJhdmVyc2luZyBhIHN1Yi10cmVlIHNvIGNsZWFyIGhlYWQKKyAgICAgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXh0IGZpZWxkIGluIHRoZSBjdXJyZW50IHN0cnVjdAorICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yIG5leHQgPSBfbUZpZWxkcy5iYWNrKCk7CisgICAgICAgIG1IZWFkLT5maWVsZCA9IE9mZnNldEZpZWxkRGVzY3JpcHRvcigqbmV4dCwgR2V0UGFyZW50T2Zmc2V0KG1IZWFkLT5wYXJlbnQpKTsKKyAgICAgICAgbUhlYWQtPmluZGV4ID0gMDsgLy8gcmVzZXQgaW5kZXgganVzdCBpbiBjYXNlIGZvciBjb3JyZWN0bmVzcworICAgICAgICBtSGVhZC0+YmFzZUZpZWxkT2Zmc2V0ID0gR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KG1IZWFkLT5wYXJlbnQpICsgR2V0T2Zmc2V0KCpuZXh0KTsKKyAgICAgICAgbUhlYWQtPmFycmF5T2Zmc2V0ID0gR2V0T2Zmc2V0KG1IZWFkLT5maWVsZCk7CisgICAgICAgIG1IZWFkLT51c2VkRXh0ZW50ID0gbUhlYWQtPmZpZWxkLmV4dGVudCgpID8gOgorICAgICAgICAgICAgICAgIChzdGQ6Om1heChtSGVhZC0+YXJyYXlPZmZzZXQsIG1QYXJhbVNpemUpIC0gbUhlYWQtPmFycmF5T2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyBHZXRTaXplKG1IZWFkLT5maWVsZCk7CisgICAgICAgICsrX21GaWVsZHMuYmFjaygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gSWYgdGhlIGN1cnJlbnQgZmllbGQgaXMgYSBrbm93biwgdmFsaWQgKHVudHJhdmVyc2VkKSBzdHJ1Y3R1cmUsIGl0IG1vZGlmaWVzIHRoaXMgaXRlcmF0b3IKKyAgICAvLy8gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgdHJ1ZS4gT3RoZXJ3aXNlLCBpdCBkb2VzIG5vdAorICAgIC8vLyBtb2RpZnkgdGhpcyBpdGVyYXRvciBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIGRlc2NlbmRJbnRvKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjVW5pcXVlID0gbVJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgICAgICAvLyBkZXNjZW5kIGludG8ga25vd24gc3RydWN0cyAoYXMgbG9uZyBhcyB0aGV5IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkKQorICAgICAgICBpZiAoZGVzY1VuaXF1ZSAmJiBkZXNjVW5pcXVlLT5iZWdpbigpICE9IGRlc2NVbmlxdWUtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjKHN0ZDo6bW92ZShkZXNjVW5pcXVlKSk7CisgICAgICAgICAgICBtSGlzdG9yeS5lbXBsYWNlX2JhY2soZGVzYyk7CisgICAgICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yIGZpcnN0ID0gZGVzYy0+YmVnaW4oKTsKKyAgICAgICAgICAgIG1IZWFkID0gbWFrZUxlYWYoKmZpcnN0LCAwIC8qIGluZGV4ICovKTsKKyAgICAgICAgICAgIF9tRmllbGRzLmVtcGxhY2VfYmFjaygrK2ZpcnN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gbmV4dCBmaWVsZCBwb2ludGVycyBmb3IgZWFjaCBkZXB0aC4KKyAgICAvLy8gbm90ZTogX21GaWVsZHMgbWF5IGJlIHNob3J0ZWQgdGhhbiBtSGlzdG9yeSwgaWYgaXRlcmF0aW5nIGF0IGEgZGVwdGgKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yPiBfbUZpZWxkczsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRJdGVyYWJsZSA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okxpc3Q6OkltcGwgeworICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsPiBiZWdpbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3I+KCpfbVBhcmFtLCBfbVJlZmxlY3Rvcik7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkSXRlcmFibGUoY29uc3QgQzJQYXJhbSAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21QYXJhbSgmcGFyYW0pLCBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IEMyUGFyYW0gKl9tUGFyYW07CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworfTsKKworfQorCitDMkZpZWxkVXRpbHM6Okxpc3QgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMoCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okxpc3Qoc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZEl0ZXJhYmxlPihwYXJhbSwgcmVmbGVjdG9yKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjplbnVtZXJhdGUgc2libGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhdG9yIDogcHVibGljIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwgeworICAgIEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiAmaW5mbywgc2l6ZV90IGxldmVsKQorICAgICAgICAgIC8vIGNsb25lIGluZm8gY2hhaW4gYXMgdGhpcyBpdGVyYXRvciB3aWxsIGNoYW5nZSBpdAorICAgICAgICA6IEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwoQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsOjpDbG9uZShpbmZvKSkgeworICAgICAgICBpZiAobGV2ZWwgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3RvcmUgcGFyZW50IGNoYWluICh1cCB0byBsZXZlbCkgZm9yIHF1aWNrIGFjY2VzcworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBub2RlID0gbUhlYWQ7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoOyBpeCA8IGxldmVsICYmIG5vZGU7ICsraXgpIHsKKyAgICAgICAgICAgIG5vZGUtPmluZGV4ID0gMDsKKyAgICAgICAgICAgIF9tUGF0aC5lbXBsYWNlX2JhY2sobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50OworICAgICAgICB9CisgICAgICAgIHNldHVwUGF0aChpeCk7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8vIEluY3JlbWVudHMgdGhpcyBpdGVyYXRvciBieSB2aXNpdGluZyBlYWNoIGluZGV4LgorICAgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnQoKSBvdmVycmlkZSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIHdoaWxlIChpeCA8IF9tUGF0aC5zaXplKCkpIHsKKyAgICAgICAgICAgIGlmICgrK19tUGF0aFtpeF0tPmluZGV4IDwgX21QYXRoW2l4XS0+dXNlZEV4dGVudCkgeworICAgICAgICAgICAgICAgIHNldHVwUGF0aChpeCArIDEpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9tUGF0aFtpeCsrXS0+aW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vLyBhZGp1c3RzIGZpZWxkIG9mZnNldHMgYWxvbmcgdGhlIHBhdGggdXAgdG8gdGhlIHNwZWNpZmljIGxldmVsIC0gMS4KKyAgICAvLy8gVGhpcyBpbi1mYWN0IGhhcyB0byBiZSBkb25lIGRvd24gdGhlIHBhdGggZnJvbSBwYXJlbnQgdG8gY2hpbGQgYXMgY2hpbGQgZmllbGRzIG11c3QKKyAgICAvLy8gZmFsbCB3aXRoaW4gcGFyZW50IGZpZWxkcy4KKyAgICB2b2lkIHNldHVwUGF0aChzaXplX3QgbGV2ZWwpIHsKKyAgICAgICAgQzJfQ0hFQ0tfTEUobGV2ZWwsIF9tUGF0aC5zaXplKCkpOworICAgICAgICB1aW50MzJfdCBvbGRBcnJheU9mZnNldCA9IGxldmVsID8gX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0IDogMCAvKiB1bnVzZWQgKi87CisgICAgICAgIHdoaWxlIChsZXZlbCkgeworICAgICAgICAgICAgLS1sZXZlbDsKKyAgICAgICAgICAgIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbCAmcGF0aCA9ICpfbVBhdGhbbGV2ZWxdOworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IEdldFNpemUocGF0aC5maWVsZCk7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBwYXRoLmFycmF5T2Zmc2V0ICsgc2l6ZSAqIHBhdGguaW5kZXg7CisgICAgICAgICAgICBTZXRPZmZzZXQocGF0aC5maWVsZCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IGNoaWxkJ3MgYXJyYXkgb2Zmc2V0IHRvIGZhbGwgd2l0aGluIGN1cnJlbnQgaW5kZXgsIGJ1dCBob2xkIG9udG8gdGhlCisgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGFycmF5T2Zmc2V0IHNvIHRoYXQgd2UgY2FuIGFkanVzdCBzdWJzZXF1ZW50IGNoaWxkcmVuLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGUgbW9kdWxvIGlzIG9ubHkgZGVmaW5lZCB3aXRoaW4gdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICAgICAgICAgICAgdWludDMyX3QgY2hpbGRBcnJheU9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIChfbVBhdGhbbGV2ZWwgLSAxXS0+YXJyYXlPZmZzZXQgLSBvbGRBcnJheU9mZnNldCkgJSBzaXplOworICAgICAgICAgICAgICAgIG9sZEFycmF5T2Zmc2V0ID0gX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0OworICAgICAgICAgICAgICAgIF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldCA9IGNoaWxkQXJyYXlPZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPj4gX21QYXRoOworfTsKKworLyoqCisgKiBJdGVyYWJsZSBpbXBsZW1lbnRpbmcgZW51bWVyYXRlRmllbGRzKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmFibGUgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcj4oX21IZWFkLCBfbUxldmVsKTsKKyAgICB9OworCisgICAgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhYmxlKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZmllbGQsIHVpbnQzMl90IGxldmVsKQorICAgICAgICA6IF9tSGVhZChDMkZpZWxkVXRpbHM6Ol9JbnNwZWN0b3I6OkdldEltcGwoZmllbGQpKSwgX21MZXZlbChsZXZlbCkgeyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gX21IZWFkOworICAgIHNpemVfdCBfbUxldmVsOworfTsKKworfQorCitDMkZpZWxkVXRpbHM6Okxpc3QgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVDb3VzaW5zKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZmllbGQsIHVpbnQzMl90IGxldmVsKSB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6TGlzdChzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYWJsZT4oZmllbGQsIGxldmVsKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpsb2NhdGVGaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogSXRlcmF0b3IgaW1wbGVtZW50aW5nIGxvY2F0ZUZpZWxkKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3IgOiBwdWJsaWMgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIgeworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRvcigKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIocmVmbGVjdG9yLCBwYXJhbVNpemUpLAorICAgICAgICAgIF9tRmllbGQoZmllbGQpIHsKKyAgICAgICAgd2hpbGUgKGRlc2NlbmRJbnRvKGluZGV4KSkgeworICAgICAgICAgICAgaWYgKChtSGVhZC0+ZmllbGQudHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCA9IEMyUGFyYW06OkNvcmVJbmRleChtSGVhZC0+ZmllbGQudHlwZSgpICZ+IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVudCgpIHsKKyAgICAgICAgbUhlYWQgPSBfbVRhaWw7CisgICAgICAgIF9tVGFpbCA9IG51bGxwdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vLyBJZiB0aGUgY3VycmVudCBmaWVsZCBpcyBhIGtub3duLCB2YWxpZCAodW50cmF2ZXJzZWQpIHN0cnVjdHVyZSwgaXQgbW9kaWZpZXMgdGhpcyBpdGVyYXRvcgorICAgIC8vLyB0byBwb2ludCB0byB0aGUgZmllbGQgYXQgdGhlIGJlZ2lubmluZy9lbmQgb2YgdGhlIGdpdmVuIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMKKyAgICAvLy8gdHJ1ZS4gT3RoZXJ3aXNlLCBpbmNsdWRpbmcgaWYgbm8gc3VjaCBmaWVsZCBleGlzdHMgaW4gdGhlIHN0cnVjdHVyZSwgaXQgZG9lcyBub3QgbW9kaWZ5IHRoaXMKKyAgICAvLy8gaXRlcmF0b3IgYW5kIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCBkZXNjZW5kSW50byhDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgYm91bmRhcmllcyBvZiB0aGUgZmllbGQgdG8gYmUgbG9jYXRlZCBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVudAorICAgICAgICAvLyBmaWVsZAorICAgICAgICBpZiAobUhlYWQgIT0gX21UYWlsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjVW5pcXVlID0gbVJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgICAgICAvLyBkZXNjZW5kIGludG8ga25vd24gc3RydWN0cyAoYXMgbG9uZyBhcyB0aGV5IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkKQorICAgICAgICBpZiAoZGVzY1VuaXF1ZSAmJiBkZXNjVW5pcXVlLT5iZWdpbigpICE9IGRlc2NVbmlxdWUtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjKHN0ZDo6bW92ZShkZXNjVW5pcXVlKSk7CisgICAgICAgICAgICBtSGlzdG9yeS5lbXBsYWNlX2JhY2soZGVzYyk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmVudE9mZnNldCA9IEdldFBhcmVudE9mZnNldChtSGVhZCk7CisKKyAgICAgICAgICAgIC8vIGxvY2F0ZSBmaWVsZCB1c2luZyBhIGR1bW15IGZpZWxkIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yIGR1bW15ID0geworICAgICAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpCTE9CLCAxIC8qIGV4dGVudCAqLywgIm5hbWUiLAorICAgICAgICAgICAgICAgIEdldE9mZnNldChfbUZpZWxkKSAtIHBhcmVudE9mZnNldCwgR2V0U2l6ZShfbUZpZWxkKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gbG9jYXRlIGZpcnN0IGZpZWxkIHdoZXJlIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gZHVtbXkgb2Zmc2V0ICh3aGljaCBpcyBvbmUgcGFzdCkKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OnVwcGVyX2JvdW5kKAorICAgICAgICAgICAgICAgICAgICBkZXNjLT5jYmVnaW4oKSwgZGVzYy0+Y2VuZCgpLCBkdW1teSwKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmEsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZiKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChhKSA8IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoYik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChpdCA9PSBkZXNjLT5iZWdpbigpKSB7CisgICAgICAgICAgICAgICAgLy8gZmllbGQgaXMgcHJpb3IgdG8gZmlyc3QgZmllbGQKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAtLWl0OworICAgICAgICAgICAgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkID0gKml0OworCisgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGR1bW15IGVuZC1vZmZzZXQgaXMgd2l0aGluIHRoaXMgZmllbGQKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cnVjdFNpemUgPSBzdGQ6Om1heChtUGFyYW1TaXplLCBwYXJlbnRPZmZzZXQpIC0gcGFyZW50T2Zmc2V0OworICAgICAgICAgICAgaWYgKEdldEVuZE9mZnNldChkdW1teSkgPiBHZXRFbmRPZmZzZXQoZmllbGQsIHN0cnVjdFNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4ID0gKEdldE9mZnNldChkdW1teSkgLSBHZXRPZmZzZXQoZmllbGQpKSAvIEdldFNpemUoZmllbGQpOworICAgICAgICAgICAgdWludDMyX3QgZW5kSW5kZXggPQorICAgICAgICAgICAgICAgIChHZXRFbmRPZmZzZXQoZHVtbXkpIC0gR2V0T2Zmc2V0KGZpZWxkKSArIEdldFNpemUoZmllbGQpIC0gMSkgLyBHZXRTaXplKGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChlbmRJbmRleCA+IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBGaWVsZCBzaXplIGNvdWxkIGJlIHplcm8sIGluIHdoaWNoIGNhc2UgZW5kIGluZGV4IGlzIHN0aWxsIG9uIHN0YXJ0IGluZGV4LgorICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGZvciBhbGwgb3RoZXIgY2FzZXMsIGVuZEluZGV4IHdhcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGluZGV4LCBzbworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBpdC4KKyAgICAgICAgICAgICAgICAtLWVuZEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gc3RhcnRMZWFmID0KKyAgICAgICAgICAgICAgICBtYWtlTGVhZihmaWVsZCwgc3RhcnRJbmRleCk7CisgICAgICAgICAgICBpZiAoZW5kSW5kZXggPT0gc3RhcnRJbmRleCkgeworICAgICAgICAgICAgICAgIF9tVGFpbCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgICAgICBtSGVhZCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX21UYWlsID0gbWFrZUxlYWYoZmllbGQsIGVuZEluZGV4KTsKKyAgICAgICAgICAgICAgICBtSGVhZCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBfQzJGaWVsZElkIF9tRmllbGQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gX21UYWlsOworfTsKKworLyoqCisgKiBJdGVyYWJsZSBpbXBsZW1lbnRpbmcgbG9jYXRlRmllbGQoKS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24gOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRvcj4oCisgICAgICAgICAgICAgICAgX21JbmRleCwgX21GaWVsZCwgX21QYXJhbVNpemUsIF9tUmVmbGVjdG9yKTsKKyAgICB9OworCisgICAgQzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21JbmRleChDMlBhcmFtOjpDb3JlSW5kZXgoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KHBmKSkpLAorICAgICAgICAgIF9tRmllbGQoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEZpZWxkKHBmKSksCisgICAgICAgICAgX21QYXJhbVNpemUoMCksCisgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworCisgICAgQzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21JbmRleChwYXJhbS5jb3JlSW5kZXgoKSksCisgICAgICAgICAgX21GaWVsZChmaWVsZCksCisgICAgICAgICAgX21QYXJhbVNpemUocGFyYW0uc2l6ZSgpKSwKKyAgICAgICAgICBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCitwcml2YXRlOgorICAgIEMyUGFyYW06OkNvcmVJbmRleCBfbUluZGV4OworICAgIF9DMkZpZWxkSWQgX21GaWVsZDsKKyAgICB1aW50MzJfdCBfbVBhcmFtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7Cit9OworCit9CisKK3N0ZDo6dmVjdG9yPEMyRmllbGRVdGlsczo6SW5mbz4gQzJGaWVsZFV0aWxzOjpsb2NhdGVGaWVsZCgKKyAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkICZwZiwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBDMkZpZWxkVXRpbHM6Okxpc3QgbG9jYXRpb24gPSB7IHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbj4ocGYsIHJlZmxlY3RvcikgfTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8SW5mbz4obG9jYXRpb24uYmVnaW4oKSwgbG9jYXRpb24uZW5kKCkpOworfQorCitzdGQ6OnZlY3RvcjxDMkZpZWxkVXRpbHM6OkluZm8+IEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQoCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBDMkZpZWxkVXRpbHM6Okxpc3QgbG9jYXRpb24gPSB7CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbj4ocGFyYW0sIGZpZWxkLCByZWZsZWN0b3IpCisgICAgfTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8SW5mbz4obG9jYXRpb24uYmVnaW4oKSwgbG9jYXRpb24uZW5kKCkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1NzNkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJQYXJhbVV0aWxzLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fIC8vIHRvIGJlIGFibGUgdG8gaW1wbGVtZW50IHRoZSBtZXRob2RzIGRlZmluZWQKKyNpbmNsdWRlIDxDMkVudW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctbG9nLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvKiogXGZpbGUKKyAqIFV0aWxpdGllcyBmb3IgcGFyYW1ldGVyIGhhbmRsaW5nIHRvIGJlIHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRJRVMgRk9SIEVOVU1FUkFUSU9OIFJFRkxFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc2l6ZV90IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKEMyU3RyaW5nTGl0ZXJhbCBhKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhW2ldID09ICdfJykgeworICAgICAgICArK2k7CisgICAgfQorICAgIHJldHVybiBpOworfQorCitzdGF0aWMgc2l6ZV90IGNvdW50TWF0Y2hpbmcoQzJTdHJpbmdMaXRlcmFsIGEsIGNvbnN0IEMyU3RyaW5nICZiKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghYVtpXSB8fCBhW2ldICE9IGJbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiLnNpemUoKTsKK30KKworLy8gQUJDRGVmID0+IGFiYy1kZWYKKy8vIEFCQ0QyZWYgPT4gYWJjZDItZWYgLy8gMAorLy8gQUJDRDJFZiA9PiBhbmNkMi1lZiAvLyAtMQorLy8gQWJjRGVmID0+IGFiYy1kZWYgLy8gLTEKKy8vIEFiYzJEZWYgPT4gYWJjLTJkZWYKKy8vIEFiYzJkZWYgPT4gYWJjLTItZGVmCisvLyBfWW8gPT4gX3lvCisvLyBfeW8gPT4gX3lvCisvLyBDMl95byA9PiBjMi15bworLy8gQzJfX3lvID0+IGMyLXlvCisKKy8vc3RhdGljCitDMlN0cmluZyBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKEMyU3RyaW5nIG5hbWUpIHsKKyAgICBlbnVtIHsKKyAgICAgICAga05vbmUgPSAnLicsCisgICAgICAgIGtMb3dlciA9ICdhJywKKyAgICAgICAga1VwcGVyID0gJ0EnLAorICAgICAgICBrRGlnaXQgPSAnMScsCisgICAgICAgIGtEYXNoID0gJy0nLAorICAgICAgICBrVW5kZXJzY29yZSA9ICdfJywKKyAgICB9IHR5cGUgPSBrTm9uZTsKKyAgICBzaXplX3Qgd29yZF9zdGFydCA9IDA7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG5hbWUuc2l6ZSgpOyArK2l4KSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBuYW1lLnN1YnN0cigwLCB3b3JkX3N0YXJ0KSA8PCAifCIKKyAgICAgICAgICAgICAgICA8PCBuYW1lLnN1YnN0cih3b3JkX3N0YXJ0LCBpeCAtIHdvcmRfc3RhcnQpIDw8ICJbIgorICAgICAgICAgICAgICAgIDw8IG5hbWUuc3Vic3RyKGl4LCAxKSA8PCAiXSIgPDwgbmFtZS5zdWJzdHIoaXggKyAxKQorICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgKGNoYXIpdHlwZTsKKyAgICAgICAgaWYgKGlzdXBwZXIobmFtZVtpeF0pKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrTG93ZXIpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrLCAxLCAnLScpOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVbaXhdID0gdG9sb3dlcihuYW1lW2l4XSk7CisgICAgICAgICAgICB0eXBlID0ga1VwcGVyOworICAgICAgICB9IGVsc2UgaWYgKGlzbG93ZXIobmFtZVtpeF0pKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrRGlnaXQgJiYgaXggPiAwKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1VwcGVyICYmIGl4ID4gd29yZF9zdGFydCArIDEpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrIC0gMSwgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IGtMb3dlcjsKKyAgICAgICAgfSBlbHNlIGlmIChpc2RpZ2l0KG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0xvd2VyKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlID0ga0RpZ2l0OworICAgICAgICB9IGVsc2UgaWYgKG5hbWVbaXhdID09ICdfJykgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0Rhc2gpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmVyYXNlKGl4LS0sIDEpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9IGtOb25lICYmIHR5cGUgIT0ga1VuZGVyc2NvcmUpIHsKKyAgICAgICAgICAgICAgICBuYW1lW2l4XSA9ICctJzsKKyAgICAgICAgICAgICAgICB0eXBlID0ga0Rhc2g7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4ICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IGtVbmRlcnNjb3JlOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYW1lLnJlc2l6ZShpeCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICI9PiAiIDw8IG5hbWU7CisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy8vc3RhdGljCitzdGQ6OnZlY3RvcjxDMlN0cmluZz4gX0MyRW51bVV0aWxzOjpzYW5pdGl6ZUVudW1WYWx1ZU5hbWVzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICBDMlN0cmluZ0xpdGVyYWwgX3ByZWZpeCkgeworICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBzYW5pdGl6ZWROYW1lczsKKyAgICBDMlN0cmluZyBwcmVmaXg7CisgICAgc2l6ZV90IGV4dHJhVW5kZXJzY29yZXMgPSAwOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChfcHJlZml4KSB7CisgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhfcHJlZml4KTsKKyAgICAgICAgcHJlZml4ID0gX3ByZWZpeCArIGV4dHJhVW5kZXJzY29yZXM7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicHJlZml4OiIgPDwgcHJlZml4IDw8ICIsIHVuZGVyc2NvcmVzOiIgPDwgZXh0cmFVbmRlcnNjb3JlczsKKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgcHJlZml4IGFuZCBtaW5pbXVtIGxlYWRpbmcgdW5kZXJzY29yZXMKKyAgICBmb3IgKEMyU3RyaW5nTGl0ZXJhbCBzIDogbmFtZXMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IHM7CisgICAgICAgIHNpemVfdCB1bmRlcnNjb3JlcyA9IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKHMpOworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSB1bmRlcnNjb3JlczsKKyAgICAgICAgICAgIHByZWZpeCA9IHMgKyB1bmRlcnNjb3JlczsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgbWF0Y2hpbmcgPSBjb3VudE1hdGNoaW5nKAorICAgICAgICAgICAgICAgIHMgKyB1bmRlcnNjb3JlcywKKyAgICAgICAgICAgICAgICBwcmVmaXgpOworICAgICAgICAgICAgcHJlZml4LnJlc2l6ZShtYXRjaGluZyk7CisgICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gc3RkOjptaW4odW5kZXJzY29yZXMsIGV4dHJhVW5kZXJzY29yZXMpOworICAgICAgICB9CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicHJlZml4OiIgPDwgcHJlZml4IDw8ICIsIHVuZGVyc2NvcmVzOiIgPDwgZXh0cmFVbmRlcnNjb3JlczsKKyAgICAgICAgaWYgKHByZWZpeC5zaXplKCkgPT0gMCAmJiBleHRyYVVuZGVyc2NvcmVzID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2Ugc3dhbGxvdyB0aGUgZmlyc3QgdW5kZXJzY29yZSBhZnRlciB1cHBlciBjYXNlIHByZWZpeGVzCisgICAgYm9vbCB1cHBlckNhc2VQcmVmaXggPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJlZml4LnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChpc2xvd2VyKHByZWZpeFtpXSkpIHsKKyAgICAgICAgICAgIHVwcGVyQ2FzZVByZWZpeCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKEMyU3RyaW5nTGl0ZXJhbCBzIDogbmFtZXMpIHsKKyAgICAgICAgc2l6ZV90IHVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMocyk7CisgICAgICAgIEMyU3RyaW5nIHNhbml0aXplZCA9IEMyU3RyaW5nKHMsIHVuZGVyc2NvcmVzIC0gZXh0cmFVbmRlcnNjb3Jlcyk7CisgICAgICAgIHNhbml0aXplZC5hcHBlbmQocyArIHByZWZpeC5zaXplKCkgKyB1bmRlcnNjb3JlcyArCisgICAgICAgICAgICAgICAgICAgICh1cHBlckNhc2VQcmVmaXggJiYgc1twcmVmaXguc2l6ZSgpICsgdW5kZXJzY29yZXNdID09ICdfJykpOworICAgICAgICBzYW5pdGl6ZWROYW1lcy5wdXNoX2JhY2soY2FtZWxDYXNlVG9EYXNoZWQoc2FuaXRpemVkKSk7CisgICAgfQorCisgICAgZm9yIChDMlN0cmluZyBzIDogc2FuaXRpemVkTmFtZXMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IHM7CisgICAgfQorCisgICAgcmV0dXJuIHNhbml0aXplZE5hbWVzOworfQorCisvL3N0YXRpYworc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IF9DMkVudW1VdGlsczo6cGFyc2VFbnVtVmFsdWVzRnJvbVN0cmluZyhDMlN0cmluZ0xpdGVyYWwgdmFsdWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gZm91bmROYW1lczsKKyAgICBzaXplX3QgcG9zID0gMCwgbGVuID0gc3RybGVuKHZhbHVlKTsKKyAgICBkbyB7CisgICAgICAgIHNpemVfdCBlbmRQb3MgPSBzdHJjc3BuKHZhbHVlICsgcG9zLCAiICw9IikgKyBwb3M7CisgICAgICAgIGlmIChlbmRQb3MgPiBwb3MpIHsKKyAgICAgICAgICAgIGZvdW5kTmFtZXMuZW1wbGFjZV9iYWNrKHZhbHVlICsgcG9zLCBlbmRQb3MgLSBwb3MpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZVtlbmRQb3NdICYmIHZhbHVlW2VuZFBvc10gIT0gJywnKSB7CisgICAgICAgICAgICBlbmRQb3MgKz0gc3RyY3Nwbih2YWx1ZSArIGVuZFBvcywgIiwiKTsKKyAgICAgICAgfQorICAgICAgICBwb3MgPSBzdHJzcG4odmFsdWUgKyBlbmRQb3MsICIgLCIpICsgZW5kUG9zOworICAgIH0gd2hpbGUgKHBvcyA8IGxlbik7CisgICAgcmV0dXJuIGZvdW5kTmFtZXM7Cit9CisKKy8vLyBzYWZlKHIpIHBhcnNpbmcgZnJvbSBwYXJhbWV0ZXIgYmxvYgorLy9zdGF0aWMKK0MyUGFyYW0gKkMyUGFyYW1VdGlsczo6UGFyc2VGaXJzdChjb25zdCB1aW50OF90ICpibG9iLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIF9tU2l6ZSBtdXN0IGZpdCBpbnRvIHNpemUsIGJ1dCByZWFsbHkgQzJQYXJhbSBtdXN0IGFsc28gdG8gYmUgYSB2YWxpZCBwYXJhbQorICAgIGlmIChzaXplIDwgc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBfbVNpemUgbXVzdCBtYXRjaCBsZW5ndGgKKyAgICBDMlBhcmFtICpwYXJhbSA9IChDMlBhcmFtKilibG9iOworICAgIGlmIChwYXJhbS0+c2l6ZSgpID4gc2l6ZSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHBhcmFtOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcAppbmRleCA5ZmM1YTc2Li45ZDE4M2Q0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKQEAgLTE5LDQ4ICsxOSw0NSBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQUFDRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIEFBQ1NvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICAgICAgaW50NjRfdCBmcmFtZV9kdXJhdGlvbl91cyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0Kik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQUNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CiAgICAgaW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwpAQCAtOTIsNyArODksNyBAQAogLy8gVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBBQUMgZnJhbWUgc2l6ZSB3aXRoIHRoZSBBRFRTIGhlYWRlciBsZW5ndGggKHJlZ2FyZGxlc3Mgb2YKIC8vICAgICB0aGUgcHJlc2VuY2Ugb2YgdGhlIENSQykuCiAvLyBJZiBoZWFkZXJTaXplIGlzIG5vbi1OVUxMLCBpdCB3aWxsIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgb2YgdGhpcyBBRFRTIGZyYW1lLgotc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCogaGVhZGVyU2l6ZSkgeworc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90KiBoZWFkZXJTaXplKSB7CiAKICAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhOb0NyYyA9IDc7CiAgICAgY29uc3Qgc2l6ZV90IGtBZHRzSGVhZGVyTGVuZ3RoV2l0aENyYyA9IDk7CkBAIC0xMzMsNyArMTMwLDcgQEAKIH0KIAogQUFDRXh0cmFjdG9yOjpBQUNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtRnJhbWVEdXJhdGlvblVzKDApIHsKQEAgLTE1MSw3ICsxNDgsOSBAQAogICAgIH0KICAgICBjaGFubmVsID0gKGhlYWRlclswXSAmIDB4MSkgPDwgMiB8IChoZWFkZXJbMV0gPj4gNik7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEobU1ldGEsIHByb2ZpbGUsIHNmX2luZGV4LCBjaGFubmVsKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUsIHByb2ZpbGUgKyAxKTsKIAogICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZSwgbnVtRnJhbWVzID0gMDsKICAgICBzaXplX3QgZnJhbWVTaXplID0gMDsKQEAgLTE3NCwyOSArMTczLDMwIEBACiAgICAgICAgIC8vIFJvdW5kIHVwIGFuZCBnZXQgdGhlIGR1cmF0aW9uCiAgICAgICAgIG1GcmFtZUR1cmF0aW9uVXMgPSAoMTAyNCAqIDEwMDAwMDBsbCArIChzciAtIDEpKSAvIHNyOwogICAgICAgICBkdXJhdGlvbiA9IG51bUZyYW1lcyAqIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIEFBQ0V4dHJhY3Rvcjo6fkFBQ0V4dHJhY3RvcigpIHsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQUFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpBQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjA0LDEzICsyMDQsMTIgQEAKICAgICByZXR1cm4gbmV3IEFBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1PZmZzZXRWZWN0b3IsIG1GcmFtZUR1cmF0aW9uVXMpOwogfQogCi1zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTIxOSw4ICsyMTgsOCBAQAogY29uc3Qgc2l6ZV90IEFBQ1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDgxOTI7CiAKIEFBQ1NvdXJjZTo6QUFDU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICBpbnQ2NF90IGZyYW1lX2R1cmF0aW9uX3VzKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKQEAgLTIyOCw3ICsyMjcsNiBAQAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1DdXJyZW50VGltZVVzKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgbU9mZnNldFZlY3RvcihvZmZzZXRfdmVjdG9yKSwKICAgICAgIG1GcmFtZUR1cmF0aW9uVXMoZnJhbWVfZHVyYXRpb25fdXMpIHsKIH0KQEAgLTIzOSw3ICsyMzcsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIGlmIChtT2Zmc2V0VmVjdG9yLmVtcHR5KCkpIHsKQEAgLTI0OSwzMCArMjQ3LDI1IEBACiAgICAgfQogCiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKGtNYXhGcmFtZVNpemUpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTI4Miw3ICsyNzUsNyBAQAogICAgICAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gbUZyYW1lRHVyYXRpb25VczsKICAgICAgICAgICAgIGlmIChzZWVrRnJhbWUgPCAwIHx8IHNlZWtGcmFtZSA+PSAoaW50NjRfdCltT2Zmc2V0VmVjdG9yLnNpemUoKSkgewogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzAyMzk1MDciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiBtRnJhbWVEdXJhdGlvblVzOwogCkBAIC0yOTIsMTMgKzI4NSwxMyBAQAogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZSwgZnJhbWVTaXplV2l0aG91dEhlYWRlciwgaGVhZGVyU2l6ZTsKICAgICBpZiAoKGZyYW1lU2l6ZSA9IGdldEFkdHNGcmFtZUxlbmd0aChtRGF0YVNvdXJjZSwgbU9mZnNldCwgJmhlYWRlclNpemUpKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgZnJhbWVTaXplV2l0aG91dEhlYWRlciA9IGZyYW1lU2l6ZSAtIGhlYWRlclNpemU7CkBAIC0zMDcsMzcgKzMwMCwzOSBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplV2l0aG91dEhlYWRlcik7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIG1DdXJyZW50VGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIG1PZmZzZXQgKz0gZnJhbWVTaXplOwogICAgIG1DdXJyZW50VGltZVVzICs9IG1GcmFtZUR1cmF0aW9uVXM7CiAKICAgICAqb3V0ID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqbWV0YSkgewogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKnN0YXRpY19jYXN0PG9mZjY0X3QqPihtZXRhKTsKLSAgICByZXR1cm4gbmV3IEFBQ0V4dHJhY3Rvcihzb3VyY2UsIG9mZnNldCk7CisgICAgcmV0dXJuIHdyYXAobmV3IEFBQ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLCBvZmZzZXQpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKICAgICBvZmY2NF90IHBvcyA9IDA7CiAKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOwogICAgIGZvciAoOzspIHsKICAgICAgICAgdWludDhfdCBpZDNoZWFkZXJbMTBdOwotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQorICAgICAgICBpZiAoaGVscGVyLnJlYWRBdChwb3MsIGlkM2hlYWRlciwgc2l6ZW9mKGlkM2hlYWRlcikpCiAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaWQzaGVhZGVyKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTM2NCw3ICszNTksNyBAQAogCiAgICAgdWludDhfdCBoZWFkZXJbMl07CiAKLSAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CisgICAgaWYgKGhlbHBlci5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMzgzLDE3ICszNzgsMjEgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiYWFjIiwKKyAgICBOVUxMCit9OwogCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI0ZmQ4MGVhZS0wM2QyLTRkNzItOWViOS00OGZhNmJiNTQ2MTMiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiQUFDIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKaW5kZXggOWRhZGJlZC4uNjQzZDNmNCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKQEAgLTE4LDggKzE4LDkgQEAKIAogI2RlZmluZSBBQUNfRVhUUkFDVE9SX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKQEAgLTI4LDIzICsyOSwyMyBAQAogc3RydWN0IEFNZXNzYWdlOwogY2xhc3MgU3RyaW5nODsKIAotY2xhc3MgQUFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEFBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgQUFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBBQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQUFDRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUFDRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CkBAIC01NSw3ICs1Niw3IEBACiB9OwogCiBib29sIFNuaWZmQUFDKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIG9mZjY0X3QgKm9mZnNldCk7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLCBvZmY2NF90ICpvZmZzZXQpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAppbmRleCA3YzU2Yzk3Li5hNTgxNjdhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKQEAgLTgsNyArOCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCmluZGV4IGJlYTZmMWQuLmZmZWZmNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsNiBAQAogCiAjaW5jbHVkZSAiQU1SRXh0cmFjdG9yLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTMxLDI5ICsyOSwyOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEFNUlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIEFNUlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIHB1YmxpYzoKICAgICBBTVJTb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgYm9vbCBpc1dpZGUsCiAgICAgICAgICAgICBjb25zdCBvZmY2NF90ICpvZmZzZXRfdGFibGUsCiAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFNUlNvdXJjZSgpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICBib29sIG1Jc1dpZGU7CiAKICAgICBvZmY2NF90IG1PZmZzZXQ7CkBAIC05OCwyNyArOTYsMjcgQEAKICAgICByZXR1cm4gZnJhbWVTaXplOwogfQogCi1zdGF0aWMgc3RhdHVzX3QgZ2V0RnJhbWVTaXplQnlPZmZzZXQoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCBnZXRGcmFtZVNpemVCeU9mZnNldChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzV2lkZSwgc2l6ZV90ICpmcmFtZVNpemUpIHsKICAgICB1aW50OF90IGhlYWRlcjsKICAgICBzc2l6ZV90IGNvdW50ID0gc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCAxKTsKICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0gZWxzZSBpZiAoY291bnQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICB9CiAKICAgICB1bnNpZ25lZCBGVCA9IChoZWFkZXIgPj4gMykgJiAweDBmOwogCiAgICAgKmZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShpc1dpZGUsIEZUKTsKICAgICBpZiAoKmZyYW1lU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdGljIGJvb2wgU25pZmZBTVIoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgKmlzV2lkZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBib29sICppc1dpZGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgY2hhciBoZWFkZXJbOV07CiAKICAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikpIHsKQEAgLTE0NCw3ICsxNDIsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotQU1SRXh0cmFjdG9yOjpBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK0FNUkV4dHJhY3Rvcjo6QU1SRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbU9mZnNldFRhYmxlTGVuZ3RoKDApIHsKQEAgLTE1MywxMiArMTUxLDEyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAga0tleU1JTUVUeXBlLCBtSXNXaWRlID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOworICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwKKyAgICAgICAgICAgIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IgOiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwogCi0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1Jc1dpZGUgPyAxNjAwMCA6IDgwMDApOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAxKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1Jc1dpZGUgPyAxNjAwMCA6IDgwMDApOwogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CiAgICAgb2ZmNjRfdCBzdHJlYW1TaXplOwpAQCAtMTY2LDExICsxNjQsMTEgQEAKICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKIAogICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc3RyZWFtU2l6ZSkgPT0gT0spIHsKLSAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzdHJlYW1TaXplKSB7Ci0gICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQoc291cmNlLCBvZmZzZXQsIG1Jc1dpZGUsICZmcmFtZVNpemUpOwotICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc3RyZWFtU2l6ZSkgeworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQoc291cmNlLCBvZmZzZXQsIG1Jc1dpZGUsICZmcmFtZVNpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtMTg1LDMwICsxODMsMzMgQEAKICAgICAgICAgICAgIG51bUZyYW1lcyArKzsKICAgICAgICAgfQogCi0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIEFNUkV4dHJhY3Rvcjo6fkFNUkV4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5jbGVhcigpOworbWVkaWFfc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CiAKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtSXNXaWRlID8gImF1ZGlvL2Ftci13YiIgOiAiYXVkaW8vYW1yIik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IgOiAiYXVkaW8vYW1yIik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBTVJFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpBTVJFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjE3LDE5ICsyMTgsMTggQEAKICAgICAgICAgICAgIG1PZmZzZXRUYWJsZSwgbU9mZnNldFRhYmxlTGVuZ3RoKTsKIH0KIAotc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgeworbWVkaWFfc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEFNUlNvdXJjZTo6QU1SU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBib29sIGlzV2lkZSwgY29uc3Qgb2ZmNjRfdCAqb2Zmc2V0X3RhYmxlLCBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtTWV0YShtZXRhKSwKQEAgLTI1MCwzNSArMjUwLDMwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgbU9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKICAgICBtQ3VycmVudFRpbWVVcyA9IDA7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKDEyOCkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcigxMjgpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBTVJTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFNUlNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTI5Niw3ICsyOTEsNyBAQAogICAgICAgICBtT2Zmc2V0ID0gbU9mZnNldFRhYmxlW2luZGV4XSArIChtSXNXaWRlID8gOSA6IDYpOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBzZWVrRnJhbWUgLSBpbmRleCAqIDUwOyBpKyspIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVycjsKICAgICAgICAgICAgIGlmICgoZXJyID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQobURhdGFTb3VyY2UsIG1PZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2lkZSwgJnNpemUpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC0zMDksNyArMzA0LDcgQEAKICAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsICZoZWFkZXIsIDEpOwogCiAgICAgaWYgKG4gPCAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgaWYgKGhlYWRlciAmIDB4ODMpIHsKQEAgLTMxNywyMCArMzEyLDIwIEBACiAKICAgICAgICAgQUxPR0UoInBhZGRpbmcgYml0cyBtdXN0IGJlIDAsIGhlYWRlciBpcyAweCUwMngiLCBoZWFkZXIpOwogCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIHVuc2lnbmVkIEZUID0gKGhlYWRlciA+PiAzKSAmIDB4MGY7CiAKICAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKG1Jc1dpZGUsIEZUKTsKICAgICBpZiAoZnJhbWVTaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGZyYW1lU2l6ZSk7CkBAIC0zNDAsNTAgKzMzNSw2MyBAQAogICAgICAgICBidWZmZXIgPSBOVUxMOwogCiAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIG9ubHkgcGFydGlhbCBmcmFtZSBpcyBhdmFpbGFibGUsIHRyZWF0IGl0IGFzIEVPUy4KICAgICAgICAgICAgIG1PZmZzZXQgKz0gbjsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbU9mZnNldCArPSBmcmFtZVNpemU7CiAgICAgbUN1cnJlbnRUaW1lVXMgKz0gMjAwMDA7ICAvLyBFYWNoIGZyYW1lIGlzIDIwbXMKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiYW1yIiwKKyAgICAiYXdiIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCJjODY2MzljOS0yZjMxLTQwYWMtYTcxNS1mYTAxYjQ0OTNhYWYiKSwKICAgICAgICAgMSwKICAgICAgICAgIkFNUiBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmQU1SKHNvdXJjZSwgbnVsbHB0ciwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFNUkV4dHJhY3Rvcihzb3VyY2UpO307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgIFtdKAorICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgaWYgKFNuaWZmQU1SKCZoZWxwZXIsIG51bGxwdHIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgQU1SRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgIH0sCisgICAgICAgIH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaAppbmRleCBjOTBiMzI1Li5iNzZlZTljIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaApAQCAtMTksOCArMTksOSBAQAogI2RlZmluZSBBTVJfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTI4LDIzICsyOSwyMyBAQAogY2xhc3MgU3RyaW5nODsKICNkZWZpbmUgT0ZGU0VUX1RBQkxFX0xFTiAgICAzMDAKIAotY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEFNUkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQU1SRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IEFNUkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIkFNUkV4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFNUkV4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIGJvb2wgbUlzV2lkZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKaW5kZXggYjJmYjg4MC4uNGJkOTMzZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCkBAIC04LDcgKzgsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCmluZGV4IDQyNDJkNzYuLjNhM2QwNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCkBAIC04LDEzICs4LDE3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYkZMQUMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgbmFtZTogImxpYmZsYWNleHRyYWN0b3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwCmluZGV4IGNjZjgwZDAuLjg4NTQ2MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKQEAgLTI0LDQxICsyNCw1NiBAQAogLy8gbGliRkxBQyBwYXJzZXIKICNpbmNsdWRlICJGTEFDL3N0cmVhbV9kZWNvZGVyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9Wb3JiaXNDb21tZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPiAvLyBmb3IgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPiAvLyBmb3IgQUlEX01FRElBCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWVkaWFTZXJ2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBmbG9hdCBleHRyYWN0b3Igb3V0cHV0LCBidXQgZ2VuZXJhbCBwcm9jZXNzZXMKKy8vIG1heSBub3QgYmUgYWJsZSB0byBkbyBzby4KKy8vIFRPRE86IEltcHJvdmUgQVBJIHRvIHNldCBleHRyYWN0b3IgZmxvYXQgb3V0cHV0LgorLy8gKE5vdGU6IGR1cGxpY2F0ZWQgd2l0aCBXQVZFeHRyYWN0b3IuY3BwKQorc3RhdGljIGlubGluZSBib29sIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KGludCBiaXRzUGVyU2FtcGxlKQoreworICAgIHJldHVybiBiaXRzUGVyU2FtcGxlID4gMTYgJiYgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpID09IEFJRF9NRURJQTsKK30KKwogY2xhc3MgRkxBQ1BhcnNlcjsKIAotY2xhc3MgRkxBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIEZMQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAKIHB1YmxpYzoKICAgICBGTEFDU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZMQUNTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CiAgICAgRkxBQ1BhcnNlciAqbVBhcnNlcjsKICAgICBib29sIG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtU3RhcnRlZDsKQEAgLTc1LDE0ICs5MCwxNSBAQAogCiBwdWJsaWM6CiAgICAgZW51bSB7Ci0gICAgICAgIGtNYXhDaGFubmVscyA9IDgsCisgICAgICAgIGtNYXhDaGFubmVscyA9IEZDQ184LAogICAgIH07CiAKICAgICBleHBsaWNpdCBGTEFDUGFyc2VyKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKICAgICAgICAgLy8gSWYgbWV0YWRhdGEgcG9pbnRlcnMgYXJlbid0IHByb3ZpZGVkLCB3ZSBkb24ndCBmaWxsIHRoZW0KLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEgPSAwLAotICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEgPSAwKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEgPSAwLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEgPSAwKTsKIAogICAgIHZpcnR1YWwgfkZMQUNQYXJzZXIoKTsKIApAQCAtMTA4LDI0ICsxMjQsMjUgQEAKICAgICB9CiAKICAgICAvLyBtZWRpYSBidWZmZXJzCi0gICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICB2b2lkIGFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCk7CiAgICAgdm9pZCByZWxlYXNlQnVmZmVycygpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqcmVhZEJ1ZmZlcigpIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcmVhZEJ1ZmZlcigpIHsKICAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIoZmFsc2UsIDBMTCk7CiAgICAgfQotICAgIE1lZGlhQnVmZmVyQmFzZSAqcmVhZEJ1ZmZlcihGTEFDX191aW50NjQgc2FtcGxlKSB7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnJlYWRCdWZmZXIoRkxBQ19fdWludDY0IHNhbXBsZSkgewogICAgICAgICByZXR1cm4gcmVhZEJ1ZmZlcih0cnVlLCBzYW1wbGUpOwogICAgIH0KIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlICptRmlsZU1ldGFkYXRhOwotICAgIE1ldGFEYXRhQmFzZSAqbVRyYWNrTWV0YWRhdGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAgICAgYm9vbCBtSW5pdENoZWNrOwogCiAgICAgLy8gbWVkaWEgYnVmZmVycwogICAgIHNpemVfdCBtTWF4QnVmZmVyU2l6ZTsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUdyb3VwOwogICAgIHZvaWQgKCptQ29weSkoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7CiAKICAgICAvLyBoYW5kbGUgdG8gdW5kZXJseWluZyBsaWJGTEFDIHBhcnNlcgpAQCAtMTQ5LDcgKzE2Niw3IEBACiAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIG1FcnJvclN0YXR1czsKIAogICAgIHN0YXR1c190IGluaXQoKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKTsKIAogICAgIC8vIG5vIGNvcHkgY29uc3RydWN0b3Igb3IgYXNzaWdubWVudAogICAgIEZMQUNQYXJzZXIoY29uc3QgRkxBQ1BhcnNlciAmKTsKQEAgLTE2OSw2ICsxODYsNyBAQAogICAgICAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKTsKICAgICB2b2lkIG1ldGFkYXRhQ2FsbGJhY2soY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhKTsKICAgICB2b2lkIGVycm9yQ2FsbGJhY2soRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cyk7CisgICAgc2l6ZV90IGdldE91dHB1dFNhbXBsZVNpemUoKSBjb25zdCB7IHJldHVybiBtT3V0cHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOyB9CiAKICAgICAvLyBGTEFDIHBhcnNlciBjYWxsYmFja3MgYXMgQy1jYWxsYWJsZSBmdW5jdGlvbnMKICAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlclJlYWRTdGF0dXMgcmVhZF9jYWxsYmFjaygKQEAgLTM2NCw5ICszODIsOCBAQAogICAgIGNhc2UgRkxBQ19fTUVUQURBVEFfVFlQRV9QSUNUVVJFOgogICAgICAgICBpZiAobUZpbGVNZXRhZGF0YSAhPSAwKSB7CiAgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YV9QaWN0dXJlICpwID0gJm1ldGFkYXRhLT5kYXRhLnBpY3R1cmU7Ci0gICAgICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXREYXRhKGtLZXlBbGJ1bUFydCwKLSAgICAgICAgICAgICAgICAgICAgTWV0YURhdGE6OlRZUEVfTk9ORSwgcC0+ZGF0YSwgcC0+ZGF0YV9sZW5ndGgpOwotICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBwLT5taW1lX3R5cGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULAorICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsIHAtPmRhdGFfbGVuZ3RoKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtMzgxLDEyMiArMzk4LDYxIEBACiAgICAgbUVycm9yU3RhdHVzID0gc3RhdHVzOwogfQogCi0vLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBpbnRlcmxlYXZlZC4KKy8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IHNpZ25lZAorLy8gb3IgMzItYml0IGZsb2F0IGludGVybGVhdmVkLgorLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHRvIGF1ZGlvX3V0aWxzLgogLy8gVGhlc2UgYXJlIGNhbmRpZGF0ZXMgZm9yIG9wdGltaXphdGlvbiBpZiBuZWVkZWQuCi0KLXN0YXRpYyB2b2lkIGNvcHlNb25vOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUbzE2U2lnbmVkKAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA8PCA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2g4KGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgODsKKyAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlKSB7CisgICAgY29uc3QgaW50IGxlZnRTaGlmdCA9IDE2IC0gKGludCliaXRzUGVyU2FtcGxlOyAvLyBjYXN0IHRvIGludCB0byBwcmV2ZW50IHVuc2lnbmVkIG92ZXJmbG93LgorICAgIGlmIChsZWZ0U2hpZnQgPj0gMCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IGxlZnRTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCByaWdodFNoaWZ0ID0gLWxlZnRTaGlmdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiByaWdodFNoaWZ0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAorc3RhdGljIHZvaWQgY29weVRvRmxvYXQoCisgICAgICAgIGZsb2F0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNigKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gxNihpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsZWZ0U2hpZnQgPSAzMiAtIGJpdHNQZXJTYW1wbGU7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07CisgICAgICAgICAgICAqZHN0KysgPSBmbG9hdF9mcm9tX2kzMihzcmNbY11baV0gPDwgbGVmdFNoaWZ0KTsKICAgICAgICAgfQogICAgIH0KIH0KIAotLy8gMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKLQotc3RhdGljIHZvaWQgY29weU1vbm8yNCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gyNChpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IDg7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlUcmVzcGFzcygKLSAgICAgICAgaW50MTZfdCAqIC8qIGRzdCAqLywKLSAgICAgICAgY29uc3QgaW50ICpbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSAvKiBzcmMgKi8sCi0gICAgICAgIHVuc2lnbmVkIC8qIG5TYW1wbGVzICovLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBUUkVTUEFTUygpOwotfQotCiAvLyBGTEFDUGFyc2VyCiAKIEZMQUNQYXJzZXI6OkZMQUNQYXJzZXIoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKLSAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBib29sIG91dHB1dEZsb2F0LAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCisgICAgICBtT3V0cHV0RmxvYXQob3V0cHV0RmxvYXQpLAogICAgICAgbUZpbGVNZXRhZGF0YShmaWxlTWV0YWRhdGEpLAogICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKSwKICAgICAgIG1NYXhCdWZmZXJTaXplKDApLAogICAgICAgbUdyb3VwKE5VTEwpLAotICAgICAgbUNvcHkoY29weVRyZXNwYXNzKSwKICAgICAgIG1EZWNvZGVyKE5VTEwpLAogICAgICAgbUN1cnJlbnRQb3MoMExMKSwKICAgICAgIG1FT0YoZmFsc2UpLApAQCAtNTY3LDggKzUyMywxMCBAQAogICAgICAgICBjYXNlIDg6CiAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgIGNhc2UgMzI6IC8vIGdlbmVyYWxseSBub3QgZXhwZWN0ZWQgZm9yIEZMQUMKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gTm90ZTogaW50ZXJuYWxseSB0aGUgRkxBQyBleHRyYWN0b3Igc3VwcG9ydHMgMi0zMiBiaXRzLgogICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIGJpdHMgcGVyIHNhbXBsZSAldSIsIGdldEJpdHNQZXJTYW1wbGUoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQpAQCAtNTg1LDcxICs1NDMsNTMgQEAKICAgICAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgY2FzZSA4ODIwMDoKICAgICAgICAgY2FzZSA5NjAwMDoKKyAgICAgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIGNhc2UgMTkyMDAwOgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBOb3RlOiBpbnRlcm5hbGx5IHdlIHN1cHBvcnQgYXJiaXRyYXJ5IHNhbXBsZSByYXRlcyBmcm9tIDhrSHogdG8gMTkya0h6LgogICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICV1IiwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9Ci0gICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgY29weSBmdW5jdGlvbiwgZGVmYXVsdGluZyB0byB0cmVzcGFzcwotICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgICAgIHVuc2lnbmVkIG1DaGFubmVsczsKLSAgICAgICAgICAgIHVuc2lnbmVkIG1CaXRzUGVyU2FtcGxlOwotICAgICAgICAgICAgdm9pZCAoKm1Db3B5KShpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKLSAgICAgICAgfSB0YWJsZVtdID0gewotICAgICAgICAgICAgeyAxLCAgOCwgY29weU1vbm84ICAgIH0sCi0gICAgICAgICAgICB7IDIsICA4LCBjb3B5U3RlcmVvOCAgfSwKLSAgICAgICAgICAgIHsgOCwgIDgsIGNvcHlNdWx0aUNoOCAgfSwKLSAgICAgICAgICAgIHsgMSwgMTYsIGNvcHlNb25vMTYgICB9LAotICAgICAgICAgICAgeyAyLCAxNiwgY29weVN0ZXJlbzE2IH0sCi0gICAgICAgICAgICB7IDgsIDE2LCBjb3B5TXVsdGlDaDE2IH0sCi0gICAgICAgICAgICB7IDEsIDI0LCBjb3B5TW9ubzI0ICAgfSwKLSAgICAgICAgICAgIHsgMiwgMjQsIGNvcHlTdGVyZW8yNCB9LAotICAgICAgICAgICAgeyA4LCAyNCwgY29weU11bHRpQ2gyNCB9LAotICAgICAgICB9OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKHRhYmxlKS9zaXplb2YodGFibGVbMF0pOyArK2kpIHsKLSAgICAgICAgICAgIGlmICh0YWJsZVtpXS5tQ2hhbm5lbHMgPj0gZ2V0Q2hhbm5lbHMoKSAmJgotICAgICAgICAgICAgICAgICAgICB0YWJsZVtpXS5tQml0c1BlclNhbXBsZSA9PSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgICAgICAgICBtQ29weSA9IHRhYmxlW2ldLm1Db3B5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIC8vIHBvcHVsYXRlIHRyYWNrIG1ldGFkYXRhCiAgICAgICAgIGlmIChtVHJhY2tNZXRhZGF0YSAhPSAwKSB7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgZ2V0Q2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGdldEJpdHNQZXJTYW1wbGUoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVBjbUVuY29kaW5nLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBnZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIGdldEJpdHNQZXJTYW1wbGUoKSk7CiAgICAgICAgICAgICAvLyBzYW1wbGUgcmF0ZSBpcyBub24temVybywgc28gZGl2aXNpb24gYnkgemVybyBub3QgcG9zc2libGUKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIChnZXRUb3RhbFNhbXBsZXMoKSAqIDEwMDAwMDBMTCkgLyBnZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoZ2V0VG90YWxTYW1wbGVzKCkgKiAxMDAwMDAwTEwpIC8gZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJtaXNzaW5nIFNUUkVBTUlORk8iKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDApIHsKLSAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIEZMQUNQYXJzZXI6OmFsbG9jYXRlQnVmZmVycygpCit2b2lkIEZMQUNQYXJzZXI6OmFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkKIHsKICAgICBDSEVDSyhtR3JvdXAgPT0gTlVMTCk7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbU1heEJ1ZmZlclNpemUgPSBnZXRNYXhCbG9ja1NpemUoKSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKG1NYXhCdWZmZXJTaXplKSk7CisgICAgbUdyb3VwID0gZ3JvdXA7CisgICAgbU1heEJ1ZmZlclNpemUgPSBnZXRNYXhCbG9ja1NpemUoKSAqIGdldENoYW5uZWxzKCkgKiBnZXRPdXRwdXRTYW1wbGVTaXplKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtTWF4QnVmZmVyU2l6ZSk7CisgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG1NYXhCdWZmZXJTaXplKTsKIH0KIAogdm9pZCBGTEFDUGFyc2VyOjpyZWxlYXNlQnVmZmVycygpCiB7Ci0gICAgQ0hFQ0sobUdyb3VwICE9IE5VTEwpOwotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKIH0KIAotTWVkaWFCdWZmZXJCYXNlICpGTEFDUGFyc2VyOjpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKQorTWVkaWFCdWZmZXJIZWxwZXIgKkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpCiB7CiAgICAgbVdyaXRlUmVxdWVzdGVkID0gdHJ1ZTsKICAgICBtV3JpdGVDb21wbGV0ZWQgPSBmYWxzZTsKQEAgLTY4Niw0MSArNjI2LDUzIEBACiAgICAgfQogICAgIC8vIGFjcXVpcmUgYSBtZWRpYSBidWZmZXIKICAgICBDSEVDSyhtR3JvdXAgIT0gTlVMTCk7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBnZXRPdXRwdXRTYW1wbGVTaXplKCk7CiAgICAgQ0hFQ0soYnVmZmVyU2l6ZSA8PSBtTWF4QnVmZmVyU2l6ZSk7Ci0gICAgaW50MTZfdCAqZGF0YSA9IChpbnQxNl90ICopIGJ1ZmZlci0+ZGF0YSgpOwogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGJ1ZmZlclNpemUpOwogICAgIC8vIGNvcHkgUENNIGZyb20gRkxBQyB3cml0ZSBidWZmZXIgdG8gb3VyIG1lZGlhIGJ1ZmZlciwgd2l0aCBpbnRlcmxlYXZpbmcKLSAgICAoKm1Db3B5KShkYXRhLCBtV3JpdGVCdWZmZXIsIGJsb2Nrc2l6ZSwgZ2V0Q2hhbm5lbHMoKSk7CisgICAgY29uc3QgdW5zaWduZWQgYml0c1BlclNhbXBsZSA9IGdldEJpdHNQZXJTYW1wbGUoKTsKKyAgICBpZiAobU91dHB1dEZsb2F0KSB7CisgICAgICAgIGNvcHlUb0Zsb2F0KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihidWZmZXItPmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICBnZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb3B5VG8xNlNpZ25lZChyZWludGVycHJldF9jYXN0PHNob3J0Kj4oYnVmZmVyLT5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfQogICAgIC8vIGZpbGwgaW4gYnVmZmVyIG1ldGFkYXRhCiAgICAgQ0hFQ0sobVdyaXRlSGVhZGVyLm51bWJlcl90eXBlID09IEZMQUNfX0ZSQU1FX05VTUJFUl9UWVBFX1NBTVBMRV9OVU1CRVIpOwogICAgIEZMQUNfX3VpbnQ2NCBzYW1wbGVOdW1iZXIgPSBtV3JpdGVIZWFkZXIubnVtYmVyLnNhbXBsZV9udW1iZXI7CiAgICAgaW50NjRfdCB0aW1lVXMgPSAoMTAwMDAwMExMICogc2FtcGxlTnVtYmVyKSAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgcmV0dXJuIGJ1ZmZlcjsKIH0KIAogLy8gRkxBQ3NvdXJjZQogCiBGTEFDU291cmNlOjpGTEFDU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAotICAgICAgbVBhcnNlcigwKSwKLSAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKKyAgICAgIG1QYXJzZXIobmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsIG91dHB1dEZsb2F0LCAwLCBtVHJhY2tNZXRhZGF0YSkpLAorICAgICAgbUluaXRDaGVjayhtUGFyc2VyLT5pbml0Q2hlY2soKSksCiAgICAgICBtU3RhcnRlZChmYWxzZSkKIHsKICAgICBBTE9HVigiRkxBQ1NvdXJjZTo6RkxBQ1NvdXJjZSIpOwotICAgIC8vIHJlLXVzZSB0aGUgc2FtZSB0cmFjayBtZXRhZGF0YSBwYXNzZWQgaW50byBjb25zdHJ1Y3RvciBmcm9tIEZMQUNFeHRyYWN0b3IKLSAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UpOwotICAgIG1Jbml0Q2hlY2sgID0gbVBhcnNlci0+aW5pdENoZWNrKCk7CiB9CiAKIEZMQUNTb3VyY2U6On5GTEFDU291cmNlKCkKQEAgLTczMiwxOCArNjg0LDE4IEBACiAgICAgZGVsZXRlIG1QYXJzZXI7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OnN0YXJ0KCkKIHsKICAgICBBTE9HVigiRkxBQ1NvdXJjZTo6c3RhcnQiKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0gICAgbVBhcnNlci0+YWxsb2NhdGVCdWZmZXJzKCk7CisgICAgbVBhcnNlci0+YWxsb2NhdGVCdWZmZXJzKG1CdWZmZXJHcm91cCk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OnN0b3AoKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RvcCgpCiB7CiAgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0b3AiKTsKIApAQCAtNzUxLDE5ICs3MDMsMjMgQEAKICAgICBtUGFyc2VyLT5yZWxlYXNlQnVmZmVycygpOwogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpCiB7Ci0gICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBjb25zdCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgbU91dHB1dEZsb2F0ID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXRCdWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXRCdWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQogewotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgLy8gcHJvY2VzcyBhbiBvcHRpb25hbCBzZWVrIHJlcXVlc3QKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CkBAIC03ODQsMjAgKzc0MCwyMiBAQAogICAgICAgICBidWZmZXIgPSBtUGFyc2VyLT5yZWFkQnVmZmVyKCk7CiAgICAgfQogICAgICpvdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gKHN0YXR1c190KSBPSyA6IChzdGF0dXNfdCkgRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyBBTUVESUFfT0sgOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKIH0KIAogLy8gRkxBQ0V4dHJhY3RvcgogCiBGTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSkKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVBhcnNlcihudWxscHRyKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpCiB7CiAgICAgQUxPR1YoIkZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IiKTsKICAgICAvLyBGTEFDUGFyc2VyIHdpbGwgZmlsbCBpbiB0aGUgbWV0YWRhdGEgZm9yIHVzCi0gICAgbVBhcnNlciA9IG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlLCAmbUZpbGVNZXRhZGF0YSwgJm1UcmFja01ldGFkYXRhKTsKKyAgICBtRmlsZU1ldGFkYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIG1UcmFja01ldGFkYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSwgZmFsc2UgLyogb3V0cHV0RmxvYXQgKi8sIG1GaWxlTWV0YWRhdGEsIG1UcmFja01ldGFkYXRhKTsKICAgICBtSW5pdENoZWNrID0gbVBhcnNlci0+aW5pdENoZWNrKCk7CiB9CiAKQEAgLTgwNSw2ICs3NjMsOSBAQAogewogICAgIEFMT0dWKCJ+RkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvciIpOwogICAgIGRlbGV0ZSBtUGFyc2VyOworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1GaWxlTWV0YWRhdGEpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobVRyYWNrTWV0YWRhdGEpOwogfQogCiBzaXplX3QgRkxBQ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKQpAQCAtODEyLDQyICs3NzMsNzYgQEAKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpGTEFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCitNZWRpYVRyYWNrSGVscGVyICpGTEFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCiB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gbmV3IEZMQUNTb3VyY2UobURhdGFTb3VyY2UsIG1UcmFja01ldGFkYXRhKTsKKworICAgIHJldHVybiBuZXcgRkxBQ1NvdXJjZSgKKyAgICAgICAgICAgIG1EYXRhU291cmNlLCBtVHJhY2tNZXRhZGF0YSwgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobVBhcnNlci0+Z2V0Qml0c1BlclNhbXBsZSgpKSk7CiB9CiAKLXN0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtUGFyc2VyLT5nZXRCaXRzUGVyU2FtcGxlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKQogewotICAgIG1ldGEgPSBtRmlsZU1ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZpbGVNZXRhZGF0YSk7CiB9CiAKIC8vIFNuaWZmZXIKIAotYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCitib29sIFNuaWZmRkxBQyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQogewotICAgIC8vIGZpcnN0IDQgaXMgdGhlIHNpZ25hdHVyZSB3b3JkCi0gICAgLy8gc2Vjb25kIDQgaXMgdGhlIHNpemVvZiBTVFJFQU1JTkZPCi0gICAgLy8gMDQyIGlzIHRoZSBtYW5kYXRvcnkgU1RSRUFNSU5GTwotICAgIC8vIG5vIG5lZWQgdG8gcmVhZCByZXN0IG9mIHRoZSBoZWFkZXIsIGFzIGEgcHJlbWF0dXJlIEVPRiB3aWxsIGJlIGNhdWdodCBsYXRlcgotICAgIHVpbnQ4X3QgaGVhZGVyWzQrNF07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpICE9IHNpemVvZihoZWFkZXIpCi0gICAgICAgICAgICB8fCBtZW1jbXAoImZMYUNcMFwwXDBcMDQyIiwgaGVhZGVyLCA0KzQpKQotICAgIHsKKyAgICAvLyBTa2lwIElEMyB0YWdzCisgICAgb2ZmNjRfdCBwb3MgPSAwOworICAgIHVpbnQ4X3QgaGVhZGVyWzEwXTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChwb3MsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpICE9IHNpemVvZihoZWFkZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vIG1vcmUgZmlsZSB0byByZWFkLgorICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIElEMyB0YWcKKyAgICAgICAgaWYgKG1lbWNtcCgiSUQzIiwgaGVhZGVyLCAzKSAhPSAwKSB7CisgICAgICAgICAgICBicmVhazsgLy8gbm90IGFuIElEMyB0YWcuCisgICAgICAgIH0KKworICAgICAgICAvLyBza2lwIHRoZSBJRDN2MiBkYXRhIGFuZCBjaGVjayBhZ2FpbgorICAgICAgICBjb25zdCB1bnNpZ25lZCBpZDNMZW4gPSAxMCArCisgICAgICAgICAgICAgICAgKCgoaGVhZGVyWzZdICYgMHg3ZikgPDwgMjEpCisgICAgICAgICAgICAgICAgIHwgKChoZWFkZXJbN10gJiAweDdmKSA8PCAxNCkKKyAgICAgICAgICAgICAgICAgfCAoKGhlYWRlcls4XSAmIDB4N2YpIDw8IDcpCisgICAgICAgICAgICAgICAgIHwgKGhlYWRlcls5XSAmIDB4N2YpKTsKKyAgICAgICAgcG9zICs9IGlkM0xlbjsKKworICAgICAgICBBTE9HVigic2tpcHBlZCBJRDMgdGFnIG9mIGxlbiAldSBuZXcgc3RhcnRpbmcgb2Zmc2V0IGlzICUjMDE2bGx4IiwKKyAgICAgICAgICAgICAgICBpZDNMZW4sIChsb25nIGxvbmcpcG9zKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBGTEFDIGhlYWRlci4KKyAgICAvLyBodHRwczovL3hpcGgub3JnL2ZsYWMvZm9ybWF0Lmh0bWwjc3RyZWFtCisgICAgLy8KKyAgICAvLyBOb3RlOiBjb250ZW50IHN0b3JlZCBiaWcgZW5kaWFuLgorICAgIC8vIGJ5dGUgb2Zmc2V0ICBiaXQgc2l6ZSAgY29udGVudAorICAgIC8vIDAgICAgICAgICAgICAzMiAgICAgICAgZkxhQworICAgIC8vIDQgICAgICAgICAgICA4ICAgICAgICAgbWV0YWRhdGEgdHlwZSBTVFJFQU1JTkZPICgwKSAobm90ZTogT1Igd2l0aCAweDgwIGlmIGxhc3QgbWV0YWRhdGEpCisgICAgLy8gNSAgICAgICAgICAgIDI0ICAgICAgICBzaXplIG9mIG1ldGFkYXRhLCBmb3IgU1RSRUFNSU5GTyAoMHgyMikuCisKKyAgICBpZiAobWVtY21wKCJmTGFDXHgwMFx4MDBceDAwXHgyMiIsIGhlYWRlciwgOCkgIT0gMCAmJgorICAgICAgICBtZW1jbXAoImZMYUNceDgwXHgwMFx4MDBceDIyIiwgaGVhZGVyLCA4KSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTg1NiwyOSArODUxLDQwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgImZsYWMiLAorICAgICJmbCIsCisgICAgTlVMTAorfTsKIAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgICAgICBVVUlEKCIxMzY0YjA0OC1jYzQ1LTRmZGEtOTkzNC0zMjdkMGViZjk4MjkiKSwKICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAiRkxBQyBFeHRyYWN0b3IiLAotICAgICAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICAgICAgaWYgKFNuaWZmRkxBQyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRkxBQ0V4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnYzID0geworICAgICAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZkZMQUMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IEZMQUNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCiAgICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCmluZGV4IDdmYjZlYzYuLjVhNzNkMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaApAQCAtMTgsNDUgKzE4LDQ0IEBACiAjZGVmaW5lIEZMQUNfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEZMQUNQYXJzZXI7CiAKLWNsYXNzIEZMQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgRkxBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiAKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBGTEFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IEZMQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJGTEFDRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RkxBQ0V4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBGTEFDUGFyc2VyICptUGFyc2VyOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOwogCiAgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgdHJhY2sKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKIAogICAgIEZMQUNFeHRyYWN0b3IoY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKICAgICBGTEFDRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKIAogfTsKIAotYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOwotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEZMQUNfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCmluZGV4IDZlOTgxMTQuLjdkNDJlNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCkBAIC04LDcgKzgsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAKaW5kZXggYTMwYjZmOC4uOWY0ZjllNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcApAQCAtMjQsMzUgKzI0LDM0IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxsaWJzb25pdm94L2Vhc19yZXZlcmIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBob3cgbWFueSBTb25pdm94IG91dHB1dCBidWZmZXJzIHRvIGFnZ3JlZ2F0ZSBpbnRvIG9uZSBNZWRpYUJ1ZmZlckJhc2UKKy8vIGhvdyBtYW55IFNvbml2b3ggb3V0cHV0IGJ1ZmZlcnMgdG8gYWdncmVnYXRlIGludG8gb25lIE1lZGlhQnVmZmVyCiBzdGF0aWMgY29uc3QgaW50IE5VTV9DT01CSU5FX0JVRkZFUlMgPSA0OwogCi1jbGFzcyBNaWRpU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIAogcHVibGljOgogICAgIE1pZGlTb3VyY2UoCiAgICAgICAgICAgICBNaWRpRW5naW5lICZlbmdpbmUsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NaWRpU291cmNlKCk7CiAKIHByaXZhdGU6CiAgICAgTWlkaUVuZ2luZSAmbUVuZ2luZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1UcmFja01ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAgICAgYm9vbCBtSW5pdENoZWNrOwogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAKQEAgLTY5LDcgKzY4LDcgQEAKIAogTWlkaVNvdXJjZTo6TWlkaVNvdXJjZSgKICAgICAgICAgTWlkaUVuZ2luZSAmZW5naW5lLAotICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkKICAgICA6IG1FbmdpbmUoZW5naW5lKSwKICAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAogICAgICAgbUluaXRDaGVjayhmYWxzZSksCkBAIC04NywxNyArODYsMTcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykKK21lZGlhX3N0YXR1c190IE1pZGlTb3VyY2U6OnN0YXJ0KCkKIHsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RhcnQiKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIG1FbmdpbmUuYWxsb2NhdGVCdWZmZXJzKCk7Ci0gICAgcmV0dXJuIE9LOworICAgIG1FbmdpbmUuYWxsb2NhdGVCdWZmZXJzKG1CdWZmZXJHcm91cCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RvcCgpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpzdG9wKCkKIHsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RvcCIpOwogCkBAIC0xMDUsMjAgKzEwNCwxOSBAQAogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbUVuZ2luZS5yZWxlYXNlQnVmZmVycygpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKQogewotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKK21lZGlhX3N0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKIHsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6cmVhZCIpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgLy8gcHJvY2VzcyBhbiBvcHRpb25hbCBzZWVrIHJlcXVlc3QKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CkBAIC0xMzEsNyArMTI5LDcgQEAKICAgICBidWZmZXIgPSBtRW5naW5lLnJlYWRCdWZmZXIoKTsKICAgICAqb3V0QnVmZmVyID0gYnVmZmVyOwogICAgIEFMT0dWKCJNaWRpU291cmNlOjpyZWFkICVwIGRvbmUiLCB0aGlzKTsKLSAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IEFNRURJQV9PSyA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogfQogCiBzdGF0dXNfdCBNaWRpU291cmNlOjppbml0KCkKQEAgLTE0MiwxMCArMTQwLDkgQEAKIAogLy8gTWlkaUVuZ2luZQogCi1NaWRpRW5naW5lOjpNaWRpRW5naW5lKERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKLSAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKSA6Ci0gICAgICAgICAgICBtR3JvdXAoTlVMTCksCitNaWRpRW5naW5lOjpNaWRpRW5naW5lKENEYXRhU291cmNlICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKSA6CiAgICAgICAgICAgICBtRWFzRGF0YShOVUxMKSwKICAgICAgICAgICAgIG1FYXNIYW5kbGUoTlVMTCksCiAgICAgICAgICAgICBtRWFzQ29uZmlnKE5VTEwpLApAQCAtMTcwLDE2ICsxNjcsMjAgQEAKICAgICB9CiAKICAgICBpZiAoZmlsZU1ldGFkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgZmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZmlsZU1ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01JREkpOwogICAgIH0KIAogICAgIGlmICh0cmFja01ldGFkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgMTAwMGxsICogdGVtcCk7IC8vIG1pbGxpLT5taWNybworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIDEwMDBsbCAqIHRlbXApOyAvLyBtaWxsaS0+bWljcm8KICAgICAgICAgbUVhc0NvbmZpZyA9IEVBU19Db25maWcoKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1FYXNDb25maWctPnNhbXBsZVJhdGUpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtRWFzQ29uZmlnLT5udW1DaGFubmVscyk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwogICAgIH0KICAgICBtSXNJbml0aWFsaXplZCA9IHRydWU7CiB9CkBAIC0xOTEsNyArMTkyLDYgQEAKICAgICBpZiAobUVhc0RhdGEpIHsKICAgICAgICAgRUFTX1NodXRkb3duKG1FYXNEYXRhKTsKICAgICB9Ci0gICAgZGVsZXRlIG1Hcm91cDsKICAgICBkZWxldGUgbUlvV3JhcHBlcjsKIH0KIApAQCAtMTk5LDIyICsxOTksMjAgQEAKICAgICByZXR1cm4gbUlzSW5pdGlhbGl6ZWQgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CiAKLXN0YXR1c190IE1pZGlFbmdpbmU6OmFsbG9jYXRlQnVmZmVycygpIHsKK3N0YXR1c190IE1pZGlFbmdpbmU6OmFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkgewogICAgIC8vIHNlbGVjdCByZXZlcmIgcHJlc2V0IGFuZCBlbmFibGUKICAgICBFQVNfU2V0UGFyYW1ldGVyKG1FYXNEYXRhLCBFQVNfTU9EVUxFX1JFVkVSQiwgRUFTX1BBUkFNX1JFVkVSQl9QUkVTRVQsIEVBU19QQVJBTV9SRVZFUkJfQ0hBTUJFUik7CiAgICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfQllQQVNTLCBFQVNfRkFMU0UpOwogCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CiAgICAgaW50IGJ1ZnNpemUgPSBzaXplb2YoRUFTX1BDTSkKICAgICAgICAgICAgICogbUVhc0NvbmZpZy0+bWl4QnVmZmVyU2l6ZSAqIG1FYXNDb25maWctPm51bUNoYW5uZWxzICogTlVNX0NPTUJJTkVfQlVGRkVSUzsKICAgICBBTE9HVigidXNpbmcgJWQgYnl0ZSBidWZmZXIiLCBidWZzaXplKTsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoYnVmc2l6ZSkpOworICAgIG1Hcm91cCA9IGdyb3VwOworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihidWZzaXplKTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE1pZGlFbmdpbmU6OnJlbGVhc2VCdWZmZXJzKCkgewotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIyNCwxMyArMjIyLDEzIEBACiAgICAgcmV0dXJuIHJlc3VsdCA9PSBFQVNfU1VDQ0VTUyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKIH0KIAotTWVkaWFCdWZmZXJCYXNlKiBNaWRpRW5naW5lOjpyZWFkQnVmZmVyKCkgeworTWVkaWFCdWZmZXJIZWxwZXIqIE1pZGlFbmdpbmU6OnJlYWRCdWZmZXIoKSB7CiAgICAgRUFTX1NUQVRFIHN0YXRlOwogICAgIEVBU19TdGF0ZShtRWFzRGF0YSwgbUVhc0hhbmRsZSwgJnN0YXRlKTsKICAgICBpZiAoKHN0YXRlID09IEVBU19TVEFURV9TVE9QUEVEKSB8fCAoc3RhdGUgPT0gRUFTX1NUQVRFX0VSUk9SKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoInJlYWRCdWZmZXI6IG5vIGJ1ZmZlciIpOwpAQCAtMjM5LDcgKzIzNyw5IEBACiAgICAgRUFTX0kzMiB0aW1lTXM7CiAgICAgRUFTX0dldExvY2F0aW9uKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmdGltZU1zKTsKICAgICBpbnQ2NF90IHRpbWVVcyA9IDEwMDBsbCAqIHRpbWVNczsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIEVBU19QQ00qIHAgPSAoRUFTX1BDTSopIGJ1ZmZlci0+ZGF0YSgpOwogICAgIGludCBudW1CeXRlc091dHB1dCA9IDA7CkBAIC0yNjMsMTggKzI2MywyMyBAQAogLy8gTWlkaUV4dHJhY3RvcgogCiBNaWRpRXh0cmFjdG9yOjpNaWRpRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSkKKyAgICAgICAgQ0RhdGFTb3VyY2UgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3IgY3RvciIpOwotICAgIG1FbmdpbmUgPSBuZXcgTWlkaUVuZ2luZShtRGF0YVNvdXJjZSwgJm1GaWxlTWV0YWRhdGEsICZtVHJhY2tNZXRhZGF0YSk7CisgICAgbUZpbGVNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtVHJhY2tNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtRW5naW5lID0gbmV3IE1pZGlFbmdpbmUobURhdGFTb3VyY2UsIG1GaWxlTWV0YWRhdGEsIG1UcmFja01ldGFkYXRhKTsKICAgICBtSW5pdENoZWNrID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7CiB9CiAKIE1pZGlFeHRyYWN0b3I6On5NaWRpRXh0cmFjdG9yKCkKIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBkdG9yIik7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFkYXRhKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGFkYXRhKTsKKyAgICBkZWxldGUgbUVuZ2luZTsKIH0KIAogc2l6ZV90IE1pZGlFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKQEAgLTI4Miw3ICsyODcsNyBAQAogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKK01lZGlhVHJhY2tIZWxwZXIgKk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yOTAsMjcgKzI5NSwyNSBAQAogICAgIHJldHVybiBuZXcgTWlkaVNvdXJjZSgqbUVuZ2luZSwgbVRyYWNrTWV0YWRhdGEpOwogfQogCi1zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSIpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CiB9CiAKLXN0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkKK21lZGlhX3N0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEiKTsKLSAgICBtZXRhID0gbUZpbGVNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YWRhdGEpOwogfQogCiAvLyBTbmlmZmVyCiAKLWJvb2wgU25pZmZNaWRpKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQorYm9vbCBTbmlmZk1pZGkoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCiB7CiAgICAgTWlkaUVuZ2luZSBwKHNvdXJjZSwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKHAuaW5pdENoZWNrKCkgPT0gT0spIHsKQEAgLTMyMywyOCArMzI2LDQ2IEBACiAKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiaW15IiwKKyAgICAibWlkIiwKKyAgICAibWlkaSIsCisgICAgIm14bWYiLAorICAgICJvdGEiLAorICAgICJydHR0bCIsCisgICAgInJ0eCIsCisgICAgInNtZiIsCisgICAgInhtZiIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiZWY2Y2NhMGEtZjhhMi00M2U2LWJhNWYtZGZjZDdjOWE3ZWYyIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNSURJIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIHsKKyAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTWlkaShzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNaWRpRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZNaWRpKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpKTt9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaAppbmRleCAyNDRkZDBmLi4yZTc4MDg2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKQEAgLTE4LDExICsxOCwxMiBAQAogI2RlZmluZSBNSURJX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzLmg+CiAKQEAgLTMwLDQ4ICszMSw0OCBAQAogCiBjbGFzcyBNaWRpRW5naW5lIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNaWRpRW5naW5lKERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEpOworICAgIGV4cGxpY2l0IE1pZGlFbmdpbmUoQ0RhdGFTb3VyY2UgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSk7CiAgICAgfk1pZGlFbmdpbmUoKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpOwogCi0gICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzKCk7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKTsKICAgICBzdGF0dXNfdCByZWxlYXNlQnVmZmVycygpOwogICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHBvc2l0aW9uVXMpOwotICAgIE1lZGlhQnVmZmVyQmFzZSogcmVhZEJ1ZmZlcigpOworICAgIE1lZGlhQnVmZmVySGVscGVyKiByZWFkQnVmZmVyKCk7CiBwcml2YXRlOgogICAgIE1pZGlJb1dyYXBwZXIgKm1Jb1dyYXBwZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1Hcm91cDsKICAgICBFQVNfREFUQV9IQU5ETEUgbUVhc0RhdGE7CiAgICAgRUFTX0hBTkRMRSBtRWFzSGFuZGxlOwogICAgIGNvbnN0IFNfRUFTX0xJQl9DT05GSUcqIG1FYXNDb25maWc7CiAgICAgYm9vbCBtSXNJbml0aWFsaXplZDsKIH07CiAKLWNsYXNzIE1pZGlFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTWlkaUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiAKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNaWRpRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IE1pZGlFeHRyYWN0b3IoQ0RhdGFTb3VyY2UgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTWlkaUV4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1pZGlFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQ0RhdGFTb3VyY2UgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOwogCiAgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgdHJhY2sKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKIAogICAgIE1pZGlFbmdpbmUgKm1FbmdpbmU7CiAKQEAgLTg4LDcgKzg5LDcgQEAKIAogfTsKIAotYm9vbCBTbmlmZk1pZGkoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworYm9vbCBTbmlmZk1pZGkoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAppbmRleCBmN2VkMGM4Li4xNzQ0ZDNkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKQEAgLTExLDcgKzExLDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCmluZGV4IGQ2NTc1ODIuLjIwY2M2NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKQEAgLTIzLDE4ICsyMywxNiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CkBAIC00NCw3ICs0Miw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBEYXRhU291cmNlQmFzZVJlYWRlciA6IHB1YmxpYyBta3ZwYXJzZXI6OklNa3ZSZWFkZXIgewotICAgIGV4cGxpY2l0IERhdGFTb3VyY2VCYXNlUmVhZGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUJhc2VSZWFkZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgICAgICA6IG1Tb3VyY2Uoc291cmNlKSB7CiAgICAgfQogCkBAIC02OCw4ICs2NiwxMiBAQAogICAgIHZpcnR1YWwgaW50IExlbmd0aChsb25nIGxvbmcqIHRvdGFsLCBsb25nIGxvbmcqIGF2YWlsYWJsZSkgewogICAgICAgICBvZmY2NF90IHNpemU7CiAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSAhPSBPSykgewotICAgICAgICAgICAgKnRvdGFsID0gLTE7Ci0gICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisgICAgICAgICAgICBpZiAodG90YWwpIHsKKyAgICAgICAgICAgICAgICAqdG90YWwgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC04Niw3ICs4OCw3IEBACiAgICAgfQogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAKICAgICBEYXRhU291cmNlQmFzZVJlYWRlcihjb25zdCBEYXRhU291cmNlQmFzZVJlYWRlciAmKTsKICAgICBEYXRhU291cmNlQmFzZVJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlUmVhZGVyICYpOwpAQCAtMTE4LDIyICsxMjAsMjUgQEAKICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrRW50cnkgKm1CbG9ja0VudHJ5OwogICAgIGxvbmcgbUJsb2NrRW50cnlJbmRleDsKIAorICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrVHlwZTsKKyAgICB2b2lkIHNlZWt3aXRob3V0Y3VlX2woaW50NjRfdCBzZWVrVGltZVVzLCBpbnQ2NF90ICphY3R1YWxGcmFtZVRpbWVVcyk7CisKICAgICB2b2lkIGFkdmFuY2VfbCgpOwogCiAgICAgQmxvY2tJdGVyYXRvcihjb25zdCBCbG9ja0l0ZXJhdG9yICYpOwogICAgIEJsb2NrSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBCbG9ja0l0ZXJhdG9yICYpOwogfTsKIAotc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIE1hdHJvc2thU291cmNlKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHNpemVfdCBpbmRleCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1hdHJvc2thU291cmNlKCk7CkBAIC0xNDMsNiArMTQ4LDcgQEAKICAgICAgICAgQVZDLAogICAgICAgICBBQUMsCiAgICAgICAgIEhFVkMsCisgICAgICAgIE1QMywKICAgICAgICAgT1RIRVIKICAgICB9OwogCkBAIC0xNTMsMTIgKzE1OSwyMSBAQAogICAgIEJsb2NrSXRlcmF0b3IgbUJsb2NrSXRlcjsKICAgICBzc2l6ZV90IG1OQUxTaXplTGVuOyAgLy8gZm9yIHR5cGUgQVZDIG9yIEhFVkMKIAotICAgIExpc3Q8TWVkaWFCdWZmZXJCYXNlICo+IG1QZW5kaW5nRnJhbWVzOworICAgIExpc3Q8TWVkaWFCdWZmZXJIZWxwZXIgKj4gbVBlbmRpbmdGcmFtZXM7CisKKyAgICBpbnQ2NF90IG1DdXJyZW50VFM7IC8vIGFkZCBmb3IgbXAzCisgICAgdWludDMyX3QgbU1QM0hlYWRlcjsKKworICAgIG1lZGlhX3N0YXR1c190IGZpbmRNUDNIZWFkZXIodWludDMyX3QgKiBoZWFkZXIsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGFTb3VyY2UsIGludCBsZW5ndGgsIGludCAqb3V0U3RhcnRQb3MpOworICAgIG1lZGlhX3N0YXR1c190IG1wM0ZyYW1lUmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucywKKyAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0U2FtcGxlVGltZVVzKTsKIAogICAgIHN0YXR1c190IGFkdmFuY2UoKTsKIAotICAgIHN0YXR1c190IHNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJCYXNlICptYnVmKTsKLSAgICBzdGF0dXNfdCByZWFkQmxvY2soKTsKKyAgICBzdGF0dXNfdCBzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVySGVscGVyICptYnVmKTsKKyAgICBtZWRpYV9zdGF0dXNfdCByZWFkQmxvY2soKTsKICAgICB2b2lkIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwogCiAgICAgTWF0cm9za2FTb3VyY2UoY29uc3QgTWF0cm9za2FTb3VyY2UgJik7CkBAIC0yMjEsNDcgKzIzNiwzOSBAQAogICAgICAgbUJsb2NrSXRlcihtRXh0cmFjdG9yLAogICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChpbmRleCkubVRyYWNrTnVtLAogICAgICAgICAgICAgICAgICBpbmRleCksCi0gICAgICBtTkFMU2l6ZUxlbigtMSkgewotICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCkubU1ldGE7CisgICAgICBtTkFMU2l6ZUxlbigtMSksCisgICAgICBtQ3VycmVudFRTKDApLAorICAgICAgbU1QM0hlYWRlcigwKSB7CisgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyAmdHJhY2tJbmZvID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSB0cmFja0luZm8ubU1ldGE7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKG1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCiAgICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpOwogCiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKICAgICAgICAgbVR5cGUgPSBBVkM7CiAKLSAgICAgICAgdWludDMyX3QgZHVtbXk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmF2Y2M7Ci0gICAgICAgIHNpemVfdCBhdmNjU2l6ZTsKLSAgICAgICAgaW50MzJfdCBuYWxTaXplTGVuID0gMDsKLSAgICAgICAgaWYgKG1ldGEuZmluZEludDMyKGtLZXlOYWxMZW5ndGhTaXplLCAmbmFsU2l6ZUxlbikpIHsKLSAgICAgICAgICAgIGlmIChuYWxTaXplTGVuID49IDAgJiYgbmFsU2l6ZUxlbiA8PSA0KSB7Ci0gICAgICAgICAgICAgICAgbU5BTFNpemVMZW4gPSBuYWxTaXplTGVuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1ldGEuZmluZERhdGEoa0tleUFWQ0MsICZkdW1teSwgKGNvbnN0IHZvaWQgKiopJmF2Y2MsICZhdmNjU2l6ZSkKLSAgICAgICAgICAgICAgICAmJiBhdmNjU2l6ZSA+PSA1dSkgewotICAgICAgICAgICAgbU5BTFNpemVMZW4gPSAxICsgKGF2Y2NbNF0gJiAzKTsKLSAgICAgICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICV6ZCIsIG1OQUxTaXplTGVuKTsKKyAgICAgICAgaW50MzJfdCBuYWxTaXplTGVuID0gdHJhY2tJbmZvLm1OYWxMZW5ndGhTaXplOworICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgeworICAgICAgICAgICAgbU5BTFNpemVMZW4gPSBuYWxTaXplTGVuOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk5vIG1OQUxTaXplTGVuIik7CisgICAgICAgICAgICBBTE9HRSgiTm8gQVZDIG1OQUxTaXplTGVuIik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CiAgICAgICAgIG1UeXBlID0gSEVWQzsKIAotICAgICAgICB1aW50MzJfdCBkdW1teTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqaHZjYzsKLSAgICAgICAgc2l6ZV90IGh2Y2NTaXplOwotICAgICAgICBpZiAobWV0YS5maW5kRGF0YShrS2V5SFZDQywgJmR1bW15LCAoY29uc3Qgdm9pZCAqKikmaHZjYywgJmh2Y2NTaXplKQotICAgICAgICAgICAgICAgICYmIGh2Y2NTaXplID49IDIydSkgewotICAgICAgICAgICAgbU5BTFNpemVMZW4gPSAxICsgKGh2Y2NbMTQrN10gJiAzKTsKLSAgICAgICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICV6dSIsIG1OQUxTaXplTGVuKTsKKyAgICAgICAgaW50MzJfdCBuYWxTaXplTGVuID0gdHJhY2tJbmZvLm1OYWxMZW5ndGhTaXplOworICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgeworICAgICAgICAgICAgbU5BTFNpemVMZW4gPSBuYWxTaXplTGVuOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk5vIG1OQUxTaXplTGVuIik7CisgICAgICAgICAgICBBTE9HRSgiTm8gSEVWQyBtTkFMU2l6ZUxlbiIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CiAgICAgICAgIG1UeXBlID0gQUFDOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpIHsKKyAgICAgICAgbVR5cGUgPSBNUDM7CiAgICAgfQogfQogCkBAIC0yNjksMjUgKzI3NiwzNiBAQAogICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoKSB7CiAgICAgaWYgKG1UeXBlID09IEFWQyAmJiBtTkFMU2l6ZUxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCisgICAgLy8gYWxsb2NhdGUgb25lIHNtYWxsIGluaXRpYWwgYnVmZmVyLCBidXQgbGVhdmUgcGxlbnR5IG9mIHJvb20gdG8gZ3JvdworICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG51bWJlciBvZiBidWZmZXJzICovLCAxMDI0IC8qIGJ1ZmZlciBzaXplICovLCA2NCAvKiBncm93dGggbGltaXQgKi8pOwogICAgIG1CbG9ja0l0ZXIucmVzZXQoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICBpZiAobVR5cGUgPT0gTVAzICYmIG1NUDNIZWFkZXIgPT0gMCkgeworICAgICAgICBpbnQgc3RhcnQgPSAtMTsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gZmluZE1QM0hlYWRlcigmbU1QM0hlYWRlciwgTlVMTCwgMCwgJnN0YXJ0KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIk5vIG1wMyBoZWFkZXIgZm91bmQiKTsKKyAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0b3AoKSB7CiAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0zMDAsNiArMzE4LDcgQEAKICAgICAgIG1DbHVzdGVyKE5VTEwpLAogICAgICAgbUJsb2NrRW50cnkoTlVMTCksCiAgICAgICBtQmxvY2tFbnRyeUluZGV4KDApIHsKKyAgICBtVHJhY2tUeXBlID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPkdldFRyYWNrcygpLT5HZXRUcmFja0J5TnVtYmVyKHRyYWNrTnVtKS0+R2V0VHlwZSgpOwogICAgIHJlc2V0KCk7CiB9CiAKQEAgLTQ1MiwxMiArNDcxLDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIXBDdWVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm8gQ3VlcyBpbiBmaWxlIik7CisgICAgICAgICAgICBBTE9HVigiTm8gQ3VlcyBpbiBmaWxlLHNlZWsgd2l0aG91dCBjdWUgZGF0YSIpOworICAgICAgICAgICAgc2Vla3dpdGhvdXRjdWVfbChzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSBpZiAoIXBTSCkgewotICAgICAgICBBTE9HRSgiTm8gU2Vla0hlYWQiKTsKKyAgICAgICAgQUxPR1YoIk5vIFNlZWtIZWFkLCBzZWVrIHdpdGhvdXQgY3VlIGRhdGEiKTsKKyAgICAgICAgc2Vla3dpdGhvdXRjdWVfbChzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTQ2Niw3ICs0ODcsOSBAQAogICAgIHdoaWxlICghcEN1ZXMtPkRvbmVQYXJzaW5nKCkpIHsKICAgICAgICAgcEN1ZXMtPkxvYWRDdWVQb2ludCgpOwogICAgICAgICBwQ1AgPSBwQ3Vlcy0+R2V0TGFzdCgpOwotICAgICAgICBDSEVDSyhwQ1ApOworICAgICAgICBBTE9HVigicENQID0gJXMiLCBwQ1AgPT0gTlVMTCA/ICJOVUxMIiA6ICJub3QgTlVMTCIpOworICAgICAgICBpZiAocENQID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBzaXplX3QgdHJhY2tDb3VudCA9IG1FeHRyYWN0b3ItPm1UcmFja3Muc2l6ZSgpOwogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tDb3VudDsgKytpbmRleCkgewpAQCAtNTA0LDYgKzUyNyw3IEBACiAgICAgLy8gQWx3YXlzICpzZWFyY2gqIGJhc2VkIG9uIHRoZSB2aWRlbyB0cmFjaywgYnV0IGZpbmFsaXplIGJhc2VkIG9uIG1UcmFja051bQogICAgIGlmICghcFRQKSB7CiAgICAgICAgIEFMT0dFKCJEaWQgbm90IGxvY2F0ZSB0aGUgdmlkZW8gdHJhY2sgZm9yIHNlZWtpbmciKTsKKyAgICAgICAgc2Vla3dpdGhvdXRjdWVfbChzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTU0Nyw2ICs1NzEsMzEgQEAKICAgICByZXR1cm4gKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5HZXRUaW1lKG1DbHVzdGVyKSArIDUwMGxsKSAvIDEwMDBsbDsKIH0KIAordm9pZCBCbG9ja0l0ZXJhdG9yOjpzZWVrd2l0aG91dGN1ZV9sKGludDY0X3Qgc2Vla1RpbWVVcywgaW50NjRfdCAqYWN0dWFsRnJhbWVUaW1lVXMpIHsKKyAgICBtQ2x1c3RlciA9IG1FeHRyYWN0b3ItPm1TZWdtZW50LT5GaW5kQ2x1c3RlcihzZWVrVGltZVVzICogMTAwMGxsKTsKKyAgICBjb25zdCBsb25nIHN0YXR1cyA9IG1DbHVzdGVyLT5HZXRGaXJzdChtQmxvY2tFbnRyeSk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsgIC8vIGVycm9yCisgICAgICAgIEFMT0dFKCJnZXQgbGFzdCBibG9ja2VucnkgZmFpbGVkISIpOworICAgICAgICBtQ2x1c3RlciA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJsb2NrRW50cnlJbmRleCA9IDA7CisgICAgd2hpbGUgKCFlb3MoKSAmJiAoKGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKSB8fCAoYmxvY2tUaW1lVXMoKSA8IHNlZWtUaW1lVXMpKSkgeworICAgICAgICBhZHZhbmNlX2woKTsKKyAgICB9CisKKyAgICAvLyB2aWRlbyB0cmFjayB3aWxsIHNlZWsgdG8gdGhlIG5leHQga2V5IGZyYW1lLgorICAgIGlmIChtVHJhY2tUeXBlID09IDEpIHsKKyAgICAgICAgd2hpbGUgKCFlb3MoKSAmJiAoKGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICFtQmxvY2tFbnRyeS0+R2V0QmxvY2soKS0+SXNLZXkoKSkpIHsKKyAgICAgICAgICAgIGFkdmFuY2VfbCgpOworICAgICAgICB9CisgICAgfQorICAgICphY3R1YWxGcmFtZVRpbWVVcyA9IGJsb2NrVGltZVVzKCk7CisgICAgIEFMT0dWKCJzZWVrVGltZVVzOiVsbGQsIGFjdHVhbEZyYW1lVGltZVVzOiVsbGQsIHRyYWNrbnVtOiVsbGQiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIChsb25nIGxvbmcpKmFjdHVhbEZyYW1lVGltZVVzLCAobG9uZyBsb25nKW1UcmFja051bSk7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0YXRpYyB1bnNpZ25lZCBVMjRfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CkBAIC01NzksNyArNjI4LDcgQEAKIAogdm9pZCBNYXRyb3NrYVNvdXJjZTo6Y2xlYXJQZW5kaW5nRnJhbWVzKCkgewogICAgIHdoaWxlICghbVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgewotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOwogICAgICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKIAogICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwpAQCAtNTg3LDcgKzYzNiw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlckJhc2UgKm1idWYpIHsKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVySGVscGVyICptYnVmKSB7CiAgICAgaWYgKG1idWYtPnJhbmdlX2xlbmd0aCgpIDwgMSB8fCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDEgPiBJTlQzMl9NQVgpIHsKICAgICAgICAgLy8gMS1ieXRlIHNpZ25hbAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtNjAxLDE3ICs2NTAsMTcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKICAgICBpZiAoZW5jcnlwdGVkKSB7CiAgICAgICAgIHVpbnQ4X3QgY3RyQ291bnRlclsxNl0gPSB7IDAgfTsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5SWQ7CiAgICAgICAgIHNpemVfdCBrZXlJZFNpemU7Ci0gICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAmdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOwotICAgICAgICBDSEVDSyh0cmFja01ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJnR5cGUsIChjb25zdCB2b2lkICoqKSZrZXlJZCwgJmtleUlkU2l6ZSkpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwga2V5SWQsIGtleUlkU2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLAorICAgICAgICAgICAgICAgICh2b2lkKiopJmtleUlkLCAma2V5SWRTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGtleUlkLCBrZXlJZFNpemUpOwogICAgICAgICBtZW1jcHkoY3RyQ291bnRlciwgZGF0YSArIDEsIDgpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBjdHJDb3VudGVyLCAxNik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGN0ckNvdW50ZXIsIDE2KTsKICAgICAgICAgaWYgKHBhcnRpdGlvbmVkKSB7CiAgICAgICAgICAgICAvKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQpAQCAtNjY0LDggKzcxMywxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdWludDMyX3Qgc2l6ZW9mUGxhaW5TaXplcyA9IHNpemVvZih1aW50MzJfdCkgKiBwbGFpblNpemVzLnNpemUoKTsKICAgICAgICAgICAgIHVpbnQzMl90IHNpemVvZkVuY3J5cHRlZFNpemVzID0gc2l6ZW9mKHVpbnQzMl90KSAqIGVuY3J5cHRlZFNpemVzLnNpemUoKTsKLSAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcy5kYXRhKCksIHNpemVvZlBsYWluU2l6ZXMpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMuZGF0YSgpLCBzaXplb2ZFbmNyeXB0ZWRTaXplcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBwbGFpblNpemVzLmRhdGEoKSwgc2l6ZW9mUGxhaW5TaXplcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkU2l6ZXMuZGF0YSgpLCBzaXplb2ZFbmNyeXB0ZWRTaXplcyk7CiAgICAgICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoZnJhbWVPZmZzZXQsIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gZnJhbWVPZmZzZXQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyoKQEAgLTY4NSw4ICs3MzYsMTAgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IDAgfTsKICAgICAgICAgICAgIGludDMyX3QgZW5jcnlwdGVkU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KSB9OwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKKyAgICAgICAgICAgICAgICAgICAgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CiAgICAgICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoOSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC03MDMsMTkgKzc1NiwyMSBAQAogICAgICAgICAgKi8KICAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IHN0YXRpY19jYXN0PGludDMyX3Q+KG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSkgfTsKICAgICAgICAgaW50MzJfdCBlbmNyeXB0ZWRTaXplc1tdID0geyAwIH07Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKLSAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgIHBsYWluU2l6ZXMsIHNpemVvZihwbGFpblNpemVzKSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKICAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKDEsIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZEJsb2NrKCkgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWRCbG9jaygpIHsKICAgICBDSEVDSyhtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKTsKIAogICAgIGlmIChtQmxvY2tJdGVyLmVvcygpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBtQmxvY2tJdGVyLmJsb2NrKCk7CkBAIC03MjcsMTggKzc4MiwyMSBAQAogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrOjpGcmFtZSAmZnJhbWUgPSBibG9jay0+R2V0RnJhbWUoaSk7CiAgICAgICAgIHNpemVfdCBsZW4gPSBmcmFtZS5sZW47CiAgICAgICAgIGlmIChTSVpFX01BWCAtIGxlbiA8IHRyYWNrSW5mby0+bUhlYWRlckxlbikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKICAgICAgICAgbGVuICs9IHRyYWNrSW5mby0+bUhlYWRlckxlbjsKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUobGVuKTsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1idWY7CisgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1idWYsIGZhbHNlIC8qIG5vbmJsb2NraW5nICovLCBsZW4gLyogcmVxdWVzdGVkIHNpemUgKi8pOworICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMCwgbGVuKTsKICAgICAgICAgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWJ1Zi0+ZGF0YSgpKTsKICAgICAgICAgaWYgKHRyYWNrSW5mby0+bUhlYWRlcikgewogICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHRyYWNrSW5mby0+bUhlYWRlciwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKTsKICAgICAgICAgfQogCi0gICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGJsb2NrLT5Jc0tleSgpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIGJsb2NrLT5Jc0tleSgpKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBmcmFtZS5SZWFkKG1FeHRyYWN0b3ItPm1SZWFkZXIsIGRhdGEgKyB0cmFja0luZm8tPm1IZWFkZXJMZW4pOwogICAgICAgICBpZiAoZXJyID09IE9LCkBAIC03NTIsNyArODEwLDcgQEAKIAogICAgICAgICAgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7CiAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAKICAgICAgICAgbVBlbmRpbmdGcmFtZXMucHVzaF9iYWNrKG1idWYpOwpAQCAtNzYwLDExICs4MTgsMTkzIEBACiAKICAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworLy90aGUgdmFsdWUgb2Yga01QM0hlYWRlck1hc2sgaXMgZnJvbSBNUDNFeHRyYWN0b3IKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTVAzSGVhZGVyTWFzayA9IDB4ZmZmZTBjMDA7CisKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpmaW5kTVAzSGVhZGVyKHVpbnQzMl90ICogaGVhZGVyLAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhU291cmNlLCBpbnQgbGVuZ3RoLCBpbnQgKm91dFN0YXJ0UG9zKSB7CisgICAgaWYgKE5VTEwgPT0gaGVhZGVyKSB7CisgICAgICAgIEFMT0dFKCJoZWFkZXIgaXMgbnVsbCEiKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIC8vdG8gZmluZCBoZWFkZXIgc3RhcnQgcG9zaXRpb24KKyAgICBpZiAoMCAhPSAqaGVhZGVyKSB7CisgICAgICAgIGlmIChOVUxMID09IGRhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgICpvdXRTdGFydFBvcyA9IC0xOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCB0bXBDb2RlID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdG1wQ29kZSA9ICh0bXBDb2RlIDw8IDgpICsgZGF0YVNvdXJjZVtpXTsKKyAgICAgICAgICAgIGlmICgodG1wQ29kZSAmIGtNUDNIZWFkZXJNYXNrKSA9PSAoKmhlYWRlciAmIGtNUDNIZWFkZXJNYXNrKSkgeworICAgICAgICAgICAgICAgICpvdXRTdGFydFBvcyA9IGkgLSAzOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKm91dFN0YXJ0UG9zID0gLTE7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorCisgICAgLy90byBmaW5kIG1wMyBoZWFkZXIKKyAgICB1aW50MzJfdCBjb2RlID0gMDsKKyAgICB3aGlsZSAoMCA9PSAqaGVhZGVyKSB7CisgICAgICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IGZyYW1lLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIHNpemVfdCBmcmFtZV9zaXplOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBBTE9HVigiZGF0YVslenVdPSV4IiwgaSwgKigodWludDhfdCopZnJhbWUtPmRhdGEoKSArIG9mZnNldCArIGkpKTsKKyAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA4KSArICooKHVpbnQ4X3QqKWZyYW1lLT5kYXRhKCkgKyBvZmZzZXQgKyBpKTsKKyAgICAgICAgICAgIGlmIChHZXRNUEVHQXVkaW9GcmFtZVNpemUoY29kZSwgJmZyYW1lX3NpemUsIE5VTEwsIE5VTEwsIE5VTEwpKSB7CisgICAgICAgICAgICAgICAgKmhlYWRlciA9IGNvZGU7CisgICAgICAgICAgICAgICAgbUJsb2NrSXRlci5yZXNldCgpOworICAgICAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07Cit9CisKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjptcDNGcmFtZVJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucywKKyAgICAgICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMpIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDY0KGZyYW1lLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAmbUN1cnJlbnRUUykpOworICAgICAgICBpZiAobUN1cnJlbnRUUyA8IDApIHsKKyAgICAgICAgICAgIG1DdXJyZW50VFMgPSAwOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZyYW1lLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCBtQ3VycmVudFRTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3Qgc3RhcnQgPSAtMTsKKyAgICB3aGlsZSAoc3RhcnQgPCAwKSB7CisgICAgICAgIC8vZmluZCBoZWFkZXIgc3RhcnQgcG9zaXRpb24KKyAgICAgICAgZmluZE1QM0hlYWRlcigmbU1QM0hlYWRlciwKKyAgICAgICAgICAgIChjb25zdCB1aW50OF90KilmcmFtZS0+ZGF0YSgpICsgZnJhbWUtPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgZnJhbWUtPnJhbmdlX2xlbmd0aCgpLCAmc3RhcnQpOworICAgICAgICBBTE9HVigic3RhcnQ9JWQsIGZyYW1lLT5yYW5nZV9sZW5ndGgoKSA9ICV6dSwgZnJhbWUtPnJhbmdlX29mZnNldCgpID0lenUiLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBmcmFtZS0+cmFuZ2VfbGVuZ3RoKCksIGZyYW1lLT5yYW5nZV9vZmZzZXQoKSk7CisgICAgICAgIGlmIChzdGFydCA+PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CisgICAgICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOworICAgICAgICB3aGlsZSAobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gcmVhZEJsb2NrKCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgIH0KKworICAgIGZyYW1lLT5zZXRfcmFuZ2UoZnJhbWUtPnJhbmdlX29mZnNldCgpICsgc3RhcnQsIGZyYW1lLT5yYW5nZV9sZW5ndGgoKSAtIHN0YXJ0KTsKKworICAgIHVpbnQzMl90IGhlYWRlciA9ICoodWludDMyX3QqKSgodWludDhfdCopZnJhbWUtPmRhdGEoKSArIGZyYW1lLT5yYW5nZV9vZmZzZXQoKSk7CisgICAgaGVhZGVyID0gKChoZWFkZXIgPj4gMjQpICYgMHhmZikgfCAoKGhlYWRlciA+PiA4KSAmIDB4ZmYwMCkgfAorICAgICAgICAgICAgICAgICAgICAoKGhlYWRlciA8PCA4KSAmIDB4ZmYwMDAwKSB8ICgoaGVhZGVyIDw8IDI0KSAmIDB4ZmYwMDAwMDApOworICAgIHNpemVfdCBmcmFtZV9zaXplOworICAgIGludCBvdXRfc2FtcGxpbmdfcmF0ZTsKKyAgICBpbnQgb3V0X2NoYW5uZWxzOworICAgIGludCBvdXRfYml0cmF0ZTsKKyAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZShoZWFkZXIsICZmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfc2FtcGxpbmdfcmF0ZSwgJm91dF9jaGFubmVscywgJm91dF9iaXRyYXRlKSkgeworICAgICAgICBBTE9HRSgiTVAzIEhlYWRlciByZWFkIGZhaWwhISIpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyLCBmYWxzZSAvKiBub25ibG9ja2luZyAqLywgZnJhbWVfc2l6ZSAvKiByZXF1ZXN0ZWQgc2l6ZSAqLyk7CisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7CisKKyAgICB1aW50OF90ICpkYXRhID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihidWZmZXItPmRhdGEoKSk7CisgICAgQUxPR1YoIk1QMyBmcmFtZSAlenUgZnJhbWUtPnJhbmdlX2xlbmd0aCgpICV6dSIsIGZyYW1lX3NpemUsIGZyYW1lLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICBpZiAoZnJhbWVfc2l6ZSA+IGZyYW1lLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICBtZW1jcHkoZGF0YSwgKHVpbnQ4X3QqKShmcmFtZS0+ZGF0YSgpKSArIGZyYW1lLT5yYW5nZV9vZmZzZXQoKSwgZnJhbWUtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgc2l6ZV90IHN1bVNpemUgPSAwOworICAgICAgICBzdW1TaXplICs9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgc2l6ZV90IG5lZWRTaXplID0gZnJhbWVfc2l6ZSAtIGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKKyAgICAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7CisgICAgICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIHNpemVfdCBzaXplID0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOworCisgICAgICAgIC8vIHRoZSBuZXh0IGJ1ZmZlciBmcmFtZSBpcyBub3QgZW5vdWdoIHRvIGZ1bGxmaWxsIG1wMyBmcmFtZSwKKyAgICAgICAgLy8gd2UgaGF2ZSB0byByZWFkIHVudGlsIG1wMyBmcmFtZSBpcyBjb21wbGV0ZWQuCisgICAgICAgIHdoaWxlIChzaXplIDwgbmVlZFNpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShkYXRhICsgc3VtU2l6ZSwgKHVpbnQ4X3QqKShmcmFtZS0+ZGF0YSgpKSArIG9mZnNldCwgc2l6ZSk7CisgICAgICAgICAgICBuZWVkU2l6ZSAtPSBzaXplOworICAgICAgICAgICAgc3VtU2l6ZSArPSBzaXplOworICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOworICAgICAgICAgICAgd2hpbGUgKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgICAgICBvZmZzZXQgPSBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgICAgICBzaXplID0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOworICAgICAgICB9CisgICAgICAgIG1lbWNweShkYXRhICsgc3VtU2l6ZSwgKHVpbnQ4X3QqKShmcmFtZS0+ZGF0YSgpKSArIG9mZnNldCwgbmVlZFNpemUpOworICAgICAgICBmcmFtZS0+c2V0X3JhbmdlKG9mZnNldCArIG5lZWRTaXplLCBzaXplIC0gbmVlZFNpemUpOworICAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gZnJhbWUtPnJhbmdlX29mZnNldCgpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgbWVtY3B5KGRhdGEsICh1aW50OF90KikoZnJhbWUtPmRhdGEoKSkgKyBvZmZzZXQsIGZyYW1lX3NpemUpOworICAgICAgICBmcmFtZS0+c2V0X3JhbmdlKG9mZnNldCArIGZyYW1lX3NpemUsIHNpemUgLSBmcmFtZV9zaXplKTsKKyAgICB9CisgICAgaWYgKGZyYW1lLT5yYW5nZV9sZW5ndGgoKSA8IDQpIHsKKyAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKKyAgICAgICAgZnJhbWUgPSBOVUxMOworICAgICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKKyAgICB9CisgICAgQUxPR1YoIk1hdHJvc2thU291cmNlOjpyZWFkIE1QMyBmcmFtZSBrS2V5VGltZT0lbGxkLGtLZXlUYXJnZXRUaW1lPSVsbGQiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1DdXJyZW50VFMsIChsb25nIGxvbmcpdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmZmVyLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUUyk7CisgICAgbUN1cnJlbnRUUyArPSAoaW50NjRfdClmcmFtZV9zaXplICogODAwMGxsIC8gb3V0X2JpdHJhdGU7CisKKyAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1ZmZlci0+bWV0YV9kYXRhKCksCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAqb3V0ID0gYnVmZmVyOworICAgIEFMT0dWKCJNYXRyb3NrYVNvdXJjZTo6cmVhZCBNUDMsIGtleVRpbWU9JWxsZCBmb3IgbmV4dCBmcmFtZSIsIChsb25nIGxvbmcpbUN1cnJlbnRUUyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMgPSAtMWxsOwpAQCAtNzczLDcgKzEwMTMsNyBAQAogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtRXh0cmFjdG9yLT5pc0xpdmVTdHJlYW1pbmcoKSkgewpAQCAtNzkxLDcgKzEwMzEsNyBAQAogICAgIH0KIAogICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOworICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKQEAgLTgwMCwxOCArMTA0MCwyMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgIGlmIChtVHlwZSA9PSBNUDMpIHsKKyAgICAgICAgcmV0dXJuIG1wM0ZyYW1lUmVhZChvdXQsIG9wdGlvbnMsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgfQorCisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CiAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7CiAKICAgICBpZiAoKG1UeXBlICE9IEFWQyAmJiBtVHlwZSAhPSBIRVZDKSB8fCBtTkFMU2l6ZUxlbiA9PSAwKSB7CiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMGxsKSB7Ci0gICAgICAgICAgICBmcmFtZS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZyYW1lLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgICpvdXQgPSBmcmFtZTsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQogCiAgICAgLy8gRWFjaCBpbnB1dCBmcmFtZSBjb250YWlucyBvbmUgb3IgbW9yZSBOQUwgZnJhZ21lbnRzLCBlYWNoIGZyYWdtZW50CkBAIC04MjksNyArMTA3Myw3IEBACiAgICAgc2l6ZV90IHNyY1NpemUgPSBmcmFtZS0+cmFuZ2VfbGVuZ3RoKCk7CiAKICAgICBzaXplX3QgZHN0U2l6ZSA9IDA7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBOVUxMOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBOVUxMOwogICAgIHVpbnQ4X3QgKmRzdFB0ciA9IE5VTEw7CiAKICAgICBmb3IgKGludDMyX3QgcGFzcyA9IDA7IHBhc3MgPCAyOyArK3Bhc3MpIHsKQEAgLTg1MCw3ICsxMDk0LDcgQEAKICAgICAgICAgICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIGZyYW1lID0gTlVMTDsKIAotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY09mZnNldCArIG1OQUxTaXplTGVuICsgTkFMc2l6ZSA+IHNyY1NpemUpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTg3OCw3ICsxMTIyLDcgQEAKICAgICAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBmcmFtZSA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChwYXNzID09IDApIHsKQEAgLTg4OSwxNiArMTEzMywyMCBAQAogICAgICAgICAgICAgICAgIC8vIGVhY2ggNC1ieXRlIG5hbCBzaXplIHdpdGggYSA0LWJ5dGUgc3RhcnQgY29kZQogICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGZyYW1lOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShkc3RTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwgZmFsc2UgLyogbm9uYmxvY2tpbmcgKi8sIGRzdFNpemUgLyogcmVxdWVzdGVkIHNpemUgKi8pOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdFNpemUpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmZyYW1lTWV0YSA9IGZyYW1lLT5tZXRhX2RhdGEoKTsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgQ0hFQ0soZnJhbWUtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDY0KGZyYW1lTWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAmdGltZVVzKSk7CiAgICAgICAgICAgICBpbnQzMl90IGlzU3luYzsKLSAgICAgICAgICAgIENIRUNLKGZyYW1lLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKSk7CisgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZnJhbWVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsICZpc1N5bmMpKTsKIAotICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBpc1N5bmMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICpidWZNZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmTWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCBpc1N5bmMpOwogCiAgICAgICAgICAgICBkc3RQdHIgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICB9CkBAIC05MTAsMTggKzExNTgsNzEgQEAKICAgICB9CiAKICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkgewotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmZmVyLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgIH0KIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTWF0cm9za2FFeHRyYWN0b3I6Ok1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisvLyB0cmFucyBhbGwgRk9VUkNDICB0byBsb3dlciBjaGFyCitzdGF0aWMgdWludDMyX3QgRm91ckNDdG9Mb3dlcih1aW50MzJfdCBmb3VyY2MpIHsKKyAgICB1aW50OF90IGNoXzEgPSB0b2xvd2VyKChmb3VyY2MgPj4gMjQpICYgMHhmZik7CisgICAgdWludDhfdCBjaF8yID0gdG9sb3dlcigoZm91cmNjID4+IDE2KSAmIDB4ZmYpOworICAgIHVpbnQ4X3QgY2hfMyA9IHRvbG93ZXIoKGZvdXJjYyA+PiA4KSAmIDB4ZmYpOworICAgIHVpbnQ4X3QgY2hfNCA9IHRvbG93ZXIoKGZvdXJjYykgJiAweGZmKTsKKyAgICB1aW50MzJfdCBmb3VyY2Nfb3V0ID0gY2hfMSA8PCAyNCB8IGNoXzIgPDwgMTYgfCBjaF8zIDw8IDggfCBjaF80OworCisgICAgcmV0dXJuIGZvdXJjY19vdXQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpNS1ZGb3VyQ0MyTUlNRSh1aW50MzJfdCBmb3VyY2MpIHsKKyAgICBBTE9HVigiTUtWRm91ckNDMk1JTUUgZm91cmNjIDB4JTguOHgiLCBmb3VyY2MpOworICAgIHVpbnQzMl90IGxvd2VyRm91cmNjID0gRm91ckNDdG9Mb3dlcihmb3VyY2MpOworICAgIHN3aXRjaCAobG93ZXJGb3VyY2MpIHsKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1wNHYiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKKworICAgICAgICBjYXNlIEZPVVJDQygiczI2MyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaDI2MyIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjM7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF2YzEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImgyNjQiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1wZzIiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMjsKKworICAgICAgICBjYXNlIEZPVVJDQygieHZpZCIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQ7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImRpdngiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImR4NTAiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYOworCisgICAgICAgIGNhc2UgRk9VUkNDKCJkaXYzIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJkaXY0Iik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDM7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1qcGciKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1wcGciKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NSlBFRzsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2hhciBmb3VyY2NTdHJpbmdbNV07CisgICAgICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGZvdXJjYywgZm91cmNjU3RyaW5nKTsKKyAgICAgICAgICAgIEFMT0dXKCJta3YgdW5zdXBwb3J0IGZvdXJjYyAlcyIsIGZvdXJjY1N0cmluZyk7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgfQorfQorCisKK01hdHJvc2thRXh0cmFjdG9yOjpNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVJlYWRlcihuZXcgRGF0YVNvdXJjZUJhc2VSZWFkZXIobURhdGFTb3VyY2UpKSwKICAgICAgIG1TZWdtZW50KE5VTEwpLApAQCAtOTUzLDE3ICsxMjU0LDU2IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBmcm9tIG1rdnBhcnNlcjo6U2VnbWVudDo6TG9hZCgpLCBidXQgc3RvcCBhdCBmaXJzdCBjbHVzdGVyCi0gICAgcmV0ID0gbVNlZ21lbnQtPlBhcnNlSGVhZGVycygpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICBsb25nIGxlbjsKLSAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKLSAgICAgICAgaWYgKHJldCA+PSAxKSB7Ci0gICAgICAgICAgICAvLyBubyBtb3JlIGNsdXN0ZXJzCi0gICAgICAgICAgICByZXQgPSAwOworICAgIGlmIChtSXNMaXZlU3RyZWFtaW5nKSB7CisgICAgICAgIC8vIGZyb20gbWt2cGFyc2VyOjpTZWdtZW50OjpMb2FkKCksIGJ1dCBzdG9wIGF0IGZpcnN0IGNsdXN0ZXIKKyAgICAgICAgcmV0ID0gbVNlZ21lbnQtPlBhcnNlSGVhZGVycygpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIGxvbmcgbGVuOworICAgICAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMSkgeworICAgICAgICAgICAgICAgIC8vIG5vIG1vcmUgY2x1c3RlcnMKKyAgICAgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEw7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKLSAgICAgICAgcmV0ID0gbWt2cGFyc2VyOjpFX0JVRkZFUl9OT1RfRlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBtU2VnbWVudC0+UGFyc2VIZWFkZXJzKCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiU2VnbWVudCBwYXJzZSBoZWFkZXIgcmV0dXJuIGZhaWwgJWxsZCIsIHJldCk7CisgICAgICAgICAgICBkZWxldGUgbVNlZ21lbnQ7CisgICAgICAgICAgICBtU2VnbWVudCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlcyogbUN1ZXMgPSBtU2VnbWVudC0+R2V0Q3VlcygpOworICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpTZWVrSGVhZCogbVNIID0gbVNlZ21lbnQtPkdldFNlZWtIZWFkKCk7CisgICAgICAgICAgICBpZiAoKG1DdWVzID09IE5VTEwpICYmIChtU0ggIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgY291bnQgPSBtU0gtPkdldENvdW50KCk7CisgICAgICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpTZWVrSGVhZDo6RW50cnkqIG1FbnRyeTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgbUVudHJ5ID0gbVNILT5HZXRFbnRyeShpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRW50cnktPmlkID09IDB4MEM1M0JCNkIpIHsgIC8vIEN1ZXMgSUQKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nIHBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZWdtZW50LT5QYXJzZUN1ZXMobUVudHJ5LT5wb3MsIHBvcywgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdWVzID0gbVNlZ21lbnQtPkdldEN1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaW5kIGN1ZSBkYXRhIGJ5IHNlZWtoZWFkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1DdWVzKSB7CisgICAgICAgICAgICAgICAgbG9uZyBsZW47CisgICAgICAgICAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiaGFzIEN1ZSBkYXRhLCBDbHVzdGVyIG51bT0lbGQiLCBtU2VnbWVudC0+R2V0Q291bnQoKSk7CisgICAgICAgICAgICB9IGVsc2UgIHsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXR1c19Mb2FkID0gbVNlZ21lbnQtPkxvYWQoKTsKKyAgICAgICAgICAgICAgICBBTE9HVygibm8gQ3VlIGRhdGEsU2VnbWVudCBMb2FkIHN0YXR1czolbGQiLHN0YXR1c19Mb2FkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICByZXQgPSBta3ZwYXJzZXI6OkVfQlVGRkVSX05PVF9GVUxMOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHJldCA8IDApIHsKQEAgLTk5NCwxMyArMTMzNCwxNSBAQAogCiAgICAgZGVsZXRlIG1SZWFkZXI7CiAgICAgbVJlYWRlciA9IE5VTEw7CisKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIHNpemVfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwogfQogCi1NZWRpYVRyYWNrICpNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEwMDgsMTEgKzEzNTAsMTEgQEAKICAgICByZXR1cm4gbmV3IE1hdHJvc2thU291cmNlKHRoaXMsIGluZGV4KTsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBpZiAoKGZsYWdzICYga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSkgJiYgIW1FeHRyYWN0ZWRUaHVtYm5haWxzCkBAIC0xMDIxLDggKzEzNjMsNyBAQAogICAgICAgICBtRXh0cmFjdGVkVGh1bWJuYWlscyA9IHRydWU7CiAgICAgfQogCi0gICAgbWV0YSA9IG1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YSk7CiB9CiAKIGJvb2wgTWF0cm9za2FFeHRyYWN0b3I6OmlzTGl2ZVN0cmVhbWluZygpIGNvbnN0IHsKQEAgLTEwNTcsNyArMTM5OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgYm9vbCBpc0F1ZGlvLCBjb25zdCB2b2lkICpwcml2LCBzaXplX3QgcHJpdlNpemUpIHsKIAogICAgIGludCBwcml2U2l6ZUJ5dGVzUmVxdWlyZWQgPSBieXRlc0ZvclNpemUocHJpdlNpemUpOwpAQCAtMTA4NSwxNCArMTQyNiwxNCBAQAogICAgIHN0b3JlU2l6ZShlc2RzLCBpZHgsIHByaXZTaXplKTsKICAgICBtZW1jcHkoZXNkcyArIGlkeCwgcHJpdiwgcHJpdlNpemUpOwogCi0gICAgbWV0YS5zZXREYXRhKGtLZXlFU0RTLCAwLCBlc2RzLCBlc2RzU2l6ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBwcml2LCBwcml2U2l6ZSk7CiAKICAgICBkZWxldGVbXSBlc2RzOwogICAgIGVzZHMgPSBOVUxMOwogfQogCiBzdGF0dXNfdCBhZGRWb3JiaXNDb2RlY0luZm8oCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCB2b2lkICpfY29kZWNQcml2YXRlLCBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSkgewogICAgIC8vIGhleGR1bXAoX2NvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAKQEAgLTExNTAsNyArMTQ5MSw4IEBACiAgICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDEpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgbWV0YS5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCAmY29kZWNQcml2YXRlW29mZnNldF0sIGxlbjEpOworICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNJbmZvCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmY29kZWNQcml2YXRlW29mZnNldF0sIGxlbjEpOwogCiAgICAgb2Zmc2V0ICs9IGxlbjE7CiAgICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDMpIHsKQEAgLTExNjIsMTkgKzE1MDQsMjAgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBtZXRhLnNldERhdGEoCi0gICAgICAgICAgICBrS2V5Vm9yYmlzQm9va3MsIDAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwKLSAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgLSBvZmZzZXQpOworICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNCb29rcworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwKKyAgICAgICAgICAgICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgY29kZWNQcml2YXRlU2l6ZSAtIG9mZnNldCk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBhZGRGbGFjTWV0YWRhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCB2b2lkICpjb2RlY1ByaXZhdGUsIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplKSB7CiAgICAgLy8gaGV4ZHVtcChjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogCi0gICAgbWV0YS5zZXREYXRhKGtLZXlGbGFjTWV0YWRhdGEsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgLy8gZm9ybWVybHkga0tleUZsYWNNZXRhZGF0YQorICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKIAogICAgIGludDMyX3QgbWF4SW5wdXRTaXplID0gNjQgPDwgMTA7CiAgICAgRkxBQ0RlY29kZXIgKmZsYWNEZWNvZGVyID0gRkxBQ0RlY29kZXI6OkNyZWF0ZSgpOwpAQCAtMTE5Niw3ICsxNTM5LDcgQEAKICAgICAgICAgICAgICAgICAqIHN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIHN0cmVhbUluZm8uY2hhbm5lbHM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhJbnB1dFNpemUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtYXhJbnB1dFNpemUpOwogCiAgICAgZGVsZXRlIGZsYWNEZWNvZGVyOwogICAgIHJldHVybiBPSzsKQEAgLTEyMjUsMTAgKzE1NjgsOTMgQEAKICAgICB9CiAKICAgICAvLyBPdmVycmlkZSB0aGUgc3ludGhlc2l6ZWQgbmFsIGxlbmd0aCBzaXplLCB3aGljaCBpcyBhcmJpdHJhcnkKLSAgICB0cmFja0luZm8tPm1NZXRhLnNldEludDMyKGtLZXlOYWxMZW5ndGhTaXplLCAwKTsKKyAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gMDsKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpzeW50aGVzaXplTVBFRzIoVHJhY2tJbmZvICp0cmFja0luZm8sIHNpemVfdCBpbmRleCkgeworICAgIEFMT0dWKCJzeW50aGVzaXplTVBFRzIiKTsKKyAgICBCbG9ja0l0ZXJhdG9yIGl0ZXIodGhpcywgdHJhY2tJbmZvLT5tVHJhY2tOdW0sIGluZGV4KTsKKyAgICBpZiAoaXRlci5lb3MoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2sgKmJsb2NrID0gaXRlci5ibG9jaygpOworICAgIGlmIChibG9jay0+R2V0RnJhbWVDb3VudCgpIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrOjpGcmFtZSAmZnJhbWUgPSBibG9jay0+R2V0RnJhbWUoMCk7CisgICAgYXV0byB0bXBEYXRhID0gaGVhcGJ1ZmZlcjx1bnNpZ25lZCBjaGFyPihmcmFtZS5sZW4pOworICAgIGxvbmcgbiA9IGZyYW1lLlJlYWQobVJlYWRlciwgdG1wRGF0YS5nZXQoKSk7CisgICAgaWYgKG4gIT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHNpemVfdCBoZWFkZXJfc3RhcnQgPSAwOworICAgIHNpemVfdCBoZWFkZXJfbGVudGggPSAwOworICAgIGZvciAoaGVhZGVyX3N0YXJ0ID0gMDsgaGVhZGVyX3N0YXJ0IDwgZnJhbWUubGVuIC0gNDsgaGVhZGVyX3N0YXJ0KyspIHsKKyAgICAgICAgaWYgKG50b2hsKDB4MDAwMDAxYjMpID09ICoodWludDMyX3QqKSgodWludDhfdCopdG1wRGF0YS5nZXQoKSArIGhlYWRlcl9zdGFydCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgaXNDb21wbGV0ZV9jc2QgPSBmYWxzZTsKKyAgICBmb3IgKGhlYWRlcl9sZW50aCA9IDA7IGhlYWRlcl9sZW50aCA8IGZyYW1lLmxlbiAtIDQgLSBoZWFkZXJfc3RhcnQ7IGhlYWRlcl9sZW50aCsrKSB7CisgICAgICAgIGlmIChudG9obCgweDAwMDAwMWI4KSA9PSAqKHVpbnQzMl90KikoKHVpbnQ4X3QqKXRtcERhdGEuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBoZWFkZXJfc3RhcnQgKyBoZWFkZXJfbGVudGgpKSB7CisgICAgICAgICAgICBpc0NvbXBsZXRlX2NzZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWlzQ29tcGxldGVfY3NkKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBwYXJzZSBjb21wbGV0ZSBjc2QgZm9yIE1QRUcyISIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSh0cmFja0luZm8tPm1NZXRhLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KikodG1wRGF0YS5nZXQoKSkgKyBoZWFkZXJfc3RhcnQsIGhlYWRlcl9sZW50aCk7CisKKyAgICByZXR1cm4gT0s7CisKK30KKworc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OnN5bnRoZXNpemVNUEVHNChUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KSB7CisgICAgQUxPR1YoInN5bnRoZXNpemVNUEVHNCIpOworICAgIEJsb2NrSXRlcmF0b3IgaXRlcih0aGlzLCB0cmFja0luZm8tPm1UcmFja051bSwgaW5kZXgpOworICAgIGlmIChpdGVyLmVvcygpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBpdGVyLmJsb2NrKCk7CisgICAgaWYgKGJsb2NrLT5HZXRGcmFtZUNvdW50KCkgPD0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZSgwKTsKKyAgICBhdXRvIHRtcERhdGEgPSBoZWFwYnVmZmVyPHVuc2lnbmVkIGNoYXI+KGZyYW1lLmxlbik7CisgICAgbG9uZyBuID0gZnJhbWUuUmVhZChtUmVhZGVyLCB0bXBEYXRhLmdldCgpKTsKKyAgICBpZiAobiAhPSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgIHNpemVfdCB2b3NlbmQ7CisgICAgIGJvb2wgaXNDb21wbGV0ZV9jc2QgPSBmYWxzZTsKKyAgICAgZm9yICh2b3NlbmQgPSAwOyAobG9uZyl2b3NlbmQgPCBmcmFtZS5sZW4gLSA0OyB2b3NlbmQrKykgeworICAgICAgICAgaWYgKG50b2hsKDB4MDAwMDAxYjYpID09ICoodWludDMyX3QqKSgodWludDhfdCopdG1wRGF0YS5nZXQoKSArIHZvc2VuZCkpIHsKKyAgICAgICAgICAgICBpc0NvbXBsZXRlX2NzZCA9IHRydWU7CisgICAgICAgICAgICAgYnJlYWs7ICAvLyBTZW5kIFZPUyB1bnRpbCBWT1AKKyAgICAgICAgIH0KKyAgICAgfQorICAgICBpZiAoIWlzQ29tcGxldGVfY3NkKSB7CisgICAgICAgICBBTE9HRSgiY2FuJ3QgcGFyc2UgY29tcGxldGUgY3NkIGZvciBNUEVHNCEiKTsKKyAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgIH0KKyAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUodHJhY2tJbmZvLT5tTWV0YSwgZmFsc2UsIHRtcERhdGEuZ2V0KCksIHZvc2VuZCk7CisKKyAgICByZXR1cm4gT0s7CisKK30KKworCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZEludDMyQ29sb3VyVmFsdWUobG9uZyBsb25nIHZhbHVlKSB7CiAgICAgcmV0dXJuIHZhbHVlICE9IG1rdnBhcnNlcjo6Q29sb3VyOjprVmFsdWVOb3RQcmVzZW50CiAgICAgICAgICAgICAmJiB2YWx1ZSA+PSBJTlQzMl9NSU4KQEAgLTEyNDcsNyArMTY3Myw3IEBACiB9CiAKIHZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmdldENvbG9ySW5mb3JtYXRpb24oCi0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLCBNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2ssIEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29sb3VyICpjb2xvciA9IHZ0cmFjay0+R2V0Q29sb3VyKCk7CiAgICAgaWYgKGNvbG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTI1Niw3ICsxNjgyLDcgQEAKICAgICAvLyBDb2xvciBBc3BlY3RzCiAgICAgewogICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCisgICAgICAgIGludDMyX3QgaXNvdHJhbnNmZXIgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKICAgICAgICAgaW50MzJfdCBjb2VmZnMgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKICAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSBmYWxzZTsgLy8gZGVmYXVsdAogICAgICAgICBib29sIHJhbmdlU3BlY2lmaWVkID0gZmFsc2U7CkBAIC0xMjY1LDcgKzE2OTEsNyBAQAogICAgICAgICAgICAgcHJpbWFyaWVzID0gY29sb3ItPnByaW1hcmllczsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcykpIHsKLSAgICAgICAgICAgIHRyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIGlzb3RyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHMpKSB7CiAgICAgICAgICAgICBjb2VmZnMgPSBjb2xvci0+bWF0cml4X2NvZWZmaWNpZW50czsKQEAgLTEyNzgsMTQgKzE3MDQsMjEgQEAKICAgICAgICAgICAgIHJhbmdlU3BlY2lmaWVkID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDb2xvck1hdHJpeCwgYXNwZWN0cy5tTWF0cml4Q29lZmZzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICBrS2V5Q29sb3JSYW5nZSwgcmFuZ2VTcGVjaWZpZWQgPyBhc3BlY3RzLm1SYW5nZSA6IENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCk7CisgICAgICAgIGludDMyX3QgcmFuZ2UgPSAwOworICAgICAgICBpbnQzMl90IHN0YW5kYXJkID0gMDsKKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDA7CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgICAgICAgICBwcmltYXJpZXMsIGlzb3RyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwKKyAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKyAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCByYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLCB0cmFuc2Zlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBIRFIgU3RhdGljIEluZm8KQEAgLTEzMjksMjYgKzE3NjIsMjggQEAKICAgICAgICAgLy8gT25seSBhZHZlcnRpc2Ugc3RhdGljIGluZm8gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBncm91cHMgaGF2ZSBiZWVuIHNwZWNpZmllZC4KICAgICAgICAgaWYgKG1lbWNtcCgmaW5mbywgJm51bGxJbmZvLCBzaXplb2YoaW5mbykpICE9IDApIHsKICAgICAgICAgICAgIGluZm8ubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlIZHJTdGF0aWNJbmZvLCAnaGRyUycsICZpbmZvLCBzaXplb2YoaW5mbykpOworICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoaW5mbywgbWV0YSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjppbml0VHJhY2tJbmZvKAotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgTWV0YURhdGFCYXNlICZtZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgeworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgQU1lZGlhRm9ybWF0ICptZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgewogICAgIHRyYWNrSW5mby0+bVRyYWNrTnVtID0gdHJhY2stPkdldE51bWJlcigpOwogICAgIHRyYWNrSW5mby0+bU1ldGEgPSBtZXRhOwogICAgIHRyYWNrSW5mby0+bUV4dHJhY3RvciA9IHRoaXM7CiAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gZmFsc2U7CiAgICAgdHJhY2tJbmZvLT5tSGVhZGVyID0gTlVMTDsKICAgICB0cmFja0luZm8tPm1IZWFkZXJMZW4gPSAwOworICAgIHRyYWNrSW5mby0+bU5hbExlbmd0aFNpemUgPSAtMTsKIAogICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQ291bnQoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nICplbmNvZGluZyA9IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdCeUluZGV4KGkpOwogICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpOyBqKyspIHsKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50RW5jcnlwdGlvbiAqZW5jcnlwdGlvbjsKICAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoaik7Ci0gICAgICAgICAgICB0cmFja0luZm8tPm1NZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2tJbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBlbmNyeXB0aW9uLT5rZXlfaWQsIGVuY3J5cHRpb24tPmtleV9pZF9sZW4pOwogICAgICAgICAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzk3LDkgKzE4MzIsMTIgQEAKIAogICAgICAgICBlbnVtIHsgVklERU9fVFJBQ0sgPSAxLCBBVURJT19UUkFDSyA9IDIgfTsKIAotICAgICAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICBpbnQzMl90IG5hbFNpemUgPSAtMTsKKworICAgICAgICBib29sIGlzU2V0Q3NkRnJvbTFzdEZyYW1lID0gZmFsc2U7CiAKICAgICAgICAgc3dpdGNoICh0cmFjay0+R2V0VHlwZSgpKSB7CiAgICAgICAgICAgICBjYXNlIFZJREVPX1RSQUNLOgpAQCAtMTQwOCwzNyArMTg0Niw4OSBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKj4odHJhY2spOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5QVZDQywgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYWxTaXplID0gMSArIChjb2RlY1ByaXZhdGVbNF0gJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUEVHSC9JU08vSEVWQyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMTQgKyA3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsU2l6ZSA9IDEgKyAoY29kZWNQcml2YXRlWzE0ICsgN10gJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJIRVZDIGlzIGRldGVjdGVkLCBidXQgZG9lcyBub3QgaGF2ZSBjb25maWd1cmF0aW9uLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FTUCIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGZhbHNlLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIGRldGVjdGVkLCBidXQgZG9lcyBub3QgaGF2ZSBjb25maWd1cmF0aW9uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpc1NldENzZEZyb20xc3RGcmFtZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfVlA4IiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOSIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAvLyAnY3NkLTAnIGZvciBWUDkgaXMgdGhlIEJsb2Igb2YgQ29kZWMgUHJpdmF0ZSBkYXRhIGFzCiAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL3ZwOS9wcm9maWxlcy8uCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VnA5Q29kZWNQcml2YXRlLCAwLCBjb2RlY1ByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfQVYxIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01QRUcyIiwgY29kZWNJRCkgfHwgIXN0cmNtcCgiVl9NUEVHMSIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUobWV0YSwgZmFsc2UsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJObyBzcGVjaWZpYyBjb2RlYyBwcml2YXRlIGRhdGEsIGZpbmQgaXQgZnJvbSB0aGUgZmlyc3QgZnJhbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NldENzZEZyb20xc3RGcmFtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01KUEVHIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NSlBFRyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01TL1ZGVy9GT1VSQ0MiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBjb2RlY1ByaXZhdGUgfHxjb2RlY1ByaXZhdGVTaXplIDwgMjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWX01TL1ZGVy9GT1VSQ0MgaGFzIG5vIHZhbGlkIHByaXZhdGUgZGF0YSglcCksY29kZWNQcml2YXRlU2l6ZTolenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm91cmNjID0gKih1aW50MzJfdCAqKShjb2RlY1ByaXZhdGUgKyAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VyY2MgPSBudG9obChmb3VyY2MpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IE1LVkZvdXJDQzJNSU1FKGZvdXJjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVl9NUy9WRlcvRk9VUkNDIHR5cGUgaXMgJXMiLCBtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVl9NUy9WRlcvRk9VUkNDIGNvbnRpbnVlLHVuc3VwcG9ydCB2aWRlbyB0eXBlPSVzLGZvdXJjYz0weCUwOHguIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUsIGZvdXJjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXRDc2RGcm9tMXN0RnJhbWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiRm91ckNDIGhhdmUgdW5zdXBwb3J0IGNvZGVjLCB0eXBlPSVzLGZvdXJjYz0weCUwOHguIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lLCBmb3VyY2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgY29kZWNJRCk7CkBAIC0xNDU1LDggKzE5NDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVygidHJhY2sgaGVpZ2h0IGV4Y2VlZHMgaW50MzJfdCwgJWxsZCIsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlXaWR0aCwgKGludDMyX3Qpd2lkdGgpOwotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgKGludDMyX3QpaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgKGludDMyX3Qpd2lkdGgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgKGludDMyX3QpaGVpZ2h0KTsKIAogICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgZGlzcGxheSB3aWR0aC9oZWlnaHQgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgZGlzcGxheVVuaXQgPSB2dHJhY2stPkdldERpc3BsYXlVbml0KCk7CkBAIC0xNDY2LDggKzE5NTYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRpc3BsYXlIZWlnaHQgPiAwICYmIGRpc3BsYXlIZWlnaHQgPD0gSU5UMzJfTUFYKSB7CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGlzcGxheVVuaXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBwaXhlbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpZGlzcGxheVdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIChpbnQzMl90KWRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCwgKGludDMyX3QpZGlzcGxheVdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCAoaW50MzJfdClkaXNwbGF5SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIGNlbnRpbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLy8gaW5jaGVzCkBAIC0xNDgxLDggKzE5NzMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBjb21wdXRlZEhlaWdodCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KGhlaWdodCwgd2lkdGggKiBkaXNwbGF5SGVpZ2h0IC8gZGlzcGxheVdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFdpZHRoIDw9IElOVDMyX01BWCAmJiBjb21wdXRlZEhlaWdodCA8PSBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIChpbnQzMl90KWNvbXB1dGVkV2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIChpbnQzMl90KWNvbXB1dGVkSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCAoaW50MzJfdCljb21wdXRlZEhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTUwMiwzNCArMTk5Niw1NCBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OkF1ZGlvVHJhY2sgKj4odHJhY2spOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIkFfQUFDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUHJpdmF0ZVNpemUgPj0gMik7CiAKICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgdHJ1ZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfVk9SQklTIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CiAKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkVm9yYmlzQ29kZWNJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX09QVVMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSwgdHJhY2stPkdldENvZGVjRGVsYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCwgdHJhY2stPkdldFNlZWtQcmVSb2xsKCkpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29kZWNEZWxheSA9IHRyYWNrLT5HZXRDb2RlY0RlbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLCAmY29kZWNEZWxheSwgc2l6ZW9mKGNvZGVjRGVsYXkpKTsKICAgICAgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsTnMgPSB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZtU2Vla1ByZVJvbGxOcywgc2l6ZW9mKG1TZWVrUHJlUm9sbE5zKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX01QRUcvTDMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9GTEFDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkRmxhY01ldGFkYXRhKG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoIXN0cmNtcCgiQV9NUy9BQ00iLCBjb2RlY0lEKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChOVUxMID09IGNvZGVjUHJpdmF0ZSkgfHwgKGNvZGVjUHJpdmF0ZVNpemUgPCAzMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ1bnN1cHBvcnRlZCBhdWRpbzogQV9NUy9BQ00gaGFzIG5vIHZhbGlkIHByaXZhdGUgZGF0YTogJXMsIHNpemU6ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcml2YXRlID09IE5VTEwgPyAibnVsbCIgOiAibm9uLW51bGwiLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgSUQgPSAqKHVpbnQxNl90ICopY29kZWNQcml2YXRlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElEID09IDB4MDA1NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBX01TL0FDTSB1bnN1cHBvcnRlZCB0eXBlICwgY29udGludWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBub3Qgc3VwcG9ydGVkLiIsIGNvZGVjSUQpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBhdHJhY2stPkdldFNhbXBsaW5nUmF0ZSgpKTsKLSAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGF0cmFjay0+R2V0Q2hhbm5lbHMoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIGF0cmFjay0+R2V0U2FtcGxpbmdSYXRlKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGF0cmFjay0+R2V0Q2hhbm5lbHMoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTE1NDIsNyArMjA1Niw3IEBACiAgICAgICAgICAgIGNoYXIgbGFuZ1s0XTsKICAgICAgICAgICAgc3RybmNweShsYW5nLCBsYW5ndWFnZSwgMyk7CiAgICAgICAgICAgIGxhbmdbM10gPSAnXDAnOwotICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1lZGlhTGFuZ3VhZ2UsIGxhbmcpOworICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UsIGxhbmcpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTU1MSwyMCArMjA2NSw0MyBAQAogICAgICAgICB9CiAKICAgICAgICAgbG9uZyBsb25nIGR1cmF0aW9uTnMgPSBtU2VnbWVudC0+R2V0RHVyYXRpb24oKTsKLSAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIChkdXJhdGlvbk5zICsgNTAwKSAvIDEwMDApOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKGR1cmF0aW9uTnMgKyA1MDApIC8gMTAwMCk7CiAKICAgICAgICAgbVRyYWNrcy5wdXNoKCk7CiAgICAgICAgIHNpemVfdCBuID0gbVRyYWNrcy5zaXplKCkgLSAxOwogICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQobik7CiAgICAgICAgIGluaXRUcmFja0luZm8odHJhY2ssIG1ldGEsIHRyYWNrSW5mbyk7CisgICAgICAgIHRyYWNrSW5mby0+bU5hbExlbmd0aFNpemUgPSBuYWxTaXplOwogCi0gICAgICAgIGlmICghc3RyY21wKCJWX01QRUc0L0lTTy9BVkMiLCBjb2RlY0lEKSAmJiBjb2RlY1ByaXZhdGVTaXplID09IDApIHsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZXR5cGUgPSAiIjsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1ldHlwZSk7CisKKyAgICAgICAgaWYgKCghc3RyY21wKCJWX01QRUc0L0lTTy9BVkMiLCBjb2RlY0lEKSAmJiBjb2RlY1ByaXZhdGVTaXplID09IDApIHx8CisgICAgICAgICAgICAoIXN0cmNtcChtaW1ldHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSAmJiBpc1NldENzZEZyb20xc3RGcmFtZSkpIHsKICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIEFWQyB0cmFjayB3aXRob3V0IGNvZGVjIHByaXZhdGUgZGF0YQogICAgICAgICAgICAgZXJyID0gc3ludGhlc2l6ZUFWQ0ModHJhY2tJbmZvLCBuKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBtVHJhY2tzLnBvcCgpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCghc3RyY21wKCJWX01QRUcyIiwgY29kZWNJRCkgJiYgY29kZWNQcml2YXRlU2l6ZSA9PSAwKSB8fAorICAgICAgICAgICAgKCFzdHJjbXAobWltZXR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKSAmJiBpc1NldENzZEZyb20xc3RGcmFtZSkpIHsKKyAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIE1QRUcyIHRyYWNrIHdpdGhvdXQgY29kZWMgcHJpdmF0ZSBkYXRhCisgICAgICAgICAgICBlcnIgPSBzeW50aGVzaXplTVBFRzIodHJhY2tJbmZvLCBuKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tzLnBvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCghc3RyY21wKCJWX01QRUc0L0lTTy9BU1AiLCBjb2RlY0lEKSAmJiBjb2RlY1ByaXZhdGVTaXplID09IDApIHx8CisgICAgICAgICAgICAoIXN0cmNtcChtaW1ldHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpICYmIGlzU2V0Q3NkRnJvbTFzdEZyYW1lKSB8fAorICAgICAgICAgICAgKCFzdHJjbXAobWltZXR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQpICYmIGlzU2V0Q3NkRnJvbTFzdEZyYW1lKSB8fAorICAgICAgICAgICAgKCFzdHJjbXAobWltZXR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgpICYmIGlzU2V0Q3NkRnJvbTFzdEZyYW1lKSB8fAorICAgICAgICAgICAgKCFzdHJjbXAobWltZXR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzKSAmJiBpc1NldENzZEZyb20xc3RGcmFtZSkpIHsKKyAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIE1QRUc0IHRyYWNrIHdpdGhvdXQgY29kZWMgcHJpdmF0ZSBkYXRhCisgICAgICAgICAgICBlcnIgPSBzeW50aGVzaXplTVBFRzQodHJhY2tJbmZvLCBuKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tzLnBvcCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICB9CiB9CiAKQEAgLTE1NzMsNyArMjExMCw3IEBACiAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0soaW5mby0+bU1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGluZm8tPm1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAKICAgICAgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewogICAgICAgICAgICAgY29udGludWU7CkBAIC0xNTk5LDE2ICsyMTM2LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVyLmFkdmFuY2UoKTsKICAgICAgICAgfQotICAgICAgICBpbmZvLT5tTWV0YS5zZXRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgdGh1bWJuYWlsVGltZVVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGluZm8tPm1NZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsIHRodW1ibmFpbFRpbWVVcyk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAga0tleU1JTUVUeXBlLAotICAgICAgICAgICAgbUlzV2VibSA/ICJ2aWRlby93ZWJtIiA6IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtSXNXZWJtID8gInZpZGVvL3dlYm0iIDogTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50MzJfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CkBAIC0xNjIxLDcgKzIxNTgsNyBAQAogfQogCiBib29sIFNuaWZmTWF0cm9za2EoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICBEYXRhU291cmNlQmFzZVJlYWRlciByZWFkZXIoc291cmNlKTsKICAgICBta3ZwYXJzZXI6OkVCTUxIZWFkZXIgZWJtbEhlYWRlcjsKICAgICBsb25nIGxvbmcgcG9zOwpAQCAtMTYzNCwyOCArMjE3MSw0MCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJta2EiLAorICAgICJta3YiLAorICAgICJ3ZWJtIiwKKyAgICBOVUxMCit9OwogCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCJhYmJlZGQ5Mi0zOGM0LTQ5MDQtYTRjMS1iM2Y0NWY4OTk5ODAiKSwKICAgICAgICAgMSwKICAgICAgICAgIk1hdHJvc2thIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZNYXRyb3NrYShzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRyb3NrYUV4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgIHsKKyAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZk1hdHJvc2thKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1hdHJvc2thRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmgKaW5kZXggMzU2OGVhMS4uZDUzZDllMyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCkBAIC0yMCw4ICsyMCw5IEBACiAKICNpbmNsdWRlICJta3ZwYXJzZXIvbWt2cGFyc2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIApAQCAtMzQsMTYgKzM1LDE2IEBACiBzdHJ1Y3QgRGF0YVNvdXJjZUJhc2VSZWFkZXI7CiBzdHJ1Y3QgTWF0cm9za2FTb3VyY2U7CiAKLXN0cnVjdCBNYXRyb3NrYUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTWF0cm9za2FFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgeworICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwogCi0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKIApAQCAtNTcsOSArNTgsMTcgQEAKICAgICBmcmllbmQgc3RydWN0IEJsb2NrSXRlcmF0b3I7CiAKICAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKyAgICAgICAgVHJhY2tJbmZvKCkgeworICAgICAgICAgICAgbU1ldGEgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIH5UcmFja0luZm8oKSB7CisgICAgICAgICAgICBpZiAobU1ldGEpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICB1bnNpZ25lZCBsb25nIG1UcmFja051bTsKICAgICAgICAgYm9vbCBtRW5jcnlwdGVkOwotICAgICAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgICAgIGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICptRXh0cmFjdG9yOwogICAgICAgICBWZWN0b3I8Y29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCo+IG1DdWVQb2ludHM7CiAKQEAgLTY4LDYgKzc3LDcgQEAKICAgICAgICAgLy8gaW4gfk1hdHJvc2thRXh0cmFjdG9yLgogICAgICAgICB1bnNpZ25lZCBjaGFyICptSGVhZGVyOwogICAgICAgICBzaXplX3QgbUhlYWRlckxlbjsKKyAgICAgICAgaW50MzJfdCBtTmFsTGVuZ3RoU2l6ZTsKIAogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiBnZXRUcmFjaygpIGNvbnN0OwogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uICpmaW5kKGxvbmcgbG9uZyB0aW1lTnMpIGNvbnN0OwpAQCAtNzYsNyArODYsNyBAQAogICAgIE11dGV4IG1Mb2NrOwogICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgKm1SZWFkZXI7CiAgICAgbWt2cGFyc2VyOjpTZWdtZW50ICptU2VnbWVudDsKICAgICBib29sIG1FeHRyYWN0ZWRUaHVtYm5haWxzOwpAQCAtODUsMTUgKzk1LDE3IEBACiAgICAgaW50NjRfdCBtU2Vla1ByZVJvbGxOczsKIAogICAgIHN0YXR1c190IHN5bnRoZXNpemVBVkNDKFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpOworICAgIHN0YXR1c190IHN5bnRoZXNpemVNUEVHMihUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KTsKKyAgICBzdGF0dXNfdCBzeW50aGVzaXplTVBFRzQoVHJhY2tJbmZvICp0cmFja0luZm8sIHNpemVfdCBpbmRleCk7CiAgICAgc3RhdHVzX3QgaW5pdFRyYWNrSW5mbygKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRyYWNrLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8pOwogICAgIHZvaWQgYWRkVHJhY2tzKCk7CiAgICAgdm9pZCBmaW5kVGh1bWJuYWlscygpOwogICAgIHZvaWQgZ2V0Q29sb3JJbmZvcm1hdGlvbigKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgYm9vbCBpc0xpdmVTdHJlYW1pbmcoKSBjb25zdDsKIAogICAgIE1hdHJvc2thRXh0cmFjdG9yKGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKaW5kZXggNDk0Y2VhYy4uNGUyZjI0OCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCkBAIC0xMiwxMyArMTIsMTMgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJtcDNleHRyYWN0b3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAKaW5kZXggMzNjZmY5Ni4uYTgzOGFlNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwCkBAIC0yNCw4ICsyNCw2IEBACiAjaW5jbHVkZSAiVkJSSVNlZWtlci5oIgogI2luY2x1ZGUgIlhJTkdTZWVrZXIuaCIKIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CkBAIC00Niw3ICs0NCw3IEBACiBzdGF0aWMgY29uc3QgdWludDMyX3Qga01hc2sgPSAweGZmZmUwYzAwOwogCiBzdGF0aWMgYm9vbCBSZXN5bmMoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHVpbnQzMl90IG1hdGNoX2hlYWRlciwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCBtYXRjaF9oZWFkZXIsCiAgICAgICAgIG9mZjY0X3QgKmlub3V0X3Bvcywgb2ZmNjRfdCAqcG9zdF9pZDNfcG9zLCB1aW50MzJfdCAqb3V0X2hlYWRlcikgewogICAgIGlmIChwb3N0X2lkM19wb3MgIT0gTlVMTCkgewogICAgICAgICAqcG9zdF9pZDNfcG9zID0gMDsKQEAgLTIwOSwzNSArMjA3LDM0IEBACiAgICAgcmV0dXJuIHZhbGlkOwogfQogCi1jbGFzcyBNUDNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBNUDNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiBwdWJsaWM6CiAgICAgTVAzU291cmNlKAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLCBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLCBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAogICAgICAgICAgICAgTVAzU2Vla2VyICpzZWVrZXIpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1QM1NvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1NZXRhOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUZpcnN0RnJhbWVQb3M7CiAgICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOwogICAgIG9mZjY0X3QgbUN1cnJlbnRQb3M7CiAgICAgaW50NjRfdCBtQ3VycmVudFRpbWVVczsKICAgICBib29sIG1TdGFydGVkOwogICAgIE1QM1NlZWtlciAqbVNlZWtlcjsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAKICAgICBpbnQ2NF90IG1CYXNpc1RpbWVVczsKICAgICBpbnQ2NF90IG1TYW1wbGVzUmVhZDsKQEAgLTI1Myw3ICsyNTAsNyBAQAogfTsKIAogTVAzRXh0cmFjdG9yOjpNUDNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSkKICAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUZpcnN0RnJhbWVQb3MoLTEpLApAQCAtMjg1LDYgKzI4Miw3IEBACiAgICAgbUZpeGVkSGVhZGVyID0gaGVhZGVyOwogICAgIFhJTkdTZWVrZXIgKnNlZWtlciA9IFhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIG1GaXJzdEZyYW1lUG9zKTsKIAorICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIGlmIChzZWVrZXIgPT0gTlVMTCkgewogICAgICAgICBtU2Vla2VyID0gVkJSSVNlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZShtRGF0YVNvdXJjZSwgcG9zdF9pZDNfcG9zKTsKICAgICB9IGVsc2UgewpAQCAtMjkyLDggKzI5MCw4IEBACiAgICAgICAgIGludCBlbmNkID0gc2Vla2VyLT5nZXRFbmNvZGVyRGVsYXkoKTsKICAgICAgICAgaW50IGVuY3AgPSBzZWVrZXItPmdldEVuY29kZXJQYWRkaW5nKCk7CiAgICAgICAgIGlmIChlbmNkICE9IDAgfHwgZW5jcCAhPSAwKSB7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBlbmNkKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgZW5jcCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSwgZW5jZCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HLCBlbmNwKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzI5LDIxICszMjcsMjMgQEAKIAogICAgIHN3aXRjaCAobGF5ZXIpIHsKICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1NZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBtTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KIAotICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIGJpdHJhdGUgKiAxMDAwKTsKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlX3JhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgYml0cmF0ZSAqIDEwMDApOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOwogCiAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogCkBAIC0zNjMsNyArMzYzLDcgQEAKICAgICB9CiAKICAgICBpZiAoZHVyYXRpb25VcyA+PSAwKSB7Ci0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CiAgICAgfQogCiAgICAgbUluaXRDaGVjayA9IE9LOwpAQCAtMzcxLDcgKzM3MSw4IEBACiAgICAgLy8gR2V0IGlUdW5lcy1zdHlsZSBnYXBsZXNzIGluZm8gaWYgcHJlc2VudC4KICAgICAvLyBXaGVuIGdldHRpbmcgdGhlIGlkMyB0YWcsIHNraXAgdGhlIFYxIHRhZ3MgdG8gcHJldmVudCB0aGUgc291cmNlIGNhY2hlCiAgICAgLy8gZnJvbSBiZWluZyBpdGVyYXRlZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICAgIElEMyBpZDMobURhdGFTb3VyY2UsIHRydWUpOworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKG1EYXRhU291cmNlKTsKKyAgICBJRDMgaWQzKCZoZWxwZXIsIHRydWUpOwogICAgIGlmIChpZDMuaXNWYWxpZCgpKSB7CiAgICAgICAgIElEMzo6SXRlcmF0b3IgKmNvbSA9IG5ldyBJRDM6Okl0ZXJhdG9yKGlkMywgIkNPTSIpOwogICAgICAgICBpZiAoY29tLT5kb25lKCkpIHsKQEAgLTM5MCw4ICszOTEsOCBAQAogCiAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheSwgcGFkZGluZzsKICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKHZhbHVlLCAiICUqeCAleCAleCAlKngiLCAmZGVsYXksICZwYWRkaW5nKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLSAgICAgICAgICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGRlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgcGFkZGluZyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDA0LDEzICs0MDUsMTUgQEAKIAogTVAzRXh0cmFjdG9yOjp+TVAzRXh0cmFjdG9yKCkgewogICAgIGRlbGV0ZSBtU2Vla2VyOworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKIH0KIAogc2l6ZV90IE1QM0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgIT0gT0sgPyAwIDogMTsKIH0KIAotTWVkaWFUcmFjayAqTVAzRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC00MjAsMTQgKzQyMywxNCBAQAogICAgICAgICAgICAgbVNlZWtlcik7CiB9CiAKLXN0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVAzRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC00NDAsNyArNDQzLDcgQEAKIC8vIFNldCBvdXIgbWF4IGZyYW1lIHNpemUgdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgMiBhYm92ZSB0aGlzIHNpemUgKGFrYSwgNGtCKQogY29uc3Qgc2l6ZV90IE1QM1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9ICgxIDw8IDEyKTsgLyogNDA5NiBieXRlcyAqLwogTVAzU291cmNlOjpNUDNTb3VyY2UoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLCBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zLCB1aW50MzJfdCBmaXhlZF9oZWFkZXIsCiAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKQogICAgIDogbU1ldGEobWV0YSksCkBAIC00NTEsNyArNDU0LDYgQEAKICAgICAgIG1DdXJyZW50VGltZVVzKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbVNlZWtlcihzZWVrZXIpLAotICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgbUJhc2lzVGltZVVzKDApLAogICAgICAgbVNhbXBsZXNSZWFkKDApIHsKIH0KQEAgLTQ2MiwxMiArNDY0LDEwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnN0YXJ0KCkgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLQotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKGtNYXhGcmFtZVNpemUpOwogCiAgICAgbUN1cnJlbnRQb3MgPSBtRmlyc3RGcmFtZVBvczsKICAgICBtQ3VycmVudFRpbWVVcyA9IDA7CkBAIC00NzcsMjcgKzQ3NywyMyBAQAogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QM1NvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QM1NvdXJjZTo6c3RvcCgpIHsKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QM1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QM1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC01MDksMTEgKzUwNSwxMSBAQAogICAgICAgICBpZiAobVNlZWtlciA9PSBOVUxMCiAgICAgICAgICAgICAgICAgfHwgIW1TZWVrZXItPmdldE9mZnNldEZvclRpbWUoJmFjdHVhbFNlZWtUaW1lVXMsICZtQ3VycmVudFBvcykpIHsKICAgICAgICAgICAgIGludDMyX3QgYml0cmF0ZTsKLSAgICAgICAgICAgIGlmICghbU1ldGEuZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAmYml0cmF0ZSkpIHsKICAgICAgICAgICAgICAgICAvLyBiaXRyYXRlIGlzIGluIGJpdHMvc2VjLgogICAgICAgICAgICAgICAgIEFMT0dJKCJubyBiaXRyYXRlIik7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrVGltZVVzOwpAQCAtNTI3LDEwICs1MjMsMTAgQEAKICAgICAgICAgbVNhbXBsZXNSZWFkID0gMDsKICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBzaXplX3QgZnJhbWVfc2l6ZTsKQEAgLTU0Myw3ICs1MzksOCBAQAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gKG4gPCAwID8gbiA6IEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgcmV0dXJuICgobiA8IDAgJiYgbiAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSA/CisgICAgICAgICAgICAgICAgICAgIEFNRURJQV9FUlJPUl9VTktOT1dOIDogQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pOwogICAgICAgICB9CiAKICAgICAgICAgdWludDMyX3QgaGVhZGVyID0gVTMyX0FUKChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkpOwpAQCAtNTcyLDcgKzU2OSw3IEBACiAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAKICAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3M7CkBAIC01ODcsMTMgKzU4NCwxNSBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gKG4gPCAwID8gbiA6IEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICByZXR1cm4gKChuIDwgMCAmJiBuICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pID8KKyAgICAgICAgICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZV9zaXplKTsKIAotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCBtQ3VycmVudFRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICBtQ3VycmVudFBvcyArPSBmcmFtZV9zaXplOwogCkBAIC02MDIsMzkgKzYwMSw0MCBAQAogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcGVnIik7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogCi0gICAgSUQzIGlkMyhtRGF0YVNvdXJjZSk7CisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIobURhdGFTb3VyY2UpOworICAgIElEMyBpZDMoJmhlbHBlcik7CiAKICAgICBpZiAoIWlkMy5pc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIAogICAgIHN0cnVjdCBNYXAgewotICAgICAgICBpbnQga2V5OworICAgICAgICBjb25zdCBjaGFyICprZXk7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzE7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzI7CiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgTWFwIGtNYXBbXSA9IHsKLSAgICAgICAgeyBrS2V5QWxidW0sICJUQUxCIiwgIlRBTCIgfSwKLSAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCAiVFBFMiIsICJUUDIiIH0sCi0gICAgICAgIHsga0tleUNvbXBvc2VyLCAiVENPTSIsICJUQ00iIH0sCi0gICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgIHsga0tleVRpdGxlLCAiVElUMiIsICJUVDIiIH0sCi0gICAgICAgIHsga0tleVllYXIsICJUWUUiLCAiVFlFUiIgfSwKLSAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsICJUUksiLCAiVFJDSyIgfSwKLSAgICAgICAgeyBrS2V5RGlzY051bWJlciwgIlRQQSIsICJUUE9TIiB9LAotICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU0sICJUQUxCIiwgIlRBTCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCwgIlRQRTEiLCAiVFAxIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSLCAiVENPTSIsICJUQ00iIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9HRU5SRSwgIlRDT04iLCAiVENPIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfVElUTEUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1lFQVIsICJUWUUiLCAiVFlFUiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiwgIlRYVCIsICJURVhUIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiwgIlRQQSIsICJUUE9TIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04sICJUQ1AiLCAiVENNUCIgfSwKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7CiAKQEAgLTY1NCw3ICs2NTQsNyBAQAogICAgICAgICBpdC0+Z2V0U3RyaW5nKCZzKTsKICAgICAgICAgZGVsZXRlIGl0OwogCi0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrTWFwW2ldLmtleSwgcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwga01hcFtpXS5rZXksIHMuc3RyaW5nKCkpOwogICAgIH0KIAogICAgIHNpemVfdCBkYXRhU2l6ZTsKQEAgLTY2MiwyOCArNjYyLDI4IEBACiAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGlkMy5nZXRBbGJ1bUFydCgmZGF0YVNpemUsICZtaW1lKTsKIAogICAgIGlmIChkYXRhKSB7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIG1pbWUuc3RyaW5nKCkpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsIGRhdGEsIGRhdGFTaXplKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIHZvaWQgKm1ldGEpIHsKICAgICBNcDNNZXRhICptZXRhRGF0YSA9IHN0YXRpY19jYXN0PE1wM01ldGEgKj4obWV0YSk7Ci0gICAgcmV0dXJuIG5ldyBNUDNFeHRyYWN0b3Ioc291cmNlLCBtZXRhRGF0YSk7CisgICAgcmV0dXJuIHdyYXAobmV3IE1QM0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLCBtZXRhRGF0YSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgewogICAgIG9mZjY0X3QgcG9zID0gMDsKICAgICBvZmY2NF90IHBvc3RfaWQzX3BvczsKICAgICB1aW50MzJfdCBoZWFkZXI7CiAgICAgdWludDhfdCBtcGVnX2hlYWRlcls1XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgbXBlZ19oZWFkZXIsIHNpemVvZihtcGVnX2hlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKG1wZWdfaGVhZGVyKSkgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgaWYgKGhlbHBlci5yZWFkQXQoMCwgbXBlZ19oZWFkZXIsIHNpemVvZihtcGVnX2hlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKG1wZWdfaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTY5MSw3ICs2OTEsNyBAQAogICAgICAgICBBTE9HVigiTVBFRzFQUyBjb250YWluZXIgaXMgbm90IHN1cHBvcnRlZCEiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmICghUmVzeW5jKHNvdXJjZSwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKKyAgICBpZiAoIVJlc3luYygmaGVscGVyLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTcwNywxNiArNzA3LDI1IEBACiAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAibXAyIiwKKyAgICAibXAzIiwKKyAgICAibXBlZyIsCisgICAgIm1wZyIsCisgICAgIm1wZ2EiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjgxMmEzZjZjLWM4Y2YtNDZkZS1iNTI5LTM3NzRiMTQxMDNkNCIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJNUDMgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0KICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oCmluZGV4IDQ4NWIwY2EuLjFlMzhhYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oCkBAIC0xOSwzNSArMTksMzcgQEAKICNkZWZpbmUgTVAzX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBEYXRhU291cmNlSGVscGVyOworCiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKIHN0cnVjdCBNUDNTZWVrZXI7CiBjbGFzcyBTdHJpbmc4Owogc3RydWN0IE1wM01ldGE7CiAKLWNsYXNzIE1QM0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBNUDNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogcHVibGljOgotICAgIE1QM0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBNcDNNZXRhICptZXRhKTsKKyAgICBNUDNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBNcDNNZXRhICptZXRhKTsKICAgICB+TVAzRXh0cmFjdG9yKCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVAzRXh0cmFjdG9yIjsgfQogCiBwcml2YXRlOgogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgb2ZmNjRfdCBtRmlyc3RGcmFtZVBvczsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICB1aW50MzJfdCBtRml4ZWRIZWFkZXI7CiAgICAgTVAzU2Vla2VyICptU2Vla2VyOwogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuY3BwCmluZGV4IGNkMTc5NjUuLmNhNTFiODggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuY3BwCkBAIC0yNyw3ICsyNyw5IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNyw3ICszOSw3IEBACiAKIC8vIHN0YXRpYwogVkJSSVNlZWtlciAqVkJSSVNlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3BvcykgewogICAgIG9mZjY0X3QgcG9zID0gcG9zdF9pZDNfcG9zOwogCiAgICAgdWludDhfdCBoZWFkZXJbNF07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKaW5kZXggOTIxM2Y2ZS4uNTA3ODk5YyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaApAQCAtMjQsMTEgKzI0LDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogCiBzdHJ1Y3QgVkJSSVNlZWtlciA6IHB1YmxpYyBNUDNTZWVrZXIgewogICAgIHN0YXRpYyBWQlJJU2Vla2VyICpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpOworICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3Bvcyk7CiAKICAgICB2aXJ0dWFsIGJvb2wgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CiAgICAgdmlydHVhbCBib29sIGdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcAppbmRleCAwMWUwNmNhLi45ZjFmZDdhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcApAQCAtMjEsNyArMjEsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNzksNyArODEsNyBAQAogCiAvLyBzdGF0aWMKIFhJTkdTZWVrZXIgKlhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpIHsKIAogICAgIHVpbnQ4X3QgYnVmZmVyWzRdOwogICAgIGludCBvZmZzZXQgPSBmaXJzdF9mcmFtZV9wb3M7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKaW5kZXggNTg2N2VhZS4uOWFjZWUzOCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaApAQCAtMjIsMTEgKzIyLDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogCiBzdHJ1Y3QgWElOR1NlZWtlciA6IHB1YmxpYyBNUDNTZWVrZXIgewogICAgIHN0YXRpYyBYSU5HU2Vla2VyICpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpOworICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3Bvcyk7CiAKICAgICB2aXJ0dWFsIGJvb2wgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CiAgICAgdmlydHVhbCBib29sIGdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkNjBjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5jcHAKQEAgLTAsMCArMSw2MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFDNFBhcnNlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSAiQUM0UGFyc2VyLmgiCisKKyNkZWZpbmUgQk9PTFNUUihhKSAgKChhKT8idHJ1ZSI6ImZhbHNlIikKKyNkZWZpbmUgQllURV9BTElHTiBtQml0UmVhZGVyLnNraXBCaXRzKG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSAlIDgpCisjZGVmaW5lIENIRUNLX0JJVFNfTEVGVChuKSBpZiAobUJpdFJlYWRlci5udW1CaXRzTGVmdCgpIDwgbikge3JldHVybiBmYWxzZTt9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQUM0UGFyc2VyOjpBQzRQYXJzZXIoKSB7Cit9CisKK0FDNERTSVBhcnNlcjo6QUM0RFNJUGFyc2VyKEFCaXRSZWFkZXIgJmJyKQorICAgIDogbUJpdFJlYWRlcihicil7CisKKyAgICBtRFNJU2l6ZSA9IG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKTsKK30KKworLy8gRVRTSSBUUyAxMDMgMTkwLTIgVjEuMS4xICgyMDE1LTA5KSBUYWJsZSA3OTogY2hhbm5lbF9tb2RlCitzdGF0aWMgY29uc3QgY2hhciAqQ2hhbm5lbE1vZGVzW10gPSB7CisgICAgIm1vbm8iLAorICAgICJzdGVyZW8iLAorICAgICIzLjAiLAorICAgICI1LjAiLAorICAgICI1LjEiLAorICAgICI3LjAgKDMvNC8wKSIsCisgICAgIjcuMSAoMy80LzAuMSkiLAorICAgICI3LjAgKDUvMi8wKSIsCisgICAgIjcuMSAoNS8yLzAuMSkiLAorICAgICI3LjAgKDMvMi8yKSIsCisgICAgIjcuMSAoMy8yLzIuMSkiLAorICAgICI3LjAuNCIsCisgICAgIjcuMS40IiwKKyAgICAiOS4wLjQiLAorICAgICI5LjEuNCIsCisgICAgIjIyLjIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciogQ29udGVudENsYXNzaWZpZXJbXSA9IHsKKyAgICAiQ29tcGxldGUgTWFpbiIsCisgICAgIk11c2ljIGFuZCBFZmZlY3RzIiwKKyAgICAiVmlzdWFsbHkgSW1wYWlyZWQiLAorICAgICJIZWFyaW5nIEltcGFpcmVkIiwKKyAgICAiRGlhbG9nIiwKKyAgICAiQ29tbWVudGFyeSIsCisgICAgIkVtZXJnZW5jeSIsCisgICAgIlZvaWNlIE92ZXIiCit9OworCitib29sIEFDNERTSVBhcnNlcjo6cGFyc2VMYW5ndWFnZVRhZyh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpeworICAgIENIRUNLX0JJVFNfTEVGVCg2KTsKKyAgICB1aW50MzJfdCBuX2xhbmd1YWdlX3RhZ19ieXRlcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg2KTsKKyAgICBpZiAobl9sYW5ndWFnZV90YWdfYnl0ZXMgPCAyIHx8IG5fbGFuZ3VhZ2VfdGFnX2J5dGVzID49IDQyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQ0hFQ0tfQklUU19MRUZUKG5fbGFuZ3VhZ2VfdGFnX2J5dGVzICogOCk7CisgICAgY2hhciBsYW5ndWFnZV90YWdfYnl0ZXNbNDJdOyAvLyBUUyAxMDMgMTkwIHBhcnQgMSA0LjMuMy44LjcKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbl9sYW5ndWFnZV90YWdfYnl0ZXM7IGkrKykgeworICAgICAgICBsYW5ndWFnZV90YWdfYnl0ZXNbaV0gPSAoY2hhciltQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgfQorICAgIGxhbmd1YWdlX3RhZ19ieXRlc1tuX2xhbmd1YWdlX3RhZ19ieXRlc10gPSAwOworICAgIEFMT0dWKCIldS4ldTogbGFuZ3VhZ2VfdGFnID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwgbGFuZ3VhZ2VfdGFnX2J5dGVzKTsKKworICAgIHN0ZDo6c3RyaW5nIGxhbmd1YWdlKGxhbmd1YWdlX3RhZ19ieXRlcywgbl9sYW5ndWFnZV90YWdfYnl0ZXMpOworICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tTGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBUUyAxMDMgMTkwLTEgdjEuMi4xIEUuNSBhbmQgVFMgMTAzIDE5MC0yIHYxLjEuMSBFLjkKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZVN1YnN0cmVhbURTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpeworICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICB1aW50MzJfdCBjaGFubmVsX21vZGUgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgIHVpbnQzMl90IGRzaV9zZl9tdWx0aXBsaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBBTE9HVigiJXUuJXU6IGNoYW5uZWxfbW9kZSA9ICV1ICglcylcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwgY2hhbm5lbF9tb2RlLAorICAgIGNoYW5uZWxfbW9kZSA8IE5FTEVNKENoYW5uZWxNb2RlcykgPyBDaGFubmVsTW9kZXNbY2hhbm5lbF9tb2RlXSA6ICJyZXNlcnZlZCIpOworICAgIEFMT0dWKCIldS4ldTogZHNpX3NmX211bHRpcGxpZXIgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsCisgICAgICAgIHN1YnN0cmVhbUlELCBkc2lfc2ZfbXVsdGlwbGllcik7CisgICAgQUxPR1YoIiV1LiV1OiBiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwKKyAgICAgICAgc3Vic3RyZWFtSUQsIEJPT0xTVFIoYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpKTsKKworICAgIGlmIChiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgIHVpbnQzMl90IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELAorICAgICAgICAgICAgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKTsKKyAgICB9CisgICAgaWYgKGNoYW5uZWxfbW9kZSA+PSA3ICYmIGNoYW5uZWxfbW9kZSA8PSAxMCkgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIHVpbnQzMl90IGFkZF9jaF9iYXNlID0gbUJpdFJlYWRlci5nZXRCaXRzKDEpOworICAgICAgICBBTE9HVigiJXUuJXU6IGFkZF9jaF9iYXNlID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwgYWRkX2NoX2Jhc2UpOworICAgIH0KKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX2NvbnRlbnRfdHlwZSA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQUxPR1YoIiV1LiV1OiBiX2NvbnRlbnRfdHlwZSA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIEJPT0xTVFIoYl9jb250ZW50X3R5cGUpKTsKKyAgICBpZiAoYl9jb250ZW50X3R5cGUpIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICB1aW50MzJfdCBjb250ZW50X2NsYXNzaWZpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgIEFMT0dWKCIldS4ldTogY29udGVudF9jbGFzc2lmaWVyID0gJXUgKCVzKVxuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELAorICAgICAgICAgICAgY29udGVudF9jbGFzc2lmaWVyLCBDb250ZW50Q2xhc3NpZmllcltjb250ZW50X2NsYXNzaWZpZXJdKTsKKworICAgICAgICAvLyBGb3Igc3RyZWFtcyBiYXNlZCBvbiBUUyAxMDMgMTkwIHBhcnQgMSB0aGUgcHJlc2VudGF0aW9uIGxldmVsIGNoYW5uZWxfbW9kZSBkb2Vzbid0CisgICAgICAgIC8vIGV4aXN0IGFuZCBzbyB3ZSB1c2UgdGhlIGNoYW5uZWxfbW9kZSBmcm9tIGVpdGhlciB0aGUgQ00gb3IgTSZFIHN1YnN0cmVhbQorICAgICAgICAvLyAodGhleSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlKQorICAgICAgICBpZiAobVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1DaGFubmVsTW9kZSA9PSAtMSAmJgorICAgICAgICAgICAgKGNvbnRlbnRfY2xhc3NpZmllciA9PSAwIHx8IGNvbnRlbnRfY2xhc3NpZmllciA9PSAxKSkgeworICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1DaGFubmVsTW9kZSA9IGNoYW5uZWxfbW9kZTsKKyAgICAgICAgfQorICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNvbnRlbnRDbGFzc2lmaWVyID0gY29udGVudF9jbGFzc2lmaWVyOworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9sYW5ndWFnZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBBTE9HVigiJXUuJXU6IGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9sYW5ndWFnZV9pbmRpY2F0b3IpKTsKKyAgICAgICAgaWYgKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICBpZiAoIXBhcnNlTGFuZ3VhZ2VUYWcocHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlEKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBFVFNJIFRTIDEwMyAxOTAtMiB2MS4xLjEgc2VjdGlvbiBFLjExCitib29sIEFDNERTSVBhcnNlcjo6cGFyc2VTdWJzdHJlYW1Hcm91cERTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3QgZ3JvdXBJRCkKK3sKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX3N1YnN0cmVhbXNfcHJlc2VudCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9oc2ZfZXh0ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIENIRUNLX0JJVFNfTEVGVCg4KTsKKyAgICB1aW50MzJfdCBuX3N1YnN0cmVhbXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgQUxPR1YoIiV1LiV1OiBiX3N1YnN0cmVhbXNfcHJlc2VudCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwKKyAgICAgICAgQk9PTFNUUihiX3N1YnN0cmVhbXNfcHJlc2VudCkpOworICAgIEFMT0dWKCIldS4ldTogYl9oc2ZfZXh0ID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBCT09MU1RSKGJfaHNmX2V4dCkpOworICAgIEFMT0dWKCIldS4ldTogYl9jaGFubmVsX2NvZGVkID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBCT09MU1RSKGJfY2hhbm5lbF9jb2RlZCkpOworICAgIEFMT0dWKCIldS4ldTogbl9zdWJzdHJlYW1zID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBuX3N1YnN0cmVhbXMpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fc3Vic3RyZWFtczsgaSsrKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgdWludDMyX3QgZHNpX3NmX211bHRpcGxpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIEFMT0dWKCIldS4ldS4ldTogZHNpX3NmX211bHRpcGxpZXIgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksIGRzaV9zZl9tdWx0aXBsaWVyKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpKTsKKworICAgICAgICBpZiAoYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgIHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJfY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDI0KTsKKyAgICAgICAgICAgIHVpbnQzMl90IGRzaV9zdWJzdHJlYW1fY2hhbm5lbF9tYXNrID0gbUJpdFJlYWRlci5nZXRCaXRzKDI0KTsKKyAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogZHNpX3N1YnN0cmVhbV9jaGFubmVsX21hc2sgPSAweCUwNnhcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgIGRzaV9zdWJzdHJlYW1fY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgIGJvb2wgYl9ham9jID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogYl9ham9jID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLCBCT09MU1RSKGJfYWpvYykpOworICAgICAgICAgICAgaWYgKGJfYWpvYykgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICBib29sIGJfc3RhdGljX2RteCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBiX3N0YXRpY19kbXggPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9zdGF0aWNfZG14KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiX3N0YXRpY19kbXgpIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDQpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuX2RteF9vYmplY3RzX21pbnVzMSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBuX2RteF9vYmplY3RzX21pbnVzMSA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5fZG14X29iamVjdHNfbWludXMxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDYpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fdW14X29iamVjdHNfbWludXMxID0gbUJpdFJlYWRlci5nZXRCaXRzKDYpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogbl91bXhfb2JqZWN0c19taW51czEgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgICAgIG5fdW14X29iamVjdHNfbWludXMxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg0KTsKKyAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoNCk7IC8vIG9iamVjdHNfYXNzaWdubWVudF9tYXNrCisgICAgICAgIH0KKyAgICB9CisKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX2NvbnRlbnRfdHlwZSA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQUxPR1YoIiV1LiV1OiBiX2NvbnRlbnRfdHlwZSA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgQk9PTFNUUihiX2NvbnRlbnRfdHlwZSkpOworICAgIGlmIChiX2NvbnRlbnRfdHlwZSkgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyk7CisgICAgICAgIHVpbnQzMl90IGNvbnRlbnRfY2xhc3NpZmllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBjb250ZW50X2NsYXNzaWZpZXIgPSAlcyAoJXUpXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwKKyAgICAgICAgICAgIENvbnRlbnRDbGFzc2lmaWVyW2NvbnRlbnRfY2xhc3NpZmllcl0sIGNvbnRlbnRfY2xhc3NpZmllcik7CisKKyAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1Db250ZW50Q2xhc3NpZmllciA9IGNvbnRlbnRfY2xhc3NpZmllcjsKKworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9sYW5ndWFnZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBBTE9HVigiJXUuJXU6IGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELAorICAgICAgICAgICAgQk9PTFNUUihiX2xhbmd1YWdlX2luZGljYXRvcikpOworCisgICAgICAgIGlmIChiX2xhbmd1YWdlX2luZGljYXRvcikgeworICAgICAgICAgICAgaWYgKCFwYXJzZUxhbmd1YWdlVGFnKHByZXNlbnRhdGlvbklELCBncm91cElEKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFDNERTSVBhcnNlcjo6cGFyc2VCaXRyYXRlRHNpKCkgeworICAgIENIRUNLX0JJVFNfTEVGVCgyICsgMzIgKyAzMik7CisgICAgbUJpdFJlYWRlci5za2lwQml0cygyKTsgLy8gYml0X3JhdGVfbW9kZQorICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMzIpOyAvLyBiaXRfcmF0ZQorICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMzIpOyAvLyBiaXRfcmF0ZV9wcmVjaXNpb24KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBUUyAxMDMgMTkwLTEgc2VjdGlvbiBFLjQgKGFjNF9kc2kpIGFuZCBUUyAxMDMgMTkwLTIgc2VjdGlvbiBFLjYgKGFjNF9kc2lfdjEpCitib29sIEFDNERTSVBhcnNlcjo6cGFyc2UoKSB7CisgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgIHVpbnQzMl90IGFjNF9kc2lfdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID4gMSkgeworICAgICAgICBBTE9HRSgiZXJyb3Igd2hpbGUgcGFyc2luZyBhYy00IGRzaTogb25seSB2ZXJzaW9ucyAwIGFuZCAxIGFyZSBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENIRUNLX0JJVFNfTEVGVCg3ICsgMSArIDQgKyA5KTsKKyAgICB1aW50MzJfdCBiaXRzdHJlYW1fdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg3KTsKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDEpOyAvLyBmc19pbmRleAorICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoNCk7IC8vIGZyYW1lX3JhdGVfaW5kZXgKKyAgICB1aW50MzJfdCBuX3ByZXNlbnRhdGlvbnMgPSBtQml0UmVhZGVyLmdldEJpdHMoOSk7CisKKyAgICBpbnQzMl90IHNob3J0X3Byb2dyYW1faWQgPSAtMTsKKyAgICBpZiAoYml0c3RyZWFtX3ZlcnNpb24gPiAxKSB7CisgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoImludmFsaWQgYWM0IGRzaSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX3Byb2dyYW1faWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBpZiAoYl9wcm9ncmFtX2lkKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMTYgKyAxKTsKKyAgICAgICAgICAgIHNob3J0X3Byb2dyYW1faWQgPSBtQml0UmVhZGVyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgYm9vbCBiX3V1aWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgaWYgKGJfdXVpZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGtBQzRVVUlEU2l6ZUluQnl0ZXMgPSAxNjsKKyAgICAgICAgICAgICAgICBjaGFyIHByb2dyYW1fdXVpZFtrQUM0VVVJRFNpemVJbkJ5dGVzXTsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoa0FDNFVVSURTaXplSW5CeXRlcyAqIDgpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrQUM0VVVJRFNpemVJbkJ5dGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV91dWlkW2ldID0gKGNoYXIpKG1CaXRSZWFkZXIuZ2V0Qml0cyg4KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJVVUlEID0gJXMiLCBwcm9ncmFtX3V1aWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgIGlmICghcGFyc2VCaXRyYXRlRHNpKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBCWVRFX0FMSUdOOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgcHJlc2VudGF0aW9uID0gMDsgcHJlc2VudGF0aW9uIDwgbl9wcmVzZW50YXRpb25zOyBwcmVzZW50YXRpb24rKykgeworICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1Qcm9ncmFtSUQgPSBzaG9ydF9wcm9ncmFtX2lkOworICAgICAgICAvLyBrbm93biBhcyBiX3NpbmdsZV9zdWJzdHJlYW0gaW4gYWM0X2RzaV92ZXJzaW9uIDAKKyAgICAgICAgYm9vbCBiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXAgPSBmYWxzZTsKKyAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2NvbmZpZyA9IDAsIHByZXNlbnRhdGlvbl92ZXJzaW9uID0gMDsKKyAgICAgICAgdWludDMyX3QgcHJlc19ieXRlcyA9IDA7CisgICAgICAgIHVpbnQ2NF90IHN0YXJ0ID0gMDsKKworICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgNSArIDUpOworICAgICAgICAgICAgYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbl9jb25maWcgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgfSBlbHNlIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDggKyA4KTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgICAgICAgICAgcHJlc19ieXRlcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIGlmIChwcmVzX2J5dGVzID09IDB4ZmYpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMTYpOworICAgICAgICAgICAgICAgIHByZXNfYnl0ZXMgKz0gbUJpdFJlYWRlci5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc19ieXRlcyA9ICV1XG4iLCBwcmVzZW50YXRpb24sIHByZXNfYnl0ZXMpOworICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID4gMikgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChwcmVzX2J5dGVzICogOCk7CisgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyhwcmVzX2J5dGVzICogOCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiByZWNvcmQgYSBtYXJrZXIsIGxlc3MgdGhlIHNpemUgb2YgdGhlIHByZXNlbnRhdGlvbl9jb25maWcgKi8KKyAgICAgICAgICAgIHN0YXJ0ID0gKG1EU0lTaXplIC0gbUJpdFJlYWRlci5udW1CaXRzTGVmdCgpKSAvIDg7CisgICAgICAgICAgICAvLyBhYzRfcHJlc2VudGF0aW9uX3YwX2RzaSgpLCBhYzRfcHJlc2VudGF0aW9uX3YxX2RzaSgpIGFuZCBhYzRfcHJlc2VudGF0aW9uX3YyX2RzaSgpCisgICAgICAgICAgICAvLyBhbGwgc3RhcnQgd2l0aCBhIHByZXNlbnRhdGlvbl9jb25maWcgb2YgNSBiaXRzCisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fY29uZmlnID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwID0gKHByZXNlbnRhdGlvbl9jb25maWcgPT0gMHgxZik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqUHJlc2VudGF0aW9uQ29uZmlnW10gPSB7CisgICAgICAgICAgICAiTXVzaWMmRWZmZWN0cyArIERpYWxvZyIsCisgICAgICAgICAgICAiTWFpbiArIERFIiwKKyAgICAgICAgICAgICJNYWluICsgQXNzb2NpYXRlIiwKKyAgICAgICAgICAgICJNdXNpYyZFZmZlY3RzICsgRGlhbG9nICsgQXNzb2NpYXRlIiwKKyAgICAgICAgICAgICJNYWluICsgREUgKyBBc3NvY2lhdGUiLAorICAgICAgICAgICAgIkFyYml0cmFyeSBzdWJzdHJlYW0gZ3JvdXBzIiwKKyAgICAgICAgICAgICJFTURGIG9ubHkiCisgICAgICAgIH07CisgICAgICAgIEFMT0dWKCIldTogYl9zaW5nbGVfc3Vic3RyZWFtL2dyb3VwID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwKSk7CisgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX3ZlcnNpb24gPSAldVxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fdmVyc2lvbik7CisgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2NvbmZpZyA9ICV1ICglcylcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX2NvbmZpZywKKyAgICAgICAgICAgIChwcmVzZW50YXRpb25fY29uZmlnID49IE5FTEVNKFByZXNlbnRhdGlvbkNvbmZpZykgPworICAgICAgICAgICAgInJlc2VydmVkIiA6IFByZXNlbnRhdGlvbkNvbmZpZ1twcmVzZW50YXRpb25fY29uZmlnXSkpOworCisgICAgICAgIGJvb2wgYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gZmFsc2U7CisgICAgICAgIGlmICghYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwICYmIHByZXNlbnRhdGlvbl9jb25maWcgPT0gNikgeworICAgICAgICAgICAgYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX2FkZF9lbWRmX3N1YnN0cmVhbXMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzICsgMSk7CisgICAgICAgICAgICB1aW50MzJfdCBtZGNvbXBhdCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogbWRjb21wYXQgPSAlZFxuIiwgcHJlc2VudGF0aW9uLCBtZGNvbXBhdCk7CisKKyAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXggPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCkpOworICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4KSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUdyb3VwSW5kZXggPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fZ3JvdXBfaW5kZXggPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1Hcm91cEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGRzaV9mcmFtZV9yYXRlX211bHRpcGx5X2luZm8gPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgICAgICBBTE9HVigiJXU6IGRzaV9mcmFtZV9yYXRlX211bHRpcGx5X2luZm8gPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgIGRzaV9mcmFtZV9yYXRlX211bHRpcGx5X2luZm8pOworICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxICYmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAxIHx8IHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDIpKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzaV9mcmFtZV9yYXRlX2ZyYWN0aW9uX2luZm8gPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBkc2lfZnJhbWVfcmF0ZV9mcmFjdGlvbl9pbmZvID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgZHNpX2ZyYW1lX3JhdGVfZnJhY3Rpb25faW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSArIDEwKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9lbWRmX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fa2V5X2lkID0gbUJpdFJlYWRlci5nZXRCaXRzKDEwKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2VtZGZfdmVyc2lvbiA9ICVkXG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl9lbWRmX3ZlcnNpb24pOworICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fa2V5X2lkID0gJWRcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX2tleV9pZCk7CisKKyAgICAgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCkpOworICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAxIHx8IHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUNoYW5uZWxNb2RlID0gZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPSAlZCAoJXMpXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA8IE5FTEVNKENoYW5uZWxNb2RlcykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxNb2Rlc1tkc2lfcHJlc2VudGF0aW9uX2NoX21vZGVdIDogInJlc2VydmVkIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPj0gMTEgJiYgZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlIDw9IDE0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzX2JfNF9iYWNrX2NoYW5uZWxzX3ByZXNlbnQgPSBtQml0UmVhZGVyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlc190b3BfY2hhbm5lbF9wYWlycyA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNfYl80X2JhY2tfY2hhbm5lbHNfcHJlc2VudCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIocHJlc19iXzRfYmFja19jaGFubmVsc19wcmVzZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzX3RvcF9jaGFubmVsX3BhaXJzID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc190b3BfY2hhbm5lbF9wYWlycyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uX2NoYW5uZWxfbWFzayBpbiBhYzRfcHJlc2VudGF0aW9uX3YwX2RzaSgpCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyNCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2tfdjEgPSBtQml0UmVhZGVyLmdldEJpdHMoMjQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2tfdjEgPSAweCUwNnhcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2tfdjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSB8fCBwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycyA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycykpOworICAgICAgICAgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2NvcmVfY2hhbm5lbF9jb2RlZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fY29yZV9jaGFubmVsX2NvZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMik7IC8vIGRzaV9wcmVzZW50YXRpb25fY2hhbm5lbF9tb2RlX2NvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fZmlsdGVyID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9maWx0ZXIgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9maWx0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2ZpbHRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9lbmFibGVfcHJlc2VudGF0aW9uID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYl9lbmFibGVfcHJlc2VudGF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2VuYWJsZV9wcmVzZW50YXRpb24gPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9lbmFibGVfcHJlc2VudGF0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuX2ZpbHRlcl9ieXRlcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChuX2ZpbHRlcl9ieXRlcyAqIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fZmlsdGVyX2J5dGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDgpOyAvLyBmaWx0ZXJfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvKiBhYzRfZHNpX3ZlcnNpb24gPT0gMSAqLworCisgICAgICAgICAgICBpZiAoYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwKSB7CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfbXVsdGlfcGlkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX211bHRpX3BpZCA9ICVzXG4iLCBwcmVzZW50YXRpb24sIEJPT0xTVFIoYl9tdWx0aV9waWQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9oc2ZfZXh0ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2hzZl9leHQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfaHNmX2V4dCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByZXNlbnRhdGlvbl9jb25maWcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgc2cgPSAwOyBzZyA8IG5fc3Vic3RyZWFtX2dyb3Vwc19taW51czIgKyAyOyBzZysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgc2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDcpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3NraXBfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoNyk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChuX3NraXBfYnl0ZXMgKiA4KQorICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbl9za2lwX2J5dGVzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSArIDEpOworICAgICAgICAgICAgYm9vbCBiX3ByZV92aXJ0dWFsaXplZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1QcmVWaXJ0dWFsaXplZCA9IGJfcHJlX3ZpcnR1YWxpemVkOworICAgICAgICAgICAgYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVfdmlydHVhbGl6ZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfcHJlX3ZpcnR1YWxpemVkKSk7CisgICAgICAgICAgICBBTE9HVigiJXU6IGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgQk9PTFNUUihiX2FkZF9lbWRmX3N1YnN0cmVhbXMpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYl9hZGRfZW1kZl9zdWJzdHJlYW1zKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNyk7CisgICAgICAgICAgICB1aW50MzJfdCBuX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSBtQml0UmVhZGVyLmdldEJpdHMoNyk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbl9hZGRfZW1kZl9zdWJzdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSArIDEwKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fZW1kZl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YnN0cmVhbV9rZXlfaWQgPSBtQml0UmVhZGVyLmdldEJpdHMoMTApOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogZW1kZl9zdWJzdHJlYW1bJWRdOiB2ZXJzaW9uPSVkLCBrZXlfaWQ9JWRcbiIsIHByZXNlbnRhdGlvbiwgaiwKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyZWFtX2VtZGZfdmVyc2lvbiwgc3Vic3RyZWFtX2tleV9pZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbyA9IGZhbHNlOworICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPiAwKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICBiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8gPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbyA9ICVzXG4iLCBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbykpOworICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvKSB7CisgICAgICAgICAgICBpZiAoIXBhcnNlQml0cmF0ZURzaSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID4gMCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgYm9vbCBiX2FsdGVybmF0aXZlID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIEFMT0dWKCJiX2FsdGVybmF0aXZlID0gJXNcbiIsIEJPT0xTVFIoYl9hbHRlcm5hdGl2ZSkpOworICAgICAgICAgICAgaWYgKGJfYWx0ZXJuYXRpdmUpIHsKKyAgICAgICAgICAgICAgICBCWVRFX0FMSUdOOworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxNik7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbmFtZV9sZW4gPSBtQml0UmVhZGVyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChuYW1lX2xlbiAqIDgpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZwcmVzZW50YXRpb25fbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubURlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9uYW1lLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX25hbWUucmVzaXplKG5hbWVfbGVuKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fbmFtZVtpXSA9IChjaGFyKShtQml0UmVhZGVyLmdldEJpdHMoOCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgbl90YXJnZXRzID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChuX3RhcmdldHMgKiAoMyArIDgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbl90YXJnZXRzOyBpKyspeworICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDMpOyAvLyB0YXJnZXRfbWRfY29tcGF0CisgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoOCk7IC8vIHRhcmdldF9kZXZpY2VfY2F0ZWdvcnkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCWVRFX0FMSUdOOworCisgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgdWludDY0X3QgZW5kID0gKG1EU0lTaXplIC0gbUJpdFJlYWRlci5udW1CaXRzTGVmdCgpKSAvIDg7CisgICAgICAgICAgICB1aW50NjRfdCBwcmVzZW50YXRpb25fYnl0ZXMgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNraXBfYnl0ZXMgPSBwcmVzX2J5dGVzIC0gcHJlc2VudGF0aW9uX2J5dGVzOworICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nID0gJSIgUFJJdTY0ICIgYnl0ZXMiLCBza2lwX2J5dGVzKTsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChza2lwX2J5dGVzICogOCk7CisgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKHNraXBfYnl0ZXMgKiA4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIHNob3VsZCBrbm93IHRoaXMgb3Igc29tZXRoaW5nIGlzIHByb2JhYmx5IHdyb25nCisgICAgICAgIC8vIHdpdGggdGhlIGJpdHN0cmVhbSAob3Igd2UgZG9uJ3Qgc3VwcG9ydCBpdCkKKyAgICAgICAgaWYgKG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUNoYW5uZWxNb2RlID09IC0xKSB7CisgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGRldGVybWluZyBjaGFubmVsIG1vZGUgb2YgcHJlc2VudGF0aW9uICVkIiwgcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gLyogZWFjaCBwcmVzZW50YXRpb24gKi8KKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I2ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFDNF9QQVJTRVJfSF8KKyNkZWZpbmUgQUM0X1BBUlNFUl9IXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQUM0UGFyc2VyIHsKK3B1YmxpYzoKKyAgICBBQzRQYXJzZXIoKTsKKyAgICB2aXJ0dWFsIH5BQzRQYXJzZXIoKSB7IH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXJzZSgpID0gMDsKKworICAgIHN0cnVjdCBBQzRQcmVzZW50YXRpb24geworICAgICAgICBpbnQzMl90IG1DaGFubmVsTW9kZSA9IC0xOworICAgICAgICBpbnQzMl90IG1Qcm9ncmFtSUQgPSAtMTsKKyAgICAgICAgaW50MzJfdCBtR3JvdXBJbmRleCA9IC0xOworCisgICAgICAgIC8vIFRTIDEwMyAxOTAtMSB2MS4yLjEgNC4zLjMuOC4xCisgICAgICAgIGVudW0gQ29udGVudENsYXNzaWZpZXJzIHsKKyAgICAgICAgICAgIGtDb21wbGV0ZU1haW4sCisgICAgICAgICAgICBrTXVzaWNBbmRFZmZlY3RzLAorICAgICAgICAgICAga1Zpc3VhbGx5SW1wYWlyZWQsCisgICAgICAgICAgICBrSGVhcmluZ0ltcGFpcmVkLAorICAgICAgICAgICAga0RpYWxvZywKKyAgICAgICAgICAgIGtDb21tZW50YXJ5LAorICAgICAgICAgICAga0VtZXJnZW5jeSwKKyAgICAgICAgICAgIGtWb2ljZU92ZXIKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtQ29udGVudENsYXNzaWZpZXIgPSBrQ29tcGxldGVNYWluOworCisgICAgICAgIC8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSkgVGFibGUgNzk6IGNoYW5uZWxfbW9kZQorICAgICAgICBlbnVtIElucHV0Q2hhbm5lbE1vZGUgeworICAgICAgICAgICAga0NoYW5uZWxNb2RlX01vbm8sCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfU3RlcmVvLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzNfMCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV81XzAsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfNV8xLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF8zNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfMzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzUyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV81MiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfMzIyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV8zMjIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfOV8wXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfOV8xXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfMjJfMiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV9SZXNlcnZlZCwKKyAgICAgICAgfTsKKworICAgICAgICBib29sIG1IYXNEaWFsb2dFbmhhbmNlbWVudHMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBtUHJlVmlydHVhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBtRW5hYmxlZCA9IHRydWU7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbUxhbmd1YWdlOworICAgICAgICBzdGQ6OnN0cmluZyBtRGVzY3JpcHRpb247CisgICAgfTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHVpbnQzMl90LCBBQzRQcmVzZW50YXRpb24+IEFDNFByZXNlbnRhdGlvbnM7CisKKyAgICBjb25zdCBBQzRQcmVzZW50YXRpb25zJiBnZXRQcmVzZW50YXRpb25zKCkgY29uc3QgeyByZXR1cm4gbVByZXNlbnRhdGlvbnM7IH0KKworcHJvdGVjdGVkOgorICAgIEFDNFByZXNlbnRhdGlvbnMgbVByZXNlbnRhdGlvbnM7Cit9OworCitjbGFzcyBBQzREU0lQYXJzZXI6IHB1YmxpYyBBQzRQYXJzZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEFDNERTSVBhcnNlcihBQml0UmVhZGVyICZicik7CisgICAgdmlydHVhbCB+QUM0RFNJUGFyc2VyKCkgeyB9CisKKyAgICBib29sIHBhcnNlKCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBwYXJzZVN1YnN0cmVhbURTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpOworICAgIGJvb2wgcGFyc2VTdWJzdHJlYW1Hcm91cERTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3QgZ3JvdXBJRCk7CisgICAgYm9vbCBwYXJzZUxhbmd1YWdlVGFnKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCk7CisgICAgYm9vbCBwYXJzZUJpdHJhdGVEc2koKTsKKworICAgIHVpbnQ2NF90IG1EU0lTaXplOworICAgIEFCaXRSZWFkZXImIG1CaXRSZWFkZXI7Cit9OworCit9OworCisjZW5kaWYgIC8vIEFDNF9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCmluZGV4IGYzMTZkZjYuLjFiMzA4YWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icApAQCAtMiw2ICsyLDcgQEAKICAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yX2RlZmF1bHRzIiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFDNFBhcnNlci5jcHAiLAogICAgICAgICAiSXRlbVRhYmxlLmNwcCIsCiAgICAgICAgICJNUEVHNEV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiU2FtcGxlSXRlcmF0b3IuY3BwIiwKQEAgLTE0LDcgKzE1LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcAppbmRleCBhNDYyZGU5Li5kNTZhYmFhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKQEAgLTE3LDggKzE3LDExIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxJdGVtVGFibGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC05Miw3ICs5NSw3IEBACiAKIHN0cnVjdCBCb3ggewogcHJvdGVjdGVkOgotICAgIEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgogICAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLCBtVHlwZSh0eXBlKSB7fQogCiAgICAgdmlydHVhbCB+Qm94KCkge30KQEAgLTEwNCwxNCArMTA3LDE0IEBACiAKICAgICBpbmxpbmUgdWludDMyX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAKLSAgICBpbmxpbmUgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CisgICAgaW5saW5lIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CiAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CiAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rcyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICB1aW50MzJfdCBtVHlwZTsKIH07CiAKQEAgLTE4Niw3ICsxODksNyBAQAogCiBzdHJ1Y3QgRnVsbEJveCA6IHB1YmxpYyBCb3ggewogcHJvdGVjdGVkOgotICAgIEZ1bGxCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgorICAgIEZ1bGxCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtVmVyc2lvbigwKSwgbUZsYWdzKDApIHt9CiAKICAgICBpbmxpbmUgdWludDhfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbVZlcnNpb247IH0KQEAgLTIyMSw3ICsyMjQsNyBAQAogLy8KIAogc3RydWN0IFBpdG1Cb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgUGl0bUJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgUGl0bUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygicGl0bSIpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50MzJfdCAqcHJpbWFyeUl0ZW1JZCk7CkBAIC0zMDEsNyArMzA0LDcgQEAKIH07CiAKIHN0cnVjdCBJbG9jQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElsb2NCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+ICppdGVtTG9jcykgOgorICAgIElsb2NCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlsb2MiKSksCiAgICAgICAgIG1JdGVtTG9jcyhpdGVtTG9jcyksIG1IYXNDb25zdHJ1Y3RNZXRob2QxKGZhbHNlKSB7fQogCkBAIC00NzEsNyArNDc0LDcgQEAKIC8vCiAKIHN0cnVjdCBJdGVtUmVmZXJlbmNlIDogcHVibGljIEJveCwgcHVibGljIFJlZkJhc2UgewotICAgIEl0ZW1SZWZlcmVuY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgaXRlbUlkU2l6ZSkgOgorICAgIEl0ZW1SZWZlcmVuY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6CiAgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtSXRlbUlkKDApLCBtUmVmSWRTaXplKGl0ZW1JZFNpemUpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtNjI2LDcgKzYyOSw3IEBACiB9CiAKIHN0cnVjdCBJcmVmQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElyZWZCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gKml0ZW1SZWZzKSA6CisgICAgSXJlZkJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUmVmZXJlbmNlPiA+ICppdGVtUmVmcykgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpcmVmIikpLCBtUmVmSWRTaXplKDApLCBtSXRlbVJlZnMoaXRlbVJlZnMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtNjg4LDcgKzY5MSw3IEBACiB9OwogCiBzdHJ1Y3QgSXNwZUJveCA6IHB1YmxpYyBGdWxsQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJc3BlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJc3BlQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpc3BlIikpLCBtV2lkdGgoMCksIG1IZWlnaHQoMCkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CkBAIC03MjQsNyArNzI3LDcgQEAKIH0KIAogc3RydWN0IEh2Y2NCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBIdmNjQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBIdmNjQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImh2Y0MiKSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CkBAIC03NTcsNyArNzYwLDcgQEAKIH0KIAogc3RydWN0IElyb3RCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJcm90Qm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJcm90Qm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImlyb3QiKSksIG1BbmdsZSgwKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTc4Niw3ICs3ODksNyBAQAogfQogCiBzdHJ1Y3QgQ29sckJveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIENvbHJCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIENvbHJCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiY29sciIpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTgzNCw3ICs4MzcsNyBAQAogfQogCiBzdHJ1Y3QgSXBtYUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJcG1hQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CisgICAgSXBtYUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlwbWEiKSksIG1Bc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKQEAgLTkwOCw3ICs5MTEsNyBAQAogfQogCiBzdHJ1Y3QgSXBjb0JveCA6IHB1YmxpYyBCb3ggewotICAgIElwY29Cb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcykgOgorICAgIElwY29Cb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiaXBjbyIpKSwgbUl0ZW1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtOTY1LDcgKzk2OCw3IEBACiB9CiAKIHN0cnVjdCBJcHJwQm94IDogcHVibGljIEJveCB7Ci0gICAgSXBycEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgIElwcnBCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcywKICAgICAgICAgICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiaXBycCIpKSwKQEAgLTEwMjIsNyArMTAyNSw3IEBACiB9OwogCiBzdHJ1Y3QgSW5mZUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJbmZlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJbmZlQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpbmZlIikpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIEl0ZW1JbmZvICppdGVtSW5mbyk7CkBAIC0xMTI3LDIwICsxMTMwLDE5IEBACiB9CiAKIHN0cnVjdCBJaW5mQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElpbmZCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPEl0ZW1JbmZvPiAqaXRlbUluZm9zKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlpbmYiKSksCi0gICAgICAgIG1JdGVtSW5mb3MoaXRlbUluZm9zKSwgbUhhc0dyaWRzKGZhbHNlKSB7fQorICAgIElpbmZCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8SXRlbUluZm8+ICppdGVtSW5mb3MpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaWluZiIpKSwgbUl0ZW1JbmZvcyhpdGVtSW5mb3MpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCi0gICAgYm9vbCBoYXNHcmlkcygpIHsgcmV0dXJuIG1IYXNHcmlkczsgfQorICAgIGJvb2wgaGFzRm91ckNDKHVpbnQzMl90IHR5cGUpIHsgcmV0dXJuIG1Gb3VyQ0NTZWVuLmNvdW50KHR5cGUpID4gMDsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBWZWN0b3I8SXRlbUluZm8+ICptSXRlbUluZm9zOwotICAgIGJvb2wgbUhhc0dyaWRzOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gbUZvdXJDQ1NlZW47CiB9OwogCiBzdGF0dXNfdCBJaW5mQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKQEAgLTExODcsNyArMTE4OSw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gaW5mZUJveC5wYXJzZShvZmZzZXQsIHNpemUsICZpdGVtSW5mbyk7CiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBtSXRlbUluZm9zLT5wdXNoX2JhY2soaXRlbUluZm8pOwotICAgICAgICBtSGFzR3JpZHMgfD0gKGl0ZW1JbmZvLml0ZW1UeXBlID09IEZPVVJDQygiZ3JpZCIpKTsKKyAgICAgICAgbUZvdXJDQ1NlZW4uaW5zZXJ0KGl0ZW1JbmZvLml0ZW1UeXBlKTsKICAgICB9CiAgICAgLy8gSW5mZUJveCBwYXJzZSByZXR1cm5zIEVSUk9SX1VOU1VQUE9SVEVEIGlmIHRoZSBib3ggaWYgYW4gdW5zdXBwb3J0ZWQKICAgICAvLyB2ZXJzaW9uLiBJZ25vcmUgdGhpcyBlcnJvciBhcyBpdCdzIG5vdCBmYXRhbC4KQEAgLTExOTYsNyArMTE5OCw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1JdGVtVGFibGU6Okl0ZW1UYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKQorSXRlbVRhYmxlOjpJdGVtVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1QcmltYXJ5SXRlbUlkKDApLAogICAgICAgbUlkYXRPZmZzZXQoMCksCkBAIC0xMjc2LDcgKzEyNzgsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGlmIChpaW5mQm94Lmhhc0dyaWRzKCkpIHsKKyAgICBpZiAoaWluZkJveC5oYXNGb3VyQ0MoRk9VUkNDKCJncmlkIikpIHx8IGlpbmZCb3guaGFzRm91ckNDKEZPVVJDQygiRXhpZiIpKSkgewogICAgICAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lyZWYnKTsKICAgICB9CiAKQEAgLTE0NzYsNyArMTQ3OCw3IEBACiAgICAgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQgPyBtRGlzcGxheWFibGVzLnNpemUoKSA6IDA7CiB9CiAKLXNwPE1ldGFEYXRhPiBJdGVtVGFibGU6OmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KSB7CitBTWVkaWFGb3JtYXQgKkl0ZW1UYWJsZTo6Z2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpIHsKICAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTUwMSw2NCArMTUwMyw4MCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOwogCiAgICAgaWYgKGltYWdlLT5pdGVtSWQgPT0gbVByaW1hcnlJdGVtSWQpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAxKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCwgMSk7CiAgICAgfQogCiAgICAgQUxPR1YoImltYWdlWyV1XTogc2l6ZSAlZHglZCIsIGltYWdlSW5kZXgsIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCk7CiAKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIGltYWdlLT53aWR0aCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBpbWFnZS0+aGVpZ2h0KTsKICAgICBpZiAoaW1hZ2UtPnJvdGF0aW9uICE9IDApIHsKICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUgaW4gSEVJRiBpcyBDQ1csIGNvbnZlcnQgdG8gQ1cgaGVyZSB0byBiZQogICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIG1lZGlhIGZvcm1hdHMuCiAgICAgICAgIHN3aXRjaChpbWFnZS0+cm90YXRpb24pIHsKLSAgICAgICAgICAgIGNhc2UgOTA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMjcwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCAxODApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjcwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDkwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgMzYwIC0gaW1hZ2UtPnJvdGF0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOyAvLyBkb24ndCBzZXQgaWYgaW52YWxpZAogICAgICAgICB9CiAgICAgfQotICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CiAKICAgICBpZiAoIWltYWdlLT50aHVtYm5haWxzLmVtcHR5KCkpIHsKICAgICAgICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShpbWFnZS0+dGh1bWJuYWlsc1swXSk7CiAgICAgICAgIGlmICh0aHVtYkl0ZW1JbmRleCA+PSAwKSB7CiAgICAgICAgICAgICBjb25zdCBJbWFnZUl0ZW0gJnRodW1ibmFpbCA9IG1JdGVtSWRUb0l0ZW1NYXBbdGh1bWJJdGVtSW5kZXhdOwogCi0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsIHRodW1ibmFpbC53aWR0aCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCB0aHVtYm5haWwuaGVpZ2h0KTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVRodW1ibmFpbEhWQ0MsIGtUeXBlSFZDQywKLSAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7Ci0gICAgICAgICAgICBBTE9HVigiaW1hZ2VbJXVdOiB0aHVtYm5haWw6IHNpemUgJWR4JWQsIGl0ZW0gaW5kZXggJXpkIiwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsLmh2Y2MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEgsIHRodW1ibmFpbC53aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQsIHRodW1ibmFpbC5oZWlnaHQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9IRVZDLAorICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImltYWdlWyV1XTogdGh1bWJuYWlsOiBzaXplICVkeCVkLCBpdGVtIGluZGV4ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4LCB0aHVtYm5haWwud2lkdGgsIHRodW1ibmFpbC5oZWlnaHQsIHRodW1iSXRlbUluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0aHVtYm5haWwgZGF0YSBpcyBtaXNzaW5nIGZvciBpbWFnZVsldV0hIiwgX19GVU5DVElPTl9fLCBpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dXKCIlczogUmVmZXJlbmNlZCB0aHVtYm5haWwgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChpbWFnZS0+aXNHcmlkKCkpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRSb3dzLCBpbWFnZS0+cm93cyk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkQ29scywgaW1hZ2UtPmNvbHVtbnMpOwotCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTLCBpbWFnZS0+cm93cyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TLCBpbWFnZS0+Y29sdW1ucyk7CiAgICAgICAgIC8vIHBvaW50IGltYWdlIHRvIHRoZSBmaXJzdCB0aWxlIGZvciBncmlkIHNpemUgYW5kIEhWQ0MKICAgICAgICAgaW1hZ2UgPSAmbUl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdCh0aWxlSXRlbUluZGV4KTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbGVXaWR0aCwgaW1hZ2UtPndpZHRoKTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbGVIZWlnaHQsIGltYWdlLT5oZWlnaHQpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0ICogMS41KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRILCBpbWFnZS0+d2lkdGgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hULCBpbWFnZS0+aGVpZ2h0KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CiAgICAgfQogCiAgICAgaWYgKGltYWdlLT5odmNjID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIiVzOiBodmNjIGlzIG1pc3NpbmcgZm9yIGltYWdlWyV1XSEiLCBfX0ZVTkNUSU9OX18sIGltYWdlSW5kZXgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBpbWFnZS0+aHZjYy0+ZGF0YSgpLCBpbWFnZS0+aHZjYy0+c2l6ZSgpKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCBpbWFnZS0+aHZjYy0+ZGF0YSgpLCBpbWFnZS0+aHZjYy0+c2l6ZSgpKTsKIAogICAgIGlmIChpbWFnZS0+aWNjICE9IE5VTEwpIHsKLSAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SWNjUHJvZmlsZSwgMCwgaW1hZ2UtPmljYy0+ZGF0YSgpLCBpbWFnZS0+aWNjLT5zaXplKCkpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSwgaW1hZ2UtPmljYy0+ZGF0YSgpLCBpbWFnZS0+aWNjLT5zaXplKCkpOwogICAgIH0KICAgICByZXR1cm4gbWV0YTsKIH0KQEAgLTE2NzEsOCArMTY4OSwzMSBAQAogICAgIH0KIAogICAgIC8vIHNraXAgdGhlIGZpcnN0IDQtYnl0ZSBvZiB0aGUgb2Zmc2V0IHRvIFRJRkYgaGVhZGVyCi0gICAgKm9mZnNldCA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5vZmZzZXQgKyA0OwotICAgICpzaXplID0gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLnNpemUgLSA0OworICAgIHVpbnQzMl90IHRpZmZPZmZzZXQ7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLm9mZnNldCwgJnRpZmZPZmZzZXQsIDQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICAvLyBXZSBuZWVkICdFeGlmXDBcMCcgYmVmb3JlIHRoZSB0aWZmIGhlYWRlcgorICAgIHRpZmZPZmZzZXQgPSBudG9obCh0aWZmT2Zmc2V0KTsKKyAgICBpZiAodGlmZk9mZnNldCA8IDYpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgLy8gVGhlIGZpcnN0IDQtYnl0ZSBvZiB0aGUgaXRlbSBpcyB0aGUgb2Zmc2V0IG9mIHRoZSB0aWZmIGhlYWRlciB3aXRoaW4gdGhlCisgICAgLy8gZXhpZiBkYXRhLiBUaGUgc2l6ZSBvZiB0aGUgaXRlbSBzaG91bGQgYmUgPiA0IGZvciBhIG5vbi1lbXB0eSBleGlmICh0aGlzCisgICAgLy8gd2FzIGFscmVhZHkgY2hlY2tlZCB3aGVuIHRoZSBpdGVtIHdhcyBhZGRlZCkuIEFsc28gY2hlY2sgdGhhdCB0aGUgdGlmZgorICAgIC8vIGhlYWRlciBvZmZzZXQgaXMgdmFsaWQuCisgICAgaWYgKG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5zaXplIDw9IDQgfHwKKyAgICAgICAgICAgIHRpZmZPZmZzZXQgPiBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0uc2l6ZSAtIDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyBPZmZzZXQgb2YgJ0V4aWZcMFwwJyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mICdFeGlmJyBpdGVtCisgICAgLy8gKGZpcnN0IDQtYnl0ZSBpcyB0aGUgdGlmZiBoZWFkZXIgb2Zmc2V0KQorICAgIHVpbnQzMl90IGV4aWZPZmZzZXQgPSA0ICsgdGlmZk9mZnNldCAtIDY7CisgICAgKm9mZnNldCA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5vZmZzZXQgKyBleGlmT2Zmc2V0OworICAgICpzaXplID0gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLnNpemUgLSBleGlmT2Zmc2V0OwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaAppbmRleCA1MzZkY2IwLi5iZTgxYjU5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaApAQCAtMTksMTMgKzE5LDE1IEBACiAKICNpbmNsdWRlIDxzZXQ+CiAKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiBjbGFzcyBNZXRhRGF0YTsKIAogbmFtZXNwYWNlIGhlaWYgewpAQCAtNDUsMTMgKzQ3LDEzIEBACiAKIGNsYXNzIEl0ZW1UYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJdGVtVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgSXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICBzdGF0dXNfdCBwYXJzZSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCiAgICAgYm9vbCBpc1ZhbGlkKCkgeyByZXR1cm4gbUltYWdlSXRlbXNWYWxpZDsgfQogICAgIHVpbnQzMl90IGNvdW50SW1hZ2VzKCkgY29uc3Q7Ci0gICAgc3A8TWV0YURhdGE+IGdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KTsKKyAgICBBTWVkaWFGb3JtYXQgKmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KTsKICAgICBzdGF0dXNfdCBmaW5kSW1hZ2VJdGVtKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgsIHVpbnQzMl90ICppdGVtSW5kZXgpOwogICAgIHN0YXR1c190IGZpbmRUaHVtYm5haWxJdGVtKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgsIHVpbnQzMl90ICppdGVtSW5kZXgpOwogICAgIHN0YXR1c190IGdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKQEAgLTYyLDcgKzY0LDcgQEAKICAgICB+SXRlbVRhYmxlKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogCiAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+IG1JdGVtTG9jczsKICAgICBWZWN0b3I8SXRlbUluZm8+IG1JdGVtSW5mb3M7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAwMTQyMzMzLi4yMjgxOWNiCi0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTI2LDI2ICsyNiwyNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlICJBQzRQYXJzZXIuaCIKICNpbmNsdWRlICJNUEVHNEV4dHJhY3Rvci5oIgogI2luY2x1ZGUgIlNhbXBsZVRhYmxlLmgiCiAjaW5jbHVkZSAiSXRlbVRhYmxlLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KQEAgLTY4LDM3ICs2OSwzOCBAQAogICAgIGtNYXhBdG9tU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQsCiB9OwogCitjbGFzcyBNUEVHNFNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIHN0YXRpYyBjb25zdCBzaXplX3QgIGtNYXhQY21GcmFtZVNpemUgPSA4MTkyOwotCi1jbGFzcyBNUEVHNFNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKIHB1YmxpYzoKICAgICAvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgYm90aCAiZGF0YVNvdXJjZSIgYW5kICJzYW1wbGVUYWJsZSIuCi0gICAgTVBFRzRTb3VyY2UoTWV0YURhdGFCYXNlICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgTVBFRzRTb3VyY2UoQU1lZGlhRm9ybWF0ICpmb3JtYXQsCisgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAogICAgICAgICAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAogICAgICAgICAgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUsCisgICAgICAgICAgICAgICAgaW50MzJfdCBlbHN0U2hpZnRTdGFydFRpY2tzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZyYWdtZW50ZWRSZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgYm9vbCBzdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGZyYWdtZW50ZWRSZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIH5NUEVHNFNvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIE11dGV4IG1Mb2NrOwogCi0gICAgTWV0YURhdGFCYXNlICZtRm9ybWF0OwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgaW50MzJfdCBtVGltZXNjYWxlOwogICAgIHNwPFNhbXBsZVRhYmxlPiBtU2FtcGxlVGFibGU7CiAgICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmRleDsKQEAgLTEwOCw3ICsxMTAsNyBAQAogICAgIG9mZjY0X3QgbUZpcnN0TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1DdXJyZW50TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1OZXh0TW9vZk9mZnNldDsKLSAgICB1aW50MzJfdCBtQ3VycmVudFRpbWU7CisgICAgdWludDMyX3QgbUN1cnJlbnRUaW1lOyAvLyBpbiBtZWRpYSB0aW1lc2NhbGUgdGlja3MKICAgICBpbnQzMl90IG1MYXN0UGFyc2VkVHJhY2tJZDsKICAgICBpbnQzMl90IG1UcmFja0lkOwogCkBAIC0xMjksMTYgKzEzMSwxMyBAQAogCiAgICAgYm9vbCBtSXNBVkM7CiAgICAgYm9vbCBtSXNIRVZDOworICAgIGJvb2wgbUlzQUM0OwogICAgIGJvb2wgbUlzUGNtOwogICAgIHNpemVfdCBtTkFMTGVuZ3RoU2l6ZTsKIAogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7Ci0KLSAgICBNZWRpYUJ1ZmZlckJhc2UgKm1CdWZmZXI7Ci0KLSAgICBib29sIG1XYW50c05BTEZyYWdtZW50czsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqbUJ1ZmZlcjsKIAogICAgIHVpbnQ4X3QgKm1TcmNCdWZmZXI7CiAKQEAgLTE0Niw2ICsxNDUsMTAgQEAKICAgICBib29sIG1Jc0F1ZGlvOwogICAgIHNwPEl0ZW1UYWJsZT4gbUl0ZW1UYWJsZTsKIAorICAgIC8vIFN0YXJ0IG9mZnNldCBmcm9tIGNvbXBvc2l0aW9uIHRpbWUgdG8gcHJlc2VudGF0aW9uIHRpbWUuCisgICAgLy8gU3VwcG9ydCBzaGlmdCBvbmx5IGZvciB2aWRlbyB0cmFja3MgdGhyb3VnaCBtRWxzdFNoaWZ0U3RhcnRUaWNrcyBmb3Igbm93LgorICAgIGludDMyX3QgbUVsc3RTaGlmdFN0YXJ0VGlja3M7CisKICAgICBzaXplX3QgcGFyc2VOQUxTaXplKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIGNvbnN0OwogICAgIHN0YXR1c190IHBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KTsKICAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CkBAIC0xNTQsNiArMTU3LDggQEAKICAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyhvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKICAgICBzdGF0dXNfdCBwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncyk7CiAgICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVFbmNyeXB0aW9uKG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICAvLyByZXR1cm5zIC0xIGZvciBpbnZhbGlkIGxheWVyIElECisgICAgaW50MzJfdCBwYXJzZUhFVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKIAogICAgIHN0cnVjdCBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyB7CiAgICAgICAgIGVudW0gRmxhZ3MgewpAQCAtMTk5LDE0ICsyMDQsMTQgQEAKIC8vIHBvc3NpYmx5IHdyYXBwaW5nIG11bHRpcGxlIHRpbWVzIHRvIGNvdmVyIGFsbCB0cmFja3MsIGkuZS4KIC8vIEVhY2ggQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSBjYWNoZXMgdGhlIHNhbXBsZXRhYmxlIG1ldGFkYXRhIGZvciBhIHNpbmdsZSB0cmFjay4KIAotc3RydWN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UgewotICAgIGV4cGxpY2l0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitjbGFzcyBDYWNoZWRSYW5nZWREYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKICAgICB2aXJ0dWFsIH5DYWNoZWRSYW5nZWREYXRhU291cmNlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworICAgIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSBvdmVycmlkZTsKKyAgICB1aW50MzJfdCBmbGFncygpIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3Qgc2V0Q2FjaGVkUmFuZ2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGFzc3VtZVNvdXJjZU93bmVyc2hpcE9uU3VjY2Vzcyk7CiAKQEAgLTIxNCw3ICsyMTksNyBAQAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAgICAgYm9vbCBtT3duc0RhdGFTb3VyY2U7CiAgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OwogICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKQEAgLTIyNiw4ICsyMzEsOSBAQAogICAgIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBDYWNoZWRSYW5nZWREYXRhU291cmNlICYpOwogfTsKIAotQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlQmFzZSAqc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAorQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCisgICAgOiBEYXRhU291cmNlSGVscGVyKHNvdXJjZSksCisgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtT3duc0RhdGFTb3VyY2UoZmFsc2UpLAogICAgICAgbUNhY2hlZE9mZnNldCgwKSwKICAgICAgIG1DYWNoZWRTaXplKDApLApAQCAtMjM3LDcgKzI0Myw3IEBACiBDYWNoZWRSYW5nZWREYXRhU291cmNlOjp+Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSgpIHsKICAgICBjbGVhckNhY2hlKCk7CiAgICAgaWYgKG1Pd25zRGF0YVNvdXJjZSkgewotICAgICAgICBkZWxldGUgKENhY2hlZFJhbmdlZERhdGFTb3VyY2UqKW1Tb3VyY2U7CisgICAgICAgIGRlbGV0ZSBtU291cmNlOwogICAgIH0KIH0KIApAQCAtMjUxLDEwICsyNTcsNiBAQAogICAgIG1DYWNoZWRTaXplID0gMDsKIH0KIAotc3RhdHVzX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKLX0KLQogc3NpemVfdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApAQCAtMzE2LDYgKzMxOCw5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJzYXdiIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOwogCisgICAgICAgIGNhc2UgRk9VUkNDKCJlYy0zIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMzsKKwogICAgICAgICBjYXNlIEZPVVJDQygibXA0diIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwogCkBAIC0zMzAsNiArMzM1LDggQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImh2YzEiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImhldjEiKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOworICAgICAgICBjYXNlIEZPVVJDQygiYWMtNCIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNDsKIAogICAgICAgICBjYXNlIEZPVVJDQygidHdvcyIpOgogICAgICAgICBjYXNlIEZPVVJDQygic293dCIpOgpAQCAtMzM3LDYgKzM0NCwxMSBAQAogICAgICAgICBjYXNlIEZPVVJDQygiYWxhYyIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUM7CiAKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF2MDEiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19BVjE7CisgICAgICAgIGNhc2UgRk9VUkNDKCIubXAzIik6CisgICAgICAgIGNhc2UgMHg2RDczMDA1NTogLy8gIm1zIFUiIG1wMyBhdWRpbworICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUc7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVygiVW5rbm93biBmb3VyY2M6ICVjJWMlYyVjIiwKICAgICAgICAgICAgICAgICAgICAoZm91cmNjID4+IDI0KSAmIDB4ZmYsCkBAIC0zNjMsMTIgKzM3NSwxMSBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotTVBFRzRFeHRyYWN0b3I6Ok1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpCitNUEVHNEV4dHJhY3Rvcjo6TVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBjb25zdCBjaGFyICptaW1lKQogICAgIDogbU1vb2ZPZmZzZXQoMCksCiAgICAgICBtTW9vZkZvdW5kKGZhbHNlKSwKICAgICAgIG1NZGF0Rm91bmQoZmFsc2UpLAogICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1DYWNoZWRTb3VyY2UoTlVMTCksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbUhlYWRlclRpbWVzY2FsZSgwKSwKICAgICAgIG1Jc1FUKGZhbHNlKSwKQEAgLTM3OCw2ICszODksNyBAQAogICAgICAgbUZpcnN0VHJhY2soTlVMTCksCiAgICAgICBtTGFzdFRyYWNrKE5VTEwpIHsKICAgICBBTE9HVigibWltZT0lcywgbVByZWZlckhlaWY9JWQiLCBtaW1lLCBtUHJlZmVySGVpZik7CisgICAgbUZpbGVNZXRhRGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKIH0KIAogTVBFRzRFeHRyYWN0b3I6On5NUEVHNEV4dHJhY3RvcigpIHsKQEAgLTM4NSw2ICszOTcsNyBAQAogICAgIHdoaWxlICh0cmFjaykgewogICAgICAgICBUcmFjayAqbmV4dCA9IHRyYWNrLT5uZXh0OwogCisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2stPm1ldGEpOwogICAgICAgICBkZWxldGUgdHJhY2s7CiAgICAgICAgIHRyYWNrID0gbmV4dDsKICAgICB9CkBAIC0zOTUsNyArNDA4LDggQEAKICAgICB9CiAgICAgbVBzc2guY2xlYXIoKTsKIAotICAgIGRlbGV0ZSBtQ2FjaGVkU291cmNlOworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1GaWxlTWV0YURhdGEpOwogfQogCiB1aW50MzJfdCBNUEVHNEV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CkBAIC00MDQsMTMgKzQxOCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAoQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUspIDogMCk7CiB9CiAKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9IG1GaWxlTWV0YURhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YURhdGEpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBNUEVHNEV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CkBAIC00MzEsMTggKzQ0NSwxOCBAQAogICAgIHJldHVybiBuOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgewogICAgIHN0YXR1c190IGVycjsKICAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOwogICAgIHdoaWxlIChpbmRleCA+IDApIHsKICAgICAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAKICAgICAgICAgdHJhY2sgPSB0cmFjay0+bmV4dDsKQEAgLTQ1MCwxNyArNDY0LDE4IEBACiAgICAgfQogCiAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBbPV0gewogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwogICAgICAgICBpbnQzMl90IHNhbXBsZXJhdGU7CisgICAgICAgIC8vIE9ubHkgZm9yIGF1ZGlvIHRyYWNrLgogICAgICAgICBpZiAodHJhY2stPmhhc19lbHN0ICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCAmJgotICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikgJiYKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKSkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uKSAmJgorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnNhbXBsZXJhdGUpKSB7CiAKLSAgICAgICAgICAgIC8vIGVsc3QgaGFzIHRvIGJlIHByb2Nlc3NlZCBvbmx5IHRoZSBmaXJzdCB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgICAgICAgICAgICAvLyBFbHN0IGhhcyB0byBiZSBwcm9jZXNzZWQgb25seSB0aGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KICAgICAgICAgICAgIHRyYWNrLT5oYXNfZWxzdCA9IGZhbHNlOwogCiAgICAgICAgICAgICBpZiAodHJhY2stPmVsc3Rfc2VnbWVudF9kdXJhdGlvbiA+IElOVDY0X01BWCkgewpAQCAtNDc2LDc3ICs0OTEsNzYgQEAKICAgICAgICAgICAgICAgICAgIGhhbGZzY2FsZSwgbUhlYWRlclRpbWVzY2FsZSwgdHJhY2stPnRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIGlmICgodWludDMyX3Qpc2FtcGxlcmF0ZSAhPSB0cmFjay0+dGltZXNjYWxlKXsKLSAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlcmF0ZTolIiBQUklkMzIgIiwgdHJhY2stPnRpbWVzY2FsZSBhbmQgc2FtcGxlcmF0ZSBhcmUgZGlmZmVyZW50ISIsIHNhbXBsZXJhdGUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJzYW1wbGVyYXRlOiUiIFBSSWQzMiAiLCB0cmFjay0+dGltZXNjYWxlIGFuZCBzYW1wbGVyYXRlIGFyZSBkaWZmZXJlbnQhIiwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlcmF0ZSk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgZGVsYXk7Ci0gICAgICAgICAgICAvLyBkZWxheSA9ICgobWVkaWFfdGltZSAqIHNhbXBsZXJhdGUpICsgaGFsZnNjYWxlKSAvIHRyYWNrLT50aW1lc2NhbGU7Ci0gICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBzYW1wbGVyYXRlLCAmZGVsYXkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVsYXksIGhhbGZzY2FsZSwgJmRlbGF5KSB8fAotICAgICAgICAgICAgICAgICAgICAoZGVsYXkgLz0gbUhlYWRlclRpbWVzY2FsZSwgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSBjYWxjdWxhdGVkIGRlbGF5IHNob3VsZCBiZSBzbWFsbCwgYnV0IHNvbWUgYXBwcwotICAgICAgICAgICAgICAgICAgICAgKiBhcHBlYXIgdG8gd3JpdGUgYSBib2d1cyBlZGl0IGxpc3QgdGhhdCBjYXVzZXMgYSByZWFsbHkKLSAgICAgICAgICAgICAgICAgICAgICogbGFyZ2UgZGVsYXksIHJlc3VsdGluZyBpbiBwbGF5YmFjayBwcm9ibGVtcy4KLSAgICAgICAgICAgICAgICAgICAgICogSWdub3JlIHN1Y2ggZWRpdCBsaXN0cy4KLSAgICAgICAgICAgICAgICAgICAgICogKDQwOTYgaXMgZW5vdWdoIHRvIGRyb3AgNCBmdWxsIHNhbXBsZXMpCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBkZWxheSA+IDQwOTYgfHwKLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoIGJvZ3VzIHZhbHVlcyIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJkZWxheSA9ICUiIFBSSWQ2NCwgZGVsYXkpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZGVsYXkpOwotCi0gICAgICAgICAgICBpbnQ2NF90IHNjYWxlZF9kdXJhdGlvbjsKLSAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKLSAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9lbmQ7Ci0gICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmc7Ci0gICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZHVyYXRpb25fZTY7Ci0gICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWVfc2NhbGVkX2U2OwotICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lX3NjYWxlZDsKLSAgICAgICAgICAgIC8vIHBhZGRpbmcgPSBzY2FsZWRfZHVyYXRpb24gLSAoKHNlZ21lbnRfZHVyYXRpb24gKiAxMDAwMDAwKSArCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICgobWVkaWFfdGltZSAqIG1IZWFkZXJUaW1lU2NhbGUgKiAxMDAwMDAwKS90cmFjay0+dGltZXNjYWxlKSApCi0gICAgICAgICAgICAvLyBzZWdtZW50X2R1cmF0aW9uIGlzIGJhc2VkIG9uIHRpbWVzY2FsZSBpbiBtb3ZpZSBoZWFkZXIgYm94KG1kaGQpCi0gICAgICAgICAgICAvLyBtZWRpYV90aW1lIGlzIGJhc2VkIG9uIHRpbWVzY2FsZSB0cmFjayBoZWFkZXIvbWVkaWEgdGltZXNjYWxlCi0gICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uLCAxMDAwMDAwLCAmc2VnbWVudF9kdXJhdGlvbl9lNikgfHwKLSAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWUsIG1IZWFkZXJUaW1lc2NhbGUsICZtZWRpYV90aW1lX3NjYWxlZCkgfHwKLSAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWVfc2NhbGVkLCAxMDAwMDAwLCAmbWVkaWFfdGltZV9zY2FsZWRfZTYpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVkaWFfdGltZV9zY2FsZWRfZTYgLz0gdHJhY2stPnRpbWVzY2FsZTsKLSAgICAgICAgICAgIGlmKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbl9lNiwgbWVkaWFfdGltZV9zY2FsZWRfZTYsICZzZWdtZW50X2VuZCkgfHwKLSAgICAgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNjYWxlZF9kdXJhdGlvbiwgc2VnbWVudF9lbmQsICZwYWRkaW5nKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2VuZCA9ICUiIFBSSWQ2NCAiLCBwYWRkaW5nID0gJSIgUFJJZDY0LCBzZWdtZW50X2VuZCwgcGFkZGluZyk7Ci0gICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmdzYW1wbGVzID0gMDsKLSAgICAgICAgICAgIGlmIChwYWRkaW5nIDwgMCkgewotICAgICAgICAgICAgICAgIC8vIHRyYWNrIGR1cmF0aW9uIGZyb20gbWVkaWEgaGVhZGVyICh3aGljaCBpcyB3aGF0IGtLZXlEdXJhdGlvbiBpcykgbWlnaHQKLSAgICAgICAgICAgICAgICAvLyBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCi0gICAgICAgICAgICAgICAgLy8gcGFkZGluZyBuZWdhdGl2ZS4gQ2xhbXAgdG8gemVyby4KLSAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGVfZTY7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc2NhbGVfZTY7Ci0gICAgICAgICAgICAgICAgLy8gcGFkZGluZ3NhbXBsZXMgPSAoKHBhZGRpbmcgKiBzYW1wbGVyYXRlKSArIChoYWxmc2NhbGUgKiAxMDAwMDAwKSkKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAvIChtSGVhZGVyVGltZXNjYWxlICogMTAwMDAwMCk7Ci0gICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cocGFkZGluZywgc2FtcGxlcmF0ZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhoYWxmc2NhbGUsIDEwMDAwMDAsICZoYWxmc2NhbGVfZTYpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1IZWFkZXJUaW1lc2NhbGUsIDEwMDAwMDAsICZ0aW1lc2NhbGVfZTYpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHBhZGRpbmdzYW1wbGVzLCBoYWxmc2NhbGVfZTYsICZwYWRkaW5nc2FtcGxlcykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwYWRkaW5nc2FtcGxlcyAvPSB0aW1lc2NhbGVfZTYsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ3NhbXBsZXMgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIC8vIEJvdGggZGVsYXkgYW5kIHBhZGRpbmdzYW1wbGVzIGhhdmUgdG8gYmUgc2V0IGlub3JkZXIgZm9yIGVpdGhlciB0byBiZQorICAgICAgICAgICAgLy8gZWZmZWN0aXZlIGluIHRoZSBsb3dlciBsYXllcnMuCisgICAgICAgICAgICBpbnQ2NF90IGRlbGF5ID0gMDsKKyAgICAgICAgICAgIGlmIChtZWRpYV90aW1lID4gMCkgeyAvLyBHYXBsZXNzIHBsYXliYWNrCisgICAgICAgICAgICAgICAgLy8gZGVsYXkgPSAoKG1lZGlhX3RpbWUgKiBzYW1wbGVyYXRlKSArIGhhbGZzY2FsZSkgLyB0cmFjay0+dGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWUsIHNhbXBsZXJhdGUsICZkZWxheSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVsYXksIGhhbGZzY2FsZSwgJmRlbGF5KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGRlbGF5IC89IHRyYWNrLT50aW1lc2NhbGUsIGZhbHNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgPiBJTlQzMl9NQVggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5IDwgSU5UMzJfTUlOKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3Qgd2l0aCBib2d1cyB2YWx1ZXMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJkZWxheSA9ICUiIFBSSWQ2NCwgZGVsYXkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGRlbGF5KTsKKworICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nc2FtcGxlcyA9IDA7CisgICAgICAgICAgICBpZiAoc2VnbWVudF9kdXJhdGlvbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNjYWxlZF9kdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAvLyBzY2FsZWRfZHVyYXRpb24gPSBkdXJhdGlvbiAqIG1IZWFkZXJUaW1lc2NhbGU7CisgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coZHVyYXRpb24sIG1IZWFkZXJUaW1lc2NhbGUsICZzY2FsZWRfZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoInNjYWxlZF9kdXJhdGlvbiA9ICUiIFBSSWQ2NCwgc2NhbGVkX2R1cmF0aW9uKTsKKworICAgICAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9lbmQ7CisgICAgICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nOworICAgICAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9kdXJhdGlvbl9lNjsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWVfc2NhbGVkX2U2OworICAgICAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZV9zY2FsZWQ7CisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyA9IHNjYWxlZF9kdXJhdGlvbiAtICgoc2VnbWVudF9kdXJhdGlvbiAqIDEwMDAwMDApICsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICgobWVkaWFfdGltZSAqIG1IZWFkZXJUaW1lc2NhbGUgKiAxMDAwMDAwKS90cmFjay0+dGltZXNjYWxlKSApCisgICAgICAgICAgICAgICAgLy8gc2VnbWVudF9kdXJhdGlvbiBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgaW4gbW92aWUgaGVhZGVyIGJveChtZGhkKQorICAgICAgICAgICAgICAgIC8vIG1lZGlhX3RpbWUgaXMgYmFzZWQgb24gdGltZXNjYWxlIHRyYWNrIGhlYWRlci9tZWRpYSB0aW1lc2NhbGUKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uLCAxMDAwMDAwLCAmc2VnbWVudF9kdXJhdGlvbl9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBtSGVhZGVyVGltZXNjYWxlLCAmbWVkaWFfdGltZV9zY2FsZWQpIHx8CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZV9zY2FsZWQsIDEwMDAwMDAsICZtZWRpYV90aW1lX3NjYWxlZF9lNikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZWRpYV90aW1lX3NjYWxlZF9lNiAvPSB0cmFjay0+dGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb25fZTYsIG1lZGlhX3RpbWVfc2NhbGVkX2U2LCAmc2VnbWVudF9lbmQpCisgICAgICAgICAgICAgICAgICAgIHx8IF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coc2NhbGVkX2R1cmF0aW9uLCBzZWdtZW50X2VuZCwgJnBhZGRpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoInNlZ21lbnRfZW5kID0gJSIgUFJJZDY0ICIsIHBhZGRpbmcgPSAlIiBQUklkNjQsIHNlZ21lbnRfZW5kLCBwYWRkaW5nKTsKKyAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OIGlzKQorICAgICAgICAgICAgICAgIC8vIG1pZ2h0IGJlIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgc2VnbWVudCBkdXJhdGlvbiwgd2hpY2ggd291bGQgbWFrZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIG5lZ2F0aXZlLiBDbGFtcCB0byB6ZXJvLgorICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGhhbGZzY2FsZV9taHQgPSBtSGVhZGVyVGltZXNjYWxlIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGVfZTY7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXNjYWxlX2U2OworICAgICAgICAgICAgICAgICAgICAvLyBwYWRkaW5nc2FtcGxlcyA9ICgocGFkZGluZyAqIHNhbXBsZXJhdGUpICsgKGhhbGZzY2FsZV9taHQgKiAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLyAobUhlYWRlclRpbWVzY2FsZSAqIDEwMDAwMDApOworICAgICAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhwYWRkaW5nLCBzYW1wbGVyYXRlLCAmcGFkZGluZ3NhbXBsZXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhoYWxmc2NhbGVfbWh0LCAxMDAwMDAwLCAmaGFsZnNjYWxlX2U2KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobUhlYWRlclRpbWVzY2FsZSwgMTAwMDAwMCwgJnRpbWVzY2FsZV9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHBhZGRpbmdzYW1wbGVzLCBoYWxmc2NhbGVfZTYsICZwYWRkaW5nc2FtcGxlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFkZGluZ3NhbXBsZXMgLz0gdGltZXNjYWxlX2U2LCBmYWxzZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nc2FtcGxlcyA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoInBhZGRpbmdzYW1wbGVzID0gJSIgUFJJZDY0LCBwYWRkaW5nc2FtcGxlcyk7Ci0gICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmdzYW1wbGVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmdzYW1wbGVzKTsKICAgICAgICAgfQogICAgIH0oKTsKIApAQCAtNTU1LDcgKzU2OSw3IEBACiAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSB0cnVlOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKHRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgewogICAgICAgICAgICAgLy8gTVBFRzIgdHJhY2tzIGRvIG5vdCBwcm92aWRlIENTRCwgc28gcmVhZCB0aGUgc3RyZWFtIGhlYWRlcgogICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpKSB7CkBAIC01NjgsMzYgKzU4MiwzOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyW2tNYXhUcmFja0hlYWRlclNpemVdOwogICAgICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICZoZWFkZXIsIHNpemUpID09IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldERhdGEoa0tleVN0cmVhbUhlYWRlciwgJ21kYXQnLCBoZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcih0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSLCBoZWFkZXIsIHNpemUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobU1vb2ZPZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmZHVyYXRpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgZmFuY3ksIGp1c3QgcGljayBhIGZyYW1lIG5lYXIgMS80dGggb2YgdGhlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaHVtYm5haWxUaW1lLCBkdXJhdGlvbiAvIDQpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRSwgZHVyYXRpb24gLyA0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OwotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVRpbWU7CisgICAgICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlVGltZTsKICAgICAgICAgICAgICAgICBpZiAodHJhY2stPnRpbWVzY2FsZSAhPSAwICYmCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2FtcGxlVGFibGUtPmZpbmRUaHVtYm5haWxTYW1wbGUoJnNhbXBsZUluZGV4KSA9PSBPSwogICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHJhY2stPnNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgTlVMTCAvKiBvZmZzZXQgKi8sIE5VTEwgLyogc2l6ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRodW1ibmFpbFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KXNhbXBsZVRpbWUgKiAxMDAwMDAwKSAvIHRyYWNrLT50aW1lc2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3Qpc2FtcGxlVGltZSAqIDEwMDAwMDApIC8gdHJhY2stPnRpbWVzY2FsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgbWV0YSA9IHRyYWNrLT5tZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCB0cmFjay0+bWV0YSk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnJlYWRNZXRhRGF0YSgpIHsKQEAgLTYzMiwxMiArNjQ4LDE0IEBACiAgICAgICAgIG9mZjY0X3QgZXhpZk9mZnNldDsKICAgICAgICAgc2l6ZV90IGV4aWZTaXplOwogICAgICAgICBpZiAobUl0ZW1UYWJsZS0+Z2V0RXhpZk9mZnNldEFuZFNpemUoJmV4aWZPZmZzZXQsICZleGlmU2l6ZSkgPT0gT0spIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUV4aWZPZmZzZXQsIChpbnQ2NF90KWV4aWZPZmZzZXQpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RXhpZlNpemUsIChpbnQ2NF90KWV4aWZTaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VYSUZfT0ZGU0VULCAoaW50NjRfdClleGlmT2Zmc2V0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VYSUZfU0laRSwgKGludDY0X3QpZXhpZlNpemUpOwogICAgICAgICB9CiAgICAgICAgIGZvciAodWludDMyX3QgaW1hZ2VJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA8IG1JdGVtVGFibGUtPmNvdW50SW1hZ2VzKCk7IGltYWdlSW5kZXgrKykgewotICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU1ldGEoaW1hZ2VJbmRleCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU1ldGEoaW1hZ2VJbmRleCk7CiAgICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImhlaWYgaW1hZ2UgJXUgaGFzIG5vIG1ldGEhIiwgaW1hZ2VJbmRleCk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC02NjIsMjYgKzY4MCwyOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUxhc3RUcmFjayA9IHRyYWNrOwogCi0gICAgICAgICAgICB0cmFjay0+bWV0YSA9ICoobWV0YS5nZXQoKSk7Ci0gICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICB0cmFjay0+bWV0YSA9IG1ldGE7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsIGltYWdlSW5kZXgpOwogICAgICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOwogICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IDEwMDAwMDA7CisgICAgICAgICAgICB0cmFjay0+ZWxzdFNoaWZ0U3RhcnRUaWNrcyA9IDA7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewogICAgICAgICBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KCJ2aWRlby8iKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpOwogICAgICAgICB9IGVsc2UgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgiYXVkaW8vIikgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImF1ZGlvL21wNCIpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsICJhdWRpby9tcDQiKTsKICAgICAgICAgfSBlbHNlIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoCiAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0hFSUYpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtSW5pdENoZWNrID0gZXJyOwpAQCAtNzA2LDcgKzcyNyw3IEBACiAgICAgICAgICAgICBtZW1jcHkocHRyICsgMjAsIG1Qc3NoW2ldLmRhdGEsIG1Qc3NoW2ldLmRhdGFsZW4pOwogICAgICAgICAgICAgcHRyICs9ICgyMCArIG1Qc3NoW2ldLmRhdGFsZW4pOwogICAgICAgICB9Ci0gICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YShrS2V5UHNzaCwgJ3Bzc2gnLCBidWYsIHBzc2hzaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX1BTU0gsIGJ1ZiwgcHNzaHNpemUpOwogICAgICAgICBmcmVlKGJ1Zik7CiAgICAgfQogCkBAIC05MjIsOCArOTQzLDggQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkU291cmNlLT5zZXRDYWNoZWRSYW5nZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0LCBjaHVua19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UgIT0gTlVMTCAvKiBhc3N1bWUgb3duZXJzaGlwIG9uIHN1Y2Nlc3MgKi8pID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG1DYWNoZWRTb3VyY2UgPSBjYWNoZWRTb3VyY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBhc3N1bWUgb3duZXJzaGlwIG9uIHN1Y2Nlc3MgKi8pID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IGNhY2hlZFNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZWRTb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTk1NywxNCArOTc4LDMzIEBACiAgICAgICAgICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHRyYWNrLT5za2lwVHJhY2sgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gMDsKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKICAgICAgICAgICAgICAgICB0cmFjay0+aGFzX2Vsc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cmFjay0+c3Vic2FtcGxlX2VuY3J5cHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB0cmFjay0+ZWxzdFNoaWZ0U3RhcnRUaWNrcyA9IDA7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKICAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKKworICAgICAgICAgICAgICAgIC8vIHBhc3MgdWRhdGEgdGVybWluYXRlCisgICAgICAgICAgICAgICAgaWYgKG1Jc1FUICYmIHN0b3Bfb2Zmc2V0IC0gKm9mZnNldCA9PSA0ICYmIGNodW5rX3R5cGUgPT0gRk9VUkNDKCJ1ZHRhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIHRoYXQgdWR0YSB0ZXJtaW5hdGVzIHdpdGggdGVybWluYXRlIGNvZGUgeDAwMDAwMDAwCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCAwIHRlcm1pbmF0b3IgaXMgb3B0aW9uYWwgYW5kIHdlIGp1c3QgaGFuZGxlIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGVybWluYXRlX2NvZGUgPSAxOworICAgICAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsICZ0ZXJtaW5hdGVfY29kZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgwID09IHRlcm1pbmF0ZV9jb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVGVybWluYWwgY29kZSBmb3IgdWR0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW52YWxpZCB1ZHRhIFRlcm1pbmFsIGNvZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhY2spIHsKQEAgLTk4MSw4ICsxMDIxLDEwIEBACiAKICAgICAgICAgICAgIGlmIChpc1RyYWNrKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFja0lkOwotICAgICAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZXhhY3Qgb25lIHRyYWNrIGhlYWRlciBwZXIgdHJhY2suCi0gICAgICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBleGFjdGx5IG9uZSB0cmFjayBoZWFkZXIgcGVyIHRyYWNrLgorCisgICAgICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZ0cmFja0lkKSkgewogICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMTA1OCw3ICsxMTAwLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobW9kZSAhPSBrQ3J5cHRvTW9kZVVuZW5jcnlwdGVkKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgbW9kZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIG1vZGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEwODUsNiArMTEyNyw3IEBACiAKICAgICAgICAgICAgIGlmIChlbnRyeV9jb3VudCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIGVudHJ5IGF0IHRoZSBtb21lbnQsIGZvciBnYXBsZXNzIHBsYXliYWNrCisgICAgICAgICAgICAgICAgLy8gb3Igc3RhcnQgb2Zmc2V0CiAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoICVkIGVudHJpZXMiLCBlbnRyeV9jb3VudCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG9mZjY0X3QgZW50cmllc29mZnNldCA9IGRhdGFfb2Zmc2V0ICsgODsKQEAgLTExMzQsMTIgKzExNzcsMTUgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShvcmlnaW5hbF9mb3VyY2MpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBGb3VyQ0MyTUlNRShvcmlnaW5hbF9mb3VyY2MpKTsKICAgICAgICAgICAgIHVpbnQzMl90IG51bV9jaGFubmVscyA9IDA7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSA9IDA7CiAgICAgICAgICAgICBpZiAoQWRqdXN0Q2hhbm5lbHNBbmRSYXRlKG9yaWdpbmFsX2ZvdXJjYywgJm51bV9jaGFubmVscywgJnNhbXBsZV9yYXRlKSkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG51bV9jaGFubmVscyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIElmIGZvcm1hdCB0eXBlIGlzICdhbGFjJywgaXQgaXMgbmVjZXNzYXJ5IHRvIGdldCB0aGUgcGFyYW1ldGVycwpAQCAtMTE2OCwxMSArMTIxNCwxNCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgYml0c1BlclNhbXBsZSA9IGNvb2tpZVs1XTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNvb2tpZVs5XSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgVTMyX0FUKCZjb29raWVbMjBdKSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QWxhY01hZ2ljQ29va2llLCBNZXRhRGF0YTo6VFlQRV9OT05FLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY29va2llWzldKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIFUzMl9BVCgmY29va2llWzIwXSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvb2tpZSwgc2l6ZW9mKGNvb2tpZSkpOwogCiAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBzaXplIG9mIEFMQUMgU3BlY2lmaWMgSW5mbyAoMzYgYnl0ZXMpIGFuZCB0ZXJtaW5hdG9yCiAgICAgICAgICAgICAgICAgLy8gYXRvbSAoOCBieXRlcykuCkBAIC0xMjczLDE2ICsxMzIyLDIzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgdG1wQWxnb3JpdGhtSWQ7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdG1wQWxnb3JpdGhtSWQpKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgZGVmYXVsdEFsZ29yaXRobUlkKTsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsICZ0bXBBbGdvcml0aG1JZCkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIGRlZmF1bHRJVlNpemUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksICd0ZW5jJywgZGVmYXVsdEtleUlkLCAxNik7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssIGRlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgZGVmYXVsdFNraXBCeXRlQmxvY2spOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgZGVmYXVsdElWU2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgZGVmYXVsdEtleUlkLCAxNik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssIGRlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgZGVmYXVsdFNraXBCeXRlQmxvY2spOwogICAgICAgICAgICAgaWYgKGRlZmF1bHRDb25zdGFudEl2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAnZGNpdicsIGRlZmF1bHRDb25zdGFudEl2LT5kYXRhKCksIGRlZmF1bHRDb25zdGFudEl2LT5zaXplKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29uc3RhbnRJdi0+ZGF0YSgpLCBkZWZhdWx0Q29uc3RhbnRJdi0+c2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNDMxLDggKzE0ODcsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBkdXJhdGlvblVzID0gKChsb25nIGRvdWJsZSlkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzIDwgMCB8fCBkdXJhdGlvblVzID4gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjYW5ub3QgcmVwcmVzZW50ICVsbGQgKiAxMDAwMDAwIC8gJWxsZCBpbiA2NCBiaXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZHVyYXRpb24sIChsb25nIGxvbmcpIG1MYXN0VHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvblVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwpAQCAtMTQ1OSw4ICsxNTIwLDcgQEAKICAgICAgICAgICAgIGxhbmdfY29kZVsyXSA9IChsYW5nWzFdICYgMHgxZikgKyAweDYwOwogICAgICAgICAgICAgbGFuZ19jb2RlWzNdID0gJ1wwJzsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSwgbGFuZ19jb2RlKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE0OTQsNyArMTU1NCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIHR5cGUgb2YgbWVkaWEgcGVyIHRyYWNrLgpAQCAtMTUzNCw5ICsxNTk0LDQwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IG1pbWVGb3JtYXQoKGNvbnN0IGNoYXIgKikoYnVmZmVyLmdldCgpKSwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWVGb3JtYXQuc3RyaW5nKCkpOworICAgICAgICAgICAgLy8gUHJpb3IgdG8gQVBJIDI5LCB0aGUgbWV0YWRhdGEgdHJhY2sgd2FzIG5vdCBjb21wbGlhbnQgd2l0aCBJU08vSUVDCisgICAgICAgICAgICAvLyAxNDQ5Ni0xMi0yMDE1LiBUaGlzIGxlZCB0byBzb21lIElTTy1jb21wbGlhbnQgcGFyc2VycyBmYWlsaW5nIHRvIHJlYWQgdGhlCisgICAgICAgICAgICAvLyBtZXRhdHJhY2suIEFzIG9mIEFQSSAyOSBhbmQgb253YXJkcywgYSBjaGFuZ2Ugd2FzIG1hZGUgdG8gbWV0YWRhdGEgdHJhY2sgdG8KKyAgICAgICAgICAgIC8vIG1ha2UgaXQgY29tcGxpYW50IHdpdGggdGhlIHN0YW5kYXJkLiBUaGUgd29ya2Fyb3VuZCBpcyB0byB3cml0ZSB0aGUKKyAgICAgICAgICAgIC8vIG51bGwtdGVybWluYXRlZCBtaW1lX2Zvcm1hdCBzdHJpbmcgdHdpY2UuIFRoaXMgYWxsb3dzIGNvbXBsaWFudCBwYXJzZXJzIHRvCisgICAgICAgICAgICAvLyByZWFkIHRoZSBtaXNzaW5nIHJlc2VydmVkLCBkYXRhX3JlZmVyZW5jZV9pbmRleCwgYW5kIGNvbnRlbnRfZW5jb2RpbmcgZmllbGRzCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBmaXJzdCBtaW1lX3R5cGUgc3RyaW5nLiBUaGUgYWN0dWFsIG1pbWVfZm9ybWF0IGZpZWxkIHdvdWxkIHRoZW4gYmUKKyAgICAgICAgICAgIC8vIHJlYWQgY29ycmVjdGx5IGZyb20gdGhlIHNlY29uZCBzdHJpbmcuIFRoZSBub24tY29tcGxpYW50IEFuZHJvaWQgZnJhbWV3b3JrcworICAgICAgICAgICAgLy8gZnJvbSBBUEkgMjggYW5kIGVhcmxpZXIgd291bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBtaW1lX2Zvcm1hdCBjb3JyZWN0bHkKKyAgICAgICAgICAgIC8vIGFzIGl0IHdvdWxkIG9ubHkgcmVhZCB0aGUgZmlyc3QgbnVsbC10ZXJtaW5hdGVkIG1pbWVfZm9ybWF0IHN0cmluZy4gVG8gZW5hYmxlCisgICAgICAgICAgICAvLyByZWFkaW5nIG1ldGFkYXRhIHRyYWNrcyBnZW5lcmF0ZWQgZnJvbSBib3RoIHRoZSBub24tY29tcGxpYW50IGFuZCBjb21wbGlhbnQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMsIGEgY2hlY2sgbmVlZHMgdG8gYmUgZG9uZSB0byBzZWUgd2hpY2ggZm9ybWF0IGlzIHVzZWQuCisgICAgICAgICAgICBpbnQgbnVsbF9wb3MgPSAwOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyID0gYnVmZmVyLmdldCgpOworICAgICAgICAgICAgd2hpbGUgKG51bGxfcG9zIDwgY2h1bmtfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgIGlmICgqKHN0ciArIG51bGxfcG9zKSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKytudWxsX3BvczsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG51bGxfcG9zID09IGNodW5rX2RhdGFfc2l6ZSAtIDEpIHsKKyAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBzdGFuZGFyZCBvbXBsaWFudCBtZXRhZGF0YSB0cmFjay4KKyAgICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbmRhcmQgY29tcGxpYW50IG1ldGFkYXRhIHRyYWNrLgorICAgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRFbmNvZGluZygoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkgKyA4KSk7CisgICAgICAgICAgICAgIFN0cmluZzggbWltZUZvcm1hdCgoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkgKyA4ICsgY29udGVudEVuY29kaW5nLnNpemUoKSArIDEpLAorICAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplIC0gOCAtIGNvbnRlbnRFbmNvZGluZy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE1NDcsMTAgKzE2MzgsMTEgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoInR3b3MiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInNvd3QiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImFsYWMiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIi5tcDMiKToKKyAgICAgICAgY2FzZSAweDZENzMwMDU1OiAvLyAibXMgVSIgbXAzIGF1ZGlvCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtSXNRVCAmJiBjaHVua190eXBlID09IEZPVVJDQygibXA0YSIpCi0gICAgICAgICAgICAgICAgICAgICYmIGRlcHRoID49IDEgJiYgbVBhdGhbZGVwdGggLSAxXSA9PSBGT1VSQ0MoIndhdmUiKSkgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBtcDRhIGVtYmVkZGVkIGluIFFUIHdhdmUgYXRvbQorICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGRlcHRoID49IDEgJiYgbVBhdGhbZGVwdGggLSAxXSA9PSBGT1VSQ0MoIndhdmUiKSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhbGwgYXRvbXMgZW1iZWRkZWQgaW4gUVQgd2F2ZSBhdG9tCiAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTU3OSw3ICsxNjcxLDcgQEAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwogCi0gICAgICAgICAgICBpZiAobUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoIm1wNGEiKSkgeworICAgICAgICAgICAgaWYgKG1Jc1FUKSB7CiAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBidWZmZXIsIDE2KSA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CkBAIC0xNjE0LDIwICsxNzA2LDIzIEBACiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygiZW5jYSIpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jYSwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgICAgIEFkanVzdENoYW5uZWxzQW5kUmF0ZShjaHVua190eXBlLCAmbnVtX2NoYW5uZWxzLCAmc2FtcGxlX3JhdGUpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIHNhbXBsZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIHNhbXBsZV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJ0d29zIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVBjbUJpZ0VuZGlhbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgMSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiKioqIGNvZGluZz0nJXMnICVkIGNoYW5uZWxzLCBzaXplICVkLCByYXRlICVkXG4iLAogICAgICAgICAgICAgICAgICAgIGNodW5rLCBudW1fY2hhbm5lbHMsIHNhbXBsZV9zaXplLCBzYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKIAogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJhbGFjIikpIHsKIApAQCAtMTY1MywxMSArMTc0OCwxNCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgYml0c1BlclNhbXBsZSA9IGNvb2tpZVs1XTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNvb2tpZVs5XSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgVTMyX0FUKCZjb29raWVbMjBdKSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleUFsYWNNYWdpY0Nvb2tpZSwgTWV0YURhdGE6OlRZUEVfTk9ORSwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNvb2tpZVs5XSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YoY29va2llKTsKICAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKm9mZnNldCwgc3RvcF9vZmZzZXQpOwpAQCAtMTY4NCw2ICsxNzgyLDcgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImF2YzEiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImh2YzEiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImhldjEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF2MDEiKToKICAgICAgICAgewogICAgICAgICAgICAgdWludDhfdCBidWZmZXJbNzhdOwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7CkBAIC0xNzE1LDEwICsxODE0LDExIEBACiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygiZW5jdiIpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCB3aWR0aCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGhlaWdodCk7CiAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwpAQCAtMTgwNiwxMiArMTkwNiwxNSBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HRSgibWF4IHNhbXBsZSBzaXplIHRvbyBiaWc6ICV6dSIsIG1heF9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhfc2l6ZSArIDEwICogMik7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtYXhfc2l6ZSArIDEwICogMik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIE5vIHNpemUgd2FzIHNwZWNpZmllZC4gUGljayBhIGNvbnNlcnZhdGl2ZWx5IGxhcmdlIHNpemUuCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlXaWR0aCwgKGludDMyX3QqKSZ3aWR0aCkgfHwKLSAgICAgICAgICAgICAgICAgICAgIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlIZWlnaHQsKGludDMyX3QqKSAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAoaW50MzJfdCopJndpZHRoKSB8fAorICAgICAgICAgICAgICAgICAgICAhQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsKGludDMyX3QqKSAmaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm8gd2lkdGggb3IgaGVpZ2h0LCBhc3N1bWluZyB3b3JzdCBjYXNlIDEwODBwIik7CiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMTkyMDsKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMTA4MDsKQEAgLTE4MjYsNyArMTkyOSw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhdWRpbywgdXNlIDEyOEtCCiAgICAgICAgICAgICAgICAgICAgIG1heF9zaXplID0gMTAyNCAqIDEyODsKQEAgLTE4NDMsMjYgKzE5NDYsMjggQEAKICAgICAgICAgICAgICAgICAvLyBIQUNLOiBhbGxvdyAxMCUgb3ZlcmhlYWQKICAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHNhbXBsZSBzaXplIGZyb20gdHJhZiBhdG9tIGZvciBmcmFnbWVudGVkIE1QRUc0LgogICAgICAgICAgICAgICAgIG1heF9zaXplICs9IG1heF9zaXplIC8gMTA7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhfc2l6ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heF9zaXplKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTk9URTogc2V0dGluZyBhbm90aGVyIHBpZWNlIG9mIG1ldGFkYXRhIGludmFsaWRhdGVzIGFueSBwb2ludGVycyAoc3VjaCBhcyB0aGUKICAgICAgICAgICAgIC8vIG1pbWV0eXBlKSBwcmV2aW91c2x5IG9idGFpbmVkLCBzbyBkb24ndCBjYWNoZSB0aGVtLgogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBmcmFtZSByYXRlLgogICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgICAgICBzaXplX3QgblNhbXBsZXMgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+Y291bnRTYW1wbGVzKCk7CiAgICAgICAgICAgICAgICAgaWYgKG5TYW1wbGVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFja0lkOwotICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJnRyYWNrSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT50cmFja19JRCA9PSAodWludDMyX3QpIHRyYWNrSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT50aW1lc2NhbGUgLyB0LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTg3MCwxNSArMTk3NSwxOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvblVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPSAoblNhbXBsZXMgKiAxMDAwMDAwTEwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkdXJhdGlvblVzID4+IDEpKSAvIGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBmcmFtZVJhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXR0aW5nIGZyYW1lIGNvdW50ICV6dSIsIG5TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVDb3VudCwgblNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5ULCBuU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xODkyLDYgKzIwMDAsMTMgQEAKIAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCisgICAgICAgICAgICBpZiAoZGVwdGggPj0gMSAmJiBtUGF0aFtkZXB0aCAtIDFdICE9IEZPVVJDQygic3RibCIpKSB7CisgICAgICAgICAgICAgICAgY2hhciBjaHVua1s1XTsKKyAgICAgICAgICAgICAgICBNYWtlRm91ckNDU3RyaW5nKG1QYXRoW2RlcHRoIC0gMV0sIGNodW5rKTsKKyAgICAgICAgICAgICAgICBBTE9HVygic3R0cydzIHBhcmVudCBib3ggKCVzKSBpcyBub3Qgc3RibCwgc2tpcCBpdC4iLCBjaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFRpbWVUb1NhbXBsZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwpAQCAtMTk4Niw3ICsyMTAxLDcgQEAKICAgICAgICAgICAgIGlmIChidWZmZXJbbGVuIC0gMV0gIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAnLyc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUxvY2F0aW9uLCAmYnVmZmVyWzBdKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTiwgJmJ1ZmZlclswXSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xOTk4LDkgKzIxMTMsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50OF90IGJ1ZmZlclsyNTZdOwotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA+IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgICAgICBhdXRvIHRtcCA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IHRtcC5nZXQoKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKQEAgLTIwMTYsOCArMjEzMiw4IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUVTRFMsIGtUeXBlRVNEUywgJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOwogCiAgICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID49IDIKICAgICAgICAgICAgICAgICAgICAgJiYgbVBhdGhbbVBhdGguc2l6ZSgpIC0gMl0gPT0gRk9VUkNDKCJtcDRhIikpIHsKQEAgLTIwNDEsNyArMjE1Nyw4IEBACiAgICAgICAgICAgICAgICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKICAgICAgICAgICAgICAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA+PSAweDYwICYmIG9iamVjdFR5cGVJbmRpY2F0aW9uIDw9IDB4NjUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMDY4LDEwICsyMTg1LDEyIEBACiAgICAgICAgICAgICB1aW50MzJfdCBtYXhCaXRyYXRlID0gVTMyX0FUKCZidWZmZXJbNF0pOwogICAgICAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzhdKTsKICAgICAgICAgICAgIGlmIChtYXhCaXRyYXRlID4gMCAmJiBtYXhCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYXZnQml0cmF0ZSA+IDAgJiYgYXZnQml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjA5NSw4ICsyMjE0LDggQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QVZDQywga1R5cGVBVkNDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIxMTcsMTMgKzIyMzYsMzUgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5SFZDQywga1R5cGVIVkNDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCJhdjFDIik6CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gaGVhcGJ1ZmZlcjx1aW50OF90PihjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiZDI2MyIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC0yMTUzLDcgKzIyOTQsOCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0QyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIyODEsMTUgKzI0MjMsMTUgQEAKICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCAmJiBkdXJhdGlvbiA8IFVJTlQ2NF9NQVggLyAxMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggczsKICAgICAgICAgICAgIGlmIChjb252ZXJ0VGltZVRvRGF0ZShjcmVhdGlvblRpbWUsICZzKSkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5RGF0ZSwgcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RBVEUsIHMuc3RyaW5nKCkpOwogICAgICAgICAgICAgfQogCi0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTIzMzEsNyArMjQ3Myw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTIzNjUsNyArMjUwOCw4IEBACiAgICAgICAgICAgICAvLyBmb3IgYSBwcmFjdGljYWwgcmVhc29uIGFzIHZhcmlvdXMgTVBFRzQgY29udGFpbmVycyB1c2UgaXQuCiAgICAgICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoInRleHQiKSB8fCB0eXBlID09IEZPVVJDQygic2J0bCIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMjQwOSwxMSArMjU1MywxMCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBzaXplID0gMDsKICAgICAgICAgICAgIH0KIApAQCAtMjQ0MCw4ICsyNTgzLDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleVRleHRGb3JtYXREYXRhLCAwLCBidWZmZXIsIHNpemUgKyBjaHVua19zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBLCBidWZmZXIsIHNpemUgKyBjaHVua19zaXplKTsKIAogICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwogCkBAIC0yNDczLDggKzI2MTYsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICBrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0KCkgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTQ4LDcgKzI2OTEsNDAgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImFjLTMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgcmV0dXJuIHBhcnNlQUMzU2FtcGxlRW50cnkoZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgLy8gYnlwYXNzIGFjLTMgaWYgcGFyc2UgZmFpbAorICAgICAgICAgICAgaWYgKHBhcnNlQUMzU3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBwYXJzZSBhYy0zIik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImVjLTMiKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgLy8gYnlwYXNzIGVjLTMgaWYgcGFyc2UgZmFpbAorICAgICAgICAgICAgaWYgKHBhcnNlRUFDM1NwZWNpZmljQm94KGRhdGFfb2Zmc2V0KSAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gcGFyc2UgZWMtMyIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCJhYy00Iik6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIC8vIGJ5cGFzcyBhYy00IGlmIHBhcnNlIGZhaWwKKyAgICAgICAgICAgIGlmIChwYXJzZUFDNFNwZWNpZmljQm94KGRhdGFfb2Zmc2V0KSAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gcGFyc2UgYWMtNCIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCJmdHlwIik6CkBAIC0yNjIyLDM2ICsyNzk4LDMzMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU2FtcGxlRW50cnkob2ZmNjRfdCBvZmZzZXQpIHsKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoCisgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgdWludDE2X3QgKmNoYW5uZWxDb3VudCwgdWludDE2X3QgKnNhbXBsZVJhdGUpIHsKICAgICAvLyBza2lwIDE2IGJ5dGVzOgogICAgIC8vICArIDYtYnl0ZSByZXNlcnZlZCwKICAgICAvLyAgKyAyLWJ5dGUgZGF0YSByZWZlcmVuY2UgaW5kZXgsCiAgICAgLy8gICsgOC1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDE2OwotICAgIHVpbnQxNl90IGNoYW5uZWxDb3VudDsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYob2Zmc2V0LCAmY2hhbm5lbENvdW50KSkgeworICAgICpvZmZzZXQgKz0gMTY7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KCpvZmZzZXQsIGNoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIHNhbXBsZSBlbnRyeSBib3g6IGNhbm5vdCByZWFkIGNoYW5uZWwgY291bnQiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgLy8gc2tpcCA4IGJ5dGVzOgogICAgIC8vICArIDItYnl0ZSBjaGFubmVsQ291bnQsCiAgICAgLy8gICsgMi1ieXRlIHNhbXBsZSBzaXplLAogICAgIC8vICArIDQtYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA4OwotICAgIHVpbnQxNl90IHNhbXBsZVJhdGU7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJnNhbXBsZVJhdGUpKSB7Ci0gICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzYW1wbGUgcmF0ZSIpOworICAgICpvZmZzZXQgKz0gODsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYoKm9mZnNldCwgc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIHNhbXBsZSBlbnRyeSBib3g6IGNhbm5vdCByZWFkIHNhbXBsZSByYXRlIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotCiAgICAgLy8gc2tpcCA0IGJ5dGVzOgogICAgIC8vICArIDItYnl0ZSBzYW1wbGVSYXRlLAogICAgIC8vICArIDItYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA0OwotICAgIHJldHVybiBwYXJzZUFDM1NwZWNpZmljQm94KG9mZnNldCwgc2FtcGxlUmF0ZSk7CisgICAgKm9mZnNldCArPSA0OworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU3BlY2lmaWNCb3goCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCBzYW1wbGVSYXRlKSB7CitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzRTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCkgeworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MTZfdCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVsQ291bnQsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIC8vICsgMy1ieXRlIHBheWxvYWQKKyAgICBjb25zdCB1aW50MzJfdCBrQUM0TWluaW11bUJveFNpemUgPSA0ICsgNCArIDM7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8IHNpemUgPCBrQUM0TWluaW11bUJveFNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gKyA0LWJ5dGUgc2l6ZQorICAgIG9mZnNldCArPSA0OworICAgIHVpbnQzMl90IHR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCJkYWM0IikpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGFjNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vICsgNC1ieXRlIHR5cGUKKyAgICBvZmZzZXQgKz0gNDsKKyAgICBjb25zdCB1aW50MzJfdCBrQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZSA9IDExNzY7CisgICAgdWludDhfdCBjaHVua1trQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZV07CisgICAgc3NpemVfdCBkc2lTaXplID0gc2l6ZSAtIDg7IC8vIHNpemUgb2YgYm94IC0gc2l6ZSBhbmQgdHlwZSBmaWVsZHMKKyAgICBpZiAoZHNpU2l6ZSA+PSAoc3NpemVfdClrQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZSB8fAorICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgY2h1bmssIGRzaVNpemUpICE9IGRzaVNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2s6IGJpdHN0cmVhbSBmaWVsZHMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgLy8gKyBzaXplLWJ5dGUgcGF5bG9hZAorICAgIG9mZnNldCArPSBkc2lTaXplOworICAgIEFCaXRSZWFkZXIgYnIoY2h1bmssIGRzaVNpemUpOworICAgIEFDNERTSVBhcnNlciBwYXJzZXIoYnIpOworICAgIGlmICghcGFyc2VyLnBhcnNlKCkpeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHBhcnNpbmcgYWMtNCBzcGVjaWZpYyBibG9jayIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxDb3VudCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworCisgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIHByZXNlbnRhdGlvbnM7CisgICAgLy8gdHJhbnNsYXRlIHRoZSBBQzQgcHJlc2VudGF0aW9uIGluZm9ybWF0aW9uIHRvIGF1ZGlvIHByZXNlbnRhdGlvbnMgZm9yIHRoaXMgdHJhY2sKKyAgICBBQzREU0lQYXJzZXI6OkFDNFByZXNlbnRhdGlvbnMgYWM0UHJlc2VudGF0aW9ucyA9IHBhcnNlci5nZXRQcmVzZW50YXRpb25zKCk7CisgICAgaWYgKCFhYzRQcmVzZW50YXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhYzRQcmVzZW50YXRpb24gOiBhYzRQcmVzZW50YXRpb25zKSB7CisgICAgICAgICAgICBhdXRvJiBwcmVzZW50YXRpb24gPSBhYzRQcmVzZW50YXRpb24uc2Vjb25kOworICAgICAgICAgICAgaWYgKCFwcmVzZW50YXRpb24ubUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICBhcC5tUHJlc2VudGF0aW9uSWQgPSBwcmVzZW50YXRpb24ubUdyb3VwSW5kZXg7CisgICAgICAgICAgICBhcC5tUHJvZ3JhbUlkID0gcHJlc2VudGF0aW9uLm1Qcm9ncmFtSUQ7CisgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBwcmVzZW50YXRpb24ubUxhbmd1YWdlOworICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbi5tUHJlVmlydHVhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl9IRUFEUEhPTkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocHJlc2VudGF0aW9uLm1DaGFubmVsTW9kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfTW9ubzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlX1N0ZXJlbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SX1NURVJFTzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfM18wOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfNV8wOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfNV8xOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzM0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzM0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzUyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzUyOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfU1VSUk9VTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMF8zMjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfMzIyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzlfMF80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfOV8xXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV8yMl8yOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfM0Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbW9kZSBpbiBBQzQgcHJlc2VudGF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSAocHJlc2VudGF0aW9uLm1Db250ZW50Q2xhc3NpZmllciA9PQorICAgICAgICAgICAgICAgICAgICBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a1Zpc3VhbGx5SW1wYWlyZWQpOworICAgICAgICAgICAgYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IChwcmVzZW50YXRpb24ubUNvbnRlbnRDbGFzc2lmaWVyID09CisgICAgICAgICAgICAgICAgICAgIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprVm9pY2VPdmVyKTsKKyAgICAgICAgICAgIGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gcHJlc2VudGF0aW9uLm1IYXNEaWFsb2dFbmhhbmNlbWVudHM7CisgICAgICAgICAgICBpZiAoIWFwLm1MYW5ndWFnZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYXAubUxhYmVscy5lbXBsYWNlKGFwLm1MYW5ndWFnZSwgcHJlc2VudGF0aW9uLm1EZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmVzZW50YXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoYXApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmVzZW50YXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gQ2xlYXIgYXVkaW8gcHJlc2VudGF0aW9uIGluZm8gaW4gbWV0YWRhdGEuCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgbnVsbHB0ciwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dFN0cmVhbShzdGQ6Omlvczo6b3V0KTsKKyAgICAgICAgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHByZXNlbnRhdGlvbnMsICZvdXRTdHJlYW0pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKAorICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sCisgICAgICAgICAgICAgICAgb3V0U3RyZWFtLnN0cigpLmRhdGEoKSwgb3V0U3RyZWFtLnN0cigpLnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlRUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxzOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbHMsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIC8vICsgMy1ieXRlIHBheWxvYWQKKyAgICBjb25zdCB1aW50MzJfdCBrRUFDM1NwZWNpZmljQm94TWluU2l6ZSA9IDExOworICAgIC8vIDEzICsgMyArICg4ICogKDIgKyA1ICsgNSArIDMgKyAxICsgMyArIDQgKyAoMTQgKiA5ICsgMSkpKSBiaXRzID09IDE1MiBieXRlcyB0aGVvcmV0aWNhbCBtYXgKKyAgICAvLyBjYWxjdWxhdGVkIGZyb20gdGhlIHJlcXVpcmVkIGJpdHMgcmVhZCBiZWxvdyBhcyB3ZWxsIGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRlcGVuZGVudAorICAgIC8vIGFuZCBkZXBlbmRhbnQgc3ViIHN0cmVhbXMgeW91IGNhbiBoYXZlCisgICAgY29uc3QgdWludDMyX3Qga0VBQzNTcGVjaWZpY0JveE1heFNpemUgPSAxNTI7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8CisgICAgICAgIHNpemUgPCBrRUFDM1NwZWNpZmljQm94TWluU2l6ZSB8fAorICAgICAgICBzaXplID4ga0VBQzNTcGVjaWZpY0JveE1heFNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGVhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzcGVjaWZpYyBib3ggc2l6ZSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9mZnNldCArPSA0OworICAgIHVpbnQzMl90IHR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCJkZWMzIikpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGVhYy0zIHNwZWNpZmljIGJsb2NrOiBoZWFkZXIgbm90IGRlYzMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBvZmZzZXQgKz0gNDsKKyAgICB1aW50OF90KiBjaHVuayA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemVdOworICAgIGlmIChjaHVuayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBjaHVuaywgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgc3BlY2lmaWMgYmxvY2s6IGJpdHN0cmVhbSBmaWVsZHMiKTsKKyAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgQUJpdFJlYWRlciBicihjaHVuaywgc2l6ZSk7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZVJhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OworCisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdW5zaWduZWQgZGF0YV9yYXRlID0gYnIuZ2V0Qml0cygxMyk7CisgICAgQUxPR1YoIkVBQzMgZGF0YSByYXRlID0gJWQiLCBkYXRhX3JhdGUpOworCisgICAgdW5zaWduZWQgbnVtX2luZF9zdWIgPSBici5nZXRCaXRzKDMpICsgMTsKKyAgICBBTE9HVigiRUFDMyBpbmRlcGVuZGFudCBzdWJzdHJlYW1zID0gJWQiLCBudW1faW5kX3N1Yik7CisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAobnVtX2luZF9zdWIgKiAyMykpIHsKKyAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX2luZF9zdWI7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBmc2NvZCA9IGJyLmdldEJpdHMoMik7CisgICAgICAgIGlmIChmc2NvZCA9PSAzKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5jb3JyZWN0IGZzY29kICgzKSBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIGJveFNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlVGFibGVbZnNjb2RdOworICAgICAgICBpZiAoYm94U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgic2FtcGxlIHJhdGUgbWlzbWF0Y2g6IGJveFNhbXBsZVJhdGUgPSAlZCwgc2FtcGxlUmF0ZSA9ICVkIiwKKyAgICAgICAgICAgICAgICBib3hTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGJzaWQgPSBici5nZXRCaXRzKDUpOworICAgICAgICBpZiAoYnNpZCA9PSA5IHx8IGJzaWQgPT0gMTApIHsKKyAgICAgICAgICAgIEFMT0dXKCJFQUMzIHN0cmVhbSAoYnNpZD0lZCkgbWF5IGJlIHNpbGVuY2VkIGJ5IHRoZSBkZWNvZGVyIiwgYnNpZCk7CisgICAgICAgIH0gZWxzZSBpZiAoYnNpZCA+IDE2KSB7CisgICAgICAgICAgICBBTE9HRSgiRUFDMyBzdHJlYW0gKGJzaWQ9JWQpIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggRVRTSSBUUyAxMDIgMzY2IHYxLjQuMSIsIGJzaWQpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcAorICAgICAgICBici5za2lwQml0cygyKTsKKyAgICAgICAgdW5zaWduZWQgYnNtb2QgPSBici5nZXRCaXRzKDMpOworICAgICAgICB1bnNpZ25lZCBhY21vZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgIHVuc2lnbmVkIGxmZW9uID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3Qgc3RyZWFtCisgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKKyAgICAgICAgQUxPR1YoImJzbW9kID0gJWQsIGFjbW9kID0gJWQsIGxmZW9uID0gJWQiLCBic21vZCwgYWNtb2QsIGxmZW9uKTsKKworICAgICAgICBici5za2lwQml0cygzKTsKKyAgICAgICAgdW5zaWduZWQgbnVtX2RlcF9zdWIgPSBici5nZXRCaXRzKDQpOworICAgICAgICBBTE9HVigiRUFDMyBkZXBlbmRhbnQgc3Vic3RyZWFtcyA9ICVkIiwgbnVtX2RlcF9zdWIpOworICAgICAgICBpZiAobnVtX2RlcF9zdWIgIT0gMCkgeworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA5KSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjaGFuX2xvY190YmxbXSA9IHsgIkxjL1JjIiwiTHJzL1JycyIsIkNzIiwiVHMiLCJMc2QvUnNkIiwKKyAgICAgICAgICAgICAgICAiTHcvUnciLCJMdmgvUnZoIiwiQ3ZoIiwiTGZlMiIgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5fbG9jID0gYnIuZ2V0Qml0cyg5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1hc2sgPSAxOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IDk7IGorKywgbWFzayA8PD0gMSkgeworICAgICAgICAgICAgICAgIGlmICgoY2hhbl9sb2MgJiBtYXNrKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IHN0cmVhbQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGFyZSAyIGNoYW5uZWxzIGluIHRoZSBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSAwIHx8IGogPT0gMSB8fCBqID09IDQgfHwgaiA9PSA1IHx8IGogPT0gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgJXMiLCBjaGFuX2xvY190Ymxbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSAhPSAwKSB7CisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIG1hc2sgPSBici5nZXRCaXRzKDgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKCgweDEgPDwgaSkgJiYgbWFzaykgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb21wbGV4aXR5ID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZvdW5kIGEgSk9DIHN0cmVhbSB3aXRoIGNvbXBsZXhpdHkgPSAlZCIsIGNvbXBsZXhpdHkpOworICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDgpOworICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisKKyAgICBkZWxldGVbXSBjaHVuazsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxzOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbHMsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgdWludDMyX3Qgc2l6ZTsKICAgICAvLyArIDQtYnl0ZSBzaXplCiAgICAgLy8gKyA0LWJ5dGUgdHlwZQpAQCAtMjcwNiwxMiArMzE3Niw5IEBACiAgICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOwogICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOwogCi0gICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMpOwotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI4MzEsOCArMzI5OCw5IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKLSAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpZHhEdXJhdGlvbik7CisgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmbWV0YUR1cmF0aW9uKSB8fCBtZXRhRHVyYXRpb24gPT0gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgc2lkeER1cmF0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjkzMCw3ICszMzk4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1NZXRhS2V5TWFwW2luZGV4XS5jX3N0cigpLCAiY29tLmFuZHJvaWQuY2FwdHVyZS5mcHMiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgKihmbG9hdCAqKSZ2YWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFLCAqKGZsb2F0ICopJnZhbCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IDY3ICYmIGRhdGFTaXplID49IDQpIHsKICAgICAgICAgLy8gQkUgc2lnbmVkIGludDMyCkBAIC0yOTM5LDcgKzM0MDcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC52aWRlby50ZW1wb3JhbF9sYXllcnNfY291bnQiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllckNvdW50LCB2YWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQsIHZhbCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBhZGQgbW9yZSBrZXlzIGlmIG5lZWRlZApAQCAtMjk5Myw3ICszNDYyLDcgQEAKICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaWQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpZCk7CiAKICAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwogICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7CkBAIC0zMDI5LDE1ICszNDk4LDE1IEBACiAgICAgfQogCiAgICAgaWYgKHJvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVJvdGF0aW9uLCByb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgcm90YXRpb25EZWdyZWVzKTsKICAgICB9CiAKICAgICAvLyBIYW5kbGUgcHJlc2VudGF0aW9uIGRpc3BsYXkgc2l6ZSwgd2hpY2ggY291bGQgYmUgZGlmZmVyZW50Ci0gICAgLy8gZnJvbSB0aGUgaW1hZ2Ugc2l6ZSBpbmRpY2F0ZWQgYnkga0tleVdpZHRoIGFuZCBrS2V5SGVpZ2h0LgorICAgIC8vIGZyb20gdGhlIGltYWdlIHNpemUgaW5kaWNhdGVkIGJ5IEFNRURJQUZPUk1BVF9LRVlfV0lEVEggYW5kIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULgogICAgIHVpbnQzMl90IHdpZHRoID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDUyXSk7CiAgICAgdWludDMyX3QgaGVpZ2h0ID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDU2XSk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCB3aWR0aCA+PiAxNik7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgaGVpZ2h0ID4+IDE2KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCB3aWR0aCA+PiAxNik7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIGhlaWdodCA+PiAxNik7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0zMDY1LDUwICszNTM0LDUwIEBACiAKICAgICB1aW50MzJfdCBmbGFncyA9IFUzMl9BVChidWZmZXIpOwogCi0gICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOworICAgIGNvbnN0IGNoYXIgKm1ldGFkYXRhS2V5ID0gbnVsbHB0cjsKICAgICBjaGFyIGNodW5rWzVdOwogICAgIE1ha2VGb3VyQ0NTdHJpbmcobVBhdGhbNF0sIGNodW5rKTsKICAgICBBTE9HVigibWV0YTogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICBzd2l0Y2ggKChpbnQzMl90KW1QYXRoWzRdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxYWxiIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW0iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFBUlQiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhQVJUIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtQXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW1hcnRpc3QiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFkYXkiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5WWVhcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gInllYXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFuYW0iKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5VGl0bGU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ0aXRsZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiXDI1MXdydCIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlXcml0ZXI7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ3cml0ZXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImNvdnIiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW1BcnQ7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhbGJ1bWFydCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiZ25yZSIpOgogICAgICAgICBjYXNlIEZPVVJDQygiXDI1MWdlbiIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImdlbnJlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJjcGlsIik6CkBAIC0zMTE4LDcgKzM1ODcsNyBAQAogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGludClidWZmZXJbc2l6ZSAtIDFdKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q29tcGlsYXRpb24sIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMxMzAsNyArMzU5OSw3IEBACiAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBUb3RhbFRyYWNrcyA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMl07CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZC8lZCIsIG50b2hzKCpwVHJhY2spLCBudG9ocygqcFRvdGFsVHJhY2tzKSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNEVHJhY2tOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzE0Miw3ICszNjExLDcgQEAKICAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRvdGFsRGlzY3MgPSAodWludDE2X3QqKSZidWZmZXJbMTJdOwogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQvJWQiLCBudG9ocygqcERpc2MpLCBudG9ocygqcFRvdGFsRGlzY3MpKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5RGlzY051bWJlciwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMTg2LDggKzM2NTUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGRlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgcGFkZGluZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTMyMDIsMTIgKzM2NzMsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChzaXplID49IDggJiYgbWV0YWRhdGFLZXkgJiYgIW1GaWxlTWV0YURhdGEuaGFzRGF0YShtZXRhZGF0YUtleSkpIHsKLSAgICAgICAgaWYgKG1ldGFkYXRhS2V5ID09IGtLZXlBbGJ1bUFydCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsCisgICAgdm9pZCAqdG1wRGF0YTsKKyAgICBzaXplX3QgdG1wRGF0YVNpemU7CisgICAgaWYgKHNpemUgPj0gOCAmJiBtZXRhZGF0YUtleSAmJgorICAgICAgICAgICAgIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksICZ0bXBEYXRhLCAmdG1wRGF0YVNpemUpKSB7CisgICAgICAgIGlmICghc3RyY21wKG1ldGFkYXRhS2V5LCAiYWxidW1hcnQiKSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyICsgOCwgc2l6ZSAtIDgpOwotICAgICAgICB9IGVsc2UgaWYgKG1ldGFkYXRhS2V5ID09IGtLZXlHZW5yZSkgeworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobWV0YWRhdGFLZXksICJnZW5yZSIpKSB7CiAgICAgICAgICAgICBpZiAoZmxhZ3MgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIHVpbnQ4X3QgZ2VucmUgY29kZSwgaVR1bmVzIGdlbnJlIGNvZGVzIGFyZQogICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFuZGFyZCBpZDMgY29kZXMsIGV4Y2VwdCB0aGV5IHN0YXJ0CkBAIC0zMjIxLDE4ICszNjk0LDE4IEBACiAgICAgICAgICAgICAgICAgY2hhciBnZW5yZVsxMF07CiAgICAgICAgICAgICAgICAgc3ByaW50ZihnZW5yZSwgIiVkIiwgZ2VucmVjb2RlKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgZ2VucmUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIGdlbnJlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgPT0gMSkgewogICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBnZW5yZSBzdHJpbmcKICAgICAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7CiAKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzI2MiwyMSArMzczNSwzMSBAQAogICAgIGludDMyX3QgdHlwZSA9IFUzMl9BVCgmYnVmZmVyWzBdKTsKICAgICBpZiAoKHR5cGUgPT0gRk9VUkNDKCJuY2x4IikgJiYgc2l6ZSA+PSAxMSkKICAgICAgICAgICAgIHx8ICh0eXBlID09IEZPVVJDQygibmNsYyIpICYmIHNpemUgPj0gMTApKSB7Ci0gICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gVTE2X0FUKCZidWZmZXJbNF0pOwotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gVTE2X0FUKCZidWZmZXJbNl0pOwotICAgICAgICBpbnQzMl90IGNvZWZmcyA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKLSAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSAodHlwZSA9PSBGT1VSQ0MoIm5jbHgiKSkgJiYgKGJ1ZmZlclsxMF0gJiAxMjgpOwotCi0gICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOwotCiAgICAgICAgIC8vIG9ubHkgc3RvcmUgdGhlIGZpcnN0IGNvbG9yIHNwZWNpZmljYXRpb24KLSAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmhhc0RhdGEoa0tleUNvbG9yUHJpbWFyaWVzKSkgewotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JQcmltYXJpZXMsIGFzcGVjdHMubVByaW1hcmllcyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCBhc3BlY3RzLm1UcmFuc2Zlcik7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvck1hdHJpeCwgYXNwZWN0cy5tTWF0cml4Q29lZmZzKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yUmFuZ2UsIGFzcGVjdHMubVJhbmdlKTsKKyAgICAgICAgaW50MzJfdCBleGlzdGluZ0NvbG9yOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UsICZleGlzdGluZ0NvbG9yKSkgeworICAgICAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSBVMTZfQVQoJmJ1ZmZlcls0XSk7CisgICAgICAgICAgICBpbnQzMl90IGlzb3RyYW5zZmVyID0gVTE2X0FUKCZidWZmZXJbNl0pOworICAgICAgICAgICAgaW50MzJfdCBjb2VmZnMgPSBVMTZfQVQoJmJ1ZmZlcls4XSk7CisgICAgICAgICAgICBib29sIGZ1bGxSYW5nZSA9ICh0eXBlID09IEZPVVJDQygibmNseCIpKSAmJiAoYnVmZmVyWzEwXSAmIDEyOCk7CisKKyAgICAgICAgICAgIGludDMyX3QgcmFuZ2UgPSAwOworICAgICAgICAgICAgaW50MzJfdCBzdGFuZGFyZCA9IDA7CisgICAgICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gMDsKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWVzLCBpc290cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworCisgICAgICAgICAgICBpZiAocmFuZ2UgIT0gMCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCByYW5nZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhbmRhcmQgIT0gMCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHJhbnNmZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLCB0cmFuc2Zlcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMzMDMsMjYgKzM3ODYsMjYgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgIH0KIAotICAgIHVpbnQzMl90IG1ldGFkYXRhS2V5ID0gMDsKKyAgICBjb25zdCBjaGFyICptZXRhZGF0YUtleSA9IG51bGxwdHI7CiAgICAgc3dpdGNoIChtUGF0aFtkZXB0aF0pIHsKICAgICAgICAgY2FzZSBGT1VSQ0MoInRpdGwiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5VGl0bGU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ0aXRsZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygicGVyZiIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBcnRpc3Q7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhcnRpc3QiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImF1dGgiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5V3JpdGVyOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAid3JpdGVyIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJnbnJlIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiZ2VucmUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImFsYm0iKToKQEAgLTMzMzEsMTAgKzM4MTQsMTAgQEAKICAgICAgICAgICAgICAgY2hhciB0bXBbNF07CiAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJXUiLCBidWZmZXJbc2l6ZSAtIDFdKTsKIAotICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNEVHJhY2tOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJ5cnJjIik6CkBAIC0zMzUyLDcgKzM4MzUsNyBAQAogICAgICAgICAgICAgaWYgKHllYXIgPCAxMDAwMCkgewogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJXUiLCB5ZWFyKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5WWVhciwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfWUVBUiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMzYxLDcgKzM4NDQsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKG1ldGFkYXRhS2V5ID4gMCkgeworICAgIGlmIChtZXRhZGF0YUtleSkgewogICAgICAgICBib29sIGlzVVRGOCA9IHRydWU7IC8vIENvbW1vbiBjYXNlCiAgICAgICAgIGNoYXIxNl90ICpmcmFtZWRhdGEgPSBOVUxMOwogICAgICAgICBpbnQgbGVuMTYgPSAwOyAvLyBOdW1iZXIgb2YgVVRGLTE2IGNoYXJhY3RlcnMKQEAgLTMzOTcsMTEgKzM4ODAsMTEgQEAKIAogICAgICAgICBpZiAoaXNVVEY4KSB7CiAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAwOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA2KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIENvbnZlcnQgZnJvbSBVVEYtMTYgc3RyaW5nIHRvIFVURi04IHN0cmluZy4KICAgICAgICAgICAgIFN0cmluZzggdG1wVVRGOHN0cihmcmFtZWRhdGEsIGxlbjE2KTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgdG1wVVRGOHN0ci5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCB0bXBVVEY4c3RyLnN0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzQxNiwyNyArMzg5OSwyOSBAQAogCiAgICAgaWYgKGlkMy5pc1ZhbGlkKCkpIHsKICAgICAgICAgc3RydWN0IE1hcCB7Ci0gICAgICAgICAgICBpbnQga2V5OworICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5OwogICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnMTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzI7CiAgICAgICAgIH07CiAgICAgICAgIHN0YXRpYyBjb25zdCBNYXAga01hcFtdID0gewotICAgICAgICAgICAgeyBrS2V5QWxidW0sICJUQUxCIiwgIlRBTCIgfSwKLSAgICAgICAgICAgIHsga0tleUFydGlzdCwgIlRQRTEiLCAiVFAxIiB9LAotICAgICAgICAgICAgeyBrS2V5QWxidW1BcnRpc3QsICJUUEUyIiwgIlRQMiIgfSwKLSAgICAgICAgICAgIHsga0tleUNvbXBvc2VyLCAiVENPTSIsICJUQ00iIH0sCi0gICAgICAgICAgICB7IGtLZXlHZW5yZSwgIlRDT04iLCAiVENPIiB9LAotICAgICAgICAgICAgeyBrS2V5VGl0bGUsICJUSVQyIiwgIlRUMiIgfSwKLSAgICAgICAgICAgIHsga0tleVllYXIsICJUWUUiLCAiVFlFUiIgfSwKLSAgICAgICAgICAgIHsga0tleUF1dGhvciwgIlRYVCIsICJURVhUIiB9LAotICAgICAgICAgICAgeyBrS2V5Q0RUcmFja051bWJlciwgIlRSSyIsICJUUkNLIiB9LAotICAgICAgICAgICAgeyBrS2V5RGlzY051bWJlciwgIlRQQSIsICJUUE9TIiB9LAotICAgICAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sICJUQ1AiLCAiVENNUCIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BTEJVTSwgIlRBTEIiLCAiVEFMIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCwgIlRQRTEiLCAiVFAxIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNULCAiVFBFMiIsICJUUDIiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVIsICJUQ09NIiwgIlRDTSIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9HRU5SRSwgIlRDT04iLCAiVENPIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1RJVExFLCAiVElUMiIsICJUVDIiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfWUVBUiwgIlRZRSIsICJUWUVSIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiwgIlRYVCIsICJURVhUIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsICJUUksiLCAiVFJDSyIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSLCAiVFBBIiwgIlRQT1MiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04sICJUQ1AiLCAiVENNUCIgfSwKICAgICAgICAgfTsKICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtTWFwRW50cmllcyA9IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsKIAorICAgICAgICB2b2lkICp0bXBEYXRhOworICAgICAgICBzaXplX3QgdG1wRGF0YVNpemU7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU1hcEVudHJpZXM7ICsraSkgewotICAgICAgICAgICAgaWYgKCFtRmlsZU1ldGFEYXRhLmhhc0RhdGEoa01hcFtpXS5rZXkpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwga01hcFtpXS5rZXksICZ0bXBEYXRhLCAmdG1wRGF0YVNpemUpKSB7CiAgICAgICAgICAgICAgICAgSUQzOjpJdGVyYXRvciAqaXQgPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsIGtNYXBbaV0udGFnMSk7CiAgICAgICAgICAgICAgICAgaWYgKGl0LT5kb25lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OwpAQCAtMzQ1Miw3ICszOTM3LDcgQEAKICAgICAgICAgICAgICAgICBpdC0+Z2V0U3RyaW5nKCZzKTsKICAgICAgICAgICAgICAgICBkZWxldGUgaXQ7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa01hcFtpXS5rZXksIHMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwga01hcFtpXS5rZXksIHMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM0NjEsMTMgKzM5NDYsMTIgQEAKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGlkMy5nZXRBbGJ1bUFydCgmZGF0YVNpemUsICZtaW1lKTsKIAogICAgICAgICBpZiAoZGF0YSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwgZGF0YSwgZGF0YVNpemUpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIG1pbWUuc3RyaW5nKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULCBkYXRhLCBkYXRhU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLU1lZGlhVHJhY2sgKk1QRUc0RXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1QRUc0RXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNDkwLDcgKzM5NzQsNyBAQAogCiAgICAgVHJleCAqdHJleCA9IE5VTEw7CiAgICAgaW50MzJfdCB0cmFja0lkOwotICAgIGlmICh0cmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZ0cmFja0lkKSkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBUcmV4ICp0ID0gJm1UcmV4LmVkaXRJdGVtQXQoaSk7CiAgICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7CkBAIC0zNTA2LDE2ICszOTkwLDE1IEBACiAgICAgQUxPR1YoImdldFRyYWNrIGNhbGxlZCwgcHNzaDogJXp1IiwgbVBzc2guc2l6ZSgpKTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgaWYgKCF0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgIGlmICghQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgc3A8SXRlbVRhYmxlPiBpdGVtVGFibGU7CiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCkBAIC0zNTI2LDEwICs0MDA5LDkgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMzU0MSwxMSArNDAyMywyOSBAQAogICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKSkgewogICAgICAgICAgICAgaXRlbVRhYmxlID0gbUl0ZW1UYWJsZTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSkgeworICAgICAgICB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBpZiAoc2l6ZSA8IDUgfHwgcHRyWzBdICE9IDB4ODEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCBhbmQgIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSBhbmQgdHJhY2stPmVsc3RfbWVkaWFfdGltZSA+IDApIHsKKyAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgPSB0cmFjay0+ZWxzdF9tZWRpYV90aW1lOworICAgICAgICBBTE9HVigidmlkZW8gdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgOiUiIFBSSWQ2NCwgdHJhY2stPmVsc3RfbWVkaWFfdGltZSk7CiAgICAgfQogCiAgICAgTVBFRzRTb3VyY2UgKnNvdXJjZSA9ICBuZXcgTVBFRzRTb3VyY2UoCiAgICAgICAgICAgICB0cmFjay0+bWV0YSwgbURhdGFTb3VyY2UsIHRyYWNrLT50aW1lc2NhbGUsIHRyYWNrLT5zYW1wbGVUYWJsZSwKLSAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQsIGl0ZW1UYWJsZSk7CisgICAgICAgICAgICBtU2lkeEVudHJpZXMsIHRyZXgsIG1Nb29mT2Zmc2V0LCBpdGVtVGFibGUsCisgICAgICAgICAgICB0cmFjay0+ZWxzdFNoaWZ0U3RhcnRUaWNrcyk7CiAgICAgaWYgKHNvdXJjZS0+aW5pdCgpICE9IE9LKSB7CiAgICAgICAgIGRlbGV0ZSBzb3VyY2U7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzU1NiwyNiArNDA1NiwyNiBAQAogLy8gc3RhdGljCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6dmVyaWZ5VHJhY2soVHJhY2sgKnRyYWNrKSB7CiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCi0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemU7CiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKLSAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlQVZDQykgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUhWQ0MpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKLSAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlRVNEUykgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRVNEUywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0KQEAgLTM2NjAsMTYgKzQxNjAsMTQgQEAKICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uICA9PSAweDZiKSB7Ci0gICAgICAgIC8vIFRoZSBtZWRpYSBzdWJ0eXBlIGlzIE1QMyBhdWRpbwotICAgICAgICAvLyBPdXIgc29mdHdhcmUgTVAzIGF1ZGlvIGRlY29kZXIgbWF5IG5vdCBiZSBhYmxlIHRvIGhhbmRsZQotICAgICAgICAvLyBwYWNrZXRpemVkIE1QMyBhdWRpbzsgZm9yIG5vdywgbGV0cyBqdXN0IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRAotICAgICAgICBBTE9HRSgiTVAzIHRyYWNrIGluIE1QNC8zR1BQIGZpbGUgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4NkIgfHwgb2JqZWN0VHlwZUluZGljYXRpb24gPT0gMHg2OSkgeworICAgICAgICAvLyBtcDMgYXVkaW8KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CkBAIC0zNjc3LDEwICs0MTc1LDEyIEBACiAgICAgICAgIHVpbnQzMl90IGF2Z0JpdHJhdGUgPSAwOwogICAgICAgICBlc2RzLmdldEJpdFJhdGUoJm1heEJpdHJhdGUsICZhdmdCaXRyYXRlKTsKICAgICAgICAgaWYgKG1heEJpdHJhdGUgPiAwICYmIG1heEJpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heEJpdFJhdGUsIChpbnQzMl90KW1heEJpdHJhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYXZnQml0cmF0ZSA+IDAgJiYgYXZnQml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM3MjQsNyArNDIyNCw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAvL2tlZXAgQU9UIHR5cGUKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlBQUNBT1QsIG9iamVjdFR5cGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFLCBvYmplY3RUeXBlKTsKIAogICAgIHVpbnQzMl90IGZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CiAKQEAgLTM3NDUsNyArNDI0NSw3IEBACiAgICAgICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2ZyZXFJbmRleF07CiAgICAgfQogCi0gICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgey8vU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YWJsZSAxLjEzCisgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgey8vU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YmwgMS4xMwogICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIHVpbnQzMl90IGV4dEZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgIGludDMyX3QgZXh0U2FtcGxlUmF0ZSBfX3VudXNlZDsKQEAgLTM3NjIsNyArNDI2Miw3IEBACiAgICAgICAgICAgICBleHRTYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtleHRGcmVxSW5kZXhdOwogICAgICAgICB9CiAgICAgICAgIC8vVE9ETzogc2F2ZSB0aGUgZXh0ZW5zaW9uIHNhbXBsaW5nIHJhdGUgdmFsdWUgaW4gbWV0YSBkYXRhID0+Ci0gICAgICAgIC8vICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7CisgICAgICAgIC8vICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKICAgICB9CiAKICAgICBzd2l0Y2ggKG51bUNoYW5uZWxzKSB7CkBAIC0zOTE1LDI0ICs0NDE1LDI1IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICBpbnQzMl90IHByZXZTYW1wbGVSYXRlOwotICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmcHJldlNhbXBsZVJhdGUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnByZXZTYW1wbGVSYXRlKSk7CiAKICAgICBpZiAocHJldlNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgewogICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gc2FtcGxlIHJhdGUgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgc2V0dGluZy4gIgogICAgICAgICAgICAgICJ3YXM6ICVkLCBub3c6ICVkIiwgcHJldlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwogICAgIH0KIAotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKIAogICAgIGludDMyX3QgcHJldkNoYW5uZWxDb3VudDsKLSAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmcHJldkNoYW5uZWxDb3VudCkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmcHJldkNoYW5uZWxDb3VudCkpOwogCiAgICAgaWYgKHByZXZDaGFubmVsQ291bnQgIT0gbnVtQ2hhbm5lbHMpIHsKICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWwgY291bnQgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgc2V0dGluZy4gIgogICAgICAgICAgICAgICJ3YXM6ICVkLCBub3c6ICVkIiwgcHJldkNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwogICAgIH0KIAotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG51bUNoYW5uZWxzKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTM5NDAsMTQgKzQ0NDEsMTUgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUc0U291cmNlOjpNUEVHNFNvdXJjZSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZmb3JtYXQsCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAogICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAogICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCwKLSAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlKQorICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUsCisgICAgICAgIGludDMyX3QgZWxzdFNoaWZ0U3RhcnRUaWNrcykKICAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgIG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRpbWVzY2FsZSh0aW1lU2NhbGUpLApAQCAtMzk2OCw0NiArNDQ3MCw1MCBAQAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyhOVUxMKSwKICAgICAgIG1Jc0FWQyhmYWxzZSksCiAgICAgICBtSXNIRVZDKGZhbHNlKSwKKyAgICAgIG1Jc0FDNChmYWxzZSksCiAgICAgICBtSXNQY20oZmFsc2UpLAogICAgICAgbU5BTExlbmd0aFNpemUoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtQnVmZmVyKE5VTEwpLAotICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKICAgICAgIG1TcmNCdWZmZXIoTlVMTCksCiAgICAgICBtSXNIZWlmKGl0ZW1UYWJsZSAhPSBOVUxMKSwKLSAgICAgIG1JdGVtVGFibGUoaXRlbVRhYmxlKSB7CisgICAgICBtSXRlbVRhYmxlKGl0ZW1UYWJsZSksCisgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyhlbHN0U2hpZnRTdGFydFRpY2tzKSB7CiAKICAgICBtZW1zZXQoJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mbywgMCwgc2l6ZW9mKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbykpOwogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtQ3J5cHRvTW9kZSk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmbUNyeXB0b01vZGUpOwogICAgIG1EZWZhdWx0SVZTaXplID0gMDsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJm1EZWZhdWx0SVZTaXplKTsKLSAgICB1aW50MzJfdCBrZXl0eXBlOwotICAgIGNvbnN0IHZvaWQgKmtleTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgJm1EZWZhdWx0SVZTaXplKTsKKyAgICB2b2lkICprZXk7CiAgICAgc2l6ZV90IGtleXNpemU7Ci0gICAgaWYgKG1Gb3JtYXQuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmtleXR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksICZrZXksICZrZXlzaXplKSkgewogICAgICAgICBDSEVDSyhrZXlzaXplIDw9IDE2KTsKICAgICAgICAgbWVtc2V0KG1DcnlwdG9LZXksIDAsIDE2KTsKICAgICAgICAgbWVtY3B5KG1DcnlwdG9LZXksIGtleSwga2V5c2l6ZSk7CiAgICAgfQogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGJvb2wgc3VjY2VzcyA9IG1Gb3JtYXQuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgYm9vbCBzdWNjZXNzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAogICAgIG1Jc0FWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgbUlzSEVWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHx8CiAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgbUlzQUM0ID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKIAogICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTQwMTcsMTAgKzQ1MjMsOSBAQAogICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBsZW5ndGggb2YgYSBOQUwgdW5pdC4KICAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOwogICAgIH0gZWxzZSBpZiAobUlzSEVWQykgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTQwMzYsMzIgKzQ1NDEsNTQgQEAKICAgICBpZiAobUlzUGNtKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOwogICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUgPSAwOwotICAgICAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKTsKLSAgICAgICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgJmJpdHNQZXJTYW1wbGUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm51bUNoYW5uZWxzKSk7CiAKICAgICAgICAgaW50MzJfdCBieXRlc1BlclNhbXBsZSA9IGJpdHNQZXJTYW1wbGUgPj4gMzsKICAgICAgICAgaW50MzJfdCBwY21TYW1wbGVTaXplID0gYnl0ZXNQZXJTYW1wbGUgKiBudW1DaGFubmVsczsKIAogICAgICAgICBzaXplX3QgbWF4U2FtcGxlU2l6ZTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNYXhTYW1wbGVTaXplKCZtYXhTYW1wbGVTaXplKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBtYXhTYW1wbGVTaXplICE9IHN0YXRpY19jYXN0PHNpemVfdD4ocGNtU2FtcGxlU2l6ZSkgfHwgYml0c1BlclNhbXBsZSAhPSAxNikgeworICAgICAgICBpZiAoZXJyICE9IE9LIHx8IG1heFNhbXBsZVNpemUgIT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwY21TYW1wbGVTaXplKQorICAgICAgICAgICAgICAgfHwgYml0c1BlclNhbXBsZSAhPSAxNikgewogICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZAogICAgICAgICAgICAgbUlzUGNtID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRm9ybWF0LnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBjbVNhbXBsZVNpemUgKiBrTWF4UGNtRnJhbWVTaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBwY21TYW1wbGVTaXplICoga01heFBjbUZyYW1lU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDSyhmb3JtYXQuZmluZEludDMyKGtLZXlUcmFja0lELCAmbVRyYWNrSWQpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmbVRyYWNrSWQpKTsKIAogfQogCiBzdGF0dXNfdCBNUEVHNFNvdXJjZTo6aW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ICE9IDApIHsKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OwotICAgICAgICByZXR1cm4gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgaWYoZXJyID09IE9LICYmICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikKKyAgICAgICAgICAgICYmICFtQ3VycmVudFNhbXBsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBTdGFydCBvZmZzZXQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdG8gY29tcG9zaXRpb24gdGltZSBvZiBmaXJzdCBzYW1wbGUuCisgICAgICAgICAgICAvLyBJU08gOiBzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXQsIHZlcnNpb24gMCAodW5zaWduZWQpIGZvciBtYWpvciBicmFuZHMuCisgICAgICAgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyA9IHN0ZDo6bWluKG1FbHN0U2hpZnRTdGFydFRpY2tzLAorICAgICAgICAgICAgICAgICgqbUN1cnJlbnRTYW1wbGVzLmJlZ2luKCkpLmNvbXBvc2l0aW9uT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICByZXR1cm4gT0s7CisKKyAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgeworICAgICAgICB1aW50NjRfdCBmaXJzdFNhbXBsZUNUUyA9IDA7CisgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoMCwgTlVMTCwgTlVMTCwgJmZpcnN0U2FtcGxlQ1RTKTsKKyAgICAgICAgLy8gU3RhcnQgb2Zmc2V0IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHRvIGNvbXBvc2l0aW9uIHRpbWUgb2YgZmlyc3Qgc2FtcGxlLgorICAgICAgICAvLyBDb21wb3NpdGlvbiB0aW1lIHN0YW1wIG9mIGZpcnN0IHNhbXBsZSBjYW5ub3QgYmUgbmVnYXRpdmUuCisgICAgICAgIG1FbHN0U2hpZnRTdGFydFRpY2tzID0gc3RkOjptaW4obUVsc3RTaGlmdFN0YXJ0VGlja3MsIChpbnQzMl90KWZpcnN0U2FtcGxlQ1RTKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOwogfQogCiBNUEVHNFNvdXJjZTo6fk1QRUc0U291cmNlKCkgewpAQCAtNDA3MiwyMSArNDU5OSwxMyBAQAogICAgIGZyZWUobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyk7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0YXJ0KCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCi0gICAgaW50MzJfdCB2YWw7Ci0gICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMtPmZpbmRJbnQzMihrS2V5V2FudHNOQUxGcmFnbWVudHMsICZ2YWwpCi0gICAgICAgICYmIHZhbCAhPSAwKSB7Ci0gICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gZmFsc2U7Ci0gICAgfQotCiAgICAgaW50MzJfdCB0bXA7Ci0gICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJnRtcCkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCAmdG1wKSk7CiAgICAgc2l6ZV90IG1heF9zaXplID0gdG1wOwogCiAgICAgLy8gQSBzb21ld2hhdCBhcmJpdHJhcnkgbGltaXQgdGhhdCBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgOGsgdmlkZW8gZnJhbWVzCkBAIC00MDk0LDMyICs0NjEzLDMwIEBACiAgICAgY29uc3Qgc2l6ZV90IGtNYXhCdWZmZXJTaXplID0gNjQgKiAxMDI0ICogMTAyNDsKICAgICBpZiAobWF4X3NpemUgPiBrTWF4QnVmZmVyU2l6ZSkgewogICAgICAgICBBTE9HRSgiYm9ndXMgbWF4IGlucHV0IHNpemU6ICV6dSA+ICV6dSIsIG1heF9zaXplLCBrTWF4QnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBpZiAobWF4X3NpemUgPT0gMCkgewogICAgICAgICBBTE9HRSgiemVybyBtYXggaW5wdXQgc2l6ZSIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICAvLyBBbGxvdyB1cCB0byBrTWF4QnVmZmVycywgYnV0IG5vdCBpZiB0aGUgdG90YWwgZXhjZWVkcyBrTWF4QnVmZmVyU2l6ZS4KICAgICBjb25zdCBzaXplX3Qga0luaXRpYWxCdWZmZXJzID0gMjsKICAgICBjb25zdCBzaXplX3Qga01heEJ1ZmZlcnMgPSA4OwogICAgIGNvbnN0IHNpemVfdCByZWFsTWF4QnVmZmVycyA9IG1pbihrTWF4QnVmZmVyU2l6ZSAvIG1heF9zaXplLCBrTWF4QnVmZmVycyk7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoa0luaXRpYWxCdWZmZXJzLCBtYXhfc2l6ZSwgcmVhbE1heEJ1ZmZlcnMpOworICAgIG1CdWZmZXJHcm91cC0+aW5pdChrSW5pdGlhbEJ1ZmZlcnMsIG1heF9zaXplLCByZWFsTWF4QnVmZmVycyk7CiAgICAgbVNyY0J1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W21heF9zaXplXTsKICAgICBpZiAobVNyY0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIGZpbGUgcHJvYmFibHkgc3BlY2lmaWVkIGEgYmFkIG1heCBzaXplCi0gICAgICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgICAgIG1Hcm91cCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpzdG9wKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CkBAIC00MTMyLDEzICs0NjQ5LDEwIEBACiAgICAgZGVsZXRlW10gbVNyY0J1ZmZlcjsKICAgICBtU3JjQnVmZmVyID0gTlVMTDsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KSB7CkBAIC00MjU2LDcgKzQ3NzAsOCBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJzYWlvIik6IHsKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKQorICAgICAgICAgICAgICAgICAgICAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC00Mzg3LDcgKzQ5MDIsOCBAQAogICAgIGlmIChlbnRyeWNvdW50ID4gbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSkgewogICAgICAgICB1aW50NjRfdCAqbmV3UHRyID0gKHVpbnQ2NF90ICopcmVhbGxvYyhtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzLCBlbnRyeWNvdW50ICogOCk7CiAgICAgICAgIGlmIChuZXdQdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWFsbG9jICV1IC0+ICV1IiwgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSwgZW50cnljb3VudCAqIDgpOworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWFsbG9jICV1IC0+ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSwgZW50cnljb3VudCAqIDgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzID0gbmV3UHRyOwpAQCAtNDQyNiwxMCArNDk0MiwxMyBAQAogICAgIHJldHVybiBwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMoZHJtb2Zmc2V0LCBmYWxzZSwgMCk7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncykgeworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcygKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncykgewogCi0gICAgaW50IGl2bGVuZ3RoOwotICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCAmaXZsZW5ndGgpKTsKKyAgICBpbnQzMl90IGl2bGVuZ3RoOworICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgJml2bGVuZ3RoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KIAogICAgIC8vIG9ubHkgMCwgOCBhbmQgMTYgYnl0ZSBpbml0aWFsaXphdGlvbiB2ZWN0b3JzIGFyZSBzdXBwb3J0ZWQKICAgICBpZiAoaXZsZW5ndGggIT0gMCAmJiBpdmxlbmd0aCAhPSA4ICYmIGl2bGVuZ3RoICE9IDE2KSB7CkBAIC00NjEyLDcgKzUxMzEsNyBAQAogCiBzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VUcmFja0ZyYWdtZW50UnVuKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpIHsKIAotICAgIEFMT0dWKCJNUEVHNEV4dHJhY3Rvcjo6cGFyc2VUcmFja0ZyYWdtZW50UnVuIik7CisgICAgQUxPR1YoIk1QRUc0U291cmNlOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4iKTsKICAgICBpZiAoc2l6ZSA8IDgpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtNDcxOSw3ICs1MjM4LDcgQEAKICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA8IChvZmY2NF90KShzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSkgeworICAgIGlmIChzaXplIDwgKG9mZjY0X3Qpc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTQ3NTQsMTAgKzUyNzMsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJhZGRpbmcgc2FtcGxlICVkIGF0IG9mZnNldCAweCUwOCIgUFJJeDY0ICIsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCi0gICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IiwgaSArIDEsCisgICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IGN0c09mZnNldCAlIiBQUkl1MzIsIGkgKyAxLAogICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIHNhbXBsZVNpemUsIHNhbXBsZUR1cmF0aW9uLAogICAgICAgICAgICAgICAgIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwCi0gICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MsIHNhbXBsZUN0c09mZnNldCk7CiAgICAgICAgIHRtcC5vZmZzZXQgPSBkYXRhT2Zmc2V0OwogICAgICAgICB0bXAuc2l6ZSA9IHNhbXBsZVNpemU7CiAgICAgICAgIHRtcC5kdXJhdGlvbiA9IHNhbXBsZUR1cmF0aW9uOwpAQCAtNDc3MywxMCArNTI5MiwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtZXRhID0gbUZvcm1hdDsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZvcm1hdCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IE1QRUc0U291cmNlOjpwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3QgewpAQCAtNDc5OCwxNSArNTMxNyw0NCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworaW50MzJfdCBNUEVHNFNvdXJjZTo6cGFyc2VIRVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIENIRUNLKGRhdGEgIT0gbnVsbHB0ciAmJiBzaXplID49IChtTkFMTGVuZ3RoU2l6ZSArIDIpKTsKKworICAgIC8vIEhFVkMgTkFMLWhlYWRlciAoMTYtYml0KQorICAgIC8vICAxICAgNiAgICAgIDYgICAgIDMKKyAgICAvLyB8LXx1dXV1dXV8LS0tLS0tfGlpaXwKKyAgICAvLyAgICAgIF4gICAgICAgICAgICBeCisgICAgLy8gIE5BTF90eXBlICAgICAgICBsYXllcl9pZCArIDEKKyAgICAvLworICAgIC8vIExheWVyLWlkIGlzIG5vbi16ZXJvIG9ubHkgZm9yIFRlbXBvcmFsIFN1Yi1sYXllciBBY2Nlc3MgcGljdHVyZXMgKFRTQSkKKyAgICBlbnVtIHsKKyAgICAgICAgVFNBX04gPSAyLAorICAgICAgICBUU0FfUiA9IDMsCisgICAgICAgIFNUU0FfTiA9IDQsCisgICAgICAgIFNUU0FfUiA9IDUsCisgICAgfTsKKworICAgIGRhdGEgKz0gbU5BTExlbmd0aFNpemU7CisgICAgdWludDE2X3QgbmFsSGVhZGVyID0gZGF0YVswXSA8PCA4IHwgZGF0YVsxXTsKKworICAgIHVpbnQxNl90IG5hbFR5cGUgPSAobmFsSGVhZGVyID4+IDkpICYgMHgzRnU7CisgICAgaWYgKG5hbFR5cGUgPT0gVFNBX04gfHwgbmFsVHlwZSA9PSBUU0FfUiB8fCBuYWxUeXBlID09IFNUU0FfTiB8fCBuYWxUeXBlID09IFNUU0FfUikgeworICAgICAgICBpbnQzMl90IGxheWVySWRQbHVzT25lID0gbmFsSGVhZGVyICYgMHg3dTsKKyAgICAgICAgQUxPR0RfSUYobGF5ZXJJZFBsdXNPbmUgPT0gMCwgImdvdCBsYXllcklkIDAgZm9yIFRTQSBwaWN0dXJlIik7CisgICAgICAgIHJldHVybiBsYXllcklkUGx1c09uZSAtIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUdyb3VwLT5oYXNfYnVmZmVycygpKSB7CisgICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtQnVmZmVyR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKICAgICAgICAgKm91dCA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9CiAKICAgICBpZiAobUZpcnN0TW9vZk9mZnNldCA+IDApIHsKQEAgLTQ4MjAsMTIgKzUzNjgsMTMgQEAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKwogICAgICAgICBpZiAobUlzSGVpZikgewogICAgICAgICAgICAgQ0hFQ0sobVNhbXBsZVRhYmxlID09IE5VTEwpOwogICAgICAgICAgICAgQ0hFQ0sobUl0ZW1UYWJsZSAhPSBOVUxMKTsKICAgICAgICAgICAgIGludDMyX3QgaW1hZ2VJbmRleDsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC5maW5kSW50MzIoa0tleVRyYWNrSUQsICZpbWFnZUluZGV4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmaW1hZ2VJbmRleCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwpAQCAtNDgzNSw3ICs1Mzg0LDcgQEAKICAgICAgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5maW5kVGh1bWJuYWlsSXRlbShpbWFnZUluZGV4LCAmbUN1cnJlbnRTYW1wbGVJbmRleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1aW50MzJfdCBmaW5kRmxhZ3MgPSAwOwpAQCAtNDg1Nyw2ICs1NDA2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1vZGUgIT0gUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBzZWVrVGltZVVzICs9ICgobG9uZyBkb3VibGUpbUVsc3RTaGlmdFN0YXJ0VGlja3MgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKApAQCAtNDg4MCw3ICs1NDMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmc3luY1NhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlVGltZTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzYW1wbGVUaW1lKTsKQEAgLTQ4OTMsMTQgKzU0NDUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhbGwgdGhlIHdheSB0byB0aGUgTWVkaWFQbGF5ZXIgd291bGQgY2F1c2UgYWJub3JtYWwKICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYXRpb24uIExlZ2FjeSBiZWhhdmlvdXIgYXBwZWFycyB0byBiZSB0byBiZWhhdmUgYXMgaWYKICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGFkIHNlZWtlZCB0byB0aGUgZW5kIG9mIHN0cmVhbSwgZW5kaW5nIG5vcm1hbGx5LgotICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJlbmQgb2Ygc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QKICAgICAgICAgICAgICAgICB8fCBtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlVGltZSAtPSBtRWxzdFNoaWZ0U3RhcnRUaWNrczsKICAgICAgICAgICAgICAgICB0YXJnZXRTYW1wbGVUaW1lVXMgPSAoc2FtcGxlVGltZSAqIDEwMDAwMDBsbCkgLyBtVGltZXNjYWxlOwogICAgICAgICAgICAgfQogCkBAIC00OTI5LDcgKzU0ODIsNyBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwogICAgIHNpemVfdCBzaXplID0gMDsKLSAgICB1aW50MzJfdCBjdHMsIHN0dHM7CisgICAgdWludDY0X3QgY3RzLCBzdHRzOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlOwogICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7CiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgewpAQCAtNDkzOSw2ICs1NDkyLDEwIEBACiAgICAgICAgIGlmICghbUlzSGVpZikgewogICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUsICZzdHRzKTsKKyAgICAgICAgICAgIGlmKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGN0cyAtPSBtRWxzdFNoaWZ0U3RhcnRUaWNrczsKKyAgICAgICAgICAgIH0KKwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+Z2V0SW1hZ2VPZmZzZXRBbmRTaXplKAogICAgICAgICAgICAgICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpID8KQEAgLTQ5NTAsMjQgKzU1MDcsMjcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KIAotICAgICAgICBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsgLy8gRVJST1JfQlVGRkVSX1RPT19TTUFMTAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKSB8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQyAmJiAhbUlzQUM0KSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIGlmIChtSXNQY20pIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgdHdvcycgUENNIGJsb2NrIHJlYWRlciBhc3N1bWVzIHRoYXQgYWxsIHNhbXBsZXMgaGFzIHRoZSBzYW1lIHNpemUuCkBAIC00OTgyLDIyICs1NTQyLDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1RvUmVhZCwgc2l6ZSwgbUN1cnJlbnRTYW1wbGVJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlVGFibGUtPmdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKSk7CiAKLSAgICAgICAgICAgICAgICBzaXplX3QgdG90YWxTaXplID0gc2FtcGxlc1RvUmVhZCAqIHNpemU7CisgICAgICAgICAgICAgICBzaXplX3QgdG90YWxTaXplID0gc2FtcGxlc1RvUmVhZCAqIHNpemU7CiAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CiAgICAgICAgICAgICAgICAgc3NpemVfdCBieXRlc1JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCB0b3RhbFNpemUpOwogICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPCAoc3NpemVfdCl0b3RhbFNpemUpIHsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChsb25nIGRvdWJsZSljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlT3JkZXI7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC5maW5kSW50MzIoa0tleVBjbUJpZ0VuZGlhbiwgJmJ5dGVPcmRlcik7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOLCAmYnl0ZU9yZGVyKTsKIAogICAgICAgICAgICAgICAgIGlmIChieXRlT3JkZXIgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAvLyBCaWctZW5kaWFuIC0+IGxpdHRsZS1lbmRpYW4KQEAgLTUwMTksMTY2ICs1NTgyLDgxIEBACiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChsb25nIGRvdWJsZSlzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgICAgICAgICB9Ci0KKyAKICAgICAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewotICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKIAotICAgICAgICAvLyBFYWNoIE5BTCB1bml0IGlzIHNwbGl0IHVwIGludG8gaXRzIGNvbnN0aXR1ZW50IGZyYWdtZW50cyBhbmQKLSAgICAgICAgLy8gZWFjaCBvbmUgb2YgdGhlbSByZXR1cm5lZCBpbiBpdHMgb3duIGJ1ZmZlci4KLQotICAgICAgICBDSEVDSyhtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PSBtTkFMTGVuZ3RoU2l6ZSk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0KLSAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgc2l6ZV90IG5hbF9zaXplID0gcGFyc2VOQUxTaXplKHNyYyk7Ci0gICAgICAgIGlmIChtTkFMTGVuZ3RoU2l6ZSA+IFNJWkVfTUFYIC0gbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQxNTUzLCBiLzI0NDQ1MTIyIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgPCBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImluY29tcGxldGUgTkFMIHVuaXQuIik7Ci0KLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSA9IG1CdWZmZXItPmNsb25lKCk7Ci0gICAgICAgIENIRUNLKGNsb25lICE9IE5VTEwpOwotICAgICAgICBjbG9uZS0+c2V0X3JhbmdlKG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUsIG5hbF9zaXplKTsKLQorICAgIH0gZWxzZSBpZiAobUlzQUM0KSB7CiAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplICsgbmFsX3NpemUsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSAtIG5hbF9zaXplKTsKLQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAqb3V0ID0gY2xvbmU7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKLSAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgotICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgaW50MzJfdCBkcm0gPSAwOwotICAgICAgICBib29sIHVzZXNEUk0gPSAobUZvcm1hdC5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCk7Ci0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBudW1fYnl0ZXNfcmVhZCA9Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICh1aW50OF90KiltQnVmZmVyLT5kYXRhKCksIHNpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbVNyY0J1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIHN5bmMgaGVhZGVyIGFuZCB0aGUgcmF3IGZyYW1lCisgICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8ICg3ICsgc2l6ZSkpIHsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIC8vIEFkZCBBQy00IHN5bmMgaGVhZGVyIHRvIE1QRUc0IGVuY2Fwc3VsYXRlZCBBQy00IHJhdyBmcmFtZQorICAgICAgICAvLyBBQzQwIHN5bmMgd29yZCwgbWVhbmluZyBubyBDUkMgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweEFDOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4NDA7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhGRjsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweEZGOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9ICh1aW50OF90KSgoc2l6ZSA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gMCkgJiAweEZGKTsKIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgc3NpemVfdCBudW1CeXRlc1JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZHN0RGF0YSArIGRzdE9mZnNldCwgc2l6ZSk7CisgICAgICAgIGlmIChudW1CeXRlc1JlYWQgIT0gKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZCIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjcyMDg2MjEgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA4NjIxIik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOwotICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuY2xlYXIoKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCArIHNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGxvbmcgZG91YmxlKXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Jc0FWQykgewotICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgbGF5ZXJJZCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC01MTg2LDEyICs1NjY0LDEwNSBAQAogICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKKyAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgorICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKKyAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbVNyY0J1ZmZlciwgc2l6ZSk7CisKKyAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKworICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIC8vaWYgbmFsbGVuZ3RoIGFibm9ybWFsLGlnbm9yZSBpdC4KKyAgICAgICAgICAgICAgICBBTE9HVygiYWJub3JtYWwgbmFsbGVuZ3RoLCBpZ25vcmUgdGhpcyBOQUwiKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgPSBzaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA4NjIxIDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA4NjIxIik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CisgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgobG9uZyBkb3VibGUpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgobG9uZyBkb3VibGUpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisKKyAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlzQVZDKSB7CisgICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgICAgIH0gZWxzZSBpZiAobUlzSEVWQykgeworICAgICAgICAgICAgaW50MzJfdCBsYXllcklkID0gcGFyc2VIRVZDTGF5ZXJJZCgKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgIGlmIChsYXllcklkID49IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKKworICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKIAogICAgIEFMT0dWKCJNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQiKTsKIApAQCAtNTIwNSw2ICs1Nzc2LDEwIEBACiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKIAorICAgICAgICBzZWVrVGltZVVzICs9ICgobG9uZyBkb3VibGUpbUVsc3RTaGlmdFN0YXJ0VGlja3MgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGU7CisgICAgICAgIEFMT0dWKCJzaGlmdGVkIHNlZWtUaW1lVXMgOiUiIFBSSWQ2NCAiLCBtRWxzdFNoaWZ0U3RhcnRUaWNrczolIiBQUklkMzIsIHNlZWtUaW1lVXMsCisgICAgICAgICAgICAgICAgbUVsc3RTaGlmdFN0YXJ0VGlja3MpOworCiAgICAgICAgIGludCBudW1TaWR4RW50cmllcyA9IG1TZWdtZW50cy5zaXplKCk7CiAgICAgICAgIGlmIChudW1TaWR4RW50cmllcyAhPSAwKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHRvdGFsVGltZSA9IDA7CkBAIC01MjMyLDcgKzU4MDcsNyBAQAogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOwogICAgICAgICB9IGVsc2UgewpAQCAtNTI0NCw3ICs1ODE5LDcgQEAKICAgICAgICAgICAgIG9mZjY0X3QgdG1wID0gbUN1cnJlbnRNb29mT2Zmc2V0OwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG1wKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IDA7CiAgICAgICAgIH0KQEAgLTUyNjIsMTMgKzU4MzcsMTcgQEAKICAgICB1aW50MzJfdCBjdHMgPSAwOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlID0gZmFsc2U7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAorICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQgaWYgdGhlcmUgaXMgb25lCiAgICAgICAgICAgICBpZiAobU5leHRNb29mT2Zmc2V0IDw9IG1DdXJyZW50TW9vZk9mZnNldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7CiAgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSBuZXh0TW9vZjsKQEAgLTUyNzYsMTAgKzU4NTUsMTAgQEAKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmbmV4dE1vb2YpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01Mjg3LDU5ICs1ODY2LDYxIEBACiAgICAgICAgIG9mZnNldCA9IHNtcGwtPm9mZnNldDsKICAgICAgICAgc2l6ZSA9IHNtcGwtPnNpemU7CiAgICAgICAgIGN0cyA9IG1DdXJyZW50VGltZSArIHNtcGwtPmNvbXBvc2l0aW9uT2Zmc2V0OwotICAgICAgICBtQ3VycmVudFRpbWUgKz0gc21wbC0+ZHVyYXRpb247Ci0gICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOyAvLyBYWFgKKyAgICAgICAgY3RzIC09IG1FbHN0U2hpZnRTdGFydFRpY2tzOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOworICAgICAgICBtQ3VycmVudFRpbWUgKz0gc21wbC0+ZHVyYXRpb247CisgICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOworCisgICAgICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7CiAgICAgICAgICAgICBBTE9HVigiYWNxdWlyZV9idWZmZXIgcmV0dXJuZWQgJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgICAgICBpZiAoc2l6ZSA+IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciB0b28gc21hbGw6ICV6dSA+ICV6dSIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCiAgICAgY29uc3QgU2FtcGxlICpzbXBsID0gJm1DdXJyZW50U2FtcGxlc1ttQ3VycmVudFNhbXBsZUluZGV4XTsKLSAgICBNZXRhRGF0YUJhc2UgJmJ1Zm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKLSAgICBidWZtZXRhLmNsZWFyKCk7CisgICAgQU1lZGlhRm9ybWF0ICpidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKGJ1Zm1ldGEpOwogICAgIGlmIChzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkpIHsKICAgICAgICAgLy8gc3RvcmUgY2xlYXIvZW5jcnlwdGVkIGxlbmd0aHMgaW4gbWV0YWRhdGEKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLAorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAogICAgICAgICAgICAgICAgIHNtcGwtPmNsZWFyc2l6ZXMuYXJyYXkoKSwgc21wbC0+Y2xlYXJzaXplcy5zaXplKCkgKiA0KTsKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCiAgICAgICAgICAgICAgICAgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuYXJyYXkoKSwgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpICogNCk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIG1EZWZhdWx0SVZTaXplKTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgbUNyeXB0b01vZGUpOwotICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgbUNyeXB0b0tleSwgMTYpOwotICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssIG1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgbURlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgbURlZmF1bHRJVlNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgbUNyeXB0b01vZGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgbUNyeXB0b0tleSwgMTYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgbURlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssIG1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAKLSAgICAgICAgdWludDMyX3QgdHlwZSA9IDA7Ci0gICAgICAgIGNvbnN0IHZvaWQgKml2ID0gTlVMTDsKKyAgICAgICAgdm9pZCAqaXYgPSBOVUxMOwogICAgICAgICBzaXplX3QgaXZsZW5ndGggPSAwOwotICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZERhdGEoCi0gICAgICAgICAgICAgICAga0tleUNyeXB0b0lWLCAmdHlwZSwgJml2LCAmaXZsZW5ndGgpKSB7Ci0gICAgICAgICAgICBpdiA9IHNtcGwtPml2OworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZvcm1hdCwKKyAgICAgICAgICAgICAgICAiY3J5cHRvLWl2IiwgJml2LCAmaXZsZW5ndGgpKSB7CisgICAgICAgICAgICBpdiA9ICh2b2lkICopIHNtcGwtPml2OwogICAgICAgICAgICAgaXZsZW5ndGggPSAxNjsgLy8gdXNlIDE2IG9yIHRoZSBhY3R1YWwgc2l6ZT8KICAgICAgICAgfQotICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBpdiwgaXZsZW5ndGgpOwotCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGl2LCBpdmxlbmd0aCk7CiAgICAgfQogCi0gICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKXx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIGlmICghaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgICAgICAgICBBTE9HRSgiZnJhZ21lbnRlZFJlYWQgRVJST1JfTUFMRk9STUVEIHNpemUgJXp1Iiwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9CkBAIC01MzUwLDEwMyArNTkzMSw1NyBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChsb25nIGRvdWJsZSlzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtSXNBVkMpIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIGxheWVySWQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzSEVWQykgeworICAgICAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZCA9IHBhcnNlSEVWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChsYXllcklkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7Ci0gICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gQU1FRElBX09LOwogCi0gICAgICAgIC8vIEVhY2ggTkFMIHVuaXQgaXMgc3BsaXQgdXAgaW50byBpdHMgY29uc3RpdHVlbnQgZnJhZ21lbnRzIGFuZAotICAgICAgICAvLyBlYWNoIG9uZSBvZiB0aGVtIHJldHVybmVkIGluIGl0cyBvd24gYnVmZmVyLgotCi0gICAgICAgIENIRUNLKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID49IG1OQUxMZW5ndGhTaXplKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPQotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICBzaXplX3QgbmFsX3NpemUgPSBwYXJzZU5BTFNpemUoc3JjKTsKLSAgICAgICAgaWYgKG1OQUxMZW5ndGhTaXplID4gU0laRV9NQVggLSBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDE1NTMsIGIvMjQ0NDUxMjIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOwotCi0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOwotICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKLSAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUgKyBuYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIC0gbmFsX3NpemUpOwotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXQgPSBjbG9uZTsKLQotICAgICAgICByZXR1cm4gT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIndob2xlIE5BTCIpOwogICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5CiAgICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIGludDMyX3QgZHJtID0gMDsKLSAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQuZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOwogICAgICAgICB2b2lkICpkYXRhID0gTlVMTDsKICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9IGZhbHNlOwotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGludDMyX3QgbWF4X3NpemU7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsICZtYXhfc2l6ZSkKKyAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIChzaXplX3QpbWF4X3NpemUsIHNpemUpKSB7CisgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQzMl90IG1heF9zaXplOwotICAgICAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmbWF4X3NpemUpCi0gICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgKHNpemVfdCltYXhfc2l6ZSwgc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEgPSBtU3JjQnVmZmVyOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSA9IG1TcmNCdWZmZXI7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNNYWxGb3JtZWQgfHwgZGF0YSA9PSBOVUxMKSB7CkBAIC01NDU1LDcgKzU5OTAsNyBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKIApAQCAtNTQ2NCw3NSArNTk5OSw2OSBAQAogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgICAgIEFMT0dFKCJpL28gZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKKyAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwotICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0LCAoc2l6ZV90KTR1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQgKyA0LCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkOyBuYWxMZW5ndGggJXp1IiwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI2MzY1MzQ5IDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM2NTM0OSIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7CisgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQsIChzaXplX3QpNHUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0ICsgNCwgbmFsTGVuZ3RoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7Ci0gICAgICAgIH0KIAotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQ7IG5hbExlbmd0aCAlenUiLCBuYWxMZW5ndGgpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNjM2NTM0OSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM2NTM0OSIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKmJ1Zm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgobG9uZyBkb3VibGUpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC01NTQwLDE1ICs2MDY5LDE3IEBACiAgICAgICAgICpvdXQgPSBtQnVmZmVyOwogICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogTVBFRzRFeHRyYWN0b3I6OlRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6ZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICBjb25zdCBjaGFyICptaW1lUHJlZml4KSB7CiAgICAgZm9yIChUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsgdHJhY2sgIT0gTlVMTDsgdHJhY2sgPSB0cmFjay0+bmV4dCkgewogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBpZiAodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpCiAgICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKG1pbWUsIG1pbWVQcmVmaXgsIHN0cmxlbihtaW1lUHJlZml4KSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cmFjazsKICAgICAgICAgfQpAQCAtNTU1Nyw3ICs2MDg4LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbOF07CiAKICAgICBzc2l6ZV90IG4gPSBzb3VyY2UtPnJlYWRBdCg0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKQEAgLTU1ODgsNiArNjExOSw3IEBACiAgICAgICAgIEZPVVJDQygiYXZjMSIpLAogICAgICAgICBGT1VSQ0MoImh2YzEiKSwKICAgICAgICAgRk9VUkNDKCJoZXYxIiksCisgICAgICAgIEZPVVJDQygiYXYwMSIpLAogICAgICAgICBGT1VSQ0MoIjNncDQiKSwKICAgICAgICAgRk9VUkNDKCJtcDQxIiksCiAgICAgICAgIEZPVVJDQygibXA0MiIpLApAQCAtNTU5OCw2ICs2MTMwLDcgQEAKICAgICAgICAgLy8gSnVzdCBnaXZlIHRoZXNlIGZpbGUgdHlwZXMgYSBjaGFuY2UuCiAgICAgICAgIEZPVVJDQygicXQgICIpLCAgLy8gQXBwbGUncyBRdWlja1RpbWUKICAgICAgICAgRk9VUkNDKCJNU05WIiksICAvLyBTb255J3MgUFNQCisgICAgICAgIEZPVVJDQygid21mICIpLAogCiAgICAgICAgIEZPVVJDQygiM2cyYSIpLCAgLy8gM0dQUDIKICAgICAgICAgRk9VUkNDKCIzZzJiIiksCkBAIC01NjIzLDcgKzYxNTYsNyBAQAogLy8gQWxzbyB0cnkgdG8gaWRlbnRpZnkgd2hlcmUgdGhpcyBmaWxlJ3MgbWV0YWRhdGEgZW5kcwogLy8gKGVuZCBvZiB0aGUgJ21vb3YnIGF0b20pIGFuZCByZXBvcnQgaXQgdG8gdGhlIGNhbGxlciBhcyBwYXJ0IG9mCiAvLyB0aGUgbWV0YWRhdGEuCi1zdGF0aWMgYm9vbCBCZXR0ZXJTbmlmZk1QRUc0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CitzdGF0aWMgYm9vbCBCZXR0ZXJTbmlmZk1QRUc0KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICAvLyBXZSBzY2FuIHVwIHRvIDEyOCBieXRlcyB0byBpZGVudGlmeSB0aGlzIGZpbGUgYXMgYW4gTVA0LgogICAgIHN0YXRpYyBjb25zdCBvZmY2NF90IGtNYXhTY2FuT2Zmc2V0ID0gMTI4bGw7CiAKQEAgLTU2NjksNyArNjIwMiw4IEBACiAKICAgICAgICAgY2hhciBjaHVua3N0cmluZ1s1XTsKICAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua1R5cGUsIGNodW5rc3RyaW5nKTsKLSAgICAgICAgQUxPR1YoInNhdyBjaHVuayB0eXBlICVzLCBzaXplICUiIFBSSXU2NCAiIEAgJWxsZCIsIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIChsb25nIGxvbmcpb2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInNhdyBjaHVuayB0eXBlICVzLCBzaXplICUiIFBSSXU2NCAiIEAgJWxsZCIsCisgICAgICAgICAgICAgICAgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgKGxvbmcgbG9uZylvZmZzZXQpOwogICAgICAgICBzd2l0Y2ggKGNodW5rVHlwZSkgewogICAgICAgICAgICAgY2FzZSBGT1VSQ0MoImZ0eXAiKToKICAgICAgICAgICAgIHsKQEAgLTU3MzAsMTggKzYyNjQsMTkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBNUEVHNEV4dHJhY3Rvcihzb3VyY2UpOworc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKENEYXRhU291cmNlICpzb3VyY2UsIHZvaWQgKikgeworICAgIHJldHVybiB3cmFwKG5ldyBNUEVHNEV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIHsKLSAgICBpZiAoQmV0dGVyU25pZmZNUEVHNChzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqLAorICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgaWYgKEJldHRlclNuaWZmTVBFRzQoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKICAgICB9CiAKLSAgICBpZiAoTGVnYWN5U25pZmZNUEVHNChzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgaWYgKExlZ2FjeVNuaWZmTVBFRzQoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgQUxPR1coIklkZW50aWZpZWQgc3VwcG9ydGVkIG1wZWc0IHRocm91Z2ggTGVnYWN5U25pZmZNUEVHNC4iKTsKICAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKICAgICB9CkBAIC01NzQ5LDE2ICs2Mjg0LDMxIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIjNnMiIsCisgICAgIjNnYSIsCisgICAgIjNncCIsCisgICAgIjNncHAiLAorICAgICIzZ3BwMiIsCisgICAgIm00YSIsCisgICAgIm00ciIsCisgICAgIm00diIsCisgICAgIm1vdiIsCisgICAgIm1wNCIsCisgICAgInF0IiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCIyNzU3NWM2Ny00NDE3LTRjNTQtOGQzZC04ZTYyNjk4NWExNjQiKSwKLSAgICAgICAgMSwgLy8gdmVyc2lvbgorICAgICAgICAyLCAvLyB2ZXJzaW9uCiAgICAgICAgICJNUDQgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKaW5kZXggM2VhMDk2My4uZmFkZmI1MCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCkBAIC0yMCw5ICsyMCw5IEBACiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KQEAgLTMxLDggKzMxLDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7Ci1zdHJ1Y3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTsKK3N0cnVjdCBDRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiBjbGFzcyBTYW1wbGVUYWJsZTsKIGNsYXNzIFN0cmluZzg7CiBuYW1lc3BhY2UgaGVpZiB7CkBAIC01MywxNSArNTMsMTUgQEAKICAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9mbGFnczsKIH07CiAKLWNsYXNzIE1QRUc0RXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIE1QRUc0RXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CisgICAgZXhwbGljaXQgTVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUc0RXh0cmFjdG9yIjsgfQogCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgfTsKICAgICBzdHJ1Y3QgVHJhY2sgewogICAgICAgICBUcmFjayAqbmV4dDsKLSAgICAgICAgTWV0YURhdGFCYXNlIG1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YTsKICAgICAgICAgdWludDMyX3QgdGltZXNjYWxlOwogICAgICAgICBzcDxTYW1wbGVUYWJsZT4gc2FtcGxlVGFibGU7CiAgICAgICAgIGJvb2wgaW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhOwpAQCAtODUsNiArODUsNyBAQAogICAgICAgICBib29sIGhhc19lbHN0OwogICAgICAgICBpbnQ2NF90IGVsc3RfbWVkaWFfdGltZTsKICAgICAgICAgdWludDY0X3QgZWxzdF9zZWdtZW50X2R1cmF0aW9uOworICAgICAgICBpbnQzMl90IGVsc3RTaGlmdFN0YXJ0VGlja3M7CiAgICAgICAgIGJvb2wgc3Vic2FtcGxlX2VuY3J5cHRpb247CiAgICAgfTsKIApAQCAtOTcsOCArOTgsNyBAQAogCiAgICAgVmVjdG9yPFRyZXg+IG1UcmV4OwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgKm1DYWNoZWRTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICB1aW50MzJfdCBtSGVhZGVyVGltZXNjYWxlOwogICAgIGJvb2wgbUlzUVQ7CkBAIC0xMDgsNyArMTA4LDcgQEAKIAogICAgIFRyYWNrICptRmlyc3RUcmFjaywgKm1MYXN0VHJhY2s7CiAKLSAgICBNZXRhRGF0YUJhc2UgbUZpbGVNZXRhRGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YURhdGE7CiAKICAgICBWZWN0b3I8dWludDMyX3Q+IG1QYXRoOwogICAgIFN0cmluZzggbUxhc3RDb21tZW50TWVhbjsKQEAgLTEzOSwxNyArMTM5LDE2IEBACiAKICAgICBUcmFjayAqZmluZFRyYWNrQnlNaW1lUHJlZml4KGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpOwogCi0gICAgc3RhdHVzX3QgcGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCwgdWludDE2X3Qgc2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKAorICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCB1aW50MTZfdCAqY2hhbm5lbENvdW50LCB1aW50MTZfdCAqc2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VFQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOworICAgIHN0YXR1c190IHBhcnNlQUM0U3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgTVBFRzRFeHRyYWN0b3IoY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7CiAgICAgTVBFRzRFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKIH07CiAKLWJvb2wgU25pZmZNUEVHNCgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKik7Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTVBFRzRfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAKaW5kZXggOTNlZTdjNi4uMjg5MGIyNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcApAQCAtMTExLDggKzExMSwxNSBAQAogICAgICAgICAgICAgaWYgKChlcnIgPSBnZXRTYW1wbGVTaXplRGlyZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2h1bmtTYW1wbGVJbmRleCArIGksICZzYW1wbGVTaXplKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0U2FtcGxlU2l6ZURpcmVjdCByZXR1cm4gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIC8vIHN0c2Mgc2FtcGxlIGNvdW50IGlzIG5vdCBzeW5jIHdpdGggc3RzeiBzYW1wbGUgY291bnQKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RzYyBzYW1wbGVzKCVkKSBub3Qgc3luYyB3aXRoIHN0c3ogc2FtcGxlcyglZCkiLCBtU2FtcGxlc1BlckNodW5rLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJDaHVuayA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMucHVzaChzYW1wbGVTaXplKTsKQEAgLTMwMSw3ICszMDgsNyBAQAogfQogCiBzdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6ZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lLCB1aW50MzJfdCAqZHVyYXRpb24pIHsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQ2NF90ICp0aW1lLCB1aW50NjRfdCAqZHVyYXRpb24pIHsKICAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVRhYmxlLT5tTnVtU2FtcGxlU2l6ZXMpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CkBAIC0zMTQsOCArMzIxLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVGltZVRvU2FtcGxlSW5kZXggPT0gbVRhYmxlLT5tVGltZVRvU2FtcGxlQ291bnQgfHwKLSAgICAgICAgICAgIChtVFRTRHVyYXRpb24gIT0gMCAmJiBtVFRTQ291bnQgPiBVSU5UMzJfTUFYIC8gbVRUU0R1cmF0aW9uKSB8fAotICAgICAgICAgICAgbVRUU1NhbXBsZVRpbWUgPiBVSU5UMzJfTUFYIC0gKG1UVFNDb3VudCAqIG1UVFNEdXJhdGlvbikpIHsKKyAgICAgICAgICAgIChtVFRTRHVyYXRpb24gIT0gMCAmJiBtVFRTQ291bnQgPiBVSU5UNjRfTUFYIC8gbVRUU0R1cmF0aW9uKSB8fAorICAgICAgICAgICAgbVRUU1NhbXBsZVRpbWUgPiBVSU5UNjRfTUFYIC0gKG1UVFNDb3VudCAqIG1UVFNEdXJhdGlvbikpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIH0KIApAQCAtMzI4LDE5ICszMzUsMjcgQEAKICAgICAgICAgKyttVGltZVRvU2FtcGxlSW5kZXg7CiAgICAgfQogCi0gICAgKnRpbWUgPSBtVFRTU2FtcGxlVGltZSArIG1UVFNEdXJhdGlvbiAqIChzYW1wbGVJbmRleCAtIG1UVFNTYW1wbGVJbmRleCk7CisgICAgLy8gYmVsb3cgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAvLyAqdGltZSA9IG1UVFNTYW1wbGVUaW1lICsgbVRUU0R1cmF0aW9uICogKHNhbXBsZUluZGV4IC0gbVRUU1NhbXBsZUluZGV4KTsKKyAgICB1aW50NjRfdCB0bXA7CisgICAgaWYgKF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coc2FtcGxlSW5kZXgsIG1UVFNTYW1wbGVJbmRleCwgJnRtcCkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobVRUU0R1cmF0aW9uLCB0bXAsICZ0bXApIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KG1UVFNTYW1wbGVUaW1lLCB0bXAsICZ0bXApKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorICAgICp0aW1lID0gdG1wOwogCiAgICAgaW50MzJfdCBvZmZzZXQgPSBtVGFibGUtPmdldENvbXBvc2l0aW9uVGltZU9mZnNldChzYW1wbGVJbmRleCk7CiAgICAgaWYgKChvZmZzZXQgPCAwICYmICp0aW1lIDwgKG9mZnNldCA9PSBJTlQzMl9NSU4gPwotICAgICAgICAgICAgSU5UMzJfTUFYIDogdWludDMyX3QoLW9mZnNldCkpKSB8fAotICAgICAgICAgICAgKG9mZnNldCA+IDAgJiYgKnRpbWUgPiBVSU5UMzJfTUFYIC0gb2Zmc2V0KSkgewotICAgICAgICBBTE9HRSgiJXUgKyAlZCB3b3VsZCBvdmVyZmxvdyIsICp0aW1lLCBvZmZzZXQpOworICAgICAgICAgICAgSU5UNjRfTUFYIDogdWludDY0X3QoLW9mZnNldCkpKSB8fAorICAgICAgICAgICAgKG9mZnNldCA+IDAgJiYgKnRpbWUgPiBVSU5UNjRfTUFYIC0gb2Zmc2V0KSkgeworICAgICAgICBBTE9HRSgiJWxsdSArICVkIHdvdWxkIG92ZXJmbG93IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgKnRpbWUsIG9mZnNldCk7CiAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogICAgIGlmIChvZmZzZXQgPiAwKSB7CiAgICAgICAgICp0aW1lICs9IG9mZnNldDsKICAgICB9IGVsc2UgewotICAgICAgICAqdGltZSAtPSAob2Zmc2V0ID09IElOVDMyX01JTiA/IElOVDMyX01BWCA6ICgtb2Zmc2V0KSk7CisgICAgICAgICp0aW1lIC09IChvZmZzZXQgPT0gSU5UNjRfTUlOID8gSU5UNjRfTUFYIDogKC1vZmZzZXQpKTsKICAgICB9CiAKICAgICAqZHVyYXRpb24gPSBtVFRTRHVyYXRpb247CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuaAppbmRleCA2ZTRmNjBlLi41YTBlYTc2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmgKQEAgLTMzLDggKzMzLDggQEAKICAgICB1aW50MzJfdCBnZXREZXNjSW5kZXgoKSBjb25zdCB7IHJldHVybiBtQ2h1bmtEZXNjOyB9CiAgICAgb2ZmNjRfdCBnZXRTYW1wbGVPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZU9mZnNldDsgfQogICAgIHNpemVfdCBnZXRTYW1wbGVTaXplKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVTaXplOyB9Ci0gICAgdWludDMyX3QgZ2V0U2FtcGxlVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlVGltZTsgfQotICAgIHVpbnQzMl90IGdldFNhbXBsZUR1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsgfQorICAgIHVpbnQ2NF90IGdldFNhbXBsZVRpbWUoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZVRpbWU7IH0KKyAgICB1aW50NjRfdCBnZXRTYW1wbGVEdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlRHVyYXRpb247IH0KIAogICAgIHVpbnQzMl90IGdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQ3VycmVudFNhbXBsZUluZGV4ICsgbVNhbXBsZXNQZXJDaHVuayAtCkBAIC02MywyMCArNjMsMjAgQEAKIAogICAgIHVpbnQzMl90IG1UaW1lVG9TYW1wbGVJbmRleDsKICAgICB1aW50MzJfdCBtVFRTU2FtcGxlSW5kZXg7Ci0gICAgdWludDMyX3QgbVRUU1NhbXBsZVRpbWU7CisgICAgdWludDY0X3QgbVRUU1NhbXBsZVRpbWU7CiAgICAgdWludDMyX3QgbVRUU0NvdW50OwotICAgIHVpbnQzMl90IG1UVFNEdXJhdGlvbjsKKyAgICB1aW50NjRfdCBtVFRTRHVyYXRpb247CiAKICAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZGV4OwogICAgIG9mZjY0X3QgbUN1cnJlbnRTYW1wbGVPZmZzZXQ7CiAgICAgc2l6ZV90IG1DdXJyZW50U2FtcGxlU2l6ZTsKLSAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZVRpbWU7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsKKyAgICB1aW50NjRfdCBtQ3VycmVudFNhbXBsZVRpbWU7CisgICAgdWludDY0X3QgbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsKIAogICAgIHZvaWQgcmVzZXQoKTsKICAgICBzdGF0dXNfdCBmaW5kQ2h1bmtSYW5nZSh1aW50MzJfdCBzYW1wbGVJbmRleCk7CiAgICAgc3RhdHVzX3QgZ2V0Q2h1bmtPZmZzZXQodWludDMyX3QgY2h1bmssIG9mZjY0X3QgKm9mZnNldCk7Ci0gICAgc3RhdHVzX3QgZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbih1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUsIHVpbnQzMl90ICpkdXJhdGlvbik7CisgICAgc3RhdHVzX3QgZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbih1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDY0X3QgKnRpbWUsIHVpbnQ2NF90ICpkdXJhdGlvbik7CiAKICAgICBTYW1wbGVJdGVyYXRvcihjb25zdCBTYW1wbGVJdGVyYXRvciAmKTsKICAgICBTYW1wbGVJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IFNhbXBsZUl0ZXJhdG9yICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCmluZGV4IDI1ZjhlMmEuLmJmMjliZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KIApAQCAtMTE0LDcgKzExNCw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLVNhbXBsZVRhYmxlOjpTYW1wbGVUYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKQorU2FtcGxlVGFibGU6OlNhbXBsZVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtQ2h1bmtPZmZzZXRPZmZzZXQoLTEpLAogICAgICAgbUNodW5rT2Zmc2V0VHlwZSgwKSwKQEAgLTYxNCw3ICs2MTQsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdWludDMyX3QgYWJzX2RpZmZlcmVuY2UodWludDMyX3QgdGltZTEsIHVpbnQzMl90IHRpbWUyKSB7Cit1aW50MzJfdCBhYnNfZGlmZmVyZW5jZSh1aW50NjRfdCB0aW1lMSwgdWludDY0X3QgdGltZTIpIHsKICAgICByZXR1cm4gdGltZTEgPiB0aW1lMiA/IHRpbWUxIC0gdGltZTIgOiB0aW1lMiAtIHRpbWUxOwogfQogCkBAIC02NjIsNyArNjYyLDcgQEAKICAgICB9CiAKICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCA9IDA7Ci0gICAgdWludDMyX3Qgc2FtcGxlVGltZSA9IDA7CisgICAgdWludDY0X3Qgc2FtcGxlVGltZSA9IDA7CiAKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbVRpbWVUb1NhbXBsZUNvdW50OyArK2kpIHsKICAgICAgICAgdWludDMyX3QgbiA9IG1UaW1lVG9TYW1wbGVbMiAqIGldOwpAQCAtNjg0LDEzICs2ODQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wVGltZURlbHRhID09IElOVDMyX01JTiA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyX01BWCA6IHVpbnQzMl90KC1jb21wVGltZURlbHRhKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY29tcFRpbWVEZWx0YSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSBjb21wVGltZURlbHRhKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXUgKyAlZCB3b3VsZCBvdmVyZmxvdywgY2xhbXBpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsIGNvbXBUaW1lRGVsdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID4gVUlOVDY0X01BWCAtIGNvbXBUaW1lRGVsdGEpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlbGx1ICsgJWQgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzYW1wbGVUaW1lLCBjb21wVGltZURlbHRhKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBUaW1lRGVsdGEgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UMzJfTUFYOworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IFVJTlQ2NF9NQVg7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29tcFRpbWVEZWx0YSA9IDA7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzAxLDEwICs3MDEsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgKytzYW1wbGVJbmRleDsKLSAgICAgICAgICAgIGlmIChzYW1wbGVUaW1lID4gVUlOVDMyX01BWCAtIGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiV1ICsgJXUgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwgZGVsdGEpOwotICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UMzJfTUFYOworICAgICAgICAgICAgaWYgKHNhbXBsZVRpbWUgPiBVSU5UNjRfTUFYIC0gZGVsdGEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJWxsdSArICV1IHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNhbXBsZVRpbWUsIGRlbHRhKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDY0X01BWDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSArPSBkZWx0YTsKICAgICAgICAgICAgIH0KQEAgLTg3MCwxOSArODcwLDE5IEBACiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwogCiAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdF0pOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCB1cHBlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICB1aW50NjRfdCB1cHBlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CiAKICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKG1TeW5jU2FtcGxlc1tsZWZ0IC0gMV0pOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBsb3dlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICB1aW50NjRfdCBsb3dlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CiAKICAgICAgICAgICAgIC8vIHVzZSBhYnNfZGlmZmVyZW5jZSBmb3Igc2FmZXR5CiAgICAgICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UodXBwZXJfdGltZSwgc2FtcGxlX3RpbWUpID4KQEAgLTk1NSw5ICs5NTUsOSBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwKICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICBzaXplX3QgKnNpemUsCi0gICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCisgICAgICAgIHVpbnQ2NF90ICpjb21wb3NpdGlvblRpbWUsCiAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSwKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uKSB7CisgICAgICAgIHVpbnQ2NF90ICpzYW1wbGVEdXJhdGlvbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzdGF0dXNfdCBlcnI7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaAppbmRleCBkZDY4ODYwLi41N2Y2ZTYyIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmgKQEAgLTIxLDE4ICsyMSwxOSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogc3RydWN0IFNhbXBsZUl0ZXJhdG9yOwogCiBjbGFzcyBTYW1wbGVUYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CiAKQEAgLTY1LDkgKzY2LDkgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LAogICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICAgICAgc2l6ZV90ICpzaXplLAotICAgICAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKKyAgICAgICAgICAgIHVpbnQ2NF90ICpjb21wb3NpdGlvblRpbWUsCiAgICAgICAgICAgICBib29sICppc1N5bmNTYW1wbGUgPSBOVUxMLAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uID0gTlVMTCk7CisgICAgICAgICAgICB1aW50NjRfdCAqc2FtcGxlRHVyYXRpb24gPSBOVUxMKTsKIAogICAgIC8vIGNhbGwgb25seSBhZnRlciBnZXRNZXRhRGF0YUZvclNhbXBsZSBoYXMgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1bGx5LgogICAgIHVpbnQzMl90IGdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKTsKQEAgLTEwMiw3ICsxMDMsNyBAQAogICAgIC8vIExpbWl0IHRoZSB0b3RhbCBzaXplIG9mIGFsbCBpbnRlcm5hbCB0YWJsZXMgdG8gMjAwTWlCLgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFRvdGFsU2l6ZSA9IDIwMCAqICgxIDw8IDIwKTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBNdXRleCBtTG9jazsKIAogICAgIG9mZjY0X3QgbUNodW5rT2Zmc2V0T2Zmc2V0OwpAQCAtMTIzLDcgKzEyNCw3IEBACiAKICAgICBzdHJ1Y3QgU2FtcGxlVGltZUVudHJ5IHsKICAgICAgICAgdWludDMyX3QgbVNhbXBsZUluZGV4OwotICAgICAgICB1aW50MzJfdCBtQ29tcG9zaXRpb25UaW1lOworICAgICAgICB1aW50NjRfdCBtQ29tcG9zaXRpb25UaW1lOwogICAgIH07CiAgICAgU2FtcGxlVGltZUVudHJ5ICptU2FtcGxlVGltZUVudHJpZXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAppbmRleCAzOGM4NmViLi4wZjBjNzJjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0xNSwyMyArMTUsMjYgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlibXBlZzJleHRyYWN0b3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwCmluZGV4IDhhMGZhMDMuLjk0NmEyYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAKQEAgLTE4LDM5ICsxOCw1NCBAQAogI2RlZmluZSBMT0dfVEFHICJNUEVHMkV4dHJhY3RvckJ1bmRsZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlICJNUEVHMlBTRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiTVBFRzJUU0V4dHJhY3Rvci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBDRGF0YVNvdXJjZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICJtMnAiLAorICAgInRzIiwKKyAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjNkMWRjZmViLWU0MGEtNDM2ZC1hNTc0LWMyNDM4YTU1NWU1ZiIpLAogICAgICAgICAxLAogICAgICAgICAiTVBFRzItUFMvVFMgRXh0cmFjdG9yIiwKLSAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZk1QRUcyVFMoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTVBFRzJUU0V4dHJhY3Rvcihzb3VyY2UpO307Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNuaWZmTVBFRzJQUyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZk1QRUcyVFMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTVBFRzJQU0V4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1QRUcyVFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU25pZmZNUEVHMlBTKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1QRUcyUFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBleHRlbnNpb25zCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCmluZGV4IDY5ODBiODIuLjczMTU4NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgIm1wZWcydHMvRVNRdWV1ZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM0LDIyICszMywyMyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhVHJhY2ssIHB1YmxpYyBSZWZCYXNlIHsKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsCiAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtX2lkLCB1bnNpZ25lZCBzdHJlYW1fdHlwZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5UcmFjaygpOwpAQCAtNzIsMjkgKzcyLDI5IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHJhY2spOwogfTsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKLSAgICBXcmFwcGVkVHJhY2soTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKTsKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CisgICAgV3JhcHBlZFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgVHJhY2sgKnRyYWNrKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfldyYXBwZWRUcmFjaygpOwogCiBwcml2YXRlOgogICAgIE1QRUcyUFNFeHRyYWN0b3IgKm1FeHRyYWN0b3I7Ci0gICAgc3A8TVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s+IG1UcmFjazsKKyAgICBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayAqbVRyYWNrOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV3JhcHBlZFRyYWNrKTsKIH07CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU1QRUcyUFNFeHRyYWN0b3I6Ok1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK01QRUcyUFNFeHRyYWN0b3I6Ok1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1PZmZzZXQoMCksCiAgICAgICBtRmluYWxSZXN1bHQoT0spLApAQCAtMTA4LDI1ICsxMDgsMjcgQEAKICAgICB9CiAKICAgICAvLyBSZW1vdmUgYWxsIHRyYWNrcyB0aGF0IHdlcmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGVpciBmb3JtYXQuCi0gICAgTWV0YURhdGFCYXNlIG1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIGZvciAoc2l6ZV90IGkgPSBtVHJhY2tzLnNpemUoKTsgaSA+IDA7KSB7CiAgICAgICAgIGktLTsKLSAgICAgICAgaWYgKG1UcmFja3MudmFsdWVBdChpKS0+Z2V0Rm9ybWF0KG1ldGEpICE9IE9LKSB7CisgICAgICAgIGlmIChtVHJhY2tzLnZhbHVlQXQoaSktPmdldEZvcm1hdChtZXRhKSAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlSXRlbXNBdChpKTsKICAgICAgICAgfQogICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1ldGEpOwogCiAgICAgbVNjYW5uaW5nID0gZmFsc2U7CiB9CiAKIE1QRUcyUFNFeHRyYWN0b3I6On5NUEVHMlBTRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogc2l6ZV90IE1QRUcyUFNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKIH0KIAotTWVkaWFUcmFjayAqTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTM0LDIwICsxMzYsMjAgQEAKICAgICByZXR1cm4gbmV3IFdyYXBwZWRUcmFjayh0aGlzLCBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgcmV0dXJuIG1UcmFja3MudmFsdWVBdChpbmRleCktPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMpOworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50MzJfdCBNUEVHMlBTRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKQEAgLTYzNSw0MiArNjM3LDU1IEBACiAgICAgbVF1ZXVlID0gTlVMTDsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RhcnQoKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIHJldHVybiBtU291cmNlLT5zdGFydChOVUxMKTsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CisgICAgLy8gaW5pdGlhbGl6ZSB3aXRoIG9uZSBzbWFsbCBidWZmZXIsIGJ1dCBhbGxvdyBncm93dGgKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBvbmUgYnVmZmVyICovLCAyNTYgLyogYnVmZmVyIHNpemUgKi8sIDY0IC8qIG1heCBudW1iZXIgb2YgYnVmZmVycyAqLyk7CisKKyAgICBpZiAobVNvdXJjZS0+c3RhcnQoTlVMTCkgPT0gT0spIHsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RvcCgpIHsKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBpZiAobVNvdXJjZS0+c3RvcCgpID09IE9LKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK3ZvaWQgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIHNwPEFNZXNzYWdlPiBtc2cpOworCittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gc291cmNlTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIG1ldGEgPSAqc291cmNlTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgc3A8QU1lc3NhZ2U+IG1zZzsKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uoc291cmNlTWV0YSwgJm1zZyk7CisgICAgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQobWV0YSwgbXNnKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKICAgICB3aGlsZSAoIW1Tb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CiAgICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5mZWVkTW9yZSgpOwpAQCAtNjgwLDcgKzY5NSw1MCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWY7CisgICAgbVNvdXJjZS0+cmVhZCgmbWJ1ZiwgKE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zKikgb3B0aW9ucyk7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1idWYtPnJhbmdlX2xlbmd0aCgpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpvdXRidWY7CisgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0YnVmLCBmYWxzZSwgbGVuZ3RoKTsKKyAgICBtZW1jcHkob3V0YnVmLT5kYXRhKCksIG1idWYtPmRhdGEoKSwgbGVuZ3RoKTsKKyAgICBvdXRidWYtPnNldF9yYW5nZSgwLCBsZW5ndGgpOworICAgICpidWZmZXIgPSBvdXRidWY7CisgICAgTWV0YURhdGFCYXNlICZpbk1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXQgKm91dE1ldGEgPSBvdXRidWYtPm1ldGFfZGF0YSgpOworICAgIGludDY0X3QgdmFsNjQ7CisgICAgaWYgKGluTWV0YS5maW5kSW50NjQoa0tleVRpbWUsICZ2YWw2NCkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdmFsNjQpOworICAgIH0KKyAgICBpbnQzMl90IHZhbDMyOworICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbDMyKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCB2YWwzMik7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCB2YWwzMik7CisgICAgfQorICAgIHVpbnQzMl90IGJ1ZlR5cGU7CisgICAgY29uc3Qgdm9pZCAqYnVmRGF0YTsKKyAgICBzaXplX3QgYnVmU2l6ZTsKKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5U0VJLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0VJLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmFwcGVuZFBFU0RhdGEoCkBAIC03MjYsNyArNzg0LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6V3JhcHBlZFRyYWNrKAotICAgICAgICBNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2spCisgICAgICAgIE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgVHJhY2sgKnRyYWNrKQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAogICAgICAgbVRyYWNrKHRyYWNrKSB7CiB9CkBAIC03MzQsMjcgKzc5MiwyOCBAQAogTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjp+V3JhcHBlZFRyYWNrKCkgewogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+c3RhcnQocGFyYW1zKTsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RhcnQoKSB7CisgICAgbVRyYWNrLT5tQnVmZmVyR3JvdXAgPSBtQnVmZmVyR3JvdXA7CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdG9wKCkgewogICAgIHJldHVybiBtVHJhY2stPnN0b3AoKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICByZXR1cm4gbVRyYWNrLT5nZXRGb3JtYXQobWV0YSk7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICByZXR1cm4gbVRyYWNrLT5yZWFkKGJ1ZmZlciwgb3B0aW9ucyk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIGJvb2wgU25pZmZNUEVHMlBTKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbNV07CiAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaAppbmRleCA4YjlkYWQ5Li5lNWQ1OTFmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaApAQCAtMTksNyArMTksOCBAQAogI2RlZmluZSBNUEVHMl9QU19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTMxLDE0ICszMiwxNCBAQAogc3RydWN0IFRyYWNrOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTVBFRzJQU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgTVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyUFNFeHRyYWN0b3IiOyB9CkBAIC01MSwxMiArNTIsMTIgQEAKICAgICBzdHJ1Y3QgV3JhcHBlZFRyYWNrOwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwogICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIHNwPFRyYWNrPiA+IG1UcmFja3M7CisgICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIFRyYWNrKiA+IG1UcmFja3M7CiAgICAgYm9vbCBtU2Nhbm5pbmc7CiAKICAgICBib29sIG1Qcm9ncmFtU3RyZWFtTWFwVmFsaWQ7CkBAIC03Miw3ICs3Myw3IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJQU0V4dHJhY3Rvcik7CiB9OwogCi1ib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Citib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggMjYwYzg4ZS4uNDlkZDBiNCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KQEAgLTM1LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKQEAgLTUxLDE5ICs1MSwxOSBAQAogc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZWFkU2l6ZSA9IDI1MDAwMExMOwogc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZXRyeSA9IDY7CiAKLXN0cnVjdCBNUEVHMlRTU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE1QRUcyVFNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgTVBFRzJUU1NvdXJjZSgKICAgICAgICAgICAgIE1QRUcyVFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLAogICAgICAgICAgICAgYm9vbCBkb2VzU2Vlayk7CiAgICAgdmlydHVhbCB+TVBFRzJUU1NvdXJjZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcml2YXRlOgogICAgIE1QRUcyVFNFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CkBAIC04OCw0NCArODgsMTUyIEBACiBNUEVHMlRTU291cmNlOjp+TVBFRzJUU1NvdXJjZSgpIHsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICopIHsKLSAgICByZXR1cm4gbUltcGwtPnN0YXJ0KE5VTEwpOyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCgpIGRvZXNuJ3QgdXNlIGl0cyBhcmd1bWVudAorbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoKSB7CisgICAgLy8gaW5pdGlhbGl6ZSB3aXRoIG9uZSBzbWFsbCBidWZmZXIsIGJ1dCBhbGxvdyBncm93dGgKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBvbmUgYnVmZmVyICovLCAyNTYgLyogYnVmZmVyIHNpemUgKi8sIDY0IC8qIG1heCBudW1iZXIgb2YgYnVmZmVycyAqLyk7CisKKyAgICBpZiAoIW1JbXBsLT5zdGFydChOVUxMKSkgeyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCgpIGRvZXNuJ3QgdXNlIGl0cyBhcmd1bWVudAorICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1JbXBsLT5zdG9wKCk7CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdG9wKCkgeworICAgIGlmICghbUltcGwtPnN0b3AoKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK3ZvaWQgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBzaXplX3QgbnVtRW50cmllcyA9IG1zZy0+Y291bnRFbnRyaWVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdHlwZTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1zZy0+Z2V0RW50cnlOYW1lQXQoaSwgJnR5cGUpOworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaWQgPSBtc2ctPmdldEVudHJ5QXQoaSk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOgorICAgICAgICAgICAgICAgIGludDMyX3QgdmFsMzI7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbDMyKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBuYW1lLCB2YWwzMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQ2NDoKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbDY0OworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWw2NCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZvcm1hdCwgbmFtZSwgdmFsNjQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6CisgICAgICAgICAgICAgICAgZmxvYXQgdmFsZmxvYXQ7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbGZsb2F0KSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoZm9ybWF0LCBuYW1lLCB2YWxmbG9hdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVEb3VibGU6CisgICAgICAgICAgICAgICAgZG91YmxlIHZhbGRvdWJsZTsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmdmFsZG91YmxlKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RG91YmxlKGZvcm1hdCwgbmFtZSwgdmFsZG91YmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVN0cmluZzoKKyAgICAgICAgICAgICAgICBpZiAoQVN0cmluZyBzOyBpZC5maW5kKCZzKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZvcm1hdCwgbmFtZSwgcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUJ1ZmZlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihmb3JtYXQsIG5hbWUsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgdW5zdXBwb3J0ZWQgdHlwZSAlZCAnJXMnIiwgdHlwZSwgbmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBzcDxNZXRhRGF0YT4gaW1wbE1ldGEgPSBtSW1wbC0+Z2V0Rm9ybWF0KCk7Ci0gICAgbWV0YSA9ICppbXBsTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgc3A8QU1lc3NhZ2U+IG1zZzsKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoaW1wbE1ldGEsICZtc2cpOworICAgIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KG1ldGEsIG1zZyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOwogICAgIGlmIChtRG9lc1NlZWsgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKICAgICAgICAgLy8gc2VlayBpcyBuZWVkZWQKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2VlayhzZWVrVGltZVVzLCBzZWVrTW9kZSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNlZWsoc2Vla1RpbWVVcywgKFJlYWRPcHRpb25zOjpTZWVrTW9kZSlzZWVrTW9kZSk7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1FeHRyYWN0b3ItPmZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShtSW1wbCkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICByZXR1cm4gbUltcGwtPnJlYWQob3V0LCBvcHRpb25zKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWY7CisgICAgbUltcGwtPnJlYWQoJm1idWYsIChNZWRpYVRyYWNrOjpSZWFkT3B0aW9ucyopIG9wdGlvbnMpOworICAgIHNpemVfdCBsZW5ndGggPSBtYnVmLT5yYW5nZV9sZW5ndGgoKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqb3V0YnVmOworICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dGJ1ZiwgZmFsc2UsIGxlbmd0aCk7CisgICAgbWVtY3B5KG91dGJ1Zi0+ZGF0YSgpLCBtYnVmLT5kYXRhKCksIGxlbmd0aCk7CisgICAgb3V0YnVmLT5zZXRfcmFuZ2UoMCwgbGVuZ3RoKTsKKyAgICAqb3V0ID0gb3V0YnVmOworICAgIE1ldGFEYXRhQmFzZSAmaW5NZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0ICpvdXRNZXRhID0gb3V0YnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXIob3V0TWV0YSk7CisgICAgaW50NjRfdCB2YWw2NDsKKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQ2NChrS2V5VGltZSwgJnZhbDY0KSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB2YWw2NCk7CisgICAgfQorICAgIGludDMyX3QgdmFsMzI7CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIHZhbDMyKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZ2YWwzMikpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIHZhbDMyKTsKKyAgICB9CisgICAgdWludDMyX3QgYnVmVHlwZTsKKyAgICBjb25zdCB2b2lkICpidWZEYXRhOworICAgIHNpemVfdCBidWZTaXplOworICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0lWLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleVBsYWluU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlTRUksICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9TRUksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIG1idWYtPnJlbGVhc2UoKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1NUEVHMlRTRXh0cmFjdG9yOjpNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitNUEVHMlRTRXh0cmFjdG9yOjpNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtUGFyc2VyKG5ldyBBVFNQYXJzZXIpLAogICAgICAgbUxhc3RTeW5jRXZlbnQoMCksCkBAIC0xMzMsMTEgKzI0MSwxNSBAQAogICAgIGluaXQoKTsKIH0KIAorTVBFRzJUU0V4dHJhY3Rvcjo6fk1QRUcyVFNFeHRyYWN0b3IoKSB7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworfQorCiBzaXplX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Tb3VyY2VJbXBscy5zaXplKCk7CiB9CiAKLU1lZGlhVHJhY2sgKk1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IG1Tb3VyY2VJbXBscy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTQ4LDIyICsyNjAsMjMgQEAKICAgICAgICAgICAgIChtU2Vla1N5bmNQb2ludHMgPT0gJm1TeW5jUG9pbnRzLmVkaXRJdGVtQXQoaW5kZXgpKSk7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIHNwPE1ldGFEYXRhPiBpbXBsTWV0YSA9IGluZGV4IDwgbVNvdXJjZUltcGxzLnNpemUoKQogICAgICAgICA/IG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KS0+Z2V0Rm9ybWF0KCkgOiBOVUxMOwogICAgIGlmIChpbXBsTWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSAqaW1wbE1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKGltcGxNZXRhLCAmbXNnKTsKKyAgICBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChtZXRhLCBtc2cpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKLQotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy9zdGF0aWMKQEAgLTE3NCw3ICsyODcsNyBAQAogICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQsIG1pbWUpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpIHsKICAgICBIYWxUb2tlbiBoYWxUb2tlbjsKICAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKCh1aW50OF90KiljYXNUb2tlbiwgc2l6ZSk7CiAgICAgc3A8SUNhcz4gY2FzID0gSUNhczo6Y2FzdEZyb20ocmV0cmlldmVIYWxJbnRlcmZhY2UoaGFsVG9rZW4pKTsKQEAgLTE4NCwyMCArMjk3LDI2IEBACiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBBTE9HSSgiQWxsIHRyYWNrcyBub3cgaGF2ZSBkZXNjcmFtYmxlcnMiKTsKICAgICAgICAgaW5pdCgpOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmluZEluZGV4T2ZTb3VyY2UoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsIHNpemVfdCAqaW5kZXgpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVNvdXJjZUltcGxzW2ldID09IGltcGwpIHsKKyAgICAgICAgICAgICppbmRleCA9IGk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogfQogCiB2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmFkZFNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCkgewotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobVNvdXJjZUltcGxzW2ldID09IGltcGwpIHsKLSAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghZm91bmQpIHsKKyAgICBzaXplX3QgaW5kZXg7CisgICAgaWYgKGZpbmRJbmRleE9mU291cmNlKGltcGwsICZpbmRleCkgIT0gT0spIHsKICAgICAgICAgbVNvdXJjZUltcGxzLnB1c2goaW1wbCk7CisgICAgICAgIG1TeW5jUG9pbnRzLnB1c2goKTsKICAgICB9CiB9CiAKQEAgLTIwNSw2ICszMjQsNyBAQAogICAgIGJvb2wgaGF2ZUF1ZGlvID0gZmFsc2U7CiAgICAgYm9vbCBoYXZlVmlkZW8gPSBmYWxzZTsKICAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgc2l6ZV90IGluZGV4OwogCiAgICAgc3RhdHVzX3QgZXJyOwogICAgIHdoaWxlICgoZXJyID0gZmVlZE1vcmUodHJ1ZSAvKiBpc0luaXQgKi8pKSA9PSBPSwpAQCAtMjIzLDggKzM0Myw5IEBACiAgICAgICAgICAgICAgICAgICAgIGhhdmVWaWRlbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShpbXBsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdCgqKGZvcm1hdC5nZXQoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdFRvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRJbmRleE9mU291cmNlKGltcGwsICZpbmRleCkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMzgsMTAgKzM1OSw5IEBACiAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShpbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdCgqKGZvcm1hdC5nZXQoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVWaWRlbykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0VG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNTY3JhbWJsZWRGb3JtYXQoKihmb3JtYXQuZ2V0KCkpKSAmJiAhaGF2ZVZpZGVvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEluZGV4T2ZTb3VyY2UoaW1wbCwgJmluZGV4KSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTQ5MSw3ICs2MTEsNyBAQAogfQogCiBzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKLSAgICAgICAgY29uc3QgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlICZzZWVrTW9kZSkgeworICAgICAgICBjb25zdCBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgJnNlZWtNb2RlKSB7CiAgICAgaWYgKG1TZWVrU3luY1BvaW50cyA9PSBOVUxMIHx8IG1TZWVrU3luY1BvaW50cy0+aXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dXKCJObyBzeW5jIHBvaW50IHRvIHNlZWsgdG8uIik7CiAgICAgICAgIC8vIC4uLiBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgbm90aGluZyB1c2VmdWwgdG8gZG8gaGVyZS4KQEAgLTUxMiwxOCArNjMyLDE4IEBACiAgICAgfQogCiAgICAgc3dpdGNoIChzZWVrTW9kZSkgewotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CiAgICAgICAgICAgICBpZiAoaW5kZXggPT0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiTmV4dCBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgbGF0ZXN0IHN5bmMuIik7CiAgICAgICAgICAgICAgICAgLS1pbmRleDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgogICAgICAgICAgICAgQUxPR1coInNlZWtNb2RlIG5vdCBzdXBwb3J0ZWQ6ICVkOyBmYWxsaW5nIGJhY2sgdG8gUFJFVklPVVNfU1lOQyIsCiAgICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlKTsKICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgIGNhc2UgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIlByZXZpb3VzIHN5bmMgbm90IGZvdW5kOyBzdGFydGluZyBmcm9tIHRoZSBlYXJsaWVzdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAic3luYy4iKTsKQEAgLTY2Niw3ICs3ODYsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1ib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CiAgICAgICAgIGNoYXIgaGVhZGVyOwogICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoa1RTUGFja2V0U2l6ZSAqIGksICZoZWFkZXIsIDEpICE9IDEKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKaW5kZXggY2JkZDNjYi4uMjUzN2QzYiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKQEAgLTIwLDggKzIwLDggQEAKICNkZWZpbmUgTVBFRzJfVFNfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgpAQCAtMzQsMzAgKzM0LDMzIEBACiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBBVFNQYXJzZXI7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBDRGF0YVNvdXJjZTsKIHN0cnVjdCBNUEVHMlRTU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTVBFRzJUU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgTVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJUU0V4dHJhY3RvciI7IH0KIAorcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1QRUcyVFNFeHRyYWN0b3IoKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IE1QRUcyVFNTb3VyY2U7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogCiAgICAgc3A8QVRTUGFyc2VyPiBtUGFyc2VyOwogCkBAIC04MSwxNyArODQsMTggQEAKICAgICAvLyBUcnkgdG8gZmVlZCBtb3JlIGRhdGEgZnJvbSBzb3VyY2UgdG8gcGFyc2VyLgogICAgIC8vIHxpc0luaXR8IG1lYW5zIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluc2lkZSBpbml0KCkuIFRoaXMgaXMgYSBzaWduYWwgdG8KICAgICAvLyBzYXZlIFN5bmNFdmVudCBzbyB0aGF0IGluaXQoKSBjYW4gYWRkIFN5bmNQb2ludCBhZnRlciBpdCB1cGRhdGVzIHxtU291cmNlSW1wbHN8LgotICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBleHBlY3RlZCBhbW91bnQgb2YgZGF0YSBpcyBmZWQgZnJvbSBEYXRhU291cmNlQmFzZSB0bworICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBleHBlY3RlZCBhbW91bnQgb2YgZGF0YSBpcyBmZWQgZnJvbSBEYXRhU291cmNlSGVscGVyIHRvCiAgICAgLy8gcGFyc2VyIGFuZCBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkLiBPdGhlcndpc2UsIHZhcmlvdXMgZXJyb3IgY29kZXMgY291bGQgYmUKLSAgICAvLyByZXR1cm5lZCwgZS5nLiwgRVJST1JfRU5EX09GX1NUUkVBTSwgb3Igbm8gZGF0YSBhdmFpbGFsYmUgZnJvbSBEYXRhU291cmNlQmFzZSwgb3IKKyAgICAvLyByZXR1cm5lZCwgZS5nLiwgRVJST1JfRU5EX09GX1NUUkVBTSwgb3Igbm8gZGF0YSBhdmFpbGFsYmUgZnJvbSBEYXRhU291cmNlSGVscGVyLCBvcgogICAgIC8vIHRoZSBkYXRhIGhhcyBzeW50YXggZXJyb3IgZHVyaW5nIHBhcnNpbmcsIGV0Yy4KICAgICBzdGF0dXNfdCBmZWVkTW9yZShib29sIGlzSW5pdCA9IGZhbHNlKTsKICAgICBzdGF0dXNfdCBzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUmIHNlZWtNb2RlKTsKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSYgc2Vla01vZGUpOwogICAgIHN0YXR1c190IHF1ZXVlRGlzY29udGludWl0eUZvclNlZWsoaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzKTsKICAgICBzdGF0dXNfdCBzZWVrQmV5b25kKGludDY0X3Qgc2Vla1RpbWVVcyk7CiAKICAgICBzdGF0dXNfdCBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwpOworICAgIHN0YXR1c190IGZpbmRJbmRleE9mU291cmNlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLCBzaXplX3QgKmluZGV4KTsKIAogICAgIC8vIEFkZCBhIFN5blBvaW50IGRlcml2ZWQgZnJvbSB8ZXZlbnR8LgogICAgIHZvaWQgYWRkU3luY1BvaW50X2woY29uc3QgQVRTUGFyc2VyOjpTeW5jRXZlbnQgJmV2ZW50KTsKQEAgLTEwMSw3ICsxMDUsNyBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNFeHRyYWN0b3IpOwogfTsKIAotYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCmluZGV4IGYzZDI3OTQuLjYwNGVjNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icApAQCAtNywxMyArNywxOCBAQAogICAgICAgICAiZXh0ZXJuYWwvdHJlbW9sbyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnZvcmJpc2lkZWMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcAppbmRleCBiMmZlNjljLi5kOTk0OTNkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKQEAgLTIxLDE5ICsyMSwxNyBAQAogI2luY2x1ZGUgIk9nZ0V4dHJhY3Rvci5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL1ZvcmJpc0NvbW1lbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBleHRlcm4gIkMiIHsKQEAgLTQ3LDE2ICs0NSwxNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBPZ2dTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitzdHJ1Y3QgT2dnU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIGV4cGxpY2l0IE9nZ1NvdXJjZShPZ2dFeHRyYWN0b3IgKmV4dHJhY3Rvcik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk9nZ1NvdXJjZSgpOwpAQCAtNzEsMjggKzY5LDMwIEBACiAKIHN0cnVjdCBNeU9nZ0V4dHJhY3RvciB7CiAgICAgTXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgICAgICBzaXplX3QgbnVtSGVhZGVycywKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcyk7CiAgICAgdmlydHVhbCB+TXlPZ2dFeHRyYWN0b3IoKTsKIAotICAgIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJikgY29uc3Q7CisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKSBjb25zdDsKIAogICAgIC8vIFJldHVybnMgYW4gYXBwcm94aW1hdGUgYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuCiAgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3QgPSAwOwogCiAgICAgc3RhdHVzX3Qgc2Vla1RvVGltZShpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcikgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIpID0gMDsKIAogICAgIHN0YXR1c190IGluaXQoKTsKIAotICAgIHN0YXR1c190IGdldEZpbGVNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICAgICAgbWV0YSA9IG1GaWxlTWV0YTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgIG1lZGlhX3N0YXR1c190IGdldEZpbGVNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICAgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YSk7CiAgICAgfQogCisgICAgdm9pZCBzZXRCdWZmZXJHcm91cChNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkgeworICAgICAgICBtQnVmZmVyR3JvdXAgPSBncm91cDsKKyAgICB9CiBwcm90ZWN0ZWQ6CiAgICAgc3RydWN0IFBhZ2UgewogICAgICAgICB1aW50NjRfdCBtR3JhbnVsZVBvc2l0aW9uOwpAQCAtMTEwLDcgKzExMCw4IEBACiAgICAgICAgIGludDY0X3QgbVRpbWVVczsKICAgICB9OwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1Tb3VyY2U7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUJ1ZmZlckdyb3VwOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIFBhZ2UgbUN1cnJlbnRQYWdlOwogICAgIHVpbnQ2NF90IG1DdXJHcmFudWxlUG9zaXRpb247CkBAIC0xMjksMTEgKzEzMCwxMyBAQAogICAgIHZvcmJpc19pbmZvIG1WaTsKICAgICB2b3JiaXNfY29tbWVudCBtVmM7CiAKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhOwogCiAgICAgVmVjdG9yPFRPQ0VudHJ5PiBtVGFibGVPZkNvbnRlbnRzOwogCisgICAgaW50MzJfdCBtSGFwdGljQ2hhbm5lbENvdW50OworCiAgICAgc3NpemVfdCByZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSk7CiAgICAgc3RhdHVzX3QgZmluZE5leHRQYWdlKG9mZjY0X3Qgc3RhcnRPZmZzZXQsIG9mZjY0X3QgKnBhZ2VPZmZzZXQpOwogCkBAIC0xNDYsNyArMTQ5LDcgQEAKICAgICAvLyAxIC0gYml0c3RyZWFtIGlkZW50aWZpY2F0aW9uIGhlYWRlcgogICAgIC8vIDMgLSBjb21tZW50IGhlYWRlcgogICAgIC8vIDUgLSBjb2RlYyBzZXR1cCBoZWFkZXIgKFZvcmJpcyBvbmx5KQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpID0gMDsKIAogICAgIC8vIFJlYWQgdGhlIG5leHQgb2dnIHBhY2tldCBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlOyBvcHRpb25hbGx5CiAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBvdXRwdXQgcGFja2V0IHdoaWxzdCBwcmV0ZW5kaW5nCkBAIC0xNTQsOSArMTU3LDkgQEAKICAgICAvLwogICAgIC8vICpidWZmZXIgaXMgTlVMTCdlZCBvdXQgaW1tZWRpYXRlbHkgdXBvbiBlbnRyeSwgYW5kIGlmIHN1Y2Nlc3NmdWwgYSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZDsKICAgICAvLyBjbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSBvcmlnaW5hbCBidWZmZXIuCi0gICAgc3RhdHVzX3QgX3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKTsKKyAgICBtZWRpYV9zdGF0dXNfdCBfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCk7CiAKLSAgICBpbnQzMl90IGdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisgICAgaW50MzJfdCBnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcik7CiAKICAgICB2b2lkIHBhcnNlRmlsZU1ldGFEYXRhKCk7CiAKQEAgLTE2NCwxMiArMTY3LDE0IEBACiAKICAgICB2b2lkIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7CiAKKyAgICB2b2lkIHNldENoYW5uZWxNYXNrKGludCBjaGFubmVsQ291bnQpOworCiAgICAgTXlPZ2dFeHRyYWN0b3IoY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7CiAgICAgTXlPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKIH07CiAKIHN0cnVjdCBNeVZvcmJpc0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTXlWb3JiaXNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICBleHBsaWNpdCBNeVZvcmJpc0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKICAgICAgICAgICAgICAgICAvKiBudW1IZWFkZXJzICovIDMsCkBAIC0xNzgsNyArMTgzLDcgQEAKIAogICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0OwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpIHsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyKSB7CiAgICAgICAgIHJldHVybiBfcmVhZE5leHRQYWNrZXQoYnVmZmVyLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gdHJ1ZSk7CiAgICAgfQogCkBAIC0xOTAsMTQgKzE5NSwxNCBAQAogICAgICAgICByZXR1cm4gZ3JhbnVsZVBvcyAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CiB9OwogCiBzdHJ1Y3QgTXlPcHVzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKICAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrT3B1c1NlZWtQcmVSb2xsVXMgPSA4MDAwMDsgLy8gODAgbXMKIAotICAgIGV4cGxpY2l0IE15T3B1c0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIGV4cGxpY2l0IE15T3B1c0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAvKm51bUhlYWRlcnMqLyAyLCBrT3B1c1NlZWtQcmVSb2xsVXMpLAogICAgICAgICAgIG1DaGFubmVsQ291bnQoMCksCiAgICAgICAgICAgbUNvZGVjRGVsYXkoMCksCkBAIC0yMDgsMTYgKzIxMywxNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlcik7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CiAKIHByaXZhdGU6Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLSAgICB1aW50MzJfdCBnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0OworICAgIG1lZGlhX3N0YXR1c190IHZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcik7CisgICAgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpOworICAgIHVpbnQzMl90IGdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSBjb25zdDsKIAogICAgIHVpbnQ4X3QgbUNoYW5uZWxDb3VudDsKICAgICB1aW50MTZfdCBtQ29kZWNEZWxheTsKQEAgLTIzNywyOCArMjQyLDMwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHJldHVybiBtRXh0cmFjdG9yLT5tSW1wbC0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpzdGFydCgpIHsKICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLQorICAgIC8vIGluaXRpYWxpemUgYnVmZmVyIGdyb3VwIHdpdGggYSBzaW5nbGUgc21hbGwgYnVmZmVyLCBidXQgYSBnZW5lcm91cyB1cHBlciBsaW1pdAorICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG51bWJlciBvZiBidWZmZXJzICovLCAxMjggLyogc2l6ZSAqLywgNjQgLyogbWF4IG51bWJlciBvZiBidWZmZXJzICovKTsKKyAgICBtRXh0cmFjdG9yLT5tSW1wbC0+c2V0QnVmZmVyR3JvdXAobUJ1ZmZlckdyb3VwKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgewogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtMjY2LDQxICsyNzMsNDMgQEAKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+c2Vla1RvVGltZShzZWVrVGltZVVzKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqcGFja2V0OwotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcGFja2V0OworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKIAotICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IHBhY2tldC0+bWV0YV9kYXRhKCk7CiAjaWYgMAogICAgIGludDY0X3QgdGltZVVzOwotICAgIGlmIChwYWNrZXQtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2ZpbmRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVTdGFtcFVzKSkgewogICAgICAgICBBTE9HSSgiZm91bmQgdGltZSA9ICVsbGQgdXMiLCB0aW1lVXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dJKCJOTyB0aW1lIik7CiAgICAgfQogI2VuZGlmCiAKLSAgICBwYWNrZXQtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICAqb3V0ID0gcGFja2V0OwotCi0gICAgcmV0dXJuIE9LOworICAgIEFMT0dWKCJyZXR1cm5pbmcgYnVmZmVyICVwIiwgcGFja2V0KTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBNeU9nZ0V4dHJhY3Rvcjo6TXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAogICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgOiBtQnVmZmVyR3JvdXAoTlVMTCksCisgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbigwKSwKICAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uKDApLApAQCAtMzExLDIxICszMjAsMjUgQEAKICAgICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCiAgICAgICBtTnVtSGVhZGVycyhudW1IZWFkZXJzKSwKICAgICAgIG1TZWVrUHJlUm9sbFVzKHNlZWtQcmVSb2xsVXMpLAotICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSkgeworICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSksCisgICAgICBtSGFwdGljQ2hhbm5lbENvdW50KDApIHsKICAgICBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzID0gMDsKIAogICAgIHZvcmJpc19pbmZvX2luaXQoJm1WaSk7CiAgICAgdm9yYmlzX2NvbW1lbnRfaW5pdCgmbVZjKTsKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtRmlsZU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiB9CiAKIE15T2dnRXh0cmFjdG9yOjp+TXlPZ2dFeHRyYWN0b3IoKSB7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGEpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobU1ldGEpOwogICAgIHZvcmJpc19jb21tZW50X2NsZWFyKCZtVmMpOwogICAgIHZvcmJpc19pbmZvX2NsZWFyKCZtVmkpOwogfQogCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgY29uc3QgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgY29uc3QgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKIHN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpmaW5kTmV4dFBhZ2UoCkBAIC0zNTEsNyArMzY0LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAotICAgICAgICArKypwYWdlT2Zmc2V0OworICAgICAgICAvLyBzZWUgaG93IGZhciBhaGVhZCB0byBza2lwOyBhdm9pZCBzb21lIGZydWl0bGVzcyBjb21wYXJpc29ucworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDQgOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzaWduYXR1cmVbaV0gPT0gJ08nKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICpwYWdlT2Zmc2V0ICs9IGk7CiAgICAgfQogfQogCkBAIC01MDIsMzAgKzUyMSwzMCBAQAogICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IG9mZnNldCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIChsb25nIGxvbmcpb2Zmc2V0LCBuKTsKIAotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIGlmIChuID09IDAgfHwgbiA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobWVtY21wKGhlYWRlciwgIk9nZ1MiLCA0KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBpZiAoaGVhZGVyWzRdICE9IDApIHsKICAgICAgICAgLy8gV3JvbmcgdmVyc2lvbi4KIAotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCiAgICAgcGFnZS0+bUZsYWdzID0gaGVhZGVyWzVdOwogCiAgICAgaWYgKHBhZ2UtPm1GbGFncyAmIH43KSB7CiAgICAgICAgIC8vIE9ubHkgYml0cyAwLTIgYXJlIGRlZmluZWQgaW4gdmVyc2lvbiAwLgotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uID0gVTY0TEVfQVQoJmhlYWRlcls2XSk7CkBAIC01NDIsNyArNTYxLDcgQEAKICAgICBpZiAobVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgIG9mZnNldCArIHNpemVvZihoZWFkZXIpLCBwYWdlLT5tTGFjZSwgcGFnZS0+bU51bVNlZ21lbnRzKQogICAgICAgICAgICAgPCAoc3NpemVfdClwYWdlLT5tTnVtU2VnbWVudHMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgIH0KIAogICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOzsKQEAgLTU2NSwyMiArNTg0LDIyIEBACiAgICAgcmV0dXJuIHNpemVvZihoZWFkZXIpICsgcGFnZS0+bU51bVNlZ21lbnRzICsgdG90YWxTaXplOwogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKm91dCkgeworbWVkaWFfc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCkgewogICAgIGlmIChtT2Zmc2V0IDw9IG1GaXJzdERhdGFPZmZzZXQgJiYgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uIDwgMCkgewogICAgICAgICAvLyBUaGUgZmlyc3Qgc2FtcGxlIG1pZ2h0IG5vdCBzdGFydCBhdCB0aW1lIDA7IGZpbmQgb3V0IHdoZXJlIGJ5IHN1YnRyYWN0aW5nCiAgICAgICAgIC8vIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgZmlyc3QgcGFnZSBmcm9tIHRoZSBncmFudWxlIHBvc2l0aW9uCiAgICAgICAgIC8vIChwb3NpdGlvbiBvZiBsYXN0IGNvbXBsZXRlIHNhbXBsZSkgb2YgdGhlIGZpcnN0IHBhZ2UuIFRoaXMgaGFwcGVucwogICAgICAgICAvLyB0aGUgZmlyc3QgdGltZSBiZWZvcmUgd2UgYXR0ZW1wdCB0byByZWFkIGEgcGFja2V0IGZyb20gdGhlIGZpcnN0IHBhZ2UuCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbUJ1ZjsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1CdWY7CiAgICAgICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSAwOwogICAgICAgICB1aW50NjRfdCBjdXJHcmFudWxlUG9zaXRpb24gPSAwOwogICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQoJm1CdWYsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LICYmIGVyciAhPSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBGaXJzdCB0d28gcGFnZXMgYXJlIGhlYWRlciBwYWdlcy4KLSAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBtQ3VycmVudFBhZ2UubVBhZ2VObyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1CdWYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtQnVmLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWYgPSBOVUxMOwpAQCAtNjAxLDMyICs2MjAsMzMgQEAKICAgICAgICAgc2Vla1RvT2Zmc2V0KDApOwogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KG91dCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCiAgICAgaW50MzJfdCBjdXJyZW50UGFnZVNhbXBsZXM7CiAgICAgLy8gQ2FsY3VsYXRlIHRpbWVzdGFtcHMgYnkgYWNjdW11bGF0aW5nIGR1cmF0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBzYW1wbGUgb2YgYSBwYWdlOwogICAgIC8vIFdlIGFzc3VtZSB0aGF0IHdlIG9ubHkgc2VlayB0byBwYWdlIGJvdW5kYXJpZXMuCi0gICAgaWYgKCgqb3V0KS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZjdXJyZW50UGFnZVNhbXBsZXMpKSB7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gKCpvdXQpLT5tZXRhX2RhdGEoKTsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgJmN1cnJlbnRQYWdlU2FtcGxlcykpIHsKICAgICAgICAgLy8gZmlyc3QgcGFja2V0IGluIHBhZ2UKICAgICAgICAgaWYgKG1PZmZzZXQgPT0gbUZpcnN0RGF0YU9mZnNldCkgewogICAgICAgICAgICAgY3VycmVudFBhZ2VTYW1wbGVzIC09IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKLSAgICAgICAgICAgICgqb3V0KS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgY3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7CiAgICAgICAgIH0KICAgICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uIC0gY3VycmVudFBhZ2VTYW1wbGVzOwogICAgIH0KIAogICAgIGludDY0X3QgdGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKG1DdXJHcmFudWxlUG9zaXRpb24pOwotICAgICgqb3V0KS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKIAogICAgIHVpbnQzMl90IGZyYW1lcyA9IGdldE51bVNhbXBsZXNJblBhY2tldCgqb3V0KTsKICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uICs9IGZyYW1lczsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotdWludDMyX3QgTXlPcHVzRXh0cmFjdG9yOjpnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0IHsKK3VpbnQzMl90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIGNvbnN0IHsKICAgICBpZiAoYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8IDEpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNjcyLDEwICs2OTIsNjYgQEAKICAgICByZXR1cm4gbnVtU2FtcGxlczsKIH0KIAotc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgeworLyoKKyAqIGJhc2ljIG1lZGlhYnVmZmVyIGltcGxlbWVudGF0aW9uIHVzZWQgZHVyaW5nIGluaXRpYWwgcGFyc2luZyBvZiB0aGUKKyAqIGhlYWRlciBwYWNrZXRzLCB3aGljaCBoYXBwZW5zIGJlZm9yZSB3ZSBoYXZlIGEgYnVmZmVyIGdyb3VwCisgKi8KK2NsYXNzIFN0YW5kQWxvbmVNZWRpYUJ1ZmZlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlckhlbHBlciB7Citwcml2YXRlOgorICAgIHZvaWQgKm1EYXRhOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBzaXplX3QgbU9mZnNldDsKKyAgICBzaXplX3QgbUxlbmd0aDsKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CitwdWJsaWM6CisgICAgU3RhbmRBbG9uZU1lZGlhQnVmZmVyKHNpemVfdCBzaXplKSA6IE1lZGlhQnVmZmVySGVscGVyKE5VTEwpIHsKKyAgICAgICAgbVNpemUgPSBzaXplOworICAgICAgICBtRGF0YSA9IG1hbGxvYyhtU2l6ZSk7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgICAgICBtTGVuZ3RoID0gbVNpemU7CisgICAgICAgIG1Gb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVkIHN0YW5kYWxvbmUgbWVkaWEgYnVmZmVyICVwIG9mIHNpemUgJXp1IiwgdGhpcywgbVNpemUpOworICAgIH0KKworICAgIH5TdGFuZEFsb25lTWVkaWFCdWZmZXIoKSBvdmVycmlkZSB7CisgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1Gb3JtYXQpOworICAgICAgICBBTE9HVigiZGVsZXRlZCBzdGFuZGFsb25lIG1lZGlhIGJ1ZmZlciAlcCBvZiBzaXplICV6dSIsIHRoaXMsIG1TaXplKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZSB7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KKworICAgIHZvaWQqIGRhdGEoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworICAgIHNpemVfdCByYW5nZV9vZmZzZXQoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtT2Zmc2V0OworICAgIH0KKworICAgIHNpemVfdCByYW5nZV9sZW5ndGgoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0KKworICAgIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlIHsKKyAgICAgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbUxlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisgICAgQU1lZGlhRm9ybWF0ICptZXRhX2RhdGEoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtRm9ybWF0OworICAgIH0KK307CisKK21lZGlhX3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBOVUxMOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBOVUxMOwogICAgIGludDY0X3QgdGltZVVzID0gLTE7CiAKICAgICBmb3IgKDs7KSB7CkBAIC03MDksMTYgKzc4NSwyMyBAQAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICp0bXAgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShmdWxsU2l6ZSk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqdG1wOworICAgICAgICAgICAgaWYgKG1CdWZmZXJHcm91cCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCwgZmFsc2UsIGZ1bGxTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWNxdWlyZWQgYnVmZmVyICVwIGZyb20gZ3JvdXAiLCB0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBuZXcgU3RhbmRBbG9uZU1lZGlhQnVmZmVyKGZ1bGxTaXplKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKHRtcC0+bWV0YV9kYXRhKCkpOwogICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbWVtY3B5KHRtcC0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CkBAIC03MzcsNyArODIwLDcgQEAKICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0ICUjMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUsIChsb25nIGxvbmcpZGF0YU9mZnNldCwgbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZ1bGxTaXplKTsKQEAgLTc0OCw4ICs4MzEsOSBAQAogICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGp1c3QgcmVhZCB0aGUgZW50aXJlIHBhY2tldC4KIAogICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQYWNrZXRJblBhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNzcwLDExICs4NTQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFBvcyArPSBhY3R1YWxCbG9ja1NpemUgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA9IGN1ckJsb2NrU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCwgdGhlIGJ1ZmZlciBub3cgY29udGFpbnMgdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuCkBAIC03OTMsNyArODc4LDcgQEAKIAogICAgICAgICAgICAgQUxPR1YoInJlYWRQYWdlIHJldHVybmVkICV6ZCIsIG4pOwogCi0gICAgICAgICAgICByZXR1cm4gbiA8IDAgPyBuIDogKHN0YXR1c190KUVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gKG1lZGlhX3N0YXR1c190KSBuOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUHJldmVudCBhIGhhcm1sZXNzIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgYnkgY2xhbXBpbmcgdG8gMApAQCAtODE2LDM2ICs5MDEsMzggQEAKICAgICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNvbXBsZXRlLgogCiAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWYWxpZFNhbXBsZXMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAogc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmluaXQoKSB7Ci0gICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1NaW1lVHlwZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtTWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqcGFja2V0OworICAgIG1lZGlhX3N0YXR1c190IGVycjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcGFja2V0OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUhlYWRlcnM7ICsraSkgewogICAgICAgICAvLyBpZ25vcmUgdGltZXN0YW1wIGZvciBjb25maWd1cmF0aW9uIHBhY2tldHMKLSAgICAgICAgaWYgKChlcnIgPSBfcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIGZhbHNlKSkgIT0gT0spIHsKKyAgICAgICAgaWYgKChlcnIgPSBfcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIGZhbHNlKSkgIT0gQU1FRElBX09LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIC8qIHR5cGUgPSAqLyBpICogMiArIDEpOwogICAgICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKICAgICAgICAgcGFja2V0ID0gTlVMTDsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KQEAgLTg2NSwxMiArOTUyLDEyIEBACiAKICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKGxhc3RHcmFudWxlUG9zaXRpb24pOwogCi0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CiAKICAgICAgICAgYnVpbGRUYWJsZU9mQ29udGVudHMoKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdm9pZCBNeU9nZ0V4dHJhY3Rvcjo6YnVpbGRUYWJsZU9mQ29udGVudHMoKSB7CkBAIC05MDIsNyArOTg5LDcgQEAKICAgICAgICAgc2l6ZV90IGRlbm9tID0gbnVtZXJhdG9yIC0ga01heE51bVRPQ0VudHJpZXM7CiAKICAgICAgICAgc2l6ZV90IGFjY3VtID0gMDsKLSAgICAgICAgZm9yIChzc2l6ZV90IGkgPSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGZvciAoc3NpemVfdCBpID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKICAgICAgICAgICAgIGFjY3VtICs9IGRlbm9tOwogICAgICAgICAgICAgaWYgKGFjY3VtID49IG51bWVyYXRvcikgewogICAgICAgICAgICAgICAgIG1UYWJsZU9mQ29udGVudHMucmVtb3ZlQXQoaSk7CkBAIC05MTIsNyArOTk5LDcgQEAKICAgICB9CiB9CiAKLWludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworaW50MzJfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CiAKQEAgLTk1Miw3ICsxMDM5LDcgQEAKICAgICByZXR1cm4gcGNtU2FtcGxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGU7CiB9CiAKLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgewogICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAvLyB0aGVyZSBhcmUgYWN0dWFsbHkgbm8gaGVhZGVyIHR5cGVzIGRlZmluZWQgaW4gdGhlIE9wdXMgc3BlYzsgd2UgY2hvb3NlIDEgYW5kIDMgdG8gbWVhbgogICAgICAgICAvLyBoZWFkZXIgYW5kIGNvbW1lbnRzIHN1Y2ggdGhhdCB3ZSBjYW4gc2hhcmUgY29kZSB3aXRoIE15Vm9yYmlzRXh0cmFjdG9yLgpAQCAtOTYxLDExICsxMDQ4LDExIEBACiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIHJldHVybiB2ZXJpZnlPcHVzQ29tbWVudHMoYnVmZmVyKTsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSB7CiAgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2l6ZSA9IDE5OwogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKQEAgLTk3NSwyOSArMTA2MiwzMSBAQAogICAgIGlmIChzaXplIDwga09wdXNIZWFkZXJTaXplCiAgICAgICAgICAgICB8fCBtZW1jbXAoZGF0YSwgIk9wdXNIZWFkIiwgOCkKICAgICAgICAgICAgIHx8IC8qIHZlcnNpb24gPSAqLyBkYXRhWzhdICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgbUNoYW5uZWxDb3VudCA9IGRhdGFbOV07CiAgICAgbUNvZGVjRGVsYXkgPSBVMTZMRV9BVCgmZGF0YVsxMF0pOwogCi0gICAgbU1ldGEuc2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgZGF0YSwgc2l6ZSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGtPcHVzU2FtcGxlUmF0ZSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUNoYW5uZWxDb3VudCk7Ci0gICAgbU1ldGEuc2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCAvKiBucyAqLywga09wdXNTZWVrUHJlUm9sbFVzICogMTAwMCAvKiA9IDgwIG1zKi8pOwotICAgIG1NZXRhLnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSAvKiBucyAqLywKLSAgICAgICAgICAgIG1Db2RlY0RlbGF5IC8qIHNhbXBsZS9zICovICogMTAwMDAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlKTsKKyAgICAvLyBrS2V5T3B1c0hlYWRlciBpcyBjc2QtMAorICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGRhdGEsIHNpemUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwga09wdXNTYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbUNoYW5uZWxDb3VudCk7CisgICAgaW50NjRfdCBjb2RlY2RlbGF5ID0gbUNvZGVjRGVsYXkgLyogc2FtcGxlL3MgKi8gKiAxMDAwMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGU7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgJmNvZGVjZGVsYXksIHNpemVvZihjb2RlY2RlbGF5KSk7CisgICAgaW50NjRfdCBwcmVyb2xsID0ga09wdXNTZWVrUHJlUm9sbFVzICogMTAwMCAvKiA9IDgwIG1zKi87CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwgJnByZXJvbGwsIHNpemVvZihwcmVyb2xsKSk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIHsKICAgICAvLyBhZGQgYXJ0aWZpY2lhbCBmcmFtaW5nIGJpdCBzbyB3ZSBjYW4gcmV1c2UgX3ZvcmJpc191bnBhY2tfY29tbWVudAogICAgIGludDMyX3QgY29tbWVudFNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMTsKICAgICBhdXRvIHRtcCA9IGhlYXBidWZmZXI8dWludDhfdD4oY29tbWVudFNpemUpOwogICAgIHVpbnQ4X3QgKmNvbW1lbnREYXRhID0gdG1wLmdldCgpOwogICAgIGlmIChjb21tZW50RGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1lbWNweShjb21tZW50RGF0YSwKQEAgLTEwMjYsMTQgKzExMTUsMTQgQEAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlckxlbjsgKytpKSB7CiAgICAgICAgIGNoYXIgY2hyID0gb2dncGFja19yZWFkKCZiaXRzLCA4KTsKICAgICAgICAgaWYgKGNociAhPSBPcHVzVGFnc1tpXSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaW50MzJfdCB2ZW5kb3JMZW4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CiAgICAgaWYgKHZlbmRvckxlbiA8IDAgfHwgdmVuZG9yTGVuID4gY29tbWVudFNpemUgLSA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICAvLyBza2lwIHZlbmRvciBzdHJpbmcKICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IHZlbmRvckxlbjsKQEAgLTEwNDQsMTMgKzExMzMsMTMgQEAKICAgICBpbnQzMl90IG4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CiAgICAgaWYgKG4gPCAwIHx8IG4gPiAoKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpID4+IDIpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICBpbnQzMl90IGxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwogICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CiAgICAgICAgIGlmIChsZW4gIDwgMCB8fCBsZW4gID4gKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgZnJhbWluZ0JpdE9mZnNldCArPSBsZW47CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuOyArK2opIHsKQEAgLTEwNTgsNyArMTE0Nyw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGZyYW1pbmdCaXRPZmZzZXQgPCAwIHx8IGZyYW1pbmdCaXRPZmZzZXQgPj0gY29tbWVudFNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGNvbW1lbnREYXRhW2ZyYW1pbmdCaXRPZmZzZXRdID0gMTsKIApAQCAtMTA3NSwyMiArMTE2NCwyMyBAQAogICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwogICAgIGludCBlcnIgPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKTsKICAgICBpZiAoMCAhPSBlcnIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgcGFyc2VGaWxlTWV0YURhdGEoKTsKLSAgICByZXR1cm4gT0s7CisgICAgc2V0Q2hhbm5lbE1hc2sobUNoYW5uZWxDb3VudCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcigKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgeworbWVkaWFfc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcigKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogCiAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwogCiAgICAgaWYgKHNpemUgPCA3IHx8IGRhdGFbMF0gIT0gdHlwZSB8fCBtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBvZ2dfYnVmZmVyIGJ1ZjsKQEAgLTExMDksNyArMTE5OSw3IEBACiAgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CiAKICAgICBpZiAob2dncGFja19yZWFkKCZiaXRzLCA4KSAhPSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDY7ICsraSkgewogICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOyAgLy8gc2tpcCAndm9yYmlzJwpAQCAtMTExOSwxMyArMTIwOSwxMyBAQAogICAgICAgICBjYXNlIDE6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2luZm8oJm1WaSwgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVZpLnJhdGUpOwotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbVZpLmNoYW5uZWxzKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmkuYml0cmF0ZV9ub21pbmFsKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtVmkucmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbVZpLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgbVZpLmJpdHJhdGVfbm9taW5hbCk7CiAKICAgICAgICAgICAgIEFMT0dWKCJsb3dlci1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfbG93ZXIpOwogICAgICAgICAgICAgQUxPR1YoInVwcGVyLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV91cHBlcik7CkBAIC0xMTQwLDcgKzEyMzAsNyBAQAogICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7CiAgICAgICAgICAgICAgICAgdWludDY0X3QgYnBzID0gYXBwcm94Qml0cmF0ZSgpOwogICAgICAgICAgICAgICAgIGlmIChicHMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpemUgKiA4MDAwMDAwbGwgLyBicHMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIHNpemUgKiA4MDAwMDAwbGwgLyBicHMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE0OSwyNSArMTIzOSwyNiBAQAogICAgICAgICBjYXNlIDM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcGFyc2VGaWxlTWV0YURhdGEoKTsKKyAgICAgICAgICAgIHNldENoYW5uZWxNYXNrKG1WaS5jaGFubmVscyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgNToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfYm9va3MoJm1WaSwgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzQm9va3MsIDAsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgZGF0YSwgc2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50NjRfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6YXBwcm94Qml0cmF0ZSgpIGNvbnN0IHsKQEAgLTExODAsMjAgKzEyNzEsNDMgQEAKIAogCiB2b2lkIE15T2dnRXh0cmFjdG9yOjpwYXJzZUZpbGVNZXRhRGF0YSgpIHsKLSAgICBtRmlsZU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmMuY29tbWVudHM7ICsraSkgewogICAgICAgICBjb25zdCBjaGFyICpjb21tZW50ID0gbVZjLnVzZXJfY29tbWVudHNbaV07CiAgICAgICAgIHNpemVfdCBjb21tZW50TGVuZ3RoID0gbVZjLmNvbW1lbnRfbGVuZ3Roc1tpXTsKLSAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KCZtRmlsZU1ldGEsIGNvbW1lbnQsIGNvbW1lbnRMZW5ndGgpOworICAgICAgICBwYXJzZVZvcmJpc0NvbW1lbnQobUZpbGVNZXRhLCBjb21tZW50LCBjb21tZW50TGVuZ3RoKTsKICAgICAgICAgLy9BTE9HSSgiY29tbWVudCAjJWQ6ICclcyciLCBpICsgMSwgbVZjLnVzZXJfY29tbWVudHNbaV0pOwogICAgIH0KKworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRmlsZU1ldGEsICJoYXB0aWMiLCAmbUhhcHRpY0NoYW5uZWxDb3VudCk7Cit9CisKK3ZvaWQgTXlPZ2dFeHRyYWN0b3I6OnNldENoYW5uZWxNYXNrKGludCBjaGFubmVsQ291bnQpIHsKKyAgICAvLyBTZXQgY2hhbm5lbCBtYXNrIGFjY29yZGluZyB0byBjaGFubmVsIGNvdW50LiBXaGVuIGhhcHRpYyBjaGFubmVsIGNvdW50IGlzIGZvdW5kIGluCisgICAgLy8gZmlsZSBtZXRhLCBzZXQgaGFwdGljIGNoYW5uZWwgbWFzayB0byB0cnkgaGFwdGljIHBsYXliYWNrLgorICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgaGFwdGljX2NoYW5uZWxfbWFza19mcm9tX2NvdW50KG1IYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICBjb25zdCBpbnQzMl90IGF1ZGlvQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50IC0gbUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgaWYgKGhhcHRpY0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5WQUxJRAorICAgICAgICAgICAgICAgIHx8IGF1ZGlvQ2hhbm5lbENvdW50IDw9IDAgfHwgYXVkaW9DaGFubmVsQ291bnQgPiBGQ0NfOCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgaGFwdGljIGNoYW5uZWwgY291bnQgZm91bmQgaW4gbWV0YWRhdGE6ICVkIiwgbUhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudCgKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9DaGFubmVsQ291bnQpIHwgaGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLLCBjaGFubmVsTWFzayk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpKTsKKyAgICB9CiB9CiAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotT2dnRXh0cmFjdG9yOjpPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK09nZ0V4dHJhY3Rvcjo6T2dnRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbUltcGwoTlVMTCkgewpAQCAtMTIyMCwxMyArMTMzNCwxNCBAQAogT2dnRXh0cmFjdG9yOjp+T2dnRXh0cmFjdG9yKCkgewogICAgIGRlbGV0ZSBtSW1wbDsKICAgICBtSW1wbCA9IE5VTEw7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOwogfQogCiBzaXplX3QgT2dnRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbUluaXRDaGVjayAhPSBPSyA/IDAgOiAxOwogfQogCi1NZWRpYVRyYWNrICpPZ2dFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqT2dnRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gMSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMjM0LDMzICsxMzQ5LDM0IEBACiAgICAgcmV0dXJuIG5ldyBPZ2dTb3VyY2UodGhpcyk7CiB9CiAKLXN0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAoaW5kZXggPj0gMSkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIHJldHVybiBtSW1wbC0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICByZXR1cm4gbUltcGwtPmdldEZpbGVNZXRhRGF0YShtZXRhKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIHZvaWQgKikgewotICAgIHJldHVybiBuZXcgT2dnRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgcmV0dXJuIHdyYXAobmV3IE9nZ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICB2b2lkICoqLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jICopIHsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOwogICAgIGNoYXIgdG1wWzRdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCB0bXAsIDQpIDwgNCB8fCBtZW1jbXAodG1wLCAiT2dnUyIsIDQpKSB7CisgICAgaWYgKGhlbHBlci5yZWFkQXQoMCwgdG1wLCA0KSA8IDQgfHwgbWVtY21wKHRtcCwgIk9nZ1MiLCA0KSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTEyNjksMTYgKzEzODUsMjMgQEAKICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJvZ2EiLAorICAgICJvZ2ciLAorICAgICJvcHVzIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI4Y2M1Y2QwNi1mNzcyLTQ5NWUtOGE2Mi1jYmE5NjQ5Mzc0ZTkiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiT2dnIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKaW5kZXggOWZlMjk0NC4uYzc1ZGZhOSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKQEAgLTE5LDI1ICsxOSwyNiBAQAogI2RlZmluZSBPR0dfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOwogY2xhc3MgU3RyaW5nODsKIAogc3RydWN0IE15T2dnRXh0cmFjdG9yOwogc3RydWN0IE9nZ1NvdXJjZTsKIAotc3RydWN0IE9nZ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgT2dnRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE9nZ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgT2dnRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiT2dnRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CkBAIC00Niw3ICs0Nyw3IEBACiBwcml2YXRlOgogICAgIGZyaWVuZCBzdHJ1Y3QgT2dnU291cmNlOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBNeU9nZ0V4dHJhY3RvciAqbUltcGw7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icAppbmRleCBkZDA0NWI5Li43ZTg5MjcxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKQEAgLTcsMTEgKzcsMTMgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliZmlmbyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKaW5kZXggZmU1MDliZi4uMDIwOTUxYiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwCkBAIC0yMCwyMSArMjAsMzIgQEAKIAogI2luY2x1ZGUgIldBVkV4dHJhY3Rvci5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPiAvLyBmb3IgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+IC8vIGZvciBBSURfTUVESUEKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogCiAjZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCiAKKy8vIE5PVEU6IFRoaXMgY29kZSBhc3N1bWVzIHRoZSBkZXZpY2UgcHJvY2Vzc29yIGlzIGxpdHRsZSBlbmRpYW4uCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWVkaWFTZXJ2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBmbG9hdCBleHRyYWN0b3Igb3V0cHV0LCBidXQgZ2VuZXJhbCBwcm9jZXNzZXMKKy8vIG1heSBub3QgYmUgYWJsZSB0byBkbyBzby4KKy8vIFRPRE86IEltcHJvdmUgQVBJIHRvIHNldCBleHRyYWN0b3IgZmxvYXQgb3V0cHV0LgorLy8gKE5vdGU6IGR1cGxpY2F0ZWQgd2l0aCBGTEFDRXh0cmFjdG9yLmNwcCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChpbnQgYml0c1BlclNhbXBsZSkKK3sKKyAgICByZXR1cm4gYml0c1BlclNhbXBsZSA+IDE2ICYmIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSA9PSBBSURfTUVESUE7Cit9CisKIGVudW0gewogICAgIFdBVkVfRk9STUFUX1BDTSAgICAgICAgPSAweDAwMDEsCiAgICAgV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCA9IDB4MDAwMywKQEAgLTU1LDIyICs2NiwyMiBAQAogICAgIHJldHVybiBwdHJbMV0gPDwgOCB8IHB0clswXTsKIH0KIAotc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBXQVZTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgV0FWU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCiAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIHN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfldBVlNvdXJjZSgpOwpAQCAtNzgsNjQgKzg5LDcyIEBACiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IG1OdW1DaGFubmVsczsKICAgICBpbnQzMl90IG1CaXRzUGVyU2FtcGxlOwogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBzaXplX3QgbVNpemU7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAgICAgb2ZmNjRfdCBtQ3VycmVudFBvczsKIAogICAgIFdBVlNvdXJjZShjb25zdCBXQVZTb3VyY2UgJik7CiAgICAgV0FWU291cmNlICZvcGVyYXRvcj0oY29uc3QgV0FWU291cmNlICYpOwogfTsKIAotV0FWRXh0cmFjdG9yOjpXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK1dBVkV4dHJhY3Rvcjo6V0FWRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtVmFsaWRGb3JtYXQoZmFsc2UpLAogICAgICAgbUNoYW5uZWxNYXNrKENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgeworICAgIG1UcmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgbUluaXRDaGVjayA9IGluaXQoKTsKIH0KIAogV0FWRXh0cmFjdG9yOjp+V0FWRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGEpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBXQVZFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKldBVkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpXQVZFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICByZXR1cm4gbmV3IFdBVlNvdXJjZSgKICAgICAgICAgICAgIG1EYXRhU291cmNlLCBtVHJhY2tNZXRhLAotICAgICAgICAgICAgbVdhdmVGb3JtYXQsIG1CaXRzUGVyU2FtcGxlLCBtRGF0YU9mZnNldCwgbURhdGFTaXplKTsKKyAgICAgICAgICAgIG1XYXZlRm9ybWF0LCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtQml0c1BlclNhbXBsZSksIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1UcmFja01ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1CaXRzUGVyU2FtcGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFdBVkV4dHJhY3Rvcjo6aW5pdCgpIHsKQEAgLTE4NSw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NVUxBVwogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NU0dTTQogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQ4X3QgZm10U2l6ZSA9IDE2OwpAQCAtMTk4LDEzICsyMTcsMTMgQEAKIAogICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzJdKTsKIAotICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gOCkgeworICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gRkNDXzgpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzICglZCkiLCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRSkgewotICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gMikgeworICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gRkNDXzIpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk1vcmUgdGhhbiAyIGNoYW5uZWxzICglZCkgaW4gbm9uLVdBVkVfRVhULCB1bmtub3duIGNoYW5uZWwgbWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMjQsNyArMjQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkQml0c1BlclNhbXBsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgidmFsaWRCaXRzKCVkKSAhPSBiaXRzUGVyU2FtcGxlKCVkKSBhcmUgbm90IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkQml0c1BlclNhbXBsZSwgbUJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCB2YWxpdEJpdHNQZXJTYW1wbGUgPT0gYml0c1BlclNhbXBsZSBidXQgc29tZSBXQVZfRVhUCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXJzIGRvbid0IGNvcnJlY3RseSBzZXQgdGhlIHZhbGlkIGJpdHMgdmFsdWUsIGFuZCBsZWF2ZSBpdCBhdCAwLgpAQCAtMjg0LDM1ICszMDMsMzMgQEAKICAgICAgICAgICAgICAgICBtRGF0YU9mZnNldCA9IG9mZnNldDsKICAgICAgICAgICAgICAgICBtRGF0YVNpemUgPSBjaHVua1NpemU7CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1UcmFja01ldGEpOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChtV2F2ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX1BDTToKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0FMQVc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfTVNHU006Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVdhdmVGb3JtYXQsICh1aW50MTZfdClXQVZFX0ZPUk1BVF9NVUxBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBtQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBtQml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwotCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssIG1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIG1CaXRzUGVyU2FtcGxlKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOwogICAgICAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewogICAgICAgICAgICAgICAgICAgICAvLyA2NSBieXRlcyBkZWNvZGUgdG8gMzIwIDhrSHogc2FtcGxlcwpAQCAtMzIyLDE4ICszMzksMTggQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGUgPj4gMzsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIWJ5dGVzUGVyU2FtcGxlIHx8ICFtTnVtQ2hhbm5lbHMpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9zYW1wbGVzID0gbURhdGFTaXplIC8gKG1OdW1DaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1TYW1wbGVSYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMExMICogbnVtX3NhbXBsZXMgLyBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQpAQCAtMzQ4LDI1ICszNjUsMjEgQEAKIGNvbnN0IHNpemVfdCBXQVZTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAzMjc2ODsKIAogV0FWU291cmNlOjpXQVZTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAorICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1NZXRhKG1ldGEpLAogICAgICAgbVdhdmVGb3JtYXQod2F2ZUZvcm1hdCksCi0gICAgICBtU2FtcGxlUmF0ZSgwKSwKLSAgICAgIG1OdW1DaGFubmVscygwKSwKLSAgICAgIG1CaXRzUGVyU2FtcGxlKGJpdHNQZXJTYW1wbGUpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKICAgICAgIG1PZmZzZXQob2Zmc2V0KSwKICAgICAgIG1TaXplKHNpemUpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpIHsKLSAgICBDSEVDSyhtTWV0YS5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKG1NZXRhLmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbU51bUNoYW5uZWxzKSk7Ci0KLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBrTWF4RnJhbWVTaXplKTsKKyAgICAgIG1TdGFydGVkKGZhbHNlKSB7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmbVNhbXBsZVJhdGUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm1OdW1DaGFubmVscykpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsICZtQml0c1BlclNhbXBsZSkpOwogfQogCiBXQVZTb3VyY2U6On5XQVZTb3VyY2UoKSB7CkBAIC0zNzUsNTIgKzM4OCw1MSBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6c3RhcnQiKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKICAgICAvLyBzb21lIFdBViBmaWxlcyBtYXkgaGF2ZSBsYXJnZSBhdWRpbyBidWZmZXJzIHRoYXQgdXNlIHNoYXJlZCBtZW1vcnkgdHJhbnNmZXIuCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoNCAvKiBidWZmZXJzICovLCBrTWF4RnJhbWVTaXplKTsKLQotICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSA4KSB7Ci0gICAgICAgIC8vIEFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgOC0+MTYgYml0IGNvbnZlcnNpb24uCi0gICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgaWYgKCFtQnVmZmVyR3JvdXAtPmluaXQoNCAvKiBidWZmZXJzICovLCBrTWF4RnJhbWVTaXplKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgbUN1cnJlbnRQb3MgPSBtT2Zmc2V0OwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6c3RvcCgpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpzdG9wIik7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6Z2V0Rm9ybWF0Iik7CiAKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBrTWF4RnJhbWVTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIG1PdXRwdXRGbG9hdCA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKLSAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUJ1ZmZlckdyb3VwLT5oYXNfYnVmZmVycygpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfQogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtNDQyLDE4ICs0NTQsMjIgQEAKICAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3MgKyBtT2Zmc2V0OwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICAvLyBtYWtlIHN1cmUgdGhhdCBtYXhCeXRlc1RvUmVhZCBpcyBtdWx0aXBsZSBvZiAzLCBpbiAyNC1iaXQgY2FzZQotICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9Ci0gICAgICAgIG1CaXRzUGVyU2FtcGxlID09IDggPyBrTWF4RnJhbWVTaXplIC8gMiA6IAotICAgICAgICAobUJpdHNQZXJTYW1wbGUgPT0gMjQgPyAzKihrTWF4RnJhbWVTaXplLzMpOiBrTWF4RnJhbWVTaXplKTsKKyAgICAvLyBtYXhCeXRlc1RvUmVhZCBtYXkgYmUgcmVkdWNlZCBzbyB0aGF0IGluLXBsYWNlIGRhdGEgY29udmVyc2lvbiB3aWxsIGZpdCBpbiBidWZmZXIgc2l6ZS4KKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZDsKKyAgICBpZiAobU91dHB1dEZsb2F0KSB7IC8vIGRlc3RpbmF0aW9uIGlzIGZsb2F0IGF0IDQgYnl0ZXMgcGVyIHNhbXBsZSwgc291cmNlIG1heSBiZSBsZXNzLgorICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IChtQml0c1BlclNhbXBsZSAvIDgpICogKGJ1ZmZlclNpemUgLyA0KTsKKyAgICB9IGVsc2UgeyAvLyBkZXN0aW5hdGlvbiBpcyBpbnQxNl90IGF0IDIgYnl0ZXMgcGVyIHNhbXBsZSwgb25seSBzb3VyY2Ugb2YgOCBiaXRzIGlzIGxlc3MuCisgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gbUJpdHNQZXJTYW1wbGUgPT0gOCA/IGJ1ZmZlclNpemUgLyAyIDogYnVmZmVyU2l6ZTsKKyAgICB9CiAKLSAgICBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQorICAgIGNvbnN0IHNpemVfdCBtYXhCeXRlc0F2YWlsYWJsZSA9CiAgICAgICAgIChtQ3VycmVudFBvcyAtIG1PZmZzZXQgPj0gKG9mZjY0X3QpbVNpemUpCiAgICAgICAgICAgICA/IDAgOiBtU2l6ZSAtIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpOwogCkBAIC00ODIsNDUgKzQ5OCw2NCBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOwogCiAgICAgLy8gVE9ETzogYWRkIGNhcGFiaWxpdHkgdG8gcmV0dXJuIGRhdGEgYXMgZmxvYXQgUENNIGluc3RlYWQgb2YgMTYgYml0IFBDTS4KICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfUENNKSB7Ci0gICAgICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSA4KSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDgtYml0IHVuc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZC4KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBidWZmZXIgd2l0aCAyIGJ5dGUgd2lkZSBzYW1wbGVzCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKnRtcDsKLSAgICAgICAgICAgIENIRUNLX0VRKG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCAyICogbik7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV91OCgoaW50MTZfdCAqKXRtcC0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBuKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgYnVmZmVyID0gdG1wOwotICAgICAgICB9IGVsc2UgaWYgKG1CaXRzUGVyU2FtcGxlID09IDI0KSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDI0LWJpdCBzaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkIGluIHBsYWNlCi0gICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAzOwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fcDI0KChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOwotICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOwotICAgICAgICB9ICBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAzMikgewotICAgICAgICAgICAgLy8gQ29udmVydCAzMi1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2kzMigoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgaWYgKG1PdXRwdXRGbG9hdCkgeworICAgICAgICAgICAgZmxvYXQgKmZkZXN0ID0gKGZsb2F0ICopYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBzd2l0Y2ggKG1CaXRzUGVyU2FtcGxlKSB7CisgICAgICAgICAgICBjYXNlIDg6IHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCA0ICogbik7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fdTgoZmRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG4pOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAyOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDQgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmRlc3QsIChjb25zdCBpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAzOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDQgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9wMjQoZmRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6IHsgLy8gYnVmZmVyIHJhbmdlIGlzIGNvcnJlY3QKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyA0OworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kzMihmZGVzdCwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50MTZfdCAqaWRlc3QgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc3dpdGNoIChtQml0c1BlclNhbXBsZSkgeworICAgICAgICAgICAgY2FzZSA4OiB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG4pOworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV91OChpZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICBicmVhazsgLy8gbm8gdHJhbnNsYXRpb24gbmVlZGVkCisgICAgICAgICAgICBjYXNlIDI0OiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNChpZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjogeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoaWRlc3QsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCkgewotICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IGZsb2F0IHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQorICAgICAgICBpZiAoIW1PdXRwdXRGbG9hdCkgeyAvLyBtQml0c1BlclNhbXBsZSA9PSAzMgorICAgICAgICAgICAgaW50MTZfdCAqaWRlc3QgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCBmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChpZGVzdCwgKGNvbnN0IGZsb2F0ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOwogICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOwogICAgICAgICB9CisgICAgICAgIC8vIE5vdGU6IGlmIG91dHB1dCBlbmNvZGluZyBpcyBmbG9hdCwgbm8gbmVlZCB0byBjb252ZXJ0IGlmIHNvdXJjZSBpcyBmbG9hdC4KICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVTdGFtcFVzID0gMDsKQEAgLTUzMywzOSArNTY4LDQzIEBACiAgICAgICAgICAgICAgICAgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpIC8gbVNhbXBsZVJhdGU7CiAgICAgfQogCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVN0YW1wVXMpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVN0YW1wVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwogICAgIG1DdXJyZW50UG9zICs9IG47CiAKICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworICAgIHJldHVybiB3cmFwKG5ldyBXQVZFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7CisgICAgICAgIEZyZWVNZXRhRnVuYyAqKSB7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqaGVscGVyID0gbmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKTsKICAgICBjaGFyIGhlYWRlclsxMl07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICBpZiAoaGVscGVyLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICBkZWxldGUgaGVscGVyOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBpZiAobWVtY21wKGhlYWRlciwgIlJJRkYiLCA0KSB8fCBtZW1jbXAoJmhlYWRlcls4XSwgIldBVkUiLCA0KSkgeworICAgICAgICBkZWxldGUgaGVscGVyOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworICAgIFdBVkV4dHJhY3RvciAqZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3RvcihoZWxwZXIpOyAvLyBleHRyYWN0b3Igb3ducyB0aGUgaGVscGVyCiAgICAgaW50IG51bVRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBkZWxldGUgZXh0cmFjdG9yOwogICAgIGlmIChudW1UcmFja3MgPT0gMCkgewpAQCAtNTc3LDE2ICs2MTYsMjEgQEAKICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJ3YXYiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJXQVYgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaAppbmRleCA0NjdkMGI3Li5iNTE0MTk2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaApAQCAtMTksMzAgKzE5LDMxIEBACiAjZGVmaW5lIFdBVl9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CiBjbGFzcyBTdHJpbmc4OwogCi1jbGFzcyBXQVZFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgV0FWRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgV0FWRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiV0FWRXh0cmFjdG9yIjsgfQogCiAgICAgdmlydHVhbCB+V0FWRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtVmFsaWRGb3JtYXQ7CiAgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CkBAIC01Miw3ICs1Myw3IEBACiAgICAgdWludDE2X3QgbUJpdHNQZXJTYW1wbGU7CiAgICAgb2ZmNjRfdCBtRGF0YU9mZnNldDsKICAgICBzaXplX3QgbURhdGFTaXplOwotICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YTsKIAogICAgIHN0YXR1c190IGluaXQoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaAppbmRleCBkZThmMTIwLi44ODE5Zjg3IDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaApAQCAtNDksNiArNDksNyBAQAogICAgICAgICAgICAgQ0ZBX1JHR0IsCiAgICAgICAgICAgICBDRkFfQkdHUiwKICAgICAgICAgICAgIENGQV9HQlJHLAorICAgICAgICAgICAgQ0ZBX05PTkUsCiAgICAgICAgIH07CiAKICAgICAgICAgT3Bjb2RlTGlzdEJ1aWxkZXIoKTsKQEAgLTg5LDcgKzkwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOwogCi0KICAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZCBhIEdhaW5NYXAgb3Bjb2RlIHdpdGggdGhlIGdpdmVuIGZpZWxkcy4gIFRoZSBtYXBHYWlucyBhcnJheQogICAgICAgICAgKiBtdXN0IGhhdmUgbWFwUG9pbnRzViAqIG1hcFBvaW50c0ggKiBtYXBQbGFuZXMgZWxlbWVudHMuCkBAIC0xOTcsNiArMTk3LDMzIEBACiAKICAgICAgICAgc3RhdHVzX3QgYWRkT3Bjb2RlUHJlYW1ibGUodWludDMyX3Qgb3Bjb2RlSWQpOwogCisgICAgcHJpdmF0ZToKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBCYXllciBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuCisgICAgICAgICAqIENGQSBsYXlvdXQgbXVzdCBtYXRjaCB0aGUgbGF5b3V0IG9mIHRoZSBzaGFkaW5nIG1hcCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICogbGVuc1NoYWRpbmdNYXAgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IGFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIEJheWVyIEdhaW5NYXAgb3Bjb2RlKHMpIGZvciB0aGUgZ2l2ZW4gbWV0YWRhdGEgcGFyYW1ldGVycy4KKyAgICAgICAgICogQ0ZBIGxheW91dCBtdXN0IG1hdGNoIHRoZSBsYXlvdXQgb2YgdGhlIHNoYWRpbmcgbWFwIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgKiBsZW5zU2hhZGluZ01hcCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgYWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKIH07CiAKIH0gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKaW5kZXggOWFjN2UyYS4uOTMwNGY1MyAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKQEAgLTYwLDM0ICs2MCwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCA9IGFjdGl2ZUFyZWFSaWdodCAtIGFjdGl2ZUFyZWFMZWZ0OwogICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQgPSBhY3RpdmVBcmVhQm90dG9tIC0gYWN0aXZlQXJlYVRvcDsKLSAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7Ci0gICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CiAKLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqcmVkTWFwID0gcmVkTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbkV2ZW5NYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpncmVlbkV2ZW5NYXAgPSBncmVlbkV2ZW5NYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuT2RkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqZ3JlZW5PZGRNYXAgPSBncmVlbk9kZE1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gYmx1ZU1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKmJsdWVNYXAgPSBibHVlTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OwotCi0gICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cwotICAgIHNpemVfdCBqID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7Ci0gICAgICAgIHJlZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fUl9JTkRdOwotICAgICAgICBncmVlbkV2ZW5NYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dFX0lORF07Ci0gICAgICAgIGdyZWVuT2RkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HT19JTkRdOwotICAgICAgICBibHVlTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9CX0lORF07CisgICAgc3dpdGNoIChjZmEpIHsKKyAgICAgICAgY2FzZSBDRkFfUkdHQjoKKyAgICAgICAgY2FzZSBDRkFfR1JCRzoKKyAgICAgICAgY2FzZSBDRkFfR0JSRzoKKyAgICAgICAgY2FzZSBDRkFfQkdHUjoKKyAgICAgICAgICAgIGVyciA9IGFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YShsc21XaWR0aCwgbHNtSGVpZ2h0LCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUFyZWFIZWlnaHQsIGNmYSwgbGVuc1NoYWRpbmdNYXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZBX05PTkU6CisgICAgICAgICAgICBlcnIgPSBhZGRNb25vY2hyb21lR2Fpbk1hcHNGb3JNZXRhZGF0YShsc21XaWR0aCwgbHNtSGVpZ2h0LCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUFyZWFIZWlnaHQsIGxlbnNTaGFkaW5nTWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIENGQSBsYXlvdXQgJWQiLCBfX0ZVTkNUSU9OX18sIGNmYSk7CisgICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBicmVhazsKICAgICB9CisgICAgcmV0dXJuIGVycjsKK30KIAorc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CiAgICAgdWludDMyX3QgcmVkVG9wID0gMDsKICAgICB1aW50MzJfdCByZWRMZWZ0ID0gMDsKICAgICB1aW50MzJfdCBncmVlbkV2ZW5Ub3AgPSAwOwpAQCAtMTQzLDYgKzE0NSwzMiBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqcmVkTWFwID0gcmVkTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbkV2ZW5NYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpncmVlbkV2ZW5NYXAgPSBncmVlbkV2ZW5NYXBWZWN0b3IuZGF0YSgpOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuT2RkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqZ3JlZW5PZGRNYXAgPSBncmVlbk9kZE1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gYmx1ZU1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKmJsdWVNYXAgPSBibHVlTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKKyAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKKworICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OworCisgICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7CisgICAgICAgIHJlZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fUl9JTkRdOworICAgICAgICBncmVlbkV2ZW5NYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dFX0lORF07CisgICAgICAgIGdyZWVuT2RkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HT19JTkRdOworICAgICAgICBibHVlTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9CX0lORF07CisgICAgfQorCiAgICAgc3RhdHVzX3QgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovcmVkVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9yZWRMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLApAQCAtMjE2LDYgKzI0NCw0NiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRNb25vY2hyb21lR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqbWFwID0gbWFwVmVjdG9yLmRhdGEoKTsKKworICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKKyAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKKworICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OworCisgICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7CisgICAgICAgIG1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2ldOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29sUGl0Y2gqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c1YqL2xzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzSCovbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdWKi9zcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ0gqL3NwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5WKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5IKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcEdhaW5zKi9tYXApOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkR2Fpbk1hcCh1aW50MzJfdCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYm90dG9tLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiOTgxYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi0jIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9pbnB1dF9tb25pdG9yLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gaW5wdXRfbW9uaXRvcgotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9pbnB1dF9tb25pdG9yX2NhbGxiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gaW5wdXRfbW9uaXRvcl9jYWxsYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmFhdWRpb19wcmVidWlsdAotTE9DQUxfU1JDX0ZJTEVTIDo9IGxpYmFhdWRpby5zbwotTE9DQUxfRVhQT1JUX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1pbmNsdWRlICQoUFJFQlVJTFRfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDQ3NWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIFRPRE8gcmVtb3ZlIHRoZW4gd2hlbiB3ZSBzdXBwb3J0IG90aGVyIGFyY2hpdGVjdHVyZXMKLUFQUF9BQkkgOj0gYXJtNjQtdjhhCi1BUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJlODc3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvbG9vcGJhY2suY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJzbmRmaWxlCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJhdWRpb3V0aWxzCi1MT0NBTF9NT0RVTEUgOj0gYWF1ZGlvX2xvb3BiYWNrCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ0ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQXBwbGljYXRpb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1BUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaAppbmRleCA5NzExYjg2Li44ZWI3MGIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaApAQCAtMzEwLDcgKzMxMCw3IEBACiAgICAgfQogCiAgICAgLy8gV3JpdGUgU0hPUlQgZGF0YSBmcm9tIHRoZSBmaXJzdCBjaGFubmVsLgotICAgIGludCB3cml0ZShpbnQxNl90ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwgaW50IG51bUZyYW1lcykgeworICAgIGludDMyX3Qgd3JpdGUoaW50MTZfdCAqaW5wdXREYXRhLCBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50LCBpbnQzMl90IG51bUZyYW1lcykgewogICAgICAgICAvLyBzdG9wIGF0IGVuZCBvZiBidWZmZXIKICAgICAgICAgaWYgKChtRnJhbWVDb3VudGVyICsgbnVtRnJhbWVzKSA+IG1NYXhGcmFtZXMpIHsKICAgICAgICAgICAgIG51bUZyYW1lcyA9IG1NYXhGcmFtZXMgLSBtRnJhbWVDb3VudGVyOwpAQCAtMzIyLDcgKzMyMiw3IEBACiAgICAgfQogCiAgICAgLy8gV3JpdGUgRkxPQVQgZGF0YSBmcm9tIHRoZSBmaXJzdCBjaGFubmVsLgotICAgIGludCB3cml0ZShmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsIGludCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IHdyaXRlKGZsb2F0ICppbnB1dERhdGEsIGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIC8vIHN0b3AgYXQgZW5kIG9mIGJ1ZmZlcgogICAgICAgICBpZiAoKG1GcmFtZUNvdW50ZXIgKyBudW1GcmFtZXMpID4gbU1heEZyYW1lcykgewogICAgICAgICAgICAgbnVtRnJhbWVzID0gbU1heEZyYW1lcyAtIG1GcmFtZUNvdW50ZXI7CkBAIC0zMzMsNyArMzMzLDcgQEAKICAgICAgICAgcmV0dXJuIG51bUZyYW1lczsKICAgICB9CiAKLSAgICBpbnQgc2l6ZSgpIHsKKyAgICBpbnQzMl90IHNpemUoKSB7CiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudGVyOwogICAgIH0KIApAQCAtNDQzLDkgKzQ0MywxNCBAQAogICAgIHZpcnR1YWwgfkxvb3BiYWNrUHJvY2Vzc29yKCkgPSBkZWZhdWx0OwogCiAKKyAgICBlbnVtIHByb2Nlc3NfcmVzdWx0IHsKKyAgICAgICAgUFJPQ0VTU19SRVNVTFRfT0ssCisgICAgICAgIFBST0NFU1NfUkVTVUxUX0dMSVRDSAorICAgIH07CisKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAorICAgIHZpcnR1YWwgcHJvY2Vzc19yZXN1bHQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzKSA9IDA7CiAKQEAgLTYzOSw3ICs2NDQsNyBAQAogICAgICAgICByZXR1cm4gZ2V0U2FtcGxlUmF0ZSgpIC8gODsKICAgICB9CiAKLSAgICB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAorICAgIHByb2Nlc3NfcmVzdWx0IHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcykgb3ZlcnJpZGUgewogICAgICAgICBpbnQgY2hhbm5lbHNWYWxpZCA9IHN0ZDo6bWluKGlucHV0Q2hhbm5lbENvdW50LCBvdXRwdXRDaGFubmVsQ291bnQpOwpAQCAtNzUwLDYgKzc1NSw3IEBACiAKICAgICAgICAgbVN0YXRlID0gbmV4dFN0YXRlOwogICAgICAgICBtTG9vcENvdW50ZXIrKzsKKyAgICAgICAgcmV0dXJuIFBST0NFU1NfUkVTVUxUX09LOwogICAgIH0KIAogICAgIGludCBzYXZlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSBvdmVycmlkZSB7CkBAIC04OTYsOSArOTAyLDEwIEBACiAgICAgICogQHBhcmFtIGlucHV0RGF0YSBjb250YWlucyBtaWNyb3Bob25lIGRhdGEgd2l0aCBzaW5lIHNpZ25hbCBmZWVkYmFjawogICAgICAqIEBwYXJhbSBvdXRwdXREYXRhIGNvbnRhaW5zIHRoZSByZWZlcmVuY2Ugc2luZSB3YXZlCiAgICAgICovCi0gICAgdm9pZCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKKyAgICBwcm9jZXNzX3Jlc3VsdCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dHB1dERhdGEsIGludCBvdXRwdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGludCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgcHJvY2Vzc19yZXN1bHQgcmVzdWx0ID0gUFJPQ0VTU19SRVNVTFRfT0s7CiAgICAgICAgIG1Qcm9jZXNzQ291bnQrKzsKIAogICAgICAgICBmbG9hdCBwZWFrID0gbWVhc3VyZVBlYWtBbXBsaXR1ZGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKQEAgLTk3OCw2ICs5ODUsNyBAQAogICAgICAgICAgICAgICAgICAgICBtTWF4R2xpdGNoRGVsdGEgPSBzdGQ6Om1heChtTWF4R2xpdGNoRGVsdGEsIGFic0RpZmYpOwogICAgICAgICAgICAgICAgICAgICBpZiAoYWJzRGlmZiA+IG1Ub2xlcmFuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1HbGl0Y2hDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUFJPQ0VTU19SRVNVTFRfR0xJVENIOwogICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIiU1ZDogR290IGEgZ2xpdGNoICMgJWQsIHByZWRpY3RlZCA9ICVmLCBhY3R1YWwgPSAlZlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG1GcmFtZUNvdW50ZXIsIG1HbGl0Y2hDb3VudCwgcHJlZGljdGVkLCBzYW1wbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU1NVU5FOwpAQCAtMTAxOCw2ICsxMDI2LDcgQEAKIAogICAgICAgICAgICAgbUZyYW1lQ291bnRlcisrOwogICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgdm9pZCByZXNldEFjY3VtdWxhdG9yKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAppbmRleCAyYTAyYjIwLi5jN2M0MmViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcApAQCAtMzQsOSArMzQsMTMgQEAKICNpbmNsdWRlICJBQXVkaW9TaW1wbGVSZWNvcmRlci5oIgogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogI2luY2x1ZGUgIkxvb3BiYWNrQW5hbHl6ZXIuaCIKKyNpbmNsdWRlICIuLi8uLi91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCIKIAotLy8gVjAuNC4wMCA9IHJlY3RpZnkgYW5kIGxvdy1wYXNzIGZpbHRlciB0aGUgZWNob3MsIHVzZSBhdXRvLWNvcnJlbGF0aW9uIG9uIGVudGlyZSBlY2hvCi0jZGVmaW5lIEFQUF9WRVJTSU9OICAgICAgICAgICAgICIwLjQuMDAiCisvLyBWMC40LjAwID0gcmVjdGlmeSBhbmQgbG93LXBhc3MgZmlsdGVyIHRoZSBlY2hvcywgYXV0by1jb3JyZWxhdGUgZW50aXJlIGVjaG8KKy8vIFYwLjQuMDEgPSBhZGQgLWggaGFuZyBvcHRpb24KKy8vICAgICAgICAgICBmaXggLW4gb3B0aW9uIHRvIHNldCBvdXRwdXQgYnVmZmVyIGZvciAtdG0KKy8vICAgICAgICAgICBwbG90IGZpcnN0IGdsaXRjaAorI2RlZmluZSBBUFBfVkVSU0lPTiAgICAgICAgICAgICAiMC40LjAxIgogCiAvLyBUYWcgZm9yIG1hY2hpbmUgcmVhZGFibGUgcmVzdWx0cyBhcyBwcm9wZXJ0eSA9IHZhbHVlIHBhaXJzCiAjZGVmaW5lIFJFU1VMVF9UQUcgICAgICAgICAgICAgICJSRVNVTFQ6ICIKQEAgLTQ3LDEwICs1MSwxNCBAQAogY29uc3RleHByIGludCBrTG9nUGVyaW9kTWlsbGlzICAgICAgID0gMTAwMDsKIGNvbnN0ZXhwciBpbnQga051bUlucHV0Q2hhbm5lbHMgICAgICA9IDE7CiBjb25zdGV4cHIgaW50IGtOdW1DYWxsYmFja3NUb0RyYWluICAgPSAyMDsKK2NvbnN0ZXhwciBpbnQga051bUNhbGxiYWNrc1RvTm90UmVhZCA9IDA7IC8vIGxldCBpbnB1dCBmaWxsIGJhY2sgdXAKIGNvbnN0ZXhwciBpbnQga051bUNhbGxiYWNrc1RvRGlzY2FyZCA9IDIwOworY29uc3RleHByIGludCBrRGVmYXVsdEhhbmdUaW1lTWlsbGlzID0gNTA7Citjb25zdGV4cHIgaW50IGtNYXhHbGl0Y2hFdmVudHNUb1NhdmUgPSAzMjsKIAogc3RydWN0IExvb3BiYWNrRGF0YSB7CiAgICAgQUF1ZGlvU3RyZWFtICAgICAgKmlucHV0U3RyZWFtID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gICAgICAqb3V0cHV0U3RyZWFtID0gbnVsbHB0cjsKICAgICBpbnQzMl90ICAgICAgICAgICAgaW5wdXRGcmFtZXNNYXhpbXVtID0gMDsKICAgICBpbnQxNl90ICAgICAgICAgICAqaW5wdXRTaG9ydERhdGEgPSBudWxscHRyOwogICAgIGZsb2F0ICAgICAgICAgICAgICppbnB1dEZsb2F0RGF0YSA9IG51bGxwdHI7CkBAIC01OCw2ICs2Niw3IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgIGFjdHVhbElucHV0Q2hhbm5lbENvdW50ID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgYWN0dWFsT3V0cHV0Q2hhbm5lbENvdW50ID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbnVtQ2FsbGJhY2tzVG9EcmFpbiA9IGtOdW1DYWxsYmFja3NUb0RyYWluOworICAgIGludDMyX3QgICAgICAgICAgICBudW1DYWxsYmFja3NUb05vdFJlYWQgPSBrTnVtQ2FsbGJhY2tzVG9Ob3RSZWFkOwogICAgIGludDMyX3QgICAgICAgICAgICBudW1DYWxsYmFja3NUb0Rpc2NhcmQgPSBrTnVtQ2FsbGJhY2tzVG9EaXNjYXJkOwogICAgIGludDMyX3QgICAgICAgICAgICBtaW5OdW1GcmFtZXMgPSBJTlQzMl9NQVg7CiAgICAgaW50MzJfdCAgICAgICAgICAgIG1heE51bUZyYW1lcyA9IDA7CkBAIC02NSw2ICs3NCw5IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgIGluc3VmZmljaWVudFJlYWRGcmFtZXMgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBmcmFtZXNSZWFkVG90YWwgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBmcmFtZXNXcml0dGVuVG90YWwgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICBoYW5nUGVyaW9kTWlsbGlzID0gNSAqIDEwMDA7IC8vIHRpbWUgYmV0d2VlbiBoYW5ncworICAgIGludDMyX3QgICAgICAgICAgICBoYW5nQ291bnRkb3duRnJhbWVzID0gNSAqIDQ4MDAwOyAvLyBmcmFtZXMgdGlsIG5leHQgaGFuZworICAgIGludDMyX3QgICAgICAgICAgICBoYW5nVGltZU1pbGxpcyA9IDA7IC8vIDAgZm9yIG5vIGhhbmcKICAgICBib29sICAgICAgICAgICAgICAgaXNEb25lID0gZmFsc2U7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgaW5wdXRFcnJvciA9IEFBVURJT19PSzsKQEAgLTc0LDYgKzg2LDI5IEBACiAgICAgRWNob0FuYWx5emVyICAgICAgIGVjaG9BbmFseXplcjsKICAgICBBdWRpb1JlY29yZGluZyAgICAgYXVkaW9SZWNvcmRpbmc7CiAgICAgTG9vcGJhY2tQcm9jZXNzb3IgKmxvb3BiYWNrUHJvY2Vzc29yOworCisgICAgaW50MzJfdCAgICAgICAgICAgIGdsaXRjaEZyYW1lc1trTWF4R2xpdGNoRXZlbnRzVG9TYXZlXTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgbnVtR2xpdGNoRXZlbnRzID0gMDsKKworICAgIHZvaWQgaGFuZ0lmUmVxdWVzdGVkKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIGlmIChoYW5nVGltZU1pbGxpcyA+IDApIHsKKyAgICAgICAgICAgIGhhbmdDb3VudGRvd25GcmFtZXMgLT0gbnVtRnJhbWVzOworICAgICAgICAgICAgaWYgKGhhbmdDb3VudGRvd25GcmFtZXMgPD0gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3Qgc3RhcnROYW5vcyA9IGdldE5hbm9zZWNvbmRzKCk7CisgICAgICAgICAgICAgICAgdXNsZWVwKGhhbmdUaW1lTWlsbGlzICogMTAwMCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBlbmROYW5vcyA9IGdldE5hbm9zZWNvbmRzKCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBlbGFwc2VkTWljcm9zID0gKGludDMyX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAoKGVuZE5hbm9zIC0gc3RhcnROYW5vcykgLyAxMDAwKTsKKyAgICAgICAgICAgICAgICBwcmludGYoImNhbGxiYWNrIGhhbmdpbmcgZm9yICVkIG1pbGxpcywgYWN0dWFsID0gJWQgbWljcm9zXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBoYW5nVGltZU1pbGxpcywgZWxhcHNlZE1pY3Jvcyk7CisgICAgICAgICAgICAgICAgaGFuZ0NvdW50ZG93bkZyYW1lcyA9IChpbnQ2NF90KSBoYW5nUGVyaW9kTWlsbGlzCisgICAgICAgICAgICAgICAgICAgICAgICAqIEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKG91dHB1dFN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gMTAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICB9CiB9OwogCiBzdGF0aWMgdm9pZCBjb252ZXJ0UGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKQEAgLTEwNSw5ICsxNDAsMTQgQEAKICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgICB9CiAgICAgaWYgKGZyYW1lc1JlYWQgPCAwKSB7Ci0gICAgICAgIG15RGF0YS0+aW5wdXRFcnJvciA9IGZyYW1lc1JlYWQ7Ci0gICAgICAgIHByaW50ZigiRVJST1IgaW4gcmVhZCA9ICVkID0gJXNcbiIsIGZyYW1lc1JlYWQsCi0gICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChmcmFtZXNSZWFkKSk7CisgICAgICAgIC8vIEV4cGVjdCBJTlZBTElEX1NUQVRFIGlmIFNUQVRFX1NUQVJUSU5HCisgICAgICAgIGlmIChteURhdGEtPmZyYW1lc1JlYWRUb3RhbCA+IDApIHsKKyAgICAgICAgICAgIG15RGF0YS0+aW5wdXRFcnJvciA9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIGluIHJlYWQgPSAlZCA9ICVzXG4iLCBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KGZyYW1lc1JlYWQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lc1JlYWQgPSAwOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbXlEYXRhLT5mcmFtZXNSZWFkVG90YWwgKz0gZnJhbWVzUmVhZDsKICAgICB9CkBAIC0xNDksOCArMTg5LDEwIEBACiAgICAgICAgIGludDMyX3QgdG90YWxGcmFtZXNSZWFkID0gMDsKICAgICAgICAgZG8gewogICAgICAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCA9IHJlYWRGb3JtYXR0ZWREYXRhKG15RGF0YSwgbnVtRnJhbWVzKTsKLSAgICAgICAgICAgIGlmIChhY3R1YWxGcmFtZXNSZWFkKSB7CisgICAgICAgICAgICBpZiAoYWN0dWFsRnJhbWVzUmVhZCA+IDApIHsKICAgICAgICAgICAgICAgICB0b3RhbEZyYW1lc1JlYWQgKz0gYWN0dWFsRnJhbWVzUmVhZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsRnJhbWVzUmVhZCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGJlY2F1c2UgaW5wdXQgc3RyZWFtIG1heSBub3QgYmUgc3RhcnRlZCB5ZXQuCiAgICAgICAgIH0gd2hpbGUgKGFjdHVhbEZyYW1lc1JlYWQgPiAwKTsKQEAgLTE1OSw2ICsyMDEsOSBAQAogICAgICAgICAgICAgbXlEYXRhLT5udW1DYWxsYmFja3NUb0RyYWluLS07CiAgICAgICAgIH0KIAorICAgIH0gZWxzZSBpZiAobXlEYXRhLT5udW1DYWxsYmFja3NUb05vdFJlYWQgPiAwKSB7CisgICAgICAgIC8vIExldCB0aGUgaW5wdXQgZmlsbCB1cCBhIGJpdCBzbyB3ZSBhcmUgbm90IHNvIGNsb3NlIHRvIHRoZSB3cml0ZSBwb2ludGVyLgorICAgICAgICBteURhdGEtPm51bUNhbGxiYWNrc1RvTm90UmVhZC0tOwogICAgIH0gZWxzZSBpZiAobXlEYXRhLT5udW1DYWxsYmFja3NUb0Rpc2NhcmQgPiAwKSB7CiAgICAgICAgIC8vIElnbm9yZS4gQWxsb3cgdGhlIGlucHV0IHRvIGZpbGwgYmFjayB1cCB0byBlcXVpbGlicml1bSB3aXRoIHRoZSBvdXRwdXQuCiAgICAgICAgIGFjdHVhbEZyYW1lc1JlYWQgPSByZWFkRm9ybWF0dGVkRGF0YShteURhdGEsIG51bUZyYW1lcyk7CkBAIC0xNjgsNiArMjEzLDcgQEAKICAgICAgICAgbXlEYXRhLT5udW1DYWxsYmFja3NUb0Rpc2NhcmQtLTsKIAogICAgIH0gZWxzZSB7CisgICAgICAgIG15RGF0YS0+aGFuZ0lmUmVxdWVzdGVkKG51bUZyYW1lcyk7CiAKICAgICAgICAgaW50MzJfdCBudW1JbnB1dEJ5dGVzID0gbnVtRnJhbWVzICogbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCAqIHNpemVvZihmbG9hdCk7CiAgICAgICAgIG1lbXNldChteURhdGEtPmlucHV0RmxvYXREYXRhLCAwIC8qIHZhbHVlICovLCBudW1JbnB1dEJ5dGVzKTsKQEAgLTE4NCw3ICsyMzAsNyBAQAogCiAgICAgICAgICAgICBpZiAoYWN0dWFsRnJhbWVzUmVhZCA8IG51bUZyYW1lcykgewogICAgICAgICAgICAgICAgIGlmKGFjdHVhbEZyYW1lc1JlYWQgPCAoaW50MzJfdCkgZnJhbWVzQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW5zdWZmaWNpZW50IGJ1dCBudW1GcmFtZXMgPSAlZCIKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnN1ZmZpY2llbnQgZm9yIG5vIHJlYXNvbiwgbnVtRnJhbWVzID0gJWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGFjdHVhbEZyYW1lc1JlYWQgPSAlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgaW5wdXRGcmFtZXNXcml0dGVuID0gJWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGlucHV0RnJhbWVzUmVhZCA9ICVkIgpAQCAtMjA1LDE2ICsyNTEsMjUgQEAKICAgICAgICAgICAgIGlmIChteURhdGEtPmFjdHVhbElucHV0Rm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewogICAgICAgICAgICAgICAgIGNvbnZlcnRQY20xNlRvRmxvYXQobXlEYXRhLT5pbnB1dFNob3J0RGF0YSwgbXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwgbnVtU2FtcGxlcyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBTYXZlIGZvciBsYXRlci4KLSAgICAgICAgICAgIG15RGF0YS0+YXVkaW9SZWNvcmRpbmcud3JpdGUobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzKTsKKwogICAgICAgICAgICAgLy8gQW5hbHl6ZSB0aGUgZGF0YS4KLSAgICAgICAgICAgIG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPnByb2Nlc3MobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKKyAgICAgICAgICAgIExvb3BiYWNrUHJvY2Vzc29yOjpwcm9jZXNzX3Jlc3VsdCBwcm9jUmVzdWx0ID0gbXlEYXRhLT5sb29wYmFja1Byb2Nlc3Nvci0+cHJvY2VzcyhteURhdGEtPmlucHV0RmxvYXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbE91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzKTsKKworICAgICAgICAgICAgaWYgKHByb2NSZXN1bHQgPT0gTG9vcGJhY2tQcm9jZXNzb3I6OlBST0NFU1NfUkVTVUxUX0dMSVRDSCkgeworICAgICAgICAgICAgICAgIGlmIChteURhdGEtPm51bUdsaXRjaEV2ZW50cyA8IGtNYXhHbGl0Y2hFdmVudHNUb1NhdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5nbGl0Y2hGcmFtZXNbbXlEYXRhLT5udW1HbGl0Y2hFdmVudHMrK10gPSBteURhdGEtPmF1ZGlvUmVjb3JkaW5nLnNpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNhdmUgZm9yIGxhdGVyLgorICAgICAgICAgICAgbXlEYXRhLT5hdWRpb1JlY29yZGluZy53cml0ZShteURhdGEtPmlucHV0RmxvYXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxGcmFtZXNSZWFkKTsKKwogICAgICAgICAgICAgbXlEYXRhLT5pc0RvbmUgPSBteURhdGEtPmxvb3BiYWNrUHJvY2Vzc29yLT5pc0RvbmUoKTsKICAgICAgICAgICAgIGlmIChteURhdGEtPmlzRG9uZSkgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKQEAgLTI0MCw4ICsyOTUsMTAgQEAKICAgICBBQXVkaW9BcmdzUGFyc2VyOjp1c2FnZSgpOwogICAgIHByaW50ZigiICAgICAgLUJ7ZnJhbWVzfSAgICAgICAgaW5wdXQgY2FwYWNpdHkgaW4gZnJhbWVzXG4iKTsKICAgICBwcmludGYoIiAgICAgIC1De2NoYW5uZWxzfSAgICAgIG51bWJlciBvZiBpbnB1dCBjaGFubmVsc1xuIik7CisgICAgcHJpbnRmKCIgICAgICAtRHtkZXZpY2VJZH0gICAgICBpbnB1dCBkZXZpY2UgSURcbiIpOwogICAgIHByaW50ZigiICAgICAgLUZ7MCwxLDJ9ICAgICAgICAgaW5wdXQgZm9ybWF0LCAxPUkxNiwgMj1GTE9BVFxuIik7CiAgICAgcHJpbnRmKCIgICAgICAtZ3tnYWlufSAgICAgICAgICByZWNpcmN1bGF0aW5nIGxvb3BiYWNrIGdhaW5cbiIpOworICAgIHByaW50ZigiICAgICAgLWh7aGFuZ01pbGxpc30gICAgb2NjYXNpb25hbGx5IGhhbmcgaW4gdGhlIGNhbGxiYWNrXG4iKTsKICAgICBwcmludGYoIiAgICAgIC1Qe2luUGVyZn0gICAgICAgIHNldCBpbnB1dCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERSpcbiIpOwogICAgIHByaW50ZigiICAgICAgICAgIG4gZm9yIF9OT05FXG4iKTsKICAgICBwcmludGYoIiAgICAgICAgICBsIGZvciBfTEFURU5DWVxuIik7CkBAIC0zMDAsOSArMzU3LDcgQEAKICAgICByZXR1cm4gdGVzdE1vZGU7CiB9CiAKLXZvaWQgcHJpbnRBdWRpb0dyYXBoKEF1ZGlvUmVjb3JkaW5nICZyZWNvcmRpbmcsIGludCBudW1TYW1wbGVzKSB7Ci0gICAgaW50MzJfdCBzdGFydCA9IHJlY29yZGluZy5zaXplKCkgLyAyOwotICAgIGludDMyX3QgZW5kID0gc3RhcnQgKyBudW1TYW1wbGVzOwordm9pZCBwcmludEF1ZGlvR3JhcGhSZWdpb24oQXVkaW9SZWNvcmRpbmcgJnJlY29yZGluZywgaW50MzJfdCBzdGFydCwgaW50MzJfdCBlbmQpIHsKICAgICBpZiAoZW5kID49IHJlY29yZGluZy5zaXplKCkpIHsKICAgICAgICAgZW5kID0gcmVjb3JkaW5nLnNpemUoKSAtIDE7CiAgICAgfQpAQCAtMzM5LDEzICszOTQsMTQgQEAKICAgICBBQXVkaW9TdHJlYW0gICAgICAgICAqb3V0cHV0U3RyZWFtICAgICAgICAgICAgICAgPSBudWxscHRyOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgIHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXREZXZpY2VJZCAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHJlcXVlc3RlZElucHV0U2hhcmluZ01vZGUgID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0Q2hhbm5lbENvdW50ID0ga051bUlucHV0Q2hhbm5lbHM7CiAgICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgIHJlcXVlc3RlZElucHV0Rm9ybWF0ICAgICAgID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDYXBhY2l0eSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBpbnB1dFBlcmZvcm1hbmNlTGV2ZWwgID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k7CiAKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgb3V0cHV0RnJhbWVzUGVyQnVyc3QgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICAgICBvdXRwdXRGcmFtZXNQZXJCdXJzdCAgICAgICA9IDA7CiAKICAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgYWN0dWFsT3V0cHV0Rm9ybWF0ICAgICAgICAgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgIGFjdHVhbFNhbXBsZVJhdGUgICAgICAgICAgID0gMDsKQEAgLTM1Myw2ICs0MDksNyBAQAogCiAgICAgaW50ICAgICAgICAgICAgICAgICAgIHRlc3RNb2RlICAgICAgICAgICAgICAgICAgID0gVEVTVF9FQ0hPX0xBVEVOQ1k7CiAgICAgZG91YmxlICAgICAgICAgICAgICAgIGdhaW4gICAgICAgICAgICAgICAgICAgICAgID0gMS4wOworICAgIGludCAgICAgICAgICAgICAgICAgICBoYW5nVGltZU1pbGxpcyAgICAgICAgICAgICA9IDA7CiAKICAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KQEAgLTM3NiwxMiArNDMzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgogICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDaGFubmVsQ291bnQgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXREZXZpY2VJZCA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRic6CiAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dEZvcm1hdCA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgICAgICAgICAgICAgICBnYWluID0gYXRvZigmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhcyB0aGVyZSBhIG51bWJlciBhZnRlciB0aGUgIi1oIj8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdbMl0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5nVGltZU1pbGxpcyA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIG51bWJlciB0aGVuIHVzZSB0aGUgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5nVGltZU1pbGxpcyA9IGtEZWZhdWx0SGFuZ1RpbWVNaWxsaXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUCc6CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFBlcmZvcm1hbmNlTGV2ZWwgPSBwYXJzZVBlcmZvcm1hbmNlTW9kZShhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00MTUsNiArNDg0LDggQEAKICAgICBpbnQzMl90IHRpbWVNaWxsaXMgPSAwOwogICAgIGludDMyX3QgcmVjb3JkaW5nRHVyYXRpb24gPSBzdGQ6Om1pbig2MCAqIDUsIHJlcXVlc3RlZER1cmF0aW9uKTsKIAorICAgIGludDMyX3QgcmVxdWVzdGVkT3V0cHV0QnVyc3RzID0gYXJnUGFyc2VyLmdldE51bWJlck9mQnVyc3RzKCk7CisKICAgICBzd2l0Y2godGVzdE1vZGUpIHsKICAgICAgICAgY2FzZSBURVNUX1NJTkVfTUFHTklUVURFOgogICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yID0gJmxvb3BiYWNrRGF0YS5zaW5lQW5hbHl6ZXI7CkBAIC00NDYsNyArNTE3LDcgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICBwbGF5ZXIub3BlbigpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwogICAgICAgICBleGl0KDEpOwogICAgIH0KLSAgICBvdXRwdXRTdHJlYW0gPSBwbGF5ZXIuZ2V0U3RyZWFtKCk7CisgICAgb3V0cHV0U3RyZWFtID0gbG9vcGJhY2tEYXRhLm91dHB1dFN0cmVhbSA9IHBsYXllci5nZXRTdHJlYW0oKTsKIAogICAgIGFjdHVhbE91dHB1dEZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQob3V0cHV0U3RyZWFtKTsKICAgICBpZiAoYWN0dWFsT3V0cHV0Rm9ybWF0ICE9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CkBAIC00NjMsNiArNTM0LDcgQEAKIAogICAgIHByaW50ZigiSU5QVVQgIHN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICAvLyBVc2UgZGlmZmVyZW50IHBhcmFtZXRlcnMgZm9yIHRoZSBpbnB1dC4KKyAgICBhcmdQYXJzZXIuc2V0RGV2aWNlSWQocmVxdWVzdGVkSW5wdXREZXZpY2VJZCk7CiAgICAgYXJnUGFyc2VyLnNldE51bWJlck9mQnVyc3RzKEFBVURJT19VTlNQRUNJRklFRCk7CiAgICAgYXJnUGFyc2VyLnNldEZvcm1hdChyZXF1ZXN0ZWRJbnB1dEZvcm1hdCk7CiAgICAgYXJnUGFyc2VyLnNldFBlcmZvcm1hbmNlTW9kZShpbnB1dFBlcmZvcm1hbmNlTGV2ZWwpOwpAQCAtNDgyLDI0ICs1NTQsMjkgQEAKIAogICAgIHsKICAgICAgICAgaW50MzJfdCBhY3R1YWxDYXBhY2l0eSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGlucHV0U3RyZWFtKTsKLSAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhpbnB1dFN0cmVhbSwgYWN0dWFsQ2FwYWNpdHkpOwotICAgICAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7Ci0gICAgICAgICAgICBnb3RvIGZpbmlzaDsKLSAgICAgICAgfSBlbHNlIHt9Ci0gICAgfQorICAgICAgICAodm9pZCkgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhpbnB1dFN0cmVhbSwgYWN0dWFsQ2FwYWNpdHkpOwogCi0gICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKGlucHV0U3RyZWFtKTsKKyAgICAgICAgaWYgKHRlc3RNb2RlID09IFRFU1RfU0lORV9NQUdOSVRVREUKKyAgICAgICAgICAgICAgICAmJiByZXF1ZXN0ZWRPdXRwdXRCdXJzdHMgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKG91dHB1dFN0cmVhbSwgYWN0dWFsQ2FwYWNpdHkpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMob3V0cHV0KSByZXR1cm5lZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiT3V0cHV0IGJ1ZmZlciBzaXplIHNldCB0byBtYXRjaCBpbnB1dCBjYXBhY2l0eSA9ICVkIGZyYW1lcyFcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gaXMgdG9vIHNtYWxsIHRoZW4gd2UgY2Fubm90IHNhdGlzZnkgdGhlIG91dHB1dCBjYWxsYmFjay4KLSAgICB7Ci0gICAgICAgIGludDMyX3QgYWN0dWFsQ2FwYWNpdHkgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhpbnB1dFN0cmVhbSk7CisgICAgICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gaXMgdG9vIHNtYWxsIHRoZW4gd2UgY2Fubm90IHNhdGlzZnkgdGhlIG91dHB1dCBjYWxsYmFjay4KICAgICAgICAgaWYgKGFjdHVhbENhcGFjaXR5IDwgMiAqIG91dHB1dEZyYW1lc1BlckJ1cnN0KSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gaW5wdXQgY2FwYWNpdHkgPCAyICogb3V0cHV0RnJhbWVzUGVyQnVyc3RcbiIpOwogICAgICAgICAgICAgZ290byBmaW5pc2g7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0oaW5wdXRTdHJlYW0pOworCiAgICAgLy8gLS0tLS0tLSBTZXR1cCBsb29wYmFja0RhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBsb29wYmFja0RhdGEuYWN0dWFsSW5wdXRGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KGlucHV0U3RyZWFtKTsKIApAQCAtNTE4LDYgKzU5NSw4IEBACiAKICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnJlc2V0KCk7CiAKKyAgICBsb29wYmFja0RhdGEuaGFuZ1RpbWVNaWxsaXMgPSBoYW5nVGltZU1pbGxpczsKKwogICAgIC8vIFN0YXJ0IE9VVFBVVCBmaXJzdCBzbyBJTlBVVCBkb2VzIG5vdCBvdmVyZmxvdy4KICAgICByZXN1bHQgPSBwbGF5ZXIuc3RhcnQoKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtNjA0LDcgKzY4MywxNyBAQAogCiAgICAgaWYgKGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yID09IEFBVURJT19PSykgewogICAgICAgICBpZiAodGVzdE1vZGUgPT0gVEVTVF9TSU5FX01BR05JVFVERSkgewotICAgICAgICAgICAgcHJpbnRBdWRpb0dyYXBoKGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZywgMjAwKTsKKyAgICAgICAgICAgIGlmIChsb29wYmFja0RhdGEubnVtR2xpdGNoRXZlbnRzID4gMCkgeworICAgICAgICAgICAgICAgIC8vIEdyYXBoIGFyb3VuZCB0aGUgZmlyc3QgZ2xpdGNoIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHN0YXJ0ID0gbG9vcGJhY2tEYXRhLmdsaXRjaEZyYW1lc1swXSAtIDg7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBlbmQgPSBzdGFydCArIG91dHB1dEZyYW1lc1BlckJ1cnN0ICsgOCArIDg7CisgICAgICAgICAgICAgICAgcHJpbnRBdWRpb0dyYXBoUmVnaW9uKGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZywgc3RhcnQsIGVuZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE9yIGdyYXBoIHRoZSBtaWRkbGUgb2YgdGhlIHNpZ25hbC4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHN0YXJ0ID0gbG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLnNpemUoKSAvIDI7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBlbmQgPSBzdGFydCArIDIwMDsKKyAgICAgICAgICAgICAgICBwcmludEF1ZGlvR3JhcGhSZWdpb24obG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLCBzdGFydCwgZW5kKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+cmVwb3J0KCk7CkBAIC02NTQsNiArNzQzLDExIEBACiAgICAgZGVsZXRlW10gbG9vcGJhY2tEYXRhLmlucHV0U2hvcnREYXRhOwogCiByZXBvcnRfcmVzdWx0OgorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29wYmFja0RhdGEubnVtR2xpdGNoRXZlbnRzOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIgIGdsaXRjaCBhdCBmcmFtZSAlZFxuIiwgbG9vcGJhY2tEYXRhLmdsaXRjaEZyYW1lc1tpXSk7CisgICAgfQorCiAgICAgd3JpdHRlbiA9IGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+c2F2ZShGSUxFTkFNRV9QUk9DRVNTRUQpOwogICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICBwcmludGYoIm1haW4oKSB3cm90ZSAlOGQgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gXCIlc1wiIG9uIEFuZHJvaWQgZGV2aWNlXG4iLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKaW5kZXggYTJiOTE3Ny4uZjVlZDdhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCkBAIC0xMzAsMTIgKzEzMCwxMCBAQAogICAgIH0KIAogICAgIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHkoKSBjb25zdCB7Ci0gICAgICAgIHByaW50ZigiJXMoKSByZXR1cm5zICVkXG4iLCBfX2Z1bmNfXywgbUJ1ZmZlckNhcGFjaXR5KTsKICAgICAgICAgcmV0dXJuIG1CdWZmZXJDYXBhY2l0eTsKICAgICB9CiAKICAgICB2b2lkIHNldEJ1ZmZlckNhcGFjaXR5KGludDMyX3QgZnJhbWVzKSB7Ci0gICAgICAgIHByaW50ZigiJXMoJWQpXG4iLCBfX2Z1bmNfXywgZnJhbWVzKTsKICAgICAgICAgbUJ1ZmZlckNhcGFjaXR5ID0gZnJhbWVzOwogICAgIH0KIApAQCAtMjgzLDcgKzI4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oYXJnKSA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeSA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFBQXVkaW9fc2V0TU1hcFBvbGljeShwb2xpY3kpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBQXVkaW9fc2V0TU1hcFBvbGljeShwb2xpY3kpICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogaW52YWxpZCBNTUFQIHBvbGljeSBtb2RlICVpXG4iLCBwb2xpY3kpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAppbmRleCAxNjQ1OTg2Li40MzczZmE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCkBAIC0zMiw4ICszMiw2IEBACiAKIC8vIEFyYml0cmFyeSBwZXJpb2QgZm9yIGdsaXRjaGVzCiAjZGVmaW5lIEZPUkNFRF9VTkRFUlJVTl9QRVJJT0RfRlJBTUVTICAgICgyICogNDgwMDApCi0vLyBIb3cgbG9uZyB0byBzbGVlcCBpbiBhIGNhbGxiYWNrIHRvIGNhdXNlIGFuIGludGVudGlvbmFsIGdsaXRjaC4gRm9yIHRlc3RpbmcuCi0jZGVmaW5lIEZPUkNFRF9VTkRFUlJVTl9TTEVFUF9NSUNST1MgICAgICgxMCAqIDEwMDApCiAKICNkZWZpbmUgTUFYX1RJTUVTVEFNUFMgICAgICAgICAgICAgICAgICAgMTYKIApAQCAtMjc1LDcgKzI3Myw3IEBACiAKICAgICBpbnQgICAgICAgICAgICAgICAgc2NoZWR1bGVyID0gMDsKICAgICBib29sICAgICAgICAgICAgICAgc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOwotICAgIGJvb2wgICAgICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IGZhbHNlOworICAgIGludDMyX3QgICAgICAgICAgICBoYW5nVGltZU1TZWMgPSAwOwogCiAgICAgQUF1ZGlvU2ltcGxlUGxheWVyIHNpbXBsZVBsYXllcjsKICAgICBpbnQzMl90ICAgICAgICAgICAgY2FsbGJhY2tDb3VudCA9IDA7CkBAIC0zMjcsMTAgKzMyNSwxMiBAQAogICAgICAgICBzaW5lRGF0YS0+c2V0dXBTaW5lU3dlZXBzKCk7CiAgICAgfQogCi0gICAgaWYgKHNpbmVEYXRhLT5mb3JjZVVuZGVycnVucykgeworICAgIGlmIChzaW5lRGF0YS0+aGFuZ1RpbWVNU2VjID4gMCkgewogICAgICAgICBpZiAoc2luZURhdGEtPmZyYW1lc1RvdGFsID4gc2luZURhdGEtPm5leHRGcmFtZVRvR2xpdGNoKSB7Ci0gICAgICAgICAgICB1c2xlZXAoRk9SQ0VEX1VOREVSUlVOX1NMRUVQX01JQ1JPUyk7Ci0gICAgICAgICAgICBwcmludGYoIlNpbXVsYXRlIGdsaXRjaCBhdCAlbGxkXG4iLCAobG9uZyBsb25nKSBzaW5lRGF0YS0+ZnJhbWVzVG90YWwpOworICAgICAgICAgICAgdXNsZWVwKHNpbmVEYXRhLT5oYW5nVGltZU1TZWMgKiAxMDAwKTsKKyAgICAgICAgICAgIHByaW50ZigiSGFuZyBjYWxsYmFjayBhdCAlbGxkIGZyYW1lcyBmb3IgJWQgbXNlY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgc2luZURhdGEtPmZyYW1lc1RvdGFsLAorICAgICAgICAgICAgICAgICAgIHNpbmVEYXRhLT5oYW5nVGltZU1TZWMpOwogICAgICAgICAgICAgc2luZURhdGEtPm5leHRGcmFtZVRvR2xpdGNoICs9IEZPUkNFRF9VTkRFUlJVTl9QRVJJT0RfRlJBTUVTOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExYmQ0My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi0jIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy93cml0ZV9zaW5lLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gd3JpdGVfc2luZQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gd3JpdGVfc2luZV9jYWxsYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmFhdWRpb19wcmVidWlsdAotTE9DQUxfU1JDX0ZJTEVTIDo9IGxpYmFhdWRpby5zbwotTE9DQUxfRVhQT1JUX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1pbmNsdWRlICQoUFJFQlVJTFRfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQXBwbGljYXRpb24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDRmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQVBQX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAppbmRleCA3YTQ4MTUzLi4yYjA1ZjEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCkBAIC0yNiwxMSArMjYsMTQgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCiAjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUGxheWVyLmgiCiAjaW5jbHVkZSAiQUF1ZGlvQXJnc1BhcnNlci5oIgogCi0jZGVmaW5lIEFQUF9WRVJTSU9OICAiMC4xLjUiCisjZGVmaW5lIEFQUF9WRVJTSU9OICAiMC4xLjYiCisKK2NvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0SGFuZ1RpbWVNU2VjID0gMTA7CiAKIC8qKgogICogT3BlbiBzdHJlYW0sIHBsYXkgc29tZSBzaW5lIHdhdmVzLCB0aGVuIGNsb3NlIHRoZSBzdHJlYW0uCkBAIC00MSw3ICs0NCw3IEBACiBzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHRlc3RPcGVuUGxheUNsb3NlKEFBdWRpb0FyZ3NQYXJzZXIgJmFyZ1BhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsb29wQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJlZml4VG9uZU1zZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VVbmRlcnJ1bnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGFuZ1RpbWVNU2VjKQogewogICAgIFNpbmVUaHJlYWRlZERhdGFfdCBteURhdGE7CiAgICAgQUF1ZGlvU2ltcGxlUGxheWVyICZwbGF5ZXIgPSBteURhdGEuc2ltcGxlUGxheWVyOwpAQCAtNTMsMTAgKzU2LDEyIEBACiAgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBydW4gY29tcGxldGUgdGVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgbXlEYXRhLnNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKICAgICBteURhdGEuY2FsbGJhY2tDb3VudCA9IDA7Ci0gICAgbXlEYXRhLmZvcmNlVW5kZXJydW5zID0gZm9yY2VVbmRlcnJ1bnM7IC8vIHRlc3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCgpCisgICAgbXlEYXRhLmhhbmdUaW1lTVNlYyA9IGhhbmdUaW1lTVNlYzsgLy8gdGVzdCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KCkKIAogICAgIHJlc3VsdCA9IHBsYXllci5vcGVuKGFyZ1BhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVQbGF5ZXJEYXRhQ2FsbGJhY2tQcm9jLCBTaW1wbGVQbGF5ZXJFcnJvckNhbGxiYWNrUHJvYywgJm15RGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGxheWVyRGF0YUNhbGxiYWNrUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVQbGF5ZXJFcnJvckNhbGxiYWNrUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbXlEYXRhKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIHBsYXllci5vcGVuKCkgcmV0dXJuZWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CkBAIC0xMTUsMTIgKzEyMCwxNyBAQAogICAgICAgICAgICAgaW50NjRfdCBtaWxsaXMgPQogICAgICAgICAgICAgICAgICAgICAoZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKSAtIHN0YXJ0ZWRBdE5hbm9zKSAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKICAgICAgICAgICAgIHJlc3VsdCA9IG15RGF0YS53YWtlci5nZXQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVzV3JpdHRlbiA9IChpbnQzMl90KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZXNSZWFkID0gKGludDMyX3QpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHBsYXllci5nZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHhydW5zID0gQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpOwogICAgICAgICAgICAgcHJpbnRmKCIgd2FrZXIgcmVzdWx0ID0gJWQsIGF0ICU2ZCBtaWxsaXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBzZWNvbmQgPSAlM2QsIGZyYW1lc1dyaXR0ZW4gPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgc2Vjb25kID0gJTNkLCBmcmFtZXMgd3JpdHRlbiAlOGQgLSByZWFkICU4ZCA9ICU4ZCwgdW5kZXJydW5zID0gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCAoaW50KSBtaWxsaXMsCiAgICAgICAgICAgICAgICAgICAgc2Vjb25kLAotICAgICAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHBsYXllci5nZXRTdHJlYW0oKSksCi0gICAgICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpKTsKKyAgICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiAtIGZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgeHJ1bnMpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQgPSAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOwogICAgICAgICAgICAgICAgIGJhaWxPdXQgPSB0cnVlOwpAQCAtMjEwLDcgKzIyMCw5IEBACiAgICAgQUF1ZGlvQXJnc1BhcnNlcjo6dXNhZ2UoKTsKICAgICBwcmludGYoIiAgICAgIC1se2NvdW50fSBsb29wQ291bnQgc3RhcnQvc3RvcCwgZXZlcnkgb3RoZXIgb25lIGlzIHNpbGVudFxuIik7CiAgICAgcHJpbnRmKCIgICAgICAtdHttc2VjfSAgcGxheSBhIGhpZ2ggcGl0Y2hlZCB0b25lIGF0IHRoZSBiZWdpbm5pbmdcbiIpOwotICAgIHByaW50ZigiICAgICAgLXogICAgICAgIGZvcmNlIHBlcmlvZGljIHVuZGVycnVucyBieSBzbGVlcGluZyBpbiBjYWxsYmFja1xuIik7CisgICAgcHJpbnRmKCIgICAgICAtaHttc2VjfSAgZm9yY2UgcGVyaW9kaWMgdW5kZXJydW5zIGJ5IGhhbmdpbmcgaW4gY2FsbGJhY2tcbiIpOworICAgIHByaW50ZigiICAgICAgICAgICAgICAgIElmIG5vIHZhbHVlIHNwZWNpZmllZCB0aGVuICVkIHVzZWQuXG4iLAorICAgICAgICAgICAga0RlZmF1bHRIYW5nVGltZU1TZWMpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCkBAIC0yMTksMTMgKzIzMSwxNCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCAgICByZXN1bHQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGxvb3BDb3VudCA9IDE7CiAgICAgaW50MzJfdCAgICAgICAgICAgIHByZWZpeFRvbmVNc2VjID0gMDsKLSAgICBib29sICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1RpbWVNU2VjID0gMDsKIAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwogCi0gICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWJXNcbiIsIGFyZ3ZbMF0sIEFQUF9WRVJTSU9OKTsKKyAgICBwcmludGYoIiVzIC0gUGxheSBhIHNpbmUgc3dlZXAgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrIFYlc1xuIiwKKyAgICAgICAgYXJndlswXSwgQVBQX1ZFUlNJT04pOwogCiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKQEAgLTI0MCw4ICsyNTMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhUb25lTXNlYyA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAneic6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IHRydWU7ICAvLyBaenp6enp6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNU2VjID0gKGFyZ1syXSkgLy8gdmFsdWUgc3BlY2lmaWVkPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF0b2koJmFyZ1syXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrRGVmYXVsdEhhbmdUaW1lTVNlYzsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKQEAgLTI1Nyw3ICsyNzIsOCBAQAogICAgIH0KIAogICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBjYW4gY29tcGxldGUgdGhlIHRlc3Qgd2l0aG91dCBkaXNjb25uZWN0aW5nLgotICAgIHdoaWxlKChyZXN1bHQgPSB0ZXN0T3BlblBsYXlDbG9zZShhcmdQYXJzZXIsIGxvb3BDb3VudCwgcHJlZml4VG9uZU1zZWMsIGZvcmNlVW5kZXJydW5zKSkKKyAgICB3aGlsZSgocmVzdWx0ID0gdGVzdE9wZW5QbGF5Q2xvc2UoYXJnUGFyc2VyLCBsb29wQ291bnQsCisgICAgICAgICAgICBwcmVmaXhUb25lTXNlYywgaGFuZ1RpbWVNU2VjKSkKICAgICAgICAgICAgID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOwogCiAgICAgcmV0dXJuIChyZXN1bHQpID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCmluZGV4IDE0OTNiMjYuLjhlMzZjNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAorKysgYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKQEAgLTM3Myw2ICszNzMsMTMgQEAKICAgICAgKiBzbyB0aGUgcmVjb3JkZWQgdm9sdW1lIG1heSBiZSB2ZXJ5IGxvdy4KICAgICAgKi8KICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEID0gOSwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHByZXNldCBmb3IgY2FwdHVyaW5nIGF1ZGlvIG1lYW50IHRvIGJlIHByb2Nlc3NlZCBpbiByZWFsIHRpbWUKKyAgICAgKiBhbmQgcGxheWVkIGJhY2sgZm9yIGxpdmUgcGVyZm9ybWFuY2UgKGUuZyBrYXJhb2tlKS4KKyAgICAgKiBUaGUgY2FwdHVyZSBwYXRoIHdpbGwgbWluaW1pemUgbGF0ZW5jeSBhbmQgY291cGxpbmcgd2l0aCBwbGF5YmFjayBwYXRoLgorICAgICAqLworICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0UgPSAxMCwKIH07CiB0eXBlZGVmIGludDMyX3QgYWF1ZGlvX2lucHV0X3ByZXNldF90OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKaW5kZXggYjllMjhhMC4uNDA5MDI4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icApAQCAtNiw2ICs2LDcgQEAKICAgICAgICAgImNsaWVudCIsCiAgICAgICAgICJjb3JlIiwKICAgICAgICAgImZpZm8iLAorICAgICAgICAiZmxvd2dyYXBoIiwKICAgICAgICAgImxlZ2FjeSIsCiAgICAgICAgICJ1dGlsaXR5IiwKICAgICBdLApAQCAtMjUsOSArMjYsOSBAQAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5jcHAiLAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmNwcCIsCiAgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuY3BwIiwKLSAgICAgICAgInV0aWxpdHkvTGluZWFyUmFtcC5jcHAiLAogICAgICAgICAiZmlmby9GaWZvQnVmZmVyLmNwcCIsCiAgICAgICAgICJmaWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAiLAorICAgICAgICAiY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAiLAogICAgICAgICAiY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIiwKICAgICAgICAgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCIsCiAgICAgICAgICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIiwKQEAgLTQyLDYgKzQzLDE2IEBACiAgICAgICAgICJiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIiwKICAgICAgICAgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9SYW1wTGluZWFyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU2lua0Zsb2F0LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU2lua0kxNi5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMjQuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAppbmRleCA5NTlkYjYxLi4zZDFiYzliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgpAQCAtMzYsNiArNDAsNyBAQAogCiBzdGF0dXNfdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOworCiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldERldmljZUlkKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldFNhbXBsZVJhdGUoKSk7CkBAIC00Niw2ICs1MSw3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldEZvcm1hdCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworCiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXREaXJlY3Rpb24oKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CkBAIC02MCw3ICs2Niw3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKLSAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi53cml0ZVRvUGFyY2VsKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgiJXMoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC04MCw3ICs4Niw4IEBACiAgICAgc2V0U2hhcmluZ01vZGUoKGFhdWRpb19zaGFyaW5nX21vZGVfdCkgdmFsdWUpOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRGb3JtYXQoKGFhdWRpb19mb3JtYXRfdCkgdmFsdWUpOworICAgIHNldEZvcm1hdCgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlKTsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzZXREaXJlY3Rpb24oKGFhdWRpb19kaXJlY3Rpb25fdCkgdmFsdWUpOwpAQCAtOTksOCArMTA2LDkgQEAKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0U2Vzc2lvbklkKHZhbHVlKTsKKwogICAgIHJldHVybiBOT19FUlJPUjsKIGVycm9yOgotICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLnJlYWRGcm9tUGFyY2VsKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBzdGF0dXMpOworICAgIEFMT0dFKCIlcygpOiByZWFkIGZhaWxlZCA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDYyMGVkYzcuLjliMzI1NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcApAQCAtNzIsNyArNzIsNiBAQAogICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IHRyYW5zYWN0KE9QRU5fU1RSRUFNKSByZWFkSW50ICVkIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCBPUEVOX1NUUkVBTSBwYXNzZWQgc3RyZWFtICVkIiwgc3RyZWFtKTsKICAgICAgICAgICAgIHJldHVybiBzdHJlYW07CiAgICAgICAgIH0KICAgICAgICAgZXJyID0gY29uZmlndXJhdGlvbk91dHB1dC5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCmluZGV4IDBiMGNmNzcuLjY3OTU1ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKIAogdm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpzZXR1cChjb25zdCB1bmlxdWVfZmQmIGZkLCBpbnQzMl90IHNpemVJbkJ5dGVzKSB7CiAgICAgbUZkLnJlc2V0KGR1cChmZC5nZXQoKSkpOyAvLyBzdG9yZSBhIGR1cGxpY2F0ZSBmZAotICAgIEFMT0dWKCJzZXR1cCglZCAtPiAlZCwgJWQpIHRoaXMgPSAlcFxuIiwgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOworICAgIEFMT0dWKCJzZXR1cChmZCA9ICVkIC0+ICVkLCBzaXplID0gJWQpIHRoaXMgPSAlcFxuIiwgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOwogICAgIG1TaXplSW5CeXRlcyA9IHNpemVJbkJ5dGVzOwogfQogCkBAIC0xMDQsNyArMTA0LDggQEAKICAgICBtUmVzb2x2ZWRBZGRyZXNzID0gKHVpbnQ4X3QgKikgbW1hcCgwLCBtU2l6ZUluQnl0ZXMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgZmQuZ2V0KCksIDApOwogICAgIGlmIChtUmVzb2x2ZWRBZGRyZXNzID09IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTKSB7Ci0gICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBlcnJubyA9ICVzIiwgZmQuZ2V0KCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBuQnl0ZXMgPSAlZCwgZXJybm8gPSAlcyIsCisgICAgICAgICAgICAgIGZkLmdldCgpLCBtU2l6ZUluQnl0ZXMsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAppbmRleCA4MmMyMjQwLi40ZWMzOGM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKQEAgLTcwLDggKzcwLDggQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzb2x2ZVNoYXJlZE1lbW9yeShjb25zdCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmIGZkKTsKIAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAgIG1GZDsKLSAgICBpbnQzMl90ICAgICBtU2l6ZUluQnl0ZXMgPSAwOwotICAgIHVpbnQ4X3QgICAgKm1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2l6ZUluQnl0ZXMgPSAwOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgKm1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKIAogcHJpdmF0ZToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0M2M2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb0Zsb3dHcmFwaCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFBdWRpb0Zsb3dHcmFwaC5oIgorCisjaW5jbHVkZSA8Zmxvd2dyYXBoL0NsaXBUb1JhbmdlLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1JhbXBMaW5lYXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0Zsb2F0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMTYuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0kyNC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VGbG9hdC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMTYuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTI0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9GbG93R3JhcGg6OmNvbmZpZ3VyZShhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc291cmNlQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpIHsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbGFzdE91dHB1dCA9IG51bGxwdHI7CisKKyAgICBBTE9HRCgiJXMoKSBzb3VyY2UgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkLCBzaW5rIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIHNvdXJjZUZvcm1hdCwgc291cmNlQ2hhbm5lbENvdW50LCBzaW5rRm9ybWF0LCBzaW5rQ2hhbm5lbENvdW50KTsKKworICAgIHN3aXRjaCAoc291cmNlRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFNvdXJjZUZsb2F0Pihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VJMTY+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VJMjQ+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy8gVE9ETyBhZGQgSTMyCisgICAgICAgICAgICBBTE9HRSgiJXMoKSBVbnN1cHBvcnRlZCBzb3VyY2UgZm9ybWF0ID0gJWQiLCBfX2Z1bmNfXywgc291cmNlRm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisgICAgbGFzdE91dHB1dCA9ICZtU291cmNlLT5vdXRwdXQ7CisKKyAgICAvLyBBcHBseSB2b2x1bWUgYXMgYSByYW1wIHRvIGF2b2lkIHBvcHMuCisgICAgbVZvbHVtZVJhbXAgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhbXBMaW5lYXI+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbVZvbHVtZVJhbXAtPmlucHV0KTsKKyAgICBsYXN0T3V0cHV0ID0gJm1Wb2x1bWVSYW1wLT5vdXRwdXQ7CisKKyAgICAvLyBGb3IgYSBwdXJlIGZsb2F0IGdyYXBoLCB0aGVyZSBpcyBjaGFuY2UgdGhhdCB0aGUgZGF0YSByYW5nZSBtYXkgYmUgdmVyeSBsYXJnZS4KKyAgICAvLyBTbyB3ZSBzaG91bGQgY2xpcCB0byBhIHJlYXNvbmFibGUgdmFsdWUgdGhhdCBhbGxvd3MgYSBsaXR0bGUgaGVhZHJvb20uCisgICAgaWYgKHNvdXJjZUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUICYmIHNpbmtGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBtQ2xpcHBlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpcFRvUmFuZ2U+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1DbGlwcGVyLT5pbnB1dCk7CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbUNsaXBwZXItPm91dHB1dDsKKyAgICB9CisKKyAgICAvLyBFeHBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscyBpZiByZXF1aXJlZC4KKyAgICBpZiAoc291cmNlQ2hhbm5lbENvdW50ID09IDEgJiYgc2lua0NoYW5uZWxDb3VudCA+IDEpIHsKKyAgICAgICAgbUNoYW5uZWxDb252ZXJ0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vbm9Ub011bHRpQ29udmVydGVyPihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbUNoYW5uZWxDb252ZXJ0ZXItPmlucHV0KTsKKyAgICAgICAgbGFzdE91dHB1dCA9ICZtQ2hhbm5lbENvbnZlcnRlci0+b3V0cHV0OworICAgIH0gZWxzZSBpZiAoc291cmNlQ2hhbm5lbENvdW50ICE9IHNpbmtDaGFubmVsQ291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgQ2hhbm5lbCByZWR1Y3Rpb24gbm90IHN1cHBvcnRlZC4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHNpbmtGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgbVNpbmsgPSBzdGQ6Om1ha2VfdW5pcXVlPFNpbmtGbG9hdD4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTE2PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTI0PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBUT0RPIGFkZCBJMzIKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIFVuc3VwcG9ydGVkIHNpbmsgZm9ybWF0ID0gJWQiLCBfX2Z1bmNfXywgc2lua0Zvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1TaW5rLT5pbnB1dCk7CisKKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6cHJvY2Vzcyhjb25zdCB2b2lkICpzb3VyY2UsIHZvaWQgKmRlc3RpbmF0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIG1Tb3VyY2UtPnNldERhdGEoc291cmNlLCBudW1GcmFtZXMpOworICAgIG1TaW5rLT5yZWFkKGRlc3RpbmF0aW9uLCBudW1GcmFtZXMpOworfQorCisvKioKKyAqIEBwYXJhbSB2b2x1bWUgYmV0d2VlbiAwLjAgYW5kIDEuMAorICovCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0VGFyZ2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIG1Wb2x1bWVSYW1wLT5zZXRUYXJnZXQodm9sdW1lKTsKK30KKwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnNldFJhbXBMZW5ndGhJbkZyYW1lcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIG1Wb2x1bWVSYW1wLT5zZXRMZW5ndGhJbkZyYW1lcyhudW1GcmFtZXMpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDlmNjRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICisjZGVmaW5lIEFORFJPSURfQUFVRElPX0ZMT1dfR1JBUEhfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9DbGlwVG9SYW5nZS5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9SYW1wTGluZWFyLmg+CisKK2NsYXNzIEFBdWRpb0Zsb3dHcmFwaCB7CitwdWJsaWM6CisgICAgLyoqIENvbm5lY3Qgc2V2ZXJhbCBtb2R1bGVzIHRvZ2V0aGVyIHRvIGNvbnZlcnQgZnJvbSBzb3VyY2UgdG8gc2luay4KKyAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZvcm1hdAorICAgICAqIEBwYXJhbSBzb3VyY2VDaGFubmVsQ291bnQKKyAgICAgKiBAcGFyYW0gc2lua0Zvcm1hdAorICAgICAqIEBwYXJhbSBzaW5rQ2hhbm5lbENvdW50CisgICAgICogQHJldHVybgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KTsKKworICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB2b2lkICpzb3VyY2UsIHZvaWQgKmRlc3RpbmF0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdm9sdW1lIGJldHdlZW4gMC4wIGFuZCAxLjAKKyAgICAgKi8KKyAgICB2b2lkIHNldFRhcmdldFZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgdm9pZCBzZXRSYW1wTGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBudW1GcmFtZXMpOworCitwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU291cmNlPiAgICAgICAgICBtU291cmNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OlJhbXBMaW5lYXI+ICAgICAgICAgICBtVm9sdW1lUmFtcDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpDbGlwVG9SYW5nZT4gICAgICAgICAgbUNsaXBwZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6TW9ub1RvTXVsdGlDb252ZXJ0ZXI+IG1DaGFubmVsQ29udmVydGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU2luaz4gICAgICAgICAgICBtU2luazsKK307CisKKworI2VuZGlmIC8vQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCmluZGV4IGY4ZTM0ZDEuLjIxNGY4ODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCkBAIC0xOTYsNyArMTk2LDcgQEAKIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpCiB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogfQogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKQpAQCAtMjA2LDE1ICsyMDYsMTUgQEAKIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkKIHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VXcml0ZUluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpIHsKLSAgICBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVdyaXRlSW5kZXgoZGVsdGFGcmFtZXMpOworICAgIG1EYXRhUXVldWUtPmFkdmFuY2VXcml0ZUluZGV4KGRlbHRhRnJhbWVzKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjphZHZhbmNlUmVhZEluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpIHsKLSAgICBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CisgICAgbURhdGFRdWV1ZS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6c2V0RGF0YVJlYWRDb3VudGVyKGZpZm9fY291bnRlcl90IGZyYW1lc1JlYWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCmluZGV4IDkyMDQ4MjQuLmVjMjcwZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCIKICNpbmNsdWRlICJmaWZvL0ZpZm9CdWZmZXIuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0xpbmVhclJhbXAuaCIKIAogI2luY2x1ZGUgIkF1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKIApAQCAtNjMsNyArNjIsNyBAQAogICAgICAgICAsIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKEFBVURJT19IQU5ETEVfSU5WQUxJRCkKICAgICAgICAgLCBtSW5TZXJ2aWNlKGluU2VydmljZSkKICAgICAgICAgLCBtU2VydmljZUludGVyZmFjZShzZXJ2aWNlSW50ZXJmYWNlKQotICAgICAgICAsIG1BdG9taWNUaW1lc3RhbXAoKQorICAgICAgICAsIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcCgpCiAgICAgICAgICwgbVdha2V1cERlbGF5TmFub3MoQUF1ZGlvUHJvcGVydHlfZ2V0V2FrZXVwRGVsYXlNaWNyb3MoKSAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAgICAgICAgICwgbU1pbmltdW1TbGVlcE5hbm9zKEFBdWRpb1Byb3BlcnR5X2dldE1pbmltdW1TbGVlcE1pY3JvcygpICogQUFVRElPX05BTk9TX1BFUl9NSUNST1NFQ09ORCkKICAgICAgICAgewpAQCAtOTIsMTEgKzkxLDExIEBACiAgICAgfQogCiAgICAgLy8gV2UgaGF2ZSB0byBkbyB2b2x1bWUgc2NhbGluZy4gU28gd2UgcHJlZmVyIEZMT0FUIGZvcm1hdC4KLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQogICAgIC8vIFJlcXVlc3QgRkxPQVQgZm9yIHRoZSBzaGFyZWQgbWl4ZXIuCi0gICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAKICAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCiAgICAgcmVxdWVzdC5zZXRVc2VySWQoZ2V0dWlkKCkpOwpAQCAtMTI2LDEzICsxMjUsMTIgQEAKICAgICAgICAgLy8gaWYgdGhhdCBmYWlsZWQgdGhlbiB0cnkgc3dpdGNoaW5nIGZyb20gbW9ubyB0byBzdGVyZW8gaWYgT1VUUFVULgogICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaW4gdGhlIGNsaWVudC4gT3RoZXJ3aXNlIHdlIGVuZCB1cCB3aXRoIGEgbW9ubyBtaXhlciBpbiB0aGUgc2VydmljZQogICAgICAgICAvLyB0aGF0IHdyaXRlcyB0byBhIHN0ZXJlbyBNTUFQIHN0cmVhbS4KLSAgICAgICAgQUxPR0QoIiVzIC0gb3BlblN0cmVhbSgpIHJldHVybmVkICVkLCB0cnkgc3dpdGNoaW5nIGZyb20gTU9OTyB0byBTVEVSRU8iLAorICAgICAgICBBTE9HRCgiJXMoKSAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlc1BlckZyYW1lKDIpOyAvLyBzdGVyZW8KICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwogICAgIH0KICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcyAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBtU2VydmljZVN0cmVhbUhhbmRsZTsKICAgICB9CiAKQEAgLTIxMiw5ICsyMTAsNyBAQAogICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gbUZyYW1lc1BlckJ1cnN0OwogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gZ2V0U2FtcGxlc1BlckZyYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOwotICAgICAgICBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGJ5dGVzUGVyRnJhbWU7CisgICAgICAgIGNvbnN0IGludDMyX3QgY2FsbGJhY2tCdWZmZXJTaXplID0gbUNhbGxiYWNrRnJhbWVzICogZ2V0Qnl0ZXNQZXJGcmFtZSgpOwogICAgICAgICBtQ2FsbGJhY2tCdWZmZXIgPSBuZXcgdWludDhfdFtjYWxsYmFja0J1ZmZlclNpemVdOwogICAgIH0KIApAQCAtMzUzLDggKzM0OSw3IEBACiAgICAgfQogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFN0b3AoKQoteworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdG9wQ2FsbGJhY2soKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMzY4LDcgKzM2Myw3IEBACiAKICAgICBtQ2xvY2tNb2RlbC5zdG9wKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwotICAgIG1BdG9taWNUaW1lc3RhbXAuY2xlYXIoKTsKKyAgICBtQXRvbWljSW50ZXJuYWxUaW1lc3RhbXAuY2xlYXIoKTsKIAogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5zdG9wU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIH0KQEAgLTQxNyw4ICs0MTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgewogICAgIC8vIEdlbmVyYXRlZCBpbiBzZXJ2ZXIgYW5kIHBhc3NlZCB0byBjbGllbnQuIFJldHVybiBsYXRlc3QuCi0gICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7Ci0gICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICBpZiAobUF0b21pY0ludGVybmFsVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY0ludGVybmFsVGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgaW50NjRfdCBwb3NpdGlvbiA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwogICAgICAgICBpZiAocG9zaXRpb24gPj0gMCkgewogICAgICAgICAgICAgKmZyYW1lUG9zaXRpb24gPSBwb3NpdGlvbjsKQEAgLTQ2NSw3ICs0NjAsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25UaW1lc3RhbXBIYXJkd2FyZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSkgewogICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAobWVzc2FnZS0+dGltZXN0YW1wLnBvc2l0aW9uLCBtZXNzYWdlLT50aW1lc3RhbXAudGltZXN0YW1wKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIApAQCAtNjk2LDcgKzY5MSw2IEBACiAgICAgfQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1BdWRpb0VuZHBvaW50LnNldEJ1ZmZlclNpemVJbkZyYW1lcyhhZGp1c3RlZEZyYW1lcywgJmFjdHVhbEZyYW1lcyk7Ci0gICAgQUxPR0QoInNldEJ1ZmZlclNpemUoKSByZXEgPSAlZCA9PiAlZCIsIHJlcXVlc3RlZEZyYW1lcywgYWN0dWFsRnJhbWVzKTsKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CkBAIC03MTksMyArNzEzLDcgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcpIHsKICAgICByZXR1cm4gQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQocmV0dXJuQXJnLCBjYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dChnZXRGcmFtZXNQZXJCdXJzdCgpKSk7CiB9CisKK2Jvb2wgQXVkaW9TdHJlYW1JbnRlcm5hbDo6aXNDbG9ja01vZGVsSW5Db250cm9sKCkgY29uc3QgeworICAgIHJldHVybiBpc0FjdGl2ZSgpICYmIG1BdWRpb0VuZHBvaW50LmlzRnJlZVJ1bm5pbmcoKSAmJiBtQ2xvY2tNb2RlbC5pc1J1bm5pbmcoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaAppbmRleCAwNDI1Y2Q1Li44NmM0Njk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvRW5kcG9pbnQuaCIKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwogdXNpbmcgYW5kcm9pZDo6SUFBdWRpb1NlcnZpY2U7CkBAIC0xNDUsNiArMTQ0LDE0IEBACiAgICAgICovCiAgICAgYm9vbCBpc0luU2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIG1JblNlcnZpY2U7IH0KIAorICAgIC8qKgorICAgICAqIElzIHRoZSBzZXJ2aWNlIEZJRk8gcG9zaXRpb24gY3VycmVudGx5IGNvbnRyb2xsZWQgYnkgdGhlIEFBdWRpbyBzZXJ2aWNlIG9yIEhBTCwKKyAgICAgKiBvciBzZXQgYmFzZWQgb24gdGhlIENsb2NrIE1vZGVsLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBDbG9ja01vZGVsIGlzIGN1cnJlbnRseSBkZXRlcm1pbmluZyB0aGUgRklGTyBwb3NpdGlvbgorICAgICAqLworICAgIGJvb2wgaXNDbG9ja01vZGVsSW5Db250cm9sKCkgY29uc3Q7CisKICAgICBJc29jaHJvbm91c0Nsb2NrTW9kZWwgICAgbUNsb2NrTW9kZWw7ICAgICAgLy8gdGltaW5nIG1vZGVsIGZvciBjaGFzaW5nIHRoZSBIQUwKIAogICAgIEF1ZGlvRW5kcG9pbnQgICAgICAgICAgICBtQXVkaW9FbmRwb2ludDsgICAvLyBzb3VyY2UgZm9yIHJlYWRzIG9yIHNpbmsgZm9yIHdyaXRlcwpAQCAtMTY0LDcgKzE3MSw3IEBACiAKICAgICBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmbVNlcnZpY2VJbnRlcmZhY2U7ICAgLy8gYWJzdHJhY3QgaW50ZXJmYWNlIHRvIHRoZSBzZXJ2aWNlCiAKLSAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKKyAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wOwogCiAgICAgQXRvbWljUmVxdWVzdG9yICAgICAgICAgIG1OZWVkQ2F0Y2hVcDsgICAvLyBBc2sgcmVhZCgpIG9yIHdyaXRlKCkgdG8gc3luYyBvbiBmaXJzdCB0aW1lc3RhbXAuCiAKQEAgLTE5Myw2ICsyMDAsOCBAQAogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlTGF0ZW5jeU5hbm9zID0gMDsKIAorICAgIC8vIFNvbWV0aW1lcyB0aGUgaGFyZHdhcmUgaXMgb3BlcmF0aW5nIHdpdGggYSBkaWZmZXJlbnQgY2hhbm5lbCBjb3VudCBmcm9tIHRoZSBhcHAuCisgICAgLy8gVGhlbiB3ZSByZXF1aXJlIGNvbnZlcnNpb24gaW4gQUF1ZGlvLgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRGV2aWNlQ2hhbm5lbENvdW50ID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAppbmRleCAwNzE5ZmUxLi5hNmNjNDViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oIgpAQCAtMTY1LDM1ICsxNjYsMzYgQEAKICAgICAvLyBSZWFkIGRhdGEgaW4gb25lIG9yIHR3byBwYXJ0cy4KICAgICBmb3IgKGludCBwYXJ0SW5kZXggPSAwOyBmcmFtZXNMZWZ0ID4gMCAmJiBwYXJ0SW5kZXggPCBXcmFwcGluZ0J1ZmZlcjo6U0laRTsgcGFydEluZGV4KyspIHsKICAgICAgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBmcmFtZXNMZWZ0OwotICAgICAgICBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1twYXJ0SW5kZXhdOworICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1twYXJ0SW5kZXhdOwogICAgICAgICBpZiAoZnJhbWVzQXZhaWxhYmxlIDw9IDApIGJyZWFrOwogCiAgICAgICAgIGlmIChmcmFtZXNUb1Byb2Nlc3MgPiBmcmFtZXNBdmFpbGFibGUpIHsKICAgICAgICAgICAgIGZyYW1lc1RvUHJvY2VzcyA9IGZyYW1lc0F2YWlsYWJsZTsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSBnZXRCeXRlc1BlckZyYW1lKCkgKiBmcmFtZXNUb1Byb2Nlc3M7Ci0gICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICBjb25zdCBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Qcm9jZXNzOworICAgICAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKIAorICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQgPSBnZXREZXZpY2VGb3JtYXQoKTsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZGVzdGluYXRpb25Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKICAgICAgICAgLy8gVE9ETyBmYWN0b3IgdGhpcyBvdXQgaW50byBhIHV0aWxpdHkgZnVuY3Rpb24KLSAgICAgICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IGdldEZvcm1hdCgpKSB7CisgICAgICAgIGlmIChzb3VyY2VGb3JtYXQgPT0gZGVzdGluYXRpb25Gb3JtYXQpIHsKICAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiwgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLCBudW1CeXRlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2Ci0gICAgICAgICAgICAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgICAgICAgICAgICAgJiYgZGVzdGluYXRpb25Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KAogICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgIDEuMGYpOwotICAgICAgICB9IGVsc2UgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUCi0gICAgICAgICAgICAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVAorICAgICAgICAgICAgICAgICAgICYmIGRlc3RpbmF0aW9uRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoCiAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRm9ybWF0IGNvbnZlcnNpb24gbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIC0gRm9ybWF0IGNvbnZlcnNpb24gbm90IHN1cHBvcnRlZCEgYXVkaW9fZm9ybWF0X3Qgc291cmNlID0gJXUsIGRlc3QgPSAldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNvdXJjZUZvcm1hdCwgZGVzdGluYXRpb25Gb3JtYXQpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKICAgICAgICAgfQogICAgICAgICBkZXN0aW5hdGlvbiArPSBudW1CeXRlczsKQEAgLTIwOCwxNyArMjEwLDEyIEBACiB9CiAKIGludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmdldEZyYW1lc1dyaXR0ZW4oKSB7Ci0gICAgaW50NjRfdCBmcmFtZXNXcml0dGVuSGFyZHdhcmU7Ci0gICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgZnJhbWVzV3JpdHRlbkhhcmR3YXJlID0gbUNsb2NrTW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKTsKLSAgICB9Ci0gICAgLy8gUHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KKyAgICBjb25zdCBpbnQ2NF90IGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IGlzQ2xvY2tNb2RlbEluQ29udHJvbCgpCisgICAgICAgICAgICA/IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKQorICAgICAgICAgICAgOiBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCk7CisgICAgLy8gQWRkIHNlcnZpY2Ugb2Zmc2V0IGFuZCBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgogICAgIG1MYXN0RnJhbWVzV3JpdHRlbiA9IHN0ZDo6bWF4KG1MYXN0RnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuSGFyZHdhcmUgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UpOwotICAgIC8vQUxPR0QoImdldEZyYW1lc1dyaXR0ZW4oKSByZXR1cm5zICVsbGQiLAotICAgIC8vICAgICAgKGxvbmcgbG9uZyltTGFzdEZyYW1lc1dyaXR0ZW4pOwogICAgIHJldHVybiBtTGFzdEZyYW1lc1dyaXR0ZW47CiB9CiAKQEAgLTI1Niw3ICsyNTMsOCBAQAogICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IG1heWJlQ2FsbERhdGFDYWxsYmFjayhtQ2FsbGJhY2tCdWZmZXIsIG1DYWxsYmFja0ZyYW1lcyk7CiAKICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgewotICAgICAgICAgICAgQUxPR0QoImNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIpOworICAgICAgICAgICAgQUxPR0QoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCmluZGV4IDc5NWJhMmMuLmUxNDQzZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKQEAgLTQzLDkgKzQzLDE3IEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oYnVpbGRlcik7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgcmVzdWx0ID0gbUZsb3dHcmFwaC5jb25maWd1cmUoZ2V0Rm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICB9CiAgICAgICAgIC8vIFNhbXBsZSByYXRlIGlzIGNvbnN0cmFpbmVkIHRvIGNvbW1vbiB2YWx1ZXMgYnkgbm93IGFuZCBzaG91bGQgbm90IG92ZXJmbG93LgogICAgICAgICBpbnQzMl90IG51bUZyYW1lcyA9IGtSYW1wTVNlYyAqIGdldFNhbXBsZVJhdGUoKSAvIEFBVURJT19NSUxMSVNfUEVSX1NFQ09ORDsKLSAgICAgICAgbVZvbHVtZVJhbXAuc2V0TGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKKyAgICAgICAgbUZsb3dHcmFwaC5zZXRSYW1wTGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTYzLDcgKzcxLDcgQEAKIAogICAgIG1DbG9ja01vZGVsLnN0b3AoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLmNsZWFyKCk7CiAgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnBhdXNlU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIH0KIApAQCAtMjE2LDIyICsyMjQsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvV3JpdGU7Ci0gICAgICAgICAgICAvLyBEYXRhIGNvbnZlcnNpb24uCi0gICAgICAgICAgICBmbG9hdCBsZXZlbEZyb207Ci0gICAgICAgICAgICBmbG9hdCBsZXZlbFRvOwotICAgICAgICAgICAgbVZvbHVtZVJhbXAubmV4dFNlZ21lbnQoZnJhbWVzVG9Xcml0ZSwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwogCi0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpGb3JtYXR0ZWREYXRhIHNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilieXRlQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Rm9ybWF0dGVkRGF0YSBkZXN0aW5hdGlvbigKLSAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOwotCi0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0KHNvdXJjZSwgZGVzdGluYXRpb24sIGZyYW1lc1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwgbGV2ZWxUbyk7CisgICAgICAgICAgICBtRmxvd0dyYXBoLnByb2Nlc3MoKHZvaWQgKilieXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1dyaXRlKTsKIAogICAgICAgICAgICAgYnl0ZUJ1ZmZlciArPSBudW1CeXRlczsKICAgICAgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9Xcml0ZTsKQEAgLTI0NiwyNyArMjQyLDE3IEBACiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKLWludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1JlYWQoKQotewotICAgIGludDY0X3QgZnJhbWVzUmVhZEhhcmR3YXJlOwotICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgIGZyYW1lc1JlYWRIYXJkd2FyZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcmFtZXNSZWFkSGFyZHdhcmUgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhUmVhZENvdW50ZXIoKTsKLSAgICB9Ci0gICAgaW50NjRfdCBmcmFtZXNSZWFkID0gZnJhbWVzUmVhZEhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwotICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24uCi0gICAgaWYgKGZyYW1lc1JlYWQgPCBtTGFzdEZyYW1lc1JlYWQpIHsKLSAgICAgICAgZnJhbWVzUmVhZCA9IG1MYXN0RnJhbWVzUmVhZDsKLSAgICB9IGVsc2UgewotICAgICAgICBtTGFzdEZyYW1lc1JlYWQgPSBmcmFtZXNSZWFkOwotICAgIH0KLSAgICByZXR1cm4gZnJhbWVzUmVhZDsKK2ludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1JlYWQoKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNSZWFkSGFyZHdhcmUgPSBpc0Nsb2NrTW9kZWxJbkNvbnRyb2woKQorICAgICAgICAgICAgPyBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSkKKyAgICAgICAgICAgIDogbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCk7CisgICAgLy8gQWRkIHNlcnZpY2Ugb2Zmc2V0IGFuZCBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgorICAgIG1MYXN0RnJhbWVzUmVhZCA9IHN0ZDo6bWF4KG1MYXN0RnJhbWVzUmVhZCwgZnJhbWVzUmVhZEhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlKTsKKyAgICByZXR1cm4gbUxhc3RGcmFtZXNSZWFkOwogfQogCi1pbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNXcml0dGVuKCkKLXsKLSAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCkKK2ludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1dyaXR0ZW4oKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7CiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CkBAIC0yOTcsNyArMjgzLDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBBTE9HRCgiJXMoKTogY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmVzdWx0ID0gc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTMsNiArMzAwLDYgQEAKICAgICBmbG9hdCBjb21iaW5lZFZvbHVtZSA9IG1TdHJlYW1Wb2x1bWUgKiBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpOwogICAgIEFMT0dEKCIlcygpIG1TdHJlYW1Wb2x1bWUgKiBkdWNrQW5kTXV0ZVZvbHVtZSA9ICVmICogJWYgPSAlZiIsCiAgICAgICAgICAgX19mdW5jX18sIG1TdHJlYW1Wb2x1bWUsIGdldER1Y2tBbmRNdXRlVm9sdW1lKCksIGNvbWJpbmVkVm9sdW1lKTsKLSAgICBtVm9sdW1lUmFtcC5zZXRUYXJnZXQoY29tYmluZWRWb2x1bWUpOworICAgIG1GbG93R3JhcGguc2V0VGFyZ2V0Vm9sdW1lKGNvbWJpbmVkVm9sdW1lKTsKICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAppbmRleCA5NzdhOTA5Li5jYWIyOTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKIAogdXNpbmcgYW5kcm9pZDo6c3A7CkBAIC05Myw3ICs5NCw3IEBACiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbUxhc3RGcmFtZXNSZWFkID0gMDsgLy8gdXNlZCB0byBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uCiAKLSAgICBMaW5lYXJSYW1wICAgICAgICAgICAgICAgbVZvbHVtZVJhbXA7CisgICAgQUF1ZGlvRmxvd0dyYXBoICAgICAgICAgIG1GbG93R3JhcGg7CiAKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCmluZGV4IDk1YjUyYmUuLjc0N2QwZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcApAQCAtNjAsMTAgKzYwLDE0IEBACiAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKIH0KIAotYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzU3RhcnRpbmcoKSB7Citib29sIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6aXNTdGFydGluZygpIGNvbnN0IHsKICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1NUQVJUSU5HOwogfQogCitib29sIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6aXNSdW5uaW5nKCkgY29uc3QgeworICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfUlVOTklORzsKK30KKwogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKSB7CiAvLyAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gZnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbmFub1RpbWUgJWxsdSIsCiAvLyAgICAgICAgIChsb25nIGxvbmcpZnJhbWVQb3NpdGlvbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKaW5kZXggNzE4MjM3Ni4uNDZjYTQ4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKQEAgLTM2LDcgKzM2LDE1IEBACiAgICAgdm9pZCBzdGFydChpbnQ2NF90IG5hbm9UaW1lKTsKICAgICB2b2lkIHN0b3AoaW50NjRfdCBuYW5vVGltZSk7CiAKLSAgICBib29sIGlzU3RhcnRpbmcoKTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGlzIHN0YXJ0aW5nIHVwCisgICAgICovCisgICAgYm9vbCBpc1N0YXJ0aW5nKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGlzIHJ1bm5pbmcgYW5kIHByb2R1Y2luZyB2YWxpZCByZXN1bHRzCisgICAgICovCisgICAgYm9vbCBpc1J1bm5pbmcoKSBjb25zdDsKIAogICAgIHZvaWQgcHJvY2Vzc1RpbWVzdGFtcChpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDY0X3QgbmFub1RpbWUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAppbmRleCBkZjBkYjc5Li4wZDcxZWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKQEAgLTE0NiwxNCArMTQ2LDE0IEBACiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKIHsKLSAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoY2hhbm5lbENvdW50KTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShidWlsZGVyLCBjaGFubmVsQ291bnQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKIHsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChidWlsZGVyLCBjaGFubmVsQ291bnQpOworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTE2Nyw3ICsxNjcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRGb3JtYXQoZm9ybWF0KTsKKyAgICAvLyBVc2UgYXVkaW9fZm9ybWF0X3QgZXZlcnl3aGVyZSBpbnRlcm5hbGx5LgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGludGVybmFsRm9ybWF0ID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGZvcm1hdCk7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0Rm9ybWF0KGludGVybmFsRm9ybWF0KTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTIzOSw3ICsyNDEsNyBAQAogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IG51bGxwdHI7CiAgICAgLy8gUGxlYXNlIGxlYXZlIHRoZXNlIGxvZ3MgYmVjYXVzZSB0aGV5IGFyZSB2ZXJ5IGhlbHBmdWwgd2hlbiBkZWJ1Z2dpbmcuCi0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgQUxPR0QoIiVzKCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXyk7CiAgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gQ09NTU9OX0dFVF9GUk9NX0JVSUxERVJfT1JfUkVUVVJOKHN0cmVhbVB0cik7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0cmVhbUJ1aWxkZXItPmJ1aWxkKCZhdWRpb1N0cmVhbSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpIHJldHVybnMgJWQgPSAlcyBmb3IgKCVwKSAtLS0tLS0tLS0tLS0tLS0tIiwKQEAgLTI2Nyw3ICsyNjksNyBAQAogewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fRVJST1JfTlVMTDsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0iLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLSIsIF9fZnVuY19fLCBzdHJlYW0pOwogICAgIGlmIChhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgIHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5zYWZlQ2xvc2UoKTsKICAgICAgICAgLy8gQ2xvc2Ugd2lsbCBvbmx5IGZhaWwgaWYgY2FsbGVkIGlsbGVnYWxseSwgZm9yIGV4YW1wbGUsIGZyb20gYSBjYWxsYmFjay4KQEAgLTI4Miw3ICsyODQsNyBAQAogICAgIC8vIFdlJ3JlIHBvdGVudGlhbGx5IGZyZWVpbmcgYHN0cmVhbWAgYWJvdmUsIHNvIGl0cyB1c2UgaGVyZSBtYWtlcyBzb21lCiAgICAgLy8gc3RhdGljIGFuYWx5c2lzIHRvb2xzIHVuaGFwcHkuIENhc3RpbmcgdG8gdWludHB0cl90IGhlbHBzIGFzc3VyZQogICAgIC8vIHNhaWQgdG9vbHMgdGhhdCB3ZSdyZSBub3QgZG9pbmcgYW55dGhpbmcgYmFkIGhlcmUuCi0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglIyIgUFJJeFBUUiAiKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLAorICAgIEFMT0dEKCIlcyglIyIgUFJJeFBUUiAiKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBfX2Z1bmNfXywKICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oc3RyZWFtKSwgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMjkwLDMxICsyOTIsMzEgQEAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLSIsIHN0cmVhbSk7CisgICAgQUxPR0QoIiVzKCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXywgc3RyZWFtKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnN5c3RlbVN0YXJ0KCk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIHN0cmVhbSwgcmVzdWx0KTsKKyAgICBBTE9HRCgiJXMoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIF9fZnVuY19fLCBzdHJlYW0sIHJlc3VsdCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZSglcCkiLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zeXN0ZW1QYXVzZSgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKCVwKSIsIHN0cmVhbSk7CisgICAgQUxPR0QoIiVzKCVwKSBjYWxsZWQiLCBfX2Z1bmNfXywgc3RyZWFtKTsKICAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnNhZmVGbHVzaCgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCglcCkiLCBzdHJlYW0pOwotICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcCgpOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIHN0cmVhbSk7CisgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zeXN0ZW1TdG9wRnJvbUFwcCgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKEFBdWRpb1N0cmVhbSogc3RyZWFtLApAQCAtNDA4LDcgKzQxMCw5IEBACiBBQVVESU9fQVBJIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICAvLyBVc2UgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxseS4KKyAgICBhdWRpb19mb3JtYXRfdCBpbnRlcm5hbEZvcm1hdCA9IGF1ZGlvU3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGludGVybmFsRm9ybWF0KTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhBQXVkaW9TdHJlYW0qIHN0cmVhbSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAppbmRleCBkNTY3MDFiLi44OGRhNTNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCkBAIC00OCw2ICs0OCwyMCBAQAogICAgIG1JbnB1dFByZXNldCAgICAgPSBvdGhlci5tSW5wdXRQcmVzZXQ7CiB9CiAKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3QgaXNGb3JtYXRWYWxpZChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQsIGF1ZGlvX2Zvcm1hdF90ID0gMHglMDh4IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CisgICAgICAgICAgICAvLyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OnZhbGlkYXRlKCkgY29uc3QgewogICAgIGlmIChtU2FtcGxlc1BlckZyYW1lICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZXNQZXJGcmFtZSA8IFNBTVBMRVNfUEVSX0ZSQU1FX01JTiB8fCBtU2FtcGxlc1BlckZyYW1lID4gU0FNUExFU19QRVJfRlJBTUVfTUFYKSkgewpAQCAtNzksMTYgKzkzLDggQEAKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KIAotICAgIHN3aXRjaCAobUF1ZGlvRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDoKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQgPSAlZCIsIG1BdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwotICAgICAgICAgICAgLy8gYnJlYWs7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBpc0Zvcm1hdFZhbGlkIChtQXVkaW9Gb3JtYXQpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OwogCiAgICAgaWYgKG1TYW1wbGVSYXRlICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZVJhdGUgPCBTQU1QTEVfUkFURV9IWl9NSU4gfHwgbVNhbXBsZVJhdGUgPiBTQU1QTEVfUkFURV9IWl9NQVgpKSB7CkBAIC0xNTIsNiArMTU4LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT046CiAgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjoKICAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEOgorICAgICAgICBjYXNlIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0U6CiAgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBwcmVzZXQgbm90IHZhbGlkID0gJWQiLCBtSW5wdXRQcmVzZXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggY2U1ZGFjZC4uNmJlYjRiMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC01NiwxMSArNTYsMTEgQEAKICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IHNhbXBsZXNQZXJGcmFtZTsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1BdWRpb0Zvcm1hdDsKICAgICB9CiAKLSAgICB2b2lkIHNldEZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQpIHsKKyAgICB2b2lkIHNldEZvcm1hdChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCkgewogICAgICAgICBtQXVkaW9Gb3JtYXQgPSBhdWRpb0Zvcm1hdDsKICAgICB9CiAKQEAgLTEyMCw4ICsxMjAsMTEgQEAKICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGJ5dGVzIHBlciBmcmFtZSBvZiBnZXRGb3JtYXQoKQorICAgICAqLwogICAgIGludDMyX3QgY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGdldFNhbXBsZXNQZXJGcmFtZSgpICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldEZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIGdldFNhbXBsZXNQZXJGcmFtZSgpICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShnZXRGb3JtYXQoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzksNyArMTQyLDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgbVNoYXJpbmdNb2RlICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgICAgICAgICBtRGlyZWN0aW9uICAgICAgID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CiAgICAgYWF1ZGlvX3VzYWdlX3QgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgICAgICBtQ29udGVudFR5cGUgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKaW5kZXggMzU4MDIxYi4uZTM5YTA3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCkBAIC0zNyw3ICszNyw2IEBACiB9CiAKIEF1ZGlvU3RyZWFtOjp+QXVkaW9TdHJlYW0oKSB7Ci0gICAgQUxPR0QoImRlc3Ryb3lpbmcgJXAsIHN0YXRlID0gJXMiLCB0aGlzLCBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRApAQCAtMTIwLDIxICsxMTksMjkgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVTdGFydCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c3lzdGVtU3RhcnQoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworCiAgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKICAgICAgICAgQUxPR0UoIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIGNhbGxiYWNrISIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KLSAgICByZXR1cm4gcmVxdWVzdFN0YXJ0KCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gcmVxdWVzdFN0YXJ0KCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCisgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RhcnQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlUGF1c2UoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVBhdXNlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKwogICAgIGlmICghaXNQYXVzZVN1cHBvcnRlZCgpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKICAgICB9CiAKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CiAgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKICAgICAgICAgQUxPR0UoIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIGNhbGxiYWNrISIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtMTcwLDcgKzE3NywxMiBAQAogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIAotICAgIHJldHVybiByZXF1ZXN0UGF1c2UoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gcmVxdWVzdFBhdXNlKCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCisgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+cGF1c2UoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlRmx1c2goKSB7CkBAIC0xOTMsMTIgKzIwNSwzMSBAQAogICAgIHJldHVybiByZXF1ZXN0Rmx1c2goKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RvcCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c3lzdGVtU3RvcEZyb21DYWxsYmFjaygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNhZmVTdG9wKCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCisgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RvcCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVN0b3BGcm9tQXBwKCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKICAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgewotICAgICAgICBBTE9HRSgic3RyZWFtIGNhbm5vdCBiZSBzdG9wcGVkIGZyb20gYSBjYWxsYmFjayEiKTsKKyAgICAgICAgQUxPR0UoInN0cmVhbSBjYW5ub3QgYmUgc3RvcHBlZCBieSBjYWxsaW5nIGZyb20gYSBjYWxsYmFjayEiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2FmZVN0b3AoKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBXZSBvbmx5IGNhbGwgdGhpcyBmb3IgbG9nZ2luZyBpbiAiZHVtcHN5cyBhdWRpbyIuIFNvIGlnbm9yZSByZXR1cm4gY29kZS4KKyAgICAgICAgKHZvaWQpIG1QbGF5ZXJCYXNlLT5zdG9wKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0b3AoKSB7CiAKICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKICAgICAgICAgLy8gUHJvY2VlZCB3aXRoIHN0b3BwaW5nLgpAQCAtMjI1LDcgKzI1Niw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HOgogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEOgogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coInJlcXVlc3RTdG9wKCkgc3RyZWFtIG5vdCBydW5uaW5nLCBzdGF0ZSA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcygpIHN0cmVhbSBub3QgcnVubmluZywgc3RhdGUgPSAlcyIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQpAQCAtMzUwLDIxICszODEsMzMgQEAKICAgICB9CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcyBfX3VudXNlZCkKIHsKICAgICBpZiAoIW1IYXNUaHJlYWQpIHsKICAgICAgICAgQUxPR0UoImpvaW5UaHJlYWQoKSAtIGJ1dCBoYXMgbm8gdGhyZWFkIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICAvLyBJZiB0aGUgY2FsbGJhY2sgaXMgc3RvcHBpbmcgdGhlIHN0cmVhbSBiZWNhdXNlIHRoZSBhcHAgcGFzc2VkIGJhY2sgU1RPUAorICAgIC8vIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBqb2luKCkuIFRoZSB0aHJlYWQgaXMgYWxyZWFkeSBhYm91dCB0byBleGl0LgorICAgIGlmIChwdGhyZWFkX3NlbGYoKSAhPSBtVGhyZWFkKSB7CisgICAgICAgIC8vIENhbGxlZCBmcm9tIGFuIGFwcCB0aHJlYWQuIE5vdCB0aGUgY2FsbGJhY2suCiAjaWYgMAotICAgIC8vIFRPRE8gaW1wbGVtZW50IGVxdWl2YWxlbnQgb2YgcHRocmVhZF90aW1lZGpvaW5fbnAoKQotICAgIHN0cnVjdCB0aW1lc3BlYyBhYnN0aW1lOwotICAgIGludCBlcnIgPSBwdGhyZWFkX3RpbWVkam9pbl9ucChtVGhyZWFkLCByZXR1cm5BcmcsICZhYnN0aW1lKTsKKyAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQgZXF1aXZhbGVudCBvZiBwdGhyZWFkX3RpbWVkam9pbl9ucCgpCisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyBhYnN0aW1lOworICAgICAgICBpbnQgZXJyID0gcHRocmVhZF90aW1lZGpvaW5fbnAobVRocmVhZCwgcmV0dXJuQXJnLCAmYWJzdGltZSk7CiAjZWxzZQotICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgcmV0dXJuQXJnKTsKKyAgICAgICAgaW50IGVyciA9IHB0aHJlYWRfam9pbihtVGhyZWFkLCByZXR1cm5BcmcpOwogI2VuZGlmCisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIHB0aHJlYWRfam9pbigpIHJldHVybnMgZXJyID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnIpOworICAgICAgICB9CisgICAgfQorICAgIC8vIFRoaXMgbXVzdCBiZSBzZXQgZmFsc2Ugc28gdGhhdCB0aGUgY2FsbGJhY2sgdGhyZWFkIGNhbiBiZSBjcmVhdGVkCisgICAgLy8gd2hlbiB0aGUgc3RyZWFtIGlzIHJlc3RhcnRlZC4KICAgICBtSGFzVGhyZWFkID0gZmFsc2U7Ci0gICAgcmV0dXJuIGVyciA/IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnJubykgOiBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0OworICAgIHJldHVybiAocmVzdWx0ICE9IEFBVURJT19PSykgPyByZXN1bHQgOiBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0OwogfQogCiBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6bWF5YmVDYWxsRGF0YUNhbGxiYWNrKHZvaWQgKmF1ZGlvRGF0YSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKaW5kZXggMzFiODk1Yy4uNDY5NTFmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKQEAgLTUxLDIxICs1MSw2IEBACiAKICAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbSgpOwogCi0gICAgLyoqCi0gICAgICogTG9jayBhIG11dGV4IGFuZCBtYWtlIHN1cmUgd2UgYXJlIG5vdCBjYWxsaW5nIGZyb20gYSBjYWxsYmFjayBmdW5jdGlvbi4KLSAgICAgKiBAcmV0dXJuIHJlc3VsdCBvZiByZXF1ZXN0U3RhcnQoKTsKLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0YXJ0KCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVBhdXNlKCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUZsdXNoKCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0b3AoKTsKLQotICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlQ2xvc2UoKTsKLQotICAgIC8vID09PT09PT09PT09IEJlZ2luIEFCU1RSQUNUIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09CiBwcm90ZWN0ZWQ6CiAKICAgICAvKiBBc3luY2hyb25vdXMgcmVxdWVzdHMuCkBAIC03NCw3ICs1OSw3IEBACiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0YXJ0KCkgPSAwOwogCiAgICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHN0YXRlIHRvIHNlZSBpZiBQYXVzZSBpZiBjdXJyZW50bHkgbGVnYWwuCisgICAgICogQ2hlY2sgdGhlIHN0YXRlIHRvIHNlZSBpZiBQYXVzZSBpcyBjdXJyZW50bHkgbGVnYWwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcmVzdWx0IHBvaW50ZXIgdG8gcmV0dXJuIGNvZGUKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgT0sgdG8gY29udGludWUsIGlmIGZhbHNlIHRoZW4gcmV0dXJuIHJlc3VsdApAQCAtMTkyLDcgKzE3Nyw3IEBACiAgICAgICAgIHJldHVybiBtU2FtcGxlUmF0ZTsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSAgY29uc3QgewogICAgICAgICByZXR1cm4gbUZvcm1hdDsKICAgICB9CiAKQEAgLTI0OSwyMSArMjM0LDE0IEBACiAgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldEZvcm1hdCgpIGhhcyBiZWVuIGNhbGxlZC4KICAgICAgKi8KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyU2FtcGxlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKG1Gb3JtYXQpOworICAgICAgICByZXR1cm4gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0U2FtcGxlc1BlckZyYW1lKCkgYW5kIHNldERldmljZUZvcm1hdCgpIGhhdmUgYmVlbiBjYWxsZWQuCiAgICAgICovCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlckRldmljZUZyYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZSAqIGdldEJ5dGVzUGVyRGV2aWNlU2FtcGxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldERldmljZUZvcm1hdCgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgKi8KLSAgICBpbnQzMl90IGdldEJ5dGVzUGVyRGV2aWNlU2FtcGxlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldERldmljZUZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIGdldFNhbXBsZXNQZXJGcmFtZSgpICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShnZXREZXZpY2VGb3JtYXQoKSk7CiAgICAgfQogCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSA9IDA7CkBAIC0zNjMsMzMgKzM0MSwyOCBAQAogICAgICAgICBtUGxheWVyQmFzZS0+dW5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKICAgICB9CiAKLSAgICAvLyBQYXNzIHN0YXJ0IHJlcXVlc3QgdGhyb3VnaCBQbGF5ZXJCYXNlIGZvciB0cmFja2luZy4KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RhcnQoKSB7Ci0gICAgICAgIG1QbGF5ZXJCYXNlLT5zdGFydCgpOwotICAgICAgICAvLyBQYXNzIGFhdWRpb19yZXN1bHRfdCBhcm91bmQgdGhlIFBsYXllckJhc2UgaW50ZXJmYWNlLCB3aGljaCB1c2VzIHN0YXR1c19fdC4KLSAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0YXJ0KCk7CiAKLSAgICAvLyBQYXNzIHBhdXNlIHJlcXVlc3QgdGhyb3VnaCBQbGF5ZXJCYXNlIGZvciB0cmFja2luZy4KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtUGF1c2UoKSB7Ci0gICAgICAgIG1QbGF5ZXJCYXNlLT5wYXVzZSgpOwotICAgICAgICByZXR1cm4gbVBsYXllckJhc2UtPmdldFJlc3VsdCgpOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtUGF1c2UoKTsKIAotICAgIC8vIFBhc3Mgc3RvcCByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0b3AoKSB7Ci0gICAgICAgIG1QbGF5ZXJCYXNlLT5zdG9wKCk7Ci0gICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlRmx1c2goKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gYXBwIGNhbGxzIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpOworICAgICAqIEl0IHByZXZlbnRzIGNhbGxzIGZyb20gYSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RvcEZyb21BcHAoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIGludGVybmFsbHkgd2hlbiBhbiBhcHAgY2FsbGJhY2sgcmV0dXJucyBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AuCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlQ2xvc2UoKTsKIAogcHJvdGVjdGVkOgogCi0gICAgLy8gUGxheWVyQmFzZSBhbGxvd3MgdGhlIHN5c3RlbSB0byBjb250cm9sIHRoZSBzdHJlYW0uCi0gICAgLy8gQ2FsbGluZyB0aHJvdWdoIFBsYXllckJhc2UtPnN0YXJ0KCkgbm90aWZpZXMgdGhlIEF1ZGlvTWFuYWdlciBvZiB0aGUgcGxheWVyIHN0YXRlLgotICAgIC8vIFRoZSBBdWRpb01hbmFnZXIgYWxzbyBjYW4gc3RhcnQvc3RvcCBhIHN0cmVhbSBieSBjYWxsaW5nIG1QbGF5ZXJCYXNlLT5wbGF5ZXJTdGFydCgpLgotICAgIC8vIHN5c3RlbVN0YXJ0KCkgPT0+IG1QbGF5ZXJCYXNlLT5zdGFydCgpICAgbVBsYXllckJhc2UtPnBsYXllclN0YXJ0KCkgPT0+IHJlcXVlc3RTdGFydCgpCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLSBBdWRpb01hbmFnZXIgLS0tLS0tLQorICAgIC8vIFBsYXllckJhc2UgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY29udHJvbCB0aGUgc3RyZWFtIHZvbHVtZS4KICAgICBjbGFzcyBNeVBsYXllckJhc2UgOiBwdWJsaWMgYW5kcm9pZDo6UGxheWVyQmFzZSB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCBNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCk7CkBAIC00MTMsMjAgKzM4NiwxOSBAQAogCiAgICAgICAgIHZvaWQgY2xlYXJQYXJlbnRSZWZlcmVuY2UoKSB7IG1QYXJlbnQgPSBudWxscHRyOyB9CiAKKyAgICAgICAgLy8gSnVzdCBhIHN0dWIuIFRoZSBhYmlsaXR5IHRvIHN0YXJ0IGF1ZGlvIHRocm91Z2ggUGxheWVyQmFzZSBpcyBiZWluZyBkZXByZWNhdGVkLgogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTdGFydCgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIC8vIG1QYXJlbnQgc2hvdWxkIE5PVCBiZSBudWxsLiBTbyBnbyBhaGVhZCBhbmQgY3Jhc2ggaWYgaXQgaXMuCi0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVN0YXJ0KCk7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBKdXN0IGEgc3R1Yi4gVGhlIGFiaWxpdHkgdG8gcGF1c2UgYXVkaW8gdGhyb3VnaCBQbGF5ZXJCYXNlIGlzIGJlaW5nIGRlcHJlY2F0ZWQuCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclBhdXNlKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVQYXVzZSgpOwotICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gSnVzdCBhIHN0dWIuIFRoZSBhYmlsaXR5IHRvIHN0b3AgYXVkaW8gdGhyb3VnaCBQbGF5ZXJCYXNlIGlzIGJlaW5nIGRlcHJlY2F0ZWQuCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclN0b3AoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVN0b3AoKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclNldFZvbHVtZSgpIG92ZXJyaWRlIHsKQEAgLTQ3OCwxOCArNDUwLDE4IEBACiAgICAgLyoqCiAgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCiAgICAgICovCi0gICAgdm9pZCBzZXRGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHZvaWQgc2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewogICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgICAqLwotICAgIHZvaWQgc2V0RGV2aWNlRm9ybWF0KGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICB2b2lkIHNldERldmljZUZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgbURldmljZUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0RGV2aWNlRm9ybWF0KCkgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldERldmljZUZvcm1hdCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1EZXZpY2VGb3JtYXQ7CiAgICAgfQogCkBAIC01NTUsNiArNTI3LDggQEAKIAogcHJpdmF0ZToKIAorICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlU3RvcCgpOworCiAgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgbVN0cmVhbUxvY2s7CiAKICAgICBjb25zdCBhbmRyb2lkOjpzcDxNeVBsYXllckJhc2U+ICAgbVBsYXllckJhc2U7CkBAIC01NjUsNyArNTM5LDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgICBtU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGZhbHNlOyAvLyBtdXN0IG1hdGNoIHNoYXJpbmcgbW9kZSByZXF1ZXN0ZWQKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgICAgICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgICBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKIApAQCAtNTc3LDcgKzU1MSw3IEBACiAKICAgICAvLyBTb21ldGltZXMgdGhlIGhhcmR3YXJlIGlzIG9wZXJhdGluZyB3aXRoIGEgZGlmZmVyZW50IGZvcm1hdCBmcm9tIHRoZSBhcHAuCiAgICAgLy8gVGhlbiB3ZSByZXF1aXJlIGNvbnZlcnNpb24gaW4gQUF1ZGlvLgotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICBtRGV2aWNlRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogCiAgICAgLy8gY2FsbGJhY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKaW5kZXggYjA5MjU4ZS4uZjUxMTNmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcApAQCAtMjMsMzAgKzIzLDI2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJCYXNlLmgiCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJGaWZvQ29udHJvbGxlckluZGlyZWN0LmgiCiAjaW5jbHVkZSAiRmlmb0J1ZmZlci5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKK3VzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXI7Cit1c2luZyBhbmRyb2lkOjpmaWZvX2ZyYW1lc190OwogCiBGaWZvQnVmZmVyOjpGaWZvQnVmZmVyKGludDMyX3QgYnl0ZXNQZXJGcmFtZSwgZmlmb19mcmFtZXNfdCBjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICA6IG1GcmFtZUNhcGFjaXR5KGNhcGFjaXR5SW5GcmFtZXMpCi0gICAgICAgICwgbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKLSAgICAgICAgLCBtU3RvcmFnZShudWxscHRyKQotICAgICAgICAsIG1GcmFtZXNSZWFkQ291bnQoMCkKLSAgICAgICAgLCBtRnJhbWVzVW5kZXJydW5Db3VudCgwKQotICAgICAgICAsIG1VbmRlcnJ1bkNvdW50KDApCisgICAgICAgIDogbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKIHsKLSAgICAvLyBUT0RPIEhhbmRsZSBwb3NzaWJsZSBmYWlsdXJlcyB0byBhbGxvY2F0ZS4gTW92ZSBvdXQgb2YgY29uc3RydWN0b3I/Ci0gICAgbUZpZm8gPSBuZXcgRmlmb0NvbnRyb2xsZXIoY2FwYWNpdHlJbkZyYW1lcywgY2FwYWNpdHlJbkZyYW1lcyk7CisgICAgbUZpZm8gPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9Db250cm9sbGVyPihjYXBhY2l0eUluRnJhbWVzLCBjYXBhY2l0eUluRnJhbWVzKTsKICAgICAvLyBhbGxvY2F0ZSBidWZmZXIKICAgICBpbnQzMl90IGJ5dGVzUGVyQnVmZmVyID0gYnl0ZXNQZXJGcmFtZSAqIGNhcGFjaXR5SW5GcmFtZXM7CiAgICAgbVN0b3JhZ2UgPSBuZXcgdWludDhfdFtieXRlc1BlckJ1ZmZlcl07CiAgICAgbVN0b3JhZ2VPd25lZCA9IHRydWU7Ci0gICAgQUxPR1YoImNhcGFjaXR5SW5GcmFtZXMgPSAlZCwgYnl0ZXNQZXJGcmFtZSA9ICVkIiwKLSAgICAgICAgICBjYXBhY2l0eUluRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKKyAgICBBTE9HVigiJXMoKSBjYXBhY2l0eUluRnJhbWVzID0gJWQsIGJ5dGVzUGVyRnJhbWUgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGNhcGFjaXR5SW5GcmFtZXMsIGJ5dGVzUGVyRnJhbWUpOwogfQogCiBGaWZvQnVmZmVyOjpGaWZvQnVmZmVyKCBpbnQzMl90ICAgYnl0ZXNQZXJGcmFtZSwKQEAgLTU1LDE0ICs1MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QgKiAgd3JpdGVJbmRleEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogIGRhdGFTdG9yYWdlQWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICA6IG1GcmFtZUNhcGFjaXR5KGNhcGFjaXR5SW5GcmFtZXMpCi0gICAgICAgICwgbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKKyAgICAgICAgOiBtQnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKQogICAgICAgICAsIG1TdG9yYWdlKHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZGF0YVN0b3JhZ2VBZGRyZXNzKSkKLSAgICAgICAgLCBtRnJhbWVzUmVhZENvdW50KDApCi0gICAgICAgICwgbUZyYW1lc1VuZGVycnVuQ291bnQoMCkKLSAgICAgICAgLCBtVW5kZXJydW5Db3VudCgwKQogewotICAgIG1GaWZvID0gbmV3IEZpZm9Db250cm9sbGVySW5kaXJlY3QoY2FwYWNpdHlJbkZyYW1lcywKKyAgICBtRmlmbyA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0NvbnRyb2xsZXJJbmRpcmVjdD4oY2FwYWNpdHlJbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkSW5kZXhBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJbmRleEFkZHJlc3MpOwpAQCAtNzMsMTAgKzY1LDggQEAKICAgICBpZiAobVN0b3JhZ2VPd25lZCkgewogICAgICAgICBkZWxldGVbXSBtU3RvcmFnZTsKICAgICB9Ci0gICAgZGVsZXRlIG1GaWZvOwogfQogCi0KIGludDMyX3QgRmlmb0J1ZmZlcjo6Y29udmVydEZyYW1lc1RvQnl0ZXMoZmlmb19mcmFtZXNfdCBmcmFtZXMpIHsKICAgICByZXR1cm4gZnJhbWVzICogbUJ5dGVzUGVyRnJhbWU7CiB9CkBAIC04NywxMSArNzcsMTIgQEAKICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVsxXSA9IG51bGxwdHI7CiAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1sxXSA9IDA7CiAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA+IDApIHsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBjYXBhY2l0eSA9IG1GaWZvLT5nZXRDYXBhY2l0eSgpOwogICAgICAgICB1aW50OF90ICpzb3VyY2UgPSAmbVN0b3JhZ2VbY29udmVydEZyYW1lc1RvQnl0ZXMoc3RhcnRJbmRleCldOwogICAgICAgICAvLyBEb2VzIHRoZSBhdmFpbGFibGUgZGF0YSBjcm9zcyB0aGUgZW5kIG9mIHRoZSBGSUZPPwotICAgICAgICBpZiAoKHN0YXJ0SW5kZXggKyBmcmFtZXNBdmFpbGFibGUpID4gbUZyYW1lQ2FwYWNpdHkpIHsKKyAgICAgICAgaWYgKChzdGFydEluZGV4ICsgZnJhbWVzQXZhaWxhYmxlKSA+IGNhcGFjaXR5KSB7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVswXSA9IHNvdXJjZTsKLSAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZmlyc3RGcmFtZXMgPSBtRnJhbWVDYXBhY2l0eSAtIHN0YXJ0SW5kZXg7CisgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gY2FwYWNpdHkgLSBzdGFydEluZGV4OwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1swXSA9IGZpcnN0RnJhbWVzOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSAmbVN0b3JhZ2VbMF07CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzFdID0gZnJhbWVzQXZhaWxhYmxlIC0gZmlyc3RGcmFtZXM7CkBAIC0xMDcsNyArOTgsOCBAQAogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEZ1bGxEYXRhQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikgewogICAgIC8vIFRoZSBGSUZPIG1pZ2h0IGJlIG92ZXJmdWxsIHNvIGNsaXAgdG8gY2FwYWNpdHkuCi0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpLCBtRnJhbWVDYXBhY2l0eSk7CisgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpZm8tPmdldENhcGFjaXR5KCkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRSZWFkSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKQEAgLTExNSw3ICsxMDcsOCBAQAogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEVtcHR5Um9vbUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpIHsKICAgICAvLyBUaGUgRklGTyBtaWdodCBoYXZlIHVuZGVycnVuIHNvIGNsaXAgdG8gY2FwYWNpdHkuCi0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOworICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlmby0+Z2V0Q2FwYWNpdHkoKSk7CiAgICAgZmlmb19mcmFtZXNfdCBzdGFydEluZGV4ID0gbUZpZm8tPmdldFdyaXRlSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKQEAgLTE4MywyMyArMTc2LDYgQEAKICAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKIH0KIAotZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpyZWFkTm93KHZvaWQgKmJ1ZmZlciwgZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKLSAgICBtTGFzdFJlYWRTaXplID0gbnVtRnJhbWVzOwotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1JlYWQgPSByZWFkKGJ1ZmZlciwgbnVtRnJhbWVzKTsKLSAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7Ci0gICAgbUZyYW1lc1JlYWRDb3VudCArPSBmcmFtZXNSZWFkOwotICAgIG1GcmFtZXNVbmRlcnJ1bkNvdW50ICs9IGZyYW1lc0xlZnQ7Ci0gICAgLy8gWmVybyBvdXQgYW55IHNhbXBsZXMgd2UgY291bGQgbm90IHNldC4KLSAgICBpZiAoZnJhbWVzTGVmdCA+IDApIHsKLSAgICAgICAgbVVuZGVycnVuQ291bnQrKzsKLSAgICAgICAgaW50MzJfdCBieXRlc1RvWmVybyA9IGNvbnZlcnRGcmFtZXNUb0J5dGVzKGZyYW1lc0xlZnQpOwotICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBieXRlc1RvWmVybyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZyYW1lc1JlYWQ7Ci19Ci0KIGZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6Z2V0VGhyZXNob2xkKCkgewogICAgIHJldHVybiBtRmlmby0+Z2V0VGhyZXNob2xkKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAppbmRleCBmNWE5ZTI3Li4wZDE4OGM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgRklGT19GSUZPX0JVRkZFUl9ICiAjZGVmaW5lIEZJRk9fRklGT19CVUZGRVJfSAogCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJCYXNlLmgiCkBAIC03NywyNCArNzgsMTIgQEAKICAgICAgKi8KICAgICBmaWZvX2ZyYW1lc190IGdldEVtcHR5Um9vbUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpOwogCi0gICAgLyoqCi0gICAgICogQ29weSBkYXRhIGZyb20gdGhlIEZJRk8gaW50byB0aGUgYnVmZmVyLgotICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGZpZm9fZnJhbWVzX3QgcmVhZE5vdyh2b2lkICpidWZmZXIsIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKTsKLQotICAgIGludDY0X3QgZ2V0TmV4dFJlYWRUaW1lKGludDMyX3QgZnJhbWVSYXRlKTsKLQotICAgIGludDMyX3QgZ2V0VW5kZXJydW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1VbmRlcnJ1bkNvdW50OyB9Ci0KLSAgICBGaWZvQ29udHJvbGxlckJhc2UgKmdldEZpZm9Db250cm9sbGVyQmFzZSgpIHsgcmV0dXJuIG1GaWZvOyB9Ci0KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyRnJhbWUoKSB7CiAgICAgICAgIHJldHVybiBtQnl0ZXNQZXJGcmFtZTsKICAgICB9CiAKKyAgICAvLyBQcm94eSBtZXRob2RzIGZvciB0aGUgaW50ZXJuYWwgRmlmb0NvbnRyb2xsZXIKKwogICAgIGZpZm9fY291bnRlcl90IGdldFJlYWRDb3VudGVyKCkgewogICAgICAgICByZXR1cm4gbUZpZm8tPmdldFJlYWRDb3VudGVyKCk7CiAgICAgfQpAQCAtMTExLDYgKzEwMCwyMiBAQAogICAgICAgICBtRmlmby0+c2V0V3JpdGVDb3VudGVyKG4pOwogICAgIH0KIAorICAgIHZvaWQgYWR2YW5jZVJlYWRJbmRleChmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgICAgICBtRmlmby0+YWR2YW5jZVJlYWRJbmRleChudW1GcmFtZXMpOworICAgIH0KKworICAgIHZvaWQgYWR2YW5jZVdyaXRlSW5kZXgoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgbUZpZm8tPmFkdmFuY2VXcml0ZUluZGV4KG51bUZyYW1lcyk7CisgICAgfQorCisgICAgZmlmb19mcmFtZXNfdCBnZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIH0KKworICAgIGZpZm9fZnJhbWVzX3QgZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgfQorCiAgICAgLyoKICAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IGNhbGxlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyB1c2VkLgogICAgICAqLwpAQCAtMTIxLDE1ICsxMjYsMTIgQEAKICAgICB2b2lkIGZpbGxXcmFwcGluZ0J1ZmZlcihXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUsIGludDMyX3Qgc3RhcnRJbmRleCk7CiAKLSAgICBjb25zdCBmaWZvX2ZyYW1lc190IG1GcmFtZUNhcGFjaXR5OwotICAgIGNvbnN0IGludDMyX3QgbUJ5dGVzUGVyRnJhbWU7Ci0gICAgdWludDhfdCAqbVN0b3JhZ2U7Ci0gICAgYm9vbCBtU3RvcmFnZU93bmVkOyAvLyBkaWQgdGhpcyBvYmplY3QgYWxsb2NhdGUgdGhlIHN0b3JhZ2U/Ci0gICAgRmlmb0NvbnRyb2xsZXJCYXNlICptRmlmbzsKLSAgICBmaWZvX2NvdW50ZXJfdCBtRnJhbWVzUmVhZENvdW50OwotICAgIGZpZm9fY291bnRlcl90IG1GcmFtZXNVbmRlcnJ1bkNvdW50OwotICAgIGludDMyX3QgbVVuZGVycnVuQ291bnQ7IC8vIG5lZWQ/IGp1c3QgdXNlIGZyYW1lcwotICAgIGludDMyX3QgbUxhc3RSZWFkU2l6ZTsKKyAgICBjb25zdCBpbnQzMl90ICAgICAgICAgICAgIG1CeXRlc1BlckZyYW1lOworICAgIC8vIFdlIGRvIG5vdCB1c2UgYSBzdGQ6OnVuaXF1ZV9wdHIgZm9yIG1TdG9yYWdlIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gYSBwb2ludGVyIHRvCisgICAgLy8gbWVtb3J5IHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyBhbmQgY2Fubm90IGJlIGRlbGV0ZWQgdHJpdmlhbGx5LgorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAqbVN0b3JhZ2UgPSBudWxscHRyOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgbVN0b3JhZ2VPd25lZCA9IGZhbHNlOyAvLyBkaWQgdGhpcyBvYmplY3QgYWxsb2NhdGUgdGhlIHN0b3JhZ2U/CisgICAgc3RkOjp1bmlxdWVfcHRyPEZpZm9Db250cm9sbGVyQmFzZT4gbUZpZm97fTsKIH07CiAKIH0gIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKaW5kZXggNzlkOThhMS4uMDU3YTk0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKIGNsYXNzIEZpZm9Db250cm9sbGVyIDogcHVibGljIEZpZm9Db250cm9sbGVyQmFzZQogewogcHVibGljOgotICAgIEZpZm9Db250cm9sbGVyKGZpZm9fY291bnRlcl90IGJ1ZmZlclNpemUsIGZpZm9fY291bnRlcl90IHRocmVzaG9sZCkKKyAgICBGaWZvQ29udHJvbGxlcihmaWZvX2ZyYW1lc190IGJ1ZmZlclNpemUsIGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKQogICAgIDogRmlmb0NvbnRyb2xsZXJCYXNlKGJ1ZmZlclNpemUsIHRocmVzaG9sZCkKICAgICAsIG1SZWFkQ291bnRlcigwKQogICAgICwgbVdyaXRlQ291bnRlcigwKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcAppbmRleCA1MWE4ZTM0Li42NmUyNDdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcApAQCAtNTksNSArNTksMTAgQEAKIH0KIAogdm9pZCBGaWZvQ29udHJvbGxlckJhc2U6OnNldFRocmVzaG9sZChmaWZvX2ZyYW1lc190IHRocmVzaG9sZCkgeworICAgIGlmICh0aHJlc2hvbGQgPiBtQ2FwYWNpdHkpIHsKKyAgICAgICAgdGhyZXNob2xkID0gbUNhcGFjaXR5OworICAgIH0gZWxzZSBpZiAodGhyZXNob2xkIDwgMCkgeworICAgICAgICB0aHJlc2hvbGQgPSAwOworICAgIH0KICAgICBtVGhyZXNob2xkID0gdGhyZXNob2xkOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCmluZGV4IDY0YWY3NzcuLjFlZGI4YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKQEAgLTEwMiw2ICsxMDIsOSBAQAogICAgIC8qKgogICAgICAqIFlvdSBjYW4gcmVxdWVzdCB0aGF0IHRoZSBidWZmZXIgbm90IGJlIGZpbGxlZCBhYm92ZSBhIG1heGltdW0KICAgICAgKiBudW1iZXIgb2YgZnJhbWVzLgorICAgICAqCisgICAgICogVGhlIHRocmVzaG9sZCB3aWxsIGJlIGNsaXBwZWQgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqCiAgICAgICogQHBhcmFtIHRocmVzaG9sZCBlZmZlY3RpdmUgc2l6ZSBvZiB0aGUgYnVmZmVyCiAgICAgICovCiAgICAgdm9pZCBzZXRUaHJlc2hvbGQoZmlmb19mcmFtZXNfdCB0aHJlc2hvbGQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2N2ZkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9Qcm9jZXNzb3JCYXNlOjpwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaWYgKGZyYW1lUG9zaXRpb24gPiBtTGFzdEZyYW1lUG9zaXRpb24pIHsKKyAgICAgICAgbUxhc3RGcmFtZVBvc2l0aW9uID0gZnJhbWVQb3NpdGlvbjsKKyAgICAgICAgbUZyYW1lc1ZhbGlkID0gb25Qcm9jZXNzKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgfQorICAgIHJldHVybiBtRnJhbWVzVmFsaWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitBdWRpb0Zsb2F0QmxvY2tQb3J0OjpBdWRpb0Zsb2F0QmxvY2tQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2spCisgICAgICAgIDogQXVkaW9Qb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAsIG1GcmFtZXNQZXJCbG9jayhmcmFtZXNQZXJCbG9jaykKKyAgICAgICAgLCBtU2FtcGxlQmxvY2soTlVMTCkgeworICAgIGludDMyX3QgbnVtRmxvYXRzID0gZnJhbWVzUGVyQmxvY2sgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBtU2FtcGxlQmxvY2sgPSBuZXcgZmxvYXRbbnVtRmxvYXRzXXswLjBmfTsKK30KKworQXVkaW9GbG9hdEJsb2NrUG9ydDo6fkF1ZGlvRmxvYXRCbG9ja1BvcnQoKSB7CisgICAgZGVsZXRlW10gbVNhbXBsZUJsb2NrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIG51bUZyYW1lcyA9IHN0ZDo6bWluKGdldEZyYW1lc1BlckJsb2NrKCksIG51bUZyYW1lcyk7CisgICAgcmV0dXJuIG1QYXJlbnQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKK30KKworLy8gVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgLmNwcCBmaWxlIGJlY2F1c2Ugb2YgZm9yd2FyZCBjcm9zcyByZWZlcmVuY2VzLgordm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6Y29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7CisgICAgcG9ydC0+Y29ubmVjdCh0aGlzKTsKK30KKwordm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6ZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7CisgICAgcG9ydC0+ZGlzY29ubmVjdCh0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9GbG9hdElucHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIHJldHVybiAobUNvbm5lY3RlZCA9PSBOVUxMKQorICAgICAgICAgICAgPyBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCbG9jaygpLCBudW1GcmFtZXMpCisgICAgICAgICAgICA6IG1Db25uZWN0ZWQtPnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Cit9CisKK2Zsb2F0ICpBdWRpb0Zsb2F0SW5wdXRQb3J0OjpnZXRCbG9jaygpIHsKKyAgICBpZiAobUNvbm5lY3RlZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBdWRpb0Zsb2F0QmxvY2tQb3J0OjpnZXRCbG9jaygpOyAvLyBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGVkLT5nZXRCbG9jaygpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9TaW5rOjpwdWxsKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBhY3R1YWxGcmFtZXMgPSBpbnB1dC5wdWxsRGF0YShtRnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICBtRnJhbWVQb3NpdGlvbiArPSBhY3R1YWxGcmFtZXM7CisgICAgcmV0dXJuIGFjdHVhbEZyYW1lczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYTQ2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaApAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEF1ZGlvUHJvY2Vzc29yQmFzZS5oCisgKgorICogQXVkaW8gcHJvY2Vzc2luZyBub2RlIGFuZCBwb3J0cyB0aGF0IGNhbiBiZSB1c2VkIGluIGEgc2ltcGxlIGRhdGEgZmxvdyBncmFwaC4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9ICisjZGVmaW5lIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLy8gVE9ETyBjb25zaWRlciBwdWJsaXNoaW5nIGFsbCBoZWFkZXIgZmlsZXMgdW5kZXIgImluY2x1ZGUvbGliYWF1ZGlvL0Zsb3dHcmFwaC5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworLy8gRGVmYXVsdCBibG9jayBzaXplIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gd2hlbiB0aGUgQXVkaW9GbG9hdEJsb2NrUG9ydCBpcyBjcmVhdGVkLgorLy8gSWYgaXQgaXMgdG9vIHNtYWxsIHRoZW4gd2Ugd2lsbCBoYXZlIHRvbyBtdWNoIG92ZXJoZWFkIGZyb20gc3dpdGNoaW5nIGJldHdlZW4gbm9kZXMuCisvLyBJZiBpdCBpcyB0b28gaGlnaCB0aGVuIHdlIHdpbGwgdGhyYXNoIHRoZSBjYWNoZXMuCitjb25zdGV4cHIgaW50IGtEZWZhdWx0QmxvY2tTaXplID0gODsgLy8gYXJiaXRyYXJ5CisKK2NsYXNzIEF1ZGlvRmxvYXRJbnB1dFBvcnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfkF1ZGlvUHJvY2Vzc29yQmFzZSgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gY3VzdG9tIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIG51bUZyYW1lcyBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcmVxdWVzdGVkIGZvciBwcm9jZXNzaW5nCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAorICAgICAqLworICAgIHZpcnR1YWwgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgPSAwOworCisgICAgLyoqCisgICAgICogSWYgdGhlIGZyYW1lUG9zaXRpb24gaXMgYXQgb3IgYWZ0ZXIgdGhlIGxhc3QgZnJhbWUgcG9zaXRpb24gdGhlbiBjYWxsIG9uUHJvY2VzcygpLgorICAgICAqIFRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIGluIGNhc2Ugb2YgY3ljbGljIGdyYXBocy4KKyAgICAgKiBJdCBhbHNvIHByZXZlbnRzIG5vZGVzIHVwc3RyZWFtIGZyb20gYSBicmFuY2ggZnJvbSBiZWluZyBleGVjdXRlZCB0d2ljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCitwcm90ZWN0ZWQ6CisgICAgaW50NjRfdCAgbUxhc3RGcmFtZVBvc2l0aW9uID0gLTE7IC8vIFN0YXJ0IGF0IC0xIHNvIHRoYXQgdGhlIGZpcnN0IHB1bGwgd29ya3MuCisKK3ByaXZhdGU6CisgICAgaW50MzJfdCAgbUZyYW1lc1ZhbGlkID0gMDsgLy8gbnVtIHZhbGlkIGZyYW1lcyBpbiB0aGUgYmxvY2sKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBUaGlzIGlzIGEgY29ubmVjdG9yIHRoYXQgYWxsb3dzIGRhdGEgdG8gZmxvdyBiZXR3ZWVuIG1vZHVsZXMuCisgICovCitjbGFzcyBBdWRpb1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IG1QYXJlbnQocGFyZW50KQorICAgICAgICAgICAgLCBtU2FtcGxlc1BlckZyYW1lKHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIC8vIFBvcnRzIGFyZSBvZnRlbiBkZWNsYXJlZCBwdWJsaWMuIFNvIGxldCdzIG1ha2UgdGhlbSBub24tY29weWFibGUuCisgICAgQXVkaW9Qb3J0KGNvbnN0IEF1ZGlvUG9ydCYpID0gZGVsZXRlOworICAgIEF1ZGlvUG9ydCYgb3BlcmF0b3I9KGNvbnN0IEF1ZGlvUG9ydCYpID0gZGVsZXRlOworCisgICAgaW50MzJfdCBnZXRTYW1wbGVzUGVyRnJhbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEF1ZGlvUHJvY2Vzc29yQmFzZSAmbVBhcmVudDsKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQzMl90ICAgIG1TYW1wbGVzUGVyRnJhbWUgPSAxOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogVGhpcyBwb3J0IGNvbnRhaW5zIGEgZmxvYXQgdHlwZSBidWZmZXIuCisgKiBUaGUgc2l6ZSBpcyBmcmFtZXNQZXJCbG9jayAqIHNhbXBsZXNQZXJGcmFtZSkuCisgKi8KK2NsYXNzIEF1ZGlvRmxvYXRCbG9ja1BvcnQgIDogcHVibGljIEF1ZGlvUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9GbG9hdEJsb2NrUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJm1QYXJlbnQsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCbG9jayA9IGtEZWZhdWx0QmxvY2tTaXplCisgICAgICAgICAgICAgICAgKTsKKworICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRCbG9ja1BvcnQoKTsKKworICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQmxvY2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQmxvY2s7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGJ1ZmZlciBpbnRlcm5hbCB0byB0aGUgcG9ydCBvciBmcm9tIGEgY29ubmVjdGVkIHBvcnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGZsb2F0ICpnZXRCbG9jaygpIHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVCbG9jazsKKyAgICB9CisKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQzMl90ICAgIG1GcmFtZXNQZXJCbG9jayA9IDE7CisgICAgZmxvYXQgICAgICAgICAgICptU2FtcGxlQmxvY2sgPSBudWxscHRyOyAvLyBhbGxvY2F0ZWQgaW4gY29uc3RydWN0b3IKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBUaGUgcmVzdWx0cyBvZiBhIG1vZHVsZSBhcmUgc3RvcmVkIGluIHRoZSBidWZmZXIgb2YgdGhlIG91dHB1dCBwb3J0cy4KKyAgKi8KK2NsYXNzIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IDogcHVibGljIEF1ZGlvRmxvYXRCbG9ja1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogQXVkaW9GbG9hdEJsb2NrUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRPdXRwdXRQb3J0KCkgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQXVkaW9GbG9hdEJsb2NrUG9ydDo6Z2V0QmxvY2s7CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoZSBwYXJlbnQgbW9kdWxlJ3Mgb25Qcm9jZXNzKCkgbWV0aG9kLgorICAgICAqIFRoYXQgbWF5IHB1bGwgZGF0YSBmcm9tIGl0cyBpbnB1dHMgYW5kIHJlY3Vyc2l2ZWx5CisgICAgICogcHJvY2VzcyB0aGUgZW50aXJlIGdyYXBoLgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwdWxsZWQKKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogQW4gaW5wdXQgcG9ydCBjYW4gb25seSBoYXZlIG9uZSBjb25uZWN0aW9uLgorICAgICAqIEFuIG91dHB1dCBwb3J0IGNhbiBoYXZlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgorICAgICAqIElmIHlvdSBjb25uZWN0IGEgc2Vjb25kIG91dHB1dCBwb3J0IHRvIGFuIGlucHV0IHBvcnQKKyAgICAgKiB0aGVuIGl0IG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4gRG8gbm90IG1vZGlmeSB0aGUgZ3JhcGggdG9wb2xvZ3kgZm9ybSBhbm90aGVyIHRocmVhZCB3aGlsZSBydW5uaW5nLgorICAgICAqLworICAgIHZvaWQgY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KTsKKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBkaXNjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NsYXNzIEF1ZGlvRmxvYXRJbnB1dFBvcnQgOiBwdWJsaWMgQXVkaW9GbG9hdEJsb2NrUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9GbG9hdElucHV0UG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IEF1ZGlvRmxvYXRCbG9ja1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0SW5wdXRQb3J0KCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogSWYgY29ubmVjdGVkIHRvIGFuIG91dHB1dCBwb3J0IHRoZW4gdGhpcyB3aWxsIHJldHVybgorICAgICAqIHRoYXQgb3V0cHV0IHBvcnRzIGJ1ZmZlcnMuCisgICAgICogSWYgbm90IGNvbm5lY3RlZCB0aGVuIGl0IHJldHVybnMgdGhlIGlucHV0IHBvcnRzIG93biBidWZmZXIKKyAgICAgKiB3aGljaCBjYW4gYmUgbG9hZGVkIHVzaW5nIHNldFZhbHVlKCkuCisgICAgICovCisgICAgZmxvYXQgKmdldEJsb2NrKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBQdWxsIGRhdGEgZnJvbSBhbnkgb3V0cHV0IHBvcnQgdGhhdCBpcyBjb25uZWN0ZWQuCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIGV2ZXJ5IHZhbHVlIG9mIHRoZSBmbG9hdCBidWZmZXIuCisgICAgICogVGhpcyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQgaWYgYW4gb3V0cHV0IHBvcnQgaXMgY29ubmVjdGVkCisgICAgICogdG8gdGhpcyBwb3J0LgorICAgICAqLworICAgIHZvaWQgc2V0VmFsdWUoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgaW50IG51bUZsb2F0cyA9IGtEZWZhdWx0QmxvY2tTaXplICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgICAgIGZsb2F0ICpidWZmZXIgPSBnZXRCbG9jaygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZsb2F0czsgaSsrKSB7CisgICAgICAgICAgICAqYnVmZmVyKysgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gdGhlIG91dHB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBBbiBpbnB1dCBwb3J0IGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24uCisgICAgICogQW4gb3V0cHV0IHBvcnQgY2FuIGhhdmUgbXVsdGlwbGUgY29ubmVjdGlvbnMuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBjb25uZWN0KEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICpwb3J0KSB7CisgICAgICAgIGFzc2VydChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBwb3J0LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgICAgIG1Db25uZWN0ZWQgPSBwb3J0OworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdChBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqcG9ydCkgeworICAgICAgICBhc3NlcnQobUNvbm5lY3RlZCA9PSBwb3J0KTsKKyAgICAgICAgKHZvaWQpIHBvcnQ7CisgICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgbUNvbm5lY3RlZCA9IG51bGxwdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICptQ29ubmVjdGVkID0gbnVsbHB0cjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1NvdXJjZSA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvU291cmNlKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvU291cmNlKCkgPSBkZWZhdWx0OworCisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworCisgICAgdm9pZCBzZXREYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgbVNpemVJbkZyYW1lcyA9IG51bUZyYW1lczsKKyAgICAgICAgbUZyYW1lSW5kZXggPSAwOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHZvaWQgKm1EYXRhID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICBtU2l6ZUluRnJhbWVzID0gMDsgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBtRGF0YQorICAgIGludDMyX3QgICAgIG1GcmFtZUluZGV4ID0gMDsgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1NpbmsgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBdWRpb1NpbmsoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICA6IGlucHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb1NpbmsoKSA9IGRlZmF1bHQ7CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworCisgICAgLyoqCisgICAgICogRHVtbXkgcHJvY2Vzc29yLiBUaGUgd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCkgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKSBmcmFtZVBvc2l0aW9uOworICAgICAgICAodm9pZCkgbnVtRnJhbWVzOworICAgICAgICByZXR1cm4gMDsKKyAgICB9OworCisgICAgdmlydHVhbCBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIGludDMyX3QgcHVsbChpbnQzMl90IG51bUZyYW1lcyk7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtRnJhbWVQb3NpdGlvbiA9IDA7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8qIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5YzIyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkNsaXBUb1JhbmdlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK0NsaXBUb1JhbmdlOjpDbGlwVG9SYW5nZShpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KQorICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgQ2xpcFRvUmFuZ2U6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworCisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSBzdGQ6Om1pbihtTWF4aW11bSwgc3RkOjptYXgobU1pbmltdW0sICppbnB1dEJ1ZmZlcisrKSk7CisgICAgfQorCisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWYyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSAorI2RlZmluZSBGTE9XR1JBUEhfQ0xJUF9UT19SQU5HRV9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKKy8vIFRoaXMgaXMgMyBkQiwgKDEwXigzLzIwKSksIHRvIG1hdGNoIHRoZSBtYXhpbXVtIGhlYWRyb29tIGluIEF1ZGlvVHJhY2sgZm9yIGZsb2F0IGRhdGEuCisvLyBJdCBpcyBkZXNpZ25lZCB0byBhbGxvdyBvY2Nhc2lvbmFsIHRyYW5zaWVudCBwZWFrcy4KK2NvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1heEhlYWRyb29tID0gMS40MTI1Mzc1NGY7Citjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNaW5IZWFkcm9vbSA9IC1rRGVmYXVsdE1heEhlYWRyb29tOworCitjbGFzcyBDbGlwVG9SYW5nZSA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IENsaXBUb1JhbmdlKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgfkNsaXBUb1JhbmdlKCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldE1pbmltdW0oZmxvYXQgbWluKSB7CisgICAgICAgIG1NaW5pbXVtID0gbWluOworICAgIH0KKworICAgIGZsb2F0IGdldE1pbmltdW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWluaW11bTsKKyAgICB9CisKKyAgICB2b2lkIHNldE1heGltdW0oZmxvYXQgbWluKSB7CisgICAgICAgIG1NYXhpbXVtID0gbWluOworICAgIH0KKworICAgIGZsb2F0IGdldE1heGltdW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWF4aW11bTsKKyAgICB9CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKworcHJpdmF0ZToKKyAgICBmbG9hdCBtTWluaW11bSA9IGtEZWZhdWx0TWluSGVhZHJvb207CisgICAgZmxvYXQgbU1heGltdW0gPSBrRGVmYXVsdE1heEhlYWRyb29tOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9DTElQX1RPX1JBTkdFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFhZDUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIk1vbm9Ub011bHRpQ29udmVydGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK01vbm9Ub011bHRpQ29udmVydGVyOjpNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgMSkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworfQorCitNb25vVG9NdWx0aUNvbnZlcnRlcjo6fk1vbm9Ub011bHRpQ29udmVydGVyKCkgeyB9CisKK2ludDMyX3QgTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworCisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgLy8gVE9ETyBtYXliZSBtb3ZlIHRvIGF1ZGlvX3V0aWwgYXMgYXVkaW9fbW9ub190b19tdWx0aSgpCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNUb1Byb2Nlc3M7IGkrKykgeworICAgICAgICAvLyByZWFkIG9uZSwgd3JpdGUgbWFueQorICAgICAgICBmbG9hdCBzYW1wbGUgPSAqaW5wdXRCdWZmZXIrKzsKKyAgICAgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsQ291bnQ7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc2FtcGxlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDUzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAorI2RlZmluZSBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIE1vbm9Ub011bHRpQ29udmVydGVyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTW9ub1RvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgdmlydHVhbCB+TW9ub1RvTXVsdGlDb252ZXJ0ZXIoKTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2MDgyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUmFtcExpbmVhciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJSYW1wTGluZWFyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1JhbXBMaW5lYXI6OlJhbXBMaW5lYXIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIG1UYXJnZXQuc3RvcmUoMS4wZik7Cit9CisKK3ZvaWQgUmFtcExpbmVhcjo6c2V0TGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBmcmFtZXMpIHsKKyAgICBtTGVuZ3RoSW5GcmFtZXMgPSBmcmFtZXM7Cit9CisKK3ZvaWQgUmFtcExpbmVhcjo6c2V0VGFyZ2V0KGZsb2F0IHRhcmdldCkgeworICAgIG1UYXJnZXQuc3RvcmUodGFyZ2V0KTsKK30KKworZmxvYXQgUmFtcExpbmVhcjo6aW50ZXJwb2xhdGVDdXJyZW50KCkgeworICAgIHJldHVybiBtTGV2ZWxUbyAtIChtUmVtYWluaW5nICogbVNjYWxlcik7Cit9CisKK2ludDMyX3QgUmFtcExpbmVhcjo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBmbG9hdCB0YXJnZXQgPSBnZXRUYXJnZXQoKTsKKyAgICBpZiAodGFyZ2V0ICE9IG1MZXZlbFRvKSB7CisgICAgICAgIC8vIFN0YXJ0IG5ldyByYW1wLiBDb250aW51ZSBmcm9tIHByZXZpb3VzIGxldmVsLgorICAgICAgICBtTGV2ZWxGcm9tID0gaW50ZXJwb2xhdGVDdXJyZW50KCk7CisgICAgICAgIG1MZXZlbFRvID0gdGFyZ2V0OworICAgICAgICBtUmVtYWluaW5nID0gbUxlbmd0aEluRnJhbWVzOworICAgICAgICBBTE9HVigiJXMoKSBtTGV2ZWxGcm9tID0gJWYsIG1MZXZlbFRvID0gJWYsIG1SZW1haW5pbmcgPSAlZCwgbVNjYWxlciA9ICVmIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1MZXZlbEZyb20sIG1MZXZlbFRvLCBtUmVtYWluaW5nLCBtU2NhbGVyKTsKKyAgICAgICAgbVNjYWxlciA9IChtTGV2ZWxUbyAtIG1MZXZlbEZyb20pIC8gbUxlbmd0aEluRnJhbWVzOyAvLyBmb3IgaW50ZXJwb2xhdGlvbgorICAgIH0KKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IGZyYW1lc1RvUHJvY2VzczsKKworICAgIGlmIChtUmVtYWluaW5nID4gMCkgeyAvLyBSYW1waW5nPyBUaGlzIGRvZXNuJ3QgaGFwcGVuIHZlcnkgb2Z0ZW4uCisgICAgICAgIGludDMyX3QgZnJhbWVzVG9SYW1wID0gc3RkOjptaW4oZnJhbWVzTGVmdCwgbVJlbWFpbmluZyk7CisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9SYW1wOworICAgICAgICB3aGlsZSAoZnJhbWVzVG9SYW1wID4gMCkgeworICAgICAgICAgICAgZmxvYXQgY3VycmVudExldmVsID0gaW50ZXJwb2xhdGVDdXJyZW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyKysgKiBjdXJyZW50TGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVtYWluaW5nLS07CisgICAgICAgICAgICBmcmFtZXNUb1JhbXAtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFByb2Nlc3MgYW55IGZyYW1lcyBhZnRlciB0aGUgcmFtcC4KKyAgICBpbnQzMl90IHNhbXBsZXNMZWZ0ID0gZnJhbWVzTGVmdCAqIGNoYW5uZWxDb3VudDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNhbXBsZXNMZWZ0OyBpKyspIHsKKyAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyKysgKiBtTGV2ZWxUbzsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzhmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfUkFNUF9MSU5FQVJfSAorI2RlZmluZSBGTE9XR1JBUEhfUkFNUF9MSU5FQVJfSAorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBSYW1wTGluZWFyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgUmFtcExpbmVhcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5SYW1wTGluZWFyKCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBuZXh0IHJhbXAuCisgICAgICogQ2FsbGluZyB0aGlzIGRvZXMgbm90IGFmZmVjdCBhIHJhbXAgdGhhdCBpcyBpbiBwcm9ncmVzcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldExlbmd0aEluRnJhbWVzKGludDMyX3QgZnJhbWVzKTsKKworICAgIGludDMyX3QgZ2V0TGVuZ3RoSW5GcmFtZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoSW5GcmFtZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtYXkgYmUgc2FmZWx5IGNhbGxlZCBieSBhbm90aGVyIHRocmVhZC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICovCisgICAgdm9pZCBzZXRUYXJnZXQoZmxvYXQgdGFyZ2V0KTsKKworICAgIGZsb2F0IGdldFRhcmdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQubG9hZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlIHRoZSBuZXh0U2VnbWVudCB0byBzdGFydCBmcm9tIHRoaXMgbGV2ZWwuCisgICAgICoKKyAgICAgKiBXQVJOSU5HOiB0aGlzIGNhbiBjYXVzZSBhIGRpc2NvbnRpbnVpdHkgaWYgY2FsbGVkIHdoaWxlIHRoZSByYW1wIGlzIGJlaW5nIHVzZWQuCisgICAgICogT25seSBjYWxsIHRoaXMgd2hlbiBzZXR0aW5nIHRoZSBpbml0aWFsIHJhbXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKi8KKyAgICB2b2lkIGZvcmNlQ3VycmVudChmbG9hdCBsZXZlbCkgeworICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7CisgICAgICAgIG1MZXZlbFRvID0gbGV2ZWw7CisgICAgfQorCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisKK3ByaXZhdGU6CisKKyAgICBmbG9hdCBpbnRlcnBvbGF0ZUN1cnJlbnQoKTsKKworICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgbVRhcmdldDsKKworICAgIGludDMyX3QgICAgICAgICAgICAgbUxlbmd0aEluRnJhbWVzICA9IDQ4MDAwLjBmIC8gMTAwLjBmIDsgLy8gMTAgbXNlYyBhdCA0ODAwMCBIejsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1SZW1haW5pbmcgICAgICAgPSAwOworICAgIGZsb2F0ICAgICAgICAgICAgICAgbVNjYWxlciAgICAgICAgICA9IDAuMGY7CisgICAgZmxvYXQgICAgICAgICAgICAgICBtTGV2ZWxGcm9tICAgICAgID0gMC4wZjsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1MZXZlbFRvICAgICAgICAgPSAwLjBmOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9SQU1QX0xJTkVBUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNkY2JjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNpbmtGbG9hdC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTaW5rRmxvYXQ6OlNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU2lua0Zsb2F0OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IChmbG9hdCAqKSBkYXRhOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgorICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUmVhZCAqIGNoYW5uZWxDb3VudDsKKyAgICAgICAgbWVtY3B5KGZsb2F0RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIGZsb2F0RGF0YSArPSBudW1TYW1wbGVzOworICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc1YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfRkxPQVRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNpbmtGbG9hdCA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfRkxPQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVjOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTaW5rSTE2LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1NpbmtJMTY6OlNpbmtJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkge30KKworaW50MzJfdCBTaW5rSTE2OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MTZfdCAqc2hvcnREYXRhID0gKGludDE2X3QgKikgZGF0YTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHNob3J0RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzKTsKKyAgICAgICAgc2hvcnREYXRhICs9IG51bVNhbXBsZXM7CisgICAgICAgIHNpZ25hbCArPSBudW1TYW1wbGVzOworI2Vsc2UKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgbiA9IChpbnQzMl90KSAoKnNpZ25hbCsrICogMzI3NjguMGYpOworICAgICAgICAgICAgKnNob3J0RGF0YSsrID0gc3RkOjptaW4oSU5UMTZfTUFYLCBzdGQ6Om1heChJTlQxNl9NSU4sIG4pKTsgLy8gY2xpcAorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDg2MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NJTktfSTE2X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfSTE2X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTaW5rSTE2IDogcHVibGljIEF1ZGlvU2luayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2lua0kxNihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0kxNl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTI4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNpbmtJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworCitTaW5rSTI0OjpTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisKK2ludDMyX3QgU2lua0kyNDo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIHVpbnQ4X3QgKmJ5dGVEYXRhID0gKHVpbnQ4X3QgKikgZGF0YTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgbWVtY3B5X3RvX3AyNF9mcm9tX2Zsb2F0KGJ5dGVEYXRhLCBmbG9hdERhdGEsIG51bVNhbXBsZXMpOworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CisgICAgICAgIGJ5dGVEYXRhICs9IG51bVNhbXBsZXMgKiBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgICAgIGZsb2F0RGF0YSArPSBudW1TYW1wbGVzOworI2Vsc2UKKyAgICAgICAgY29uc3QgaW50MzJfdCBrSTI0UGFja2VkTWF4ID0gMHgwMDdGRkZGRjsKKyAgICAgICAgY29uc3QgaW50MzJfdCBrSTI0UGFja2VkTWluID0gMHhGRjgwMDAwMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgbiA9IChpbnQzMl90KSAoKmZsb2F0RGF0YSsrICogMHgwMDgwMDAwMCk7CisgICAgICAgICAgICBuID0gc3RkOjptaW4oa0kyNFBhY2tlZE1heCwgc3RkOjptYXgoa0kyNFBhY2tlZE1pbiwgbikpOyAvLyBjbGlwCisgICAgICAgICAgICAvLyBXcml0ZSBhcyBhIHBhY2tlZCAyNC1iaXQgaW50ZWdlciBpbiBMaXR0bGUgRW5kaWFuIGZvcm1hdC4KKyAgICAgICAgICAgICpieXRlRGF0YSsrID0gKHVpbnQ4X3QpIG47CisgICAgICAgICAgICAqYnl0ZURhdGErKyA9ICh1aW50OF90KSAobiA+PiA4KTsKKyAgICAgICAgICAgICpieXRlRGF0YSsrID0gKHVpbnQ4X3QpIChuID4+IDE2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lcyAtIGZyYW1lc0xlZnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5YjUwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0kyNF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TSU5LX0kyNF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU2lua0kyNCA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19JMjRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjY3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTb3VyY2VGbG9hdC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTb3VyY2VGbG9hdDo6U291cmNlRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlRmxvYXQ6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKworICAgIGNvbnN0IGZsb2F0ICpmbG9hdEJhc2UgPSAoZmxvYXQgKikgbURhdGE7CisgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9ICZmbG9hdEJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnRdOworICAgIG1lbWNweShvdXRwdXRCdWZmZXIsIGZsb2F0RGF0YSwgbnVtU2FtcGxlcyAqIHNpemVvZihmbG9hdCkpOworICAgIG1GcmFtZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmVlZDlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfRkxPQVRfSAorI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VGbG9hdCA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9GTE9BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2ZjZWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkxNi5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTb3VyY2VJMTY6OlNvdXJjZUkxNihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTb3VyY2VJMTY6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisKKyAgICBjb25zdCBpbnQxNl90ICpzaG9ydEJhc2UgPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQxNl90ICo+KG1EYXRhKTsKKyAgICBjb25zdCBpbnQxNl90ICpzaG9ydERhdGEgPSAmc2hvcnRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0RGF0YSwgc2hvcnREYXRhLCBudW1TYW1wbGVzKTsKKyNlbHNlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgKmZsb2F0RGF0YSsrID0gKnNob3J0RGF0YSsrICogKDEuMGYgLyAzMjc2OCk7CisgICAgfQorI2VuZGlmCisKKyAgICBtRnJhbWVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTE2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9JMTZfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNvdXJjZUkxNiA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlSTE2KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTk4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU291cmNlSTI0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2NvbnN0ZXhwciBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKKworU291cmNlSTI0OjpTb3VyY2VJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlSTI0OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgdWludDhfdCAqYnl0ZUJhc2UgPSAodWludDhfdCAqKSBtRGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpieXRlRGF0YSA9ICZieXRlQmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudCAqIGtCeXRlc1BlckkyNFBhY2tlZF07CisKKyNpZmRlZiBfX0FORFJPSURfXworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3AyNChmbG9hdERhdGEsIGJ5dGVEYXRhLCBudW1TYW1wbGVzKTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gMS4gLyAoZmxvYXQpKDFVTCA8PCAzMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgLy8gQXNzZW1ibGUgdGhlIGRhdGEgYXNzdW1pbmcgTGl0dGxlIEVuZGlhbiBmb3JtYXQuCisgICAgICAgIGludDMyX3QgcGFkID0gYnl0ZURhdGFbMl07CisgICAgICAgIHBhZCA8PD0gODsKKyAgICAgICAgcGFkIHw9IGJ5dGVEYXRhWzFdOworICAgICAgICBwYWQgPDw9IDg7CisgICAgICAgIHBhZCB8PSBieXRlRGF0YVswXTsKKyAgICAgICAgcGFkIDw8PSA4OyAvLyBTaGlmdCB0byAzMiBiaXQgZGF0YSBzbyB0aGUgc2lnbiBpcyBjb3JyZWN0LgorICAgICAgICBieXRlRGF0YSArPSBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgICAgICpmbG9hdERhdGErKyA9IHBhZCAqIHNjYWxlOyAvLyBzY2FsZSB0byByYW5nZSAtMS4wIHRvIDEuMAorICAgIH0KKyNlbmRpZgorCisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYxNGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VJMjQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUkyNChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKaW5kZXggYTZiOWY1ZC4uMmVkYWI1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcApAQCAtNzgsOCArNzgsOSBAQAogCiB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5Ojpwcm9jZXNzQ2FsbGJhY2tDb21tb24oYWF1ZGlvX2NhbGxiYWNrX29wZXJhdGlvbl90IG9wY29kZSwgdm9pZCAqaW5mbykgewogICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0OwotICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9GbGluZ2VyIHRvIHN0b3AgY2FsbGluZyB1cy4KLSAgICAvLyBUaGlzIHRha2VzIGFkdmFudGFnZSBvZiBBdWRpb0ZsaW5nZXIga2lsbGluZyB0aGUgc3RyZWFtLgorICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9SZWNvcmQgb3IgQXVkaW9UcmFjayB0byBzdG9wIGNhbGxpbmcgdXMuCisgICAgLy8gVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlbSBraWxsaW5nIHRoZSBzdHJlYW0gd2hlbiB0aGV5IHNlZSBhIHNpemUgb3V0IG9mIHJhbmdlLgorICAgIC8vIFRoYXQgaXMgYW4gdW5kb2N1bWVudGVkIGJlaGF2aW9yLgogICAgIC8vIFRPRE8gYWRkIHRvIEFQSSBpbiBBdWRpb1JlY29yZCBhbmQgQXVkaW9UcmFjawogICAgIGNvbnN0IHNpemVfdCBTSVpFX1NUT1BfQ0FMTEJBQ0tTID0gU0laRV9NQVg7CiAKQEAgLTk1LDcgKzk2LDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgZGF0YSwgc3RyZWFtIGRpc2Nvbm5lY3RlZCIpOwogICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIHN0b3BwaW5nIGJlY2F1c2UgY2FsbGJhY2sgZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgbm8gZGF0YSBiZWNhdXNlIGNhbGxiYWNrIGRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgewpAQCAtMTE1LDEwICsxMTYsMTYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpIHsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBTVE9QIG9yIGludmFsaWQgcmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJlcXVlc3RlZCBzdG9wLCBmYWtlIGFuIGVycm9yIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNhbGxiYWNrIGp1c3QgaW4gY2FzZSBBdWRpb0ZsaW5nZXIga2VlcHMgdHJ5aW5nIHRvIGNhbGwgdXMuCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCByZXN1bHQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGJhY2tSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBrZWVwcyB0cnlpbmcgdG8gY2FsbCB1cy4KICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAppbmRleCA0OTRlZGJjLi44ZTc4NTU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKQEAgLTc3LDcgKzc3LDYgQEAKIAogICAgIHZpcnR1YWwgaW50NjRfdCBpbmNyZW1lbnRDbGllbnRGcmFtZUNvdW50ZXIoaW50MzJfdCBmcmFtZXMpICA9IDA7CiAKLQogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gbUZyYW1lc1dyaXR0ZW4uZ2V0KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCmluZGV4IDUwNWYyZWUuLjRhNjVmYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKQEAgLTU3LDYgKzU3LDkgQEAKIAogICAgIC8vIFRyeSB0byBjcmVhdGUgYW4gQXVkaW9SZWNvcmQKIAorICAgIGNvbnN0IGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKKwogICAgIC8vIFRPRE8gU3VwcG9ydCBVTlNQRUNJRklFRCBpbiBBdWRpb1JlY29yZC4gRm9yIG5vdywgdXNlIHN0ZXJlbyBpZiB1bnNwZWNpZmllZC4KICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDIgOiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKQEAgLTY2LDIzICs2OSwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgOiBidWlsZGVyLmdldEJ1ZmZlckNhcGFjaXR5KCk7CiAKIAotICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlID0gZ2V0UGVyZm9ybWFuY2VNb2RlKCk7CiAgICAgc3dpdGNoIChwZXJmTW9kZSkgewogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOgotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8IEFVRElPX0lOUFVUX0ZMQUdfUkFXKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBhcHAgYXNrcyBmb3IgYSBzZXNzaW9uSWQgdGhlbiBpdCBtZWFucyB0aGV5IHdhbnQgdG8gdXNlIGVmZmVjdHMuCisgICAgICAgICAgICAvLyBTbyBkb24ndCB1c2UgUkFXIGZsYWcuCisgICAgICAgICAgICBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoKHJlcXVlc3RlZFNlc3Npb25JZCA9PSBBQVVESU9fU0VTU0lPTl9JRF9OT05FKQorICAgICAgICAgICAgICAgICAgICA/IChBVURJT19JTlBVVF9GTEFHX0ZBU1QgfCBBVURJT19JTlBVVF9GTEFHX1JBVykKKyAgICAgICAgICAgICAgICAgICAgOiAoQVVESU9fSU5QVVRfRkxBR19GQVNUKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOgogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gTm8gZmxhZ3MuCisgICAgICAgICAgICBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIC8vIFByZXNlcnZlIGJlaGF2aW9yIG9mIEFQSSAyNgotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKICAgICB9CiAKICAgICAvLyBNYXliZSBjaGFuZ2UgZGV2aWNlIGZvcm1hdCB0byBnZXQgYSBGQVNUIHBhdGguCkBAIC05OSwxMiArMTA2LDEyIEBACiAgICAgLy8gV2UganVzdCBtYXkgbm90IGdldCBhIEZBU1QgdHJhY2suCiAgICAgLy8gQnV0IHdlIHdvdWxkbid0IGhhdmUgYW55d2F5IHdpdGhvdXQgdGhpcyBoYWNrLgogICAgIGNvbnN0ZXhwciBpbnQzMl90IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QgPSA0ODAwMDsKLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVAogICAgICAgICAgICAgJiYgcGVyZk1vZGUgPT0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kKICAgICAgICAgICAgICYmIChzYW1wbGVzUGVyRnJhbWUgPD0gMikgLy8gRkFTVCBvbmx5IGZvciBtb25vIGFuZCBzdGVyZW8KICAgICAgICAgICAgICYmIChnZXRTYW1wbGVSYXRlKCkgPT0ga01vc3RMaWtlbHlTYW1wbGVSYXRlRm9yRmFzdAogICAgICAgICAgICAgICAgIHx8IGdldFNhbXBsZVJhdGUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpKSB7Ci0gICAgICAgIHNldERldmljZUZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9JMTYpOworICAgICAgICBzZXREZXZpY2VGb3JtYXQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNldERldmljZUZvcm1hdChnZXRGb3JtYXQoKSk7CiAgICAgfQpAQCAtMTQxLDE0ICsxNDgsMTAgQEAKICAgICAgICAgICAgIC50YWdzID0gIiIKICAgICB9OwogCi0gICAgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOwotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOwotCiAgICAgLy8gLS0tLS0tLS0tLS0gb3BlbiB0aGUgQXVkaW9SZWNvcmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gTWlnaHQgcmV0cnksIGJ1dCBuZXZlciBtb3JlIHRoYW4gb25jZS4KICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkgKyspIHsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgcmVxdWVzdGVkSW50ZXJuYWxGb3JtYXQgPQotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChnZXREZXZpY2VGb3JtYXQoKSk7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEludGVybmFsRm9ybWF0ID0gZ2V0RGV2aWNlRm9ybWF0KCk7CiAKICAgICAgICAgbUF1ZGlvUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAogICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lIC8vIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lIFRPRE8gZG9lcyBub3QgY29tcGlsZQpAQCAtMjE0LDggKzIxNyw4IEBACiAgICAgfQogCiAgICAgLy8gQWxsb2NhdGUgZm9ybWF0IGNvbnZlcnNpb24gYnVmZmVyIGlmIG5lZWRlZC4KLSAgICBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2Ci0gICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKIAogICAgICAgICBpZiAoYnVpbGRlci5nZXREYXRhQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNhbGxiYWNrIHRoZW4gd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBkYXRhIGludG8gYW4gaW50ZXJuYWwgZmxvYXQKQEAgLTMyMywxNiArMzI2LDEzIEBACiAgICAgaWYgKG1BdWRpb1JlY29yZC5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgLy8gR2V0IGN1cnJlbnQgcG9zaXRpb24gc28gd2UgY2FuIGRldGVjdCB3aGVuIHRoZSB0cmFjayBpcyByZWNvcmRpbmcuCi0gICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmbVBvc2l0aW9uV2hlblN0YXJ0aW5nKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgIH0KIAotICAgIC8vIEVuYWJsZSBjYWxsYmFjayBiZWZvcmUgc3RhcnRpbmcgQXVkaW9UcmFjayB0byBhdm9pZCBzaHV0dGluZworICAgIC8vIEVuYWJsZSBjYWxsYmFjayBiZWZvcmUgc3RhcnRpbmcgQXVkaW9SZWNvcmQgdG8gYXZvaWQgc2h1dHRpbmcKICAgICAvLyBkb3duIGJlY2F1c2Ugb2YgYSByYWNlIGNvbmRpdGlvbi4KICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOwotICAgIGVyciA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsKKyAgICBtRnJhbWVzV3JpdHRlbi5yZXNldDMyKCk7IC8vIHNlcnZpY2Ugd3JpdGVzIGZyYW1lcworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CisgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvUmVjb3JkLT5zdGFydCgpOyAvLyByZXNldHMgcG9zaXRpb24gdG8gemVybwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiAgICAgfSBlbHNlIHsKQEAgLTM0NiwxMiArMzQ2LDEwIEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7Ci0gICAgaW5jcmVtZW50RnJhbWVzV3JpdHRlbihnZXRGcmFtZXNSZWFkKCkgLSBnZXRGcmFtZXNXcml0dGVuKCkpOyAvLyBUT0RPIHJldmlldwotICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5zZXQoZ2V0RnJhbWVzUmVhZCgpKTsKKyAgICBtRnJhbWVzV3JpdHRlbi5jYXRjaFVwVG8oZ2V0RnJhbWVzUmVhZCgpKTsKKyAgICBtVGltZXN0YW1wUG9zaXRpb24uY2F0Y2hVcFRvKGdldEZyYW1lc1JlYWQoKSk7CiAgICAgbUF1ZGlvUmVjb3JkLT5zdG9wKCk7CiAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOyAvLyBzZXJ2aWNlIHdyaXRlcyBmcmFtZXMsIHNlcnZpY2UgcG9zaXRpb24gcmVzZXQgb24gZmx1c2gKLSAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOwogICAgIC8vIFBhc3MgZmFsc2UgdG8gcHJldmVudCBlcnJvckNhbGxiYWNrIGZyb20gYmVpbmcgY2FsbGVkIGFmdGVyIGRpc2Nvbm5lY3QKICAgICAvLyB3aGVuIGFwcCBoYXMgYWxyZWFkeSByZXF1ZXN0ZWQgYSBzdG9wKCkuCiAgICAgcmV0dXJuIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoZmFsc2UpOwpAQCAtMzY1LDEwICszNjMsMTIgQEAKICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKICAgICAvLyBUT0RPIGFkZCBiZXR0ZXIgc3RhdGUgdmlzaWJpbGl0eSB0byBBdWRpb1JlY29yZAogICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORzoKKyAgICAgICAgLy8gV2hlbiBzdGFydGluZywgdGhlIHBvc2l0aW9uIHdpbGwgYmVnaW4gYXQgemVybyBhbmQgdGhlbiBnbyBwb3NpdGl2ZS4KKyAgICAgICAgLy8gVGhlIHBvc2l0aW9uIGNhbiB3cmFwIGJ1dCBieSB0aGF0IHRpbWUgdGhlIHN0YXRlIHdpbGwgbm90IGJlIFNUQVJUSU5HLgogICAgICAgICBlcnIgPSBtQXVkaW9SZWNvcmQtPmdldFBvc2l0aW9uKCZwb3NpdGlvbik7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7Ci0gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gIT0gbVBvc2l0aW9uV2hlblN0YXJ0aW5nKSB7CisgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPiAwKSB7CiAgICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtNDgzLDYgKzQ4Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgewogICAgIEV4dGVuZGVkVGltZXN0YW1wIGV4dGVuZGVkVGltZXN0YW1wOworICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCkgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1JlY29yZC0+Z2V0VGltZXN0YW1wKCZleHRlbmRlZFRpbWVzdGFtcCk7CiAgICAgaWYgKHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC00OTgsMTIgKzUwMSwxMiBAQAogICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgewogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc6CiAgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEOgotICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CiAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9SZWNvcmQtPmdldFBvc2l0aW9uKCZwb3NpdGlvbik7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CiAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4udXBkYXRlMzIocG9zaXRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORzoKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKaW5kZXggNTA1Y2Q3Ny4uZmY5NWFlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKQEAgLTU5LDE4ICs1OSwyNSBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIGNvbnN0IGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKKwogICAgIC8vIFRyeSB0byBjcmVhdGUgYW4gQXVkaW9UcmFjawogICAgIC8vIFVzZSBzdGVyZW8gaWYgdW5zcGVjaWZpZWQuCiAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyIDogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoc2FtcGxlc1BlckZyYW1lKTsKIAotICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlID0gZ2V0UGVyZm9ybWFuY2VNb2RlKCk7CiAgICAgc3dpdGNoKHBlcmZNb2RlKSB7CiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6CiAgICAgICAgICAgICAvLyBCeXBhc3MgdGhlIG5vcm1hbCBtaXhlciBhbmQgZ28gc3RyYWlnaHQgdG8gdGhlIEZBU1QgbWl4ZXIuCi0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX1JBVyk7CisgICAgICAgICAgICAvLyBJZiB0aGUgYXBwIGFza3MgZm9yIGEgc2Vzc2lvbklkIHRoZW4gaXQgbWVhbnMgdGhleSB3YW50IHRvIHVzZSBlZmZlY3RzLgorICAgICAgICAgICAgLy8gU28gZG9uJ3QgdXNlIFJBVyBmbGFnLgorICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpICgocmVxdWVzdGVkU2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgICAgICAgICAgID8gKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19SQVcpCisgICAgICAgICAgICAgICAgICAgIDogKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HOgpAQCAtODEsNiArODgsNyBAQAogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAvLyBObyBmbGFncy4gVXNlIGEgbm9ybWFsIG1peGVyIGluIGZyb250IG9mIHRoZSBGQVNUIG1peGVyLgorICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC04OCw5ICs5Niw5IEBACiAKICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDA7CiAKLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpCiAgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKLSAgICAgICAgICAgIDogQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGdldEZvcm1hdCgpKTsKKyAgICAgICAgICAgIDogZ2V0Rm9ybWF0KCk7CiAKICAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lLgogICAgIEF1ZGlvVHJhY2s6OmNhbGxiYWNrX3QgY2FsbGJhY2sgPSBudWxscHRyOwpAQCAtMTM1LDExICsxNDMsNiBAQAogICAgICAgICAgICAgLnRhZ3MgPSAiIgogICAgIH07CiAKLSAgICBzdGF0aWNfYXNzZXJ0KEFBVURJT19VTlNQRUNJRklFRCA9PSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLCAiU2Vzc2lvbiBJRHMgc2hvdWxkIG1hdGNoIik7Ci0KLSAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7Ci0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7Ci0KICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7CiAgICAgbUF1ZGlvVHJhY2stPnNldCgKICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCAgLy8gaWdub3JlZCBiZWNhdXNlIHdlIHBhc3MgYXR0cmlidXRlcyBiZWxvdwpAQCAtMTc4LDEwICsxODEsOCBAQAogCiAgICAgLy8gR2V0IHRoZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIEF1ZGlvVHJhY2suCiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1BdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKSk7Ci0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKLSAgICBzZXRGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKLSAgICBzZXREZXZpY2VGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKKyAgICBzZXRGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKKyAgICBzZXREZXZpY2VGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKIAogICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZSA9IG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgQUxPR1dfSUYoYWN0dWFsU2FtcGxlUmF0ZSAhPSBnZXRTYW1wbGVSYXRlKCksCkBAIC0yODcsNyArMjg4LDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RQYXVzZSgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgicmVxdWVzdFBhdXNlKCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCkBAIC0zMDMsNyArMzA0LDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RGbHVzaCgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgicmVxdWVzdEZsdXNoKCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCkBAIC0zMTcsMTMgKzMxOCwxMyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0b3AoKSB7CiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RTdG9wKCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7Ci0gICAgaW5jcmVtZW50RnJhbWVzUmVhZChnZXRGcmFtZXNXcml0dGVuKCkgLSBnZXRGcmFtZXNSZWFkKCkpOyAvLyBUT0RPIHJldmlldwotICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5zZXQoZ2V0RnJhbWVzV3JpdHRlbigpKTsKKyAgICBtRnJhbWVzUmVhZC5jYXRjaFVwVG8oZ2V0RnJhbWVzV3JpdHRlbigpKTsKKyAgICBtVGltZXN0YW1wUG9zaXRpb24uY2F0Y2hVcFRvKGdldEZyYW1lc1dyaXR0ZW4oKSk7CiAgICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOyAvLyBzZXJ2aWNlIHJlYWRzIGZyYW1lcywgc2VydmljZSBwb3NpdGlvbiByZXNldCBvbiBzdG9wCiAgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcAppbmRleCA0MGViYjc2Li43MjNjYmYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcApAQCAtMzMsMzk1ICszMyw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi0vLyBUaGlzIGlzIDMgZEIsICgxMF4oMy8yMCkpLCB0byBtYXRjaCB0aGUgbWF4aW11bSBoZWFkcm9vbSBpbiBBdWRpb1RyYWNrIGZvciBmbG9hdCBkYXRhLgotLy8gSXQgaXMgZGVzaWduZWQgdG8gYWxsb3cgb2NjYXNpb25hbCB0cmFuc2llbnQgcGVha3MuCi0jZGVmaW5lIE1BWF9IRUFEUk9PTSAoMS40MTI1Mzc1NGYpCi0jZGVmaW5lIE1JTl9IRUFEUk9PTSAoMCAtIE1BWF9IRUFEUk9PTSkKLQotaW50MzJfdCBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewotICAgIGludDMyX3Qgc2l6ZSA9IEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgotICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihmbG9hdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotLy8gVE9ETyBleHBvc2UgYW5kIGNhbGwgY2xhbXAxNl9mcm9tX2Zsb2F0IGZ1bmN0aW9uIGluIHByaW1pdGl2ZXMuaAotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTZfZnJvbV9mbG9hdChmbG9hdCBmKSB7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gMSA8PCAxNTsKLSAgICByZXR1cm4gKGludDE2X3QpIHJvdW5kZihmbWF4ZihmbWluZihmICogc2NhbGUsIHNjYWxlIC0gMS5mKSwgLXNjYWxlKSk7Ci19Ci0KLS8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotLy8gQnkgdXNpbmcgZm1pbiBhbmQgZm1heCB3ZSBhbHNvIHByb3RlY3QgYWdhaW5zdCBOYU4uCi1zdGF0aWMgZmxvYXQgY2xpcFRvTWluTWF4SGVhZHJvb20oZmxvYXQgaW5wdXQpIHsKLSAgICByZXR1cm4gZm1pbihNQVhfSEVBRFJPT00sIGZtYXgoTUlOX0hFQURST09NLCBpbnB1dCkpOwotfQotCi1zdGF0aWMgZmxvYXQgY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KGZsb2F0IHNhbXBsZSwgZmxvYXQgc2NhbGVyKSB7Ci0gICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgc2FtcGxlID0gY2xpcFRvTWluTWF4SGVhZHJvb20oc2FtcGxlKTsKLQotICAgIC8vIFNjYWxlIGFuZCBjb252ZXJ0IHRvIGEgc2hvcnQuCi0gICAgZmxvYXQgZnZhbCA9IHNhbXBsZSAqIHNjYWxlcjsKLSAgICByZXR1cm4gY2xhbXAxNl9mcm9tX2Zsb2F0KGZ2YWwpOwotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgLy8gZGl2aWRlIGJ5IG51bUZyYW1lcyBzbyB0aGF0IHdlIGFsbW9zdCByZWFjaCBhbXBsaXR1ZGUyCi0gICAgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgU0hPUlRfU0NBTEUgIDMyNzY4Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZGVzdGluYXRpb25baV0gPSBzb3VyY2VbaV0gKiBzY2FsZXI7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxIC8gU0hPUlRfU0NBTEU7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gKFNIT1JUX1NDQUxFICogKGZsb2F0KSBudW1GcmFtZXMpOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgc2NhbGVyICs9IGRlbHRhOwotICAgIH0KLX0KLQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgICAgICAvLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLSAgICAgICAgICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlICogc2NhbGVyOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgLy8gQmVjYXVzZSB3ZSBhcmUgY29udmVydGluZyBmcm9tIGludDE2IHRvIDFudDE2LCB3ZSBkbyBub3QgaGF2ZSB0byBzY2FsZSBieSAxLzMyNzY4LgotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjbGlwIGJlY2F1c2UgaW50MTZfdCByYW5nZSBpcyBpbmhlcmVudGx5IGxpbWl0ZWQuCi0gICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAgKnNvdXJjZSsrICogc2NhbGVyOwotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSAoaW50MTZfdCkgcm91bmRmKHNhbXBsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2NhbGVyICs9IGRlbHRhOwotICAgIH0KLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29udmVydCBNb25vIFRvIFN0ZXJlbyBhdCB0aGUgc2FtZSB0aW1lIGFzIGNvbnZlcnRpbmcgZm9ybWF0Lgotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIC8vIGRpdmlkZSBieSBudW1GcmFtZXMgc28gdGhhdCB3ZSBhbG1vc3QgcmVhY2ggYW1wbGl0dWRlMgotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICBpbnQxNl90IHNhbXBsZTE2ID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUgLyBTSE9SVF9TQ0FMRTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9IHNvdXJjZVtpXSAqIHNjYWxlcjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIxID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZsb2F0IHNjYWxlciA9IHNjYWxlcjEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gc291cmNlW2ZyYW1lSW5kZXhdICogc2NhbGVyOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0KLSAgICAgICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSArIChmcmFtZUluZGV4ICogZGVsdGEpOwotICAgICAgICBmbG9hdCBzYW1wbGVTY2FsZWQgPSBzYW1wbGUgKiBzY2FsZXI7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlU2NhbGVkOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZVNjYWxlZDsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICAvLyBCZWNhdXNlIHdlIGFyZSBjb252ZXJ0aW5nIGZyb20gaW50MTYgdG8gMW50MTYsIHdlIGRvIG5vdCBoYXZlIHRvIHNjYWxlIGJ5IDEvMzI3NjguCi0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSArIChmcmFtZUluZGV4ICogZGVsdGEpOwotICAgICAgICAvLyBObyBuZWVkIHRvIGNsaXAgYmVjYXVzZSBpbnQxNl90IHJhbmdlIGlzIGluaGVyZW50bHkgbGltaXRlZC4KLSAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IChpbnQxNl90KSByb3VuZGYoc2FtcGxlKTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICB9Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLXZvaWQgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydCgKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgZmxvYXQgbGV2ZWxUbykgewotCi0gICAgaWYgKHNvdXJjZS5jaGFubmVsQ291bnQgPT0gMSAmJiBkZXN0aW5hdGlvbi5jaGFubmVsQ291bnQgPT0gMikgewotICAgICAgICBjb252ZXJ0TW9ub1RvU3RlcmVvKHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBtb25vIHRvIHN0ZXJlbyBjb252ZXJzaW9uLiBPdGhlcndpc2Ugc291cmNlIGFuZCBkZXN0aW5hdGlvbgotICAgICAgICAvLyBtdXN0IG1hdGNoLgotICAgICAgICBhc3NlcnQoc291cmNlLmNoYW5uZWxDb3VudCA9PSBkZXN0aW5hdGlvbi5jaGFubmVsQ291bnQpOwotICAgICAgICBjb252ZXJ0Q2hhbm5lbHNNYXRjaChzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnRNb25vVG9TdGVyZW8oCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLQotICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgotICAgIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydENoYW5uZWxzTWF0Y2goCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLSAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBzb3VyY2UuY2hhbm5lbENvdW50OwotCi0gICAgLy8gVGhlIGZvcm1hdHMgYXJlIHZhbGlkYXRlZCB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkIHNvIHdlIGRvIG5vdCBoYXZlIHRvCi0gICAgLy8gY2hlY2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIGhlcmUuCi0gICAgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXAoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXAoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHN0YXR1c190IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKGFhdWRpb19yZXN1bHRfdCByZXN1bHQpIHsKICAgICAvLyBUaGlzIGNvdmVycyB0aGUgY2FzZSBmb3IgQUFVRElPX09LIGFuZCBmb3IgcG9zaXRpdmUgcmVzdWx0cy4KICAgICBpZiAocmVzdWx0ID49IDApIHsKQEAgLTUxMyw2ICsxMjQsOSBAQAogYXVkaW9fZm9ybWF0X3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQpIHsKICAgICBhdWRpb19mb3JtYXRfdCBhbmRyb2lkRm9ybWF0OwogICAgIHN3aXRjaCAoYWF1ZGlvRm9ybWF0KSB7CisgICAgY2FzZSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOgorICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgogICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgIGJyZWFrOwpAQCAtNTIwLDE2ICsxMzQsMTkgQEAKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAgICAgQUxPR0UoIkFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdCAweCUwOFggdW5yZWNvZ25pemVkIiwgYWF1ZGlvRm9ybWF0KTsKKyAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGFhdWRpb0Zvcm1hdCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYW5kcm9pZEZvcm1hdDsKIH0KIAogYWF1ZGlvX2Zvcm1hdF90IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChhdWRpb19mb3JtYXRfdCBhbmRyb2lkRm9ybWF0KSB7Ci0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0OwogICAgIHN3aXRjaCAoYW5kcm9pZEZvcm1hdCkgeworICAgIGNhc2UgQVVESU9fRk9STUFUX0RFRkFVTFQ6CisgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CiAgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kxNjsKICAgICAgICAgYnJlYWs7CkBAIC01MzgsNyArMTU1LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgICAgICBBTE9HRSgiQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0IDB4JTA4WCB1bnJlY29nbml6ZWQiLCBhbmRyb2lkRm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBhbmRyb2lkRm9ybWF0KTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBhYXVkaW9Gb3JtYXQ7CkBAIC01OTMsNiArMjEwLDcgQEAKICAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04gPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKTsKICAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfQ09NTVVOSUNBVElPTiA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CiAgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEID09IEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFID09IEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRSk7CiAgICAgaWYgKHByZXNldCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgcHJlc2V0ID0gQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKaW5kZXggNGI5NzVlOC4uZGMyYjE5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaApAQCAtNDUsMTU2ICs0NSw2IEBACiBhdWRpb19zZXNzaW9uX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQoYWF1ZGlvX3Nlc3Npb25faWRfdCBzZXNzaW9uSWQpOwogCiAvKioKLSAqIENvbnZlcnQgYW4gYXJyYXkgb2YgZmxvYXRzIHRvIGFuIGFycmF5IG9mIGludDE2X3QuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtU2FtcGxlcyBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBhcnJheQotICogQHBhcmFtIGFtcGxpdHVkZSBsZXZlbCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLQotLyoqCi0gKiBDb252ZXJ0IGZsb2F0cyB0byBpbnQxNl90IGFuZCBzY2FsZSBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lIEFLQSBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxIGxldmVsIGF0IHN0YXJ0IG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyIGxldmVsIHBhc3QgZW5kIG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqLwotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotLyoqCi0gKiBDb252ZXJ0IGludDE2X3QgYXJyYXkgdG8gZmxvYXQgYXJyYXkgcmFuZ2luZyBmcm9tIC0xLjAgdG8gKzEuMC4KLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bVNhbXBsZXMKLSAqLwotLy92b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwgaW50MzJfdCBudW1TYW1wbGVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbik7Ci0KLS8qKgotICoKLSAqIENvbnZlcnQgaW50MTZfdCBhcnJheSB0byBmbG9hdCBhcnJheSByYW5naW5nIGZyb20gKy8tIGFtcGxpdHVkZS4KLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bVNhbXBsZXMKLSAqIEBwYXJhbSBhbXBsaXR1ZGUKLSAqLwotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpOwotCi0vKioKLSAqIENvbnZlcnQgZmxvYXRzIHRvIGludDE2X3QgYW5kIHNjYWxlIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUgQUtBIG51bWJlciBvZiBjaGFubmVscwotICogQHBhcmFtIGFtcGxpdHVkZTEgbGV2ZWwgYXQgc3RhcnQgb2YgcmFtcCwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICogQHBhcmFtIGFtcGxpdHVkZTIgbGV2ZWwgYXQgZW5kIG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqLwotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotLyoqCi0gKiBTY2FsZSBmbG9hdHMgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZQotICogQHBhcmFtIGFtcGxpdHVkZTEKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyCi0gKi8KLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpOwotCi0vKioKLSAqIFNjYWxlIGludDE2X3QncyBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lCi0gKiBAcGFyYW0gYW1wbGl0dWRlMQotICogQHBhcmFtIGFtcGxpdHVkZTIKLSAqLwotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpOwotCi1jbGFzcyBBQXVkaW9EYXRhQ29udmVydGVyIHsKLXB1YmxpYzoKLQotICAgIHN0cnVjdCBGb3JtYXR0ZWREYXRhIHsKLQotICAgICAgICBGb3JtYXR0ZWREYXRhKHZvaWQgKmRhdGEsIGFhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICAgICAgOiBkYXRhKGRhdGEpCi0gICAgICAgICAgICAsIGZvcm1hdChmb3JtYXQpCi0gICAgICAgICAgICAsIGNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpIHt9Ci0KLSAgICAgICAgY29uc3Qgdm9pZCAgICAgICAgICAgICpkYXRhID0gbnVsbHB0cjsKLSAgICAgICAgY29uc3QgYWF1ZGlvX2Zvcm1hdF90ICBmb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOwotICAgICAgICBjb25zdCBpbnQzMl90ICAgICAgICAgIGNoYW5uZWxDb3VudCA9IDE7Ci0gICAgfTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnQoY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsVG8pOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRNb25vVG9TdGVyZW8oY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsVG8pOwotCi0gICAgc3RhdGljIHZvaWQgY29udmVydENoYW5uZWxzTWF0Y2goY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLX07Ci0KLS8qKgogICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgYW5kIHByZXZlbnQgbnVtZXJpYyBvdmVyZmxvdy4KICAqIFRoZSAqc2l6ZUluQnl0ZXMgd2lsbCBiZSBzZXQgdG8gemVybyBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAqCkBAIC0yMzQsMTIgKzg0LDYgQEAKICAqLwogYXVkaW9fc291cmNlX3QgQUF1ZGlvQ29udmVydF9pbnB1dFByZXNldFRvQXVkaW9Tb3VyY2UoYWF1ZGlvX2lucHV0X3ByZXNldF90IHByZXNldCk7CiAKLS8qKgotICogQHJldHVybiB0aGUgc2l6ZSBvZiBhIHNhbXBsZSBvZiB0aGUgZ2l2ZW4gZm9ybWF0IGluIGJ5dGVzIG9yIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UCi0gKi8KLWludDMyX3QgQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwotCi0KIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgbWF5IGJlIHJlcGxhY2VkIGJ5IFNldHRpbmdzIG9yIGJ5IHNvbWUgb3RoZXIgc3lzdGVtIGNvbmZpZ3VyYXRpb24gdG9vbC4KIAogI2RlZmluZSBBQVVESU9fUFJPUF9NTUFQX1BPTElDWSAgICAgICAgICAgImFhdWRpby5tbWFwX3BvbGljeSIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxNGJiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTGluZWFyUmFtcC5oIgotCi1ib29sIExpbmVhclJhbXA6OmlzUmFtcGluZygpIHsKLSAgICBmbG9hdCB0YXJnZXQgPSBtVGFyZ2V0LmxvYWQoKTsKLSAgICBpZiAodGFyZ2V0ICE9IG1MZXZlbFRvKSB7Ci0gICAgICAgIC8vIFVwZGF0ZSB0YXJnZXQuIENvbnRpbnVlIGZyb20gcHJldmlvdXMgbGV2ZWwuCi0gICAgICAgIG1MZXZlbFRvID0gdGFyZ2V0OwotICAgICAgICBtUmVtYWluaW5nID0gbUxlbmd0aEluRnJhbWVzOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVJlbWFpbmluZyA+IDA7Ci0gICAgfQotfQotCi1ib29sIExpbmVhclJhbXA6Om5leHRTZWdtZW50KGludDMyX3QgZnJhbWVzLCBmbG9hdCAqbGV2ZWxGcm9tLCBmbG9hdCAqbGV2ZWxUbykgewotICAgIGJvb2wgcmFtcGluZyA9IGlzUmFtcGluZygpOwotICAgICpsZXZlbEZyb20gPSBtTGV2ZWxGcm9tOwotICAgIGlmIChyYW1waW5nKSB7Ci0gICAgICAgIGZsb2F0IGxldmVsOwotICAgICAgICBpZiAoZnJhbWVzID49IG1SZW1haW5pbmcpIHsKLSAgICAgICAgICAgIGxldmVsID0gbUxldmVsVG87Ci0gICAgICAgICAgICBtUmVtYWluaW5nID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEludGVycG9sYXRlIHRvIGEgcG9pbnQgYWxvbmcgdGhlIGZ1bGwgcmFtcC4KLSAgICAgICAgICAgIGxldmVsID0gbUxldmVsRnJvbSArIChmcmFtZXMgKiAobUxldmVsVG8gLSBtTGV2ZWxGcm9tKSAvIG1SZW1haW5pbmcpOwotICAgICAgICAgICAgbVJlbWFpbmluZyAtPSBmcmFtZXM7Ci0gICAgICAgIH0KLSAgICAgICAgbUxldmVsRnJvbSA9IGxldmVsOyAvLyBmb3IgbmV4dCByYW1wCi0gICAgICAgICpsZXZlbFRvID0gbGV2ZWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmxldmVsVG8gPSBtTGV2ZWxUbzsKLSAgICB9Ci0gICAgcmV0dXJuIHJhbXBpbmc7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWI4ZTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQUFVRElPX0xJTkVBUl9SQU1QX0gKLSNkZWZpbmUgQUFVRElPX0xJTkVBUl9SQU1QX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotLyoqCi0gKiBHZW5lcmF0ZSBzZWdtZW50cyBhbG9uZyBhIGxpbmVhciByYW1wLgotICogVGhlIHJhbXAgdGFyZ2V0IGNhbiBiZSB1cGRhdGVkIGZyb20gYW5vdGhlciB0aHJlYWQuCi0gKiBXaGVuIHRoZSB0YXJnZXQgaXMgdXBkYXRlZCwgYSBuZXcgcmFtcCBpcyBzdGFydGVkIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gKgotICogVGhlIGZpcnN0IHJhbXAgc3RhcnRzIGF0IDAuMC4KLSAqCi0gKi8KLWNsYXNzIExpbmVhclJhbXAgewotcHVibGljOgotICAgIExpbmVhclJhbXAoKSB7Ci0gICAgICAgIG1UYXJnZXQuc3RvcmUoMS4wZik7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRMZW5ndGhJbkZyYW1lcyhpbnQzMl90IGZyYW1lcykgewotICAgICAgICBtTGVuZ3RoSW5GcmFtZXMgPSBmcmFtZXM7Ci0gICAgfQotCi0gICAgaW50MzJfdCBnZXRMZW5ndGhJbkZyYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIG1MZW5ndGhJbkZyYW1lczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1heSBiZSBjYWxsZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0gICAgICogQHBhcmFtIHRhcmdldAotICAgICAqLwotICAgIHZvaWQgc2V0VGFyZ2V0KGZsb2F0IHRhcmdldCkgewotICAgICAgICBtVGFyZ2V0LnN0b3JlKHRhcmdldCk7Ci0gICAgfQotCi0gICAgZmxvYXQgZ2V0VGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gbVRhcmdldC5sb2FkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yY2UgdGhlIG5leHRTZWdtZW50IHRvIHN0YXJ0IGZyb20gdGhpcyBsZXZlbC4KLSAgICAgKgotICAgICAqIFdBUk5JTkc6IHRoaXMgY2FuIGNhdXNlIGEgZGlzY29udGludWl0eSBpZiBjYWxsZWQgd2hpbGUgdGhlIHJhbXAgaXMgYmVpbmcgdXNlZC4KLSAgICAgKiBPbmx5IGNhbGwgdGhpcyB3aGVuIHNldHRpbmcgdGhlIGluaXRpYWwgcmFtcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsZXZlbAotICAgICAqLwotICAgIHZvaWQgZm9yY2VDdXJyZW50KGZsb2F0IGxldmVsKSB7Ci0gICAgICAgIG1MZXZlbEZyb20gPSBsZXZlbDsKLSAgICAgICAgbUxldmVsVG8gPSBsZXZlbDsgLy8gZm9yY2VzIGEgcmFtcCBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0YXJnZXQKLSAgICB9Ci0KLSAgICBmbG9hdCBnZXRDdXJyZW50KCkgewotICAgICAgICByZXR1cm4gbUxldmVsRnJvbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbGV2ZWxzIGZvciBuZXh0IHJhbXAgc2VnbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmcmFtZXMgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGUgc2VnbWVudAotICAgICAqIEBwYXJhbSBsZXZlbEZyb20gcG9pbnRlciB0byBzdGFydGluZyBhbXBsaXR1ZGUKLSAgICAgKiBAcGFyYW0gbGV2ZWxUbyBwb2ludGVyIHRvIGVuZGluZyBhbXBsaXR1ZGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmFtcCBpcyBzdGlsbCBtb3ZpbmcgdG93YXJkcyB0aGUgdGFyZ2V0Ci0gICAgICovCi0gICAgYm9vbCBuZXh0U2VnbWVudChpbnQzMl90IGZyYW1lcywgZmxvYXQgKmxldmVsRnJvbSwgZmxvYXQgKmxldmVsVG8pOwotCi1wcml2YXRlOgotCi0gICAgYm9vbCBpc1JhbXBpbmcoKTsKLQotICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgIG1UYXJnZXQ7Ci0KLSAgICBpbnQzMl90IG1MZW5ndGhJbkZyYW1lcyAgPSA0ODAwMCAvIDEwMDsgLy8gMTAgbXNlYyBhdCA0ODAwMCBIegotICAgIGludDMyX3QgbVJlbWFpbmluZyAgICAgICA9IDA7Ci0gICAgZmxvYXQgICBtTGV2ZWxGcm9tICAgICAgID0gMC4wZjsKLSAgICBmbG9hdCAgIG1MZXZlbFRvICAgICAgICAgPSAwLjBmOwotfTsKLQotCi0jZW5kaWYgLy9BQVVESU9fTElORUFSX1JBTVBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKaW5kZXggNTgzM2VhYi4uNjNhZGQ0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCkBAIC00MSwxMCArNDEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvdW50ZXIKKyAgICAgKiBhZHZhbmNlIHRoZSBjdXJyZW50IHZhbHVlIHRvIG1hdGNoIHRoZSBjb3VudGVyCiAgICAgICovCi0gICAgdm9pZCBzZXQoaW50NjRfdCBjb3VudGVyKSB7Ci0gICAgICAgIG1Db3VudGVyNjQgPSBjb3VudGVyOworICAgIHZvaWQgY2F0Y2hVcFRvKGludDY0X3QgY291bnRlcikgeworICAgICAgICBpZiAoKGNvdW50ZXIgLSBtQ291bnRlcjY0KSA+IDApIHsKKyAgICAgICAgICAgIG1Db3VudGVyNjQgPSBjb3VudGVyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDY4MTk0ZGIuLmNiMjQzYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSwxOCBAQAogfQogCiBjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9jbG9ja19tb2RlbCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Nsb2NrX21vZGVsLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X2Jsb2NrX2FkYXB0ZXIiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9ibG9ja19hZGFwdGVyLmNwcCJdLApAQCAtMzQsMTMgKzQ2LDYgQEAKIH0KIAogY2NfdGVzdCB7Ci0gICAgbmFtZTogInRlc3RfbGluZWFyX3JhbXAiLAotICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsidGVzdF9saW5lYXJfcmFtcC5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKLX0KLQotY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3Rfb3Blbl9wYXJhbXMiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9vcGVuX3BhcmFtcy5jcHAiXSwKQEAgLTE2NywzICsxNzIsMjcgQEAKICAgICBzcmNzOiBbInRlc3RfYXRvbWljX2ZpZm8uY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Zsb3dncmFwaCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Zsb3dncmFwaC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X3JldHVybl9zdG9wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfcmV0dXJuX3N0b3AuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCmluZGV4IDBlZGZlYmUuLjEzMGVmNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKQEAgLTE1OCwxNCArMTU4LDE0IEBACiAgICAgICAgIC8vIERvZXMgdGhlIHN1bSBvZiB0aGUgdHdvIHBhcnRzIG1hdGNoIHRoZSBhdmFpbGFibGUgdmFsdWUgcmV0dXJuZWQ/CiAgICAgICAgIC8vIEZvciBFbXB0eVJvb20KICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3Qgd3JhcEF2YWlsYWJsZSA9IG1GaWZvQnVmZmVyLmdldEVtcHR5Um9vbUF2YWlsYWJsZSgmd3JhcHBpbmdCdWZmZXIpOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCB3cmFwQXZhaWxhYmxlKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBib3RoQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzBdICsgd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzFdOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCBib3RoQXZhaWxhYmxlKTsKICAgICAgICAgLy8gRm9yIEZ1bGxEYXRhCiAgICAgICAgIGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIHdyYXBBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci5nZXRGdWxsRGF0YUF2YWlsYWJsZSgmd3JhcHBpbmdCdWZmZXIpOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCB3cmFwQXZhaWxhYmxlKTsKICAgICAgICAgYm90aEF2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSArIHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXTsKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgIC8vIFdyaXRlIGRhdGEgYnV0IGRvIG5vdCBvdmVyZmxvdy4KICAgICB2b2lkIHdyaXRlTXVsdGlwbGVEYXRhRnJhbWVzKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvV3JpdGUgPSBzdGQ6Om1pbihmcmFtZXNBdmFpbGFibGUsIG51bUZyYW1lcyk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzVG9Xcml0ZTsgaSsrKSB7CiAgICAgICAgICAgICBtRGF0YVtpXSA9IG1OZXh0V3JpdGVJbmRleCsrOwpAQCAtMjEwLDcgKzIxMCw3IEBACiAgICAgLy8gUmVhZCB3aGF0ZXZlciBkYXRhIGlzIGF2YWlsYWJsZSwgRG8gbm90IHVuZGVyZmxvdy4KICAgICB2b2lkIHZlcmlmeU11bHRpcGxlRGF0YUZyYW1lcyhmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLnJlYWQobURhdGEsIGZyYW1lc1RvUmVhZCk7CiAgICAgICAgIEFTU0VSVF9FUShmcmFtZXNUb1JlYWQsIGFjdHVhbCk7CkBAIC0yMjIsNyArMjIyLDcgQEAKICAgICAvLyBSZWFkIHNwZWNpZmllZCBudW1iZXIgb2YgZnJhbWVzCiAgICAgdm9pZCB2ZXJpZnlSZXF1ZXN0ZWREYXRhKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgQVNTRVJUX0xFKG51bUZyYW1lcywgZnJhbWVzQXZhaWxhYmxlKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1JlYWQgPSBzdGQ6Om1pbihmcmFtZXNBdmFpbGFibGUsIG51bUZyYW1lcyk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgYWN0dWFsID0gbUZpZm9CdWZmZXIucmVhZChtRGF0YSwgZnJhbWVzVG9SZWFkKTsKQEAgLTI4MiwxMiArMjgyLDEyIEBACiAgICAgdm9pZCBjaGVja1JhbmRvbVdyaXRlUmVhZCgpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0VtcHR5ID0KLSAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IG51bUZyYW1lcyA9IChmaWZvX2ZyYW1lc190KShkcmFuZDQ4KCkgKiBmcmFtZXNFbXB0eSk7CiAgICAgICAgICAgICB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhudW1GcmFtZXMpOwogCiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0Z1bGwgPQotICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICBudW1GcmFtZXMgPSAoZmlmb19mcmFtZXNfdCkoZHJhbmQ0OCgpICogZnJhbWVzRnVsbCk7CiAgICAgICAgICAgICB2ZXJpZnlNdWx0aXBsZURhdGFGcmFtZXMobnVtRnJhbWVzKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcAppbmRleCBiMDFhZjI1Li5kYmY4NzEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcApAQCAtMTMwLDYgKzEzMCw3IEBACiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTiwKICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04sCiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFLAogfTsKIAogc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzVXNhZ2UoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfY2xvY2tfbW9kZWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfY2xvY2tfbW9kZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmN2FiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jbG9ja19tb2RlbC5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IHRlc3RzIGZvciBJc29jaHJvbm91cyBDbG9jayBNb2RlbAorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxjbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKKworLy8gV2UgY2FuIHVzZSBhcmJpdHJhcnkgdmFsdWVzIGhlcmUgYmVjYXVzZSB3ZSBhcmUgbm90IG9wZW5pbmcgYSByZWFsIGF1ZGlvIHN0cmVhbS4KKyNkZWZpbmUgU0FNUExFX1JBVEUgICAgICAgICAgICAgNDgwMDAKKyNkZWZpbmUgSFdfRlJBTUVTX1BFUl9CVVJTVCAgICAgNDgKKyNkZWZpbmUgTkFOT1NfUEVSX0JVUlNUICAgICAgICAgKE5BTk9TX1BFUl9TRUNPTkQgKiBIV19GUkFNRVNfUEVSX0JVUlNUIC8gU0FNUExFX1JBVEUpCisKK2NsYXNzIENsb2NrTW9kZWxUZXN0Rml4dHVyZTogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgQ2xvY2tNb2RlbFRlc3RGaXh0dXJlKCkgeworICAgIH0KKworICAgIHZvaWQgU2V0VXAoKSB7CisgICAgICAgIG1vZGVsLnNldFNhbXBsZVJhdGUoU0FNUExFX1JBVEUpOworICAgICAgICBtb2RlbC5zZXRGcmFtZXNQZXJCdXJzdChIV19GUkFNRVNfUEVSX0JVUlNUKTsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgeworICAgIH0KKworICAgIH5DbG9ja01vZGVsVGVzdEZpeHR1cmUoKSAgeworICAgICAgICAvLyBjbGVhbnVwIGFueSBwZW5kaW5nIHN0dWZmLCBidXQgbm8gZXhjZXB0aW9ucyBhbGxvd2VkCisgICAgfQorCisgICAgLy8gVGVzdCBwcm9jZXNzaW5nIG9mIHRpbWVzdGFtcHMgd2hlbiB0aGUgaGFyZHdhcmUgbWF5IGJlIHNsaWdodGx5IG9mZiBmcm9tCisgICAgLy8gdGhlIGV4cGVjdGVkIHNhbXBsZSByYXRlLgorICAgIHZvaWQgY2hlY2tEcmlmdGluZ0Nsb2NrKGRvdWJsZSBoYXJkd2FyZUZyYW1lc1BlclNlY29uZCwgaW50IG51bUxvb3BzKSB7CisgICAgICAgIGNvbnN0IGludDY0X3Qgc3RhcnRUaW1lTmFub3MgPSA1MDAwMDAwMDA7IC8vIGFyYml0cmFyeQorICAgICAgICBtb2RlbC5zdGFydChzdGFydFRpbWVOYW5vcyk7CisKKyAgICAgICAgY29uc3QgaW50NjRfdCBzdGFydFBvc2l0aW9uRnJhbWVzID0gSFdfRlJBTUVTX1BFUl9CVVJTVDsgLy8gaGFyZHdhcmUKKyAgICAgICAgLy8gYXJiaXRyYXJ5IHRpbWUgZm9yIGZpcnN0IGJ1cnN0CisgICAgICAgIGNvbnN0IGludDY0X3QgbWFya2VyVGltZSA9IHN0YXJ0VGltZU5hbm9zICsgTkFOT1NfUEVSX01JTExJU0VDT05ECisgICAgICAgICAgICAgICAgKyAoMjAwICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKworICAgICAgICAvLyBTaG91bGQgc2V0IGluaXRpYWwgbWFya2VyLgorICAgICAgICBtb2RlbC5wcm9jZXNzVGltZXN0YW1wKHN0YXJ0UG9zaXRpb25GcmFtZXMsIG1hcmtlclRpbWUpOworICAgICAgICBBU1NFUlRfRVEoc3RhcnRQb3NpdGlvbkZyYW1lcywgbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKG1hcmtlclRpbWUpKTsKKworICAgICAgICBkb3VibGUgZWxhcHNlZFRpbWVTZWNvbmRzID0gc3RhcnRUaW1lTmFub3MgLyAoZG91YmxlKSBOQU5PU19QRVJfU0VDT05EOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxvb3BzOyBpKyspIHsKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSByYW5kb20gZGVsYXkgb3ZlciBzZXZlcmFsIGJ1cnN0cy4KKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB0aW1lRGVsYXlTZWNvbmRzID0gMTAuMCAqIGRyYW5kNDgoKSAqIE5BTk9TX1BFUl9CVVJTVCAvIE5BTk9TX1BFUl9TRUNPTkQ7CisgICAgICAgICAgICBlbGFwc2VkVGltZVNlY29uZHMgKz0gdGltZURlbGF5U2Vjb25kczsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZWxhcHNlZFRpbWVOYW5vcyA9IChpbnQ2NF90KShlbGFwc2VkVGltZVNlY29uZHMgKiBOQU5PU19QRVJfU0VDT05EKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWVOYW5vcyA9IHN0YXJ0VGltZU5hbm9zICsgZWxhcHNlZFRpbWVOYW5vczsKKyAgICAgICAgICAgIC8vIFNpbXVsYXRlIERTUCBydW5uaW5nIGF0IHRoZSBzcGVjaWZpZWQgcmF0ZS4KKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWVGcmFtZXMgPSBzdGFydFBvc2l0aW9uRnJhbWVzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkoaGFyZHdhcmVGcmFtZXNQZXJTZWNvbmQgKiBlbGFwc2VkVGltZVNlY29uZHMpOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBudW1CdXJzdHMgPSBjdXJyZW50VGltZUZyYW1lcyAvIEhXX0ZSQU1FU19QRVJfQlVSU1Q7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGFsaWduZWRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb25GcmFtZXMgKyAobnVtQnVyc3RzICogSFdfRlJBTUVTX1BFUl9CVVJTVCk7CisKKyAgICAgICAgICAgIC8vIEFwcGx5IGRyaWZ0aW5nIHRpbWVzdGFtcC4KKyAgICAgICAgICAgIG1vZGVsLnByb2Nlc3NUaW1lc3RhbXAoYWxpZ25lZFBvc2l0aW9uLCBjdXJyZW50VGltZU5hbm9zKTsKKworICAgICAgICAgICAgQVNTRVJUX0VRKGFsaWduZWRQb3NpdGlvbiwgbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKGN1cnJlbnRUaW1lTmFub3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElzb2Nocm9ub3VzQ2xvY2tNb2RlbCBtb2RlbDsKK307CisKKy8vIENoZWNrIGRlZmF1bHQgc2V0dXAuCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19zZXR1cCkgeworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSwgbW9kZWwuZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBBU1NFUlRfRVEoSFdfRlJBTUVTX1BFUl9CVVJTVCwgbW9kZWwuZ2V0RnJhbWVzUGVyQnVyc3QoKSk7Cit9CisKKy8vIFRlc3QgZGVsdGEgY2FsY3VsYXRpb25zLgorVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfZGVsdGFzKSB7CisgICAgaW50NjRfdCBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnREZWx0YVRpbWVUb1Bvc2l0aW9uKE5BTk9TX1BFUl9TRUNPTkQpOworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSwgcG9zaXRpb24pOworCisgICAgLy8gRGVsdGFzIGFyZSBub3QgcXVhbnRpemVkLgorICAgIC8vIENvbXBhcmUgdGltZSB0byB0aGUgZXF1aXZhbGVudCBwb3NpdGlvbiBpbiBmcmFtZXMuCisgICAgY29uc3RleHByIGludDY0X3Qga05hbm9zUGVyQnVyc3QgPSBIV19GUkFNRVNfUEVSX0JVUlNUICogTkFOT1NfUEVSX1NFQ09ORCAvIFNBTVBMRV9SQVRFOworICAgIHBvc2l0aW9uID0gbW9kZWwuY29udmVydERlbHRhVGltZVRvUG9zaXRpb24oTkFOT1NfUEVSX1NFQ09ORCArIChrTmFub3NQZXJCdXJzdCAvIDIpKTsKKyAgICBBU1NFUlRfRVEoU0FNUExFX1JBVEUgKyAoSFdfRlJBTUVTX1BFUl9CVVJTVCAvIDIpLCBwb3NpdGlvbik7CisKKyAgICBpbnQ2NF90IHRpbWUgPSBtb2RlbC5jb252ZXJ0RGVsdGFQb3NpdGlvblRvVGltZShTQU1QTEVfUkFURSk7CisgICAgQVNTRVJUX0VRKE5BTk9TX1BFUl9TRUNPTkQsIHRpbWUpOworCisgICAgLy8gQ29tcGFyZSBwb3NpdGlvbiBpbiBmcmFtZXMgdG8gdGhlIGVxdWl2YWxlbnQgdGltZS4KKyAgICB0aW1lID0gbW9kZWwuY29udmVydERlbHRhUG9zaXRpb25Ub1RpbWUoU0FNUExFX1JBVEUgKyAoSFdfRlJBTUVTX1BFUl9CVVJTVCAvIDIpKTsKKyAgICBBU1NFUlRfRVEoTkFOT1NfUEVSX1NFQ09ORCArIChrTmFub3NQZXJCdXJzdCAvIDIpLCB0aW1lKTsKK30KKworLy8gc3RhcnQoKSBzaG91bGQgZm9yY2UgdGhlIGludGVybmFsIG1hcmtlcnMKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3N0YXJ0KSB7CisgICAgY29uc3QgaW50NjRfdCBzdGFydFRpbWUgPSAxMDAwMDA7CisgICAgbW9kZWwuc3RhcnQoc3RhcnRUaW1lKTsKKworICAgIGludDY0X3QgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oc3RhcnRUaW1lKTsKKyAgICBFWFBFQ1RfRVEoMCwgcG9zaXRpb24pOworCisgICAgaW50NjRfdCB0aW1lID0gbW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKHBvc2l0aW9uKTsKKyAgICBFWFBFQ1RfRVEoc3RhcnRUaW1lLCB0aW1lKTsKKworICAgIHRpbWUgPSBzdGFydFRpbWUgKyAoNTAwICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKyAgICBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbih0aW1lKTsKKyAgICBFWFBFQ1RfRVEoMCwgcG9zaXRpb24pOworfQorCisvLyB0aW1lc3RhbXBzIG1vdmVzIHRoZSB3aW5kb3cgaWYgb3V0c2lkZSB0aGUgYm91bmRzCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja190aW1lc3RhbXApIHsKKyAgICBjb25zdCBpbnQ2NF90IHN0YXJ0VGltZSA9IDEwMDAwMDAwMDsKKyAgICBtb2RlbC5zdGFydChzdGFydFRpbWUpOworCisgICAgY29uc3QgaW50NjRfdCBwb3NpdGlvbiA9IEhXX0ZSQU1FU19QRVJfQlVSU1Q7IC8vIGhhcmR3YXJlCisgICAgaW50NjRfdCBtYXJrZXJUaW1lID0gc3RhcnRUaW1lICsgTkFOT1NfUEVSX01JTExJU0VDT05EICsgKDIwMCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisKKyAgICAvLyBTaG91bGQgc2V0IG1hcmtlci4KKyAgICBtb2RlbC5wcm9jZXNzVGltZXN0YW1wKHBvc2l0aW9uLCBtYXJrZXJUaW1lKTsKKyAgICBFWFBFQ1RfRVEocG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lKSk7CisKKyAgICAvLyBjb252ZXJ0VGltZVRvUG9zaXRpb24gcm91bmRzIGRvd24KKyAgICBFWFBFQ1RfRVEocG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lICsgKDczICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKSkpOworCisgICAgLy8gY29udmVydFBvc2l0aW9uVG9UaW1lIHJvdW5kcyB1cAorICAgIEVYUEVDVF9FUShtYXJrZXJUaW1lICsgTkFOT1NfUEVSX0JVUlNULCBtb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUocG9zaXRpb24gKyAxNykpOworfQorCisjZGVmaW5lIE5VTV9MT09QU19EUklGVCAgIDEwMDAwCisKKy8vIHRlc3QgbnVkZ2luZyB0aGUgd2luZG93IGJ5IHVzaW5nIGEgZHJpZnRpbmcgSFcgY2xvY2sKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX25vX2RyaWZ0KSB7CisgICAgY2hlY2tEcmlmdGluZ0Nsb2NrKFNBTVBMRV9SQVRFLCBOVU1fTE9PUFNfRFJJRlQpOworfQorCisvLyBUaGVzZSBzbG93IGRyaWZ0IHJhdGVzIGNhdXNlZCBlcnJvcnMgd2hlbiBJIGRpc2FibGVkIHRoZSBjb2RlIHRoYXQgaGFuZGxlcworLy8gZHJpZnRpbmcgaW4gdGhlIGNsb2NrIG1vZGVsLiBTbyBJIHRoaW5rIHRoZSB0ZXN0IGlzIHZhbGlkLgorLy8gSXQgaXMgdW5saWtlbHkgdGhhdCByZWFsIGhhcmR3YXJlIHdvdWxkIGJlIG9mZiBieSBtb3JlIHRoYW4gdGhpcyBhbW91bnQuCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19zbG93X2RyaWZ0KSB7CisgICAgY2hlY2tEcmlmdGluZ0Nsb2NrKDAuOTk4ICogU0FNUExFX1JBVEUsIE5VTV9MT09QU19EUklGVCk7Cit9CisKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX2Zhc3RfZHJpZnQpIHsKKyAgICBjaGVja0RyaWZ0aW5nQ2xvY2soMS4wMDIgKiBTQU1QTEVfUkFURSwgTlVNX0xPT1BTX0RSSUZUKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTYzYTdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRlc3QgRmxvd0dyYXBoCisgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgImZsb3dncmFwaC9DbGlwVG9SYW5nZS5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VGbG9hdC5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9SYW1wTGluZWFyLmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtGbG9hdC5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTE2LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtJMjQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlSTE2LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUkyNC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitjb25zdGV4cHIgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9zaW5raTE2KSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7MS4wZiwgMC41ZiwgLTAuMjVmLCAtMS4wZiwgMC4wZiwgNTMuOWYsIC04Ny4yZn07CisgICAgc3RhdGljIGNvbnN0IGludDE2X3QgZXhwZWN0ZWRbXSA9IHszMjc2NywgMTYzODQsIC04MTkyLCAtMzI3NjgsIDAsIDMyNzY3LCAtMzI3Njh9OworICAgIGludDE2X3Qgb3V0cHV0WzIwXTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBTaW5rSTE2IHNpbmtJMTZ7MX07CisKKyAgICBpbnQgbnVtSW5wdXRGcmFtZXMgPSBzaXplb2YoaW5wdXQpIC8gc2l6ZW9mKGlucHV0WzBdKTsKKyAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGlucHV0LCBudW1JbnB1dEZyYW1lcyk7CisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJnNpbmtJMTYuaW5wdXQpOworCisgICAgaW50IG51bU91dHB1dEZyYW1lcyA9IHNpemVvZihvdXRwdXQpIC8gc2l6ZW9mKGludDE2X3QpOworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtJMTYucmVhZChvdXRwdXQsIG51bU91dHB1dEZyYW1lcyk7CisgICAgQVNTRVJUX0VRKG51bUlucHV0RnJhbWVzLCBudW1SZWFkKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlYWQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSk7CisgICAgfQorfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfbW9ub190b19zdGVyZW8pIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgaW5wdXRbXSA9IHsxLjBmLCAyLjBmLCAzLjBmfTsKKyAgICBmbG9hdCBvdXRwdXRbMTAwXSA9IHt9OworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIE1vbm9Ub011bHRpQ29udmVydGVyIG1vbm9Ub1N0ZXJlb3syfTsKKyAgICBTaW5rRmxvYXQgc2lua0Zsb2F0ezJ9OworCisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgMyk7CisKKyAgICBzb3VyY2VGbG9hdC5vdXRwdXQuY29ubmVjdCgmbW9ub1RvU3RlcmVvLmlucHV0KTsKKyAgICBtb25vVG9TdGVyZW8ub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CisKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIDgpOworICAgIEFTU0VSVF9FUSgzLCBudW1SZWFkKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMF0sIG91dHB1dFswXSk7CisgICAgRVhQRUNUX0VRKGlucHV0WzBdLCBvdXRwdXRbMV0pOworICAgIEVYUEVDVF9FUShpbnB1dFsxXSwgb3V0cHV0WzJdKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMV0sIG91dHB1dFszXSk7Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9yYW1wX2xpbmVhcikgeworICAgIGNvbnN0ZXhwciBpbnQgcmFtcFNpemUgPSA1OworICAgIGNvbnN0ZXhwciBpbnQgbnVtT3V0cHV0ID0gMTAwOworICAgIGNvbnN0ZXhwciBmbG9hdCB2YWx1ZSA9IDEuMGY7CisgICAgY29uc3RleHByIGZsb2F0IHRhcmdldCA9IDEwMC4wZjsKKyAgICBmbG9hdCBvdXRwdXRbbnVtT3V0cHV0XSA9IHt9OworICAgIFJhbXBMaW5lYXIgcmFtcExpbmVhcnsxfTsKKyAgICBTaW5rRmxvYXQgc2lua0Zsb2F0ezF9OworCisgICAgcmFtcExpbmVhci5pbnB1dC5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgcmFtcExpbmVhci5zZXRMZW5ndGhJbkZyYW1lcyhyYW1wU2l6ZSk7CisgICAgcmFtcExpbmVhci5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICByYW1wTGluZWFyLmZvcmNlQ3VycmVudCgwLjBmKTsKKworICAgIHJhbXBMaW5lYXIub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CisKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIG51bU91dHB1dCk7CisgICAgQVNTRVJUX0VRKG51bU91dHB1dCwgbnVtUmVhZCk7CisgICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMWY7IC8vIGFyYml0cmFyeQorICAgIGludCBpID0gMDsKKyAgICBmb3IgKDsgaSA8IHJhbXBTaXplOyBpKyspIHsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSBpICogdmFsdWUgKiB0YXJnZXQgLyByYW1wU2l6ZTsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWQsIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBudW1PdXRwdXQ7IGkrKykgeworICAgICAgICBmbG9hdCBleHBlY3RlZCA9IHZhbHVlICogdGFyZ2V0OworICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZCwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOworICAgIH0KK30KKworLy8gSXQgaXMgZWFzaWVzdCB0byByZXByZXNlbnQgcGFja2VkIDI0LWJpdCBkYXRhIGFzIGEgYnl0ZSBhcnJheS4KKy8vIFRoaXMgdGVzdCB3aWxsIHJlYWQgZnJvbSBpbnB1dCwgY29udmVydCB0byBmbG9hdCwgdGhlbiB3cml0ZQorLy8gYmFjayB0byBvdXRwdXQgYXMgYnl0ZXMuCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfcGFja2VkXzI0KSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW5wdXRbXSA9IHsweDAxLCAweDIzLCAweDQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NywgMHg4OSwgMHhBQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Q0QsIDB4RUYsIDB4NUF9OworICAgIHVpbnQ4X3Qgb3V0cHV0Wzk5XSA9IHt9OworICAgIFNvdXJjZUkyNCBzb3VyY2VJMjR7MX07CisgICAgU2lua0kyNCBzaW5rSTI0ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIGtCeXRlc1BlckkyNFBhY2tlZDsKKyAgICBzb3VyY2VJMjQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworICAgIHNvdXJjZUkyNC5vdXRwdXQuY29ubmVjdCgmc2lua0kyNC5pbnB1dCk7CisKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTI0LnJlYWQob3V0cHV0LCBzaXplb2Yob3V0cHV0KSAvIGtCeXRlc1BlckkyNFBhY2tlZCk7CisgICAgQVNTRVJUX0VRKG51bUlucHV0RnJhbWVzLCBudW1SZWFkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihpbnB1dCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoaW5wdXRbaV0sIG91dHB1dFtpXSk7CisgICAgfQorfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfY2xpcF90b19yYW5nZSkgeworICAgIGNvbnN0ZXhwciBmbG9hdCBteU1pbiA9IC0yLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCBteU1heCA9IDEuNWY7CisKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgaW5wdXRbXSA9IHstOS43LCAwLjVmLCAtMC4yNSwgMS4wZiwgMTIuM307CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGV4cGVjdGVkW10gPSB7bXlNaW4sIDAuNWYsIC0wLjI1LCAxLjBmLCBteU1heH07CisgICAgZmxvYXQgb3V0cHV0WzEwMF07CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgQ2xpcFRvUmFuZ2UgY2xpcHBlcnsxfTsKKyAgICBTaW5rRmxvYXQgc2lua0Zsb2F0ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIHNpemVvZihpbnB1dFswXSk7CisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworCisgICAgY2xpcHBlci5zZXRNaW5pbXVtKG15TWluKTsKKyAgICBjbGlwcGVyLnNldE1heGltdW0obXlNYXgpOworCisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJmNsaXBwZXIuaW5wdXQpOworICAgIGNsaXBwZXIub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CisKKyAgICBpbnQgbnVtT3V0cHV0RnJhbWVzID0gc2l6ZW9mKG91dHB1dCkgLyBzaXplb2Yob3V0cHV0WzBdKTsKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIG51bU91dHB1dEZyYW1lcyk7CisgICAgQVNTRVJUX0VRKG51bUlucHV0RnJhbWVzLCBudW1SZWFkKTsKKyAgICBjb25zdGV4cHIgZmxvYXQgdG9sZXJhbmNlID0gMC4wMDAwMDFmOyAvLyBhcmJpdHJhcnkKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlYWQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyMjZiYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0xpbmVhclJhbXAuaCIKLQotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBsaW5lYXJfcmFtcF9zZWdtZW50cykgewotICAgIExpbmVhclJhbXAgcmFtcDsKLSAgICBjb25zdCBmbG9hdCBzb3VyY2VbNF0gPSB7MS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotICAgIGZsb2F0IGRlc3RpbmF0aW9uWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQotICAgIGZsb2F0IGxldmVsRnJvbSA9IC0xLjBmOwotICAgIGZsb2F0IGxldmVsVG8gPSAtMS4wZjsKLSAgICByYW1wLnNldExlbmd0aEluRnJhbWVzKDgpOwotICAgIHJhbXAuc2V0VGFyZ2V0KDguMGYpOwotCi0gICAgRVhQRUNUX0VRKDgsIHJhbXAuZ2V0TGVuZ3RoSW5GcmFtZXMoKSk7Ci0KLSAgICBib29sIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDAuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSgxLjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDIuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoMy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgxLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg0LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDUuMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoNi4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg3LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLSAgICByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDAsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotfTsKLQotCi1URVNUKHRlc3RfbGluZWFyX3JhbXAsIGxpbmVhcl9yYW1wX2ZvcmNlZCkgewotICAgIExpbmVhclJhbXAgcmFtcDsKLSAgICBjb25zdCBmbG9hdCBzb3VyY2VbNF0gPSB7MS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotICAgIGZsb2F0IGRlc3RpbmF0aW9uWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQotICAgIGZsb2F0IGxldmVsRnJvbSA9IC0xLjBmOwotICAgIGZsb2F0IGxldmVsVG8gPSAtMS4wZjsKLSAgICByYW1wLnNldExlbmd0aEluRnJhbWVzKDQpOwotICAgIHJhbXAuc2V0VGFyZ2V0KDguMGYpOwotICAgIHJhbXAuZm9yY2VDdXJyZW50KDQuMGYpOwotICAgIEVYUEVDVF9FUSg0LjBmLCByYW1wLmdldEN1cnJlbnQoKSk7Ci0KLSAgICBib29sIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgwLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLX07Ci0KLWNvbnN0ZXhwciBpbnQxNl90IGtNYXhJMTYgPSBJTlQxNl9NQVg7Ci1jb25zdGV4cHIgaW50MTZfdCBrTWluSTE2ID0gSU5UMTZfTUlOOwotY29uc3RleHByIGludDE2X3Qga0hhbGZJMTYgPSAxNjM4NDsKLWNvbnN0ZXhwciBpbnQxNl90IGtUZW50aEkxNiA9IDMyNzc7Ci0KLS8vdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpOwotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBmbG9hdF90b19pMTYpIHsKLSAgICBjb25zdCBmbG9hdCBzb3VyY2VbXSA9IHsxMjM0NS42ZiwgMS4wZiwgMC41ZiwgMC4xZiwgMC4wZiwgLTAuMWYsIC0wLjVmLCAtMS4wZiwgLTEyMzQ1LjZmfTsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKLSAgICBpbnQxNl90IGRlc3RpbmF0aW9uW2NvdW50XTsKLSAgICBjb25zdCBpbnQxNl90IGV4cGVjdGVkW2NvdW50XSA9IHtrTWF4STE2LCBrTWF4STE2LCBrSGFsZkkxNiwga1RlbnRoSTE2LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNiwga01pbkkxNn07Ci0KLSAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMS4wZik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0pOwotICAgIH0KLQotfQotCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgaTE2X3RvX2Zsb2F0KSB7Ci0gICAgY29uc3QgaW50MTZfdCBzb3VyY2VbXSA9IHtrTWF4STE2LCBrSGFsZkkxNiwga1RlbnRoSTE2LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWtUZW50aEkxNiwgLWtIYWxmSTE2LCBrTWluSTE2fTsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgY29uc3QgZmxvYXQgZXhwZWN0ZWRbY291bnRdID0geygzMjc2Ny4wZiAvIDMyNzY4LjBmKSwgMC41ZiwgMC4xZiwgMC4wZiwgLTAuMWYsIC0wLjVmLCAtMS4wZn07Ci0KLSAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMS4wZik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkW2ldLCBkZXN0aW5hdGlvbltpXSwgMC4wMDAxZik7Ci0gICAgfQotCi19Ci0KLS8vdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLS8vICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgcmFtcF9pMTZfdG9faTE2KSB7Ci0gICAgY29uc3QgaW50MTZfdCBzb3VyY2VbXSA9IHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKLSAgICBpbnQxNl90IGRlc3RpbmF0aW9uW2NvdW50XTsKLSAgICAvLyBSYW1wIHdpbGwgc3dlZXAgZnJvbSAtMSB0byBhbG1vc3QgKzEKLSAgICBjb25zdCBpbnQxNl90IGV4cGVjdGVkW2NvdW50XSA9IHsKLSAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0xLjAwCi0gICAgICAgICAgICAtMSwgLy8gZnJvbSAtMC43NQotICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNTUsIHJvdW5kIGF3YXkgZnJvbSB6ZXJvCi0gICAgICAgICAgICAwLCAgLy8gZnJvbSAtMC4yNSwgcm91bmQgdXAgdG8gemVybwotICAgICAgICAgICAgMCwgIC8vIGZyb20gIDAuMDAKLSAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjI1LCByb3VuZCBkb3duIHRvIHplcm8KLSAgICAgICAgICAgIDEsICAvLyBmcm9tICAwLjUwLCByb3VuZCBhd2F5IGZyb20gemVybwotICAgICAgICAgICAgMSAgIC8vIGZyb20gIDAuNzUKLSAgICB9OwotCi0gICAgLy8gc3dlZXAgYWNyb3NzIHplcm8gdG8gdGVzdCBzeW1tZXRyeQotICAgIGNvbnN0ZXhwciBmbG9hdCBhbXBsaXR1ZGUxID0gLTEuMDsKLSAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMiA9IDEuMDsKLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMSwgYW1wbGl0dWRlMSwgYW1wbGl0dWRlMik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNTJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9yZXR1cm5fc3RvcC5jcHAKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFJldHVybiBzdG9wIGZyb20gdGhlIGNhbGxiYWNrLgorICogRXhwZWN0IHRoZSBjYWxsYmFjayB0byBjZWFzZS4KKyAqIENoZWNrIHRoZSBsb2djYXQgZm9yIGJhZCBiZWhhdmlvci4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisKKyNkZWZpbmUgREVGQVVMVF9USU1FT1VUX05BTk9TICAoKGludDY0X3QpMTAwMDAwMDAwMCkKKyNkZWZpbmUgU1RPUF9BVF9NU0VDICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTE9PUF9EVVJBVElPTl9NU0VDICAgIDQwMDAKKyNkZWZpbmUgU0xFRVBfRFVSQVRJT05fTVNFQyAgICAyMDAKKworc3RhdGljIHZvaWQgc19teUVycm9yQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcik7CisKK3N0cnVjdCBBdWRpb0VuZ2luZSB7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYnVpbGRlciA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICAgICAgICAqc3RyZWFtID0gbnVsbHB0cjsKKyAgICBzdGQ6OnRocmVhZCAgICAgICAgICp0aHJlYWQgPSBudWxscHRyOworICAgIGludDMyX3QgICAgICAgICAgICAgIHN0b3BBdEZyYW1lID0gMDsKKyAgICBib29sICAgICAgICAgICAgICAgICBzdG9wcGVkID0gZmFsc2U7CisgICAgLy8gVGhlc2UgY291bnRlcnMgYXJlIHJlYWQgYW5kIHdyaXR0ZW4gYnkgdGhlIGNhbGxiYWNrIGFuZCB0aGUgbWFpbiB0aHJlYWQuCisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gZnJhbWVzUmVhZHt9OworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IHN0YXJ0aW5nRnJhbWVzUmVhZHt9OworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGZyYW1lc0NhbGxlZHt9OworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGNhbGxiYWNrQ291bnR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBjYWxsYmFja0NvdW50QWZ0ZXJTdG9we307CisKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBmcmFtZXNSZWFkLnN0b3JlKDApOworICAgICAgICBzdGFydGluZ0ZyYW1lc1JlYWQuc3RvcmUoMCk7CisgICAgICAgIGZyYW1lc0NhbGxlZC5zdG9yZSgwKTsKKyAgICAgICAgY2FsbGJhY2tDb3VudC5zdG9yZSgwKTsKKyAgICAgICAgY2FsbGJhY2tDb3VudEFmdGVyU3RvcC5zdG9yZSgwKTsKKyAgICAgICAgc3RvcHBlZCA9IGZhbHNlOworICAgIH0KK307CisKKy8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCitzdGF0aWMgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3Qgc19teURhdGFDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgdm9pZCAqYXVkaW9EYXRhLAorICAgICAgICBpbnQzMl90IG51bUZyYW1lcworKSB7CisgICAgKHZvaWQpIGF1ZGlvRGF0YTsKKyAgICAodm9pZCkgbnVtRnJhbWVzOworICAgIEF1ZGlvRW5naW5lICplbmdpbmUgPSAoc3RydWN0IEF1ZGlvRW5naW5lICopdXNlckRhdGE7CisgICAgZW5naW5lLT5jYWxsYmFja0NvdW50Kys7CisgICAgaWYgKGVuZ2luZS0+c3RvcHBlZCkgeworICAgICAgICBlbmdpbmUtPmNhbGxiYWNrQ291bnRBZnRlclN0b3ArKzsKKyAgICB9CisKKyAgICBlbmdpbmUtPmZyYW1lc1JlYWQgPSAoaW50MzJfdClBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0pOworICAgIGlmIChlbmdpbmUtPnN0YXJ0aW5nRnJhbWVzUmVhZCA9PSAwKSB7CisgICAgICAgIGVuZ2luZS0+c3RhcnRpbmdGcmFtZXNSZWFkLnN0b3JlKGVuZ2luZS0+ZnJhbWVzUmVhZC5sb2FkKCkpOworICAgIH0KKyAgICBlbmdpbmUtPmZyYW1lc0NhbGxlZCArPSBudW1GcmFtZXM7CisgICAgaWYgKGVuZ2luZS0+ZnJhbWVzQ2FsbGVkID49IGVuZ2luZS0+c3RvcEF0RnJhbWUpIHsKKyAgICAgICAgZW5naW5lLT5zdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKKyAgICB9Cit9CisKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3Qgc19PcGVuQXVkaW9TdHJlYW0oc3RydWN0IEF1ZGlvRW5naW5lICplbmdpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgeworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZlbmdpbmUtPmJ1aWxkZXIpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIgcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChlbmdpbmUtPmJ1aWxkZXIsIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShlbmdpbmUtPmJ1aWxkZXIsIHBlcmZNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKGVuZ2luZS0+YnVpbGRlciwgc2hhcmluZ01vZGUpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKGVuZ2luZS0+YnVpbGRlciwgZGlyZWN0aW9uKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhlbmdpbmUtPmJ1aWxkZXIsIHNfbXlEYXRhQ2FsbGJhY2tQcm9jLCBlbmdpbmUpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjayhlbmdpbmUtPmJ1aWxkZXIsIHNfbXlFcnJvckNhbGxiYWNrUHJvYywgZW5naW5lKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGVuZ2luZS0+YnVpbGRlciwgJmVuZ2luZS0+c3RyZWFtKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfQ2xvc2VBdWRpb1N0cmVhbShzdHJ1Y3QgQXVkaW9FbmdpbmUgKmVuZ2luZSkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgaWYgKGVuZ2luZS0+c3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2Nsb3NlKGVuZ2luZS0+c3RyZWFtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX2Nsb3NlIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICB9CisgICAgICAgIGVuZ2luZS0+c3RyZWFtID0gbnVsbHB0cjsKKyAgICB9CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoZW5naW5lLT5idWlsZGVyKTsKKyAgICBlbmdpbmUtPmJ1aWxkZXIgPSBudWxscHRyOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0gX191bnVzZWQsCisgICAgICAgIHZvaWQgKnVzZXJEYXRhIF9fdW51c2VkLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpIHsKKyAgICBwcmludGYoIiVzKCkgLSBlcnJvciA9ICVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpOworfQorCitzdGF0aWMgdm9pZCBzX3VzYWdlKCkgeworICAgIHByaW50ZigidGVzdF9yZXR1cm5fc3RvcCBbLWldIFsteF0gWy1uXSBbLWNdXG4iKTsKKyAgICBwcmludGYoIiAgICAgLWkgZGlyZWN0aW9uIElOUFVULCBvdGhlcndpc2UgT1VUUFVUXG4iKTsKKyAgICBwcmludGYoIiAgICAgLXggc2hhcmluZyBtb2RlIEVYQ0xVU0lWRSwgb3RoZXJ3aXNlIFNIQVJFRFxuIik7CisgICAgcHJpbnRmKCIgICAgIC1uIHBlcmZvcm1hbmNlIG1vZGUgTk9ORSwgb3RoZXJ3aXNlIExPV19MQVRFTkNZXG4iKTsKKyAgICBwcmludGYoIiAgICAgLWMgYWx3YXlzIHJldHVybiBDT05USU5VRSBmcm9tIGNhbGxiYWNrLCBub3QgU1RPUFxuIik7Cit9CisKKy8qKgorICogQHJldHVybiAwIGlzIE9LLCAtMSBmb3IgZXJyb3IKKyAqLworc3RhdGljIGludCBzX2NoZWNrRW5naW5lUG9zaXRpb25zKEF1ZGlvRW5naW5lICplbmdpbmUpIHsKKyAgICBjb25zdCBpbnQ2NF90IGZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChlbmdpbmUtPnN0cmVhbSk7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oZW5naW5lLT5zdHJlYW0pOworICAgIGNvbnN0IGludDMyX3QgZGVsdGEgPSAoaW50MzJfdCkoZnJhbWVzV3JpdHRlbiAtIGZyYW1lc1JlYWQpOworICAgIHByaW50ZigicGxheWluZyBmcmFtZXNSZWFkID0gJTdkLCBmcmFtZXNXcml0dGVuID0gJTdkIgorICAgICAgICAgICAiLCBkZWx0YSA9ICU0ZCwgZnJhbWVzQ2FsbGVkID0gJTZkLCBjYWxsYmFja0NvdW50ID0gJTRkXG4iLAorICAgICAgICAgICAoaW50MzJfdCkgZnJhbWVzUmVhZCwKKyAgICAgICAgICAgKGludDMyX3QpIGZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgIGRlbHRhLAorICAgICAgICAgICBlbmdpbmUtPmZyYW1lc0NhbGxlZC5sb2FkKCksCisgICAgICAgICAgIGVuZ2luZS0+Y2FsbGJhY2tDb3VudC5sb2FkKCkKKyAgICApOworICAgIGlmIChkZWx0YSA+IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGVuZ2luZS0+c3RyZWFtKSkgeworICAgICAgICBwcmludGYoIkVSUk9SIC0gZGVsdGEgPiBjYXBhY2l0eVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgICh2b2lkKSBhcmdjOworICAgICh2b2lkKSBhcmd2OworICAgIHN0cnVjdCBBdWRpb0VuZ2luZSBlbmdpbmU7CisgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGJvb2wgYWx3YXlzQ29udGludWUgPSBmYWxzZTsKKyAgICBpbnQgZXJyb3JDb3VudCA9IDA7CisgICAgaW50IGNhbGxiYWNrUmVzdWx0ID0gRVhJVF9TVUNDRVNTOworCisgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjaworICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCisgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CisKKyAgICBwcmludGYoIlRlc3QgUmV0dXJuIFN0b3AgVjEuMFxuIik7CisgICAgcHJpbnRmKCJXYWl0IGZvciBhIGZldyBzZWNvbmRzLlxuIik7CisgICAgcHJpbnRmKCJZb3Ugc2hvdWxkIHNlZSBjYWxsYmFja0NvdW50IGFuZCBmcmFtZXNSZWFkIHN0b3AgYWR2YW5jaW5nXG4iKTsKKyAgICBwcmludGYoIndoZW4gY2FsbGJhY2tDb3VudCByZWFjaGVzICVkIG1zZWNcbiIsIFNUT1BfQVRfTVNFQyk7CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKyAgICAgICAgaWYgKGFyZ1swXSA9PSAnLScpIHsKKyAgICAgICAgICAgIGNoYXIgb3B0aW9uID0gYXJnWzFdOworICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICAgICAgYWx3YXlzQ29udGludWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gQUFVRElPX0RJUkVDVElPTl9JTlBVVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgICAgIHBlcmZNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICAgICAgICAgIHNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHNfdXNhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNfdXNhZ2UoKTsKKyAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ID0gc19PcGVuQXVkaW9TdHJlYW0oJmVuZ2luZSwgZGlyZWN0aW9uLCBzaGFyaW5nTW9kZSwgcGVyZk1vZGUpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50Zigic19PcGVuQXVkaW9TdHJlYW0gcmV0dXJuZWQgJXNcbiIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgZXJyb3JDb3VudCsrOworICAgIH0KKworICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QoZW5naW5lLnN0cmVhbSk7CisgICAgLy8gVXNlIGRvdWJsZSBidWZmZXJlZCBzdHJlYW0uCisgICAgY29uc3QgaW50MzJfdCBidWZmZXJTaXplID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhlbmdpbmUuc3RyZWFtLCAyICogZnJhbWVzUGVyQnVyc3QpOworICAgIGlmIChidWZmZXJTaXplIDwgMCkgeworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMgcmV0dXJuZWQgJXNcbiIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChidWZmZXJTaXplKSk7CisgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBzZWUgd2hhdCBraW5kIG9mIHN0cmVhbSB3ZSBhY3R1YWxseSBnb3QuCisgICAgaW50MzJfdCBkZXZpY2VJZCA9IEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChlbmdpbmUuc3RyZWFtKTsKKyAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IGFjdHVhbFBlcmZNb2RlID0gQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShlbmdpbmUuc3RyZWFtKTsKKyAgICBwcmludGYoIi0tLS0tLS0tIG9wZW5lZDogZGV2aWNlSWQgPSAlM2QsIGZyYW1lc1BlckJ1cnN0ID0gJTNkLCBwZXJmTW9kZSA9ICVkXG4iLAorICAgICAgICAgICBkZXZpY2VJZCwgZnJhbWVzUGVyQnVyc3QsIGFjdHVhbFBlcmZNb2RlKTsKKworICAgIC8vIENhbGN1bGF0ZSBob3cgbWFueSBjYWxsYmFja3MgbmVlZGVkLgorICAgIGlmIChhbHdheXNDb250aW51ZSkgeworICAgICAgICBlbmdpbmUuc3RvcEF0RnJhbWUgPSBJTlQzMl9NQVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUoZW5naW5lLnN0cmVhbSk7CisgICAgICAgIGVuZ2luZS5zdG9wQXRGcmFtZSA9IFNUT1BfQVRfTVNFQyAqIHNhbXBsZVJhdGUgLyAxMDAwOworICAgIH0KKworICAgIGZvciAoaW50IGxvb3BzID0gMDsgbG9vcHMgPCAyICYmIHJlc3VsdCA9PSBBQVVESU9fT0s7IGxvb3BzKyspIHsKKyAgICAgICAgZW5naW5lLnJlc2V0KCk7CisKKyAgICAgICAgLy8gU3RhcnQgc3RyZWFtLgorICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGVuZ2luZS5zdHJlYW0pOworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoKSByZXR1cm5lZCAlZCA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4iLCByZXN1bHQpOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgZXJyb3JDb3VudCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAgICAgY29uc3QgaW50IHdhdGNoTG9vcHMgPSBMT09QX0RVUkFUSU9OX01TRUMgLyBTTEVFUF9EVVJBVElPTl9NU0VDOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHdhdGNoTG9vcHM7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBlcnJvckNvdW50ICs9IHNfY2hlY2tFbmdpbmVQb3NpdGlvbnMoJmVuZ2luZSkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICB1c2xlZXAoU0xFRVBfRFVSQVRJT05fTVNFQyAqIDEwMDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZ2luZS5zdG9wQXRGcmFtZSAhPSBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gKGVuZ2luZS5jYWxsYmFja0NvdW50QWZ0ZXJTdG9wID09IDApID8gRVhJVF9TVUNDRVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBDYWxsYmFjayBjb3VudCBhZnRlciBTVE9QID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZS5jYWxsYmFja0NvdW50QWZ0ZXJTdG9wLmxvYWQoKSk7CisgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZ2luZS5zdGFydGluZ0ZyYW1lc1JlYWQubG9hZCgpID09IGVuZ2luZS5mcmFtZXNSZWFkLmxvYWQoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIGZyYW1lc1JlYWQgZGlkIG5vdCBhZHZhbmNlIGFjcm9zcyBjYWxsYmFja3NcbiIpOworICAgICAgICAgICAgZXJyb3JDb3VudCsrOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGVuZ2luZS5zdHJlYW0pOworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpIHJldHVybmVkICVkIDw8PDw8PDw8PDw8PDw8PDw8PDw8PFxuIiwgcmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoU0xFRVBfRFVSQVRJT05fTVNFQyAqIDEwMDApOworICAgICAgICBlcnJvckNvdW50ICs9IHNfY2hlY2tFbmdpbmVQb3NpdGlvbnMoJmVuZ2luZSkgPyAxIDogMDsKKyAgICB9CisKKyAgICBzX0Nsb3NlQXVkaW9TdHJlYW0oJmVuZ2luZSk7CisKKyAgICBwcmludGYoImFhdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgIHByaW50ZigidGVzdCAlc1xuIiwgZXJyb3JDb3VudCA/ICJGQUlMRUQiIDogIlBBU1NFRCIpOworCisgICAgcmV0dXJuIGVycm9yQ291bnQgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCmluZGV4IGRmYTc4MTUuLjdiMWRmZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAKICNkZWZpbmUgTlVNX1NFQ09ORFMgICAgICAgICAgICAgMQogI2RlZmluZSBOVU1fTE9PUFMgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9URVNUUyAgICAgICAgICAgICAgIDIwCiAKIHR5cGVkZWYgc3RydWN0IFRpbWVzdGFtcEluZm8gewogICAgIGludDY0X3QgICAgICAgICBmcmFtZXNUb3RhbDsKQEAgLTUzLDYgKzU0LDQ5IEBACiAgICAgYm9vbCAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKIH0gVGltZXN0YW1wQ2FsbGJhY2tEYXRhX3Q7CiAKK3N0cnVjdCBUaW1lU3RhbXBUZXN0TG9nIHsKKyAgICBhYXVkaW9fcG9saWN5X3QgICAgICAgICAgIGlzTW1hcDsKKyAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgIHNoYXJpbmdNb2RlOworICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZm9ybWFuY2VNb2RlOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgZGlyZWN0aW9uOworICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICAgcmVzdWx0OworfTsKKworc3RhdGljIGludCBzX251bVRlc3RzID0gMDsKKy8vIFVzZSBhIHBsYWluIG9sZCBhcnJheSBiZWNhdXNlIHdlIHJlZmVyZW5jZSB0aGlzIGZyb20gdGhlIGNhbGxiYWNrIGFuZCBkbyBub3Qgd2FudCBhbnkKKy8vIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KK3N0YXRpYyBUaW1lU3RhbXBUZXN0TG9nIHNfdGVzdExvZ3NbTUFYX1RFU1RTXXt9OworCitzdGF0aWMgdm9pZCBsb2dUZXN0UmVzdWx0KGJvb2wgaXNNbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZm9ybWFuY2VNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KSB7CisgICAgaWYoc19udW1UZXN0cyA+PSBNQVhfVEVTVFMpIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUiAtIE1BWF9URVNUUyB0b28gc21hbGwgPSAlZFxuIiwgTUFYX1RFU1RTKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzX3Rlc3RMb2dzW3NfbnVtVGVzdHNdLmlzTW1hcCA9IGlzTW1hcDsKKyAgICBzX3Rlc3RMb2dzW3NfbnVtVGVzdHNdLnNoYXJpbmdNb2RlID0gc2hhcmluZ01vZGU7CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5wZXJmb3JtYW5jZU1vZGUgPSBwZXJmb3JtYW5jZU1vZGU7CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5yZXN1bHQgPSByZXN1bHQ7CisgICAgc19udW1UZXN0cysrOworfQorCitzdGF0aWMgdm9pZCBwcmludFRlc3RSZXN1bHRzKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc19udW1UZXN0czsgaSsrKSB7CisgICAgICAgIFRpbWVTdGFtcFRlc3RMb2cgKmxvZyA9ICZzX3Rlc3RMb2dzW2ldOworICAgICAgICBwcmludGYoIiUyZDogbW1hcCA9ICUzcywgc2hhcmluZyA9ICU5cywgcGVyZiA9ICUxMXMsIGRpciA9ICU2cyAtLS0tICU0c1xuIiwKKyAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICBsb2ctPmlzTW1hcCA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgICAgICAgIGdldFNoYXJpbmdNb2RlVGV4dChsb2ctPnNoYXJpbmdNb2RlKSwKKyAgICAgICAgICAgICAgIGdldFBlcmZvcm1hbmNlTW9kZVRleHQobG9nLT5wZXJmb3JtYW5jZU1vZGUpLAorICAgICAgICAgICAgICAgZ2V0RGlyZWN0aW9uVGV4dChsb2ctPmRpcmVjdGlvbiksCisgICAgICAgICAgICAgICBsb2ctPnJlc3VsdCA/ICJGQUlMIiA6ICJwYXNzIik7CisgICAgfQorfQorCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgogYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgdGltZXN0YW1wRGF0YUNhbGxiYWNrUHJvYygKICAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCkBAIC0xMTUsNiArMTU5LDcgQEAKICAgICBpbnQzMl90IG9yaWdpbmFsQnVmZmVyU2l6ZSA9IDA7CiAgICAgaW50MzJfdCByZXF1ZXN0ZWRCdWZmZXJTaXplID0gMDsKICAgICBpbnQzMl90IGZpbmFsQnVmZmVyU2l6ZSA9IDA7CisgICAgYm9vbCAgICBpc01tYXAgPSBmYWxzZTsKICAgICBhYXVkaW9fZm9ybWF0X3QgYWN0dWFsRGF0YUZvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBhY3R1YWxTaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBhY3R1YWxQZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOwpAQCAtMTI0LDcgKzE2OSw4IEBACiAKICAgICBtZW1zZXQoJnNUaW1lc3RhbXBEYXRhLCAwLCBzaXplb2Yoc1RpbWVzdGFtcERhdGEpKTsKIAotICAgIHByaW50ZigiLS0tLS0tLS0tLS0tIHRlc3RUaW1lU3RhbXBzKHBvbGljeSA9ICVkLCBzaGFyaW5nID0gJXMsIHBlcmYgPSAlcywgZGlyID0gJXMpIC0tLS0tLS0tLS0tXG4iLAorICAgIHByaW50ZigiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIHByaW50ZigiLS0tLS0tLS0tIHRlc3RUaW1lU3RhbXBzKHBvbGljeSA9ICVkLCBzaGFyaW5nID0gJXMsIHBlcmYgPSAlcywgZGlyID0gJXMpIC0tLS0tLS0tXG4iLAogICAgICAgICAgICBtbWFwUG9saWN5LAogICAgICAgICAgICBnZXRTaGFyaW5nTW9kZVRleHQoc2hhcmluZ01vZGUpLAogICAgICAgICAgICBnZXRQZXJmb3JtYW5jZU1vZGVUZXh0KHBlcmZvcm1hbmNlTW9kZSksCkBAIC0xNzcsOCArMjIzLDggQEAKIAogICAgIHByaW50ZigiICAgIGNoYW5zID0gJTNkLCByYXRlID0gJTZkIGZvcm1hdCA9ICVkXG4iLAogICAgICAgICAgICBhY3R1YWxDaGFubmVsQ291bnQsIGFjdHVhbFNhbXBsZVJhdGUsIGFjdHVhbERhdGFGb3JtYXQpOwotICAgIHByaW50ZigiICAgIElzIE1NQVAgdXNlZD8gJXNcbiIsIEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkKGFhdWRpb1N0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJ5ZXMiIDogIm5vIik7CisgICAgaXNNbWFwID0gQUF1ZGlvU3RyZWFtX2lzTU1hcFVzZWQoYWF1ZGlvU3RyZWFtKTsKKyAgICBwcmludGYoIiAgICBJcyBNTUFQIHVzZWQ/ICVzXG4iLCBpc01tYXAgPyAieWVzIiA6ICJubyIpOwogCiAgICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGFyZSByZWFkIGluIG9uZSBjaHVuayBieSBhIERNQSBjb250cm9sbGVyCiAgICAgLy8gb3IgYSBEU1Agb3IgYSBtaXhlci4KQEAgLTIxOCw3ICsyNjQsNyBAQAogCiAgICAgICAgIGZvciAoaW50IHNlY29uZCA9IDA7IHNlY29uZCA8IE5VTV9TRUNPTkRTOyBzZWNvbmQrKykgewogICAgICAgICAgICAgLy8gR2l2ZSBBQXVkaW8gY2FsbGJhY2sgdGltZSB0byBydW4gaW4gdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgICAgIHVzbGVlcCgyMDAgKiAxMDAwKTsKIAogICAgICAgICAgICAgLy8gUGVyaW9kaWNhbGx5IHByaW50IHRoZSBwcm9ncmVzcyBzbyB3ZSBrbm93IGl0IGhhc24ndCBkaWVkLgogICAgICAgICAgICAgcHJpbnRmKCJmcmFtZXNXcml0dGVuID0gJWQsIFhSdW5zID0gJWRcbiIsCkBAIC0yMzQsMTggKzI4MCwyNSBAQAogICAgICAgICB9CiAKICAgICAgICAgcHJpbnRmKCJ0aW1lc3RhbXBDb3VudCA9ICVkXG4iLCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudCk7Ci0gICAgICAgIGludCBwcmludGVkID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudDsgaSsrKSB7CisgICAgICAgIGludCBwcmludGVkR29vZCA9IDA7CisgICAgICAgIGludCBwcmludGVkQmFkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBUaW1lc3RhbXBJbmZvICp0aW1lc3RhbXAgPSAmc1RpbWVzdGFtcERhdGEudGltZXN0YW1wc1tpXTsKLSAgICAgICAgICAgIGJvb2wgcG9zQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uICE9ICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wUG9zaXRpb24pOwotICAgICAgICAgICAgYm9vbCB0aW1lQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zICE9ICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wTmFub3MpOwotICAgICAgICAgICAgaWYgKChwcmludGVkIDwgMjApICYmICgoaSA8IDEwKSB8fCBwb3NDaGFuZ2VkIHx8IHRpbWVDaGFuZ2VkKSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiICAlM2QgOiBmcmFtZXMgJThsbGQsIHhmZXJkICU4bGxkIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5mcmFtZXNUb3RhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5hcHBQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcC0+cmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgcmVzdWx0ID0gJXNcbiIsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHRpbWVzdGFtcC0+cmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXAtPnJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICBpZiAocHJpbnRlZEJhZCA8IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICUzZCA6IGZyYW1lcyAlOGxsZCwgeGZlcmQgJThsbGQsIHJlc3VsdCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+ZnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQodGltZXN0YW1wLT5yZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlZEJhZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBwb3NDaGFuZ2VkID0gKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVzdGFtcCAtIDEpLT50aW1lc3RhbXBQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB0aW1lQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zCisgICAgICAgICAgICAgICAgICAgICAgICAhPSAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcE5hbm9zKTsKKyAgICAgICAgICAgICAgICBpZiAoKHByaW50ZWRHb29kIDwgMjApICYmIChwb3NDaGFuZ2VkIHx8IHRpbWVDaGFuZ2VkKSkgewogICAgICAgICAgICAgICAgICAgICBib29sIG5lZ2F0aXZlID0gdGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiA8IDA7CiAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmV0cm8gPSAoaSA+IDAgJiYgKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcFBvc2l0aW9uKSk7CkBAIC0yNTMsMTcgKzMwNiwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocmV0cm8gPyAiICA8PSBSRVRST0dSQURFISIgOiAiIik7CiAKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3kgPSBjYWxjdWxhdGVMYXRlbmN5TWlsbGlzKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5hcHBQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+YXBwTmFub3NlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIFNUQU1QOiBwb3MgPSAlOGxsZCwgbmFub3MgPSAlOGxsZCwgbGF0ID0gJTcuMWYgbXNlYyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dGltZXN0YW1wTmFub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5hcHBOYW5vc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgJTNkIDogZnJhbWVzICU4bGxkLCB4ZmVyZCAlOGxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5mcmFtZXNUb3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+YXBwUG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBTVEFNUDogcG9zID0gJThsbGQsIG5hbm9zID0gJThsbGQsIGxhdCA9ICU3LjFmIG1zZWMgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlZEdvb2QrKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJpbnRlZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByaW50ZWRHb29kID09IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKCkgbmV2ZXIgZ2F2ZSB1cyBhIHZhbGlkIHRpbWVzdGFtcFxuIik7CisgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG8gbm90IGdldCB0aW1lc3RhbXBzIHdoZW4gc3RvcHBlZC4KKyAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb247CisgICAgICAgICAgICBpbnQ2NF90IHRpbWU7CisgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgdGVtcFJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoYWF1ZGlvU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT0NLX01PTk9UT05JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24sICZ0aW1lKTsKKyAgICAgICAgICAgIGlmICh0ZW1wUmVzdWx0ICE9IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoKSBzaG91bGQgcmV0dXJuIgorICAgICAgICAgICAgICAgICAgICAgICAiIElOVkFMSURfU1RBVEUgd2hlbiBzdG9wcGVkISAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQodGVtcFJlc3VsdCkpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNzMsMTIgKzM0OCwxNCBAQAogICAgIH0KIAogZmluaXNoOgorCisgICAgbG9nVGVzdFJlc3VsdChpc01tYXAsIHNoYXJpbmdNb2RlLCBwZXJmb3JtYW5jZU1vZGUsIGRpcmVjdGlvbiwgcmVzdWx0KTsKKwogICAgIGlmIChhYXVkaW9TdHJlYW0gIT0gbnVsbHB0cikgewogICAgICAgICBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKTsKICAgICB9CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7CiAgICAgcHJpbnRmKCJyZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwotCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjkyLDcgKzM2OSw3IEBACiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiVGVzdCBUaW1lc3RhbXBzIFYwLjEuM1xuIik7CisgICAgcHJpbnRmKCJUZXN0IFRpbWVzdGFtcHMgVjAuMS40XG4iKTsKIAogICAgIC8vIExlZ2FjeQogICAgIGFhdWRpb19wb2xpY3lfdCBwb2xpY3kgPSBBQVVESU9fUE9MSUNZX05FVkVSOwpAQCAtMzMyLDUgKzQwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOwogCisgICAgcHJpbnRUZXN0UmVzdWx0cygpOworCiAgICAgcmV0dXJuIChyZXN1bHQgPT0gQUFVRElPX09LKSA/IEVYSVRfU1VDQ0VTUyA6IEVYSVRfRkFJTFVSRTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IDAxMTk3OWUuLmU5YjZmYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtNSw2ICs1LDI5IEBACiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3kiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvQXR0cmlidXRlcy5jcHAiLAorICAgICAgICAiQXVkaW9Qb2xpY3kuY3BwIiwKKyAgICAgICAgIkF1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcCIsCisgICAgICAgICJBdWRpb1ZvbHVtZUdyb3VwLmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9jbGllbnQiLAogCiAgICAgYWlkbDogewpAQCAtMjMsNyArNDYsNiBAQAogICAgICAgICAiOmxpYmF1ZGlvY2xpZW50X2FpZGwiLAogCiAgICAgICAgICJBdWRpb0VmZmVjdC5jcHAiLAotICAgICAgICAiQXVkaW9Qb2xpY3kuY3BwIiwKICAgICAgICAgIkF1ZGlvUmVjb3JkLmNwcCIsCiAgICAgICAgICJBdWRpb1N5c3RlbS5jcHAiLAogICAgICAgICAiQXVkaW9UcmFjay5jcHAiLApAQCAtNDAsMTYgKzYyLDIwIEBACiAgICAgICAgICJUcmFja1BsYXllckJhc2UuY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliZGwiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeSIsCiAgICAgICAgICJsaWJhdWRpb21hbmFnZXIiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5ibG9nIiwKKyAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCiAgICAgXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImxpYmJpbmRlciJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU2OTMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb0F0dHJpYnV0ZXMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBBdWRpb0F0dHJpYnV0ZXM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQoreworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2NvbnRlbnRfdHlwZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBtQXR0cmlidXRlcy51c2FnZSA9IHN0YXRpY19jYXN0PGF1ZGlvX3VzYWdlX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIG1BdHRyaWJ1dGVzLnNvdXJjZSA9IHN0YXRpY19jYXN0PGF1ZGlvX3NvdXJjZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBtQXR0cmlidXRlcy5mbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgY29uc3QgYm9vbCBoYXNGbGF0dGVuZWRUYWcgPSAocGFyY2VsLT5yZWFkSW50MzIoKSA9PSAxKTsKKyAgICBpZiAoaGFzRmxhdHRlbmVkVGFnKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3M7CisgICAgICAgIHJldCA9IHBhcmNlbC0+cmVhZFV0ZjhGcm9tVXRmMTYoJnRhZ3MpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RybmNweShtQXR0cmlidXRlcy50YWdzLCB0YWdzLmNfc3RyKCksIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmNweShtQXR0cmlidXRlcy50YWdzLCAiIik7CisgICAgfQorICAgIG1TdHJlYW1UeXBlID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgbUdyb3VwSWQgPSBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4ocGFyY2VsLT5yZWFkVWludDMyKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9BdHRyaWJ1dGVzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAoreworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtQXR0cmlidXRlcy5jb250ZW50X3R5cGUpKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMudXNhZ2UpKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMuc291cmNlKSk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdHRyaWJ1dGVzLmZsYWdzKSk7CisgICAgaWYgKHN0cmxlbihtQXR0cmlidXRlcy50YWdzKSA9PSAwKSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMSk7CisgICAgICAgIHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtQXR0cmlidXRlcy50YWdzKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1TdHJlYW1UeXBlKSk7CisgICAgcGFyY2VsLT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4obUdyb3VwSWQpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAppbmRleCBiNDBmMGRiLi5jZjExOTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCkBAIC00MzIsMTQgKzQzMiwxNSBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSAvKmNvbnN0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYWYtPmdldEVmZmVjdERlc2NyaXB0b3IodXVpZCwgZGVzY3JpcHRvcik7CisgICAgcmV0dXJuIGFmLT5nZXRFZmZlY3REZXNjcmlwdG9yKHV1aWQsIHR5cGUsIHByZWZlcnJlZFR5cGVGbGFnLCBkZXNjcmlwdG9yKTsKIH0KIAotCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCkBAIC00NDgsNiArNDQ5LDk1IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFwcy0+cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7CiB9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAqaWQgPSBhZi0+bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90ICppZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgaWYgKHR5cGVTdHIgPT0gTlVMTCAmJiB1dWlkU3RyID09IE5VTEwpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBDb252ZXJ0IHR5cGUgJiB1dWlkIGZyb20gc3RyaW5nIHRvIGVmZmVjdF91dWlkX3QuCisgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgIGlmICh0eXBlU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB0eXBlID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGlmICh1dWlkU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHV1aWRTdHIsICZ1dWlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB1dWlkID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGFwcy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCgmdHlwZSwgb3BQYWNrYWdlTmFtZSwgJnV1aWQsIHByaW9yaXR5LCBzb3VyY2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgKmlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBpZiAodHlwZVN0ciA9PSBOVUxMICYmIHV1aWRTdHIgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIENvbnZlcnQgdHlwZSAmIHV1aWQgZnJvbSBzdHJpbmcgdG8gZWZmZWN0X3V1aWRfdC4KKyAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgaWYgKHV1aWRTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodXVpZFN0ciwgJnV1aWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYXBzLT5hZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCZ0eXBlLCBvcFBhY2thZ2VOYW1lLCAmdXVpZCwgcHJpb3JpdHksIHVzYWdlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaWQpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICpndWlkKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwCmluZGV4IGQxZjc1MjUuLjNhYjM4Y2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUG9saWN5LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1BvbGljeS5jcHAKQEAgLTIyLDYgKzIyLDIyIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vCisvLyAgQXVkaW9EZXZpY2VUeXBlQWRkciBpbXBsZW1lbnRhdGlvbgorLy8KK3N0YXR1c190IEF1ZGlvRGV2aWNlVHlwZUFkZHI6OnJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSB7CisgICAgbVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgIG1BZGRyZXNzID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9EZXZpY2VUeXBlQWRkcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgbVR5cGUpOworICAgIHBhcmNlbC0+d3JpdGVTdHJpbmc4KG1BZGRyZXNzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworLy8KIC8vICBBdWRpb01peE1hdGNoQ3JpdGVyaW9uIGltcGxlbWVudGF0aW9uCiAvLwogQXVkaW9NaXhNYXRjaENyaXRlcmlvbjo6QXVkaW9NaXhNYXRjaENyaXRlcmlvbihhdWRpb191c2FnZV90IHVzYWdlLApAQCAtNDAsMTEgKzU2LDIyIEBACiBzdGF0dXNfdCBBdWRpb01peE1hdGNoQ3JpdGVyaW9uOjpyZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCkKIHsKICAgICBtUnVsZSA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgaWYgKG1SdWxlID09IFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIHx8Ci0gICAgICAgICAgICBtUnVsZSA9PSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFKSB7Ci0gICAgICAgIG1WYWx1ZS5tVXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdClwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1WYWx1ZS5tU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgc3dpdGNoIChtUnVsZSkgeworICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgorICAgICAgICBtVmFsdWUubVVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIHBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQ6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOgorICAgICAgICBtVmFsdWUubVNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSVUxFX01BVENIX1VJRDoKKyAgICBjYXNlIFJVTEVfRVhDTFVERV9VSUQ6CisgICAgICAgIG1WYWx1ZS5tVWlkID0gKHVpZF90KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiVHJ5aW5nIHRvIGJ1aWxkIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24gZnJvbSB1bmtub3duIHJ1bGUgJWQiLCBtUnVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTExNiw0ICsxNDMsMTggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9NaXg6OnNldEV4Y2x1ZGVVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBjcml0OworICAgIGNyaXQubVJ1bGUgPSBSVUxFX0VYQ0xVREVfVUlEOworICAgIGNyaXQubVZhbHVlLm1VaWQgPSB1aWQ7CisgICAgbUNyaXRlcmlhLmFkZChjcml0KTsKK30KKwordm9pZCBBdWRpb01peDo6c2V0TWF0Y2hVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBjcml0OworICAgIGNyaXQubVJ1bGUgPSBSVUxFX01BVENIX1VJRDsKKyAgICBjcml0Lm1WYWx1ZS5tVWlkID0gdWlkOworICAgIG1Dcml0ZXJpYS5hZGQoY3JpdCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGExMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUHJvZHVjdFN0cmF0ZWd5IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCit7CisgICAgbUlkID0gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBzdGF0dXNfdCByZXQgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZtTmFtZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZTsKKyAgICAgICAgcmV0ID0gYXR0cmlidXRlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy5wdXNoX2JhY2soYXR0cmlidXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKK3sKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUlkKSk7CisgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KG1OYW1lKTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1BdWRpb0F0dHJpYnV0ZXMuc2l6ZSgpOworICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKKyAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGUobUF1ZGlvQXR0cmlidXRlc1tpXSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IGF0dHJpYnV0ZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGZpbmFsU2l6ZS0tOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgeworICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoZmluYWxTaXplKTsKKyAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCByZWZBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBjbGllbnRBdHRyaXR1YmVzKQoreworICAgIGlmIChyZWZBdHRyaWJ1dGVzID09IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVIpIHsKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBpcyB0aGUgc3RyYXRlZ3kgdGhhdCBob2xkcyBkZWZhdWx0IGF0dHJpYnV0ZXMgYnkgY29udmVudGlvbi4KKyAgICAgICAgLy8gQWxsIGF0dHJpYnV0ZXMgdGhhdCBmYWlsIHRvIG1hdGNoIHdpbGwgZm9sbG93IHRoZSBkZWZhdWx0IHN0cmF0ZWd5IGZvciByb3V0aW5nLgorICAgICAgICAvLyBDaG9vc2luZyB0aGUgZGVmYXVsdCBtdXN0IGJlIGRvbmUgYXMgYSBmYWxsYmFjaywgdGhlIGF0dHJpYnV0ZXMgbWF0Y2ggc2hhbGwgbm90CisgICAgICAgIC8vIHNlbGVjdCB0aGUgZGVmYXVsdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKChyZWZBdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1VOS05PV04pIHx8CisgICAgICAgICAgICAoY2xpZW50QXR0cml0dWJlcy51c2FnZSA9PSByZWZBdHRyaWJ1dGVzLnVzYWdlKSkgJiYKKyAgICAgICAgICAgICgocmVmQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPT0gQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04pIHx8CisgICAgICAgICAgICAgKGNsaWVudEF0dHJpdHViZXMuY29udGVudF90eXBlID09IHJlZkF0dHJpYnV0ZXMuY29udGVudF90eXBlKSkgJiYKKyAgICAgICAgICAgICgocmVmQXR0cmlidXRlcy5mbGFncyA9PSBBVURJT19GTEFHX05PTkUpIHx8CisgICAgICAgICAgICAgKGNsaWVudEF0dHJpdHViZXMuZmxhZ3MgIT0gQVVESU9fRkxBR19OT05FICYmCisgICAgICAgICAgICAoY2xpZW50QXR0cml0dWJlcy5mbGFncyAmIHJlZkF0dHJpYnV0ZXMuZmxhZ3MpID09IGNsaWVudEF0dHJpdHViZXMuZmxhZ3MpKSAmJgorICAgICAgICAgICAgKChzdHJsZW4ocmVmQXR0cmlidXRlcy50YWdzKSA9PSAwKSB8fAorICAgICAgICAgICAgIChzdGQ6OnN0cmNtcChjbGllbnRBdHRyaXR1YmVzLnRhZ3MsIHJlZkF0dHJpYnV0ZXMudGFncykgPT0gMCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggOGUyZGE5ZS4uNTg1MTUzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtNTAsOCArNTAsOSBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJnNpemUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsICIKLSAgICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeDsgc3RhdHVzICVkIiwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIgorICAgICAgICAgICAgICAiIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtNTksOCArNjAsOCBAQAogICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCiAgICAgaWYgKCgqZnJhbWVDb3VudCA9IChzaXplICogMikgLyAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spICoKICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkpID09IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCi0gICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNjksNzAgKzcwLDM0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Gb3JtYXRUeXBlU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IHZhbHVlKSB7Ci0gICAgc3RkOjpzdHJpbmcgZm9ybWF0VHlwZTsKLSAgICBpZiAoRm9ybWF0Q29udmVydGVyOjp0b1N0cmluZyh2YWx1ZSwgZm9ybWF0VHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdFR5cGU7Ci0gICAgfQotICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKLSAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIHJhd2J1ZmZlcjsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvU291cmNlU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHZhbHVlKSB7Ci0gICAgc3RkOjpzdHJpbmcgc291cmNlOwotICAgIGlmIChTb3VyY2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyh2YWx1ZSwgc291cmNlKSkgewotICAgICAgICByZXR1cm4gc291cmNlOwotICAgIH0KLSAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyByb29tIGZvciAiJWQiCi0gICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgdmFsdWUpOwotICAgIHJldHVybiByYXdidWZmZXI7Ci19Ci0KIHZvaWQgQXVkaW9SZWNvcmQ6Ok1lZGlhTWV0cmljczo6Z2F0aGVyKGNvbnN0IEF1ZGlvUmVjb3JkICpyZWNvcmQpCiB7Ci0gICAgLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzIGlzIGRlZmluZWQgaW4gdGhlIGhlYWRlcgotICAgIC8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCi0gICAgLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCi0gICAgLy8gaW4gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhCi0gICAgLy8gVGhlc2UgbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb25zdGFudHMgdGhlcmUuCi0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZEVuY29kaW5nW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5lbmNvZGluZyI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZFNvdXJjZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc291cmNlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkTGF0ZW5jeVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQubGF0ZW5jeSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZFNhbXBsZVJhdGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLnNhbXBsZXJhdGUiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRDaGFubmVsQ291bnRbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmNoYW5uZWxzIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkQ3JlYXRlZFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuY3JlYXRlZE1zIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkRHVyYXRpb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmR1cmF0aW9uTXMiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRDb3VudFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQubiI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZEVycm9yW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5lcnJjb2RlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkRXJyb3JGdW5jdGlvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyZnVuYyI7CisjZGVmaW5lIE1NX1BSRUZJWCAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC4iIC8vIGF2b2lkIGN1dC1uLXBhc3RlIGVycm9ycy4KIAotICAgIC8vIGNvbnN0cnVjdG9yIGd1YXJhbnRlZXMgbUFuYWx5dGljc0l0ZW0gaXMgdmFsaWQKKyAgICAvLyBKYXZhIEFQSSAyOCBlbnRyaWVzLCBkbyBub3QgY2hhbmdlLgorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiZW5jb2RpbmciLCB0b1N0cmluZyhyZWNvcmQtPm1Gb3JtYXQpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAic291cmNlIiwgdG9TdHJpbmcocmVjb3JkLT5tQXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImxhdGVuY3kiLCAoaW50MzJfdClyZWNvcmQtPm1MYXRlbmN5KTsgLy8gYmFkIGVzdGltYXRlLgorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInNhbXBsZXJhdGUiLCAoaW50MzJfdClyZWNvcmQtPm1TYW1wbGVSYXRlKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJjaGFubmVscyIsIChpbnQzMl90KXJlY29yZC0+bUNoYW5uZWxDb3VudCk7CiAKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvUmVjb3JkTGF0ZW5jeSwgcmVjb3JkLT5tTGF0ZW5jeSk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1JlY29yZFNhbXBsZVJhdGUsIHJlY29yZC0+bVNhbXBsZVJhdGUpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRDaGFubmVsQ291bnQsIHJlY29yZC0+bUNoYW5uZWxDb3VudCk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUmVjb3JkRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXRUeXBlU3RyaW5nKHJlY29yZC0+bUZvcm1hdCkuY19zdHIoKSk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUmVjb3JkU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlU3RyaW5nKHJlY29yZC0+bUF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAvLyBOb24tQVBJIGVudHJpZXMsIHRoZXNlIGNhbiBjaGFuZ2UuCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAicG9ydElkIiwgKGludDMyX3QpcmVjb3JkLT5tUG9ydElkKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJmcmFtZUNvdW50IiwgKGludDMyX3QpcmVjb3JkLT5tRnJhbWVDb3VudCk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJhdHRyaWJ1dGVzIiwgdG9TdHJpbmcocmVjb3JkLT5tQXR0cmlidXRlcykuY19zdHIoKSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KE1NX1BSRUZJWCAiY2hhbm5lbE1hc2siLCAoaW50NjRfdClyZWNvcmQtPm1DaGFubmVsTWFzayk7CiAKLSAgICAvLyBsb2cgdG90YWwgZHVyYXRpb24gcmVjb3JkaW5nLCBpbmNsdWRpbmcgYW55dGhpbmcgY3VycmVudGx5IHJ1bm5pbmcgW2FuZCBjb3VudF0uCi0gICAgbnNlY3NfdCBhY3RpdmUgPSAwOworICAgIC8vIGxvZyB0b3RhbCBkdXJhdGlvbiByZWNvcmRpbmcsIGluY2x1ZGluZyBhbnl0aGluZyBjdXJyZW50bHkgcnVubmluZy4KKyAgICBpbnQ2NF90IGFjdGl2ZU5zID0gMDsKICAgICBpZiAobVN0YXJ0ZWROcyAhPSAwKSB7Ci0gICAgICAgIGFjdGl2ZSA9IHN5c3RlbVRpbWUoKSAtIG1TdGFydGVkTnM7CisgICAgICAgIGFjdGl2ZU5zID0gc3lzdGVtVGltZSgpIC0gbVN0YXJ0ZWROczsKICAgICB9Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtBdWRpb1JlY29yZER1cmF0aW9uLCAobUR1cmF0aW9uTnMgKyBhY3RpdmUpIC8gKDEwMDAgKiAxMDAwKSk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1JlY29yZENvdW50LCBtQ291bnQpOwotCi0gICAgLy8gWFhYIEkgZG9uJ3Qga25vdyB0aGF0IHRoaXMgYWRkcyBhIGxvdCBvZiB2YWx1ZSwgbG9uZyB0ZXJtCi0gICAgaWYgKG1DcmVhdGVkTnMgIT0gMCkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0F1ZGlvUmVjb3JkQ3JlYXRlZCwgbUNyZWF0ZWROcyAvICgxMDAwICogMTAwMCkpOwotICAgIH0KKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAiZHVyYXRpb25NcyIsIChtRHVyYXRpb25OcyArIGFjdGl2ZU5zKSAqIDFlLTYpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChNTV9QUkVGSVggInN0YXJ0Q291bnQiLCAoaW50NjRfdCltQ291bnQpOwogCiAgICAgaWYgKG1MYXN0RXJyb3IgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1JlY29yZEVycm9yLCBtTGFzdEVycm9yKTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUmVjb3JkRXJyb3JGdW5jdGlvbiwgbUxhc3RFcnJvckZ1bmMuY19zdHIoKSk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImxhc3RFcnJvci5jb2RlIiwgKGludDMyX3QpbUxhc3RFcnJvcik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAibGFzdEVycm9yLmF0IiwgbUxhc3RFcnJvckZ1bmMuY19zdHIoKSk7CiAgICAgfQogfQogCkBAIC0xNTIsNyArMTE3LDkgQEAKICAgICA6IG1BY3RpdmUoZmFsc2UpLCBtU3RhdHVzKE5PX0lOSVQpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKICAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKLSAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLCBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKKyAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLCBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtU2VsZWN0ZWRNaWNEaXJlY3Rpb24oTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCksCisgICAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbihNSUNfRklFTERfRElNRU5TSU9OX0RFRkFVTFQpCiB7CiB9CiAKQEAgLTE3Miw3ICsxMzksOSBAQAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Qgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCisgICAgICAgIGZsb2F0IG1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbikKICAgICA6IG1BY3RpdmUoZmFsc2UpLAogICAgICAgbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLApAQCAtMTgzLDcgKzE1Miw4IEBACiB7CiAgICAgKHZvaWQpc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBjYmYsIHVzZXIsCiAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLAotICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzLCBzZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcywgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uLCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24pOwogfQogCiBBdWRpb1JlY29yZDo6fkF1ZGlvUmVjb3JkKCkKQEAgLTIxMCw4ICsxODAsOCBAQAogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICBtQnVmZmVyTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQUxPR1YoIn5BdWRpb1JlY29yZCwgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQiLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOworICAgICAgICBBTE9HVigiJXMoJWQpOiByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1TZXNzaW9uSWQpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIC0xIC8qcGlkKi8pOwogICAgIH0KIH0KQEAgLTIzMiwyMCArMjAyLDI2IEBACiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgZmxvYXQgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudDsKICAgICBwaWRfdCBjYWxsaW5nUGlkOwogICAgIHBpZF90IG15UGlkOwogCi0gICAgQUxPR1YoInNldCgpOiBpbnB1dFNvdXJjZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgorICAgIC8vIE5vdGUgbVBvcnRJZCBpcyBub3QgdmFsaWQgdW50aWwgdGhlIHRyYWNrIGlzIGNyZWF0ZWQsIHNvIG9taXQgbVBvcnRJZCBpbiBBTE9HIGZvciBzZXQuCisgICAgQUxPR1YoIiVzKCk6IGlucHV0U291cmNlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCiAgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIGZsYWdzICUjeCwgb3BQYWNrYWdlTmFtZSAlcyAiCiAgICAgICAgICAgInVpZCAlZCwgcGlkICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywgU3RyaW5nOChtT3BQYWNrYWdlTmFtZSkuc3RyaW5nKCksIHVpZCwgcGlkKTsKIAogICAgIG1TZWxlY3RlZERldmljZUlkID0gc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBtU2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBzZWxlY3RlZE1pY0RpcmVjdGlvbjsKKyAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IG1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbjsKIAogICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7CiAgICAgY2FzZSBUUkFOU0ZFUl9ERUZBVUxUOgpAQCAtMjU3LDcgKzIzMyw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6CiAgICAgICAgIGlmIChjYmYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNiZiA9PSBOVUxMIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTI2Niw3ICsyNDIsNyBAQAogICAgIGNhc2UgVFJBTlNGRVJfU1lOQzoKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIkludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLCBfX2Z1bmNfXywgdHJhbnNmZXJUeXBlKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMjc0LDcgKzI1MCw3IEBACiAKICAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9SZWNvcmQgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvUmVjb3JkICE9IDApIHsKLSAgICAgICAgQUxPR0UoIlRyYWNrIGFscmVhZHkgaW4gdXNlIik7CisgICAgICAgIEFMT0dFKCIlcygpOiBUcmFjayBhbHJlYWR5IGluIHVzZSIsIF9fZnVuY19fKTsKICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0yODUsOCArMjYxLDggQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBzdHJlYW0gdHlwZSBzaG91bGRuJ3QgYmUgbG9va2VkIGF0LCB0aGlzIHRyYWNrIGhhcyBhdWRpbyBhdHRyaWJ1dGVzCiAgICAgICAgIG1lbWNweSgmbUF0dHJpYnV0ZXMsIHBBdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIEFMT0dWKCJCdWlsZGluZyBBdWRpb1JlY29yZCB3aXRoIGF0dHJpYnV0ZXM6IHNvdXJjZT0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnNvdXJjZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOworICAgICAgICBBTE9HVigiJXMoKTogQnVpbGRpbmcgQXVkaW9SZWNvcmQgd2l0aCBhdHRyaWJ1dGVzOiBzb3VyY2U9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQXR0cmlidXRlcy5zb3VyY2UsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKICAgICB9CiAKICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CkBAIC0yOTksMTQgKzI3NSwxNCBAQAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICAvLyBBdWRpb0ZsaW5nZXIgY2FwdHVyZSBvbmx5IHN1cHBvcnRzIGxpbmVhciBQQ00KICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIkZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiJXMoKTogRm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIF9fZnVuY19fLCBmb3JtYXQpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKIAogICAgIGlmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTMyNyw3ICszMDMsNyBAQAogICAgIC8vIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgaXMgaW5pdGlhbGl6ZWQgaW4gY3JlYXRlUmVjb3JkX2wKIAogICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgQUxPR1YoInNldCgpOiBtU2Vzc2lvbklkICVkIiwgbVNlc3Npb25JZCk7CisgICAgQUxPR1YoIiVzKCk6IG1TZXNzaW9uSWQgJWQiLCBfX2Z1bmNfXywgbVNlc3Npb25JZCk7CiAKICAgICBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIG15UGlkID0gZ2V0cGlkKCk7CkBAIC0zNDYsMTMgKzMyMiwxOCBAQAogICAgIG1DYmYgPSBjYmY7CiAKICAgICBpZiAoY2JmICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkID0gbmV3IEF1ZGlvUmVjb3JkVGhyZWFkKCp0aGlzLCB0aHJlYWRDYW5DYWxsSmF2YSk7CisgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZCA9IG5ldyBBdWRpb1JlY29yZFRocmVhZCgqdGhpcyk7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cnVuKCJBdWRpb1JlY29yZCIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICAvLyB0aHJlYWQgYmVnaW5zIGluIHBhdXNlZCBzdGF0ZSwgYW5kIHdpbGwgbm90IHJlZmVyZW5jZSB1cyB1bnRpbCBzdGFydCgpCiAgICAgfQogCiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKLSAgICBzdGF0dXMgPSBjcmVhdGVSZWNvcmRfbCgwIC8qZXBvY2gqLywgbU9wUGFja2FnZU5hbWUpOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBzdGF0dXMgPSBjcmVhdGVSZWNvcmRfbCgwIC8qZXBvY2gqLywgbU9wUGFja2FnZU5hbWUpOworICAgIH0KKworICAgIEFMT0dWKCIlcyglZCk6IHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKQEAgLTM4OSw3ICszNzAsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6c3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKQogewotICAgIEFMT0dWKCJzdGFydCwgc3luYyBldmVudCAlZCB0cmlnZ2VyIHNlc3Npb24gJWQiLCBldmVudCwgdHJpZ2dlclNlc3Npb24pOworICAgIEFMT0dWKCIlcyglZCk6IHN5bmMgZXZlbnQgJWQgdHJpZ2dlciBzZXNzaW9uICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1BY3RpdmUpIHsKQEAgLTQyOCw5ICs0MDksMTMgQEAKICAgICAgICAgc3RhdHVzID0gcmVzdG9yZVJlY29yZF9sKCJzdGFydCIpOwogICAgIH0KIAorICAgIC8vIENhbGwgdGhlc2UgZGlyZWN0bHkgYmVjYXVzZSB3ZSBhcmUgYWxyZWFkeSBob2xkaW5nIHRoZSBsb2NrLgorICAgIG1BdWRpb1JlY29yZC0+c2V0TWljcm9waG9uZURpcmVjdGlvbihtU2VsZWN0ZWRNaWNEaXJlY3Rpb24pOworICAgIG1BdWRpb1JlY29yZC0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uKTsKKwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOwotICAgICAgICBBTE9HRSgic3RhcnQoKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gdCA9IG1BdWRpb1JlY29yZFRocmVhZDsKICAgICAgICAgaWYgKHQgIT0gMCkgewpAQCAtNDU0LDYgKzQzOSw3IEBACiB2b2lkIEF1ZGlvUmVjb3JkOjpzdG9wKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogbUFjdGl2ZTolZFxuIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1BY3RpdmUpOwogICAgIGlmICghbUFjdGl2ZSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNjMyLDggKzYxOCw4IEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kKCIgQXVkaW9SZWNvcmQ6OmR1bXBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RhdHVzKCVkKSwgYWN0aXZlKCVkKSwgc2Vzc2lvbiBJZCglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtQWN0aXZlLCBtU2Vzc2lvbklkKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGlkKCVkKSBzdGF0dXMoJWQpLCBhY3RpdmUoJWQpLCBzZXNzaW9uIElkKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SWQsIG1TdGF0dXMsIG1BY3RpdmUsIG1TZXNzaW9uSWQpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZmxhZ3MoJSN4KSwgcmVxLiBmbGFncyglI3gpLCBhdWRpbyBzb3VyY2UoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLCBtT3JpZ0ZsYWdzLCBtQXR0cmlidXRlcy5zb3VyY2UpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KSwgc2FtcGxlIHJhdGUoJXUpXG4iLApAQCAtNjQ0LDYgKzYzMCw4IEBACiAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCwgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSk7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpbnB1dCglZCksIGxhdGVuY3koJXUpLCBzZWxlY3RlZCBkZXZpY2UgSWQoJWQpLCByb3V0ZWQgZGV2aWNlIElkKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dCwgbUxhdGVuY3ksIG1TZWxlY3RlZERldmljZUlkLCBtUm91dGVkRGV2aWNlSWQpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgbWljIGRpcmVjdGlvbiglZCkgbWljIGZpZWxkIGRpbWVuc2lvbiglZikiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uLCBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbik7CiAgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC02NzUsNyArNjYzLDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAKICAgICBpZiAoYXVkaW9GbGluZ2VyID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNzAyLDcgKzY5MCw4IEBACiAgICAgICAgICAgICAvLyB1c2UgY2FzZSAzOiBvYnRhaW4vcmVsZWFzZSBtb2RlCiAgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX09CVEFJTik7CiAgICAgICAgIGlmICghdXNlQ2FzZUFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkLCBpbmNvbXBhdGlibGUgdHJhbnNmZXIgPSAlcyIsCisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkLCBpbmNvbXBhdGlibGUgdHJhbnNmZXIgPSAlcyIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dChtVHJhbnNmZXIpKTsKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfihBVURJT19JTlBVVF9GTEFHX0ZBU1QgfAogICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX1JBVykpOwpAQCAtNzM3LDcgKzcyNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgQUxPR19BU1NFUlQocmVjb3JkICE9IDApOwpAQCAtNzQ3LDcgKzczNyw4IEBACiAKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgIGlmIChvdXRwdXQuZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKLSAgICAgICAgQUxPR0koIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICBBTE9HSSgiJXMoJWQpOiBBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgICAgIG1Bd2FpdEJvb3N0ID0gdHJ1ZTsKICAgICB9CkBAIC03NTcsMTMgKzc0OCwxMyBAQAogICAgIG1TYW1wbGVSYXRlID0gb3V0cHV0LnNhbXBsZVJhdGU7CiAKICAgICBpZiAob3V0cHV0LmNibGsgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBpTWVtUG9pbnRlciA9IG91dHB1dC5jYmxrIC0+cG9pbnRlcigpOwogICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTc3OCw3ICs3NjksNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGJ1ZmZlcnMgPSBvdXRwdXQuYnVmZmVycy0+cG9pbnRlcigpOwogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTc5MiwxOSArNzgzLDIyIEBACiAgICAgbUF1ZGlvUmVjb3JkID0gcmVjb3JkOwogICAgIG1DYmxrTWVtb3J5ID0gb3V0cHV0LmNibGs7CiAgICAgbUJ1ZmZlck1lbW9yeSA9IG91dHB1dC5idWZmZXJzOworICAgIG1Qb3J0SWQgPSBvdXRwdXQucG9ydElkOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKIAogICAgIG1DYmxrID0gY2JsazsKICAgICAvLyBub3RlIHRoYXQgb3V0cHV0LmZyYW1lQ291bnQgaXMgdGhlIChwb3NzaWJseSByZXZpc2VkKSB2YWx1ZSBvZiBtUmVxRnJhbWVDb3VudAogICAgIGlmIChvdXRwdXQuZnJhbWVDb3VudCA8IG1SZXFGcmFtZUNvdW50IHx8IChtUmVxRnJhbWVDb3VudCA9PSAwICYmIG91dHB1dC5mcmFtZUNvdW50ID09IDApKSB7Ci0gICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgQUxPR1coIiVzKCVkKTogUmVxdWVzdGVkIGZyYW1lQ291bnQgJXp1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudCwgIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICB9CiAKICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luIGJlZm9yZSBvdmVycnVuLgogICAgIC8vIFRoZSBjb21wdXRhdGlvbiBpcyBkb25lIG9uIHNlcnZlciBzaWRlLgogICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzUmVxID4gMCAmJiBvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCAhPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxKSB7Ci0gICAgICAgIEFMT0dXKCJTZXJ2ZXIgYWRqdXN0ZWQgbm90aWZpY2F0aW9uRnJhbWVzIGZyb20gJXUgdG8gJXp1IGZvciBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IFNlcnZlciBhZGp1c3RlZCBub3RpZmljYXRpb25GcmFtZXMgZnJvbSAldSB0byAlenUgZm9yIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxLCBvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCwgb3V0cHV0LmZyYW1lQ291bnQpOwogICAgIH0KICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gKHVpbnQzMl90KW91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50OwpAQCAtODcyLDcgKzg2Niw3IEBACiAgICAgICAgIHRpbWVvdXQudHZfbnNlYyA9IChsb25nKSAobXMgJSAxMDAwKSAqIDEwMDAwMDA7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZ0aW1lb3V0OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHdhaXRDb3VudCAlZCIsIF9fZnVuY19fLCB3YWl0Q291bnQpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBpbnZhbGlkIHdhaXRDb3VudCAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCB3YWl0Q291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSBOVUxMOwogICAgIH0KICAgICByZXR1cm4gb2J0YWluQnVmZmVyKGF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwgLyplbGFwc2VkKi8sIG5vbkNvbnRpZyk7CkBAIC05ODEsNyArOTc1LDggQEAKICAgICBpZiAoc3NpemVfdCh1c2VyU2l6ZSkgPCAwIHx8IChidWZmZXIgPT0gTlVMTCAmJiB1c2VyU2l6ZSAhPSAwKSkgewogICAgICAgICAvLyBzYW5pdHktY2hlY2suIHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKICAgICAgICAgLy8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGFtYmlndW91cyAoYWN0dWFsU2l6ZSB2cyBlcnJvcikuCi0gICAgICAgIEFMT0dFKCJBdWRpb1JlY29yZDo6cmVhZChidWZmZXI9JXAsIHNpemU9JXp1ICglenUpIiwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOworICAgICAgICBBTE9HRSgiJXMoJWQpIChidWZmZXI9JXAsIHNpemU9JXp1ICglenUpIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTAzOCw3ICsxMDMzLDcgQEAKICAgICAgICAgICAgIHBvbGxVcyA8PD0gMTsKICAgICAgICAgfSB3aGlsZSAodHJ5Q291bnRlci0tID4gMCk7CiAgICAgICAgIGlmICh0cnlDb3VudGVyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgfQogICAgICAgICAvLyBSdW4gYWdhaW4gaW1tZWRpYXRlbHkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMTYxLDcgKzExNTYsOCBAQAogICAgIGlmIChucyAhPSBOU19XSEVORVZFUikgewogICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IG5zIC8gMTAwMDAwMDAwMExMOwogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSBucyAlIDEwMDAwMDAwMDBMTDsKLSAgICAgICAgQUxPR1YoInRpbWVvdXQgJWxkLiUwM2QiLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVvdXQgJWxkLiUwM2QiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZ0aW1lb3V0OwogICAgIH0KIApAQCAtMTE3MywxNiArMTE2OSwxOCBAQAogICAgICAgICBzaXplX3Qgbm9uQ29udGlnOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwsICZub25Db250aWcpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChlcnIgIT0gTk9fRVJST1IpICE9IChhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID09IDApLAotICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IG9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZDbGllbnRQcm94eTo6a05vbkJsb2NraW5nOwogICAgICAgICBzaXplX3QgYXZhaWwgPSBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ICsgbm9uQ29udGlnOwotICAgICAgICBBTE9HVigib2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzLCBhdmFpbCwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCwgbm9uQ29udGlnLCBlcnIpOworICAgICAgICBBTE9HVigiJXMoJWQpOiBvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVtYWluaW5nRnJhbWVzLCBhdmFpbCwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCwgbm9uQ29udGlnLCBlcnIpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBpZiAoZXJyID09IFRJTUVEX09VVCB8fCBlcnIgPT0gV09VTERfQkxPQ0sgfHwgZXJyID09IC1FSU5UUikgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR0UoIkVycm9yICVkIG9idGFpbmluZyBhbiBhdWRpbyBidWZmZXIsIGdpdmluZyB1cC4iLCBlcnIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKQEAgLTEyMDQsOCArMTIwMiw4IEBACiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3QocmVhZFNpemUpIDwgMCB8fCByZWFkU2l6ZSA+IHJlcVNpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxU2l6ZSwgc3NpemVfdChyZWFkU2l6ZSkpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogIEVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcmVxU2l6ZSwgc3NpemVfdChyZWFkU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKQEAgLTEyNjUsNyArMTI2Myw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpyZXN0b3JlUmVjb3JkX2woY29uc3QgY2hhciAqZnJvbSkKIHsKLSAgICBBTE9HVygiZGVhZCBJQXVkaW9SZWNvcmQsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLCBmcm9tKTsKKyAgICBBTE9HVygiJXMoJWQpOiBkZWFkIElBdWRpb1JlY29yZCwgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsIF9fZnVuY19fLCBtUG9ydElkLCBmcm9tKTsKICAgICArK21TZXF1ZW5jZTsKIAogICAgIGNvbnN0IGludCBJTklUSUFMX1JFVFJJRVMgPSAzOwpAQCAtMTI4NSwxMCArMTI4Myw3IEBACiAgICAgbU5ld1Bvc2l0aW9uID0gcG9zaXRpb24gKyBtVXBkYXRlUGVyaW9kOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNyZWF0ZVJlY29yZF9sKHBvc2l0aW9uLCBtT3BQYWNrYWdlTmFtZSk7CiAKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpOiBjcmVhdGVSZWNvcmRfbCBmYWlsZWQsIGRvIG5vdCByZXRyeSIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0cmllcyA9IDA7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQWN0aXZlKSB7CiAgICAgICAgICAgICAvLyBjYWxsYmFjayB0aHJlYWQgb3Igc3luYyBldmVudCBoYXNuJ3QgY2hhbmdlZAogICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBmYWlscyBpZiB3ZSBoYXZlIGEgbmV3IEF1ZGlvRmxpbmdlciBpbnN0YW5jZQpAQCAtMTI5OSwxNSArMTI5NCwxNyBAQAogICAgIH0KIAogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIiVzKCkgZmFpbGVkIHN0YXR1cyAlZCwgcmV0cmllcyAlZCIsIF9fZnVuY19fLCByZXN1bHQsIHJldHJpZXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHJlc3VsdCwgcmV0cmllcyk7CiAgICAgICAgIGlmICgtLXJldHJpZXMgPiAwKSB7CisgICAgICAgICAgICAvLyBsZWF2ZSB0aW1lIGZvciBhbiBldmVudHVhbCByYWNlIGNvbmRpdGlvbiB0byBjbGVhciBiZWZvcmUgcmV0cnlpbmcKKyAgICAgICAgICAgIHVzbGVlcCg1MDAwMDApOwogICAgICAgICAgICAgZ290byByZXRyeTsKICAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coInJlc3RvcmVSZWNvcmRfbCgpIGZhaWxlZCBzdGF0dXMgJWQiLCByZXN1bHQpOwotICAgICAgICBtQWN0aXZlID0gZmFsc2U7CisgICAgICAgIC8vIGlmIG5vIHJldHJpZXMgbGVmdCwgc2V0IGludmFsaWQgYml0IHRvIGZvcmNlIHJlc3RvcmluZyBhdCBuZXh0IG9jY2FzaW9uCisgICAgICAgIC8vIGFuZCBhdm9pZCBpbmNvbnNpc3RlbnQgYWN0aXZlIHN0YXRlIG9uIGNsaWVudCBhbmQgc2VydmVyIHNpZGVzCisgICAgICAgIGlmIChtQ2JsayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC0xMzE2LDE4ICsxMzEzLDE4IEBACiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgTlVMTCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgTlVMTCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay5nZXQoKSkgewotICAgICAgICBBTE9HVygiJXMgYWRkaW5nIHNhbWUgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogYWRkaW5nIHNhbWUgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKICAgICAgICAgfQogICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOwpAQCAtMTM0MCwxMiArMTMzNywxMiBAQAogICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgIT0gY2FsbGJhY2suZ2V0KCkpIHsKLSAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIGRpZmZlcmVudCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1EZXZpY2VDYWxsYmFjay5jbGVhcigpOwpAQCAtMTM4NCw2ICsxMzgxLDM5IEBACiAgICAgcmV0dXJuIG1BdWRpb1JlY29yZC0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpLnRyYW5zYWN0aW9uRXJyb3IoKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtU2VsZWN0ZWRNaWNEaXJlY3Rpb24gPT0gZGlyZWN0aW9uKSB7CisgICAgICAgIC8vIE5PUAorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgIGlmIChtQXVkaW9SZWNvcmQgPT0gMCkgeworICAgICAgICAvLyB0aGUgaW50ZXJuYWwgQXVkaW9SZWNvcmQgaGFzbid0IGJlIGNyZWF0ZWQgeWV0LCBzbyBqdXN0IHN0YXNoIHRoZSBhdHRyaWJ1dGUuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5zZXRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbikudHJhbnNhY3Rpb25FcnJvcigpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9PSB6b29tKSB7CisgICAgICAgIC8vIE5PUAorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSB6b29tOworICAgIGlmIChtQXVkaW9SZWNvcmQgPT0gMCkgeworICAgICAgICAvLyB0aGUgaW50ZXJuYWwgQXVkaW9SZWNvcmQgaGFzbid0IGJlIGNyZWF0ZWQgeWV0LCBzbyBqdXN0IHN0YXNoIHRoZSBhdHRyaWJ1dGUuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkudHJhbnNhY3Rpb25FcnJvcigpOworICAgIH0KK30KKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiB2b2lkIEF1ZGlvUmVjb3JkOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCkBAIC0xMzk3LDggKzE0MjcsOSBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLUF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6QXVkaW9SZWNvcmRUaHJlYWQoQXVkaW9SZWNvcmQmIHJlY2VpdmVyLCBib29sIGJDYW5DYWxsSmF2YSkKLSAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCksCitBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmRUaHJlYWQ6OkF1ZGlvUmVjb3JkVGhyZWFkKEF1ZGlvUmVjb3JkJiByZWNlaXZlcikKKyAgICA6IFRocmVhZCh0cnVlIC8qIGJDYW5DYWxsSmF2YSAqLykgIC8vIGJpbmRlciByZWN1cnNpb24gb24gcmVzdG9yZVJlY29yZF9sKCkgbWF5IGNhbGwgSmF2YS4KKyAgICAsIG1SZWNlaXZlcihyZWNlaXZlciksIG1QYXVzZWQodHJ1ZSksIG1QYXVzZWRJbnQoZmFsc2UpLCBtUGF1c2VkTnMoMExMKSwKICAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50KGZhbHNlKQogewogfQpAQCAtMTQ1MCw3ICsxNDgxLDcgQEAKICAgICAgICAgbnMgPSBJTlQ2NF9NQVg7CiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJSIgUFJJZDY0LCBucyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAiJXMoKSByZXR1cm5lZCAlbGxkIiwgX19mdW5jX18sIChsb25nIGxvbmcpbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IGMwNzI5MDEuLjBjZTI1MTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtNTIxLDEwICs1MjIsMTIgQEAKICAgICBpZiAoaW9EZXNjID09IDAgfHwgaW9EZXNjLT5tSW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybjsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwotCisgICAgVmVjdG9yPHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+PiBjYWxsYmFja3NUb0NhbGw7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBib29sIGRldmljZVZhbGlkT3JDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIGJvb2wgc2VuZENhbGxiYWNrcyA9IGZhbHNlOworICAgICAgICBzc2l6ZV90IGlvSW5kZXggPSAtMTsKIAogICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX09QRU5FRDoKQEAgLTU0MiwxMSArNTQ1LDE3IEBACiAgICAgICAgICAgICBpZiAoaW9EZXNjLT5nZXREZXZpY2VJZCgpICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9PUEVORUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWxsYmFja3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmFsaWRPckNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBBVURJT19PVVRQVVRfUkVHSVNURVJFRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9SRUdJU1RFUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMuaW5kZXhPZktleShpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRDYWxsYmFja3MgPSAoaW9JbmRleCA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMudmFsdWVBdChpb0luZGV4KS5ub3RpZmllZE9uY2UoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3ICVzICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKICAgICAgICAgICAgICAgICAgICAgImZyYW1lQ291bnQgJXp1IGRldmljZUlkICVkIiwKQEAgLTU2OCw3ICs1NzcsNyBAQAogICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOwogCiAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CkBAIC01ODMsMTEgKzU5MiwxMCBAQAogICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVwbGFjZVZhbHVlRm9yKGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MpOwogCiAgICAgICAgICAgICBpZiAoZGV2aWNlSWQgIT0gaW9EZXNjLT5nZXREZXZpY2VJZCgpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlVmFsaWRPckNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIHNlbmRDYWxsYmFja3MgPSBpb0luZGV4ID49IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3IgJXMgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4ICIKICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgZnJhbWVDb3VudEhBTCAlenUgZGV2aWNlSWQgJWQiLApAQCAtNTk4LDI0ICs2MDYsMzQgQEAKIAogICAgICAgICB9IGJyZWFrOwogICAgICAgICB9Ci0gICAgfQotICAgIGJvb2wgY2FsbGJhY2tSZW1vdmVkID0gZmFsc2U7Ci0gICAgLy8gY2FsbGJhY2tzLnNpemUoKSAhPSAwID0+ICBpb0Rlc2MtPm1Jb0hhbmRsZSBhbmQgZGV2aWNlSWQgYXJlIHZhbGlkCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyApIHsKLSAgICAgICAgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBjYWxsYmFja3NbaV0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoY2FsbGJhY2suZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgY2FsbGJhY2stPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbGxiYWNrcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlZCA9IHRydWU7CisKKyAgICAgICAgLy8gc2VuZENhbGxiYWNrcyB0cnVlID0+ICBpb0Rlc2MtPm1Jb0hhbmRsZSBhbmQgZGV2aWNlSWQgYXJlIHZhbGlkCisgICAgICAgIGlmIChzZW5kQ2FsbGJhY2tzKSB7CisgICAgICAgICAgICBBdWRpb0RldmljZUNhbGxiYWNrUHJveGllcyAmY2FsbGJhY2tQcm94aWVzID0KKyAgICAgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMuZWRpdFZhbHVlQXQoaW9JbmRleCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxiYWNrUHJveGllcy5zaXplKCk7ICkgeworICAgICAgICAgICAgICAgIHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gY2FsbGJhY2tQcm94aWVzW2ldLT5jYWxsYmFjaygpOworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIGNhbGxiYWNrIG9ubHkgaWYgdGhlIGRldmljZSBhY3R1YWxseSBjaGFuZ2VkLCB0aGUgaW5wdXQgb3Igb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBvcGVuZWQgb3IgY2xvc2VkIG9yIHRoZSBjbGllbnQgd2FzIG5ld2x5IHJlZ2lzdGVyZWQgYW5kIHRoZSBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAvLyB3YXMgbmV2ZXIgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgIGlmICghY2FsbGJhY2tQcm94aWVzW2ldLT5ub3RpZmllZE9uY2UoKSB8fCBkZXZpY2VWYWxpZE9yQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzVG9DYWxsLmFkZChjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Byb3hpZXNbaV0tPnNldE5vdGlmaWVkT25jZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Byb3hpZXMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FsbGJhY2tQcm94aWVzLnNldE5vdGlmaWVkT25jZSgpOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIGNsZWFuIHVwIGNhbGxiYWNrIGxpc3Qgd2hpbGUgd2UgYXJlIGhlcmUgaWYgc29tZSBjbGllbnRzIGhhdmUgZGlzYXBwZWFyZWQgd2l0aG91dAotICAgIC8vIHVucmVnaXN0ZXJpbmcgdGhlaXIgY2FsbGJhY2sKLSAgICBpZiAoY2FsbGJhY2tSZW1vdmVkKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5tSW9IYW5kbGUsIGNhbGxiYWNrcyk7CisKKyAgICAvLyBDYWxsYmFja3MgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBtTG9jayBoZWxkLiBNYXkgbGVhZCB0byBkZWFkIGxvY2sgaWYgY2FsbGluZyBmb3IKKyAgICAvLyBleGFtcGxlIGdldFJvdXRlZERldmljZSB0aGF0IHVwZGF0ZXMgdGhlIGRldmljZSBhbmQgdHJpZXMgdG8gYWNxdWlyZSBtTG9jay4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxiYWNrc1RvQ2FsbC5zaXplKCk7IGkrKykgeworICAgICAgICBjYWxsYmFja3NUb0NhbGxbaV0tPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKICAgICB9CiB9CiAKQEAgLTY3MSwyMCArNjg5LDIxIEBACiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwotICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGF1ZGlvSW8pOworICAgIEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzIGNhbGxiYWNrUHJveGllczsKKyAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMuaW5kZXhPZktleShhdWRpb0lvKTsKICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICBjYWxsYmFja1Byb3hpZXMgPSBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMudmFsdWVBdChpb0luZGV4KTsKICAgICB9CiAKLSAgICBmb3IgKHNpemVfdCBjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrcy5zaXplKCk7IGNiSW5kZXgrKykgewotICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKKyAgICBmb3IgKHNpemVfdCBjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrUHJveGllcy5zaXplKCk7IGNiSW5kZXgrKykgeworICAgICAgICBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiBjYmsgPSBjYWxsYmFja1Byb3hpZXNbY2JJbmRleF0tPmNhbGxiYWNrKCk7CisgICAgICAgIGlmIChjYmsuZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICB9Ci0gICAgY2FsbGJhY2tzLmFkZChjYWxsYmFjayk7Ci0KLSAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVwbGFjZVZhbHVlRm9yKGF1ZGlvSW8sIGNhbGxiYWNrcyk7CisgICAgY2FsbGJhY2tQcm94aWVzLmFkZChuZXcgQXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5KGNhbGxiYWNrKSk7CisgICAgY2FsbGJhY2tQcm94aWVzLnJlc2V0Tm90aWZpZWRPbmNlKCk7CisgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLnJlcGxhY2VWYWx1ZUZvcihhdWRpb0lvLCBjYWxsYmFja1Byb3hpZXMpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNjkyLDI2ICs3MTEsMjYgQEAKICAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CisgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CiAgICAgaWYgKGlvSW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKLQorICAgIEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzIGNhbGxiYWNrUHJveGllcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy52YWx1ZUF0KGlvSW5kZXgpOwogICAgIHNpemVfdCBjYkluZGV4OwotICAgIGZvciAoY2JJbmRleCA9IDA7IGNiSW5kZXggPCBjYWxsYmFja3Muc2l6ZSgpOyBjYkluZGV4KyspIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrc1tjYkluZGV4XS51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgZm9yIChjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrUHJveGllcy5zaXplKCk7IGNiSW5kZXgrKykgeworICAgICAgICBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiBjYmsgPSBjYWxsYmFja1Byb3hpZXNbY2JJbmRleF0tPmNhbGxiYWNrKCk7CisgICAgICAgIGlmIChjYmsuZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoY2JJbmRleCA9PSBjYWxsYmFja3Muc2l6ZSgpKSB7CisgICAgaWYgKGNiSW5kZXggPT0gY2FsbGJhY2tQcm94aWVzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGNhbGxiYWNrcy5yZW1vdmVBdChjYkluZGV4KTsKLSAgICBpZiAoY2FsbGJhY2tzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZXBsYWNlVmFsdWVGb3IoYXVkaW9JbywgY2FsbGJhY2tzKTsKKyAgICBjYWxsYmFja1Byb3hpZXMucmVtb3ZlQXQoY2JJbmRleCk7CisgICAgaWYgKGNhbGxiYWNrUHJveGllcy5zaXplKCkgIT0gMCkgeworICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMucmVwbGFjZVZhbHVlRm9yKGF1ZGlvSW8sIGNhbGxiYWNrUHJveGllcyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlbW92ZUl0ZW0oYXVkaW9Jbyk7CisgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy5yZW1vdmVJdGVtKGF1ZGlvSW8pOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC03NzMsNiArNzkyLDcgQEAKICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGFwLT5yZWdpc3RlckNsaWVudChhcGMpOwogICAgICAgICBhcC0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChhcGMtPmlzQXVkaW9Qb3J0Q2JFbmFibGVkKCkpOworICAgICAgICBhcC0+c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYXBjLT5pc0F1ZGlvVm9sdW1lR3JvdXBDYkVuYWJsZWQoKSk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgIH0KIApAQCAtNzg0LDcgKzgwNCw4IEBACiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSAiIjsKQEAgLTc5OCw3ICs4MTksNyBAQAogICAgIGlmIChkZXZpY2VfbmFtZSAhPSBOVUxMKSB7CiAgICAgICAgIG5hbWUgPSBkZXZpY2VfbmFtZTsKICAgICB9Ci0gICAgcmV0dXJuIGFwcy0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGFkZHJlc3MsIG5hbWUpOworICAgIHJldHVybiBhcHMtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBhZGRyZXNzLCBuYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKQEAgLTgxMiw3ICs4MzMsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBjb25zdCBjaGFyICphZGRyZXNzID0gIiI7CkBAIC04MjYsNyArODQ4LDcgQEAKICAgICBpZiAoZGV2aWNlX25hbWUgIT0gTlVMTCkgewogICAgICAgICBuYW1lID0gZGV2aWNlX25hbWU7CiAgICAgfQotICAgIHJldHVybiBhcHMtPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsIGFkZHJlc3MsIG5hbWUpOworICAgIHJldHVybiBhcHMtPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsIGFkZHJlc3MsIG5hbWUsIGVuY29kZWRGb3JtYXQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCkBAIC04NjksNDAgKzg5MSwzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgcGlkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsIHNlY29uZGFyeU91dHB1dHMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0b3BPdXRwdXQocG9ydElkKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybjsKLSAgICBhcHMtPnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIGFwcy0+cmVsZWFzZU91dHB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTkyMywxMSArOTQwLDExIEBACiAgICAgICAgICAgICBjb25maWcsIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCAqc2lsZW5jZWQpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0SW5wdXQocG9ydElkLCBzaWxlbmNlZCk7CisgICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQpAQCAtOTcxLDEwICs5ODgsNDIgQEAKICAgICByZXR1cm4gYXBzLT5nZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHIsIGluZGV4LCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyLCBpbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ciwgaW5kZXgpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyLCBpbmRleCk7Cit9CisKIHVpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwotICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogICAgIHJldHVybiBhcHMtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7CiB9CiAKQEAgLTExNzQsNiArMTIyMywzOCBAQAogICAgIHJldHVybiAocmV0IDwgMCkgPyBJTlZBTElEX09QRVJBVElPTiA6IE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUFMpOworICAgIGlmIChnQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGludCByZXQgPSBnQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5hZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY2FsbGJhY2spOworICAgIGlmIChyZXQgPT0gMSkgeworICAgICAgICBhcHMtPnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gKHJldCA8IDApID8gSU5WQUxJRF9PUEVSQVRJT04gOiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKKyAgICBpZiAoZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpbnQgcmV0ID0gZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+cmVtb3ZlQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgYXBzLT5zZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChmYWxzZSk7CisgICAgfQorICAgIHJldHVybiAocmV0IDwgMCkgPyBJTlZBTElEX09QRVJBVElPTiA6IE5PX0VSUk9SOworfQorCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKICAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQogewpAQCAtMTI0MiwyMCArMTMyMywzMyBAQAogICAgIHJldHVybiBhcHMtPnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMsIHJlZ2lzdHJhdGlvbik7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSk7CisgICAgcmV0dXJuIGFwcy0+c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+c3RvcEF1ZGlvU291cmNlKHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykKQEAgLTEyNzIsNiArMTM2NiwyMCBAQAogICAgIHJldHVybiBhcHMtPmdldE1hc3Rlck1vbm8obW9ubyk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYWYtPnNldE1hc3RlckJhbGFuY2UoYmFsYW5jZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5nZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworfQorCiBmbG9hdCBBdWRpb1N5c3RlbTo6Z2V0U3RyZWFtVm9sdW1lREIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwpAQCAtMTMwNCw2ICsxNDEyLDEwOCBAQAogICAgIHJldHVybiBhcHMtPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb0Zvcm1hdCwgZW5hYmxlZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQoreworICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFwcy0+c2V0QXNzaXN0YW50VWlkKHVpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykKK3sKKyAgICBjb25zdCBzcCA8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnNldEExMXlTZXJ2aWNlc1VpZHModWlkcyk7Cit9CisKK2Jvb2wgQXVkaW9TeXN0ZW06OmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGFwcy0+aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSB7CisgICAgY29uc3Qgc3AgPElBdWRpb1BvbGljeVNlcnZpY2U+CisgICAgICAgICYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoZm9ybWF0cyk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3Igc3RyYXRlZ2llczsKKyAgICBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogc3RyYXRlZ2llcykgeworICAgICAgICBhdXRvIGF0dHJWZWN0ID0gc3RyYXRlZ3kuZ2V0QXVkaW9BdHRyaWJ1dGVzKCk7CisgICAgICAgIGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbihhdHRyVmVjdCksIGVuZChhdHRyVmVjdCksIFsmc3RyZWFtXShjb25zdCBhdXRvICZhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0U3RyZWFtVHlwZSgpID09IHN0cmVhbTsgfSk7CisgICAgICAgIGlmIChpdGVyICE9IGVuZChhdHRyVmVjdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLT5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoImludmFsaWQgc3RyZWFtIHR5cGUgJXMgd2hlbiBjb252ZXJ0aW5nIHRvIGF0dHJpYnV0ZXMiLCAgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICByZXR1cm4gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKK30KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCit7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHBzSWQ7CisgICAgc3RhdHVzX3QgcmV0ID0gQXVkaW9TeXN0ZW06OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzKGF0dHIpLCBwc0lkKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJubyBzdHJhdGVneSBmb3VuZCBmb3IgYXR0cmlidXRlcyAlcyIsICB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICB9CisgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3Igc3RyYXRlZ2llczsKKyAgICBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogc3RyYXRlZ2llcykgeworICAgICAgICBpZiAoc3RyYXRlZ3kuZ2V0SWQoKSA9PSBwc0lkKSB7CisgICAgICAgICAgICBhdXRvIGF0dHJWZWN0ID0gc3RyYXRlZ3kuZ2V0QXVkaW9BdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4oYXR0clZlY3QpLCBlbmQoYXR0clZlY3QpLCBbJmF0dHJdKGNvbnN0IGF1dG8gJnJlZkF0dHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkF0dHIuZ2V0QXR0cmlidXRlcygpLCBhdHRyKTsgfSk7CisgICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQoYXR0clZlY3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXItPmdldFN0cmVhbVR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HRSgiaW52YWxpZCBhdHRyaWJ1dGVzICVzIHdoZW4gY29udmVydGluZyB0byBzdHJlYW0iLCAgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+Z2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhhYSxwcm9kdWN0U3RyYXRlZ3kpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmxpc3RBdWRpb1ZvbHVtZUdyb3Vwcyhncm91cHMpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhhYSwgdm9sdW1lR3JvdXApOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogaW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvUG9ydENhbGxiYWNrKApAQCAtMTM1Myw2ICsxNTYzLDQ3IEBACiAgICAgfQogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YWRkQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja1tpXSA9PSBjYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suYWRkKGNhbGxiYWNrKTsKKyAgICByZXR1cm4gbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7Cit9CisKK2ludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpyZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0gPT0gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5yZW1vdmVBdChpKTsKKyAgICByZXR1cm4gbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7Cit9CisKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja1tpXS0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOworICAgIH0KK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSgKICAgICAgICAgU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkKIHsKQEAgLTEzNjksOSArMTYyMCwxNCBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOwpAQCAtMTM3OSw3ICsxNjM1LDggQEAKICAgICB9CiAKICAgICBpZiAoY2IgIT0gTlVMTCkgewotICAgICAgICBjYihldmVudCwgY2xpZW50SW5mbywgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICB9CiB9CiAKQEAgLTEzOTAsNiArMTY0Nyw5IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUG9ydENhbGxiYWNrcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc1tpXS0+b25TZXJ2aWNlRGllZCgpOwogICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja1tpXS0+b25TZXJ2aWNlRGllZCgpOworICAgICAgICB9CiAgICAgfQogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKaW5kZXggYTM0MTNlMS4uZTU5ZjdlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKQEAgLTMxLDkgKzMxLDEwIEBACiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3NjaGVkX3BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKQEAgLTEyMSwyMiArMTIyLDIyIEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuYWJsZSB0byBxdWVyeSBvdXRwdXQgc2FtcGxlIHJhdGUgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwogICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIHN0cmVhbVR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgZnJhbWUgY291bnQgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGZyYW1lIGNvdW50IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgdWludDMyX3QgYWZMYXRlbmN5OwogICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgbGF0ZW5jeSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuYWJsZSB0byBxdWVyeSBvdXRwdXQgbGF0ZW5jeSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC0xNDksODUgKzE1MCw1MiBAQAogICAgIC8vIEF1ZGlvVHJhY2suU0FNUExFX1JBVEVfSFpfTUlOIDw9IHNhbXBsZVJhdGUgPD0gQXVkaW9UcmFjay5TQU1QTEVfUkFURV9IWl9NQVguCiAgICAgLy8gUmV0dXJuIGVycm9yIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IGl0IGRvZXMgbm90LCBhcyB0aGF0J3MgcGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0LgogICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIEFMT0dFKCIlcygpOiBmYWlsZWQgZm9yIHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoImdldE1pbkZyYW1lQ291bnQ9JXp1OiBhZkZyYW1lQ291bnQ9JXp1LCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0ldSIsCi0gICAgICAgICAgICAqZnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CisgICAgQUxPR1YoIiVzKCk6IGdldE1pbkZyYW1lQ291bnQ9JXp1OiBhZkZyYW1lQ291bnQ9JXp1LCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0ldSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgKmZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorLy8gc3RhdGljCitib29sIEF1ZGlvVHJhY2s6OmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgQUxPR1YoIiVzKCkiLCBfX0ZVTkNUSU9OX18pOworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGFwcy0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb0NvbnRlbnRUeXBlU3RyaW5nKGF1ZGlvX2NvbnRlbnRfdHlwZV90IHZhbHVlKSB7Ci0gICAgc3RkOjpzdHJpbmcgY29udGVudFR5cGU7Ci0gICAgaWYgKEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBjb250ZW50VHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLSAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyByb29tIGZvciAiJWQiCi0gICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgdmFsdWUpOwotICAgIHJldHVybiByYXdidWZmZXI7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb1VzYWdlU3RyaW5nKGF1ZGlvX3VzYWdlX3QgdmFsdWUpIHsKLSAgICBzdGQ6OnN0cmluZyB1c2FnZTsKLSAgICBpZiAoVXNhZ2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyh2YWx1ZSwgdXNhZ2UpKSB7Ci0gICAgICAgIHJldHVybiB1c2FnZTsKLSAgICB9Ci0gICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgotICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKLSAgICByZXR1cm4gcmF3YnVmZmVyOwotfQotCiB2b2lkIEF1ZGlvVHJhY2s6Ok1lZGlhTWV0cmljczo6Z2F0aGVyKGNvbnN0IEF1ZGlvVHJhY2sgKnRyYWNrKQogewotCi0gICAgLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzIGlzIGRlZmluZWQgaW4gdGhlIGhlYWRlcgotICAgIC8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCi0gICAgLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCi0gICAgLy8gaW4gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrLmphdmEKLSAgICAvLyBUaGVzZSBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggdGhlIGNvbnN0YW50cyB0aGVyZS4KLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTdHJlYW1UeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnN0cmVhbXR5cGUiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja0NvbnRlbnRUeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnR5cGUiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1VzYWdlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVzYWdlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTYW1wbGVSYXRlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnNhbXBsZXJhdGUiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja0NoYW5uZWxNYXNrW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmNoYW5uZWxtYXNrIjsKLQotICAgIC8vIE5COiBUaGVzZSBhcmUgbm90IHlldCBleHBvc2VkIGFzIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMuCi0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrVW5kZXJydW5GcmFtZXNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudW5kZXJydW5mcmFtZXMiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1N0YXJ0dXBHbGl0Y2hbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZ2xpdGNoLnN0YXJ0dXAiOwotCiAgICAgLy8gb25seSBpZiB3ZSdyZSBpbiBhIGdvb2Qgc3RhdGUuLi4KICAgICAvLyBYWFg6IHNoYWxsIHdlIGdhdGhlciBhbHRlcm5hdGl2ZSBpbmZvIGlmIGZhaWxpbmc/CiAgICAgY29uc3Qgc3RhdHVzX3QgbHN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKICAgICBpZiAobHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRCgibm8gbWV0cmljcyBnYXRoZXJlZCwgdHJhY2sgc3RhdHVzPSVkIiwgKGludCkgbHN0YXR1cyk7CisgICAgICAgIEFMT0dEKCIlcygpOiBubyBtZXRyaWNzIGdhdGhlcmVkLCB0cmFjayBzdGF0dXM9JWQiLCBfX2Z1bmNfXywgKGludCkgbHN0YXR1cyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBjb25zdHJ1Y3RvciBndWFyYW50ZWVzIG1BbmFseXRpY3NJdGVtIGlzIHZhbGlkCisjZGVmaW5lIE1NX1BSRUZJWCAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLiIgLy8gYXZvaWQgY3V0LW4tcGFzdGUgZXJyb3JzLgogCi0gICAgY29uc3QgaW50MzJfdCB1bmRlcnJ1bkZyYW1lcyA9IHRyYWNrLT5nZXRVbmRlcnJ1bkZyYW1lcygpOwotICAgIGlmICh1bmRlcnJ1bkZyYW1lcyAhPSAwKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9UcmFja1VuZGVycnVuRnJhbWVzLCB1bmRlcnJ1bkZyYW1lcyk7Ci0gICAgfQorICAgIC8vIEphdmEgQVBJIDI4IGVudHJpZXMsIGRvIG5vdCBjaGFuZ2UuCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJzdHJlYW10eXBlIiwgdG9TdHJpbmcodHJhY2stPnN0cmVhbVR5cGUoKSkuY19zdHIoKSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJ0eXBlIiwKKyAgICAgICAgICAgIHRvU3RyaW5nKHRyYWNrLT5tQXR0cmlidXRlcy5jb250ZW50X3R5cGUpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAidXNhZ2UiLCB0b1N0cmluZyh0cmFjay0+bUF0dHJpYnV0ZXMudXNhZ2UpLmNfc3RyKCkpOwogCi0gICAgaWYgKHRyYWNrLT5tVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9UcmFja1N0YXJ0dXBHbGl0Y2gsIDEpOwotICAgIH0KLQotICAgIGlmICh0cmFjay0+bVN0cmVhbVR5cGUgIT0gLTEpIHsKLSAgICAgICAgLy8gZGVwcmVjYXRlZCwgYnV0IHRoaXMgd2lsbCB0ZWxsIHVzIHdobyBzdGlsbCB1c2VzIGl0LgotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvVHJhY2tTdHJlYW1UeXBlLCB0cmFjay0+bVN0cmVhbVR5cGUpOwotICAgIH0KLSAgICAvLyBYWFg6IGNvbnNpZGVyIGluY2x1ZGluZyBmcm9tIG1BdHRyaWJ1dGVzOiBzb3VyY2UgdHlwZQotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1RyYWNrQ29udGVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db250ZW50VHlwZVN0cmluZyh0cmFjay0+bUF0dHJpYnV0ZXMuY29udGVudF90eXBlKS5jX3N0cigpKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9UcmFja1VzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvVXNhZ2VTdHJpbmcodHJhY2stPm1BdHRyaWJ1dGVzLnVzYWdlKS5jX3N0cigpKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvVHJhY2tTYW1wbGVSYXRlLCB0cmFjay0+bVNhbXBsZVJhdGUpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQXVkaW9UcmFja0NoYW5uZWxNYXNrLCB0cmFjay0+bUNoYW5uZWxNYXNrKTsKKyAgICAvLyBOb24tQVBJIGVudHJpZXMsIHRoZXNlIGNhbiBjaGFuZ2UgZHVlIHRvIGEgSmF2YSBzdHJpbmcgbWlzdGFrZS4KKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJzYW1wbGVSYXRlIiwgKGludDMyX3QpdHJhY2stPm1TYW1wbGVSYXRlKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoTU1fUFJFRklYICJjaGFubmVsTWFzayIsIChpbnQ2NF90KXRyYWNrLT5tQ2hhbm5lbE1hc2spOworICAgIC8vIE5vbi1BUEkgZW50cmllcywgdGhlc2UgY2FuIGNoYW5nZS4KKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJwb3J0SWQiLCAoaW50MzJfdCl0cmFjay0+bVBvcnRJZCk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJlbmNvZGluZyIsIHRvU3RyaW5nKHRyYWNrLT5tRm9ybWF0KS5jX3N0cigpKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJmcmFtZUNvdW50IiwgKGludDMyX3QpdHJhY2stPm1GcmFtZUNvdW50KTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImF0dHJpYnV0ZXMiLCB0b1N0cmluZyh0cmFjay0+bUF0dHJpYnV0ZXMpLmNfc3RyKCkpOwogfQogCiAvLyBoYW5kIHRoZSB1c2VyIGEgc25hcHNob3Qgb2YgdGhlIG1ldHJpY3MuCkBAIC0zNTQsNyArMzIyLDggQEAKICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEFMT0dWKCJ+QXVkaW9UcmFjaywgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQgZnJvbSAlZCBvbiBiZWhhbGYgb2YgJWQiLAorICAgICAgICBBTE9HVigiJXMoJWQpLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCBmcm9tICVkIG9uIGJlaGFsZiBvZiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKICAgICB9CkBAIC0zODcsOCArMzU2LDEwIEBACiAgICAgcGlkX3QgY2FsbGluZ1BpZDsKICAgICBwaWRfdCBteVBpZDsKIAotICAgIEFMT0dWKCJzZXQoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgorICAgIC8vIE5vdGUgbVBvcnRJZCBpcyBub3QgdmFsaWQgdW50aWwgdGhlIHRyYWNrIGlzIGNyZWF0ZWQsIHNvIG9taXQgbVBvcnRJZCBpbiBBTE9HIGZvciBzZXQuCisgICAgQUxPR1YoIiVzKCk6IHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAiZmxhZ3MgIyV4LCBub3RpZmljYXRpb25GcmFtZXMgJWQsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCB1aWQgJWQsIHBpZCAlZCIsCisgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgdWlkLCBwaWQpOwogCkBAIC00MDcsOCArMzc4LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKKyAgICBjYXNlIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0s6CiAgICAgICAgIGlmIChjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSAlcyBidXQgY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDAiLAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VHJhbnNmZXJUb1RleHQodHJhbnNmZXJUeXBlKSwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC00MTYsMjAgKzM4OSwyMSBAQAogICAgIGNhc2UgVFJBTlNGRVJfT0JUQUlOOgogICAgIGNhc2UgVFJBTlNGRVJfU1lOQzoKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9PQlRBSU4gYnV0IHNoYXJlZEJ1ZmZlciAhPSAwIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9PQlRBSU4gYnV0IHNoYXJlZEJ1ZmZlciAhPSAwIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFJBTlNGRVJfU0hBUkVEOgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX1NIQVJFRCBidXQgc2hhcmVkQnVmZmVyID09IDAiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX1NIQVJFRCBidXQgc2hhcmVkQnVmZmVyID09IDAiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIkludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC00MzcsMTQgKzQxMSwxNSBAQAogICAgIG1UcmFuc2ZlciA9IHRyYW5zZmVyVHlwZTsKICAgICBtRG9Ob3RSZWNvbm5lY3QgPSBkb05vdFJlY29ubmVjdDsKIAotICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1Iiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksCi0gICAgICAgICAgICBzaGFyZWRCdWZmZXItPnNpemUoKSk7CisgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICIlcygpOiBzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBzaGFyZWRCdWZmZXItPnNpemUoKSk7CiAKLSAgICBBTE9HVigic2V0KCkgc3RyZWFtVHlwZSAlZCBmcmFtZUNvdW50ICV6dSBmbGFncyAlMDR4Iiwgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOworICAgIEFMT0dWKCIlcygpOiBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLAorICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQsIGZsYWdzKTsKIAogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKLSAgICAgICAgQUxPR0UoIlRyYWNrIGFscmVhZHkgaW4gdXNlIik7CisgICAgICAgIEFMT0dFKCIlcygpOiBUcmFjayBhbHJlYWR5IGluIHVzZSIsIF9fZnVuY19fKTsKICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC00NTUsNyArNDMwLDcgQEAKICAgICB9CiAgICAgaWYgKHBBdHRyaWJ1dGVzID09IE5VTEwpIHsKICAgICAgICAgaWYgKHVpbnQzMl90KHN0cmVhbVR5cGUpID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgc3RyZWFtIHR5cGUgJWQiLCBfX2Z1bmNfXywgc3RyZWFtVHlwZSk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTQ2NCwxOSArNDM5LDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcwogICAgICAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBBTE9HVigiQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKKyAgICAgICAgQUxPR1YoIiVzKCk6IEJ1aWxkaW5nIEF1ZGlvVHJhY2sgd2l0aCBhdHRyaWJ1dGVzOiIKKyAgICAgICAgICAgICAgICAiIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy51c2FnZSwgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CiAgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Ci0gICAgICAgIGlmICgobUF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobUF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0xPV19MQVRFTkNZKSAhPSAwKSB7Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2hlY2sgZGVlcCBidWZmZXIgYWZ0ZXIgZmxhZ3MgaGF2ZSBiZWVuIG1vZGlmaWVkIGFib3ZlCi0gICAgICAgIGlmIChmbGFncyA9PSBBVURJT19PVVRQVVRfRkxBR19OT05FICYmIChtQXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7Ci0gICAgICAgIH0KKyAgICAgICAgYXVkaW9fZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKG1BdHRyaWJ1dGVzLmZsYWdzLCAmZmxhZ3MpOwogICAgIH0KIAogICAgIC8vIHRoZXNlIGJlbG93IHNob3VsZCBwcm9iYWJseSBjb21lIGZyb20gdGhlIGF1ZGlvRmxpbmdlciB0b28uLi4KQEAgLTQ4OCwxNCArNDU2LDE0IEBACiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmb3JtYXQpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKIAogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCAgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNTA4LDggKzQ3Niw5IEBACiAgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCiAgICAgICAgICAgICB8fCAhYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CiAgICAgICAgIEFMT0dWKCAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKQotICAgICAgICAgICAgICAgICAgICA/ICJPZmZsb2FkIHJlcXVlc3QsIGZvcmNpbmcgdG8gRGlyZWN0IE91dHB1dCIKLSAgICAgICAgICAgICAgICAgICAgOiAiTm90IGxpbmVhciBQQ00sIGZvcmNpbmcgdG8gRGlyZWN0IE91dHB1dCIpOworICAgICAgICAgICAgICAgICAgICA/ICIlcygpOiBPZmZsb2FkIHJlcXVlc3QsIGZvcmNpbmcgdG8gRGlyZWN0IE91dHB1dCIKKyAgICAgICAgICAgICAgICAgICAgOiAiJXMoKTogTm90IGxpbmVhciBQQ00sIGZvcmNpbmcgdG8gRGlyZWN0IE91dHB1dCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCiAgICAgICAgICAgICAgICAgLy8gRklYTUUgd2h5IGNhbid0IHdlIGFsbG93IGRpcmVjdCBBTkQgZmFzdD8KICAgICAgICAgICAgICAgICAoKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKQEAgLTU2NSwxNCArNTM0LDE0IEBACiAgICAgICAgIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxID0gMDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIShmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgZm9yIG5vbi1mYXN0IHRyYWNrIiwKLSAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCBmb3Igbm9uLWZhc3QgdHJhY2siLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbm90aWZpY2F0aW9uRnJhbWVzKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCB3aXRoIG5vbi16ZXJvIGZyYW1lQ291bnQ9JXp1IiwKLSAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCB3aXRoIG5vbi16ZXJvIGZyYW1lQ291bnQ9JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5vdGlmaWNhdGlvbkZyYW1lcywgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTU4Miw3ICs1NTEsOCBAQAogICAgICAgICBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSA9IG1pbihtYXhOb3RpZmljYXRpb25zUGVyQnVmZmVyLAogICAgICAgICAgICAgICAgIG1heCgodWludDMyX3QpIC1ub3RpZmljYXRpb25GcmFtZXMsIG1pbk5vdGlmaWNhdGlvbnNQZXJCdWZmZXIpKTsKICAgICAgICAgQUxPR1dfSUYobU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgIT0gKHVpbnQzMl90KSAtbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgICAgICAgICJub3RpZmljYXRpb25GcmFtZXM9JWQgY2xhbXBlZCB0byB0aGUgcmFuZ2UgLSV1IHRvIC0ldSIsCisgICAgICAgICAgICAgICAgIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBjbGFtcGVkIHRvIHRoZSByYW5nZSAtJXUgdG8gLSV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIG1pbk5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsIG1heE5vdGlmaWNhdGlvbnNQZXJCdWZmZXIpOwogICAgIH0KICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gMDsKQEAgLTYwMywxNCArNTczLDE2IEBACiAgICAgbUNiZiA9IGNiZjsKIAogICAgIGlmIChjYmYgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9UcmFja1RocmVhZCA9IG5ldyBBdWRpb1RyYWNrVGhyZWFkKCp0aGlzLCB0aHJlYWRDYW5DYWxsSmF2YSk7CisgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkID0gbmV3IEF1ZGlvVHJhY2tUaHJlYWQoKnRoaXMpOwogICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cnVuKCJBdWRpb1RyYWNrIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTywgMCAvKnN0YWNrKi8pOwogICAgICAgICAvLyB0aHJlYWQgYmVnaW5zIGluIHBhdXNlZCBzdGF0ZSwgYW5kIHdpbGwgbm90IHJlZmVyZW5jZSB1cyB1bnRpbCBzdGFydCgpCiAgICAgfQogCiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9UcmFjawotICAgIHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woKTsKLQorICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBzdGF0dXMgPSBjcmVhdGVUcmFja19sKCk7CisgICAgfQogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1RyYWNrVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOyAgIC8vIHNlZSBjb21tZW50IGluIEF1ZGlvVHJhY2suaApAQCAtNjU4LDYgKzYzMCw3IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzdGFydCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CiAKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC02OTcsNyArNjcwLDggQEAKICAgICAgICAgICAgIC8vIFNlcnZlciBzaWRlIGhhcyBjb25zdW1lZCBzb21ldGhpbmcsIGJ1dCBpcyBpdCBmaW5pc2hlZCBjb25zdW1pbmc/CiAgICAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSBzaW5jZSBmbHVzaCBhbmQgc3RvcCBhcmUgYXN5bmNocm9ub3VzIHRoYXQgdGhlIHNlcnZlcgogICAgICAgICAgICAgLy8gaXMgc3RpbGwgYWN0aXZlIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgICAgICBBTE9HVigic3RhcnQ6IHNlcnZlciByZWFkOiVsbGQgIGN1bXVsYXRpdmUgZmx1c2hlZDolbGxkICBjbGllbnQgd3JpdHRlbjolbGxkIiwKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHNlcnZlciByZWFkOiVsbGQgIGN1bXVsYXRpdmUgZmx1c2hlZDolbGxkICBjbGllbnQgd3JpdHRlbjolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKG1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3RhcnRFdHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdKSwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRFdHMubUZsdXNoZWQsCkBAIC03NTgsNyArNzMyLDcgQEAKICAgICAgICAgLy8gU3RhcnQgb3VyIGxvY2FsIFZvbHVtZUhhbmRsZXIgZm9yIHJlc3RvcmF0aW9uIHB1cnBvc2VzLgogICAgICAgICBtVm9sdW1lSGFuZGxlci0+c2V0U3RhcnRlZCgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydCgpIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgICAgICBtU3RhdGUgPSBwcmV2aW91c1N0YXRlOwogICAgICAgICBpZiAodCAhPSAwKSB7CiAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSAhPSBTVEFURV9TVE9QUElORykgewpAQCAtNzc2LDYgKzc1MCw4IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnN0b3AoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOworCiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUgJiYgbVN0YXRlICE9IFNUQVRFX1BBVVNFRCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzg1LDcgKzc2MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKICAgICAgICAgQUxPR0RfSUYobVNoYXJlZEJ1ZmZlciA9PSBudWxscHRyLAotICAgICAgICAgICAgICAgICJzdG9wKCkgY2FsbGVkIHdpdGggJXUgZnJhbWVzIGRlbGl2ZXJlZCIsIG1SZWxlYXNlZC52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBjYWxsZWQgd2l0aCAldSBmcmFtZXMgZGVsaXZlcmVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1SZWxlYXNlZC52YWx1ZSgpKTsKICAgICAgICAgbVJlbGVhc2VkID0gMDsKICAgICB9CiAKQEAgLTgwNiw2ICs3ODIsMTAgQEAKICAgICBpZiAodCAhPSAwKSB7CiAgICAgICAgIGlmICghaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgICAgICB0LT5wYXVzZSgpOworICAgICAgICB9IGVsc2UgaWYgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CisgICAgICAgICAgICAvLyBjYXVzZXMgd2FrZSB1cCBvZiB0aGUgcGxheWJhY2sgdGhyZWFkLCB0aGF0IHdpbGwgY2FsbGJhY2sgdGhlIGNsaWVudCBmb3IKKyAgICAgICAgICAgIC8vIEVWRU5UX1NUUkVBTV9FTkQgaW4gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKKyAgICAgICAgICAgIHQtPndha2UoKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgbVByZXZpb3VzUHJpb3JpdHkpOwpAQCAtODIxLDEwICs4MDEsMTIgQEAKIAogdm9pZCBBdWRpb1RyYWNrOjpmbHVzaCgpCiB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CisKICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC04NTMsNiArODM1LDggQEAKIHZvaWQgQXVkaW9UcmFjazo6cGF1c2UoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOworCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwogICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQSU5HKSB7CkBAIC04NzgsNyArODYyLDggQEAKIAogICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFJlbmRlclBvc2l0aW9uKG1PdXRwdXQsICZoYWxGcmFtZXMsICZtUGF1c2VkUG9zaXRpb24pOwotICAgICAgICAgICAgQUxPR1YoIkF1ZGlvVHJhY2s6OnBhdXNlIGZvciBvZmZsb2FkLCBjYWNoZSBjdXJyZW50IHBvc2l0aW9uICV1IiwgbVBhdXNlZFBvc2l0aW9uKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZvciBvZmZsb2FkLCBjYWNoZSBjdXJyZW50IHBvc2l0aW9uICV1IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC05MzIsMTAgKzkxNywxMyBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0U2FtcGxlUmF0ZSh1aW50MzJfdCByYXRlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyByYXRlOiV1IiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSwgcmF0ZSk7CisKICAgICBpZiAocmF0ZSA9PSBtU2FtcGxlUmF0ZSkgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQotICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSB8fCAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpCisgICAgICAgICAgICB8fCAobUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIGlmIChtT3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CkBAIC05OTcsOCArOTg1LDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUgKGlucHV0KTogbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICBBTE9HVigiJXMoJWQpOiBtU2FtcGxlUmF0ZToldSAgbVNwZWVkOiVmICBtUGl0Y2g6JWYiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAvLyBwaXRjaCBpcyBlbXVsYXRlZCBieSBhZGp1c3Rpbmcgc3BlZWQgYW5kIHNhbXBsZVJhdGUKICAgICBjb25zdCB1aW50MzJfdCBlZmZlY3RpdmVSYXRlID0gYWRqdXN0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgY29uc3QgZmxvYXQgZWZmZWN0aXZlU3BlZWQgPSBhZGp1c3RTcGVlZChwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKQEAgLTEwMDcsMzIgKzk5NSwzMiBAQAogICAgIHBsYXliYWNrUmF0ZVRlbXAubVNwZWVkID0gZWZmZWN0aXZlU3BlZWQ7CiAgICAgcGxheWJhY2tSYXRlVGVtcC5tUGl0Y2ggPSBlZmZlY3RpdmVQaXRjaDsKIAotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUgKGVmZmVjdGl2ZSk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCi0gICAgICAgICAgICBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOworICAgIEFMT0dWKCIlcyglZCkgKGVmZmVjdGl2ZSkgbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOwogCiAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQocGxheWJhY2tSYXRlVGVtcCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAotICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgICAgICBBTE9HVygiJXMoJWQpICglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIGNvbXBhdGlibGUuCiAgICAgaWYgKCFpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbChlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoYnVmZmVyIHNpemUpIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQgKGJ1ZmZlciBzaXplKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIENoZWNrIHJlc2FtcGxlciByYXRpb3MgYXJlIHdpdGhpbiBib3VuZHMKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgPiAodWludDY0X3QpbVNhbXBsZVJhdGUgKgogICAgICAgICAgICAgKHVpbnQ2NF90KUFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGV4Y2VlZHMgbWF4IGFjY2VwdGVkIHZhbHVlIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgZXhjZWVkcyBtYXggYWNjZXB0ZWQgdmFsdWUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgKiAodWludDY0X3QpQVVESU9fUkVTQU1QTEVSX1VQX1JBVElPX01BWCA8ICh1aW50NjRfdCltU2FtcGxlUmF0ZSkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGJlbG93IG1pbiBhY2NlcHRlZCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgYmVsb3cgbWluIGFjY2VwdGVkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC0xMjMzLDcgKzEyMjEsOCBAQAogICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogCiAgICAgICAgIGlmIChpc09mZmxvYWRlZF9sKCkgJiYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0UG9zaXRpb24gY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBjYWxsZWQgaW4gcGF1c2VkIHN0YXRlLCByZXR1cm4gY2FjaGVkIHBvc2l0aW9uICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVBhdXNlZFBvc2l0aW9uKTsKICAgICAgICAgICAgICpwb3NpdGlvbiA9IG1QYXVzZWRQb3NpdGlvbjsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtMTM2MCw3ICsxMzQ5LDcgQEAKIGF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9UcmFjazo6c3RyZWFtVHlwZSgpIGNvbnN0CiB7CiAgICAgaWYgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcyk7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZShtQXR0cmlidXRlcyk7CiAgICAgfQogICAgIHJldHVybiBtU3RyZWFtVHlwZTsKIH0KQEAgLTEzNzksNyArMTM2OCw3IEBACiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kobU91dHB1dCwgJm1BZkxhdGVuY3kpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coImdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBtT3V0cHV0LCBzdGF0dXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1PdXRwdXQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQogICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CkBAIC0xMzk1LDYgKzEzODQsNyBAQAogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfT0JUQUlOKTsKICAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkMpOwogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfU0hBUkVEKTsKKyAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuICJVTlJFQ09HTklaRUQiOwogICAgIH0KQEAgLTE0MDcsNyArMTM5Nyw4IEBACiAKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMTQyNiwxMSArMTQxNywxNCBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMzogb2J0YWluL3JlbGVhc2UgbW9kZQogICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9PQlRBSU4pIHx8CiAgICAgICAgICAgICAvLyB1c2UgY2FzZSA0OiBzeW5jaHJvbm91cyB3cml0ZQotICAgICAgICAgICAgKChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQykgJiYgbVRocmVhZENhbkNhbGxKYXZhKTsKKyAgICAgICAgICAgICgobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkMgfHwgbVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spCisgICAgICAgICAgICAgICAgICAgICYmIG1UaHJlYWRDYW5DYWxsSmF2YSk7CiAKICAgICAgICAgYm9vbCBmYXN0QWxsb3dlZCA9IHNoYXJlZEJ1ZmZlciB8fCB0cmFuc2ZlckFsbG93ZWQ7CiAgICAgICAgIGlmICghZmFzdEFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQsIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCwiCisgICAgICAgICAgICAgICAgICAiIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KG1UcmFuc2ZlcikpOwogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgICAgICB9CkBAIC0xNDM4LDcgKzE0MzIsNyBAQAogCiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dCBpbnB1dDsKICAgICBpZiAobVN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhtU3RyZWFtVHlwZSwgJmlucHV0LmF0dHIpOworICAgICAgICBpbnB1dC5hdHRyID0gQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMobVN0cmVhbVR5cGUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlucHV0LmF0dHIgPSBtQXR0cmlidXRlczsKICAgICB9CkBAIC0xNDc5LDcgKzE0NzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQgb3V0cHV0ICVkIiwgc3RhdHVzLCBvdXRwdXQub3V0cHV0SWQpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIH0KQEAgLTE1MDAsNiArMTQ5NSw3IEBACiAgICAgbUFmRnJhbWVDb3VudCA9IG91dHB1dC5hZkZyYW1lQ291bnQ7CiAgICAgbUFmU2FtcGxlUmF0ZSA9IG91dHB1dC5hZlNhbXBsZVJhdGU7CiAgICAgbUFmTGF0ZW5jeSA9IG91dHB1dC5hZkxhdGVuY3lNczsKKyAgICBtUG9ydElkID0gb3V0cHV0LnBvcnRJZDsKIAogICAgIG1MYXRlbmN5ID0gbUFmTGF0ZW5jeSArICgxMDAwTEwgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKIApAQCAtMTUwOSwxMyArMTUwNSwxMyBAQAogICAgIC8vIEZJWE1FIGNvbXBhcmUgdG8gQXVkaW9SZWNvcmQKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIHZvaWQgKmlNZW1Qb2ludGVyID0gaU1lbS0+cG9pbnRlcigpOwogICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTE1MzQsMTQgKzE1MzAsMTQgQEAKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIGlmIChvdXRwdXQuZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAotICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dJKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICAgICAgaWYgKCFtVGhyZWFkQ2FuQ2FsbEphdmEpIHsKICAgICAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLCBtUmVxRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICB9CiAgICAgfQogICAgIG1GbGFncyA9IG91dHB1dC5mbGFnczsKQEAgLTE1NjksNyArMTU2NSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgYnVmZmVycyA9IG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC0xNjU4LDcgKzE2NTQsNyBAQAogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSAobG9uZykgKG1zICUgMTAwMCkgKiAxMDAwMDAwOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtMTc2OCw3ICsxNzY0LDggQEAKIHsKICAgICBpbnQzMl90IGZsYWdzID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncyk7CiAgICAgaWYgKChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSAmJiAoZmxhZ3MgJiBDQkxLX0RJU0FCTEVEKSkgewotICAgICAgICBBTE9HVygicmVsZWFzZUJ1ZmZlcigpIHRyYWNrICVwIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsIHRoaXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGhpcyk7CiAgICAgICAgIC8vIEZJWE1FIGlnbm9yaW5nIHN0YXR1cwogICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICB9CkBAIC0xNzc4LDcgKzE3NzUsNyBAQAogCiBzc2l6ZV90IEF1ZGlvVHJhY2s6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplLCBib29sIGJsb2NraW5nKQogewotICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQykgeworICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xNzk1LDcgKzE3OTIsOCBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIFNhbml0eS1jaGVjazogdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xODI4LDcgKzE4MjYsMTcgQEAKIAogICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSB3cml0dGVuIC8gbUZyYW1lU2l6ZTsKKworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKKyAgICAgICAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBjYXVzZXMgd2FrZSB1cCBvZiB0aGUgcGxheWJhY2sgdGhyZWFkLCB0aGF0IHdpbGwgY2FsbGJhY2sgdGhlIGNsaWVudCBmb3IKKyAgICAgICAgICAgICAgICAvLyBtb3JlIGRhdGEgKHdpdGggRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSkgaW4gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKKyAgICAgICAgICAgICAgICB0LT53YWtlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICByZXR1cm4gd3JpdHRlbjsKIH0KIApAQCAtMTg1Nyw3ICsxODY1LDggQEAKICAgICAgICAgICAgIHBvbGxVcyA8PD0gMTsKICAgICAgICAgfSB3aGlsZSAodHJ5Q291bnRlci0tID4gMCk7CiAgICAgICAgIGlmICh0cnlDb3VudGVyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgfQogICAgICAgICAvLyBSdW4gYWdhaW4gaW1tZWRpYXRlbHkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMDgxLDggKzIwOTAsOCBAQAogICAgICAgICBpZiAobnMgPCAwKSBucyA9IDA7CiAgICAgfQogCi0gICAgLy8gSWYgbm90IHN1cHBseWluZyBkYXRhIGJ5IEVWRU5UX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCi0gICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSykgeworICAgIC8vIElmIG5vdCBzdXBwbHlpbmcgZGF0YSBieSBFVkVOVF9NT1JFX0RBVEEgb3IgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCisgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gbnM7CiAgICAgfQogCkBAIC0yMDk4LDcgKzIxMDcsOCBAQAogICAgIGlmIChucyAhPSBOU19XSEVORVZFUikgewogICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IG5zIC8gMTAwMDAwMDAwMExMOwogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSBucyAlIDEwMDAwMDAwMDBMTDsKLSAgICAgICAgQUxPR1YoInRpbWVvdXQgJWxkLiUwM2QiLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVvdXQgJWxkLiUwM2QiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZ0aW1lb3V0OwogICAgIH0KIApAQCAtMjExMCwxOCArMjEyMCwyMCBAQAogICAgICAgICBzaXplX3Qgbm9uQ29udGlnOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwsICZub25Db250aWcpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChlcnIgIT0gTk9fRVJST1IpICE9IChhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID09IDApLAotICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IG9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogb2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIgfHwKICAgICAgICAgICAgICAgICAgICAgKGlzT2ZmbG9hZGVkKCkgJiYgKGVyciA9PSBERUFEX09CSkVDVCkpKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgYnVnIDI1MTk1NzU5CiAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAwMDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMjE0MSwxNyArMjE1MywzMSBAQAogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIC8vIHdoZW4gbm90aWZ5aW5nIGNsaWVudCBpdCBjYW4gd3JpdGUgbW9yZSBkYXRhLCBwYXNzIHRoZSB0b3RhbCBzaXplIHRoYXQgY2FuIGJlCisgICAgICAgICAgICAvLyB3cml0dGVuIGluIHRoZSBuZXh0IHdyaXRlKCkgY2FsbCwgc2luY2UgaXQncyBub3QgcGFzc2VkIHRocm91Z2ggdGhlIGNhbGxiYWNrCisgICAgICAgICAgICBhdWRpb0J1ZmZlci5zaXplICs9IG5vbkNvbnRpZzsKKyAgICAgICAgfQorICAgICAgICBtQ2JmKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSyA/IEVWRU5UX01PUkVfREFUQSA6IEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEsCisgICAgICAgICAgICAgICAgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3Qgd3JpdHRlblNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHdyaXR0ZW5TaXplKSA8IDAgfHwgd3JpdHRlblNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3Qod3JpdHRlblNpemUpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHdyaXR0ZW5TaXplID09IDApIHsKKyAgICAgICAgICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBIHdhcyBwcm9jZXNzZWQgaW4gdGhlIEpOSSBvZgorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjay4gVGhlIEpOSSBpcyBub3QgdXNpbmcgdGhlIGNhbGxiYWNrIHRvIHByb3ZpZGUgZGF0YSwKKyAgICAgICAgICAgICAgICAvLyBpdCBvbmx5IHNpZ25hbHMgdG8gdGhlIEphdmEgY2xpZW50IHRoYXQgaXQgY2FuIHByb3ZpZGUgbW9yZSBkYXRhLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgaXMgcmVhZCB0byBhY2NlcHQgbm93LgorICAgICAgICAgICAgICAgIC8vIFRoZSBwbGF5YmFjayB0aHJlYWQgd2lsbCBiZSBhd2FrZW4gYXQgdGhlIG5leHQgOjp3cml0ZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5TX1dIRU5FVkVSOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGlzIGRvbmUgZmlsbGluZyBidWZmZXJzCiAgICAgICAgICAgICAvLyBLZWVwIHRoaXMgdGhyZWFkIGdvaW5nIHRvIGhhbmRsZSB0aW1lZCBldmVudHMgYW5kCiAgICAgICAgICAgICAvLyBzdGlsbCB0cnkgdG8gZ2V0IG1vcmUgZGF0YSBpbiBpbnRlcnZhbHMgb2YgV0FJVF9QRVJJT0RfTVMKQEAgLTIyNDIsOCArMjI2OCw4IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pCiB7Ci0gICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKLSAgICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/ICJPZmZsb2FkZWQgb3IgRGlyZWN0IiA6ICJQQ00iLCBmcm9tKTsKKyAgICBBTE9HVygiJXMoJWQpOiBkZWFkIElBdWRpb1RyYWNrLCAlcywgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldwpAQCAtMjI4NiwxMCArMjMxMiw3IEBACiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyAoZGVhZCkgaW5zdGFuY2Ugd2lsbCBiZSBsZWZ0IGludGFjdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7CiAKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpOiBjcmVhdGVUcmFja19sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCiAgICAgICAgIC8vIEZvciBzdHJlYW1pbmcgdHJhY2tzLCB0aGlzIGlzIHRoZSBhbW91bnQgd2Ugb2J0YWluZWQgZnJvbSB0aGUgdXNlci9jbGllbnQKICAgICAgICAgLy8gKG5vdCB0aGUgbnVtYmVyIGFjdHVhbGx5IGNvbnN1bWVkIGF0IHRoZSBzZXJ2ZXIgLSB0aG9zZSBhcmUgYWxyZWFkeSBsb3N0KS4KQEAgLTIzMDQsNyArMjMyNyw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1TdGF0aWNQcm94eS0+c2V0QnVmZmVyUG9zaXRpb24oYnVmZmVyUG9zaXRpb24pOwogICAgICAgICAgICAgICAgIGlmIChidWZmZXJQb3NpdGlvbiA9PSBtRnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVzdG9yaW5nIHRyYWNrIGF0IGVuZCBvZiBzdGF0aWMgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IHJlc3RvcmluZyB0cmFjayBhdCBlbmQgb2Ygc3RhdGljIGJ1ZmZlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzMzQsMTQgKzIzNTcsMTggQEAKICAgICAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldDsKICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgcmVzdWx0LCByZXRyaWVzKTsKICAgICAgICAgaWYgKC0tcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRpbWUgZm9yIGFuIGV2ZW50dWFsIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgIG1SZWxlYXNlZCA9IDA7CisgICAgICAgIC8vIGlmIG5vIHJldHJpZXMgbGVmdCwgc2V0IGludmFsaWQgYml0IHRvIGZvcmNlIHJlc3RvcmluZyBhdCBuZXh0IG9jY2FzaW9uCisgICAgICAgIC8vIGFuZCBhdm9pZCBpbmNvbnNpc3RlbnQgYWN0aXZlIHN0YXRlIG9uIGNsaWVudCBhbmQgc2VydmVyIHNpZGVzCisgICAgICAgIGlmIChtQ2JsayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIzNTksOCArMjM4Niw4IEBACiAgICAgLy8gICAgICB1bmxlc3MgdGhlIHNlcnZlciBoYXMgbW9yZSB0aGFuIDJeMzEgZnJhbWVzIGluIGl0cyBidWZmZXIsCiAgICAgLy8gICAgICBpbiB3aGljaCBjYXNlIHRoZSB1c2Ugb2YgdWludDMyX3QgZm9yIHRoZXNlIGNvdW50ZXJzIGhhcyBiaWdnZXIgaXNzdWVzLgogICAgIEFMT0dFX0lGKGRlbHRhIDwgMCwKLSAgICAgICAgICAgICJkZXRlY3RlZCBpbGxlZ2FsIHJldHJvZ3JhZGUgbW90aW9uIGJ5IHRoZSBzZXJ2ZXI6IG1TZXJ2ZXIgYWR2YW5jZWQgYnkgJWQiLAotICAgICAgICAgICAgZGVsdGEpOworICAgICAgICAgICAgIiVzKCVkKTogZGV0ZWN0ZWQgaWxsZWdhbCByZXRyb2dyYWRlIG1vdGlvbiBieSB0aGUgc2VydmVyOiBtU2VydmVyIGFkdmFuY2VkIGJ5ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBkZWx0YSk7CiAgICAgbVNlcnZlciA9IG5ld1NlcnZlcjsKICAgICBpZiAoZGVsdGEgPiAwKSB7IC8vIGF2b2lkIHJldHJvZ3JhZGUKICAgICAgICAgbVBvc2l0aW9uICs9IGRlbHRhOwpAQCAtMjM4MCw5ICsyNDA3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNwZWVkIC8qLCAwIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogICAgIGNvbnN0IGJvb2wgYWxsb3dlZCA9IG1GcmFtZUNvdW50ID49IG1pbkZyYW1lQ291bnQ7CiAgICAgQUxPR0RfSUYoIWFsbG93ZWQsCi0gICAgICAgICAgICAiaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2wgZGVuaWVkICIKKyAgICAgICAgICAgICIlcyglZCk6IGRlbmllZCAiCiAgICAgICAgICAgICAibUFmTGF0ZW5jeToldSAgbUFmRnJhbWVDb3VudDolenUgIG1BZlNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUgIHNwZWVkOiVmICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudDolenUgPCBtaW5GcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgIG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUsIHNwZWVkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwogICAgIHJldHVybiBhbGxvd2VkOwpAQCAtMjQwMCw3ICsyNDI4LDggQEAKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkKSwgcHJlc2VudGF0aW9uSWQpOwogICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQpLCBwcm9ncmFtSWQpOwotICAgIEFMT0dWKCJQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIixwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKIAogICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKIH0KQEAgLTI0MjcsNyArMjQ1Niw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gd2FybiBvbmx5IGlmIG5vdCBhbiBleHBlY3RlZCByZXN0b3JlIGZhaWx1cmUuCiAgICAgICAgIEFMT0dXX0lGKCEoKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IG1Eb05vdFJlY29ubmVjdCkgJiYgc3RhdHVzID09IERFQURfT0JKRUNUKSwKLSAgICAgICAgICAgICAgICAiYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjQ2OCw3ICsyNDk3LDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAvLyBub3Qgc3VwcG9ydGVkCiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qcm94eS0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gT0ssICJzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLCBzdGF0dXMpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE9LLCAiJXMoJWQpOiBzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gbUZyYW1lc1dyaXR0ZW47CiAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gMDsKQEAgLTI1MTEsNyArMjU0MSw4IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7IC8vIG9mZmxvYWRlZCB0cmFja3MgaGFuZGxlZCBiZWxvdwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGdldFRpbWVzdGFtcCgpOiAlZCIsIG1TdGF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogSW52YWxpZCBtU3RhdGUgaW4gZ2V0VGltZXN0YW1wKCk6ICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU3RhdGUpOwogICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTI1NDUsNyArMjU3Niw4IEBACiAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIGFkanVzdCB0aGUgcG9zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgY29tcHV0ZWQgbGF0ZW5jeS4KICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUikgewogICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihtUHJldmlvdXNMb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRUaW1lc3RhbXAoKSBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbGFzdCBrZXJuZWwgT0sgdGltZSBpbmZvIGV4aXN0cyBhbmQgdGhlIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdmFsaWQgKGlmIHRoZXkgcHJlZGF0ZSB0aGUgY3VycmVudCB0cmFjaywgdGhlIHBvc2l0aW9ucyBtYXkKICAgICAgICAgICAgICAgICAgICAgLy8gYmUgemVybyBvciBuZWdhdGl2ZSkuCkBAIC0yNTYwLDggKzI1OTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZyYW1lcywgZXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgKGxvbmcgbG9uZylmcmFtZXMsIGV0cy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzID49IGV0cy5tUG9zaXRpb25bbG9jYXRpb25dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI1NjksNyArMjYwMSw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uID09IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUwpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYobVByZXZpb3VzTG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wKCkgbG9jYXRpb24gbW92ZWQgZnJvbSBzZXJ2ZXIgdG8ga2VybmVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogbG9jYXRpb24gbW92ZWQgZnJvbSBzZXJ2ZXIgdG8ga2VybmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gV2UgdXBkYXRlIHRoZSB0aW1lc3RhbXAgdGltZSBldmVuIHdoZW4gcGF1c2VkLgpAQCAtMjU5Myw3ICsyNjI2LDcgQEAKICAgICAgICAgICAgICAgICBtUHJldmlvdXNMb2NhdGlvbiA9IGxvY2F0aW9uOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyByaWdodCBhZnRlciBBdWRpb1RyYWNrIGlzIHN0YXJ0ZWQsIG9uZSBtYXkgbm90IGZpbmQgYSB0aW1lc3RhbXAKLSAgICAgICAgICAgICAgICBBTE9HVigiZ2V0QmVzdFRpbWVzdGFtcCBkaWQgbm90IGZpbmQgdGltZXN0YW1wIik7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogZ2V0QmVzdFRpbWVzdGFtcCBkaWQgbm90IGZpbmQgdGltZXN0YW1wIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKQEAgLTI2MDMsNyArMjYzNiw4IEBACiAgICAgICAgICAgICAvLyB0byBiZSB6ZXJvIHdlIGNvbnZlcnQgdGhpcyB0byBXT1VMRF9CTE9DSyAod2l0aCB0aGUgaW1wbGljaXQgbWVhbmluZyBvZgogICAgICAgICAgICAgLy8gInplcm8iIGZvciBOdVBsYXllcikuICBXZSBkb24ndCBjb252ZXJ0IGZvciB0cmFjayByZXN0b3JhdGlvbiBhcyBwb3NpdGlvbgogICAgICAgICAgICAgLy8gZG9lcyBub3QgcmVzZXQuCi0gICAgICAgICAgICBBTE9HVigidGltZXN0YW1wIHNlcnZlciBvZmZzZXQ6JWxsZCByZXN0b3JlIGZyYW1lczolbGxkIiwKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVzdGFtcCBzZXJ2ZXIgb2Zmc2V0OiVsbGQgcmVzdG9yZSBmcmFtZXM6JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0LCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuQXRSZXN0b3JlKTsKICAgICAgICAgICAgIGlmIChtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCAhPSBtRnJhbWVzV3JpdHRlbkF0UmVzdG9yZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IFdPVUxEX0JMT0NLOwpAQCAtMjYxMSw3ICsyNjQ1LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBXT1VMRF9CTE9DSywgImdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBzdGF0dXMpOworICAgICAgICBBTE9HVl9JRihzdGF0dXMgIT0gV09VTERfQkxPQ0ssICIlcyglZCk6IGdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSB7CkBAIC0yNjUwLDggKzI2ODQsOSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc3RhcnQgdGltZS4gIElmIGdyZWF0ZXIsIHRoZW4gdGhhdCBtZWFucyB3ZSBtYXkgaGF2ZSBmYWlsZWQKICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29tcGxldGVseSBmbHVzaCBvciBzdG9wIHRoZSBwcmV2aW91cyBwbGF5aW5nIHRyYWNrLgogICAgICAgICAgICAgICAgICAgICBBTE9HV19JRighbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wIHN0YXJ0dXAgZ2xpdGNoIGRldGVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IHN0YXJ0dXAgZ2xpdGNoIGRldGVjdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVsdGFUaW1lVXMoJWxsZCkgZGVsdGFQb3NpdGlvblVzKCVsbGQpIHRzbVBvc2l0aW9uKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkZWx0YVRpbWVVcywgKGxvbmcgbG9uZylkZWx0YVBvc2l0aW9uQnlVcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCA9IHRydWU7CkBAIC0yNzE5LDggKzI3NTQsOSBAQAogICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWdOcyA9IGludDY0X3QobUFmTGF0ZW5jeSAqIDEwMDAwMDBMTCk7CiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxpbWl0TnMgPSBtU3RhcnROcyAtIGxhZ05zOwogICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBsaW1pdE5zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoImNvcnJlY3RpbmcgdGltZXN0YW1wIHRpbWUgZm9yIHBhdXNlLCAiCisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogY29ycmVjdGluZyB0aW1lc3RhbXAgdGltZSBmb3IgcGF1c2UsICIKICAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50VGltZU5hbm9zOiAlbGxkIDwgbGltaXROczogJWxsZCA8IG1TdGFydE5zOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKWxpbWl0TnMsIChsb25nIGxvbmcpbVN0YXJ0TnMpOwogICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IGNvbnZlcnROc1RvVGltZXNwZWMobGltaXROcyk7CiAgICAgICAgICAgICAgICAgY3VycmVudFRpbWVOYW5vcyA9IGxpbWl0TnM7CkBAIC0yNzI4LDcgKzI3NjQsOCBAQAogCiAgICAgICAgICAgICAvLyByZXRyb2dyYWRlIGNoZWNrCiAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IHByZXZpb3VzVGltZU5hbm9zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogcmV0cm9ncmFkZSB0aW1lc3RhbXAgdGltZSBjb3JyZWN0ZWQsICVsbGQgPCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKXByZXZpb3VzVGltZU5hbm9zKTsKICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWU7CiAgICAgICAgICAgICAgICAgLy8gY3VycmVudFRpbWVOYW5vcyBub3QgdXNlZCBiZWxvdy4KQEAgLTI3NDEsNyArMjc3OCw4IEBACiAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlcG9ydCBvbmNlIHBlciBwb3NpdGlvbiBpbnN0ZWFkIG9mIHNwYW1taW5nIHRoZSBsb2cuCiAgICAgICAgICAgICAgICAgaWYgKCFtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCBwb3NpdGlvbiBjb3JyZWN0ZWQsICVkID0gJXUgLSAldSIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHJldHJvZ3JhZGUgdGltZXN0YW1wIHBvc2l0aW9uIGNvcnJlY3RlZCwgJWQgPSAldSAtICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbik7CkBAIC0yNzYxLDcgKzI3OTksOCBAQAogICAgICAgICAgICAgaWYgKGRlbHRhVGltZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjb21wdXRlZFNhbXBsZVJhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFQb3NpdGlvbiAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCAvIGRlbHRhVGltZTsKLSAgICAgICAgICAgICAgICBBTE9HRCgiY29tcHV0ZWRTYW1wbGVSYXRlOiV1ICBzYW1wbGVSYXRlOiV1IiwKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXMoJWQpOiBjb21wdXRlZFNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpY29tcHV0ZWRTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICB9CiAjZW5kaWYKQEAgLTI4MDcsMTEgKzI4NDYsMTIgQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpZCglZCkgc3RhdHVzKCVkKSwgc3RhdGUoJWQpLCBzZXNzaW9uIElkKCVkKSwgZmxhZ3MoJSN4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SWQsIG1TdGF0dXMsIG1TdGF0ZSwgbVNlc3Npb25JZCwgbUZsYWdzKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoJm1BdHRyaWJ1dGVzKSA6IG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdHRyaWJ1dGVzVG9TdHJlYW1UeXBlKG1BdHRyaWJ1dGVzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KVxuIiwKICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCk7CkBAIC0yODUwLDE4ICsyODkwLDE4IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CkBAIC0yODc0LDcgKzI5MTQsNyBAQAogICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC0yOTg1LDcgKzMwMjUsNyBAQAogICAgIGNhc2UgU1RBVEVfRkxVU0hFRDoKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gd2UncmUgbm90IGFjdGl2ZQogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGhhc1N0YXJ0ZWQoKTogJWQiLCBtU3RhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IEludmFsaWQgbVN0YXRlIGluIGhhc1N0YXJ0ZWQoKTogJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgbVN0YXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0zMDAxLDcgKzMwNDEsOCBAQAogICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICAgICAgd2FpdCA9ICh0cy5tUG9zaXRpb24gPT0gMCB8fCB0cy5tUG9zaXRpb24gPT0gbVN0YXJ0VHMubVBvc2l0aW9uKTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiaGFzU3RhcnRlZCB3YWl0OiVkICB0czoldSAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCk6IGhhc1N0YXJ0ZWQgd2FpdDolZCAgdHM6JXUgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIChpbnQpd2FpdCwKICAgICAgICAgICAgICAgICB0cy5tUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRUcy5tUG9zaXRpb24pOwpAQCAtMzAyMiw3ICszMDYzLDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBBTE9HVigiaGFzU3RhcnRlZCB3YWl0OiVkICBldHM6JWxsZCAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCk6IGhhc1N0YXJ0ZWQgd2FpdDolZCAgZXRzOiVsbGQgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIChpbnQpd2FpdCwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWV0cy5tUG9zaXRpb25bbG9jYXRpb25dLAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0RXRzLm1Qb3NpdGlvbltsb2NhdGlvbl0pOwpAQCAtMzA0Myw4ICszMDg1LDkgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1BdWRpb1RyYWNrOjpBdWRpb1RyYWNrVGhyZWFkOjpBdWRpb1RyYWNrVGhyZWFkKEF1ZGlvVHJhY2smIHJlY2VpdmVyLCBib29sIGJDYW5DYWxsSmF2YSkKLSAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCksCitBdWRpb1RyYWNrOjpBdWRpb1RyYWNrVGhyZWFkOjpBdWRpb1RyYWNrVGhyZWFkKEF1ZGlvVHJhY2smIHJlY2VpdmVyKQorICAgIDogVGhyZWFkKHRydWUgLyogYkNhbkNhbGxKYXZhICovKSAgLy8gYmluZGVyIHJlY3Vyc2lvbiBvbiByZXN0b3JlVHJhY2tfbCgpIG1heSBjYWxsIEphdmEuCisgICAgLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCksCiAgICAgICBtSWdub3JlTmV4dFBhdXNlZEludChmYWxzZSkKIHsKIH0KQEAgLTMwOTcsNyArMzE0MCw4IEBACiAgICAgICAgIG5zID0gSU5UNjRfTUFYOwogICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgIiVzKCVkKTogcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJWxsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1SZWNlaXZlci5tUG9ydElkLCAobG9uZyBsb25nKW5zKTsKICAgICAgICAgcGF1c2VJbnRlcm5hbChucyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggMDFmNDAwZC4uYzk5N2NmYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTI2LDYgKzI2LDI0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gVE9ETzogY29uc2lkZXIgcHVsbGluZyB0aGlzIGludG8gYSBzaGFyZWQgaGVhZGVyLgorLy8gc2FmZV9zdWJfb3ZlcmZsb3cgaXMgdXNlZCBlbnN1cmUgdGhhdCBzdWJ0cmFjdGlvbiBvY2N1cnMgaW4gdGhlIHNhbWUgbmF0aXZlIHR5cGUKKy8vIHdpdGggcHJvcGVyIDIncyBjb21wbGVtZW50IG92ZXJmbG93LiAgV2l0aG91dCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGl0IGlzIHBvc3NpYmxlLAorLy8gZm9yIGV4YW1wbGUsIHRoYXQgb3B0aW1pemluZyBjb21waWxlcnMgbWF5IGVsZWN0IHRvIHRyZWF0IDMyIGJpdCBzdWJ0cmFjdGlvbgorLy8gYXMgNjQgYml0IHN1YnRyYWN0aW9uIHdoZW4gc3RvcmluZyBpbnRvIGEgNjQgYml0IGRlc3RpbmF0aW9uIGFzIGludGVnZXIgb3ZlcmZsb3cgaXMKKy8vIHRlY2huaWNhbGx5IHVuZGVmaW5lZC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsCisgICAgICAgICB0eXBlbmFtZSBVLAorICAgICAgICAgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxzdGQ6OmRlY2F5X3Q8VD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmRlY2F5X3Q8VT4+e30+PgorICAgICAgICAgLy8gZW5zdXJlIGFyZ3VtZW50cyBhcmUgc2FtZSB0eXBlIChpZ25vcmluZyB2b2xhdGlsZSwgd2hpY2ggaXMgdXNlZCBpbiBjYmxrIHZhcmlhYmxlcykuCithdXRvIHNhZmVfc3ViX292ZXJmbG93KGNvbnN0IFQmIGEsIGNvbnN0IFUmIGIpIHsKKyAgICBzdGQ6OmRlY2F5X3Q8VD4gcmVzdWx0OworICAgICh2b2lkKV9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coYSwgYiwgJnJlc3VsdCk7CisgICAgLy8gbm90ZSBpZiBfX2J1aWx0aW5fc3ViX292ZXJmbG93IHJldHVybnMgdHJ1ZSwgYW4gb3ZlcmZsb3cgb2NjdXJyZWQuCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogLy8gdXNlZCB0byBjbGFtcCBhIHZhbHVlIHRvIHNpemVfdC4gIFRPRE86IG1vdmUgdG8gYW5vdGhlciBmaWxlLgogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzaXplX3QgY2xhbXBUb1NpemUoVCB4KSB7CkBAIC0xODYsNyArMjA0LDcgQEAKICAgICAgICAgICAgIGZyb250ID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKICAgICAgICAgfQogICAgICAgICAvLyB3cml0ZSB0byByZWFyLCByZWFkIGZyb20gZnJvbnQKLSAgICAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOwogICAgICAgICAvLyBwaXBlIHNob3VsZCBub3QgYmUgb3ZlcmZ1bGwKICAgICAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICAgICAgaWYgKG1Jc091dCkgewpAQCAtNjg0LDcgKzcwMiw3IEBACiAgICAgICAgIGNvbnN0IHNpemVfdCBvdmVyZmxvd0JpdCA9IG1GcmFtZUNvdW50UDIgPDwgMTsKICAgICAgICAgY29uc3Qgc2l6ZV90IG1hc2sgPSBvdmVyZmxvd0JpdCAtIDE7CiAgICAgICAgIGludDMyX3QgbmV3RnJvbnQgPSAoZnJvbnQgJiB+bWFzaykgfCAoZmx1c2ggJiBtYXNrKTsKLSAgICAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gbmV3RnJvbnQ7CisgICAgICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgbmV3RnJvbnQpOwogICAgICAgICBpZiAoZmlsbGVkID49IChzc2l6ZV90KW92ZXJmbG93Qml0KSB7CiAgICAgICAgICAgICAvLyBmcm9udCBhbmQgcmVhciBvZmZzZXRzIHNwYW4gdGhlIG92ZXJmbG93IGJpdCBvZiB0aGUgcDIgbWFzawogICAgICAgICAgICAgLy8gc28gcmViYXNpbmcgbmV3RnJvbnQgb24gdGhlIGZyb250IG9mZnNldCBpcyBvZmYgYnkgdGhlIG92ZXJmbG93IGJpdC4KQEAgLTcyNiw3ICs3NDQsNyBAQAogICAgICAgICBjb25zdCBzaXplX3Qgb3ZlcmZsb3dCaXQgPSBtRnJhbWVDb3VudFAyIDw8IDE7CiAgICAgICAgIGNvbnN0IHNpemVfdCBtYXNrID0gb3ZlcmZsb3dCaXQgLSAxOwogICAgICAgICBpbnQzMl90IG5ld1JlYXIgPSAocmVhciAmIH5tYXNrKSB8IChzdG9wICYgbWFzayk7Ci0gICAgICAgIHNzaXplX3QgZmlsbGVkID0gbmV3UmVhciAtIGZyb250OworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KG5ld1JlYXIsIGZyb250KTsKICAgICAgICAgLy8gb3ZlcmZsb3dCaXQgaXMgdW5zaWduZWQsIHNvIGNhc3QgdG8gc2lnbmVkIGZvciBjb21wYXJpc29uLgogICAgICAgICBpZiAoZmlsbGVkID49IChzc2l6ZV90KW92ZXJmbG93Qml0KSB7CiAgICAgICAgICAgICAvLyBmcm9udCBhbmQgcmVhciBvZmZzZXRzIHNwYW4gdGhlIG92ZXJmbG93IGJpdCBvZiB0aGUgcDIgbWFzawpAQCAtNzc4LDcgKzc5Niw3IEBACiAgICAgICAgIGZyb250ID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKICAgICAgICAgcmVhciA9IGNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKICAgICB9Ci0gICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBmcm9udCk7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCwgbUZyYW1lQ291bnQ9JXp1KTsgc2h1dHRpbmcgZG93biIsCkBAIC05MDUsNyArOTIzLDcgQEAKICAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50OwogICAgIH0KICAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBnZXRSZWFyKCk7Ci0gICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKKyAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQsIG1GcmFtZUNvdW50PSV6dSk7IHNodXR0aW5nIGRvd24iLApAQCAtOTMxLDcgKzk0OSw3IEBACiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKICAgICB9CiAgICAgY29uc3QgaW50MzJfdCByZWFyID0gZ2V0UmVhcigpOwotICAgIGNvbnN0IHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgIHJldHVybiAwOyAvLyBlcnJvciBjb25kaXRpb24sIHNpbGVudGx5IHJldHVybiAwLgogICAgIH0KQEAgLTEyMzMsNiArMTI1MSwyMSBAQAogICAgIHJldHVybiAwOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKK3NpemVfdCBBdWRpb1JlY29yZFNlcnZlclByb3h5OjpmcmFtZXNSZWFkeVNhZmUoKSBjb25zdAoreworICAgIGlmIChtSXNTaHV0ZG93bikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uc3QgaW50MzJfdCBmcm9udCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOworICAgIGNvbnN0IGludDMyX3QgcmVhciA9IG1DYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBmcm9udCk7CisgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgeworICAgICAgICByZXR1cm4gMDsgLy8gZXJyb3IgY29uZGl0aW9uLCBzaWxlbnRseSByZXR1cm4gMC4KKyAgICB9CisgICAgcmV0dXJuIGZpbGxlZDsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Wb2x1bWVHcm91cC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1ZvbHVtZUdyb3VwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzlhMzYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Wb2x1bWVHcm91cC5jcHAKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Wb2x1bWVHcm91cCIKKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IEF1ZGlvVm9sdW1lR3JvdXA6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQoreworICAgIHN0YXR1c190IHJldCA9IHBhcmNlbC0+cmVhZFV0ZjhGcm9tVXRmMTYoJm1OYW1lKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIG1Hcm91cElkID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlOworICAgICAgICBhdHRyaWJ1dGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLnB1c2hfYmFjayhhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlcygpKTsKKyAgICB9CisgICAgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICAgICAgbVN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Wb2x1bWVHcm91cDo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKK3sKKyAgICBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYobU5hbWUpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtR3JvdXBJZCkpOworICAgIHNpemVfdCBzaXplID0gbUF1ZGlvQXR0cmlidXRlcy5zaXplKCk7CisgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHNpemUpOworICAgIHNpemVfdCBmaW5hbFNpemUgPSBzaXplOworICAgIGZvciAoY29uc3QgYXV0byAmYXR0cmlidXRlcyA6IG1BdWRpb0F0dHJpYnV0ZXMpIHsKKyAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZShhdHRyaWJ1dGVzKTsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gYXR0cmlidXRlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgfQorICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtU3RyZWFtcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogbVN0cmVhbXMpIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0cmVhbSkpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKaW5kZXggOWYzYjc0Mi4uODI1Y2Q0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKQEAgLTI0LDEwICsyNCw4IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotCisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSAiSUF1ZGlvRmxpbmdlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC04OSw2ICs4Nyw4IEBACiAgICAgU1lTVEVNX1JFQURZLAogICAgIEZSQU1FX0NPVU5UX0hBTCwKICAgICBHRVRfTUlDUk9QSE9ORVMsCisgICAgU0VUX01BU1RFUl9CQUxBTkNFLAorICAgIEdFVF9NQVNURVJfQkFMQU5DRSwKIH07CiAKICNkZWZpbmUgTUFYX0lURU1TX1BFUl9MSVNUIDEwMjQKQEAgLTI0NCw2ICsyNDQsMzQgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHN0YXR1c190IHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVGbG9hdChiYWxhbmNlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9NQVNURVJfQkFMQU5DRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkgY29uc3Qgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUFTVEVSX0JBTEFOQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpiYWxhbmNlID0gcmVwbHkucmVhZEZsb2F0KCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdmFsdWUsCiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCiAgICAgewpAQCAtNjAwLDE0ICs2MjgsMTggQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QKICAgICB7Ci0gICAgICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHBVdWlkID09IE5VTEwgfHwgcFR5cGUgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUocFV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGUocFR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVVaW50MzIocHJlZmVycmVkVHlwZUZsYWcpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0VGRkVDVF9ERVNDUklQVE9SLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNjM2LDEwICs2NjgsMTAgQEAKICAgICAgICAgc3A8SUVmZmVjdD4gZWZmZWN0OwogCiAgICAgICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWZmZWN0OwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlZmZlY3Q7CiAgICAgICAgIH0KIAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTkxMiw3ICs5NDQsNyBAQAogICAgICAgICBjYXNlIFNFVF9NSUNfTVVURToKICAgICAgICAgY2FzZSBTRVRfTE9XX1JBTV9ERVZJQ0U6CiAgICAgICAgIGNhc2UgU1lTVEVNX1JFQURZOiB7Ci0gICAgICAgICAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSA+PSBBSURfQVBQX1NUQVJUKSB7CisgICAgICAgICAgICBpZiAoIWlzU2VydmljZVVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCB1bmF1dGhvcml6ZWQgVUlEICVkIiwKICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CkBAIC05NTEsOSArOTgzLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGNoYXIgdGltZUNoZWNrU3RyaW5nWzY0XTsKLSAgICBzbnByaW50Zih0aW1lQ2hlY2tTdHJpbmcsIHNpemVvZih0aW1lQ2hlY2tTdHJpbmcpLCAiSUF1ZGlvRmxpbmdlcjogJWQiLCBjb2RlKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGltZUNoZWNrU3RyaW5nKTsKKyAgICBzdGQ6OnN0cmluZyB0YWcoIklBdWRpb0ZsaW5nZXIgY29tbWFuZCAiICsgc3RkOjp0b19zdHJpbmcoY29kZSkpOworICAgIFRpbWVDaGVjayBjaGVjayh0YWcuY19zdHIoKSk7CiAKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBDUkVBVEVfVFJBQ0s6IHsKQEAgLTEwNDksNiArMTA4MCwyMSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIG1hc3Rlck11dGUoKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9NQVNURVJfQkFMQU5DRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBzZXRNYXN0ZXJCYWxhbmNlKGRhdGEucmVhZEZsb2F0KCkpICk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX01BU1RFUl9CQUxBTkNFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZmxvYXQgZjsKKyAgICAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGdldE1hc3RlckJhbGFuY2UoJmYpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClyZXBseS0+d3JpdGVGbG9hdChmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfU1RSRUFNX1ZPTFVNRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTI4MCw4ICsxMzI2LDExIEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkOwogICAgICAgICAgICAgZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcgPSBkYXRhLnJlYWRVaW50MzIoKTsKICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IHt9OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmdXVpZCwgJmRlc2MpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmdXVpZCwgJnR5cGUsIHByZWZlcnJlZFR5cGVGbGFnLCAmZGVzYyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggOGNkNGE4NS4uM2JhYzQ0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTI0LDExICsyNCwxMCBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTIsNiArNTEsMTAgQEAKICAgICBJTklUX1NUUkVBTV9WT0xVTUUsCiAgICAgU0VUX1NUUkVBTV9WT0xVTUUsCiAgICAgR0VUX1NUUkVBTV9WT0xVTUUsCisgICAgU0VUX1ZPTFVNRV9BVFRSSUJVVEVTLAorICAgIEdFVF9WT0xVTUVfQVRUUklCVVRFUywKKyAgICBHRVRfTUlOX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywKKyAgICBHRVRfTUFYX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywKICAgICBHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTSwKICAgICBHRVRfT1VUUFVUX0ZPUl9FRkZFQ1QsCiAgICAgUkVHSVNURVJfRUZGRUNULApAQCAtNjMsNiArNjYsNyBAQAogICAgIFNFVF9FRkZFQ1RfRU5BQkxFRCwKICAgICBJU19TVFJFQU1fQUNUSVZFX1JFTU9URUxZLAogICAgIElTX09GRkxPQURfU1VQUE9SVEVELAorICAgIElTX0RJUkVDVF9PVVRQVVRfU1VQUE9SVEVELAogICAgIExJU1RfQVVESU9fUE9SVFMsCiAgICAgR0VUX0FVRElPX1BPUlQsCiAgICAgQ1JFQVRFX0FVRElPX1BBVENILApAQCAtNzgsMTEgKzgyLDI2IEBACiAgICAgU1RBUlRfQVVESU9fU09VUkNFLAogICAgIFNUT1BfQVVESU9fU09VUkNFLAogICAgIFNFVF9BVURJT19QT1JUX0NBTExCQUNLX0VOQUJMRUQsCisgICAgU0VUX0FVRElPX1ZPTFVNRV9HUk9VUF9DQUxMQkFDS19FTkFCTEVELAogICAgIFNFVF9NQVNURVJfTU9OTywKICAgICBHRVRfTUFTVEVSX01PTk8sCiAgICAgR0VUX1NUUkVBTV9WT0xVTUVfREIsCiAgICAgR0VUX1NVUlJPVU5EX0ZPUk1BVFMsCi0gICAgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVECisgICAgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVELAorICAgIEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsCisgICAgUkVNT1ZFX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwKKyAgICBBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNULAorICAgIFJFTU9WRV9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsCisgICAgU0VUX0FTU0lTVEFOVF9VSUQsCisgICAgU0VUX0ExMVlfU0VSVklDRVNfVUlEUywKKyAgICBJU19IQVBUSUNfUExBWUJBQ0tfU1VQUE9SVEVELAorICAgIFNFVF9VSURfREVWSUNFX0FGRklOSVRZLAorICAgIFJFTU9WRV9VSURfREVWSUNFX0FGRklOSVRZLAorICAgIEdFVF9PRkZMT0FEX0ZPUk1BVFNfQTJEUCwKKyAgICBMSVNUX0FVRElPX1BST0RVQ1RfU1RSQVRFR0lFUywKKyAgICBHRVRfU1RSQVRFR1lfRk9SX0FUVFJJQlVURVMsCisgICAgTElTVF9BVURJT19WT0xVTUVfR1JPVVBTLAorICAgIEdFVF9WT0xVTUVfR1JPVVBfRk9SX0FUVFJJQlVURVMKIH07CiAKICNkZWZpbmUgTUFYX0lURU1TX1BFUl9MSVNUIDEwMjQKQEAgLTk5LDcgKzExOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0xMDcsNiArMTI3LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdGUpKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfbmFtZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGVuY29kZWRGb3JtYXQpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CkBAIC0xMjUsMTMgKzE0NiwxNSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZGV2aWNlKSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9hZGRyZXNzKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX25hbWUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihlbmNvZGVkRm9ybWF0KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChIQU5ETEVfREVWSUNFX0NPTkZJR19DSEFOR0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQpAQCAtMTczLDE2ICsxOTYsMTcgQEAKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlCiAgICAgICAgIHsKICAgICAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMjA4LDYgKzIzMiwxMCBAQAogICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyIE5VTEwgcG9ydElkIC0gc2hvdWxkbid0IGhhcHBlbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2Vjb25kYXJ5T3V0cHV0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIgTlVMTCBzZWNvbmRhcnlPdXRwdXRzIC0gc2hvdWxkbid0IGhhcHBlbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYXR0ciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI0Miw0NCArMjcwLDM0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgKnBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMtPnJlc2l6ZShyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXR1cm4gcmVwbHkucmVhZChzZWNvbmRhcnlPdXRwdXRzLT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5zaXplKCkgKiBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKICAgICAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpcG9ydElkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTMzNiwxNiArMzU0LDEzIEBACiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKnNpbGVuY2VkID8gMSA6IDApOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlRfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgKnNpbGVuY2VkID0gcmVwbHkucmVhZEludDMyKCkgPT0gMTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKQEAgLTQwNywxMyArNDIyLDc3IEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZGV2aWNlKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVk9MVU1FX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1ZPTFVNRV9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NSU5fVk9MVU1FX0ZPUl9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NQVhfVk9MVU1FX0ZPUl9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdHJlYW0pKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVFJBVEVHWV9GT1JfU1RSRUFNLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkVWludDMyKCk7CiAgICAgfQogCiAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKQEAgLTUzMyw2ICs2MTIsMTYgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CisgICAgICAgIGRhdGEud3JpdGUoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0RJUkVDVF9PVVRQVVRfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SID8gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpIDogZmFsc2U7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtNjc0LDYgKzc2MywxNCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGVuYWJsZWQgPyAxIDogMCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQsIGRhdGEsICZyZXBseSk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCkBAIC03NTMsMTEgKzg1MCwxMSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBwb3J0SWQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlKHNvdXJjZSwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOwpAQCAtNzcwLDE1ICs4NjcsMTUgQEAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICAqaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9BVURJT19TT1VSQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC04NzksNiArOTc2LDI3OSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQorICAgIHsKKyAgICAgICAgaWYgKGZvcm1hdHMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFAsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbGlzdF9zaXplID0gcmVwbHkucmVhZFVpbnQzMigpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdF9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZvcm1hdHMtPnB1c2hfYmFjayhzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4ocmVwbHkucmVhZEludDMyKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisKKyAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZSh1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzYWdlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAqaWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZSh1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNvdXJjZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgKmlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BU1NJU1RBTlRfVUlELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWRzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byB1aWQgOiB1aWRzKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0ExMVlfU0VSVklDRVNfVUlEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJU19IQVBUSUNfUExBWUJBQ0tfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRCb29sKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVpZCk7CisgICAgICAgIHNpemVfdCBzaXplID0gZGV2aWNlcy5zaXplKCk7CisgICAgICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNpemUpOworICAgICAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlc1tpXS53cml0ZVRvUGFyY2VsKCZkYXRhKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVpZCk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BST0RVQ1RfU1RSQVRFR0lFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBwZXJtaXNzaW9uIGRlbmllZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBudW1TdHJhdGVnaWVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJhdGVnaWVzOyBpKyspIHsKKyAgICAgICAgICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5IHN0cmF0ZWd5OworICAgICAgICAgICAgc3RhdHVzID0gc3RyYXRlZ3kucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZWFkIHN0cmF0ZWdpZXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyYXRlZ2llcy5wdXNoX2JhY2soc3RyYXRlZ3kpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhYS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NUUkFURUdZX0ZPUl9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcHJvZHVjdFN0cmF0ZWd5ID0gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1ZPTFVNRV9HUk9VUFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBudW1Hcm91cHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUdyb3VwczsgaSsrKSB7CisgICAgICAgICAgICBBdWRpb1ZvbHVtZUdyb3VwIGdyb3VwOworICAgICAgICAgICAgc3RhdHVzID0gZ3JvdXAucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZWFkIHZvbHVtZSBncm91cHMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGdyb3Vwcy5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBncm91cHMucHVzaF9iYWNrKGdyb3VwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhYS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1ZPTFVNRV9HUk9VUF9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHZvbHVtZUdyb3VwID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2UiKTsKQEAgLTg5Nyw3ICsxMjY3LDYgQEAKICAgICAgICAgY2FzZSBTVEFSVF9JTlBVVDoKICAgICAgICAgY2FzZSBTVE9QX0lOUFVUOgogICAgICAgICBjYXNlIFJFTEVBU0VfSU5QVVQ6Ci0gICAgICAgIGNhc2UgR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU06CiAgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfRUZGRUNUOgogICAgICAgICBjYXNlIFJFR0lTVEVSX0VGRkVDVDoKICAgICAgICAgY2FzZSBVTlJFR0lTVEVSX0VGRkVDVDoKQEAgLTkzMiwxMSArMTMwMSwxNiBAQAogICAgICAgICBjYXNlIFNFVF9TVFJFQU1fVk9MVU1FOgogICAgICAgICBjYXNlIFJFR0lTVEVSX1BPTElDWV9NSVhFUzoKICAgICAgICAgY2FzZSBTRVRfTUFTVEVSX01PTk86Ci0gICAgICAgIGNhc2UgU1RBUlRfQVVESU9fU09VUkNFOgotICAgICAgICBjYXNlIFNUT1BfQVVESU9fU09VUkNFOgogICAgICAgICBjYXNlIEdFVF9TVVJST1VORF9GT1JNQVRTOgotICAgICAgICBjYXNlIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRDogewotICAgICAgICAgICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgPj0gQUlEX0FQUF9TVEFSVCkgeworICAgICAgICBjYXNlIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRDoKKyAgICAgICAgY2FzZSBTRVRfQVNTSVNUQU5UX1VJRDoKKyAgICAgICAgY2FzZSBTRVRfQTExWV9TRVJWSUNFU19VSURTOgorICAgICAgICBjYXNlIFNFVF9VSURfREVWSUNFX0FGRklOSVRZOgorICAgICAgICBjYXNlIFJFTU9WRV9VSURfREVWSUNFX0FGRklOSVRZOgorICAgICAgICBjYXNlIEdFVF9PRkZMT0FEX0ZPUk1BVFNfQTJEUDoKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1ZPTFVNRV9HUk9VUFM6CisgICAgICAgIGNhc2UgR0VUX1ZPTFVNRV9HUk9VUF9GT1JfQVRUUklCVVRFUzogeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtOTQ4LDkgKzEzMjIsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgY2hhciB0aW1lQ2hlY2tTdHJpbmdbNjRdOwotICAgIHNucHJpbnRmKHRpbWVDaGVja1N0cmluZywgc2l6ZW9mKHRpbWVDaGVja1N0cmluZyksICJJQXVkaW9Qb2xpY3lTZXJ2aWNlOiAlZCIsIGNvZGUpOwotICAgIFRpbWVDaGVjayBjaGVjayh0aW1lQ2hlY2tTdHJpbmcpOworICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlKSk7CisgICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKIAogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURTogewpAQCAtOTYxLDYgKzEzMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjb2RlY0Zvcm1hdCA9IHN0YXRpY19jYXN0IDxhdWRpb19mb3JtYXRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpZiAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0ciB8fCBkZXZpY2VfbmFtZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkJhZCBCaW5kZXIgdHJhbnNhY3Rpb246IFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURSBmb3IgZGV2aWNlICV1IiwgZGV2aWNlKTsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PiAoQkFEX1ZBTFVFKSk7CkBAIC05NjgsNyArMTM0Miw4IEBACiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjRm9ybWF0KSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtOTk0LDEzICsxMzY5LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19kZXZpY2VzX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSA9IGRhdGEucmVhZENTdHJpbmcoKTsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGNvZGVjRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX2Zvcm1hdF90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGlmIChkZXZpY2VfYWRkcmVzcyA9PSBudWxscHRyIHx8IGRldmljZV9uYW1lID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiQmFkIEJpbmRlciB0cmFuc2FjdGlvbjogSEFORExFX0RFVklDRV9DT05GSUdfQ0hBTkdFIGZvciBkZXZpY2UgJXUiLCBkZXZpY2UpOwogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+IChCQURfVkFMVUUpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjRm9ybWF0KSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMTA2Myw0OCArMTQ0MSwzOSBAQAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IDA7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE91dHB1dEZvckF0dHIoaGFzQXR0cmlidXRlcyA/ICZhdHRyIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwgc2Vzc2lvbiwgJnN0cmVhbSwgcGlkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG91dHB1dCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdHJlYW0pOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWREZXZpY2VJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwb3J0SWQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vjb25kYXJ5T3V0cHV0cy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlcGx5LT53cml0ZShzZWNvbmRhcnlPdXRwdXRzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cy5zaXplKCkgKiBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUQVJUX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbikpKTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydE91dHB1dChwb3J0SWQpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVE9QX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdG9wT3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbikpKTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdG9wT3V0cHV0KHBvcnRJZCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVsZWFzZU91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtMTEzOSwxMCArMTUwOCw4IEBACiAgICAgICAgIGNhc2UgU1RBUlRfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydElucHV0KHBvcnRJZCwgJnNpbGVuY2VkKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0SW5wdXQocG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaWxlbmNlZCA/IDEgOiAwKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtMTE5OCw3ICsxNTY1LDc0IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9WT0xVTUVfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGluZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBkZXZpY2UpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfVk9MVU1FX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgR0VUX01JTl9WT0xVTUVfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9NQVhfVk9MVU1FX0ZPUl9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTEzMTMsNiArMTc0NywxOCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBJU19ESVJFQ1RfT1VUUFVUX1NVUFBPUlRFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0ge307CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIExJU1RfQVVESU9fUE9SVFM6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlID0gKGF1ZGlvX3BvcnRfcm9sZV90KWRhdGEucmVhZEludDMyKCk7CkBAIC0xNDM4LDYgKzE4ODQsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIFNFVF9BVURJT19WT0xVTUVfR1JPVVBfQ0FMTEJBQ0tfRU5BQkxFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGRhdGEucmVhZEludDMyKCkgPT0gMSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgY2FzZSBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oCkBAIC0xNDk4LDE3ICsxOTUwLDE3IEBACiAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICAgZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgICAgICBzYW5ldGl6ZUF1ZGlvQXR0cmlidXRlcygmYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZoYW5kbGUpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRBdWRpb1NvdXJjZSgmc291cmNlLCAmYXR0cmlidXRlcywgJnBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHBvcnRJZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVE9QX0FVRElPX1NPVVJDRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTE1ODcsNiArMjAzOSwyNTIgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgR0VUX09GRkxPQURfRk9STUFUU19BMkRQOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGVuY29kaW5nRm9ybWF0czsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoJmVuY29kaW5nRm9ybWF0cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oZW5jb2RpbmdGb3JtYXRzLnNpemUoKSkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbmNvZGluZ0Zvcm1hdHMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZW5jb2RpbmdGb3JtYXRzW2ldKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworCisgICAgICAgIGNhc2UgQUREX1NUUkVBTV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZFN0cmluZzE2KCZvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gMDsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVNT1ZFX1NUUkVBTV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdW5pcXVlX2lkX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaWQpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFERF9TT1VSQ0VfREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWU7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRTdHJpbmcxNigmb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IDA7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oYWRkU291cmNlRGVmYXVsdEVmZmVjdCgmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaWQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSBzdGF0aWNfY2FzdDxhdWRpb191bmlxdWVfaWRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4ocmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpZCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX0FTU0lTVEFOVF9VSUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQzMl90IHVpZDsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZ1aWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBzZXRBc3Npc3RhbnRVaWQodWlkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX0ExMVlfU0VSVklDRVNfVUlEUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90PiB1aWRzOworICAgICAgICAgICAgaW50MzJfdCBzaXplOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnNpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIHNpemUgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHVpZDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAgZGF0YS5yZWFkSW50MzIoJnVpZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1aWRzLnB1c2hfYmFjayh1aWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gc2V0QTExeVNlcnZpY2VzVWlkcyh1aWRzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGJvb2wgaXNTdXBwb3J0ZWQgPSBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVCb29sKGlzU3VwcG9ydGVkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsgICAgCisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9VSURfREVWSUNFX0FGRklOSVRZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgY29uc3QgdWlkX3QgdWlkID0gKHVpZF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+IGRldmljZXM7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2U7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZS5yZWFkRnJvbVBhcmNlbCgoUGFyY2VsKikmZGF0YSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNvbnN0IHVpZF90IHVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExJU1RfQVVESU9fUFJPRFVDVF9TVFJBVEVHSUVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3Igc3RyYXRlZ2llczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN0cmF0ZWdpZXMuc2l6ZSgpOworICAgICAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyYXRlZ2llc1tpXS53cml0ZVRvUGFyY2VsKHJlcGx5KSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfU1RSQVRFR1lfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dHJpYnV0ZXMucmVhZEZyb21QYXJjZWwoJmRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3k7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKHN0YXRpY19jYXN0PGludD4oc3RyYXRlZ3kpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTElTVF9BVURJT19WT0xVTUVfR1JPVVBTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9Wb2x1bWVHcm91cFZlY3RvciBncm91cHM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBncm91cHMuc2l6ZSgpOworICAgICAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzW2ldLndyaXRlVG9QYXJjZWwocmVwbHkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9WT0xVTUVfR1JPVVBfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dHJpYnV0ZXMucmVhZEZyb21QYXJjZWwoJmRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBncm91cCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDxpbnQ+KGdyb3VwKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCmluZGV4IGFkN2YxZGUuLjUyZDhjY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCkBAIC0zMSw3ICszMSw4IEBACiAgICAgUE9SVF9MSVNUX1VQREFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgUEFUQ0hfTElTVF9VUERBVEUsCiAgICAgTUlYX1NUQVRFX1VQREFURSwKLSAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUKKyAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUsCisgICAgVk9MVU1FX0dST1VQX0NIQU5HRUQsCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01MiwxMiArNTMsMzcgQEAKICAgICBjbGllbnRJbmZvLT51aWQgPSAodWlkX3QpIGRhdGEucmVhZFVpbnQzMigpOwogICAgIGNsaWVudEluZm8tPnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgIGNsaWVudEluZm8tPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICBkYXRhLnJlYWQoJmNsaWVudEluZm8tPnBvcnRfaWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgY2xpZW50SW5mby0+c2lsZW5jZWQgPSBkYXRhLnJlYWRCb29sKCk7CiB9CiAKLWlubGluZSB2b2lkIHdyaXRlUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoUGFyY2VsJiBkYXRhLCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgeworaW5saW5lIHZvaWQgd3JpdGVSZWNvcmRDbGllbnRJbmZvVG9QYXJjZWwoUGFyY2VsJiBkYXRhLCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgewogICAgIGRhdGEud3JpdGVVaW50MzIoKHVpbnQzMl90KSBjbGllbnRJbmZvLT51aWQpOwogICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+c2Vzc2lvbik7CiAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5zb3VyY2UpOworICAgIGRhdGEud3JpdGUoJmNsaWVudEluZm8tPnBvcnRfaWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgZGF0YS53cml0ZUJvb2woY2xpZW50SW5mby0+c2lsZW5jZWQpOworfQorCitpbmxpbmUgdm9pZCByZWFkRWZmZWN0VmVjdG9yRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiAqZWZmZWN0cykgeworICAgIGludDMyX3QgbnVtRWZmZWN0cyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgaSsrKSB7CisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZWZmZWN0OworICAgICAgICBpZiAoZGF0YS5yZWFkKCZlZmZlY3QsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICgqZWZmZWN0cykucHVzaF9iYWNrKGVmZmVjdCk7CisgICAgfQorfQorCitpbmxpbmUgdm9pZCB3cml0ZUVmZmVjdFZlY3RvclRvUGFyY2VsKFBhcmNlbCYgZGF0YSwgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cykgeworICAgIGRhdGEud3JpdGVVaW50MzIoKHVpbnQzMl90KSBlZmZlY3RzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBlZmZlY3QgOiBlZmZlY3RzKSB7CisgICAgICAgIGlmIChkYXRhLndyaXRlKCZlZmZlY3QsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04Myw2ICsxMDksMTUgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBBVENIX0xJU1RfVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiAKKyAgICB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVVaW50MzIoZ3JvdXApOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVk9MVU1FX0dST1VQX0NIQU5HRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KKwogICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTkyLDE2ICsxMjcsMjQgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1JWF9TVEFURV9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIAotICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQpOwotICAgICAgICB3cml0ZVJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGRhdGEsIGNsaWVudEluZm8pOworICAgICAgICB3cml0ZVJlY29yZENsaWVudEluZm9Ub1BhcmNlbChkYXRhLCBjbGllbnRJbmZvKTsKICAgICAgICAgd3JpdGVBdWRpb0NvbmZpZ0Jhc2VUb1BhcmNlbChkYXRhLCBjbGllbnRDb25maWcpOworICAgICAgICB3cml0ZUVmZmVjdFZlY3RvclRvUGFyY2VsKGRhdGEsIGNsaWVudEVmZmVjdHMpOwogICAgICAgICB3cml0ZUF1ZGlvQ29uZmlnQmFzZVRvUGFyY2VsKGRhdGEsIGRldmljZUNvbmZpZyk7CisgICAgICAgIHdyaXRlRWZmZWN0VmVjdG9yVG9QYXJjZWwoZGF0YSwgZWZmZWN0cyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwYXRjaEhhbmRsZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc291cmNlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogfTsKQEAgLTEyNCw2ICsxNjcsMTMgQEAKICAgICAgICAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICBjYXNlIFZPTFVNRV9HUk9VUF9DSEFOR0VEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXAgPSBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4oZGF0YS5yZWFkVWludDMyKCkpOworICAgICAgICAgICAgaW50IGZsYWdzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIGZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICBjYXNlIE1JWF9TVEFURV9VUERBVEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBTdHJpbmc4IHJlZ0lkID0gZGF0YS5yZWFkU3RyaW5nOCgpOwpAQCAtMTM5LDEwICsxODksMTUgQEAKICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZGV2aWNlQ29uZmlnOwogICAgICAgICAgICAgcmVhZFJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGRhdGEsICZjbGllbnRJbmZvKTsKICAgICAgICAgICAgIHJlYWRBdWRpb0NvbmZpZ0Jhc2VGcm9tUGFyY2VsKGRhdGEsICZjbGllbnRDb25maWcpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0czsKKyAgICAgICAgICAgIHJlYWRFZmZlY3RWZWN0b3JGcm9tUGFyY2VsKGRhdGEsICZjbGllbnRFZmZlY3RzKTsKICAgICAgICAgICAgIHJlYWRBdWRpb0NvbmZpZ0Jhc2VGcm9tUGFyY2VsKGRhdGEsICZkZXZpY2VDb25maWcpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0czsKKyAgICAgICAgICAgIHJlYWRFZmZlY3RWZWN0b3JGcm9tUGFyY2VsKGRhdGEsICZlZmZlY3RzKTsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmY2xpZW50SW5mbywgJmNsaWVudENvbmZpZywgJmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmY2xpZW50SW5mbywgJmNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCmluZGV4IGFkZmYwNTcuLjgzYTU2OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKQEAgLTM5LDYgKzM5LDcgQEAKICAgICBQQVVTRSwKICAgICBBVFRBQ0hfQVVYX0VGRkVDVCwKICAgICBTRVRfUEFSQU1FVEVSUywKKyAgICBTRUxFQ1RfUFJFU0VOVEFUSU9OLAogICAgIEdFVF9USU1FU1RBTVAsCiAgICAgU0lHTkFMLAogICAgIEFQUExZX1ZPTFVNRV9TSEFQRVIsCkBAIC0xMjcsNiArMTI4LDE5IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgLyogU2VsZWN0cyB0aGUgcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJlc2VudGF0aW9uSWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJvZ3JhbUlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFTEVDVF9QUkVTRU5UQVRJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTIzOSw2ICsyNTMsMTEgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycykpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFTEVDVF9QUkVTRU5UQVRJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0UHJlc2VudGF0aW9uKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBHRVRfVElNRVNUQU1QOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIEF1ZGlvVGltZXN0YW1wIHRpbWVzdGFtcDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKaW5kZXggNWM1ZGJkNi4uNTM2YjAwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgIm1lZGlhL1RvbmVHZW5lcmF0b3IuaCIKIAogCkBAIC0xMjQyLDcgKzEyNDEsNyBAQAogICAgIGlmIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgewogICAgICAgICBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RUTUY7CiAgICAgfQotICAgIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoc3RyZWFtVHlwZSwgJmF0dHIpOworICAgIGF0dHIgPSBBdWRpb1N5c3RlbTo6c3RyZWFtVHlwZVRvQXR0cmlidXRlcyhzdHJlYW1UeXBlKTsKIAogICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gbVByb2Nlc3NTaXplOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQXVkaW9UcmFjay0+c2V0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCmluZGV4IDAxZTBhNzEuLmNmOWM3ZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKQEAgLTM2LDQgKzM2LDEyIEBACiAgIC8qIEdldCBhIGxpc3Qgb2YgY3VycmVudCBhY3RpdmUgbWljcm9waG9uZXMuCiAgICAqLwogICB2b2lkIGdldEFjdGl2ZU1pY3JvcGhvbmVzKG91dCBNaWNyb3Bob25lSW5mb1tdIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKworICAvKiBTZXQgdGhlIG1pY3JvcGhvbmUgZGlyZWN0aW9uIChmb3IgcHJvY2Vzc2luZykuCisgICAqLworICB2b2lkIHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oaW50IC8qYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCovIGRpcmVjdGlvbik7CisKKyAgLyogU2V0IHRoZSBtaWNyb3Bob25lIHpvb20gKGZvciBwcm9jZXNzaW5nKS4KKyAgICovCisgIHZvaWQgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzNWU5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbW1vblR5cGVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9BdHRyaWJ1dGVzIDogcHVibGljIFBhcmNlbGFibGUKK3sKK3B1YmxpYzoKKyAgICBBdWRpb0F0dHJpYnV0ZXMoKSA9IGRlZmF1bHQ7CisgICAgQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcykgOiBtQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7fQorICAgIEF1ZGlvQXR0cmlidXRlcyh2b2x1bWVfZ3JvdXBfdCBncm91cElkLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzKSA6CisgICAgICAgICBtQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgbVN0cmVhbVR5cGUoc3RyZWFtKSwgbUdyb3VwSWQoZ3JvdXBJZCkge30KKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUF0dHJpYnV0ZXM7IH0KKworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9CisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0R3JvdXBJZCgpIGNvbnN0IHsgcmV0dXJuIG1Hcm91cElkOyB9CisKK3ByaXZhdGU6CisgICAgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbVN0cmVhbVR5cGU6IGZvciBsZWdhY3kgdm9sdW1lIG1hbmFnZW1lbnQsIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBjb252ZXJ0IGFuIGF0dHJpYnV0ZQorICAgICAqIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuCisgICAgICovCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworCisgICAgLyoqCisgICAgICogQGJyaWVmIG1Hcm91cElkOiBmb3IgZnV0dXJlIHZvbHVtZSBtYW5hZ2VtZW50LCBkZWZpbmUgZ3JvdXBzIHdpdGhpbiBhIHN0cmF0ZWd5IHRoYXQgZm9sbG93cworICAgICAqIHRoZSBzYW1lIGN1cnZlcyBvZiB2b2x1bWUgKGV4dGVuc2lvbiBvZiBzdHJlYW0gdHlwZXMgdG8gbWFuYWdlIHZvbHVtZSkKKyAgICAgKi8KKyAgICB2b2x1bWVfZ3JvdXBfdCBtR3JvdXBJZCA9IFZPTFVNRV9HUk9VUF9OT05FOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQ0NmVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHByb2R1Y3Rfc3RyYXRlZ3lfdCA6IHVpbnQzMl90OworY29uc3QgcHJvZHVjdF9zdHJhdGVneV90IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSA9IHN0YXRpY19jYXN0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4oLTEpOworCit1c2luZyBBdHRyaWJ1dGVzVmVjdG9yID0gc3RkOjp2ZWN0b3I8YXVkaW9fYXR0cmlidXRlc190PjsKK3VzaW5nIFN0cmVhbVR5cGVWZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90PjsKKworY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmxocywgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZyaHMpCit7CisgICAgcmV0dXJuIGxocy51c2FnZSA9PSByaHMudXNhZ2UgJiYgbGhzLmNvbnRlbnRfdHlwZSA9PSByaHMuY29udGVudF90eXBlICYmCisgICAgICAgICAgICBsaHMuZmxhZ3MgPT0gcmhzLmZsYWdzICYmIChzdGQ6OnN0cmNtcChsaHMudGFncywgcmhzLnRhZ3MpID09IDApOworfQorY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmxocywgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZyaHMpCit7CisgICAgcmV0dXJuICEobGhzPT1yaHMpOworfQorCitlbnVtIHZvbHVtZV9ncm91cF90IDogdWludDMyX3Q7CitzdGF0aWMgY29uc3Qgdm9sdW1lX2dyb3VwX3QgVk9MVU1FX0dST1VQX05PTkUgPSBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4oLTEpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAppbmRleCAzMjRiY2I5Li42YmQ0MTM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC05MCwyNyArOTAsMzQgQEAKICAgICAgKi8KICAgICBzdGF0aWMgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOwogCi0KICAgICAvKgotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgZWZmZWN0IHV1aWQuCisgICAgICogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgZWZmZWN0IHV1aWQgb3IgdHlwZS4KKyAgICAgKgorICAgICAqIExvb2t1cCBhbiBlZmZlY3QgYnkgdXVpZCwgb3IgaWYgdGhhdCdzIHVuc3BlY2lmaWVkIChFRkZFQ1RfVVVJRF9OVUxMKSwKKyAgICAgKiBkbyBzbyBieSB0eXBlIGFuZCBwcmVmZXJyZWQgZmxhZ3MgaW5zdGVhZC4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICogICAgICB1dWlkOiAgICAgICBwb2ludGVyIHRvIGVmZmVjdCB1dWlkLgorICAgICAqICAgICAgdHlwZTogICAgICAgcG9pbnRlciB0byBlZmZlY3QgdHlwZSB1dWlkLgorICAgICAqICAgICAgcHJlZmVycmVkVHlwZUZsYWdzOiBpZiBtdWx0aXBsZSBlZmZlY3RzIG9mIHRoZSBnaXZlbiB0eXBlIGV4aXN0LAorICAgICAqICAgICAgICAgICAgICAgICAgb25lIHdpdGggYSBtYXRjaGluZyB0eXBlIGZsYWcgd2lsbCBiZSBjaG9zZW4gb3ZlciBvbmUgd2l0aG91dC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIFVzZSBFRkZFQ1RfRkxBR19UWVBFX01BU0sgdG8gaW5kaWNhdGUgbm8gcHJlZmVyZW5jZS4KICAgICAgKiAgICAgIGRlc2NyaXB0b3I6IGFkZHJlc3Mgd2hlcmUgdGhlIGVmZmVjdCBkZXNjcmlwdG9yIHNob3VsZCBiZSByZXR1cm5lZC4KICAgICAgKgogICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgogICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCiAgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUKLSAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHV1aWQgb3IgZGVzY3JpcHRvciBwb2ludGVycworICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgdHlwZSBvciBkZXNjcmlwdG9yIHBvaW50ZXJzCiAgICAgICogICAgICBOQU1FX05PVF9GT1VORCAgbm8gZWZmZWN0IHdpdGggdGhpcyB1dWlkIGZvdW5kCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCB2YWx1ZQogICAgICAqICAgKmRlc2NyaXB0b3IgdXBkYXRlZCB3aXRoIGVmZmVjdCBkZXNjcmlwdG9yCiAgICAgICovCiAgICAgc3RhdGljIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSAvKmNvbnN0Ki87Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOwogCiAgICAgLyoKICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBkZXNjcmlwdG9ycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmUgcHJvY2Vzc2luZ3MgZW5hYmxlZCBieSBkZWZhdWx0CkBAIC0xNDQsNiArMTUxLDEzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7CiAKICAgICAvKgorICAgICAqIEdldHMgYSBuZXcgc3lzdGVtLXdpZGUgdW5pcXVlIGVmZmVjdCBpZC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpZDogVGhlIGFkZHJlc3MgdG8gcmV0dXJuIHRoZSBnZW5lcmF0ZWQgaWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqIFJldHVybmVkIHZhbHVlCisgICAgICogICAqaWQ6ICBUaGUgbmV3IHVuaXF1ZSBzeXN0ZW0td2lkZSBlZmZlY3QgaWQuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IG5ld0VmZmVjdFVuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvKgorICAgICAqIFN0YXRpYyBtZXRob2RzIGZvciBhZGRpbmcvcmVtb3Zpbmcgc3lzdGVtLXdpZGUgZWZmZWN0cy4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogQWRkcyBhbiBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzb3VyY2UgdHlwZS4KKyAgICAgKgorICAgICAqIElmIHRoZSBlZmZlY3QgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSB3aGVuIGEgc291cmNlIG9mIHRoZSBnaXZlbiB0eXBlCisgICAgICogaXMgY3JlYXRlZCwgdGhlIHN5c3RlbSB3aWxsIGNvbnRpbnVlIHdpdGhvdXQgYWRkaW5nIGl0LgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgIHR5cGVTdHI6ICBUeXBlIHV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdXVpZFN0ciBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyBtYXkgY29ycmVzcG9uZCB0byB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdCwKKyAgICAgKiAgICAgICAgICAgICBvciBjb3VsZCBiZSBzb21lIHZlbmRvci1kZWZpbmVkIHR5cGUuCisgICAgICogICBvcFBhY2thZ2VOYW1lOiBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCisgICAgICogICB1dWlkU3RyOiAgVXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB0eXBlIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIHV1aWQgY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIGFuIGVmZmVjdCB0eXBlLgorICAgICAqICAgICAgICAgICAgIE5vdGUgaWYgYm90aCB1dWlkU3RyIGFuZCB0eXBlU3RyIGFyZSBzcGVjaWZpZWQsIHR5cGVTdHIgaXMgaWdub3JlZC4KKyAgICAgKiAgIHByaW9yaXR5OiBSZXF1ZXN0ZWQgcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sOiB0aGUgcHJpb3JpdHkgbGV2ZWwgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogICAgICAgICAgICAgdmFsdWUgb2YgcHJpb3JpdHkgcGFyYW1ldGVyOiBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgbG93ZXIgcHJpb3JpdGllcywgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZXMgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KKyAgICAgKiAgIHNvdXJjZTogICBUaGUgc291cmNlIHRoaXMgZWZmZWN0IHNob3VsZCBiZSBhIGRlZmF1bHQgZm9yLgorICAgICAqICAgaWQ6ICAgICAgIEFkZHJlc3Mgd2hlcmUgdGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZGVmYXVsdCBlZmZlY3Qgc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHNvdXJjZSwgdHlwZSB1dWlkIG9yIGltcGxlbWVudGF0aW9uIHV1aWQuCisgICAgICogICAgICBOQU1FX05PVF9GT1VORCAgbm8gZWZmZWN0IHdpdGggdGhpcyB1dWlkIG9yIHR5cGUgZm91bmQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCB2YWx1ZQorICAgICAqICAgKmlkOiAgVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgYWRkZWQgZGVmYXVsdCBlZmZlY3QuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciogdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvKgorICAgICAqIEFkZHMgYW4gZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZWZmZWN0IGlzIG5vIGxvbmdlciBhdmFpbGFibGUgd2hlbiBhIHN0cmVhbSBvZiB0aGUgZ2l2ZW4gdHlwZQorICAgICAqIGlzIGNyZWF0ZWQsIHRoZSBzeXN0ZW0gd2lsbCBjb250aW51ZSB3aXRob3V0IGFkZGluZyBpdC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICB0eXBlU3RyOiAgVHlwZSB1dWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHV1aWRTdHIgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgbWF5IGNvcnJlc3BvbmQgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QsCisgICAgICogICAgICAgICAgICAgb3IgY291bGQgYmUgc29tZSB2ZW5kb3ItZGVmaW5lZCB0eXBlLgorICAgICAqICAgb3BQYWNrYWdlTmFtZTogVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgorICAgICAqICAgdXVpZFN0cjogIFV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdHlwZSBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyB1dWlkIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlZmZlY3QgdHlwZS4KKyAgICAgKiAgICAgICAgICAgICBOb3RlIGlmIGJvdGggdXVpZFN0ciBhbmQgdHlwZVN0ciBhcmUgc3BlY2lmaWVkLCB0eXBlU3RyIGlzIGlnbm9yZWQuCisgICAgICogICBwcmlvcml0eTogUmVxdWVzdGVkIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbDogdGhlIHByaW9yaXR5IGxldmVsIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHZhbHVlIG9mIHByaW9yaXR5IHBhcmFtZXRlcjogbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxvd2VyIHByaW9yaXRpZXMsIHBvc2l0aXZlCisgICAgICogICAgICAgICAgICAgdmFsdWVzIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCisgICAgICogICB1c2FnZTogICAgVGhlIHVzYWdlIHRoaXMgZWZmZWN0IHNob3VsZCBiZSBhIGRlZmF1bHQgZm9yLiBVbnJlY29nbml6ZWQgdmFsdWVzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICB0cmVhdGVkIGFzIEFVRElPX1VTQUdFX1VOS05PV04uCisgICAgICogICBpZDogICAgICAgQWRkcmVzcyB3aGVyZSB0aGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBkZWZhdWx0IGVmZmVjdCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgdHlwZSB1dWlkIG9yIGltcGxlbWVudGF0aW9uIHV1aWQuCisgICAgICogICAgICBOQU1FX05PVF9GT1VORCAgbm8gZWZmZWN0IHdpdGggdGhpcyB1dWlkIG9yIHR5cGUgZm91bmQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCB2YWx1ZQorICAgICAqICAgKmlkOiAgVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgYWRkZWQgZGVmYXVsdCBlZmZlY3QuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciogdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLyoKKyAgICAgKiBSZW1vdmVzIGFuIGVmZmVjdCBmcm9tIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc291cmNlIHR5cGUuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgaWQ6IFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGVmZmVjdCB0aGF0IHNob3VsZCBubyBsb25nZXIgYmUgYSBkZWZhdWx0LgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIGlkLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKworICAgIC8qCisgICAgICogUmVtb3ZlcyBhbiBlZmZlY3QgZnJvbSB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIGlkOiBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBlZmZlY3QgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIGEgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKKyAgICAvKgogICAgICAqIEV2ZW50cyB1c2VkIGJ5IGNhbGxiYWNrIGZ1bmN0aW9uIChlZmZlY3RfY2FsbGJhY2tfdCkuCiAgICAgICovCiAgICAgZW51bSBldmVudF90eXBlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKaW5kZXggY2Y3ZDkwZi4uNzgzZWVmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKQEAgLTE4LDE3ICsxOCwxOSBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX01JWEVSX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19NSVhFUl9ICiAKKyNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL29zL0lFeHRlcm5hbFZpYnJhdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQnVmZmVyUHJvdmlkZXJzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Db21wYXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC00MSw2ICs0MywxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK25hbWVzcGFjZSBOQkxvZyB7CitjbGFzcyBXcml0ZXI7Cit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgQXVkaW9NaXhlcgpAQCAtNzMsNiArNzksOSBAQAogICAgICAgICBET1dOTUlYX1RZUEUgICAgPSAwWDQwMDQsCiAgICAgICAgIE1JWEVSX0ZPUk1BVCAgICA9IDB4NDAwNSwgLy8gQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQogICAgICAgICBNSVhFUl9DSEFOTkVMX01BU0sgPSAweDQwMDYsIC8vIENoYW5uZWwgbWFzayBmb3IgbWl4ZXIgb3V0cHV0CisgICAgICAgIC8vIGZvciBoYXB0aWMKKyAgICAgICAgSEFQVElDX0VOQUJMRUQgID0gMHg0MDA3LCAvLyBTZXQgaGFwdGljIGRhdGEgZnJvbSB0aGlzIHRyYWNrIHNob3VsZCBiZSBwbGF5ZWQgb3Igbm90LgorICAgICAgICBIQVBUSUNfSU5URU5TSVRZID0gMHg0MDA4LCAvLyBTZXQgdGhlIGludGVuc2l0eSB0byBwbGF5IGhhcHRpYyBkYXRhLgogICAgICAgICAvLyBmb3IgdGFyZ2V0IFJFU0FNUExFCiAgICAgICAgIFNBTVBMRV9SQVRFICAgICA9IDB4NDEwMCwgLy8gQ29uZmlndXJlIHNhbXBsZSByYXRlIGNvbnZlcnNpb24gb24gdGhpcyB0cmFjayBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAndmFsdWUnIGlzIHRoZSBuZXcgc2FtcGxlIHJhdGUgaW4gSHouCkBAIC05NSw2ICsxMDQsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBwbGF5YmFjayByYXRlLgogICAgIH07CiAKKyAgICB0eXBlZGVmIGVudW0geyAvLyBIYXB0aWMgaW50ZW5zaXR5LCBzaG91bGQga2VlcCBjb25zaXN0ZW50IHdpdGggVmlicmF0b3JTZXJ2aWNlCisgICAgICAgIEhBUFRJQ19TQ0FMRV9NVVRFID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfTVVURSwKKyAgICAgICAgSEFQVElDX1NDQUxFX1ZFUllfTE9XID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfVkVSWV9MT1csCisgICAgICAgIEhBUFRJQ19TQ0FMRV9MT1cgPSBvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlOjpTQ0FMRV9MT1csCisgICAgICAgIEhBUFRJQ19TQ0FMRV9OT05FID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfTk9ORSwKKyAgICAgICAgSEFQVElDX1NDQUxFX0hJR0ggPSBvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlOjpTQ0FMRV9ISUdILAorICAgICAgICBIQVBUSUNfU0NBTEVfVkVSWV9ISUdIID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfVkVSWV9ISUdILAorICAgIH0gaGFwdGljX2ludGVuc2l0eV90OworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgSEFQVElDX1NDQUxFX1ZFUllfTE9XX1JBVElPID0gMi4wZiAvIDMuMGY7CisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBIQVBUSUNfU0NBTEVfTE9XX1JBVElPID0gMy4wZiAvIDQuMGY7CisgICAgc3RhdGljIGNvbnN0IGNvbnN0ZXhwciBmbG9hdCBIQVBUSUNfTUFYX0FNUExJVFVERV9GTE9BVCA9IDEuMGY7CisKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZEhhcHRpY0ludGVuc2l0eShoYXB0aWNfaW50ZW5zaXR5X3QgaGFwdGljSW50ZW5zaXR5KSB7CisgICAgICAgIHN3aXRjaCAoaGFwdGljSW50ZW5zaXR5KSB7CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX01VVEU6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfTE9XOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9MT1c6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX05PTkU6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0hJR0g6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfSElHSDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgQXVkaW9NaXhlcihzaXplX3QgZnJhbWVDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSkKICAgICAgICAgOiBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKQogICAgICAgICAsIG1GcmFtZUNvdW50KGZyYW1lQ291bnQpIHsKQEAgLTEzMiw3ICsxNjcsMTUgQEAKICAgICB2b2lkICAgICAgICBzZXRCdWZmZXJQcm92aWRlcihpbnQgbmFtZSwgQXVkaW9CdWZmZXJQcm92aWRlciogYnVmZmVyUHJvdmlkZXIpOwogCiAgICAgdm9pZCAgICAgICAgcHJvY2VzcygpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbVRyYWNrcykgeworICAgICAgICAgICAgLy8gQ2xlYXIgY29udHJhY3RlZCBidWZmZXIgYmVmb3JlIHByb2Nlc3NpbmcgaWYgY29udHJhY3RlZCBjaGFubmVscyBhcmUgc2F2ZWQKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIGlmICh0LT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscykgeworICAgICAgICAgICAgICAgIHQtPmNsZWFyQ29udHJhY3RlZEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgICh0aGlzLT4qbUhvb2spKCk7CisgICAgICAgIHByb2Nlc3NIYXB0aWNEYXRhKCk7CiAgICAgfQogCiAgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcyhpbnQgbmFtZSkgY29uc3Q7CkBAIC0yMzAsNiArMjczLDggQEAKICAgICAgICAgICAgIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgICAgICBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICB9CiAKICAgICAgICAgYm9vbCAgICAgICAgbmVlZHNSYW1wKCkgeyByZXR1cm4gKHZvbHVtZUluY1swXSB8IHZvbHVtZUluY1sxXSB8IGF1eEluYykgIT0gMDsgfQpAQCAtMjQ0LDYgKzI4OSwxMSBAQAogICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JEb3dubWl4KCk7CiAgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JSZWZvcm1hdCgpOwogICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoc2l6ZV90IGZyYW1lcyk7CisgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKTsKKyAgICAgICAgdm9pZCAgICAgICAgY2xlYXJDb250cmFjdGVkQnVmZmVyKCk7CiAgICAgICAgIGJvb2wgICAgICAgIHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKICAgICAgICAgdm9pZCAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKIApAQCAtMjk3LDE3ICszNDcsMjcgQEAKICAgICAgICAgICogYWxsIHByZS1taXhlciB0cmFjayBidWZmZXIgY29udmVyc2lvbnMgb3V0c2lkZSB0aGUgQXVkaW9NaXhlciBjbGFzcy4KICAgICAgICAgICoKICAgICAgICAgICogMSkgbUlucHV0QnVmZmVyUHJvdmlkZXI6IFRoZSBBdWRpb1RyYWNrIGJ1ZmZlciBwcm92aWRlci4KLSAgICAgICAgICogMikgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KKyAgICAgICAgICogMikgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6IEV4cGFuZHMgb3IgY29udHJhY3RzIHNhbXBsZSBkYXRhIGZyb20gb25lIGludGVybGVhdmVkCisgICAgICAgICAqICAgIGNoYW5uZWwgZm9ybWF0IHRvIGFub3RoZXIuIEV4cGFuZGVkIGNoYW5uZWxzIGFyZSBmaWxsZWQgd2l0aCB6ZXJvcyBhbmQgcHV0IGF0IHRoZSBlbmQKKyAgICAgICAgICogICAgb2YgZWFjaCBhdWRpbyBmcmFtZS4gQ29udHJhY3RlZCBjaGFubmVscyBhcmUgY29waWVkIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICogMykgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOiBOb24tZGVzdHJ1Y3RpdmVseSBjb250cmFjdCBzYW1wbGUgZGF0YS4KKyAgICAgICAgICogICAgVGhpcyBpcyBjdXJyZW50bHkgdXNpbmcgYXQgYXVkaW8taGFwdGljIGNvdXBsZWQgcGxheWJhY2sgdG8gc2VwYXJhdGUgYXVkaW8gYW5kIGhhcHRpYworICAgICAgICAgKiAgICBkYXRhLiBDb250cmFjdGVkIGNoYW5uZWxzIGNvdWxkIGJlIHdyaXR0ZW4gdG8gZ2l2ZW4gYnVmZmVyLgorICAgICAgICAgKiA0KSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBhdWRpbyByZWZvcm1hdCB0bwogICAgICAgICAgKiAgICBtYXRjaCBlaXRoZXIgbU1peGVySW5Gb3JtYXQgb3IgbURvd25taXhSZXF1aXJlc0Zvcm1hdCwgaWYgdGhlIGRvd25taXhlcgogICAgICAgICAgKiAgICByZXF1aXJlcyByZWZvcm1hdC4gRm9yIGV4YW1wbGUsIGl0IG1heSBjb252ZXJ0IGZsb2F0aW5nIHBvaW50IGlucHV0IHRvCiAgICAgICAgICAqICAgIFBDTV8xNl9iaXQgaWYgdGhhdCdzIHJlcXVpcmVkIGJ5IHRoZSBkb3dubWl4ZXIuCi0gICAgICAgICAqIDMpIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBjaGFubmVsIHJlbWl4aW5nIHRvIG1hdGNoCisgICAgICAgICAqIDUpIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBjaGFubmVsIHJlbWl4aW5nIHRvIG1hdGNoCiAgICAgICAgICAqICAgIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcmVxdWlyZWQgYnkgdGhlIG1peGVyIHNpbmsuCi0gICAgICAgICAqIDQpIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyByZWZvcm1hdHRpbmcgZnJvbQorICAgICAgICAgKiA2KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KICAgICAgICAgICogICAgdGhlIGRvd25taXhlciByZXF1aXJlbWVudHMgdG8gdGhlIG1peGVyIGVuZ2luZSBpbnB1dCByZXF1aXJlbWVudHMuCi0gICAgICAgICAqIDUpIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOiBBZGRzIHRpbWVzdHJldGNoaW5nIGZvciBwbGF5YmFjayByYXRlCisgICAgICAgICAqIDcpIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOiBBZGRzIHRpbWVzdHJldGNoaW5nIGZvciBwbGF5YmFjayByYXRlCiAgICAgICAgICAqLwogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgbUlucHV0QnVmZmVyUHJvdmlkZXI7ICAgIC8vIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICAvLyBUT0RPOiBjb21iaW5lIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyIGFuZAorICAgICAgICAvLyBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwpAQCAtMzM2LDYgKzM5Niw1MSBAQAogCiAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlICAgIG1QbGF5YmFja1JhdGU7CiAKKyAgICAgICAgLy8gSGFwdGljCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgIGhhcHRpY19pbnRlbnNpdHlfdCAgIG1IYXB0aWNJbnRlbnNpdHk7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1IYXB0aWNDaGFubmVsTWFzazsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbU1peGVySGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdEluQ2hhbm5lbENvdW50OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0T3V0Q2hhbm5lbENvdW50OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50OworICAgICAgICBib29sICAgICAgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVsczsKKworICAgICAgICBmbG9hdCBnZXRIYXB0aWNTY2FsZUdhbW1hKCkgY29uc3QgeworICAgICAgICAvLyBOZWVkIHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIHRoZSB2YWx1ZSBpbiBWaWJyYXRvclNlcnZpY2UuCisgICAgICAgIHN3aXRjaCAobUhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVzoKKyAgICAgICAgICAgIHJldHVybiAyLjBmOworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9MT1c6CisgICAgICAgICAgICByZXR1cm4gMS41ZjsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfSElHSDoKKyAgICAgICAgICAgIHJldHVybiAwLjVmOworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gMC4yNWY7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMS4wZjsKKyAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZ2V0SGFwdGljTWF4QW1wbGl0dWRlUmF0aW8oKSBjb25zdCB7CisgICAgICAgIC8vIE5lZWQgdG8ga2VlcCBjb25zaXN0ZW50IHdpdGggdGhlIHZhbHVlIGluIFZpYnJhdG9yU2VydmljZS4KKyAgICAgICAgc3dpdGNoIChtSGFwdGljSW50ZW5zaXR5KSB7CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfTE9XOgorICAgICAgICAgICAgcmV0dXJuIEhBUFRJQ19TQ0FMRV9WRVJZX0xPV19SQVRJTzsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgorICAgICAgICAgICAgcmV0dXJuIEhBUFRJQ19TQ0FMRV9MT1dfUkFUSU87CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX05PTkU6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0hJR0g6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfSElHSDoKKyAgICAgICAgICAgIHJldHVybiAxLjBmOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDAuMGY7CisgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgcHJpdmF0ZToKICAgICAgICAgLy8gaG9va3MKICAgICAgICAgdm9pZCB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKQEAgLTM3Miw2ICs0NzcsOCBAQAogICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KICAgICB2b2lkIHByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjaygpOwogCisgICAgdm9pZCBwcm9jZXNzSGFwdGljRGF0YSgpOworCiAgICAgc3RhdGljIHByb2Nlc3NfaG9va190IGdldFByb2Nlc3NIb29rKGludCBwcm9jZXNzVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKaW5kZXggOTY3ZDg5NS4uMjQ4MzdlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaApAQCAtNjQsNiArNjQsOSBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJlc2VudGF0aW9uSWQ7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlQcm9ncmFtSWQ7CiAKKyAgICAvLyAga2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZDogUHJlZmVycmVkIGF1ZGlvIGxhbmd1YWdlCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlBdWRpb0xhbmd1YWdlUHJlZmVycmVkOworCiAgICAgLy8gIGtleVN0cmVhbUNvbm5lY3QgLyBEaXNjb25uZWN0OiB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fZGV2aWNlc190CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlTdHJlYW1Db25uZWN0OwogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtRGlzY29ubmVjdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaAppbmRleCA4ZGEwMDY5Li5iZjhkNjI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeS5oCkBAIC00OSwxMyArNDksMzAgQEAKICNkZWZpbmUgTUlYX1NUQVRFX0lETEUgMAogI2RlZmluZSBNSVhfU1RBVEVfTUlYSU5HIDEKIAorLyoqIENvbnRyb2wgdG8gd2hpY2ggZGV2aWNlIHNvbWUgYXVkaW8gaXMgcmVuZGVyZWQgKi8KICNkZWZpbmUgTUlYX1JPVVRFX0ZMQUdfUkVOREVSIDB4MQorLyoqIExvb3AgYmFjayBzb21lIGF1ZGlvIGluc3RlYWQgb2YgcmVuZGVyaW5nIGl0ICovCiAjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSyAoMHgxIDw8IDEpCisvKiogTG9vcCBiYWNrIHNvbWUgYXVkaW8gd2hpbGUgaXQgaXMgcmVuZGVyZWQgKi8KKyNkZWZpbmUgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLX0FORF9SRU5ERVIgKE1JWF9ST1VURV9GTEFHX1JFTkRFUiB8IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykKICNkZWZpbmUgTUlYX1JPVVRFX0ZMQUdfQUxMIChNSVhfUk9VVEVfRkxBR19SRU5ERVIgfCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spCiAKICNkZWZpbmUgTUFYX01JWEVTX1BFUl9QT0xJQ1kgMTAKICNkZWZpbmUgTUFYX0NSSVRFUklBX1BFUl9NSVggMjAKIAorY2xhc3MgQXVkaW9EZXZpY2VUeXBlQWRkciB7CitwdWJsaWM6CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkcigpIHt9CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSA6CisgICAgICAgIG1UeXBlKHR5cGUpLCBtQWRkcmVzcyhhZGRyZXNzKSB7fQorCisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCisgICAgYXVkaW9fZGV2aWNlc190IG1UeXBlOworICAgIFN0cmluZzggbUFkZHJlc3M7Cit9OworCiBjbGFzcyBBdWRpb01peE1hdGNoQ3JpdGVyaW9uIHsKIHB1YmxpYzoKICAgICBBdWRpb01peE1hdGNoQ3JpdGVyaW9uKCkge30KQEAgLTg3LDcgKzEwNCwxMCBAQAogICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKTsKICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKIAotICAgIFZlY3RvcjxBdWRpb01peE1hdGNoQ3JpdGVyaW9uPiBtQ3JpdGVyaWE7CisgICAgdm9pZCBzZXRFeGNsdWRlVWlkKHVpZF90IHVpZCkgY29uc3Q7CisgICAgdm9pZCBzZXRNYXRjaFVpZCh1aWRfdCB1aWQpIGNvbnN0OworCisgICAgbXV0YWJsZSBWZWN0b3I8QXVkaW9NaXhNYXRjaENyaXRlcmlvbj4gbUNyaXRlcmlhOwogICAgIHVpbnQzMl90ICAgICAgICBtTWl4VHlwZTsKICAgICBhdWRpb19jb25maWdfdCAgbUZvcm1hdDsKICAgICB1aW50MzJfdCAgICAgICAgbVJvdXRlRmxhZ3M7CkBAIC0xMDMsNiArMTIzLDExIEBACiAjZGVmaW5lIFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgMQogI2RlZmluZSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUT1AgIDAKIAorc3RhdGljIGlubGluZSBib29sIGlzX21peF9sb29wYmFja19yZW5kZXIodWludDMyX3Qgcm91dGVGbGFncykgeworICAgIHJldHVybiAocm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDS19BTkRfUkVOREVSKQorICAgICAgICAgICA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUjsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX1BPTElDWV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTk1NDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBBVURJT19QT0xJQ1lfSEVMUEVSX0hfCi0jZGVmaW5lIEFVRElPX1BPTElDWV9IRUxQRVJfSF8KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotc3RhdGljIGlubGluZQotYXVkaW9fc3RyZWFtX3R5cGVfdCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKLXsKLSAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087Ci0gICAgfQotCi0gICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXZvaWQgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7Ci0gICAgbWVtc2V0KGF0dHIsIDAsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLQotICAgIHN3aXRjaCAoc3RyZWFtVHlwZSkgewotICAgIGNhc2UgQVVESU9fU1RSRUFNX0RFRkFVTFQ6Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQzsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9NRURJQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgotICAgICAgICBhdHRyLT5mbGFncyAgfD0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEOwotICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsgLy8gYXR0cmlidXRlcyBpbiBjb21tb24gd2l0aCBTVFJFQU1fU1lTVEVNCi0gICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX0FMQVJNOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT047Ci0gICAgICAgIGF0dHItPmZsYWdzIHw9IEFVRElPX0ZMQUdfU0NPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoImludmFsaWQgc3RyZWFtIHR5cGUgJWQgd2hlbiBjb252ZXJ0aW5nIHRvIGF0dHJpYnV0ZXMiLCBzdHJlYW1UeXBlKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQxMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5IDogcHVibGljIFBhcmNlbGFibGUKK3sKK3B1YmxpYzoKKyAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneSgpIHt9CisgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvQXR0cmlidXRlcz4gJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IGlkKSA6CisgICAgICAgIG1OYW1lKG5hbWUpLCBtQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBtSWQoaWQpIHt9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9BdHRyaWJ1dGVzPiBnZXRBdWRpb0F0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXVkaW9BdHRyaWJ1dGVzOyB9CisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgYXR0cmlidXRlc01hdGNoZXM6IGNoZWNrcyBpZiBjbGllbnQgYXR0cmlidXRlcyBtYXRjaGVzIHdpdGggYSByZWZlcmVuY2UgYXR0cmlidXRlcworICAgICAqICJtYXRjaGluZyIgbWVhbnMgdGhlIHVzYWdlIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBhIGRlZmluZWQgdXNhZ2UsIEFORAorICAgICAqIGNvbnRlbnQgdHlwZSBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgYSBkZWZpbmVkIGNvbnRlbnQgdHlwZSBBTkQKKyAgICAgKiBmbGFncyBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgZGVmaW5lZCBmbGFncyBBTkQKKyAgICAgKiB0YWdzIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBkZWZpbmVkIHRhZ3MuCisgICAgICogUmVmZXJlbmNlIGF0dHJpYnV0ZXMgImRlZmF1bHQiIHNoYWxsIG5vdCBiZSBjb25zaWRlcmVkIGFzIGEgInRydWUiIGNhc2UuIFRoaXMgY29udmVudGlvbgorICAgICAqIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgc3RyYXRlZ3kuCisgICAgICogQHBhcmFtIHJlZkF0dHJpYnV0ZXMgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBjbGllbnRBdHRyaXR1YmVzIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbWF0Y2hpbmcsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHN0YXRpYyBib29sIGF0dHJpYnV0ZXNNYXRjaGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCByZWZBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBjbGllbnRBdHRyaXR1YmVzKTsKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbU5hbWU7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9BdHRyaWJ1dGVzPiBtQXVkaW9BdHRyaWJ1dGVzOworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBtSWQ7Cit9OworCit1c2luZyBBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciA9IHN0ZDo6dmVjdG9yPEF1ZGlvUHJvZHVjdFN0cmF0ZWd5PjsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKaW5kZXggODA2MjgwYS4uYjRkZGI2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaApAQCAtMTg5LDcgKzE4OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gQVVESU9fVUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX0RFRkFVTFQpOwogCiAgICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9SZWNvcmQgYW5kIHVucmVnaXN0ZXJzIGl0IGZyb20gQXVkaW9GbGluZ2VyLgogICAgICAqIEFsc28gZGVzdHJveXMgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIEF1ZGlvUmVjb3JkLgpAQCAtMjI4LDcgKzIzMSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCA9IEFVRElPX1VJRF9JTlZBTElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiA9IE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IE1JQ19GSUVMRF9ESU1FTlNJT05fREVGQVVMVCk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1JlY29yZC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQgZm9yIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24KICAgICAgKiBiZWZvcmUgdXNpbmcgYW55IEF1ZGlvUmVjb3JkIEFQSSAoZXhjZXB0IGZvciBzZXQoKSksIGJlY2F1c2UgdXNpbmcKQEAgLTUzNCw5ICs1NDAsMjMgQEAKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAotICAgIC8qCi0gICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHJlY29yZC4KKyAgICAvKiBTZXQgdGhlIE1pY3JvcGhvbmUgZGlyZWN0aW9uIChmb3IgcHJvY2Vzc2luZyBwdXJwb3NlcykuCiAgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKworICAgIC8qIFNldCB0aGUgTWljcm9waG9uZSB6b29tIGZhY3RvciAoZm9yIHByb2Nlc3NpbmcgcHVycG9zZXMpLgorICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCisgICAgIC8qIEdldCB0aGUgdW5pcXVlIHBvcnQgSUQgYXNzaWduZWQgdG8gdGhpcyBBdWRpb1JlY29yZCBpbnN0YW5jZSBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICAgICogVGhlIElEIGlzIHVuaXF1ZSBhY3Jvc3MgYWxsIGF1ZGlvc2VydmVyIGNsaWVudHMgYW5kIGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIGN5Y2xlCisgICAgICAqIG9mIGEgZ2l2ZW4gQXVkaW9SZWNvcmQgaW5zdGFuY2UgaWYgdGhlIGNvbm5lY3Rpb24gdG8gYXVkaW9zZXJ2ZXIgaXMgcmVzdG9yZWQuCisgICAgICAqLworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRQb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9OworCisgICAgIC8qCisgICAgICAqIER1bXBzIHRoZSBzdGF0ZSBvZiBhbiBhdWRpbyByZWNvcmQuCisgICAgICAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCiBwcml2YXRlOgpAQCAtNTQ4LDcgKzU2OCw3IEBACiAgICAgY2xhc3MgQXVkaW9SZWNvcmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkCiAgICAgewogICAgIHB1YmxpYzoKLSAgICAgICAgQXVkaW9SZWNvcmRUaHJlYWQoQXVkaW9SZWNvcmQmIHJlY2VpdmVyLCBib29sIGJDYW5DYWxsSmF2YSA9IGZhbHNlKTsKKyAgICAgICAgQXVkaW9SZWNvcmRUaHJlYWQoQXVkaW9SZWNvcmQmIHJlY2VpdmVyKTsKIAogICAgICAgICAvLyBEbyBub3QgY2FsbCBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpIHdpdGhvdXQgZmlyc3QgY2FsbGluZyByZXF1ZXN0RXhpdCgpLgogICAgICAgICAvLyBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpIGlzIG5vdCB2aXJ0dWFsLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgZG8gZW5vdWdoLgpAQCAtNjU0LDYgKzY3NCw3IEBACiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAgICAgbU9yaWdGbGFnczsgICAgICAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yIG9yIHNldCgpLCBjb25zdAogCiAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOyAgICAgICAgICAgICAgICAgICAgLy8gSWQgZnJvbSBBdWRpbyBQb2xpY3kgTWFuYWdlcgogICAgIHRyYW5zZmVyX3R5cGUgICAgICAgICAgIG1UcmFuc2ZlcjsKIAogICAgIC8vIE5leHQgNSBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQsIGJ1dCBhbHdheXMgIT0gMApAQCAtNjYyLDcgKzY4Myw3IEBACiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAvLyByZS1sb2FkIGFmdGVyIG1Mb2NrLnVubG9jaygpCiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUJ1ZmZlck1lbW9yeTsKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQ7ICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dCgpCisgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7IC8vIGZyb20gQXVkaW9TeXN0ZW06OmdldElucHV0Zm9yQXR0cigpCiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNQcmlvcml0eTsgIC8vIGJlZm9yZSBzdGFydCgpCiAgICAgU2NoZWRQb2xpY3kgICAgICAgICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwOwpAQCAtNzAxLDEwICs3MjIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Rpdml0eSBhbmQgY29ubmVjdGVkIGRldmljZXMKICAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbURldmljZUNhbGxiYWNrOwogCisgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBtU2VsZWN0ZWRNaWNEaXJlY3Rpb247CisgICAgZmxvYXQgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb247CisKIHByaXZhdGU6CiAgICAgY2xhc3MgTWVkaWFNZXRyaWNzIHsKICAgICAgIHB1YmxpYzoKLSAgICAgICAgTWVkaWFNZXRyaWNzKCkgOiBtQW5hbHl0aWNzSXRlbShuZXcgTWVkaWFBbmFseXRpY3NJdGVtKCJhdWRpb3JlY29yZCIpKSwKKyAgICAgICAgTWVkaWFNZXRyaWNzKCkgOiBtQW5hbHl0aWNzSXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgiYXVkaW9yZWNvcmQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbUNyZWF0ZWROcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ZWROcygwKSwgbUR1cmF0aW9uTnMoMCksIG1Db3VudCgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEVycm9yKE5PX0VSUk9SKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggNGMwZjc5Ni4uZTY0ZjI4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+CkBAIC0zNSw5ICszNywxNCBAQAogCiB0eXBlZGVmIHZvaWQgKCphdWRpb19lcnJvcl9jYWxsYmFjaykoc3RhdHVzX3QgZXJyKTsKIHR5cGVkZWYgdm9pZCAoKmR5bmFtaWNfcG9saWN5X2NhbGxiYWNrKShpbnQgZXZlbnQsIFN0cmluZzggcmVnSWQsIGludCB2YWwpOwotdHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7Cit0eXBlZGVmIHZvaWQgKCpyZWNvcmRfY29uZmlnX2NhbGxiYWNrKShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogCiBjbGFzcyBJQXVkaW9GbGluZ2VyOwogY2xhc3MgSUF1ZGlvUG9saWN5U2VydmljZTsKQEAgLTIwNCwxMiArMjExLDE0IEBACiAgICAgLy8gSUF1ZGlvUG9saWN5U2VydmljZSBpbnRlcmZhY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKICAgICAvLwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLCBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKICAgICBzdGF0aWMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOwpAQCAtMjIzLDE2ICsyMzIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIC8vIENsaWVudCBtdXN0IHN1Y2Nlc3NmdWxseSBoYW5kIG9mZiB0aGUgaGFuZGxlIHJlZmVyZW5jZSB0byBBdWRpb0ZsaW5nZXIgdmlhIGNyZWF0ZVJlY29yZCgpLAogICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlSW5wdXQoKS4KQEAgLTI0Nyw4ICsyNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0yNjEsNiArMjY0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKKwogICAgIHN0YXRpYyB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIApAQCAtMzI3LDE5ICszNDEsMjkgQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbik7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOworCiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgc3RhdGljIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKTsKKwogICAgIHN0YXRpYyBmbG9hdCAgICBnZXRTdHJlYW1Wb2x1bWVEQigKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCiAgICAgc3RhdGljIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKTsKKwogICAgIC8vIG51bVN1cnJvdW5kRm9ybWF0cyBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZm9ybWF0cyBhbmQgYm9vbCB2YWx1ZSBhbGxvd2VkIGluIHRoZSBhcnJheS4KICAgICAvLyBXaGVuIG51bVN1cnJvdW5kRm9ybWF0cyBpcyAwLCBzdXJyb3VuZEZvcm1hdHMgYW5kIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgd2lsbCBub3QgYmUKICAgICAvLyBwb3B1bGF0ZWQuIFRoZSBhY3R1YWwgbnVtYmVyIG9mIHN1cnJvdW5kIGZvcm1hdHMgc2hvdWxkIGJlIHJldHVybmVkIGF0IG51bVN1cnJvdW5kRm9ybWF0cy4KQEAgLTM0OSw4ICszNzMsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCk7CisgICAgc3RhdGljIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKworICAgIHN0YXRpYyBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KTsKKworICAgIHN0YXRpYyBhdWRpb19hdHRyaWJ1dGVzX3Qgc3RyZWFtVHlwZVRvQXR0cmlidXRlcyhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgc3RhdGljIGF1ZGlvX3N0cmVhbV90eXBlX3QgYXR0cmlidXRlc1RvU3RyZWFtVHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpOworCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpOworCisgICAgc3RhdGljIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKTsKKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorICAgIGNsYXNzIEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCisgICAgeworICAgIHB1YmxpYzoKKworICAgICAgICBBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soKSB7fQorICAgICAgICB2aXJ0dWFsIH5BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soKSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZURpZWQoKSA9IDA7CisKKyAgICB9OworCisgICAgc3RhdGljIHN0YXR1c190IGFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisKICAgICBjbGFzcyBBdWRpb1BvcnRDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCiAgICAgewogICAgIHB1YmxpYzoKQEAgLTM3OCw2ICs0MzQsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgPSAwOwogICAgIH07CiAKKyAgICBjbGFzcyBBdWRpb0RldmljZUNhbGxiYWNrUHJveHkgOiBwdWJsaWMgUmVmQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgICBBdWRpb0RldmljZUNhbGxiYWNrUHJveHkod3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2spCisgICAgICAgICAgICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKSB7fQorICAgICAgICAgIH5BdWRpb0RldmljZUNhbGxiYWNrUHJveHkoKSBvdmVycmlkZSB7fQorCisgICAgICAgICAgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2soKSBjb25zdCB7IHJldHVybiBtQ2FsbGJhY2sucHJvbW90ZSgpOyB9OworCisgICAgICAgICAgYm9vbCBub3RpZmllZE9uY2UoKSBjb25zdCB7IHJldHVybiBtTm90aWZpZWRPbmNlOyB9CisgICAgICAgICAgdm9pZCBzZXROb3RpZmllZE9uY2UoKSB7IG1Ob3RpZmllZE9uY2UgPSB0cnVlOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBtTm90aWZpZWRPbmNlIGl0IGZvcmNlcyB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2Ugd2hlbgorICAgICAgICAgKiByZWdpc3RlcmVkIHdpdGggYSBWQUxJRCBBdWRpb0RldmljZSwgYW5kIGFsbG93cyBub3QgdG8gZmxvb2Qgb3RoZXIgbGlzdGVuZXJzCisgICAgICAgICAqIG9uIHRoaXMgaW9oYW5kbGUgdGhhdCBhbHJlYWR5IGtub3cgdGhlIHZhbGlkIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgICBib29sIG1Ob3RpZmllZE9uY2UgPSBmYWxzZTsKKyAgICAgICAgIHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICB9OworCiAgICAgc3RhdGljIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwogICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKQEAgLTQyMSw4ICs0OTksMjcgQEAKICAgICBwcml2YXRlOgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gPiAgIG1Jb0Rlc2NyaXB0b3JzOwotICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzOworCisgICAgICAgIGNsYXNzIEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzIDogcHVibGljIFZlY3RvcjxzcDxBdWRpb0RldmljZUNhbGxiYWNrUHJveHk+PgorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQGJyaWVmIG5vdGlmaWVkT25jZSBlbnN1cmVzIHRoYXQgaWYgYSBjbGllbnQgYWRkcyBhIGNhbGxiYWNrLCBpdCBtdXN0IGF0IGxlYXN0IGJlCisgICAgICAgICAgICAgKiBjYWxsZWQgb25jZSB3aXRoIHRoZSBkZXZpY2Ugb24gd2hpY2ggaXQgd2lsbCBiZSByb3V0ZWQgdG8uCisgICAgICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxyZWFkeSBub3RpZmllZCBvciBub2JvZHkgd2FpdHMgZm9yIGEgY2FsbGJhY2ssIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYm9vbCBub3RpZmllZE9uY2UoKSBjb25zdCB7IHJldHVybiAoc2l6ZSgpID09IDApIHx8IG1Ob3RpZmllZE9uY2U7IH0KKyAgICAgICAgICAgIHZvaWQgc2V0Tm90aWZpZWRPbmNlKCkgeyBtTm90aWZpZWRPbmNlID0gdHJ1ZTsgfQorICAgICAgICAgICAgdm9pZCByZXNldE5vdGlmaWVkT25jZSgpIHsgbU5vdGlmaWVkT25jZSA9IGZhbHNlOyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEBicmllZiBtTm90aWZpZWRPbmNlIGl0IGZvcmNlcyBlYWNoIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHdoZW4KKyAgICAgICAgICAgICAqIHJlZ2lzdGVyZWQgd2l0aCBhIFZBTElEIEF1ZGlvRGV2aWNlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJvb2wgbU5vdGlmaWVkT25jZSA9IGZhbHNlOworICAgICAgICB9OworICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzPgorICAgICAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllczsKICAgICAgICAgLy8gY2FjaGVkIHZhbHVlcyBmb3IgcmVjb3JkaW5nIGdldElucHV0QnVmZmVyU2l6ZSgpIHF1ZXJpZXMKICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluQnVmZlNpemU7ICAgIC8vIHplcm8gaW5kaWNhdGVzIGNhY2hlIGlzIGludmFsaWQKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluU2FtcGxpbmdSYXRlOwpAQCAtNDQyLDIxICs1MzksMzEgQEAKICAgICAgICAgaW50IHJlbW92ZUF1ZGlvUG9ydENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvUG9ydENhbGxiYWNrPiYgY2FsbGJhY2spOwogICAgICAgICBib29sIGlzQXVkaW9Qb3J0Q2JFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gKG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpICE9IDApOyB9CiAKKyAgICAgICAgaW50IGFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgICAgIGludCByZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgICAgICBib29sIGlzQXVkaW9Wb2x1bWVHcm91cENiRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIChtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKSAhPSAwKTsgfQorCiAgICAgICAgIC8vIERlYXRoUmVjaXBpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwogCiAgICAgICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAogICAgIHByaXZhdGU6CiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgICAgICBWZWN0b3IgPHNwIDxBdWRpb1BvcnRDYWxsYmFjaz4gPiAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzOworICAgICAgICBWZWN0b3IgPHNwIDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+ID4gbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjazsKICAgICB9OwogCiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKaW5kZXggNDk4ZGU4ZS4uZTU5MjVkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaApAQCAtMTM1LDggKzEzNSwyMyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgZG91YmxlIGdldE91dHB1dFNlcnZlckxhdGVuY3lNcyh1aW50MzJfdCBzYW1wbGVSYXRlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRMYXRlbmN5TXMoc2FtcGxlUmF0ZSwgTE9DQVRJT05fU0VSVkVSLCBMT0NBVElPTl9LRVJORUwpOworICAgIH0KKworICAgIGRvdWJsZSBnZXRMYXRlbmN5TXModWludDMyX3Qgc2FtcGxlUmF0ZSwgTG9jYXRpb24gbG9jYXRpb24xLCBMb2NhdGlvbiBsb2NhdGlvbjIpIGNvbnN0IHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPiAwICYmIG1UaW1lTnNbbG9jYXRpb24xXSA+IDAgJiYgbVRpbWVOc1tsb2NhdGlvbjJdID4gMCkgeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZURpZmZlcmVuY2UgPQorICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb25bbG9jYXRpb24xXSAtIG1Qb3NpdGlvbltsb2NhdGlvbjJdOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lRGlmZmVyZW5jZU5zID0KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVOc1tsb2NhdGlvbjFdIC0gbVRpbWVOc1tsb2NhdGlvbjJdOworICAgICAgICAgICAgcmV0dXJuICgoZG91YmxlKWZyYW1lRGlmZmVyZW5jZSAqIDFlOSAvIHNhbXBsZVJhdGUgLSB0aW1lRGlmZmVyZW5jZU5zKSAqIDFlLTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDAuOworICAgIH0KKwogICAgIC8vIGNvbnZlcnQgZmllbGRzIHRvIGEgcHJpbnRhYmxlIHN0cmluZwotICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewogICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKIAogICAgICAgICBzcyA8PCAiQk9PVFRJTUUgb2Zmc2V0ICIgPDwgbVRpbWViYXNlT2Zmc2V0W1RJTUVCQVNFX0JPT1RUSU1FXSA8PCAiXG4iOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCA1OWM2ZjRjLi4zOTI2ZWFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtNzQsNiArNzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1hcHBpbmcgZnJvbSBmcmFtZSBwb3NpdGlvbiB0byBwcmVzZW50YXRpb24gdGltZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBBdWRpb1RpbWVzdGFtcCBmb3IgdGhlIGluZm9ybWF0aW9uIGluY2x1ZGVkIHdpdGggZXZlbnQuCiAjZW5kaWYKKyAgICAgICAgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSA9IDksLy8gTm90aWZpY2F0aW9uIHRoYXQgbW9yZSBkYXRhIGNhbiBiZSBnaXZlbiBieSB3cml0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGV2ZW50IG9ubHkgb2NjdXJzIGZvciBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLLgogICAgIH07CiAKICAgICAvKiBDbGllbnQgc2hvdWxkIGRlY2xhcmUgYSBCdWZmZXIgYW5kIHBhc3MgdGhlIGFkZHJlc3MgdG8gb2J0YWluQnVmZmVyKCkKQEAgLTE0NSw2ICsxNDcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKKyAgICAvKiBDaGVjayBpZiBkaXJlY3QgcGxheWJhY2sgaXMgcG9zc2libGUgZm9yIHRoZSBnaXZlbiBhdWRpbyBjb25maWd1cmF0aW9uIGFuZCBhdHRyaWJ1dGVzLgorICAgICAqIFJldHVybiB0cnVlIGlmIG91dHB1dCBpcyBwb3NzaWJsZSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIHN0YXRpYyBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpOworCiAgICAgLyogSG93IGRhdGEgaXMgdHJhbnNmZXJyZWQgdG8gQXVkaW9UcmFjawogICAgICAqLwogICAgIGVudW0gdHJhbnNmZXJfdHlwZSB7CkBAIC0xNTMsNiArMTYxLDcgQEAKICAgICAgICAgVFJBTlNGRVJfT0JUQUlOLCAgICAvLyBjYWxsIG9idGFpbkJ1ZmZlcigpIGFuZCByZWxlYXNlQnVmZmVyKCkKICAgICAgICAgVFJBTlNGRVJfU1lOQywgICAgICAvLyBzeW5jaHJvbm91cyB3cml0ZSgpCiAgICAgICAgIFRSQU5TRkVSX1NIQVJFRCwgICAgLy8gc2hhcmVkIG1lbW9yeQorICAgICAgICBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLLCAvLyBzeW5jaHJvbm91cyB3cml0ZSgpLCBub3RpZiBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBCiAgICAgfTsKIAogICAgIC8qIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBBdWRpb1RyYWNrLiBObyBjb25uZWN0aW9uIHdpdGgKQEAgLTI5NSw2ICszMDQsOCBAQAogICAgICAqIFBhcmFtZXRlcnMgbm90IGxpc3RlZCBpbiB0aGUgQXVkaW9UcmFjayBjb25zdHJ1Y3RvcnMgYWJvdmU6CiAgICAgICoKICAgICAgKiB0aHJlYWRDYW5DYWxsSmF2YTogIFdoZXRoZXIgY2FsbGJhY2tzIGFyZSBtYWRlIGZyb20gYW4gYXR0YWNoZWQgdGhyZWFkIGFuZCB0aHVzIGNhbiBjYWxsIEpOSS4KKyAgICAgKiAgICAgIE9ubHkgc2V0IHRvIHRydWUgd2hlbiBBdWRpb1RyYWNrIG9iamVjdCBpcyB1c2VkIGZvciBhIGphdmEgYW5kcm9pZC5tZWRpYS5BdWRpb1RyYWNrCisgICAgICogICAgICBpbiBpdHMgSk5JIGNvZGUuCiAgICAgICoKICAgICAgKiBJbnRlcm5hbCBzdGF0ZSBwb3N0IGNvbmRpdGlvbjoKICAgICAgKiAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgaW1wbGllcyB0aGlzIEF1ZGlvVHJhY2sgaGFzIHZhbGlkIGF0dHJpYnV0ZXMKQEAgLTkwNyw3ICs5MTgsMTQgQEAKICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUgfHwgbVN0YXRlID09IFNUQVRFX1NUT1BQSU5HOwogICAgICAgICAgICAgfQotcHJvdGVjdGVkOgorCisgICAgLyogR2V0IHRoZSB1bmlxdWUgcG9ydCBJRCBhc3NpZ25lZCB0byB0aGlzIEF1ZGlvVHJhY2sgaW5zdGFuY2UgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIuCisgICAgICogVGhlIElEIGlzIHVuaXF1ZSBhY3Jvc3MgYWxsIGF1ZGlvc2VydmVyIGNsaWVudHMgYW5kIGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIGN5Y2xlCisgICAgICogb2YgYSBnaXZlbiBBdWRpb1RyYWNrIGluc3RhbmNlIGlmIHRoZSBjb25uZWN0aW9uIHRvIGF1ZGlvc2VydmVyIGlzIHJlc3RvcmVkLgorICAgICAqLworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRQb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9OworCisgcHJvdGVjdGVkOgogICAgIC8qIGNvcHlpbmcgYXVkaW8gdHJhY2tzIGlzIG5vdCBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKGNvbnN0IEF1ZGlvVHJhY2smIG90aGVyKTsKICAgICAgICAgICAgIEF1ZGlvVHJhY2smIG9wZXJhdG9yID0gKGNvbnN0IEF1ZGlvVHJhY2smIG90aGVyKTsKQEAgLTkxNiw3ICs5MzQsNyBAQAogICAgIGNsYXNzIEF1ZGlvVHJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkCiAgICAgewogICAgIHB1YmxpYzoKLSAgICAgICAgQXVkaW9UcmFja1RocmVhZChBdWRpb1RyYWNrJiByZWNlaXZlciwgYm9vbCBiQ2FuQ2FsbEphdmEgPSBmYWxzZSk7CisgICAgICAgIEF1ZGlvVHJhY2tUaHJlYWQoQXVkaW9UcmFjayYgcmVjZWl2ZXIpOwogCiAgICAgICAgIC8vIERvIG5vdCBjYWxsIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgd2l0aG91dCBmaXJzdCBjYWxsaW5nIHJlcXVlc3RFeGl0KCkuCiAgICAgICAgIC8vIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgaXMgbm90IHZpcnR1YWwsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gZG9lc24ndCBkbyBlbm91Z2guCkBAIC0xMDAzLDcgKzEwMjEsNyBAQAogICAgIHNwPElBdWRpb1RyYWNrPiAgICAgICAgIG1BdWRpb1RyYWNrOwogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogICAgIG1DYmxrOyAgICAgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0OyAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBieSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigpCisgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbU91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOyAvLyBmcm9tIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCkKIAogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+ICAgIG1BdWRpb1RyYWNrVGhyZWFkOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRDYW5DYWxsSmF2YTsKQEAgLTEwNTgsNiArMTA3NiwxOSBAQAogICAgICAgICBTVEFURV9TVE9QUElORywKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGU7CiAKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0YXRlVG9TdHJpbmcoU3RhdGUgc3RhdGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfQUNUSVZFOiAgICAgICAgICByZXR1cm4gIlNUQVRFX0FDVElWRSI7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDogICAgICAgICByZXR1cm4gIlNUQVRFX1NUT1BQRUQiOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDogICAgICAgICAgcmV0dXJuICJTVEFURV9QQVVTRUQiOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRF9TVE9QUElORzogcmV0dXJuICJTVEFURV9QQVVTRURfU1RPUFBJTkciOworICAgICAgICBjYXNlIFNUQVRFX0ZMVVNIRUQ6ICAgICAgICAgcmV0dXJuICJTVEFURV9GTFVTSEVEIjsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUElORzogICAgICAgIHJldHVybiAiU1RBVEVfU1RPUFBJTkciOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIGZvciBjbGllbnQgY2FsbGJhY2sgaGFuZGxlcgogICAgIGNhbGxiYWNrX3QgICAgICAgICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGhhbmRsZXIgZm9yIGV2ZW50cywgb3IgTlVMTAogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YTsKQEAgLTExNDgsNiArMTE3OSw3IEBACiAKICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOyAgICAgICAgICAgICAgICAgICAgLy8gSWQgZnJvbSBBdWRpbyBQb2xpY3kgTWFuYWdlcgogCiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKQEAgLTExOTUsNyArMTIyNyw3IEBACiBwcml2YXRlOgogICAgIGNsYXNzIE1lZGlhTWV0cmljcyB7CiAgICAgICBwdWJsaWM6Ci0gICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0obmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgiYXVkaW90cmFjayIpKSB7CisgICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoImF1ZGlvdHJhY2siKSkgewogICAgICAgICB9CiAgICAgICAgIH5NZWRpYU1ldHJpY3MoKSB7CiAgICAgICAgICAgICAvLyBtQW5hbHl0aWNzSXRlbSBhbGxvYyBmYWlsdXJlIHdpbGwgYmUgZmxhZ2dlZCBpbiB0aGUgY29uc3RydWN0b3IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2ZWEwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb1ZvbHVtZUdyb3VwIDogcHVibGljIFBhcmNlbGFibGUKK3sKK3B1YmxpYzoKKyAgICBBdWRpb1ZvbHVtZUdyb3VwKCkge30KKyAgICBBdWRpb1ZvbHVtZUdyb3VwKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVzVmVjdG9yICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcykgOgorICAgICAgICBtTmFtZShuYW1lKSwgbUdyb3VwSWQoZ3JvdXApLCBtQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBtU3RyZWFtcyhzdHJlYW1zKSB7fQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHZvbHVtZV9ncm91cF90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUdyb3VwSWQ7IH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb0F0dHJpYnV0ZXM7IH0KKyAgICBTdHJlYW1UeXBlVmVjdG9yIGdldFN0cmVhbVR5cGVzKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbXM7IH0KKworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKyAgICB2b2x1bWVfZ3JvdXBfdCBtR3JvdXBJZCA9IFZPTFVNRV9HUk9VUF9OT05FOworICAgIEF0dHJpYnV0ZXNWZWN0b3IgbUF1ZGlvQXR0cmlidXRlczsKKyAgICBTdHJlYW1UeXBlVmVjdG9yIG1TdHJlYW1zOworfTsKKwordXNpbmcgQXVkaW9Wb2x1bWVHcm91cFZlY3RvciA9IHN0ZDo6dmVjdG9yPEF1ZGlvVm9sdW1lR3JvdXA+OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCmluZGV4IGU2YmY3MmYuLmVmMGVkMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCkBAIC0xNDYsNiArMTQ2LDcgQEAKICAgICAgICAgICAgIGFmU2FtcGxlUmF0ZSA9IHBhcmNlbC0+cmVhZEludDY0KCk7CiAgICAgICAgICAgICBhZkxhdGVuY3lNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJm91dHB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE2Myw2ICsxNjQsNyBAQAogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGFmU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoYWZMYXRlbmN5TXMpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE3OSw2ICsxODEsNyBAQAogICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CiAgICAgICAgIHVpbnQzMl90IGFmTGF0ZW5jeU1zOwogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRJZDsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CiAgICAgfTsKIAogICAgIC8qIENyZWF0ZVJlY29yZElucHV0IGNvbnRhaW5zIGFsbCBpbnB1dCBhcmd1bWVudHMgc2VudCBieSBBdWRpb1JlY29yZCB0byBBdWRpb0ZsaW5nZXIKQEAgLTI3MSw2ICsyNzQsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTI5Nyw2ICszMDEsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtMzEzLDYgKzMxOCw3IEBACiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0SWQ7CiAgICAgICAgIHNwPElNZW1vcnk+IGNibGs7CiAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcnM7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOwogICAgIH07CiAKICAgICAvLyBpbnZhcmlhbnQgb24gZXhpdCBmb3IgYWxsIEFQSXMgdGhhdCByZXR1cm4gYW4gc3A8PjoKQEAgLTM1Myw2ICszNTksOSBAQAogICAgIHZpcnR1YWwgICAgIGZsb2F0ICAgICAgIG1hc3RlclZvbHVtZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlKCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSA9IDA7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkgY29uc3QgPSAwOworCiAgICAgLyogc2V0L2dldCBzdHJlYW0gdHlwZSBzdGF0ZS4gVGhpcyB3aWxsIHByb2JhYmx5IGJlIHVzZWQgYnkKICAgICAgKiB0aGUgcHJlZmVyZW5jZSBwYW5lbCwgbW9zdGx5LgogICAgICAqLwpAQCAtNDI4LDcgKzQzNyw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggYzM4NzZhZi4uMzU1NDBmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIwLDE1ICsyMCwxNCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgotCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KLQogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDUsMTIgKzQ0LDE0IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpID0gMDsKQEAgLTY1LDE2ICs2NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtODUsOCArODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtOTgsNiArOTMsMTcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkgPSAwOworCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKSA9IDA7CkBAIC0xMTUsMTAgKzEyMSwyOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkgPSAwOwogICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzdHJlYW0gdHlwZSwgc2FtcGxlIHJhdGUsCiAgICAgLy8gYml0IHJhdGUsIGR1cmF0aW9uLCB2aWRlbyBhbmQgc3RyZWFtaW5nIG9yIG9mZmxvYWQgcHJvcGVydHkgaXMgZW5hYmxlZAogICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pID0gMDsKIAorICAgIC8vIENoZWNrIGlmIGRpcmVjdCBwbGF5YmFjayBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzYW1wbGUgcmF0ZSwgY2hhbm5lbCBtYXNrIGFuZCBmbGFncy4KKyAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpID0gMDsKKwogICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTE0Nyw2ICsxNzEsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpID0gMDsKQEAgLTE1NywxMCArMTgzLDE1IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCisgICAgICAgICAgICA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKSA9IDA7CkBAIC0xNzEsNyArMjAyLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgPSAwOworCisgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKaW5kZXggZTBkMjQ5NS4uNzkwMDhjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKQEAgLTE3LDEwICsxNywxNCBAQAogI2lmbmRlZiBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAogI2RlZmluZSBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAogCisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMwLDYgKzM0LDggQEAKICAgICB1aWRfdCB1aWQ7CiAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CiAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydF9pZDsKKyAgICBib29sIHNpbGVuY2VkOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHJlY29yZF9jbGllbnRfaW5mb190OwpAQCAtNDEsNiArNDcsOCBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KTsKIAorICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIHZvbHVtZSBncm91cAorICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpID0gMDsKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCiAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpID0gMDsKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyBwYXRjaCBjb25maWd1cmF0aW9uLgpAQCAtNTEsOCArNTksMTEgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCmluZGV4IDk0YWZlM2MuLjA2ZTc4NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKQEAgLTcwLDYgKzcwLDkgQEAKICAgICAvKiBTZW5kIHBhcmFtZXRlcnMgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpID0gMDsKIAorICAgIC8qIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKSAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgPSAwOworCiAgICAgLyogUmV0dXJuIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4gIHRpbWVzdGFtcCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLiAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApID0gMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0YjQzNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJmbXEiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwYmY4Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKLSAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKLSAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKLSAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCi0gICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgotICAgIFN0cmluZzggdmFsdWU7Ci0gICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCi0gICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKLSAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOwotICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKLSAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKLSAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKLSAgICB9Ci0gICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Ci19Ci0KLUNvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCi0gICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7Ci0gICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTZmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIENvbnZlcnNpb25IZWxwZXJIaWRsIHsKLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKLSAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgewotICAgICAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCi0gICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQgcmV0dmFsKSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTlkNzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9JbnB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb091dHB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BhdGNoSGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Ci19Ci0KLURldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewotICAgIGlmIChtRGV2aWNlICE9IDApIHsKLSAgICAgICAgbURldmljZS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKLSAgICAvLyBPYnNvbGV0ZS4KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwgbURldmljZS0+c2V0UGFyYW1ldGVycyhoaWRsUGFyYW1zKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgQXVkaW9PdXRwdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIEF1ZGlvSW5wdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIEF1ZGlvU291cmNlKHNvdXJjZSksCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAotICAgICAgICAgICAgaGlkbFBvcnQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbyBfX3VudXNlZCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzFjYjU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzYmY3OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzIwMWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwotICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzM1OTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLSAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgotICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCi0gICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKLSAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6bmFtZUZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgKmRldmljZSkgewotICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpQUklNQVJZOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OkEyRFA7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpVU0I7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6Ul9TVUJNSVg7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9TVFVCKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6U1RVQjsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZSAlcyIsIG5hbWUpOwotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbmFtZUZyb21IYWwobmFtZSwgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlc0ZhY3RvcnktPm9wZW5EZXZpY2UoCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDg4NDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2VzRmFjdG9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5OwotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5TXNkOwotCi0gICAgc3RhdGljIHN0YXR1c190IG5hbWVGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlICpkZXZpY2UpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0YmU3NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQotICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCi0gICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgewotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6fkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCi0gICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotICAgIH0KLSAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ1N2Q2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OwotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhOWFjZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKLSAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJjID0gQkFEX1ZBTFVFOwotICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci0KLW91dDoKLSAgICAqZGV2ID0gTlVMTDsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKLSAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDE4YWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjZhNTAwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotdWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgewotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKLSAgICByZXR1cm4gY291bnRlcisrOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAotICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKLSAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCi0gICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0gewotICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgewotICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOwotICAgIGlmIChhc2htZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAotICAgICAgICAgICAgbUJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7Ci0gICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKLSAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOwotICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7Ci0gICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1hdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7Ci0gICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Ci19Ci0KLXZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Ci19Ci0KLWJvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgewotICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7Ci0gICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKLSAgICB1cGRhdGUobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKLSAgICBjb21taXQobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOwotICAgIG1NZW1vcnktPmNvbW1pdCgpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlMDA4Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Ci11c2luZyBhbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRWZmZWN0QnVmZmVySGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbWlycm9yKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLQotICAgIHZpcnR1YWwgYXVkaW9fYnVmZmVyX3QqIGF1ZGlvQnVmZmVyKCk7Ci0gICAgdmlydHVhbCB2b2lkKiBleHRlcm5hbERhdGEoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOwotICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7Ci0KLSAgICBjb25zdCBBdWRpb0J1ZmZlciYgaGlkbEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1IaWRsQnVmZmVyOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOwotCi0gICAgc3RhdGljIHVpbnQ2NF90IG1ha2VVbmlxdWVJZCgpOwotCi0gICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOwotICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIHZvaWQqIG1FeHRlcm5hbERhdGE7Ci0gICAgQXVkaW9CdWZmZXIgbUhpZGxCdWZmZXI7Ci0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLSAgICBhdWRpb19idWZmZXJfdCBtQXVkaW9CdWZmZXI7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIH5FZmZlY3RCdWZmZXJIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmIwMzJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdEJ1ZmZlckFjY2VzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdENvbmZpZ1BhcmFtZXRlcnM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1FZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQotICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLUVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewotICAgIGlmIChtRWZmZWN0ICE9IDApIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgbUVmZmVjdC5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOwotICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAotICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKLX0KLQotLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKLS8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7Ci0gICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLT5jaGFubmVscyA9IEF1ZGlvQ2hhbm5lbE1hc2soaGFsQ29uZmlnLmNoYW5uZWxzKTsKLSAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOwotICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7Ci0gICAgY29uZmlnLT5tYXNrID0gRWZmZWN0Q29uZmlnUGFyYW1ldGVycyhoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgewotICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOwotICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCi0gICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7Ci0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOwotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgewotICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgewotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKLSAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlcy4KLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBDb21tb24gY2FzZS4KLSAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKLSAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgewotICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKLSAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBSZXR1cm48dm9pZD4gcmV0OwotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7Ci0gICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOwotICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7Ci0gICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmZkYWYxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RCdWZmZXJDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKLQotICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCi0gICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKLQotICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Ci0KLSAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KLSAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQotCi0gICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPAotICAgICAgICBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OwotICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7Ci0gICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgotICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKLSAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOwotICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7Ci0gICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDBlNmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VXVpZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKLSAgICBtRWZmZWN0c0ZhY3RvcnkgPSBJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6On5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlBbGxEZXNjcmlwdG9ycygpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXRBbGxEZXNjcmlwdG9ycygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0RGVzY3JpcHRvcnMgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIHJldHZhbCA9PSBSZXN1bHQ6Ok9LID8gT0sgOiBOT19JTklUOwotICAgIH0KLSAgICBtTGFzdERlc2NyaXB0b3JzLnJlc2l6ZSgwKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgewotICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgIGlmIChxdWVyeVJlc3VsdCA9PSBPSykgewotICAgICAgICAqcE51bUVmZmVjdHMgPSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IFdlIG5lZWQgc29tZWhvdyB0byB0cmFjayB0aGUgY2hhbmdlcyBvbiB0aGUgc2VydmVyIHNpZGUKLSAgICAvLyBvciBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGV2ZXJ5Ym9keSB0byBxdWVyeSBhbGwgdGhlIGRlc2NyaXB0b3JzIGF0IG9uY2UuCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUxhc3REZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICAgICAgaWYgKHF1ZXJ5UmVzdWx0ICE9IE9LKSByZXR1cm4gcXVlcnlSZXN1bHQ7Ci0gICAgfQotICAgIGlmIChpbmRleCA+PSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKSkgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChtTGFzdERlc2NyaXB0b3JzW2luZGV4XSwgcERlc2NyaXB0b3IpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0RGVzY3JpcHRvcihoaWRsVXVpZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Y3JlYXRlRWZmZWN0KAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QoCi0gICAgICAgICAgICBoaWRsVXVpZCwgc2Vzc2lvbklkLCBpb0lkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRWZmZWN0PiYgcmVzdWx0LCB1aW50NjRfdCBlZmZlY3RJZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsSGlkbChyZXN1bHQsIGVmZmVjdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmR1bXBFZmZlY3RzKGludCBmZCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmI1NDgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0c0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOwotCi0gICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKLSAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOwotCi0gICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OwotICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0gICAgdmlydHVhbCB+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2JkNDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Q2FsbGJhY2suaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpUaHJlYWRJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkF1ZGlvRHJhaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dENhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBCdWZmZXJJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6VGltZVNwZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKLSAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKLSAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKLQotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKLSAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKLSAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLCBtU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAotICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGJ1ZmZlciBzaXplIGZyYW1lIHdhcyBhIGhhY2sgaW4gTyBhbmQgUCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzIHNoYXJlYWJsZSB0byBhcHBsaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzICo9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzIHwgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVyc3Rfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idXJzdFNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgaXMgbm90IG5lZWRlZCBpbiBISURMIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVNbWFwQnVmZmVyIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT50aW1lX25hbm9zZWNvbmRzID0gaGlkbFBvc2l0aW9uLnRpbWVOYW5vc2Vjb25kczsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnBvc2l0aW9uX2ZyYW1lcyA9IGhpZGxQb3NpdGlvbi5wb3NpdGlvbkZyYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TW1hcFBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKLSAgICBtSGFsVGhyZWFkUHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKLSAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKLX0KLQotYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgewotICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KAotICAgICAgICAgICAgdGhyZWFkUGlkLCB0aHJlYWRJZCwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgZmFsc2UgLyppc0ZvckFwcCovLCB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOwotICAgIEFMT0dFX0lGKGVyciwgImZhaWxlZCB0byBzZXQgcHJpb3JpdHkgJWQgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgdGhyZWFkUGlkLCB0aHJlYWRJZCwgZXJyKTsKLSAgICAvLyBBdWRpbyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBsYXRlbmN5IHdpbGwgYmUgaGlnaGVyIGFuZCBzb21ldGltZXMgdW5hY2NlcHRhYmxlLgotICAgIHJldHVybiBlcnIgPT0gMDsKLX0KLQotbmFtZXNwYWNlIHsKLQotLyogTm90ZXMgb24gY2FsbGJhY2sgb3duZXJzaGlwLgotCi1UaGlzIGlzIGhvdyAoSHcpQmluZGVyIG93bmVyc2hpcCBtb2RlbCBsb29rcyBsaWtlLiBUaGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi1pcyBvd25lZCBieSBCaW5kZXIgZnJhbWV3b3JrICh2aWEgc3A8PikuIFByb3hpZXMgYXJlIG93bmVkIGJ5IGNsaWVudHMuCi1XaGVuIHRoZSBsYXN0IHByb3h5IGRpc2FwcGVhcnMsIEJpbmRlciBmcmFtZXdvcmsgcmVsZWFzZXMgdGhlIHNlcnZlciBpbXBsLgotCi1UaHVzLCBpdCBpcyBub3QgbmVlZGVkIHRvIGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gU3RyZWFtT3V0Q2FsbGJhY2sgKHRoaXMgaXMKLXRoZSBzZXJ2ZXIgaW1wbCkgLS0gaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgSEFMIHNlcnZlciBob2xkcyBhIHN0cm9uZyByZWYgdG8KLUlTdHJlYW1PdXRDYWxsYmFjayBwcm94eS4gV2UgY2xlYXIgdGhhdCByZWZlcmVuY2UgYnkgY2FsbGluZyAnY2xlYXJDYWxsYmFjaycKLWZyb20gdGhlIGRlc3RydWN0b3Igb2YgU3RyZWFtT3V0SGFsSGlkbC4KLQotVGhlIGNhbGxiYWNrIG9ubHkga2VlcHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIG93bmVkCi1ieSBBdWRpb0ZsaW5nZXIuCi0KLSovCi0KLXN0cnVjdCBTdHJlYW1PdXRDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0Q2FsbGJhY2sgewotICAgIFN0cmVhbU91dENhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9Ci0KLSAgICAvLyBJU3RyZWFtT3V0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KLSAgICBSZXR1cm48dm9pZD4gb25Xcml0ZVJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkRyYWluUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKQotICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLVN0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKLSAgICAgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsZWFyQ2FsbGJhY2siLCBtU3RyZWFtLT5jbGVhckNhbGxiYWNrKCkpOwotICAgICAgICB9Ci0gICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7Ci0gICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKLSAgICB9Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9MQVRFTkNZLCAiZ2V0TGF0ZW5jeSIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeSA9IHdyaXRlU3RhdHVzLnJlcGx5LmxhdGVuY3lNczsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TGF0ZW5jeSIsIG1TdHJlYW0tPmdldExhdGVuY3koKSwgbGF0ZW5jeSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9sdW1lIiwgbVN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqd3JpdHRlbiA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCi0gICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSkgewotICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCi0gICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQotICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCi0gICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gICAgICAgIHNpemVfdCBidWZmZXJTaXplOwotICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKLSAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOwotICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgotICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKLSAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgewotICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKLSAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgewotICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOwotICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKLQotICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCi0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKLSAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7Ci0gICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAotICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOwotICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbDsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiAvKiBzb3VyY2VNZXRhZGF0YSAqLykgewotICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc291cmNlIG1ldGFkYXRhCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKLSAgICBjYWxsYmFjay0+b25FcnJvcigpOwotfQotCi0KLVN0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICpyZWFkID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwotICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCi0gICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwotICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7Ci0gICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKLSAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOwotICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047Ci0gICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgLyogc2lua01ldGFkYXRhICovKSB7Ci0gICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzaW5rIG1ldGFkYXRhCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhZDhhZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1Jbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1PdXQuaD4KLSNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Ci11c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKLXVzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7Ci11c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxIaWRsOwotCi1jbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7Ci0gICAgSVN0cmVhbSAqbVN0cmVhbTsKLSAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OwotICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCi0gICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKLSAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOwotICAgIHZvaWQgb25FcnJvcigpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7Ci0gICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOwotCi0gICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOwotCi0gICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47Ci0gICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Ci19OwotCi1jbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkUGFyYW1ldGVycywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1SZWFkZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOwotCi0gICAgdXNpbmcgUmVhZGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLCBSZWFkZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTA3ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7Ci0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewotICAgIG1TdHJlYW0gPSAwOwotICAgIG1EZXZpY2UuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKLSAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKLSAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gICAgcmV0dXJuIE9LOwotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgewotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKLSAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICp3cml0dGVuID0gMDsKLSAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc3RhdGljCi1pbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKLSAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKLSAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKLSAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQotICAgIC8vIGRlY3JlbWVudGVkLgotICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOwotICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOwotICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOwotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7Ci0gICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7Ci0gICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7Ci0gICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqcmVhZCA9IDA7Ci0gICAgICAgIHJldHVybiByZWFkUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE4ZDBjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsOwotCi1jbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7Ci0KLSAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzhiMWFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICi0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJlYW1Qb3dlckxvZyB7Ci1wdWJsaWM6Ci0gICAgU3RyZWFtUG93ZXJMb2coKSA6Ci0gICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKLSAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAotICAgICAgICBtRnJhbWVTaXplKDApIHsKLSAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KLSAgICB9Ci0KLSAgICB+U3RyZWFtUG93ZXJMb2coKSB7Ci0gICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCi0gICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKLSAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCi0gICAgfQotCi0gICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKLSAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCi0gICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAotICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOwotICAgIH0KLQotICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgotICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCi0gICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAotICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAotICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOwotICAgIH0KLQotICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLwotICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOwotCi0gICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzZGVmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxANC4wIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2V4dHJhIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDQuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi11dGlsIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAtdXRpbCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKLSAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLnV0aWxAYWxsLXZlcnNpb25zIiwKLSAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiCi0gICAgXSwKLQotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYmZtcSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTI3NTA0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lTG9jYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNaWNyb3Bob25lSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgewotICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7Ci0gICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7Ci0gICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCi0gICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcwotICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgotICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8Ci0gICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKLSAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAotICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgewotICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7Ci0gICAgfQotICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOwotfQotCi1Db252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQotICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgewotICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Ci19Ci0KLS8vIFRPRE86IFVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaGFsIHdoZW4gaXQgbW92ZXMgdG8gYSB1dGlsIGxpYnJhcnkuCi1zdGQ6OnN0cmluZyBkZXZpY2VBZGRyZXNzVG9IYWwoY29uc3QgRGV2aWNlQWRkcmVzcyYgYWRkcmVzcykgewotICAgIC8vIEhBTCBhc3N1bWVzIHRoYXQgdGhlIGFkZHJlc3MgaXMgTlVMLXRlcm1pbmF0ZWQuCi0gICAgY2hhciBoYWxBZGRyZXNzW0FVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU5dOwotICAgIG1lbXNldChoYWxBZGRyZXNzLCAwLCBzaXplb2YoaGFsQWRkcmVzcykpOwotICAgIGF1ZGlvX2RldmljZXNfdCBoYWxEZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGFkZHJlc3MuZGV2aWNlKTsKLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKLSAgICBpZiAoaXNJbnB1dCkgaGFsRGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApIHx8Ci0gICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApIHx8Ci0gICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlZC4lZC4lZC4lZCIsIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzBdLAotICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuaXB2NFsxXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMl0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzNdKTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICJjYXJkPSVkO2RldmljZT0lZCIsIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmNhcmQsCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmRldmljZSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5yU3VibWl4QWRkcmVzcy5jX3N0cigpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhbEFkZHJlc3M7Ci19Ci0KLS8vbG9jYWwgY29udmVyc2lvbiBoZWxwZXJzCi0KLWF1ZGlvX21pY3JvcGhvbmVfY2hhbm5lbF9tYXBwaW5nX3QgIGNoYW5uZWxNYXBwaW5nVG9IYWwoQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmcgbWFwcGluZykgewotICAgIHN3aXRjaCAobWFwcGluZykgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpVTlVTRUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpESVJFQ1Q6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfRElSRUNUOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpQUk9DRVNTRUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfUFJPQ0VTU0VEOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBjaGFubmVsTWFwcGluZ1RvSGFsIGNvbnZlcnNpb24gJWQiLCBtYXBwaW5nKTsKLSAgICB9Ci19Ci0KLWF1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgc3dpdGNoIChsb2NhdGlvbikgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7Ci0gICAgfQotfQotYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25hbGl0eV90IGRpcmVjdGlvbmFsaXR5VG9IYWwoQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHkgZGlyKSB7Ci0gICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6VU5LTk9XTjoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1VOS05PV047Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6Ok9NTkk6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9PTU5JOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpCSV9ESVJFQ1RJT05BTDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0JJX0RJUkVDVElPTkFMOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpDQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0NBUkRJT0lEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpIWVBFUl9DQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0hZUEVSX0NBUkRJT0lEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpTVVBFUl9DQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1NVUEVSX0NBUkRJT0lEOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBkaXJlY3Rpb25hbGl0eVRvSGFsIGNvbnZlcnNpb24gJWQiLCBkaXIpOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjptaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgewotICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKLSAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOwotICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7Ci0gICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKLSAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgewotICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBjaDsKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7Ci0gICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgewotICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKLSAgICAgICAgfQotICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKLSAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKLSAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOwotICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKLSAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7Ci0gICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOwotICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKLSAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7Ci0gICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7Ci0gICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7Ci0gICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKLSAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7Ci0gICAgICAgIH0KLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKLSAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OwotICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7Ci0gICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBWNF8wCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyM2E4ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1pY3JvcGhvbmVJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBDb252ZXJzaW9uSGVscGVySGlkbCB7Ci0gIHByb3RlY3RlZDoKLSAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7Ci0gICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7Ci0gICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKLSAgICBzdGF0aWMgdm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpOwotCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgewotICAgICAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCi0gICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQgcmV0dmFsKSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIFY0XzAKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhY2NhOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9JbnB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb091dHB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1BhdGNoSGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Qb3J0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Qb3J0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6bWtFbnVtQ29udmVydGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkRldmljZUFkZHJlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlNpbmtNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotbmFtZXNwYWNlIHsKLQotc3RhdHVzX3QgZGV2aWNlQWRkcmVzc0Zyb21IYWwoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGNoYXIqIGhhbEFkZHJlc3MsIERldmljZUFkZHJlc3MqIGFkZHJlc3MpIHsKLSAgICBhZGRyZXNzLT5kZXZpY2UgPSBBdWRpb0RldmljZShkZXZpY2UpOwotCi0gICAgaWYgKGhhbEFkZHJlc3MgPT0gbnVsbHB0ciB8fCBzdHJubGVuKGhhbEFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKLSAgICBpZiAoaXNJbnB1dCkgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWDolaGhYIiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1sxXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzJdLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1szXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzRdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNV0pOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDYgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9JUCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fSVApICE9IDApKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhodS4laGh1LiVoaHUuJWhodSIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFswXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsxXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzJdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzNdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA0ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikpICE9IDAKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikpICE9IDApIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICJjYXJkPSVkO2RldmljZT0lZCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5jYXJkLCAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmRldmljZSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gMiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5idXNBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7Ci0gICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MtPnJTdWJtaXhBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1EZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKLX0KLQotRGV2aWNlSGFsSGlkbDo6fkRldmljZUhhbEhpZGwoKSB7Ci0gICAgaWYgKG1EZXZpY2UgIT0gMCkgewotICAgICAgICBtRGV2aWNlLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90KikgewotICAgIC8vIE9ic29sZXRlLgotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6aW5pdENoZWNrKCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJpbml0Q2hlY2siLCBtRGV2aWNlLT5pbml0Q2hlY2soKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGZsb2F0IHYpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdm9sdW1lID0gdjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyVm9sdW1lIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TW9kZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljTXV0ZSIsIG1EZXZpY2UtPnNldE1pY011dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY011dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY011dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJNdXRlIiwgbURldmljZS0+c2V0TWFzdGVyTXV0ZShzdGF0ZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyTXV0ZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyTXV0ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgLy8gVE9ETzogY2hhbmdlIHRoZSBBUEkgc28gdGhhdCBjb250ZXh0IGFuZCBrdlBhaXJzIGFyZSBzZXBhcmF0ZWQKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobURldmljZSwge30gLyogY29udGV4dCAqLywgaGlkbFBhcmFtcykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IHV0aWxzOjpnZXRQYXJhbWV0ZXJzKG1EZXZpY2UsCi0gICAgICAgICAgICB7fSAvKiBjb250ZXh0ICovLAotICAgICAgICAgICAgaGlkbEtleXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgYnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRCdWZmZXJTaXplIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBta0VudW1Db252ZXJ0ZXI8QXVkaW9PdXRwdXRGbGFnPihmbGFncyksCi0gICAgICAgICAgICB7fSAvKiBtZXRhZGF0YSAqLywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIC8vIFRPRE86IGNvcnJlY3RseSBwcm9wYWdhdGUgdGhlIHRyYWNrcyBzb3VyY2VzIGFuZCB2b2x1bWUKLSAgICAvLyAgICAgICBmb3Igbm93LCBvbmx5IHNlbmQgdGhlIG1haW4gc291cmNlIGF0IDFkYmZzCi0gICAgU2lua01ldGFkYXRhIG1ldGFkYXRhID0ge3t7QXVkaW9Tb3VyY2Uoc291cmNlKSwgMX19fTsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgIG1ldGFkYXRhLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtSW4+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3BlbklucHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNBdWRpb1BhdGNoZXMiLCBtRGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpLCBzdXBwb3J0c1BhdGNoZXMpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8QXVkaW9Qb3J0Q29uZmlnPiBoaWRsU291cmNlcywgaGlkbFNpbmtzOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NvdXJjZXMsIHNvdXJjZXMsICZoaWRsU291cmNlcyk7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc2lua3MsIHNpbmtzLCAmaGlkbFNpbmtzKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgaGlkbFNvdXJjZXMsIGhpZGxTaW5rcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgQXVkaW9QYXRjaEhhbmRsZSBoaWRsUGF0Y2gpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2ggPSBzdGF0aWNfY2FzdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4oaGlkbFBhdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlQXVkaW9QYXRjaCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRGcm9tSGFsKCpwb3J0LCAmaGlkbFBvcnQpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEF1ZGlvUG9ydCgKLSAgICAgICAgICAgIGhpZGxQb3J0LAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBBdWRpb1BvcnQmIHApIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydFRvSGFsKHAsIHBvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1BvcnQiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEF1ZGlvUG9ydENvbmZpZyIsIG1EZXZpY2UtPnNldEF1ZGlvUG9ydENvbmZpZyhoaWRsQ29uZmlnKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY3JvcGhvbmVzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKLSAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKLSAgICAgICAgICAgIC8vY29udmVydAotICAgICAgICAgICAgbWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7Ci0gICAgICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZSA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhkc3QpOwotICAgICAgICAgICAgbWljcm9waG9uZXNJbmZvLT5wdXNoX2JhY2sobWljcm9waG9uZSk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljcm9waG9uZXMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQyMTc1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOwotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLQotICAgIC8vIE11dGluZyBjb250cm9sLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOwotCi0gICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOwotICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0NWRkOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7Ci0gICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbURldi0+Z2V0X21pY3JvcGhvbmVzKG1EZXYsICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7Ci0gICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOwotICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MzQxYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgdm9pZCBjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCk7Ci0gICAgdm9pZCBjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbik7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxMb2NhbCgpOwotCi0gICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzE5NGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLSAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgotICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCi0gICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKLSAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2VzRmFjdG9yeS0+b3BlbkRldmljZSgKLSAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0ODg5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZXNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlc0ZhY3Rvcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeTsKLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeU1zZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYxZWM3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKLSAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAotICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkpIHsKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6On5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgotICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTRlZGQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1zdGF0aWMgc3RhdHVzX3QgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCAmbW9kKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IGxvYWQgYXVkaW8gaHcgbW9kdWxlICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmMgPSBhdWRpb19od19kZXZpY2Vfb3Blbihtb2QsIGRldik7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBvcGVuIGF1ZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgewotICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZSgqZGV2KTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLQotb3V0OgotICAgICpkZXYgPSBOVUxMOwotICAgIHJldHVybiByYzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OwotICAgIHN0YXR1c190IHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UobmFtZSwgJmRldik7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsTG9jYWwoZGV2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxYzUyMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2M4OWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotLy8gc3RhdGljCi11aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7Ci0gICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OwotICAgIHJldHVybiBjb3VudGVyKys7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAotICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCi0gICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOwotICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKLSAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7Ci0gICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7Ci0gICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7Ci0gICAgaWYgKGFzaG1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCi0gICAgICAgICAgICBtQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OwotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKLSAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKLSAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOwotICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7Ci0gICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKLSAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLWF1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKLSAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKLX0KLQotdm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgewotICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7Ci0gICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKLSAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgewotICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgewotICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7Ci0gICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDU3OGM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwotdXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0gICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOwotICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOwotCi0gICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKLQotICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKLQotICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKLSAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKLSAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOwotICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOwotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0gICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgaW5pdCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OWM0YzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RCdWZmZXJBY2Nlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RDb25maWdQYXJhbWV0ZXJzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6bWtFbnVtQ29udmVydGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLUVmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCi0gICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1FZmZlY3QgIT0gMCkgewotICAgICAgICBjbG9zZSgpOwotICAgICAgICBtRWZmZWN0LmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgewotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOwotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOwotICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOwotICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7Ci0gICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOwotfQotCi0vLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgotLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCi0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKLSAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKLSAgICBjb25maWctPmNoYW5uZWxzID0gbWtFbnVtQ29udmVydGVyPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7Ci0gICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKLSAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGNvbmZpZy0+bWFzayA9IG1rRW51bUNvbnZlcnRlcjxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgewotICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOwotICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCi0gICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7Ci0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOwotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgewotICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgewotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKLSAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlcy4KLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBDb21tb24gY2FzZS4KLSAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKLSAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgewotICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKLSAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBSZXR1cm48dm9pZD4gcmV0OwotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7Ci0gICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOwotICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7Ci0gICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTRkYWIxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdEJ1ZmZlckNvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXQgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKLQotICAgIC8vIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2VzcygpOwotCi0gICAgLy8gUHJvY2VzcyByZXZlcnNlIHN0cmVhbSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhc3MKLSAgICAvLyBhIHJlZmVyZW5jZSBzdHJlYW0gdG8gdGhlIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzUmV2ZXJzZSgpOwotCi0gICAgLy8gU2VuZCBhIGNvbW1hbmQgYW5kIHJlY2VpdmUgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gRnJlZSByZXNvdXJjZXMgb24gdGhlIHJlbW90ZSBzaWRlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKLQotICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgotICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9Ci0KLSAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8Ci0gICAgICAgIGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElFZmZlY3Q+IG1FZmZlY3Q7Ci0gICAgY29uc3QgdWludDY0X3QgbUVmZmVjdElkOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbUluQnVmZmVyOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbU91dEJ1ZmZlcjsKLSAgICBib29sIG1CdWZmZXJzQ2hhbmdlZDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdCYgcmVzdWx0KTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCi0gICAgdmlydHVhbCB+RWZmZWN0SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q29uZmlnSW1wbCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUHJvY2Vzc2luZygpOwotICAgIGJvb2wgbmVlZFRvUmVzZXRCdWZmZXJzKCk7Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKTsKLSAgICBzdGF0dXNfdCBzZXRDb25maWdJbXBsKAotICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZWQ3ODQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlV1aWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7Ci0gICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLX0KLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjp+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKLSAgICB9Ci0gICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKLSAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBxdWVyeVJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCi0gICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotICAgIH0KLSAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTJmNWY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbU91dENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ29udGVudFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Vc2FnZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlRocmVhZEluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9EcmFpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0Q2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcEJ1ZmZlckluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcFBvc2l0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBsYXliYWNrVHJhY2tNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZWNvcmRUcmFja01ldGFkYXRhOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpUaW1lU3BlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1TdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAotICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAotICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApewotCi0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOwotICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOwotICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwgaGlkbFBhcmFtcywge30gLyogb3B0aW9ucyAqLykpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBtU3RyZWFtLAotICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKLSAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZyhoaWRsSW5mby5mbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idWZmZXJTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgYnVmZmVyIHNpemUgZnJhbWUgd2FzIGEgaGFjayBpbiBPIGFuZCBQIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSBidWZmZXIgaXMgc2hhcmVhYmxlIHRvIGFwcGxpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgKj0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBhdWRpb19tbWFwX2J1ZmZlcl9mbGFnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgfCBBVURJT19NTUFQX0FQUExJQ0FUSU9OX1NIQVJFQUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idXJzdF9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1cnN0U2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyBpcyBub3QgbmVlZGVkIGluIEhJREwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZU1tYXBCdWZmZXIiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBQb3NpdGlvbiYgaGlkbFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnRpbWVfbmFub3NlY29uZHMgPSBoaWRsUG9zaXRpb24udGltZU5hbm9zZWNvbmRzOwotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+cG9zaXRpb25fZnJhbWVzID0gaGlkbFBvc2l0aW9uLnBvc2l0aW9uRnJhbWVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNbWFwUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSkgewotICAgIG1IYWxUaHJlYWRQcmlvcml0eSA9IHByaW9yaXR5OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobUNhY2hlZEJ1ZmZlclNpemUgIT0gMCkgewotICAgICAgICAqc2l6ZSA9IG1DYWNoZWRCdWZmZXJTaXplOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOwotfQotCi1ib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7Ci0gICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoCi0gICAgICAgICAgICB0aHJlYWRQaWQsIHRocmVhZElkLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCBmYWxzZSAvKmlzRm9yQXBwKi8sIHRydWUgLyphc3luY2hyb25vdXMqLyk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiZmFpbGVkIHRvIHNldCBwcmlvcml0eSAlZCBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCB0aHJlYWRQaWQsIHRocmVhZElkLCBlcnIpOwotICAgIC8vIEF1ZGlvIHdpbGwgc3RpbGwgd29yaywgYnV0IGxhdGVuY3kgd2lsbCBiZSBoaWdoZXIgYW5kIHNvbWV0aW1lcyB1bmFjY2VwdGFibGUuCi0gICAgcmV0dXJuIGVyciA9PSAwOwotfQotCi1uYW1lc3BhY2UgewotCi0vKiBOb3RlcyBvbiBjYWxsYmFjayBvd25lcnNoaXAuCi0KLVRoaXMgaXMgaG93IChIdylCaW5kZXIgb3duZXJzaGlwIG1vZGVsIGxvb2tzIGxpa2UuIFRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLWlzIG93bmVkIGJ5IEJpbmRlciBmcmFtZXdvcmsgKHZpYSBzcDw+KS4gUHJveGllcyBhcmUgb3duZWQgYnkgY2xpZW50cy4KLVdoZW4gdGhlIGxhc3QgcHJveHkgZGlzYXBwZWFycywgQmluZGVyIGZyYW1ld29yayByZWxlYXNlcyB0aGUgc2VydmVyIGltcGwuCi0KLVRodXMsIGl0IGlzIG5vdCBuZWVkZWQgdG8ga2VlcCBhbnkgcmVmZXJlbmNlcyB0byBTdHJlYW1PdXRDYWxsYmFjayAodGhpcyBpcwotdGhlIHNlcnZlciBpbXBsKSAtLSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyBIQUwgc2VydmVyIGhvbGRzIGEgc3Ryb25nIHJlZiB0bwotSVN0cmVhbU91dENhbGxiYWNrIHByb3h5LiBXZSBjbGVhciB0aGF0IHJlZmVyZW5jZSBieSBjYWxsaW5nICdjbGVhckNhbGxiYWNrJwotZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBTdHJlYW1PdXRIYWxIaWRsLgotCi1UaGUgY2FsbGJhY2sgb25seSBrZWVwcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgb3duZWQKLWJ5IEF1ZGlvRmxpbmdlci4KLQotKi8KLQotc3RydWN0IFN0cmVhbU91dENhbGxiYWNrIDogcHVibGljIElTdHJlYW1PdXRDYWxsYmFjayB7Ci0gICAgU3RyZWFtT3V0Q2FsbGJhY2soY29uc3Qgd3A8U3RyZWFtT3V0SGFsSGlkbD4mIHN0cmVhbSkgOiBtU3RyZWFtKHN0cmVhbSkge30KLQotICAgIC8vIElTdHJlYW1PdXRDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgotICAgIFJldHVybjx2b2lkPiBvbldyaXRlUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRHJhaW5SZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25FcnJvcigpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25FcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgd3A8U3RyZWFtT3V0SGFsSGlkbD4gbVN0cmVhbTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TdHJlYW1PdXRIYWxIaWRsOjpTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1Xcml0ZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtT3V0SGFsSGlkbDo6flN0cmVhbU91dEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBpZiAobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewotICAgICAgICAgICAgcHJvY2Vzc1JldHVybigiY2xlYXJDYWxsYmFjayIsIG1TdHJlYW0tPmNsZWFyQ2FsbGJhY2soKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgIH0KLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX0xBVEVOQ1ksICJnZXRMYXRlbmN5IiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpsYXRlbmN5ID0gd3JpdGVTdGF0dXMucmVwbHkubGF0ZW5jeU1zOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRMYXRlbmN5IiwgbVN0cmVhbS0+Z2V0TGF0ZW5jeSgpLCBsYXRlbmN5KTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2x1bWUiLCBtU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICp3cml0dGVuID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgd3JpdGUgcmVxdWVzdC4KLSAgICAgICAgQUxPR1dfSUYobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKLSAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCi0gICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKLSAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KLSAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAotICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47Ci0gICAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpY3Mgb2YgdGhlIGNhdXNlIG9mIGIvMzU4MTMxMTMuCi0gICAgICAgICAgICAgICAgQUxPR0VfSUYoKndyaXR0ZW4gPiBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFN0cmVhbU91dEhhbEhpZGw6OldyaXRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmY21kKSkgewotICAgICAgICBBTE9HRSgiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbURhdGFNUS0+YXZhaWxhYmxlVG9Xcml0ZSgpOwotICAgICAgICBpZiAoZGF0YVNpemUgPiBhdmFpbGFibGVUb1dyaXRlKSB7Ci0gICAgICAgICAgICBBTE9HVygidHJ1bmNhdGluZyB3cml0ZSBkYXRhIGZyb20gJWxsZCB0byAlbGxkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YSBxdWV1ZSBzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGF0YVNpemUsIChsb25nIGxvbmcpYXZhaWxhYmxlVG9Xcml0ZSk7Ci0gICAgICAgICAgICBkYXRhU2l6ZSA9IGF2YWlsYWJsZVRvV3JpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YU1RLT53cml0ZShkYXRhLCBkYXRhU2l6ZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSkgewotICAgICAgICBXcml0ZVN0YXR1cyB3cml0ZVN0YXR1czsKLSAgICAgICAgd3JpdGVTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZ3cml0ZVN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdyaXRlU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHdyaXRlU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgd3JpdGVTdGF0dXMucmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvcldyaXRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvcldyaXRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVdyaXRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlbmRlclBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBpbnQ2NF90IHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdGltZXN0YW1wID0gdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCi0gICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNQYXVzZSA9IHA7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUmVzdW1lID0gcjsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c1BhdXNlQW5kUmVzdW1lIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0RyYWluIiwgbVN0cmVhbS0+c3VwcG9ydHNEcmFpbigpLCBzdXBwb3J0c0RyYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04sICJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24uZnJhbWVzOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCBjb25zdCBUaW1lU3BlYyYgaGlkbFRpbWVTdGFtcCkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSBoaWRsVGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gaGlkbFRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotLyoqIFRyYW5zZm9ybSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gdG8gYW4gSElETCB2ZWN0b3IuICovCi10ZW1wbGF0ZSA8Y2xhc3MgVmFsdWVzLCBjbGFzcyBFbGVtZW50Q29udmVydGVyPgotc3RhdGljIGF1dG8gdHJhbnNmb3JtVG9IaWRsVmVjKGNvbnN0IFZhbHVlcyYgdmFsdWVzLCBFbGVtZW50Q29udmVydGVyIGNvbnZlcnRlcikgewotICAgIGhpZGxfdmVjPGRlY2x0eXBlKGNvbnZlcnRlcigqdmFsdWVzLmJlZ2luKCkpKT4gcmVzdWx0e3ZhbHVlcy5zaXplKCl9OwotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gICAgdHJhbnNmb3JtKGJlZ2luKHZhbHVlcyksIGVuZCh2YWx1ZXMpLCBiZWdpbihyZXN1bHQpLCBjb252ZXJ0ZXIpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U291cmNlTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7Ci0gICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc291cmNlTWV0YWRhdGEudHJhY2tzLAotICAgICAgICAgICAgICBbXShjb25zdCBwbGF5YmFja190cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFBsYXliYWNrVHJhY2tNZXRhZGF0YSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgICAgICAgICAudXNhZ2U9c3RhdGljX2Nhc3Q8QXVkaW9Vc2FnZT4obWV0YWRhdGEudXNhZ2UpLAotICAgICAgICAgICAgICAgICAgICAuY29udGVudFR5cGU9c3RhdGljX2Nhc3Q8QXVkaW9Db250ZW50VHlwZT4obWV0YWRhdGEuY29udGVudF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU291cmNlTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShoYWxNZXRhZGF0YSkpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKLSAgICBjYWxsYmFjay0+b25FcnJvcigpOwotfQotCi0KLVN0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICpyZWFkID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwotICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCi0gICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwotICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7Ci0gICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKLSAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOwotICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047Ci0gICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKLSAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKLSAgICAgICAgICAgIC8vIGNvbnZlcnQKLSAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOwotICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKLSAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEFjdGl2ZU1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U2lua01ldGFkYXRhIGhhbE1ldGFkYXRhID0gewotICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNpbmtNZXRhZGF0YS50cmFja3MsCi0gICAgICAgICAgICAgIFtdKGNvbnN0IHJlY29yZF90cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFJlY29yZFRyYWNrTWV0YWRhdGEgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICAgICAgICAgICAgLnNvdXJjZT1zdGF0aWNfY2FzdDxBdWRpb1NvdXJjZT4obWV0YWRhdGEuc291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRhMGY4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW0uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtSW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtT3V0Lmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW07Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwotdXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Ci11c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwotdXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbDsKLQotY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwotICAgIElTdHJlYW0gKm1TdHJlYW07Ci0gICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKLSAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtT3V0Q2FsbGJhY2sgKEhJREwpLgotICAgIHZvaWQgb25Xcml0ZVJlYWR5KCk7Ci0gICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKLSAgICB2b2lkIG9uRXJyb3IoKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlQ29tbWFuZCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtV3JpdGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFdyaXRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBXcml0ZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxIaWRsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkOTZiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1TdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7Ci0gICAgbVN0cmVhbSA9IDA7Ci0gICAgbURldmljZS5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKLSAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOwotICAgICAgICBmcmVlKGhhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVzLT5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgewotICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgewotICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQotICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KLSAgICByZXR1cm4gT0s7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgewotICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKndyaXR0ZW4gPSAwOwotICAgICAgICByZXR1cm4gd3JpdGVSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1TdHJlYW0sIGRzcEZyYW1lcyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcChtU3RyZWFtLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9jYWxsYmFjayA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2NhbGxiYWNrKG1TdHJlYW0sIFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrLCB0aGlzKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBzdGF0aWMKLWludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCosIHZvaWQgKmNvb2tpZSkgewotICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQotICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcwotICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5Ci0gICAgLy8gZGVjcmVtZW50ZWQuCi0gICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7Ci0gICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7Ci0gICAgaWYgKHNlbGYgPT0gMCkgcmV0dXJuIDA7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuIDA7Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2soKSBldmVudCAlZCIsIGV2ZW50KTsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9XUklURV9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRFJBSU5fUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0VSUk9SOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coImFzeW5jQ2FsbGJhY2soKSB1bmtub3duIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgICpzdXBwb3J0c1BhdXNlID0gbVN0cmVhbS0+cGF1c2UgIT0gTlVMTDsKLSAgICAqc3VwcG9ydHNSZXN1bWUgPSBtU3RyZWFtLT5yZXN1bWUgIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cGF1c2UgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5wYXVzZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cmVzdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cmVzdW1lKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgKnN1cHBvcnRzRHJhaW4gPSBtU3RyZWFtLT5kcmFpbiAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbS0+ZHJhaW4gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5kcmFpbihtU3RyZWFtLCBlYXJseU5vdGlmeSA/IEFVRElPX0RSQUlOX0VBUkxZX05PVElGWSA6IEFVRElPX0RSQUlOX0FMTCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbS0+Zmx1c2ggPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5mbHVzaChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YSo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1TdHJlYW1JbkhhbExvY2FsOjpTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1JbkhhbExvY2FsOjp+U3RyZWFtSW5IYWxMb2NhbCgpIHsKLSAgICBtRGV2aWNlLT5jbG9zZUlucHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldEdhaW4oZmxvYXQgZ2FpbikgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZ2FpbihtU3RyZWFtLCBnYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7Ci0gICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKLSAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpyZWFkID0gMDsKLSAgICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICAqZnJhbWVzTG9zdCA9IG1TdHJlYW0tPmdldF9pbnB1dF9mcmFtZXNfbG9zdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhKj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgewotICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKLSAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7Ci0gICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOwotICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNzUwOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMXzRfMF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsOwotCi1jbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7Ci0KLSAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiNzIwMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICi0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBTdHJlYW1Qb3dlckxvZyB7Ci1wdWJsaWM6Ci0gICAgU3RyZWFtUG93ZXJMb2coKSA6Ci0gICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKLSAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAotICAgICAgICBtRnJhbWVTaXplKDApIHsKLSAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KLSAgICB9Ci0KLSAgICB+U3RyZWFtUG93ZXJMb2coKSB7Ci0gICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCi0gICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKLSAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCi0gICAgfQotCi0gICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKLSAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCi0gICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAotICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOwotICAgIH0KLQotICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgotICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCi0gICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAotICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAotICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOwotICAgIH0KLQotICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLwotICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOwotCi0gICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9WZXJzaW9uVXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9WZXJzaW9uVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0NmMyZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLW5hbWVzcGFjZSB1dGlscyB7Ci0KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KLVJldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMsIGNhbGxiYWNrKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1SZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7Ci0gICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdXRpbHMKLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU180XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmNmRlMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OwotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MGI3YTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdHNGYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLWNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKLQotICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCi0gICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKLQotICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICBzcDxJRWZmZWN0c0ZhY3Rvcnk+IG1FZmZlY3RzRmFjdG9yeTsKLSAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotICAgIHZpcnR1YWwgfkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCmluZGV4IDNhNWRmMjcuLjU4NGMyYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icApAQCAtOCwxNiArOCwyMCBAQAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA1LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A1LjAiLAogICAgICAgICAibGliYXVkaW9oYWxAMi4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDQuMCIsCisgICAgICAgICJsaWJhdWRpb2hhbEA1LjAiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAppbmRleCA0YzhlYWY2Li5mODYwMDljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0xNiwxOSArMTYsMjIgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2VzRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2VzRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNS4wL0lEZXZpY2VzRmFjdG9yeS5oPgogCi0jaW5jbHVkZSA8RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KKyNpbmNsdWRlIDxsaWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwogc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjVfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gVjVfMDo6Y3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKKyAgICB9CiAgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisgICAgICAgIHJldHVybiBWNF8wOjpjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKKyAgICAgICAgcmV0dXJuIFYyXzA6OmNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCmluZGV4IGVhZDFmYTIuLmJkM2VmNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKQEAgLTE2LDIwICsxNiwyMiBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC81LjAvSUVmZmVjdHNGYWN0b3J5Lmg+CiAKLSNpbmNsdWRlIDxFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0KKyNpbmNsdWRlIDxsaWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwogc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNV8wOjpJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBlZmZlY3Q6OlY1XzA6OmNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7CisgICAgfQogICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworICAgICAgICByZXR1cm4gZWZmZWN0OjpWNF8wOjpjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKyAgICAgICAgcmV0dXJuIGVmZmVjdDo6VjJfMDo6Y3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1MzNkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icApAQCAtMCwwICsxLDEwMiBAQAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbF9kZWZhdWx0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKKworICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCisgICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi51dGlsQGFsbC12ZXJzaW9ucyIsCisgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049MiIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANC4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NCIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANS4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDUuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA1LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A1LjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NSIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOGE1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCisvLyBzdGF0aWMKK3N0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKKyAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKKyAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKKyAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCisgICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgorICAgIFN0cmluZzggdmFsdWU7CisgICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCisgICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKKyAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOworICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgeworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKKyAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7CisgICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKKyAgICB9CisgICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Cit9CisKK0NvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCisgICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorfQorCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7CisgICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorLy8gVE9ETzogVXNlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGluIHRoZSBoYWwgd2hlbiBpdCBtb3ZlcyB0byBhIHV0aWwgbGlicmFyeS4KK3N0YXRpYyBzdGQ6OnN0cmluZyBkZXZpY2VBZGRyZXNzVG9IYWwoY29uc3QgRGV2aWNlQWRkcmVzcyYgYWRkcmVzcykgeworICAgIC8vIEhBTCBhc3N1bWVzIHRoYXQgdGhlIGFkZHJlc3MgaXMgTlVMLXRlcm1pbmF0ZWQuCisgICAgY2hhciBoYWxBZGRyZXNzW0FVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU5dOworICAgIG1lbXNldChoYWxBZGRyZXNzLCAwLCBzaXplb2YoaGFsQWRkcmVzcykpOworICAgIGF1ZGlvX2RldmljZXNfdCBoYWxEZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGFkZHJlc3MuZGV2aWNlKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKKyAgICBpZiAoaXNJbnB1dCkgaGFsRGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApIHx8CisgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApIHx8CisgICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlZC4lZC4lZC4lZCIsIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzBdLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuaXB2NFsxXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMl0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzNdKTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICJjYXJkPSVkO2RldmljZT0lZCIsIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmNhcmQsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmRldmljZSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwIHx8CisgICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5yU3VibWl4QWRkcmVzcy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbEFkZHJlc3M7Cit9CisKKy8vbG9jYWwgY29udmVyc2lvbiBoZWxwZXJzCisKK3N0YXRpYyBhdWRpb19taWNyb3Bob25lX2NoYW5uZWxfbWFwcGluZ190ICBjaGFubmVsTWFwcGluZ1RvSGFsKEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICBzd2l0Y2ggKG1hcHBpbmcpIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6VU5VU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6RElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX0RJUkVDVDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6UFJPQ0VTU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1BST0NFU1NFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gY2hhbm5lbE1hcHBpbmdUb0hhbCBjb252ZXJzaW9uICVkIiwgbWFwcGluZyk7CisgICAgfQorfQorCitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9sb2NhdGlvbl90IGxvY2F0aW9uVG9IYWwoQXVkaW9NaWNyb3Bob25lTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICBzd2l0Y2ggKGxvY2F0aW9uKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9VTktOT1dOOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpNQUlOQk9EWToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpNQUlOQk9EWV9NT1ZBQkxFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fTUFJTkJPRFlfTU9WQUJMRTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6UEVSSVBIRVJBTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX1BFUklQSEVSQUw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGxvY2F0aW9uVG9IYWwgY29udmVyc2lvbiAlZCIsIGxvY2F0aW9uKTsKKyAgICB9Cit9CitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25hbGl0eV90IGRpcmVjdGlvbmFsaXR5VG9IYWwoQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHkgZGlyKSB7CisgICAgc3dpdGNoIChkaXIpIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6VU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1VOS05PV047CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6Ok9NTkk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9PTU5JOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpCSV9ESVJFQ1RJT05BTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0JJX0RJUkVDVElPTkFMOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpDQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0NBUkRJT0lEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpIWVBFUl9DQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0hZUEVSX0NBUkRJT0lEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpTVVBFUl9DQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1NVUEVSX0NBUkRJT0lEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBkaXJlY3Rpb25hbGl0eVRvSGFsIGNvbnZlcnNpb24gJWQiLCBkaXIpOworICAgIH0KK30KKwordm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KSB7CisgICAgaWYgKHBEc3QgIT0gTlVMTCkgeworICAgICAgICBzbnByaW50ZihwRHN0LT5kZXZpY2VfaWQsIHNpemVvZihwRHN0LT5kZXZpY2VfaWQpLAorICAgICAgICAgICAgICAgICAiJXMiLCBzcmMuZGV2aWNlSWQuY19zdHIoKSk7CisgICAgICAgIHBEc3QtPmRldmljZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oc3JjLmRldmljZUFkZHJlc3MuZGV2aWNlKTsKKyAgICAgICAgc25wcmludGYocERzdC0+YWRkcmVzcywgc2l6ZW9mKHBEc3QtPmFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAiJXMiLCBkZXZpY2VBZGRyZXNzVG9IYWwoc3JjLmRldmljZUFkZHJlc3MpLmNfc3RyKCkpOworICAgICAgICBpZiAoc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSA+IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKSB7CisgICAgICAgICAgICBBTE9HVygibWljcm9waG9uZUluZm9Ub1N0cnVjdCBmb3VuZCAlenUgY2hhbm5lbE1hcHBpbmcgZWxlbWVudHMuIE1heCBleHBlY3RlZCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICBzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpLCBBVURJT19DSEFOTkVMX0NPVU5UX01BWCk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGNoOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpICYmIGNoIDwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7IGNoKyspIHsKKyAgICAgICAgICAgIHBEc3QtPmNoYW5uZWxfbWFwcGluZ1tjaF0gPSBjaGFubmVsTWFwcGluZ1RvSGFsKHNyYy5jaGFubmVsTWFwcGluZ1tjaF0pOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7CisgICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOworICAgICAgICB9CisgICAgICAgIHBEc3QtPmxvY2F0aW9uID0gbG9jYXRpb25Ub0hhbChzcmMubG9jYXRpb24pOworICAgICAgICBwRHN0LT5ncm91cCA9IChhdWRpb19taWNyb3Bob25lX2dyb3VwX3Qpc3JjLmdyb3VwOworICAgICAgICBwRHN0LT5pbmRleF9pbl90aGVfZ3JvdXAgPSAodW5zaWduZWQgaW50KXNyYy5pbmRleEluVGhlR3JvdXA7CisgICAgICAgIHBEc3QtPnNlbnNpdGl2aXR5ID0gc3JjLnNlbnNpdGl2aXR5OworICAgICAgICBwRHN0LT5tYXhfc3BsID0gc3JjLm1heFNwbDsKKyAgICAgICAgcERzdC0+bWluX3NwbCA9IHNyYy5taW5TcGw7CisgICAgICAgIHBEc3QtPmRpcmVjdGlvbmFsaXR5ID0gZGlyZWN0aW9uYWxpdHlUb0hhbChzcmMuZGlyZWN0aW9uYWxpdHkpOworICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9ICh1bnNpZ25lZCBpbnQpc3JjLmZyZXF1ZW5jeVJlc3BvbnNlLnNpemUoKTsKKyAgICAgICAgaWYgKHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID4gQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUykgeworICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJWQgZnJlcXVlbmN5IHJlc3BvbnNlcy4gTWF4IGV4cGVjdGVkIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzLCBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTKTsKKyAgICAgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzOyBrKyspIHsKKyAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMF1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10uZnJlcXVlbmN5OworICAgICAgICAgICAgcERzdC0+ZnJlcXVlbmN5X3Jlc3BvbnNlc1sxXVtrXSA9IHNyYy5mcmVxdWVuY3lSZXNwb25zZVtrXS5sZXZlbDsKKyAgICAgICAgfQorICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueCA9IHNyYy5wb3NpdGlvbi54OworICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueSA9IHNyYy5wb3NpdGlvbi55OworICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueiA9IHNyYy5wb3NpdGlvbi56OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi54ID0gc3JjLm9yaWVudGF0aW9uLng7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnkgPSBzcmMub3JpZW50YXRpb24ueTsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueiA9IHNyYy5vcmllbnRhdGlvbi56OworICAgIH0KK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYmI5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIENvcmVSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgeworICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOworICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICBDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7CisgICAgICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIHdheSBpdCBhbHNvIHdvcmtzIGZvciBlbnVtIGNsYXNzIHRvIHVuc2NvcGVkIGVudW0gY29udmVyc2lvbi4KKyAgICAgICAgICAgICpyZXR2YWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDxSPihyZXQpKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybihmdW5jTmFtZSwgcmV0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0KSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxDb3JlUmVzdWx0PiYgcmV0KSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQsIENvcmVSZXN1bHQgcmV0dmFsKSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOworCisgICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgQ29yZVJlc3VsdCYgcmVzdWx0KTsKKworICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7Cit9OworCisjaWYgTUFKT1JfVkVSU0lPTiA+PSA0Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046Ok1pY3JvcGhvbmVJbmZvOwordm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KTsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1ZjgyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lQcmltYXJ5RGV2aWNlLmgpCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047CisKK25hbWVzcGFjZSB7CisKK3N0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7CisgICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKKworICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Cit9CisKK0RldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgeworICAgIGlmIChtRGV2aWNlICE9IDApIHsKKyAgICAgICAgbURldmljZS5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKKyAgICAvLyBPYnNvbGV0ZS4KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgQVBJIHNvIHRoYXQgY29udGV4dCBhbmQga3ZQYWlycyBhcmUgc2VwYXJhdGVkCisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1EZXZpY2UsIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycyhtRGV2aWNlLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAorI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCisjZW5kaWYKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKm91dHB1dERldmljZUFkZHJlc3MsCisgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorICAgIGF1dG8gc2lua01ldGFkYXRhID0gQXVkaW9Tb3VyY2Uoc291cmNlKTsKKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgIC8vIFRPRE86IGNvcnJlY3RseSBwcm9wYWdhdGUgdGhlIHRyYWNrcyBzb3VyY2VzIGFuZCB2b2x1bWUKKyAgICAvLyAgICAgICBmb3Igbm93LCBvbmx5IHNlbmQgdGhlIG1haW4gc291cmNlIGF0IDFkYmZzCisgICAgU2lua01ldGFkYXRhIHNpbmtNZXRhZGF0YSA9IHt7eyAuc291cmNlID0gQXVkaW9Tb3VyY2Uoc291cmNlKSwgLmdhaW4gPSAxIH19fTsKKyNlbmRpZgorI2lmIE1BSk9SX1ZFUlNJT04gPCA1CisgICAgKHZvaWQpb3V0cHV0RGV2aWNlOworICAgICh2b2lkKW91dHB1dERldmljZUFkZHJlc3M7CisjZWxzZQorICAgIGlmIChvdXRwdXREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgRGV2aWNlQWRkcmVzcyBoaWRsT3V0cHV0RGV2aWNlOworICAgICAgICBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChvdXRwdXREZXZpY2UsIG91dHB1dERldmljZUFkZHJlc3MsICZoaWRsT3V0cHV0RGV2aWNlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgc2lua01ldGFkYXRhLnRyYWNrc1swXS5kZXN0aW5hdGlvbi5kZXZpY2Uoc3RkOjptb3ZlKGhpZGxPdXRwdXREZXZpY2UpKTsKKyAgICB9CisjZW5kaWYKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgaGlkbERldmljZSwKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBFbnVtQml0ZmllbGQ8QXVkaW9JbnB1dEZsYWc+KGZsYWdzKSwKKyAgICAgICAgICAgIHNpbmtNZXRhZGF0YSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0IGhpZGxQb3J0OworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCisgICAgICAgICAgICBoaWRsUG9ydCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvIF9fdW51c2VkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNyb3Bob25lcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CisgICAgICAgICAgICAvL2NvbnZlcnQKKyAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKKyAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOworfQorI2VuZGlmCisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZDQ2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSURldmljZS5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJUHJpbWFyeURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIC8vIE11dGluZyBjb250cm9sLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOworCisgICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKKworICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7CisKKyAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKKworICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7CisgICAgc3A8SURldmljZT4gbURldmljZTsKKyAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCisgICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2ODI1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxMb2NhbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VIYWxMb2NhbDo6RGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldikKKyAgICAgICAgOiBtRGV2KGRldikgeworfQorCitEZXZpY2VIYWxMb2NhbDo6fkRldmljZUhhbExvY2FsKCkgeworICAgIGludCBzdGF0dXMgPSBhdWRpb19od19kZXZpY2VfY2xvc2UobURldik7CisgICAgQUxPR1dfSUYoc3RhdHVzLCAiRXJyb3IgY2xvc2luZyBhdWRpbyBodyBkZXZpY2UgJXA6ICVzIiwgbURldiwgc3RyZXJyb3IoLXN0YXR1cykpOworICAgIG1EZXYgPSAwOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcykgeworICAgIGlmIChtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICpkZXZpY2VzID0gbURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzKG1EZXYpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmluaXRDaGVjaygpIHsKKyAgICByZXR1cm4gbURldi0+aW5pdF9jaGVjayhtRGV2KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIHJldHVybiBtRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21vZGUobURldiwgbW9kZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+Z2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9wYXJhbWV0ZXJzKG1EZXYsIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtRGV2LT5nZXRfcGFyYW1ldGVycyhtRGV2LCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtRGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUobURldiwgY29uZmlnKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICBpbnQgb3BlblJlc3V0ID0gbURldi0+b3Blbl9vdXRwdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywgY29uZmlnLCAmaGFsU3RyZWFtLCBhZGRyZXNzKTsKKyAgICBpZiAob3BlblJlc3V0ID09IE9LKSB7CisgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKKyAgICB9CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3V0LCBoYWxTdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdXQ7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgLypvdXRwdXREZXZpY2UqLywKKyAgICAgICAgY29uc3QgY2hhciAqLypvdXRwdXREZXZpY2VBZGRyZXNzKi8sCisgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBhdWRpb19zdHJlYW1faW5fdCAqaGFsU3RyZWFtOworICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3ggIgorICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMgc291cmNlICVkIiwKKyAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBhZGRyZXNzLCBzb3VyY2UpOworICAgIGludCBvcGVuUmVzdWx0ID0gbURldi0+b3Blbl9pbnB1dF9zdHJlYW0oCisgICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgJmhhbFN0cmVhbSwgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSk7CisgICAgaWYgKG9wZW5SZXN1bHQgPT0gT0spIHsKKyAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKKyAgICB9CisgICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdWx0LCBpblN0cmVhbSk7CisgICAgcmV0dXJuIG9wZW5SZXN1bHQ7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKKyAgICAqc3VwcG9ydHNQYXRjaGVzID0gdmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzA7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICByZXR1cm4gbURldi0+Y3JlYXRlX2F1ZGlvX3BhdGNoKAorICAgICAgICAgICAgICAgIG1EZXYsIG51bV9zb3VyY2VzLCBzb3VyY2VzLCBudW1fc2lua3MsIHNpbmtzLCBwYXRjaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIHJldHVybiBtRGV2LT5yZWxlYXNlX2F1ZGlvX3BhdGNoKG1EZXYsIHBhdGNoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgcmV0dXJuIG1EZXYtPmdldF9hdWRpb19wb3J0KG1EZXYsIHBvcnQpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQorICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgeworICAgIGlmIChtRGV2LT5nZXRfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOworICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1EZXYtPmdldF9taWNyb3Bob25lcyhtRGV2LCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgeworICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKKyAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7CisgICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOworfQorCit2b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgeworICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Cit9CisKK3ZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7CisgICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkYjcyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbExvY2FsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIC8vIE11dGluZyBjb250cm9sLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOworCisgICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKKworICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7CisKKyAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKKworICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOworICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOworCisgIHByaXZhdGU6CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCisgICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKKworICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwMWU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2UuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKKyAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IGRlZmF1bHRGYWN0b3J5e0lEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpfTsKKyAgICBpZiAoIWRlZmF1bHRGYWN0b3J5KSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElEZXZpY2VzRmFjdG9yeS9kZWZhdWx0IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIG1EZXZpY2VGYWN0b3JpZXMucHVzaF9iYWNrKGRlZmF1bHRGYWN0b3J5KTsKKyAgICBpZiAoTUFKT1JfVkVSU0lPTiA+PSA0KSB7CisgICAgICAgIC8vIFRoZSBNU0QgZmFjdG9yeSBpcyBvcHRpb25hbCBhbmQgb25seSBhdmFpbGFibGUgc3RhcnRpbmcgYXQgSEFMIDQuMAorICAgICAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1zZEZhY3Rvcnl7SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKX07CisgICAgICAgIGlmIChtc2RGYWN0b3J5KSB7CisgICAgICAgICAgICBtRGV2aWNlRmFjdG9yaWVzLnB1c2hfYmFjayhtc2RGYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBtRGV2aWNlRmFjdG9yaWVzKSB7CisgICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UgaW5zdGFuY2UgaXMgb3duZWQKKyAgICAgICAgLy8gYnkgQXVkaW9GbGluZ2VyIGFuZCB0aHVzIGhhdmUgdGhlIHNhbWUgbGlmZXNwYW4uCisgICAgICAgIGZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKKyAgICB9Cit9CisKKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdGljIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlIGlkRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBzdGF0dXNfdCogc3RhdHVzKSB7CisgICAgKnN0YXR1cyA9IE9LOworICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpQUklNQVJZOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFApID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpBMkRQOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1VTQikgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlVTQjsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6Ul9TVUJNSVg7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfU1RVQikgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlNUVUI7CisgICAgfQorICAgIEFMT0dFKCJJbnZhbGlkIGRldmljZSBuYW1lICVzIiwgbmFtZSk7CisgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICByZXR1cm4ge307Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXRpYyBjb25zdCBjaGFyKiBpZEZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QqIHN0YXR1cykgeworICAgICpzdGF0dXMgPSBPSzsKKyAgICByZXR1cm4gbmFtZTsKK30KKyNlbmRpZgorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgaWYgKG1EZXZpY2VGYWN0b3JpZXMuZW1wdHkoKSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGF1dG8gaGlkbElkID0gaWRGcm9tSGFsKG5hbWUsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIGZvciAoY29uc3QgYXV0byYgZmFjdG9yeSA6IG1EZXZpY2VGYWN0b3JpZXMpIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IGZhY3RvcnktPm9wZW5EZXZpY2UoCisgICAgICAgICAgICAgICAgaGlkbElkLAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURldmljZT4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgc3dpdGNoIChyZXR2YWwpIHsKKyAgICAgICAgICAgIC8vIERldmljZSB3YXMgZm91bmQgYW5kIHdhcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCisgICAgICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgICAgIC8vIERldmljZSB3YXMgZm91bmQgYnV0IGZhaWxlZCB0byBpbml0YWxpemUuCisgICAgICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjb250aW51ZSBpdGVyYXRpbmcuCisgICAgICAgICAgICBkZWZhdWx0OiA7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1coIlRoZSBzcGVjaWZpZWQgZGV2aWNlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQ6IFwiJXNcIiIsIG5hbWUpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2UwNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlc0ZhY3RvcnkuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlc0ZhY3Rvcnk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOworCisgICAgc3RkOjp2ZWN0b3I8c3A8SURldmljZXNGYWN0b3J5Pj4gbURldmljZUZhY3RvcmllczsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKKworICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpID0gZGVmYXVsdDsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzdhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQorICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCisgICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgeworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCisgICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOworICAgIH0KKyAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzBkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworCisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1Mb2NhbEZhY3Rvcnk7CisgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1IaWRsRmFjdG9yeTsKK307CisKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpIHsKKyAgICByZXR1cm4gbmV3IERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjdmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQoreworICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7CisgICAgaW50IHJjOworCisgICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7CisgICAgaWYgKHJjKSB7CisgICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOworICAgIGlmIChyYykgeworICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKKyAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7CisgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByZXR1cm4gT0s7CisKK291dDoKKyAgICAqZGV2ID0gTlVMTDsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKKyAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOworICAgIGlmIChyYyA9PSBPSykgeworICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxMDhkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KKworICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQorfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzY3OTcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0QnVmZmVySGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCisvLyBzdGF0aWMKK3VpbnQ2NF90IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1ha2VVbmlxdWVJZCgpIHsKKyAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDY0X3Q+IGNvdW50ZXJ7MX07CisgICAgcmV0dXJuIGNvdW50ZXIrKzsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoCisgICAgICAgIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gbWlycm9yKG51bGxwdHIsIHNpemUsIGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcigKKyAgICAgICAgdm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IHRlbXBCdWZmZXIgPSBuZXcgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4odGVtcEJ1ZmZlci5nZXQoKSktPmluaXQoKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIHRlbXBCdWZmZXItPnNldEV4dGVybmFsRGF0YShleHRlcm5hbCk7CisgICAgICAgICpidWZmZXIgPSB0ZW1wQnVmZmVyOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitFZmZlY3RCdWZmZXJIYWxIaWRsOjpFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKQorICAgICAgICA6IG1CdWZmZXJTaXplKHNpemUpLCBtRnJhbWVDb3VudENoYW5nZWQoZmFsc2UpLAorICAgICAgICAgIG1FeHRlcm5hbERhdGEobnVsbHB0ciksIG1BdWRpb0J1ZmZlcnswLCB7bnVsbHB0cn19IHsKKyAgICBtSGlkbEJ1ZmZlci5pZCA9IG1ha2VVbmlxdWVJZCgpOworICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSAwOworfQorCitFZmZlY3RCdWZmZXJIYWxIaWRsOjp+RWZmZWN0QnVmZmVySGFsSGlkbCgpIHsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6aW5pdCgpIHsKKyAgICBzcDxJQWxsb2NhdG9yPiBhc2htZW0gPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKKyAgICBpZiAoYXNobWVtID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBhc2htZW0gYWxsb2NhdG9yIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IHJldHZhbCA9IE5PX01FTU9SWTsKKyAgICBSZXR1cm48dm9pZD4gcmVzdWx0ID0gYXNobWVtLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgIG1CdWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKGJvb2wgc3VjY2VzcywgY29uc3QgaGlkbF9tZW1vcnkmIG1lbW9yeSkgeworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIG1IaWRsQnVmZmVyLmRhdGEgPSBtZW1vcnk7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXN1bHQuaXNPaygpICYmIHJldHZhbCA9PSBPSykgeworICAgICAgICBtTWVtb3J5ID0gaGFyZHdhcmU6Om1hcE1lbW9yeShtSGlkbEJ1ZmZlci5kYXRhKTsKKyAgICAgICAgaWYgKG1NZW1vcnkgIT0gMCkgeworICAgICAgICAgICAgbU1lbW9yeS0+dXBkYXRlKCk7CisgICAgICAgICAgICBtQXVkaW9CdWZmZXIucmF3ID0gc3RhdGljX2Nhc3Q8dm9pZCo+KG1NZW1vcnktPmdldFBvaW50ZXIoKSk7CisgICAgICAgICAgICBtZW1zZXQobUF1ZGlvQnVmZmVyLnJhdywgMCwgbU1lbW9yeS0+Z2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIG1NZW1vcnktPmNvbW1pdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYXAgYWxsb2NhdGVkIGFzaG1lbSIpOworICAgICAgICAgICAgcmV0dmFsID0gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmcm9tIGFzaG1lbSIsIChpbnQpbUJ1ZmZlclNpemUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LmlzT2soKSA/IHJldHZhbCA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworYXVkaW9fYnVmZmVyX3QqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmF1ZGlvQnVmZmVyKCkgeworICAgIHJldHVybiAmbUF1ZGlvQnVmZmVyOworfQorCit2b2lkKiBFZmZlY3RCdWZmZXJIYWxIaWRsOjpleHRlcm5hbERhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FeHRlcm5hbERhdGE7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCkgeworICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIG1BdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtRnJhbWVDb3VudENoYW5nZWQgPSB0cnVlOworfQorCitib29sIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNoZWNrRnJhbWVDb3VudENoYW5nZSgpIHsKKyAgICBib29sIHJlc3VsdCA9IG1GcmFtZUNvdW50Q2hhbmdlZDsKKyAgICBtRnJhbWVDb3VudENoYW5nZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCkgeworICAgIG1FeHRlcm5hbERhdGEgPSBleHRlcm5hbDsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoKSB7CisgICAgdXBkYXRlKG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoKSB7CisgICAgY29tbWl0KG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47CisgICAgbU1lbW9yeS0+dXBkYXRlKCk7CisgICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOworICAgIG1lbWNweShtQXVkaW9CdWZmZXIucmF3LCBtRXh0ZXJuYWxEYXRhLCBzaXplKTsKKyAgICBtTWVtb3J5LT5jb21taXQoKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47CisgICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOworICAgIG1lbWNweShtRXh0ZXJuYWxEYXRhLCBtQXVkaW9CdWZmZXIucmF3LCBzaXplKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI2ODEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworY2xhc3MgRWZmZWN0QnVmZmVySGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIHN0YXRpYyBzdGF0dXNfdCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgbWlycm9yKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKKworICAgIHZpcnR1YWwgYXVkaW9fYnVmZmVyX3QqIGF1ZGlvQnVmZmVyKCk7CisgICAgdmlydHVhbCB2b2lkKiBleHRlcm5hbERhdGEoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQorCisgICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7CisgICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOworICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7CisKKyAgICBjb25zdCBBdWRpb0J1ZmZlciYgaGlkbEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1IaWRsQnVmZmVyOyB9CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOworCisgICAgc3RhdGljIHVpbnQ2NF90IG1ha2VVbmlxdWVJZCgpOworCisgICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOworICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOworICAgIHZvaWQqIG1FeHRlcm5hbERhdGE7CisgICAgQXVkaW9CdWZmZXIgbUhpZGxCdWZmZXI7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKyAgICBhdWRpb19idWZmZXJfdCBtQXVkaW9CdWZmZXI7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIH5FZmZlY3RCdWZmZXJIYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBpbml0KCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmNTc1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6RW51bUJpdGZpZWxkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKKyAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitFZmZlY3RIYWxIaWRsOjp+RWZmZWN0SGFsSGlkbCgpIHsKKyAgICBpZiAobUVmZmVjdCAhPSAwKSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIG1FZmZlY3QuY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKAorICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKSB7CisgICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7CisgICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7CisgICAgaGFsRGVzY3JpcHRvci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzY3JpcHRvci5mbGFncyk7CisgICAgaGFsRGVzY3JpcHRvci0+Y3B1TG9hZCA9IGRlc2NyaXB0b3IuY3B1TG9hZDsKKyAgICBoYWxEZXNjcmlwdG9yLT5tZW1vcnlVc2FnZSA9IGRlc2NyaXB0b3IubWVtb3J5VXNhZ2U7CisgICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPm5hbWUsIGRlc2NyaXB0b3IubmFtZS5kYXRhKCksIGRlc2NyaXB0b3IubmFtZS5zaXplKCkpOworICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5pbXBsZW1lbnRvciwKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuaW1wbGVtZW50b3IuZGF0YSgpLCBkZXNjcmlwdG9yLmltcGxlbWVudG9yLnNpemUoKSk7Cit9CisKKy8vIFRPRE8obW5hZ2Fub3YpOiBUaGVzZSBidWZmZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIEVmZmVjdCB3cmFwcGVyCisvLyB2aWEgSGlkbFV0aWxzLiBNb3ZlIHRoZW0gdGhlcmUgd2hlbiBoYXJkd2FyZS9pbnRlcmZhY2VzIHdpbGwgZ2V0IHVuLWZyb3plbiBhZ2Fpbi4KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCisgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZykgeworICAgIGNvbmZpZy0+c2FtcGxpbmdSYXRlSHogPSBoYWxDb25maWcuc2FtcGxpbmdSYXRlOworICAgIGNvbmZpZy0+Y2hhbm5lbHMgPSBFbnVtQml0ZmllbGQ8QXVkaW9DaGFubmVsTWFzaz4oaGFsQ29uZmlnLmNoYW5uZWxzKTsKKyAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOworICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7CisgICAgY29uZmlnLT5tYXNrID0gRW51bUJpdGZpZWxkPEVmZmVjdENvbmZpZ1BhcmFtZXRlcnM+KGhhbENvbmZpZy5tYXNrKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAorICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpIHsKKyAgICBoYWxDb25maWctPmJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKKyAgICBoYWxDb25maWctPmJ1ZmZlci5yYXcgPSBOVUxMOworICAgIGhhbENvbmZpZy0+c2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsaW5nUmF0ZUh6OworICAgIGhhbENvbmZpZy0+Y2hhbm5lbHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29uZmlnLmNoYW5uZWxzKTsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5mb3JtYXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuZm9ybWF0KTsKKyAgICBoYWxDb25maWctPmFjY2Vzc01vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuYWNjZXNzTW9kZSk7CisgICAgaGFsQ29uZmlnLT5tYXNrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLm1hc2spOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpIHsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5pbnB1dENmZywgJmNvbmZpZy0+aW5wdXRDZmcpOworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLm91dHB1dENmZywgJmNvbmZpZy0+b3V0cHV0Q2ZnKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZykgeworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5pbnB1dENmZywgJmhhbENvbmZpZy0+aW5wdXRDZmcpOworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5vdXRwdXRDZmcsICZoYWxDb25maWctPm91dHB1dENmZyk7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OlJFU1VMVF9UT09fQklHOiByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKKyAgICB9Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtSW5CdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1JbkJ1ZmZlci5nZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUluQnVmZmVyID0gYnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtT3V0QnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtT3V0QnVmZmVyLmdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1PdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3MoKSB7CisgICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTKSk7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NSZXZlcnNlKCkgeworICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTU19SRVZFUlNFKSk7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByZXBhcmVGb3JQcm9jZXNzaW5nKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPnByZXBhcmVGb3JQcm9jZXNzaW5nKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNUURlc2NyaXB0b3JTeW5jPFJlc3VsdD4mIHN0YXR1c01RKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgJiYgdGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKyAgICBpZiAoIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgZWZmZWN0cyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBFZmZlY3RIYWxIaWRsOjpuZWVkVG9SZXNldEJ1ZmZlcnMoKSB7CisgICAgaWYgKG1CdWZmZXJzQ2hhbmdlZCkgcmV0dXJuIHRydWU7CisgICAgYm9vbCBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbUluQnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKKyAgICBib29sIG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbU91dEJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisgICAgcmV0dXJuIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgfHwgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZykgeworICAgIGlmIChtRWZmZWN0ID09IDAgfHwgbUluQnVmZmVyID09IDAgfHwgbU91dEJ1ZmZlciA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtU3RhdHVzTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JQcm9jZXNzaW5nKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmIChuZWVkVG9SZXNldEJ1ZmZlcnMoKSAmJiAoc3RhdHVzID0gc2V0UHJvY2Vzc0J1ZmZlcnMoKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVycywganVzdCBuZWVkIHRvIGZsdXNoIGl0IGFuZCB3YWtlIHVwIHRoZSBzZXJ2ZXIgc2lkZS4KKyAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICAgbUVmR3JvdXAtPndha2UobXFGbGFnKTsKKyAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKK3JldHJ5OgorICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORykpIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBtU3RhdHVzTVEtPnJlYWQoJnJldHZhbCk7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSyB8fCByZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX1NUQVRFKSB7CisgICAgICAgICAgICAvLyBTeW5jIGJhY2sgdGhlIGNoYW5nZWQgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5hbHl6ZVJlc3VsdChyZXR2YWwpOworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0UHJvY2Vzc0J1ZmZlcnMoKSB7CisgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+c2V0UHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obUluQnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1PdXRCdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCkpOworICAgIGlmIChyZXQuaXNPaygpICYmIHJldCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisKKyAgICAvLyBTcGVjaWFsIGNhc2VzLgorICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFKSB7CisgICAgICAgIHJldHVybiBzZXRDb25maWdJbXBsKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIH0gZWxzZSBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRSkgeworICAgICAgICByZXR1cm4gZ2V0Q29uZmlnSW1wbChjbWRDb2RlLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIH0KKworICAgIC8vIENvbW1vbiBjYXNlLgorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhpZGxEYXRhOworICAgIGlmIChwQ21kRGF0YSAhPSBudWxscHRyICYmIGNtZFNpemUgPiAwKSB7CisgICAgICAgIGhpZGxEYXRhLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocENtZERhdGEpLCBjbWRTaXplKTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZVN0dWIgPSAwOworICAgIGlmIChyZXBseVNpemUgPT0gbnVsbHB0ciB8fCBwUmVwbHlEYXRhID09IG51bGxwdHIpIHJlcGx5U2l6ZSA9ICZyZXBseVNpemVTdHViOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGhpZGxEYXRhLCAqcmVwbHlTaXplLAorICAgICAgICAgICAgWyZdKGludDMyX3QgcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcmVwbHlTaXplID4gcmVzdWx0LnNpemUoKSkgKnJlcGx5U2l6ZSA9IHJlc3VsdC5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IG51bGxwdHIgJiYgKnJlcGx5U2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCAmcmVzdWx0WzBdLCAqcmVwbHlTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiByZXQuaXNPaygpID8gc3RhdHVzIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5nZXREZXNjcmlwdG9yKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNsb3NlKCkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPmNsb3NlKCk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAorICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBSZXR1cm48dm9pZD4gcmV0OworICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgeworICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOworICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7CisgICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKKyAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8CisgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7CisgICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOworICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KKyAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6CisgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOworICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7CisgICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMzhjMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vSUVmZmVjdC5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOworCitjbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOworCisgICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7CisKKyAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKKworICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCisgICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKKworICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOworCisgICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisKKyAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9CisKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCisgICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CisKKyAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OworICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7CisgICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAorICAgICAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKKyAgICAgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZyk7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCisgICAgdmlydHVhbCB+RWZmZWN0SGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgZ2V0Q29uZmlnSW1wbCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUHJvY2Vzc2luZygpOworICAgIGJvb2wgbmVlZFRvUmVzZXRCdWZmZXJzKCk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKTsKKyAgICBzdGF0dXNfdCBzZXRDb25maWdJbXBsKAorICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDZiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKKyAgICBtRWZmZWN0c0ZhY3RvcnkgPSBJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKKyAgICB9CisgICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKKyAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKKyAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKKyAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBxdWVyeVJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAorICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCisgICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgorICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OworICAgIH0KKyAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKKyAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgVXVpZCBoaWRsVXVpZDsKKyAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAorICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTc4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi9JRWZmZWN0c0ZhY3RvcnkuaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OkNQUF9WRVJTSU9OOjpDb252ZXJzaW9uSGVscGVySGlkbDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlZmZlY3RzIGluIGFsbCBsb2FkZWQgbGlicmFyaWVzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7CisKKyAgICAvLyBSZXR1cm5zIGEgZGVzY3JpcHRvciBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZWZmZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcih1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIC8vIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgLy8gVG8gcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcworICAgIC8vIHRvIHRoZSByZXR1cm5lZCBlZmZlY3Qgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAorICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKKyAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBFZmZlY3RzKGludCBmZCk7CisKKyAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBtaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7CisgICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKKworICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKK307CisKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpIHsKKyAgICByZXR1cm4gbmV3IEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzk2Y2YzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtMCwwICsxLDg4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0Q2FsbGJhY2suaCkKKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBFZmZlY3RIYWxIaWRsID0gOjphbmRyb2lkOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpFZmZlY3RIYWxIaWRsOwordXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047CisKK1N0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCisgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCksCisgICAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUoMCl7CisKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgWyZdKGF1dG8gc3IsIGF1dG8gbSwgYXV0byBmKSB7CisgICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOworICAgICAgICAgICAgfSk7CisgICAgfQorfQorCitTdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKKyAgICBtU3RyZWFtID0gbnVsbHB0cjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFNhbXBsZVJhdGUiLCBtU3RyZWFtLT5nZXRTYW1wbGVSYXRlKCksIHJhdGUpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSA9ICpzaXplOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENoYW5uZWxNYXNrIiwgbVN0cmVhbS0+Z2V0Q2hhbm5lbE1hc2soKSwgbWFzayk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Rm9ybWF0IiwgbVN0cmVhbS0+Z2V0Rm9ybWF0KCksIGZvcm1hdCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBhdXRvIG0sIGF1dG8gZikgeworICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gc3I7CisgICAgICAgICAgICAgICAgKm1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSk7CisgICAgICAgICAgICAgICAgKmZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1Byb3BlcnRpZXMiLCByZXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6c2V0UGFyYW1ldGVycyhtU3RyZWFtLCB7fSAvKiBjb250ZXh0ICovLCBoaWRsUGFyYW1zKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgdmFsdWVzLT5jbGVhcigpOworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgIG1TdHJlYW0sCisgICAgICAgICAgICB7fSAvKiBjb250ZXh0ICovLAorICAgICAgICAgICAgaGlkbEtleXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJhZGRFZmZlY3QiLCBtU3RyZWFtLT5hZGRFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbW92ZUVmZmVjdCIsIG1TdHJlYW0tPnJlbW92ZUVmZmVjdCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhbmRieSgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFuZGJ5IiwgbVN0cmVhbS0+c3RhbmRieSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAorICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBhdWRpb19tbWFwX2J1ZmZlcl9mbGFnKGhpZGxJbmZvLmZsYWdzKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGJ1ZmZlciBzaXplIGZyYW1lIHdhcyBhIGhhY2sgaW4gTyBhbmQgUCB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzIHNoYXJlYWJsZSB0byBhcHBsaWNhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzICo9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzIHwgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVyc3Rfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idXJzdFNpemVGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgaXMgbm90IG5lZWRlZCBpbiBISURMIGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVNbWFwQnVmZmVyIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT50aW1lX25hbm9zZWNvbmRzID0gaGlkbFBvc2l0aW9uLnRpbWVOYW5vc2Vjb25kczsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnBvc2l0aW9uX2ZyYW1lcyA9IGhpZGxQb3NpdGlvbi5wb3NpdGlvbkZyYW1lczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TW1hcFBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKKyAgICBtSGFsVGhyZWFkUHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKKyAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKK30KKworYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgeworICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KAorICAgICAgICAgICAgdGhyZWFkUGlkLCB0aHJlYWRJZCwKKyAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgZmFsc2UgLyppc0ZvckFwcCovLCB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOworICAgIEFMT0dFX0lGKGVyciwgImZhaWxlZCB0byBzZXQgcHJpb3JpdHkgJWQgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKKyAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgdGhyZWFkUGlkLCB0aHJlYWRJZCwgZXJyKTsKKyAgICAvLyBBdWRpbyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBsYXRlbmN5IHdpbGwgYmUgaGlnaGVyIGFuZCBzb21ldGltZXMgdW5hY2NlcHRhYmxlLgorICAgIHJldHVybiBlcnIgPT0gMDsKK30KKworbmFtZXNwYWNlIHsKKworLyogTm90ZXMgb24gY2FsbGJhY2sgb3duZXJzaGlwLgorCitUaGlzIGlzIGhvdyAoSHcpQmluZGVyIG93bmVyc2hpcCBtb2RlbCBsb29rcyBsaWtlLiBUaGUgc2VydmVyIGltcGxlbWVudGF0aW9uCitpcyBvd25lZCBieSBCaW5kZXIgZnJhbWV3b3JrICh2aWEgc3A8PikuIFByb3hpZXMgYXJlIG93bmVkIGJ5IGNsaWVudHMuCitXaGVuIHRoZSBsYXN0IHByb3h5IGRpc2FwcGVhcnMsIEJpbmRlciBmcmFtZXdvcmsgcmVsZWFzZXMgdGhlIHNlcnZlciBpbXBsLgorCitUaHVzLCBpdCBpcyBub3QgbmVlZGVkIHRvIGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gU3RyZWFtT3V0Q2FsbGJhY2sgKHRoaXMgaXMKK3RoZSBzZXJ2ZXIgaW1wbCkgLS0gaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgSEFMIHNlcnZlciBob2xkcyBhIHN0cm9uZyByZWYgdG8KK0lTdHJlYW1PdXRDYWxsYmFjayBwcm94eS4gV2UgY2xlYXIgdGhhdCByZWZlcmVuY2UgYnkgY2FsbGluZyAnY2xlYXJDYWxsYmFjaycKK2Zyb20gdGhlIGRlc3RydWN0b3Igb2YgU3RyZWFtT3V0SGFsSGlkbC4KKworVGhlIGNhbGxiYWNrIG9ubHkga2VlcHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIG93bmVkCitieSBBdWRpb0ZsaW5nZXIuCisKKyovCisKK3N0cnVjdCBTdHJlYW1PdXRDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0Q2FsbGJhY2sgeworICAgIFN0cmVhbU91dENhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9CisKKyAgICAvLyBJU3RyZWFtT3V0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgICBSZXR1cm48dm9pZD4gb25Xcml0ZVJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbldyaXRlUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkRyYWluUmVhZHkoKSAgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7CisgICAgICAgICAgICBzdHJlYW0tPm9uRHJhaW5SZWFkeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoKSAgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7CisgICAgICAgICAgICBzdHJlYW0tPm9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK1N0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgeworICAgIGlmIChtU3RyZWFtICE9IDApIHsKKyAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsZWFyQ2FsbGJhY2siLCBtU3RyZWFtLT5jbGVhckNhbGxiYWNrKCkpOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7CisgICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKKyAgICB9CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICBpZiAobUVmR3JvdXApIHsKKyAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgeworICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9MQVRFTkNZLCAiZ2V0TGF0ZW5jeSIsIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeSA9IHdyaXRlU3RhdHVzLnJlcGx5LmxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TGF0ZW5jeSIsIG1TdHJlYW0tPmdldExhdGVuY3koKSwgbGF0ZW5jeSk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9sdW1lIiwgbVN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSk7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGQ6OnZlY3RvcjxQYXJhbWV0ZXJWYWx1ZT4gcGFyYW1ldGVyczsKKyAgICBTdHJpbmc4IGhhbFBhcmFtZXRlcnM7CisgICAgcGFyYW1ldGVycy5wdXNoX2JhY2soe0F1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCwgc3RkOjp0b19zdHJpbmcocHJlc2VudGF0aW9uSWQpfSk7CisgICAgcGFyYW1ldGVycy5wdXNoX2JhY2soe0F1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQsIHN0ZDo6dG9fc3RyaW5nKHByb2dyYW1JZCl9KTsKKyAgICBwYXJhbWV0ZXJzVG9IYWwoaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+KHBhcmFtZXRlcnMpLCAmaGFsUGFyYW1ldGVycyk7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMoaGFsUGFyYW1ldGVycyk7Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2VsZWN0UHJlc2VudGF0aW9uIiwKKyAgICAgICAgICAgIG1TdHJlYW0tPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKSk7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICp3cml0dGVuID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgd3JpdGUgcmVxdWVzdC4KKyAgICAgICAgQUxPR1dfSUYobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtRGF0YU1RKSB7CisgICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKKyAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCisgICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKKyAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KKyAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7CisgICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAorICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47CisgICAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpY3Mgb2YgdGhlIGNhdXNlIG9mIGIvMzU4MTMxMTMuCisgICAgICAgICAgICAgICAgQUxPR0VfSUYoKndyaXR0ZW4gPiBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAorICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFN0cmVhbU91dEhhbEhpZGw6OldyaXRlckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmY21kKSkgeworICAgICAgICBBTE9HRSgiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbURhdGFNUS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBpZiAoZGF0YVNpemUgPiBhdmFpbGFibGVUb1dyaXRlKSB7CisgICAgICAgICAgICBBTE9HVygidHJ1bmNhdGluZyB3cml0ZSBkYXRhIGZyb20gJWxsZCB0byAlbGxkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YSBxdWV1ZSBzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGF0YVNpemUsIChsb25nIGxvbmcpYXZhaWxhYmxlVG9Xcml0ZSk7CisgICAgICAgICAgICBkYXRhU2l6ZSA9IGF2YWlsYWJsZVRvV3JpdGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRGF0YU1RLT53cml0ZShkYXRhLCBkYXRhU2l6ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpOworCisgICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKKyAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKK3JldHJ5OgorICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSkgeworICAgICAgICBXcml0ZVN0YXR1cyB3cml0ZVN0YXR1czsKKyAgICAgICAgd3JpdGVTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZ3cml0ZVN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyaXRlU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHdyaXRlU3RhdHVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgd3JpdGVTdGF0dXMucmV0dmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvcldyaXRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvcldyaXRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVdyaXRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlbmRlclBvc2l0aW9uKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBpbnQ2NF90IHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqdGltZXN0YW1wID0gdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCisgICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKKyAgICAgICAgICAgICAgICAqc3VwcG9ydHNQYXVzZSA9IHA7CisgICAgICAgICAgICAgICAgKnN1cHBvcnRzUmVzdW1lID0gcjsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c1BhdXNlQW5kUmVzdW1lIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0RyYWluIiwgbVN0cmVhbS0+c3VwcG9ydHNEcmFpbigpLCBzdXBwb3J0c0RyYWluKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgeworICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04sICJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24uZnJhbWVzOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dlNlYzsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2TlNlYzsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXN1bHQgcmV0dmFsOworICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCBjb25zdCBUaW1lU3BlYyYgaGlkbFRpbWVTdGFtcCkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSBoaWRsVGltZVN0YW1wLnR2U2VjOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gaGlkbFRpbWVTdGFtcC50dk5TZWM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIC8qIHNvdXJjZU1ldGFkYXRhICovKSB7CisgICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzb3VyY2UgbWV0YWRhdGEKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKKy8qKiBUcmFuc2Zvcm0gYSBzdGFuZGFyZCBjb2xsZWN0aW9uIHRvIGFuIEhJREwgdmVjdG9yLiAqLwordGVtcGxhdGUgPGNsYXNzIFZhbHVlcywgY2xhc3MgRWxlbWVudENvbnZlcnRlcj4KK3N0YXRpYyBhdXRvIHRyYW5zZm9ybVRvSGlkbFZlYyhjb25zdCBWYWx1ZXMmIHZhbHVlcywgRWxlbWVudENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKyAgICBoaWRsX3ZlYzxkZWNsdHlwZShjb252ZXJ0ZXIoKnZhbHVlcy5iZWdpbigpKSk+IHJlc3VsdHt2YWx1ZXMuc2l6ZSgpfTsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIHRyYW5zZm9ybShiZWdpbih2YWx1ZXMpLCBlbmQodmFsdWVzKSwgYmVnaW4ocmVzdWx0KSwgY29udmVydGVyKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyAgICBDUFBfVkVSU0lPTjo6U291cmNlTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7CisgICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc291cmNlTWV0YWRhdGEudHJhY2tzLAorICAgICAgICAgICAgICBbXShjb25zdCBwbGF5YmFja190cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFBsYXliYWNrVHJhY2tNZXRhZGF0YSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgICAudXNhZ2U9c3RhdGljX2Nhc3Q8QXVkaW9Vc2FnZT4obWV0YWRhdGEudXNhZ2UpLAorICAgICAgICAgICAgICAgICAgICAuY29udGVudFR5cGU9c3RhdGljX2Nhc3Q8QXVkaW9Db250ZW50VHlwZT4obWV0YWRhdGEuY29udGVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0pfTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU291cmNlTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworfQorI2VuZGlmCisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25Xcml0ZVJlYWR5KCkgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbldyaXRlUmVhZHkiKTsKKyAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Cit9CisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25EcmFpblJlYWR5KCkgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkRyYWluUmVhZHkiKTsKKyAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Cit9CisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25FcnJvcigpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25FcnJvciIpOworICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Cit9CisKKworU3RyZWFtSW5IYWxIaWRsOjpTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtUmVhZGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK1N0cmVhbUluSGFsSGlkbDo6flN0cmVhbUluSGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7CisgICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldEdhaW4oZmxvYXQgZ2FpbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRHYWluIiwgbVN0cmVhbS0+c2V0R2FpbihnYWluKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgKnJlYWQgPSAwOworCisgICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSByZWFkIHJlcXVlc3QuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtRGF0YU1RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUmVhZGluZyhieXRlcykpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOworICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OlJFQUQ7CisgICAgcGFyYW1zLnBhcmFtcy5yZWFkID0gYnl0ZXM7CisgICAgc3RhdHVzID0gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKKyAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF2YWlsVG9SZWFkID0gbURhdGFNUS0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKCFtRGF0YU1RLT5yZWFkKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBzdGQ6Om1pbihieXRlcywgYXZhaWxUb1JlYWQpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHJlYWQgZmFpbGVkIGZvciBcInJlYWRcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HV19JRihhdmFpbFRvUmVhZCAhPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiSEFMIHJlYWQgcmVwb3J0IGluY29uc2lzdGVudDogbXEgPSAlZCwgc3RhdHVzID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYXZhaWxUb1JlYWQsIChpbnQzMl90KXJlYWRTdGF0dXMucmVwbHkucmVhZCk7CisgICAgICAgICAgICAgICAgKnJlYWQgPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQ7CisgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKnJlYWQpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Y2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgU3RyZWFtSW5IYWxIaWRsOjpSZWFkZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJnBhcmFtcykpIHsKKyAgICAgICAgQUxPR1coImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKTsKKworICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSkgeworICAgICAgICBSZWFkU3RhdHVzIHJlYWRTdGF0dXM7CisgICAgICAgIHJlYWRTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZyZWFkU3RhdHVzKSkgeworICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgICAgICAgaWYgKHJlYWRTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICAgICAgY2FsbGJhY2socmVhZFN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHJlYWRTdGF0dXMucmV0dmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yUmVhZGluZygKKyAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yUmVhZGluZyIsIHJldCwgcmV0dmFsKTsKKyAgICB9CisgICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciByZWFkaW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKKworICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7CisgICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICBtUmVhZGVyQ2xpZW50ID0gZ2V0dGlkKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEZyYW1lc0xvc3QiLCBtU3RyZWFtLT5nZXRJbnB1dEZyYW1lc0xvc3QoKSwgZnJhbWVzTG9zdCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUmVhZGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOworICAgICAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpHRVRfQ0FQVFVSRV9QT1NJVElPTjsKKyAgICAgICAgcmV0dXJuIGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24uZnJhbWVzOworICAgICAgICAgICAgICAgICAgICAqdGltZSA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLnRpbWU7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbDsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIHVpbnQ2NF90IGhpZGxUaW1lKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAqdGltZSA9IGhpZGxUaW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDYXB0dXJlUG9zaXRpb24iLCByZXQsIHJldHZhbCk7CisgICAgfQorfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IFN0cmVhbUluSGFsSW50ZXJmYWNlOjpTaW5rTWV0YWRhdGEmIC8qIHNpbmtNZXRhZGF0YSAqLykgeworICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc2luayBtZXRhZGF0YQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKKyAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQKKyAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKKyAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEFjdGl2ZU1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdAorICAgICAgICBTdHJlYW1JbkhhbEludGVyZmFjZTo6U2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKKyAgICBDUFBfVkVSU0lPTjo6U2lua01ldGFkYXRhIGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNpbmtNZXRhZGF0YS50cmFja3MsCisgICAgICAgICAgICAgIFtdKGNvbnN0IHJlY29yZF90cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFJlY29yZFRyYWNrTWV0YWRhdGEgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgLnNvdXJjZT1zdGF0aWNfY2FzdDxBdWRpb1NvdXJjZT4obWV0YWRhdGEuc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0pfTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Cit9CisjZW5kaWYKKworI2lmIE1BSk9SX1ZFUlNJT04gPCA1CitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24gX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20gX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxzZQorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljcm9waG9uZURpcmVjdGlvbiIsCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+c2V0TWljcm9waG9uZURpcmVjdGlvbihzdGF0aWNfY2FzdDxNaWNyb3Bob25lRGlyZWN0aW9uPihkaXJlY3Rpb24pKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24iLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKSk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjMTA2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1Jbi5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0LmgpCisjaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKK3VzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKK3VzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwordXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxIaWRsOworCitjbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7CisgICAgSVN0cmVhbSAqbVN0cmVhbTsKKyAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OworICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLy8gU2VsZWN0cyB0aGUgYXVkaW8gcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KKyAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOworICAgIHZvaWQgb25EcmFpblJlYWR5KCk7CisgICAgdm9pZCBvbkVycm9yKCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7CisKKyAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKKyAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gU2V0IG1pY3JvcGhvbmUgZGlyZWN0aW9uIChmb3IgcHJvY2Vzc2luZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIG92ZXJyaWRlOworCisgICAgLy8gU2V0IG1pY3JvcGhvbmUgem9vbSAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgb3ZlcnJpZGU7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CisKKyAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROworICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OworICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKKworICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKKyAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAorICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYjgwOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK1N0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgeworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgeworICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSkpOworICAgIH0KK30KKworU3RyZWFtSGFsTG9jYWw6On5TdHJlYW1IYWxMb2NhbCgpIHsKKyAgICBtU3RyZWFtID0gMDsKKyAgICBtRGV2aWNlLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7CisgICAgKnJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IG1TdHJlYW0tPmdldF9idWZmZXJfc2l6ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgeworICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKKyAgICAqc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKKyAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKKyAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga3ZQYWlycy5zdHJpbmcoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1TdHJlYW0tPmdldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGtleXMuc3RyaW5nKCkpOworICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgeworICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7CisgICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnN0YW5kYnkoKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YW5kYnkobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7CisgICAgLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhcyBsb2NhbCBoYWwgaXMgZXhlY3V0ZWQgYnkgYXVkaW9mbGluZ2VyIGRpcmVjdGx5CisgICAgLy8gb24gdGhlIHNhbWUgdGhyZWFkLgorICAgIHJldHVybiBPSzsKK30KKworU3RyZWFtT3V0SGFsTG9jYWw6OlN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKK30KKworU3RyZWFtT3V0SGFsTG9jYWw6On5TdHJlYW1PdXRIYWxMb2NhbCgpIHsKKyAgICBtQ2FsbGJhY2suY2xlYXIoKTsKKyAgICBtRGV2aWNlLT5jbG9zZU91dHB1dFN0cmVhbShtU3RyZWFtKTsKKyAgICBtU3RyZWFtID0gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7CisgICAgKmxhdGVuY3kgPSBtU3RyZWFtLT5nZXRfbGF0ZW5jeShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF92b2x1bWUobVN0cmVhbSwgbGVmdCwgcmlnaHQpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCksIHByZXNlbnRhdGlvbklkKTsKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkKSwgcHJvZ3JhbUlkKTsKKyAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CisgICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgeworICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKndyaXR0ZW4gPSAwOworICAgICAgICByZXR1cm4gd3JpdGVSZXN1bHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgeworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1TdHJlYW0sIGRzcEZyYW1lcyk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcChtU3RyZWFtLCB0aW1lc3RhbXApOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF9jYWxsYmFjayA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2NhbGxiYWNrKG1TdHJlYW0sIFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrLCB0aGlzKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBzdGF0aWMKK2ludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCosIHZvaWQgKmNvb2tpZSkgeworICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQorICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcworICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5CisgICAgLy8gZGVjcmVtZW50ZWQuCisgICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7CisgICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7CisgICAgaWYgKHNlbGYgPT0gMCkgcmV0dXJuIDA7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuIDA7CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2soKSBldmVudCAlZCIsIGV2ZW50KTsKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9XUklURV9SRUFEWToKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRFJBSU5fUkVBRFk6CisgICAgICAgICAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0VSUk9SOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coImFzeW5jQ2FsbGJhY2soKSB1bmtub3duIGV2ZW50ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgeworICAgICpzdXBwb3J0c1BhdXNlID0gbVN0cmVhbS0+cGF1c2UgIT0gTlVMTDsKKyAgICAqc3VwcG9ydHNSZXN1bWUgPSBtU3RyZWFtLT5yZXN1bWUgIT0gTlVMTDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpwYXVzZSgpIHsKKyAgICBpZiAobVN0cmVhbS0+cGF1c2UgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5wYXVzZShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnJlc3VtZSgpIHsKKyAgICBpZiAobVN0cmVhbS0+cmVzdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+cmVzdW1lKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7CisgICAgKnN1cHBvcnRzRHJhaW4gPSBtU3RyZWFtLT5kcmFpbiAhPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBpZiAobVN0cmVhbS0+ZHJhaW4gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5kcmFpbihtU3RyZWFtLCBlYXJseU5vdGlmeSA/IEFVRElPX0RSQUlOX0VBUkxZX05PVElGWSA6IEFVRElPX0RSQUlOX0FMTCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpmbHVzaCgpIHsKKyAgICBpZiAobVN0cmVhbS0+Zmx1c2ggPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5mbHVzaChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgeworICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBtZXRhZGF0YSB7CisgICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCisgICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQorICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YSo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAorICAgIH07CisgICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgeworICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RvcCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgeworICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOworfQorCitTdHJlYW1JbkhhbExvY2FsOjpTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgeworfQorCitTdHJlYW1JbkhhbExvY2FsOjp+U3RyZWFtSW5IYWxMb2NhbCgpIHsKKyAgICBtRGV2aWNlLT5jbG9zZUlucHV0U3RyZWFtKG1TdHJlYW0pOworICAgIG1TdHJlYW0gPSAwOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldEdhaW4oZmxvYXQgZ2FpbikgeworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZ2FpbihtU3RyZWFtLCBnYWluKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7CisgICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKKyAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKKyAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgICpyZWFkID0gMDsKKyAgICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICAqZnJhbWVzTG9zdCA9IG1TdHJlYW0tPmdldF9pbnB1dF9mcmFtZXNfbG9zdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKKyAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBtZXRhZGF0YSB7CisgICAgICAgIC50cmFja19jb3VudCA9IHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAorICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhKj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAorICAgIH07CisgICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgeworICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgeworICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9hY3RpdmVfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOworICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmdldF9hY3RpdmVfbWljcm9waG9uZXMobVN0cmVhbSwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKKyAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7CisgICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNQorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbiBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20gX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxzZQorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9kaXJlY3Rpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9kaXJlY3Rpb24obVN0cmVhbSwgZGlyZWN0aW9uKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uKG1TdHJlYW0sIHpvb20pOworCit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDZjNTBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKK2NsYXNzIFN0cmVhbUhhbExvY2FsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKKworICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKworICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgPSAwOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKKworICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKKyAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCB+U3RyZWFtSGFsTG9jYWwoKTsKKworICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOworCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOworfTsKKworY2xhc3MgU3RyZWFtT3V0SGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworCisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKworICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07CisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOworCisgICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKKworICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKKworICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAorICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gU2V0cyBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKworICAgIC8vIFNldHMgbWljcm9waG9uZSB6b29tIChmb3IgcHJvY2Vzc2luZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1faW5fdCAqbVN0cmVhbTsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxMb2NhbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkMzkxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvUG93ZXJMb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBTdHJlYW1Qb3dlckxvZyB7CitwdWJsaWM6CisgICAgU3RyZWFtUG93ZXJMb2coKSA6CisgICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKKyAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAorICAgICAgICBtRnJhbWVTaXplKDApIHsKKyAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KKyAgICB9CisKKyAgICB+U3RyZWFtUG93ZXJMb2coKSB7CisgICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCisgICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKKyAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7CisgICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCisgICAgfQorCisgICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgorICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKKyAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAorICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOworICAgIH0KKworICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgorICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCisgICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAorICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOworICAgIH0KKworcHJpdmF0ZToKKworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgeworICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAorICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOworICAgIH0KKworICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLworICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOworCisgICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOworICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7CisgICAgc2l6ZV90IG1GcmFtZVNpemU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvblV0aWxzLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMGE0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU19ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CituYW1lc3BhY2UgdXRpbHMgeworCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+CitSZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAvKmNvbnRleHQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBrZXlzLCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgIHJldHVybiBvYmplY3QtPmdldFBhcmFtZXRlcnMoa2V5cywgY2FsbGJhY2spOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1JldHVybjxSZXN1bHQ+IHNldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gLypjb250ZXh0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7CisgICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhrZXlzKTsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENhbGxiYWNrPgorUmV0dXJuPHZvaWQ+IGdldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBrZXlzLCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgIHJldHVybiBvYmplY3QtPmdldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cywgY2FsbGJhY2spOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1JldHVybjxSZXN1bHQ+IHNldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGtleXMpIHsKKyAgICByZXR1cm4gb2JqZWN0LT5zZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMpOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9pbmNsdWRlL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczMTlkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICisKKy8qKiBAZmlsZSBMaWJyYXJ5IGVudHJ5IHBvaW50cyB0byBjcmVhdGUgdGhlIEhBTCBmYWN0b3JpZXMuICovCisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIFYyXzAgeworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCisKK25hbWVzcGFjZSBWNF8wIHsKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjRfMAorCituYW1lc3BhY2UgVjVfMCB7CitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY1XzAKK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorCituYW1lc3BhY2UgVjJfMCB7CitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFYyXzAKKworbmFtZXNwYWNlIFY0XzAgeworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNF8wCisKK25hbWVzcGFjZSBWNV8wIHsKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjVfMAorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKaW5kZXggN2RlOGViMy4uZTU2NTIzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCkBAIC04NCw2ICs4NCw4IEBACiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAogICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgPSAwOwogCiAgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCmluZGV4IDkyNjIyYWEuLjAzMTY1YmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaApAQCAtNTUsNiArNTUsOCBAQAogICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgogICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgPSAwOworCiAgIHByb3RlY3RlZDoKICAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KICAgICBFZmZlY3RIYWxJbnRlcmZhY2UoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKaW5kZXggYzk2OWUyOC4uZWQ4MjgyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCkBAIC0xMDksNiArMTA5LDkgQEAKICAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpID0gMDsKIAorICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpID0gMDsKKwogICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCiAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSA9IDA7CiAKQEAgLTE3Niw2ICsxNzksMTIgQEAKICAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgPSAwOwogCisgICAgLy8gU2V0IGRpcmVjdGlvbiBmb3IgY2FwdHVyZSBwcm9jZXNzaW5nCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QpID0gMDsKKworICAgIC8vIFNldCB6b29tIGZhY3RvciBmb3IgY2FwdHVyZSBzdHJlYW0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSA9IDA7CisKICAgICBzdHJ1Y3QgU2lua01ldGFkYXRhIHsKICAgICAgICAgc3RkOjp2ZWN0b3I8cmVjb3JkX3RyYWNrX21ldGFkYXRhX3Q+IHRyYWNrczsKICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icAppbmRleCA4MTdmYjBiLi5jYjc4MDYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTEgQEAKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnNvbmljIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnZpYnJhdG9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IGYzZWE4MjYuLmY3Y2MwOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKQEAgLTExMywxMCArMTEzLDEwIEBACiAgICAgICAgIC8vIEludGVnZXIgdm9sdW1lLgogICAgICAgICAvLyBDdXJyZW50bHkgaW50ZWdlciB2b2x1bWUgaXMga2VwdCBmb3IgdGhlIGxlZ2FjeSBpbnRlZ2VyIG1peGVyLgogICAgICAgICAvLyBXaWxsIGJlIHJlbW92ZWQgd2hlbiB0aGUgbGVnYWN5IG1peGVyIHBhdGggaXMgcmVtb3ZlZC4KLSAgICAgICAgdC0+dm9sdW1lWzBdID0gVU5JVFlfR0FJTl9JTlQ7Ci0gICAgICAgIHQtPnZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fSU5UOwotICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gVU5JVFlfR0FJTl9JTlQgPDwgMTY7Ci0gICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSBVTklUWV9HQUlOX0lOVCA8PCAxNjsKKyAgICAgICAgdC0+dm9sdW1lWzBdID0gMDsKKyAgICAgICAgdC0+dm9sdW1lWzFdID0gMDsKKyAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IDAgPDwgMTY7CisgICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSAwIDw8IDE2OwogICAgICAgICB0LT52b2x1bWVJbmNbMF0gPSAwOwogICAgICAgICB0LT52b2x1bWVJbmNbMV0gPSAwOwogICAgICAgICB0LT5hdXhMZXZlbCA9IDA7CkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSAwOwogCiAgICAgICAgIC8vIEZsb2F0aW5nIHBvaW50IHZvbHVtZS4KLSAgICAgICAgdC0+bVZvbHVtZVswXSA9IFVOSVRZX0dBSU5fRkxPQVQ7Ci0gICAgICAgIHQtPm1Wb2x1bWVbMV0gPSBVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICB0LT5tUHJldlZvbHVtZVswXSA9IFVOSVRZX0dBSU5fRkxPQVQ7Ci0gICAgICAgIHQtPm1QcmV2Vm9sdW1lWzFdID0gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgdC0+bVZvbHVtZVswXSA9IDAuZjsKKyAgICAgICAgdC0+bVZvbHVtZVsxXSA9IDAuZjsKKyAgICAgICAgdC0+bVByZXZWb2x1bWVbMF0gPSAwLmY7CisgICAgICAgIHQtPm1QcmV2Vm9sdW1lWzFdID0gMC5mOwogICAgICAgICB0LT5tVm9sdW1lSW5jWzBdID0gMC47CiAgICAgICAgIHQtPm1Wb2x1bWVJbmNbMV0gPSAwLjsKICAgICAgICAgdC0+bUF1eExldmVsID0gMC47CkBAIC0xMzYsNiArMTM2LDkgQEAKIAogICAgICAgICAvLyBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQKICAgICAgICAgLy8gdC0+ZnJhbWVDb3VudAorICAgICAgICB0LT5tSGFwdGljQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICAgICAgdC0+bUhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tSGFwdGljQ2hhbm5lbE1hc2spOworICAgICAgICBjaGFubmVsTWFzayAmPSB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOwogICAgICAgICB0LT5jaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwogICAgICAgICB0LT5lbmFibGVkID0gZmFsc2U7CiAgICAgICAgIEFMT0dWX0lGKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLApAQCAtMTYyLDYgKzE2NSwxNiBAQAogICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04sIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CiAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tTWl4ZXJDaGFubmVsTWFzayk7CiAgICAgICAgIHQtPm1QbGF5YmFja1JhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgICAgIC8vIGhhcHRpYworICAgICAgICB0LT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7CisgICAgICAgIHQtPm1IYXB0aWNJbnRlbnNpdHkgPSBIQVBUSUNfU0NBTEVfTk9ORTsKKyAgICAgICAgdC0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgICAgIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHQtPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudCArIHQtPm1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1BZGp1c3RPdXRDaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQgKyB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gdC0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdC0+bUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50OworICAgICAgICB0LT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGZhbHNlOwogICAgICAgICAvLyBDaGVjayB0aGUgZG93bm1peGluZyAob3IgdXBtaXhpbmcpIHJlcXVpcmVtZW50cy4KICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdC0+cHJlcGFyZUZvckRvd25taXgoKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewpAQCAtMTcxLDYgKzE4NCw4IEBACiAgICAgICAgIC8vIHByZXBhcmVGb3JEb3dubWl4KCkgbWF5IGNoYW5nZSBtRG93bm1peFJlcXVpcmVzRm9ybWF0CiAgICAgICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKICAgICAgICAgdC0+cHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgICAgIHQtPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgdC0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CiAKICAgICAgICAgbVRyYWNrc1tuYW1lXSA9IHQ7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTE4NSwxMyArMjAwLDIwIEBACiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOwogICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnRyYWNrID0gbVRyYWNrc1tuYW1lXTsKIAotICAgIGlmICh0cmFja0NoYW5uZWxNYXNrID09IHRyYWNrLT5jaGFubmVsTWFzawotICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsTWFzayA9PSB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2spIHsKKyAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSAodHJhY2stPmNoYW5uZWxNYXNrIHwgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzaykKKyAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gKHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayB8IHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzaykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKICAgICB9CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIHRyYWNrQ2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckhhcHRpY0NoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBtaXhlckNoYW5uZWxNYXNrICY9IH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CiAgICAgLy8gYWx3YXlzIHJlY29tcHV0ZSBmb3IgYm90aCBjaGFubmVsIG1hc2tzIGV2ZW4gaWYgb25seSBvbmUgaGFzIGNoYW5nZWQuCiAgICAgY29uc3QgdWludDMyX3QgdHJhY2tDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodHJhY2tDaGFubmVsTWFzayk7CiAgICAgY29uc3QgdWludDMyX3QgbWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWl4ZXJDaGFubmVsTWFzayk7CisgICAgY29uc3QgdWludDMyX3QgaGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGhhcHRpY0NoYW5uZWxNYXNrKTsKKyAgICBjb25zdCB1aW50MzJfdCBtaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWl4ZXJIYXB0aWNDaGFubmVsTWFzayk7CiAKICAgICBBTE9HX0FTU0VSVCgodHJhY2tDaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYKQogICAgICAgICAgICAgJiYgdHJhY2tDaGFubmVsQ291bnQKQEAgLTIwMCw2ICsyMjIsMjQgQEAKICAgICB0cmFjay0+Y2hhbm5lbENvdW50ID0gdHJhY2tDaGFubmVsQ291bnQ7CiAgICAgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzazsKICAgICB0cmFjay0+bU1peGVyQ2hhbm5lbENvdW50ID0gbWl4ZXJDaGFubmVsQ291bnQ7CisgICAgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzayA9IGhhcHRpY0NoYW5uZWxNYXNrOworICAgIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID0gaGFwdGljQ2hhbm5lbENvdW50OworICAgIHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IG1peGVySGFwdGljQ2hhbm5lbE1hc2s7CisgICAgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IG1peGVySGFwdGljQ2hhbm5lbENvdW50OworCisgICAgaWYgKHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICB0cmFjay0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gdHJhY2stPmNoYW5uZWxDb3VudCArIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQgKyB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgPSB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQ7CisgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0SW5DaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBmYWxzZTsKKyAgICB9CiAKICAgICAvLyBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCwgZG9lcyB0aGlzIHRyYWNrIG5lZWQgYSBkb3dubWl4ZXI/CiAgICAgLy8gdXBkYXRlIHRvIHRyeSB1c2luZyBvdXIgZGVzaXJlZCBmb3JtYXQgKGlmIHdlIGFyZW4ndCBhbHJlYWR5IHVzaW5nIGl0KQpAQCAtMjEyLDYgKzI1Miw5IEBACiAgICAgLy8gZG8gaXQgYWZ0ZXIgZG93bm1peCBzaW5jZSB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKICAgICB0cmFjay0+cHJlcGFyZUZvclJlZm9ybWF0KCk7CiAKKyAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKwogICAgIGlmICh0cmFjay0+bVJlc2FtcGxlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIHJlc2FtcGxlciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgogICAgICAgICBjb25zdCB1aW50MzJfdCByZXNldFRvU2FtcGxlUmF0ZSA9IHRyYWNrLT5zYW1wbGVSYXRlOwpAQCAtMjYwLDE0ICszMDMsMTkgQEAKICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykKICAgICAgICAgICAgICAgICA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OCiAgICAgICAgICAgICAmJiBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkpIHsKLSAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAvKiBUT0RPOiB1c2UgbU1peGVySW5Gb3JtYXQsIG5vdyBvbmx5IFBDTSAxNiAqLywKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOwotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8RG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKj4obURvd25taXhlckJ1ZmZlclByb3ZpZGVyLmdldCgpKS0+aXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBtRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7IC8vIFBDTSAxNiBiaXQgcmVxdWlyZWQgZm9yIGRvd25taXgKLSAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGZsb2F0IG9yIGludDE2IGRvd25taXhlciwgaW4gdGhhdCBvcmRlci4KKyAgICAgICAgZm9yIChjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgOiB7IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIH0pIHsKKyAgICAgICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBtTWl4ZXJDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOworICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PERvd25taXhlckJ1ZmZlclByb3ZpZGVyICo+KG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICBtRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciByZXNldCBiZWxvdy4KICAgICB9CkBAIC0zMzUsOSArMzgzLDgyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpCit7CisgICAgQUxPR1YoIkFVRElPTUlYRVI6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzIik7CisgICAgaWYgKG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb01peGVyOjpUcmFjazo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCkKK3sKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCVwKSB3aXRoIGluQ2hhbm5lbENvdW50OiAldSwgb3V0Q2hhbm5lbENvdW50OiAldSIsCisgICAgICAgICAgICB0aGlzLCBtQWRqdXN0SW5DaGFubmVsQ291bnQsIG1BZGp1c3RPdXRDaGFubmVsQ291bnQpOworICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgaWYgKG1BZGp1c3RJbkNoYW5uZWxDb3VudCAhPSBtQWRqdXN0T3V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1BZGp1c3RJbkNoYW5uZWxDb3VudCwgbUFkanVzdE91dENoYW5uZWxDb3VudCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSgpCit7CisgICAgQUxPR1YoIkFVRElPTUlYRVI6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUiKTsKKyAgICBpZiAobUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9NaXhlcjo6VHJhY2s6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKHNpemVfdCBmcmFtZXMpCit7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCVwKSB3aXRoIGluQ2hhbm5lbENvdW50OiAldSwgIgorICAgICAgICAgICJvdXRDaGFubmVsQ291bnQ6ICV1LCBrZWVwQ29udHJhY3RlZENoYW5uZWxzOiAlZCIsCisgICAgICAgICAgICB0aGlzLCBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCwgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpOworICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKTsKKyAgICBpZiAobUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgIT0gbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9IG1LZWVwQ29udHJhY3RlZENoYW5uZWxzCisgICAgICAgICAgICAgICAgPyAodWludDhfdCopbWFpbkJ1ZmZlciArIGZyYW1lcyAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckNoYW5uZWxDb3VudCwgbU1peGVyRm9ybWF0KQorICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgICAgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KAorICAgICAgICAgICAgICAgIG5ldyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPyBtTWl4ZXJGb3JtYXQgOiBBVURJT19GT1JNQVRfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OmNsZWFyQ29udHJhY3RlZEJ1ZmZlcigpCit7CisgICAgaWYgKG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHN0YXRpY19jYXN0PEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIqPigKKyAgICAgICAgICAgICAgICBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkpLT5jbGVhckNvbnRyYWN0ZWRGcmFtZXMoKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCkKIHsKKyAgICAvLyBjb25maWd1cmUgZnJvbSB1cHN0cmVhbSB0byBkb3duc3RyZWFtIGJ1ZmZlciBwcm92aWRlcnMuCiAgICAgYnVmZmVyUHJvdmlkZXIgPSBtSW5wdXRCdWZmZXJQcm92aWRlcjsKKyAgICBpZiAobUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpOworICAgIH0KKyAgICBpZiAobUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpOworICAgIH0KICAgICBpZiAobVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOwogICAgICAgICBidWZmZXJQcm92aWRlciA9IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpOwpAQCAtNTMyLDcgKzY1Myw4IEBACiAgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLCB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICh0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgfCB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2spKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfTUFTSywgJXgpIiwgdHJhY2tDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQpAQCAtNTQxLDYgKzY2Myw5IEBACiAgICAgICAgICAgICBpZiAodHJhY2stPm1haW5CdWZmZXIgIT0gdmFsdWVCdWYpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bWFpbkJ1ZmZlciA9IHZhbHVlQnVmOwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1BSU5fQlVGRkVSLCAlcCkiLCB2YWx1ZUJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTU3MCwxNiArNjk1LDM1IEBACiAgICAgICAgICAgICBpZiAodHJhY2stPm1NaXhlckZvcm1hdCAhPSBmb3JtYXQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bU1peGVyRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0ZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTUlYRVJfQ0hBTk5FTF9NQVNLOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2stPmNoYW5uZWxNYXNrLCBtaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFjay0+Y2hhbm5lbE1hc2sgfCB0cmFjay0+bUhhcHRpY0NoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBtaXhlckNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0NIQU5ORUxfTUFTSywgJSN4KSIsIG1peGVyQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSEFQVElDX0VOQUJMRUQ6IHsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFwdGljUGxheWJhY2tFbmFibGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkICE9IGhhcHRpY1BsYXliYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gaGFwdGljUGxheWJhY2tFbmFibGVkOworICAgICAgICAgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgSEFQVElDX0lOVEVOU0lUWTogeworICAgICAgICAgICAgY29uc3QgaGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSA9IHN0YXRpY19jYXN0PGhhcHRpY19pbnRlbnNpdHlfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ICE9IGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gaGFwdGljSW50ZW5zaXR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB0cmFjazogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICB9CkBAIC04MTMsMTQgKzk1NywxOSBAQAogICAgIGlmICh0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPT0gYnVmZmVyUHJvdmlkZXIpIHsKICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCByZXNldCBhbnkgYnVmZmVyIHByb3ZpZGVycyBpZiBpZGVudGljYWwuCiAgICAgfQotICAgIGlmICh0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICB0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgdHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICAvLyByZXNldCBvcmRlciBmcm9tIGRvd25zdHJlYW0gdG8gdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVycy4KKyAgICBpZiAodHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0gZWxzZSBpZiAodHJhY2stPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICB0cmFjay0+bVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+bUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfQogCiAgICAgdHJhY2stPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID0gYnVmZmVyUHJvdmlkZXI7CkBAIC0xMjY0LDggKzE0MTMsOCBAQAogCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW2dyb3VwWzBdXTsKICAgICAgICAgbWVtc2V0KHQtPm1haW5CdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQKLSAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodC0+bU1peGVyRm9ybWF0KSk7CisgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKyB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQsIHQtPm1NaXhlckZvcm1hdCkpOwogCiAgICAgICAgIC8vIG5vdyBjb25zdW1lIGRhdGEKICAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IGdyb3VwKSB7CkBAIC0xNzA0LDYgKzE4NTMsNDAgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc0hhcHRpY0RhdGEoKQoreworICAgIC8vIE5lZWQgdG8ga2VlcCBjb25zaXN0ZW50IHdpdGggVmlicmF0aW9uRWZmZWN0LnNjYWxlKGludCwgZmxvYXQsIGludCkKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtR3JvdXBzKSB7CisgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgbWFpbiBidWZmZXIuCisgICAgICAgIGNvbnN0IGF1dG8gJmdyb3VwID0gcGFpci5zZWNvbmQ7CisgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07CisgICAgICAgICAgICBpZiAodC0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHNpemVfdCBzYW1wbGVDb3VudCA9IG1GcmFtZUNvdW50ICogdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgIGZsb2F0IGdhbW1hID0gdC0+Z2V0SGFwdGljU2NhbGVHYW1tYSgpOworICAgICAgICAgICAgICAgIGZsb2F0IG1heEFtcGxpdHVkZVJhdGlvID0gdC0+Z2V0SGFwdGljTWF4QW1wbGl0dWRlUmF0aW8oKTsKKyAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIgPSAodWludDhfdCopcGFpci5maXJzdCArIG1GcmFtZUNvdW50ICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgIHN3aXRjaCAodC0+bU1peGVyRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgLy8gTWl4ZXIgZm9ybWF0IHNob3VsZCBiZSBBVURJT19GT1JNQVRfUENNX0ZMT0FULgorICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDogeworICAgICAgICAgICAgICAgICAgICBmbG9hdCogZm91dCA9IChmbG9hdCopIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtdWwgPSBmb3V0W2ldID49IDAgPyAxLjAgOiAtMS4wOworICAgICAgICAgICAgICAgICAgICAgICAgZm91dFtpXSA9IHBvd2YoZmFic2YoZm91dFtpXSAvIEhBUFRJQ19NQVhfQU1QTElUVURFX0ZMT0FUKSwgZ2FtbWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbWF4QW1wbGl0dWRlUmF0aW8gKiBIQVBUSUNfTUFYX0FNUExJVFVERV9GTE9BVCAqIG11bDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1NaXhlckZvcm1hdDogJSN4IiwgdC0+bU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiAvKiBUaGlzIHRyYWNrIGhvb2sgaXMgY2FsbGVkIHRvIGRvIHJlc2FtcGxpbmcgdGhlbiBtaXhpbmcsCiAgKiBwdWxsaW5nIGZyb20gdGhlIHRyYWNrJ3MgdXBzdHJlYW0gQXVkaW9CdWZmZXJQcm92aWRlci4KICAqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oCmluZGV4IDkyMTQ0ZDAuLjQ3OTE0MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oCkBAIC01NSw2ICs1NSwxMSBAQAogICAgIHZpcnR1YWwgc2l6ZV90IHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiAKKyAgICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgeworICAgICAgICBBdWRpb1Jlc2FtcGxlcjo6cmVzZXQoKTsKKyAgICAgICAgbUluQnVmZmVyLnJlc2V0KCk7CisgICAgfQorCiAgICAgLy8gTWFrZSBhdmFpbGFibGUga2V5IGRlc2lnbiBjcml0ZXJpYSBmb3IgdGVzdGluZwogICAgIGludCBnZXRIYWxmTGVuZ3RoKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUNvbnN0YW50cy5tSGFsZk51bUNvZWZzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCmluZGV4IGE3NDE2NzcuLjliNzBhMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgQWNjdW11bGF0b3I8Q0hBTk5FTFMtMSwgVE8+OjphY2MoY29lZiwgZGF0YSk7CiAgICAgfQogICAgIGlubGluZSB2b2lkIHZvbHVtZShUTyomIG91dCwgVE8gZ2FpbikgewotICAgICAgICAqb3V0KysgPSB2b2x1bWVBZGp1c3QodmFsdWUsIGdhaW4pOworICAgICAgICAqb3V0KysgKz0gdm9sdW1lQWRqdXN0KHZhbHVlLCBnYWluKTsKICAgICAgICAgQWNjdW11bGF0b3I8Q0hBTk5FTFMtMSwgVE8+Ojp2b2x1bWUob3V0LCBnYWluKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKaW5kZXggMzIwYjhjZi4uNWEwM2EwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2RlZmluZSBfX1NURENfQ09OU1RBTlRfTUFDUk9TCiAjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCmluZGV4IGQ2MDU2MGIuLjIxZDI1ZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCkBAIC0xNyw4ICsxNywxMSBAQAogI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQcm92aWRlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgogI2luY2x1ZGUgPHNvbmljLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CkBAIC0zNSwxMyArMzgsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdGljIGlubGluZSBUIG1pbihjb25zdCBUJiBhLCBjb25zdCBUJiBiKQotewotICAgIHJldHVybiBhIDwgYiA/IGEgOiBiOwotfQotCiBDb3B5QnVmZmVyUHJvdmlkZXI6OkNvcHlCdWZmZXJQcm92aWRlcihzaXplX3QgaW5wdXRGcmFtZVNpemUsCiAgICAgICAgIHNpemVfdCBvdXRwdXRGcmFtZVNpemUsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CiAgICAgICAgIG1JbnB1dEZyYW1lU2l6ZShpbnB1dEZyYW1lU2l6ZSksCkBAIC02Myw3ICs1OSw4IEBACiAKIENvcHlCdWZmZXJQcm92aWRlcjo6fkNvcHlCdWZmZXJQcm92aWRlcigpCiB7Ci0gICAgQUxPR1YoIn5Db3B5QnVmZmVyUHJvdmlkZXIoJXApIiwgdGhpcyk7CisgICAgQUxPR1YoIiVzKCVwKSAlenUgJXAgJXAiLAorICAgICAgICAgICBfX2Z1bmNfXywgdGhpcywgbUJ1ZmZlci5mcmFtZUNvdW50LCBtVHJhY2tCdWZmZXJQcm92aWRlciwgbUxvY2FsQnVmZmVyRGF0YSk7CiAgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CiAgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKICAgICB9CkBAIC05OCw4ICs5NSw4IEBACiAgICAgICAgIG1Db25zdW1lZCA9IDA7CiAgICAgfQogICAgIEFMT0dfQVNTRVJUKG1Db25zdW1lZCA8IG1CdWZmZXIuZnJhbWVDb3VudCk7Ci0gICAgc2l6ZV90IGNvdW50ID0gbWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQsIG1CdWZmZXIuZnJhbWVDb3VudCAtIG1Db25zdW1lZCk7Ci0gICAgY291bnQgPSBtaW4oY291bnQsIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgIHNpemVfdCBjb3VudCA9IHN0ZDo6bWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQsIG1CdWZmZXIuZnJhbWVDb3VudCAtIG1Db25zdW1lZCk7CisgICAgY291bnQgPSBzdGQ6Om1pbihjb3VudCwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgcEJ1ZmZlci0+cmF3ID0gbUxvY2FsQnVmZmVyRGF0YTsKICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gY291bnQ7CiAgICAgY29weUZyYW1lcyhwQnVmZmVyLT5yYXcsICh1aW50OF90KiltQnVmZmVyLnJhdyArIG1Db25zdW1lZCAqIG1JbnB1dEZyYW1lU2l6ZSwKQEAgLTEzMyw2ICsxMzAsMTYgQEAKICAgICBtQ29uc3VtZWQgPSAwOwogfQogCit2b2lkIENvcHlCdWZmZXJQcm92aWRlcjo6c2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgeworICAgIEFMT0dWKCIlcyglcCk6IG1UcmFja0J1ZmZlclByb3ZpZGVyOiVwICBtQnVmZmVyLmZyYW1lQ291bnQ6JXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwLCBtVHJhY2tCdWZmZXJQcm92aWRlciwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICBpZiAobVRyYWNrQnVmZmVyUHJvdmlkZXIgPT0gcCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlcjo6c2V0QnVmZmVyUHJvdmlkZXIocCk7Cit9CisKIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKQEAgLTQ3OSw3ICs0ODYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gdGltZS1zdHJldGNoIHRoZSBkYXRhCi0gICAgICAgIGRzdEF2YWlsYWJsZSA9IG1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50IC0gbVJlbWFpbmluZywgb3V0cHV0RGVzaXJlZCk7CisgICAgICAgIGRzdEF2YWlsYWJsZSA9IHN0ZDo6bWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgLSBtUmVtYWluaW5nLCBvdXRwdXREZXNpcmVkKTsKICAgICAgICAgc2l6ZV90IHNyY0F2YWlsYWJsZSA9IG1CdWZmZXIuZnJhbWVDb3VudDsKICAgICAgICAgcHJvY2Vzc0ZyYW1lcygodWludDhfdCopbUxvY2FsQnVmZmVyRGF0YSArIG1SZW1haW5pbmcgKiBtRnJhbWVTaXplLCAmZHN0QXZhaWxhYmxlLAogICAgICAgICAgICAgICAgIG1CdWZmZXIucmF3LCAmc3JjQXZhaWxhYmxlKTsKQEAgLTUyOCw2ICs1MzUsMTYgQEAKICAgICBtUmVtYWluaW5nID0gMDsKIH0KIAordm9pZCBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSB7CisgICAgQUxPR1YoIiVzKCVwKTogbVRyYWNrQnVmZmVyUHJvdmlkZXI6JXAgIG1CdWZmZXIuZnJhbWVDb3VudDolenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHAsIG1UcmFja0J1ZmZlclByb3ZpZGVyLCBtQnVmZmVyLmZyYW1lQ291bnQpOworICAgIGlmIChtVHJhY2tCdWZmZXJQcm92aWRlciA9PSBwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKKyAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyOjpzZXRCdWZmZXJQcm92aWRlcihwKTsKK30KKwogc3RhdHVzX3QgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6c2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpCiB7CiAgICAgbVBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTsKQEAgLTU2Nyw3ICs1ODQsNyBAQAogICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAvLyBjeWNsaWNhbGx5IHJlcGVhdCB0aGUgc291cmNlLgogICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGNvdW50ID0gMDsgY291bnQgPCAqZHN0RnJhbWVzOyBjb3VudCArPSAqc3JjRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBtaW4oKnNyY0ZyYW1lcywgKmRzdEZyYW1lcyAtIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IHN0ZDo6bWluKCpzcmNGcmFtZXMsICpkc3RGcmFtZXMgLSBjb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodWludDhfdCopZHN0QnVmZmVyICsgbUZyYW1lU2l6ZSAqIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwgbUZyYW1lU2l6ZSAqIHJlbWFpbmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjA5LDUgKzYyNiw3MiBAQAogICAgICAgICB9CiAgICAgfQogfQorCitBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOjpBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIHNpemVfdCBpbkNoYW5uZWxDb3VudCwgc2l6ZV90IG91dENoYW5uZWxDb3VudCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsIGF1ZGlvX2Zvcm1hdF90IGNvbnRyYWN0ZWRGb3JtYXQsIHZvaWQqIGNvbnRyYWN0ZWRCdWZmZXIpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShpbkNoYW5uZWxDb3VudCwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoc3RkOjptYXgoaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCksIGZvcm1hdCksCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgbUluQ2hhbm5lbENvdW50KGluQ2hhbm5lbENvdW50KSwKKyAgICAgICAgbU91dENoYW5uZWxDb3VudChvdXRDaGFubmVsQ291bnQpLAorICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXMoYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSwKKyAgICAgICAgbUZyYW1lQ291bnQoZnJhbWVDb3VudCksCisgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50KGluQ2hhbm5lbENvdW50IC0gb3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbUNvbnRyYWN0ZWRGb3JtYXQoY29udHJhY3RlZEZvcm1hdCksCisgICAgICAgIG1Db250cmFjdGVkQnVmZmVyKGNvbnRyYWN0ZWRCdWZmZXIpLAorICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMoMCkKK3sKKyAgICBBTE9HVigiQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlenUsICV6dSwgJXp1LCAlI3gsICVwKSIsIHRoaXMsIGZvcm1hdCwKKyAgICAgICAgICAgIGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIGNvbnRyYWN0ZWRGb3JtYXQsIGNvbnRyYWN0ZWRCdWZmZXIpOworICAgIGlmIChtQ29udHJhY3RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCAmJiBtSW5DaGFubmVsQ291bnQgPiBtT3V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIG1Db250cmFjdGVkRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1Db250cmFjdGVkQ2hhbm5lbENvdW50LCBtQ29udHJhY3RlZEZvcm1hdCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogcEJ1ZmZlcikKK3sKKyAgICBpZiAobUNvbnRyYWN0ZWRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBSZXN0cmljdCBmcmFtZSBjb3VudCBvbmx5IHdoZW4gaXQgaXMgbmVlZGVkIHRvIHNhdmUgY29udHJhY3RlZCBmcmFtZXMuCisgICAgICAgIGNvbnN0IHNpemVfdCBvdXRGcmFtZXNMZWZ0ID0gbUZyYW1lQ291bnQgLSBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXM7CisgICAgICAgIGlmIChvdXRGcmFtZXNMZWZ0IDwgcEJ1ZmZlci0+ZnJhbWVDb3VudCkgeworICAgICAgICAgICAgLy8gUmVzdHJpY3QgdGhlIGZyYW1lIGNvdW50IHNvIHRoYXQgd2UgZG9uJ3Qgd3JpdGUgb3ZlciB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBvdXRGcmFtZXNMZWZ0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDb3B5QnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIocEJ1ZmZlcik7Cit9CisKK3ZvaWQgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBpZiAobUluQ2hhbm5lbENvdW50ID4gbU91dENoYW5uZWxDb3VudCkgeworICAgICAgICAvLyBGb3IgY2FzZSBtdWx0aSB0byBtb25vLCBhZGp1c3RfY2hhbm5lbHMgaGFzIHNwZWNpYWwgbG9naWMgdGhhdCB3aWxsIG1peCBmaXJzdCB0d28gaW5wdXQKKyAgICAgICAgLy8gY2hhbm5lbHMgaW50byBhIHNpbmdsZSBvdXRwdXQgY2hhbm5lbC4gSW4gdGhhdCBjYXNlLCB1c2UgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZQorICAgICAgICAvLyB0byBrZWVwIG9ubHkgb25lIGNoYW5uZWwgZGF0YSBldmVuIHdoZW4gY29udHJhY3RpbmcgdG8gbW9uby4KKyAgICAgICAgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZShzcmMsIG1JbkNoYW5uZWxDb3VudCwgZHN0LCBtT3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlcywgZnJhbWVzICogbUluQ2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzKTsKKyAgICAgICAgaWYgKG1Db250cmFjdGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElECisgICAgICAgICAgICAmJiBtQ29udHJhY3RlZEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgY29udHJhY3RlZElkeCA9IGZyYW1lcyAqIG1PdXRDaGFubmVsQ291bnQgKiBtU2FtcGxlU2l6ZUluQnl0ZXM7CisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAodWludDhfdCopIG1Db250cmFjdGVkQnVmZmVyICsgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzICogbUNvbnRyYWN0ZWRGcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgIG1Db250cmFjdGVkRm9ybWF0LCAodWludDhfdCopIGRzdCArIGNvbnRyYWN0ZWRJZHgsIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50ICogZnJhbWVzKTsKKyAgICAgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyArPSBmcmFtZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBQcmVmZXIgZXhwYW5kaW5nIGRhdGEgZnJvbSB0aGUgZW5kIG9mIGVhY2ggYXVkaW8gZnJhbWUuCisgICAgICAgIGFkanVzdF9jaGFubmVscyhzcmMsIG1JbkNoYW5uZWxDb3VudCwgZHN0LCBtT3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlcywgZnJhbWVzICogbUluQ2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzKTsKKyAgICB9Cit9CisKK3ZvaWQgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQoreworICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyA9IDA7CisgICAgQ29weUJ1ZmZlclByb3ZpZGVyOjpyZXNldCgpOworfQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKaW5kZXggMDU1ZjcyNC4uNTBjYTMzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCkBAIC0xMDQsOCArMTA0LDggQEAKICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnByMikgewogICAgIHJldHVybiBmYWJzKHByMS5tU3BlZWQgLSBwcjIubVNwZWVkKSA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTl9ERUxUQSAmJgogICAgICAgICAgICBmYWJzKHByMS5tUGl0Y2ggLSBwcjIubVBpdGNoKSA8IEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTl9ERUxUQSAmJgotICAgICAgICAgICBwcjIubVN0cmV0Y2hNb2RlID09IHByMi5tU3RyZXRjaE1vZGUgJiYKLSAgICAgICAgICAgcHIyLm1GYWxsYmFja01vZGUgPT0gcHIyLm1GYWxsYmFja01vZGU7CisgICAgICAgICAgIHByMS5tU3RyZXRjaE1vZGUgPT0gcHIyLm1TdHJldGNoTW9kZSAmJgorICAgICAgICAgICBwcjEubUZhbGxiYWNrTW9kZSA9PSBwcjIubUZhbGxiYWNrTW9kZTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9QbGF5YmFja1JhdGVWYWxpZChjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDgxMWMxNmIuLjBjOGU1YmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnZpYnJhdG9yIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKaW5kZXggNzZiNGFkYy4uZjM5ZWIwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApAQCAtMTE1LDYgKzExNSw3IEBACiAgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sICJ2b2ljZV9yZWNvZ25pdGlvbiJ9LAogICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sICJ2b2ljZV9jb21tdW5pY2F0aW9uIn0sCiAgICAgICAgIHtBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQsICJ1bnByb2Nlc3NlZCJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFLCAidm9pY2VfcGVyZm9ybWFuY2UifSwKIH07CiAKIC8qKiBGaW5kIHRoZSBzdHJlYW0gdHlwZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIG5hbWUgb3IgcmV0dXJuIGZhbHNlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCmluZGV4IDIyN2YyYTEuLjljODJiMWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgLy8iLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREJVSUxEX0ZMT0FUIiwKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwppbmRleCBiNGExZDc3Li45OWFjNGY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKQEAgLTMxLDEwICszMSwxMiBAQAogLy8gRG8gbm90IHN1Ym1pdCB3aXRoIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiBkZWZpbmVkLCBzdHJpY3RseSBmb3IgdGVzdGluZwogLy8jZGVmaW5lIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiAwCiAKLSNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgotCiAjaWZkZWYgQlVJTERfRkxPQVQKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9GTE9BVCAwLjcwNzEwNjc4ZiAvLyAtM2RCID0gMC43MDcxMDY3OGYKK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IGdUYXJnZXRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworI2Vsc2UKKyNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgorY29uc3QgYXVkaW9fZm9ybWF0X3QgZ1RhcmdldEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogI2VuZGlmCiAKIC8vIHN1YnNldCBvZiBwb3NzaWJsZSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZXMsIGFuZCBBVURJT19DSEFOTkVMX09VVF8qIHJlbmFtZWQgdG8gQ0hBTk5FTF9NQVNLXyoKQEAgLTcwMyw3ICs3MDUsNyBAQAogICAgIG1lbXNldCgmcER3bU1vZHVsZS0+Y29udGV4dCwgMCwgc2l6ZW9mKGRvd25taXhfb2JqZWN0X3QpKTsKIAogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGdUYXJnZXRGb3JtYXQ7CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03MTUsNyArNzE3LDcgQEAKIAogICAgIC8vIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhY2Nlc3MgbW9kZSwgYnV0IHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBjYWxsZXIKICAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBnVGFyZ2V0Rm9ybWF0OwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03NjIsOCArNzY0LDggQEAKICAgICAvLyBDaGVjayBjb25maWd1cmF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBidWlsZCBvcHRpb25zLCBhbmQgZWZmZWN0IGNhcGFiaWxpdGllcwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZQogICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gRE9XTk1JWF9PVVRQVVRfQ0hBTk5FTFMKLSAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCi0gICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGdUYXJnZXRGb3JtYXQKKyAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCAhPSBnVGFyZ2V0Rm9ybWF0KSB7CiAgICAgICAgIEFMT0dFKCJEb3dubWl4X0NvbmZpZ3VyZSBlcnJvcjogaW52YWxpZCBjb25maWciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTE4NSw4ICsxMTg3LDggQEAKICAgICBpZiAoYWNjdW11bGF0ZSkgewogICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CiAgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7CisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwogICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKICAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CiAgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgpAQCAtMTQyNyw0ICsxNDI5LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhZmM1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIEJ1aWxkIHRlc3RiZW5jaCBmb3IgZG93bm1peCBtb2R1bGUuCitjY190ZXN0IHsKKyAgICBuYW1lOiJkb3dubWl4dGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliZG93bm1peCIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImRvd25taXh0ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMGZhZWJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSw2OSBAQAorIyEvYmluL2Jhc2gKKyMKKyNSdW4gdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorI2Vuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjbG9jYXRpb24gb2YgdGVzdCBmaWxlcwordGVzdGRpcj0iL2RhdGEvbG9jYWwvdG1wL2Rvd25taXh0ZXN0IgorCitmc19hcnI9KAorICAgIDgwMDAKKyAgICAxMTAyNQorICAgIDEyMDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDI0MDAwCisgICAgMzIwMDAKKyAgICA0NDEwMAorICAgIDQ4MDAwCisgICAgODgyMDAKKyAgICA5NjAwMAorICAgIDE3NjQwMAorICAgIDE5MjAwMAorKQorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyBEb3dubWl4IgorYWRiIHNoZWxsIG1rZGlyICR0ZXN0ZGlyCisKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3IFwKKyR0ZXN0ZGlyCithZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9kb3dubWl4dGVzdC9hcm02NC9kb3dubWl4dGVzdCAkdGVzdGRpcgorCisjcnVuIHRoZSBkb3dubWl4IHRlc3QgYXBwbGljYXRpb24gZm9yIHRlc3QuCitmb3IgZnMgaW4gJHtmc19hcnJbKl19CitkbworICAgIGZvciBmX2NoIGluIHsxLi44fQorICAgIGRvCisgICAgICAgIGZvciBjaF9mbXQgaW4gezAuLjR9CisgICAgICAgIGRvCisgICAgICAgICAgICBhZGIgc2hlbGwgIExEX0xJQlJBUllfUEFUSD0vdmVuZG9yL2xpYjY0L3NvdW5kZnggXAorICAgICAgICAgICAgJHRlc3RkaXIvZG93bm1peHRlc3QgJHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgLWNoX2ZtdDokY2hfZm10IC1mY2g6JGZfY2ggLWZzOiRmcworCisgICAgICAgICAgICAjIEltcGxlbWVudGF0aW9uIGRlcGVuZGVudCB0ZXN0OgorICAgICAgICAgICAgIyBjaGVjayB0aGF0IGhpZ2hlciBmcmVxdWVuY2llcyBtYXRjaCA4IGtIeiByZXN1bHQuCisgICAgICAgICAgICBpZiBbICRmcyAhPSA4MDAwIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBhZGIgc2hlbGwgY21wIFwKKyAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfODAwMC5yYXcgXAorICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF9mbXRfJCgoY2hfZm10KSlfZmNoXyQoKGZfY2gpKV8kKChmcykpLnJhdworICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKK2FkYiBzaGVsbCBybSAtciAkdGVzdGRpcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2Rvd25taXh0ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmODNlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgIkVmZmVjdERvd25taXguaCIKKyNkZWZpbmUgRlJBTUVfTEVOR1RIIDI1NgorI2RlZmluZSBNQVhfTlVNX0NIQU5ORUxTIDgKKworc3RydWN0IGRvd25taXhfY250eHRfcyB7CisgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgZWZmZWN0X2hhbmRsZV90IGhhbmRsZTsKKyAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZzsKKworICBpbnQgbnVtRmlsZUNoYW5uZWxzOworICBpbnQgbnVtUHJvY2Vzc0NoYW5uZWxzOworfTsKKworZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgcHJpbnRmKCJcblVzYWdlOiIpOworICBwcmludGYoIlxuICAgICBkb3dubWl4dGVzdCA8aW5wdXRfZmlsZT4gPG91dF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIik7CisgIHByaW50ZigiXG4gICAgIDxpbnB1dF9maWxlPiAgaXMgdGhlIGlucHV0IGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggTFZNIGVmZmVjdHMgYXJlIGFwcGxpZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgPG91dHB1dF9maWxlPiBwcm9jZXNzZWQgb3V0cHV0IGZpbGUiKTsKKyAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgICAtaCIpOworICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jaF9mbXQ6PGZvcm1hdF9vZl9pbnB1dF9hdWRpbz4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDA6QVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMShkZWZhdWx0KSIpOworICBwcmludGYoIlxuICAgICAgICAgMTpBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDI6QVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLIik7CisgIHByaW50ZigiXG4gICAgICAgICAzOkFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSIpOworICBwcmludGYoIlxuICAgICAgICAgNDpBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtZmNoOjxmaWxlX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpIik7CisgIHByaW50ZigiXG4iKTsKK30KKworaW50MzJfdCBEb3dubWl4RGVmYXVsdENvbmZpZyhlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpIHsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgIHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gbnVsbHB0cjsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZTsKKworICAvLyBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYWNjZXNzIG1vZGUsIGJ1dCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gYnkgY2FsbGVyCisgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgIHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIHJldHVybiAwOworfQorCitpbnQzMl90IERvd25taXhDb25maXVyZUFuZEVuYWJsZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yKSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKyAgaW50MzJfdCBlcnIgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSAodWludDMyX3Qpc2l6ZW9mKGVycik7CisKKyAgZXJyID0gKERvd25taXhfYXBpLT5jb21tYW5kKSgqZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksICYocERlc2NyaXB0b3ItPmNvbmZpZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4IGNvbW1hbmQgdG8gY29uZmlndXJlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgZXJyID0gKChEb3dubWl4X2FwaS0+Y29tbWFuZCkpKCplZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4IGNvbW1hbmQgdG8gZW5hYmxlIGVmZmVjdCByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIGVycjsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dubWl4RXhlY3V0ZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yLCBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKworICBjb25zdCBpbnQgbnVtRmlsZUNoYW5uZWxzID0gcERlc2NyaXB0b3ItPm51bUZpbGVDaGFubmVsczsKKyAgY29uc3QgaW50IG51bVByb2Nlc3NDaGFubmVscyA9IHBEZXNjcmlwdG9yLT5udW1Qcm9jZXNzQ2hhbm5lbHM7CisgIGNvbnN0IGludCBmaWxlRnJhbWVTaXplID0gbnVtRmlsZUNoYW5uZWxzICogc2l6ZW9mKHNob3J0KTsKKyAgY29uc3QgdW5zaWduZWQgaW50IG91dHB1dENoYW5uZWxzID0KKyAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworCisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBvdXRGbG9hdChGUkFNRV9MRU5HVEggKiBNQVhfTlVNX0NIQU5ORUxTKTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGluRmxvYXQoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisKKyAgYXVkaW9fYnVmZmVyX3QgaW5idWZmZXIsIG91dGJ1ZmZlcjsKKyAgaW5idWZmZXIuZjMyID0gaW5GbG9hdC5kYXRhKCk7CisgIG91dGJ1ZmZlci5mMzIgPSBvdXRGbG9hdC5kYXRhKCk7CisgIGluYnVmZmVyLmZyYW1lQ291bnQgPSBGUkFNRV9MRU5HVEg7CisgIG91dGJ1ZmZlci5mcmFtZUNvdW50ID0gRlJBTUVfTEVOR1RIOworCisgIGF1ZGlvX2J1ZmZlcl90ICpwaW5idWYsICpwb3V0YnVmOworICBwaW5idWYgPSAmaW5idWZmZXI7CisgIHBvdXRidWYgPSAmb3V0YnVmZmVyOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW5TMTYoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisgIHN0ZDo6dmVjdG9yPHNob3J0PiBvdXRTMTYoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisKKyAgd2hpbGUgKGZyZWFkKGluUzE2LmRhdGEoKSwgZmlsZUZyYW1lU2l6ZSwgRlJBTUVfTEVOR1RILCBmaW5wKSA9PQorICAgICAgICAgRlJBTUVfTEVOR1RIKSB7CisgICAgaWYgKG51bUZpbGVDaGFubmVscyAhPSBudW1Qcm9jZXNzQ2hhbm5lbHMpIHsKKyAgICAgIGFkanVzdF9jaGFubmVscyhpblMxNi5kYXRhKCksIG51bUZpbGVDaGFubmVscywgaW5TMTYuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgIG51bVByb2Nlc3NDaGFubmVscywgc2l6ZW9mKHNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBmaWxlRnJhbWVTaXplKTsKKyAgICB9CisKKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoaW5GbG9hdC5kYXRhKCksIGluUzE2LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOR1RIICogbnVtUHJvY2Vzc0NoYW5uZWxzKTsKKworICAgIGNvbnN0IGludDMyX3QgZXJyID0gKERvd25taXhfYXBpLT5wcm9jZXNzKSgqZWZmZWN0SGFuZGxlLCBwaW5idWYsIHBvdXRidWYpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgQUxPR0UoIkRvd25taXhQcm9jZXNzIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0UzE2LmRhdGEoKSwgb3V0RmxvYXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBvdXRwdXRDaGFubmVscyk7CisgICAgZndyaXRlKG91dFMxNi5kYXRhKCksIHNpemVvZihzaG9ydCksIChGUkFNRV9MRU5HVEggKiBvdXRwdXRDaGFubmVscyksCisgICAgICAgICAgIGZvdXQpOworICAgIGZyYW1lQ291bnRlcisrOworICB9CisgIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOworICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dtaXhNYWluUHJvY2Vzcyhkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yLCBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGludDMyX3Qgc2Vzc2lvbklkID0gMCwgaW9JZCA9IDA7CisgIGNvbnN0IGVmZmVjdF91dWlkX3QgZG93bm1peF91dWlkID0geworICAgICAgMHg5M2YwNDQ1MiwgMHhlNGZlLCAweDQxY2MsIDB4OTFmOSwgezB4ZTQsIDB4NzUsIDB4YjYsIDB4ZDEsIDB4ZDYsIDB4OWZ9fTsKKworICBpbnQzMl90IGVyciA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoCisgICAgICAmZG93bm1peF91dWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICBlZmZlY3RIYW5kbGUpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peExpYl9DcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIFBhc3NpbmcgdGhlIGluaXQgY29uZmlnIGZvciB0aW1lIGJlaW5nLgorICBlcnIgPSBEb3dubWl4Q29uZml1cmVBbmRFbmFibGUocERlc2NyaXB0b3IpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peENvbmZpZ3VyZUFuZEVuYWJsZSByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8vIGV4ZWN1dGUgY2FsbCBmb3IgZG93bm1peC4KKyAgZXJyID0gRG93bm1peEV4ZWN1dGUocERlc2NyaXB0b3IsIGZpbnAsIGZvdXQpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peEV4ZWN1dGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBSZWxlYXNlIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLgorICBlcnIgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5yZWxlYXNlX2VmZmVjdCgqZWZmZWN0SGFuZGxlKTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgQUxPR0UoIkRvd25taXhSZWxlYXNlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaW50IG51bUZpbGVDaGFubmVscyA9IDEsIG51bVByb2Nlc3NDaGFubmVscyA9IDg7CisgIGRvd25taXhfY250eHRfcyBkZXNjcmlwdG9yID0ge307CisgIERvd25taXhEZWZhdWx0Q29uZmlnKCYoZGVzY3JpcHRvci5jb25maWcpKTsKKworICBjb25zdCBjaGFyICppbmZpbGUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpvdXRmaWxlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOworICAgIGlmIChhcmd2W2ldWzBdICE9ICctJykgeworICAgICAgaWYgKGluZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIGluZmlsZSA9IGFyZ3ZbaV07CisgICAgICB9IGVsc2UgaWYgKG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBvdXRmaWxlID0gYXJndltpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgLy8gQWRkIGEgY2hlY2sgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHN0cmVhbXMuCisgICAgICBjb25zdCBpbnQgc2FtcGxpbmdGcmVxID0gYXRvaShhcmd2W2ldICsgNCk7CisgICAgICBpZiAoc2FtcGxpbmdGcmVxICE9IDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDExMDI1ICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDEyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNjAwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAyMjA1MCAmJiBzYW1wbGluZ0ZyZXEgIT0gMjQwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMzIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDQ0MTAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDQ4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSA4ODIwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA5NjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTc2NDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDE5MjAwMCkgeworICAgICAgICBwcmludGYoIlVuc3VwcG9ydGVkIFNhbXBsaW5nIEZyZXF1ZW5jeSA6ICVkIiwgc2FtcGxpbmdGcmVxKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIGRlc2NyaXB0b3IuY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nRnJlcTsKKyAgICAgIGRlc2NyaXB0b3IuY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGluZ0ZyZXE7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWNoX2ZtdDoiLCA4KSkgeworICAgICAgY29uc3QgaW50IGZvcm1hdCA9IGF0b2koYXJndltpXSArIDgpOworICAgICAgdWludDMyX3QgKmF1ZGlvVHlwZSA9ICZkZXNjcmlwdG9yLmNvbmZpZy5pbnB1dENmZy5jaGFubmVsczsKKyAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0s7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZXNjcmlwdG9yLm51bVByb2Nlc3NDaGFubmVscyA9CisgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKCphdWRpb1R5cGUpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgcHJpbnRmKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkIiwgZkNoYW5uZWxzKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBkZXNjcmlwdG9yLm51bUZpbGVDaGFubmVscyA9IGZDaGFubmVsczsKKworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1oIiwgMikpIHsKKyAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmICgvKmluZmlsZSA9PSBudWxscHRyIHx8ICovIG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKKyAgaWYgKGZpbnAgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIEZJTEUgKmZvdXQgPSBmb3BlbihvdXRmaWxlLCAid2IiKTsKKyAgaWYgKGZvdXQgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXMiLCBvdXRmaWxlKTsKKyAgICBmY2xvc2UoZmlucCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgY29uc3QgaW50IGVyciA9IERvd21peE1haW5Qcm9jZXNzKCZkZXNjcmlwdG9yLCBmaW5wLCBmb3V0KTsKKyAgLy8gY2xvc2UgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KKyAgZmNsb3NlKGZpbnApOworICBmY2xvc2UoZm91dCk7CisgIGlmIChlcnIgIT0gMCkgeworICAgIHByaW50ZigiRXJyb3I6ICVkXG4iLCBlcnIpOworICB9CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcAppbmRleCA5ZDI5Y2YxLi5kNjFlZmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAKQEAgLTMwLDYgKzMwLDI2IEBACiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbG91ZG5lc3NlbmhhbmNlci5oPgogI2luY2x1ZGUgImRzcC9jb3JlL2R5bmFtaWNfcmFuZ2VfY29tcHJlc3Npb24uaCIKIAorLy8gQlVJTERfRkxPQVQgdGFyZ2V0cyBidWlsZGluZyBhIGZsb2F0IGVmZmVjdCBpbnN0ZWFkIG9mIHRoZSBsZWdhY3kgaW50MTZfdCBlZmZlY3QuCisjZGVmaW5lIEJVSUxEX0ZMT0FUCisKKyNpZmRlZiBCVUlMRF9GTE9BVAorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKworI2Vsc2UKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCitzdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKK3sKKyAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQorICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7CisgICAgcmV0dXJuIHNhbXBsZTsKK30KKworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCisKIGV4dGVybiAiQyIgewogCiAvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBMRSBlZmZlY3QKQEAgLTgwLDEzICsxMDAsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCi17Ci0gICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKLSAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOwotICAgIHJldHVybiBzYW1wbGU7Ci19Ci0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTEVfc2V0Q29uZmlnKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTExLDcgKzEyNCw3IEBACiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCiAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGtQcm9jZXNzRm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnID0gKnBDb25maWc7CiAKQEAgLTE1OSw3ICsxNzIsNyBAQAogCiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTE2Nyw3ICsxODAsNyBAQAogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTI4NCwxOCArMjk3LDQxIEBACiAKICAgICAvL0FMT0dWKCJMRSBhYm91dCB0byBwcm9jZXNzICVkIHNhbXBsZXMiLCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgdWludDE2X3QgaW5JZHg7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBjb25zdGV4cHIgZmxvYXQgc2NhbGUgPSAxIDw8IDE1OyAvLyBwb3dlciBvZiAyIGlzIGxvc3NsZXNzIGNvbnZlcnNpb24gdG8gaW50MTZfdCByYW5nZQorICAgIGNvbnN0ZXhwciBmbG9hdCBpbnZlcnNlU2NhbGUgPSAxLmYgLyBzY2FsZTsKKyAgICBjb25zdCBmbG9hdCBpbnB1dEFtcCA9IHBvdygxMCwgcENvbnRleHQtPm1UYXJnZXRHYWlubUIvMjAwMC4wZikgKiBzY2FsZTsKKyNlbHNlCiAgICAgZmxvYXQgaW5wdXRBbXAgPSBwb3coMTAsIHBDb250ZXh0LT5tVGFyZ2V0R2Fpbm1CLzIwMDAuMGYpOworI2VuZGlmCiAgICAgZmxvYXQgbGVmdFNhbXBsZSwgcmlnaHRTYW1wbGU7CiAgICAgZm9yIChpbklkeCA9IDAgOyBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50IDsgaW5JZHgrKykgewogICAgICAgICAvLyBtYWtldXAgZ2FpbiBpcyBhcHBsaWVkIG9uIHRoZSBpbnB1dCBvZiB0aGUgY29tcHJlc3NvcgorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGxlZnRTYW1wbGUgID0gaW5wdXRBbXAgKiBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHhdOworICAgICAgICByaWdodFNhbXBsZSA9IGlucHV0QW1wICogaW5CdWZmZXItPmYzMlsyKmluSWR4ICsxXTsKKyAgICAgICAgcENvbnRleHQtPm1Db21wcmVzc29yLT5Db21wcmVzcygmbGVmdFNhbXBsZSwgJnJpZ2h0U2FtcGxlKTsKKyAgICAgICAgaW5CdWZmZXItPmYzMlsyKmluSWR4XSAgICA9IGxlZnRTYW1wbGUgKiBpbnZlcnNlU2NhbGU7CisgICAgICAgIGluQnVmZmVyLT5mMzJbMippbklkeCArMV0gPSByaWdodFNhbXBsZSAqIGludmVyc2VTY2FsZTsKKyNlbHNlCiAgICAgICAgIGxlZnRTYW1wbGUgID0gaW5wdXRBbXAgKiAoZmxvYXQpaW5CdWZmZXItPnMxNlsyKmluSWR4XTsKICAgICAgICAgcmlnaHRTYW1wbGUgPSBpbnB1dEFtcCAqIChmbG9hdClpbkJ1ZmZlci0+czE2WzIqaW5JZHggKzFdOwogICAgICAgICBwQ29udGV4dC0+bUNvbXByZXNzb3ItPkNvbXByZXNzKCZsZWZ0U2FtcGxlLCAmcmlnaHRTYW1wbGUpOwogICAgICAgICBpbkJ1ZmZlci0+czE2WzIqaW5JZHhdICAgID0gKGludDE2X3QpIGxlZnRTYW1wbGU7CiAgICAgICAgIGluQnVmZmVyLT5zMTZbMippbklkeCArMV0gPSAoaW50MTZfdCkgcmlnaHRTYW1wbGU7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyNlbHNlCiAgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYob3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKQEAgLTMwMyw2ICszMzksNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IExPVURORVNTX0VOSEFOQ0VSX1NUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gLUVOT0RBVEE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCmluZGV4IDVjNTdjNDMuLjdhMzJkM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCkBAIC0xMjksMTEgKzEyOSwxNCBAQAogICAgICAgICAiQ29tbW9uL2xpYiIsCiAgICAgICAgICJCdW5kbGUvbGliIiwKICAgICBdLAotCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLURCVUlMRF9GTE9BVCIsCiAgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAogCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKaW5kZXggNGMyYjk1NC4uY2MwNjZiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKQEAgLTE5OSw4ICsxOTksMTAgQEAKICNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgMTI4CiAjZGVmaW5lIExWREJFX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgIDI1NgogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotI2RlZmluZSBMVkRCRV9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICA1MTIKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkRCRV9DQVBfRlNfODgyMDAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTc2NDAwICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgIDQwOTYKICNlbmRpZgogCiB0eXBlZGVmIGVudW0KQEAgLTIxNSw4ICsyMTcsMTAgQEAKICAgICBMVkRCRV9GU180NDEwMCA9IDcsCiAgICAgTFZEQkVfRlNfNDgwMDAgPSA4LAogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgIExWREJFX0ZTXzk2MDAwID0gOSwKLSAgICBMVkRCRV9GU18xOTIwMDAgPSAxMCwKKyAgICBMVkRCRV9GU184ODIwMCA9IDksCisgICAgTFZEQkVfRlNfOTYwMDAgPSAxMCwKKyAgICBMVkRCRV9GU18xNzY0MDAgPSAxMSwKKyAgICBMVkRCRV9GU18xOTIwMDAgPSAxMiwKICNlbmRpZgogICAgIExWREJFX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9Gc19lbjsKQEAgLTI1Niw2ICsyNjAsOSBAQAogICAgIExWREJFX1ZvbHVtZV9lbiAgICAgICAgIFZvbHVtZUNvbnRyb2w7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVm9sdW1lZEI7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSGVhZHJvb21kQjsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogCiB9IExWREJFX1BhcmFtc190OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKaW5kZXggNGVjYWYxNC4uOGYwNThlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtNTgwLDEyICs1ODAsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODk4ODJmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODU4MThmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzE2MzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NDQ2NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0NDgxZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MDQwZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyMDgwZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTQ5MTVmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDkyOGYKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzE4M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDM2NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTgzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3MjMzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTcyMzdmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQ1ODhmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKQEAgLTY0MiwxMiArNjU0LDI0IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg3ODcxZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1MjczZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcwNTQ2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODUyNzNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTMzNTlmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzM4MWYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MTA3N2YpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzODk4ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTM5MTdmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY5MTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM4MjBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjkxMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjY3OWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2Njg1ZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0MDg2ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCkBAIC03MDMsMTIgKzcyNywyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTY4MWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDY3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTM1NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyMTUxZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTIxODJmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njk5ODRmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Mjc4OWYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyODE1ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NjEyZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTczMjI0ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY2MTJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTYwNzZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjA4M2YKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzUzOWYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgpAQCAtNzY0LDEyICs4MDAsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzQ5N2YKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDA4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2ODE2OGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkwOTQ0ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTA5ODVmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njg4OTJmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTY4MGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkxNzE0ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MzE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyNjI5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODYzMTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTU0NzJmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTQ4MmYKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3Mjk5MmYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgpAQCAtODMxLDEyICs4NzksMjQgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njg3NWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwODMxZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA4MzFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTgzMjFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk4MzM4ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3NjJmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDc2MmYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODQ2MWYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTg0NzdmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDQxNmYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNDE2ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk5MTY0ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5OTE2OWYKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzgxZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAzODFmKQpAQCAtODkyLDEyICs5NTIsMjQgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk1NjkwZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTE0NmYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTE0NmYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3Njg0ZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3NzA4ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA1NWYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTA1NWYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3ODY4ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3ODkxZgogCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDU3M2YKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDU3M2YpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4ODQ3ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4ODUzZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDUyOGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAoLTAuMDAwNTI4ZikKQEAgLTk1MywxMiArMTAyNSwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM2MzlmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDE2OTNmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNjkzZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjU4MmYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk2NjE1ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU1NWYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNTU1NWYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTY4NjBmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTY4OTFmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwODQ3ZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwODQ3ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTgyOThmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgMC45OTgzMDZmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzc4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA3NzhmKQpAQCAtMTAxNCwxMiArMTA5OCwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTc3ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwODNmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMjA4M2YpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTc5MWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4MzVmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTkxM2YKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE5MTNmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjEzNGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYxNzRmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA0MmYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDQyZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3OTA0ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NzkxNWYKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwOTU4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDk1OGYpCkBAIC0xMDQ1LDcgKzExNDEsOSBAQAogI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NzE2MjhmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0FUVEFDS19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ1OGYKICNkZWZpbmUgQUdDX0FUVEFDS19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTcxMmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE5OWYKICNkZWZpbmUgQUdDX0FUVEFDS19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgzMGYKICNlbmRpZgogCkBAIC0xMDYyLDcgKzExNjAsOSBAQAogI2RlZmluZSBBR0NfREVDQVlfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDdmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM4ZgogI2RlZmluZSBBR0NfREVDQVlfRlM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMzVmCisjZGVmaW5lIEFHQ19ERUNBWV9GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDE4OGYKICNkZWZpbmUgQUdDX0RFQ0FZX0ZTMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMTc1ZgogI2VuZGlmCiAKQEAgLTExMjUsNyArMTIyNSw5IEBACiAjZGVmaW5lIFZPTF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NTI1ZgogI2RlZmluZSBWT0xfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDE1OGYKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgVk9MX1RDX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIyNjNmCiAjZGVmaW5lIFZPTF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDc5ZgorI2RlZmluZSBWT0xfVENfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTEzMWYKICNkZWZpbmUgVk9MX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDEwMzlmCiAjZW5kaWYKICNkZWZpbmUgTUlYX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjkzNjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg5NjE1MSAqLwpAQCAtMTEzOCw5ICsxMjQwLDEzIEBACiAjZGVmaW5lIE1JWF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1MTUgKi8KICNkZWZpbmUgTUlYX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIxNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTE1MCAqLwogI2lmZGVmIEhJR0hFUl9GUworLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODk3MDQgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0MzAKICNkZWZpbmUgTUlYX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0NTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDUzMCAqLworLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQ4MzggKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI1OTgKICNkZWZpbmUgTUlYX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI2MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MjUyNCAqLwogI2VuZGlmCiAKICNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKaW5kZXggZmQ0MDE2Yi4uMGJhMmM4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICAgKiBDYWxjdWxhdGUgdGhlIHRhYmxlIG9mZnNldHMKICAgICAgKi8KICAgICBMVk1fVUlOVDE2IE9mZnNldCA9IChMVk1fVUlOVDE2KSgoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU180ODAwMCkpKTsKICNlbmRpZgogCiAgICAgLyoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCmluZGV4IDNmZmYyYTIuLjI5NDY3MzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwpAQCAtOTUsNyArOTUsNyBAQAogI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICA9IHNpemVvZihMVkRCRV9Db2VmX0ZMT0FUX3QpOwogI2Vsc2UKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7ICAgCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOwogI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKaW5kZXggNGU1MjA3Zi4uNDIyNWEzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCkBAIC02NCw3ICs2NCwxMiBAQAogI2RlZmluZSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR04gICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGNvZWYgKi8KICNkZWZpbmUgTFZEQkVfU0NSQVRDSF9BTElHTiAgICAgICAgICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgKi8KIAorI2lmZGVmIFNVUFBPUlRfTUMKKy8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSAgICAgKExWTV9NQVhfQ0hBTk5FTFMgKiAzKQorI2Vsc2UKICNkZWZpbmUgTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSAgICAgNiAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZW5kaWYKIAogI2RlZmluZSBMVkRCRV9NSVhFUl9UQyAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8qIE1peGVyIHRpbWUgICovCiAjZGVmaW5lIExWREJFX0JZUEFTU19NSVhFUl9UQyAgICAgICAgICAgIDEwMCAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCmluZGV4IDEwZWE3MDAuLmM0ZDM0MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYwpAQCAtMjEsMTEgKzIxLDEzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3RyaW5nLmg+IC8vIG1lbXNldAogI2luY2x1ZGUgIkxWREJFLmgiCiAjaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJBR0MuaCIKICNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xODcsNDIgKzE4OSw0OSBAQAogTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAogICAgIGNvbnN0IExWTV9GTE9BVCAqcEluRGF0YSwKICAgICBMVk1fRkxPQVQgKnBPdXREYXRhLAotICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKKyAgICBjb25zdCBMVk1fVUlOVDE2IE5yRnJhbWVzKSAvLyB1cGRhdGVkIHRvIHVzZSBzYW1wbGVzID0gZnJhbWVzICogY2hhbm5lbHMuCiB7Ci0KICAgTFZEQkVfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLSAgTFZNX0ZMT0FUICpwU2NyYXRjaF9pbiA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbgotICBbTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKLSAgTFZNX0ZMT0FUICpwU2NyYXRjaCA9IHBTY3JhdGNoX2luICsgMiAqIE51bVNhbXBsZXM7Ci0gIExWTV9GTE9BVCAqcE1vbm87Ci0gIExWTV9JTlQzMiBpaSA9IDA7CiAKLSAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiA0Kk51bVNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KLSAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2hWb2wgPSAoTFZNX0ZMT0FUICopKCZwU2NyYXRjaF9pbls0ICogTnVtU2FtcGxlc10pOwotLy8gIExWTV9JTlQxNiAqcFNjcmF0Y2hWb2xfaW50ID0gKExWTV9JTlQxNiAqKShwU2NyYXRjaFZvbCk7CisgIC8qRXh0cmFjdCBudW1iZXIgb2YgQ2hhbm5lbHMgaW5mbyovCisjaWZkZWYgU1VQUE9SVF9NQworICAvLyBNb25vIHBhc3NlZCBpbiBhcyBzdGVyZW8KKyAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID09IDEKKyAgICAgID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisjZWxzZQorICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IDI7IC8vIEZDQ18yCisjZW5kaWYKKyAgY29uc3QgTFZNX0lOVDMyIE5yU2FtcGxlcyA9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsKIAotICAvKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZiA2Kk51bVNhbXBsZXMgMzItYml0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCi0gIHBNb25vID0gJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXTsKKyAgLyogU3BhY2UgdG8gc3RvcmUgREJFIHBhdGggY29tcHV0YXRpb24gKi8KKyAgTFZNX0ZMT0FUICogY29uc3QgcFNjcmF0Y2ggPQorICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwogCiAgIC8qCi0gICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAqIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mCisgICAqIE5yU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaC4KICAgICovCi0gIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICBMVk1fRkxPQVQgKiBjb25zdCBwTW9ubyA9IHBTY3JhdGNoICsgTnJTYW1wbGVzOworCisgIC8qCisgICAqIFRSSUNLWTogcE1vbm8gaXMgdXNlZCBhbmQgZGlzY2FyZGVkIGJ5IHRoZSBEQkUgcGF0aC4KKyAgICogICAgICAgICBzbyBpdCBpcyBhdmFpbGFibGUgZm9yIHVzZSBmb3IgdGhlIHBTY3JhdGNoVm9sCisgICAqICAgICAgICAgcGF0aCB3aGljaCBpcyBjb21wdXRlZCBhZnRlcndhcmRzLgorICAgKgorICAgKiBTcGFjZSB0byBzdG9yZSBWb2x1bWUgQ29udHJvbCBwYXRoIGNvbXB1dGF0aW9uLgorICAgKiBUaGlzIGlzIGlkZW50aWNhbCB0byBwTW9ubyAoc2VlIFRSSUNLWSBjb21tZW50KS4KKyAgICovCisgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoVm9sID0gcE1vbm87CisKKyAgLyoKKyAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgaXMgbm90IHRvbyBsYXJnZQorICAgKi8KKyAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQogICB7Ci0gICAgcmV0dXJuKExWREJFX1RPT01BTllTQU1QTEVTKTsKKyAgICByZXR1cm4gTFZEQkVfVE9PTUFOWVNBTVBMRVM7CiAgIH0KIAogICAvKgotICAgKiBDb252ZXJ0IDE2LWJpdCBzYW1wbGVzIHRvIEZsb2F0Ci0gICAqLwotICBDb3B5X0Zsb2F0KHBJbkRhdGEsIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLwotICAgICAgcFNjcmF0Y2hfaW4sIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLwotICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCi0KLSAgZm9yIChpaSA9IDA7IGlpIDwgMiAqIE51bVNhbXBsZXM7IGlpKyspIHsKLSAgICBwU2NyYXRjaFtpaV0gPSBwU2NyYXRjaF9pbltpaV07Ci0gIH0KLSAgLyoKICAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCiAgICAqLwogICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwpAQCAtMjMwLDUwICsyMzksODEgQEAKICAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCiAgICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKQogICB7CisgICAgLy8gbWFrZSBjb3B5IG9mIGlucHV0IGRhdGEKKyAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsCisgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCiAgICAgICovCiAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCiAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCi0gICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLwotICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLworICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOworI2VuZGlmCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCiAgICAgICovCi0gICAgRnJvbTJpVG9Nb25vX0Zsb2F0KChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIEZyb21NY1RvTW9ub19GbG9hdChwU2NyYXRjaCwgLyogU291cmNlICovCisgICAgICAgIHBNb25vLCAvKiBNb25vIGRlc3RpbmF0aW9uICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCisgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQorICAgIEZyb20yaVRvTW9ub19GbG9hdChwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCiAgICAgICAgIHBNb25vLCAvKiBNb25vIGRlc3RpbmF0aW9uICAgICAgKi8KLSAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCiAgICAgICovCiAgICAgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAgKi8KLSAgICAgICAgKExWTV9GTE9BVCAqKXBNb25vLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgKExWTV9GTE9BVCAqKXBNb25vLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KLSAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisgICAgICAgIHBNb25vLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKIAogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CiAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAqLworICAgICAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAqLworICAgICAgICBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAgICAgKi8KKyAgICAgICAgTnJDaGFubmVscyk7IC8qIE51bWJlciBvZiBjaGFubmVscyAgICAgKi8KKyNlbHNlCiAgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCiAgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KICAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLwogICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCi0gICAgICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKyAgICAgICAgTnJGcmFtZXMpOworI2VuZGlmCiAKLSAgICBmb3IgKGlpID0gMDsgaWkgPCAyICogTnVtU2FtcGxlczsgaWkrKykgeworICAgIGZvciAoTFZNX0lOVDMyIGlpID0gMDsgaWkgPCBOclNhbXBsZXM7ICsraWkpIHsKICAgICAgIC8vVE9ETzogcmVwbGFjZSB3aXRoIGV4aXN0aW5nIGNsYW1waW5nIGZ1bmN0aW9uCi0gICAgICBpZihwU2NyYXRjaFtpaV0gPCAtMS4wKSB7CisgICAgICBpZiAocFNjcmF0Y2hbaWldIDwgLTEuMCkgewogICAgICAgICBwU2NyYXRjaFtpaV0gPSAtMS4wOwotICAgICAgfSBlbHNlIGlmKHBTY3JhdGNoW2lpXSA+IDEuMCkgeworICAgICAgfSBlbHNlIGlmIChwU2NyYXRjaFtpaV0gPiAxLjApIHsKICAgICAgICAgcFNjcmF0Y2hbaWldID0gMS4wOwogICAgICAgfQogICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBjbGVhciBEQkUgcHJvY2Vzc2VkIHBhdGgKKyAgICBtZW1zZXQocFNjcmF0Y2gsIDAsIHNpemVvZigqcFNjcmF0Y2gpICogTnJTYW1wbGVzKTsKICAgfQogCiAgIC8qIEJ5cGFzcyBWb2x1bWUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT0ZGIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KQEAgLTI4NiwyMSArMzI2LDQwIEBACiAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKICAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQogICAgICAqLwotICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCi0gICAgICAgIHBTY3JhdGNoX2luLAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgIHBJbkRhdGEsCiAgICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAorICAgICAgICBwSW5EYXRhLAorICAgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAvKiBMZWZ0IGFuZCByaWdodCwgcmVhbGx5ICMgc2FtcGxlcyAqLworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgLy8gY2xlYXIgYnlwYXNzIHZvbHVtZSBwYXRoCisgICAgbWVtc2V0KHBTY3JhdGNoVm9sLCAwLCBzaXplb2YoKnBTY3JhdGNoVm9sKSAqIE5yU2FtcGxlcyk7CiAgIH0KIAogICAvKgogICAgKiBNaXggREJFIHByb2Nlc3NlZCBwYXRoIGFuZCBieXBhc3Mgdm9sdW1lIHBhdGgKICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCisgICAgICBwU2NyYXRjaCwKKyAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgcE91dERhdGEsCisgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKICAgICAgIHBTY3JhdGNoLAogICAgICAgcFNjcmF0Y2hWb2wsCiAgICAgICBwT3V0RGF0YSwKLSAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7Ci0KLSAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOworI2VuZGlmCisgIHJldHVybiBMVkRCRV9TVUNDRVNTOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKaW5kZXggYzRhOWIxNC4uYTJjZTQwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwpAQCAtODgsMTEgKzg4LDIxIEBACiAgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczg4MjAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzU1X0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzU1X0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzU1X0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM1NV9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAsCkBAIC0xNDcsMTEgKzE1NywyMSBAQAogICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM4ODIwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjNjZfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM2Nl9CMX0sCiAgICAge0hQRl9Gczk2MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzOTYwMDBfRmM2Nl9BMSwKICAgICAgSFBGX0ZzOTYwMDBfRmM2Nl9BMCwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjIsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzY2X0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAogICAgIHtIUEZfRnMxOTIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEsCiAgICAgIEhQRl9GczE5MjAwMF9GYzY2X0EwLApAQCAtMjA3LDExICsyMjcsMjEgQEAKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzODgyMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzc4X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNzhfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzc4X0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzc4X0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMCwKQEAgLTI2OSwxMSArMjk5LDIxIEBACiAKICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0hQRl9Gczg4MjAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzkwX0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzkwX0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzkwX0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM5MF9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAsCkBAIC0zMjAsOSArMzYwLDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgIHtCUEZfRnM4ODIwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAtQlBGX0ZzODgyMDBfRmM1NV9CMiwKKyAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IxfSwKICAgICAge0JQRl9Gczk2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICAge0JQRl9GczE3NjQwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IyLAorICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IxfSwKICAgICAge0JQRl9GczE5MjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMX0sCkBAIC0zNTcsOSArNDAzLDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzOTYwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxNzY0MDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnMxOTIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjF9LApAQCAtMzk0LDkgKzQ0NiwxNSBAQAogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtCUEZfRnM4ODIwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCiAgICAge0JQRl9Gczk2MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzMTkyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IxfSwKQEAgLTQzMiw5ICs0OTAsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9CiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgLAorICAgIHtCUEZfRnM4ODIwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM4ODIwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzODgyMDBfRmM5MF9CMX0sCiAgICAge0JQRl9Gczk2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMTc2NDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczE3NjQwMF9GYzkwX0IxfSwKICAgICB7QlBGX0ZzMTkyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IxfQpAQCAtNDY2LDcgKzUzMCw5IEBACiAgICAgQUdDX0FUVEFDS19GczQ0MTAwLAogICAgIEFHQ19BVFRBQ0tfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxBR0NfQVRUQUNLX0ZzODgyMDAKICAgICAsQUdDX0FUVEFDS19Gczk2MDAwCisgICAgLEFHQ19BVFRBQ0tfRnMxNzY0MDAKICAgICAsQUdDX0FUVEFDS19GczE5MjAwMAogI2VuZGlmCiAKQEAgLTQ4OCw3ICs1NTQsOSBAQAogICAgIEFHQ19ERUNBWV9GczQ0MTAwLAogICAgIEFHQ19ERUNBWV9GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLEFHQ19ERUNBWV9Gczg4MjAwCiAgICAgLEFHQ19ERUNBWV9GUzk2MDAwCisgICAgLEFHQ19ERUNBWV9GczE3NjQwMAogICAgICxBR0NfREVDQVlfRlMxOTIwMDAKICNlbmRpZgogCkBAIC01ODMsNyArNjUxLDkgQEAKICAgICBWT0xfVENfRnM0NDEwMCwKICAgICBWT0xfVENfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxWT0xfVENfRnM4ODIwMAogICAgICxWT0xfVENfRnM5NjAwMAorICAgICxWT0xfVENfRnMxNzY0MDAKICAgICAsVk9MX1RDX0ZzMTkyMDAwCiAjZW5kaWYKIH07CkBAIC02MDIsNyArNjcyLDkgQEAKICAgICBNSVhfVENfRnM0NDEwMCwKICAgICBNSVhfVENfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxNSVhfVENfRnM4ODIwMAogICAgICxNSVhfVENfRnM5NjAwMAorICAgICxNSVhfVENfRnMxNzY0MDAKICAgICAsTUlYX1RDX0ZzMTkyMDAwCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaAppbmRleCA5YjZkYTMxLi44M2VjYWUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaApAQCAtMjk2LDYgKzI5Niw5IEBACiAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgcGFyYW1ldGVycyBDb250cm9sICovCiAgICAgTFZNX1BTQV9Nb2RlX2VuICAgICAgICAgICAgIFBTQV9FbmFibGU7CiAgICAgTFZNX1BTQV9EZWNheVNwZWVkX2VuICAgICAgIFBTQV9QZWFrRGVjYXlSYXRlOyAgICAgIC8qIFBlYWsgdmFsdWUgZGVjYXkgcmF0ZSovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiAKIH0gTFZNX0NvbnRyb2xQYXJhbXNfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKaW5kZXggMGEzYzMwZS4uMzcyNzJlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYyLDggKzY0LDExIEBACiAgICAgTFZNX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fQnVmZmVyX3QgICAgICpwQnVmZmVyOwogICAgIExWTV9GTE9BVCAgICAgICAgKnBEZXN0OworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworI2Vsc2UKICAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gMjsKLQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCkBAIC0yMDcsOCArMjEyLDcgQEAKICAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwogICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7CiAgICAgTFZNX0lOVDE2ICAgICAgICAqcERlc3Q7Ci0gICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9MjsKLQorICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycwpAQCAtNDk5LDcgKzUwMyw3IEBACiAgICAgICAgIGlmIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkKICAgICAgICAgewogICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KICAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLwogICAgICAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0IC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBudW1iciBvZiBzYW1wbGVzIHRvIG91dHB1dCAqLwpAQCAtNzUwLDcgKzc1NCwxMSBAQAogICAgIExWTV9JTlQxNiAgICAgICBOdW1TYW1wbGVzOwogICAgIExWTV9GTE9BVCAgICAgICAqcFN0YXJ0OwogICAgIExWTV9GTE9BVCAgICAgICAqcERlc3Q7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZGVmaW5lIE5yRnJhbWVzIE51bVNhbXBsZXMgIC8vIGFsaWFzIGZvciBjbGFyaXR5CisjZGVmaW5lIEZyYW1lQ291bnQgU2FtcGxlQ291bnQKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCkBAIC03NTgsNyArNzY2LDYgQEAKICAgICBOdW1TYW1wbGVzID0gcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OwogICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsKIAotCiAgICAgLyoKICAgICAgKiBjaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCiAgICAgICAqLwpAQCAtNzg2LDE0ICs3OTMsMjUgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7CisjZWxzZQorICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyNlbmRpZgogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwRGVzdCArPSBOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwRGVzdCArPSAyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogICAgICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAvKiBTYW1wbGVzIGxlZnQgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZW5kICovCiAgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwpAQCAtODAzLDIzICs4MjEsNDAgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBvZiB0aGUgb3VwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyNlbHNlCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworI2VuZGlmCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBEZXN0ICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQogICAgICAgICAgICAgcERlc3QgKz0gMiAqIE51bVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwogICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIC0gTnVtU2FtcGxlcyk7CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBSZWFsaWduIHRoZSBkZWxheSBidWZmZXIgZGF0YSB0byBhdm9pZCB1c2luZyBjaXJjdWxhciBidWZmZXIgbWFuYWdlbWVudAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIE5yRnJhbWVzXSwgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7CisjZWxzZQogICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIE51bVNhbXBsZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyNlbmRpZgogICAgICAgICAgICAgTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwogICAgICAgICB9CiAgICAgfQpAQCAtODM2LDEzICs4NzEsMjMgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IGFsbCBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogRnJhbWVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbHNlCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZW5kaWYKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBEZXN0ICAgICAgKz0gTnJDaGFubmVscyAqIEZyYW1lQ291bnQ7ICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwRGVzdCAgICAgICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBTYW1wbGVDb3VudCk7ICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCiAgICAgICAgICAgICBTYW1wbGVDb3VudCA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCiAgICAgICAgIH0KQEAgLTg1MSwxNCArODk2LDI1IEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBvbmx5IHNvbWUgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIE5yRnJhbWVzKSk7ICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbHNlCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZW5kaWYKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXJzIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBTdGFydCAgICAgICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgICAgICAgICAgICAgICAvKiBQcm9jZXNzZWQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBEZXN0ICAgICAgICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwU3RhcnQgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzZWQgc2FtcGxlIHBvaW50ZXIgKi8KICAgICAgICAgICAgIHBEZXN0ICAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICBTYW1wbGVDb3VudCAgPSAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCAtIE51bVNhbXBsZXMpOyAvKiBQcm9jZXNzZWQgc2FtcGxlcyBsZWZ0ICovCiAgICAgICAgICAgICBOdW1TYW1wbGVzICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCiAgICAgICAgIH0KQEAgLTg3MCw5ICs5MjYsMTYgQEAKICAgICAgKi8KICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbHNlCiAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZW5kaWYKICAgICAgICAgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICsgU2FtcGxlQ291bnQpOwogICAgIH0KQEAgLTEwNjMsMTQgKzExMjYsMjQgQEAKIHsKIAogICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPTI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjdW5kZWYgTnJGcmFtZXMKKyNkZWZpbmUgTnJGcmFtZXMgKCpwTnVtU2FtcGxlcykgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyNlbHNlCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9IDI7CisjZW5kaWYKIAogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgc2FtcGxlIGNvdW50cwogICAgICAqLwogICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiBOdW1DaGFubmVscyk7IC8qIFVwZGF0ZSB0aGUgSS9PIHBvaW50ZXJzICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KShOckZyYW1lcyAqIE51bUNoYW5uZWxzKTsKKyNlbHNlCiAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICs9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyAqIDIpOworI2VuZGlmCiAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtICpwTnVtU2FtcGxlcyk7IC8qIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50ICovCiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCmluZGV4IDhjMDQ4NDcuLmJhYjQwNDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKQEAgLTQ4Nyw2ICs0ODcsOTcgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgODgyMDAgKi8KKy8qIEdhaW4gPSAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wOTQzNzRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjQxMjU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDAyNjRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ3MTQ2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zMTkwNzRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODY1OTU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTIzODBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTk5MjYzZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MDE5NTNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTQ4ODM2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS43Njk3NzdmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMzE2NjU5ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NTgwNzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNTA0OTYwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjkzNTVmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzE2MjM4ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi40MDY0MTJmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUzMjk1ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY3MjM5NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMjE5Mjc3ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk3MDgzMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNTE3NzE0ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjMwNTY4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuODUyNTY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjY4MTM5NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMjI4Mjc2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjEwMjk0N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuNjQ5ODMwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjU3NTkzOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMTIyODIwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA5NjAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KQEAgLTU4MCw2ICs2NzEsOTggQEAKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE3NjQwMCAqLworLyogR2FpbiA9IDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDY3MTFmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg1NTgwN2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIyNjQ0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTc1NTM5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzYwNzg0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xMDk4ODBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE1MTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjI2MDYxM2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4MDY0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNDI5NzM5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODcwNDA1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS42MTk1MDFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wODMzMjFmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjgzMjQxN2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMyMjIxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMDcxMzEzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTkwMjYzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4zMzkzNTlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg5MTAxNmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjY0MDExMmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMjI4NDY1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuOTc3NTYxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42MDcwOTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4zNTYxODZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAzMTkxNGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjc4MTAxMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTA4NTc1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMjU3NjcxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wNDMzOTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC43OTI0OTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE5MjAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDc4MjMKQEAgLTEyMTYsNCArMTM5OSw0IEBACiAKIAogI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCmluZGV4IGNmZTUzYjguLjYyYjRjNzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgogCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OSwxOCArNzEsMjkgQEAKICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICYmCiAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgJiYKLSAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgICAgICB8fAorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpICAgICAgfHwKICNlbHNlCiAgICAgICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCiAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApKSAgICAgIHx8CiAjZW5kaWYKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAmJgorICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkgfHwKKyNlbHNlCiAgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpIHx8CisjZW5kaWYKICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID4gTFZNX0VYX0hFQURQSE9ORVMpKQogICAgIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPSBwUGFyYW1zLT5OckNoYW5uZWxzOworI2VuZGlmCiAgICAgLyoKICAgICAgKiBDaW5lbWEgU291bmQgcGFyYW1ldGVycwogICAgICAqLwpAQCAtNTY5LDYgKzU4MiwxMCBAQAogICAgIH0gd2hpbGUgKChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nICE9IExWTV9GQUxTRSkgJiYKICAgICAgICAgICAgICAoQ291bnQgPiAwKSk7CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5OckNoYW5uZWxzID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgorCiAgICAgLyogQ2xlYXIgYWxsIGludGVybmFsIGRhdGEgaWYgZm9ybWF0IGNoYW5nZSovCiAgICAgaWYoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCkKICAgICB7CkBAIC03MTksNiArNzM2LDkgQEAKICAgICAgICAgREJFX1BhcmFtcy5IZWFkcm9vbWRCICAgICAgID0gMDsKICAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVDb250cm9sICAgID0gTFZEQkVfVk9MVU1FX09GRjsKICAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVkQiAgICAgICAgID0gMDsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIERCRV9QYXJhbXMuTnJDaGFubmVscyAgICAgICAgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKQEAgLTc3NSw3ICs3OTUsOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTU9OT0lOU1RFUkVPOyAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwogICAgICAgICB9Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIEVRTkJfUGFyYW1zLk5yQ2hhbm5lbHMgICAgICAgICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZwpAQCAtODQ5LDcgKzg3MSw5IEBACiAgICAgICAgIENTX1BhcmFtcy5TYW1wbGVSYXRlICA9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGU7CiAgICAgICAgIENTX1BhcmFtcy5SZXZlcmJMZXZlbCA9IExvY2FsUGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWw7CiAgICAgICAgIENTX1BhcmFtcy5FZmZlY3RMZXZlbCA9IExvY2FsUGFyYW1zLkNTX0VmZmVjdExldmVsOwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBDU19QYXJhbXMuTnJDaGFubmVscyAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjb250cm9sIGZsYWcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCmluZGV4IDI2YzFjNGYuLmM1NzQ5OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwpAQCAtNjEsNiArNjEsNzIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qCisgKiA0IFR5cGVzIG9mIE1lbW9yeSBSZWdpb25zIG9mIExWTQorICogVE9ETzogQWxsb2NhdGUgb24gdGhlIGZseS4KKyAqIGkpICAgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAtIEZvciBJbnN0YW5jZSBIYW5kbGVzCisgKiBpaSkgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgLSBQZXJzaXN0ZW50IEJ1ZmZlcnMKKyAqIGlpaSkgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAtIEZvciBIb2xkaW5nIFN0cnVjdHVyZSB2YWx1ZXMKKyAqIGl2KSAgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAtIEZvciBIb2xkaW5nIFN0cnVjdHVyZSB2YWx1ZXMKKyAqCisgKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBOgorICogICBUb3RhbCBNZW1vcnkgc2l6ZToKKyAqICAgICBzaXplb2YoTFZNX0luc3RhbmNlX3QpICsgXAorICogICAgIHNpemVvZihMVk1fQnVmZmVyX3QpICsgXAorICogICAgIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICsgXAorICogICAgIHNpemVvZihMVk1fQnVmZmVyX3QpIC0gbmVlZGVkIGlmIGJ1ZmZlciBtb2RlIGlzIExWTV9NQU5BR0VEX0JVRkZFUgorICoKKyAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEE6CisgKiAgIFRvdGFsIE1lbW9yeSBzaXplOgorICogICAgIHNpemVvZihMVk1fVEVfRGF0YV90KSArIFwKKyAqICAgICAyICogcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSArIFwKKyAqICAgICBzaXplb2YoTFZDU19EYXRhX3QpICsgXAorICogICAgIHNpemVvZihMVkRCRV9EYXRhX0ZMT0FUX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSArIFwKKyAqICAgICBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pICsgXAorICogICAgIDIgKiBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKyBcCisgKiAgICAgUFNBX0luaXRQYXJhbXMubkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpCisgKgorICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRjoKKyAqICAgVG90YWwgTWVtb3J5IHNpemU6CisgKiAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSArIFwKKyAqICAgICBzaXplb2YoTFZDU19Db2VmZmljaWVudF90KSArIFwKKyAqICAgICBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KSArIFwKKyAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKyBcCisgKiAgICAgUFNBX0luaXRQYXJhbXMubkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KQorICoKKyAqIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgKFNjcmF0Y2gpOgorICogICBUb3RhbCBNZW1vcnkgU2l6ZToKKyAqICAgICBCdW5kbGVTY3JhdGNoU2l6ZSArIFwKKyAqICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9GTE9BVCkgKyBcCisgKiAgICAgTWF4U2NyYXRjaE9mIChDUywgRVFOQiwgREJFLCBQU0EpCisgKgorICogICAgIGEpQnVuZGxlU2NyYXRjaFNpemU6CisgKiAgICAgICAgIDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKKyAqICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fRkxPQVQpCisgKiAgICAgICBUaGlzIE1lbW9yeSBpcyBhbGxvY2F0ZWQgb25seSB3aGVuIEJ1ZmZlciBtb2RlIGlzIExWTV9NQU5BR0VEX0JVRkZFUi4KKyAqICAgICBiKU1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQorICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBzY3JhdGNoIHVzYWdlIGZvciBDUywgRVFOQiwgREJFLCBQU0EuCisgKiAgICAgICBDUyAgID0gKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKQorICogICAgICAgICAgICAgICAqIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSkKKyAqICAgICAgIEVRTkIgPSAoTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBEQkUgID0gKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBQU0EgID0gKDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0ZMT0FUKSkKKyAqICAgICAgICAgICAgICBvbmUgTWF4SW5wdXRCbG9ja1NpemUgZm9yIGlucHV0IGFuZCBhbm90aGVyIGZvciBmaWx0ZXIgb3V0cHV0CisgKiAgICAgYylNQVhfSU5URVJOQUxfQkxPQ0tTSVpFCisgKiAgICAgICBUaGlzIE1lbW9yeSBpcyBuZWVkZWQgZm9yIFBTQUlucHV0IC0gVGVtcCBtZW1vcnkgdG8gc3RvcmUgb3V0cHV0CisgKiAgICAgICBmcm9tIE1jVG9Nb25vIGJsb2NrIGFuZCBnaXZlbiBhcyBpbnB1dCB0byBQU0EgYmxvY2sKKyAqLworCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKQpAQCAtMTY4LDcgKzIzNCwxMyBAQAogICAgIEFsZ1NjcmF0Y2hTaXplICAgID0gMDsKICAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAzICogTFZNX01BWF9DSEFOTkVMUyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTFZNX0ZMT0FUKTsKKyNlbHNlCiAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gNiAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpICogc2l6ZW9mKExWTV9JTlQxNik7CisjZW5kaWYKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sICAgICAgICAvKiBTY3JhdGNoIGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCkBAIC0yMzMsNyArMzA1LDEzIEBACiAgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKICNlbmRpZgpAQCAtMjcwLDcgKzM0OCwxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTM1Nyw4ICs0NDEsMTMgQEAKICAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOwogCiAgICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9GTE9BVCkpOworI2Vsc2UKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisjZW5kaWYKIAogICAgICAgICAgICAgaWYgKFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKQogICAgICAgICAgICAgewpAQCAtNTQ3LDEzICs2MzYsMjAgQEAKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9CdWZmZXJfdCkpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gKExWTV9JTlQzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyAqIExWTV9NQVhfQ0hBTk5FTFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZWxzZQogICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpKDYgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fSU5UMTYpKTsKKyNlbmRpZgogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5wU2NyYXRjaCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgIC8qIFNjcmF0Y2ggMSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUJ1bmRsZVNjcmF0Y2hTaXplKTsKICNpZmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOwogI2Vsc2UKICAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCkBAIC01ODQsOCArNjgwLDExIEBACiAgICAgLyoKICAgICAgKiBEQyByZW1vdmFsIGZpbHRlcgogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZWxzZQogICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKLQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudApAQCAtNzQ0LDcgKzg0MywxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7CisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTgwMiw3ICs5MDcsMTMgQEAKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTkyMDAwOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfODgyMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xNzY0MDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOwogI2VuZGlmCkBAIC0xMDM5LDcgKzExNTAsMTEgQEAKICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMoaEluc3RhbmNlLCAmSGVhZHJvb21QYXJhbXMpOwogCiAgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOworI2Vsc2UKICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZW5kaWYKIAogICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCmluZGV4IGI0NTMyMjIuLjE5ZDE1MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaApAQCAtMTQ0LDEyICsxNDQsMTkgQEAKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLwogCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQnVmZmVyU3RhdGU7ICAgICAgICAvKiBCdWZmZXIgc3RhdHVzICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbMyAqIExWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsKKyNlbHNlCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlcls2ICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIElucHV0IGJ1ZmZlciBkZWxheSBsaW5lLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAqLworI2VuZGlmCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW5EZWxheVNhbXBsZXM7ICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCi0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOworI2Vsc2UKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIE91dHB1dCBidWZmZXIgZGVsYXkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICovCisjZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KQEAgLTI4Miw2ICsyODksMTAgQEAKIAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTm9TbW9vdGhWb2x1bWU7ICAgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgc21vb3RoIHZvbHVtZSBjaGFuZ2VzKi8KIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKKwogfSBMVk1fSW5zdGFuY2VfdDsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwppbmRleCA0YTE5YTEzLi45NGJhMjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKQEAgLTY1LDYgKzY1LDEwIEBACiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFRvUHJvY2VzcyA9IChMVk1fRkxPQVQgKilwSW5EYXRhOwogICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBQcm9jZXNzZWQgPSBwT3V0RGF0YTsKICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICBTdGF0dXM7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgTnJDaGFubmVscyAgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZGVmaW5lIE5yRnJhbWVzIFNhbXBsZUNvdW50ICAvLyBhbGlhcyBmb3IgY2xhcml0eQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvCkBAIC0xMTIsNiArMTE2LDEwIEBACiAgICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCiAgICAgewogICAgICAgICBTdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgLyogVXBkYXRlIHRoZSBsb2NhbCB2YXJpYWJsZSBOckNoYW5uZWxzIGZyb20gcEluc3RhbmNlLT5OckNoYW5uZWxzIHZhbHVlICovCisgICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICBpZihTdGF0dXMgIT0gTFZNX1NVQ0NFU1MpCiAgICAgICAgIHsKQEAgLTEzMCw2ICsxMzgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KICAgICAgICAgcElucHV0ICAgICA9IHBPdXREYXRhOwogICAgICAgICBwVG9Qcm9jZXNzID0gcE91dERhdGE7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBOckNoYW5uZWxzID0gMjsKKyNlbmRpZgogICAgIH0KIAogCkBAIC0xNTMsNyArMTY0LDYgQEAKICAgICAgICAgICovCiAgICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQogICAgICAgICB7Ci0KICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBBcHBseSBDb25jZXJ0U291bmQgaWYgcmVxdWlyZWQKICAgICAgICAgICAgICAqLwpAQCAtMTcxLDEwICsxODEsMTggQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VkNfQWN0aXZlIT0wKQogICAgICAgICAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJGcmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisjZW5kaWYKICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKICAgICAgICAgICAgIH0KIApAQCAtMjIxLDIwICsyMzksMzMgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisjZW5kaWYKIAogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIC8qIFRPRE8gLSBNdWx0aWNoYW5uZWwgc3VwcG9ydCB0byBiZSBhZGRlZCAqLworICAgICAgICAgICAgaWYgKE5yQ2hhbm5lbHMgPT0gMikKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBQZXJmb3JtIFBhcmFtZXRyaWMgU3BlY3R1bSBBbmFseXNpcwpAQCAtMjQyLDI4ICsyNzMsMzkgQEAKICAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09OKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKFNhbXBsZUNvdW50KSk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgIEZyb21NY1RvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJGcmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCkpOworI2VuZGlmCiAKLSAgICAgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoU2FtcGxlQ291bnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKFNhbXBsZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CiAgICAgICAgICAgICB9CiAKLQogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIERDIHJlbW92YWwKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIERDX01jX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7Ci0KLQorI2VuZGlmCiAgICAgICAgIH0KLQogICAgICAgICAvKgogICAgICAgICAgKiBNYW5hZ2UgdGhlIG91dHB1dCBidWZmZXIKICAgICAgICAgICovCkBAIC00OTcsNCArNTM5LDQgQEAKIAogICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwppbmRleCAxOTlkZGRlLi5hNTM1NmQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCkBAIC0yNjksNiArMjY5LDUzIEBACiAgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgIC8qIDg4a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA4ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDExICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjE1X0IxfSwKKwogICAgICAgICAgICAgICAgICAgICAvKiA5NmtIeiBzYW1wbGluZyByYXRlICovCiAgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjFfQTAsCkBAIC0zMTYsNiArMzYzLDUzIEBACiAgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCwKICAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNV9CMX0sCiAKKyAgICAgICAgICAgICAgICAgICAgLyogMTc2a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA3ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjE1X0IxfSwKKwogICAgICAgICAgICAgICAgICAgICAvKiAxOTJrSHogc2FtcGxpbmcgcmF0ZSAqLwogICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwogICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCmluZGV4IDlhM2QzNWQuLjA2ZTc0MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCkBAIC03OCw2ICs3OCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwU3RTcmMsICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckZyYW1lcywgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOyAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAppbmRleCAzZWU3ZjYzLi4wMTUzOWIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaApAQCAtMzAsOCArMzAsMTcgQEAKICNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyogVGhlIG1lbW9yeSByZWdpb24gY3JlYXRlZCBieSB0aGlzIHN0cnVjdHVyZSBpbnN0YW5jZSBpcyB0eXBlY2FzdAorICAgICAqIGludG8gYW5vdGhlciBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIHBvaW50ZXIgYW5kIGFuIGFycmF5IG9mIGZpbHRlcgorICAgICAqIGNvZWZmaWNpZW50cy4gSW4gb25lIGNhc2UgdGhpcyBtZW1vcnkgcmVnaW9uIGlzIHVzZWQgZm9yIHN0b3JpbmcKKyAgICAgKiBEQyBjb21wb25lbnQgb2YgY2hhbm5lbHMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgKnBTdG9yYWdlOworICAgIExWTV9GTE9BVCBTdG9yYWdlW0xWTV9NQVhfQ0hBTk5FTFNdOworI2Vsc2UKICAgICBMVk1fRkxPQVQgU3RvcmFnZVs2XTsKLQorI2VuZGlmCiB9IEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90OwogI2Vsc2UKIHR5cGVkZWYgc3RydWN0CkBAIC0xNzksNyArMTg4LDEyIEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyogTFZNX01BWF9DSEFOTkVMUyBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKExWTV9NQVhfQ0hBTk5FTFMgKiAyKSBdOworI2Vsc2UKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworI2VuZGlmCiB9IEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190OwogI2Vsc2UKIHR5cGVkZWYgc3RydWN0CkBAIC0xOTcsMTIgKzIxMSwxNyBAQAogI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDQpIF07ICAvKiBPbmUgY2hhbm5lbCwgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KIH0gQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3Q7CiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogNCkgXTsgIC8qIFR3byBjaGFubmVscywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qIExWTV9NQVhfQ0hBTk5FTFMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDQpIF07CisjZWxzZQorICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworI2VuZGlmCiB9IEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190OwogI2Vsc2UKIHR5cGVkZWYgc3RydWN0CkBAIC0zNjYsNiArMzg1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBCUV9NQ19EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCkBAIC00MzQsNiArNDYwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICpwVGFwcywKQEAgLTUyNyw2ICs1NjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKQEAgLTU0MCwxMiArNTgwLDIyIEBACiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKKwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKIAogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaAppbmRleCA4MWUyODhjLi5hNzYzNTRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaApAQCAtNDQsNyArNDQsMTUgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fSU5UMzIgU3RvcmFnZVs2XTsKKyAgICAvKgorICAgICAqIFRoZSBtZW1vcnkgYXJlYSBjcmVhdGVkIHVzaW5nIHRoaXMgc3RydWN0dXJlIGlzIGludGVybmFsbHkKKyAgICAgKiB0eXBlY2FzdCB0byBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90IGFuZCB1c2VkLgorICAgICAqIFRoZSBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90IHN0cnVjdHVyZSBoYXMgMyBwb2ludGVyIHR5cGUgZWxlbWVudHMKKyAgICAgKiAyIGVsZW1lbnRzIG9mIHR5cGUgTFZNX0lOVDMyIGFuZCBvbmUgZWxlbWVudCBvZiB0eXBlIExWTV9JTlQxNi4KKyAgICAgKiBJbm9yZGVyIHRvIGNhdGVyIGJvdGggMzIgYW5kIDY0IGJpdCBidWlsZHMsIFN0b3JhZ2UgYXJyYXkgc2hvdWxkCisgICAgICogaGF2ZSBhIG1pbmltdW0gb2YgOSBlbGVtZW50cyBvZiB0eXBlIExWTV9JTlQzMi4KKyAgICAgKi8KKyAgICBMVk1fSU5UMzIgU3RvcmFnZVs5XTsKIAogfSBMVk1fVGltZXJfSW5zdGFuY2VfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCBlYTE2MDcyLi41OTU4NmUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtMTIyLDYgKzEyMiwxMiBAQAogCiAjZW5kaWYgLy8gTkFUSVZFX0ZMT0FUX0JVRkZFUgogCisjaWZkZWYgU1VQUE9SVF9NQworI2RlZmluZSBMVk1fTUFYX0NIQU5ORUxTIDggLy8gRkNDXzgKKyNlbHNlCisjZGVmaW5lIExWTV9NQVhfQ0hBTk5FTFMgMiAvLyBGQ0NfMgorI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU3RhbmRhcmQgRW51bWVyYXRlZCB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE0Myw2ICsxNDksOSBAQAogICAgIExWTV9TVEVSRU8gICAgICAgICAgPSAwLAogICAgIExWTV9NT05PSU5TVEVSRU8gICAgPSAxLAogICAgIExWTV9NT05PICAgICAgICAgICAgPSAyLAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fTVVMVElDSEFOTkVMICAgID0gMywKKyNlbmRpZgogICAgIExWTV9TT1VSQ0VfRFVNTVkgICAgPSBMVk1fTUFYRU5VTQogfSBMVk1fRm9ybWF0X2VuOwogCkBAIC0xNjAsOCArMTY5LDEwIEBACiAgICAgTFZNX0ZTXzQ0MTAwID0gNywKICAgICBMVk1fRlNfNDgwMDAgPSA4LAogI2lmZGVmIEhJR0hFUl9GUwotICAgIExWTV9GU185NjAwMCA9IDksCi0gICAgTFZNX0ZTXzE5MjAwMCA9IDEwLAorICAgIExWTV9GU184ODIwMCA9IDksCisgICAgTFZNX0ZTXzk2MDAwID0gMTAsCisgICAgTFZNX0ZTXzE3NjQwMCA9IDExLAorICAgIExWTV9GU18xOTIwMDAgPSAxMiwKICNlbmRpZgogICAgIExWTV9GU19JTlZBTElEID0gTFZNX01BWEVOVU0tMSwKICAgICBMVk1fRlNfRFVNTVkgPSBMVk1fTUFYRU5VTQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCmluZGV4IDBiYTIwYTMuLjc0NjhhOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKQEAgLTQ3LDYgKzQ3LDE2IEBACiB2b2lkIENvcHlfRmxvYXQoICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKCAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwordm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyggICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgQ29weV8xNiggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCkBAIC0xODEsNiArMTkxLDEyIEBACiB2b2lkIEZyb20yaVRvTW9ub19GbG9hdCggICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgRnJvbTJpVG9Nb25vXzMyKCAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKaW5kZXggZmE5ZjAxZi4uNWM4NjU1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKQEAgLTMwNSw0ICszMDUsMTUwIEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFwcGx5IEFHQyBhbmQgbWl4IHNpZ25hbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNY1NyYyAgIC0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgX19fX19fICAgICAgIF98XyAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgfCAgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vbm9TcmMgLS0+fCBBR0MgIHwtLS0tPnwgKyB8LS0tLS0+fCBWb2x1bWUgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0+ICAgICovCisvKiAgICAgICAgICAgICB8IEdhaW4gfCAgICAgfF9fX3wgICAgICB8IEdhaW4gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHxfX19fX198ICAgICAgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgL3xcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX18gICAgIF9fX19fX19fICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICB8ICAgICAgICB8ICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgQUdDIEdhaW4gfDwtLXwgUGVhayAgIHw8LS18ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVcGRhdGUgICB8ICAgfCBEZXRlY3QgfCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX3wgICB8X19fX19fX198ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNY1NyYyAgICAgICAgICAgICAgICAgIE11bHRpY2hhbm5lbCBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1vbm9TcmMgICAgICAgICAgICAgICAgTW9ubyBiYW5kIHBhc3Mgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRHN0ICAgICAgICAgICAgICAgICAgICBNdWx0aWNoYW5uZWwgZGVzdGluYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5yRnJhbWVzICAgICAgICAgICAgICAgIE51bWJlciBvZiBmcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnJDaGFubmVscyAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1jU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCit7CisKKyAgICAvKgorICAgICAqIEdlbmVyYWwgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgIGksIGpqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUICAgICAgIFNhbXBsZVZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHZhbHVlICovCisgICAgTFZNX0ZMT0FUICAgICAgIE1vbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBzYW1wbGUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQWJzUGVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBwZWFrIHNpZ25hbCAqLworICAgIExWTV9GTE9BVCAgICAgICBBR0NfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgIFZvbF9NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgdm9sdW1lICovCisKKworICAgIC8qCisgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICAvKiBEZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOworICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IE5yRnJhbWVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIGZyYW1lICovCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgc2NhbGVycworICAgICAgICAgKi8KKyAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIEFHQyBnYWluICovCisgICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9GTE9BVCkoVm9sX0N1cnJlbnQpOyAgICAgICAgICAgLyogR2V0IHRoZSB2b2x1bWUgZ2FpbiAqLworCisgICAgICAgIEFic1BlYWsgPSAwLjBmOworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNhbXBsZVZhbCAgPSAqcE1jU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNhbXBsZSB2YWx1ZSBvZiBqaiBDaGFubmVsKi8KKyAgICAgICAgICAgIE1vbm8gICAgICAgPSAqcE1vbm9TcmM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1vbm8gc2FtcGxlICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGdhaW4gdG8gdGhlIG1vbm8gaW5wdXQgYW5kIG1peCB3aXRoIHRoZSBpbnB1dCBzaWduYWwKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU2FtcGxlVmFsICArPSAoTW9ubyAqIEFHQ19NdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTYW1wbGVWYWwgID0gU2FtcGxlVmFsICAqIFZvbF9NdWx0OworCisgICAgICAgICAgICAqcERzdCsrID0gU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBYnNQZWFrID0gQWJzX0Zsb2F0KFNhbXBsZVZhbCkgPiBBYnNQZWFrID8gQWJzX0Zsb2F0KFNhbXBsZVZhbCkgOiBBYnNQZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBNb25vU3JjKys7CisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gIChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8qU1VQUE9SVF9NQyovCiAjZW5kaWYgLypCVUlMRF9GTE9BVCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwppbmRleCA5NjBkZTc5Li5kNjMzNjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKQEAgLTEyMyw2ICsxMjMsODcgQEAKICAgICAgICAgfQogCiAgICAgfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gdG8KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAtIDFdIGlzIHgobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0Kk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscykKKworCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW4sIHRlbXA7CisgICAgICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBDSEFOTkVMLVdJU0UKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogeW49IChBMiAgKiB4KG4tMikpICovCisgICAgICAgICAgICAgICAgeW4gPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKyBqal07CisKKyAgICAgICAgICAgICAgICAvKiB5bis9IChBMSAgKiB4KG4tMSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9IChBMCAgKiB4KG4pKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgIC8qIHluKz0gKC1CMiAgKiB5KG4tMikpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyozICsgampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgtQjEgICogeShuLTEpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMiArIGpqXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSAoTFZNX0ZMT0FUKXluOyAvKiBVcGRhdGUgeShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKSovCisgICAgICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bjsgLyogV3JpdGUgamogQ2hhbm5lbCBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisjZW5kaWYgLypTVVBQT1JUX01DKi8KKwogI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwppbmRleCBlNDg5MDMxLi4zODU4NDUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCkBAIC04NCw1ICs4NCw2NSBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8vIEV4dHJhY3Qgb3V0IHRoZSBzdGVyZW8gY2hhbm5lbCBwYWlyIGZyb20gbXVsdGljaGFubmVsIHNvdXJjZS4KK3ZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpOworCisgICAgaWYgKE5yQ2hhbm5lbHMgPj0gMikKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0WzFdID0gc3JjWzFdOworICAgICAgICAgICAgZHN0ICs9IDI7CisgICAgICAgICAgICBzcmMgKz0gTnJDaGFubmVsczsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChOckNoYW5uZWxzID09IDEpCisgICAgeyAgIC8vIG5vdCBleHBlY3RlZCB0byBvY2N1ciwgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICAgICAgc3JjICs9IChOckZyYW1lcyAtIDEpOworICAgICAgICBkc3QgKz0gMiAqIChOckZyYW1lcyAtIDEpOworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdFsxXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdCAtPSAyOworICAgICAgICAgICAgc3JjIC0tOworICAgICAgICB9CisgICAgfQorfQorCisvLyBNZXJnZSBhIG11bHRpY2hhbm5lbCBzb3VyY2Ugd2l0aCBzdGVyZW8gY29udGFpbmVkIGluIGRzdCwgdG8gZHN0Lgordm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyovCisgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgTFZNX0ZMT0FUICpzcmNfc3QgPSBkc3QgKyAyICogKE5yRnJhbWVzIC0gMSk7CisKKyAgICAvLyByZXBhY2sgZHN0IHdoaWNoIGNhcnJpZXMgc3RlcmVvIGluZm9ybWF0aW9uCisgICAgLy8gdG9nZXRoZXIgd2l0aCB0aGUgdXBwZXIgY2hhbm5lbHMgb2Ygc3JjLgorICAgIGRzdCArPSBOckNoYW5uZWxzICogKE5yRnJhbWVzIC0gMSk7CisgICAgc3JjICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBkc3RbMV0gPSBzcmNfc3RbMV07CisgICAgICAgIGRzdFswXSA9IHNyY19zdFswXTsgLy8gY29weSAxIGJlZm9yZSAwIGlzIHJlcXVpcmVkIGZvciBOckNoYW5uZWxzID09IDMuCisgICAgICAgIGZvciAoamogPSAyOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtqal0gPSBzcmNbampdOworICAgICAgICB9CisgICAgICAgIGRzdCAgICAtPSBOckNoYW5uZWxzOworICAgICAgICBzcmMgICAgLT0gTnJDaGFubmVsczsKKyAgICAgICAgc3JjX3N0IC09IDI7CisgICAgfQorfQorI2VuZGlmCiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKaW5kZXggZDI2MWM5ZS4uMTNmYWM1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7CiAgICAgICAgIGZvcihqID0gTnJTYW1wbGVzLTE7IGogPj0gMDsgai0tKQogICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW5kIHNhdHVyYXRlICovCiAgICAgICAgICAgICBEaWZmID0qIChwRGF0YUluKyspIC0gKExlZnREQyk7CiAgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKICAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQpAQCAtNjQsNiArNjQsNTggQEAKIAogCiAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBEQyByZW1vdmFsIGZyb20gYWxsIGNoYW5uZWxzIG9mIGEgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwSW5zdGFuY2UgICAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgcERhdGFJbiAgICAgICAgSW5wdXQvU291cmNlCisgKiAgcERhdGFPdXQgICAgICAgT3V0cHV0L0Rlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAqQ2hEQzsKKyAgICAgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgICAgIExWTV9JTlQzMiBqOworICAgICAgICBMVk1fSU5UMzIgaTsKKyAgICAgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOworCisgICAgICAgIENoREMgPSAmcEJpcXVhZFN0YXRlLT5DaERDWzBdOworICAgICAgICBmb3IgKGogPSBOckZyYW1lcyAtIDE7IGogPj0gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbmQgc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IE5yQ2hhbm5lbHMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gKihwRGF0YUluKyspIC0gKENoRENbaV0pOworICAgICAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERpZmYgPCAtMS4wZikgeworICAgICAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KKyAgICAgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBDaERDW2ldIC09IERDX0ZMT0FUX1NURVA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hEQ1tpXSArPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmCiAjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDRmNGZjZDguLjBmOTQxYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTI0LDYgKzI0LDE3IEBACiAgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgICAgID0gMC4wZjsKICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgICAgICAgPSAwLjBmOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQoreworICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlX01jKSBwSW5zdGFuY2U7CisgICAgTFZNX0lOVDMyIGk7CisgICAgZm9yIChpID0gMDsgaSA8IExWTV9NQVhfQ0hBTk5FTFM7IGkrKykKKyAgICB7CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+Q2hEQ1tpXSA9IDAuMGY7CisgICAgfQorfQorI2VuZGlmCiAjZWxzZQogdm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggZmE2YjcyOS4uZGIzYTZkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMzQsNiArMzQsMTMgQEAKICAgICBMVk1fRkxPQVQgIFJpZ2h0REM7ICAgIC8qIFJpZ2h0REMgICovCiB9RmlsdGVyX0ZMT0FUX1N0YXRlOwogdHlwZWRlZiBGaWx0ZXJfRkxPQVRfU3RhdGUgKiBQRmlsdGVyX0ZMT0FUX1N0YXRlIDsKKyNpZmRlZiBTVVBQT1JUX01DCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX0ZMT0FUX1N0YXRlX01jXworeworICAgIExWTV9GTE9BVCAgQ2hEQ1tMVk1fTUFYX0NIQU5ORUxTXTsgICAgIC8qIENoYW5uZWxEQyAgKi8KK30gRmlsdGVyX0ZMT0FUX1N0YXRlX01jOwordHlwZWRlZiBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgKiBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIDsKKyNlbmRpZgogI2Vsc2UKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKaW5kZXggMTkyOTI3Yy4uMmE1MGYxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwpAQCAtMTE3LDYgKzExNyw5MyBAQAogICAgICAgICB9CiAKICAgICB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBU1NVTVBUSU9OUzoKK0NPRUZTLQorcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMSwKK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTAsCitwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwKK0RFTEFZUy0KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKmNoICsgMF0gaXMgeChuLTEpIG9mIHRoZSAnY2gnIC0gY2hhbm5lbAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqY2ggKyAxXSBpcyB5KG4tMSkgb2YgdGhlICdjaCcgLSBjaGFubmVsCitUaGUgaW5kZXggJ2NoJyBydW5zIGZyb20gMCB0byAoTnJDaGFubmVscyAtIDEpCisKK1BBUkFNRVRFUlM6CisgcEluc3RhbmNlICAgICAgICBQb2ludGVyIEluc3RhbmNlCisgcERhdGFJbiAgICAgICAgICBJbnB1dC9Tb3VyY2UKKyBwRGF0YU91dCAgICAgICAgIE91dHB1dC9EZXN0aW5hdGlvbgorIE5yRnJhbWVzICAgICAgICAgTnVtYmVyIG9mIGZyYW1lcworIE5yQ2hhbm5lbHMgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisKK1JFVFVSTlM6Cisgdm9pZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgICB5bjsKKyAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDsKKyAgICAgICAgTFZNX0lOVDE2ICAgaWk7CisgICAgICAgIExWTV9JTlQxNiAgIGNoOworICAgICAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgTFZNX0ZMT0FUICAgKnBEZWxheXMgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXM7CisgICAgICAgIExWTV9GTE9BVCAgICpwQ29lZnMgID0gJnBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisgICAgICAgIExWTV9GTE9BVCAgIEEwID0gcENvZWZzWzFdOworICAgICAgICBMVk1fRkxPQVQgICBBMSA9IHBDb2Vmc1swXTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQjEgPSBwQ29lZnNbMl07CisKKworCisKKyAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIENIQU5ORUxTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHluID1BMSAgKiB4KG4tMSkKKyAgICAgICAgICAgICAgICB5biA9IChMVk1fRkxPQVQpQTEgKiBwRGVsYXlzWzBdOworCisgICAgICAgICAgICAgICAgLy8geW4rPUEwICAqIHgobikKKyAgICAgICAgICAgICAgICB5biArPSAoTFZNX0ZMT0FUKUEwICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgICAgIC8vIHluICs9ICAoLUIxICAqIHkobi0xKSkKKyAgICAgICAgICAgICAgICBUZW1wID0gQjEgKiBwRGVsYXlzWzFdOworICAgICAgICAgICAgICAgIHluICs9IFRlbXA7CisKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIHBEZWxheXNbMV0gPSB5bjsgLy8gVXBkYXRlIHkobi0xKQorICAgICAgICAgICAgICAgIHBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSkKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICAgICAvKlNhdHVyYXRlIHJlc3VsdHMqLworICAgICAgICAgICAgICAgIGlmICh5biA+IDEuMGYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5biA9IDEuMGY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5biA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIHluID0gLTEuMGY7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluOworICAgICAgICAgICAgICAgIHBEZWxheXMgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEZWxheXMgLT0gTnJDaGFubmVscyAqIDI7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKICNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKaW5kZXggYWMxZWVhOC4uZDAyYWY4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKQEAgLTY4LDUgKzY4LDQ3IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBDcmVhdGVzIGEgbW9ubyBzdHJlYW0gZnJvbSBhIG11bHRpY2hhbm5lbCBpbnB1dCB0YWtpbmcgdGhlIGF2ZXJnYWUgb2YKKyAqICBzYW1wbGUgdmFsdWVzIG9mIGFsbCBjaGFubmVscworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICBMVk1fRkxPQVQgVGVtcDsKKworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAwLjBmOworICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wICs9ICgqc3JjKTsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgICAgICpkc3QgPSBUZW1wIC8gTnJDaGFubmVsczsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCisKICNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCBkMjY5NGNjLi40MTljN2M1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTI2LDEwICsyNiwxMCBAQAogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKIHsKIAogICAgIExWTV9JTlQxNiAgIE91dExvb3A7CkBAIC0xMTQsNiArMTE0LDEzOSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckNoYW5uZWxzKQoreworCisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksIGpqOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBTYW1lIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gY29uc2VjdXRpdmUgZnJhbWVzLgorICAgICAqIFNvIHR3byBmcmFtZXMgYXJlIHByb2Nlc3NlZCBpbiBvbmUgaXRlcmF0aW9uIGFuZAorICAgICAqIHRoZSBsb29wIHdpbGwgcnVuIG9ubHkgZm9yIGhhbGYgdGhlIE5yRnJhbWVzIHZhbHVlIHRpbWVzLgorICAgICAqLworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzID4+IDEpOworICAgIC8qIE91dExvb3AgaXMgY2FsY3VsYXRlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgTnJGcmFtZXMgdmFsdWUgY2FuIGJlIG9kZC4qLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyAtIChJbkxvb3AgPDwgMSkpOworCisgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIHsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworCisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OworfQorCisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKaW5kZXggYjVlN2Y1Yy4uNWJmZGFkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwpAQCAtMjcsMTAgKzI3LDEwIEBACiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKIHsKICAgICBMVk1fSU5UMTYgICBPdXRMb29wOwogICAgIExWTV9JTlQxNiAgIEluTG9vcDsKQEAgLTEwNSw2ICsxMDUsMTE5IEBACiAgICAgfQogICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OwogfQorCisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQQorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpLCBqajsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBTYW1lIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gY29uc2VjdXRpdmUgZnJhbWVzLgorICAgICAqIFNvIHR3byBmcmFtZXMgYXJlIHByb2Nlc3NlZCBpbiBvbmUgaXRlcmF0aW9uIGFuZAorICAgICAqIHRoZSBsb29wIHdpbGwgcnVuIG9ubHkgZm9yIGhhbGYgdGhlIE5yRnJhbWVzIHZhbHVlIHRpbWVzLgorICAgICAqLworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzID4+IDEpOworICAgIC8qIE91dExvb3AgaXMgY2FsY3VsYXRlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgTnJGcmFtZXMgdmFsdWUgY2FuIGJlIG9kZC4qLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyAtIChJbkxvb3AgPDwgMSkpOworCisgICAgaWYgKEN1cnJlbnQ8VGFyZ2V0KSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOworCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisKKyAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7CisKKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkgeworICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7Cit9CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCAxOTJmMTI2Li42NTk1NmY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMzQsMTAgKzM0LDEwIEBACiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQordm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKIHsKICAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKICAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOwpAQCAtMTA2LDYgKzEwNiwxMTAgQEAKICAgICB9CiAKIH0KKworCisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCkgeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZikgeworICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcypOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+VGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KSB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmCisKKwogI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYwppbmRleCAxMDE3ZGUzLi4wNjc4YWUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKQEAgLTEwMyw2ICsxMDMsMTAxIEBACiAgICAgICAgIH0KICAgICB9CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIEZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKSB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAuMCwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpICE9IDEuMGYpCisgICAgICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgZWxzZSBpZiAoc3JjICE9IGRzdCkKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwppbmRleCAzYzkwMDcxLi44YTg5ZGUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKQEAgLTI2LDExICsyNiwxMSBAQAogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCiB7CiAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwpAQCAtNjcsNiArNjcsNzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBuKTsKICAgICB9CiB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgMiBzdHJlYW0gTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYzEgICAgICAgICAgIEZpcnN0IG11bHRpY2hhbm5lbCBzb3VyY2UKKyAqICBzcmMyICAgICAgICAgICBTZWNvbmQgbXVsdGljaGFubmVsIHNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMi0+Q3VycmVudCA9PSBwSW5zdGFuY2UyLT5UYXJnZXQpICYmIChwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgSEFSRCBNSVhJTkcKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgIH0KK30KKyNlbmRpZgorCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICpzcmMxLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAppbmRleCBmOTA0OTE1Li43ZjE4NzQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaApAQCAtMTU3LDEwICsxNTcsMTggQEAKIC8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCkBAIC0xNjksMTAgKzE3NywxOCBAQAogI2VuZGlmCiAKICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCkBAIC0xODEsMTEgKzE5NywxOSBAQAogI2VuZGlmCiAKICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pOwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMxLApAQCAtMjAwLDEwICsyMjQsMTAgQEAKIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCmluZGV4IGM2NzQ1NWEuLjUwN2VlZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKQEAgLTM1LDcgKzM1LDcgQEAKIHsKICAgICBMVk1fRkxPQVQgICAgICAgVGFyZ2V0R2FpbjsKICAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgCisKICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAvLyBUYXJnZXRHYWluCiAgICAgcmV0dXJuIFRhcmdldEdhaW47CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAppbmRleCBkMGQwZTFmLi5mMTAwOTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKQEAgLTYyLDYgKzYyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApAQCAtNzMsNiArODAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKaW5kZXggNDhmNWQ1NC4uOWQzZWU4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCiB7CiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxM10gPSB7MC41MDAwMDBmLC8qODAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCkBAIC02MCw3ICs2MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLC8qODgyMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY3ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsLyoxNzY0MDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLwogI2Vsc2UKICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCmluZGV4IDlkYzdkMjEuLjBlMGFjZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKIHsKICNpZmRlZiBISUdIRVJfRlMKLSAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwvKjgwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLwpAQCAtNjEsNyArNjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0NTM1MmYsLyo4ODIwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY2ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI2NzZmLC8qMTc2NDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCiAjZWxzZQogICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbOV0gPSB7MC41MDAwMDBmLC8qODAwMCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCmluZGV4IDc4NDZjYTAuLjYzMDdlNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCkBAIC01Myw3ICs1Myw5IEBACiAjZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgICAgICAgMC4wMDAxMzA5MDBmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZWRExfMlBpQnlfODgyMDBfZiAgICAgICAwLjAwMDA3MTIzOGYKICNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTc2NDAwX2YgICAgICAwLjAwMDAzNTYxOWYKICNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKICNlbmRpZgogY29uc3QgTFZNX0ZMT0FUICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMF9mLApAQCAtNjYsNyArNjgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDQxMDBfZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzg4MjAwX2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzk2MDAwX2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5XzE3NjQwMF9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xOTIwMDBfZgogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCmluZGV4IDljMTdhMDUuLjZjOGIyZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYwpAQCAtMTE5LDYgKzExOSw4MCBAQAogICAgICAgICB9CiAKICAgICB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFTEFZUy0KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVscyAtIDFdIGlzIHgobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVsc10gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHNdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbNCpOckNoYW5uZWxzIC0gMV0gaXMgeShuLTIpIGZvciBhbGwgTnJDaGFubmVscworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW4sIHluTywgdGVtcDsKKyAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIGpqIENIQU5ORUwKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogeW49IChBMCAgKiAoeChuKSAtIHgobi0yKSkpKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICsgampdOworICAgICAgICAgICAgICAgIHluID0gdGVtcCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIyICAqIHkobi0yKSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIxICogeShuLTEpKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMiArIGpqXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluTz0gKChHYWluICogeW4pKSAqLworICAgICAgICAgICAgICAgIHluTyA9IHluICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgICAgIC8qIHluTz0oeW5PICsgeChuKSkqLworICAgICAgICAgICAgICAgIHluTyArPSAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSB5bjsgLyogVXBkYXRlIHkobi0xKSAqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KKyAgICAgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICpwRGF0YU91dCA9IHluTzsgLyogV3JpdGUgb3V0cHV0Ki8KKyAgICAgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisjZW5kaWYKICNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCmluZGV4IDhlMGI3MzguLjM4NWRiY2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApAQCAtMjAxLDggKzIwMSwxMCBAQAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgIDI1NgogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgIDUxMgotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU184ODIwMCAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTc2NDAwICAgICAgICAgICAgICAgMjA0OAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDQwOTYKICNlbmRpZgogCiB0eXBlZGVmIGVudW0KQEAgLTIxNyw4ICsyMTksMTAgQEAKICAgICBMVkVRTkJfRlNfNDQxMDAgPSA3LAogICAgIExWRVFOQl9GU180ODAwMCA9IDgsCiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZFUU5CX0ZTXzk2MDAwID0gOSwKLSAgICBMVkVRTkJfRlNfMTkyMDAwID0gMTAsCisgICAgTFZFUU5CX0ZTXzg4MjAwID0gOSwKKyAgICBMVkVRTkJfRlNfOTYwMDAgPSAxMCwKKyAgICBMVkVRTkJfRlNfMTc2NDAwID0gMTEsCisgICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEyLAogI2VuZGlmCiAgICAgTFZFUU5CX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfRnNfZW47CkBAIC0yNjcsNyArMjcxLDkgQEAKICAgICAvKiBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KICAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbjsgICAgICAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogfSBMVkVRTkJfUGFyYW1zX3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAppbmRleCA0MmVhNDZmLi43NTUxNDFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMTA5LDcgKzEwOSw5IEBACiAjZGVmaW5lIExWRVFOQl8yUGlPbl80ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEzMWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVkVRTkJfMlBpT25fODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNzFmCiAjZGVmaW5lIExWRVFOQl8yUGlPbl85NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA2NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDM2ZgogI2RlZmluZSBMVkVRTkJfMlBpT25fMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzNmCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCmluZGV4IDU2YjAyZTAuLmE5Y2Q1ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKQEAgLTQ2LDcgKzQ2LDEyIEBACiAjZGVmaW5lIExWRVFOQl9JTlNUQU5DRV9BTElHTiAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGluc3RhbmNlIHN0cnVjdHVyZXMgKi8KICNkZWZpbmUgTFZFUU5CX0RBVEFfQUxJR04gICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3Igc3RydWN0dXJlcyAqLwogI2RlZmluZSBMVkVRTkJfQ09FRl9BTElHTiAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIHdvcmRzICovCisjaWZkZWYgU1VQUE9SVF9NQworLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgKExWTV9NQVhfQ0hBTk5FTFMgKiAyKQorI2Vsc2UKICNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2VuZGlmCiAjZGVmaW5lIExWRVFOQl9TQ1JBVENIX0FMSUdOICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLwogCiAjZGVmaW5lIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMgICAgICAxMDAgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBUQyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCmluZGV4IDYzMjgxODEuLmQxODhjMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAjaW5jbHVkZSAiQklRVUFELmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02MSwxNCArNjIsMTggQEAKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICpwQmlxdWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgTnJGcmFtZXMpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KICAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbworICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSAxCisgICAgICAgID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisjZWxzZQorICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKKyNlbmRpZgorICAgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CiAKICAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KICAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKQEAgLTgyLDE0ICs4NywxNCBAQAogICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOwogICAgIH0KIAotICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OworICAgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CiAKICAgICAvKgotICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAqLwotICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIGlmIChOckZyYW1lcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKICAgICB7Ci0gICAgICAgIHJldHVybihMVkVRTkJfVE9PTUFOWVNBTVBMRVMpOworICAgICAgICByZXR1cm4gTFZFUU5CX1RPT01BTllTQU1QTEVTOwogICAgIH0KIAogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKQEAgLTk3LDE2ICsxMDIsMTYgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQ29weSBpbnB1dCBkYXRhIGluIHRvIHNjcmF0Y2ggYnVmZmVyCiAgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CiAKLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIHNlY3Rpb24gZXhlY3RlIHRoZSBmaWx0ZXIgdW5sZXNzIHRoZSBnYWluIGlzIDBkQgogICAgICAgICAgKi8KICAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQorICAgICAgICAgICAgZm9yIChMVk1fVUlOVDE2IGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OQmFuZHM7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIENoZWNrIGlmIGJhbmQgaXMgbm9uLXplcm8gZEIgZ2FpbgpAQCAtMTE2LDcgKzEyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgYmlxdWFkIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CisgICAgICAgICAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICpwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CiAKIAogICAgICAgICAgICAgICAgICAgICAvKgpAQCAtMTI2LDEwICsxMzEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OgogICAgICAgICAgICAgICAgICAgICAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNDEsMTkgKzE1NCwyOSBAQAogCiAKICAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOwotICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZHVwbGljYXRlIHdpdGggZWxzZSBjbGF1c2UocykKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAgICAgICAgICAgIC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgICAgICBlbHNlewogICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC0xNjMsMTIgKzE4NiwxMiBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7ICAgICAgICAgICAgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisgICAgcmV0dXJuIExWRVFOQl9TVUNDRVNTOwogCiB9CiAjZWxzZQpAQCAtMzEyLDQgKzMzNSw0IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCmluZGV4IDU2MzE4MWMuLjQ1M2M0MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCkBAIC00Niw3ICs0Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAogfTsKICNlbHNlCkBAIC04Miw3ICs4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl84ODIwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fOTYwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzE3NjQwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTkyMDAwCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTI0OSwzMCArMjUzLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2LCAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnRzICgxMDBtcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczgwMDAgICAgMzI1ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTEwMjUgICAzMjYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxMjAwMCAgIDMyNjQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTYxODUzMDMgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczE2MDAwICAgMzI2NzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMjIwNTAgICAzMjcwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMyNDAwMCAgIDMyNzA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTgwNzczOTMgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczMyMDAwICAgMzI3MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzNDQxMDAgICAzMjczNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnM0ODAwMCAgIDMyNzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KLQotCi1jb25zdCBMVk1fSU5UMTYgTFZFUU5CX01peGVyVENUYWJsZVtdID0gewotICAgIExWRVFOQl9NSVhfVENfRnM4MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMxMTAyNSwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMTIwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczE2MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMyMjA1MCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMjQwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczMyMDAwLAotICAgIExWRVFOQl9NSVhfVENfRnM0NDEwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzNDgwMDB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCmluZGV4IGZmNzQ3NWUuLmM5MTVhYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKQEAgLTEyMyw3ICsxMjMsNyBAQAogI2lmbmRlZiBISUdIRVJfRlMKICNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KICNlbHNlCi0jZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCisjZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCiAjZW5kaWYKIAogI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKaW5kZXggNTY2ZDg0Zi4uMWQxMjgzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwpAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAKKwogICAgIC8qCiAgICAgICogIFByb2Nlc3MgYWxsIGRlbGF5IGxpbmVzCiAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYwppbmRleCBhNzE5MDUzLi5kZmVkMjhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKQEAgLTY0LDEyICs2NCwyMiBAQAogICAgICAgICAoCiAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJgorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkKICNpZmRlZiBISUdIRVJfRlMKLSAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQorICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkKKyAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkKICNlbmRpZgogICAgICAgICApCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAgICAgICAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgICAgICAgICAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkpCisjZWxzZQogICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSApCisjZW5kaWYKICAgICB7CiAgICAgICAgIHJldHVybiAoTFZSRVZfT1VUT0ZSQU5HRSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwppbmRleCBiM2VkYzYwLi4xMDU4NzQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwpAQCAtNTIsNyArNTIsOSBAQAogICAgIDMyMDAwLAogICAgIDQ0MTAwLAogICAgIDQ4MDAwLAorICAgIDg4MjAwLAogICAgIDk2MDAwLAorICAgIDE3NjQwMCwKICAgICAxOTIwMDAKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCmluZGV4IGE3NTBiYjAuLmVlMDdlMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtNDYsNyArNDYsNyBAQAogI2lmbmRlZiBISUdIRVJfRlMKICNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgOSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDQ4MDAwSHoqLwogI2Vsc2UKLSNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgMTEgICAgICAvKiBGcm9tIDgwMDBIeiB0byAxOTIwMDBIeiovCisjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDEzICAgICAgLyogRnJvbSA4MDAwSHogdG8gMTkyMDAwSHoqLwogI2VuZGlmCiAjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCAgICAgICAgIDMgICAgICAvKiBMT1csIE1FRElVTSwgSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwppbmRleCAxMjg3NTAzLi5mOGFmNDk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCkBAIC01NCw3ICs1NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMH07ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAKQEAgLTc4LDcgKzgwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODY5NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOQogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyNDM0OAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMjM2OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMjE3NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMTE4NSAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMTA1LDcgKzEwOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxNzY0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxOTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzNTI4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzODQwICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTEyOCw3ICsxMzQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLwogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2MCAgICAgICAgICAgICAgICAgICAvKiA4ODIwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDY0ICAgICAgICAgICAgICAgICAgIC8qIDk2MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTIwICAgICAgICAgICAgICAgICAgLyogMTc2NDAwIFMvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTI4ICAgICAgICAgICAgICAgICAgLyoxOTIwMDAgUy9zICAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0xNTMsNyArMTYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMzkwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjE5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExOTUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDk4ICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTE2OSw3ICsxNzksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDU5MDg5ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTM0MDM3MmYKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDcyOTQ3NmYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDY3MDE4NmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDM2NDczOGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDMzNTA5M2YgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMzUyLDcgKzM2NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX01FRElVTSAgICAgICovCkBAIC0zNjgsNyArMzgyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCkBAIC0zODMsNyArMzk5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKaW5kZXggZTc1Njk1ZS4uZTUwN2E3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKQEAgLTIwNSw2ICsyMDUsOSBAQAogICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIFNhbXBsaW5nIHJhdGUgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbDsgICAgICAgICAgICAvKiBFZmZlY3QgbGV2ZWwgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsgICAgICAgICAgICAvKiBSZXZlcmIgbGV2ZWwgaW4gJSAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiB9IExWQ1NfUGFyYW1zX3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKaW5kZXggMGMyZmU1My4uYmEwNTU3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCkBAIC0xNTIsNiArMTUyLDI0IEBACiAjZGVmaW5lIENTX1NJREVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIENvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19NSURETEVfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzg0NmYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjIzMjY1N2YpCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTkyNzQ3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMxNTQxZgorI2RlZmluZSBDU19TSURFXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjg5NTg2ZikKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wNTgwNDVmCisjZGVmaW5lIENTX1NJREVfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS43NjUzMDBmKQorI2RlZmluZSBDU19TSURFXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjc2OTgxNmYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTQKKwogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY1Ki8KIC8qIGhpZ2ggcGFzcyBmaWx0ZXIgd2l0aCBjdXRvZmYgZnJlcXVlbmN5IDEwMi4xOCBIeiovCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM1NTMyCkBAIC0xNjAsMTMgKzE3OCwzMyBAQAogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTMzMzQpCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0vKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxNjcyNwotI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAxNjcyNykKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjc5MzM3MikKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNzk3MjM2Ci0jZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorLyogQ29lZmZpY2llbnRzIGNhbGN1bGF0ZWQgdXNpbmcgdGYyc3MgYW5kIHNzMnRmIGZ1bmN0aW9ucyBiYXNlZCBvbgorICogY29lZmZpY2llbnRzIGF2YWlsYWJsZSBmb3IgNDgwMDBIeiBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworI2RlZmluZSBDU19TSURFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMjQzMjZmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjk0OTM3ZikKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDcwNjExZgorI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjc5MjE2NmYpCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjc5NTgzMGYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE3NjQwMEh6IHNhbXBsZSByYXRlLgorICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAorICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKKyAqIGZvciA0NDEwMEh6LgorICovCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzk3M2YKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yMzMzNzhmKQorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTk2MzY3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5ODM2ZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjMwNzU0NGYpCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjEwNzcwOGYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS44NzY1NzJmKQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC44Nzc3NzFmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY4OSovCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI0MTIxOQpAQCAtMTc1LDEzICsyMTMsMTUgQEAKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjY2MSkKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLwotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA4OTkxCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwODk5MSkKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS44OTI1MDkpCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC44OTM1MjQKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgIDE0CisvKiBDb2VmZmljaWVudHMgY2FsY3VsYXRlZCB1c2luZyB0ZjJzcyBhbmQgc3MydGYgZnVuY3Rpb25zIGJhc2VkIG9uCisgKiBjb2VmZmljaWVudHMgYXZhaWxhYmxlIGZvciA0ODAwMEh6IHNhbXBsaW5nIGZyZXF1ZW5jeQorICovCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAwLjE5NjAzOWYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4zMTEwMjdmKQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC4xMTQ5ODhmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuODkxMzgwZikKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuODkyMzQ2MGYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgIDE0CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5OSw3ICsyMzksMTIgQEAKICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18yNEtIWiAgICAgICAgICAgICAgICAgICAyNzkgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAyNGtTL3MgKi8KICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiAgICAgICAgICAgICAgICAgICAzNzIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAzMmtTL3MgKi8KICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0NGtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiAgICAgICAgICAgICAgICAgICA1NTcgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiAgICAgICAgICAgICAgICAgICAxMDI0ICAgICAgICAvKiBTYW1wbGUgcmF0ZSA4OC4ya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haICAgICAgICAgICAgICAgICAgIDExMTUgICAgICAgIC8qIFNhbXBsZSByYXRlIDk2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE3NktIWiAgICAgICAgICAgICAgICAgIDIwNDggICAgICAgIC8qIFNhbXBsZSByYXRlIDE3Ni40a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiAgICAgICAgICAgICAgICAgIDIyMjkgICAgICAgIC8qIFNhbXBsZSByYXRlIDE5NmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMICAgICAgICAgICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWgogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC42NjcyNzEKQEAgLTI3NSw2ICszMjAsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogI2lmZGVmIEhJR0hFUl9GUworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE3MTkwMWYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4xNzE5MDFmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjU1Mzk0OGYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoMC41NzAyNDhmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKQEAgLTI4NCw2ICszMzcsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU5OTM3NwogI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wOTQ3NjNmCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wOTQ3NjNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS43NTg1OTNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgICgwLjc2MzA5MWYpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCiAjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3ODM2OQpAQCAtNDQ2LDYgKzUwNywyNCBAQAogCiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgIDEuNzcxODk5ZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yLjkzMDc2MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAxLjE3MjE3NWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICgtMS40MzgzNDlmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgMC40NDI1MjBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgMi42NzUyNDFmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAoLTQuNDY2MTU0ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgIDEuODEwMzA1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjkyNTM1MGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDY2NjE2ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgIDEzCisKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjc4NDQ5NwogI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0zLjAwMTQzNSkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjIyODQyMgpAQCAtNDU4LDYgKzUzNywyMyBAQAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjk3MTcxOCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4wMjEyMTYpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgMS44ODM0NDBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAoLTMuNDE0MjcyZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgIDEuNTM0NzAyZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgKC0xLjY3NDYxNGYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAwLjY3NTgyN2YKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAzLjM1NTA2OGYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICgtNi4xMTI1NzhmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgMi43NjQxMzVmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAoLTEuMjY4NTMzZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgIDAuMjcxMjc3ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgMTMKIAogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy40NTYxNDApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAppbmRleCBhOTdlNGYwLi5hYjhjY2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTYxLDYgKzYxLDE1IEBACiAKIC8qIE1lbW9yeSAqLwogI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAgICA2ICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBUaGUgQ29uY2VydCBTdXJyb3VuZCBtb2R1bGUgYXBwbGllcyBwcm9jZXNzaW5nIG9ubHkgb24gdGhlIGZpcnN0IHR3bworICogY2hhbm5lbHMgb2YgYSBtdWx0aWNoYW5uZWwgaW5wdXQuIFRoZSBkYXRhIG9mIGZpcnN0IHR3byBjaGFubmVscyBpcyBjb3BpZWQKKyAqIGZyb20gdGhlIG11bHRpY2hhbm5lbCBpbnB1dCBpbnRvIHNjcmF0Y2ggYnVmZmVyLiBUaGUgYnVmZmVycyBhZGRlZCBoZXJlCisgKiBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlCisgKi8KKyNkZWZpbmUgTFZDU19NQ19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgMgorI2VuZGlmCiAKIC8qIEdlbmVyYWwgKi8KICNkZWZpbmUgTFZDU19JTlZBTElEICAgICAgICAgICAgICAgIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCmluZGV4IDM5NTZkNGQuLmVmMWQ5ZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpAQCAtNzYsNiArNzYsMjIgQEAKICAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTdEluOworICAgIExWTV9JTlQzMiAgICAgICAgICAgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorCisgICAgLypJbiBjYXNlIG9mIG1vbm8gcHJvY2Vzc2luZywgc3RlcmVvIGlucHV0IGlzIGNyZWF0ZWQgZnJvbSBtb25vCisgICAgICphbmQgc3RvcmVkIGluIHBJbkRhdGEgYmVmb3JlIGFwcGx5aW5nIGFueSBvZiB0aGUgZWZmZWN0cy4KKyAgICAgKkhvd2V2ZXIgd2UgZG8gbm90IHVwZGF0ZSB0aGUgdmFsdWUgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscworICAgICAqYXQgdGhpcyBwb2ludC4KKyAgICAgKlNvIHRvIHRyZWF0IHRoZSBwSW5EYXRhIGFzIHN0ZXJlbyB3ZSBhcmUgc2V0dGluZyBjaGFubmVscyB0byAyCisgICAgICovCisgICAgaWYgKGNoYW5uZWxzID09IDEpCisgICAgeworICAgICAgICBjaGFubmVscyA9IDI7CisgICAgfQorI2VuZGlmCiAKICAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CkBAIC04Myw2ICs5OSwyNSBAQAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKgorICAgICAqIFRoZSBwSW5wdXQgYnVmZmVyIGhvbGRzIHRoZSBmaXJzdCAyIChMZWZ0LCBSaWdodCkgY2hhbm5lbHMgaW5mb3JtYXRpb24uCisgICAgICogSGVuY2UgdGhlIG1lbW9yeSByZXF1aXJlZCBieSB0aGlzIGJ1ZmZlciBpcyAyICogTnVtRnJhbWVzLgorICAgICAqIFRoZSBDb25jZXJ0IFN1cnJvdW5kIG1vZHVsZSBjYXJyaWVzIG91dCBwcm9jZXNzaW5nIG9ubHkgb24gTCwgUi4KKyAgICAgKi8KKyAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnJGcmFtZXMpOworICAgIHBTdEluICA9IHBTY3JhdGNoICsgKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBOckZyYW1lcyk7CisgICAgLyogVGhlIGZpcnN0IHR3byBjaGFubmVsIGRhdGEgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IGRhdGEgYW5kCisgICAgICogY29waWVkIGludG8gcElucHV0IGJ1ZmZlcgorICAgICAqLworICAgIENvcHlfRmxvYXRfTWNfU3RlcmVvKChMVk1fRkxPQVQgKilwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOworICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbnB1dCwKKyAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU3RJbiwKKyAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOckZyYW1lcykpOworI2Vsc2UKICAgICBpZiAocEluRGF0YSA9PSBwT3V0RGF0YSkKICAgICB7CiAgICAgICAgIC8qIFByb2Nlc3NpbmcgaW5wbGFjZSAqLwpAQCAtOTYsMTQgKzEzMSwyMSBAQAogICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCiAgICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7CiAgICAgfQotCisjZW5kaWYKICAgICAvKgogICAgICAqIENhbGwgdGhlIHN0ZXJlbyBlbmhhbmNlcgogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0SW4sICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzKTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgdG8gcHJvY2VzcyAqLworI2Vsc2UKICAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSByZXZlcmIgZ2VuZXJhdG9yCkBAIC0xMTIsNyArMTU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0gICAgCisKICAgICAvKgogICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgogICAgICAqLwpAQCAtMjM5LDcgKzI4MSwxNSBAQAogCiAgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KKyAgICBMVk1fSU5UMzIgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHMgPSAyOworICAgIH0KKyNlbmRpZgogICAgIC8qCiAgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAgKi8KQEAgLTI2MCw4ICszMTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAorCisKICAgICAgICAgLyoKICAgICAgICAgICogQ29tcHJlc3MgdG8gcmVkdWNlIGV4cGFuc2lvbiBlZmZlY3Qgb2YgQ29uY2VydCBTb3VuZCBhbmQgY29ycmVjdCB2b2x1bWUKICAgICAgICAgICogZGlmZmVyZW5jZXMgZm9yIGRpZmZlcmVuY2Ugc2V0dGluZ3MuIE5vdCBhcHBsaWVkIGluIHRlc3QgbW9kZXMKQEAgLTM3NiwxNyArNDI2LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ29weV9GbG9hdF9TdGVyZW9fTWMocEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCiAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKGNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgLyogQWxsIENoYW5uZWxzKi8KKyNlbHNlCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCmluZGV4IDY5ODkyYjYuLmY5NGQ0ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAvKiBGaWx0ZXIgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7CiAjZWxzZQotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICBTdGVyZW9TYW1wbGVzWzIgKiBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syICogTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMXTsKICAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7CiAgICAgLyogRmlsdGVyICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKaW5kZXggZTE1NGUyOS4uYTFmYjQ4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwpAQCAtNzQsMTAgKzc0LDE4IEBACiAgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9CiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgLAorICAgIHtDU19NSURETEVfODgyMDBfQTAsICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV84ODIwMF9BMSwKKyAgICAgQ1NfTUlERExFXzg4MjAwX0IxLAorICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfODgyMDBfU0NBTEV9LAogICAgIHtDU19NSURETEVfOTYwMDBfQTAsICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV85NjAwMF9BMSwKICAgICAgQ1NfTUlERExFXzk2MDAwX0IxLAogICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzE3NjQwMF9BMCwgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xNzY0MDBfQTEsCisgICAgIENTX01JRERMRV8xNzY0MDBfQjEsCisgICAgIChMVk1fVUlOVDE2KUNTX01JRERMRV8xNzY0MDBfU0NBTEV9LAogICAgIHtDU19NSURETEVfMTkyMDAwX0EwLCAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfTUlERExFXzE5MjAwMF9BMSwKICAgICAgQ1NfTUlERExFXzE5MjAwMF9CMSwKQEAgLTE0NCwxMiArMTUyLDI0IEBACiAgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICAsCisgICAge0NTX1NJREVfODgyMDBfQTAsICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV84ODIwMF9BMSwKKyAgICAgQ1NfU0lERV84ODIwMF9BMiwKKyAgICAgQ1NfU0lERV84ODIwMF9CMSwKKyAgICAgQ1NfU0lERV84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV84ODIwMF9TQ0FMRX0sCiAgICAgIHtDU19TSURFXzk2MDAwX0EwLCAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX1NJREVfOTYwMDBfQTEsCiAgICAgIENTX1NJREVfOTYwMDBfQTIsCiAgICAgIENTX1NJREVfOTYwMDBfQjEsCiAgICAgIENTX1NJREVfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8xNzY0MDBfQTAsICAgICAgICAgIC8qMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xNzY0MDBfQTEsCisgICAgIENTX1NJREVfMTc2NDAwX0EyLAorICAgICBDU19TSURFXzE3NjQwMF9CMSwKKyAgICAgQ1NfU0lERV8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTX1NJREVfMTkyMDAwX0EwLCAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19TSURFXzE5MjAwMF9BMSwKICAgICAgQ1NfU0lERV8xOTIwMDBfQTIsCkBAIC0yMjMsMTIgKzI0MywyNCBAQAogICAgICBDU19FUVVBTElTRVJfNDgwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfNDgwMDBfU0NBTEV9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtDU19FUVVBTElTRVJfODgyMDBfQTAsICAgICAvKiA4OGtTL3MgY29lZmZpZWllbnRzICovCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0EyLAorICAgICBDU19FUVVBTElTRVJfODgyMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfRVFVQUxJU0VSXzk2MDAwX0EwLCAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTEsCiAgICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMiwKICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxLAogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTc2NDAwX0EwLCAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRX0sCiAgICAge0NTX0VRVUFMSVNFUl8xOTIwMDBfQTAsICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0ExLAogICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0EyLApAQCAtMjk0LDEyICszMjYsMjQgQEAKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NFWF9FUVVBTElTRVJfODgyMDBfQTAsICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEV9LAogICAgIHtDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCwgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0ExLAogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiwKICAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEsCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTAsICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAogICAgICB7Q1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwLCAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSwKICAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EyLApAQCAtMzI2LDcgKzM3MCwxMiBAQAogICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFosCiAgICAgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiwKICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFp9OworICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haLAorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zOTIsMTIgKzQ0MSwyNCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NfUkVWRVJCXzg4MjAwX0EwLCAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0ExLAorICAgICBDU19SRVZFUkJfODgyMDBfQTIsCisgICAgIENTX1JFVkVSQl84ODIwMF9CMSwKKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfODgyMDBfU0NBTEV9LAogICAgIHtDU19SRVZFUkJfOTYwMDBfQTAsICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19SRVZFUkJfOTYwMDBfQTEsCiAgICAgIENTX1JFVkVSQl85NjAwMF9BMiwKICAgICAgQ1NfUkVWRVJCXzk2MDAwX0IxLAogICAgICBDU19SRVZFUkJfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMTc2NDAwX0EwLCAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQTEsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQTIsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQjEsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8xNzY0MDBfU0NBTEV9LAogICAgICB7Q1NfUkVWRVJCXzE5MjAwMF9BMCwgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19SRVZFUkJfMTkyMDAwX0ExLAogICAgICBDU19SRVZFUkJfMTkyMDAwX0EyLApAQCAtNTA5LDIyICs1NzAsMjYgQEAKICNkZWZpbmUgTFZDU19WT0xfVENfRnM0NDEwMCAgICAgMzI3MzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZDU19WT0xfVENfRnM4ODIwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk0ODEwNjYgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM5NjAwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk1MTE3MDMgKi8gICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxNzY0MDAgICAgMzI3NTkgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk3NDA0OTkgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnMxOTIwMDAgICAgMzI3NjMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk4Nzc5MjUgKi8gIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLWNvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbMTFdID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczEyMDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxNjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMjIwNTAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczI0MDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMzMjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ4MDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM5NjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTkyMDAwCitjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzEzXSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzODgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxNzY0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE5MjAwMAogfTsKICNlbHNlCiBjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzldID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKQEAgLTU0NSwxNyArNjEwLDE5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLWNvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzExXSA9IHs4MDAwLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAotCQkJCQkJCQkJCQkgIDEyMDAwLAotCQkJCQkJCQkJCQkgIDE2MDAwLAotCQkJCQkJCQkJCQkgIDIyMDUwLAotCQkJCQkJCQkJCQkgIDI0MDAwLAotCQkJCQkJCQkJCQkgIDMyMDAwLAotCQkJCQkJCQkJCQkgIDQ0MTAwLAotCQkJCQkJCQkJCQkgIDQ4MDAwLAotCQkJCQkJCQkJCQkgIDk2MDAwLAotCQkJCQkJCQkJCQkgIDE5MjAwMAorY29uc3QgTFZNX0lOVDMyICAgTFZDU19TYW1wbGVSYXRlVGFibGVbMTNdID0gezgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAogfTsKICNlbHNlCiBjb25zdCBMVk1fSU5UMTYgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzY2U5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OSBAQAorLy8gQnVpbGQgdGhlIHVuaXQgdGVzdHMgZm9yIGVmZmVjdHMKKworY2NfdGVzdCB7CisgICAgbmFtZTogImx2bXRlc3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtdXNpY2J1bmRsZSIsCisgICAgXSwKKworICAgIHNyY3M6IFsibHZtdGVzdC5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAorCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJzbnIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKworICAgIHNyY3M6IFsic25yLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTg3NGEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMCwwICsxLDg1IEBACisjIS9iaW4vYmFzaAorIworIyBSdW4gdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjIGxvY2F0aW9uIG9mIHRlc3QgZmlsZXMKK3Rlc3RkaXI9Ii9kYXRhL2xvY2FsL3RtcC9sdm1UZXN0IgorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyBsdm0iCithZGIgc2hlbGwgbWtkaXIgLXAgJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCithZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9sdm10ZXN0L2FybTY0L2x2bXRlc3QgJHRlc3RkaXIKK2FkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3Nuci9hcm02NC9zbnIgJHRlc3RkaXIKKworZmxhZ3NfYXJyPSgKKyAgICAiLWNzRSIKKyAgICAiLWVxRSIKKyAgICAiLXRFIgorICAgICItY3NFIC10RSAtZXFFIgorICAgICItYkUgLU0iCisgICAgIi1jc0UgLXRFIgorICAgICItY3NFIC1lcUUiICItdEUgLWVxRSIKKyAgICAiLWNzRSAtdEUgLWJFIC1NIC1lcUUiCispCisKK2ZzX2Fycj0oCisgICAgODAwMAorICAgIDExMDI1CisgICAgMTIwMDAKKyAgICAxNjAwMAorICAgIDIyMDUwCisgICAgMjQwMDAKKyAgICAzMjAwMAorICAgIDQ0MTAwCisgICAgNDgwMDAKKyAgICA4ODIwMAorICAgIDk2MDAwCisgICAgMTc2NDAwCisgICAgMTkyMDAwCispCisKKyMgcnVuIG11bHRpY2hhbm5lbCBlZmZlY3RzIGF0IGRpZmZlcmVudCBjb25maWdzLCBzYXZpbmcgb25seSB0aGUgc3RlcmVvIGNoYW5uZWwKKyMgcGFpci4KK2ZvciBmbGFncyBpbiAiJHtmbGFnc19hcnJbQF19IgorZG8KKyAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgZG8KKyAgICAgICAgZm9yIGNoIGluIHsxLi44fQorICAgICAgICBkbworICAgICAgICAgICAgYWRiIHNoZWxsICR0ZXN0ZGlyL2x2bXRlc3QgLWk6JHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAgICAgLW86JHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoKSlfJCgoZnMpKS5yYXcgLWNoOiRjaCAtZnM6JGZzICRmbGFncworCisgICAgICAgICAgICAjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgorICAgICAgICAgICAgIyBEbyBub3QgY29tcGFyZSBjYXNlcyB3aGVyZSAtYkUgaXMgaW4gZmxhZ3MgKGR1ZSB0byBtb25vIGNvbXB1dGF0aW9uKQorICAgICAgICAgICAgaWYgW1sgJGZsYWdzICE9ICoiLWJFIiogXV0gJiYgWyAiJGNoIiAtZ3QgMiBdCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMl8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaCkpXyQoKGZzKSkucmF3CisgICAgICAgICAgICBlbGlmIFtbICRmbGFncyA9PSAqIi1iRSIqIF1dICYmIFsgIiRjaCIgLWd0IDIgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIGFkYiBzaGVsbCAkdGVzdGRpci9zbnIgJHRlc3RkaXIvc2luZXN3ZWVwXzJfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfJCgoY2gpKV8kKChmcykpLnJhdyAtdGhyOjkwLjMwODk5OAorICAgICAgICAgICAgZmkKKworICAgICAgICBkb25lCisgICAgZG9uZQorZG9uZQorCithZGIgc2hlbGwgcm0gLXIgJHRlc3RkaXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvbHZtdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2YmRhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCkBAIC0wLDAgKzEsNzYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJFZmZlY3RCdW5kbGUuaCIKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorCisjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBcCisgIGRvIHsgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKGZhbHNlKQorI2VuZGlmCisKKyNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIgI2NvbmQpOyBcCisgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgXAorfQorCisjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKSAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX05VTExBRERSRVNTKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0FMSUdOTUVOVEVSUk9SKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiYmFkIGFsaWdubWVudCByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0lOVkFMSUROVU1TQU1QTEVTKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiYmFkIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX09VVE9GUkFOR0UpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitzdHJ1Y3QgbHZtQ29uZmlnUGFyYW1zX3QgeworICBpbnQgICAgICAgICAgICAgIHNhbXBsaW5nRnJlcSAgICA9IDQ0MTAwOworICBpbnQgICAgICAgICAgICAgIG5yQ2hhbm5lbHMgICAgICA9IDI7CisgIGludCAgICAgICAgICAgICAgZkNoYW5uZWxzICAgICAgID0gMjsKKyAgYm9vbCAgICAgICAgICAgICBtb25vTW9kZSAgICAgICAgPSBmYWxzZTsKKyAgaW50ICAgICAgICAgICAgICBiYXNzRWZmZWN0TGV2ZWwgPSAwOworICBpbnQgICAgICAgICAgICAgIGVxUHJlc2V0TGV2ZWwgICA9IDA7CisgIGludCAgICAgICAgICAgICAgZnJhbWVMZW5ndGggICAgID0gMjU2OworICBMVk1fQkVfTW9kZV9lbiAgIGJhc3NFbmFibGUgICAgICA9IExWTV9CRV9PRkY7CisgIExWTV9URV9Nb2RlX2VuICAgdHJlYmxlRW5hYmxlICAgID0gTFZNX1RFX09GRjsKKyAgTFZNX0VRTkJfTW9kZV9lbiBlcUVuYWJsZSAgICAgICAgPSBMVk1fRVFOQl9PRkY7CisgIExWTV9Nb2RlX2VuICAgICAgY3NFbmFibGUgICAgICAgID0gTFZNX01PREVfT0ZGOworfTsKKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICA8ZXhjZXV0YWJsZT4gLWk6PGlucHV0X2ZpbGU+IC1vOjxvdXRfZmlsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPGlucHV0ZmlsZT4gIGlzIHRoZSBpbnB1dCBmaWxlIG5hbWUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIExWTSBlZmZlY3RzIGFyZSBhcHBsaWVkIik7CisgIHByaW50ZigiXG4gICAgIDxvdXRwdXRmaWxlPiBwcm9jZXNzZWQgb3V0cHV0IGZpbGUiKTsKKyAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1oZWxwIChvcikgLWgiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgUHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtY2g6PHByb2Nlc3NfY2hhbm5lbHM+ICgxIHRocm91Z2ggOClcblxuIik7CisgIHByaW50ZigiXG4gICAgIC1mY2g6PGZpbGVfY2hhbm5lbHM+ICgxIHRocm91Z2ggOClcblxuIik7CisgIHByaW50ZigiXG4gICAgIC1NIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIE1vbm8gbW9kZSAoZm9yY2UgYWxsIGlucHV0IGF1ZGlvIGNoYW5uZWxzIHRvIGJlIGlkZW50aWNhbCkiKTsKKyAgcHJpbnRmKCJcbiAgICAgLWJhc3Nsdmw6PGVmZmVjdF9sZXZlbD4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgQSB2YWx1ZSB0aGF0IHJhbmdlcyBiZXR3ZWVuICVkIC0gJWQgZGVmYXVsdCAwIiwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCwKKyAgICBMVk1fQkVfTUFYX0VGRkVDVExFVkVMKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtZXFQcmVzZXQ6PHByZXNldCBWYWx1ZT4iKTsKKyAgY29uc3Qgc2l6ZV90IG51bVByZXNldEx2bHMgID0gc3RkOjpzaXplKGdFcXVhbGl6ZXJQcmVzZXRzKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QcmVzZXRMdmxzOyArK2kpIHsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAlenUgLSAlcyIsIGksIGdFcXVhbGl6ZXJQcmVzZXRzW2ldLm5hbWUpOworICB9CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgLSAwIik7CisgIHByaW50ZigiXG4gICAgIC1iRSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC10RSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIFRyZWJsZSBCb29zdCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jc0UgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBDb25jZXJ0IFN1cnJvdW5kIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWVxRSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEVxdWFsaXplciIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUVmZmVjdF9mcmVlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgQnVuZGxlLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIEx2bUVmZmVjdF9mcmVlKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgeworICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICBMVk1fTWVtVGFiX3QgTWVtVGFiOworCisgIC8qIEZyZWUgdGhlIGFsZ29yaXRobSBtZW1vcnkgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJk1lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUVmZmVjdF9mcmVlIikKKworICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKSB7CisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIFNUQVJUIGZyZWVpbmcgJSIgUFJJdTMyCisgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBFTkQgICBmcmVlaW5nICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICB9Cit9IC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUJ1bmRsZV9pbml0KCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogSW5pdGlhbGl6ZSBlbmdpbmUgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGNyZWF0ZXMgaW5zdGFuY2UKKy8vIHdpdGggYWxsIGVmZmVjdHMgZGlzYWJsZWQuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBMdm1CdW5kbGVfaW5pdChzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIExWTV9Db250cm9sUGFyYW1zX3QgKnBhcmFtcykgeworICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBzdGFydCIpOworCisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7CisgICAgQUxPR1YoCisgICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisKKyAgICBMdm1FZmZlY3RfZnJlZShwQ29udGV4dCk7CisKKyAgICBBTE9HVigKKyAgICAgICAgIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCisgICAgICAgICItPiBDYWxsZWQgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworICB9CisKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgTFZNX0luc3RQYXJhbXNfdCBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICBMVk1fSGVhZHJvb21QYXJhbXNfdCBIZWFkcm9vbVBhcmFtczsgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgIExWTV9IZWFkcm9vbUJhbmREZWZfdCBIZWFkcm9vbUJhbmREZWZbTFZNX0hFQURST09NX01BWF9OQkFORFNdOworICBMVk1fTWVtVGFiX3QgTWVtVGFiOyAvKiBNZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICBib29sIGJNYWxsb2NGYWlsdXJlID0gTFZNX0ZBTFNFOworCisgIC8qIFNldCB0aGUgY2FwYWJpbGl0aWVzICovCisgIEluc3RQYXJhbXMuQnVmZmVyTW9kZSA9IExWTV9VTk1BTkFHRURfQlVGRkVSUzsKKyAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgPSBNQVhfQ0FMTF9TSVpFOworICBJbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMgPSBNQVhfTlVNX0JBTkRTOworICBJbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9IExWTV9QU0FfT047CisKKyAgLyogQWxsb2NhdGUgbWVtb3J5LCBmb3JjaW5nIGFsaWdubWVudCAqLworICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX05VTEwsICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKCJcdENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0TWVtb3J5VGFibGVcbiIpOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSAqLworICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKSB7CisgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOworCisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7CisgICAgICAgIGJNYWxsb2NGYWlsdXJlID0gTFZNX1RSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGVkICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIElmIG9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBmYWlsZWQgdG8gYWxsb2NhdGUsIGZyZWUgdGhlIHJlZ2lvbnMKKyAgICogdGhhdCB3ZXJlCisgICAqIHN1Y2Nlc2Z1bGx5IGFsbG9jYXRlZCBhbmQgcmV0dXJuIHdpdGggYW4gZXJyb3IKKyAgICovCisgIGlmIChiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKKyAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCkgeworICAgICAgICBBTE9HRSgKKyAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IE5vdCBmcmVlaW5nXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgIgorICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCisgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAtRUlOVkFMOworICB9CisgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CisKKyAgLyogSW5pdGlhbGlzZSAqLworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgPSBMVk1fTlVMTDsKKworICAvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldEluc3RhbmNlSGFuZGxlIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKAorICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKKyAgICAgICJMVk1fR2V0SW5zdGFuY2VIYW5kbGVcbiIpOworCisgIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KKyAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgcGFyYW1zLT5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOworCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisKKyAgLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7CisgIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKKyAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPSBMVk1fRVFOQl9PTjsKKyAgcGFyYW1zLT5FUU5CX05CYW5kcyA9IEZJVkVCQU5EX05VTUJBTkRTOworICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgIEJhbmREZWZzW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07CisgICAgQmFuZERlZnNbaV0uUUZhY3RvciA9IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbaV07CisgICAgQmFuZERlZnNbaV0uR2FpbiA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKKyAgfQorCisgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+VkNfQmFsYW5jZSA9IDA7CisKKyAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CisKKyAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKKyAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IChMVk1fUFNBX0RlY2F5U3BlZWRfZW4pMDsKKworICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09OOworICBwYXJhbXMtPkJFX0VmZmVjdExldmVsID0gMDsKKyAgcGFyYW1zLT5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV85MEh6OworICBwYXJhbXMtPkJFX0hQRiA9IExWTV9CRV9IUEZfT047CisKKyAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKKyAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IExWTV9QU0FfU1BFRURfTUVESVVNOworCisgIC8qIFRFIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOworICBwYXJhbXMtPlRFX0VmZmVjdExldmVsID0gMDsKKworICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICBMdm1TdGF0dXMgPQorICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKAorICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKKyAgICAgICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgIC8qIFNldCB0aGUgaGVhZHJvb20gcGFyYW1ldGVycyAqLworICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ID0gMjA7CisgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9IaWdoID0gNDk5OTsKKyAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCA9IDA7CisgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9Mb3cgPSA1MDAwOworICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfSGlnaCA9IDI0MDAwOworICBIZWFkcm9vbUJhbmREZWZbMV0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKKyAgSGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbiA9ICZIZWFkcm9vbUJhbmREZWZbMF07CisgIEhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047CisgIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gMjsKKworICBMdm1TdGF0dXMgPSBMVk1fU2V0SGVhZHJvb21QYXJhbXMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkhlYWRyb29tUGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldEhlYWRyb29tUGFyYW1zIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKAorICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKKyAgICAgICJMVk1fU2V0SGVhZHJvb21QYXJhbXNcbiIpOworICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBFbmQiKTsKKyAgcmV0dXJuIDA7Cit9IC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLworCitpbnQgbHZtQ3JlYXRlKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICpwYXJhbXMpIHsKKyAgaW50IHJldCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gKEJ1bmRsZWRFZmZlY3RDb250ZXh0ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQnVuZGxlZEVmZmVjdENvbnRleHQpKTsKKyAgaWYgKE5VTEwgPT0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCkgeworICAgIHJldHVybiAtRUlOVkFMOworICB9CisKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTlVMTDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lID0gTFZNX1RSVUU7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IDA7CisKKyAgLyogU2F2ZWQgc3RyZW5ndGggaXMgdXNlZCB0byByZXR1cm4gdGhlIGV4YWN0IHN0cmVuZ3RoIHRoYXQgd2FzIHVzZWQgaW4gdGhlCisgICAqIHNldCB0byB0aGUgZ2V0CisgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbAorICAgKiBhdm9pZAorICAgKiBxdWFudGlzYXRpb24gbGlrZSBlZmZlY3Qgd2hlbiByZXR1cm5pbmcKKyAgICovCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSAtMTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmICFkZWZpbmVkKE5BVElWRV9GTE9BVF9CVUZGRVIpCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPSBOVUxMOworI2VuZGlmCisgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CisgIH0KKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIENhbGxpbmcgTHZtQnVuZGxlX2luaXQiKTsKKyAgcmV0ID0gTHZtQnVuZGxlX2luaXQocENvbnRleHQsIHBhcmFtcyk7CisKKyAgaWYgKHJldCA8IDApIHsKKyAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBsdm1DcmVhdGUoKSBCdW5kbGUgaW5pdCBmYWlsZWQiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiAwOworfQorCitpbnQgbHZtQ29udHJvbChzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAgICAqcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICpwYXJhbXMpIHsKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgcGFyYW1zLT5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOworCisgIGNvbnN0IGludCBuckNoYW5uZWxzID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgcGFyYW1zLT5OckNoYW5uZWxzID0gbnJDaGFubmVsczsKKyAgaWYgKG5yQ2hhbm5lbHMgPT0gMSkgeworICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01PTk87CisgIH0gZWxzZSBpZiAobnJDaGFubmVscyA9PSAyKSB7CisgICAgcGFyYW1zLT5Tb3VyY2VGb3JtYXQgPSBMVk1fU1RFUkVPOworICB9IGVsc2UgaWYgKG5yQ2hhbm5lbHMgPiAyICYmIG5yQ2hhbm5lbHMgPD0gOCkgeyAvLyBGQ0NfMiBGQ0NfOAorICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01VTFRJQ0hBTk5FTDsKKyAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAtRUlOVkFMOworICB9CisKKyAgTFZNX0ZzX2VuIHNhbXBsZVJhdGU7CisgIHN3aXRjaCAocGx2bUNvbmZpZ1BhcmFtcy0+c2FtcGxpbmdGcmVxKSB7CisgICAgY2FzZSA4MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTAyNToKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTEwMjU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xMjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTYwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE2MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18yNDAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzMyMDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODgyMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzg4MjAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5NjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE3NjQwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTIwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworCisgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmNzRW5hYmxlOworICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7CisgIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKKyAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcVByZXNldExldmVsOworICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgIEJhbmREZWZzW2ldLkdhaW4gPQorICAgICAgICBFUU5CXzVCYW5kU29mdFByZXNldHNbKEZJVkVCQU5EX05VTUJBTkRTICogZXFQcmVzZXRMZXZlbCkgKyBpXTsKKyAgfQorICBwYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmVxRW5hYmxlOworIC8vIENhdXRpb246IHJhdyBwb2ludGVyIHRvIHN0YWNrIGRhdGEsIHN0b3JlZCBpbiBpbnN0YW5jZSBieSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMuCisgIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisKKyAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKKyAgcGFyYW1zLT5WQ19CYWxhbmNlID0gMDsKKworICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT50cmVibGVFbmFibGU7CisKKyAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09OOworCisgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5iYXNzRW5hYmxlOworCisgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgIEx2bVN0YXR1cyA9CisgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCBwYXJhbXMpOworCisgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgTHZtU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKKworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICByZXR1cm4gMDsKK30KKworaW50IGx2bUV4ZWN1dGUoZmxvYXQgKmZsb2F0SW4sIGZsb2F0ICpmbG9hdE91dCwgc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgKnBsdm1Db25maWdQYXJhbXMpIHsKKyAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgIHJldHVybgorICAgICAgTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgIGZsb2F0SW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICBmbG9hdE91dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lTGVuZ3RoLCAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLworfQorCitpbnQgbHZtTWFpblByb2Nlc3MoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAqcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAqcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgIEZJTEUgKmZvdXQpIHsKKyAgaW50IGVyckNvZGUgPSBsdm1Db250cm9sKHBDb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zLCBwUGFyYW1zKTsKKyAgaWYgKGVyckNvZGUpIHsKKyAgICBBTE9HRSgiRXJyb3I6IGx2bUNvbnRyb2wgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgcmV0dXJuIGVyckNvZGU7CisgIH0KKworICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgIGNvbnN0IGludCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOyAgLy8gcHJvY2Vzc2luZyBzaXplCisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPmZDaGFubmVsczsKKyAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOyAvLyBmaWxlIGxvYWQgc2l6ZQorICBjb25zdCBpbnQgbWF4Q2hhbm5lbENvdW50ID0gc3RkOjptYXgoY2hhbm5lbENvdW50LCBpb0NoYW5uZWxDb3VudCk7CisgIC8qCisgICAqIE1vbm8gaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMiBjaGFubmVscyBpbnRlcm5hbGx5IGluIHRoZSBwcm9jZXNzIGNhbGwKKyAgICogYnkgY29weWluZyB0aGUgc2FtZSBkYXRhIGludG8gdGhlIHNlY29uZCBjaGFubmVsLgorICAgKiBIZW5jZSB3aGVuIGNoYW5uZWxDb3VudCBpcyAxLCBvdXRwdXQgYnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgZm9yCisgICAqIDIgY2hhbm5lbHMuIFRoZSBtZW1BbGxvY0NoQ291bnQgdGFrZXMgY2FyZSBvZiBhbGxvY2F0aW9uIG9mIHN1ZmZpY2llbnQKKyAgICogbWVtb3J5IGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICovCisgIGNvbnN0IGludCBtZW1BbGxvY0NoQ291bnQgPSAoY2hhbm5lbENvdW50ID09IDEgPyAyIDogY2hhbm5lbENvdW50KTsKKworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW4oZnJhbWVMZW5ndGggKiBtYXhDaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0KGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0SW4oZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRPdXQoZnJhbWVMZW5ndGggKiBtZW1BbGxvY0NoQ291bnQpOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICB3aGlsZSAoZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZpbnApID09IChzaXplX3QpZnJhbWVMZW5ndGgpIHsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGFkanVzdF9jaGFubmVscyhpbi5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBpbi5kYXRhKCksIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVvZihzaG9ydCksIGZyYW1lTGVuZ3RoICogaW9GcmFtZVNpemUpOworICAgIH0KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXRJbi5kYXRhKCksIGluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgLy8gTW9ubyBtb2RlIHdpbGwgcmVwbGljYXRlIHRoZSBmaXJzdCBjaGFubmVsIHRvIGFsbCBvdGhlciBjaGFubmVscy4KKyAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGF1ZGlvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCisgICAgLy8gQmFzcyBCb29zdCwgd2hpY2ggZXh0cmFjdHMgYSBtb25vIHNpZ25hbCBmb3IgcHJvY2Vzc2luZy4KKyAgICBpZiAocGx2bUNvbmZpZ1BhcmFtcy0+bW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGF1dG8gKmZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGNoYW5uZWxDb3VudCwgKmZwKTsgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgICAgfQorICAgIH0KKyNpZm5kZWYgQllQQVNTX0VYRUMKKyAgICBlcnJDb2RlID0gbHZtRXhlY3V0ZShmbG9hdEluLmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBwQ29udGV4dCwgcGx2bUNvbmZpZ1BhcmFtcyk7CisgICAgaWYgKGVyckNvZGUpIHsKKyAgICAgIHByaW50ZigiXG5FcnJvcjogbHZtRXhlY3V0ZSByZXR1cm5lZCB3aXRoICVkXG4iLCBlcnJDb2RlKTsKKyAgICAgIHJldHVybiBlcnJDb2RlOworICAgIH0KKworICAgICh2b2lkKWZyYW1lU2l6ZTsgLy8gZWxpbWluYXRlIHdhcm5pbmcKKyNlbHNlCisgICAgbWVtY3B5KGZsb2F0T3V0LmRhdGEoKSwgZmxvYXRJbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogZnJhbWVTaXplKTsKKyNlbmRpZgorICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChvdXQuZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGFkanVzdF9jaGFubmVscyhvdXQuZGF0YSgpLCBjaGFubmVsQ291bnQsIG91dC5kYXRhKCksIGlvQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgc2l6ZW9mKHNob3J0KSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICB9CisgICAgKHZvaWQpIGZ3cml0ZShvdXQuZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZvdXQpOworICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgfQorICBwcmludGYoImZyYW1lQ291bnRlcjogWyVkXVxuIiwgZnJhbWVDb3VudGVyKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBsdm1Db25maWdQYXJhbXNfdCBsdm1Db25maWdQYXJhbXN7fTsgLy8gZGVmYXVsdCBpbml0aWFsaXplCisgIGNvbnN0IGNoYXIgKmluZmlsZSA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKm91dGZpbGUgPSBudWxscHRyOworCisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKKyAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1pOiIsIDMpKSB7CisgICAgICBpbmZpbGUgPSBhcmd2W2ldICsgMzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItbzoiLCAzKSkgeworICAgICAgb3V0ZmlsZSA9IGFyZ3ZbaV0gKyAzOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgY29uc3QgaW50IHNhbXBsaW5nRnJlcSA9IGF0b2koYXJndltpXSArIDQpOworICAgICAgaWYgKHNhbXBsaW5nRnJlcSAhPSA4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxMTAyNSAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTYwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMjIwNTAgJiYgc2FtcGxpbmdGcmVxICE9IDI0MDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDMyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSA0NDEwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA0ODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gODgyMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gOTYwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE3NjQwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxOTIwMDApIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgU2FtcGxpbmcgRnJlcXVlbmN5IDogJWRcbiIsIHNhbXBsaW5nRnJlcSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5zYW1wbGluZ0ZyZXEgPSBzYW1wbGluZ0ZyZXE7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWNoOiIsIDQpKSB7CisgICAgICBjb25zdCBpbnQgbnJDaGFubmVscyA9IGF0b2koYXJndltpXSArIDQpOworICAgICAgaWYgKG5yQ2hhbm5lbHMgPiA4IHx8IG5yQ2hhbm5lbHMgPCAxKSB7CisgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyA6ICVkXG4iLCBuckNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLm5yQ2hhbm5lbHMgPSBuckNoYW5uZWxzOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkXG4iLCBmQ2hhbm5lbHMpOworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuZkNoYW5uZWxzID0gZkNoYW5uZWxzOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCItTSIpKSB7CisgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLm1vbm9Nb2RlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItYmFzc2x2bDoiLCA5KSkgeworICAgICAgY29uc3QgaW50IGJhc3NFZmZlY3RMZXZlbCA9IGF0b2koYXJndltpXSArIDkpOworICAgICAgaWYgKGJhc3NFZmZlY3RMZXZlbCA+IExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgfHwgYmFzc0VmZmVjdExldmVsIDwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCkgeworICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBCYXNzIEVmZmVjdCBMZXZlbCA6ICVkXG4iLAorICAgICAgICAgICAgICAgYmFzc0VmZmVjdExldmVsKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMuYmFzc0VmZmVjdExldmVsID0gYmFzc0VmZmVjdExldmVsOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1lcVByZXNldDoiLCAxMCkpIHsKKyAgICAgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gYXRvaShhcmd2W2ldICsgMTApOworICAgICAgY29uc3QgaW50IG51bVByZXNldEx2bHMgPSBzdGQ6OnNpemUoZ0VxdWFsaXplclByZXNldHMpOworICAgICAgaWYgKGVxUHJlc2V0TGV2ZWwgPj0gbnVtUHJlc2V0THZscyB8fCBlcVByZXNldExldmVsIDwgMCkgeworICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBFcXVhbGl6ZXIgUHJlc2V0IDogJWRcbiIsIGVxUHJlc2V0TGV2ZWwpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5lcVByZXNldExldmVsID0gZXFQcmVzZXRMZXZlbDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1iRSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMuYmFzc0VuYWJsZSA9IExWTV9CRV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1lcUUiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLmVxRW5hYmxlID0gTFZNX0VRTkJfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItdEUiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLnRyZWJsZUVuYWJsZSA9IExWTV9URV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1jc0UiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLmNzRW5hYmxlID0gTFZNX01PREVfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItaCIpKSB7CisgICAgICBwcmludFVzYWdlKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoaW5maWxlID09IG51bGxwdHIgfHwgb3V0ZmlsZSA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJFcnJvcjogbWlzc2luZyBpbnB1dC9vdXRwdXQgZmlsZXNcbiIpOworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKKyAgaWYgKGZpbnAgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgRklMRSAqZm91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOworICBpZiAoZm91dCA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG91dGZpbGUpOworICAgIGZjbG9zZShmaW5wKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBFZmZlY3RDb250ZXh0IGNvbnRleHQ7CisgIExWTV9Db250cm9sUGFyYW1zX3QgcGFyYW1zOworICBpbnQgZXJyQ29kZSA9IGx2bUNyZWF0ZSgmY29udGV4dCwgJmx2bUNvbmZpZ1BhcmFtcywgJnBhcmFtcyk7CisgIGlmIChlcnJDb2RlID09IDApIHsKKyAgICBlcnJDb2RlID0gbHZtTWFpblByb2Nlc3MoJmNvbnRleHQsICZwYXJhbXMsICZsdm1Db25maWdQYXJhbXMsIGZpbnAsIGZvdXQpOworICAgIGlmIChlcnJDb2RlICE9IDApIHsKKyAgICAgIHByaW50ZigiRXJyb3I6IGx2bU1haW5Qcm9jZXNzIHJldHVybmVkIHdpdGggdGhlIGVycm9yOiAlZCIsZXJyQ29kZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZigiRXJyb3I6IGx2bUNyZWF0ZSByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLCBlcnJDb2RlKTsKKyAgfQorICBmY2xvc2UoZmlucCk7CisgIGZjbG9zZShmb3V0KTsKKyAgLyogRnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KKyAgaWYgKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0ICE9IG51bGxwdHIpIHsKKyAgICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBudWxscHRyKSB7CisgICAgICBMdm1FZmZlY3RfZnJlZSgmY29udGV4dCk7CisgICAgfQorICAgIGZyZWUoY29udGV4dC5wQnVuZGxlZENvbnRleHQpOworICB9CisKKyAgaWYgKGVyckNvZGUpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9zbnIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODExMGMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBID0gZmxvYXQ+CitzdGQ6OnBhaXI8QSwgQT4gZ2V0U2lnbmFsTm9pc2UoRklMRSAqZmlucCwgRklMRSAqZnJlZikgeworICBjb25zdGV4cHIgc2l6ZV90IGZyYW1lc2l6ZSA9IDI1NjsKKyAgc3RkOjp2ZWN0b3I8VD4gaW4oZnJhbWVzaXplKTsKKyAgc3RkOjp2ZWN0b3I8VD4gcmVmKGZyYW1lc2l6ZSk7CisgIEEgc2lnbmFse307CisgIEEgbm9pc2V7fTsKKworICBmb3IgKDs7KSB7CisgICAgc2l6ZV90IHJlYWRfc2FtcGxlc19pbiA9IGZyZWFkKCZpblswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZpbnApOworICAgIGNvbnN0IHNpemVfdCByZWFkX3NhbXBsZXNfcmVmID0gZnJlYWQoJnJlZlswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZyZWYpOworICAgIGlmIChyZWFkX3NhbXBsZXNfaW4gIT0gcmVhZF9zYW1wbGVzX3JlZikgeworICAgICAgcHJpbnRmKCJmaWxlIHNpemVzIGRvIG5vdCBtYXRjaCAobGFzdCAlenUgJXp1KSIsIHJlYWRfc2FtcGxlc19pbiwgcmVhZF9zYW1wbGVzX3JlZik7CisgICAgICByZWFkX3NhbXBsZXNfaW4gPSBzdGQ6Om1pbihyZWFkX3NhbXBsZXNfaW4sIHJlYWRfc2FtcGxlc19yZWYpOworICAgIH0KKyAgICBpZiAocmVhZF9zYW1wbGVzX2luID09IDApIHsKKyAgICAgICAgcmV0dXJuIHsgc2lnbmFsLCBub2lzZSB9OworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRfc2FtcGxlc19pbjsgKytpKSB7CisgICAgICAgY29uc3QgQSB2YWx1ZShyZWZbaV0pOworICAgICAgIGNvbnN0IEEgZGlmZihBKGluW2ldKSAtIHZhbHVlKTsKKyAgICAgICBzaWduYWwgKz0gdmFsdWUgKiB2YWx1ZTsKKyAgICAgICBub2lzZSArPSBkaWZmICogZGlmZjsKKyAgICB9CisgIH0KK30KKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICBzbnIgPHJlZl9maWxlPiA8dGVzdF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8cmVmX2ZpbGU+ICBpcyB0aGUgcmVmZXJlbmNlIGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggd2lsbCBiZSB0YWtlbiBhcyBwdXJlIHNpZ25hbCIpOworICBwcmludGYoIlxuICAgICA8dGVzdF9maWxlPiBpcyB0ZXN0IGZpbGUgZm9yIHNuciBjYWxjdWxhdGlvbiIpOworICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLXBjbV9mb3JtYXQ6PHBjbSBmb3JtYXQgb2YgaW5wdXQgZmlsZXM+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDAgLSAxNiBiaXQgcGNtIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDEgLSAzMiBiaXQgZmxvYXQiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAwIik7CisgIHByaW50ZigiXG4gICAgIC10aHI6PHRocmVzaG9sZCB2YWx1ZT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAtIG5lZ2F0aXZlIGluZmluaXR5XG5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGlmIChhcmdjIDwgMykgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IHBjbV9mb3JtYXQgPSAwOworICBmbG9hdCB0aHIgPSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICBGSUxFICpmcmVmID0gZm9wZW4oYXJndlsxXSwgInJiIik7CisgIEZJTEUgKmZpbnAgPSBmb3Blbihhcmd2WzJdLCAicmIiKTsKKyAgZm9yIChpbnQgaSA9IDM7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1wY21fZm9ybWF0OiIsIDEyKSkgeworICAgICAgcGNtX2Zvcm1hdCA9IGF0b2koYXJndltpXSArIDEyKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdGhyOiIsIDUpKSB7CisgICAgICB0aHIgPSBhdG9mKGFyZ3ZbaV0gKyA1KTsKKyAgICB9CisgIH0KKyAgaWYgKGZpbnAgPT0gbnVsbHB0ciB8fCBmcmVmID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIlxuRXJyb3I6IG1pc3NpbmcgaW5wdXQvcmVmZXJlbmNlIGZpbGVzXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgYXV0byBzbiA9IHBjbV9mb3JtYXQgPT0gMAorICAgICAgPyBnZXRTaWduYWxOb2lzZTxzaG9ydD4oZmlucCwgZnJlZikKKyAgICAgIDogZ2V0U2lnbmFsTm9pc2U8ZmxvYXQ+KGZpbnAsIGZyZWYpOworICBpZiAoc24uZmlyc3QgPiAwLmYgJiYgc24uc2Vjb25kID4gMC5mKSB7CisgICAgZmxvYXQgc25yID0gMTAuZiAqIGxvZyhzbi5maXJzdCAvIHNuLnNlY29uZCk7CisgICAgLy8gY29tcGFyZSB0aGUgbWVhc3VyZWQgc25yIHZhbHVlIHdpdGggdGhyZXNob2xkCisgICAgaWYgKHNuciA8IHRocikgeworICAgICAgcHJpbnRmKCIlLjZmIGxlc3MgdGhhbiB0aHJlc2hvbGQgJS42ZlxuIiwgc25yLCB0aHIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIiUuNmZcbiIsIHNucik7CisgICAgfQorICB9CisgIGZjbG9zZShmaW5wKTsKKyAgZmNsb3NlKGZyZWYpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCmluZGV4IDEwZmQ5NzAuLjE2ZmExMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKQEAgLTE4LDYgKzE4LDcgQEAKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLURCVUlMRF9GTE9BVCIsCiAgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAogCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCmluZGV4IDUzZDI2NmEuLjBjNmY4ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtNDM1LDcgKzQzNSw3IEBACiAgICAgICAgICAgICAocFNlc3Npb25Db250ZXh0LT5iRXF1YWxpemVySW5zdGFudGlhdGVkID09TFZNX0ZBTFNFKSAmJgogICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YlZpcnR1YWxpemVySW5zdGFudGlhdGVkPT1MVk1fRkFMU0UpKQogICAgIHsKLSAgICAgICAgI2lmZGVmIExWTV9QQ00KKyNpZmRlZiBMVk1fUENNCiAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgPSBOVUxMOwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAgICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0ciA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgI2VuZGlmCisjZW5kaWYKIAogCiAgICAgICAgIC8vIENsZWFyIHRoZSBTZXNzaW9uSW5kZXgKQEAgLTc1MSwxOSArNzUxLDIxIEBACiAKICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICBlZmZlY3RfYnVmZmVyX3QgICAgICAgICAqcE91dFRtcDsKKyAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKICNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fAogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IG51bGxwdHIgfHwKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CiAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fApAQCAtNzg0LDcgKzc4Niw3IEBACiAgICAgICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOworICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscyk7CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgICAgICB9CkBAIC03OTgsMTMgKzgwMCwxNSBAQAogCiAjaWZkZWYgTFZNX1BDTQogICAgIGZ3cml0ZShwSW4sCi0gICAgICAgICAgICBmcmFtZUNvdW50KnNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscywKKyAgICAgICAgICAgMSwKKyAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CiAjZW5kaWYKIAogI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgLyogQ29udmVydGluZyBpbnB1dCBkYXRhIGZyb20gZml4ZWQgcG9pbnQgdG8gZmxvYXQgcG9pbnQgKi8KLSAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYocElucHV0QnVmZiwgcEluLCBmcmFtZUNvdW50ICogRkNDXzIpOworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihwSW5wdXRCdWZmLCBwSW4sIGZyYW1lQ291bnQgKiBOckNoYW5uZWxzKTsKIAogICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLwpAQCAtODE0LDcgKzgxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBUaW1lICovCiAKICAgICAvKiBDb252ZXJ0aW5nIG91dHB1dCBkYXRhIGZyb20gZmxvYXQgcG9pbnQgdG8gZml4ZWQgcG9pbnQgKi8KLSAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQocE91dFRtcCwgcE91dHB1dEJ1ZmYsIGZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHBPdXRUbXAsIHBPdXRwdXRCdWZmLCBmcmFtZUNvdW50ICogTnJDaGFubmVscyk7CiAKICNlbHNlCiAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcyAqLwpAQCAtODI5LDEyICs4MzMsMTQgQEAKIAogI2lmZGVmIExWTV9QQ00KICAgICBmd3JpdGUocE91dFRtcCwKLSAgICAgICAgICAgIGZyYW1lQ291bnQqc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscywKKyAgICAgICAgICAgMSwKKyAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICNlbmRpZgogCiAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogTnJDaGFubmVsczsgaSsrKSB7CiAjaWZuZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICAgICAgICAgIHBPdXRbaV0gPSBjbGFtcDE2KChMVk1fSU5UMzIpcE91dFtpXSArIChMVk1fSU5UMzIpcE91dFRtcFtpXSk7CiAjZWxzZQpAQCAtMTIzMiw0NSArMTIzOCw1OCBAQAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgQ0hFQ0tfQVJHKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscykgPD0gTFZNX01BWF9DSEFOTkVMUyk7CisjZWxzZQogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworI2VuZGlmCiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCiAgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgIHBDb250ZXh0LT5jb25maWcgPSAqcENvbmZpZzsKKyAgICBjb25zdCBMVk1fSU5UMTYgTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAKICAgICBzd2l0Y2ggKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgewogICAgIGNhc2UgODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxNjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyMjA1MDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAzMjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0NDEwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDg4MjAwICogTnJDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwICogTnJDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTc2NDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOTIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTkyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogI2VuZGlmCiAgICAgZGVmYXVsdDoKQEAgLTEyOTQsNiArMTMxMywxMCBAQAogCiAgICAgICAgIEFjdGl2ZVBhcmFtcy5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQWN0aXZlUGFyYW1zLk5yQ2hhbm5lbHMgPSBOckNoYW5uZWxzOworI2VuZGlmCisKICAgICAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJFZmZlY3Rfc2V0Q29uZmlnIikKQEAgLTE0OTgsNiArMTUyMSw3IEBACiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6CisgICAgLy8gY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6ICAvLyBGb3IgVVNCIHRlc3Rpbmcgb2YgdGhlIHZpcnR1YWxpemVyIG9ubHkuCiAgICAgICAgIHJldHVybiAwOwogICAgIGRlZmF1bHQgOgogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE1MjAsMTAgKzE1NDQsOSBAQAogaW50IFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgewogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgaWYgKChjaGFubmVsQ291bnQgPT0gMCkgfHwgKGNoYW5uZWxDb3VudCA+IDIpKSB7CisgICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzIpIHsgLy8gVE9ETzogdXBkYXRlIHRvIDggY2hhbm5lbHMgd2hlbiBzdXBwb3J0ZWQuCiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLQogICAgIHJldHVybiBWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKGRldmljZVR5cGUpOwogfQogCkBAIC0zMjE2LDYgKzMyMzksNyBAQAogICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7CiAgICAgaW50ICAgIHN0YXR1cyA9IDA7CiAgICAgaW50ICAgIHByb2Nlc3NTdGF0dXMgPSAwOworICAgIGNvbnN0IGludCBOckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogCiAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzIFN0YXJ0IDogRW5hYmxlZCA9ICVkICAgICBDYWxsZWQgPSAlZCAoJThkICU4ZCAlOGQpIiwKIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKQEAgLTMyNDYsNyArMzI3MCw3IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkpewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0JBU1NfQk9PU1QgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID4gMCl7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyOyAvLyBTVEVSRU8KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEJBU1NfQk9PU1QsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYik7CiAgICAgICAgIH0KQEAgLTMyNjYsNyArMzI5MCw3IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSl7CiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fRVFVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwogICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsgLy8gU1RFUkVPCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBFUVVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSk7CiAgICAgICAgIH0KQEAgLTMyODAsNyArMzMwNCw4IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpKXsKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9WSVJUVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyOy8vIFNURVJFTworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAtPQorICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIGZvciB0byB0dXJuIG9mZiBWSVJUVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKICAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQpOwogICAgICAgICB9CkBAIC0zMzMxLDcgKzMzNTYsNyBAQAogICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKIAogICAgICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIEZDQ18yOyArK2kpeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOyArK2kpIHsKICNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKICNlbHNlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCBkNTU4MTY5Li42MDJmNjA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTY3NSw5ICs2NzUsMTUgQEAKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKICAgICAgICAgYnJlYWs7CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICBicmVhazsKICAgICBjYXNlIDE5MjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCA3MDQwOWRlLi4zNWUyZjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDcgQEAKIAogTE9DQUxfQ0ZMQUdTKz0gLU8yIC1mdmlzaWJpbGl0eT1oaWRkZW4KIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLURCVUlMRF9GTE9BVCAtRFNVUFBPUlRfTUMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKQEAgLTE5LDcgKzIwLDggQEAKIExPQ0FMX01PRFVMRTo9IGxpYnZpc3VhbGl6ZXIKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIAogTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKaW5kZXggODA3ZjI0ZC4uMDBiYzM3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcApAQCAtMjQsMTEgKzI0LDIzIEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBtYXgKICNpbmNsdWRlIDxuZXc+CiAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF92aXN1YWxpemVyLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorCisjaWZkZWYgQlVJTERfRkxPQVQKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyNlbHNlCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAKIGV4dGVybiAiQyIgewogCkBAIC0xNDMsMTAgKzE1NSwxNSBAQAogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSByZXR1cm4gLUVJTlZBTDsKKyAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBpZiAoY2hhbm5lbENvdW50IDwgMSB8fCBjaGFubmVsQ291bnQgPiBGQ0NfOCkgcmV0dXJuIC1FSU5WQUw7CisjZWxzZQorICAgIGlmIChjaGFubmVsQ291bnQgIT0gRkNDXzIpIHJldHVybiAtRUlOVkFMOworI2VuZGlmCiAgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCiAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGtQcm9jZXNzRm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnID0gKnBDb25maWc7CiAKQEAgLTE5Miw3ICsyMDksNyBAQAogewogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0yMDAsNyArMjE3LDcgQEAKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0zMDEsMTUgKzMxOCw4IEBACiAvLy0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KIC8vCiAKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQotewotICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCi0gICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKLSAgICByZXR1cm4gc2FtcGxlOwotfQotCiBpbnQgVmlzdWFsaXplcl9wcm9jZXNzKAotICAgICAgICBlZmZlY3RfaGFuZGxlX3Qgc2VsZixhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCisgICAgICAgIGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCiB7CiAgICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CiAKQEAgLTMyNCw3MSArMzM0LDExOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlTGVuID0gaW5CdWZmZXItPmZyYW1lQ291bnQgKiBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsKKwogICAgIC8vIHBlcmZvcm0gbWVhc3VyZW1lbnRzIGlmIG5lZWRlZAogICAgIGlmIChwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSAmIE1FQVNVUkVNRU5UX01PREVfUEVBS19STVMpIHsKICAgICAgICAgLy8gZmluZCB0aGUgcGVhayBhbmQgUk1TIHNxdWFyZWQgZm9yIHRoZSBuZXcgYnVmZmVyCi0gICAgICAgIHVpbnQzMl90IGluSWR4OwotICAgICAgICBpbnQxNl90IG1heFNhbXBsZSA9IDA7CiAgICAgICAgIGZsb2F0IHJtc1NxQWNjID0gMDsKLSAgICAgICAgZm9yIChpbklkeCA9IDAgOyBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50ICogcENvbnRleHQtPm1DaGFubmVsQ291bnQgOyBpbklkeCsrKSB7Ci0gICAgICAgICAgICBpZiAoaW5CdWZmZXItPnMxNltpbklkeF0gPiBtYXhTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICBtYXhTYW1wbGUgPSBpbkJ1ZmZlci0+czE2W2luSWR4XTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoLWluQnVmZmVyLT5zMTZbaW5JZHhdID4gbWF4U2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbWF4U2FtcGxlID0gLWluQnVmZmVyLT5zMTZbaW5JZHhdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm1zU3FBY2MgKz0gKGluQnVmZmVyLT5zMTZbaW5JZHhdICogaW5CdWZmZXItPnMxNltpbklkeF0pOworCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgbWF4U2FtcGxlID0gMC5mOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyArK2luSWR4KSB7CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBmbWF4KG1heFNhbXBsZSwgZmFicyhpbkJ1ZmZlci0+ZjMyW2luSWR4XSkpOworICAgICAgICAgICAgcm1zU3FBY2MgKz0gaW5CdWZmZXItPmYzMltpbklkeF0gKiBpbkJ1ZmZlci0+ZjMyW2luSWR4XTsKICAgICAgICAgfQorICAgICAgICBtYXhTYW1wbGUgKj0gMSA8PCAxNTsgLy8gc2NhbGUgdG8gaW50MTZfdCwgd2l0aCBleGFjdGx5IDEgPDwgMTUgcmVwcmVzZW50aW5nIHBvc2l0aXZlIG51bS4KKyAgICAgICAgcm1zU3FBY2MgKj0gMSA8PCAzMDsgLy8gc2NhbGUgdG8gaW50MTZfdCAqIDIKKyNlbHNlCisgICAgICAgIGludCBtYXhTYW1wbGUgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyArK2luSWR4KSB7CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBzdGQ6Om1heChtYXhTYW1wbGUsIHN0ZDo6YWJzKGludDMyX3QoaW5CdWZmZXItPnMxNltpbklkeF0pKSk7CisgICAgICAgICAgICBybXNTcUFjYyArPSBpbkJ1ZmZlci0+czE2W2luSWR4XSAqIGluQnVmZmVyLT5zMTZbaW5JZHhdOworICAgICAgICB9CisjZW5kaWYKICAgICAgICAgLy8gc3RvcmUgdGhlIG1lYXN1cmVtZW50CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tUGVha1UxNiA9ICh1aW50MTZfdCltYXhTYW1wbGU7CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tUm1zU3F1YXJlZCA9Ci0gICAgICAgICAgICAgICAgcm1zU3FBY2MgLyAoaW5CdWZmZXItPmZyYW1lQ291bnQgKiBwQ29udGV4dC0+bUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgcm1zU3FBY2MgLyBzYW1wbGVMZW47CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tSXNWYWxpZCA9IHRydWU7CiAgICAgICAgIGlmICgrK3BDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHggPj0gcENvbnRleHQtPm1NZWFzdXJlbWVudFdpbmRvd1NpemVJbkJ1ZmZlcnMpIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHggPSAwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gYWxsIGNvZGUgYmVsb3cgYXNzdW1lcyBzdGVyZW8gMTYgYml0IFBDTSBvdXRwdXQgYW5kIGlucHV0CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBmbG9hdCBmc2NhbGU7IC8vIG11bHRpcGxpY2F0aXZlIHNjYWxlCisjZWxzZQogICAgIGludDMyX3Qgc2hpZnQ7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKIAogICAgIGlmIChwQ29udGV4dC0+bVNjYWxpbmdNb2RlID09IFZJU1VBTElaRVJfU0NBTElOR19NT0RFX05PUk1BTElaRUQpIHsKICAgICAgICAgLy8gZGVyaXZlIGNhcHR1cmUgc2NhbGluZyBmYWN0b3IgZnJvbSBwZWFrIHZhbHVlIGluIGN1cnJlbnQgYnVmZmVyCiAgICAgICAgIC8vIHRoaXMgZ2l2ZXMgbW9yZSBpbnRlcmVzdGluZyBjYXB0dXJlcyBmb3IgZGlzcGxheS4KLSAgICAgICAgc2hpZnQgPSAzMjsKLSAgICAgICAgaW50IGxlbiA9IGluQnVmZmVyLT5mcmFtZUNvdW50ICogMjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgbWF4U2FtcGxlID0gMC5mOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyApIHsKKyAgICAgICAgICAgIC8vIHdlIHJlY29uc3RydWN0IHRoZSBhY3R1YWwgc3VtbWVkIHZhbHVlIHRvIGVuc3VyZSBwcm9wZXIgbm9ybWFsaXphdGlvbgorICAgICAgICAgICAgLy8gZm9yIG11bHRpY2hhbm5lbCBvdXRwdXRzIChjaGFubmVscyA+IDIgbWF5IG9mdGVuIGJlIDApLgorICAgICAgICAgICAgZmxvYXQgc21wID0gMC5mOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgc21wICs9IGluQnVmZmVyLT5mMzJbaW5JZHgrK107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBmbWF4KG1heFNhbXBsZSwgZmFicyhzbXApKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4U2FtcGxlID4gMC5mKSB7CisgICAgICAgICAgICBmc2NhbGUgPSAxMjcuZiAvIG1heFNhbXBsZTsKKyAgICAgICAgICAgIGludCBleHA7IC8vIHVudXNlZAorICAgICAgICAgICAgY29uc3QgZmxvYXQgc2lnbmlmaWNhbmQgPSBmcmV4cChmc2NhbGUsICZleHApOworICAgICAgICAgICAgaWYgKHNpZ25pZmljYW5kID09IDAuNWYpIHsKKyAgICAgICAgICAgICAgICBmc2NhbGUgKj0gMjU1LmYgLyAyNTYuZjsgLy8gYXZvaWQgcmV0dXJuaW5nIHVuYWx0ZXJlZCBQQ00gc2lnbmFsCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzY2FsZSBkb2Vzbid0IG1hdHRlciwgdGhlIHZhbHVlcyBhcmUgYWxsIDAuCisgICAgICAgICAgICBmc2NhbGUgPSAxLmY7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGludDMyX3Qgb3JBY2N1bSA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlTGVuOyArK2kpIHsKICAgICAgICAgICAgIGludDMyX3Qgc21wID0gaW5CdWZmZXItPnMxNltpXTsKICAgICAgICAgICAgIGlmIChzbXAgPCAwKSBzbXAgPSAtc21wIC0gMTsgLy8gdGFrZSBjYXJlIHRvIGtlZXAgdGhlIG1heCBuZWdhdGl2ZSBpbiByYW5nZQotICAgICAgICAgICAgaW50MzJfdCBjbHogPSBfX2J1aWx0aW5fY2x6KHNtcCk7Ci0gICAgICAgICAgICBpZiAoc2hpZnQgPiBjbHopIHNoaWZ0ID0gY2x6OworICAgICAgICAgICAgb3JBY2N1bSB8PSBzbXA7CiAgICAgICAgIH0KKwogICAgICAgICAvLyBBIG1heGltdW0gYW1wbGl0dWRlIHNpZ25hbCB3aWxsIGhhdmUgMTcgbGVhZGluZyB6ZXJvcywgd2hpY2ggd2Ugd2FudCB0bwogICAgICAgICAvLyB0cmFuc2xhdGUgdG8gYSBzaGlmdCBvZiA4IChmb3IgY29udmVydGluZyAxNiBiaXQgdG8gOCBiaXQpCi0gICAgICAgIHNoaWZ0ID0gMjUgLSBzaGlmdDsKKyAgICAgICAgc2hpZnQgPSAyNSAtIF9fYnVpbHRpbl9jbHoob3JBY2N1bSk7CisKICAgICAgICAgLy8gTmV2ZXIgc2NhbGUgYnkgbGVzcyB0aGFuIDggdG8gYXZvaWQgcmV0dXJuaW5nIHVuYWx0ZXJlZCBQQ00gc2lnbmFsLgogICAgICAgICBpZiAoc2hpZnQgPCAzKSB7CiAgICAgICAgICAgICBzaGlmdCA9IDM7CiAgICAgICAgIH0KICAgICAgICAgLy8gYWRkIG9uZSB0byBjb21iaW5lIHRoZSBkaXZpc2lvbiBieSAyIG5lZWRlZCBhZnRlciBzdW1taW5nIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzIGJlbG93CiAgICAgICAgIHNoaWZ0Kys7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9IGVsc2UgewogICAgICAgICBhc3NlcnQocENvbnRleHQtPm1TY2FsaW5nTW9kZSA9PSBWSVNVQUxJWkVSX1NDQUxJTkdfTU9ERV9BU19QTEFZRUQpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIC8vIE5vdGU6IGlmIGNoYW5uZWxzIGFyZSB1bmNvcnJlbGF0ZWQsIDEvc3FydChOKSBjb3VsZCBiZSB1c2VkIGF0IHRoZSByaXNrIG9mIGNsaXBwaW5nLgorICAgICAgICBmc2NhbGUgPSAxLmYgLyBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsgIC8vIGFjY291bnQgZm9yIHN1bW1pbmcgYWxsIHRoZSBjaGFubmVscyB0b2dldGhlci4KKyNlbHNlCiAgICAgICAgIHNoaWZ0ID0gOTsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIHVpbnQzMl90IGNhcHRJZHg7CiAgICAgdWludDMyX3QgaW5JZHg7CiAgICAgdWludDhfdCAqYnVmID0gcENvbnRleHQtPm1DYXB0dXJlQnVmOwogICAgIGZvciAoaW5JZHggPSAwLCBjYXB0SWR4ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4OwotICAgICAgICAgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgIGluSWR4KyssIGNhcHRJZHgrKykgewotICAgICAgICBpZiAoY2FwdElkeCA+PSBDQVBUVVJFX0JVRl9TSVpFKSB7Ci0gICAgICAgICAgICAvLyB3cmFwIGFyb3VuZAotICAgICAgICAgICAgY2FwdElkeCA9IDA7CisgICAgICAgICBpbklkeCA8IHNhbXBsZUxlbjsKKyAgICAgICAgIGNhcHRJZHgrKykgeworICAgICAgICBpZiAoY2FwdElkeCA+PSBDQVBUVVJFX0JVRl9TSVpFKSBjYXB0SWR4ID0gMDsgLy8gd3JhcAorCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgc21wID0gMC5mOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENvbnRleHQtPm1DaGFubmVsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgc21wICs9IGluQnVmZmVyLT5mMzJbaW5JZHgrK107CiAgICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBzbXAgPSBpbkJ1ZmZlci0+czE2WzIgKiBpbklkeF0gKyBpbkJ1ZmZlci0+czE2WzIgKiBpbklkeCArIDFdOwotICAgICAgICBzbXAgPSBzbXAgPj4gc2hpZnQ7CisgICAgICAgIGJ1ZltjYXB0SWR4XSA9IGNsYW1wOF9mcm9tX2Zsb2F0KHNtcCAqIGZzY2FsZSk7CisjZWxzZQorICAgICAgICBjb25zdCBpbnQzMl90IHNtcCA9IChpbkJ1ZmZlci0+czE2W2luSWR4XSArIGluQnVmZmVyLT5zMTZbaW5JZHggKyAxXSkgPj4gc2hpZnQ7CisgICAgICAgIGluSWR4ICs9IEZDQ18yOyAgLy8gaW50ZWdlciBzdXBwb3J0cyBzdGVyZW8gb25seS4KICAgICAgICAgYnVmW2NhcHRJZHhdID0gKCh1aW50OF90KXNtcCleMHg4MDsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIC8vIFhYWCB0aGUgZm9sbG93aW5nIHR3byBzaG91bGQgcmVhbGx5IGJlIGF0b21pYywgdGhvdWdoIGl0IHByb2JhYmx5IGRvZXNuJ3QKQEAgLTQwMCw2ICs0NTcsMTUgQEAKICAgICB9CiAKICAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgc2FtcGxlTGVuICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyNlbHNlCiAgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYob3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKQEAgLTQwNyw2ICs0NzMsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IFZJU1VBTElaRVJfU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiAtRU5PREFUQTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcCBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcAppbmRleCAwMWYwMTRmLi5hOTc3MzAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKKysrIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCkBAIC04Niw3ICs4Niw3IEBACiAgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SGVpZlN0cmVhbT4gbVN0cmVhbTsKICAgICBib29sIG1FT1M7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG1DYWNoZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtQ2FjaGU7CiAgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OwogICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKICAgICBzaXplX3QgbUNhY2hlQnVmZmVyU2l6ZTsKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICAgICAvLyBpdCdzIHJlYWNoaW5nIG1heCBjYWNoZSBidWZmZXIgc2l6ZSwgbmVlZCB0byByb2xsIHdpbmRvdywgYW5kIHBvc3NpYmx5CiAgICAgICAgIC8vIGV4cGFuZCB0aGUgY2FjaGUgYnVmZmVyLgogICAgICAgICBzaXplX3QgbmV3Q2FjaGVCdWZmZXJTaXplID0gbUNhY2hlQnVmZmVyU2l6ZTsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG5ld0NhY2hlOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBuZXdDYWNoZTsKICAgICAgICAgdWludDhfdCogZHN0ID0gbUNhY2hlLmdldCgpOwogICAgICAgICBpZiAobmV3Q2FjaGVCdWZmZXJTaXplIDwga01heENhY2hlQnVmZmVyU2l6ZSkgewogICAgICAgICAgICAgbmV3Q2FjaGVCdWZmZXJTaXplID0ga01heENhY2hlQnVmZmVyU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKaW5kZXggNTE4M2MzOS4uYWExMGYzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKKysrIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAogICAgIHVpbnQzMl90IG1CeXRlc1BlclBpeGVsOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGZvciBvbmUgcGl4ZWwKICAgICB1aW50MzJfdCBtSWNjU2l6ZTsgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBtSWNjRGF0YQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAppbmRleCA3YzBkYWI0Li5hNTI5NjI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKQEAgLTI5LDcgKzI5LDcgQEAKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKLSAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCIsICJUaW1lQ2hlY2suY3BwIl0sCisgICAgc3JjczogWyJBdWRpb1BhcmFtZXRlci5jcHAiLCAiVHlwZUNvbnZlcnRlci5jcHAiXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCkBAIC00MSw2ICs0MSw5IEBACiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKICAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCiAgICAgY2xhbmc6IHRydWUsCiB9CiAKQEAgLTkwLDYgKzkzLDcgQEAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgXSwKQEAgLTEzMCw2ICsxMzQsMTAgQEAKICAgICAgICAgImxpYnNvbml2b3giLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCkBAIC0xNDUsMjAgKzE1MywxMiBAQAogICAgIH0sCiB9CiAKLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsIiwKLSAgICBdLAotfQotCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWEiLAogCiAgICAgZGVmYXVsdHM6IFsgImxpYm1lZGlhX2RlZmF1bHRzIiBdLAogCiAgICAgc3JjczogWwotICAgICAgICAiOm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKICAgICAgICAgIklEYXRhU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJpbmdTZXR0aW5ncy5jcHAiLAogICAgICAgICAibWVkaWFwbGF5ZXIuY3BwIiwKQEAgLTE5Myw2ICsxOTMsOCBAQAogICAgICAgICAiTWVkaWFSZXNvdXJjZVBvbGljeS5jcHAiLAogICAgICAgICAiVmlzdWFsaXplci5jcHAiLAogICAgICAgICAiU3RyaW5nQXJyYXkuY3BwIiwKKyAgICAgICAgIk5ka01lZGlhRm9ybWF0UHJpdi5jcHAiLAorICAgICAgICAiTmRrTWVkaWFFcnJvclByaXYuY3BwIiwKICAgICBdLAogCiAgICAgYWlkbDogewpAQCAtMjAyLDEwICsyMDQsMTIgQEAKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0yMjAsNyArMjI0LDYgQEAKICAgICAgICAgImxpYmV4cGF0IiwKICAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCkBAIC0yNjIsMjAgKzI2NSwxNiBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAogCiAgICAgZGVmYXVsdHM6IFsgImxpYm1lZGlhX2RlZmF1bHRzIiBdLAogCiAgICAgc3JjczogWworICAgICAgICAiQXVkaW9QYXJhbWV0ZXIuY3BwIiwKICAgICAgICAgIkJ1ZmZlcmluZ1NldHRpbmdzLmNwcCIsCiAgICAgICAgICJEYXRhU291cmNlRGVzYy5jcHAiLAotICAgICAgICAiSURhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIklNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAiLAotICAgICAgICAiSU1lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjQnVmZmVyLmNwcCIsCi0gICAgICAgICJNZWRpYVV0aWxzLmNwcCIsCiAgICAgICAgICJNZXRhZGF0YS5jcHAiLAogICAgICAgICAiTmRrV3JhcHBlci5jcHAiLAogICAgIF0sCkBAIC0yODQsMTAgKzI4Myw5IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAotICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0zMDIsNiArMzAwLDEwIEBACiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCmluZGV4IDAzNGY3YzIuLjFjOTVlMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKQEAgLTM2LDYgKzM2LDggQEAKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5SHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfSFdfQVZfU1lOQzsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BSRVNFTlRBVElPTl9JRDsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9QUk9HUkFNX0lEOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlBdWRpb0xhbmd1YWdlUHJlZmVycmVkID0KKyAgICAgICAgQVVESU9fUEFSQU1FVEVSX0tFWV9BVURJT19MQU5HVUFHRV9QUkVGRVJSRUQ7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleU1vbm9PdXRwdXQgPSBBVURJT19QQVJBTUVURVJfTU9OT19PVVRQVVQ7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUh3QXZTeW5jID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9IV19BVl9TWU5DOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Db25uZWN0ID0gQVVESU9fUEFSQU1FVEVSX0RFVklDRV9DT05ORUNUOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwIGIvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwCmluZGV4IDI3MWEyMzguLjFjYzMwYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAKQEAgLTI3LDI2ICsyNyw2IEBACiAgICAgICAgIDogbUluaXRpYWxNYXJrTXMoa05vTWFyayksCiAgICAgICAgICAgbVJlc3VtZVBsYXliYWNrTWFya01zKGtOb01hcmspIHsgfQogCi1zdGF0dXNfdCBCdWZmZXJpbmdTZXR0aW5nczo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUluaXRpYWxNYXJrTXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIG1SZXN1bWVQbGF5YmFja01hcmtNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlcmluZ1NldHRpbmdzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSW5pdGlhbE1hcmtNcyk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1SZXN1bWVQbGF5YmFja01hcmtNcyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIFN0cmluZzggQnVmZmVyaW5nU2V0dGluZ3M6OnRvU3RyaW5nKCkgY29uc3QgewogICAgIFN0cmluZzggczsKICAgICBzLmFwcGVuZEZvcm1hdCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGU5YTYyMzAuLmZiNmQzYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CkBAIC0yMTksMTAgKzIyMCwxNiBAQAogICAgIFZlY3Rvcjx3cDxJTWVkaWFTb3VyY2U+PiB0cmFja3M7CiAgICAgVmVjdG9yPFN0cmluZzg+IHRyYWNrRGVzY3JpcHRpb25zOwogICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKyAgICB0aW1lX3Qgd2hlbjsKIH0gRXh0cmFjdG9ySW5zdGFuY2U7CiAKIFN0cmluZzggRXh0cmFjdG9ySW5zdGFuY2U6OnRvU3RyaW5nKCkgY29uc3QgewotICAgIFN0cmluZzggc3RyID0gbmFtZTsKKyAgICBTdHJpbmc4IHN0cjsKKyAgICBjaGFyIHRpbWVTdHJpbmdbMzJdOworICAgIHN0cmZ0aW1lKHRpbWVTdHJpbmcsIHNpemVvZih0aW1lU3RyaW5nKSwgIiVtLSVkICVUIiwgbG9jYWx0aW1lKCZ3aGVuKSk7CisgICAgc3RyLmFwcGVuZCh0aW1lU3RyaW5nKTsKKyAgICBzdHIuYXBwZW5kKCI6ICIpOworICAgIHN0ci5hcHBlbmQobmFtZSk7CiAgICAgc3RyLmFwcGVuZCgiIGZvciBtaW1lICIpOwogICAgIHN0ci5hcHBlbmQobWltZSk7CiAgICAgc3RyLmFwcGVuZCgiLCBzb3VyY2UgIik7CkBAIC0yODcsNiArMjk0LDcgQEAKICAgICBleC5zb3VyY2VEZXNjcmlwdGlvbiA9IHNvdXJjZS0+dG9TdHJpbmcoKTsKICAgICBleC5vd25lciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBleC5leHRyYWN0b3IgPSBleHRyYWN0b3I7CisgICAgZXgud2hlbiA9IHRpbWUoTlVMTCk7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNFeHRyYWN0b3JzTG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCmluZGV4IGQ3NTMzY2EuLjI0M2IwOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0yMywxMyArMjMsMTMgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CiAgICAgTUFLRV9FWFRSQUNUT1IgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIE1BS0VfSURBVEFfU09VUkNFX0ZELAorICAgIEdFVF9TVVBQT1JURURfVFlQRVMsCiB9OwogCiBjbGFzcyBCcE1lZGlhRXh0cmFjdG9yU2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPgpAQCAtNjksNiArNjksMjQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gc3VwcG9ydGVkVHlwZXM7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUV4dHJhY3RvclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1VQUE9SVEVEX1RZUEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBwcm9jZXNzIHJlcGx5CisgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXh0ID0gcmVwbHkucmVhZENTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWV4dCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkVHlwZXMuaW5zZXJ0KHN0ZDo6c3RyaW5nKGV4dCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRUeXBlczsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlIik7CkBAIC0xMTQsNiArMTMyLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9TVVBQT1JURURfVFlQRVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHN1cHBvcnRlZFR5cGVzID0gZ2V0U3VwcG9ydGVkVHlwZXMoKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHN1cHBvcnRlZFR5cGVzLmJlZ2luKCk7IGl0ICE9IHN1cHBvcnRlZFR5cGVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlQ1N0cmluZygoKml0KS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCBlMmVjY2RkLi5lYTA2NjY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTE3OSw3ICsxNzksOCBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBidWZmZXJpbmcud3JpdGVUb1BhcmNlbCgmZGF0YSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihidWZmZXJpbmcubUluaXRpYWxNYXJrTXMpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmZmVyaW5nLm1SZXN1bWVQbGF5YmFja01hcmtNcyk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQlVGRkVSSU5HX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTk0LDcgKzE5NSw4IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQlVGRkVSSU5HX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgZXJyID0gYnVmZmVyaW5nLT5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOworICAgICAgICAgICAgYnVmZmVyaW5nLT5tSW5pdGlhbE1hcmtNcyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgYnVmZmVyaW5nLT5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTY5Niw3ICs2OTgsOCBAQAogICAgICAgICBjYXNlIFNFVF9CVUZGRVJJTkdfU0VUVElOR1M6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKLSAgICAgICAgICAgIGJ1ZmZlcmluZy5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7CisgICAgICAgICAgICBidWZmZXJpbmcubUluaXRpYWxNYXJrTXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYnVmZmVyaW5nLm1SZXN1bWVQbGF5YmFja01hcmtNcyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTcwNiw3ICs3MDksOCBAQAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIGJ1ZmZlcmluZy53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJpbmcubUluaXRpYWxNYXJrTXMpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBhY2E3YWQ5Li5iZDE4YTQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggYjJjOTFjNC4uZjI4MzU2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtNjUsNyArNjUsOSBAQAogICAgIEdFVF9ST1VURURfREVWSUNFX0lELAogICAgIEVOQUJMRV9BVURJT19ERVZJQ0VfQ0FMTEJBQ0ssCiAgICAgR0VUX0FDVElWRV9NSUNST1BIT05FUywKLQorICAgIEdFVF9QT1JUX0lELAorICAgIFNFVF9NSUNST1BIT05FX0RJUkVDVElPTiwKKyAgICBTRVRfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT04KIH07CiAKIGNsYXNzIEJwTWVkaWFSZWNvcmRlcjogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVJlY29yZGVyPgpAQCAtNDA3LDYgKzQwOSw0MSBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIHN0YXR1c190IHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICAgICAgQUxPR1YoInNldE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkaXJlY3Rpb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01JQ1JPUEhPTkVfRElSRUNUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SID8gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpIDogc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgICAgIEFMT0dWKCJzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oJWYpIiwgem9vbSk7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlRmxvYXQoem9vbSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gTk9fRVJST1IgPyAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkgOiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKKyAgICB7CisgICAgICAgIEFMT0dWKCJnZXRQb3J0SWQiKTsKKyAgICAgICAgaWYgKHBvcnRJZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BPUlRfSUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0sKKyAgICAgICAgICAgICAgICB8fCAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYVJlY29yZGVyLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFSZWNvcmRlciIpOwpAQCAtNjYxLDYgKzY5OCwzNCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogCiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfUE9SVF9JRDogeworICAgICAgICAgICAgQUxPR1YoIkdFVF9QT1JUX0lEIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UG9ydElkKCZwb3J0SWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwb3J0SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgU0VUX01JQ1JPUEhPTkVfRElSRUNUSU9OOiB7CisgICAgICAgICAgICBBTE9HVigiU0VUX01JQ1JPUEhPTkVfRElSRUNUSU9OIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBkaXJlY3Rpb24gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKHN0YXRpY19jYXN0PGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Q+KGRpcmVjdGlvbikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNFVF9NSUNST1BIT05FX0ZJRUxEX0RJTUVOU0lPTjogeworICAgICAgICAgICAgQUxPR1YoIlNFVF9NSUNST1BIT05FX0ZJRUxEX0RJTUVOU0lPTiIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBmbG9hdCB6b29tID0gZGF0YS5yZWFkRmxvYXQoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKaW5kZXggZjE4NWZkNC4uNGRlY2U5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCkBAIC0xMDcsNiArMTA3LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKEJwTWVkaWFTb3VyY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHN0YXR1c190IHJldCA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRGT1JNQVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CiAgICAgICAgICAgICBtTWV0YURhdGEgPSBNZXRhRGF0YTo6Y3JlYXRlRnJvbVBhcmNlbChyZXBseSk7CiAgICAgICAgICAgICByZXR1cm4gbU1ldGFEYXRhOwogICAgICAgICB9CkBAIC0xODYsNiArMTg3LDkgQEAKICAgICAgICAgcmV0ID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIEFMT0dWKCJyZWFkTXVsdGlwbGUgc3RhdHVzICVkLCBidWZmZXJDb3VudCAldSwgc2luY2VTdG9wICV1IiwKICAgICAgICAgICAgICAgICByZXQsIGJ1ZmZlckNvdW50LCBtQnVmZmVyc1NpbmNlU3RvcCk7CisgICAgICAgIGlmIChidWZmZXJDb3VudCAmJiByZXQgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCkBAIC0yMTksNiArMjIzLDggQEAKICAgICAvLyBOdVBsYXllciBwYXNzZXMgcG9pbnRlcnMtdG8tbWV0YWRhdGEgYXJvdW5kLCBzbyB3ZSB1c2UgdGhpcyB0byBrZWVwIHRoZSBtZXRhZGF0YSBhbGl2ZQogICAgIC8vIFhYWDogY291bGQgd2UgdXNlIHRoaXMgZm9yIGNhY2hpbmcsIG9yIGRvZXMgbWV0YWRhdGEgY2hhbmdlIG9uIHRoZSBmbHk/CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhRGF0YTsKKyAgICAvLyBlbnN1cmUgc3luY2hyb25pemUgYWNjZXNzIHRvIG1NZXRhRGF0YQorICAgIE11dGV4IG1Mb2NrOwogCiAgICAgLy8gQ2FjaGUgYWxsIElNZW1vcnkgb2JqZWN0cyByZWNlaXZlZCBmcm9tIE1lZGlhRXh0cmFjdG9yLgogICAgIC8vIFdlIGdjIElNZW1vcnkgb2JqZWN0cyB0aGF0IGFyZSBubyBsb25nZXIgYWN0aXZlIChyZWZlcmVuY2VkIGJ5IGEgTWVkaWFCdWZmZXIpLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAppbmRleCBhMDczMDgxLi43NDdiODhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcApAQCAtNTUyLDcgKzU1Miw3IEBACiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoT01YLCAiYW5kcm9pZC5oYXJkd2FyZS5JT01YIik7Ci1JTVBMRU1FTlRfSFlCUklEX01FVEFfSU5URVJGQUNFKE9NWE5vZGUsIElPbXhOb2RlLCAiYW5kcm9pZC5oYXJkd2FyZS5JT01YTm9kZSIpOworSU1QTEVNRU5UX0hZQlJJRF9NRVRBX0lOVEVSRkFDRShPTVhOb2RlLCAiYW5kcm9pZC5oYXJkd2FyZS5JT01YTm9kZSIpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKaW5kZXggNTMwOGUxYy4uODZhZDk5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcApAQCAtMjgsNiArMjgsMTUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvKiogVGhpcyByZWR1bmRhbnQgcmVkZWNsYXJhdGlvbiBpcyBuZWVkZWQgZm9yIEMrKyBwcmUgMTQgKi8KK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0tbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfRFlOQU1JQ19USU1FU1RBTVBbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfRlJBTUVfUEFSU0lOR1tdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9JTlRSQV9SRUZSRVNIW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX01VTFRJUExFX0ZSQU1FU1tdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9TRUNVUkVfUExBWUJBQ0tbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0tbXTsKKwogdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKAogICAgICAgICBWZWN0b3I8UHJvZmlsZUxldmVsPiAqcHJvZmlsZUxldmVscykgY29uc3QgewogICAgIHByb2ZpbGVMZXZlbHMtPmNsZWFyKCk7CkBAIC00MCwxNiArNDksMTEgQEAKICAgICBjb2xvckZvcm1hdHMtPmFwcGVuZFZlY3RvcihtQ29sb3JGb3JtYXRzKTsKIH0KIAotdWludDMyX3QgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0RmxhZ3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1GbGFnczsKLX0KLQogY29uc3Qgc3A8QU1lc3NhZ2U+IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldERldGFpbHMoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1EZXRhaWxzOwogfQogCi1NZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpDYXBhYmlsaXRpZXMoKQotICA6IG1GbGFncygwKSB7CitNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpDYXBhYmlsaXRpZXMoKSB7CiAgICAgbURldGFpbHMgPSBuZXcgQU1lc3NhZ2U7CiB9CiAKQEAgLTczLDEyICs3NywxMCBAQAogICAgICAgICAgICAgY2Fwcy0+bUNvbG9yRm9ybWF0cy5wdXNoX2JhY2soY29sb3IpOwogICAgICAgICB9CiAgICAgfQotICAgIHVpbnQzMl90IGZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgc3A8QU1lc3NhZ2U+IGRldGFpbHMgPSBBTWVzc2FnZTo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgIGlmIChkZXRhaWxzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChjYXBzICE9IE5VTEwpIHsKLSAgICAgICAgY2Fwcy0+bUZsYWdzID0gZmxhZ3M7CiAgICAgICAgIGNhcHMtPm1EZXRhaWxzID0gZGV0YWlsczsKICAgICB9CiAgICAgcmV0dXJuIGNhcHM7CkBAIC05Niw3ICs5OCw2IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29sb3JGb3JtYXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ29sb3JGb3JtYXRzLml0ZW1BdChpKSk7CiAgICAgfQotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtRmxhZ3MpOwogICAgIG1EZXRhaWxzLT53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTExLDYgKzExMiwxNCBAQAogICAgIG1DYXAtPm1EZXRhaWxzLT5zZXRJbnQzMihrZXksIHZhbHVlKTsKIH0KIAordm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjpyZW1vdmVEZXRhaWwoY29uc3QgY2hhcioga2V5KSB7CisgICAgaWYgKG1DYXAtPm1EZXRhaWxzLT5yZW1vdmVFbnRyeUF0KG1DYXAtPm1EZXRhaWxzLT5maW5kRW50cnlCeU5hbWUoa2V5KSkgPT0gT0spIHsKKyAgICAgICAgQUxPR0QoInN1Y2Nlc3NmdWxseSByZW1vdmVkIGRldGFpbCAlcyIsIGtleSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoImRldGFpbCAlcyB3YXNuJ3QgcHJlc2VudCB0byByZW1vdmUiLCBrZXkpOworICAgIH0KK30KKwogdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjphZGRQcm9maWxlTGV2ZWwoCiAgICAgICAgIHVpbnQzMl90IHByb2ZpbGUsIHVpbnQzMl90IGxldmVsKSB7CiAgICAgUHJvZmlsZUxldmVsIHByb2ZpbGVMZXZlbDsKQEAgLTEyOSwzMiArMTM4LDMyIEBACiAgICAgfQogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZEZsYWdzKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgbUNhcC0+bUZsYWdzIHw9IGZsYWdzOwotfQotCiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjpDYXBhYmlsaXRpZXNXcml0ZXIoCiAgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXMqIGNhcCkgOiBtQ2FwKGNhcCkgewogfQogCi1ib29sIE1lZGlhQ29kZWNJbmZvOjppc0VuY29kZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jc0VuY29kZXI7CitNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcyBNZWRpYUNvZGVjSW5mbzo6Z2V0QXR0cmlidXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUF0dHJpYnV0ZXM7CiB9CiAKLXVpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpyYW5rKCkgY29uc3QgewordWludDMyX3QgTWVkaWFDb2RlY0luZm86OmdldFJhbmsoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1SYW5rOwogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdCB7Ci0gICAgbWltZXMtPmNsZWFyKCk7Cit2b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRBbGlhc2VzKFZlY3RvcjxBU3RyaW5nPiAqYWxpYXNlcykgY29uc3QgeworICAgICphbGlhc2VzID0gbUFsaWFzZXM7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoVmVjdG9yPEFTdHJpbmc+ICptZWRpYVR5cGVzKSBjb25zdCB7CisgICAgbWVkaWFUeXBlcy0+Y2xlYXIoKTsKICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbUNhcHMuc2l6ZSgpOyBpeCsrKSB7Ci0gICAgICAgIG1pbWVzLT5wdXNoX2JhY2sobUNhcHMua2V5QXQoaXgpKTsKKyAgICAgICAgbWVkaWFUeXBlcy0+cHVzaF9iYWNrKG1DYXBzLmtleUF0KGl4KSk7CiAgICAgfQogfQogCiBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPgotTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptaW1lKSBjb25zdCB7Ci0gICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKK01lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWVkaWFUeXBlKSBjb25zdCB7CisgICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtZWRpYVR5cGUpOwogICAgIGlmIChpeCA+PSAwKSB7CiAgICAgICAgIHJldHVybiBtQ2Fwcy52YWx1ZUF0KGl4KTsKICAgICB9CkBAIC0xNzMsMjEgKzE4MiwyNiBAQAogc3A8TWVkaWFDb2RlY0luZm8+IE1lZGlhQ29kZWNJbmZvOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgQVN0cmluZyBuYW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgIEFTdHJpbmcgb3duZXIgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihwYXJjZWwucmVhZEludDMyKCkpOworICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IHN0YXRpY19jYXN0PEF0dHJpYnV0ZXM+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgdWludDMyX3QgcmFuayA9IHBhcmNlbC5yZWFkVWludDMyKCk7CiAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm87CiAgICAgaW5mby0+bU5hbWUgPSBuYW1lOwogICAgIGluZm8tPm1Pd25lciA9IG93bmVyOwotICAgIGluZm8tPm1Jc0VuY29kZXIgPSBpc0VuY29kZXI7CisgICAgaW5mby0+bUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwogICAgIGluZm8tPm1SYW5rID0gcmFuazsKKyAgICBzaXplX3QgbnVtQWxpYXNlcyA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUFsaWFzZXM7IGkrKykgeworICAgICAgICBBU3RyaW5nIGFsaWFzID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBpbmZvLT5tQWxpYXNlcy5hZGQoYWxpYXMpOworICAgIH0KICAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBBU3RyaW5nIG1pbWUgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIEFTdHJpbmcgbWVkaWFUeXBlID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICBzcDxDYXBhYmlsaXRpZXM+IGNhcHMgPSBDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgaWYgKGNhcHMgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBpZiAoaW5mbyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbmZvLT5tQ2Fwcy5hZGQobWltZSwgY2Fwcyk7CisgICAgICAgICAgICBpbmZvLT5tQ2Fwcy5hZGQobWVkaWFUeXBlLCBjYXBzKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gaW5mbzsKQEAgLTE5Niw4ICsyMTAsMTIgQEAKIHN0YXR1c190IE1lZGlhQ29kZWNJbmZvOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CiAgICAgbU5hbWUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwogICAgIG1Pd25lci53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1Jc0VuY29kZXIpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQXR0cmlidXRlcyk7CiAgICAgcGFyY2VsLT53cml0ZVVpbnQzMihtUmFuayk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1BbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBBU3RyaW5nICZhbGlhcyA6IG1BbGlhc2VzKSB7CisgICAgICAgIGFsaWFzLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICB9CiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1DYXBzLnNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2Fwcy5zaXplKCk7IGkrKykgewogICAgICAgICBtQ2Fwcy5rZXlBdChpKS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CkBAIC0yMDYsMTAgKzIyNCwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3NpemVfdCBNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0IHsKLSAgICBpZiAobWltZSkgeworc3NpemVfdCBNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgY29uc3QgeworICAgIGlmIChtZWRpYVR5cGUpIHsKICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgaWYgKG1DYXBzLmtleUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG1pbWUpKSB7CisgICAgICAgICAgICBpZiAobUNhcHMua2V5QXQoaXgpLmVxdWFsc0lnbm9yZUNhc2UobWVkaWFUeXBlKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBpeDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjE3LDE5ICsyMzUsMjYgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLU1lZGlhQ29kZWNJbmZvOjpNZWRpYUNvZGVjSW5mbygpIDogbVJhbmsoMHgxMDApIHsKK01lZGlhQ29kZWNJbmZvOjpNZWRpYUNvZGVjSW5mbygpCisgICAgOiBtQXR0cmlidXRlcygoTWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXMpMCksCisgICAgICBtUmFuaygweDEwMCkgewogfQogCiB2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKICAgICBtSW5mby0+bU5hbWUgPSBuYW1lOwogfQogCit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRBbGlhcyhjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgbUluZm8tPm1BbGlhc2VzLmFkZChuYW1lKTsKK30KKwogdm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0T3duZXIoY29uc3QgY2hhciogb3duZXIpIHsKICAgICBtSW5mby0+bU93bmVyID0gb3duZXI7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldEVuY29kZXIoYm9vbCBpc0VuY29kZXIpIHsKLSAgICBtSW5mby0+bUlzRW5jb2RlciA9IGlzRW5jb2RlcjsKK3ZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldEF0dHJpYnV0ZXMoCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRyaWJ1dGVzKSB7CisgICAgbUluZm8tPm1BdHRyaWJ1dGVzID0gKE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzKWF0dHJpYnV0ZXM7CiB9CiAKIHZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldFJhbmsodWludDMyX3QgcmFuaykgewpAQCAtMjM3LDIxICsyNjIsMjEgQEAKIH0KIAogc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+Ci0gICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKKyAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1lZGlhVHlwZShjb25zdCBjaGFyICptZWRpYVR5cGUpIHsKKyAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtZWRpYVR5cGUpOwogICAgIGlmIChpeCA+PSAwKSB7CiAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4oCiAgICAgICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIoCiAgICAgICAgICAgICAgICAgbUluZm8tPm1DYXBzLnZhbHVlQXQoaXgpLmdldCgpKSk7CiAgICAgfQogICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPSBuZXcgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcygpOwotICAgIG1JbmZvLT5tQ2Fwcy5hZGQoQVN0cmluZyhtaW1lKSwgY2Fwcyk7CisgICAgbUluZm8tPm1DYXBzLmFkZChBU3RyaW5nKG1lZGlhVHlwZSksIGNhcHMpOwogICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4oCiAgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcihjYXBzLmdldCgpKSk7CiB9CiAKLWJvb2wgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnJlbW92ZU1pbWUoY29uc3QgY2hhciAqbWltZSkgewotICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworYm9vbCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6cmVtb3ZlTWVkaWFUeXBlKGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgeworICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1lZGlhVHlwZSk7CiAgICAgaWYgKGl4ID49IDApIHsKICAgICAgICAgbUluZm8tPm1DYXBzLnJlbW92ZUl0ZW1zQXQoaXgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggZTBmNWE0MC4uOThjNTQ5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTQ4LDcgKzQ4LDggQEAKICAgICB7ImFtcndiIiwgIEFVRElPX0VOQ09ERVJfQU1SX1dCfSwKICAgICB7ImFhYyIsICAgIEFVRElPX0VOQ09ERVJfQUFDfSwKICAgICB7ImhlYWFjIiwgIEFVRElPX0VOQ09ERVJfSEVfQUFDfSwKLSAgICB7ImFhY2VsZCIsIEFVRElPX0VOQ09ERVJfQUFDX0VMRH0KKyAgICB7ImFhY2VsZCIsIEFVRElPX0VOQ09ERVJfQUFDX0VMRH0sIAorICAgIHsib3B1cyIsICAgQVVESU9fRU5DT0RFUl9PUFVTfQogfTsKIAogY29uc3QgTWVkaWFQcm9maWxlczo6TmFtZVRvVGFnTWFwIE1lZGlhUHJvZmlsZXM6OnNGaWxlRm9ybWF0TWFwW10gPSB7CkBAIC05MSw2ICs5MiwxOSBAQAogICAgIHsiaGlnaHNwZWVkNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNzIwUH0sCiAgICAgeyJoaWdoc3BlZWQxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMTA4MFB9LAogICAgIHsiaGlnaHNwZWVkMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQfSwKKworICAgIC8vIFZlbmRvci1zcGVjaWZpYyBwcm9maWxlcworICAgIHsidmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfVkdBfSwKKyAgICB7IjRrZGNpIiwgQ0FNQ09SREVSX1FVQUxJVFlfNEtEQ0l9LAorICAgIHsidGltZWxhcHNldmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9WR0F9LAorICAgIHsidGltZWxhcHNlNGtkY2kiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzRLRENJfSwKKyAgICB7ImhpZ2hzcGVlZGNpZiIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfQ0lGfSwKKyAgICB7ImhpZ2hzcGVlZHZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfVkdBfSwKKyAgICB7ImhpZ2hzcGVlZDRrZGNpIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF80S0RDSX0sCisgICAgeyJxaGQiLCBDQU1DT1JERVJfUVVBTElUWV9RSER9LAorICAgIHsiMmsiLCBDQU1DT1JERVJfUVVBTElUWV8ya30sCisgICAgeyJ0aW1lbGFwc2VxaGQiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FIRH0sCisgICAgeyJ0aW1lbGFwc2UyayIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMmt9LAogfTsKIAogI2lmIExPR19OREVCVUcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKaW5kZXggNWNhM2I0OC4uZDhlZjljZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAKIHN0YXRpYyBpbnQgcmVhZEF0KHZvaWQgKmhhbmRsZSwgdm9pZCAqYnVmZmVyLCBpbnQgcG9zLCBpbnQgc2l6ZSkgewogICAgIHJldHVybiAoKGFuZHJvaWQ6Ok1pZGlJb1dyYXBwZXIqKWhhbmRsZSktPnJlYWRBdChidWZmZXIsIHBvcywgc2l6ZSk7CkBAIC00OSwxMCArNTAsNDcgQEAKICAgICBtRGF0YVNvdXJjZSA9IG51bGxwdHI7CiB9CiAKLU1pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgewotICAgIEFMT0dWKCJNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2UpIik7CitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VVbndyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICAgICAgbVNvdXJjZSA9IGNzb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCB+RGF0YVNvdXJjZVVud3JhcHBlcigpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIE9LOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQobVNvdXJjZS0+aGFuZGxlLCBvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUobVNvdXJjZS0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKiAvKnVyaVN0cmluZyovLCBzaXplX3QgLypidWZmZXJTaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVNvdXJjZTsKK307CisKK01pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICBBTE9HVigiTWlkaUlvV3JhcHBlcihDRGF0YVNvdXJjZSkiKTsKICAgICBtRmQgPSAtMTsKLSAgICBtRGF0YVNvdXJjZSA9IHNvdXJjZTsKKyAgICBtQmFzZSA9IDA7CisgICAgbURhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZVVud3JhcHBlcihjc291cmNlKTsKICAgICBvZmY2NF90IGw7CiAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZsKSA9PSBPSykgewogICAgICAgICBtTGVuZ3RoID0gbDsKQEAgLTY2LDYgKzEwNCw3IEBACiAgICAgaWYgKG1GZCA+PSAwKSB7CiAgICAgICAgIGNsb3NlKG1GZCk7CiAgICAgfQorICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogaW50IE1pZGlJb1dyYXBwZXI6OnJlYWRBdCh2b2lkICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzaXplKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzYjkxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRXJyb3JQcml2LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0lPKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfTUFMRk9STUVEKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgIH0gZWxzZSBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmIChlcnIgPT0gVU5LTk9XTl9FUlJPUikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190IGVycikgeworCisgICAgaWYgKGVyciA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9JTykgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfTUFMRk9STUVEKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfVU5LTk9XTikgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HRSgibmRrIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOWZiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRm9ybWF0IgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnNpb24gdG8vZnJvbSBBTWVzc2FnZQorQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhzcDxBTWVzc2FnZT4gKmRhdGEpIHsKKyAgICBBTE9HVigicHJpdmF0ZSBjdG9yIik7CisgICAgQU1lZGlhRm9ybWF0KiBtRGF0YSA9IG5ldyBBTWVkaWFGb3JtYXQoKTsKKyAgICBtRGF0YS0+bUZvcm1hdCA9ICpkYXRhOworICAgIGlmIChtRGF0YS0+bUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJnb3QgTlVMTCBmb3JtYXQiKTsKKyAgICAgICAgbURhdGEtPm1Gb3JtYXQgPSBuZXcgQU1lc3NhZ2U7CisgICAgfQorICAgIHJldHVybiBtRGF0YTsKK30KKwordm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHNwPEFNZXNzYWdlPiAqZGVzdCkgeworICAgICpkZXN0ID0gbURhdGEtPm1Gb3JtYXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCmluZGV4IDExODQwN2UuLmVhMDU0N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCkBAIC0yNywyMyArMjcsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAotLy8gVGVtcG9yYXJpbHkga2VlcGluZyBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdCgpIHdoZXJlIGl0IGlzIHVzZWQuCi0vLyBXaWxsIGJlIHJlbW92ZWQgc29vbiBpbiBmYXZvciBvZiBvZmZpY2lhbCBwdWJsaWMgQVBJcy4KLXN0cnVjdCBBTWVkaWFFeHRyYWN0b3IgewotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok51TWVkaWFFeHRyYWN0b3I+IG1JbXBsOwotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFCdWZmZXI+IG1Qc3NoQnVmOwotfTsKLQotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QoQU1lZGlhRXh0cmFjdG9yICogZXgpIHsKLSAgICBleC0+bUltcGwtPmRpc2Nvbm5lY3QoKTsKLSAgICByZXR1cm4gQU1FRElBX09LOwotfQorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC02OSw2ICs1NywxMSBAQAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFksCisgICAgQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQsCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLLAogICAgIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCwKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUywKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUywKQEAgLTEwMyw2ICs5Niw3IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cEludDY0W10gPSB7CiAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9QVFNfR0FQX1RPX0VOQ09ERVIsCiAgICAgQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIsCiAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLAogfTsKQEAgLTExNCw2ICsxMDgsOCBAQAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwQnVmZmVyW10gPSB7CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLAogICAgIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPLAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0VJLAogICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEsCkBAIC0xMzIsNiArMTI4LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cEZsb2F0SW50MzJbXSA9IHsKICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsCiAgICAgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMLAorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0ZQU19UT19FTkNPREVSLAogICAgIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEUsCiB9OwogCkBAIC0xMDgyLDE0ICsxMDc5LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdChtQU1lZGlhRXh0cmFjdG9yKTsKLSAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShlcnIpOwotICAgIH0KLSAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci19Ci0KIEFNZWRpYUV4dHJhY3RvciAqQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0QU1lZGlhRXh0cmFjdG9yKCkgY29uc3QgewogICAgIHJldHVybiBtQU1lZGlhRXh0cmFjdG9yOwogfQpAQCAtMTI2Myw0MCArMTI1MiwyOCBAQAogICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhtQU1lZGlhRXh0cmFjdG9yKSk7Ci19Ci0KLXNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUodm9pZCAqdXNlcmRhdGEpIHsKLSAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKLSAgICBvZmY2NF90IHNpemUgPSAtMTsKLSAgICBzb3VyY2UtPmdldFNpemUoJnNpemUpOwotICAgIHJldHVybiBzaXplOwotfQotCi1zc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSkgewotICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOwotICAgIHJldHVybiBzb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1Ziwgc2l6ZSk7Ci19Ci0KLXZvaWQgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKSB7Ci0gICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7Ci0gICAgc291cmNlLT5jbG9zZSgpOworICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqY3J5cHRvSW5mbyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKG1BTWVkaWFFeHRyYWN0b3IpOworICAgIGlmIChjcnlwdG9JbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcihjcnlwdG9JbmZvKTsKIH0KIAogQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCi0gICAgICBtQU1lZGlhRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlX25ldygpKSB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UgKHNvdXJjZTogJXApIiwgZGF0YVNvdXJjZS5nZXQoKSk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtQU1lZGlhRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS5nZXQoKSk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobUFNZWRpYURhdGFTb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKG1BTWVkaWFEYXRhU291cmNlLCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9nZXRTaXplKTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1BTWVkaWFEYXRhU291cmNlLCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9jbG9zZSk7CisgICAgICBtQU1lZGlhRGF0YVNvdXJjZShjb252ZXJ0RGF0YVNvdXJjZVRvQU1lZGlhRGF0YVNvdXJjZShkYXRhU291cmNlKSkgeworfQorCitBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoQU1lZGlhRGF0YVNvdXJjZSAqYURhdGFTb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShOVUxMKSwKKyAgICAgIG1BTWVkaWFEYXRhU291cmNlKGFEYXRhU291cmNlKSB7CiB9CiAKIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjp+QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoKSB7CiAgICAgaWYgKG1BTWVkaWFEYXRhU291cmNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKG1BTWVkaWFEYXRhU291cmNlKTsKICAgICBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShtQU1lZGlhRGF0YVNvdXJjZSk7CiAgICAgbUFNZWRpYURhdGFTb3VyY2UgPSBOVUxMOwogfQpAQCAtMTMwNSw0ICsxMjgyLDggQEAKICAgICByZXR1cm4gbUFNZWRpYURhdGFTb3VyY2U7CiB9CiAKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OmNsb3NlKCkgeworICAgIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UobUFNZWRpYURhdGFTb3VyY2UpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjVkNGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgc3RhdGljIHNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBzVGltZUNoZWNrVGhyZWFkID0gbmV3IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkKCk7Ci0gICAgcmV0dXJuIHNUaW1lQ2hlY2tUaHJlYWQ7Ci19Ci0KLVRpbWVDaGVjazo6VGltZUNoZWNrKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKQotICAgIDogbUVuZFRpbWVOcyhnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RhcnRNb25pdG9yaW5nKHRhZywgdGltZW91dE1zKSkKLXsKLX0KLQotVGltZUNoZWNrOjp+VGltZUNoZWNrKCkgewotICAgIGdldFRpbWVDaGVja1RocmVhZCgpLT5zdG9wTW9uaXRvcmluZyhtRW5kVGltZU5zKTsKLX0KLQotVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6On5UaW1lQ2hlY2tUaHJlYWQoKQotewotICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5jbGVhcigpOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi1uc2Vjc190IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdGFydE1vbml0b3JpbmcoY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBuc2Vjc190IGVuZFRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyh0aW1lb3V0TXMpOwotICAgIGZvciAoOyBtTW9uaXRvclJlcXVlc3RzLmluZGV4T2ZLZXkoZW5kVGltZU5zKSA+PSAwOyArK2VuZFRpbWVOcyk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5hZGQoZW5kVGltZU5zLCB0YWcpOwotICAgIG1Db25kLnNpZ25hbCgpOwotICAgIHJldHVybiBlbmRUaW1lTnM7Ci19Ci0KLXZvaWQgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0b3BNb25pdG9yaW5nKG5zZWNzX3QgZW5kVGltZU5zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5yZW1vdmVJdGVtKGVuZFRpbWVOcyk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLWJvb2wgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnRocmVhZExvb3AoKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IFRJTUVEX09VVDsKLSAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLQotICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBJTlQ2NF9NQVg7Ci0gICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAotICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKLSAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKLSAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIlRpbWVDaGVjayB0aW1lb3V0IGZvciAlcyIsIHRhZyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IDg2ZGVmMDIuLjAzMDFiMjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC03NCw2ICs3NCw3IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0hETUkpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSV9BUkMpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpLApAQCAtOTMsNiArOTQsOCBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQlVTKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1BST1hZKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9CTEUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fREVGQVVMVCksCiAgICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fU1RVQiksCkBAIC0xMzIsNiArMTM1LDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTIwNSw2ICsyMDksMTQgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8xXzApLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzJfMCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMl8xKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0xDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YxKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0NFTFQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9BREFQVElWRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9MSERDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0xIRENfTEwpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTIzNSw2ICsyNDcsMTIgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQ0KSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PX0hBUFRJQ19BKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPX0hBUFRJQ19BKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0FCKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OT19IQVBUSUNfQUIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU9fSEFQVElDX0FCKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0yODEsNiArMjk5LDcgQEAKIAogdGVtcGxhdGUgPD4KIGNvbnN0IFN0cmVhbVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFN0cmVhbVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fREVGQVVMVCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1NZU1RFTSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9SSU5HKSwKQEAgLTM1MiwxMSArMzcxLDMwIEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfRk1fVFVORVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfSE9UV09SRCksCiAgICAgVEVSTUlOQVRPUgogfTsKIAordGVtcGxhdGUgPD4KK2NvbnN0IEF1ZGlvRmxhZ0NvbnZlcnRlcjo6VGFibGUgQXVkaW9GbGFnQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19OT05FKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19TRUNVUkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX1NDTyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQkVBQ09OKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19IV19BVl9TWU5DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19IV19IT1RXT1JEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQllQQVNTX01VVEUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0xPV19MQVRFTkNZKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19ERUVQX0JVRkZFUiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9fQ0FQVFVSRSksCisgICAgVEVSTUlOQVRPUgorfTsKKwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxPdXRwdXREZXZpY2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxJbnB1dERldmljZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPE91dHB1dEZsYWdUcmFpdHM+OwpAQCAtMzcwLDIwICs0MDgsMTMgQEAKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8QXVkaW9Nb2RlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+OwordGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxBdWRpb0ZsYWdUcmFpdHM+OwogCiBib29sIGRldmljZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxpdGVyYWxEZXZpY2UsIGF1ZGlvX2RldmljZXNfdCYgZGV2aWNlKSB7CiAgICAgcmV0dXJuIElucHV0RGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxEZXZpY2UsIGRldmljZSkgfHwKICAgICAgICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRGV2aWNlLCBkZXZpY2UpOwogfQogCi1ib29sIGRldmljZVRvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlKSB7Ci0gICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pIHsKLSAgICAgICAgcmV0dXJuIElucHV0RGV2aWNlQ29udmVydGVyOjp0b1N0cmluZyhkZXZpY2UsIGxpdGVyYWxEZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OnRvU3RyaW5nKGRldmljZSwgbGl0ZXJhbERldmljZSk7Ci0gICAgfQotfQotCiBTYW1wbGVSYXRlVHJhaXRzOjpDb2xsZWN0aW9uIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2FtcGxpbmdSYXRlcywgY29uc3QgY2hhciAqZGVsKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjFiYzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiBTZXJ2aWNlIHRvIHJlbG9hZCBleHRyYWN0b3IgcGx1Z2lucyB3aGVuIHVwZGF0ZSBwYWNrYWdlIGlzIGluc3RhbGxlZC91bmluc3RhbGxlZC4KLSAqIEBoaWRlCi0gKi8KLWludGVyZmFjZSBJTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlIHsKLSAgICB2b2lkIGxvYWRQbHVnaW5zKEB1dGY4SW5DcHAgU3RyaW5nIGFwa1BhdGgpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKaW5kZXggZDZhOWNmYi4uYjAzODg1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCkBAIC03OCw2ICs3OCw3IEBACiAKICAgICAvLyBPdmVycmlkZXMgUGFzc3RocnVCdWZmZXJQcm92aWRlcgogICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworICAgIHZvaWQgc2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgb3ZlcnJpZGU7CiAKICAgICAvLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBzdXBwbGllZCBieSB0aGUgZGVyaXZlZCBjbGFzcy4gIEl0IGNvbnZlcnRzCiAgICAgLy8gI2ZyYW1lcyBpbiB0aGUgKnNyYyBwb2ludGVyIHRvIHRoZSAqZHN0IHBvaW50ZXIuICBJdCBpcyBwdWJsaWMgYmVjYXVzZQpAQCAtMTg2LDYgKzE4Nyw3IEBACiAKICAgICAvLyBPdmVycmlkZXMgUGFzc3RocnVCdWZmZXJQcm92aWRlcgogICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworICAgIHZvaWQgc2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKIApAQCAtMjE2LDYgKzIxOCw0MSBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXliYWNrUmF0ZVZhbGlkOyAvLyBmbGFnIGZvciBjdXJyZW50IHBhcmFtZXRlcnMgdmFsaWRpdHkKIH07CiAKKy8vIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBhZGp1c3Qgc2FtcGxlIGRhdGEuCisvLyBFeHBhbmRzIG9yIGNvbnRyYWN0cyBzYW1wbGUgZGF0YSBmcm9tIG9uZSBpbnRlcmxlYXZlZCBjaGFubmVsIGZvcm1hdCB0byBhbm90aGVyLgorLy8gRXh0cmEgZXhwYW5kZWQgY2hhbm5lbHMgYXJlIGZpbGxlZCB3aXRoIHplcm9zIGFuZCBwdXQgYXQgdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBhcmUgY29waWVkIHRvIHRoZSBlbmQgb2YgdGhlIG91dHB1dCBidWZmZXIoc3RvcmFnZSBzaG91bGQgYmUKKy8vIGFsbG9jYXRlZCBhcHByb3ByaWF0ZWx5KS4KKy8vIENvbnRyYWN0ZWQgY2hhbm5lbHMgY291bGQgYmUgd3JpdHRlbiB0byBvdXRwdXQgYnVmZmVyLgorY2xhc3MgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LCBzaXplX3QgZnJhbWVDb3VudCkgOiBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIEFVRElPX0ZPUk1BVF9JTlZBTElELCBudWxscHRyKSB7IH0KKyAgICAvLyBDb250cmFjdGVkIGRhdGEgaXMgY29udmVydGVkIHRvIGNvbnRyYWN0ZWRGb3JtYXQgYW5kIHB1dCBpbnRvIGNvbnRyYWN0ZWRCdWZmZXIuCisgICAgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcihhdWRpb19mb3JtYXRfdCBmb3JtYXQsIHNpemVfdCBpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIHNpemVfdCBvdXRDaGFubmVsQ291bnQsIHNpemVfdCBmcmFtZUNvdW50LCBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LAorICAgICAgICAgICAgdm9pZCogY29udHJhY3RlZEJ1ZmZlcik7CisgICAgLy9PdmVycmlkZXMKKyAgICBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogcEJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGNsZWFyQ29udHJhY3RlZEZyYW1lcygpIHsgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzID0gMDsgfQorCitwcm90ZWN0ZWQ6CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtSW5DaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbU91dENoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXM7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUNvbnRyYWN0ZWRDaGFubmVsQ291bnQ7CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUNvbnRyYWN0ZWRGb3JtYXQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqbUNvbnRyYWN0ZWRCdWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db250cmFjdGVkRnJhbWVTaXplOworfTsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oCmluZGV4IGQyYTNlNDAuLmQ5N2NjMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmgKQEAgLTE3LDExICsxNywxMSBAQAogI2lmbmRlZiBBTkRST0lEX0JVRkZFUklOR19TRVRUSU5HU19ICiAjZGVmaW5lIEFORFJPSURfQlVGRkVSSU5HX1NFVFRJTkdTX0gKIAotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBCdWZmZXJpbmdTZXR0aW5ncyA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKK3N0cnVjdCBCdWZmZXJpbmdTZXR0aW5ncyB7CiAgICAgc3RhdGljIGNvbnN0IGludCBrTm9NYXJrID0gLTE7CiAKICAgICBpbnQgbUluaXRpYWxNYXJrTXM7CkBAIC0zMiw5ICszMiw2IEBACiAKICAgICBCdWZmZXJpbmdTZXR0aW5ncygpOwogCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmgKaW5kZXggZmY4Nzg5ZC4uNzNjMDI5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9GYWN0b3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b1BsdWdpbi5oPgogCiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC03Miw2ICs3Myw3IEBACiAKICAgICBjb25zdCBWZWN0b3I8c3A8SUNyeXB0b0ZhY3Rvcnk+PiBtRmFjdG9yaWVzOwogICAgIHNwPElDcnlwdG9QbHVnaW4+IG1QbHVnaW47CisgICAgc3A8ZHJtOjpWMV8yOjpJQ3J5cHRvUGx1Z2luPiBtUGx1Z2luVjFfMjsKIAogICAgIC8qKgogICAgICAqIG1Jbml0Q2hlY2sgaXM6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmgKaW5kZXggYzE5MDI2MS4uNDMzNjc2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaApAQCAtMzAsNiArMzAsMTEgQEAKIC8vIEEgYmluZGVyIGludGVyZmFjZSBmb3IgaW1wbGVtZW50aW5nIGEgc3RhZ2VmcmlnaHQgRGF0YVNvdXJjZSByZW1vdGVseS4KIHN0cnVjdCBEYXRhU291cmNlRGVzYyA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKKyAgICAvLyBpbnRlbnRpb25hbGx5IGxlc3MgdGhhbiBJTlQ2NF9NQVgKKyAgICAvLyBrZWVwIGNvbnNpc3RlbnQgd2l0aCBKQVZBIGNvZGUKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4VGltZU1zID0gMHg3ZmZmZmZmZmZmZmZmZmZsbCAvIDEwMDA7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heFRpbWVVcyA9IGtNYXhUaW1lTXMgKiAxMDAwOworCiAgICAgZW51bSB7CiAgICAgICAgIC8qIE5vIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCB5ZXQgKi8KICAgICAgICAgVFlQRV9OT05FICAgICA9IDAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAppbmRleCBmMjY3Zjc2Li5hNjMwYmZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKQEAgLTIwLDkgKzIwLDExIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybUZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybVBsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtUGx1Z2luTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgpAQCAtMzYsMTAgKzM4LDE0IEBACiB1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW47CiB1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKIHVzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpPZmZsaW5lTGljZW5zZVN0YXRlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogCit0eXBlZGVmIGRybTo6VjFfMjo6SURybVBsdWdpbkxpc3RlbmVyIElEcm1QbHVnaW5MaXN0ZW5lcl9WMV8yOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOwpAQCAtNTEsMTMgKzU3LDE2IEBACiAKIHN0cnVjdCBEcm1IYWwgOiBwdWJsaWMgQm5Ecm0sCiAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAotICAgICAgICAgICAgIHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXIgeworICAgICAgICAgICAgICAgIHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMiB7CiAgICAgRHJtSGFsKCk7CiAgICAgdmlydHVhbCB+RHJtSGFsKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwogCi0gICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmYXBwUGFja2FnZU5hbWUpOwpAQCAtMTEzLDYgKzEyMiwxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0OwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJmtleVNldElkcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3Q7CkBAIC0xNjgsNiArMTgyLDggQEAKICAgICBSZXR1cm48dm9pZD4gc2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKIAorICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKwogICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8pOwogCiBwcml2YXRlOgpAQCAtMTgyLDYgKzE5OCw3IEBACiAgICAgY29uc3QgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gbUZhY3RvcmllczsKICAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwogICAgIHNwPGRybTo6VjFfMTo6SURybVBsdWdpbj4gbVBsdWdpblYxXzE7CisgICAgc3A8ZHJtOjpWMV8yOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMjsKICAgICBTdHJpbmc4IG1BcHBQYWNrYWdlTmFtZTsKIAogICAgIC8vIE11dGFibGUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIHdpdGhpbiBHZXRQcm9wZXJ0eUJ5dGVBcnJheS4KQEAgLTIxMCw2ICsyMjcsMTEgQEAKICAgICBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlKSBjb25zdDsKKyAgICBzdGF0dXNfdCBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChjb25zdCBzcDxJRHJtRmFjdG9yeT4gJmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtSGFsKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCmluZGV4IDhlOWViM2EuLmZiZTgwYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCkBAIC0zNCw3ICszNCwxMCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqcmVzdWx0KSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmFwcFBhY2thZ2VOYW1lKSA9IDA7CkBAIC03NSw4ICs3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcElkcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BJZHMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkLCBWZWN0b3I8dWludDhfdD4gJnNlY3VyZVN0b3ApID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSA9IDA7CkBAIC05MSw2ICs5NCwxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3QgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCA0NWU5NjIwLi41Y2UyY2RiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0lNRURJQUVYVFJBQ1RPUlNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX0lNRURJQUVYVFJBQ1RPUlNFUlZJQ0VfSAogCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKwogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC0zMyw2ICszNSw4IEBACiAgICAgdmlydHVhbCBzcDxJTWVkaWFFeHRyYWN0b3I+IG1ha2VFeHRyYWN0b3IoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpID0gMDsKIAogICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IG1ha2VJRGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOworCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCkgPSAwOwogfTsKIAogY2xhc3MgQm5NZWRpYUV4dHJhY3RvclNlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCAyMTdkZTE0Li5mMmUyMDYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMjYsMTEgKzI2LDExIEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIElNZWRpYVBsYXllcjsKIGNsYXNzIElNZWRpYUNvZGVjTGlzdDsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDM3OTAwMGUuLjBiMDk0MjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTczLDcgKzczLDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSA9IDA7Ci0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaAppbmRleCA3YTRiMWI5Li41YWI2ZTM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmgKQEAgLTEyNiw4ICsxMjYsOCBAQAogCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrQmluZGVyTWVkaWFCdWZmZXJzID0gNDsgLy8gYnVmZmVycyBtYW5hZ2VkIGJ5IEJuTWVkaWFTb3VyY2UKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUcmFuc2ZlclNoYXJlZEFzU2hhcmVkVGhyZXNob2xkID0gNCAqIDEwMjQ7ICAvLyBpZiA+PSBzaGFyZWQsIGVsc2UgaW5saW5lCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVHJhbnNmZXJJbmxpbmVBc1NoYXJlZFRocmVzaG9sZCA9IDY0ICogMTAyNDsgLy8gaWYgPj0gc2hhcmVkLCBlbHNlIGlubGluZQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0lubGluZU1heFRyYW5zZmVyID0gMjU2ICogMTAyNDsgLy8gQmluZGVyIHNpemUgbGltaXRlZCB0byBCSU5ERVJfVk1fU0laRS4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUcmFuc2ZlcklubGluZUFzU2hhcmVkVGhyZXNob2xkID0gOCAqIDEwMjQ7IC8vIGlmID49IHNoYXJlZCwgZWxzZSBpbmxpbmUKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbmxpbmVNYXhUcmFuc2ZlciA9IDY0ICogMTAyNDsgLy8gQmluZGVyIHNpemUgbGltaXRlZCB0byBCSU5ERVJfVk1fU0laRS4KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkJuTWVkaWFTb3VyY2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKaW5kZXggZmIxMTQzNS4uZWEwYWFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKQEAgLTI2LDggKzI2LDcgQEAKIHB1YmxpYzoKICAgICAvKiBDcmVhdGVzIGEgSmF2YSBBdWRpb0F0dHJpYnV0ZXMgb2JqZWN0LiAqLwogICAgIHN0YXRpYyBqb2JqZWN0IGNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihKTklFbnYgKmVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpIHsKIAogICAgICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlciIpOwogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTU4LDExICs1Nyw2IEBACiAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgdGhlICd0YWdzJyAoY2hhcltdIHRvIEhhc2hTZXQ8U3RyaW5nPikuCiAgICAgICAgICAgICAvLyBIb3cgdG8gcGFyc2UgdGhlIGNoYXJbXT8gSXMgdGhlcmUgYW55IGV4YW1wbGUgb2YgaXQ/CiAgICAgICAgICAgICAvLyBBbHNvLCB0aGUgYWRkVGFncygpIG1ldGhvZCBpcyBoaWRkZW4uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDYWxsIEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyLnNldExlZ2FjeVN0cmVhbVR5cGUoKS5idWlsZCgpCi0gICAgICAgICAgICBqbWV0aG9kSUQgalNldExlZ2FjeVN0cmVhbVR5cGUgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0TGVnYWN5U3RyZWFtVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlcjsiKTsKLSAgICAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0TGVnYWN5U3RyZWFtVHlwZSwgc3RyZWFtVHlwZSk7CiAgICAgICAgIH0KIAogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAppbmRleCBiMzc3N2QzLi41NGY1NjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwpAQCAtNTEsMjEgKzUzLDQ3IEBACiAKICAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyOwogCisgICAgZW51bSBBdHRyaWJ1dGVzIDogaW50MzJfdCB7CisgICAgICAgIC8vIGF0dHJpYnV0ZSBmbGFncworICAgICAgICBrRmxhZ0lzRW5jb2RlciA9IDEgPDwgMCwKKyAgICAgICAga0ZsYWdJc1ZlbmRvciA9IDEgPDwgMSwKKyAgICAgICAga0ZsYWdJc1NvZnR3YXJlT25seSA9IDEgPDwgMiwKKyAgICAgICAga0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQgPSAxIDw8IDMsCisgICAgfTsKKwogICAgIHN0cnVjdCBDYXBhYmlsaXRpZXMgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgICAgIGVudW0gewotICAgICAgICAgICAgLy8gZGVjb2RlciBmbGFncwotICAgICAgICAgICAga0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sgPSAxIDw8IDAsCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzU2VjdXJlUGxheWJhY2sgPSAxIDw8IDEsCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayA9IDEgPDwgMiwKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0tbXSA9ICJmZWF0dXJlLWFkYXB0aXZlLXBsYXliYWNrIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfRFlOQU1JQ19USU1FU1RBTVBbXSA9ICJmZWF0dXJlLWR5bmFtaWMtdGltZXN0YW1wIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfRlJBTUVfUEFSU0lOR1tdID0gImZlYXR1cmUtZnJhbWUtcGFyc2luZyI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX0lOVFJBX1JFRlJFU0hbXSA9ICJmZWF0dXJlLWZyYW1lLXBhcnNpbmciOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9NVUxUSVBMRV9GUkFNRVNbXSA9ICJmZWF0dXJlLW11bHRpcGxlLWZyYW1lcyI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX1NFQ1VSRV9QTEFZQkFDS1tdID0gImZlYXR1cmUtc2VjdXJlLXBsYXliYWNrIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0tbXSA9ICJmZWF0dXJlLXR1bm5lbGVkLXBsYXliYWNrIjsKIAotICAgICAgICAgICAgLy8gZW5jb2RlciBmbGFncwotICAgICAgICAgICAga0ZsYWdTdXBwb3J0c0ludHJhUmVmcmVzaCA9IDEgPDwgMCwKLQotICAgICAgICB9OwotCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgbGV2ZWxzIGZvciBlYWNoIHN1cHBvcnRlZCBwcm9maWxlIGluIGEgdGFyZ2V0IGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvZmlsZUxldmVscyB0YXJnZXQgYXJyYXkgZm9yIHRoZSBwcm9maWxlIGxldmVscy4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscyhWZWN0b3I8UHJvZmlsZUxldmVsPiAqcHJvZmlsZUxldmVscykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnRlZCBjb2xvciBmb3JtYXRzIGluIGEgdGFyZ2V0IGFycmF5LiBPbmx5IHVzZWQgZm9yIHZpZGVvL2ltYWdlCisgICAgICAgICAqIGNvbXBvbmVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xvckZvcm1hdHMgdGFyZ2V0IGFycmF5IGZvciB0aGUgY29sb3IgZm9ybWF0cy4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKFZlY3Rvcjx1aW50MzJfdD4gKmNvbG9yRm9ybWF0cykgY29uc3Q7Ci0gICAgICAgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZWMgY2FwYWJpbGl0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBjb250YWluczoKKyAgICAgICAgICogLSBmZWF0dXJlcywKKyAgICAgICAgICogLSBwZXJmb3JtYW5jZSBkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPOiBleHBvc2UgdGhpcyBhcyBzZXBhcmF0ZSBBUEktcyBhbmQgd3JhcCBoZXJlLgorICAgICAgICAgKi8KICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IGdldERldGFpbHMoKSBjb25zdDsKIAogICAgIHByb3RlY3RlZDoKQEAgLTczLDcgKzEwMSw2IEBACiAgICAgICAgIFNvcnRlZFZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzU29ydGVkOwogICAgICAgICBWZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHM7CiAgICAgICAgIFNvcnRlZFZlY3Rvcjx1aW50MzJfdD4gbUNvbG9yRm9ybWF0c1NvcnRlZDsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwogICAgICAgICBzcDxBTWVzc2FnZT4gbURldGFpbHM7CiAKICAgICAgICAgQ2FwYWJpbGl0aWVzKCk7CkBAIC05Myw4ICsxMjAsNyBAQAogICAgIC8qKgogICAgICAqIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgbW9kaWZ5aW5nIGluZm9ybWF0aW9uIGluc2lkZSBhIGBDYXBhYmlsaXRpZXNgCiAgICAgICogb2JqZWN0LiBBbiBvYmplY3Qgb2YgdHlwZSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZwotICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWltZSgpYCBvcgotICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6dXBkYXRlTWltZSgpYC4KKyAgICAgKiBgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1lZGlhVHlwZSgpYC4KICAgICAgKi8KICAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyIHsKICAgICAgICAgLyoqCkBAIC0xMjIsNiArMTQ4LDEzIEBACiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGFkZERldGFpbChjb25zdCBjaGFyKiBrZXksIGludDMyX3QgdmFsdWUpOwogICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGxpc3Qgb2YgZGV0YWlscy4gSWYgdGhlIGtleSBpcyBub3QKKyAgICAgICAgICogcHJlc2VudCwgdGhpcyBjYWxsIGRvZXMgbm90aGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZW1vdmVEZXRhaWwoY29uc3QgY2hhcioga2V5KTsKKyAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZCBhIHByb2ZpbGUtbGV2ZWwgcGFpci4gSWYgdGhpcyBwcm9maWxlLWxldmVsIHBhaXIgYWxyZWFkeSBleGlzdHMsCiAgICAgICAgICAqIGl0IHdpbGwgYmUgaWdub3JlZC4KICAgICAgICAgICoKQEAgLTEzNiwxMyArMTY5LDcgQEAKICAgICAgICAgICogQHBhcmFtIGZvcm1hdCBUaGUgY29sb3IgZm9ybWF0LgogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBhZGRDb2xvckZvcm1hdCh1aW50MzJfdCBmb3JtYXQpOwotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIGZsYWdzLiBUaGUgdW5kZXJseWluZyBvcGVyYXRpb24gaXMgYml0d2lzZS1vci4gSW4gb3RoZXIgd29yZHMsCi0gICAgICAgICAqIGJpdHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzZXQgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZmxhZ3MgVGhlIGFkZGl0aW9uYWwgZmxhZ3MuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIGFkZEZsYWdzKHVpbnQzMl90IGZsYWdzKTsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgYXNzb2NpYXRlZCBgQ2FwYWJpbGl0aWVzYCBvYmplY3QuCkBAIC0xNTgsMTkgKzE4NSw0MiBAQAogICAgICAgICBmcmllbmQgTWVkaWFDb2RlY0luZm9Xcml0ZXI7CiAgICAgfTsKIAotICAgIGJvb2wgaXNFbmNvZGVyKCkgY29uc3Q7Ci0gICAgdm9pZCBnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdDsKLSAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKyAgICBpbmxpbmUgYm9vbCBpc0VuY29kZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKCkgJiBrRmxhZ0lzRW5jb2RlcjsKKyAgICB9CisKKyAgICBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSBjb25zdDsKKyAgICB2b2lkIGdldFN1cHBvcnRlZE1lZGlhVHlwZXMoVmVjdG9yPEFTdHJpbmc+ICptZWRpYVR5cGVzKSBjb25zdDsKKyAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptZWRpYVR5cGUpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldENvZGVjTmFtZSgpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZlY3RvciBjb250YWluaW5nIGFsdGVybmF0ZSBuYW1lcyBmb3IgdGhlIGNvZGVjLgorICAgICAqCisgICAgICogXHBhcmFtIGFsaWFzZXMgdGhlIGRlc3RpbmF0aW9uIGFycmF5IGZvciB0aGUgYWxpYXNlcy4gVGhpcyBpcyBjbGVhcmVkLgorICAgICAqCisgICAgICogTXVsdGlwbGUgY29kZWNzIG1heSBzaGFyZSBhbHRlcm5hdGUgbmFtZXMgYXMgbG9uZyBhcyB0aGVpciBzdXBwb3J0ZWQgbWVkaWEgdHlwZXMgYXJlCisgICAgICogZGlzdGluY3Q7IGhvd2V2ZXIsIHRoZXNlIHdpbGwgcmVzdWx0IGluIGRpZmZlcmVudCBhbGlhc2VzIGZvciB0aGUgTWVkaWFDb2RlYyB1c2VyIGFzCisgICAgICogdGhlIGNhbm9uaWNhbCBjb2RlYyBoYXMgdG8gYmUgcmVzb2x2ZWQgd2l0aG91dCBrbm93aW5nIHRoZSBtZWRpYSB0eXBlIGluCisgICAgICogTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lLgorICAgICAqLworICAgIHZvaWQgZ2V0QWxpYXNlcyhWZWN0b3I8QVN0cmluZz4gKmFsaWFzZXMpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoYXQgaG9zdHMgdGhlIGNvZGVjLiBUaGlzIHZhbHVlIGlzIG5vdAogICAgICAqIHZpc2libGUgYXQgdGhlIEphdmEgbGV2ZWwuCiAgICAgICoKICAgICAgKiBDdXJyZW50bHksIHRoaXMgaXMgdGhlICJpbnN0YW5jZSBuYW1lIiBvZiB0aGUgSU9teCBzZXJ2aWNlLgogICAgICAqLwogICAgIGNvbnN0IGNoYXIgKmdldE93bmVyTmFtZSgpIGNvbnN0OwotICAgIHVpbnQzMl90IHJhbmsoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJhbmsgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRlY2huaWNhbGx5IHRoaXMgaXMgZGVmaW5lZCB0byBiZSBwZXIgbWVkaWEgdHlwZSwgYnV0IHRoYXQgbWFrZXMgb3JkZXJpbmcgdGhlIE1lZGlhQ29kZWNMaXN0CisgICAgICogaW1wb3NzaWJsZSBhcyBNZWRpYUNvZGVjTGlzdCBpcyBvcmRlcmVkIGJ5IGNvZGVjIG5hbWUuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0UmFuaygpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogU2VyaWFsaXphdGlvbiBvdmVyIEJpbmRlcgpAQCAtMTgxLDExICsyMzEsMTIgQEAKIHByaXZhdGU6CiAgICAgQVN0cmluZyBtTmFtZTsKICAgICBBU3RyaW5nIG1Pd25lcjsKLSAgICBib29sIG1Jc0VuY29kZXI7CisgICAgQXR0cmlidXRlcyBtQXR0cmlidXRlczsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzcDxDYXBhYmlsaXRpZXM+ID4gbUNhcHM7CisgICAgVmVjdG9yPEFTdHJpbmc+IG1BbGlhc2VzOwogICAgIHVpbnQzMl90IG1SYW5rOwogCi0gICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CisgICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWVkaWFUeXBlKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhbiBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4gQWZ0ZXIgdGhlIGNvbnN0cnVjdGlvbiwgaXRzCkBAIC0yMTksNiArMjcwLDEzIEBACiAgICAgICovCiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwogICAgIC8qKgorICAgICAqIEFkZHMgYW4gYWxpYXMgKGFsdGVybmF0ZSBuYW1lKSBmb3IgdGhlIGNvZGVjLiBNdWx0aXBsZSBjb2RlY3MgY2FuIHNoYXJlIGFuIGFsdGVybmF0ZSBuYW1lCisgICAgICogYXMgbG9uZyBhcyB0aGVpciBzdXBwb3J0ZWQgbWVkaWEgdHlwZXMgYXJlIGRpc3RpbmN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYW4gYWx0ZXJuYXRlIG5hbWUuCisgICAgICovCisgICAgdm9pZCBhZGRBbGlhcyhjb25zdCBjaGFyKiBuYW1lKTsKKyAgICAvKioKICAgICAgKiBTZXQgdGhlIG93bmVyIG5hbWUgb2YgdGhlIGNvZGVjLgogICAgICAqCiAgICAgICogVGhpcyAib3duZXIgbmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGBJT214YCBpbnN0YW5jZSB0aGF0IHN1cHBvcnRzIHRoaXMKQEAgLTIyOCwzMiArMjg2LDMyIEBACiAgICAgICovCiAgICAgdm9pZCBzZXRPd25lcihjb25zdCBjaGFyKiBvd25lcik7CiAgICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2Rlci4KKyAgICAgKiBTZXRzIGNvZGVjIGF0dHJpYnV0ZXMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gaXNFbmNvZGVyIFdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2Rlci4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBDb2RlYyBhdHRyaWJ1dGVzLgogICAgICAqLwotICAgIHZvaWQgc2V0RW5jb2Rlcihib29sIGlzRW5jb2RlciA9IHRydWUpOworICAgIHZvaWQgc2V0QXR0cmlidXRlcyh0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcz46OnR5cGUgYXR0cmlidXRlcyk7CiAgICAgLyoqCi0gICAgICogQWRkIGEgbWltZSB0byBhbiBpbmRleGVkIGxpc3QgYW5kIHJldHVybiBhIGBDYXBhYmlsaXRpZXNXcml0ZXJgIG9iamVjdAorICAgICAqIEFkZCBhIG1lZGlhIHR5cGUgdG8gYW4gaW5kZXhlZCBsaXN0IGFuZCByZXR1cm4gYSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBvYmplY3QKICAgICAgKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RpZnlpbmcgdGhlIGFzc29jaWF0ZWQgYENhcGFiaWxpdGllc2AuCiAgICAgICoKLSAgICAgKiBJZiB0aGUgbWltZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUKLSAgICAgKiBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbWUuCisgICAgICogSWYgdGhlIG1lZGlhIHR5cGUgYWxyZWFkeSBleGlzdHMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlCisgICAgICogYENhcGFiaWxpdGllc1dyaXRlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSB0eXBlLgogICAgICAqCi0gICAgICogQHBhcmFtW2luXSBtaW1lIFRoZSBuYW1lIG9mIGEgbmV3IG1pbWUgdG8gYWRkLgorICAgICAqIEBwYXJhbVtpbl0gbWVkaWFUeXBlIFRoZSBuYW1lIG9mIGEgbmV3IG1lZGlhIHR5cGUgdG8gYWRkLgogICAgICAqIEByZXR1cm4gd3JpdGVyIFRoZSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBvYmplY3QgZm9yIG1vZGlmeWluZyB0aGUKLSAgICAgKiBgQ2FwYWJpbGl0aWVzYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbWUuIGB3cml0ZXJgIHdpbGwgYmUgdmFsaWQKLSAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYG1pbWVgIGFscmVhZHkgZXhpc3RzIG9yIG5vdC4KKyAgICAgKiBgQ2FwYWJpbGl0aWVzYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIHR5cGUuIGB3cml0ZXJgIHdpbGwgYmUgdmFsaWQKKyAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYG1lZGlhVHlwZWAgYWxyZWFkeSBleGlzdHMgb3Igbm90LgogICAgICAqLwotICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBhZGRNaW1lKAotICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGFkZE1lZGlhVHlwZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lZGlhVHlwZSk7CiAgICAgLyoqCi0gICAgICogUmVtb3ZlIGEgbWltZS4KKyAgICAgKiBSZW1vdmUgYSBtZWRpYSB0eXBlLgogICAgICAqCi0gICAgICogQHBhcmFtIG1pbWUgVGhlIG5hbWUgb2YgdGhlIG1pbWUgdG8gcmVtb3ZlLgotICAgICAqIEByZXR1cm4gYHRydWVgIGlmIGBtaW1lYCBpcyByZW1vdmVkOyBgZmFsc2VgIGlmIGBtaW1lYCBpcyBub3QgZm91bmQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBUaGUgbmFtZSBvZiB0aGUgbWVkaWEgdHlwZSB0byByZW1vdmUuCisgICAgICogQHJldHVybiBgdHJ1ZWAgaWYgYG1lZGlhVHlwZWAgaXMgcmVtb3ZlZDsgYGZhbHNlYCBpZiBgbWVkaWFUeXBlYCBpcyBub3QgZm91bmQuCiAgICAgICovCi0gICAgYm9vbCByZW1vdmVNaW1lKGNvbnN0IGNoYXIqIG1pbWUpOworICAgIGJvb2wgcmVtb3ZlTWVkaWFUeXBlKGNvbnN0IGNoYXIqIG1lZGlhVHlwZSk7CiAgICAgLyoqCiAgICAgICogU2V0IHJhbmsgb2YgdGhlIGNvZGVjLiBNZWRpYUNvZGVjTGlzdCB3aWxsIHN0YWJsZS1zb3J0IHRoZSBsaXN0IGFjY29yZGluZwogICAgICAqIHRvIHJhbmsgaW4gbm9uLWRlc2NlbmRpbmcgb3JkZXIuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCmluZGV4IDBmZWI0ZjMuLjNlOGU3YzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCkBAIC0zNCw3ICszNCwxMSBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZXzEwODBQID0gNiwKICAgICBDQU1DT1JERVJfUVVBTElUWV9RVkdBID0gNywKICAgICBDQU1DT1JERVJfUVVBTElUWV8yMTYwUCA9IDgsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfTElTVF9FTkQgPSA4LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1ZHQSA9IDksCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfNEtEQ0kgPSAxMCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9RSEQgPSAxMSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV8yayA9IDEyLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0xJU1RfRU5EID0gMTIsCiAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfU1RBUlQgPSAxMDAwLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICA9IDEwMDAsCkBAIC00Niw3ICs1MCwxMSBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAgPSAxMDA2LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUVZHQSA9IDEwMDcsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8yMTYwUCA9IDEwMDgsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX0VORCA9IDEwMDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9WR0EgPSAxMDA5LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNEtEQ0kgPSAxMDEwLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUhEID0gMTAxMSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzJrID0gMTAxMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAxMiwKIAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9TVEFSVCA9IDIwMDAsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MT1cgID0gMjAwMCwKQEAgLTU1LDcgKzYzLDEwIEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF83MjBQID0gMjAwMywKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQID0gMjAwNCwKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQID0gMjAwNSwKLSAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfRU5EID0gMjAwNSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0NJRiA9IDIwMDYsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9WR0EgPSAyMDA3LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNEtEQ0kgPSAyMDA4LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9FTkQgPSAyMDA4LAogfTsKIAogZW51bSB2aWRlb19kZWNvZGVyIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCA1MzQwZGRlLi44ODI4MmFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC03Miw2ICs3Miw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0ID0gMDsKIAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKaW5kZXggYjVlNTY1ZS4uYjE5ZDQ5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKQEAgLTIzLDExICsyMywxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBDRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2VVbndyYXBwZXI7CisKIGNsYXNzIE1pZGlJb1dyYXBwZXIgewogcHVibGljOgogICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoY29uc3QgY2hhciAqcGF0aCk7CiAgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQ2NF90IHNpemUpOwotICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSk7CiAKICAgICB+TWlkaUlvV3JhcHBlcigpOwogCkBAIC00MCw3ICs0Myw3IEBACiAgICAgaW50IG1GZDsKICAgICBvZmY2NF90IG1CYXNlOwogICAgIGludDY0X3QgIG1MZW5ndGg7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VVbndyYXBwZXIgKm1EYXRhU291cmNlOwogICAgIEVBU19GSUxFIG1FYXNGaWxlOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaAppbmRleCBjOTdkMTcxLi44YTQxN2Y2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaApAQCAtMjc4LDYgKzI3OCwyNSBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUNvZGVjV3JhcHBlcik7CiB9OwogCitzdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisKKyAgICBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiYpOworICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKEFNZWRpYURhdGFTb3VyY2UqKTsKKworICAgIEFNZWRpYURhdGFTb3VyY2UgKmdldEFNZWRpYURhdGFTb3VyY2UoKTsKKworICAgIHZvaWQgY2xvc2UoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbUFNZWRpYURhdGFTb3VyY2U7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFEYXRhU291cmNlV3JhcHBlcik7Cit9OworCiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKIAogICAgIEFNZWRpYUV4dHJhY3RvcldyYXBwZXIoQU1lZGlhRXh0cmFjdG9yICphTWVkaWFFeHRyYWN0b3IpOwpAQCAtMjg3LDggKzMwNiw2IEBACiAKICAgICBzdGF0dXNfdCByZWxlYXNlKCk7CiAKLSAgICBzdGF0dXNfdCBkaXNjb25uZWN0KCk7Ci0KICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqbG9jYXRpb24pOwpAQCAtMzM5LDMxICszNTYsNiBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUV4dHJhY3RvcldyYXBwZXIpOwogfTsKIAotc3RydWN0IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgewotCi0gICAgc3RhdGljIHN0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCBlcnIpOwotCi0gICAgc3RhdGljIHNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSk7Ci0KLSAgICBzdGF0aWMgc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBzdGF0aWMgdm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9jbG9zZSh2b2lkICp1c2VyZGF0YSk7Ci0KLSAgICBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSk7Ci0KLSAgICBBTWVkaWFEYXRhU291cmNlICpnZXRBTWVkaWFEYXRhU291cmNlKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotCi0gICAgQU1lZGlhRGF0YVNvdXJjZSAqbUFNZWRpYURhdGFTb3VyY2U7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFEYXRhU291cmNlV3JhcHBlcik7Ci19OwotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIE5ES19XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QYXRjaEJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjcyMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QYXRjaEJ1aWxkZXIuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9QQVRDSF9CVUlMREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9QQVRDSF9CVUlMREVSX0gKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworLy8gVGhpcyBpcyBhIGhlYWRlci1vbmx5IHV0aWxpdHkuCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUGF0Y2hCdWlsZGVyIHsKKyAgcHVibGljOgorICAgIHVzaW5nIG1peF91c2VjYXNlX3QgPSBkZWNsdHlwZShhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0Ojp1c2VjYXNlKTsKKworICAgIFBhdGNoQnVpbGRlcigpID0gZGVmYXVsdDsKKworICAgIC8vIEFsbCBleGlzdGluZyBtZXRob2RzIG9wZXJhdGluZyBvbiBhdWRpbyBwYXRjaGVzIHRha2UgYSBwb2ludGVyIHRvIGNvbnN0LgorICAgIC8vIEl0J3MgT0sgdG8gY29uc3RydWN0IGEgdGVtcG9yYXJ5IFBhdGNoQnVpbGRlciB3aGlsZSBwcmVwYXJpbmcgYSBwYXJhbWV0ZXIKKyAgICAvLyB0byBzdWNoIGEgZnVuY3Rpb24gYmVjYXVzZSB0aGUgQnVpbGRlciB3aWxsIGJlIGtlcHQgYWxpdmUgdW50aWwgdGhlIGNvZGUKKyAgICAvLyBleGVjdXRpb24gcmVhY2hlcyB0aGUgZnVuY3Rpb24gY2FsbCBzdGF0ZW1lbnQgc2VtaWNvbG9uLgorICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCogcGF0Y2goKSBjb25zdCB7IHJldHVybiAmbVBhdGNoOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBTPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU2luayhUJiYgdCwgUyYmLi4uIHMpIHsKKyAgICAgICAgc2lua3MoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCBzdGQ6OmZvcndhcmQ8Uz4ocykuLi4pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIC8vIEV4cGxpY2l0IHR5cGUgb2YgdGhlIHNlY29uZCBwYXJhbWV0ZXIgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSB0aGUgc3RydWN0IGlubGluZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU2luayhUJiYgdCwgY29uc3QgbWl4X3VzZWNhc2VfdCYgdXBkYXRlKSB7CisgICAgICAgIHNpbmtzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgdXBkYXRlKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBTPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU291cmNlKFQmJiB0LCBTJiYuLi4gcykgeworICAgICAgICBzb3VyY2VzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgc3RkOjpmb3J3YXJkPFM+KHMpLi4uKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAvLyBFeHBsaWNpdCB0eXBlIG9mIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGFsbG93cyBjbGllbnRzIHRvIHByb3ZpZGUgdGhlIHN0cnVjdCBpbmxpbmUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNvdXJjZShUJiYgdCwgY29uc3QgbWl4X3VzZWNhc2VfdCYgdXBkYXRlKSB7CisgICAgICAgIHNvdXJjZXMoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCB1cGRhdGUpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RydWN0IFBvcnRDZmdzIHsKKyAgICAgICAgUG9ydENmZ3ModW5zaWduZWQgaW50ICpjb3VudFB0ciwgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpwb3J0Q2ZncykKKyAgICAgICAgICAgICAgICA6IG1Db3VudFB0cihjb3VudFB0ciksIG1Qb3J0Q2Zncyhwb3J0Q2Zncykge30KKyAgICAgICAgYXVkaW9fcG9ydF9jb25maWcmIGFkZChjb25zdCBhdWRpb19wb3J0X2NvbmZpZyYgcG9ydENmZykgeworICAgICAgICAgICAgcmV0dXJuICphZHZhbmNlKCkgPSBwb3J0Q2ZnOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnJiBhZGQoY29uc3Qgc3A8VD4mIGVudGl0eSkgeworICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcqIGFkZGVkID0gYWR2YW5jZSgpOworICAgICAgICAgICAgZW50aXR5LT50b0F1ZGlvUG9ydENvbmZpZyhhZGRlZCk7CisgICAgICAgICAgICByZXR1cm4gKmFkZGVkOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgYWRkKGNvbnN0IHNwPFQ+JiBlbnRpdHksIGNvbnN0IG1peF91c2VjYXNlX3QmIHVzZWNhc2VVcGRhdGUpIHsKKyAgICAgICAgICAgIGFkZChlbnRpdHkpLmV4dC5taXgudXNlY2FzZSA9IHVzZWNhc2VVcGRhdGU7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBhZGQoY29uc3Qgc3A8VD4mIGVudGl0eSwKKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPG1peF91c2VjYXNlX3QoY29uc3QgbWl4X3VzZWNhc2VfdCYpPiB1c2VjYXNlVXBkYXRlcikgeworICAgICAgICAgICAgbWl4X3VzZWNhc2VfdCogdXNlY2FzZSA9ICZhZGQoZW50aXR5KS5leHQubWl4LnVzZWNhc2U7CisgICAgICAgICAgICAqdXNlY2FzZSA9IHVzZWNhc2VVcGRhdGVyKCp1c2VjYXNlKTsKKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcqIGFkdmFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gJm1Qb3J0Q2Znc1soKm1Db3VudFB0cikrK107CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgaW50ICptQ291bnRQdHI7CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqbVBvcnRDZmdzOworICAgIH07CisKKyAgICBQb3J0Q2ZncyBzaW5rcygpIHsgcmV0dXJuIFBvcnRDZmdzKCZtUGF0Y2gubnVtX3NpbmtzLCBtUGF0Y2guc2lua3MpOyB9CisgICAgUG9ydENmZ3Mgc291cmNlcygpIHsgcmV0dXJuIFBvcnRDZmdzKCZtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsgfQorCisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaCA9IHt9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1BBVENIX0JVSUxERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaAppbmRleCBkNDIzOTYyLi5jMjc2MWNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaApAQCAtOTksNiArOTksMTMgQEAKICAgICAgICAgICAgIHJldHVybiBtU2hhcmVkLT5tQWNrIC0gc2VxdWVuY2UgPj0gMDsKICAgICAgICAgfQogCisgICAgICAgIC8vIHJldHVybnMgdGhlIGxhc3QgdmFsdWUgd3JpdHRlbiAob3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzaGFyZWQgYnVmZmVyIGFmdGVyIGluaXRpYWxpemF0aW9uCisgICAgICAgIC8vIGlmIG5vIHZhbHVlIHdhcyB3cml0dGVuKS4KKyAgICAgICAgVCBsYXN0KCkgY29uc3QKKyAgICAgICAgeyAgIC8vIGFzc3VtZSBubyBzZXF1ZW5jZSBjaGVjayByZXF1aXJlZCAtIHdlIGFyZSB0aGUgd3JpdGVyLgorICAgICAgICAgICAgcmV0dXJuIG1TaGFyZWQtPm1WYWx1ZTsKKyAgICAgICAgfQorCiAgICAgcHJpdmF0ZToKICAgICAgICAgaW50MzJfdCAgICAgbVNlcXVlbmNlOwogICAgICAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaAppbmRleCA4NmYwZDRjLi4zYWNmZTk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTMwLDc3ICszMSw1NSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBTYW1wbGVSYXRlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiB1aW50MzJfdCBUeXBlOwotICAgIHR5cGVkZWYgU29ydGVkVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IERldmljZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fZGV2aWNlc190IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgT3V0cHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKLXN0cnVjdCBJbnB1dERldmljZVRyYWl0cyA6IHB1YmxpYyBEZXZpY2VUcmFpdHMge307Ci1zdHJ1Y3QgT3V0cHV0RmxhZ1RyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBJbnB1dEZsYWdUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2lucHV0X2ZsYWdzX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBGb3JtYXRUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2Zvcm1hdF90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgQ2hhbm5lbFRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fY2hhbm5lbF9tYXNrX3QgVHlwZTsKLSAgICB0eXBlZGVmIFNvcnRlZFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBPdXRwdXRDaGFubmVsVHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307Ci1zdHJ1Y3QgSW5wdXRDaGFubmVsVHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307Ci1zdHJ1Y3QgQ2hhbm5lbEluZGV4VHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307Ci1zdHJ1Y3QgR2Fpbk1vZGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2dhaW5fbW9kZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgU3RyZWFtVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19zdHJlYW1fdHlwZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgQXVkaW9Nb2RlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19tb2RlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBBdWRpb0NvbnRlbnRUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2NvbnRlbnRfdHlwZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgVXNhZ2VUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX3VzYWdlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBTb3VyY2VUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX3NvdXJjZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBEZWZhdWx0VHJhaXRzCiB7CiAgICAgdHlwZWRlZiBUIFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFR5cGU+IENvbGxlY3Rpb247CisgICAgc3RhdGljIHZvaWQgYWRkKENvbGxlY3Rpb24gJmNvbGxlY3Rpb24sIFR5cGUgdmFsdWUpCisgICAgeworICAgICAgICBjb2xsZWN0aW9uLnB1c2hfYmFjayh2YWx1ZSk7CisgICAgfQogfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFZlY3RvclRyYWl0cworeworICAgIHR5cGVkZWYgVCBUeXBlOworICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247CisgICAgc3RhdGljIHZvaWQgYWRkKENvbGxlY3Rpb24gJmNvbGxlY3Rpb24sIFR5cGUgdmFsdWUpCisgICAgeworICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7CisgICAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFNvcnRlZFZlY3RvclRyYWl0cworeworICAgIHR5cGVkZWYgVCBUeXBlOworICAgIHR5cGVkZWYgU29ydGVkVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247CisgICAgc3RhdGljIHZvaWQgYWRkKENvbGxlY3Rpb24gJmNvbGxlY3Rpb24sIFR5cGUgdmFsdWUpCisgICAgeworICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7CisgICAgfQorfTsKKwordXNpbmcgU2FtcGxlUmF0ZVRyYWl0cyA9IFNvcnRlZFZlY3RvclRyYWl0czx1aW50MzJfdD47Cit1c2luZyBEZXZpY2VUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2RldmljZXNfdD47CitzdHJ1Y3QgT3V0cHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKK3N0cnVjdCBJbnB1dERldmljZVRyYWl0cyA6IHB1YmxpYyBEZXZpY2VUcmFpdHMge307Cit1c2luZyBDaGFubmVsVHJhaXRzID0gU29ydGVkVmVjdG9yVHJhaXRzPGF1ZGlvX2NoYW5uZWxfbWFza190PjsKK3N0cnVjdCBPdXRwdXRDaGFubmVsVHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307CitzdHJ1Y3QgSW5wdXRDaGFubmVsVHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307CitzdHJ1Y3QgQ2hhbm5lbEluZGV4VHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307Cit1c2luZyBJbnB1dEZsYWdUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2lucHV0X2ZsYWdzX3Q+OwordXNpbmcgT3V0cHV0RmxhZ1RyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+OwordXNpbmcgRm9ybWF0VHJhaXRzID0gVmVjdG9yVHJhaXRzPGF1ZGlvX2Zvcm1hdF90PjsKK3VzaW5nIEdhaW5Nb2RlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19nYWluX21vZGVfdD47Cit1c2luZyBTdHJlYW1UcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OwordXNpbmcgQXVkaW9Nb2RlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19tb2RlX3Q+OwordXNpbmcgQXVkaW9Db250ZW50VHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19jb250ZW50X3R5cGVfdD47Cit1c2luZyBVc2FnZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fdXNhZ2VfdD47Cit1c2luZyBTb3VyY2VUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX3NvdXJjZV90PjsKK3N0cnVjdCBBdWRpb0ZsYWdUcmFpdHMgOiBwdWJsaWMgRGVmYXVsdFRyYWl0czxhdWRpb19mbGFnc19tYXNrX3Q+IHt9OwogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgogc3RhdGljIHZvaWQgY29sbGVjdGlvbkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgdHlwZW5hbWUgVHJhaXRzOjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLApAQCAtMTEwLDcgKzg5LDcgQEAKICAgICBmb3IgKGNvbnN0IGNoYXIgKmNzdHIgPSBzdHJ0b2sobGl0ZXJhbCwgZGVsKTsgY3N0ciAhPSBOVUxMOyBjc3RyID0gc3RydG9rKE5VTEwsIGRlbCkpIHsKICAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIHZhbHVlOwogICAgICAgICBpZiAodXRpbGl0aWVzOjpjb252ZXJ0VG88c3RkOjpzdHJpbmcsIHR5cGVuYW1lIFRyYWl0czo6VHlwZSA+KGNzdHIsIHZhbHVlKSkgewotICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOworICAgICAgICAgICAgVHJhaXRzOjphZGQoY29sbGVjdGlvbiwgdmFsdWUpOwogICAgICAgICB9CiAgICAgfQogICAgIGZyZWUobGl0ZXJhbCk7CkBAIC0xODEsNyArMTYwLDcgQEAKICAgICBmb3IgKGNvbnN0IGNoYXIgKmNzdHIgPSBzdHJ0b2sobGl0ZXJhbCwgZGVsKTsgY3N0ciAhPSBOVUxMOyBjc3RyID0gc3RydG9rKE5VTEwsIGRlbCkpIHsKICAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIHZhbHVlOwogICAgICAgICBpZiAoZnJvbVN0cmluZyhjc3RyLCB2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICAgICAgICAgIFRyYWl0czo6YWRkKGNvbGxlY3Rpb24sIHZhbHVlKTsKICAgICAgICAgfQogICAgIH0KICAgICBmcmVlKGxpdGVyYWwpOwpAQCAtMjM0LDYgKzIxMyw3IEBACiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8QXVkaW9Db250ZW50VHJhaXRzPiBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPFVzYWdlVHJhaXRzPiBVc2FnZVR5cGVDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPiBTb3VyY2VUeXBlQ29udmVydGVyOwordHlwZWRlZiBUeXBlQ29udmVydGVyPEF1ZGlvRmxhZ1RyYWl0cz4gQXVkaW9GbGFnQ29udmVydGVyOwogCiB0ZW1wbGF0ZTw+IGNvbnN0IE91dHB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgT3V0cHV0RGV2aWNlQ29udmVydGVyOjptVGFibGVbXTsKIHRlbXBsYXRlPD4gY29uc3QgSW5wdXREZXZpY2VDb252ZXJ0ZXI6OlRhYmxlIElucHV0RGV2aWNlQ29udmVydGVyOjptVGFibGVbXTsKQEAgLTI0OSwxMSArMjI5LDEwIEBACiB0ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBVc2FnZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFVzYWdlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IFNvdXJjZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFNvdXJjZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW107CiAKIGJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSwgYXVkaW9fZGV2aWNlc190JiBkZXZpY2UpOwogCi1ib29sIGRldmljZVRvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlKTsKLQogU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwogCkBAIC0yNzQsNiArMjUzLDY1IEBACiBPdXRwdXRDaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcoCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZvdXRDaGFubmVscywgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CiAKKy8vIGNvdW50aW5nIGVudW1lcmF0aW9ucwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIGF1ZGlvX2NvbnRlbnRfdHlwZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19tb2RlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX3NvdXJjZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19zdHJlYW1fdHlwZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb191c2FnZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgaW50PiA9IDA+CitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IFQmIHZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICByZXR1cm4gVHlwZUNvbnZlcnRlcjxEZWZhdWx0VHJhaXRzPFQ+Pjo6dG9TdHJpbmcodmFsdWUsIHJlc3VsdCkKKyAgICAgICAgICAgID8gcmVzdWx0IDogc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZSkpOworCit9CisKKy8vIGZsYWcgZW51bWVyYXRpb25zCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fZ2Fpbl9tb2RlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX2lucHV0X2ZsYWdzX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX291dHB1dF9mbGFnc190Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgaW50PiA9IDA+CitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IFQmIHZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBUeXBlQ29udmVydGVyPERlZmF1bHRUcmFpdHM8VD4+OjptYXNrVG9TdHJpbmcodmFsdWUsIHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19kZXZpY2VzX3QmIGRldmljZXMpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIGlmICgoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKKyAgICAgICAgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGRldmljZXMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRPRE86IFJlbW92ZSB3aGVuIEZvcm1hdFRyYWl0cyB1c2VzIERlZmF1bHRUcmFpdHMuCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIHJldHVybiBUeXBlQ29udmVydGVyPFZlY3RvclRyYWl0czxhdWRpb19mb3JtYXRfdD4+Ojp0b1N0cmluZyhmb3JtYXQsIHJlc3VsdCkKKyAgICAgICAgICAgID8gcmVzdWx0IDogc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50Pihmb3JtYXQpKTsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpCit7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICByZXN1bHQgPDwgInsgQ29udGVudCB0eXBlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMuY29udGVudF90eXBlKQorICAgICAgICAgICA8PCAiIFVzYWdlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMudXNhZ2UpCisgICAgICAgICAgIDw8ICIgU291cmNlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMuc291cmNlKQorICAgICAgICAgICA8PCAiIEZsYWdzOiAiIDw8IGF0dHJpYnV0ZXMuZmxhZ3MKKyAgICAgICAgICAgPDwgIiBUYWdzOiAiIDw8IGF0dHJpYnV0ZXMudGFncworICAgICAgICAgICA8PCAiIH0iOworCisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvKkFORFJPSURfVFlQRV9DT05WRVJURVJfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCBkOGIwZmU3Li44NTgwNDM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtNjcsNyArNjcsNyBAQAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMgPSA2LAogCiAgICAgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCA9IDcsIC8vIFVzZWQgaW4gdmFsaWRhdGluZyB0aGUgb3V0cHV0IGZvcm1hdC4gIFNob3VsZCBiZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCiAKICAgICAvKiBTdHJlYW0gb3ZlciBhIHNvY2tldCwgbGltaXRlZCB0byBhIHNpbmdsZSBzdHJlYW0gKi8KICAgICBPVVRQVVRfRk9STUFUX1JUUF9BVlAgPSA3LApAQCAtODEsNiArODEsOSBAQAogICAgIC8qIEhFSUMgZGF0YSBpbiBhIEhFSUYgY29udGFpbmVyICovCiAgICAgT1VUUFVUX0ZPUk1BVF9IRUlGID0gMTAsCiAKKyAgICAvKiBPcHVzIGRhdGEgaW4gYSBPR0cgY29udGFpbmVyICovCisgICAgT1VUUFVUX0ZPUk1BVF9PR0cgPSAxMSwKKwogICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogfTsKIApAQCAtOTIsNiArOTUsNyBAQAogICAgIEFVRElPX0VOQ09ERVJfSEVfQUFDID0gNCwKICAgICBBVURJT19FTkNPREVSX0FBQ19FTEQgPSA1LAogICAgIEFVRElPX0VOQ09ERVJfVk9SQklTID0gNiwKKyAgICBBVURJT19FTkNPREVSX09QVVMgPSA3LAogCiAgICAgQVVESU9fRU5DT0RFUl9MSVNUX0VORCAvLyBtdXN0IGJlIHRoZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSB0aGUgYXVkaW8gZW5jb2RlciB0eXBlCiB9OwpAQCAtMTExLDkgKzExNSw2IEBACiAgKiBUaGUgc3RhdGUgbWFjaGluZSBvZiB0aGUgbWVkaWFfcmVjb3JkZXIuCiAgKi8KIGVudW0gbWVkaWFfcmVjb3JkZXJfc3RhdGVzIHsKLSAgICAvLyBFcnJvciBzdGF0ZS4KLSAgICBNRURJQV9SRUNPUkRFUl9FUlJPUiAgICAgICAgICAgICAgICAgPSAgICAgIDAsCi0KICAgICAvLyBSZWNvcmRlciB3YXMganVzdCBjcmVhdGVkLgogICAgIE1FRElBX1JFQ09SREVSX0lETEUgICAgICAgICAgICAgICAgICA9IDEgPDwgMCwKIApAQCAtMTI4LDYgKzEyOSw5IEBACiAKICAgICAvLyBSZWNvcmRpbmcgaXMgaW4gcHJvZ3Jlc3MuCiAgICAgTUVESUFfUkVDT1JERVJfUkVDT1JESU5HICAgICAgICAgICAgID0gMSA8PCA0LAorCisgICAgLy8gRXJyb3Igc3RhdGUuCisgICAgTUVESUFfUkVDT1JERVJfRVJST1IgICAgICAgICAgICAgICAgID0gMSA8PCA1LAogfTsKIAogLy8gVGhlICJtc2ciIGNvZGUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lciBpbiBub3RpZnkuCkBAIC0yNjAsNiArMjY0LDEwIEBACiAgICAgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqZGV2aWNlSWQpOwogICAgIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCisgICAgc3RhdHVzX3QgICAgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgZG9DbGVhblVwKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCmluZGV4IGVlYmM4YzYuLjFkYjQyNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCkBAIC01OSw3ICs1OSw3IEBACiAgKiAtIFRXID0gVHJlYmxlIFdyYXBwZXIgLS0tIEl0IHdyYXBzIGEgbGVnYWN5IG9iamVjdCBpbnNpZGUgYSBUcmVibGUgb2JqZWN0LgogICovCiAKLXN0cnVjdCBMV09teE5vZGUgOiBwdWJsaWMgSDJCQ29udmVydGVyPElPbXhOb2RlLCBJT01YTm9kZSwgQm5PTVhOb2RlPiB7CitzdHJ1Y3QgTFdPbXhOb2RlIDogcHVibGljIEgyQkNvbnZlcnRlcjxJT214Tm9kZSwgQm5PTVhOb2RlPiB7CiAgICAgTFdPbXhOb2RlKHNwPElPbXhOb2RlPiBjb25zdCYgYmFzZSkgOiBDQmFzZShiYXNlKSB7fQogICAgIHN0YXR1c190IGZyZWVOb2RlKCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3Qgc2VuZENvbW1hbmQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCmluZGV4IDkyY2ZiMWMuLjZjNTlhMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCkBAIC04NDIsNCArODQyLDI1IEBACiAgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcyk7CiB9CiAKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBBTE9HVigic2V0TWljcm9waG9uZURpcmVjdGlvbiglZCkiLCBkaXJlY3Rpb24pOworICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+c2V0TWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIEFMT0dWKCJzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oJWYpIiwgem9vbSk7CisgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7Cit9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OmdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0Cit7CisgICAgQUxPR1YoImdldFBvcnRJZCIpOworCisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPmdldFBvcnRJZChwb3J0SWQpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDMxZDFkZjkuLjFlZDFkMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAKIEJuU3RhdHVzIExXR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKAogICAgICAgICBjb25zdCBzcDxJT01YTm9kZT4mIG9teE5vZGUsIGludDMyX3QgZGF0YVNwYWNlKSB7Ci0gICAgc3A8SU9teE5vZGU+IGhPbXhOb2RlID0gb214Tm9kZS0+Z2V0SGFsSW50ZXJmYWNlKCk7CisgICAgc3A8SU9teE5vZGU+IGhPbXhOb2RlID0gb214Tm9kZS0+Z2V0SGFsSW50ZXJmYWNlPElPbXhOb2RlPigpOwogICAgIHJldHVybiB0b0JpbmRlclN0YXR1cyhtQmFzZS0+Y29uZmlndXJlKAogICAgICAgICAgICAgaE9teE5vZGUgPT0gbnVsbHB0ciA/IG5ldyBUV09teE5vZGUob214Tm9kZSkgOiBoT214Tm9kZSwKICAgICAgICAgICAgIHRvSGFyZHdhcmVEYXRhc3BhY2UoZGF0YVNwYWNlKSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2I4ZjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJtZWRpYWV4dHJhY3RvciIsCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVduby1tdWx0aWNoYXIiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV2FsbCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAiRGF0YVNvdXJjZUJhc2UuY3BwIiwKLSAgICAgICAgIk1lZGlhQnVmZmVyLmNwcCIsCi0gICAgICAgICJNZWRpYUJ1ZmZlckJhc2UuY3BwIiwKLSAgICAgICAgIk1lZGlhQnVmZmVyR3JvdXAuY3BwIiwKLSAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCi0gICAgICAgICJNZWRpYVRyYWNrLmNwcCIsCi0gICAgICAgICJNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiTWV0YURhdGEuY3BwIiwKLSAgICAgICAgIk1ldGFEYXRhQmFzZS5jcHAiLAotICAgICAgICAiVm9yYmlzQ29tbWVudC5jcHAiLAotICAgIF0sCi0KLSAgICBjbGFuZzogdHJ1ZSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgfSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5N2IzZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIHN0YXRpYyAqLwotc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBNZWRpYUJ1ZmZlcjo6bVVzZVNoYXJlZE1lbW9yeSgwKTsKLQotTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQotICAgIDogbU9ic2VydmVyKE5VTEwpLAotICAgICAgbVJlZkNvdW50KDApLAotICAgICAgbURhdGEoZGF0YSksCi0gICAgICBtU2l6ZShzaXplKSwKLSAgICAgIG1SYW5nZU9mZnNldCgwKSwKLSAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKLSAgICAgIG1Pd25zRGF0YShmYWxzZSksCi0gICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgewotfQotCi1NZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShOVUxMKSwKLSAgICAgIG1TaXplKHNpemUpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAotICAgICAgbU93bnNEYXRhKHRydWUpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKLSAgICBpZiAoc2l6ZSA8IGtTaGFyZWRNZW1UaHJlc2hvbGQKLSAgICAgICAgICAgIHx8IHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJm1Vc2VTaGFyZWRNZW1vcnksIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpID09IDApIHsKLSAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImNyZWF0aW5nIG1lbW9yeURlYWxlciIpOwotICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lbW9yeURlYWxlcihzaXplICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCAiTWVkaWFCdWZmZXIiKTsKLSAgICAgICAgbU1lbW9yeSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUoc2l6ZSArIHNpemVvZihTaGFyZWRDb250cm9sKSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSwgdHJ5aW5nIHJlZ3VsYXIgYWxsb2NhdGlvbiEiKTsKLSAgICAgICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOwotICAgICAgICAgICAgaWYgKG1EYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiT3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOwotICAgICAgICAgICAgbURhdGEgPSAodWludDhfdCAqKW1NZW1vcnktPnBvaW50ZXIoKSArIHNpemVvZihTaGFyZWRDb250cm9sKTsKLSAgICAgICAgICAgIEFMT0dWKCJBbGxvY2F0ZWQgc2hhcmVkIG1lbSBidWZmZXIgb2Ygc2l6ZSAlenUgQCAlcCIsIHNpemUsIG1EYXRhKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShidWZmZXItPmRhdGEoKSksCi0gICAgICBtU2l6ZShidWZmZXItPnNpemUoKSksCi0gICAgICBtUmFuZ2VPZmZzZXQoMCksCi0gICAgICBtUmFuZ2VMZW5ndGgobVNpemUpLAotICAgICAgbUJ1ZmZlcihidWZmZXIpLAotICAgICAgbU93bnNEYXRhKGZhbHNlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSwKLSAgICAgIG1PcmlnaW5hbChOVUxMKSB7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnJlbGVhc2UoKSB7Ci0gICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIExlZ2FjeSBjb250cmFjdCBmb3IgTWVkaWFCdWZmZXIgd2l0aG91dCBhIE1lZGlhQnVmZmVyR3JvdXAuCi0gICAgICAgIENIRUNLX0VRKG1SZWZDb3VudCwgMCk7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IHByZXZDb3VudCA9IG1SZWZDb3VudC5mZXRjaF9zdWIoMSk7Ci0gICAgaWYgKHByZXZDb3VudCA9PSAxKSB7Ci0gICAgICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtT2JzZXJ2ZXItPnNpZ25hbEJ1ZmZlclJldHVybmVkKHRoaXMpOwotICAgIH0KLSAgICBDSEVDSyhwcmV2Q291bnQgPiAwKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6Y2xhaW0oKSB7Ci0gICAgQ0hFQ0sobU9ic2VydmVyICE9IE5VTEwpOwotICAgIENIRUNLX0VRKG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpLCAxKTsKLQotICAgIG1SZWZDb3VudC5zdG9yZSgwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6YWRkX3JlZigpIHsKLSAgICAodm9pZCkgbVJlZkNvdW50LmZldGNoX2FkZCgxKTsKLX0KLQotdm9pZCAqTWVkaWFCdWZmZXI6OmRhdGEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1EYXRhOwotfQotCi1zaXplX3QgTWVkaWFCdWZmZXI6OnNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TaXplOwotfQotCi1zaXplX3QgTWVkaWFCdWZmZXI6OnJhbmdlX29mZnNldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVJhbmdlT2Zmc2V0OwotfQotCi1zaXplX3QgTWVkaWFCdWZmZXI6OnJhbmdlX2xlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVJhbmdlTGVuZ3RoOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgewotICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBtU2l6ZSkgewotICAgICAgICBBTE9HRSgib2Zmc2V0ID0gJXp1LCBsZW5ndGggPSAlenUsIG1TaXplID0gJXp1Iiwgb2Zmc2V0LCBsZW5ndGgsIG1TaXplKTsKLSAgICB9Ci0gICAgQ0hFQ0sob2Zmc2V0ICsgbGVuZ3RoIDw9IG1TaXplKTsKLQotICAgIG1SYW5nZU9mZnNldCA9IG9mZnNldDsKLSAgICBtUmFuZ2VMZW5ndGggPSBsZW5ndGg7Ci19Ci0KLU1ldGFEYXRhQmFzZSYgTWVkaWFCdWZmZXI6Om1ldGFfZGF0YSgpIHsKLSAgICByZXR1cm4gKm1NZXRhRGF0YTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6cmVzZXQoKSB7Ci0gICAgbU1ldGFEYXRhLT5jbGVhcigpOwotICAgIHNldF9yYW5nZSgwLCBtU2l6ZSk7Ci19Ci0KLU1lZGlhQnVmZmVyOjp+TWVkaWFCdWZmZXIoKSB7Ci0gICAgQ0hFQ0sobU9ic2VydmVyID09IE5VTEwpOwotCi0gICAgaWYgKG1Pd25zRGF0YSAmJiBtRGF0YSAhPSBOVUxMICYmIG1NZW1vcnkgPT0gTlVMTCkgewotICAgICAgICBmcmVlKG1EYXRhKTsKLSAgICAgICAgbURhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtT3JpZ2luYWwgIT0gTlVMTCkgewotICAgICAgICBtT3JpZ2luYWwtPnJlbGVhc2UoKTsKLSAgICAgICAgbU9yaWdpbmFsID0gTlVMTDsKLSAgICB9Ci0KLSAgIGlmIChtTWVtb3J5LmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPnNldERlYWRPYmplY3QoKTsKLSAgIH0KLSAgIGRlbGV0ZSBtTWV0YURhdGE7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKm9ic2VydmVyKSB7Ci0gICAgQ0hFQ0sob2JzZXJ2ZXIgPT0gTlVMTCB8fCBtT2JzZXJ2ZXIgPT0gTlVMTCk7Ci0gICAgbU9ic2VydmVyID0gb2JzZXJ2ZXI7Ci19Ci0KLU1lZGlhQnVmZmVyQmFzZSAqTWVkaWFCdWZmZXI6OmNsb25lKCkgewotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobURhdGEsIG1TaXplKTsKLSAgICBidWZmZXItPnNldF9yYW5nZShtUmFuZ2VPZmZzZXQsIG1SYW5nZUxlbmd0aCk7Ci0gICAgYnVmZmVyLT5tTWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCptTWV0YURhdGEpOwotCi0gICAgYWRkX3JlZigpOwotICAgIGJ1ZmZlci0+bU9yaWdpbmFsID0gdGhpczsKLQotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYThkZDQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyR3JvdXAiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0ZDo6bWluIGlzIG5vdCBjb25zdGV4cHIgaW4gQysrMTEKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jb25zdGV4cHIgVCBNSU4oY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeyByZXR1cm4gYSA8PSBiID8gYSA6IGI7IH0KLQotLy8gTWVkaWFCdWZmZXJHcm91cCBtYXkgY3JlYXRlIHNoYXJlZCBtZW1vcnkgYnVmZmVycyBhdCBhCi0vLyBzbWFsbGVyIHRocmVzaG9sZCB0aGFuIGFuIGlzb2xhdGVkIG5ldyBNZWRpYUJ1ZmZlci4KLXN0YXRpYyBjb25zdCBzaXplX3Qga1NoYXJlZE1lbW9yeVRocmVzaG9sZCA9IE1JTigKLSAgICAgICAgKHNpemVfdClNZWRpYUJ1ZmZlcjo6a1NoYXJlZE1lbVRocmVzaG9sZCwgKHNpemVfdCkoNCAqIDEwMjQpKTsKLQotc3RydWN0IE1lZGlhQnVmZmVyR3JvdXA6OkludGVybmFsRGF0YSB7Ci0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0gICAgc2l6ZV90IG1Hcm93dGhMaW1pdDsgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IGdyb3cgZ3JvdXAgbGFyZ2VyIHRoYW4gdGhpcy4KLSAgICBzdGQ6Omxpc3Q8TWVkaWFCdWZmZXJCYXNlICo+IG1CdWZmZXJzOwotfTsKLQotTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgZ3Jvd3RoTGltaXQpCi0gICAgOiBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7Ci0gICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKLX0KLQotTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpCi0gICAgOiBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7Ci0gICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKLQotICAgIGlmIChtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAgJiYgYnVmZmVycyA+IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7Ci0gICAgICAgIEFMT0dXKCJQcmVhbGxvY2F0ZWQgYnVmZmVycyAlenUgPiBncm93dGhMaW1pdCAlenUsIGluY3JlYXNpbmcgZ3Jvd3RoTGltaXQiLAotICAgICAgICAgICAgICAgIGJ1ZmZlcnMsIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KTsKLSAgICAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBidWZmZXJzOwotICAgIH0KLQotICAgIGlmIChidWZmZXJfc2l6ZSA+PSBrU2hhcmVkTWVtb3J5VGhyZXNob2xkKSB7Ci0gICAgICAgIEFMT0dEKCJjcmVhdGluZyBNZW1vcnlEZWFsZXIiKTsKLSAgICAgICAgLy8gVXNpbmcgYSBzaW5nbGUgTWVtb3J5RGVhbGVyIGlzIGVmZmljaWVudCBmb3IgYSBncm91cCBvZiBzaGFyZWQgbWVtb3J5IG9iamVjdHMuCi0gICAgICAgIC8vIFRoaXMgbG9vcCBndWFyYW50ZWVzIHRoYXQgd2UgdXNlIHNoYXJlZCBtZW1vcnkgKG5vIGZhbGxiYWNrIHRvIG1hbGxvYykuCi0KLSAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpOwotICAgICAgICBzaXplX3QgYXVnbWVudGVkX3NpemUgPSBidWZmZXJfc2l6ZSArIHNpemVvZihNZWRpYUJ1ZmZlcjo6U2hhcmVkQ29udHJvbCk7Ci0gICAgICAgIHNpemVfdCB0b3RhbCA9IChhdWdtZW50ZWRfc2l6ZSArIGFsaWdubWVudCAtIDEpIC8gYWxpZ25tZW50ICogYWxpZ25tZW50ICogYnVmZmVyczsKLSAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKHRvdGFsLCAiTWVkaWFCdWZmZXJHcm91cCIpOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKGF1Z21lbnRlZF9zaXplKTsKLSAgICAgICAgICAgIGlmIChtZW0uZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW0tPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIk9ubHkgYWxsb2NhdGVkICV6dSBzaGFyZWQgYnVmZmVycyBvZiBzaXplICV6dSIsIGksIGJ1ZmZlcl9zaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobWVtKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+Z2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOwotICAgICAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb24tc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyX3NpemUpOwotICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgZGVsZXRlIGJ1ZmZlcjsgLy8gZG9uJ3QgY2FsbCByZWxlYXNlLCBpdCdzIG5vdCBwcm9wZXJseSBmb3JtZWQKLSAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgbWFsbG9jIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBhZGRfYnVmZmVyKGJ1ZmZlcik7Ci0gICAgfQotfQotCi1NZWRpYUJ1ZmZlckdyb3VwOjp+TWVkaWFCdWZmZXJHcm91cCgpIHsKLSAgICBmb3IgKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyIDogbUludGVybmFsLT5tQnVmZmVycykgewotICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpICE9IDApIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBsb2NhbFJlZmNvdW50ID0gYnVmZmVyLT5sb2NhbFJlZmNvdW50KCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgcmVtb3RlUmVmY291bnQgPSBidWZmZXItPnJlbW90ZVJlZmNvdW50KCk7Ci0KLSAgICAgICAgICAgIC8vIEZhdGFsIGlmIHdlIGhhdmUgYSBsb2NhbCByZWZjb3VudC4KLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobG9jYWxSZWZjb3VudCAhPSAwLAotICAgICAgICAgICAgICAgICAgICAiYnVmZmVyKCVwKSBsb2NhbFJlZmNvdW50ICVkICE9IDAsIHJlbW90ZVJlZmNvdW50ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsb2NhbFJlZmNvdW50LCByZW1vdGVSZWZjb3VudCk7Ci0KLSAgICAgICAgICAgIC8vIExvZyBhbiBlcnJvciBpZiB3ZSBoYXZlIGEgcmVtYWluaW5nIHJlbW90ZSByZWZjb3VudCwKLSAgICAgICAgICAgIC8vIGFzIHRoZSByZW1vdGUgcHJvY2VzcyBtYXkgaGF2ZSBkaWVkIG9yIG1heSBoYXZlIGluYXBwcm9wcmlhdGUgYmVoYXZpb3IuCi0gICAgICAgICAgICAvLyBUaGUgc2hhcmVkIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIE1lZGlhQnVmZmVyIHdpbGwKLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgYmUgcmVjbGFpbWVkIHdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBmZHMKLSAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgICAgICAgICAgIEFMT0dFKCJidWZmZXIoJXApIGhhcyByZXNpZHVhbCByZW1vdGVSZWZjb3VudCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgcmVtb3RlUmVmY291bnQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGdyYWNlZnVsbHkgZGVsZXRlLgotICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKG51bGxwdHIpOwotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgZGVsZXRlIG1JbnRlcm5hbDsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjphZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOwotCi0gICAgLy8gaWYgd2UncmUgYWJvdmUgb3VyIGdyb3d0aCBsaW1pdCwgcmVsZWFzZSBidWZmZXJzIGlmIHdlIGNhbgotICAgIGZvciAoYXV0byBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuYmVnaW4oKTsKLSAgICAgICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID4gMAotICAgICAgICAgICAgJiYgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPj0gbUludGVybmFsLT5tR3Jvd3RoTGltaXQKLSAgICAgICAgICAgICYmIGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7KSB7Ci0gICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAoKml0KS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7Ci0gICAgICAgICAgICAoKml0KS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVyYXNlKGl0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICsraXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOwotICAgIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7Ci19Ci0KLWJvb2wgTWVkaWFCdWZmZXJHcm91cDo6aGFzX2J1ZmZlcnMoKSB7Ci0gICAgaWYgKG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpIDwgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGNhbiBhZGQgbW9yZSBidWZmZXJzIGludGVybmFsbHkuCi0gICAgfQotICAgIGZvciAoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgOiBtSW50ZXJuYWwtPm1CdWZmZXJzKSB7Ci0gICAgICAgIGlmIChidWZmZXItPnJlZmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0dXNfdCBNZWRpYUJ1ZmZlckdyb3VwOjphY3F1aXJlX2J1ZmZlcigKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBib29sIG5vbkJsb2NraW5nLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHNpemVfdCBzbWFsbGVzdCA9IHJlcXVlc3RlZFNpemU7Ci0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gbnVsbHB0cjsKLSAgICAgICAgYXV0byBmcmVlID0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gKCppdCktPnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSByZXF1ZXN0ZWRTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9ICppdDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzaXplIDwgc21hbGxlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgc21hbGxlc3QgPSBzaXplOyAvLyBhbHdheXMgZnJlZSB0aGUgc21hbGxlc3QgYnVmCi0gICAgICAgICAgICAgICAgICAgIGZyZWUgPSBpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyCi0gICAgICAgICAgICAgICAgJiYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKQotICAgICAgICAgICAgICAgICAgICB8fCBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSkgewotICAgICAgICAgICAgLy8gV2UgYWxsb2MgYmVmb3JlIHdlIGZyZWUgc28gZmFpbHVyZSBsZWF2ZXMgZ3JvdXAgdW5jaGFuZ2VkLgotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlU2l6ZSA9IHJlcXVlc3RlZFNpemUgPCBTSVpFX01BWCAvIDMgKiAyIC8qIE5COiBvcmRlcmluZyAqLyA/Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgKiAzIC8gMiA6IHJlcXVlc3RlZFNpemU7Ci0gICAgICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYWxsb2NhdGVTaXplKTsKLSAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3Igc2l6ZSAlenUiLCBhbGxvY2F0ZVNpemUpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIEludmFsaWQgYWxsb2MsIHByZWZlciBub3QgdG8gY2FsbCByZWxlYXNlLgotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVhbGxvY2F0ZSBidWZmZXIsIHJlcXVlc3RlZCBzaXplICV6dSB2cyBhdmFpbGFibGUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplLCAoKmZyZWUpLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAoKmZyZWUpLT5zZXRPYnNlcnZlcihudWxscHRyKTsKLSAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAqZnJlZSA9IGJ1ZmZlcjsgLy8gaW4tcGxhY2UgcmVwbGFjZQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZSBidWZmZXIsIHJlcXVlc3RlZCBzaXplICV6dSIsIHJlcXVlc3RlZFNpemUpOwotICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWwtPm1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+YWRkX3JlZigpOwotICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOwotICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9uQmxvY2tpbmcpIHsKLSAgICAgICAgICAgICpvdXQgPSBudWxscHRyOwotICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFsbCBidWZmZXJzIGFyZSBpbiB1c2UsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGVtIGlzIHJldHVybmVkLgotICAgICAgICBtSW50ZXJuYWwtPm1Db25kaXRpb24ud2FpdChtSW50ZXJuYWwtPm1Mb2NrKTsKLSAgICB9Ci0gICAgLy8gTmV2ZXIgZ2V0cyBoZXJlLgotfQotCi1zaXplX3QgTWVkaWFCdWZmZXJHcm91cDo6YnVmZmVycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUludGVybmFsLT5tQnVmZmVycy5zaXplKCk7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXJHcm91cDo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICopIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7Ci0gICAgbUludGVybmFsLT5tQ29uZGl0aW9uLnNpZ25hbCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmIzZGM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHB3ZC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFFeHRyYWN0b3I6Ok1lZGlhRXh0cmFjdG9yKCkgewotICAgIGlmICghTE9HX05ERUJVRykgewotICAgICAgICB1aWRfdCB1aWQgPSBnZXR1aWQoKTsKLSAgICAgICAgc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZCh1aWQpOwotICAgICAgICBBTE9HVigiZXh0cmFjdG9yIGNyZWF0ZWQgaW4gdWlkOiAlZCAoJXMpIiwgZ2V0dWlkKCksIHB3LT5wd19uYW1lKTsKLSAgICB9Ci19Ci0KLU1lZGlhRXh0cmFjdG9yOjp+TWVkaWFFeHRyYWN0b3IoKSB7fQotCi11aW50MzJfdCBNZWRpYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9QQVVTRSB8IENBTl9TRUVLOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFUcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2M2Y1OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU1lZGlhVHJhY2s6Ok1lZGlhVHJhY2soKSB7fQotCi1NZWRpYVRyYWNrOjp+TWVkaWFUcmFjaygpIHt9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpSZWFkT3B0aW9ucygpIHsKLSAgICByZXNldCgpOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpyZXNldCgpIHsKLSAgICBtT3B0aW9ucyA9IDA7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpzZXROb25CbG9ja2luZygpIHsKLSAgICBtTm9uQmxvY2tpbmcgPSB0cnVlOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpjbGVhck5vbkJsb2NraW5nKCkgewotICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOwotfQotCi1ib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXROb25CbG9ja2luZygpIGNvbnN0IHsKLSAgICByZXR1cm4gbU5vbkJsb2NraW5nOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlKSB7Ci0gICAgbU9wdGlvbnMgfD0ga1NlZWtUb19PcHRpb247Ci0gICAgbVNlZWtUaW1lVXMgPSB0aW1lX3VzOwotICAgIG1TZWVrTW9kZSA9IG1vZGU7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyU2Vla1RvKCkgewotICAgIG1PcHRpb25zICY9IH5rU2Vla1RvX09wdGlvbjsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgbVNlZWtNb2RlID0gU0VFS19DTE9TRVNUX1NZTkM7Ci19Ci0KLWJvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldFNlZWtUbygKLSAgICAgICAgaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0IHsKLSAgICAqdGltZV91cyA9IG1TZWVrVGltZVVzOwotICAgICptb2RlID0gbVNlZWtNb2RlOwotICAgIHJldHVybiAobU9wdGlvbnMgJiBrU2Vla1RvX09wdGlvbikgIT0gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL1ZvcmJpc0NvbW1lbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmFmNTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVm9yYmlzQ29tbWVudCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIm1lZGlhL1ZvcmJpc0NvbW1lbnQuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgdm9pZCBleHRyYWN0QWxidW1BcnQoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoImV4dHJhY3RBbGJ1bUFydCBmcm9tICclcyciLCAoY29uc3QgY2hhciAqKWRhdGEpOwotCi0gICAgc3A8QUJ1ZmZlcj4gZmxhY0J1ZmZlciA9IGRlY29kZUJhc2U2NChBU3RyaW5nKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSkpOwotICAgIGlmIChmbGFjQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBkYXRhLiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2l6ZV90IGZsYWNTaXplID0gZmxhY0J1ZmZlci0+c2l6ZSgpOwotICAgIHVpbnQ4X3QgKmZsYWMgPSBmbGFjQnVmZmVyLT5kYXRhKCk7Ci0gICAgQUxPR1YoImdvdCBmbGFjIG9mIHNpemUgJXp1IiwgZmxhY1NpemUpOwotCi0gICAgdWludDMyX3QgcGljVHlwZTsKLSAgICB1aW50MzJfdCB0eXBlTGVuOwotICAgIHVpbnQzMl90IGRlc2NMZW47Ci0gICAgdWludDMyX3QgZGF0YUxlbjsKLSAgICBjaGFyIHR5cGVbMTI4XTsKLQotICAgIGlmIChmbGFjU2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHBpY1R5cGUgPSBVMzJfQVQoZmxhYyk7Ci0KLSAgICBpZiAocGljVHlwZSAhPSAzKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgZnJvbnQgY292ZXIuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0eXBlTGVuID0gVTMyX0FUKCZmbGFjWzRdKTsKLSAgICBpZiAodHlwZUxlbiA+IHNpemVvZih0eXBlKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IGZsYWNTaXplID49IDgKLSAgICBpZiAoZmxhY1NpemUgLSA4IDwgdHlwZUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWVtY3B5KHR5cGUsICZmbGFjWzhdLCB0eXBlTGVuKTsKLSAgICB0eXBlW3R5cGVMZW5dID0gJ1wwJzsKLQotICAgIEFMT0dWKCJwaWNUeXBlID0gJWQsIHR5cGUgPSAnJXMnIiwgcGljVHlwZSwgdHlwZSk7Ci0KLSAgICBpZiAoIXN0cmNtcCh0eXBlLCAiLS0+IikpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBub3QgaW5saW5lIGNvdmVyIGFydCwgYnV0IGFuIGV4dGVybmFsIHVybCBpbnN0ZWFkLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGZsYWNTaXplIDwgMzIgfHwgZmxhY1NpemUgLSAzMiA8IHR5cGVMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRlc2NMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW5dKTsKLSAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gPCBkZXNjTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkYXRhTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAxNl0pOwotCi0gICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbikgPj0gMAotICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gPCBkYXRhTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ290IGltYWdlIGRhdGEsICV6dSB0cmFpbGluZyBieXRlcyIsCi0gICAgICAgICBmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gLSBkYXRhTGVuKTsKLQotICAgIGZpbGVNZXRhLT5zZXREYXRhKAotICAgICAgICAgICAga0tleUFsYnVtQXJ0LCAwLCAmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMjBdLCBkYXRhTGVuKTsKLQotICAgIGZpbGVNZXRhLT5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIHR5cGUpOwotfQotCi12b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpCi17Ci0gICAgc3RydWN0IHsKLSAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbVRhZzsKLSAgICAgICAgdWludDMyX3QgbUtleTsKLSAgICB9IGtNYXBbXSA9IHsKLSAgICAgICAgeyAiVElUTEUiLCBrS2V5VGl0bGUgfSwKLSAgICAgICAgeyAiQVJUSVNUIiwga0tleUFydGlzdCB9LAotICAgICAgICB7ICJBTEJVTUFSVElTVCIsIGtLZXlBbGJ1bUFydGlzdCB9LAotICAgICAgICB7ICJBTEJVTSBBUlRJU1QiLCBrS2V5QWxidW1BcnRpc3QgfSwKLSAgICAgICAgeyAiQ09NUElMQVRJT04iLCBrS2V5Q29tcGlsYXRpb24gfSwKLSAgICAgICAgeyAiQUxCVU0iLCBrS2V5QWxidW0gfSwKLSAgICAgICAgeyAiQ09NUE9TRVIiLCBrS2V5Q29tcG9zZXIgfSwKLSAgICAgICAgeyAiR0VOUkUiLCBrS2V5R2VucmUgfSwKLSAgICAgICAgeyAiQVVUSE9SIiwga0tleUF1dGhvciB9LAotICAgICAgICB7ICJUUkFDS05VTUJFUiIsIGtLZXlDRFRyYWNrTnVtYmVyIH0sCi0gICAgICAgIHsgIkRJU0NOVU1CRVIiLCBrS2V5RGlzY051bWJlciB9LAotICAgICAgICB7ICJEQVRFIiwga0tleURhdGUgfSwKLSAgICAgICAgeyAiWUVBUiIsIGtLZXlZZWFyIH0sCi0gICAgICAgIHsgIkxZUklDSVNUIiwga0tleVdyaXRlciB9LAotICAgICAgICB7ICJNRVRBREFUQV9CTE9DS19QSUNUVVJFIiwga0tleUFsYnVtQXJ0IH0sCi0gICAgICAgIHsgIkFORFJPSURfTE9PUCIsIGtLZXlBdXRvTG9vcCB9LAotICAgIH07Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7ICsraikgewotICAgICAgICAgICAgc2l6ZV90IHRhZ0xlbiA9IHN0cmxlbihrTWFwW2pdLm1UYWcpOwotICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChrTWFwW2pdLm1UYWcsIGNvbW1lbnQsIHRhZ0xlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgY29tbWVudFt0YWdMZW5dID09ICc9JykgewotICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm1LZXkgPT0ga0tleUFsYnVtQXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWVudFt0YWdMZW4gKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50TGVuZ3RoIC0gdGFnTGVuIC0gMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0ga0tleUF1dG9Mb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgmY29tbWVudFt0YWdMZW4gKyAxXSwgInRydWUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlBdXRvTG9vcCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YS0+c2V0Q1N0cmluZyhrTWFwW2pdLm1LZXksICZjb21tZW50W3RhZ0xlbiArIDFdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1OWYzOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERBVEFfU09VUkNFX0hfCi0KLSNkZWZpbmUgREFUQV9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UsIHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewotcHVibGljOgotICAgIERhdGFTb3VyY2UoKSB7fQotCi0gICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KLSAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiPHVuc3BlY2lmaWVkPiIpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCAvKm9mZnNldCovKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBmb3IgRFJNCi0gICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSBmaW5hbCB7Ci0gICAgICAgIGludCByZXQgPSBzbnByaW50Zih1cmlTdHJpbmcsIGJ1ZmZlclNpemUsICIlcyIsIGdldFVyaSgpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gcmV0ID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYnVmZmVyU2l6ZTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EYXRhU291cmNlKCkge30KLQotcHJpdmF0ZToKLSAgICBEYXRhU291cmNlKGNvbnN0IERhdGFTb3VyY2UgJik7Ci0gICAgRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIERBVEFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOTkzZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgREFUQV9TT1VSQ0VfQkFTRV9IXwotCi0jZGVmaW5lIERBVEFfU09VUkNFX0JBU0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIERhdGFTb3VyY2VCYXNlIHsKLXB1YmxpYzoKLSAgICBlbnVtIEZsYWdzIHsKLSAgICAgICAga1dhbnRzUHJlZmV0Y2hpbmcgICAgICA9IDEsCi0gICAgICAgIGtTdHJlYW1lZEZyb21Mb2NhbEhvc3QgPSAyLAotICAgICAgICBrSXNDYWNoaW5nRGF0YVNvdXJjZSAgID0gNCwKLSAgICAgICAga0lzSFRUUEJhc2VkU291cmNlICAgICA9IDgsCi0gICAgICAgIGtJc0xvY2FsRmlsZVNvdXJjZSAgICAgPSAxNiwKLSAgICB9OwotCi0gICAgRGF0YVNvdXJjZUJhc2UoKSB7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKLSAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgotICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgotICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCk7Ci0gICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50Ci0gICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKLSAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOwotCi0gICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgotICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOwotCi0gICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EYXRhU291cmNlQmFzZSgpIHt9Ci0KLXByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UoY29uc3QgRGF0YVNvdXJjZUJhc2UgJik7Ci0gICAgRGF0YVNvdXJjZUJhc2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmE5OGRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBNRURJQV9FWFRSQUNUT1JfSF8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERhdGFTb3VyY2VCYXNlOwotY2xhc3MgTWV0YURhdGFCYXNlOwotc3RydWN0IE1lZGlhVHJhY2s7Ci0KLQotY2xhc3MgRXh0cmFjdG9yQWxsb2NUcmFja2VyIHsKLXB1YmxpYzoKLSAgICBFeHRyYWN0b3JBbGxvY1RyYWNrZXIoKSB7Ci0gICAgICAgIEFMT0dEKCJleHRyYWN0b3IgYWxsb2NhdGVkOiAlcCIsIHRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5FeHRyYWN0b3JBbGxvY1RyYWNrZXIoKSB7Ci0gICAgICAgIEFMT0dEKCJleHRyYWN0b3IgZnJlZWQ6ICVwIiwgdGhpcyk7Ci0gICAgfQotfTsKLQotCi1jbGFzcyBNZWRpYUV4dHJhY3RvcgotLy8gOiBwdWJsaWMgRXh0cmFjdG9yQWxsb2NUcmFja2VyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOwotCi0gICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgewotICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQotICAgIH07Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAotICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAotICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKLQotICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSA9IDA7Ci0KLSAgICBlbnVtIEZsYWdzIHsKLSAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCi0gICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgotICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAotICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKLSAgICB9OwotCi0gICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcwotICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQotCi0gICAgdHlwZWRlZiBNZWRpYUV4dHJhY3RvciogKCpDcmVhdG9yRnVuYykoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCB2b2lkICptZXRhKTsKLSAgICB0eXBlZGVmIHZvaWQgKCpGcmVlTWV0YUZ1bmMpKHZvaWQgKm1ldGEpOwotCi0gICAgLy8gVGhlIHNuaWZmZXIgY2FuIG9wdGlvbmFsbHkgZmlsbCBpbiBhbiBvcGFxdWUgb2JqZWN0LCAibWV0YSIsIHRoYXQgaGVscHMKLSAgICAvLyB0aGUgY29ycmVzcG9uZGluZyBleHRyYWN0b3IgaW5pdGlhbGl6ZSBpdHMgc3RhdGUgd2l0aG91dCBkdXBsaWNhdGluZwotICAgIC8vIGVmZm9ydCBhbHJlYWR5IGV4ZXJ0ZWQgYnkgdGhlIHNuaWZmZXIuIElmICJmcmVlTWV0YSIgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUKLSAgICAvLyBjYWxsZWQgYWdhaW5zdCB0aGUgb3BhcXVlIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VkLgotICAgIHR5cGVkZWYgQ3JlYXRvckZ1bmMgKCpTbmlmZmVyRnVuYykoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgIHZvaWQgKiptZXRhLCBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKTsKLQotICAgIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgY29uc3QgdWludDhfdCBiWzE2XTsKLSAgICB9IHV1aWRfdDsKLQotICAgIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgLy8gdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgICAgICAgY29uc3QgdWludDMyX3QgZGVmX3ZlcnNpb247Ci0KLSAgICAgICAgLy8gQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRyYWN0b3IuCi0gICAgICAgIC8vIFNlZSBiZWxvdyBmb3IgYSBjb252ZW5pZW5jZSBtYWNybyB0byBjcmVhdGUgdGhpcyBmcm9tIGEgc3RyaW5nLgotICAgICAgICB1dWlkX3QgZXh0cmFjdG9yX3V1aWQ7Ci0KLSAgICAgICAgLy8gVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBleHRyYWN0b3IuIFdoZW4gdHdvIGV4dHJhY3RvcnMgd2l0aCB0aGUgc2FtZQotICAgICAgICAvLyB1dWlkIGFyZSBlbmNvdW50ZXJlZCwgdGhlIG9uZSB3aXRoIHRoZSBsYXJnZXN0IHZlcnNpb24gbnVtYmVyIHdpbGwKLSAgICAgICAgLy8gYmUgdXNlZC4KLSAgICAgICAgY29uc3QgdWludDMyX3QgZXh0cmFjdG9yX3ZlcnNpb247Ci0KLSAgICAgICAgLy8gYSBodW1hbiByZWFkYWJsZSBuYW1lCi0gICAgICAgIGNvbnN0IGNoYXIgKmV4dHJhY3Rvcl9uYW1lOwotCi0gICAgICAgIC8vIHRoZSBzbmlmZmVyIGZ1bmN0aW9uCi0gICAgICAgIGNvbnN0IFNuaWZmZXJGdW5jIHNuaWZmOwotICAgIH0gRXh0cmFjdG9yRGVmOwotCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OID0gMTsKLQotICAgIHR5cGVkZWYgRXh0cmFjdG9yRGVmICgqR2V0RXh0cmFjdG9yRGVmKSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgTWVkaWFFeHRyYWN0b3IoKTsKLQotcHJpdmF0ZToKLSAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKLSAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOwotfTsKLQotLy8gcHVycG9zZWx5IG5vdCBkZWZpbmVkIGFueXdoZXJlIHNvIHRoYXQgdGhpcyB3aWxsIGZhaWwgdG8gbGluayBpZgotLy8gZXhwcmVzc2lvbnMgYmVsb3cgYXJlIG5vdCBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lCi1pbnQgaW52YWxpZF91dWlkX3N0cmluZyhjb25zdCBjaGFyICopOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1jb25zdGV4cHIgdWludDhfdCBfZGlnaXRBdF8oY29uc3QgVCAoJnMpW05dLCBjb25zdCBzaXplX3QgbikgewotICAgIHJldHVybiBzW25dID49ICcwJyAmJiBzW25dIDw9ICc5JyA/IHNbbl0gLSAnMCcKLSAgICAgICAgICAgIDogc1tuXSA+PSAnYScgJiYgc1tuXSA8PSAnZicgPyBzW25dIC0gJ2EnICsgMTAKLSAgICAgICAgICAgICAgICAgICAgOiBzW25dID49ICdBJyAmJiBzW25dIDw9ICdGJyA/IHNbbl0gLSAnQScgKyAxMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW52YWxpZF91dWlkX3N0cmluZygidXVpZDogYmFkIGRpZ2l0cyIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1jb25zdGV4cHIgdWludDhfdCBfaGV4Qnl0ZUF0Xyhjb25zdCBUICgmcylbTl0sIHNpemVfdCBuKSB7Ci0gICAgcmV0dXJuIChfZGlnaXRBdF8ocywgbikgPDwgNCkgKyBfZGlnaXRBdF8ocywgbiArIDEpOwotfQotCi1jb25zdGV4cHIgYm9vbCBfYXNzZXJ0SXNEYXNoXyhjaGFyIGMpIHsKLSAgICByZXR1cm4gYyA9PSAnLScgPyB0cnVlIDogaW52YWxpZF91dWlkX3N0cmluZygiV3JvbmcgZm9ybWF0Iik7Ci19Ci0KLXRlbXBsYXRlIDxzaXplX3QgTj4KLWNvbnN0ZXhwciBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IGNvbnN0VVVJRChjb25zdCBjaGFyICgmcykgW05dKSB7Ci0gICAgc3RhdGljX2Fzc2VydChOID09IDM3LCAidXVpZDogd3JvbmcgbGVuZ3RoIik7Ci0gICAgcmV0dXJuCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzhdKSwKLSAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMTNdKSwKLSAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMThdKSwKLSAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMjNdKSwKLSAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjp1dWlkX3Qge3sKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAwKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA0KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA2KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA5KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxMSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTQpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE2KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxOSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjEpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI0KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjgpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDMwKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzQpLAotICAgICAgICAgICAgfX07Ci19Ci0vLyBDb252ZW5pZW5jZSBtYWNybyB0byBjcmVhdGUgYSB1dWlkX3QgZnJvbSBhIHN0cmluZyBsaXRlcmFsLCB3aGljaCBzaG91bGQKLS8vIGJlIGZvcm1hdHRlZCBhcyAiMTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5YWJjIiwgYXMgZ2VuZXJhdGVkIGJ5Ci0vLyBlLmcuIGh0dHBzOi8vd3d3LnV1aWRnZW5lcmF0b3IubmV0LyBvciB0aGUgJ3V1aWRnZW4nIGxpbnV4IGNvbW1hbmQuCi0vLyBIZXggZGlnaXRzIG1heSBiZSB1cHBlciBvciBsb3dlciBjYXNlLgotLy8KLS8vIFRoZSBtYWNybyBjYWxsIGlzIG90aGVyd2lzZSBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseQotLy8gKGUuZy4gVVVJRCgiN2Q2MTM4NTgtNTgzNy00YTM4LTg0YzUtMzMyZDFjZGRlZTI3IikgaXMgdGhlIHNhbWUgYXMKLS8vICAgICAgIHt7MHg3ZCwgMHg2MSwgMHgzOCwgMHg1OCwgMHg1OCwgMHgzNywgMHg0YSwgMHgzOCwKLS8vICAgICAgICAgMHg4NCwgMHhjNSwgMHgzMywgMHgyZCwgMHgxYywgMHhkZCwgMHhlZSwgMHgyN319KQotCi0jZGVmaW5lIFVVSUQoc3RyKSBbXXsgY29uc3RleHByIE1lZGlhRXh0cmFjdG9yOjp1dWlkX3QgdXVpZCA9IGNvbnN0VVVJRChzdHIpOyByZXR1cm4gdXVpZDsgfSgpCi0KLQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlYTYxYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9TT1VSQ0VfQkFTRV9IXwotCi0jZGVmaW5lIE1FRElBX1NPVVJDRV9CQVNFX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXJCYXNlOwotCi1jbGFzcyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyIHsKLXB1YmxpYzoKLSAgICBTb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgic291cmNlYmFzZSBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgflNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7Ci0gICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGZyZWVkOiAlcCIsIHRoaXMpOwotICAgIH0KLX07Ci0KLXN0cnVjdCBNZWRpYVRyYWNrCi0vLyAgICA6IHB1YmxpYyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyCi17Ci0gICAgTWVkaWFUcmFjaygpOwotCi0gICAgLy8gVG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIG9iamVjdCwgZXhjZXB0Ci0gICAgLy8gZ2V0Rm9ybWF0KCkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpID0gMDsKLQotICAgIC8vIEFueSBibG9ja2luZyByZWFkIGNhbGwgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIGEgcmVzdWx0IG9mIE5PX0lOSVQuCi0gICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBhbnkgbWV0aG9kcyBvdGhlciB0aGFuIHN0YXJ0IGFmdGVyIHRoaXMgY2FsbAotICAgIC8vIHJldHVybnMuIEFueSBidWZmZXJzIHRoZSBvYmplY3QgbWF5IGJlIGhvbGRpbmcgb250byBhdCB0aGUgdGltZSBvZgotICAgIC8vIHRoZSBzdG9wKCkgY2FsbCBhcmUgcmVsZWFzZWQuCi0gICAgLy8gQWxzbywgaXQgaXMgaW1wZXJhdGl2ZSB0aGF0IGFueSBidWZmZXJzIG91dHB1dCBieSB0aGlzIG9iamVjdCBhbmQKLSAgICAvLyBoZWxkIG9udG8gYnkgY2FsbGVycyBiZSByZWxlYXNlZCBiZWZvcmUgYSBjYWxsIHRvIHN0b3AoKSAhISEKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgb3V0cHV0IGJ5IHRoaXMgbWVkaWEgdHJhY2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpID0gMDsKLQotICAgIC8vIE9wdGlvbnMgdGhhdCBtb2RpZnkgcmVhZCgpIGJlaGF2aW91ci4gVGhlIGRlZmF1bHQgaXMgdG8KLSAgICAvLyBhKSBub3QgcmVxdWVzdCBhIHNlZWsKLSAgICAvLyBiKSBub3QgYmUgbGF0ZSwgaS5lLiBsYXRlbmVzc191cyA9IDAKLSAgICBzdHJ1Y3QgUmVhZE9wdGlvbnMgewotICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7Ci0gICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCi0gICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKLSAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAotICAgICAgICAgICAgU0VFS19DTE9TRVNULAotICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCwKLSAgICAgICAgfTsKLQotICAgICAgICBSZWFkT3B0aW9ucygpOwotCi0gICAgICAgIC8vIFJlc2V0IGV2ZXJ5dGhpbmcgYmFjayB0byBkZWZhdWx0cy4KLSAgICAgICAgdm9pZCByZXNldCgpOwotCi0gICAgICAgIHZvaWQgc2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DKTsKLSAgICAgICAgdm9pZCBjbGVhclNlZWtUbygpOwotICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3Q7Ci0KLSAgICAgICAgdm9pZCBzZXROb25CbG9ja2luZygpOwotICAgICAgICB2b2lkIGNsZWFyTm9uQmxvY2tpbmcoKTsKLSAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0OwotCi0gICAgICAgIC8vIFVzZWQgdG8gY2xlYXIgYWxsIG5vbi1wZXJzaXN0ZW50IG9wdGlvbnMgZm9yIG11bHRpcGxlIGJ1ZmZlciByZWFkcy4KLSAgICAgICAgdm9pZCBjbGVhck5vblBlcnNpc3RlbnQoKSB7Ci0gICAgICAgICAgICBjbGVhclNlZWtUbygpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBlbnVtIE9wdGlvbnMgewotICAgICAgICAgICAga1NlZWtUb19PcHRpb24gICAgICA9IDEsCi0gICAgICAgIH07Ci0KLSAgICAgICAgdWludDMyX3QgbU9wdGlvbnM7Ci0gICAgICAgIGludDY0X3QgbVNlZWtUaW1lVXM7Ci0gICAgICAgIFNlZWtNb2RlIG1TZWVrTW9kZTsKLSAgICAgICAgYm9vbCBtTm9uQmxvY2tpbmc7Ci0gICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgLy8gc2VudCB0aHJvdWdoIEJpbmRlcgotCi0gICAgLy8gUmV0dXJucyBhIG5ldyBidWZmZXIgb2YgZGF0YS4gQ2FsbCBibG9ja3MgdW50aWwgYQotICAgIC8vIGJ1ZmZlciBpcyBhdmFpbGFibGUsIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIG9mIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQotICAgIC8vIGlzIHJlYWNoZWQuCi0gICAgLy8gRW5kIG9mIHN0cmVhbSBpcyBzaWduYWxsZWQgYnkgYSByZXN1bHQgb2YgRVJST1JfRU5EX09GX1NUUkVBTS4KLSAgICAvLyBBIHJlc3VsdCBvZiBJTkZPX0ZPUk1BVF9DSEFOR0VEIGluZGljYXRlcyB0aGF0IHRoZSBmb3JtYXQgb2YgdGhpcwotICAgIC8vIE1lZGlhU291cmNlIGhhcyBjaGFuZ2VkIG1pZC1zdHJlYW0sIHRoZSBjbGllbnQgY2FuIGNvbnRpbnVlIHJlYWRpbmcKLSAgICAvLyBidXQgc2hvdWxkIGJlIHByZXBhcmVkIGZvciBidWZmZXJzIG9mIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCkgPSAwOwotCi0gICAgdmlydHVhbCB+TWVkaWFUcmFjaygpOwotCi1wcml2YXRlOgotICAgIE1lZGlhVHJhY2soY29uc3QgTWVkaWFUcmFjayAmKTsKLSAgICBNZWRpYVRyYWNrICZvcGVyYXRvcj0oY29uc3QgTWVkaWFUcmFjayAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfU09VUkNFX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTMyOTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIFZPUkJJU19DT01NRU5UX0hfCi0jZGVmaW5lIFZPUkJJU19DT01NRU5UX0hfCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWV0YURhdGFCYXNlOwotCi12b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gVk9SQklTX0NPTU1FTlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyNTk2NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQlVGRkVSX0hfCi0KLSNkZWZpbmUgTUVESUFfQlVGRkVSX0hfCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFCdWZmZXI7Ci1jbGFzcyBNZWRpYUJ1ZmZlcjsKLWNsYXNzIE1lZGlhQnVmZmVyT2JzZXJ2ZXI7Ci1jbGFzcyBNZXRhRGF0YUJhc2U7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyIDogcHVibGljIE1lZGlhQnVmZmVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgLy8gYWxsb2NhdGlvbnMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyB3aWxsIHVzZSBzaGFyZWQgbWVtb3J5LgotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NoYXJlZE1lbVRocmVzaG9sZCA9IDY0ICogMTAyNDsKLQotICAgIC8vIFRoZSB1bmRlcmx5aW5nIGRhdGEgcmVtYWlucyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciEKLSAgICBNZWRpYUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBleHBsaWNpdCBNZWRpYUJ1ZmZlcihzaXplX3Qgc2l6ZSk7Ci0KLSAgICBleHBsaWNpdCBNZWRpYUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKLQotICAgIE1lZGlhQnVmZmVyKGNvbnN0IHNwPElNZW1vcnk+ICZtZW0pIDoKLSAgICAgICAgTWVkaWFCdWZmZXIoKHVpbnQ4X3QgKiltZW0tPnBvaW50ZXIoKSArIHNpemVvZihTaGFyZWRDb250cm9sKSwgbWVtLT5zaXplKCkpIHsKLSAgICAgICAgLy8gZGVsZWdhdGUgYW5kIG92ZXJyaWRlIG1NZW1vcnkKLSAgICAgICAgbU1lbW9yeSA9IG1lbTsKLSAgICB9Ci0KLSAgICAvLyBJZiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgZGVjcmVtZW50IHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQ7Ci0gICAgLy8gaWYgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byAwLCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUKLSAgICAvLyBhc3NvY2lhdGVkIE1lZGlhQnVmZmVyR3JvdXAuCi0gICAgLy8KLSAgICAvLyBJZiBubyBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIHplcm8KLSAgICAvLyB3aGVuIGNhbGxlZCwgd2hlcmV1cG9uIHRoZSBNZWRpYUJ1ZmZlciBpcyBkZWxldGVkLgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCk7Ci0KLSAgICAvLyBJbmNyZW1lbnRzIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQuCi0gICAgLy8gVXNlIG9ubHkgd2hlbiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldC4KLSAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpOwotCi0gICAgdmlydHVhbCB2b2lkICpkYXRhKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOwotCi0gICAgTWV0YURhdGFCYXNlJiBtZXRhX2RhdGEoKTsKLQotICAgIC8vIENsZWFycyBtZXRhIGRhdGEgYW5kIHJlc2V0cyB0aGUgcmFuZ2UgdG8gdGhlIGZ1bGwgZXh0ZW50LgotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwotCi0gICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKTsKLQotICAgIC8vIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIE1lZGlhQnVmZmVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4KLSAgICAvLyBUaGUgY2xvbmUgcmVmZXJlbmNlcyB0aGUgc2FtZSBkYXRhIGJ1dCBoYXMgaXRzIG93biByYW5nZSBhbmQKLSAgICAvLyBNZXRhRGF0YS4KLSAgICB2aXJ0dWFsIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUoKTsKLQotICAgIC8vIHN1bSBvZiBsb2NhbFJlZmNvdW50KCkgYW5kIHJlbW90ZVJlZmNvdW50KCkKLSAgICAvLyBSZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwcm94aW1hdGUgdW5sZXNzIHRoZSByZXN1bHQgcHJlY2x1ZGVzIGNvbmN1cnJlbnQgYWNjZXNzZXMuCi0gICAgdmlydHVhbCBpbnQgcmVmY291bnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBsb2NhbFJlZmNvdW50KCkgKyByZW1vdGVSZWZjb3VudCgpOwotICAgIH0KLQotICAgIC8vIFJlc3VsdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcHByb3hpbWF0ZSB1bmxlc3MgdGhlIHJlc3VsdCBwcmVjbHVkZXMgY29uY3VycmVudCBhY2Nlc3Nlcy4KLSAgICB2aXJ0dWFsIGludCBsb2NhbFJlZmNvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVJlZkNvdW50LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCB7Ci0gICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOwotICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCi0gICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCi0gICAgfQotCi0gICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKLSAgICBpbnQgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgewotICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5hZGRSZW1vdGVSZWZjb3VudCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBpc0RlYWRPYmplY3QobU1lbW9yeSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgaXNEZWFkT2JqZWN0KGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnkpIHsKLSAgICAgICAgaWYgKG1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtZW1vcnktPnBvaW50ZXIoKSktPmlzRGVhZE9iamVjdCgpOwotICAgIH0KLQotICAgIC8vIFN0aWNreSBvbiBlbmFibGluZyBvZiBzaGFyZWQgbWVtb3J5IE1lZGlhQnVmZmVycy4gQnkgZGVmYXVsdCB3ZSBkb24ndCB1c2UKLSAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBNZWRpYUJ1ZmZlcnMsIGJ1dCB3ZSBlbmFibGUgdGhpcyBmb3IgdGhvc2UgcHJvY2Vzc2VzCi0gICAgLy8gdGhhdCBleHBvcnQgTWVkaWFCdWZmZXJzLgotICAgIHN0YXRpYyB2b2lkIHVzZVNoYXJlZE1lbW9yeSgpIHsKLSAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgJm1Vc2VTaGFyZWRNZW1vcnksIChpbnRfbGVhc3QzMl90KTEsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIC8vIHRydWUgaWYgTWVkaWFCdWZmZXIgaXMgb2JzZXJ2ZWQgKHBhcnQgb2YgYSBNZWRpYUJ1ZmZlckdyb3VwKS4KLSAgICBpbmxpbmUgYm9vbCBpc09ic2VydmVkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU9ic2VydmVyICE9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+TWVkaWFCdWZmZXIoKTsKLQotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgZnJpZW5kIGNsYXNzIE9NWERlY29kZXI7Ci0gICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFTb3VyY2U7Ci0gICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFTb3VyY2U7Ci0KLSAgICAvLyBGb3IgdXNlIGJ5IE9NWERlY29kZXIsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIDEsIGRyb3AgcmVmZXJlbmNlCi0gICAgLy8gY291bnQgdG8gMCB3aXRob3V0IHNpZ25hbGxpbmcgdGhlIG9ic2VydmVyLgotICAgIHZvaWQgY2xhaW0oKTsKLQotICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKm1PYnNlcnZlcjsKLSAgICBzdGQ6OmF0b21pYzxpbnQ+IG1SZWZDb3VudDsKLQotICAgIHZvaWQgKm1EYXRhOwotICAgIHNpemVfdCBtU2l6ZSwgbVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGg7Ci0gICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLQotICAgIGJvb2wgbU93bnNEYXRhOwotCi0gICAgTWV0YURhdGFCYXNlKiBtTWV0YURhdGE7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbU9yaWdpbmFsOwotCi0gICAgc3RhdGljIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVVzZVNoYXJlZE1lbW9yeTsKLQotICAgIE1lZGlhQnVmZmVyKGNvbnN0IE1lZGlhQnVmZmVyICYpOwotICAgIE1lZGlhQnVmZmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXIgJik7Ci0KLSAgICAvLyBTaGFyZWRDb250cm9sIGJsb2NrIGF0IHRoZSBzdGFydCBvZiBJTWVtb3J5LgotICAgIHN0cnVjdCBTaGFyZWRDb250cm9sIHsKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBGTEFHX0RFQURfT0JKRUNUID0gKDEgPDwgMCksCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKLSAgICAgICAgaW5saW5lIGludDMyX3QgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIGludDMyX3QgZ2V0UmVtb3RlUmVmY291bnQoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVJlbW90ZVJlZmNvdW50LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSB2b2lkIHNldFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gKHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpICYgRkxBR19ERUFEX09CSkVDVCkgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSB2b2lkIHNldERlYWRPYmplY3QoKSB7Ci0gICAgICAgICAgICAodm9pZClzdGQ6OmF0b21pY19mZXRjaF9vcl9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpRkxBR19ERUFEX09CSkVDVCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gQ2F1dGlvbjogYXRvbWljX2ludF9mYXN0MzJfdCBpcyA2NCBiaXRzIG9uIExQNjQuCi0gICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbUZsYWdzOwotICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1SZW1vdGVSZWZjb3VudDsKLSAgICAgICAgaW50MzJfdCB1bnVzZWRbNl0gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpOyAvLyBhZGRpdGlvbmFsIGJ1ZmZlciBzcGFjZQotICAgIH07Ci0KLSAgICBpbmxpbmUgU2hhcmVkQ29udHJvbCAqZ2V0U2hhcmVkQ29udHJvbCgpIGNvbnN0IHsKLSAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKTsKLSAgICAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhkOTRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CVUZGRVJfQkFTRV9IXwotCi0jZGVmaW5lIE1FRElBX0JVRkZFUl9CQVNFX0hfCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXJCYXNlOwotY2xhc3MgTWV0YURhdGFCYXNlOwotCi1jbGFzcyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyKCkge30KLSAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlck9ic2VydmVyKCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgPSAwOwotCi1wcml2YXRlOgotICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKLX07Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIE1lZGlhQnVmZmVyQmFzZSAqQ3JlYXRlKHNpemVfdCBzaXplKTsKLQotICAgIC8vIElmIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCBkZWNyZW1lbnQgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudDsKLSAgICAvLyBpZiB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIDAsIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZQotICAgIC8vIGFzc29jaWF0ZWQgTWVkaWFCdWZmZXJHcm91cC4KLSAgICAvLwotICAgIC8vIElmIG5vIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IG11c3QgYmUgemVybwotICAgIC8vIHdoZW4gY2FsbGVkLCB3aGVyZXVwb24gdGhlIE1lZGlhQnVmZmVyIGlzIGRlbGV0ZWQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSA9IDA7Ci0KLSAgICAvLyBJbmNyZW1lbnRzIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQuCi0gICAgLy8gVXNlIG9ubHkgd2hlbiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldC4KLSAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgPSAwOwotCi0gICAgdmlydHVhbCBNZXRhRGF0YUJhc2UmIG1ldGFfZGF0YSgpID0gMDsKLQotICAgIC8vIENsZWFycyBtZXRhIGRhdGEgYW5kIHJlc2V0cyB0aGUgcmFuZ2UgdG8gdGhlIGZ1bGwgZXh0ZW50LgotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgTWVkaWFCdWZmZXJCYXNlIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZQotICAgIC8vIGNvdW50LiBUaGUgY2xvbmUgcmVmZXJlbmNlcyB0aGUgc2FtZSBkYXRhIGJ1dCBoYXMgaXRzIG93biByYW5nZSBhbmQKLSAgICAvLyBNZXRhRGF0YS4KLSAgICB2aXJ0dWFsIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckJhc2UoKSB7fTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZDVkZjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CVUZGRVJfR1JPVVBfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfR1JPVVBfSF8KLQotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXJCYXNlOwotCi1jbGFzcyBNZWRpYUJ1ZmZlckdyb3VwIDogcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgewotcHVibGljOgotICAgIE1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0ID0gMCk7Ci0KLSAgICAvLyBjcmVhdGUgYSBtZWRpYSBidWZmZXIgZ3JvdXAgd2l0aCBwcmVhbGxvY2F0ZWQgYnVmZmVycwotICAgIE1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0ID0gMCk7Ci0KLSAgICB+TWVkaWFCdWZmZXJHcm91cCgpOwotCi0gICAgdm9pZCBhZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLQotICAgIGJvb2wgaGFzX2J1ZmZlcnMoKTsKLQotICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIGZhbHNlLCBpdCBibG9ja3MgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlIGFuZAotICAgIC8vIHBhc3NlcyBpdCB0byB0aGUgY2FsbGVyIGluICpidWZmZXIsIHdoaWxlIHJldHVybmluZyBPSy4KLSAgICAvLyBUaGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLgotICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIHRydWUgYW5kIGEgYnVmZmVyIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUsCi0gICAgLy8gYnVmZmVyIGlzIHNldCB0byBOVUxMIGFuZCBpdCByZXR1cm5zIFdPVUxEX0JMT0NLLgotICAgIC8vIElmIHJlcXVlc3RlZFNpemUgaXMgMCwgYW55IGZyZWUgTWVkaWFCdWZmZXIgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzID4gMCwgdGhlIHJldHVybmVkIE1lZGlhQnVmZmVyIHNob3VsZCBoYXZlIGJ1ZmZlcgotICAgIC8vIHNpemUgb2YgYXQgbGVhc3QgcmVxdXN0ZWRTaXplLgotICAgIHN0YXR1c190IGFjcXVpcmVfYnVmZmVyKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBib29sIG5vbkJsb2NraW5nID0gZmFsc2UsIHNpemVfdCByZXF1ZXN0ZWRTaXplID0gMCk7Ci0KLSAgICBzaXplX3QgYnVmZmVycygpIGNvbnN0OwotCi0gICAgLy8gSWYgYnVmZmVyIGlzIG51bGxwdHIsIGhhdmUgYWNxdWlyZV9idWZmZXIoKSBjaGVjayBmb3IgcmVtb3RlIHJlbGVhc2UuCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgSW50ZXJuYWxEYXRhOwotICAgIEludGVybmFsRGF0YSAqbUludGVybmFsOwotCi0gICAgTWVkaWFCdWZmZXJHcm91cChjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfR1JPVVBfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTRlODZjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVUQV9EQVRBX0JBU0VfSF8KLQotI2RlZmluZSBNRVRBX0RBVEFfQkFTRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGhlIGZvbGxvd2luZyBrZXlzIG1hcCB0byBpbnQzMl90IGRhdGEgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi1lbnVtIHsKLSAgICBrS2V5TUlNRVR5cGUgICAgICAgICAgPSAnbWltZScsICAvLyBjc3RyaW5nCi0gICAga0tleVdpZHRoICAgICAgICAgICAgID0gJ3dpZHQnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKLSAgICBrS2V5SGVpZ2h0ICAgICAgICAgICAgPSAnaGVpZycsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAotICAgIGtLZXlEaXNwbGF5V2lkdGggICAgICA9ICdkV2lkJywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCi0gICAga0tleURpc3BsYXlIZWlnaHQgICAgID0gJ2RIZ3QnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KLSAgICBrS2V5U0FSV2lkdGggICAgICAgICAgPSAnc2FyVycsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyB3aWR0aAotICAgIGtLZXlTQVJIZWlnaHQgICAgICAgICA9ICdzYXJIJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIGhlaWdodAotICAgIGtLZXlUaHVtYm5haWxXaWR0aCAgICA9ICd0aGJXJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCB3aWR0aAotICAgIGtLZXlUaHVtYm5haWxIZWlnaHQgICA9ICd0aGJIJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCBoZWlnaHQKLQotICAgIC8vIGEgcmVjdGFuZ2xlLCBpZiBhYnNlbnQgYXNzdW1lZCB0byBiZSAoMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKQotICAgIGtLZXlDcm9wUmVjdCAgICAgICAgICA9ICdjcm9wJywKLQotICAgIGtLZXlSb3RhdGlvbiAgICAgICAgICA9ICdyb3RBJywgIC8vIGludDMyX3QgKGFuZ2xlIGluIGRlZ3JlZXMpCi0gICAga0tleUlGcmFtZXNJbnRlcnZhbCAgID0gJ2lmaXYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlTdHJpZGUgICAgICAgICAgICA9ICdzdHJkJywgIC8vIGludDMyX3QKLSAgICBrS2V5U2xpY2VIZWlnaHQgICAgICAgPSAnc2xodCcsICAvLyBpbnQzMl90Ci0gICAga0tleUNoYW5uZWxDb3VudCAgICAgID0gJyNjaG4nLCAgLy8gaW50MzJfdAotICAgIGtLZXlDaGFubmVsTWFzayAgICAgICA9ICdjaG5tJywgIC8vIGludDMyX3QKLSAgICBrS2V5U2FtcGxlUmF0ZSAgICAgICAgPSAnc3J0ZScsICAvLyBpbnQzMl90IChhdWRpbyBzYW1wbGluZyByYXRlIEh6KQotICAgIGtLZXlQY21FbmNvZGluZyAgICAgICA9ICdQQ01lJywgIC8vIGludDMyX3QgKGF1ZGlvIGVuY29kaW5nIGVudW0pCi0gICAga0tleUZyYW1lUmF0ZSAgICAgICAgID0gJ2ZybVInLCAgLy8gaW50MzJfdCAodmlkZW8gZnJhbWUgcmF0ZSBmcHMpCi0gICAga0tleUJpdFJhdGUgICAgICAgICAgID0gJ2JydGUnLCAgLy8gaW50MzJfdCAoYnBzKQotICAgIGtLZXlNYXhCaXRSYXRlICAgICAgICA9ICdteEJyJywgIC8vIGludDMyX3QgKGJwcykKLSAgICBrS2V5Qml0c1BlclNhbXBsZSAgICAgPSAnYml0cycsICAvLyBpbnQzMl90IChiaXRzIHBlciBzYW1wbGUpCi0gICAga0tleVN0cmVhbUhlYWRlciAgICAgID0gJ3N0SGQnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5RVNEUyAgICAgICAgICAgICAgPSAnZXNkcycsICAvLyByYXcgZGF0YQotICAgIGtLZXlBQUNQcm9maWxlICAgICAgICA9ICdhYWNwJywgIC8vIGludDMyX3QKLSAgICBrS2V5QVZDQyAgICAgICAgICAgICAgPSAnYXZjYycsICAvLyByYXcgZGF0YQotICAgIGtLZXlIVkNDICAgICAgICAgICAgICA9ICdodmNjJywgIC8vIHJhdyBkYXRhCi0gICAga0tleVRodW1ibmFpbEhWQ0MgICAgID0gJ3RodmMnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5RDI2MyAgICAgICAgICAgICAgPSAnZDI2MycsICAvLyByYXcgZGF0YQotICAgIGtLZXlWb3JiaXNJbmZvICAgICAgICA9ICd2aW5mJywgIC8vIHJhdyBkYXRhCi0gICAga0tleVZvcmJpc0Jvb2tzICAgICAgID0gJ3Zib28nLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5T3B1c0hlYWRlciAgICAgICAgPSAnb2hkcicsICAvLyByYXcgZGF0YQotICAgIGtLZXlPcHVzQ29kZWNEZWxheSAgICA9ICdvY29kJywgIC8vIHVpbnQ2NF90IChjb2RlYyBkZWxheSBpbiBucykKLSAgICBrS2V5T3B1c1NlZWtQcmVSb2xsICAgPSAnb3NwcicsICAvLyB1aW50NjRfdCAoc2VlayBwcmVyb2xsIGluIG5zKQotICAgIGtLZXlGbGFjTWV0YWRhdGEgICAgICA9ICdmbE1kJywgIC8vIHJhdyBkYXRhCi0gICAga0tleVZwOUNvZGVjUHJpdmF0ZSAgID0gJ3ZwOXAnLCAgLy8gcmF3IGRhdGEgKHZwOSBjc2QgaW5mb3JtYXRpb24pCi0gICAga0tleVdhbnRzTkFMRnJhZ21lbnRzID0gJ05BTGYnLAotICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5SXNNdXhlckRhdGEgICAgICAgPSAnbXV4ZCcsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlEZWNvZGluZ1RpbWUgICAgICA9ICdkZWNUJywgIC8vIGludDY0X3QgKGRlY29kaW5nIHRpbWVzdGFtcCBpbiB1c2VjcykKLSAgICBrS2V5TlRQVGltZSAgICAgICAgICAgPSAnbnRwVCcsICAvLyB1aW50NjRfdCAobnRwLXRpbWVzdGFtcCkKLSAgICBrS2V5VGFyZ2V0VGltZSAgICAgICAgPSAndGFyVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5RHJpZnRUaW1lICAgICAgICAgPSAnZGZ0VCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5QW5jaG9yVGltZSAgICAgICAgPSAnYW5jVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5RHVyYXRpb24gICAgICAgICAgPSAnZHVyYScsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5UGl4ZWxGb3JtYXQgICAgICAgPSAncGl4ZicsICAvLyBpbnQzMl90Ci0gICAga0tleUNvbG9yRm9ybWF0ICAgICAgID0gJ2NvbGYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDb2xvclNwYWNlICAgICAgICA9ICdjb2xzJywgIC8vIGludDMyX3QKLSAgICBrS2V5UGxhdGZvcm1Qcml2YXRlICAgPSAncHJpdicsICAvLyBwb2ludGVyCi0gICAga0tleURlY29kZXJDb21wb25lbnQgID0gJ2RlY0MnLCAgLy8gY3N0cmluZwotICAgIGtLZXlCdWZmZXJJRCAgICAgICAgICA9ICdiZklEJywKLSAgICBrS2V5TWF4SW5wdXRTaXplICAgICAgPSAnaW5wUycsCi0gICAga0tleU1heFdpZHRoICAgICAgICAgID0gJ21heFcnLAotICAgIGtLZXlNYXhIZWlnaHQgICAgICAgICA9ICdtYXhIJywKLSAgICBrS2V5VGh1bWJuYWlsVGltZSAgICAgPSAndGhiVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5VHJhY2tJRCAgICAgICAgICAgPSAndHJJRCcsCi0gICAga0tleUlzRFJNICAgICAgICAgICAgID0gJ2lkcm0nLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5RW5jb2RlckRlbGF5ICAgICAgPSAnZW5jZCcsICAvLyBpbnQzMl90IChmcmFtZXMpCi0gICAga0tleUVuY29kZXJQYWRkaW5nICAgID0gJ2VuY3AnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQotCi0gICAga0tleUFsYnVtICAgICAgICAgICAgID0gJ2FsYnUnLCAgLy8gY3N0cmluZwotICAgIGtLZXlBcnRpc3QgICAgICAgICAgICA9ICdhcnRpJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QWxidW1BcnRpc3QgICAgICAgPSAnYWFydCcsICAvLyBjc3RyaW5nCi0gICAga0tleUNvbXBvc2VyICAgICAgICAgID0gJ2NvbXAnLCAgLy8gY3N0cmluZwotICAgIGtLZXlHZW5yZSAgICAgICAgICAgICA9ICdnZW5yJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5VGl0bGUgICAgICAgICAgICAgPSAndGl0bCcsICAvLyBjc3RyaW5nCi0gICAga0tleVllYXIgICAgICAgICAgICAgID0gJ3llYXInLCAgLy8gY3N0cmluZwotICAgIGtLZXlBbGJ1bUFydCAgICAgICAgICA9ICdhbGJBJywgIC8vIGNvbXByZXNzZWQgaW1hZ2UgZGF0YQotICAgIGtLZXlBbGJ1bUFydE1JTUUgICAgICA9ICdhbEFNJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QXV0aG9yICAgICAgICAgICAgPSAnYXV0aCcsICAvLyBjc3RyaW5nCi0gICAga0tleUNEVHJhY2tOdW1iZXIgICAgID0gJ2NkdHInLCAgLy8gY3N0cmluZwotICAgIGtLZXlEaXNjTnVtYmVyICAgICAgICA9ICdkbnVtJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5RGF0ZSAgICAgICAgICAgICAgPSAnZGF0ZScsICAvLyBjc3RyaW5nCi0gICAga0tleVdyaXRlciAgICAgICAgICAgID0gJ3dyaXQnLCAgLy8gY3N0cmluZwotICAgIGtLZXlDb21waWxhdGlvbiAgICAgICA9ICdjcGlsJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5TG9jYXRpb24gICAgICAgICAgPSAnbG9jICcsICAvLyBjc3RyaW5nCi0gICAga0tleVRpbWVTY2FsZSAgICAgICAgID0gJ3Rtc2wnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDYXB0dXJlRnJhbWVyYXRlICA9ICdjYXBGJywgIC8vIGZsb2F0IChjYXB0dXJlIGZwcykKLQotICAgIC8vIHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsCi0gICAga0tleVZpZGVvUHJvZmlsZSAgICAgID0gJ3ZwcmYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlWaWRlb0xldmVsICAgICAgICA9ICd2bGV2JywgIC8vIGludDMyX3QKLQotICAgIC8vIFNldCB0aGlzIGtleSB0byBlbmFibGUgYXV0aG9yaW5nIGZpbGVzIGluIDY0LWJpdCBvZmZzZXQKLSAgICBrS2V5NjRCaXRGaWxlT2Zmc2V0ICAgPSAnZm9idCcsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXkyQnl0ZU5hbExlbmd0aCAgICA9ICcyTkFMJywgIC8vIGludDMyX3QgKGJvb2wpCi0KLSAgICAvLyBJZGVudGlmeSB0aGUgZmlsZSBvdXRwdXQgZm9ybWF0IGZvciBhdXRob3JpbmcKLSAgICAvLyBQbGVhc2Ugc2VlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+IGZvciB0aGUgc3VwcG9ydGVkCi0gICAgLy8gZmlsZSBvdXRwdXQgZm9ybWF0cy4KLSAgICBrS2V5RmlsZVR5cGUgICAgICAgICAgPSAnZnR5cCcsICAvLyBpbnQzMl90Ci0KLSAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCi0gICAgLy8ga0tleVRyYWNrVGltZVN0YXR1cyBpcyB1c2VkIHRvIHRyYWNrIHByb2dyZXNzIGluIGVsYXBzZWQgdGltZQotICAgIGtLZXlUcmFja1RpbWVTdGF0dXMgICA9ICd0a3RtJywgIC8vIGludDY0X3QKLQotICAgIGtLZXlSZWFsVGltZVJlY29yZGluZyA9ICdydHJjJywgIC8vIGJvb2wgKGludDMyX3QpCi0gICAga0tleU51bUJ1ZmZlcnMgICAgICAgID0gJ25iYmYnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gT2dnIGZpbGVzIGNhbiBiZSB0YWdnZWQgdG8gYmUgYXV0b21hdGljYWxseSBsb29waW5nLi4uCi0gICAga0tleUF1dG9Mb29wICAgICAgICAgID0gJ2F1dEwnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIGtLZXlWYWxpZFNhbXBsZXMgICAgICA9ICd2YWxEJywgIC8vIGludDMyX3QKLQotICAgIGtLZXlJc1VucmVhZGFibGUgICAgICA9ICd1bnJlJywgIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICAvLyBBbiBpbmRpY2F0aW9uIHRoYXQgYSB2aWRlbyBidWZmZXIgaGFzIGJlZW4gcmVuZGVyZWQuCi0gICAga0tleVJlbmRlcmVkICAgICAgICAgID0gJ3JlbmQnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIC8vIFRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGlzIG1lZGlhCi0gICAga0tleU1lZGlhTGFuZ3VhZ2UgICAgID0gJ2xhbmcnLCAgLy8gY3N0cmluZwotCi0gICAgLy8gVG8gc3RvcmUgdGhlIHRpbWVkIHRleHQgZm9ybWF0IGRhdGEKLSAgICBrS2V5VGV4dEZvcm1hdERhdGEgICAgPSAndGV4dCcsICAvLyByYXcgZGF0YQotCi0gICAga0tleVJlcXVpcmVzU2VjdXJlQnVmZmVycyA9ICdzZWN1JywgIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICBrS2V5SXNBRFRTICAgICAgICAgICAgPSAnYWR0cycsICAvLyBib29sIChpbnQzMl90KQotICAgIGtLZXlBQUNBT1QgICAgICAgICAgICA9ICdhYW90JywgIC8vIGludDMyX3QKLQotICAgIC8vIElmIGEgTWVkaWFCdWZmZXIncyBkYXRhIHJlcHJlc2VudHMgKGF0IGxlYXN0IHBhcnRpYWxseSkgZW5jcnlwdGVkCi0gICAgLy8gZGF0YSwgdGhlIGZvbGxvd2luZyBmaWVsZHMgYWlkIGluIGRlY3J5cHRpb24uCi0gICAgLy8gVGhlIGRhdGEgY2FuIGJlIHRob3VnaHQgb2YgYXMgcGFpcnMgb2YgcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhCi0gICAgLy8gZnJhZ21lbnRzLCBpLmUuIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YSBhbHRlcm5hdGUuCi0gICAgLy8gVGhlIGZpcnN0IGZyYWdtZW50IGlzIGJ5IGNvbnZlbnRpb24gcGxhaW4gZGF0YSAoaWYgdGhhdCdzIG5vdCB0aGUKLSAgICAvLyBjYXNlLCBzaW1wbHkgc3BlY2lmeSBwbGFpbiBmcmFnbWVudCBzaXplIG9mIDApLgotICAgIC8vIGtLZXlFbmNyeXB0ZWRTaXplcyBhbmQga0tleVBsYWluU2l6ZXMgZWFjaCBtYXAgdG8gYW4gYXJyYXkgb2YKLSAgICAvLyBzaXplX3QgdmFsdWVzLiBUaGUgc3VtIHRvdGFsIG9mIGFsbCBzaXplX3QgdmFsdWVzIG9mIGJvdGggYXJyYXlzCi0gICAgLy8gbXVzdCBlcXVhbCB0aGUgYW1vdW50IG9mIGRhdGEgKGkuZS4gTWVkaWFCdWZmZXIncyByYW5nZV9sZW5ndGgoKSkuCi0gICAgLy8gSWYgYm90aCBhcnJheXMgYXJlIHByZXNlbnQsIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZSBzaXplLgotICAgIC8vIElmIG9ubHkgZW5jcnlwdGVkIHNpemVzIGFyZSBwcmVzZW50IGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwKLSAgICAvLyBwbGFpbiBzaXplcyBhcmUgMCwgaS5lLiBhbGwgZnJhZ21lbnRzIGFyZSBlbmNyeXB0ZWQuCi0gICAgLy8gVG8gcHJvZ3JhbW1hdGljYWxseSBzZXQgdGhlc2UgYXJyYXksIHVzZSB0aGUgTWV0YURhdGFCYXNlOjpzZXREYXRhIEFQSSwgaS5lLgotICAgIC8vIGNvbnN0IHNpemVfdCBlbmNTaXplc1tdOwotICAgIC8vIG1ldGEtPnNldERhdGEoCi0gICAgLy8gIGtLZXlFbmNyeXB0ZWRTaXplcywgMCAvKiB0eXBlICovLCBlbmNTaXplcywgc2l6ZW9mKGVuY1NpemVzKSk7Ci0gICAgLy8gQSBwbGFpbiBzaXplcyBhcnJheSBieSBpdHNlbGYgbWFrZXMgbm8gc2Vuc2UuCi0gICAga0tleUVuY3J5cHRlZFNpemVzICAgID0gJ2VuY3InLCAgLy8gc2l6ZV90W10KLSAgICBrS2V5UGxhaW5TaXplcyAgICAgICAgPSAncGxhaScsICAvLyBzaXplX3RbXQotICAgIGtLZXlDcnlwdG9LZXkgICAgICAgICA9ICdjcnlLJywgIC8vIHVpbnQ4X3RbMTZdCi0gICAga0tleUNyeXB0b0lWICAgICAgICAgID0gJ2NyeUknLCAgLy8gdWludDhfdFsxNl0KLSAgICBrS2V5Q3J5cHRvTW9kZSAgICAgICAgPSAnY3J5TScsICAvLyBpbnQzMl90Ci0KLSAgICBrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSA9ICdjcnlTJywgIC8vIGludDMyX3QKLQotICAgIGtLZXlQc3NoICAgICAgICAgICAgICA9ICdwc3NoJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUNBU3lzdGVtSUQgICAgICAgID0gJ2NhaWQnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDQVNlc3Npb25JRCAgICAgICA9ICdzZWlkJywgIC8vIHJhdyBkYXRhCi0KLSAgICBrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrID0gJ2NibGsnLCAgLy8gdWludDhfdAotICAgIGtLZXlTa2lwQnl0ZUJsb2NrICAgICA9ICdzYmxrJywgIC8vIHVpbnQ4X3QKLQotICAgIC8vIFBsZWFzZSBzZWUgTWVkaWFGb3JtYXQuS0VZX0lTX0FVVE9TRUxFQ1QuCi0gICAga0tleVRyYWNrSXNBdXRvc2VsZWN0ID0gJ2F1dG8nLCAvLyBib29sIChpbnQzMl90KQotICAgIC8vIFBsZWFzZSBzZWUgTWVkaWFGb3JtYXQuS0VZX0lTX0RFRkFVTFQuCi0gICAga0tleVRyYWNrSXNEZWZhdWx0ICAgID0gJ2RmbHQnLCAvLyBib29sIChpbnQzMl90KQotICAgIC8vIFNpbWlsYXIgdG8gTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSBidXQgcGVydGFpbnMgdG8gYXYgdHJhY2tzIGFzIHdlbGwuCi0gICAga0tleVRyYWNrSXNGb3JjZWQgICAgID0gJ2ZyY2QnLCAvLyBib29sIChpbnQzMl90KQotCi0gICAgLy8gSDI2NCBzdXBwbGVtZW50YWwgZW5oYW5jZW1lbnQgaW5mb3JtYXRpb24gb2Zmc2V0cy9zaXplcwotICAgIGtLZXlTRUkgICAgICAgICAgICAgICA9ICdzZWkgJywgLy8gcmF3IGRhdGEKLQotICAgIC8vIE1QRUcgdXNlciBkYXRhIG9mZnNldHMKLSAgICBrS2V5TXBlZ1VzZXJEYXRhICAgICAgPSAnbXB1ZCcsIC8vIHNpemVfdFtdCi0KLSAgICAvLyBTaXplIG9mIE5BTFUgbGVuZ3RoIGluIG1rdi9tcDQKLSAgICBrS2V5TmFsTGVuZ3RoU2l6ZSAgICAgPSAnbmFscycsIC8vIGludDMyX3QKLQotICAgIC8vIEhEUiByZWxhdGVkCi0gICAga0tleUhkclN0YXRpY0luZm8gICAgPSAnaGRyUycsIC8vIEhEUlN0YXRpY0luZm8KLQotICAgIC8vIGNvbG9yIGFzcGVjdHMKLSAgICBrS2V5Q29sb3JSYW5nZSAgICAgICA9ICdjUm5nJywgLy8gaW50MzJfdCwgY29sb3IgcmFuZ2UsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlJhbmdlCi0gICAga0tleUNvbG9yUHJpbWFyaWVzICAgPSAnY1BybScsIC8vIGludDMyX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIFByaW1hcmllcywgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUHJpbWFyaWVzCi0gICAga0tleVRyYW5zZmVyRnVuY3Rpb24gPSAndEZ1bicsIC8vIGludDMyX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIEZ1bmN0aW9uLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5UcmFuc2Zlci4KLSAgICBrS2V5Q29sb3JNYXRyaXggICAgICA9ICdjTXR4JywgLy8gaW50MzJfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgTWF0cml4LCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5NYXRyaXhDb2VmZnMuCi0gICAga0tleVRlbXBvcmFsTGF5ZXJJZCAgPSAnaUx5cicsIC8vIGludDMyX3QsIHRlbXBvcmFsIGxheWVyLWlkLiAwLWJhc2VkICgwID0+IGJhc2UgbGF5ZXIpCi0gICAga0tleVRlbXBvcmFsTGF5ZXJDb3VudCA9ICdjTHlyJywgLy8gaW50MzJfdCwgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyBlbmNvZGVkCi0KLSAgICBrS2V5VGlsZVdpZHRoICAgICAgICA9ICd0aWxXJywgLy8gaW50MzJfdCwgSEVJRiB0aWxlIHdpZHRoCi0gICAga0tleVRpbGVIZWlnaHQgICAgICAgPSAndGlsSCcsIC8vIGludDMyX3QsIEhFSUYgdGlsZSBoZWlnaHQKLSAgICBrS2V5R3JpZFJvd3MgICAgICAgICA9ICdncmRSJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIHJvd3MKLSAgICBrS2V5R3JpZENvbHMgICAgICAgICA9ICdncmRDJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIGNvbHVtbnMKLSAgICBrS2V5SWNjUHJvZmlsZSAgICAgICA9ICdwcm9mJywgLy8gcmF3IGRhdGEsIElDQyBwcm9maWxlIGRhdGEKLSAgICBrS2V5SXNQcmltYXJ5SW1hZ2UgICA9ICdwcmltJywgLy8gYm9vbCAoaW50MzJfdCksIGltYWdlIHRyYWNrIGlzIHRoZSBwcmltYXJ5IGltYWdlCi0gICAga0tleUZyYW1lQ291bnQgICAgICAgPSAnbmZybScsIC8vIGludDMyX3QsIHRvdGFsIG51bWJlciBvZiBmcmFtZSBpbiB2aWRlbyB0cmFjawotICAgIGtLZXlFeGlmT2Zmc2V0ICAgICAgID0gJ2V4b2YnLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgb2Zmc2V0Ci0gICAga0tleUV4aWZTaXplICAgICAgICAgPSAnZXhzeicsIC8vIGludDY0X3QsIEV4aWYgZGF0YSBzaXplCi0gICAga0tleUlzRXhpZiAgICAgICAgICAgPSAnZXhpZicsIC8vIGJvb2wgKGludDMyX3QpIGJ1ZmZlciBjb250YWlucyBleGlmIGRhdGEgYmxvY2sKLQotICAgIGtLZXlQY21CaWdFbmRpYW4gICAgID0gJ3BjbWInLCAvLyBib29sIChpbnQzMl90KQotCi0gICAgLy8gS2V5IGZvciBBTEFDIE1hZ2ljIENvb2tpZQotICAgIGtLZXlBbGFjTWFnaWNDb29raWUgID0gJ2FsbWMnLCAvLyByYXcgZGF0YQotfTsKLQotZW51bSB7Ci0gICAga1R5cGVFU0RTICAgICAgICA9ICdlc2RzJywKLSAgICBrVHlwZUFWQ0MgICAgICAgID0gJ2F2Y2MnLAotICAgIGtUeXBlSFZDQyAgICAgICAgPSAnaHZjYycsCi0gICAga1R5cGVEMjYzICAgICAgICA9ICdkMjYzJywKLX07Ci0KLWVudW0gewotICAgIGtDcnlwdG9Nb2RlVW5lbmNyeXB0ZWQgPSAwLAotICAgIGtDcnlwdG9Nb2RlQWVzQ3RyICAgICAgPSAxLAotICAgIGtDcnlwdG9Nb2RlQWVzQ2JjICAgICAgPSAyLAotfTsKLQotY2xhc3MgUGFyY2VsOwotCi1jbGFzcyBNZXRhRGF0YUJhc2UgewotcHVibGljOgotICAgIE1ldGFEYXRhQmFzZSgpOwotICAgIE1ldGFEYXRhQmFzZShjb25zdCBNZXRhRGF0YUJhc2UgJmZyb20pOwotICAgIE1ldGFEYXRhQmFzZSYgb3BlcmF0b3IgPSAoY29uc3QgTWV0YURhdGFCYXNlICYpOwotCi0gICAgdmlydHVhbCB+TWV0YURhdGFCYXNlKCk7Ci0KLSAgICBlbnVtIFR5cGUgewotICAgICAgICBUWVBFX05PTkUgICAgID0gJ25vbmUnLAotICAgICAgICBUWVBFX0NfU1RSSU5HID0gJ2NzdHInLAotICAgICAgICBUWVBFX0lOVDMyICAgID0gJ2luMzInLAotICAgICAgICBUWVBFX0lOVDY0ICAgID0gJ2luNjQnLAotICAgICAgICBUWVBFX0ZMT0FUICAgID0gJ2Zsb2EnLAotICAgICAgICBUWVBFX1BPSU5URVIgID0gJ3B0ciAnLAotICAgICAgICBUWVBFX1JFQ1QgICAgID0gJ3JlY3QnLAotICAgIH07Ci0KLSAgICB2b2lkIGNsZWFyKCk7Ci0gICAgYm9vbCByZW1vdmUodWludDMyX3Qga2V5KTsKLQotICAgIGJvb2wgc2V0Q1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKLSAgICBib29sIHNldEludDMyKHVpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSk7Ci0gICAgYm9vbCBzZXRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgdmFsdWUpOwotICAgIGJvb2wgc2V0RmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCB2YWx1ZSk7Ci0gICAgYm9vbCBzZXRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqdmFsdWUpOwotCi0gICAgYm9vbCBzZXRSZWN0KAotICAgICAgICAgICAgdWludDMyX3Qga2V5LAotICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwKLSAgICAgICAgICAgIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKTsKLQotICAgIGJvb2wgZmluZENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICoqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEludDMyKHVpbnQzMl90IGtleSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCAqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqKnZhbHVlKSBjb25zdDsKLQotICAgIGJvb2wgZmluZFJlY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBrZXksCi0gICAgICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICp0b3AsCi0gICAgICAgICAgICBpbnQzMl90ICpyaWdodCwgaW50MzJfdCAqYm90dG9tKSBjb25zdDsKLQotICAgIGJvb2wgc2V0RGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90IHR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGJvb2wgZmluZERhdGEodWludDMyX3Qga2V5LCB1aW50MzJfdCAqdHlwZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKnNpemUpIGNvbnN0OwotCi0gICAgYm9vbCBoYXNEYXRhKHVpbnQzMl90IGtleSkgY29uc3Q7Ci0KLSAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7Ci0gICAgdm9pZCBkdW1wVG9Mb2coKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQnBNZWRpYVNvdXJjZTsKLSAgICBmcmllbmQgY2xhc3MgQm5NZWRpYVNvdXJjZTsKLSAgICBmcmllbmQgY2xhc3MgQm5NZWRpYUV4dHJhY3RvcjsKLSAgICBmcmllbmQgY2xhc3MgTWV0YURhdGE7Ci0KLSAgICBzdHJ1Y3QgdHlwZWRfZGF0YTsKLSAgICBzdHJ1Y3QgUmVjdDsKLSAgICBzdHJ1Y3QgTWV0YURhdGFJbnRlcm5hbDsKLSAgICBNZXRhRGF0YUludGVybmFsICptSW50ZXJuYWxEYXRhOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICZwYXJjZWwpOwotICAgIHN0YXR1c190IHVwZGF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRVRBX0RBVEFfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKaW5kZXggMGEzNDJiOC4uMTVlYTU3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKQEAgLTEsMjAgKzEsMTcgQEAKLS8vIFRPRE86IGNoYW5nZSBpdCBiYWNrIHRvIGNjX2xpYnJhcnlfc2hhcmVkIHdoZW4gdGhlcmUgaXMgYSB3YXkgdG8KLS8vIGV4cG9zZSBtZWRpYSBtZXRyaWNzIGFzIHN0YWJsZSBBUEkuCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFtZXRyaWNzIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIklNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIiwKICAgICAgICAgIk1lZGlhQW5hbHl0aWNzSXRlbS5jcHAiLAorICAgICAgICAiTWVkaWFNZXRyaWNzLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApAQCAtMzIsNCArMjksMTQgQEAKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCisKKyAgICAvLyBlbnVtZXJhdGUgc3RhYmxlIGVudHJ5IHBvaW50cywgZm9yIGFwZXggdXNlCisgICAgc3R1YnM6IHsKKyAgICAgICAgc3ltYm9sX2ZpbGU6ICJsaWJtZWRpYW1ldHJpY3MubWFwLnR4dCIsCisgICAgICAgIHZlcnNpb25zOiBbCisgICAgICAgICAgICAiMSIgLAorICAgICAgICBdCisgICAgfSwKIH0KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggMjhhNzc0Ni4uOTExNDkyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcApAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQW5hbHl0aWNzU2VydmljZSwgZGF0YSwgcmVwbHkpOwogCiAgICAgICAgICAgICBib29sIGZvcmNlbmV3OwotICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbTsKKyAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCk7CiAKICAgICAgICAgICAgIGRhdGEucmVhZEJvb2woJmZvcmNlbmV3KTsKICAgICAgICAgICAgIGl0ZW0tPnJlYWRGcm9tUGFyY2VsKGRhdGEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAppbmRleCAxMzVjOWI2Li4wMmMyM2IxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcApAQCAtNTIsNiArNTIsMTcgQEAKIGNvbnN0IGNoYXIgKiBjb25zdCBNZWRpYUFuYWx5dGljc0l0ZW06OkVuYWJsZWRQcm9wZXJ0eVBlcnNpc3QgID0gInBlcnNpc3QubWVkaWEubWV0cmljcy5lbmFibGVkIjsKIGNvbnN0IGludCBNZWRpYUFuYWx5dGljc0l0ZW06OkVuYWJsZWRQcm9wZXJ0eV9kZWZhdWx0ICA9IDE7CiAKKy8vIFNvIGNhbGxlciBkb2Vzbid0IG5lZWQgdG8ga25vdyBzaXplIG9mIGFsbG9jYXRlZCBzcGFjZQorTWVkaWFBbmFseXRpY3NJdGVtICpNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgpCit7CisgICAgcmV0dXJuIE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtLZXlOb25lKTsKK30KKworTWVkaWFBbmFseXRpY3NJdGVtICpNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShNZWRpYUFuYWx5dGljc0l0ZW06OktleSBrZXkpCit7CisgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrZXkpOworICAgIHJldHVybiBpdGVtOworfQogCiAvLyBhY2Nlc3MgZnVuY3Rpb25zIGZvciB0aGUgY2xhc3MKIE1lZGlhQW5hbHl0aWNzSXRlbTo6TWVkaWFBbmFseXRpY3NJdGVtKCkKQEAgLTQ3OCw3ICs0ODksNyBAQAogLy8gY2FsbGVyIHJlc3BvbnNpYmxlIGZvciB0aGUgcmV0dXJuZWQgc3RyaW5nCiBib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6Z2V0Q1N0cmluZyhNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgY2hhciAqKnZhbHVlKSB7CiAgICAgUHJvcCAqcHJvcCA9IGZpbmRQcm9wKG5hbWUpOwotICAgIGlmIChwcm9wID09IE5VTEwgfHwgcHJvcC0+bVR5cGUgIT0ga1R5cGVEb3VibGUpIHsKKyAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlQ1N0cmluZykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CkBAIC00ODcsNiArNDk4LDE4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRTdHJpbmcoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIHN0ZDo6c3RyaW5nICp2YWx1ZSkgeworICAgIFByb3AgKnByb3AgPSBmaW5kUHJvcChuYW1lKTsKKyAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlQ1N0cmluZykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIHN0ZDo6c3RyaW5nIG1ha2VzIGEgY29weSBmb3IgdXMKKyAgICAgICAgKnZhbHVlID0gcHJvcC0+dS5DU3RyaW5nVmFsdWU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiAvLyByZW1vdmUgaW5kaWNhdGVkIGtleXMgYW5kIHRoZWlyIHZhbHVlcwogLy8gcmV0dXJuIHZhbHVlIGlzICMga2V5cyByZW1vdmVkCiBpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6ZmlsdGVyKGludCBuLCBNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgYXR0cnNbXSkgewpAQCAtNjMwLDYgKzY1MywxOSBAQAogLy8KIAogaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSkgeworICAgIGludDMyX3QgdmVyc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICBzd2l0Y2godmVyc2lvbikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsMChkYXRhKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgTWVkaWFBbmFseXRpY3NJdGVtIFBhcmNlbCB2ZXJzaW9uOiAlZCIsIHZlcnNpb24pOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK2ludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpyZWFkRnJvbVBhcmNlbDAoY29uc3QgUGFyY2VsJiBkYXRhKSB7CiAgICAgLy8gaW50byAndGhpcycgb2JqZWN0CiAgICAgLy8gLi4gd2UgbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZyB0byBwdXQgYXdheS4KICAgICBtS2V5ID0gZGF0YS5yZWFkQ1N0cmluZygpOwpAQCAtNjc5LDggKzcxNSwyMyBAQAogfQogCiBpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKmRhdGEpIHsKKwogICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiAtMTsKIAorICAgIGludDMyX3QgdmVyc2lvbiA9IDA7CisgICAgZGF0YS0+d3JpdGVJbnQzMih2ZXJzaW9uKTsKKworICAgIHN3aXRjaCh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICByZXR1cm4gd3JpdGVUb1BhcmNlbDAoZGF0YSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIE1lZGlhQW5hbHl0aWNzSXRlbSBQYXJjZWwgdmVyc2lvbjogJWQiLCB2ZXJzaW9uKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6d3JpdGVUb1BhcmNlbDAoUGFyY2VsICpkYXRhKSB7CiAKICAgICBkYXRhLT53cml0ZUNTdHJpbmcobUtleS5jX3N0cigpKTsKICAgICBkYXRhLT53cml0ZUludDMyKG1QaWQpOwpAQCAtNzI1LDYgKzc3NiwxNCBAQAogICAgIHJldHVybiAwOwogfQogCitjb25zdCBjaGFyICpNZWRpYUFuYWx5dGljc0l0ZW06OnRvQ1N0cmluZygpIHsKKyAgIHJldHVybiB0b0NTdHJpbmcoUFJPVE9fTEFTVCk7Cit9CisKK2NvbnN0IGNoYXIgKiBNZWRpYUFuYWx5dGljc0l0ZW06OnRvQ1N0cmluZyhpbnQgdmVyc2lvbikgeworICAgIHN0ZDo6c3RyaW5nIHZhbCA9IHRvU3RyaW5nKHZlcnNpb24pOworICAgIHJldHVybiBzdHJkdXAodmFsLmNfc3RyKCkpOworfQogCiBzdGQ6OnN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OnRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRvU3RyaW5nKFBST1RPX0xBU1QpOwpAQCAtODU1LDggKzkxNCw2IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgcCA9IHRoaXMtPnRvU3RyaW5nKCk7Ci0gICAgICAgIEFMT0dXKCJVbmFibGUgdG8gcmVjb3JkOiAlcyBbZm9yY2VuZXc9JWRdIiwgcC5jX3N0cigpLCBmb3JjZW5ldyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CkBAIC0xMDE0LDUgKzEwNzEsMTcwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vIGEgYnl0ZSBhcnJheTsgY29udGVudHMgYXJlCisvLyBvdmVyYWxsIGxlbmd0aCAodWludDMyKSBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYKKy8vIGVuY29kaW5nIHZlcnNpb24gKHVpbnQzMikKKy8vIGNvdW50IG9mIHByb3BlcnRpZXMgKHVpbnQzMikKKy8vIE4gY29waWVzIG9mOgorLy8gICAgIHByb3BlcnR5IG5hbWUgYXMgbGVuZ3RoKGludDE2KSwgYnl0ZXMKKy8vICAgICAgICAgdGhlIGJ5dGVzIFdJTEwgaW5jbHVkZSB0aGUgbnVsbCB0ZXJtaW5hdG9yIG9mIHRoZSBuYW1lCisvLyAgICAgdHlwZSAodWludDggLS0gMSBieXRlKQorLy8gICAgIHNpemUgb2YgdmFsdWUgZmllbGQgKGludDE2IC0tIDIgYnl0ZXMpCisvLyAgICAgdmFsdWUgKHNpemUgYmFzZWQgb24gdHlwZSkKKy8vICAgICAgIGludDMyLCBpbnQ2NCwgZG91YmxlIC0tIGxpdHRsZSBlbmRpYW4gNC84LzggYnl0ZXMgcmVzcGVjdGl2ZWx5CisvLyAgICAgICBjc3RyaW5nIC0tIE4gYnl0ZXMgb2YgdmFsdWUgW1dJVEggdGVybWluYXRvcl0KKworZW51bSB7IGtJbnQzMiA9IDAsIGtJbnQ2NCwga0RvdWJsZSwga1JhdGUsIGtDU3RyaW5nfTsKKworYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OmR1bXBBdHRyaWJ1dGVzKGNoYXIgKipwYnVmZmVyLCBzaXplX3QgKnBsZW5ndGgpIHsKKworICAgIGNoYXIgKmJ1aWxkID0gTlVMTDsKKworICAgIGlmIChwYnVmZmVyID09IE5VTEwgfHwgcGxlbmd0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBjb25zaXN0ZW5jeSBmb3IgdGhlIGNhbGxlciwgd2hvIG93bnMgd2hhdGV2ZXIgY29tZXMgYmFjayBpbiB0aGlzIHBvaW50ZXIuCisgICAgKnBidWZmZXIgPSBOVUxMOworCisgICAgLy8gZmlyc3QsIGxldCdzIGNhbGN1bGF0ZSBzaXplcworICAgIGludDMyX3QgZ29hbCA9IDA7CisgICAgaW50MzJfdCB2ZXJzaW9uID0gMDsKKworICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQzMl90KTsgICAvLyBvdmVyYWxsIGxlbmd0aCwgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQKKyAgICBnb2FsICs9IHNpemVvZih1aW50MzJfdCk7ICAgLy8gZW5jb2RpbmcgdmVyc2lvbgorICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQzMl90KTsgICAvLyAjIHByb3BlcnRpZXMKKworICAgIGludDMyX3QgY291bnQgPSBtUHJvcENvdW50OworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50OyBpKysgKSB7CisgICAgICAgIFByb3AgKnByb3AgPSAmbVByb3BzW2ldOworICAgICAgICBnb2FsICs9IHNpemVvZih1aW50MTZfdCk7ICAgICAgICAgICAvLyBuYW1lIGxlbmd0aAorICAgICAgICBnb2FsICs9IHN0cmxlbihwcm9wLT5tTmFtZSkgKyAxOyAgICAvLyBzdHJpbmcgKyBudWxsCisgICAgICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQ4X3QpOyAgICAgICAgICAgIC8vIHR5cGUKKyAgICAgICAgZ29hbCArPSBzaXplb2YodWludDE2X3QpOyAgICAgICAgICAgLy8gc2l6ZSBvZiB2YWx1ZQorICAgICAgICBzd2l0Y2ggKHByb3AtPm1UeXBlKSB7CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDY0OgorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IHNpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6CisgICAgICAgICAgICAgICAgICAgIGdvYWwgKz0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlQ1N0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoICsgYWN0dWFsIHN0cmluZyArIG51bGwKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSBzdHJsZW4ocHJvcC0+dS5DU3RyaW5nVmFsdWUpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZm91bmQgYmFkIFByb3AgdHlwZTogJWQsIGlkeCAlZCwgbmFtZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPm1UeXBlLCBpLCBwcm9wLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgYSBzaXplLi4uIGxldCdzIGFsbG9jYXRlIGFuZCBmaWxsCisgICAgYnVpbGQgPSAoY2hhciAqKW1hbGxvYyhnb2FsKTsKKyAgICBpZiAoYnVpbGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbWVtc2V0KGJ1aWxkLCAwLCBnb2FsKTsKKworICAgIGNoYXIgKmZpbGxpbmcgPSBidWlsZDsKKworI2RlZmluZSBfSU5TRVJUKHZhbCwgc2l6ZSkgXAorICAgIHsgbWVtY3B5KGZpbGxpbmcsICYodmFsKSwgKHNpemUpKTsgZmlsbGluZyArPSAoc2l6ZSk7fQorI2RlZmluZSBfSU5TRVJUU1RSSU5HKHZhbCwgc2l6ZSkgXAorICAgIHsgbWVtY3B5KGZpbGxpbmcsICh2YWwpLCAoc2l6ZSkpOyBmaWxsaW5nICs9IChzaXplKTt9CisKKyAgICBfSU5TRVJUKGdvYWwsIHNpemVvZihpbnQzMl90KSk7CisgICAgX0lOU0VSVCh2ZXJzaW9uLCBzaXplb2YoaW50MzJfdCkpOworICAgIF9JTlNFUlQoY291bnQsIHNpemVvZihpbnQzMl90KSk7CisKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudDsgaSsrICkgeworICAgICAgICBQcm9wICpwcm9wID0gJm1Qcm9wc1tpXTsKKyAgICAgICAgaW50MTZfdCBhdHRyTmFtZUxlbiA9IHN0cmxlbihwcm9wLT5tTmFtZSkgKyAxOworICAgICAgICBfSU5TRVJUKGF0dHJOYW1lTGVuLCBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBfSU5TRVJUU1RSSU5HKHByb3AtPm1OYW1lLCBhdHRyTmFtZUxlbik7ICAgIC8vIHRlcm1pbmF0aW9uIGluY2x1ZGVkCisgICAgICAgIGludDhfdCBlbGVtdHlwZTsKKyAgICAgICAgaW50MTZfdCBlbGVtc2l6ZTsKKyAgICAgICAgc3dpdGNoIChwcm9wLT5tVHlwZSkgeworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtJbnQzMjsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUuaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtJbnQ2NDsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IHNpemVvZihpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUuaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXR5cGUgPSBrRG91YmxlOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gc2l6ZW9mKGRvdWJsZSk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LmRvdWJsZVZhbHVlLCBzaXplb2YoZG91YmxlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtSYXRlOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LnJhdGUuY291bnQsIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUucmF0ZS5kdXJhdGlvbiwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUNTdHJpbmc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtDU3RyaW5nOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gc3RybGVuKHByb3AtPnUuQ1N0cmluZ1ZhbHVlKSArIDE7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVFNUUklORyhwcm9wLT51LkNTdHJpbmdWYWx1ZSwgZWxlbXNpemUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBpZiBjYW4ndCBlbmNvZGU7IHdhcm5pbmcgaWYgY2FuJ3QgZGVjb2RlCisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmb3VuZCBiYWQgUHJvcCB0eXBlOiAlZCwgaWR4ICVkLCBuYW1lICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+bVR5cGUsIGksIHByb3AtPm1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRuZXNzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJ1aWxkICsgZ29hbCAhPSBmaWxsaW5nKSB7CisgICAgICAgIEFMT0dFKCJwcm9ibGVtcyBwb3B1bGF0aW5nOyB3cm90ZT0lZCBwbGFubmVkPSVkIiwKKyAgICAgICAgICAgICAgKGludCkoZmlsbGluZy1idWlsZCksIGdvYWwpOworICAgICAgICBnb3RvIGJhZG5lc3M7CisgICAgfQorCisgICAgKnBidWZmZXIgPSBidWlsZDsKKyAgICAqcGxlbmd0aCA9IGdvYWw7CisKKyAgICByZXR1cm4gdHJ1ZTsKKworICBiYWRuZXNzOgorICAgIGZyZWUoYnVpbGQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzLmNwcCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDkxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFNZXRyaWNzIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljcy5oPgorCisvLworLy8gcHJvdmlkZSBhIEMtaXNoIGludGVyZmFjZSB0aGF0IGlzIGVhc2llciB0byBzdGFiaWxpemUgdGhhbiB0aGUgZXhpc3RpbmcgQysrCisvLyBpbnRlcmZhY2UKKy8vCisvLyBBTEwgZnVuY3Rpb25zIHJldHVybmluZyBhIGNoYXIgKiBnaXZlIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgYWxsb2NhdGVkIGJ1ZmZlcgorLy8gdG8gdGhlIGNhbGxlci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0byBjYWxsIGZyZWUoKSBvbiB0aGF0IHBvaW50ZXIuCisvLworCisvLyBtYW5hZ2UgdGhlIG92ZXJhbGwgcmVjb3JkCittZWRpYW1ldHJpY3NfaGFuZGxlX3QgbWVkaWFtZXRyaWNzX2NyZWF0ZShtZWRpYW1ldHJpY3NrZXlfdCBrZXkpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrZXkpOworICAgIHJldHVybiAobWVkaWFtZXRyaWNzX2hhbmRsZV90KSBpdGVtOworfQorCit2b2lkIG1lZGlhbWV0cmljc19kZWxldGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybjsKKyAgICBkZWxldGUgaXRlbTsKK30KKworbWVkaWFtZXRyaWNza2V5X3QgbWVkaWFtZXRyaWNzX2dldEtleShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHN0cmR1cChpdGVtLT5nZXRLZXkoKS5jX3N0cigpKTsKK30KKworLy8gbnVwbGF5ZXIsIGV0IGFsIHVzZSBpdCB3aGVuIGFjdGluZyBhcyBwcm94aWVzCit2b2lkIG1lZGlhbWV0cmljc19zZXRVaWQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgdWlkX3QgdWlkKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0VWlkKHVpZCk7Cit9CisKKy8vIHNldCBhdHRyaWJ1dGVzCisvLworCit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldEludDMyKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0Q1N0cmluZyhhdHRyLCB2YWx1ZSk7Cit9CisKKy8vIGZ1c2VkIGdldC9hZGQvc2V0OyBpZiBhdHRyIHdhc24ndCB0aGVyZSwgaXQncyBhIHNpbXBsZSBzZXQuCisvLworCit2b2lkIG1lZGlhbWV0cmljc19hZGRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZEludDMyKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uKTsKK30KKworLy8gZmluZCAmIGV4dHJhY3QgdmFsdWVzCisvLyByZXR1cm4gaW5kaWNhdGVzIHdoZXRoZXIgYXR0ciBleGlzdHMgKGFuZCB0aHVzIHdoZXRoZXIgdmFsdWUgZmlsbGVkIGluKQorLy8gTlVMTCBwYXJhbWV0ZXIgdmFsdWUgc3VwcHJlc3NlcyBzdG9yYWdlIG9mIHZhbHVlLgorLy8KKworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKiB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0SW50MzIoYXR0ciwgdmFsdWUpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5nZXRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmdldERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIGNvdW50LCBpbnQ2NF90ICogZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0UmF0ZShhdHRyLCBjb3VudCwgZHVyYXRpb24sIHJhdGUpOworfQorCisvLyBOQjogY2FsbGVyIG93bnMgdGhlIHN0cmluZyB0aGF0IGNvbWVzIGJhY2ssIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0Citib29sIG1lZGlhbWV0cmljc19nZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGl0ZW0tPmdldENTdHJpbmcoYXR0ciwgdmFsdWUpOworfQorCisvLyB0byByZWxlYXNlIHN0cmluZ3MgcmV0dXJuZWQgdmlhIGdldENTdHJpbmcoKQordm9pZCBtZWRpYW1ldHJpY3NfZnJlZUNTdHJpbmcoY2hhciAqdmFsdWUpIHsKKyAgICBmcmVlKHZhbHVlKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5zZWxmcmVjb3JkKCk7Cit9CisKKworY29uc3QgY2hhciAqbWVkaWFtZXRyaWNzX3JlYWRhYmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gIiI7CisgICAgcmV0dXJuIGl0ZW0tPnRvQ1N0cmluZygpOworfQorCitpbnQzMl90IG1lZGlhbWV0cmljc19jb3VudChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIGl0ZW0tPmNvdW50KCk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2lzRW5hYmxlZCgpIHsKKyAgICAvLyBzdGF0aWMsIHNvIGRvZXNuJ3QgbmVlZCBhbiBpbnN0YW5jZQorICAgIHJldHVybiBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW06OmlzRW5hYmxlZCgpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXRBdHRyaWJ1dGVzKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5kdW1wQXR0cmlidXRlcyhidWZmZXIsIGxlbmd0aCk7CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKaW5kZXggMjYzY2RlNy4uNGEzNmY2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKQEAgLTE3LDkgKzE3LDEwIEBACiAjaWZuZGVmIEFORFJPSURfTUVESUFfTUVESUFBTkFMWVRJQ1NJVEVNX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9NRURJQUFOQUxZVElDU0lURU1fSAogCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtODEsMTIgKzgyLDE5IEBACiAgICAgICAgICAgICBQUk9UT19MQVNUID0gUFJPVE9fVjEsCiAgICAgICAgIH07CiAKKyAgICBwcml2YXRlOgorICAgICAgICAvLyB1c2UgdGhlIDo6Y3JlYXRlKCkgbWV0aG9kIGluc3RlYWQKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtKCk7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbShLZXkpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oY29uc3QgTWVkaWFBbmFseXRpY3NJdGVtJik7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQW5hbHl0aWNzSXRlbSYpOwogCiAgICAgcHVibGljOgogCisgICAgICAgIHN0YXRpYyBNZWRpYUFuYWx5dGljc0l0ZW0qIGNyZWF0ZShLZXkga2V5KTsKKyAgICAgICAgc3RhdGljIE1lZGlhQW5hbHl0aWNzSXRlbSogY3JlYXRlKCk7CisKICAgICAgICAgLy8gYWNjZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGNsYXNzCi0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSgpOwotICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oS2V5KTsKICAgICAgICAgfk1lZGlhQW5hbHl0aWNzSXRlbSgpOwogCiAgICAgICAgIC8vIFNlc3Npb25JRCB0aWVzIG11bHRpcGxlIHN1Ym1pc3Npb25zIGZvciBzYW1lIGtleSB0b2dldGhlcgpAQCAtMTM0LDYgKzE0Miw3IEBACiAgICAgICAgIGJvb2wgZ2V0UmF0ZShBdHRyLCBpbnQ2NF90ICpjb3VudCwgaW50NjRfdCAqZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSk7CiAgICAgICAgIC8vIENhbGxlciBvd25zIHRoZSByZXR1cm5lZCBzdHJpbmcKICAgICAgICAgYm9vbCBnZXRDU3RyaW5nKEF0dHIsIGNoYXIgKip2YWx1ZSk7CisgICAgICAgIGJvb2wgZ2V0U3RyaW5nKEF0dHIsIHN0ZDo6c3RyaW5nICp2YWx1ZSk7CiAKICAgICAgICAgLy8gcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRvIGNsb3NlIGFueSBleGlzdGluZyBvcGVuCiAgICAgICAgIC8vIHJlY29yZCB3aXRoIHNhbWUga2V5IGJlZm9yZSBlc3RhYmxpc2hpbmcgYSBuZXcgcmVjb3JkCkBAIC0xNzQsMTIgKzE4MywyMiBAQAogICAgICAgICBpbnQzMl90IHdyaXRlVG9QYXJjZWwoUGFyY2VsICopOwogICAgICAgICBpbnQzMl90IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYpOwogCisgICAgICAgIC8vIHN1cHBvcnRzIHRoZSBzdGFibGUgaW50ZXJmYWNlCisgICAgICAgIGJvb2wgZHVtcEF0dHJpYnV0ZXMoY2hhciAqKnBidWZmZXIsIHNpemVfdCAqcGxlbmd0aCk7CisKICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKTsKICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoaW50IHZlcnNpb24pOworICAgICAgICBjb25zdCBjaGFyICp0b0NTdHJpbmcoKTsKKyAgICAgICAgY29uc3QgY2hhciAqdG9DU3RyaW5nKGludCB2ZXJzaW9uKTsKIAogICAgICAgICAvLyBhcmUgd2UgY29sbGVjdGluZyBhbmFseXRpY3MgZGF0YQogICAgICAgICBzdGF0aWMgYm9vbCBpc0VuYWJsZWQoKTsKIAorICAgIHByaXZhdGU6CisgICAgICAgIC8vIGhhbmRsZSBQYXJjZWwgdmVyc2lvbiAwCisgICAgICAgIGludDMyX3Qgd3JpdGVUb1BhcmNlbDAoUGFyY2VsICopOworICAgICAgICBpbnQzMl90IHJlYWRGcm9tUGFyY2VsMChjb25zdCBQYXJjZWwmKTsKKwogICAgIHByb3RlY3RlZDoKIAogICAgICAgICAvLyBtZXJnZSBmaWVsZHMgZnJvbSBhcmcgaW50byB0aGlzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTFlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX01FRElBTUVUUklDU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTUVESUFNRVRSSUNTX0gKKworLy8KKy8vIGRlZmluZSBhIEMgaW50ZXJmYWNlIHRvIHRoZSBtZWRpYSBtZXRyaWNzIGZ1bmN0aW9uYWxpdHkKKy8vCisvLyBBbGwgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgY2hhciAqIG9yIGNvbnN0IGNoYXIgKiBhbHNvIGdpdmUgcmVzcG9uc2liaWxpdHkKKy8vIGZvciB0aGF0IHN0cmluZyB0byB0aGUgY2FsbGVyLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGZyZWUoKQorLy8gb24gdGhhdCBwb2ludGVyIHdoZW4gZG9uZSB1c2luZyB0aGUgdmFsdWUuCisKK19fQkVHSU5fREVDTFMKKworLy8gaW50ZXJuYWxseSByZS1jYXN0IHRvIHRoZSBiZWhpbmQtdGhlLXNjZW5lcyBDKysgY2xhc3MgaW5zdGFuY2UKK3R5cGVkZWYgaW50NjRfdCBtZWRpYW1ldHJpY3NfaGFuZGxlX3Q7Cit0eXBlZGVmIGNvbnN0IGNoYXIgKm1lZGlhbWV0cmljc2tleV90OwordHlwZWRlZiBjb25zdCBjaGFyICphdHRyX3Q7CisKK21lZGlhbWV0cmljc19oYW5kbGVfdCBtZWRpYW1ldHJpY3NfY3JlYXRlKG1lZGlhbWV0cmljc2tleV90IGtleSk7Cit2b2lkIG1lZGlhbWV0cmljc19kZWxldGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK21lZGlhbWV0cmljc2tleV90IG1lZGlhbWV0cmljc19nZXRLZXkobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKKworLy8gc2V0Cit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0UmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbik7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiB2YWx1ZSk7CisKKy8vIGZ1c2VkIGdldC9hZGQvc2V0OyBpZiBhdHRyIHdhc24ndCB0aGVyZSwgaXQncyBhIHNpbXBsZSBzZXQuCisvLyB0aGVzZSBkbyBub3QgcHJvdmlkZSBhdG9taWNpdHkgb3IgbXV0dWFsIGV4Y2x1c2lvbiwgb25seSBzaW1wbGVyIGNvZGUgc2VxdWVuY2VzLgordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19hZGREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY291bnQsIGludDY0X3QgZHVyYXRpb24pOworCisvLyBmaW5kICYgZXh0cmFjdCB2YWx1ZXMKKy8vIHJldHVybiBpbmRpY2F0ZXMgd2hldGhlciBhdHRyIGV4aXN0cyAoYW5kIHRodXMgd2hldGhlciB2YWx1ZSBmaWxsZWQgaW4pCisvLyBOVUxMIHBhcmFtZXRlciB2YWx1ZSBzdXBwcmVzc2VzIHN0b3JhZ2Ugb2YgdmFsdWUuCitib29sIG1lZGlhbWV0cmljc19nZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKiB2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKiB2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICogY291bnQsIGludDY0X3QgKiBkdXJhdGlvbiwgZG91YmxlICpyYXRlKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldENTdHJpbmcobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnZhbHVlKTsKKy8vIHRvIHJlbGVhc2Ugc3RyaW5ncyByZXR1cm5lZCB2aWEgZ2V0Q1N0cmluZygpCit2b2lkIG1lZGlhbWV0cmljc19mcmVlQ1N0cmluZyhjaGFyICp2YWx1ZSk7CisKKy8vICMgb2YgYXR0cmlidXRlcyBzZXQgd2l0aGluIHRoaXMgcmVjb3JkLgoraW50MzJfdCBtZWRpYW1ldHJpY3NfY291bnQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK2Jvb2wgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK2NvbnN0IGNoYXIgKm1lZGlhbWV0cmljc19yZWFkYWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFVpZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCB1aWRfdCB1aWQpOworYm9vbCBtZWRpYW1ldHJpY3NfaXNFbmFibGVkKCk7CisKKy8vIHNlcmlhbGl6ZWQgY29weSBvZiB0aGUgYXR0cmlidXRlcy92YWx1ZXMsIG1vc3RseSBmb3IgdXBzdHJlYW0gZ2V0TWV0cmljcygpIGNhbGxzCisvLyBjYWxsZXIgb3ducyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBhcyBwYXJ0IG9mIHRoaXMgY2FsbC4KK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEF0dHJpYnV0ZXMobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpOworCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9saWJtZWRpYW1ldHJpY3MubWFwLnR4dCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9saWJtZWRpYW1ldHJpY3MubWFwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYyODFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2xpYm1lZGlhbWV0cmljcy5tYXAudHh0CkBAIC0wLDAgKzEsMjkgQEAKK0xJQk1FRElBTUVUUklDU18xIHsKKyAgZ2xvYmFsOgorICAgIG1lZGlhbWV0cmljc19hZGREb3VibGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19hZGRJbnQzMjsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2FkZEludDY0OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfYWRkUmF0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2NvdW50OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfY3JlYXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZGVsZXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZnJlZUNTdHJpbmc7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRBdHRyaWJ1dGVzOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0Q1N0cmluZzsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldERvdWJsZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldEludDMyOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0SW50NjQ7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRLZXk7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRSYXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfaXNFbmFibGVkOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfcmVhZGFibGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZWxmUmVjb3JkOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZzsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldERvdWJsZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldEludDMyOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQ7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZXRSYXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkOyAjIGFwZXgKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCmluZGV4IGNkMjdiZDEuLjA4NTE5Y2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCkBAIC00LDExICs0LDEwIEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYXBsYXllcjIiLAogCiAgICAgc3JjczogWwotICAgICAgICAiSkF1ZGlvVHJhY2suY3BwIiwKICAgICAgICAgIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcCIsCiAgICAgICAgICJtZWRpYXBsYXllcjIuY3BwIiwKICAgICBdLApAQCAtMTcsMjYgKzE2LDIzIEBACiAgICAgICAgICJsaWJhbmRyb2lkX3J1bnRpbWUiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFfb214IiwKLSAgICAgICAgImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKIAogICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYm1lZGlhZHJtIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCiAgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKQEAgLTQ5LDExICs0NSwyMSBAQAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlibWVkaWFwbGF5ZXIyLXByb3RvcyIsCisgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3BsYXllcjIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0MiIsCisgICAgICAgICJsaWJtZWRpYTJfam5pX2NvcmUiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCkBAIC03NCwzICs4MCw0OSBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhMl9qbmlfY29yZSIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJKYXZhVk1IZWxwZXIuY3BwIiwKKyAgICAgICAgIkpBdWRpb1RyYWNrLmNwcCIsCisgICAgICAgICJKTWVkaWEySFRUUFNlcnZpY2UuY3BwIiwKKyAgICAgICAgIkpNZWRpYTJIVFRQQ29ubmVjdGlvbi5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmluZGVyX2hlYWRlcnMiLAorICAgICAgICAibGlibmF0aXZlaGVscGVyX2hlYWRlcl9vbmx5IiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAKaW5kZXggYWMwY2M1Ny4uZmFiNmM2NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCkBAIC0yMSwyNyArMjEsMjggQEAKICNpbmNsdWRlICJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaCIKIAogI2luY2x1ZGUgPGFuZHJvaWRfbWVkaWFfQXVkaW9FcnJvcnMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gVE9ETzogU3RvcmUgSmF2YSBjbGFzcy9tZXRob2RJRCBhcyBhIG1lbWJlciB2YXJpYWJsZSBpbiB0aGUgY2xhc3MuCiAvLyBUT0RPOiBBZGQgTlVMTCAmJiBFeGNlcHRpb24gY2hlY2tzIGFmdGVyIGV2ZXJ5IEpOSSBjYWxsLgogSkF1ZGlvVHJhY2s6OkpBdWRpb1RyYWNrKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPCBVc2FnZXMgb2YgdGhlIGFyZ3VtZW50cyBhcmUgYmVsb3cgPgotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsICAgICAgICAgICAgICAgLy8gQXVkaW9BdWRpb0F0dHJpYnV0ZXMKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRm9ybWF0ICYmIGJ1ZmZlclNpemVJbkJ5dGVzCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0Zvcm1hdCAmJiBidWZmZXJTaXplSW5CeXRlcwogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgICAgICAgICAgICAgLy8gQXVkaW9Gb3JtYXQgJiYgYnVmZmVyU2l6ZUluQnl0ZXMKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9mZmxvYWQKICAgICAgICAgdm9pZCogdXNlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9mZmxvYWQKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlclNpemVJbkJ5dGVzCi0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsICAgICAgICAvLyBBdWRpb0F0dHJpYnV0ZXMKKyAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvVHJhY2sKKyAgICAgICAgY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzLCAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvQXR0cmlidXRlcwogICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyU2l6ZUluQnl0ZXMKIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKwogICAgIGpjbGFzcyBqQXVkaW9UcmFja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2siKTsKLSAgICBtQXVkaW9UcmFja0NscyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGpBdWRpb1RyYWNrQ2xzKTsKKyAgICBtQXVkaW9UcmFja0NscyA9IHJlaW50ZXJwcmV0X2Nhc3Q8amNsYXNzPihlbnYtPk5ld0dsb2JhbFJlZihqQXVkaW9UcmFja0NscykpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoakF1ZGlvVHJhY2tDbHMpOwogCiAgICAgbWF4UmVxdWlyZWRTcGVlZCA9IHN0ZDo6bWluKHN0ZDo6bWF4KG1heFJlcXVpcmVkU3BlZWQsIDEuMGYpLCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgpOwogCkBAIC02NCwxMCArNjUsMTkgQEAKICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKICAgICBqb2JqZWN0IGpCdWlsZGVyT2JqID0gZW52LT5OZXdPYmplY3QoakJ1aWxkZXJDbHMsIGpCdWlsZGVyQ3Rvcik7CiAKLSAgICBqbWV0aG9kSUQgalNldEF1ZGlvQXR0cmlidXRlcyA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0F0dHJpYnV0ZXMiLAotICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXM7KUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKLSAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldEF1ZGlvQXR0cmlidXRlcywKLSAgICAgICAgICAgIEpBdWRpb0F0dHJpYnV0ZXM6OmNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihlbnYsIHBBdHRyaWJ1dGVzLCBzdHJlYW1UeXBlKSk7CisgICAgeworICAgICAgICBzcDxKT2JqZWN0SG9sZGVyPiBhdWRpb0F0dHJpYnV0ZXNPYmo7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGF1ZGlvQXR0cmlidXRlc09iaiA9IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXVkaW9BdHRyaWJ1dGVzT2JqID0gbmV3IEpPYmplY3RIb2xkZXIoCisgICAgICAgICAgICAgICAgICAgIEpBdWRpb0F0dHJpYnV0ZXM6OmNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihlbnYsIE5VTEwpKTsKKyAgICAgICAgfQorICAgICAgICBqbWV0aG9kSUQgalNldEF1ZGlvQXR0cmlidXRlcyA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0F0dHJpYnV0ZXMiLAorICAgICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CisgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLAorICAgICAgICAgICAgICAgIGpTZXRBdWRpb0F0dHJpYnV0ZXMsIGF1ZGlvQXR0cmlidXRlc09iai0+Z2V0Sk9iamVjdCgpKTsKKyAgICB9CiAKICAgICBqbWV0aG9kSUQgalNldEF1ZGlvRm9ybWF0ID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEF1ZGlvRm9ybWF0IiwKICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQ7KUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKQEAgLTkyLDYgKzEwMiw3IEBACiAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0U2Vzc2lvbklkLCBzZXNzaW9uSWQpOwogICAgIH0KIAorICAgIG1GbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7CiAgICAgICAgIGptZXRob2RJRCBqU2V0T2ZmbG9hZGVkUGxheWJhY2sgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0T2ZmbG9hZGVkUGxheWJhY2siLAogICAgICAgICAgICAgICAgICIoWilMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CkBAIC0xMDAsNyArMTExLDkgQEAKICAgICB9CiAKICAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjazsiKTsKLSAgICBtQXVkaW9UcmFja09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKKyAgICBqb2JqZWN0IGpBdWRpb1RyYWNrT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqQnVpbGQpOworICAgIG1BdWRpb1RyYWNrT2JqID0gcmVpbnRlcnByZXRfY2FzdDxqb2JqZWN0PihlbnYtPk5ld0dsb2JhbFJlZihqQXVkaW9UcmFja09iaikpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoakJ1aWxkZXJPYmopOwogCiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7CiAgICAgICAgIC8vIFNldCBvZmZsb2FkIG1vZGUgY2FsbGJhY2sKQEAgLTExNiwxOSArMTI5LDIwIEBACiB9CiAKIEpBdWRpb1RyYWNrOjp+SkF1ZGlvVHJhY2soKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1BdWRpb1RyYWNrQ2xzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQXVkaW9UcmFja09iaik7CiB9CiAKIHNpemVfdCBKQXVkaW9UcmFjazo6ZnJhbWVDb3VudCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkdldE1ldGhvZElEKAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRCdWZmZXJTaXplSW5GcmFtZXMiLCAiKClJIik7CiAgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEJ1ZmZlclNpemVJbkZyYW1lcyk7CiB9CiAKIHNpemVfdCBKQXVkaW9UcmFjazo6Y2hhbm5lbENvdW50KCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldENoYW5uZWxDb3VudCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRDaGFubmVsQ291bnQiLCAiKClJIik7CiAgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldENoYW5uZWxDb3VudCk7CiB9CkBAIC0xNDMsNyArMTU3LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRQbGF5YmFja0hlYWRQb3NpdGlvbiA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldFBsYXliYWNrSGVhZFBvc2l0aW9uIiwgIigpSSIpOwogICAgICpwb3NpdGlvbiA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFBsYXliYWNrSGVhZFBvc2l0aW9uKTsKQEAgLTE1MSwyMSArMTY1LDIxIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1ib29sIEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgamNsYXNzIGpBdWRpb1RpbWVTdGFtcENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wIik7CiAgICAgam9iamVjdCBqQXVkaW9UaW1lU3RhbXBPYmogPSBlbnYtPkFsbG9jT2JqZWN0KGpBdWRpb1RpbWVTdGFtcENscyk7CiAKLSAgICBqZmllbGRJRCBqRnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJmcmFtZVBvc2l0aW9uIiwgIkwiKTsKLSAgICBqZmllbGRJRCBqTmFub1RpbWUgPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAibmFub1RpbWUiLCAiTCIpOworICAgIGpmaWVsZElEIGpGcmFtZVBvc2l0aW9uID0gZW52LT5HZXRGaWVsZElEKGpBdWRpb1RpbWVTdGFtcENscywgImZyYW1lUG9zaXRpb24iLCAiSiIpOworICAgIGpmaWVsZElEIGpOYW5vVGltZSA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJuYW5vVGltZSIsICJKIik7CiAKICAgICBqbWV0aG9kSUQgakdldFRpbWVzdGFtcCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCi0gICAgICAgICAgICAiZ2V0VGltZXN0YW1wIiwgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcClCIik7CisgICAgICAgICAgICAiZ2V0VGltZXN0YW1wIiwgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcDspWiIpOwogICAgIGJvb2wgc3VjY2VzcyA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRUaW1lc3RhbXAsIGpBdWRpb1RpbWVTdGFtcE9iaik7CiAKICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKICAgICBsb25nIGxvbmcgZnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0TG9uZ0ZpZWxkKGpBdWRpb1RpbWVTdGFtcE9iaiwgakZyYW1lUG9zaXRpb24pOwpAQCAtMTc4LDcgKzE5Miw3IEBACiAgICAgdGltZXN0YW1wLm1UaW1lID0gdHM7CiAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9ICh1aW50MzJfdCkgZnJhbWVQb3NpdGlvbjsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcChFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wIF9fdW51c2VkKSB7CkBAIC0xODksNyArMjAzLDcgQEAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkgewogICAgIC8vIFRPRE86IGV4aXN0aW5nIG5hdGl2ZSBBdWRpb1RyYWNrIHJldHVybnMgSU5WQUxJRF9PUEVSQVRJT04gb24gb2ZmbG9hZC9kaXJlY3QvZmFzdCB0cmFja3MuCiAgICAgLy8gU2hvdWxkIHdlIGRvIHRoZSBzYW1lIHRoaW5nPwotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGpjbGFzcyBqUGxheWJhY2tQYXJhbXNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtcyIpOwogICAgIGptZXRob2RJRCBqUGxheWJhY2tQYXJhbXNDdG9yID0gZW52LT5HZXRNZXRob2RJRChqUGxheWJhY2tQYXJhbXNDbHMsICI8aW5pdD4iLCAiKClWIik7CkBAIC0yMjQsNyArMjM4LDcgQEAKIH0KIAogY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgSkF1ZGlvVHJhY2s6OmdldFBsYXliYWNrUmF0ZSgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqbWV0aG9kSUQgakdldFBsYXliYWNrUGFyYW1zID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0UGxheWJhY2tQYXJhbXMiLCAiKClMYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtczsiKTsKQEAgLTI2Niw3ICsyODAsNyBAQAogICAgICAgICByZXR1cm4gbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzKEJBRF9WQUxVRSk7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgam1ldGhvZElEIGpDcmVhdGVWb2x1bWVTaGFwZXIgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiY3JlYXRlVm9sdW1lU2hhcGVyIiwKICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJENvbmZpZ3VyYXRpb247KUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlcjsiKTsKQEAgLTI4Miw3ICsyOTYsNyBAQAogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqU2V0QXV4RWZmZWN0U2VuZExldmVsID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAic2V0QXV4RWZmZWN0U2VuZExldmVsIiwgIihGKUkiKTsKICAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0QXV4RWZmZWN0U2VuZExldmVsLCBsZXZlbCk7CkBAIC0yOTAsMTQgKzMwNCwxNCBAQAogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakF0dGFjaEF1eEVmZmVjdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJhdHRhY2hBdXhFZmZlY3QiLCAiKEkpSSIpOwogICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpBdHRhY2hBdXhFZmZlY3QsIGVmZmVjdElkKTsKICAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7CiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgLy8gVE9ETzogSmF2YSBzZXRTdGVyZW9Wb2x1bWUgaXMgZGVwcmVjYXRlZC4gRG8gd2UgcmVhbGx5IG5lZWQgdGhpcyBtZXRob2Q/CiAgICAgam1ldGhvZElEIGpTZXRTdGVyZW9Wb2x1bWUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0U3RlcmVvVm9sdW1lIiwgIihGRilJIik7CiAgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFN0ZXJlb1ZvbHVtZSwgbGVmdCwgcmlnaHQpOwpAQCAtMzA1LDE0ICszMTksMTQgQEAKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpTZXRWb2x1bWUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0Vm9sdW1lIiwgIihGKUkiKTsKICAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0Vm9sdW1lLCB2b2x1bWUpOwogICAgIHJldHVybiBqYXZhVG9OYXRpdmVTdGF0dXMocmVzdWx0KTsKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnN0YXJ0KCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalBsYXkgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAicGxheSIsICIoKVYiKTsKICAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggdGhlIEphdmEgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGZyb20gcGxheSgpPwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpQbGF5KTsKQEAgLTMyNCw3ICszMzgsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqYnl0ZUFycmF5IGpBdWRpb0RhdGEgPSBlbnYtPk5ld0J5dGVBcnJheShzaXplKTsKICAgICBlbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihqQXVkaW9EYXRhLCAwLCBzaXplLCAoamJ5dGUgKikgYnVmZmVyKTsKIApAQCAtMzUzLDcgKzM2Nyw3IEBACiB9CiAKIHZvaWQgSkF1ZGlvVHJhY2s6OnN0b3AoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqU3RvcCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJzdG9wIiwgIigpViIpOwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTdG9wKTsKICAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggSWxsZWdhbFN0YXRlRXhjZXB0aW9uPwpAQCAtMzY1LDIwICszNzksMjAgQEAKIH0KIAogdm9pZCBKQXVkaW9UcmFjazo6Zmx1c2goKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqRmx1c2ggPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZmx1c2giLCAiKClWIik7CiAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgakZsdXNoKTsKIH0KIAogdm9pZCBKQXVkaW9UcmFjazo6cGF1c2UoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqUGF1c2UgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAicGF1c2UiLCAiKClWIik7CiAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalBhdXNlKTsKICAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggSWxsZWdhbFN0YXRlRXhjZXB0aW9uPwogfQogCiBib29sIEpBdWRpb1RyYWNrOjppc1BsYXlpbmcoKSBjb25zdCB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0UGxheVN0YXRlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFBsYXlTdGF0ZSIsICIoKUkiKTsKICAgICBpbnQgY3VycmVudFBsYXlTdGF0ZSA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFBsYXlTdGF0ZSk7CiAKQEAgLTM5Myw3ICs0MDcsNyBAQAogfQogCiB1aW50MzJfdCBKQXVkaW9UcmFjazo6Z2V0U2FtcGxlUmF0ZSgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRTYW1wbGVSYXRlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFNhbXBsZVJhdGUiLCAiKClJIik7CiAgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFNhbXBsZVJhdGUpOwogfQpAQCAtNDAzLDcgKzQxNyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QnVmZmVyU2l6ZUluRnJhbWVzIiwgIigpSSIpOwogICAgIGludCBidWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMpOwpAQCAtNDE3LDEyICs0MzEsMjYgQEAKIH0KIAogYXVkaW9fZm9ybWF0X3QgSkF1ZGlvVHJhY2s6OmZvcm1hdCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRBdWRpb0Zvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb0Zvcm1hdCIsICIoKUkiKTsKICAgICBpbnQgamF2YUZvcm1hdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvRm9ybWF0KTsKICAgICByZXR1cm4gYXVkaW9Gb3JtYXRUb05hdGl2ZShqYXZhRm9ybWF0KTsKIH0KIAorc2l6ZV90IEpBdWRpb1RyYWNrOjpmcmFtZVNpemUoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0Rm9ybWF0ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICJnZXRGb3JtYXQiLCAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdDsiKTsKKyAgICBqb2JqZWN0IGpBdWRpb0Zvcm1hdE9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEZvcm1hdCk7CisKKyAgICBqY2xhc3MgakF1ZGlvRm9ybWF0Q2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQiKTsKKyAgICBqbWV0aG9kSUQgakdldEZyYW1lU2l6ZUluQnl0ZXMgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgakF1ZGlvRm9ybWF0Q2xzLCAiZ2V0RnJhbWVTaXplSW5CeXRlcyIsICIoKUkiKTsKKyAgICBqaW50IGphdmFGcmFtZVNpemVJbkJ5dGVzID0gZW52LT5DYWxsSW50TWV0aG9kKGpBdWRpb0Zvcm1hdE9iaiwgakdldEZyYW1lU2l6ZUluQnl0ZXMpOworCisgICAgcmV0dXJuIChzaXplX3QpamF2YUZyYW1lU2l6ZUluQnl0ZXM7Cit9CisKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgY29uc3QKIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKQEAgLTQzMiwxMCArNDYwLDYgQEAKICAgICAvLyBUT0RPOiBSZW1vdmUgbG9ncyB0aGF0IGluY2x1ZGVzIHVuYXZhaWxhYmxlIGluZm9ybWF0aW9uIGZyb20gYmVsb3cuCiAvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCiAvLyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMsIG1TdGF0ZSwgbVNlc3Npb25JZCwgbUZsYWdzKTsKLS8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgPwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoJm1BdHRyaWJ1dGVzKSA6IG1TdHJlYW1UeXBlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOwogLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmb3JtYXQoJSN4KSwgY2hhbm5lbCBtYXNrKCUjeCksIGNoYW5uZWwgY291bnQoJXUpXG4iLAogLy8gICAgICAgICAgICAgICAgICBmb3JtYXQoKSwgbUNoYW5uZWxNYXNrLCBjaGFubmVsQ291bnQoKSk7CiAvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHNhbXBsZSByYXRlKCV1KSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoJXUpLCBzcGVlZCglZilcbiIsCkBAIC00NTMsMzggKzQ3Nyw0MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9fcG9ydF9oYW5kbGVfdCBKQXVkaW9UcmFjazo6Z2V0Um91dGVkRGV2aWNlSWQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Citqb2JqZWN0IEpBdWRpb1RyYWNrOjpnZXRSb3V0ZWREZXZpY2UoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0Um91dGVkRGV2aWNlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFJvdXRlZERldmljZSIsCiAgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZUluZm87Iik7Ci0gICAgam9iamVjdCBqQXVkaW9EZXZpY2VJbmZvT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0Um91dGVkRGV2aWNlKTsKLSAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoakF1ZGlvRGV2aWNlSW5mb09iaiwgTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgfQotCi0gICAgamNsYXNzIGpBdWRpb0RldmljZUluZm9DbHMgPSBlbnYtPkZpbmRDbGFzcygiTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvIik7Ci0gICAgam1ldGhvZElEIGpHZXRJZCA9IGVudi0+R2V0TWV0aG9kSUQoakF1ZGlvRGV2aWNlSW5mb0NscywgImdldElkIiwgIigpSSIpOwotICAgIGppbnQgcm91dGVkRGV2aWNlSWQgPSBlbnYtPkNhbGxJbnRNZXRob2QoakF1ZGlvRGV2aWNlSW5mb09iaiwgakdldElkKTsKLSAgICByZXR1cm4gcm91dGVkRGV2aWNlSWQ7CisgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFJvdXRlZERldmljZSk7CiB9CiAKLWF1ZGlvX3Nlc3Npb25fdCBKQXVkaW9UcmFjazo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CitpbnQzMl90IEpBdWRpb1RyYWNrOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRBdWRpb1Nlc3Npb25JZCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb1Nlc3Npb25JZCIsICIoKUkiKTsKICAgICBqaW50IHNlc3Npb25JZCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvU2Vzc2lvbklkKTsKLSAgICByZXR1cm4gKGF1ZGlvX3Nlc3Npb25fdCkgc2Vzc2lvbklkOworICAgIHJldHVybiBzZXNzaW9uSWQ7CiB9CiAKLXN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBqTVAySW1wbENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMkltcGwiKTsKLSAgICBqbWV0aG9kSUQgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICAgICAgICBqTVAySW1wbENscywgInNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjaztJKVoiKTsKLSAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKAotICAgICAgICAgICAgak1QMkltcGxDbHMsIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQsIG1BdWRpb1RyYWNrT2JqLCBkZXZpY2VJZCk7CitzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqU2V0UHJlZmVycmVkRGV2aWNlSWQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0UHJlZmVycmVkRGV2aWNlIiwKKyAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvOylaIik7CisgICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFByZWZlcnJlZERldmljZUlkLCBkZXZpY2UpOwogICAgIHJldHVybiByZXN1bHQgPT0gdHJ1ZSA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOwogfQogCithdWRpb19zdHJlYW1fdHlwZV90IEpBdWRpb1RyYWNrOjpnZXRBdWRpb1N0cmVhbVR5cGUoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0QXVkaW9BdHRyaWJ1dGVzID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldEF1ZGlvQXR0cmlidXRlcyIsCisgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXM7Iik7CisgICAgam9iamVjdCBqQXVkaW9BdHRyaWJ1dGVzID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QXVkaW9BdHRyaWJ1dGVzKTsKKyAgICBqY2xhc3MgakF1ZGlvQXR0cmlidXRlc0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyIpOworICAgIGptZXRob2RJRCBqR2V0Vm9sdW1lQ29udHJvbFN0cmVhbSA9IGVudi0+R2V0TWV0aG9kSUQoakF1ZGlvQXR0cmlidXRlc0NscywKKyAgICAgICAgICAgICJnZXRWb2x1bWVDb250cm9sU3RyZWFtIiwgIigpSSIpOworICAgIGludCBqYXZhQXVkaW9TdHJlYW1UeXBlID0gZW52LT5DYWxsSW50TWV0aG9kKGpBdWRpb0F0dHJpYnV0ZXMsIGpHZXRWb2x1bWVDb250cm9sU3RyZWFtKTsKKyAgICByZXR1cm4gKGF1ZGlvX3N0cmVhbV90eXBlX3QpamF2YUF1ZGlvU3RyZWFtVHlwZTsKK30KKwogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnBlbmRpbmdEdXJhdGlvbihpbnQzMl90ICptc2VjKSB7CiAgICAgaWYgKG1zZWMgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtNTI2LDE4ICs1NTIsNzIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEpBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrIF9fdW51c2VkKSB7Ci0gICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgYWZ0ZXIgYXBwcm9wcmlhdGUgSmF2YSBBdWRpb1RyYWNrIG1ldGhvZCBpcyBhdmFpbGFibGUuCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyLCBqb2JqZWN0IGhhbmRsZXIpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpBZGRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLAorICAgICAgICAgICAgImFkZE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciIsCisgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvUm91dGluZyRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXI7TGFuZHJvaWQvb3MvSGFuZGxlcjspViIpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpBZGRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIsIGxpc3RlbmVyLCBoYW5kbGVyKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEpBdWRpb1RyYWNrOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrIF9fdW51c2VkKSB7Ci0gICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgYWZ0ZXIgYXBwcm9wcmlhdGUgSmF2YSBBdWRpb1RyYWNrIG1ldGhvZCBpcyBhdmFpbGFibGUuCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqUmVtb3ZlT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICJyZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1JvdXRpbmckT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyOylWIik7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalJlbW92ZU9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciwgbGlzdGVuZXIpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBKQXVkaW9UcmFjazo6cmVnaXN0ZXJSb3V0aW5nRGVsZWdhdGVzKAorICAgICAgICBWZWN0b3I8c3RkOjpwYWlyPHNwPEpPYmplY3RIb2xkZXI+LCBzcDxKT2JqZWN0SG9sZGVyPj4+JiByb3V0aW5nRGVsZWdhdGVzKSB7CisgICAgZm9yIChhdXRvIGl0ID0gcm91dGluZ0RlbGVnYXRlcy5iZWdpbigpOyBpdCAhPSByb3V0aW5nRGVsZWdhdGVzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soaXQtPnNlY29uZC0+Z2V0Sk9iamVjdCgpLCBnZXRIYW5kbGVyKGl0LT5zZWNvbmQtPmdldEpPYmplY3QoKSkpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vICAgICAgICAgICAgICAgIFN0YXRpYyBtZXRob2RzIGJlZ2luICAgICAgICAgICAgICAgICAgIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworam9iamVjdCBKQXVkaW9UcmFjazo6Z2V0TGlzdGVuZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpSb3V0aW5nRGVsZWdhdGVDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Sb3V0aW5nRGVsZWdhdGUiKTsKKyAgICBqbWV0aG9kSUQgakdldExpc3RlbmVyID0gZW52LT5HZXRNZXRob2RJRChqUm91dGluZ0RlbGVnYXRlQ2xzLAorICAgICAgICAgICAgImdldExpc3RlbmVyIiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9Sb3V0aW5nJE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcjsiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKHJvdXRpbmdEZWxlZ2F0ZU9iaiwgakdldExpc3RlbmVyKTsKK30KKworam9iamVjdCBKQXVkaW9UcmFjazo6Z2V0SGFuZGxlcihjb25zdCBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZU9iaikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgalJvdXRpbmdEZWxlZ2F0ZUNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1JvdXRpbmdEZWxlZ2F0ZSIpOworICAgIGptZXRob2RJRCBqR2V0SGFuZGxlciA9IGVudi0+R2V0TWV0aG9kSUQoalJvdXRpbmdEZWxlZ2F0ZUNscywKKyAgICAgICAgImdldEhhbmRsZXIiLCAiKClMYW5kcm9pZC9vcy9IYW5kbGVyOyIpOworICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2Qocm91dGluZ0RlbGVnYXRlT2JqLCBqR2V0SGFuZGxlcik7Cit9CisKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmZpbmRCeUtleSgKKyAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxzcDxKT2JqZWN0SG9sZGVyPiwgc3A8Sk9iamVjdEhvbGRlcj4+PiYgbXAsIGNvbnN0IGpvYmplY3Qga2V5KSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGZvciAoYXV0byBpdCA9IG1wLmJlZ2luKCk7IGl0ICE9IG1wLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmIChlbnYtPklzU2FtZU9iamVjdChpdC0+Zmlyc3QtPmdldEpPYmplY3QoKSwga2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQtPmdldEpPYmplY3QoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZCBKQXVkaW9UcmFjazo6ZXJhc2VCeUtleSgKKyAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxzcDxKT2JqZWN0SG9sZGVyPiwgc3A8Sk9iamVjdEhvbGRlcj4+PiYgbXAsIGNvbnN0IGpvYmplY3Qga2V5KSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGZvciAoYXV0byBpdCA9IG1wLmJlZ2luKCk7IGl0ICE9IG1wLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmIChlbnYtPklzU2FtZU9iamVjdChpdC0+Zmlyc3QtPmdldEpPYmplY3QoKSwga2V5KSkgeworICAgICAgICAgICAgbXAuZXJhc2UoaXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLy8gICAgICAgICAgICAgICAgUHJpdmF0ZSBtZXRob2QgYmVnaW5zICAgICAgICAgICAgICAgICAgLy8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC01NTAsNyArNjMwLDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgLy8gUmVmZXJlbmNlZCAiYW5kcm9pZF9tZWRpYV9Wb2x1bWVTaGFwZXIuaCIuCiAgICAgamZsb2F0QXJyYXkgeGFycmF5ID0gbnVsbHB0cjsKQEAgLTU5NSw3ICs2NzUsNyBAQAogam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlVm9sdW1lU2hhcGVyT3BlcmF0aW9uT2JqKAogICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGpjbGFzcyBqQnVpbGRlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb24kQnVpbGRlciIpOwogICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOwpAQCAtNjQ3LDE1ICs3MjcsMTUgQEAKIH0KIAogam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlU3RyZWFtRXZlbnRDYWxsYmFjayhjYWxsYmFja190IGNiZiwgdm9pZCogdXNlcikgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBqQ2FsbGJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJJbXBsJFN0cmVhbUV2ZW50Q2FsbGJhY2siKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpDYWxsYmFja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMiRTdHJlYW1FdmVudENhbGxiYWNrIik7CiAgICAgam1ldGhvZElEIGpDYWxsYmFja0N0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpDYWxsYmFja0NscywgIjxpbml0PiIsICIoSkpKKVYiKTsKICAgICBqb2JqZWN0IGpDYWxsYmFja09iaiA9IGVudi0+TmV3T2JqZWN0KGpDYWxsYmFja0NscywgakNhbGxiYWNrQ3RvciwgdGhpcywgY2JmLCB1c2VyKTsKICAgICByZXR1cm4gakNhbGxiYWNrT2JqOwogfQogCiBqb2JqZWN0IEpBdWRpb1RyYWNrOjpjcmVhdGVDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqY2xhc3MgakV4ZWN1dG9yc0NscyA9IGVudi0+RmluZENsYXNzKCJqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcnMiKTsKICAgICBqbWV0aG9kSUQgak5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChqRXhlY3V0b3JzQ2xzLAogICAgICAgICAgICAgIm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yIiwgIigpTGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yU2VydmljZTsiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiYWExMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkpNZWRpYTJIVFRQQ29ubmVjdGlvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvc2NvcGVkX2xvY2FsX3JlZi5oPgorCisjaW5jbHVkZSAibG9nL2xvZy5oIgorI2luY2x1ZGUgImpuaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga0J1ZmZlclNpemUgPSAzMjc2ODsKKworSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpKTWVkaWEySFRUUENvbm5lY3Rpb24oSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikgeworICAgIG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiA9IGVudi0+TmV3R2xvYmFsUmVmKHRoaXopOworICAgIENIRUNLKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiAhPSBOVUxMKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4gbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcygKKyAgICAgICAgICAgIGVudiwgZW52LT5HZXRPYmplY3RDbGFzcyhtTWVkaWEySFRUUENvbm5lY3Rpb25PYmopKTsKKyAgICBDSEVDSyhtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpICE9IE5VTEwpOworCisgICAgbUNvbm5lY3RNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJjb25uZWN0IiwKKyAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiKTsKKyAgICBDSEVDSyhtQ29ubmVjdE1ldGhvZCAhPSBOVUxMKTsKKworICAgIG1EaXNjb25uZWN0TWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZGlzY29ubmVjdCIsCisgICAgICAgICAgICAiKClWIik7CisgICAgQ0hFQ0sobURpc2Nvbm5lY3RNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtUmVhZEF0TWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAicmVhZEF0IiwKKyAgICAgICAgICAgICIoSltCSSlJIik7CisgICAgQ0hFQ0sobVJlYWRBdE1ldGhvZCAhPSBOVUxMKTsKKworICAgIG1HZXRTaXplTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZ2V0U2l6ZSIsCisgICAgICAgICAgICAiKClKIik7CisgICAgQ0hFQ0sobUdldFNpemVNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtR2V0TUlNRVR5cGVNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJnZXRNSU1FVHlwZSIsCisgICAgICAgICAgICAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsKKyAgICBDSEVDSyhtR2V0TUlNRVR5cGVNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtR2V0VXJpTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZ2V0VXJpIiwKKyAgICAgICAgICAgICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOworICAgIENIRUNLKG1HZXRVcmlNZXRob2QgIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiB0bXAoCisgICAgICAgIGVudiwgZW52LT5OZXdCeXRlQXJyYXkoa0J1ZmZlclNpemUpKTsKKyAgICBtQnl0ZUFycmF5T2JqID0gKGpieXRlQXJyYXkpZW52LT5OZXdHbG9iYWxSZWYodG1wLmdldCgpKTsKKyAgICBDSEVDSyhtQnl0ZUFycmF5T2JqICE9IE5VTEwpOworfQorCitKTWVkaWEySFRUUENvbm5lY3Rpb246On5KTWVkaWEySFRUUENvbm5lY3Rpb24oKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaik7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUJ5dGVBcnJheU9iaik7Cit9CisKK2Jvb2wgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgU3RyaW5nOCB0bXAoIiIpOworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFkZXJzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgdG1wLmFwcGVuZChoZWFkZXJzLT5rZXlBdChpKSk7CisgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzgoIjogIikpOworICAgICAgICAgICAgdG1wLmFwcGVuZChoZWFkZXJzLT52YWx1ZUF0KGkpKTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoU3RyaW5nOCgiXHJcbiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqc3RyaW5nIGp1cmkgPSBlbnYtPk5ld1N0cmluZ1VURih1cmkpOworICAgIGpzdHJpbmcgamhlYWRlcnMgPSBlbnYtPk5ld1N0cmluZ1VURih0bXAuc3RyaW5nKCkpOworCisgICAgamJvb2xlYW4gcmV0ID0KKyAgICAgICAgZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1Db25uZWN0TWV0aG9kLCBqdXJpLCBqaGVhZGVycyk7CisKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGp1cmkpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamhlYWRlcnMpOworCisgICAgcmV0dXJuIChib29sKXJldDsKK30KKwordm9pZCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmRpc2Nvbm5lY3QoKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtRGlzY29ubmVjdE1ldGhvZCk7Cit9CisKK3NzaXplX3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworCisgICAgaWYgKHNpemUgPiBrQnVmZmVyU2l6ZSkgeworICAgICAgICBzaXplID0ga0J1ZmZlclNpemU7CisgICAgfQorCisgICAgamludCBuID0gZW52LT5DYWxsSW50TWV0aG9kKAorICAgICAgICAgICAgbU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtUmVhZEF0TWV0aG9kLCAoamxvbmcpb2Zmc2V0LCBtQnl0ZUFycmF5T2JqLCAoamludClzaXplKTsKKworICAgIGlmIChuID4gMCkgeworICAgICAgICBlbnYtPkdldEJ5dGVBcnJheVJlZ2lvbigKKyAgICAgICAgICAgICAgICBtQnl0ZUFycmF5T2JqLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAoamJ5dGUgKilkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworb2ZmNjRfdCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmdldFNpemUoKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIHJldHVybiAob2ZmNjRfdCkoZW52LT5DYWxsTG9uZ01ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1HZXRTaXplTWV0aG9kKSk7Cit9CisKK3N0YXR1c190IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Z2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpIHsKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAganN0cmluZyBqbWltZSA9IChqc3RyaW5nKWVudi0+Q2FsbE9iamVjdE1ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1HZXRNSU1FVHlwZU1ldGhvZCk7CisgICAgamJvb2xlYW4gZmxhZyA9IGVudi0+RXhjZXB0aW9uQ2hlY2soKTsKKyAgICBpZiAoZmxhZykgeworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoam1pbWUsIDApOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICAqbWltZVR5cGUgPSBTdHJpbmc4KHN0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm1pbWVUeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisgICAgfQorICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGptaW1lLCBzdHIpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpnZXRVcmkoU3RyaW5nOCAqdXJpKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcganVyaSA9IChqc3RyaW5nKWVudi0+Q2FsbE9iamVjdE1ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1HZXRVcmlNZXRob2QpOworICAgIGpib29sZWFuIGZsYWcgPSBlbnYtPkV4Y2VwdGlvbkNoZWNrKCk7CisgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGp1cmksIDApOworICAgICp1cmkgPSBTdHJpbmc4KHN0cik7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoanVyaSwgc3RyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZTM1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkpNZWRpYTJIVFRQU2VydmljZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGpuaS5oPgorCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9zY29wZWRfbG9jYWxfcmVmLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworSk1lZGlhMkhUVFBTZXJ2aWNlOjpKTWVkaWEySFRUUFNlcnZpY2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikgeworICAgIG1NZWRpYTJIVFRQU2VydmljZU9iaiA9IGVudi0+TmV3R2xvYmFsUmVmKHRoaXopOworICAgIENIRUNLKG1NZWRpYTJIVFRQU2VydmljZU9iaiAhPSBOVUxMKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4gbWVkaWEySFRUUFNlcnZpY2VDbGFzcyhlbnYsIGVudi0+R2V0T2JqZWN0Q2xhc3MobU1lZGlhMkhUVFBTZXJ2aWNlT2JqKSk7CisgICAgQ0hFQ0sobWVkaWEySFRUUFNlcnZpY2VDbGFzcy5nZXQoKSAhPSBOVUxMKTsKKworICAgIG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUFNlcnZpY2VDbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJtYWtlSFRUUENvbm5lY3Rpb24iLAorICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUENvbm5lY3Rpb247Iik7CisgICAgQ0hFQ0sobU1ha2VIVFRQQ29ubmVjdGlvbk1ldGhvZCAhPSBOVUxMKTsKK30KKworSk1lZGlhMkhUVFBTZXJ2aWNlOjp+Sk1lZGlhMkhUVFBTZXJ2aWNlKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTWVkaWEySFRUUFNlcnZpY2VPYmopOworfQorCitzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBKTWVkaWEySFRUUFNlcnZpY2U6Om1ha2VIVFRQQ29ubmVjdGlvbigpIHsKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam9iamVjdCBtZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiA9CisgICAgICAgIGVudi0+Q2FsbE9iamVjdE1ldGhvZChtTWVkaWEySFRUUFNlcnZpY2VPYmosIG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2QpOworCisgICAgcmV0dXJuIG5ldyBKTWVkaWEySFRUUENvbm5lY3Rpb24oZW52LCBtZWRpYTJIVFRQQ29ubmVjdGlvbk9iaik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDNlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmNwcApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJKYXZhVk1IZWxwZXIiCisKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3RkOjphdG9taWM8SmF2YVZNICo+IEphdmFWTUhlbHBlcjo6c0phdmFWTShOVUxMKTsKKworLyoKKyAqIE1ha2VzIHRoZSBjdXJyZW50IHRocmVhZCB2aXNpYmxlIHRvIHRoZSBWTS4KKyAqCisgKiBUaGUgSk5JRW52IHBvaW50ZXIgcmV0dXJuZWQgaXMgb25seSB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLCBhbmQKKyAqIHRodXMgbXVzdCBiZSB0dWNrZWQgaW50byB0aHJlYWQtbG9jYWwgc3RvcmFnZS4KKyAqLworc3RhdGljIGludCBqYXZhQXR0YWNoVGhyZWFkKGNvbnN0IGNoYXIqIHRocmVhZE5hbWUsIEpOSUVudioqIHBFbnYpIHsKKyAgICBKYXZhVk1BdHRhY2hBcmdzIGFyZ3M7CisgICAgSmF2YVZNKiB2bTsKKyAgICBqaW50IHJlc3VsdDsKKworICAgIHZtID0gSmF2YVZNSGVscGVyOjpnZXRKYXZhVk0oKTsKKyAgICBpZiAodm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSk5JX0VSUjsKKyAgICB9CisKKyAgICBhcmdzLnZlcnNpb24gPSBKTklfVkVSU0lPTl8xXzQ7CisgICAgYXJncy5uYW1lID0gKGNoYXIqKSB0aHJlYWROYW1lOworICAgIGFyZ3MuZ3JvdXAgPSBOVUxMOworCisgICAgcmVzdWx0ID0gdm0tPkF0dGFjaEN1cnJlbnRUaHJlYWQocEVudiwgKHZvaWQqKSAmYXJncyk7CisgICAgaWYgKHJlc3VsdCAhPSBKTklfT0spIHsKKyAgICAgICAgQUxPR0koIk5PVEU6IGF0dGFjaCBvZiB0aHJlYWQgJyVzJyBmYWlsZWRcbiIsIHRocmVhZE5hbWUpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBEZXRhY2ggdGhlIGN1cnJlbnQgdGhyZWFkIGZyb20gdGhlIHNldCB2aXNpYmxlIHRvIHRoZSBWTS4KKyAqLworc3RhdGljIGludCBqYXZhRGV0YWNoVGhyZWFkKHZvaWQpIHsKKyAgICBKYXZhVk0qIHZtOworICAgIGppbnQgcmVzdWx0OworCisgICAgdm0gPSBKYXZhVk1IZWxwZXI6OmdldEphdmFWTSgpOworICAgIGlmICh2bSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBKTklfRVJSOworICAgIH0KKworICAgIHJlc3VsdCA9IHZtLT5EZXRhY2hDdXJyZW50VGhyZWFkKCk7CisgICAgaWYgKHJlc3VsdCAhPSBKTklfT0spIHsKKyAgICAgICAgQUxPR0UoIkVSUk9SOiB0aHJlYWQgZGV0YWNoIGZhaWxlZFxuIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBXaGVuIHN0YXJ0aW5nIGEgbmF0aXZlIHRocmVhZCB0aGF0IHdpbGwgYmUgdmlzaWJsZSBmcm9tIHRoZSBWTSwgd2UKKyAqIGJvdW5jZSB0aHJvdWdoIHRoaXMgdG8gZ2V0IHRoZSByaWdodCBhdHRhY2gvZGV0YWNoIGFjdGlvbi4KKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbGxzIGZyZWUoYXJncykKKyAqLworc3RhdGljIGludCBqYXZhVGhyZWFkU2hlbGwodm9pZCogYXJncykgeworICAgIHZvaWQqIHN0YXJ0ID0gKCh2b2lkKiopYXJncylbMF07CisgICAgdm9pZCogdXNlckRhdGEgPSAoKHZvaWQgKiopYXJncylbMV07CisgICAgY2hhciogbmFtZSA9IChjaGFyKikgKCh2b2lkICoqKWFyZ3MpWzJdOyAgICAgICAgLy8gd2Ugb3duIHRoaXMgc3RvcmFnZQorICAgIGZyZWUoYXJncyk7CisgICAgSk5JRW52KiBlbnY7CisgICAgaW50IHJlc3VsdDsKKworICAgIC8qIGhvb2sgdXMgaW50byB0aGUgVk0gKi8KKyAgICBpZiAoamF2YUF0dGFjaFRocmVhZChuYW1lLCAmZW52KSAhPSBKTklfT0spIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHN0YXJ0IHRoZSB0aHJlYWQgcnVubmluZyAqLworICAgIHJlc3VsdCA9ICgqKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdClzdGFydCkodXNlckRhdGEpOworCisgICAgLyogdW5ob29rIHVzICovCisgICAgamF2YURldGFjaFRocmVhZCgpOworICAgIGZyZWUobmFtZSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVGhpcyBpcyBpbnZva2VkIGZyb20gYW5kcm9pZENyZWF0ZVRocmVhZEV0YygpIHZpYSB0aGUgY2FsbGJhY2sKKyAqIHNldCB3aXRoIGFuZHJvaWRTZXRDcmVhdGVUaHJlYWRGdW5jKCkuCisgKgorICogV2UgbmVlZCB0byBjcmVhdGUgdGhlIG5ldyB0aHJlYWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGdldHMgaG9va2VkCisgKiBpbnRvIHRoZSBWTSBiZWZvcmUgaXQgcmVhbGx5IHN0YXJ0cyBleGVjdXRpbmcuCisgKi8KK3N0YXRpYyBpbnQgamF2YUNyZWF0ZVRocmVhZEV0YygKKyAgICAgICAgYW5kcm9pZF90aHJlYWRfZnVuY190IGVudHJ5RnVuY3Rpb24sCisgICAgICAgIHZvaWQqIHVzZXJEYXRhLAorICAgICAgICBjb25zdCBjaGFyKiB0aHJlYWROYW1lLAorICAgICAgICBpbnQzMl90IHRocmVhZFByaW9yaXR5LAorICAgICAgICBzaXplX3QgdGhyZWFkU3RhY2tTaXplLAorICAgICAgICBhbmRyb2lkX3RocmVhZF9pZF90KiB0aHJlYWRJZCkgeworICAgIHZvaWQqKiBhcmdzID0gKHZvaWQqKikgbWFsbG9jKDMgKiBzaXplb2Yodm9pZCopKTsgICAvLyBqYXZhVGhyZWFkU2hlbGwgbXVzdCBmcmVlCisgICAgaW50IHJlc3VsdDsKKworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGhyZWFkTmFtZSA9PSBudWxscHRyLCAidGhyZWFkTmFtZSBub3QgcHJvdmlkZWQgdG8gamF2YUNyZWF0ZVRocmVhZEV0YyIpOworCisgICAgYXJnc1swXSA9ICh2b2lkKikgZW50cnlGdW5jdGlvbjsKKyAgICBhcmdzWzFdID0gdXNlckRhdGE7CisgICAgYXJnc1syXSA9ICh2b2lkKikgc3RyZHVwKHRocmVhZE5hbWUpOyAgIC8vIGphdmFUaHJlYWRTaGVsbCBtdXN0IGZyZWUKKworICAgIHJlc3VsdCA9IGFuZHJvaWRDcmVhdGVSYXdUaHJlYWRFdGMoamF2YVRocmVhZFNoZWxsLCBhcmdzLAorICAgICAgICB0aHJlYWROYW1lLCB0aHJlYWRQcmlvcml0eSwgdGhyZWFkU3RhY2tTaXplLCB0aHJlYWRJZCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitKTklFbnYgKkphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCkgeworICAgIEpOSUVudiAqZW52OworICAgIEphdmFWTSAqdm0gPSBzSmF2YVZNLmxvYWQoKTsKKyAgICBDSEVDSyh2bSAhPSBOVUxMKTsKKworICAgIGlmICh2bS0+R2V0RW52KCh2b2lkICoqKSZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgIT0gSk5JX09LKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBlbnY7Cit9CisKKy8vc3RhdGljCitKYXZhVk0gKkphdmFWTUhlbHBlcjo6Z2V0SmF2YVZNKCkgeworICAgIHJldHVybiBzSmF2YVZNLmxvYWQoKTsKK30KKworLy8gc3RhdGljCit2b2lkIEphdmFWTUhlbHBlcjo6c2V0SmF2YVZNKEphdmFWTSAqdm0pIHsKKyAgICBzSmF2YVZNLnN0b3JlKHZtKTsKKworICAgIC8vIEVuc3VyZSB0aGF0IFRocmVhZCgvKmNhbkNhbGxKYXZhKi8gdHJ1ZSkgaW4gbGlidXRpbHMgaXMgYXR0YWNoZWQgdG8gdGhlIFZNLgorICAgIC8vIFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgZG9uZSBieSBydW50aW1lLCBidXQgd2hlbiBsaWJ1dGlscyBpcyB1c2VkIHdpdGggbGlua2VyCisgICAgLy8gbmFtZXNwYWNlLCBDcmVhdGVUaHJlYWRGdW5jIHNob3VsZCBiZSBpbml0aWFsaXplZCBzZXBhcmF0ZWx5IHdpdGhpbiB0aGUgbmFtZXNwYWNlLgorICAgIGFuZHJvaWRTZXRDcmVhdGVUaHJlYWRGdW5jKChhbmRyb2lkX2NyZWF0ZV90aHJlYWRfZm4pIGphdmFDcmVhdGVUaHJlYWRFdGMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAKaW5kZXggYThlMWQxZi4uYjRmYTBjMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCkBAIC0yMiw4ICsyMiw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAogbmFtZXNwYWNlIHsKQEAgLTQ0LDMxICs0MiwyOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCi0gICAgICAgICAgICBtU3RyZWFtVHlwZSwgbUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHZvbHVtZSglZilcbiIsIG1Wb2x1bWUpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgbXNlYyBwZXIgZnJhbWUoJWYpLCBsYXRlbmN5ICglZClcbiIsCi0gICAgICAgICAgICBtTXNlY3NQZXJGcmFtZSwgKG1UcmFjayAhPSAwKSA/IG1UcmFjay0+bGF0ZW5jeSgpIDogLTEpOworICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgPyBtSkF1ZGlvVHJhY2stPmxhdGVuY3koKSA6IC0xKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGF1eCBlZmZlY3QgaWQoJWQpLCBzZW5kIGxldmVsICglZilcbiIsCiAgICAgICAgICAgICBtQXV4RWZmZWN0SWQsIG1TZW5kTGV2ZWwpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+ZHVtcChmZCwgYXJncyk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+ZHVtcChmZCwgYXJncyk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Ok1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIHVpZF90IHVpZCwgaW50IHBpZCwKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLCBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKQotICAgIDogbUNhbGxiYWNrKE5VTEwpLAotICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpLAotICAgICAgbUNhbGxiYWNrRGF0YShOVUxMKSwKLSAgICAgIG1TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9NVVNJQyksCi0gICAgICBtTGVmdFZvbHVtZSgxLjApLAotICAgICAgbVJpZ2h0Vm9sdW1lKDEuMCksCitNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoaW50MzJfdCBzZXNzaW9uSWQsIHVpZF90IHVpZCwgaW50IHBpZCwKKyAgICAgICAgY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKQorICAgIDogbUNhbGxiYWNrKG51bGxwdHIpLAorICAgICAgbUNhbGxiYWNrQ29va2llKG51bGxwdHIpLAorICAgICAgbUNhbGxiYWNrRGF0YShudWxscHRyKSwKKyAgICAgIG1Wb2x1bWUoMS4wKSwKICAgICAgIG1QbGF5YmFja1JhdGUoQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSwKICAgICAgIG1TYW1wbGVSYXRlSHooMCksCiAgICAgICBtTXNlY3NQZXJGcmFtZSgwKSwKQEAgLTc4LDI4ICs3MywxOSBAQAogICAgICAgbVBpZChwaWQpLAogICAgICAgbVNlbmRMZXZlbCgwLjApLAogICAgICAgbUF1eEVmZmVjdElkKDApLAotICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpLAotICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkKGZhbHNlKSwKLSAgICAgIG1EZXZpY2VDYWxsYmFjayhkZXZpY2VDYWxsYmFjaykgeworICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKLSAgICBpZiAoYXR0ciAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBpZiAobUF0dHJpYnV0ZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7CisKKyAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxscHRyKSB7CisgICAgICAgIG1BdHRyaWJ1dGVzID0gbmV3IEpPYmplY3RIb2xkZXIoYXR0cmlidXRlcyk7CiAgICAgfQogCiAgICAgc2V0TWluQnVmZmVyQ291bnQoKTsKKyAgICBtUm91dGluZ0RlbGVnYXRlcy5jbGVhcigpOwogfQogCiBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6fk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCkgewogICAgIGNsb3NlKCk7Ci0gICAgZnJlZShtQXR0cmlidXRlcyk7CiAgICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7CiB9CiAKQEAgLTEyNiwzMSArMTEyLDMxIEBACiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmJ1ZmZlclNpemUoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpICogbUZyYW1lU2l6ZTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5mcmFtZUNvdW50KCkgKiBtRnJhbWVTaXplOwogfQogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpmcmFtZUNvdW50KCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5mcmFtZUNvdW50KCk7CiB9CiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmNoYW5uZWxDb3VudCgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5jaGFubmVsQ291bnQoKTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZnJhbWVTaXplKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIHJldHVybiBtRnJhbWVTaXplOwpAQCAtMTU4LDEwICsxNDQsMTAgQEAKIAogdWludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmxhdGVuY3kgKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmxhdGVuY3koKTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5sYXRlbmN5KCk7CiB9CiAKIGZsb2F0IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojptc2Vjc1BlckZyYW1lKCkgY29uc3QgewpAQCAtMTcxLDE4ICsxNTcsMTggQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRQb3NpdGlvbihwb3NpdGlvbik7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAodHMpOwogfQogCiAvLyBUT0RPOiBSZW1vdmUgdW5uZWNlc3NhcnkgY2FsbHMgdG8gZ2V0UGxheWVkT3V0RHVyYXRpb25VcygpCkBAIC0xOTUsNyArMTgxLDcgQEAKIC8vIENhbGN1bGF0ZSBkdXJhdGlvbiBvZiBwbGF5ZWQgc2FtcGxlcyBpZiBwbGF5ZWQgYXQgbm9ybWFsIHJhdGUgKGkuZS4sIDEuMCkuCiBpbnQ2NF90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwIHx8IG1TYW1wbGVSYXRlSHogPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0ciB8fCBtU2FtcGxlUmF0ZUh6ID09IDApIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0yMDMsMjIgKzE4OSwxOCBAQAogICAgIGludDY0X3QgbnVtRnJhbWVzUGxheWVkQXRVczsKICAgICBBdWRpb1RpbWVzdGFtcCB0czsKIAotICAgIHN0YXR1c190IHJlcyA9IG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtSkF1ZGlvVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisKICAgICBpZiAocmVzID09IE9LKSB7ICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IG1peGluZyBhdWRpbyB0cmFja3MgYW5kIG9mZmxvYWRlZCB0cmFja3MuCiAgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IHRzLm1Qb3NpdGlvbjsKICAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IHRzLm1UaW1lLnR2X3NlYyAqIDEwMDAwMDBMTCArIHRzLm1UaW1lLnR2X25zZWMgLyAxMDAwOwogICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IE9LICVkICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7Ci0gICAgfSBlbHNlIGlmIChyZXMgPT0gV09VTERfQkxPQ0spIHsgLy8gY2FzZSAyOiB0cmFuc2l0b3J5IHN0YXRlIG9uIHN0YXJ0IG9mIGEgbmV3IHRyYWNrCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSAyOiB0cmFuc2l0b3J5IHN0YXRlIG9uIHN0YXJ0IG9mIGEgbmV3IHRyYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSAzOiB0cmFuc2l0b3J5IGF0IG5ldyB0cmFjayBvciBhdWRpbyBmYXN0IHRyYWNrcy4KICAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gMDsKICAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IG5vd1VzOwogICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IFdPVUxEX0JMT0NLICVkICVsbGQiLAogICAgICAgICAvLyAgICAgICAgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOwotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCi0gICAgICAgIHJlcyA9IG1UcmFjay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCk7Ci0gICAgICAgIENIRUNLX0VRKHJlcywgKHN0YXR1c190KU9LKTsKLSAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IG5vd1VzOwotICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzICs9IDEwMDBMTCAqIG1UcmFjay0+bGF0ZW5jeSgpIC8gMjsgLyogWFhYICovCi0gICAgICAgIC8vQUxPR0QoImdldFBvc2l0aW9uOiAldSAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOwogICAgIH0KIAogICAgIC8vIENIRUNLX0VRKG51bUZyYW1lc1BsYXllZCAmICgxIDw8IDMxKSwgMCk7ICAvLyBjYW4ndCBiZSBuZWdhdGl2ZSB1bnRpbCAxMi40IGhycywgdGVzdApAQCAtMjQ0LDEwOCArMjI2LDU1IEBACiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICpmcmFtZXN3cml0dGVuKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgZXRzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+Z2V0VGltZXN0YW1wKCZldHMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1KQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKCZldHMpOwogICAgIGlmIChzdGF0dXMgPT0gT0sgfHwgc3RhdHVzID09IFdPVUxEX0JMT0NLKSB7CiAgICAgICAgICpmcmFtZXN3cml0dGVuID0gKHVpbnQzMl90KWV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF07CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgIG1BdHRyaWJ1dGVzID0gKGF0dHJpYnV0ZXMgPT0gbnVsbHB0cikgPyBudWxscHRyIDogbmV3IEpPYmplY3RIb2xkZXIoYXR0cmlidXRlcyk7CiB9CiAKLVN0cmluZzggIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpIHsKK2F1ZGlvX3N0cmVhbV90eXBlX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0IHsKKyAgICBBTE9HVigiZ2V0QXVkaW9TdHJlYW1UeXBlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9ERUZBVUxUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRQYXJhbWV0ZXJzKGtleXMpOwotfQotCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcykgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoYXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUF0dHJpYnV0ZXMpOwotICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1BdHRyaWJ1dGVzID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cmlidXRlcyk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIC8vIGRvIG5vdCBhbGxvdyBkaXJlY3Qgc3RyZWFtIHR5cGUgbW9kaWZpY2F0aW9uIGlmIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldAotICAgIGlmIChtQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICB9CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmNsb3NlX2woKSB7Ci0gICAgbVRyYWNrLmNsZWFyKCk7CisgICAgbUpBdWRpb1RyYWNrLmNsZWFyKCk7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpvcGVuKAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAotICAgICAgICBib29sIGRvTm90UmVjb25uZWN0LAogICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50KSB7Ci0gICAgQUxPR1YoIm9wZW4oJXUsICVkLCAweCV4LCAweCV4LCAlZCwgJWQgMHgleCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZvcm1hdCwgYnVmZmVyQ291bnQsIG1TZXNzaW9uSWQsIGZsYWdzKTsKKyAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsIDB4JXgsICVkIDB4JXgpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBmb3JtYXQsIG1TZXNzaW9uSWQsIGZsYWdzKTsKIAogICAgIC8vIG9mZmxvYWRpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2FsbGJhY2sgbW9kZSBmb3Igbm93LgogICAgIC8vIG9mZmxvYWRJbmZvIG11c3QgYmUgcHJlc2VudCBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0CiAgICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSAmJgotICAgICAgICAgICAgKChjYiA9PSBOVUxMKSB8fCAob2ZmbG9hZEluZm8gPT0gTlVMTCkpKSB7CisgICAgICAgICAgICAoKGNiID09IG51bGxwdHIpIHx8IChvZmZsb2FkSW5mbyA9PSBudWxscHRyKSkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICAvLyBjb21wdXRlIGZyYW1lIGNvdW50IGZvciB0aGUgQXVkaW9UcmFjayBpbnRlcm5hbCBidWZmZXIKLSAgICBzaXplX3QgZnJhbWVDb3VudDsKLSAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgewotICAgICAgICBmcmFtZUNvdW50ID0gMDsgLy8gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHRyeSB0byBlc3RpbWF0ZSB0aGUgYnVmZmVyIHByb2Nlc3NpbmcgZmV0Y2ggc2l6ZSBmcm9tIEF1ZGlvRmxpbmdlci4KLSAgICAgICAgLy8gZnJhbWVzUGVyQnVmZmVyIGlzIGFwcHJveGltYXRlIGFuZCBnZW5lcmFsbHkgY29ycmVjdCwgZXhjZXB0IHdoZW4gaXQncyBub3QgOi0pLgotICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIG1TdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lc1BlckJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogYWZGcmFtZUNvdW50IC8gYWZTYW1wbGVSYXRlOwotCi0gICAgICAgIGlmIChidWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyB1c2Ugc3VnZ2VzdGVkRnJhbWVDb3VudAotICAgICAgICAgICAgYnVmZmVyQ291bnQgPSAoc3VnZ2VzdGVkRnJhbWVDb3VudCArIGZyYW1lc1BlckJ1ZmZlciAtIDEpIC8gZnJhbWVzUGVyQnVmZmVyOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGFyZ3VtZW50IGJ1ZmZlckNvdW50IGFnYWluc3QgdGhlIG1pbmludW0gYnVmZmVyIGNvdW50Ci0gICAgICAgIGlmIChidWZmZXJDb3VudCAhPSAwICYmIGJ1ZmZlckNvdW50IDwgbU1pbkJ1ZmZlckNvdW50KSB7Ci0gICAgICAgICAgICBBTE9HVigiYnVmZmVyQ291bnQgKCVkKSBpbmNyZWFzZWQgdG8gJWQiLCBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsKLSAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gbU1pbkJ1ZmZlckNvdW50OwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIGZyYW1lQ291bnQgaXMgMCwgdGhlbiBBdWRpb1RyYWNrIHdpbGwgZ2V0IGZyYW1lIGNvdW50IGZyb20gQXVkaW9GbGluZ2VyCi0gICAgICAgIC8vIHdoaWNoIHdpbGwgYmUgdGhlIG1pbmltdW0gc2l6ZSBwZXJtaXR0ZWQuCi0gICAgICAgIGZyYW1lQ291bnQgPSBidWZmZXJDb3VudCAqIGZyYW1lc1BlckJ1ZmZlcjsKLSAgICB9CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPQorICAgICAgICAgICAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgPyAwIDogc3VnZ2VzdGVkRnJhbWVDb3VudDsKIAogICAgIGlmIChjaGFubmVsTWFzayA9PSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKICAgICAgICAgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKQEAgLTM1OSwzMiArMjg4LDIzIEBACiAgICAgbUNhbGxiYWNrID0gY2I7CiAgICAgbUNhbGxiYWNrQ29va2llID0gY29va2llOwogCi0gICAgc3A8QXVkaW9UcmFjaz4gdDsKLSAgICBDYWxsYmFja0RhdGEgKm5ld2NiZCA9IE5VTEw7CisgICAgc3A8SkF1ZGlvVHJhY2s+IGpUOworICAgIENhbGxiYWNrRGF0YSAqbmV3Y2JkID0gbnVsbHB0cjsKIAotICAgIEFMT0dWKCJjcmVhdGluZyBuZXcgQXVkaW9UcmFjayIpOworICAgIEFMT0dWKCJjcmVhdGluZyBuZXcgSkF1ZGlvVHJhY2siKTsKIAotICAgIGlmIChtQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbHB0cikgewogICAgICAgICBuZXdjYmQgPSBuZXcgQ2FsbGJhY2tEYXRhKHRoaXMpOwotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCi0gICAgICAgICAgICAgICAgbmV3Y2JkLAotICAgICAgICAgICAgICAgIDAsICAvLyBub3RpZmljYXRpb24gZnJhbWVzCi0gICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSywKLSAgICAgICAgICAgICAgICBvZmZsb2FkSW5mbywKLSAgICAgICAgICAgICAgICBtVWlkLAotICAgICAgICAgICAgICAgIG1QaWQsCi0gICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCi0gICAgICAgICAgICAgICAgMS4wZiwgIC8vIGRlZmF1bHQgdmFsdWUgZm9yIG1heFJlcXVpcmVkU3BlZWQKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgIGpUID0gbmV3IEpBdWRpb1RyYWNrKAorICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCisgICAgICAgICAgICAgICAgIG5ld2NiZCwKKyAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMgIT0gbnVsbHB0ciA/IG1BdHRyaWJ1dGVzLT5nZXRKT2JqZWN0KCkgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAxLjBmKTsgIC8vIGRlZmF1bHQgdmFsdWUgZm9yIG1heFJlcXVpcmVkU3BlZWQKICAgICB9IGVsc2UgewogICAgICAgICAvLyBUT0RPOiBEdWUgdG8gYnVmZmVyIG1lbW9yeSBjb25jZXJucywgd2UgdXNlIGEgbWF4IHRhcmdldCBwbGF5YmFjayBzcGVlZAogICAgICAgICAvLyBiYXNlZCBvbiBtUGxheWJhY2tSYXRlIGF0IHRoZSB0aW1lIG9mIG9wZW4gKGluc3RlYWQgb2Yga01heFJlcXVpcmVkU3BlZWQpLApAQCAtMzk0LDczICszMTQsNjIgQEAKICAgICAgICAgQUxPR1dfSUYodGFyZ2V0U3BlZWQgIT0gbVBsYXliYWNrUmF0ZS5tU3BlZWQsCiAgICAgICAgICAgICAgICAgInRyYWNrIHRhcmdldCBzcGVlZDolZiBjbGFtcGVkIGZyb20gcGxheWJhY2sgc3BlZWQ6JWYiLAogICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLCBtUGxheWJhY2tSYXRlLm1TcGVlZCk7Ci0gICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgIE5VTEwsIC8vIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgTlVMTCwgLy8gdXNlciBkYXRhCi0gICAgICAgICAgICAgICAgMCwgLy8gbm90aWZpY2F0aW9uIGZyYW1lcwotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfREVGQVVMVCwKLSAgICAgICAgICAgICAgICBOVUxMLCAvLyBvZmZsb2FkIGluZm8KLSAgICAgICAgICAgICAgICBtVWlkLAotICAgICAgICAgICAgICAgIG1QaWQsCi0gICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCi0gICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQsCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICBqVCA9IG5ldyBKQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMgIT0gbnVsbHB0ciA/IG1BdHRyaWJ1dGVzLT5nZXRKT2JqZWN0KCkgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCk7CiAgICAgfQogCi0gICAgaWYgKCh0ID09IDApIHx8ICh0LT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikpIHsKKyAgICBpZiAoalQgPT0gMCkgewogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyB0cmFjayIpOwogICAgICAgICBkZWxldGUgbmV3Y2JkOwogICAgICAgICAvLyB0IGdvZXMgb3V0IG9mIHNjb3BlLCBzbyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBzdWNjZXNzZnVsIEF1ZGlvVHJhY2sgaW5pdGlhbGl6YXRpb24gaW1wbGllcyBhIGxlZ2FjeSBzdHJlYW0gdHlwZSB3YXMgZ2VuZXJhdGVkCi0gICAgICAgIC8vIGZyb20gdGhlIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgbVN0cmVhbVR5cGUgPSB0LT5zdHJlYW1UeXBlKCk7CiAgICAgfQogCi0gICAgQ0hFQ0soKHQgIT0gTlVMTCkgJiYgKChtQ2FsbGJhY2sgPT0gTlVMTCkgfHwgKG5ld2NiZCAhPSBOVUxMKSkpOworICAgIENIRUNLKChqVCAhPSBudWxscHRyKSAmJiAoKG1DYWxsYmFjayA9PSBudWxscHRyKSB8fCAobmV3Y2JkICE9IG51bGxwdHIpKSk7CiAKICAgICBtQ2FsbGJhY2tEYXRhID0gbmV3Y2JkOwogICAgIEFMT0dWKCJzZXRWb2x1bWUiKTsKLSAgICB0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgalQtPnNldFZvbHVtZShtVm9sdW1lKTsKIAogICAgIG1TYW1wbGVSYXRlSHogPSBzYW1wbGVSYXRlOwogICAgIG1GbGFncyA9IGZsYWdzOwogICAgIG1Nc2Vjc1BlckZyYW1lID0gMUUzZiAvIChtUGxheWJhY2tSYXRlLm1TcGVlZCAqIHNhbXBsZVJhdGUpOwotICAgIG1GcmFtZVNpemUgPSB0LT5mcmFtZVNpemUoKTsKLSAgICBtVHJhY2sgPSB0OworICAgIG1GcmFtZVNpemUgPSBqVC0+ZnJhbWVTaXplKCk7CisgICAgbUpBdWRpb1RyYWNrID0galQ7CiAKICAgICByZXR1cm4gdXBkYXRlVHJhY2tfbCgpOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6dXBkYXRlVHJhY2tfbCgpIHsKLSAgICBpZiAobVRyYWNrID09IE5VTEwpIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAogICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOwogICAgIC8vIE5vdGUgc29tZSBvdXRwdXQgZGV2aWNlcyBtYXkgZ2l2ZSB1cyBhIGRpcmVjdCB0cmFjayBldmVuIHRob3VnaCB3ZSBkb24ndCBzcGVjaWZ5IGl0LgogICAgIC8vIEV4YW1wbGU6IExpbmUgYXBwbGljYXRpb24gYi8xNzQ1OTk4Mi4KLSAgICBpZiAoKG1UcmFjay0+Z2V0RmxhZ3MoKQorICAgIGlmICgobUpBdWRpb1RyYWNrLT5nZXRGbGFncygpCiAgICAgICAgICAgICAmIChBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgPT0gMCkgewotICAgICAgICByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICAgICAgcmVzID0gbUpBdWRpb1RyYWNrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CiAgICAgICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwotICAgICAgICAgICAgcmVzID0gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTsKKyAgICAgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOworICAgICAgICAgICAgcmVzID0gbUpBdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtVHJhY2stPnNldE91dHB1dERldmljZShtU2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgaWYgKG1EZXZpY2VDYWxsYmFja0VuYWJsZWQpIHsKLSAgICAgICAgbVRyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCkpOworICAgIGlmIChtUHJlZmVycmVkRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRQcmVmZXJyZWREZXZpY2UobVByZWZlcnJlZERldmljZS0+Z2V0Sk9iamVjdCgpKTsKICAgICB9CisKKyAgICBtSkF1ZGlvVHJhY2stPnJlZ2lzdGVyUm91dGluZ0RlbGVnYXRlcyhtUm91dGluZ0RlbGVnYXRlcyk7CisKICAgICBBTE9HVigidXBkYXRlVHJhY2tfbCgpIERPTkUgc3RhdHVzICVkIiwgcmVzKTsKICAgICByZXR1cm4gcmVzOwogfQpAQCAtNDY4LDEzICszNzcsMTMgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzdGFydCgpIHsKICAgICBBTE9HVigic3RhcnQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgeworICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IG51bGxwdHIpIHsKICAgICAgICAgbUNhbGxiYWNrRGF0YS0+ZW5kVHJhY2tTd2l0Y2goKTsKICAgICB9Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwotICAgICAgICBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVRyYWNrLT5zdGFydCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnNldFZvbHVtZShtVm9sdW1lKTsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1KQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00ODIsMTEgKzM5MSwxMSBAQAogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJsb2NraW5nKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNhbGxiYWNrICE9IE5VTEwsICJEb24ndCBjYWxsIHdyaXRlIGlmIHN1cHBseWluZyBhIGNhbGxiYWNrLiIpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNhbGxiYWNrICE9IG51bGxwdHIsICJEb24ndCBjYWxsIHdyaXRlIGlmIHN1cHBseWluZyBhIGNhbGxiYWNrLiIpOwogCiAgICAgLy9BTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSwgYmxvY2tpbmcpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT53cml0ZShidWZmZXIsIHNpemUsIGJsb2NraW5nKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CkBAIC00OTQsNDUgKzQwMyw0NCBAQAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c3RvcCgpIHsKICAgICBBTE9HVigic3RvcCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zdG9wKCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c3RvcCgpOwogICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Zmx1c2goKSB7CiAgICAgQUxPR1YoImZsdXNoIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPmZsdXNoKCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+Zmx1c2goKTsKICAgICB9CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnBhdXNlKCkgewogICAgIEFMT0dWKCJwYXVzZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5wYXVzZSgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnBhdXNlKCk7CiAgICAgfQogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjbG9zZSgpIHsKICAgICBBTE9HVigiY2xvc2UiKTsKLSAgICBzcDxBdWRpb1RyYWNrPiB0cmFjazsKKyAgICBzcDxKQXVkaW9UcmFjaz4gdHJhY2s7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIHRyYWNrID0gbVRyYWNrOwotICAgICAgICBjbG9zZV9sKCk7IC8vIGNsZWFycyBtVHJhY2sKKyAgICAgICAgdHJhY2sgPSBtSkF1ZGlvVHJhY2s7CisgICAgICAgIGNsb3NlX2woKTsgLy8gY2xlYXJzIG1KQXVkaW9UcmFjawogICAgIH0KICAgICAvLyBkZXN0cnVjdGlvbiBvZiB0aGUgdHJhY2sgb2NjdXJzIG91dHNpZGUgb2YgbXV0ZXguCiB9CiAKLXZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIEFMT0dWKCJzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnQsIHJpZ2h0KTsKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBBTE9HVigic2V0Vm9sdW1lKCVmKSIsIHZvbHVtZSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIG1MZWZ0Vm9sdW1lID0gbGVmdDsKLSAgICBtUmlnaHRWb2x1bWUgPSByaWdodDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpOworICAgIG1Wb2x1bWUgPSB2b2x1bWU7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0Vm9sdW1lKHZvbHVtZSk7CiAgICAgfQogfQogCkBAIC01NDAsMTIgKzQ0OCwxMiBAQAogICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUoJWYgJWYgJWQgJWQpIiwKICAgICAgICAgICAgICAgICByYXRlLm1TcGVlZCwgcmF0ZS5tUGl0Y2gsIHJhdGUubUZhbGxiYWNrTW9kZSwgcmF0ZS5tU3RyZXRjaE1vZGUpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKICAgICAgICAgLy8gcmVtZW1iZXIgcmF0ZSBzbyB0aGF0IHdlIGNhbiBzZXQgaXQgd2hlbiB0aGUgdHJhY2sgaXMgb3BlbmVkCiAgICAgICAgIG1QbGF5YmFja1JhdGUgPSByYXRlOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQotICAgIHN0YXR1c190IHJlcyA9IG1UcmFjay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOworICAgIHN0YXR1c190IHJlcyA9IG1KQXVkaW9UcmFjay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOwogICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC01NTksMTIgKzQ2NywxMiBAQAogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKSB7Ci0gICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSIpOworICAgIEFMT0dWKCJnZXRQbGF5YmFja1JhdGUiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICAqcmF0ZSA9IG1UcmFjay0+Z2V0UGxheWJhY2tSYXRlKCk7CisgICAgKnJhdGUgPSBtSkF1ZGlvVHJhY2stPmdldFBsYXliYWNrUmF0ZSgpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNTcyLDggKzQ4MCw4IEBACiAgICAgQUxPR1YoInNldEF1eEVmZmVjdFNlbmRMZXZlbCglZikiLCBsZXZlbCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1TZW5kTGV2ZWwgPSBsZXZlbDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKGxldmVsKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKGxldmVsKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNTgyLDQ0ICs0OTAsNjMgQEAKICAgICBBTE9HVigiYXR0YWNoQXV4RWZmZWN0KCVkKSIsIGVmZmVjdElkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgbUF1eEVmZmVjdElkID0gZWZmZWN0SWQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7Ci0gICAgQUxPR1YoInNldE91dHB1dERldmljZSglZCkiLCBkZXZpY2VJZCk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKSB7CisgICAgQUxPR1YoInNldFByZWZlcnJlZERldmljZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZUlkOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXQgPSBtSkF1ZGlvVHJhY2stPnNldFByZWZlcnJlZERldmljZShkZXZpY2UpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBtUHJlZmVycmVkRGV2aWNlID0gbmV3IEpPYmplY3RIb2xkZXIoZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKSB7Ci0gICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkIik7Citqb2JqZWN0IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRSb3V0ZWREZXZpY2UoKSB7CisgICAgQUxPR1YoImdldFJvdXRlZERldmljZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVJvdXRlZERldmljZUlkID0gbVRyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRSb3V0ZWREZXZpY2UoKTsKICAgICB9Ci0gICAgKmRldmljZUlkID0gbVJvdXRlZERldmljZUlkOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSB7Ci0gICAgQUxPR1YoImVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2ssICVkIiwgZW5hYmxlZCk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGpSb3V0aW5nRGVsZWdhdGUpIHsKKyAgICBBTE9HVigiYWRkQXVkaW9EZXZpY2VDYWxsYmFjayIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkID0gZW5hYmxlZDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgc3RhdHVzID0gbVRyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RhdHVzID0gbVRyYWNrLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCkpOworICAgIGpvYmplY3QgbGlzdGVuZXIgPSBKQXVkaW9UcmFjazo6Z2V0TGlzdGVuZXIoalJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgaWYgKEpBdWRpb1RyYWNrOjpmaW5kQnlLZXkobVJvdXRpbmdEZWxlZ2F0ZXMsIGxpc3RlbmVyKSA9PSBudWxscHRyKSB7CisgICAgICAgIHNwPEpPYmplY3RIb2xkZXI+IGxpc3RlbmVySG9sZGVyID0gbmV3IEpPYmplY3RIb2xkZXIobGlzdGVuZXIpOworICAgICAgICBqb2JqZWN0IGhhbmRsZXIgPSBKQXVkaW9UcmFjazo6Z2V0SGFuZGxlcihqUm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgc3A8Sk9iamVjdEhvbGRlcj4gcm91dGluZ0RlbGVnYXRlSG9sZGVyID0gbmV3IEpPYmplY3RIb2xkZXIoalJvdXRpbmdEZWxlZ2F0ZSk7CisKKyAgICAgICAgbVJvdXRpbmdEZWxlZ2F0ZXMucHVzaF9iYWNrKHN0ZDo6cGFpcjxzcDxKT2JqZWN0SG9sZGVyPiwgc3A8Sk9iamVjdEhvbGRlcj4+KAorICAgICAgICAgICAgICAgIGxpc3RlbmVySG9sZGVyLCByb3V0aW5nRGVsZWdhdGVIb2xkZXIpKTsKKworICAgICAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdEZWxlZ2F0ZUhvbGRlci0+Z2V0Sk9iamVjdCgpLCBoYW5kbGVyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpIHsKKyAgICBBTE9HVigicmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSA9IG51bGxwdHI7CisgICAgaWYgKChyb3V0aW5nRGVsZWdhdGUgPSBKQXVkaW9UcmFjazo6ZmluZEJ5S2V5KG1Sb3V0aW5nRGVsZWdhdGVzLCBsaXN0ZW5lcikpICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtSkF1ZGlvVHJhY2stPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2socm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgfQorICAgICAgICBKQXVkaW9UcmFjazo6ZXJhc2VCeUtleShtUm91dGluZ0RlbGVnYXRlcywgbGlzdGVuZXIpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC02MzIsMjEgKzU1OSwyMSBAQAogICAgIC8vIGxvY2sgdG8gZW5zdXJlIHdlIGFyZW4ndCBjYXVnaHQgaW4gdGhlIG1pZGRsZSBvZiBhIHRyYWNrIHN3aXRjaC4KICAgICBkYXRhLT5sb2NrKCk7CiAgICAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQgKm1lID0gZGF0YS0+Z2V0T3V0cHV0KCk7Ci0gICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLSAgICBpZiAobWUgPT0gTlVMTCkgeworICAgIEpBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChKQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKKyAgICBpZiAobWUgPT0gbnVsbHB0cikgewogICAgICAgICAvLyBubyBvdXRwdXQgc2V0LCBsaWtlbHkgYmVjYXVzZSB0aGUgdHJhY2sgd2FzIHNjaGVkdWxlZCB0byBiZSByZXVzZWQKICAgICAgICAgLy8gYnkgYW5vdGhlciBwbGF5ZXIsIGJ1dCB0aGUgZm9ybWF0IHR1cm5lZCBvdXQgdG8gYmUgaW5jb21wYXRpYmxlLgogICAgICAgICBkYXRhLT51bmxvY2soKTsKLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBidWZmZXItPnNpemUgPSAwOworICAgICAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+bVNpemUgPSAwOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBzd2l0Y2goZXZlbnQpIHsKLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQTogeworICAgIGNhc2UgSkF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQTogewogICAgICAgICBzaXplX3QgYWN0dWFsU2l6ZSA9ICgqbWUtPm1DYWxsYmFjaykoCi0gICAgICAgICAgICAgICAgbWUsIGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUsCisgICAgICAgICAgICAgICAgbWUsIGJ1ZmZlci0+bURhdGEsIGJ1ZmZlci0+bVNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUsCiAgICAgICAgICAgICAgICAgQ0JfRVZFTlRfRklMTF9CVUZGRVIpOwogCiAgICAgICAgIC8vIExvZyB3aGVuIG5vIGRhdGEgaXMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbGJhY2suCkBAIC02NTgsMjUgKzU4NSwyNSBAQAogICAgICAgICAvLyBUaGlzIGlzIGEgYmVuaWduIGJ1c3ktd2FpdCwgd2l0aCB0aGUgbmV4dCBkYXRhIHJlcXVlc3QgZ2VuZXJhdGVkIDEwIG1zIG9yIG1vcmUgbGF0ZXI7CiAgICAgICAgIC8vIG5ldmVydGhlbGVzcyBmb3IgcG93ZXIgcmVhc29ucywgd2UgZG9uJ3Qgd2FudCB0byBzZWUgdG9vIG1hbnkgb2YgdGhlc2UuCiAKLSAgICAgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDAsICJjYWxsYmFja3dyYXBwZXI6IGVtcHR5IGJ1ZmZlciByZXR1cm5lZCIpOworICAgICAgICBBTE9HVl9JRihhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5tU2l6ZSA+IDAsICJjYWxsYmFja3dyYXBwZXI6IGVtcHR5IGJ1ZmZlciByZXR1cm5lZCIpOwogCi0gICAgICAgIGJ1ZmZlci0+c2l6ZSA9IGFjdHVhbFNpemU7CisgICAgICAgIGJ1ZmZlci0+bVNpemUgPSBhY3R1YWxTaXplOwogICAgICAgICB9IGJyZWFrOwogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgorICAgIGNhc2UgSkF1ZGlvVHJhY2s6OkVWRU5UX1NUUkVBTV9FTkQ6CiAgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IG9jY3VycyBmb3Igb2ZmbG9hZGVkIGNhbGxiYWNrcwogICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1NUUkVBTV9FTkQiKTsKLSAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKKyAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgbnVsbHB0ciAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKICAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9TVFJFQU1fRU5EKTsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSyA6CisgICAgY2FzZSBKQXVkaW9UcmFjazo6RVZFTlRfTkVXX0lBVURJT1RSQUNLIDoKICAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9URUFSX0RPV04iKTsKLSAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCisgICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsICBudWxscHRyIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAogICAgICAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1RFQVJfRE9XTik7CiAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9VTkRFUlJVTjoKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9VTkRFUlJVTjoKICAgICAgICAgLy8gVGhpcyBvY2N1cnMgd2hlbiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSwgdHlwaWNhbGx5CiAgICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgYSBmYWlsdXJlIHRvIHN1cHBseSBkYXRhIHRvIHRoZSBBdWRpb1RyYWNrLiAgSXQgY2FuIGFsc28KICAgICAgICAgLy8gb2NjdXIgaW4gbm9uLW9mZmxvYWRlZCBtb2RlIHdoZW4gdGhlIGF1ZGlvIGRldmljZSBjb21lcyBvdXQgb2Ygc3RhbmRieS4KQEAgLTY5NiwyOSArNjIzLDMxIEBACiAgICAgZGF0YS0+dW5sb2NrKCk7CiB9CiAKLWF1ZGlvX3Nlc3Npb25fdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2Vzc2lvbklkKCkgY29uc3QKLXsKK2ludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CiB9CiAKLXVpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTYW1wbGVSYXRlKCkgY29uc3QKLXsKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFNlc3Npb25JZChjb25zdCBpbnQzMl90IHNlc3Npb25JZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKKyAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogfQogCi1pbnQ2NF90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdAotewordWludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOworfQorCitpbnQ2NF90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgaW50NjRfdCBkdXJhdGlvbjsKLSAgICBpZiAobVRyYWNrLT5nZXRCdWZmZXJEdXJhdGlvbkluVXMoJmR1cmF0aW9uKSAhPSBPSykgeworICAgIGlmIChtSkF1ZGlvVHJhY2stPmdldEJ1ZmZlckR1cmF0aW9uSW5VcygmZHVyYXRpb24pICE9IE9LKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICByZXR1cm4gZHVyYXRpb247CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oCmluZGV4IDMwMTgyNWIuLjJlZDQ2MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oCkBAIC0xNywxOSArMTcsMjEgQEAKICNpZm5kZWYgQU5EUk9JRF9KQVVESU9UUkFDS19ICiAjZGVmaW5lIEFORFJPSURfSkFVRElPVFJBQ0tfSAogCisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+ICAgLy8gSXQgaGFzIGRlcGVuZGVuY3kgb24gYXVkaW8uaC9FcnJvcnMuaCwgYnV0IGRvZXNuJ3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlbSBpbiBpdC4gVGhlcmVmb3JlIGl0IGlzIGluY2x1ZGVkIGhlcmUgYXQgbGFzdC4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBKQXVkaW9UcmFjayB7CitjbGFzcyBKQXVkaW9UcmFjayA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKIAogICAgIC8qIEV2ZW50cyB1c2VkIGJ5IEF1ZGlvVHJhY2sgY2FsbGJhY2sgZnVuY3Rpb24gKGNhbGxiYWNrX3QpLgpAQCAtMzcsNiArMzksOCBAQAogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CiAgICAgICAgIEVWRU5UX01PUkVfREFUQSA9IDAsICAgICAgICAvLyBSZXF1ZXN0IHRvIHdyaXRlIG1vcmUgZGF0YSB0byBidWZmZXIuCisgICAgICAgIEVWRU5UX1VOREVSUlVOID0gMSwgICAgICAgICAvLyBCdWZmZXIgdW5kZXJydW4gb2NjdXJyZWQuIFRoaXMgd2lsbCBub3Qgb2NjdXIgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0aWMgdHJhY2tzLgogICAgICAgICBFVkVOVF9ORVdfSUFVRElPVFJBQ0sgPSA2LCAgLy8gSUF1ZGlvVHJhY2sgd2FzIHJlLWNyZWF0ZWQsIGVpdGhlciBkdWUgdG8gcmUtcm91dGluZyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbHVudGFyeSBpbnZhbGlkYXRpb24gYnkgbWVkaWFzZXJ2ZXIsIG9yIG1lZGlhc2VydmVyIGNyYXNoLgogICAgICAgICBFVkVOVF9TVFJFQU1fRU5EID0gNywgICAgICAgLy8gU2VudCBhZnRlciBhbGwgdGhlIGJ1ZmZlcnMgcXVldWVkIGluIEFGIGFuZCBIVyBhcmUgcGxheWVkCkBAIC0xMDQsMTUgKzEwOCwxNCBAQAogICAgICAqCiAgICAgICogVE9ETzogUmV2aXZlIHJlbW92ZWQgYXJndW1lbnRzIGFmdGVyIG9mZmxvYWQgbW9kZSBpcyBzdXBwb3J0ZWQuCiAgICAgICovCi0gICAgSkF1ZGlvVHJhY2soYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgSkF1ZGlvVHJhY2sodWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCi0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgY29uc3Qgam9iamVjdCBwQXR0cmlidXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYpOwogCiAgICAgLyoKQEAgLTE1OCwxMCArMTYxLDEwIEBACiAgICAgICogQ2F1dGlvbjogY2FsbGluZyB0aGlzIG1ldGhvZCB0b28gb2Z0ZW4gbWF5IGJlIGluZWZmaWNpZW50OwogICAgICAqIGlmIHlvdSBuZWVkIGEgaGlnaCByZXNvbHV0aW9uIG1hcHBpbmcgYmV0d2VlbiBmcmFtZSBwb3NpdGlvbiBhbmQgcHJlc2VudGF0aW9uIHRpbWUsCiAgICAgICogY29uc2lkZXIgaW1wbGVtZW50aW5nIHRoYXQgYXQgYXBwbGljYXRpb24gbGV2ZWwsIGJhc2VkIG9uIHRoZSBsb3cgcmVzb2x1dGlvbiB0aW1lc3RhbXBzLgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuCi0gICAgICogVGhlIHRpbWVzdGFtcCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9uIHJldHVybiwgaWYgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuCisgICAgICogICAgICAgICBOT19JTklUIGlmIGZpbmRzIGVycm9yLCBhbmQgdGltZXN0YW1wIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZCBvbiByZXR1cm4uCiAgICAgICovCi0gICAgYm9vbCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CisgICAgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOwogCiAgICAgLy8gVE9ETzogVGhpcyBkb2MgaXMganVzdCBjb3BpZWQgZnJvbSBBdWRpb1RyYWNrLmguIFJldmlzZSBpdCBhZnRlciBpbXBsZW1lbmF0aW9uLgogICAgIC8qIFJldHVybiB0aGUgZXh0ZW5kZWQgdGltZXN0YW1wLCB3aXRoIGFkZGl0aW9uYWwgdGltZWJhc2UgaW5mbyBhbmQgaW1wcm92ZWQgZHJhaW4gYmVoYXZpb3IuCkBAIC0zMjQsMzcgKzMyNyw0MyBAQAogCiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCk7CiAKKyAgICBzaXplX3QgZnJhbWVTaXplKCk7CisKICAgICAvKgogICAgICAqIER1bXBzIHRoZSBzdGF0ZSBvZiBhbiBhdWRpbyB0cmFjay4KICAgICAgKiBOb3QgYSBnZW5lcmFsLXB1cnBvc2UgQVBJOyBpbnRlbmRlZCBvbmx5IGZvciB1c2UgYnkgbWVkaWEgcGxheWVyIHNlcnZpY2UgdG8gZHVtcCBpdHMgdHJhY2tzLgogICAgICAqLwogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIAotICAgIC8qIFJldHVybnMgdGhlIElEIG9mIHRoZSBhdWRpbyBkZXZpY2UgYWN0dWFsbHkgdXNlZCBieSB0aGUgb3V0cHV0IHRvIHdoaWNoIHRoaXMgQXVkaW9UcmFjayBpcwotICAgICAqIGF0dGFjaGVkLiBXaGVuIHRoZSBBdWRpb1RyYWNrIGlzIGluYWN0aXZlLCBpdCB3aWxsIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FLgorICAgIC8qIFJldHVybnMgdGhlIEF1ZGlvRGV2aWNlSW5mbyB1c2VkIGJ5IHRoZSBvdXRwdXQgdG8gd2hpY2ggdGhpcyBBdWRpb1RyYWNrIGlzCisgICAgICogYXR0YWNoZWQuCiAgICAgICovCi0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZCgpOworICAgIGpvYmplY3QgZ2V0Um91dGVkRGV2aWNlKCk7CiAKICAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gc2Vzc2lvbiB0aGlzIEF1ZGlvVHJhY2sgYmVsb25ncyB0by4gKi8KLSAgICBhdWRpb19zZXNzaW9uX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKyAgICBpbnQzMl90IGdldEF1ZGlvU2Vzc2lvbklkKCk7CiAKLSAgICAvKiBTZWxlY3RzIHRoZSBhdWRpbyBkZXZpY2UgdG8gdXNlIGZvciBvdXRwdXQgb2YgdGhpcyBBdWRpb1RyYWNrLiBBIHZhbHVlIG9mCi0gICAgICogQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZXMgZGVmYXVsdCByb3V0aW5nLgorICAgIC8qIFNldHMgdGhlIHByZWZlcnJlZCBhdWRpbyBkZXZpY2UgdG8gdXNlIGZvciBvdXRwdXQgb2YgdGhpcyBBdWRpb1RyYWNrLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgVGhlIGRldmljZSBJRCBvZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIChhcyByZXR1cm5lZCBieSB0aGUgQXVkaW9EZXZpY2VzTWFuYWdlciBBUEkpLgorICAgICAqIERldmljZTogYW4gQXVkaW9EZXZpY2VJbmZvIG9iamVjdC4KICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlOgogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbgotICAgICAqICAtIEJBRF9WQUxVRTogZmFpbGVkIHRvIGZpbmQgdGhlIHZhbGlkIG91dHB1dCBkZXZpY2Ugd2l0aCBnaXZlbiBkZXZpY2UgSWQuCisgICAgICogIC0gQkFEX1ZBTFVFOiBmYWlsZWQgdG8gc2V0IHRoZSBkZXZpY2UKICAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKIAogICAgIC8vIFRPRE86IEFkZCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Qgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byBjaGVjay4KICAgICAvLyBUT0RPOiBBZGQgQVVESU9fRkxBR19IV19BVl9TWU5DIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gY2hlY2suCiAgICAgLyogUmV0dXJucyB0aGUgZmxhZ3MgKi8KICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQogCisgICAgLyogV2UgZG9uJ3Qga2VlcCBzdHJlYW0gdHlwZSBoZXJlLAorICAgICAqIGluc3RlYWQsIHdlIGtlZXAgYXR0cmlidXRlcyBhbmQgY2FsbCBnZXRWb2x1bWVDb250cm9sU3RyZWFtKCkgdG8gZ2V0IHN0cmVhbSB0eXBlCisgICAgICovCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKTsKKwogICAgIC8qIE9idGFpbiB0aGUgcGVuZGluZyBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgZm9yIHBsYXliYWNrIG9mIHB1cmUgUENNIGRhdGEgcmVtYWluaW5nIGluCiAgICAgICogQXVkaW9UcmFjay4KICAgICAgKgpAQCAtMzY5LDI3ICszNzgsNjAgQEAKICAgICAgKiBSZXBsYWNlcyBhbnkgcHJldmlvdXNseSBpbnN0YWxsZWQgY2FsbGJhY2suCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqCi0gICAgICogY2FsbGJhY2s6IFRoZSBjYWxsYmFjayBpbnRlcmZhY2UKKyAgICAgKiBMaXN0ZW5lcjogdGhlIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHJlcm91dGluZyBldmVudHMuCisgICAgICogSGFuZGxlcjogdGhlIGhhbmRsZXIgdG8gaGFuZGxlciB0aGUgcmVyb3V0aW5nIGV2ZW50cy4KICAgICAgKgogICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBzYW1lIGNhbGxiYWNrIGlzIGFscmVhZHkgaW5zdGFsbGVkLgotICAgICAqICAgICAgICAgTk9fSU5JVCBvciBQUkVNSVNTSU9OX0RFTklFRCBpZiBBdWRpb0ZsaW5nZXIgc2VydmljZSBpcyBub3QgcmVhY2hhYmxlCi0gICAgICogICAgICAgICBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKKyAgICAgKiAgICAgICAgIChUT0RPKSBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgc2FtZSBjYWxsYmFjayBpcyBhbHJlYWR5IGluc3RhbGxlZC4KKyAgICAgKiAgICAgICAgIChUT0RPKSBOT19JTklUIG9yIFBSRU1JU1NJT05fREVOSUVEIGlmIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGlzIG5vdCByZWFjaGFibGUKKyAgICAgKiAgICAgICAgIChUT0RPKSBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKICAgICAgKi8KLSAgICBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lciwgam9iamVjdCByZCk7CiAKICAgICAvKiBSZW1vdmVzIGFuIEF1ZGlvRGV2aWNlQ2FsbGJhY2suCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqCi0gICAgICogY2FsbGJhY2s6IFRoZSBjYWxsYmFjayBpbnRlcmZhY2UKKyAgICAgKiBMaXN0ZW5lcjogdGhlIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHJlcm91dGluZyBldmVudHMuCiAgICAgICoKICAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogICAgICAgICBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgY2FsbGJhY2sgaXMgbm90IGluc3RhbGxlZAotICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCisgICAgICogICAgICAgICAoVE9ETykgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQKKyAgICAgKiAgICAgICAgIChUT0RPKSBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKICAgICAgKi8KLSAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CisKKyAgICAvKiBSZWdpc3RlciBhbGwgYmFja2VkLXVwIHJvdXRpbmcgZGVsZWdhdGVzLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiByb3V0aW5nRGVsZWdhdGVzOiBiYWNrZWQtdXAgcm91dGluZyBkZWxlZ2F0ZXMKKyAgICAgKgorICAgICAqLworICAgIHZvaWQgcmVnaXN0ZXJSb3V0aW5nRGVsZWdhdGVzKAorICAgICAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxzcDxKT2JqZWN0SG9sZGVyPiwgc3A8Sk9iamVjdEhvbGRlcj4+PiYgcm91dGluZ0RlbGVnYXRlcyk7CisKKyAgICAvKiBnZXQgbGlzdGVuZXIgZnJvbSBSb3V0aW5nRGVsZWdhdGUgb2JqZWN0CisgICAgICovCisgICAgc3RhdGljIGpvYmplY3QgZ2V0TGlzdGVuZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopOworCisgICAgLyogZ2V0IGhhbmRsZXIgZnJvbSBSb3V0aW5nRGVsZWdhdGUgb2JqZWN0CisgICAgICovCisgICAgc3RhdGljIGpvYmplY3QgZ2V0SGFuZGxlcihjb25zdCBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZU9iaik7CisKKyAgICAvKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogbWFwIGFuZCBrZXkKKyAgICAgKgorICAgICAqIFJldHVybnMgdmFsdWUgaWYga2V5IGlzIGluIHRoZSBtYXAKKyAgICAgKiAgICAgICAgIG51bGxwdHIgaWYga2V5IGlzIG5vdCBpbiB0aGUgbWFwCisgICAgICovCisgICAgc3RhdGljIGpvYmplY3QgZmluZEJ5S2V5KAorICAgICAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxzcDxKT2JqZWN0SG9sZGVyPiwgc3A8Sk9iamVjdEhvbGRlcj4+PiYgbXAsIGNvbnN0IGpvYmplY3Qga2V5KTsKKworICAgIC8qCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiBtYXAgYW5kIGtleQorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGVyYXNlQnlLZXkoCisgICAgICAgICAgICBWZWN0b3I8c3RkOjpwYWlyPHNwPEpPYmplY3RIb2xkZXI+LCBzcDxKT2JqZWN0SG9sZGVyPj4+JiBtcCwgY29uc3Qgam9iamVjdCBrZXkpOwogCiBwcml2YXRlOgogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWY3ZjgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0pfTUVESUEyX0hUVFBfQ09OTkVDVElPTl9IXworI2RlZmluZSBfSl9NRURJQTJfSFRUUF9DT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlICJqbmkuaCIKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEpNZWRpYTJIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBNZWRpYUhUVFBDb25uZWN0aW9uIHsKKyAgICBKTWVkaWEySFRUUENvbm5lY3Rpb24oSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeik7CisKKyAgICB2aXJ0dWFsIGJvb2wgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBvZmY2NF90IGdldFNpemUoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVyaShTdHJpbmc4ICp1cmkpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Sk1lZGlhMkhUVFBDb25uZWN0aW9uKCk7CisKK3ByaXZhdGU6CisgICAgam9iamVjdCBtTWVkaWEySFRUUENvbm5lY3Rpb25PYmo7CisgICAgam1ldGhvZElEIG1Db25uZWN0TWV0aG9kOworICAgIGptZXRob2RJRCBtRGlzY29ubmVjdE1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbVJlYWRBdE1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbUdldFNpemVNZXRob2Q7CisgICAgam1ldGhvZElEIG1HZXRNSU1FVHlwZU1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbUdldFVyaU1ldGhvZDsKKworICAgIGpieXRlQXJyYXkgbUJ5dGVBcnJheU9iajsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEpNZWRpYTJIVFRQQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9KX01FRElBMl9IVFRQX0NPTk5FQ1RJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjYxYTdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0pfTUVESUEyX0hUVFBfU0VSVklDRV9IXworI2RlZmluZSBfSl9NRURJQTJfSFRUUF9TRVJWSUNFX0hfCisKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSk1lZGlhMkhUVFBTZXJ2aWNlIDogcHVibGljIE1lZGlhSFRUUFNlcnZpY2UgeworICAgIEpNZWRpYTJIVFRQU2VydmljZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KTsKKworICAgIHZpcnR1YWwgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5KTWVkaWEySFRUUFNlcnZpY2UoKTsKKworcHJpdmF0ZToKKyAgICBqb2JqZWN0IG1NZWRpYTJIVFRQU2VydmljZU9iajsKKworICAgIGptZXRob2RJRCBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSk1lZGlhMkhUVFBTZXJ2aWNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX0pfTUVESUEyX0hUVFBfU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkOGI0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBKT0JKRUNUX0hPTERFUl9IXworCisjZGVmaW5lIEpPQkpFQ1RfSE9MREVSX0hfCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgZ2xvYmFsIHJlZmVyZW5jZSBvZiBqb2JqZWN0Lgorc3RydWN0IEpPYmplY3RIb2xkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgSk9iamVjdEhvbGRlcihqb2JqZWN0IG9iaikgeworICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgIG1KT2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxqb2JqZWN0PihlbnYtPk5ld0dsb2JhbFJlZihvYmopKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5KT2JqZWN0SG9sZGVyKCkgeworICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1KT2JqZWN0KTsKKyAgICB9CisKKyAgICBqb2JqZWN0IGdldEpPYmplY3QoKSB7IHJldHVybiBtSk9iamVjdDsgfQorCitwcml2YXRlOgorICAgIGpvYmplY3QgbUpPYmplY3Q7Cit9OworCit9ICAvLyIgYW5kcm9pZAorCisjZW5kaWYgIC8vIEpPQkpFQ1RfSE9MREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1NmFjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEpBVkFfVk1fSEVMUEVSX0hfCisKKyNkZWZpbmUgSkFWQV9WTV9IRUxQRVJfSF8KKworI2luY2x1ZGUgImpuaS5oIgorCisjaW5jbHVkZSA8YXRvbWljPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBKYXZhVk1IZWxwZXIgeworICAgIHN0YXRpYyBKTklFbnYgKmdldEpOSUVudigpOworICAgIHN0YXRpYyBKYXZhVk0gKmdldEphdmFWTSgpOworICAgIHN0YXRpYyB2b2lkIHNldEphdmFWTShKYXZhVk0gKnZtKTsKKworcHJpdmF0ZToKKyAgICAvLyBPbmNlIGEgdmFsaWQgSmF2YVZNIGhhcyBiZWVuIHNldCwgaXQgc2hvdWxkIG5ldmVyIGJlIHJlc2V0IG9yIGNoYW5nZWQuCisgICAgLy8gSG93ZXZlciwgYXMgaXQgbWF5IGJlIGFjY2Vzc2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcywgYWNjZXNzIG5lZWRzIHRvIGJlCisgICAgLy8gc3luY2hyb25pemVkLgorICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxKYXZhVk0gKj4gc0phdmFWTTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSkFWQV9WTV9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmgKaW5kZXggNWQ1YjhlNC4uZjM4YjdjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmgKQEAgLTE5LDEwICsxOSwxNSBAQAogI2RlZmluZSBBTkRST0lEX01FRElBUExBWUVSMkFVRElPT1VUUFVUX0gKIAogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogCisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSAiam5pLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQXVkaW9UcmFjazsKQEAgLTMyLDE1ICszNywxNCBAQAogICAgIGNsYXNzIENhbGxiYWNrRGF0YTsKIAogcHVibGljOgotICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoaW50MzJfdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOwogICAgIHZpcnR1YWwgfk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgcmVhZHkoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtVHJhY2sgIT0gMDsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjayAhPSBudWxscHRyOwogICAgIH0KICAgICB2aXJ0dWFsIHNzaXplX3QgYnVmZmVyU2l6ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3NpemVfdCBmcmFtZUNvdW50KCkgY29uc3Q7CkBAIC01MiwxNyArNTYsMTcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3Q7Ci0gICAgdmlydHVhbCBhdWRpb19zZXNzaW9uX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQzMl90IGdldFNlc3Npb25JZCgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXRTZXNzaW9uSWQoY29uc3QgaW50MzJfdCBpZCk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCi0gICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50ID0gMCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CkBAIC03MSwxMyArNzUsMTAgQEAKICAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKICAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKTsKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKLSAgICB2b2lkIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwotICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU3RyZWFtVHlwZTsKLSAgICB9Ci0gICAgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcyk7CisgICAgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3Q7CiAKLSAgICB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisgICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLyk7CiAKQEAgLTkyLDEzICs5MywxMSBAQAogICAgICAgICAvLyBUT0RPOiByZXR1cm4gY29ycmVjdCB2YWx1ZS4KICAgICAgICAgLy9yZXR1cm4gbU5leHRPdXRwdXQgPT0gTlVMTDsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotCiAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpOworICAgIHZpcnR1YWwgam9iamVjdCBnZXRSb3V0ZWREZXZpY2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgdm9pZCBzZXRNaW5CdWZmZXJDb3VudCgpOwpAQCAtMTA3LDMwICsxMDYsMjggQEAKICAgICB2b2lkIGNsb3NlX2woKTsKICAgICBzdGF0dXNfdCB1cGRhdGVUcmFja19sKCk7CiAKLSAgICBzcDxBdWRpb1RyYWNrPiAgICAgICAgICBtVHJhY2s7CisgICAgc3A8SkF1ZGlvVHJhY2s+ICAgICAgICAgbUpBdWRpb1RyYWNrOwogICAgIEF1ZGlvQ2FsbGJhY2sgICAgICAgICAgIG1DYWxsYmFjazsKICAgICB2b2lkICogICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb29raWU7CiAgICAgQ2FsbGJhY2tEYXRhICogICAgICAgICAgbUNhbGxiYWNrRGF0YTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICBtQXR0cmlidXRlczsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgbUF0dHJpYnV0ZXM7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVZvbHVtZTsKICAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICAgICBtUGxheWJhY2tSYXRlOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlSHo7IC8vIHNhbXBsZSByYXRlIG9mIHRoZSBjb250ZW50LCBhcyBzZXQgaW4gb3BlbigpCiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWU7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKLSAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgbVVpZDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICAgIG1GbGFnczsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtU2VsZWN0ZWREZXZpY2VJZDsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUm91dGVkRGV2aWNlSWQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZDsKLSAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gICAgICAgIG1EZXZpY2VDYWxsYmFjazsKKyAgICBzcDxKT2JqZWN0SG9sZGVyPiAgICAgICBtUHJlZmVycmVkRGV2aWNlOwogICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgIG1Mb2NrOwogCisgICAgLy8gPGxpc3RlbmVyLCByb3V0aW5nRGVsZWdhdGU+CisgICAgVmVjdG9yPHN0ZDo6cGFpcjxzcDxKT2JqZWN0SG9sZGVyPiwgc3A8Sk9iamVjdEhvbGRlcj4+PiBtUm91dGluZ0RlbGVnYXRlczsKKwogICAgIC8vIHN0YXRpYyB2YXJpYWJsZXMgYmVsb3cgbm90IHByb3RlY3RlZCBieSBtdXRleAogICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7CiAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgbU1pbkJ1ZmZlckNvdW50OyAgLy8gMTIgZm9yIGVtdWxhdG9yOyBvdGhlcndpc2UgNApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oCmluZGV4IDAyYmY4OTEuLjc4MDRhNjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmgKQEAgLTIzLDE2ICsyMywyMSBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8am5pLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmg+CiAKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOworCiAvLyBGd2QgZGVjbCB0byBtYWtlIHN1cmUgZXZlcnlvbmUgYWdyZWVzIHRoYXQgdGhlIHNjb3BlIG9mIHN0cnVjdCBzb2NrYWRkcl9pbiBpcwogLy8gZ2xvYmFsLCBhbmQgbm90IGluIGFuZHJvaWQ6Ogogc3RydWN0IHNvY2thZGRyX2luOwpAQCAtNDMsNyArNDgsNiBAQAogY2xhc3MgUGFyY2VsOwogc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOwogCi0jZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5UIDQKICNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSU0laRSAxMjAwCiAjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX1NBTVBMRVJBVEUgNDQxMDAKIApAQCAtNTYsNyArNjAsOCBAQAogY2xhc3MgTWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXI6IHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCisgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaikgPSAwOwogfTsKIAogY2xhc3MgTWVkaWFQbGF5ZXIySW50ZXJmYWNlIDogcHVibGljIEFIYW5kbGVyIHsKQEAgLTg4LDcgKzkzLDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgaW50NjRfdCBnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICpmcmFtZXN3cml0dGVuKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fc2Vzc2lvbl90IGdldFNlc3Npb25JZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBpbnQzMl90IGdldFNlc3Npb25JZCgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QgPSAwOwpAQCAtOTgsMTIgKzEwMywxMCBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0PUFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgIGludCBidWZmZXJDb3VudD1ERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKICAgICAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiID0gTlVMTCwKICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUgPSBOVUxMLAogICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50ID0gMCkgPSAwOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CkBAIC0xMzksOSArMTQyLDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBBdWRpb1JvdXRpbmcKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpOworICAgICAgICB2aXJ0dWFsIGpvYmplY3QgICAgIGdldFJvdXRlZERldmljZSgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CiAgICAgfTsKIAogICAgIE1lZGlhUGxheWVyMkludGVyZmFjZSgpIDogbUxpc3RlbmVyKE5VTEwpIHsgfQpAQCAtMTcxLDcgKzE3NSw2IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVBc3luYygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKSB7CkBAIC0yMTEsNiArMjE0LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3MoY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpID0gMDsKKwogICAgIC8vIEludm9rZSBhIGdlbmVyaWMgbWV0aG9kIG9uIHRoZSBwbGF5ZXIgYnkgdXNpbmcgb3BhcXVlIHBhcmNlbHMKICAgICAvLyBmb3IgdGhlIHJlcXVlc3QgYW5kIHJlcGx5LgogICAgIC8vCkBAIC0yMTgsMjYgKzIyMywxNCBAQAogICAgIC8vICAgICAgICAgICAgICAgIGRhdGEgc2VudCBieSB0aGUgamF2YSBsYXllci4KICAgICAvLyBAcGFyYW1bb3V0XSByZXBseSBQYXJjZWwgdG8gaG9sZCB0aGUgcmVwbHkgZGF0YS4gQ2Fubm90IGJlIG51bGwuCiAgICAgLy8gQHJldHVybiBPSyBpZiB0aGUgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpID0gMDsKLQotICAgIC8vIFRoZSBDbGllbnQgaW4gdGhlIE1ldGFkYXRhUGxheWVyU2VydmljZSBjYWxscyB0aGlzIG1ldGhvZCBvbgotICAgIC8vIHRoZSBuYXRpdmUgcGxheWVyIHRvIHJldHJpZXZlIGFsbCBvciBhIHN1YnNldCBvZiBtZXRhZGF0YS4KLSAgICAvLwotICAgIC8vIEBwYXJhbSBpZHMgU29ydGVkTGlzdCBvZiBtZXRhZGF0YSBJRCB0byBiZSBmZXRjaC4gSWYgZW1wdHksIGFsbAotICAgIC8vICAgICAgICAgICAgdGhlIGtub3duIG1ldGFkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICAvLyBAcGFyYW1baW5vdXRdIHJlY29yZHMgUGFyY2VsIHdoZXJlIHRoZSBwbGF5ZXIgYXBwZW5kcyBpdHMgbWV0YWRhdGEuCi0gICAgLy8gQHJldHVybiBPSyBpZiB0aGUgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFkYXRhKGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIC8qIHJlY29yZHMgKi8pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH07CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVwbHkpID0gMDsKIAogICAgIHZvaWQgc2V0TGlzdGVuZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXI+ICZsaXN0ZW5lcikgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxpc3RlbmVyTG9jayk7CiAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwogICAgIH0KIAotICAgIHZvaWQgc2VuZEV2ZW50KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxPTAsIGludCBleHQyPTAsIGNvbnN0IFBhcmNlbCAqb2JqPU5VTEwpIHsKKyAgICB2b2lkIHNlbmRFdmVudChpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wLCBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmo9TlVMTCkgewogICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcj4gbGlzdGVuZXI7CiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTGlzdGVuZXJMb2NrKTsKQEAgLTI1NiwxMSArMjQ5LDExIEBACiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmIC8qIG1zZyAqLykgb3ZlcnJpZGUgeyB9CiAKICAgICAvLyBNb2R1bGFyIERSTQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybShjb25zdCB1aW50OF90IC8qIHV1aWQgKi9bMTZdLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybShpbnQ2NF90IC8qc3JjSWQqLywgY29uc3QgdWludDhfdCAvKiB1dWlkICovWzE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiAvKiBkcm1TZXNzaW9uSWQgKi8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKGludDY0X3QgLypzcmNJZCovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmgKaW5kZXggMzkwNWI1NS4uMjQzMDI4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmgKQEAgLTM0LDggKzM0LDcgQEAKICAgICBNRURJQTJfU0VUX1ZJREVPX1NJWkUgICAgPSA1LAogICAgIE1FRElBMl9TVEFSVEVEICAgICAgICAgICA9IDYsCiAgICAgTUVESUEyX1BBVVNFRCAgICAgICAgICAgID0gNywKLSAgICBNRURJQTJfU1RPUFBFRCAgICAgICAgICAgPSA4LAotICAgIE1FRElBMl9TS0lQUEVEICAgICAgICAgICA9IDksCisgICAgTUVESUEyX1NLSVBQRUQgICAgICAgICAgID0gOCwKICAgICBNRURJQTJfTk9USUZZX1RJTUUgICAgICAgPSA5OCwKICAgICBNRURJQTJfVElNRURfVEVYVCAgICAgICAgPSA5OSwKICAgICBNRURJQTJfRVJST1IgICAgICAgICAgICAgPSAxMDAsCkBAIC00Myw3ICs0Miw2IEBACiAgICAgTUVESUEyX1NVQlRJVExFX0RBVEEgICAgID0gMjAxLAogICAgIE1FRElBMl9NRVRBX0RBVEEgICAgICAgICA9IDIwMiwKICAgICBNRURJQTJfRFJNX0lORk8gICAgICAgICAgPSAyMTAsCi0gICAgTUVESUEyX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCA9IDEwMDAwLAogfTsKIAogLy8gR2VuZXJpYyBlcnJvciBjb2RlcyBmb3IgdGhlIG1lZGlhIHBsYXllciBmcmFtZXdvcmsuICBFcnJvcnMgYXJlIGZhdGFsLCB0aGUKQEAgLTk2LDE3ICs5NCwyMCBAQAogZW51bSBtZWRpYTJfaW5mb190eXBlIHsKICAgICAvLyAweHgKICAgICBNRURJQTJfSU5GT19VTktOT1dOID0gMSwKLSAgICAvLyBUaGUgcGxheWVyIHdhcyBzdGFydGVkIGJlY2F1c2UgaXQgd2FzIHVzZWQgYXMgdGhlIG5leHQgcGxheWVyIGZvciBhbm90aGVyCi0gICAgLy8gcGxheWVyLCB3aGljaCBqdXN0IGNvbXBsZXRlZCBwbGF5YmFjawotICAgIE1FRElBMl9JTkZPX1NUQVJURURfQVNfTkVYVCA9IDIsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IHN0YXJ0ZWQgdGhlIHBsYXliYWNrIG9mIHRoaXMgZGF0YSBzb3VyY2UuCisgICAgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfU1RBUlQgPSAyLAogICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwdXNoZWQgdGhlIHZlcnkgZmlyc3QgdmlkZW8gZnJhbWUgZm9yIHJlbmRlcmluZwogICAgIE1FRElBMl9JTkZPX1ZJREVPX1JFTkRFUklOR19TVEFSVCA9IDMsCiAgICAgLy8gVGhlIHBsYXllciBqdXN0IHB1c2hlZCB0aGUgdmVyeSBmaXJzdCBhdWRpbyBmcmFtZSBmb3IgcmVuZGVyaW5nCiAgICAgTUVESUEyX0lORk9fQVVESU9fUkVOREVSSU5HX1NUQVJUID0gNCwKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgY29tcGxldGVkIHRoZSBwbGF5YmFjayBvZiB0aGlzIGRhdGEgc291cmNlCi0gICAgTUVESUEyX0lORk9fUExBWUJBQ0tfQ09NUExFVEUgPSA1LAotICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgdGhlIHBsYXliYWNrIG9mIHRoZSBmdWxsIHBsYXkgbGlzdAotICAgIE1FRElBMl9JTkZPX1BMQVlMSVNUX0VORCA9IDYsCisgICAgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfRU5EID0gNSwKKyAgICAvLyBUaGUgcGxheWVyIGp1c3QgY29tcGxldGVkIHRoZSBwbGF5YmFjayBvZiBhbGwgZGF0YSBzb3VyY2VzLgorICAgIC8vIEJ1dCB0aGlzIGlzIG5vdCB2aXNpYmxlIGluIG5hdGl2ZSBjb2RlLiBKdXN0IGtlZXAgdGhpcyBlbnRyeSBmb3IgY29tcGxldGVuZXNzLgorICAgIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX0xJU1RfRU5EID0gNiwKKyAgICAvLyBUaGUgcGxheWVyIGp1c3QgY29tcGxldGVkIGFuIGl0ZXJhdGlvbiBvZiBwbGF5YmFjayBsb29wLiBUaGlzIGV2ZW50IGlzIHNlbnQgb25seSB3aGVuCisgICAgLy8gbG9vcGluZyBpcyBlbmFibGVkLgorICAgIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1JFUEVBVCA9IDcsCiAKICAgICAvLzF4eAogICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwcmVwYXJlZCBhIGRhdGEgc291cmNlLgpAQCAtMTUwLDExICsxNTEsMTEgQEAKIAogLy8gRG8gbm90IGNoYW5nZSB0aGVzZSB2YWx1ZXMgd2l0aG91dCB1cGRhdGluZyB0aGVpciBjb3VudGVycGFydHMgaW4gTWVkaWFQbGF5ZXIyLmphdmEKIGVudW0gbWVkaWFwbGF5ZXIyX3N0YXRlcyB7Ci0gICAgTUVESUFQTEFZRVIyX1NUQVRFX0lETEUgICAgICAgICA9IDEsCi0gICAgTUVESUFQTEFZRVIyX1NUQVRFX1BSRVBBUkVEICAgICA9IDIsCi0gICAgTUVESUFQTEFZRVIyX1NUQVRFX1BMQVlJTkcgICAgICA9IDMsCi0gICAgTUVESUFQTEFZRVIyX1NUQVRFX1BBVVNFRCAgICAgICA9IDQsCi0gICAgTUVESUFQTEFZRVIyX1NUQVRFX0VSUk9SICAgICAgICA9IDUsCisgICAgTUVESUFQTEFZRVIyX1NUQVRFX0lETEUgICAgICAgICA9IDEwMDEsCisgICAgTUVESUFQTEFZRVIyX1NUQVRFX1BSRVBBUkVEICAgICA9IDEwMDIsCisgICAgTUVESUFQTEFZRVIyX1NUQVRFX1BBVVNFRCAgICAgICA9IDEwMDMsCisgICAgTUVESUFQTEFZRVIyX1NUQVRFX1BMQVlJTkcgICAgICA9IDEwMDQsCisgICAgTUVESUFQTEFZRVIyX1NUQVRFX0VSUk9SICAgICAgICA9IDEwMDUsCiB9OwogCiBlbnVtIG1lZGlhX3BsYXllcjJfaW50ZXJuYWxfc3RhdGVzIHsKQEAgLTE2NSw4ICsxNjYsNyBAQAogICAgIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgICAgICAgICAgID0gMSA8PCAzLAogICAgIE1FRElBX1BMQVlFUjJfU1RBUlRFRCAgICAgICAgICAgID0gMSA8PCA0LAogICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEICAgICAgICAgICAgID0gMSA8PCA1LAotICAgIE1FRElBX1BMQVlFUjJfU1RPUFBFRCAgICAgICAgICAgID0gMSA8PCA2LAotICAgIE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgID0gMSA8PCA3CisgICAgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSAgPSAxIDw8IDYKIH07CiAKIC8vIEtlZXAgS0VZX1BBUkFNRVRFUl8qIGluIHN5bmMgd2l0aCBNZWRpYVBsYXllcjIuamF2YS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaAppbmRleCBkNTg2MTkyLi4yOTkzYWIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oCkBAIC0yMCwxMSArMjAsMTIgQEAKICNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyX2NvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogCisjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0zMiw2ICszMyw4IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWJhc2UuaD4KIAorI2luY2x1ZGUgImpuaS5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKQEAgLTQyLDcgKzQ1LDggQEAKIGNsYXNzIE1lZGlhUGxheWVyMkxpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCisgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmogPSBOVUxMKSA9IDA7CiB9OwogCiBjbGFzcyBNZWRpYVBsYXllcjIgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXIKQEAgLTUwLDcgKzU0LDcgQEAKIHB1YmxpYzoKICAgICB+TWVkaWFQbGF5ZXIyKCk7CiAKLSAgICBzdGF0aWMgc3A8TWVkaWFQbGF5ZXIyPiBDcmVhdGUoKTsKKyAgICBzdGF0aWMgc3A8TWVkaWFQbGF5ZXIyPiBDcmVhdGUoaW50MzJfdCBzZXNzaW9uSWQsIGpvYmplY3QgY29udGV4dCk7CiAgICAgc3RhdGljIHN0YXR1c190IER1bXBBbGwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTY1LDEwICs2OSw5IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc3RhcnQoKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzdG9wKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc1BsYXlpbmcoKTsKLSAgICAgICAgICAgIG1lZGlhcGxheWVyMl9zdGF0ZXMgZ2V0TWVkaWFQbGF5ZXIyU3RhdGUoKTsKKyAgICAgICAgICAgIG1lZGlhcGxheWVyMl9zdGF0ZXMgZ2V0U3RhdGUoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKQEAgLTgyLDYwICs4NSw1MyBAQAogICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1zZWMpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uKGludDY0X3Qgc3JjSWQsIGludDY0X3QgKm1zZWMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlc2V0KCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgdHlwZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgKnR5cGUpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldExvb3BpbmcoaW50IGxvb3ApOwogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIGlzTG9vcGluZygpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsICpvYmogPSBOVUxMKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBpbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRNZXRhZGF0YUZpbHRlcihjb25zdCBQYXJjZWwmIGZpbHRlcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0TWV0YWRhdGEoYm9vbCB1cGRhdGVfb25seSwgYm9vbCBhcHBseV9maWx0ZXIsIFBhcmNlbCAqbWV0YWRhdGEpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGdldEF1ZGlvU2Vzc2lvbklkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaiA9IE5VTEwpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TZXNzaW9uSWQoaW50MzJfdCBzZXNzaW9uSWQpOworICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIGdldEF1ZGlvU2Vzc2lvbklkKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIGpvYmplY3QgICAgICAgICBnZXRBdWRpb0F0dHJpYnV0ZXMoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsKiByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0TWV0cmljcyhjaGFyICoqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCk7CiAKICAgICAgICAgICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVsZWFzZURybSgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVEcm0oaW50NjRfdCBzcmNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVsZWFzZURybShpbnQ2NF90IHNyY0lkKTsKICAgICAgICAgICAgIC8vIEF1ZGlvUm91dGluZwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0Um91dGVkRGV2aWNlSWQoKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKKyAgICAgICAgICAgIGpvYmplY3QgICAgICAgICBnZXRSb3V0ZWREZXZpY2UoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiBwcml2YXRlOgotICAgIE1lZGlhUGxheWVyMigpOworICAgIE1lZGlhUGxheWVyMihpbnQzMl90IHNlc3Npb25JZCwgam9iamVjdCBjb250ZXh0KTsKICAgICBib29sIGluaXQoKTsKIAotICAgIC8vIEBwYXJhbSB0eXBlIE9mIHRoZSBtZXRhZGF0YSB0byBiZSB0ZXN0ZWQuCi0gICAgLy8gQHJldHVybiB0cnVlIGlmIHRoZSBtZXRhZGF0YSBzaG91bGQgYmUgZHJvcHBlZCBhY2NvcmRpbmcgdG8KLSAgICAvLyAgICAgICAgICAgICAgdGhlIGZpbHRlcnMuCi0gICAgYm9vbCBzaG91bGREcm9wTWV0YWRhdGEobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIHR5cGUpIGNvbnN0OwotCi0gICAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIHNldCBvZiBtZXRhZGF0YSB1cGRhdGVkLiBOb29wIGlmCi0gICAgLy8gdGhlIGVsZW1lbnQgZXhpc3RzIGFscmVhZHkuCi0gICAgLy8gQHBhcmFtIHR5cGUgT2YgdGhlIG1ldGFkYXRhIHRvIGJlIHJlY29yZGVkLgotICAgIHZvaWQgYWRkTmV3TWV0YWRhdGFVcGRhdGUobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIHR5cGUpOwotCiAgICAgLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIEFOYXRpdmVXaW5kb3cuCiAgICAgdm9pZCBkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKTsKIAotICAgIHN0YXR1c190IHNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisgICAgc3RhdHVzX3Qgc2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKTsKIAogICAgIHZvaWQgY2xlYXJfbCgpOwogICAgIHN0YXR1c190IHNlZWtUb19sKGludDY0X3QgbXNlYywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSk7CiAgICAgc3RhdHVzX3QgcHJlcGFyZUFzeW5jX2woKTsKICAgICBzdGF0dXNfdCBnZXREdXJhdGlvbl9sKGludDY0X3QgKm1zZWMpOwogICAgIHN0YXR1c190IHJlc2V0X2woKTsKLSAgICBzdGF0dXNfdCBjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSk7CisgICAgc3RhdHVzX3QgY2hlY2tTdGF0ZV9sKCk7CiAKICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVBpZDsKICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKQEAgLTE1MiwyNyArMTQ4LDE1IEBACiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgIG1TZWVrUG9zaXRpb247CiAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgICAgICAgIG1TZWVrTW9kZTsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICAgICAgbVN0cmVhbVR5cGU7Ci0gICAgUGFyY2VsKiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0OwotICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgICAgIG1BdWRpb0F0dHJpYnV0ZXM7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25JZDsKKyAgICBzcDxKT2JqZWN0SG9sZGVyPiAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlczsKKyAgICBzcDxKT2JqZWN0SG9sZGVyPiAgICAgICAgICAgbUNvbnRleHQ7CiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7Ci0KICAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gICAgbUNvbm5lY3RlZFdpbmRvdzsKLQotICAgIC8vIE1ldGFkYXRhIGZpbHRlcnMuCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhQWxsb3c7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFEcm9wOyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCi0KLSAgICAvLyBNZXRhZGF0YSB1cGRhdGVkLiBGb3IgZWFjaCBNRURJQV9JTkZPX01FVEFEQVRBX1VQREFURQotICAgIC8vIG5vdGlmaWNhdGlvbiB3ZSB0cnkgdG8gdXBkYXRlIG1NZXRhZGF0YVVwZGF0ZWQgd2hpY2ggaXMgYQotICAgIC8vIHNldDogbm8gZHVwbGljYXRlLgotICAgIC8vIGdldE1ldGFkYXRhIGNsZWFycyB0aGlzIHNldC4KLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFVcGRhdGVkOyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmNwcAppbmRleCBlNTU2N2RjLi5hZTdhYzU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmNwcApAQCAtMTgsMTQgKzE4LDEwIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1lZGlhUGxheWVyMk5hdGl2ZSIKIAotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLQorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VEZXNjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgotI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmg+CkBAIC01MywxNjkgKzQ5LDYgQEAKIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CiBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOwogCi0vLyBNYXggbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGZpbHRlci4KLWNvbnN0IGludCBrTWF4RmlsdGVyU2l6ZSA9IDY0OyAgLy8gSSBwdWxsZWQgdGhhdCBvdXQgb2YgdGhpbiBhaXIuCi0KLS8vIEZJWE1FOiBNb3ZlIGFsbCB0aGUgbWV0YWRhdGEgcmVsYXRlZCBmdW5jdGlvbiBpbiB0aGUgTWV0YWRhdGEuY3BwCi0KLS8vIFVubWFyc2hhbGwgYSBmaWx0ZXIgZnJvbSBhIFBhcmNlbC4KLS8vIEZpbHRlciBmb3JtYXQgaW4gYSBwYXJjZWw6Ci0vLwotLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBlbnRyaWVzIChuKSAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSAxICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIDIgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vICAuLi4uCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSBuICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLwotLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgc2hvdWxkIHN0YXJ0IHdpdGggYSBmaWx0ZXIuCi0vLyBAcGFyYW1bb3V0XSBmaWx0ZXIgT24gZXhpdCBjb250YWlucyB0aGUgbGlzdCBvZiBtZXRhZGF0YSB0eXBlIHRvIGJlCi0vLyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuCi0vLyBAcGFyYW1bb3V0XSBzdGF0dXMgT24gZXhpdCBjb250YWlucyB0aGUgc3RhdHVzIGNvZGUgdG8gYmUgcmV0dXJuZWQuCi0vLyBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcmNlbCBzdGFydHMgd2l0aCBhIHZhbGlkIGZpbHRlci4KLWJvb2wgdW5tYXJzaGFsbEZpbHRlcihjb25zdCBQYXJjZWwmIHAsCi0gICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgKmZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSB7Ci0gICAgaW50MzJfdCB2YWw7Ci0gICAgaWYgKHAucmVhZEludDMyKCZ2YWwpICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBmaWx0ZXIncyBsZW5ndGgiKTsKLSAgICAgICAgKnN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh2YWwgPiBrTWF4RmlsdGVyU2l6ZSB8fCB2YWwgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZpbHRlciBsZW4gJWQiLCB2YWwpOwotICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3Qgc2l6ZV90IG51bSA9IHZhbDsKLQotICAgIGZpbHRlci0+Y2xlYXIoKTsKLSAgICBmaWx0ZXItPnNldENhcGFjaXR5KG51bSk7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IG51bSAqIHNpemVvZihtZWRpYTo6TWV0YWRhdGE6OlR5cGUpOwotCi0KLSAgICBpZiAocC5kYXRhQXZhaWwoKSA8IHNpemUpIHsKLSAgICAgICAgQUxPR0UoIkZpbHRlciB0b28gc2hvcnQgZXhwZWN0ZWQgJXp1IGJ1dCBnb3QgJXp1Iiwgc2l6ZSwgcC5kYXRhQXZhaWwoKSk7Ci0gICAgICAgICpzdGF0dXMgPSBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUgKmRhdGEgPQotICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUqPihwLnJlYWRJbnBsYWNlKHNpemUpKTsKLQotICAgIGlmIChOVUxMID09IGRhdGEpIHsKLSAgICAgICAgQUxPR0UoIkZpbHRlciBoYWQgbm8gZGF0YSIpOwotICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogVGhlIHN0bCBpbXBsIG9mIHZlY3RvciB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCBoZXJlCi0gICAgLy8gYmVjYXVzZSBpdCBkZWdlbmVyYXRlcyBpbnRvIGEgbWVtY3B5IG9uIHBvZCB0eXBlcy4gVHJ5IHRvCi0gICAgLy8gcmVwbGFjZSBsYXRlciBvciB1c2Ugc3RsOjpzZXQuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07ICsraSkgewotICAgICAgICBmaWx0ZXItPmFkZCgqZGF0YSk7Ci0gICAgICAgICsrZGF0YTsKLSAgICB9Ci0gICAgKnN0YXR1cyA9IE9LOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBAcGFyYW0gZmlsdGVyIE9mIG1ldGFkYXRhIHR5cGUuCi0vLyBAcGFyYW0gdmFsIFRvIGJlIHNlYXJjaGVkLgotLy8gQHJldHVybiB0cnVlIGlmIGEgbWF0Y2ggd2FzIGZvdW5kLgotYm9vbCBmaW5kTWV0YWRhdGEoY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGZpbHRlciwgY29uc3QgaW50MzJfdCB2YWwpIHsKLSAgICAvLyBEZWFsIHdpdGggZW1wdHkgYW5kIEFOWSByaWdodCBhd2F5Ci0gICAgaWYgKGZpbHRlci5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoZmlsdGVyWzBdID09IG1lZGlhOjpNZXRhZGF0YTo6a0FueSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmlsdGVyLmluZGV4T2YodmFsKSA+PSAwOwotfQotCi0vLyBtYXJzaGFsbGluZyB0YWcgaW5kaWNhdGluZyBmbGF0dGVuZWQgdXRmMTYgdGFncwotLy8ga2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuamF2YQotY29uc3QgaW50MzJfdCBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyA9IDE7Ci0KLS8vIEF1ZGlvIGF0dHJpYnV0ZXMgZm9ybWF0IGluIGEgcGFyY2VsOgotLy8KLS8vICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzICB8IC8vIGlnbm9yZSB0YWdzIGlmIG5vdCBmb3VuZAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZCB0YWdzIGluIFVURjE2ICAgICAgICAgICAgICAgICB8Ci0vLyB8ICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vCi0vLyBAcGFyYW0gcCBQYXJjZWwgdGhhdCBjb250YWlucyBhdWRpbyBhdHRyaWJ1dGVzLgotLy8gQHBhcmFtW291dF0gYXR0cmlidXRlcyBPbiBleGl0IHBvaW50cyB0byBhbiBpbml0aWFsaXplZCBhdWRpb19hdHRyaWJ1dGVzX3Qgc3RydWN0dXJlCi0vLyBAcGFyYW1bb3V0XSBzdGF0dXMgT24gZXhpdCBjb250YWlucyB0aGUgc3RhdHVzIGNvZGUgdG8gYmUgcmV0dXJuZWQuCi12b2lkIHVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoY29uc3QgUGFyY2VsJiBwYXJjZWwsIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcykgewotICAgIGF0dHJpYnV0ZXMtPnVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBhdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUgPSAoYXVkaW9fY29udGVudF90eXBlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBhdHRyaWJ1dGVzLT5zb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBhdHRyaWJ1dGVzLT5mbGFncyA9IChhdWRpb19mbGFnc19tYXNrX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBjb25zdCBib29sIGhhc0ZsYXR0ZW5lZFRhZyA9IChwYXJjZWwucmVhZEludDMyKCkgPT0ga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MpOwotICAgIGlmIChoYXNGbGF0dGVuZWRUYWcpIHsKLSAgICAgICAgLy8gdGhlIHRhZ3MgYXJlIFVURjE2LCBjb252ZXJ0IHRvIFVURjgKLSAgICAgICAgU3RyaW5nMTYgdGFncyA9IHBhcmNlbC5yZWFkU3RyaW5nMTYoKTsKLSAgICAgICAgc3NpemVfdCByZWFsVGFnU2l6ZSA9IHV0ZjE2X3RvX3V0ZjhfbGVuZ3RoKHRhZ3Muc3RyaW5nKCksIHRhZ3Muc2l6ZSgpKTsKLSAgICAgICAgaWYgKHJlYWxUYWdTaXplIDw9IDApIHsKLSAgICAgICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBjb3B5IHRoZSBmbGF0dGVuZWQgc3RyaW5nIGludG8gdGhlIGF0dHJpYnV0ZXMgYXMgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgY29udmVyc2lvbjoKLSAgICAgICAgICAgIC8vIGNvcHlpbmcgYXJyYXkgc2l6ZSAtMSwgYXJyYXkgZm9yIHRhZ3Mgd2FzIGNhbGxvYydkLCBubyBuZWVkIHRvIE5VTEwtdGVybWluYXRlIGl0Ci0gICAgICAgICAgICBzaXplX3QgdGFnU2l6ZSA9IHJlYWxUYWdTaXplID4gQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA/Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEgOiByZWFsVGFnU2l6ZTsKLSAgICAgICAgICAgIHV0ZjE2X3RvX3V0ZjgodGFncy5zdHJpbmcoKSwgdGFnU2l6ZSwgYXR0cmlidXRlcy0+dGFncywKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGF0dHJpYnV0ZXMtPnRhZ3MpIC8gc2l6ZW9mKGF0dHJpYnV0ZXMtPnRhZ3NbMF0pKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJ1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKCkgcmVjZWl2ZWQgdW5mbGF0dGVuZWQgdGFncywgaWdub3JpbmcgdGFnIHZhbHVlcyIpOwotICAgICAgICBzdHJjcHkoYXR0cmlidXRlcy0+dGFncywgIiIpOwotICAgIH0KLX0KLQotY2xhc3MgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI6IHB1YmxpYyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjayB7Ci1wdWJsaWM6Ci0gICAgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiYgbGlzdGVuZXIpCi0gICAgICAgIDogbUxpc3RlbmVyKGxpc3RlbmVyKSB7IH0KLQotICAgIH5BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcigpIHsgfQotCi0gICAgdmlydHVhbCB2b2lkIG9uQXVkaW9EZXZpY2VVcGRhdGUoYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSBvdmVycmlkZSB7Ci0gICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudCgwLCBNRURJQTJfQVVESU9fUk9VVElOR19DSEFOR0VELCBhdWRpb0lvLCBkZXZpY2VJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQpOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHdwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gbUxpc3RlbmVyOwotfTsKLQogY2xhc3MgcHJveHlMaXN0ZW5lciA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lciB7CiBwdWJsaWM6CiAgICAgcHJveHlMaXN0ZW5lcihjb25zdCB3cDxNZWRpYVBsYXllcjI+ICZwbGF5ZXIpCkBAIC0yMjMsNyArNTYsOCBAQAogCiAgICAgfnByb3h5TGlzdGVuZXIoKSB7IH07CiAKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopIG92ZXJyaWRlIHsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwKKyAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaikgb3ZlcnJpZGUgewogICAgICAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG1QbGF5ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAocGxheWVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIHBsYXllci0+bm90aWZ5KHNyY0lkLCBtc2csIGV4dDEsIGV4dDIsIG9iaik7CkBAIC0yNjUsMTE0ICs5OSwxMTAgQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICBTb3J0ZWRWZWN0b3I8IHNwPE1lZGlhUGxheWVyMj4gPiBwbGF5ZXJzOyAvL3RvIHNlcmlhbGlzZSB0aGUgbXV0ZXggdW5sb2NrICYgY2xpZW50IGRlc3RydWN0aW9uLgogCi0gICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIE1lZGlhUGxheWVyMlxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNSZWNvcmRMb2NrKTsKKyAgICAgICAgZW5zdXJlSW5pdF9sKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gc1BsYXllcnMtPnNpemUoKTsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXIyPiBwID0gKCpzUGxheWVycylbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHAgIT0gMCkgeworICAgICAgICAgICAgICAgIHAtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGxheWVycy5hZGQocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQuYXBwZW5kKCIgRmlsZXMgb3BlbmVkIGFuZC9vciBtYXBwZWQ6XG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkpOworICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7CisgICAgaWYgKGYpIHsKKyAgICAgICAgd2hpbGUgKCFmZW9mKGYpKSB7CisgICAgICAgICAgICBmZ2V0cyhidWZmZXIsIFNJWkUsIGYpOworICAgICAgICAgICAgaWYgKHN0cnN0cihidWZmZXIsICIgL3N0b3JhZ2UvIikgfHwKKyAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vc291bmRzLyIpIHx8CisgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvZGF0YS8iKSB8fAorICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL3N5c3RlbS9tZWRpYS8iKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZjbG9zZShmKTsKICAgICB9IGVsc2UgewotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzUmVjb3JkTG9jayk7Ci0gICAgICAgICAgICBlbnN1cmVJbml0X2woKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gc1BsYXllcnMtPnNpemUoKTsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyMj4gcCA9ICgqc1BsYXllcnMpW2ldLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAocCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHAtPmR1bXAoZmQsIGFyZ3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwbGF5ZXJzLmFkZChwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQogCi0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkpOwotICAgICAgICBGSUxFICpmID0gZm9wZW4oYnVmZmVyLCAiciIpOwotICAgICAgICBpZiAoZikgewotICAgICAgICAgICAgd2hpbGUgKCFmZW9mKGYpKSB7Ci0gICAgICAgICAgICAgICAgZmdldHMoYnVmZmVyLCBTSVpFLCBmKTsKLSAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGJ1ZmZlciwgIiAvc3RvcmFnZS8iKSB8fAotICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vc291bmRzLyIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL2RhdGEvIikgfHwKLSAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL21lZGlhLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmY2xvc2UoZik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkIiwgZ2V0cGlkKCkpOwotICAgICAgICBESVIgKmQgPSBvcGVuZGlyKGJ1ZmZlcik7Ci0gICAgICAgIGlmIChkKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgZGlyZW50ICplbnQ7Ci0gICAgICAgICAgICB3aGlsZSgoZW50ID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoZW50LT5kX25hbWUsIi4iKSAmJiBzdHJjbXAoZW50LT5kX25hbWUsIi4uIikpIHsKLSAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQvJXMiLCBnZXRwaWQoKSwgZW50LT5kX25hbWUpOwotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOwotICAgICAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxpbmt0b1syNTZdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkbGluayhidWZmZXIsIGxpbmt0bywgc2l6ZW9mKGxpbmt0bykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUyXSA9ICcuJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTNdID0gJy4nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NF0gPSAnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU1XSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bbGVuXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnN0cihsaW5rdG8sICIvc3RvcmFnZS8iKSA9PSBsaW5rdG8gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL3NvdW5kcy8iKSA9PSBsaW5rdG8gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvZGF0YS8iKSA9PSBsaW5rdG8gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL21lZGlhLyIpID09IGxpbmt0bykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAtPiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGlua3RvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZCIsIGdldHBpZCgpKTsKKyAgICBESVIgKmQgPSBvcGVuZGlyKGJ1ZmZlcik7CisgICAgaWYgKGQpIHsKKyAgICAgICAgc3RydWN0IGRpcmVudCAqZW50OworICAgICAgICB3aGlsZSgoZW50ID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwiLiIpICYmIHN0cmNtcChlbnQtPmRfbmFtZSwiLi4iKSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkLyVzIiwgZ2V0cGlkKCksIGVudC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOworICAgICAgICAgICAgICAgIGlmIChsc3RhdChidWZmZXIsICZzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocy5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGTE5LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxpbmt0b1syNTZdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRsaW5rKGJ1ZmZlciwgbGlua3RvLCBzaXplb2YobGlua3RvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTJdID0gJy4nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUzXSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NF0gPSAnLic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTVdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bbGVuXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgIHVuZXhwZWN0ZWQgdHlwZSBmb3IgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnN0cihsaW5rdG8sICIvc3RvcmFnZS8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vc291bmRzLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL2RhdGEvIikgPT0gbGlua3RvIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL21lZGlhLyIpID09IGxpbmt0bykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAtPiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5rdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgdW5leHBlY3RlZCB0eXBlIGZvciAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbG9zZWRpcihkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoImNvdWxkbid0IG9wZW4gIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogICAgICAgICB9CisgICAgICAgIGNsb3NlZGlyKGQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoImNvdWxkbid0IG9wZW4gIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CiAKLSAgICAgICAgZ0xvb3BlclJvc3Rlci5kdW1wKGZkLCBhcmdzKTsKKyAgICBnTG9vcGVyUm9zdGVyLmR1bXAoZmQsIGFyZ3MpOwogCi0gICAgICAgIGJvb2wgZHVtcE1lbSA9IGZhbHNlOwotICAgICAgICBib29sIHVucmVhY2hhYmxlTWVtb3J5ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi1tIikpIHsKLSAgICAgICAgICAgICAgICBkdW1wTWVtID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLS11bnJlYWNoYWJsZSIpKSB7Ci0gICAgICAgICAgICAgICAgdW5yZWFjaGFibGVNZW1vcnkgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkdW1wTWVtKSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbkR1bXBpbmcgbWVtb3J5OlxuIik7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBzID0gZHVtcE1lbW9yeUFkZHJlc3NlcygxMDAgLyogbGltaXQgKi8pOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodW5yZWFjaGFibGVNZW1vcnkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyB1bnJlYWNoYWJsZSBtZW1vcnk6XG4iKTsKLSAgICAgICAgICAgIC8vIFRPRE8gLSBzaG91bGQgbGltaXQgYmUgYW4gYXJndW1lbnQgcGFyYW1ldGVyPwotICAgICAgICAgICAgLy8gVE9ETzogZW5hYmxlIEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nIGlmIGl0J3MgcGFydCBvZiBzdGFibGUgQVBJCi0gICAgICAgICAgICAvL3N0ZDo6c3RyaW5nIHMgPSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyh0cnVlIC8qIGNvbnRlbnRzICovLCAxMDAwMCAvKiBsaW1pdCAqLyk7Ci0gICAgICAgICAgICAvL3Jlc3VsdC5hcHBlbmQocy5jX3N0cigpLCBzLnNpemUoKSk7CisgICAgYm9vbCBkdW1wTWVtID0gZmFsc2U7CisgICAgYm9vbCB1bnJlYWNoYWJsZU1lbW9yeSA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLW0iKSkgeworICAgICAgICAgICAgZHVtcE1lbSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLS11bnJlYWNoYWJsZSIpKSB7CisgICAgICAgICAgICB1bnJlYWNoYWJsZU1lbW9yeSA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKGR1bXBNZW0pIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIG1lbW9yeTpcbiIpOworICAgICAgICBzdGQ6OnN0cmluZyBzID0gZHVtcE1lbW9yeUFkZHJlc3NlcygxMDAgLyogbGltaXQgKi8pOworICAgICAgICByZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOworICAgIH0KKyAgICBpZiAodW5yZWFjaGFibGVNZW1vcnkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIHVucmVhY2hhYmxlIG1lbW9yeTpcbiIpOworICAgICAgICAvLyBUT0RPIC0gc2hvdWxkIGxpbWl0IGJlIGFuIGFyZ3VtZW50IHBhcmFtZXRlcj8KKyAgICAgICAgLy8gVE9ETzogZW5hYmxlIEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nIGlmIGl0J3MgcGFydCBvZiBzdGFibGUgQVBJCisgICAgICAgIC8vc3RkOjpzdHJpbmcgcyA9IEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nKHRydWUgLyogY29udGVudHMgKi8sIDEwMDAwIC8qIGxpbWl0ICovKTsKKyAgICAgICAgLy9yZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOworICAgIH0KKwogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTM4MCw4ICsyMTAsOCBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiAvL3N0YXRpYwotc3A8TWVkaWFQbGF5ZXIyPiBNZWRpYVBsYXllcjI6OkNyZWF0ZSgpIHsKLSAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG5ldyBNZWRpYVBsYXllcjIoKTsKK3NwPE1lZGlhUGxheWVyMj4gTWVkaWFQbGF5ZXIyOjpDcmVhdGUoaW50MzJfdCBzZXNzaW9uSWQsIGpvYmplY3QgY29udGV4dCkgeworICAgIHNwPE1lZGlhUGxheWVyMj4gcGxheWVyID0gbmV3IE1lZGlhUGxheWVyMihzZXNzaW9uSWQsIGNvbnRleHQpOwogCiAgICAgaWYgKCFwbGF5ZXItPmluaXQoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM5OCw0NCArMjI4LDM0IEBACiAgICAgcmV0dXJuIGR1bXBQbGF5ZXJzKGZkLCBhcmdzKTsKIH0KIAotTWVkaWFQbGF5ZXIyOjpNZWRpYVBsYXllcjIoKSB7CitNZWRpYVBsYXllcjI6Ok1lZGlhUGxheWVyMihpbnQzMl90IHNlc3Npb25JZCwgam9iamVjdCBjb250ZXh0KSB7CiAgICAgQUxPR1YoImNvbnN0cnVjdG9yIik7CiAgICAgbVNyY0lkID0gMDsKICAgICBtTG9ja1RocmVhZElkID0gMDsKICAgICBtTGlzdGVuZXIgPSBOVUxMOwogICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOworICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBOVUxMOworICAgIG1Db250ZXh0ID0gbmV3IEpPYmplY3RIb2xkZXIoY29udGV4dCk7CiAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IC0xOwogICAgIG1DdXJyZW50U2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOwogICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKICAgICBtU2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOwogICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX0lETEU7CiAgICAgbUxvb3AgPSBmYWxzZTsKLSAgICBtTGVmdFZvbHVtZSA9IG1SaWdodFZvbHVtZSA9IDEuMDsKKyAgICBtVm9sdW1lID0gMS4wOwogICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBtQXVkaW9TZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOwotICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CiAgICAgbVNlbmRMZXZlbCA9IDA7CiAKLSAgICAvLyBUT0RPOiBnZXQgcGlkIGFuZCB1aWQgZnJvbSBKQVZBCi0gICAgbVBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBtVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIG1QaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCk7CisgICAgbVVpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKIAotICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBOVUxMOworICAgIG1BdWRpb091dHB1dCA9IG5ldyBNZWRpYVBsYXllcjJBdWRpb091dHB1dChzZXNzaW9uSWQsIG1VaWQsIG1QaWQsIE5VTEwgLyphdHRyaWJ1dGVzKi8pOwogfQogCiBNZWRpYVBsYXllcjI6On5NZWRpYVBsYXllcjIoKSB7CiAgICAgQUxPR1YoImRlc3RydWN0b3IiKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKLSAgICB9Ci0gICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICBkaXNjb25uZWN0KCk7CiAgICAgcmVtb3ZlUGxheWVyKHRoaXMpOwotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsKLSAgICB9CiB9CiAKIGJvb2wgTWVkaWFQbGF5ZXIyOjppbml0KCkgewpAQCAtNDkzLDE5ICszMTMsMjggQEAKICAgICBpZiAoZHNkID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgLy8gTWljcm9zZWNvbmQgaXMgdXNlZCBpbiBOdVBsYXllcjIuCisgICAgaWYgKGRzZC0+bVN0YXJ0UG9zaXRpb25NcyA+IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zKSB7CisgICAgICAgIGRzZC0+bVN0YXJ0UG9zaXRpb25NcyA9IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zOworICAgICAgICBBTE9HVygic2V0RGF0YVNvdXJjZSwgc3RhcnQgcG9pc3Rpb24gY2xhbXBlZCB0byAlbGxkIG1zIiwgKGxvbmcgbG9uZylkc2QtPm1TdGFydFBvc2l0aW9uTXMpOworICAgIH0KKyAgICBpZiAoZHNkLT5tRW5kUG9zaXRpb25NcyA+IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zKSB7CisgICAgICAgIGRzZC0+bUVuZFBvc2l0aW9uTXMgPSBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNczsKKyAgICAgICAgQUxPR1coInNldERhdGFTb3VyY2UsIGVuZCBwb2lzdGlvbiBjbGFtcGVkIHRvICVsbGQgbXMiLCAobG9uZyBsb25nKWRzZC0+bVN0YXJ0UG9zaXRpb25Ncyk7CisgICAgfQogICAgIEFMT0dWKCJzZXREYXRhU291cmNlIHR5cGUoJWQpLCBzcmNJZCglbGxkKSIsIGRzZC0+bVR5cGUsIChsb25nIGxvbmcpZHNkLT5tSWQpOwogCiAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBvbGRQbGF5ZXI7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgaWYgKCEoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpCiAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U3RhdGUgPT0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikpIHsKICAgICAgICAgICAgIEFMT0dFKCJzZXREYXRhU291cmNlIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAKLSAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXIgPSBuZXcgTnVQbGF5ZXIyRHJpdmVyKG1QaWQsIG1VaWQpOworICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IHBsYXllciA9IG5ldyBOdVBsYXllcjJEcml2ZXIobVBpZCwgbVVpZCwgbUNvbnRleHQpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBwbGF5ZXItPmluaXRDaGVjaygpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBwbGF5ZXIgb2JqZWN0LCBpbml0Q2hlY2sgZmFpbGVkKCVkKSIsIGVycik7CkBAIC01MTUsOCArMzQ0LDYgQEAKICAgICAgICAgY2xlYXJfbCgpOwogCiAgICAgICAgIHBsYXllci0+c2V0TGlzdGVuZXIobmV3IHByb3h5TGlzdGVuZXIodGhpcykpOwotICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBtVWlkLAotICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMsIG5ldyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihwbGF5ZXIpKTsKICAgICAgICAgcGxheWVyLT5zZXRBdWRpb1NpbmsobUF1ZGlvT3V0cHV0KTsKIAogICAgICAgICBlcnIgPSBwbGF5ZXItPnNldERhdGFTb3VyY2UoZHNkKTsKQEAgLTU2NSw3OSArMzkyLDE4IEBACiAgICAgcmV0dXJuIG1QbGF5ZXItPnBsYXlOZXh0RGF0YVNvdXJjZShzcmNJZCk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6aW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjppbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVwbHkpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGNvbnN0IGJvb2wgaGFzQmVlbkluaXRpYWxpemVkID0KICAgICAgICAgICAgIChtQ3VycmVudFN0YXRlICE9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpICYmCiAgICAgICAgICAgICAoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpICE9IE1FRElBX1BMQVlFUjJfSURMRSk7CiAgICAgaWYgKChtUGxheWVyID09IE5VTEwpIHx8ICFoYXNCZWVuSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgQUxPR0UoImludm9rZSBmYWlsZWQ6IHdyb25nIHN0YXRlICVYLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOworICAgICAgICBBTE9HRSgiaW52b2tlKCkgZmFpbGVkOiB3cm9uZyBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBBTE9HVigiaW52b2tlICV6dSIsIHJlcXVlc3QuZGF0YVNpemUoKSk7CiAgICAgcmV0dXJuIG1QbGF5ZXItPmludm9rZShyZXF1ZXN0LCByZXBseSk7CiB9CiAKLS8vIFRoaXMgY2FsbCBkb2Vzbid0IG5lZWQgdG8gYWNjZXNzIHRoZSBuYXRpdmUgcGxheWVyLgotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRNZXRhZGF0YUZpbHRlcihjb25zdCBQYXJjZWwmIGZpbHRlcikgewotICAgIEFMT0dEKCJzZXRNZXRhZGF0YUZpbHRlciIpOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIGFsbG93LCBkcm9wOwotCi0gICAgaWYgKHVubWFyc2hhbGxGaWx0ZXIoZmlsdGVyLCAmYWxsb3csICZzdGF0dXMpICYmCi0gICAgICAgIHVubWFyc2hhbGxGaWx0ZXIoZmlsdGVyLCAmZHJvcCwgJnN0YXR1cykpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgICAgIG1NZXRhZGF0YUFsbG93ID0gYWxsb3c7Ci0gICAgICAgIG1NZXRhZGF0YURyb3AgPSBkcm9wOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgLyogYXBwbHlfZmlsdGVyICovLCBQYXJjZWwgKnJlcGx5KSB7Ci0gICAgQUxPR0QoImdldE1ldGFkYXRhIik7Ci0gICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXI7Ci0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgaWRzOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICB7Ci0gICAgICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0KLSAgICAgICAgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgLy8gUGxhY2Vob2xkZXIgZm9yIHRoZSByZXR1cm4gY29kZSwgdXBkYXRlZCBieSB0aGUgY2FsbGVyLgotICAgICAgICByZXBseS0+d3JpdGVJbnQzMigtMSk7Ci0KLSAgICAgICAgLy8gV2UgZG9uJ3QgYmxvY2sgbm90aWZpY2F0aW9ucyB3aGlsZSB3ZSBmZXRjaCB0aGUgZGF0YS4gV2UgY2xlYXIKLSAgICAgICAgLy8gbU1ldGFkYXRhVXBkYXRlZCBmaXJzdCBzbyB3ZSBkb24ndCBsb3NlIG5vdGlmaWNhdGlvbnMgaGFwcGVuaW5nCi0gICAgICAgIC8vIGR1cmluZyB0aGUgcmVzdCBvZiB0aGlzIGNhbGwuCi0gICAgICAgIGlmICh1cGRhdGVfb25seSkgewotICAgICAgICAgICAgaWRzID0gbU1ldGFkYXRhVXBkYXRlZDsKLSAgICAgICAgfQotICAgICAgICBtTWV0YWRhdGFVcGRhdGVkLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgbWVkaWE6Ok1ldGFkYXRhIG1ldGFkYXRhKHJlcGx5KTsKLQotICAgIG1ldGFkYXRhLmFwcGVuZEhlYWRlcigpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBsYXllci0+Z2V0TWV0YWRhdGEoaWRzLCByZXBseSk7Ci0KLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIG1ldGFkYXRhLnJlc2V0UGFyY2VsKCk7Ci0gICAgICAgIEFMT0dFKCJnZXRNZXRhZGF0YSBmYWlsZWQgJWQiLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBlbWVudCBmaWx0ZXJpbmcgb24gdGhlIHJlc3VsdC4gTm90IGNyaXRpY2FsIHNpbmNlCi0gICAgLy8gZmlsdGVyaW5nIHRha2VzIHBsYWNlIG9uIHRoZSB1cGRhdGUgbm90aWZpY2F0aW9ucyBhbHJlYWR5LiBUaGlzCi0gICAgLy8gd291bGQgYmUgd2hlbiBhbGwgdGhlIG1ldGFkYXRhIGFyZSBmZXRjaCBhbmQgYSBmaWx0ZXIgaXMgc2V0LgotCi0gICAgLy8gRXZlcnl0aGluZyBpcyBmaW5lLCB1cGRhdGUgdGhlIG1ldGFkYXRhIGxlbmd0aC4KLSAgICBtZXRhZGF0YS51cGRhdGVMZW5ndGgoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KIHZvaWQgTWVkaWFQbGF5ZXIyOjpkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKSB7CiAgICAgaWYgKG1Db25uZWN0ZWRXaW5kb3cgIT0gTlVMTCAmJiBtQ29ubmVjdGVkV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KApAQCAtNzI3LDIyICs0OTMsOSBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7Ci0gICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOwotICAgIH0KLSAgICBtQXVkaW9BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgdW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcyhwYXJjZWwsIG1BdWRpb0F0dHJpYnV0ZXMpOwotCi0gICAgQUxPR1YoInNldEF1ZGlvQXR0cmlidXRlc19sKCkgdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9JXMiLAotICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy0+dXNhZ2UsIG1BdWRpb0F0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSwgbUF1ZGlvQXR0cmlidXRlcy0+ZmxhZ3MsCi0gICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT50YWdzKTsKLQotICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICBtQXVkaW9PdXRwdXQtPnNldEF1ZGlvQXR0cmlidXRlcyhtQXVkaW9BdHRyaWJ1dGVzKTsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSBOVUxMKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC03NTAsMTQgKzUwMywxMiBAQAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlQXN5bmMoKSB7CiAgICAgQUxPR1YoInByZXBhcmVBc3luYyIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfSU5JVElBTElaRUQgfCBNRURJQV9QTEFZRVIyX1NUT1BQRUQpKSkgewotICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRBdWRpb0F0dHJpYnV0ZXNfbCgqbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCk7CisgICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JTklUSUFMSVpFRCkpIHsKKyAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2wobUF1ZGlvQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldEF1ZGlvU3RyZWFtVHlwZShtU3RyZWFtVHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUFJFUEFSSU5HOwogICAgICAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7CkBAIC03ODEsNyArNTMyLDcgQEAKICAgICAgICAgbVBsYXllci0+c2V0TG9vcGluZyhtTG9vcCk7CiAKICAgICAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKG1Wb2x1bWUpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CkBAIC04MDYsMzAgKzU1NywxMiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUT1BQRUQpIHJldHVybiBOT19FUlJPUjsKLSAgICBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSMl9TVEFSVEVEIHwgTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8Ci0gICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSApICkgKSB7Ci0gICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnN0b3AoKTsKLSAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVE9QUEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIEFMT0dFKCJzdG9wIGNhbGxlZCBpbiBzdGF0ZSAlZCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KIHN0YXR1c190IE1lZGlhUGxheWVyMjo6cGF1c2UoKSB7CiAgICAgQUxPR1YoInBhdXNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BBVVNFRHxNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSkKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkpIHsKKyAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9TVEFSVEVEIHwgTUVESUFfUExBWUVSMl9QUkVQQVJFRCkpKSB7CiAgICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnBhdXNlKCk7CiAgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOwpAQCAtODYwLDcgKzU5Myw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1tZWRpYXBsYXllcjJfc3RhdGVzIE1lZGlhUGxheWVyMjo6Z2V0TWVkaWFQbGF5ZXIyU3RhdGUoKSB7CittZWRpYXBsYXllcjJfc3RhdGVzIE1lZGlhUGxheWVyMjo6Z2V0U3RhdGUoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpIHsKICAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUjsKQEAgLTg3Myw4ICs2MDYsNyBAQAogICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFSVEVEKSB7CiAgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfUExBWUlORzsKICAgICB9Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUKLSAgICAgICAgJiAoTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1NUT1BQRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSkgeworICAgIGlmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpIHsKICAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQ7CiAgICAgfQogICAgIC8vIG5vdyBvbmx5IG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIGlzIHRydWUKQEAgLTg5MCw3ICs2MjIsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGxheWVyID09IDAgfHwgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUT1BQRUQpKSB7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC05NzgsMTEgKzcxMCwxOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYykgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXREdXJhdGlvbihpbnQ2NF90IHNyY0lkLCBpbnQ2NF90ICptc2VjKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBUT0RPOiBjYWNoZSBkdXJhdGlvbiBmb3IgY3VycmVudFNyY0lkIGFuZCBuZXh0U3JjSWQsIGFuZCByZXR1cm4gY29ycmVjdAorICAgIC8vIHZhbHVlIGZvciBuZXh0U3JjSWQuCisgICAgaWYgKHNyY0lkICE9IG1TcmNJZCkgeworICAgICAgICAqbXNlYyA9IC0xOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgQUxPR1YoImdldER1cmF0aW9uX2wiKTsKICAgICBib29sIGlzVmFsaWRTdGF0ZSA9IChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAotICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1NUT1BQRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSk7CisgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKTsKICAgICBpZiAobVBsYXllciA9PSAwIHx8ICFpc1ZhbGlkU3RhdGUpIHsKICAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gY2FsbCBnZXREdXJhdGlvbiBpbiB3cm9uZyBzdGF0ZTogbVBsYXllcj0lcCwgbUN1cnJlbnRTdGF0ZT0ldSIsCiAgICAgICAgICAgICAgICAgbVBsYXllci5nZXQoKSwgbUN1cnJlbnRTdGF0ZSk7CkBAIC0xMTM4LDE4ICs4NzcsMTcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKSB7Ci0gICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoJWYpIiwgdm9sdW1lKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1MZWZ0Vm9sdW1lID0gbGVmdFZvbHVtZTsKLSAgICBtUmlnaHRWb2x1bWUgPSByaWdodFZvbHVtZTsKKyAgICBtVm9sdW1lID0gdm9sdW1lOwogICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZShsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKHZvbHVtZSk7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKGludDMyX3Qgc2Vzc2lvbklkKSB7CiAgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoJWQpIiwgc2Vzc2lvbklkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmICghKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpKSB7CkBAIC0xMTU5LDE3ICs4OTcsMTggQEAKICAgICBpZiAoc2Vzc2lvbklkIDwgMCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAoc2Vzc2lvbklkICE9IG1BdWRpb1Nlc3Npb25JZCkgewotICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKHNlc3Npb25JZCwgLTEpOwotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwotICAgICAgICBtQXVkaW9TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSBOVUxMICYmIHNlc3Npb25JZCAhPSBtQXVkaW9PdXRwdXQtPmdldFNlc3Npb25JZCgpKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9fc2Vzc2lvbl90IE1lZGlhUGxheWVyMjo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7CitpbnQzMl90IE1lZGlhUGxheWVyMjo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvU2Vzc2lvbklkOworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5nZXRTZXNzaW9uSWQoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKSB7CkBAIC0xMTk2LDY3ICs5MzUsMzcgQEAKIH0KIAogLy8gYWx3YXlzIGNhbGwgd2l0aCBsb2NrIGhlbGQKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6Y2hlY2tTdGF0ZUZvcktleVNldF9sKGludCBrZXkpIHsKLSAgICBzd2l0Y2goa2V5KSB7Ci0gICAgY2FzZSBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTOgotICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8Ci0gICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSApIHsKLSAgICAgICAgICAgIC8vIENhbid0IGNoYW5nZSB0aGUgYXVkaW8gYXR0cmlidXRlcyBhZnRlciBwcmVwYXJlCi0gICAgICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIHNldCBhdWRpbyBhdHRyaWJ1dGVzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8vIHBhcmFtZXRlciBkb2Vzbid0IHJlcXVpcmUgcGxheWVyIHN0YXRlIGNoZWNrCi0gICAgICAgIGJyZWFrOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpjaGVja1N0YXRlX2woKSB7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAorICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSApIHsKKyAgICAgICAgLy8gQ2FuJ3QgY2hhbmdlIHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGFmdGVyIHByZXBhcmUKKyAgICAgICAgQUxPR0UoInRyeWluZyB0byBzZXQgYXVkaW8gYXR0cmlidXRlcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCkgewotICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldFBhcmFtZXRlciglZCkiLCBrZXkpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0QXVkaW9BdHRyaWJ1dGVzIik7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tTdGF0ZUZvcktleVNldF9sKGtleSkgIT0gT0spIHsKKyAgICBpZiAoY2hlY2tTdGF0ZV9sKCkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgc3dpdGNoIChrZXkpIHsKLSAgICBjYXNlIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6Ci0gICAgICAgIC8vIHNhdmUgdGhlIG1hcnNoYWxsZWQgYXVkaW8gYXR0cmlidXRlcwotICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKLSAgICAgICAgfQotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gbmV3IFBhcmNlbCgpOwotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLT5hcHBlbmRGcm9tKCZyZXF1ZXN0LCAwLCByZXF1ZXN0LmRhdGFTaXplKCkpOwotICAgICAgICBzdGF0dXMgPSBzZXRBdWRpb0F0dHJpYnV0ZXNfbChyZXF1ZXN0KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVl9JRihtUGxheWVyID09IE5VTEwsICJzZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKG1QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICBzdGF0dXMgPSBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKLSAgICB9CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOworICAgIHN0YXR1cyA9IHNldEF1ZGlvQXR0cmlidXRlc19sKGF0dHJpYnV0ZXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK2pvYmplY3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb0F0dHJpYnV0ZXMoKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6Z2V0QXVkaW9BdHRyaWJ1dGVzKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCA/IG1BdWRpb0F0dHJpYnV0ZXMtPmdldEpPYmplY3QoKSA6IE5VTEw7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpnZXRQYXJhbWV0ZXIoJWQpIiwga2V5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChrZXkgPT0gTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUykgewotICAgICAgICBpZiAocmVwbHkgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXBseS0+YXBwZW5kRnJvbShtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLCAwLCBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLT5kYXRhU2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCiAgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiZ2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTEyNjksNDQgKzk3OCwyNiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLWJvb2wgTWVkaWFQbGF5ZXIyOjpzaG91bGREcm9wTWV0YWRhdGEobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIGNvZGUpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0KLSAgICBpZiAoZmluZE1ldGFkYXRhKG1NZXRhZGF0YURyb3AsIGNvZGUpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworLy8gZm9yIG1lZGlhbWV0cmljcworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRNZXRyaWNzKGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKSB7CisgICAgQUxPR0QoIk1lZGlhUGxheWVyMjo6Z2V0TWV0cmljcygpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJnZXRNZXRyaWNzOiBubyBhY3RpdmUgcGxheWVyIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBpZiAobU1ldGFkYXRhQWxsb3cuaXNFbXB0eSgpIHx8IGZpbmRNZXRhZGF0YShtTWV0YWRhdGFBbGxvdywgY29kZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgIHN0YXR1c190IHN0YXR1cyA9ICBtUGxheWVyLT5nZXRNZXRyaWNzKGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJnZXRNZXRyaWNzIHJldHVybnMgJWQiLCBzdGF0dXMpOwogICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi0KLXZvaWQgTWVkaWFQbGF5ZXIyOjphZGROZXdNZXRhZGF0YVVwZGF0ZShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgbWV0YWRhdGFfdHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobU1ldGFkYXRhVXBkYXRlZC5pbmRleE9mKG1ldGFkYXRhX3R5cGUpIDwgMCkgewotICAgICAgICBtTWV0YWRhdGFVcGRhdGVkLmFkZChtZXRhZGF0YV90eXBlKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXIyOjpub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgewordm9pZCBNZWRpYVBsYXllcjI6Om5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaikgewogICAgIEFMT0dWKCJtZXNzYWdlIHJlY2VpdmVkIHNyY0lkPSVsbGQsIG1zZz0lZCwgZXh0MT0lZCwgZXh0Mj0lZCIsCiAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyKTsKIAotICAgIGlmIChNRURJQTJfSU5GTyA9PSBtc2cgJiYgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFID09IGV4dDEpIHsKLSAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlIG1ldGFkYXRhX3R5cGUgPSBleHQyOwotCi0gICAgICAgIGlmKHNob3VsZERyb3BNZXRhZGF0YShtZXRhZGF0YV90eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHRoYXQgaGF2ZSBjaGFuZ2VkLiBnZXRNZXRhZGF0YQotICAgICAgICAvLyBhbHNvIGFjY2VzcyBtTWV0YWRhdGFVcGRhdGVkIGFuZCBjbGVhcnMgaXQuCi0gICAgICAgIGFkZE5ld01ldGFkYXRhVXBkYXRlKG1ldGFkYXRhX3R5cGUpOwotICAgIH0KLQogICAgIGJvb2wgc2VuZCA9IHRydWU7CiAgICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKIApAQCAtMTQxOCw3ICsxMTA5LDggQEAKIH0KIAogLy8gTW9kdWxhciBEUk0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlRHJtKAorICAgICAgICBpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCkgewogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCiAgICAgQUxPR0QoInByZXBhcmVEcm06IHV1aWQ6ICVwICBkcm1TZXNzaW9uSWQ6ICVwKCV6dSkiLCB1dWlkLAogICAgICAgICAgICAgZHJtU2Vzc2lvbklkLmFycmF5KCksIGRybVNlc3Npb25JZC5zaXplKCkpOwpAQCAtMTQzMiw4ICsxMTI0LDEwIEBACiAgICAgLy8gY29tcGxldGVkKSBzbyB0aGUgc3RhdGUgY2hhbmdlIHRvICJwcmVwYXJlZCIgbWlnaHQgbm90IGhhdmUgaGFwcGVuZWQgeWV0IChlLmcuLCBidWZmZXJpbmcpLgogICAgIC8vIFN0aWxsLCB3ZSBjYW4gYWxsb3cgcHJlcGFyZURybSBmb3IgdGhlIHVzZSBjYXNlIG9mIGJlaW5nIGNhbGxlZCBpbiBPbkRybUluZm9MaXN0ZW5lci4KICAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUFJFUEFSSU5HIHwgTUVESUFfUExBWUVSMl9QUkVQQVJFRCkpKSB7Ci0gICAgICAgIEFMT0dFKCJwcmVwYXJlRHJtIGlzIGNhbGxlZCBpbiB0aGUgd3Jvbmcgc3RhdGUgKCVkKS4iLCBtQ3VycmVudFN0YXRlKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBBTE9HVygicHJlcGFyZURybSglbGxkKSBjYWxsZWQgaW4gbm9uLXByZXBhcmUgc3RhdGUoJWQpIiwgKGxvbmcgbG9uZylzcmNJZCwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgIGlmIChzcmNJZCA9PSBtU3JjSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChkcm1TZXNzaW9uSWQuaXNFbXB0eSgpKSB7CkBAIC0xNDQyLDcgKzExMzYsNyBAQAogICAgIH0KIAogICAgIC8vIFBhc3NpbmcgZG93biB0byBtZWRpYXNlcnZlciBtYWlubHkgZm9yIGNyZWF0aW5nIHRoZSBjcnlwdG8KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHV1aWQsIGRybVNlc3Npb25JZCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cHJlcGFyZURybShzcmNJZCwgdXVpZCwgZHJtU2Vzc2lvbklkKTsKICAgICBBTE9HRV9JRihzdGF0dXMgIT0gT0ssICJwcmVwYXJlRHJtOiBGYWlsZWQgYXQgbWVkaWFzZXJ2ZXIgd2l0aCByZXQ6ICVkIiwgc3RhdHVzKTsKIAogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCkBAIC0xNDUxLDcgKzExNDUsNyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6cmVsZWFzZURybSgpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cmVsZWFzZURybShpbnQ2NF90IHNyY0lkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTQ2Niw3ICsxMTYwLDcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5yZWxlYXNlRHJtKHNyY0lkKTsKICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgogICAgIEFMT0dEKCJyZWxlYXNlRHJtOiBtZWRpYXNlcnZlcjo6cmVsZWFzZURybSByZXQ6ICVkIiwgc3RhdHVzKTsKICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CkBAIC0xNDc5LDM2ICsxMTczLDQwIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CisgICAgICAgIEFMT0dWKCJzZXRQcmVmZXJyZWREZXZpY2U6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+c2V0UHJlZmVycmVkRGV2aWNlKGRldmljZSk7CiB9CiAKLWF1ZGlvX3BvcnRfaGFuZGxlX3QgTWVkaWFQbGF5ZXIyOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKK2pvYmplY3QgTWVkaWFQbGF5ZXIyOjpnZXRSb3V0ZWREZXZpY2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CisgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb091dHB1dC0+Z2V0Um91dGVkRGV2aWNlSWQoJmRldmljZUlkKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlSWQ7CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+Z2V0Um91dGVkRGV2aWNlKCk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrOiBwbGF5ZXIgbm90IGluaXQiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soZW5hYmxlZCk7CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhyb3V0aW5nRGVsZWdhdGUpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrOiBwbGF5ZXIgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobGlzdGVuZXIpOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAKaW5kZXggOWIzYWFkMi4uMGY2OWIyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icApAQCAtMSw2ICsxLDcgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkpNZWRpYVBsYXllcjJVdGlscy5jcHAiLAogICAgICAgICAiSldha2VMb2NrLmNwcCIsCiAgICAgICAgICJHZW5lcmljU291cmNlMi5jcHAiLAogICAgICAgICAiSFRUUExpdmVTb3VyY2UyLmNwcCIsCkBAIC0yOCw2ICsyOSw4IEBACiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0IiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrIiwKKyAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtNDgsMTMgKzUxLDE2IEBACiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlibWVkaWEiLAotICAgICAgICAibGlibWVkaWFkcm0iLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm1lZGlhbmRrX3V0aWxzIiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlibWVkaWFwbGF5ZXIyLXByb3RvcyIsCisgICAgICAgICJsaWJtZWRpYTJfam5pX2NvcmUiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIyIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKaW5kZXggMTk2YjEwMy4uOTU1MjU4MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKQEAgLTIxLDMwICsyMSwxOSBAQAogI2luY2x1ZGUgIk51UGxheWVyMkRybS5oIgogCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OZGtVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKLSNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODksOCArNzgsNiBAQAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpyZXNldERhdGFTb3VyY2UoKSB7CiAgICAgQUxPR1YoInJlc2V0RGF0YVNvdXJjZSIpOwogCi0gICAgbUhUVFBTZXJ2aWNlLmNsZWFyKCk7Ci0gICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKICAgICBtRGlzY29ubmVjdGVkID0gZmFsc2U7CiAgICAgbVVyaS5jbGVhcigpOwogICAgIG1VcmlIZWFkZXJzLmNsZWFyKCk7CkBAIC0xMTAsNyArOTcsNiBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTE4LDcgKzEwNCw2IEBACiAKICAgICByZXNldERhdGFTb3VyY2UoKTsKIAotICAgIG1IVFRQU2VydmljZSA9IGh0dHBTZXJ2aWNlOwogICAgIG1VcmkgPSB1cmw7CiAKICAgICBpZiAoaGVhZGVycykgewpAQCAtMTUxLDcgKzEzNiw3IEBACiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UgKHNvdXJjZTogJXApIiwgc291cmNlLmdldCgpKTsKIAogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwotICAgIG1EYXRhU291cmNlID0gc291cmNlOworICAgIG1EYXRhU291cmNlV3JhcHBlciA9IG5ldyBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihzb3VyY2UpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTYyLDI0ICsxNDcsMjEgQEAKIAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6aW5pdEZyb21EYXRhU291cmNlKCkgewogICAgIG1FeHRyYWN0b3IgPSBuZXcgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfbmV3KCkpOwotICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwgfHwgbUZkICE9IC0xKTsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CisgICAgQ0hFQ0sobUZkID49MCB8fCBtRGF0YVNvdXJjZVdyYXBwZXIgIT0gTlVMTCk7CisgICAgc3A8QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI+IGFTb3VyY2VXcmFwcGVyID0gbURhdGFTb3VyY2VXcmFwcGVyOwogICAgIGNvbnN0IGludCBmZCA9IG1GZDsKLSAgICBjb25zdCBpbnQ2NF90IG9mZnNldCA9IG1PZmZzZXQ7Ci0gICAgY29uc3QgaW50NjRfdCBsZW5ndGggPSBtTGVuZ3RoOwogCiAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgLy8gVGhpcyBtaWdodCB0YWtlIGxvbmcgdGltZSBpZiBkYXRhIHNvdXJjZSBpcyBub3QgcmVsaWFibGUuCiAgICAgc3RhdHVzX3QgZXJyOwotICAgIGlmIChkYXRhU291cmNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyID0gbmV3IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGRhdGFTb3VyY2UpOwotICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKKyAgICBpZiAoYVNvdXJjZVdyYXBwZXIgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShmZCwgbU9mZnNldCwgbUxlbmd0aCk7CiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiaW5pdEZyb21EYXRhU291cmNlLCBmYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOworICAgICAgICBBTE9HRSgiaW5pdEZyb21EYXRhU291cmNlLCBmYWlsZWQgdG8gc2V0IGV4dHJhY3RvciBkYXRhIHNvdXJjZSEiKTsKICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CkBAIC0xOTEsMTAgKzE3Myw4IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIG1Mb2NrLmxvY2soKTsKLSAgICBtRmQgPSAtMTsKLSAgICBtRGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAgICAgbUZpbGVNZXRhID0gY29udmVydE1lZGlhRm9ybWF0V3JhcHBlclRvTWV0YURhdGEobUV4dHJhY3Rvci0+Z2V0Rm9ybWF0KCkpOworICAgIG1Mb2NrLmxvY2soKTsKICAgICBpZiAobUZpbGVNZXRhICE9IE5VTEwpIHsKICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKICAgICAgICAgaWYgKG1GaWxlTWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgewpAQCAtMjE1LDEwICsxOTUsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IHRyYWNrRXh0cmFjdG9yID0gbmV3IEFNZWRpYUV4dHJhY3RvcldyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX25ldygpKTsKLSAgICAgICAgaWYgKG1EYXRhU291cmNlV3JhcHBlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBlcnIgPSB0cmFja0V4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShtRGF0YVNvdXJjZVdyYXBwZXItPmdldEFNZWRpYURhdGFTb3VyY2UoKSk7CisgICAgICAgIGlmIChhU291cmNlV3JhcHBlciAhPSBOVUxMKSB7CisgICAgICAgICAgICB0cmFja0V4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgICAgICB0cmFja0V4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShmZCwgbU9mZnNldCwgbUxlbmd0aCk7CiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBjaGFyICptaW1lOwpAQCAtMzMwLDE5ICszMTAsMTkgQEAKICAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CiAgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKICAgICB9Ci0gICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbURhdGFTb3VyY2UtPmNsb3NlKCk7CisgICAgaWYgKG1EYXRhU291cmNlV3JhcHBlciAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhU291cmNlV3JhcHBlci0+Y2xvc2UoKTsKICAgICB9CiAgICAgcmVzZXREYXRhU291cmNlKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cHJlcGFyZUFzeW5jKCkgewordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpwcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQUxPR1YoInByZXBhcmVBc3luYzogKGxvb3BlcjogJWQpIiwgKG1Mb29wZXIgIT0gTlVMTCkpOwogCiAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgewogICAgICAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgICAgIG1Mb29wZXItPnNldE5hbWUoImdlbmVyaWMiKTsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgiZ2VuZXJpYzIiKTsKICAgICAgICAgbUxvb3Blci0+c3RhcnQoZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwogICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CkBAIC0zNTEsNTkgKzMzMSw0NSBAQAogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlQXN5bmMsIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInN0YXJ0VGltZVVzIiwgc3RhcnRUaW1lVXMpOworCiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6b25QcmVwYXJlQXN5bmMoKSB7Ci0gICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBtRGF0YVNvdXJjZTogJWQiLCAobURhdGFTb3VyY2UgIT0gTlVMTCkpOwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKSB7CisgICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBtRmQgJWQgbVVyaSAlcyBtRGF0YVNvdXJjZVdyYXBwZXI6ICVwIiwKKyAgICAgICAgICAgIG1GZCwgbVVyaS5jX3N0cigpLCBtRGF0YVNvdXJjZVdyYXBwZXIuZ2V0KCkpOwogCi0gICAgLy8gZGVsYXllZCBkYXRhIHNvdXJjZSBjcmVhdGlvbgotICAgIGlmIChtRGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIHNldCB0byBmYWxzZSBmaXJzdCwgaWYgdGhlIGV4dHJhY3RvcgotICAgICAgICAvLyBjb21lcyBiYWNrIGFzIHNlY3VyZSwgc2V0IGl0IHRvIHRydWUgdGhlbi4KLSAgICAgICAgbUlzU2VjdXJlID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFtVXJpLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSA9IG1VcmkuY19zdHIoKTsKLSAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGU7Ci0KLSAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpKSB7Ci0gICAgICAgICAgICAgICAgbUh0dHBTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlTWVkaWFIVFRQKG1IVFRQU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1IdHRwU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgaHR0cCBzb3VyY2UhIik7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGNvbm5lY3Rpb24gaGFzIHNvbWUgaXNzdWUuCi0gICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoCi0gICAgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlLCB1cmksICZtVXJpSGVhZGVycywgJmNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1IdHRwU291cmNlLmdldCgpKSk7Ci0gICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7Ci0gICAgICAgICAgICB9CisgICAgaWYgKCFtVXJpLmVtcHR5KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciogdXJpID0gbVVyaS5jX3N0cigpOworICAgICAgICBzaXplX3QgbnVtaGVhZGVycyA9IG1VcmlIZWFkZXJzLnNpemUoKTsKKyAgICAgICAgY29uc3QgY2hhciAqKmtleV92YWx1ZXMgPSBudW1oZWFkZXJzID8gbmV3IGNvbnN0IGNoYXIgKltudW1oZWFkZXJzICogMl0gOiBOVUxMOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWhlYWRlcnM7ICsraSkgeworICAgICAgICAgICAga2V5X3ZhbHVlc1tpICogMl0gPSBtVXJpSGVhZGVycy5rZXlBdChpKS5jX3N0cigpOworICAgICAgICAgICAga2V5X3ZhbHVlc1tpICogMiArIDFdID0gIG1VcmlIZWFkZXJzLnZhbHVlQXQoaSkuY19zdHIoKTsKICAgICAgICAgfQotCi0gICAgICAgIGlmIChtRmQgPT0gLTEgJiYgbURhdGFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7Ci0gICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIEFNZWRpYURhdGFTb3VyY2UgKmFTb3VyY2UgPSBBTWVkaWFEYXRhU291cmNlX25ld1VyaSh1cmksIG51bWhlYWRlcnMsIGtleV92YWx1ZXMpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIG1EYXRhU291cmNlV3JhcHBlciA9IGFTb3VyY2UgPyBuZXcgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoYVNvdXJjZSkgOiBOVUxMOworICAgICAgICBkZWxldGVbXSBrZXlfdmFsdWVzOworICAgICAgICAvLyBGb3IgY2FjaGVkIHN0cmVhbWluZyBjYXNlcywgd2UgbmVlZCB0byB3YWl0IGZvciBlbm91Z2gKKyAgICAgICAgLy8gYnVmZmVyaW5nIGJlZm9yZSByZXBvcnRpbmcgcHJlcGFyZWQuCisgICAgICAgIG1Jc1N0cmVhbWluZyA9ICFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCk7CiAgICAgfQogCi0gICAgaWYgKG1EYXRhU291cmNlICE9IG51bGxwdHIgJiYgbURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgewotICAgICAgICBtQ2FjaGVkU291cmNlID0gc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKKyAgICBpZiAobURpc2Nvbm5lY3RlZCB8fCAobUZkIDwgMCAmJiBtRGF0YVNvdXJjZVdyYXBwZXIgPT0gTlVMTCkpIHsKKyAgICAgICAgQUxPR0UoIm1EaXNjb25uZWN0ZWQoJWQpIG9yIEZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIiwgbURpc2Nvbm5lY3RlZCk7CisgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIEZvciBjYWNoZWQgc3RyZWFtaW5nIGNhc2VzLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGVub3VnaAotICAgIC8vIGJ1ZmZlcmluZyBiZWZvcmUgcmVwb3J0aW5nIHByZXBhcmVkLgotICAgIG1Jc1N0cmVhbWluZyA9IChtQ2FjaGVkU291cmNlICE9IE5VTEwpOwotCiAgICAgLy8gaW5pdCBleHRyYWN0b3IgZnJvbSBkYXRhIHNvdXJjZQogICAgIHN0YXR1c190IGVyciA9IGluaXRGcm9tRGF0YVNvdXJjZSgpOworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICBjbG9zZShtRmQpOworICAgICAgICBtRmQgPSAtMTsKKyAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBmcm9tIGRhdGEgc291cmNlISIpOwpAQCAtNDMwLDYgKzM5Niw3IEBACiAgICAgICAgICAgICBGTEFHX0NBTl9TRUVLX0ZPUldBUkQgfAogICAgICAgICAgICAgRkxBR19DQU5fU0VFSyk7CiAKKyAgICBkb1NlZWsoc3RhcnRUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QpOwogICAgIGZpbmlzaFByZXBhcmVBc3luYygpOwogCiAgICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBEb25lIik7CkBAIC00MzksOCArNDA2LDggQEAKICAgICBBTE9HVigiZmluaXNoUHJlcGFyZUFzeW5jIik7CiAKICAgICBpZiAobUlzU3RyZWFtaW5nKSB7Ci0gICAgICAgIG1DYWNoZWRTb3VyY2UtPnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKICAgICAgICAgbVByZXBhcmluZyA9IHRydWU7CisgICAgICAgICsrbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOwogICAgICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKICAgICB9IGVsc2UgewogICAgICAgICBub3RpZnlQcmVwYXJlZCgpOwpAQCAtNDU3LDkgKzQyNCw3IEBACiAKIHZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6bm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycikgewogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOwotICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXIuY2xlYXIoKTsKIAogICAgICAgICBtQml0cmF0ZSA9IC0xOwogICAgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKQEAgLTQ5OSw1MyArNDY0LDI3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6ZGlzY29ubmVjdCgpIHsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlLCBodHRwU291cmNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOwotICAgICAgICBodHRwU291cmNlID0gbUh0dHBTb3VyY2U7CiAgICAgICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwogICAgIH0KLQotICAgIGlmIChkYXRhU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZGlzY29ubmVjdCBkYXRhIHNvdXJjZQotICAgICAgICBpZiAoZGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4oZGF0YVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaHR0cFNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KGh0dHBTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7CisgICAgaWYgKG1EYXRhU291cmNlV3JhcHBlciAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhU291cmNlV3JhcHBlci0+Y2xvc2UoKTsKICAgICB9Ci0KLSAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBOVUxMOwotCiB9CiAKIHN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmZlZWRNb3JlVFNEYXRhKCkgewogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZW5kQ2FjaGVTdGF0cygpIHsKLSAgICBpbnQzMl90IGticHMgPSAwOwotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IG1DYWNoZWRTb3VyY2UtPmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoJmticHMpOwotICAgIH0KLQotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRDYWNoZVN0YXRzKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYmFuZHdpZHRoIiwga2Jwcyk7Ci0gICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgIH0KLX0KLQogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgY2FzZSBrV2hhdFByZXBhcmVBc3luYzoKICAgICAgIHsKLSAgICAgICAgICBvblByZXBhcmVBc3luYygpOworICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CisgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInN0YXJ0VGltZVVzIiwgJnN0YXJ0VGltZVVzKSk7CisgICAgICAgICAgb25QcmVwYXJlQXN5bmMoc3RhcnRUaW1lVXMpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSBrV2hhdEZldGNoU3VidGl0bGVEYXRhOgpAQCAtODM1LDggKzc3NCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzLT5nZXRBdmFpbGFibGVCdWZmZXJDb3VudCgmZmluYWxSZXN1bHQpIDwgMgogICAgICAgICAgICAgICAgICYmICFtU2VudFBhdXNlT25CdWZmZXJpbmcgJiYgIW1QcmVwYXJpbmcpIHsKLSAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlLT5yZXN1bWVGZXRjaGluZ0lmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKICAgICAgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQpOwpAQCAtMTM0OSw2ICsxMjg2LDExIEBACiAgICAgICAgICAgICBtVmlkZW9UaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgIH0KIAorICAgICAgICBzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiBjcnlwdEluZm8gPSBleHRyYWN0b3ItPmdldFNhbXBsZUNyeXB0b0luZm8oKTsKKyAgICAgICAgaWYgKGNyeXB0SW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRPYmplY3QoImNyeXB0SW5mbyIsIGNyeXB0SW5mbyk7CisgICAgICAgIH0KKwogICAgICAgICBxdWV1ZURpc2NvbnRpbnVpdHlJZk5lZWRlZChzZWVraW5nLCBmb3JtYXRDaGFuZ2UsIHRyYWNrVHlwZSwgdHJhY2spOwogCiAgICAgICAgIGlmIChudW1CdWZmZXJzID09IDAgJiYgYWN0dWFsVGltZVVzICE9IG51bGxwdHIpIHsKQEAgLTEzOTIsNyArMTMzNCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlQcmVwYXJlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVByZXBhcmluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOwpAQCAtMTQ0NCw0NyArMTM4NSwzMSBAQAogfQogCiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbik7Ci0gICAgLy8gRW5xdWlyZXMgYnVmZmVyaW5nIHN0YXR1cyBldmVyeSBzZWNvbmQuCi0gICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7CisgICAgaWYgKG1Jc1N0cmVhbWluZykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOworICAgICAgICAvLyBFbnF1aXJlcyBidWZmZXJpbmcgc3RhdHVzIGV2ZXJ5IHNlY29uZC4KKyAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uUG9sbEJ1ZmZlcmluZygpIHsKLSAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CiAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gLTFsbDsKLSAgICBzc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKIAotICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgY2FjaGVkRGF0YVJlbWFpbmluZyA9IG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKLQotICAgICAgICBpZiAoZmluYWxTdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSA9IDBsbDsKLSAgICAgICAgICAgIGlmIChtRHVyYXRpb25VcyA+IDAgJiYgbUNhY2hlZFNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAvLyB8Yml0cmF0ZXwgdXNlcyBiaXRzL3NlY29uZCB1bml0LCB3aGlsZSBzaXplIGlzIG51bWJlciBvZiBieXRlcy4KLSAgICAgICAgICAgICAgICBiaXRyYXRlID0gc2l6ZSAqIDgwMDAwMDBsbCAvIG1EdXJhdGlvblVzOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQml0cmF0ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBiaXRyYXRlID0gbUJpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYml0cmF0ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzID0gY2FjaGVkRGF0YVJlbWFpbmluZyAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBleHRyYWN0b3I7CisgICAgaWYgKG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBleHRyYWN0b3IgPSBtVmlkZW9UcmFjay5tRXh0cmFjdG9yOworICAgIH0gZWxzZSBpZiAobUF1ZGlvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIGV4dHJhY3RvciA9IG1BdWRpb1RyYWNrLm1FeHRyYWN0b3I7CiAgICAgfQogCi0gICAgaWYgKGZpbmFsU3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IEVPUyAoZmluYWxTdGF0dXMgPSAlZCkiLCBmaW5hbFN0YXR1cyk7Ci0KLSAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuOworICAgIGlmIChleHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBjYWNoZWREdXJhdGlvblVzID0gZXh0cmFjdG9yLT5nZXRDYWNoZWREdXJhdGlvbigpOwogICAgIH0KIAogICAgIGlmIChjYWNoZWREdXJhdGlvblVzID49IDBsbCkgewotICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwbGwpIHsKKyAgICAgICAgc3NpemVfdCBzYW1wbGVTaXplID0gZXh0cmFjdG9yLT5nZXRTYW1wbGVTaXplKCk7CisgICAgICAgIGlmIChzYW1wbGVTaXplID49IDBsbCkgewogICAgICAgICAgICAgaW50NjRfdCBjYWNoZWRQb3NVcyA9IGdldExhc3RSZWFkUG9zaXRpb24oKSArIGNhY2hlZER1cmF0aW9uVXM7CiAgICAgICAgICAgICBpbnQgcGVyY2VudGFnZSA9IDEwMC4wICogY2FjaGVkUG9zVXMgLyBtRHVyYXRpb25VczsKICAgICAgICAgICAgIGlmIChwZXJjZW50YWdlID4gMTAwKSB7CkBAIC0xNDkyLDkgKzE0MTcsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKHBlcmNlbnRhZ2UpOworICAgICAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogY2FjaGVkRHVyYXRpb25VcyAlLjFmIHNlYyIsIGNhY2hlZER1cmF0aW9uVXMgLyAxMDAwMDAwLjBmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOworICAgICAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogRU9TIik7CiAgICAgICAgIH0KLQotICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBjYWNoZWREdXJhdGlvblVzICUuMWYgc2VjIiwgY2FjaGVkRHVyYXRpb25VcyAvIDEwMDAwMDAuMGYpOwogICAgIH0KIAogICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwpAQCAtMTU5MSwxNSArMTUxOCwyMCBAQAogICAgICAgICByZXR1cm4gT0s7IC8vIHNvdXJjZSB3aXRob3V0IERSTSBpbmZvCiAgICAgfQogCi0gICAgc3A8QUJ1ZmZlcj4gZHJtSW5mb0J1ZmZlciA9IE51UGxheWVyMkRybTo6cmV0cmlldmVEcm1JbmZvKHBzc2hJbmZvKTsKLSAgICBBTE9HVigiY2hlY2tEcm1JbmZvOiBNRURJQV9EUk1fSU5GTyBQU1NIIGRybSBpbmZvIHNpemU6ICVkIiwgKGludClkcm1JbmZvQnVmZmVyLT5zaXplKCkpOworICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOworICAgIHN0YXR1c190IHJldCA9IE51UGxheWVyMkRybTo6cmV0cmlldmVEcm1JbmZvKHBzc2hJbmZvLCAmcGxheWVyTXNnKTsKKyAgICBBTE9HVigiY2hlY2tEcm1JbmZvOiBNRURJQV9EUk1fSU5GTyBQU1NIIGRybSBpbmZvIHNpemU6ICVkIiwgKGludClwbGF5ZXJNc2cuQnl0ZVNpemUoKSk7CiAKLSAgICBpZiAoZHJtSW5mb0J1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgQUxPR0UoImNoZWNrRHJtSW5mbzogVW5leHBlY3RlZCBwYXJjZWwgc2l6ZTogMCIpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImNoZWNrRHJtSW5mbzogZmFpbGVkIHRvIHJldHJpdmUgRHJtSW5mbyAlZCIsIHJldCk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIG5vdGlmeURybUluZm8oZHJtSW5mb0J1ZmZlcik7CisgICAgaW50IHNpemUgPSBwbGF5ZXJNc2cuQnl0ZVNpemUoKTsKKyAgICBzcDxBQnVmZmVyPiBkcm1JbmZvQnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgcGxheWVyTXNnLlNlcmlhbGl6ZVRvQXJyYXkoZHJtSW5mb0J1Zi0+ZGF0YSgpLCBzaXplKTsKKyAgICBkcm1JbmZvQnVmLT5zZXRSYW5nZSgwLCBzaXplKTsKKyAgICBub3RpZnlEcm1JbmZvKGRybUluZm9CdWYpOwogCiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oCmluZGV4IDliYzUxODIuLmFkZTFhYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmgKQEAgLTM3LDExICszNyw5IEBACiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgSURhdGFTb3VyY2U7CiBjbGFzcyBJTWVkaWFTb3VyY2U7Ci1zdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIGNsYXNzIE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhQ2xvY2s7Ci1zdHJ1Y3QgTnVDYWNoZWRTb3VyY2UyOwogCiBzdHJ1Y3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMiA6IHB1YmxpYyBOdVBsYXllcjI6OlNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgLy8gTW9kdWxhciBEUk0KQEAgLTUwLDcgKzQ4LDYgQEAKICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jayk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCkBAIC02Miw3ICs1OSw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKIAogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CkBAIC0xNTEsNyArMTQ4LDYgQEAKICAgICBib29sIG1Jc1N0cmVhbWluZzsKICAgICB1aWRfdCBtVUlEOwogICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOwotICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBBU3RyaW5nIG1Vcmk7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVVyaUhlYWRlcnM7CiAgICAgaW50IG1GZDsKQEAgLTE1OSw5ICsxNTUsNiBAQAogICAgIGludDY0X3QgbUxlbmd0aDsKIAogICAgIGJvb2wgbURpc2Nvbm5lY3RlZDsKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbUh0dHBTb3VyY2U7CiAgICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YTsKICAgICBzcDxBTWVkaWFEYXRhU291cmNlV3JhcHBlcj4gbURhdGFTb3VyY2VXcmFwcGVyOwogICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IG1FeHRyYWN0b3I7CkBAIC0xOTQsNyArMTg3LDcgQEAKICAgICB2b2lkIG9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7CiAgICAgc3RhdHVzX3QgZG9TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSk7CiAKLSAgICB2b2lkIG9uUHJlcGFyZUFzeW5jKCk7CisgICAgdm9pZCBvblByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKIAogICAgIHZvaWQgZmV0Y2hUZXh0RGF0YSgKICAgICAgICAgICAgIHVpbnQzMl90IHdoYXQsIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKQEAgLTIzMiw4ICsyMjUsNiBAQAogICAgIHZvaWQgb25Qb2xsQnVmZmVyaW5nKCk7CiAgICAgdm9pZCBub3RpZnlCdWZmZXJpbmdVcGRhdGUoaW50MzJfdCBwZXJjZW50YWdlKTsKIAotICAgIHZvaWQgc2VuZENhY2hlU3RhdHMoKTsKLQogICAgIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXRfbChib29sIGF1ZGlvKTsKICAgICBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YV9sKGJvb2wgYXVkaW8pOwogICAgIGludDMyX3QgZ2V0RGF0YUdlbmVyYXRpb24obWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcAppbmRleCA4ZWRiY2JmLi5lNTM5MDBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwCkBAIC05OSwxMCArOTksMTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKKy8vIFRPRE86IGZldGNoIGRhdGEgc3RhcnRpbmcgZnJvbSB8c3RhcnRUaW1lVXN8Cit2b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpwcmVwYXJlQXN5bmMoaW50NjRfdCAvKiBzdGFydFRpbWVVcyAqLykgewogICAgIGlmIChtTGl2ZUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIG1MaXZlTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgICAgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUiKTsKKyAgICAgICAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZTIiKTsKICAgICAgICAgbUxpdmVMb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogY2FuQ2FsbEphdmEgKi8pOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaAppbmRleCA5N2QzNjUzLi44ZmM3MWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpOwogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3MDNkZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmNwcApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkpNZWRpYVBsYXllcjJVdGlscyIKKworI2luY2x1ZGUgIkpNZWRpYVBsYXllcjJVdGlscy5oIgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJsb2cvbG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludDY0X3Qga09mZmxvYWRNaW5EdXJhdGlvblNlYyA9IDYwOworCisvLyBzdGF0aWMKK2Jvb2wgSk1lZGlhUGxheWVyMlV0aWxzOjppc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIGlmIChoYXNWaWRlbyB8fCBzdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgaWYgKE9LICE9IGdldEF1ZGlvT2ZmbG9hZEluZm8obWV0YSwgaGFzVmlkZW8sIGlzU3RyZWFtaW5nLCBzdHJlYW1UeXBlLCAmaW5mbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpbmZvLmR1cmF0aW9uX3VzIDwga09mZmxvYWRNaW5EdXJhdGlvblNlYyAqIDEwMDAwMDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgYXVkaW9Gb3JtYXQgPSBhdWRpb0Zvcm1hdEZyb21OYXRpdmUoaW5mby5mb3JtYXQpOworICAgIGludDMyX3QgY2hhbm5lbE1hc2sgPSBvdXRDaGFubmVsTWFza0Zyb21OYXRpdmUoaW5mby5jaGFubmVsX21hc2spOworICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBFTkNPRElOR19JTlZBTElEIHx8IGNoYW5uZWxNYXNrID09IENIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqTVAyVXRpbHNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJVdGlscyIpOworICAgIGptZXRob2RJRCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRCgKKyAgICAgICAgICAgIGpNUDJVdGlsc0NscywgImlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCIsICIoSUlJKVoiKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKAorICAgICAgICAgICAgak1QMlV0aWxzQ2xzLCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkLCBhdWRpb0Zvcm1hdCwgaW5mby5zYW1wbGVfcmF0ZSwgY2hhbm5lbE1hc2spOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2JkNDNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9KX01FRElBUExBWUVSMl9VVElMUzJfSF8KKyNkZWZpbmUgX0pfTUVESUFQTEFZRVIyX1VUSUxTMl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgImFuZHJvaWRfbWVkaWFfQXVkaW9Gb3JtYXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSk1lZGlhUGxheWVyMlV0aWxzIHsKKyAgICBzdGF0aWMgYm9vbCBpc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sIGJvb2wgaXNTdHJlYW1pbmcsCisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfSl9NRURJQVBMQVlFUjJfVVRJTFMyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAKaW5kZXggYzlhMTA3MS4uOTgzZDc3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcApAQCAtMjAsNTUgKzIwLDUwIEBACiAKICNpbmNsdWRlICJKV2FrZUxvY2suaCIKIAotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KLQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vVE9ETzogdXNlIEpBVkEgUG93ZXJNYW5hZ2VyLCBpbnN0ZWFkIG9mIGJpbmRlcgotSldha2VMb2NrOjpKV2FrZUxvY2soKSA6Ci0gICAgbVBvd2VyTWFuYWdlcihOVUxMKSwKLSAgICBtV2FrZUxvY2tUb2tlbihOVUxMKSwKK0pXYWtlTG9jazo6Sldha2VMb2NrKGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KSA6CiAgICAgbVdha2VMb2NrQ291bnQoMCksCi0gICAgbURlYXRoUmVjaXBpZW50KG5ldyBQTURlYXRoUmVjaXBpZW50KHRoaXMpKSB7fQorICAgIG1XYWtlTG9jayhOVUxMKSwKKyAgICBtQ29udGV4dChjb250ZXh0KSB7fQogCiBKV2FrZUxvY2s6On5KV2FrZUxvY2soKSB7Ci0gICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihtUG93ZXJNYW5hZ2VyKTsKLSAgICAgICAgYmluZGVyLT51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7Ci0gICAgfQotICAgIGNsZWFyUG93ZXJNYW5hZ2VyKCk7CisgICAgY2xlYXJKYXZhV2FrZUxvY2soKTsKIH0KIAogYm9vbCBKV2FrZUxvY2s6OmFjcXVpcmUoKSB7CiAgICAgaWYgKG1XYWtlTG9ja0NvdW50ID09IDApIHsKLSAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gPT0gTlVMTCk7Ci0gICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIHVzZSBjaGVja1NlcnZpY2UoKSB0byBhdm9pZCBibG9ja2luZyBpZiBwb3dlciBzZXJ2aWNlIGlzIG5vdCB1cCB5ZXQKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigicG93ZXIiKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGdldCB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIgPSBpbnRlcmZhY2VfY2FzdDxJUG93ZXJNYW5hZ2VyPihiaW5kZXIpOwotICAgICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG1XYWtlTG9jayA9PSBOVUxMKSB7CisgICAgICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBqY2xhc3MgakNvbnRleHRDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9jb250ZW50L0NvbnRleHQiKTsKKyAgICAgICAgICAgIGpjbGFzcyBqUG93ZXJNYW5hZ2VyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUG93ZXJNYW5hZ2VyIik7CisKKyAgICAgICAgICAgIGptZXRob2RJRCBqR2V0U3lzdGVtU2VydmljZSA9IGVudi0+R2V0TWV0aG9kSUQoakNvbnRleHRDbHMsCisgICAgICAgICAgICAgICAgICAgICJnZXRTeXN0ZW1TZXJ2aWNlIiwgIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7Iik7CisgICAgICAgICAgICBqb2JqZWN0IGphdmFQb3dlck1hbmFnZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUNvbnRleHQtPmdldEpPYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgakdldFN5c3RlbVNlcnZpY2UsIGVudi0+TmV3U3RyaW5nVVRGKCJwb3dlciIpKTsKKworICAgICAgICAgICAgamZpZWxkSUQgalBBUlRJQUxfV0FLRV9MT0NLID0gZW52LT5HZXRTdGF0aWNGaWVsZElEKGpQb3dlck1hbmFnZXJDbHMsCisgICAgICAgICAgICAgICAgICAgICJQQVJUSUFMX1dBS0VfTE9DSyIsICJJIik7CisgICAgICAgICAgICBqaW50IFBBUlRJQUxfV0FLRV9MT0NLID0gZW52LT5HZXRTdGF0aWNJbnRGaWVsZChqUG93ZXJNYW5hZ2VyQ2xzLCBqUEFSVElBTF9XQUtFX0xPQ0spOworCisgICAgICAgICAgICBqbWV0aG9kSUQgak5ld1dha2VMb2NrID0gZW52LT5HZXRNZXRob2RJRChqUG93ZXJNYW5hZ2VyQ2xzLAorICAgICAgICAgICAgICAgICAgICAibmV3V2FrZUxvY2siLCAiKElMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvb3MvUG93ZXJNYW5hZ2VyJFdha2VMb2NrOyIpOworICAgICAgICAgICAgam9iamVjdCBqYXZhV2FrZUxvY2sgPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoamF2YVBvd2VyTWFuYWdlck9iaiwKKyAgICAgICAgICAgICAgICAgICAgak5ld1dha2VMb2NrLCBQQVJUSUFMX1dBS0VfTE9DSywgZW52LT5OZXdTdHJpbmdVVEYoIkpXYWtlTG9jayIpKTsKKyAgICAgICAgICAgIG1XYWtlTG9jayA9IG5ldyBKT2JqZWN0SG9sZGVyKGphdmFXYWtlTG9jayk7CisgICAgICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGphdmFQb3dlck1hbmFnZXJPYmopOworICAgICAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihqYXZhV2FrZUxvY2spOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IG5ldyBCQmluZGVyKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jaygKLSAgICAgICAgICAgICAgICAgICAgUE9XRVJNQU5BR0VSX1BBUlRJQUxfV0FLRV9MT0NLLAotICAgICAgICAgICAgICAgICAgICBiaW5kZXIsIFN0cmluZzE2KCJKV2FrZUxvY2siKSwgU3RyaW5nMTYoIm1lZGlhIikpOwotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7Ci0gICAgICAgICAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG1XYWtlTG9jayAhPSBOVUxMKSB7CisgICAgICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBqY2xhc3Mgd2FrZUxvY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9Qb3dlck1hbmFnZXIkV2FrZUxvY2siKTsKKyAgICAgICAgICAgIGptZXRob2RJRCBqQWNxdWlyZSA9IGVudi0+R2V0TWV0aG9kSUQod2FrZUxvY2tDbHMsICJhY3F1aXJlIiwgIigpViIpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtV2FrZUxvY2stPmdldEpPYmplY3QoKSwgakFjcXVpcmUpOworICAgICAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKQEAgLTg2LDI1ICs4MSwxNyBAQAogICAgICAgICBtV2FrZUxvY2tDb3VudCA9IDE7CiAgICAgfQogICAgIGlmICgtLW1XYWtlTG9ja0NvdW50ID09IDApIHsKLSAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gIT0gTlVMTCk7Ci0gICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwIC8qIGZsYWdzICovKTsKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICBpZiAobVdha2VMb2NrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGpjbGFzcyB3YWtlTG9ja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL29zL1Bvd2VyTWFuYWdlciRXYWtlTG9jayIpOworICAgICAgICAgICAgam1ldGhvZElEIGpSZWxlYXNlID0gZW52LT5HZXRNZXRob2RJRCh3YWtlTG9ja0NscywgInJlbGVhc2UiLCAiKClWIik7CisgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1XYWtlTG9jay0+Z2V0Sk9iamVjdCgpLCBqUmVsZWFzZSk7CiAgICAgICAgIH0KLSAgICAgICAgbVdha2VMb2NrVG9rZW4uY2xlYXIoKTsKICAgICB9CiB9CiAKLXZvaWQgSldha2VMb2NrOjpjbGVhclBvd2VyTWFuYWdlcigpIHsKK3ZvaWQgSldha2VMb2NrOjpjbGVhckphdmFXYWtlTG9jaygpIHsKICAgICByZWxlYXNlKHRydWUpOwotICAgIG1Qb3dlck1hbmFnZXIuY2xlYXIoKTsKLX0KLQotdm9pZCBKV2FrZUxvY2s6OlBNRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewotICAgIGlmIChtV2FrZUxvY2sgIT0gTlVMTCkgewotICAgICAgICBtV2FrZUxvY2stPmNsZWFyUG93ZXJNYW5hZ2VyKCk7Ci0gICAgfQogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmgKaW5kZXggZWFjZTg3ZS4uMzZjNTQyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIEpfV0FLRUxPQ0tfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvSVBvd2VyTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yNiw3ICsyNiw3IEBACiBjbGFzcyBKV2FrZUxvY2sgOiBwdWJsaWMgUmVmQmFzZSB7CiAKIHB1YmxpYzoKLSAgICBKV2FrZUxvY2soKTsKKyAgICBKV2FrZUxvY2soY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQpOwogCiAgICAgLy8gTk9URTogYWNxdWlyZSBhbmQgcmVsZWFzZSBhcmUgbm90IHRocmVhZCBzYWZlCiAKQEAgLTM3LDI4ICszNywxMSBAQAogICAgIHZpcnR1YWwgfkpXYWtlTG9jaygpOwogCiBwcml2YXRlOgotICAgIHNwPElQb3dlck1hbmFnZXI+IG1Qb3dlck1hbmFnZXI7Ci0gICAgc3A8SUJpbmRlcj4gICAgICAgbVdha2VMb2NrVG9rZW47Ci0gICAgdWludDMyX3QgICAgICAgICAgbVdha2VMb2NrQ291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVdha2VMb2NrQ291bnQ7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgbVdha2VMb2NrOworICAgIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+IG1Db250ZXh0OwogCi0gICAgY2xhc3MgUE1EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBQTURlYXRoUmVjaXBpZW50KEpXYWtlTG9jayAqd2FrZUxvY2spIDogbVdha2VMb2NrKHdha2VMb2NrKSB7fQotICAgICAgICB2aXJ0dWFsIH5QTURlYXRoUmVjaXBpZW50KCkge30KLQotICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAotICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFBNRGVhdGhSZWNpcGllbnQoY29uc3QgUE1EZWF0aFJlY2lwaWVudCYpOwotICAgICAgICBQTURlYXRoUmVjaXBpZW50JiBvcGVyYXRvcj0gKGNvbnN0IFBNRGVhdGhSZWNpcGllbnQmKTsKLQotICAgICAgICBKV2FrZUxvY2sgKm1XYWtlTG9jazsKLSAgICB9OwotCi0gICAgY29uc3Qgc3A8UE1EZWF0aFJlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OwotCi0gICAgdm9pZCBjbGVhclBvd2VyTWFuYWdlcigpOworICAgIHZvaWQgY2xlYXJKYXZhV2FrZUxvY2soKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEpXYWtlTG9jayk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCmluZGV4IDgzN2JiYzguLmQ2MDhkNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJOdVBsYXllcjIuaCIKIAogI2luY2x1ZGUgIkhUVFBMaXZlU291cmNlMi5oIgorI2luY2x1ZGUgIkpNZWRpYVBsYXllcjJVdGlscy5oIgogI2luY2x1ZGUgIk51UGxheWVyMkNDRGVjb2Rlci5oIgogI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXIuaCIKICNpbmNsdWRlICJOdVBsYXllcjJEZWNvZGVyQmFzZS5oIgpAQCAtMzMsNyArMzQsNyBAQAogI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgogI2luY2x1ZGUgIlJUU1BTb3VyY2UyLmgiCiAjaW5jbHVkZSAiR2VuZXJpY1NvdXJjZTIuaCIKLSNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zLmgiCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9uczIuaCIKIAogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCkBAIC0yMDgsMTUgKzIwOSwxNiBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1OdVBsYXllcjI6Ok51UGxheWVyMihwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spCitOdVBsYXllcjI6Ok51UGxheWVyMigKKyAgICAgICAgcGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLCBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCkKICAgICA6IG1QSUQocGlkKSwKICAgICAgIG1VSUQodWlkKSwKICAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAotICAgICAgbVNvdXJjZUZsYWdzKDApLAogICAgICAgbU9mZmxvYWRBdWRpbyhmYWxzZSksCiAgICAgICBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKICAgICAgIG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKDApLAogICAgICAgbVJlbmRlcmVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1FT1NNb25pdG9yR2VuZXJhdGlvbigwKSwKICAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMoMCksCiAgICAgICBtUHJldmlvdXNTZWVrVGltZVVzKDApLAogICAgICAgbUF1ZGlvRU9TKGZhbHNlKSwKQEAgLTI0MCw4ICsyNDIsNyBAQAogICAgICAgbVBhdXNlZChmYWxzZSksCiAgICAgICBtUGF1c2VkQnlDbGllbnQodHJ1ZSksCiAgICAgICBtUGF1c2VkRm9yQnVmZmVyaW5nKGZhbHNlKSwKLSAgICAgIG1Jc0RybVByb3RlY3RlZChmYWxzZSksCi0gICAgICBtRGF0YVNvdXJjZVR5cGUoREFUQV9TT1VSQ0VfVFlQRV9OT05FKSB7CisgICAgICBtQ29udGV4dChjb250ZXh0KSB7CiAgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKICAgICBjbGVhckZsdXNoQ29tcGxldGUoKTsKIH0KQEAgLTMwOSw3ICszMTAsNyBAQAogICAgICAgICAgICAgICAgIHNwPEdlbmVyaWNTb3VyY2UyPiBnZW5lcmljU291cmNlID0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljU291cmNlMihub3RpZnksIG1VSUQsIG1NZWRpYUNsb2NrKTsKIAotICAgICAgICAgICAgICAgIGVyciA9IGdlbmVyaWNTb3VyY2UtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CisgICAgICAgICAgICAgICAgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpOwogCiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICAqc291cmNlID0gZ2VuZXJpY1NvdXJjZTsKQEAgLTM5MywxMSArMzk0LDEzIEBACiAgICAgLy8gTm93LCBzb3VyY2UgIT0gTlVMTC4KICAgICAqLwogCi0gICAgbURhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CisgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1EYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIHRoaXMpOwogICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwogICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgZHNkLT5tSWQpOworICAgIG1zZy0+c2V0SW50NjQoInN0YXJ0VGltZVVzIiwgZHNkLT5tU3RhcnRQb3NpdGlvbk1zICogMTAwMCk7CisgICAgbXNnLT5zZXRJbnQ2NCgiZW5kVGltZVVzIiwgZHNkLT5tRW5kUG9zaXRpb25NcyAqIDEwMDApOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC00MTUsMTEgKzQxOCwxMyBAQAogICAgIC8vIE5vdywgc291cmNlICE9IE5VTEwuCiAgICAgKi8KIAotICAgIG1OZXh0RGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKKyAgICBtTmV4dFNvdXJjZUluZm8ubURhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZU5leHREYXRhU291cmNlLCB0aGlzKTsKICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKICAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIGRzZC0+bUlkKTsKKyAgICBtc2ctPnNldEludDY0KCJzdGFydFRpbWVVcyIsIGRzZC0+bVN0YXJ0UG9zaXRpb25NcyAqIDEwMDApOworICAgIG1zZy0+c2V0SW50NjQoImVuZFRpbWVVcyIsIGRzZC0+bUVuZFBvc2l0aW9uTXMgKiAxMDAwKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtNDg3LDcgKzQ5Miw3IEBACiBzdGF0dXNfdCBOdVBsYXllcjI6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKICAgICAvLyBkbyBzb21lIGN1cnNvcnkgdmFsaWRhdGlvbiBvZiB0aGUgc2V0dGluZ3MgaGVyZS4gYXVkaW8gbW9kZXMgYXJlCiAgICAgLy8gb25seSB2YWxpZGF0ZWQgd2hlbiBzZXQgb24gdGhlIGF1ZGlvc2luay4KLSAgICAgaWYgKChyYXRlLm1TcGVlZCAhPSAwLmYgJiYgcmF0ZS5tU3BlZWQgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4pCisgICAgIGlmIChyYXRlLm1TcGVlZCA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTgogICAgICAgICAgICAgfHwgcmF0ZS5tU3BlZWQgPiBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgKICAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOCiAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCA+IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCkgewpAQCAtNTU0LDcgKzU1OSw3IEBACiAgICAgc3A8U291cmNlPiBzb3VyY2U7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICBzb3VyY2UgPSBtU291cmNlOworICAgICAgICBzb3VyY2UgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZTsKICAgICB9CiAKICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKQEAgLTU4NCw5ICs1ODksMTMgQEAKICAgICBtc2ctPnBvc3QoKTsKIH0KIAordm9pZCBOdVBsYXllcjI6OnJld2luZCgpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmV3aW5kLCB0aGlzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KIAogdm9pZCBOdVBsYXllcjI6OndyaXRlVHJhY2tJbmZvKAotICAgICAgICBQYXJjZWwqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3QgeworICAgICAgICBQbGF5ZXJNZXNzYWdlKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0IHsKICAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIk5VTEwgZm9ybWF0Iik7CiAgICAgICAgIHJldHVybjsKQEAgLTYxOSwxMCArNjI4LDkgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHJlcGx5LT53cml0ZUludDMyKDIpOyAvLyB3cml0ZSBzb21ldGhpbmcgbm9uLXplcm8KLSAgICByZXBseS0+d3JpdGVJbnQzMih0cmFja1R5cGUpOwotICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KG1pbWUuY19zdHIoKSkpOwotICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcuY19zdHIoKSkpOworICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZSh0cmFja1R5cGUpOworICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9zdHJpbmdfdmFsdWUobWltZS5jX3N0cigpKTsKKyAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfc3RyaW5nX3ZhbHVlKGxhbmcuY19zdHIoKSk7CiAKICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKICAgICAgICAgaW50MzJfdCBpc0F1dG8sIGlzRGVmYXVsdCwgaXNGb3JjZWQ7CkBAIC02MzAsMjcgKzYzOCwzMCBAQAogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZGVmYXVsdCIsICZpc0RlZmF1bHQpKTsKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImZvcmNlZCIsICZpc0ZvcmNlZCkpOwogCi0gICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzQXV0byk7Ci0gICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRGVmYXVsdCk7Ci0gICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRm9yY2VkKTsKKyAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKGlzQXV0byk7CisgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShpc0RlZmF1bHQpOworICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoaXNGb3JjZWQpOwogICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRTZXREYXRhU291cmNlOgogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVigia1doYXRTZXREYXRhU291cmNlIik7CiAKLSAgICAgICAgICAgIENIRUNLKG1Tb3VyY2UgPT0gTlVMTCk7CisgICAgICAgICAgICBDSEVDSyhtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKICAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1TcmNJZCkpOwotICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZtQ3VycmVudFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoImVuZFRpbWVVcyIsICZtQ3VycmVudFNvdXJjZUluZm8ubUVuZFRpbWVVcykpOworICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICAgICAgQUxPR0UoImtXaGF0U2V0RGF0YVNvdXJjZSwgc291cmNlIHNob3VsZCBub3QgYmUgTlVMTCIpOwpAQCAtNjU5LDcgKzY3MCw3IEBACiAgICAgICAgICAgICBDSEVDSyhtRHJpdmVyICE9IE5VTEwpOwogICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChtU3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIGVycik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNjczLDkgKzY4NCwxMSBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAmb2JqKSk7CiAgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZtTmV4dFNyY0lkKSk7Ci0gICAgICAgICAgICAgICAgbU5leHRTb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKLSAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZS0+cHJlcGFyZUFzeW5jKCk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1OZXh0U291cmNlSW5mby5tU3JjSWQpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3RhcnRUaW1lVXMiLCAmbU5leHRTb3VyY2VJbmZvLm1TdGFydFRpbWVVcykpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJlbmRUaW1lVXMiLCAmbU5leHRTb3VyY2VJbmZvLm1FbmRUaW1lVXMpKTsKKyAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgIG1OZXh0U291cmNlSW5mby5tU291cmNlLT5wcmVwYXJlQXN5bmMobU5leHRTb3VyY2VJbmZvLm1TdGFydFRpbWVVcyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CkBAIC02ODgsNyArNzAxLDcgQEAKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFBsYXlOZXh0RGF0YVNvdXJjZSIpOwogICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZzcmNJZCkpOwotICAgICAgICAgICAgaWYgKHNyY0lkICE9IG1OZXh0U3JjSWQpIHsKKyAgICAgICAgICAgIGlmIChzcmNJZCAhPSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIDApOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTcwOSw2ICs3MjIsMjIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdEVPU01vbml0b3I6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGludDMyX3QgcmVhc29uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlYXNvbiIsICZyZWFzb24pKTsKKworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbUVPU01vbml0b3JHZW5lcmF0aW9uIHx8IHJlYXNvbiAhPSBNZWRpYUNsb2NrOjpUSU1FUl9SRUFTT05fUkVBQ0hFRCkgeworICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gc3RhbGUgb3IgcmVzZXQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoImtXaGF0RU9TTW9uaXRvciIpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzOgogICAgICAgICB7CiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKQEAgLTcxNyw4ICs3NDYsOCBAQAogICAgICAgICAgICAgQUxPR1YoImtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3MiKTsKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQpAQCAtNzQwLDggKzc2OSw4IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7CiAgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJmJ1ZmZlcmluZyk7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CkBAIC03NTUsNyArNzg0LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQUxPR1YoIm9uTWVzc2FnZVJlY2VpdmVkIGtXaGF0UHJlcGFyZSIpOwogCi0gICAgICAgICAgICBtU291cmNlLT5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5wcmVwYXJlQXN5bmMobUN1cnJlbnRTb3VyY2VJbmZvLm1TdGFydFRpbWVVcyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC03NjQsMTIgKzc5MywxNiBAQAogICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgKGludDY0X3QqKSZzcmNJZCkpOworCisgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlKiByZXBseTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKIAorICAgICAgICAgICAgLy8gVE9ETzogdXNlIGNvcnJlY3Qgc291cmNlIGluZm8gYmFzZWQgb24gc3JjSWQuCiAgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0NvdW50KCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNpemVfdCBjY1RyYWNrcyA9IDA7CkBAIC03NzgsMTEgKzgxMSwxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB0b3RhbCB0cmFjayBjb3VudAotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5iYW5kVHJhY2tzICsgY2NUcmFja3MpOworICAgICAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKGluYmFuZFRyYWNrcyArIGNjVHJhY2tzKTsKIAogICAgICAgICAgICAgLy8gd3JpdGUgaW5iYW5kIHRyYWNrcwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmJhbmRUcmFja3M7ICsraSkgewotICAgICAgICAgICAgICAgIHdyaXRlVHJhY2tJbmZvKHJlcGx5LCBtU291cmNlLT5nZXRUcmFja0luZm8oaSkpOworICAgICAgICAgICAgICAgIHdyaXRlVHJhY2tJbmZvKHJlcGx5LCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tJbmZvKGkpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gd3JpdGUgQ0MgdHJhY2sKQEAgLTc5NywyMCArODMwLDM1IEBACiAKICAgICAgICAgY2FzZSBrV2hhdEdldFNlbGVjdGVkVHJhY2s6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAoaW50NjRfdCopJnNyY0lkKSk7CisKKyAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOworICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdHlwZTMyOworCisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgY29ycmVjdCBzb3VyY2UgaW5mbyBiYXNlZCBvbiBzcmNJZC4KKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSAtMTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsIChpbnQzMl90KikmdHlwZTMyKSk7Ci0gICAgICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdHlwZTMyOwotICAgICAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IG1Tb3VyY2UtPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZFRyYWNrKTsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHNlbGVjdGVkVHJhY2sgPT0gLTEgJiYgbUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayA9IG1DQ0RlY29kZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVHJhY2sgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayArPSBpbmJhbmRUcmFja3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlKiByZXBseTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKKyAgICAgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShzZWxlY3RlZFRyYWNrKTsKKwogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCkBAIC04MjUsMTggKzg3MywyMSBAQAogICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQ7CiAgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKICAgICAgICAgICAgIGludDMyX3Qgc2VsZWN0OwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAoaW50NjRfdCopJnNyY0lkKSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZWxlY3QiLCAmc2VsZWN0KSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKIAorICAgICAgICAgICAgLy8gVE9ETzogdXNlIGNvcnJlY3Qgc291cmNlIGluZm8gYmFzZWQgb24gc3JjSWQuCiAgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0NvdW50KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzaXplX3QgY2NUcmFja3MgPSAwOwogICAgICAgICAgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgewpAQCAtODQ0LDExICs4OTUsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCBpbmJhbmRUcmFja3MpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgZXJyID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCwgdGltZVVzKTsKIAogICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ICYmIGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbmZvID0gbVNvdXJjZS0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5mbyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZvLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7CkBAIC04ODEsMTAgKzkzMiwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICBpZiAobURyaXZlciAhPSBOVUxMICYmIG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCAmJiBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CiAgICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtU3JjSWQsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIGR1cmF0aW9uVXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtOTAxLDEzICs5NTIsMTUgQEAKIAogICAgICAgICAgICAgQUxPR0QoIm9uU2V0VmlkZW9TdXJmYWNlKCVwLCAlcyB2aWRlbyBkZWNvZGVyKSIsCiAgICAgICAgICAgICAgICAgICAgIChud3cgPT0gTlVMTCA/IE5VTEwgOiBud3ctPmdldEFOYXRpdmVXaW5kb3coKSksCi0gICAgICAgICAgICAgICAgICAgIChtU291cmNlICE9IE5VTEwgJiYgbVN0YXJ0ZWQgJiYgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMICYmIG1TdGFydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgPyAiaGF2ZSIgOiAibm8iKTsKIAotICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBtU3RhcnRlZCBiZWZvcmUgY2FsbGluZyBtU291cmNlLT5nZXRGb3JtYXQgYmVjYXVzZSBOdVBsYXllcjIgbWlnaHQKLSAgICAgICAgICAgIC8vIGJlIGluIHByZXBhcmluZyBzdGF0ZSBhbmQgaXQgY291bGQgdGFrZSBsb25nIHRpbWUuCi0gICAgICAgICAgICAvLyBXaGVuIG1TdGFydGVkIGlzIHRydWUsIG1Tb3VyY2UgbXVzdCBoYXZlIGJlZW4gc2V0LgotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCB8fCAhbVN0YXJ0ZWQgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIG1TdGFydGVkIGJlZm9yZSBjYWxsaW5nIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgTnVQbGF5ZXIyIG1pZ2h0IGJlIGluIHByZXBhcmluZyBzdGF0ZSBhbmQgaXQgY291bGQgdGFrZSBsb25nIHRpbWUuCisgICAgICAgICAgICAvLyBXaGVuIG1TdGFydGVkIGlzIHRydWUsIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlIG11c3QgaGF2ZSBiZWVuIHNldC4KKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMIHx8ICFtU3RhcnRlZAorICAgICAgICAgICAgICAgICAgICB8fCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCiAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IG1WaWRlb0RlY29kZXIncyBtTmF0aXZlV2luZG93IGlzIGFsd2F5cyBub24tbnVsbAogICAgICAgICAgICAgICAgICAgICB8fCAobVZpZGVvRGVjb2RlciAhPSBOVUxMICYmIG1WaWRlb0RlY29kZXItPnNldFZpZGVvU3VyZmFjZShud3cpID09IE9LKSkgewogICAgICAgICAgICAgICAgIHBlcmZvcm1TZXRTdXJmYWNlKG53dyk7CkBAIC05NzEsMTAgKzEwMjQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBvblN0YXJ0KHRydWUgLyogcGxheSAqLyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtOTg4LDggKzEwNDEsNyBAQAogICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgLy8gQXVkaW9TaW5rIGFsbG93cyBvbmx5IDEuZiBhbmQgMC5mIGZvciBvZmZsb2FkIG1vZGUuCiAgICAgICAgICAgICAgICAgLy8gRm9yIG90aGVyIHNwZWVkLCBzd2l0Y2ggdG8gbm9uLW9mZmxvYWQgbW9kZS4KLSAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCAhPSAxLmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgKHJhdGUubVNwZWVkICE9IDEuZiB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7CiAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSAhPSBPSykgewogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uVXMgPSBtUHJldmlvdXNTZWVrVGltZVVzOwpAQCAtMTAxMiwzNiArMTA2NCwxNSBAQAogICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBhbGwgb3RoZXIgc2V0dGluZ3MgKHVzaW5nIG5vbi1wYXVzZWQgc3BlZWQpCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiByZXN0b3JlIHRoZW0gb24gc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgbmV3UmF0ZSA9IHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1JhdGUubVNwZWVkID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IG5ld1JhdGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogcmF0ZS5tU3BlZWQgIT0gMC5mICovCi0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiB0aGUgc291cmNlIGlzIHN0aWxsIGJ1ZmZlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkRm9yQnVmZmVyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJlcGFyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uU3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKIAotICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgicGxheWJhY2stc3BlZWQiLCBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInBsYXliYWNrLXNwZWVkIiwgbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKLSAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CkBAIC0xMDYxLDkgKzEwOTIsNiBAQAogICAgICAgICAgICAgICAgIC8vIGdldCBwbGF5YmFjayBzZXR0aW5ncyB1c2VkIGJ5IHJlbmRlcmVyLCBhcyBpdCBtYXkgYmUKICAgICAgICAgICAgICAgICAvLyBzbGlnaHRseSBvZmYgZHVlIHRvIGF1ZGlvc2luayBub3QgdGFraW5nIHNtYWxsIGNoYW5nZXMuCiAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwotICAgICAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhdGUubVNwZWVkID0gMC5mOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTExNTcsMjEgKzExODUsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyICE9IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBmb3VuZCBhbnl0aGluZyBwbGF5YWJsZS4KIAotICAgICAgICAgICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pIHsKICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVQb2xsRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gbVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSkgIT0gT0spIHsKKyAgICAgICAgICAgIGlmICgoZXJyID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXIgPT0gTlVMTCAmJiBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGN1cnJlbnRseSBkZWNvZGluZyBhbnl0aGluZyAobm8gYXVkaW8gb3IKICAgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8gdHJhY2tzIGZvdW5kKSBhbmQgd2UganVzdCByYW4gb3V0IG9mIGlucHV0IGRhdGEuCiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjUzLDEzICsxMjgyLDE0IEBACiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOwogCiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKIAogICAgICAgICAgICAgICAgIHNldFZpZGVvU2NhbGluZ01vZGUobVZpZGVvU2NhbGluZ01vZGUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShtU3JjSWQsIGlucHV0Rm9ybWF0LCBmb3JtYXQpOworICAgICAgICAgICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBpbnB1dEZvcm1hdCwgZm9ybWF0KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBzaHV0ZG93biBjb21wbGV0ZWQiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1EZWNvZGVyTG9jayk7CiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CkBAIC0xMjY3LDYgKzEyOTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1GbHVzaGluZ0F1ZGlvLCAoaW50KVNIVVRUSU5HX0RPV05fREVDT0RFUik7CiAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gU0hVVF9ET1dOOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRGVjb2RlckxvY2spOwogICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXJFcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICArK21WaWRlb0RlY29kZXJHZW5lcmF0aW9uOwpAQCAtMTMyMywyOCArMTM1NCwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7ICAvLyBTaG91bGQgbm90IG9jY3VyLgogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAvLyBGaW5pc2ggYW55d2F5cy4KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdyA9PSBOVUxMIHx8IG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlckVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdyA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgYXVkaW8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYXVkaW8gdHJhY2sgaGFzIGVycm9yLiBWaWRlbyB0cmFjayBjb3VsZCBiZSBzdGlsbCBnb29kIHRvIHBsYXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWV9BVURJT19FUlJPUiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0lORk9fUExBWV9BVURJT19FUlJPUiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgPT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSB2aWRlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB2aWRlbyB0cmFjayBoYXMgZXJyb3IuIEF1ZGlvIHRyYWNrIGNvdWxkIGJlIHN0aWxsIGdvb2QgdG8gcGxheS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZX1ZJREVPX0VSUk9SLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfSU5GT19QTEFZX1ZJREVPX0VSUk9SLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTM5NCwxMiArMTQzNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIGZpbmFsUmVzdWx0KTsKIAogICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIGZpbmFsUmVzdWx0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoKG1BdWRpb0VPUyB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobVZpZGVvRU9TIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRGbHVzaENvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBhdWRpbzsKQEAgLTE0MjAsMTAgKzE0NjMsMTEgQEAKICAgICAgICAgICAgICAgICBoYW5kbGVGbHVzaENvbXBsZXRlKGF1ZGlvLCBmYWxzZSAvKiBpc0RlY29kZXIgKi8pOwogICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQsIDApOworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9JTkZPX1ZJREVPX1JFTkRFUklOR19TVEFSVCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0TWVkaWFSZW5kZXJpbmdTdGFydCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJtZWRpYSByZW5kZXJpbmcgc3RhcnRlZCIpOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRBdWRpb1RlYXJEb3duKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCByZWFzb247CiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlYXNvbiIsICZyZWFzb24pKTsKQEAgLTE0NzYsNyArMTUyMCw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVyVXM7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXJVcyIsICZ0aW1lclVzKSk7CiAKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX05PVElGWV9USU1FLCB0aW1lclVzLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNDk1LDIwICsxNTM5LDIwIEBACiAgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgewogICAgICAgICAgICAgICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdGFydCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoc2Vla1RpbWVVcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsoc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChuZWVkTm90aWZ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShtU3JjSWQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBzZWVrcyBjYW4gdGFrZSBhIHdoaWxlLCBzbyB3ZSBlc3NlbnRpYWxseSBwYXVzZWQKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKIAogICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX0ZMVVNIIC8qIGF1ZGlvICovLApAQCAtMTUyNywxMCArMTU3MSw0OSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0UmV3aW5kOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXRSZXdpbmQiKTsKKworICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TdGFydFRpbWVVczsKKyAgICAgICAgICAgIGludDMyX3QgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1Q7CisKKyAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlcmZvcm1TZWVrKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2Vla3MgY2FuIHRha2UgYSB3aGlsZSwgc28gd2UgZXNzZW50aWFsbHkgcGF1c2VkCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKKworICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX0ZMVVNIIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9GTFVTSCAvKiB2aWRlbyAqLykpOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpKTsKKworICAgICAgICAgICAgLy8gQWZ0ZXIgYSBmbHVzaCB3aXRob3V0IHNodXRkb3duLCBkZWNvZGVyIGlzIHBhdXNlZC4KKyAgICAgICAgICAgIC8vIERvbid0IHJlc3VtZSBpdCB1bnRpbCBzb3VyY2Ugc2VlayBpcyBkb25lLCBvdGhlcndpc2UgaXQgY291bGQKKyAgICAgICAgICAgIC8vIHN0YXJ0IHB1bGxpbmcgc3RhbGUgZGF0YSB0b28gc29vbi4KKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgUmVzdW1lRGVjb2RlckFjdGlvbihmYWxzZSAvKiBuZWVkTm90aWZ5ICovKSk7CisKKyAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgb25TdGFydChmYWxzZSAvKiBwbGF5ICovKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTU2MSw3ICsxNjQ0LDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZURybToKICAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb25SZWxlYXNlRHJtKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblJlbGVhc2VEcm0obXNnKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJzdGF0dXMiLCBzdGF0dXMpOwpAQCAtMTU4Myw4ICsxNjY2LDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5yZXN1bWUoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+cmVzdW1lKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coInJlc3VtZSBjYWxsZWQgd2hlbiBzb3VyY2UgaXMgZ29uZSBvciBub3Qgc2V0Iik7CiAgICAgfQpAQCAtMTYwMiwxMiArMTY4NSwxMiBAQAogICAgIHN0YXJ0UGxheWJhY2tUaW1lcigib25yZXN1bWUiKTsKIH0KIAotdm9pZCBOdVBsYXllcjI6Om9uU3RhcnQoKSB7Ci0gICAgQUxPR1YoIm9uU3RhcnQ6IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Cit2b2lkIE51UGxheWVyMjo6b25TdGFydChib29sIHBsYXkpIHsKKyAgICBBTE9HVigib25TdGFydDogbUNyeXB0bzogJXAiLCBtQ3VycmVudFNvdXJjZUluZm8ubUNyeXB0by5nZXQoKSk7CiAKICAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CiAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0YXJ0KCk7CiAgICAgfQogCiAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwpAQCAtMTYxOCwyMiArMTcwMSwyMyBAQAogCiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogCi0gICAgaWYgKG1Tb3VyY2UtPmlzUmVhbFRpbWUoKSkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNSZWFsVGltZSgpKSB7CiAgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX1JFQUxfVElNRTsKICAgICB9CiAKLSAgICBib29sIGhhc0F1ZGlvID0gKG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKLSAgICBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgYm9vbCBoYXNBdWRpbyA9IChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pICE9IE5VTEwpOworICAgIGJvb2wgaGFzVmlkZW8gPSAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CiAgICAgaWYgKCFoYXNBdWRpbyAmJiAhaGFzVmlkZW8pIHsKICAgICAgICAgQUxPR0UoIm5vIG1ldGFkYXRhIGZvciBlaXRoZXIgYXVkaW8gb3IgdmlkZW8gc291cmNlIik7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9NQUxGT1JNRUQpOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9NQUxGT1JNRUQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFMT0dWX0lGKCFoYXNBdWRpbywgIm5vIG1ldGFkYXRhIGZvciBhdWRpbyBzb3VyY2UiKTsgIC8vIHZpZGVvIG9ubHkgc3RyZWFtCiAKLSAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CiAKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewpAQCAtMTY0MSwxMSArMTcyNSwxMiBAQAogICAgIH0KIAogICAgIG1PZmZsb2FkQXVkaW8gPQotICAgICAgICBjYW5PZmZsb2FkU3RyZWFtKGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCisgICAgICAgIEpNZWRpYVBsYXllcjJVdGlsczo6aXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQogICAgICAgICAgICAgICAgICYmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPT0gMS5mICYmIG1QbGF5YmFja1NldHRpbmdzLm1QaXRjaCA9PSAxLmYpOwogCiAgICAgLy8gTW9kdWxhciBEUk06IERpc2FibGluZyBhdWRpbyBvZmZsb2FkIGlmIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkCi0gICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgbUlzRHJtUHJvdGVjdGVkKSB7CisgICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgbUN1cnJlbnRTb3VyY2VJbmZvLm1Jc0RybVByb3RlY3RlZCkgewogICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CiAgICAgICAgIEFMT0dWKCJvblN0YXJ0OiBEaXNhYmxpbmcgbU9mZmxvYWRBdWRpbyBub3cgdGhhdCB0aGUgc291cmNlIGlzIHByb3RlY3RlZC4iKTsKICAgICB9CkBAIC0xNjU3LDE3ICsxNzQyLDE3IEBACiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlcmVyTm90aWZ5LCB0aGlzKTsKICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1SZW5kZXJlckdlbmVyYXRpb24pOwotICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcihtQXVkaW9TaW5rLCBtTWVkaWFDbG9jaywgbm90aWZ5LCBmbGFncyk7CisgICAgbVJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKG1BdWRpb1NpbmssIG1NZWRpYUNsb2NrLCBub3RpZnksIG1Db250ZXh0LCBmbGFncyk7CiAgICAgbVJlbmRlcmVyTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgbVJlbmRlcmVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllclJlbmRlcmVyIik7Ci0gICAgbVJlbmRlcmVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXIyUmVuZGVyZXIiKTsKKyAgICBtUmVuZGVyZXJMb29wZXItPnN0YXJ0KGZhbHNlLCB0cnVlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICBtUmVuZGVyZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXIpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKG1QbGF5YmFja1NldHRpbmdzKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xNjc2LDYgKzE3NjEsMTIgQEAKICAgICAgICAgbVJlbmRlcmVyLT5zZXRWaWRlb0ZyYW1lUmF0ZShyYXRlKTsKICAgICB9CiAKKyAgICBhZGRFbmRUaW1lTW9uaXRvcigpOworICAgIC8vIFJlbmRlcmVyIGlzIGNyZWF0ZWQgaW4gcGF1c2VkIHN0YXRlLgorICAgIGlmIChwbGF5KSB7CisgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7CisgICAgfQorCiAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRSZW5kZXJlcihtUmVuZGVyZXIpOwogICAgIH0KQEAgLTE2ODQsMTAgKzE3NzUsMjMgQEAKICAgICB9CiAKICAgICBzdGFydFBsYXliYWNrVGltZXIoIm9uc3RhcnQiKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfU1RBUlQsIDApOwogCiAgICAgcG9zdFNjYW5Tb3VyY2VzKCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXIyOjphZGRFbmRUaW1lTW9uaXRvcigpIHsKKyAgICArK21FT1NNb25pdG9yR2VuZXJhdGlvbjsKKworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubUVuZFRpbWVVcyA9PSBEYXRhU291cmNlRGVzYzo6a01heFRpbWVVcykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVPU01vbml0b3IsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRU9TTW9uaXRvckdlbmVyYXRpb24pOworICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihtc2csIG1DdXJyZW50U291cmNlSW5mby5tRW5kVGltZVVzKTsKK30KKwogdm9pZCBOdVBsYXllcjI6OnN0YXJ0UGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKICAgICBpZiAobUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9PSAwKSB7CkBAIC0xNzA5LDcgKzE4MTMsNyBAQAogICAgICAgICAgICAgQUxPR1YoInN0b3BQbGF5YmFja1RpbWVyKCkgIGxvZyAgJTIwIiBQUklkNjQgIiIsIHBsYXllZCk7CiAKICAgICAgICAgICAgIGlmIChwbGF5ZWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUGxheWluZ1RpbWVVcyhtU3JjSWQsIChwbGF5ZWQrNTAwKS8xMDAwKTsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIChwbGF5ZWQrNTAwKS8xMDAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gMDsKQEAgLTE3MjcsNyArMTgzMSw4IEBACiB2b2lkIE51UGxheWVyMjo6c3RvcFJlYnVmZmVyaW5nVGltZXIoYm9vbCBleGl0aW5nUGxheWJhY2spIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CiAKLSAgICBBTE9HVigic3RvcFJlYnVmZmVyVGltZXIoKSAgdGltZSAlMjAiIFBSSWQ2NCAiIChleGl0aW5nICVkKSIsIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zLCBleGl0aW5nUGxheWJhY2spOworICAgIEFMT0dWKCJzdG9wUmVidWZmZXJUaW1lcigpICB0aW1lICUyMCIgUFJJZDY0ICIgKGV4aXRpbmcgJWQpIiwKKyAgICAgICAgICBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcywgZXhpdGluZ1BsYXliYWNrKTsKIAogICAgIGlmIChtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyAhPSAwKSB7CiAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CkBAIC0xNzM3LDkgKzE4NDIsMTAgQEAKICAgICAgICAgICAgIEFMT0dWKCJzdG9wUmVidWZmZXJpbmdUaW1lcigpICBsb2cgICUyMCIgUFJJZDY0ICIiLCByZWJ1ZmZlcmVkKTsKIAogICAgICAgICAgICAgaWYgKHJlYnVmZmVyZWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMobVNyY0lkLCAocmVidWZmZXJlZCs1MDApLzEwMDApOworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKAorICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgKHJlYnVmZmVyZWQrNTAwKS8xMDAwKTsKICAgICAgICAgICAgICAgICBpZiAoZXhpdGluZ1BsYXliYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChtU3JjSWQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNzU1LDggKzE4NjEsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1QYXVzZWQgPSB0cnVlOwotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+cGF1c2UoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+cGF1c2UoKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVygicGF1c2UgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOwogICAgIH0KQEAgLTE4NDYsNyArMTk1Miw3IEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCiAgICAgICAgICAgICBmb3JtYXQsIHRydWUgLyogb2ZmbG9hZE9ubHkgKi8sIGhhc1ZpZGVvLAotICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm1PZmZsb2FkQXVkaW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCkpOworICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm1PZmZsb2FkQXVkaW8sIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5pc1N0cmVhbWluZygpKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIC8vIEFueSBmYWlsdXJlIHdlIHR1cm4gb2ZmIG1PZmZsb2FkQXVkaW8uCiAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKQEAgLTE4NjMsNiArMTk2OSw3IEBACiAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXMsIGJvb2wgZm9yY2VOb25PZmZsb2FkLCBib29sIG5lZWRzVG9DcmVhdGVBdWRpb0RlY29kZXIpIHsKICAgICBpZiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIG1BdWRpb0RlY29kZXItPnBhdXNlKCk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRGVjb2RlckxvY2spOwogICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CiAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IGZhbHNlOwogICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOwpAQCAtMTkwOSw3ICsyMDE2LDcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjI6OmRldGVybWluZUF1ZGlvTW9kZUNoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmF1ZGlvRm9ybWF0KSB7Ci0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCB8fCBtQXVkaW9TaW5rID09IE5VTEwpIHsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCB8fCBtQXVkaW9TaW5rID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTkxOSwxNiArMjAyNiwxNiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7Ci0gICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0ID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CiAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9ICh2aWRlb0Zvcm1hdCAhPSBOVUxMKTsKLSAgICBib29sIGNhbk9mZmxvYWQgPSBjYW5PZmZsb2FkU3RyZWFtKAotICAgICAgICAgICAgYXVkaW9NZXRhLCBoYXNWaWRlbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKKyAgICBib29sIGNhbk9mZmxvYWQgPSBKTWVkaWFQbGF5ZXIyVXRpbHM6OmlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCgKKyAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQogICAgICAgICAgICAgICAgICAgICAmJiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID09IDEuZiAmJiBtUGxheWJhY2tTZXR0aW5ncy5tUGl0Y2ggPT0gMS5mKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNOiBEaXNhYmxpbmcgYXVkaW8gb2ZmbG9hZCBpZiB0aGUgc291cmNlIGlzIHByb3RlY3RlZAotICAgIGlmIChjYW5PZmZsb2FkICYmIG1Jc0RybVByb3RlY3RlZCkgeworICAgIGlmIChjYW5PZmZsb2FkICYmIG1DdXJyZW50U291cmNlSW5mby5tSXNEcm1Qcm90ZWN0ZWQpIHsKICAgICAgICAgY2FuT2ZmbG9hZCA9IGZhbHNlOwogICAgICAgICBBTE9HVigiZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlOiBEaXNhYmxpbmcgbU9mZmxvYWRBdWRpbyBiL2MgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQuIik7CiAgICAgfQpAQCAtMTk1NSw3ICsyMDYyLDcgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoYXVkaW8pOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGF1ZGlvKTsKIAogICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTE5NzcsMTEgKzIwODQsMTEgQEAKICAgICAgICAgICAgIG1DQ0RlY29kZXIgPSBuZXcgQ0NEZWNvZGVyKGNjTm90aWZ5KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CisgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2VjdXJlIiwgdHJ1ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1BST1RFQ1RFRCkgeworICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19QUk9URUNURUQpIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb3RlY3RlZCIsIHRydWUpOwogICAgICAgICB9CiAKQEAgLTE5OTEsNiArMjA5OCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURlY29kZXJMb2NrKTsKKwogICAgIGlmIChhdWRpbykgewogICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9Ob3RpZnksIHRoaXMpOwogICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOwpAQCAtMjAwMCwxNiArMjEwOSwxNiBAQAogICAgICAgICAgICAgZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlKGZvcm1hdCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyh0cnVlIC8qIG9mZmxvYWQgKi8pOworICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyh0cnVlIC8qIG9mZmxvYWQgKi8pOwogCi0gICAgICAgICAgICBjb25zdCBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKmF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKmF1ZGlvICovKSAhPSBOVUxMKTsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhhcy12aWRlbyIsIGhhc1ZpZGVvKTsKLSAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXJQYXNzVGhyb3VnaChub3RpZnksIG1Tb3VyY2UsIG1SZW5kZXJlcik7CisgICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyUGFzc1Rocm91Z2gobm90aWZ5LCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSwgbVJlbmRlcmVyKTsKICAgICAgICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXIgYXVkaW8gRGVjb2RlclBhc3NUaHJvdWdoICBoYXNWaWRlbzogJWQiLCBoYXNWaWRlbyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU291cmNlLT5zZXRPZmZsb2FkQXVkaW8oZmFsc2UgLyogb2ZmbG9hZCAqLyk7CisgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKGZhbHNlIC8qIG9mZmxvYWQgKi8pOwogCi0gICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKG5vdGlmeSwgbVNvdXJjZSwgbVBJRCwgbVVJRCwgbVJlbmRlcmVyKTsKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSwgbVBJRCwgbVVJRCwgbVJlbmRlcmVyKTsKICAgICAgICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXIgYXVkaW8gRGVjb2RlciIpOwogICAgICAgICB9CiAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IGZhbHNlOwpAQCAtMjAxOSw3ICsyMTI4LDggQEAKICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKTsKIAogICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKAotICAgICAgICAgICAgICAgIG5vdGlmeSwgbVNvdXJjZSwgbVBJRCwgbVVJRCwgbVJlbmRlcmVyLCBtTmF0aXZlV2luZG93LCBtQ0NEZWNvZGVyKTsKKyAgICAgICAgICAgICAgICBub3RpZnksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIsIG1OYXRpdmVXaW5kb3csCisgICAgICAgICAgICAgICAgbUNDRGVjb2Rlcik7CiAgICAgICAgIG1WaWRlb0RlY29kZXJFcnJvciA9IGZhbHNlOwogCiAgICAgICAgIC8vIGVuYWJsZSBGUkMgaWYgaGlnaC1xdWFsaXR5IEFWIHN5bmMgaXMgcmVxdWVzdGVkLCBldmVuIGlmIG5vdApAQCAtMjAzNCwxMCArMjE0NCwxMSBAQAogICAgICgqZGVjb2RlciktPmluaXQoKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgaWYgKG1Jc0RybVByb3RlY3RlZCkgewotICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgiY3J5cHRvIiwgbUNyeXB0byk7Ci0gICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXI6IG1DcnlwdG86ICVwIGlzU2VjdXJlOiAlZCIsIG1DcnlwdG8uZ2V0KCksCi0gICAgICAgICAgICAgICAgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpICE9IDApOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubUlzRHJtUHJvdGVjdGVkKSB7CisgICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJjcnlwdG8iLCBtQ3VycmVudFNvdXJjZUluZm8ubUNyeXB0byk7CisgICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXI6IG1DcnlwdG86ICVwIGlzU2VjdXJlOiAlZCIsCisgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1DcnlwdG8uZ2V0KCksCisgICAgICAgICAgICAgICAgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSAhPSAwKTsKICAgICB9CiAKICAgICAoKmRlY29kZXIpLT5jb25maWd1cmUoZm9ybWF0KTsKQEAgLTIxNTYsNyArMjI2Nyw4IEBACiAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0KTsKIH0KIAotdm9pZCBOdVBsYXllcjI6Om5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgewordm9pZCBOdVBsYXllcjI6Om5vdGlmeUxpc3RlbmVyKAorICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluKSB7CiAgICAgaWYgKG1Ecml2ZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjI0MCw4ICsyMzUyLDkgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMjo6Z2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0VHJhY2tJbmZvKGludDY0X3Qgc3JjSWQsIFBsYXllck1lc3NhZ2UqIHJlcGx5KSBjb25zdCB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFRyYWNrSW5mbywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKQEAgLTIyNDksOSArMjM2MiwxMCBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMjo6Z2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0U2VsZWN0ZWRUcmFjayhpbnQ2NF90IHNyY0lkLCBpbnQzMl90IHR5cGUsIFBsYXllck1lc3NhZ2UqIHJlcGx5KSBjb25zdCB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFNlbGVjdGVkVHJhY2ssIHRoaXMpOwogICAgIG1zZy0+c2V0UG9pbnRlcigicmVwbHkiLCByZXBseSk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CiAgICAgbXNnLT5zZXRJbnQzMigidHlwZSIsIHR5cGUpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMjI2Miw4ICsyMzc2LDkgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpIHsKK3N0YXR1c190IE51UGxheWVyMjo6c2VsZWN0VHJhY2soaW50NjRfdCBzcmNJZCwgc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWxlY3RUcmFjaywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CiAgICAgbXNnLT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CiAgICAgbXNnLT5zZXRJbnQzMigic2VsZWN0Iiwgc2VsZWN0KTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwpAQCAtMjI5NSw2ICsyNDEwLDggQEAKICAgICBDSEVDSyhtVHJhY2tTdGF0cyAhPSBOVUxMKTsKIAogICAgIG1UcmFja1N0YXRzLT5jbGVhcigpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1EZWNvZGVyTG9jayk7CiAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICBtVHJhY2tTdGF0cy0+cHVzaF9iYWNrKG1WaWRlb0RlY29kZXItPmdldFN0YXRzKCkpOwogICAgIH0KQEAgLTIzMDQsMTEgKzI0MjEsMTEgQEAKIH0KIAogc3A8TWV0YURhdGE+IE51UGxheWVyMjo6Z2V0RmlsZU1ldGEoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZpbGVGb3JtYXRNZXRhKCk7CisgICAgcmV0dXJuIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOwogfQogCiBmbG9hdCBOdVBsYXllcjI6OmdldEZyYW1lUmF0ZSgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEoZmFsc2UgLyogYXVkaW8gKi8pOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdE1ldGEoZmFsc2UgLyogYXVkaW8gKi8pOwogICAgIGlmIChtZXRhID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMjM2NiwxNiArMjQ4MywxNiBAQAogICAgIEFMT0dWKCJwZXJmb3JtU2VlayBzZWVrVGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcyksIG1vZGU9JWQiLAogICAgICAgICAgIChsb25nIGxvbmcpc2Vla1RpbWVVcywgc2Vla1RpbWVVcyAvIDFFNiwgbW9kZSk7CiAKLSAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwpIHsKICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcmVzZXQgb2NjdXJzIHJpZ2h0IGJlZm9yZSB0aGUgbG9vcCBtb2RlCiAgICAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHNlZWtzIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RyZWFtLgogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1BdWRpb0RlY29kZXIgIT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyICE9IE5VTEwsCi0gICAgICAgICAgICAgICAgIm1Tb3VyY2UgaXMgTlVMTCBhbmQgZGVjb2RlcnMgbm90IE5VTEwgYXVkaW8oJXApIHZpZGVvKCVwKSIsCisgICAgICAgICAgICAgICAgIm1DdXJyZW50U291cmNlSW5mby5tU291cmNlIGlzIE5VTEwgYW5kIGRlY29kZXJzIG5vdCBOVUxMIGF1ZGlvKCVwKSB2aWRlbyglcCkiLAogICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuZ2V0KCksIG1WaWRlb0RlY29kZXIuZ2V0KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1QcmV2aW91c1NlZWtUaW1lVXMgPSBzZWVrVGltZVVzOwotICAgIG1Tb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKKyAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2Vla1RvKHNlZWtUaW1lVXMsIG1vZGUpOwogICAgICsrbVRpbWVkVGV4dEdlbmVyYXRpb247CiAKICAgICAvLyBldmVyeXRoaW5nJ3MgZmx1c2hlZCwgY29udGludWUgcGxheWJhY2suCkBAIC0yNDIyLDE3ICsyNTM5LDEzIEBACiAgICAgbVJlbmRlcmVyLmNsZWFyKCk7CiAgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwogCi0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgbVNvdXJjZS5jbGVhcigpOwotICAgIH0KKyAgICByZXNldFNvdXJjZUluZm8obUN1cnJlbnRTb3VyY2VJbmZvKTsKKyAgICByZXNldFNvdXJjZUluZm8obU5leHRTb3VyY2VJbmZvKTsKIAogICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlc2V0Q29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVzZXRDb21wbGV0ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ0MSwxNCArMjU1NCw2IEBACiAgICAgbVJlc2V0dGluZyA9IGZhbHNlOwogICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CiAKLSAgICAvLyBNb2R1bGFyIERSTQotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZGVjb2RlcnMgd2lsbCBiZSBmbHVzaGVkIGJlZm9yZSB0aGlzIHNvIHRoZWlyIG1DcnlwdG8gd291bGQgZ28gYXdheSBvbiB0aGVpciBvd24KLSAgICAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKLSAgICAgICAgQUxPR0QoInBlcmZvcm1SZXNldCBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOwotICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7Ci0gICAgfQotICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOwogfQogCiB2b2lkIE51UGxheWVyMjo6cGVyZm9ybVBsYXlOZXh0RGF0YVNvdXJjZSgpIHsKQEAgLTI0NjcsMjUgKzI1NzIsMzEgQEAKIAogICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKIAotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdG9wKCk7CiAgICAgfQogCiAgICAgbG9uZyBwcmV2aW91c1NyY0lkOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgbVNvdXJjZSA9IG1OZXh0U291cmNlOwotICAgICAgICBtTmV4dFNvdXJjZSA9IE5VTEw7Ci0gICAgICAgIHByZXZpb3VzU3JjSWQgPSBtU3JjSWQ7Ci0gICAgICAgIG1TcmNJZCA9IG1OZXh0U3JjSWQ7Ci0gICAgICAgICsrbU5leHRTcmNJZDsgIC8vIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gc291cmNlcy4KKyAgICAgICAgcHJldmlvdXNTcmNJZCA9IG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQ7CisKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvID0gbU5leHRTb3VyY2VJbmZvOworICAgICAgICBtTmV4dFNvdXJjZUluZm8gPSBTb3VyY2VJbmZvKCk7CisgICAgICAgIG1OZXh0U291cmNlSW5mby5tU3JjSWQgPSB+bUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZDsgIC8vIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gc291cmNlcy4KICAgICB9CiAKICAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIocHJldmlvdXNTcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFLCAwKTsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1NUQVJURURfQVNfTkVYVCwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihwcmV2aW91c1NyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfRU5ELCAwKTsKKworICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9TVEFSVCwgMCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0OTQsMjIgKzI2MDUsMTUgQEAKICAgICBtUmVzZXR0aW5nID0gZmFsc2U7CiAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgewotICAgICAgICAvLyBkZWNvZGVycyB3aWxsIGJlIGZsdXNoZWQgYmVmb3JlIHRoaXMgc28gdGhlaXIgbUNyeXB0byB3b3VsZCBnbyBhd2F5IG9uIHRoZWlyIG93bgotICAgICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgICAgICBBTE9HRCgicGVyZm9ybVJlc2V0IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0gICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKLSAgICB9Ci0gICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisgICAgYWRkRW5kVGltZU1vbml0b3IoKTsKIAogICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOwogICAgIH0KIAotICAgIG9uU3RhcnQoKTsKKyAgICBvblN0YXJ0KHRydWUgLyogcGxheSAqLyk7CiAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gZmFsc2U7Ci0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CisgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOwogfQogCiB2b2lkIE51UGxheWVyMjo6cGVyZm9ybVNjYW5Tb3VyY2VzKCkgewpAQCAtMjUzNSw3ICsyNjM5LDcgQEAKICAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXRTdXJmYWNlQ29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjU2Nyw3ICsyNjcxLDcgQEAKIHZvaWQgTnVQbGF5ZXIyOjpmaW5pc2hSZXN1bWUoKSB7CiAgICAgaWYgKG1SZXN1bWVQZW5kaW5nKSB7CiAgICAgICAgIG1SZXN1bWVQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShtU3JjSWQpOworICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCk7CiAgICAgfQogfQogCkBAIC0yNTg5LDM2ICsyNjkzLDUwIEBACiAgICAgc3dpdGNoICh3aGF0KSB7CiAgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFByZXBhcmVkOgogICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiTnVQbGF5ZXIyOjpvblNvdXJjZU5vdGlmeSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQgc291cmNlOiAlcCIsIG1Tb3VyY2UuZ2V0KCkpOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGFsZSBub3RpZmljYXRpb24gZnJvbSBhIHNvdXJjZSB0aGF0IHdhcwotICAgICAgICAgICAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHByZXBhcmluZyB3aGVuIHRoZSBjbGllbnQgY2FsbGVkIHJlc2V0KCkuCi0gICAgICAgICAgICAgICAgLy8gV2UgaGFuZGxlZCB0aGUgcmVzZXQsIHRoZSBzb3VyY2UgaXMgZ29uZS4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50MzJfdCBlcnI7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2h1dCBkb3duIHBvdGVudGlhbCBzZWN1cmUgY29kZWNzIGluIGNhc2UgY2xpZW50IG5ldmVyIGNhbGxzIHJlc2V0Ci0gICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9TSFVURE9XTiAvKiBhdWRpbyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUHJlcGFyZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwotICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90aWZ5IGR1cmF0aW9uIGZpcnN0LCBzbyB0aGF0IGl0J3MgZGVmaW5pdGVseSBzZXQgd2hlbgotICAgICAgICAgICAgICAgIC8vIHRoZSBhcHAgcmVjZWl2ZWQgdGhlICJwcmVwYXJlIGNvbXBsZXRlIiBjYWxsYmFjay4KLSAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKHNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgIEFMT0dWKCJOdVBsYXllcjI6Om9uU291cmNlTm90aWZ5IFNvdXJjZTo6a1doYXRQcmVwYXJlZCBzb3VyY2U6JXAsIElkKCVsbGQpIiwKKyAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLmdldCgpLCAobG9uZyBsb25nKXNyY0lkKTsKKyAgICAgICAgICAgIGlmIChzcmNJZCA9PSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0YWxlIG5vdGlmaWNhdGlvbiBmcm9tIGEgc291cmNlIHRoYXQgd2FzCisgICAgICAgICAgICAgICAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHByZXBhcmluZyB3aGVuIHRoZSBjbGllbnQgY2FsbGVkIHJlc2V0KCkuCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhbmRsZWQgdGhlIHJlc2V0LCB0aGUgc291cmNlIGlzIGdvbmUuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGVycjsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyBzaHV0IGRvd24gcG90ZW50aWFsIHNlY3VyZSBjb2RlY3MgaW4gY2FzZSBjbGllbnQgbmV2ZXIgY2FsbHMgcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfU0hVVERPV04gLyogYXVkaW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfU0hVVERPV04gLyogdmlkZW8gKi8pKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IGR1cmF0aW9uIGZpcnN0LCBzbyB0aGF0IGl0J3MgZGVmaW5pdGVseSBzZXQgd2hlbgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIHJlY2VpdmVkIHRoZSAicHJlcGFyZSBjb21wbGV0ZSIgY2FsbGJhY2suCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24oc3JjSWQsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UHJlcGFyZUNvbXBsZXRlZChzcmNJZCwgZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY0lkID09IG1OZXh0U291cmNlSW5mby5tU3JjSWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobU5leHRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIHN0YWxlCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UHJlcGFyZUNvbXBsZXRlZChzcmNJZCwgZXJyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjYyNywxNSArMjc0NSwxNSBAQAogICAgICAgICAvLyBNb2R1bGFyIERSTQogICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXREcm1JbmZvOgogICAgICAgICB7Ci0gICAgICAgICAgICBQYXJjZWwgcGFyY2VsOworICAgICAgICAgICAgUGxheWVyTWVzc2FnZSBwbGF5ZXJNc2c7CiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBkcm1JbmZvOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJkcm1JbmZvIiwgJmRybUluZm8pKTsKLSAgICAgICAgICAgIHBhcmNlbC5zZXREYXRhKGRybUluZm8tPmRhdGEoKSwgZHJtSW5mby0+c2l6ZSgpKTsKKyAgICAgICAgICAgIHBsYXllck1zZy5QYXJzZUZyb21BcnJheShkcm1JbmZvLT5kYXRhKCksIGRybUluZm8tPnNpemUoKSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJvblNvdXJjZU5vdGlmeSgpIGtXaGF0RHJtSW5mbyBNRURJQTJfRFJNX0lORk8gZHJtSW5mbzogJXAgIHBhcmNlbCBzaXplOiAlenUiLAotICAgICAgICAgICAgICAgICAgICBkcm1JbmZvLmdldCgpLCBwYXJjZWwuZGF0YVNpemUoKSk7CisgICAgICAgICAgICBBTE9HVigib25Tb3VyY2VOb3RpZnkoKSBrV2hhdERybUluZm8gTUVESUEyX0RSTV9JTkZPIGRybUluZm86ICVwICBwbGF5ZXJNc2cgc2l6ZTogJWQiLAorICAgICAgICAgICAgICAgICAgICBkcm1JbmZvLmdldCgpLCBwbGF5ZXJNc2cuQnl0ZVNpemUoKSk7CiAKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfRFJNX0lORk8sIDAgLyogZXh0MSAqLywgMCAvKiBleHQyICovLCAmcGFyY2VsKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfRFJNX0lORk8sIDAgLyogZXh0MSAqLywgMCAvKiBleHQyICovLCAmcGxheWVyTXNnKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI2NjQsMTkgKzI3ODIsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlMaXN0ZW5lcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX05PVF9TRUVLQUJMRSwgMCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RmxhZ3NDaGFuZ2VkKHNyY0lkLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKHNyY0lkID09IG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlGbGFnc0NoYW5nZWQoc3JjSWQsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICgobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCi0gICAgICAgICAgICAgICAgICAgICYmICghKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pKSkgewotICAgICAgICAgICAgICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyICE9IE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVQb2xsRHVyYXRpb24oKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcmNJZCA9PSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgaWYgKChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIShmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsUG9sbER1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyICE9IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtU291cmNlRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY0lkID09IG1OZXh0U291cmNlSW5mby5tU3JjSWQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZHVyYXRpb24gcG9sbGluZyBmb3IgbmV4dCBzb3VyY2UuCisgICAgICAgICAgICAgICAgbU5leHRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyA9IGZsYWdzOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjgyNyw4ICsyOTUyLDggQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpOwogCiAgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0NvdW50KCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNlbmRTdWJ0aXRsZURhdGEoYnVmZmVyLCBpbmJhbmRUcmFja3MpOwpAQCAtMjgzNyw3ICsyOTYyLDcgQEAKIAogICAgICAgICBjYXNlIE51UGxheWVyMjo6Q0NEZWNvZGVyOjprV2hhdFRyYWNrQWRkZWQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFLCAwKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI4NTYsMzUgKzI5ODEsMzEgQEAKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CiAKLSAgICBQYXJjZWwgaW47Ci0gICAgaW4ud3JpdGVJbnQzMih0cmFja0luZGV4ICsgYmFzZUluZGV4KTsKLSAgICBpbi53cml0ZUludDY0KHRpbWVVcyk7Ci0gICAgaW4ud3JpdGVJbnQ2NChkdXJhdGlvblVzKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZSh0cmFja0luZGV4ICsgYmFzZUluZGV4KTsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfaW50NjRfdmFsdWUodGltZVVzKTsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfaW50NjRfdmFsdWUoZHVyYXRpb25Vcyk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CiAKLSAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVUJUSVRMRV9EQVRBLCAwLCAwLCAmaW4pOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVUJUSVRMRV9EQVRBLCAwLCAwLCAmcGxheWVyTXNnKTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnNlbmRUaW1lZE1ldGFEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKLSAgICBQYXJjZWwgaW47Ci0gICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOwotICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOwotICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOwotICAgIGluLndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgUGxheWVyTWVzc2FnZSBwbGF5ZXJNc2c7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKHRpbWVVcyk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CiAKLSAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9NRVRBX0RBVEEsIDAsIDAsICZpbik7CisgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX01FVEFfREFUQSwgMCwgMCwgJnBsYXllck1zZyk7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgY29uc3Qgdm9pZCAqZGF0YTsKICAgICBzaXplX3Qgc2l6ZSA9IDA7CiAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6SU5fQkFORF9URVhUXzNHUFA7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczI6OklOX0JBTkRfVEVYVF8zR1BQOwogCiAgICAgQVN0cmluZyBtaW1lOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKQEAgLTI4OTMsMjggKzMwMTQsMjggQEAKICAgICBkYXRhID0gYnVmZmVyLT5kYXRhKCk7CiAgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOwogCi0gICAgUGFyY2VsIHBhcmNlbDsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKICAgICBpZiAoc2l6ZSA+IDApIHsKICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogICAgICAgICBpbnQzMl90IGdsb2JhbCA9IDA7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJnbG9iYWwiLCAmZ2xvYmFsKSAmJiBnbG9iYWwpIHsKLSAgICAgICAgICAgIGZsYWcgfD0gVGV4dERlc2NyaXB0aW9uczo6R0xPQkFMX0RFU0NSSVBUSU9OUzsKKyAgICAgICAgICAgIGZsYWcgfD0gVGV4dERlc2NyaXB0aW9uczI6OkdMT0JBTF9ERVNDUklQVElPTlM7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OkxPQ0FMX0RFU0NSSVBUSU9OUzsKKyAgICAgICAgICAgIGZsYWcgfD0gVGV4dERlc2NyaXB0aW9uczI6OkxPQ0FMX0RFU0NSSVBUSU9OUzsKICAgICAgICAgfQotICAgICAgICBUZXh0RGVzY3JpcHRpb25zOjpnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucygKLSAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEsIHNpemUsIGZsYWcsIHRpbWVVcyAvIDEwMDAsICZwYXJjZWwpOworICAgICAgICBUZXh0RGVzY3JpcHRpb25zMjo6Z2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSwgc2l6ZSwgZmxhZywgdGltZVVzIC8gMTAwMCwgJnBsYXllck1zZyk7CiAgICAgfQogCi0gICAgaWYgKChwYXJjZWwuZGF0YVNpemUoKSA+IDApKSB7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1RJTUVEX1RFWFQsIDAsIDAsICZwYXJjZWwpOworICAgIGlmIChwbGF5ZXJNc2cudmFsdWVzX3NpemUoKSA+IDApIHsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1RJTUVEX1RFWFQsIDAsIDAsICZwbGF5ZXJNc2cpOwogICAgIH0gZWxzZSB7ICAvLyBzZW5kIGFuIGVtcHR5IHRpbWVkIHRleHQKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCk7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwKTsKICAgICB9CiB9CiAKIGNvbnN0IGNoYXIgKk51UGxheWVyMjo6Z2V0RGF0YVNvdXJjZVR5cGUoKSB7Ci0gICAgc3dpdGNoIChtRGF0YVNvdXJjZVR5cGUpIHsKKyAgICBzd2l0Y2ggKG1DdXJyZW50U291cmNlSW5mby5tRGF0YVNvdXJjZVR5cGUpIHsKICAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRToKICAgICAgICAgICAgIHJldHVybiAiSFRUUExpdmUiOwogCkBAIC0yOTM2LDggKzMwNTcsMzQgQEAKICAgICB9CiAgfQogCitOdVBsYXllcjI6OlNvdXJjZUluZm8qIE51UGxheWVyMjo6Z2V0U291cmNlSW5mb0J5SWRJbk1zZyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDY0X3Qgc3JjSWQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJnNyY0lkKSk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQgPT0gc3JjSWQpIHsKKyAgICAgICAgcmV0dXJuICZtQ3VycmVudFNvdXJjZUluZm87CisgICAgfSBlbHNlIGlmIChtTmV4dFNvdXJjZUluZm8ubVNyY0lkID09IHNyY0lkKSB7CisgICAgICAgIHJldHVybiAmbU5leHRTb3VyY2VJbmZvOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OnJlc2V0U291cmNlSW5mbyhOdVBsYXllcjI6OlNvdXJjZUluZm8gJnNyY0luZm8pIHsKKyAgICBpZiAoc3JjSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc3JjSW5mby5tU291cmNlLT5zdG9wKCk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKKyAgICAgICAgc3JjSW5mby5tU291cmNlLmNsZWFyKCk7CisgICAgfQorICAgIC8vIE1vZHVsYXIgRFJNCisgICAgQUxPR0QoInBlcmZvcm1SZXNldCBtQ3J5cHRvOiAlcCIsIHNyY0luZm8ubUNyeXB0by5nZXQoKSk7CisgICAgc3JjSW5mby5tQ3J5cHRvLmNsZWFyKCk7CisgICAgc3JjSW5mby5tSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKK30KKwogLy8gTW9kdWxhciBEUk0gYmVnaW4KLXN0YXR1c190IE51UGxheWVyMjo6cHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKK3N0YXR1c190IE51UGxheWVyMjo6cHJlcGFyZURybSgKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpCiB7CiAgICAgQUxPR1YoInByZXBhcmVEcm0gIik7CiAKQEAgLTI5NDcsNiArMzA5NCw3IEBACiAgICAgdWludDhfdCBVVUlEWzE2XTsKICAgICBtZW1jcHkoVVVJRCwgdXVpZCwgc2l6ZW9mKFVVSUQpKTsKICAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkID0gZHJtU2Vzc2lvbklkOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOwogICAgIG1zZy0+c2V0UG9pbnRlcigidXVpZCIsICh2b2lkKilVVUlEKTsKICAgICBtc2ctPnNldFBvaW50ZXIoImRybVNlc3Npb25JZCIsICh2b2lkKikmc2Vzc2lvbklkKTsKIApAQCAtMjk2MywxMSArMzExMSwxMiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMjo6cmVsZWFzZURybSgpCitzdGF0dXNfdCBOdVBsYXllcjI6OnJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCkKIHsKICAgICBBTE9HVigicmVsZWFzZURybSAiKTsKIAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlRHJtLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CkBAIC0yOTg4LDggKzMxMzcsMTUgQEAKICAgICBBTE9HRCgib25QcmVwYXJlRHJtICIpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBObyBzb3VyY2UuIG9uUHJlcGFyZURybSBmYWlsZWQgd2l0aCAlZC4iLCBzdGF0dXMpOworICAgIFNvdXJjZUluZm8gKnNyY0luZm8gPSBnZXRTb3VyY2VJbmZvQnlJZEluTXNnKG1zZyk7CisgICAgaWYgKHNyY0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGludDY0X3Qgc3JjSWQgPSBzcmNJbmZvLT5tU3JjSWQ7CisgICAgaWYgKHNyY0luZm8tPm1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBzcmNJbmZvKCVsbGQpIE5vIHNvdXJjZS4gb25QcmVwYXJlRHJtIGZhaWxlZCB3aXRoICVkLiIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKQEAgLTMwMDEsNDIgKzMxNTcsNTAgQEAKICAgICBzdGF0dXMgPSBPSzsKICAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiBjcnlwdG8gPSBOVUxMOwogCi0gICAgc3RhdHVzID0gbVNvdXJjZS0+cHJlcGFyZURybSh1dWlkLCAqZHJtU2Vzc2lvbklkLCAmY3J5cHRvKTsKKyAgICBzdGF0dXMgPSBzcmNJbmZvLT5tU291cmNlLT5wcmVwYXJlRHJtKHV1aWQsICpkcm1TZXNzaW9uSWQsICZjcnlwdG8pOwogICAgIGlmIChjcnlwdG8gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBtU291cmNlLT5wcmVwYXJlRHJtIGZhaWxlZC4gc3RhdHVzOiAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IHNyY0luZm8oJWxsZCkubVNvdXJjZS0+cHJlcGFyZURybSBmYWlsZWQuIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIEFMT0dWKCJvblByZXBhcmVEcm06IG1Tb3VyY2UtPnByZXBhcmVEcm0gc3VjY2VlZGVkIik7CisgICAgQUxPR1YoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKS5tU291cmNlLT5wcmVwYXJlRHJtIHN1Y2NlZWRlZCIsIChsb25nIGxvbmcpc3JjSWQpOwogCi0gICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBVbmV4cGVjdGVkLiBBbHJlYWR5IGhhdmluZyBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOwotICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7CisgICAgaWYgKHNyY0luZm8tPm1DcnlwdG8gIT0gTlVMTCkgeworICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBzcmNJbmZvKCVsbGQpIFVuZXhwZWN0ZWQuIEFscmVhZHkgaGF2aW5nIG1DcnlwdG86ICVwIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBzcmNJbmZvLT5tQ3J5cHRvLmdldCgpKTsKKyAgICAgICAgc3JjSW5mby0+bUNyeXB0by5jbGVhcigpOwogICAgIH0KIAotICAgIG1DcnlwdG8gPSBjcnlwdG87Ci0gICAgbUlzRHJtUHJvdGVjdGVkID0gdHJ1ZTsKKyAgICBzcmNJbmZvLT5tQ3J5cHRvID0gY3J5cHRvOworICAgIHNyY0luZm8tPm1Jc0RybVByb3RlY3RlZCA9IHRydWU7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKLSAgICBBTE9HRCgib25QcmVwYXJlRHJtOiBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOworICAgIEFMT0dEKCJvblByZXBhcmVEcm06IG1DcnlwdG86ICVwIiwgc3JjSW5mby0+bUNyeXB0by5nZXQoKSk7CiAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6Om9uUmVsZWFzZURybSgpCitzdGF0dXNfdCBOdVBsYXllcjI6Om9uUmVsZWFzZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykKIHsKICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgogICAgIEFMT0dEKCJvblJlbGVhc2VEcm0gIik7Ci0KLSAgICBpZiAoIW1Jc0RybVByb3RlY3RlZCkgewotICAgICAgICBBTE9HVygib25SZWxlYXNlRHJtOiBVbmV4cGVjdGVkLiBtSXNEcm1Qcm90ZWN0ZWQgaXMgYWxyZWFkeSBmYWxzZS4iKTsKKyAgICBTb3VyY2VJbmZvICpzcmNJbmZvID0gZ2V0U291cmNlSW5mb0J5SWRJbk1zZyhtc2cpOzsKKyAgICBpZiAoc3JjSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKKyAgICBpbnQ2NF90IHNyY0lkID0gc3JjSW5mby0+bVNyY0lkOworICAgIGlmICghc3JjSW5mby0+bUlzRHJtUHJvdGVjdGVkKSB7CisgICAgICAgIEFMT0dXKCJvblJlbGVhc2VEcm06IHNyY0luZm8oJWxsZCkgVW5leHBlY3RlZC4gbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkKTsKKyAgICB9CisKKyAgICBzcmNJbmZvLT5tSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKIAogICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CisgICAgaWYgKHNyY0luZm8tPm1DcnlwdG8gIT0gTlVMTCkgewogICAgICAgICAvLyBub3RpZnlpbmcgdGhlIHNvdXJjZSBmaXJzdCBiZWZvcmUgcmVtb3ZpbmcgY3J5cHRvIGZyb20gY29kZWMKLSAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgbVNvdXJjZS0+cmVsZWFzZURybSgpOworICAgICAgICBpZiAoc3JjSW5mby0+bVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzcmNJbmZvLT5tU291cmNlLT5yZWxlYXNlRHJtKCk7CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0dXM9T0s7CkBAIC0zMDU3LDkgKzMyMjEsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKLSAgICAgICAgQUxPR0QoIm9uUmVsZWFzZURybTogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgIH0gZWxzZSB7ICAgLy8gbUNyeXB0byA9PSBOVUxMCisgICAgICAgIEFMT0dEKCJvblJlbGVhc2VEcm06IG1DcnlwdG86ICVwIiwgc3JjSW5mby0+bUNyeXB0by5nZXQoKSk7CisgICAgICAgIHNyY0luZm8tPm1DcnlwdG8uY2xlYXIoKTsKKyAgICB9IGVsc2UgeyAgIC8vIHNyY0luZm8tPm1DcnlwdG8gPT0gTlVMTAogICAgICAgICBBTE9HRSgib25SZWxlYXNlRHJtOiBVbmV4cGVjdGVkLiBUaGVyZSBpcyBubyBjcnlwdG8uIik7CiAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTMxMjEsNCArMzI4NSwyNCBAQAogICAgIFRSRVNQQVNTKCk7CiB9CiAKK051UGxheWVyMjo6U291cmNlSW5mbzo6U291cmNlSW5mbygpCisgICAgOiBtRGF0YVNvdXJjZVR5cGUoREFUQV9TT1VSQ0VfVFlQRV9OT05FKSwKKyAgICAgIG1TcmNJZCgwKSwKKyAgICAgIG1Tb3VyY2VGbGFncygwKSwKKyAgICAgIG1TdGFydFRpbWVVcygwKSwKKyAgICAgIG1FbmRUaW1lVXMoRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lVXMpIHsKK30KKworTnVQbGF5ZXIyOjpTb3VyY2VJbmZvICYgTnVQbGF5ZXIyOjpTb3VyY2VJbmZvOjpvcGVyYXRvcj0oY29uc3QgTnVQbGF5ZXIyOjpTb3VyY2VJbmZvICZvdGhlcikgeworICAgIG1Tb3VyY2UgPSBvdGhlci5tU291cmNlOworICAgIG1DcnlwdG8gPSBvdGhlci5tQ3J5cHRvOworICAgIG1EYXRhU291cmNlVHlwZSA9IChEQVRBX1NPVVJDRV9UWVBFKW90aGVyLm1EYXRhU291cmNlVHlwZTsKKyAgICBtU3JjSWQgPSBvdGhlci5tU3JjSWQ7CisgICAgbVNvdXJjZUZsYWdzID0gb3RoZXIubVNvdXJjZUZsYWdzOworICAgIG1TdGFydFRpbWVVcyA9IG90aGVyLm1TdGFydFRpbWVVczsKKyAgICBtRW5kVGltZVVzID0gb3RoZXIubUVuZFRpbWVVczsKKyAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBvdGhlci5tSXNEcm1Qcm90ZWN0ZWQ7CisgICAgcmV0dXJuICp0aGlzOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKaW5kZXggOTZmODVmOS4uYjhmYjk4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oCkBAIC0yMiw2ICsyMiwxMSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgorCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyLnBiLmgiCisKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZWRpYVBsYXllcjJQcm90bzo6UGxheWVyTWVzc2FnZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zOCw3ICs0Myw4IEBACiBzdHJ1Y3QgTnVQbGF5ZXIyRHJpdmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXIyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBleHBsaWNpdCBOdVBsYXllcjIocGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKTsKKyAgICBleHBsaWNpdCBOdVBsYXllcjIocGlkX3QgcGlkLCB1aWRfdCB1aWQsCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQpOwogCiAgICAgdm9pZCBzZXREcml2ZXIoY29uc3Qgd3A8TnVQbGF5ZXIyRHJpdmVyPiAmZHJpdmVyKTsKIApAQCAtNzUsMTEgKzgxLDEyIEBACiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCiAgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQywKICAgICAgICAgICAgIGJvb2wgbmVlZE5vdGlmeSA9IGZhbHNlKTsKKyAgICB2b2lkIHJld2luZCgpOwogCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9TY2FsaW5nTW9kZShpbnQzMl90IG1vZGUpOwotICAgIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdDsKLSAgICBzdGF0dXNfdCBnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3Q7Ci0gICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcyk7CisgICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKGludDY0X3Qgc3JjSWQsIFBsYXllck1lc3NhZ2UqIHJlcGx5KSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRTZWxlY3RlZFRyYWNrKGludDY0X3Qgc3JjSWQsIGludDMyX3QgdHlwZSwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0OworICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKGludDY0X3Qgc3JjSWQsIHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKTsKICAgICB2b2lkIGdldFN0YXRzKFZlY3RvcjxzcDxBTWVzc2FnZT4gPiAqbVRyYWNrU3RhdHMpOwogCkBAIC04Nyw4ICs5NCw4IEBACiAgICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7CiAKICAgICAvLyBNb2R1bGFyIERSTQotICAgIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOwotICAgIHN0YXR1c190IHJlbGVhc2VEcm0oKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRHJtKGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKKyAgICBzdGF0dXNfdCByZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpOwogCiAgICAgY29uc3QgY2hhciAqZ2V0RGF0YVNvdXJjZVR5cGUoKTsKIApAQCAtMTUwLDYgKzE1NywzMiBAQAogICAgICAgICBrV2hhdFNldEJ1ZmZlcmluZ1NldHRpbmdzICAgICAgID0gJ3NCdVMnLAogICAgICAgICBrV2hhdFByZXBhcmVEcm0gICAgICAgICAgICAgICAgID0gJ3BEcm0nLAogICAgICAgICBrV2hhdFJlbGVhc2VEcm0gICAgICAgICAgICAgICAgID0gJ3JEcm0nLAorICAgICAgICBrV2hhdFJld2luZCAgICAgICAgICAgICAgICAgICAgID0gJ3JlV2QnLAorICAgICAgICBrV2hhdEVPU01vbml0b3IgICAgICAgICAgICAgICAgID0gJ2Vvc00nLAorICAgIH07CisKKyAgICB0eXBlZGVmIGVudW0geworICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX05PTkUsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX1JUU1AsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkwsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19GRCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9NRURJQSwKKyAgICB9IERBVEFfU09VUkNFX1RZUEU7CisKKyAgICBzdHJ1Y3QgU291cmNlSW5mbyB7CisgICAgICAgIFNvdXJjZUluZm8oKTsKKyAgICAgICAgU291cmNlSW5mbyAmb3BlcmF0b3I9KGNvbnN0IFNvdXJjZUluZm8gJik7CisKKyAgICAgICAgc3A8U291cmNlPiBtU291cmNlOworICAgICAgICBzdGQ6OmF0b21pYzxEQVRBX1NPVVJDRV9UWVBFPiBtRGF0YVNvdXJjZVR5cGU7CisgICAgICAgIGludDY0X3QgbVNyY0lkOworICAgICAgICB1aW50MzJfdCBtU291cmNlRmxhZ3M7CisgICAgICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOworICAgICAgICBpbnQ2NF90IG1FbmRUaW1lVXM7CisgICAgICAgIC8vIE1vZHVsYXIgRFJNCisgICAgICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IG1DcnlwdG87CisgICAgICAgIGJvb2wgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CiAgICAgfTsKIAogICAgIHdwPE51UGxheWVyMkRyaXZlcj4gbURyaXZlcjsKQEAgLTE1NywyMyArMTkwLDIxIEBACiAgICAgdWlkX3QgbVVJRDsKICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKICAgICBNdXRleCBtU291cmNlTG9jazsgIC8vIGd1YXJkIHxtU291cmNlfC4KLSAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgaW50NjRfdCBtU3JjSWQ7Ci0gICAgdWludDMyX3QgbVNvdXJjZUZsYWdzOwotICAgIHNwPFNvdXJjZT4gbU5leHRTb3VyY2U7Ci0gICAgaW50NjRfdCBtTmV4dFNyY0lkOwotICAgIHVpbnQzMl90IG1OZXh0U291cmNlRmxhZ3M7CisgICAgU291cmNlSW5mbyBtQ3VycmVudFNvdXJjZUluZm87CisgICAgU291cmNlSW5mbyBtTmV4dFNvdXJjZUluZm87CiAgICAgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+IG1OYXRpdmVXaW5kb3c7CiAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAgICAgc3A8RGVjb2RlckJhc2U+IG1WaWRlb0RlY29kZXI7CiAgICAgYm9vbCBtT2ZmbG9hZEF1ZGlvOwogICAgIHNwPERlY29kZXJCYXNlPiBtQXVkaW9EZWNvZGVyOworICAgIE11dGV4IG1EZWNvZGVyTG9jazsgIC8vIGd1YXJkIHxtQXVkaW9EZWNvZGVyfCBhbmQgfG1WaWRlb0RlY29kZXJ8LgogICAgIHNwPENDRGVjb2Rlcj4gbUNDRGVjb2RlcjsKICAgICBzcDxSZW5kZXJlcj4gbVJlbmRlcmVyOwogICAgIHNwPEFMb29wZXI+IG1SZW5kZXJlckxvb3BlcjsKICAgICBpbnQzMl90IG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtUmVuZGVyZXJHZW5lcmF0aW9uOworICAgIGludDMyX3QgbUVPU01vbml0b3JHZW5lcmF0aW9uOwogCiAgICAgTXV0ZXggbVBsYXlpbmdUaW1lTG9jazsKICAgICBpbnQ2NF90IG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnM7CkBAIC0yNDQsMjEgKzI3NSw4IEBACiAgICAgLy8gUGF1c2Ugc3RhdGUgYXMgcmVxdWVzdGVkIGJ5IHNvdXJjZSAoaW50ZXJuYWxseSkgZHVlIHRvIGJ1ZmZlcmluZwogICAgIGJvb2wgbVBhdXNlZEZvckJ1ZmZlcmluZzsKIAotICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gbUNyeXB0bzsKLSAgICBib29sIG1Jc0RybVByb3RlY3RlZDsKLQotICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfTk9ORSwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkUsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfUlRTUCwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX1VSTCwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX0ZELAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX01FRElBLAotICAgIH0gREFUQV9TT1VSQ0VfVFlQRTsKLQotICAgIHN0ZDo6YXRvbWljPERBVEFfU09VUkNFX1RZUEU+IG1EYXRhU291cmNlVHlwZTsKLSAgICBzdGQ6OmF0b21pYzxEQVRBX1NPVVJDRV9UWVBFPiBtTmV4dERhdGFTb3VyY2VUeXBlOworICAgIC8vIFBhc3NlZCBmcm9tIEpBVkEKKyAgICBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiBtQ29udGV4dDsKIAogICAgIGlubGluZSBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJmdldERlY29kZXIoYm9vbCBhdWRpbykgewogICAgICAgICByZXR1cm4gYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlcjsKQEAgLTI5MiwxMiArMzEwLDE0IEBACiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQgPSBOVUxMKTsKIAotICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluID0gTlVMTCk7CisKKyAgICB2b2lkIGFkZEVuZFRpbWVNb25pdG9yKCk7CiAKICAgICB2b2lkIGhhbmRsZUZsdXNoQ29tcGxldGUoYm9vbCBhdWRpbywgYm9vbCBpc0RlY29kZXIpOwogICAgIHZvaWQgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CiAKLSAgICB2b2lkIG9uU3RhcnQoKTsKKyAgICB2b2lkIG9uU3RhcnQoYm9vbCBwbGF5KTsKICAgICB2b2lkIG9uUmVzdW1lKCk7CiAgICAgdm9pZCBvblBhdXNlKCk7CiAKQEAgLTMzMywxMCArMzUzLDEzIEBACiAgICAgdm9pZCBzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICB2b2lkIHNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCi0gICAgdm9pZCB3cml0ZVRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3Q7CisgICAgdm9pZCB3cml0ZVRyYWNrSW5mbyhQbGF5ZXJNZXNzYWdlKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0OwogCiAgICAgc3RhdHVzX3Qgb25QcmVwYXJlRHJtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICBzdGF0dXNfdCBvblJlbGVhc2VEcm0oKTsKKyAgICBzdGF0dXNfdCBvblJlbGVhc2VEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgU291cmNlSW5mbyogZ2V0U291cmNlSW5mb0J5SWRJbk1zZyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCByZXNldFNvdXJjZUluZm8oU291cmNlSW5mbyAmc3JjSW5mbyk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllcjIpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcAppbmRleCBhMjM1NDZhLi45OGMzNDAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwCkBAIC0xOTksNiArMTk5LDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzc2l6ZV90IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICBDQ1RyYWNrIHRyYWNrID0gbVRyYWNrc1ttU2VsZWN0ZWRUcmFja107CisgICAgICAgIGlmICh0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE2MDggfHwgdHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNzA4KSB7CisgICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSA/IG1TZWxlY3RlZFRyYWNrIDogLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1VOS05PV04gPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKIGJvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmlzU2VsZWN0ZWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrID49IDAgJiYgbVNlbGVjdGVkVHJhY2sgPCAoaW50MzJfdClnZXRUcmFja0NvdW50KCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaAppbmRleCA1N2Q1ZWEyLi45NzgzNGQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OwogICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKICAgICBib29sIGlzU2VsZWN0ZWQoKSBjb25zdDsKICAgICB2b2lkIGRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CiAgICAgdm9pZCBkaXNwbGF5KGludDY0X3QgdGltZVVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwCmluZGV4IGY1NzE4ZTEuLjY2YmZhZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcApAQCAtMTA3LDcgKzEwNywxMiBAQAogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy10b3RhbCIsIG1OdW1GcmFtZXNUb3RhbCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtaW5wdXQiLCBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKTsKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCk7Ci0gICAgcmV0dXJuIG1TdGF0czsKKyAgICBtU3RhdHMtPnNldEZsb2F0KCJmcmFtZS1yYXRlLXRvdGFsIiwgbUZyYW1lUmF0ZVRvdGFsKTsKKworICAgIC8vIGknbSBtdXRleGVkIHJpZ2h0IG5vdy4KKyAgICAvLyBtYWtlIG91ciBvd24gY29weSwgc28gd2UgYXJlbid0IHZpY3RpbSB0byBhbnkgbGF0ZXIgY2hhbmdlcy4KKyAgICBzcDxBTWVzc2FnZT4gY29waWVkU3RhdHMgPSBtU3RhdHMtPmR1cCgpOworICAgIHJldHVybiBjb3BpZWRTdGF0czsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpEZWNvZGVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpIHsKQEAgLTEwODgsNiArMTA5MywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXJIb2xkZXIqPihob2xkZXIuZ2V0KCkpLT5tZWRpYUJ1ZmZlcigpIDogbnVsbHB0cjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5zaXplKCkgPiBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoRVJST1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlckl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIG1lZGlhQnVmLT5kYXRhKCksIG1lZGlhQnVmLT5zaXplKCkpOwogCkBAIC0xMTAyLDYgKzExMTMsMTEgQEAKICAgICAgICAgICAgIH0gLy8gYnVmZmVyLT5kYXRhKCkKICAgICAgICAgfSAvLyBuZWVkc0NvcHkKIAorICAgICAgICBzcDxSZWZCYXNlPiBjcnlwdEluZm9PYmo7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZE9iamVjdCgiY3J5cHRJbmZvIiwgJmNyeXB0SW5mb09iaikpIHsKKyAgICAgICAgICAgIGNyeXB0SW5mbyA9IHN0YXRpY19jYXN0PEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIgKj4oY3J5cHRJbmZvT2JqLmdldCgpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgaWYgKGNyeXB0SW5mbyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwCmluZGV4IDg3OTMwYzcuLjkxNGYyOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwCkBAIC0zOCw3ICszOCw3IEBACiAgICAgLy8gRXZlcnkgZGVjb2RlciBoYXMgaXRzIG93biBsb29wZXIgYmVjYXVzZSBNZWRpYUNvZGVjIG9wZXJhdGlvbnMKICAgICAvLyBhcmUgYmxvY2tpbmcsIGJ1dCBOdVBsYXllcjIgbmVlZHMgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCiAgICAgbURlY29kZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBtRGVjb2Rlckxvb3Blci0+c2V0TmFtZSgiTlBEZWNvZGVyIik7CisgICAgbURlY29kZXJMb29wZXItPnNldE5hbWUoIk5QMkRlY29kZXIiKTsKICAgICBtRGVjb2Rlckxvb3Blci0+c3RhcnQoZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKaW5kZXggMzk4YzI0Ni4uMTg3NjQ5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcApAQCAtMzcsNDkgKzM3LDUxIEBACiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+CiAKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlZhbHVlOworCiBzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBQYXJjZWxXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIHN0YXRpYyBzcDxQYXJjZWxXcmFwcGVyPiBDcmVhdGUoY29uc3QgUGFyY2VsICpwKSB7CitzdHJ1Y3QgUGxheWVyTWVzc2FnZVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgc3RhdGljIHNwPFBsYXllck1lc3NhZ2VXcmFwcGVyPiBDcmVhdGUoY29uc3QgUGxheWVyTWVzc2FnZSAqcCkgewogICAgICAgICBpZiAocCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxQYXJjZWxXcmFwcGVyPiBwdyA9IG5ldyBQYXJjZWxXcmFwcGVyKCk7Ci0gICAgICAgICAgICBpZiAocHctPmFwcGVuZEZyb20ocCkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHc7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxQbGF5ZXJNZXNzYWdlV3JhcHBlcj4gcHcgPSBuZXcgUGxheWVyTWVzc2FnZVdyYXBwZXIoKTsKKyAgICAgICAgICAgIHB3LT5jb3B5RnJvbShwKTsKKyAgICAgICAgICAgIHJldHVybiBwdzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBjb25zdCBQYXJjZWwgKmdldFBhcmNlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1QYXJjZWw7CisgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqZ2V0UGxheWVyTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXJNZXNzYWdlOwogICAgIH0KIAogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflBhcmNlbFdyYXBwZXIoKSB7Ci0gICAgICAgIGlmIChtUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtUGFyY2VsOworICAgIHZpcnR1YWwgflBsYXllck1lc3NhZ2VXcmFwcGVyKCkgeworICAgICAgICBpZiAobVBsYXllck1lc3NhZ2UgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVsZXRlIG1QbGF5ZXJNZXNzYWdlOwogICAgICAgICB9CiAgICAgfQogCiBwcml2YXRlOgotICAgIFBhcmNlbFdyYXBwZXIoKQotICAgICAgICA6IG1QYXJjZWwoTlVMTCkgeyB9CisgICAgUGxheWVyTWVzc2FnZVdyYXBwZXIoKQorICAgICAgICA6IG1QbGF5ZXJNZXNzYWdlKE5VTEwpIHsgfQogCi0gICAgc3RhdHVzX3QgYXBwZW5kRnJvbShjb25zdCBQYXJjZWwgKnApIHsKLSAgICAgICAgaWYgKG1QYXJjZWwgPT0gTlVMTCkgewotICAgICAgICAgICAgbVBhcmNlbCA9IG5ldyBQYXJjZWw7CisgICAgdm9pZCBjb3B5RnJvbShjb25zdCBQbGF5ZXJNZXNzYWdlICpwKSB7CisgICAgICAgIGlmIChtUGxheWVyTWVzc2FnZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBtUGxheWVyTWVzc2FnZSA9IG5ldyBQbGF5ZXJNZXNzYWdlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtUGFyY2VsLT5hcHBlbmRGcm9tKHAsIDAgLyogc3RhcnQgKi8sIHAtPmRhdGFTaXplKCkpOworICAgICAgICBtUGxheWVyTWVzc2FnZS0+Q29weUZyb20oKnApOwogICAgIH0KIAotICAgIFBhcmNlbCAqbVBhcmNlbDsKKyAgICBQbGF5ZXJNZXNzYWdlICptUGxheWVyTWVzc2FnZTsKIH07CiAKIC8vIGtleSBmb3IgbWVkaWEgc3RhdGlzdGljcwotc3RhdGljIGNvbnN0IGNoYXIgKmtLZXlQbGF5ZXIgPSAibnVwbGF5ZXIiOworc3RhdGljIGNvbnN0IGNoYXIgKmtLZXlQbGF5ZXIgPSAibnVwbGF5ZXIyIjsKIC8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCiAgICAgLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCiAgICAgLy8gaW4gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjIuamF2YQpAQCAtOTAsNiArOTIsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5oZWlnaHQiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXNEcm9wcGVkID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckZyYW1lUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZwcyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFNaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuYXVkaW8ubWltZSI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFDb2RlYyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLmNvZGVjIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRHVyYXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kdXJhdGlvbk1zIjsKQEAgLTEwNSw4ICsxMDgsMTAgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUmVidWZmZXJpbmdDb3VudCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVycyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclJlYnVmZmVyaW5nQXRFeGl0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJFeGl0IjsKIAorc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJWZXJzaW9uID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIudmVyc2lvbiI7CiAKLU51UGxheWVyMkRyaXZlcjo6TnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCwgdWlkX3QgdWlkKQorCitOdVBsYXllcjJEcml2ZXI6Ok51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQpCiAgICAgOiBtU3RhdGUoU1RBVEVfSURMRSksCiAgICAgICBtQXN5bmNSZXN1bHQoVU5LTk9XTl9FUlJPUiksCiAgICAgICBtU3JjSWQoMCksCkBAIC0xMjEsOSArMTI2LDEwIEBACiAgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1OdVBsYXllcjJMb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbU1lZGlhQ2xvY2sobmV3IE1lZGlhQ2xvY2spLAotICAgICAgbVBsYXllcihuZXcgTnVQbGF5ZXIyKHBpZCwgdWlkLCBtTWVkaWFDbG9jaykpLAorICAgICAgbVBsYXllcihuZXcgTnVQbGF5ZXIyKHBpZCwgdWlkLCBtTWVkaWFDbG9jaywgY29udGV4dCkpLAogICAgICAgbVBsYXllckZsYWdzKDApLAotICAgICAgbUFuYWx5dGljc0l0ZW0oTlVMTCksCisgICAgICBtTWV0cmljc0hhbmRsZSgwKSwKKyAgICAgIG1QbGF5ZXJWZXJzaW9uKDApLAogICAgICAgbUNsaWVudFVpZCh1aWQpLAogICAgICAgbUF0RU9TKGZhbHNlKSwKICAgICAgIG1Mb29waW5nKGZhbHNlKSwKQEAgLTEzNCw5ICsxNDAsMTMgQEAKIAogICAgIG1NZWRpYUNsb2NrLT5pbml0KCk7CiAKLSAgICAvLyBzZXQgdXAgYW4gYW5hbHl0aWNzIHJlY29yZAotICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrS2V5UGxheWVyKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0VWlkKG1DbGllbnRVaWQpOworICAgIC8vIFhYWDogd2hhdCB2ZXJzaW9uIGFyZSB3ZT8KKyAgICAvLyBJZGVhbGx5LCB0aGlzIHRpY2tzIHdpdGggdGhlIGFwayB2ZXJzaW9uIGluZm8gZm9yIHRoZSBBUEVYIHBhY2thZ2luZworCisgICAgLy8gc2V0IHVwIG1lZGlhIG1ldHJpY3MgcmVjb3JkCisgICAgbU1ldHJpY3NIYW5kbGUgPSBtZWRpYW1ldHJpY3NfY3JlYXRlKGtLZXlQbGF5ZXIpOworICAgIG1lZGlhbWV0cmljc19zZXRVaWQobU1ldHJpY3NIYW5kbGUsIG1DbGllbnRVaWQpOworICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga1BsYXllclZlcnNpb24sIG1QbGF5ZXJWZXJzaW9uKTsKIAogICAgIG1OdVBsYXllcjJMb29wZXItPnN0YXJ0KAogICAgICAgICAgICAgZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwpAQCAtMTU3LDEwICsxNjcsNyBAQAogICAgIHVwZGF0ZU1ldHJpY3MoImRlc3RydWN0b3IiKTsKICAgICBsb2dNZXRyaWNzKCJkZXN0cnVjdG9yIik7CiAKLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW07Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtID0gTlVMTDsKLSAgICB9CisgICAgbWVkaWFtZXRyaWNzX2RlbGV0ZShtTWV0cmljc0hhbmRsZSk7CiB9CiAKIHN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6aW5pdENoZWNrKCkgewpAQCAtMjczLDEzICsyODAsNiBAQAogICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUFJFUEFSSU5HOwogICAgICAgICAgICAgbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgcmVhbGx5IGp1c3QgcGF1c2VkLiBoYW5kbGUgYXMgc2VlayB0byBzdGFydAotICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc7Ci0gICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8sCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfTsKQEAgLTI5NCw3ICsyOTQsNiBAQAogc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzdGFydF9sKCkgewogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgogICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgogICAgICAgICB7CiAgICAgICAgICAgICBtUGxheWVyLT5zdGFydCgpOwpAQCAtMzA0LDcgKzMwMyw3IEBACiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKG1BdEVPUykgewotICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnJld2luZCgpOwogICAgICAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1Qb3NpdGlvblVzID0gLTE7CiAgICAgICAgICAgICB9CkBAIC0zMjAsMzQgKzMxOSw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnN0b3AoKSB7Ci0gICAgQUxPR0QoInN0b3AoJXApIiwgdGhpcyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKLSAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLQotICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICAvL25vdGlmeUxpc3RlbmVyX2woTUVESUEyX1NUT1BQRUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQogc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwYXVzZSgpIHsKICAgICBBTE9HRCgicGF1c2UoJXApIiwgdGhpcyk7CiAgICAgLy8gVGhlIE51UGxheWVyUmVuZGVyZXIgbWF5IGdldCBmbHVzaGVkIGlmIHBhdXNlIGZvciBsb25nIGVub3VnaCwgZS5nLiB0aGUgcGF1c2UgdGltZW91dCB0ZWFyCkBAIC0zNjEsOSArMzMyLDkgQEAKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgogICAgICAgICAgICAgcmV0dXJuIE9LOwogCisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKICAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CkBAIC0zODYsMTUgKzM1Nyw2IEBACiAgICAgICAgIC8vIHRyeSB0byB1cGRhdGUgcG9zaXRpb24KICAgICAgICAgaW50NjRfdCB1bnVzZWQ7CiAgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbigmdW51c2VkKTsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZiAmJiBtU3RhdGUgPT0gU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICB9IGVsc2UgaWYgKHJhdGUubVNwZWVkICE9IDAuZgotICAgICAgICAgICAgICAgICYmIChtU3RhdGUgPT0gU1RBVEVfUEFVU0VECi0gICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRAotICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gU1RBVEVfUFJFUEFSRUQpKSB7Ci0gICAgICAgICAgICBlcnIgPSBzdGFydF9sKCk7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTQxOSw3ICszODEsNiBAQAogCiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKICAgICAgICAgewpAQCAtNDk3LDE1ICs0NTgsMTUgQEAKIAogICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllclZNaW1lLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyVk1pbWUsIG1pbWUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllclZDb2RlYywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJWQ29kZWMsIG5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RhdHMtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJXaWR0aCwgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckhlaWdodCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyV2lkdGgsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVySGVpZ2h0LCBoZWlnaHQpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludDY0X3QgbnVtRnJhbWVzVG90YWwgPSAwOwpAQCAtNTEzLDE0ICs0NzQsMTggQEAKICAgICAgICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtdG90YWwiLCAmbnVtRnJhbWVzVG90YWwpOwogICAgICAgICAgICAgICAgIHN0YXRzLT5maW5kSW50NjQoImZyYW1lcy1kcm9wcGVkLW91dHB1dCIsICZudW1GcmFtZXNEcm9wcGVkKTsKIAotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRnJhbWVzLCBudW1GcmFtZXNUb3RhbCk7Ci0gICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXNEcm9wcGVkLCBudW1GcmFtZXNEcm9wcGVkKTsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJGcmFtZXMsIG51bUZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJGcmFtZXNEcm9wcGVkLCBudW1GcmFtZXNEcm9wcGVkKTsKIAorICAgICAgICAgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRzLT5maW5kRmxvYXQoImZyYW1lLXJhdGUtb3V0cHV0IiwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRnJhbWVSYXRlLCBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lLnN0YXJ0c1dpdGgoImF1ZGlvLyIpKSB7Ci0gICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckFNaW1lLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyQU1pbWUsIG1pbWUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckFDb2RlYywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJBQ29kZWMsIG5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MzEsMTcgKzQ5NiwxNyBAQAogICAgIC8vIGdldER1cmF0aW9uKCkgdXNlcyBtTG9jayBmb3IgbXV0ZXggLS0gY2FyZWZ1bCB3aGVyZSB3ZSB1c2UgaXQuCiAgICAgaW50NjRfdCBkdXJhdGlvbl9tcyA9IC0xOwogICAgIGdldER1cmF0aW9uKCZkdXJhdGlvbl9tcyk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJEdXJhdGlvbiwgZHVyYXRpb25fbXMpOworICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga1BsYXllckR1cmF0aW9uLCBkdXJhdGlvbl9tcyk7CiAKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclBsYXlpbmcsIChtUGxheWluZ1RpbWVVcys1MDApLzEwMDAgKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJQbGF5aW5nLCAobVBsYXlpbmdUaW1lVXMrNTAwKS8xMDAwICk7CiAKICAgICBpZiAobVJlYnVmZmVyaW5nRXZlbnRzICE9IDApIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJSZWJ1ZmZlcmluZywgKG1SZWJ1ZmZlcmluZ1RpbWVVcys1MDApLzEwMDAgKTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0NvdW50LCBtUmVidWZmZXJpbmdFdmVudHMpOwotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQXRFeGl0LCBtUmVidWZmZXJpbmdBdEV4aXQpOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJSZWJ1ZmZlcmluZywgKG1SZWJ1ZmZlcmluZ1RpbWVVcys1MDApLzEwMDAgKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyUmVidWZmZXJpbmdDb3VudCwgbVJlYnVmZmVyaW5nRXZlbnRzKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyUmVidWZmZXJpbmdBdEV4aXQsIG1SZWJ1ZmZlcmluZ0F0RXhpdCk7CiAgICAgfQogCi0gICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckRhdGFTb3VyY2VUeXBlLCBtUGxheWVyLT5nZXREYXRhU291cmNlVHlwZSgpKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga1BsYXllckRhdGFTb3VyY2VUeXBlLCBtUGxheWVyLT5nZXREYXRhU291cmNlVHlwZSgpKTsKIH0KIAogCkBAIC01NTEsNyArNTE2LDcgQEAKICAgICB9CiAgICAgQUxPR1YoImxvZ01ldHJpY3MoJXApIGZyb20gJXMgYXQgc3RhdGUgJWQiLCB0aGlzLCB3aGVyZSwgbVN0YXRlKTsKIAotICAgIGlmIChtQW5hbHl0aWNzSXRlbSA9PSBOVUxMIHx8IG1BbmFseXRpY3NJdGVtLT5pc0VuYWJsZWQoKSA9PSBmYWxzZSkgeworICAgIGlmIChtTWV0cmljc0hhbmRsZSA9PSAwIHx8IG1lZGlhbWV0cmljc19pc0VuYWJsZWQoKSA9PSBmYWxzZSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC01NjAsMTYgKzUyNSwxMyBAQAogICAgIC8vIGFuZCB0aGF0IGFsd2F5cyBpbmplY3RzIDMgZmllbGRzIChkdXJhdGlvbiwgcGxheWluZyB0aW1lLCBhbmQKICAgICAvLyBkYXRhc291cmNlKSBpbnRvIHRoZSByZWNvcmQuCiAgICAgLy8gU28gdGhlIGNhbm9uaWNhbCAiZW1wdHkiIHJlY29yZCBoYXMgMyBlbGVtZW50cyBpbiBpdC4KLSAgICBpZiAobUFuYWx5dGljc0l0ZW0tPmNvdW50KCkgPiAzKSB7Ci0KLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKLQorICAgIGlmIChtZWRpYW1ldHJpY3NfY291bnQobU1ldHJpY3NIYW5kbGUpID4gMykgeworICAgICAgICBtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChtTWV0cmljc0hhbmRsZSk7CiAgICAgICAgIC8vIHJlLWluaXQgaW4gY2FzZSB3ZSBwcmVwYXJlKCkgYW5kIHN0YXJ0KCkgYWdhaW4uCi0gICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbSA7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrS2V5UGxheWVyKTsKLSAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7Ci0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0VWlkKG1DbGllbnRVaWQpOwotICAgICAgICB9CisgICAgICAgIG1lZGlhbWV0cmljc19kZWxldGUobU1ldHJpY3NIYW5kbGUpOworICAgICAgICBtTWV0cmljc0hhbmRsZSA9IG1lZGlhbWV0cmljc19jcmVhdGUoa0tleVBsYXllcik7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRVaWQobU1ldHJpY3NIYW5kbGUsIG1DbGllbnRVaWQpOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJWZXJzaW9uLCBtUGxheWVyVmVyc2lvbik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoImRpZCBub3QgaGF2ZSBhbnl0aGluZyB0byByZWNvcmQiKTsKICAgICB9CkBAIC02MDEsMTAgKzU2Myw2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX1NUT1BQRUQpIHsKLSAgICAgICAgLy8gbm90aWZ5TGlzdGVuZXJfbChNRURJQTJfU1RPUFBFRCk7Ci0gICAgfQotCiAgICAgbVN0YXRlID0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M7CiAgICAgbVBsYXllci0+cmVzZXRBc3luYygpOwogCkBAIC02MzMsNTAgKzU5MSw1MSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjppbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSB7Ci0gICAgaWYgKHJlcGx5ID09IE5VTEwpIHsKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6aW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlc3BvbnNlKSB7CisgICAgaWYgKHJlc3BvbnNlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoInJlcGx5IGlzIGEgTlVMTCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaW50MzJfdCBtZXRob2RJZDsKLSAgICBzdGF0dXNfdCByZXQgPSByZXF1ZXN0LnJlYWRJbnQzMigmbWV0aG9kSWQpOwotICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZCB0byBpbnZva2UsIGVyciglZCkiLCByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KKyAgICBSZXBlYXRlZFB0ckZpZWxkPGNvbnN0IFZhbHVlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXF1ZXN0LnZhbHVlcygpLmNiZWdpbigpOworICAgIGludDMyX3QgbWV0aG9kSWQgPSAoaXQrKyktPmludDMyX3ZhbHVlKCk7CiAKICAgICBzd2l0Y2ggKG1ldGhvZElkKSB7CiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfU0VUX1ZJREVPX1NDQUxJTkdfTU9ERToKICAgICAgICAgewotICAgICAgICAgICAgaW50IG1vZGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IG1vZGUgPSAoaXQrKyktPmludDMyX3ZhbHVlKCk7CiAgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2V0VmlkZW9TY2FsaW5nTW9kZShtb2RlKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1RSQUNLX0lORk86CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRUcmFja0luZm8ocmVwbHkpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRUcmFja0luZm8oc3JjSWQsIHJlc3BvbnNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfU0VMRUNUX1RSQUNLOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkID0gKGl0KyspLT5pbnQ2NF92YWx1ZSgpOworICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSAoaXQrKyktPmludDMyX3ZhbHVlKCk7CiAgICAgICAgICAgICBpbnQ2NF90IG1zZWMgPSAwOwogICAgICAgICAgICAgLy8gZ2V0Q3VycmVudFBvc2l0aW9uIHNob3VsZCBhbHdheXMgcmV0dXJuIE9LCiAgICAgICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oJm1zZWMpOwotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHRydWUgLyogc2VsZWN0ICovLCBtc2VjICogMTAwMExMKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayhzcmNJZCwgdHJhY2tJbmRleCwgdHJ1ZSAvKiBzZWxlY3QgKi8sIG1zZWMgKiAxMDAwTEwpOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9VTlNFTEVDVF9UUkFDSzoKICAgICAgICAgewotICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSByZXF1ZXN0LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIGZhbHNlIC8qIHNlbGVjdCAqLywgMHhkZWFkYmVlZiAvKiBub3QgdXNlZCAqLyk7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkID0gKGl0KyspLT5pbnQ2NF92YWx1ZSgpOworICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSAoaXQrKyktPmludDMyX3ZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2soCisgICAgICAgICAgICAgICAgICAgIHNyY0lkLCB0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8sIDB4ZGVhZGJlZWYgLyogbm90IHVzZWQgKi8pOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9HRVRfU0VMRUNURURfVFJBQ0s6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IHJlcXVlc3QucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlLCByZXBseSk7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkID0gKGl0KyspLT5pbnQ2NF92YWx1ZSgpOworICAgICAgICAgICAgaW50MzJfdCB0eXBlID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2soc3JjSWQsIHR5cGUsIHJlc3BvbnNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC02OTYsNDQgKzY1NSwxNiBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgewotCi0gICAgaWYgKGtleSA9PSBGT1VSQ0MoJ20nLCd0JywncicsJ1gnKSkgewotICAgICAgICAvLyBtdHJYIC0tIGEgcGxheSBvbiAnbWV0cmljcycgKG5vdCBtYXRyaXgpCi0gICAgICAgIC8vIGdhdGhlciBjdXJyZW50IGluZm8gYWxsIHRvZ2V0aGVyLCBwYXJjZWwgaXQsIGFuZCBzZW5kIGl0IGJhY2sKLSAgICAgICAgdXBkYXRlTWV0cmljcygiYXBpIik7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQorc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSBfX3VudXNlZCwgUGFyY2VsICpyZXBseSBfX3VudXNlZCkgewogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRNZXRhZGF0YSgKLSAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIC8qIGlkcyAqLywgUGFyY2VsICpyZWNvcmRzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHVzaW5nIG1lZGlhOjpNZXRhZGF0YTsKLQotICAgIE1ldGFkYXRhIG1ldGEocmVjb3Jkcyk7Ci0KLSAgICBtZXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1BhdXNlQXZhaWxhYmxlLAotICAgICAgICAgICAgbVBsYXllckZsYWdzICYgTnVQbGF5ZXIyOjpTb3VyY2U6OkZMQUdfQ0FOX1BBVVNFKTsKLQotICAgIG1ldGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0JhY2t3YXJkQXZhaWxhYmxlLAotICAgICAgICAgICAgbVBsYXllckZsYWdzICYgTnVQbGF5ZXIyOjpTb3VyY2U6OkZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQpOwotCi0gICAgbWV0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrRm9yd2FyZEF2YWlsYWJsZSwKLSAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLX0ZPUldBUkQpOwotCi0gICAgbWV0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQXZhaWxhYmxlLAotICAgICAgICAgICAgbVBsYXllckZsYWdzICYgTnVQbGF5ZXIyOjpTb3VyY2U6OkZMQUdfQ0FOX1NFRUspOwotCi0gICAgcmV0dXJuIE9LOworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRNZXRyaWNzKGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKSB7CisgICAgdXBkYXRlTWV0cmljcygiYXBpIik7CisgICAgaWYgKG1lZGlhbWV0cmljc19nZXRBdHRyaWJ1dGVzKG1NZXRyaWNzSGFuZGxlLCBidWZmZXIsIGxlbmd0aCkpCisgICAgICAgIHJldHVybiBPSzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CiB9CiAKIHZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlSZXNldENvbXBsZXRlKGludDY0X3QgLyogc3JjSWQgKi8pIHsKQEAgLTc4MCwyMCArNzExLDcgQEAKICAgICBBTE9HVigibm90aWZ5U2Vla0NvbXBsZXRlKCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbVNlZWtJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgbm90aWZ5U2Vla0NvbXBsZXRlX2woc3JjSWQpOwotfQotCi12b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlX2woaW50NjRfdCBzcmNJZCkgewotICAgIGJvb2wgd2FzU2Vla2luZyA9IHRydWU7Ci0gICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcpIHsKLSAgICAgICAgd2FzU2Vla2luZyA9IGZhbHNlOwotICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDsKLSAgICAgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLSAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgIC8vIG5vIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVyCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgd2FzU2Vla2luZyA/IE1FRElBMl9TRUVLX0NPTVBMRVRFIDogTUVESUEyX1BSRVBBUkVEKTsKKyAgICBub3RpZnlMaXN0ZW5lcl9sKHNyY0lkLCBNRURJQTJfU0VFS19DT01QTEVURSk7CiB9CiAKIHN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6ZHVtcCgKQEAgLTg4NCwxMiArODAyLDEyIEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibWVzc2FnZUlkIiwgJm1zZ0lkKSk7CiAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZXh0MSIsICZleHQxKTsKICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJleHQyIiwgJmV4dDIpOwotICAgICAgICAgICAgc3A8UGFyY2VsV3JhcHBlcj4gaW47CisgICAgICAgICAgICBzcDxQbGF5ZXJNZXNzYWdlV3JhcHBlcj4gaW47CiAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICBpZiAobXNnLT5maW5kT2JqZWN0KCJwYXJjZWwiLCAmb2JqKSAmJiBvYmogIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluID0gc3RhdGljX2Nhc3Q8UGFyY2VsV3JhcHBlciAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgib2JqIiwgJm9iaikgJiYgb2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbiA9IHN0YXRpY19jYXN0PFBsYXllck1lc3NhZ2VXcmFwcGVyICo+KG9iai5nZXQoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZW5kRXZlbnQoc3JjSWQsIG1zZ0lkLCBleHQxLCBleHQyLCAoaW4gPT0gTlVMTCA/IE5VTEwgOiBpbi0+Z2V0UGFyY2VsKCkpKTsKKyAgICAgICAgICAgIHNlbmRFdmVudChzcmNJZCwgbXNnSWQsIGV4dDEsIGV4dDIsIChpbiA9PSBOVUxMID8gTlVMTCA6IGluLT5nZXRQbGF5ZXJNZXNzYWdlKCkpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CkBAIC04OTgsMTYgKzgxNiwxNiBAQAogfQogCiB2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5TGlzdGVuZXIoCi0gICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgeworICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBub3RpZnlMaXN0ZW5lcl9sKHNyY0lkLCBtc2csIGV4dDEsIGV4dDIsIGluKTsKIH0KIAogdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyX2woCi0gICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgeworICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluKSB7CiAgICAgQUxPR0QoIm5vdGlmeUxpc3RlbmVyX2woJXApLCAoJWxsZCwgJWQsICVkLCAlZCwgJWQpLCBsb29wIHNldHRpbmcoJWQsICVkKSIsCiAgICAgICAgICAgICB0aGlzLCAobG9uZyBsb25nKXNyY0lkLCBtc2csIGV4dDEsIGV4dDIsCi0gICAgICAgICAgICAoaW4gPT0gTlVMTCA/IC0xIDogKGludClpbi0+ZGF0YVNpemUoKSksIG1BdXRvTG9vcCwgbUxvb3BpbmcpOworICAgICAgICAgICAgKGluID09IE5VTEwgPyAtMSA6IChpbnQpaW4tPkJ5dGVTaXplKCkpLCBtQXV0b0xvb3AsIG1Mb29waW5nKTsKICAgICBpZiAoc3JjSWQgPT0gbVNyY0lkKSB7CiAgICAgICAgIHN3aXRjaCAobXNnKSB7CiAgICAgICAgICAgICBjYXNlIE1FRElBMl9QTEFZQkFDS19DT01QTEVURToKQEAgLTkyNCwxMyArODQyLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKG1Mb29waW5nIHx8IG1BdXRvTG9vcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVuZGVyZXIgaGFzIHN0b3BwZWQgdGhlIHNpbmsgYXQgdGhlIGVuZCBpbiBvcmRlciB0byBwbGF5IG91dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGxpdHRsZSBiaXQgb2YgYXVkaW8uIEluIGxvb3BpbmcgbW9kZSwgd2UgbmVlZCB0byByZXN0YXJ0IGl0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZW5kIGNvbXBsZXRpb24gZXZlbnQgd2hlbiBsb29waW5nCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnlMaXN0ZW5lciwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIm1lc3NhZ2VJZCIsIE1FRElBMl9JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImV4dDEiLCBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9SRVBFQVQpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmRlYnVnLnNmLnN0YXRzIiwgZmFsc2UpKSB7CkBAIC05NDksMTEgKzg3MiwxMSBAQAogICAgICAgICAgICAgICAgIC8vIGV4dDEgaXMgb3VyIHByaW1hcnkgJ2Vycm9yIHR5cGUnIHZhbHVlLiBPbmx5IGFkZCBleHQyIHdoZW4gbm9uLXplcm8uCiAgICAgICAgICAgICAgICAgLy8gW3Rlc3QgYWdhaW5zdCBtc2cgaXMgZHVlIHRvIGZhbGwgdGhyb3VnaCBmcm9tIHByZXZpb3VzIHN3aXRjaCB2YWx1ZV0KICAgICAgICAgICAgICAgICBpZiAobXNnID09IE1FRElBMl9FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckVycm9yLCBleHQxKTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRXJyb3IsIGV4dDEpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXh0MiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckVycm9yQ29kZSwgZXh0Mik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJFcnJvckNvZGUsIGV4dDIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga1BsYXllckVycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1BdEVPUyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC05NjksNyArODkyLDcgQEAKICAgICBub3RpZnktPnNldEludDMyKCJtZXNzYWdlSWQiLCBtc2cpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImV4dDEiLCBleHQxKTsKICAgICBub3RpZnktPnNldEludDMyKCJleHQyIiwgZXh0Mik7Ci0gICAgbm90aWZ5LT5zZXRPYmplY3QoInBhcmNlbCIsIFBhcmNlbFdyYXBwZXI6OkNyZWF0ZShpbikpOworICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJvYmoiLCBQbGF5ZXJNZXNzYWdlV3JhcHBlcjo6Q3JlYXRlKChQbGF5ZXJNZXNzYWdlKilpbikpOwogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCkBAIC0xMDM2LDI0ICs5NTksMjUgQEAKIH0KIAogLy8gTW9kdWxhciBEUk0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cHJlcGFyZURybSgKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpCiB7CiAgICAgQUxPR1YoInByZXBhcmVEcm0oJXApIHN0YXRlOiAlZCIsIHRoaXMsIG1TdGF0ZSk7CiAKICAgICAvLyBsZWF2aW5nIHRoZSBzdGF0ZSB2ZXJpZmljYXRpb24gZm9yIG1lZGlhcGxheWVyLmNwcAotICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnByZXBhcmVEcm0odXVpZCwgZHJtU2Vzc2lvbklkKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHNyY0lkLCB1dWlkLCBkcm1TZXNzaW9uSWQpOwogCiAgICAgQUxPR1YoInByZXBhcmVEcm0gcmV0OiAlZCIsIHJldCk7CiAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnJlbGVhc2VEcm0oKQorc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpyZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpCiB7CiAgICAgQUxPR1YoInJlbGVhc2VEcm0oJXApIHN0YXRlOiAlZCIsIHRoaXMsIG1TdGF0ZSk7CiAKICAgICAvLyBsZWF2aW5nIHRoZSBzdGF0ZSB2ZXJpZmljYXRpb24gZm9yIG1lZGlhcGxheWVyLmNwcAotICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5yZWxlYXNlRHJtKHNyY0lkKTsKIAogICAgIEFMT0dWKCJyZWxlYXNlRHJtIHJldDogJWQiLCByZXQpOwogCkBAIC0xMDczLDkgKzk5Nyw2IEBACiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzogcnZhbCA9ICJSVU5OSU5HIjsgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOiBydmFsID0gIlBBVVNFRCI7IGJyZWFrOwogICAgICAgICBjYXNlIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOiBydmFsID0gIlJFU0VUX0lOX1BST0dSRVNTIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDogcnZhbCA9ICJTVE9QUEVEIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOiBydmFsID0gIlNUT1BQRURfQU5EX1BSRVBBUklORyI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOiBydmFsID0gIlNUT1BQRURfQU5EX1BSRVBBUkVEIjsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAvLyB5ZXMsIHRoaXMgYnVmZmVyIGlzIHNoYXJlZCBhbmQgdnVsbmVyYWJsZSB0byByYWNlcwogICAgICAgICAgICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgc3RhdGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKaW5kZXggNGRhMjU2Ni4uYzk3ZTI0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oCkBAIC0xNiw4ICsxNiw5IEBACiAKICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3MuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yNiw3ICsyNyw3IEBACiBzdHJ1Y3QgTnVQbGF5ZXIyOwogCiBzdHJ1Y3QgTnVQbGF5ZXIyRHJpdmVyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZSB7Ci0gICAgZXhwbGljaXQgTnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKKyAgICBleHBsaWNpdCBOdVBsYXllcjJEcml2ZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgb3ZlcnJpZGU7CiAKQEAgLTQwLDMxICs0MSwyOSBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMsIGZsb2F0ICp2aWRlb0Zwcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMsIGZsb2F0ICp2aWRlb0Zwcykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCi0gICAgICAgICAgICBpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKTsKKyAgICAgICAgICAgIGludDY0X3QgbXNlYywKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9vcGluZyhpbnQgbG9vcCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luayk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlc3BvbnNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3MoY2hhciAqKmJ1Ziwgc2l6ZV90ICpsZW5ndGgpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YSgKLSAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3Jkcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CiAKQEAgLTc3LDE0ICs3NiwxNCBAQAogICAgIHZvaWQgbm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKGludDY0X3Qgc3JjSWQsIGludDY0X3QgdGltZVVzKTsKICAgICB2b2lkIG5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQoaW50NjRfdCBzcmNJZCwgYm9vbCBzdGF0dXMpOwogICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlKGludDY0X3Qgc3JjSWQpOwotICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlX2woaW50NjRfdCBzcmNJZCk7CiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluID0gTlVMTCk7CiAgICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQoaW50NjRfdCBzcmNJZCwgdWludDMyX3QgZmxhZ3MpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybSgKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OdVBsYXllcjJEcml2ZXIoKTsKQEAgLTk5LDkgKzk4LDYgQEAKICAgICAgICAgU1RBVEVfUlVOTklORywKICAgICAgICAgU1RBVEVfUEFVU0VELAogICAgICAgICBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUywKLSAgICAgICAgU1RBVEVfU1RPUFBFRCwgICAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRAotICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcsICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2Vla2luZwotICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCwgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2VlayBjb21wbGV0ZQogICAgIH07CiAKICAgICBzdGQ6OnN0cmluZyBzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSk7CkBAIC0xMzcsNyArMTMzLDggQEAKICAgICBzcDxBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAgICAgdWludDMyX3QgbVBsYXllckZsYWdzOwogCi0gICAgTWVkaWFBbmFseXRpY3NJdGVtICptQW5hbHl0aWNzSXRlbTsKKyAgICBtZWRpYW1ldHJpY3NfaGFuZGxlX3QgbU1ldHJpY3NIYW5kbGU7CisgICAgaW50NjRfdCBtUGxheWVyVmVyc2lvbjsKICAgICB1aWRfdCBtQ2xpZW50VWlkOwogCiAgICAgYm9vbCBtQXRFT1M7CkBAIC0xNDksNyArMTQ2LDcgQEAKIAogICAgIHN0YXR1c190IHN0YXJ0X2woKTsKICAgICB2b2lkIG5vdGlmeUxpc3RlbmVyX2woaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4gPSBOVUxMKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyMkRyaXZlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCmluZGV4IDBlMDk2YjAuLmY0MWE0MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAKQEAgLTEzMyw5ICsxMzMsOCBAQAogICAgIHJldHVybiBkcm1JbmZvQnVmZmVyOwogfQogCi1zcDxBQnVmZmVyPiBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqcHNzaEluZm8pCitzdGF0dXNfdCBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqcHNzaEluZm8sIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykKIHsKLQogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBwc3NoLCBkcm1JbmZvOwogCiAgICAgLy8gMCkgR2VuZXJhdGUgUFNTSCBieXRlcwpAQCAtMTU0LDIyICsxNTMsMjAgQEAKICAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgocHNzaFB0ciwgcHNzaFNpemUpLnN0cmluZygpKTsKIAogICAgIC8vIDEpIFdyaXRlIFBTU0ggYnl0ZXMKLSAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmcHNzaFNpemUpLCBzaXplb2YocHNzaFNpemUpKTsKLSAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoLnN0cigpLmNfc3RyKCkpLCBwc3NoU2l6ZSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoLnN0cigpLmNfc3RyKCkpLCBwc3NoU2l6ZSk7CiAKICAgICAvLyAyKSBXcml0ZSBzdXBwb3J0ZWREUk1zCiAgICAgdWludDMyX3QgbnVtZW50cmllcyA9IHBzc2hJbmZvLT5udW1lbnRyaWVzOwotICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZudW1lbnRyaWVzKSwgc2l6ZW9mKG51bWVudHJpZXMpKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKG51bWVudHJpZXMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtZW50cmllczsgaSsrKSB7CiAgICAgICAgIFBzc2hFbnRyeSAqZW50cnkgPSAmcHNzaEluZm8tPmVudHJpZXNbaV07Ci0gICAgICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZlbnRyeS0+dXVpZCksIHNpemVvZihlbnRyeS0+dXVpZCkpOworICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmZW50cnktPnV1aWQpLCBzaXplb2YoZW50cnktPnV1aWQpKTsKICAgICAgICAgQUxPR1YoInJldHJpZXZlRHJtSW5mbzogTUVESUFfRFJNX0lORk8gIHN1cHBvcnRlZFNjaGVtZVslenVdICVzIiwgaSwKICAgICAgICAgICAgICAgICBEcm1VVUlEOjphcnJheVRvSGV4KChjb25zdCB1aW50OF90KikmZW50cnktPnV1aWQsIHNpemVvZihBTWVkaWFVVUlEKSkuc3RyaW5nKCkpOwogICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZHJtSW5mby5zdHIoKS5jX3N0cigpLCBkcm1JbmZvLnRlbGxwKCkpOwotICAgIGRybUluZm9CdWYtPnNldFJhbmdlKDAsIGRybUluZm8udGVsbHAoKSk7Ci0gICAgcmV0dXJuIGRybUluZm9CdWY7CisgICAgcmV0dXJuIE9LOwogfQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oCmluZGV4IDk5ZDI0MTUuLjk2OGQxYmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaApAQCAtMjMsNiArMjMsMTAgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICAgICBzdHJ1Y3QgRHJtVVVJRCB7CkBAIC04MCw3ICs4NCw3IEBACiAKICAgICBwdWJsaWM6CiAgICAgICAgIHN0YXRpYyBzcDxBQnVmZmVyPiByZXRyaWV2ZURybUluZm8oY29uc3Qgdm9pZCAqcHNzaCwgdWludDMyX3QgcHNzaHNpemUpOwotICAgICAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gcmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICopOworICAgICAgICBzdGF0aWMgc3RhdHVzX3QgcmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICosIFBsYXllck1lc3NhZ2UgKik7CiAKICAgICB9OyAgLy8gTnVQbGF5ZXIyRHJtCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKaW5kZXggM2Q2OTE4OC4uYThjOTkzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KQEAgLTEwNiw2ICsxMDYsNyBAQAogICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmssCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKQogICAgIDogbUF1ZGlvU2luayhzaW5rKSwKICAgICAgIG1Vc2VWaXJ0dWFsQXVkaW9TaW5rKGZhbHNlKSwKQEAgLTEzMSw3ICsxMzIsNyBAQAogICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8oZmFsc2UpLAogICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8oZmFsc2UpLAogICAgICAgbVN5bmNRdWV1ZXMoZmFsc2UpLAotICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtUGF1c2VkKHRydWUpLAogICAgICAgbVBhdXNlRHJhaW5BdWRpb0FsbG93ZWRVcygwKSwKICAgICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkKGZhbHNlKSwKICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQoZmFsc2UpLApAQCAtMTQ3LDEwICsxNDgsOSBAQAogICAgICAgbVRvdGFsQnVmZmVyc1F1ZXVlZCgwKSwKICAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkKDApLAogICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2soZmFsc2UpLAotICAgICAgbVdha2VMb2NrKG5ldyBKV2FrZUxvY2soKSkgeworICAgICAgbVdha2VMb2NrKG5ldyBKV2FrZUxvY2soY29udGV4dCkpIHsKICAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwotICAgIG1QbGF5YmFja1JhdGUgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7Ci0gICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CiB9CiAKIE51UGxheWVyMjo6UmVuZGVyZXI6On5SZW5kZXJlcigpIHsKQEAgLTIwNiwyNiArMjA2LDIwIEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQ29uZmlnUGxheWJhY2soY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUgLyogc2FuaXRpemVkICovKSB7Ci0gICAgaWYgKHJhdGUubVNwZWVkID09IDAuZikgewotICAgICAgICBvblBhdXNlKCk7Ci0gICAgICAgIC8vIGRvbid0IGNhbGwgYXVkaW9zaW5rJ3Mgc2V0UGxheWJhY2tSYXRlIGlmIHBhdXNpbmcsIGFzIHBpdGNoIGRvZXMgbm90Ci0gICAgICAgIC8vIGhhdmUgdG8gY29ycmVzcG9uZCB0byB0aGUgYW55IG5vbi0wIHNwZWVkIChlLmcgb2xkIHNwZWVkKS4gS2VlcAotICAgICAgICAvLyBzZXR0aW5ncyBub25ldGhlbGVzcywgdXNpbmcgdGhlIG9sZCBzcGVlZCwgaW4gY2FzZSBhdWRpb3NpbmsgY2hhbmdlcy4KLSAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgbmV3UmF0ZSA9IHJhdGU7Ci0gICAgICAgIG5ld1JhdGUubVNwZWVkID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwotICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IG5ld1JhdGU7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICBpZiAocmF0ZS5tU3BlZWQgPD0gMC5mKSB7CisgICAgICAgIEFMT0dXKCJwbGF5YmFjayByYXRlIGNhbm5vdCBiZSAlZiIsIHJhdGUubVNwZWVkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMICYmIG1BdWRpb1NpbmstPnJlYWR5KCkpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGdldCBwbGF5YmFjayByYXRlIGZyb20gYXVkaW8gc2luaywgZXJyKCVkKSIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKLSAgICBtUGxheWJhY2tSYXRlID0gcmF0ZS5tU3BlZWQ7Ci0gICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNDcsMTQgKzI0MSwxMiBAQAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5nZXRQbGF5YmFja1JhdGUocmF0ZSk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIGlmICghaXNBdWRpb1BsYXliYWNrUmF0ZUVxdWFsKCpyYXRlLCBtUGxheWJhY2tTZXR0aW5ncykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGluZyBtaXNtYXRjaCBpbiBpbnRlcm5hbC9leHRlcm5hbCBwbGF5YmFjayByYXRlIik7CisgICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3RpbmcgbWlzbWF0Y2ggaW4gaW50ZXJuYWwvZXh0ZXJuYWwgcGxheWJhY2sgcmF0ZSwgJWYgdnMgJWYiLAorICAgICAgICAgICAgICAgICAgICAgIHJhdGUtPm1TcGVlZCwgbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGdldCBwbGF5YmFjayBzZXR0aW5ncyB1c2VkIGJ5IGF1ZGlvc2luaywgYXMgaXQgbWF5IGJlCiAgICAgICAgICAgICAvLyBzbGlnaHRseSBvZmYgZHVlIHRvIGF1ZGlvc2luayBub3QgdGFraW5nIHNtYWxsIGNoYW5nZXMuCiAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9ICpyYXRlOwotICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICByYXRlLT5tU3BlZWQgPSAwLmY7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC01NzYsOCArNTY4LDggQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPQogICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICogbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgKiAxMDAwbGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1JhdGUgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgLz0gbVBsYXliYWNrUmF0ZTsKKyAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID4gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBkZWxheVVzIC89IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBMZXQncyBnaXZlIGl0IG1vcmUgZGF0YSBhZnRlciBhYm91dCBoYWxmIHRoYXQgdGltZQpAQCAtMTQ2Niw3ICsxNDU4LDcgQEAKIAogICAgIGlmIChtSGFzVmlkZW8pIHsKICAgICAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CiAgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE1OTQsNiArMTU4Niw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZVZpZGVvOwogICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8gPSBmYWxzZTsKKyAgICAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBzeW5jaW5nIHRoZSBxdWV1ZXMsIGkuZS4gZHJvcHBpbmcgYXVkaW8gd2hpbGUKQEAgLTE3OTQsNyArMTc4Nyw3IEBACiAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpOwogICAgICAgICB9CiAKLSAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogCiAgICAgICAgIGlmICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgewogICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CkBAIC0xODA4LDcgKzE4MDEsNyBAQAogCiB2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7CiAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyMigpOwogICAgIH0KICAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoZnBzKTsKIH0KQEAgLTE4NzgsNiArMTg3MSw3IEBACiAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpIHsKICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb2ZmbG9hZE9ubHkoJWQpIG9mZmxvYWRpbmdBdWRpbyglZCkiLAogICAgICAgICAgICAgb2ZmbG9hZE9ubHksIG9mZmxvYWRpbmdBdWRpbygpKTsKKwogICAgIGJvb2wgYXVkaW9TaW5rQ2hhbmdlZCA9IGZhbHNlOwogCiAgICAgaW50MzJfdCBudW1DaGFubmVsczsKQEAgLTE5NTQsNyArMTk0OCw2IEBACiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAogICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXIyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClvZmZsb2FkRmxhZ3MsCkBAIC0yMDI1LDEzICsyMDE4LDYgQEAKICAgICAgICAgY29uc3QgdWludDMyX3QgZnJhbWVDb3VudCA9CiAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogZ2V0QXVkaW9TaW5rUGNtTXNTZXR0aW5nKCkgLyAxMDAwOwogCi0gICAgICAgIC8vIFRoZSBkb05vdFJlY29ubmVjdCBtZWFucyBBdWRpb1Npbmsgd2lsbCBzaWduYWwgYmFjayBhbmQgbGV0IE51UGxheWVyMiB0byByZS1jb25zdHJ1Y3QKLSAgICAgICAgLy8gQXVkaW9TaW5rLiBXZSBkb24ndCB3YW50IHRoaXMgd2hlbiB0aGVyZSdzIHZpZGVvIGJlY2F1c2UgaXQgd2lsbCBjYXVzZSBhIHZpZGVvIHNlZWsgdG8KLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIEkgZnJhbWUuIEJ1dCB3ZSBkbyB3YW50IHRoaXMgd2hlbiB0aGVyZSdzIG9ubHkgYXVkaW8gYmVjYXVzZSBpdCB3aWxsIGdpdmUKLSAgICAgICAgLy8gTnVQbGF5ZXIyIGEgY2hhbmNlIHRvIHN3aXRjaCBmcm9tIG5vbi1vZmZsb2FkIG1vZGUgdG8gb2ZmbG9hZCBtb2RlLgotICAgICAgICAvLyBTbyB3ZSBvbmx5IHNldCBkb05vdFJlY29ubmVjdCB3aGVuIHRoZXJlJ3Mgbm8gdmlkZW8uCi0gICAgICAgIGNvbnN0IGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSAhaGFzVmlkZW87Ci0KICAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIHNldCBvdXIgcGxheWJhY2sgc2V0dGluZ3MgaWYgdGhlIHNpbmsgaXMgY2xvc2VkLgogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncykgIT0gT0ssCiAgICAgICAgICAgICAgICAgIm9uT3BlbkF1ZGlvU2luazogY2FuJ3Qgc2V0IHBsYXliYWNrIHJhdGUgb24gY2xvc2VkIHNpbmsiKTsKQEAgLTIwNDAsMTIgKzIwMjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyB0aGlzIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzLAogICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dXKCJvcGVuQXVkaW9TaW5rOiBub24gb2ZmbG9hZGVkIG9wZW4gZmFpbGVkIHN0YXR1czogJWQiLCBlcnIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oCmluZGV4IDYyY2YwZDguLmQwNjVkZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogCiAjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCiAKQEAgLTI4LDcgKzI5LDcgQEAKIGNsYXNzICBKV2FrZUxvY2s7CiBzdHJ1Y3QgTWVkaWFDbG9jazsKIGNsYXNzIE1lZGlhQ29kZWNCdWZmZXI7Ci1zdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTsKIAogc3RydWN0IE51UGxheWVyMjo6UmVuZGVyZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMzgsNiArMzksNyBAQAogICAgIFJlbmRlcmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywKICAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgICBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCwKICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwogCiAgICAgc3RhdGljIHNpemVfdCBBdWRpb1NpbmtDYWxsYmFjaygKQEAgLTE1Niw3ICsxNTgsNyBAQAogICAgIExpc3Q8UXVldWVFbnRyeT4gbUF1ZGlvUXVldWU7CiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtVmlkZW9RdWV1ZTsKICAgICB1aW50MzJfdCBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyPiBtVmlkZW9TY2hlZHVsZXI7CisgICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlckJhc2U+IG1WaWRlb1NjaGVkdWxlcjsKIAogICAgIGJvb2wgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmc7CiAgICAgYm9vbCBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZzsKQEAgLTE2Nyw3ICsxNjksNiBAQAogICAgIGludDMyX3QgbUF1ZGlvRU9TR2VuZXJhdGlvbjsKIAogICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOwotICAgIGZsb2F0IG1QbGF5YmFja1JhdGU7IC8vIGF1ZGlvIHRyYWNrIHJhdGUKIAogICAgIEF1ZGlvUGxheWJhY2tSYXRlIG1QbGF5YmFja1NldHRpbmdzOwogICAgIEFWU3luY1NldHRpbmdzIG1TeW5jU2V0dGluZ3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaAppbmRleCA2NjIyMzVmLi45Mjk4YTk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpIHt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCmluZGV4IDcwYmMwYTkuLmE3MDI2OWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCkBAIC05Niw3ICs5Niw4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKKy8vIFRPRE86IGZldGNoIGRhdGEgc3RhcnRpbmcgZnJvbSB8c3RhcnRUaW1lVXN8Cit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnByZXBhcmVBc3luYyhpbnQ2NF90IC8qIHN0YXJ0VGltZVVzICovKSB7CiAgICAgaWYgKG1Jc1NEUCAmJiBtSFRUUFNlcnZpY2UgPT0gTlVMTCkgewogICAgICAgICBub3RpZnlQcmVwYXJlZChCQURfVkFMVUUpOwogICAgICAgICByZXR1cm47CkBAIC0xMDQsNyArMTA1LDcgQEAKIAogICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKICAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHNwIik7CisgICAgICAgIG1Mb29wZXItPnNldE5hbWUoInJ0c3AyIik7CiAgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CiAKICAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oCmluZGV4IDcxMmMzZTUuLmU1ZjE3MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpOwogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggNzQyMzZjYi4uNDZhMWMyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCkBAIC0yNCwxMSArMjUsMTEgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGlibmV0ZF9jbGllbnQiLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLApAQCAtNjMsOCArNjQsNiBAQAogCiAgICAgbmFtZTogImxpYm1lZGlhcGxheWVyc2VydmljZSIsCiAKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAotCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDk2Zjc5ZTAuLmRhOTU4MTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC00NSw3ICs0NSw2IEBACiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXkuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5oPgpAQCAtMTYyNyw3ICsxNjI2LDcgQEAKICAgICAgICAgbUF0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgIGlmIChtQXR0cmlidXRlcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyKTsKKyAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoKmF0dHIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOwpAQCAtMTgxNiw3ICsxODE1LDcgQEAKICAgICAgICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICB9CiAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cmlidXRlcyk7CisgICAgICAgIG1TdHJlYW1UeXBlID0gQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoKmF0dHJpYnV0ZXMpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IDQyMDY2NDcuLmQ2NjI4ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTUzNyw0ICs1MzcsMjkgQEAKICAgICB9CiAgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBBTE9HVigic2V0TWljcm9waG9uZURpcmVjdGlvbiglZCkiLCBkaXJlY3Rpb24pOworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIEFMT0dWKCJzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oJWYpIiwgem9vbSk7CisgICAgaWYgKG1SZWNvcmRlciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkZXItPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OmdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIHsKKyAgICBBTE9HVigiZ2V0UG9ydElkIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5nZXRQb3J0SWQocG9ydElkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKaW5kZXggZDJlNjgxZi4uOGRhNzE4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCkBAIC0xMDksNiArMTA5LDkgQEAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTsgIC8vIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBjb25zdHJ1Y3RvcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGUzYWUwMmUuLjc3Nzc3YjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KQEAgLTQ2LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgpAQCAtMTE2LDcgKzExOCw5IEBACiAgICAgICBtVmlkZW9Tb3VyY2UoVklERU9fU09VUkNFX0xJU1RfRU5EKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSkgeworICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCisgICAgICBtU2VsZWN0ZWRNaWNEaXJlY3Rpb24oTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCksCisgICAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbihNSUNfRklFTERfRElNRU5TSU9OX05PUk1BTCkgewogCiAgICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7CiAKQEAgLTIwMSw3ICsyMDUsNyBAQAogICAgIH0KICAgICBtQW5hbHl0aWNzRGlydHkgPSBmYWxzZTsKICAgICBpZiAocmVpbml0aWFsaXplKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrS2V5UmVjb3JkZXIpOworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtLZXlSZWNvcmRlcik7CiAgICAgfQogfQogCkBAIC0zOTYsMTQgKzQwMCwxNSBAQAogICAgICAgICByZXR1cm4gLUVCQURGOwogICAgIH0KIAotICAgIC8vIHN0YXJ0IHdpdGggYSBjbGVhbiwgZW1wdHkgZmlsZQotICAgIGZ0cnVuY2F0ZShmZCwgMCk7Ci0gICAgaW50IG5leHRGZCA9IGR1cChmZCk7Ci0gICAgaWYgKG1Xcml0ZXIgPT0gTlVMTCkgeworICAgIGlmIChtV3JpdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoInNldE5leHRPdXRwdXRGaWxlIGZhaWxlZC4gV3JpdGVyIGhhcyBiZWVuIGZyZWVkIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgcmV0dXJuIG1Xcml0ZXItPnNldE5leHRGZChuZXh0RmQpOworCisgICAgLy8gc3RhcnQgd2l0aCBhIGNsZWFuLCBlbXB0eSBmaWxlCisgICAgZnRydW5jYXRlKGZkLCAwKTsKKworICAgIHJldHVybiBtV3JpdGVyLT5zZXROZXh0RmQoZmQpOwogfQogCiAvLyBBdHRlbXB0IHRvIHBhcnNlIGFuIGZsb2F0IGxpdGVyYWwgb3B0aW9uYWxseSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UsCkBAIC05NDgsNiArOTUzLDEwIEBACiAgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9PR0c6CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cE9nZ1JlY29yZGluZygpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQ6ICVkIiwgbU91dHB1dEZvcm1hdCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOwpAQCAtMTAxMyw2ICsxMDIyLDcgQEAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfUlRQX0FWUDoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUcyVFM6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9PR0c6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwogICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CkBAIC0xMDgzLDcgKzEwOTMsOSBAQAogICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgIG1DbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgbUNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgIG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uKTsKIAogICAgIHN0YXR1c190IGVyciA9IGF1ZGlvU291cmNlLT5pbml0Q2hlY2soKTsKIApAQCAtMTExMyw2ICsxMTI1LDkgQEAKICAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgT01YX0FVRElPX0FBQ09iamVjdEVMRCk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX09QVVM6CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGF1ZGlvIGVuY29kZXI6ICVkIiwgbUF1ZGlvRW5jb2Rlcik7CkBAIC0xMTY5LDYgKzExODQsMTMgQEAKICAgICByZXR1cm4gc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE9nZ1JlY29yZGluZygpIHsKKyAgICBDSEVDS19FUShtT3V0cHV0Rm9ybWF0LCBPVVRQVVRfRk9STUFUX09HRyk7CisKKyAgICBtV3JpdGVyID0gbmV3IE9nZ1dyaXRlcihtT3V0cHV0RmQpOworICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQU1SUmVjb3JkaW5nKCkgewogICAgIENIRUNLKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfTkIgfHwKICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX1dCKTsKQEAgLTE3NDUsMTMgKzE3NjcsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIEVuYWJsZSB0ZW1wb3JhbCBsYXllcmluZyBpZiB0aGUgZXhwZWN0ZWQgKG1heCkgcGxheWJhY2sgZnJhbWUgcmF0ZSBpcyBncmVhdGVyIHRoYW4gfjExJSBvZgorICAgIC8vIHRoZSBtaW5pbXVtIGRpc3BsYXkgcmVmcmVzaCByYXRlIG9uIGEgdHlwaWNhbCBkZXZpY2UuIEFkZCBsYXllcnMgdW50aWwgdGhlIGJhc2UgbGF5ZXIgZmFsbHMKKyAgICAvLyB1bmRlciB0aGlzIGxpbWl0LiBBbGxvdyBkZXZpY2UgbWFudWZhY3R1cmVycyB0byBvdmVycmlkZSB0aGlzIGxpbWl0LgorCisgICAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSBieSB0aGUgYXBwbGljYXRpb24KKyAgICBzdGQ6OnN0cmluZyBtYXhCYXNlTGF5ZXJGcHNQcm9wZXJ0eSA9CisgICAgICAgIDo6YW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLm1lZGlhLnJlY29yZGVyLW1heC1iYXNlLWxheWVyLWZwcyIsICIiKTsKKyAgICBmbG9hdCBtYXhCYXNlTGF5ZXJGcHMgPSAoZmxvYXQpOjphdG9mKG1heEJhc2VMYXllckZwc1Byb3BlcnR5LmNfc3RyKCkpOworICAgIC8vIFRSSUNLWTogdXNlICE+IHRvIGZpeCB1cCBhbnkgTmFOIHZhbHVlcworICAgIGlmICghKG1heEJhc2VMYXllckZwcyA+PSBrTWluVHlwaWNhbERpc3BsYXlSZWZyZXNoaW5nUmF0ZSAvIDAuOSkpIHsKKyAgICAgICAgbWF4QmFzZUxheWVyRnBzID0ga01pblR5cGljYWxEaXNwbGF5UmVmcmVzaGluZ1JhdGUgLyAwLjk7CisgICAgfQorCiAgICAgZm9yICh1aW50MzJfdCB0cnlMYXllcnMgPSAxOyB0cnlMYXllcnMgPD0ga01heE51bVZpZGVvVGVtcG9yYWxMYXllcnM7ICsrdHJ5TGF5ZXJzKSB7CiAgICAgICAgIGlmICh0cnlMYXllcnMgPiB0c0xheWVycykgewogICAgICAgICAgICAgdHNMYXllcnMgPSB0cnlMYXllcnM7CiAgICAgICAgIH0KICAgICAgICAgLy8ga2VlcCBnb2luZyB1bnRpbCB0aGUgYmFzZSBsYXllciBmcHMgZmFsbHMgYmVsb3cgdGhlIHR5cGljYWwgZGlzcGxheSByZWZyZXNoIHJhdGUKICAgICAgICAgZmxvYXQgYmFzZUxheWVyRnBzID0gbWF4UGxheWJhY2tGcHMgLyAoMSA8PCAodHJ5TGF5ZXJzIC0gMSkpOwotICAgICAgICBpZiAoYmFzZUxheWVyRnBzIDwga01pblR5cGljYWxEaXNwbGF5UmVmcmVzaGluZ1JhdGUgLyAwLjkpIHsKKyAgICAgICAgaWYgKGJhc2VMYXllckZwcyA8IG1heEJhc2VMYXllckZwcykgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODEzLDYgKzE4NDgsNyBAQAogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQUFDOgogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfSEVfQUFDOgogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQUFDX0VMRDoKKyAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX09QVVM6CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMTg2MywxOSArMTg5OSwxOCBAQAogICAgICAgICBtVG90YWxCaXRSYXRlICs9IG1WaWRlb0JpdFJhdGU7CiAgICAgfQogCi0gICAgaWYgKG1PdXRwdXRGb3JtYXQgIT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7Ci0gICAgICAgIC8vIEF1ZGlvIHNvdXJjZSBpcyBhZGRlZCBhdCB0aGUgZW5kIGlmIGl0IGV4aXN0cy4KLSAgICAgICAgLy8gVGhpcyBoZWxwIG1ha2Ugc3VyZSB0aGF0IHRoZSAicmVjb2RpbmciIHNvdW5kIGlzIHN1cHByZXNzZWQgZm9yCi0gICAgICAgIC8vIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMgaW4gdGhlIHJlY29yZGVkIGZpbGVzLgotICAgICAgICAvLyBUT0RPIEF1ZGlvIHNvdXJjZSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQgZm9yIHdlYm0gb3V0cHV0OyB2b3JiaXMgZW5jb2RlciBuZWVkZWQuCi0gICAgICAgIC8vIGRpc2FibGUgYXVkaW8gZm9yIHRpbWUgbGFwc2UgcmVjb3JkaW5nCi0gICAgICAgIGJvb2wgZGlzYWJsZUF1ZGlvID0gbUNhcHR1cmVGcHNFbmFibGUgJiYgbUNhcHR1cmVGcHMgPCBtRnJhbWVSYXRlOwotICAgICAgICBpZiAoIWRpc2FibGVBdWRpbyAmJiBtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkgewotICAgICAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7Ci0gICAgICAgICAgICBtVG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7Ci0gICAgICAgIH0KKyAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCisgICAgLy8gVGhpcyBoZWxwIG1ha2Ugc3VyZSB0aGF0IHRoZSAicmVjb2RpbmciIHNvdW5kIGlzIHN1cHByZXNzZWQgZm9yCisgICAgLy8gY2FtY29yZGVyIGFwcGxpY2F0aW9ucyBpbiB0aGUgcmVjb3JkZWQgZmlsZXMuCisgICAgLy8gZGlzYWJsZSBhdWRpbyBmb3IgdGltZSBsYXBzZSByZWNvcmRpbmcKKyAgICBjb25zdCBib29sIGRpc2FibGVBdWRpbyA9IG1DYXB0dXJlRnBzRW5hYmxlICYmIG1DYXB0dXJlRnBzIDwgbUZyYW1lUmF0ZTsKKyAgICBpZiAoIWRpc2FibGVBdWRpbyAmJiBtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkgeworICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOworICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgICAgICBtVG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7CisgICAgfQogCisgICAgaWYgKG1PdXRwdXRGb3JtYXQgIT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CiAgICAgICAgIGlmIChtQ2FwdHVyZUZwc0VuYWJsZSkgewogICAgICAgICAgICAgbXA0d3JpdGVyLT5zZXRDYXB0dXJlUmF0ZShtQ2FwdHVyZUZwcyk7CiAgICAgICAgIH0KQEAgLTIyMzksNiArMjI3NCwzMCBAQAogICAgIHJldHVybiBOT19JTklUOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgQUxPR1YoInNldE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICBtU2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgaWYgKG1BdWRpb1NvdXJjZU5vZGUgIT0gMCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvU291cmNlTm9kZS0+c2V0TWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBBTE9HVigic2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKCVmKSIsIHpvb20pOworICAgIG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gem9vbTsKKyAgICBpZiAobUF1ZGlvU291cmNlTm9kZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9Tb3VyY2VOb2RlLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdCB7CisgICAgaWYgKG1BdWRpb1NvdXJjZU5vZGUgIT0gMCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvU291cmNlTm9kZS0+Z2V0UG9ydElkKHBvcnRJZCk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpkdW1wKAogICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCmluZGV4IGZhYTJlNTkuLjIzNmIxOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaApAQCAtNzcsNyArNzcsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwotCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKyAgICAgICAgICAgIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0IG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CkBAIC0xNTksNiArMTYxLDkgQEAKICAgICBib29sIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQ7CiAgICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1BdWRpb0RldmljZUNhbGxiYWNrOwogCisgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBtU2VsZWN0ZWRNaWNEaXJlY3Rpb247CisgICAgZmxvYXQgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb247CisKICAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhIaWdoU3BlZWRGcHMgPSAxMDAwOwogCiAgICAgc3RhdHVzX3QgcHJlcGFyZUludGVybmFsKCk7CkBAIC0xNjYsNiArMTcxLDcgQEAKICAgICB2b2lkIHNldHVwTVBFRzRvcldFQk1NZXRhRGF0YShzcDxNZXRhRGF0YT4gKm1ldGEpOwogICAgIHN0YXR1c190IHNldHVwQU1SUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBQUNSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzZXR1cE9nZ1JlY29yZGluZygpOwogICAgIHN0YXR1c190IHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzZXR1cFJUUFJlY29yZGluZygpOwogICAgIHN0YXR1c190IHNldHVwTVBFRzJUU1JlY29yZGluZygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggMzExOTk1MC4uMGFkNGQwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC0xNTEsMTMgKzE1MSwxMyBAQAogCiAgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOwotICAgICAgICB2aXJ0dWFsIHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgPSAwOwogCiAgICAgICAgIC8vIEF1ZGlvUm91dGluZwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgIH07CiAKICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSgpIHt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKaW5kZXggNjk0MjM1YS4uNWE1OGFhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgpAQCAtMzgsNiArMzcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMTU1MCw2ICsxNTUwLDE2IEBACiAgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtUHJlcGFyaW5nKSB7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZmluYWxTdGF0dXMpOworICAgICAgICAgICAgbVByZXBhcmluZyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1TZW50UGF1c2VPbkJ1ZmZlcmluZykgeworICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKKyAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IGZhbHNlOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggY2Y3NWFlYy4uMzM4ODA5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC02NTksMjAgKzY1OSwzMSBAQAogCiAgICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgogICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IC0xOwogICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGVyciA9IE9LOwotCi0gICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOwotICAgICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwotCi0gICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayA9PSAtMSAmJiBtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbUNDRGVjb2Rlci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrICs9IGluYmFuZFRyYWNrczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZFRyYWNrKTsKKwogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcAppbmRleCA3ZjQ3NzNiLi4wMTU2YWQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKQEAgLTIwMCw2ICsyMDAsMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NzaXplX3QgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gLTEpIHsKKyAgICAgICAgQ0NUcmFjayB0cmFjayA9IG1UcmFja3NbbVNlbGVjdGVkVHJhY2tdOworICAgICAgICBpZiAodHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4IHx8IHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTcwOCkgeworICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCiBib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmlzU2VsZWN0ZWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrID49IDAgJiYgbVNlbGVjdGVkVHJhY2sgPCAoaW50MzJfdClnZXRUcmFja0NvdW50KCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCmluZGV4IGYzMTBmMzcuLjM3YjgyMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCkBAIC0zOCw2ICszOCw3IEBACiAgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKICAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7CisgICAgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CiAgICAgYm9vbCBpc1NlbGVjdGVkKCkgY29uc3Q7CiAgICAgdm9pZCBkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwogICAgIHZvaWQgZGlzcGxheShpbnQ2NF90IHRpbWVVcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCmluZGV4IDRhZDZlYWIuLjJmMGRhMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCkBAIC0xMDcsMTAgKzEwNywxNiBAQAogfQogCiBzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OkRlY29kZXI6OmdldFN0YXRzKCkgY29uc3QgeworCiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLXRvdGFsIiwgbU51bUZyYW1lc1RvdGFsKTsKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtZHJvcHBlZC1pbnB1dCIsIG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLW91dHB1dCIsIG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkKTsKLSAgICByZXR1cm4gbVN0YXRzOworICAgIG1TdGF0cy0+c2V0RmxvYXQoImZyYW1lLXJhdGUtdG90YWwiLCBtRnJhbWVSYXRlVG90YWwpOworCisgICAgLy8gaSdtIG11dGV4ZWQgcmlnaHQgbm93LgorICAgIC8vIG1ha2Ugb3VyIG93biBjb3B5LCBzbyB3ZSBhcmVuJ3QgdmljdGltIHRvIGFueSBsYXRlciBjaGFuZ2VzLgorICAgIHNwPEFNZXNzYWdlPiBjb3BpZWRTdGF0cyA9IG1TdGF0cy0+ZHVwKCk7CisgICAgcmV0dXJuIGNvcGllZFN0YXRzOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6RGVjb2Rlcjo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CkBAIC02NzcsNyArNjgzLDcgQEAKICAgICAgICAgbXNnLT5zZXRTaXplKCJidWZmZXItaXgiLCBpbmRleCk7CiAKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbUNTRHNUb1N1Ym1pdC5pdGVtQXQoMCk7Ci0gICAgICAgIEFMT0dJKCJbJXNdIHJlc3VibWl0dGluZyBDU0QiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKICAgICAgICAgbUNTRHNUb1N1Ym1pdC5yZW1vdmVBdCgwKTsKICAgICAgICAgaWYgKCFvbklucHV0QnVmZmVyRmV0Y2hlZChtc2cpKSB7CkBAIC03NDgsNyArNzU0LDcgQEAKICAgICByZXBseS0+c2V0U2l6ZSgic2l6ZSIsIHNpemUpOwogCiAgICAgaWYgKGVvcykgewotICAgICAgICBBTE9HSSgiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICBBTE9HVigiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogCiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CkBAIC0xMDI4LDcgKzEwMzQsNyBAQAogICAgICAgICAgICAgaW50NjRfdCByZXN1bWVBdE1lZGlhVGltZVVzOwogICAgICAgICAgICAgaWYgKGV4dHJhLT5maW5kSW50NjQoCiAgICAgICAgICAgICAgICAgICAgICAgICAicmVzdW1lLWF0LW1lZGlhVGltZVVzIiwgJnJlc3VtZUF0TWVkaWFUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIlslc10gc3VwcHJlc3NpbmcgcmVuZGVyaW5nIHVudGlsICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN1cHByZXNzaW5nIHJlbmRlcmluZyB1bnRpbCAlbGxkIHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpcmVzdW1lQXRNZWRpYVRpbWVVcyk7CiAgICAgICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gcmVzdW1lQXRNZWRpYVRpbWVVczsKICAgICAgICAgICAgIH0KQEAgLTEwNjksNiArMTA3NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXJIb2xkZXIqPihob2xkZXIuZ2V0KCkpLT5tZWRpYUJ1ZmZlcigpIDogbnVsbHB0cjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5zaXplKCkgPiBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoRVJST1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlckl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIG1lZGlhQnVmLT5kYXRhKCksIG1lZGlhQnVmLT5zaXplKCkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCBiODNlNzY2Li4yYjgxM2U3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTUzLDYgKzUzLDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVySGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuaGVpZ2h0IjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzRHJvcHBlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcHMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLm1pbWUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5jb2RlYyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckR1cmF0aW9uID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyI7CkBAIC05Niw3ICs5Nyw3IEBACiAgICAgbU1lZGlhQ2xvY2stPmluaXQoKTsKIAogICAgIC8vIHNldCB1cCBhbiBhbmFseXRpY3MgcmVjb3JkCi0gICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlQbGF5ZXIpOworICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleVBsYXllcik7CiAKICAgICBtTG9vcGVyLT5zdGFydCgKICAgICAgICAgICAgIGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KQEAgLTMyOCw3ICszMjksNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c3RhcnQoKSB7Ci0gICAgQUxPR0QoInN0YXJ0KCVwKSwgc3RhdGUgaXMgJWQsIGVvcyBpcyAlZCIsIHRoaXMsIG1TdGF0ZSwgbUF0RU9TKTsKKyAgICBBTE9HVigic3RhcnQoJXApLCBzdGF0ZSBpcyAlZCwgZW9zIGlzICVkIiwgdGhpcywgbVN0YXRlLCBtQXRFT1MpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgcmV0dXJuIHN0YXJ0X2woKTsKIH0KQEAgLTQ3MCw3ICs0NzEsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2Vla1RvKGludCBtc2VjLCBNZWRpYVBsYXllclNlZWtNb2RlIG1vZGUpIHsKLSAgICBBTE9HRCgic2Vla1RvKCVwKSAoJWQgbXMsICVkKSBhdCBzdGF0ZSAlZCIsIHRoaXMsIG1zZWMsIG1vZGUsIG1TdGF0ZSk7CisgICAgQUxPR1YoInNlZWtUbyglcCkgKCVkIG1zLCAlZCkgYXQgc3RhdGUgJWQiLCB0aGlzLCBtc2VjLCBtb2RlLCBtU3RhdGUpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSBtc2VjICogMTAwMExMOwpAQCAtNTc3LDYgKzU3OCwxMCBAQAogICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRnJhbWVzLCBudW1GcmFtZXNUb3RhbCk7CiAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXNEcm9wcGVkLCBudW1GcmFtZXNEcm9wcGVkKTsKIAorICAgICAgICAgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRzLT5maW5kRmxvYXQoImZyYW1lLXJhdGUtdG90YWwiLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0RG91YmxlKGtQbGF5ZXJGcmFtZVJhdGUsIChkb3VibGUpIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyQU1pbWUsIG1pbWUuY19zdHIoKSk7CkBAIC02MDIsNiArNjA3LDcgQEAKICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJSZWJ1ZmZlcmluZywgKG1SZWJ1ZmZlcmluZ1RpbWVVcys1MDApLzEwMDAgKTsKICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0NvdW50LCBtUmVidWZmZXJpbmdFdmVudHMpOwogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQXRFeGl0LCBtUmVidWZmZXJpbmdBdEV4aXQpOworCiAgICAgfQogCiAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckRhdGFTb3VyY2VUeXBlLCBtUGxheWVyLT5nZXREYXRhU291cmNlVHlwZSgpKTsKQEAgLTYyOSw3ICs2MzUsNyBAQAogCiAgICAgICAgIC8vIHJlLWluaXQgaW4gY2FzZSB3ZSBwcmVwYXJlKCkgYW5kIHN0YXJ0KCkgYWdhaW4uCiAgICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbSA7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgibnVwbGF5ZXIiKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgibnVwbGF5ZXIiKTsKICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0VWlkKG1DbGllbnRVaWQpOwogICAgICAgICB9CkBAIC05NTksNyArOTY1LDcgQEAKIAogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5TGlzdGVuZXJfbCgKICAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7Ci0gICAgQUxPR0QoIm5vdGlmeUxpc3RlbmVyX2woJXApLCAoJWQsICVkLCAlZCwgJWQpLCBsb29wIHNldHRpbmcoJWQsICVkKSIsCisgICAgQUxPR1YoIm5vdGlmeUxpc3RlbmVyX2woJXApLCAoJWQsICVkLCAlZCwgJWQpLCBsb29wIHNldHRpbmcoJWQsICVkKSIsCiAgICAgICAgICAgICB0aGlzLCBtc2csIGV4dDEsIGV4dDIsIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5kYXRhU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7CiAgICAgc3dpdGNoIChtc2cpIHsKICAgICAgICAgY2FzZSBNRURJQV9QTEFZQkFDS19DT01QTEVURToKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCmluZGV4IGJkZTA4NjIuLjJkMGM5ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcApAQCAtMTU5LDggKzE1OSwxMiBAQAogICAgIGlmIChkcm0gIT0gTlVMTCkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBzc2hEUk1zLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBEcm1VVUlEIHV1aWQgPSBwc3NoRFJNc1tpXTsKLSAgICAgICAgICAgIGlmIChkcm0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQucHRyKCksIFN0cmluZzgoKSkpCisgICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBzdGF0dXMgPSBkcm0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQucHRyKCksIFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd24sICZpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LICYmIGlzU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkRFJNcy5hZGQodXVpZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBkcm0uY2xlYXIoKTsKQEAgLTIzOSw4ICsyNDMsMTQgQEAKICAgICAgICAgc2l6ZV90ICplbmNyeXB0ZWRieXRlcykKIHsKICAgICAvLyBzaXplIG5lZWRlZCB0byBzdG9yZSBhbGwgdGhlIGNyeXB0byBkYXRhCi0gICAgc2l6ZV90IGNyeXB0b3NpemUgPSBzaXplb2YoQ3J5cHRvSW5mbykgKwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSAqIG51bVN1YlNhbXBsZXM7CisgICAgc2l6ZV90IGNyeXB0b3NpemU7CisgICAgLy8gc2l6ZW9mKENyeXB0b0luZm8pICsgc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSAqIG51bVN1YlNhbXBsZXM7CisgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSwgbnVtU3ViU2FtcGxlcywgJmNyeXB0b3NpemUpIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGNyeXB0b3NpemUsIHNpemVvZihDcnlwdG9JbmZvKSwgJmNyeXB0b3NpemUpKSB7CisgICAgICAgIEFMT0dFKCJjcnlwdG8gc2l6ZSBvdmVyZmxvdyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBDcnlwdG9JbmZvICpyZXQgPSAoQ3J5cHRvSW5mbyopIG1hbGxvYyhjcnlwdG9zaXplKTsKICAgICBpZiAocmV0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoImNvdWxkbid0IGFsbG9jYXRlICV6dSBieXRlcyIsIGNyeXB0b3NpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IDQ5OTIxMzcuLjY1ZDZkNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtODcsNiArODksMjAgQEAKIC8vIHN0YXRpYwogY29uc3QgaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXMgPSAxMDAwMDBsbDsKIAorc3RhdGljIGF1ZGlvX2Zvcm1hdF90IGNvbnN0ZXhwciBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhpbnQzMl90IHBjbUVuY29kaW5nKSB7CisgICAgc3dpdGNoIChwY21FbmNvZGluZykgeworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY21GbG9hdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbThiaXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzhfQklUOyAvLyBUT0RPOiBkbyB3ZSB3YW50IHRvIHN1cHBvcnQgdGhpcz8KKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgZW5jb2Rpbmc6ICVkIiwgX19mdW5jX18sIHBjbUVuY29kaW5nKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIH0KK30KKwogTnVQbGF5ZXI6OlJlbmRlcmVyOjpSZW5kZXJlcigKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZzaW5rLAogICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywKQEAgLTE4ODMsOCArMTg5OSwxMyBAQAogICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpOwogCisgICAgLy8gcmVhZCBwY20gZW5jb2RpbmcgZnJvbSBNZWRpYUNvZGVjIG91dHB1dCBmb3JtYXQsIGlmIGF2YWlsYWJsZQorICAgIGludDMyX3QgcGNtRW5jb2Rpbmc7CisgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPQorICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoS0VZX1BDTV9FTkNPRElORywgJnBjbUVuY29kaW5nKSA/CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0RnJvbUVuY29kaW5nKHBjbUVuY29kaW5nKSA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCiAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgIEFTdHJpbmcgbWltZTsKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbWFwTWltZVRvQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQsIG1pbWUuY19zdHIoKSk7CkBAIC0xOTg2LDcgKzIwMDcsNyBAQAogICAgICAgICBjb25zdCBQY21JbmZvIGluZm8gPSB7CiAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClwY21GbGFncywKLSAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgLy8gVE9ETzogY2hhbmdlIHRvIGF1ZGlvRm9ybWF0CisgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCiAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZQogICAgICAgICB9OwpAQCAtMjAyNSw3ICsyMDQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAogICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/ICZOdVBsYXllcjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyB0aGlzIDogTlVMTCwKQEAgLTIwODMsNCArMjEwNCwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCmluZGV4IGEwNDc5NzUuLmE1MjFmNjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApAQCAtMjgsNyArMjgsNyBAQAogY2xhc3MgIEFXYWtlTG9jazsKIHN0cnVjdCBNZWRpYUNsb2NrOwogY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKLXN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlJlbmRlcmVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKQEAgLTE1Niw3ICsxNTYsNyBAQAogICAgIExpc3Q8UXVldWVFbnRyeT4gbUF1ZGlvUXVldWU7CiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtVmlkZW9RdWV1ZTsKICAgICB1aW50MzJfdCBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyPiBtVmlkZW9TY2hlZHVsZXI7CisgICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlckJhc2U+IG1WaWRlb1NjaGVkdWxlcjsKIAogICAgIGJvb2wgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmc7CiAgICAgYm9vbCBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZTg2YjY4YS4uZjhjODllNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTExLDEwICsxMSw5IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgXSwKIAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icCBiL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKaW5kZXggNzRhYWY3Ny4uMTE4ODMyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCkBAIC0zLDkgKzMsMTMgQEAKICAgICBuYW1lOiAibGlibmJsb2ciLAogCiAgICAgc3JjczogWwotICAgICAgICAiTkJMb2cuY3BwIiwKKyAgICAgICAgIkVudHJ5LmNwcCIsCisgICAgICAgICJNZXJnZXIuY3BwIiwKICAgICAgICAgIlBlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIiwKKyAgICAgICAgIlJlYWRlci5jcHAiLAogICAgICAgICAiUmVwb3J0UGVyZm9ybWFuY2UuY3BwIiwKKyAgICAgICAgIlRpbWVsaW5lLmNwcCIsCisgICAgICAgICJXcml0ZXIuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTEzLDkgKzE3LDE0IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlianNvbmNwcCIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9FbnRyeS5jcHAgYi9tZWRpYS9saWJuYmxvZy9FbnRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NTYzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcApAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworaW50IEVudHJ5Ojpjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBzbG93CisgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICAgIHJldHVybiBtRXZlbnQ7CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPT0gMSkgeworICAgICAgICByZXR1cm4gbUxlbmd0aDsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA8IChzaXplX3QpIChtTGVuZ3RoICsgMikpIHsKKyAgICAgICAgcmV0dXJuIChpbnQpICgoY2hhciAqKSBtRGF0YSlbb2Zmc2V0IC0gMl07CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPT0gKHNpemVfdCkgKG1MZW5ndGggKyAyKSkgeworICAgICAgICByZXR1cm4gbUxlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsgICAvLyBGSVhNRSBpcyB0aGlzIGFuIGVycm9yPworICAgIH0KK30KKworRW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcigpICAgLy8gRHVtbXkgaW5pdGlhbGl6YXRpb24uCisgICAgOiBtUHRyKG51bGxwdHIpCit7Cit9CisKK0VudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpCisgICAgOiBtUHRyKGVudHJ5KQoreworfQorCitFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKQorICAgIDogbVB0cihvdGhlci5tUHRyKQoreworfQorCitjb25zdCBlbnRyeSYgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKihlbnRyeSopIG1QdHI7Cit9CisKK2NvbnN0IGVudHJ5KiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0+KCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGVudHJ5KikgbVB0cjsKK30KKworRW50cnlJdGVyYXRvciYgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3IrKygpCit7CisgICAgbVB0ciArPSBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgcmV0dXJuICp0aGlzOworfQorCitFbnRyeUl0ZXJhdG9yJiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0tKCkKK3sKKyAgICBtUHRyIC09IG1QdHJbRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gKyBFbnRyeTo6a092ZXJoZWFkOworICAgIHJldHVybiAqdGhpczsKK30KKworRW50cnlJdGVyYXRvciBFbnRyeUl0ZXJhdG9yOjpuZXh0KCkgY29uc3QKK3sKKyAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7CisgICAgcmV0dXJuICsrYXV4OworfQorCitFbnRyeUl0ZXJhdG9yIEVudHJ5SXRlcmF0b3I6OnByZXYoKSBjb25zdAoreworICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKKyAgICByZXR1cm4gLS1hdXg7Cit9CisKK2Jvb2wgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gbVB0ciAhPSBvdGhlci5tUHRyOworfQorCitpbnQgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdAoreworICAgIHJldHVybiBtUHRyIC0gb3RoZXIubVB0cjsKK30KKworYm9vbCBFbnRyeUl0ZXJhdG9yOjpoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPT0gbVB0clttUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCisgICAgICAgIEVudHJ5OjprT3ZlcmhlYWQgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XTsKK30KKwordm9pZCBFbnRyeUl0ZXJhdG9yOjpjb3B5VG8oc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0KSBjb25zdAoreworICAgIHNpemVfdCBsZW5ndGggPSBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgZHN0LT53cml0ZShtUHRyLCBsZW5ndGgpOworfQorCit2b2lkIEVudHJ5SXRlcmF0b3I6OmNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3QKK3sKKyAgICBtZW1jcHkoKHZvaWQqKSBkc3QsIG1QdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSksIG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikKK3sKKyAgICBpZiAocHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QgdHlwZSA9IEVudHJ5SXRlcmF0b3IocHRyKS0+dHlwZTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEVWRU5UX0ZNVF9TVEFSVDoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOworICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6CisgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiVHJpZWQgdG8gY3JlYXRlIEFic3RyYWN0RW50cnkgb2YgdHlwZSAlZCIsIHR5cGUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9CisKK0VudHJ5SXRlcmF0b3IgRm9ybWF0RW50cnk6OmJlZ2luKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpOworfQorCitjb25zdCBjaGFyICpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGNvbnN0IGNoYXIqKSBtRW50cnkgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSk7Cit9CisKK3NpemVfdCBGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXTsKK30KKworRW50cnlJdGVyYXRvciBGb3JtYXRFbnRyeTo6YXJncygpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OyAvLyBza2lwIHRpbWVzdGFtcAorICAgICsraXQ7IC8vIHNraXAgaGFzaAorICAgIC8vIFNraXAgYXV0aG9yIGlmIHByZXNlbnQKKyAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfRk1UX0FVVEhPUikgeworICAgICAgICArK2l0OworICAgIH0KKyAgICByZXR1cm4gaXQ7Cit9CisKK2ludDY0X3QgRm9ybWF0RW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ2NF90PigpOworfQorCitsb2dfaGFzaF90IEZvcm1hdEVudHJ5OjpoYXNoKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7IC8vIHNraXAgdGltZXN0YW1wCisgICAgLy8gdW5hbGlnbmVkIDY0LWJpdCByZWFkIG5vdCBzdXBwb3J0ZWQKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgbWVtY3B5KCZoYXNoLCBpdC0+ZGF0YSwgc2l6ZW9mKGhhc2gpKTsKKyAgICByZXR1cm4gaGFzaDsKK30KKworaW50IEZvcm1hdEVudHJ5OjphdXRob3IoKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsgLy8gc2tpcCB0aW1lc3RhbXAKKyAgICArK2l0OyAvLyBza2lwIGhhc2gKKyAgICAvLyBpZiB0aGVyZSBpcyBhbiBhdXRob3IgZW50cnksIHJldHVybiBpdCwgcmV0dXJuIC0xIG90aGVyd2lzZQorICAgIHJldHVybiBpdC0+dHlwZSA9PSBFVkVOVF9GTVRfQVVUSE9SID8gaXQucGF5bG9hZDxpbnQ+KCkgOiAtMTsKK30KKworRW50cnlJdGVyYXRvciBGb3JtYXRFbnRyeTo6Y29weVdpdGhBdXRob3IoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICBpdC5jb3B5VG8oZHN0KTsgICAgIC8vIGNvcHkgZm10IHN0YXJ0IGVudHJ5CisgICAgKCsraXQpLmNvcHlUbyhkc3QpOyAvLyBjb3B5IHRpbWVzdGFtcAorICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgLy8gY29weSBoYXNoCisgICAgLy8gaW5zZXJ0IGF1dGhvciBlbnRyeQorICAgIHNpemVfdCBhdXRob3JFbnRyeVNpemUgPSBFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKGF1dGhvcik7CisgICAgdWludDhfdCBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemVdOworICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCB0eXBlKV0gPSBFVkVOVF9GTVRfQVVUSE9SOworICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9CisgICAgICAgIGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZSArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdID0KKyAgICAgICAgc2l6ZW9mKGF1dGhvcik7CisgICAgKihpbnQqKSAoJmF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBkYXRhKV0pID0gYXV0aG9yOworICAgIGRzdC0+d3JpdGUoYXV0aG9yRW50cnksIGF1dGhvckVudHJ5U2l6ZSk7CisgICAgLy8gY29weSByZXN0IG9mIGVudHJpZXMKKyAgICB3aGlsZSAoKCsraXQpLT50eXBlICE9IEVWRU5UX0ZNVF9FTkQpIHsKKyAgICAgICAgaXQuY29weVRvKGRzdCk7CisgICAgfQorICAgIGl0LmNvcHlUbyhkc3QpOworICAgICsraXQ7CisgICAgcmV0dXJuIGl0OworfQorCitpbnQ2NF90IEhpc3RvZ3JhbUVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdAoreworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS50czsKK30KKworbG9nX2hhc2hfdCBIaXN0b2dyYW1FbnRyeTo6aGFzaCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLmhhc2g7Cit9CisKK2ludCBIaXN0b2dyYW1FbnRyeTo6YXV0aG9yKCkgY29uc3QKK3sKKyAgICBFbnRyeUl0ZXJhdG9yIGl0KG1FbnRyeSk7CisgICAgcmV0dXJuIGl0LT5sZW5ndGggPT0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikKKyAgICAgICAgICAgID8gaXQucGF5bG9hZDxIaXN0VHNFbnRyeVdpdGhBdXRob3I+KCkuYXV0aG9yIDogLTE7Cit9CisKK0VudHJ5SXRlcmF0b3IgSGlzdG9ncmFtRW50cnk6OmNvcHlXaXRoQXV0aG9yKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0Cit7CisgICAgLy8gQ3VycmVudCBoaXN0b2dyYW0gZW50cnkgaGFzIHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeSwgbGVuZ3RofS4KKyAgICAvLyBXZSBub3cgd2FudCB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yLCBsZW5ndGh9CisgICAgdWludDhfdCBidWZmZXJbRW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpXTsKKyAgICAvLyBDb3B5IGNvbnRlbnQgdW50aWwgdGhlIHBvaW50IHdlIHdhbnQgdG8gYWRkIHRoZSBhdXRob3IKKyAgICBtZW1jcHkoYnVmZmVyLCBtRW50cnksIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKTsKKyAgICAvLyBDb3B5IHRoZSBhdXRob3IKKyAgICAqKGludCopIChidWZmZXIgKyBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSkgPSBhdXRob3I7CisgICAgLy8gVXBkYXRlIGxlbmd0aHMKKyAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7CisgICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBkYXRhKSArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpICsgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpXQorICAgICAgICA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOworICAgIC8vIFdyaXRlIG5ldyBidWZmZXIgaW50byBGSUZPCisgICAgZHN0LT53cml0ZShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLm5leHQoKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9NZXJnZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvTWVyZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQ2ZDZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvTWVyZ2VyLmNwcApAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPGpzb24vanNvbi5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL01lcmdlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKK01lcmdlcjo6TWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOgorICAgICAgbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKQoreworfQorCit2b2lkIE1lcmdlcjo6YWRkUmVhZGVyKGNvbnN0IHNwPFJlYWRlcj4gJnJlYWRlcikKK3sKKyAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBiaW5kZXIgdGhyZWFkIGluIE1lZGlhTG9nU2VydmljZTo6cmVnaXN0ZXJXcml0ZXIKKyAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbVJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgorICAgIG1SZWFkZXJzLnB1c2hfYmFjayhyZWFkZXIpOworfQorCisvLyBpdGVtcyBwbGFjZWQgaW4gcHJpb3JpdHkgcXVldWUgZHVyaW5nIG1lcmdlCisvLyBjb21wb3NlZCBieSBhIHRpbWVzdGFtcCBhbmQgdGhlIGluZGV4IG9mIHRoZSBzbmFwc2hvdCB3aGVyZSB0aGUgdGltZXN0YW1wIGNhbWUgZnJvbQorc3RydWN0IE1lcmdlSXRlbQoreworICAgIGludDY0X3QgdHM7CisgICAgaW50IGluZGV4OworICAgIE1lcmdlSXRlbShpbnQ2NF90IHRzLCBpbnQgaW5kZXgpOiB0cyh0cyksIGluZGV4KGluZGV4KSB7fQorfTsKKworYm9vbCBvcGVyYXRvcj4oY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTEsIGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkyKQoreworICAgIHJldHVybiBpMS50cyA+IGkyLnRzIHx8IChpMS50cyA9PSBpMi50cyAmJiBpMS5pbmRleCA+IGkyLmluZGV4KTsKK30KKworLy8gTWVyZ2UgcmVnaXN0ZXJlZCByZWFkZXJzLCBzb3J0ZWQgYnkgdGltZXN0YW1wLCBhbmQgd3JpdGUgZGF0YSB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeQordm9pZCBNZXJnZXI6Om1lcmdlKCkKK3sKKyAgICBpZiAodHJ1ZSkgcmV0dXJuOyAvLyBNZXJnaW5nIGlzIG5vdCBuZWNlc3NhcnkgYXQgdGhlIG1vbWVudCwgc28gdGhpcyBpcyB0byBkaXNhYmxlIGl0CisgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGJ5cGFzcyBjb21waWxlciB3YXJuaW5ncyBhYm91dCBtZW1iZXIgdmFyaWFibGVzIG5vdCBiZWluZyB1c2VkLgorICAgIGNvbnN0IGludCBuTG9ncyA9IG1SZWFkZXJzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOworICAgIHN0ZDo6dmVjdG9yPEVudHJ5SXRlcmF0b3I+IG9mZnNldHM7CisgICAgb2Zmc2V0cy5yZXNlcnZlKG5Mb2dzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpIHsKKyAgICAgICAgc25hcHNob3RzW2ldID0gbVJlYWRlcnNbaV0tPmdldFNuYXBzaG90KCk7CisgICAgICAgIG9mZnNldHMucHVzaF9iYWNrKHNuYXBzaG90c1tpXS0+YmVnaW4oKSk7CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgb2Zmc2V0cworICAgIC8vIFRPRE8gY3VzdG9tIGhlYXAgaW1wbGVtZW50YXRpb24gY291bGQgYWxsb3cgdG8gdXBkYXRlIHRvcCwgaW1wcm92aW5nIHBlcmZvcm1hbmNlCisgICAgLy8gZm9yIGJ1cnN0eSBidWZmZXJzCisgICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxNZXJnZUl0ZW0sIHN0ZDo6dmVjdG9yPE1lcmdlSXRlbT4sIHN0ZDo6Z3JlYXRlcjxNZXJnZUl0ZW0+PiB0aW1lc3RhbXBzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChvZmZzZXRzW2ldICE9IHNuYXBzaG90c1tpXS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBhYnN0cmFjdEVudHJ5ID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2ldKTsKKyAgICAgICAgICAgIGlmIChhYnN0cmFjdEVudHJ5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZShhYnN0cmFjdEVudHJ5LT50aW1lc3RhbXAoKSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoIXRpbWVzdGFtcHMuZW1wdHkoKSkgeworICAgICAgICBpbnQgaW5kZXggPSB0aW1lc3RhbXBzLnRvcCgpLmluZGV4OyAgICAgLy8gZmluZCBtaW5pbXVtIHRpbWVzdGFtcAorICAgICAgICAvLyBjb3B5IGl0IHRvIHRoZSBsb2csIGluY3JlYXNpbmcgb2Zmc2V0CisgICAgICAgIG9mZnNldHNbaW5kZXhdID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPgorICAgICAgICAgICAgY29weVdpdGhBdXRob3IobUZpZm9Xcml0ZXIsIGluZGV4KTsKKyAgICAgICAgLy8gdXBkYXRlIGRhdGEgc3RydWN0dXJlcworICAgICAgICB0aW1lc3RhbXBzLnBvcCgpOworICAgICAgICBpZiAob2Zmc2V0c1tpbmRleF0gIT0gc25hcHNob3RzW2luZGV4XS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+dGltZXN0YW1wKCk7CisgICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8c3A8UmVhZGVyPj4mIE1lcmdlcjo6Z2V0UmVhZGVycygpIGNvbnN0Cit7CisgICAgLy9BdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtUmVhZGVyczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01lcmdlUmVhZGVyOjpNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcikKKyAgICA6IFJlYWRlcihzaGFyZWQsIHNpemUsICJNZXJnZVJlYWRlciIpLCBtUmVhZGVycyhtZXJnZXIuZ2V0UmVhZGVycygpKQoreworfQorCisvLyBUYWtlcyByYXcgY29udGVudCBvZiB0aGUgbG9jYWwgbWVyZ2VyIEZJRk8sIHByb2Nlc3NlcyBsb2cgZW50cmllcywgYW5kCisvLyB3cml0ZXMgdGhlIGRhdGEgdG8gYSBtYXAgb2YgY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcywgYmFzZWQgb24gdGhlaXIgdGhyZWFkIElELgordm9pZCBNZXJnZVJlYWRlcjo6cHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICZzbmFwc2hvdCwgaW50IGF1dGhvcikKK3sKKyAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gbVRocmVhZFBlcmZvcm1hbmNlRGF0YVthdXRob3JdOworICAgIC8vIFdlIGRvbid0IGRvICJhdXRvIGl0IiBiZWNhdXNlIGl0IHJlZHVjZXMgcmVhZGFiaWxpdHkgaW4gdGhpcyBjYXNlLgorICAgIGZvciAoRW50cnlJdGVyYXRvciBpdCA9IHNuYXBzaG90LmJlZ2luKCk7IGl0ICE9IHNuYXBzaG90LmVuZCgpOyArK2l0KSB7CisgICAgICAgIHN3aXRjaCAoaXQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6IHsKKyAgICAgICAgICAgIGNvbnN0IEhpc3RUc0VudHJ5IHBheWxvYWQgPSBpdC5wYXlsb2FkPEhpc3RUc0VudHJ5PigpOworICAgICAgICAgICAgLy8gVE9ETzogaGFzaCBmb3IgaGlzdG9ncmFtIHRzIGFuZCBhdWRpbyBzdGF0ZSBuZWVkIHRvIG1hdGNoCisgICAgICAgICAgICAvLyBhbmQgY29ycmVzcG9uZCB0byBhdWRpbyBwcm9kdWN0aW9uIHNvdXJjZSBmaWxlIGxvY2F0aW9uCisgICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1thdXRob3JdWzAgLypoYXNoKi9dLmxvZ1RzRW50cnkocGF5bG9hZC50cyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6IHsKKyAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2F1dGhvcl1bMCAvKmhhc2gqL10uaGFuZGxlU3RhdGVDaGFuZ2UoKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfSU5GTzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX2luZm9fdCBpbmZvID0gaXQucGF5bG9hZDx0aHJlYWRfaW5mb190PigpOworICAgICAgICAgICAgZGF0YS50aHJlYWRJbmZvID0gaW5mbzsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfUEFSQU1TOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfcGFyYW1zX3QgcGFyYW1zID0gaXQucGF5bG9hZDx0aHJlYWRfcGFyYW1zX3Q+KCk7CisgICAgICAgICAgICBkYXRhLnRocmVhZFBhcmFtcyA9IHBhcmFtczsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9MQVRFTkNZOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBkYXRhLmxhdGVuY3lIaXN0LmFkZChsYXRlbmN5TXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dPUktfVElNRTogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBtb25vdG9uaWNOcyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtb25vdG9uaWNNcyA9IG1vbm90b25pY05zICogMWUtNjsKKyAgICAgICAgICAgIGRhdGEud29ya0hpc3QuYWRkKG1vbm90b25pY01zKTsKKyAgICAgICAgICAgIGRhdGEuYWN0aXZlICs9IG1vbm90b25pY05zOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dBUk1VUF9USU1FOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgdGltZU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBkYXRhLndhcm11cEhpc3QuYWRkKHRpbWVNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVU5ERVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBkYXRhLnVuZGVycnVucysrOworICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMuZW1wbGFjZV9mcm9udChFVkVOVF9VTkRFUlJVTiwgdHMpOworICAgICAgICAgICAgLy8gVE9ETyBoYXZlIGEgZGF0YSBzdHJ1Y3R1cmUgdG8gYXV0b21hdGljYWxseSBoYW5kbGUgcmVzaXppbmcKKyAgICAgICAgICAgIGlmIChkYXRhLnNuYXBzaG90cy5zaXplKCkgPiBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhOjprTWF4U25hcHNob3RzVG9TdG9yZSkgeworICAgICAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfT1ZFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGRhdGEub3ZlcnJ1bnMrKzsKKyAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLmVtcGxhY2VfZnJvbnQoRVZFTlRfVU5ERVJSVU4sIHRzKTsKKyAgICAgICAgICAgIC8vIFRPRE8gaGF2ZSBhIGRhdGEgc3RydWN0dXJlIHRvIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHJlc2l6aW5nCisgICAgICAgICAgICBpZiAoZGF0YS5zbmFwc2hvdHMuc2l6ZSgpID4gUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YTo6a01heFNuYXBzaG90c1RvU3RvcmUpIHsKKyAgICAgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEVWRU5UX1VQUEVSX0JPVU5EOgorICAgICAgICAgICAgQUxPR1coIndhcm5pbmc6IHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBpdC0+dHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QoKQoreworICAgIC8vIGdldCBhIHNuYXBzaG90IG9mIGVhY2ggcmVhZGVyIGFuZCBwcm9jZXNzIHRoZW0KKyAgICAvLyBUT0RPIGluc2VydCBsb2NrIGhlcmUKKyAgICBjb25zdCBzaXplX3QgbkxvZ3MgPSBtUmVhZGVycy5zaXplKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Mb2dzOyBpKyspIHsKKyAgICAgICAgc25hcHNob3RzW2ldID0gbVJlYWRlcnNbaV0tPmdldFNuYXBzaG90KCk7CisgICAgfQorICAgIC8vIFRPRE8gdW5sb2NrIGxvY2sgaGVyZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkxvZ3M7IGkrKykgeworICAgICAgICBpZiAoc25hcHNob3RzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHByb2Nlc3NTbmFwc2hvdCgqKHNuYXBzaG90c1tpXSksIGkpOworICAgICAgICB9CisgICAgfQorICAgIGNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCk7Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCkKK3sKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKGF1dG8mIGl0ZW0gOiBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgaWYgKG5vdyAtIGRhdGEuc3RhcnQgPj0ga1BlcmlvZGljTWVkaWFNZXRyaWNzUHVzaCkgeworICAgICAgICAgICAgKHZvaWQpUmVwb3J0UGVyZm9ybWFuY2U6OnNlbmRUb01lZGlhTWV0cmljcyhkYXRhKTsKKyAgICAgICAgICAgIGRhdGEucmVzZXQoKTsgICAvLyBkYXRhIGlzIHBlcnNpc3RlbnQgcGVyIHRocmVhZAorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lcmdlUmVhZGVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICAvLyBUT0RPOiBhZGQgYSBtdXRleCBhcm91bmQgbWVkaWEubG9nIGR1bXAKKyAgICAvLyBPcHRpb25zIGZvciBkdW1wc3lzCisgICAgYm9vbCBwYSA9IGZhbHNlLCBqc29uID0gZmFsc2UsIHBsb3RzID0gZmFsc2UsIHJldHJvID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZhcmcgOiBhcmdzKSB7CisgICAgICAgIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tcGEiKSkgeworICAgICAgICAgICAgcGEgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1qc29uIikpIHsKKyAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1wbG90cyIpKSB7CisgICAgICAgICAgICBwbG90cyA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnID09IFN0cmluZzE2KCItLXJldHJvIikpIHsKKyAgICAgICAgICAgIHJldHJvID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGEpIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXAoZmQsIDAgLyppbmRlbnQqLywgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpOworICAgIH0KKyAgICBpZiAoanNvbikgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcEpzb24oZmQsIG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpOworICAgIH0KKyAgICBpZiAocGxvdHMpIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBQbG90cyhmZCwgbVRocmVhZFBlcmZvcm1hbmNlRGF0YSk7CisgICAgfQorICAgIGlmIChyZXRybykgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFJldHJvKGZkLCBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5ICZlbnRyeSwgU3RyaW5nOCAqYm9keSkKK3sKKyAgICBpbnQgYXV0aG9yID0gZW50cnkuYXV0aG9yKCk7CisgICAgaWYgKGF1dGhvciA9PSAtMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEZJWE1FIE5lZWRzIGEgbG9jaworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBtUmVhZGVyc1thdXRob3JdLT5uYW1lKCkuY19zdHIoKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzOiAiLCBuYW1lKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01lcmdlVGhyZWFkOjpNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlciwgTWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKQorICAgIDogbU1lcmdlcihtZXJnZXIpLAorICAgICAgbU1lcmdlUmVhZGVyKG1lcmdlUmVhZGVyKSwKKyAgICAgIG1UaW1lb3V0VXMoMCkKK3sKK30KKworTWVyZ2VUaHJlYWQ6On5NZXJnZVRocmVhZCgpCit7CisgICAgLy8gc2V0IGV4aXQgZmxhZywgc2V0IHRpbWVvdXQgdG8gMCB0byBmb3JjZSB0aHJlYWRMb29wIHRvIGV4aXQgYW5kIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gam9pbgorICAgIHJlcXVlc3RFeGl0KCk7CisgICAgc2V0VGltZW91dFVzKDApOworICAgIGpvaW4oKTsKK30KKworYm9vbCBNZXJnZVRocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgYm9vbCBkb01lcmdlOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgICAgIC8vIElmIG1UaW1lb3V0VXMgaXMgbmVnYXRpdmUsIHdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSB1bnRpbCBpdCdzIHBvc2l0aXZlLgorICAgICAgICAvLyBJZiBpdCdzIHBvc2l0aXZlLCBtZXJnZS4gVGhlIG1pbmltdW0gcGVyaW9kIGJldHdlZW4gd2FraW5nIHRoZSBjb25kaXRpb24gdmFyaWFibGUKKyAgICAgICAgLy8gaXMgaGFuZGxlZCBpbiBBdWRpb0ZsaW5nZXI6Ok1lZGlhTG9nTm90aWZpZXI6OnRocmVhZExvb3AoKS4KKyAgICAgICAgbUNvbmQud2FpdChtTXV0ZXgpOworICAgICAgICBkb01lcmdlID0gbVRpbWVvdXRVcyA+IDA7CisgICAgICAgIG1UaW1lb3V0VXMgLT0ga1RocmVhZFNsZWVwUGVyaW9kVXM7CisgICAgfQorICAgIGlmIChkb01lcmdlKSB7CisgICAgICAgIC8vIE1lcmdlIGRhdGEgZnJvbSBhbGwgdGhlIHJlYWRlcnMKKyAgICAgICAgbU1lcmdlci5tZXJnZSgpOworICAgICAgICAvLyBQcm9jZXNzIHRoZSBkYXRhIGNvbGxlY3RlZCBieSBtTWVyZ2VyIGFuZCB3cml0ZSBpdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCisgICAgICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBjYWxsIGdldEFuZFByb2Nlc3NTbmFwc2hvdCBldmVyeSB0aW1lCisgICAgICAgIC8vIG9yIHdoZXRoZXIgdG8gaGF2ZSBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IGNhbGxzIGl0IHdpdGggYSBsb3dlciBmcmVxdWVuY3kKKyAgICAgICAgbU1lcmdlUmVhZGVyLmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNZXJnZVRocmVhZDo6d2FrZXVwKCkKK3sKKyAgICBzZXRUaW1lb3V0VXMoa1RocmVhZFdha2V1cFBlcmlvZFVzKTsKK30KKwordm9pZCBNZXJnZVRocmVhZDo6c2V0VGltZW91dFVzKGludCB0aW1lKQoreworICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgIG1UaW1lb3V0VXMgPSB0aW1lOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcCBiL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmYTNlMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxudW1lcmljPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1pbnQgTkJMb2c6OkVudHJ5Ojpjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBzbG93Ci0gICAgaWYgKG9mZnNldCA9PSAwKQotICAgICAgICByZXR1cm4gbUV2ZW50OwotICAgIGVsc2UgaWYgKG9mZnNldCA9PSAxKQotICAgICAgICByZXR1cm4gbUxlbmd0aDsKLSAgICBlbHNlIGlmIChvZmZzZXQgPCAoc2l6ZV90KSAobUxlbmd0aCArIDIpKQotICAgICAgICByZXR1cm4gKChjaGFyICopIG1EYXRhKVtvZmZzZXQgLSAyXTsKLSAgICBlbHNlIGlmIChvZmZzZXQgPT0gKHNpemVfdCkgKG1MZW5ndGggKyAyKSkKLSAgICAgICAgcmV0dXJuIG1MZW5ndGg7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qc3RhdGljKi8KLXN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6QWJzdHJhY3RFbnRyeT4gTkJMb2c6OkFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgY29uc3QgdWludDhfdCB0eXBlID0gRW50cnlJdGVyYXRvcihwdHIpLT50eXBlOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgRVZFTlRfU1RBUlRfRk1UOgotICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxGb3JtYXRFbnRyeT4oRm9ybWF0RW50cnkocHRyKSk7Ci0gICAgY2FzZSBFVkVOVF9BVURJT19TVEFURToKLSAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzoKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8SGlzdG9ncmFtRW50cnk+KEhpc3RvZ3JhbUVudHJ5KHB0cikpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJUcmllZCB0byBjcmVhdGUgQWJzdHJhY3RFbnRyeSBvZiB0eXBlICVkIiwgdHlwZSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLX0KLQotTkJMb2c6OkFic3RyYWN0RW50cnk6OkFic3RyYWN0RW50cnkoY29uc3QgdWludDhfdCAqZW50cnkpIDogbUVudHJ5KGVudHJ5KSB7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSk7Ci19Ci0KLWNvbnN0IGNoYXIgKk5CTG9nOjpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiAoY29uc3QgY2hhciopIG1FbnRyeSArIG9mZnNldG9mKGVudHJ5LCBkYXRhKTsKLX0KLQotc2l6ZV90IE5CTG9nOjpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3QgewotICAgIHJldHVybiBtRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmFyZ3MoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyBza2lwIGhhc2gKLSAgICArK2l0OwotICAgIC8vIFNraXAgYXV0aG9yIGlmIHByZXNlbnQKLSAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfQVVUSE9SKSB7Ci0gICAgICAgICsraXQ7Ci0gICAgfQotICAgIHJldHVybiBpdDsKLX0KLQotaW50NjRfdCBOQkxvZzo6Rm9ybWF0RW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKLX0KLQotTkJMb2c6OmxvZ19oYXNoX3QgTkJMb2c6OkZvcm1hdEVudHJ5OjpoYXNoKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICAvLyBza2lwIHRpbWVzdGFtcAotICAgICsraXQ7Ci0gICAgLy8gdW5hbGlnbmVkIDY0LWJpdCByZWFkIG5vdCBzdXBwb3J0ZWQKLSAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgbWVtY3B5KCZoYXNoLCBpdC0+ZGF0YSwgc2l6ZW9mKGhhc2gpKTsKLSAgICByZXR1cm4gaGFzaDsKLX0KLQotaW50IE5CTG9nOjpGb3JtYXRFbnRyeTo6YXV0aG9yKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICAvLyBza2lwIHRpbWVzdGFtcAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCBoYXNoCi0gICAgKytpdDsKLSAgICAvLyBpZiB0aGVyZSBpcyBhbiBhdXRob3IgZW50cnksIHJldHVybiBpdCwgcmV0dXJuIC0xIG90aGVyd2lzZQotICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9BVVRIT1IpIHsKLSAgICAgICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50PigpOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6Y29weVdpdGhBdXRob3IoCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIGNvcHkgZm10IHN0YXJ0IGVudHJ5Ci0gICAgaXQuY29weVRvKGRzdCk7Ci0gICAgLy8gY29weSB0aW1lc3RhbXAKLSAgICAoKytpdCkuY29weVRvKGRzdCk7ICAgIC8vIGNvcHkgaGFzaAotICAgICgrK2l0KS5jb3B5VG8oZHN0KTsKLSAgICAvLyBpbnNlcnQgYXV0aG9yIGVudHJ5Ci0gICAgc2l6ZV90IGF1dGhvckVudHJ5U2l6ZSA9IE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKGF1dGhvcik7Ci0gICAgdWludDhfdCBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemVdOwotICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCB0eXBlKV0gPSBFVkVOVF9BVVRIT1I7Ci0gICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0KLSAgICAgICAgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplICsgTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdID0KLSAgICAgICAgc2l6ZW9mKGF1dGhvcik7Ci0gICAgKihpbnQqKSAoJmF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBkYXRhKV0pID0gYXV0aG9yOwotICAgIGRzdC0+d3JpdGUoYXV0aG9yRW50cnksIGF1dGhvckVudHJ5U2l6ZSk7Ci0gICAgLy8gY29weSByZXN0IG9mIGVudHJpZXMKLSAgICB3aGlsZSAoKCsraXQpLT50eXBlICE9IEVWRU5UX0VORF9GTVQpIHsKLSAgICAgICAgaXQuY29weVRvKGRzdCk7Ci0gICAgfQotICAgIGl0LmNvcHlUbyhkc3QpOwotICAgICsraXQ7Ci0gICAgcmV0dXJuIGl0OwotfQotCi12b2lkIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpjb3B5VG8oc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0KSBjb25zdCB7Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKLSAgICBkc3QtPndyaXRlKHB0ciwgbGVuZ3RoKTsKLX0KLQotdm9pZCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6Y29weURhdGEodWludDhfdCAqZHN0KSBjb25zdCB7Ci0gICAgbWVtY3B5KCh2b2lkKikgZHN0LCBwdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSksIHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0pOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcigpCi0gICAgOiBwdHIobnVsbHB0cikge30KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpCi0gICAgOiBwdHIoZW50cnkpIHt9Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IE5CTG9nOjpFbnRyeUl0ZXJhdG9yICZvdGhlcikKLSAgICA6IHB0cihvdGhlci5wdHIpIHt9Ci0KLWNvbnN0IE5CTG9nOjplbnRyeSYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKLSAgICByZXR1cm4gKihlbnRyeSopIHB0cjsKLX0KLQotY29uc3QgTkJMb2c6OmVudHJ5KiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItPigpIGNvbnN0IHsKLSAgICByZXR1cm4gKGVudHJ5KikgcHRyOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gICAgcHRyICs9IHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yJiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItLSgpIHsKLSAgICBwdHIgLT0gcHRyW05CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om5leHQoKSBjb25zdCB7Ci0gICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOwotICAgIHJldHVybiArK2F1eDsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OnByZXYoKSBjb25zdCB7Ci0gICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOwotICAgIHJldHVybiAtLWF1eDsKLX0KLQotaW50IE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0oY29uc3QgTkJMb2c6OkVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0ciAtIG90aGVyLnB0cjsKLX0KLQotYm9vbCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICAgIHJldHVybiBwdHIgIT0gb3RoZXIucHRyOwotfQotCi1ib29sIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3QgewotICAgIHJldHVybiBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID09IHB0cltwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKLSAgICAgICAgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQgKyBOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF07Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQ2NF90IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6dGltZXN0YW1wKCkgY29uc3QgewotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS50czsKLX0KLQotTkJMb2c6OmxvZ19oYXNoX3QgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5OjpoYXNoKCkgY29uc3QgewotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS5oYXNoOwotfQotCi1pbnQgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5OjphdXRob3IoKSBjb25zdCB7Ci0gICAgRW50cnlJdGVyYXRvciBpdChtRW50cnkpOwotICAgIGlmIChpdC0+bGVuZ3RoID09IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpKSB7Ci0gICAgICAgIHJldHVybiBpdC5wYXlsb2FkPEhpc3RUc0VudHJ5V2l0aEF1dGhvcj4oKS5hdXRob3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdCB7Ci0gICAgLy8gQ3VycmVudCBoaXN0b2dyYW0gZW50cnkgaGFzIHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeSwgbGVuZ3RofS4KLSAgICAvLyBXZSBub3cgd2FudCB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yLCBsZW5ndGh9Ci0gICAgdWludDhfdCBidWZmZXJbRW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpXTsKLSAgICAvLyBDb3B5IGNvbnRlbnQgdW50aWwgdGhlIHBvaW50IHdlIHdhbnQgdG8gYWRkIHRoZSBhdXRob3IKLSAgICBtZW1jcHkoYnVmZmVyLCBtRW50cnksIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKTsKLSAgICAvLyBDb3B5IHRoZSBhdXRob3IKLSAgICAqKGludCopIChidWZmZXIgKyBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSkgPSBhdXRob3I7Ci0gICAgLy8gVXBkYXRlIGxlbmd0aHMKLSAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7Ci0gICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBkYXRhKSArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpICsgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpXQotICAgICAgICA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOwotICAgIC8vIFdyaXRlIG5ldyBidWZmZXIgaW50byBGSUZPCi0gICAgZHN0LT53cml0ZShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLm5leHQoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiAwICAgLy8gRklYTUUgc2VlIG5vdGUgaW4gTkJMb2cuaAotTkJMb2c6OlRpbWVsaW5lOjpUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkKQotICAgIDogbVNpemUocm91bmR1cChzaXplKSksIG1Pd24oc2hhcmVkID09IE5VTEwpLAotICAgICAgbVNoYXJlZCgoU2hhcmVkICopIChtT3duID8gbmV3IGNoYXJbc2hhcmVkU2l6ZShzaXplKV0gOiBzaGFyZWQpKQotewotICAgIG5ldyAobVNoYXJlZCkgU2hhcmVkOwotfQotCi1OQkxvZzo6VGltZWxpbmU6On5UaW1lbGluZSgpCi17Ci0gICAgbVNoYXJlZC0+flNoYXJlZCgpOwotICAgIGlmIChtT3duKSB7Ci0gICAgICAgIGRlbGV0ZVtdIChjaGFyICopIG1TaGFyZWQ7Ci0gICAgfQotfQotI2VuZGlmCi0KLS8qc3RhdGljKi8KLXNpemVfdCBOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZV90IHNpemUpCi17Ci0gICAgLy8gVE9ETyBmaWZvIG5vdyBzdXBwb3J0cyBub24tcG93ZXItb2YtMiBidWZmZXIgc2l6ZXMsIHNvIGNvdWxkIHJlbW92ZSB0aGUgcm91bmR1cAotICAgIHJldHVybiBzaXplb2YoU2hhcmVkKSArIHJvdW5kdXAoc2l6ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6V3JpdGVyOjpXcml0ZXIoKQotICAgIDogbVNoYXJlZChOVUxMKSwgbUZpZm8oTlVMTCksIG1GaWZvV3JpdGVyKE5VTEwpLCBtRW5hYmxlZChmYWxzZSksIG1QaWRUYWcoTlVMTCksIG1QaWRUYWdTaXplKDApCi17Ci19Ci0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKSwKLSAgICAgIG1FbmFibGVkKG1GaWZvV3JpdGVyICE9IE5VTEwpCi17Ci0gICAgLy8gY2FjaGluZyBwaWQgYW5kIHByb2Nlc3MgbmFtZQotICAgIHBpZF90IGlkID0gOjpnZXRwaWQoKTsKLSAgICBjaGFyIHByb2NOYW1lWzE2XTsKLSAgICBpbnQgc3RhdHVzID0gcHJjdGwoUFJfR0VUX05BTUUsIHByb2NOYW1lKTsKLSAgICBpZiAoc3RhdHVzKSB7ICAvLyBlcnJvciBnZXR0aW5nIHByb2Nlc3MgbmFtZQotICAgICAgICBwcm9jTmFtZVswXSA9ICdcMCc7Ci0gICAgfQotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4ocHJvY05hbWUpOwotICAgIG1QaWRUYWdTaXplID0gbGVuZ3RoICsgc2l6ZW9mKHBpZF90KTsKLSAgICBtUGlkVGFnID0gbmV3IGNoYXJbbVBpZFRhZ1NpemVdOwotICAgIG1lbWNweShtUGlkVGFnLCAmaWQsIHNpemVvZihwaWRfdCkpOwotICAgIG1lbWNweShtUGlkVGFnICsgc2l6ZW9mKHBpZF90KSwgcHJvY05hbWUsIGxlbmd0aCk7Ci19Ci0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCi0gICAgOiBXcml0ZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQotewotICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKLX0KLQotTkJMb2c6OldyaXRlcjo6fldyaXRlcigpCi17Ci0gICAgZGVsZXRlIG1GaWZvV3JpdGVyOwotICAgIGRlbGV0ZSBtRmlmbzsKLSAgICBkZWxldGVbXSBtUGlkVGFnOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaW5nID09IE5VTEwsICJBdHRlbXB0ZWQgdG8gbG9nIE5VTEwgc3RyaW5nIik7Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOwotICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1NUUklORywgc3RyaW5nLCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsgICAgIC8vIHRoZSBXcml0ZXI6OiBpcyBuZWVkZWQgdG8gYXZvaWQgdmlydHVhbCBkaXNwYXRjaCBmb3IgTG9ja2VkV3JpdGVyCi0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNoYXIgYnVmZmVyW0VudHJ5OjprTWF4TGVuZ3RoICsgMSAvKk5VTCovXTsKLSAgICBpbnQgbGVuZ3RoID0gdnNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZtdCwgYXApOwotICAgIGlmIChsZW5ndGggPj0gKGludCkgc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKGJ1ZmZlcikgLSAxOwotICAgICAgICAvLyBOVUwgdGVybWluYXRpb24gaXMgbm90IHJlcXVpcmVkCi0gICAgICAgIC8vIGJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsKLSAgICB9Ci0gICAgaWYgKGxlbmd0aCA+PSAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9TVFJJTkcsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVGltZXN0YW1wKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50NjRfdCB0cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKLSAgICBpZiAodHMgPiAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0ludGVnZXIoY29uc3QgaW50IHgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9JTlRFR0VSLCAmeCwgc2l6ZW9mKHgpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dGbG9hdChjb25zdCBmbG9hdCB4KQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfRkxPQVQsICZ4LCBzaXplb2YoeCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1BJRCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9QSUQsIG1QaWRUYWcsIG1QaWRUYWdTaXplKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oZm10KTsKLSAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7Ci0gICAgfQotICAgIGxvZyhFVkVOVF9TVEFSVF9GTVQsIGZtdCwgbGVuZ3RoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFbmQoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBFbnRyeSBlbnRyeSA9IEVudHJ5KEVWRU5UX0VORF9GTVQsIE5VTEwsIDApOwotICAgIGxvZygmZW50cnksIHRydWUpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfSEFTSCwgJmhhc2gsIHNpemVvZihoYXNoKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGlzdFRzRW50cnkgZGF0YTsKLSAgICBkYXRhLmhhc2ggPSBoYXNoOwotICAgIGRhdGEudHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKGRhdGEudHMgPiAwKSB7Ci0gICAgICAgIGxvZyhldmVudCwgJmRhdGEsIHNpemVvZihkYXRhKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGhhc2gpOwotICAgIFdyaXRlcjo6bG9nVkZvcm1hdChmbXQsIGhhc2gsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXJncCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOwotICAgIGludCBpOwotICAgIGRvdWJsZSBmOwotICAgIGNoYXIqIHM7Ci0gICAgaW50NjRfdCB0OwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKCk7Ci0gICAgV3JpdGVyOjpsb2dIYXNoKGhhc2gpOwotICAgIGZvciAoY29uc3QgY2hhciAqcCA9IGZtdDsgKnAgIT0gJ1wwJzsgcCsrKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKLSAgICAgICAgaWYgKCpwICE9ICclJykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoKCorK3ApIHsKLSAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZwotICAgICAgICAgICAgcyA9IHZhX2FyZyhhcmdwLCBjaGFyICopOwotICAgICAgICAgICAgV3JpdGVyOjpsb2cocyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCi0gICAgICAgICAgICB0ID0gdmFfYXJnKGFyZ3AsIGludDY0X3QpOwotICAgICAgICAgICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgotICAgICAgICAgICAgaSA9IHZhX2FyZyhhcmdwLCBpbnQpOwotICAgICAgICAgICAgV3JpdGVyOjpsb2dJbnRlZ2VyKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0Ci0gICAgICAgICAgICBmID0gdmFfYXJnKGFyZ3AsIGRvdWJsZSk7IC8vIGZsb2F0IGFyZ3VtZW50cyBhcmUgcHJvbW90ZWQgdG8gZG91YmxlIGluIHZhcmFyZyBsaXN0cwotICAgICAgICAgICAgV3JpdGVyOjpsb2dGbG9hdCgoZmxvYXQpZik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdwJzogLy8gcGlkCi0gICAgICAgICAgICBXcml0ZXI6OmxvZ1BJRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gdGhlICIlXDAiIGNhc2UgZmluaXNoZXMgcGFyc2luZwotICAgICAgICBjYXNlICdcMCc6Ci0gICAgICAgICAgICAtLXA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiTkJMb2cgV3JpdGVyIHBhcnNlZCBpbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXI6ICVjIiwgKnApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgV3JpdGVyOjpsb2dFbmQoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgLy8gVE9ETyBQZXJoYXBzIGl0IG1ha2VzIHNlbnNlIHRvIGRpc3BsYXkgdHJ1bmNhdGVkIGRhdGEgb3IgYXQgbGVhc3QgYQotICAgICAgICAvLyAgICAgIG1lc3NhZ2UgdGhhdCB0aGUgZGF0YSBpcyB0b28gbG9uZz8gIFRoZSBjdXJyZW50IGJlaGF2aW9yIGNhbiBjcmVhdGUKLSAgICAgICAgLy8gICAgICBhIGNvbmZ1c2lvbiBmb3IgYSBwcm9ncmFtbWVyIGRlYnVnZ2luZyB0aGVpciBjb2RlLgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIElnbm9yZSBpZiBpbnZhbGlkIGV2ZW50Ci0gICAgaWYgKGV2ZW50ID09IEVWRU5UX1JFU0VSVkVEIHx8IGV2ZW50ID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRW50cnkgZXRyKGV2ZW50LCBkYXRhLCBsZW5ndGgpOwotICAgIGxvZygmZXRyLCB0cnVlIC8qdHJ1c3RlZCovKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coY29uc3QgTkJMb2c6OkVudHJ5ICpldHIsIGJvb2wgdHJ1c3RlZCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCF0cnVzdGVkKSB7Ci0gICAgICAgIGxvZyhldHItPm1FdmVudCwgZXRyLT5tRGF0YSwgZXRyLT5tTGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzaXplX3QgbmVlZCA9IGV0ci0+bUxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQ7ICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgZGF0YVttTGVuZ3RoXSwgbUxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCA9IG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIEZJRk8KLQotICAgIC8vIEZJWE1FIG9wdGltaXplIHRoaXMgdXNpbmcgbWVtY3B5IGZvciB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBFbnRyeS4KLSAgICAvLyBUaGUgRW50cnkgY291bGQgaGF2ZSBhIG1ldGhvZCBjb3B5VG8ocHRyLCBvZmZzZXQsIHNpemUpIHRvIG9wdGltaXplIHRoZSBjb3B5LgotICAgIC8vIGNoZWNrcyBzaXplIG9mIGEgc2luZ2xlIGxvZyBFbnRyeTogdHlwZSwgbGVuZ3RoLCBkYXRhIHBvaW50ZXIgYW5kIGVuZGluZwotICAgIHVpbnQ4X3QgdGVtcFtFbnRyeTo6a01heExlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWRdOwotICAgIC8vIHdyaXRlIHRoaXMgZGF0YSB0byB0ZW1wIGFycmF5Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZWVkOyBpKyspIHsKLSAgICAgICAgdGVtcFtpXSA9IGV0ci0+Y29weUVudHJ5RGF0YUF0KGkpOwotICAgIH0KLSAgICAvLyB3cml0ZSB0byBjaXJjdWxhciBidWZmZXIKLSAgICBtRmlmb1dyaXRlci0+d3JpdGUodGVtcCwgbmVlZCk7Ci19Ci0KLWJvb2wgTkJMb2c6OldyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUVuYWJsZWQ7Ci19Ci0KLWJvb2wgTkJMb2c6OldyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAgYm9vbCBvbGQgPSBtRW5hYmxlZDsKLSAgICBtRW5hYmxlZCA9IGVuYWJsZWQgJiYgbVNoYXJlZCAhPSBOVUxMOwotICAgIHJldHVybiBvbGQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIoKQotICAgIDogV3JpdGVyKCkKLXsKLX0KLQotTkJMb2c6OkxvY2tlZFdyaXRlcjo6TG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBXcml0ZXIoc2hhcmVkLCBzaXplKQotewotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZyhzdHJpbmcpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIGZvcm1hdHRpbmcgaXMgZG9uZQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciBmb3JtYXR0aW5nIGlzIGRvbmUKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nVGltZXN0YW1wKCkKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgdGhlIGNsb2NrX2dldHRpbWUoKSBzeXNjYWxsCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAodHMpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0ludGVnZXIoY29uc3QgaW50IHgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0ludGVnZXIoeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nRmxvYXQoY29uc3QgZmxvYXQgeCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nRmxvYXQoeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nUElEKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nUElEKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOwotfQotCi0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nRW5kKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nRW5kKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nSGFzaChsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0hhc2goaGFzaCk7Ci19Ci0KLWJvb2wgTkJMb2c6OkxvY2tlZFdyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBXcml0ZXI6OmlzRW5hYmxlZCgpOwotfQotCi1ib29sIE5CTG9nOjpMb2NrZWRXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIFdyaXRlcjo6c2V0RW5hYmxlZChlbmFibGVkKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6c3RhcnRpbmdUeXBlcyB7TkJMb2c6OkV2ZW50OjpFVkVOVF9TVEFSVF9GTVQsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKLWNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6ZW5kaW5nVHlwZXMgICB7TkJMb2c6OkV2ZW50OjpFVkVOVF9FTkRfRk1ULAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9BVURJT19TVEFURX07Ci0KLU5CTG9nOjpSZWFkZXI6OlJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogbUZkKC0xKSwgbUluZGVudCgwKSwgbUxvc3QoMCksCi0gICAgICBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLwotICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KLSAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAotICAgICAgbUZpZm9SZWFkZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3JlYWRlcigqbUZpZm8pIDogTlVMTCkKLXsKLX0KLQotTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKLSAgICA6IFJlYWRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCi17Ci0gICAgbUlNZW1vcnkgPSBpTWVtb3J5OwotfQotCi1OQkxvZzo6UmVhZGVyOjp+UmVhZGVyKCkKLXsKLSAgICBkZWxldGUgbUZpZm9SZWFkZXI7Ci0gICAgZGVsZXRlIG1GaWZvOwotfQotCi1jb25zdCB1aW50OF90ICpOQkxvZzo6UmVhZGVyOjpmaW5kTGFzdEVudHJ5T2ZUeXBlcyhjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcykgewotICAgIHdoaWxlIChiYWNrICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldCA+PSBmcm9udCkgewotICAgICAgICBjb25zdCB1aW50OF90ICpwcmV2ID0gYmFjayAtIGJhY2tbRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gLSBFbnRyeTo6a092ZXJoZWFkOwotICAgICAgICBpZiAocHJldiA8IGZyb250IHx8IHByZXYgKyBwcmV2W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnk6OmtPdmVyaGVhZCAhPSBiYWNrKSB7Ci0KLSAgICAgICAgICAgIC8vIHByZXYgcG9pbnRzIHRvIGFuIG91dCBvZiBsaW1pdHMgb3IgaW5jb25zaXN0ZW50IGVudHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZXMuZmluZCgoY29uc3QgRXZlbnQpIHByZXZbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSkgIT0gdHlwZXMuZW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBwcmV2OwotICAgICAgICB9Ci0gICAgICAgIGJhY2sgPSBwcmV2OwotICAgIH0KLSAgICByZXR1cm4gbnVsbHB0cjsgLy8gbm8gZW50cnkgZm91bmQKLX0KLQotLy8gQ29waWVzIGNvbnRlbnQgb2YgYSBSZWFkZXIgRklGTyBpbnRvIGl0cyBTbmFwc2hvdAotLy8gVGhlIFNuYXBzaG90IGhhcyB0aGUgc2FtZSByYXcgZGF0YSwgYnV0IHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2YgZW50cmllcwotLy8gYW5kIGFuIEVudHJ5SXRlcmF0b3IgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHByb2Nlc3MgdGhlIGRhdGEuCi1zdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+IE5CTG9nOjpSZWFkZXI6OmdldFNuYXBzaG90KCkKLXsKLSAgICBpZiAobUZpZm9SZWFkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7Ci0gICAgfQotICAgIC8vIG1ha2UgYSBjb3B5IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIHdpdGggd3JpdGVyCi0gICAgc2l6ZV90IGNhcGFjaXR5ID0gbUZpZm8tPmNhcGFjaXR5KCk7Ci0KLSAgICAvLyBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvdXIgb2YgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6OnJlYWQsIGJ1dCB3aXRob3V0IGluY3JlbWVudGluZyB0aGUKLSAgICAvLyByZWFkZXIgaW5kZXguIFRoZSBpbmRleCBpcyBpbmNyZW1lbnRlZCBhZnRlciBoYW5kbGluZyBjb3JydXB0aW9uLCB0byBhZnRlciB0aGUgbGFzdCBjb21wbGV0ZQotICAgIC8vIGVudHJ5IG9mIHRoZSBidWZmZXIKLSAgICBzaXplX3QgbG9zdDsKLSAgICBhdWRpb191dGlsc19pb3ZlYyBpb3ZlY1syXTsKLSAgICBzc2l6ZV90IGF2YWlsVG9SZWFkID0gbUZpZm9SZWFkZXItPm9idGFpbihpb3ZlYywgY2FwYWNpdHksIE5VTEwgLyp0aW1lb3V0Ki8sICZsb3N0KTsKLSAgICBpZiAoYXZhaWxUb1JlYWQgPD0gMCkgewotICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7Ci0gICAgfQotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdChuZXcgU25hcHNob3QoYXZhaWxUb1JlYWQpKTsKLSAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhLCAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1swXS5tT2Zmc2V0LCBpb3ZlY1swXS5tTGVuZ3RoKTsKLSAgICBpZiAoaW92ZWNbMV0ubUxlbmd0aCA+IDApIHsKLSAgICAgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSArIChpb3ZlY1swXS5tTGVuZ3RoKSwKLSAgICAgICAgICAgIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzFdLm1PZmZzZXQsIGlvdmVjWzFdLm1MZW5ndGgpOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBjb3JydXB0ZWQgYnVmZmVyCi0gICAgLy8gUG90ZW50aWFsbHksIGEgYnVmZmVyIGhhcyBjb3JydXB0ZWQgZGF0YSBvbiBib3RoIGJlZ2lubmluZyAoZHVlIHRvIG92ZXJmbG93KSBhbmQgZW5kCi0gICAgLy8gKGR1ZSB0byBpbmNvbXBsZXRlIGZvcm1hdCBlbnRyeSkuIEJ1dCBldmVuIGlmIHRoZSBlbmQgZm9ybWF0IGVudHJ5IGlzIGluY29tcGxldGUsCi0gICAgLy8gaXQgZW5kcyBpbiBhIGNvbXBsZXRlIGVudHJ5ICh3aGljaCBpcyBub3QgYW4gRU5EX0ZNVCkuIFNvIGlzIHNhZmUgdG8gdHJhdmVyc2UgYmFja3dhcmRzLgotICAgIC8vIFRPRE86IGhhbmRsZSBjbGllbnQgY29ycnVwdGlvbiAoaW4gdGhlIG1pZGRsZSBvZiBhIGJ1ZmZlcikKLQotICAgIGNvbnN0IHVpbnQ4X3QgKmJhY2sgPSBzbmFwc2hvdC0+bURhdGEgKyBhdmFpbFRvUmVhZDsKLSAgICBjb25zdCB1aW50OF90ICpmcm9udCA9IHNuYXBzaG90LT5tRGF0YTsKLQotICAgIC8vIEZpbmQgbGFzdCBFTkRfRk1ULiA8YmFjaz4gaXMgc2l0dGluZyBvbiBhbiBlbnRyeSB3aGljaCBtaWdodCBiZSB0aGUgbWlkZGxlIG9mIGEgRm9ybWF0RW50cnkuCi0gICAgLy8gV2UgZ28gYmFja3dhcmRzIHVudGlsIHdlIGZpbmQgYW4gRVZFTlRfRU5EX0ZNVC4KLSAgICBjb25zdCB1aW50OF90ICpsYXN0RW5kID0gZmluZExhc3RFbnRyeU9mVHlwZXMoZnJvbnQsIGJhY2ssIGVuZGluZ1R5cGVzKTsKLSAgICBpZiAobGFzdEVuZCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHNuYXBzaG90LT5tRW5kID0gc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZnJvbnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGVuZCBvZiBzbmFwc2hvdCBwb2ludHMgdG8gYWZ0ZXIgbGFzdCBFTkRfRk1UIGVudHJ5Ci0gICAgICAgIHNuYXBzaG90LT5tRW5kID0gRW50cnlJdGVyYXRvcihsYXN0RW5kKS5uZXh0KCk7Ci0gICAgICAgIC8vIGZpbmQgZmlyc3QgU1RBUlRfRk1UCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnQgPSBudWxscHRyOwotICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0VG1wID0gc25hcHNob3QtPm1FbmQ7Ci0gICAgICAgIHdoaWxlICgoZmlyc3RTdGFydFRtcCA9IGZpbmRMYXN0RW50cnlPZlR5cGVzKGZyb250LCBmaXJzdFN0YXJ0VG1wLCBzdGFydGluZ1R5cGVzKSkKLSAgICAgICAgICAgICAgICAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBmaXJzdFN0YXJ0ID0gZmlyc3RTdGFydFRtcDsKLSAgICAgICAgfQotICAgICAgICAvLyBmaXJzdFN0YXJ0IGlzIG51bGwgaWYgbm8gU1RBUlRfRk1UIGVudHJ5IHdhcyBmb3VuZCBiZWZvcmUgbGFzdEVuZAotICAgICAgICBpZiAoZmlyc3RTdGFydCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gc25hcHNob3QtPm1FbmQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmaXJzdFN0YXJ0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGFkdmFuY2UgZmlmbyByZWFkZXIgaW5kZXggdG8gYWZ0ZXIgbGFzdCBlbnRyeSByZWFkLgotICAgIG1GaWZvUmVhZGVyLT5yZWxlYXNlKHNuYXBzaG90LT5tRW5kIC0gZnJvbnQpOwotCi0gICAgc25hcHNob3QtPm1Mb3N0ID0gbG9zdDsKLSAgICByZXR1cm4gc25hcHNob3Q7Ci0KLX0KLQotLy8gVGFrZXMgcmF3IGNvbnRlbnQgb2YgdGhlIGxvY2FsIG1lcmdlciBGSUZPLCBwcm9jZXNzZXMgbG9nIGVudHJpZXMsIGFuZAotLy8gd3JpdGVzIHRoZSBkYXRhIHRvIGEgbWFwIG9mIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXMsIGJhc2VkIG9uIHRoZWlyIHRocmVhZCBJRC4KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QoTkJMb2c6OlJlYWRlcjo6U25hcHNob3QgJnNuYXBzaG90KQotewotICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OwotCi0gICAgZm9yIChhdXRvIGVudHJ5ID0gc25hcHNob3QuYmVnaW4oKTsgZW50cnkgIT0gc25hcHNob3QuZW5kKCk7KSB7Ci0gICAgICAgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKLSAgICAgICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6Ci0gICAgICAgICAgICBlbnRyeSA9IGhhbmRsZUZvcm1hdChGb3JtYXRFbnRyeShlbnRyeSksICZ0aW1lc3RhbXAsICZib2R5KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzogewotICAgICAgICAgICAgSGlzdFRzRW50cnlXaXRoQXV0aG9yICpkYXRhID0gKEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqKSAoZW50cnktPmRhdGEpOwotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG1lbWNwaWVzIGFyZSBoZXJlIHRvIGF2b2lkIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGNyYXNoLgotICAgICAgICAgICAgLy8gVGhlcmUncyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyBpdAotICAgICAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICAgICAgbWVtY3B5KCZoYXNoLCAmKGRhdGEtPmhhc2gpLCBzaXplb2YoaGFzaCkpOwotICAgICAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgICAgIG1lbWNweSgmdHMsICZkYXRhLT50cywgc2l6ZW9mKHRzKSk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBoYXNoIGZvciBoaXN0b2dyYW0gdHMgYW5kIGF1ZGlvIHN0YXRlIG5lZWQgdG8gbWF0Y2gKLSAgICAgICAgICAgIC8vIGFuZCBjb3JyZXNwb25kIHRvIGF1ZGlvIHByb2R1Y3Rpb24gc291cmNlIGZpbGUgbG9jYXRpb24KLSAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2RhdGEtPmF1dGhvcl1bMCAvKmhhc2gqL10ubG9nVHNFbnRyeSh0cyk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURTogewotICAgICAgICAgICAgSGlzdFRzRW50cnlXaXRoQXV0aG9yICpkYXRhID0gKEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqKSAoZW50cnktPmRhdGEpOwotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG1lbWNwaWVzIGFyZSBoZXJlIHRvIGF2b2lkIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGNyYXNoLgotICAgICAgICAgICAgLy8gVGhlcmUncyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyBpdAotICAgICAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICAgICAgbWVtY3B5KCZoYXNoLCAmKGRhdGEtPmhhc2gpLCBzaXplb2YoaGFzaCkpOwotICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRzIGlmIHVudXNlZAotICAgICAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgICAgIG1lbWNweSgmdHMsICZkYXRhLT50cywgc2l6ZW9mKHRzKSk7Ci0gICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1tkYXRhLT5hdXRob3JdWzAgLypoYXNoKi9dLmhhbmRsZVN0YXRlQ2hhbmdlKCk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBFVkVOVF9FTkRfRk1UOgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IGdvdCB0byBlbmQgZm9ybWF0IGV2ZW50Iik7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogdW5leHBlY3RlZCBldmVudCAlZCIsIGVudHJ5LT50eXBlKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gcHJpbnQgdGhlIHdhcm5pbmdzIGhlcmUgb3IgZWxzZXdoZXJlCi0gICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgewotICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpCi17Ci0gICAgLy8gZ2V0IGEgc25hcHNob3QsIHByb2Nlc3MgaXQKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXAgPSBnZXRTbmFwc2hvdCgpOwotICAgIGdldEFuZFByb2Nlc3NTbmFwc2hvdCgqc25hcCk7Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpkdW1wKGludCBmZCwgaW50IGluZGVudCkgewotICAgIC8vIFRPRE86IGFkZCBhIG11dGV4IGFyb3VuZCBtZWRpYS5sb2cgZHVtcAotICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wKGZkLCBpbmRlbnQsIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKLX0KLQotLy8gV3JpdGVzIGEgc3RyaW5nIHRvIHRoZSBjb25zb2xlCi12b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXBMaW5lKGNvbnN0IFN0cmluZzggJnRpbWVzdGFtcCwgU3RyaW5nOCAmYm9keSkKLXsKLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgZHByaW50ZihtRmQsICIlLipzJXMgJXNcbiIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCIlLipzJXMgJXMiLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKLSAgICB9Ci0gICAgYm9keS5jbGVhcigpOwotfQotCi1ib29sIE5CTG9nOjpSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKLXsKLSAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE5CTG9nOjphcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGludDY0X3QgdHM7Ci0gICAgbWVtY3B5KCZ0cywgZGF0YSwgc2l6ZW9mKHRzKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKLX0KLQotdm9pZCBOQkxvZzo6YXBwZW5kSW50KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBpbnQgeCA9ICooKGludCopIGRhdGEpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVkPiIsIHgpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgZmxvYXQgZjsKLSAgICBtZW1jcHkoJmYsIGRhdGEsIHNpemVvZihmbG9hdCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVmPiIsIGYpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICAgIHBpZF90IGlkID0gKigocGlkX3QqKSBkYXRhKTsKLSAgICBjaGFyICogbmFtZSA9ICYoKGNoYXIqKSBkYXRhKVtzaXplb2YocGlkX3QpXTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjxQSUQ6ICVkLCBuYW1lOiAlLipzPiIsIGlkLCAoaW50KSAobGVuZ3RoIC0gc2l6ZW9mKHBpZF90KSksIG5hbWUpOwotfQotCi1TdHJpbmc4IE5CTG9nOjpidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCi17Ci0gICAgU3RyaW5nOCBzdHI7Ci0gICAgc3RyLmFwcGVuZCgiWyAiKTsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJWQgIiwgYnVmZmVyW2ldKTsKLSAgICB9Ci0gICAgc3RyLmFwcGVuZCgiXSIpOwotICAgIHJldHVybiBzdHI7Ci19Ci0KLVN0cmluZzggTkJMb2c6OmJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpCi17Ci0gICAgcmV0dXJuIGJ1ZmZlckR1bXAoaXQsIGl0LT5sZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkKTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OlJlYWRlcjo6aGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKmJvZHkpIHsKLSAgICAvLyBsb2cgdGltZXN0YW1wCi0gICAgaW50NjRfdCB0cyA9IGZtdEVudHJ5LnRpbWVzdGFtcCgpOwotICAgIHRpbWVzdGFtcC0+Y2xlYXIoKTsKLSAgICB0aW1lc3RhbXAtPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Ci0KLSAgICAvLyBsb2cgdW5pcXVlIGhhc2gKLSAgICBsb2dfaGFzaF90IGhhc2ggPSBmbXRFbnRyeS5oYXNoKCk7Ci0gICAgLy8gcHJpbnQgb25seSBsb3dlciAxNmJpdCBvZiBoYXNoIGFzIGhleCBhbmQgbGluZSBhcyBpbnQgdG8gcmVkdWNlIHNwYW0gaW4gdGhlIGxvZwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS40WC0lZCAiLCAoaW50KShoYXNoID4+IDE2KSAmIDB4RkZGRiwgKGludCkgaGFzaCAmIDB4RkZGRik7Ci0KLSAgICAvLyBsb2cgYXV0aG9yIChpZiBwcmVzZW50KQotICAgIGhhbmRsZUF1dGhvcihmbXRFbnRyeSwgYm9keSk7Ci0KLSAgICAvLyBsb2cgc3RyaW5nCi0gICAgTkJMb2c6OkVudHJ5SXRlcmF0b3IgYXJnID0gZm10RW50cnkuYXJncygpOwotCi0gICAgY29uc3QgY2hhciogZm10ID0gZm10RW50cnkuZm9ybWF0U3RyaW5nKCk7Ci0gICAgc2l6ZV90IGZtdF9sZW5ndGggPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmdMZW5ndGgoKTsKLQotICAgIGZvciAoc2l6ZV90IGZtdF9vZmZzZXQgPSAwOyBmbXRfb2Zmc2V0IDwgZm10X2xlbmd0aDsgKytmbXRfb2Zmc2V0KSB7Ci0gICAgICAgIGlmIChmbXRbZm10X29mZnNldF0gIT0gJyUnKSB7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoJmZtdFtmbXRfb2Zmc2V0XSwgMSk7IC8vIFRPRE8gb3B0aW1pemUgdG8gd3JpdGUgY29uc2VjdXRpdmUgc3RyaW5ncyBhdCBvbmNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjYXNlICIlJSIiCi0gICAgICAgIGlmIChmbXRbKytmbXRfb2Zmc2V0XSA9PSAnJScpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgiJSIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2FzZSAiJVwwIgotICAgICAgICBpZiAoZm10X29mZnNldCA9PSBmbXRfbGVuZ3RoKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE5CTG9nOjpFdmVudCBldmVudCA9IChOQkxvZzo6RXZlbnQpIGFyZy0+dHlwZTsKLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGFyZy0+bGVuZ3RoOwotCi0gICAgICAgIC8vIFRPRE8gY2hlY2sgbGVuZ3RoIGZvciBldmVudCB0eXBlIGlzIGNvcnJlY3QKLQotICAgICAgICBpZiAoZXZlbnQgPT0gRVZFTlRfRU5EX0ZNVCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdHVtID0gYXJnLT5kYXRhOyAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGV2ZW50IGFyZ3MKLSAgICAgICAgc3dpdGNoKGZtdFtmbXRfb2Zmc2V0XSkKLSAgICAgICAgewotICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHN0cmluZyBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYm9keS0+YXBwZW5kKChjb25zdCBjaGFyKikgZGF0dW0sIGxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9USU1FU1RBTVAsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHRpbWVzdGFtcCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kVGltZXN0YW1wKGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9JTlRFR0VSLAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBpbnRlZ2VyIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRJbnQoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0Ci0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTE9BVCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgZmxvYXQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZEZsb2F0KGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1BJRCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgcGlkIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRQSUQoYm9keSwgZGF0dW0sIGxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIk5CTG9nIFJlYWRlciBlbmNvdW50ZXJlZCB1bmtub3duIGNoYXJhY3RlciAlYyIsIGZtdFtmbXRfb2Zmc2V0XSk7Ci0gICAgICAgIH0KLSAgICAgICAgKythcmc7Ci0gICAgfQotICAgIEFMT0dXX0lGKGFyZy0+dHlwZSAhPSBFVkVOVF9FTkRfRk1ULCAiRXhwZWN0ZWQgZW5kIG9mIGZvcm1hdCwgZ290ICVkIiwgYXJnLT50eXBlKTsKLSAgICArK2FyZzsKLSAgICByZXR1cm4gYXJnOwotfQotCi1OQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6Ci0gICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpCi0gICAgICB7fQotCi12b2lkIE5CTG9nOjpNZXJnZXI6OmFkZFJlYWRlcihjb25zdCBOQkxvZzo6TmFtZWRSZWFkZXIgJnJlYWRlcikgewotCi0gICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgYmluZGVyIHRocmVhZCBpbiBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyCi0gICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1OYW1lZFJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgotICAgIG1OYW1lZFJlYWRlcnMucHVzaF9iYWNrKHJlYWRlcik7Ci19Ci0KLS8vIGl0ZW1zIHBsYWNlZCBpbiBwcmlvcml0eSBxdWV1ZSBkdXJpbmcgbWVyZ2UKLS8vIGNvbXBvc2VkIGJ5IGEgdGltZXN0YW1wIGFuZCB0aGUgaW5kZXggb2YgdGhlIHNuYXBzaG90IHdoZXJlIHRoZSB0aW1lc3RhbXAgY2FtZSBmcm9tCi1zdHJ1Y3QgTWVyZ2VJdGVtCi17Ci0gICAgaW50NjRfdCB0czsKLSAgICBpbnQgaW5kZXg7Ci0gICAgTWVyZ2VJdGVtKGludDY0X3QgdHMsIGludCBpbmRleCk6IHRzKHRzKSwgaW5kZXgoaW5kZXgpIHt9Ci19OwotCi0vLyBvcGVyYXRvcnMgbmVlZGVkIGZvciBwcmlvcml0eSBxdWV1ZSBpbiBtZXJnZQotLy8gYm9vbCBvcGVyYXRvcj4oY29uc3QgaW50NjRfdCAmdDEsIGNvbnN0IGludDY0X3QgJnQyKSB7Ci0vLyAgICAgcmV0dXJuIHQxLnR2X3NlYyA+IHQyLnR2X3NlYyB8fCAodDEudHZfc2VjID09IHQyLnR2X3NlYyAmJiB0MS50dl9uc2VjID4gdDIudHZfbnNlYyk7Ci0vLyB9Ci0KLWJvb2wgb3BlcmF0b3I+KGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkxLCBjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMikgewotICAgIHJldHVybiBpMS50cyA+IGkyLnRzIHx8IChpMS50cyA9PSBpMi50cyAmJiBpMS5pbmRleCA+IGkyLmluZGV4KTsKLX0KLQotLy8gTWVyZ2UgcmVnaXN0ZXJlZCByZWFkZXJzLCBzb3J0ZWQgYnkgdGltZXN0YW1wLCBhbmQgd3JpdGUgZGF0YSB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeQotdm9pZCBOQkxvZzo6TWVyZ2VyOjptZXJnZSgpIHsKLSAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBtZXJnZSB0aHJlYWQKLSAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbU5hbWVkUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCi0gICAgaW50IG5Mb2dzID0gbU5hbWVkUmVhZGVycy5zaXplKCk7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKLSAgICBzdGQ6OnZlY3RvcjxOQkxvZzo6RW50cnlJdGVyYXRvcj4gb2Zmc2V0cyhuTG9ncyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKSB7Ci0gICAgICAgIHNuYXBzaG90c1tpXSA9IG1OYW1lZFJlYWRlcnNbaV0ucmVhZGVyKCktPmdldFNuYXBzaG90KCk7Ci0gICAgICAgIG9mZnNldHNbaV0gPSBzbmFwc2hvdHNbaV0tPmJlZ2luKCk7Ci0gICAgfQotICAgIC8vIGluaXRpYWxpemUgb2Zmc2V0cwotICAgIC8vIFRPRE8gY3VzdG9tIGhlYXAgaW1wbGVtZW50YXRpb24gY291bGQgYWxsb3cgdG8gdXBkYXRlIHRvcCwgaW1wcm92aW5nIHBlcmZvcm1hbmNlCi0gICAgLy8gZm9yIGJ1cnN0eSBidWZmZXJzCi0gICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxNZXJnZUl0ZW0sIHN0ZDo6dmVjdG9yPE1lcmdlSXRlbT4sIHN0ZDo6Z3JlYXRlcjxNZXJnZUl0ZW0+PiB0aW1lc3RhbXBzOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkKLSAgICB7Ci0gICAgICAgIGlmIChvZmZzZXRzW2ldICE9IHNuYXBzaG90c1tpXS0+ZW5kKCkpIHsKLSAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaV0pLT50aW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAoIXRpbWVzdGFtcHMuZW1wdHkoKSkgewotICAgICAgICAvLyBmaW5kIG1pbmltdW0gdGltZXN0YW1wCi0gICAgICAgIGludCBpbmRleCA9IHRpbWVzdGFtcHMudG9wKCkuaW5kZXg7Ci0gICAgICAgIC8vIGNvcHkgaXQgdG8gdGhlIGxvZywgaW5jcmVhc2luZyBvZmZzZXQKLSAgICAgICAgb2Zmc2V0c1tpbmRleF0gPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+Y29weVdpdGhBdXRob3IobUZpZm9Xcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLSAgICAgICAgLy8gdXBkYXRlIGRhdGEgc3RydWN0dXJlcwotICAgICAgICB0aW1lc3RhbXBzLnBvcCgpOwotICAgICAgICBpZiAob2Zmc2V0c1tpbmRleF0gIT0gc25hcHNob3RzW2luZGV4XS0+ZW5kKCkpIHsKLSAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+dGltZXN0YW1wKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotY29uc3Qgc3RkOjp2ZWN0b3I8TkJMb2c6Ok5hbWVkUmVhZGVyPiYgTkJMb2c6Ok1lcmdlcjo6Z2V0TmFtZWRSZWFkZXJzKCkgY29uc3QgewotICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCi0gICAgcmV0dXJuIG1OYW1lZFJlYWRlcnM7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TWVyZ2VSZWFkZXI6Ok1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKQotICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSksIG1OYW1lZFJlYWRlcnMobWVyZ2VyLmdldE5hbWVkUmVhZGVycygpKSB7fQotCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6aGFuZGxlQXV0aG9yKGNvbnN0IE5CTG9nOjpBYnN0cmFjdEVudHJ5ICZlbnRyeSwgU3RyaW5nOCAqYm9keSkgewotICAgIGludCBhdXRob3IgPSBlbnRyeS5hdXRob3IoKTsKLSAgICAvLyBGSVhNRSBOZWVkcyBhIGxvY2sKLSAgICBjb25zdCBjaGFyKiBuYW1lID0gbU5hbWVkUmVhZGVyc1thdXRob3JdLm5hbWUoKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzOiAiLCBuYW1lKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpNZXJnZVRocmVhZDo6TWVyZ2VUaHJlYWQoTkJMb2c6Ok1lcmdlciAmbWVyZ2VyLCBOQkxvZzo6TWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKQotICAgIDogbU1lcmdlcihtZXJnZXIpLAotICAgICAgbU1lcmdlUmVhZGVyKG1lcmdlUmVhZGVyKSwKLSAgICAgIG1UaW1lb3V0VXMoMCkge30KLQotTkJMb2c6Ok1lcmdlVGhyZWFkOjp+TWVyZ2VUaHJlYWQoKSB7Ci0gICAgLy8gc2V0IGV4aXQgZmxhZywgc2V0IHRpbWVvdXQgdG8gMCB0byBmb3JjZSB0aHJlYWRMb29wIHRvIGV4aXQgYW5kIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gam9pbgotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgc2V0VGltZW91dFVzKDApOwotICAgIGpvaW4oKTsKLX0KLQotYm9vbCBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnRocmVhZExvb3AoKSB7Ci0gICAgYm9vbCBkb01lcmdlOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgICAgIC8vIElmIG1UaW1lb3V0VXMgaXMgbmVnYXRpdmUsIHdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSB1bnRpbCBpdCdzIHBvc2l0aXZlLgotICAgICAgICAvLyBJZiBpdCdzIHBvc2l0aXZlLCB3YWl0IGtUaHJlYWRTbGVlcFBlcmlvZFVzIGFuZCB0aGVuIG1lcmdlCi0gICAgICAgIG5zZWNzX3Qgd2FpdFRpbWUgPSBtVGltZW91dFVzID4gMCA/IGtUaHJlYWRTbGVlcFBlcmlvZFVzICogMTAwMCA6IExMT05HX01BWDsKLSAgICAgICAgbUNvbmQud2FpdFJlbGF0aXZlKG1NdXRleCwgd2FpdFRpbWUpOwotICAgICAgICBkb01lcmdlID0gbVRpbWVvdXRVcyA+IDA7Ci0gICAgICAgIG1UaW1lb3V0VXMgLT0ga1RocmVhZFNsZWVwUGVyaW9kVXM7Ci0gICAgfQotICAgIGlmIChkb01lcmdlKSB7Ci0gICAgICAgIC8vIE1lcmdlIGRhdGEgZnJvbSBhbGwgdGhlIHJlYWRlcnMKLSAgICAgICAgbU1lcmdlci5tZXJnZSgpOwotICAgICAgICAvLyBQcm9jZXNzIHRoZSBkYXRhIGNvbGxlY3RlZCBieSBtTWVyZ2VyIGFuZCB3cml0ZSBpdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCi0gICAgICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBjYWxsIGdldEFuZFByb2Nlc3NTbmFwc2hvdCBldmVyeSB0aW1lCi0gICAgICAgIC8vIG9yIHdoZXRoZXIgdG8gaGF2ZSBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IGNhbGxzIGl0IHdpdGggYSBsb3dlciBmcmVxdWVuY3kKLSAgICAgICAgbU1lcmdlUmVhZGVyLmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VUaHJlYWQ6Ondha2V1cCgpIHsKLSAgICBzZXRUaW1lb3V0VXMoa1RocmVhZFdha2V1cFBlcmlvZFVzKTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnNldFRpbWVvdXRVcyhpbnQgdGltZSkgewotICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgIG1UaW1lb3V0VXMgPSB0aW1lOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIGIvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKaW5kZXggZjA5ZTkzZC4uZTkxYTUxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKKysrIGIvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKQEAgLTE3LDEzICsxNywxNiBAQAogCiAjZGVmaW5lIExPR19UQUcgIlBlcmZvcm1hbmNlQW5hbHlzaXMiCiAvLyAjZGVmaW5lIExPR19OREVCVUcgMAorLy8gI2RlZmluZSBXUklURV9UT19GSUxFCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KICNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTMyLDIwICszNSwxMjYgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0xvZ1Bsb3QuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDx1dGlsaXR5PgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CiAKK3ZvaWQgSGlzdG9ncmFtOjphZGQoZG91YmxlIHZhbHVlKQoreworICAgIGlmIChtQmluU2l6ZSA8PSAwIHx8IG1CaW5zLnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBUT0RPIEhhbmRsZSBkb21haW4gYW5kIHJhbmdlIGVycm9yIGV4Y2VwdGlvbnM/CisgICAgY29uc3QgaW50IHVuYm91bmRlZEluZGV4ID0gbHJvdW5kKCh2YWx1ZSAtIG1Mb3cpIC8gbUJpblNpemUpICsgMTsKKyAgICAvLyBzdGQ6OmNsYW1wIGlzIGludHJvZHVjZWQgaW4gQysrMTcKKyAgICAvL2NvbnN0IGludCBpbmRleCA9IHN0ZDo6Y2xhbXAodW5ib3VuZGVkSW5kZXgsIDAsIChpbnQpKG1CaW5zLnNpemUoKSAtIDEpKTsKKyAgICBjb25zdCBpbnQgaW5kZXggPSBzdGQ6Om1heCgwLCBzdGQ6Om1pbigoaW50KShtQmlucy5zaXplKCkgLSAxKSwgdW5ib3VuZGVkSW5kZXgpKTsKKyAgICBtQmluc1tpbmRleF0rKzsKKyAgICBtVG90YWxDb3VudCsrOworfQorCit2b2lkIEhpc3RvZ3JhbTo6Y2xlYXIoKQoreworICAgIHN0ZDo6ZmlsbChtQmlucy5iZWdpbigpLCBtQmlucy5lbmQoKSwgMCk7CisgICAgbVRvdGFsQ291bnQgPSAwOworfQorCit1aW50NjRfdCBIaXN0b2dyYW06OnRvdGFsQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtVG90YWxDb3VudDsKK30KKworc3RkOjpzdHJpbmcgSGlzdG9ncmFtOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0RpdmlkZXIgPSAnfCc7CisgICAgc3MgPDwga1ZlcnNpb24gPDwgIiwiIDw8IG1CaW5TaXplIDw8ICIsIiA8PCBtTnVtQmlucyA8PCAiLCIgPDwgbUxvdyA8PCAiLHsiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1CaW5zW2ldICE9IDApIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBzcyA8PCAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcyA8PCBzdGF0aWNfY2FzdDxpbnQ+KGkpIC0gMSA8PCBrRGl2aWRlciA8PCBtQmluc1tpXTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgc3MgPDwgIn0iOworCisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCitzdGQ6OnN0cmluZyBIaXN0b2dyYW06OmFzY2lpQXJ0U3RyaW5nKHNpemVfdCBpbmRlbnQpIGNvbnN0IHsKKyAgICBpZiAodG90YWxDb3VudCgpID09IDAgfHwgbUJpblNpemUgPD0gMCB8fCBtQmlucy5zaXplKCkgPCAyKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga01hcmtlciA9ICctJzsKKyAgICAvLyBPbmUgaW5jcmVtZW50IGlzIGNvbnNpZGVyZWQgb25lIHN0ZXAgb2YgYSBiaW4ncyBoZWlnaHQuCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01hcmtlcnNQZXJJbmNyZW1lbnQgPSAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhJbmNyZW1lbnRzID0gNjQgKyAxOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhOdW1iZXJXaWR0aCA9IDc7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtNYXJrZXJzKGtNYXJrZXJzUGVySW5jcmVtZW50ICoga01heEluY3JlbWVudHMsIGtNYXJrZXIpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrU3BhY2VzKGtNYXJrZXJzUGVySW5jcmVtZW50ICoga01heEluY3JlbWVudHMsICcgJyk7CisgICAgLy8gZ2V0IHRoZSBsYXN0IG4gY2hhcmFjdGVycyBvZiBzLCBvciB0aGUgd2hvbGUgc3RyaW5nIGlmIGl0IGlzIHNob3J0ZXIKKyAgICBhdXRvIGdldFRhaWwgPSBbXShjb25zdCBzaXplX3QgbiwgY29uc3Qgc3RkOjpzdHJpbmcgJnMpIHsKKyAgICAgICAgcmV0dXJuIHMuY19zdHIoKSArIHMuc2l6ZSgpIC0gc3RkOjptaW4obiwgcy5zaXplKCkpOworICAgIH07CisKKyAgICAvLyBTaW5jZSB0b3RhbENvdW50KCkgPiAwLCBtQmlucyBpcyBub3QgZW1wdHkgYW5kIG1heENvdW50ID4gMC4KKyAgICBjb25zdCB1bnNpZ25lZCBtYXhDb3VudCA9ICpzdGQ6Om1heF9lbGVtZW50KG1CaW5zLmJlZ2luKCksIG1CaW5zLmVuZCgpKTsKKyAgICBjb25zdCBzaXplX3QgbWF4SW5jcmVtZW50cyA9IGxvZzIobWF4Q291bnQpICsgMTsKKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgLy8gTm9uLXplcm8gYmlucyBtdXN0IGV4aXN0IGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB0b3RhbENvdW50KCkgPiAwLgorICAgIHNpemVfdCBmaXJzdE5vblplcm9CaW4gPSAwOworICAgIC8vIElmIGZpcnN0Tm9uWmVyb0JpbiByZWFjaGVzIG1CaW5zLnNpemUoKSAtIDEsIHRoZW4gaXQgbXVzdCBiZSBhIG5vbnplcm8gYmluLgorICAgIGZvciAoOyBmaXJzdE5vblplcm9CaW4gPCBtQmlucy5zaXplKCkgLSAxICYmIG1CaW5zW2ZpcnN0Tm9uWmVyb0Jpbl0gPT0gMDsgZmlyc3ROb25aZXJvQmluKyspIHt9CisgICAgY29uc3Qgc2l6ZV90IGZpcnN0QmluVG9QcmludCA9IGZpcnN0Tm9uWmVyb0JpbiA9PSAwID8gMCA6IGZpcnN0Tm9uWmVyb0JpbiAtIDE7CisKKyAgICBzaXplX3QgbGFzdE5vblplcm9CaW4gPSBtQmlucy5zaXplKCkgLSAxOworICAgIC8vIElmIGxhc3ROb25aZXJvQmluIHJlYWNoZXMgMCwgdGhlbiBpdCBtdXN0IGJlIGEgbm9uemVybyBiaW4uCisgICAgZm9yICg7IGxhc3ROb25aZXJvQmluID4gMCAmJiBtQmluc1tsYXN0Tm9uWmVyb0Jpbl0gPT0gMDsgbGFzdE5vblplcm9CaW4tLSkge30KKyAgICBjb25zdCBzaXplX3QgbGFzdEJpblRvUHJpbnQgPSBsYXN0Tm9uWmVyb0JpbiA9PSBtQmlucy5zaXplKCkgLSAxID8gbGFzdE5vblplcm9CaW4KKyAgICAgICAgICAgIDogbGFzdE5vblplcm9CaW4gKyAxOworCisgICAgZm9yIChzaXplX3QgYmluID0gZmlyc3RCaW5Ub1ByaW50OyBiaW4gPD0gbGFzdEJpblRvUHJpbnQ7IGJpbisrKSB7CisgICAgICAgIHNzIDw8IHN0ZDo6c2V0dyhpbmRlbnQgKyBrTWF4TnVtYmVyV2lkdGgpOworICAgICAgICBpZiAoYmluID09IDApIHsKKyAgICAgICAgICAgIHNzIDw8ICI8IjsKKyAgICAgICAgfSBlbHNlIGlmIChiaW4gPT0gbUJpbnMuc2l6ZSgpIC0gMSkgeworICAgICAgICAgICAgc3MgPDwgIj4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3MgPDwgbUxvdyArIChiaW4gLSAxKSAqIG1CaW5TaXplOworICAgICAgICB9CisgICAgICAgIHNzIDw8ICIgfCI7CisgICAgICAgIHNpemVfdCBpbmNyZW1lbnRzID0gMDsKKyAgICAgICAgY29uc3QgdWludDY0X3QgYmluQ291bnQgPSBtQmluc1tiaW5dOworICAgICAgICBpZiAoYmluQ291bnQgPiAwKSB7CisgICAgICAgICAgICBpbmNyZW1lbnRzID0gbG9nMihiaW5Db3VudCkgKyAxOworICAgICAgICAgICAgc3MgPDwgZ2V0VGFpbChpbmNyZW1lbnRzICoga01hcmtlcnNQZXJJbmNyZW1lbnQsIGtNYXJrZXJzKTsKKyAgICAgICAgfQorICAgICAgICBzcyA8PCBnZXRUYWlsKChtYXhJbmNyZW1lbnRzIC0gaW5jcmVtZW50cyArIDEpICoga01hcmtlcnNQZXJJbmNyZW1lbnQsIGtTcGFjZXMpCisgICAgICAgICAgICAgICAgPDwgYmluQ291bnQgPDwgIlxuIjsKKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogLy8gR2l2ZW4gYW4gYXVkaW8gcHJvY2Vzc2luZyB3YWtldXAgdGltZXN0YW1wLCBidWNrZXRzIHRoZSB0aW1lIGludGVydmFsCiAvLyBzaW5jZSB0aGUgcHJldmlvdXMgdGltZXN0YW1wIGludG8gYSBoaXN0b2dyYW0sIHNlYXJjaGVzIGZvcgogLy8gb3V0bGllcnMsIGFuYWx5emVzIHRoZSBvdXRsaWVyIHNlcmllcyBmb3IgdW5leHBlY3RlZGx5CkBAIC0yMDgsMjcgKzMxNyw2IEBACiAgICAgcmV0dXJuIGlzT3V0bGllcjsKIH0KIAotc3RhdGljIGludCB3aWR0aE9mKGludCB4KSB7Ci0gICAgaW50IHdpZHRoID0gMDsKLSAgICBpZiAoeCA8IDApIHsKLSAgICAgICAgd2lkdGgrKzsKLSAgICAgICAgeCA9IHggPT0gSU5UX01JTiA/IElOVF9NQVggOiAteDsKLSAgICB9Ci0gICAgLy8gYXNzZXJ0ICh4ID49IDApCi0gICAgZG8gewotICAgICAgICArK3dpZHRoOwotICAgICAgICB4IC89IDEwOwotICAgIH0gd2hpbGUgKHggPiAwKTsKLSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLS8vIGNvbXB1dGVzIHRoZSBjb2x1bW4gd2lkdGggcmVxdWlyZWQgZm9yIGEgc3BlY2lmaWMgaGlzdG9ncmFtIHZhbHVlCi1pbmxpbmUgaW50IG51bWJlcldpZHRoKGRvdWJsZSBudW1iZXIsIGludCBsZWZ0UGFkZGluZykgewotICAgIC8vIEFkZGVkIHZhbHVlcyBhY2NvdW50IGZvciB3aGl0ZXNwYWNlcyBuZWVkZWQgYXJvdW5kIG51bWJlcnMsIGFuZCBmb3IgdGhlCi0gICAgLy8gZG90IGFuZCBkZWNpbWFsIGRpZ2l0IG5vdCBhY2NvdW50ZWQgZm9yIGJ5IHdpZHRoT2YKLSAgICByZXR1cm4gc3RkOjptYXgoc3RkOjptYXgod2lkdGhPZihzdGF0aWNfY2FzdDxpbnQ+KG51bWJlcikpICsgMywgMiksIGxlZnRQYWRkaW5nICsgMSk7Ci19Ci0KIC8vIHJvdW5kcyB2YWx1ZSB0byBwcmVjaXNpb24gYmFzZWQgb24gbG9nLWRpc3RhbmNlIGZyb20gbWVhbgogX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogaW5saW5lIGRvdWJsZSBsb2dSb3VuZChkb3VibGUgeCwgZG91YmxlIG1lYW4pIHsKQEAgLTI1NCw3ICszNDIsNyBAQAogLy8gb2YgUGVyZm9ybWFuY2VBbmFseXNpcwogdm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpyZXBvcnRQZXJmb3JtYW5jZShTdHJpbmc4ICpib2R5LCBpbnQgYXV0aG9yLCBsb2dfaGFzaF90IGhhc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhIZWlnaHQpIHsKLSAgICBpZiAobUhpc3RzLmVtcHR5KCkpIHsKKyAgICBpZiAobUhpc3RzLmVtcHR5KCkgfHwgYm9keSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTI3Myw2OSArMzYxLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDIwMDsKLSAgICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlcyhrTGVuLCAnXycpOwotICAgIHN0ZDo6c3RyaW5nIHNwYWNlcyhrTGVuLCAnICcpOwotCi0gICAgYXV0byBpdCA9IGJ1Y2tldHMuYmVnaW4oKTsKLSAgICBkb3VibGUgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgaW50IG1heENvdW50ID0gaXQtPnNlY29uZDsKLSAgICAvLyBDb21wdXRlIG1heGltdW0gdmFsdWVzCi0gICAgd2hpbGUgKCsraXQgIT0gYnVja2V0cy5lbmQoKSkgewotICAgICAgICBpZiAoaXQtPmZpcnN0ID4gbWF4RGVsdGEpIHsKLSAgICAgICAgICAgIG1heERlbHRhID0gaXQtPmZpcnN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdC0+c2Vjb25kID4gbWF4Q291bnQpIHsKLSAgICAgICAgICAgIG1heENvdW50ID0gaXQtPnNlY29uZDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgaGVpZ2h0ID0gbG9nMihtYXhDb3VudCkgKyAxOyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCi0gICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZigxIDw8IGhlaWdodCk7Ci0gICAgY29uc3QgaW50IGJ1Y2tldFdpZHRoID0gbnVtYmVyV2lkdGgobWF4RGVsdGEsIGxlZnRQYWRkaW5nKTsKLSAgICBpbnQgc2NhbGluZ0ZhY3RvciA9IDE7Ci0gICAgLy8gc2NhbGUgZGF0YSBpZiBpdCBleGNlZWRzIG1heGltdW0gaGVpZ2h0Ci0gICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkgewotICAgICAgICBzY2FsaW5nRmFjdG9yID0gKGhlaWdodCArIG1heEhlaWdodCkgLyBtYXhIZWlnaHQ7Ci0gICAgICAgIGhlaWdodCAvPSBzY2FsaW5nRmFjdG9yOwotICAgIH0KLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzICUzLjJmICVzIiwgbGVmdFBhZGRpbmcgKyAxMSwKLSAgICAgICAgICAgICJPY2N1cnJlbmNlcyBpbiIsIChlbGFwc2VkTXMgLyBrTXNQZXJTZWMpLCAic2Vjb25kcyBvZiBhdWRpbzoiKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzJWQsICVsbGQsICVsbGRcbiIsIGxlZnRQYWRkaW5nICsgMTEsCisgICAgc3RhdGljIGNvbnN0IGludCBTSVpFID0gMTI4OworICAgIGNoYXIgdGl0bGVbU0laRV07CisgICAgc25wcmludGYodGl0bGUsIHNpemVvZih0aXRsZSksICJcbiVzICUzLjJmICVzXG4lcyVkLCAlbGxkLCAlbGxkXG4iLAorICAgICAgICAgICAgIk9jY3VycmVuY2VzIGluIiwgKGVsYXBzZWRNcyAvIGtNc1BlclNlYyksICJzZWNvbmRzIG9mIGF1ZGlvOiIsCiAgICAgICAgICAgICAiVGhyZWFkLCBoYXNoLCBzdGFydGluZyB0aW1lc3RhbXA6ICIsIGF1dGhvciwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyBpbnQ+KGhhc2gpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmcgaW50PihzdGFydGluZ1RzKSk7Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGxhYmVsIGxpbmUgd2l0aCBidWNrZXQgdmFsdWVzCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOwotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7Ci0gICAgfQotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgewotICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxIDw8IHJvdzsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOwotICAgICAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzJXMiLCBjb2xXaWR0aCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzLmNfc3RyKCksIHguc2Vjb25kIDwgdmFsdWUgPyAiICIgOiAifCIpOwotICAgICAgICB9Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgfQotICAgIC8vIHByaW50IHgtYXhpcwotICAgIGNvbnN0IGludCBjb2x1bW5zID0gc3RhdGljX2Nhc3Q8aW50PihidWNrZXRzLnNpemUoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmMiLCBsZWZ0UGFkZGluZywgJyAnKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoY29sdW1ucyArIDEpICogYnVja2V0V2lkdGgsIHVuZGVyc2NvcmVzLmNfc3RyKCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KGhhc2gpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHN0YXJ0aW5nVHMpKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtMYWJlbCA9ICJtcyI7CiAKLSAgICAvLyB3cml0ZSBmb290ZXIgd2l0aCBidWNrZXQgbGFiZWxzCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IG51bWJlcldpZHRoKHguZmlyc3QsIGxlZnRQYWRkaW5nKTsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKi4qZiIsIGNvbFdpZHRoLCAxLCB4LmZpcnN0KTsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzJXMiLCBidWNrZXRXaWR0aCwgc3BhY2VzLmNfc3RyKCksICJtc1xuIik7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlcyIsCisgICAgICAgICAgICBhdWRpb191dGlsc19wbG90X2hpc3RvZ3JhbShidWNrZXRzLCB0aXRsZSwga0xhYmVsLCBtYXhIZWlnaHQpLmNfc3RyKCkpOwogCiAgICAgLy8gTm93IHJlcG9ydCBnbGl0Y2hlcwogICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG50aW1lIGVsYXBzZWQgYmV0d2VlbiBnbGl0Y2hlcyBhbmQgZ2xpdGNoIHRpbWVzdGFtcHM6XG4iKTsKQEAgLTM1MCw3ICszODUsOSBAQAogLy8gd3JpdGVzIHN1bW1hcnkgb2YgcGVyZm9ybWFuY2UgaW50byBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yCiB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LCBQZXJmb3JtYW5jZUFuYWx5c2lzTWFwICZ0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKSB7CiAgICAgU3RyaW5nOCBib2R5OworI2lmZGVmIFdSSVRFX1RPX0ZJTEUKICAgICBjb25zdCBjaGFyKiBjb25zdCBrRGlyZWN0b3J5ID0gIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIvIjsKKyNlbmRpZgogICAgIGZvciAoYXV0byAmIHRocmVhZCA6IHRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpIHsKICAgICAgICAgZm9yIChhdXRvICYgaGFzaDogdGhyZWFkLnNlY29uZCkgewogICAgICAgICAgICAgUGVyZm9ybWFuY2VBbmFseXNpcyYgY3VyciA9IGhhc2guc2Vjb25kOwpAQCAtMzYwLDkgKzM5NywxMSBAQAogICAgICAgICAgICAgICAgIGR1bXBMaW5lKGZkLCBpbmRlbnQsIGJvZHkpOwogICAgICAgICAgICAgICAgIGJvZHkuY2xlYXIoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHdyaXRlIHRvIGZpbGUKKyNpZmRlZiBXUklURV9UT19GSUxFCisgICAgICAgICAgICAvLyB3cml0ZSB0byBmaWxlLiBFbmFibGUgYnkgdW5jb21tZW50aW5nIG1hY3JvIGF0IHRvcCBvZiBmaWxlLgogICAgICAgICAgICAgd3JpdGVUb0ZpbGUoY3Vyci5tSGlzdHMsIGN1cnIubU91dGxpZXJEYXRhLCBjdXJyLm1QZWFrVGltZXN0YW1wcywKICAgICAgICAgICAgICAgICAgICAgICAgIGtEaXJlY3RvcnksIGZhbHNlLCB0aHJlYWQuZmlyc3QsIGhhc2guZmlyc3QpOworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0zNzQsNSArNDEzLDQgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9SZWFkZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvUmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTU2ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvUmVhZGVyLmNwcApAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitSZWFkZXI6OlJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgbVNoYXJlZCgoLypjb25zdCovIFNoYXJlZCAqKSBzaGFyZWQpLCAvKm1JTWVtb3J5Ki8KKyAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CisgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKKyAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCit7Cit9CisKK1JlYWRlcjo6UmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgOiBSZWFkZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplLCBuYW1lKQoreworICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKK30KKworUmVhZGVyOjp+UmVhZGVyKCkKK3sKKyAgICBkZWxldGUgbUZpZm9SZWFkZXI7CisgICAgZGVsZXRlIG1GaWZvOworfQorCisvLyBDb3BpZXMgY29udGVudCBvZiBhIFJlYWRlciBGSUZPIGludG8gaXRzIFNuYXBzaG90CisvLyBUaGUgU25hcHNob3QgaGFzIHRoZSBzYW1lIHJhdyBkYXRhLCBidXQgcmVwcmVzZW50ZWQgYXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzCisvLyBhbmQgYW4gRW50cnlJdGVyYXRvciBtYWtpbmcgaXQgcG9zc2libGUgdG8gcHJvY2VzcyB0aGUgZGF0YS4KK3N0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gUmVhZGVyOjpnZXRTbmFwc2hvdChib29sIGZsdXNoKQoreworICAgIGlmIChtRmlmb1JlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvdXIgb2YgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6OnJlYWQsIGJ1dCB3aXRob3V0IGluY3JlbWVudGluZyB0aGUKKyAgICAvLyByZWFkZXIgaW5kZXguIFRoZSBpbmRleCBpcyBpbmNyZW1lbnRlZCBhZnRlciBoYW5kbGluZyBjb3JydXB0aW9uLCB0byBhZnRlciB0aGUgbGFzdCBjb21wbGV0ZQorICAgIC8vIGVudHJ5IG9mIHRoZSBidWZmZXIKKyAgICBzaXplX3QgbG9zdCA9IDA7CisgICAgYXVkaW9fdXRpbHNfaW92ZWMgaW92ZWNbMl07CisgICAgY29uc3Qgc2l6ZV90IGNhcGFjaXR5ID0gbUZpZm8tPmNhcGFjaXR5KCk7CisgICAgc3NpemVfdCBhdmFpbFRvUmVhZDsKKyAgICAvLyBBIGNhbGwgdG8gYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6Om9idGFpbigpIHBsYWNlcyB0aGUgcmVhZCBwb2ludGVyIG9uZSBidWZmZXIgbGVuZ3RoCisgICAgLy8gYmVmb3JlIHRoZSB3cml0ZXIncyBwb2ludGVyIChzaW5jZSBtRmlmb1JlYWRlciB3YXMgY29uc3RydWN0ZWQgd2l0aCBmbHVzaD1mYWxzZSkuIFRoZQorICAgIC8vIGRvIHdoaWxlIGxvb3AgaXMgYW4gYXR0ZW1wdCB0byByZWFkIGFsbCBvZiB0aGUgRklGTydzIGNvbnRlbnRzIHJlZ2FyZGxlc3Mgb2YgaG93IGJlaGluZAorICAgIC8vIHRoZSByZWFkZXIgaXMgd2l0aCByZXNwZWN0IHRvIHRoZSB3cml0ZXIuIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgc2NoZWR1bGluZyBzZXF1ZW5jZSBpcworICAgIC8vIHBvc3NpYmxlIGFuZCBjYW4gbGVhZCB0byBhIHN0YXJ2YXRpb24gc2l0dWF0aW9uOgorICAgIC8vIC0gV3JpdGVyIFQxIHdyaXRlcywgb3ZlcnJ1biB3aXRoIHJlc3BlY3QgdG8gUmVhZGVyIFQyCisgICAgLy8gLSBUMiBjYWxscyBvYnRhaW4oKSBhbmQgZ2V0cyBFT1ZFUkZMT1csIFQyIHB0ciBwbGFjZWQgb25lIGJ1ZmZlciBzaXplIGJlaGluZCBUMSBwdHIKKyAgICAvLyAtIFQxIHdyaXRlLCBvdmVycnVuCisgICAgLy8gLSBUMiBvYnRhaW4oKSwgRU9WRVJGTE9XIChhbmQgc28gb24uLi4pCisgICAgLy8gVG8gYWRkcmVzcyB0aGlzIGlzc3VlLCB3ZSBsaW1pdCB0aGUgbnVtYmVyIG9mIHRyaWVzIGZvciB0aGUgcmVhZGVyIHRvIGNhdGNoIHVwIHdpdGgKKyAgICAvLyB0aGUgd3JpdGVyLgorICAgIGludCB0cmllcyA9IDA7CisgICAgc2l6ZV90IGxvc3RUZW1wOworICAgIGRvIHsKKyAgICAgICAgYXZhaWxUb1JlYWQgPSBtRmlmb1JlYWRlci0+b2J0YWluKGlvdmVjLCBjYXBhY2l0eSwgTlVMTCAvKnRpbWVvdXQqLywgJmxvc3RUZW1wKTsKKyAgICAgICAgbG9zdCArPSBsb3N0VGVtcDsKKyAgICB9IHdoaWxlIChhdmFpbFRvUmVhZCA8IDAgfHwgKyt0cmllcyA8PSBrTWF4T2J0YWluVHJpZXMpOworCisgICAgaWYgKGF2YWlsVG9SZWFkIDw9IDApIHsKKyAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgPCAwLCAiTkJMb2cgUmVhZGVyICVzIGZhaWxlZCB0byBjYXRjaCB1cCB3aXRoIFdyaXRlciIsIG1OYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7CisgICAgfQorCisgICAgLy8gQ2hhbmdlIHRvICNpZiAxIGZvciBkZWJ1Z2dpbmcuIFRoaXMgc3RhdGVtZW50IGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgYnVmZmVyIGZ1bGxuZXNzIGxldmVscworICAgIC8vIChhcyBzZWVuIGJ5IHJlYWRlcikgYW5kIGhvdyBtdWNoIGRhdGEgd2FzIGxvc3QuIElmIHlvdSBmaW5kIHRoYXQgdGhlIGZ1bGxuZXNzIGxldmVsIGlzCisgICAgLy8gZ2V0dGluZyBjbG9zZSB0byBmdWxsLCBvciB0aGF0IGRhdGEgbG9zcyBpcyBoYXBwZW5pbmcgdG8gb2Z0ZW4sIHRoZW4geW91IHNob3VsZAorICAgIC8vIHByb2JhYmx5IHRyeSBzb21lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgLy8gLSBsb2cgbGVzcyBkYXRhCisgICAgLy8gLSBsb2cgbGVzcyBvZnRlbgorICAgIC8vIC0gaW5jcmVhc2UgdGhlIGluaXRpYWwgc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgYnVmZmVyCisjaWYgMAorICAgIEFMT0dEKCJnZXRTbmFwc2hvdCBuYW1lPSVzLCBhdmFpbFRvUmVhZD0lemQsIGNhcGFjaXR5PSV6dSwgZnVsbG5lc3M9JS4zZiwgbG9zdD0lenUiLAorICAgICAgICAgICAgbmFtZSgpLmNfc3RyKCksIGF2YWlsVG9SZWFkLCBjYXBhY2l0eSwgKGRvdWJsZSlhdmFpbFRvUmVhZCAvIChkb3VibGUpY2FwYWNpdHksIGxvc3QpOworI2VuZGlmCisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdChuZXcgU25hcHNob3QoYXZhaWxUb1JlYWQpKTsKKyAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhLCAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1swXS5tT2Zmc2V0LCBpb3ZlY1swXS5tTGVuZ3RoKTsKKyAgICBpZiAoaW92ZWNbMV0ubUxlbmd0aCA+IDApIHsKKyAgICAgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSArIChpb3ZlY1swXS5tTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1sxXS5tT2Zmc2V0LCBpb3ZlY1sxXS5tTGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgY29ycnVwdGVkIGJ1ZmZlcgorICAgIC8vIFBvdGVudGlhbGx5LCBhIGJ1ZmZlciBoYXMgY29ycnVwdGVkIGRhdGEgb24gYm90aCBiZWdpbm5pbmcgKGR1ZSB0byBvdmVyZmxvdykgYW5kIGVuZAorICAgIC8vIChkdWUgdG8gaW5jb21wbGV0ZSBmb3JtYXQgZW50cnkpLiBCdXQgZXZlbiBpZiB0aGUgZW5kIGZvcm1hdCBlbnRyeSBpcyBpbmNvbXBsZXRlLAorICAgIC8vIGl0IGVuZHMgaW4gYSBjb21wbGV0ZSBlbnRyeSAod2hpY2ggaXMgbm90IGFuIEZNVF9FTkQpLiBTbyBpcyBzYWZlIHRvIHRyYXZlcnNlIGJhY2t3YXJkcy4KKyAgICAvLyBUT0RPOiBoYW5kbGUgY2xpZW50IGNvcnJ1cHRpb24gKGluIHRoZSBtaWRkbGUgb2YgYSBidWZmZXIpCisKKyAgICBjb25zdCB1aW50OF90ICpiYWNrID0gc25hcHNob3QtPm1EYXRhICsgYXZhaWxUb1JlYWQ7CisgICAgY29uc3QgdWludDhfdCAqZnJvbnQgPSBzbmFwc2hvdC0+bURhdGE7CisKKyAgICAvLyBGaW5kIGxhc3QgRk1UX0VORC4gPGJhY2s+IGlzIHNpdHRpbmcgb24gYW4gZW50cnkgd2hpY2ggbWlnaHQgYmUgdGhlIG1pZGRsZSBvZiBhIEZvcm1hdEVudHJ5LgorICAgIC8vIFdlIGdvIGJhY2t3YXJkcyB1bnRpbCB3ZSBmaW5kIGFuIEVWRU5UX0ZNVF9FTkQuCisgICAgY29uc3QgdWludDhfdCAqbGFzdEVuZCA9IGZpbmRMYXN0VmFsaWRFbnRyeShmcm9udCwgYmFjaywgaW52YWxpZEVuZFR5cGVzKTsKKyAgICBpZiAobGFzdEVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIHNuYXBzaG90LT5tRW5kID0gc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZnJvbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGVuZCBvZiBzbmFwc2hvdCBwb2ludHMgdG8gYWZ0ZXIgbGFzdCBGTVRfRU5EIGVudHJ5CisgICAgICAgIHNuYXBzaG90LT5tRW5kID0gRW50cnlJdGVyYXRvcihsYXN0RW5kKS5uZXh0KCk7CisgICAgICAgIC8vIGZpbmQgZmlyc3QgRk1UX1NUQVJUCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnQgPSBudWxscHRyOworICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0VG1wID0gc25hcHNob3QtPm1FbmQ7CisgICAgICAgIHdoaWxlICgoZmlyc3RTdGFydFRtcCA9IGZpbmRMYXN0VmFsaWRFbnRyeShmcm9udCwgZmlyc3RTdGFydFRtcCwgaW52YWxpZEJlZ2luVHlwZXMpKQorICAgICAgICAgICAgICAgICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZpcnN0U3RhcnQgPSBmaXJzdFN0YXJ0VG1wOworICAgICAgICB9CisgICAgICAgIC8vIGZpcnN0U3RhcnQgaXMgbnVsbCBpZiBubyBGTVRfU1RBUlQgZW50cnkgd2FzIGZvdW5kIGJlZm9yZSBsYXN0RW5kCisgICAgICAgIGlmIChmaXJzdFN0YXJ0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBzbmFwc2hvdC0+bUVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZpcnN0U3RhcnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWR2YW5jZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciBsYXN0IGVudHJ5IHJlYWQuCisgICAgaWYgKGZsdXNoKSB7CisgICAgICAgIG1GaWZvUmVhZGVyLT5yZWxlYXNlKHNuYXBzaG90LT5tRW5kIC0gZnJvbnQpOworICAgIH0KKworICAgIHNuYXBzaG90LT5tTG9zdCA9IGxvc3Q7CisgICAgcmV0dXJuIHNuYXBzaG90OworfQorCitib29sIFJlYWRlcjo6aXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdAoreworICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKK30KKworLy8gV2UgbWFrZSBhIHNldCBvZiB0aGUgaW52YWxpZCB0eXBlcyByYXRoZXIgdGhhbiB0aGUgdmFsaWQgdHlwZXMgd2hlbiBhbGlnbmluZworLy8gU25hcHNob3QgRW50cnlJdGVyYXRvcnMgdG8gdmFsaWQgZW50cmllcyBkdXJpbmcgbG9nIGNvcnJ1cHRpb24gY2hlY2tpbmcuCisvLyBUaGlzIGlzIGRvbmUgaW4gb3JkZXIgdG8gYXZvaWQgdGhlIG1haW50ZW5hbmNlIG92ZXJoZWFkIG9mIGFkZGluZyBhIG5ldyBFdmVudAorLy8gdHlwZSB0byB0aGUgdHdvIHNldHMgYmVsb3cgd2hlbmV2ZXIgYSBuZXcgRXZlbnQgdHlwZSBpcyBjcmVhdGVkLCBhcyBpdCBpcworLy8gdmVyeSBsaWtlbHkgdGhhdCBuZXcgdHlwZXMgYWRkZWQgd2lsbCBiZSB2YWxpZCB0eXBlcy4KKy8vIEN1cnJlbnRseSwgaW52YWxpZEJlZ2luVHlwZXMgYW5kIGludmFsaWRFbmRUeXBlcyBhcmUgdXNlZCB0byBoYW5kbGUgdGhlIHNwZWNpYWwKKy8vIGNhc2Ugb2YgYSBGb3JtYXQgRW50cnksIHdoaWNoIGNvbnNpc3RzIG9mIGEgdmFyaWFibGUgbnVtYmVyIG9mIHNpbXBsZSBsb2cgZW50cmllcy4KKy8vIElmIGEgbmV3IEV2ZW50IGlzIGFkZGVkIHRoYXQgY29uc2lzdHMgb2YgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc2ltcGxlIGxvZyBlbnRyaWVzLAorLy8gdGhlbiB0aGVzZSBzZXRzIG5lZWQgdG8gYmUgdXBkYXRlZC4KKworLy8gV2Ugd2FudCB0aGUgYmVnaW5uaW5nIG9mIGEgU25hcHNob3QgdG8gcG9pbnQgdG8gYW4gZW50cnkgdGhhdCBpcyBub3QgaW4KKy8vIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXR0ZWQgZW50cnkgYW5kIG5vdCBhbiBGTVRfRU5ELgorY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBSZWFkZXI6OmludmFsaWRCZWdpblR5cGVzIHsKKyAgICBFVkVOVF9GTVRfQVVUSE9SLAorICAgIEVWRU5UX0ZNVF9FTkQsCisgICAgRVZFTlRfRk1UX0ZMT0FULAorICAgIEVWRU5UX0ZNVF9IQVNILAorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLAorICAgIEVWRU5UX0ZNVF9QSUQsCisgICAgRVZFTlRfRk1UX1NUUklORywKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLAorfTsKKworLy8gV2Ugd2FudCB0aGUgZW5kIG9mIGEgU25hcHNob3QgdG8gcG9pbnQgdG8gYW4gZW50cnkgdGhhdCBpcyBub3QgaW4KKy8vIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXR0ZWQgZW50cnkgYW5kIG5vdCBhIEZNVF9TVEFSVC4KK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gUmVhZGVyOjppbnZhbGlkRW5kVHlwZXMgeworICAgIEVWRU5UX0ZNVF9BVVRIT1IsCisgICAgRVZFTlRfRk1UX0ZMT0FULAorICAgIEVWRU5UX0ZNVF9IQVNILAorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLAorICAgIEVWRU5UX0ZNVF9QSUQsCisgICAgRVZFTlRfRk1UX1NUQVJULAorICAgIEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgRVZFTlRfRk1UX1RJTUVTVEFNUCwKK307CisKK2NvbnN0IHVpbnQ4X3QgKlJlYWRlcjo6ZmluZExhc3RWYWxpZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiAmaW52YWxpZFR5cGVzKSB7CisgICAgaWYgKGZyb250ID09IG51bGxwdHIgfHwgYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICB3aGlsZSAoYmFjayArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXQgPj0gZnJvbnQpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHJldiA9IGJhY2sgLSBiYWNrW0VudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdIC0gRW50cnk6OmtPdmVyaGVhZDsKKyAgICAgICAgY29uc3QgRXZlbnQgdHlwZSA9IChjb25zdCBFdmVudClwcmV2W29mZnNldG9mKGVudHJ5LCB0eXBlKV07CisgICAgICAgIGlmIChwcmV2IDwgZnJvbnQKKyAgICAgICAgICAgICAgICB8fCBwcmV2ICsgcHJldltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBFbnRyeTo6a092ZXJoZWFkICE9IGJhY2sKKyAgICAgICAgICAgICAgICB8fCB0eXBlIDw9IEVWRU5UX1JFU0VSVkVEIHx8IHR5cGUgPj0gRVZFTlRfVVBQRVJfQk9VTkQpIHsKKyAgICAgICAgICAgIC8vIHByZXYgcG9pbnRzIHRvIGFuIG91dCBvZiBsaW1pdHMgb3IgaW5jb25zaXN0ZW50IGVudHJ5CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBpbnZhbGlkVHlwZXMgZG9lcyBub3QgY29udGFpbiB0aGUgdHlwZSwgdGhlbiB0aGUgdHlwZSBpcyB2YWxpZC4KKyAgICAgICAgaWYgKGludmFsaWRUeXBlcy5maW5kKHR5cGUpID09IGludmFsaWRUeXBlcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgICAgIH0KKyAgICAgICAgYmFjayA9IHByZXY7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOyAvLyBubyBlbnRyeSBmb3VuZAorfQorCisvLyBUT0RPIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eSwgd291bGQgcHJlZmVyIHRvIGhhdmUgYSBkdW1wKCkgZ28gdG8gc3RyaW5nLCBhbmQgdGhlbiBnbworLy8gdG8gZmQgb25seSB3aGVuIGludm9rZWQgdGhyb3VnaCBiaW5kZXIuCit2b2lkIER1bXBSZWFkZXI6OmR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50KQoreworICAgIGlmIChmZCA8IDApIHJldHVybjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90ID0gZ2V0U25hcHNob3QoZmFsc2UgLypmbHVzaCovKTsKKyAgICBpZiAoc25hcHNob3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OworCisgICAgLy8gVE9ETyBhbGwgbG9nZ2VkIHR5cGVzIHNob3VsZCBoYXZlIGEgcHJpbnRhYmxlIGZvcm1hdC4KKyAgICAvLyBUT0RPIGNhbiB3ZSBtYWtlIHRoZSBwcmludGluZyBnZW5lcmljPworICAgIGZvciAoRW50cnlJdGVyYXRvciBpdCA9IHNuYXBzaG90LT5iZWdpbigpOyBpdCAhPSBzbmFwc2hvdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3dpdGNoIChpdC0+dHlwZSkgeworICAgICAgICBjYXNlIEVWRU5UX0ZNVF9TVEFSVDoKKyAgICAgICAgICAgIGl0ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGl0KSwgJnRpbWVzdGFtcCwgJmJvZHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfTEFURU5DWTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX0xBVEVOQ1ksJS4zZiIsIGxhdGVuY3lNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfT1ZFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9PVkVSUlVOLCVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRzKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX0lORk86IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9pbmZvX3QgaW5mbyA9IGl0LnBheWxvYWQ8dGhyZWFkX2luZm9fdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9USFJFQURfSU5GTywlZCwlcyIsIHN0YXRpY19jYXN0PGludD4oaW5mby5pZCksCisgICAgICAgICAgICAgICAgICAgIHRocmVhZFR5cGVUb1N0cmluZyhpbmZvLnR5cGUpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9VTkRFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9VTkRFUlJVTiwlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0cykpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dBUk1VUF9USU1FOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgdGltZU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfV0FSTVVQX1RJTUUsJS4zZiIsIHRpbWVNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV09SS19USU1FOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG1vbm90b25pY05zID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1dPUktfVElNRSwlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihtb25vdG9uaWNOcykpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9QQVJBTVM6IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9wYXJhbXNfdCBwYXJhbXMgPSBpdC5wYXlsb2FkPHRocmVhZF9wYXJhbXNfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9USFJFQURfUEFSQU1TLCV6dSwldSIsIHBhcmFtcy5mcmFtZUNvdW50LCBwYXJhbXMuc2FtcGxlUmF0ZSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfRk1UX0VORDoKKyAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBFVkVOVF9VUFBFUl9CT1VORDoKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgaXQtPnR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJS4qcyVzICVzXG4iLCAoaW50KWluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7CisgICAgICAgICAgICBib2R5LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7CisgICAgfQorfQorCitFbnRyeUl0ZXJhdG9yIER1bXBSZWFkZXI6OmhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksCisgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwgU3RyaW5nOCAqYm9keSkKK3sKKyAgICBTdHJpbmc4IHRpbWVzdGFtcExvY2FsOworICAgIFN0cmluZzggYm9keUxvY2FsOworICAgIGlmICh0aW1lc3RhbXAgPT0gbnVsbHB0cikgeworICAgICAgICB0aW1lc3RhbXAgPSAmdGltZXN0YW1wTG9jYWw7CisgICAgfQorICAgIGlmIChib2R5ID09IG51bGxwdHIpIHsKKyAgICAgICAgYm9keSA9ICZib2R5TG9jYWw7CisgICAgfQorCisgICAgLy8gbG9nIHRpbWVzdGFtcAorICAgIGNvbnN0IGludDY0X3QgdHMgPSBmbXRFbnRyeS50aW1lc3RhbXAoKTsKKyAgICB0aW1lc3RhbXAtPmNsZWFyKCk7CisgICAgdGltZXN0YW1wLT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOworCisgICAgLy8gbG9nIHVuaXF1ZSBoYXNoCisgICAgbG9nX2hhc2hfdCBoYXNoID0gZm10RW50cnkuaGFzaCgpOworICAgIC8vIHByaW50IG9ubHkgbG93ZXIgMTZiaXQgb2YgaGFzaCBhcyBoZXggYW5kIGxpbmUgYXMgaW50IHRvIHJlZHVjZSBzcGFtIGluIHRoZSBsb2cKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuNFgtJWQgIiwgKGludCkoaGFzaCA+PiAxNikgJiAweEZGRkYsIChpbnQpIGhhc2ggJiAweEZGRkYpOworCisgICAgLy8gbG9nIGF1dGhvciAoaWYgcHJlc2VudCkKKyAgICBoYW5kbGVBdXRob3IoZm10RW50cnksIGJvZHkpOworCisgICAgLy8gbG9nIHN0cmluZworICAgIEVudHJ5SXRlcmF0b3IgYXJnID0gZm10RW50cnkuYXJncygpOworCisgICAgY29uc3QgY2hhciogZm10ID0gZm10RW50cnkuZm9ybWF0U3RyaW5nKCk7CisgICAgc2l6ZV90IGZtdF9sZW5ndGggPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmdMZW5ndGgoKTsKKworICAgIGZvciAoc2l6ZV90IGZtdF9vZmZzZXQgPSAwOyBmbXRfb2Zmc2V0IDwgZm10X2xlbmd0aDsgKytmbXRfb2Zmc2V0KSB7CisgICAgICAgIGlmIChmbXRbZm10X29mZnNldF0gIT0gJyUnKSB7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoJmZtdFtmbXRfb2Zmc2V0XSwgMSk7IC8vIFRPRE8gb3B0aW1pemUgdG8gd3JpdGUgY29uc2VjdXRpdmUgc3RyaW5ncyBhdCBvbmNlCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYXNlICIlJSIiCisgICAgICAgIGlmIChmbXRbKytmbXRfb2Zmc2V0XSA9PSAnJScpIHsKKyAgICAgICAgICAgIGJvZHktPmFwcGVuZCgiJSIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FzZSAiJVwwIgorICAgICAgICBpZiAoZm10X29mZnNldCA9PSBmbXRfbGVuZ3RoKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEV2ZW50IGV2ZW50ID0gKEV2ZW50KSBhcmctPnR5cGU7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSBhcmctPmxlbmd0aDsKKworICAgICAgICAvLyBUT0RPIGNoZWNrIGxlbmd0aCBmb3IgZXZlbnQgdHlwZSBpcyBjb3JyZWN0CisKKyAgICAgICAgaWYgKGV2ZW50ID09IEVWRU5UX0ZNVF9FTkQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgorICAgICAgICBjb25zdCB1aW50OF90ICpkYXR1bSA9IGFyZy0+ZGF0YTsgLy8gcG9pbnRlciB0byB0aGUgY3VycmVudCBldmVudCBhcmdzCisgICAgICAgIHN3aXRjaChmbXRbZm10X29mZnNldF0pCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZworICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX1NUUklORywKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3Igc3RyaW5nIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoKGNvbnN0IGNoYXIqKSBkYXR1bSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9USU1FU1RBTVAsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHRpbWVzdGFtcCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kVGltZXN0YW1wKGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfSU5URUdFUiwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgaW50ZWdlciBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kSW50KGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2YnOiAvLyBmbG9hdAorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX0ZMT0FULAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBmbG9hdCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kRmxvYXQoYm9keSwgZGF0dW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAncCc6IC8vIHBpZAorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX1BJRCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgcGlkIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBhcHBlbmRQSUQoYm9keSwgZGF0dW0sIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIk5CTG9nIFJlYWRlciBlbmNvdW50ZXJlZCB1bmtub3duIGNoYXJhY3RlciAlYyIsIGZtdFtmbXRfb2Zmc2V0XSk7CisgICAgICAgIH0KKyAgICAgICAgKythcmc7CisgICAgfQorICAgIEFMT0dXX0lGKGFyZy0+dHlwZSAhPSBFVkVOVF9GTVRfRU5ELCAiRXhwZWN0ZWQgZW5kIG9mIGZvcm1hdCwgZ290ICVkIiwgYXJnLT50eXBlKTsKKyAgICByZXR1cm4gYXJnOworfQorCit2b2lkIER1bXBSZWFkZXI6OmFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy9pbnQgeCA9ICooKGludCopIGRhdGEpOworICAgIGludCB4OworICAgIG1lbWNweSgmeCwgZGF0YSwgc2l6ZW9mKHgpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjwlZD4iLCB4KTsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmxvYXQgZjsKKyAgICBtZW1jcHkoJmYsIGRhdGEsIHNpemVvZihmKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWY+IiwgZik7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwaWRfdCBpZCA9ICooKHBpZF90KikgZGF0YSk7CisgICAgY2hhciAqIG5hbWUgPSAmKChjaGFyKikgZGF0YSlbc2l6ZW9mKHBpZF90KV07CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8UElEOiAlZCwgbmFtZTogJS4qcz4iLCBpZCwgKGludCkgKGxlbmd0aCAtIHNpemVvZihwaWRfdCkpLCBuYW1lKTsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDY0X3QgdHM7CisgICAgbWVtY3B5KCZ0cywgZGF0YSwgc2l6ZW9mKHRzKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKK30KKworU3RyaW5nOCBEdW1wUmVhZGVyOjpidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgU3RyaW5nOCBzdHI7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorICAgIHN0ci5hcHBlbmQoIlsgIik7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBzdHIuYXBwZW5kRm9ybWF0KCIlZCAiLCBidWZmZXJbaV0pOworICAgIH0KKyAgICBzdHIuYXBwZW5kKCJdIik7CisgICAgcmV0dXJuIHN0cjsKK30KKworU3RyaW5nOCBEdW1wUmVhZGVyOjpidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KQoreworICAgIHJldHVybiBidWZmZXJEdW1wKGl0LCBpdC0+bGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwIGIvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCmluZGV4IDgyN2U3MzEuLmIwNTBiODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcAorKysgYi9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKQEAgLTE1LDkgKzE1LDExIEBACiAgKi8KIAogI2RlZmluZSBMT0dfVEFHICJSZXBvcnRQZXJmb3JtYW5jZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgpAQCAtMjcsMjMgKzI5LDE5NSBAQAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgorI2luY2x1ZGUgPGpzb24vanNvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiBkdW1wVG9Kc29uKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SnNvbjo6VmFsdWU+IHJvb3RQdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPEpzb246OlZhbHVlPihKc29uOjpvYmplY3RWYWx1ZSk7CisgICAgSnNvbjo6VmFsdWUmIHJvb3QgPSAqcm9vdFB0cjsKKyAgICByb290WyJpb0hhbmRsZSJdID0gZGF0YS50aHJlYWRJbmZvLmlkOworICAgIHJvb3RbInR5cGUiXSA9IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpOworICAgIHJvb3RbImZyYW1lQ291bnQiXSA9IChKc29uOjpWYWx1ZTo6SW50KWRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQ7CisgICAgcm9vdFsic2FtcGxlUmF0ZSJdID0gKEpzb246OlZhbHVlOjpJbnQpZGF0YS50aHJlYWRQYXJhbXMuc2FtcGxlUmF0ZTsKKyAgICByb290WyJ3b3JrTXNIaXN0Il0gPSBkYXRhLndvcmtIaXN0LnRvU3RyaW5nKCk7CisgICAgcm9vdFsibGF0ZW5jeU1zSGlzdCJdID0gZGF0YS5sYXRlbmN5SGlzdC50b1N0cmluZygpOworICAgIHJvb3RbIndhcm11cE1zSGlzdCJdID0gZGF0YS53YXJtdXBIaXN0LnRvU3RyaW5nKCk7CisgICAgcm9vdFsidW5kZXJydW5zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KWRhdGEudW5kZXJydW5zOworICAgIHJvb3RbIm92ZXJydW5zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KWRhdGEub3ZlcnJ1bnM7CisgICAgcm9vdFsiYWN0aXZlTXMiXSA9IChKc29uOjpWYWx1ZTo6SW50NjQpbnMybXMoZGF0YS5hY3RpdmUpOworICAgIHJvb3RbImR1cmF0aW9uTXMiXSA9IChKc29uOjpWYWx1ZTo6SW50NjQpbnMybXMoc3lzdGVtVGltZSgpIC0gZGF0YS5zdGFydCk7CisgICAgcmV0dXJuIHJvb3RQdHI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkdW1wSGlzdG9ncmFtc1RvU3RyaW5nKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSkKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworICAgIHNzIDw8ICJUaHJlYWQgdHlwZT0iIDw8IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpCisgICAgICAgICAgICA8PCAiIGhhbmRsZT0iIDw8IGRhdGEudGhyZWFkSW5mby5pZAorICAgICAgICAgICAgPDwgIiBzYW1wbGVSYXRlPSIgPDwgZGF0YS50aHJlYWRQYXJhbXMuc2FtcGxlUmF0ZQorICAgICAgICAgICAgPDwgIiBmcmFtZUNvdW50PSIgPDwgZGF0YS50aHJlYWRQYXJhbXMuZnJhbWVDb3VudCA8PCAiXG4iOworICAgIHNzIDw8ICIgIFRocmVhZCB3b3JrIHRpbWVzIGluIG1zOlxuIiA8PCBkYXRhLndvcmtIaXN0LmFzY2lpQXJ0U3RyaW5nKDQgLyppbmRlbnQqLyk7CisgICAgc3MgPDwgIiAgVGhyZWFkIGxhdGVuY2llcyBpbiBtczpcbiIgPDwgZGF0YS5sYXRlbmN5SGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHNzIDw8ICIgIFRocmVhZCB3YXJtdXAgdGltZXMgaW4gbXM6XG4iIDw8IGRhdGEud2FybXVwSGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCBkdW1wSnNvbihpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCkKK3sKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBKc29uOjpWYWx1ZSByb290KEpzb246OmFycmF5VmFsdWUpOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICAvLyBTa2lwIHRocmVhZHMgdGhhdCBkbyBub3QgaGF2ZSBwZXJmb3JtYW5jZSBkYXRhIHJlY29yZGVkIHlldC4KKyAgICAgICAgaWYgKGRhdGEuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiBkYXRhSnNvbiA9IFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wVG9Kc29uKGRhdGEpOworICAgICAgICBpZiAoZGF0YUpzb24gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKCpkYXRhSnNvbilbInRocmVhZE51bSJdID0gaXRlbS5maXJzdDsKKyAgICAgICAgcm9vdC5hcHBlbmQoKmRhdGFKc29uKTsKKyAgICB9CisgICAgSnNvbjo6U3R5bGVkV3JpdGVyIHdyaXRlcjsKKyAgICBzdGQ6OnN0cmluZyByb290U3RyID0gd3JpdGVyLndyaXRlKHJvb3QpOworICAgIHdyaXRlKGZkLCByb290U3RyLmNfc3RyKCksIHJvb3RTdHIuc2l6ZSgpKTsKK30KKwordm9pZCBkdW1wUGxvdHMoaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApCit7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogdGhyZWFkRGF0YU1hcCkgeworICAgICAgICBjb25zdCBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gaXRlbS5zZWNvbmQ7CisgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGhpc3RzID0gUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBIaXN0b2dyYW1zVG9TdHJpbmcoZGF0YSk7CisgICAgICAgIHdyaXRlKGZkLCBoaXN0cy5jX3N0cigpLCBoaXN0cy5zaXplKCkpOworICAgIH0KK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGR1bXBSZXRyb1N0cmluZyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEsIGludDY0X3Qgbm93KQoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpIDw8ICIsIiA8PCBkYXRhLnRocmVhZEluZm8uaWQgPDwgIlxuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiBkYXRhLnNuYXBzaG90cykgeworICAgICAgICAvLyBUT0RPIHVzZSBhbiBlbnVtIHRvIHN0cmluZyBjb252ZXJzaW9uIG1ldGhvZC4gT25lIGdvb2QgaWRlYToKKyAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIzODE1NworICAgICAgICBpZiAoaXRlbS5maXJzdCA9PSBOQkxvZzo6RVZFTlRfVU5ERVJSVU4pIHsKKyAgICAgICAgICAgIHNzIDw8ICJFVkVOVF9VTkRFUlJVTiwiOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmlyc3QgPT0gTkJMb2c6OkVWRU5UX09WRVJSVU4pIHsKKyAgICAgICAgICAgIHNzIDw8ICJFVkVOVF9PVkVSUlVOLCI7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgbm93IC0gaXRlbS5zZWNvbmQgPDwgIlxuIjsKKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgZHVtcFJldHJvKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAoZGF0YS5zbmFwc2hvdHMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcmV0cm9TdHIgPSBkdW1wUmV0cm9TdHJpbmcoZGF0YSwgbm93KTsKKyAgICAgICAgd3JpdGUoZmQsIHJldHJvU3RyLmNfc3RyKCksIHJldHJvU3RyLnNpemUoKSk7CisgICAgfQorfQorCitib29sIHNlbmRUb01lZGlhTWV0cmljcyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgLy8gU2VlIGRvY3VtZW50YXRpb24gZm9yIHRoZXNlIG1ldHJpY3MgaGVyZToKKyAgICAvLyBkb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xMS0tNmR5T1hWT3BhY1lRTFppYU9ZNVFWdFFqVXlxTngyelQ5Y0N6TEtZRS9lZGl0P3VzcD1zaGFyaW5nCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRUeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC50eXBlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZEZyYW1lQ291bnRbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmZyYW1lY291bnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkU2FtcGxlUmF0ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQuc2FtcGxlcmF0ZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRXb3JrSGlzdFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQud29ya01zLmhpc3QiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkTGF0ZW5jeUhpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmxhdGVuY3lNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFdhcm11cEhpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLndhcm11cE1zLmhpc3QiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkVW5kZXJydW5zW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC51bmRlcnJ1bnMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkT3ZlcnJ1bnNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLm92ZXJydW5zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZEFjdGl2ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQuYWN0aXZlTXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkRHVyYXRpb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmR1cmF0aW9uTXMiOworCisgICAgLy8gQ3VycmVudGx5LCB3ZSBvbmx5IGFsbG93IEZhc3RNaXhlciB0aHJlYWQgZGF0YSB0byBiZSBzZW50IHRvIE1lZGlhIE1ldHJpY3MuCisgICAgaWYgKGRhdGEudGhyZWFkSW5mby50eXBlICE9IE5CTG9nOjpGQVNUTUlYRVIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUFuYWx5dGljc0l0ZW0+IGl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoImF1ZGlvdGhyZWFkIikpOworCisgICAgY29uc3QgSGlzdG9ncmFtICZ3b3JrSGlzdCA9IGRhdGEud29ya0hpc3Q7CisgICAgaWYgKHdvcmtIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkV29ya0hpc3QsIHdvcmtIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgY29uc3QgSGlzdG9ncmFtICZsYXRlbmN5SGlzdCA9IGRhdGEubGF0ZW5jeUhpc3Q7CisgICAgaWYgKGxhdGVuY3lIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkTGF0ZW5jeUhpc3QsIGxhdGVuY3lIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgY29uc3QgSGlzdG9ncmFtICZ3YXJtdXBIaXN0ID0gZGF0YS53YXJtdXBIaXN0OworICAgIGlmICh3YXJtdXBIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkV2FybXVwSGlzdCwgd2FybXVwSGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChkYXRhLnVuZGVycnVucyA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa1RocmVhZFVuZGVycnVucywgZGF0YS51bmRlcnJ1bnMpOworICAgIH0KKworICAgIGlmIChkYXRhLm92ZXJydW5zID4gMCkgeworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkT3ZlcnJ1bnMsIGRhdGEub3ZlcnJ1bnMpOworICAgIH0KKworICAgIC8vIFNlbmQgdG8gTWVkaWEgTWV0cmljcyBpZiB0aGUgcmVjb3JkIGlzIG5vdCBlbXB0eS4KKyAgICAvLyBUaGUgdGhyZWFkIGFuZCB0aW1lIGluZm8gYXJlIGFkZGVkIGluc2lkZSB0aGUgaWYgc3RhdGVtZW50IGJlY2F1c2UKKyAgICAvLyB3ZSB3YW50IHRvIHNlbmQgdGhlbSBvbmx5IGlmIHRoZXJlIGFyZSBwZXJmb3JtYW5jZSBtZXRyaWNzIHRvIHNlbmQuCisgICAgaWYgKGl0ZW0tPmNvdW50KCkgPiAwKSB7CisgICAgICAgIC8vIEFkZCB0aHJlYWQgaW5mbyBmaWVsZHMuCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlU3RyaW5nID0gTkJMb2c6OnRocmVhZFR5cGVUb1N0cmluZyhkYXRhLnRocmVhZEluZm8udHlwZSk7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFR5cGUsIHR5cGVTdHJpbmcpOworICAgICAgICBpdGVtLT5zZXRJbnQzMihrVGhyZWFkRnJhbWVDb3VudCwgZGF0YS50aHJlYWRQYXJhbXMuZnJhbWVDb3VudCk7CisgICAgICAgIGl0ZW0tPnNldEludDMyKGtUaHJlYWRTYW1wbGVSYXRlLCBkYXRhLnRocmVhZFBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQWRkIHRpbWUgaW5mbyBmaWVsZHMuCisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWRBY3RpdmUsIGRhdGEuYWN0aXZlIC8gMTAwMDAwMCk7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWREdXJhdGlvbiwgKHN5c3RlbVRpbWUoKSAtIGRhdGEuc3RhcnQpIC8gMTAwMDAwMCk7CisgICAgICAgIHJldHVybiBpdGVtLT5zZWxmcmVjb3JkKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gVE9ETzogdXNlIGEgZnVuY3Rpb24gbGlrZSB0aGlzIHRvIGV4dHJhY3QgbG9naWMgZnJvbSB3cml0ZVRvRmlsZQogLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkyNzk2MjAKIAogLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyBzcGFubmluZyBsb25nIHRpbWUgaW50ZXJ2YWxzIHRvIGZpbGUuCiAvLyBUT0RPOiB3cml0ZSBkYXRhIGluIGJpbmFyeSBmb3JtYXQKLXZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+ICZoaXN0cywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogZGlyZWN0b3J5LCBib29sIGFwcGVuZCwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoKSB7CkBAIC0xMjgsNiArMzAyLDUgQEAKICAgICBwZnMuY2xvc2UoKTsKIH0KIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAgYi9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5YjAzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1RpbWVsaW5lLmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKyNpZiAwICAgLy8gRklYTUUgc2VlIG5vdGUgaW4gVGltZWxpbmUuaAorTkJMb2c6OlRpbWVsaW5lOjpUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkKQorICAgIDogbVNpemUocm91bmR1cChzaXplKSksIG1Pd24oc2hhcmVkID09IE5VTEwpLAorICAgICAgbVNoYXJlZCgoU2hhcmVkICopIChtT3duID8gbmV3IGNoYXJbc2hhcmVkU2l6ZShzaXplKV0gOiBzaGFyZWQpKQoreworICAgIG5ldyAobVNoYXJlZCkgU2hhcmVkOworfQorCitOQkxvZzo6VGltZWxpbmU6On5UaW1lbGluZSgpCit7CisgICAgbVNoYXJlZC0+flNoYXJlZCgpOworICAgIGlmIChtT3duKSB7CisgICAgICAgIGRlbGV0ZVtdIChjaGFyICopIG1TaGFyZWQ7CisgICAgfQorfQorI2VuZGlmCisKKy8qc3RhdGljKi8KK3NpemVfdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSkKK3sKKyAgICAvLyBUT0RPIGZpZm8gbm93IHN1cHBvcnRzIG5vbi1wb3dlci1vZi0yIGJ1ZmZlciBzaXplcywgc28gY291bGQgcmVtb3ZlIHRoZSByb3VuZHVwCisgICAgcmV0dXJuIHNpemVvZihTaGFyZWQpICsgcm91bmR1cChzaXplKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9Xcml0ZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTNiZDUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcApAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9Xcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitXcml0ZXI6OldyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKSwKKyAgICAgIG1FbmFibGVkKG1GaWZvV3JpdGVyICE9IE5VTEwpCit7CisgICAgLy8gY2FjaGluZyBwaWQgYW5kIHByb2Nlc3MgbmFtZQorICAgIHBpZF90IGlkID0gOjpnZXRwaWQoKTsKKyAgICBjaGFyIHByb2NOYW1lWzE2XTsKKyAgICBpbnQgc3RhdHVzID0gcHJjdGwoUFJfR0VUX05BTUUsIHByb2NOYW1lKTsKKyAgICBpZiAoc3RhdHVzKSB7ICAvLyBlcnJvciBnZXR0aW5nIHByb2Nlc3MgbmFtZQorICAgICAgICBwcm9jTmFtZVswXSA9ICdcMCc7CisgICAgfQorICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4ocHJvY05hbWUpOworICAgIG1QaWRUYWdTaXplID0gbGVuZ3RoICsgc2l6ZW9mKHBpZF90KTsKKyAgICBtUGlkVGFnID0gbmV3IGNoYXJbbVBpZFRhZ1NpemVdOworICAgIG1lbWNweShtUGlkVGFnLCAmaWQsIHNpemVvZihwaWRfdCkpOworICAgIG1lbWNweShtUGlkVGFnICsgc2l6ZW9mKHBpZF90KSwgcHJvY05hbWUsIGxlbmd0aCk7Cit9CisKK1dyaXRlcjo6V3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKKyAgICA6IFdyaXRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCit7CisgICAgbUlNZW1vcnkgPSBpTWVtb3J5OworfQorCitXcml0ZXI6On5Xcml0ZXIoKQoreworICAgIGRlbGV0ZSBtRmlmb1dyaXRlcjsKKyAgICBkZWxldGUgbUZpZm87CisgICAgZGVsZXRlW10gbVBpZFRhZzsKK30KKwordm9pZCBXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaW5nID09IE5VTEwsICJBdHRlbXB0ZWQgdG8gbG9nIE5VTEwgc3RyaW5nIik7CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOworICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICB9CisgICAgbG9nKEVWRU5UX1NUUklORywgc3RyaW5nLCBsZW5ndGgpOworfQorCit2b2lkIFdyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOyAgICAgLy8gdGhlIFdyaXRlcjo6IGlzIG5lZWRlZCB0byBhdm9pZCB2aXJ0dWFsIGRpc3BhdGNoIGZvciBMb2NrZWRXcml0ZXIKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIFdyaXRlcjo6bG9nVGltZXN0YW1wKCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGlmICghY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cykpIHsKKyAgICAgICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKKyAgICB9Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgaGFzaCk7CisgICAgV3JpdGVyOjpsb2dWRm9ybWF0KGZtdCwgaGFzaCwgYXApOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBIaXN0VHNFbnRyeSBkYXRhOworICAgIGRhdGEuaGFzaCA9IGhhc2g7CisgICAgZGF0YS50cyA9IHN5c3RlbVRpbWUoKTsKKyAgICBpZiAoZGF0YS50cyA+IDApIHsKKyAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKKyAgICB9Cit9CisKK2Jvb2wgV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiBtRW5hYmxlZDsKK30KKworYm9vbCBXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGJvb2wgb2xkID0gbUVuYWJsZWQ7CisgICAgbUVuYWJsZWQgPSBlbmFibGVkICYmIG1TaGFyZWQgIT0gTlVMTDsKKyAgICByZXR1cm4gb2xkOworfQorCit2b2lkIFdyaXRlcjo6bG9nKGNvbnN0IEVudHJ5ICZldHIsIGJvb2wgdHJ1c3RlZCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF0cnVzdGVkKSB7CisgICAgICAgIGxvZyhldHIubUV2ZW50LCBldHIubURhdGEsIGV0ci5tTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBzaXplX3QgbmVlZCA9IGV0ci5tTGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZDsgLy8gbUV2ZW50LCBtTGVuZ3RoLCBkYXRhW21MZW5ndGhdLCBtTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgPSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBGSUZPCisKKyAgICAvLyBGSVhNRSBvcHRpbWl6ZSB0aGlzIHVzaW5nIG1lbWNweSBmb3IgdGhlIGRhdGEgcGFydCBvZiB0aGUgRW50cnkuCisgICAgLy8gVGhlIEVudHJ5IGNvdWxkIGhhdmUgYSBtZXRob2QgY29weVRvKHB0ciwgb2Zmc2V0LCBzaXplKSB0byBvcHRpbWl6ZSB0aGUgY29weS4KKyAgICAvLyBjaGVja3Mgc2l6ZSBvZiBhIHNpbmdsZSBsb2cgRW50cnk6IHR5cGUsIGxlbmd0aCwgZGF0YSBwb2ludGVyIGFuZCBlbmRpbmcKKyAgICB1aW50OF90IHRlbXBbRW50cnk6OmtNYXhMZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkXTsKKyAgICAvLyB3cml0ZSB0aGlzIGRhdGEgdG8gdGVtcCBhcnJheQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmVlZDsgaSsrKSB7CisgICAgICAgIHRlbXBbaV0gPSBldHIuY29weUVudHJ5RGF0YUF0KGkpOworICAgIH0KKyAgICAvLyB3cml0ZSB0byBjaXJjdWxhciBidWZmZXIKKyAgICBtRmlmb1dyaXRlci0+d3JpdGUodGVtcCwgbmVlZCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgLy8gVE9ETyBQZXJoYXBzIGl0IG1ha2VzIHNlbnNlIHRvIGRpc3BsYXkgdHJ1bmNhdGVkIGRhdGEgb3IgYXQgbGVhc3QgYQorICAgICAgICAvLyAgICAgIG1lc3NhZ2UgdGhhdCB0aGUgZGF0YSBpcyB0b28gbG9uZz8gIFRoZSBjdXJyZW50IGJlaGF2aW9yIGNhbiBjcmVhdGUKKyAgICAgICAgLy8gICAgICBhIGNvbmZ1c2lvbiBmb3IgYSBwcm9ncmFtbWVyIGRlYnVnZ2luZyB0aGVpciBjb2RlLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElnbm9yZSBpZiBpbnZhbGlkIGV2ZW50CisgICAgaWYgKGV2ZW50ID09IEVWRU5UX1JFU0VSVkVEIHx8IGV2ZW50ID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRW50cnkgZXRyKGV2ZW50LCBkYXRhLCBsZW5ndGgpOworICAgIGxvZyhldHIsIHRydWUgLyp0cnVzdGVkKi8pOworfQorCit2b2lkIFdyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjaGFyIGJ1ZmZlcltFbnRyeTo6a01heExlbmd0aCArIDEgLypOVUwqL107CisgICAgaW50IGxlbmd0aCA9IHZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBmbXQsIGFwKTsKKyAgICBpZiAobGVuZ3RoID49IChpbnQpIHNpemVvZihidWZmZXIpKSB7CisgICAgICAgIGxlbmd0aCA9IHNpemVvZihidWZmZXIpIC0gMTsKKyAgICAgICAgLy8gTlVMIHRlcm1pbmF0aW9uIGlzIG5vdCByZXF1aXJlZAorICAgICAgICAvLyBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7CisgICAgfQorICAgIGlmIChsZW5ndGggPj0gMCkgeworICAgICAgICBsb2coRVZFTlRfU1RSSU5HLCBidWZmZXIsIGxlbmd0aCk7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKGZtdCk7CisgICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgIH0KKyAgICBsb2coRVZFTlRfRk1UX1NUQVJULCBmbXQsIGxlbmd0aCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dUaW1lc3RhbXBGb3JtYXQoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBuc2Vjc190IHRzID0gc3lzdGVtVGltZSgpOworICAgIGlmICh0cyA+IDApIHsKKyAgICAgICAgbG9nKEVWRU5UX0ZNVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcmdwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7CisgICAgaW50IGk7CisgICAgZG91YmxlIGQ7CisgICAgZmxvYXQgZjsKKyAgICBjaGFyKiBzOworICAgIHNpemVfdCBsZW5ndGg7CisgICAgaW50NjRfdCB0OworICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wRm9ybWF0KCk7CisgICAgbG9nKEVWRU5UX0ZNVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKKyAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBmbXQ7ICpwICE9ICdcMCc7IHArKykgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCisgICAgICAgIGlmICgqcCAhPSAnJScpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCgqKytwKSB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIHMgPSB2YV9hcmcoYXJncCwgY2hhciAqKTsKKyAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9TVFJJTkcsIHMsIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICB0ID0gdmFfYXJnKGFyZ3AsIGludDY0X3QpOworICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9USU1FU1RBTVAsICZ0LCBzaXplb2YodCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKKyAgICAgICAgICAgIGkgPSB2YV9hcmcoYXJncCwgaW50KTsKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfSU5URUdFUiwgJmksIHNpemVvZihpKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIGQgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsgLy8gZmxvYXQgYXJndW1lbnRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGUgaW4gdmFyYXJnIGxpc3RzCisgICAgICAgICAgICBmID0gKGZsb2F0KWQ7CisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX0ZMT0FULCAmZiwgc2l6ZW9mKGYpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfUElELCBtUGlkVGFnLCBtUGlkVGFnU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyB0aGUgIiVcMCIgY2FzZSBmaW5pc2hlcyBwYXJzaW5nCisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIC0tcDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBXcml0ZXIgcGFyc2VkIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogJWMiLCAqcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFbnRyeSBldHIoRVZFTlRfRk1UX0VORCwgbnVsbHB0ciwgMCk7CisgICAgbG9nKGV0ciwgdHJ1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogV3JpdGVyKHNoYXJlZCwgc2l6ZSkKK3sKK30KKworYm9vbCBMb2NrZWRXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gV3JpdGVyOjppc0VuYWJsZWQoKTsKK30KKworYm9vbCBMb2NrZWRXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIFdyaXRlcjo6c2V0RW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBMb2NrZWRXcml0ZXI6OmxvZyhjb25zdCBFbnRyeSAmZW50cnksIGJvb2wgdHJ1c3RlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2coZW50cnksIHRydXN0ZWQpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YwMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FbnRyeS5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb193cml0ZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKy8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQorc3RydWN0IGVudHJ5IHsKKyAgICBjb25zdCB1aW50OF90IHR5cGU7CisgICAgY29uc3QgdWludDhfdCBsZW5ndGg7CisgICAgY29uc3QgdWludDhfdCBkYXRhWzBdOworfTsKKworLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKK3N0cnVjdCBlbmRpbmcgeworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgbmV4dFswXTsKK307CisKKy8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBzaGFyZWQgbWVtb3J5CisvLyAgYnl0ZVswXSAgICAgICAgICAgICBtRXZlbnQKKy8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKKy8vICBieXRlWzJdICAgICAgICAgICAgIG1EYXRhWzBdCisvLyAgLi4uCisvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQorLy8gIC4uLgorLy8gIGJ5dGVbMittTGVuZ3RoLTFdICAgbURhdGFbbUxlbmd0aC0xXQorLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCisvLyAgYnl0ZVszK21MZW5ndGhdICAgICBzdGFydCBvZiBuZXh0IGxvZyBlbnRyeQorY2xhc3MgRW50cnkgeworcHVibGljOgorICAgIEVudHJ5KEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQorICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkge30KKyAgICB+RW50cnkoKSB7fQorCisgICAgLy8gdXNlZCBkdXJpbmcgd3JpdGluZyB0byBmb3JtYXQgRW50cnkgaW5mb3JtYXRpb24gYXMgZm9sbG93czoKKyAgICAvLyBbdHlwZV1bbGVuZ3RoXVtkYXRhIC4uLiBdW2xlbmd0aF0KKyAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgV3JpdGVyOworICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKKyAgICB1aW50OF90ICAgICBtTGVuZ3RoOyAgICAvLyBsZW5ndGggb2YgYWRkaXRpb25hbCBkYXRhLCAwIDw9IG1MZW5ndGggPD0ga01heExlbmd0aAorICAgIGNvbnN0IHZvaWQgKm1EYXRhOyAgICAgIC8vIGV2ZW50IHR5cGUtc3BlY2lmaWMgZGF0YQorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKK3B1YmxpYzoKKyAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIG1EYXRhWy4uLl0sIGR1cGxpY2F0ZSBtTGVuZ3RoCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7CisgICAgLy8gZW5kaW5kIGxlbmd0aCBvZiBwcmV2aW91cyBlbnRyeQorICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90IGtQcmV2aW91c0xlbmd0aE9mZnNldCA9IC0gc2l6ZW9mKGVuZGluZykgKworICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Cit9OworCisvLyBlbnRyeSBpdGVyYXRvcgorY2xhc3MgRW50cnlJdGVyYXRvciB7CitwdWJsaWM6CisgICAgLy8gVXNlZCBmb3IgZHVtbXkgaW5pdGlhbGl6YXRpb24uIFBlcmZvcm1pbmcgb3BlcmF0aW9ucyBvbiBhIGRlZmF1bHQtY29uc3RydWN0ZWQKKyAgICAvLyBFbnRyeUl0ZXJhdG9yIG90aGVyIHRoYW4gYXNzaWduaW5nIGl0IHRvIGFub3RoZXIgdmFsaWQgRW50cnlJdGVyYXRvcgorICAgIC8vIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBFbnRyeUl0ZXJhdG9yKCk7CisgICAgLy8gQ2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIGVudHJ5IGlzIG5vdCBudWxscHRyLgorICAgIC8vIFBhc3NpbmcgaW4gbnVsbHB0ciBjYW4gcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBleHBsaWNpdCBFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKKyAgICBFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKTsKKworICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKKyAgICBjb25zdCBlbnRyeSYgICAgb3BlcmF0b3IqKCkgY29uc3Q7CisgICAgY29uc3QgZW50cnkqICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKKyAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yJiAgb3BlcmF0b3IrKygpOyAvLyArK2kKKyAgICAvLyBiYWNrIHRvIHByZXZpb3VzIGVudHJ5CisgICAgRW50cnlJdGVyYXRvciYgIG9wZXJhdG9yLS0oKTsgLy8gLS1pCisgICAgLy8gcmV0dXJucyBhbiBFbnRyeUl0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5leHQgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yICAgbmV4dCgpIGNvbnN0OworICAgIC8vIHJldHVybnMgYW4gRW50cnlJdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmV2aW91cyBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgICBwcmV2KCkgY29uc3Q7CisgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICBvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworCisgICAgYm9vbCAgICAgICAgICAgIGhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgIGNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3Q7CisKKyAgICAvLyBtZW1jcHkgcHJlZmVycmVkIHRvIHJlaW50ZXJwcmV0X2Nhc3QgdG8gYXZvaWQgcG90ZW50aWFsbHkgdW5zdXBwb3J0ZWQKKyAgICAvLyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzcy4KKyNpZiAwCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgY29uc3QgVCYgcGF5bG9hZCgpIHsKKyAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4obVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSk7CisgICAgfQorI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBUIHBheWxvYWQoKSBjb25zdCB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGU8VD46OnZhbHVlCisgICAgICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIk5CTG9nOjpFbnRyeUl0ZXJhdG9yIHBheWxvYWQgbXVzdCBiZSB0cml2aWFsbHkgY29weWFibGUsIG5vbi1wb2ludGVyIHR5cGUuIik7CisgICAgICAgIFQgcGF5bG9hZDsKKyAgICAgICAgbWVtY3B5KCZwYXlsb2FkLCBtUHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBzaXplb2YocGF5bG9hZCkpOworICAgICAgICByZXR1cm4gcGF5bG9hZDsKKyAgICB9CisjZW5kaWYKKworICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHVpbnQ4X3QgICptUHRyOyAgIC8vIFNob3VsZCBub3QgYmUgbnVsbHB0ciBleGNlcHQgZm9yIGR1bW15IGluaXRpYWxpemF0aW9uCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgdXNlZCBmb3IgbWVyZ2luZyBpbnRvIHRoZSBNZXJnZXIncyBidWZmZXIuCisKK2NsYXNzIEFic3RyYWN0RW50cnkgeworcHVibGljOgorICAgIHZpcnR1YWwgfkFic3RyYWN0RW50cnkoKSB7fQorCisgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwdHIuCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cik7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAorICAgIHZpcnR1YWwgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCA9IDA7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCisgICAgdmlydHVhbCBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCA9IDA7CisKKyAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQorICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCisgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKKyAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIHRvIHVpbnQzMl90CisgICAgdmlydHVhbCBpbnQgICAgICAgICAgIGF1dGhvcigpIGNvbnN0ID0gMDsKKworICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBpdGVyYXRvciB0byBlbmQgb2YgZW50cnkKKyAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlciwgd2hpY2ggc2hhbGwgbm90IGJlIG51bGxwdHIuCisgICAgZXhwbGljaXQgQWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSkgOiBtRW50cnkoZW50cnkpIHt9CisgICAgLy8gY29waWVzIG9yZGluYXJ5IGVudHJ5IGZyb20gc3JjIHRvIGRzdCwgYW5kIHJldHVybnMgbGVuZ3RoIG9mIGVudHJ5CisgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7CisgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IG1FbnRyeTsKK307CisKKy8vIEFQSSBmb3IgaGFuZGxpbmcgZm9ybWF0IGVudHJ5IG9wZXJhdGlvbnMKKworLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorLy8gICAgKiBGTVRfU1RBUlQgZW50cnksIGNvbnRhaW5pbmcgdGhlIGZvcm1hdCBzdHJpbmcKKy8vICAgICogVElNRVNUQU1QIGVudHJ5CisvLyAgICAqIEhBU0ggZW50cnkKKy8vICAgICogYXV0aG9yIGVudHJ5IG9mIHRoZSB0aHJlYWQgdGhhdCBnZW5lcmF0ZWQgaXQgKG9wdGlvbmFsLCBwcmVzZW50IGluIG1lcmdlZCBsb2cpCisvLyAgICAqIGZvcm1hdCBhcmcxCisvLyAgICAqIGZvcm1hdCBhcmcyCisvLyAgICAqIC4uLgorLy8gICAgKiBGTVRfRU5EIGVudHJ5CitjbGFzcyBGb3JtYXRFbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICAvLyBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7CisgICAgZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQorICAgIH5Gb3JtYXRFbnRyeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKworICAgIC8vIEVudHJ5J3MgZm9ybWF0IHN0cmluZworICAgIGNvbnN0IGNoYXIqICAgZm9ybWF0U3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLyBFbnJ0eSdzIGZvcm1hdCBzdHJpbmcgbGVuZ3RoCisgICAgc2l6ZV90ICAgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKKworICAgIC8vIEZvcm1hdCBhcmd1bWVudHMgKGV4Y2x1ZGluZyBmb3JtYXQgc3RyaW5nLCB0aW1lc3RhbXAgYW5kIGF1dGhvcikKKyAgICBFbnRyeUl0ZXJhdG9yIGFyZ3MoKSBjb25zdDsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCisgICAgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKKyAgICBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCisgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKKyAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQorICAgIGludCAgICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgc2l6ZSBvZiBvcmlnaW5hbCBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBIaXN0b2dyYW1FbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9CisgICAgfkhpc3RvZ3JhbUVudHJ5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGxvZ19oYXNoX3QgICAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgaW50ICAgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKKworICAgIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRXZlbnRzLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTRmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0VWRU5UU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfRVZFTlRTX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBUT0RPIGhhdmUgYSBjb21tZW50IHNvbWV3aGVyZSBleHBsYWluaW5nIHRoZSB3aG9sZSBwcm9jZXNzIGZvciBhZGRpbmcgYSBuZXcgRVZFTlRfCisKKy8vIE5CTG9nIEV2ZW50IHR5cGVzLiBUaGUgRXZlbnRzIGFyZSBuYW1lZCB0byBwcm92aWRlIGNvbnRleHR1YWwgbWVhbmluZyBmb3Igd2hhdCBpcyBsb2dnZWQuCisvLyBJZiBhZGRpbmcgYSBuZXcgc3RhbmRhbG9uZSBFdmVudCBoZXJlLCB1cGRhdGUgdGhlIGV2ZW50LXRvLXR5cGUgbWFwcGluZyBieSBhZGRpbmcgYQorLy8gTUFQX0VWRU5UX1RPX1RZUEUgc3RhdGVtZW50IGJlbG93LgorLy8gWFhYIE5vdGUgdGhhdCBhcyBvZiB0aGUgY3VycmVudCBkZXNpZ24sIEV2ZW50cyBzaG91bGQgbm90IGJlIHJlbnVtYmVyZWQgKGkuZS4gcmVvcmRlcmVkKQorLy8gaWYgdGhleSBldmVyIGxlYXZlIG1lbW9yeSAoZm9yIGV4YW1wbGUsIHdyaXR0ZW4gdG8gZmlsZSwgdXBsb2FkZWQgdG8gY2xvdWQsIGV0Yy4pLgorLy8gVE9ETyBtYWtlIHNvbWUgc29ydCBvZiBpbnRlcmZhY2UgdG8ga2VlcCB0aGVzZSAiY29udHJhY3QiIGNvbnN0YW50cy4KK2VudW0gRXZlbnQgOiB1aW50OF90IHsKKyAgICBFVkVOVF9SRVNFUlZFRCwKKyAgICBFVkVOVF9TVFJJTkcsICAgICAgICAgICAgICAgLy8gQVNDSUkgc3RyaW5nLCBub3QgTlVMLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aW1lc3RhbXAgb3B0aW9uYWwKKyAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCisKKyAgICAvLyBUeXBlcyBmb3IgRm9ybWF0IEVudHJ5LCBpLmUuIGZvcm1hdHRlZCBlbnRyeQorICAgIEVWRU5UX0ZNVF9TVEFSVCwgICAgICAgICAgICAvLyBsb2dGb3JtYXQgc3RhcnQgZXZlbnQ6IGVudHJ5IGluY2x1ZGVzIGZvcm1hdCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cworICAgIC8vIGZvcm1hdCBhcmd1bWVudHMKKyAgICBFVkVOVF9GTVRfQVVUSE9SLCAgICAgICAgICAgLy8gYXV0aG9yIGluZGV4IChwcmVzZW50IGluIG1lcmdlZCBsb2dzKSB0cmFja3MgZW50cnkncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKKyAgICBFVkVOVF9GTVRfRkxPQVQsICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfSEFTSCwgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLCAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX1BJRCwgICAgICAgICAgICAgIC8vIHByb2Nlc3MgSUQgYW5kIHByb2Nlc3MgbmFtZQorICAgIEVWRU5UX0ZNVF9TVFJJTkcsICAgICAgICAgICAvLyBzdHJpbmcgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLCAgICAgICAgLy8gdGltZXN0YW1wIHZhbHVlIGVudHJ5CisgICAgLy8gZW5kIG9mIGZvcm1hdCBhcmd1bWVudHMKKyAgICBFVkVOVF9GTVRfRU5ELCAgICAgICAgICAgICAgLy8gZW5kIG9mIGxvZ0Zvcm1hdCBhcmd1bWVudCBsaXN0CisKKyAgICAvLyBUeXBlcyBmb3Igd2FrZXVwIHRpbWVzdGFtcCBoaXN0b2dyYW1zCisgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIG9uIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSBjYWxsCisgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQorCisgICAgLy8gVHlwZXMgcmVwcmVzZW50aW5nIGF1ZGlvIHBlcmZvcm1hbmNlIG1ldHJpY3MKKyAgICBFVkVOVF9MQVRFTkNZLCAgICAgICAgICAgICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIGZyYW1lcyBwcmVzZW50ZWQgYnkgSEFMIGFuZCBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiB0byBIQUwgb3V0cHV0IHNpbmssIGRpdmlkZWQgYnkgc2FtcGxlIHJhdGUuCisgICAgRVZFTlRfT1ZFUlJVTiwgICAgICAgICAgICAgIC8vIHByZWRpY3RlZCB0aHJlYWQgb3ZlcnJ1biBldmVudCB0aW1lc3RhbXAKKyAgICBFVkVOVF9USFJFQURfSU5GTywgICAgICAgICAgLy8gc2VlIHRocmVhZF9pbmZvX3QgYmVsb3cKKyAgICBFVkVOVF9VTkRFUlJVTiwgICAgICAgICAgICAgLy8gcHJlZGljdGVkIHRocmVhZCB1bmRlcnJ1biBldmVudCB0aW1lc3RhbXAKKyAgICBFVkVOVF9XQVJNVVBfVElNRSwgICAgICAgICAgLy8gdGhyZWFkIHdhcm11cCB0aW1lCisgICAgRVZFTlRfV09SS19USU1FLCAgICAgICAgICAgIC8vIHRoZSB0aW1lIGEgdGhyZWFkIHRha2VzIHRvIGRvIHdvcmssIGUuZy4gcmVhZCwgd3JpdGUsIGV0Yy4KKyAgICBFVkVOVF9USFJFQURfUEFSQU1TLCAgICAgICAgLy8gc2VlIHRocmVhZF9wYXJhbXNfdCBiZWxvdworCisgICAgRVZFTlRfVVBQRVJfQk9VTkQsICAgICAgICAgIC8vIHRvIGNoZWNrIGZvciBpbnZhbGlkIGV2ZW50cworfTsKKworLy8gTkJMb2cgY3VzdG9tLWRlZmluZWQgc3RydWN0cy4gU29tZSBOQkxvZyBFdmVudCB0eXBlcyBtYXAgdG8gdGhlc2Ugc3RydWN0cy4KKwordXNpbmcgbG9nX2hhc2hfdCA9IHVpbnQ2NF90OworCisvLyB1c2VkIGZvciBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMgKG5vdCBtYXBwZWQpCitzdHJ1Y3QgSGlzdFRzRW50cnkgeworICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICBpbnQ2NF90IHRzOworfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvLyB1c2VkIGZvciBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMgKG5vdCBtYXBwZWQpCitzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgaW50NjRfdCB0czsKKyAgICBpbnQgYXV0aG9yOworfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitlbnVtIFRocmVhZFR5cGUgeworICAgIFVOS05PV04sCisgICAgTUlYRVIsCisgICAgQ0FQVFVSRSwKKyAgICBGQVNUTUlYRVIsCisgICAgRkFTVENBUFRVUkUsCit9OworCitpbmxpbmUgY29uc3QgY2hhciAqdGhyZWFkVHlwZVRvU3RyaW5nKFRocmVhZFR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUlYRVI6CisgICAgICAgIHJldHVybiAiTUlYRVIiOworICAgIGNhc2UgQ0FQVFVSRToKKyAgICAgICAgcmV0dXJuICJDQVBUVVJFIjsKKyAgICBjYXNlIEZBU1RNSVhFUjoKKyAgICAgICAgcmV0dXJuICJGQVNUTUlYRVIiOworICAgIGNhc2UgRkFTVENBUFRVUkU6CisgICAgICAgIHJldHVybiAiRkFTVENBUFRVUkUiOworICAgIGNhc2UgVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgIH0KK30KKworLy8gbWFwcGVkIGZyb20gRVZFTlRfVEhSRUFEX0lORk8KKy8vIFRoZXNlIGZpZWxkcyBhbHdheXMgc3RheSB0aGUgc2FtZSB0aHJvdWdob3V0IGEgdGhyZWFkJ3MgbGlmZXRpbWUgYW5kCisvLyBzaG91bGQgb25seSBuZWVkIHRvIGJlIGxvZ2dlZCBvbmNlIHVwb24gdGhyZWFkIGluaXRpYWxpemF0aW9uLgorLy8gVGhlcmUgaXMgY3VycmVudGx5IG5vIHJlY292ZXJ5IG1lY2hhbmlzbSBpZiB0aGUgbG9nIGV2ZW50IGNvcnJlc3BvbmRpbmcKKy8vIHRvIHRoaXMgdHlwZSBpcyBsb3N0LgorLy8gVE9ETyBhZGQgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGFkZGluZyBhIHJlYWRlciB0byBNZWRpYUxvZ1NlcnZpY2U/CitzdHJ1Y3QgdGhyZWFkX2luZm9fdCB7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSAtMTsgICAgICAvLyBUaHJlYWQgSS9PIGhhbmRsZQorICAgIFRocmVhZFR5cGUgdHlwZSA9IFVOS05PV047ICAgICAgLy8gU2VlIGVudW0gVGhyZWFkVHlwZSBhYm92ZQorfTsKKworLy8gbWFwcGVkIGZyb20gRVZFTlRfVEhSRUFEX1BBUkFNUworLy8gVGhlc2UgZmllbGRzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29uc3RhbnQgdGhyb3VnaG91dCBhIHRocmVhZCdzIGxpZmV0aW1lIGFuZAorLy8gY2FuIGJlIGxvZ2dlZCB3aGVuZXZlciBhIHRocmVhZCByZWNlaXZlcyBuZXcgY29uZmlndXJhdGlvbnMgb3IgcGFyYW1ldGVycy4KK3N0cnVjdCB0aHJlYWRfcGFyYW1zX3QgeworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMDsgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgcmVhZCBvciB3cml0ZSBidWZmZXIKKyAgICB1bnNpZ25lZCBzYW1wbGVSYXRlID0gMDsgICAgICAgIC8vIGluIGZyYW1lcyBwZXIgc2Vjb25kCit9OworCit0ZW1wbGF0ZSA8RXZlbnQgRT4gc3RydWN0IGdldF9tYXBwZWQ7CisjZGVmaW5lIE1BUF9FVkVOVF9UT19UWVBFKEUsIFQpIFwKK3RlbXBsYXRlPD4gc3RydWN0IGdldF9tYXBwZWQ8RT4geyBcCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZTxUPjo6dmFsdWUgXAorICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsIFwKKyAgICAgICAgICAgICJOQkxvZzo6RXZlbnQgbXVzdCBtYXAgdG8gdHJpdmlhbGx5IGNvcHlhYmxlLCBub24tcG9pbnRlciB0eXBlLiIpOyBcCisgICAgdHlwZWRlZiBUIHR5cGU7IFwKK30KKworLy8gTWFwcyBhbiBOQkxvZyBFdmVudCB0eXBlIHRvIGEgQysrIFBPRCB0eXBlLgorTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfTEFURU5DWSwgZG91YmxlKTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX09WRVJSVU4sIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVEhSRUFEX0lORk8sIHRocmVhZF9pbmZvX3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVU5ERVJSVU4sIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfV0FSTVVQX1RJTUUsIGRvdWJsZSk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9XT1JLX1RJTUUsIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVEhSRUFEX1BBUkFNUywgdGhyZWFkX3BhcmFtc190KTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19FVkVOVFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9NZXJnZXIuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhODUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfTUVSR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19NRVJHRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nMTY7CitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgTkJMb2cgeworCitzdHJ1Y3QgU2hhcmVkOworCisvLyBUT0RPIHVwZGF0ZSBjb21tZW50cyB0byByZWZsZWN0IGN1cnJlbnQgZnVuY3Rpb25hbGl0aWVzCisKKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSBlYWNoIHRocmVhZCdzIGluZGl2aWR1YWwgRklGTyBpbiBzaGFyZWQgbWVtb3J5CisvLyBhbmQgd3JpdGUgaXQgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkuCitjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgTWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgfk1lcmdlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkUmVhZGVyKGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+ICZyZWFkZXIpOworICAgIC8vIFRPRE8gYWRkIHJlbW92ZVJlYWRlcgorICAgIHZvaWQgbWVyZ2UoKTsKKworICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8UmVhZGVyPj4mIGdldFJlYWRlcnMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB2ZWN0b3Igb2YgdGhlIHJlYWRlcnMgdGhlIG1lcmdlciBpcyBzdXBwb3NlZCB0byBtZXJnZSBmcm9tLgorICAgIC8vIGV2ZXJ5IHJlYWRlciByZWFkcyBmcm9tIGEgd3JpdGVyJ3MgYnVmZmVyCisgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaworICAgIHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+IG1SZWFkZXJzOworCisgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+IG1GaWZvV3JpdGVyOyAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8KK307CisKKy8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKKy8vIGRhdGEgY29sbGVjdGVkIGJ5IE5CTG9nOjpNZXJnZXIgZnJvbSBhbGwgUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCisvLyB0aGlzIGRhdGEgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4KK2NsYXNzIE1lcmdlUmVhZGVyIDogcHVibGljIFJlYWRlciB7CitwdWJsaWM6CisgICAgTWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpOworCisgICAgLy8gcHJvY2VzcyBhIHBhcnRpY3VsYXIgc25hcHNob3Qgb2YgdGhlIHJlYWRlcgorICAgIHZvaWQgcHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICZzbmFwLCBpbnQgYXV0aG9yKTsKKworICAgIC8vIGNhbGwgZ2V0U25hcHNob3Qgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlYWRlcidzIGJ1ZmZlciBhbmQgcHJvY2VzcyB0aGUgZGF0YQorICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7CisKKyAgICAvLyBjaGVjayBmb3IgcGVyaW9kaWMgcHVzaCBvZiBwZXJmb3JtYW5jZSBkYXRhIHRvIG1lZGlhIG1ldHJpY3MsIGFuZCBwZXJmb3JtCisgICAgLy8gdGhlIHNlbmQgaWYgaXQgaXMgdGltZSB0byBkbyBzby4KKyAgICB2b2lkIGNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCk7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworcHJpdmF0ZToKKyAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAorICAgIC8vICAgICAgIGJlY2F1c2UgZXZlbiB0aG91Z2ggb3VyIHVzZSBvZiBpdCBpcyByZWFkLW9ubHkgdGhlcmUgbWF5IGJlIGFzeW5jaHJvbm91cyB1cGRhdGVzCisgICAgLy8gVGhlIG9iamVjdCBpcyBvd25lZCBieSB0aGUgTWVyZ2VyIGNsYXNzLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBtUmVhZGVyczsKKworICAgIC8vIGFuYWx5emVzLCBjb21wcmVzc2VzIGFuZCBzdG9yZXMgdGhlIG1lcmdlZCBkYXRhCisgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCisgICAgLy8gbG9jYXRpb24gd2l0aGluIGVhY2ggYXV0aG9yCisgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXM7CisKKyAgICAvLyBjb21wcmVzc2VzIGFuZCBzdG9yZXMgYXVkaW8gcGVyZm9ybWFuY2UgZGF0YSBmcm9tIGVhY2ggdGhyZWFkJ3MgYnVmZmVycy4KKyAgICAvLyBmaXJzdCBwYXJhbWV0ZXIgaXMgYXV0aG9yLCBpLmUuIHRocmVhZCBpbmRleC4KKyAgICBzdGQ6Om1hcDxpbnQsIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE+IG1UaHJlYWRQZXJmb3JtYW5jZURhdGE7CisKKyAgICAvLyBob3cgb2Z0ZW4gdG8gcHVzaCBkYXRhIHRvIE1lZGlhIE1ldHJpY3MKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga1BlcmlvZGljTWVkaWFNZXRyaWNzUHVzaCA9IHMybnMoKG5zZWNzX3QpMiAqIDYwICogNjApOyAvLyAyIGhvdXJzCisKKyAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQorICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBmbXRFbnRyeQorICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmZtdEVudHJ5LCBTdHJpbmc4ICpib2R5KTsKK307CisKKy8vIE1lcmdlVGhyZWFkIGlzIGEgdGhyZWFkIHRoYXQgY29udGFpbnMgYSBNZXJnZXIuIEl0IHdvcmtzIGFzIGEgcmV0cmlnZ2VyYWJsZSBvbmUtc2hvdDoKKy8vIHdoZW4gdHJpZ2dlcmVkLCBpdCBhd2FrZXMgZm9yIGEgbGFwc2Ugb2YgdGltZSwgZHVyaW5nIHdoaWNoIGl0IHBlcmlvZGljYWxseSBtZXJnZXM7IGlmCisvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCisvLyBUaGUgdGhyZWFkIGlzIHRyaWdnZXJlZCBvbiBBdWRpb0ZsaW5nZXIgYmluZGVyIGFjdGl2aXR5LgorY2xhc3MgTWVyZ2VUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlciwgTWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKTsKKyAgICB+TWVyZ2VUaHJlYWQoKSBvdmVycmlkZTsKKworICAgIC8vIFJlc2V0IHRpbWVvdXQgYW5kIGFjdGl2YXRlIHRocmVhZCB0byBtZXJnZSBwZXJpb2RpY2FsbHkgaWYgaXQncyBpZGxlCisgICAgdm9pZCB3YWtldXAoKTsKKworICAgIC8vIFNldCB0aW1lb3V0IHBlcmlvZCB1bnRpbCB0aGUgbWVyZ2luZyB0aHJlYWQgZ29lcyBpZGxlIGFnYWluCisgICAgdm9pZCBzZXRUaW1lb3V0VXMoaW50IHRpbWUpOworCitwcml2YXRlOgorICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCisgICAgLy8gdGhlIG1lcmdlciB3aG8gYWN0dWFsbHkgZG9lcyB0aGUgd29yayBvZiBtZXJnaW5nIHRoZSBsb2dzCisgICAgTWVyZ2VyJiAgICAgIG1NZXJnZXI7CisKKyAgICAvLyB0aGUgbWVyZ2VyZWFkZXIgdXNlZCB0byBwcm9jZXNzIGRhdGEgbWVyZ2VkIGJ5IG1NZXJnZXIKKyAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOworCisgICAgLy8gbXV0ZXggZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUKKyAgICBNdXRleCAgICAgICAgbU11dGV4OworCisgICAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHRvIGFjdGl2YXRlIG1lcmdpbmcgb24gdGltZW91dCA+PSAwCisgICAgQ29uZGl0aW9uICAgIG1Db25kOworCisgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCisgICAgaW50ICAgICAgICAgIG1UaW1lb3V0VXM7CisKKyAgICAvLyBtZXJnaW5nIHBlcmlvZCB3aGVuIHRoZSB0aHJlYWQgaXMgYXdha2UKKyAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkU2xlZXBQZXJpb2RVcyA9IDEwMDAwMDAgLyoxcyovOworCisgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCisgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFdha2V1cFBlcmlvZFVzID0gMzAwMDAwMCAvKjNzKi87Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX01FUkdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKaW5kZXggZmI2ZjE3OS4uZmQ3MzUzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApAQCAtMTksNTk1ICsxOSwxMCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19ICiAKLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIE5CTG9nIHsKLQotcHVibGljOgotCi0gICAgdXNpbmcgbG9nX2hhc2hfdCA9IFJlcG9ydFBlcmZvcm1hbmNlOjpsb2dfaGFzaF90OwotCi0gICAgLy8gRklYTUUgRXZlcnl0aGluZyBuZWVkZWQgZm9yIGNsaWVudCAod3JpdGVyIEFQSSBhbmQgcmVnaXN0cmF0aW9uKSBzaG91bGQgYmUgaXNvbGF0ZWQKLSAgICAvLyAgICAgICBmcm9tIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICBjbGFzcyBXcml0ZXI7Ci0gICAgY2xhc3MgUmVhZGVyOwotCi0gICAgZW51bSBFdmVudCA6IHVpbnQ4X3QgewotICAgICAgICBFVkVOVF9SRVNFUlZFRCwKLSAgICAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRpbWVzdGFtcCBvcHRpb25hbAotICAgICAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCi0gICAgICAgIEVWRU5UX0lOVEVHRVIsICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5Ci0gICAgICAgIEVWRU5UX0ZMT0FULCAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCB2YWx1ZSBlbnRyeQotICAgICAgICBFVkVOVF9QSUQsICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBJRCBhbmQgcHJvY2VzcyBuYW1lCi0gICAgICAgIEVWRU5UX0FVVEhPUiwgICAgICAgICAgICAgICAvLyBhdXRob3IgaW5kZXggKHByZXNlbnQgaW4gbWVyZ2VkIGxvZ3MpIHRyYWNrcyBlbnRyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKLSAgICAgICAgRVZFTlRfU1RBUlRfRk1ULCAgICAgICAgICAgIC8vIGxvZ0Zvcm1hdCBzdGFydCBldmVudDogZW50cnkgaW5jbHVkZXMgZm9ybWF0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cwotICAgICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGluZSBudW1iZXIKLSAgICAgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQotICAgICAgICBFVkVOVF9BVURJT19TVEFURSwgICAgICAgICAgLy8gYXVkaW8gb24vb2ZmIGV2ZW50OiBsb2dnZWQgb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlIGNhbGwKLSAgICAgICAgRVZFTlRfRU5EX0ZNVCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAotCi0gICAgICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKLSAgICB9OwotCi1wcml2YXRlOgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwotCi0gICAgLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgIC8vICAgICogU1RBUlRfRk1UIGVudHJ5LCBjb250YWluaW5nIHRoZSBmb3JtYXQgc3RyaW5nCi0gICAgLy8gICAgKiBUSU1FU1RBTVAgZW50cnkKLSAgICAvLyAgICAqIEhBU0ggZW50cnkKLSAgICAvLyAgICAqIGF1dGhvciBlbnRyeSBvZiB0aGUgdGhyZWFkIHRoYXQgZ2VuZXJhdGVkIGl0IChvcHRpb25hbCwgcHJlc2VudCBpbiBtZXJnZWQgbG9nKQotICAgIC8vICAgICogZm9ybWF0IGFyZzEKLSAgICAvLyAgICAqIGZvcm1hdCBhcmcyCi0gICAgLy8gICAgKiAuLi4KLSAgICAvLyAgICAqIEVORF9GTVQgZW50cnkKLQotICAgIC8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQotICAgIHN0cnVjdCBlbnRyeSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgdHlwZTsKLSAgICAgICAgY29uc3QgdWludDhfdCBsZW5ndGg7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgZGF0YVswXTsKLSAgICB9OwotCi0gICAgLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKLSAgICBzdHJ1Y3QgZW5kaW5nIHsKLSAgICAgICAgdWludDhfdCBsZW5ndGg7Ci0gICAgICAgIHVpbnQ4X3QgbmV4dFswXTsKLSAgICB9OwotCi0gICAgLy8gZW50cnkgaXRlcmF0b3IKLSAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IoKTsKLSAgICAgICAgZXhwbGljaXQgRW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSk7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IoY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpOwotCi0gICAgICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKLSAgICAgICAgY29uc3QgZW50cnkmICAgIG9wZXJhdG9yKigpIGNvbnN0OwotICAgICAgICBjb25zdCBlbnRyeSogICAgb3BlcmF0b3ItPigpIGNvbnN0OwotICAgICAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKLSAgICAgICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3IrKygpOyAvLyArK2kKLSAgICAgICAgLy8gYmFjayB0byBwcmV2aW91cyBlbnRyeQotICAgICAgICBFbnRyeUl0ZXJhdG9yJiAgICAgICBvcGVyYXRvci0tKCk7IC8vIC0taQotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBuZXh0KCkgY29uc3Q7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgICAgIHByZXYoKSBjb25zdDsKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OwotICAgICAgICBpbnQgICAgICAgICAgICAgb3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKLQotICAgICAgICBib29sICAgICAgICAgICAgaGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgICAgICAgICAgICBjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0OwotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIGlubGluZSBjb25zdCBUJiBwYXlsb2FkKCkgewotICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ocHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICpwdHI7Ci0gICAgfTsKLQotICAgIGNsYXNzIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLQotICAgICAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlcgotICAgICAgICBleHBsaWNpdCBBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKLSAgICAgICAgdmlydHVhbCB+QWJzdHJhY3RFbnRyeSgpIHt9Ci0KLSAgICAgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwb2ludGVyCi0gICAgICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpOwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgIHRpbWVzdGFtcCgpIGNvbnN0ID0gMDsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgIGhhc2goKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKLSAgICAgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKLSAgICAgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICAgICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50MzJfdAotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICBhdXRob3IoKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIGl0ZXJhdG9yIHRvIGVuZCBvZiBlbnRyeQotICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3QgPSAwOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICAvLyBjb3BpZXMgb3JkaW5hcnkgZW50cnkgZnJvbSBzcmMgdG8gZHN0LCBhbmQgcmV0dXJucyBsZW5ndGggb2YgZW50cnkKLSAgICAgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICptRW50cnk7Ci0gICAgfTsKLQotICAgIGNsYXNzIEZvcm1hdEVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOwotICAgICAgICBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9Ci0gICAgICAgIHZpcnR1YWwgfkZvcm1hdEVudHJ5KCkge30KLQotICAgICAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRW50cnkncyBmb3JtYXQgc3RyaW5nCi0gICAgICAgIGNvbnN0ICAgY2hhciogZm9ybWF0U3RyaW5nKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRW5ydHkncyBmb3JtYXQgc3RyaW5nIGxlbmd0aAotICAgICAgICBzaXplX3QgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKLQotICAgICAgICAvLyBGb3JtYXQgYXJndW1lbnRzIChleGNsdWRpbmcgZm9ybWF0IHN0cmluZywgdGltZXN0YW1wIGFuZCBhdXRob3IpCi0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgYXJncygpIGNvbnN0OwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQotICAgICAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQotICAgICAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBzaXplIG9mIG9yaWdpbmFsIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKLQotICAgIH07Ci0KLSAgICBjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IEhpc3RvZ3JhbUVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikgewotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgfkhpc3RvZ3JhbUVudHJ5KCkge30KLQotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHByaXZhdGUgbWVtb3J5Ci0gICAgc3RydWN0IEVudHJ5IHsKLSAgICAgICAgRW50cnkoRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCi0gICAgICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkgeyB9Ci0gICAgICAgIC8qdmlydHVhbCovIH5FbnRyeSgpIHsgfQotCi0gICAgICAgIC8vIHVzZWQgZHVyaW5nIHdyaXRpbmcgdG8gZm9ybWF0IEVudHJ5IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6Ci0gICAgICAgIC8vIFt0eXBlXVtsZW5ndGhdW2RhdGEgLi4uIF1bbGVuZ3RoXQotICAgICAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBXcml0ZXI7Ci0gICAgICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKLSAgICAgICAgdWludDhfdCAgICAgbUxlbmd0aDsgICAgLy8gbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSwgMCA8PSBtTGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAgICAgY29uc3Qgdm9pZCAqbURhdGE7ICAgICAgLy8gZXZlbnQgdHlwZS1zcGVjaWZpYyBkYXRhCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgbURhdGFbLi4uXSwgZHVwbGljYXRlIG1MZW5ndGgKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7Ci0gICAgICAgIC8vIGVuZGluZCBsZW5ndGggb2YgcHJldmlvdXMgZW50cnkKLSAgICAgICAgc3RhdGljIGNvbnN0IHNzaXplX3Qga1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID0gLSBzaXplb2YoZW5kaW5nKSArCi0gICAgICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBIaXN0VHNFbnRyeSB7Ci0gICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgaW50NjRfdCB0czsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKLSAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICBpbnQgYXV0aG9yOwotICAgIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotICAgIHN0cnVjdCBIaXN0SW50RW50cnkgewotICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgIGludCB2YWx1ZTsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICAvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gc2hhcmVkIG1lbW9yeQotICAgIC8vICBieXRlWzBdICAgICAgICAgICAgIG1FdmVudAotICAgIC8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKLSAgICAvLyAgYnl0ZVsyXSAgICAgICAgICAgICBtRGF0YVswXQotICAgIC8vICAuLi4KLSAgICAvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQotICAgIC8vICAuLi4KLSAgICAvLyAgYnl0ZVsyK21MZW5ndGgtMV0gICBtRGF0YVttTGVuZ3RoLTFdCi0gICAgLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCi0gICAgLy8gIGJ5dGVbMyttTGVuZ3RoXSAgICAgc3RhcnQgb2YgbmV4dCBsb2cgZW50cnkKLQotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOwotICAgIHN0YXRpYyBzaXplX3QgIGZtdEVudHJ5TGVuZ3RoKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOwotICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7Ci1wdWJsaWM6Ci0KLSAgICAvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgotICAgIC8vIEV4YWN0bHkgb25lIHByb2Nlc3MgbXVzdCBleHBsaWNpdGx5IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9yIHVzZSBwbGFjZW1lbnQgbmV3LgotICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBQT0QsIHRoZSBkZXN0cnVjdG9yIGlzIGVtcHR5IGFuZCB1bm5lY2Vzc2FyeSB0byBjYWxsIGl0IGV4cGxpY2l0bHkuCi0gICAgc3RydWN0IFNoYXJlZCB7Ci0gICAgICAgIFNoYXJlZCgpIC8qIG1SZWFyIGluaXRpYWxpemVkIHZpYSBkZWZhdWx0IGNvbnN0cnVjdG9yICovIHsgfQotICAgICAgICAvKnZpcnR1YWwqLyB+U2hhcmVkKCkgeyB9Ci0KLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19pbmRleCAgbVJlYXI7ICAvLyBpbmRleCBvbmUgYnl0ZSBwYXN0IHRoZSBlbmQgb2YgbW9zdCByZWNlbnQgRW50cnkKLSAgICAgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKLSAgICB9OwotCi1wdWJsaWM6Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCi0gICAgLy8gRm9yIG5vdyBpdCBpcyBqdXN0IGEgbmFtZXNwYWNlIGZvciBzaGFyZWRTaXplKCkuCi0gICAgY2xhc3MgVGltZWxpbmUgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotI2lmIDAKLSAgICAgICAgVGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIH5UaW1lbGluZSgpOwotI2VuZGlmCi0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBSZXR1cm5zIHRoZSBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yLCBwbHVzIHRoZSBjb25zdGFudCBzaXplIG92ZXJoZWFkIGZvciBpbmRpY2VzLgotICAgICAgICBzdGF0aWMgc2l6ZV90IHNoYXJlZFNpemUoc2l6ZV90IHNpemUpOwotCi0jaWYgMAotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAgICBXcml0ZXI7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAgICBSZWFkZXI7Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgotICAgICAgICBib29sICAgICAgICAgICAgbU93bjsgICAgICAgLy8gd2hldGhlciBJIG93biB0aGUgbWVtb3J5IGF0IG1TaGFyZWQKLSAgICAgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotI2VuZGlmCi0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKLSAgICAvLyBjYWxsaW5nIFdyaXRlciBtZXRob2RzLiAgSWYgeW91IG5lZWQgbXVsdGktdGhyZWFkIHNhZmV0eSBmb3Igd3JpdGluZywgdXNlIExvY2tlZFdyaXRlci4KLSAgICBjbGFzcyBXcml0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBXcml0ZXIoKTsgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgbm9wIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc2hhcmVkIG1lbW9yeQotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KLSAgICAgICAgV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotICAgICAgICBXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIH5Xcml0ZXIoKTsKLQotICAgICAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1BJRCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7ICAgLy8gYnV0IHdvbid0IGVuYWJsZSBpZiBubyBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIGJvb2wgICAgZW5hYmxlKCkgICAgeyByZXR1cm4gc2V0RW5hYmxlZCh0cnVlKTsgfQotICAgICAgICBib29sICAgIGRpc2FibGUoKSAgIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9Ci0KLSAgICAgICAgc3A8SU1lbW9yeT4gICAgIGdldElNZW1vcnkoKSBjb25zdCAgeyByZXR1cm4gbUlNZW1vcnk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAgICAgLy8gd3JpdGVzIGEgc2luZ2xlIEVudHJ5IHRvIHRoZSBGSUZPCi0gICAgICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKLSAgICAgICAgLy8gY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGV2ZW50IGJlZm9yZSBjYWxsaW5nIGxvZyBhYm92ZSB0aGlzIG9uZQotICAgICAgICB2b2lkICAgIGxvZyhjb25zdCBFbnRyeSAqZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKTsKLQotICAgICAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotICAgICAgICBzcDxJTWVtb3J5PiAgICAgbUlNZW1vcnk7ICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNvbnN0Ci0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLCBub24tTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcjsgICAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgZHVtbXkgY29uc3RydWN0b3IgdXNlZAotICAgICAgICBib29sICAgICAgICAgICAgbUVuYWJsZWQ7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKLQotICAgICAgICAvLyBjYWNoZWQgcGlkIGFuZCBwcm9jZXNzIG5hbWUgdG8gdXNlIGluICVwIGZvcm1hdCBzcGVjaWZpZXIKLSAgICAgICAgLy8gdG90YWwgdGFnIGxlbmd0aCBpcyBtUGlkVGFnU2l6ZSBhbmQgcHJvY2VzcyBuYW1lIGlzIG5vdCB6ZXJvIHRlcm1pbmF0ZWQKLSAgICAgICAgY2hhciAgICptUGlkVGFnOwotICAgICAgICBzaXplX3QgIG1QaWRUYWdTaXplOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFNpbWlsYXIgdG8gV3JpdGVyLCBidXQgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIGNvbmN1cnJlbnRseQotICAgIGNsYXNzIExvY2tlZFdyaXRlciA6IHB1YmxpYyBXcml0ZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTG9ja2VkV3JpdGVyKCk7Ci0gICAgICAgIExvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dJbnRlZ2VyKGNvbnN0IGludCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nUElEKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGNsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgotICAgICAgICAvLyBUaGlzIGlzIHJhdyBkYXRhLiBObyBhbmFseXNpcyBoYXMgYmVlbiBkb25lIG9uIGl0Ci0gICAgICAgIGNsYXNzIFNuYXBzaG90IHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgU25hcHNob3QoKSA6IG1EYXRhKE5VTEwpLCBtTG9zdCgwKSB7fQotCi0gICAgICAgICAgICBTbmFwc2hvdChzaXplX3QgYnVmZmVyU2l6ZSkgOiBtRGF0YShuZXcgdWludDhfdFtidWZmZXJTaXplXSkge30KLQotICAgICAgICAgICAgflNuYXBzaG90KCkgeyBkZWxldGVbXSBtRGF0YTsgfQotCi0gICAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBidWZmZXIKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQotCi0gICAgICAgICAgICAvLyBhbW91bnQgb2YgZGF0YSBsb3N0IChnaXZlbiBieSBhdWRpb191dGlsc19maWZvX3JlYWRlcikKLSAgICAgICAgICAgIHNpemVfdCAgIGxvc3QoKSBjb25zdCB7IHJldHVybiBtTG9zdDsgfQotCi0gICAgICAgICAgICAvLyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAotICAgICAgICAgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtQmVnaW47IH0KLQotICAgICAgICAgICAgLy8gaXRlcmF0b3IgdG8gZW5kIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbUVuZDsgfQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICBmcmllbmQgY2xhc3MgTWVyZ2VSZWFkZXI7Ci0gICAgICAgICAgICBmcmllbmQgY2xhc3MgUmVhZGVyOwotICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgKm1EYXRhOwotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1Mb3N0OwotICAgICAgICAgICAgRW50cnlJdGVyYXRvciBtQmVnaW47Ci0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIG1FbmQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgotICAgICAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0gICAgICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgIHZpcnR1YWwgflJlYWRlcigpOwotCi0gICAgICAgIC8vIGdldCBzbmFwc2hvdCBvZiByZWFkZXJzIGZpZm8gYnVmZmVyLCBlZmZlY3RpdmVseSBjb25zdW1pbmcgdGhlIGJ1ZmZlcgotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KCk7Ci0KLSAgICAgICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgLy8gcHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBwZXJmb3JtYW5jZSB0byB0aGUgY29uc29sZQotICAgICAgICB2b2lkICAgIGR1bXBMaW5lKGNvbnN0IFN0cmluZzgmIHRpbWVzdGFtcCwgU3RyaW5nOCYgYm9keSk7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgICBoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICpib2R5KTsKLSAgICAgICAgaW50IG1GZDsgICAgICAgICAgICAgICAgLy8gZmlsZSBkZXNjcmlwdG9yCi0gICAgICAgIGludCBtSW5kZW50OyAgICAgICAgICAgIC8vIGluZGVudGF0aW9uIGxldmVsCi0gICAgICAgIGludCBtTG9zdDsgICAgICAgICAgICAgIC8vIGJ5dGVzIG9mIGRhdGEgbG9zdCBiZWZvcmUgYnVmZmVyIHdhcyByZWFkCi0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gZW5kaW5nVHlwZXM7Ci0KLSAgICAgICAgLy8gZGVjbGFyZWQgYXMgY29uc3QgYmVjYXVzZSBhdWRpb191dGlsc19maWZvKCkgY29uc3RydWN0b3IKLSAgICAgICAgc3A8SU1lbW9yeT4gbUlNZW1vcnk7ICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGFzc2lnbmVkIG9ubHkgaW4gY29uc3RydWN0b3IKLQotICAgICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90Ci0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAotICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKLSAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0KLSAgICAgICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBsYXN0IGVudHJ5IG9mIHR5cGUgPHR5cGU+IGluIHRoZSByYW5nZSBbZnJvbnQsIGJhY2spCi0gICAgICAgIC8vIGJhY2sgaGFzIHRvIGJlIGVudHJ5LWFsaWduZWQuIFJldHVybnMgbnVsbHB0ciBpZiBub25lIGVuY29udW50ZXJlZC4KLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcyk7Ci0KLSAgICAgICAgLy8gZHVtbXkgbWV0aG9kIGZvciBoYW5kbGluZyBhYnNlbnQgYXV0aG9yIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSYgLypmbXRFbnRyeSovLCBTdHJpbmc4KiAvKmJvZHkqLykge30KLSAgICB9OwotCi0gICAgLy8gV3JhcHBlciBmb3IgYSByZWFkZXIgd2l0aCBhIG5hbWUuIENvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgcmVhZGVyIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5hbWUKLSAgICBjbGFzcyBOYW1lZFJlYWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBOYW1lZFJlYWRlcigpIHsgbU5hbWVbMF0gPSAnXDAnOyB9IC8vIGZvciBWZWN0b3IKLSAgICAgICAgTmFtZWRSZWFkZXIoY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4mIHJlYWRlciwgY29uc3QgY2hhciAqbmFtZSkgOgotICAgICAgICAgICAgbVJlYWRlcihyZWFkZXIpCi0gICAgICAgICAgICB7IHN0cmxjcHkobU5hbWUsIG5hbWUsIHNpemVvZihtTmFtZSkpOyB9Ci0gICAgICAgIH5OYW1lZFJlYWRlcigpIHsgfQotICAgICAgICBjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiYgIHJlYWRlcigpIGNvbnN0IHsgcmV0dXJuIG1SZWFkZXI7IH0KLSAgICAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICBuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPE5CTG9nOjpSZWFkZXI+ICAgbVJlYWRlcjsKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TmFtZSA9IDMyOwotICAgICAgICBjaGFyICAgICAgICAgICAgICAgIG1OYW1lW2tNYXhOYW1lXTsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gZWFjaCB0aHJlYWQncyBpbmRpdmlkdWFsIEZJRk8gaW4gc2hhcmVkIG1lbW9yeQotICAgIC8vIGFuZCB3cml0ZSBpdCB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeS4KLSAgICBjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB+TWVyZ2VyKCkge30KLQotICAgICAgICB2b2lkIGFkZFJlYWRlcihjb25zdCBOYW1lZFJlYWRlciAmcmVhZGVyKTsKLSAgICAgICAgLy8gVE9ETyBhZGQgcmVtb3ZlUmVhZGVyCi0gICAgICAgIHZvaWQgbWVyZ2UoKTsKLQotICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jawotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIGdldE5hbWVkUmVhZGVycygpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gdmVjdG9yIG9mIHRoZSByZWFkZXJzIHRoZSBtZXJnZXIgaXMgc3VwcG9zZWQgdG8gbWVyZ2UgZnJvbS4KLSAgICAgICAgLy8gZXZlcnkgcmVhZGVyIHJlYWRzIGZyb20gYSB3cml0ZXIncyBidWZmZXIKLSAgICAgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jawotICAgICAgICBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4gbU5hbWVkUmVhZGVyczsKLQotICAgICAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOyAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiBtRmlmb1dyaXRlcjsgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPCi0gICAgfTsKLQotICAgIC8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKLSAgICAvLyBkYXRhIGNvbGxlY3RlZCBieSBOQkxvZzo6TWVyZ2VyIGZyb20gYWxsIE5hbWVkUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCi0gICAgLy8gdGhpcyBkYXRhIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMuCi0gICAgY2xhc3MgTWVyZ2VSZWFkZXIgOiBwdWJsaWMgUmVhZGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKTsKLQotICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50ID0gMCk7Ci0gICAgICAgIC8vIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKLSAgICAgICAgdm9pZCBnZXRBbmRQcm9jZXNzU25hcHNob3QoU25hcHNob3QgJiBzbmFwKTsKLSAgICAgICAgLy8gY2FsbCBnZXRTbmFwc2hvdCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIGFuZCBwcm9jZXNzIHRoZSBkYXRhCi0gICAgICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAotICAgICAgICAvLyAgICAgICBiZWNhdXNlIGV2ZW4gdGhvdWdoIG91ciB1c2Ugb2YgaXQgaXMgcmVhZC1vbmx5IHRoZXJlIG1heSBiZSBhc3luY2hyb25vdXMgdXBkYXRlcwotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIG1OYW1lZFJlYWRlcnM7Ci0KLSAgICAgICAgLy8gYW5hbHl6ZXMsIGNvbXByZXNzZXMgYW5kIHN0b3JlcyB0aGUgbWVyZ2VkIGRhdGEKLSAgICAgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCi0gICAgICAgIC8vIGxvY2F0aW9uIHdpdGhpbiBlYWNoIGF1dGhvcgotICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VBbmFseXNpc01hcCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpczsKLQotICAgICAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQotICAgICAgICAvLyByZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gZm10RW50cnkKLSAgICAgICAgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSAmZm10RW50cnksIFN0cmluZzggKmJvZHkpOwotICAgIH07Ci0KLSAgICAvLyBNZXJnZVRocmVhZCBpcyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zIGEgTWVyZ2VyLiBJdCB3b3JrcyBhcyBhIHJldHJpZ2dlcmFibGUgb25lLXNob3Q6Ci0gICAgLy8gd2hlbiB0cmlnZ2VyZWQsIGl0IGF3YWtlcyBmb3IgYSBsYXBzZSBvZiB0aW1lLCBkdXJpbmcgd2hpY2ggaXQgcGVyaW9kaWNhbGx5IG1lcmdlczsgaWYKLSAgICAvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCi0gICAgLy8gVGhlIHRocmVhZCBpcyB0cmlnZ2VyZWQgb24gQXVkaW9GbGluZ2VyIGJpbmRlciBhY3Rpdml0eS4KLSAgICBjbGFzcyBNZXJnZVRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcik7Ci0gICAgICAgIHZpcnR1YWwgfk1lcmdlVGhyZWFkKCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gUmVzZXQgdGltZW91dCBhbmQgYWN0aXZhdGUgdGhyZWFkIHRvIG1lcmdlIHBlcmlvZGljYWxseSBpZiBpdCdzIGlkbGUKLSAgICAgICAgdm9pZCB3YWtldXAoKTsKLQotICAgICAgICAvLyBTZXQgdGltZW91dCBwZXJpb2QgdW50aWwgdGhlIG1lcmdpbmcgdGhyZWFkIGdvZXMgaWRsZSBhZ2FpbgotICAgICAgICB2b2lkIHNldFRpbWVvdXRVcyhpbnQgdGltZSk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOwotCi0gICAgICAgIC8vIHRoZSBtZXJnZXIgd2hvIGFjdHVhbGx5IGRvZXMgdGhlIHdvcmsgb2YgbWVyZ2luZyB0aGUgbG9ncwotICAgICAgICBNZXJnZXImICAgICBtTWVyZ2VyOwotCi0gICAgICAgIC8vIHRoZSBtZXJnZXJlYWRlciB1c2VkIHRvIHByb2Nlc3MgZGF0YSBtZXJnZWQgYnkgbU1lcmdlcgotICAgICAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOwotCi0gICAgICAgIC8vIG11dGV4IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCi0gICAgICAgIE11dGV4ICAgICAgIG1NdXRleDsKLQotICAgICAgICAvLyBjb25kaXRpb24gdmFyaWFibGUgdG8gYWN0aXZhdGUgbWVyZ2luZyBvbiB0aW1lb3V0ID49IDAKLSAgICAgICAgQ29uZGl0aW9uICAgbUNvbmQ7Ci0KLSAgICAgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCi0gICAgICAgIGludCAgICAgICAgIG1UaW1lb3V0VXM7Ci0KLSAgICAgICAgLy8gbWVyZ2luZyBwZXJpb2Qgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWtlCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRTbGVlcFBlcmlvZFVzID0gMTAwMDAwMCAvKjFzKi87Ci0KLSAgICAgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRXYWtldXBQZXJpb2RVcyA9IDMwMDAwMDAgLyozcyovOwotICAgIH07Ci0KLX07ICAvLyBjbGFzcyBOQkxvZwotCi0vLyBUT0RPIHB1dCBzb21ld2hlcmUgZWxzZQotc3RhdGljIGlubGluZSBpbnQ2NF90IGdldF9tb25vdG9uaWNfbnMoKSB7Ci0gICAgdGltZXNwZWMgdHM7Ci0gICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpID09IDApIHsKLSAgICAgICAgcmV0dXJuICh1aW50NjRfdCkgdHMudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwICsgdHMudHZfbnNlYzsKLSAgICB9Ci0gICAgcmV0dXJuIDA7IC8vIHNob3VsZCBub3QgaGFwcGVuLgotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvV3JpdGVyLmg+CiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCmluZGV4IGRkZmU5ZDYuLmQ3YzE2YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCkBAIC0xOSwxNCArMTksMTc2IEBACiAKICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBTdHJpbmc4OworCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCisvLyBUT0RPIG1ha2UgdGhpcyBhIHRlbXBsYXRlZCBjbGFzcyBhbmQgcHV0IGl0IGluIGEgc2VwYXJhdGUgZmlsZS4KKy8vIFRoZSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyB3b3VsZCBiZSBiaW4gc2l6ZSBhbmQgbG93IGxpbWl0LgorLyoKKyAqIEhpc3RvZ3JhbSBwcm92aWRlcyBhIHdheSB0byBzdG9yZSBudW1lcmljIGRhdGEgaW4gaGlzdG9ncmFtIGZvcm1hdCBhbmQgcmVhZCBpdCBhcyBhIHNlcmlhbGl6ZWQKKyAqIHN0cmluZy4gVGhlIHRlcm1zICJiaW4iIGFuZCAiYnVja2V0IiBhcmUgdXNlZCBpbnRlcmNoYW5nZWFibHkuCisgKgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUuCisgKi8KK2NsYXNzIEhpc3RvZ3JhbSB7CitwdWJsaWM6CisgICAgc3RydWN0IENvbmZpZyB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBiaW5TaXplOyAgIC8vIFRPRE8gdGVtcGxhdGUgdHlwZQorICAgICAgICBjb25zdCBzaXplX3QgbnVtQmluczsKKyAgICAgICAgY29uc3QgZG91YmxlIGxvdzsgICAgICAgLy8gVE9ETyB0ZW1wbGF0ZSB0eXBlCisgICAgfTsKKworICAgIC8vIEhpc3RvZ3JhbXMgYXJlIGNvbnN0cnVjdGVkIHdpdGggZml4ZWQgY29uZmlndXJhdGlvbiBudW1iZXJzLiBEeW5hbWljIGNvbmZpZ3VyYXRpb24gYmFzZWQKKyAgICAvLyB0aGUgZGF0YSBpcyBwb3NzaWJsZSBidXQgY29tcGxleCBiZWNhdXNlCisgICAgLy8gLSBkYXRhIHBvaW50cyBhcmUgYWRkZWQgb25lIGJ5IG9uZSwgbm90IHByb2Nlc3NlZCBhcyBhIGJhdGNoLgorICAgIC8vIC0gSGlzdG9ncmFtcyB3aXRoIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIHRyaWNreSB0byBhZ2dyZWdhdGUsIGFuZCB0aGV5CisgICAgLy8gICB3aWxsIG5lZWQgdG8gYmUgYWdncmVnYXRlZCBhdCB0aGUgTWVkaWEgTWV0cmljcyBjbG91ZCBzaWRlLgorICAgIC8vIC0gbm90IHByb3ZpZGluZyBsaW1pdHMgdGhlb3JldGljYWxseSBhbGxvd3MgZm9yIGluZmluaXRlIG51bWJlciBvZiBidWNrZXRzLgorCisgICAgLyoqCisgICAgICogXGJyaWVmIENyZWF0ZXMgYSBIaXN0b2dyYW0gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIGJpblNpemUgdGhlIHdpZHRoIG9mIGVhY2ggYmluIG9mIHRoZSBoaXN0b2dyYW0sIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICogICAgICAgICAgICAgICAgVW5pdHMgYXJlIHdoYXRldmVyIGRhdGEgdGhlIGNhbGxlciBkZWNpZGVzIHRvIHN0b3JlLgorICAgICAqIFxwYXJhbSBudW1CaW5zIHRoZSBudW1iZXIgb2YgYmlucyBkZXNpcmVkIGluIHRoZSBoaXN0b2dyYW0gcmFuZ2UsIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICogXHBhcmFtIGxvdyAgICAgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBoaXN0b2dyYW0gYnVja2V0IHZhbHVlcy4KKyAgICAgKiAgICAgICAgICAgICAgICBVbml0cyBhcmUgd2hhdGV2ZXIgZGF0YSB0aGUgY2FsbGVyIGRlY2lkZXMgdG8gc3RvcmUuCisgICAgICogICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSB1cHBlciBib3VuZCBjYW4gYmUgY2FsY3VsYXRlZCBieSB0aGUgZm9sbG93aW5nOgorICAgICAqICAgICAgICAgICAgICAgICAgdXBwZXIgPSBsb3dlciArIGJpblNpemUgKiBudW1CaW5zLgorICAgICAqLworICAgIEhpc3RvZ3JhbShkb3VibGUgYmluU2l6ZSwgc2l6ZV90IG51bUJpbnMsIGRvdWJsZSBsb3cgPSAwLikKKyAgICAgICAgOiBtQmluU2l6ZShiaW5TaXplKSwgbU51bUJpbnMobnVtQmlucyksIG1Mb3cobG93KSwgbUJpbnMobU51bUJpbnMgKyAyKSB7fQorCisgICAgSGlzdG9ncmFtKGNvbnN0IENvbmZpZyAmYykKKyAgICAgICAgOiBIaXN0b2dyYW0oYy5iaW5TaXplLCBjLm51bUJpbnMsIGMubG93KSB7fQorCisgICAgLyoqCisgICAgICogXGJyaWVmIEFkZCBhIGRhdGEgcG9pbnQgdG8gdGhlIGhpc3RvZ3JhbS4gVGhlIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50CisgICAgICogICAgICAgIGlzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgdGhlIGJpbiBzaXplIChiZWZvcmUgYWNjb3VudGluZworICAgICAqICAgICAgICBmb3IgdGhlIGxvd2VyIGJvdW5kIG9mZnNldCwgd2hpY2ggbWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBiaW4gc2l6ZSkuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50IHRvIGFkZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChkb3VibGUgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXGJyaWVmIFJlbW92ZXMgYWxsIGRhdGEgcG9pbnRzIGZyb20gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGFkZGVkIHRvIHRoZSBoaXN0b2dyYW0uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgaW4gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCB0b3RhbENvdW50KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgU2VyaWFsaXplcyB0aGUgaGlzdG9ncmFtIGludG8gYSBzdHJpbmcuIFRoZSBmb3JtYXQgaXMgY2hvc2VuIHRvIGJlIGNvbXBhdGlibGUgd2l0aAorICAgICAqICAgICAgICB0aGUgaGlzdG9ncmFtIHJlcHJlc2VudGF0aW9uIHRvIHNlbmQgdG8gdGhlIE1lZGlhIE1ldHJpY3Mgc2VydmljZS4KKyAgICAgKgorICAgICAqICAgICAgICBUaGUgc3RyaW5nIGlzIGFzIGZvbGxvd3M6CisgICAgICogICAgICAgICAgYmluU2l6ZSxudW1CaW5zLGxvdyx7LTF8bG93Q291bnQsLi4uLGJpbkluZGV4fGNvdW50LC4uLixudW1CaW5zfGhpZ2hDb3VudH0KKyAgICAgKgorICAgICAqICAgICAgICAtIGJpbkluZGV4IGlzIGFuIGludGVnZXIgd2l0aCAwIDw9IGJpbkluZGV4IDwgbnVtQmlucy4KKyAgICAgKiAgICAgICAgLSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSAocm91bmRlZCkgdmFsdWUKKyAgICAgKiAgICAgICAgICBsb3cgKyBiaW5TaXplICogYnVja2V0SW5kZXguCisgICAgICogICAgICAgIC0gbG93Q291bnQgaXMgdGhlIG51bWJlciBvZiAocm91bmRlZCkgdmFsdWVzIGxlc3MgdGhhbiBsb3cuCisgICAgICogICAgICAgIC0gaGlnaENvdW50IGlzIHRoZSBudW1iZXIgb2YgKHJvdW5kZWQpIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiAgICAgICAgICBsb3cgKyBiaW5TaXplICogbnVtQmlucy4KKyAgICAgKiAgICAgICAgLSBhIGJpbkluZGV4IG1heSBiZSBza2lwcGVkIGlmIGl0cyBjb3VudCBpcyAwLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgaGlzdG9ncmFtIHNlcmlhbGl6ZWQgYXMgYSBzdHJpbmcuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8vIERyYXcgbG9nIHNjYWxlIHNpZGV3YXlzIGhpc3RvZ3JhbSBhcyBBU0NJSSBhcnQgYW5kIHN0b3JlIGFzIGEgc3RkOjpzdHJpbmcuCisgICAgLy8gRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRvdGFsQ291bnQoKSA9PSAwLgorICAgIHN0ZDo6c3RyaW5nIGFzY2lpQXJ0U3RyaW5nKHNpemVfdCBpbmRlbnQgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyBIaXN0b2dyYW0gdmVyc2lvbiBudW1iZXIuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1ZlcnNpb24gPSAxOworCisgICAgY29uc3QgZG91YmxlIG1CaW5TaXplOyAgICAgICAgICAvLyBTaXplIG9mIGVhY2ggYnVja2V0CisgICAgY29uc3Qgc2l6ZV90IG1OdW1CaW5zOyAgICAgICAgICAvLyBOdW1iZXIgb2YgYnVja2V0cyBpbiByYW5nZSAoZXhjbHVkZXMgbG93IGFuZCBoaWdoKQorICAgIGNvbnN0IGRvdWJsZSBtTG93OyAgICAgICAgICAgICAgLy8gTG93ZXIgYm91bmQgb2YgdmFsdWVzCisKKyAgICAvLyBEYXRhIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgYWN0dWFsIGhpc3RvZ3JhbS4gQ291bnRzIG9mIGJpbiB2YWx1ZXMgbGVzcyB0aGFuIG1Mb3cKKyAgICAvLyBhcmUgc3RvcmVkIGluIG1CaW5zWzBdLiBCaW4gaW5kZXggaSBjb3JyZXNwb25kcyB0byBtQmluc1tpKzFdLiBDb3VudHMgb2YgYmluIHZhbHVlcworICAgIC8vID49IGhpZ2ggYXJlIHN0b3JlZCBpbiBtQmluc1ttTnVtQmlucyArIDFdLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBtQmluczsKKworICAgIHVpbnQ2NF90IG1Ub3RhbENvdW50ID0gMDsgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHZhbHVlcyByZWNvcmRlZAorfTsKKworLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBidXQgUGVyZm9ybWFuY2VBbmFseXNpcworLy8gYWxzbyBkb2VzIHNvbWUgYWRkaXRpb25hbCBhbmFseXppbmcgb2YgZGF0YSwgd2hpbGUgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHJ1Y3QgaXMKKy8vIHRvIGhvbGQgZGF0YS4KK3N0cnVjdCBQZXJmb3JtYW5jZURhdGEgeworICAgIC8vIFRPRE8gdGhlIEhpc3RvZ3JhbTo6Q29uZmlnIG51bWJlcnMgYmVsb3cgYXJlIGZvciBGYXN0TWl4ZXIuCisgICAgLy8gU3BlY2lmeSBkaWZmZXJlbnQgbnVtYmVycyBmb3Igb3RoZXIgdGhyZWFkIHR5cGVzLgorCisgICAgLy8gVmFsdWVzIGJhc2VkIG9uIG1VbmRlcnJ1bk5zIGFuZCBtT3ZlcnJ1bk5zIGluIEZhc3RNaXhlci5jcHAgZm9yIGZyYW1lQ291bnQgPSAxOTIKKyAgICAvLyBhbmQgbVNhbXBsZVJhdGUgPSA0ODAwMCwgd2hpY2ggY29ycmVzcG9uZCB0byAyIGFuZCA3IHNlY29uZHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrV29ya0NvbmZpZyA9IHsgMC4yNSwgMjAsIDIufTsKKworICAgIC8vIFZhbHVlcyBiYXNlZCBvbiB0cmlhbCBhbmQgZXJyb3IgbG9nZ2luZy4gTmVlZCBhIGJldHRlciB3YXkgdG8gZGV0ZXJtaW5lCisgICAgLy8gYmluIHNpemUgYW5kIGxvd2VyL3VwcGVyIGxpbWl0cy4KKyAgICBzdGF0aWMgY29uc3RleHByIEhpc3RvZ3JhbTo6Q29uZmlnIGtMYXRlbmN5Q29uZmlnID0geyAyLiwgMTAsIDEwLn07CisKKyAgICAvLyBWYWx1ZXMgYmFzZWQgb24gdHJpYWwgYW5kIGVycm9yIGxvZ2dpbmcuIE5lZWQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZQorICAgIC8vIGJpbiBzaXplIGFuZCBsb3dlci91cHBlciBsaW1pdHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrV2FybXVwQ29uZmlnID0geyA1LiwgMTAsIDEwLn07CisKKyAgICBOQkxvZzo6dGhyZWFkX2luZm9fdCB0aHJlYWRJbmZve307CisgICAgTkJMb2c6OnRocmVhZF9wYXJhbXNfdCB0aHJlYWRQYXJhbXN7fTsKKworICAgIC8vIFBlcmZvcm1hbmNlIERhdGEKKyAgICBIaXN0b2dyYW0gd29ya0hpc3R7a1dvcmtDb25maWd9OworICAgIEhpc3RvZ3JhbSBsYXRlbmN5SGlzdHtrTGF0ZW5jeUNvbmZpZ307CisgICAgSGlzdG9ncmFtIHdhcm11cEhpc3R7a1dhcm11cENvbmZpZ307CisgICAgaW50NjRfdCB1bmRlcnJ1bnMgPSAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhTbmFwc2hvdHNUb1N0b3JlID0gMjU2OworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPE5CTG9nOjpFdmVudCwgaW50NjRfdCAvKnRpbWVzdGFtcCovPj4gc25hcHNob3RzOworICAgIGludDY0X3Qgb3ZlcnJ1bnMgPSAwOworICAgIG5zZWNzX3QgYWN0aXZlID0gMDsKKyAgICBuc2Vjc190IHN0YXJ0e3N5c3RlbVRpbWUoKX07CisKKyAgICAvLyBSZXNldCB0aGUgcGVyZm9ybWFuY2UgZGF0YS4gVGhpcyBkb2VzIG5vdCByZXByZXNlbnQgYSB0aHJlYWQgc3RhdGUgY2hhbmdlLgorICAgIC8vIFRocmVhZCBpbmZvIGlzIG5vdCByZXNldCBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMgbWVhbnQgdG8gYmUgYSBjb250aW51YXRpb24gb2YgdGhlIHRocmVhZAorICAgIC8vIHRoYXQgc3RydWN0IFBlcmZvcm1hbmNlRGF0YSBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgd29ya0hpc3QuY2xlYXIoKTsKKyAgICAgICAgbGF0ZW5jeUhpc3QuY2xlYXIoKTsKKyAgICAgICAgd2FybXVwSGlzdC5jbGVhcigpOworICAgICAgICB1bmRlcnJ1bnMgPSAwOworICAgICAgICBvdmVycnVucyA9IDA7CisgICAgICAgIGFjdGl2ZSA9IDA7CisgICAgICAgIHN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmIHBlcmZvcm1hbmNlIGRhdGEgaGFzIG5vdCBiZWVuIHJlY29yZGVkIHlldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB3b3JrSGlzdC50b3RhbENvdW50KCkgPT0gMCAmJiBsYXRlbmN5SGlzdC50b3RhbENvdW50KCkgPT0gMAorICAgICAgICAgICAgICAgICYmIHdhcm11cEhpc3QudG90YWxDb3VudCgpID09IDAgJiYgdW5kZXJydW5zID09IDAgJiYgb3ZlcnJ1bnMgPT0gMAorICAgICAgICAgICAgICAgICYmIGFjdGl2ZSA9PSAwOworICAgIH0KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXM7CiAKIC8vIGEgbWFwIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMgaW5zdGFuY2VzCkBAIC04MCw3ICsyNDIsNyBAQAogICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7CiAKICAgICAvLyBzdG9yZXMgYnVmZmVyIHBlcmlvZCBoaXN0b2dyYW1zIHdpdGggdGltZXN0YW1wIG9mIGZpcnN0IHNhbXBsZQotICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gbUhpc3RzOworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+IG1IaXN0czsKIAogICAgIC8vIFBhcmFtZXRlcnMgdXNlZCB3aGVuIGRldGVjdGluZyBvdXRsaWVycwogICAgIHN0cnVjdCBCdWZmZXJQZXJpb2QgewpAQCAtMTE5LDggKzI4MSw3IEBACiB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LCBQZXJmb3JtYW5jZUFuYWx5c2lzTWFwICZ0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKIHZvaWQgZHVtcExpbmUoaW50IGZkLCBpbnQgaW5kZW50LCBjb25zdCBTdHJpbmc4ICZib2R5KTsKIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9QRVJGT1JNQU5DRUFOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVhZGVyLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTVlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX1JFQURFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfUkVBREVSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitjbGFzcyBhdWRpb191dGlsc19maWZvOworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lbW9yeTsKK2NsYXNzIFN0cmluZzg7CisKK25hbWVzcGFjZSBOQkxvZyB7CisKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIE5CTG9nIFJlYWRlciBBUEkKKworY2xhc3MgU25hcHNob3Q7ICAgICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG5lZWRlZCBmb3IgUmVhZGVyOjpnZXRTbmFwc2hvdCgpCisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKyAgICB+UmVhZGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KGJvb2wgZmx1c2ggPSB0cnVlKTsKKyAgICBib29sICAgICBpc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworcHJpdmF0ZToKKyAgICAvLyBBbW91bnQgb2YgdHJpZXMgZm9yIHJlYWRlciB0byBjYXRjaCB1cCB3aXRoIHdyaXRlciBpbiBnZXRTbmFwc2hvdCgpLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhPYnRhaW5UcmllcyA9IDM7CisKKyAgICAvLyBpbnZhbGlkQmVnaW5UeXBlcyBhbmQgaW52YWxpZEVuZFR5cGVzIGFyZSB1c2VkIHRvIGFsaWduIHRoZSBTbmFwc2hvdDo6YmVnaW4oKSBhbmQKKyAgICAvLyBTbmFwc2hvdDo6ZW5kKCkgRW50cnlJdGVyYXRvcnMgdG8gdmFsaWQgZW50cmllcy4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBpbnZhbGlkQmVnaW5UeXBlczsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBpbnZhbGlkRW5kVHlwZXM7CisKKyAgICAvLyBkZWNsYXJlZCBhcyBjb25zdCBiZWNhdXNlIGF1ZGlvX3V0aWxzX2ZpZm8oKSBjb25zdHJ1Y3RvcgorICAgIHNwPElNZW1vcnk+IG1JTWVtb3J5OyAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBhc3NpZ25lZCBvbmx5IGluIGNvbnN0cnVjdG9yCisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTmFtZTsgICAgICAgICAgICAvLyBuYW1lIG9mIHJlYWRlciAoYWN0dWFsbHkgbmFtZSBvZiB3cml0ZXIpCisgICAgLypjb25zdCovIFNoYXJlZCogY29uc3QgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwgYWN0dWFsbHkgY29uc3QgYnV0IG5vdAorICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworICAgIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyICogY29uc3QgbUZpZm9SZWFkZXI7ICAgIC8vIHVzZWQgdG8gcmVhZCBmcm9tIEZJRk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCisKKyAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgdmFsaWQgZW50cnkgaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKKyAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0VmFsaWRFbnRyeShjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiAmaW52YWxpZFR5cGVzKTsKK307CisKKy8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorLy8gVGhpcyBpcyByYXcgZGF0YS4gTm8gYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSBvbiBpdAorY2xhc3MgU25hcHNob3QgeworcHVibGljOgorICAgIH5TbmFwc2hvdCgpIHsgZGVsZXRlW10gbURhdGE7IH0KKworICAgIC8vIGFtb3VudCBvZiBkYXRhIGxvc3QgKGdpdmVuIGJ5IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKQorICAgIHNpemVfdCBsb3N0KCkgY29uc3QgeyByZXR1cm4gbUxvc3Q7IH0KKworICAgIC8vIGl0ZXJhdG9yIHRvIGJlZ2lubmluZyBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90CisgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKKyAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbUJlZ2luOyB9CisKKyAgICAvLyBpdGVyYXRvciB0byBlbmQgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAorICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbUVuZDsgfQorCitwcml2YXRlOgorICAgIFNuYXBzaG90KCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IFNuYXBzaG90KHNpemVfdCBidWZmZXJTaXplKSA6IG1EYXRhKG5ldyB1aW50OF90W2J1ZmZlclNpemVdKSB7fQorICAgIGZyaWVuZCBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IFJlYWRlcjo6Z2V0U25hcHNob3QoYm9vbCBmbHVzaCk7CisKKyAgICB1aW50OF90ICogY29uc3QgICAgICAgbURhdGEgPSBudWxscHRyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTG9zdCA9IDA7CisgICAgRW50cnlJdGVyYXRvciAgICAgICAgIG1CZWdpbjsKKyAgICBFbnRyeUl0ZXJhdG9yICAgICAgICAgbUVuZDsKK307CisKKy8vIFRPRE8gbW92ZSB0aGlzIHRvIE1lZGlhTG9nU2VydmljZT8KK2NsYXNzIER1bXBSZWFkZXIgOiBwdWJsaWMgTkJMb2c6OlJlYWRlciB7CitwdWJsaWM6CisgICAgRHVtcFJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSB7fQorICAgIER1bXBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBSZWFkZXIoaU1lbW9yeSwgc2l6ZSwgbmFtZSkge30KKyAgICB2b2lkIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50ID0gMCk7Citwcml2YXRlOgorICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIGZtdEVudHJ5IF9fdW51c2VkLCBTdHJpbmc4KiBib2R5IF9fdW51c2VkKSB7fQorICAgIEVudHJ5SXRlcmF0b3IgaGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqdGltZXN0YW1wLCBTdHJpbmc4ICpib2R5KTsKKworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOworCisgICAgLy8gVGhlIGJ1ZmZlckR1bXAgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4KKyAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19SRUFERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCmluZGV4IGVjMDg0MmYuLjY0YTU3MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKQEAgLTIyLDE5ICsyMiwzMyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUaGUgU3RyaW5nOCBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCi1jbGFzcyBTdHJpbmc4OwotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCitzdHJ1Y3QgUGVyZm9ybWFuY2VEYXRhOworCisvLyBEdW1wcyBwZXJmb3JtYW5jZSBkYXRhIGluIGEgSlNPTiBmb3JtYXQuCit2b2lkIGR1bXBKc29uKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKTsKKworLy9EdW1wcyBwZXJmb3JtYW5jZSBkYXRhIGFzIHZpc3VhbGl6ZWQgcGxvdHMuCit2b2lkIGR1bXBQbG90cyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCk7CisKKy8vIER1bXBzIHNuYXBzaG90cyBhdCBpbXBvcnRhbnQgZXZlbnRzIGluIHRoZSBwYXN0Lgordm9pZCBkdW1wUmV0cm8oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApOworCisvLyBTZW5kIG9uZSB0aHJlYWQncyBkYXRhIHRvIG1lZGlhIG1ldHJpY3MsIGlmIHRoZSBwZXJmb3JtYW5jZSBkYXRhIGlzIG5vbnRyaXZpYWwgKGkuZS4gbm90CisvLyBhbGwgemVybyB2YWx1ZXMpLiBSZXR1cm4gdHJ1ZSBpZiBkYXRhIHdhcyBzZW50LCBmYWxzZSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHdyaXRlCisvLyBvciBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nLgorYm9vbCBzZW5kVG9NZWRpYU1ldHJpY3MoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogY29uc3RleHByIGludCBrTXNQZXJTZWMgPSAxMDAwOwogY29uc3RleHByIGludCBrU2VjUGVyTWluID0gNjA7CiAKIGNvbnN0ZXhwciBpbnQga0ppZmZ5UGVyTXMgPSAxMDsgLy8gdGltZSB1bml0IGZvciBoaXN0b2dyYW0gYXMgYSBtdWx0aXBsZSBvZiBtaWxsaXNlY29uZHMKIAogLy8gc3RvcmVzIGEgaGlzdG9ncmFtOiBrZXk6IG9ic2VydmVkIGJ1ZmZlciBwZXJpb2QgKG11bHRpcGxlIG9mIGppZmZ5KS4gdmFsdWU6IGNvdW50Ci11c2luZyBIaXN0b2dyYW0gPSBzdGQ6Om1hcDxpbnQsIGludD47Cit1c2luZyBIaXN0ID0gc3RkOjptYXA8aW50LCBpbnQ+OwogCiB1c2luZyBtc0ludGVydmFsID0gZG91YmxlOwogdXNpbmcgamlmZnlJbnRlcnZhbCA9IGRvdWJsZTsKQEAgLTU3LDEzICs3MSwxMiBAQAogfQogCiAvLyBXcml0ZXMgb3V0bGllciBpbnRlcnZhbHMsIHRpbWVzdGFtcHMsIHBlYWtzIHRpbWVzdGFtcHMsIGFuZCBoaXN0b2dyYW1zIHRvIGEgZmlsZS4KLXZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+ICZoaXN0cywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoga0RpcmVjdG9yeSwgYm9vbCBhcHBlbmQsIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCk7CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjBjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1RpbWVsaW5lLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvX2luZGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgorLy8gRXhhY3RseSBvbmUgcHJvY2VzcyBtdXN0IGV4cGxpY2l0bHkgY2FsbCB0aGUgY29uc3RydWN0b3Igb3IgdXNlIHBsYWNlbWVudCBuZXcuCisvLyBTaW5jZSB0aGlzIGlzIGEgUE9ELCB0aGUgZGVzdHJ1Y3RvciBpcyBlbXB0eSBhbmQgdW5uZWNlc3NhcnkgdG8gY2FsbCBpdCBleHBsaWNpdGx5Lgorc3RydWN0IFNoYXJlZCB7CisgICAgU2hhcmVkKCkgLyogbVJlYXIgaW5pdGlhbGl6ZWQgdmlhIGRlZmF1bHQgY29uc3RydWN0b3IgKi8ge30KKyAgICB+U2hhcmVkKCkge30KKworICAgIGF1ZGlvX3V0aWxzX2ZpZm9faW5kZXggIG1SZWFyOyAgLy8gaW5kZXggb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIG1vc3QgcmVjZW50IEVudHJ5CisgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKK307CisKKy8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCisvLyBGb3Igbm93IGl0IGlzIGp1c3QgYSBuYW1lc3BhY2UgZm9yIHNoYXJlZFNpemUoKS4KK2NsYXNzIFRpbWVsaW5lIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorI2lmIDAKKyAgICBUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkID0gTlVMTCk7CisgICAgdmlydHVhbCB+VGltZWxpbmUoKTsKKyNlbmRpZgorCisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFJldHVybnMgdGhlIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIsIHBsdXMgdGhlIGNvbnN0YW50IHNpemUgb3ZlcmhlYWQgZm9yIGluZGljZXMuCisgICAgc3RhdGljIHNpemVfdCBzaGFyZWRTaXplKHNpemVfdCBzaXplKTsKKworI2lmIDAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzICAgIFdyaXRlcjsKKyAgICBmcmllbmQgY2xhc3MgICAgUmVhZGVyOworCisgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgorICAgIGJvb2wgICAgICAgICAgICBtT3duOyAgICAgICAvLyB3aGV0aGVyIEkgb3duIHRoZSBtZW1vcnkgYXQgbVNoYXJlZAorICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyNlbmRpZgorfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1dyaXRlci5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNkMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm87CitjbGFzcyBhdWRpb191dGlsc19maWZvX3dyaXRlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJTWVtb3J5OworCituYW1lc3BhY2UgTkJMb2cgeworCitjbGFzcyBFbnRyeTsKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIE5CTG9nIFdyaXRlciBJbnRlcmZhY2UKKworLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKKy8vIGNhbGxpbmcgV3JpdGVyIG1ldGhvZHMuICBJZiB5b3UgbmVlZCBtdWx0aS10aHJlYWQgc2FmZXR5IGZvciB3cml0aW5nLCB1c2UgTG9ja2VkV3JpdGVyLgorY2xhc3MgV3JpdGVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIFdyaXRlcigpID0gZGVmYXVsdDsgICAgICAgICAvLyBkdW1teSBub3AgaW1wbGVtZW50YXRpb24gd2l0aG91dCBzaGFyZWQgbWVtb3J5CisKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICBXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7CisgICAgV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7CisKKyAgICB+V3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKKyAgICB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOworICAgIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworICAgIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7CisgICAgdm9pZCAgICBsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLik7CisgICAgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKKworICAgIC8vIExvZyBkYXRhIHJlbGF0ZWQgdG8gRXZlbnQgRS4gU2VlIHRoZSBldmVudC10by10eXBlIG1hcHBpbmcgZm9yIHRoZSB0eXBlIG9mIGRhdGEKKyAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBldmVudC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBzZWUgYSBtYXBwaW5nIHN0YXRlbWVudDoKKyAgICAvLyAgICAgTUFQX1RZUEVfVE9fRVZFTlQoRSwgVCk7CisgICAgLy8gdGhlbiB0aGUgdXNhZ2Ugb2YgdGhpcyBtZXRob2Qgd291bGQgYmU6CisgICAgLy8gICAgIFQgZGF0YSA9IGRvQ29tcHV0YXRpb24oKTsKKyAgICAvLyAgICAgdGxOQkxvZ1dyaXRlci0+bG9nPE5CTG9nOjpFPihkYXRhKTsKKyAgICB0ZW1wbGF0ZTxFdmVudCBFPgorICAgIHZvaWQgICAgbG9nKHR5cGVuYW1lIGdldF9tYXBwZWQ8RT46OnR5cGUgZGF0YSkgeworICAgICAgICBsb2coRSwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OworCisgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCisgICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsgICAvLyBidXQgd29uJ3QgZW5hYmxlIGlmIG5vIHNoYXJlZCBtZW1vcnkKKyAgICBib29sICAgICAgICAgICAgZW5hYmxlKCkgIHsgcmV0dXJuIHNldEVuYWJsZWQodHJ1ZSk7IH0KKyAgICBib29sICAgICAgICAgICAgZGlzYWJsZSgpIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9CisKKyAgICBzcDxJTWVtb3J5PiAgICAgZ2V0SU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIG1JTWVtb3J5OyB9CisKKyAgICAvLyBQdWJsaWMgbG9nZ2luZyBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFsd2F5cyB1c2Ugb25lIG9mIHRoZQorICAgIC8vIHR3byBsb2coKSBmdW5jdGlvbiBjYWxscyBiZWxvdyB0byB3cml0ZSB0byBzaGFyZWQgbWVtb3J5LgorcHJvdGVjdGVkOgorICAgIC8vIFdyaXRlcyBhIHNpbmdsZSBFbnRyeSB0byB0aGUgRklGTyBpZiB0aGUgd3JpdGVyIGlzIGVuYWJsZWQuCisgICAgLy8gVGhpcyBpcyBwcm90ZWN0ZWQgYW5kIHZpcnR1YWwgYmVjYXVzZSBMb2NrZWRXcml0ZXIgdXNlcyBhIGxvY2sgdG8gcHJvdGVjdAorICAgIC8vIHdyaXRpbmcgdG8gdGhlIEZJRk8gYmVmb3JlIHdyaXRpbmcgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgbG9nKGNvbnN0IEVudHJ5ICZlbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKKyAgICAvLyBMb2cgYSBzaW5nbGUgRW50cnkgd2l0aCBjb3JyZXNwb25kaW5nIGV2ZW50LCBkYXRhLCBhbmQgbGVuZ3RoLgorICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKKworICAgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIGxvZ2dpbmcgcGFydHMgb2YgYSBmb3JtYXR0ZWQgZW50cnkKKyAgICB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7CisgICAgdm9pZCAgICBsb2dUaW1lc3RhbXBGb3JtYXQoKTsKKyAgICB2b2lkICAgIGxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXApOworCisgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWR7fTsgICAgICAgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgIHNwPElNZW1vcnk+ICAgICBtSU1lbW9yeXt9OyAgICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gY29uc3QKKyAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm97fTsgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwgbm9uLU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcnt9OyAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYm9vbCAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKKworICAgIC8vIGNhY2hlZCBwaWQgYW5kIHByb2Nlc3MgbmFtZSB0byB1c2UgaW4gJXAgZm9ybWF0IHNwZWNpZmllcgorICAgIC8vIHRvdGFsIHRhZyBsZW5ndGggaXMgbVBpZFRhZ1NpemUgYW5kIHByb2Nlc3MgbmFtZSBpcyBub3QgemVybyB0ZXJtaW5hdGVkCisgICAgY2hhciAgICptUGlkVGFne307CisgICAgc2l6ZV90ICBtUGlkVGFnU2l6ZSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU2ltaWxhciB0byBXcml0ZXIsIGJ1dCBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgY29uY3VycmVudGx5CitjbGFzcyBMb2NrZWRXcml0ZXIgOiBwdWJsaWMgV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBMb2NrZWRXcml0ZXIoKSA9IGRlZmF1bHQ7CisgICAgTG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICAvLyBMb2NrIG5lZWRzIHRvIGJlIG9idGFpbmVkIGJlZm9yZSB3cml0aW5nIHRvIEZJRk8uCisgICAgdm9pZCBsb2coY29uc3QgRW50cnkgJmVudHJ5LCBib29sIHRydXN0ZWQgPSBmYWxzZSkgb3ZlcnJpZGU7CisKKyAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAppbmRleCAyZWE1ZmNkLi5lMTczOTc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKQEAgLTg1LDcgKzg1LDcgQEAKICAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKTsKICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1DaGFubmVsQ291bnQpKTsKICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKG1DaGFubmVsQ291bnQgPj0gMSAmJiBtQ2hhbm5lbENvdW50IDw9IDIpOworICAgIENIRUNLKG1DaGFubmVsQ291bnQgPj0gMSAmJiBtQ2hhbm5lbENvdW50IDw9IDcpOwogCiAgICAgLy8gT3B0aW9uYWxseSwgd2Ugd2FudCB0byBjaGVjayB3aGV0aGVyIEFBQ1Byb2ZpbGUgaXMgYWxzbyBzZXQuCiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDUHJvZmlsZSwgJm1BQUNQcm9maWxlKSkgewpAQCAtMTU0LDExICsxNTQsMTEgQEAKICAgICBtRG9uZSA9IHRydWU7CiAKICAgICB2b2lkICpkdW1teTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CiAgICAgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYKICAgICAgICAgICAgIChzdGF0dXMgIT0gT0sgJiYgc3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pKSB7CiAgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA4MWE0NjQwLi5mMDBjODk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KQEAgLTE3MSwxMSArMTcyLDcgQEAKIH0KIAogc3RydWN0IENvZGVjT2JzZXJ2ZXIgOiBwdWJsaWMgQm5PTVhPYnNlcnZlciB7Ci0gICAgQ29kZWNPYnNlcnZlcigpIHt9Ci0KLSAgICB2b2lkIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICAgICAgbU5vdGlmeSA9IG1zZzsKLSAgICB9CisgICAgZXhwbGljaXQgQ29kZWNPYnNlcnZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgOiBtTm90aWZ5KG1zZykge30KIAogICAgIC8vIGZyb20gSU9NWE9ic2VydmVyCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZXMoY29uc3Qgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKQEAgLTI1MSw3ICsyNDgsNyBAQAogICAgIHZpcnR1YWwgfkNvZGVjT2JzZXJ2ZXIoKSB7fQogCiBwcml2YXRlOgotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIGNvbnN0IHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29kZWNPYnNlcnZlcik7CiB9OwpAQCAtNTc2LDYgKzU3Myw3IEBACiAgICAgICBtVHVubmVsZWQoZmFsc2UpLAogICAgICAgbURlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXgoKE9NWF9JTkRFWFRZUEUpMCksCiAgICAgICBtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXgoKE9NWF9JTkRFWFRZUEUpMCksCisgICAgICBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgoKE9NWF9JTkRFWFRZUEUpMCksCiAgICAgICBtU3RhdGVHZW5lcmF0aW9uKDApLAogICAgICAgbVZlbmRvckV4dGVuc2lvbnNTdGF0dXMoa0V4dGVuc2lvbnNVbmNoZWNrZWQpIHsKICAgICBtZW1zZXQoJm1MYXN0SERSU3RhdGljSW5mbywgMCwgc2l6ZW9mKG1MYXN0SERSU3RhdGljSW5mbykpOwpAQCAtMTc0OSwyOSArMTc0NywzMiBAQAogICAgIH0KIAogICAgIGludDMyX3Qgc3RvcmVNZXRhOwotICAgIGlmIChlbmNvZGVyCi0gICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQotICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSB7Ci0gICAgICAgIElPTVg6OlBvcnRNb2RlIG1vZGU7Ci0gICAgICAgIGlmIChzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZSkgewotICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNOYXRpdmVIYW5kbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIgfHwKLSAgICAgICAgICAgICAgICBzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKLSAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICBJT01YOjpQb3J0TW9kZSBtb2RlID0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcjsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9pbnB1dC1tZXRhZGF0YS1idWZmZXItdHlwZSIsICZzdG9yZU1ldGEpCisgICAgICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSB7CisgICAgICAgICAgICBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY05hdGl2ZUhhbmRsZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNBTldCdWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZXJyID0gc2V0UG9ydE1vZGUoa1BvcnRJbmRleElucHV0LCBtb2RlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQzMl90IHVzYWdlQml0czsKLSAgICAgICAgaWYgKG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKLSAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKLSAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCAhISh1c2FnZUJpdHMgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4pKTsKKyAgICAgICAgaWYgKG1vZGUgIT0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcikgeworICAgICAgICAgICAgdWludDMyX3QgdXNhZ2VCaXRzOworICAgICAgICAgICAgaWYgKG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCisgICAgICAgICAgICAgICAgICAgICZ1c2FnZUJpdHMsIHNpemVvZih1c2FnZUJpdHMpKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgISEodXNhZ2VCaXRzICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE4MTcsMjAgKzE4MTgsMTkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAgICAgICJyZXBlYXQtcHJldmlvdXMtZnJhbWUtYWZ0ZXIiLAotICAgICAgICAgICAgICAgICAgICAmbVJlcGVhdEZyYW1lRGVsYXlVcykpIHsKKyAgICAgICAgICAgICAgICBLRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSLCAmbVJlcGVhdEZyYW1lRGVsYXlVcykpIHsKICAgICAgICAgICAgIG1SZXBlYXRGcmFtZURlbGF5VXMgPSAtMUxMOwogICAgICAgICB9CiAKICAgICAgICAgLy8gb25seSBhbGxvdyAzMi1iaXQgdmFsdWUsIHNpbmNlIHdlIHBhc3MgaXQgYXMgVTMyIHRvIE9NWC4KLSAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgibWF4LXB0cy1nYXAtdG8tZW5jb2RlciIsICZtTWF4UHRzR2FwVXMpKSB7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoS0VZX01BWF9QVFNfR0FQX1RPX0VOQ09ERVIsICZtTWF4UHRzR2FwVXMpKSB7CiAgICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAwTEw7CiAgICAgICAgIH0gZWxzZSBpZiAobU1heFB0c0dhcFVzID4gSU5UMzJfTUFYIHx8IG1NYXhQdHNHYXBVcyA8IElOVDMyX01JTikgewogICAgICAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIHZhbHVlIGZvciBtYXggcHRzIGdhcCAlbGxkIiwgKGxvbmcgbG9uZykgbU1heFB0c0dhcFVzKTsKICAgICAgICAgICAgIG1NYXhQdHNHYXBVcyA9IDBMTDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbXNnLT5maW5kRmxvYXQoIm1heC1mcHMtdG8tZW5jb2RlciIsICZtTWF4RnBzKSkgeworICAgICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KEtFWV9NQVhfRlBTX1RPX0VOQ09ERVIsICZtTWF4RnBzKSkgewogICAgICAgICAgICAgbU1heEZwcyA9IC0xOwogICAgICAgICB9CiAKQEAgLTE4NDQsOCArMTg0NCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgKGludDMyX3QqKSZtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSkgeworICAgICAgICAgICAgICAgIEtFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQsCisgICAgICAgICAgICAgICAgKGludDMyX3QqKSZtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSkgewogICAgICAgICAgICAgbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMjA4OSw3ICsyMDg5LDggQEAKICAgICAgICAgaWYgKHVzaW5nU3dSZW5kZXJlcikgewogICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigidXNpbmctc3ctcmVuZGVyZXIiLCAxKTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpIHsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpIHx8CisgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUkpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CiAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpCiAgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkgewpAQCAtMjE4MCw3ICsyMTgxLDggQEAKICAgICAgICAgICAgIGVyciA9IHNldHVwRzcxMUNvZGVjKGVuY29kZXIsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpIHsKLSAgICAgICAgaW50MzJfdCBudW1DaGFubmVscyA9IDAsIHNhbXBsZVJhdGUgPSAwLCBjb21wcmVzc2lvbkxldmVsID0gLTE7CisgICAgICAgIC8vIG51bUNoYW5uZWxzIG5lZWRzIHRvIGJlIHNldCB0byBwcm9wZXJseSBjb21tdW5pY2F0ZSBQQ00gdmFsdWVzLgorICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMiwgc2FtcGxlUmF0ZSA9IDQ0MTAwLCBjb21wcmVzc2lvbkxldmVsID0gLTE7CiAgICAgICAgIGlmIChlbmNvZGVyICYmCiAgICAgICAgICAgICAgICAgKCFtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykKICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpKSB7CkBAIC0yMjA2LDcgKzIyMDgsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVyciA9IHNldHVwRmxhY0NvZGVjKAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSwgY29tcHJlc3Npb25MZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBjb21wcmVzc2lvbkxldmVsLCBwY21FbmNvZGluZyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKQEAgLTIyMzUsNiArMjIzNywxNSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZXJyID0gc2V0dXBFQUMzQ29kZWMoZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOwogICAgICAgICB9CisgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KSkgeworICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpCisgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBzZXR1cEFDNENvZGVjKGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTIzMDgsMTIgKzIzMTksMTYgQEAKICAgICAgICAgICAgICh2b2lkKW1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAoaW50MzJfdCopJmNvZGVjUGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgbUNvbnZlcnRlcltrUG9ydEluZGV4SW5wdXRdID0gQXVkaW9Db252ZXJ0ZXI6OkNyZWF0ZShwY21FbmNvZGluZywgY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICBpZiAobUNvbnZlcnRlcltrUG9ydEluZGV4SW5wdXRdICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6IGVuY29kZXIgJXMgaW5wdXQgZm9ybWF0IHBjbSBlbmNvZGluZyBjb252ZXJ0ZXIgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcGNtRW5jb2RpbmcsIGNvZGVjUGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgICAgIG1JbnB1dEZvcm1hdC0+c2V0SW50MzIoInBjbS1lbmNvZGluZyIsIHBjbUVuY29kaW5nKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICh2b2lkKW1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigicGNtLWVuY29kaW5nIiwgKGludDMyX3QqKSZjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgIG1Db252ZXJ0ZXJba1BvcnRJbmRleE91dHB1dF0gPSBBdWRpb0NvbnZlcnRlcjo6Q3JlYXRlKGNvZGVjUGNtRW5jb2RpbmcsIHBjbUVuY29kaW5nKTsKICAgICAgICAgICAgIGlmIChtQ29udmVydGVyW2tQb3J0SW5kZXhPdXRwdXRdICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6IGRlY29kZXIgJXMgb3V0cHV0IGZvcm1hdCBwY20gZW5jb2RpbmcgY29udmVydGVyIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGNvZGVjUGNtRW5jb2RpbmcsIHBjbUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigicGNtLWVuY29kaW5nIiwgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMzQ2LDYgKzIzNjEsMTcgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnNldEF1ZGlvUHJlc2VudGF0aW9uKGludDMyX3QgcHJlc2VudGF0aW9uSWQsIGludDMyX3QgcHJvZ3JhbUlkKSB7CisgICAgT01YX0FVRElPX0NPTkZJR19BTkRST0lEX0FVRElPUFJFU0VOVEFUSU9OIGNvbmZpZzsKKyAgICBJbml0T01YUGFyYW1zKCZjb25maWcpOworICAgIGNvbmZpZy5uUHJlc2VudGF0aW9uSWQgPSAoT01YX1MzMilwcmVzZW50YXRpb25JZDsKKyAgICBjb25maWcublByb2dyYW1JZCA9IChPTVhfUzMyKXByb2dyYW1JZDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQXVkaW9QcmVzZW50YXRpb24sCisgICAgICAgICAgICAmY29uZmlnLCBzaXplb2YoY29uZmlnKSk7CisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgQUNvZGVjOjpzZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KSB7CiAgICAgaWYgKHByaW9yaXR5IDwgMCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjg5MSw2ICsyOTE3LDM4IEBACiAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEVhYzMsICZkZWYsIHNpemVvZihkZWYpKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEFDNENvZGVjKAorICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSkgeworICAgIHN0YXR1c190IGVyciA9IHNldHVwUmF3QXVkaW9Gb3JtYXQoCisgICAgICAgICAgICBlbmNvZGVyID8ga1BvcnRJbmRleElucHV0IDoga1BvcnRJbmRleE91dHB1dCwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgIEFMT0dXKCJBQzQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FDNFRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisgICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4SW5wdXQ7CisKKyAgICBlcnIgPSBtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsICZkZWYsIHNpemVvZihkZWYpKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBkZWYubkNoYW5uZWxzID0gbnVtQ2hhbm5lbHM7CisgICAgZGVmLm5TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKworICAgIHJldHVybiBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsICZkZWYsIHNpemVvZihkZWYpKTsKK30KKwogc3RhdGljIE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgcGlja01vZGVGcm9tQml0UmF0ZSgKICAgICAgICAgYm9vbCBpc0FNUldCLCBpbnQzMl90IGJwcykgewogICAgIGlmIChpc0FNUldCKSB7CkBAIC0yOTc0LDggKzMwMzIsOCBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwRmxhY0NvZGVjKAotICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsKSB7Ci0KKyAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY29tcHJlc3Npb25MZXZlbCwKKyAgICAgICAgQXVkaW9FbmNvZGluZyBlbmNvZGluZykgewogICAgIGlmIChlbmNvZGVyKSB7CiAgICAgICAgIE9NWF9BVURJT19QQVJBTV9GTEFDVFlQRSBkZWY7CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CkBAIC0yOTk4LDcgKzMwNTYsOCBAQAogICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvRm9ybWF0KAogICAgICAgICAgICAgZW5jb2RlciA/IGtQb3J0SW5kZXhJbnB1dCA6IGtQb3J0SW5kZXhPdXRwdXQsCiAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBlbmNvZGluZyk7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBSYXdBdWRpb0Zvcm1hdCgKQEAgLTMwNTYsNiArMzExNSw3IEBACiAgICAgcGNtUGFyYW1zLmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CiAKICAgICBpZiAoZ2V0T01YQ2hhbm5lbE1hcHBpbmcobnVtQ2hhbm5lbHMsIHBjbVBhcmFtcy5lQ2hhbm5lbE1hcHBpbmcpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogaW5jb3JyZWN0IG51bUNoYW5uZWxzOiAlZCIsIF9fZnVuY19fLCBudW1DaGFubmVscyk7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KIApAQCAtMzcxMSw4ICszNzcxLDE3IEBACiAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlSERSU3RhdGljSW5mbyIsICZtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXgpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4ID0gKE9NWF9JTkRFWFRZUEUpMDsKKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgcmV0dXJuIGVycjsKKworICAgIGVyciA9IG1PTVhOb2RlLT5nZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlSERSMTBQbHVzSW5mbyIsICZtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4ID0gKE9NWF9JTkRFWFRZUEUpMDsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0SERSU3RhdGljSW5mbyhjb25zdCBEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMgJnBhcmFtcykgewpAQCAtNDIyNiwyNCArNDI5NSwyNyBAQAogICAgIGludCBtYXhEaW1lbnNpb24gPSBtYXgod2lkdGgsIGhlaWdodCk7CiAKICAgICBzdGF0aWMgY29uc3QgaW50IGxpbWl0c1tdWzVdID0gewotICAgICAgICAvKiAgIE1CcHMgICAgIE1CICAgZGltICBiaXRyYXRlICAgICAgICBsZXZlbCAqLwotICAgICAgICB7ICAgIDE0ODUsICAgIDk5LCAgMjgsICAgICA2NCwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKLSAgICAgICAgeyAgICAxNDg1LCAgICA5OSwgIDI4LCAgICAxMjgsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCi0gICAgICAgIHsgICAgMzAwMCwgICAzOTYsICA1NiwgICAgMTkyLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAotICAgICAgICB7ICAgIDYwMDAsICAgMzk2LCAgNTYsICAgIDM4NCwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKLSAgICAgICAgeyAgIDExODgwLCAgIDM5NiwgIDU2LCAgICA3NjgsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCi0gICAgICAgIHsgICAxMTg4MCwgICAzOTYsICA1NiwgICAyMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAotICAgICAgICB7ICAgMTk4MDAsICAgNzkyLCAgNzksICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKLSAgICAgICAgeyAgIDIwMjUwLCAgMTYyMCwgMTEzLCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCi0gICAgICAgIHsgICA0MDUwMCwgIDE2MjAsIDExMywgIDEwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAotICAgICAgICB7ICAxMDgwMDAsICAzNjAwLCAxNjksICAxNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKLSAgICAgICAgeyAgMjE2MDAwLCAgNTEyMCwgMjAyLCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCi0gICAgICAgIHsgIDI0NTc2MCwgIDgxOTIsIDI1NiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAotICAgICAgICB7ICAyNDU3NjAsICA4MTkyLCAyNTYsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKLSAgICAgICAgeyAgNTIyMjQwLCAgODcwNCwgMjYzLCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCi0gICAgICAgIHsgIDU4OTgyNCwgMjIwODAsIDQyMCwgMTM1MDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAotICAgICAgICB7ICA5ODMwNDAsIDM2ODY0LCA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKLSAgICAgICAgeyAyMDczNjAwLCAzNjg2NCwgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisgICAgICAgIC8qICAgIE1CcHMgICAgICBNQiAgIGRpbSAgYml0cmF0ZSAgICAgICAgbGV2ZWwgKi8KKyAgICAgICAgeyAgICAgMTQ4NSwgICAgIDk5LCAgIDI4LCAgICAgNjQsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCisgICAgICAgIHsgICAgIDE0ODUsICAgICA5OSwgICAyOCwgICAgMTI4LCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAorICAgICAgICB7ICAgICAzMDAwLCAgICAzOTYsICAgNTYsICAgIDE5MiwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKKyAgICAgICAgeyAgICAgNjAwMCwgICAgMzk2LCAgIDU2LCAgICAzODQsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCisgICAgICAgIHsgICAgMTE4ODAsICAgIDM5NiwgICA1NiwgICAgNzY4LCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAorICAgICAgICB7ICAgIDExODgwLCAgICAzOTYsICAgNTYsICAgMjAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKKyAgICAgICAgeyAgICAxOTgwMCwgICAgNzkyLCAgIDc5LCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCisgICAgICAgIHsgICAgMjAyNTAsICAgMTYyMCwgIDExMywgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAorICAgICAgICB7ICAgIDQwNTAwLCAgIDE2MjAsICAxMTMsICAxMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKKyAgICAgICAgeyAgIDEwODAwMCwgICAzNjAwLCAgMTY5LCAgMTQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCisgICAgICAgIHsgICAyMTYwMDAsICAgNTEyMCwgIDIwMiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAorICAgICAgICB7ICAgMjQ1NzYwLCAgIDgxOTIsICAyNTYsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKKyAgICAgICAgeyAgIDI0NTc2MCwgICA4MTkyLCAgMjU2LCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisgICAgICAgIHsgICA1MjIyNDAsICAgODcwNCwgIDI2MywgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAorICAgICAgICB7ICAgNTg5ODI0LCAgMjIwODAsICA0MjAsIDEzNTAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKKyAgICAgICAgeyAgIDk4MzA0MCwgIDM2ODY0LCAgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCisgICAgICAgIHsgIDIwNzM2MDAsICAzNjg2NCwgIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorICAgICAgICB7ICA0MTc3OTIwLCAxMzkyNjQsIDEwNTUsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNiAgfSwKKyAgICAgICAgeyAgODM1NTg0MCwgMTM5MjY0LCAxMDU1LCA0ODAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDYxIH0sCisgICAgICAgIHsgMTY3MTE2ODAsIDEzOTI2NCwgMTA1NSwgODAwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw2MiB9LAogICAgIH07CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUobGltaXRzKTsgaSsrKSB7CkBAIC00MzU2LDcgKzQ0MjgsNyBAQAogICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMjsKICAgICAgICAgaDI2NHR5cGUubkJGcmFtZXMgPSBtTGF0ZW5jeSA9PSAwID8gMSA6IHN0ZDo6bWluKDFVLCBtTGF0ZW5jeSAtIDEpOwogCi0gICAgICAgIC8vIGRpc2FibGUgQi1mcmFtZXMgdW50aWwgTVBFRzRXcml0ZXIgY2FuIGd1YXJhbnRlZSBmaW5hbGl6aW5nIGZpbGVzIHdpdGggQi1mcmFtZXMKKyAgICAgICAgLy8gZGlzYWJsZSBCLWZyYW1lcyB1bnRpbCB3ZSBoYXZlIGV4cGxpY2l0IHNldHRpbmdzIGZvciBlbmFibGluZyB0aGUgZmVhdHVyZS4KICAgICAgICAgaDI2NHR5cGUublJlZkZyYW1lcyA9IDE7CiAgICAgICAgIGgyNjR0eXBlLm5CRnJhbWVzID0gMDsKIApAQCAtNTI0NCw2ICs1MzE2LDI1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRBQzQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQzRUWVBFIHBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFjNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUzoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFIHBhcmFtczsKQEAgLTUzMjQsNiArNTQxNSw3MCBAQAogICAgIHJldHVybiBnZXRWZW5kb3JQYXJhbWV0ZXJzKHBvcnRJbmRleCwgbm90aWZ5KTsKIH0KIAorRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBBQ29kZWM6OmdldEhEUjEwUGx1c0luZm8oc2l6ZV90IHBhcmFtU2l6ZVVzZWQpIHsKKyAgICBpZiAobURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4ID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldEhEUjEwUGx1c0luZm86IGRvZXMgbm90IHN1cHBvcnQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHNpemVfdCBuZXdTaXplID0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgLSAxICsKKyAgICAgICAgICAgICgocGFyYW1TaXplVXNlZCA+IDApID8gcGFyYW1TaXplVXNlZCA6IDUxMik7CisgICAgaWYgKG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyID09IG51bGxwdHIKKyAgICAgICAgICAgIHx8IG5ld1NpemUgPiBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgIG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyID0gbmV3IEFCdWZmZXIobmV3U2l6ZSk7CisgICAgfQorICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqY29uZmlnID0KKyAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKiltSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+ZGF0YSgpOworICAgIEluaXRPTVhQYXJhbXMoY29uZmlnKTsKKyAgICBjb25maWctPm5TaXplID0gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKTsKKyAgICBjb25maWctPm5Qb3J0SW5kZXggPSAxOworICAgIHNpemVfdCBwYXJhbVNpemUgPSBjb25maWctPm5TaXplIC0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgKyAxOworICAgIGNvbmZpZy0+blBhcmFtU2l6ZSA9IHBhcmFtU2l6ZTsKKyAgICBjb25maWctPm5QYXJhbVNpemVVc2VkID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+Z2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICAgY29uZmlnLCBjb25maWctPm5TaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2V0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAoZXJyICVkKSIsIGVycik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5uUGFyYW1TaXplICE9IHBhcmFtU2l6ZSkgeworICAgICAgICBBTE9HRSgiRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIGFsdGVycyBuUGFyYW1TaXplOiAldSB2cyAlenUiLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+blBhcmFtU2l6ZSwgcGFyYW1TaXplKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChwYXJhbVNpemVVc2VkID4gMCAmJiBjb25maWctPm5QYXJhbVNpemVVc2VkICE9IHBhcmFtU2l6ZVVzZWQpIHsKKyAgICAgICAgQUxPR0UoIkRlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyByZXR1cm5zIHdyb25nIG5QYXJhbVNpemVVc2VkOiAldSB2cyAlenUiLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQsIHBhcmFtU2l6ZVVzZWQpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNvbmZpZzsKK30KKwordm9pZCBBQ29kZWM6Om9uQ29uZmlnVXBkYXRlKE9NWF9JTkRFWFRZUEUgY29uZmlnSW5kZXgpIHsKKyAgICBpZiAobURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4ID09IDAKKyAgICAgICAgICAgIHx8IGNvbmZpZ0luZGV4ICE9IG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCkgeworICAgICAgICAvLyBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggaXMgdGhlIG9ubHkgdXBkYXRlIHdlIHJlY29nbml6ZSBub3cKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqY29uZmlnID0gZ2V0SERSMTBQbHVzSW5mbygpOworICAgIGlmIChjb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChjb25maWctPm5QYXJhbVNpemVVc2VkID4gY29uZmlnLT5uUGFyYW1TaXplKSB7CisgICAgICAgIC8vIHRyeSBhZ2FpbiB3aXRoIHRoZSBzaXplIHNwZWNpZmllZAorICAgICAgICBjb25maWcgPSBnZXRIRFIxMFBsdXNJbmZvKGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQpOworICAgICAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1PdXRwdXRGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0LT5kdXAoKTsgLy8gdHJpZ2dlciBhbiBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgZXZlbnQKKyAgICBtT3V0cHV0Rm9ybWF0LT5zZXRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsCisgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoY29uZmlnLT5uVmFsdWUsIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQpKTsKK30KKwogdm9pZCBBQ29kZWM6Om9uRGF0YVNwYWNlQ2hhbmdlZChhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENvbG9yQXNwZWN0cyAmYXNwZWN0cykgewogICAgIC8vIGFzcGVjdHMgYXJlIG5vcm1hbGx5IGNvbW11bmljYXRlZCBpbiBDb2xvckFzcGVjdHMKICAgICBpbnQzMl90IHJhbmdlLCBzdGFuZGFyZCwgdHJhbnNmZXI7CkBAIC01NTU5LDYgKzU3MTQsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdENoZWNrSWZTdHVjazogeworICAgICAgICAgICAgQUxPR1YoIk5vLW9wIGJ5IGRlZmF1bHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC02MjU5LDYgKzY0MTksMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgIGlmIChidWZmZXItPmZvcm1hdCgpLT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykKKyAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMAorICAgICAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbUNvZGVjLT5tTGFzdEhkcjEwUGx1c0J1ZmZlcikgeworICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+c2l6ZSgpLCBoZHIxMFBsdXNJbmZvLT5kYXRhKCkpOworICAgICAgICAgICAgbUNvZGVjLT5tTGFzdEhkcjEwUGx1c0J1ZmZlciA9IGhkcjEwUGx1c0luZm87CisgICAgICAgIH0KKwogICAgICAgICAvLyBzYXZlIGJ1ZmZlcnMgc2VudCB0byB0aGUgc3VyZmFjZSBzbyB3ZSBjYW4gZ2V0IHJlbmRlciB0aW1lIHdoZW4gdGhleSByZXR1cm4KICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVcyA9IC0xOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpOwpAQCAtNjM2Nyw4ICs2NTM2LDEwIEBACiAKICAgICBpZiAobURlYXRoTm90aWZpZXIgIT0gTlVMTCkgewogICAgICAgICBpZiAobUNvZGVjLT5tT01YTm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhdXRvIHRPbXhOb2RlID0gbUNvZGVjLT5tT01YTm9kZS0+Z2V0SGFsSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICB0T214Tm9kZS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgICAgICAgICBhdXRvIHRPbXhOb2RlID0gbUNvZGVjLT5tT01YTm9kZS0+Z2V0SGFsSW50ZXJmYWNlPElPbXhOb2RlPigpOworICAgICAgICAgICAgaWYgKHRPbXhOb2RlKSB7CisgICAgICAgICAgICAgICAgdE9teE5vZGUtPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQpAQCAtNjQ1NSw3ICs2NjI2LDggQEAKIAogICAgIENIRUNLKG1Db2RlYy0+bU9NWE5vZGUgPT0gTlVMTCk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YRGllZCwgbUNvZGVjKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZUxpc3QsIG1Db2RlYyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bU5vZGVHZW5lcmF0aW9uICsgMSk7CiAKICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJjb2RlY0luZm8iLCAmb2JqKSk7CkBAIC02NDcwLDcgKzY2NDIsNyBAQAogICAgIEFTdHJpbmcgY29tcG9uZW50TmFtZTsKICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmY29tcG9uZW50TmFtZSkpOwogCi0gICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcjsKKyAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyKG5vdGlmeSk7CiAgICAgc3A8SU9NWD4gb214OwogICAgIHNwPElPTVhOb2RlPiBvbXhOb2RlOwogCkBAIC02NDk1LDE1ICs2NjY3LDEzIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKG5vdGlmeSk7Ci0gICAgYXV0byB0T214Tm9kZSA9IG9teE5vZGUtPmdldEhhbEludGVyZmFjZSgpOwotICAgIGlmICghdE9teE5vZGUtPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKSkgeworICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIobmV3IEFNZXNzYWdlKGtXaGF0T01YRGllZCwgbUNvZGVjKSk7CisgICAgYXV0byB0T214Tm9kZSA9IG9teE5vZGUtPmdldEhhbEludGVyZmFjZTxJT214Tm9kZT4oKTsKKyAgICBpZiAodE9teE5vZGUgJiYgIXRPbXhOb2RlLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgMCkpIHsKICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9CiAKLSAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlTGlzdCwgbUNvZGVjKTsKLSAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttQ29kZWMtPm1Ob2RlR2VuZXJhdGlvbik7Ci0gICAgb2JzZXJ2ZXItPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZ5KTsKKyAgICArK21Db2RlYy0+bU5vZGVHZW5lcmF0aW9uOwogCiAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7CiAgICAgbUNvZGVjLT5tUmVuZGVyVHJhY2tlci5zZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE5hbWUpOwpAQCAtNzI2MSw3ICs3NDMxLDcgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVPZmZzZXRVczsKLSAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgJnRpbWVPZmZzZXRVcykpIHsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRSwgJnRpbWVPZmZzZXRVcykpIHsKICAgICAgICAgaWYgKG1HcmFwaGljQnVmZmVyU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJbJXNdIEludmFsaWQgdG8gc2V0IGlucHV0IGJ1ZmZlciB0aW1lIG9mZnNldCB3aXRob3V0IHN1cmZhY2UiLAogICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKQEAgLTcyOTcsNyArNzQ2Nyw3IEBACiAgICAgfQogCiAgICAgaW50MzJfdCBkcm9wSW5wdXRGcmFtZXM7Ci0gICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsICZkcm9wSW5wdXRGcmFtZXMpKSB7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKFBBUkFNRVRFUl9LRVlfU1VTUEVORCwgJmRyb3BJbnB1dEZyYW1lcykpIHsKICAgICAgICAgaWYgKG1HcmFwaGljQnVmZmVyU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJbJXNdIEludmFsaWQgdG8gc2V0IHN1c3BlbmQgd2l0aG91dCBzdXJmYWNlIiwKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CkBAIC03MzA1LDcgKzc0NzUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50NjRfdCBzdXNwZW5kU3RhcnRUaW1lVXMgPSAtMTsKLSAgICAgICAgKHZvaWQpIHBhcmFtcy0+ZmluZEludDY0KCJkcm9wLXN0YXJ0LXRpbWUtdXMiLCAmc3VzcGVuZFN0YXJ0VGltZVVzKTsKKyAgICAgICAgKHZvaWQpIHBhcmFtcy0+ZmluZEludDY0KFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FLCAmc3VzcGVuZFN0YXJ0VGltZVVzKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gc3RhdHVzRnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgICAgICBtR3JhcGhpY0J1ZmZlclNvdXJjZS0+c2V0U3VzcGVuZChkcm9wSW5wdXRGcmFtZXMgIT0gMCwgc3VzcGVuZFN0YXJ0VGltZVVzKSk7CiAKQEAgLTczODUsMTIgKzc1NTUsNTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGludDMyX3QgcHJlc2VudGF0aW9uSWQgPSAtMTsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImF1ZGlvLXByZXNlbnRhdGlvbi1wcmVzZW50YXRpb24taWQiLCAmcHJlc2VudGF0aW9uSWQpKSB7CisgICAgICAgIGludDMyX3QgcHJvZ3JhbUlkID0gLTE7CisgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKCJhdWRpby1wcmVzZW50YXRpb24tcHJvZ3JhbS1pZCIsICZwcm9ncmFtSWQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRBdWRpb1ByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0koIlslc10gZmFpbGVkIHNldEF1ZGlvUHJlc2VudGF0aW9uLiBGYWlsdXJlIGlzIGZpbmUgc2luY2UgdGhpcyBrZXkgaXMgb3B0aW9uYWwiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICBpZiAocGFyYW1zLT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykKKyAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwKSB7CisgICAgICAgICh2b2lkKXNldEhkcjEwUGx1c0luZm8oaGRyMTBQbHVzSW5mbyk7CisgICAgfQorCiAgICAgLy8gSWdub3JlIGVycm9ycyBhcyBmYWlsdXJlIGlzIGV4cGVjdGVkIGZvciBjb2RlY3MgdGhhdCBhcmVuJ3QgdmlkZW8gZW5jb2RlcnMuCiAgICAgKHZvaWQpY29uZmlndXJlVGVtcG9yYWxMYXllcnMocGFyYW1zLCBmYWxzZSAvKiBpbkNvbmZpZ3VyZSAqLywgbU91dHB1dEZvcm1hdCk7CiAKICAgICByZXR1cm4gc2V0VmVuZG9yUGFyYW1ldGVycyhwYXJhbXMpOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnNldEhkcjEwUGx1c0luZm8oY29uc3Qgc3A8QUJ1ZmZlcj4gJmhkcjEwUGx1c0luZm8pIHsKKyAgICBpZiAobURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4ID09IDApIHsKKyAgICAgICAgQUxPR0UoInNldEhkcjEwUGx1c0luZm86IGRvZXMgbm90IHN1cHBvcnQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIik7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgc2l6ZV90IG5ld1NpemUgPSBzaXplb2YoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKSArIGhkcjEwUGx1c0luZm8tPnNpemUoKSAtIDE7CisgICAgaWYgKG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgIG5ld1NpemUgPiBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgIG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyID0gbmV3IEFCdWZmZXIobmV3U2l6ZSk7CisgICAgfQorICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqY29uZmlnID0KKyAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKiltSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+ZGF0YSgpOworICAgIEluaXRPTVhQYXJhbXMoY29uZmlnKTsKKyAgICBjb25maWctPm5Qb3J0SW5kZXggPSAwOworICAgIGNvbmZpZy0+blNpemUgPSBuZXdTaXplOworICAgIGNvbmZpZy0+blBhcmFtU2l6ZSA9IGhkcjEwUGx1c0luZm8tPnNpemUoKTsKKyAgICBjb25maWctPm5QYXJhbVNpemVVc2VkID0gaGRyMTBQbHVzSW5mby0+c2l6ZSgpOworICAgIG1lbWNweShjb25maWctPm5WYWx1ZSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpLCBoZHIxMFBsdXNJbmZvLT5zaXplKCkpOworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5zZXRDb25maWcoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSltRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgsCisgICAgICAgICAgICBjb25maWcsIGNvbmZpZy0+blNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIChlcnIgJWQpIiwgZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiAvLyBSZW1vdmVzIHRyYWlsaW5nIHRhZ3MgbWF0Y2hpbmcgfHRhZ3wgZnJvbSB8a2V5fCAoZS5nLiBhIHNldHRpbmdzIG5hbWUpLiB8bWluTGVuZ3RofCBzcGVjaWZpZXMKIC8vIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGtlZXAgaW4gfGtleXwgKGV2ZW4gaWYgaXQgaGFzIHRyYWlsaW5nIHRhZ3MpLgogLy8gKFVzZWQgdG8gcmVtb3ZlIHRyYWlsaW5nICd2YWx1ZScgdGFncyBpbiBzZXR0aW5ncyBuYW1lcywgZS5nLiB0byBub3JtYWxpemUKQEAgLTc4MTIsNiArODAyNywxNSBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9FdmVudENvbmZpZ1VwZGF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTEsIChPTVhfVTMyKWtQb3J0SW5kZXhPdXRwdXQpOworCisgICAgICAgICAgICBtQ29kZWMtPm9uQ29uZmlnVXBkYXRlKChPTVhfSU5ERVhUWVBFKWRhdGEyKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9FdmVudEJ1ZmZlckZsYWc6CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNzg3Niw2ICs4MTAwLDE4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRDaGVja0lmU3R1Y2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbiA9IDA7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgVElNRURfT1VUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBoYW5kbGVkID0gQmFzZVN0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC03ODg3LDYgKzgxMjMsMTEgQEAKIHZvaWQgQUNvZGVjOjpPdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2VkU3RhdGU6OnN0YXRlRW50ZXJlZCgpIHsKICAgICBBTE9HVigiWyVzXSBOb3cgaGFuZGxpbmcgb3V0cHV0IHBvcnQgc2V0dGluZ3MgY2hhbmdlIiwKICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisKKyAgICAvLyBJZiB3ZSBoYXZlbid0IHRyYW5zaXRpb25lZCBhZnRlciAzIHNlY29uZHMsIHdlJ3JlIHByb2JhYmx5IHN0dWNrLgorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoQUNvZGVjOjprV2hhdENoZWNrSWZTdHVjaywgbUNvZGVjKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiB9CiAKIGJvb2wgQUNvZGVjOjpPdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2VkU3RhdGU6Om9uT01YRnJhbWVSZW5kZXJlZCgKQEAgLTgxNTMsNiArODM5NCwxMSBAQAogICAgIEFMT0dWKCJbJXNdIE5vdyBGbHVzaGluZyIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAKICAgICBtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4SW5wdXRdID0gbUZsdXNoQ29tcGxldGVba1BvcnRJbmRleE91dHB1dF0gPSBmYWxzZTsKKworICAgIC8vIElmIHdlIGhhdmVuJ3QgdHJhbnNpdGlvbmVkIGFmdGVyIDMgc2Vjb25kcywgd2UncmUgcHJvYmFibHkgc3R1Y2suCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShBQ29kZWM6OmtXaGF0Q2hlY2tJZlN0dWNrLCBtQ29kZWMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgzMDAwMDAwKTsKIH0KIAogYm9vbCBBQ29kZWM6OkZsdXNoaW5nU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC04MTY3LDYgKzg0MTMsNyBAQAogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pOwogICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgzMDAwMDAwKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtODE4Nyw2ICs4NDM0LDE4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRDaGVja0lmU3R1Y2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbiA9IDA7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgVElNRURfT1VUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBoYW5kbGVkID0gQmFzZVN0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC04MzEzLDcgKzg1NzIsNyBAQAogICAgIH0KIAogICAgIHNwPElPTVg+IG9teCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKLSAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyOworICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXIobmV3IEFNZXNzYWdlKTsKICAgICBzcDxJT01YTm9kZT4gb214Tm9kZTsKIAogICAgIGVyciA9IG9teC0+YWxsb2NhdGVOb2RlKG5hbWUsIG9ic2VydmVyLCAmb214Tm9kZSk7CkBAIC04NDI5LDE0ICs4Njg4LDE3IEBACiAgICAgICAgIGlmIChvbXhOb2RlLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsIDAsICZzaWRlYmFuZEhhbmRsZSkgPT0gT0spIHsKICAgICAgICAgICAgIC8vIHR1bm5lbGVkIHBsYXliYWNrIGluY2x1ZGVzIGFkYXB0aXZlIHBsYXliYWNrCi0gICAgICAgICAgICBjYXBzLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzQWRhcHRpdmVQbGF5YmFjawotICAgICAgICAgICAgICAgICAgICB8IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNUdW5uZWxlZFBsYXliYWNrKTsKLSAgICAgICAgfSBlbHNlIGlmIChvbXhOb2RlLT5zZXRQb3J0TW9kZSgKLSAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyKSA9PSBPSyB8fAotICAgICAgICAgICAgICAgIG9teE5vZGUtPnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAotICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLAotICAgICAgICAgICAgICAgIDEyODAgLyogd2lkdGggKi8sIDcyMCAvKiBoZWlnaHQgKi8pID09IE9LKSB7Ci0gICAgICAgICAgICBjYXBzLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzQWRhcHRpdmVQbGF5YmFjayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0dW5uZWxlZCBwbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICBjYXBzLT5yZW1vdmVEZXRhaWwoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9UVU5ORUxFRF9QTEFZQkFDSyk7CisgICAgICAgICAgICBpZiAob214Tm9kZS0+c2V0UG9ydE1vZGUoCisgICAgICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIElPTVg6OmtQb3J0TW9kZUR5bmFtaWNBTldCdWZmZXIpICE9IE9LICYmCisgICAgICAgICAgICAgICAgICAgIG9teE5vZGUtPnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAxMjgwIC8qIHdpZHRoICovLCA3MjAgLyogaGVpZ2h0ICovKSAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIGFkYXB0aXZlIHBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICBjYXBzLT5yZW1vdmVEZXRhaWwoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9BREFQVElWRV9QTEFZQkFDSyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg0NDQsMTEgKzg3MDYsMjAgQEAKICAgICAgICAgT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX0lOVFJBUkVGUkVTSFRZUEUgcGFyYW1zOwogICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7Ci0gICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSB2ZXJpZnkgaWYgZmFsbGJhY2sgaXMgc3VwcG9ydGVkPworCisgICAgICAgIE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFIGZhbGxiYWNrUGFyYW1zOworICAgICAgICBJbml0T01YUGFyYW1zKCZmYWxsYmFja1BhcmFtcyk7CisgICAgICAgIGZhbGxiYWNrUGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICBmYWxsYmFja1BhcmFtcy5lUmVmcmVzaE1vZGUgPSBPTVhfVklERU9fSW50cmFSZWZyZXNoQ3ljbGljOworCiAgICAgICAgIGlmIChvbXhOb2RlLT5nZXRDb25maWcoCiAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQW5kcm9pZEludHJhUmVmcmVzaCwKLSAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkgPT0gT0spIHsKLSAgICAgICAgICAgIGNhcHMtPmFkZEZsYWdzKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNJbnRyYVJlZnJlc2gpOworICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSAhPSBPSyAmJgorICAgICAgICAgICAgICAgIG9teE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaCwgJmZhbGxiYWNrUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmFsbGJhY2tQYXJhbXMpKSAhPSBPSykgeworICAgICAgICAgICAgLy8gaW50cmEgcmVmcmVzaCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICBjYXBzLT5yZW1vdmVEZXRhaWwoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9JTlRSQV9SRUZSRVNIKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAppbmRleCA3MTBhZTY4Li4yNjZhMjQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMTI5LDYgKzEyOSw3IEBACiAgICAgICAgIHNlY3VyZUhhbmRsZSA9IHN0YXRpY19jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblBvaW50ZXIoKSk7CiAgICAgfQogICAgIHNzaXplX3QgcmVzdWx0ID0gLTE7CisgICAgc3NpemVfdCBjb2RlY0RhdGFPZmZzZXQgPSAwOwogICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKICAgICAgICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CiAgICAgICAgIGlmIChzZWN1cmUpIHsKQEAgLTE4MCw5ICsxODEsMTYgQEAKIAogICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKICAgICAgICAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgU2NyYW1ibGluZ0NvbnRyb2wgc2N0cmwgPSBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQ7CisKKyAgICAgICAgaWYgKGtleSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzY3RybCA9IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF07CisgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHRoZSBQRVMgb2Zmc2V0CisgICAgICAgICAgICBjb2RlY0RhdGFPZmZzZXQgPSBrZXlbMl0gfCAoa2V5WzNdIDw8IDgpOworICAgICAgICB9CiAKICAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAotICAgICAgICAgICAgICAgIGtleSAhPSBOVUxMID8gKFNjcmFtYmxpbmdDb250cm9sKWtleVswXSA6IFNjcmFtYmxpbmdDb250cm9sOjpVTlNDUkFNQkxFRCwKKyAgICAgICAgICAgICAgICBzY3RybCwKICAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCiAgICAgICAgICAgICAgICAgMCwKQEAgLTIwMiw2ICsyMTAsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHJlc3VsdCA8IGNvZGVjRGF0YU9mZnNldCkgeworICAgICAgICAgICAgQUxPR0QoImludmFsaWQgY29kZWMgZGF0YSBvZmZzZXQ6ICV6ZCwgcmVzdWx0ICV6ZCIsIGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKwogICAgICAgICBBTE9HVigiZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIHJlc3VsdCk7CiAKICAgICAgICAgaWYgKGRzdEJ1ZmZlci50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKQEAgLTIxMCw3ICsyMjMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgcmVzdWx0KTsKKyAgICBpdC0+bUNvZGVjQnVmZmVyLT5zZXRSYW5nZShjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCAtIGNvZGVjRGF0YU9mZnNldCk7CiAKICAgICAvLyBDb3B5IG1ldGFkYXRhIGZyb20gY2xpZW50IHRvIGNvZGVjIGJ1ZmZlci4KICAgICBpdC0+bUNvZGVjQnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OWI4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FTdGF0ZTo6QVN0YXRlKGNvbnN0IHNwPEFTdGF0ZT4gJnBhcmVudFN0YXRlKQorICAgIDogbVBhcmVudFN0YXRlKHBhcmVudFN0YXRlKSB7Cit9CisKK0FTdGF0ZTo6fkFTdGF0ZSgpIHsKK30KKworc3A8QVN0YXRlPiBBU3RhdGU6OnBhcmVudFN0YXRlKCkgeworICAgIHJldHVybiBtUGFyZW50U3RhdGU7Cit9CisKK3ZvaWQgQVN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7Cit9CisKK3ZvaWQgQVN0YXRlOjpzdGF0ZUV4aXRlZCgpIHsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKK30KKworQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6fkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Cit9CisKK3ZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6aGFuZGxlTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFTdGF0ZT4gc2F2ZSA9IG1TdGF0ZTsKKworICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOworICAgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiAhY3VyLT5vbk1lc3NhZ2VSZWNlaXZlZChtc2cpKSB7CisgICAgICAgIC8vIElmIHlvdSBjbGFpbSBub3QgdG8gaGF2ZSBoYW5kbGVkIHRoZSBtZXNzYWdlIHlvdSBzaG91bGRuJ3QKKyAgICAgICAgLy8gaGF2ZSBjYWxsZWQgc2V0U3RhdGUuLi4KKyAgICAgICAgQ0hFQ0soc2F2ZSA9PSBtU3RhdGUpOworCisgICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKKyAgICB9CisKKyAgICBpZiAoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dXKCJXYXJuaW5nIG1lc3NhZ2UgJXMgdW5oYW5kbGVkIGluIHJvb3Qgc3RhdGUuIiwKKyAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKK30KKwordm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpjaGFuZ2VTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZzdGF0ZSkgeworICAgIGlmIChzdGF0ZSA9PSBtU3RhdGUpIHsKKyAgICAgICAgLy8gUXVpY2sgZXhpdCBmb3IgdGhlIGVhc3kgY2FzZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZlY3RvcjxzcDxBU3RhdGU+ID4gQTsKKyAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEEucHVzaChjdXIpOworICAgICAgICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEI7CisgICAgY3VyID0gc3RhdGU7CisgICAgZm9yICg7OykgeworICAgICAgICBCLnB1c2goY3VyKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRoZSBjb21tb24gdGFpbC4KKyAgICB3aGlsZSAoQS5zaXplKCkgPiAwICYmIEIuc2l6ZSgpID4gMCAmJiBBLnRvcCgpID09IEIudG9wKCkpIHsKKyAgICAgICAgQS5wb3AoKTsKKyAgICAgICAgQi5wb3AoKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBzdGF0ZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQS5zaXplKCk7ICsraSkgeworICAgICAgICBBLmVkaXRJdGVtQXQoaSktPnN0YXRlRXhpdGVkKCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IEIuc2l6ZSgpOyBpID4gMDspIHsKKyAgICAgICAgaS0tOworICAgICAgICBCLmVkaXRJdGVtQXQoaSktPnN0YXRlRW50ZXJlZCgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCmluZGV4IDQxMTA2YTEuLjI0ZjZmMGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcApAQCAtMTQ5LDExICsxNDksMTEgQEAKICAgICBtRG9uZSA9IHRydWU7CiAKICAgICB2b2lkICpkdW1teTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CiAgICAgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYKICAgICAgICAgICAgIChzdGF0dXMgIT0gT0sgJiYgc3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pKSB7CiAgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCBiYzc1NjlmLi5kYzUxYjE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiAKLSAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIiwgImxpYm1lZGlhbmRrIl0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKQEAgLTc3LDE2ICs3Nyw1MSBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAorCisgICAgc3JjczogWworICAgICAgICAiVXRpbHMuY3BwIiwKKyAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCisgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodCIsCiAKICAgICBzcmNzOiBbCisgICAgICAgICJBQUNXcml0ZXIuY3BwIiwKICAgICAgICAgIkFDb2RlYy5jcHAiLAogICAgICAgICAiQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAotICAgICAgICAiQUFDV3JpdGVyLmNwcCIsCisgICAgICAgICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCIsCiAgICAgICAgICJBTVJXcml0ZXIuY3BwIiwKICAgICAgICAgIkF1ZGlvUGxheWVyLmNwcCIsCi0gICAgICAgICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIiwKICAgICAgICAgIkF1ZGlvU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJJbXBsLmNwcCIsCiAgICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKQEAgLTk0LDggKzEyOSwxMCBAQAogICAgICAgICAiQ2FtZXJhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIiwKICAgICAgICAgIkRhdGFDb252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgIkRhdGFTb3VyY2VCYXNlLmNwcCIsCiAgICAgICAgICJEYXRhU291cmNlRmFjdG9yeS5jcHAiLAogICAgICAgICAiRGF0YVVSSVNvdXJjZS5jcHAiLAorICAgICAgICAiQ2xlYXJGaWxlU291cmNlLmNwcCIsCiAgICAgICAgICJGaWxlU291cmNlLmNwcCIsCiAgICAgICAgICJGcmFtZURlY29kZXIuY3BwIiwKICAgICAgICAgIkhUVFBCYXNlLmNwcCIsCkBAIC0xMTAsMTIgKzE0NywxNyBAQAogICAgICAgICAiTWVkaWFDb2RlY0xpc3QuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjU291cmNlLmNwcCIsCisgICAgICAgICJNZWRpYUV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCIsCisgICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiTWVkaWFTeW5jLmNwcCIsCisgICAgICAgICJNZWRpYVRyYWNrLmNwcCIsCisgICAgICAgICJodHRwL0NsZWFyTWVkaWFIVFRQLmNwcCIsCiAgICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAogICAgICAgICAiTWVkaWFNdXhlci5jcHAiLAogICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCiAgICAgICAgICJOdU1lZGlhRXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJPZ2dXcml0ZXIuY3BwIiwKICAgICAgICAgIk9NWENsaWVudC5jcHAiLAogICAgICAgICAiT214SW5mb0J1aWxkZXIuY3BwIiwKICAgICAgICAgIlJlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCIsCkBAIC0xMjgsNDMgKzE3MCwzOCBAQAogICAgICAgICAiU3VyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJVdGlscy5jcHAiLAogICAgICAgICAiVGhyb3R0bGVkU291cmNlLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAiLAogICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAogICAgICAgICAibGliZ3VpIiwKLSAgICAgICAgImxpYmlvbiIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlY2Jhc2UiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYlJTY3BwIiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKLSAgICAgICAgImxpYnppcGFyY2hpdmUiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC0xNzQsMTMgKzIxMSwyMSBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAogICAgICAgICAibGlidnB4IiwKKyAgICAgICAgImxpYm9nZyIsCiAgICAgICAgICJsaWJ3ZWJtIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKICAgICAgICAgImxpYkZMQUMiLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczpbCisgICAgICAgICJsaWJuYXRpdmVsb2FkZXItZHVtbXktaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKKwogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCiAgICAgXSwKQEAgLTIxNCw1OCArMjU5LDM2IEBACiAgICAgfSwKIH0KIAotY2NfbGlicmFyeSB7CitjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3BsYXllcjIiLAogCiAgICAgc3JjczogWwotICAgICAgICAiQ2FsbGJhY2tEYXRhU291cmNlLmNwcCIsCi0gICAgICAgICJDYWxsYmFja01lZGlhU291cmNlLmNwcCIsCi0gICAgICAgICJEYXRhU291cmNlRmFjdG9yeS5jcHAiLAorICAgICAgICAiQ2xlYXJGaWxlU291cmNlLmNwcCIsCiAgICAgICAgICJEYXRhVVJJU291cmNlLmNwcCIsCi0gICAgICAgICJGaWxlU291cmNlLmNwcCIsCisgICAgICAgICJEYXRhU291cmNlQmFzZS5jcHAiLAogICAgICAgICAiSFRUUEJhc2UuY3BwIiwKICAgICAgICAgIkhldmNVdGlscy5jcHAiLAotICAgICAgICAiSW50ZXJmYWNlVXRpbHMuY3BwIiwKICAgICAgICAgIk1lZGlhQ2xvY2suY3BwIiwKLSAgICAgICAgIk1lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAiLAorICAgICAgICAiTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIk5ka1V0aWxzLmNwcCIsCi0gICAgICAgICJOdUNhY2hlZFNvdXJjZTIuY3BwIiwKLSAgICAgICAgIlJlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJSZW1vdGVNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiVXRpbHMuY3BwIiwKLSAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIiwKLSAgICAgICAgImh0dHAvTWVkaWFIVFRQLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlcjIuY3BwIiwKKyAgICAgICAgImh0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKLSAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKLSAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnppcGFyY2hpdmUiLAorICAgICAgICAibGliYW5kcm9pZCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6WwotICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IGE2ZjBhMGIuLjE5OWI1N2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKQEAgLTExOCw2ICsxMTgsMTMgQEAKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5vIG1ldGFkYXRhIGIvMTE4NjIwODcxIik7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTE4NjIwODcxIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBib29sIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTE4NTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBdWRpb1ByZXNlbnRhdGlvbkluZm8iCi0KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BdWRpb1ByZXNlbnRhdGlvbkluZm86OkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpIHsKLX0KLQotQXVkaW9QcmVzZW50YXRpb25JbmZvOjp+QXVkaW9QcmVzZW50YXRpb25JbmZvKCkgewotICAgIG1QcmVzZW50YXRpb25zLmNsZWFyKCk7Ci19Ci0KLXZvaWQgQXVkaW9QcmVzZW50YXRpb25JbmZvOjphZGRQcmVzZW50YXRpb24oc3A8QXVkaW9QcmVzZW50YXRpb24+IHByZXNlbnRhdGlvbikgewotICAgIG1QcmVzZW50YXRpb25zLnB1c2gocHJlc2VudGF0aW9uKTsKLX0KLQotc2l6ZV90IEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6Y291bnRQcmVzZW50YXRpb25zKCkgY29uc3QgewotICAgIHJldHVybiBtUHJlc2VudGF0aW9ucy5zaXplKCk7Ci19Ci0KLS8vIFJldHVybnMgYW4gQXVkaW9QcmVzZW50YXRpb24gZm9yIHRoZSBnaXZlbiB2YWxpZCBpbmRleAotLy8gaW5kZXggbXVzdCBiZSA+PTAgYW5kIDwgY291bnRQcmVzZW50YXRpb25zKCkKLWNvbnN0IHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmdldFByZXNlbnRhdGlvbihzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXNlbnRhdGlvbnNbaW5kZXhdOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCmluZGV4IGVlNmZlMTcuLjVmODZiZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKQEAgLTUyLDcgKzUyLDkgQEAKIEF1ZGlvU291cmNlOjpBdWRpb1NvdXJjZSgKICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsIHVpbnQzMl90IG91dFNhbXBsZVJhdGUsCi0gICAgICAgIHVpZF90IHVpZCwgcGlkX3QgcGlkLCBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCisgICAgICAgIHVpZF90IHVpZCwgcGlkX3QgcGlkLCBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Qgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCisgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pCiAgICAgOiBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKICAgICAgIG1PdXRTYW1wbGVSYXRlKG91dFNhbXBsZVJhdGUgPiAwID8gb3V0U2FtcGxlUmF0ZSA6IHNhbXBsZVJhdGUpLApAQCAtMTAzLDcgKzEwNSw5IEBACiAgICAgICAgICAgICAgICAgICAgIHVpZCwKICAgICAgICAgICAgICAgICAgICAgcGlkLAogICAgICAgICAgICAgICAgICAgICBOVUxMIC8qcEF0dHJpYnV0ZXMqLywKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uKTsKICAgICAgICAgbUluaXRDaGVjayA9IG1SZWNvcmQtPmluaXRDaGVjaygpOwogICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICAgICAgbVJlY29yZC5jbGVhcigpOwpAQCAtNTA2LDQgKzUxMCwyNyBAQAogICAgIHJldHVybiBOT19JTklUOwogfQogCitzdGF0dXNfdCBBdWRpb1NvdXJjZTo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIEFMT0dWKCJzZXRNaWNyb3Bob25lRGlyZWN0aW9uKCVkKSIsIGRpcmVjdGlvbik7CisgICAgaWYgKG1SZWNvcmQgIT0gMCkgeworICAgICAgICByZXR1cm4gbVJlY29yZC0+c2V0TWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQUxPR1YoInNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiglZikiLCB6b29tKTsKKyAgICBpZiAobVJlY29yZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBBdWRpb1NvdXJjZTo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgeworICAgIGlmIChtUmVjb3JkICE9IDApIHsKKyAgICAgICAgKnBvcnRJZCA9IG1SZWNvcmQtPmdldFBvcnRJZCgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTJjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhckZpbGVTb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NsZWFyRmlsZVNvdXJjZTo6Q2xlYXJGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgIDogbUZkKC0xKSwKKyAgICAgIG1PZmZzZXQoMCksCisgICAgICBtTGVuZ3RoKC0xKSwKKyAgICAgIG1OYW1lKCI8bnVsbD4iKSB7CisKKyAgICBpZiAoZmlsZW5hbWUpIHsKKyAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIkZpbGVTb3VyY2UoJXMpIiwgZmlsZW5hbWUpOworICAgIH0KKyAgICBBTE9HVigiJXMiLCBmaWxlbmFtZSk7CisgICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19MQVJHRUZJTEUgfCBPX1JET05MWSk7CisKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgbUxlbmd0aCA9IGxzZWVrNjQobUZkLCAwLCBTRUVLX0VORCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGZpbGUgJyVzJy4gKCVzKSIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KK30KKworQ2xlYXJGaWxlU291cmNlOjpDbGVhckZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCisgICAgOiBtRmQoZmQpLAorICAgICAgbU9mZnNldChvZmZzZXQpLAorICAgICAgbUxlbmd0aChsZW5ndGgpLAorICAgICAgbU5hbWUoIjxudWxsPiIpIHsKKyAgICBBTE9HVigiZmQ9JWQgKCVzKSwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkIiwKKyAgICAgICAgICAgIGZkLCBuYW1lRm9yRmQoZmQpLmNfc3RyKCksIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoKTsKKworICAgIGlmIChtT2Zmc2V0IDwgMCkgeworICAgICAgICBtT2Zmc2V0ID0gMDsKKyAgICB9CisgICAgaWYgKG1MZW5ndGggPCAwKSB7CisgICAgICAgIG1MZW5ndGggPSAwOworICAgIH0KKyAgICBpZiAobUxlbmd0aCA+IElOVDY0X01BWCAtIG1PZmZzZXQpIHsKKyAgICAgICAgbUxlbmd0aCA9IElOVDY0X01BWCAtIG1PZmZzZXQ7CisgICAgfQorICAgIHN0cnVjdCBzdGF0IHM7CisgICAgaWYgKGZzdGF0KGZkLCAmcykgPT0gMCkgeworICAgICAgICBpZiAobU9mZnNldCA+IHMuc3Rfc2l6ZSkgeworICAgICAgICAgICAgbU9mZnNldCA9IHMuc3Rfc2l6ZTsKKyAgICAgICAgICAgIG1MZW5ndGggPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChtT2Zmc2V0ICsgbUxlbmd0aCA+IHMuc3Rfc2l6ZSkgeworICAgICAgICAgICAgbUxlbmd0aCA9IHMuc3Rfc2l6ZSAtIG1PZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PZmZzZXQgIT0gb2Zmc2V0IHx8IG1MZW5ndGggIT0gbGVuZ3RoKSB7CisgICAgICAgIEFMT0dXKCJvZmZzZXQvbGVuZ3RoIGFkanVzdGVkIGZyb20gJWxsZC8lbGxkIHRvICVsbGQvJWxsZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwgKGxvbmcgbG9uZykgbUxlbmd0aCk7CisgICAgfQorCisgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAiRmlsZVNvdXJjZShmZCglcyksICVsbGQsICVsbGQpIiwKKyAgICAgICAgICAgIG5hbWVGb3JGZChmZCkuY19zdHIoKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsCisgICAgICAgICAgICAobG9uZyBsb25nKSBtTGVuZ3RoKTsKKworfQorCitDbGVhckZpbGVTb3VyY2U6On5DbGVhckZpbGVTb3VyY2UoKSB7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIDo6Y2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQorfQorCitzdGF0dXNfdCBDbGVhckZpbGVTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZkID49IDAgPyBPSyA6IE5PX0lOSVQ7Cit9CisKK3NzaXplX3QgQ2xlYXJGaWxlU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1GZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUxlbmd0aCA+PSAwKSB7CisgICAgICAgIGlmIChvZmZzZXQgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIDA7ICAvLyByZWFkIGJleW9uZCBFT0YuCisgICAgICAgIH0KKyAgICAgICAgdWludDY0X3QgbnVtQXZhaWxhYmxlID0gbUxlbmd0aCAtIG9mZnNldDsKKyAgICAgICAgaWYgKCh1aW50NjRfdClzaXplID4gbnVtQXZhaWxhYmxlKSB7CisgICAgICAgICAgICBzaXplID0gbnVtQXZhaWxhYmxlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOworfQorCitzc2l6ZV90IENsZWFyRmlsZVNvdXJjZTo6cmVhZEF0X2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgb2ZmNjRfdCByZXN1bHQgPSBsc2VlazY0KG1GZCwgb2Zmc2V0ICsgbU9mZnNldCwgU0VFS19TRVQpOworICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoInNlZWsgdG8gJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKShvZmZzZXQgKyBtT2Zmc2V0KSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiA6OnJlYWQobUZkLCBkYXRhLCBzaXplKTsKK30KKworc3RhdHVzX3QgQ2xlYXJGaWxlU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1GZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgKnNpemUgPSBtTGVuZ3RoOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZUJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUJhc2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9EYXRhU291cmNlQmFzZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAppbmRleCBlZWY1MzE0Li5hZWU3ZmQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcApAQCAtMjIsOTAgKzIyLDI4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEZpbGVTb3VyY2U6OkZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCi0gICAgOiBtRmQoLTEpLAotICAgICAgbU9mZnNldCgwKSwKLSAgICAgIG1MZW5ndGgoLTEpLAotICAgICAgbU5hbWUoIjxudWxsPiIpLAorICAgIDogQ2xlYXJGaWxlU291cmNlKGZpbGVuYW1lKSwKICAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCiAgICAgICBtRHJtQnVmT2Zmc2V0KDApLAogICAgICAgbURybUJ1ZlNpemUoMCksCiAgICAgICBtRHJtQnVmKE5VTEwpewotCi0gICAgaWYgKGZpbGVuYW1lKSB7Ci0gICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJGaWxlU291cmNlKCVzKSIsIGZpbGVuYW1lKTsKLSAgICB9Ci0gICAgQUxPR1YoIiVzIiwgZmlsZW5hbWUpOwotICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fTEFSR0VGSUxFIHwgT19SRE9OTFkpOwotCi0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIG1MZW5ndGggPSBsc2VlazY0KG1GZCwgMCwgU0VFS19FTkQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBmaWxlICclcycuICglcykiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9CiB9CiAKIEZpbGVTb3VyY2U6OkZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCi0gICAgOiBtRmQoZmQpLAotICAgICAgbU9mZnNldChvZmZzZXQpLAotICAgICAgbUxlbmd0aChsZW5ndGgpLAotICAgICAgbU5hbWUoIjxudWxsPiIpLAorICAgIDogQ2xlYXJGaWxlU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCksCiAgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAogICAgICAgbURybUJ1Zk9mZnNldCgwKSwKICAgICAgIG1Ecm1CdWZTaXplKDApLAogICAgICAgbURybUJ1ZihOVUxMKSB7Ci0gICAgQUxPR1YoImZkPSVkICglcyksIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsCi0gICAgICAgICAgICBmZCwgbmFtZUZvckZkKGZkKS5jX3N0cigpLCAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCk7Ci0KLSAgICBpZiAobU9mZnNldCA8IDApIHsKLSAgICAgICAgbU9mZnNldCA9IDA7Ci0gICAgfQotICAgIGlmIChtTGVuZ3RoIDwgMCkgewotICAgICAgICBtTGVuZ3RoID0gMDsKLSAgICB9Ci0gICAgaWYgKG1MZW5ndGggPiBJTlQ2NF9NQVggLSBtT2Zmc2V0KSB7Ci0gICAgICAgIG1MZW5ndGggPSBJTlQ2NF9NQVggLSBtT2Zmc2V0OwotICAgIH0KLSAgICBzdHJ1Y3Qgc3RhdCBzOwotICAgIGlmIChmc3RhdChmZCwgJnMpID09IDApIHsKLSAgICAgICAgaWYgKG1PZmZzZXQgPiBzLnN0X3NpemUpIHsKLSAgICAgICAgICAgIG1PZmZzZXQgPSBzLnN0X3NpemU7Ci0gICAgICAgICAgICBtTGVuZ3RoID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobU9mZnNldCArIG1MZW5ndGggPiBzLnN0X3NpemUpIHsKLSAgICAgICAgICAgIG1MZW5ndGggPSBzLnN0X3NpemUgLSBtT2Zmc2V0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtT2Zmc2V0ICE9IG9mZnNldCB8fCBtTGVuZ3RoICE9IGxlbmd0aCkgewotICAgICAgICBBTE9HVygib2Zmc2V0L2xlbmd0aCBhZGp1c3RlZCBmcm9tICVsbGQvJWxsZCB0byAlbGxkLyVsbGQiLAotICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoLAotICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsIChsb25nIGxvbmcpIG1MZW5ndGgpOwotICAgIH0KLQotICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KAotICAgICAgICAgICAgIkZpbGVTb3VyY2UoZmQoJXMpLCAlbGxkLCAlbGxkKSIsCi0gICAgICAgICAgICBuYW1lRm9yRmQoZmQpLmNfc3RyKCksCi0gICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LAotICAgICAgICAgICAgKGxvbmcgbG9uZykgbUxlbmd0aCk7Ci0KIH0KIAogRmlsZVNvdXJjZTo6fkZpbGVTb3VyY2UoKSB7Ci0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIDo6Y2xvc2UobUZkKTsKLSAgICAgICAgbUZkID0gLTE7Ci0gICAgfQotCiAgICAgaWYgKG1Ecm1CdWYgIT0gTlVMTCkgewogICAgICAgICBkZWxldGVbXSBtRHJtQnVmOwogICAgICAgICBtRHJtQnVmID0gTlVMTDsKQEAgLTEyNCwxMCArNjIsNiBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgRmlsZVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtRmQgPj0gMCA/IE9LIDogTk9fSU5JVDsKLX0KLQogc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgaWYgKG1GZCA8IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xNDcsMzAgKzgxLDEyIEBACiAKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCAmJiBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VECiAgICAgICAgICAgICA9PSBtRGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRBdERSTShvZmZzZXQsIGRhdGEsIHNpemUpOworICAgICAgICByZXR1cm4gcmVhZEF0RFJNX2wob2Zmc2V0LCBkYXRhLCBzaXplKTsKICAgIH0gZWxzZSB7Ci0gICAgICAgIG9mZjY0X3QgcmVzdWx0ID0gbHNlZWs2NChtRmQsIG9mZnNldCArIG1PZmZzZXQsIFNFRUtfU0VUKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICAgICAgQUxPR0UoInNlZWsgdG8gJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKShvZmZzZXQgKyBtT2Zmc2V0KSk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiA6OnJlYWQobUZkLCBkYXRhLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHJlYWRBdF9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBGaWxlU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1GZCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgKnNpemUgPSBtTGVuZ3RoOwotCi0gICAgcmV0dXJuIE9LOwotfQotCiBzcDxEZWNyeXB0SGFuZGxlPiBGaWxlU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKSB7CiAgICAgaWYgKGdldHVpZCgpID09IEFJRF9NRURJQV9FWCkgcmV0dXJuIG51bGxwdHI7IC8vIG5vIERSTSBpbiBtZWRpYSBleHRyYWN0b3IKICAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewpAQCAtMTk0LDcgKzExMCw3IEBACiAgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwogfQogCi1zc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdERSTShvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKK3NzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0RFJNX2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgc2l6ZV90IERSTV9DQUNIRV9TSVpFID0gMTAyNDsKICAgICBpZiAobURybUJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgIG1Ecm1CdWYgPSBuZXcgdW5zaWduZWQgY2hhcltEUk1fQ0FDSEVfU0laRV07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAppbmRleCA2MjMxNDU0Li4xOGE2YmQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKQEAgLTUwMSw5ICs1MDEsMTUgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgc3JjRm9ybWF0OworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSB8fAorICAgICAgICAgICAgIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSB8fAorICAgICAgICAgICAgIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmc3RyaWRlKSB8fAorICAgICAgICAgICAgIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSkgeworICAgICAgICBBTE9HRSgiZm9ybWF0IG1pc3NpbmcgZGltZW5zaW9uIG9yIGNvbG9yOiAlcyIsCisgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KIAogICAgIGludDMyX3QgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b207CiAgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRSZWN0KCJjcm9wIiwgJmNyb3BfbGVmdCwgJmNyb3BfdG9wLCAmY3JvcF9yaWdodCwgJmNyb3BfYm90dG9tKSkgewpAQCAtNTIyLDE5ICs1MjgsMjcgQEAKICAgICBhZGRGcmFtZShmcmFtZU1lbSk7CiAgICAgVmlkZW9GcmFtZSogZnJhbWUgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4oZnJhbWVNZW0tPnBvaW50ZXIoKSk7CiAKLSAgICBpbnQzMl90IHNyY0Zvcm1hdDsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpOwotCiAgICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKChPTVhfQ09MT1JfRk9STUFUVFlQRSlzcmNGb3JtYXQsIGRzdEZvcm1hdCgpKTsKIAorICAgIHVpbnQzMl90IHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXI7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCAoaW50MzJfdCopJnN0YW5kYXJkKSkgeworICAgICAgICBzdGFuZGFyZCA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgKGludDMyX3QqKSZyYW5nZSkpIHsKKyAgICAgICAgcmFuZ2UgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci10cmFuc2ZlciIsIChpbnQzMl90KikmdHJhbnNmZXIpKSB7CisgICAgICAgIHRyYW5zZmVyID0gMDsKKyAgICB9CisgICAgY29udmVydGVyLnNldFNyY0NvbG9yU3BhY2Uoc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2Zlcik7CisKICAgICBpZiAoY29udmVydGVyLmlzVmFsaWQoKSkgewogICAgICAgICBjb252ZXJ0ZXIuY29udmVydCgKICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKXZpZGVvRnJhbWVCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwKICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSwKICAgICAgICAgICAgICAgICBmcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAotICAgICAgICAgICAgICAgIGZyYW1lLT5tV2lkdGgsCi0gICAgICAgICAgICAgICAgZnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwgZnJhbWUtPm1IZWlnaHQsIGZyYW1lLT5tUm93Qnl0ZXMsCiAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpAQCAtNjgxLDkgKzY5NSwxMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZTsKICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmc3RyaWRlKSk7CiAKICAgICBpZiAobUZyYW1lID09IE5VTEwpIHsKICAgICAgICAgc3A8SU1lbW9yeT4gZnJhbWVNZW0gPSBhbGxvY1ZpZGVvRnJhbWUoCkBAIC02OTgsNiArNzEzLDE4IEBACiAKICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOwogCisgICAgdWludDMyX3Qgc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2ZlcjsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1zdGFuZGFyZCIsIChpbnQzMl90Kikmc3RhbmRhcmQpKSB7CisgICAgICAgIHN0YW5kYXJkID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItcmFuZ2UiLCAoaW50MzJfdCopJnJhbmdlKSkgeworICAgICAgICByYW5nZSA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyIiwgKGludDMyX3QqKSZ0cmFuc2ZlcikpIHsKKyAgICAgICAgdHJhbnNmZXIgPSAwOworICAgIH0KKyAgICBjb252ZXJ0ZXIuc2V0U3JjQ29sb3JTcGFjZShzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyKTsKKwogICAgIGludDMyX3QgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tOwogICAgIGRzdExlZnQgPSBtVGlsZXNEZWNvZGVkICUgbUdyaWRDb2xzICogd2lkdGg7CiAgICAgZHN0VG9wID0gbVRpbGVzRGVjb2RlZCAvIG1HcmlkQ29scyAqIGhlaWdodDsKQEAgLTcyNywxMSArNzU0LDEwIEBACiAgICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKICAgICAgICAgY29udmVydGVyLmNvbnZlcnQoCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCiAgICAgICAgICAgICAgICAgbUZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCi0gICAgICAgICAgICAgICAgbUZyYW1lLT5tV2lkdGgsCi0gICAgICAgICAgICAgICAgbUZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgICAgIG1GcmFtZS0+bVdpZHRoLCBtRnJhbWUtPm1IZWlnaHQsIG1GcmFtZS0+bVJvd0J5dGVzLAogICAgICAgICAgICAgICAgIGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbSk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKaW5kZXggMGYyNDMyOS4uZDExOGU4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcApAQCAtMjYsOCArMjYsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3F0YWd1aWQuaD4KIAotI2luY2x1ZGUgPE5ldGRDbGllbnQuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBIVFRQQmFzZTo6SFRUUEJhc2UoKQpAQCAtMTE0LDMwICsxMTIsNCBAQAogICAgIG1NYXhCYW5kd2lkdGhIaXN0b3J5SXRlbXMgPSBudW1IaXN0b3J5SXRlbXM7CiB9CiAKLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZykgewotICAgIGludCByZXMgPSBxdGFndWlkX3RhZ1NvY2tldChzb2NrZmQsIGtUYWcsIHVpZCk7Ci0gICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdGFnZ2luZyBzb2NrZXQgJWQgZm9yIHVpZCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgdWlkLCBnZXRldWlkKCkpOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkKSB7Ci0gICAgaW50IHJlcyA9IHF0YWd1aWRfdW50YWdTb2NrZXQoc29ja2ZkKTsKLSAgICBpZiAocmVzICE9IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB1bnRhZ2dpbmcgc29ja2V0ICVkIChNeSBVSUQ9JWQpIiwgc29ja2ZkLCBnZXRldWlkKCkpOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCkgewotICAgIHNldE5ldHdvcmtGb3JVc2VyKHVpZCwgc29ja2ZkKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCkgewotICAgIFJlZ2lzdGVyU29ja2V0VXNlck1hcmsoc29ja2ZkLCBnZXRldWlkKCkpOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKaW5kZXggZjE1MmEzOC4uNDgyYTFhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCkBAIC0zMTIsMTQgKzMxMiwyMyBAQAogICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG51bVBpY3M7ICsraikgewogICAgICAgICAgICAgICAgIHNraXBVRSgmcmVhZGVyKTsgLy8gZGVsdGFfcG9jX3MwfDFfbWludXMxW2ldCiAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBCaXRzKDEpOyAvLyB1c2VkX2J5X2N1cnJfcGljX3MwfDFfZmxhZ1tpXQorICAgICAgICAgICAgICAgIGlmIChyZWFkZXIub3ZlclJlYWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAocmVhZGVyLm92ZXJSZWFkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlYWRlci5nZXRCaXRzV2l0aEZhbGxiYWNrKDEsIDApKSB7IC8vIGxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcKICAgICAgICAgdWludDMyX3QgbnVtTG9uZ1Rlcm1SZWZQaWNTcHMgPSBwYXJzZVVFV2l0aEZhbGxiYWNrKCZyZWFkZXIsIDApOwogICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtTG9uZ1Rlcm1SZWZQaWNTcHM7ICsraSkgewogICAgICAgICAgICAgcmVhZGVyLnNraXBCaXRzKGxvZzJNYXhQaWNPcmRlckNudExzYik7IC8vIGx0X3JlZl9waWNfcG9jX2xzYl9zcHNbaV0KICAgICAgICAgICAgIHJlYWRlci5za2lwQml0cygxKTsgLy8gdXNlZF9ieV9jdXJyX3BpY19sdF9zcHNfZmxhZ1tpXQorICAgICAgICAgICAgaWYgKHJlYWRlci5vdmVyUmVhZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZWFkZXIuc2tpcEJpdHMoMSk7IC8vIHNwc190ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnCkBAIC00NTcsOCArNDY2LDggQEAKICAgICAgICAgaWYgKG51bU5hbHVzID09IDApIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIC8vIGFycmF5X2NvbXBsZXRlbmVzcyBzZXQgdG8gMC4KLSAgICAgICAgaGVhZGVyWzBdID0gdHlwZTsKKyAgICAgICAgLy8gYXJyYXlfY29tcGxldGVuZXNzIHNldCB0byAxLgorICAgICAgICBoZWFkZXJbMF0gPSB0eXBlIHwgMHg4MDsKICAgICAgICAgaGVhZGVyWzFdID0gKG51bU5hbHVzID4+IDgpICYgMHhmZjsKICAgICAgICAgaGVhZGVyWzJdID0gbnVtTmFsdXMgJiAweGZmOwogICAgICAgICBoZWFkZXIgKz0gMzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAppbmRleCBkOWM0ZTA1Li5hNTJkYTQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCkBAIC04NSw3ICs4NSw3IEBACiBzdGF0aWMgY29uc3QgaW50IGtUaW1lc3RhbXBEZWJ1Z0NvdW50ID0gMTA7CiBzdGF0aWMgY29uc3QgaW50IGtJdGVtSWRCYXNlID0gMTAwMDA7CiBzdGF0aWMgY29uc3QgY2hhciBrRXhpZkhlYWRlcltdID0geydFJywgJ3gnLCAnaScsICdmJywgJ1wwJywgJ1wwJ307Ci1zdGF0aWMgY29uc3QgaW50MzJfdCBrVGlmZkhlYWRlck9mZnNldCA9IGh0b25sKHNpemVvZihrRXhpZkhlYWRlcikpOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0V4aWZBcHAxTWFya2VyW10gPSB7J0UnLCAneCcsICdpJywgJ2YnLCAweGZmLCAweGUxfTsKIAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01hbmRhdG9yeUhldmNOYWxVbml0VHlwZXNbM10gPSB7CiAgICAga0hldmNOYWxVbml0VHlwZVZwcywKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIGJvb2wgaXNBdWRpbygpIGNvbnN0IHsgcmV0dXJuIG1Jc0F1ZGlvOyB9CiAgICAgYm9vbCBpc01QRUc0KCkgY29uc3QgeyByZXR1cm4gbUlzTVBFRzQ7IH0KICAgICBib29sIHVzZVByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0F2YyB8fCBtSXNIZXZjIHx8IG1Jc0hlaWM7IH0KLSAgICBib29sIGlzRXhpZkRhdGEoY29uc3QgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0OworICAgIGJvb2wgaXNFeGlmRGF0YShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDMyX3QgKnRpZmZIZHJPZmZzZXQpIGNvbnN0OwogICAgIHZvaWQgYWRkQ2h1bmtPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwogICAgIHZvaWQgYWRkSXRlbU9mZnNldEFuZFNpemUob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGlzRXhpZik7CiAgICAgdm9pZCBmbHVzaEl0ZW1SZWZzKCk7CkBAIC0xMzcsNiArMTM3LDggQEAKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKKyAgICAgICAgLy8gVE9ETzogbmVlZCB0byBpbmNyZWFzZSB0aGlzIGNvbnNpZGVyaW5nIHRoZSBidWcKKyAgICAgICAgLy8gYWJvdXQgY2FtZXJhIGFwcCBub3Qgc2VuZGluZyB2aWRlbyBmcmFtZXMgY29udGludW91c2x5PwogICAgICAgICBrTWF4Q3R0c09mZnNldFRpbWVVcyA9IDEwMDAwMDBMTCwgIC8vIDEgc2Vjb25kCiAgICAgICAgIGtTYW1wbGVBcnJheVNpemUgPSAxMDAwLAogICAgIH07CkBAIC0zMTcsNiArMzE5LDcgQEAKICAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPiAqbVN0c3NUYWJsZUVudHJpZXM7CiAgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4gKm1TdHRzVGFibGVFbnRyaWVzOwogICAgIExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+ICptQ3R0c1RhYmxlRW50cmllczsKKyAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPiAqbUVsc3RUYWJsZUVudHJpZXM7IC8vIDNjb2x1bW5zOiBzZWdEdXJhdGlvbiwgbWVkaWFUaW1lLCBtZWRpYVJhdGUKIAogICAgIGludDY0X3QgbU1pbkN0dHNPZmZzZXRUaW1lVXM7CiAgICAgaW50NjRfdCBtTWluQ3R0c09mZnNldFRpY2tzOwpAQCAtMzYxLDcgKzM2NCw3IEBACiAKICAgICBWZWN0b3I8dWludDE2X3Q+IG1Qcm9wZXJ0aWVzOwogICAgIEl0ZW1SZWZzIG1EaW1nUmVmczsKLSAgICBJdGVtUmVmcyBtQ2RzY1JlZnM7CisgICAgVmVjdG9yPHVpbnQxNl90PiBtRXhpZkxpc3Q7CiAgICAgdWludDE2X3QgbUltYWdlSXRlbUlkOwogICAgIGludDMyX3QgbUlzUHJpbWFyeTsKICAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKQEAgLTQxNiw2ICs0MTksOCBAQAogICAgIC8vIER1cmF0aW9uIGlzIHRpbWUgc2NhbGUgYmFzZWQKICAgICB2b2lkIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNpemVfdCBzYW1wbGVDb3VudCwgaW50MzJfdCB0aW1lc2NhbGVkRHVyKTsKICAgICB2b2lkIGFkZE9uZUN0dHNUYWJsZUVudHJ5KHNpemVfdCBzYW1wbGVDb3VudCwgaW50MzJfdCB0aW1lc2NhbGVkRHVyKTsKKyAgICB2b2lkIGFkZE9uZUVsc3RUYWJsZUVudHJ5KHVpbnQzMl90IHNlZ21lbnREdXJhdGlvbiwgaW50MzJfdCBtZWRpYVRpbWUsCisgICAgICAgIGludDE2X3QgbWVkaWFSYXRlLCBpbnQxNl90IG1lZGlhUmF0ZUZyYWN0aW9uKTsKIAogICAgIGJvb2wgaXNUcmFja01hbEZvcm1lZCgpIGNvbnN0OwogICAgIHZvaWQgc2VuZFRyYWNrU3VtbWFyeShib29sIGhhc011bHRpcGxlVHJhY2tzKTsKQEAgLTQ0OCwxMyArNDUzLDE0IEBACiAgICAgdm9pZCB3cml0ZVZpZGVvRm91ckNDQm94KCk7CiAgICAgdm9pZCB3cml0ZU1ldGFkYXRhRm91ckNDQm94KCk7CiAgICAgdm9pZCB3cml0ZVN0YmxCb3goYm9vbCB1c2UzMkJpdE9mZnNldCk7CisgICAgdm9pZCB3cml0ZUVkdHNCb3goKTsKIAogICAgIFRyYWNrKGNvbnN0IFRyYWNrICYpOwogICAgIFRyYWNrICZvcGVyYXRvcj0oY29uc3QgVHJhY2sgJik7CiB9OwogCiBNUEVHNFdyaXRlcjo6TVBFRzRXcml0ZXIoaW50IGZkKSB7Ci0gICAgaW5pdEludGVybmFsKGZkLCB0cnVlIC8qaXNGaXJzdFNlc3Npb24qLyk7CisgICAgaW5pdEludGVybmFsKGR1cChmZCksIHRydWUgLyppc0ZpcnN0U2Vzc2lvbiovKTsKIH0KIAogTVBFRzRXcml0ZXI6On5NUEVHNFdyaXRlcigpIHsKQEAgLTQ3NSw3ICs0ODEsNyBAQAogCiB2b2lkIE1QRUc0V3JpdGVyOjppbml0SW50ZXJuYWwoaW50IGZkLCBib29sIGlzRmlyc3RTZXNzaW9uKSB7CiAgICAgQUxPR1YoImluaXRJbnRlcm5hbCIpOwotICAgIG1GZCA9IGR1cChmZCk7CisgICAgbUZkID0gZmQ7CiAgICAgbU5leHRGZCA9IC0xOwogICAgIG1Jbml0Q2hlY2sgPSBtRmQgPCAwPyBOT19JTklUOiBPSzsKIApAQCAtNDgzLDYgKzQ4OSw3IEBACiAKICAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IC0xTEw7CiAgICAgbVN0YXJ0VGltZU9mZnNldE1zID0gLTE7CisgICAgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyA9IDA7CiAgICAgbVBhdXNlZCA9IGZhbHNlOwogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbVdyaXRlclRocmVhZFN0YXJ0ZWQgPSBmYWxzZTsKQEAgLTEwMzcsNiArMTA0NCwxMCBAQAogdm9pZCBNUEVHNFdyaXRlcjo6cmVsZWFzZSgpIHsKICAgICBjbG9zZShtRmQpOwogICAgIG1GZCA9IC0xOworICAgIGlmIChtTmV4dEZkICE9IC0xKSB7CisgICAgICAgIGNsb3NlKG1OZXh0RmQpOworICAgICAgICBtTmV4dEZkID0gLTE7CisgICAgfQogICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgZnJlZShtSW5NZW1vcnlDYWNoZSk7CkBAIC0xMjcyLDYgKzEyODMsMTAgQEAKICAgICAvLyBBZGp1c3QgdGhlIGdsb2JhbCBzdGFydCB0aW1lLgogICAgIG1TdGFydFRpbWVzdGFtcFVzICs9IG1pbkN0dHNPZmZzZXRUaW1lVXMgLSBrTWF4Q3R0c09mZnNldFRpbWVVczsKIAorICAgIC8vIEFkZCBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKC12ZSBvciB6ZXJvKSB0byB0aGUgZHVyYXRpb24gb2YgZmlyc3QgZW50cnkgaW4gU1RUUy4KKyAgICBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzID0gbWluQ3R0c09mZnNldFRpbWVVcyAtIGtNYXhDdHRzT2Zmc2V0VGltZVVzOworICAgIEFMT0dWKCJtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzIDolIiBQUklkMzIsIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMpOworCiAgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgewogICAgICAgICBpZiAoISgqaXQpLT5pc0hlaWMoKSkgewpAQCAtMTM1NywxNCArMTM3MiwxNiBAQAogfQogCiBvZmY2NF90IE1QRUc0V3JpdGVyOjphZGRTYW1wbGVfbCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciwgYm9vbCB1c2VQcmVmaXgsIGJvb2wgaXNFeGlmLCBzaXplX3QgKmJ5dGVzV3JpdHRlbikgeworICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwKKyAgICAgICAgdWludDMyX3QgdGlmZkhkck9mZnNldCwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pIHsKICAgICBvZmY2NF90IG9sZF9vZmZzZXQgPSBtT2Zmc2V0OwogCiAgICAgaWYgKHVzZVByZWZpeCkgewogICAgICAgICBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKGJ1ZmZlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGlzRXhpZikgewotICAgICAgICAgICAgOjp3cml0ZShtRmQsICZrVGlmZkhlYWRlck9mZnNldCwgNCk7IC8vIGV4aWZfdGlmZl9oZWFkZXJfb2Zmc2V0IGZpZWxkCisgICAgICAgIGlmICh0aWZmSGRyT2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgdGlmZkhkck9mZnNldCA9IGh0b25sKHRpZmZIZHJPZmZzZXQpOworICAgICAgICAgICAgOjp3cml0ZShtRmQsICZ0aWZmSGRyT2Zmc2V0LCA0KTsgLy8gZXhpZl90aWZmX2hlYWRlcl9vZmZzZXQgZmllbGQKICAgICAgICAgICAgIG1PZmZzZXQgKz0gNDsKICAgICAgICAgfQogCkBAIC0xNzQ3LDYgKzE3NjQsMTEgQEAKICAgICByZXR1cm4gbVN0YXJ0VGltZXN0YW1wVXM7CiB9CiAKK2ludDMyX3QgTVBFRzRXcml0ZXI6OmdldFN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzOworfQorCiBzaXplX3QgTVBFRzRXcml0ZXI6Om51bVRyYWNrcygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwogICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKQEAgLTE3NzYsNiArMTc5OCw3IEBACiAgICAgICBtU3Rzc1RhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCkpLAogICAgICAgbVN0dHNUYWJsZUVudHJpZXMobmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApKSwKICAgICAgIG1DdHRzVGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKSksCisgICAgICBtRWxzdFRhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMykpLCAvLyBSZXNlcnZlIDMgcm93cywgYSByb3cgaGFzIDMgaXRlbXMKICAgICAgIG1NaW5DdHRzT2Zmc2V0VGltZVVzKDApLAogICAgICAgbU1pbkN0dHNPZmZzZXRUaWNrcygwKSwKICAgICAgIG1NYXhDdHRzT2Zmc2V0VGlja3MoMCksCkBAIC0xNzg2LDcgKzE4MDksNiBAQAogICAgICAgbVN0YXJ0VGltZXN0YW1wVXMoLTEpLAogICAgICAgbVJvdGF0aW9uKDApLAogICAgICAgbURpbWdSZWZzKCJkaW1nIiksCi0gICAgICBtQ2RzY1JlZnMoImNkc2MiKSwKICAgICAgIG1JbWFnZUl0ZW1JZCgwKSwKICAgICAgIG1Jc1ByaW1hcnkoMCksCiAgICAgICBtV2lkdGgoMCksCkBAIC0xODQyLDQ2ICsxODY0LDQ4IEBACiAKIC8vIENsZWFyIGFsbCB0aGUgaW50ZXJuYWwgc3RhdGVzIGV4Y2VwdCB0aGUgQ1NEIGRhdGEuCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6cmVzZXRJbnRlcm5hbCgpIHsKLSAgICAgIG1Eb25lID0gZmFsc2U7Ci0gICAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgICBtUmVzdW1lZCA9IGZhbHNlOwotICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgIG1Hb3RTdGFydEtleUZyYW1lID0gZmFsc2U7Ci0gICAgICBtSXNNYWxmb3JtZWQgPSBmYWxzZTsKLSAgICAgIG1UcmFja0R1cmF0aW9uVXMgPSAwOwotICAgICAgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzID0gMDsKLSAgICAgIG1TYW1wbGVzSGF2ZVNhbWVTaXplID0gMDsKLSAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0c3pUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3RzelRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1TdGNvVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3Rjb1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdGNvVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1DbzY0VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtQ282NFRhYmxlRW50cmllczsKLSAgICAgICAgIG1DbzY0VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8b2ZmNjRfdCwgMT4oMTAwMCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtU3RzY1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0c2NUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3RzY1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtU3Rzc1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0c3NUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3Rzc1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtU3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0dHNUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3R0c1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtQ3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbUN0dHNUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtQ3R0c1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgbURvbmUgPSBmYWxzZTsKKyAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1Hb3RTdGFydEtleUZyYW1lID0gZmFsc2U7CisgICAgbUlzTWFsZm9ybWVkID0gZmFsc2U7CisgICAgbVRyYWNrRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzID0gMDsKKyAgICBtU2FtcGxlc0hhdmVTYW1lU2l6ZSA9IDA7CisgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdHN6VGFibGVFbnRyaWVzOworICAgICAgICBtU3RzelRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1TdGNvVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdGNvVGFibGVFbnRyaWVzOworICAgICAgICBtU3Rjb1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1DbzY0VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1DbzY0VGFibGVFbnRyaWVzOworICAgICAgICBtQ282NFRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPG9mZjY0X3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0c2NUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0c2NUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHNjVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0c3NUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0c3NUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHNzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0dHNUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0dHNUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOworICAgIH0KKyAgICBpZiAobUN0dHNUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUN0dHNUYWJsZUVudHJpZXM7CisgICAgICAgIG1DdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOworICAgIH0KKyAgICBpZiAobUVsc3RUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUVsc3RUYWJsZUVudHJpZXM7CisgICAgICAgIG1FbHN0VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDMpOworICAgIH0KKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6dXBkYXRlVHJhY2tTaXplRXN0aW1hdGUoKSB7CkBAIC0xOTAwLDYgKzE5MjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0c3NUYWJsZUVudHJpZXMtPmNvdW50KCkgKiA0ICsgICAvLyBzdHNzIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3R0c1RhYmxlRW50cmllcy0+Y291bnQoKSAqIDggKyAgIC8vIHN0dHMgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdHRzVGFibGVFbnRyaWVzLT5jb3VudCgpICogOCArICAgLy8gY3R0cyBib3ggc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMtPmNvdW50KCkgKiAxMiArICAgLy8gZWxzdCBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rjb0JveFNpemVCeXRlcyArICAgICAgICAgICAvLyBzdGNvIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHN6Qm94U2l6ZUJ5dGVzOyAgICAgICAgICAgIC8vIHN0c3ogYm94IHNpemUKICAgICB9CkBAIC0xOTM2LDYgKzE5NjEsMTYgQEAKICAgICBtQ3R0c1RhYmxlRW50cmllcy0+YWRkKGh0b25sKGR1cmF0aW9uKSk7CiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRPbmVFbHN0VGFibGVFbnRyeSgKKyAgICB1aW50MzJfdCBzZWdtZW50RHVyYXRpb24sIGludDMyX3QgbWVkaWFUaW1lLCBpbnQxNl90IG1lZGlhUmF0ZSwgaW50MTZfdCBtZWRpYVJhdGVGcmFjdGlvbikgeworICAgIEFMT0dWKCJzZWdtZW50RHVyYXRpb246JXUsIG1lZGlhVGltZTolZCIsIHNlZ21lbnREdXJhdGlvbiwgbWVkaWFUaW1lKTsKKyAgICBBTE9HVigibWVkaWFSYXRlIDolIiBQUklkMTYgIiwgbWVkaWFSYXRlRnJhY3Rpb24gOiUiIFBSSWQxNiAiLCBPcmVkICV1IiwgbWVkaWFSYXRlLAorICAgICAgICBtZWRpYVJhdGVGcmFjdGlvbiwgKCgoKHVpbnQzMl90KW1lZGlhUmF0ZSkgPDwgMTYpIHwgKCh1aW50MzJfdCltZWRpYVJhdGVGcmFjdGlvbikpKTsKKyAgICBtRWxzdFRhYmxlRW50cmllcy0+YWRkKGh0b25sKHNlZ21lbnREdXJhdGlvbikpOworICAgIG1FbHN0VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwobWVkaWFUaW1lKSk7CisgICAgbUVsc3RUYWJsZUVudHJpZXMtPmFkZChodG9ubCgoKCh1aW50MzJfdCltZWRpYVJhdGUpIDw8IDE2KSB8ICh1aW50MzJfdCltZWRpYVJhdGVGcmFjdGlvbikpOworfQorCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c2V0TmV4dEZkKGludCBmZCkgewogICAgIEFMT0dWKCJhZGROZXh0RmQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0xOTUwLDE1ICsxOTg1LDM4IEBACiAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IGEgbmV3IEZEIHlldC4KICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBtTmV4dEZkID0gZmQ7CisgICAgbU5leHRGZCA9IGR1cChmZCk7CiAgICAgcmV0dXJuIE9LOwogfQogCi1ib29sIE1QRUc0V3JpdGVyOjpUcmFjazo6aXNFeGlmRGF0YShjb25zdCBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgY29uc3QgewotICAgIHJldHVybiBtSXNIZWljCi0gICAgICAgICAgICAmJiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IHNpemVvZihrRXhpZkhlYWRlcikpCi0gICAgICAgICAgICAmJiAhbWVtY21wKCh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICBrRXhpZkhlYWRlciwgc2l6ZW9mKGtFeGlmSGVhZGVyKSk7Citib29sIE1QRUc0V3JpdGVyOjpUcmFjazo6aXNFeGlmRGF0YSgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQzMl90ICp0aWZmSGRyT2Zmc2V0KSBjb25zdCB7CisgICAgaWYgKCFtSXNIZWljKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBFeGlmIGJsb2NrIHN0YXJ0aW5nIHdpdGggJ0V4aWZcMFwwJworICAgIHNpemVfdCBsZW5ndGggPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBpZiAoKGxlbmd0aCA+IHNpemVvZihrRXhpZkhlYWRlcikpCisgICAgICAgICYmICFtZW1jbXAoZGF0YSwga0V4aWZIZWFkZXIsIHNpemVvZihrRXhpZkhlYWRlcikpKSB7CisgICAgICAgICp0aWZmSGRyT2Zmc2V0ID0gc2l6ZW9mKGtFeGlmSGVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRXhpZiBibG9jayBzdGFydGluZyB3aXRoIGZvdXJjYyAnRXhpZicgZm9sbG93ZWQgYnkgQVBQMSBtYXJrZXIKKyAgICBpZiAoKGxlbmd0aCA+IHNpemVvZihrRXhpZkFwcDFNYXJrZXIpICsgMiArIHNpemVvZihrRXhpZkhlYWRlcikpCisgICAgICAgICAgICAmJiAhbWVtY21wKGRhdGEsIGtFeGlmQXBwMU1hcmtlciwgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikpCisgICAgICAgICAgICAmJiAhbWVtY21wKGRhdGEgKyBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSArIDIsIGtFeGlmSGVhZGVyLCBzaXplb2Yoa0V4aWZIZWFkZXIpKSkgeworICAgICAgICAvLyBza2lwICdFeGlmJyBmb3VyY2MKKyAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoNCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIDQpOworCisgICAgICAgIC8vIDItYnl0ZSBBUFAxICsgMi1ieXRlIHNpemUgZm9sbG93ZWQgYnkga0V4aWZIZWFkZXIKKyAgICAgICAgKnRpZmZIZHJPZmZzZXQgPSAyICsgMiArIHNpemVvZihrRXhpZkhlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CkBAIC0xOTg0LDcgKzIwNDIsNyBAQAogICAgIH0KIAogICAgIGlmIChpc0V4aWYpIHsKLSAgICAgICAgIG1DZHNjUmVmcy52YWx1ZS5wdXNoX2JhY2sobU93bmVyLT5hZGRJdGVtX2woeworICAgICAgICAgbUV4aWZMaXN0LnB1c2hfYmFjayhtT3duZXItPmFkZEl0ZW1fbCh7CiAgICAgICAgICAgICAuaXRlbVR5cGUgPSAiRXhpZiIsCiAgICAgICAgICAgICAuaXNQcmltYXJ5ID0gZmFsc2UsCiAgICAgICAgICAgICAuaXNIaWRkZW4gPSBmYWxzZSwKQEAgLTIwODcsNyArMjE0NSwxNiBAQAogCiAgICAgaWYgKG1JbWFnZUl0ZW1JZCA+IDApIHsKICAgICAgICAgbU93bmVyLT5hZGRSZWZzX2wobUltYWdlSXRlbUlkLCBtRGltZ1JlZnMpOwotICAgICAgICBtT3duZXItPmFkZFJlZnNfbChtSW1hZ2VJdGVtSWQsIG1DZHNjUmVmcyk7CisKKyAgICAgICAgaWYgKCFtRXhpZkxpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gVGhlICJjZHNjIiByZWYgaXMgZnJvbSB0aGUgbWV0YWRhdGEvZXhpZiBpdGVtIHRvIHRoZSBpbWFnZSBpdGVtLgorICAgICAgICAgICAgLy8gU28gdGhlIHJlZnMgYWxsIGNvbnRhaW4gdGhlIGltYWdlIGl0ZW0uCisgICAgICAgICAgICBJdGVtUmVmcyBjZHNjUmVmcygiY2RzYyIpOworICAgICAgICAgICAgY2RzY1JlZnMudmFsdWUucHVzaF9iYWNrKG1JbWFnZUl0ZW1JZCk7CisgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGV4aWZJdGVtIDogbUV4aWZMaXN0KSB7CisgICAgICAgICAgICAgICAgbU93bmVyLT5hZGRSZWZzX2woZXhpZkl0ZW0sIGNkc2NSZWZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMjExNywxMSArMjE4NCwxMSBAQAogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFN3aXRjaDoKICAgICAgICAgewotICAgICAgICAgICAgZmluaXNoQ3VycmVudFNlc3Npb24oKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIGludCBmZCA9IG1OZXh0RmQ7CiAgICAgICAgICAgICBtTmV4dEZkID0gLTE7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGZpbmlzaEN1cnJlbnRTZXNzaW9uKCk7CiAgICAgICAgICAgICBpbml0SW50ZXJuYWwoZmQsIGZhbHNlIC8qaXNGaXJzdFNlc3Npb24qLyk7CiAgICAgICAgICAgICBzdGFydChtU3RhcnRNZXRhLmdldCgpKTsKICAgICAgICAgICAgIG1Td2l0Y2hQZW5kaW5nID0gZmFsc2U7CkBAIC0yMTczLDYgKzIyNDAsNyBAQAogICAgIGRlbGV0ZSBtU3R0c1RhYmxlRW50cmllczsKICAgICBkZWxldGUgbVN0c3NUYWJsZUVudHJpZXM7CiAgICAgZGVsZXRlIG1DdHRzVGFibGVFbnRyaWVzOworICAgIGRlbGV0ZSBtRWxzdFRhYmxlRW50cmllczsKIAogICAgIG1TdHN6VGFibGVFbnRyaWVzID0gTlVMTDsKICAgICBtU3Rjb1RhYmxlRW50cmllcyA9IE5VTEw7CkBAIC0yMTgxLDYgKzIyNDksNyBAQAogICAgIG1TdHRzVGFibGVFbnRyaWVzID0gTlVMTDsKICAgICBtU3Rzc1RhYmxlRW50cmllcyA9IE5VTEw7CiAgICAgbUN0dHNUYWJsZUVudHJpZXMgPSBOVUxMOworICAgIG1FbHN0VGFibGVFbnRyaWVzID0gTlVMTDsKIAogICAgIGlmIChtQ29kZWNTcGVjaWZpY0RhdGEgIT0gTlVMTCkgewogICAgICAgICBmcmVlKG1Db2RlY1NwZWNpZmljRGF0YSk7CkBAIC0yMjM3LDE0ICsyMzA2LDE2IEBACiAgICAgd2hpbGUgKCFjaHVuay0+bVNhbXBsZXMuZW1wdHkoKSkgewogICAgICAgICBMaXN0PE1lZGlhQnVmZmVyICo+OjppdGVyYXRvciBpdCA9IGNodW5rLT5tU2FtcGxlcy5iZWdpbigpOwogCi0gICAgICAgIGludDMyX3QgaXNFeGlmOwotICAgICAgICBpZiAoISgqaXQpLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleUlzRXhpZiwgJmlzRXhpZikpIHsKLSAgICAgICAgICAgIGlzRXhpZiA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQ7CisgICAgICAgIGlmICghKCppdCktPm1ldGFfZGF0YSgpLmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICBrS2V5RXhpZlRpZmZPZmZzZXQsIChpbnQzMl90KikmdGlmZkhkck9mZnNldCkpIHsKKyAgICAgICAgICAgIHRpZmZIZHJPZmZzZXQgPSAwOwogICAgICAgICB9CisgICAgICAgIGJvb2wgaXNFeGlmID0gKHRpZmZIZHJPZmZzZXQgPiAwKTsKICAgICAgICAgYm9vbCB1c2VQcmVmaXggPSBjaHVuay0+bVRyYWNrLT51c2VQcmVmaXgoKSAmJiAhaXNFeGlmOwogCiAgICAgICAgIHNpemVfdCBieXRlc1dyaXR0ZW47Ci0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gYWRkU2FtcGxlX2woKml0LCB1c2VQcmVmaXgsIGlzRXhpZiwgJmJ5dGVzV3JpdHRlbik7CisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gYWRkU2FtcGxlX2woKml0LCB1c2VQcmVmaXgsIHRpZmZIZHJPZmZzZXQsICZieXRlc1dyaXR0ZW4pOwogCiAgICAgICAgIGlmIChjaHVuay0+bVRyYWNrLT5pc0hlaWMoKSkgewogICAgICAgICAgICAgY2h1bmstPm1UcmFjay0+YWRkSXRlbU9mZnNldEFuZFNpemUob2Zmc2V0LCBieXRlc1dyaXR0ZW4sIGlzRXhpZik7CkBAIC0yOTcwLDEwICszMDQxLDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBib29sIGlzRXhpZiA9IGZhbHNlOworICAgICAgICB1aW50MzJfdCB0aWZmSGRyT2Zmc2V0ID0gMDsKICAgICAgICAgaW50MzJfdCBpc011eGVyRGF0YTsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc011eGVyRGF0YSwgJmlzTXV4ZXJEYXRhKSAmJiBpc011eGVyRGF0YSkgewogICAgICAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IG9uZSB0eXBlIG9mIG11eGVyIGRhdGEsIHdoaWNoIGlzIEV4aWYgZGF0YSBibG9jay4KLSAgICAgICAgICAgIGlzRXhpZiA9IGlzRXhpZkRhdGEoYnVmZmVyKTsKKyAgICAgICAgICAgIGlzRXhpZiA9IGlzRXhpZkRhdGEoYnVmZmVyLCAmdGlmZkhkck9mZnNldCk7CiAgICAgICAgICAgICBpZiAoIWlzRXhpZikgewogICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyBiYWQgRXhpZiBkYXRhIGJsb2NrIik7CiAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0yOTk1LDcgKzMwNjcsNyBAQAogICAgICAgICBidWZmZXIgPSBOVUxMOwogCiAgICAgICAgIGlmIChpc0V4aWYpIHsKLSAgICAgICAgICAgIGNvcHktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc0V4aWYsIDEpOworICAgICAgICAgICAgY29weS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUV4aWZUaWZmT2Zmc2V0LCB0aWZmSGRyT2Zmc2V0KTsKICAgICAgICAgfQogICAgICAgICBib29sIHVzZVByZWZpeCA9IHRoaXMtPnVzZVByZWZpeCgpICYmICFpc0V4aWY7CiAKQEAgLTMwNjAsOCArMzEzMiw4IEBACiAgICAgICAgIGlmICghbUlzSGVpYykgewogICAgICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDApIHsKICAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBtT3duZXItPnNldFN0YXJ0VGltZXN0YW1wVXModGltZXN0YW1wVXMpOwogICAgICAgICAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT5zZXRTdGFydFRpbWVzdGFtcFVzKG1TdGFydFRpbWVzdGFtcFVzKTsKICAgICAgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSBtU3RhcnRUaW1lc3RhbXBVczsKICAgICAgICAgICAgIH0KIApAQCAtMzI2OCw3ICszMzQwLDggQEAKICAgICAgICAgfQogICAgICAgICBpZiAoIWhhc011bHRpcGxlVHJhY2tzKSB7CiAgICAgICAgICAgICBzaXplX3QgYnl0ZXNXcml0dGVuOwotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtT3duZXItPmFkZFNhbXBsZV9sKGNvcHksIHVzZVByZWZpeCwgaXNFeGlmLCAmYnl0ZXNXcml0dGVuKTsKKyAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbU93bmVyLT5hZGRTYW1wbGVfbCgKKyAgICAgICAgICAgICAgICAgICAgY29weSwgdXNlUHJlZml4LCB0aWZmSGRyT2Zmc2V0LCAmYnl0ZXNXcml0dGVuKTsKIAogICAgICAgICAgICAgaWYgKG1Jc0hlaWMpIHsKICAgICAgICAgICAgICAgICBhZGRJdGVtT2Zmc2V0QW5kU2l6ZShvZmZzZXQsIGJ5dGVzV3JpdHRlbiwgaXNFeGlmKTsKQEAgLTM1MjYsNyArMzU5OSw3IEBACiB9CiAKIGludDY0X3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXREdXJhdGlvblVzKCkgY29uc3QgewotICAgIHJldHVybiBtVHJhY2tEdXJhdGlvblVzICsgZ2V0U3RhcnRUaW1lT2Zmc2V0VGltZVVzKCk7CisgICAgcmV0dXJuIG1UcmFja0R1cmF0aW9uVXMgKyBnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMoKSArIG1Pd25lci0+Z2V0U3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKCk7CiB9CiAKIGludDY0X3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXRFc3RpbWF0ZWRUcmFja1NpemVCeXRlcygpIGNvbnN0IHsKQEAgLTM2MTIsNiArMzY4NSw3IEBACiAgICAgdWludDMyX3Qgbm93ID0gZ2V0TXBlZzRUaW1lKCk7CiAgICAgbU93bmVyLT5iZWdpbkJveCgidHJhayIpOwogICAgICAgICB3cml0ZVRraGRCb3gobm93KTsKKyAgICAgICAgd3JpdGVFZHRzQm94KCk7CiAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goIm1kaWEiKTsKICAgICAgICAgICAgIHdyaXRlTWRoZEJveChub3cpOwogICAgICAgICAgICAgd3JpdGVIZGxyQm94KCk7CkBAIC0zNjc0LDYgKzM3NDgsMjkgQEAKICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAgICAgbU93bmVyLT5iZWdpbkJveChmb3VyY2MpOyAgICAvLyBUZXh0TWV0YURhdGFTYW1wbGVFbnRyeQorCisgICAgLy8gIEhBQ0sgdG8gbWFrZSB0aGUgbWV0YWRhdGEgdHJhY2sgY29tcGxpYW50IHdpdGggdGhlIElTTyBzdGFuZGFyZC4KKyAgICAvLworICAgIC8vICBNZXRhZGF0YSB0cmFjayBpcyBhZGRlZCBmcm9tIEFQSSAyNiBhbmQgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGRvZXMgbm90CisgICAgLy8gIGZ1bGx5IGZvbGxvd2VkIHRoZSBUZXh0TWV0YURhdGFTYW1wbGVFbnRyeSBzcGVjaWZpZWQgaW4gSVNPL0lFQyAxNDQ5Ni0xMi0yMDE1CisgICAgLy8gIGluIHRoYXQgb25seSB0aGUgbWltZV9mb3JtYXQgaXMgd3JpdHRlbiBvdXQuIGNvbnRlbnRfZW5jb2RpbmcgYW5kCisgICAgLy8gIGRhdGFfcmVmZXJlbmNlX2luZGV4IGhhdmUgbm90IGJlZW4gd3JpdHRlbiBvdXQuIFRoaXMgbGVhZHMgdG8gdGhlIGZhaWx1cmUKKyAgICAvLyAgd2hlbiBzb21lIE1QNCBwYXJzZXIgdHJpZXMgdG8gcGFyc2UgdGhlIG1ldGFkYXRhIHRyYWNrIGFjY29yZGluZyB0byB0aGUKKyAgICAvLyAgc3RhbmRhcmQuIFRoZSBoYWNrIGhlcmUgd2lsbCBtYWtlIHRoZSBtZXRhZGF0YSB0cmFjayBjb21wbGlhbnQgd2l0aCB0aGUKKyAgICAvLyAgc3RhbmRhcmQgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoaXMgd291bGQgZW5hYmxlCisgICAgLy8gIEFuZHJvaWQgdmVyc2lvbnMgYmVmb3JlIEFQSSAyOSB0byBiZSBhYmxlIHRvIHJlYWQgb3V0IHRoZSBzdGFuZGFyZCBjb21wbGlhbnQKKyAgICAvLyAgTWV0YWRhdGEgdHJhY2sgZ2VuZXJhdGVkIHdpdGggQW5kcm9pZCBBUEkgMjkgYW5kIHVwd2FyZC4gVGhlIHRyaWNrIGlzIGJhc2VkCisgICAgLy8gIG9uIHRoZSBmYWN0IHRoYXQgdGhlIE1ldGFkYXRhIHRyYWNrIG11c3Qgc3RhcnQgd2l0aCBwcmVmaXgg4oCcYXBwbGljYXRpb24v4oCdIGFuZAorICAgIC8vICB0aG9zZSBtaXNzaW5nIGZpZWxkcyBhcmUgbm90IHVzZWQgaW4gQW5kcm9pZCdzIE1ldGFkYXRhIHRyYWNrLiBCeSB3cml0dGluZworICAgIC8vICBvdXQgdGhlIG1pbWVfZm9ybWF0IHR3aWNlLCB0aGUgZmlyc3QgbWltZV9mb3JtYXQgd2lsbCBiZSB1c2VkIHRvIGZpbGwgb3V0IHRoZQorICAgIC8vICBtaXNzaW5nIHJlc2VydmVkLCBkYXRhX3JlZmVyZW5jZV9pbmRleCBhbmQgY29udGVudCBlbmNvZGluZyBmaWVsZHMuIE9uIHRoZQorICAgIC8vICBwYXJzZXIgc2lkZSwgdGhlIGV4dHJhY3RlciBiZWZvcmUgQVBJIDI5ICB3aWxsIHJlYWQgb3V0IHRoZSBmaXJzdCBtaW1lX2Zvcm1hdAorICAgIC8vICBjb3JyZWN0bHkgYW5kIGRyb3AgdGhlIHNlY29uZCBtaW1lX2Zvcm1hdC4gVGhlIGV4dHJhY3RvciBmcm9tIEFQSSAyOSB3aWxsCisgICAgLy8gIGNoZWNrIGlmIHRoZSByZXNlcnZlZCwgZGF0YV9yZWZlcmVuY2VfaW5kZXggYW5kIGNvbnRlbnQgZW5jb2RpbmcgYXJlIGZpbGxlZAorICAgIC8vICB3aXRoIOKAnGFwcGxpY2F0aW9u4oCdIHRvIGRldGVjdCBpZiB0aGlzIGlzIGEgc3RhbmRhcmQgY29tcGxpYW50IG1ldGFkYXRhIHRyYWNrCisgICAgLy8gIGFuZCByZWFkIG91dCB0aGUgZGF0YSBhY2NvcmRpbmdseS4KKyAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtaW1lKTsKKwogICAgIG1Pd25lci0+d3JpdGVDU3RyaW5nKG1pbWUpOyAgLy8gbWV0YWRhdGEgbWltZV9mb3JtYXQKICAgICBtT3duZXItPmVuZEJveCgpOyAvLyBtZXR0CiB9CkBAIC0zOTU5LDYgKzQwNTYsMzMgQEAKICAgICBtT3duZXItPmVuZEJveCgpOwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVFZHRzQm94KCl7CisgICAgQUxPR1YoIiVzIDogZ2V0U3RhcnRUaW1lT2Zmc2V0VGltZVVzIG9mIHRyYWNrOiUiIFBSSWQ2NCAiIHVzIiwgZ2V0VHJhY2tUeXBlKCksCisgICAgICAgIGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpKTsKKworICAgIC8vIFByZXBvbmUgdmlkZW8gcGxheWJhY2suCisgICAgaWYgKG1NaW5DdHRzT2Zmc2V0VGlja3MgIT0gbU1heEN0dHNPZmZzZXRUaWNrcykgeworICAgICAgICBpbnQzMl90IG12aGRUaW1lU2NhbGUgPSBtT3duZXItPmdldFRpbWVTY2FsZSgpOworICAgICAgICB1aW50MzJfdCB0a2hkRHVyYXRpb24gPSAoZ2V0RHVyYXRpb25VcygpICogbXZoZFRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CisgICAgICAgIGludDY0X3QgbWVkaWFUaW1lID0gKChrTWF4Q3R0c09mZnNldFRpbWVVcyAtIGdldE1pbkN0dHNPZmZzZXRUaW1lVXMoKSkKKyAgICAgICAgICAgICogbVRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CisgICAgICAgIGlmICh0a2hkRHVyYXRpb24gPiAwICYmIG1lZGlhVGltZSA+IDApIHsKKyAgICAgICAgICAgIGFkZE9uZUVsc3RUYWJsZUVudHJ5KHRraGREdXJhdGlvbiwgbWVkaWFUaW1lLCAxLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRWxzdFRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtT3duZXItPmJlZ2luQm94KCJlZHRzIik7CisgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImVsc3QiKTsKKyAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgLy8gdmVyc2lvbj0wLCBmbGFncz0wCisgICAgICAgICAgICBtRWxzdFRhYmxlRW50cmllcy0+d3JpdGUobU93bmVyKTsKKyAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gZWxzdDsKKyAgICBtT3duZXItPmVuZEJveCgpOyAvLyBlZHRzCit9CisKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZU1kaGRCb3godWludDMyX3Qgbm93KSB7CiAgICAgaW50NjRfdCB0cmFrRHVyYXRpb25VcyA9IGdldER1cmF0aW9uVXMoKTsKICAgICBpbnQ2NF90IG1kaGREdXJhdGlvbiA9ICh0cmFrRHVyYXRpb25VcyAqIG1UaW1lU2NhbGUgKyA1RTUpIC8gMUU2OwpAQCAtNDA5NSw3ICs0MjE5LDkgQEAKICAgICAgICAgdWludDMyX3QgZHVyYXRpb247CiAgICAgICAgIENIRUNLKG1TdHRzVGFibGVFbnRyaWVzLT5nZXQoZHVyYXRpb24sIDEpKTsKICAgICAgICAgZHVyYXRpb24gPSBodG9ubChkdXJhdGlvbik7ICAvLyBCYWNrIHRvIGhvc3QgYnl0ZSBvcmRlcgotICAgICAgICBtU3R0c1RhYmxlRW50cmllcy0+c2V0KGh0b25sKGR1cmF0aW9uICsgZ2V0U3RhcnRUaW1lT2Zmc2V0U2NhbGVkVGltZSgpKSwgMSk7CisgICAgICAgIGludDMyX3Qgc3RhcnRUaW1lT2Zmc2V0U2NhbGVkID0gKCgoZ2V0U3RhcnRUaW1lT2Zmc2V0VGltZVVzKCkgKworICAgICAgICAgICAgbU93bmVyLT5nZXRTdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoKSkgKiBtVGltZVNjYWxlKSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTDsKKyAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMtPnNldChodG9ubCgoaW50MzJfdClkdXJhdGlvbiArIHN0YXJ0VGltZU9mZnNldFNjYWxlZCksIDEpOwogICAgIH0KICAgICBtU3R0c1RhYmxlRW50cmllcy0+d3JpdGUobU93bmVyKTsKICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3R0cwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNsb2NrLmNwcAppbmRleCA4YmZmOWY3Li40ZjliYzZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNsb2NrLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNsb2NrLmNwcApAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgaWYgKG1BbmNob3JUaW1lUmVhbFVzICE9IC0xKSB7CiAgICAgICAgIGludDY0X3Qgb2xkTm93TWVkaWFVcyA9CiAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgKyAobm93VXMgLSBtQW5jaG9yVGltZVJlYWxVcykgKiAoZG91YmxlKW1QbGF5YmFja1JhdGU7Ci0gICAgICAgIGlmIChub3dNZWRpYVVzIDwgb2xkTm93TWVkaWFVcworICAgICAgICBpZiAobm93TWVkaWFVcyA8IG9sZE5vd01lZGlhVXMgKyBrQW5jaG9yRmx1Y3R1YXRpb25BbGxvd2VkVXMKICAgICAgICAgICAgICAgICAmJiBub3dNZWRpYVVzID4gb2xkTm93TWVkaWFVcyAtIGtBbmNob3JGbHVjdHVhdGlvbkFsbG93ZWRVcykgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IGZhNTljZGIuLmQ0ZTQwMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC01NTAsNyArNTUwLDcgQEAKIAogdm9pZCBNZWRpYUNvZGVjOjppbml0QW5hbHl0aWNzSXRlbSgpIHsKICAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0NvZGVjS2V5TmFtZSk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0NvZGVjS2V5TmFtZSk7CiAgICAgfQogCiAgICAgbUxhdGVuY3lIaXN0LnNldHVwKGtMYXRlbmN5SGlzdEJ1Y2tldHMsIGtMYXRlbmN5SGlzdFdpZHRoLCBrTGF0ZW5jeUhpc3RGbG9vcik7CkBAIC04NjIsOSArODYyLDkgQEAKIC8vc3RhdGljCiBzcDxDb2RlY0Jhc2U+IE1lZGlhQ29kZWM6OkdldENvZGVjQmFzZShjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lcikgewogICAgIGlmIChvd25lcikgewotICAgICAgICBpZiAoc3RybmNtcChvd25lciwgImRlZmF1bHQiLCA4KSA9PSAwKSB7CisgICAgICAgIGlmIChzdHJjbXAob3duZXIsICJkZWZhdWx0IikgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBBQ29kZWM7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvd25lciwgImNvZGVjMiIsIDcpID09IDApIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKG93bmVyLCAiY29kZWMyIiwgNikgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUNDb2RlYygpOwogICAgICAgICB9CiAgICAgfQpAQCAtOTExLDEwICs5MTEsMTAgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIG1Db2RlY0luZm8gPSBtY2wtPmdldENvZGVjSW5mbyhjb2RlY0lkeCk7Ci0gICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKLSAgICAgICAgbUNvZGVjSW5mby0+Z2V0U3VwcG9ydGVkTWltZXMoJm1pbWVzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1pbWVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtZWRpYVR5cGVzOworICAgICAgICBtQ29kZWNJbmZvLT5nZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKCZtZWRpYVR5cGVzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZWRpYVR5cGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWVkaWFUeXBlc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewogICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE5NzMsMTAgKzE5NzMsMTEgQEAKIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDb21wb25lbnRDb25maWd1cmVkOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEIHx8IG1TdGF0ZSA9PSBJTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhIGtXaGF0RXJyb3IgbWVzc2FnZSBjYW1lIGluIGFuZCByZXBsaWVkIHdpdGggZXJyb3IsCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HIHx8IG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEIHx8IG1TdGF0ZSA9PSBJTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhIGtXaGF0RXJyb3Igb3Iga1doYXRSZWxlYXNlIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvZyBhIHdhcm5pbmcgYW5kIGlnbm9yZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWd1cmUgaW50ZXJydXB0ZWQgYnkgZXJyb3IsIGN1cnJlbnQgc3RhdGUgJWQiLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbmZpZ3VyZSBpbnRlcnJ1cHRlZCBieSBlcnJvciBvciByZWxlYXNlLCBjdXJyZW50IHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIENPTkZJR1VSSU5HKTsKQEAgLTIwNjcsNiArMjA2OCwxMyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdFN0YXJ0Q29tcGxldGVkOgogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNJTkcgfHwgbVN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdFJlbGVhc2UgbWVzc2FnZSBjYW1lIGluIGFuZCByZXBsaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbG9nIGEgd2FybmluZyBhbmQgaWdub3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0IGludGVycnVwdGVkIGJ5IHJlbGVhc2UsIGN1cnJlbnQgc3RhdGUgJWQiLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIFNUQVJUSU5HKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZSgKQEAgLTIxOTcsNiArMjIwNSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEobVN1cmZhY2UuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+c2l6ZSgpLCBoZHIxMFBsdXNJbmZvLT5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIobVN1cmZhY2UsIG1Sb3RhdGlvbkRlZ3JlZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTI2MjUsMTEgKzI2NDAsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSWYgd2UncmUgZmx1c2hpbmcsIG9yIHdlJ3JlIHN0b3BwaW5nIGJ1dCByZWNlaXZlZCBhIHJlbGVhc2UKLSAgICAgICAgICAgIC8vIHJlcXVlc3QsIHBvc3QgdGhlIHJlcGx5IGZvciB0aGUgcGVuZGluZyBjYWxsIGZpcnN0LCBhbmQgY29uc2lkZXIKLSAgICAgICAgICAgIC8vIGl0IGRvbmUuIFRoZSByZXBseSB0b2tlbiB3aWxsIGJlIHJlcGxhY2VkIGFmdGVyIHRoaXMsIGFuZCB3ZSdsbAotICAgICAgICAgICAgLy8gbm8gbG9uZ2VyIGJlIGFibGUgdG8gcmVwbHkuCi0gICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNISU5HIHx8IG1TdGF0ZSA9PSBTVE9QUElORykgeworICAgICAgICAgICAgLy8gSWYgd2UncmUgZmx1c2hpbmcsIHN0b3BwaW5nLCBjb25maWd1cmluZyBvciBzdGFydGluZyAgYnV0CisgICAgICAgICAgICAvLyByZWNlaXZlZCBhIHJlbGVhc2UgcmVxdWVzdCwgcG9zdCB0aGUgcmVwbHkgZm9yIHRoZSBwZW5kaW5nIGNhbGwKKyAgICAgICAgICAgIC8vIGZpcnN0LCBhbmQgY29uc2lkZXIgaXQgZG9uZS4gVGhlIHJlcGx5IHRva2VuIHdpbGwgYmUgcmVwbGFjZWQKKyAgICAgICAgICAgIC8vIGFmdGVyIHRoaXMsIGFuZCB3ZSdsbCBubyBsb25nZXIgYmUgYWJsZSB0byByZXBseS4KKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gRkxVU0hJTkcgfHwgbVN0YXRlID09IFNUT1BQSU5HCisgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBDT05GSUdVUklORyB8fCBtU3RhdGUgPT0gU1RBUlRJTkcpIHsKICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgIH0KIApAQCAtMjY3NCw3ICsyNjkwLDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlT3V0cHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgaW4gYXN5bmMgbW9kZSIpOworICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlSW5wdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CiAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCBlYWZmMjgzLi4zZDU4ZDRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC03Nyw3ICs3Nyw4IEBACiAgICAgcmV0dXJuIHByb2ZpbGluZ05lZWRlZDsKIH0KIAotT214SW5mb0J1aWxkZXIgc09teEluZm9CdWlsZGVyOworT214SW5mb0J1aWxkZXIgc09teEluZm9CdWlsZGVye3RydWUgLyogYWxsb3dTdXJmYWNlRW5jb2RlcnMgKi99OworT214SW5mb0J1aWxkZXIgc09teE5vU3VyZmFjZUVuY29kZXJJbmZvQnVpbGRlcntmYWxzZSAvKiBhbGxvd1N1cmZhY2VFbmNvZGVycyAqL307CiAKIE11dGV4IHNDb2RlYzJJbmZvQnVpbGRlck11dGV4Owogc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U+IHNDb2RlYzJJbmZvQnVpbGRlcjsKQEAgLTk4LDcgKzk5LDExIEBACiAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2VUZXN0ID0KICAgICAgICAgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OkdldENDb2RlY0luc3RhbmNlKCktPmNyZWF0ZUlucHV0U3VyZmFjZSgpOwogICAgIGlmIChzdXJmYWNlVGVzdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJBbGxvd2luZyBhbGwgT01YIGNvZGVjcyIpOwogICAgICAgICBidWlsZGVycy5wdXNoX2JhY2soJnNPbXhJbmZvQnVpbGRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIkFsbG93aW5nIG9ubHkgbm9uLXN1cmZhY2UtZW5jb2RlciBPTVggY29kZWNzIik7CisgICAgICAgIGJ1aWxkZXJzLnB1c2hfYmFjaygmc09teE5vU3VyZmFjZUVuY29kZXJJbmZvQnVpbGRlcik7CiAgICAgfQogICAgIGJ1aWxkZXJzLnB1c2hfYmFjayhHZXRDb2RlYzJJbmZvQnVpbGRlcigpKTsKICAgICByZXR1cm4gYnVpbGRlcnM7CkBAIC0yMTUsMTQgKzIyMCwyNSBAQAogICAgICAgICAgICAgbUNvZGVjSW5mb3MuYmVnaW4oKSwKICAgICAgICAgICAgIG1Db2RlY0luZm9zLmVuZCgpLAogICAgICAgICAgICAgW10oY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvMSwgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvMikgewotICAgICAgICAgICAgICAgIGlmIChpbmZvMiA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm8xID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm8xLT5yYW5rKCkgPCBpbmZvMi0+cmFuaygpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBudWxsIGlzIGxvd2VzdAorICAgICAgICAgICAgICAgIHJldHVybiBpbmZvMSA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaW5mbzIgIT0gbnVsbHB0ciAmJiBpbmZvMS0+Z2V0UmFuaygpIDwgaW5mbzItPmdldFJhbmsoKSk7CiAgICAgICAgICAgICB9KTsKKworICAgIC8vIHJlbW92ZSBkdXBsaWNhdGUgZW50cmllcworICAgIGJvb2wgZGVkdXBlID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmRlZHVwZS1jb2RlY3MiLCB0cnVlKTsKKyAgICBpZiAoZGVkdXBlKSB7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb2RlY3NTZWVuOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ29kZWNJbmZvcy5iZWdpbigpOyBpdCAhPSBtQ29kZWNJbmZvcy5lbmQoKTsgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb2RlY05hbWUgPSAoKml0KS0+Z2V0Q29kZWNOYW1lKCk7CisgICAgICAgICAgICBpZiAoY29kZWNzU2Vlbi5jb3VudChjb2RlY05hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb2RlY3NTZWVuLmVtcGxhY2UoY29kZWNOYW1lKTsKKyAgICAgICAgICAgICAgICBpdCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1Db2RlY0luZm9zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAogTWVkaWFDb2RlY0xpc3Q6On5NZWRpYUNvZGVjTGlzdCgpIHsKQEAgLTI3MiwxMCArMjg4LDE3IEBACiB9CiAKIHNzaXplX3QgTWVkaWFDb2RlY0xpc3Q6OmZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7CisgICAgVmVjdG9yPEFTdHJpbmc+IGFsaWFzZXM7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewogICAgICAgICBpZiAoc3RyY21wKG1Db2RlY0luZm9zW2ldLT5nZXRDb2RlY05hbWUoKSwgbmFtZSkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KKyAgICAgICAgbUNvZGVjSW5mb3NbaV0tPmdldEFsaWFzZXMoJmFsaWFzZXMpOworICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJmFsaWFzIDogYWxpYXNlcykgeworICAgICAgICAgICAgaWYgKGFsaWFzID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAtRU5PRU5UOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCmluZGV4IGNhYzUzZjQuLmRkN2MzZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKQEAgLTIyOCwxOCArMjI4LDE4IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKLSAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWltZXMoJm1pbWVzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKKyAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFUeXBlcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gJmNhcHMgPQotICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobWltZXNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtZWRpYVR5cGVzW2ldLmNfc3RyKCkpOwogICAgICAgICAgICAgaWYgKCFmb3JjZVRvTWVhc3VyZSAmJgogICAgICAgICAgICAgICAgIChjYXBzLT5nZXREZXRhaWxzKCktPmNvbnRhaW5zKCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlcyIpIHx8CiAgICAgICAgICAgICAgICAgIGNhcHMtPmdldERldGFpbHMoKS0+Y29udGFpbnMoIm1heC1jb25jdXJyZW50LWluc3RhbmNlcyIpKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzaXplX3QgbWF4ID0gZG9Qcm9maWxlQ29kZWNzKGluZm8tPmlzRW5jb2RlcigpLCBuYW1lLCBtaW1lc1tpXSwgY2Fwcyk7CisgICAgICAgICAgICBzaXplX3QgbWF4ID0gZG9Qcm9maWxlQ29kZWNzKGluZm8tPmlzRW5jb2RlcigpLCBuYW1lLCBtZWRpYVR5cGVzW2ldLCBjYXBzKTsKICAgICAgICAgICAgIGlmIChtYXggPiAwKSB7CiAgICAgICAgICAgICAgICAgQ29kZWNTZXR0aW5ncyBzZXR0aW5nczsKICAgICAgICAgICAgICAgICBjaGFyIG1heFN0clszMl07CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAogICAgICAgICAgICAgICAgIEFTdHJpbmcga2V5ID0gbmFtZTsKICAgICAgICAgICAgICAgICBrZXkuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAga2V5LmFwcGVuZChtaW1lc1tpXSk7CisgICAgICAgICAgICAgICAga2V5LmFwcGVuZChtZWRpYVR5cGVzW2ldKTsKIAogICAgICAgICAgICAgICAgIGlmIChpbmZvLT5pc0VuY29kZXIoKSkgewogICAgICAgICAgICAgICAgICAgICBlbmNvZGVyX3Jlc3VsdHMtPmFkZChrZXksIHNldHRpbmdzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcAppbmRleCBiMzJlNDcwLi5jNGZiMTk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwCkBAIC0zNyw2ICszNywxNiBAQAogICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvV3JpdGVyKGluZm8uZ2V0KCkpKTsKIH0KIAorc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPgorICAgICAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6ZmluZE1lZGlhQ29kZWNJbmZvKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBmb3IgKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbyA6IG1Db2RlY0luZm9zKSB7CisgICAgICAgIGlmICghc3RyY21wKGluZm8tPmdldENvZGVjTmFtZSgpLCBuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4obmV3IE1lZGlhQ29kZWNJbmZvV3JpdGVyKGluZm8uZ2V0KCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwogdm9pZCBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6d3JpdGVHbG9iYWxTZXR0aW5ncygKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZnbG9iYWxTZXR0aW5ncykgY29uc3QgewogICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJmt2IDogbUdsb2JhbFNldHRpbmdzKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCmluZGV4IGUyMmFkMGQuLmMzZDg1ZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgpAQCAtMzYyLDcgKzM2Myw3IEBACiAKIHN0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnNldElucHV0QnVmZmVyVGltZU9mZnNldChpbnQ2NF90IHRpbWVPZmZzZXRVcykgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRJbnB1dEJ1ZmZlclRpbWVPZmZzZXQsIG1SZWZsZWN0b3IpOwotICAgIG1zZy0+c2V0SW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgdGltZU9mZnNldFVzKTsKKyAgICBtc2ctPnNldEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsIHRpbWVPZmZzZXRVcyk7CiAgICAgcmV0dXJuIHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IobXNnKTsKIH0KIApAQCAtNDkwLDcgKzQ5MSw3IEBACiAgICAgbUNvZGVjTG9vcGVyLT5zdGFydCgpOwogCiAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKLSAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCIsIDEpOworICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVELCAxKTsKICAgICB9CiAKICAgICBBU3RyaW5nIG91dHB1dE1JTUU7CkBAIC02NDMsNiArNjQ0LDEwIEBACiAgICAgICAgICAgICBvdXRwdXQtPm1CdWZmZXJRdWV1ZS5jbGVhcigpOwogICAgICAgICAgICAgb3V0cHV0LT5tRW5jb2RlclJlYWNoZWRFT1MgPSB0cnVlOwogICAgICAgICAgICAgb3V0cHV0LT5tRXJyb3JDb2RlID0gZXJyOworICAgICAgICAgICAgaWYgKCEobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkpIHsKKyAgICAgICAgICAgICAgICBtU3RvcHBpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1QdWxsZXItPnN0b3AoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG91dHB1dC0+bUNvbmQuc2lnbmFsKCk7CiAKICAgICAgICAgICAgIHJlYWNoZWRFT1MgPSB0cnVlOwpAQCAtNjczLDkgKzY3OCw5IEBACiAgICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7CiAgICAgaWYgKG1FbmNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCBmYWxzZSk7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoUEFSQU1FVEVSX0tFWV9TVVNQRU5ELCBmYWxzZSk7CiAgICAgICAgIGlmIChyZXN1bWVTdGFydFRpbWVVcyA+IDApIHsKLSAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoImRyb3Atc3RhcnQtdGltZS11cyIsIHJlc3VtZVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoUEFSQU1FVEVSX0tFWV9TVVNQRU5EX1RJTUUsIHJlc3VtZVN0YXJ0VGltZVVzKTsKICAgICAgICAgfQogICAgICAgICBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwogICAgIH0KQEAgLTc5NSw3ICs4MDAsNyBAQAogICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CiAgICAgICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCBmYWxzZSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKFBBUkFNRVRFUl9LRVlfU1VTUEVORCwgZmFsc2UpOwogICAgICAgICAgICAgaWYgKHN0YXJ0VGltZVVzID49IDApIHsKICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KCJza2lwLWZyYW1lcy1iZWZvcmUiLCBzdGFydFRpbWVVcyk7CiAgICAgICAgICAgICB9CkBAIC04MjgsOCArODMzLDggQEAKIHZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6b25QYXVzZShpbnQ2NF90IHBhdXNlU3RhcnRUaW1lVXMpIHsKICAgICBpZiAoKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpICYmIChtRW5jb2RlciAhPSBOVUxMKSkgewogICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICBwYXJhbXMtPnNldEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsIHRydWUpOwotICAgICAgICBwYXJhbXMtPnNldEludDY0KCJkcm9wLXN0YXJ0LXRpbWUtdXMiLCBwYXVzZVN0YXJ0VGltZVVzKTsKKyAgICAgICAgcGFyYW1zLT5zZXRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsIHRydWUpOworICAgICAgICBwYXJhbXMtPnNldEludDY0KFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FLCBwYXVzZVN0YXJ0VGltZVVzKTsKICAgICAgICAgbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICB9IGVsc2UgewogICAgICAgICBDSEVDSyhtUHVsbGVyICE9IE5VTEwpOwpAQCAtMTA5MiwxMiArMTA5NywxMiBAQAogICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgJm1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcykpOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCAmbUlucHV0QnVmZmVyVGltZU9mZnNldFVzKSk7CiAKICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSB0aW1lc3RhbXAgb2Zmc2V0IHRvIEdyYXBoaWNCdWZmZXJTb3VyY2UuCiAgICAgICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgidGltZS1vZmZzZXQtdXMiLCBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMpOwogICAgICAgICAgICAgZXJyID0gbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkMzM4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7CisgICAgaWYgKCFMT0dfTkRFQlVHKSB7CisgICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOworICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisgICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOworICAgIH0KK30KKworTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9CisKK3VpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Ok1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcihDTWVkaWFFeHRyYWN0b3IgKnBsdWdpbikgeworICAgIHRoaXMtPnBsdWdpbiA9IHBsdWdpbjsKK30KKworTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjp+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCkgeworICAgIHBsdWdpbi0+ZnJlZShwbHVnaW4tPmRhdGEpOworICAgIGZyZWUocGx1Z2luKTsKK30KKworc2l6ZV90IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+Y291bnRUcmFja3MocGx1Z2luLT5kYXRhKTsKK30KKworTWVkaWFUcmFjayAqTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICByZXR1cm4gTWVkaWFUcmFja0NVbndyYXBwZXI6OmNyZWF0ZShwbHVnaW4tPmdldFRyYWNrKHBsdWdpbi0+ZGF0YSwgaW5kZXgpKTsKK30KKworc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gcGx1Z2luLT5nZXRUcmFja01ldGFEYXRhKHBsdWdpbi0+ZGF0YSwgZm9ybWF0LCBpbmRleCwgZmxhZ3MpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHBsdWdpbi0+Z2V0TWV0YURhdGEocGx1Z2luLT5kYXRhLCBmb3JtYXQpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK2NvbnN0IGNoYXIgKiBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Om5hbWUoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+bmFtZShwbHVnaW4tPmRhdGEpOworfQorCit1aW50MzJfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBwbHVnaW4tPmZsYWdzKHBsdWdpbi0+ZGF0YSk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6c2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+c2V0TWVkaWFDYXMocGx1Z2luLT5kYXRhLCBjYXNUb2tlbiwgc2l6ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAppbmRleCBiMGJmMjY5Li5hMzA5ZWU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKQEAgLTE4LDIwICsxOCwyMCBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvckZhY3RvcnkiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxuYXRpdmVsb2FkZXIvZGxleHRfbmFtZXNwYWNlcy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHppcGFyY2hpdmUvemlwX2FyY2hpdmUuaD4KIAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CkBAIC03MCw0OSArNzAsNDggQEAKIAogICAgIEFMT0dWKCJNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZUZyb21TZXJ2aWNlICVzIiwgbWltZSk7CiAKLSAgICBVcGRhdGVFeHRyYWN0b3JzKG51bGxwdHIpOworICAgIFVwZGF0ZUV4dHJhY3RvcnMoKTsKIAogICAgIC8vIGluaXRpYWxpemUgc291cmNlIGRlY3J5cHRpb24gaWYgbmVlZGVkCiAgICAgc291cmNlLT5Ecm1Jbml0aWFsaXphdGlvbihudWxscHRyIC8qIG1pbWUgKi8pOwogCiAgICAgdm9pZCAqbWV0YSA9IG51bGxwdHI7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGNyZWF0b3IgPSBOVUxMOwotICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgZnJlZU1ldGEgPSBudWxscHRyOworICAgIHZvaWQgKmNyZWF0b3IgPSBOVUxMOworICAgIEZyZWVNZXRhRnVuYyBmcmVlTWV0YSA9IG51bGxwdHI7CiAgICAgZmxvYXQgY29uZmlkZW5jZTsKICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+IHBsdWdpbjsKLSAgICBjcmVhdG9yID0gc25pZmYoc291cmNlLmdldCgpLCAmY29uZmlkZW5jZSwgJm1ldGEsICZmcmVlTWV0YSwgcGx1Z2luKTsKKyAgICB1aW50MzJfdCBjcmVhdG9yVmVyc2lvbiA9IDA7CisgICAgY3JlYXRvciA9IHNuaWZmKHNvdXJjZSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEsIHBsdWdpbiwgJmNyZWF0b3JWZXJzaW9uKTsKICAgICBpZiAoIWNyZWF0b3IpIHsKICAgICAgICAgQUxPR1YoIkZBSUxFRCB0byBhdXRvZGV0ZWN0IG1lZGlhIGNvbnRlbnQuIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIE1lZGlhRXh0cmFjdG9yICpyZXQgPSBjcmVhdG9yKHNvdXJjZS5nZXQoKSwgbWV0YSk7Ci0gICAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGZyZWVNZXRhKG1ldGEpOworICAgIE1lZGlhRXh0cmFjdG9yICpleCA9IG51bGxwdHI7CisgICAgaWYgKGNyZWF0b3JWZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSB8fAorICAgICAgICAgICAgY3JlYXRvclZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgICAgIENNZWRpYUV4dHJhY3RvciAqcmV0ID0gKChDcmVhdG9yRnVuYyljcmVhdG9yKShzb3VyY2UtPndyYXAoKSwgbWV0YSk7CisgICAgICAgIGlmIChtZXRhICE9IG51bGxwdHIgJiYgZnJlZU1ldGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnJlZU1ldGEobWV0YSk7CisgICAgICAgIH0KKyAgICAgICAgZXggPSByZXQgIT0gbnVsbHB0ciA/IG5ldyBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIocmV0KSA6IG51bGxwdHI7CiAgICAgfQogCiAgICAgQUxPR1YoIkNyZWF0ZWQgYW4gZXh0cmFjdG9yICclcycgd2l0aCBjb25maWRlbmNlICUuMmYiLAotICAgICAgICAgcmV0ICE9IG51bGxwdHIgPyByZXQtPm5hbWUoKSA6ICI8bnVsbD4iLCBjb25maWRlbmNlKTsKKyAgICAgICAgIGV4ICE9IG51bGxwdHIgPyBleC0+bmFtZSgpIDogIjxudWxsPiIsIGNvbmZpZGVuY2UpOwogCi0gICAgcmV0dXJuIENyZWF0ZUlNZWRpYUV4dHJhY3RvckZyb21NZWRpYUV4dHJhY3RvcihyZXQsIHNvdXJjZSwgcGx1Z2luKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpMb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKSB7Ci0gICAgLy8gVE9ETzogVmVyaWZ5IGFwayBwYXRoIHdpdGggcGFja2FnZSBtYW5hZ2VyIGluIGV4dHJhY3RvciBwcm9jZXNzLgotICAgIEFMT0dWKCJMb2FkIHBsdWdpbnMgZnJvbTogJXMiLCBhcGtQYXRoLmNfc3RyKCkpOwotICAgIFVwZGF0ZUV4dHJhY3RvcnMoYXBrUGF0aC5lbXB0eSgpID8gbnVsbHB0ciA6IGFwa1BhdGguY19zdHIoKSk7CisgICAgcmV0dXJuIENyZWF0ZUlNZWRpYUV4dHJhY3RvckZyb21NZWRpYUV4dHJhY3RvcihleCwgc291cmNlLCBwbHVnaW4pOwogfQogCiBzdHJ1Y3QgRXh0cmFjdG9yUGx1Z2luIDogcHVibGljIFJlZkJhc2UgewotICAgIE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmOworICAgIEV4dHJhY3RvckRlZiBkZWY7CiAgICAgdm9pZCAqbGliSGFuZGxlOwogICAgIFN0cmluZzggbGliUGF0aDsKICAgICBTdHJpbmc4IHV1aWRTdHJpbmc7CiAKLSAgICBFeHRyYWN0b3JQbHVnaW4oTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBkZWZpbml0aW9uLCB2b2lkICpoYW5kbGUsIFN0cmluZzggJnBhdGgpCisgICAgRXh0cmFjdG9yUGx1Z2luKEV4dHJhY3RvckRlZiBkZWZpbml0aW9uLCB2b2lkICpoYW5kbGUsIFN0cmluZzggJnBhdGgpCiAgICAgICAgIDogZGVmKGRlZmluaXRpb24pLCBsaWJIYW5kbGUoaGFuZGxlKSwgbGliUGF0aChwYXRoKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWY6OmV4dHJhY3Rvcl91dWlkOyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YgRXh0cmFjdG9yRGVmOjpleHRyYWN0b3JfdXVpZDsgaSsrKSB7CiAgICAgICAgICAgICB1dWlkU3RyaW5nLmFwcGVuZEZvcm1hdCgiJTAyeCIsIGRlZi5leHRyYWN0b3JfdXVpZC5iW2ldKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEyNSwxNyArMTI0LDE4IEBACiB9OwogCiBNdXRleCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5NdXRleDsKLXN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zOworc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luczsKIGJvb2wgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luc1JlZ2lzdGVyZWQgPSBmYWxzZTsKK2Jvb2wgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnSWdub3JlVmVyc2lvbiA9IGZhbHNlOwogCiAvLyBzdGF0aWMKLU1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4pIHsKK3ZvaWQgKk1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6c25pZmYoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSwgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCB1aW50MzJfdCAqY3JlYXRvclZlcnNpb24pIHsKICAgICAqY29uZmlkZW5jZSA9IDAuMGY7CiAgICAgKm1ldGEgPSBudWxscHRyOwogCi0gICAgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gcGx1Z2luczsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwogICAgICAgICBpZiAoIWdQbHVnaW5zUmVnaXN0ZXJlZCkgewpAQCAtMTQ0LDEzICsxNDQsMjMgQEAKICAgICAgICAgcGx1Z2lucyA9IGdQbHVnaW5zOwogICAgIH0KIAotICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBjdXJDcmVhdG9yID0gTlVMTDsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgYmVzdENyZWF0b3IgPSBOVUxMOworICAgIHZvaWQgKmJlc3RDcmVhdG9yID0gTlVMTDsKICAgICBmb3IgKGF1dG8gaXQgPSBwbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBwbHVnaW5zLT5lbmQoKTsgKytpdCkgeworICAgICAgICBBTE9HVigic25pZmZpbmcgJXMiLCAoKml0KS0+ZGVmLmV4dHJhY3Rvcl9uYW1lKTsKICAgICAgICAgZmxvYXQgbmV3Q29uZmlkZW5jZTsKICAgICAgICAgdm9pZCAqbmV3TWV0YSA9IG51bGxwdHI7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgbmV3RnJlZU1ldGEgPSBudWxscHRyOwotICAgICAgICBpZiAoKGN1ckNyZWF0b3IgPSAoKml0KS0+ZGVmLnNuaWZmKHNvdXJjZSwgJm5ld0NvbmZpZGVuY2UsICZuZXdNZXRhLCAmbmV3RnJlZU1ldGEpKSkgeworICAgICAgICBGcmVlTWV0YUZ1bmMgbmV3RnJlZU1ldGEgPSBudWxscHRyOworCisgICAgICAgIHZvaWQgKmN1ckNyZWF0b3IgPSBOVUxMOworICAgICAgICBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEpIHsKKyAgICAgICAgICAgIGN1ckNyZWF0b3IgPSAodm9pZCopICgqaXQpLT5kZWYudS52Mi5zbmlmZigKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT53cmFwKCksICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKTsKKyAgICAgICAgfSBlbHNlIGlmICgoKml0KS0+ZGVmLmRlZl92ZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgeworICAgICAgICAgICAgY3VyQ3JlYXRvciA9ICh2b2lkKikgKCppdCktPmRlZi51LnYzLnNuaWZmKAorICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPndyYXAoKSwgJm5ld0NvbmZpZGVuY2UsICZuZXdNZXRhLCAmbmV3RnJlZU1ldGEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1ckNyZWF0b3IpIHsKICAgICAgICAgICAgIGlmIChuZXdDb25maWRlbmNlID4gKmNvbmZpZGVuY2UpIHsKICAgICAgICAgICAgICAgICAqY29uZmlkZW5jZSA9IG5ld0NvbmZpZGVuY2U7CiAgICAgICAgICAgICAgICAgaWYgKCptZXRhICE9IG51bGxwdHIgJiYgKmZyZWVNZXRhICE9IG51bGxwdHIpIHsKQEAgLTE2MCw2ICsxNzAsNyBAQAogICAgICAgICAgICAgICAgICpmcmVlTWV0YSA9IG5ld0ZyZWVNZXRhOwogICAgICAgICAgICAgICAgIHBsdWdpbiA9ICppdDsKICAgICAgICAgICAgICAgICBiZXN0Q3JlYXRvciA9IGN1ckNyZWF0b3I7CisgICAgICAgICAgICAgICAgKmNyZWF0b3JWZXJzaW9uID0gKCppdCktPmRlZi5kZWZfdmVyc2lvbjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKG5ld01ldGEgIT0gbnVsbHB0ciAmJiBuZXdGcmVlTWV0YSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIG5ld0ZyZWVNZXRhKG5ld01ldGEpOwpAQCAtMTczLDEwICsxODQsMTAgQEAKIAogLy8gc3RhdGljCiB2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3IoY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLAotICAgICAgICBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CisgICAgICAgIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgewogICAgIC8vIHNhbml0eSBjaGVjayBjaGVjayBzdHJ1Y3QgdmVyc2lvbiwgdXVpZCwgbmFtZQotICAgIGlmIChwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA9PSAwCi0gICAgICAgICAgICB8fCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA+IE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTikgeworICAgIGlmIChwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiAhPSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEgJiYKKyAgICAgICAgICAgIHBsdWdpbi0+ZGVmLmRlZl92ZXJzaW9uICE9IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgewogICAgICAgICBBTE9HRSgiZG9uJ3QgdW5kZXJzdGFuZCBleHRyYWN0b3IgZm9ybWF0ICV1LCBpZ25vcmluZy4iLCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbik7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xOTIsNyArMjAzLDcgQEAKICAgICBmb3IgKGF1dG8gaXQgPSBwbHVnaW5MaXN0LmJlZ2luKCk7IGl0ICE9IHBsdWdpbkxpc3QuZW5kKCk7ICsraXQpIHsKICAgICAgICAgaWYgKG1lbWNtcCgmKCgqaXQpLT5kZWYuZXh0cmFjdG9yX3V1aWQpLCAmcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3V1aWQsIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAvLyB0aGVyZSdzIGFscmVhZHkgYW4gZXh0cmFjdG9yIHdpdGggdGhlIHNhbWUgdXVpZAotICAgICAgICAgICAgaWYgKCgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24gPCBwbHVnaW4tPmRlZi5leHRyYWN0b3JfdmVyc2lvbikgeworICAgICAgICAgICAgaWYgKGdJZ25vcmVWZXJzaW9uIHx8ICgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24gPCBwbHVnaW4tPmRlZi5leHRyYWN0b3JfdmVyc2lvbikgewogICAgICAgICAgICAgICAgIC8vIHRoaXMgb25lIGlzIG5ld2VyLCByZXBsYWNlIHRoZSBvbGQgb25lCiAgICAgICAgICAgICAgICAgQUxPR1coInJlcGxhY2luZyBleHRyYWN0b3IgJyVzJyB2ZXJzaW9uICV1IHdpdGggdmVyc2lvbiAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4tPmRlZi5leHRyYWN0b3JfbmFtZSwKQEAgLTIxNCw2NiArMjI1LDI4IEBACiB9CiAKIC8vc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCi0gICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKLSAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgYXBrUGF0aCk7Ci0gICAgWmlwQXJjaGl2ZUhhbmRsZSB6aXBIYW5kbGU7Ci0gICAgaW50MzJfdCByZXQgPSBPcGVuQXJjaGl2ZShhcGtQYXRoLCAmemlwSGFuZGxlKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgY2hhciBhYmlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5wcm9kdWN0LmNwdS5hYmkiLCBhYmksICJhcm02NC12OGEiKTsKLSAgICAgICAgU3RyaW5nOCBwcmVmaXg4ID0gU3RyaW5nODo6Zm9ybWF0KCJsaWIvJXMvIiwgYWJpKTsKLSAgICAgICAgWmlwU3RyaW5nIHByZWZpeChwcmVmaXg4LmNfc3RyKCkpOwotICAgICAgICBaaXBTdHJpbmcgc3VmZml4KCJleHRyYWN0b3Iuc28iKTsKLSAgICAgICAgdm9pZCogY29va2llOwotICAgICAgICByZXQgPSBTdGFydEl0ZXJhdGlvbih6aXBIYW5kbGUsICZjb29raWUsICZwcmVmaXgsICZzdWZmaXgpOwotICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgWmlwU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICB3aGlsZSAoTmV4dChjb29raWUsICZlbnRyeSwgJm5hbWUpID09IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBTdHJpbmc4KGFwa1BhdGgpICsgIiEvIiArCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obmFtZS5uYW1lKSwgbmFtZS5uYW1lX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogT3BlbiB3aXRoIGEgbGlua2VyIG5hbWVzcGFjZSBzbyB0aGF0IGl0IGNhbiBiZSBsaW5rZWQgd2l0aCBzdWItbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBhcGsgaW5zdGVhZCBvZiBzeXN0ZW0gbGlicmFyaWVzIGFscmVhZHkgbG9hZGVkLgotICAgICAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLnN0cmluZygpLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOwotICAgICAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZiBnZXREZWYgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0cmFjdG9yUGx1Z2luKGdldERlZigpLCBsaWJIYW5kbGUsIGxpYlBhdGgpLCBwbHVnaW5MaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBkb2VzIG5vdCBjb250YWluIHNuaWZmZXIiLCBsaWJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbmRJdGVyYXRpb24oY29va2llKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBmaW5kIHBsdWdpbnMgZnJvbSAlcywgJWQiLCBhcGtQYXRoLCByZXQpOwotICAgICAgICB9Ci0gICAgICAgIENsb3NlQXJjaGl2ZSh6aXBIYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuKCVzKSAlZCIsIGFwa1BhdGgsIHJldCk7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAotICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7Cit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzKAorICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBjb25zdCBhbmRyb2lkX2RsZXh0aW5mbyogZGxleHRpbmZvLAorICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgbGliRGlyUGF0aCk7CisKICAgICBESVIgKmxpYkRpciA9IG9wZW5kaXIobGliRGlyUGF0aCk7CiAgICAgaWYgKGxpYkRpcikgewogICAgICAgICBzdHJ1Y3QgZGlyZW50KiBsaWJFbnRyeTsKICAgICAgICAgd2hpbGUgKChsaWJFbnRyeSA9IHJlYWRkaXIobGliRGlyKSkpIHsKKyAgICAgICAgICAgIGlmIChsaWJFbnRyeS0+ZF9uYW1lWzBdID09ICcuJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChsaWJEaXJQYXRoKSArICIvIiArIGxpYkVudHJ5LT5kX25hbWU7Ci0gICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5zdHJpbmcoKSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICAgICAgICAgIGlmICghbGliUGF0aC5jb250YWlucygiZXh0cmFjdG9yLnNvIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGFuZHJvaWRfZGxvcGVuX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgbGliUGF0aC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMLCBkbGV4dGluZm8pOwogICAgICAgICAgICAgaWYgKGxpYkhhbmRsZSkgewotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KLSAgICAgICAgICAgICAgICAgICAgKE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOworICAgICAgICAgICAgICAgIEdldEV4dHJhY3RvckRlZiBnZXREZWYgPQorICAgICAgICAgICAgICAgICAgICAoR2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKQEAgLTI4NiwzOSArMjU5LDg1IEBACiAgICAgICAgICAgICAgICAgQUxPR1coImNvdWxkbid0IGRsb3BlbiglcykgJXMiLCBsaWJQYXRoLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgY2xvc2VkaXIobGliRGlyKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbmRpciglcykiLCBsaWJEaXJQYXRoKTsKICAgICB9CiB9CiAKK3N0YXRpYyBib29sIGNvbXBhcmVGdW5jKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4mIGZpcnN0LCBjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+JiBzZWNvbmQpIHsKKyAgICByZXR1cm4gc3RyY21wKGZpcnN0LT5kZWYuZXh0cmFjdG9yX25hbWUsIHNlY29uZC0+ZGVmLmV4dHJhY3Rvcl9uYW1lKSA8IDA7Cit9CisKK3N0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdTdXBwb3J0ZWRFeHRlbnNpb25zOworCiAvLyBzdGF0aWMKLXZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpVcGRhdGVFeHRyYWN0b3JzKGNvbnN0IGNoYXIgKm5ld1VwZGF0ZUFwa1BhdGgpIHsKK3ZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpVcGRhdGVFeHRyYWN0b3JzKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwotICAgIGlmIChuZXdVcGRhdGVBcGtQYXRoICE9IG51bGxwdHIpIHsKLSAgICAgICAgZ1BsdWdpbnNSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgfQorCiAgICAgaWYgKGdQbHVnaW5zUmVnaXN0ZXJlZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IG5ld0xpc3QobmV3IExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4oKSk7CisgICAgZ0lnbm9yZVZlcnNpb24gPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuZXh0cmFjdG9yLmlnbm9yZV92ZXJzaW9uIiwgZmFsc2UpOwogCi0gICAgUmVnaXN0ZXJFeHRyYWN0b3JzSW5TeXN0ZW0oIi9zeXN0ZW0vbGliIgorICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IG5ld0xpc3QobmV3IHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PigpKTsKKworICAgIGFuZHJvaWRfbmFtZXNwYWNlX3QgKm1lZGlhTnMgPSBhbmRyb2lkX2dldF9leHBvcnRlZF9uYW1lc3BhY2UoIm1lZGlhIik7CisgICAgaWYgKG1lZGlhTnMgIT0gTlVMTCkgeworICAgICAgICBjb25zdCBhbmRyb2lkX2RsZXh0aW5mbyBkbGV4dGluZm8gPSB7CisgICAgICAgICAgICAuZmxhZ3MgPSBBTkRST0lEX0RMRVhUX1VTRV9OQU1FU1BBQ0UsCisgICAgICAgICAgICAubGlicmFyeV9uYW1lc3BhY2UgPSBtZWRpYU5zLAorICAgICAgICB9OworICAgICAgICBSZWdpc3RlckV4dHJhY3RvcnMoIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2xpYiIKKyNpZmRlZiBfX0xQNjRfXworICAgICAgICAgICAgICAgICI2NCIKKyNlbmRpZgorICAgICAgICAgICAgICAgICIvZXh0cmFjdG9ycyIsICZkbGV4dGluZm8sICpuZXdMaXN0KTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBmaW5kIG1lZGlhIG5hbWVzcGFjZS4iKTsKKyAgICB9CisKKyAgICBSZWdpc3RlckV4dHJhY3RvcnMoIi9zeXN0ZW0vbGliIgogI2lmZGVmIF9fTFA2NF9fCiAgICAgICAgICAgICAiNjQiCiAjZW5kaWYKLSAgICAgICAgICAgICIvZXh0cmFjdG9ycyIsICpuZXdMaXN0KTsKKyAgICAgICAgICAgICIvZXh0cmFjdG9ycyIsIE5VTEwsICpuZXdMaXN0KTsKIAotICAgIGlmIChuZXdVcGRhdGVBcGtQYXRoICE9IG51bGxwdHIpIHsKLSAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsobmV3VXBkYXRlQXBrUGF0aCwgKm5ld0xpc3QpOworICAgIG5ld0xpc3QtPnNvcnQoY29tcGFyZUZ1bmMpOworICAgIGdQbHVnaW5zID0gbmV3TGlzdDsKKworICAgIGZvciAoYXV0byBpdCA9IGdQbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBnUGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDs7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dCA9ICgqaXQpLT5kZWYudS52My5zdXBwb3J0ZWRfdHlwZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGV4dCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnU3VwcG9ydGVkRXh0ZW5zaW9ucy5pbnNlcnQoc3RkOjpzdHJpbmcoZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKLSAgICBnUGx1Z2lucyA9IG5ld0xpc3Q7CiAgICAgZ1BsdWdpbnNSZWdpc3RlcmVkID0gdHJ1ZTsKIH0KIAorLy8gc3RhdGljCitzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgaWYgKGdldHVpZCgpID09IEFJRF9NRURJQV9FWCkgeworICAgICAgICByZXR1cm4gZ1N1cHBvcnRlZEV4dGVuc2lvbnM7CisgICAgfQorICAgIEFMT0dWKCJnZXQgc2VydmljZSBtYW5hZ2VyIik7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmV4dHJhY3RvciIpKTsKKworICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPiBtZWRpYUV4U2VydmljZShpbnRlcmZhY2VfY2FzdDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPihiaW5kZXIpKTsKKyAgICAgICAgcmV0dXJuIG1lZGlhRXhTZXJ2aWNlLT5nZXRTdXBwb3J0ZWRUeXBlcygpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPigpOworfQorCiBzdGF0dXNfdCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwogICAgIFN0cmluZzggb3V0OwpAQCAtMzM1LDEyICszNTQsMjUgQEAKICAgICAgICAgb3V0LmFwcGVuZCgiQXZhaWxhYmxlIGV4dHJhY3RvcnM6XG4iKTsKICAgICAgICAgaWYgKGdQbHVnaW5zUmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZ1BsdWdpbnMtPmJlZ2luKCk7IGl0ICE9IGdQbHVnaW5zLT5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiAgJTI1czogdXVpZCglcyksIHZlcnNpb24oJXUpLCBwYXRoKCVzKVxuIiwKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kRm9ybWF0KCIgICUyNXM6IHBsdWdpbl92ZXJzaW9uKCVkKSwgdXVpZCglcyksIHZlcnNpb24oJXUpLCBwYXRoKCVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmV4dHJhY3Rvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmRlZl92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPnV1aWRTdHJpbmcuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+bGliUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiLCBzdXBwb3J0czogIik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gKCppdCktPmRlZi51LnYzLnN1cHBvcnRlZF90eXBlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiVzICIsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuIik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb3V0LmFwcGVuZCgiICAobm8gcGx1Z2lucyByZWdpc3RlcmVkKVxuIik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKaW5kZXggOThmNTliNS4uOWJhMmFkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01Miw2ICs1Myw4IEBACiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZmQpOwogICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBtV3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIoZmQpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfT0dHKSB7CisgICAgICAgIG1Xcml0ZXIgPSBuZXcgT2dnV3JpdGVyKGZkKTsKICAgICB9CiAKICAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CkBAIC01OSw2ICs2Miw4IEBACiAgICAgICAgIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9IRUlGKSB7CiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGtleSB1c2VzIHJlY29yZGVyIGZpbGUgdHlwZXMuCiAgICAgICAgICAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9IRUlGKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9PR0cpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX09HRyk7CiAgICAgICAgIH0KICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVNvdXJjZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVRyYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWM5YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFUcmFjazo6TWVkaWFUcmFjaygpIHt9CisKK01lZGlhVHJhY2s6On5NZWRpYVRyYWNrKCkge30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0Tm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gdHJ1ZTsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJOb25CbG9ja2luZygpIHsKKyAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKK30KKworYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Ob25CbG9ja2luZzsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgeworICAgIG1PcHRpb25zIHw9IGtTZWVrVG9fT3B0aW9uOworICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKKyAgICBtU2Vla01vZGUgPSBtb2RlOworfQorCitib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXRTZWVrVG8oCisgICAgICAgIGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdCB7CisgICAgKnRpbWVfdXMgPSBtU2Vla1RpbWVVczsKKyAgICAqbW9kZSA9IG1TZWVrTW9kZTsKKyAgICByZXR1cm4gKG1PcHRpb25zICYga1NlZWtUb19PcHRpb24pICE9IDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tIHVud3JhcHBlciAtLS0tLS0tLS0tLS0tLS0gKi8KKworTWVkaWFUcmFja0NVbndyYXBwZXI6Ok1lZGlhVHJhY2tDVW53cmFwcGVyKENNZWRpYVRyYWNrICpjbWVkaWF0cmFjaykgeworICAgIHdyYXBwZXIgPSBjbWVkaWF0cmFjazsKKyAgICBidWZmZXJHcm91cCA9IG51bGxwdHI7Cit9CisKK01lZGlhVHJhY2tDVW53cmFwcGVyICpNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6Y3JlYXRlKENNZWRpYVRyYWNrICpjbWVkaWF0cmFjaykgeworICAgIGlmIChjbWVkaWF0cmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IE1lZGlhVHJhY2tDVW53cmFwcGVyKGNtZWRpYXRyYWNrKTsKK30KKworTWVkaWFUcmFja0NVbndyYXBwZXI6On5NZWRpYVRyYWNrQ1Vud3JhcHBlcigpIHsKKyAgICB3cmFwcGVyLT5mcmVlKHdyYXBwZXItPmRhdGEpOworICAgIGZyZWUod3JhcHBlcik7CisgICAgZGVsZXRlIGJ1ZmZlckdyb3VwOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3RhcnQoKSB7CisgICAgaWYgKGJ1ZmZlckdyb3VwID09IG51bGxwdHIpIHsKKyAgICAgICAgYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgIH0KKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3Iod3JhcHBlci0+c3RhcnQod3JhcHBlci0+ZGF0YSwgYnVmZmVyR3JvdXAtPndyYXAoKSkpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3RvcCgpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3Iod3JhcHBlci0+c3RvcCh3cmFwcGVyLT5kYXRhKSk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICp0bXBGb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gd3JhcHBlci0+Z2V0Rm9ybWF0KHdyYXBwZXItPmRhdGEsIHRtcEZvcm1hdCk7CisgICAgc3A8TWV0YURhdGE+IG5ld01ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobXNnLCBuZXdNZXRhKTsKKyAgICBkZWxldGUgdG1wRm9ybWF0OworICAgIGZvcm1hdCA9ICpuZXdNZXRhOworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6cmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisKKyAgICB1aW50MzJfdCBvcHRzID0gMDsKKworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkpIHsKKyAgICAgICAgb3B0cyB8PSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpOT05CTE9DS0lORzsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNlZWtQb3NpdGlvbiA9IDA7CisgICAgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1Bvc2l0aW9uLCAmc2Vla01vZGUpKSB7CisgICAgICAgIG9wdHMgfD0gU0VFSzsKKyAgICAgICAgb3B0cyB8PSAodWludDMyX3QpIHNlZWtNb2RlOworICAgIH0KKyAgICBDTWVkaWFCdWZmZXIgKmJ1ZiA9IG51bGxwdHI7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gd3JhcHBlci0+cmVhZCh3cmFwcGVyLT5kYXRhLCAmYnVmLCBvcHRzLCBzZWVrUG9zaXRpb24pOworICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICpidWZmZXIgPSAoTWVkaWFCdWZmZXJCYXNlKilidWYtPmhhbmRsZTsKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gKCpidWZmZXIpLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBidWYtPm1ldGFfZGF0YShidWYtPmhhbmRsZSk7CisgICAgICAgIC8vIG9ubHkgY29udmVydCB0aGUga2V5cyB3ZSdyZSBhY3R1YWxseSBleHBlY3RpbmcsIGFzIGRvaW5nCisgICAgICAgIC8vIHRoZSBmdWxsIGNvbnZlcnRNZXNzYWdlVG9NZXRhZGF0YSgpIGZvciBldmVyeSBidWZmZXIgaXMKKyAgICAgICAgLy8gdG9vIGV4cGVuc2l2ZQorICAgICAgICBpbnQ2NF90IHZhbDY0OworICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoInRpbWVVcyIsICZ2YWw2NCkpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleVRpbWUsIHZhbDY0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NCgidGFyZ2V0LXRpbWUiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlUYXJnZXRUaW1lLCB2YWw2NCk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCB2YWwzMjsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJpcy1zeW5jLWZyYW1lIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoInRlbXBvcmFsLWxheWVyLWlkIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1jb3VudCIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1tb2RlIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJjcnlwdG8tc2tpcC1ieXRlLWJsb2NrIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigidmFsaWQtc2FtcGxlcyIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbGJ1ZjsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLXBsYWluLXNpemVzIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8ta2V5IiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8taXYiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigic2VpIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5U0VJLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJhdWRpby1wcmVzZW50YXRpb24taW5mbyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworYm9vbCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsKKyAgICByZXR1cm4gd3JhcHBlci0+c3VwcG9ydHNOb25CbG9ja2luZ1JlYWQod3JhcHBlci0+ZGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwCmluZGV4IDA0ZjZhZGUuLmRiYzI4N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwCkBAIC0xNiwxNSArMTYsMjUgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZXRhRGF0YVV0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIGludDMyX3Qgd2lkdGg7CiAgICAgaW50MzJfdCBoZWlnaHQ7CiAgICAgaW50MzJfdCBzYXJXaWR0aDsKQEAgLTQ2LDIxICs1Niw4NiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1ldGEgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3Qgc2FyV2lkdGg7CisgICAgaW50MzJfdCBzYXJIZWlnaHQ7CisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKCh2b2lkKilkYXRhLCAgc2l6ZSk7CisgICAgc3A8QUJ1ZmZlcj4gY3NkID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFjY2Vzc1VuaXQsICZ3aWR0aCwgJmhlaWdodCwgJnNhcldpZHRoLCAmc2FySGVpZ2h0KTsKKyAgICBpZiAoY3NkID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCB3aWR0aCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBoZWlnaHQpOworICAgIGlmIChzYXJXaWR0aCA+IDAgJiYgc2FySGVpZ2h0ID4gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEgsIHNhcldpZHRoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCwgc2FySGVpZ2h0KTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoZGF0YSA9PSBudWxscHRyIHx8IHNpemUgPCA3KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBQml0UmVhZGVyIGJpdHMoZGF0YSwgc2l6ZSk7CisKKyAgICAvLyBhZHRzX2ZpeGVkX2hlYWRlcgorCisgICAgaWYgKGJpdHMuZ2V0Qml0cygxMikgIT0gMHhmZmZ1KSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBhdGRzX2ZpeGVkX2hlYWRlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYml0cy5za2lwQml0cyg0KTsgIC8vIElELCBsYXllciwgcHJvdGVjdGlvbl9hYnNlbnQKKworICAgIHVuc2lnbmVkIHByb2ZpbGUgPSBiaXRzLmdldEJpdHMoMik7CisgICAgaWYgKHByb2ZpbGUgPT0gM3UpIHsKKyAgICAgICAgQUxPR0UoInByb2ZpbGUgc2hvdWxkIG5vdCBiZSAzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCA9IGJpdHMuZ2V0Qml0cyg0KTsKKyAgICBiaXRzLmdldEJpdHMoMSk7ICAvLyBwcml2YXRlX2JpdAorICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICBpZiAoY2hhbm5lbF9jb25maWd1cmF0aW9uID09IDB1KSB7CisgICAgICAgIEFMT0dFKCJjaGFubmVsX2NvbmZpZyBzaG91bGQgbm90IGJlIDAiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgbWV0YSwgcHJvZmlsZSwgc2FtcGxpbmdfZnJlcV9pbmRleCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWV0YS5zZXRJbnQzMihrS2V5SXNBRFRTLCB0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKLSAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKLSAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisgICAgICAgIHVpbnQ4X3QgKmNzZCwgLyogb3V0ICovCisgICAgICAgIHNpemVfdCAqZXNkc19zaXplLCAvKiBpbi9vdXQgKi8KKyAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgLyogaW4gKi8KKyAgICAgICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwgLyogaW4gKi8KKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uLCAvKiBpbiAqLworICAgICAgICBpbnQzMl90ICpzYW1wbGluZ19yYXRlIC8qIG91dCAqLworKSB7CiAgICAgaWYoc2FtcGxpbmdfZnJlcV9pbmRleCA+IDExdSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7CiAgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKICAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAogICAgIH07Ci0gICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07Ci0gICAgY2hhbm5lbENvdW50ID0gY2hhbm5lbF9jb25maWd1cmF0aW9uOworICAgICpzYW1wbGluZ19yYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKIAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGF0aWNFU0RTW10gPSB7CiAgICAgICAgIDB4MDMsIDIyLApAQCAtODMsNyArMTU4LDkgQEAKICAgICB9OwogCiAgICAgc2l6ZV90IGNzZFNpemUgPSBzaXplb2Yoa1N0YXRpY0VTRFMpICsgMjsKLSAgICB1aW50OF90ICpjc2QgPSBuZXcgdWludDhfdFtjc2RTaXplXTsKKyAgICBpZiAoY3NkU2l6ZSA+ICplc2RzX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBtZW1jcHkoY3NkLCBrU3RhdGljRVNEUywgc2l6ZW9mKGtTdGF0aWNFU0RTKSk7CiAKICAgICBjc2Rbc2l6ZW9mKGtTdGF0aWNFU0RTKV0gPQpAQCAtOTIsMTQgKzE2OSwxOTggQEAKICAgICBjc2Rbc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDFdID0KICAgICAgICAgKChzYW1wbGluZ19mcmVxX2luZGV4IDw8IDcpICYgMHg4MCkgfCAoY2hhbm5lbF9jb25maWd1cmF0aW9uIDw8IDMpOwogCisgICAgKmVzZHNfc2l6ZSA9IGNzZFNpemU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisKKyAgICBpZihzYW1wbGluZ19mcmVxX2luZGV4ID4gMTF1KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90IGNzZFsyXTsKKyAgICBjc2RbMF0gPSAoKHByb2ZpbGUgKyAxKSA8PCAzKSB8IChzYW1wbGluZ19mcmVxX2luZGV4ID4+IDEpOworICAgIGNzZFsxXSA9ICgoc2FtcGxpbmdfZnJlcV9pbmRleCA8PCA3KSAmIDB4ODApIHwgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA8PCAzKTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtTYW1wbGluZ0ZyZXFbXSA9IHsKKyAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAorICAgICAgICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwCisgICAgfTsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOworCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjc2QsIHNpemVvZihjc2QpKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pIHsKKworICAgIHVpbnQ4X3QgY3NkWzI0XTsKKyAgICBzaXplX3QgY3NkU2l6ZSA9IHNpemVvZihjc2QpOworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKworICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKGNzZCwgJmNzZFNpemUsIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgICAgICBjaGFubmVsX2NvbmZpZ3VyYXRpb24sICZzYW1wbGVSYXRlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKIAogICAgIG1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwotICAgIG1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKLQorICAgIG1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKICAgICBtZXRhLnNldERhdGEoa0tleUVTRFMsIDAsIGNzZCwgY3NkU2l6ZSk7Ci0gICAgZGVsZXRlIFtdIGNzZDsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorCitzdGF0aWMgdm9pZCBleHRyYWN0QWxidW1BcnQoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoImV4dHJhY3RBbGJ1bUFydCBmcm9tICclcyciLCAoY29uc3QgY2hhciAqKWRhdGEpOworCisgICAgc2l6ZV90IGluTGVuID0gc3RybmxlbigoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOworICAgIHNpemVfdCBmbGFjU2l6ZSA9IGluTGVuIC8gNCAqIDM7CisgICAgdWludDhfdCAqZmxhYyA9IG5ldyB1aW50OF90W2ZsYWNTaXplXTsKKyAgICBpZiAoIWRlY29kZUJhc2U2NChmbGFjLCAmZmxhY1NpemUsIChjb25zdCBjaGFyKilkYXRhKSkgeworICAgICAgICBBTE9HRSgibWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGRhdGEuIik7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiZ290IGZsYWMgb2Ygc2l6ZSAlenUiLCBmbGFjU2l6ZSk7CisKKyAgICB1aW50MzJfdCBwaWNUeXBlOworICAgIHVpbnQzMl90IHR5cGVMZW47CisgICAgdWludDMyX3QgZGVzY0xlbjsKKyAgICB1aW50MzJfdCBkYXRhTGVuOworICAgIGNoYXIgdHlwZVsxMjhdOworCisgICAgaWYgKGZsYWNTaXplIDwgOCkgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGljVHlwZSA9IFUzMl9BVChmbGFjKTsKKworICAgIGlmIChwaWNUeXBlICE9IDMpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBmcm9udCBjb3Zlci4KKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVMZW4gPSBVMzJfQVQoJmZsYWNbNF0pOworICAgIGlmICh0eXBlTGVuID4gc2l6ZW9mKHR5cGUpIC0gMSkgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgZmxhY1NpemUgPj0gOAorICAgIGlmIChmbGFjU2l6ZSAtIDggPCB0eXBlTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtZW1jcHkodHlwZSwgJmZsYWNbOF0sIHR5cGVMZW4pOworICAgIHR5cGVbdHlwZUxlbl0gPSAnXDAnOworCisgICAgQUxPR1YoInBpY1R5cGUgPSAlZCwgdHlwZSA9ICclcyciLCBwaWNUeXBlLCB0eXBlKTsKKworICAgIGlmICghc3RyY21wKHR5cGUsICItLT4iKSkgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBpbmxpbmUgY292ZXIgYXJ0LCBidXQgYW4gZXh0ZXJuYWwgdXJsIGluc3RlYWQuCisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZmxhY1NpemUgPCAzMiB8fCBmbGFjU2l6ZSAtIDMyIDwgdHlwZUxlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGVzY0xlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbl0pOworICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiA8IGRlc2NMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRhdGFMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDE2XSk7CisKKyAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuKSA+PSAwCisgICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiA8IGRhdGFMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJnb3QgaW1hZ2UgZGF0YSwgJXp1IHRyYWlsaW5nIGJ5dGVzIiwKKyAgICAgICAgIGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiAtIGRhdGFMZW4pOworCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihmaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKKyAgICAgICAgICAgICZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAyMF0sIGRhdGFMZW4pOworCisgICAgZGVsZXRlW10gZmxhYzsKK30KKwordm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKSB7CisgICAgLy8gSGFwdGljIHRhZyBpcyBvbmx5IGtlcHQgaGVyZSBhcyBpdCB3aWxsIG9ubHkgYmUgdXNlZCBpbiBleHRyYWN0b3IgdG8gZ2VuZXJhdGUgY2hhbm5lbCBtYXNrLgorICAgIGNvbnN0IGNoYXIqIGNvbnN0IGhhcHRpYyA9ICJoYXB0aWMiOworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1UYWc7CisgICAgICAgIGNvbnN0IGNoYXIgKm1LZXk7CisgICAgfSBrTWFwW10gPSB7CisgICAgICAgIHsgIlRJVExFIiwgQU1FRElBRk9STUFUX0tFWV9USVRMRSB9LAorICAgICAgICB7ICJBUlRJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCB9LAorICAgICAgICB7ICJBTEJVTUFSVElTVCIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgfSwKKyAgICAgICAgeyAiQUxCVU0gQVJUSVNUIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCB9LAorICAgICAgICB7ICJDT01QSUxBVElPTiIsIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gfSwKKyAgICAgICAgeyAiQUxCVU0iLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNIH0sCisgICAgICAgIHsgIkNPTVBPU0VSIiwgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiB9LAorICAgICAgICB7ICJHRU5SRSIsIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgfSwKKyAgICAgICAgeyAiQVVUSE9SIiwgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgfSwKKyAgICAgICAgeyAiVFJBQ0tOVU1CRVIiLCBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgfSwKKyAgICAgICAgeyAiRElTQ05VTUJFUiIsIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiB9LAorICAgICAgICB7ICJEQVRFIiwgQU1FRElBRk9STUFUX0tFWV9EQVRFIH0sCisgICAgICAgIHsgIllFQVIiLCBBTUVESUFGT1JNQVRfS0VZX1lFQVIgfSwKKyAgICAgICAgeyAiTFlSSUNJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUIH0sCisgICAgICAgIHsgIk1FVEFEQVRBX0JMT0NLX1BJQ1RVUkUiLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUIH0sCisgICAgICAgIHsgIkFORFJPSURfTE9PUCIsIEFNRURJQUZPUk1BVF9LRVlfTE9PUCB9LAorICAgICAgICB7ICJBTkRST0lEX0hBUFRJQyIsIGhhcHRpYyB9LAorICAgIH07CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7ICsraikgeworICAgICAgICAgICAgc2l6ZV90IHRhZ0xlbiA9IHN0cmxlbihrTWFwW2pdLm1UYWcpOworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChrTWFwW2pdLm1UYWcsIGNvbW1lbnQsIHRhZ0xlbikKKyAgICAgICAgICAgICAgICAgICAgJiYgY29tbWVudFt0YWdMZW5dID09ICc9JykgeworICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCkgeworICAgICAgICAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1lbnRbdGFnTGVuICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExlbmd0aCAtIHRhZ0xlbiAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IEFNRURJQUZPUk1BVF9LRVlfTE9PUCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoJmNvbW1lbnRbdGFnTGVuICsgMV0sICJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9MT09QLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IGhhcHRpYykgeworICAgICAgICAgICAgICAgICAgICBjaGFyICplbmQ7CisgICAgICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGhhcHRpY0NoYW5uZWxDb3VudCA9IHN0cnRvbCgmY29tbWVudFt0YWdMZW4gKyAxXSwgJmVuZCwgMTApOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZpbGVNZXRhLCBoYXB0aWMsIGhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IoJWQpIHdoZW4gcGFyc2luZyBoYXB0aWMgY2hhbm5lbCBjb3VudCIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZmlsZU1ldGEsIGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCBhMWQzNGZjLi41MjJjODFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTI1Niw2ICsyNTYsMTAgQEAKICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiB9CiAKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpjbG9zZSgpIHsKKyAgICBkaXNjb25uZWN0KCk7Cit9CisKIHZvaWQgTnVDYWNoZWRTb3VyY2UyOjpkaXNjb25uZWN0KCkgewogICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7CiAgICAgICAgIEFMT0dWKCJkaXNjb25uZWN0aW5nIEhUVFBCYXNlZFNvdXJjZSIpOwpAQCAtNTY3LDEyICs1NzEsMTkgQEAKICAgICByZXR1cm4gbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKTsKIH0KIAotc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGFwcHJveERhdGFSZW1haW5pbmdfbChmaW5hbFN0YXR1cyk7CisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICpzaXplID0gYXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZnNldCwgJmZpbmFsU3RhdHVzKTsKKyAgICByZXR1cm4gZmluYWxTdGF0dXM7CiB9CiAKLXNpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmdfbChzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmcoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gYXBwcm94RGF0YVJlbWFpbmluZ19sKG1MYXN0QWNjZXNzUG9zLCBmaW5hbFN0YXR1cyk7Cit9CisKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmdfbChvZmY2NF90IG9mZnNldCwgc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CiAgICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOwogCiAgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSyAmJiBtTnVtUmV0cmllc0xlZnQgPiAwKSB7CkBAIC01ODAsOSArNTkxLDEwIEBACiAgICAgICAgICpmaW5hbFN0YXR1cyA9IE9LOwogICAgIH0KIAorICAgIG9mZnNldCA9IG9mZnNldCA+PSAwID8gb2Zmc2V0IDogbUxhc3RBY2Nlc3NQb3M7CiAgICAgb2ZmNjRfdCBsYXN0Qnl0ZVBvc0NhY2hlZCA9IG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCk7Ci0gICAgaWYgKG1MYXN0QWNjZXNzUG9zIDwgbGFzdEJ5dGVQb3NDYWNoZWQpIHsKLSAgICAgICAgcmV0dXJuIGxhc3RCeXRlUG9zQ2FjaGVkIC0gbUxhc3RBY2Nlc3NQb3M7CisgICAgaWYgKG9mZnNldCA8IGxhc3RCeXRlUG9zQ2FjaGVkKSB7CisgICAgICAgIHJldHVybiBsYXN0Qnl0ZVBvc0NhY2hlZCAtIG9mZnNldDsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDQ5ZWI1ZTkuLjgzYjg3ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMSwxMCArMjEsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgotI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zNCw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMjA1LDE1ICsyMDQsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6dXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCkgewogICAgIGlmIChtSW1wbC0+Y291bnRUcmFja3MoKSA+IGtNYXhUcmFja0NvdW50KSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTc5MCwxNiArNzgwLDEyIEBACiAgICAgICAgIGludDY0X3QgKmR1cmF0aW9uVXMsIGJvb2wgKmVvcykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKKyAgICBvZmY2NF90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplKC0xLCAmY2FjaGVkRGF0YVJlbWFpbmluZyk7CisKICAgICBpbnQ2NF90IGJpdHJhdGU7Ci0gICAgaWYgKChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKQorICAgIGlmIChjYWNoZWREYXRhUmVtYWluaW5nID49IDAKICAgICAgICAgICAgICYmIGdldFRvdGFsQml0cmF0ZSgmYml0cmF0ZSkpIHsKLSAgICAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBjYWNoZWRTb3VyY2UgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKLQotICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLSAgICAgICAgc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPQotICAgICAgICAgICAgY2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7Ci0KICAgICAgICAgKmR1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKICAgICAgICAgKmVvcyA9IChmaW5hbFN0YXR1cyAhPSBPSyk7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODA4LDQgKzc5NCwzNiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorLy8gUmV0dXJuIE9LIGlmIHdlIGhhdmUgcmVjZWl2ZWQgYW4gYXVkaW8gcHJlc2VudGF0aW9uIGluZm8uCisvLyBSZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTSBpZiBubyB0cmFja3MgYXJlIGF2YWlsYWJsZS4KKy8vIFJldHVybiBFUlJPUl9VTlNVUFBPUlRFRCBpZiB0aGUgdHJhY2sgaGFzIG5vIGF1ZGlvIHByZXNlbnRhdGlvbi4KKy8vIFJldHVybiBJTlZBTElEX09QRVJBVElPTiBpZiBhdWRpbyBwcmVzZW50YXRpb24gbWV0YWRhdGEgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaC4KK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmdldEF1ZGlvUHJlc2VudGF0aW9ucygKKyAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoQWxsVHJhY2tTYW1wbGVzKCk7CisgICAgaWYgKG1pbkluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2VsZWN0ZWRUcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvLT5tVHJhY2tJbmRleCA9PSB0cmFja0luZGV4KSB7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YShpbmZvLT5tU2FtcGxlcy5iZWdpbigpLT5tQnVmZmVyLT5tZXRhX2RhdGEoKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMICYmIG1ldGEtPmZpbmREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIGluU3RyZWFtKHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgc2l6ZSkpOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucygmaW5TdHJlYW0sIHByZXNlbnRhdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIlRyYWNrICV6dSBkb2VzIG5vdCBjb250YWluIGFueSBhdWRpbyBwcmVzZW50YXRpb24iLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiU291cmNlIGRvZXMgbm90IGNvbnRhaW4gYW55IGF1ZGlvIHByZXNlbnRhdGlvbiIpOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiODdiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPZ2dXcml0ZXIiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPG9nZy9vZ2cuaD4KK30KKworLy8gc3RvcmUgdGhlIGludDMyIHZhbHVlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVpbnQoY2hhciAqYnVmLCBpbnQgYmFzZSwgaW50MzJfdCB2YWwpIHsKKyAgICBidWZbYmFzZSArIDNdID0gKCh2YWwpID4+IDI0KSAmIDB4ZmY7CisgICAgYnVmW2Jhc2UgKyAyXSA9ICgodmFsKSA+PiAxNikgJiAweGZmOworICAgIGJ1ZltiYXNlICsgMV0gPSAoKHZhbCkgPj4gOCkgJiAweGZmOworICAgIGJ1ZltiYXNlXSA9ICh2YWwpJjB4ZmY7Cit9CisKKy8vIGxpbmthZ2UgYmV0d2VlbiBvdXIgaGVhZGVyIE9nZ1N0cmVhbVN0YXRlIGFuZCB0aGUgdW5kZXJseWluZyBvZ2dfc3RyZWFtX3N0YXRlCisvLyBzbyB0aGF0IGNvbnN1bWVycyBvZiBvdXIgaW50ZXJmYWNlIGRvIG5vdCByZXF1aXJlIHRoZSBvZ2cgaGVhZGVycyB0aGVtc2VsdmVzLgorc3RydWN0IE9nZ1N0cmVhbVN0YXRlIDogcHVibGljIG9nZ19zdHJlYW1fc3RhdGUge307CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworT2dnV3JpdGVyOjpPZ2dXcml0ZXIoaW50IGZkKQorICAgICAgOiBtRmQoZHVwKGZkKSksCisgICAgICAgIG1Jbml0Q2hlY2sobUZkIDwgMCA/IE5PX0lOSVQgOiBPSykgeworICAgIC8vIGVtcHR5Cit9CisKK09nZ1dyaXRlcjo6fk9nZ1dyaXRlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICBpZiAobUZkICE9IC0xKSB7CisgICAgICAgIGNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgIH0KKworICAgIGZyZWUobU9zKTsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBTdXBwb3J0IGlzIGxpbWl0ZWQgdG8gc2luZ2xlIHRyYWNrIG9mIE9wdXMgYXVkaW8uCisgICAgY29uc3QgY2hhciogbWltZTsKKyAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBjb25zdCBjaGFyKiBvcHVzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUzsKKyAgICBpZiAoc3RybmNhc2VjbXAobWltZSwgb3B1cywgc3RybGVuKG9wdXMpKSkgeworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzIGlzIG5vdCBzdXBwb3J0ZWQiLCBtaW1lLCBvcHVzKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIG1PcyA9IChPZ2dTdHJlYW1TdGF0ZSopIG1hbGxvYyhzaXplb2Yob2dnX3N0cmVhbV9zdGF0ZSkpOworICAgIGlmIChvZ2dfc3RyZWFtX2luaXQoKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgcmFuZCgpKSA9PSAtMSkgeworICAgICAgICBBTE9HRSgib2dnIHN0cmVhbSBpbml0IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBPZ2cgaGVhZGVycy4KKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDA7CisgICAgaWYgKCFzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykpIHsKKyAgICAgICAgQUxPR0UoIk1pc3NpbmcgZm9ybWF0IGtleXMgZm9yIGF1ZGlvIHRyYWNrIik7CisgICAgICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmR1bXBUb0xvZygpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IDA7CisgICAgaWYgKCFzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBmb3JtYXQga2V5IGZvciBzYW1wbGUgcmF0ZSIpOworICAgICAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqaGVhZGVyX2RhdGE7CisgICAgc2l6ZV90IHBhY2tldF9zaXplOworICAgIGlmICghc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZERhdGEoa0tleU9wdXNIZWFkZXIsICZ0eXBlLCAmaGVhZGVyX2RhdGEsICZwYWNrZXRfc2l6ZSkpIHsKKyAgICAgICAgQUxPR0UoIm9wdXMgaGVhZGVyIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBvZ2dfcGFja2V0IG9wOworICAgIG9nZ19wYWdlIG9nOworICAgIG9wLnBhY2tldCA9ICh1bnNpZ25lZCBjaGFyICopaGVhZGVyX2RhdGE7CisgICAgb3AuYnl0ZXMgPSBwYWNrZXRfc2l6ZTsKKyAgICBvcC5iX29fcyA9IDE7CisgICAgb3AuZV9vX3MgPSAwOworICAgIG9wLmdyYW51bGVwb3MgPSAwOworICAgIG9wLnBhY2tldG5vID0gMDsKKyAgICBvZ2dfc3RyZWFtX3BhY2tldGluKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvcCk7CisKKyAgICBpbnQgcmV0OworICAgIHdoaWxlICgocmV0ID0gb2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpKSkgeworICAgICAgICBpZiAoIXJldCkgYnJlYWs7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgfQorCisKKyAgICBjb25zdCBjaGFyKiB2ZW5kb3Jfc3RyaW5nID0gImxpYm9wdXMiOworICAgIGNvbnN0IGludCB2ZW5kb3JfbGVuZ3RoID0gc3RybGVuKHZlbmRvcl9zdHJpbmcpOworICAgIGludCB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGggPSAwOworCisgICAgY29uc3QgaW50IGNvbW1lbnRzX2xlbmd0aCA9IDggKyA0ICsgdmVuZG9yX2xlbmd0aCArIDQgKyB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGg7CisgICAgY2hhciogY29tbWVudHMgPSAoY2hhciopbWFsbG9jKGNvbW1lbnRzX2xlbmd0aCk7CisgICAgaWYgKGNvbW1lbnRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBhbGxvY2F0ZSBvZ2cgY29tbWVudCBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1lbWNweShjb21tZW50cywgIk9wdXNUYWdzIiwgOCk7CisgICAgd3JpdGVpbnQoY29tbWVudHMsIDgsIHZlbmRvcl9sZW5ndGgpOworICAgIG1lbWNweShjb21tZW50cyArIDEyLCB2ZW5kb3Jfc3RyaW5nLCB2ZW5kb3JfbGVuZ3RoKTsKKyAgICB3cml0ZWludChjb21tZW50cywgMTIgKyB2ZW5kb3JfbGVuZ3RoLCB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGgpOworCisgICAgb3AucGFja2V0ID0gKHVuc2lnbmVkIGNoYXIqKWNvbW1lbnRzOworICAgIG9wLmJ5dGVzID0gY29tbWVudHNfbGVuZ3RoOworICAgIG9wLmJfb19zID0gMDsKKyAgICBvcC5lX29fcyA9IDA7CisgICAgb3AuZ3JhbnVsZXBvcyA9IDA7CisgICAgb3AucGFja2V0bm8gPSAxOworICAgIG9nZ19zdHJlYW1fcGFja2V0aW4oKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9wKTsKKworICAgIHdoaWxlICgocmV0ID0gb2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpKSkgeworICAgICAgICBpZiAoIXJldCkgYnJlYWs7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgfQorCisgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICBmcmVlKGNvbW1lbnRzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6c3RhcnQoTWV0YURhdGEqIC8qIHBhcmFtcyAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkICYmIG1QYXVzZWQpIHsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICBtUmVzdW1lZCA9IHRydWU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIC8vIEFscmVhZHkgc3RhcnRlZCwgZG9lcyBub3RoaW5nCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworCisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRG9uZSA9IGZhbHNlOworCisgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBUaHJlYWRXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6cGF1c2UoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG1QYXVzZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjpyZXNldCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtRG9uZSA9IHRydWU7CisKKyAgICB2b2lkKiBkdW1teTsKKyAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKKworICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKKyAgICB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSyAmJiAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gZXJyOworfQorCitib29sIE9nZ1dyaXRlcjo6ZXhjZWVkc0ZpbGVTaXplTGltaXQoKSB7CisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkU2l6ZUJ5dGVzID4gbU1heEZpbGVTaXplTGltaXRCeXRlczsKK30KKworYm9vbCBPZ2dXcml0ZXI6OmV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkRHVyYXRpb25VcyA+IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzOworfQorCisvLyBzdGF0aWMKK3ZvaWQqIE9nZ1dyaXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkKiBtZSkgeworICAgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCkgc3RhdGljX2Nhc3Q8T2dnV3JpdGVyKj4obWUpLT50aHJlYWRGdW5jKCk7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6dGhyZWFkRnVuYygpIHsKKyAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFNpemVCeXRlcyA9IDA7CisgICAgYm9vbCBzdG9wcGVkUHJlbWF0dXJlbHkgPSB0cnVlOworICAgIGludDY0X3QgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gMDsKKyAgICBpbnQ2NF90IG1heFRpbWVzdGFtcFVzID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiT2dnV3JpdGVyIiwgMCwgMCwgMCk7CisKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSogYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHJlYWQgbmV4dCBidWZmZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIEFMT0dXKCJlc3RpbWF0ZWQgc2l6ZSglIiBQUklkNjQgIikgZXhjZWVkcyBsaW1pdCAoJSIgUFJJZDY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMsIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGlzQ29kZWNTcGVjaWZpYzsKKyAgICAgICAgaWYgKChidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmlzQ29kZWNTcGVjaWZpYykKKyAgICAgICAgICAgICAmJiBpc0NvZGVjU3BlY2lmaWMpCisgICAgICAgICAgICB8fCBJc09wdXNIZWFkZXIoKHVpbnQ4X3QqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKSkgeworICAgICAgICAgICAgQUxPR1YoIkRyb3AgY29kZWMgc3BlY2lmaWMgaW5mbyBidWZmZXIiKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtRXN0aW1hdGVkRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUVzdGltYXRlZER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJlc3VtZWQpIHsKKyAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSAodGltZXN0YW1wVXMgLSBtYXhUaW1lc3RhbXBVcyAtIDIwMDAwKTsKKyAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisKKyAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICUiIFBSSWQ2NCwgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1heFRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBtYXhUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBBTE9HVygiZXN0aW1hdGVkIGR1cmF0aW9uKCUiIFBSSWQ2NCAiIHVzKSBleGNlZWRzIGxpbWl0KCUiIFBSSWQ2NCAiIHVzKSIsCisgICAgICAgICAgICAgICAgICBtRXN0aW1hdGVkRHVyYXRpb25VcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvZ2dfcGFja2V0IG9wOworICAgICAgICBvZ2dfcGFnZSBvZzsKKyAgICAgICAgb3AucGFja2V0ID0gKHVpbnQ4X3QqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgb3AuYnl0ZXMgPSAobG9uZylidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBvcC5iX29fcyA9IDA7CisgICAgICAgIG9wLmVfb19zID0gbVJlYWNoZWRFT1MgPyAxIDogMDsKKyAgICAgICAgLy8gZ3JhbnVsZXBvcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIFBDTSBhdWRpbyBzYW1wbGVzIEAgNDgga0h6LCB1cCB0byBhbmQKKyAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBjdXJyZW50IHBhY2tldC4KKyAgICAgICAgb2dnX2ludDY0X3QgZ3JhbnVsZXBvcyA9ICg0ODAwMCAqIG1Fc3RpbWF0ZWREdXJhdGlvblVzKSAvIDEwMDAwMDA7CisgICAgICAgIG9wLmdyYW51bGVwb3MgPSBncmFudWxlcG9zOworCisgICAgICAgIC8vIEhlYWRlcnMgYXJlIGF0IHBhY2tldHMgMCBhbmQgMS4KKyAgICAgICAgb3AucGFja2V0bm8gPSAyICsgKG9nZ19pbnQzMl90KW1DdXJyZW50UGFja2V0SWQrKzsKKyAgICAgICAgb2dnX3N0cmVhbV9wYWNrZXRpbigob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb3ApOworICAgICAgICBzaXplX3QgbiA9IDA7CisKKyAgICAgICAgd2hpbGUgKG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgICAgICAgICAgbiA9IG4gKyBvZy5oZWFkZXJfbGVuICsgb2cuYm9keV9sZW47CisgICAgICAgIH0KKworICAgICAgICBpZiAobiA8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX0lPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN0b3BwZWRQcmVtYXR1cmVseSA9IGZhbHNlOworCisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIGVuZCBvZiBzdHJlYW0gaXMgYW4gb2sgdGhpbmcKKyAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBPSyAmJiBzdG9wcGVkUHJlbWF0dXJlbHkpIHsKKyAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNsb3NlKG1GZCk7CisgICAgbUZkID0gLTE7CisgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworCisgICAgcmV0dXJuIGVycjsKK30KKworYm9vbCBPZ2dXcml0ZXI6OnJlYWNoZWRFT1MoKSB7CisgICAgcmV0dXJuIG1SZWFjaGVkRU9TOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCmluZGV4IDk2Yjg5NmIuLjg5MTA0NjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKQEAgLTIxLDggKzIxLDggQEAKICNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKICNlbmRpZgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgpAQCAtNTMsMTggKzUzLDEzIEBACiBuYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CiAKIGJvb2wgaGFzUHJlZml4KGNvbnN0IGhpZGxfc3RyaW5nJiBzLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKLSAgICByZXR1cm4gc3RybmNtcChzLmNfc3RyKCksIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDA7CisgICAgcmV0dXJuIHN0cm5jYXNlY21wKHMuY19zdHIoKSwgcHJlZml4LCBzdHJsZW4ocHJlZml4KSkgPT0gMDsKIH0KIAogc3RhdHVzX3QgcXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgIGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8mIG5vZGUsIGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wgaXNFbmNvZGVyLAorICAgICAgICBjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvJiBub2RlLCBjb25zdCBjaGFyKiBtZWRpYVR5cGUsIGJvb2wgaXNFbmNvZGVyLAogICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKiBjYXBzKSB7CiAgICAgc3A8QUNvZGVjPiBjb2RlYyA9IG5ldyBBQ29kZWMoKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+cXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBub2RlLm93bmVyLmNfc3RyKCksIG5vZGUubmFtZS5jX3N0cigpLCBtaW1lLCBpc0VuY29kZXIsIGNhcHMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9CiAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGUgOiBub2RlLmF0dHJpYnV0ZXMpIHsKICAgICAgICAgLy8gQWxsIGZlYXR1cmVzIGhhdmUgYW4gaW50MzIgdmFsdWUgZXhjZXB0CiAgICAgICAgIC8vICJmZWF0dXJlLWJpdHJhdGUtbW9kZXMiLCB3aGljaCBoYXMgYSBzdHJpbmcgdmFsdWUuCkBAIC04MSwxMiArNzYsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmtleS5jX3N0cigpLCBhdHRyaWJ1dGUudmFsdWUuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gcXVlcnkgY2FwYWJpbGl0aWVzIG1heSByZW1vdmUgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIG5vdCBhY3R1YWxseSBzdXBwb3J0ZWQgYnkgdGhlIGNvZGVjCisgICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPnF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgbm9kZS5vd25lci5jX3N0cigpLCBub2RlLm5hbWUuY19zdHIoKSwgbWVkaWFUeXBlLCBpc0VuY29kZXIsIGNhcHMpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCiB9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQogCi1PbXhJbmZvQnVpbGRlcjo6T214SW5mb0J1aWxkZXIoKSB7CitPbXhJbmZvQnVpbGRlcjo6T214SW5mb0J1aWxkZXIoYm9vbCBhbGxvd1N1cmZhY2VFbmNvZGVycykKKyAgICA6IG1BbGxvd1N1cmZhY2VFbmNvZGVycyhhbGxvd1N1cmZhY2VFbmNvZGVycykgewogfQogCiBzdGF0dXNfdCBPbXhJbmZvQnVpbGRlcjo6YnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSB7CkBAIC0xMzQsMTA3ICsxMzYsODcgQEAKICAgICAvLyBDb252ZXJ0IHJvbGVzIHRvIGxpc3RzIG9mIGNvZGVjcwogCiAgICAgLy8gY29kZWMgbmFtZSAtPiBpbmRleCBpbnRvIHN3Q29kZWNzL2h3Q29kZWNzCi0gICAgc3RkOjptYXA8aGlkbF9zdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4+Ci0gICAgICAgICAgICBzd0NvZGVjTmFtZTJJbmZvLCBod0NvZGVjTmFtZTJJbmZvOworICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+PiBjb2RlY05hbWUySW5mbzsKIAotICAgIGNoYXIgcmFua1tQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHVpbnQzMl90IGRlZmF1bHRSYW5rID0gMHgxMDA7Ci0gICAgaWYgKHByb3BlcnR5X2dldCgiZGVidWcuc3RhZ2VmcmlnaHQub214X2RlZmF1bHRfcmFuayIsIHJhbmssIG51bGxwdHIpKSB7Ci0gICAgICAgIGRlZmF1bHRSYW5rID0gc3RkOjpzdHJ0b3VsKHJhbmssIG51bGxwdHIsIDEwKTsKLSAgICB9CisgICAgdWludDMyX3QgZGVmYXVsdFJhbmsgPQorICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgiZGVidWcuc3RhZ2VmcmlnaHQub214X2RlZmF1bHRfcmFuayIsIDB4MTAwdSk7CisgICAgdWludDMyX3QgZGVmYXVsdFN3QXVkaW9SYW5rID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3Jhbmsuc3ctYXVkaW8iLCAweDEwdSk7CisgICAgdWludDMyX3QgZGVmYXVsdFN3T3RoZXJSYW5rID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3Jhbmsuc3ctb3RoZXIiLCAweDIxMHUpOworCiAgICAgZm9yIChjb25zdCBJT214U3RvcmU6OlJvbGVJbmZvJiByb2xlIDogcm9sZXMpIHsKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIHR5cGVOYW1lID0gcm9sZS50eXBlOwogICAgICAgICBib29sIGlzRW5jb2RlciA9IHJvbGUuaXNFbmNvZGVyOwotICAgICAgICBib29sIHByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlLnByZWZlclBsYXRmb3JtTm9kZXM7Ci0gICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgbXVzdCBiZSBhZGRlZCBhZnRlcgotICAgICAgICAvLyBwbGF0Zm9ybSAoc29mdHdhcmUpIG5vZGVzLiBod0NvZGVjcyBpcyB1c2VkIHRvIGhvbGQgaGFyZHdhcmUgbm9kZXMKLSAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIGFkZGVkIGFmdGVyIHNvZnR3YXJlIG5vZGVzIGZvciB0aGUgc2FtZSByb2xlLgotICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvKj4gaHdDb2RlY3M7Ci0gICAgICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyYgbm9kZSA6IHJvbGUubm9kZXMpIHsKKyAgICAgICAgYm9vbCBpc0F1ZGlvID0gaGFzUHJlZml4KHJvbGUudHlwZSwgImF1ZGlvLyIpOworICAgICAgICBib29sIGlzVmlkZW9PckltYWdlID0gaGFzUHJlZml4KHJvbGUudHlwZSwgInZpZGVvLyIpIHx8IGhhc1ByZWZpeChyb2xlLnR5cGUsICJpbWFnZS8iKTsKKworICAgICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8gJm5vZGUgOiByb2xlLm5vZGVzKSB7CiAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbm9kZU5hbWUgPSBub2RlLm5hbWU7CisKKyAgICAgICAgICAgIC8vIGN1cnJlbnRseSBpbWFnZSBhbmQgdmlkZW8gZW5jb2RlcnMgdXNlIHN1cmZhY2UgaW5wdXQKKyAgICAgICAgICAgIGlmICghbUFsbG93U3VyZmFjZUVuY29kZXJzICYmIGlzVmlkZW9PckltYWdlICYmIGlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJkaXNhYmxpbmcgJXMgZm9yIG1lZGlhIHR5cGUgJXMgYmVjYXVzZSB3ZSBhcmUgbm90IHVzaW5nIE9NWCBpbnB1dCBzdXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLmNfc3RyKCksIHJvbGUudHlwZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYm9vbCBpc1NvZnR3YXJlID0gaGFzUHJlZml4KG5vZGVOYW1lLCAiT01YLmdvb2dsZSIpOwotICAgICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIqIGluZm87Ci0gICAgICAgICAgICBpZiAoaXNTb2Z0d2FyZSkgewotICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gc3dDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYzJpID09IHN3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgICAgICBjMmkgPSBzd0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKGRlZmF1bHRSYW5rKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBNZWRpYUNvZGVjSW5mb1dyaXRlci4KLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXV0byBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjMmkgPT0gaHdDb2RlY05hbWUySW5mby5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gZm9yIGEgbmV3IG5vZGUuCi0gICAgICAgICAgICAgICAgICAgIGlmICghcHJlZmVyUGxhdGZvcm1Ob2RlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgYzJpID0gaHdDb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLm93bmVyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIHRoaXMgbm9kZSBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRlZCBhZnRlciBhbGwgc29mdHdhcmUgbm9kZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBod0NvZGVjcy5wdXNoX2JhY2soJm5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB1aW50MzJfdCByYW5rID0gaXNTb2Z0d2FyZQorICAgICAgICAgICAgICAgICAgICA/IChpc0F1ZGlvID8gZGVmYXVsdFN3QXVkaW9SYW5rIDogZGVmYXVsdFN3T3RoZXJSYW5rKQorICAgICAgICAgICAgICAgICAgICA6IGRlZmF1bHRSYW5rOworICAgICAgICAgICAgLy8gZ2V0IHJhbmsgZnJvbSBJT214U3RvcmUgdmlhIGF0dHJpYnV0ZQorICAgICAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6OkF0dHJpYnV0ZSYgYXR0cmlidXRlIDogbm9kZS5hdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5rZXkgPT0gInJhbmsiKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZFJhbmsgPSByYW5rOworICAgICAgICAgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKGF0dHJpYnV0ZS52YWx1ZS5jX3N0cigpLCAiJXUlYyIsICZyYW5rLCAmZHVtbXkpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmsgPSBvbGRSYW5rOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKKyAgICAgICAgICAgIGF1dG8gYzJpID0gY29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7CisgICAgICAgICAgICBpZiAoYzJpID09IGNvZGVjTmFtZTJJbmZvLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgorICAgICAgICAgICAgICAgIGMyaSA9IGNvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKKyAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLm93bmVyLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGluZm8tPnNldFJhbmsocmFuayk7CisKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcz46OnR5cGUgYXR0cnMgPSAwOworICAgICAgICAgICAgICAgIC8vIGFsbCBPTVggY29kZWNzIGFyZSB2ZW5kb3IgY29kZWNzIChpbiB0aGUgdmVuZG9yIHBhcnRpdGlvbiksIGJ1dAorICAgICAgICAgICAgICAgIC8vIHRyZWF0IE9NWC5nb29nbGUgY29kZWNzIGFzIG5vbi1oYXJkd2FyZS1hY2NlbGVyYXRlZCBhbmQgbm9uLXZlbmRvcgorICAgICAgICAgICAgICAgIGlmICghaXNTb2Z0d2FyZSkgeworICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1ZlbmRvcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLmJlZ2luKCksIG5vZGUuYXR0cmlidXRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBJT214U3RvcmU6OkF0dHJpYnV0ZSAmaSkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmtleSA9PSAiYXR0cmlidXRlOjpzb2Z0d2FyZS1jb2RlYyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzRW5jb2RlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby0+c2V0QXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCisgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQotICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNZWRpYVR5cGUodHlwZU5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICBpZiAocXVlcnlDYXBhYmlsaXRpZXMoCiAgICAgICAgICAgICAgICAgICAgIG5vZGUsIHR5cGVOYW1lLmNfc3RyKCksIGlzRW5jb2RlciwgY2Fwcy5nZXQoKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBhZGQgbWltZSAlcyB0byBjb2RlYyAlcyIsCisgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1lZGlhIHR5cGUgJXMgdG8gY29kZWMgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuY19zdHIoKSwgbm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgd2lsbCBub3QgaGF2ZSBiZWVuCi0gICAgICAgIC8vIGFkZGVkIGluIHRoZSBsb29wIGFib3ZlLCBidXQgcmF0aGVyIHNhdmVkIGluIGh3Q29kZWNzLiBUaGV5IGFyZQotICAgICAgICAvLyBnb2luZyB0byBiZSBhZGRlZCBoZXJlLgotICAgICAgICBpZiAocHJlZmVyUGxhdGZvcm1Ob2RlcykgewotICAgICAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvICpub2RlIDogaHdDb2RlY3MpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKLSAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbm9kZU5hbWUgPSBub2RlLT5uYW1lOwotICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgICAgICBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS0+b3duZXIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YWRkTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBpZiAocXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAqbm9kZSwgdHlwZU5hbWUuY19zdHIoKSwgaXNFbmNvZGVyLCBjYXBzLmdldCgpKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBhZGQgbWltZSAlcyB0byBjb2RlYyAlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlciBzb2Z0d2FyZSBjb2RlY3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZS5jX3N0cigpLCBub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWVkaWFUeXBlKHR5cGVOYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjQyLDQgKzIyNCwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA5ZDJjNDJiLi5iMGNlNjg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC00OSw3ICs0OSw3IEBACiAKICAgICBtQW5hbHl0aWNzSXRlbSA9IG51bGxwdHI7CiAgICAgaWYgKE1FRElBX0xPRykgewotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleUV4dHJhY3Rvcik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleUV4dHJhY3Rvcik7CiAKICAgICAgICAgLy8gdHJhY2sgdGhlIGNvbnRhaW5lciBmb3JtYXQgKG1wZWcsIGFhYywgd3ZtLCBldGMpCiAgICAgICAgIHNpemVfdCBudHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCmluZGV4IGQwN2FmZWMuLmRiMzFhZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKQEAgLTI1LDI1ICsyNSwyOSBAQAogICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtVHJhY2soc291cmNlKSwKICAgICAgIG1FeHRyYWN0b3JQbHVnaW4ocGx1Z2luKSB7fQogCiBSZW1vdGVNZWRpYVNvdXJjZTo6flJlbW90ZU1lZGlhU291cmNlKCkgewotICAgIGRlbGV0ZSBtU291cmNlOworICAgIGRlbGV0ZSBtVHJhY2s7CiAgICAgbUV4dHJhY3RvclBsdWdpbiA9IG51bGxwdHI7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBBTE9HVygiZHJvcHBpbmcgc3RhcnQgcGFyYW1ldGVyczoiKTsKKyAgICAgICAgcGFyYW1zLT5kdW1wVG9Mb2coKTsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICByZXR1cm4gbVRyYWNrLT5zdG9wKCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBSZW1vdGVNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7Ci0gICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgqbWV0YS5nZXQoKSkgPT0gT0spIHsKKyAgICBpZiAobVRyYWNrLT5nZXRGb3JtYXQoKm1ldGEuZ2V0KCkpID09IE9LKSB7CiAgICAgICAgIHJldHVybiBtZXRhOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTUxLDcgKzU1LDExIEBACiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqPihvcHRpb25zKSk7CisgICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworfQorCitib29sIFJlbW90ZU1lZGlhU291cmNlOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiBtVHJhY2stPnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnBhdXNlKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCmluZGV4IDQwNGM1MzcuLmJhYmRjN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKIAogY29uc3QgaW50NjRfdCBrVGltZW91dFdhaXRGb3JPdXRwdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlY29uZHMKIGNvbnN0IGludDY0X3Qga1RpbWVvdXRXYWl0Rm9ySW5wdXRVcyA9IDUwMDA7IC8vIDUgbWlsbGlzZWNvbmRzCitjb25zdCBpbnQga1RpbWVvdXRNYXhSZXRyaWVzID0gMjA7CiAKIC8vc3RhdGljCiBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKQEAgLTI0Miw3ICsyNDMsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICBmb3IgKGludCByZXRyaWVzID0gMDsgKytyZXRyaWVzOyApIHsKKyAgICBmb3IgKGludCByZXRyaWVzID0gMDsgcmV0cmllcyA8IGtUaW1lb3V0TWF4UmV0cmllczsgKytyZXRyaWVzKSB7CiAgICAgICAgIC8vIElmIHdlIGZpbGwgYWxsIGF2YWlsYWJsZSBpbnB1dCBidWZmZXJzLCB3ZSBzaG91bGQgZXhwZWN0IHRoYXQKICAgICAgICAgLy8gdGhlIGNvZGVjIHByb2R1Y2VzIGF0IGxlYXN0IG9uZSBvdXRwdXQgYnVmZmVyLiBBbHNvLCB0aGUgY29kZWMKICAgICAgICAgLy8gc2hvdWxkIHByb2R1Y2UgYW4gb3V0cHV0IGJ1ZmZlciBpbiBhdCBtb3N0IDEgc2Vjb25kcy4gUmV0cnkgYQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IGM2MjYwM2MuLmNmNGVkYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTM0LDI1ICszNSwxNiBAQAogCiBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6flN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKCkge30KIAotc3RhdGljIGJvb2wgRmlsZUhhc0FjY2VwdGFibGVFeHRlbnNpb24oY29uc3QgY2hhciAqZXh0ZW5zaW9uKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtWYWxpZEV4dGVuc2lvbnNbXSA9IHsKLSAgICAgICAgIi5tcDMiLCAiLm1wNCIsICIubTRhIiwgIi4zZ3AiLCAiLjNncHAiLCAiLjNnMiIsICIuM2dwcDIiLAotICAgICAgICAiLm1wZWciLCAiLm9nZyIsICIubWlkIiwgIi5zbWYiLCAiLmlteSIsICIud21hIiwgIi5hYWMiLAotICAgICAgICAiLndhdiIsICIuYW1yIiwgIi5taWRpIiwgIi54bWYiLCAiLnJ0dHRsIiwgIi5ydHgiLCAiLm90YSIsCi0gICAgICAgICIubWt2IiwgIi5ta2EiLCAiLndlYm0iLCAiLnRzIiwgIi5mbCIsICIuZmxhYyIsICIubXhtZiIsCi0gICAgICAgICIuYXZpIiwgIi5tcGVnIiwgIi5tcGciLCAiLmF3YiIsICIubXBnYSIsICIubW92IiwKLSAgICAgICAgIi5tNHYiLCAiLm9nYSIsICIubTRyIgotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtVmFsaWRFeHRlbnNpb25zID0KLSAgICAgICAgc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnMpIC8gc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnNbMF0pOworc3RhdGljIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ1N1cHBvcnRlZEV4dGVuc2lvbnM7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1WYWxpZEV4dGVuc2lvbnM7ICsraSkgewotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCBrVmFsaWRFeHRlbnNpb25zW2ldKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KK3N0YXRpYyBib29sIEZpbGVIYXNBY2NlcHRhYmxlRXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmV4dGVuc2lvbikgeworCisgICAgaWYgKGdTdXBwb3J0ZWRFeHRlbnNpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IGZyb20gdGhlIHNlcnZpY2UKKyAgICAgICAgZ1N1cHBvcnRlZEV4dGVuc2lvbnMgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdldFN1cHBvcnRlZFR5cGVzKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAgZ1N1cHBvcnRlZEV4dGVuc2lvbnMuY291bnQoc3RkOjpzdHJpbmcoZXh0ZW5zaW9uICsgMSkpICE9IDA7CiB9CiAKIE1lZGlhU2NhblJlc3VsdCBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6cHJvY2Vzc0ZpbGUoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDIxYWNjYWQuLmZhM2QzNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMjgxLDEyICsyODIsNiBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgaWYgKGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCkgewotICAgICAgICBBTE9HRSgiZnJhbWUgZ3JhYiBub3QgYWxsb3dlZC4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9VTktOT1dOOwotICAgIH0KLQogICAgIHNpemVfdCBuID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CkBAIC0zNTQsMTUgKzM0OSwxNSBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV07Ci0gICAgICAgIFZpZGVvRnJhbWVEZWNvZGVyIGRlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOwotICAgICAgICBpZiAoZGVjb2Rlci5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgeworICAgICAgICBzcDxWaWRlb0ZyYW1lRGVjb2Rlcj4gZGVjb2RlciA9IG5ldyBWaWRlb0ZyYW1lRGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSk7CisgICAgICAgIGlmIChkZWNvZGVyLT5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgewogICAgICAgICAgICAgaWYgKG91dEZyYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqb3V0RnJhbWUgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZSgpOworICAgICAgICAgICAgICAgICpvdXRGcmFtZSA9IGRlY29kZXItPmV4dHJhY3RGcmFtZSgpOwogICAgICAgICAgICAgICAgIGlmICgqb3V0RnJhbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRGcmFtZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXIuZXh0cmFjdEZyYW1lcyhvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXItPmV4dHJhY3RGcmFtZXMob3V0RnJhbWVzKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKaW5kZXggNTE5ZTg3MC4uYjkwNjQ5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KIAogI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgiCkBAIC0yNyw5ICsyOCwxNyBAQAogLyogc3RhdGljICovIE11dGV4IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpzTXV0ZXg7CiAvKiBzdGF0aWMgKi8gc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6c0luc3RhbmNlOwogCi1TdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkKLSAgICA6IG1DcmVhdGVDb2RlYyhudWxscHRyKSwKLSAgICAgIG1DcmVhdGVCdWlsZGVyKG51bGxwdHIpIHsKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworY29uc3RleHByIGNvbnN0IGNoYXIga0NDb2RlY1BsdWdpblBhdGhbXSA9ICJsaWJzZnBsdWdpbl9jY29kZWMuc28iOworCit9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkgeworICAgIGlmIChhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgiZGVidWcubWVkaWEuY29kZWMyIiwgMCkgPT0gMCkgeworICAgICAgICBBTE9HRCgiQ0NvZGVjIGlzIGRpc2FibGVkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKICAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5OiAlcyAoJXMpIiwgbGliUGF0aCwgZGxlcnJvcigpKTsKQEAgLTQ2LDcgKzU1LDcgQEAKICAgICB9CiAgICAgbUNyZWF0ZUlucHV0U3VyZmFjZSA9IChDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMpZGxzeW0oCiAgICAgICAgICAgICBtTGliSGFuZGxlLCAiQ3JlYXRlSW5wdXRTdXJmYWNlIik7Ci0gICAgaWYgKG1DcmVhdGVCdWlsZGVyID09IG51bGxwdHIpIHsKKyAgICBpZiAobUNyZWF0ZUlucHV0U3VyZmFjZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUlucHV0U3VyZmFjZSAoJXMpIiwgZGxlcnJvcigpKTsKICAgICB9CiB9CkBAIC04Nyw3ICs5Niw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNNdXRleCk7CiAgICAgaWYgKCFzSW5zdGFuY2UpIHsKICAgICAgICAgQUxPR1YoIkxvYWRpbmcgbGlicmFyeSIpOwotICAgICAgICBzSW5zdGFuY2UucmVzZXQobmV3IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKCJsaWJzdGFnZWZyaWdodF9jY29kZWMuc28iKSk7CisgICAgICAgIHNJbnN0YW5jZS5yZXNldChuZXcgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoa0NDb2RlY1BsdWdpblBhdGgpKTsKICAgICB9CiAgICAgcmV0dXJuIHNJbnN0YW5jZTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCmluZGV4IDk5OWQzMGMuLjc4ZWZmYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaApAQCAtNDAsMTAgKzQwLDEwIEBACiAgICAgc3RhdGljIE11dGV4IHNNdXRleDsKICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiBzSW5zdGFuY2U7CiAKLSAgICB2b2lkICptTGliSGFuZGxlOwotICAgIENvZGVjQmFzZTo6Q3JlYXRlQ29kZWNGdW5jIG1DcmVhdGVDb2RlYzsKLSAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYyBtQ3JlYXRlQnVpbGRlcjsKLSAgICBDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMgbUNyZWF0ZUlucHV0U3VyZmFjZTsKKyAgICB2b2lkICptTGliSGFuZGxle251bGxwdHJ9OworICAgIENvZGVjQmFzZTo6Q3JlYXRlQ29kZWNGdW5jIG1DcmVhdGVDb2RlY3tudWxscHRyfTsKKyAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYyBtQ3JlYXRlQnVpbGRlcntudWxscHRyfTsKKyAgICBDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMgbUNyZWF0ZUlucHV0U3VyZmFjZXtudWxscHRyfTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MThlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCAzMzYxNGQ2Li4yYWE5ZWQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgpAQCAtNzQsNyArNzUsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAmbXNnKSB7CitzdGF0aWMgdm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VDb2xvckFzcGVjdHMoY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIC8vIDAgdmFsdWVzIGFyZSB1bnNwZWNpZmllZAogICAgIGludDMyX3QgcmFuZ2UgPSAwOwogICAgIGludDMyX3QgcHJpbWFyaWVzID0gMDsKQEAgLTExOSw3ICsxMjAsOCBAQAogICAgIH0KIAogICAgIC8vIGlmIHVzZXIvY29udGFpbmVyIHN1cHBsaWVkIEhEUiBzdGF0aWMgaW5mbyB3aXRob3V0IHRyYW5zZmVyIHNldCwgYXNzdW1lIHRydWUKLSAgICBpZiAoZm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikgJiYgIWZvcm1hdC0+Y29udGFpbnMoImNvbG9yLXRyYW5zZmVyIikpIHsKKyAgICBpZiAoKGZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpIHx8IGZvcm1hdC0+Y29udGFpbnMoImhkcjEwLXBsdXMtaW5mbyIpKQorICAgICAgICAgICAgJiYgIWZvcm1hdC0+Y29udGFpbnMoImNvbG9yLXRyYW5zZmVyIikpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIC8vIG90aGVyd2lzZSwgdmVyaWZ5IHRoYXQgYW4gSERSIHRyYW5zZmVyIGZ1bmN0aW9uIGlzIHNldApAQCAtMTkwLDYgKzE5Miw5IEBACiAgICAgICAgIHsgNTAsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCiAgICAgICAgIHsgNTEsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCiAgICAgICAgIHsgNTIsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisgICAgICAgIHsgNjAsIE9NWF9WSURFT19BVkNMZXZlbDYgIH0sCisgICAgICAgIHsgNjEsIE9NWF9WSURFT19BVkNMZXZlbDYxIH0sCisgICAgICAgIHsgNjIsIE9NWF9WSURFT19BVkNMZXZlbDYyIH0sCiAgICAgfTsKICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fQVZDUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKICAgICAgICAgeyA2NiwgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSB9LApAQCAtNTY4LDggKzU3MywxOTIgQEAKICAgICB9CiB9CiAKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gc3RyaW5nTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiYWxidW0iLCBrS2V5QWxidW0gfSwKKyAgICAgICAgeyAiYWxidW1hcnRpc3QiLCBrS2V5QWxidW1BcnRpc3QgfSwKKyAgICAgICAgeyAiYXJ0aXN0Iiwga0tleUFydGlzdCB9LAorICAgICAgICB7ICJhdXRob3IiLCBrS2V5QXV0aG9yIH0sCisgICAgICAgIHsgImNkdHJhY2tudW0iLCBrS2V5Q0RUcmFja051bWJlciB9LAorICAgICAgICB7ICJjb21waWxhdGlvbiIsIGtLZXlDb21waWxhdGlvbiB9LAorICAgICAgICB7ICJjb21wb3NlciIsIGtLZXlDb21wb3NlciB9LAorICAgICAgICB7ICJkYXRlIiwga0tleURhdGUgfSwKKyAgICAgICAgeyAiZGlzY251bSIsIGtLZXlEaXNjTnVtYmVyIH0sCisgICAgICAgIHsgImdlbnJlIiwga0tleUdlbnJlIH0sCisgICAgICAgIHsgImxvY2F0aW9uIiwga0tleUxvY2F0aW9uIH0sCisgICAgICAgIHsgImx5cmljaXN0Iiwga0tleVdyaXRlciB9LAorICAgICAgICB7ICJtYW51ZmFjdHVyZXIiLCBrS2V5TWFudWZhY3R1cmVyIH0sCisgICAgICAgIHsgInRpdGxlIiwga0tleVRpdGxlIH0sCisgICAgICAgIHsgInllYXIiLCBrS2V5WWVhciB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGZsb2F0TWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiY2FwdHVyZS1yYXRlIiwga0tleUNhcHR1cmVGcmFtZXJhdGUgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBpbnQ2NE1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImV4aWYtb2Zmc2V0Iiwga0tleUV4aWZPZmZzZXQgfSwKKyAgICAgICAgeyAiZXhpZi1zaXplIiwga0tleUV4aWZTaXplIH0sCisgICAgICAgIHsgInRhcmdldC10aW1lIiwga0tleVRhcmdldFRpbWUgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLXRpbWUiLCBrS2V5VGh1bWJuYWlsVGltZSB9LAorICAgICAgICB7ICJ0aW1lVXMiLCBrS2V5VGltZSB9LAorICAgICAgICB7ICJkdXJhdGlvblVzIiwga0tleUR1cmF0aW9uIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gaW50MzJNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJsb29wIiwga0tleUF1dG9Mb29wIH0sCisgICAgICAgIHsgInRpbWUtc2NhbGUiLCBrS2V5VGltZVNjYWxlIH0sCisgICAgICAgIHsgImNyeXB0by1tb2RlIiwga0tleUNyeXB0b01vZGUgfSwKKyAgICAgICAgeyAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplIH0sCisgICAgICAgIHsgImNyeXB0by1lbmNyeXB0ZWQtYnl0ZS1ibG9jayIsIGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2sgfSwKKyAgICAgICAgeyAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayIsIGtLZXlTa2lwQnl0ZUJsb2NrIH0sCisgICAgICAgIHsgImZyYW1lLWNvdW50Iiwga0tleUZyYW1lQ291bnQgfSwKKyAgICAgICAgeyAibWF4LWJpdHJhdGUiLCBrS2V5TWF4Qml0UmF0ZSB9LAorICAgICAgICB7ICJwY20tYmlnLWVuZGlhbiIsIGtLZXlQY21CaWdFbmRpYW4gfSwKKyAgICAgICAgeyAidGVtcG9yYWwtbGF5ZXItY291bnQiLCBrS2V5VGVtcG9yYWxMYXllckNvdW50IH0sCisgICAgICAgIHsgInRlbXBvcmFsLWxheWVyLWlkIiwga0tleVRlbXBvcmFsTGF5ZXJJZCB9LAorICAgICAgICB7ICJ0aHVtYm5haWwtd2lkdGgiLCBrS2V5VGh1bWJuYWlsV2lkdGggfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLWhlaWdodCIsIGtLZXlUaHVtYm5haWxIZWlnaHQgfSwKKyAgICAgICAgeyAidmFsaWQtc2FtcGxlcyIsIGtLZXlWYWxpZFNhbXBsZXMgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBidWZmZXJNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJhbGJ1bWFydCIsIGtLZXlBbGJ1bUFydCB9LAorICAgICAgICB7ICJhdWRpby1wcmVzZW50YXRpb24taW5mbyIsIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8gfSwKKyAgICAgICAgeyAicHNzaCIsIGtLZXlQc3NoIH0sCisgICAgICAgIHsgImNyeXB0by1pdiIsIGtLZXlDcnlwdG9JViB9LAorICAgICAgICB7ICJjcnlwdG8ta2V5Iiwga0tleUNyeXB0b0tleSB9LAorICAgICAgICB7ICJjcnlwdG8tZW5jcnlwdGVkLXNpemVzIiwga0tleUVuY3J5cHRlZFNpemVzIH0sCisgICAgICAgIHsgImNyeXB0by1wbGFpbi1zaXplcyIsIGtLZXlQbGFpblNpemVzIH0sCisgICAgICAgIHsgImljYy1wcm9maWxlIiwga0tleUljY1Byb2ZpbGUgfSwKKyAgICAgICAgeyAic2VpIiwga0tleVNFSSB9LAorICAgICAgICB7ICJ0ZXh0LWZvcm1hdC1kYXRhIiwga0tleVRleHRGb3JtYXREYXRhIH0sCisgICAgICAgIHsgInRodW1ibmFpbC1jc2QtaGV2YyIsIGtLZXlUaHVtYm5haWxIVkNDIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gQ1NETWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiY3NkLTAiLCBrS2V5T3BhcXVlQ1NEMCB9LAorICAgICAgICB7ICJjc2QtMSIsIGtLZXlPcGFxdWVDU0QxIH0sCisgICAgICAgIHsgImNzZC0yIiwga0tleU9wYXF1ZUNTRDIgfSwKKyAgICB9Cit9OworCit2b2lkIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YUZyb21NYXBwaW5ncyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8TWV0YURhdGE+ICZtZXRhKSB7CisgICAgZm9yIChhdXRvIGVsZW0gOiBzdHJpbmdNYXBwaW5ncykgeworICAgICAgICBBU3RyaW5nIHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kU3RyaW5nKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoZWxlbS5zZWNvbmQsIHZhbHVlLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBmbG9hdE1hcHBpbmdzKSB7CisgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kRmxvYXQoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RmxvYXQoZWxlbS5zZWNvbmQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50NjRNYXBwaW5ncykgeworICAgICAgICBpbnQ2NF90IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kSW50NjQoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoZWxlbS5zZWNvbmQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50MzJNYXBwaW5ncykgeworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoZWxlbS5zZWNvbmQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogYnVmZmVyTWFwcGluZ3MpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShlbGVtLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbHVlLT5kYXRhKCksIHZhbHVlLT5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBDU0RNYXBwaW5ncykgeworICAgICAgICBzcDxBQnVmZmVyPiB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGVsZW0uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsdWUtPmRhdGEoKSwgdmFsdWUtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlRnJvbU1hcHBpbmdzKGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+IGZvcm1hdCkgeworICAgIGZvciAoYXV0byBlbGVtIDogc3RyaW5nTWFwcGluZ3MpIHsKKyAgICAgICAgY29uc3QgY2hhciAqdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhlbGVtLnNlY29uZCwgJnZhbHVlKSkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoZWxlbS5maXJzdCwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBmbG9hdE1hcHBpbmdzKSB7CisgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEZsb2F0KGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEZsb2F0KGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50NjRNYXBwaW5ncykgeworICAgICAgICBpbnQ2NF90IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50MzJNYXBwaW5ncykgeworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogYnVmZmVyTWFwcGluZ3MpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCogZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShlbGVtLnNlY29uZCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0QnVmZmVyKGVsZW0uZmlyc3QsIGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IENTRE1hcHBpbmdzKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoZWxlbS5zZWNvbmQsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBidWYtPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOworICAgICAgICAgICAgYnVmLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0QnVmZmVyKGVsZW0uZmlyc3QsIGJ1Zik7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgeworICAgIHJldHVybiBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YS5nZXQoKSwgZm9ybWF0KTsKK30KKworc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAorICAgICAgICBjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CiAKICAgICBmb3JtYXQtPmNsZWFyKCk7CiAKQEAgLTU4Niw2ICs3NzUsOCBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CiAgICAgbXNnLT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKIAorICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUZyb21NYXBwaW5ncyhtZXRhLCBtc2cpOworCiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwpAQCAtNTk5LDYgKzc5MCwxNiBAQAogICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwogICAgIH0KIAorICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q0FQcml2YXRlRGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNhLXByaXZhdGUtZGF0YSIsIGJ1ZmZlcik7CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgfQorCiAgICAgaW50MzJfdCBzeXN0ZW1JZDsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDQVN5c3RlbUlELCAmc3lzdGVtSWQpKSB7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImNhLXN5c3RlbS1pZCIsIHN5c3RlbUlkKTsKQEAgLTcxMiw2ICs5MTMsMTYgQEAKICAgICAgICAgICAgIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KCooSERSU3RhdGljSW5mbyopZGF0YSwgbXNnKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5SGRyMTBQbHVzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgICAgICAmJiBzaXplID4gMCkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworICAgICAgICAgICAgbXNnLT5zZXRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsIGJ1ZmZlcik7CisgICAgICAgIH0KKwogICAgICAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VDb2xvckFzcGVjdHMobWV0YSwgbXNnKTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKQEAgLTcyMyw2ICs5MzQsMTEgQEAKICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIG51bUNoYW5uZWxzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBzYW1wbGVSYXRlKTsKIAorICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJpdHNQZXJTYW1wbGUsICZiaXRzUGVyU2FtcGxlKSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYml0cy1wZXItc2FtcGxlIiwgYml0c1BlclNhbXBsZSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2hhbm5lbC1tYXNrIiwgY2hhbm5lbE1hc2spOwpAQCAtMTAwMSw2ICsxMjE3LDE2IEBACiAgICAgICAgIH0KIAogICAgICAgICBwYXJzZUhldmNQcm9maWxlTGV2ZWxGcm9tSHZjYygoY29uc3QgdWludDhfdCAqKWRhdGEsIGRhdGFTaXplLCBtc2cpOworICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFWMUMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7CiAgICAgICAgIGlmIChlc2RzLkluaXRDaGVjaygpICE9IChzdGF0dXNfdClPSykgewpAQCAtMTA0OCwzMyArMTI3NCw5IEBACiAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigibWF4LWJpdHJhdGUiLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa1R5cGVEMjYzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUQyNjMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKICAgICAgICAgcGFyc2VIMjYzUHJvZmlsZUxldmVsRnJvbUQyNjMocHRyLCBzaXplLCBtc2cpOwotICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleVZvcmJpc0luZm8sICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotCi0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7Ci0gICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7Ci0KLSAgICAgICAgaWYgKCFtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotCi0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7Ci0gICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMSIsIGJ1ZmZlcik7CiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5T3B1c0hlYWRlciwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CiAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CkBAIC0xMTEzLDE2ICsxMzE1LDYgQEAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKICAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0yIiwgYnVmZmVyKTsKLSAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlGbGFjTWV0YWRhdGEsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotCi0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7Ci0gICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5VnA5Q29kZWNQcml2YXRlLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKQEAgLTExNDgsMTMgKzEzNDAsNiBAQAogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOwogICAgIH0KIAotICAgIC8vIFRPRE8gZXhwb3NlICJjcnlwdG8ta2V5Ii9rS2V5Q3J5cHRvS2V5IHRocm91Z2ggcHVibGljIGFwaQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNyeXB0by1rZXkiLCBidWZmZXIpOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotICAgIH0KLQogICAgICpmb3JtYXQgPSBtc2c7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMzUzLDYgKzE1MzgsMjEgQEAKICAgICAgICAgQUxPR1coImRpZCBub3QgZmluZCBtaW1lIHR5cGUiKTsKICAgICB9CiAKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGFGcm9tTWFwcGluZ3MobXNnLCBtZXRhKTsKKworICAgIGludDMyX3Qgc3lzdGVtSWQ7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjYS1zeXN0ZW0taWQiLCAmc3lzdGVtSWQpKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBzeXN0ZW1JZCk7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY2FTZXNzaW9uSWQsIGNhUHZ0RGF0YTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY2Etc2Vzc2lvbi1pZCIsICZjYVNlc3Npb25JZCkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELCAwLCBjYVNlc3Npb25JZC0+ZGF0YSgpLCBjYVNlc3Npb25JZC0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjYS1wcml2YXRlLWRhdGEiLCAmY2FQdnREYXRhKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q0FQcml2YXRlRGF0YSwgMCwgY2FQdnREYXRhLT5kYXRhKCksIGNhUHZ0RGF0YS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGludDY0X3QgZHVyYXRpb25VczsKICAgICBpZiAobXNnLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKQEAgLTEzODQsNyArMTU4NCw3IEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiZGlkIG5vdCBmaW5kIHdpZHRoIGFuZC9vciBoZWlnaHQiKTsKKyAgICAgICAgICAgIEFMT0dWKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOwogICAgICAgICB9CiAKICAgICAgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OwpAQCAtMTQ0Nyw2ICsxNjQ3LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhkcjEwUGx1c0luZm8sIDAsCisgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPmRhdGEoKSwgaGRyMTBQbHVzSW5mby0+c2l6ZSgpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YUNvbG9yQXNwZWN0cyhtc2csIG1ldGEpOwogCiAgICAgICAgIEFTdHJpbmcgdHNTY2hlbWE7CkBAIC0xNDcxLDYgKzE2NzcsMTAgQEAKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkgewogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwogICAgICAgICB9CisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCAmYml0c1BlclNhbXBsZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgfQogICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsTWFzaywgY2hhbm5lbE1hc2spOwpAQCAtMTQ4OSw2ICsxNjk5LDExIEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SXNBRFRTLCBpc0FEVFMpOwogICAgICAgICB9CiAKKyAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlBQUNBT1QsIGFhY1Byb2ZpbGUpOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBwY21FbmNvZGluZzsKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAmcGNtRW5jb2RpbmcpKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIHBjbUVuY29kaW5nKTsKQEAgLTE1MjksNDIgKzE3NDQsNjcgQEAKICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpKSB7CiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYXZjYyhjc2Qwc2l6ZSArIGNzZDEtPnNpemUoKSArIDEwMjQpOwogICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUFWQ0MoY3NkMCwgY3NkMSwgYXZjYy5kYXRhKCkpOwotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIGtLZXlBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgfHwgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gZXNkcyhjc2Qwc2l6ZSArIDMxKTsKICAgICAgICAgICAgIC8vIFRoZSB3cml0dGVuIEVTRFMgaXMgYWN0dWFsbHkgZm9yIGFuIGF1ZGlvIHN0cmVhbSwgYnV0IGl0J3MgZW5vdWdoCiAgICAgICAgICAgICAvLyBmb3IgdHJhbnNwb3J0aW5nIHRoZSBDU0QgdG8gbXV4ZXJzLgogICAgICAgICAgICAgcmVhc3NlbWJsZUVTRFMoY3NkMCwgZXNkcy5kYXRhKCkpOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywga0tleUVTRFMsIGVzZHMuZGF0YSgpLCBlc2RzLnNpemUoKSk7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsIGVzZHMuZGF0YSgpLCBlc2RzLnNpemUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDIHx8CiAgICAgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpIHsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGh2Y2MoY3NkMHNpemUgKyAxMDI0KTsKICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUhWQ0MoY3NkMCwgaHZjYy5kYXRhKCksIGh2Y2Muc2l6ZSgpLCA0KTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtLZXlIVkNDLCBodmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVYxQywgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpIHsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSBjc2QwLT5zaXplKCk7CisgICAgICAgICAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgICAgICAgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgICAgICAgICB2b2lkICpvcHVzSGVhZEJ1ZiA9IGNzZDAtPmRhdGEoKTsKKyAgICAgICAgICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBOVUxMOwogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzQ29kZWNEZWxheSwgMCwgY3NkMS0+ZGF0YSgpLCBjc2QxLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGNvZGVjRGVsYXlCdWZTaXplID0gY3NkMS0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGNvZGVjRGVsYXlCdWYgPSBjc2QxLT5kYXRhKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMiIsICZjc2QyKSkgewotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgMCwgY3NkMi0+ZGF0YSgpLCBjc2QyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIHNlZWtQcmVSb2xsQnVmU2l6ZSA9IGNzZDItPnNpemUoKTsKKyAgICAgICAgICAgICAgICBzZWVrUHJlUm9sbEJ1ZiA9IGNzZDItPmRhdGEoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykgewotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWb3JiaXNCb29rcywgMCwgY3NkMS0+ZGF0YSgpLCBjc2QxLT5zaXplKCkpOworICAgICAgICAgICAgLyogRXh0cmFjdCBjb2RlYyBkZWxheSBhbmQgc2VlayBwcmUgcm9sbCBmcm9tIGNzZC0wLAorICAgICAgICAgICAgICogaWYgY3NkLTEgYW5kIGNzZC0yIGFyZSBub3QgcHJlc2VudCAqLworICAgICAgICAgICAgaWYgKCFjb2RlY0RlbGF5QnVmICYmICFzZWVrUHJlUm9sbEJ1ZikgeworICAgICAgICAgICAgICAgIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpLCAmb3B1c0hlYWRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B1c0hlYWRTaXplLCAmY29kZWNEZWxheUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplKTsKKyAgICAgICAgICAgIGlmIChjb2RlY0RlbGF5QnVmKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0NvZGVjRGVsYXksIDAsIGNvZGVjRGVsYXlCdWYsIGNvZGVjRGVsYXlCdWZTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZWVrUHJlUm9sbEJ1ZikgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgMCwgc2Vla1ByZVJvbGxCdWYsIHNlZWtQcmVSb2xsQnVmU2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBbGFjTWFnaWNDb29raWUsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICAgICAgfQotICAgIH0KLQotICAgIGludDMyX3QgdGltZVNjYWxlOwotICAgIGlmIChtc2ctPmZpbmRJbnQzMigidGltZS1zY2FsZSIsICZ0aW1lU2NhbGUpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIHRpbWVTY2FsZSk7CisgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyAmJiBtc2ctPmZpbmRCdWZmZXIoImNzZC1hdmMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmICgobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDIHx8IG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKQorICAgICAgICAgICAgJiYgbXNnLT5maW5kQnVmZmVyKCJjc2QtaGV2YyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiZXNkcyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEJ1ZmZlcigibXBlZzItc3RyZWFtLWhlYWRlciIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJkMjYzIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgIH0KIAogICAgIC8vIFhYWCBUT0RPIGFkZCB3aGF0ZXZlciBvdGhlciBrZXlzIHRoZXJlIGFyZQpAQCAtMTY0MCw2ICsxODgwLDkgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgICAgICBBVURJT19GT1JNQVRfVk9SQklTIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAgICAgICAgQVVESU9fRk9STUFUX09QVVN9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzN9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMywgICAgICAgIEFVRElPX0ZPUk1BVF9FX0FDM30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQywgICAgQVVESU9fRk9STUFUX0VfQUMzX0pPQ30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQsICAgICAgICAgQVVESU9fRk9STUFUX0FDNH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDLCAgICAgICAgQVVESU9fRk9STUFUX0ZMQUN9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQywgICAgICAgIEFVRElPX0ZPUk1BVF9BTEFDIH0sCiAgICAgeyAwLCBBVURJT19GT1JNQVRfSU5WQUxJRCB9CkBAIC0xNjkzLDQzICsxOTM2LDQzIEBACiAgICAgcmV0dXJuOwogfQogCi1ib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3N0YXR1c190IGdldEF1ZGlvT2ZmbG9hZEluZm8oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGF1ZGlvX29mZmxvYWRfaW5mb190ICppbmZvKQogewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICgqaW5mbykgPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOwogCi0gICAgaW5mby5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICBpZiAobWFwTWltZVRvQXVkaW9Gb3JtYXQoaW5mby5mb3JtYXQsIG1pbWUpICE9IE9LKSB7CisgICAgaW5mby0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgaWYgKG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGluZm8tPmZvcm1hdCwgbWltZSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiBDb3VsZG4ndCBtYXAgbWltZSB0eXBlIFwiJXNcIiB0byBhIHZhbGlkIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgISIsIG1pbWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAlZCIsIG1pbWUsIGluZm8uZm9ybWF0KTsKKyAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAlZCIsIG1pbWUsIGluZm8tPmZvcm1hdCk7CiAgICAgfQogCi0gICAgaWYgKEFVRElPX0ZPUk1BVF9JTlZBTElEID09IGluZm8uZm9ybWF0KSB7CisgICAgaWYgKEFVRElPX0ZPUk1BVF9JTlZBTElEID09IGluZm8tPmZvcm1hdCkgewogICAgICAgICAvLyBjYW4ndCBvZmZsb2FkIGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgc291cmNlIGZvcm1hdCBpcwogICAgICAgICBBTE9HRSgibWltZSB0eXBlIFwiJXNcIiBub3QgYSBrbm93biBhdWRpbyBmb3JtYXQiLCBtaW1lKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIFJlZGVmaW5lIGFhYyBmb3JtYXQgYWNjb3JkaW5nIHRvIGl0cyBwcm9maWxlCiAgICAgLy8gT2ZmbG9hZGluZyBkZXBlbmRzIG9uIGF1ZGlvIERTUCBjYXBhYmlsaXRpZXMuCiAgICAgaW50MzJfdCBhYWNhb3QgPSAtMTsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlBQUNBT1QsICZhYWNhb3QpKSB7Ci0gICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8uZm9ybWF0LChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY2FvdCk7CisgICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8tPmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOwogICAgIH0KIAogICAgIGludDMyX3Qgc3JhdGUgPSAtMTsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNyYXRlKSkgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggc2FtcGxlIHJhdGUiLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5zYW1wbGVfcmF0ZSA9IHNyYXRlOworICAgIGluZm8tPnNhbXBsZV9yYXRlID0gc3JhdGU7CiAKICAgICBpbnQzMl90IGNtYXNrID0gMDsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjbWFzaykgfHwgY21hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CkBAIC0xNzQzLDI1ICsxOTg2LDM0IEBACiAgICAgICAgICAgICBjbWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOwogICAgICAgICB9CiAgICAgfQotICAgIGluZm8uY2hhbm5lbF9tYXNrID0gY21hc2s7CisgICAgaW5mby0+Y2hhbm5lbF9tYXNrID0gY21hc2s7CiAKICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGR1cmF0aW9uIiwgbWltZSk7CiAgICAgfQotICAgIGluZm8uZHVyYXRpb25fdXMgPSBkdXJhdGlvbjsKKyAgICBpbmZvLT5kdXJhdGlvbl91cyA9IGR1cmF0aW9uOwogCiAgICAgaW50MzJfdCBicmF0ZSA9IC0xOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYnJhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBiaXRyYXRlIiwgbWltZSk7CiAgICAgfQotICAgIGluZm8uYml0X3JhdGUgPSBicmF0ZTsKKyAgICBpbmZvLT5iaXRfcmF0ZSA9IGJyYXRlOwogCiAKLSAgICBpbmZvLnN0cmVhbV90eXBlID0gc3RyZWFtVHlwZTsKLSAgICBpbmZvLmhhc192aWRlbyA9IGhhc1ZpZGVvOwotICAgIGluZm8uaXNfc3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7CisgICAgaW5mby0+c3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOworICAgIGluZm8tPmhhc192aWRlbyA9IGhhc1ZpZGVvOworICAgIGluZm8tPmlzX3N0cmVhbWluZyA9IGlzU3RyZWFtaW5nOworICAgIHJldHVybiBPSzsKK30KIAorYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCit7CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgaWYgKE9LICE9IGdldEF1ZGlvT2ZmbG9hZEluZm8obWV0YSwgaGFzVmlkZW8sIGlzU3RyZWFtaW5nLCBzdHJlYW1UeXBlLCAmaW5mbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKQEAgLTE5MzEsNCArMjE4MywzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKaW5kZXggOTAyMGZjMS4uNGU1YjVlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xOSw4ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTwogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KQEAgLTMyLDMyMSArMzEsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXN0YXRpYyBpbnQgY29tcGFyZShjb25zdCBUICpsaHMsIGNvbnN0IFQgKnJocykgewotICAgIGlmICgqbGhzIDwgKnJocykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmICgqbGhzID4gKnJocykgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSA9IDM7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyOjprSGlzdG9yeVNpemU7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IDM7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBrUHJlY2lzaW9uID0gMTI7Ci1zdGF0aWMgY29uc3QgaW50NjRfdCBrRXJyb3JUaHJlc2hvbGQgPSAoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSAvIDEwOwotc3RhdGljIGNvbnN0IGludDY0X3Qga011bHRpcGxlc1RocmVzaG9sZERpdiA9IDQ7ICAgICAgICAgICAgLy8gMjUlCi1zdGF0aWMgY29uc3QgaW50NjRfdCBrUmVGaXRUaHJlc2hvbGREaXYgPSAxMDA7ICAgICAgICAgICAgICAvLyAxJQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heEFsbG93ZWRGcmFtZVNraXAgPSBrTmFub3NJbjFzOyAgICAgLy8gMSBzZWMKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5QZXJpb2QgPSBrTmFub3NJbjFzIC8gMTIwOyAgICAgICAgIC8vIDEyMEh6Ci1zdGF0aWMgY29uc3QgbnNlY3NfdCBrUmVmaXRSZWZyZXNoUGVyaW9kID0gMTAgKiBrTmFub3NJbjFzOyAvLyAxMCBzZWMKLQotVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpQTEwoKQotICAgIDogbVBlcmlvZCgtMSksCi0gICAgICBtUGhhc2UoMCksCi0gICAgICBtUHJpbWVkKGZhbHNlKSwKLSAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcoMCksCi0gICAgICBtTGFzdFRpbWUoLTEpLAotICAgICAgbU51bVNhbXBsZXMoMCkgewotfQotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cmVzZXQoZmxvYXQgZnBzKSB7Ci0gICAgLy90ZXN0KCk7Ci0KLSAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKLSAgICBtTGFzdFRpbWUgPSAtMTsKLQotICAgIC8vIHNldCB1cCBvciByZXNldCB2aWRlbyBQTEwKLSAgICBpZiAoZnBzIDw9IDAuZikgewotICAgICAgICBtUGVyaW9kID0gLTE7Ci0gICAgICAgIG1QcmltZWQgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigicmVzZXQgYXQgJS4xZiBmcHMiLCBmcHMpOwotICAgICAgICBtUGVyaW9kID0gKG5zZWNzX3QpKDFlOSAvIGZwcyArIDAuNSk7Ci0gICAgICAgIG1QcmltZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHJlc3RhcnQoKTsKLX0KLQotLy8gcmVzZXQgUExMIGJ1dCBrZWVwIHByZXZpb3VzIHBlcmlvZCBlc3RpbWF0ZQotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnJlc3RhcnQoKSB7Ci0gICAgbU51bVNhbXBsZXMgPSAwOwotICAgIG1QaGFzZSA9IC0xOwotfQotCi0jaWYgMAotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6dGVzdCgpIHsKLSAgICBuc2Vjc190IHBlcmlvZCA9IGtOYW5vc0luMXMgLyA2MDsKLSAgICBtVGltZXNbMF0gPSAwOwotICAgIG1UaW1lc1sxXSA9IHBlcmlvZDsKLSAgICBtVGltZXNbMl0gPSBwZXJpb2QgKiAzOwotICAgIG1UaW1lc1szXSA9IHBlcmlvZCAqIDQ7Ci0gICAgbVRpbWVzWzRdID0gcGVyaW9kICogNzsKLSAgICBtVGltZXNbNV0gPSBwZXJpb2QgKiA4OwotICAgIG1UaW1lc1s2XSA9IHBlcmlvZCAqIDEwOwotICAgIG1UaW1lc1s3XSA9IHBlcmlvZCAqIDEyOwotICAgIG1OdW1TYW1wbGVzID0gODsKLSAgICBpbnQ2NF90IGEsIGIsIGVycjsKLSAgICBmaXQoMCwgcGVyaW9kICogMTIgLyA3LCA4LCAmYSwgJmIsICZlcnIpOwotICAgIC8vIGEgPSAwLjgoNSkrCi0gICAgLy8gYiA9IC0wLjE0MDk3KDIpKwotICAgIC8vIGVyciA9IDAuMjc1MDU3OCg3MDMpKwotICAgIEFMT0dEKCJhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAotICAgICAgICAgICAgKGxvbmcgbG9uZylhLCAoYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKWIsIChiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpZXJyLCAoZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Ci19Ci0KLSNlbmRpZgotCi1ib29sIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6Zml0KAotICAgICAgICBuc2Vjc190IHBoYXNlLCBuc2Vjc190IHBlcmlvZCwgc2l6ZV90IG51bVNhbXBsZXNUb1VzZSwKLSAgICAgICAgaW50NjRfdCAqYSwgaW50NjRfdCAqYiwgaW50NjRfdCAqZXJyKSB7Ci0gICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7Ci0gICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOwotICAgIH0KLQotICAgIGlmICgocGVyaW9kID4+IGtQcmVjaXNpb24pID09IDAgKSB7Ci0gICAgICAgIEFMT0dXKCJQZXJpb2QgaXMgMCwgb3IgYWZ0ZXIgaW5jbHVkaW5nIHByZWNpc2lvbiBpcyAwIC0gd291bGQgY2F1c2UgZGl2MCwgcmV0dXJuaW5nIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHN1bVggPSAwOwotICAgIGludDY0X3Qgc3VtWFggPSAwOwotICAgIGludDY0X3Qgc3VtWFkgPSAwOwotICAgIGludDY0X3Qgc3VtWVkgPSAwOwotICAgIGludDY0X3Qgc3VtWSA9IDA7Ci0KLSAgICBpbnQ2NF90IHggPSAwOyAvLyB4IHVzdWFsbHkgaXMgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSkKLSAgICBuc2Vjc190IGxhc3RUaW1lOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyBpKyspIHsKLSAgICAgICAgc2l6ZV90IGl4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7Ci0gICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpeF07Ci0gICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgeCArPSBkaXZSb3VuZCh0aW1lIC0gbGFzdFRpbWUsIHBlcmlvZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8geSBpcyB1c3VhbGx5IGluIFstbnVtU2FtcGxlc1RvVXNlLi5udW1TYW1wbGVzVG9Vc2Ura1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kKSA8PCBrUHJlY2lzaW9uCi0gICAgICAgIC8vICAgaWRlYWxseSBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKSwgYnV0IHNoaWZ0ZWQgYnkgLW51bVNhbXBsZXNUb1VzZSBkdXJpbmcKLSAgICAgICAgLy8gICBwcmltaW5nLCBhbmQgcG9zc2libHkgc2hpZnRlZCBieSB1cCB0byBrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QKLSAgICAgICAgLy8gICB3aGlsZSB3ZSBhcmUgbm90IHJlZml0dGluZy4KLSAgICAgICAgaW50NjRfdCB5ID0gZGl2Um91bmQodGltZSAtIHBoYXNlLCBwZXJpb2QgPj4ga1ByZWNpc2lvbik7Ci0gICAgICAgIHN1bVggKz0geDsKLSAgICAgICAgc3VtWSArPSB5OwotICAgICAgICBzdW1YWCArPSB4ICogeDsKLSAgICAgICAgc3VtWFkgKz0geCAqIHk7Ci0gICAgICAgIHN1bVlZICs9IHkgKiB5OwotICAgICAgICBsYXN0VGltZSA9IHRpbWU7Ci0gICAgfQotCi0gICAgaW50NjRfdCBkaXYgICA9IChpbnQ2NF90KW51bVNhbXBsZXNUb1VzZSAqIHN1bVhYIC0gc3VtWCAqIHN1bVg7Ci0gICAgaWYgKGRpdiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGFfbm9tID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFkgLSBzdW1YICogc3VtWTsKLSAgICBpbnQ2NF90IGJfbm9tID0gc3VtWFggKiBzdW1ZICAgICAgICAgICAgLSBzdW1YICogc3VtWFk7Ci0gICAgKmEgPSBkaXZSb3VuZChhX25vbSwgZGl2KTsKLSAgICAqYiA9IGRpdlJvdW5kKGJfbm9tLCBkaXYpOwotICAgIC8vIGRvbid0IHVzZSBhIGFuZCBiIGRpcmVjdGx5IGFzIHRoZSByb3VuZGluZyBlcnJvciBpcyBzaWduaWZpY2FudAotICAgICplcnIgPSBzdW1ZWSAtIGRpdlJvdW5kKGFfbm9tICogc3VtWFkgKyBiX25vbSAqIHN1bVksIGRpdik7Ci0gICAgQUxPR1YoImZpdHRpbmdbJXp1XSBhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAotICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLAotICAgICAgICAgICAgKGxvbmcgbG9uZykqYSwgICAoKmEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykqYiwgICAoKmIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykqZXJyLCAoKmVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cHJpbWUoc2l6ZV90IG51bVNhbXBsZXNUb1VzZSkgewotICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgewotICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKLSAgICB9Ci0gICAgQ0hFQ0sobnVtU2FtcGxlc1RvVXNlID49IDMpOyAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IDMgc2FtcGxlcwotCi0gICAgLy8gZXN0aW1hdGUgdmlkZW8gZnJhbWVyYXRlIGZyb20gZGVsdGFzIGJldHdlZW4gdGltZXN0YW1wcywgYW5kCi0gICAgLy8gMm5kIG9yZGVyIGRlbHRhcwotICAgIFZlY3Rvcjxuc2Vjc190PiBkZWx0YXM7Ci0gICAgbnNlY3NfdCBsYXN0VGltZSwgZmlyc3RUaW1lOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyArK2kpIHsKLSAgICAgICAgc2l6ZV90IGluZGV4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7Ci0gICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpbmRleF07Ci0gICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VGltZSA+IGtNaW5QZXJpb2QpIHsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTogJWxsZCIsIChsb25nIGxvbmcpKHRpbWUgLSBsYXN0VGltZSkpOwotICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKHRpbWUgLSBsYXN0VGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaXJzdFRpbWUgPSB0aW1lOwotICAgICAgICB9Ci0gICAgICAgIGxhc3RUaW1lID0gdGltZTsKLSAgICB9Ci0gICAgZGVsdGFzLnNvcnQoY29tcGFyZTxuc2Vjc190Pik7Ci0gICAgc2l6ZV90IG51bURlbHRhcyA9IGRlbHRhcy5zaXplKCk7Ci0gICAgaWYgKG51bURlbHRhcyA+IDEpIHsKLSAgICAgICAgbnNlY3NfdCBkZWx0YU1pbkxpbWl0ID0gbWF4KGRlbHRhc1swXSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYsIGtNaW5QZXJpb2QpOwotICAgICAgICBuc2Vjc190IGRlbHRhTWF4TGltaXQgPSBkZWx0YXNbbnVtRGVsdGFzIC8gMl0gKiBrTXVsdGlwbGVzVGhyZXNob2xkRGl2OwotICAgICAgICBmb3IgKHNpemVfdCBpID0gbnVtRGVsdGFzIC8gMiArIDE7IGkgPCBudW1EZWx0YXM7ICsraSkgewotICAgICAgICAgICAgaWYgKGRlbHRhc1tpXSA+IGRlbHRhTWF4TGltaXQpIHsKLSAgICAgICAgICAgICAgICBkZWx0YXMucmVzaXplKGkpOwotICAgICAgICAgICAgICAgIG51bURlbHRhcyA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1EZWx0YXM7ICsraSkgewotICAgICAgICAgICAgbnNlY3NfdCBkZWx0YTJuZCA9IGRlbHRhc1tpXSAtIGRlbHRhc1tpIC0gMV07Ci0gICAgICAgICAgICBpZiAoZGVsdGEybmQgPj0gZGVsdGFNaW5MaW1pdCkgewotICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhMjogJWxsZCIsIChsb25nIGxvbmcpKGRlbHRhMm5kKSk7Ci0gICAgICAgICAgICAgICAgZGVsdGFzLnB1c2goZGVsdGEybmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdXNlIHRoZSBvbmUgdGhhdCB5aWVsZHMgdGhlIGJlc3QgbWF0Y2gKLSAgICBpbnQ2NF90IGJlc3RTY29yZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlbHRhcy5zaXplKCk7ICsraSkgewotICAgICAgICBuc2Vjc190IGRlbHRhID0gZGVsdGFzW2ldOwotICAgICAgICBpbnQ2NF90IHNjb3JlID0gMDsKLSNpZiAxCi0gICAgICAgIC8vIHNpbXBsZXN0IHNjb3JlOiBudW1iZXIgb2YgZGVsdGFzIHRoYXQgYXJlIG5lYXIgbXVsdGlwbGVzCi0gICAgICAgIHNpemVfdCBtYXRjaGVzID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZWx0YXMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgIG5zZWNzX3QgZXJyID0gcGVyaW9kaWNFcnJvcihkZWx0YXNbal0sIGRlbHRhKTsKLSAgICAgICAgICAgIGlmIChlcnIgPCBkZWx0YSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYpIHsKLSAgICAgICAgICAgICAgICArK21hdGNoZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2NvcmUgPSBtYXRjaGVzOwotI2lmIDAKLSAgICAgICAgLy8gY291bGQgYmUgd2VpZ2hlZCBieSB0aGUgKDEgLSBub3JtYWxpemVkIGVycm9yKQotICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOwotICAgICAgICAgICAgZXJyID0gKDEgPDwgKDIgKiBrUHJlY2lzaW9uKSkgLSBlcnI7Ci0gICAgICAgICAgICBzY29yZSAqPSBtYXgoMCwgZXJyKTsKLSAgICAgICAgfQotI2VuZGlmCi0jZWxzZQotICAgICAgICAvLyBvciB1c2UgdGhlIGVycm9yIGFzIGEgbmVnYXRpdmUgc2NvcmUKLSAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKLSAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKLSAgICAgICAgICAgIHNjb3JlID0gLWRlbHRhICogZXJyOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKGkgPT0gMCB8fCBzY29yZSA+IGJlc3RTY29yZSkgewotICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICBtUGVyaW9kID0gZGVsdGE7Ci0gICAgICAgICAgICBtUGhhc2UgPSBmaXJzdFRpbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwKLSAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lKSB7Ci0gICAgaWYgKG1MYXN0VGltZSA+PSAwCi0gICAgICAgICAgICAvLyBpZiB0aW1lIGdvZXMgYmFja3dhcmQsIG9yIHdlIHNraXBwZWQgcmVuZGVyaW5nCi0gICAgICAgICAgICAmJiAodGltZSA+IG1MYXN0VGltZSArIGtNYXhBbGxvd2VkRnJhbWVTa2lwIHx8IHRpbWUgPCBtTGFzdFRpbWUpKSB7Ci0gICAgICAgIHJlc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBtTGFzdFRpbWUgPSB0aW1lOwotICAgIG1UaW1lc1ttTnVtU2FtcGxlcyAlIGtIaXN0b3J5U2l6ZV0gPSB0aW1lOwotICAgICsrbU51bVNhbXBsZXM7Ci0KLSAgICBib29sIGRvRml0ID0gdGltZSA+IG1SZWZpdEF0OwotICAgIGlmICgobVBlcmlvZCA8PSAwIHx8ICFtUHJpbWVkKSAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSkgewotICAgICAgICBwcmltZShrTWluU2FtcGxlc1RvU3RvcFByaW1lKTsKLSAgICAgICAgKyttU2FtcGxlc1VzZWRGb3JQcmltaW5nOwotICAgICAgICBkb0ZpdCA9IHRydWU7Ci0gICAgfQotICAgIGlmIChtUGVyaW9kID4gMCAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKLSAgICAgICAgaWYgKG1QaGFzZSA8IDApIHsKLSAgICAgICAgICAgIC8vIGluaXRpYWxpemUgcGhhc2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyIHRpbWUKLSAgICAgICAgICAgIG1QaGFzZSA9IHRpbWU7Ci0gICAgICAgICAgICBkb0ZpdCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWRvRml0KSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGVyciA9IHBlcmlvZGljRXJyb3IodGltZSAtIG1QaGFzZSwgbVBlcmlvZCk7Ci0gICAgICAgICAgICBkb0ZpdCA9IGVyciA+IG1QZXJpb2QgLyBrUmVGaXRUaHJlc2hvbGREaXY7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZG9GaXQpIHsKLSAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgICAgICAgICAgaWYgKCFmaXQobVBoYXNlLCBtUGVyaW9kLCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QsICZhLCAmYiwgJmVycikpIHsKLSAgICAgICAgICAgICAgICAvLyBzYW1wbGVzIGFyZSBub3Qgc3VpdGFibGUgZm9yIGZpdHRpbmcuICB0aGlzIG1lYW5zIHRoZXkgYXJlCi0gICAgICAgICAgICAgICAgLy8gYWxzbyBub3Qgc3VpdGFibGUgZm9yIHByaW1pbmcuCi0gICAgICAgICAgICAgICAgQUxPR1YoImNvdWxkIG5vdCBmaXQgLSBrZWVwaW5nIG9sZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBlcmlvZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1QZXJpb2Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1SZWZpdEF0ID0gdGltZSArIGtSZWZpdFJlZnJlc2hQZXJpb2Q7Ci0KLSAgICAgICAgICAgIG1QaGFzZSArPSAobVBlcmlvZCAqIGIpID4+IGtQcmVjaXNpb247Ci0gICAgICAgICAgICBtUGVyaW9kID0gKG1QZXJpb2QgKiBhKSA+PiBrUHJlY2lzaW9uOwotICAgICAgICAgICAgQUxPR1YoIm5ldyBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPCBrRXJyb3JUaHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1QcmltZWQgJiYgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA+PSBrTWluU2FtcGxlc1RvU3RvcFByaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmltZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVByaW1lZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtUGVyaW9kOwotfQotCi1uc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6Z2V0UGVyaW9kKCkgY29uc3QgewotICAgIHJldHVybiBtUHJpbWVkID8gbVBlcmlvZCA6IDA7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgU2NoZWR1bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRWc3luY1BlcmlvZCA9IGtOYW5vc0luMXMgLyA2MDsgIC8vIDYwSHoKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYwotCi1WaWRlb0ZyYW1lU2NoZWR1bGVyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyKCkKLSAgICA6IG1Wc3luY1RpbWUoMCksCi0gICAgICBtVnN5bmNQZXJpb2QoMCksCi0gICAgICBtVnN5bmNSZWZyZXNoQXQoMCksCi0gICAgICBtTGFzdFZzeW5jVGltZSgtMSksCi0gICAgICBtVGltZUNvcnJlY3Rpb24oMCkgeworVmlkZW9GcmFtZVNjaGVkdWxlcjo6VmlkZW9GcmFtZVNjaGVkdWxlcigpIDogVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKSB7CiB9CiAKIHZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6dXBkYXRlVnN5bmMoKSB7CiAgICAgbVZzeW5jUmVmcmVzaEF0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpICsga1ZzeW5jUmVmcmVzaFBlcmlvZDsKLSAgICBtVnN5bmNQZXJpb2QgPSAwOwogICAgIG1Wc3luY1RpbWUgPSAwOworICAgIG1Wc3luY1BlcmlvZCA9IDA7CiAKLSAgICAvLyBUT0RPOiBzY2hlZHVsZSBmcmFtZXMgZm9yIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlCi0gICAgLy8gRm9yIG5vdywgc3VyZmFjZSBmbGluZ2VyIG9ubHkgc2NoZWR1bGVzIGZyYW1lcyBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5CiAgICAgaWYgKG1Db21wb3NlciA9PSBOVUxMKSB7CiAgICAgICAgIFN0cmluZzE2IG5hbWUoIlN1cmZhY2VGbGluZ2VyIik7CiAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKQEAgLTM2OCwxMzYgKzYwLDYgQEAKICAgICB9CiB9CiAKLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6aW5pdChmbG9hdCB2aWRlb0ZwcykgewotICAgIHVwZGF0ZVZzeW5jKCk7Ci0KLSAgICBtTGFzdFZzeW5jVGltZSA9IC0xOwotICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7Ci0KLSAgICBtUGxsLnJlc2V0KHZpZGVvRnBzKTsKLX0KLQotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZXN0YXJ0KCkgewotICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7Ci0gICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKLQotICAgIG1QbGwucmVzdGFydCgpOwotfQotCi1uc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmdldFZzeW5jUGVyaW9kKCkgewotICAgIGlmIChtVnN5bmNQZXJpb2QgPiAwKSB7Ci0gICAgICAgIHJldHVybiBtVnN5bmNQZXJpb2Q7Ci0gICAgfQotICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOwotfQotCi1mbG9hdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpnZXRGcmFtZVJhdGUoKSB7Ci0gICAgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuZ2V0UGVyaW9kKCk7Ci0gICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgewotICAgICAgICByZXR1cm4gMWU5IC8gdmlkZW9QZXJpb2Q7Ci0gICAgfQotICAgIHJldHVybiAwLmY7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6c2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKSB7Ci0gICAgbnNlY3NfdCBvcmlnUmVuZGVyVGltZSA9IHJlbmRlclRpbWU7Ci0KLSAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBpZiAobm93ID49IG1Wc3luY1JlZnJlc2hBdCkgewotICAgICAgICB1cGRhdGVWc3luYygpOwotICAgIH0KLQotICAgIC8vIHdpdGhvdXQgVlNZTkMgaW5mbywgdGhlcmUgaXMgbm90aGluZyB0byBkbwotICAgIGlmIChtVnN5bmNQZXJpb2QgPT0gMCkgewotICAgICAgICBBTE9HVigibm8gdnN5bmM6IHJlbmRlcj0lbGxkIiwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKLSAgICAgICAgcmV0dXJuIHJlbmRlclRpbWU7Ci0gICAgfQotCi0gICAgLy8gZW5zdXJlIHZzeW5jIHRpbWUgaXMgd2VsbCBiZWZvcmUgKGNvcnJlY3RlZCkgcmVuZGVyIHRpbWUKLSAgICBpZiAobVZzeW5jVGltZSA+IHJlbmRlclRpbWUgLSA0ICogbVZzeW5jUGVyaW9kKSB7Ci0gICAgICAgIG1Wc3luY1RpbWUgLT0KLSAgICAgICAgICAgICgobVZzeW5jVGltZSAtIHJlbmRlclRpbWUpIC8gbVZzeW5jUGVyaW9kICsgNSkgKiBtVnN5bmNQZXJpb2Q7Ci0gICAgfQotCi0gICAgLy8gVmlkZW8gcHJlc2VudGF0aW9uIHRha2VzIHBsYWNlIGF0IHRoZSBWU1lOQyBfYWZ0ZXJfIHJlbmRlclRpbWUuICBBZGp1c3QgcmVuZGVyVGltZQotICAgIC8vIHNvIHRoaXMgZWZmZWN0aXZlbHkgYmVjb21lcyBhIHJvdW5kaW5nIG9wZXJhdGlvbiAodG8gdGhlIF9jbG9zZXN0XyBWU1lOQy4pCi0gICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOwotCi0gICAgY29uc3QgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuYWRkU2FtcGxlKG9yaWdSZW5kZXJUaW1lKTsKLSAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7Ci0gICAgICAgIC8vIFNtb290aCBvdXQgcmVuZGVyaW5nCi0gICAgICAgIHNpemVfdCBOID0gMTI7Ci0gICAgICAgIG5zZWNzX3QgZml2ZVNpeHRoRGV2ID0KLSAgICAgICAgICAgIGFicygoKHZpZGVvUGVyaW9kICogNSArIG1Wc3luY1BlcmlvZCkgJSAobVZzeW5jUGVyaW9kICogNikpIC0gbVZzeW5jUGVyaW9kKQotICAgICAgICAgICAgICAgICAgICAvIChtVnN5bmNQZXJpb2QgLyAxMDApOwotICAgICAgICAvLyB1c2UgMjAgc2FtcGxlcyBpZiB3ZSBhcmUgZG9pbmcgNTo2IHJhdGlvICstIDElIChlLmcuIHBsYXlpbmcgNTBIeiBvbiA2MEh6KQotICAgICAgICBpZiAoZml2ZVNpeHRoRGV2IDwgMTIpIHsgIC8qIDEyJSAvIDYgPSAyJSAqLwotICAgICAgICAgICAgTiA9IDIwOwotICAgICAgICB9Ci0KLSAgICAgICAgbnNlY3NfdCBvZmZzZXQgPSAwOwotICAgICAgICBuc2Vjc190IGVkZ2VSZW1haW5kZXIgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8PSBOOyBpKyspIHsKLSAgICAgICAgICAgIG9mZnNldCArPQotICAgICAgICAgICAgICAgIChyZW5kZXJUaW1lICsgbVRpbWVDb3JyZWN0aW9uICsgdmlkZW9QZXJpb2QgKiBpIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICBlZGdlUmVtYWluZGVyICs9ICh2aWRlb1BlcmlvZCAqIGkpICUgbVZzeW5jUGVyaW9kOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyIC0gb2Zmc2V0IC8gKG5zZWNzX3QpTjsKLSAgICAgICAgcmVuZGVyVGltZSArPSBtVGltZUNvcnJlY3Rpb247Ci0gICAgICAgIG5zZWNzX3QgY29ycmVjdGlvbkxpbWl0ID0gbVZzeW5jUGVyaW9kICogMyAvIDU7Ci0gICAgICAgIGVkZ2VSZW1haW5kZXIgPSBhYnMoZWRnZVJlbWFpbmRlciAvIChuc2Vjc190KU4gLSBtVnN5bmNQZXJpb2QgLyAyKTsKLSAgICAgICAgaWYgKGVkZ2VSZW1haW5kZXIgPD0gbVZzeW5jUGVyaW9kIC8gMykgewotICAgICAgICAgICAgY29ycmVjdGlvbkxpbWl0IC89IDI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlc3RpbWF0ZSBob3cgbWFueSBWU1lOQ3MgYSBmcmFtZSB3aWxsIHNwZW5kIG9uIHRoZSBkaXNwbGF5Ci0gICAgICAgIG5zZWNzX3QgbmV4dFZzeW5jVGltZSA9Ci0gICAgICAgICAgICByZW5kZXJUaW1lICsgbVZzeW5jUGVyaW9kIC0gKChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2QpOwotICAgICAgICBpZiAobUxhc3RWc3luY1RpbWUgPj0gMCkgewotICAgICAgICAgICAgc2l6ZV90IG1pblZzeW5jc1BlckZyYW1lID0gdmlkZW9QZXJpb2QgLyBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICBzaXplX3QgdnN5bmNzRm9yTGFzdEZyYW1lID0gZGl2Um91bmQobmV4dFZzeW5jVGltZSAtIG1MYXN0VnN5bmNUaW1lLCBtVnN5bmNQZXJpb2QpOwotICAgICAgICAgICAgYm9vbCB2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50ID0KLSAgICAgICAgICAgICAgICBwZXJpb2RpY0Vycm9yKHZpZGVvUGVyaW9kLCBtVnN5bmNQZXJpb2QpIC8gKG1Wc3luY1BlcmlvZCAvIDIwKSA9PSAwOwotCi0gICAgICAgICAgICBpZiAobVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICYmCi0gICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA+IG1pblZzeW5jc1BlckZyYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhIFZTWU5DCi0gICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgLT0gbVZzeW5jUGVyaW9kOwotICAgICAgICAgICAgICAgIGlmICh2c3luY3NGb3JMYXN0RnJhbWUgPiAwKQotICAgICAgICAgICAgICAgICAgICAtLXZzeW5jc0Zvckxhc3RGcmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAmJgotICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPT0gbWluVnN5bmNzUGVyRnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIGEgVlNZTkMKLSAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSArPSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA8IFVMT05HX01BWCkKLSAgICAgICAgICAgICAgICAgICAgKyt2c3luY3NGb3JMYXN0RnJhbWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgKiAyCi0gICAgICAgICAgICAgICAgICAgIHx8IG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAqIDIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGlvbiBiZXlvbmQgbGltaXQ6ICVsbGQgdnMgJWxsZCAodnN5bmNzIGZvciBsYXN0IGZyYW1lOiAlenUsIG1pbjogJXp1KSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgcmVzdGFydGluZy4gcmVuZGVyPSVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltVGltZUNvcnJlY3Rpb24sIChsb25nIGxvbmcpY29ycmVjdGlvbkxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgdnN5bmNzRm9yTGFzdEZyYW1lLCBtaW5Wc3luY3NQZXJGcmFtZSwgKGxvbmcgbG9uZylvcmlnUmVuZGVyVGltZSk7Ci0gICAgICAgICAgICAgICAgcmVzdGFydCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvcmlnUmVuZGVyVGltZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVRSQUNFX0lOVCgiRlJBTUVfVlNZTkNTIiwgdnN5bmNzRm9yTGFzdEZyYW1lKTsKLSAgICAgICAgfQotICAgICAgICBtTGFzdFZzeW5jVGltZSA9IG5leHRWc3luY1RpbWU7Ci0gICAgfQotCi0gICAgLy8gYWxpZ24gcmVuZGVydGltZSB0byB0aGUgY2VudGVyIGJldHdlZW4gVlNZTkMgZWRnZXMKLSAgICByZW5kZXJUaW1lIC09IChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7Ci0gICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgIEFMT0dWKCJhZGp1c3RpbmcgcmVuZGVyOiAlbGxkID0+ICVsbGQiLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOwotICAgIEFUUkFDRV9JTlQoIkZSQU1FX0ZMSVBfSU4obXMpIiwgKHJlbmRlclRpbWUgLSBub3cpIC8gMTAwMDAwMCk7Ci0gICAgcmV0dXJuIHJlbmRlclRpbWU7Ci19Ci0KIHZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6cmVsZWFzZSgpIHsKICAgICBtQ29tcG9zZXIuY2xlYXIoKTsKIH0KQEAgLTUwNyw0ICs2OSwzIEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNjcxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpZGVvRnJhbWVTY2hlZHVsZXIyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9jaG9yZW9ncmFwaGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgdm9pZCBnZXRWc3luY09mZnNldChuc2Vjc190KiBhcHBWc3luY09mZnNldFB0ciwgbnNlY3NfdCogc2ZWc3luY09mZnNldFB0cik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWc3luY1RyYWNrZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworY2xhc3MgVnN5bmNUcmFja2VyIDogcHVibGljIFJlZkJhc2V7CitwdWJsaWM6CisgICAgVnN5bmNUcmFja2VyKCk7CisgICAgflZzeW5jVHJhY2tlcigpIHt9CisgICAgbnNlY3NfdCBnZXRWc3luY1BlcmlvZCgpOworICAgIG5zZWNzX3QgZ2V0VnN5bmNUaW1lKG5zZWNzX3QgcGVyaW9kT2Zmc2V0KTsKKyAgICB2b2lkIGFkZFNhbXBsZShuc2Vjc190IHRpbWVzdGFtcCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IGludCBrTWF4U2FtcGxlcyA9IDMyOworICAgIHN0YXRpYyBjb25zdCBpbnQga01pblNhbXBsZXNGb3JVcGRhdGUgPSA2OworICAgIGludCBtTnVtU2FtcGxlczsKKyAgICBpbnQgbUZpcnN0U2FtcGxlOworICAgIG5zZWNzX3QgbVJlZmVyZW5jZVRpbWU7CisgICAgbnNlY3NfdCBtUGhhc2U7CisgICAgbnNlY3NfdCBtUGVyaW9kOworICAgIG5zZWNzX3QgbVRpbWVzdGFtcFNhbXBsZXNba01heFNhbXBsZXNdOworICAgIE11dGV4IG1Mb2NrOworCisgICAgdm9pZCB1cGRhdGVNb2RlbExvY2tlZCgpOworfTsKKworVnN5bmNUcmFja2VyOjpWc3luY1RyYWNrZXIoKQorICAgIDogbU51bVNhbXBsZXMoMCksCisgICAgICBtRmlyc3RTYW1wbGUoMCksCisgICAgICBtUmVmZXJlbmNlVGltZSgwKSwKKyAgICAgIG1QaGFzZSgwKSwKKyAgICAgIG1QZXJpb2QoMCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heFNhbXBsZXM7IGkrKykgeworICAgICAgICBtVGltZXN0YW1wU2FtcGxlc1tpXSA9IDA7CisgICAgfQorfQorCituc2Vjc190IFZzeW5jVHJhY2tlcjo6Z2V0VnN5bmNQZXJpb2QoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGRhdGFMb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVBlcmlvZDsKK30KKworbnNlY3NfdCBWc3luY1RyYWNrZXI6OmdldFZzeW5jVGltZShuc2Vjc190IHBlcmlvZE9mZnNldCkgeworICAgIE11dGV4OjpBdXRvbG9jayBkYXRhTG9jayhtTG9jayk7CisgICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgbnNlY3NfdCBwaGFzZSA9IG1SZWZlcmVuY2VUaW1lICsgbVBoYXNlOworCisgICAgLy8gcmVzdWx0ID0gKCgobm93IC0gcGhhc2UpIC8gbVBlcmlvZCkgKyBwZXJpb2RPZmZzZXQgKyAxKSAqIG1QZXJpb2QgKyBwaGFzZQorICAgIC8vIHByZXZlbnQgb3ZlcmZsb3cKKyAgICBuc2Vjc190IHJlc3VsdCA9IChub3cgLSBwaGFzZSkgLyBtUGVyaW9kOworICAgIGlmIChyZXN1bHQgPiBMT05HX0xPTkdfTUFYIC0gcGVyaW9kT2Zmc2V0IC0gMSkgeworICAgICAgICByZXR1cm4gTE9OR19MT05HX01BWDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gcGVyaW9kT2Zmc2V0ICsgMTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCA+IExPTkdfTE9OR19NQVggLyBtUGVyaW9kKSB7CisgICAgICAgIHJldHVybiBMT05HX0xPTkdfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCAqPSBtUGVyaW9kOworICAgIH0KKyAgICBpZiAocmVzdWx0ID4gTE9OR19MT05HX01BWCAtIHBoYXNlKSB7CisgICAgICAgIHJldHVybiBMT05HX0xPTkdfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBwaGFzZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFZzeW5jVHJhY2tlcjo6YWRkU2FtcGxlKG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGRhdGFMb2NrKG1Mb2NrKTsKKyAgICBpZiAobU51bVNhbXBsZXMgPT0gMCkgeworICAgICAgICBtUGhhc2UgPSAwOworICAgICAgICBtUmVmZXJlbmNlVGltZSA9IHRpbWVzdGFtcDsKKyAgICB9CisgICAgaW50IGlkeCA9IChtRmlyc3RTYW1wbGUgKyBtTnVtU2FtcGxlcykgJSBrTWF4U2FtcGxlczsKKyAgICBtVGltZXN0YW1wU2FtcGxlc1tpZHhdID0gdGltZXN0YW1wOworICAgIGlmIChtTnVtU2FtcGxlcyA8IGtNYXhTYW1wbGVzKSB7CisgICAgICAgIG1OdW1TYW1wbGVzKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZpcnN0U2FtcGxlID0gKG1GaXJzdFNhbXBsZSArIDEpICUga01heFNhbXBsZXM7CisgICAgfQorICAgIHVwZGF0ZU1vZGVsTG9ja2VkKCk7Cit9CisKK3ZvaWQgVnN5bmNUcmFja2VyOjp1cGRhdGVNb2RlbExvY2tlZCgpIHsKKyAgICBpZiAobU51bVNhbXBsZXMgPCBrTWluU2FtcGxlc0ZvclVwZGF0ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5zZWNzX3QgZHVyYXRpb25TdW0gPSAwOworICAgIG5zZWNzX3QgbWluRHVyYXRpb24gPSBMT05HX01BWDsKKyAgICBuc2Vjc190IG1heER1cmF0aW9uID0gMDsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbU51bVNhbXBsZXM7IGkrKykgeworICAgICAgICBpbnQgaWR4ID0gKG1GaXJzdFNhbXBsZSArIGkpICUga01heFNhbXBsZXM7CisgICAgICAgIGludCBwcmV2ID0gKGlkeCArIGtNYXhTYW1wbGVzIC0gMSkgJSBrTWF4U2FtcGxlczsKKyAgICAgICAgbG9uZyBkdXJhdGlvbiA9IG1UaW1lc3RhbXBTYW1wbGVzW2lkeF0gLSBtVGltZXN0YW1wU2FtcGxlc1twcmV2XTsKKyAgICAgICAgZHVyYXRpb25TdW0gKz0gZHVyYXRpb247CisgICAgICAgIGlmIChtaW5EdXJhdGlvbiA+IGR1cmF0aW9uKSB7IG1pbkR1cmF0aW9uID0gZHVyYXRpb247IH0KKyAgICAgICAgaWYgKG1heER1cmF0aW9uIDwgZHVyYXRpb24pIHsgbWF4RHVyYXRpb24gPSBkdXJhdGlvbjsgfQorICAgIH0KKworICAgIGR1cmF0aW9uU3VtIC09IChtaW5EdXJhdGlvbiArIG1heER1cmF0aW9uKTsKKyAgICBtUGVyaW9kID0gZHVyYXRpb25TdW0gLyAobU51bVNhbXBsZXMgLSAzKTsKKworICAgIGRvdWJsZSBzYW1wbGVBdmdYID0gMC4wOworICAgIGRvdWJsZSBzYW1wbGVBdmdZID0gMC4wOworICAgIGRvdWJsZSBzY2FsZSA9IDIuMCAqIE1fUEkgLyAoZG91YmxlKSBtUGVyaW9kOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludCBpZHggPSAobUZpcnN0U2FtcGxlICsgaSkgJSBrTWF4U2FtcGxlczsKKyAgICAgICAgbG9uZyBzYW1wbGUgPSBtVGltZXN0YW1wU2FtcGxlc1tpZHhdIC0gbVJlZmVyZW5jZVRpbWU7CisgICAgICAgIGRvdWJsZSBzYW1wbGVQaGFzZSA9IChkb3VibGUpIChzYW1wbGUgJSBtUGVyaW9kKSAqIHNjYWxlOworICAgICAgICBzYW1wbGVBdmdYICs9IGNvcyhzYW1wbGVQaGFzZSk7CisgICAgICAgIHNhbXBsZUF2Z1kgKz0gc2luKHNhbXBsZVBoYXNlKTsKKyAgICB9CisKKyAgICBzYW1wbGVBdmdYIC89IChkb3VibGUpIG1OdW1TYW1wbGVzIC0gMS4wOworICAgIHNhbXBsZUF2Z1kgLz0gKGRvdWJsZSkgbU51bVNhbXBsZXMgLSAxLjA7CisgICAgbVBoYXNlID0gKGxvbmcpIChhdGFuMihzYW1wbGVBdmdZLCBzYW1wbGVBdmdYKSAvIHNjYWxlKTsKK30KKworc3RhdGljIHZvaWQgZnJhbWVDYWxsYmFjayhpbnQ2NF90IGZyYW1lVGltZU5hbm9zLCB2b2lkKiBkYXRhKSB7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPFZzeW5jVHJhY2tlcj4gdnN5bmNUcmFja2VyKHN0YXRpY19jYXN0PFZzeW5jVHJhY2tlcio+KGRhdGEpKTsKKyAgICB2c3luY1RyYWNrZXItPmFkZFNhbXBsZShmcmFtZVRpbWVOYW5vcyk7CisgICAgQUNob3Jlb2dyYXBoZXJfcG9zdEZyYW1lQ2FsbGJhY2s2NChBQ2hvcmVvZ3JhcGhlcl9nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgZnJhbWVDYWxsYmFjaywgc3RhdGljX2Nhc3Q8dm9pZCo+KHZzeW5jVHJhY2tlci5nZXQoKSkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpOSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyB2b2lkIGdldFZzeW5jT2Zmc2V0KG5zZWNzX3QqIGFwcFZzeW5jT2Zmc2V0UHRyLCBuc2Vjc190KiBzZlZzeW5jT2Zmc2V0UHRyKSB7CisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga09uZU1pbGxpc2VjSW5OYW5vc2VjID0gMTAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrT25lU2VjSW5OYW5vc2VjID0ga09uZU1pbGxpc2VjSW5OYW5vc2VjICogMTAwMDsKKworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzID0gZW52LT5GaW5kQ2xhc3MoCisgICAgICAgICAgICAiYW5kcm9pZC9oYXJkd2FyZS9kaXNwbGF5L0Rpc3BsYXlNYW5hZ2VyR2xvYmFsIik7CisgICAgamNsYXNzIGpEaXNwbGF5Q2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvdmlldy9EaXNwbGF5Iik7CisKKyAgICBqbWV0aG9kSUQgakdldEluc3RhbmNlID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChqRGlzcGxheU1hbmFnZXJHbG9iYWxDbHMsCisgICAgICAgICAgICAiZ2V0SW5zdGFuY2UiLCAiKClMYW5kcm9pZC9oYXJkd2FyZS9kaXNwbGF5L0Rpc3BsYXlNYW5hZ2VyR2xvYmFsOyIpOworICAgIGpvYmplY3QgamF2YURpc3BsYXlNYW5hZ2VyR2xvYmFsT2JqID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKAorICAgICAgICAgICAgakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzLCBqR2V0SW5zdGFuY2UpOworCisgICAgamZpZWxkSUQgakRFRkFVTFRfRElTUExBWSA9IGVudi0+R2V0U3RhdGljRmllbGRJRChqRGlzcGxheUNscywgIkRFRkFVTFRfRElTUExBWSIsICJJIik7CisgICAgamludCBERUZBVUxUX0RJU1BMQVkgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKGpEaXNwbGF5Q2xzLCBqREVGQVVMVF9ESVNQTEFZKTsKKworICAgIGptZXRob2RJRCBqZ2V0UmVhbERpc3BsYXkgPSBlbnYtPkdldE1ldGhvZElEKGpEaXNwbGF5TWFuYWdlckdsb2JhbENscywKKyAgICAgICAgICAgICJnZXRSZWFsRGlzcGxheSIsICIoSSlMYW5kcm9pZC92aWV3L0Rpc3BsYXk7Iik7CisgICAgam9iamVjdCBqYXZhRGlzcGxheU9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZCgKKyAgICAgICAgICAgIGphdmFEaXNwbGF5TWFuYWdlckdsb2JhbE9iaiwgamdldFJlYWxEaXNwbGF5LCBERUZBVUxUX0RJU1BMQVkpOworCisgICAgam1ldGhvZElEIGpHZXRSZWZyZXNoUmF0ZSA9IGVudi0+R2V0TWV0aG9kSUQoakRpc3BsYXlDbHMsICJnZXRSZWZyZXNoUmF0ZSIsICIoKUYiKTsKKyAgICBqZmxvYXQgamF2YVJlZnJlc2hSYXRlID0gZW52LT5DYWxsRmxvYXRNZXRob2QoamF2YURpc3BsYXlPYmosIGpHZXRSZWZyZXNoUmF0ZSk7CisgICAgbnNlY3NfdCB2c3luY1BlcmlvZCA9IChuc2Vjc190KSAoa09uZVNlY0luTmFub3NlYyAvIChmbG9hdCkgamF2YVJlZnJlc2hSYXRlKTsKKworICAgIGptZXRob2RJRCBqR2V0QXBwVnN5bmNPZmZzZXROYW5vcyA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqRGlzcGxheUNscywgImdldEFwcFZzeW5jT2Zmc2V0TmFub3MiLCAiKClKIik7CisgICAgamxvbmcgamF2YUFwcFZzeW5jT2Zmc2V0ID0gZW52LT5DYWxsTG9uZ01ldGhvZChqYXZhRGlzcGxheU9iaiwgakdldEFwcFZzeW5jT2Zmc2V0TmFub3MpOworICAgICphcHBWc3luY09mZnNldFB0ciA9IChuc2Vjc190KSBqYXZhQXBwVnN5bmNPZmZzZXQ7CisKKyAgICBqbWV0aG9kSUQgakdldFByZXNlbnRhdGlvbkRlYWRsaW5lTmFub3MgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgakRpc3BsYXlDbHMsICJnZXRQcmVzZW50YXRpb25EZWFkbGluZU5hbm9zIiwgIigpSiIpOworICAgIGpsb25nIGphdmFQcmVzZW50YXRpb25EZWFkbGluZSA9IGVudi0+Q2FsbExvbmdNZXRob2QoCisgICAgICAgICAgICBqYXZhRGlzcGxheU9iaiwgakdldFByZXNlbnRhdGlvbkRlYWRsaW5lTmFub3MpOworCisgICAgKnNmVnN5bmNPZmZzZXRQdHIgPSB2c3luY1BlcmlvZCAtICgobnNlY3NfdCkgamF2YVByZXNlbnRhdGlvbkRlYWRsaW5lIC0ga09uZU1pbGxpc2VjSW5OYW5vc2VjKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9yZW9ncmFwaGVyIFRocmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgQ2hvcmVvZ3JhcGhlclRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIENob3Jlb2dyYXBoZXJUaHJlYWQoYm9vbCBjYW5DYWxsSmF2YSk7CisgICAgc3RhdHVzX3QgaW5pdCh2b2lkKiBkYXRhKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWR5VG9SdW4oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2hvcmVvZ3JhcGhlclRocmVhZCgpIHt9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2hvcmVvZ3JhcGhlclRocmVhZCk7CisgICAgdm9pZCogbURhdGE7Cit9OworCitDaG9yZW9ncmFwaGVyVGhyZWFkOjpDaG9yZW9ncmFwaGVyVGhyZWFkKGJvb2wgY2FuQ2FsbEphdmEpIDogVGhyZWFkKGNhbkNhbGxKYXZhKSB7Cit9CisKK3N0YXR1c190IENob3Jlb2dyYXBoZXJUaHJlYWQ6OmluaXQodm9pZCogZGF0YSkgeworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIG1EYXRhID0gZGF0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENob3Jlb2dyYXBoZXJUaHJlYWQ6OnJlYWR5VG9SdW4oKSB7CisgICAgQUxvb3Blcl9wcmVwYXJlKEFMT09QRVJfUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTKTsKKyAgICBpZiAoQUNob3Jlb2dyYXBoZXJfZ2V0SW5zdGFuY2UoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBQ2hvcmVvZ3JhcGhlcl9wb3N0RnJhbWVDYWxsYmFjazY0KEFDaG9yZW9ncmFwaGVyX2dldEluc3RhbmNlKCksIGZyYW1lQ2FsbGJhY2ssIG1EYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ2hvcmVvZ3JhcGhlclRocmVhZDo6dGhyZWFkTG9vcCgpIHsKKyAgICBBTG9vcGVyX3BvbGxPbmNlKC0xLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitWaWRlb0ZyYW1lU2NoZWR1bGVyMjo6VmlkZW9GcmFtZVNjaGVkdWxlcjIoKSA6IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCkgeworCisgICAgZ2V0VnN5bmNPZmZzZXQoJm1BcHBWc3luY09mZnNldCwgJm1TZlZzeW5jT2Zmc2V0KTsKKworICAgIE11dGV4OjpBdXRvbG9jayB0aHJlYWRMb2NrKG1Mb2NrKTsKKyAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZCA9IG5ldyBDaG9yZW9ncmFwaGVyVGhyZWFkKHRydWUpOworCisgICAgbVZzeW5jVHJhY2tlciA9IG5ldyBWc3luY1RyYWNrZXIoKTsKKyAgICBpZiAobUNob3Jlb2dyYXBoZXJUaHJlYWQtPmluaXQoc3RhdGljX2Nhc3Q8dm9pZCo+KG1Wc3luY1RyYWNrZXIuZ2V0KCkpKSAhPSBPSykgeworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC5jbGVhcigpOworICAgIH0KKyAgICBpZiAobUNob3Jlb2dyYXBoZXJUaHJlYWQgIT0gTlVMTCAmJiBtQ2hvcmVvZ3JhcGhlclRocmVhZC0+cnVuKCJDaG9yZW9ncmFwaGVyIikgIT0gT0spIHsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQuY2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjI6OnVwZGF0ZVZzeW5jKCkgeworICAgIG1Wc3luY1RpbWUgPSAwOworICAgIG1Wc3luY1BlcmlvZCA9IDA7CisKKyAgICBpZiAobVZzeW5jVHJhY2tlciAhPSBOVUxMKSB7CisgICAgICAgIG1Wc3luY1BlcmlvZCA9IG1Wc3luY1RyYWNrZXItPmdldFZzeW5jUGVyaW9kKCk7CisgICAgICAgIG1Wc3luY1RpbWUgPSBtVnN5bmNUcmFja2VyLT5nZXRWc3luY1RpbWUobVNmVnN5bmNPZmZzZXQgLSBtQXBwVnN5bmNPZmZzZXQpOworICAgIH0KKyAgICBtVnN5bmNSZWZyZXNoQXQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyBrVnN5bmNSZWZyZXNoUGVyaW9kOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXIyOjpyZWxlYXNlKCkgeworICAgIC8vIERvIG5vdCBjaGFuZ2Ugb3JkZXIKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayB0aHJlYWRMb2NrKG1Mb2NrKTsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC5jbGVhcigpOworICAgIH0KKworICAgIG1Wc3luY1RyYWNrZXIuY2xlYXIoKTsKK30KKworVmlkZW9GcmFtZVNjaGVkdWxlcjI6On5WaWRlb0ZyYW1lU2NoZWR1bGVyMigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzEwN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwCkBAIC0wLDAgKzEsNDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3QgVCAqbGhzLCBjb25zdCBUICpyaHMpIHsKKyAgICBpZiAoKmxocyA8ICpyaHMpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoKmxocyA+ICpyaHMpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUgPSAzOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RvcFByaW1lID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtIaXN0b3J5U2l6ZTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtIaXN0b3J5U2l6ZTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrUHJlY2lzaW9uID0gMTI7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrRXJyb3JUaHJlc2hvbGQgPSAoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSAvIDEwOworc3RhdGljIGNvbnN0IGludDY0X3Qga011bHRpcGxlc1RocmVzaG9sZERpdiA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1JQorc3RhdGljIGNvbnN0IGludDY0X3Qga1JlRml0VGhyZXNob2xkRGl2ID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDElCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzOyAgICAgLy8gMSBzZWMKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5QZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xcyAvIDEyMDsgICAgICAgICAvLyAxMjBIegorc3RhdGljIGNvbnN0IG5zZWNzX3Qga1JlZml0UmVmcmVzaFBlcmlvZCA9IDEwICogVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXM7IC8vIDEwIHNlYworCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpQTEwoKQorICAgIDogbVBlcmlvZCgtMSksCisgICAgICBtUGhhc2UoMCksCisgICAgICBtUHJpbWVkKGZhbHNlKSwKKyAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcoMCksCisgICAgICBtTGFzdFRpbWUoLTEpLAorICAgICAgbU51bVNhbXBsZXMoMCkgeworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OnJlc2V0KGZsb2F0IGZwcykgeworICAgIC8vdGVzdCgpOworCisgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7CisgICAgbUxhc3RUaW1lID0gLTE7CisKKyAgICAvLyBzZXQgdXAgb3IgcmVzZXQgdmlkZW8gUExMCisgICAgaWYgKGZwcyA8PSAwLmYpIHsKKyAgICAgICAgbVBlcmlvZCA9IC0xOworICAgICAgICBtUHJpbWVkID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInJlc2V0IGF0ICUuMWYgZnBzIiwgZnBzKTsKKyAgICAgICAgbVBlcmlvZCA9IChuc2Vjc190KSgxZTkgLyBmcHMgKyAwLjUpOworICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXN0YXJ0KCk7Cit9CisKKy8vIHJlc2V0IFBMTCBidXQga2VlcCBwcmV2aW91cyBwZXJpb2QgZXN0aW1hdGUKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cmVzdGFydCgpIHsKKyAgICBtTnVtU2FtcGxlcyA9IDA7CisgICAgbVBoYXNlID0gLTE7Cit9CisKKyNpZiAwCisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6dGVzdCgpIHsKKyAgICBuc2Vjc190IHBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzIC8gNjA7CisgICAgbVRpbWVzWzBdID0gMDsKKyAgICBtVGltZXNbMV0gPSBwZXJpb2Q7CisgICAgbVRpbWVzWzJdID0gcGVyaW9kICogMzsKKyAgICBtVGltZXNbM10gPSBwZXJpb2QgKiA0OworICAgIG1UaW1lc1s0XSA9IHBlcmlvZCAqIDc7CisgICAgbVRpbWVzWzVdID0gcGVyaW9kICogODsKKyAgICBtVGltZXNbNl0gPSBwZXJpb2QgKiAxMDsKKyAgICBtVGltZXNbN10gPSBwZXJpb2QgKiAxMjsKKyAgICBtTnVtU2FtcGxlcyA9IDg7CisgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgZml0KDAsIHBlcmlvZCAqIDEyIC8gNywgOCwgJmEsICZiLCAmZXJyKTsKKyAgICAvLyBhID0gMC44KDUpKworICAgIC8vIGIgPSAtMC4xNDA5NygyKSsKKyAgICAvLyBlcnIgPSAwLjI3NTA1NzgoNzAzKSsKKyAgICBBTE9HRCgiYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpYSwgKGEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyliLCAoYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKWVyciwgKGVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOworfQorCisjZW5kaWYKKworYm9vbCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpmaXQoCisgICAgICAgIG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlc1RvVXNlLAorICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpIHsKKyAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKKyAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7CisgICAgfQorCisgICAgaWYgKChwZXJpb2QgPj4ga1ByZWNpc2lvbikgPT0gMCApIHsKKyAgICAgICAgQUxPR1coIlBlcmlvZCBpcyAwLCBvciBhZnRlciBpbmNsdWRpbmcgcHJlY2lzaW9uIGlzIDAgLSB3b3VsZCBjYXVzZSBkaXYwLCByZXR1cm5pbmciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3Qgc3VtWCA9IDA7CisgICAgaW50NjRfdCBzdW1YWCA9IDA7CisgICAgaW50NjRfdCBzdW1YWSA9IDA7CisgICAgaW50NjRfdCBzdW1ZWSA9IDA7CisgICAgaW50NjRfdCBzdW1ZID0gMDsKKworICAgIGludDY0X3QgeCA9IDA7IC8vIHggdXN1YWxseSBpcyBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKQorICAgIG5zZWNzX3QgbGFzdFRpbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7IGkrKykgeworICAgICAgICBzaXplX3QgaXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2l4XTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICB4ICs9IGRpdlJvdW5kKHRpbWUgLSBsYXN0VGltZSwgcGVyaW9kKTsKKyAgICAgICAgfQorICAgICAgICAvLyB5IGlzIHVzdWFsbHkgaW4gWy1udW1TYW1wbGVzVG9Vc2UuLm51bVNhbXBsZXNUb1VzZStrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QpIDw8IGtQcmVjaXNpb24KKyAgICAgICAgLy8gICBpZGVhbGx5IGluIFswLi5udW1TYW1wbGVzVG9Vc2UpLCBidXQgc2hpZnRlZCBieSAtbnVtU2FtcGxlc1RvVXNlIGR1cmluZworICAgICAgICAvLyAgIHByaW1pbmcsIGFuZCBwb3NzaWJseSBzaGlmdGVkIGJ5IHVwIHRvIGtSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZAorICAgICAgICAvLyAgIHdoaWxlIHdlIGFyZSBub3QgcmVmaXR0aW5nLgorICAgICAgICBpbnQ2NF90IHkgPSBkaXZSb3VuZCh0aW1lIC0gcGhhc2UsIHBlcmlvZCA+PiBrUHJlY2lzaW9uKTsKKyAgICAgICAgc3VtWCArPSB4OworICAgICAgICBzdW1ZICs9IHk7CisgICAgICAgIHN1bVhYICs9IHggKiB4OworICAgICAgICBzdW1YWSArPSB4ICogeTsKKyAgICAgICAgc3VtWVkgKz0geSAqIHk7CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRpdiAgID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFggLSBzdW1YICogc3VtWDsKKyAgICBpZiAoZGl2ID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3QgYV9ub20gPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWSAtIHN1bVggKiBzdW1ZOworICAgIGludDY0X3QgYl9ub20gPSBzdW1YWCAqIHN1bVkgICAgICAgICAgICAtIHN1bVggKiBzdW1YWTsKKyAgICAqYSA9IGRpdlJvdW5kKGFfbm9tLCBkaXYpOworICAgICpiID0gZGl2Um91bmQoYl9ub20sIGRpdik7CisgICAgLy8gZG9uJ3QgdXNlIGEgYW5kIGIgZGlyZWN0bHkgYXMgdGhlIHJvdW5kaW5nIGVycm9yIGlzIHNpZ25pZmljYW50CisgICAgKmVyciA9IHN1bVlZIC0gZGl2Um91bmQoYV9ub20gKiBzdW1YWSArIGJfbm9tICogc3VtWSwgZGl2KTsKKyAgICBBTE9HVigiZml0dGluZ1slenVdIGE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCisgICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsCisgICAgICAgICAgICAobG9uZyBsb25nKSphLCAgICgqYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKSpiLCAgICgqYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKSplcnIsICgqZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cHJpbWUoc2l6ZV90IG51bVNhbXBsZXNUb1VzZSkgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisgICAgQ0hFQ0sobnVtU2FtcGxlc1RvVXNlID49IDMpOyAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IDMgc2FtcGxlcworCisgICAgLy8gZXN0aW1hdGUgdmlkZW8gZnJhbWVyYXRlIGZyb20gZGVsdGFzIGJldHdlZW4gdGltZXN0YW1wcywgYW5kCisgICAgLy8gMm5kIG9yZGVyIGRlbHRhcworICAgIFZlY3Rvcjxuc2Vjc190PiBkZWx0YXM7CisgICAgbnNlY3NfdCBsYXN0VGltZSwgZmlyc3RUaW1lOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7CisgICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpbmRleF07CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VGltZSA+IGtNaW5QZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTogJWxsZCIsIChsb25nIGxvbmcpKHRpbWUgLSBsYXN0VGltZSkpOworICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKHRpbWUgLSBsYXN0VGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaXJzdFRpbWUgPSB0aW1lOworICAgICAgICB9CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisgICAgZGVsdGFzLnNvcnQoY29tcGFyZTxuc2Vjc190Pik7CisgICAgc2l6ZV90IG51bURlbHRhcyA9IGRlbHRhcy5zaXplKCk7CisgICAgaWYgKG51bURlbHRhcyA+IDEpIHsKKyAgICAgICAgbnNlY3NfdCBkZWx0YU1pbkxpbWl0ID0gbWF4KGRlbHRhc1swXSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYsIGtNaW5QZXJpb2QpOworICAgICAgICBuc2Vjc190IGRlbHRhTWF4TGltaXQgPSBkZWx0YXNbbnVtRGVsdGFzIC8gMl0gKiBrTXVsdGlwbGVzVGhyZXNob2xkRGl2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gbnVtRGVsdGFzIC8gMiArIDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgaWYgKGRlbHRhc1tpXSA+IGRlbHRhTWF4TGltaXQpIHsKKyAgICAgICAgICAgICAgICBkZWx0YXMucmVzaXplKGkpOworICAgICAgICAgICAgICAgIG51bURlbHRhcyA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgbnNlY3NfdCBkZWx0YTJuZCA9IGRlbHRhc1tpXSAtIGRlbHRhc1tpIC0gMV07CisgICAgICAgICAgICBpZiAoZGVsdGEybmQgPj0gZGVsdGFNaW5MaW1pdCkgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhMjogJWxsZCIsIChsb25nIGxvbmcpKGRlbHRhMm5kKSk7CisgICAgICAgICAgICAgICAgZGVsdGFzLnB1c2goZGVsdGEybmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXNlIHRoZSBvbmUgdGhhdCB5aWVsZHMgdGhlIGJlc3QgbWF0Y2gKKyAgICBpbnQ2NF90IGJlc3RTY29yZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlbHRhcy5zaXplKCk7ICsraSkgeworICAgICAgICBuc2Vjc190IGRlbHRhID0gZGVsdGFzW2ldOworICAgICAgICBpbnQ2NF90IHNjb3JlID0gMDsKKyNpZiAxCisgICAgICAgIC8vIHNpbXBsZXN0IHNjb3JlOiBudW1iZXIgb2YgZGVsdGFzIHRoYXQgYXJlIG5lYXIgbXVsdGlwbGVzCisgICAgICAgIHNpemVfdCBtYXRjaGVzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZWx0YXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG5zZWNzX3QgZXJyID0gcGVyaW9kaWNFcnJvcihkZWx0YXNbal0sIGRlbHRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCBkZWx0YSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYpIHsKKyAgICAgICAgICAgICAgICArK21hdGNoZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2NvcmUgPSBtYXRjaGVzOworI2lmIDAKKyAgICAgICAgLy8gY291bGQgYmUgd2VpZ2hlZCBieSB0aGUgKDEgLSBub3JtYWxpemVkIGVycm9yKQorICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOworICAgICAgICAgICAgZXJyID0gKDEgPDwgKDIgKiBrUHJlY2lzaW9uKSkgLSBlcnI7CisgICAgICAgICAgICBzY29yZSAqPSBtYXgoMCwgZXJyKTsKKyAgICAgICAgfQorI2VuZGlmCisjZWxzZQorICAgICAgICAvLyBvciB1c2UgdGhlIGVycm9yIGFzIGEgbmVnYXRpdmUgc2NvcmUKKyAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKKyAgICAgICAgICAgIHNjb3JlID0gLWRlbHRhICogZXJyOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKGkgPT0gMCB8fCBzY29yZSA+IGJlc3RTY29yZSkgeworICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CisgICAgICAgICAgICBtUGVyaW9kID0gZGVsdGE7CisgICAgICAgICAgICBtUGhhc2UgPSBmaXJzdFRpbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6YWRkU2FtcGxlKG5zZWNzX3QgdGltZSkgeworICAgIGlmIChtTGFzdFRpbWUgPj0gMAorICAgICAgICAgICAgLy8gaWYgdGltZSBnb2VzIGJhY2t3YXJkLCBvciB3ZSBza2lwcGVkIHJlbmRlcmluZworICAgICAgICAgICAgJiYgKHRpbWUgPiBtTGFzdFRpbWUgKyBrTWF4QWxsb3dlZEZyYW1lU2tpcCB8fCB0aW1lIDwgbUxhc3RUaW1lKSkgeworICAgICAgICByZXN0YXJ0KCk7CisgICAgfQorCisgICAgbUxhc3RUaW1lID0gdGltZTsKKyAgICBtVGltZXNbbU51bVNhbXBsZXMgJSBrSGlzdG9yeVNpemVdID0gdGltZTsKKyAgICArK21OdW1TYW1wbGVzOworCisgICAgYm9vbCBkb0ZpdCA9IHRpbWUgPiBtUmVmaXRBdDsKKyAgICBpZiAoKG1QZXJpb2QgPD0gMCB8fCAhbVByaW1lZCkgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUpIHsKKyAgICAgICAgcHJpbWUoa01pblNhbXBsZXNUb1N0b3BQcmltZSk7CisgICAgICAgICsrbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKyAgICAgICAgZG9GaXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobVBlcmlvZCA+IDAgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgIGlmIChtUGhhc2UgPCAwKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHBoYXNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciB0aW1lCisgICAgICAgICAgICBtUGhhc2UgPSB0aW1lOworICAgICAgICAgICAgZG9GaXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFkb0ZpdCkgeworICAgICAgICAgICAgaW50NjRfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKHRpbWUgLSBtUGhhc2UsIG1QZXJpb2QpOworICAgICAgICAgICAgZG9GaXQgPSBlcnIgPiBtUGVyaW9kIC8ga1JlRml0VGhyZXNob2xkRGl2OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvRml0KSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGlmICghZml0KG1QaGFzZSwgbVBlcmlvZCwga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kLCAmYSwgJmIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgLy8gc2FtcGxlcyBhcmUgbm90IHN1aXRhYmxlIGZvciBmaXR0aW5nLiAgdGhpcyBtZWFucyB0aGV5IGFyZQorICAgICAgICAgICAgICAgIC8vIGFsc28gbm90IHN1aXRhYmxlIGZvciBwcmltaW5nLgorICAgICAgICAgICAgICAgIEFMT0dWKCJjb3VsZCBub3QgZml0IC0ga2VlcGluZyBvbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QZXJpb2QpOworICAgICAgICAgICAgICAgIHJldHVybiBtUGVyaW9kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVmaXRBdCA9IHRpbWUgKyBrUmVmaXRSZWZyZXNoUGVyaW9kOworCisgICAgICAgICAgICBtUGhhc2UgKz0gKG1QZXJpb2QgKiBiKSA+PiBrUHJlY2lzaW9uOworICAgICAgICAgICAgbVBlcmlvZCA9IChtUGVyaW9kICogYSkgPj4ga1ByZWNpc2lvbjsKKyAgICAgICAgICAgIEFMT0dWKCJuZXcgcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOworCisgICAgICAgICAgICBpZiAoZXJyIDwga0Vycm9yVGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUHJpbWVkICYmIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPj0ga01pblNhbXBsZXNUb1N0b3BQcmltZSkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbVBlcmlvZDsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpnZXRQZXJpb2QoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QcmltZWQgPyBtUGVyaW9kIDogMDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKQorICAgIDogbVZzeW5jVGltZSgwKSwKKyAgICAgIG1Wc3luY1BlcmlvZCgwKSwKKyAgICAgIG1Wc3luY1JlZnJlc2hBdCgwKSwKKyAgICAgIG1MYXN0VnN5bmNUaW1lKC0xKSwKKyAgICAgIG1UaW1lQ29ycmVjdGlvbigwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmluaXQoZmxvYXQgdmlkZW9GcHMpIHsKKyAgICB1cGRhdGVWc3luYygpOworCisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXNldCh2aWRlb0Zwcyk7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OnJlc3RhcnQoKSB7CisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXN0YXJ0KCk7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmdldFZzeW5jUGVyaW9kKCkgeworICAgIGlmIChtVnN5bmNQZXJpb2QgPiAwKSB7CisgICAgICAgIHJldHVybiBtVnN5bmNQZXJpb2Q7CisgICAgfQorICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOworfQorCitmbG9hdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6Z2V0RnJhbWVSYXRlKCkgeworICAgIG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmdldFBlcmlvZCgpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgcmV0dXJuIDFlOSAvIHZpZGVvUGVyaW9kOworICAgIH0KKyAgICByZXR1cm4gMC5mOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpIHsKKyAgICBuc2Vjc190IG9yaWdSZW5kZXJUaW1lID0gcmVuZGVyVGltZTsKKworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIGlmIChub3cgPj0gbVZzeW5jUmVmcmVzaEF0KSB7CisgICAgICAgIHVwZGF0ZVZzeW5jKCk7CisgICAgfQorCisgICAgLy8gd2l0aG91dCBWU1lOQyBpbmZvLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCisgICAgaWYgKG1Wc3luY1BlcmlvZCA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJubyB2c3luYzogcmVuZGVyPSVsbGQiLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOworICAgICAgICByZXR1cm4gcmVuZGVyVGltZTsKKyAgICB9CisKKyAgICAvLyBlbnN1cmUgdnN5bmMgdGltZSBpcyB3ZWxsIGJlZm9yZSAoY29ycmVjdGVkKSByZW5kZXIgdGltZQorICAgIGlmIChtVnN5bmNUaW1lID4gcmVuZGVyVGltZSAtIDQgKiBtVnN5bmNQZXJpb2QpIHsKKyAgICAgICAgbVZzeW5jVGltZSAtPQorICAgICAgICAgICAgKChtVnN5bmNUaW1lIC0gcmVuZGVyVGltZSkgLyBtVnN5bmNQZXJpb2QgKyA1KSAqIG1Wc3luY1BlcmlvZDsKKyAgICB9CisKKyAgICAvLyBWaWRlbyBwcmVzZW50YXRpb24gdGFrZXMgcGxhY2UgYXQgdGhlIFZTWU5DIF9hZnRlcl8gcmVuZGVyVGltZS4gIEFkanVzdCByZW5kZXJUaW1lCisgICAgLy8gc28gdGhpcyBlZmZlY3RpdmVseSBiZWNvbWVzIGEgcm91bmRpbmcgb3BlcmF0aW9uICh0byB0aGUgX2Nsb3Nlc3RfIFZTWU5DLikKKyAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisKKyAgICBjb25zdCBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5hZGRTYW1wbGUob3JpZ1JlbmRlclRpbWUpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgLy8gU21vb3RoIG91dCByZW5kZXJpbmcKKyAgICAgICAgc2l6ZV90IE4gPSAxMjsKKyAgICAgICAgbnNlY3NfdCBmaXZlU2l4dGhEZXYgPQorICAgICAgICAgICAgYWJzKCgodmlkZW9QZXJpb2QgKiA1ICsgbVZzeW5jUGVyaW9kKSAlIChtVnN5bmNQZXJpb2QgKiA2KSkgLSBtVnN5bmNQZXJpb2QpCisgICAgICAgICAgICAgICAgICAgIC8gKG1Wc3luY1BlcmlvZCAvIDEwMCk7CisgICAgICAgIC8vIHVzZSAyMCBzYW1wbGVzIGlmIHdlIGFyZSBkb2luZyA1OjYgcmF0aW8gKy0gMSUgKGUuZy4gcGxheWluZyA1MEh6IG9uIDYwSHopCisgICAgICAgIGlmIChmaXZlU2l4dGhEZXYgPCAxMikgeyAgLyogMTIlIC8gNiA9IDIlICovCisgICAgICAgICAgICBOID0gMjA7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IG9mZnNldCA9IDA7CisgICAgICAgIG5zZWNzX3QgZWRnZVJlbWFpbmRlciA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgeworICAgICAgICAgICAgb2Zmc2V0ICs9CisgICAgICAgICAgICAgICAgKHJlbmRlclRpbWUgKyBtVGltZUNvcnJlY3Rpb24gKyB2aWRlb1BlcmlvZCAqIGkgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIGVkZ2VSZW1haW5kZXIgKz0gKHZpZGVvUGVyaW9kICogaSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDIgLSBvZmZzZXQgLyAobnNlY3NfdClOOworICAgICAgICByZW5kZXJUaW1lICs9IG1UaW1lQ29ycmVjdGlvbjsKKyAgICAgICAgbnNlY3NfdCBjb3JyZWN0aW9uTGltaXQgPSBtVnN5bmNQZXJpb2QgKiAzIC8gNTsKKyAgICAgICAgZWRnZVJlbWFpbmRlciA9IGFicyhlZGdlUmVtYWluZGVyIC8gKG5zZWNzX3QpTiAtIG1Wc3luY1BlcmlvZCAvIDIpOworICAgICAgICBpZiAoZWRnZVJlbWFpbmRlciA8PSBtVnN5bmNQZXJpb2QgLyAzKSB7CisgICAgICAgICAgICBjb3JyZWN0aW9uTGltaXQgLz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGVzdGltYXRlIGhvdyBtYW55IFZTWU5DcyBhIGZyYW1lIHdpbGwgc3BlbmQgb24gdGhlIGRpc3BsYXkKKyAgICAgICAgbnNlY3NfdCBuZXh0VnN5bmNUaW1lID0KKyAgICAgICAgICAgIHJlbmRlclRpbWUgKyBtVnN5bmNQZXJpb2QgLSAoKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZCk7CisgICAgICAgIGlmIChtTGFzdFZzeW5jVGltZSA+PSAwKSB7CisgICAgICAgICAgICBzaXplX3QgbWluVnN5bmNzUGVyRnJhbWUgPSB2aWRlb1BlcmlvZCAvIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIHNpemVfdCB2c3luY3NGb3JMYXN0RnJhbWUgPSBkaXZSb3VuZChuZXh0VnN5bmNUaW1lIC0gbUxhc3RWc3luY1RpbWUsIG1Wc3luY1BlcmlvZCk7CisgICAgICAgICAgICBib29sIHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgPQorICAgICAgICAgICAgICAgIHBlcmlvZGljRXJyb3IodmlkZW9QZXJpb2QsIG1Wc3luY1BlcmlvZCkgLyAobVZzeW5jUGVyaW9kIC8gMjApID09IDA7CisKKyAgICAgICAgICAgIGlmIChtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID4gbWluVnN5bmNzUGVyRnJhbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgVlNZTkMKKyAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSAtPSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA+IDApCisgICAgICAgICAgICAgICAgICAgIC0tdnN5bmNzRm9yTGFzdEZyYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICYmCisgICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA9PSBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSBWU1lOQworICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lICs9IG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lIDwgVUxPTkdfTUFYKQorICAgICAgICAgICAgICAgICAgICArK3ZzeW5jc0Zvckxhc3RGcmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAqIDIKKyAgICAgICAgICAgICAgICAgICAgfHwgbVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICogMikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW9uIGJleW9uZCBsaW1pdDogJWxsZCB2cyAlbGxkICh2c3luY3MgZm9yIGxhc3QgZnJhbWU6ICV6dSwgbWluOiAlenUpIgorICAgICAgICAgICAgICAgICAgICAgICAgIiByZXN0YXJ0aW5nLiByZW5kZXI9JWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1UaW1lQ29ycmVjdGlvbiwgKGxvbmcgbG9uZyljb3JyZWN0aW9uTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICB2c3luY3NGb3JMYXN0RnJhbWUsIG1pblZzeW5jc1BlckZyYW1lLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lKTsKKyAgICAgICAgICAgICAgICByZXN0YXJ0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdSZW5kZXJUaW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBVFJBQ0VfSU5UKCJGUkFNRV9WU1lOQ1MiLCB2c3luY3NGb3JMYXN0RnJhbWUpOworICAgICAgICB9CisgICAgICAgIG1MYXN0VnN5bmNUaW1lID0gbmV4dFZzeW5jVGltZTsKKyAgICB9CisKKyAgICAvLyBhbGlnbiByZW5kZXJ0aW1lIHRvIHRoZSBjZW50ZXIgYmV0d2VlbiBWU1lOQyBlZGdlcworICAgIHJlbmRlclRpbWUgLT0gKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgQUxPR1YoImFkanVzdGluZyByZW5kZXI6ICVsbGQgPT4gJWxsZCIsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgQVRSQUNFX0lOVCgiRlJBTUVfRkxJUF9JTihtcykiLCAocmVuZGVyVGltZSAtIG5vdykgLyAxMDAwMDAwKTsKKyAgICByZXR1cm4gcmVuZGVyVGltZTsKK30KKworVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6On5WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpIHt9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCmluZGV4IGRiODYyMTguLjIxOGZlMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icApAQCAtNCw3ICs0LDcgQEAKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKLQorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBzcmNzOiBbCiAgICAgICAgICJDb252ZXJzaW9uLmNwcCIsCiAgICAgICAgICJGcmFtZURyb3BwZXIuY3BwIiwKQEAgLTI1LDcgKzI1LDYgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJndWkiLApAQCAtMzgsOCArMzcsNiBAQAogICAgICAgICAibGlidXRpbHMiLAogCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCi0KLSAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsIC8vIFRPRE8oYi82MjkyMzQ3OSk6IHVzZSBoZWFkZXIgbGlicmFyeQogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwCmluZGV4IGZmZWQwMDUuLjkxZDdjNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwCkBAIC05OCw2ICs5OCwxNyBAQAogICovCiAKIC8qKgorICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYHN0YXR1c190YC4gVGhpcyBpcyBmb3IgbGVnYWN5IGJpbmRlciBjYWxscy4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KKyAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYHN0YXR1c190YC4KKyAqLworLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IHN0YXR1c190CitzdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIHQuaXNPaygpID8gT0sgOiAodC5pc0RlYWRPYmplY3QoKSA/IERFQURfT0JKRUNUIDogVU5LTk9XTl9FUlJPUik7Cit9CisKKy8qKgogICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYGJpbmRlcjo6U3RhdHVzYC4KICAqCiAgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KQEAgLTEwNywyMiArMTE4LDExIEBACiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIHRvQmluZGVyU3RhdHVzKAogICAgICAgICBSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoCi0gICAgICAgICAgICB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUiwKKyAgICAgICAgICAgIHRvU3RhdHVzVCh0KSwKICAgICAgICAgICAgIHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKIH0KIAogLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICovCi0vLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gc3RhdHVzX3QKLXN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5pc09rKCkgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLS8qKgogICogXGJyaWVmIFdyYXAgYG5hdGl2ZV9oYW5kbGVfdCpgIGluIGBoaWRsX2hhbmRsZWAuCiAgKgogICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggNzFjZWVkOC4uYTQzNzRjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTc2Nyw3ICs3NjcsNyBAQAogICAgICAgICAgICAgZG91YmxlIG5GcmFtZXMgPSAodGltZVVzIC0gbVByZXZDYXB0dXJlVXMpICogbUNhcHR1cmVGcHMgLyAxMDAwMDAwOwogICAgICAgICAgICAgaWYgKG5GcmFtZXMgPCAwLjUgLSBrVGltZXN0YW1wRmx1Y3R1YXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBza2lwIHRoaXMgZnJhbWUgYXMgaXQncyB0b28gY2xvc2UgdG8gcHJldmlvdXMgY2FwdHVyZQotICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBmcmFtZSwgdGltZVVzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOworICAgICAgICAgICAgICAgIEFMT0dEKCJza2lwcGluZyBmcmFtZSwgdGltZVVzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuRnJhbWVzIDw9IDEuMCkgewpAQCAtMTEwNiw2ICsxMTA2LDE0IEBACiAgICAgICAgIGNvbnN1bWVyVXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOwogICAgICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKGNvbnN1bWVyVXNhZ2UpOwogCisgICAgICAgIC8vIFNldCBpbXBsLiBkZWZpbmVkIGZvcm1hdCBhcyBkZWZhdWx0LiBEZXBlbmRpbmcgb24gdGhlIHVzYWdlIGZsYWdzCisgICAgICAgIC8vIHRoZSBkZXZpY2Utc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gd2lsbCBkZXJpdmUgdGhlIGV4YWN0IGZvcm1hdC4KKyAgICAgICAgZXJyID0gbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyRm9ybWF0KEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIHN1cmZhY2UgZGVmYXVsdCBmb3JtYXQgcmV0OiAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKICAgICAgICAgLy8gU2V0cyB0aGUgZGVmYXVsdCBidWZmZXIgZGF0YSBzcGFjZQogICAgICAgICBBTE9HRCgic2V0dGluZyBkYXRhc3BhY2U6ICUjeCwgYWNxdWlyZWQ9JWQiLCBkYXRhU3BhY2UsIG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzKTsKICAgICAgICAgbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyRGF0YVNwYWNlKChhbmRyb2lkX2RhdGFzcGFjZSlkYXRhU3BhY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKaW5kZXggMzc5ZDQxZS4uZTBmMjY4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCkBAIC0xMDU4LDggKzEwNTgsOCBAQAogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcykgeworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZykgewogICAgIHN3aXRjaCAoKGludClpbmRleCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoOgogICAgICAgICB7CkBAIC0xMTI1LDcgKzExMjUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoaW5kZXgsIF9wYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zLCBmcmFtZUNvbmZpZyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCmluZGV4IGE0M2NkZjEuLjgyNTNiN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCkBAIC0yMTksOCArMjE5LDggQEAKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Qml0cmF0ZVBhcmFtcygKICAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICpiaXRyYXRlKTsKIAotICAgIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpOworICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpOwogCiAgICAgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwCmluZGV4IDE2NzRjYjIuLjNkNGE0NGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwCkBAIC0yOSw3ICsyOSw2IEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKaW5kZXggNGRiMDA2MC4uODQyYTdjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKQEAgLTg5LDEyICs4OSwxMiBAQAogICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bU91dHB1dEJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gNDA5NiAqIEZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHM7CisgICAgZGVmLm5CdWZmZXJTaXplID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIEZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpOwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKICAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOwotICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IHNpemVvZihmbG9hdCk7CiAKICAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CiAgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKQEAgLTE3Myw3ICsxNzMsNyBAQAogICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IG1TdHJlYW1JbmZvLmNoYW5uZWxzOwogICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVN0cmVhbUluZm8uc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNoYW5uZWxzID0gMjsKICAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IDQ0MTAwOwogICAgICAgICAgICAgfQogCkBAIC0xOTUsMTAgKzE5NSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBtTnVtZXJpY2FsRGF0YTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUVuZGlhbiA9IE9NWF9FbmRpYW5CaWc7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmJJbnRlcmxlYXZlZCA9IE9NWF9UUlVFOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKQEAgLTIxMSw3ICsyMTEsNyBAQAogICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gbVN0cmVhbUluZm8uY2hhbm5lbHM7CiAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0gbVN0cmVhbUluZm8uc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IDI7CiAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgICAgICAgICB9CiAKQEAgLTI4MSw2ICsyODEsMTkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0ICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAzMikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVOdW1EYXRhICVkLCBuQml0c1BlclNhbXBsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhLCBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKQEAgLTMwMSwxMSArMzE0LDEzIEBACiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKKyAgICBjb25zdCBib29sIG91dHB1dEZsb2F0ID0gbU51bWVyaWNhbERhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKwogICAgIEFMT0dWKCJvblF1ZXVlRmlsbGVkICVkLyVkOiIsIGluUXVldWUuZW1wdHkoKSwgb3V0UXVldWUuZW1wdHkoKSk7CiAgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IG1TYXdJbnB1dEVPUykgJiYgIW91dFF1ZXVlLmVtcHR5KCkgJiYgIW1GaW5pc2hlZERlY29kZXIpIHsKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLSAgICAgICAgaW50MTZfdCAqb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CisgICAgICAgIHZvaWQgKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOwogICAgICAgICBzaXplX3Qgb3V0QnVmZmVyU2l6ZSA9IG91dEhlYWRlci0+bkFsbG9jTGVuIC0gb3V0SGVhZGVyLT5uT2Zmc2V0OwogICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcCA9IDA7CiAKQEAgLTM3NCw3ICszODksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplLCBvdXRwdXRGbG9hdCk7CiAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBkZWNvZGVPbmVGcmFtZSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTM5Myw3ICs0MDgsOSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1TYXdJbnB1dEVPUykgewotICAgICAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoTlVMTCwgMCwgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBpbkJ1ZmZlciAqLywgMCAvKiBpbkJ1ZmZlckxlbiAqLywKKyAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSwgb3V0cHV0RmxvYXQpOwogICAgICAgICAgICAgbUZpbmlzaGVkRGVjb2RlciA9IHRydWU7CiAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBmaW5pc2ggcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOwpAQCAtNDU2LDcgKzQ3Myw4IEBACiAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKICAgICAgICAgICAgIFBvcnRJbmZvICppbmZvID0gZWRpdFBvcnRJbmZvKDEgLyogcG9ydEluZGV4ICovKTsKICAgICAgICAgICAgIGlmICghaW5mby0+bURlZi5iRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIGluZm8tPm1EZWYubkJ1ZmZlclNpemUgPSBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogbVN0cmVhbUluZm8uY2hhbm5lbHMgKiAyOworICAgICAgICAgICAgICAgIGluZm8tPm1EZWYubkJ1ZmZlclNpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIG1TdHJlYW1JbmZvLmNoYW5uZWxzICogc2l6ZW9mKGZsb2F0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKaW5kZXggYjYzZjdhZC4uYmEwMjA3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaApAQCAtNDUsMTAgKzQ1LDE0IEBACiAgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMjA0ODsgLy8gYWRqdXN0ZWQgYmFzZWQgb24gc3RyZWFtLgorCiAgICAgZW51bSB7CiAgICAgICAgIGtOdW1JbnB1dEJ1ZmZlcnMgICA9IDQsCiAgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzICA9IDQsCiAgICAgfTsKKyAgICBPTVhfTlVNRVJJQ0FMREFUQVRZUEUgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICBPTVhfVTMyIG1CaXRzUGVyU2FtcGxlID0gMTY7CiAKICAgICBGTEFDRGVjb2RlciAqbUZMQUNEZWNvZGVyOwogICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1N0cmVhbUluZm8gbVN0cmVhbUluZm87CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCmluZGV4IDliNjk2ZGEuLmIzMmFiMDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCkBAIC0yOCw3ICsyOCwxMCBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWyJsaWJiYXNlX2hlYWRlcnMiXSwKLSAgICBzdGF0aWNfbGliczogWyJsaWJGTEFDIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliRkxBQyIsCisgICAgXSwKIAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNlbmMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IDk1NWYyMTEuLjNhZGQwMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJTb2Z0RmxhY0VuY29kZXIuaCIKLQorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCkBAIC03NSw3ICs3NSw5IEBACiAgICAgfQogCiAgICAgaWYgKCFtU2lnbmFsbGVkRXJyb3IpIHsgLy8gbm8gdXNlIGFsbG9jYXRpbmcgaW5wdXQgYnVmZmVyIGlmIHdlIGhhZCBhbiBlcnJvciBhYm92ZQotICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiA9IChGTEFDX19pbnQzMiopIG1hbGxvYyhzaXplb2YoRkxBQ19faW50MzIpICogMiAqIGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUpOworICAgICAgICAvLyAyeCB0aGUgcGNtMTYgc2FtcGxlcyBjYW4gZXhpc3Qgd2l0aCB0aGUgc2FtZSBzaXplIGFzIHBjbUZsb2F0IHNhbXBsZXMuCisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyID0gKEZMQUNfX2ludDMyKikgbWFsbG9jKAorICAgICAgICAgICAgICAgIHNpemVvZihGTEFDX19pbnQzMikgKiBrTnVtU2FtcGxlc1BlckZyYW1lICoga01heENoYW5uZWxzICogMik7CiAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJQY20zMiA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiU29mdEZsYWNFbmNvZGVyOjpTb2Z0RmxhY0VuY29kZXIobmFtZT0lcykgZXJyb3IgYWxsb2NhdGluZyBpbnRlcm5hbCBpbnB1dCBidWZmZXIiLCBuYW1lKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC0xMTUsMTQgKzExNywxNCBAQAogICAgIC8vIGNvbmZpZ3VyZSBpbnB1dCBwb3J0IG9mIHRoZSBlbmNvZGVyCiAgICAgZGVmLm5Qb3J0SW5kZXggPSAwOwogICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OwotICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsvLyBUT0RPIHZlcmlmeSB0aGF0IDEgaXMgZW5vdWdoCisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwogICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtNYXhJbnB1dEJ1ZmZlclNpemU7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwogICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gc2l6ZW9mKGZsb2F0KTsKIAogICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKICAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOwpAQCAtMTM0LDcgKzEzNiw3IEBACiAgICAgLy8gY29uZmlndXJlIG91dHB1dCBwb3J0IG9mIHRoZSBlbmNvZGVyCiAgICAgZGVmLm5Qb3J0SW5kZXggPSAxOwogICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKLSAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7Ly8gVE9ETyB2ZXJpZnkgdGhhdCAxIGlzIGVub3VnaAorICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKICAgICBkZWYubkJ1ZmZlclNpemUgPSBrTWF4T3V0cHV0QnVmZmVyU2l6ZTsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKQEAgLTE5MywxMCArMTk1LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IG1OdW1lcmljYWxEYXRhOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOwpAQCAtMjcwLDEyICsyNzIsMjYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uQ2hhbm5lbHMgPCAxIHx8IHBjbVBhcmFtcy0+bkNoYW5uZWxzID4gMikgeworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IGtNYXhDaGFubmVscykgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IHBjbVBhcmFtcy0+bkNoYW5uZWxzOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGU7CisKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQgJiYgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID09IDMyKSB7CisgICAgICAgICAgICAgICAgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMzI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBjbVBhcmFtcy0+ZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFTaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAxNikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGVOdW1EYXRhICVkLCBuQml0c1BlclNhbXBsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGNtUGFyYW1zLT5lTnVtRGF0YSwgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBBTE9HVigid2lsbCBlbmNvZGUgJWQgY2hhbm5lbHMgYXQgJWRIeiIsIG1OdW1DaGFubmVscywgbVNhbXBsZVJhdGUpOwogCiAgICAgICAgICAgICByZXR1cm4gY29uZmlndXJlRW5jb2RlcigpOwpAQCAtMzU2LDYgKzM3MiwxMCBAQAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbU51bWVyaWNhbERhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlU2l6ZSA9IGlucHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZVNpemUgPSBzYW1wbGVTaXplICogbU51bUNoYW5uZWxzOworCiAgICAgRkxBQ19fYm9vbCBvayA9IHRydWU7CiAKICAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbVNhd0lucHV0RU9TKSAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiAhbVNlbnRPdXRwdXRFT1MpIHsKQEAgLTM4MSwxMyArNDAxLDIxIEBACiAgICAgICAgICAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CiAgICAgICAgICAgICBtQ3VycmVudElucHV0VGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CiAKLSAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRGcmFtZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbiAvICgyICogbU51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyAyOwotICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxPTVhfUzE2ICo+KGluSGVhZGVyLT5wQnVmZmVyKTsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRGcmFtZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbiAvIGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyBzYW1wbGVTaXplOwogCi0gICAgICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywgMiAqIGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUpOwotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpPTAgOyBpIDwgbmJJbnB1dFNhbXBsZXMgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07CisgICAgICAgICAgICBpZiAoaW5wdXRGbG9hdCkgeworICAgICAgICAgICAgICAgIENIRUNLX0xFKG5iSW5wdXRTYW1wbGVzLCBrTnVtU2FtcGxlc1BlckZyYW1lICoga01heENoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqIGNvbnN0IHBjbUZsb2F0ID0gcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgIG1lbWNweV90b19xOF8yM19mcm9tX2Zsb2F0X3dpdGhfY2xhbXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIsIHBjbUZsb2F0LCBuYklucHV0U2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG5vdGUgbmJJbnB1dFNhbXBsZXMgbWF5IGJlIDJ4IGFzIGxhcmdlIGZvciBwY20xNiBkYXRhLgorICAgICAgICAgICAgICAgIENIRUNLX0xFKG5iSW5wdXRTYW1wbGVzLCBrTnVtU2FtcGxlc1BlckZyYW1lICoga01heENoYW5uZWxzICogMik7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KGluSGVhZGVyLT5wQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmJJbnB1dFNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIiBhYm91dCB0byBlbmNvZGUgJXUgc2FtcGxlcyBwZXIgY2hhbm5lbCIsIG5iSW5wdXRGcmFtZXMpOwogICAgICAgICAgICAgb2sgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9wcm9jZXNzX2ludGVybGVhdmVkKApAQCAtNTI2LDEwICs1NTQsMTIgQEAKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRTdGF0ZTsKICAgICB9CiAKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtTnVtZXJpY2FsRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworICAgIGNvbnN0IGludCBjb2RlY0JpdHNQZXJTYW1wbGUgPSBpbnB1dEZsb2F0ID8gMjQgOiAxNjsKICAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKICAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jaGFubmVscyhtRmxhY1N0cmVhbUVuY29kZXIsIG1OdW1DaGFubmVscyk7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfc2FtcGxlX3JhdGUobUZsYWNTdHJlYW1FbmNvZGVyLCBtU2FtcGxlUmF0ZSk7Ci0gICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfYml0c19wZXJfc2FtcGxlKG1GbGFjU3RyZWFtRW5jb2RlciwgMTYpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2JpdHNfcGVyX3NhbXBsZShtRmxhY1N0cmVhbUVuY29kZXIsIGNvZGVjQml0c1BlclNhbXBsZSk7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY29tcHJlc3Npb25fbGV2ZWwobUZsYWNTdHJlYW1FbmNvZGVyLAogICAgICAgICAgICAgKHVuc2lnbmVkKW1Db21wcmVzc2lvbkxldmVsKTsKICAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF92ZXJpZnkobUZsYWNTdHJlYW1FbmNvZGVyLCBmYWxzZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKaW5kZXggNjRhNmIxZS4uNzIyZmMxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaApAQCAtNDUsOCArNDUsMTAgQEAKIAogcHJpdmF0ZToKICAgICBjb25zdCB1bnNpZ25lZCBpbnQga051bUJ1ZmZlcnMgPSAyOwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4TnVtU2FtcGxlc1BlckZyYW1lID0gMTE1MjsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heElucHV0QnVmZmVyU2l6ZSA9IGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkgKiAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtNYXhDaGFubmVscyA9IDI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga051bVNhbXBsZXNQZXJGcmFtZSA9IDExNTI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga01heElucHV0QnVmZmVyU2l6ZSA9CisgICAgICAgICAgICBrTnVtU2FtcGxlc1BlckZyYW1lICoga01heENoYW5uZWxzICogc2l6ZW9mKGZsb2F0KTsKICAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heE91dHB1dEJ1ZmZlclNpemUgPSA2NTUzNjsgICAgLy9UT0RPIGNoZWNrIGlmIHRoaXMgY2FuIGJlIHJlZHVjZWQKIAogICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOwpAQCAtNTQsNiArNTYsOCBAQAogICAgIE9NWF9VMzIgbU51bUNoYW5uZWxzOwogICAgIE9NWF9VMzIgbVNhbXBsZVJhdGU7CiAgICAgT01YX1UzMiBtQ29tcHJlc3Npb25MZXZlbDsKKyAgICBPTVhfTlVNRVJJQ0FMREFUQVRZUEUgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICBPTVhfVTMyIG1CaXRzUGVyU2FtcGxlID0gMTY7CiAKICAgICAvLyBzaG91bGQgdGhlIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGNhbGxiYWNrIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwb3J0CiAgICAgYm9vbCAgICAgICAgbUVuY29kZXJXcml0ZURhdGE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAppbmRleCBjMTQ5ODNhLi44NzdjYjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgNiAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHRlbXBsYXRlPGNsYXNzIFQ+CkBAIC0xODQsNyArMTg2LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uQ2hhbm5lbHMgPCAxIHx8IHBjbVBhcmFtcy0+bkNoYW5uZWxzID4gMikgeworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcAppbmRleCBhNzU0ODNhLi4zZDEwMDg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcApAQCAtNjE3LDYgKzYxNyw3IEBACiAgICAgcmV0dXJuOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3dfaW50cmEoCiAgICAgaW50MTYgKmJsaywgUElYRUwgKmNvbXAsIGludCB3aWR0aAogKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKaW5kZXggNzVjYTg0Ni4uOWMwZmNmYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCkBAIC0xODYsOCArMTg2LDggQEAKICNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAogICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XSA9IElNRU1fdm9sW2lkeF07CiAgICAgICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IHNpemVvZihWb2wpOwotICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT52b2xbaWR4XSwgMCwgc2l6ZW9mKFZvbCkpOwogICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKICAgICAgICAgICAgICAgICBzdHJlYW0gPSBJTUVNX0JpdHN0cmVhbURlY1ZpZGVvOwogI2Vsc2UKICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSAoVm9sICopIG9zY2xfbWFsbG9jKHNpemVvZihWb2wpKTsKQEAgLTIxMyw2ICsyMTMsNyBAQAogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyIGJ1ZmZlcl9zaXplOworICAgICAgICAgICAgICAgICAgICBvc2NsX21lbXNldChzdHJlYW0sIDAsIHNpemVvZihCaXRzdHJlYW1EZWNWaWRlbykpOwogICAgICAgICAgICAgICAgICAgICBpZiAoKGJ1ZmZlcl9zaXplID0gQml0c3RyZWFtT3BlbihzdHJlYW0sIGlkeCkpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgbXA0ZGVjX2xvZygiSW5pdFZpZGVvRGVjb2RlcigpOiBDYW4ndCBhbGxvY2F0ZSBiaXRzdHJlYW0gYnVmZmVyLlxuIik7CkBAIC0zMzksMjcgKzM0MCwzMyBAQAogI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCiAgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuID0gSU1FTV9jdXJyVm9wX3lDaGFuOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KIAogICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IElNRU1fcHJldlZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAjZWxzZQogICAgIGlmIChzaXplID4gSU5UMzJfTUFYIC8gMykgewogICAgICAgICByZXR1cm4gUFZfRkFMU0U7CiAgICAgfQogICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotCi0gICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotCi0gICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogI2VuZGlmCiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplICogMyk7CiAjZW5kaWYgICAvLyBNRU1PUllfUE9PTApAQCAtMzgzLDggKzM5MCwxMCBAQAogCiAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID0gKFBJWEVMICopIG9zY2xfbWFsbG9jKHNpemUgKiAzIC8gMik7IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKDMgKiBzaXplIC8gMik7CiAjZW5kaWYKICAgICAgICAgfQpAQCAtNDMxLDEwICs0NDAsMTIgQEAKICNlbHNlCiAgICAgdmlkZW8tPnNsaWNlTm8gPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+c2xpY2VObyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5zbGljZU5vLCAwLCBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwogCiAgICAgdmlkZW8tPmFjUHJlZEZsYWcgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YodWludDgpKTsKICAgICBpZiAodmlkZW8tPmFjUHJlZEZsYWcgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+YWNQcmVkRmxhZywgMCwgblRvdGFsTUIgKiBzaXplb2YodWludDgpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CKTsKIAogICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YodHlwZURDU3RvcmUpKSB7CkBAIC00NDIsNiArNDUzLDcgQEAKICAgICB9CiAgICAgdmlkZW8tPnByZWREQyA9ICh0eXBlRENTdG9yZSAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwogICAgIGlmICh2aWRlby0+cHJlZERDID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZWREQywgMCwgblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CiAKICAgICBpZiAobk1CUGVyUm93ID4gSU5UMzJfTUFYIC0gMQpAQCAtNDUwLDYgKzQ2Miw3IEBACiAgICAgfQogICAgIHZpZGVvLT5wcmVkRENBQ19jb2wgPSAodHlwZURDQUNTdG9yZSAqKSBvc2NsX21hbGxvYygobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwogICAgIGlmICh2aWRlby0+cHJlZERDQUNfY29sID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZWREQ0FDX2NvbCwgMCwgKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CiAKICAgICAvKiBlbGVtZW50IHplcm8gd2lsbCBiZSB1c2VkIGZvciBzdG9yaW5nIHZlcnRpY2FsIChjb2wpIEFDIGNvZWZmaWNpZW50cyAqLwpAQCAtNDU5LDkgKzQ3MiwxMSBAQAogICAgIC8qIEFsbG9jYXRpbmcgSGVhZGVySW5mbyBzdHJ1Y3R1cmUgJiBRdWFudGl6ZXIgYXJyYXkgKi8KICAgICB2aWRlby0+aGVhZGVySW5mby5Nb2RlID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUsIDAsIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CiAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uQ0JQID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCwgMCwgblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKIAogICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YoaW50MTYpKSB7CkBAIC00NjksNiArNDg0LDcgQEAKICAgICB9CiAgICAgdmlkZW8tPlFQTUIgPSAoaW50MTYgKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YoaW50MTYpKTsKICAgICBpZiAodmlkZW8tPlFQTUIgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPlFQTUIsIDB4MCwgblRvdGFsTUIgKiBzaXplb2YoaW50MTYpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogc2l6ZW9mKGludCkpOwogCiAgICAgLyogQWxsb2NhdGluZyBtYWNyb2Jsb2NrIHNwYWNlICovCkBAIC00ODksOCArNTA1LDEwIEBACiAgICAgfQogICAgIHZpZGVvLT5tb3RYID0gKE1PVCAqKSBvc2NsX21hbGxvYyhzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5tb3RYID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5tb3RYLCAwLCBzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1vdFkgPSAoTU9UICopIG9zY2xfbWFsbG9jKHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPm1vdFkgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPm1vdFksIDAsIHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihNT1QpICogOCAqIG5Ub3RhbE1CKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCmluZGV4IDAwZjJkZDMuLjcxZTExNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCkBAIC0xNyw3ICsxNyw2IEBACiAjaWZuZGVmIFNPRlRfTVBFRzRfRU5DT0RFUl9IXwogI2RlZmluZSBTT0ZUX01QRUc0X0VOQ09ERVJfSF8KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKaW5kZXggNTMxNDljMS4uZWNjMzIxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCkBAIC0zNzcsMTUgKzM3NywxNSBAQAogLyogIEluL291dCAgIDogTnIsIEIsIFJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgYXJndW1lbnQgInZpZGVvIiBpcyBndWFyYW50ZWVkIG5vbi1udWxsIGJ5IGNhbGxlciAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotCiBQVl9TVEFUVVMgUkNfVXBkYXRlQnVmZmVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIsIEludCBudW1fc2tpcCkKIHsKICAgICByYXRlQ29udHJvbCAqcmMgID0gdmlkZW8tPnJjW2N1cnJMYXllcl07CiAgICAgTXVsdGlQYXNzICAgKnBNUCA9IHZpZGVvLT5wTVBbY3VyckxheWVyXTsKIAotICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IHJjID09IE5VTEwgfHwgcE1QID09IE5VTEwpCisgICAgaWYgKHJjID09IE5VTEwgfHwgcE1QID09IE5VTEwpCiAgICAgICAgIHJldHVybiBQVl9GQUlMOwogCiAgICAgcmMtPlZCVl9mdWxsbmVzcyAgIC09IChJbnQpKHJjLT5iaXRyYXRlIC8gcmMtPmZyYW1lcmF0ZSAqIG51bV9za2lwKTsgLy9yY1tjdXJyTGF5ZXJdLT5ScDsKQEAgLTUyNCw2ICs1MjQsNyBAQAogLyogIEluL291dCAgIDogcmMtPlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgYXJndW1lbnQgImlucHV0IiBpcyBndWFyYW50ZWVkIG5vbi1udWxsIGJ5IGNhbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIHZvaWQgdGFyZ2V0Qml0Q2FsY3VsYXRpb24odm9pZCAqaW5wdXQpCkBAIC01MzcsNyArNTM4LDcgQEAKICAgICBJbnQgZGlmZl9jb3VudGVyX0JUc3JjLCBkaWZmX2NvdW50ZXJfQlRkc3QsIHByZXZfY291bnRlcl9kaWZmLCBjdXJyX2NvdW50ZXJfZGlmZiwgYm91bmQ7CiAgICAgLyogQlQgPSBCaXQgVHJhbnNmZXIsIGZvciBwTVAtPmNvdW50ZXJfQlRzcmMsIHBNUC0+Y291bnRlcl9CVGRzdCAqLwogCi0gICAgaWYgKHZpZGVvID09IE5VTEwgfHwgY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCisgICAgaWYgKGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAKICAgICAvKiBzb21lIHN0dWZmIGFib3V0IGZyYW1lIGRyb3BwaW5nIHJlbWFpbmVkIGhlcmUgdG8gYmUgZG9uZSBiZWNhdXNlIHBNUCBjYW5ub3QgYmUgaW5zZXJ0ZWQgaW50byB1cGRhdGVSYXRlQ29udHJvbCgpKi8KQEAgLTY5Myw2ICs2OTQsNyBAQAogLyogIEluL291dCAgIDogcmMtPlQgYW5kIHJjLT5RYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIElucHV0IGFyZ3VtZW50ICJpbnB1dCIgaXMgZ3VhcmFudGVlZCBub24tbnVsbCBieSBjYWxsZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiArIFFQIGNhbGN1bGF0aW9uIHdpdGggYSBuZXcgcXVhZHJhdGljIG1ldGhvZCAqLwpAQCAtNzA4LDcgKzcxMCw3IEBACiAgICAgZmxvYXQgY3Vycl9tYWQsIHByZXZfbWFkLCBjdXJyX1JELCBwcmV2X1JELCBhdmVyYWdlX21hZCwgYXZlcl9RUDsKIAogCi0gICAgaWYgKHZpZGVvID09IE5VTEwgfHwgY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCisgICAgaWYgKGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAKICAgICAvKiBNYWQgYmFzZWQgdmFyaWFibGUgYml0IGFsbG9jYXRpb24gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IGU3ZDMwNWQuLjgwMDgzZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOwogCiAgICAgdWludDMyX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOwotICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgbURlY29kZXJCdWYgPSBjYWxsb2MoMSwgbWVtUmVxdWlyZW1lbnRzKTsKIAogICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKICAgICBtSXNGaXJzdCA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCmluZGV4IDNkZjRkNGMuLmM2NTU1NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWcyZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRNUEVHMi5jcHAiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKaW5kZXggOGQ1ZjNlNy4uMGYyZmYxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMCwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUyLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCiAgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKKyAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMkhEUjEwUGx1cywgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogfTsKIAogU29mdFZQWDo6U29mdFZQWCgKQEAgLTg0LDYgKzg1LDEwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgU29mdFZQWDo6c3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogc3RhdHVzX3QgU29mdFZQWDo6aW5pdERlY29kZXIoKSB7CiAgICAgbUN0eCA9IG5ldyB2cHhfY29kZWNfY3R4X3Q7CiAgICAgdnB4X2NvZGVjX2Vycl90IHZweF9lcnI7CkBAIC0xNjcsNyArMTcyLDEyIEBACiAgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CiAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIGJwcCAqIDMpIC8gMjsKLSAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gKihPTVhfVElDS1MgKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIFByaXZJbmZvICpwcml2SW5mbyA9IChQcml2SW5mbyAqKW1JbWctPnVzZXJfcHJpdjsKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gcHJpdkluZm8tPm1UaW1lU3RhbXA7CisgICAgICAgIGlmIChwcml2SW5mby0+bUhkcjEwUGx1c0luZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcXVldWVPdXRwdXRGcmFtZUNvbmZpZyhwcml2SW5mby0+bUhkcjEwUGx1c0luZm8pOworICAgICAgICB9CisKICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlclNhZmUob3V0SGVhZGVyKSkgewogICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gb3V0SGVhZGVyLT5wQnVmZmVyOwogICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKQEAgLTI3NSw3ICsyODUsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG1UaW1lU3RhbXBzW21UaW1lU3RhbXBJZHhdID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgIG1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XS5tVGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisKKyAgICAgICAgaWYgKGluSW5mby0+bUZyYW1lQ29uZmlnKSB7CisgICAgICAgICAgICBtUHJpdkluZm9bbVRpbWVTdGFtcElkeF0ubUhkcjEwUGx1c0luZm8gPSBkZXF1ZXVlSW5wdXRGcmFtZUNvbmZpZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLm1IZHIxMFBsdXNJbmZvLmNsZWFyKCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewogICAgICAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0VPU19TRUVOOwpAQCAtMjg1LDcgKzMwMSw3IEBACiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDApIHsKICAgICAgICAgICAgIHZweF9jb2RlY19lcnJfdCBlcnIgPSB2cHhfY29kZWNfZGVjb2RlKAogICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sICZtVGltZVN0YW1wc1ttVGltZVN0YW1wSWR4XSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCAmbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLCAwKTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVlBYX0NPREVDX09LKSB7CiAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCmluZGV4IGI2MmI1MjYuLjBhYThlOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKQEAgLTI2LDYgKzI2LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQUJ1ZmZlcjsKKwogc3RydWN0IFNvZnRWUFggOiBwdWJsaWMgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdFZQWChjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50Um9sZSwKQEAgLTQxLDYgKzQzLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CiAgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpOwogCiBwcml2YXRlOgogICAgIGVudW0gewpAQCAtNjAsNyArNjMsMTEgQEAKIAogICAgIHZvaWQgKm1DdHg7CiAgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KLSAgICBPTVhfVElDS1MgbVRpbWVTdGFtcHNba051bUJ1ZmZlcnNdOworICAgIHN0cnVjdCBQcml2SW5mbyB7CisgICAgICAgIE9NWF9USUNLUyBtVGltZVN0YW1wOworICAgICAgICBzcDxBQnVmZmVyPiBtSGRyMTBQbHVzSW5mbzsKKyAgICB9OworICAgIFByaXZJbmZvIG1Qcml2SW5mb1trTnVtQnVmZmVyc107CiAgICAgdWludDhfdCBtVGltZVN0YW1wSWR4OwogICAgIHZweF9pbWFnZV90ICptSW1nOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKaW5kZXggMmRmYmExMy4uZDBjYjA3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcApAQCAtNDAxLDggKzQwMSw4IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcykgeworT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2g6CiAgICAgICAgIHsKQEAgLTQ0Miw3ICs0NDIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoaW5kZXgsIF9wYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zLCBmcmFtZUNvbmZpZyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCBkZDg2ZDM2Li4yNjNkMTM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTg0LDggKzg0LDggQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtKTsKIAotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCi0gICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKIAogICAgIC8vIE9NWCBjYWxsYmFjayB3aGVuIGJ1ZmZlcnMgYXZhaWxhYmxlCiAgICAgLy8gTm90ZSB0aGF0IGJvdGggYW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCmluZGV4IGQ0MGY1MjUuLjRmNjFhYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtNDMwLDggKzQzMCwxNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHNpemUgPCBzaXplb2YoaW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgMm5kIGFuZCAzcmQgaW5wdXQgYnVmZmVyIGFyZSBleHBlY3RlZCB0byBjb250YWluCisgICAgICAgICAgICAgICAgLy8gIGFuIGludDY0X3QgKHNlZSBiZWxvdyksIHNvIG1ha2Ugc3VyZSB3ZSBnZXQgYXQgbGVhc3QKKyAgICAgICAgICAgICAgICAvLyAgdGhhdCBtdWNoLiBUaGUgZmlyc3QgaW5wdXQgYnVmZmVyIG11c3QgY29udGFpbiAxOSBieXRlcywKKyAgICAgICAgICAgICAgICAvLyAgYnV0IHRoYXQgaXMgY2hlY2tlZCBhbHJlYWR5LgorICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUhlYWRlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgbUhlYWRlcjsKICAgICAgICAgICAgICAgICBtSGVhZGVyID0gbmV3IE9wdXNIZWFkZXIoKTsKICAgICAgICAgICAgICAgICBtZW1zZXQobUhlYWRlciwgMCwgc2l6ZW9mKCptSGVhZGVyKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFQYXJzZU9wdXNIZWFkZXIoZGF0YSwgc2l6ZSwgbUhlYWRlcikpIHsKQEAgLTQ1Miw2ICs0NjEsOSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBzdGF0dXMgPSBPUFVTX0lOVkFMSURfU1RBVEU7CisgICAgICAgICAgICAgICAgaWYgKG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtRGVjb2RlciA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoa1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fc3RyZWFtcywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcAppbmRleCBiOTliY2Q4Li5kYTg2NzU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCkBAIC03OSw3ICs3OSw3IEBACiAKIHN0YXRpYyBjb25zdCBPTVhfVTMyIGtTdXBwb3J0ZWRQcm9maWxlc1tdID0gewogICAgIE9NWF9BVURJT19BQUNPYmplY3RMQywgT01YX0FVRElPX0FBQ09iamVjdEhFLCAgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTLAotICAgIE9NWF9BVURJT19BQUNPYmplY3RMRCwgT01YX0FVRElPX0FBQ09iamVjdEVMRCwKKyAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEQsIE9NWF9BVURJT19BQUNPYmplY3RFTEQsIE9NWF9BVURJT19BQUNPYmplY3RYSEUKIH07CiAKIFNvZnRYQUFDOjpTb2Z0WEFBQyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFKiBjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKQEAgLTExMCwxNSArMTEwLDIyIEBACiAKIHsKICAgICBpbml0UG9ydHMoKTsKLSAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCBJQV9OT19FUlJPUik7CiB9CiAKIFNvZnRYQUFDOjp+U29mdFhBQUMoKSB7Ci0gICAgaW50IGVyckNvZGUgPSBkZUluaXRYQUFDRGVjb2RlcigpOwotICAgIGlmICgwICE9IGVyckNvZGUpIHsKLSAgICAgICAgQUxPR0UoImRlSW5pdFhBQUNEZWNvZGVyKCkgZmFpbGVkICVkIiwgZXJyQ29kZSk7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgQUxPR0UoImRlSW5pdFhBQUNEZWNvZGVyKCkgZmFpbGVkICVkIiwgZXJyX2NvZGUpOwogICAgIH0KIAorICAgIGVycl9jb2RlID0gZGVJbml0TVBFR0RERHJjKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgIEFMT0dFKCJkZUluaXRNUEVHREREcmMoKSBmYWlsZWQgJWQiLCBlcnJfY29kZSk7CisgICAgfQogICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSBmYWxzZTsKIH0KQEAgLTE2NCwzNiArMTcxLDE2IEBACiAgICAgYWRkUG9ydChkZWYpOwogfQogCi1zdGF0dXNfdCBTb2Z0WEFBQzo6aW5pdERlY29kZXIoKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKLQorSUFfRVJST1JDT0RFIFNvZnRYQUFDOjppbml0RGVjb2RlcigpIHsKICAgICBpbnQgdWlfZHJjX3ZhbDsKICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKICAgICBpbnQgbG9vcCA9IDA7CiAKICAgICBlcnJfY29kZSA9IGluaXRYQUFDRGVjb2RlcigpOwogICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgewotICAgICAgICBpZiAoTlVMTCA9PSBtWGhlYWFjQ29kZWNIYW5kbGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJBQUMgZGVjb2RlciBoYW5kbGUgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChOVUxMID09IG1NcGVnRERyY0hhbmRsZSkgewotICAgICAgICAgICAgQUxPR0UoIk1QRUctRCBEUkMgZGVjb2RlciBoYW5kbGUgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAobG9vcCA9IDE7IGxvb3AgPCBtTWFsbG9jQ291bnQ7IGxvb3ArKykgewotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVtsb29wXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciAlZFxuIiwgbG9vcCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0UoImluaXRYQUFDRGVjb2RlciBGYWlsZWQiKTsKLQotICAgICAgICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgbU1hbGxvY0NvdW50OyBsb29wKyspIHsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbG9vcF0pIGZyZWUobU1lbW9yeUFycmF5W2xvb3BdKTsKLSAgICAgICAgfQotICAgICAgICBtTWFsbG9jQ291bnQgPSAwOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IE9LOworICAgICAgICBBTE9HRSgiaW5pdFhBQUNEZWNvZGVyIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICBkZUluaXRYQUFDRGVjb2RlcigpOworICAgICAgICByZXR1cm4gZXJyX2NvZGU7CiAgICAgfQogCiAgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKQEAgLTI3NCw3ICsyNjEsNyBAQAogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSIpOwogCiAjZW5kaWYKLSAgICByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0WEFBQzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKQEAgLTU0Nyw5ICs1MzQsNiBAQAogICAgIC8qIHNhbXBsZSBjdXJyZW50bHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgaWYgKG1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgbnVtT3V0Qnl0ZXMgPSBtT3V0cHV0RnJhbWVMZW5ndGggKiAobVBjbVdkU3ogLyA4KSAqIG1OdW1DaGFubmVsczsKLSAgICAgICAgaWYgKChtUGNtV2RTeiAvIDgpICE9IDIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJYQUFDIGFzc3VtZXMgMiBieXRlcyBwZXIgc2FtcGxlISBtUGNtV2RTeiAlZCIsIG1QY21XZFN6KTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtRW5kT2ZJbnB1dCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKQEAgLTU2OSw4ICs1NTMsOCBAQAogICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CiAKICAgICAgICAgICAgICAgICAvKiBHQSBoZWFkZXIgY29uZmlndXJhdGlvbiBzZW50IHRvIERlY29kZXIhICovCi0gICAgICAgICAgICAgICAgaW50IGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWdYQUFDRGVjb2RlciBlcnJfY29kZSA9ICVkIiwgZXJyX2NvZGUpOwogICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyX2NvZGUsIE5VTEwpOwpAQCAtNjgyLDggKzY2Niw4IEBACiAgICAgICAgICAgICAvKiB3aGljaCBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgY29kZWMuIE9uY2UgdGhpcyBzdGF0ZSBpcyByZWFjaGVkLCBjYWxsIHRoZSAgKi8KICAgICAgICAgICAgIC8qIGRlY29kZVhBQUNTdHJlYW0gQVBJIHdpdGggc2FtZSBmcmFtZSB0byBkZWNvZGUhICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmICghbUlzQ29kZWNJbml0aWFsaXplZCkgewotICAgICAgICAgICAgICAgIGludCBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlnWEFBQ0RlY29kZXIgRmFpbGVkIDIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVycl9jb2RlLCBOVUxMKTsKQEAgLTg0NSw3ICs4MjksNyBAQAogICAgIH0KIH0KIAotaW50IFNvZnRYQUFDOjpjb25maWdmbHVzaERlY29kZSgpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnZmx1c2hEZWNvZGUoKSB7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlOwogICAgIFVXT1JEMzIgdWlfaW5pdF9kb25lOwogICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoID0gODIwMzsKQEAgLTg3MSwxNiArODU1LDEzIEBACiAgICAgICAgICAgICAiRm91bmQgQ29kZWMgd2l0aCBiZWxvdyBjb25maWctLS1cbnNhbXBGcmVxICVkXG5udW1DaGFubmVscyAlZFxucGNtV2RTeiAiCiAgICAgICAgICAgICAiJWRcbmNoYW5uZWxNYXNrICVkXG5vdXRwdXRGcmFtZUxlbmd0aCAlZCIsCiAgICAgICAgICAgICBtU2FtcEZyZXEsIG1OdW1DaGFubmVscywgbVBjbVdkU3osIG1DaGFubmVsTWFzaywgbU91dHB1dEZyYW1lTGVuZ3RoKTsKLSAgICAgICAgaWYgKG1OdW1DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiIE5vIG9mIGNoYW5uZWxzIGFyZSBtb3JlIHRoYW4gbWF4IGNoYW5uZWxzXG4iKTsKLSAgICAgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gdHJ1ZTsKKworICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIGVycl9jb2RlOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KLWludCBTb2Z0WEFBQzo6ZHJhaW5EZWNvZGVyKCkgewotICAgIHJldHVybiAwOworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkcmFpbkRlY29kZXIoKSB7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQogCiB2b2lkIFNvZnRYQUFDOjpvblJlc2V0KCkgewpAQCAtOTIxLDcgKzkwMiw3IEBACiAgICAgfQogfQogCi1pbnQgU29mdFhBQUM6OmluaXRYQUFDRGVjb2RlcigpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6aW5pdFhBQUNEZWNvZGVyKCkgewogICAgIExPT1BJRFggaTsKIAogICAgIC8qIEVycm9yIGNvZGUgKi8KQEAgLTkzOSwxMSArOTIwLDExIEBACiAgICAgVVdPUkQzMiB1aV9wcm9jX21lbV90YWJzX3NpemU7CiAgICAgLyogQVBJIHNpemUgKi8KICAgICBVV09SRDMyIHB1aV9hcGlfc2l6ZTsKKyAgICBwVk9JRCBwdl9hbGxvY19wdHI7CiAKICAgICBtSW5wdXRCdWZmZXJTaXplID0gMDsKICAgICBtSW5wdXRCdWZmZXIgPSAwOwogICAgIG1PdXRwdXRCdWZmZXIgPSAwOwotICAgIG1NYWxsb2NDb3VudCA9IDA7CiAKICAgICAvKiBQcm9jZXNzIHN0cnVjdCBpbml0aW5nIGVuZCAqLwogICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk1NCwyMCArOTM1LDEzIEBACiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKE5VTEwsIElBX0FQSV9DTURfR0VUX0FQSV9TSVpFLCAwLCAmcHVpX2FwaV9zaXplKTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOwogCi0gICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgIH0KLQogICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCi0gICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOwotICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBpZiAobVhoZWFhY0NvZGVjSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgcHVpX2FwaV9zaXplICsgNCA+PiAlZCBGYWlsZWQiLCBwdWlfYXBpX3NpemUgKyA0KTsKICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgIH0KLSAgICAvKiBTZXQgQVBJIG9iamVjdCB3aXRoIHRoZSBtZW1vcnkgYWxsb2NhdGVkICovCi0gICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICBtTWFsbG9jQ291bnQrKzsKKyAgICBtTWVtb3J5VmVjLnB1c2gobVhoZWFhY0NvZGVjSGFuZGxlKTsKIAogICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKQEAgLTk3OSwyMyArOTUzLDE2IEBACiAKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOwogCi0gICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgIH0KLQogICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCi0gICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOworICAgIG1NcGVnRERyY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CiAKLSAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgIGlmIChtTXBlZ0REcmNIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibWFsbG9jIGZvciBkcmMgYXBpIHN0cnVjdHVyZSBGYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgIH0KLSAgICBtZW1zZXQobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0sIDAsIHB1aV9hcGlfc2l6ZSk7CisgICAgbU1lbW9yeVZlYy5wdXNoKG1NcGVnRERyY0hhbmRsZSk7CiAKLSAgICAvKiBTZXQgQVBJIG9iamVjdCB3aXRoIHRoZSBtZW1vcnkgYWxsb2NhdGVkICovCi0gICAgbU1wZWdERHJjSGFuZGxlID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICBtTWFsbG9jQ291bnQrKzsKKyAgICBtZW1zZXQobU1wZWdERHJjSGFuZGxlLCAwLCBwdWlfYXBpX3NpemUpOwogCiAgICAgLyogU2V0IHRoZSBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzICovCiAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKQEAgLTEwMjEsMjMgKzk4OCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KLSAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7Ci0gICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKKyAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KSA9ICVkIGZhaWxlZCEiLAogICAgICAgICAgICAgICB1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KTsKICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgIH0KLSAgICBtTWFsbG9jQ291bnQrKzsKLSAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICAgICovCi0gICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50IC0gMV0pKTsKLSAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOworICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOwogCisgICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAgICAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLCBwdl9hbGxvY19wdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CiAKICAgICAvKiBpbml0aWFsaXplIHRoZSBBUEksIHBvc3QgY29uZmlnLCBmaWxsIG1lbW9yeSB0YWJsZXMgICovCiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULApAQCAtMTA2NiwxNyArMTAyNywxMiBAQAogICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7CiAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKIAotICAgICAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKHVpX2FsaWdubWVudCwgdWlfc2l6ZSk7Ci0gICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKHVpX2FsaWdubWVudCwgdWlfc2l6ZSk7CisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfc2l6ZSArIHVpX2FsaWdubWVudCkgPSAlZCBmYWlsZWQhIiwgdWlfc2l6ZSArIHVpX2FsaWdubWVudCk7CiAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgcHZfYWxsb2NfcHRyID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICAgICAgbU1hbGxvY0NvdW50Kys7CisgICAgICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOwogCiAgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KICAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKQEAgLTEwOTUsNyArMTA1MSw3IEBACiAgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQogCi1pbnQgU29mdFhBQUM6OmNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpIHsKICAgICBVV09SRDMyIHVpX2luaXRfZG9uZTsKICAgICBpbnQzMl90IGlfYnl0ZXNfY29uc3VtZWQ7CiAKQEAgLTExNTQsMTQgKzExMTAsNzYgQEAKIAogICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KLWludCBTb2Z0WEFBQzo6Y29uZmlnTVBFR0REcmMoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmluaXRNUEVHREREcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKFdPUkQzMikyOyBpKyspIHsKKyAgICAgICAgV09SRDMyIHVpX3NpemUsIHVpX2FsaWdubWVudCwgdWlfdHlwZTsKKyAgICAgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwgaSwgJnVpX3NpemUpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCwgaSwgJnVpX2FsaWdubWVudCk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICAgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRHJjTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCBpLCBwdl9hbGxvY19wdHIpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICB9CisKKyAgICBXT1JEMzIgdWlfc2l6ZTsKKyAgICB1aV9zaXplID0gODE5MiAqIDI7CisKKyAgICBtRHJjSW5CdWYgPSAoaW50OF90KiltZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICBpZiAobURyY0luQnVmID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNJbkJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMiwgbURyY0luQnVmKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICBtRHJjT3V0QnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNPdXRCdWYgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLnB1c2gobURyY091dEJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMywgbURyY091dEJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpjb25maWdNUEVHRERyYygpIHsKICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKICAgICBpbnQgaV9lZmZlY3RfdHlwZTsKICAgICBpbnQgaV9sb3VkX25vcm07CiAgICAgaW50IGlfdGFyZ2V0X2xvdWRuZXNzOwogICAgIHVuc2lnbmVkIGludCBpX3Nicl9tb2RlOwotICAgIGludCBuX21lbXM7CiAgICAgaW50IGk7CisgICAgaW50IHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSA9IDA7CisgICAgcFZPSUQgcHZfYWxsb2NfcHRyID0gTlVMTDsKIAogI2lmZGVmIEVOQUJMRV9NUEVHX0RfRFJDCiAgICAgewpAQCAtMTIxMiw4MyArMTIzMCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLCAmaV9zYnJfbW9kZSk7CiAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSIpOwogCisgICAgICAgIC8qIEdldCBtZW1vcnkgaW5mbyB0YWJsZXMgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9wcm9jX21lbV90YWJzX3NpemUpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSIpOworCisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisKKyAgICAgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQocHZfYWxsb2NfcHRyLCAwLCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworCisgICAgICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKKwogICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywgTlVMTCk7CiAKICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TIik7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IChXT1JEMzIpMjsgaSsrKSB7Ci0gICAgICAgICAgICBXT1JEMzIgdWlfc2l6ZSwgdWlfYWxpZ25tZW50LCB1aV90eXBlOwotICAgICAgICAgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworICAgICAgICAvKiBGcmVlIGFueSBtZW1vcnkgdGhhdCBpcyBhbGxvY2F0ZWQgZm9yIE1QRUcgRCBEcmMgc28gZmFyICovCisgICAgICAgIGRlSW5pdE1QRUdERERyYygpOwogCi0gICAgICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFLCBpLCAmdWlfc2l6ZSk7Ci0KLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKLQotICAgICAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9hbGlnbm1lbnQpOwotCi0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQiKTsKLQotICAgICAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOwotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOwotICAgICAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHZfYWxsb2NfcHRyID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICAgICAgICAgIG1NYWxsb2NDb3VudCsrOwotCi0gICAgICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKLQotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworICAgICAgICBlcnJfY29kZSA9IGluaXRNUEVHREREcmMoKTsKKyAgICAgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiaW5pdE1QRUdERERyYyBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgICAgIGRlSW5pdE1QRUdERERyYygpOworICAgICAgICAgICAgcmV0dXJuIGVycl9jb2RlOwogICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFdPUkQzMiB1aV9zaXplOwotICAgICAgICAgICAgdWlfc2l6ZSA9IDgxOTIgKiAyOwotICAgICAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJjSW5CdWYgPSAoaW50OF90KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XTsKLSAgICAgICAgICAgIG1NYWxsb2NDb3VudCsrOwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbU91dHB1dEJ1ZmZlciovIG1EcmNJbkJ1Zik7Ci0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7Ci0KLSAgICAgICAgICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHVpX3NpemUpOwotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmNPdXRCdWYgPSAoaW50OF90KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XTsKLSAgICAgICAgICAgIG1NYWxsb2NDb3VudCsrOwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbU91dHB1dEJ1ZmZlciovIG1EcmNPdXRCdWYpOwotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOwotICAgICAgICB9CiAgICAgICAgIC8qIERSQyBidWZmZXJzCiAgICAgICAgICAgICBidWZbMF0gLSBjb250YWlucyBleHRlbnNpb24gZWxlbWVudCBwYXkgbG9hZCBsb3VkbmVzcyByZWxhdGVkCiAgICAgICAgICAgICBidWZbMV0gLSBjb250YWlucyBleHRlbnNpb24gZWxlbWVudCBwYXkgbG9hZCovCkBAIC0xNDIzLDEwICsxNDAyLDEwIEBACiAgICAgfQogI2VuZGlmCiAKLSAgICByZXR1cm4gZXJyX2NvZGU7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQotaW50IFNvZnRYQUFDOjpkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcykgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBieXRlc0NvbnN1bWVkLCBpbnQzMl90KiBvdXRCeXRlcykgewogICAgIGlmIChtSW5wdXRCdWZmZXJTaXplIDwgaW5CdWZmZXJMZW5ndGgpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25maWcgQUFDLCBpbnB1dCBidWZmZXIgc2l6ZSAlZCA8IGluQnVmZmVyTGVuZ3RoICVkIiwgbUlucHV0QnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgpOwpAQCAtMTUxNiwyNCArMTQ5NSwzMyBAQAogICAgICAgICBtZW1jcHkobU91dHB1dEJ1ZmZlciwgbURyY091dEJ1ZiwgKm91dEJ5dGVzKTsKICAgICB9CiAjZW5kaWYKLSAgICByZXR1cm4gZXJyX2NvZGU7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQogCi1pbnQgU29mdFhBQUM6OmRlSW5pdFhBQUNEZWNvZGVyKCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkZUluaXRYQUFDRGVjb2RlcigpIHsKICAgICBBTE9HSSgiZGVJbml0WEFBQ0RlY29kZXIiKTsKIAogICAgIC8qIFRlbGwgdGhhdCB0aGUgaW5wdXQgaXMgb3ZlciBpbiB0aGlzIGJ1ZmZlciAqLwogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0lOUFVUX09WRVIsIDAsIE5VTEwpOwotICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfSU5QVVRfT1ZFUiIpOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWFsbG9jQ291bnQ7IGkrKykgewotICAgICAgICBpZiAobU1lbW9yeUFycmF5W2ldKSBmcmVlKG1NZW1vcnlBcnJheVtpXSk7CisgICAgLyogSXJyZXNwZWN0aXZlIG9mIGVycm9yIHJldHVybmVkIGluIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwgZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgZm9yICh2b2lkKiBidWYgOiBtTWVtb3J5VmVjKSB7CisgICAgICAgIGZyZWUoYnVmKTsKICAgICB9Ci0gICAgbU1hbGxvY0NvdW50ID0gMDsKLQorICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKICAgICByZXR1cm4gZXJyX2NvZGU7CiB9CiAKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZGVJbml0TVBFR0RERHJjKCkgeworICAgIEFMT0dJKCJkZUluaXRNUEVHREREcmMiKTsKKworICAgIGZvciAodm9pZCogYnVmIDogbURyY01lbW9yeVZlYykgeworICAgICAgICBmcmVlKGJ1Zik7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMuY2xlYXIoKTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKIElBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Z2V0WEFBQ1N0cmVhbUluZm8oKSB7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAKQEAgLTE1NDYsMTEgKzE1MzQsMTkgQEAKICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsICZtTnVtQ2hhbm5lbHMpOwogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICBpZiAobU51bUNoYW5uZWxzID4gTUFYX0NIQU5ORUxfQ09VTlQpIHsKKyAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CiAKICAgICAvKiBQQ00gd29yZCBzaXplICovCiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1osICZtUGNtV2RTeik7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaIik7CisgICAgaWYgKChtUGNtV2RTeiAvIDgpICE9IDIpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgTnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGU6ICVkLCBFeHBlY3RlZCBpcyAyIiwgbVBjbVdkU3opOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQogCiAgICAgLyogY2hhbm5lbCBtYXNrIHRvIHRlbGwgdGhlIGFycmFuZ2VtZW50IG9mIGNoYW5uZWxzIGluIGJpdCBzdHJlYW0gKi8KICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaAppbmRleCA2MTc2MDgyLi5hNjJhNzk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmgKQEAgLTMzLDggKzMzLDYgQEAKICNpbmNsdWRlICJpbXBkX2FwaWNtZF9zdGFuZGFyZHMuaCIKICNpbmNsdWRlICJpbXBkX2RyY19jb25maWdfcGFyYW1zLmgiCiAKLSNkZWZpbmUgTUFYX01FTV9BTExPQ1MgMTAwCi0KIGV4dGVybiAiQyIgSUFfRVJST1JDT0RFIGl4aGVhYWNkX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLCBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZPSUQgcHZfdmFsdWUpOwogZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaWFfZHJjX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLCBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwKQEAgLTgwLDE4ICs3OCwxOSBAQAogICAgIGVudW0geyBOT05FLCBBV0FJVElOR19ESVNBQkxFRCwgQVdBSVRJTkdfRU5BQkxFRCB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CiAKICAgICB2b2lkIGluaXRQb3J0cygpOwotICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXREZWNvZGVyKCk7CiAgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKLSAgICBpbnQgZHJhaW5EZWNvZGVyKCk7Ci0gICAgaW50IGluaXRYQUFDRGVjb2RlcigpOwotICAgIGludCBkZUluaXRYQUFDRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBkcmFpbkRlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0TVBFR0RERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ01QRUdERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsIGludDMyX3QqIG91dEJ5dGVzKTsKIAotICAgIGludCBjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpOwotICAgIGludCBjb25maWdNUEVHRERyYygpOwotICAgIGludCBkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcyk7Ci0KLSAgICBpbnQgY29uZmlnZmx1c2hEZWNvZGUoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnZmx1c2hEZWNvZGUoKTsKICAgICBJQV9FUlJPUkNPREUgZ2V0WEFBQ1N0cmVhbUluZm8oKTsKICAgICBJQV9FUlJPUkNPREUgc2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsIGludDMyX3QgZHJjUmVmTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjSGVhdnlDb21wcmVzc2lvbgpAQCAtMTIwLDkgKzExOSw4IEBACiAgICAgaW50OF90KiBtRHJjT3V0QnVmOwogICAgIGludDMyX3QgbU1wZWdERFJDUHJlc2VudDsKICAgICBpbnQzMl90IG1EUkNGbGFnOwotCi0gICAgdm9pZCogbU1lbW9yeUFycmF5W01BWF9NRU1fQUxMT0NTXTsKLSAgICBpbnQzMl90IG1NYWxsb2NDb3VudDsKKyAgICBWZWN0b3I8dm9pZCo+IG1NZW1vcnlWZWM7CisgICAgVmVjdG9yPHZvaWQqPiBtRHJjTWVtb3J5VmVjOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFhBQUMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCmluZGV4IDcwZjUyYzMuLmQxMzZkOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcApAQCAtMjEsMTAgKzIxLDEzIEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0X2Zyb20uaCIKKyNpbmNsdWRlICJsaWJ5dXYvY29udmVydF9hcmdiLmgiCisjaW5jbHVkZSAibGlieXV2L3BsYW5hcl9mdW5jdGlvbnMuaCIKICNpbmNsdWRlICJsaWJ5dXYvdmlkZW9fY29tbW9uLmgiCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgpAQCAtNDUsMTAgKzQ4LDI4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGJvb2wgaXNSR0IoT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQpIHsKKyAgICByZXR1cm4gY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CisgICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4OAorICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7Cit9CisKK2Jvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzQnQ3MDkoKSB7CisgICAgcmV0dXJuIChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDcwOSk7Cit9CisKKworYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNKcGVnKCkgeworICAgIHJldHVybiAoKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSkKKyAgICAgICAgICAgIHx8IChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjUpKQorICAgICAgICAgICAgJiYgKG1SYW5nZSA9PSBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUZ1bGwpOworfQorCiBDb2xvckNvbnZlcnRlcjo6Q29sb3JDb252ZXJ0ZXIoCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZyb20sIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHRvKQogICAgIDogbVNyY0Zvcm1hdChmcm9tKSwKICAgICAgIG1Ec3RGb3JtYXQodG8pLAorICAgICAgbVNyY0NvbG9yU3BhY2UoezAsIDAsIDB9KSwKICAgICAgIG1DbGlwKE5VTEwpIHsKIH0KIApAQCAtNzEsMjQgKzkyLDQ2IEBACiAKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICBjYXNlIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXI6Ci0gICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CiAgICAgICAgICAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU7CiAKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyNpZmRlZiBVU0VfTElCWVVWCisgICAgICAgICAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKKyAgICAgICAgICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODsKKyNlbHNlCisgICAgICAgICAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU7CisjZW5kaWYKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KIAogYm9vbCBDb2xvckNvbnZlcnRlcjo6aXNEc3RSR0IoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1Ci0gICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4Ci0gICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OworICAgIHJldHVybiBpc1JHQihtRHN0Rm9ybWF0KTsKIH0KIAordm9pZCBDb2xvckNvbnZlcnRlcjo6c2V0U3JjQ29sb3JTcGFjZSgKKyAgICAgICAgdWludDMyX3Qgc3RhbmRhcmQsIHVpbnQzMl90IHJhbmdlLCB1aW50MzJfdCB0cmFuc2ZlcikgeworICAgIGlmIChpc1JHQihtU3JjRm9ybWF0KSkgeworICAgICAgICBBTE9HVygiQ2FuJ3Qgc2V0IGNvbG9yIHNwYWNlIG9uIFJHQiBzb3VyY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3JjQ29sb3JTcGFjZS5tU3RhbmRhcmQgPSBzdGFuZGFyZDsKKyAgICBtU3JjQ29sb3JTcGFjZS5tUmFuZ2UgPSByYW5nZTsKKyAgICBtU3JjQ29sb3JTcGFjZS5tVHJhbnNmZXIgPSB0cmFuc2ZlcjsKK30KKworLyoKKyAqIElmIHN0cmlkZSBpcyBub24temVybywgY2xpZW50J3Mgc3RyaWRlIHdpbGwgYmUgdXNlZC4gRm9yIHBsYW5hcgorICogb3Igc2VtaS1wbGFuYXIgWVVWIGZvcm1hdHMsIHN0cmlkZSBtdXN0IGJlIGV2ZW4gbnVtYmVycy4KKyAqIElmIHN0cmlkZSBpcyB6ZXJvLCBpdCB3aWxsIGJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gd2lkdGggYW5kIGJwcAorICogb2YgdGhlIGZvcm1hdCwgYXNzdW1pbmcgbm8gcGFkZGluZyBvbiB0aGUgcmlnaHQgZWRnZS4KKyAqLwogQ29sb3JDb252ZXJ0ZXI6OkJpdG1hcFBhcmFtczo6Qml0bWFwUGFyYW1zKAogICAgICAgICB2b2lkICpiaXRzLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgc2l6ZV90IHN0cmlkZSwKICAgICAgICAgc2l6ZV90IGNyb3BMZWZ0LCBzaXplX3QgY3JvcFRvcCwKICAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20sCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRnJvbWF0KQpAQCAtMTAyLDYgKzE0NSw4IEBACiAgICAgICBtQ3JvcEJvdHRvbShjcm9wQm90dG9tKSB7CiAgICAgc3dpdGNoKG1Db2xvckZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgbUJwcCA9IDI7CiAgICAgICAgIG1TdHJpZGUgPSAyICogbVdpZHRoOwogICAgICAgICBicmVhazsKQEAgLTExMywxMyArMTU4LDcgQEAKICAgICAgICAgbVN0cmlkZSA9IDQgKiBtV2lkdGg7CiAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTY6Ci0gICAgICAgIG1CcHAgPSAyOwotICAgICAgICBtU3RyaWRlID0gMiAqIG1XaWR0aDsKLSAgICAgICAgYnJlYWs7Ci0KICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6Ci0gICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgogICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CkBAIC0xMzMsNiArMTcyLDEwIEBACiAgICAgICAgIG1TdHJpZGUgPSBtV2lkdGg7CiAgICAgICAgIGJyZWFrOwogICAgIH0KKyAgICAvLyB1c2UgY2xpZW50J3Mgc3RyaWRlIGlmIGl0J3Mgc3BlY2lmaWVkLgorICAgIGlmIChzdHJpZGUgIT0gMCkgeworICAgICAgICBtU3RyaWRlID0gc3RyaWRlOworICAgIH0KIH0KIAogc2l6ZV90IENvbG9yQ29udmVydGVyOjpCaXRtYXBQYXJhbXM6OmNyb3BXaWR0aCgpIGNvbnN0IHsKQEAgLTE0NSwyMSArMTg4LDIxIEBACiAKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0KAogICAgICAgICBjb25zdCB2b2lkICpzcmNCaXRzLAotICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsCisgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKICAgICAgICAgc2l6ZV90IHNyY0Nyb3BMZWZ0LCBzaXplX3Qgc3JjQ3JvcFRvcCwKICAgICAgICAgc2l6ZV90IHNyY0Nyb3BSaWdodCwgc2l6ZV90IHNyY0Nyb3BCb3R0b20sCiAgICAgICAgIHZvaWQgKmRzdEJpdHMsCi0gICAgICAgIHNpemVfdCBkc3RXaWR0aCwgc2l6ZV90IGRzdEhlaWdodCwKKyAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LCBzaXplX3QgZHN0U3RyaWRlLAogICAgICAgICBzaXplX3QgZHN0Q3JvcExlZnQsIHNpemVfdCBkc3RDcm9wVG9wLAogICAgICAgICBzaXplX3QgZHN0Q3JvcFJpZ2h0LCBzaXplX3QgZHN0Q3JvcEJvdHRvbSkgewogICAgIEJpdG1hcFBhcmFtcyBzcmMoCiAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQgKj4oc3JjQml0cyksCi0gICAgICAgICAgICBzcmNXaWR0aCwgc3JjSGVpZ2h0LAorICAgICAgICAgICAgc3JjV2lkdGgsIHNyY0hlaWdodCwgc3JjU3RyaWRlLAogICAgICAgICAgICAgc3JjQ3JvcExlZnQsIHNyY0Nyb3BUb3AsIHNyY0Nyb3BSaWdodCwgc3JjQ3JvcEJvdHRvbSwgbVNyY0Zvcm1hdCk7CiAKICAgICBCaXRtYXBQYXJhbXMgZHN0KAogICAgICAgICAgICAgZHN0Qml0cywKLSAgICAgICAgICAgIGRzdFdpZHRoLCBkc3RIZWlnaHQsCisgICAgICAgICAgICBkc3RXaWR0aCwgZHN0SGVpZ2h0LCBkc3RTdHJpZGUsCiAgICAgICAgICAgICBkc3RDcm9wTGVmdCwgZHN0Q3JvcFRvcCwgZHN0Q3JvcFJpZ2h0LCBkc3RDcm9wQm90dG9tLCBtRHN0Rm9ybWF0KTsKIAogICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMApAQCAtMjAxLDcgKzI0NCwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyNpZmRlZiBVU0VfTElCWVVWCisgICAgICAgICAgICBlcnIgPSBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hclVzZUxpYllVVihzcmMsIGRzdCk7CisjZWxzZQogICAgICAgICAgICAgZXJyID0gY29udmVydFlVVjQyMFNlbWlQbGFuYXIoc3JjLCBkc3QpOworI2VuZGlmCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgpAQCAtMjc2LDYgKzMyMywxMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorI2RlZmluZSBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIHJnYikgaW50ICgqZnVuYykoICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQ4KiwgaW50LCBjb25zdCB1aW50OCosIGludCwgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdWludDgqLCBpbnQsIHVpbnQ4KiwgaW50LCBpbnQsIGludCkgICAgICAgXAorICAgICAgICA9IG1TcmNDb2xvclNwYWNlLmlzQnQ3MDkoKSA/IGxpYnl1djo6SDQyMFRvIyNyZ2IgXAorICAgICAgICA6IG1TcmNDb2xvclNwYWNlLmlzSnBlZygpID8gbGlieXV2OjpKNDIwVG8jI3JnYiAgXAorICAgICAgICA6IGxpYnl1djo6STQyMFRvIyNyZ2IKKwogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewogICAgIHVpbnQ4X3QgKmRzdF9wdHIgPSAodWludDhfdCAqKWRzdC5tQml0cwpAQCAtMjkzLDE5ICszNDcsMjggQEAKIAogICAgIHN3aXRjaCAobURzdEZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgotICAgICAgICBsaWJ5dXY6Okk0MjBUb1JHQjU2NShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCisgICAgeworICAgICAgICBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIFJHQjU2NSk7CisgICAgICAgICgqZnVuYykoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOwogICAgICAgICBicmVhazsKKyAgICB9CiAKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgotICAgICAgICBsaWJ5dXY6OkNvbnZlcnRGcm9tSTQyMChzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSwgbGlieXV2OjpGT1VSQ0NfQUJHUik7CisgICAgeworICAgICAgICBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIEFCR1IpOworICAgICAgICAoKmZ1bmMpKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKICAgICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKLSAgICAgICAgbGlieXV2OjpDb252ZXJ0RnJvbUk0MjAoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCksIGxpYnl1djo6Rk9VUkNDX0FSR0IpOworICAgIHsKKyAgICAgICAgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCBBUkdCKTsKKyAgICAgICAgKCpmdW5jKShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CiAgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTMxNCw2ICszNzcsMzYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwU2VtaVBsYW5hclVzZUxpYllVVigKKyAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CisgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCisgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OworCisgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tU3RyaWRlICogc3JjLm1IZWlnaHQKKyAgICAgICAgKyAoc3JjLm1Dcm9wVG9wIC8gMikgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CisKKyAgICBzd2l0Y2ggKG1Ec3RGb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKKyAgICAgICAgbGlieXV2OjpOVjEyVG9SR0I1NjUoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUsICh1aW50OCAqKWRzdF9wdHIsCisgICAgICAgICAgICAgICAgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODoKKyAgICAgICAgbGlieXV2OjpOVjEyVG9BUkdCKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlLCAodWludDggKilkc3RfcHRyLAorICAgICAgICAgICAgICAgIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgIH0KKworICAgcmV0dXJuIE9LOworfQorCiBzdGQ6OmZ1bmN0aW9uPHZvaWQgKHZvaWQgKiwgdm9pZCAqLCB2b2lkICosIHNpemVfdCwKICAgICAgICAgICAgICAgICAgICAgc2lnbmVkICosIHNpZ25lZCAqLCBzaWduZWQgKiwgc2lnbmVkICopPgogZ2V0UmVhZEZyb21TcmMoT01YX0NPTE9SX0ZPUk1BVFRZUEUgc3JjRm9ybWF0KSB7CkBAIC03OTMsMTUgKzg4NiwxNSBAQAogCiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKLSAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKWRzdC5tQml0cwotICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tV2lkdGggKyBkc3QubUNyb3BMZWZ0OworICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopKCh1aW50OF90ICopCisgICAgICAgICAgICBkc3QubUJpdHMgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcCk7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgc3JjLm1XaWR0aCAqIHNyYy5tSGVpZ2h0Ci0gICAgICAgICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1IZWlnaHQgKiBzcmMubVN0cmlkZSArCisgICAgICAgIChzcmMubUNyb3BUb3AgLyAyKSAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKQEAgLTg0MywxMyArOTM2LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzcmNfeSArPSBzcmMubVdpZHRoOworICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKIAogICAgICAgICBpZiAoeSAmIDEpIHsKLSAgICAgICAgICAgIHNyY191ICs9IHNyYy5tV2lkdGg7CisgICAgICAgICAgICBzcmNfdSArPSBzcmMubVN0cmlkZTsKICAgICAgICAgfQogCi0gICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aDsKKyAgICAgICAgZHN0X3B0ciA9ICh1aW50MTZfdCopKCh1aW50OF90Kilkc3RfcHRyICsgZHN0Lm1TdHJpZGUpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCA2NTdhMDViLi4zNTlkZjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC00NCw2ICs0NCw3IEBACiAgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCiAgICAgICBtV2lkdGgoMCksCiAgICAgICBtSGVpZ2h0KDApLAorICAgICAgbVN0cmlkZSgwKSwKICAgICAgIG1Dcm9wTGVmdCgwKSwKICAgICAgIG1Dcm9wVG9wKDApLAogICAgICAgbUNyb3BSaWdodCgwKSwKQEAgLTY3LDkgKzY4LDEwIEBACiAgICAgaW50MzJfdCBjb2xvckZvcm1hdE5ldzsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0TmV3KSk7CiAKLSAgICBpbnQzMl90IHdpZHRoTmV3LCBoZWlnaHROZXc7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZ3aWR0aE5ldykpOworICAgIGludDMyX3Qgd2lkdGhOZXcsIGhlaWdodE5ldywgc3RyaWRlTmV3OworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aE5ldykpOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzbGljZS1oZWlnaHQiLCAmaGVpZ2h0TmV3KSk7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGVOZXcpKTsKIAogICAgIGludDMyX3QgY3JvcExlZnROZXcsIGNyb3BUb3BOZXcsIGNyb3BSaWdodE5ldywgY3JvcEJvdHRvbU5ldzsKICAgICBpZiAoIWZvcm1hdC0+ZmluZFJlY3QoCkBAIC0xMDYsNiArMTA4LDcgQEAKICAgICBtQ29sb3JGb3JtYXQgPSBzdGF0aWNfY2FzdDxPTVhfQ09MT1JfRk9STUFUVFlQRT4oY29sb3JGb3JtYXROZXcpOwogICAgIG1XaWR0aCA9IHdpZHRoTmV3OwogICAgIG1IZWlnaHQgPSBoZWlnaHROZXc7CisgICAgbVN0cmlkZSA9IHN0cmlkZU5ldzsKICAgICBtQ3JvcExlZnQgPSBjcm9wTGVmdE5ldzsKICAgICBtQ3JvcFRvcCA9IGNyb3BUb3BOZXc7CiAgICAgbUNyb3BSaWdodCA9IGNyb3BSaWdodE5ldzsKQEAgLTI3NiwyMCArMjc5LDE1IEBACiAgICAgaWYgKG1Db252ZXJ0ZXIpIHsKICAgICAgICAgbUNvbnZlcnRlci0+Y29udmVydCgKICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1TdHJpZGUsCiAgICAgICAgICAgICAgICAgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BSaWdodCwgbUNyb3BCb3R0b20sCiAgICAgICAgICAgICAgICAgZHN0LAotICAgICAgICAgICAgICAgIGJ1Zi0+c3RyaWRlLCBidWYtPmhlaWdodCwKKyAgICAgICAgICAgICAgICBidWYtPnN0cmlkZSwgYnVmLT5oZWlnaHQsIDAsCiAgICAgICAgICAgICAgICAgMCwgMCwgbUNyb3BXaWR0aCAtIDEsIG1Dcm9wSGVpZ2h0IC0gMSk7CiAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQ7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gc3JjX3UgKyAobVdpZHRoIC8gMiAqIG1IZWlnaHQgLyAyKTsKLQotICAgICAgICBzcmNfeSArPW1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoOwotICAgICAgICBzcmNfdSArPShtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpLzI7Ci0gICAgICAgIHNyY192ICs9KG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikvMjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgKyBtQ3JvcExlZnQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVN0cmlkZSAqIG1IZWlnaHQgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgLyA0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IChjb25zdCB1aW50OF90ICopc3JjX3UgKyBtU3RyaWRlICogbUhlaWdodCAvIDQ7CiAKICAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKICAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OwpAQCAtMzA1LDcgKzMwMyw3IEBACiAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbUNyb3BIZWlnaHQ7ICsreSkgewogICAgICAgICAgICAgbWVtY3B5KGRzdF95LCBzcmNfeSwgbUNyb3BXaWR0aCk7CiAKLSAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKKyAgICAgICAgICAgIHNyY195ICs9IG1TdHJpZGU7CiAgICAgICAgICAgICBkc3RfeSArPSBidWYtPnN0cmlkZTsKICAgICAgICAgfQogCkBAIC0zMTMsMTkgKzMxMSwxNSBAQAogICAgICAgICAgICAgbWVtY3B5KGRzdF91LCBzcmNfdSwgKG1Dcm9wV2lkdGggKyAxKSAvIDIpOwogICAgICAgICAgICAgbWVtY3B5KGRzdF92LCBzcmNfdiwgKG1Dcm9wV2lkdGggKyAxKSAvIDIpOwogCi0gICAgICAgICAgICBzcmNfdSArPSBtV2lkdGggLyAyOwotICAgICAgICAgICAgc3JjX3YgKz0gbVdpZHRoIC8gMjsKKyAgICAgICAgICAgIHNyY191ICs9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgc3JjX3YgKz0gbVN0cmlkZSAvIDI7CiAgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpIHsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY195ID0gKGNvbnN0IHVpbnQxNl90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY191ID0gKGNvbnN0IHVpbnQxNl90ICopZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQ7Ci0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfdiA9IHNyY191ICsgKG1XaWR0aCAvIDIgKiBtSGVpZ2h0IC8gMik7Ci0KLSAgICAgICAgc3JjX3kgKz0gbUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGg7Ci0gICAgICAgIHNyY191ICs9IChtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpIC8gMjsKLSAgICAgICAgc3JjX3YgKz0gKG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikgLyAyOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1Dcm9wVG9wICogbVN0cmlkZSArIG1Dcm9wTGVmdCAqIDI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVN0cmlkZSAqIG1IZWlnaHQgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgLyA0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IChjb25zdCB1aW50OF90ICopc3JjX3UgKyBtU3RyaWRlICogbUhlaWdodCAvIDQ7CiAKICAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKICAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OwpAQCAtMzQwLDIxICszMzQsMjEgQEAKIAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG1Dcm9wSGVpZ2h0OyArK3kpIHsKICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbUNyb3BXaWR0aDsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgZHN0X3lbeF0gPSAodWludDhfdCkoc3JjX3lbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSAodWludDhfdCkoKCh1aW50MTZfdCAqKXNyY195KVt4XSA+PiAyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3JjX3kgKz0gbVdpZHRoOworICAgICAgICAgICAgc3JjX3kgKz0gbVN0cmlkZTsKICAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOwogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAobUNyb3BIZWlnaHQgKyAxKSAvIDI7ICsreSkgewogICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAobUNyb3BXaWR0aCArIDEpIC8gMjsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgZHN0X3VbeF0gPSAodWludDhfdCkoc3JjX3VbeF0gPj4gMik7Ci0gICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSAodWludDhfdCkoc3JjX3ZbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSAodWludDhfdCkoKCh1aW50MTZfdCAqKXNyY191KVt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3YpW3hdID4+IDIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzcmNfdSArPSBtV2lkdGggLyAyOwotICAgICAgICAgICAgc3JjX3YgKz0gbVdpZHRoIC8gMjsKKyAgICAgICAgICAgIHNyY191ICs9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgc3JjX3YgKz0gbVN0cmlkZSAvIDI7CiAgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfYXVkaW8ueG1sCmluZGV4IDBiNTU0YTIuLjQ3YTk3MTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX2F1ZGlvLnhtbApAQCAtMTcsNTEgKzE3LDYxIEBACiA8SW5jbHVkZWQ+CiAgICAgPERlY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTMyMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjczNTAsODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1hbGF3Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMzIwMDAtNTAwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjYwMDAtNTEwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQucmF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3JhdyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5yYXcuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgpAQCAtNjksMjkgKzc5LDQwIEBACiAgICAgPC9EZWNvZGVycz4KICAgICA8RW5jb2RlcnM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjYiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KICAgICAgICAgICAgIDwhLS0gYWxzbyBtYXkgc3VwcG9ydCA2NDAwMCwgODgyMDAgIGFuZCA5NjAwMCBIeiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcm5iLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZW5jb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbXBsZXhpdHkiIHJhbmdlPSIwLTgiICBkZWZhdWx0PSI1IiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNRIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5lbmNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMjAwMCwxNjAwMCwyNDAwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNTAwLTUxMjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC0xMCIgIGRlZmF1bHQ9IjUiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ1EiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICA8L0VuY29kZXJzPgogPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90ZWxlcGhvbnkueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3RlbGVwaG9ueS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwYjA5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90ZWxlcGhvbnkueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmdzbS5kZWNvZGVyIiB0eXBlPSJhdWRpby9nc20iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZ3NtLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEzMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdHYueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3R2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjAwZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3R2LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnMi5kZWNvZGVyIiB0eXBlPSJ2aWRlby9tcGVnMiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcGVnMi5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbEhMIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTkyMHgxMDg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NDgwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbAppbmRleCBhZGI0NWIzLi5lMjAxNzRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwKQEAgLTE3LDYgKzE3LDcgQEAKIDxJbmNsdWRlZD4KICAgICA8RGVjb2RlcnM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzQuZGVjb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZVNpbXBsZSA6IExldmVsMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTI2LDYgKzI3LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsMzAsIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDUKICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUlTV1YyIDogTGV2ZWwzMCwgUHJvZmlsZUlTV1YyIDogTGV2ZWw0NSAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgpAQCAtMzQsNiArMzYsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVIaWdoIDogTGV2ZWw1MiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSI0MDgweDQwODAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpAQCAtNDQsNiArNDcsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2hldmMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA5Nng0MDk2IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTU0LDYgKzU4LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudnA4LmRlY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA4LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CkBAIC02Myw2ICs2OCw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOS5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgpAQCAtNzEsMTYgKzc3LDI3IEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmF2MS5kZWNvZGVyIiB0eXBlPSJ2aWRlby9hdjAxIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49Ijk2eDk2IiBtYXg9IjE5MjB4MTA4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiBtaW49IjI0IiBtYXg9IjIwNzM2MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImZyYW1lLXJhdGUiIHJhbmdlPSIxLTYwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICA8L0RlY29kZXJzPgogCiAgICAgPEVuY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1IC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTc2eDE0NCIgbWF4PSIxNzZ4MTQ0IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyODAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmF2Yy5lbmNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0MSAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC05MCw3ICsxMDcsMTcgQEAKICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImludHJhLXJlZnJlc2giIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oZXZjLmVuY29kZXIiIHR5cGU9InZpZGVvL2hldmMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIzMjB4MTI4IiBtYXg9IjUxMng1MTIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTQwOTYiIC8+IDwhLS0gbWF4IDUxMng1MTIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEyMjg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wZWc0LmVuY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVDb3JlIDogTGV2ZWwyIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTc2eDE0NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KQEAgLTk5LDYgKzEyNiw3IEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNjQwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDguZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDguZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpAQCAtMTA5LDYgKzEzNyw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOS5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCA2YmZhYjE2Li4zMDdjOWIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTI3LDE3ICsyNywyMSBAQAogICAgIH0sCiAKICAgICBzdGF0aWM6IHsKLSAgICAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAorICAgICAgICB3aG9sZV9zdGF0aWNfbGliczogWworICAgICAgICAgICAgImxpYkZMQUMiLAorICAgICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICBdLAogICAgIH0sCiAKICAgICBzaGFyZWQ6IHsKLSAgICAgICAgc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAorICAgICAgICBzdGF0aWNfbGliczogWworICAgICAgICAgICAgImxpYkZMQUMiLAorICAgICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICBdLAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsibGlibWVkaWFfaGVhZGVycyJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCmluZGV4IGRmZGM0MWMuLmNlZjBiYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+IC8vIGZsb2F0X2Zyb21faTMyCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTExNywxMDQgKzExOCw0MyBAQAogICAgIG1FcnJvclN0YXR1cyA9IHN0YXR1czsKIH0KIAotLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgaW50ZXJsZWF2ZWQuCisvLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBzaWduZWQKKy8vIG9yIDMyLWJpdCBmbG9hdCBpbnRlcmxlYXZlZC4KKy8vIFRPRE86IENvbnNpZGVyIG1vdmluZyB0byBhdWRpb191dGlscy4gIFNlZSBzaW1pbGFyIGNvZGUgYXQgRkxBQ0V4dHJhY3Rvci5jcHAKIC8vIFRoZXNlIGFyZSBjYW5kaWRhdGVzIGZvciBvcHRpbWl6YXRpb24gaWYgbmVlZGVkLgotc3RhdGljIHZvaWQgY29weU1vbm84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUbzE2U2lnbmVkKAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCA4OworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCBpbnQgbGVmdFNoaWZ0ID0gMTYgLSAoaW50KWJpdHNQZXJTYW1wbGU7IC8vIGNhc3QgdG8gaW50IHRvIHByZXZlbnQgdW5zaWduZWQgb3ZlcmZsb3cuCisgICAgaWYgKGxlZnRTaGlmdCA+PSAwKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgbGVmdFNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IHJpZ2h0U2hpZnQgPSAtbGVmdFNoaWZ0OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IHJpZ2h0U2hpZnQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAorc3RhdGljIHZvaWQgY29weVRvRmxvYXQoCisgICAgICAgIGZsb2F0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNigKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7CisgICAgICAgIHVuc2lnbmVkIG5DaGFubmVscywKKyAgICAgICAgdW5zaWduZWQgYml0c1BlclNhbXBsZSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGxlZnRTaGlmdCA9IDMyIC0gYml0c1BlclNhbXBsZTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gVE9ETzogMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKLXN0YXRpYyB2b2lkIGNvcHlNb25vMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gyNCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiA4OworICAgICAgICAgICAgKmRzdCsrID0gZmxvYXRfZnJvbV9pMzIoc3JjW2NdW2ldIDw8IGxlZnRTaGlmdCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yMzgsOCArMTc4LDcgQEAKICAgICAgIG1TdHJlYW1JbmZvVmFsaWQoZmFsc2UpLAogICAgICAgbVdyaXRlUmVxdWVzdGVkKGZhbHNlKSwKICAgICAgIG1Xcml0ZUNvbXBsZXRlZChmYWxzZSksCi0gICAgICBtRXJyb3JTdGF0dXMoKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cykgLTEpLAotICAgICAgbUNvcHkobnVsbHB0cikgeworICAgICAgbUVycm9yU3RhdHVzKChGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMpIC0xKSB7CiAgICAgQUxPR1YoImN0b3I6Iik7CiAgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CiAgICAgbWVtc2V0KCZtV3JpdGVIZWFkZXIsIDAsIHNpemVvZihtV3JpdGVIZWFkZXIpKTsKQEAgLTM3OSw2ICszMTgsNyBAQAogICAgICAgICBjYXNlIDg6CiAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgIGNhc2UgMzI6IC8vIGdlbmVyYWxseSByYXJlLCBidXQgaXMgc3VwcG9ydGVkIGluIHRoZSBmcmFtZXdvcmsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0zODcsMzEgKzMyNyw2IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIC8vIGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgY29weSBmdW5jdGlvbiwgZGVmYXVsdGluZyB0byB0cmVzcGFzcwotICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBtQ2hhbm5lbHM7Ci0gICAgICAgIHVuc2lnbmVkIG1CaXRzUGVyU2FtcGxlOwotICAgICAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7Ci0gICAgfSB0YWJsZVtdID0gewotICAgICAgICB7IDEsICA4LCBjb3B5TW9ubzggICAgIH0sCi0gICAgICAgIHsgMiwgIDgsIGNvcHlTdGVyZW84ICAgfSwKLSAgICAgICAgeyA4LCAgOCwgY29weU11bHRpQ2g4ICB9LAotICAgICAgICB7IDEsIDE2LCBjb3B5TW9ubzE2ICAgIH0sCi0gICAgICAgIHsgMiwgMTYsIGNvcHlTdGVyZW8xNiAgfSwKLSAgICAgICAgeyA4LCAxNiwgY29weU11bHRpQ2gxNiB9LAotICAgICAgICB7IDEsIDI0LCBjb3B5TW9ubzI0ICAgIH0sCi0gICAgICAgIHsgMiwgMjQsIGNvcHlTdGVyZW8yNCAgfSwKLSAgICAgICAgeyA4LCAyNCwgY29weU11bHRpQ2gyNCB9LAotICAgIH07Ci0gICAgZm9yIChjb25zdCBhdXRvICZlbnRyeSA6IHRhYmxlKSB7Ci0gICAgICAgIGlmIChlbnRyeS5tQ2hhbm5lbHMgPj0gZ2V0Q2hhbm5lbHMoKSAmJgotICAgICAgICAgICAgICAgIGVudHJ5Lm1CaXRzUGVyU2FtcGxlID09IGdldEJpdHNQZXJTYW1wbGUoKSkgewotICAgICAgICAgICAgbUNvcHkgPSBlbnRyeS5tQ29weTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gTm93IHdlIGhhdmUgYWxsIG1ldGFkYXRhIGJsb2Nrcy4KICAgICBtQnVmZmVyUG9zID0gMDsKICAgICBtQnVmZmVyRGF0YVNpemUgPSAwOwpAQCAtNDIwLDcgKzMzNSw3IEBACiB9CiAKIHN0YXR1c190IEZMQUNEZWNvZGVyOjpkZWNvZGVPbmVGcmFtZShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuLAotICAgICAgICBpbnQxNl90ICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuKSB7CisgICAgICAgIHZvaWQgKm91dEJ1ZmZlciwgc2l6ZV90ICpvdXRCdWZmZXJMZW4sIGJvb2wgb3V0cHV0RmxvYXQpIHsKICAgICBBTE9HVigiZGVjb2RlT25lRnJhbWU6IGlucHV0IHNpemUoJXp1KSIsIGluQnVmZmVyTGVuKTsKIAogICAgIGlmICghbVN0cmVhbUluZm9WYWxpZCkgewpAQCAtNDY5LDIxICszODQsMzMgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3QgdW5zaWduZWQgY2hhbm5lbHMgPSBnZXRDaGFubmVscygpOworICAgIGNvbnN0IHNpemVfdCBzYW1wbGVTaXplID0gb3V0cHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZVNpemUgPSBjaGFubmVscyAqIHNhbXBsZVNpemU7CisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBmcmFtZVNpemU7CiAgICAgaWYgKGJ1ZmZlclNpemUgPiAqb3V0QnVmZmVyTGVuKSB7CiAgICAgICAgIEFMT0dXKCJkZWNvZGVPbmVGcmFtZTogb3V0cHV0IGJ1ZmZlciBob2xkcyBvbmx5IHBhcnRpYWwgZnJhbWUgJXp1OiV6dSIsCiAgICAgICAgICAgICAgICAgKm91dEJ1ZmZlckxlbiwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgIGJsb2Nrc2l6ZSA9ICpvdXRCdWZmZXJMZW4gLyAoZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgIGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBibG9ja3NpemUgPSAqb3V0QnVmZmVyTGVuIC8gZnJhbWVTaXplOworICAgICAgICBidWZmZXJTaXplID0gYmxvY2tzaXplICogZnJhbWVTaXplOwogICAgIH0KIAotICAgIGlmIChtQ29weSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJkZWNvZGVPbmVGcmFtZTogZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQ6IGNoYW5uZWxzKCVkKSwgQml0c1BlclNhbXBsZSglZCkiLAotICAgICAgICAgICAgICAgIGdldENoYW5uZWxzKCksIGdldEJpdHNQZXJTYW1wbGUoKSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9CiAgICAgLy8gY29weSBQQ00gZnJvbSBGTEFDIHdyaXRlIGJ1ZmZlciB0byBvdXRwdXQgYnVmZmVyLCB3aXRoIGludGVybGVhdmluZwotICAgICgqbUNvcHkpKG91dEJ1ZmZlciwgbVdyaXRlQnVmZmVyLCBibG9ja3NpemUsIGdldENoYW5uZWxzKCkpOworCisgICAgY29uc3QgdW5zaWduZWQgYml0c1BlclNhbXBsZSA9IGdldEJpdHNQZXJTYW1wbGUoKTsKKyAgICBpZiAob3V0cHV0RmxvYXQpIHsKKyAgICAgICAgY29weVRvRmxvYXQocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KG91dEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29weVRvMTZTaWduZWQocmVpbnRlcnByZXRfY2FzdDxzaG9ydCo+KG91dEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfQogICAgICpvdXRCdWZmZXJMZW4gPSBidWZmZXJTaXplOwogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oCmluZGV4IGFmNDE5YTIuLjY5NGZjY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaApAQCAtNDEsNyArNDEsNyBAQAogCiAgICAgc3RhdHVzX3QgcGFyc2VNZXRhZGF0YShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuKTsKICAgICBzdGF0dXNfdCBkZWNvZGVPbmVGcmFtZShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuLAotICAgICAgICAgICAgaW50MTZfdCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbik7CisgICAgICAgICAgICB2b2lkICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuLCBib29sIG91dHB1dEZsb2F0ID0gZmFsc2UpOwogICAgIHZvaWQgZmx1c2goKTsKICAgICB2aXJ0dWFsIH5GTEFDRGVjb2RlcigpOwogCkBAIC04OSw4ICs4OSw2IEBACiAgICAgLy8gbW9zdCByZWNlbnQgZXJyb3IgcmVwb3J0ZWQgYnkgbGliRkxBQyBkZWNvZGVyCiAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIG1FcnJvclN0YXR1czsKIAotICAgIHZvaWQgKCptQ29weSkoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKnNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKLQogICAgIHN0YXR1c190IGluaXQoKTsKIAogICAgIC8vIEZMQUMgc3RyZWFtIGRlY29kZXIgY2FsbGJhY2tzIGFzIEMrKyBpbnN0YW5jZSBtZXRob2RzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzN2Y2Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUFTdGF0ZTo6QVN0YXRlKGNvbnN0IHNwPEFTdGF0ZT4gJnBhcmVudFN0YXRlKQotICAgIDogbVBhcmVudFN0YXRlKHBhcmVudFN0YXRlKSB7Ci19Ci0KLUFTdGF0ZTo6fkFTdGF0ZSgpIHsKLX0KLQotc3A8QVN0YXRlPiBBU3RhdGU6OnBhcmVudFN0YXRlKCkgewotICAgIHJldHVybiBtUGFyZW50U3RhdGU7Ci19Ci0KLXZvaWQgQVN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7Ci19Ci0KLXZvaWQgQVN0YXRlOjpzdGF0ZUV4aXRlZCgpIHsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKLX0KLQotQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6fkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Ci19Ci0KLXZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6aGFuZGxlTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHNwPEFTdGF0ZT4gc2F2ZSA9IG1TdGF0ZTsKLQotICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOwotICAgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiAhY3VyLT5vbk1lc3NhZ2VSZWNlaXZlZChtc2cpKSB7Ci0gICAgICAgIC8vIElmIHlvdSBjbGFpbSBub3QgdG8gaGF2ZSBoYW5kbGVkIHRoZSBtZXNzYWdlIHlvdSBzaG91bGRuJ3QKLSAgICAgICAgLy8gaGF2ZSBjYWxsZWQgc2V0U3RhdGUuLi4KLSAgICAgICAgQ0hFQ0soc2F2ZSA9PSBtU3RhdGUpOwotCi0gICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKLSAgICB9Ci0KLSAgICBpZiAoY3VyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dXKCJXYXJuaW5nIG1lc3NhZ2UgJXMgdW5oYW5kbGVkIGluIHJvb3Qgc3RhdGUuIiwKLSAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotdm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpjaGFuZ2VTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZzdGF0ZSkgewotICAgIGlmIChzdGF0ZSA9PSBtU3RhdGUpIHsKLSAgICAgICAgLy8gUXVpY2sgZXhpdCBmb3IgdGhlIGVhc3kgY2FzZS4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFZlY3RvcjxzcDxBU3RhdGU+ID4gQTsKLSAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIEEucHVzaChjdXIpOwotICAgICAgICBpZiAoY3VyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKLSAgICB9Ci0KLSAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEI7Ci0gICAgY3VyID0gc3RhdGU7Ci0gICAgZm9yICg7OykgewotICAgICAgICBCLnB1c2goY3VyKTsKLSAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgLy8gUmVtb3ZlIHRoZSBjb21tb24gdGFpbC4KLSAgICB3aGlsZSAoQS5zaXplKCkgPiAwICYmIEIuc2l6ZSgpID4gMCAmJiBBLnRvcCgpID09IEIudG9wKCkpIHsKLSAgICAgICAgQS5wb3AoKTsKLSAgICAgICAgQi5wb3AoKTsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBzdGF0ZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQS5zaXplKCk7ICsraSkgewotICAgICAgICBBLmVkaXRJdGVtQXQoaSktPnN0YXRlRXhpdGVkKCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IEIuc2l6ZSgpOyBpID4gMDspIHsKLSAgICAgICAgaS0tOwotICAgICAgICBCLmVkaXRJdGVtQXQoaSktPnN0YXRlRW50ZXJlZCgpOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCmluZGV4IDVlNzZjNjcuLmEyNzY3MjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcApAQCAtMTcwLDcgKzE3MCw5IEBACiAKICAgICBpbnQ2NF90IHdoZW5VczsKICAgICBpZiAoZGVsYXlVcyA+IDApIHsKLSAgICAgICAgd2hlblVzID0gR2V0Tm93VXMoKSArIGRlbGF5VXM7CisgICAgICAgIGludDY0X3Qgbm93VXMgPSBHZXROb3dVcygpOworICAgICAgICB3aGVuVXMgPSAoZGVsYXlVcyA+IElOVDY0X01BWCAtIG5vd1VzID8gSU5UNjRfTUFYIDogbm93VXMgKyBkZWxheVVzKTsKKwogICAgIH0gZWxzZSB7CiAgICAgICAgIHdoZW5VcyA9IEdldE5vd1VzKCk7CiAgICAgfQpAQCAtMjA4LDYgKzIxMCw5IEBACiAKICAgICAgICAgaWYgKHdoZW5VcyA+IG5vd1VzKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSB3aGVuVXMgLSBub3dVczsKKyAgICAgICAgICAgIGlmIChkZWxheVVzID4gSU5UNjRfTUFYIC8gMTAwMCkgeworICAgICAgICAgICAgICAgIGRlbGF5VXMgPSBJTlQ2NF9NQVggLyAxMDAwOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVF1ZXVlQ2hhbmdlZENvbmRpdGlvbi53YWl0UmVsYXRpdmUobUxvY2ssIGRlbGF5VXMgKiAxMDAwbGwpOwogCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmZGMzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1Nlc3Npb24iCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJBTmV0d29ya1Nlc3Npb24uaCIKLSNpbmNsdWRlICJQYXJzZWRNZXNzYWdlLmgiCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgotI2luY2x1ZGUgPG5ldC9pZi5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VURQU2l6ZSA9IDE1MDA7Ci1zdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4VURQUmV0cmllcyA9IDIwMDsKLQotc3RydWN0IEFOZXR3b3JrU2Vzc2lvbjo6TmV0d29ya1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIGV4cGxpY2l0IE5ldHdvcmtUaHJlYWQoQU5ldHdvcmtTZXNzaW9uICpzZXNzaW9uKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk5ldHdvcmtUaHJlYWQoKTsKLQotcHJpdmF0ZToKLSAgICBBTmV0d29ya1Nlc3Npb24gKm1TZXNzaW9uOwotCi0gICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE5ldHdvcmtUaHJlYWQpOwotfTsKLQotc3RydWN0IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBlbnVtIE1vZGUgewotICAgICAgICBNT0RFX1JUU1AsCi0gICAgICAgIE1PREVfREFUQUdSQU0sCi0gICAgICAgIE1PREVfV0VCU09DS0VULAotICAgIH07Ci0KLSAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgQ09OTkVDVElORywKLSAgICAgICAgQ09OTkVDVEVELAotICAgICAgICBMSVNURU5JTkdfUlRTUCwKLSAgICAgICAgTElTVEVOSU5HX1RDUF9ER1JBTVMsCi0gICAgICAgIERBVEFHUkFNLAotICAgIH07Ci0KLSAgICBTZXNzaW9uKGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICAgICAgU3RhdGUgc3RhdGUsCi0gICAgICAgICAgICBpbnQgcywKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgIGludDMyX3Qgc2Vzc2lvbklEKCkgY29uc3Q7Ci0gICAgaW50IHNvY2tldCgpIGNvbnN0OwotICAgIHNwPEFNZXNzYWdlPiBnZXROb3RpZmljYXRpb25NZXNzYWdlKCkgY29uc3Q7Ci0KLSAgICBib29sIGlzUlRTUFNlcnZlcigpIGNvbnN0OwotICAgIGJvb2wgaXNUQ1BEYXRhZ3JhbVNlcnZlcigpIGNvbnN0OwotCi0gICAgYm9vbCB3YW50c1RvUmVhZCgpOwotICAgIGJvb2wgd2FudHNUb1dyaXRlKCk7Ci0KLSAgICBzdGF0dXNfdCByZWFkTW9yZSgpOwotICAgIHN0YXR1c190IHdyaXRlTW9yZSgpOwotCi0gICAgc3RhdHVzX3Qgc2VuZFJlcXVlc3QoCi0gICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzc2l6ZV90IHNpemUsIGJvb2wgdGltZVZhbGlkLCBpbnQ2NF90IHRpbWVVcyk7Ci0KLSAgICB2b2lkIHNldE1vZGUoTW9kZSBtb2RlKTsKLQotICAgIHN0YXR1c190IHN3aXRjaFRvV2ViU29ja2V0TW9kZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+U2Vzc2lvbigpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQgPSAxLAotICAgIH07Ci0gICAgc3RydWN0IEZyYWdtZW50IHsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwotICAgICAgICBpbnQ2NF90IG1UaW1lVXM7Ci0gICAgICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgfTsKLQotICAgIGludDMyX3QgbVNlc3Npb25JRDsKLSAgICBTdGF0ZSBtU3RhdGU7Ci0gICAgTW9kZSBtTW9kZTsKLSAgICBpbnQgbVNvY2tldDsKLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLSAgICBib29sIG1TYXdSZWNlaXZlRmFpbHVyZSwgbVNhd1NlbmRGYWlsdXJlOwotICAgIGludDMyX3QgbVVEUFJldHJpZXM7Ci0KLSAgICBMaXN0PEZyYWdtZW50PiBtT3V0RnJhZ21lbnRzOwotCi0gICAgQVN0cmluZyBtSW5CdWZmZXI7Ci0KLSAgICBpbnQ2NF90IG1MYXN0U3RhbGxSZXBvcnRVczsKLQotICAgIHZvaWQgbm90aWZ5RXJyb3IoYm9vbCBzZW5kLCBzdGF0dXNfdCBlcnIsIGNvbnN0IGNoYXIgKmRldGFpbCk7Ci0gICAgdm9pZCBub3RpZnkoTm90aWZpY2F0aW9uUmVhc29uIHJlYXNvbik7Ci0KLSAgICB2b2lkIGR1bXBGcmFnbWVudFN0YXRzKGNvbnN0IEZyYWdtZW50ICZmcmFnKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlc3Npb24pOwotfTsKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFOZXR3b3JrU2Vzc2lvbjo6TmV0d29ya1RocmVhZDo6TmV0d29ya1RocmVhZChBTmV0d29ya1Nlc3Npb24gKnNlc3Npb24pCi0gICAgOiBtU2Vzc2lvbihzZXNzaW9uKSB7Ci19Ci0KLUFOZXR3b3JrU2Vzc2lvbjo6TmV0d29ya1RocmVhZDo6fk5ldHdvcmtUaHJlYWQoKSB7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkOjp0aHJlYWRMb29wKCkgewotICAgIG1TZXNzaW9uLT50aHJlYWRMb29wKCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpTZXNzaW9uKAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgU3RhdGUgc3RhdGUsCi0gICAgICAgIGludCBzLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKLSAgICA6IG1TZXNzaW9uSUQoc2Vzc2lvbklEKSwKLSAgICAgIG1TdGF0ZShzdGF0ZSksCi0gICAgICBtTW9kZShNT0RFX0RBVEFHUkFNKSwKLSAgICAgIG1Tb2NrZXQocyksCi0gICAgICBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtU2F3UmVjZWl2ZUZhaWx1cmUoZmFsc2UpLAotICAgICAgbVNhd1NlbmRGYWlsdXJlKGZhbHNlKSwKLSAgICAgIG1VRFBSZXRyaWVzKGtNYXhVRFBSZXRyaWVzKSwKLSAgICAgIG1MYXN0U3RhbGxSZXBvcnRVcygtMWxsKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQpIHsKLSAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGxvY2FsQWRkcjsKLSAgICAgICAgc29ja2xlbl90IGxvY2FsQWRkckxlbiA9IHNpemVvZihsb2NhbEFkZHIpOwotCi0gICAgICAgIGludCByZXMgPSBnZXRzb2NrbmFtZSgKLSAgICAgICAgICAgICAgICBtU29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopJmxvY2FsQWRkciwgJmxvY2FsQWRkckxlbik7Ci0gICAgICAgIENIRUNLX0dFKHJlcywgMCk7Ci0KLSAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgIHNvY2tsZW5fdCByZW1vdGVBZGRyTGVuID0gc2l6ZW9mKHJlbW90ZUFkZHIpOwotCi0gICAgICAgIHJlcyA9IGdldHBlZXJuYW1lKAotICAgICAgICAgICAgICAgIG1Tb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwgJnJlbW90ZUFkZHJMZW4pOwotICAgICAgICBDSEVDS19HRShyZXMsIDApOwotCi0gICAgICAgIGluX2FkZHJfdCBhZGRyID0gbnRvaGwobG9jYWxBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgIEFTdHJpbmcgbG9jYWxBZGRyU3RyaW5nID0gQVN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAiJWQuJWQuJWQuJWQiLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDI0KSwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgICBhZGRyICYgMHhmZik7Ci0KLSAgICAgICAgYWRkciA9IG50b2hsKHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQVN0cmluZyByZW1vdGVBZGRyU3RyaW5nID0gQVN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAiJWQuJWQuJWQuJWQiLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDI0KSwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgICBhZGRyICYgMHhmZik7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwga1doYXRDbGllbnRDb25uZWN0ZWQpOwotICAgICAgICBtc2ctPnNldFN0cmluZygic2VydmVyLWlwIiwgbG9jYWxBZGRyU3RyaW5nLmNfc3RyKCkpOwotICAgICAgICBtc2ctPnNldEludDMyKCJzZXJ2ZXItcG9ydCIsIG50b2hzKGxvY2FsQWRkci5zaW5fcG9ydCkpOwotICAgICAgICBtc2ctPnNldFN0cmluZygiY2xpZW50LWlwIiwgcmVtb3RlQWRkclN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiY2xpZW50LXBvcnQiLCBudG9ocyhyZW1vdGVBZGRyLnNpbl9wb3J0KSk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOwotICAgIH0KLX0KLQotQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp+U2Vzc2lvbigpIHsKLSAgICBBTE9HVigiU2Vzc2lvbiAlZCBnb25lIiwgbVNlc3Npb25JRCk7Ci0KLSAgICBjbG9zZShtU29ja2V0KTsKLSAgICBtU29ja2V0ID0gLTE7Ci19Ci0KLWludDMyX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzZXNzaW9uSUQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9uSUQ7Ci19Ci0KLWludCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnNvY2tldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNvY2tldDsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnNldE1vZGUoTW9kZSBtb2RlKSB7Ci0gICAgbU1vZGUgPSBtb2RlOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnN3aXRjaFRvV2ViU29ja2V0TW9kZSgpIHsKLSAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCB8fCBtTW9kZSAhPSBNT0RFX1JUU1ApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIG1Nb2RlID0gTU9ERV9XRUJTT0NLRVQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPEFNZXNzYWdlPiBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Ob3RpZnk7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjppc1JUU1BTZXJ2ZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TdGF0ZSA9PSBMSVNURU5JTkdfUlRTUDsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmlzVENQRGF0YWdyYW1TZXJ2ZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TdGF0ZSA9PSBMSVNURU5JTkdfVENQX0RHUkFNUzsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OndhbnRzVG9SZWFkKCkgewotICAgIHJldHVybiAhbVNhd1JlY2VpdmVGYWlsdXJlICYmIG1TdGF0ZSAhPSBDT05ORUNUSU5HOwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6d2FudHNUb1dyaXRlKCkgewotICAgIHJldHVybiAhbVNhd1NlbmRGYWlsdXJlCi0gICAgICAgICYmIChtU3RhdGUgPT0gQ09OTkVDVElORwotICAgICAgICAgICAgfHwgKG1TdGF0ZSA9PSBDT05ORUNURUQgJiYgIW1PdXRGcmFnbWVudHMuZW1wdHkoKSkKLSAgICAgICAgICAgIHx8IChtU3RhdGUgPT0gREFUQUdSQU0gJiYgIW1PdXRGcmFnbWVudHMuZW1wdHkoKSkpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnJlYWRNb3JlKCkgewotICAgIGlmIChtU3RhdGUgPT0gREFUQUdSQU0pIHsKLSAgICAgICAgQ0hFQ0tfRVEobU1vZGUsIE1PREVfREFUQUdSQU0pOwotCi0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoa01heFVEUFNpemUpOwotCi0gICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICAgICAgICAgIHNvY2tsZW5fdCByZW1vdGVBZGRyTGVuID0gc2l6ZW9mKHJlbW90ZUFkZHIpOwotCi0gICAgICAgICAgICBzc2l6ZV90IG47Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgbiA9IHJlY3Zmcm9tKAotICAgICAgICAgICAgICAgICAgICAgICAgbVNvY2tldCwgYnVmLT5kYXRhKCksIGJ1Zi0+Y2FwYWNpdHkoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwgJnJlbW90ZUFkZHJMZW4pOwotICAgICAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1Zi0+c2V0UmFuZ2UoMCwgbik7Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgICAgICBidWYtPm1ldGEoKS0+c2V0SW50NjQoImFycml2YWxUaW1lVXMiLCBub3dVcyk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXREYXRhZ3JhbSk7Ci0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBpcCA9IG50b2hsKHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tQWRkciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIldS4ldS4ldS4ldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAgPj4gMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlwID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlwID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCAmIDB4ZmYpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZnJvbVBvcnQiLCBudG9ocyhyZW1vdGVBZGRyLnNpbl9wb3J0KSk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGVyciA9PSBPSyk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmICghbVVEUFJldHJpZXMpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlFcnJvcihmYWxzZSAvKiBzZW5kICovLCBlcnIsICJSZWN2ZnJvbSBmYWlsZWQuIik7Ci0gICAgICAgICAgICAgICAgbVNhd1JlY2VpdmVGYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVVEUFJldHJpZXMtLTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiUmVjdmZyb20gZmFpbGVkLCAlZC8lZCByZXRyaWVzIGxlZnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVVEUFJldHJpZXMsIGtNYXhVRFBSZXRyaWVzKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1VRFBSZXRyaWVzID0ga01heFVEUFJldHJpZXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGNoYXIgdG1wWzUxMl07Ci0gICAgc3NpemVfdCBuOwotICAgIGRvIHsKLSAgICAgICAgbiA9IHJlY3YobVNvY2tldCwgdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0gICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiAobiA+IDApIHsKLSAgICAgICAgbUluQnVmZmVyLmFwcGVuZCh0bXAsIG4pOwotCi0jaWYgMAotICAgICAgICBBTE9HSSgiaW46Iik7Ci0gICAgICAgIGhleGR1bXAodG1wLCBuKTsKLSNlbmRpZgotICAgIH0gZWxzZSBpZiAobiA8IDApIHsKLSAgICAgICAgZXJyID0gLWVycm5vOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IC1FQ09OTlJFU0VUOwotICAgIH0KLQotICAgIGlmIChtTW9kZSA9PSBNT0RFX0RBVEFHUkFNKSB7Ci0gICAgICAgIC8vIFRDUCBzdHJlYW0gY2FycnlpbmcgMTYtYml0IGxlbmd0aC1wcmVmaXhlZCBkYXRhZ3JhbXMuCi0KLSAgICAgICAgd2hpbGUgKG1JbkJ1ZmZlci5zaXplKCkgPj0gMikgewotICAgICAgICAgICAgc2l6ZV90IHBhY2tldFNpemUgPSBVMTZfQVQoKGNvbnN0IHVpbnQ4X3QgKiltSW5CdWZmZXIuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpIDwgcGFja2V0U2l6ZSArIDIpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gcGFja2V0ID0gbmV3IEFCdWZmZXIocGFja2V0U2l6ZSk7Ci0gICAgICAgICAgICBtZW1jcHkocGFja2V0LT5kYXRhKCksIG1JbkJ1ZmZlci5jX3N0cigpICsgMiwgcGFja2V0U2l6ZSk7Ci0KLSAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICAgICAgcGFja2V0LT5tZXRhKCktPnNldEludDY0KCJhcnJpdmFsVGltZVVzIiwgbm93VXMpOwotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0RGF0YWdyYW0pOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBwYWNrZXQpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCBwYWNrZXRTaXplICsgMik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1Nb2RlID09IE1PREVfUlRTUCkgewotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBzaXplX3QgbGVuZ3RoOwotCi0gICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA+IDAgJiYgbUluQnVmZmVyLmNfc3RyKClbMF0gPT0gJyQnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxlbmd0aCA9IFUxNl9BVCgoY29uc3QgdWludDhfdCAqKW1JbkJ1ZmZlci5jX3N0cigpICsgMik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA8IDQgKyBsZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0QmluYXJ5RGF0YSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbCIsIG1JbkJ1ZmZlci5jX3N0cigpWzFdKTsKLQotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGRhdGEgPSBuZXcgQUJ1ZmZlcihsZW5ndGgpOwotICAgICAgICAgICAgICAgIG1lbWNweShkYXRhLT5kYXRhKCksIG1JbkJ1ZmZlci5jX3N0cigpICsgNCwgbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICAgICAgICAgIGRhdGEtPm1ldGEoKS0+c2V0SW50NjQoImFycml2YWxUaW1lVXMiLCBub3dVcyk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIGRhdGEpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIDQgKyBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxQYXJzZWRNZXNzYWdlPiBtc2cgPQotICAgICAgICAgICAgICAgIFBhcnNlZE1lc3NhZ2U6OlBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgbUluQnVmZmVyLmNfc3RyKCksIG1JbkJ1ZmZlci5zaXplKCksIGVyciAhPSBPSywgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmIChtc2cgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0RGF0YSk7Ci0gICAgICAgICAgICBub3RpZnktPnNldE9iamVjdCgiZGF0YSIsIG1zZyk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotI2lmIDEKLSAgICAgICAgICAgIC8vIFhYWCBUaGUgKG9sZCkgZG9uZ2xlIHNlbmRzIHRoZSB3cm9uZyBjb250ZW50IGxlbmd0aCBoZWFkZXIgb24gYQotICAgICAgICAgICAgLy8gU0VUX1BBUkFNRVRFUiByZXF1ZXN0IHRoYXQgc2lnbmFscyBhICJ3ZmRfaWRyX3JlcXVlc3QiLgotICAgICAgICAgICAgLy8gKDE3IGluc3RlYWQgb2YgMTkpLgotICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGVudCA9IG1zZy0+Z2V0Q29udGVudCgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgJiYgIW1lbWNtcChjb250ZW50LCAid2ZkX2lkcl9yZXF1ZXN0XHJcbiIsIDE3KQotICAgICAgICAgICAgICAgICAgICAmJiBsZW5ndGggPj0gMTkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUluQnVmZmVyLmNfc3RyKClbbGVuZ3RoXSA9PSAnXHInCi0gICAgICAgICAgICAgICAgICAgICYmIG1JbkJ1ZmZlci5jX3N0cigpW2xlbmd0aCArIDFdID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICBsZW5ndGggKz0gMjsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0tfRVEobU1vZGUsIE1PREVfV0VCU09DS0VUKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKiltSW5CdWZmZXIuY19zdHIoKTsKLSAgICAgICAgLy8gaGV4ZHVtcChkYXRhLCBtSW5CdWZmZXIuc2l6ZSgpKTsKLQotICAgICAgICB3aGlsZSAobUluQnVmZmVyLnNpemUoKSA+PSAyKSB7Ci0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMjsKLQotICAgICAgICAgICAgdWludDY0X3QgcGF5bG9hZExlbiA9IGRhdGFbMV0gJiAweDdmOwotICAgICAgICAgICAgaWYgKHBheWxvYWRMZW4gPT0gMTI2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDIgPiBtSW5CdWZmZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBheWxvYWRMZW4gPSBVMTZfQVQoJmRhdGFbb2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW4gPT0gMTI3KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDggPiBtSW5CdWZmZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBheWxvYWRMZW4gPSBVNjRfQVQoJmRhdGFbb2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSAwOwotICAgICAgICAgICAgaWYgKGRhdGFbMV0gJiAweDgwKSB7Ci0gICAgICAgICAgICAgICAgLy8gTUFTSz09MQotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyA0ID4gbUluQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXNrID0gVTMyX0FUKCZkYXRhW29mZnNldF0pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGF5bG9hZExlbiA+IG1JbkJ1ZmZlci5zaXplKCkgfHwgb2Zmc2V0ID4gbUluQnVmZmVyLnNpemUoKSAtIHBheWxvYWRMZW4pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgZnVsbCBtZXNzYWdlLgotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBwYWNrZXQgPSBuZXcgQUJ1ZmZlcihwYXlsb2FkTGVuKTsKLSAgICAgICAgICAgIG1lbWNweShwYWNrZXQtPmRhdGEoKSwgJmRhdGFbb2Zmc2V0XSwgcGF5bG9hZExlbik7Ci0KLSAgICAgICAgICAgIGlmIChtYXNrICE9IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBheWxvYWRMZW47ICsraSkgewotICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmRhdGEoKVtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW29mZnNldCArIGldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAoKG1hc2sgPj4gKDggKiAoMyAtIChpICUgNCkpKSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXRXZWJTb2NrZXRNZXNzYWdlKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgcGFja2V0KTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImhlYWRlckJ5dGUiLCBkYXRhWzBdKTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgb2Zmc2V0ICsgcGF5bG9hZExlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG5vdGlmeUVycm9yKGZhbHNlIC8qIHNlbmQgKi8sIGVyciwgIlJlY3YgZmFpbGVkLiIpOwotICAgICAgICBtU2F3UmVjZWl2ZUZhaWx1cmUgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpkdW1wRnJhZ21lbnRTdGF0cyhjb25zdCBGcmFnbWVudCAmIC8qIGZyYWcgKi8pIHsKLSNpZiAwCi0gICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgaW50NjRfdCBkZWxheU1zID0gKG5vd1VzIC0gZnJhZy5tVGltZVVzKSAvIDEwMDBsbDsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5EZWxheU1zID0gMDsKLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4RGVsYXlNcyA9IDMwMDsKLQotICAgIGNvbnN0IGNoYXIgKmtQYXR0ZXJuID0gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiOwotICAgIHNpemVfdCBrUGF0dGVyblNpemUgPSBzdHJsZW4oa1BhdHRlcm4pOwotCi0gICAgaW50IG4gPSAoa1BhdHRlcm5TaXplICogKGRlbGF5TXMgLSBrTWluRGVsYXlNcykpCi0gICAgICAgICAgICAgICAgLyAoa01heERlbGF5TXMgLSBrTWluRGVsYXlNcyk7Ci0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgbiA9IDA7Ci0gICAgfSBlbHNlIGlmICgoc2l6ZV90KW4gPiBrUGF0dGVyblNpemUpIHsKLSAgICAgICAgbiA9IGtQYXR0ZXJuU2l6ZTsKLSAgICB9Ci0KLSAgICBBTE9HSSgiWyVsbGRdOiAoJTRsbGQgbXMpICVzXG4iLAotICAgICAgICAgIGZyYWcubVRpbWVVcyAvIDEwMDAsCi0gICAgICAgICAgZGVsYXlNcywKLSAgICAgICAgICBrUGF0dGVybiArIGtQYXR0ZXJuU2l6ZSAtIG4pOwotI2VuZGlmCi19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6d3JpdGVNb3JlKCkgewotICAgIGlmIChtU3RhdGUgPT0gREFUQUdSQU0pIHsKLSAgICAgICAgQ0hFQ0soIW1PdXRGcmFnbWVudHMuZW1wdHkoKSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBjb25zdCBGcmFnbWVudCAmZnJhZyA9ICptT3V0RnJhZ21lbnRzLmJlZ2luKCk7Ci0gICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmZGF0YWdyYW0gPSBmcmFnLm1CdWZmZXI7Ci0KLSAgICAgICAgICAgIGludCBuOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG4gPSBzZW5kKG1Tb2NrZXQsIGRhdGFncmFtLT5kYXRhKCksIGRhdGFncmFtLT5zaXplKCksIDApOwotICAgICAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgICAgICAgICBlcnIgPSBPSzsKLQotICAgICAgICAgICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYWcubUZsYWdzICYgRlJBR01FTlRfRkxBR19USU1FX1ZBTElEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBGcmFnbWVudFN0YXRzKGZyYWcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1PdXRGcmFnbWVudHMuZXJhc2UobU91dEZyYWdtZW50cy5iZWdpbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1FQ09OTlJFU0VUOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChlcnIgPT0gT0sgJiYgIW1PdXRGcmFnbWVudHMuZW1wdHkoKSk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICBpZiAoIW1PdXRGcmFnbWVudHMuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIEFMT0dJKCIlenUgZGF0YWdyYW1zIHJlbWFpbiBxdWV1ZWQuIiwgbU91dEZyYWdtZW50cy5zaXplKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAoIW1VRFBSZXRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IodHJ1ZSAvKiBzZW5kICovLCBlcnIsICJTZW5kIGRhdGFncmFtIGZhaWxlZC4iKTsKLSAgICAgICAgICAgICAgICBtU2F3U2VuZEZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVURQUmV0cmllcy0tOwotICAgICAgICAgICAgICAgIEFMT0dFKCJTZW5kIGRhdGFncmFtIGZhaWxlZCwgJWQvJWQgcmV0cmllcyBsZWZ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLCBrTWF4VURQUmV0cmllcyk7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVURQUmV0cmllcyA9IGtNYXhVRFBSZXRyaWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RJTkcpIHsKLSAgICAgICAgaW50IGVycjsKLSAgICAgICAgc29ja2xlbl90IG9wdGlvbkxlbiA9IHNpemVvZihlcnIpOwotICAgICAgICBDSEVDS19FUShnZXRzb2Nrb3B0KG1Tb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAmZXJyLCAmb3B0aW9uTGVuKSwgMCk7Ci0gICAgICAgIENIRUNLX0VRKG9wdGlvbkxlbiwgKHNvY2tsZW5fdClzaXplb2YoZXJyKSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICBub3RpZnlFcnJvcihrV2hhdEVycm9yLCAtZXJyLCAiQ29ubmVjdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIG1TYXdTZW5kRmFpbHVyZSA9IHRydWU7Ci0KLSAgICAgICAgICAgIHJldHVybiAtZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgICAgICBub3RpZnkoa1doYXRDb25uZWN0ZWQpOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBDSEVDS19FUShtU3RhdGUsIENPTk5FQ1RFRCk7Ci0gICAgQ0hFQ0soIW1PdXRGcmFnbWVudHMuZW1wdHkoKSk7Ci0KLSAgICBzc2l6ZV90IG4gPSAtMTsKLSAgICB3aGlsZSAoIW1PdXRGcmFnbWVudHMuZW1wdHkoKSkgewotICAgICAgICBjb25zdCBGcmFnbWVudCAmZnJhZyA9ICptT3V0RnJhZ21lbnRzLmJlZ2luKCk7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgbiA9IHNlbmQobVNvY2tldCwgZnJhZy5tQnVmZmVyLT5kYXRhKCksIGZyYWcubUJ1ZmZlci0+c2l6ZSgpLCAwKTsKLSAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJhZy5tQnVmZmVyLT5zZXRSYW5nZSgKLSAgICAgICAgICAgICAgICBmcmFnLm1CdWZmZXItPm9mZnNldCgpICsgbiwgZnJhZy5tQnVmZmVyLT5zaXplKCkgLSBuKTsKLQotICAgICAgICBpZiAoZnJhZy5tQnVmZmVyLT5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmcmFnLm1GbGFncyAmIEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRCkgewotICAgICAgICAgICAgZHVtcEZyYWdtZW50U3RhdHMoZnJhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBtT3V0RnJhZ21lbnRzLmVyYXNlKG1PdXRGcmFnbWVudHMuYmVnaW4oKSk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgZXJyID0gLWVycm5vOwotICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgIGVyciA9IC1FQ09OTlJFU0VUOwotICAgIH0KLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbm90aWZ5RXJyb3IodHJ1ZSAvKiBzZW5kICovLCBlcnIsICJTZW5kIGZhaWxlZC4iKTsKLSAgICAgICAgbVNhd1NlbmRGYWlsdXJlID0gdHJ1ZTsKLSAgICB9Ci0KLSNpZiAwCi0gICAgaW50IG51bUJ5dGVzUXVldWVkOwotICAgIGludCByZXMgPSBpb2N0bChtU29ja2V0LCBTSU9DT1VUUSwgJm51bUJ5dGVzUXVldWVkKTsKLSAgICBpZiAocmVzID09IDAgJiYgbnVtQnl0ZXNRdWV1ZWQgPiA1MCAqIDEwMjQpIHsKLSAgICAgICAgaWYgKG51bUJ5dGVzUXVldWVkID4gNDA5NjAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiISEhIG51bUJ5dGVzUXVldWVkID0gJWQiLCBudW1CeXRlc1F1ZXVlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgICAgICBpZiAobUxhc3RTdGFsbFJlcG9ydFVzIDwgMGxsCi0gICAgICAgICAgICAgICAgfHwgbm93VXMgPiBtTGFzdFN0YWxsUmVwb3J0VXMgKyAxMDAwMDBsbCkgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCBrV2hhdE5ldHdvcmtTdGFsbCk7Ci0gICAgICAgICAgICBtc2ctPnNldFNpemUoIm51bUJ5dGVzUXVldWVkIiwgbnVtQnl0ZXNRdWV1ZWQpOwotICAgICAgICAgICAgbXNnLT5wb3N0KCk7Ci0KLSAgICAgICAgICAgIG1MYXN0U3RhbGxSZXBvcnRVcyA9IG5vd1VzOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnNlbmRSZXF1ZXN0KAotICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzc2l6ZV90IHNpemUsIGJvb2wgdGltZVZhbGlkLCBpbnQ2NF90IHRpbWVVcykgewotICAgIENIRUNLKG1TdGF0ZSA9PSBDT05ORUNURUQgfHwgbVN0YXRlID09IERBVEFHUkFNKTsKLQotICAgIGlmIChzaXplIDwgMCkgewotICAgICAgICBzaXplID0gc3RybGVuKChjb25zdCBjaGFyICopZGF0YSk7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQgJiYgbU1vZGUgPT0gTU9ERV9EQVRBR1JBTSkgewotICAgICAgICBDSEVDS19MRShzaXplLCA2NTUzNSk7Ci0KLSAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSArIDIpOwotICAgICAgICBidWZmZXItPmRhdGEoKVswXSA9IHNpemUgPj4gODsKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gPSBzaXplICYgMHhmZjsKLSAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpICsgMiwgZGF0YSwgc2l6ZSk7Ci0gICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEICYmIG1Nb2RlID09IE1PREVfV0VCU09DS0VUKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBib29sIGtVc2VNYXNrID0gZmFsc2U7ICAvLyBDaHJvbWl1bSBkb2Vzbid0IGxpa2UgaXQuCi0KLSAgICAgICAgc2l6ZV90IG51bUhlYWRlckJ5dGVzID0gMiArIChrVXNlTWFzayA/IDQgOiAwKTsKLSAgICAgICAgaWYgKHNpemUgPiA2NTUzNSkgewotICAgICAgICAgICAgbnVtSGVhZGVyQnl0ZXMgKz0gODsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID4gMTI1KSB7Ci0gICAgICAgICAgICBudW1IZWFkZXJCeXRlcyArPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIobnVtSGVhZGVyQnl0ZXMgKyBzaXplKTsKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMF0gPSAweDgxOyAgLy8gRklOPT0xIHwgb3Bjb2RlPTEgKHRleHQpCi0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdID0ga1VzZU1hc2sgPyAweDgwIDogMHgwMDsKLQotICAgICAgICBpZiAoc2l6ZSA+IDY1NTM1KSB7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsxXSB8PSAxMjc7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsyXSA9IDB4MDA7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVszXSA9IDB4MDA7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs0XSA9IDB4MDA7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs1XSA9IDB4MDA7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs2XSA9IChzaXplID4+IDI0KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs3XSA9IChzaXplID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs4XSA9IChzaXplID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzldID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDEyNSkgewotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gfD0gMTI2OwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMl0gPSAoc2l6ZSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVszXSA9IHNpemUgJiAweGZmOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gfD0gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChrVXNlTWFzaykgewotICAgICAgICAgICAgdWludDMyX3QgbWFzayA9IHJhbmQoKTsKLQotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSA0XSA9IChtYXNrID4+IDI0KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDNdID0gKG1hc2sgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gMl0gPSAobWFzayA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDFdID0gbWFzayAmIDB4ZmY7Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgKHNpemVfdClzaXplOyArK2kpIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyArIGldID0KLSAgICAgICAgICAgICAgICAgICAgKChjb25zdCB1aW50OF90ICopZGF0YSlbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgIF4gKChtYXNrID4+ICg4ICogKDMgLSAoaSAlIDQpKSkpICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCkgKyBudW1IZWFkZXJCeXRlcywgZGF0YSwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKLSAgICB9Ci0KLSAgICBGcmFnbWVudCBmcmFnOwotCi0gICAgZnJhZy5tRmxhZ3MgPSAwOwotICAgIGlmICh0aW1lVmFsaWQpIHsKLSAgICAgICAgZnJhZy5tRmxhZ3MgPSBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQ7Ci0gICAgICAgIGZyYWcubVRpbWVVcyA9IHRpbWVVczsKLSAgICB9Ci0KLSAgICBmcmFnLm1CdWZmZXIgPSBidWZmZXI7Ci0KLSAgICBtT3V0RnJhZ21lbnRzLnB1c2hfYmFjayhmcmFnKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246Om5vdGlmeUVycm9yKAotICAgICAgICBib29sIHNlbmQsIHN0YXR1c190IGVyciwgY29uc3QgY2hhciAqZGV0YWlsKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0RXJyb3IpOwotICAgIG1zZy0+c2V0SW50MzIoInNlbmQiLCBzZW5kKTsKLSAgICBtc2ctPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgIG1zZy0+c2V0U3RyaW5nKCJkZXRhaWwiLCBkZXRhaWwpOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6bm90aWZ5KE5vdGlmaWNhdGlvblJlYXNvbiByZWFzb24pIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwgcmVhc29uKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQU5ldHdvcmtTZXNzaW9uOjpBTmV0d29ya1Nlc3Npb24oKQotICAgIDogbU5leHRTZXNzaW9uSUQoMSkgewotICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci19Ci0KLUFOZXR3b3JrU2Vzc2lvbjo6fkFOZXR3b3JrU2Vzc2lvbigpIHsKLSAgICBzdG9wKCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c3RhcnQoKSB7Ci0gICAgaWYgKG1UaHJlYWQgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaW50IHJlcyA9IHBpcGUobVBpcGVGZCk7Ci0gICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci0gICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgfQotCi0gICAgbVRocmVhZCA9IG5ldyBOZXR3b3JrVGhyZWFkKHRoaXMpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbVRocmVhZC0+cnVuKCJBTmV0d29ya1Nlc3Npb24iLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbVRocmVhZC5jbGVhcigpOwotCi0gICAgICAgIGNsb3NlKG1QaXBlRmRbMF0pOwotICAgICAgICBjbG9zZShtUGlwZUZkWzFdKTsKLSAgICAgICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpzdG9wKCkgewotICAgIGlmIChtVGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIG1UaHJlYWQtPnJlcXVlc3RFeGl0KCk7Ci0gICAgaW50ZXJydXB0KCk7Ci0gICAgbVRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci0KLSAgICBtVGhyZWFkLmNsZWFyKCk7Ci0KLSAgICBjbG9zZShtUGlwZUZkWzBdKTsKLSAgICBjbG9zZShtUGlwZUZkWzFdKTsKLSAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVJUU1BDbGllbnQoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVJUU1BDbGllbnQsCi0gICAgICAgICAgICBOVUxMIC8qIGFkZHIgKi8sCi0gICAgICAgICAgICAwIC8qIHBvcnQgKi8sCi0gICAgICAgICAgICBob3N0LAotICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlUlRTUFNlcnZlcigKLSAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIsCi0gICAgICAgICAgICAmYWRkciwKLSAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICBOVUxMIC8qIHJlbW90ZUhvc3QgKi8sCi0gICAgICAgICAgICAwIC8qIHJlbW90ZVBvcnQgKi8sCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVVRFBTZXNzaW9uKGxvY2FsUG9ydCwgTlVMTCwgMCwgbm90aWZ5LCBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbiwKLSAgICAgICAgICAgIE5VTEwgLyogYWRkciAqLywKLSAgICAgICAgICAgIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICByZW1vdGVQb3J0LAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlLAotICAgICAgICAgICAgJmFkZHIsCi0gICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgTlVMTCAvKiByZW1vdGVIb3N0ICovLAotICAgICAgICAgICAgMCAvKiByZW1vdGVQb3J0ICovLAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlLAotICAgICAgICAgICAgTlVMTCAvKiBhZGRyICovLAotICAgICAgICAgICAgbG9jYWxQb3J0LAotICAgICAgICAgICAgcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmRlc3Ryb3lTZXNzaW9uKGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBtU2Vzc2lvbnMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0KLSAgICBpbnRlcnJ1cHQoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246Ok1ha2VTb2NrZXROb25CbG9ja2luZyhpbnQgcykgewotICAgIGludCBmbGFncyA9IGZjbnRsKHMsIEZfR0VURkwsIDApOwotICAgIGlmIChmbGFncyA8IDApIHsKLSAgICAgICAgZmxhZ3MgPSAwOwotICAgIH0KLQotICAgIGludCByZXMgPSBmY250bChzLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spOwotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICBNb2RlIG1vZGUsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICpsb2NhbEFkZHIsCi0gICAgICAgIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgKnNlc3Npb25JRCA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgaW50IHMsIHJlczsKLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uOwotCi0gICAgcyA9IHNvY2tldCgKLSAgICAgICAgICAgIEFGX0lORVQsCi0gICAgICAgICAgICAobW9kZSA9PSBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pID8gU09DS19ER1JBTSA6IFNPQ0tfU1RSRUFNLAotICAgICAgICAgICAgMCk7Ci0KLSAgICBpZiAocyA8IDApIHsKLSAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQU2VydmVyCi0gICAgICAgICAgICB8fCBtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSkgewotICAgICAgICBjb25zdCBpbnQgeWVzID0gMTsKLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIHNpemVvZih5ZXMpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlVURQU2Vzc2lvbikgewotICAgICAgICBpbnQgc2l6ZSA9IDI1NiAqIDEwMjQ7Ci0KLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZzaXplLCBzaXplb2Yoc2l6ZSkpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19TTkRCVUYsICZzaXplLCBzaXplb2Yoc2l6ZSkpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlKSB7Ci0gICAgICAgIGludCBmbGFnID0gMTsKLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZmbGFnLCBzaXplb2YoZmxhZykpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHRvcyA9IDIyNDsgIC8vIFZPSUNFCi0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgSVBQUk9UT19JUCwgSVBfVE9TLCAmdG9zLCBzaXplb2YodG9zKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBNYWtlU29ja2V0Tm9uQmxvY2tpbmcocyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgfQotCi0gICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Ci0gICAgbWVtc2V0KGFkZHIuc2luX3plcm8sIDAsIHNpemVvZihhZGRyLnNpbl96ZXJvKSk7Ci0gICAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUENsaWVudAotICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqZW50PSBnZXRob3N0YnluYW1lKHJlbW90ZUhvc3QpOwotICAgICAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGVyciA9IC1oX2Vycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gKihpbl9hZGRyX3QgKillbnQtPmhfYWRkcjsKLSAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQpOwotICAgIH0gZWxzZSBpZiAobG9jYWxBZGRyICE9IE5VTEwpIHsKLSAgICAgICAgYWRkci5zaW5fYWRkciA9ICpsb2NhbEFkZHI7Ci0gICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwotICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0gICAgfQotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQQ2xpZW50Ci0gICAgICAgICAgICB8fCBtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlKSB7Ci0gICAgICAgIGluX2FkZHJfdCB4ID0gbnRvaGwoYWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICBBTE9HSSgiY29ubmVjdGluZyBzb2NrZXQgJWQgdG8gJWQuJWQuJWQuJWQ6JWQiLAotICAgICAgICAgICAgICBzLAotICAgICAgICAgICAgICAoeCA+PiAyNCksCi0gICAgICAgICAgICAgICh4ID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICh4ID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgeCAmIDB4ZmYsCi0gICAgICAgICAgICAgIG50b2hzKGFkZHIuc2luX3BvcnQpKTsKLQotICAgICAgICByZXMgPSBjb25uZWN0KHMsIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKLQotICAgICAgICBDSEVDS19MVChyZXMsIDApOwotICAgICAgICBpZiAoZXJybm8gPT0gRUlOUFJPR1JFU1MpIHsKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBiaW5kKHMsIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKLQotICAgICAgICBpZiAocmVzID09IDApIHsKLSAgICAgICAgICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUFNlcnZlcgotICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSkgewotICAgICAgICAgICAgICAgIHJlcyA9IGxpc3RlbihzLCA0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobW9kZSwga01vZGVDcmVhdGVVRFBTZXNzaW9uKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZW1vdGVIb3N0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldChyZW1vdGVBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YocmVtb3RlQWRkci5zaW5femVybykpOwotICAgICAgICAgICAgICAgICAgICByZW1vdGVBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgICAgICAgICAgICAgICAgICByZW1vdGVBZGRyLnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlUG9ydCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhvc3RlbnQgKmVudD0gZ2V0aG9zdGJ5bmFtZShyZW1vdGVIb3N0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAtaF9lcnJubzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkciA9ICooaW5fYWRkcl90ICopZW50LT5oX2FkZHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzID0gY29ubmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlQWRkcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgZ290byBiYWlsMjsKLSAgICB9Ci0KLSAgICBTZXNzaW9uOjpTdGF0ZSBzdGF0ZTsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgY2FzZSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQ6Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkNPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlOgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpDT05ORUNUSU5HOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmU6Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkxJU1RFTklOR19UQ1BfREdSQU1TOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXI6Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkxJU1RFTklOR19SVFNQOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIENIRUNLX0VRKG1vZGUsIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbik7Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkRBVEFHUkFNOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc2Vzc2lvbiA9IG5ldyBTZXNzaW9uKAotICAgICAgICAgICAgbU5leHRTZXNzaW9uSUQrKywKLSAgICAgICAgICAgIHN0YXRlLAotICAgICAgICAgICAgcywKLSAgICAgICAgICAgIG5vdGlmeSk7Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBzZXNzaW9uLT5zZXRNb2RlKFNlc3Npb246Ok1PREVfREFUQUdSQU0pOwotICAgIH0gZWxzZSBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQpIHsKLSAgICAgICAgc2Vzc2lvbi0+c2V0TW9kZShTZXNzaW9uOjpNT0RFX1JUU1ApOwotICAgIH0KLQotICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbi0+c2Vzc2lvbklEKCksIHNlc3Npb24pOwotCi0gICAgaW50ZXJydXB0KCk7Ci0KLSAgICAqc2Vzc2lvbklEID0gc2Vzc2lvbi0+c2Vzc2lvbklEKCk7Ci0KLSAgICBnb3RvIGJhaWw7Ci0KLWJhaWwyOgotICAgIGNsb3NlKHMpOwotICAgIHMgPSAtMTsKLQotYmFpbDoKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNvbm5lY3RVRFBTZXNzaW9uKAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwgdW5zaWduZWQgcmVtb3RlUG9ydCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgY29uc3Qgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGluZGV4KTsKLSAgICBpbnQgcyA9IHNlc3Npb24tPnNvY2tldCgpOwotCi0gICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgbWVtc2V0KHJlbW90ZUFkZHIuc2luX3plcm8sIDAsIHNpemVvZihyZW1vdGVBZGRyLnNpbl96ZXJvKSk7Ci0gICAgcmVtb3RlQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICByZW1vdGVBZGRyLnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlUG9ydCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqZW50ID0gZ2V0aG9zdGJ5bmFtZShyZW1vdGVIb3N0KTsKLSAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgZXJyID0gLWhfZXJybm87Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOwotCi0gICAgICAgIGludCByZXMgPSBjb25uZWN0KAotICAgICAgICAgICAgICAgIHMsCi0gICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLAotICAgICAgICAgICAgICAgIHNpemVvZihyZW1vdGVBZGRyKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c2VuZFJlcXVlc3QoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCB2b2lkICpkYXRhLCBzc2l6ZV90IHNpemUsCi0gICAgICAgIGJvb2wgdGltZVZhbGlkLCBpbnQ2NF90IHRpbWVVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgY29uc3Qgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGluZGV4KTsKLQotICAgIHN0YXR1c190IGVyciA9IHNlc3Npb24tPnNlbmRSZXF1ZXN0KGRhdGEsIHNpemUsIHRpbWVWYWxpZCwgdGltZVVzKTsKLQotICAgIGludGVycnVwdCgpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpzd2l0Y2hUb1dlYlNvY2tldE1vZGUoaW50MzJfdCBzZXNzaW9uSUQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIHNlc3Npb24tPnN3aXRjaFRvV2ViU29ja2V0TW9kZSgpOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6aW50ZXJydXB0KCkgewotICAgIHN0YXRpYyBjb25zdCBjaGFyIGR1bW15ID0gMDsKLQotICAgIHNzaXplX3QgbjsKLSAgICBkbyB7Ci0gICAgICAgIG4gPSB3cml0ZShtUGlwZUZkWzFdLCAmZHVtbXksIDEpOwotICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICBBTE9HVygiRXJyb3Igd3JpdGluZyB0byBwaXBlICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OnRocmVhZExvb3AoKSB7Ci0gICAgZmRfc2V0IHJzLCB3czsKLSAgICBGRF9aRVJPKCZycyk7Ci0gICAgRkRfWkVSTygmd3MpOwotCi0gICAgRkRfU0VUKG1QaXBlRmRbMF0sICZycyk7Ci0gICAgaW50IG1heEZkID0gbVBpcGVGZFswXTsKLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9ucy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY29uc3Qgc3A8U2Vzc2lvbj4gJnNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpKTsKLQotICAgICAgICAgICAgaW50IHMgPSBzZXNzaW9uLT5zb2NrZXQoKTsKLQotICAgICAgICAgICAgaWYgKHMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT53YW50c1RvUmVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgRkRfU0VUKHMsICZycyk7Ci0gICAgICAgICAgICAgICAgaWYgKHMgPiBtYXhGZCkgewotICAgICAgICAgICAgICAgICAgICBtYXhGZCA9IHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+d2FudHNUb1dyaXRlKCkpIHsKLSAgICAgICAgICAgICAgICBGRF9TRVQocywgJndzKTsKLSAgICAgICAgICAgICAgICBpZiAocyA+IG1heEZkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heEZkID0gczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgcmVzID0gc2VsZWN0KG1heEZkICsgMSwgJnJzLCAmd3MsIE5VTEwsIE5VTEwgLyogdHYgKi8pOwotCi0gICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dFKCJzZWxlY3QgZmFpbGVkIHcvIGVycm9yICVkICglcykiLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChGRF9JU1NFVChtUGlwZUZkWzBdLCAmcnMpKSB7Ci0gICAgICAgIGNoYXIgYzsKLSAgICAgICAgc3NpemVfdCBuOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBuID0gcmVhZChtUGlwZUZkWzBdLCAmYywgMSk7Ci0gICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJFcnJvciByZWFkaW5nIGZyb20gcGlwZSAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC0tcmVzOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICAgICBMaXN0PHNwPFNlc3Npb24+ID4gc2Vzc2lvbnNUb0FkZDsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gbVNlc3Npb25zLnNpemUoKTsgcmVzID4gMCAmJiBpID4gMDspIHsKLSAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgIGNvbnN0IHNwPFNlc3Npb24+ICZzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgICAgIGludCBzID0gc2Vzc2lvbi0+c29ja2V0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzIDwgMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgJnJzKSB8fCBGRF9JU1NFVChzLCAmd3MpKSB7Ci0gICAgICAgICAgICAgICAgLS1yZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChzLCAmcnMpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24tPmlzUlRTUFNlcnZlcigpIHx8IHNlc3Npb24tPmlzVENQRGF0YWdyYW1TZXJ2ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPSBzaXplb2YocmVtb3RlQWRkcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFNvY2tldCA9IGFjY2VwdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCAoc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsICZyZW1vdGVBZGRyTGVuKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50U29ja2V0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE1ha2VTb2NrZXROb25CbG9ja2luZyhjbGllbnRTb2NrZXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBtYWtlIGNsaWVudCBzb2NrZXQgbm9uIGJsb2NraW5nLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGNsaWVudFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCBhZGRyID0gbnRvaGwocmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koImluY29taW5nIGNvbm5lY3Rpb24gZnJvbSAlZC4lZC4lZC4lZDolZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzb2NrZXQgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkciA+PiAyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkciA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMocmVtb3RlQWRkci5zaW5fcG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFNlc3Npb24+IGNsaWVudFNlc3Npb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2Vzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFNlc3Npb25JRCsrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb246OkNPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Z2V0Tm90aWZpY2F0aW9uTWVzc2FnZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNlc3Npb24tPnNldE1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5pc1JUU1BTZXJ2ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU2Vzc2lvbjo6TU9ERV9SVFNQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZXNzaW9uOjpNT0RFX0RBVEFHUkFNKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zVG9BZGQucHVzaF9iYWNrKGNsaWVudFNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImFjY2VwdCByZXR1cm5lZCBlcnJvciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2Vzc2lvbi0+cmVhZE1vcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInJlYWRNb3JlIG9uIHNvY2tldCAlZCBmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZ3cykpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXNzaW9uLT53cml0ZU1vcmUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ3cml0ZU1vcmUgb24gc29ja2V0ICVkIGZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcywgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFzZXNzaW9uc1RvQWRkLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSAqc2Vzc2lvbnNUb0FkZC5iZWdpbigpOwotICAgICAgICAgICAgc2Vzc2lvbnNUb0FkZC5lcmFzZShzZXNzaW9uc1RvQWRkLmJlZ2luKCkpOwotCi0gICAgICAgICAgICBtU2Vzc2lvbnMuYWRkKHNlc3Npb24tPnNlc3Npb25JRCgpLCBzZXNzaW9uKTsKLQotICAgICAgICAgICAgQUxPR0koImFkZGVkIGNsaWVudFNlc3Npb24gJWQiLCBzZXNzaW9uLT5zZXNzaW9uSUQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggMjljZjFlZC4uNTMzY2Q3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtNCw4ICs0LDggQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogfQogCi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fZGVmYXVsdHMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLApAQCAtMjUsNiArMjUsNyBAQAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIApAQCAtNTYsMTggKzU3LDIyIEBACiAgICAgICAgICJBQnVmZmVyLmNwcCIsCiAgICAgICAgICJBRGVidWcuY3BwIiwKICAgICAgICAgIkFIYW5kbGVyLmNwcCIsCi0gICAgICAgICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCIsCiAgICAgICAgICJBTG9vcGVyLmNwcCIsCiAgICAgICAgICJBTG9vcGVyUm9zdGVyLmNwcCIsCiAgICAgICAgICJBTWVzc2FnZS5jcHAiLAotICAgICAgICAiQU5ldHdvcmtTZXNzaW9uLmNwcCIsCiAgICAgICAgICJBU3RyaW5nLmNwcCIsCiAgICAgICAgICJBU3RyaW5nVXRpbHMuY3BwIiwKKyAgICAgICAgIkF1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAiLAogICAgICAgICAiQnl0ZVV0aWxzLmNwcCIsCiAgICAgICAgICJDb2xvclV0aWxzLmNwcCIsCisgICAgICAgICJNZWRpYUJ1ZmZlci5jcHAiLAorICAgICAgICAiTWVkaWFCdWZmZXJCYXNlLmNwcCIsCisgICAgICAgICJNZWRpYUJ1ZmZlckdyb3VwLmNwcCIsCiAgICAgICAgICJNZWRpYURlZnMuY3BwIiwKICAgICAgICAgIk1lZGlhS2V5cy5jcHAiLAotICAgICAgICAiUGFyc2VkTWVzc2FnZS5jcHAiLAorICAgICAgICAiTWV0YURhdGEuY3BwIiwKKyAgICAgICAgIk1ldGFEYXRhQmFzZS5jcHAiLAorICAgICAgICAiT3B1c0hlYWRlci5jcHAiLAogICAgICAgICAiYXZjX3V0aWxzLmNwcCIsCiAgICAgICAgICJiYXNlNjQuY3BwIiwKICAgICAgICAgImhleGR1bXAuY3BwIiwKQEAgLTgzLDMgKzg4LDIwIEBACiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2RlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLUROT19JTUVNT1JZIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOGU5NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBdWRpb1ByZXNlbnRhdGlvbkluZm8iCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiYgcHJlc2VudGF0aW9ucywKKyAgICAgICAgc3RkOjpvc3RyZWFtKiBzZXJpYWxpemVkT3V0cHV0KSB7CisgICAgdWludDMyX3QgbnVtUHJlc2VudGF0aW9ucyA9IHByZXNlbnRhdGlvbnMuc2l6ZSgpOworICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZudW1QcmVzZW50YXRpb25zKSwgc2l6ZW9mKG51bVByZXNlbnRhdGlvbnMpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFwIDogcHJlc2VudGF0aW9ucykgeworICAgICAgICBpZiAoYXAubVZlcnNpb24gPT0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMSkgeworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tVmVyc2lvbikpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVZlcnNpb24pKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVByZXNlbnRhdGlvbklkKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tUHJlc2VudGF0aW9uSWQpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVByb2dyYW1JZCkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVByb2dyYW1JZCkpOworCisgICAgICAgICAgICB1aW50MzJfdCBudW1MYWJlbHMgPSBhcC5tTGFiZWxzLnNpemUoKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmbnVtTGFiZWxzKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1MYWJlbHMpKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgbGFiZWwgOiBhcC5tTGFiZWxzKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxLZXlTaXplID0gbGFiZWwuZmlyc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmxhYmVsS2V5U2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhYmVsS2V5U2l6ZSkpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKGxhYmVsLmZpcnN0LmNfc3RyKCksIGxhYmVsS2V5U2l6ZSk7CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbFZhbFNpemUgPSBsYWJlbC5zZWNvbmQuc2l6ZSgpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmxhYmVsVmFsU2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhYmVsVmFsU2l6ZSkpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKGxhYmVsLnNlY29uZC5jX3N0cigpLCBsYWJlbFZhbFNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBsYW5nU2l6ZSA9IGFwLm1MYW5ndWFnZS5zaXplKCk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmxhbmdTaXplKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYW5nU2l6ZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoYXAubUxhbmd1YWdlLmNfc3RyKCksIGxhbmdTaXplKTsKKworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbikpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubU1hc3RlcmluZ0luZGljYXRpb24pKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHN0ZDo6aXN0cmVhbSogc2VyaWFsaXplZElucHV0LAorICAgICAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpIHsKKyAgICB1aW50MzJfdCBudW1QcmVzZW50YXRpb25zOworICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtUHJlc2VudGF0aW9ucyksIHNpemVvZihudW1QcmVzZW50YXRpb25zKSk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bVByZXNlbnRhdGlvbnM7ICsraSkgeworICAgICAgICB1aW50MzJfdCB2ZXJzaW9uOworICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnZlcnNpb24pLCBzaXplb2YodmVyc2lvbikpOworICAgICAgICBpZiAodmVyc2lvbiA9PSBQUkVTRU5UQVRJT05fVkVSU0lPTl8xKSB7CisgICAgICAgICAgICBBdWRpb1ByZXNlbnRhdGlvblYxIGFwOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKAorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubVByZXNlbnRhdGlvbklkKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1QcmVzZW50YXRpb25JZCkpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tUHJvZ3JhbUlkKSwgc2l6ZW9mKGFwLm1Qcm9ncmFtSWQpKTsKKworICAgICAgICAgICAgdWludDMyX3QgbnVtTGFiZWxzOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZudW1MYWJlbHMpLCBzaXplb2YobnVtTGFiZWxzKSk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbnVtTGFiZWxzOyArK2opIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbEtleVNpemU7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZsYWJlbEtleVNpemUpLCBzaXplb2YobGFiZWxLZXlTaXplKSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbGFiZWxLZXkobGFiZWxLZXlTaXplKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQobGFiZWxLZXkuZGF0YSgpLCBsYWJlbEtleVNpemUpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxWYWxTaXplOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbGFiZWxWYWxTaXplKSwgc2l6ZW9mKGxhYmVsVmFsU2l6ZSkpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGxhYmVsVmFsKGxhYmVsVmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKGxhYmVsVmFsLmRhdGEoKSwgbGFiZWxWYWxTaXplKTsKKyAgICAgICAgICAgICAgICBhcC5tTGFiZWxzLmVtcGxhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNoYXIqPihsYWJlbEtleS5kYXRhKCkpLCBsYWJlbEtleVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obGFiZWxWYWwuZGF0YSgpKSwgbGFiZWxWYWxTaXplKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBsYW5ndWFnZVNpemU7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmxhbmd1YWdlU2l6ZSksIHNpemVvZihsYW5ndWFnZVNpemUpKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGxhbmd1YWdlKGxhbmd1YWdlU2l6ZSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQobGFuZ3VhZ2UuZGF0YSgpLCBsYW5ndWFnZVNpemUpOworICAgICAgICAgICAgYXAubUxhbmd1YWdlID0gc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obGFuZ3VhZ2UuZGF0YSgpKSwgbGFuZ3VhZ2VTaXplKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubU1hc3RlcmluZ0luZGljYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSkpOworICAgICAgICAgICAgcHJlc2VudGF0aW9ucy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShhcCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIHByZXNlbnRhdGlvbiBpbmZvIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCmluZGV4IGM0ZWFhMjcuLjA3MGUzMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzQyLDYgKzM0MywxNCBAQAogICAgIGFzcGVjdHMubVJhbmdlID0gZnVsbFJhbmdlID8gQ29sb3JBc3BlY3RzOjpSYW5nZUZ1bGwgOiBDb2xvckFzcGVjdHM6OlJhbmdlTGltaXRlZDsKIH0KIAordm9pZCBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IGludHJhbnNmZXIsIGludDMyX3QgY29lZmZzLCBib29sIGZ1bGxSYW5nZSwKKyAgICAgICAgaW50MzJfdCAqcmFuZ2UsIGludDMyX3QgKnN0YW5kYXJkLCBpbnQzMl90ICpvdXR0cmFuc2ZlcikgeworICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOworICAgIGNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhwcmltYXJpZXMsIGludHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKKyAgICBjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cyhhc3BlY3RzLCByYW5nZSwgc3RhbmRhcmQsIG91dHRyYW5zZmVyKTsKK30KKwogLy8gc3RhdGljCiBDb2xvckFzcGVjdHMgQ29sb3JVdGlsczo6dW5wYWNrVG9Db2xvckFzcGVjdHModWludDMyX3QgcGFja2VkKSB7CiAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CkBAIC02ODQsNiArNjkzLDEzIEBACiAgICAgICAgICAgICB0cmFuc2ZlciwgYXNTdHJpbmcoKENvbG9yVHJhbnNmZXIpdHJhbnNmZXIpKTsKIH0KIAorCisvLyBzdGF0aWMKK3ZvaWQgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoCisgICAgICAgIGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgc2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoaW5mbywgZm9ybWF0LT5tRm9ybWF0KTsKK30KKwogLy8gc3RhdGljCiB2b2lkIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KAogICAgICAgICBjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmVhYzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlci5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBzdGF0aWMgKi8KK3N0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgTWVkaWFCdWZmZXI6Om1Vc2VTaGFyZWRNZW1vcnkoMCk7CisKK01lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG1PYnNlcnZlcihOVUxMKSwKKyAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgIG1EYXRhKGRhdGEpLAorICAgICAgbVNpemUoc2l6ZSksCisgICAgICBtUmFuZ2VPZmZzZXQoMCksCisgICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCisgICAgICBtT3duc0RhdGEoZmFsc2UpLAorICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpIHsKK30KKworTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHNpemVfdCBzaXplKQorICAgIDogbU9ic2VydmVyKE5VTEwpLAorICAgICAgbVJlZkNvdW50KDApLAorICAgICAgbURhdGEoTlVMTCksCisgICAgICBtU2l6ZShzaXplKSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKKyAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKKyAgICAgIG1Pd25zRGF0YSh0cnVlKSwKKyAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSB7CisjaWZuZGVmIE5PX0lNRU1PUlkKKyAgICBpZiAoc2l6ZSA8IGtTaGFyZWRNZW1UaHJlc2hvbGQKKyAgICAgICAgICAgIHx8IHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJm1Vc2VTaGFyZWRNZW1vcnksIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpID09IDApIHsKKyNlbmRpZgorICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJjcmVhdGluZyBtZW1vcnlEZWFsZXIiKTsKKyAgICAgICAgc2l6ZV90IG5ld1NpemUgPSAwOworICAgICAgICBpZiAoIV9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coc2l6ZSwgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCAmbmV3U2l6ZSkpIHsKKyAgICAgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihuZXdTaXplLCAiTWVkaWFCdWZmZXIiKTsKKyAgICAgICAgICAgIG1NZW1vcnkgPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKG5ld1NpemUpOworICAgICAgICB9CisgICAgICAgIGlmIChtTWVtb3J5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSwgdHJ5aW5nIHJlZ3VsYXIgYWxsb2NhdGlvbiEiKTsKKyAgICAgICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOworICAgICAgICAgICAgaWYgKG1EYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiT3V0IG9mIG1lbW9yeSIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOworICAgICAgICAgICAgbURhdGEgPSAodWludDhfdCAqKW1NZW1vcnktPnBvaW50ZXIoKSArIHNpemVvZihTaGFyZWRDb250cm9sKTsKKyAgICAgICAgICAgIEFMT0dWKCJBbGxvY2F0ZWQgc2hhcmVkIG1lbSBidWZmZXIgb2Ygc2l6ZSAlenUgQCAlcCIsIHNpemUsIG1EYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfQorCitNZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICA6IG1PYnNlcnZlcihOVUxMKSwKKyAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgIG1EYXRhKGJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgIG1TaXplKGJ1ZmZlci0+c2l6ZSgpKSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKKyAgICAgIG1SYW5nZUxlbmd0aChtU2l6ZSksCisgICAgICBtQnVmZmVyKGJ1ZmZlciksCisgICAgICBtT3duc0RhdGEoZmFsc2UpLAorICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpIHsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6cmVsZWFzZSgpIHsKKyAgICBpZiAobU9ic2VydmVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gTGVnYWN5IGNvbnRyYWN0IGZvciBNZWRpYUJ1ZmZlciB3aXRob3V0IGEgTWVkaWFCdWZmZXJHcm91cC4KKyAgICAgICAgQ0hFQ0tfRVEobVJlZkNvdW50LCAwKTsKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgcHJldkNvdW50ID0gbVJlZkNvdW50LmZldGNoX3N1YigxKTsKKyAgICBpZiAocHJldkNvdW50ID09IDEpIHsKKyAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGUgdGhpczsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1PYnNlcnZlci0+c2lnbmFsQnVmZmVyUmV0dXJuZWQodGhpcyk7CisgICAgfQorICAgIENIRUNLKHByZXZDb3VudCA+IDApOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpjbGFpbSgpIHsKKyAgICBDSEVDSyhtT2JzZXJ2ZXIgIT0gTlVMTCk7CisgICAgQ0hFQ0tfRVEobVJlZkNvdW50LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCksIDEpOworCisgICAgbVJlZkNvdW50LnN0b3JlKDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjphZGRfcmVmKCkgeworICAgICh2b2lkKSBtUmVmQ291bnQuZmV0Y2hfYWRkKDEpOworfQorCit2b2lkICpNZWRpYUJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlcjo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlcjo6cmFuZ2Vfb2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBtUmFuZ2VPZmZzZXQ7Cit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlcjo6cmFuZ2VfbGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBtUmFuZ2VMZW5ndGg7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSB7CisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IG1TaXplKSB7CisgICAgICAgIEFMT0dFKCJvZmZzZXQgPSAlenUsIGxlbmd0aCA9ICV6dSwgbVNpemUgPSAlenUiLCBvZmZzZXQsIGxlbmd0aCwgbVNpemUpOworICAgIH0KKyAgICBDSEVDSyhvZmZzZXQgKyBsZW5ndGggPD0gbVNpemUpOworCisgICAgbVJhbmdlT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1SYW5nZUxlbmd0aCA9IGxlbmd0aDsKK30KKworTWV0YURhdGFCYXNlJiBNZWRpYUJ1ZmZlcjo6bWV0YV9kYXRhKCkgeworICAgIHJldHVybiAqbU1ldGFEYXRhOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpyZXNldCgpIHsKKyAgICBtTWV0YURhdGEtPmNsZWFyKCk7CisgICAgc2V0X3JhbmdlKDAsIG1TaXplKTsKK30KKworTWVkaWFCdWZmZXI6On5NZWRpYUJ1ZmZlcigpIHsKKyAgICBDSEVDSyhtT2JzZXJ2ZXIgPT0gTlVMTCk7CisKKyAgICBpZiAobU93bnNEYXRhICYmIG1EYXRhICE9IE5VTEwgJiYgbU1lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICBtRGF0YSA9IE5VTEw7CisgICAgfQorCisgICBpZiAobU1lbW9yeS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5zZXREZWFkT2JqZWN0KCk7CisgICB9CisgICBkZWxldGUgbU1ldGFEYXRhOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpvYnNlcnZlcikgeworICAgIENIRUNLKG9ic2VydmVyID09IE5VTEwgfHwgbU9ic2VydmVyID09IE5VTEwpOworICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJCYXNlLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyR3JvdXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckdyb3VwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGZmOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckdyb3VwLmNwcApAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXJHcm91cCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RkOjptaW4gaXMgbm90IGNvbnN0ZXhwciBpbiBDKysxMQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0ZXhwciBUIE1JTihjb25zdCBUICZhLCBjb25zdCBUICZiKSB7IHJldHVybiBhIDw9IGIgPyBhIDogYjsgfQorCisvLyBNZWRpYUJ1ZmZlckdyb3VwIG1heSBjcmVhdGUgc2hhcmVkIG1lbW9yeSBidWZmZXJzIGF0IGEKKy8vIHNtYWxsZXIgdGhyZXNob2xkIHRoYW4gYW4gaXNvbGF0ZWQgbmV3IE1lZGlhQnVmZmVyLgorc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtb3J5VGhyZXNob2xkID0gTUlOKAorICAgICAgICAoc2l6ZV90KU1lZGlhQnVmZmVyOjprU2hhcmVkTWVtVGhyZXNob2xkLCAoc2l6ZV90KSg0ICogMTAyNCkpOworCitzdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDo6SW50ZXJuYWxEYXRhIHsKKyAgICBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKKyAgICBzaXplX3QgbUdyb3d0aExpbWl0OyAgLy8gRG8gbm90IGF1dG9tYXRpY2FsbHkgZ3JvdyBncm91cCBsYXJnZXIgdGhhbiB0aGlzLgorICAgIHN0ZDo6bGlzdDxNZWRpYUJ1ZmZlckJhc2UgKj4gbUJ1ZmZlcnM7Cit9OworCitNZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCkKKyAgICA6IG1XcmFwcGVyKG51bGxwdHIpLCBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7CisgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKK30KKworTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpCisgICAgOiBtV3JhcHBlcihudWxscHRyKSwgbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgeworICAgIGluaXQoYnVmZmVycywgYnVmZmVyX3NpemUsIGdyb3d0aExpbWl0KTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjppbml0KHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkgeworICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7CisKKyAgICBpZiAobUludGVybmFsLT5tR3Jvd3RoTGltaXQgPiAwICYmIGJ1ZmZlcnMgPiBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkgeworICAgICAgICBBTE9HVygiUHJlYWxsb2NhdGVkIGJ1ZmZlcnMgJXp1ID4gZ3Jvd3RoTGltaXQgJXp1LCBpbmNyZWFzaW5nIGdyb3d0aExpbWl0IiwKKyAgICAgICAgICAgICAgICBidWZmZXJzLCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCk7CisgICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gYnVmZmVyczsKKyAgICB9CisKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgIGlmIChidWZmZXJfc2l6ZSA+PSBrU2hhcmVkTWVtb3J5VGhyZXNob2xkKSB7CisgICAgICAgIEFMT0dEKCJjcmVhdGluZyBNZW1vcnlEZWFsZXIiKTsKKyAgICAgICAgLy8gVXNpbmcgYSBzaW5nbGUgTWVtb3J5RGVhbGVyIGlzIGVmZmljaWVudCBmb3IgYSBncm91cCBvZiBzaGFyZWQgbWVtb3J5IG9iamVjdHMuCisgICAgICAgIC8vIFRoaXMgbG9vcCBndWFyYW50ZWVzIHRoYXQgd2UgdXNlIHNoYXJlZCBtZW1vcnkgKG5vIGZhbGxiYWNrIHRvIG1hbGxvYykuCisKKyAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpOworICAgICAgICBzaXplX3QgYXVnbWVudGVkX3NpemUgPSBidWZmZXJfc2l6ZSArIHNpemVvZihNZWRpYUJ1ZmZlcjo6U2hhcmVkQ29udHJvbCk7CisgICAgICAgIHNpemVfdCB0b3RhbCA9IChhdWdtZW50ZWRfc2l6ZSArIGFsaWdubWVudCAtIDEpIC8gYWxpZ25tZW50ICogYWxpZ25tZW50ICogYnVmZmVyczsKKyAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKHRvdGFsLCAiTWVkaWFCdWZmZXJHcm91cCIpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKGF1Z21lbnRlZF9zaXplKTsKKyAgICAgICAgICAgIGlmIChtZW0uZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW0tPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk9ubHkgYWxsb2NhdGVkICV6dSBzaGFyZWQgYnVmZmVycyBvZiBzaXplICV6dSIsIGksIGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobWVtKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+Z2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOworICAgICAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZWxzZQorICAgICh2b2lkKWtTaGFyZWRNZW1vcnlUaHJlc2hvbGQ7CisjZW5kaWYKKworICAgIC8vIE5vbi1zaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24uCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzOyArK2kpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXJfc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBkZWxldGUgYnVmZmVyOyAvLyBkb24ndCBjYWxsIHJlbGVhc2UsIGl0J3Mgbm90IHByb3Blcmx5IGZvcm1lZAorICAgICAgICAgICAgQUxPR1coIk9ubHkgYWxsb2NhdGVkICV6dSBtYWxsb2MgYnVmZmVycyBvZiBzaXplICV6dSIsIGksIGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGFkZF9idWZmZXIoYnVmZmVyKTsKKyAgICB9Cit9CisKK01lZGlhQnVmZmVyR3JvdXA6On5NZWRpYUJ1ZmZlckdyb3VwKCkgeworICAgIGZvciAoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgOiBtSW50ZXJuYWwtPm1CdWZmZXJzKSB7CisgICAgICAgIGlmIChidWZmZXItPnJlZmNvdW50KCkgIT0gMCkgeworICAgICAgICAgICAgY29uc3QgaW50IGxvY2FsUmVmY291bnQgPSBidWZmZXItPmxvY2FsUmVmY291bnQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCByZW1vdGVSZWZjb3VudCA9IGJ1ZmZlci0+cmVtb3RlUmVmY291bnQoKTsKKworICAgICAgICAgICAgLy8gRmF0YWwgaWYgd2UgaGF2ZSBhIGxvY2FsIHJlZmNvdW50LgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihsb2NhbFJlZmNvdW50ICE9IDAsCisgICAgICAgICAgICAgICAgICAgICJidWZmZXIoJXApIGxvY2FsUmVmY291bnQgJWQgIT0gMCwgcmVtb3RlUmVmY291bnQgJWQiLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGxvY2FsUmVmY291bnQsIHJlbW90ZVJlZmNvdW50KTsKKworICAgICAgICAgICAgLy8gTG9nIGFuIGVycm9yIGlmIHdlIGhhdmUgYSByZW1haW5pbmcgcmVtb3RlIHJlZmNvdW50LAorICAgICAgICAgICAgLy8gYXMgdGhlIHJlbW90ZSBwcm9jZXNzIG1heSBoYXZlIGRpZWQgb3IgbWF5IGhhdmUgaW5hcHByb3ByaWF0ZSBiZWhhdmlvci4KKyAgICAgICAgICAgIC8vIFRoZSBzaGFyZWQgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgTWVkaWFCdWZmZXIgd2lsbAorICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBiZSByZWNsYWltZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGZkcworICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGl0LgorICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciglcCkgaGFzIHJlc2lkdWFsIHJlbW90ZVJlZmNvdW50ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCByZW1vdGVSZWZjb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZ3JhY2VmdWxseSBkZWxldGUuCisgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7CisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgIH0KKyAgICBkZWxldGUgbUludGVybmFsOworICAgIGRlbGV0ZSBtV3JhcHBlcjsKK30KKwordm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjphZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOworCisgICAgLy8gaWYgd2UncmUgYWJvdmUgb3VyIGdyb3d0aCBsaW1pdCwgcmVsZWFzZSBidWZmZXJzIGlmIHdlIGNhbgorICAgIGZvciAoYXV0byBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID4gMAorICAgICAgICAgICAgJiYgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPj0gbUludGVybmFsLT5tR3Jvd3RoTGltaXQKKyAgICAgICAgICAgICYmIGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAoKml0KS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7CisgICAgICAgICAgICAoKml0KS0+cmVsZWFzZSgpOworICAgICAgICAgICAgaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOworICAgIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7Cit9CisKK2Jvb2wgTWVkaWFCdWZmZXJHcm91cDo6aGFzX2J1ZmZlcnMoKSB7CisgICAgaWYgKG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpIDwgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGNhbiBhZGQgbW9yZSBidWZmZXJzIGludGVybmFsbHkuCisgICAgfQorICAgIGZvciAoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgOiBtSW50ZXJuYWwtPm1CdWZmZXJzKSB7CisgICAgICAgIGlmIChidWZmZXItPnJlZmNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBNZWRpYUJ1ZmZlckdyb3VwOjphY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBib29sIG5vbkJsb2NraW5nLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHNpemVfdCBzbWFsbGVzdCA9IHJlcXVlc3RlZFNpemU7CisgICAgICAgIHNpemVfdCBiaWdnZXN0ID0gcmVxdWVzdGVkU2l6ZTsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBudWxscHRyOworICAgICAgICBhdXRvIGZyZWUgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gKCppdCktPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID4gYmlnZ2VzdCkgeworICAgICAgICAgICAgICAgIGJpZ2dlc3QgPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSByZXF1ZXN0ZWRTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9ICppdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzaXplIDwgc21hbGxlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc21hbGxlc3QgPSBzaXplOyAvLyBhbHdheXMgZnJlZSB0aGUgc21hbGxlc3QgYnVmCisgICAgICAgICAgICAgICAgICAgIGZyZWUgPSBpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgJiYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKQorICAgICAgICAgICAgICAgICAgICB8fCBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSkgeworICAgICAgICAgICAgLy8gV2UgYWxsb2MgYmVmb3JlIHdlIGZyZWUgc28gZmFpbHVyZSBsZWF2ZXMgZ3JvdXAgdW5jaGFuZ2VkLgorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlU2l6ZSA9IHJlcXVlc3RlZFNpemUgPT0gMCA/IGJpZ2dlc3QgOgorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplIDwgU0laRV9NQVggLyAzICogMiAvKiBOQjogb3JkZXJpbmcgKi8gPworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplICogMyAvIDIgOiByZXF1ZXN0ZWRTaXplOworICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGFsbG9jYXRlU2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIHNpemUgJXp1IiwgYWxsb2NhdGVTaXplKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgYnVmZmVyOyAvLyBJbnZhbGlkIGFsbG9jLCBwcmVmZXIgbm90IHRvIGNhbGwgcmVsZWFzZS4KKyAgICAgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUgdnMgYXZhaWxhYmxlICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSwgKCpmcmVlKS0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgKmZyZWUgPSBidWZmZXI7IC8vIGluLXBsYWNlIHJlcGxhY2UKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUiLCByZXF1ZXN0ZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUludGVybmFsLT5tQnVmZmVycy5lbXBsYWNlX2JhY2soYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBidWZmZXItPmFkZF9yZWYoKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vbkJsb2NraW5nKSB7CisgICAgICAgICAgICAqb3V0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgfQorICAgICAgICAvLyBBbGwgYnVmZmVycyBhcmUgaW4gdXNlLCBibG9jayB1bnRpbCBvbmUgb2YgdGhlbSBpcyByZXR1cm5lZC4KKyAgICAgICAgbUludGVybmFsLT5tQ29uZGl0aW9uLndhaXQobUludGVybmFsLT5tTG9jayk7CisgICAgfQorICAgIC8vIE5ldmVyIGdldHMgaGVyZS4KK30KKworc2l6ZV90IE1lZGlhQnVmZmVyR3JvdXA6OmJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpOworfQorCit2b2lkIE1lZGlhQnVmZmVyR3JvdXA6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOworICAgIG1JbnRlcm5hbC0+bUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcAppbmRleCBlNWE4NWU5Li41MmIyNzY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCA9ICJ2aWRlby94LXZuZC5vbjIudnA4IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSA9ICJ2aWRlby94LXZuZC5vbjIudnA5IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSA9ICJ2aWRlby9hdjAxIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyA9ICJ2aWRlby9hdmMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyA9ICJ2aWRlby9oZXZjIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0ID0gInZpZGVvL21wNHYtZXMiOwpAQCAtMzEsNiArMzIsMTAgQEAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyA9ICJ2aWRlby9yYXciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OID0gInZpZGVvL2RvbGJ5LXZpc2lvbiI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19TQ1JBTUJMRUQgPSAidmlkZW8vc2NyYW1ibGVkIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlggPSAidmlkZW8vZGl2eCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYMyA9ICJ2aWRlby9kaXZ4MyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19YVklEID0gInZpZGVvL3h2aWQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUcgPSAidmlkZW8veC1tb3Rpb24tanBlZyI7CiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiA9ICJhdWRpby8zZ3BwIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA9ICJhdWRpby9hbXItd2IiOwpAQCAtNTAsMTIgKzU1LDE0IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSA9ICJhdWRpby9nc20iOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzID0gImF1ZGlvL2FjMyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzID0gImF1ZGlvL2VhYzMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0MgPSAiYXVkaW8vZWFjMy1qb2MiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0ID0gImF1ZGlvL2FjNCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQgPSAiYXVkaW8vc2NyYW1ibGVkIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMgPSAiYXVkaW8vYWxhYyI7CiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCA9ICJ2aWRlby9tcDQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBViA9ICJhdWRpby94LXdhdiI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHID0gImFwcGxpY2F0aW9uL29nZyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHID0gImF1ZGlvL29nZyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EgPSAidmlkZW8veC1tYXRyb3NrYSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyA9ICJ2aWRlby9tcDJ0cyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJID0gInZpZGVvL2F2aSI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZXRhRGF0YS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGEuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGFCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGFCYXNlLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YUJhc2UuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2I5Y2NmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmNwcApAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiT3B1c0hlYWRlciIKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJPcHVzSGVhZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gT3B1cyB1c2VzIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcsIGFuZCBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nIHNwZWNpZmllcworLy8gbWFwcGluZ3MgZm9yIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgVm9yYmlzIEkKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vd3d3LnhpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCitjb25zdGV4cHIgaW50IGtNYXhDaGFubmVscyA9IDg7CisKK2NvbnN0ZXhwciB1aW50OF90IGtPcHVzQ2hhbm5lbE1hcFtrTWF4Q2hhbm5lbHNdW2tNYXhDaGFubmVsc10gPSB7CisgICAgICAgIHswfSwKKyAgICAgICAgezAsIDF9LAorICAgICAgICB7MCwgMiwgMX0sCisgICAgICAgIHswLCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDN9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNX0sCisgICAgICAgIHswLCA0LCAxLCAyLCAzLCA1LCA2fSwKKyAgICAgICAgezAsIDYsIDEsIDIsIDMsIDQsIDUsIDd9LAorfTsKKworLy8gU2l6ZSBvZiB0aGUgT3B1cyBoZWFkZXIgZXhjbHVkaW5nIG9wdGlvbmFsIG1hcHBpbmcgaW5mb3JtYXRpb24uCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2l6ZSA9IDE5OworLy8gT2Zmc2V0IHRvIG1hZ2ljIHN0cmluZyB0aGF0IHN0YXJ0cyBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJMYWJlbE9mZnNldCA9IDA7CisvLyBPZmZzZXQgdG8gT3B1cyB2ZXJzaW9uIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJWZXJzaW9uT2Zmc2V0ID0gODsKKy8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBjb3VudCBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCA9IDk7CisvLyBPZmZzZXQgdG8gdGhlIHByZS1za2lwIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCA9IDEwOworLy8gT2Zmc2V0IHRvIHNhbXBsZSByYXRlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJTYW1wbGVSYXRlT2Zmc2V0ID0gMTI7CisvLyBPZmZzZXQgdG8gdGhlIGdhaW4gdmFsdWUgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlckdhaW5PZmZzZXQgPSAxNjsKKy8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBtYXBwaW5nIGJ5dGUgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0ID0gMTg7CisvLyBPcHVzIEhlYWRlciBjb250YWlucyBhIHN0cmVhbSBtYXAuIFRoZSBtYXBwaW5nIHZhbHVlcyBhcmUgaW4gdGhlIGhlYWRlcgorLy8gYmV5b25kIHRoZSBhbHdheXMgcHJlc2VudCB8a09wdXNIZWFkZXJTaXplfCBieXRlcyBvZiBkYXRhLiBUaGUgbWFwcGluZworLy8gZGF0YSBjb250YWlucyBzdHJlYW0gY291bnQsIGNvdXBsaW5nIGluZm9ybWF0aW9uLCBhbmQgcGVyIGNoYW5uZWwgbWFwcGluZworLy8gdmFsdWVzOgorLy8gICAtIEJ5dGUgMDogTnVtYmVyIG9mIHN0cmVhbXMuCisvLyAgIC0gQnl0ZSAxOiBOdW1iZXIgY291cGxlZC4KKy8vICAgLSBCeXRlIDI6IFN0YXJ0aW5nIGF0IGJ5dGUgMiBhcmUgfGhlYWRlci0+Y2hhbm5lbHN8IHVpbnQ4IG1hcHBpbmcKKy8vICAgICAgICAgICAgIHZhbHVlcy4KKy8vIE9mZnNldCB0byB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgPSAxOTsKKy8vIE9mZnNldCB0byB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgdGhhdCBhcmUgY291cGxlZCBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyTnVtQ291cGxlZFN0cmVhbXNPZmZzZXQgPSAyMDsKKy8vIE9mZnNldCB0byB0aGUgc3RyZWFtIHRvIGNoYW5uZWwgbWFwcGluZyBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ID0gMjE7CisKKy8vIERlZmF1bHQgYXVkaW8gb3V0cHV0IGNoYW5uZWwgbGF5b3V0LiBVc2VkIHRvIGluaXRpYWxpemUgfHN0cmVhbV9tYXB8IGluCisvLyBPcHVzSGVhZGVyLCBhbmQgcGFzc2VkIHRvIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoKSB3aGVuIHRoZSBoZWFkZXIKKy8vIGRvZXMgbm90IGNvbnRhaW4gbWFwcGluZyBpbmZvcm1hdGlvbi4gVGhlIHZhbHVlcyBhcmUgdmFsaWQgb25seSBmb3IgbW9ubyBhbmQKKy8vIHN0ZXJlbyBvdXRwdXQ6IE9wdXMgc3RyZWFtcyB3aXRoIG1vcmUgdGhhbiAyIGNoYW5uZWxzIHJlcXVpcmUgYSBzdHJlYW0gbWFwLgorY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCA9IDI7CisKK3N0YXRpYyB1aW50MTZfdCBSZWFkTEUxNihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCB1aW50MzJfdCByZWFkX29mZnNldCkgeworICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIDJuZCBieXRlIGlzIHdpdGhpbiB0aGUgYnVmZmVyCisgICAgaWYgKHJlYWRfb2Zmc2V0ICsgMSA+PSBkYXRhX3NpemUpIHJldHVybiAwOworICAgIHVpbnQxNl90IHZhbDsKKyAgICB2YWwgPSBkYXRhW3JlYWRfb2Zmc2V0XTsKKyAgICB2YWwgfD0gZGF0YVtyZWFkX29mZnNldCArIDFdIDw8IDg7CisgICAgcmV0dXJuIHZhbDsKK30KKworLy8gUGFyc2VzIE9wdXMgSGVhZGVyLiBIZWFkZXIgc3BlYzogaHR0cDovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIKK2Jvb2wgUGFyc2VPcHVzSGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIE9wdXNIZWFkZXIqIGhlYWRlcikgeworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTaXplKSB7CisgICAgICAgIEFMT0dWKCJIZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5jaGFubmVscyA9IGRhdGFba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF07CisKKyAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA8IDEgfHwgaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIGJhZCBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+c2tpcF9zYW1wbGVzID0gUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0KTsKKyAgICBoZWFkZXItPmdhaW5fZGIgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihSZWFkTEUxNihkYXRhLCBkYXRhX3NpemUsIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCkpOworICAgIGhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nID0gZGF0YVtrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0XTsKKyAgICBpZiAoIWhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgbWlzc2luZyBzdHJlYW0gbWFwLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOworICAgICAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gaGVhZGVyLT5jaGFubmVscyA+IDE7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFswXSA9IDA7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFsxXSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIHN0cmVhbSBtYXA7IGluc3VmZmljaWVudCBkYXRhIGZvciBjdXJyZW50IGNoYW5uZWwgIgorICAgICAgICAgICAgICAiY291bnQ6ICVkIiwKKyAgICAgICAgICAgICAgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9IGRhdGFba09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0XTsKKyAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gZGF0YVtrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0XTsKKyAgICBpZiAoaGVhZGVyLT5udW1fc3RyZWFtcyArIGhlYWRlci0+bnVtX2NvdXBsZWQgIT0gaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW5jb25zaXN0ZW50IGNoYW5uZWwgbWFwcGluZy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci0+Y2hhbm5lbHM7ICsraSkKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwW2ldID0gZGF0YVtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSkgeworICAgIC8vIFNlZSBodHRwczovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVsczsKKyAgICBpZiAob3V0cHV0X3NpemUgPCB0b3RhbF9zaXplKSB7CisgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCBmb3IgaGVhZGVyLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gZW5zdXJlIGVudGlyZSBoZWFkZXIgaXMgY2xlYXJlZCwgZXZlbiB0aG91Z2ggd2Ugb3ZlcndyaXRlIG11Y2ggb2YgaXQgYmVsb3cKKyAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRwdXRfc2l6ZSk7CisKKyAgICAvLyBTZXQgbWFnaWMgc2lnbmF0dXJlLgorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlckxhYmVsT2Zmc2V0LCAiT3B1c0hlYWQiLCA4KTsKKyAgICAvLyBTZXQgT3B1cyB2ZXJzaW9uLgorICAgIG91dHB1dFtrT3B1c0hlYWRlclZlcnNpb25PZmZzZXRdID0gMTsKKyAgICAvLyBTZXQgY2hhbm5lbCBjb3VudC4KKyAgICBvdXRwdXRba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF0gPSAodWludDhfdCloZWFkZXIuY2hhbm5lbHM7CisgICAgLy8gU2V0IHByZS1za2lwCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQsICZoZWFkZXIuc2tpcF9zYW1wbGVzLCBzaXplb2YodWludDE2X3QpKTsKKyAgICAvLyBTZXQgb3JpZ2luYWwgaW5wdXQgc2FtcGxlIHJhdGUgaW4gSHouCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCwgJmlucHV0X3NhbXBsZV9yYXRlLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAvLyBTZXQgb3V0cHV0IGdhaW4gaW4gZEIuCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCwgJmhlYWRlci5nYWluX2RiLCBzaXplb2YodWludDE2X3QpKTsKKworICAgIGlmIChoZWFkZXIuY2hhbm5lbHMgPiAyKSB7CisgICAgICAgIC8vIFNldCBjaGFubmVsIG1hcHBpbmcKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMTsKKyAgICAgICAgLy8gQXNzdW1pbmcgbm8gY291cGxlZCBzdHJlYW1zLiBUaGlzIHNob3VsZCBhY3R1YWxseSBiZQorICAgICAgICAvLyBjaGFubmVscygpIC0gfGNvdXBsZWRfc3RyZWFtc3wuCisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXRdID0gaGVhZGVyLmNoYW5uZWxzOworICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJOdW1Db3VwbGVkU3RyZWFtc09mZnNldF0gPSAwOworCisgICAgICAgIC8vIFNldCB0aGUgYWN0dWFsIHN0cmVhbSBtYXAuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLmNoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldID0ga09wdXNDaGFubmVsTWFwW2hlYWRlci5jaGFubmVscyAtIDFdW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVscyArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMDsKKyAgICAgICAgcmV0dXJuIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQgKyAxOworICAgIH0KK30KKworaW50IFdyaXRlT3B1c0hlYWRlcnMoY29uc3QgT3B1c0hlYWRlciAmaGVhZGVyLCBpbnQgaW5wdXRTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0U2l6ZSwgdWludDY0X3QgY29kZWNEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNlZWtQcmVSb2xsKSB7CisgICAgaWYgKG91dHB1dFNpemUgPCBBT1BVU19VTklGSUVEX0NTRF9NSU5TSVpFKSB7CisgICAgICAgIEFMT0dEKCJCdWZmZXIgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHVuaWZpZWQgT1BVUyBDU0QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQgaGVhZGVyTGVuID0gMDsKKworICAgIC8vIEFkZCBvcHVzIGhlYWRlcgorICAgIC8qCisgICAgICBGb2xsb3dpbmcgaXMgdGhlIENTRCBzeW50YXggZm9yIHNpZ25hbGxpbmcgT3B1c0hlYWRlcgorICAgICAgKGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyKQorCisgICAgICBNYXJrZXIgKDggYnl0ZXMpIHwgTGVuZ3RoICg4IGJ5dGVzKSB8IE9wdXNIZWFkZXIKKworICAgICAgTWFya2VycyBzdXBwb3J0ZWQ6CisgICAgICBBT1BVU19DU0RfT1BVU19IRUFERVJfTUFSS0VSIC0gU2lnbmFscyBPcHVzIEhlYWRlcgorCisgICAgICBMZW5ndGggc2hvdWxkIGJlIGEgdmFsdWUgd2l0aGluIEFPUFVTX09QVVNIRUFEX01JTlNJWkUgYW5kIEFPUFVTX09QVVNIRUFEX01BWFNJWkUuCisgICAgKi8KKworICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sIEFPUFVTX0NTRF9PUFVTX0hFQURFUl9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTUFSS0VSX1NJWkU7CisKKyAgICAvLyBQbGFjZSBob2xkZXIgZm9yIG9wdXNIZWFkZXIgU2l6ZQorICAgIGhlYWRlckxlbiArPSBBT1BVU19MRU5HVEhfU0laRTsKKworICAgIGludCBoZWFkZXJTaXplID0gV3JpdGVPcHVzSGVhZGVyKGhlYWRlciwgaW5wdXRTYW1wbGVSYXRlLCBvdXRwdXQgKyBoZWFkZXJMZW4sCisgICAgICAgIG91dHB1dFNpemUpOworICAgIGlmIChoZWFkZXJTaXplIDwgMCkgeworICAgICAgICBBTE9HRCgiJXM6IFdyaXRlT3B1c0hlYWRlciBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaGVhZGVyTGVuICs9IGhlYWRlclNpemU7CisKKyAgICAvLyBVcGRhdGUgb3B1cyBoZWFkZXJTaXplIGFmdGVyIEFPUFVTX0NTRF9PUFVTX0hFQURFUl9NQVJLRVIKKyAgICB1aW50NjRfdCBsZW5ndGggPSBoZWFkZXJTaXplOworICAgIG1lbWNweShvdXRwdXQgKyBBT1BVU19NQVJLRVJfU0laRSwgJmxlbmd0aCwgQU9QVVNfTEVOR1RIX1NJWkUpOworCisgICAgLyoKKyAgICAgIEZvbGxvd2luZyBpcyB0aGUgQ1NEIHN5bnRheCBmb3Igc2lnbmFsbGluZyBjb2RlYyBkZWxheSBhbmQKKyAgICAgIHNlZWsgcHJlLXJvbGwgd2hpY2ggaXMgdG8gYmUgYXBwZW5kZWQgYWZ0ZXIgT3B1c0hlYWRlcgorCisgICAgICBNYXJrZXIgKDggYnl0ZXMpIHwgTGVuZ3RoICg4IGJ5dGVzKSB8IFNhbXBsZXMgaW4gbnMgKDggYnl0ZXMpCisKKyAgICAgIE1hcmtlcnMgc3VwcG9ydGVkOgorICAgICAgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX01BUktFUiAtIGNvZGVjIGRlbGF5IGFzIHNhbXBsZXMgaW4gbnMsIHJlcHJlc2VudGVkIGluIDggYnl0ZXMKKyAgICAgIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSIC0gcHJlcm9sbCBhZGp1c3RtZW50IGFzIHNhbXBsZXMgaW4gbnMsIHJlcHJlc2VudGVkIGluIDggYnl0ZXMKKworICAgICovCisgICAgbGVuZ3RoID0gc2l6ZW9mKGNvZGVjRGVsYXkpOworICAgIGlmIChoZWFkZXJMZW4gPiAob3V0cHV0U2l6ZSAtIEFPUFVTX01BUktFUl9TSVpFIC0gQU9QVVNfTEVOR1RIX1NJWkUgLSBsZW5ndGgpKSB7CisgICAgICAgIEFMT0dEKCJCdWZmZXIgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIGNvZGVjIGRlbGF5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLy8gQWRkIGNvZGVjIGRlbGF5CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19NQVJLRVJfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmbGVuZ3RoLCBBT1BVU19MRU5HVEhfU0laRSk7CisgICAgaGVhZGVyTGVuICs9IEFPUFVTX0xFTkdUSF9TSVpFOworICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sICZjb2RlY0RlbGF5LCBsZW5ndGgpOworICAgIGhlYWRlckxlbiArPSBsZW5ndGg7CisKKyAgICBsZW5ndGggPSBzaXplb2Yoc2Vla1ByZVJvbGwpOworICAgIGlmIChoZWFkZXJMZW4gPiAob3V0cHV0U2l6ZSAtIEFPUFVTX01BUktFUl9TSVpFIC0gQU9QVVNfTEVOR1RIX1NJWkUgLSBsZW5ndGgpKSB7CisgICAgICAgIEFMT0dEKCJCdWZmZXIgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHNlZWsgcHJlIHJvbGwiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvLyBBZGQgc2tpcCBwcmUgcm9sbAorICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSk7CisgICAgaGVhZGVyTGVuICs9IEFPUFVTX01BUktFUl9TSVpFOworICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sICZsZW5ndGgsIEFPUFVTX0xFTkdUSF9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTEVOR1RIX1NJWkU7CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgJnNlZWtQcmVSb2xsLCBsZW5ndGgpOworICAgIGhlYWRlckxlbiArPSBsZW5ndGg7CisKKyAgICByZXR1cm4gaGVhZGVyTGVuOworfQorCitib29sIElzT3B1c0hlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB7CisgICAgaWYgKGRhdGFfc2l6ZSA8IEFPUFVTX01BUktFUl9TSVpFKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gIW1lbWNtcChkYXRhLCBBT1BVU19DU0RfT1BVU19IRUFERVJfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSk7Cit9CisKK2Jvb2wgR2V0T3B1c0hlYWRlckJ1ZmZlcnMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9wdXNIZWFkQnVmLCBzaXplX3QgKm9wdXNIZWFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmNvZGVjRGVsYXlCdWYsIHNpemVfdCAqY29kZWNEZWxheVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipzZWVrUHJlUm9sbEJ1Ziwgc2l6ZV90ICpzZWVrUHJlUm9sbFNpemUpIHsKKyAgICAqY29kZWNEZWxheUJ1ZiA9IE5VTEw7CisgICAgKmNvZGVjRGVsYXlTaXplID0gMDsKKyAgICAqc2Vla1ByZVJvbGxCdWYgPSBOVUxMOworICAgICpzZWVrUHJlUm9sbFNpemUgPSAwOworICAgICpvcHVzSGVhZEJ1ZiA9IE5VTEw7CisgICAgKm9wdXNIZWFkU2l6ZSA9IDA7CisKKyAgICAvLyBBT1BVU19NQVJLRVJfU0laRSBpcyA4ICJPcHVzSGVhZCIgaXMgb2Ygc2l6ZSA4CisgICAgaWYgKGRhdGFfc2l6ZSA8IDgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIENoZWNrIGlmIHRoZSBDU0QgaXMgaW4gbGVnYWN5IGZvcm1hdAorICAgIGlmICghbWVtY21wKCJPcHVzSGVhZCIsIGRhdGEsIDgpKSB7CisgICAgICAgIGlmIChkYXRhX3NpemUgPCBBT1BVU19PUFVTSEVBRF9NSU5TSVpFIHx8IGRhdGFfc2l6ZSA+IEFPUFVTX09QVVNIRUFEX01BWFNJWkUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJVbmV4cGVjdGVkIHNpemUgZm9yIG9wdXNIZWFkU2l6ZSAlenUiLCBkYXRhX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICpvcHVzSGVhZEJ1ZiA9ICh2b2lkICopZGF0YTsKKyAgICAgICAgKm9wdXNIZWFkU2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChtZW1jbXAoQU9QVVNfQ1NEX01BUktFUl9QUkVGSVgsIGRhdGEsIEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYX1NJWkUpID09IDApIHsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIHdoaWxlIChpIDw9IGRhdGFfc2l6ZSAtIEFPUFVTX01BUktFUl9TSVpFIC0gQU9QVVNfTEVOR1RIX1NJWkUpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmNzZEJ1ZiA9ICh1aW50OF90ICopZGF0YSArIGk7CisgICAgICAgICAgICBpZiAoIW1lbWNtcChjc2RCdWYsIEFPUFVTX0NTRF9PUFVTX0hFQURFUl9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsdWUsIGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFLCBzaXplb2YodmFsdWUpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBBT1BVU19PUFVTSEVBRF9NSU5TSVpFIHx8IHZhbHVlID4gQU9QVVNfT1BVU0hFQURfTUFYU0laRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVW5leHBlY3RlZCBzaXplIGZvciBvcHVzSGVhZFNpemUgJSIgUFJJdTY0LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSArPSBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFICsgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGkgPiBkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIk1hcmtlciBzaWduYWxzIGEgaGVhZGVyIHRoYXQgaXMgbGFyZ2VyIHRoYW4gaW5wdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb3B1c0hlYWRCdWYgPSBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFOworICAgICAgICAgICAgICAgICpvcHVzSGVhZFNpemUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoY3NkQnVmLCBBT1BVU19DU0RfQ09ERUNfREVMQVlfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSkpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSwgc2l6ZW9mKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHNpemVvZih1aW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlVuZXhwZWN0ZWQgc2l6ZSBmb3IgY29kZWNEZWxheSAlIiBQUkl1NjQsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICs9IEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkUgKyB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IGRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiTWFya2VyIHNpZ25hbHMgYSBoZWFkZXIgdGhhdCBpcyBsYXJnZXIgdGhhbiBpbnB1dCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb2RlY0RlbGF5QnVmID0gY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRTsKKyAgICAgICAgICAgICAgICAqY29kZWNEZWxheVNpemUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChjc2RCdWYsIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSkpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSwgc2l6ZW9mKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHNpemVvZih1aW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlVuZXhwZWN0ZWQgc2l6ZSBmb3Igc2Vla1ByZVJvbGxTaXplICUiIFBSSXU2NCwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRSArIHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChpID4gZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJNYXJrZXIgc2lnbmFscyBhIGhlYWRlciB0aGF0IGlzIGxhcmdlciB0aGFuIGlucHV0Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnNlZWtQcmVSb2xsQnVmID0gY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRTsKKyAgICAgICAgICAgICAgICAqc2Vla1ByZVJvbGxTaXplID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm91bmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gaXQgaXNuJ3QgaW4gZWl0aGVyIGZvcm1hdAorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDljOWFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlBhcnNlZE1lc3NhZ2UuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXNwPFBhcnNlZE1lc3NhZ2U+IFBhcnNlZE1lc3NhZ2U6OlBhcnNlKAotICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhLCBzaXplX3QgKmxlbmd0aCkgewotICAgIHNwPFBhcnNlZE1lc3NhZ2U+IG1zZyA9IG5ldyBQYXJzZWRNZXNzYWdlOwotICAgIHNzaXplX3QgcmVzID0gbXNnLT5wYXJzZShkYXRhLCBzaXplLCBub01vcmVEYXRhKTsKLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICpsZW5ndGggPSAwOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqbGVuZ3RoID0gcmVzOwotICAgIHJldHVybiBtc2c7Ci19Ci0KLVBhcnNlZE1lc3NhZ2U6OlBhcnNlZE1lc3NhZ2UoKSB7Ci19Ci0KLVBhcnNlZE1lc3NhZ2U6On5QYXJzZWRNZXNzYWdlKCkgewotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmZpbmRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGtleSA9IG5hbWU7Ci0gICAga2V5LnRvbG93ZXIoKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtRGljdC5pbmRleE9mS2V5KGtleSk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHZhbHVlLT5jbGVhcigpOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqdmFsdWUgPSBtRGljdC52YWx1ZUF0KGluZGV4KTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpmaW5kSW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIHN0cmluZ1ZhbHVlOwotCi0gICAgaWYgKCFmaW5kU3RyaW5nKG5hbWUsICZzdHJpbmdWYWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICAqdmFsdWUgPSBzdHJ0b2woc3RyaW5nVmFsdWUuY19zdHIoKSwgJmVuZCwgMTApOwotCi0gICAgaWYgKGVuZCA9PSBzdHJpbmdWYWx1ZS5jX3N0cigpIHx8ICplbmQgIT0gJ1wwJykgewotICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IGNoYXIgKlBhcnNlZE1lc3NhZ2U6OmdldENvbnRlbnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Db250ZW50LmNfc3RyKCk7Ci19Ci0KLXNzaXplX3QgUGFyc2VkTWVzc2FnZTo6cGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSkgewotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHNzaXplX3QgbGFzdERpY3RJbmRleCA9IC0xOwotCi0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgYm9vbCBoZWFkZXJzQ29tcGxldGUgPSBmYWxzZTsKLSAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICBzaXplX3QgbGluZUVuZE9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgd2hpbGUgKGxpbmVFbmRPZmZzZXQgKyAxIDwgc2l6ZQotICAgICAgICAgICAgICAgICYmIChkYXRhW2xpbmVFbmRPZmZzZXRdICE9ICdccicKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRhdGFbbGluZUVuZE9mZnNldCArIDFdICE9ICdcbicpKSB7Ci0gICAgICAgICAgICArK2xpbmVFbmRPZmZzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluZUVuZE9mZnNldCArIDEgPj0gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgQVN0cmluZyBsaW5lKCZkYXRhW29mZnNldF0sIGxpbmVFbmRPZmZzZXQgLSBvZmZzZXQpOwotCi0gICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIHJlcXVlc3Qvc3RhdHVzIGxpbmUuCi0KLSAgICAgICAgICAgIG1EaWN0LmFkZChBU3RyaW5nKCJfIiksIGxpbmUpOwotICAgICAgICAgICAgb2Zmc2V0ID0gbGluZUVuZE9mZnNldCArIDI7Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmVFbmRPZmZzZXQgPT0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBBbiBlbXB0eSBsaW5lIHNlcGFyYXRlcyBoZWFkZXJzIGZyb20gYm9keS4KLSAgICAgICAgICAgIGhlYWRlcnNDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmUuY19zdHIoKVswXSA9PSAnICcgfHwgbGluZS5jX3N0cigpWzBdID09ICdcdCcpIHsKLSAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGZvbGRlZCBoZWFkZXIgdmFsdWVzLgotCi0gICAgICAgICAgICBpZiAobGFzdERpY3RJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0J3MgbWFsZm9ybWVkIHNpbmNlIHRoZSBmaXJzdCBoZWFkZXIgbGluZQotICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBjb250aW51ZSBhbnl0aGluZy4uLgotCi0gICAgICAgICAgICAgICAgQVN0cmluZyAmdmFsdWUgPSBtRGljdC5lZGl0VmFsdWVBdChsYXN0RGljdEluZGV4KTsKLSAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCA9IGxpbmVFbmRPZmZzZXQgKyAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IGNvbG9uUG9zID0gbGluZS5maW5kKCI6Iik7Ci0gICAgICAgIGlmIChjb2xvblBvcyA+PSAwKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIGtleShsaW5lLCAwLCBjb2xvblBvcyk7Ci0gICAgICAgICAgICBrZXkudHJpbSgpOwotICAgICAgICAgICAga2V5LnRvbG93ZXIoKTsKLQotICAgICAgICAgICAgbGluZS5lcmFzZSgwLCBjb2xvblBvcyArIDEpOwotCi0gICAgICAgICAgICBsYXN0RGljdEluZGV4ID0gbURpY3QuYWRkKGtleSwgbGluZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmZzZXQgPSBsaW5lRW5kT2Zmc2V0ICsgMjsKLSAgICB9Ci0KLSAgICBpZiAoIWhlYWRlcnNDb21wbGV0ZSAmJiAoIW5vTW9yZURhdGEgfHwgb2Zmc2V0ID09IDApKSB7Ci0gICAgICAgIC8vIFdlIGVpdGhlciBzYXcgdGhlIGVtcHR5IGxpbmUgc2VwYXJhdGluZyBoZWFkZXJzIGZyb20gYm9keQotICAgICAgICAvLyBvciB3ZSBzYXcgYXQgbGVhc3QgdGhlIHN0YXR1cyBsaW5lIGFuZCBrbm93IHRoYXQgbm8gbW9yZSBkYXRhCi0gICAgICAgIC8vIGlzIGdvaW5nIHRvIGZvbGxvdy4KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURpY3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbURpY3QuZWRpdFZhbHVlQXQoaSkudHJpbSgpOwotICAgIH0KLQotICAgIGludDMyX3QgY29udGVudExlbmd0aDsKLSAgICBpZiAoIWZpbmRJbnQzMigiY29udGVudC1sZW5ndGgiLCAmY29udGVudExlbmd0aCkgfHwgY29udGVudExlbmd0aCA8IDApIHsKLSAgICAgICAgY29udGVudExlbmd0aCA9IDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IHRvdGFsTGVuZ3RoID0gb2Zmc2V0ICsgY29udGVudExlbmd0aDsKLQotICAgIGlmIChzaXplIDwgdG90YWxMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1Db250ZW50LnNldFRvKCZkYXRhW29mZnNldF0sIGNvbnRlbnRMZW5ndGgpOwotCi0gICAgcmV0dXJuIHRvdGFsTGVuZ3RoOwotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmdldFJlcXVlc3RGaWVsZChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKmZpZWxkKSBjb25zdCB7Ci0gICAgQVN0cmluZyBsaW5lOwotICAgIENIRUNLKGZpbmRTdHJpbmcoIl8iLCAmbGluZSkpOwotCi0gICAgc2l6ZV90IHByZXZPZmZzZXQgPSAwOwotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IGluZGV4OyArK2kpIHsKLSAgICAgICAgaWYgKG9mZnNldCA+PSBsaW5lLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBzcGFjZVBvcyA9IGxpbmUuZmluZCgiICIsIG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKHNwYWNlUG9zIDwgMCkgewotICAgICAgICAgICAgc3BhY2VQb3MgPSBsaW5lLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXZPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIG9mZnNldCA9IHNwYWNlUG9zICsgMTsKLSAgICB9Ci0KLSAgICBmaWVsZC0+c2V0VG8obGluZSwgcHJldk9mZnNldCwgb2Zmc2V0IC0gcHJldk9mZnNldCAtIDEpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6Z2V0U3RhdHVzQ29kZShpbnQzMl90ICpzdGF0dXNDb2RlKSBjb25zdCB7Ci0gICAgQVN0cmluZyBzdGF0dXNDb2RlU3RyaW5nOwotICAgIGlmICghZ2V0UmVxdWVzdEZpZWxkKDEsICZzdGF0dXNDb2RlU3RyaW5nKSkgewotICAgICAgICAqc3RhdHVzQ29kZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnN0YXR1c0NvZGUgPSBzdHJ0b2woc3RhdHVzQ29kZVN0cmluZy5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoKmVuZCAhPSAnXDAnIHx8IGVuZCA9PSBzdGF0dXNDb2RlU3RyaW5nLmNfc3RyKCkKLSAgICAgICAgICAgIHx8ICgqc3RhdHVzQ29kZSkgPCAxMDAgfHwgKCpzdGF0dXNDb2RlKSA+IDk5OSkgewotICAgICAgICAqc3RhdHVzQ29kZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotQVN0cmluZyBQYXJzZWRNZXNzYWdlOjpkZWJ1Z1N0cmluZygpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGxpbmU7Ci0gICAgQ0hFQ0soZmluZFN0cmluZygiXyIsICZsaW5lKSk7Ci0KLSAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURpY3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgQVN0cmluZyAma2V5ID0gbURpY3Qua2V5QXQoaSk7Ci0gICAgICAgIGNvbnN0IEFTdHJpbmcgJnZhbHVlID0gbURpY3QudmFsdWVBdChpKTsKLQotICAgICAgICBpZiAoa2V5ID09IEFTdHJpbmcoIl8iKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBsaW5lLmFwcGVuZChrZXkpOwotICAgICAgICBsaW5lLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgbGluZS5hcHBlbmQodmFsdWUpOwotICAgICAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLSAgICB9Ci0KLSAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLSAgICBsaW5lLmFwcGVuZChtQ29udGVudCk7Ci0KLSAgICByZXR1cm4gbGluZTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFBhcnNlZE1lc3NhZ2U6OkdldEF0dHJpYnV0ZSgKLSAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp2YWx1ZSkgewotICAgIHZhbHVlLT5jbGVhcigpOwotCi0gICAgc2l6ZV90IGtleUxlbiA9IHN0cmxlbihrZXkpOwotCi0gICAgZm9yICg7OykgewotICAgICAgICB3aGlsZSAoaXNzcGFjZSgqcykpIHsKLSAgICAgICAgICAgICsrczsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKHMsICc7Jyk7Ci0KLSAgICAgICAgc2l6ZV90IGxlbiA9Ci0gICAgICAgICAgICAoY29sb25Qb3MgPT0gTlVMTCkgPyBzdHJsZW4ocykgOiBjb2xvblBvcyAtIHM7Ci0KLSAgICAgICAgaWYgKGxlbiA+PSBrZXlMZW4gKyAxICYmIHNba2V5TGVuXSA9PSAnPScgJiYgIXN0cm5jbXAocywga2V5LCBrZXlMZW4pKSB7Ci0gICAgICAgICAgICB2YWx1ZS0+c2V0VG8oJnNba2V5TGVuICsgMV0sIGxlbiAtIGtleUxlbiAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29sb25Qb3MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcyA9IGNvbG9uUG9zICsgMTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBQYXJzZWRNZXNzYWdlOjpHZXRJbnQzMkF0dHJpYnV0ZSgKLSAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBpbnQzMl90ICp2YWx1ZSkgewotICAgIEFTdHJpbmcgc3RyaW5nVmFsdWU7Ci0gICAgaWYgKCFHZXRBdHRyaWJ1dGUocywga2V5LCAmc3RyaW5nVmFsdWUpKSB7Ci0gICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnZhbHVlID0gc3RydG9sKHN0cmluZ1ZhbHVlLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIGlmIChlbmQgPT0gc3RyaW5nVmFsdWUuY19zdHIoKSB8fCAqZW5kICE9ICdcMCcpIHsKLSAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKaW5kZXggOGYzMjU4Mi4uODM0Yjg4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcApAQCAtMjgsMTQgKzI4LDMxIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIHNpemVfdCBidWZTaXplID0gbiAvIDQgKiAzOworICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKGJ1ZlNpemUpOworCisgICAgaWYgKGRlY29kZUJhc2U2NChidWYtPmRhdGEoKSwgJmJ1ZlNpemUsIHMuY19zdHIoKSkpIHsKKyAgICAgICAgYnVmLT5zZXRSYW5nZSgwLCBidWZTaXplKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgZGVjb2RlQmFzZTY0KHVpbnQ4X3QgKm91dCwgc2l6ZV90ICppbk91dEJ1ZlNpemUsIGNvbnN0IGNoYXIqIHMpIHsKKyAgICBzaXplX3QgbiA9IHN0cmxlbihzKTsKKworICAgIGlmICgobiAlIDQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHNpemVfdCBwYWRkaW5nID0gMDsKLSAgICBpZiAobiA+PSAxICYmIHMuY19zdHIoKVtuIC0gMV0gPT0gJz0nKSB7CisgICAgaWYgKG4gPj0gMSAmJiBzW24gLSAxXSA9PSAnPScpIHsKICAgICAgICAgcGFkZGluZyA9IDE7CiAKLSAgICAgICAgaWYgKG4gPj0gMiAmJiBzLmNfc3RyKClbbiAtIDJdID09ICc9JykgeworICAgICAgICBpZiAobiA+PSAyICYmIHNbbiAtIDJdID09ICc9JykgewogICAgICAgICAgICAgcGFkZGluZyA9IDI7CiAKLSAgICAgICAgICAgIGlmIChuID49IDMgJiYgcy5jX3N0cigpW24gLSAzXSA9PSAnPScpIHsKKyAgICAgICAgICAgIGlmIChuID49IDMgJiYgc1tuIC0gM10gPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgcGFkZGluZyA9IDM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ1LDE1ICs2MiwxMyBAQAogICAgIC8vIGFscmVhZHkgbWFkZSBzdXJlIHRoYXQgbiAlIDQgPT0gMC4KICAgICBzaXplX3Qgb3V0TGVuID0gKG4gLyA0KSAqIDMgLSBwYWRkaW5nOwogCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIob3V0TGVuKTsKLSAgICB1aW50OF90ICpvdXQgPSBidWZmZXItPmRhdGEoKTsKLSAgICBpZiAob3V0ID09IE5VTEwgfHwgYnVmZmVyLT5zaXplKCkgPCBvdXRMZW4pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG91dCA9PSBOVUxMIHx8ICppbk91dEJ1ZlNpemUgPCBvdXRMZW4pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzaXplX3QgaiA9IDA7CiAgICAgdWludDMyX3QgYWNjdW0gPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGNoYXIgYyA9IHMuY19zdHIoKVtpXTsKKyAgICAgICAgY2hhciBjID0gc1tpXTsKICAgICAgICAgdW5zaWduZWQgdmFsdWU7CiAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgewogICAgICAgICAgICAgdmFsdWUgPSBjIC0gJ0EnOwpAQCAtNjYsMTAgKzgxLDEwIEBACiAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnLycgfHwgYyA9PSAnXycpIHsKICAgICAgICAgICAgIHZhbHVlID0gNjM7CiAgICAgICAgIH0gZWxzZSBpZiAoYyAhPSAnPScpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGkgPCBuIC0gcGFkZGluZykgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmFsdWUgPSAwOwpAQCAtODYsNyArMTAxLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBidWZmZXI7CisgICAgKmluT3V0QnVmU2l6ZSA9IGo7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBjaGFyIGVuY29kZTZCaXQodW5zaWduZWQgeCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzZWJhYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFfTkVUV09SS19TRVNTSU9OX0hfCi0KLSNkZWZpbmUgQV9ORVRXT1JLX1NFU1NJT05fSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci0KLS8vIEhlbHBlciBjbGFzcyB0byBtYW5hZ2UgYSBudW1iZXIgb2YgbGl2ZSBzb2NrZXRzIChkYXRhZ3JhbSBhbmQgc3RyZWFtLWJhc2VkKQotLy8gb24gYSBzaW5nbGUgdGhyZWFkLiBDbGllbnRzIGFyZSBub3RpZmllZCBhYm91dCBhY3Rpdml0eSB0aHJvdWdoIEFNZXNzYWdlcy4KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgQU5ldHdvcmtTZXNzaW9uKCk7Ci0KLSAgICBzdGF0dXNfdCBzdGFydCgpOwotICAgIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVJUU1BDbGllbnQoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVSVFNQU2VydmVyKAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdFVEUFNlc3Npb24oCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwgdW5zaWduZWQgcmVtb3RlUG9ydCk7Ci0KLSAgICAvLyBwYXNzaXZlCi0gICAgc3RhdHVzX3QgY3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIC8vIGFjdGl2ZQotICAgIHN0YXR1c190IGNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgZGVzdHJveVNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3Qgc2VuZFJlcXVlc3QoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplID0gLTEsCi0gICAgICAgICAgICBib29sIHRpbWVWYWxpZCA9IGZhbHNlLCBpbnQ2NF90IHRpbWVVcyA9IC0xbGwpOwotCi0gICAgc3RhdHVzX3Qgc3dpdGNoVG9XZWJTb2NrZXRNb2RlKGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIGVudW0gTm90aWZpY2F0aW9uUmVhc29uIHsKLSAgICAgICAga1doYXRFcnJvciwKLSAgICAgICAga1doYXRDb25uZWN0ZWQsCi0gICAgICAgIGtXaGF0Q2xpZW50Q29ubmVjdGVkLAotICAgICAgICBrV2hhdERhdGEsCi0gICAgICAgIGtXaGF0RGF0YWdyYW0sCi0gICAgICAgIGtXaGF0QmluYXJ5RGF0YSwKLSAgICAgICAga1doYXRXZWJTb2NrZXRNZXNzYWdlLAotICAgICAgICBrV2hhdE5ldHdvcmtTdGFsbCwKLSAgICB9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QU5ldHdvcmtTZXNzaW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IE5ldHdvcmtUaHJlYWQ7Ci0gICAgc3RydWN0IFNlc3Npb247Ci0KLSAgICBNdXRleCBtTG9jazsKLSAgICBzcDxUaHJlYWQ+IG1UaHJlYWQ7Ci0KLSAgICBpbnQzMl90IG1OZXh0U2Vzc2lvbklEOwotCi0gICAgaW50IG1QaXBlRmRbMl07Ci0KLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBzcDxTZXNzaW9uPiA+IG1TZXNzaW9uczsKLQotICAgIGVudW0gTW9kZSB7Ci0gICAgICAgIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbiwKLSAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlLAotICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSwKLSAgICAgICAga01vZGVDcmVhdGVSVFNQU2VydmVyLAotICAgICAgICBrTW9kZUNyZWF0ZVJUU1BDbGllbnQsCi0gICAgfTsKLSAgICBzdGF0dXNfdCBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIE1vZGUgbW9kZSwKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAotICAgICAgICAgICAgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgdm9pZCB0aHJlYWRMb29wKCk7Ci0gICAgdm9pZCBpbnRlcnJ1cHQoKTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBNYWtlU29ja2V0Tm9uQmxvY2tpbmcoaW50IHMpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU5ldHdvcmtTZXNzaW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQV9ORVRXT1JLX1NFU1NJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkNGQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCisjZGVmaW5lIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIEF1ZGlvUHJlc2VudGF0aW9uVmVyc2lvbiB7CisgICAgUFJFU0VOVEFUSU9OX1ZFUlNJT05fVU5ERUZJTkVEID0gMCwKKyAgICBQUkVTRU5UQVRJT05fVkVSU0lPTl8xLAorfTsKKworZW51bSBNYXN0ZXJpbmdJbmRpY2F0aW9uIHsKKyAgICBNQVNURVJJTkdfTk9UX0lORElDQVRFRCwKKyAgICBNQVNURVJFRF9GT1JfU1RFUkVPLAorICAgIE1BU1RFUkVEX0ZPUl9TVVJST1VORCwKKyAgICBNQVNURVJFRF9GT1JfM0QsCisgICAgTUFTVEVSRURfRk9SX0hFQURQSE9ORSwKK307CisKK3N0cnVjdCBBdWRpb1ByZXNlbnRhdGlvbiB7CisgICAgdWludDMyX3QgbVZlcnNpb24gPSBQUkVTRU5UQVRJT05fVkVSU0lPTl9VTkRFRklORUQ7CisgICAgaW50MzJfdCBtUHJlc2VudGF0aW9uSWQgPSAtMTsKKyAgICBpbnQzMl90IG1Qcm9ncmFtSWQgPSAtMTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1MYWJlbHM7CisgICAgc3RkOjpzdHJpbmcgbUxhbmd1YWdlOworICAgIE1hc3RlcmluZ0luZGljYXRpb24gbU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJJTkdfTk9UX0lORElDQVRFRDsKKyAgICBib29sIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gZmFsc2U7CisgICAgYm9vbCBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gZmFsc2U7CisgICAgYm9vbCBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IGZhbHNlOworfTsKKworc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uVjEgOiBwdWJsaWMgQXVkaW9QcmVzZW50YXRpb24geworICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEoKSB7CisgICAgICAgIG1WZXJzaW9uID0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMTsKKyAgICB9Cit9OworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPEF1ZGlvUHJlc2VudGF0aW9uPiBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb247CisKK3ZvaWQgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiYgcHJlc2VudGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtKiBzZXJpYWxpemVkT3V0cHV0KTsKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHN0ZDo6aXN0cmVhbSogc2VyaWFsaXplZElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAppbmRleCBkNmM3NjhkLi5jZDBhZjJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAorc3RydWN0IEFNZWRpYUZvcm1hdDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQ29sb3JVdGlscyB7CkBAIC0xMzUsNiArMTM3LDkgQEAKICAgICBzdGF0aWMgdm9pZCBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCiAgICAgICAgICAgICBpbnQzMl90IHByaW1hcmllcywgaW50MzJfdCB0cmFuc2ZlciwgaW50MzJfdCBjb2VmZnMsIGJvb2wgZnVsbFJhbmdlLAogICAgICAgICAgICAgQ29sb3JBc3BlY3RzICZhc3BlY3RzKTsKKyAgICBzdGF0aWMgdm9pZCBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IGlzb3RyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCisgICAgICAgIGludDMyX3QgKnJhbmdlLCBpbnQzMl90ICpzdGFuZGFyZCwgaW50MzJfdCAqdHJhbnNmZXIpOwogCiAgICAgLy8gdW5wYWNrIGEgdWludDMyX3QgdG8gYSBmdWxsIENvbG9yQXNwZWN0cyBzdHJ1Y3QKICAgICBzdGF0aWMgQ29sb3JBc3BlY3RzIHVucGFja1RvQ29sb3JBc3BlY3RzKHVpbnQzMl90IHBhY2tlZCk7CkBAIC0xODAsNiArMTg1LDggQEAKIAogICAgIC8vIHdyaXRlcyB8aW5mb3wgaW50byBmb3JtYXQuCiAgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIC8vIHdyaXRlcyB8aW5mb3wgaW50byBmb3JtYXQuCisgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOwogfTsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhhbmRyb2lkOjpDb2xvclV0aWxzOjpDb2xvclN0YW5kYXJkIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKaW5kZXggNTg3NThiYy4uMDA3YTA5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwpAQCAtMzMsNiArMzQsMTAgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19SQVc7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUc7CiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOwpAQCAtNTIsNiArNTcsOCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDM3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGUgT3B1cyBzcGVjaWZpY2F0aW9uIGlzIHBhcnQgb2YgSUVURiBSRkMgNjcxNjoKKyAqIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY3MTYKKyAqLworCisjaWZuZGVmIE9QVVNfSEVBREVSX0hfCisjZGVmaW5lIE9QVVNfSEVBREVSX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogQ29uc3RhbnRzIHVzZWQgZm9yIGRlbGltaXRpbmcgT3B1cyBDU0QgKi8KKyNkZWZpbmUgQU9QVVNfQ1NEX01BUktFUl9QUkVGSVggIkFPUFVTIgorI2RlZmluZSBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWF9TSVpFIChzaXplb2YoQU9QVVNfQ1NEX01BUktFUl9QUkVGSVgpIC0gMSkKKyNkZWZpbmUgQU9QVVNfQ1NEX09QVVNfSEVBREVSX01BUktFUiBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWCAiSERSIgorI2RlZmluZSBBT1BVU19DU0RfQ09ERUNfREVMQVlfTUFSS0VSIEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYICJETFkiCisjZGVmaW5lIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSIEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYICJQUkwiCisjZGVmaW5lIEFPUFVTX01BUktFUl9TSVpFIDgKKyNkZWZpbmUgQU9QVVNfTEVOR1RIX1NJWkUgc2l6ZW9mKHVpbnQ2NF90KQorI2RlZmluZSBBT1BVU19DU0RfQ09ERUNfREVMQVlfU0laRSBcCisgICAgIChBT1BVU19NQVJLRVJfU0laRSkgKyAoQU9QVVNfTEVOR1RIX1NJWkUpICsgc2l6ZW9mKHVpbnQ2NF90KQorI2RlZmluZSBBT1BVU19DU0RfU0VFS19QUkVST0xMX1NJWkUgXAorICAgICAoQU9QVVNfTUFSS0VSX1NJWkUpICsgKEFPUFVTX0xFTkdUSF9TSVpFKSArIHNpemVvZih1aW50NjRfdCkKKworLyogT3B1c0hlYWQgY3NkIG1pbmltdW0gc2l6ZSBpcyAxOSAqLworI2RlZmluZSBBT1BVU19PUFVTSEVBRF9NSU5TSVpFIDE5CisjZGVmaW5lIEFPUFVTX0NTRF9PUFVTSEVBRF9NSU5TSVpFIFwKKyAgICAoQU9QVVNfTUFSS0VSX1NJWkUpICsgKEFPUFVTX0xFTkdUSF9TSVpFKSArIChBT1BVU19PUFVTSEVBRF9NSU5TSVpFKQorCisjZGVmaW5lIEFPUFVTX1VOSUZJRURfQ1NEX01JTlNJWkUgXAorICAgICgoQU9QVVNfQ1NEX09QVVNIRUFEX01JTlNJWkUpICsgXAorICAgICAoQU9QVVNfQ1NEX0NPREVDX0RFTEFZX1NJWkUpICsgXAorICAgICAoQU9QVVNfQ1NEX1NFRUtfUFJFUk9MTF9TSVpFKSkKKworLyogT3B1c0hlYWQgY3NkIGF0IG1heCBjYW4gYmUgQU9QVVNfQ1NEX09QVVNIRUFEX01JTlNJWkUgKyAyICsgbWF4IG51bWJlciBvZiBjaGFubmVscyAoMjU1KSAqLworI2RlZmluZSBBT1BVU19PUFVTSEVBRF9NQVhTSVpFICgoQU9QVVNfT1BVU0hFQURfTUlOU0laRSkgKyAyICsgMjU1KQorI2RlZmluZSBBT1BVU19DU0RfT1BVU0hFQURfTUFYU0laRSBcCisgICAgKEFPUFVTX01BUktFUl9TSVpFKSArIChBT1BVU19MRU5HVEhfU0laRSkgKyAoQU9QVVNfT1BVU0hFQURfTUFYU0laRSkKKworI2RlZmluZSBBT1BVU19VTklGSUVEX0NTRF9NQVhTSVpFIFwKKyAgICAoKEFPUFVTX0NTRF9PUFVTSEVBRF9NQVhTSVpFKSArIFwKKyAgICAgKEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9TSVpFKSArIFwKKyAgICAgKEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfU0laRSkpCisKK3N0cnVjdCBPcHVzSGVhZGVyIHsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IGNoYW5uZWxfbWFwcGluZzsKKyAgICBpbnQgbnVtX3N0cmVhbXM7CisgICAgaW50IG51bV9jb3VwbGVkOworICAgIGludDE2X3QgZ2Fpbl9kYjsKKyAgICBpbnQgc2tpcF9zYW1wbGVzOworICAgIHVpbnQ4X3Qgc3RyZWFtX21hcFs4XTsKK307CisKK2Jvb2wgUGFyc2VPcHVzSGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIE9wdXNIZWFkZXIqIGhlYWRlcik7CitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLCB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSk7Citib29sIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvcHVzSGVhZEJ1Ziwgc2l6ZV90ICpvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipjb2RlY0RlbGF5QnVmLCBzaXplX3QgKmNvZGVjRGVsYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqc2Vla1ByZVJvbGxCdWYsIHNpemVfdCAqc2Vla1ByZVJvbGxTaXplKTsKK2ludCBXcml0ZU9wdXNIZWFkZXJzKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0U2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IG91dHB1dFNpemUsIHVpbnQ2NF90IGNvZGVjRGVsYXksCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZWVrUHJlUm9sbCk7Citib29sIElzT3B1c0hlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gT1BVU19IRUFERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0M2E5My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEVuY2Fwc3VsYXRlcyBhbiAiSFRUUC9SVFNQIHN0eWxlIiByZXNwb25zZSwgaS5lLiBhIHN0YXR1cyBsaW5lLAotLy8ga2V5L3ZhbHVlIHBhaXJzIG1ha2luZyB1cCB0aGUgaGVhZGVycyBhbmQgYW4gb3B0aW9uYWwgYm9keS9jb250ZW50Lgotc3RydWN0IFBhcnNlZE1lc3NhZ2UgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgc3RhdGljIHNwPFBhcnNlZE1lc3NhZ2U+IFBhcnNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSwgc2l6ZV90ICpsZW5ndGgpOwotCi0gICAgYm9vbCBmaW5kU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEFTdHJpbmcgKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRJbnQzMihjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICp2YWx1ZSkgY29uc3Q7Ci0KLSAgICBjb25zdCBjaGFyICpnZXRDb250ZW50KCkgY29uc3Q7Ci0KLSAgICBib29sIGdldFJlcXVlc3RGaWVsZChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKmZpZWxkKSBjb25zdDsKLSAgICBib29sIGdldFN0YXR1c0NvZGUoaW50MzJfdCAqc3RhdHVzQ29kZSkgY29uc3Q7Ci0KLSAgICBBU3RyaW5nIGRlYnVnU3RyaW5nKCkgY29uc3Q7Ci0KLSAgICBzdGF0aWMgYm9vbCBHZXRBdHRyaWJ1dGUoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp2YWx1ZSk7Ci0KLSAgICBzdGF0aWMgYm9vbCBHZXRJbnQzMkF0dHJpYnV0ZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgaW50MzJfdCAqdmFsdWUpOwotCi0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QYXJzZWRNZXNzYWdlKCk7Ci0KLXByaXZhdGU6Ci0gICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQVN0cmluZz4gbURpY3Q7Ci0gICAgQVN0cmluZyBtQ29udGVudDsKLQotICAgIFBhcnNlZE1lc3NhZ2UoKTsKLQotICAgIHNzaXplX3QgcGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJzZWRNZXNzYWdlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oCmluZGV4IGFiYzk1ZTAuLjYwZmI5ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oCkBAIC0yNiw2ICsyNiw5IEBACiBzdHJ1Y3QgQVN0cmluZzsKIAogc3A8QUJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IEFTdHJpbmcgJnMpOworCitib29sIGRlY29kZUJhc2U2NCh1aW50OF90ICpvdXQsIHNpemVfdCAqaW5PdXRCdWZTaXplLCBjb25zdCBjaGFyKiBzKTsKKwogdm9pZCBlbmNvZGVCYXNlNjQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCk7CiAKIHZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0NsZWFyTWVkaWFIVFRQLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTU3YzhhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyTWVkaWFIVFRQIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDbGVhck1lZGlhSFRUUDo6Q2xlYXJNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCisgICAgOiBtSW5pdENoZWNrKChjb25uICE9IE5VTEwpID8gT0sgOiBOT19JTklUKSwKKyAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKKyAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAorICAgICAgbUNhY2hlZFNpemUoMGxsKSB7Cit9CisKK0NsZWFyTWVkaWFIVFRQOjp+Q2xlYXJNZWRpYUhUVFAoKSB7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICBvZmY2NF90IC8qIG9mZnNldCAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGV4dEhlYWRlcnM7CisgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgfQorCisgICAgaWYgKGV4dEhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJVc2VyLUFnZW50IikpIDwgMCkgeworICAgICAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICBtTGFzdFVSSSA9IHVyaTsKKyAgICAvLyByZWNvbm5lY3QoKSBjYWxscyB3aXRoIHVyaSA9PSBvbGQgbUxhc3RVUkkuY19zdHIoKSwgd2hpY2ggZ2V0cyB6YXBwZWQKKyAgICAvLyBhcyBwYXJ0IG9mIHRoZSBhYm92ZSBhc3NpZ25tZW50LiBFbnN1cmUgbm8gYWNjaWRlbnRhbCBsYXRlciB1c2UuCisgICAgdXJpID0gTlVMTDsKKworICAgIGJvb2wgc3VjY2VzcyA9IG1IVFRQQ29ubmVjdGlvbi0+Y29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmZXh0SGVhZGVycyk7CisKKyAgICBtTGFzdEhlYWRlcnMgPSBleHRIZWFkZXJzOworCisgICAgbUNhY2hlZFNpemVWYWxpZCA9IGZhbHNlOworCisgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgQVN0cmluZyBzYW5pdGl6ZWQgPSB1cmlEZWJ1Z1N0cmluZyhtTGFzdFVSSSk7CisgICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJDbGVhck1lZGlhSFRUUCglcykiLCBzYW5pdGl6ZWQuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3ZvaWQgQ2xlYXJNZWRpYUhUVFA6OmNsb3NlKCkgeworICAgIGRpc2Nvbm5lY3QoKTsKK30KKwordm9pZCBDbGVhck1lZGlhSFRUUDo6ZGlzY29ubmVjdCgpIHsKKyAgICBtTmFtZSA9IFN0cmluZzgoIkNsZWFyTWVkaWFIVFRQKDxkaXNjb25uZWN0ZWQ+KSIpOworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSFRUUENvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3NpemVfdCBDbGVhck1lZGlhSFRUUDo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7CisgICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplIC0gbnVtQnl0ZXNSZWFkOworCisgICAgICAgIGlmIChjb3B5ID4gNjQgKiAxMDI0KSB7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgYnVmZmVyIHNpemVzIHRyYW5zZmVycmVkIGFjcm9zcyBiaW5kZXIgYm91bmRhcmllcworICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3B1cmlvdXMgdHJhbnNhY3Rpb24gZmFpbHVyZXMuCisgICAgICAgICAgICBjb3B5ID0gNjQgKiAxMDI0OworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBuID0gbUhUVFBDb25uZWN0aW9uLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtQnl0ZXNSZWFkLCAodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIGNvcHkpOworCisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG51bUJ5dGVzUmVhZCArPSBuOworICAgIH0KKworICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKworICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzUmVhZCwgZGVsYXlVcyk7CisKKyAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgLy8gQ2FjaGluZyB0aGUgcmV0dXJuZWQgc2l6ZSBzbyB0aGF0IGl0IHN0YXlzIHZhbGlkIGV2ZW4gYWZ0ZXIgYQorICAgIC8vIGRpc2Nvbm5lY3QuIE51Q2FjaGVkU291cmNlMiByZWxpZXMgb24gdGhpcy4KKworICAgIGlmICghbUNhY2hlZFNpemVWYWxpZCkgeworICAgICAgICBtQ2FjaGVkU2l6ZSA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0U2l6ZSgpOworICAgICAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAqc2l6ZSA9IG1DYWNoZWRTaXplOworCisgICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KE9LKTsKK30KKwordWludDMyX3QgQ2xlYXJNZWRpYUhUVFA6OmZsYWdzKCkgeworICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgcmV0dXJuIGNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJm1MYXN0SGVhZGVycywgb2Zmc2V0KTsKK30KKworCitTdHJpbmc4IENsZWFyTWVkaWFIVFRQOjpnZXRVcmkoKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CisgICAgfQorCisgICAgU3RyaW5nOCB1cmk7CisgICAgaWYgKE9LID09IG1IVFRQQ29ubmVjdGlvbi0+Z2V0VXJpKCZ1cmkpKSB7CisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpOworfQorCitTdHJpbmc4IENsZWFyTWVkaWFIVFRQOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgU3RyaW5nOCBtaW1lVHlwZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUENvbm5lY3Rpb24tPmdldE1JTUVUeXBlKCZtaW1lVHlwZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWltZVR5cGU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKaW5kZXggN2M5MjQ3ZS4uMGZiYTNkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcApAQCAtMzAsMTAgKzMwLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCi0gICAgOiBtSW5pdENoZWNrKChjb25uICE9IE5VTEwpID8gT0sgOiBOT19JTklUKSwKLSAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKLSAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAotICAgICAgbUNhY2hlZFNpemUoMGxsKSwKKyAgICA6IENsZWFyTWVkaWFIVFRQKGNvbm4pLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgewogfQogCkBAIC00MSwxMTcgKzM4LDYgQEAKICAgICBjbGVhckRSTVN0YXRlX2woKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFIVFRQOjpjb25uZWN0KAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBvZmY2NF90IC8qIG9mZnNldCAqLykgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGV4dEhlYWRlcnM7Ci0gICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7Ci0gICAgfQotCi0gICAgaWYgKGV4dEhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJVc2VyLUFnZW50IikpIDwgMCkgewotICAgICAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKLSAgICB9Ci0KLSAgICBtTGFzdFVSSSA9IHVyaTsKLSAgICAvLyByZWNvbm5lY3QoKSBjYWxscyB3aXRoIHVyaSA9PSBvbGQgbUxhc3RVUkkuY19zdHIoKSwgd2hpY2ggZ2V0cyB6YXBwZWQKLSAgICAvLyBhcyBwYXJ0IG9mIHRoZSBhYm92ZSBhc3NpZ25tZW50LiBFbnN1cmUgbm8gYWNjaWRlbnRhbCBsYXRlciB1c2UuCi0gICAgdXJpID0gTlVMTDsKLQotICAgIGJvb2wgc3VjY2VzcyA9IG1IVFRQQ29ubmVjdGlvbi0+Y29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmZXh0SGVhZGVycyk7Ci0KLSAgICBtTGFzdEhlYWRlcnMgPSBleHRIZWFkZXJzOwotCi0gICAgbUNhY2hlZFNpemVWYWxpZCA9IGZhbHNlOwotCi0gICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgQVN0cmluZyBzYW5pdGl6ZWQgPSB1cmlEZWJ1Z1N0cmluZyhtTGFzdFVSSSk7Ci0gICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJNZWRpYUhUVFAoJXMpIiwgc2FuaXRpemVkLmNfc3RyKCkpOwotICAgIH0KLQotICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi12b2lkIE1lZGlhSFRUUDo6ZGlzY29ubmVjdCgpIHsKLSAgICBtTmFtZSA9IFN0cmluZzgoIk1lZGlhSFRUUCg8ZGlzY29ubmVjdGVkPikiKTsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUhUVFBDb25uZWN0aW9uLT5kaXNjb25uZWN0KCk7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtSW5pdENoZWNrOwotfQotCi1zc2l6ZV90IE1lZGlhSFRUUDo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7Ci0gICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplIC0gbnVtQnl0ZXNSZWFkOwotCi0gICAgICAgIGlmIChjb3B5ID4gNjQgKiAxMDI0KSB7Ci0gICAgICAgICAgICAvLyBsaW1pdCB0aGUgYnVmZmVyIHNpemVzIHRyYW5zZmVycmVkIGFjcm9zcyBiaW5kZXIgYm91bmRhcmllcwotICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3B1cmlvdXMgdHJhbnNhY3Rpb24gZmFpbHVyZXMuCi0gICAgICAgICAgICBjb3B5ID0gNjQgKiAxMDI0OwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBuID0gbUhUVFBDb25uZWN0aW9uLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtQnl0ZXNSZWFkLCAodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIGNvcHkpOwotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG51bUJ5dGVzUmVhZCArPSBuOwotICAgIH0KLQotICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKLQotICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzUmVhZCwgZGVsYXlVcyk7Ci0KLSAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOwotfQotCi1zdGF0dXNfdCBNZWRpYUhUVFA6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIC8vIENhY2hpbmcgdGhlIHJldHVybmVkIHNpemUgc28gdGhhdCBpdCBzdGF5cyB2YWxpZCBldmVuIGFmdGVyIGEKLSAgICAvLyBkaXNjb25uZWN0LiBOdUNhY2hlZFNvdXJjZTIgcmVsaWVzIG9uIHRoaXMuCi0KLSAgICBpZiAoIW1DYWNoZWRTaXplVmFsaWQpIHsKLSAgICAgICAgbUNhY2hlZFNpemUgPSBtSFRUUENvbm5lY3Rpb24tPmdldFNpemUoKTsKLSAgICAgICAgbUNhY2hlZFNpemVWYWxpZCA9IHRydWU7Ci0gICAgfQotCi0gICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKLQotICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IHN0YXRpY19jYXN0PHN0YXR1c190PihPSyk7Ci19Ci0KLXVpbnQzMl90IE1lZGlhSFRUUDo6ZmxhZ3MoKSB7Ci0gICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOwotfQotCi1zdGF0dXNfdCBNZWRpYUhUVFA6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIGNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJm1MYXN0SGVhZGVycywgb2Zmc2V0KTsKLX0KLQogLy8gRFJNLi4uCiAKIHNwPERlY3J5cHRIYW5kbGU+IE1lZGlhSFRUUDo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSkgewpAQCAtMTc2LDMzICs2Miw2IEBACiAgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwogfQogCi1TdHJpbmc4IE1lZGlhSFRUUDo6Z2V0VXJpKCkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOwotICAgIH0KLQotICAgIFN0cmluZzggdXJpOwotICAgIGlmIChPSyA9PSBtSFRUUENvbm5lY3Rpb24tPmdldFVyaSgmdXJpKSkgewotICAgICAgICByZXR1cm4gdXJpOwotICAgIH0KLSAgICByZXR1cm4gU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKTsKLX0KLQotU3RyaW5nOCBNZWRpYUhUVFA6OmdldE1JTUVUeXBlKCkgY29uc3QgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IG1pbWVUeXBlOwotICAgIHN0YXR1c190IGVyciA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0TUlNRVR5cGUoJm1pbWVUeXBlKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgIH0KLQotICAgIHJldHVybiBtaW1lVHlwZTsKLX0KLQogdm9pZCBNZWRpYUhUVFA6OmNsZWFyRFJNU3RhdGVfbCgpIHsKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAppbmRleCA5MDUzZDYyLi5jMGVlMTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKQEAgLTI5LDE4ICsyOSwxOCBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcAppbmRleCA3MjYwNGUzLi41OTI2NWZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCkBAIC0yNiw4ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CkBAIC0zOCw3ICszOCw3IEBACiBIVFRQRG93bmxvYWRlcjo6SFRUUERvd25sb2FkZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmhlYWRlcnMpIDoKLSAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSwKKyAgICBtSFRUUERhdGFTb3VyY2UobmV3IENsZWFyTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAogICAgIG1FeHRyYUhlYWRlcnMoaGVhZGVycyksCiAgICAgbURpc2Nvbm5lY3RpbmcoZmFsc2UpIHsKIH0KQEAgLTkxLDcgKzkxLDcgQEAKIAogICAgIGlmIChyZWNvbm5lY3QpIHsKICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCh1cmwsICJmaWxlOi8vIiwgNykpIHsKLSAgICAgICAgICAgIG1EYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UodXJsICsgNyk7CisgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG5ldyBDbGVhckZpbGVTb3VyY2UodXJsICsgNyk7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNhc2VjbXAodXJsLCAiaHR0cDovLyIsIDcpCiAgICAgICAgICAgICAgICAgJiYgc3RybmNhc2VjbXAodXJsLCAiaHR0cHM6Ly8iLCA4KSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IDJlY2ZhNDMuLjVlN2Y5MGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTEyMzQsNyArMTIzNCw3IEBACiAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnVyaSwgdWludDMyX3Qgc3RyZWFtTWFzaywgaW50NjRfdCB0aW1lVXMsIGJvb2wgbmV3VXJpKSB7CiAgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpOwogICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR0UoImRpZCBub3QgZmluZCBmZXRjaGVyIGZvciB1cmk6ICVzIiwgdXJpLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIHVyaTogJXMiLCB1cmlEZWJ1Z1N0cmluZyh1cmkpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0yMDA1LDcgKzIwMDUsNyBAQAogCiAgICAgICAgICAgICBpZiAoKG1OZXdTdHJlYW1NYXNrICYgc3RyZWFtKSAmJiBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIHVyaURlYnVnU3RyaW5nKG1TdHJlYW1zW2lkeF0ubVVyaSkuY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CiAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKQEAgLTIwMzMsNyArMjAzMyw3IEBACiAgICAgICAgIENIRUNLKGlkeCA+PSAwKTsKICAgICAgICAgaWYgKG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5lbXB0eSgpKSB7CiAgICAgICAgICAgICBBTE9HVygic3dhcHBpbmcgZXh0cmEgc3RyZWFtIHR5cGUgJWQgJXMgdG8gZW1wdHkgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgdXJpRGVidWdTdHJpbmcobVN0cmVhbXNbaWR4XS5tVXJpKS5jX3N0cigpKTsKICAgICAgICAgfQogICAgICAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CiAgICAgICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOwpAQCAtMjEzOCw3ICsyMTM4LDcgQEAKICAgICAgICAgICAgIEFMT0dWKCJzdG9wcGluZyBuZXdVcmkgPSAlcyIsIG5ld1VyaS5jX3N0cigpKTsKICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkobmV3VXJpKTsKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIG5ld1VyaTogJXMiLCBuZXdVcmkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgZmluZCBmZXRjaGVyIGZvciBuZXdVcmk6ICVzIiwgdXJpRGVidWdTdHJpbmcobmV3VXJpKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZldGNoZXJJbmZvICZpbmZvID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpbmRleCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAppbmRleCA5NzVlMmI1Li5jYjk3YTNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKQEAgLTcwNiw2ICs3MDYsMTIgQEAKICAgICAgICAgKytsaW5lTm87CiAgICAgfQogCisgICAgLy8gcGxheWxpc3QgaGFzIG5vIGl0ZW0sIHdvdWxkIGNhdXNlIGV4Y2VwdGlvbgorICAgIGlmIChtSXRlbXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoInBsYXlsaXN0IGhhcyBubyBpdGVtIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCiAgICAgLy8gZXJyb3IgY2hlY2tpbmcgb2YgYWxsIGZpZWxkcyB0aGF0J3MgcmVxdWlyZWQgdG8gYXBwZWFyIG9uY2UKICAgICAvLyAoY3VycmVudGx5IG9ubHkgY2hlY2tpbmcgInRhcmdldC1kdXJhdGlvbiIpLCBhbmQKICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBwbGF5bGlzdCBwcm9wZXJ0aWVzIChlZy4gbVRhcmdldER1cmF0aW9uVXMpCkBAIC0xMTk5LDggKzEyMDUsNyBAQAogICAgICAgICAgICAgaWYgKHZhbC5zaXplKCkgPCAyCiAgICAgICAgICAgICAgICAgICAgIHx8IHZhbC5jX3N0cigpWzBdICE9ICciJwogICAgICAgICAgICAgICAgICAgICB8fCB2YWwuY19zdHIoKVt2YWwuc2l6ZSgpIC0gMV0gIT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIHF1b3RlZCBzdHJpbmcgZm9yIFVSSSwgZ290ICclcycgaW5zdGVhZC4iLAotICAgICAgICAgICAgICAgICAgICAgIHZhbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyBmb3IgVVJJLiIpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTEzOTEsNiArMTM5NiwxOSBAQAogICAgICAgICBjYXNlICdRRE1DJzoKICAgICAgICAgY2FzZSAndWxhdyc6CiAgICAgICAgIGNhc2UgJ3ZkdmEnOgorICAgICAgICBjYXNlICdhYy00JzoKKyAgICAgICAgY2FzZSAnT3B1cyc6CisgICAgICAgIGNhc2UgJ2EzZHMnOgorICAgICAgICBjYXNlICdkdHMrJzoKKyAgICAgICAgY2FzZSAnZHRzLSc6CisgICAgICAgIGNhc2UgJ2R0c3gnOgorICAgICAgICBjYXNlICdkdHN5JzoKKyAgICAgICAgY2FzZSAnZWMrMyc6CisgICAgICAgIGNhc2UgJ21oYTEnOgorICAgICAgICBjYXNlICdtaGEyJzoKKyAgICAgICAgY2FzZSAnbWhtMSc6CisgICAgICAgIGNhc2UgJ21obTInOgorICAgICAgICBjYXNlICdzZXZzJzoKICAgICAgICAgICAgIHJldHVybiAhc3RyY21wKCJhdWRpbyIsIHR5cGUpOwogCiAgICAgICAgIGNhc2UgJ2F2YzEnOgpAQCAtMTQzOSw2ICsxNDU3LDM1IEBACiAgICAgICAgIGNhc2UgJ3RnYSAnOgogICAgICAgICBjYXNlICd0aWZmJzoKICAgICAgICAgY2FzZSAnV1JMRSc6CisgICAgICAgIGNhc2UgJ2EzZDEnOgorICAgICAgICBjYXNlICdhM2QyJzoKKyAgICAgICAgY2FzZSAnYTNkMyc6CisgICAgICAgIGNhc2UgJ2EzZDQnOgorICAgICAgICBjYXNlICdhdmMzJzoKKyAgICAgICAgY2FzZSAnYXZjNCc6CisgICAgICAgIGNhc2UgJ2R2YTEnOgorICAgICAgICBjYXNlICdkdmF2JzoKKyAgICAgICAgY2FzZSAnZHZoMSc6CisgICAgICAgIGNhc2UgJ2R2aGUnOgorICAgICAgICBjYXNlICdoZXYxJzoKKyAgICAgICAgY2FzZSAnaGV2Mic6CisgICAgICAgIGNhc2UgJ2h2YzEnOgorICAgICAgICBjYXNlICdodmMyJzoKKyAgICAgICAgY2FzZSAnaHZ0MSc6CisgICAgICAgIGNhc2UgJ2xoZTEnOgorICAgICAgICBjYXNlICdsaHQxJzoKKyAgICAgICAgY2FzZSAnbGh2MSc6CisgICAgICAgIGNhc2UgJ21qcGcnOgorICAgICAgICBjYXNlICdtdmMzJzoKKyAgICAgICAgY2FzZSAnbXZjNCc6CisgICAgICAgIGNhc2UgJ212ZDEnOgorICAgICAgICBjYXNlICdtdmQyJzoKKyAgICAgICAgY2FzZSAnbXZkMyc6CisgICAgICAgIGNhc2UgJ212ZDQnOgorICAgICAgICBjYXNlICdydjYwJzoKKyAgICAgICAgY2FzZSAnc3ZjMic6CisgICAgICAgIGNhc2UgJ3ZwMDgnOgorICAgICAgICBjYXNlICd2cDA5JzoKICAgICAgICAgICAgIHJldHVybiAhc3RyY21wKCJ2aWRlbyIsIHR5cGUpOwogCiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAppbmRleCA1NjJjNjI1Li5kMTUzNTk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKQEAgLTM2NSwxMCArMzY1LDEwIEBACiAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfTk9UX0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CiAgICAgICAgIH0gZWxzZSBpZiAoZXJyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmZXRjaCBjaXBoZXIga2V5IGZyb20gJyVzJy4iLCBrZXlVUkkuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIGNpcGhlciBrZXkgZnJvbSAnJXMnLiIsIHVyaURlYnVnU3RyaW5nKGtleVVSSSkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgIH0gZWxzZSBpZiAoa2V5LT5zaXplKCkgIT0gMTYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJrZXkgZmlsZSAnJXMnIHdhc24ndCAxNiBieXRlcyBpbiBzaXplLiIsIGtleVVSSS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJrZXkgZmlsZSAnJXMnIHdhc24ndCAxNiBieXRlcyBpbiBzaXplLiIsIHVyaURlYnVnU3RyaW5nKGtleVVSSSkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKQEAgLTEzNjYsNyArMTM2Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGJ5dGVzUmVhZDsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggLnRzIHNlZ21lbnQgYXQgdXJsICclcyciLCB1cmkuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIC50cyBzZWdtZW50IGF0IHVybCAnJXMnIiwgdXJpRGVidWdTdHJpbmcodXJpKS5jX3N0cigpKTsKICAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKaW5kZXggZjlmOGEzZC4uNzE1MWQwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKQEAgLTMsNiArMywxMCBAQAogCiAgICAgc3JjczogWyJJRDMuY3BwIl0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAppbmRleCAwODU2MDhiLi43OTJhNjhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvSUQzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC01Niw2ICs1OCw1NSBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lbW9yeVNvdXJjZSk7CiB9OwogCitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VVbndyYXBwZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyKSB7CisgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2VoZWxwZXI7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gT0s7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUoc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICogLyp1cmlTdHJpbmcqLywgc2l6ZV90IC8qYnVmZmVyU2l6ZSovKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKK307CisKKworSUQzOjpJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyLCBib29sIGlnbm9yZVYxLCBvZmY2NF90IG9mZnNldCkKKyAgICA6IG1Jc1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtRmlyc3RGcmFtZU9mZnNldCgwKSwKKyAgICAgIG1WZXJzaW9uKElEM19VTktOT1dOKSwKKyAgICAgIG1SYXdTaXplKDApIHsKKyAgICBEYXRhU291cmNlVW53cmFwcGVyIHNvdXJjZShzb3VyY2VoZWxwZXIpOworICAgIG1Jc1ZhbGlkID0gcGFyc2VWMigmc291cmNlLCBvZmZzZXQpOworCisgICAgaWYgKCFtSXNWYWxpZCAmJiAhaWdub3JlVjEpIHsKKyAgICAgICAgbUlzVmFsaWQgPSBwYXJzZVYxKCZzb3VyY2UpOworICAgIH0KK30KKwogSUQzOjpJRDMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSwgb2ZmNjRfdCBvZmZzZXQpCiAgICAgOiBtSXNWYWxpZChmYWxzZSksCiAgICAgICBtRGF0YShOVUxMKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAppbmRleCBhOTI0MTk3Li44YjIwMTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC01MSwxMiArNTEsNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldEJhbmR3aWR0aEhpc3RvcnlTaXplKHNpemVfdCBudW1IaXN0b3J5SXRlbXMpOwogCi0gICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZyk7Ci0gICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCk7Ci0gICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpOwotCiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbU5hbWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKaW5kZXggN2MyMzkxZS4uNWU0MzNlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCkBAIC0yNCw2ICsyNCw3IEBACiAKIGNsYXNzIERhdGFTb3VyY2VCYXNlOwogY2xhc3MgU3RyaW5nODsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiAKIHN0cnVjdCBJRDMgewogICAgIGVudW0gVmVyc2lvbiB7CkBAIC0zNSw2ICszNiw3IEBACiAgICAgICAgIElEM19WMl80LAogICAgIH07CiAKKyAgICBleHBsaWNpdCBJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBib29sIGlnbm9yZVYxID0gZmFsc2UsIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7CiAgICAgZXhwbGljaXQgSUQzKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSwgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKICAgICBJRDMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSk7CiAgICAgfklEMygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKaW5kZXggZjQzOWExYy4uNTk2ZWZiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCkBAIC0zNyw2ICszNyw4IEBACiAKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKwogICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CkBAIC01MSw2ICs1Myw4IEBACiAgICAgICAgIHJldHVybiBtTmFtZTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplKTsKKwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogICAgIHNpemVfdCBjYWNoZWRTaXplKCk7CkBAIC0xMzUsNyArMTM5LDcgQEAKICAgICBzc2l6ZV90IHJlYWRJbnRlcm5hbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHNlZWtJbnRlcm5hbF9sKG9mZjY0X3Qgb2Zmc2V0KTsKIAotICAgIHNpemVfdCBhcHByb3hEYXRhUmVtYWluaW5nX2woc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdDsKKyAgICBzaXplX3QgYXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZjY0X3Qgb2Zmc2V0LCBzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0OwogCiAgICAgdm9pZCByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCiAgICAgICAgICAgICBib29sIGlnbm9yZUxvd1dhdGVyVGhyZXNob2xkID0gZmFsc2UsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IGMyODY1MTYuLjY0ZGNhNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgQ29sb3JDb252ZXJ0ZXIgKm1Db252ZXJ0ZXI7CiAgICAgWVVWTW9kZSBtWVVWTW9kZTsKICAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OworICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0LCBtU3RyaWRlOwogICAgIGludDMyX3QgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BSaWdodCwgbUNyb3BCb3R0b207CiAgICAgaW50MzJfdCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKICAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDFhNDRlMWYuLmM1MDY3N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0yNiw3ICsyNiw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIERhdGFTb3VyY2U7Ci1jbGFzcyBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBJbWFnZURlY29kZXI7CiBzdHJ1Y3QgRnJhbWVSZWN0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA5N2QxNWE3Li45ZDQ2ZDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0xMzcsNiArMTM3LDcgQEAKICAgICAgICAga1doYXRPTVhEaWVkICAgICAgICAgICAgICAgICA9ICdPTVhkJywKICAgICAgICAga1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSAgICA9ICdyZWxDJywKICAgICAgICAga1doYXRGb3JjZVN0YXRlVHJhbnNpdGlvbiAgICA9ICdmc3R0JywKKyAgICAgICAga1doYXRDaGVja0lmU3R1Y2sgICAgICAgICAgICA9ICdDc3RrJywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0yMzYsNiArMjM3LDggQEAKICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgbUxhc3ROYXRpdmVXaW5kb3dDcm9wOwogICAgIGludDMyX3QgbUxhc3ROYXRpdmVXaW5kb3dEYXRhU3BhY2U7CiAgICAgSERSU3RhdGljSW5mbyBtTGFzdEhEUlN0YXRpY0luZm87CisgICAgc3A8QUJ1ZmZlcj4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXI7CisgICAgc3A8QUJ1ZmZlcj4gbUxhc3RIZHIxMFBsdXNCdWZmZXI7CiAgICAgc3A8QU1lc3NhZ2U+IG1Db25maWdGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKQEAgLTI4OSw2ICsyOTIsNyBAQAogCiAgICAgT01YX0lOREVYVFlQRSBtRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleDsKICAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleDsKKyAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleDsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxBQ29kZWNCdWZmZXJDaGFubmVsPiBtQnVmZmVyQ2hhbm5lbDsKIApAQCAtNDIzLDYgKzQyNywxMSBAQAogICAgIC8vIHVuc3BlY2lmaWVkIHZhbHVlcy4KICAgICB2b2lkIG9uRGF0YVNwYWNlQ2hhbmdlZChhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENvbG9yQXNwZWN0cyAmYXNwZWN0cyk7CiAKKyAgICAvLyBub3RpZmllcyB0aGUgY29kZWMgdGhhdCB0aGUgY29uZmlnIHdpdGggfGNvbmZpZ0luZGV4fCBoYXMgY2hhbmdlZCwgdGhlIHZhbHVlCisgICAgLy8gY2FuIGJlIHF1ZXJpZWQgYnkgT01YIGdldENvbmZpZywgYW5kIHRoZSBjb25maWcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIG5leHQKKyAgICAvLyBvdXRwdXQgYnVmZmVyIG5vdGlmaWVkIGFmdGVyIHRoaXMgY2FsbGJhY2suCisgICAgdm9pZCBvbkNvbmZpZ1VwZGF0ZShPTVhfSU5ERVhUWVBFIGNvbmZpZ0luZGV4KTsKKwogICAgIC8vIGdldHMgaW5kZXggb3Igc2V0cyBpdCB0byAwIG9uIGVycm9yLiBSZXR1cm5zIGVycm9yIGZyb20gY29kZWMuCiAgICAgc3RhdHVzX3QgaW5pdERlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KCk7CiAKQEAgLTQzNCwxMiArNDQzLDIyIEBACiAgICAgLy8gc2V0cyB8cGFyYW1zfC4gUmV0dXJucyB0aGUgY29kZWMgZXJyb3IuCiAgICAgc3RhdHVzX3Qgc2V0SERSU3RhdGljSW5mbyhjb25zdCBEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMgJnBhcmFtcyk7CiAKKyAgICAvLyBzZXRzIHxoZHIxMFBsdXNJbmZvfC4gUmV0dXJucyB0aGUgY29kZWMgZXJyb3IuCisgICAgc3RhdHVzX3Qgc2V0SGRyMTBQbHVzSW5mbyhjb25zdCBzcDxBQnVmZmVyPiAmaGRyMTBQbHVzSW5mbyk7CisKICAgICAvLyBnZXRzIHxwYXJhbXN8LiBSZXR1cm5zIHRoZSBjb2RlYyBlcnJvci4KICAgICBzdGF0dXNfdCBnZXRIRFJTdGF0aWNJbmZvKERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKTsKIAogICAgIC8vIGdldHMgSERSIHN0YXRpYyBpbmZvcm1hdGlvbiBmb3IgdGhlIHZpZGVvIGVuY29kZXIvZGVjb2RlciBwb3J0IGFuZCBzZXRzIHRoZW0gaW50byB8Zm9ybWF0fC4KICAgICBzdGF0dXNfdCBnZXRIRFJTdGF0aWNJbmZvRm9yVmlkZW9Db2RlYyhPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCisgICAgLy8gZ2V0cyBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgcGFyYW1zLiBJZiB8cGFyYW1TaXplVXNlZHwgaXMgemVybywgaXQncworICAgIC8vIHBvc3NpYmxlIHRoYXQgdGhlIHJldHVybmVkIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyBvbmx5IGhhcyB0aGUKKyAgICAvLyBuUGFyYW1TaXplVXNlZCBmaWVsZCB1cGRhdGVkLCBiZWNhdXNlIHRoZSBzaXplIG9mIHRoZSBzdG9yYWdlIGlzIGluc3VmZmljaWVudC4KKyAgICAvLyBJbiB0aGlzIGNhc2UsIGdldEhEUjEwUGx1c0luZm8oKSBzaG91bGQgYmUgY2FsbGVkIGFnYWluIHdpdGggfHBhcmFtU2l6ZVVzZWR8CisgICAgLy8gc3BlY2lmaWVkIHRvIHRoZSBwcmV2aW91cyByZXR1cm5lZCB2YWx1ZS4KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIGdldEhEUjEwUGx1c0luZm8oc2l6ZV90IHBhcmFtU2l6ZVVzZWQgPSAwKTsKKwogICAgIHR5cGVkZWYgc3RydWN0IGRyY1BhcmFtcyB7CiAgICAgICAgIGludDMyX3QgZHJjQ3V0OwogICAgICAgICBpbnQzMl90IGRyY0Jvb3N0OwpAQCAtNDYwLDYgKzQ3OSw4IEBACiAKICAgICBzdGF0dXNfdCBzZXR1cEVBQzNDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKKyAgICBzdGF0dXNfdCBzZXR1cEFDNENvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKKwogICAgIHN0YXR1c190IHNlbGVjdEF1ZGlvUG9ydEZvcm1hdCgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQVVESU9fQ09ESU5HVFlQRSBkZXNpcmVkRm9ybWF0KTsKIApAQCAtNDY3LDcgKzQ4OCw4IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBHNzExQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBGbGFjQ29kZWMoCi0gICAgICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsKTsKKyAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCisgICAgICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKTsKIAogICAgIHN0YXR1c190IHNldHVwUmF3QXVkaW9Gb3JtYXQoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzLApAQCAtNDc2LDYgKzQ5OCw3IEBACiAgICAgc3RhdHVzX3Qgc2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSk7CiAgICAgc3RhdHVzX3Qgc2V0TGF0ZW5jeSh1aW50MzJfdCBsYXRlbmN5KTsKICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1ByZXNlbnRhdGlvbihpbnQzMl90IHByZXNlbnRhdGlvbklkLCBpbnQzMl90IHByb2dyYW1JZCk7CiAgICAgc3RhdHVzX3Qgc2V0T3BlcmF0aW5nUmF0ZShmbG9hdCByYXRlRmxvYXQsIGJvb2wgaXNWaWRlbyk7CiAgICAgc3RhdHVzX3QgZ2V0SW50cmFSZWZyZXNoUGVyaW9kKHVpbnQzMl90ICppbnRyYVJlZnJlc2hQZXJpb2QpOwogICAgIHN0YXR1c190IHNldEludHJhUmVmcmVzaFBlcmlvZCh1aW50MzJfdCBpbnRyYVJlZnJlc2hQZXJpb2QsIGJvb2wgaW5Db25maWd1cmUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAppbmRleCAyMDZkMzIyLi4xOGU1ZjEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCkBAIC00NCw3ICs0NCw5IEBACiAgICAgICAgICAgICB1aW50MzJfdCBvdXRTYW1wbGVSYXRlID0gMCwKICAgICAgICAgICAgIHVpZF90IHVpZCA9IC0xLAogICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCi0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX05PUk1BTCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKIApAQCAtNjgsNyArNzAsMTAgQEAKICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOwogCiAgICAgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworICAgIHN0YXR1c190IHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKIAorICAgIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9Tb3VyY2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODM3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSX0ZJTEVfU09VUkNFX0hfCisKKyNkZWZpbmUgQ0xFQVJfRklMRV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2xlYXJGaWxlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworcHVibGljOgorICAgIENsZWFyRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisgICAgLy8gQ2xlYXJGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKKyAgICBDbGVhckZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBrSXNMb2NhbEZpbGVTb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2xlYXJGaWxlU291cmNlKCk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdF9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBpbnQgbUZkOworICAgIGludDY0X3QgbU9mZnNldDsKKyAgICBpbnQ2NF90IG1MZW5ndGg7CisgICAgTXV0ZXggbUxvY2s7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nOCBtTmFtZTsKKworICAgIENsZWFyRmlsZVNvdXJjZShjb25zdCBDbGVhckZpbGVTb3VyY2UgJik7CisgICAgQ2xlYXJGaWxlU291cmNlICZvcGVyYXRvcj0oY29uc3QgQ2xlYXJGaWxlU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUl9GSUxFX1NPVVJDRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5MDdhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUl9NRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgQ0xFQVJfTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb247CisKK3N0cnVjdCBDbGVhck1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7CisgICAgQ2xlYXJNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DbGVhck1lZGlhSFRUUCgpOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OworCisgICAgQVN0cmluZyBtTGFzdFVSSTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYXN0SGVhZGVyczsKKworICAgIGJvb2wgbUNhY2hlZFNpemVWYWxpZDsKKyAgICBvZmY2NF90IG1DYWNoZWRTaXplOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2xlYXJNZWRpYUhUVFApOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUl9NRURJQV9IVFRQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKaW5kZXggNWIzNTQzZC4uNzViMGQ4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaApAQCAtMzUsMjEgKzM1LDMyIEBACiAKICAgICBib29sIGlzRHN0UkdCKCkgY29uc3Q7CiAKKyAgICB2b2lkIHNldFNyY0NvbG9yU3BhY2UodWludDMyX3Qgc3RhbmRhcmQsIHVpbnQzMl90IHJhbmdlLCB1aW50MzJfdCB0cmFuc2Zlcik7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0KAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywKLSAgICAgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwKKyAgICAgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKICAgICAgICAgICAgIHNpemVfdCBzcmNDcm9wTGVmdCwgc2l6ZV90IHNyY0Nyb3BUb3AsCiAgICAgICAgICAgICBzaXplX3Qgc3JjQ3JvcFJpZ2h0LCBzaXplX3Qgc3JjQ3JvcEJvdHRvbSwKICAgICAgICAgICAgIHZvaWQgKmRzdEJpdHMsCi0gICAgICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsCisgICAgICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsIHNpemVfdCBkc3RTdHJpZGUsCiAgICAgICAgICAgICBzaXplX3QgZHN0Q3JvcExlZnQsIHNpemVfdCBkc3RDcm9wVG9wLAogICAgICAgICAgICAgc2l6ZV90IGRzdENyb3BSaWdodCwgc2l6ZV90IGRzdENyb3BCb3R0b20pOwogCiBwcml2YXRlOgorICAgIHN0cnVjdCBDb2xvclNwYWNlIHsKKyAgICAgICAgdWludDMyX3QgbVN0YW5kYXJkOworICAgICAgICB1aW50MzJfdCBtUmFuZ2U7CisgICAgICAgIHVpbnQzMl90IG1UcmFuc2ZlcjsKKworICAgICAgICBib29sIGlzQnQ3MDkoKTsKKyAgICAgICAgYm9vbCBpc0pwZWcoKTsKKyAgICB9OworCiAgICAgc3RydWN0IEJpdG1hcFBhcmFtcyB7CiAgICAgICAgIEJpdG1hcFBhcmFtcygKICAgICAgICAgICAgICAgICB2b2lkICpiaXRzLAotICAgICAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGNyb3BMZWZ0LCBzaXplX3QgY3JvcFRvcCwKICAgICAgICAgICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSwKICAgICAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZyb21hdCk7CkBAIC02NSw2ICs3Niw3IEBACiAgICAgfTsKIAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1TcmNGb3JtYXQsIG1Ec3RGb3JtYXQ7CisgICAgQ29sb3JTcGFjZSBtU3JjQ29sb3JTcGFjZTsKICAgICB1aW50OF90ICptQ2xpcDsKIAogICAgIHVpbnQ4X3QgKmluaXRDbGlwKCk7CkBAIC03OCw2ICs5MCw5IEBACiAgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVigKICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CiAKKyAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hclVzZUxpYllVVigKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwUGxhbmFyMTYoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmN2E0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfSF8KKworI2RlZmluZSBEQVRBX1NPVVJDRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmc4OworCitjbGFzcyBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBEYXRhU291cmNlKCkgOiBtV3JhcHBlcihOVUxMKSB7fQorCisgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KKyAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiPHVuc3BlY2lmaWVkPiIpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCAvKm9mZnNldCovKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLyBmb3IgRFJNCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSBmaW5hbCB7CisgICAgICAgIGludCByZXQgPSBzbnByaW50Zih1cmlTdHJpbmcsIGJ1ZmZlclNpemUsICIlcyIsIGdldFVyaSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmV0ID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICBDRGF0YVNvdXJjZSAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ0RhdGFTb3VyY2UoKTsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPnJlYWRBdCA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSAtPiBzc2l6ZV90IHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0U2l6ZSA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCAqc2l6ZSkgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+Z2V0U2l6ZShzaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmZsYWdzID0gW10odm9pZCAqaGFuZGxlKSAtPiB1aW50MzJfdCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5mbGFncygpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0VXJpID0gW10odm9pZCAqaGFuZGxlLCBjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPmdldFVyaSh1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHsKKyAgICAgICAgZGVsZXRlIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVdyYXBwZXI7CisgICAgRGF0YVNvdXJjZShjb25zdCBEYXRhU291cmNlICYpOworICAgIERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNWI4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfQkFTRV9IXworCisjZGVmaW5lIERBVEFfU09VUkNFX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlIHsKK3B1YmxpYzoKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAga1dhbnRzUHJlZmV0Y2hpbmcgICAgICA9IDEsCisgICAgICAgIGtTdHJlYW1lZEZyb21Mb2NhbEhvc3QgPSAyLAorICAgICAgICBrSXNDYWNoaW5nRGF0YVNvdXJjZSAgID0gNCwKKyAgICAgICAga0lzSFRUUEJhc2VkU291cmNlICAgICA9IDgsCisgICAgICAgIGtJc0xvY2FsRmlsZVNvdXJjZSAgICAgPSAxNiwKKyAgICB9OworCisgICAgRGF0YVNvdXJjZUJhc2UoKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgorICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCk7CisgICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50CisgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKKyAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOworCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOworCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCAvKm9mZnNldCovLCBvZmY2NF90ICogLypzaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VCYXNlKCkge30KKworcHJpdmF0ZToKKyAgICBEYXRhU291cmNlQmFzZShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKKyAgICBEYXRhU291cmNlQmFzZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCmluZGV4IDg2MDQ4OTAuLmI2MTBlZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCkBAIC0yMCw0NyArMjAsMjkgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBGaWxlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBDbGVhckZpbGVTb3VyY2UgewogcHVibGljOgogICAgIEZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogICAgIC8vIEZpbGVTb3VyY2UgdGFrZXMgb3duZXJzaGlwIGFuZCB3aWxsIGNsb3NlIHRoZSBmZAogICAgIEZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBrSXNMb2NhbEZpbGVTb3VyY2U7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKTsKIAotICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQogICAgIHN0YXRpYyBib29sIHJlcXVpcmVzRHJtKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyICptaW1lKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZpbGVTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBpbnQgbUZkOwotICAgIGludDY0X3QgbU9mZnNldDsKLSAgICBpbnQ2NF90IG1MZW5ndGg7Ci0gICAgTXV0ZXggbUxvY2s7Ci0gICAgU3RyaW5nOCBtTmFtZTsKLQogICAgIC8qZm9yIERSTSovCiAgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CkBAIC02OCw3ICs1MCw3IEBACiAgICAgc3NpemVfdCBtRHJtQnVmU2l6ZTsKICAgICB1bnNpZ25lZCBjaGFyICptRHJtQnVmOwogCi0gICAgc3NpemVfdCByZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzc2l6ZV90IHJlYWRBdERSTV9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBGaWxlU291cmNlKGNvbnN0IEZpbGVTb3VyY2UgJik7CiAgICAgRmlsZVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IEZpbGVTb3VyY2UgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmgKaW5kZXggZjBlYmQ0OC4uYjgzYTk1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBJTlRFUkZBQ0VfVVRJTFNfSF8KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAppbmRleCBmMTg5NDBkLi44MDMxNTVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCkBAIC0xMTAsNiArMTEwLDcgQEAKICAgICB1aW50MzJfdCBtSW50ZXJsZWF2ZUR1cmF0aW9uVXM7CiAgICAgaW50MzJfdCBtVGltZVNjYWxlOwogICAgIGludDY0X3QgbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzOyAvLyBTdGFydCB0aW1lIG9mZnNldCB3aGVuIEIgRnJhbWVzIGFyZSBwcmVzZW50CiAgICAgaW50IG1MYXRpdHVkZXgxMDAwMDsKICAgICBpbnQgbUxvbmdpdHVkZXgxMDAwMDsKICAgICBib29sIG1BcmVHZW9UYWdzQXZhaWxhYmxlOwpAQCAtMTI5LDYgKzEzMCw3IEBACiAKICAgICB2b2lkIHNldFN0YXJ0VGltZXN0YW1wVXMoaW50NjRfdCB0aW1lVXMpOwogICAgIGludDY0X3QgZ2V0U3RhcnRUaW1lc3RhbXBVcygpOyAgLy8gTm90IGNvbnN0CisgICAgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoKTsKICAgICBzdGF0dXNfdCBzdGFydFRyYWNrcyhNZXRhRGF0YSAqcGFyYW1zKTsKICAgICBzaXplX3QgbnVtVHJhY2tzKCk7CiAgICAgaW50NjRfdCBlc3RpbWF0ZU1vb3ZCb3hTaXplKGludDMyX3QgYml0UmF0ZSk7CkBAIC0yNTUsNyArMjU3LDkgQEAKICAgICB2b2lkIGluaXRJbnRlcm5hbChpbnQgZmQsIGJvb2wgaXNGaXJzdFNlc3Npb24pOwogCiAgICAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZXNlIG1ldGhvZHMKLSAgICBvZmY2NF90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LCBib29sIGlzRXhpZiwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pOworICAgIG9mZjY0X3QgYWRkU2FtcGxlX2woCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwKKyAgICAgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQsIHNpemVfdCAqYnl0ZXNXcml0dGVuKTsKICAgICB2b2lkIGFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAgICAgdm9pZCBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKE1lZGlhQnVmZmVyICpidWZmZXIpOwogICAgIHVpbnQxNl90IGFkZFByb3BlcnR5X2woY29uc3QgSXRlbVByb3BlcnR5ICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxZDQ5YzFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2U2M2FlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK2NsYXNzIE1lZGlhQnVmZmVyOworY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlcjsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHdpbGwgdXNlIHNoYXJlZCBtZW1vcnkuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtVGhyZXNob2xkID0gNjQgKiAxMDI0OworCisgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQorICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKHNpemVfdCBzaXplKTsKKworICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgTWVkaWFCdWZmZXIoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbSkgOgorICAgICAgICBNZWRpYUJ1ZmZlcigodWludDhfdCAqKW1lbS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCBtZW0tPnNpemUoKSkgeworICAgICAgICAvLyBkZWxlZ2F0ZSBhbmQgb3ZlcnJpZGUgbU1lbW9yeQorICAgICAgICBtTWVtb3J5ID0gbWVtOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOworCisgICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgorICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCisgICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKTsKKworICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKTsKKworICAgIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCk7CisKKyAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCk7CisKKyAgICAvLyBzdW0gb2YgbG9jYWxSZWZjb3VudCgpIGFuZCByZW1vdGVSZWZjb3VudCgpCisgICAgLy8gUmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcHJveGltYXRlIHVubGVzcyB0aGUgcmVzdWx0IHByZWNsdWRlcyBjb25jdXJyZW50IGFjY2Vzc2VzLgorICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbG9jYWxSZWZjb3VudCgpICsgcmVtb3RlUmVmY291bnQoKTsKKyAgICB9CisKKyAgICAvLyBSZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwcm94aW1hdGUgdW5sZXNzIHRoZSByZXN1bHQgcHJlY2x1ZGVzIGNvbmN1cnJlbnQgYWNjZXNzZXMuCisgICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgeworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOworICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCisgICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCisjZWxzZQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCisgICAgaW50IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5hZGRSZW1vdGVSZWZjb3VudCh2YWx1ZSk7CisjZWxzZQorICAgICAgICAodm9pZCkgdmFsdWU7CisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgfQorCisgICAgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc0RlYWRPYmplY3QobU1lbW9yeSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNEZWFkT2JqZWN0KGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnkpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICBpZiAobWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1lbW9yeS0+cG9pbnRlcigpKS0+aXNEZWFkT2JqZWN0KCk7CisjZWxzZQorICAgICAgICAodm9pZCkgbWVtb3J5OworICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBTdGlja3kgb24gZW5hYmxpbmcgb2Ygc2hhcmVkIG1lbW9yeSBNZWRpYUJ1ZmZlcnMuIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlCisgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgTWVkaWFCdWZmZXJzLCBidXQgd2UgZW5hYmxlIHRoaXMgZm9yIHRob3NlIHByb2Nlc3NlcworICAgIC8vIHRoYXQgZXhwb3J0IE1lZGlhQnVmZmVycy4KKyAgICBzdGF0aWMgdm9pZCB1c2VTaGFyZWRNZW1vcnkoKSB7CisgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICZtVXNlU2hhcmVkTWVtb3J5LCAoaW50X2xlYXN0MzJfdCkxLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyB0cnVlIGlmIE1lZGlhQnVmZmVyIGlzIG9ic2VydmVkIChwYXJ0IG9mIGEgTWVkaWFCdWZmZXJHcm91cCkuCisgICAgaW5saW5lIGJvb2wgaXNPYnNlcnZlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PYnNlcnZlciAhPSBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyKCk7CisKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIGZyaWVuZCBjbGFzcyBPTVhEZWNvZGVyOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOworCisgICAgLy8gRm9yIHVzZSBieSBPTVhEZWNvZGVyLCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSAxLCBkcm9wIHJlZmVyZW5jZQorICAgIC8vIGNvdW50IHRvIDAgd2l0aG91dCBzaWduYWxsaW5nIHRoZSBvYnNlcnZlci4KKyAgICB2b2lkIGNsYWltKCk7CisKKyAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICptT2JzZXJ2ZXI7CisgICAgc3RkOjphdG9taWM8aW50PiBtUmVmQ291bnQ7CisKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbVNpemUsIG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoOworICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CisKKyAgICBib29sIG1Pd25zRGF0YTsKKworICAgIE1ldGFEYXRhQmFzZSogbU1ldGFEYXRhOworCisgICAgc3RhdGljIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVVzZVNoYXJlZE1lbW9yeTsKKworICAgIE1lZGlhQnVmZmVyKGNvbnN0IE1lZGlhQnVmZmVyICYpOworICAgIE1lZGlhQnVmZmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXIgJik7CisKKyAgICAvLyBTaGFyZWRDb250cm9sIGJsb2NrIGF0IHRoZSBzdGFydCBvZiBJTWVtb3J5LgorICAgIHN0cnVjdCBTaGFyZWRDb250cm9sIHsKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBGTEFHX0RFQURfT0JKRUNUID0gKDEgPDwgMCksCisgICAgICAgIH07CisKKyAgICAgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKKyAgICAgICAgaW5saW5lIGludDMyX3QgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGludDMyX3QgZ2V0UmVtb3RlUmVmY291bnQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVJlbW90ZVJlZmNvdW50LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpICYgRkxBR19ERUFEX09CSkVDVCkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldERlYWRPYmplY3QoKSB7CisgICAgICAgICAgICAodm9pZClzdGQ6OmF0b21pY19mZXRjaF9vcl9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpRkxBR19ERUFEX09CSkVDVCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gQ2F1dGlvbjogYXRvbWljX2ludF9mYXN0MzJfdCBpcyA2NCBiaXRzIG9uIExQNjQuCisgICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbUZsYWdzOworICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1SZW1vdGVSZWZjb3VudDsKKyAgICAgICAgaW50MzJfdCB1bnVzZWRbNl0gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpOyAvLyBhZGRpdGlvbmFsIGJ1ZmZlciBzcGFjZQorICAgIH07CisKKyAgICBpbmxpbmUgU2hhcmVkQ29udHJvbCAqZ2V0U2hhcmVkQ29udHJvbCgpIGNvbnN0IHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpOworI2Vsc2UKKyAgICAgICAgIHJldHVybiBudWxscHRyOworI2VuZGlmCisgICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggODBlNDliMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2JmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfQkFTRV9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9CQVNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CisKK2NsYXNzIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgeworcHVibGljOgorICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQorICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSA9IDA7CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJPYnNlcnZlcihjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOworICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOworfTsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgTWVkaWFCdWZmZXJCYXNlICpDcmVhdGUoc2l6ZV90IHNpemUpOworCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIC8vIEluY3JlbWVudHMgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudC4KKyAgICAvLyBVc2Ugb25seSB3aGVuIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LgorICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkICpkYXRhKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCkgPSAwOworCisgICAgLy8gQ2xlYXJzIG1ldGEgZGF0YSBhbmQgcmVzZXRzIHRoZSByYW5nZSB0byB0aGUgZnVsbCBleHRlbnQuCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgICAgIGRlbGV0ZSBtV3JhcHBlcjsKKyAgICAgICAgZGVsZXRlIG1Gb3JtYXQ7CisgICAgfTsKKworICAgIENNZWRpYUJ1ZmZlciAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ01lZGlhQnVmZmVyOworICAgICAgICBtV3JhcHBlci0+aGFuZGxlID0gdGhpczsKKworICAgICAgICBtV3JhcHBlci0+cmVsZWFzZSA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gdm9pZCB7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+cmVsZWFzZSgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5kYXRhID0gW10odm9pZCAqaGFuZGxlKSAtPiB2b2lkICogeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5kYXRhKCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPnNpemUgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHNpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnNpemUoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+cmFuZ2Vfb2Zmc2V0ID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+cmFuZ2VfbGVuZ3RoID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+c2V0X3JhbmdlID0gW10odm9pZCAqaGFuZGxlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+c2V0X3JhbmdlKG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+bWV0YV9kYXRhID0gW10odm9pZCAqaGFuZGxlKSAtPiBBTWVkaWFGb3JtYXQqIHsKKyAgICAgICAgICAgIGlmICgoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+bUZvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5tRm9ybWF0ID0gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPm1Gb3JtYXQ7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBNZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgICAgIG1XcmFwcGVyID0gbnVsbHB0cjsKKyAgICAgICAgbUZvcm1hdCA9IG51bGxwdHI7CisgICAgfQorcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXIgKm1XcmFwcGVyOworICAgIEFNZWRpYUZvcm1hdCAqbUZvcm1hdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwOWIzZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2MjExNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXJHcm91cCA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCA9IDApOworCisgICAgLy8gY3JlYXRlIGEgbWVkaWEgYnVmZmVyIGdyb3VwIHdpdGggcHJlYWxsb2NhdGVkIGJ1ZmZlcnMKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApOworCisgICAgfk1lZGlhQnVmZmVyR3JvdXAoKTsKKworICAgIHZvaWQgYWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBib29sIGhhc19idWZmZXJzKCk7CisKKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyBmYWxzZSwgaXQgYmxvY2tzIHVudGlsIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSBhbmQKKyAgICAvLyBwYXNzZXMgaXQgdG8gdGhlIGNhbGxlciBpbiAqYnVmZmVyLCB3aGlsZSByZXR1cm5pbmcgT0suCisgICAgLy8gVGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyB0cnVlIGFuZCBhIGJ1ZmZlciBpcyBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLAorICAgIC8vIGJ1ZmZlciBpcyBzZXQgdG8gTlVMTCBhbmQgaXQgcmV0dXJucyBXT1VMRF9CTE9DSy4KKyAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzIDAsIGFueSBmcmVlIE1lZGlhQnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8gSWYgcmVxdWVzdGVkU2l6ZSBpcyA+IDAsIHRoZSByZXR1cm5lZCBNZWRpYUJ1ZmZlciBzaG91bGQgaGF2ZSBidWZmZXIKKyAgICAvLyBzaXplIG9mIGF0IGxlYXN0IHJlcXVzdGVkU2l6ZS4KKyAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZyA9IGZhbHNlLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSA9IDApOworCisgICAgc2l6ZV90IGJ1ZmZlcnMoKSBjb25zdDsKKworICAgIC8vIElmIGJ1ZmZlciBpcyBudWxscHRyLCBoYXZlIGFjcXVpcmVfYnVmZmVyKCkgY2hlY2sgZm9yIHJlbW90ZSByZWxlYXNlLgorICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKworICAgICAgICBtV3JhcHBlciA9IG5ldyBDTWVkaWFCdWZmZXJHcm91cDsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPmFkZF9idWZmZXIgPSBbXSh2b2lkICpoYW5kbGUsIHNpemVfdCBzaXplKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoc2l6ZSk7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmFkZF9idWZmZXIoYnVmKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+aW5pdCA9IFtdKHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpIC0+IGJvb2wgeworICAgICAgICAgICAgKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5pbml0KGJ1ZmZlcnMsIGJ1ZmZlcl9zaXplLCBncm93dGhMaW1pdCk7CisgICAgICAgICAgLy8gICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+bVdyYXBwZXItPmluaXQgPSBudWxscHRyOyAvLyBlbmZvcmNlIGNhbGwtb25jZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmFjcXVpcmVfYnVmZmVyID0gW10odm9pZCAqaGFuZGxlLAorICAgICAgICAgICAgICAgIENNZWRpYUJ1ZmZlciAqKmJ1ZiwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYWNxdWlyZWRCdWYgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5hY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgJmFjcXVpcmVkQnVmLCBub25CbG9ja2luZywgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIGFjcXVpcmVkQnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqYnVmID0gYWNxdWlyZWRCdWYtPndyYXAoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmhhc19idWZmZXJzID0gW10odm9pZCAqaGFuZGxlKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmhhc19idWZmZXJzKCk7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqbVdyYXBwZXI7CisgICAgc3RydWN0IEludGVybmFsRGF0YTsKKyAgICBJbnRlcm5hbERhdGEgKm1JbnRlcm5hbDsKKworICAgIE1lZGlhQnVmZmVyR3JvdXAoY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKKyAgICB2b2lkIGluaXQoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0dST1VQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCmluZGV4IDNlZjRjMGUuLjJkY2E1YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC0zMSw2ICszMSwyMSBAQAogY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUgPSAweDEwMDAwOwogY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCAgICAgPSAweDgwMDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0FWQ1Byb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUJhc2VsaW5lOiAgICAgICAgICAgIHJldHVybiAiQmFzZWxpbmUiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVNYWluOiAgICAgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVFeHRlbmRlZDogICAgICAgICAgICByZXR1cm4gIkV4dGVuZGVkIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDogICAgICAgICAgICAgICAgcmV0dXJuICJIaWdoIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDEwOiAgICAgICAgICAgICAgcmV0dXJuICJIaWdoMTAiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDIyOiAgICAgICAgICAgICByZXR1cm4gIkhpZ2g0MjIiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDQ0OiAgICAgICAgICAgICByZXR1cm4gIkhpZ2g0NDQiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOiByZXR1cm4gIkNvbnN0cmFpbmVkQmFzZWxpbmUiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2g6ICAgICByZXR1cm4gIkNvbnN0cmFpbmVkSGlnaCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDEgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwxYiAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMTEgICAgICA9IDB4MDQ7CkBAIC00OCw2ICs2MywzNSBAQAogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1ICAgICAgID0gMHg0MDAwOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MSAgICAgID0gMHg4MDAwOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MiAgICAgID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNiAgICAgICA9IDB4MjAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDYxICAgICAgPSAweDQwMDAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw2MiAgICAgID0gMHg4MDAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVkNMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDE6ICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsMWI6ICAgIHJldHVybiAiMWIiOworICAgICAgICBjYXNlIEFWQ0xldmVsMTE6ICAgIHJldHVybiAiMS4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDEyOiAgICByZXR1cm4gIjEuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwxMzogICAgcmV0dXJuICIxLjMiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjogICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwyMTogICAgcmV0dXJuICIyLjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjI6ICAgIHJldHVybiAiMi4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIEFWQ0xldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDMyOiAgICByZXR1cm4gIjMuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0OiAgICAgcmV0dXJuICI0IjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDQxOiAgICByZXR1cm4gIjQuMSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0MjogICAgcmV0dXJuICI0LjIiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTogICAgIHJldHVybiAiNSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw1MTogICAgcmV0dXJuICI1LjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTI6ICAgIHJldHVybiAiNS4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDY6ICAgICByZXR1cm4gIjYiOworICAgICAgICBjYXNlIEFWQ0xldmVsNjE6ICAgIHJldHVybiAiNi4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDYyOiAgICByZXR1cm4gIjYuMiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlQmFzZWxpbmUgICAgICAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nICAgICAgICAgICA9IDB4MDI7CkBAIC01OSw2ICsxMDMsMjEgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSW50ZXJsYWNlICAgICAgICAgICAgPSAweDgwOwogY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSAgICAgICAgICA9IDB4MTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0gyNjNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEgyNjNQcm9maWxlQmFzZWxpbmU6ICAgICAgICAgICByZXR1cm4gIkJhc2VsaW5lIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUgzMjBDb2Rpbmc6ICAgICAgICAgcmV0dXJuICJIMzIwQ29kaW5nIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZTogcmV0dXJuICJCYWNrd2FyZENvbXBhdGlibGUiOworICAgICAgICBjYXNlIEgyNjNQcm9maWxlSVNXVjI6ICAgICAgICAgICAgICByZXR1cm4gIklTV1YyIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUlTV1YzOiAgICAgICAgICAgICAgcmV0dXJuICJJU1dWMyI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb246ICAgIHJldHVybiAiSGlnaENvbXByZXNzaW9uIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUludGVybmV0OiAgICAgICAgICAgcmV0dXJuICJJbnRlcm5ldCI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVJbnRlcmxhY2U6ICAgICAgICAgIHJldHVybiAiSW50ZXJsYWNlIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUhpZ2hMYXRlbmN5OiAgICAgICAgcmV0dXJuICJIaWdoTGF0ZW5jeSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWwxMCAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDIwICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsMzAgICAgICA9IDB4MDQ7CkBAIC02OCw2ICsxMjcsMjAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDYwICAgICAgPSAweDQwOwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsNzAgICAgICA9IDB4ODA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfSDI2M0xldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEgyNjNMZXZlbDEwOiAgIHJldHVybiAiMTAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDIwOiAgIHJldHVybiAiMjAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDMwOiAgIHJldHVybiAiMzAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDQwOiAgIHJldHVybiAiNDAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDQ1OiAgIHJldHVybiAiNDUiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDUwOiAgIHJldHVybiAiNTAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDYwOiAgIHJldHVybiAiNjAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDcwOiAgIHJldHVybiAiNzAiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVTaW1wbGUgICAgICAgICAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlQ29yZSAgICAgICAgICAgICAgICA9IDB4MDQ7CkBAIC04NSw2ICsxNTgsMjggQEAKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUgICAgPSAweDQwMDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSAgICAgID0gMHg4MDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX01QRUc0UHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTaW1wbGU6ICAgICAgICAgICAgcmV0dXJuICJTaW1wbGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlOiAgICByZXR1cm4gIlNpbXBsZVNjYWxhYmxlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVDb3JlOiAgICAgICAgICAgICAgcmV0dXJuICJDb3JlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVNYWluOiAgICAgICAgICAgICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVOYml0OiAgICAgICAgICAgICAgcmV0dXJuICJOYml0IjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmU6ICAgcmV0dXJuICJTY2FsYWJsZVRleHR1cmUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZUZhY2U6ICAgICAgICByZXR1cm4gIlNpbXBsZUZhY2UiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZUZCQTogICAgICAgICByZXR1cm4gIlNpbXBsZUZCQSI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZDogICAgIHJldHVybiAiQmFzaWNBbmltYXRlZCI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlSHlicmlkOiAgICAgICAgICAgIHJldHVybiAiSHlicmlkIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lOiAgcmV0dXJuICJBZHZhbmNlZFJlYWxUaW1lIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVDb3JlU2NhbGFibGU6ICAgICAgcmV0dXJuICJDb3JlU2NhbGFibGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nOiAgICByZXR1cm4gIkFkdmFuY2VkQ29kaW5nIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZENvcmU6ICAgICAgcmV0dXJuICJBZHZhbmNlZENvcmUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGU6ICByZXR1cm4gIkFkdmFuY2VkU2NhbGFibGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlOiAgICByZXR1cm4gIkFkdmFuY2VkU2ltcGxlIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWwwICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDBiICAgICA9IDB4MDI7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsMSAgICAgID0gMHgwNDsKQEAgLTk2LDYgKzE5MSwyMiBAQAogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDUgICAgICA9IDB4ODA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsNiAgICAgID0gMHgxMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfTVBFRzRMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMDogICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwwYjogIHJldHVybiAiMGIiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwxOiAgIHJldHVybiAiMSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDI6ICAgcmV0dXJuICIyIjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMzogICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwzYjogIHJldHVybiAiM2IiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWw0OiAgIHJldHVybiAiNCI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDRhOiAgcmV0dXJuICI0YSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDU6ICAgcmV0dXJuICI1IjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsNjogICByZXR1cm4gIjYiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVTaW1wbGUgICAgICAgICAgICAgID0gMHgwMDsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZU1haW4gICAgICAgICAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlNDIyICAgICAgICAgICAgICAgICA9IDB4MDI7CkBAIC0xMDMsMTIgKzIxNCwzNSBAQAogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlU3BhdGlhbCAgICAgICAgICAgICA9IDB4MDQ7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVIaWdoICAgICAgICAgICAgICAgID0gMHgwNTsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHMlByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlU2ltcGxlOiAgICByZXR1cm4gIlNpbXBsZSI7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlTWFpbjogICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZTQyMjogICAgICAgcmV0dXJuICI0MjIiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNOUjogICAgICAgcmV0dXJuICJTTlIiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNwYXRpYWw6ICAgcmV0dXJuICJTcGF0aWFsIjsKKyAgICAgICAgY2FzZSBNUEVHMlByb2ZpbGVIaWdoOiAgICAgIHJldHVybiAiSGlnaCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbExMICAgICA9IDB4MDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsTUwgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyTGV2ZWxIMTQgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbEhMICAgICA9IDB4MDM7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsSFAgICAgID0gMHgwNDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHMkxldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxMTDogIHJldHVybiAiTEwiOworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxNTDogIHJldHVybiAiTUwiOworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxIMTQ6IHJldHVybiAiSDE0IjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSEw6ICByZXR1cm4gIkhMIjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSFA6ICByZXR1cm4gIkhQIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0TWFpbiAgICAgICA9IDE7CiBjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RMQyAgICAgICAgID0gMjsKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFNTUiAgICAgICAgPSAzOwpAQCAtMTIyLDE5ICsyNTYsNzAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdEVMRCAgICAgICAgPSAzOTsKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFhIRSAgICAgICAgPSA0MjsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BQUNPYmplY3QoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TWFpbjogICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEFBQ09iamVjdExDOiAgICAgICAgICAgcmV0dXJuICJMQyI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0U1NSOiAgICAgICAgICByZXR1cm4gIlNTUiI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TFRQOiAgICAgICAgICByZXR1cm4gIkxUUCI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0SEU6ICAgICAgICAgICByZXR1cm4gIkhFIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RTY2FsYWJsZTogICAgIHJldHVybiAiU2NhbGFibGUiOworICAgICAgICBjYXNlIEFBQ09iamVjdEVSTEM6ICAgICAgICAgcmV0dXJuICJFUkxDIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RFUlNjYWxhYmxlOiAgIHJldHVybiAiRVJTY2FsYWJsZSI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TEQ6ICAgICAgICAgICByZXR1cm4gIkxEIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RIRV9QUzogICAgICAgIHJldHVybiAiSEVfUFMiOworICAgICAgICBjYXNlIEFBQ09iamVjdEVMRDogICAgICAgICAgcmV0dXJuICJFTEQiOworICAgICAgICBjYXNlIEFBQ09iamVjdFhIRTogICAgICAgICAgcmV0dXJuICJYSEUiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24wID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24xID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24yID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24zID0gMHgwODsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDhMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMDogcmV0dXJuICJWMCI7CisgICAgICAgIGNhc2UgVlA4TGV2ZWxfVmVyc2lvbjE6IHJldHVybiAiVjEiOworICAgICAgICBjYXNlIFZQOExldmVsX1ZlcnNpb24yOiByZXR1cm4gIlYyIjsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMzogcmV0dXJuICJWMyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBWUDhQcm9maWxlTWFpbiA9IDB4MDE7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfVlA4UHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDhQcm9maWxlTWFpbjogICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUwID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUxID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUyID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzID0gMHgwODsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUySERSID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTNIRFIgPSAweDIwMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMkhEUjEwUGx1cyA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzSERSMTBQbHVzID0gMHg4MDAwOworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX1ZQOVByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTA6ICAgICAgICAgICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUxOiAgICAgICAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMjogICAgICAgICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTM6ICAgICAgICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUySERSOiAgICAgICAgcmV0dXJuICIySERSIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlM0hEUjogICAgICAgIHJldHVybiAiM0hEUiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTJIRFIxMFBsdXM6ICByZXR1cm4gIjJIRFJQbHVzIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlM0hEUjEwUGx1czogIHJldHVybiAiM0hEUlBsdXMiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsMSAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDExID0gMHgyOwpAQCAtMTUxLDEwICszMzYsMTEwIEBACiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDYxID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw2MiA9IDB4MjAwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDlMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDE6ICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIFZQOUxldmVsMTE6ICAgIHJldHVybiAiMS4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDI6ICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIFZQOUxldmVsMjE6ICAgIHJldHVybiAiMi4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIFZQOUxldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDQ6ICAgICByZXR1cm4gIjQiOworICAgICAgICBjYXNlIFZQOUxldmVsNDE6ICAgIHJldHVybiAiNC4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDU6ICAgICByZXR1cm4gIjUiOworICAgICAgICBjYXNlIFZQOUxldmVsNTE6ICAgIHJldHVybiAiNS4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDUyOiAgICByZXR1cm4gIjUuMiI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2OiAgICAgcmV0dXJuICI2IjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDYxOiAgICByZXR1cm4gIjYuMSI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2MjogICAgcmV0dXJuICI2LjIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMCA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMSA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMiA9IDB4MDQ7CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQVYxUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMDogICAgICAgcmV0dXJuICIwIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMTogICAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMjogICAgICAgcmV0dXJuICIyIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMiAgPSAweDE7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDIxID0gMHgyOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwyMiA9IDB4NDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMjMgPSAweDg7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMgID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMzEgPSAweDIwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwzMiA9IDB4NDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMzID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNCAgPSAweDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDEgPSAweDIwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDIgPSAweDQwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDMgPSAweDgwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNSAgPSAweDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDUxID0gMHgyMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw1MiA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNTMgPSAweDgwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYgID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNjEgPSAweDIwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw2MiA9IDB4NDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYzID0gMHg4MDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNyAgPSAweDEwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzEgPSAweDIwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzIgPSAweDQwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzMgPSAweDgwMDAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVjFMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDI6ICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIEFWMUxldmVsMjE6ICAgIHJldHVybiAiMi4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDIyOiAgICByZXR1cm4gIjIuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwyMzogICAgcmV0dXJuICIyLjMiOworICAgICAgICBjYXNlIEFWMUxldmVsMzogICAgIHJldHVybiAiMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwzMTogICAgcmV0dXJuICIzLjEiOworICAgICAgICBjYXNlIEFWMUxldmVsMzI6ICAgIHJldHVybiAiMy4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDMzOiAgICByZXR1cm4gIjMuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw0OiAgICAgcmV0dXJuICI0IjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDQxOiAgICByZXR1cm4gIjQuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw0MjogICAgcmV0dXJuICI0LjIiOworICAgICAgICBjYXNlIEFWMUxldmVsNDM6ICAgIHJldHVybiAiNC4zIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDU6ICAgICByZXR1cm4gIjUiOworICAgICAgICBjYXNlIEFWMUxldmVsNTE6ICAgIHJldHVybiAiNS4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDUyOiAgICByZXR1cm4gIjUuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw1MzogICAgcmV0dXJuICI1LjMiOworICAgICAgICBjYXNlIEFWMUxldmVsNjogICAgIHJldHVybiAiNiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw2MTogICAgcmV0dXJuICI2LjEiOworICAgICAgICBjYXNlIEFWMUxldmVsNjI6ICAgIHJldHVybiAiNi4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDYzOiAgICByZXR1cm4gIjYuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw3OiAgICAgcmV0dXJuICI3IjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDcxOiAgICByZXR1cm4gIjcuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw3MjogICAgcmV0dXJuICI3LjIiOworICAgICAgICBjYXNlIEFWMUxldmVsNzM6ICAgIHJldHVybiAiNy4zIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluICAgICAgICA9IDB4MDE7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4xMCAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpblN0aWxsICAgPSAweDA0OwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzID0gMHgyMDAwOworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0hFVkNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjogICAgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjEwOiAgICAgICAgICAgICByZXR1cm4gIk1haW4xMCI7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluU3RpbGw6ICAgICAgICAgIHJldHVybiAiTWFpblN0aWxsIjsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwOiAgICAgICAgcmV0dXJuICJNYWluMTBIRFIxMCI7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXM6ICAgIHJldHVybiAiTWFpbjEwSERSMTBQbHVzIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsMSAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDEgID0gMHgyOwpAQCAtMTgzLDYgKzQ2OCwzOCBAQAogY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw2MiA9IDB4MTAwMDAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNjIgPSAweDIwMDAwMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfSEVWQ1RpZXJMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDE6ICAgIHJldHVybiAiTWFpbiAxIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDE6ICAgIHJldHVybiAiSGlnaCAxIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDI6ICAgIHJldHVybiAiTWFpbiAyIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDI6ICAgIHJldHVybiAiSGlnaCAyIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDIxOiAgIHJldHVybiAiTWFpbiAyLjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsMjE6ICAgcmV0dXJuICJIaWdoIDIuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwzOiAgICByZXR1cm4gIk1haW4gMyI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWwzOiAgICByZXR1cm4gIkhpZ2ggMyI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwzMTogICByZXR1cm4gIk1haW4gMy4xIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDMxOiAgIHJldHVybiAiSGlnaCAzLjEiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNDogICAgcmV0dXJuICJNYWluIDQiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNDogICAgcmV0dXJuICJIaWdoIDQiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNDE6ICAgcmV0dXJuICJNYWluIDQuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw0MTogICByZXR1cm4gIkhpZ2ggNC4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDU6ICAgIHJldHVybiAiTWFpbiA1IjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDU6ICAgIHJldHVybiAiSGlnaCA1IjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDUxOiAgIHJldHVybiAiTWFpbiA1LjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNTE6ICAgcmV0dXJuICJIaWdoIDUuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw1MjogICByZXR1cm4gIk1haW4gNS4yIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDUyOiAgIHJldHVybiAiSGlnaCA1LjIiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNjogICAgcmV0dXJuICJNYWluIDYiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNjogICAgcmV0dXJuICJIaWdoIDYiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNjE6ICAgcmV0dXJuICJNYWluIDYuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw2MTogICByZXR1cm4gIkhpZ2ggNi4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDYyOiAgIHJldHVybiAiTWFpbiA2LjIiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNjI6ICAgcmV0dXJuICJIaWdoIDYuMiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlciA9IDB4MTsKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW4gPSAweDI7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVyID0gMHg0OwpAQCAtMTk0LDYgKzUxMSwyMiBAQAogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0ID0gMHgxMDA7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UgPSAweDIwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Eb2xieVZpc2lvblByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlcjogcmV0dXJuICJEdmF2UGVyIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuOiByZXR1cm4gIkR2YXZQZW4iOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZXI6IHJldHVybiAiRHZoZURlciI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbjogcmV0dXJuICJEdmhlRGVuIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyOiByZXR1cm4gIkR2aGVEdHIiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG46IHJldHVybiAiRHZoZVN0biI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aDogcmV0dXJuICJEdmhlRHRoIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiOiByZXR1cm4gIkR2aGVEdGIiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdDogIHJldHVybiAiRHZoZVN0IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2U6ICByZXR1cm4gIkR2YXZTZSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxIZDI0ICAgID0gMHgxOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbEhkMzAgICAgPSAweDI7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsRmhkMjQgICA9IDB4NDsKQEAgLTIwNCwxMCArNTM3LDM0IEBACiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkNDggICA9IDB4ODA7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkNjAgICA9IDB4MTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0RvbGJ5VmlzaW9uTGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEhkMjQ6ICByZXR1cm4gIkhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxIZDMwOiAgcmV0dXJuICJIZDMwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsRmhkMjQ6IHJldHVybiAiRmhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMDogcmV0dXJuICJGaGQzMCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEZoZDYwOiByZXR1cm4gIkZoZDYwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkMjQ6IHJldHVybiAiVWhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMDogcmV0dXJuICJVaGQzMCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDQ4OiByZXR1cm4gIlVoZDQ4IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkNjA6IHJldHVybiAiVWhkNjAiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9DQlIgPSAyOwogY29uc3RleHByIGludDMyX3QgQklUUkFURV9NT0RFX0NRID0gMDsKIGNvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9WQlIgPSAxOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0JpdHJhdGVNb2RlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEJJVFJBVEVfTU9ERV9DQlI6ICByZXR1cm4gIkNCUiI7CisgICAgICAgIGNhc2UgQklUUkFURV9NT0RFX0NROiAgIHJldHVybiAiQ1EiOworICAgICAgICBjYXNlIEJJVFJBVEVfTU9ERV9WQlI6ICByZXR1cm4gIlZCUiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NCAgICAgICAgICAgICA9IDM7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEFSR0IxNTU1ICAgICAgICAgICA9IDU7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEFSR0I0NDQ0ICAgICAgICAgICA9IDQ7CkBAIC0yNjEsNiArNjE4LDY0IEBACiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgICA9IDB4N2ZhMzBjMDA7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyID0gMHg3ZjAwMDEwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Db2xvckZvcm1hdChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NDogICAgICAgICAgICAgICByZXR1cm4gIjEyYml0UkdCNDQ0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxNmJpdEFSR0IxNTU1OiAgICAgICAgICAgICByZXR1cm4gIjE2Yml0QVJHQjE1NTUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE2Yml0QVJHQjQ0NDQ6ICAgICAgICAgICAgIHJldHVybiAiMTZiaXRBUkdCNDQ0NCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTZiaXRCR1I1NjU6ICAgICAgICAgICAgICAgcmV0dXJuICIxNmJpdEJHUjU2NSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6ICAgICAgICAgICAgICAgcmV0dXJuICIxNmJpdFJHQjU2NSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MThiaXRBUkdCMTY2NTogICAgICAgICAgICAgcmV0dXJuICIxOGJpdEFSR0IxNjY1IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOEJpdEJHUjY2NjogICAgICAgICAgICAgICByZXR1cm4gIjE4Qml0QkdSNjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOGJpdFJHQjY2NjogICAgICAgICAgICAgICByZXR1cm4gIjE4Yml0UkdCNjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOWJpdEFSR0IxNjY2OiAgICAgICAgICAgICByZXR1cm4gIjE5Yml0QVJHQjE2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Qml0QUJHUjY2NjY6ICAgICAgICAgICAgIHJldHVybiAiMjRCaXRBQkdSNjY2NiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRBUkdCMTg4NzogICAgICAgICAgICAgcmV0dXJuICIyNGJpdEFSR0IxODg3IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2OiAgICAgICAgICAgICByZXR1cm4gIjI0Qml0QVJHQjY2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Yml0QkdSODg4OiAgICAgICAgICAgICAgIHJldHVybiAiMjRiaXRCR1I4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Yml0UkdCODg4OiAgICAgICAgICAgICAgIHJldHVybiAiMjRiaXRSR0I4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI1Yml0QVJHQjE4ODg6ICAgICAgICAgICAgIHJldHVybiAiMjViaXRBUkdCMTg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBQkdSODg4ODogICAgICAgICAgICAgcmV0dXJuICIzMmJpdEFCR1I4ODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4OiAgICAgICAgICAgICByZXR1cm4gIjMyYml0QVJHQjg4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6ICAgICAgICAgICAgIHJldHVybiAiMzJiaXRCR1JBODg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0OGJpdFJHQjMzMjogICAgICAgICAgICAgICAgcmV0dXJuICI4Yml0UkdCMzMyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRDYllDclk6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNiWUNyWSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0Q3JZQ2JZOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDcllDYlkiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEwxNjogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDE2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMMjogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkwyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMMjQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkwyNCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0TDMyOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMMzIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEw0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDQiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEw4OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdE1vbm9jaHJvbWU6ICAgICAgICAgICAgICAgIHJldHVybiAiTW9ub2Nocm9tZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UmF3QmF5ZXIxMGJpdDogICAgICAgICAgICAgcmV0dXJuICJSYXdCYXllcjEwYml0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXQ6ICAgICAgICAgICAgICByZXR1cm4gIlJhd0JheWVyOGJpdCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0Y29tcHJlc3NlZDogICAgcmV0dXJuICJSYXdCYXllcjhiaXRjb21wcmVzc2VkIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSR0JBRmxleGlibGU6ICAgICAgICAgICAgICByZXR1cm4gIlJHQkFGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6ICAgICAgICAgICAgICAgcmV0dXJuICJSR0JGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0U3VyZmFjZTogICAgICAgICAgICAgICAgICAgcmV0dXJuICJTdXJmYWNlIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZQ2JZQ3I6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIllDYllDciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WUNyWUNiOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJZQ3JZQ2IiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQxMVBhY2tlZFBsYW5hcjogICAgICAgIHJldHVybiAiWVVWNDExUGFja2VkUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MTFQbGFuYXI6ICAgICAgICAgICAgICByZXR1cm4gIllVVjQxMVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0MjBGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOiAgICAgICAgcmV0dXJuICJZVVY0MjBQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6ICAgIHJldHVybiAiWVVWNDIwUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOiAgICAgICAgICAgICAgcmV0dXJuICJZVVY0MjBQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6ICAgICAgICAgIHJldHVybiAiWVVWNDIwU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyRmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0MjJGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkUGxhbmFyOiAgICAgICAgcmV0dXJuICJZVVY0MjJQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXI6ICAgIHJldHVybiAiWVVWNDIyUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyUGxhbmFyOiAgICAgICAgICAgICAgcmV0dXJuICJZVVY0MjJQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXI6ICAgICAgICAgIHJldHVybiAiWVVWNDIyU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0RmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0NDRGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0SW50ZXJsZWF2ZWQ6ICAgICAgICAgcmV0dXJuICJZVVY0NDRJbnRlcmxlYXZlZCI7CisgICAgICAgIGNhc2UgQ09MT1JfUUNPTV9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOiAgICAgcmV0dXJuICJRQ09NX1lVVjQyMFNlbWlQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX1RJX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6IHJldHVybiAiVElfWVVWNDIwUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfQWRhcHRpdmVQbGF5YmFja1tdICAgICAgID0gImFkYXB0aXZlLXBsYXliYWNrIjsKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfSW50cmFSZWZyZXNoW10gPSAiaW50cmEtcmVmcmVzaCI7CiBjb25zdGV4cHIgY2hhciBGRUFUVVJFX1BhcnRpYWxGcmFtZVtdID0gInBhcnRpYWwtZnJhbWUiOwpAQCAtMjcwLDYgKzY4NSw3IEBACiAvLyBmcm9tIE1lZGlhRm9ybWF0LmphdmEKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX1ZQOFtdID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fVlA5W10gPSAidmlkZW8veC12bmQub24yLnZwOSI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19BVjFbXSA9ICJ2aWRlby9hdjAxIjsKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX0FWQ1tdID0gInZpZGVvL2F2YyI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19IRVZDW10gPSAidmlkZW8vaGV2YyI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19NUEVHNFtdID0gInZpZGVvL21wNHYtZXMiOwpAQCAtMzI3LDYgKzc0Myw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfQklUUkFURV9NT0RFW10gPSAiYml0cmF0ZS1tb2RlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQV9TRVNTSU9OX0lEW10gPSAiY2Etc2Vzc2lvbi1pZCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0FfU1lTVEVNX0lEW10gPSAiY2Etc3lzdGVtLWlkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DQV9QUklWQVRFX0RBVEFbXSA9ICJjYS1wcml2YXRlLWRhdGEiOwogY29uc3RleHByIGNoYXIgS0VZX0NBUFRVUkVfUkFURVtdID0gImNhcHR1cmUtcmF0ZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9DT1VOVFtdID0gImNoYW5uZWwtY291bnQiOwogY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfTUFTS1tdID0gImNoYW5uZWwtbWFzayI7CkBAIC0zMzUsNiArNzUyLDcgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9TVEFOREFSRFtdID0gImNvbG9yLXN0YW5kYXJkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9UUkFOU0ZFUltdID0gImNvbG9yLXRyYW5zZmVyIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT01QTEVYSVRZW10gPSAiY29tcGxleGl0eSI7Citjb25zdGV4cHIgY2hhciBLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVEW10gPSAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9EVVJBVElPTltdID0gImR1cmF0aW9uVXMiOwogY29uc3RleHByIGNoYXIgS0VZX0ZFQVRVUkVfW10gPSAiZmVhdHVyZS0iOwogY29uc3RleHByIGNoYXIgS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUxbXSA9ICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIjsKQEAgLTM0Miw2ICs3NjAsNyBAQAogY29uc3RleHByIGNoYXIgS0VZX0dSSURfQ09MVU1OU1tdID0gImdyaWQtY29scyI7CiBjb25zdGV4cHIgY2hhciBLRVlfR1JJRF9ST1dTW10gPSAiZ3JpZC1yb3dzIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9IRFJfU1RBVElDX0lORk9bXSA9ICJoZHItc3RhdGljLWluZm8iOworY29uc3RleHByIGNoYXIgS0VZX0hEUjEwX1BMVVNfSU5GT1tdID0gImhkcjEwLXBsdXMtaW5mbyI7CiBjb25zdGV4cHIgY2hhciBLRVlfSEVJR0hUW10gPSAiaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9JX0ZSQU1FX0lOVEVSVkFMW10gPSAiaS1mcmFtZS1pbnRlcnZhbCI7CiBjb25zdGV4cHIgY2hhciBLRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0RbXSA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CkBAIC0zNTQsOCArNzczLDEwIEBACiBjb25zdGV4cHIgY2hhciBLRVlfTEFURU5DWVtdID0gImxhdGVuY3kiOwogY29uc3RleHByIGNoYXIgS0VZX0xFVkVMW10gPSAibGV2ZWwiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9CSVRfUkFURVtdID0gIm1heC1iaXRyYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfRlBTX1RPX0VOQ09ERVJbXSA9ICJtYXgtZnBzLXRvLWVuY29kZXIiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9IRUlHSFRbXSA9ICJtYXgtaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NQVhfSU5QVVRfU0laRVtdID0gIm1heC1pbnB1dC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSW10gPSAibWF4LXB0cy1nYXAtdG8tZW5jb2RlciI7CiBjb25zdGV4cHIgY2hhciBLRVlfTUFYX1dJRFRIW10gPSAibWF4LXdpZHRoIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NSU1FW10gPSAibWltZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfT1BFUkFUSU5HX1JBVEVbXSA9ICJvcGVyYXRpbmctcmF0ZSI7CkBAIC00MTAsOCArODMxLDEwIEBACiBjb25zdGV4cHIgaW50MzJfdCBJTkZPX1RSWV9BR0FJTl9MQVRFUiAgICAgICAgPSAtMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVQgICAgICAgICAgICAgICA9IDE7CiBjb25zdGV4cHIgaW50MzJfdCBWSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUX1dJVEhfQ1JPUFBJTkcgPSAyOworY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRVtdID0gInRpbWUtb2Zmc2V0LXVzIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FW10gPSAicmVxdWVzdC1zeW5jIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfU1VTUEVORFtdID0gImRyb3AtaW5wdXQtZnJhbWVzIjsKK2NvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FW10gPSAiZHJvcC1zdGFydC10aW1lLXVzIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURVtdID0gInZpZGVvLWJpdHJhdGUiOwogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKaW5kZXggNTlmNTdjNy4uZjUzYjIzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaApAQCAtNDgsNiArNDgsMTMgQEAKICAgICAgKiBhZGRlZCBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4KICAgICAgKi8KICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGFkZE1lZGlhQ29kZWNJbmZvKCk7CisgICAgLyoqCisgICAgICogRmluZCBhbiBleGlzdGluZyBgTWVkaWFDb2RlY0luZm9gIG9iamVjdCBmb3IgYSBjb2RlYyBuYW1lIGFuZCByZXR1cm4gYQorICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZm91bmQgYWRkZWQgYE1lZGlhQ29kZWNJbmZvYC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGlmIGZvdW5kLCBvciBudWxscHRyIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGZpbmRNZWRpYUNvZGVjSW5mbyhjb25zdCBjaGFyICpjb2RlY05hbWUpOwogcHJpdmF0ZToKICAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcigpID0gZGVmYXVsdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IDZhNWM2YjYuLjA5NjM5ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTcwLDcgKzcwLDEyIEBACiAgICAgRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOSwKICAgICBFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMCwKICAgICBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OID0gRFJNX0VSUk9SX0JBU0UgLSAxMSwKLSAgICBFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMSwKKyAgICBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMiwKKyAgICBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMywKKyAgICBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTiAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNCwKKyAgICBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNSwKKyAgICBFUlJPUl9EUk1fSU5WQUxJRF9TVEFURSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNiwKKyAgICBFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNiwKIAogICAgIEVSUk9SX0RSTV9WRU5ET1JfTUFYICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDUwMCwKICAgICBFUlJPUl9EUk1fVkVORE9SX01JTiAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5OTksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmMThkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitzdHJ1Y3QgTWVkaWFUcmFjazsKKworCitjbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYUV4dHJhY3RvcgorLy8gOiBwdWJsaWMgRXh0cmFjdG9yQWxsb2NUcmFja2VyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworCisgICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgeworICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQorICAgIH07CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKKworICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSA9IDA7CisKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCisgICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAorICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICB9OworCisgICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcworICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOworfTsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoQ01lZGlhRXh0cmFjdG9yICpwbHVnaW4pOworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpOworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCk7Citwcml2YXRlOgorICAgIENNZWRpYUV4dHJhY3RvciAqcGx1Z2luOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCmluZGV4IGZiOWY1YmQuLmVhODc5NDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaApAQCAtMTksMTAgKzE5LDEwIEBACiAjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzUsMjYgKzM1LDI2IEBACiAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CiAgICAgc3RhdGljIHNwPElNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlRnJvbVNlcnZpY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7Ci0gICAgc3RhdGljIHZvaWQgTG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCk7CiAgICAgc3RhdGljIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpOwogCiBwcml2YXRlOgogICAgIHN0YXRpYyBNdXRleCBnUGx1Z2luTXV0ZXg7Ci0gICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBnUGx1Z2luczsKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gZ1BsdWdpbnM7CiAgICAgc3RhdGljIGJvb2wgZ1BsdWdpbnNSZWdpc3RlcmVkOworICAgIHN0YXRpYyBib29sIGdJZ25vcmVWZXJzaW9uOwogCi0gICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCi0gICAgICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9ycygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIGNvbnN0IGFuZHJvaWRfZGxleHRpbmZvKiBkbGV4dGluZm8sCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yKAotICAgICAgICAgICAgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKIAotICAgIHN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgc25pZmYoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsCi0gICAgICAgICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4pOworICAgIHN0YXRpYyB2b2lkICpzbmlmZihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLCBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLAorICAgICAgICAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCB1aW50MzJfdCAqY3JlYXRvclZlcnNpb24pOwogCi0gICAgc3RhdGljIHZvaWQgVXBkYXRlRXh0cmFjdG9ycyhjb25zdCBjaGFyICpuZXdVcGRhdGVBcGtQYXRoKTsKKyAgICBzdGF0aWMgdm9pZCBVcGRhdGVFeHRyYWN0b3JzKCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKaW5kZXggZmUwZTYxMy4uYWNhYTZjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCkBAIC0xOSw1MCArMTksMjEgQEAKICNkZWZpbmUgTUVESUFfSFRUUF9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKIAotc3RydWN0IE1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7CitzdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIENsZWFyTWVkaWFIVFRQIHsKICAgICBNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFIVFRQKCk7CiAKICAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYXN0SGVhZGVyczsKLSAgICBBU3RyaW5nIG1MYXN0VVJJOwotCi0gICAgYm9vbCBtQ2FjaGVkU2l6ZVZhbGlkOwotICAgIG9mZjY0X3QgbUNhY2hlZFNpemU7Ci0KICAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAppbmRleCA2NmY0ZDcyLi42OWQ2Y2RlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaApAQCAtNDksNiArNDksNyBAQAogICAgICAgICBPVVRQVVRfRk9STUFUX1dFQk0gICAgICAgID0gMSwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFAgICA9IDIsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfSEVJRiAgICAgICAgPSAzLAorICAgICAgICBPVVRQVVRfRk9STUFUX09HRyAgICAgICAgID0gNCwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxNjBmOGQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxZTEyMTkzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmZDBkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FVEFfREFUQV9CQVNFX0hfCisKKyNkZWZpbmUgTUVUQV9EQVRBX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRoZSBmb2xsb3dpbmcga2V5cyBtYXAgdG8gaW50MzJfdCBkYXRhIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgorZW51bSB7CisgICAga0tleU1JTUVUeXBlICAgICAgICAgID0gJ21pbWUnLCAgLy8gY3N0cmluZworICAgIGtLZXlXaWR0aCAgICAgICAgICAgICA9ICd3aWR0JywgIC8vIGludDMyX3QsIGltYWdlIHBpeGVsCisgICAga0tleUhlaWdodCAgICAgICAgICAgID0gJ2hlaWcnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKKyAgICBrS2V5RGlzcGxheVdpZHRoICAgICAgPSAnZFdpZCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgorICAgIGtLZXlEaXNwbGF5SGVpZ2h0ICAgICA9ICdkSGd0JywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCisgICAga0tleVNBUldpZHRoICAgICAgICAgID0gJ3NhclcnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gd2lkdGgKKyAgICBrS2V5U0FSSGVpZ2h0ICAgICAgICAgPSAnc2FySCcsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyBoZWlnaHQKKyAgICBrS2V5VGh1bWJuYWlsV2lkdGggICAgPSAndGhiVycsICAvLyBpbnQzMl90LCB0aHVtYm5haWwgd2lkdGgKKyAgICBrS2V5VGh1bWJuYWlsSGVpZ2h0ICAgPSAndGhiSCcsICAvLyBpbnQzMl90LCB0aHVtYm5haWwgaGVpZ2h0CisKKyAgICAvLyBhIHJlY3RhbmdsZSwgaWYgYWJzZW50IGFzc3VtZWQgdG8gYmUgKDAsIDAsIHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSkKKyAgICBrS2V5Q3JvcFJlY3QgICAgICAgICAgPSAnY3JvcCcsCisKKyAgICBrS2V5Um90YXRpb24gICAgICAgICAgPSAncm90QScsICAvLyBpbnQzMl90IChhbmdsZSBpbiBkZWdyZWVzKQorICAgIGtLZXlJRnJhbWVzSW50ZXJ2YWwgICA9ICdpZml2JywgIC8vIGludDMyX3QKKyAgICBrS2V5U3RyaWRlICAgICAgICAgICAgPSAnc3RyZCcsICAvLyBpbnQzMl90CisgICAga0tleVNsaWNlSGVpZ2h0ICAgICAgID0gJ3NsaHQnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDaGFubmVsQ291bnQgICAgICA9ICcjY2huJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q2hhbm5lbE1hc2sgICAgICAgPSAnY2hubScsICAvLyBpbnQzMl90CisgICAga0tleVNhbXBsZVJhdGUgICAgICAgID0gJ3NydGUnLCAgLy8gaW50MzJfdCAoYXVkaW8gc2FtcGxpbmcgcmF0ZSBIeikKKyAgICBrS2V5UGNtRW5jb2RpbmcgICAgICAgPSAnUENNZScsICAvLyBpbnQzMl90IChhdWRpbyBlbmNvZGluZyBlbnVtKQorICAgIGtLZXlGcmFtZVJhdGUgICAgICAgICA9ICdmcm1SJywgIC8vIGludDMyX3QgKHZpZGVvIGZyYW1lIHJhdGUgZnBzKQorICAgIGtLZXlCaXRSYXRlICAgICAgICAgICA9ICdicnRlJywgIC8vIGludDMyX3QgKGJwcykKKyAgICBrS2V5TWF4Qml0UmF0ZSAgICAgICAgPSAnbXhCcicsICAvLyBpbnQzMl90IChicHMpCisgICAga0tleUJpdHNQZXJTYW1wbGUgICAgID0gJ2JpdHMnLCAgLy8gaW50MzJfdCAoYml0cyBwZXIgc2FtcGxlKQorICAgIGtLZXlTdHJlYW1IZWFkZXIgICAgICA9ICdzdEhkJywgIC8vIHJhdyBkYXRhCisgICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90CisgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQorICAgIGtLZXlBVjFDICAgICAgICAgICAgICA9ICdhdjFjJywgIC8vIHJhdyBkYXRhCisgICAga0tleVRodW1ibmFpbEhWQ0MgICAgID0gJ3RodmMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5RDI2MyAgICAgICAgICAgICAgPSAnZDI2MycsICAvLyByYXcgZGF0YQorICAgIGtLZXlWb3JiaXNJbmZvICAgICAgICA9ICd2aW5mJywgIC8vIHJhdyBkYXRhCisgICAga0tleVZvcmJpc0Jvb2tzICAgICAgID0gJ3Zib28nLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5T3B1c0hlYWRlciAgICAgICAgPSAnb2hkcicsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzQ29kZWNEZWxheSAgICA9ICdvY29kJywgIC8vIHVpbnQ2NF90IChjb2RlYyBkZWxheSBpbiBucykKKyAgICBrS2V5T3B1c1NlZWtQcmVSb2xsICAgPSAnb3NwcicsICAvLyB1aW50NjRfdCAoc2VlayBwcmVyb2xsIGluIG5zKQorICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUgICA9ICd2cDlwJywgIC8vIHJhdyBkYXRhICh2cDkgY3NkIGluZm9ybWF0aW9uKQorICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5SXNNdXhlckRhdGEgICAgICAgPSAnbXV4ZCcsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEZWNvZGluZ1RpbWUgICAgICA9ICdkZWNUJywgIC8vIGludDY0X3QgKGRlY29kaW5nIHRpbWVzdGFtcCBpbiB1c2VjcykKKyAgICBrS2V5TlRQVGltZSAgICAgICAgICAgPSAnbnRwVCcsICAvLyB1aW50NjRfdCAobnRwLXRpbWVzdGFtcCkKKyAgICBrS2V5VGFyZ2V0VGltZSAgICAgICAgPSAndGFyVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5RHJpZnRUaW1lICAgICAgICAgPSAnZGZ0VCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5QW5jaG9yVGltZSAgICAgICAgPSAnYW5jVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5RHVyYXRpb24gICAgICAgICAgPSAnZHVyYScsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5UGl4ZWxGb3JtYXQgICAgICAgPSAncGl4ZicsICAvLyBpbnQzMl90CisgICAga0tleUNvbG9yRm9ybWF0ICAgICAgID0gJ2NvbGYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDb2xvclNwYWNlICAgICAgICA9ICdjb2xzJywgIC8vIGludDMyX3QKKyAgICBrS2V5UGxhdGZvcm1Qcml2YXRlICAgPSAncHJpdicsICAvLyBwb2ludGVyCisgICAga0tleURlY29kZXJDb21wb25lbnQgID0gJ2RlY0MnLCAgLy8gY3N0cmluZworICAgIGtLZXlCdWZmZXJJRCAgICAgICAgICA9ICdiZklEJywKKyAgICBrS2V5TWF4SW5wdXRTaXplICAgICAgPSAnaW5wUycsCisgICAga0tleU1heFdpZHRoICAgICAgICAgID0gJ21heFcnLAorICAgIGtLZXlNYXhIZWlnaHQgICAgICAgICA9ICdtYXhIJywKKyAgICBrS2V5VGh1bWJuYWlsVGltZSAgICAgPSAndGhiVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5VHJhY2tJRCAgICAgICAgICAgPSAndHJJRCcsCisgICAga0tleUVuY29kZXJEZWxheSAgICAgID0gJ2VuY2QnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQorICAgIGtLZXlFbmNvZGVyUGFkZGluZyAgICA9ICdlbmNwJywgIC8vIGludDMyX3QgKGZyYW1lcykKKworICAgIGtLZXlBbGJ1bSAgICAgICAgICAgICA9ICdhbGJ1JywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QXJ0aXN0ICAgICAgICAgICAgPSAnYXJ0aScsICAvLyBjc3RyaW5nCisgICAga0tleUFsYnVtQXJ0aXN0ICAgICAgID0gJ2FhcnQnLCAgLy8gY3N0cmluZworICAgIGtLZXlDb21wb3NlciAgICAgICAgICA9ICdjb21wJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5R2VucmUgICAgICAgICAgICAgPSAnZ2VucicsICAvLyBjc3RyaW5nCisgICAga0tleVRpdGxlICAgICAgICAgICAgID0gJ3RpdGwnLCAgLy8gY3N0cmluZworICAgIGtLZXlZZWFyICAgICAgICAgICAgICA9ICd5ZWFyJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QWxidW1BcnQgICAgICAgICAgPSAnYWxiQScsICAvLyBjb21wcmVzc2VkIGltYWdlIGRhdGEKKyAgICBrS2V5QXV0aG9yICAgICAgICAgICAgPSAnYXV0aCcsICAvLyBjc3RyaW5nCisgICAga0tleUNEVHJhY2tOdW1iZXIgICAgID0gJ2NkdHInLCAgLy8gY3N0cmluZworICAgIGtLZXlEaXNjTnVtYmVyICAgICAgICA9ICdkbnVtJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5RGF0ZSAgICAgICAgICAgICAgPSAnZGF0ZScsICAvLyBjc3RyaW5nCisgICAga0tleVdyaXRlciAgICAgICAgICAgID0gJ3dyaXQnLCAgLy8gY3N0cmluZworICAgIGtLZXlDb21waWxhdGlvbiAgICAgICA9ICdjcGlsJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5TG9jYXRpb24gICAgICAgICAgPSAnbG9jICcsICAvLyBjc3RyaW5nCisgICAga0tleVRpbWVTY2FsZSAgICAgICAgID0gJ3Rtc2wnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDYXB0dXJlRnJhbWVyYXRlICA9ICdjYXBGJywgIC8vIGZsb2F0IChjYXB0dXJlIGZwcykKKworICAgIC8vIHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsCisgICAga0tleVZpZGVvUHJvZmlsZSAgICAgID0gJ3ZwcmYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlWaWRlb0xldmVsICAgICAgICA9ICd2bGV2JywgIC8vIGludDMyX3QKKworICAgIC8vIFNldCB0aGlzIGtleSB0byBlbmFibGUgYXV0aG9yaW5nIGZpbGVzIGluIDY0LWJpdCBvZmZzZXQKKyAgICBrS2V5NjRCaXRGaWxlT2Zmc2V0ICAgPSAnZm9idCcsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXkyQnl0ZU5hbExlbmd0aCAgICA9ICcyTkFMJywgIC8vIGludDMyX3QgKGJvb2wpCisKKyAgICAvLyBJZGVudGlmeSB0aGUgZmlsZSBvdXRwdXQgZm9ybWF0IGZvciBhdXRob3JpbmcKKyAgICAvLyBQbGVhc2Ugc2VlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+IGZvciB0aGUgc3VwcG9ydGVkCisgICAgLy8gZmlsZSBvdXRwdXQgZm9ybWF0cy4KKyAgICBrS2V5RmlsZVR5cGUgICAgICAgICAgPSAnZnR5cCcsICAvLyBpbnQzMl90CisKKyAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCisgICAgLy8ga0tleVRyYWNrVGltZVN0YXR1cyBpcyB1c2VkIHRvIHRyYWNrIHByb2dyZXNzIGluIGVsYXBzZWQgdGltZQorICAgIGtLZXlUcmFja1RpbWVTdGF0dXMgICA9ICd0a3RtJywgIC8vIGludDY0X3QKKworICAgIGtLZXlSZWFsVGltZVJlY29yZGluZyA9ICdydHJjJywgIC8vIGJvb2wgKGludDMyX3QpCisgICAga0tleU51bUJ1ZmZlcnMgICAgICAgID0gJ25iYmYnLCAgLy8gaW50MzJfdAorCisgICAgLy8gT2dnIGZpbGVzIGNhbiBiZSB0YWdnZWQgdG8gYmUgYXV0b21hdGljYWxseSBsb29waW5nLi4uCisgICAga0tleUF1dG9Mb29wICAgICAgICAgID0gJ2F1dEwnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIGtLZXlWYWxpZFNhbXBsZXMgICAgICA9ICd2YWxEJywgIC8vIGludDMyX3QKKworICAgIGtLZXlJc1VucmVhZGFibGUgICAgICA9ICd1bnJlJywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICAvLyBBbiBpbmRpY2F0aW9uIHRoYXQgYSB2aWRlbyBidWZmZXIgaGFzIGJlZW4gcmVuZGVyZWQuCisgICAga0tleVJlbmRlcmVkICAgICAgICAgID0gJ3JlbmQnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIFRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGlzIG1lZGlhCisgICAga0tleU1lZGlhTGFuZ3VhZ2UgICAgID0gJ2xhbmcnLCAgLy8gY3N0cmluZworCisgICAgLy8gVGhlIG1hbnVmYWN0dXJlciBjb2RlIGZvciB0aGlzIG1lZGlhCisgICAga0tleU1hbnVmYWN0dXJlciAgPSAnbWFudScsICAvLyBjc3RyaW5nCisKKyAgICAvLyBUbyBzdG9yZSB0aGUgdGltZWQgdGV4dCBmb3JtYXQgZGF0YQorICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSAgICA9ICd0ZXh0JywgIC8vIHJhdyBkYXRhCisKKyAgICBrS2V5UmVxdWlyZXNTZWN1cmVCdWZmZXJzID0gJ3NlY3UnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIGtLZXlJc0FEVFMgICAgICAgICAgICA9ICdhZHRzJywgIC8vIGJvb2wgKGludDMyX3QpCisgICAga0tleUFBQ0FPVCAgICAgICAgICAgID0gJ2Fhb3QnLCAgLy8gaW50MzJfdAorCisgICAgLy8gSWYgYSBNZWRpYUJ1ZmZlcidzIGRhdGEgcmVwcmVzZW50cyAoYXQgbGVhc3QgcGFydGlhbGx5KSBlbmNyeXB0ZWQKKyAgICAvLyBkYXRhLCB0aGUgZm9sbG93aW5nIGZpZWxkcyBhaWQgaW4gZGVjcnlwdGlvbi4KKyAgICAvLyBUaGUgZGF0YSBjYW4gYmUgdGhvdWdodCBvZiBhcyBwYWlycyBvZiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEKKyAgICAvLyBmcmFnbWVudHMsIGkuZS4gcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhIGFsdGVybmF0ZS4KKyAgICAvLyBUaGUgZmlyc3QgZnJhZ21lbnQgaXMgYnkgY29udmVudGlvbiBwbGFpbiBkYXRhIChpZiB0aGF0J3Mgbm90IHRoZQorICAgIC8vIGNhc2UsIHNpbXBseSBzcGVjaWZ5IHBsYWluIGZyYWdtZW50IHNpemUgb2YgMCkuCisgICAgLy8ga0tleUVuY3J5cHRlZFNpemVzIGFuZCBrS2V5UGxhaW5TaXplcyBlYWNoIG1hcCB0byBhbiBhcnJheSBvZgorICAgIC8vIHNpemVfdCB2YWx1ZXMuIFRoZSBzdW0gdG90YWwgb2YgYWxsIHNpemVfdCB2YWx1ZXMgb2YgYm90aCBhcnJheXMKKyAgICAvLyBtdXN0IGVxdWFsIHRoZSBhbW91bnQgb2YgZGF0YSAoaS5lLiBNZWRpYUJ1ZmZlcidzIHJhbmdlX2xlbmd0aCgpKS4KKyAgICAvLyBJZiBib3RoIGFycmF5cyBhcmUgcHJlc2VudCwgdGhleSBtdXN0IGJlIG9mIHRoZSBzYW1lIHNpemUuCisgICAgLy8gSWYgb25seSBlbmNyeXB0ZWQgc2l6ZXMgYXJlIHByZXNlbnQgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbAorICAgIC8vIHBsYWluIHNpemVzIGFyZSAwLCBpLmUuIGFsbCBmcmFnbWVudHMgYXJlIGVuY3J5cHRlZC4KKyAgICAvLyBUbyBwcm9ncmFtbWF0aWNhbGx5IHNldCB0aGVzZSBhcnJheSwgdXNlIHRoZSBNZXRhRGF0YUJhc2U6OnNldERhdGEgQVBJLCBpLmUuCisgICAgLy8gY29uc3Qgc2l6ZV90IGVuY1NpemVzW107CisgICAgLy8gbWV0YS0+c2V0RGF0YSgKKyAgICAvLyAga0tleUVuY3J5cHRlZFNpemVzLCAwIC8qIHR5cGUgKi8sIGVuY1NpemVzLCBzaXplb2YoZW5jU2l6ZXMpKTsKKyAgICAvLyBBIHBsYWluIHNpemVzIGFycmF5IGJ5IGl0c2VsZiBtYWtlcyBubyBzZW5zZS4KKyAgICBrS2V5RW5jcnlwdGVkU2l6ZXMgICAgPSAnZW5jcicsICAvLyBzaXplX3RbXQorICAgIGtLZXlQbGFpblNpemVzICAgICAgICA9ICdwbGFpJywgIC8vIHNpemVfdFtdCisgICAga0tleUNyeXB0b0tleSAgICAgICAgID0gJ2NyeUsnLCAgLy8gdWludDhfdFsxNl0KKyAgICBrS2V5Q3J5cHRvSVYgICAgICAgICAgPSAnY3J5SScsICAvLyB1aW50OF90WzE2XQorICAgIGtLZXlDcnlwdG9Nb2RlICAgICAgICA9ICdjcnlNJywgIC8vIGludDMyX3QKKworICAgIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplID0gJ2NyeVMnLCAgLy8gaW50MzJfdAorCisgICAga0tleVBzc2ggICAgICAgICAgICAgID0gJ3Bzc2gnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5Q0FTeXN0ZW1JRCAgICAgICAgPSAnY2FpZCcsICAvLyBpbnQzMl90CisgICAga0tleUNBU2Vzc2lvbklEICAgICAgID0gJ3NlaWQnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5Q0FQcml2YXRlRGF0YSAgICAgPSAnY2FkYycsICAvLyByYXcgZGF0YQorCisgICAga0tleUVuY3J5cHRlZEJ5dGVCbG9jayA9ICdjYmxrJywgIC8vIHVpbnQ4X3QKKyAgICBrS2V5U2tpcEJ5dGVCbG9jayAgICAgPSAnc2JsaycsICAvLyB1aW50OF90CisKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULgorICAgIGtLZXlUcmFja0lzQXV0b3NlbGVjdCA9ICdhdXRvJywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULgorICAgIGtLZXlUcmFja0lzRGVmYXVsdCAgICA9ICdkZmx0JywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBTaW1pbGFyIHRvIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUgYnV0IHBlcnRhaW5zIHRvIGF2IHRyYWNrcyBhcyB3ZWxsLgorICAgIGtLZXlUcmFja0lzRm9yY2VkICAgICA9ICdmcmNkJywgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIEgyNjQgc3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uIG9mZnNldHMvc2l6ZXMKKyAgICBrS2V5U0VJICAgICAgICAgICAgICAgPSAnc2VpICcsIC8vIHJhdyBkYXRhCisKKyAgICAvLyBNUEVHIHVzZXIgZGF0YSBvZmZzZXRzCisgICAga0tleU1wZWdVc2VyRGF0YSAgICAgID0gJ21wdWQnLCAvLyBzaXplX3RbXQorCisgICAgLy8gSERSIHJlbGF0ZWQKKyAgICBrS2V5SGRyU3RhdGljSW5mbyAgICA9ICdoZHJTJywgLy8gSERSU3RhdGljSW5mbworICAgIGtLZXlIZHIxMFBsdXNJbmZvICAgID0gJ2hkckQnLCAvLyByYXcgZGF0YQorCisgICAgLy8gY29sb3IgYXNwZWN0cworICAgIGtLZXlDb2xvclJhbmdlICAgICAgID0gJ2NSbmcnLCAvLyBpbnQzMl90LCBjb2xvciByYW5nZSwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUmFuZ2UKKyAgICBrS2V5Q29sb3JQcmltYXJpZXMgICA9ICdjUHJtJywgLy8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgUHJpbWFyaWVzLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5QcmltYXJpZXMKKyAgICBrS2V5VHJhbnNmZXJGdW5jdGlvbiA9ICd0RnVuJywgLy8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXIgRnVuY3Rpb24sIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlRyYW5zZmVyLgorICAgIGtLZXlDb2xvck1hdHJpeCAgICAgID0gJ2NNdHgnLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBNYXRyaXgsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLk1hdHJpeENvZWZmcy4KKyAgICBrS2V5VGVtcG9yYWxMYXllcklkICA9ICdpTHlyJywgLy8gaW50MzJfdCwgdGVtcG9yYWwgbGF5ZXItaWQuIDAtYmFzZWQgKDAgPT4gYmFzZSBsYXllcikKKyAgICBrS2V5VGVtcG9yYWxMYXllckNvdW50ID0gJ2NMeXInLCAvLyBpbnQzMl90LCBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzIGVuY29kZWQKKworICAgIGtLZXlUaWxlV2lkdGggICAgICAgID0gJ3RpbFcnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgd2lkdGgKKyAgICBrS2V5VGlsZUhlaWdodCAgICAgICA9ICd0aWxIJywgLy8gaW50MzJfdCwgSEVJRiB0aWxlIGhlaWdodAorICAgIGtLZXlHcmlkUm93cyAgICAgICAgID0gJ2dyZFInLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgcm93cworICAgIGtLZXlHcmlkQ29scyAgICAgICAgID0gJ2dyZEMnLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgY29sdW1ucworICAgIGtLZXlJY2NQcm9maWxlICAgICAgID0gJ3Byb2YnLCAvLyByYXcgZGF0YSwgSUNDIHByb2ZpbGUgZGF0YQorICAgIGtLZXlJc1ByaW1hcnlJbWFnZSAgID0gJ3ByaW0nLCAvLyBib29sIChpbnQzMl90KSwgaW1hZ2UgdHJhY2sgaXMgdGhlIHByaW1hcnkgaW1hZ2UKKyAgICBrS2V5RnJhbWVDb3VudCAgICAgICA9ICduZnJtJywgLy8gaW50MzJfdCwgdG90YWwgbnVtYmVyIG9mIGZyYW1lIGluIHZpZGVvIHRyYWNrCisgICAga0tleUV4aWZPZmZzZXQgICAgICAgPSAnZXhvZicsIC8vIGludDY0X3QsIEV4aWYgZGF0YSBvZmZzZXQKKyAgICBrS2V5RXhpZlNpemUgICAgICAgICA9ICdleHN6JywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIHNpemUKKyAgICBrS2V5RXhpZlRpZmZPZmZzZXQgICA9ICd0aGRyJywgLy8gaW50MzJfdCwgaWYgPiAwLCBidWZmZXIgY29udGFpbnMgZXhpZiBkYXRhIGJsb2NrIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGlmZiBoZHIgYXQgc3BlY2lmaWVkIG9mZnNldAorICAgIGtLZXlQY21CaWdFbmRpYW4gICAgID0gJ3BjbWInLCAvLyBib29sIChpbnQzMl90KQorCisgICAgLy8gS2V5IGZvciBBTEFDIE1hZ2ljIENvb2tpZQorICAgIGtLZXlBbGFjTWFnaWNDb29raWUgID0gJ2FsbWMnLCAvLyByYXcgZGF0YQorCisgICAgLy8gQUMtNCBBdWRpb1ByZXNlbnRhdGlvbkluZm8KKyAgICBrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvID0gJ2F1ZFAnLCAgLy8gcmF3IGRhdGEKKworICAgIC8vIG9wYXF1ZSBjb2RlYyBzcGVjaWZpYyBkYXRhIGJlaW5nIHBhc3NlZCBmcm9tIGV4dHJhY3RvciB0byBjb2RlYworICAgIGtLZXlPcGFxdWVDU0QwICAgICAgID0gJ2NzZDAnLAorICAgIGtLZXlPcGFxdWVDU0QxICAgICAgID0gJ2NzZDEnLAorICAgIGtLZXlPcGFxdWVDU0QyICAgICAgID0gJ2NzZDInLAorfTsKKworZW51bSB7CisgICAga1R5cGVFU0RTICAgICAgICA9ICdlc2RzJywKKyAgICBrVHlwZUFWQ0MgICAgICAgID0gJ2F2Y2MnLAorICAgIGtUeXBlSFZDQyAgICAgICAgPSAnaHZjYycsCisgICAga1R5cGVBVjFDICAgICAgICA9ICdhdjFjJywKKyAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAorfTsKKworZW51bSB7CisgICAga0NyeXB0b01vZGVVbmVuY3J5cHRlZCA9IDAsCisgICAga0NyeXB0b01vZGVBZXNDdHIgICAgICA9IDEsCisgICAga0NyeXB0b01vZGVBZXNDYmMgICAgICA9IDIsCit9OworCitjbGFzcyBQYXJjZWw7CisKK2NsYXNzIE1ldGFEYXRhQmFzZSB7CitwdWJsaWM6CisgICAgTWV0YURhdGFCYXNlKCk7CisgICAgTWV0YURhdGFCYXNlKGNvbnN0IE1ldGFEYXRhQmFzZSAmZnJvbSk7CisgICAgTWV0YURhdGFCYXNlJiBvcGVyYXRvciA9IChjb25zdCBNZXRhRGF0YUJhc2UgJik7CisKKyAgICB2aXJ0dWFsIH5NZXRhRGF0YUJhc2UoKTsKKworICAgIGVudW0gVHlwZSB7CisgICAgICAgIFRZUEVfTk9ORSAgICAgPSAnbm9uZScsCisgICAgICAgIFRZUEVfQ19TVFJJTkcgPSAnY3N0cicsCisgICAgICAgIFRZUEVfSU5UMzIgICAgPSAnaW4zMicsCisgICAgICAgIFRZUEVfSU5UNjQgICAgPSAnaW42NCcsCisgICAgICAgIFRZUEVfRkxPQVQgICAgPSAnZmxvYScsCisgICAgICAgIFRZUEVfUE9JTlRFUiAgPSAncHRyICcsCisgICAgICAgIFRZUEVfUkVDVCAgICAgPSAncmVjdCcsCisgICAgfTsKKworICAgIHZvaWQgY2xlYXIoKTsKKyAgICBib29sIHJlbW92ZSh1aW50MzJfdCBrZXkpOworCisgICAgYm9vbCBzZXRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqdmFsdWUpOworICAgIGJvb2wgc2V0SW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlKTsKKyAgICBib29sIHNldEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCB2YWx1ZSk7CisgICAgYm9vbCBzZXRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0IHZhbHVlKTsKKyAgICBib29sIHNldFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICp2YWx1ZSk7CisKKyAgICBib29sIHNldFJlY3QoCisgICAgICAgICAgICB1aW50MzJfdCBrZXksCisgICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLAorICAgICAgICAgICAgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOworCisgICAgYm9vbCBmaW5kQ1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKip2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kSW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kSW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kRmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICoqdmFsdWUpIGNvbnN0OworCisgICAgYm9vbCBmaW5kUmVjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGtleSwKKyAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwKKyAgICAgICAgICAgIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pIGNvbnN0OworCisgICAgYm9vbCBzZXREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBmaW5kRGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3Q7CisKKyAgICBib29sIGhhc0RhdGEodWludDMyX3Qga2V5KSBjb25zdDsKKworICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKyAgICB2b2lkIGR1bXBUb0xvZygpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhRXh0cmFjdG9yOworICAgIGZyaWVuZCBjbGFzcyBNZXRhRGF0YTsKKworICAgIHN0cnVjdCB0eXBlZF9kYXRhOworICAgIHN0cnVjdCBSZWN0OworICAgIHN0cnVjdCBNZXRhRGF0YUludGVybmFsOworICAgIE1ldGFEYXRhSW50ZXJuYWwgKm1JbnRlcm5hbERhdGE7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgJnBhcmNlbCk7CisgICAgc3RhdHVzX3QgdXBkYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FVEFfREFUQV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaAppbmRleCBkNWE4MDgwLi5kY2FmMjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaApAQCAtMjAsMTMgKzIwLDI0IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwogYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Citib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiBib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCiAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CiAKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKKwordm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNRVRBX0RBVEFfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggNTRhNzA5NS4uZjM0ZjliNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTY0LDggKzY1LDYgQEAKIAogICAgIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pOwogCi0gICAgdm9pZCBkaXNjb25uZWN0KCk7Ci0KICAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRUcmFja0Zvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0LCB1aW50MzJfdCBmbGFncyA9IDApIGNvbnN0OwogCkBAIC05Nyw2ICs5Niw4IEBACiAKICAgICBib29sIGdldENhY2hlZER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMsIGJvb2wgKmVvcykgY29uc3Q7CiAKKyAgICBzdGF0dXNfdCBnZXRBdWRpb1ByZXNlbnRhdGlvbnMoc2l6ZV90IHRyYWNrSWR4LCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVNZWRpYUV4dHJhY3RvcigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzgzN2NkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBPR0dfV1JJVEVSX0hfCisKKyNkZWZpbmUgT0dHX1dSSVRFUl9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCitzdHJ1Y3QgT2dnU3RyZWFtU3RhdGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE9nZ1dyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CisgICAgT2dnV3JpdGVyKGludCBmZCk7CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEqIHBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpIHsgcmV0dXJuIHJlc2V0KCk7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB+T2dnV3JpdGVyKCk7CisKK3ByaXZhdGU6CisgICAgaW50IG1GZDsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIGJvb2wgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1QYXVzZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1SZXN1bWVkID0gZmFsc2U7CisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKyAgICB2b2xhdGlsZSBib29sIG1SZWFjaGVkRU9TOworICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIGludDY0X3QgbVNhbXBsZVJhdGU7CisgICAgaW50NjRfdCBtRXN0aW1hdGVkU2l6ZUJ5dGVzOworICAgIGludDY0X3QgbUVzdGltYXRlZER1cmF0aW9uVXM7CisKKyAgICBzdGF0aWMgdm9pZCogVGhyZWFkV3JhcHBlcih2b2lkKik7CisgICAgc3RhdHVzX3QgdGhyZWFkRnVuYygpOworICAgIGJvb2wgZXhjZWVkc0ZpbGVTaXplTGltaXQoKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpOworICAgIHN0YXR1c190IHJlc2V0KCk7CisKKyAgICBpbnQzMl90IG1DdXJyZW50UGFja2V0SWQ7CisgICAgT2dnU3RyZWFtU3RhdGUqIG1PcyA9IG51bGxwdHI7CisKKyAgICBPZ2dXcml0ZXIoY29uc3QgT2dnV3JpdGVyJik7CisgICAgT2dnV3JpdGVyJiBvcGVyYXRvcj0oY29uc3QgT2dnV3JpdGVyJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9HR19XUklURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaAppbmRleCAyOGY2MDk0Li4xNDEwYTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCkBAIC0yMyw4ICsyMywxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBPbXhJbmZvQnVpbGRlciA6IHB1YmxpYyBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtQWxsb3dTdXJmYWNlRW5jb2RlcnM7IC8vIGFsbG93IHN1cmZhY2UgZW5jb2RlcnMKKwogcHVibGljOgotICAgIE9teEluZm9CdWlsZGVyKCk7CisgICAgZXhwbGljaXQgT214SW5mb0J1aWxkZXIoYm9vbCBhbGxvd1N1cmZhY2VFbmNvZGVycyk7CiAgICAgfk9teEluZm9CdWlsZGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogICAgIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDUwOWU2NjkuLjk5MjUxMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgUkVNT1RFX01FRElBX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCmluZGV4IDFkNzIwYWYuLjAzZDM4NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKQEAgLTM3LDEyICszNywxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwogCiBwcml2YXRlOgogICAgIHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIE1lZGlhVHJhY2sgKm1Tb3VyY2U7CisgICAgTWVkaWFUcmFjayAqbVRyYWNrOwogICAgIHNwPFJlZkJhc2U+IG1FeHRyYWN0b3JQbHVnaW47CiAKICAgICBleHBsaWNpdCBSZW1vdGVNZWRpYVNvdXJjZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAppbmRleCA2YTI4ZTBiLi5lOGUwYTExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCkBAIC0zMCw2ICszMCw4IEBACiAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKKyAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CitzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwogdm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBzcDxNZXRhRGF0YT4gJm1ldGEpOwpAQCAtNTAsNiArNTIsMTAgQEAKIC8vIFNlbmQgaW5mb3JtYXRpb24gZnJvbSBNZXRhRGF0YSB0byB0aGUgSEFMIHZpYSBBdWRpb1NpbmsKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIAorLy8gUmV0dXJuIHxhdWRpb19vZmZsb2FkX2luZm9fdHwgZmlsbGVkIGZyb20gZ2l2ZW4gbWV0YWRhdGEKK3N0YXR1c190IGdldEF1ZGlvT2ZmbG9hZEluZm8oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGF1ZGlvX29mZmxvYWRfaW5mb190ICppbmZvKTsKKwogLy8gQ2hlY2sgd2hldGhlciB0aGUgc3RyZWFtIGRlZmluZWQgYnkgbWV0YSBjYW4gYmUgb2ZmbG9hZGVkIHRvIGhhcmR3YXJlCiBib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCmluZGV4IDlkOTdkZmQuLmZjZmNiZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsODcgKzE3LDI0IEBACiAjaWZuZGVmIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXwogI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KIAotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElTdXJmYWNlQ29tcG9zZXI7CiAKLXN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyIDogcHVibGljIFJlZkJhc2Ugeworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIgOiBwdWJsaWMgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UgewogICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKLQotICAgIC8vIChyZSlpbml0aWFsaXplIHNjaGVkdWxlcgotICAgIHZvaWQgaW5pdChmbG9hdCB2aWRlb0ZwcyA9IC0xKTsKLSAgICAvLyB1c2UgaW4gY2FzZSBvZiB2aWRlbyByZW5kZXItdGltZSBkaXNjb250aW51aXR5LCBlLmcuIHNlZWsKLSAgICB2b2lkIHJlc3RhcnQoKTsKLSAgICAvLyBnZXQgYWRqdXN0ZWQgbmFub3RpbWUgZm9yIGEgdmlkZW8gZnJhbWUgcmVuZGVyIGF0IHJlbmRlclRpbWUKLSAgICBuc2Vjc190IHNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSB2c3luYyBwZXJpb2QgZm9yIHRoZSBtYWluIGRpc3BsYXkKLSAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcy1wZXItc2Vjb25kLCBvciAwLmYgaWYgbm90IHByaW1lZAotICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwotCi0gICAgdm9pZCByZWxlYXNlKCk7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIaXN0b3J5U2l6ZSA9IDg7CisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CiAKIHByaXZhdGU6Ci0gICAgc3RydWN0IFBMTCB7Ci0gICAgICAgIFBMTCgpOwotCi0gICAgICAgIC8vIHJlc2V0IFBMTCB0byBuZXcgUExMCi0gICAgICAgIHZvaWQgcmVzZXQoZmxvYXQgZnBzID0gLTEpOwotICAgICAgICAvLyBrZWVwIGN1cnJlbnQgZXN0aW1hdGUsIGJ1dCByZXN0YXJ0IHBoYXNlCi0gICAgICAgIHZvaWQgcmVzdGFydCgpOwotICAgICAgICAvLyByZXR1cm5zIHBlcmlvZCBvciAwIGlmIG5vdCB5ZXQgcHJpbWVkCi0gICAgICAgIG5zZWNzX3QgYWRkU2FtcGxlKG5zZWNzX3QgdGltZSk7Ci0gICAgICAgIG5zZWNzX3QgZ2V0UGVyaW9kKCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBuc2Vjc190IG1QZXJpb2Q7Ci0gICAgICAgIG5zZWNzX3QgbVBoYXNlOwotCi0gICAgICAgIGJvb2wgICAgbVByaW1lZDsgICAgICAgIC8vIGhhdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBwZXJpb2QKLSAgICAgICAgc2l6ZV90ICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nOwotCi0gICAgICAgIG5zZWNzX3QgbUxhc3RUaW1lOyAgICAgIC8vIGxhc3QgaW5wdXQgdGltZQotICAgICAgICBuc2Vjc190IG1SZWZpdEF0OyAgICAgICAvLyBuZXh0IGlucHV0IHRpbWUgdG8gZml0IGF0Ci0KLSAgICAgICAgc2l6ZV90ICBtTnVtU2FtcGxlczsgICAgLy8gY2FuIGdvIHBhc3Qga0hpc3RvcnlTaXplCi0gICAgICAgIG5zZWNzX3QgbVRpbWVzW2tIaXN0b3J5U2l6ZV07Ci0KLSAgICAgICAgdm9pZCB0ZXN0KCk7Ci0gICAgICAgIC8vIHJldHVybnMgd2hldGhlciBmaXQgd2FzIHN1Y2Nlc3NmdWwKLSAgICAgICAgYm9vbCBmaXQobnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycik7Ci0gICAgICAgIHZvaWQgcHJpbWUoc2l6ZV90IG51bVNhbXBsZXMpOwotICAgIH07Ci0KLSAgICB2b2lkIHVwZGF0ZVZzeW5jKCk7Ci0KLSAgICBuc2Vjc190IG1Wc3luY1RpbWU7ICAgICAgICAvLyB2c3luYyB0aW1pbmcgZnJvbSBkaXNwbGF5Ci0gICAgbnNlY3NfdCBtVnN5bmNQZXJpb2Q7Ci0gICAgbnNlY3NfdCBtVnN5bmNSZWZyZXNoQXQ7ICAgLy8gbmV4dCB0aW1lIHRvIHJlZnJlc2ggdGltaW5nIGluZm8KLQotICAgIG5zZWNzX3QgbUxhc3RWc3luY1RpbWU7ICAgIC8vIGVzdGltYXRlZCB2c3luYyB0aW1lIGZvciBsYXN0IGZyYW1lCi0gICAgbnNlY3NfdCBtVGltZUNvcnJlY3Rpb247ICAgLy8gcnVubmluZyBhZGp1c3RtZW50Ci0KLSAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKLQorICAgIHZvaWQgdXBkYXRlVnN5bmMoKSBvdmVycmlkZTsKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhWaWRlb0ZyYW1lU2NoZWR1bGVyKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTFiOWEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKyNkZWZpbmUgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVnN5bmNUcmFja2VyOworc3RydWN0IENob3Jlb2dyYXBoZXJUaHJlYWQ7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyMiA6IHB1YmxpYyBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSB7CisgICAgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVWc3luYygpIG92ZXJyaWRlOworCisgICAgbnNlY3NfdCBtQXBwVnN5bmNPZmZzZXQ7CisgICAgbnNlY3NfdCBtU2ZWc3luY09mZnNldDsKKyAgICBzcDxWc3luY1RyYWNrZXI+IG1Wc3luY1RyYWNrZXI7CisgICAgc3A8Q2hvcmVvZ3JhcGhlclRocmVhZD4gbUNob3Jlb2dyYXBoZXJUaHJlYWQ7CisgICAgTXV0ZXggbUxvY2s7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl8yX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1ZjcxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpOworCisgICAgLy8gKHJlKWluaXRpYWxpemUgc2NoZWR1bGVyCisgICAgdm9pZCBpbml0KGZsb2F0IHZpZGVvRnBzID0gLTEpOworICAgIC8vIHVzZSBpbiBjYXNlIG9mIHZpZGVvIHJlbmRlci10aW1lIGRpc2NvbnRpbnVpdHksIGUuZy4gc2VlaworICAgIHZvaWQgcmVzdGFydCgpOworICAgIC8vIGdldCBhZGp1c3RlZCBuYW5vdGltZSBmb3IgYSB2aWRlbyBmcmFtZSByZW5kZXIgYXQgcmVuZGVyVGltZQorICAgIG5zZWNzX3Qgc2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKTsKKworICAgIC8vIHJldHVybnMgdGhlIHZzeW5jIHBlcmlvZCBmb3IgdGhlIG1haW4gZGlzcGxheQorICAgIG5zZWNzX3QgZ2V0VnN5bmNQZXJpb2QoKTsKKworICAgIC8vIHJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWVzLXBlci1zZWNvbmQsIG9yIDAuZiBpZiBub3QgcHJpbWVkCisgICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0hpc3RvcnlTaXplID0gODsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKTsKKworICAgIG5zZWNzX3QgbVZzeW5jVGltZTsgICAgICAgIC8vIHZzeW5jIHRpbWluZyBmcm9tIGRpc3BsYXkKKyAgICBuc2Vjc190IG1Wc3luY1BlcmlvZDsKKyAgICBuc2Vjc190IG1Wc3luY1JlZnJlc2hBdDsgICAvLyBuZXh0IHRpbWUgdG8gcmVmcmVzaCB0aW1pbmcgaW5mbworCitwcml2YXRlOgorICAgIHN0cnVjdCBQTEwgeworICAgICAgICBQTEwoKTsKKworICAgICAgICAvLyByZXNldCBQTEwgdG8gbmV3IFBMTAorICAgICAgICB2b2lkIHJlc2V0KGZsb2F0IGZwcyA9IC0xKTsKKyAgICAgICAgLy8ga2VlcCBjdXJyZW50IGVzdGltYXRlLCBidXQgcmVzdGFydCBwaGFzZQorICAgICAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICAgICAgLy8gcmV0dXJucyBwZXJpb2Qgb3IgMCBpZiBub3QgeWV0IHByaW1lZAorICAgICAgICBuc2Vjc190IGFkZFNhbXBsZShuc2Vjc190IHRpbWUpOworICAgICAgICBuc2Vjc190IGdldFBlcmlvZCgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgbnNlY3NfdCBtUGVyaW9kOworICAgICAgICBuc2Vjc190IG1QaGFzZTsKKworICAgICAgICBib29sICAgIG1QcmltZWQ7ICAgICAgICAvLyBoYXZlIGFuIGVzdGltYXRlIGZvciB0aGUgcGVyaW9kCisgICAgICAgIHNpemVfdCAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKworICAgICAgICBuc2Vjc190IG1MYXN0VGltZTsgICAgICAvLyBsYXN0IGlucHV0IHRpbWUKKyAgICAgICAgbnNlY3NfdCBtUmVmaXRBdDsgICAgICAgLy8gbmV4dCBpbnB1dCB0aW1lIHRvIGZpdCBhdAorCisgICAgICAgIHNpemVfdCAgbU51bVNhbXBsZXM7ICAgIC8vIGNhbiBnbyBwYXN0IGtIaXN0b3J5U2l6ZQorICAgICAgICBuc2Vjc190IG1UaW1lc1trSGlzdG9yeVNpemVdOworCisgICAgICAgIHZvaWQgdGVzdCgpOworICAgICAgICAvLyByZXR1cm5zIHdoZXRoZXIgZml0IHdhcyBzdWNjZXNzZnVsCisgICAgICAgIGJvb2wgZml0KG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpOworICAgICAgICB2b2lkIHByaW1lKHNpemVfdCBudW1TYW1wbGVzKTsKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVZzeW5jKCkgPSAwOworCisgICAgbnNlY3NfdCBtTGFzdFZzeW5jVGltZTsgICAgLy8gZXN0aW1hdGVkIHZzeW5jIHRpbWUgZm9yIGxhc3QgZnJhbWUKKyAgICBuc2Vjc190IG1UaW1lQ29ycmVjdGlvbjsgICAvLyBydW5uaW5nIGFkanVzdG1lbnQKKyAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCA3NDUyOTAxLi4xNDgyMDcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC0yMywxMCArMjMsMTAgQEAKICNpbmNsdWRlICJFU1F1ZXVlLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC00NiwxMiArNDYsMTMgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBoYXJkd2FyZTo6ZnJvbUhlYXA7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyBoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKIHVzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwogdXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKK3R5cGVkZWYgaGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yIFRBbGxvY2F0b3I7Cit0eXBlZGVmIGhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeSBUTWVtb3J5OwogCiAvLyBJIHdhbnQgdGhlIGV4cHJlc3Npb24gInkiIGV2YWx1YXRlZCBldmVuIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBvZmYuCiAjZGVmaW5lIE1ZX0xPR1YoeCwgeSkgXApAQCAtMTE3LDE1ICsxMTgsMTIgQEAKICAgICB2b2lkIHNpZ25hbE5ld1NhbXBsZUFlc0tleShjb25zdCBzcDxBTWVzc2FnZT4gJmtleUl0ZW0pOwogCiBwcml2YXRlOgotICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKLSAgICAgICAgdW5zaWduZWQgbVR5cGU7Ci0gICAgICAgIHVuc2lnbmVkIG1QSUQ7Ci0gICAgICAgIGludDMyX3QgbUNBU3lzdGVtSWQ7Ci0gICAgfTsKIAogICAgIEFUU1BhcnNlciAqbVBhcnNlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU51bWJlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU1hcFBJRDsKKyAgICB1aW50MzJfdCBtUE1UVmVyc2lvbjsKKyAgICB1aW50MzJfdCBtUE1UX0NSQzsKICAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8U3RyZWFtPiA+IG1TdHJlYW1zOwogICAgIGJvb2wgbUZpcnN0UFRTVmFsaWQ7CiAgICAgdWludDY0X3QgbUZpcnN0UFRTOwpAQCAtMTQyLDE1ICsxNDAsMTUgQEAKIH07CiAKIHN0cnVjdCBBVFNQYXJzZXI6OlN0cmVhbSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBTdHJlYW0oUHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwKLSAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgdW5zaWduZWQgUENSX1BJRCwKLSAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1fSUQpOworICAgIFN0cmVhbShQcm9ncmFtICpwcm9ncmFtLCB1bnNpZ25lZCBQQ1JfUElELCBjb25zdCBTdHJlYW1JbmZvICZpbmZvKTsKIAogICAgIHVuc2lnbmVkIHR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQorICAgIHVuc2lnbmVkIHR5cGVFeHQoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZUV4dDsgfQogICAgIHVuc2lnbmVkIHBpZCgpIGNvbnN0IHsgcmV0dXJuIG1FbGVtZW50YXJ5UElEOyB9CiAgICAgdm9pZCBzZXRQSUQodW5zaWduZWQgcGlkKSB7IG1FbGVtZW50YXJ5UElEID0gcGlkOyB9CisgICAgdm9pZCBzZXRBdWRpb1ByZXNlbnRhdGlvbnMoQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIGF1ZGlvUHJlc2VudGF0aW9ucykgeworICAgICAgICBtQXVkaW9QcmVzZW50YXRpb25zID0gYXVkaW9QcmVzZW50YXRpb25zOworICAgIH0KIAogICAgIHZvaWQgc2V0Q2FzSW5mbygKICAgICAgICAgICAgIGludDMyX3Qgc3lzdGVtSWQsCkBAIC0xOTQsNiArMTkyLDcgQEAKICAgICBQcm9ncmFtICptUHJvZ3JhbTsKICAgICB1bnNpZ25lZCBtRWxlbWVudGFyeVBJRDsKICAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZTsKKyAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZUV4dDsKICAgICB1bnNpZ25lZCBtUENSX1BJRDsKICAgICBpbnQzMl90IG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyOwogCkBAIC0yMTAsMTMgKzIwOSwxNiBAQAogICAgIGJvb2wgbVNjcmFtYmxlZDsKICAgICBib29sIG1TYW1wbGVFbmNyeXB0ZWQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1TYW1wbGVBZXNLZXlJdGVtOwotICAgIHNwPElNZW1vcnk+IG1NZW07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOwotICAgIHNwPEhpZGxNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIHNwPFRNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIHNwPFRBbGxvY2F0b3I+IG1IaWRsQWxsb2NhdG9yOwogICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKICAgICBzcDxBQnVmZmVyPiBtRGVzY3JhbWJsZWRCdWZmZXI7CiAgICAgTGlzdDxTdWJTYW1wbGVJbmZvPiBtU3ViU2FtcGxlczsKICAgICBzcDxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKKyAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gbUF1ZGlvUHJlc2VudGF0aW9uczsKKworICAgIC8vIFNlbmQgYXVkaW8gcHJlc2VudGF0aW9ucyBhbG9uZyB3aXRoIGFjY2VzcyB1bml0cy4KKyAgICB2b2lkIGFkZEF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIC8vIEZsdXNoIGFjY3VtdWxhdGVkIHBheWxvYWQgaWYgbmVjZXNzYXJ5IC0tLSBpLmUuIGF0IEVPUyBvciBhdCB0aGUgc3RhcnQgb2YKICAgICAvLyBhbm90aGVyIHBheWxvYWQuIGV2ZW50IGlzIHNldCBpZiB0aGUgZmx1c2hlZCBwYXlsb2FkIGlzIFBFUyB3aXRoIGEgc3luYwpAQCAtMjk5LDYgKzMwMSw4IEBACiAgICAgOiBtUGFyc2VyKHBhcnNlciksCiAgICAgICBtUHJvZ3JhbU51bWJlcihwcm9ncmFtTnVtYmVyKSwKICAgICAgIG1Qcm9ncmFtTWFwUElEKHByb2dyYW1NYXBQSUQpLAorICAgICAgbVBNVFZlcnNpb24oMHhmZmZmZmZmZiksCisgICAgICBtUE1UX0NSQygweGZmZmZmZmZmKSwKICAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKICAgICAgIG1GaXJzdFBUUygwKSwKICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTKGxhc3RSZWNvdmVyZWRQVFMpIHsKQEAgLTQ0Nyw3ICs0NTEsNyBAQAogICAgICAgICBpZiAoZGVzY3JpcHRvcl9sZW5ndGggPiBpbmZvTGVuZ3RoKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoZGVzY3JpcHRvcl90YWcgPT0gOSAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSA0KSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yX3RhZyA9PSBERVNDUklQVE9SX0NBICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDQpIHsKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIGNhRGVzY3JpcHRvci0+bVN5c3RlbUlEID0gYnItPmdldEJpdHMoMTYpOwogICAgICAgICAgICAgY2FEZXNjcmlwdG9yLT5tUElEID0gYnItPmdldEJpdHMoMTYpICYgMHgxZmZmOwpAQCAtNDg2LDcgKzQ5MCwxMyBAQAogCiAgICAgTVlfTE9HVigiICBwcm9ncmFtX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoMTYpKTsKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7Ci0gICAgTVlfTE9HVigiICB2ZXJzaW9uX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoNSkpOworICAgIGJvb2wgYXVkaW9QcmVzZW50YXRpb25zQ2hhbmdlZCA9IGZhbHNlOworICAgIHVuc2lnbmVkIHBtdFZlcnNpb24gPSBici0+Z2V0Qml0cyg1KTsKKyAgICBpZiAocG10VmVyc2lvbiAhPSBtUE1UVmVyc2lvbikgeworICAgICAgICBhdWRpb1ByZXNlbnRhdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgbVBNVFZlcnNpb24gPSBwbXRWZXJzaW9uOworICAgIH0KKyAgICBNWV9MT0dWKCIgIHZlcnNpb25fbnVtYmVyID0gJXUiLCBwbXRWZXJzaW9uKTsKICAgICBNWV9MT0dWKCIgIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IgPSAldSIsIGJyLT5nZXRCaXRzKDEpKTsKICAgICBNWV9MT0dWKCIgIHNlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CiAgICAgTVlfTE9HVigiICBsYXN0X3NlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CkBAIC01MTMsNDMgKzUyMywxNjYgQEAKICAgICAvLyBpbmZvQnl0ZXNSZW1haW5pbmcgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG1ha2UgdXAgdGhlCiAgICAgLy8gdmFyaWFibGUgbGVuZ3RoIHNlY3Rpb24gb2YgRVNfaW5mb3MuIEl0IGRvZXMgbm90IGluY2x1ZGUgdGhlCiAgICAgLy8gZmluYWwgQ1JDLgotICAgIHNpemVfdCBpbmZvQnl0ZXNSZW1haW5pbmcgPSBzZWN0aW9uX2xlbmd0aCAtIDkgLSBwcm9ncmFtX2luZm9fbGVuZ3RoIC0gNDsKKyAgICBpbnQzMl90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OwogCiAgICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+PSA1KSB7Ci0KLSAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSA9IGJyLT5nZXRCaXRzKDgpOwotICAgICAgICBBTE9HVigiICAgIHN0cmVhbV90eXBlID0gMHglMDJ4Iiwgc3RyZWFtVHlwZSk7Ci0KKyAgICAgICAgU3RyZWFtSW5mbyBpbmZvOworICAgICAgICBpbmZvLm1UeXBlID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgIEFMT0dWKCIgICAgc3RyZWFtX3R5cGUgPSAweCUwMngiLCBpbmZvLm1UeXBlKTsKICAgICAgICAgTVlfTE9HVigiICAgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygzKSk7CiAKLSAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCA9IGJyLT5nZXRCaXRzKDEzKTsKLSAgICAgICAgQUxPR1YoIiAgICBlbGVtZW50YXJ5X1BJRCA9IDB4JTA0eCIsIGVsZW1lbnRhcnlQSUQpOworICAgICAgICBpbmZvLm1QSUQgPSBici0+Z2V0Qml0cygxMyk7CisgICAgICAgIEFMT0dWKCIgICAgZWxlbWVudGFyeV9QSUQgPSAweCUwNHgiLCBpbmZvLm1QSUQpOwogCiAgICAgICAgIE1ZX0xPR1YoIiAgICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoNCkpOwogCiAgICAgICAgIHVuc2lnbmVkIEVTX2luZm9fbGVuZ3RoID0gYnItPmdldEJpdHMoMTIpOwogICAgICAgICBBTE9HVigiICAgIEVTX2luZm9fbGVuZ3RoID0gJXUiLCBFU19pbmZvX2xlbmd0aCk7CisgICAgICAgIGluZm9CeXRlc1JlbWFpbmluZyAtPSA1ICsgRVNfaW5mb19sZW5ndGg7CiAKICAgICAgICAgQ0FEZXNjcmlwdG9yIHN0cmVhbUNBOwotICAgICAgICBib29sIGhhc1N0cmVhbUNBID0gZmluZENBRGVzY3JpcHRvcihiciwgRVNfaW5mb19sZW5ndGgsICZzdHJlYW1DQSk7CisgICAgICAgIGluZm8ubVR5cGVFeHQgPSBFWFRfREVTQ1JJUFRPUl9EVkJfUkVTRVJWRURfTUFYOworCisgICAgICAgIGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucy5jbGVhcigpOworICAgICAgICBib29sIGhhc1N0cmVhbUNBID0gZmFsc2U7CisgICAgICAgIHdoaWxlIChFU19pbmZvX2xlbmd0aCA+IDIgJiYgaW5mb0J5dGVzUmVtYWluaW5nID49IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfdGFnID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICBBTE9HVigiICAgICAgdGFnID0gMHglMDJ4IiwgZGVzY3JpcHRvcl90YWcpOworCisgICAgICAgICAgICB1bnNpZ25lZCBkZXNjcmlwdG9yX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgQUxPR1YoIiAgICAgIGxlbiA9ICV1IiwgZGVzY3JpcHRvcl9sZW5ndGgpOworCisgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSAyOworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfbGVuZ3RoID4gRVNfaW5mb19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfdGFnID09IERFU0NSSVBUT1JfQ0EgJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gNCkgeworICAgICAgICAgICAgICAgIGhhc1N0cmVhbUNBID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdHJlYW1DQS5tU3lzdGVtSUQgPSBici0+Z2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgc3RyZWFtQ0EubVBJRCA9IGJyLT5nZXRCaXRzKDE2KSAmIDB4MWZmZjsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aCAtPSA0OworICAgICAgICAgICAgICAgIHN0cmVhbUNBLm1Qcml2YXRlRGF0YS5hc3NpZ24oYnItPmRhdGEoKSwgYnItPmRhdGEoKSArIGRlc2NyaXB0b3JfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5tVHlwZSA9PSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90YWcgPT0gREVTQ1JJUFRPUl9EVkJfRVhURU5TSU9OICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBkZXNjVGFnRXh0ID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiAgICAgIHRhZ19leHQgPSAweCUwMngiLCBkZXNjVGFnRXh0KTsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aC0tOworICAgICAgICAgICAgICAgIC8vIFRoZSBBQzQgZGVzY3JpcHRvciBpcyB1c2VkIGluIHRoZSBQU0kgUE1UIHRvIGlkZW50aWZ5IHN0cmVhbXMgd2hpY2ggY2FycnkgQUM0CisgICAgICAgICAgICAgICAgLy8gYXVkaW8uCisgICAgICAgICAgICAgICAgaWYgKGRlc2NUYWdFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvLm1UeXBlRXh0ID0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKKyAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjVGFnRXh0ID09IEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfbGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTEwCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9wcmVzZWxlY3Rpb25zID0gYnItPmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cygzKTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fcHJlc2VsZWN0aW9uczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tUHJlc2VudGF0aW9uSWQgPSBici0+Z2V0Qml0cyg1KTsgIC8vIHByZXNlbGVjdGlvbl9pZAorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpb19yZW5kZXJpbmdfaW5kaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBzdGF0aWNfY2FzdDxNYXN0ZXJpbmdJbmRpY2F0aW9uPihici0+Z2V0Qml0cygzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnRlcmFjdGl2aXR5X2VuYWJsZWQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNWV9MT0dWKCIgICAgICBpbnRlcmFjdGl2aXR5X2VuYWJsZWQgPSAlZCIsIGludGVyYWN0aXZpdHlfZW5hYmxlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGFuZ3VhZ2VfY29kZV9wcmVzZW50ID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0ZXh0X2xhYmVsX3ByZXNlbnQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbXVsdGlfc3RyZWFtX2luZm9fcHJlc2VudCA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnV0dXJlX2V4dGVuc2lvbiA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZV9jb2RlX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAyNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxhbmd1YWdlWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzBdID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbMV0gPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVsyXSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzNdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBTdHJpbmc4KGxhbmd1YWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXBzIHRoZSBwcmVzZW50YXRpb24gaWQgdG8gdGhlIG1lc3NhZ2UgaWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFWFRfREVTQ1JJUFRPUl9EVkJfTUVTU0FHRSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHByZXNlbnRhdGlvbiBsYWJlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2xhYmVsX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1lc3NhZ2VfaWQgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNWV9MT0dWKCIgICAgICBtZXNzYWdlX2lkID0gJXUiLCBtZXNzYWdlX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpX3N0cmVhbV9pbmZvX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9hdXhfY29tcG9uZW50cyA9IGJyLT5nZXRCaXRzKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyg1KTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgKG51bV9hdXhfY29tcG9uZW50cyAqIDgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhudW1fYXV4X2NvbXBvbmVudHMgKiA4KTsgIC8vIGNvbXBvbmVudF90YWcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdXR1cmVfZXh0ZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoMyk7ICAvLyByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoID0gYnItPmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgKGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoICogOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoICogOCk7ICAvLyBmdXR1cmVfZXh0ZW5zaW9uX2J5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGFwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IGRlc2NyaXB0b3JfbGVuZ3RoOworICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjcmlwdG9yX2xlbmd0aCAqIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChoYXNTdHJlYW1DQSAmJiAhbVBhcnNlci0+bUNhc01hbmFnZXItPmFkZFN0cmVhbSgKLSAgICAgICAgICAgICAgICBtUHJvZ3JhbU51bWJlciwgZWxlbWVudGFyeVBJRCwgc3RyZWFtQ0EpKSB7CisgICAgICAgICAgICAgICAgbVByb2dyYW1OdW1iZXIsIGluZm8ubVBJRCwgc3RyZWFtQ0EpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9Ci0gICAgICAgIFN0cmVhbUluZm8gaW5mbzsKLSAgICAgICAgaW5mby5tVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgIGluZm8ubVBJRCA9IGVsZW1lbnRhcnlQSUQ7Ci0gICAgICAgIGluZm8ubUNBU3lzdGVtSWQgPSBoYXNQcm9ncmFtQ0EgPyBwcm9ncmFtQ0EubVN5c3RlbUlEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N0cmVhbUNBID8gc3RyZWFtQ0EubVN5c3RlbUlEICA6IC0xOwotICAgICAgICBpbmZvcy5wdXNoKGluZm8pOworICAgICAgICBpZiAoaGFzUHJvZ3JhbUNBKSB7CisgICAgICAgICAgICBpbmZvLm1DQURlc2NyaXB0b3IgPSBwcm9ncmFtQ0E7CisgICAgICAgIH0gZWxzZSBpZiAoaGFzU3RyZWFtQ0EpIHsKKyAgICAgICAgICAgIGluZm8ubUNBRGVzY3JpcHRvciA9IHN0cmVhbUNBOworICAgICAgICB9CiAKLSAgICAgICAgaW5mb0J5dGVzUmVtYWluaW5nIC09IDUgKyBFU19pbmZvX2xlbmd0aDsKKyAgICAgICAgaW5mb3MucHVzaChpbmZvKTsKICAgICB9CiAKICAgICBpZiAoaW5mb0J5dGVzUmVtYWluaW5nICE9IDApIHsKICAgICAgICAgQUxPR1coIlNlY3Rpb24gZGF0YSByZW1haW5zIHVuY29uc3VtZWQiKTsKICAgICB9Ci0gICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBici0+Z2V0Qml0cygzMikpOworICAgIHVuc2lnbmVkIGNyYyA9IGJyLT5nZXRCaXRzKDMyKTsKKyAgICBpZiAoY3JjICE9IG1QTVRfQ1JDKSB7CisgICAgICAgIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQgPSB0cnVlOworICAgICAgICBtUE1UX0NSQyA9IGNyYzsKKyAgICB9CisgICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBjcmMpOwogCiAgICAgYm9vbCBQSURzQ2hhbmdlZCA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mb3Muc2l6ZSgpOyArK2kpIHsKQEAgLTYwMSwxNiArNzM0LDE5IEBACiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtcy5pbmRleE9mS2V5KGluZm8ubVBJRCk7CiAKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgc3A8U3RyZWFtPiBzdHJlYW0gPSBuZXcgU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICB0aGlzLCBpbmZvLm1QSUQsIGluZm8ubVR5cGUsIFBDUl9QSUQsIGluZm8ubUNBU3lzdGVtSWQpOworICAgICAgICAgICAgc3A8U3RyZWFtPiBzdHJlYW0gPSBuZXcgU3RyZWFtKHRoaXMsIFBDUl9QSUQsIGluZm8pOwogCiAgICAgICAgICAgICBpZiAobVNhbXBsZUFlc0tleUl0ZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHN0cmVhbS0+c2lnbmFsTmV3U2FtcGxlQWVzS2V5KG1TYW1wbGVBZXNLZXlJdGVtKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0gfD0gaW5mby5tQ0FTeXN0ZW1JZCA+PSAwOworICAgICAgICAgICAgaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0gfD0gaW5mby5tQ0FEZXNjcmlwdG9yLm1TeXN0ZW1JRCA+PSAwOwogICAgICAgICAgICAgbVN0cmVhbXMuYWRkKGluZm8ubVBJRCwgc3RyZWFtKTsKICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbmRleCA+PSAwICYmIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+aXNBdWRpbygpCisgICAgICAgICAgICAgICAgICYmIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQpIHsKKyAgICAgICAgICAgIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+c2V0QXVkaW9QcmVzZW50YXRpb25zKGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0pIHsKQEAgLTcxNywzNCArODUzLDMzIEBACiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbml0aWFsU3RyZWFtQnVmZmVyU2l6ZSA9IDE5MiAqIDEwMjQ7CiAKIEFUU1BhcnNlcjo6U3RyZWFtOjpTdHJlYW0oCi0gICAgICAgIFByb2dyYW0gKnByb2dyYW0sCi0gICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlQSUQsCi0gICAgICAgIHVuc2lnbmVkIHN0cmVhbVR5cGUsCi0gICAgICAgIHVuc2lnbmVkIFBDUl9QSUQsCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX0lEKQorICAgICAgICBQcm9ncmFtICpwcm9ncmFtLCB1bnNpZ25lZCBQQ1JfUElELCBjb25zdCBTdHJlYW1JbmZvICZpbmZvKQogICAgIDogbVByb2dyYW0ocHJvZ3JhbSksCi0gICAgICBtRWxlbWVudGFyeVBJRChlbGVtZW50YXJ5UElEKSwKLSAgICAgIG1TdHJlYW1UeXBlKHN0cmVhbVR5cGUpLAorICAgICAgbUVsZW1lbnRhcnlQSUQoaW5mby5tUElEKSwKKyAgICAgIG1TdHJlYW1UeXBlKGluZm8ubVR5cGUpLAorICAgICAgbVN0cmVhbVR5cGVFeHQoaW5mby5tVHlwZUV4dCksCiAgICAgICBtUENSX1BJRChQQ1JfUElEKSwKICAgICAgIG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyKC0xKSwKICAgICAgIG1QYXlsb2FkU3RhcnRlZChmYWxzZSksCiAgICAgICBtRU9TUmVhY2hlZChmYWxzZSksCiAgICAgICBtUHJldlBUUygwKSwKICAgICAgIG1RdWV1ZShOVUxMKSwKLSAgICAgIG1TY3JhbWJsZWQoQ0Ffc3lzdGVtX0lEID49IDApIHsKLQorICAgICAgbVNjcmFtYmxlZChpbmZvLm1DQURlc2NyaXB0b3IubVN5c3RlbUlEID49IDApLAorICAgICAgbUF1ZGlvUHJlc2VudGF0aW9ucyhpbmZvLm1BdWRpb1ByZXNlbnRhdGlvbnMpIHsKICAgICBtU2FtcGxlRW5jcnlwdGVkID0KICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgfHwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfQUFDX0VOQ1JZUFRFRCAgfHwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRDsKIAogICAgIEFMT0dWKCJuZXcgc3RyZWFtIFBJRCAweCUwMngsIHR5cGUgMHglMDJ4LCBzY3JhbWJsZWQgJWQsIFNhbXBsZUVuY3J5cHRlZDogJWQiLAotICAgICAgICAgICAgZWxlbWVudGFyeVBJRCwgc3RyZWFtVHlwZSwgbVNjcmFtYmxlZCwgbVNhbXBsZUVuY3J5cHRlZCk7CisgICAgICAgICAgICBpbmZvLm1QSUQsIGluZm8ubVR5cGUsIG1TY3JhbWJsZWQsIG1TYW1wbGVFbmNyeXB0ZWQpOwogCi0gICAgdWludDMyX3QgZmxhZ3MgPQotICAgICAgICAgICAgKGlzVmlkZW8oKSAmJiBtU2NyYW1ibGVkKSA/IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2NyYW1ibGVkRGF0YSA6Ci0gICAgICAgICAgICAobVNhbXBsZUVuY3J5cHRlZCkgPyBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NhbXBsZUVuY3J5cHRlZERhdGEgOgotICAgICAgICAgICAgMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKCgoaXNWaWRlbygpIHx8IGlzQXVkaW8oKSkgJiYgbVNjcmFtYmxlZCkpIHsKKyAgICAgICAgZmxhZ3MgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NjcmFtYmxlZERhdGE7CisgICAgfSBlbHNlIGlmIChtU2FtcGxlRW5jcnlwdGVkKSB7CisgICAgICAgIGZsYWdzID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TYW1wbGVFbmNyeXB0ZWREYXRhOworICAgIH0KIAogICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TW9kZSBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpJTlZBTElEOwogCkBAIC03ODEsMTMgKzkxNiwyMyBAQAogICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUMzOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0VBQzM6CisgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpFQUMzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEE6CisgICAgICAgICAgICBpZiAobVN0cmVhbVR5cGVFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFDNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1FVEFEQVRBOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJzdHJlYW0gUElEIDB4JTAyeCBoYXMgaW52YWxpZCBzdHJlYW0gdHlwZSAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50YXJ5UElELCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tUElELCBpbmZvLm1UeXBlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTgwNyw3ICs5NTIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaXNBdWRpbygpID8gTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCk7CiAgICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIENBX3N5c3RlbV9JRCk7CisgICAgICAgICAgICBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IgPSBpbmZvLm1DQURlc2NyaXB0b3I7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgZGVzY3JpcHRvci5tU3lzdGVtSUQpOworCisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLm1Qcml2YXRlRGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhLnNpemUoKSk7CisKICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKICAgICAgICAgfQogICAgIH0KQEAgLTgyNywxNiArOTc4LDQzIEBACiAgICAgICAgICAgICBtQnVmZmVyID09IE5VTEwgPyAwIDogbUJ1ZmZlci0+Y2FwYWNpdHkoKSwgbmVlZGVkU2l6ZSwgbVNjcmFtYmxlZCk7CiAKICAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIsIG5ld1NjcmFtYmxlZEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBuZXdNZW07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBuZXdEZWFsZXI7CisgICAgc3A8VE1lbW9yeT4gbmV3TWVtOwogICAgIGlmIChtU2NyYW1ibGVkKSB7Ci0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKLSAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgKGFsaWdubWVudCAtIDEpKSAmIH4oYWxpZ25tZW50IC0gMSk7Ci0gICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCi0gICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKLSAgICAgICAgbmV3RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihuZWVkZWRTaXplLCAiQVRTUGFyc2VyIik7Ci0gICAgICAgIG5ld01lbSA9IG5ld0RlYWxlci0+YWxsb2NhdGUobmVlZGVkU2l6ZSk7Ci0gICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld01lbS0+cG9pbnRlcigpLCBuZXdNZW0tPnNpemUoKSk7CisgICAgICAgIGlmIChtSGlkbEFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtSGlkbEFsbG9jYXRvciA9IFRBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgICAgICAgICAgaWYgKG1IaWRsQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gY2FuJ3QgZ2V0IGhpZGwgYWxsb2NhdG9yIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGhpZGxfbWVtb3J5IGhpZGxNZW1Ub2tlbjsKKyAgICAgICAgYm9vbCBzdWNjZXNzOworICAgICAgICBhdXRvIHRyYW5zU3RhdHVzID0gbUhpZGxBbGxvY2F0b3ItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG5lZWRlZFNpemUsCisgICAgICAgICAgICAgICAgWyZzdWNjZXNzLCAmaGlkbE1lbVRva2VuXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfbWVtb3J5IGNvbnN0JiBtKSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzOworICAgICAgICAgICAgICAgICAgICBoaWRsTWVtVG9rZW4gPSBtOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBhbGxvY2F0b3IgZmFpbGVkIGF0IHRoZSB0cmFuc3BvcnQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHRyYW5zU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBhbGxvY2F0b3IgZmFpbGVkIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5ld01lbSA9IG1hcE1lbW9yeShoaWRsTWVtVG9rZW4pOworICAgICAgICBpZiAobmV3TWVtID09IG51bGxwdHIgfHwgbmV3TWVtLT5nZXRQb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGhpZGwgZmFpbGVkIHRvIG1hcCBtZW1vcnkiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdNZW0tPmdldFBvaW50ZXIoKSwgbmV3TWVtLT5nZXRTaXplKCkpOwogCiAgICAgICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbWVtY3B5KG5ld1NjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLApAQCAtODQ1LDI0ICsxMDIzLDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgICAgICB9Ci0gICAgICAgIG1NZW0gPSBuZXdNZW07Ci0gICAgICAgIG1EZWFsZXIgPSBuZXdEZWFsZXI7CisgICAgICAgIG1IaWRsTWVtb3J5ID0gbmV3TWVtOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXIgPSBuZXdTY3JhbWJsZWRCdWZmZXI7CiAKLSAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG5ld01lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9IGhpZGxNZW1Ub2tlbjsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9IDBVTEw7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gICh1aW50NjRfdCluZWVkZWRTaXplOwogCi0gICAgICAgIG1IaWRsTWVtb3J5ID0gZnJvbUhlYXAoaGVhcCk7Ci0gICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9ICptSGlkbE1lbW9yeTsKLSAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0OwotICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuc2l6ZSA9ICh1aW50NjRfdCkgc2l6ZTsKLQotICAgICAgICBBTE9HRCgiW3N0cmVhbSAlZF0gY3JlYXRlZCBzaGFyZWQgYnVmZmVyIGZvciBkZXNjcmFtYmxpbmcsIG9mZnNldCAlemQsIHNpemUgJXp1IiwKLSAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgQUxPR0QoIltzdHJlYW0gJWRdIGNyZWF0ZWQgc2hhcmVkIGJ1ZmZlciBmb3IgZGVzY3JhbWJsaW5nLCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG5lZWRlZFNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCiAgICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKQEAgLTk4Niw5ICsxMTU1LDEyIEBACiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTFBDTV9BQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQzM6CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9FQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUFDX0VOQ1JZUFRFRDoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQ6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEE6CisgICAgICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGVFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTM0Nyw3ICsxNTE5LDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciA9PSBOVUxMIHx8IG1NZW0gPT0gTlVMTCkgeworICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgPT0gTlVMTCB8fCBtSGlkbE1lbW9yeSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJyZWNlaXZlZCBzY3JhbWJsZWQgcGFja2V0cyB3aXRob3V0IHNoYXJlZCBtZW1vcnkhIik7CiAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC0xMzk1LDcgKzE1NjcsNyBAQAogICAgIC8vIFBlcmZvcm0gdGhlIDFzdCBwYXNzIGRlc2NyYW1ibGluZyBpZiBuZWVkZWQKICAgICBpZiAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgewogICAgICAgICBtZW1jcHkobURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKLSAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyLT5zZXRSYW5nZSgwLCBkZXNjcmFtYmxlQnl0ZXMpOworICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBzdWJTYW1wbGVzOwogICAgICAgICBzdWJTYW1wbGVzLnJlc2l6ZShkZXNjcmFtYmxlU3ViU2FtcGxlcyk7CkBAIC0xNDEyLDEwICsxNTg0LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ2NF90IHNyY09mZnNldCA9IDAsIGRzdE9mZnNldCA9IDA7Ci0gICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKICAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgIHNyY09mZnNldCA9IGRzdE9mZnNldCA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IHBlc09mZnNldDsKICAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OwogICAgICAgICB9CiAKQEAgLTE0MzEsOSArMTYwMiw5IEBACiAgICAgICAgICAgICAgICAgKFNjcmFtYmxpbmdDb250cm9sKSBzY3RybCwKICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAogICAgICAgICAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlciwKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKnNyY09mZnNldCovLAogICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKmRzdE9mZnNldCovLAogICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmYnl0ZXNXcml0dGVuLCAmZGV0YWlsZWRFcnJvcl0gKAogICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKQEAgLTE0NDIsMTcgKzE2MTMsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IF9kZXRhaWxlZEVycm9yOwogICAgICAgICAgICAgICAgIH0pOwogCi0gICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMiLAotICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCksIHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJWQgYnl0ZXMiLAogICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBieXRlc1dyaXR0ZW4pOwotICAgICAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpLCBtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKKworICAgICAgICAvLyBTZXQgZGVzY3JhbWJsZUJ5dGVzIHRvIHRoZSByZXR1cm5lZCByZXN1bHQuCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIGlucHV0IGRhdGEuCisgICAgICAgIC8vIChlZy4gd2hlbiB3ZSdyZSBkZXNjcmFtYmxpbmcgdGhlIFBFUyBoZWFkZXIgcG9ydGlvbiBvZiBhIHNlY3VyZSBzdHJlYW0sCisgICAgICAgIC8vIHRoZSBwbHVnaW4gbWlnaHQgY3V0IGl0IG9mZiByaWdodCBhZnRlciB0aGUgUEVTIGhlYWRlci4pCisgICAgICAgIGRlc2NyYW1ibGVCeXRlcyA9IGJ5dGVzV3JpdHRlbjsKICAgICB9CiAKKyAgICAvLyB8YnVmZmVyfCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHdlJ2QgcGFyc2UgdGhlIFBFUyBoZWFkZXIuCisgICAgLy8gV2hlbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBzY3JhbWJsZWQsIGl0IHBvaW50cyB0byBtRGVzY3JhbWJsZWRCdWZmZXIKKyAgICAvLyAodW5sZXNzIGFsbCBwYWNrZXRzIGluIHRoaXMgUEVTIGFyZSBhY3R1YWxseSBjbGVhciwgaW4gd2hpY2ggY2FzZSwKKyAgICAvLyBpdCBwb2ludHMgdG8gbUJ1ZmZlciBzaW5jZSB3ZSBuZXZlciBjb3BpZWQgaW50byBtRGVzY3JhbWJsZWRCdWZmZXIpLgorICAgIC8vIFdoZW4gdGhlIG91dHB1dCBzdHJlYW0gaXMgY2xlYXIsIGl0IHBvaW50cyB0byBtQnVmZmVyLCBhbmQgd2UnbGwKKyAgICAvLyBjb3B5IGFsbCBkZXNjcmFtYmxlZCBkYXRhIGJhY2sgdG8gbUJ1ZmZlci4KKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQnVmZmVyOwogICAgIGlmIChtUXVldWUtPmlzU2NyYW1ibGVkKCkpIHsKICAgICAgICAgLy8gUXVldWUgc3ViU2FtcGxlIGluZm8gZm9yIHNjcmFtYmxlZCBxdWV1ZQogICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzQnVmZmVyID0gbmV3IEFCdWZmZXIobVN1YlNhbXBsZXMuc2l6ZSgpICogNCk7CkBAIC0xNDY0LDggKzE2NDcsNyBAQAogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU3ViU2FtcGxlcy5iZWdpbigpOwogICAgICAgICAgICAgICAgIGl0ICE9IG1TdWJTYW1wbGVzLmVuZCgpOyBpdCsrLCBpKyspIHsKICAgICAgICAgICAgIGlmICgoaXQtPnRyYW5zcG9ydF9zY3JhbWJsaW5nX21vZGUgPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiBwZXNTY3JhbWJsaW5nQ29udHJvbCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB8fCBpIDwgZGVzY3JhbWJsZVN1YlNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjbGVhclNpemVQdHJbaV0gPSBpdC0+c3ViU2FtcGxlU2l6ZTsKICAgICAgICAgICAgICAgICBlbmNTaXplUHRyW2ldID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDc0LDE0ICsxNjU2LDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpc1N5bmMgfD0gaXQtPnJhbmRvbV9hY2Nlc3NfaW5kaWNhdG9yOwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKKyAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKKyAgICAgICAgICAgIGNsZWFyU2l6ZVB0clswXSA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIGVuY1NpemVQdHJbMF0gLT0gcGVzT2Zmc2V0OworICAgICAgICB9CiAgICAgICAgIC8vIFBhc3MgdGhlIG9yaWdpbmFsIFRTIHN1YnNhbXBsZSBzaXplIG5vdy4gVGhlIFBFUyBoZWFkZXIgYWRqdXN0CiAgICAgICAgIC8vIHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBzY3JhbWJsZWQgQVUgaXMgZGVxdWV1ZWQuCisgICAgICAgIC8vIE5vdGUgdGhhdCBpZiBkZXNjcmFtYmxlQnl0ZXMgaXMgMCwgaXQgbWVhbnMgdGhpcyBQRVMgY29udGFpbnMgb25seQorICAgICAgICAvLyBhbGwgdHMgcGFja2V0cywgbGVhZGluZ0NsZWFyQnl0ZXMgaXMgZW50aXJlIGJ1ZmZlciBzaXplLgogICAgICAgICBtUXVldWUtPmFwcGVuZFNjcmFtYmxlZERhdGEoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCksIHNjdHJsLAotICAgICAgICAgICAgICAgIGlzU3luYywgY2xlYXJTaXplc0J1ZmZlciwgZW5jU2l6ZXNCdWZmZXIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIChkZXNjcmFtYmxlQnl0ZXMgPiAwKSA/IGRlc2NyYW1ibGVCeXRlcyA6IG1CdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICBzY3RybCwgaXNTeW5jLCBjbGVhclNpemVzQnVmZmVyLCBlbmNTaXplc0J1ZmZlcik7CisKKyAgICAgICAgaWYgKGRlc2NyYW1ibGVCeXRlcyA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgIH0KIAotICAgIEFCaXRSZWFkZXIgYnIobUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFCaXRSZWFkZXIgYnIoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVBFUygmYnIsIGV2ZW50KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1MTQsNiArMTcxMSwxMyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3ZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OmFkZEF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dFN0cmVhbShzdGQ6Omlvczo6b3V0KTsKKyAgICBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMobUF1ZGlvUHJlc2VudGF0aW9ucywgJm91dFN0cmVhbSk7CisgICAgc3A8QUJ1ZmZlcj4gYXAgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkob3V0U3RyZWFtLnN0cigpLmRhdGEoKSwgb3V0U3RyZWFtLnN0cigpLnNpemUoKSk7CisgICAgYnVmZmVyLT5tZXRhKCktPnNldEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCBhcCk7Cit9CisKIHZvaWQgQVRTUGFyc2VyOjpTdHJlYW06Om9uUGF5bG9hZERhdGEoCiAgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsIHVpbnQ2NF90IFBUUywgdWludDY0X3QgLyogRFRTICovLAogICAgICAgICB1bnNpZ25lZCBQRVNfc2NyYW1ibGluZ19jb250cm9sLApAQCAtMTU2NCw2ICsxNzY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1ByZXNlbnRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgICAgICAgICBBTE9HVigib25QYXlsb2FkRGF0YTogY3JlYXRlZCBBbm90aGVyUGFja2V0U291cmNlIFBJRCAweCUwOHggb2YgdHlwZSAweCUwMngiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG1TdHJlYW1UeXBlKTsKQEAgLTE1NzYsNiArMTc4Myw5IEBACiAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0Rm9ybWF0KCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnNldEZvcm1hdChtUXVldWUtPmdldEZvcm1hdCgpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQXVkaW9QcmVzZW50YXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggNDVjYTA2Yi4uMGZmMmQ3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0xNDIsNiArMTQzLDcgQEAKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9WSURFTyAgICAgICAgICA9IDB4MDIsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzFfQVVESU8gICAgICAgICAgPSAweDAzLAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPICAgICAgICAgID0gMHgwNCwKKyAgICAgICAgU1RSRUFNVFlQRV9QRVNfUFJJVkFURV9EQVRBICAgICA9IDB4MDYsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUyAgICAgPSAweDBmLAogICAgICAgICBTVFJFQU1UWVBFX01QRUc0X1ZJREVPICAgICAgICAgID0gMHgxMCwKICAgICAgICAgU1RSRUFNVFlQRV9NRVRBREFUQSAgICAgICAgICAgICA9IDB4MTUsCkBAIC0xNTMsNiArMTU1LDcgQEAKICAgICAgICAgLy8gU3RyZWFtIHR5cGUgMHg4MyBpcyBub24tc3RhbmRhcmQsCiAgICAgICAgIC8vIGl0IGNvdWxkIGJlIExQQ00gb3IgVHJ1ZUhEIEFDMwogICAgICAgICBTVFJFQU1UWVBFX0xQQ01fQUMzICAgICAgICAgICAgID0gMHg4MywKKyAgICAgICAgU1RSRUFNVFlQRV9FQUMzICAgICAgICAgICAgICAgICA9IDB4ODcsCiAKICAgICAgICAgLy9TYW1wbGUgRW5jcnlwdGVkIHR5cGVzCiAgICAgICAgIFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgICAgICAgPSAweERCLApAQCAtMTYwLDYgKzE2MywyMSBAQAogICAgICAgICBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQgICAgICAgID0gMHhDMSwKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIC8vIEZyb20gSVNPL0lFQyAxMzgxOC0xOiAyMDA3IChFKSwgVGFibGUgMi00NQorICAgICAgICBERVNDUklQVE9SX0NBICAgICAgICAgICAgICAgICAgID0gMHgwOSwKKworICAgICAgICAvLyBEVkIgQmx1ZUJvb2sgQTAzOCBUYWJsZSAxMgorICAgICAgICBERVNDUklQVE9SX0RWQl9FWFRFTlNJT04gICAgICAgID0gMHg3RiwKKyAgICB9OworCisgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTA5CisgICAgZW51bSB7CisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BQzQgICAgICAgICAgICAgICAgICA9IDB4MTUsCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gICA9IDB4MTksCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9SRVNFUlZFRF9NQVggICAgICAgICA9IDB4N0YsCisgICAgfTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFUU1BhcnNlcigpOwogCkBAIC0xNjksMTEgKzE4NywyMCBAQAogICAgIHN0cnVjdCBQU0lTZWN0aW9uOwogICAgIHN0cnVjdCBDYXNNYW5hZ2VyOwogICAgIHN0cnVjdCBDQURlc2NyaXB0b3IgewotICAgICAgICBpbnQzMl90IG1TeXN0ZW1JRDsKKyAgICAgICAgQ0FEZXNjcmlwdG9yKCkgOiBtUElEKDApLCBtU3lzdGVtSUQoLTEpIHt9CiAgICAgICAgIHVuc2lnbmVkIG1QSUQ7CisgICAgICAgIGludDMyX3QgbVN5c3RlbUlEOwogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtUHJpdmF0ZURhdGE7CiAgICAgfTsKIAorICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKKyAgICAgICAgdW5zaWduZWQgbVR5cGU7CisgICAgICAgIHVuc2lnbmVkIG1UeXBlRXh0OworICAgICAgICB1bnNpZ25lZCBtUElEOworICAgICAgICBDQURlc2NyaXB0b3IgbUNBRGVzY3JpcHRvcjsKKyAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIG1BdWRpb1ByZXNlbnRhdGlvbnM7CisgICAgfTsKKwogICAgIHNwPENhc01hbmFnZXI+IG1DYXNNYW5hZ2VyOwogCiAgICAgdWludDMyX3QgbUZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IGY5ZGNiYzkuLmE1MDdiOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTMwLDkgKzMwLDE0IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDY2ZDdkYzEuLjYyZTNhNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcApAQCAtMjIzLDkgKzIyMywxNiBAQAogICAgICAgICAgICAgICAgICAgICBrS2V5TXBlZ1VzZXJEYXRhLCAwLCBtcGVnVXNlckRhdGEtPmRhdGEoKSwgbXBlZ1VzZXJEYXRhLT5zaXplKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYXA7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCAmYXApICYmIGFwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgMCwgYXAtPmRhdGEoKSwgYXAtPnNpemUoKSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNyeXB0b01vZGU7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjcnlwdG9Nb2RlIiwgJmNyeXB0b01vZGUpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGNyeXB0b0tleTsKKyAgICAgICAgICAgIGludDMyX3QgcGVzT2Zmc2V0OwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJCeXRlc0J1ZmZlciwgZW5jQnl0ZXNCdWZmZXI7CiAKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNyeXB0b0tleSIsICZjcnlwdG9LZXkpKTsKQEAgLTIzMyw2ICsyNDAsOCBAQAogICAgICAgICAgICAgICAgICAgICAmJiBjbGVhckJ5dGVzQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoImVuY0J5dGVzIiwgJmVuY0J5dGVzQnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAmJiBlbmNCeXRlc0J1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInBlc09mZnNldCIsICZwZXNPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICYmIChwZXNPZmZzZXQgPj0gMCkgJiYgKHBlc09mZnNldCA8IDY1NTM2KSk7CiAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGNyeXB0b01vZGUpOwogCkBAIC0yNDAsNiArMjQ5LDExIEBACiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBhcnJheSwgMTYpOwogCiAgICAgICAgICAgICBhcnJheVswXSA9ICh1aW50OF90KSAoY3J5cHRvS2V5ICYgMHhmZik7CisgICAgICAgICAgICAvLyBhcnJheVsxXSBjb250YWlucyBQRVMgaGVhZGVyIGZsYWcsIHdoaWNoIHdlIGRvbid0IHVzZS4KKyAgICAgICAgICAgIC8vIGFycmF5WzJ+M10gY29udGFpbiB0aGUgUEVTIG9mZnNldC4KKyAgICAgICAgICAgIGFycmF5WzJdID0gKHVpbnQ4X3QpIChwZXNPZmZzZXQgJiAweGZmKTsKKyAgICAgICAgICAgIGFycmF5WzNdID0gKHVpbnQ4X3QpICgocGVzT2Zmc2V0ID4+IDgpICYgMHhmZik7CisKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBhcnJheSwgMTYpOwogCiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCBjOWU1MTlmLi41YWY3YjIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTg2LDYgKzg2LDIxIEBACiAgICAgbUNhc1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKIH0KIAorc3RhdGljIGludDMyX3QgcmVhZFZhcmlhYmxlQml0cyhBQml0UmVhZGVyICZiaXRzLCBpbnQzMl90IG5iaXRzKSB7CisgICAgaW50MzJfdCB2YWx1ZSA9IDA7CisgICAgaW50MzJfdCBtb3JlX2JpdHMgPSAxOworCisgICAgd2hpbGUgKG1vcmVfYml0cykgeworICAgICAgICB2YWx1ZSArPSBiaXRzLmdldEJpdHMobmJpdHMpOworICAgICAgICBtb3JlX2JpdHMgPSBiaXRzLmdldEJpdHMoMSk7CisgICAgICAgIGlmICghbW9yZV9iaXRzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHZhbHVlKys7CisgICAgICAgIHZhbHVlIDw8PSBuYml0czsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworfQorCiAvLyBQYXJzZSBBQzMgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUsCiAvLyB1cGRhdGUgbWV0YWRhdGEgb25seSBhcHBsaWNhYmxlLCBhbmQgcmV0dXJuIHRoZSBwYXlsb2FkIHNpemUKIHN0YXRpYyB1bnNpZ25lZCBwYXJzZUFDM1N5bmNGcmFtZSgKQEAgLTE5NSw4ICsyMTAsMTUzIEBACiAgICAgcmV0dXJuIHBheWxvYWRTaXplOwogfQogCi1zdGF0aWMgYm9vbCBJc1NlZW1pbmdseVZhbGlkQUMzSGVhZGVyKGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUpIHsKLSAgICByZXR1cm4gcGFyc2VBQzNTeW5jRnJhbWUocHRyLCBzaXplLCBOVUxMKSA+IDA7CisvLyBQYXJzZSBFQUMzIGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lLAorLy8gdXBkYXRlIG1ldGFkYXRhIG9ubHkgYXBwbGljYWJsZSwgYW5kIHJldHVybiB0aGUgcGF5bG9hZCBzaXplCisvLyBBVFNDIEEvNTI6MjAxMiBFMi4zLjEKK3N0YXRpYyB1bnNpZ25lZCBwYXJzZUVBQzNTeW5jRnJhbWUoCisgICAgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgc3A8TWV0YURhdGE+ICptZXRhRGF0YSkgeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFubmVsQ291bnRUYWJsZVtdID0gezIsIDEsIDIsIDMsIDMsIDQsIDQsIDV9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZTJbXSA9IHsyNDAwMCwgMjIwNTAsIDE2MDAwfTsKKworICAgIEFCaXRSZWFkZXIgYml0cyhwdHIsIHNpemUpOworICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBiaXRzIGxlZnQgZm9yIGZ1cnRoZXIgcGFyc2luZyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGJpdHMuZ2V0Qml0cygxNikgIT0gMHgwQjc3KSB7CisgICAgICAgIEFMT0dFKCJObyB2YWxpZCBzeW5jIHdvcmQgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gd2UgcGFyc2UgdXAgdG8gYnNpZCBzbyB0aGVyZSBuZWVkcyB0byBiZSBhdCBsZWFzdCB0aGF0IG1hbnkgYml0cworICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyICsgMyArIDExICsgMiArIDIgKyAzICsgMSArIDUpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYml0cyBsZWZ0IGZvciBmdXJ0aGVyIHBhcnNpbmciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdW5zaWduZWQgc3RybXR5cCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICBpZiAoc3RybXR5cCA9PSAzKSB7CisgICAgICAgIEFMT0dFKCJJbmNvcnJlY3Qgc3RybXR5cCBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzdWJzdHJlYW1pZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICAvLyBvbmx5IHRoZSBmaXJzdCBpbmRlcGVuZGVudCBzdHJlYW0gaXMgc3VwcG9ydGVkCisgICAgaWYgKChzdHJtdHlwID09IDAgfHwgc3RybXR5cCA9PSAyKSAmJiBzdWJzdHJlYW1pZCAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVkIGZybXNpeiA9IGJpdHMuZ2V0Qml0cygxMSk7CisgICAgdW5zaWduZWQgZnNjb2QgPSBiaXRzLmdldEJpdHMoMik7CisKKyAgICB1bnNpZ25lZCBzYW1wbGluZ1JhdGUgPSAwOworICAgIGlmIChmc2NvZCA9PSAweDMpIHsKKyAgICAgICAgdW5zaWduZWQgZnNjb2QyID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBpZiAoZnNjb2QyID09IDMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgZnNjb2QyIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZTJbZnNjb2QyXTsKKyAgICB9IGVsc2UgeworICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZVtmc2NvZF07CisgICAgICAgIHVuc2lnbmVkIG51bWJsa3Njb2QgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMik7CisgICAgfQorCisgICAgdW5zaWduZWQgYWNtb2QgPSBiaXRzLmdldEJpdHMoMyk7CisgICAgdW5zaWduZWQgbGZlb24gPSBiaXRzLmdldEJpdHMoMSk7CisgICAgdW5zaWduZWQgYnNpZCA9IGJpdHMuZ2V0Qml0cyg1KTsKKyAgICBpZiAoYnNpZCA8IDExIHx8IGJzaWQgPiAxNikgeworICAgICAgICBBTE9HVygiSW5jb3JyZWN0IGJzaWQgaW4gRUFDMyBoZWFkZXIuIENvdWxkIGJlIEFDLTMgb3Igc29tZSB1bmtub3duIEVBQzMgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IGluZGVwZW5kYW50IHN0cmVhbQorICAgIGlmIChtZXRhRGF0YSAhPSBOVUxMICYmIChzdHJtdHlwID09IDAgfHwgc3RybXR5cCA9PSAyKSkgeworICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKKyAgICAgICAgQUxPR1YoIkVBQzMgY2hhbm5lbENvdW50ID0gJWQiLCBjaGFubmVsQ291bnQpOworICAgICAgICBBTE9HVigiRUFDMyBzYW1wbGluZ1JhdGUgPSAlZCIsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIH0KKworICAgIHVuc2lnbmVkIHBheWxvYWRTaXplID0gZnJtc2l6ICsgMTsKKyAgICBwYXlsb2FkU2l6ZSA8PD0gMTsgIC8vIGNvbnZlcnQgZnJvbSAxNi1iaXQgd29yZHMgdG8gYnl0ZXMKKworICAgIHJldHVybiBwYXlsb2FkU2l6ZTsKK30KKworLy8gUGFyc2UgQUM0IGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lCisvLyBhbmQgdXBkYXRlIGZyYW1lU2l6ZSBhbmQgbWV0YWRhdGEuCitzdGF0aWMgc3RhdHVzX3QgcGFyc2VBQzRTeW5jRnJhbWUoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUsIHVuc2lnbmVkICZmcmFtZVNpemUsIHNwPE1ldGFEYXRhPiAqbWV0YURhdGEpIHsKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpLCBBbm5leCBDCisgICAgLy8gVGhlIHN5bmNfd29yZCBjYW4gYmUgZWl0aGVyIDB4QUM0MCBvciAweEFDNDEuCisgICAgc3RhdGljIGNvbnN0IGludCBrU3luY1dvcmRBQzQwID0gMHhBQzQwOworICAgIHN0YXRpYyBjb25zdCBpbnQga1N5bmNXb3JkQUM0MSA9IDB4QUM0MTsKKworICAgIHNpemVfdCBoZWFkZXJTaXplID0gMDsKKyAgICBBQml0UmVhZGVyIGJpdHMocHRyLCBzaXplKTsKKyAgICBpbnQzMl90IHN5bmNXb3JkID0gYml0cy5nZXRCaXRzKDE2KTsKKyAgICBpZiAoKHN5bmNXb3JkICE9IGtTeW5jV29yZEFDNDApICYmIChzeW5jV29yZCAhPSBrU3luY1dvcmRBQzQxKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBzeW5jd29yZCBpbiBBQzQgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGhlYWRlclNpemUgKz0gMjsKKworICAgIGZyYW1lU2l6ZSA9IGJpdHMuZ2V0Qml0cygxNik7CisgICAgaGVhZGVyU2l6ZSArPSAyOworICAgIGlmIChmcmFtZVNpemUgPT0gMHhGRkZGKSB7CisgICAgICAgIGZyYW1lU2l6ZSA9IGJpdHMuZ2V0Qml0cygyNCk7CisgICAgICAgIGhlYWRlclNpemUgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVTaXplID09IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgc2l6ZSBpbiBBQzQgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGZyYW1lU2l6ZSArPSBoZWFkZXJTaXplOworICAgIC8vIElmIHRoZSBzeW5jX3dvcmQgaXMgMHhBQzQxLCBhIGNyY193b3JkIGlzIGFsc28gdHJhbnNtaXR0ZWQuCisgICAgaWYgKHN5bmNXb3JkID09IGtTeW5jV29yZEFDNDEpIHsKKyAgICAgICAgZnJhbWVTaXplICs9IDI7IC8vIGNyY193b3JkCisgICAgfQorICAgIEFMT0dWKCJBQzQgZnJhbWVTaXplID0gJXUiLCBmcmFtZVNpemUpOworCisgICAgLy8gRVRTSSBUUyAxMDMgMTkwLTIgVjEuMS4xIDYuMi4xLjEKKyAgICB1aW50MzJfdCBiaXRzdHJlYW1WZXJzaW9uID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChiaXRzdHJlYW1WZXJzaW9uID09IDMpIHsKKyAgICAgICAgYml0c3RyZWFtVmVyc2lvbiArPSByZWFkVmFyaWFibGVCaXRzKGJpdHMsIDIpOworICAgIH0KKworICAgIGJpdHMuc2tpcEJpdHMoMTApOyAvLyBTZXF1ZW5jZSBDb3VudGVyCisKKyAgICB1aW50MzJfdCBiV2FpdEZyYW1lcyA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICBpZiAoYldhaXRGcmFtZXMpIHsKKyAgICAgICAgdWludDMyX3Qgd2FpdEZyYW1lcyA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICAgICAgaWYgKHdhaXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvLyBicl9jb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRVRTSSBUUyAxMDMgMTkwIFYxLjEuMSBUYWJsZSA4MgorICAgIGJvb2wgZnNJbmRleCA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBmc0luZGV4ID8gNDgwMDAgOiA0NDEwMDsKKworICAgIGlmIChtZXRhRGF0YSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEFDNCBTZXR0aW5nIG1Gb3JtYXQiKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgLy8gW0ZJWE1FXSBBQzQgY2hhbm5lbCBjb3VudCBpcyBkZWZpbmVkIHBlciBwcmVzZW50YXRpb24uIFByb3ZpZGUgYSBkZWZhdWx0IGNoYW5uZWwgY291bnQKKyAgICAgICAgLy8gYXMgc3RlcmVvIGZvciB0aGUgZW50aXJlIHN0cmVhbS4KKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHN0YXR1c190IElzU2VlbWluZ2x5VmFsaWRBQzRIZWFkZXIoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgJmZyYW1lU2l6ZSkgeworICAgIHJldHVybiBwYXJzZUFDNFN5bmNGcmFtZShwdHIsIHNpemUsIGZyYW1lU2l6ZSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBib29sIElzU2VlbWluZ2x5VmFsaWRBRFRTSGVhZGVyKApAQCAtMjc5LDcgKzQzOSw4IEBACiAgICAgICAgIEFMT0dFKCJhcHBlbmRpbmcgZGF0YSBhZnRlciBFT1MiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgeworCisgICAgaWYgKCFpc1NjcmFtYmxlZCgpICYmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApKSB7CiAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgSDI2NDoKICAgICAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKQEAgLTM5MCwxMiArNTUxLDE5IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgQUMzOgorICAgICAgICAgICAgY2FzZSBFQUMzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKIAogICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoSXNTZWVtaW5nbHlWYWxpZEFDM0hlYWRlcigmcHRyW2ldLCBzaXplIC0gaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKCZwdHJbaV0sIHNpemUgLSBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBFQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlRUFDM1N5bmNGcmFtZSgmcHRyW2ldLCBzaXplIC0gaSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWRTaXplID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQwNiw3ICs1NzQsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDMyBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiAoRSlBQzMgc3luY3dvcmQgYXQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CkBAIC00MTYsNiArNTg0LDQzIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgQUM0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcmFtZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKKworICAgICAgICAgICAgICAgIC8vIEEgdmFsaWQgQUM0IHN0cmVhbSBzaG91bGQgaGF2ZSBtaW5pbXVtIG9mIDcgYnl0ZXMgaW4gaXRzIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAvLyAoU3luYyBoZWFkZXIgNCBieXRlcyArIEFDNCB0b2MgMyBieXRlcykKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElzU2VlbWluZ2x5VmFsaWRBQzRIZWFkZXIoJnB0cltpXSwgc2l6ZSAtIGksIGZyYW1lU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDNCBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplICE9IHNpemUgLSBzdGFydE9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQUM0IGZyYW1lIHNpemUgaXMgJXUgYnl0ZXMsIHdoaWxlIHRoZSBidWZmZXIgc2l6ZSBpcyAlemQgYnl0ZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLCBzaXplIC0gc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRhdGEgPSAmcHRyW3N0YXJ0T2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBzaXplIC09IHN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlIE1QRUdfQVVESU86CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOwpAQCAtNDk0LDYgKzY5OSw3IEBACiAKIHZvaWQgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjphcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzLAogICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJTaXplcywgc3A8QUJ1ZmZlcj4gZW5jU2l6ZXMpIHsKICAgICBpZiAoIWlzU2NyYW1ibGVkKCkpIHsKQEAgLTUyMSw2ICs3MjcsNyBAQAogCiAgICAgU2NyYW1ibGVkUmFuZ2VJbmZvIHNjcmFtYmxlZEluZm87CiAgICAgc2NyYW1ibGVkSW5mby5tTGVuZ3RoID0gc2l6ZTsKKyAgICBzY3JhbWJsZWRJbmZvLm1MZWFkaW5nQ2xlYXJCeXRlcyA9IGxlYWRpbmdDbGVhckJ5dGVzOwogICAgIHNjcmFtYmxlZEluZm8ubUtleUlkID0ga2V5SWQ7CiAgICAgc2NyYW1ibGVkSW5mby5tSXNTeW5jID0gaXNTeW5jOwogICAgIHNjcmFtYmxlZEluZm8ubUNsZWFyU2l6ZXMgPSBjbGVhclNpemVzOwpAQCAtNTMzLDcgKzc0MCw2IEBACiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKSB7CiAgICAgc2l6ZV90IG5leHRTY2FuID0gbUJ1ZmZlci0+c2l6ZSgpOwotICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIGludDMyX3QgcGVzT2Zmc2V0ID0gMCwgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPSAwOwogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAobmV4dFNjYW4sICZwZXNPZmZzZXQsICZwZXNTY3JhbWJsaW5nQ29udHJvbCk7CiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewpAQCAtNTQ0LDYgKzc1MCw3IEBACiAgICAgLy8gcmV0dXJuIHNjcmFtYmxlZCB1bml0CiAgICAgaW50MzJfdCBrZXlJZCA9IHBlc1NjcmFtYmxpbmdDb250cm9sLCBpc1N5bmMgPSAwLCBzY3JhbWJsZWRMZW5ndGggPSAwOwogICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIGVuY1NpemVzOworICAgIHNpemVfdCBsZWFkaW5nQ2xlYXJCeXRlczsKICAgICB3aGlsZSAobVNjcmFtYmxlZFJhbmdlSW5mb3Muc2l6ZSgpID4gbVJhbmdlSW5mb3Muc2l6ZSgpKSB7CiAgICAgICAgIGF1dG8gaXQgPSBtU2NyYW1ibGVkUmFuZ2VJbmZvcy5iZWdpbigpOwogICAgICAgICBBTE9HVigiW3N0cmVhbSAlZF0gZmV0Y2hpbmcgc2NyYW1ibGVkIHJhbmdlOiBzaXplPSV6dSIsIG1Nb2RlLCBpdC0+bUxlbmd0aCk7CkBAIC01NjEsNiArNzY4LDcgQEAKICAgICAgICAgY2xlYXJTaXplcyA9IGl0LT5tQ2xlYXJTaXplczsKICAgICAgICAgZW5jU2l6ZXMgPSBpdC0+bUVuY1NpemVzOwogICAgICAgICBpc1N5bmMgPSBpdC0+bUlzU3luYzsKKyAgICAgICAgbGVhZGluZ0NsZWFyQnl0ZXMgPSBpdC0+bUxlYWRpbmdDbGVhckJ5dGVzOwogICAgICAgICBtU2NyYW1ibGVkUmFuZ2VJbmZvcy5lcmFzZShpdCk7CiAgICAgfQogICAgIGlmIChzY3JhbWJsZWRMZW5ndGggPT0gMCkgewpAQCAtNTY4LDI2ICs3NzYsNzQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLy8gc2tpcCB0aGUgUEVTIGhlYWRlciwgYW5kIGNvcHkgdGhlIHJlc3QgaW50byBzY3JhbWJsZWQgYWNjZXNzIHVuaXQKLSAgICBzcDxBQnVmZmVyPiBzY3JhbWJsZWRBY2Nlc3NVbml0ID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAotICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpICsgcGVzT2Zmc2V0LAotICAgICAgICAgICAgc2NyYW1ibGVkTGVuZ3RoIC0gcGVzT2Zmc2V0KTsKLQotICAgIC8vIGZpeCB1cCBmaXJzdCBzYW1wbGUgc2l6ZSBhZnRlciBza2lwcGluZyB0aGUgUEVTIGhlYWRlcgotICAgIGlmIChwZXNPZmZzZXQgPiAwKSB7Ci0gICAgICAgIGludDMyX3QgJmZpcnN0Q2xlYXJTaXplID0gKihpbnQzMl90KiljbGVhclNpemVzLT5kYXRhKCk7Ci0gICAgICAgIGludDMyX3QgJmZpcnN0RW5jU2l6ZSA9ICooaW50MzJfdCopZW5jU2l6ZXMtPmRhdGEoKTsKLSAgICAgICAgLy8gQ3V0IGF3YXkgdGhlIFBFUyBoZWFkZXIKLSAgICAgICAgaWYgKGZpcnN0Q2xlYXJTaXplID49IHBlc09mZnNldCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBmb3IgVFMtbGV2ZWwgc2NyYW1ibGluZywgd2UgZGVzY3JhbWJsZWQgdGhlIGZpcnN0Ci0gICAgICAgICAgICAvLyAob3IgaXQgd2FzIGNsZWFyIHRvIGJlZ2luIHdpdGgpCi0gICAgICAgICAgICBmaXJzdENsZWFyU2l6ZSAtPSBwZXNPZmZzZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RFbmNTaXplID49IHBlc09mZnNldCkgewotICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBiZSBQRVMtbGV2ZWwgc2NyYW1ibGluZwotICAgICAgICAgICAgZmlyc3RFbmNTaXplIC09IHBlc09mZnNldDsKLSAgICAgICAgfQorICAgIC8vIFJldHJpZXZlIHRoZSBsZWFkaW5nIGNsZWFyIGJ5dGVzIGluZm8sIGFuZCB1c2UgaXQgdG8gc2V0IHRoZSBjbGVhcgorICAgIC8vIHJhbmdlIG9uIG1CdWZmZXIuIE5vdGUgdGhhdCB0aGUgbGVhZGluZyBjbGVhciBieXRlcyBpbmNsdWRlcyB0aGUKKyAgICAvLyBQRVMgaGVhZGVyIHBvcnRpb24sIHdoaWxlIG1CdWZmZXIgZG9lc24ndC4KKyAgICBpZiAoKGludDMyX3QpbGVhZGluZ0NsZWFyQnl0ZXMgPiBwZXNPZmZzZXQpIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbGVhZGluZ0NsZWFyQnl0ZXMgLSBwZXNPZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIH0KIAorICAgIC8vIFRyeSB0byBwYXJzZSBmb3JtYXRzLCBhbmQgaWYgdW5hdmFpbGFibGUgc2V0IHVwIGEgZHVtbXkgZm9ybWF0LgorICAgIC8vIE9ubHkgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1vZGVzIGZvciBzY3JhbWJsZWQgY29udGVudCBmb3Igbm93LgorICAgIC8vICh3aWxsIGJlIGV4cGFuZGVkIGxhdGVyKS4KKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgSDI2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgMTI4MCk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBBQUMgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOworCisgICAgICAgICAgICAgICAgICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qcHJvZmlsZSovLCA3IC8qc2FtcGxpbmdfZnJlcV9pbmRleCovLCAxIC8qY2hhbm5lbF9jb25maWcqLyk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBNUEVHIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCA3MjApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBtb2RlIGZvciBzY3JhbWJsZWQgY29udGVudCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgMCwgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgIC8vIGNvcHkgaW50byBzY3JhbWJsZWQgYWNjZXNzIHVuaXQKKyAgICBzcDxBQnVmZmVyPiBzY3JhbWJsZWRBY2Nlc3NVbml0ID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBzY3JhbWJsZWRMZW5ndGgpOworCiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICBpZiAoaXNTeW5jKSB7CiAgICAgICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOwpAQCAtNjAwLDYgKzg1Niw3IEBACiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3J5cHRvS2V5Iiwga2V5SWQpOwogICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJjbGVhckJ5dGVzIiwgY2xlYXJTaXplcyk7CiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoImVuY0J5dGVzIiwgZW5jU2l6ZXMpOworICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoInBlc09mZnNldCIsIHBlc09mZnNldCk7CiAKICAgICBtZW1tb3ZlKG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwKICAgICAgICAgICAgIG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSArIHNjcmFtYmxlZExlbmd0aCwKQEAgLTYxNCw3ICs4NzEsMTEgQEAKIH0KIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdCgpIHsKLSAgICBpZiAoKG1GbGFncyAmIGtGbGFnX0FsaWduZWREYXRhKSAmJiBtTW9kZSA9PSBIMjY0ICYmICFpc1NjcmFtYmxlZCgpKSB7CisgICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7CisgICAgfQorCisgICAgaWYgKChtRmxhZ3MgJiBrRmxhZ19BbGlnbmVkRGF0YSkgJiYgbU1vZGUgPT0gSDI2NCkgewogICAgICAgICBpZiAobVJhbmdlSW5mb3MuZW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTY0OCw3ICs5MDksMTAgQEAKICAgICAgICAgY2FzZSBBQUM6CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKICAgICAgICAgY2FzZSBBQzM6Ci0gICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzMoKTsKKyAgICAgICAgY2FzZSBFQUMzOgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0RUFDMygpOworICAgICAgICBjYXNlIEFDNDoKKyAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFDNCgpOwogICAgICAgICBjYXNlIE1QRUdfVklERU86CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKTsKICAgICAgICAgY2FzZSBNUEVHNF9WSURFTzoKQEAgLTY2NiwzNCArOTMwLDM4IEBACiAgICAgfQogfQogCi1zcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUMzKCkgeworc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEVBQzMoKSB7CiAgICAgdW5zaWduZWQgc3luY1N0YXJ0UG9zID0gMDsgIC8vIGluIGJ5dGVzCiAgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOwogICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBuZXcgTWV0YURhdGE7CiAKLSAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUMzWyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzWyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBpZiAoc3luY1N0YXJ0UG9zICsgMiA+PSBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUFDM1N5bmNGcmFtZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zLAotICAgICAgICAgICAgICAgICZmb3JtYXQpOworICAgICAgICB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3M7CisgICAgICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zOworICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKHB0ciwgc2l6ZSwgJmZvcm1hdCk7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gRUFDMykgeworICAgICAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUVBQzNTeW5jRnJhbWUocHRyLCBzaXplLCAmZm9ybWF0KTsKKyAgICAgICAgfQogICAgICAgICBpZiAocGF5bG9hZFNpemUgPiAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzNbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAorICAgICAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzWyVkXTogc3luY1N0YXJ0UG9zICV1IHBheWxvYWRTaXplICV1IiwKICAgICAgICAgICAgICAgICBtQVVJbmRleCwgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CiAKICAgICAgICAgKytzeW5jU3RhcnRQb3M7CiAgICAgfQogCiAgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKSB7Ci0gICAgICAgIEFMT0dWKCJOb3QgZW5vdWdoIGJ1ZmZlciBzaXplIGZvciBBQzMiKTsKKyAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEUvQUMzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNzAxLDcgKzk2OSw2IEBACiAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCi0KICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7CiAgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB0aW1lVXMiKTsKQEAgLTcxMCw3ICs5NzcsMTIgQEAKIAogICAgIC8vIE5vdCBkZWNyeXB0aW5nIGlmIGtleSBpbmZvIG5vdCBhdmFpbGFibGUgKGUuZy4sIHNjYW5uZXIvZXh0cmFjdG9yIHBhcnNpbmcgdHMgZmlsZXMpCiAgICAgaWYgKG1TYW1wbGVEZWNyeXB0b3IgIT0gTlVMTCkgewotICAgICAgICBtU2FtcGxlRGVjcnlwdG9yLT5wcm9jZXNzQUMzKG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICBtU2FtcGxlRGVjcnlwdG9yLT5wcm9jZXNzQUMzKG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEVBQzMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFQUMzIEFVIGlzIGVuY3J5cHRlZCBhbmQgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KICAgICBtQVVJbmRleCsrOwogCkBAIC03MzAsNiArMTAwMiw2OSBAQAogICAgIHJldHVybiBhY2Nlc3NVbml0OwogfQogCitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUM0KCkgeworICAgIHVuc2lnbmVkIHN5bmNTdGFydFBvcyA9IDA7CisgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOworICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDNFslZF06IG1CdWZmZXIgJXAoJXp1KSIsIG1BVUluZGV4LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CisKKyAgICAvLyBBIHZhbGlkIEFDNCBzdHJlYW0gc2hvdWxkIGhhdmUgbWluaW11bSBvZiA3IGJ5dGVzIGluIGl0cyBidWZmZXIuCisgICAgLy8gKFN5bmMgaGVhZGVyIDQgYnl0ZXMgKyBBQzQgdG9jIDMgYnl0ZXMpCisgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDcpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKHN5bmNTdGFydFBvcyArIDIgPj0gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcnNlQUM0U3luY0ZyYW1lKAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICZmb3JtYXQpOworICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzRbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAorICAgICAgICAgICAgICAgIG1BVUluZGV4LCBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKKworICAgICAgICArK3N5bmNTdGFydFBvczsKKyAgICB9CisKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpIHsKKyAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEFDNCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSk7CisgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICBBTE9HRSgibmVnYXRpdmUgdGltZVVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtQVVJbmRleCsrOworCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKyAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CisKKyAgICBtZW1tb3ZlKAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUsCisgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MgLSBwYXlsb2FkU2l6ZSk7CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MgLSBwYXlsb2FkU2l6ZSk7CisgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Cit9CisKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRQQ01BdWRpbygpIHsKICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTg1MSwyNSArMTE4NiwxMSBAQAogICAgICAgICBib29sIHByb3RlY3Rpb25fYWJzZW50ID0gYml0cy5nZXRCaXRzKDEpICE9IDA7CiAKICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZSA9IGJpdHMuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlID09IDN1KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInByb2ZpbGUgc2hvdWxkIG5vdCBiZSAzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4ID0gYml0cy5nZXRCaXRzKDQpOwotICAgICAgICAgICAgYml0cy5nZXRCaXRzKDEpOyAgLy8gcHJpdmF0ZV9iaXQKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGJpdHMuZ2V0Qml0cygzKTsKLSAgICAgICAgICAgIGlmIChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPT0gMHUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY2hhbm5lbF9jb25maWcgc2hvdWxkIG5vdCBiZSAwIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAgLy8gb3JpZ2luYWxfY29weSwgaG9tZQotCiAgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwotCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SXNBRFRTLCB0cnVlKTsKKyAgICAgICAgICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CkBAIC04ODQsMTIgKzEyMDUsMTIgQEAKIAogICAgICAgICAgICAgQUxPR0koImZvdW5kIEFBQyBjb2RlYyBjb25maWcgKCVkIEh6LCAlZCBjaGFubmVscykiLAogICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBwcm9maWxlX09iamVjdFR5cGUsIHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleCwgcHJpdmF0ZV9iaXRzLAotICAgICAgICAgICAgLy8gY2hhbm5lbF9jb25maWd1cmF0aW9uLCBvcmlnaW5hbF9jb3B5LCBob21lCi0gICAgICAgICAgICBiaXRzLnNraXBCaXRzKDEyKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHByb2ZpbGVfT2JqZWN0VHlwZSwgc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4LCBwcml2YXRlX2JpdHMsCisgICAgICAgIC8vIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgb3JpZ2luYWxfY29weSwgaG9tZQorICAgICAgICBiaXRzLnNraXBCaXRzKDEyKTsKKwogICAgICAgICAvLyBhZHRzX3ZhcmlhYmxlX2hlYWRlcgogCiAgICAgICAgIC8vIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9iaXQsIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9zdGFydApAQCAtMTAwNCwyNyArMTMyNSw2IEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCkgewotICAgIGlmIChpc1NjcmFtYmxlZCgpKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELCAwLAotICAgICAgICAgICAgICAgICAgICBtQ2FzU2Vzc2lvbklkLmRhdGEoKSwgbUNhc1Nlc3Npb25JZC5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpOwotICAgIH0KLQogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKQEAgLTEyMjYsNiArMTUyNiw3IEBACiAgICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVTaXplLCAmc2FtcGxpbmdSYXRlLCAmbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgJmJpdHJhdGUsICZudW1TYW1wbGVzKSkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhdWRpbyBmcmFtZSBzaXplIik7CisgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTEyNTAsNiArMTU1MSwyMiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBpZiAobUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIGlmIChtRm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgICAgICAgICAgaWYgKChsYXllciA9PSAxKSAmJiBzdHJjbXAgKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gbGF5ZXIgaXMgbm90IE1QRUdfTEFZRVJfSSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmICgobGF5ZXIgPT0gMikgJiYgc3RyY21wIChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBsYXllciBpcyBub3QgTVBFR19MQVlFUl9JSSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmICgobGF5ZXIgPT0gMykgJiYgc3RyY21wIChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBsYXllciBpcyBub3QgQVVESU9fTVBFRyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKIApAQCAtMTMyNCwyNSArMTY0MSw2IEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKSB7Ci0gICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKLSAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IE1QRUcgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOwotICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKLQotICAgICAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBtQ0FTeXN0ZW1JZCk7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwgMCwKLSAgICAgICAgICAgICAgICAgICAgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKLSAgICB9Ci0KICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwogICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCmluZGV4IGZmY2I1MDIuLjMyMjdmNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC0zOCw2ICszOCw4IEBACiAgICAgICAgIEgyNjQsCiAgICAgICAgIEFBQywKICAgICAgICAgQUMzLAorICAgICAgICBFQUMzLAorICAgICAgICBBQzQsCiAgICAgICAgIE1QRUdfQVVESU8sCiAgICAgICAgIE1QRUdfVklERU8sCiAgICAgICAgIE1QRUc0X1ZJREVPLApAQCAtNTksNiArNjEsNyBAQAogCiAgICAgdm9pZCBhcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXMsCiAgICAgICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIHNwPEFCdWZmZXI+IGVuY1NpemVzKTsKIApAQCAtODQsOCArODcsOCBAQAogICAgIH07CiAKICAgICBzdHJ1Y3QgU2NyYW1ibGVkUmFuZ2VJbmZvIHsKLSAgICAgICAgLy9pbnQ2NF90IG1UaW1lc3RhbXBVczsKICAgICAgICAgc2l6ZV90IG1MZW5ndGg7CisgICAgICAgIHNpemVfdCBtTGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgICAgIGludDMyX3QgbUtleUlkOwogICAgICAgICBpbnQzMl90IG1Jc1N5bmM7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1DbGVhclNpemVzOwpAQCAtMTE1LDcgKzExOCw4IEBACiAKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOwotICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0QUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdBdWRpbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHNFZpZGVvKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKaW5kZXggNGUyZDM5OC4uMTIxYmIxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcApAQCAtMTI0LDExICsxMjQsMTEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHF1aXJrIDogY29kZWMtPnNlY29uZC5xdWlya1NldCkgewotICAgICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJxdWlyazo6cmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiKSB7CiAgICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBPTVhOb2RlSW5zdGFuY2U6OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIpIHsKKyAgICAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInF1aXJrOjpyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSB7CiAgICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBPTVhOb2RlSW5zdGFuY2U6OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCmluZGV4IDQ0N2FmNmYuLjJlMDQxZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCkBAIC02MSwxMCArNjEsNyBAQAogICAgICAgICByb2xlLnJvbGUgPSByb2xlUGFpci5maXJzdDsKICAgICAgICAgcm9sZS50eXBlID0gcm9sZVBhaXIuc2Vjb25kLnR5cGU7CiAgICAgICAgIHJvbGUuaXNFbmNvZGVyID0gcm9sZVBhaXIuc2Vjb25kLmlzRW5jb2RlcjsKLSAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCBwcmVmZXJQbGF0Zm9ybU5vZGVzIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4KLSAgICAgICAgLy8gdGhlIHhtbCBmaWxlLiBPbmNlIHdlIGhhdmUgYSB3YXkgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLCBpdAotICAgICAgICAvLyBzaG91bGQgYmUgcGFyc2VkIHByb3Blcmx5LgotICAgICAgICByb2xlLnByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlUGFpci5maXJzdC5jb21wYXJlKDAsIDUsICJhdWRpbyIpID09IDA7CisgICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IGZhbHNlOyAvLyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkLCB1c2luZyByYW5rIGluc3RlYWQKICAgICAgICAgaGlkbF92ZWM8Tm9kZUluZm8+JiBub2RlTGlzdCA9IHJvbGUubm9kZXM7CiAgICAgICAgIG5vZGVMaXN0LnJlc2l6ZShyb2xlUGFpci5zZWNvbmQubm9kZUxpc3Quc2l6ZSgpKTsKICAgICAgICAgc2l6ZV90IGogPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAppbmRleCAxMGI5NWQ5Li40MzgzMDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icApAQCAtNTMsNyArNTMsNiBAQAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKLSAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsIC8vIFRPRE8oYi82MjkyMzQ3OSk6IHVzZSBoZWFkZXIgbGlicmFyeQogICAgICAgICAibGlidm5ka3N1cHBvcnQiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCmluZGV4IDllZDRhOTkuLjFiODQ5M2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcApAQCAtMTUwLDYgKzE1MCw4IEBACiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci52cDgiLCAidmlkZW9fZW5jb2Rlci52cDgiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIudnA5IiwgInZpZGVvX2VuY29kZXIudnA5IiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSwKKyAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmF2MSIsICJ2aWRlb19lbmNvZGVyLmF2MSIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5yYXciLCAiYXVkaW9fZW5jb2Rlci5yYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLApAQCAtMTY0LDYgKzE2NiwxMCBAQAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWMzIiwgImF1ZGlvX2VuY29kZXIuYWMzIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5lYWMzIiwgImF1ZGlvX2VuY29kZXIuZWFjMyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQywKKyAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmVhYzNfam9jIiwgImF1ZGlvX2VuY29kZXIuZWFjM19qb2MiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0LAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWM0IiwgImF1ZGlvX2VuY29kZXIuYWM0IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywKICAgICAgICAgICAgICJpbWFnZV9kZWNvZGVyLmhlaWMiLCAiaW1hZ2VfZW5jb2Rlci5oZWljIiB9LAogICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKaW5kZXggNTVhZmUwNC4uZGRiNDU5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMzQsNyArMzQsOCBAQAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtSGFuZGxlcihuZXcgQUhhbmRsZXJSZWZsZWN0b3I8U2ltcGxlU29mdE9NWENvbXBvbmVudD4odGhpcykpLAogICAgICAgbVN0YXRlKE9NWF9TdGF0ZUxvYWRlZCksCi0gICAgICBtVGFyZ2V0U3RhdGUoT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICBtVGFyZ2V0U3RhdGUoT01YX1N0YXRlTG9hZGVkKSwKKyAgICAgIG1GcmFtZUNvbmZpZyhmYWxzZSkgewogICAgIG1Mb29wZXItPnNldE5hbWUobmFtZSk7CiAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKIApAQCAtMjA0LDYgKzIwNSwyMSBAQAogICAgIH0KIH0KIAorT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgYm9vbCBmcmFtZUNvbmZpZyA9IG1GcmFtZUNvbmZpZzsKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9IGludGVybmFsU2V0Q29uZmlnKGluZGV4LCBwYXJhbXMsICZmcmFtZUNvbmZpZyk7CisgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIG1GcmFtZUNvbmZpZyA9IGZyYW1lQ29uZmlnOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnVzZUJ1ZmZlcigKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipoZWFkZXIsCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LApAQCAtMzM2LDYgKzM1MiwxMCBAQAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVtcHR5VGhpc0J1ZmZlciwgbUhhbmRsZXIpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiaGVhZGVyIiwgYnVmZmVyKTsKKyAgICBpZiAobUZyYW1lQ29uZmlnKSB7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImZyYW1lLWNvbmZpZyIsIG1GcmFtZUNvbmZpZyk7CisgICAgICAgIG1GcmFtZUNvbmZpZyA9IGZhbHNlOworICAgIH0KICAgICBtc2ctPnBvc3QoKTsKIAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwpAQCAtMzc4LDYgKzM5OCwxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiaGVhZGVyIiwgKHZvaWQgKiopJmhlYWRlcikpOworICAgICAgICAgICAgaW50MzJfdCBmcmFtZUNvbmZpZzsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImZyYW1lLWNvbmZpZyIsICZmcmFtZUNvbmZpZykpIHsKKyAgICAgICAgICAgICAgICBmcmFtZUNvbmZpZyA9IDA7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcgJiYgbVRhcmdldFN0YXRlID09IG1TdGF0ZSk7CiAKQEAgLTM5Myw2ICs0MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDSyghYnVmZmVyLT5tT3duZWRCeVVzKTsKIAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1Pd25lZEJ5VXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1GcmFtZUNvbmZpZyA9IChib29sKWZyYW1lQ29uZmlnOwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLKChtc2dUeXBlID09IGtXaGF0RW1wdHlUaGlzQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcG9ydC0+bURlZi5lRGlyID09IE9NWF9EaXJJbnB1dCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCA5MzVkYzM0Li5lODUzZGE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC0xNTQsMTIgKzE1NCwxMiBAQAogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0OwotICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAKICAgICBpbnQzMl90IGJwcCA9IChtT3V0cHV0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikgPyAyIDogMTsKKyAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKiBicHA7CiAgICAgb3V0RGVmLT5uQnVmZmVyU2l6ZSA9Ci0gICAgICAgIChvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlICogb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ICogYnBwICogMykgLyAyOworICAgICAgICAgICAgKG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgKiBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgKiAzKSAvIDI7CiAKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICppbkRlZiA9ICZlZGl0UG9ydEluZm8oa0lucHV0UG9ydEluZGV4KS0+bURlZjsKICAgICBpbkRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOwpAQCAtNTAyLDcgKzUwMiw4IEBACiAgICAgICAgICAgICAvLyBUaGVzZSB2YWx1ZXMgd2VyZSBjaG9zZW4gdG8gcHJldmVudCBpbnRlZ2VyIG92ZXJmbG93cyBmdXJ0aGVyIGRvd24gdGhlIGxpbmUsIGFuZCBkbwogICAgICAgICAgICAgLy8gbm90IGluZGljYXRlIHN1cHBvcnQgZm9yIDMya3gzMmsgdmlkZW8uCiAgICAgICAgICAgICBpZiAobmV3V2lkdGggPiAzMjc2OCB8fCBuZXdIZWlnaHQgPiAzMjc2OAotICAgICAgICAgICAgICAgICAgICB8fCB2aWRlb19kZWYtPm5TdHJpZGUgPiAzMjc2OCB8fCB2aWRlb19kZWYtPm5TbGljZUhlaWdodCA+IDMyNzY4KSB7CisgICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blN0cmlkZSA+IDMyNzY4IHx8IHZpZGVvX2RlZi0+blN0cmlkZSA8IC0zMjc2OAorICAgICAgICAgICAgICAgICAgICB8fCB2aWRlb19kZWYtPm5TbGljZUhlaWdodCA+IDMyNzY4KSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjI4ODU0MjEiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwogICAgICAgICAgICAgfQpAQCAtNjAxLDEzICs2MDIsNDAgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSGRyMTBQbHVzT3V0cHV0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1IZHIxMFBsdXNPdXRwdXRzLmJlZ2luKCk7CisKKyAgICAgICAgICAgICAgICBhdXRvIGluZm8gPSAoKml0KS5nZXQoKTsKKworICAgICAgICAgICAgICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogb3V0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKilwYXJhbXM7CisKKyAgICAgICAgICAgICAgICBvdXRQYXJhbXMtPm5QYXJhbVNpemVVc2VkID0gaW5mby0+c2l6ZSgpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGJ1ZmZlciBwcm92aWRlZCBieSB0aGUgY2xpZW50IGRvZXMgbm90IGhhdmUgZW5vdWdoCisgICAgICAgICAgICAgICAgLy8gc3RvcmFnZSwgcmV0dXJuIHRoZSBzaXplIG9ubHkgYW5kIGRvIG5vdCByZW1vdmUgdGhlIHBhcmFtIHlldC4KKyAgICAgICAgICAgICAgICBpZiAob3V0UGFyYW1zLT5uUGFyYW1TaXplID49IGluZm8tPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkob3V0UGFyYW1zLT5uVmFsdWUsIGluZm8tPmRhdGEoKSwgaW5mby0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhkcjEwUGx1c091dHB1dHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlcmZsb3c7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpeworT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKXsKICAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBrRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleDoKICAgICAgICAgewpAQCAtNjU3LDExICs2ODUsNTUgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogaW5QYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoKmZyYW1lQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcXVlc3QgdG8gYXBwZW5kIHRvIHRoZSBjdXJyZW50IGZyYW1lIGNvbmZpZyBzZXQuCisgICAgICAgICAgICAgICAgLy8gRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleCwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyB3ZSBzaW1wbHkgcmVwbGFjZSB3aXRoIHRoZSBsYXN0IHNldCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBpZiAobUhkcjEwUGx1c0lucHV0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICooLS1tSGRyMTBQbHVzSW5wdXRzLmVuZCgpKSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmFtcy0+blZhbHVlLCBpblBhcmFtcy0+blBhcmFtU2l6ZVVzZWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg6IGFwcGVuZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lIGNvbmZpZyB3aGlsZSBubyBmcmFtZSBjb25maWcgaXMgcHJlc2VudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGZyYW1lIGNvbmZpZywgc2V0dGluZyAqZnJhbWVDb25maWcgdG8gdHJ1ZSBzbyB0aGF0CisgICAgICAgICAgICAgICAgLy8gdGhlIGNsaWVudCBtYXJrcyB0aGUgbmV4dCBxdWV1ZWQgaW5wdXQgZnJhbWUgdG8gYXBwbHkgaXQuCisgICAgICAgICAgICAgICAgKmZyYW1lQ29uZmlnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtSGRyMTBQbHVzSW5wdXRzLnB1c2hfYmFjayhBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmFtcy0+blZhbHVlLCBpblBhcmFtcy0+blBhcmFtU2l6ZVVzZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwogICAgIH0KIH0KIAorc3A8QUJ1ZmZlcj4gU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6ZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKSB7CisgICAgYXV0byBpdCA9IG1IZHIxMFBsdXNJbnB1dHMuYmVnaW4oKTsKKyAgICBzcDxBQnVmZmVyPiBpbmZvID0gKml0OworICAgIG1IZHIxMFBsdXNJbnB1dHMuZXJhc2UoaXQpOworICAgIHJldHVybiBpbmZvOworfQorCit2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnF1ZXVlT3V0cHV0RnJhbWVDb25maWcoY29uc3Qgc3A8QUJ1ZmZlcj4gJmluZm8pIHsKKyAgICBtSGRyMTBQbHVzT3V0cHV0cy5wdXNoX2JhY2soaW5mbyk7CisgICAgbm90aWZ5KE9NWF9FdmVudENvbmZpZ1VwZGF0ZSwKKyAgICAgICAgICAga091dHB1dFBvcnRJbmRleCwKKyAgICAgICAgICAga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICBOVUxMKTsKK30KIAogT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKQEAgLTY3Niw2ICs3NDgsMTAgQEAKICAgICAgICAgICAgICYmIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKSkgewogICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4OwogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5kZXNjcmliZUhEUjEwUGx1c0luZm8iKQorICAgICAgICAgICAgJiYgc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpKSB7CisgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KIAogICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleChuYW1lLCBpbmRleCk7CkBAIC02OTMsNiArNzY5LDEwIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKSB7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCmluZGV4IGE5ZmNlNTUuLjBmMjI5ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCkBAIC0xOTAsNyArMTkwLDEyIEBACiAgKi8KIC8vIGNvbnZlcnQ6IFN0YXR1cyAtPiBzdGF0dXNfdAogaW5saW5lIHN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48U3RhdHVzPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKSA6IFVOS05PV05fRVJST1I7CisgICAgaWYgKHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSk7CisgICAgfSBlbHNlIGlmICh0LmlzRGVhZE9iamVjdCgpKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKaW5kZXggMWQxZjJiZC4uNmJiZWRkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJTb2Z0T01YQ29tcG9uZW50LmgiCiAKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC0yOCw2ICsyOSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTG9vcGVyOworc3RydWN0IEFCdWZmZXI7CiAKIHN0cnVjdCBDb2RlY1Byb2ZpbGVMZXZlbCB7CiAgICAgT01YX1UzMiBtUHJvZmlsZTsKQEAgLTQ5LDYgKzUxLDcgQEAKICAgICBzdHJ1Y3QgQnVmZmVySW5mbyB7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICptSGVhZGVyOwogICAgICAgICBib29sIG1Pd25lZEJ5VXM7CisgICAgICAgIGJvb2wgbUZyYW1lQ29uZmlnOwogICAgIH07CiAKICAgICBzdHJ1Y3QgUG9ydEluZm8gewpAQCAtNzYsNiArNzksOSBAQAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKIAorICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CisKICAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZnZXRQb3J0UXVldWUoT01YX1UzMiBwb3J0SW5kZXgpOwogCkBAIC0xMDEsNiArMTA3LDcgQEAKICAgICBPTVhfU1RBVEVUWVBFIG1UYXJnZXRTdGF0ZTsKIAogICAgIFZlY3RvcjxQb3J0SW5mbz4gbVBvcnRzOworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUZyYW1lQ29uZmlnOwogCiAgICAgYm9vbCBpc1NldFBhcmFtZXRlckFsbG93ZWQoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgY29uc3Q7CkBAIC0xMTQsNiArMTIxLDkgQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOwogCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKwogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSB1c2VCdWZmZXIoCiAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKaW5kZXggNTZmYzY5MS4uM2IzODFjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgpAQCAtMjgsNiArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ4LDYgKzUwLDcgQEAKICAgICBlbnVtIHsKICAgICAgICAga0Rlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXggPSBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleCArIDEsCiAgICAgICAgIGtEZXNjcmliZUhkclN0YXRpY0luZm9JbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMiwKKyAgICAgICAga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAzLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTY4LDggKzcxLDggQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0Q29uZmlnKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOwogCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKLSAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpOwogCiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwpAQCAtODAsNiArODMsOCBAQAogCiAgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKIAorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCk7CisKICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYm90aCBtaW5pbXVtIGJ1ZmZlciBjb3VudCBhbmQgYWN0dWFsIGJ1ZmZlciBjb3VudCBvZgogICAgIC8vIGlucHV0IHBvcnQgdG8gYmUgfG51bUlucHV0QnVmZmVyc3wuIEl0IHdpbGwgYWxzbyBzZXQgYm90aCBtaW5pbXVtIGJ1ZmZlcgogICAgIC8vIGNvdW50IGFuZCBhY3R1YWwgYnVmZmVyIGNvdW50IG9mIG91dHB1dCBwb3J0IHRvIGJlIHxudW1PdXRwdXRCdWZmZXJzfC4KQEAgLTE2Niw2ICsxNzEsOSBAQAogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBkdW1wIHRoZSBDb2xvckFzcGVjdHMuCiAgICAgdm9pZCBkdW1wQ29sb3JBc3BlY3RzKGNvbnN0IENvbG9yQXNwZWN0cyAmY29sb3JBc3BlY3RzKTsKIAorICAgIHNwPEFCdWZmZXI+IGRlcXVldWVJbnB1dEZyYW1lQ29uZmlnKCk7CisgICAgdm9pZCBxdWV1ZU91dHB1dEZyYW1lQ29uZmlnKGNvbnN0IHNwPEFCdWZmZXI+ICZpbmZvKTsKKwogcHJpdmF0ZToKICAgICB1aW50MzJfdCBtTWluSW5wdXRCdWZmZXJTaXplOwogICAgIHVpbnQzMl90IG1NaW5Db21wcmVzc2lvblJhdGlvOwpAQCAtMTc0LDYgKzE4Miw5IEBACiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgbUNvZGluZ1R5cGU7CiAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgKm1Qcm9maWxlTGV2ZWxzOwogICAgIHNpemVfdCBtTnVtUHJvZmlsZUxldmVsczsKKyAgICB0eXBlZGVmIExpc3Q8c3A8QUJ1ZmZlcj4gPiBIZHIxMFBsdXNJbmZvTGlzdDsKKyAgICBIZHIxMFBsdXNJbmZvTGlzdCBtSGRyMTBQbHVzSW5wdXRzOworICAgIEhkcjEwUGx1c0luZm9MaXN0IG1IZHIxMFBsdXNPdXRwdXRzOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlZjM2OTgyLi5mYjAzMjI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icApAQCAtOSw3ICs5LDYgQEAKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLApAQCAtMjksNiArMjgsNyBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCmluZGV4IDE1YTc2NTUuLmMyZjEwNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcAppbmRleCA4MmEwNjMxLi40MzAyYWVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcApAQCAtNDIzLDYgKzQyMywxMSBAQAogICAgICAgICAgICAgQ0hFQ0tfTEUob2Zmc2V0ICsgKG1PdGhlckRhdGFMZW5CaXRzIC8gOCksIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICAgICAgICAgIG9mZnNldCArPSBtT3RoZXJEYXRhTGVuQml0cyAvIDg7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IG1OdW1TdWJGcmFtZXMgJiYgb2Zmc2V0ID49IGJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HVygiU2tpcCBzdWJmcmFtZXMgYWZ0ZXIgJWQsIHRvdGFsICVkIiwgKGludClpLCAoaW50KW1OdW1TdWJGcmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAob2Zmc2V0IDwgYnVmZmVyLT5zaXplKCkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAppbmRleCAwMTYxN2I2Li43ODllNjJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJBUlRTUENvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC01OSw4ICs2MCw4IEBACiAgICAgaWYgKG1Tb2NrZXQgPj0gMCkgewogICAgICAgICBBTE9HRSgiQ29ubmVjdGlvbiBpcyBzdGlsbCBvcGVuLCBjbG9zaW5nIHRoZSBzb2NrZXQuIik7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTIxNCw4ICsyMTUsOCBAQAogCiAgICAgaWYgKG1TdGF0ZSAhPSBESVNDT05ORUNURUQpIHsKICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICAgICAgfQogICAgICAgICBjbG9zZShtU29ja2V0KTsKICAgICAgICAgbVNvY2tldCA9IC0xOwpAQCAtMjU0LDcgKzI1NSw3IEBACiAKICAgICBzdHJ1Y3QgaG9zdGVudCAqZW50ID0gZ2V0aG9zdGJ5bmFtZShob3N0LmNfc3RyKCkpOwogICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiVW5rbm93biBob3N0ICVzIiwgaG9zdC5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIlVua25vd24gaG9zdCAlcyIsIHVyaURlYnVnU3RyaW5nKGhvc3QpLmNfc3RyKCkpOwogCiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgLUVOT0VOVCk7CiAgICAgICAgIHJlcGx5LT5wb3N0KCk7CkBAIC0yNjYsOSArMjY3LDkgQEAKICAgICBtU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKIAogICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0LCBtVUlELAorICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0LCBtVUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUU1AiKTsKLSAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCwgbVVJRCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0LCBtVUlEKTsKICAgICB9CiAKICAgICBNYWtlU29ja2V0QmxvY2tpbmcobVNvY2tldCwgZmFsc2UpOwpAQCAtMjk3LDggKzI5OCw4IEBACiAgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKIAogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CkBAIC0zMTUsOCArMzE2LDggQEAKIAogdm9pZCBBUlRTUENvbm5lY3Rpb246OnBlcmZvcm1EaXNjb25uZWN0KCkgewogICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICB9CiAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgbVNvY2tldCA9IC0xOwpAQCAtMzg5LDggKzM5MCw4IEBACiAKICAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAppbmRleCAzMjUwODRjLi45MjYzNTY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKQEAgLTgwLDcgKzgwLDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCIlcyIsIGxpbmUuY19zdHIoKSk7CiAKICAgICAgICAgc3dpdGNoIChsaW5lLmNfc3RyKClbMF0pIHsKICAgICAgICAgICAgIGNhc2UgJ3YnOgpAQCAtMjYxLDcgKzI2MSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoc3RybmNtcCh2YWx1ZS5jX3N0cigpLCAibnB0PSIsIDQpKSB7CisgICAgaWYgKHN0cm5jbXAodmFsdWUuY19zdHIoKSwgIm5wdD0iLCA0KSAmJiBzdHJuY21wKHZhbHVlLmNfc3RyKCksICJucHQ6IiwgNCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCmluZGV4IDU5NTFkZGYuLjliYzljODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw1IEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwX2RlZmF1bHRzIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkFBTVJBc3NlbWJsZXIuY3BwIiwKQEAgLTQ5LDYgKzQ5LDIxIEBACiAgICAgfSwKIH0KIAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKKworICAgIHNyY3M6IFsiTmV0d29ya1V0aWxzLmNwcCJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYm5ldGRfY2xpZW50X2hlYWRlcnMiXSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9ydHNwX2RlZmF1bHRzIl0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcF9wbGF5ZXIyIiwKKworICAgIHNyY3M6IFsiTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAiXSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9ydHNwX2RlZmF1bHRzIl0sCit9CisKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBjY190ZXN0IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IGQxODM1MTYuLmI0NTE1ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCiAjaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCiAjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgpAQCAtMzQ0LDggKzM0NSw3IEBACiAKICAgICAgICAgICAgIHN0cnVjdCBob3N0ZW50ICplbnQgPSBnZXRob3N0YnluYW1lKG1TZXNzaW9uSG9zdC5jX3N0cigpKTsKICAgICAgICAgICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbG9vayB1cCBhZGRyZXNzIG9mIHNlc3Npb24gaG9zdCAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSG9zdC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGxvb2sgdXAgYWRkcmVzcyBvZiBzZXNzaW9uIGhvc3QiKTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KQEAgLTUzMCw3ICs1MzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChBU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQocGF0aCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgicmV3cml0dGVuIHNlc3Npb24gdXJsOiAnJXMnIiwgbVNlc3Npb25VUkwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCB0aGlzKTsKQEAgLTc1NywxMCArNzU3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrLT5tVXNpbmdJbnRlcmxlYXZlZFRDUCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB0YWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVENQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UodHJhY2stPm1SVFBTb2NrZXQpOwpAQCAtODg2LDEwICs4ODYsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRhZwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGluZm8tPm1SVFBTb2NrZXQpOwpAQCAtMTY2NSwxMiArMTY2NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAmaW5mby0+bVJUUFNvY2tldCwgJmluZm8tPm1SVENQU29ja2V0LCAmcnRwUG9ydCk7CiAKICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0LCBtVUlEKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0LCBtVUlEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlRyYW5zcG9ydDogUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD0iKTsKQEAgLTE5MTIsNyArMTkxMiw3IEBACiAgICAgICAgICAgICBtTGFzdE1lZGlhVGltZVVzID0gbWVkaWFUaW1lVXM7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobWVkaWFUaW1lVXMgPCAwKSB7CisgICAgICAgIGlmIChtZWRpYVRpbWVVcyA8IDAgJiYgIW1TZWVrYWJsZSkgewogICAgICAgICAgICAgQUxPR1YoImRyb3BwaW5nIGVhcmx5IGFjY2Vzc1VuaXQuIik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzM2Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgorI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CisjaW5jbHVkZSA8TmV0ZENsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF91bnRhZ1NvY2tldChzb2NrZmQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHVudGFnZ2luZyBzb2NrZXQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIGdldGV1aWQoKSk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCkgeworICAgIHNldE5ldHdvcmtGb3JVc2VyKHVpZCwgc29ja2ZkKTsKK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKKyAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWVlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5FVFdPUktfVVRJTFNfSF8KKyNkZWZpbmUgTkVUV09SS19VVElMU19IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBOZXR3b3JrVXRpbHMgeworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpOworCisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTkVUV09SS19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyMTU5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1V0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisKKy8vIE5ldHdvcmtVdGlscyBpbXBsZW1lbnRhdGlvbiBmb3IgYXBwbGljYXRpb24gcHJvY2Vzcy4KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCwgdWlkX3QsIHVpbnQzMl90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQpIHsKKyAgICAvLyBObyBvcC4KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQsIHVpZF90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50KSB7CisgICAgLy8gTm8gb3AuCit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKaW5kZXggZDQ1OWNiZC4uNjY1ZDUxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcApAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICBtTmV0TG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1DYW5jZWxsZWQoZmFsc2UpLAotICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSkgeworICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBDbGVhck1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CiAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgic2RwIG5ldCIpOwogICAgIG1OZXRMb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKaW5kZXggYTRlODg5ZC4uNjkzNTY1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKQEAgLTIyLDMgKzIyLDMzIEBACiAKICAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAogfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dDIiLAorCisgICAgc3JjczogWyJUZXh0RGVzY3JpcHRpb25zMi5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OGVhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1RleHREZXNjcmlwdGlvbnMyOjpUZXh0RGVzY3JpcHRpb25zMigpIHsKK30KKworc3RhdHVzX3QgVGV4dERlc2NyaXB0aW9uczI6OmdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICB1aW50MzJfdCBmbGFncywgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisgICAgaWYgKGZsYWdzICYgSU5fQkFORF9URVhUXzNHUFApIHsKKyAgICAgICAgaWYgKGZsYWdzICYgR0xPQkFMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKGRhdGEsIHNpemUsIHBsYXllck1zZyk7CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBMT0NBTF9ERVNDUklQVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKGRhdGEsIHNpemUsIHRpbWVNcywgcGxheWVyTXNnKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBPVVRfT0ZfQkFORF9URVhUX1NSVCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBMT0NBTF9ERVNDUklQVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgdGltZU1zLCBwbGF5ZXJNc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCisvLyBQYXJzZSB0aGUgU1JUIHRleHQgc2FtcGxlLCBhbmQgc3RvcmUgdGhlIHRpbWluZyBhbmQgdGV4dCBzYW1wbGUgaW4gYSBQbGF5ZXJNZXNzYWdlLgorLy8gVGhlIFBsYXllck1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIE1lZGlhUGxheWVyMi5qYXZhIHRocm91Z2ggZXZlbnQsIGFuZCB3aWxsIGJlCisvLyBwYXJzZWQgaW4gVGltZWRUZXh0LmphdmEuCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdFNSVExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX0xPQ0FMX1NFVFRJTkcpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUQVJUX1RJTUUpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodGltZU1zKTsKKworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKGRhdGEsIHNpemUpOworCisgICAgcmV0dXJuIE9LOworfQorCisvLyBFeHRyYWN0IHRoZSBsb2NhbCAzR1BQIGRpc3BsYXkgZGVzY3JpcHRpb25zLiAzR1BQIGxvY2FsIGRlc2NyaXB0aW9ucworLy8gYXJlIGFwcGVuZGVkIHRvIHRoZSB0ZXh0IHNhbXBsZSBpZiBhbnkuCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdDNHUFBMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpIHsKKworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX0xPQ0FMX1NFVFRJTkcpOworCisgICAgLy8gd3JpdGUgc3RhcnQgdGltZSB0byBkaXNwbGF5IHRoaXMgdGV4dCBzYW1wbGUKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVEFSVF9USU1FKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHRpbWVNcyk7CisKKyAgICBpZiAoc2l6ZSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBzc2l6ZV90IHRleHRMZW4gPSAoKmRhdGEpIDw8IDggfCAoKihkYXRhICsgMSkpOworCisgICAgaWYgKHNpemUgPCB0ZXh0TGVuICsgMikgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gd3JpdGUgdGV4dCBzYW1wbGUgbGVuZ3RoIGFuZCB0ZXh0IHNhbXBsZSBpdHNlbGYKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVFJVQ1RfVEVYVCk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShkYXRhICsgMiwgdGV4dExlbik7CisKKyAgICBpZiAoc2l6ZSA+IHRleHRMZW4gKyAyKSB7CisgICAgICAgIGRhdGEgKz0gKHRleHRMZW4gKyAyKTsKKyAgICAgICAgc2l6ZSAtPSAodGV4dExlbiArIDIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB3aGlsZSAoc2l6ZSA+PSA4KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRtcERhdGEgPSBkYXRhOworICAgICAgICBzc2l6ZV90IGNodW5rU2l6ZSA9IFUzMl9BVCh0bXBEYXRhKTsgICAgICAvLyBzaXplIGluY2x1ZGVzIHNpemUgYW5kIHR5cGUKKyAgICAgICAgdWludDMyX3QgY2h1bmtUeXBlID0gVTMyX0FUKHRtcERhdGEgKyA0KTsKKworICAgICAgICBpZiAoY2h1bmtTaXplIDw9IDggfHwgY2h1bmtTaXplID4gc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IGNodW5rU2l6ZSAtIDg7CisKKyAgICAgICAgdG1wRGF0YSArPSA4OworCisgICAgICAgIHN3aXRjaChjaHVua1R5cGUpIHsKKyAgICAgICAgICAgIC8vICd0Ym94JyBib3ggdG8gaW5kaWNhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSB0ZXh0IHdpdGggdmFsdWVzCisgICAgICAgICAgICAvLyBvZiB0b3AsIGxlZnQsIGJvdHRvbSBhbmQgcmlnaHQKKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2InLCAnbycsICd4Jyk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVFJVQ1RfVEVYVF9QT1MpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgMikpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyA0KSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDYpKTsKKworICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gODsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGNodW5rU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBjaHVua1NpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvLyBUbyBleHRyYWN0IGJveCAndHgzZycgZGVmaW5lZCBpbiAzR1BQIFRTIDI2LjI0NSwgYW5kIHN0b3JlIGl0IGluIGEgUGxheWVyTWVzc2FnZQorc3RhdHVzX3QgVGV4dERlc2NyaXB0aW9uczI6OmV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfR0xPQkFMX1NFVFRJTkcpOworCisgICAgd2hpbGUgKHNpemUgPj0gOCkgeworICAgICAgICBzc2l6ZV90IGNodW5rU2l6ZSA9IFUzMl9BVChkYXRhKTsKKyAgICAgICAgdWludDMyX3QgY2h1bmtUeXBlID0gVTMyX0FUKGRhdGEgKyA0KTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdG1wRGF0YSA9IGRhdGE7CisgICAgICAgIHRtcERhdGEgKz0gODsKKyAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IHNpemUgLSA4OworCisgICAgICAgIGlmIChzaXplIDwgY2h1bmtTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKGNodW5rVHlwZSkgeworICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAneCcsICczJywgJ2cnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgMTgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBTa2lwIERJU1BMQVlfRkxBR1MsIFNUUlVDVF9KVVNUSUZJQ0FUSU9OLCBhbmQgQkFDS0dST1VORF9DT0xPUl9SR0JBCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSAxODsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gMTg7CisKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUX1BPUyk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDQpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNikpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxODsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgcmVtYWluaW5nIGRhdGEuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGF0YSArPSBjaHVua1NpemU7CisgICAgICAgIHNpemUgLT0gY2h1bmtTaXplOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZDJkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5oCkBAIC0wLDAgKzEsODggQEAKKyAvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBURVhUX0RFU0NSSVBUSU9OUzJfSF8KKworI2RlZmluZSBURVhUX0RFU0NSSVBUSU9OUzJfSF8KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFRleHREZXNjcmlwdGlvbnMyIHsKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAgSU5fQkFORF9URVhUXzNHUFAgICAgICAgICAgICAgPSAweDAxLAorICAgICAgICBPVVRfT0ZfQkFORF9URVhUX1NSVCAgICAgICAgICA9IDB4MDIsCisKKyAgICAgICAgR0xPQkFMX0RFU0NSSVBUSU9OUyAgICAgICAgICAgPSAweDEwMCwKKyAgICAgICAgTE9DQUxfREVTQ1JJUFRJT05TICAgICAgICAgICAgPSAweDIwMCwKKyAgICB9OworCisgICAgc3RhdGljIHN0YXR1c190IGdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLCBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpOworcHJpdmF0ZToKKyAgICBUZXh0RGVzY3JpcHRpb25zMigpOworCisgICAgZW51bSB7CisgICAgICAgIC8vIFRoZXNlIGtleXMgbXVzdCBiZSBpbiBzeW5jIHdpdGggdGhlIGtleXMgaW4gVGltZWRUZXh0LmphdmEKKyAgICAgICAgS0VZX0RJU1BMQVlfRkxBR1MgICAgICAgICAgICAgICAgID0gMSwgLy8gaW50CisgICAgICAgIEtFWV9TVFlMRV9GTEFHUyAgICAgICAgICAgICAgICAgICA9IDIsIC8vIGludAorICAgICAgICBLRVlfQkFDS0dST1VORF9DT0xPUl9SR0JBICAgICAgICAgPSAzLCAvLyBpbnQKKyAgICAgICAgS0VZX0hJR0hMSUdIVF9DT0xPUl9SR0JBICAgICAgICAgID0gNCwgLy8gaW50CisgICAgICAgIEtFWV9TQ1JPTExfREVMQVkgICAgICAgICAgICAgICAgICA9IDUsIC8vIGludAorICAgICAgICBLRVlfV1JBUF9URVhUICAgICAgICAgICAgICAgICAgICAgPSA2LCAvLyBpbnQKKyAgICAgICAgS0VZX1NUQVJUX1RJTUUgICAgICAgICAgICAgICAgICAgID0gNywgLy8gaW50CisgICAgICAgIEtFWV9TVFJVQ1RfQkxJTktJTkdfVEVYVF9MSVNUICAgICA9IDgsIC8vIExpc3Q8Q2hhclBvcz4KKyAgICAgICAgS0VZX1NUUlVDVF9GT05UX0xJU1QgICAgICAgICAgICAgID0gOSwgLy8gTGlzdDxGb250PgorICAgICAgICBLRVlfU1RSVUNUX0hJR0hMSUdIVF9MSVNUICAgICAgICAgPSAxMCwgLy8gTGlzdDxDaGFyUG9zPgorICAgICAgICBLRVlfU1RSVUNUX0hZUEVSX1RFWFRfTElTVCAgICAgICAgPSAxMSwgLy8gTGlzdDxIeXBlclRleHQ+CisgICAgICAgIEtFWV9TVFJVQ1RfS0FSQU9LRV9MSVNUICAgICAgICAgICA9IDEyLCAvLyBMaXN0PEthcmFva2U+CisgICAgICAgIEtFWV9TVFJVQ1RfU1RZTEVfTElTVCAgICAgICAgICAgICA9IDEzLCAvLyBMaXN0PFN0eWxlPgorICAgICAgICBLRVlfU1RSVUNUX1RFWFRfUE9TICAgICAgICAgICAgICAgPSAxNCwgLy8gVGV4dFBvcworICAgICAgICBLRVlfU1RSVUNUX0pVU1RJRklDQVRJT04gICAgICAgICAgPSAxNSwgLy8gSnVzdGlmaWNhdGlvbgorICAgICAgICBLRVlfU1RSVUNUX1RFWFQgICAgICAgICAgICAgICAgICAgPSAxNiwgLy8gVGV4dAorCisgICAgICAgIEtFWV9HTE9CQUxfU0VUVElORyAgICAgICAgICAgICAgICA9IDEwMSwKKyAgICAgICAgS0VZX0xPQ0FMX1NFVFRJTkcgICAgICAgICAgICAgICAgID0gMTAyLAorICAgICAgICBLRVlfU1RBUlRfQ0hBUiAgICAgICAgICAgICAgICAgICAgPSAxMDMsCisgICAgICAgIEtFWV9FTkRfQ0hBUiAgICAgICAgICAgICAgICAgICAgICA9IDEwNCwKKyAgICAgICAgS0VZX0ZPTlRfSUQgICAgICAgICAgICAgICAgICAgICAgID0gMTA1LAorICAgICAgICBLRVlfRk9OVF9TSVpFICAgICAgICAgICAgICAgICAgICAgPSAxMDYsCisgICAgICAgIEtFWV9URVhUX0NPTE9SX1JHQkEgICAgICAgICAgICAgICA9IDEwNywKKyAgICB9OworCisgICAgc3RhdGljIHN0YXR1c190IGV4dHJhY3RTUlRMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7CisgICAgc3RhdGljIHN0YXR1c190IGV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdDNHUFBMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXh0RGVzY3JpcHRpb25zMik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBURVhUX0RFU0NSSVBUSU9OUzJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAppbmRleCAyNjZiNjExLi42NGVjYzJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCkBAIC0zMSw0ICszMSw4IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCmluZGV4IGE1MTIwYjkuLjRkNTA0ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCkBAIC0zMDUsNiArMzA1LDcgQEAKIH0KIAogc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCisgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICBpbnQgY2hhbnMsCiAgICAgICAgIGRvdWJsZSByYXRlLAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApAQCAtMzIyLDcgKzMyMyw3IEBACiAgICAgICAgICAgICB1aWQsCiAgICAgICAgICAgICBsYWNpbmcsCiAgICAgICAgICAgICBsYW5nLAotICAgICAgICAgICAgIkFfVk9SQklTIiwKKyAgICAgICAgICAgIGNvZGVjLAogICAgICAgICAgICAga0F1ZGlvVHlwZSwKICAgICAgICAgICAgIHRyYWNrRW50cnlGaWVsZHMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKaW5kZXggZmZiYmExYi4uYTk0YzIzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApAQCAtNTAsNiArNTAsNyBAQAogICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gU2VnbWVudEluZm8odWludDY0X3Qgc2NhbGUgPSAxMDAwMDAwLCBkb3VibGUgZHVyID0gMCk7CiAKICAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICAgICAgaW50IGNoYW5zLAogICAgICAgICAgICAgZG91YmxlIHJhdGUsCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKaW5kZXggNGQ3M2ViOC4uYjBhMzAzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKQEAgLTExMiw0NiArMTE0LDEwMiBAQAogLy8gc3RhdGljCiBzcDxXZWJtRWxlbWVudD4gV2VibVdyaXRlcjo6YXVkaW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKSB7CiAgICAgaW50MzJfdCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGU7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMTsKLSAgICBjb25zdCBjaGFyIGhlYWRlckRhdGEyW10gPSB7IDMsICd2JywgJ28nLCAncicsICdiJywgJ2knLCAncycsIDcsIDAsIDAsIDAsCi0gICAgICAgICAgICAnYScsICduJywgJ2QnLCAncicsICdvJywgJ2knLCAnZCcsIDAsIDAsIDAsIDAsIDEgfTsKLSAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMzsKLSAgICBzaXplX3QgaGVhZGVyU2l6ZTEsIGhlYWRlclNpemUyID0gc2l6ZW9mKGhlYWRlckRhdGEyKSwgaGVhZGVyU2l6ZTM7CisgICAgY29uc3QgY2hhciogbWltZVR5cGU7CiAKICAgICBpZiAoIW1kLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykKLSAgICAgICAgICAgIHx8ICFtZC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkKLSAgICAgICAgICAgIHx8ICFtZC0+ZmluZERhdGEoa0tleVZvcmJpc0luZm8sICZ0eXBlLCAmaGVhZGVyRGF0YTEsICZoZWFkZXJTaXplMSkKLSAgICAgICAgICAgIHx8ICFtZC0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmhlYWRlckRhdGEzLCAmaGVhZGVyU2l6ZTMpKSB7CisgICAgICAgIHx8ICFtZC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkKKyAgICAgICAgfHwgIW1kLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lVHlwZSkpIHsKICAgICAgICAgQUxPR0UoIk1pc3NpbmcgZm9ybWF0IGtleXMgZm9yIGF1ZGlvIHRyYWNrIik7CiAgICAgICAgIG1kLT5kdW1wVG9Mb2coKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUgPSAxOwotICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUxKTsKLSAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMik7Ci0gICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplMSArIGhlYWRlclNpemUyICsgaGVhZGVyU2l6ZTM7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgc3RybGVuKE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpKSkgeworICAgICAgICAvLyBPcHVzIGluIFdlYk0gaXMgYSB3ZWxsLWtub3duLCB5ZXQgdW5kZXItZG9jdW1lbnRlZCwgZm9ybWF0LiBUaGUgY29kZWMgcHJpdmF0ZSBkYXRhCisgICAgICAgIC8vIG9mIHRoZSB0cmFjayBpcyBhbiBPcHVzIE9nZyBoZWFkZXIgKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3ODQ1I3NlY3Rpb24tNS4xKQorICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgdHJhY2sgaXNuJ3Qgc3RhbmRhcmRpemVkLCBpdHMgdmFsdWUgc2hvdWxkIGJlICJBX09QVVMiLgorICAgICAgICBPcHVzSGVhZGVyIGhlYWRlcjsKKyAgICAgICAgaGVhZGVyLmNoYW5uZWxzID0gbkNoYW5uZWxzOworICAgICAgICBoZWFkZXIubnVtX3N0cmVhbXMgPSBuQ2hhbm5lbHM7CisgICAgICAgIGhlYWRlci5udW1fY291cGxlZCA9IDA7CisgICAgICAgIC8vIC0gQ2hhbm5lbCBtYXBwaW5nIGZhbWlseSAoOCBiaXRzIHVuc2lnbmVkKQorICAgICAgICAvLyAgLS0gIDAgPSBvbmUgc3RyZWFtOiBtb25vIG9yIEwsUiBzdGVyZW8KKyAgICAgICAgLy8gIC0tICAxID0gY2hhbm5lbHMgaW4gdm9yYmlzIHNwZWMgb3JkZXI6IG1vbm8gb3IgTCxSIHN0ZXJlbyBvciAuLi4gb3IgRkwsQyxGUixSTCxSUixMRkUsIC4uLgorICAgICAgICAvLyAgLS0gIDIuLjI1NCA9IHJlc2VydmVkICh0cmVhdCBhcyAyNTUpCisgICAgICAgIC8vICAtLSAgMjU1ID0gbm8gZGVmaW5lZCBjaGFubmVsIG1lYW5pbmcKKyAgICAgICAgLy8KKyAgICAgICAgLy8gIG91ciBpbXBsZW1lbnRhdGlvbiBlbmNvZGVzOiAgMCwgMSwgb3IgMjU1CisgICAgICAgIGhlYWRlci5jaGFubmVsX21hcHBpbmcgPSAoKG5DaGFubmVscyA+IDgpID8gMjU1IDogKG5DaGFubmVscyA+IDIpKTsKKyAgICAgICAgaGVhZGVyLmdhaW5fZGIgPSAwOworICAgICAgICBoZWFkZXIuc2tpcF9zYW1wbGVzID0gMDsKIAotICAgIG9mZl90IG9mZiA9IDA7Ci0gICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7Ci0gICAgdWludDhfdCAqY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOwotICAgIGNvZGVjUHJpdmF0ZURhdGFbb2ZmKytdID0gMjsKKyAgICAgICAgLy8gaGVhZGVycyBhcmUgMjEtYnl0ZXMgKyBzb21ldGhpbmcgZHJpdmVuIGJ5IGNoYW5uZWwgY291bnQKKyAgICAgICAgLy8gZXhwZWN0IG51bWJlcnMgaW4gdGhlIGxvdyAzMCdzIGhlcmUuIFdyaXRlT3B1c0hlYWRlcigpIHdpbGwgdGVsbCB1cworICAgICAgICAvLyBpZiB0aGluZ3MgYXJlIGJhZC4KKyAgICAgICAgdW5zaWduZWQgY2hhciBoZWFkZXJfZGF0YVsxMDBdOworICAgICAgICBpbnQgaGVhZGVyU2l6ZSA9IFdyaXRlT3B1c0hlYWRlcihoZWFkZXIsIHNhbXBsZXJhdGUsICh1aW50OF90KiloZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlcl9kYXRhKSk7CiAKLSAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTEpOwotICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMik7CisgICAgICAgIGlmIChoZWFkZXJTaXplIDwgMCkgeworICAgICAgICAgICAgLy8gZGlkbid0IGZpbGwgb3V0IHRoYXQgaGVhZGVyIGZvciBzb21lIHJlYXNvbgorICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZW5lcmF0ZSBPUFVTIGhlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMSwgaGVhZGVyU2l6ZTEpOwotICAgIG9mZiArPSBoZWFkZXJTaXplMTsKLSAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTIsIGhlYWRlclNpemUyKTsKLSAgICBvZmYgKz0gaGVhZGVyU2l6ZTI7Ci0gICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEzLCBoZWFkZXJTaXplMyk7CisgICAgICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMDsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplOwogCi0gICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0gV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgKLSAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICBjb2RlY1ByaXZhdGVCdWYpOwotICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgb2ZmX3Qgb2ZmID0gMDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgIHVpbnQ4X3QqIGNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKKworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgKHVpbnQ4X3QqKWhlYWRlcl9kYXRhLCBoZWFkZXJTaXplKTsKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0KKyAgICAgICAgICAgICAgICBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KCJBX09QVVMiLCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGUsIGNvZGVjUHJpdmF0ZUJ1Zik7CisgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGExOworICAgICAgICBjb25zdCBjaGFyIGhlYWRlckRhdGEyW10gPSB7IDMsICd2JywgJ28nLCAncicsICdiJywgJ2knLCAncycsIDcsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgJ2EnLCAnbicsICdkJywgJ3InLCAnbycsICdpJywgJ2QnLCAwLCAwLCAwLCAwLCAxIH07CisgICAgICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGEzOworICAgICAgICBzaXplX3QgaGVhZGVyU2l6ZTEsIGhlYWRlclNpemUyID0gc2l6ZW9mKGhlYWRlckRhdGEyKSwgaGVhZGVyU2l6ZTM7CisKKyAgICAgICAgaWYgKCFtZC0+ZmluZERhdGEoa0tleVZvcmJpc0luZm8sICZ0eXBlLCAmaGVhZGVyRGF0YTEsICZoZWFkZXJTaXplMSkKKyAgICAgICAgICAgIHx8ICFtZC0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmhlYWRlckRhdGEzLCAmaGVhZGVyU2l6ZTMpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzc2luZyBoZWFkZXIgZm9ybWF0IGtleXMgZm9yIHZvcmJpcyB0cmFjayIpOworICAgICAgICAgICAgbWQtPmR1bXBUb0xvZygpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDE7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUxKTsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTIpOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IGhlYWRlclNpemUxICsgaGVhZGVyU2l6ZTIgKyBoZWFkZXJTaXplMzsKKworICAgICAgICBvZmZfdCBvZmYgPSAwOworICAgICAgICBzcDxBQnVmZmVyPiBjb2RlY1ByaXZhdGVCdWYgPSBuZXcgQUJ1ZmZlcihjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgdWludDhfdCAqY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOworICAgICAgICBjb2RlY1ByaXZhdGVEYXRhW29mZisrXSA9IDI7CisKKyAgICAgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUxKTsKKyAgICAgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUyKTsKKworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTEsIGhlYWRlclNpemUxKTsKKyAgICAgICAgb2ZmICs9IGhlYWRlclNpemUxOworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTIsIGhlYWRlclNpemUyKTsKKyAgICAgICAgb2ZmICs9IGhlYWRlclNpemUyOworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTMsIGhlYWRlclNpemUzKTsKKworICAgICAgICBzcDxXZWJtRWxlbWVudD4gZW50cnkgPQorICAgICAgICAgICAgICAgIFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoIkFfVk9SQklTIiwgbkNoYW5uZWxzLCBzYW1wbGVyYXRlLCBjb2RlY1ByaXZhdGVCdWYpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgaXMgbm90IGEgc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIsIG1pbWVUeXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzaXplX3QgV2VibVdyaXRlcjo6bnVtVHJhY2tzKCkgewpAQCAtMzgyLDE2ICs0NDAsMTggQEAKICAgICBjb25zdCBjaGFyICp2cDggPSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDg7CiAgICAgY29uc3QgY2hhciAqdnA5ID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5OwogICAgIGNvbnN0IGNoYXIgKnZvcmJpcyA9IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUzsKKyAgICBjb25zdCBjaGFyKiBvcHVzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUzsKIAogICAgIHNpemVfdCBzdHJlYW1JbmRleDsKICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZwOCwgc3RybGVuKHZwOCkpIHx8CiAgICAgICAgICFzdHJuY2FzZWNtcChtaW1lLCB2cDksIHN0cmxlbih2cDkpKSkgewogICAgICAgICBzdHJlYW1JbmRleCA9IGtWaWRlb0luZGV4OwotICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZvcmJpcywgc3RybGVuKHZvcmJpcykpKSB7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgdm9yYmlzLCBzdHJsZW4odm9yYmlzKSkgfHwKKyAgICAgICAgICAgICAgICFzdHJuY2FzZWNtcChtaW1lLCBvcHVzLCBzdHJsZW4ob3B1cykpKSB7CiAgICAgICAgIHN0cmVhbUluZGV4ID0ga0F1ZGlvSW5kZXg7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcywgJXMgb3IgJXMgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgIG1pbWUsIHZwOCwgdnA5LCB2b3JiaXMpOworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzLCAlcywgJXMsIG9yICVzIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICBtaW1lLCB2cDgsIHZwOSwgdm9yYmlzLCBvcHVzKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icAppbmRleCBlZDI2ZTU4Li4yMDJlOTY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icApAQCAtMSwxMCArMSwxNSBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAotICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIk1lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAppbmRleCAyZGVjOWZhLi43MDQ2ZjYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKQEAgLTI2LDggKzI2LDkgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGV4cGF0Lmg+CiAKLSNpbmNsdWRlIDxjY3R5cGU+CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzI2LDggKzMyNyw4IEBACiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgogICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkUXVpcmsoYXR0cnMpOworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpIHx8IHN0ckVxKG5hbWUsICJBdHRyaWJ1dGUiKSkgeworICAgICAgICAgICAgICAgICh2b2lkKWFkZFF1aXJrKGF0dHJzLCBuYW1lKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIlR5cGUiKSkgewogICAgICAgICAgICAgICAgICh2b2lkKWFkZFR5cGVGcm9tQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9FTkNPREVSKSk7CkBAIC0zNDgsNiArMzQ5LDggQEAKICAgICAgICAgICAgIGlmIChvdXRzaWRlICYmCiAgICAgICAgICAgICAgICAgICAgIChzdHJFcShuYW1lLCAiTGltaXQiKSB8fCBzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyAlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiBhIFR5cGUiLCBuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkFsaWFzIikpIHsKKyAgICAgICAgICAgICAgICAodm9pZClhZGRBbGlhcyhhdHRycyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJMaW1pdCIpKSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpYWRkTGltaXQoYXR0cnMpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSB7CkBAIC00OTksNiArNTAyLDcgQEAKICAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKICAgICBjb25zdCBjaGFyICp0eXBlID0gbnVsbHB0cjsKICAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKnJhbmsgPSBudWxscHRyOwogCiAgICAgc2l6ZV90IGkgPSAwOwogICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CkBAIC01MjAsNiArNTI0LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuayIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogcmFuayBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJhbmsgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTU3NiwxMCArNTg2LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocmFuayAhPSBudWxscHRyKSB7CisgICAgICAgIGlmICghbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnJhbmsuZW1wdHkoKSAmJiBtQ3VycmVudENvZGVjLT5zZWNvbmQucmFuayAhPSByYW5rKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjb2RlIFwiJXNcIiByYW5rIGNoYW5nZWQgZnJvbSBcIiVzXCIgdG8gXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnJhbmsuY19zdHIoKSwgcmFuayk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5yYW5rID0gcmFuazsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpIHsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMsIGNvbnN0IGNoYXIgKnRhZykgewogICAgIGlmIChtQ3VycmVudENvZGVjID09IG1Db2RlY01hcC5lbmQoKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTYwNiw3ICs2MjUsMTIgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucXVpcmtTZXQuZW1wbGFjZShuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyB0YWdTdHJpbmcgPSB0YWc7CisgICAgc3RkOjp0cmFuc2Zvcm0odGFnU3RyaW5nLmJlZ2luKCksIHRhZ1N0cmluZy5lbmQoKSwgdGFnU3RyaW5nLmJlZ2luKCksIDo6dG9sb3dlcik7CisgICAgdGFnU3RyaW5nLmFwcGVuZCgiOjoiKTsKKyAgICB0YWdTdHJpbmcuYXBwZW5kKG5hbWUpOworICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5xdWlya1NldC5lbXBsYWNlKHRhZ1N0cmluZy5jX3N0cigpKTsKKyAgICBBTE9HSSgiYWRkaW5nICVzIHRvICVzIiwgdGFnU3RyaW5nLmNfc3RyKCksIG1DdXJyZW50Q29kZWMtPmZpcnN0LmNfc3RyKCkpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNzYwLDYgKzc4NCw3IEBACiAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJxdWFsaXR5IikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgInNpemUiKSB8fAogICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiKSB8fAorICAgICAgICAgICAgc3RySGFzUHJlZml4KGFfbmFtZSwgInBlcmZvcm1hbmNlLXBvaW50LSIpIHx8CiAgICAgICAgICAgICBzdHJIYXNQcmVmaXgoYV9uYW1lLCAibWVhc3VyZWQtZnJhbWUtcmF0ZS0iKSkgewogICAgICAgICAvLyAicmFuZ2UiIGlzIHNwZWNpZmllZCBpbiBleGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgogICAgICAgICAvLyAxKSBtaW4tbWF4CkBAIC05NjQsNiArOTg5LDM0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkQWxpYXMoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworCisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZEFsaWFzOiBuYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImFkZEFsaWFzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIC8vIEV2ZXJ5IGZlYXR1cmUgbXVzdCBoYXZlIGEgbmFtZS4KKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJhbGlhcyB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQuYWxpYXNlcy5lbXBsYWNlX2JhY2sobmFtZSk7CisgICAgcmV0dXJuIE9LOworfQorCiBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwJgogICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpIGNvbnN0IHsKICAgICByZXR1cm4gbVNlcnZpY2VBdHRyaWJ1dGVNYXA7CkBAIC05OTgsNiArMTA1MSw3IEBACiAgICAgICAgIGNvbnN0IGF1dG8mIGNvZGVjTmFtZSA9IGNvZGVjLmZpcnN0OwogICAgICAgICBib29sIGlzRW5jb2RlciA9IGNvZGVjLnNlY29uZC5pc0VuY29kZXI7CiAgICAgICAgIHNpemVfdCBvcmRlciA9IGNvZGVjLnNlY29uZC5vcmRlcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmFuayA9IGNvZGVjLnNlY29uZC5yYW5rOwogICAgICAgICBjb25zdCBhdXRvJiB0eXBlTWFwID0gY29kZWMuc2Vjb25kLnR5cGVNYXA7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IHR5cGVNYXApIHsKICAgICAgICAgICAgIGNvbnN0IGF1dG8mIHR5cGVOYW1lID0gdHlwZS5maXJzdDsKQEAgLTEwNDEsMTEgKzEwOTUsMjEgQEAKIAogICAgICAgICAgICAgTm9kZUluZm8gbm9kZUluZm87CiAgICAgICAgICAgICBub2RlSW5mby5uYW1lID0gY29kZWNOYW1lOworICAgICAgICAgICAgLy8gTk9URTogbm8gYWxpYXNlcyBhcmUgZXhwb3NlZCBpbiByb2xlIGluZm8KKyAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBxdWlya3MgYXJlIGV4cG9zZWQgYXMgbm9kZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnJlc2VydmUodHlwZUF0dHJpYnV0ZU1hcC5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGUgOiB0eXBlQXR0cmlidXRlTWFwKSB7CiAgICAgICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGV7YXR0cmlidXRlLmZpcnN0LCBhdHRyaWJ1dGUuc2Vjb25kfSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZxdWlyayA6IGNvZGVjLnNlY29uZC5xdWlya1NldCkgeworICAgICAgICAgICAgICAgIGlmIChzdHJIYXNQcmVmaXgocXVpcmsuY19zdHIoKSwgImF0dHJpYnV0ZTo6IikpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soQXR0cmlidXRle3F1aXJrLCAicHJlc2VudCJ9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJhbmsuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKEF0dHJpYnV0ZXsicmFuayIsIHJhbmt9KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGVMaXN0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvcmRlciksIHN0ZDo6bW92ZShub2RlSW5mbykpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAppbmRleCBjYzY5ZTUyLi43YTk4NmI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaApAQCAtNjUsNiArNjUsOCBAQAogICAgICAgICBzaXplX3Qgb3JkZXI7ICAgICAgLy8vPCBPcmRlciBvZiBhcHBlYXJhbmNlIGluIHRoZSBmaWxlIChzdGFydGluZyBmcm9tIDApCiAgICAgICAgIFF1aXJrU2V0IHF1aXJrU2V0OyAvLy88IFNldCBvZiBxdWlya3MgcmVxdWVzdGVkIGJ5IHRoaXMgY29kZWMKICAgICAgICAgVHlwZU1hcCB0eXBlTWFwOyAgIC8vLzwgTWFwIG9mIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvZGVjCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGlhc2VzOyAvLy88IE5hbWUgYWxpYXNlcyBmb3IgdGhpcyBjb2RlYworICAgICAgICBzdGQ6OnN0cmluZyByYW5rOyAgLy8vPCBSYW5rIG9mIHRoaXMgY29kZWMuIFRoaXMgaXMgYSBudW1lcmljIHN0cmluZy4KICAgICB9OwogCiAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIENvZGVjUHJvcGVydGllcz4gQ29kZWM7CkBAIC03Niw2ICs3OCw3IEBACiAgICAgc3RydWN0IE5vZGVJbmZvIHsKICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVMaXN0OworICAgICAgICAvLyBub3RlOiBhbGlhc2VzIGFyZSBub3QgZXhwb3NlZCBoZXJlIGFzIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSByb2xlIG1hcAogICAgIH07CiAKICAgICAvKioKQEAgLTE3MSw4ICsxNzQsOSBAQAogICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlID0gbnVsbHB0cik7CiAKLSAgICBzdGF0dXNfdCBhZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHN0YXR1c190IGFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycywgY29uc3QgY2hhciAqdGFnKTsKICAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpOworICAgIHN0YXR1c190IGFkZEFsaWFzKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgc3RhdHVzX3QgYWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICBzdGF0dXNfdCBhZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgdm9pZCBhZGRUeXBlKGNvbnN0IGNoYXIgKm5hbWUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icCBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggMTZjN2JlOS4uNmExY2M3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCkBAIC0yNSw3ICsyNSw2IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJpY3VhbmRyb2lkX3V0aWxzIiwKICAgICAgICAgImxpYnJlZ2lzdGVybXNleHQiLAogICAgIF0sCiAKQEAgLTM0LDYgKzMzLDcgQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIiLAogICAgIF0sCiAKKyAgICAvLyBiYWNrIHRvIDMyLWJpdCwgYi8xMjY1MDI2MTMKICAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogCiAgICAgaW5pdF9yYzogWyJtZWRpYXNlcnZlci5yYyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAppbmRleCBlY2RkYzQ4Li43YjIyYjA1IDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJtZWRpYXNlcnZlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFpY3UvQUljdS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC0yNSw3ICsyNiw2IEBACiAjaW5jbHVkZSAiUmVnaXN0ZXJFeHRlbnNpb25zLmgiCiAKIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwotI2luY2x1ZGUgIkljdVV0aWxzLmgiCiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgogCkBAIC0zOCw3ICszOCw3IEBACiAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwotICAgIEluaXRpYWxpemVJY3VPckRpZSgpOworICAgIEFJY3VfaW5pdGlhbGl6ZUljdU9yRGllKCk7CiAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgcmVnaXN0ZXJFeHRlbnNpb25zKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcCBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCmluZGV4IGYyNWZjNzEuLmJkNmE2YzYgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCisrKyBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCkBAIC00Nyw2ICs0Nyw5IEBACiBjb25zdGV4cHIgdW5zaWduZWQgTUFYX0ZJTEVfQ0hVTktfU0laRSA9IEFJT19CVUZTX01BWCAqIEFJT19CVUZfTEVOOwogCiBjb25zdGV4cHIgdWludDMyX3QgTUFYX01UUF9GSUxFX1NJWkUgPSAweEZGRkZGRkZGOworLy8gTm90ZTogUE9MTF9USU1FT1VUX01TID0gMCBtZWFucyByZXR1cm4gaW1tZWRpYXRlbHkgaS5lLiBubyBzbGVlcC4KKy8vIEFuZCB0aGlzIHdpbGwgY2F1c2UgaGlnaCBDUFUgdXNhZ2UuCitjb25zdGV4cHIgaW50MzJfdCBQT0xMX1RJTUVPVVRfTVMgPSA1MDA7CiAKIHN0cnVjdCB0aW1lc3BlYyBaRVJPX1RJTUVPVVQgPSB7IDAsIDAgfTsKIApAQCAtMjEyLDcgKzIxNSw2IEBACiAgICAgdWludDE2X3QgdmFsdWUgPSBzZXR1cC0+d1ZhbHVlOwogICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZjsKICAgICBidWYucmVzaXplKGxlbmd0aCk7Ci0gICAgaW50IHJldCA9IDA7CiAKICAgICBpZiAoISh0eXBlICYgVVNCX0RJUl9JTikpIHsKICAgICAgICAgaWYgKDo6cmVhZChtQ29udHJvbCwgYnVmLmRhdGEoKSwgbGVuZ3RoKSAhPSBsZW5ndGgpIHsKQEAgLTIyNSw4ICsyMjcsOCBAQAogICAgICAgICBjYXNlIE1UUF9SRVFfUkVTRVQ6CiAgICAgICAgIGNhc2UgTVRQX1JFUV9DQU5DRUw6CiAgICAgICAgICAgICBlcnJubyA9IEVDQU5DRUxFRDsKLSAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIC8vICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9SRVFfR0VUX0RFVklDRV9TVEFUVVM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IG10cF9kZXZpY2Vfc3RhdHVzKSArIDQpIHsKQEAgLTMwNiw3ICszMDgsNyBAQAogICAgIGludCBlcnJvciA9IDA7CiAKICAgICB3aGlsZSAobnVtX2V2ZW50cyA8IG1pbl9ldmVudHMpIHsKLSAgICAgICAgaWYgKHBvbGwobVBvbGxGZHMsIDIsIDApID09IC0xKSB7CisgICAgICAgIGlmIChwb2xsKG1Qb2xsRmRzLCAyLCBQT0xMX1RJTUVPVVRfTVMpID09IC0xKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGVycm9yIGR1cmluZyBwb2xsKCkiOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCmluZGV4IGNjZGRkNmUuLmNhOGNiNzggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC05OSw2ICs5OSw3IEBACiAgICAgTVRQX0VWRU5UX1NUT1JFX0FEREVELAogICAgIE1UUF9FVkVOVF9TVE9SRV9SRU1PVkVELAogICAgIE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VELAorICAgIE1UUF9FVkVOVF9PQkpFQ1RfSU5GT19DSEFOR0VELAogfTsKIAogTXRwU2VydmVyOjpNdHBTZXJ2ZXIoSU10cERhdGFiYXNlKiBkYXRhYmFzZSwgaW50IGNvbnRyb2xGZCwgYm9vbCBwdHAsCkBAIC0yNTksNiArMjYwLDExIEBACiAgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCwgaGFuZGxlKTsKIH0KIAordm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RJbmZvQ2hhbmdlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgQUxPR1YoInNlbmRPYmplY3RJbmZvQ2hhbmdlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX09CSkVDVF9JTkZPX0NIQU5HRUQsIGhhbmRsZSk7Cit9CisKIHZvaWQgTXRwU2VydmVyOjpzZW5kU3RvcmVBZGRlZChNdHBTdG9yYWdlSUQgaWQpIHsKICAgICBBTE9HVigic2VuZFN0b3JlQWRkZWQgJTA4WFxuIiwgaWQpOwogICAgIHNlbmRFdmVudChNVFBfRVZFTlRfU1RPUkVfQURERUQsIGlkKTsKQEAgLTQ0Miw2ICs0NDgsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgaWYgKHJlc3BvbnNlICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgIEFMT0dXKCJbTVRQXSBnb3QgcmVzcG9uc2UgMHglWCBpbiBjb21tYW5kICVzICgleCkiLCByZXNwb25zZSwKKyAgICAgICAgICAgIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pLCBvcGVyYXRpb24pOwogICAgIGlmIChyZXNwb25zZSA9PSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgbVJlc3BvbnNlLnNldFJlc3BvbnNlQ29kZShyZXNwb25zZSk7CkBAIC02NTIsOCArNjYxLDggQEAKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUjsKICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOwogICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOwotICAgIEFMT0dWKCJHZXRPYmplY3RQcm9wVmFsdWUgJWQgJXNcbiIsIGhhbmRsZSwKLSAgICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKyAgICBBTE9HVigiR2V0T2JqZWN0UHJvcFZhbHVlICVkICVzICgweCUwNFgpXG4iLCBoYW5kbGUsCisgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSksIHByb3BlcnR5KTsKIAogICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdFByb3BlcnR5VmFsdWUoaGFuZGxlLCBwcm9wZXJ0eSwgbURhdGEpOwogfQpAQCAtOTQ2LDcgKzk1NSw4IEBACiAgICAgaWYgKCFtRGF0YS5nZXRTdHJpbmcobW9kaWZpZWQpKSByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOyAgICAgLy8gZGF0ZSBtb2RpZmllZAogICAgIC8vIGtleXdvcmRzIGZvbGxvdwogCi0gICAgQUxPR1YoIm5hbWU6ICVzIGZvcm1hdDogJTA0WFxuIiwgKGNvbnN0IGNoYXIgKiluYW1lLCBmb3JtYXQpOworICAgIEFMT0dWKCJuYW1lOiAlcyBmb3JtYXQ6IDB4JTA0WCAoJXMpXG4iLCAoY29uc3QgY2hhciopbmFtZSwgZm9ybWF0LAorICAgICAgICAgIE10cERlYnVnOjpnZXRGb3JtYXRDb2RlTmFtZShmb3JtYXQpKTsKICAgICB0aW1lX3QgbW9kaWZpZWRUaW1lOwogICAgIGlmICghcGFyc2VEYXRlVGltZShtb2RpZmllZCwgbW9kaWZpZWRUaW1lKSkKICAgICAgICAgbW9kaWZpZWRUaW1lID0gMDsKQEAgLTk2Nyw5ICs5NzcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0JKRUNUX1RPT19MQVJHRTsKICAgICB9CiAKLSAgICBBTE9HRCgicGF0aDogJXMgcGFyZW50OiAlZCBzdG9yYWdlSUQ6ICUwOFgiLCAoY29uc3QgY2hhciopcGF0aCwgcGFyZW50LCBzdG9yYWdlSUQpOworICAgIEFMT0dWKCJwYXRoOiAlcyBwYXJlbnQ6ICVkIHN0b3JhZ2VJRDogJTA4WCIsIChjb25zdCBjaGFyKilwYXRoLCBwYXJlbnQsIHN0b3JhZ2VJRCk7CiAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+YmVnaW5TZW5kT2JqZWN0KChjb25zdCBjaGFyKilwYXRoLCBmb3JtYXQsCiAgICAgICAgICAgICBwYXJlbnQsIHN0b3JhZ2VJRCk7CisgICAgQUxPR0QoImhhbmRsZTogJWQsIHBhcmVudDogJWQsIHN0b3JhZ2VJRDogJTA4WCIsIGhhbmRsZSwgcGFyZW50LCBzdG9yYWdlSUQpOwogICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaAppbmRleCBmNjkzOWQ3Li4xZjg3OTlmIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmgKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCkBAIC0xMTUsNiArMTE1LDcgQEAKIAogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0SW5mb0NoYW5nZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kRGV2aWNlUHJvcGVydHlDaGFuZ2VkKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLmJwIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKaW5kZXggNWVjZTY3ZC4uZjRjYzcwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKQEAgLTMxLDYgKzMxLDEzIEBACiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CiAKKy8vIGZvciB1c2Ugd2l0aCBoZWFkZXJfbGlicworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0KK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYW5kayIsCiAKQEAgLTU1LDcgKzYyLDYgQEAKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLURFWFBPUlQ9X19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImRlZmF1bHRcIikpKSIsCi0KICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCkBAIC02NSwyMSArNzEsMjYgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJtZWRpYV9qbmlfdXRpbHMiLAogICAgICAgICAibGlibWVkaWFkcm0iLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJtZWRpYTJfam5pX2NvcmUiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgIF0sCiAKICAgICByZXF1aXJlZDogWwpAQCAtOTAsNiArMTAxLDEwIEBACiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmd1aSIsCisgICAgXSwKKwogICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CiAgICAgICAgIHBkazogewogICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCkBAIC0xMDksNSArMTI0LDYzIEBACiBsbG5ka19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFuZGsiLAogICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFuZGsubWFwLnR4dCIsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhbmRrX3V0aWxzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kay9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCIsCisgICAgc3JjczogWyJ0ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrLyIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCmluZGV4IDlkMDBkZjYuLjIyZTE1ZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcApAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSAiTmRrSW1hZ2VQcml2LmgiCiAjaW5jbHVkZSAiTmRrSW1hZ2VSZWFkZXJQcml2LmgiCisjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMjgsNiArMjksNyBAQAogI2luY2x1ZGUgPHVpL1B1YmxpY0Zvcm1hdC5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZC9BSGFyZHdhcmVCdWZmZXJIZWxwZXJzLmg+CiAjaW5jbHVkZSA8Z3JhbGxvY3VzYWdlL0dyYWxsb2NVc2FnZUNvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC00Myw2ICs0NSwxMCBAQAogY29uc3QgY2hhciogQUltYWdlUmVhZGVyOjprQ29udGV4dEtleSAgICA9ICJDb250ZXh0IjsKIGNvbnN0IGNoYXIqIEFJbWFnZVJlYWRlcjo6a0dyYXBoaWNCdWZmZXJLZXkgPSAiR3JhcGhpY0J1ZmZlciI7CiAKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtXaW5kb3dIYWxUb2tlblNpemVNYXggPSAyNTY7CisKK3N0YXRpYyBuYXRpdmVfaGFuZGxlX3QgKmNvbnZlcnRIYWxUb2tlblRvTmF0aXZlSGFuZGxlKGNvbnN0IEhhbFRva2VuICZoYWxUb2tlbik7CisKIGJvb2wKIEFJbWFnZVJlYWRlcjo6aXNTdXBwb3J0ZWRGb3JtYXRBbmRVc2FnZShpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UpIHsKICAgICAvLyBDaGVjayB3aGV0aGVyIHVzYWdlIGhhcyBlaXRoZXIgQ1BVX1JFQURfT0ZURU4gb3IgQ1BVX1JFQUQgc2V0LiBOb3RlIHRoYXQgY2hlY2sgYWdhaW5zdApAQCAtNTgsMTEgKzY0LDE1IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4ODoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0pQRUc6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxNjoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBV19ERVBUSDoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBV19QUklWQVRFOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTA6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIMTY6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRDoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1k4OgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfSEVJQzoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIX0pQRUc6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1BSSVZBVEU6CiAgICAgICAgICAgICAvLyBGb3IgcHJpdmF0ZSBmb3JtYXQsIGNwdSB1c2FnZSBpcyBwcm9oaWJpdGVkLgpAQCAtODQsMTEgKzk0LDE1IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SR0JBX0ZQMTY6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9KUEVHOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTY6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVdfUFJJVkFURToKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEwOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTI6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ZODoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0hFSUM6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9KUEVHOgogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9QUklWQVRFOgogICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC0zMDEsNiArMzE1LDkgQEAKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQnVmZmVySXRlbUNvbnN1bWVyIGJ1ZmZlciBkYXRhU3BhY2UiKTsKICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KKyAgICBpZiAobVVzYWdlICYgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX1BST1RFQ1RFRF9DT05URU5UKSB7CisgICAgICAgIGdiQ29uc3VtZXItPnNldENvbnN1bWVySXNQcm90ZWN0ZWQodHJ1ZSk7CisgICAgfQogCiAgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShtUHJvZHVjZXIsIC8qY29udHJvbGxlZEJ5QXBwKi90cnVlKTsKICAgICBpZiAobVN1cmZhY2UgPT0gbnVsbHB0cikgewpAQCAtMzUwLDggKzM2NywxMCBAQAogICAgICAgICAgICAgICBpdCAhPSBtQWNxdWlyZWRJbWFnZXMuZW5kKCk7IGl0KyspIHsKICAgICAgICAgQUltYWdlKiBpbWFnZSA9ICppdDsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGltYWdlLT5tTG9jayk7Ci0gICAgICAgIHJlbGVhc2VJbWFnZUxvY2tlZChpbWFnZSwgLypyZWxlYXNlRmVuY2VGZCovLTEpOworICAgICAgICAvLyBEbyBub3QgYWx0ZXIgbUFjcXVpcmVkSW1hZ2VzIHdoaWxlIHdlIGFyZSBpdGVyYXRpbmcgb24gaXQKKyAgICAgICAgcmVsZWFzZUltYWdlTG9ja2VkKGltYWdlLCAvKnJlbGVhc2VGZW5jZUZkKi8tMSwgLypjbGVhckNhY2hlKi9mYWxzZSk7CiAgICAgfQorICAgIG1BY3F1aXJlZEltYWdlcy5jbGVhcigpOwogCiAgICAgLy8gRGVsZXRlIEJ1ZmZlciBJdGVtcwogICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7CkBAIC0zNjMsNiArMzgyLDE1IEBACiAgICAgICAgIG1CdWZmZXJJdGVtQ29uc3VtZXItPmFiYW5kb24oKTsKICAgICAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihudWxscHRyKTsKICAgICB9CisKKyAgICBpZiAobVdpbmRvd0hhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGludCBzaXplID0gbVdpbmRvd0hhbmRsZS0+ZGF0YVswXTsKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gaGFsVG9rZW47CisgICAgICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJm1XaW5kb3dIYW5kbGUtPmRhdGFbMV0pLCBzaXplKTsKKyAgICAgICAgZGVsZXRlSGFsVG9rZW4oaGFsVG9rZW4pOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtV2luZG93SGFuZGxlKTsKKyAgICB9CiB9CiAKIG1lZGlhX3N0YXR1c190CkBAIC00ODEsNyArNTA5LDcgQEAKIH0KIAogdm9pZAotQUltYWdlUmVhZGVyOjpyZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkKSB7CitBSW1hZ2VSZWFkZXI6OnJlbGVhc2VJbWFnZUxvY2tlZChBSW1hZ2UqIGltYWdlLCBpbnQgcmVsZWFzZUZlbmNlRmQsIGJvb2wgY2xlYXJDYWNoZSkgewogICAgIEJ1ZmZlckl0ZW0qIGJ1ZmZlciA9IGltYWdlLT5tQnVmZmVyOwogICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewogICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgaXMgbm90IGZhdGFsCkBAIC01MDUsNiArNTMzLDEwIEBACiAgICAgaW1hZ2UtPm1Mb2NrZWRCdWZmZXIgPSBudWxscHRyOwogICAgIGltYWdlLT5tSXNDbG9zZWQgPSB0cnVlOwogCisgICAgaWYgKCFjbGVhckNhY2hlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBib29sIGZvdW5kID0gZmFsc2U7CiAgICAgLy8gY2xlYW51cCBhY3F1aXJlZCBpbWFnZSBsaXN0CiAgICAgZm9yIChhdXRvIGl0ID0gbUFjcXVpcmVkSW1hZ2VzLmJlZ2luKCk7CkBAIC01MjIsNiArNTU0LDI1IEBACiAgICAgfQogfQogCittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXI6OmdldFdpbmRvd05hdGl2ZUhhbmRsZShuYXRpdmVfaGFuZGxlICoqaGFuZGxlKSB7CisgICAgaWYgKG1XaW5kb3dIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAqaGFuZGxlID0gbVdpbmRvd0hhbmRsZTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9CisgICAgICAgIG5ldyBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPihtUHJvZHVjZXIpOworICAgIEhhbFRva2VuIGhhbFRva2VuOworICAgIGlmICghY3JlYXRlSGFsVG9rZW4oaGdicCwgJmhhbFRva2VuKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgIG1XaW5kb3dIYW5kbGUgPSBjb252ZXJ0SGFsVG9rZW5Ub05hdGl2ZUhhbmRsZShoYWxUb2tlbik7CisgICAgaWYgKCFtV2luZG93SGFuZGxlKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgKmhhbmRsZSA9IG1XaW5kb3dIYW5kbGU7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKwogaW50CiBBSW1hZ2VSZWFkZXI6OmdldEJ1ZmZlcldpZHRoKEJ1ZmZlckl0ZW0qIGJ1ZmZlcikgewogICAgIGlmIChidWZmZXIgPT0gTlVMTCkgcmV0dXJuIC0xOwpAQCAtNTg1LDYgKzYzNiwzMyBAQAogICAgIH0KIH0KIAorc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCAqY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoCisgICAgICAgIGNvbnN0IEhhbFRva2VuICZoYWxUb2tlbikgeworICAgIC8vIFdlIGF0dGVtcHQgdG8gc3RvcmUgaGFsVG9rZW4gaW4gdGhlIGludHMgb2YgdGhlIG5hdGl2ZV9oYW5kbGVfdCBhZnRlciBpdHMKKyAgICAvLyBzaXplLiBUaGUgZmlyc3QgaW50IHN0b3JlcyB0aGUgc2l6ZSBvZiB0aGUgdG9rZW4uIFdlIHN0b3JlIHRoaXMgaW4gYW4gaW50CisgICAgLy8gdG8gYXZvaWQgYWxpZ25tZW50IGlzc3VlcyB3aGVyZSBzaXplX3QgYW5kIGludCBkbyBub3QgaGF2ZSB0aGUgc2FtZQorICAgIC8vIGFsaWdubWVudC4KKyAgICBzaXplX3QgbmhEYXRhQnl0ZVNpemUgPSBoYWxUb2tlbi5zaXplKCk7CisgICAgaWYgKG5oRGF0YUJ5dGVTaXplID4ga1dpbmRvd0hhbFRva2VuU2l6ZU1heCkgeworICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgdG9rZW4gaXNuJ3QgcmVhc29uYWJsZS4uCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzaXplX3QgbnVtSW50cyA9IGNlaWwobmhEYXRhQnl0ZVNpemUgLyBzaXplb2YoaW50KSkgKyAxOworCisgICAgLy8gV2UgZG9uJ3QgY2hlY2sgZm9yIG92ZXJmbG93LCB3aGV0aGVyIG51bUludHMgY2FuIGZpdCBpbiBhbiBpbnQsIHNpbmNlIHdlCisgICAgLy8gZXhwZWN0IGtXaW5kb3dIYWxUb2tlblNpemVNYXggdG8gYmUgYSByZWFzb25hYmxlIGxpbWl0LgorICAgIC8vIGNyZWF0ZSBhIG5hdGl2ZV9oYW5kbGVfdCB3aXRoIDAgbnVtRmRzIGFuZCBudW1JbnRzIG51bWJlciBvZiBpbnRzLgorICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPQorICAgICAgICBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgwLCBudW1JbnRzKTsKKyAgICBpZiAoIW5oKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBTdG9yZSB0aGUgc2l6ZSBvZiB0aGUgdG9rZW4gaW4gdGhlIGZpcnN0IGludC4KKyAgICBuaC0+ZGF0YVswXSA9IG5oRGF0YUJ5dGVTaXplOworICAgIG1lbWNweSgmKG5oLT5kYXRhWzFdKSwgaGFsVG9rZW4uZGF0YSgpLCBuaERhdGFCeXRlU2l6ZSk7CisgICAgcmV0dXJuIG5oOworfQorCiBFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9uZXcoCiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCBtYXhJbWFnZXMsCkBAIC01OTQsNiArNjcyLDE5IEBACiAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTiwgbWF4SW1hZ2VzLCByZWFkZXIpOwogfQogCitleHRlcm4gIkMiIHsKKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKAorICAgICAgICBBSW1hZ2VSZWFkZXIgKnJlYWRlciwgLypvdXQqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChyZWFkZXIgPT0gbnVsbHB0ciB8fCBoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gcmVhZGVyLT5nZXRXaW5kb3dOYXRpdmVIYW5kbGUoaGFuZGxlKTsKK30KKworfSAvL2V4dGVybiAiQyIKKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCmluZGV4IGJlZDhhMjEuLmUzMjhjYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKQEAgLTY5LDYgKzY5LDggQEAKICAgICBtZWRpYV9zdGF0dXNfdCBhY3F1aXJlTmV4dEltYWdlKC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogZmVuY2VGZCk7CiAgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZUxhdGVzdEltYWdlKC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogZmVuY2VGZCk7CiAKKyAgICBtZWRpYV9zdGF0dXNfdCBnZXRXaW5kb3dOYXRpdmVIYW5kbGUoLypvdXQqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKICAgICBBTmF0aXZlV2luZG93KiBnZXRXaW5kb3coKSAgICBjb25zdCB7IHJldHVybiBtV2luZG93LmdldCgpOyB9OwogICAgIGludDMyX3QgICAgICAgIGdldFdpZHRoKCkgICAgIGNvbnN0IHsgcmV0dXJuIG1XaWR0aDsgfTsKICAgICBpbnQzMl90ICAgICAgICBnZXRIZWlnaHQoKSAgICBjb25zdCB7IHJldHVybiBtSGVpZ2h0OyB9OwpAQCAtODYsNyArODgsNyBAQAogICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVJbWFnZUxvY2tlZCgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogCiAgICAgLy8gQ2FsbGVkIGJ5IEFJbWFnZS9+QUltYWdlUmVhZGVyIHRvIGNsb3NlIGltYWdlLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gZ3JhYiBBSW1hZ2U6Om1Mb2NrCi0gICAgdm9pZCByZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkKTsKKyAgICB2b2lkIHJlbGVhc2VJbWFnZUxvY2tlZChBSW1hZ2UqIGltYWdlLCBpbnQgcmVsZWFzZUZlbmNlRmQsIGJvb2wgY2xlYXJDYWNoZSA9IHRydWUpOwogCiAgICAgc3RhdGljIGludCBnZXRCdWZmZXJXaWR0aChCdWZmZXJJdGVtKiBidWZmZXIpOwogICAgIHN0YXRpYyBpbnQgZ2V0QnVmZmVySGVpZ2h0KEJ1ZmZlckl0ZW0qIGJ1ZmZlcik7CkBAIC0xNjAsNiArMTYyLDcgQEAKICAgICBzcDxTdXJmYWNlPiAgICAgICAgICAgICAgICBtU3VyZmFjZTsKICAgICBzcDxCdWZmZXJJdGVtQ29uc3VtZXI+ICAgICBtQnVmZmVySXRlbUNvbnN1bWVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgIG1XaW5kb3c7CisgICAgbmF0aXZlX2hhbmRsZV90KiAgICAgICAgICAgbVdpbmRvd0hhbmRsZSA9IG51bGxwdHI7CiAKICAgICBMaXN0PEFJbWFnZSo+ICAgICAgICAgICAgICBtQWNxdWlyZWRJbWFnZXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAppbmRleCA0MjI4NWY4Li5jMjNmMTliIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0yMSw4ICsyMSw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgIk5ka01lZGlhQ3J5cHRvUHJpdi5oIgotI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKaW5kZXggMDBkNDUyMC4uY2UyYzY2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKaW5kZXggOWQwMGU1ZS4uMDg5MWYyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKQEAgLTIzLDMyICsyMywxMDIgQEAKICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5oPgogCiAjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIgogI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIgorCisjaW5jbHVkZSA8bXV0ZXg+IC8vIHN0ZDo6Y2FsbF9vbmNlLG9uY2VfZmxhZworI2luY2x1ZGUgPGRsZmNuLmg+IC8vIGRsb3BlbgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAorLy8gbG9hZCBsaWJhbmRyb2lkX3J1bnRpbWUuc28gbGF6aWx5LgorLy8gQSB2ZW5kb3IgcHJvY2VzcyBtYXkgdXNlIGxpYm1lZGlhbmRrIGJ1dCBzaG91bGQgbm90IGRlcGVuZCBvbiBsaWJhbmRyb2lkX3J1bnRpbWUuCisvLyBUT0RPKGpvb3l1bmcpOiByZW1vdmUgZHVwbGljYXRlIChiLzEyNTU1MDEyMSkKKy8vIGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvYmluZGVyL25kay9pYmluZGVyX2puaS5jcHAKK25hbWVzcGFjZSB7CisKK3R5cGVkZWYgSk5JRW52KiAoKmdldEpOSUVudl90KSgpOwordHlwZWRlZiBzcDxJQmluZGVyPiAoKmliaW5kZXJGb3JKYXZhT2JqZWN0X3QpKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaik7CisKK2dldEpOSUVudl90IGdldEpOSUVudl87CitpYmluZGVyRm9ySmF2YU9iamVjdF90IGliaW5kZXJGb3JKYXZhT2JqZWN0XzsKKworc3RkOjpvbmNlX2ZsYWcgbUxvYWRGbGFnOworCit2b2lkIGxvYWQoKSB7CisgICAgc3RkOjpjYWxsX29uY2UobUxvYWRGbGFnLCBbXSgpIHsKKyAgICAgICAgdm9pZCogaGFuZGxlID0gZGxvcGVuKCJsaWJhbmRyb2lkX3J1bnRpbWUuc28iLCBSVExEX0xBWlkpOworICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3Qgb3BlbiBsaWJhbmRyb2lkX3J1bnRpbWUuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBnZXRKTklFbnZfID0gcmVpbnRlcnByZXRfY2FzdDxnZXRKTklFbnZfdD4oCisgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiX1pON2FuZHJvaWQxNEFuZHJvaWRSdW50aW1lOWdldEpOSUVudkV2IikpOworICAgICAgICBpZiAoZ2V0Sk5JRW52XyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudi4iKTsKKyAgICAgICAgICAgIC8vIG5vIHJldHVybgorICAgICAgICB9CisKKyAgICAgICAgaWJpbmRlckZvckphdmFPYmplY3RfID0gcmVpbnRlcnByZXRfY2FzdDxpYmluZGVyRm9ySmF2YU9iamVjdF90PigKKyAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJfWk43YW5kcm9pZDIwaWJpbmRlckZvckphdmFPYmplY3RFUDdfSk5JRW52UDhfam9iamVjdCIpKTsKKyAgICAgICAgaWYgKGliaW5kZXJGb3JKYXZhT2JqZWN0XyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgaWJpbmRlckZvckphdmFPYmplY3QuIik7CisgICAgICAgICAgICAvLyBubyByZXR1cm4KKyAgICAgICAgfQorICAgIH0pOworfQorCitKTklFbnYqIGdldEpOSUVudigpIHsKKyAgICBsb2FkKCk7CisgICAgaWYgKGdldEpOSUVudl8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIChnZXRKTklFbnZfKSgpOworfQorCitzcDxJQmluZGVyPiBpYmluZGVyRm9ySmF2YU9iamVjdChKTklFbnYqIGVudiwgam9iamVjdCBvYmopIHsKKyAgICBsb2FkKCk7CisgICAgaWYgKGliaW5kZXJGb3JKYXZhT2JqZWN0XyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gKGliaW5kZXJGb3JKYXZhT2JqZWN0XykoZW52LCBvYmopOworfQorCit9IC8vIG5hbWVzcGFjZQorCiBzdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZSB7CiAgICAgdm9pZCAqdXNlcmRhdGE7CiAgICAgQU1lZGlhRGF0YVNvdXJjZVJlYWRBdCByZWFkQXQ7CiAgICAgQU1lZGlhRGF0YVNvdXJjZUdldFNpemUgZ2V0U2l6ZTsKICAgICBBTWVkaWFEYXRhU291cmNlQ2xvc2UgY2xvc2U7CisgICAgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUgZ2V0QXZhaWxhYmxlU2l6ZTsKKyAgICBzcDxEYXRhU291cmNlPiBtSW1wbDsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CiB9OwogCiBOZGtEYXRhU291cmNlOjpOZGtEYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2UgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlX25ldygpKSB7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+cmVhZEF0KTsKLSAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0U2l6ZSk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5jbG9zZSk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT51c2VyZGF0YSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnJlYWRBdCk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5nZXRTaXplKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5jbG9zZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+dXNlcmRhdGEpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZSk7CisgICAgbURhdGFTb3VyY2UtPm1JbXBsID0gZGF0YVNvdXJjZS0+bUltcGw7CisgICAgbURhdGFTb3VyY2UtPm1GbGFncyA9IGRhdGFTb3VyY2UtPm1GbGFnczsKIH0KIAogTmRrRGF0YVNvdXJjZTo6fk5ka0RhdGFTb3VyY2UoKSB7CkBAIC01OSw5ICsxMjksMTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3VpbnQzMl90IE5ka0RhdGFTb3VyY2U6OmZsYWdzKCkgeworICAgIHJldHVybiBtRGF0YVNvdXJjZS0+bUZsYWdzOworfQorCiBzc2l6ZV90IE5ka0RhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplID09IE5VTEwgfHwgbURhdGFTb3VyY2UtPnVzZXJkYXRhID09IE5VTEwpIHsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCA9PSBOVUxMIHx8IG1EYXRhU291cmNlLT51c2VyZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcmV0dXJuIG1EYXRhU291cmNlLT5yZWFkQXQobURhdGFTb3VyY2UtPnVzZXJkYXRhLCBvZmZzZXQsIGRhdGEsIHNpemUpOwpAQCAtOTIsNiArMTY2LDEwMCBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgTmRrRGF0YVNvdXJjZTo6Z2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZXB0cikgeworICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOworICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZSAhPSBOVUxMCisgICAgICAgICAgICAmJiBtRGF0YVNvdXJjZS0+dXNlcmRhdGEgIT0gTlVMTAorICAgICAgICAgICAgJiYgc2l6ZXB0ciAhPSBOVUxMKSB7CisgICAgICAgIHNpemUgPSBtRGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZShtRGF0YVNvdXJjZS0+dXNlcmRhdGEsIG9mZnNldCk7CisgICAgICAgICpzaXplcHRyID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHNpemUgPj0gMCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKworc3RhdGljIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VGcm9tSmF2YU9iaihKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGludCB2ZXJzaW9uKSB7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzcDxJQmluZGVyPiBiaW5kZXI7CisgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGJpbmRlciA9IGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgb2JqKTsKKyAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihiaW5kZXIpOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICByZXR1cm4gbmV3IEpNZWRpYTJIVFRQU2VydmljZShlbnYsIG9iaik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlVGVtcGxhdGUoCisgICAgICAgIEpOSUVudiAqZW52LAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IGNoYXIgKmNsYXp6LAorICAgICAgICBjb25zdCBjaGFyICptZXRob2QsCisgICAgICAgIGNvbnN0IGNoYXIgKnNpZ25hdHVyZSwKKyAgICAgICAgaW50IHZlcnNpb24pIHsKKyAgICBqb2JqZWN0IHNlcnZpY2UgPSBOVUxMOworICAgIGlmIChlbnYgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiaHR0cCBzZXJ2aWNlIG11c3QgYmUgY3JlYXRlZCBmcm9tIEphdmEgdGhyZWFkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGpjbGFzcyBtZWRpYWh0dHBjbGFzcyA9IGVudi0+RmluZENsYXNzKGNsYXp6KTsKKyAgICBpZiAobWVkaWFodHRwY2xhc3MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBNZWRpYSgyKUh0dHBTZXJ2aWNlIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgam1ldGhvZElEIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQobWVkaWFodHRwY2xhc3MsIG1ldGhvZCwgc2lnbmF0dXJlKTsKKyAgICBpZiAobWVkaWFIdHRwQ3JlYXRlTWV0aG9kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgbWV0aG9kIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAganN0cmluZyBqdXJpID0gZW52LT5OZXdTdHJpbmdVVEYodXJpKTsKKworICAgIHNlcnZpY2UgPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobWVkaWFodHRwY2xhc3MsIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCwganVyaSk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqdXJpKTsKKworICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VGcm9tSmF2YU9iaihlbnYsIHNlcnZpY2UsIHZlcnNpb24pOworICAgIHJldHVybiBodHRwU2VydmljZTsKKworfQorCitzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKGNvbnN0IGNoYXIgKnVyaSwgaW50IHZlcnNpb24pIHsKKworICAgIEpOSUVudiAqZW52OworICAgIGNvbnN0IGNoYXIgKmNsYXp6LCAqbWV0aG9kLCAqc2lnbmF0dXJlOworCisgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGVudiA9IGdldEpOSUVudigpOworICAgICAgICAgICAgY2xhenogPSAiYW5kcm9pZC9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlIjsKKyAgICAgICAgICAgIG1ldGhvZCA9ICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IjsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL29zL0lCaW5kZXI7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICAgICAgY2xhenogPSAiYW5kcm9pZC9tZWRpYS9NZWRpYTJIVFRQU2VydmljZSI7CisgICAgICAgICAgICBtZXRob2QgPSAiY3JlYXRlSFRUUFNlcnZpY2UiOworICAgICAgICAgICAgc2lnbmF0dXJlID0gIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUFNlcnZpY2U7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VUZW1wbGF0ZShlbnYsIHVyaSwgY2xhenosIG1ldGhvZCwgc2lnbmF0dXJlLCB2ZXJzaW9uKTsKKworfQorCiBleHRlcm4gIkMiIHsKIAogRVhQT1JUCkBAIC0xMDUsNiArMjczLDMyIEBACiB9CiAKIEVYUE9SVAorQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5X3ZhbHVlcykgeworCisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gc2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UodXJpLCAvKiB2ZXJzaW9uID0gKi8gMSk7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWhlYWRlcnM7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTgoa2V5X3ZhbHVlc1tpICogMl0pOworICAgICAgICBTdHJpbmc4IHZhbHVlOChrZXlfdmFsdWVzW2kgKiAyICsgMV0pOworICAgICAgICBoZWFkZXJzLmFkZChrZXk4LCB2YWx1ZTgpOworICAgIH0KKworICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKHNlcnZpY2UsIHVyaSwgJmhlYWRlcnMpOworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkgc291cmNlIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEFMT0dJKCJBTWVkaWFEYXRhU291cmNlX25ld1VyaSBzb3VyY2UgJXMgZmxhZ3MgJXUiLCBzb3VyY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgc291cmNlLT5mbGFncygpKTsKKyAgICBBTWVkaWFEYXRhU291cmNlKiBhU291cmNlID0gY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2Uoc291cmNlKTsKKyAgICBhU291cmNlLT5tSW1wbCA9IHNvdXJjZTsKKyAgICBhU291cmNlLT5tRmxhZ3MgPSBzb3VyY2UtPmZsYWdzKCk7CisgICAgcmV0dXJuIGFTb3VyY2U7Cit9CisKK0VYUE9SVAogdm9pZCBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShBTWVkaWFEYXRhU291cmNlICptU291cmNlKSB7CiAgICAgQUxPR1YoImR0b3IiKTsKICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CkBAIC0xMzIsNSArMzI2LDE2IEBACiAgICAgbVNvdXJjZS0+Y2xvc2UgPSBjbG9zZTsKIH0KIAorRVhQT1JUCit2b2lkIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSkgeworICAgIHJldHVybiBtU291cmNlLT5jbG9zZShtU291cmNlLT51c2VyZGF0YSk7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUgZ2V0QXZhaWxhYmxlU2l6ZSkgeworICAgIG1Tb3VyY2UtPmdldEF2YWlsYWJsZVNpemUgPSBnZXRBdmFpbGFibGVTaXplOworfQorCiB9IC8vIGV4dGVybiAiQyIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE1N2RhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MiCisKKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3NpemVfdCBEYXRhU291cmNlX2dldFNpemUodm9pZCAqdXNlcmRhdGEpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBzb3VyY2UtPmdldFNpemUoJnNpemUpOworICAgIHJldHVybiBzaXplOworfQorCitzc2l6ZV90IERhdGFTb3VyY2VfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICByZXR1cm4gc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHNpemUpOworfQorCit2b2lkIERhdGFTb3VyY2VfY2xvc2Uodm9pZCAqdXNlcmRhdGEpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBzb3VyY2UtPmNsb3NlKCk7Cit9CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRBdmFpbGFibGVTaXplKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCkgeworICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOworICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOworICAgIHNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZShvZmZzZXQsICZzaXplKTsKKyAgICByZXR1cm4gIHNpemU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTAzMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfTUVESUFfREFUQV9TT1VSQ0VfQ0FMTEJBQ0tTX0gKKworI2RlZmluZSBBX01FRElBX0RBVEFfU09VUkNFX0NBTExCQUNLU19ICisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKTsKKworc3NpemVfdCBEYXRhU291cmNlX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKTsKKwordm9pZCBEYXRhU291cmNlX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKTsKKworc3NpemVfdCBEYXRhU291cmNlX2dldEF2YWlsYWJsZVNpemUodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0KTsKKworc3RhdGljIGlubGluZSBBTWVkaWFEYXRhU291cmNlKiBjb252ZXJ0RGF0YVNvdXJjZVRvQU1lZGlhRGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBTWVkaWFEYXRhU291cmNlICptU291cmNlID0gQU1lZGlhRGF0YVNvdXJjZV9uZXcoKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1Tb3VyY2UsIHNvdXJjZS5nZXQoKSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobVNvdXJjZSwgRGF0YVNvdXJjZV9yZWFkQXQpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtU291cmNlLCBEYXRhU291cmNlX2dldFNpemUpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobVNvdXJjZSwgRGF0YVNvdXJjZV9jbG9zZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKG1Tb3VyY2UsIERhdGFTb3VyY2VfZ2V0QXZhaWxhYmxlU2l6ZSk7CisgICAgcmV0dXJuIG1Tb3VyY2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9NRURJQV9EQVRBX1NPVVJDRV9DQUxMQkFDS1NfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKaW5kZXggZWE5Yzg2NS4uMTZmZjk3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtNDMsMTEgKzQ0LDEzIEBACiAgICAgTmRrRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICopOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICopOwogICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OZGtEYXRhU291cmNlKCk7CkBAIC01OSw1ICs2Miw3IEBACiAKIH07CiAKK3NwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UoY29uc3QgY2hhciAqdXJpLCBpbnQgdmVyc2lvbik7CisKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfUFJJVl9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCmluZGV4IGI2ZWExODMuLjJkZWIxYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApAQCAtMjc0LDcgKzI3NCwxMCBAQAogICAgIH0KIAogICAgIFN0cmluZzggbWltZVN0ciA9IG1pbWVUeXBlID8gU3RyaW5nOChtaW1lVHlwZSkgOiBTdHJpbmc4KCIiKTsKLSAgICByZXR1cm4gZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lU3RyKTsKKyAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lU3RyLAorICAgICAgICAgICAgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd24sICZpc1N1cHBvcnRlZCk7CisgICAgcmV0dXJuIChzdGF0dXMgPT0gT0spICYmIGlzU3VwcG9ydGVkOwogfQogCiBFWFBPUlQKQEAgLTQzMCw2ICs0MzMsNyBAQAogICAgIH0KICAgICBTdHJpbmc4IGRlZmF1bHRVcmw7CiAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZTsKKyAgICBtT2JqLT5tS2V5UmVxdWVzdC5jbGVhcigpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldEtleVJlcXVlc3QoKml0ZXIsIG1kSW5pdCwgU3RyaW5nOChtaW1lVHlwZSksCiAgICAgICAgICAgICBtZEtleVR5cGUsIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLCBtT2JqLT5tS2V5UmVxdWVzdCwgZGVmYXVsdFVybCwKICAgICAgICAgICAgICZrZXlSZXF1ZXN0VHlwZSk7CkBAIC02OTcsNyArNzAxLDcgQEAKICAgICBWZWN0b3I8dWludDhfdD4gYnl0ZUFycmF5OwogICAgIGJ5dGVBcnJheS5hcHBlbmRBcnJheSh2YWx1ZSwgdmFsdWVTaXplKTsKIAotICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+Z2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+c2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAogICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXkpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggNGJlNzFhYy4uYzgzYjI1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMCw4ICsyMCw5IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZVByaXYuaCIKLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKIAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KQEAgLTMzLDg4ICszNCwyOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogCiAjaW5jbHVkZSA8am5pLmg+CiAKLSNpbmNsdWRlIDxtdXRleD4gLy8gc3RkOjpjYWxsX29uY2Usb25jZV9mbGFnCi0jaW5jbHVkZSA8ZGxmY24uaD4gLy8gZGxvcGVuCi0KIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi0vLyBsb2FkIGxpYmFuZHJvaWRfcnVudGltZS5zbyBsYXppbHkuCi0vLyBBIHZlbmRvciBwcm9jZXNzIG1heSB1c2UgbGlibWVkaWFuZGsgYnV0IHNob3VsZCBub3QgZGVwZW5kIG9uIGxpYmFuZHJvaWRfcnVudGltZS4KLS8vIFRPRE8oam9veXVuZyk6IHJlbW92ZSBkdXBsaWNhdGUgKGIvMTI1NTUwMTIxKQotLy8gZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9iaW5kZXIvbmRrL2liaW5kZXJfam5pLmNwcAotbmFtZXNwYWNlIHsKLQotdHlwZWRlZiBKTklFbnYqICgqZ2V0Sk5JRW52X3QpKCk7Ci10eXBlZGVmIHNwPElCaW5kZXI+ICgqaWJpbmRlckZvckphdmFPYmplY3RfdCkoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKTsKLQotZ2V0Sk5JRW52X3QgZ2V0Sk5JRW52XzsKLWliaW5kZXJGb3JKYXZhT2JqZWN0X3QgaWJpbmRlckZvckphdmFPYmplY3RfOwotCi1zdGQ6Om9uY2VfZmxhZyBtTG9hZEZsYWc7Ci0KLXZvaWQgbG9hZCgpIHsKLSAgICBzdGQ6OmNhbGxfb25jZShtTG9hZEZsYWcsIFtdKCkgewotICAgICAgICB2b2lkKiBoYW5kbGUgPSBkbG9wZW4oImxpYmFuZHJvaWRfcnVudGltZS5zbyIsIFJUTERfTEFaWSk7Ci0gICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBvcGVuIGxpYmFuZHJvaWRfcnVudGltZS4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGdldEpOSUVudl8gPSByZWludGVycHJldF9jYXN0PGdldEpOSUVudl90PigKLSAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJfWk43YW5kcm9pZDE0QW5kcm9pZFJ1bnRpbWU5Z2V0Sk5JRW52RXYiKSk7Ci0gICAgICAgIGlmIChnZXRKTklFbnZfID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52LiIpOwotICAgICAgICAgICAgLy8gbm8gcmV0dXJuCi0gICAgICAgIH0KLQotICAgICAgICBpYmluZGVyRm9ySmF2YU9iamVjdF8gPSByZWludGVycHJldF9jYXN0PGliaW5kZXJGb3JKYXZhT2JqZWN0X3Q+KAotICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIl9aTjdhbmRyb2lkMjBpYmluZGVyRm9ySmF2YU9iamVjdEVQN19KTklFbnZQOF9qb2JqZWN0IikpOwotICAgICAgICBpZiAoaWJpbmRlckZvckphdmFPYmplY3RfID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBpYmluZGVyRm9ySmF2YU9iamVjdC4iKTsKLSAgICAgICAgICAgIC8vIG5vIHJldHVybgotICAgICAgICB9Ci0gICAgfSk7Ci19Ci0KLUpOSUVudiogZ2V0Sk5JRW52KCkgewotICAgIGxvYWQoKTsKLSAgICBpZiAoZ2V0Sk5JRW52XyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXR1cm4gKGdldEpOSUVudl8pKCk7Ci19Ci0KLXNwPElCaW5kZXI+IGliaW5kZXJGb3JKYXZhT2JqZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikgewotICAgIGxvYWQoKTsKLSAgICBpZiAoaWJpbmRlckZvckphdmFPYmplY3RfID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIHJldHVybiAoaWJpbmRlckZvckphdmFPYmplY3RfKShlbnYsIG9iaik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLXN0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gQU1FRElBX09LOwotICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0lPKSB7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87Ci0gICAgfQotCi0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Ci19Ci0KIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3IgewogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IG1JbXBsOwogICAgIHNwPEFCdWZmZXI+IG1Qc3NoQnVmOwogfTsKIAorc3A8QUJ1ZmZlcj4gVTMyQXJyYXlUb1NpemVCdWYoc2l6ZV90IG51bVN1YlNhbXBsZXMsIHVpbnQzMl90ICpkYXRhKSB7CisgICAgaWYgKG51bVN1YlNhbXBsZXMgPiAgU0laRV9NQVggLyBzaXplb2Yoc2l6ZV90KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3A8QUJ1ZmZlcj4gc2l6ZWJ1ZiA9IG5ldyBBQnVmZmVyKG51bVN1YlNhbXBsZXMgKiBzaXplb2Yoc2l6ZV90KSk7CisgICAgc2l6ZV90ICpzaXplcyA9IChzaXplX3QgKilzaXplYnVmLT5kYXRhKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IHNpemVzICE9IE5VTEwgJiYgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgeworICAgICAgICBzaXplc1tpXSA9IGRhdGFbaV07CisgICAgfQorICAgIHJldHVybiBzaXplYnVmOworfQorCiBleHRlcm4gIkMiIHsKIAogRVhQT1JUCkBAIC0xMzksNDcgKzgxLDM1IEBACiAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUltcGwtPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSk7CiB9CiAKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlV2l0aEhlYWRlcnMoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBpbnQgbnVtaGVhZGVycywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICprZXlzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKnZhbHVlcykgeworCisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJpKTsKKworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlID0gY3JlYXRlTWVkaWFIdHRwU2VydmljZSh1cmksIC8qIHZlcnNpb24gPSAqLyAxKTsKKyAgICBpZiAoaHR0cFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgY3JlYXRlIGh0dHAgc2VydmljZSIpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1oZWFkZXJzOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXk4KGtleXNbaV0pOworICAgICAgICBTdHJpbmc4IHZhbHVlOCh2YWx1ZXNbaV0pOworICAgICAgICBoZWFkZXJzLmFkZChrZXk4LCB2YWx1ZTgpOworICAgIH0KKworICAgIHN0YXR1c190IGVycjsKKyAgICBlcnIgPSBtRGF0YS0+bUltcGwtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVyaSwgbnVtaGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKK30KKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBjb25zdCBjaGFyICpsb2NhdGlvbikgewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIGxvY2F0aW9uKTsKLSAgICAvLyBUT0RPOiBhZGQgaGVhZGVyIHN1cHBvcnQKLQotICAgIEpOSUVudiAqZW52ID0gZ2V0Sk5JRW52KCk7Ci0gICAgam9iamVjdCBzZXJ2aWNlID0gTlVMTDsKLSAgICBpZiAoZW52ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInNldERhdGFTb3VyY2UocGF0aCkgbXVzdCBiZSBjYWxsZWQgZnJvbSBKYXZhIHRocmVhZCIpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGpjbGFzcyBtZWRpYWh0dHBjbGFzcyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiKTsKLSAgICBpZiAobWVkaWFodHRwY2xhc3MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBNZWRpYUh0dHBTZXJ2aWNlIik7Ci0gICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBqbWV0aG9kSUQgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChtZWRpYWh0dHBjbGFzcywKLSAgICAgICAgICAgICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IiwgIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvb3MvSUJpbmRlcjsiKTsKLSAgICBpZiAobWVkaWFIdHRwQ3JlYXRlTWV0aG9kID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgbWV0aG9kIik7Ci0gICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBqc3RyaW5nIGpsb2MgPSBlbnYtPk5ld1N0cmluZ1VURihsb2NhdGlvbik7Ci0KLSAgICBzZXJ2aWNlID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG1lZGlhaHR0cGNsYXNzLCBtZWRpYUh0dHBDcmVhdGVNZXRob2QsIGpsb2MpOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamxvYyk7Ci0KLSAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7Ci0gICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIHNlcnZpY2UpOwotICAgICAgICBodHRwU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihiaW5kZXIpOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgbG9jYXRpb24sIE5VTEwpOwotICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlV2l0aEhlYWRlcnMobURhdGEsIGxvY2F0aW9uLCAwLCBOVUxMLCBOVUxMKTsKIH0KIAogRVhQT1JUCkBAIC00MjAsNyArMzUwLDcgQEAKICAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZjcnlwdGVkZGF0YSwgJmNyeXB0ZWRzaXplKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgc2l6ZV90IG51bVN1YlNhbXBsZXMgPSBjcnlwdGVkc2l6ZSAvIHNpemVvZihzaXplX3QpOworICAgIHNpemVfdCBudW1TdWJTYW1wbGVzID0gY3J5cHRlZHNpemUgLyBzaXplb2YodWludDMyX3QpOwogCiAgICAgY29uc3Qgdm9pZCAqY2xlYXJkYXRhOwogICAgIHNpemVfdCBjbGVhcnNpemU7CkBAIC00NTQsNiArMzg0LDE2IEBACiAgICAgICAgIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI7CiAgICAgfQogCisgICAgaWYgKHNpemVvZih1aW50MzJfdCkgIT0gc2l6ZW9mKHNpemVfdCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJidWYgICA9IFUzMkFycmF5VG9TaXplQnVmKG51bVN1YlNhbXBsZXMsICh1aW50MzJfdCAqKWNsZWFyZGF0YSk7CisgICAgICAgIHNwPEFCdWZmZXI+IGNyeXB0ZWRidWYgPSBVMzJBcnJheVRvU2l6ZUJ1ZihudW1TdWJTYW1wbGVzLCAodWludDMyX3QgKiljcnlwdGVkZGF0YSk7CisgICAgICAgIGNsZWFyZGF0YSAgID0gY2xlYXJidWYgICAgPT0gTlVMTCA/IE5VTEwgOiBjbGVhcmJ1Zi0+ZGF0YSgpOworICAgICAgICBjcnlwdGVkZGF0YSA9IGNyeXB0ZWRkYXRhID09IE5VTEwgPyBOVUxMIDogY3J5cHRlZGJ1Zi0+ZGF0YSgpOworICAgICAgICBpZihjcnlwdGVkZGF0YSA9PSBOVUxMIHx8IGNsZWFyZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAogICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywKICAgICAgICAgICAgICh1aW50OF90Kikga2V5LApAQCAtNTI5LDYgKzQ2OSwxNiBAQAogICAgICAgICBtZXRhLT5zZXRCdWZmZXIoQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSwgbXBlZ1VzZXJEYXRhKTsKICAgICB9CiAKKyAgICBjb25zdCB2b2lkICphdWRpb1ByZXNlbnRhdGlvbnNQb2ludGVyOworICAgIHNpemVfdCBhdWRpb1ByZXNlbnRhdGlvbnNMZW5ndGg7CisgICAgaWYgKHNhbXBsZU1ldGEtPmZpbmREYXRhKAorICAgICAgICAgICAga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgJmRhdGFUeXBlLAorICAgICAgICAgICAgJmF1ZGlvUHJlc2VudGF0aW9uc1BvaW50ZXIsICZhdWRpb1ByZXNlbnRhdGlvbnNMZW5ndGgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGF1ZGlvUHJlc2VudGF0aW9uc0RhdGEgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgYXVkaW9QcmVzZW50YXRpb25zUG9pbnRlciwgYXVkaW9QcmVzZW50YXRpb25zTGVuZ3RoKTsKKyAgICAgICAgbWV0YS0+c2V0QnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sIGF1ZGlvUHJlc2VudGF0aW9uc0RhdGEpOworICAgIH0KKwogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCmluZGV4IDIwNzA3Y2MuLmVkODhjZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgpAQCAtMzEsMzEgKzMyLDggQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0cnVjdCBBTWVkaWFGb3JtYXQgewotICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgIFN0cmluZzggbURlYnVnOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1TdHJpbmdDYWNoZTsKLX07Ci0KIGV4dGVybiAiQyIgewogCi0vLyBwcml2YXRlIGZ1bmN0aW9ucyBmb3IgY29udmVyc2lvbiB0by9mcm9tIEFNZXNzYWdlCi1BTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKGNvbnN0IHZvaWQqIGRhdGEpIHsKLSAgICBBTE9HVigicHJpdmF0ZSBjdG9yIik7Ci0gICAgQU1lZGlhRm9ybWF0KiBtRGF0YSA9IG5ldyBBTWVkaWFGb3JtYXQoKTsKLSAgICBtRGF0YS0+bUZvcm1hdCA9ICooKHNwPEFNZXNzYWdlPiopZGF0YSk7Ci0gICAgaWYgKG1EYXRhLT5tRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImdvdCBOVUxMIGZvcm1hdCIpOwotICAgICAgICBtRGF0YS0+bUZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1EYXRhOwotfQotCi12b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCkgewotICAgICooKHNwPEFNZXNzYWdlPiopZGVzdCkgPSBtRGF0YS0+bUZvcm1hdDsKLX0KLQotCiAvKgogICogcHVibGljIGZ1bmN0aW9uIGZvbGxvdwogICovCkBAIC03Myw2ICs1MSwyMSBAQAogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfY2xlYXIoQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPmNsZWFyKCk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2NvcHkoQU1lZGlhRm9ybWF0ICp0bywgQU1lZGlhRm9ybWF0ICpmcm9tKSB7CisgICAgaWYgKCF0byB8fCAhZnJvbSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICB0by0+bUZvcm1hdC0+Y2xlYXIoKTsKKyAgICB0by0+bUZvcm1hdC0+ZXh0ZW5kKGZyb20tPm1Gb3JtYXQpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKIAogRVhQT1JUCiBjb25zdCBjaGFyKiBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoQU1lZGlhRm9ybWF0ICptRGF0YSkgewpAQCAtMjU1LDcgKzI0OCw3IEBACiB9CiAKIEVYUE9SVAotdm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIC8vIHRoZSBBQnVmZmVyKHZvaWQqLCBzaXplX3QpIGNvbnN0cnVjdG9yIGRvZXNuJ3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGRhdGEsIHNvIGNyZWF0ZQogICAgIC8vIGEgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgZGF0YSBpbnRvIGl0CiAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7CkBAIC0yNzQsNjUgKzI2NywxMjMgQEAKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQgPSAiYWFjLW1heC1vdXRwdXQtY2hhbm5lbF9jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSA9ICJhYWMtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREUgPSAiYWFjLXNici1tb2RlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNID0gImFsYnVtIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUID0gImFsYnVtYXJ0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUID0gImFsYnVtYXJ0aXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCA9ICJhcnRpc3QiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8gPSAiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BSRVNFTlRBVElPTl9JRCA9CisgICAgICAgICJhdWRpby1wcmVzZW50YXRpb24tcHJlc2VudGF0aW9uLWlkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUk9HUkFNX0lEID0gImF1ZGlvLXByZXNlbnRhdGlvbi1wcm9ncmFtLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQgPSAiYXVkaW8tc2Vzc2lvbi1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgPSAiYXV0aG9yIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERSA9ICJiaXRyYXRlLW1vZGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUgPSAiYml0cmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUgPSAiYml0cy1wZXItc2FtcGxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURSA9ICJjYXB0dXJlLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiA9ICJjZHRyYWNrbnVtIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQgPSAiY2hhbm5lbC1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0sgPSAiY2hhbm5lbC1tYXNrIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCA9ICJjb2xvci1mb3JtYXQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UgPSAiY29sb3ItcmFuZ2UiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQgPSAiY29sb3Itc3RhbmRhcmQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIgPSAiY29sb3ItdHJhbnNmZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gPSAiY29tcGlsYXRpb24iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSA9ICJjb21wbGV4aXR5IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSID0gImNvbXBvc2VyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCA9ICJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSA9ICJjcnlwdG8tZGVmYXVsdC1pdi1zaXplIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSyA9ICJjcnlwdG8tZW5jcnlwdGVkLWJ5dGUtYmxvY2siOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUyA9ICJjcnlwdG8tZW5jcnlwdGVkLXNpemVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViA9ICJjcnlwdG8taXYiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSA9ICJjcnlwdG8ta2V5IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFID0gImNyeXB0by1tb2RlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUyA9ICJjcnlwdG8tcGxhaW4tc2l6ZXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSyA9ICJjcnlwdG8tc2tpcC1ieXRlLWJsb2NrIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRCA9ICJjc2QiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAgPSAiY3NkLTAiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEgPSAiY3NkLTEiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIgPSAiY3NkLTIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQyA9ICJjc2QtYXZjIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDID0gImNzZC1oZXZjIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0QyNjMgPSAiZDI2MyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EQVRFID0gImRhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiA9ICJkaXNjbnVtIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUCA9ICJjcm9wIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hUID0gImRpc3BsYXktaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEggPSAiZGlzcGxheS13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiA9ICJkdXJhdGlvblVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVkgPSAiZW5jb2Rlci1kZWxheSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcgPSAiZW5jb2Rlci1wYWRkaW5nIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VTRFMgPSAiZXNkcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCA9ICJleGlmLW9mZnNldCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkUgPSAiZXhpZi1zaXplIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwgPSAiZmxhYy1jb21wcmVzc2lvbi1sZXZlbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCA9ICJmcmFtZS1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFID0gImZyYW1lLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgPSAiZ2VucmUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TID0gImdyaWQtY29scyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1MgPSAiZ3JpZC1yb3dzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTyA9ICJoZHItc3RhdGljLWluZm8iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSERSMTBfUExVU19JTkZPID0gImhkcjEwLXBsdXMtaW5mbyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRUlHSFQgPSAiaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lDQ19QUk9GSUxFID0gImljYy1wcm9maWxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EID0gImludHJhLXJlZnJlc2gtcGVyaW9kIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFMgPSAiaXMtYWR0cyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUID0gImlzLWF1dG9zZWxlY3QiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCA9ICJpcy1kZWZhdWx0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSA9ICJpcy1mb3JjZWQtc3VidGl0bGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSA9ICJpcy1zeW5jLWZyYW1lIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwgPSAiaS1mcmFtZS1pbnRlcnZhbCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZID0gImxhdGVuY3kiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwgPSAibGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04gPSAibG9jYXRpb24iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9PUCA9ICJsb29wIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUID0gImx5cmljaXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BTlVGQUNUVVJFUiA9ICJtYW51ZmFjdHVyZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFID0gIm1heC1iaXRyYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9GUFNfVE9fRU5DT0RFUiA9ICJtYXgtZnBzLXRvLWVuY29kZXIiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVCA9ICJtYXgtaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFID0gIm1heC1pbnB1dC1zaXplIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9QVFNfR0FQX1RPX0VOQ09ERVIgPSAibWF4LXB0cy1nYXAtdG8tZW5jb2RlciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfV0lEVEggPSAibWF4LXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01JTUUgPSAibWltZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSA9ICJtcGVnLXVzZXItZGF0YSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSID0gIm1wZWcyLXN0cmVhbS1oZWFkZXIiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEUgPSAib3BlcmF0aW5nLXJhdGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HID0gInBjbS1lbmNvZGluZyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSA9ICJwcmlvcml0eSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFID0gInByb2ZpbGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4gPSAicGNtLWJpZy1lbmRpYW4iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFNTSCA9ICJwc3NoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIgPSAicmVwZWF0LXByZXZpb3VzLWZyYW1lLWFmdGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OID0gInJvdGF0aW9uLWRlZ3JlZXMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUgPSAic2FtcGxlLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCA9ICJzYXItaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCA9ICJzYXItd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0VJID0gInNlaSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQgPSAic2xpY2UtaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NUUklERSA9ICJzdHJpZGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUgPSAidGFyZ2V0LXRpbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQgPSAidGVtcG9yYWwtbGF5ZXItY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQgPSAidGVtcG9yYWwtbGF5ZXItaWQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkcgPSAidHMtc2NoZW1hIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEgPSAidGV4dC1mb3JtYXQtZGF0YSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkMgPSAidGh1bWJuYWlsLWNzZC1oZXZjIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQgPSAidGh1bWJuYWlsLWhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRSA9ICJ0aHVtYm5haWwtdGltZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEggPSAidGh1bWJuYWlsLXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hUID0gInRpbGUtaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTEVfV0lEVEggPSAidGlsZS13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USU1FX1VTID0gInRpbWVVcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USVRMRSA9ICJ0aXRsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCA9ICJ0cmFjay1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCA9ICJ0cmFjay1pbmRleCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTID0gInZhbGlkLXNhbXBsZXMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEggPSAid2lkdGgiOwotCitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ZRUFSID0gInllYXIiOwogCiB9IC8vIGV4dGVybiAiQyIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmE2NTYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KLSAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KLSAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCi0gKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCi0gKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCi0gKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCi0gKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgotICovCi0KLSNpZm5kZWYgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICi0jZGVmaW5lIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotCi0jaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1BTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKHZvaWQqKTsKLXZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCB2b2lkKiBkZXN0KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICi0KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcAppbmRleCA0NGNhZmIyLi5kMTk5MmJmIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCkBAIC0yMCw3ICsyMCw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYU11eGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgotI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMzUsMTQgKzM2LDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gQU1FRElBX09LOwotICAgIH0KLSAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOwotICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKLX0KLQogc3RydWN0IEFNZWRpYU11eGVyIHsKICAgICBzcDxNZWRpYU11eGVyPiBtSW1wbDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL09XTkVSUyBiL21lZGlhL25kay9PV05FUlMKaW5kZXggMTFlODM0MC4uOWRjNDQxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL09XTkVSUworKysgYi9tZWRpYS9uZGsvT1dORVJTCkBAIC0xLDUgKzEsMyBAQAogbWFyY29uZUBnb29nbGUuY29tCiAjIEZvciBBSW1hZ2UvQUltYWdlUmVhZGVyCi1ldGFsdmFsYUBnb29nbGUuY29tCi15aW5jaGlheWVoQGdvb2dsZS5jb20KLXpoaWp1bmhlQGdvb2dsZS5jb20KK2luY2x1ZGUgcGxhdGZvcm0vZnJhbWV3b3Jrcy9hdjovY2FtZXJhL09XTkVSUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKaW5kZXggZjkzNjExOC4uM2U2MGRlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCkBAIC00OTksNyArNDk5LDUxIEBACiAgICAgICogPHA+V2hlbiBhbiB7QGxpbmsgQUltYWdlfSBvZiB0aGlzIGZvcm1hdCBpcyBvYnRhaW5lZCBmcm9tIGFuIHtAbGluayBBSW1hZ2VSZWFkZXJ9IG9yCiAgICAgICoge0BsaW5rIEFJbWFnZV9nZXROdW1iZXJPZlBsYW5lcygpfSBtZXRob2Qgd2lsbCByZXR1cm4gemVyby48L3A+CiAgICAgICovCi0gICAgQUlNQUdFX0ZPUk1BVF9QUklWQVRFICAgICAgICAgICA9IDB4MjIKKyAgICBBSU1BR0VfRk9STUFUX1BSSVZBVEUgICAgICAgICAgID0gMHgyMiwKKworICAgIC8qKgorICAgICAqIEFuZHJvaWQgWTggZm9ybWF0LgorICAgICAqCisgICAgICogPHA+WTggaXMgYSBwbGFuYXIgZm9ybWF0IGNvbXByaXNlZCBvZiBhIFd4SCBZIHBsYW5lIG9ubHksIHdpdGggZWFjaCBwaXhlbAorICAgICAqIGJlaW5nIHJlcHJlc2VudGVkIGJ5IDggYml0cy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZvcm1hdCBhc3N1bWVzCisgICAgICogPHVsPgorICAgICAqIDxsaT5hbiBldmVuIHdpZHRoPC9saT4KKyAgICAgKiA8bGk+YW4gZXZlbiBoZWlnaHQ8L2xpPgorICAgICAqIDxsaT5hIGhvcml6b250YWwgc3RyaWRlIG11bHRpcGxlIG9mIDE2IHBpeGVsczwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8cHJlPiBzaXplID0gc3RyaWRlICogaGVpZ2h0IDwvcHJlPgorICAgICAqCisgICAgICogPHA+Rm9yIGV4YW1wbGUsIHRoZSB7QGxpbmsgQUltYWdlfSBvYmplY3QgY2FuIHByb3ZpZGUgZGF0YQorICAgICAqIGluIHRoaXMgZm9ybWF0IGZyb20gYSB7QGxpbmsgQUNhbWVyYURldmljZX0gKGlmIHN1cHBvcnRlZCkgdGhyb3VnaCBhCisgICAgICoge0BsaW5rIEFJbWFnZVJlYWRlcn0gb2JqZWN0LiBUaGUgbnVtYmVyIG9mIHBsYW5lcyByZXR1cm5lZCBieQorICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXN9IHdpbGwgYWx3YXlzIGJlIDEuIFRoZSBwaXhlbCBzdHJpZGUgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldFBsYW5lUGl4ZWxTdHJpZGV9IHdpbGwgYWx3YXlzIGJlIDEsIGFuZCB0aGUKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldFBsYW5lUm93U3RyaWRlfSBkZXNjcmliZWQgdGhlIHZlcnRpY2FsIG5laWdoYm9yaW5nIHBpeGVsIGRpc3RhbmNlCisgICAgICogKGluIGJ5dGVzKSBiZXR3ZWVuIGFkamFjZW50IHJvd3MuPC9wPgorICAgICAqCisgICAgICovCisgICAgQUlNQUdFX0ZPUk1BVF9ZOCA9IDB4MjAyMDM4NTksCisKKyAgICAvKioKKyAgICAgKiBDb21wcmVzc2VkIEhFSUMgZm9ybWF0LgorICAgICAqCisgICAgICogPHA+VGhpcyBmb3JtYXQgZGVmaW5lcyB0aGUgSEVJQyBicmFuZCBvZiBIaWdoIEVmZmljaWVuY3kgSW1hZ2UgRmlsZQorICAgICAqIEZvcm1hdCBhcyBkZXNjcmliZWQgaW4gSVNPL0lFQyAyMzAwOC0xMi48L3A+CisgICAgICovCisgICAgQUlNQUdFX0ZPUk1BVF9IRUlDID0gMHg0ODQ1NDk0NiwKKworICAgIC8qKgorICAgICAqIERlcHRoIGF1Z21lbnRlZCBjb21wcmVzc2VkIEpQRUcgZm9ybWF0LgorICAgICAqCisgICAgICogPHA+SlBFRyBjb21wcmVzc2VkIG1haW4gaW1hZ2UgYWxvbmcgd2l0aCBYTVAgZW1iZWRkZWQgZGVwdGggbWV0YWRhdGEKKyAgICAgKiBmb2xsb3dpbmcgSVNPIDE2Njg0LTE6MjAxMShFKS48L3A+CisgICAgICovCisgICAgQUlNQUdFX0ZPUk1BVF9ERVBUSF9KUEVHID0gMHg2OTY1Njk2MywKKwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaAppbmRleCA2OGRlMTc2Li5lNWQ4NjNjIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKQEAgLTM3LDYgKzM3LDkgQEAKICNkZWZpbmUgX05ES19JTUFHRV9SRUFERVJfSAogCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKQEAgLTQ2MSw2ICs0NjQsMjMgQEAKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9zZXRCdWZmZXJSZW1vdmVkTGlzdGVuZXIoCiAgICAgICAgIEFJbWFnZVJlYWRlciogcmVhZGVyLCBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyKiBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAorI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKy8qCisgKiBHZXQgdGhlIG5hdGl2ZV9oYW5kbGVfdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBBTmF0aXZlV2luZG93IG93bmVkIGJ5IHRoZQorICogQUltYWdlUmVhZGVyIHByb3ZpZGVkLgorICoKKyAqIEBwYXJhbSByZWFkZXIgVGhlIGltYWdlIHJlYWRlciBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSBoYW5kbGUgVGhlIG91dHB1dCBuYXRpdmVfaGFuZGxlX3QuIFRoaXMgbmF0aXZlIGhhbmRsZSBpcyBvd25lZCBieQorICogICAgICAgICAgICAgICB0aGlzIGltYWdlIHJlYWRlci4KKyAqCisgKiBAcmV0dXJuIEFNRURJQV9PSyBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuCisgKiAgICAgICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUiBpZiByZWFkZXIgb3IgaGFuZGxlIGFyZSBOVUxMLgorICogICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiBpZiBzb21lIG90aGVyIGVycm9yIGlzIGVuY291bnRlcmVkLgorICovCittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKAorICAgIEFJbWFnZVJlYWRlciAqcmVhZGVyLCAvKiBvdXQgKi9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworI2VuZGlmCisKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KIAogX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmgKaW5kZXggZWE1YmEwYy4uMTZiMWViMyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmgKQEAgLTQzLDE0ICs0Myw5IEBACiAvKgogICogQU1lZGlhRGF0YVNvdXJjZSdzIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB0aHJlYWQKICAqIG9yIHRocmVhZCBwb29sLiBObyBndWFyYW50ZWVzIGFyZSBwcm92aWRlZCBhYm91dCB3aGljaCB0aHJlYWQocykgd2lsbCBiZSB1c2VkIGZvcgotICogY2FsbGJhY2tzLiBIb3dldmVyLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQgQU1lZGlhRGF0YVNvdXJjZSdzIGNhbGxiYWNrcyB3aWxsIG9ubHkKLSAqIGV2ZXIgYmUgaW52b2tlZCBieSBhIHNpbmdsZSB0aHJlYWQgYXQgYSB0aW1lLgotICoKLSAqIFRoZXJlIHdpbGwgYmUgYSB0aHJlYWQgc3luY2hyb25pemF0aW9uIHBvaW50IGJldHdlZW4gZWFjaCBjYWxsIHRvIGVuc3VyZSB0aGF0Ci0gKiBtb2RpZmljYXRpb25zIHRvIHRoZSBzdGF0ZSBvZiB5b3VyIEFNZWRpYURhdGFTb3VyY2UgYXJlIHZpc2libGUgdG8gZnV0dXJlCi0gKiBjYWxscy4gVGhpcyBtZWFucyB5b3UgZG9uJ3QgbmVlZCB0byBkbyB5b3VyIG93biBzeW5jaHJvbml6YXRpb24gdW5sZXNzIHlvdSdyZQotICogbW9kaWZ5aW5nIHRoZSBBTWVkaWFEYXRhU291cmNlIGZyb20gYW5vdGhlciB0aHJlYWQgd2hpbGUgaXQncyBiZWluZyB1c2VkIGJ5IHRoZQotICogZnJhbWV3b3JrLgorICogY2FsbGJhY2tzLiBGb3IgZXhhbXBsZSwgfGNsb3NlfCBjYW4gYmUgaW52b2tlZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCB0aGFuIHRoZQorICogdGhyZWFkIGludm9raW5nIHxyZWFkQXR8LiBBcyBzdWNoLCB0aGUgSW1wbGVtZW50YXRpb25zIG9mIEFNZWRpYURhdGFTb3VyY2UgY2FsbGJhY2tzCisgKiBtdXN0IGJlIHRocmVhZHNhZmUuCiAgKi8KIAogLyoqCkBAIC03NCw5ICs2OSwxOSBAQAogdHlwZWRlZiBzc2l6ZV90ICgqQU1lZGlhRGF0YVNvdXJjZUdldFNpemUpKHZvaWQgKnVzZXJkYXRhKTsKIAogLyoqCi0gKiBDYWxsZWQgdG8gY2xvc2UgdGhlIGRhdGEgc291cmNlIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgotICogVGhlIE5ESyBtZWRpYSBmcmFtZXdvcmsgZ3VhcmFudGVlcyB0aGF0IGFmdGVyIHxjbG9zZXwgaXMgY2FsbGVkCi0gKiBubyBmdXR1cmUgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgZGF0YSBzb3VyY2UuCisgKiBDYWxsZWQgdG8gY2xvc2UgdGhlIGRhdGEgc291cmNlLCB1bmJsb2NrIHJlYWRzLCBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkCisgKiByZXNvdXJjZXMuCisgKgorICogVGhlIE5ESyBtZWRpYSBmcmFtZXdvcmsgZ3VhcmFudGVlcyB0aGF0IGFmdGVyIHRoZSBmaXJzdCB8Y2xvc2V8IGlzCisgKiBjYWxsZWQsIG5vIGZ1dHVyZSBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBkYXRhIHNvdXJjZSBleGNlcHQKKyAqIGZvciB8Y2xvc2V8IGl0c2VsZi4KKyAqCisgKiBDbG9zaW5nIGEgZGF0YSBzb3VyY2UgYWxsb3dzIHJlYWRBdCBjYWxscyB0aGF0IHdlcmUgYmxvY2tlZCB3YWl0aW5nCisgKiBmb3IgSS9PIGRhdGEgdG8gcmV0dXJuIHByb21wdGx5LgorICoKKyAqIFdoZW4gdXNpbmcgQU1lZGlhRGF0YVNvdXJjZSBhcyBpbnB1dCB0byBBTWVkaWFFeHRyYWN0b3IsIGNsb3NpbmcKKyAqIGhhcyB0aGUgZWZmZWN0IG9mIHVuYmxvY2tpbmcgc2xvdyByZWFkcyBpbnNpZGUgb2Ygc2V0RGF0YVNvdXJjZQorICogYW5kIHJlYWRTYW1wbGVEYXRhLgogICovCiB0eXBlZGVmIHZvaWQgKCpBTWVkaWFEYXRhU291cmNlQ2xvc2UpKHZvaWQgKnVzZXJkYXRhKTsKIApAQCAtODYsNiArOTEsMzggQEAKICAqLwogQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogQ2FsbGVkIHRvIGdldCBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIGRhdGEgc291cmNlCisgKiBzdGFydGluZyBhdCB8b2Zmc2V0fCB3aXRob3V0IGJsb2NraW5nIGZvciBJL08uCisgKgorICogUmV0dXJuIC0xIHdoZW4gc3VjaCBhbiBlc3RpbWF0ZSBpcyBub3QgcG9zc2libGUuCisgKi8KK3R5cGVkZWYgc3NpemVfdCAoKkFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplKSh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQpOworCisvKioKKyAqIENyZWF0ZSBuZXcgbWVkaWEgZGF0YSBzb3VyY2UuIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbgorICogZm9yIHRoZSBuZXcgZGF0YSBzb3VyY2Ugb2JqZWN0IGZhaWxzLgorICoKKyAqIFNldCB0aGUgfHVyaXwgZnJvbSB3aGljaCB0aGUgZGF0YSBzb3VyY2Ugd2lsbCByZWFkLAorICogcGx1cyBhZGRpdGlvbmFsIGh0dHAgaGVhZGVycyB3aGVuIGluaXRpYXRpbmcgdGhlIHJlcXVlc3QuCisgKgorICogSGVhZGVycyB3aWxsIGNvbnRhaW4gY29ycmVzcG9uZGluZyBpdGVtcyBmcm9tIHxrZXlfdmFsdWVzfAorICogaW4gdGhlIGZvbGxvd2luZyBmYXNoaW9uOgorICoKKyAqIGtleV92YWx1ZXNbMF06a2V5X3ZhbHVlc1sxXQorICoga2V5X3ZhbHVlc1syXTprZXlfdmFsdWVzWzNdCisgKiAuLi4KKyAqIGtleV92YWx1ZXNbKG51bWhlYWRlcnMgLSAxKSAqIDJdOmtleV92YWx1ZXNbKG51bWhlYWRlcnMgLSAxKSAqIDIgKyAxXQorICoKKyAqLworQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkoY29uc3QgY2hhciAqdXJpLAorICAgICAgICBpbnQgbnVtaGVhZGVycywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICprZXlfdmFsdWVzKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIC8qKgogICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIGRhdGEgc291cmNlLgogICovCkBAIC0xMzcsNiArMTc0LDMwIEBACiAKICNlbmRpZiAgLypfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIENsb3NlIHRoZSBkYXRhIHNvdXJjZSwgdW5ibG9jayByZWFkcywgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYURhdGFTb3VyY2VDbG9zZSBmb3IKKyAqIGFkZGl0aW9uYWwgZGV0YWlscy4KKyAqLwordm9pZCBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKEFNZWRpYURhdGFTb3VyY2UqKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldCBhIGN1c3RvbSBjYWxsYmFjayBmb3Igc3VwcGx5aW5nIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIGJ5dGVzCisgKiB0aGF0IGNhbiBiZSByZWFkIGZyb20gdGhpcyBkYXRhIHNvdXJjZSBzdGFydGluZyBhdCBhbiBvZmZzZXQgd2l0aG91dAorICogYmxvY2tpbmcgZm9yIEkvTy4KKyAqCisgKiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRlZmluaXRpb24gb2YgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUKKyAqIGZvciBhZGRpdGlvbmFsIGRldGFpbHMuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKAorICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAgLypfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfREFUQVNPVVJDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKaW5kZXggNzVmNDYwNS4uMmJlMWQ2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaApAQCAtNjMsNiArNjMsNyBAQAogICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTiAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDUsCiAgICAgQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0gICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNiwKICAgICBBTUVESUFfRVJST1JfSU8gICAgICAgICAgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA3LAorICAgIEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSyAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDgsCiAKICAgICBBTUVESUFfRFJNX0VSUk9SX0JBU0UgICAgICAgICAgICAgID0gLTIwMDAwLAogICAgIEFNRURJQV9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAxLApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKaW5kZXggNmExNzk2Zi4uZTNkOWZlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCkBAIC03Miw3ICs3Miw2IEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciosCiAgICAgICAgIGNvbnN0IGNoYXIgKmxvY2F0aW9uKSBfX0lOVFJPRFVDRURfSU4oMjEpOwotICAgICAgICAvLyBUT0RPIHN1cHBvcnQgaGVhZGVycwogCiAjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCmluZGV4IDVmNzgwNGQuLjI1OTQ4MWQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaApAQCAtODMsMTMgKzgzLDkgQEAKIC8qKgogICogVGhlIHByb3ZpZGVkIGRhdGEgaXMgY29waWVkIGludG8gdGhlIGZvcm1hdC4KICAqLwotdm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAKLQotLyoqCi0gKiBYWFggc2hvdWxkIHRoZXNlIGJlIGludHMvZW51bXMgdGhhdCB3ZSBsb29rIHVwIGluIGEgdGFibGUgYXMgbmVlZGVkPwotICovCiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IgX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04gX19JTlRST0RVQ0VEX0lOKDI4KTsKQEAgLTE1Niw3ICsxNTIsNiBAQAogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQgX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjEpOwotCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKQEAgLTE3MCw2ICsxNjUsNzcgQEAKICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKy8qKgorICogcmVtb3ZlIGFsbCBrZXkvdmFsdWUgcGFpcnMgZnJvbSB0aGUgZ2l2ZW4gQU1lZGlhRm9ybWF0CisgKi8KK3ZvaWQgQU1lZGlhRm9ybWF0X2NsZWFyKEFNZWRpYUZvcm1hdCopIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogY29weSBvbmUgQU1lZGlhRm9ybWF0IHRvIGFub3RoZXIKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2NvcHkoQU1lZGlhRm9ybWF0ICp0bywgQU1lZGlhRm9ybWF0ICpmcm9tKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BUlRJU1QgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fUFJFU0VOVEFUSU9OX0lEIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fUFJPR1JBTV9JRCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVEIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0sgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0QyNjMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RBVEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVkgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVNEUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VYSUZfU0laRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dFTlJFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPT1AgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0ZQU19UT19FTkNPREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFNTSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfSEVWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1lFQVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjhhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9wcml2YXRlL21lZGlhL05ka0ltYWdlLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1BSSVZBVEVfTUVESUFfTkRLSU1BR0VfSF8KKyNkZWZpbmUgX1BSSVZBVEVfTUVESUFfTkRLSU1BR0VfSF8KKy8vIEZvcm1hdHMgbm90IGxpc3RlZCBpbiB0aGUgcHVibGljIEFQSSwgYnV0IHN0aWxsIGF2YWlsYWJsZSB0byBBSW1hZ2VSZWFkZXIKK2VudW0gQUlNQUdFX1BSSVZBVEVfRk9STUFUUyB7CisgICAgLyoqCisgICAgICogVW5wcm9jZXNzZWQgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHJhdworICAgICAqIGRlcHRoIG1lYXN1cmVtZW50cywgb3BhcXVlIHdpdGggMTYgYml0CisgICAgICogc2FtcGxlcy4KKyAgICAgKgorICAgICAqLworCisgICAgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEggPSAweDEwMDIsCit9OworI2VuZGlmIC8vIF9QUklWQVRFX01FRElBX05ES0lNQUdFCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dCBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CmluZGV4IGRlZWNiNjMuLjQ3MjVlOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CisrKyBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CkBAIC00LDYgKzQsNyBAQAogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2VBc3luYzsgIyBpbnRyb2R1Y2VkPTI2CiAgICAgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2U7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmM7ICMgaW50cm9kdWNlZD0yNgorICAgIEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGU7ICN2bmRrCiAgICAgQUltYWdlUmVhZGVyX2RlbGV0ZTsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlUmVhZGVyX2dldEZvcm1hdDsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlUmVhZGVyX2dldEhlaWdodDsgIyBpbnRyb2R1Y2VkPTI0CkBAIC0zNCw2NCArMzUsMTE5IEBACiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BUlRJU1Q7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BVVRIT1I7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0s7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0U7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUjsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFk7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9DU0Q7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzI7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9EMjYzOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9EQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1A7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FU0RTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfR0VOUkU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk87ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19BRFRTOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUw7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xPT1A7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0ZQU19UT19FTkNPREVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9QU1NIOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfU0VJOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEE7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfSEVWQzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVElUTEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVM7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9ZRUFSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzUmVjb3ZlcmFibGU7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1RyYW5zaWVudDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2RlbGV0ZTsKQEAgLTE0Miw2ICsxOTgsOSBAQAogICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZTsgICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0OyAgICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGE7ICMgaW50cm9kdWNlZD0yOAorICAgIEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpOyAgICAgICMgaW50cm9kdWNlZD0yOQorICAgIEFNZWRpYURhdGFTb3VyY2VfY2xvc2U7ICAgICAgICMgaW50cm9kdWNlZD0yOQorICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQU1lZGlhRHJtX2Nsb3NlU2Vzc2lvbjsKICAgICBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEOwogICAgIEFNZWRpYURybV9kZWNyeXB0OwpAQCAtMTg4LDYgKzI0Nyw4IEBACiAgICAgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VDdXN0b207ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQ7CiAgICAgQU1lZGlhRXh0cmFjdG9yX3Vuc2VsZWN0VHJhY2s7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyOyAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFGb3JtYXRfY29weTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZTsKICAgICBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyOwogICAgIEFNZWRpYUZvcm1hdF9nZXREb3VibGU7ICMgaW50cm9kdWNlZD0yOApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwIGIvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjUwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlUmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2UuaD4KKyNpbmNsdWRlIDxwcml2YXRlL21lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxOZGtJbWFnZVJlYWRlclByaXYuaD4KKyNpbmNsdWRlIDx2bmRrL2hhcmR3YXJlX2J1ZmZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYWltZzo6QUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlOworCit0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgUXVldWVCdWZmZXJJbnB1dDsKK3R5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgUXVldWVCdWZmZXJPdXRwdXQ7CisKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga0ltYWdlQnVmZmVyVXNhZ2UgPQorICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfT0ZURU47CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZUZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfUkdCQV84ODg4Oworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEltYWdlcyA9IDE7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUXVldWVCdWZmZXJJbnB1dFRpbWVTdGFtcCA9IDEzODQ4ODg2MTE7CitzdGF0aWMgY29uc3RleHByIGJvb2wga1F1ZXVlQnVmZmVySW5wdXRJc0F1dG9UaW1lU3RhbXAgPSBmYWxzZTsKK3N0YXRpYyBjb25zdGV4cHIgYW5kcm9pZF9kYXRhc3BhY2Uga1F1ZXVlQnVmZmVySW5wdXREYXRhc3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CitzdGF0aWMgY29uc3QgUmVjdCBrUXVldWVCdWZmZXJJbnB1dFJlY3QgPSBSZWN0KGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQpOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1F1ZXVlQnVmZmVySW5wdXRTY2FsaW5nTW9kZSA9IDA7CitzdGF0aWMgY29uc3RleHByIGludCBrUXVldWVCdWZmZXJJbnB1dFRyYW5zZm9ybSA9IDA7CitzdGF0aWMgY29uc3Qgc3A8RmVuY2U+IGtRdWV1ZUJ1ZmZlcklucHV0RmVuY2UgPSBGZW5jZTo6Tk9fRkVOQ0U7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtPbkltYWdlQXZhaWxhYmxlV2FpdFVzID0gMTAwICogMTAwMDsKKworY2xhc3MgQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2Uoa0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCwga0ltYWdlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZUJ1ZmZlclVzYWdlICwga01heEltYWdlcywgJmltYWdlUmVhZGVyXyk7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldCA9IEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICBBU1NFUlRfTkUoaW1hZ2VSZWFkZXJfLCBudWxscHRyKTsKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEltYWdlTGlzdGVuZXIoaW1hZ2VSZWFkZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VSZWFkZXJBdmFpbGFibGVDYl8pOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKGltYWdlUmVhZGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VSZWFkZXJEZXRhY2hlZENiXyk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChpbWFnZVJlYWRlcl8pIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUoaW1hZ2VSZWFkZXJfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgSGFuZGxlSW1hZ2VBdmFpbGFibGUoKSB7CisgICAgICAgIEFJbWFnZSAqb3V0SW1hZ2UgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBTUVESUFfT0s7CisgICAgICAgIGF1dG8gaW1hZ2VEZWxldGVyID0gW10oQUltYWdlICppbWcpIHsgQUltYWdlX2RlbGV0ZShpbWcpOyB9OworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUltYWdlLCBkZWNsdHlwZShpbWFnZURlbGV0ZXIpPiBpbWcobnVsbHB0ciwgaW1hZ2VEZWxldGVyKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgdGhlIGltYWdlIGNhbiBiZSBhY3F1aXJlZC4KKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UoaW1hZ2VSZWFkZXJfLCAmb3V0SW1hZ2UpOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICBBU1NFUlRfTkUoaW1nLCBudWxscHRyKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgd2UgY2FuIGdldCBhIGhhbmRsZSB0byB0aGUgaW1hZ2UncyBoYXJkd2FyZSBidWZmZXIgYW5kIGEKKyAgICAgICAgLy8gbmF0aXZlIGhhbmRsZSB0byBpdC4KKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyICpoYXJkd2FyZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihpbWcuZ2V0KCksICZoYXJkd2FyZUJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgICAgIEFTU0VSVF9ORShoYXJkd2FyZUJ1ZmZlciwgbnVsbHB0cik7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBBSGFyZHdhcmVCdWZmZXJfZ2V0TmF0aXZlSGFuZGxlKGhhcmR3YXJlQnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX05FKG5oLCBudWxscHRyKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGltYWdlQXZhaWxhYmxlTXV0ZXhfKTsKKyAgICAgICAgaW1hZ2VBdmFpbGFibGVfID0gdHJ1ZTsKKyAgICAgICAgaW1hZ2VDb25kVmFyXy5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25JbWFnZUF2YWlsYWJsZSh2b2lkICpjb250ZXh0LCBBSW1hZ2VSZWFkZXIgKnJlYWRlcikgeworICAgICAgICAodm9pZClyZWFkZXI7CisgICAgICAgIEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgKnRoaXNDb250ZXh0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCAqPihjb250ZXh0KTsKKyAgICAgICAgdGhpc0NvbnRleHQtPkhhbmRsZUltYWdlQXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25CdWZmZXJSZW1vdmVkKHZvaWQgKiwgQUltYWdlUmVhZGVyICosIEFIYXJkd2FyZUJ1ZmZlciAqKSB7CisgICAgfQorCisgICAgQUltYWdlUmVhZGVyICppbWFnZVJlYWRlcl8gPSBudWxscHRyOworICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIGltYWdlUmVhZGVyQXZhaWxhYmxlQ2Jfe3RoaXMsIG9uSW1hZ2VBdmFpbGFibGV9OworICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgaW1hZ2VSZWFkZXJEZXRhY2hlZENiX3t0aGlzLCBvbkJ1ZmZlclJlbW92ZWR9OworICAgIHN0ZDo6bXV0ZXggaW1hZ2VBdmFpbGFibGVNdXRleF87CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgaW1hZ2VDb25kVmFyXzsKKyAgICBib29sIGltYWdlQXZhaWxhYmxlXyA9IGZhbHNlOworfTsKKworc3RhdGljIHZvaWQgZmlsbFJHQkE4QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisgICAgY29uc3Qgc2l6ZV90IFBJWEVMX1NJWkUgPSA0OworICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBvZmZfdCBvZmZzZXQgPSAoeSAqIHN0cmlkZSArIHgpICogUElYRUxfU0laRTsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKSB7CisgICAgICAgICAgICAgICAgaW50IHBhcml0eVggPSAoeCAvICgxIDw8IChjKzIpKSkgJiAxOworICAgICAgICAgICAgICAgIGludCBwYXJpdHlZID0gKHkgLyAoMSA8PCAoYysyKSkpICYgMTsKKyAgICAgICAgICAgICAgICBidWZbb2Zmc2V0ICsgY10gPSAocGFyaXR5WCBeIHBhcml0eVkpID8gMjMxIDogMzU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LCBDcmVhdGVXaW5kb3dOYXRpdmVIYW5kbGUpIHsKKyAgICAvLyBDaGVjayB0aGF0IHdlIGNhbiBjcmVhdGUgYSBuYXRpdmVfaGFuZGxlX3QgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAvLyBBSW1hZ2VSZWFkZXIuCisgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IG51bGxwdHI7CisgICAgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZShpbWFnZVJlYWRlcl8sICZuaCk7CisgICAgQVNTRVJUX05FKG5oLCBudWxscHRyKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgYXJlIG9ubHkgaW50cyBpbiB0aGUgaGFuZGxlLgorICAgIEFTU0VSVF9FUShuaC0+bnVtRmRzLCAwKTsKKyAgICBBU1NFUlRfTkUobmgtPm51bUludHMsIDApOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgSEdCUCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGhhbmRsZS4KKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0gIEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShuaCk7CisgICAgQVNTRVJUX05FKGhnYnAsIG51bGxwdHIpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGhnYnApOworICAgIGludCBkZXF1ZXVlZFNsb3QgPSAtMTsKKyAgICBzcDxGZW5jZT4gZGVxdWV1ZWRGZW5jZTsKKyAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBvdXRwdXQ7CisgICAgQVNTRVJUX0VRKE9LLCBpZ2JwLT5jb25uZWN0KG51bGxwdHIsIE5BVElWRV9XSU5ET1dfQVBJX0NQVSwgZmFsc2UsICZvdXRwdXQpKTsKKworICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gZGVxdWV1ZSBhIGJ1ZmZlci4KKyAgICBBU1NFUlRfRVEoT0ssCisgICAgICAgICAgICAgIH5JR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OICYKKyAgICAgICAgICAgICAgICAgICAgICAoaWdicC0+ZGVxdWV1ZUJ1ZmZlcigmZGVxdWV1ZWRTbG90LCAmZGVxdWV1ZWRGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZUZvcm1hdCwga0ltYWdlQnVmZmVyVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cikpKTsKKyAgICBFWFBFQ1RfTEUoMCwgZGVxdWV1ZWRTbG90KTsKKyAgICBFWFBFQ1RfR1QoQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMsIGRlcXVldWVkU2xvdCk7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBkZXF1ZXVlZEJ1ZmZlcjsKKyAgICBpZ2JwLT5yZXF1ZXN0QnVmZmVyKGRlcXVldWVkU2xvdCwgJmRlcXVldWVkQnVmZmVyKTsKKyAgICB1aW50OF90KiBpbWcgPSBudWxscHRyOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgZGVxdWV1ZWRCdWZmZXItPmxvY2soa0ltYWdlQnVmZmVyVXNhZ2UsICh2b2lkKiopKCZpbWcpKSk7CisKKyAgICAvLyBXcml0ZSBpbiBzb21lIGR1bW15IGltYWdlIGRhdGEuCisgICAgZmlsbFJHQkE4QnVmZmVyKGltZywgZGVxdWV1ZWRCdWZmZXItPmdldFdpZHRoKCksIGRlcXVldWVkQnVmZmVyLT5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZWRCdWZmZXItPmdldFN0cmlkZSgpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRlcXVldWVkQnVmZmVyLT51bmxvY2soKSk7CisgICAgUXVldWVCdWZmZXJJbnB1dCBxdWV1ZUJ1ZmZlcklucHV0KGtRdWV1ZUJ1ZmZlcklucHV0VGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dElzQXV0b1RpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXREYXRhc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRTY2FsaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0RmVuY2UpOworICAgIFF1ZXVlQnVmZmVyT3V0cHV0IHF1ZXVlQnVmZmVyT3V0cHV0OworICAgIEFTU0VSVF9FUShPSywgaWdicC0+cXVldWVCdWZmZXIoZGVxdWV1ZWRTbG90LCBxdWV1ZUJ1ZmZlcklucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1ZXVlQnVmZmVyT3V0cHV0KSk7CisgICAgLy8gd2FpdCB1bnRpbCB0aGUgb25JbWFnZUF2YWlsYWJsZSBjYWxsYmFjayBpcyBjYWxsZWQsIG9yIHRpbWVvdXQgY29tcGxldGVzLgorICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhpbWFnZUF2YWlsYWJsZU11dGV4Xyk7CisgICAgaW1hZ2VDb25kVmFyXy53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGtPbkltYWdlQXZhaWxhYmxlV2FpdFVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXXsgcmV0dXJuIHRoaXMtPmltYWdlQXZhaWxhYmxlXzt9KTsKKyAgICBFWFBFQ1RfVFJVRShpbWFnZUF2YWlsYWJsZV8pIDw8ICAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGltYWdlIGRhdGEgdG8gYmUgaGFuZGxlZCFcbiI7Cit9CisKK2NsYXNzIEFJbWFnZVJlYWRlclByaXZhdGVGb3JtYXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHB1YmxpYzoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIHN0YXR1cyA9IEFJbWFnZVJlYWRlcl9uZXcoa0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCwgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4SW1hZ2VzLCAmaW1nUmVhZGVyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoc3RhdHVzID09IEFNRURJQV9PSyk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKGltZ1JlYWRlcikgeworICAgICAgICAgICAgQUltYWdlUmVhZGVyX2RlbGV0ZShpbWdSZWFkZXIpOworICAgICAgICB9CisgICAgfQorICAgIEFJbWFnZVJlYWRlciAqaW1nUmVhZGVyID0gbnVsbHB0cjsKK307CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJQcml2YXRlRm9ybWF0VGVzdCwgQ3JlYXRlVGVzdCkgeworICAgIEVYUEVDVF9UUlVFKGltZ1JlYWRlciAhPSBudWxscHRyKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuY3BwIGIvbWVkaWEvdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5N2MzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KKyNpbmNsdWRlIDxoaWRsL0h5YnJpZEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWltZyB7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKKworc3RhdGljIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGNvbnZlcnROYXRpdmVIYW5kbGVUb0hHQlAgKAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgeworICAgIC8vIFJlYWQgdGhlIHNpemUgb2YgdGhlIGhhbFRva2VuIHZlYzx1aW50OF90PgorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhhbFRva2VuOworICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihjb25zdF9jYXN0PGludCAqPigmKGhhbmRsZS0+ZGF0YVsxXSkpKSwKKyAgICAgICAgaGFuZGxlLT5kYXRhWzBdKTsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0KKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y2FzdEZyb20ocmV0cmlldmVIYWxJbnRlcmZhY2UoaGFsVG9rZW4pKTsKKyAgICByZXR1cm4gaGdicDsKK30KKworc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gQUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlKAorICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSB7CisgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoaGFuZGxlLT5udW1GZHMgIT0gMCAgfHwKKyAgICAgICAgaGFuZGxlLT5udW1JbnRzIDwgc3RkOjpjZWlsKHNpemVvZihzaXplX3QpIC8gc2l6ZW9mKGludCkpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY29udmVydE5hdGl2ZUhhbmRsZVRvSEdCUChoYW5kbGUpOworfQorCit9IC8vbmFtZXNwYWNlIGFpbWcKK30gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggZDZkYWU1Yi4uYTExNjAyYiAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCkBAIC0xNiwyNSArMTYsMzkgQEAKICAgICBuYW1lOiAibGlibWVkaWF1dGlscyIsCiAKICAgICBzcmNzOiBbCisgICAgICAgICJBSW1hZ2VSZWFkZXJVdGlscy5jcHAiLAogICAgICAgICAiQmF0dGVyeU5vdGlmaWVyLmNwcCIsCiAgICAgICAgICJJU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwIiwKICAgICAgICAgIk1lbW9yeUxlYWtUcmFja1V0aWwuY3BwIiwKICAgICAgICAgIlByb2Nlc3NJbmZvLmNwcCIsCiAgICAgICAgICJTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAiLAorICAgICAgICAiU2VydmljZVV0aWxpdGllcy5jcHAiLAorICAgICAgICAiVGltZUNoZWNrLmNwcCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKICAgICBdLAogCisgICAgbG9ndGFnczogWyJFdmVudExvZ1RhZ3MubG9ndGFncyJdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2V4dHJhIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKKyAgICBwcm9kdWN0X3ZhcmlhYmxlczogeworICAgICAgICBwcm9kdWN0X2lzX2lvdDogeworICAgICAgICAgICAgY2ZsYWdzOiBbIi1EVEFSR0VUX0FORFJPSURfVEhJTkdTIl0sCisgICAgICAgIH0sCisgICAgfSwKKwogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjBlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncwpAQCAtMCwwICsxLDQxIEBACisjIFRoZSBlbnRyaWVzIGluIHRoaXMgZmlsZSBtYXAgYSBzcGFyc2Ugc2V0IG9mIGxvZyB0YWcgbnVtYmVycyB0byB0YWcgbmFtZXMuCisjIFRoaXMgaXMgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UsIGluIC9zeXN0ZW0vZXRjLCBhbmQgcGFyc2VkIGJ5IGxvZ2NhdC4KKyMKKyMgVGFnIG51bWJlcnMgYXJlIGRlY2ltYWwgaW50ZWdlcnMsIGZyb20gMCB0byAyXjMxLiAgKExldCdzIGxlYXZlIHRoZQorIyBuZWdhdGl2ZSB2YWx1ZXMgYWxvbmUgZm9yIG5vdy4pCisjCisjIFRhZyBuYW1lcyBhcmUgb25lIG9yIG1vcmUgQVNDSUkgbGV0dGVycyBhbmQgbnVtYmVycyBvciB1bmRlcnNjb3JlcywgaS5lLgorIyAiW0EtWl1bYS16XVswLTldXyIuICBEbyBub3QgaW5jbHVkZSBzcGFjZXMgb3IgcHVuY3R1YXRpb24gKHRoZSBmb3JtZXIKKyMgaW1wYWN0cyBsb2cgcmVhZGFiaWxpdHksIHRoZSBsYXR0ZXIgbWFrZXMgcmVnZXggc2VhcmNoZXMgbW9yZSBhbm5veWluZykuCisjCisjIFRhZyBudW1iZXJzIGFuZCBuYW1lcyBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuICBCbGFuayBsaW5lcyBhbmQgbGluZXMKKyMgc3RhcnRpbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuCisjCisjIE9wdGlvbmFsbHksIGFmdGVyIHRoZSB0YWcgbmFtZXMgY2FuIGJlIHB1dCBhIGRlc2NyaXB0aW9uIGZvciB0aGUgdmFsdWUocykKKyMgb2YgdGhlIHRhZy4gRGVzY3JpcHRpb24gYXJlIGluIHRoZSBmb3JtYXQKKyMgICAgKDxuYW1lPnxkYXRhIHR5cGVbfGRhdGEgdW5pdF0pCisjIE11bHRpcGxlIHZhbHVlcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KKyMKKyMgVGhlIGRhdGEgdHlwZSBpcyBhIG51bWJlciBmcm9tIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorIyAxOiBpbnQKKyMgMjogbG9uZworIyAzOiBzdHJpbmcKKyMgNDogbGlzdAorIworIyBUaGUgZGF0YSB1bml0IGlzIGEgbnVtYmVyIHRha2VuIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OgorIyAxOiBOdW1iZXIgb2Ygb2JqZWN0cworIyAyOiBOdW1iZXIgb2YgYnl0ZXMKKyMgMzogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcworIyA0OiBOdW1iZXIgb2YgYWxsb2NhdGlvbnMKKyMgNTogSWQKKyMgNjogUGVyY2VudAorIyBEZWZhdWx0IHZhbHVlIGZvciBkYXRhIG9mIHR5cGUgaW50L2xvbmcgaXMgMiAoYnl0ZXMpLgorIworIyBTZWUgc3lzdGVtL2NvcmUvbG9nY2F0L2V2ZW50LmxvZ3RhZ3MgZm9yIHRoZSBtYXN0ZXIgY29weSBvZiB0aGUgdGFncy4KKworIyA2MTAwMCAtIDYxMTk5IHJlc2VydmVkIGZvciBhdWRpb3NlcnZlcgorCis2MTAwMCBhdWRpb3NlcnZlcl9iaW5kZXJfdGltZW91dCAoY29tbWFuZHwzKQorCisjIE5PVEUgLSB0aGUgcmFuZ2UgMTAwMDAwMC0yMDAwMDAwIGlzIHJlc2VydmVkIGZvciBwYXJ0bmVycyBhbmQgb3RoZXJzIHdobworIyB3YW50IHRvIGRlZmluZSB0aGVpciBvd24gbG9nIHRhZ3Mgd2l0aG91dCBjb25mbGljdGluZyB3aXRoIHRoZSBjb3JlIHBsYXRmb3JtLgpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmIyNGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlNlcnZpY2VVdGlsaXRpZXMiCisKKyNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CisjaW5jbHVkZSAibWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgiCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8qIFdoZW4gcGVyZm9ybWluZyBwZXJtaXNzaW9uIGNoZWNrcyB3ZSBkbyBub3QgdXNlIHBlcm1pc3Npb24gY2FjaGUgZm9yCisgKiBydW50aW1lIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIGRhbmdlcm91cykgYXMgdGhleSBtYXkgY2hhbmdlIGF0CisgKiBydW50aW1lLiBBbGwgb3RoZXIgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgbm9ybWFsIGFuZCBkYW5nZXJvdXMpCisgKiBjYW4gYmUgY2FjaGVkIGFzIHRoZXkgbmV2ZXIgY2hhbmdlLiBPZiBjb3Vyc2UgYWxsIHBlcm1pc3Npb24gY2hlY2tlZAorICogaGVyZSBhcmUgcGxhdGZvcm0gZGVmaW5lZC4KKyAqLworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBTdHJpbmcxNiBzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbygiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOworCitzdGF0aWMgU3RyaW5nMTYgcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKFBlcm1pc3Npb25Db250cm9sbGVyJiBwZXJtaXNzaW9uQ29udHJvbGxlciwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgeworICAgIGlmIChvcFBhY2thZ2VOYW1lLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7CisgICAgfQorICAgIC8vIEluIHNvbWUgY2FzZXMgdGhlIGNhbGxpbmcgY29kZSBoYXMgbm8gYWNjZXNzIHRvIHRoZSBwYWNrYWdlIGl0IHJ1bnMgdW5kZXIuCisgICAgLy8gRm9yIGV4YW1wbGUsIGNvZGUgdXNpbmcgdGhlIHdpbGhlbG0gZnJhbWV3b3JrJ3MgT3BlblNMLUVTIEFQSXMuIEluIHRoaXMKKyAgICAvLyBjYXNlIHdlIHdpbGwgZ2V0IHRoZSBwYWNrYWdlcyBmb3IgdGhlIGNhbGxpbmcgVUlEIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUKKyAgICAvLyBmb3IgYXR0cmlidXRpbmcgdGhlIGFwcCBvcC4gVGhpcyB3aWxsIHdvcmsgY29ycmVjdGx5IGZvciBydW50aW1lIHBlcm1pc3Npb25zCisgICAgLy8gYXMgZm9yIGxlZ2FjeSBhcHBzIHdlIHdpbGwgdG9nZ2xlIHRoZSBhcHAgb3AgZm9yIGFsbCBwYWNrYWdlcyBpbiB0aGUgVUlELgorICAgIC8vIFRoZSBjYXZlYXQgaXMgdGhhdCB0aGUgb3BlcmF0aW9uIG1heSBiZSBhdHRyaWJ1dGVkIHRvIHRoZSB3cm9uZyBwYWNrYWdlIGFuZAorICAgIC8vIHN0YXRzIGJhc2VkIG9uIGFwcCBvcHMgbWF5IGJlIHNsaWdodGx5IG9mZi4KKyAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOworICAgIHBlcm1pc3Npb25Db250cm9sbGVyLmdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOworICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIk5vIHBhY2thZ2VzIGZvciB1aWQgJWQiLCB1aWQpOworICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsgLy8gZW1wdHkgc3RyaW5nCisgICAgfQorICAgIHJldHVybiBwYWNrYWdlc1swXTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLAorICAgICAgICB1aWRfdCB1aWQsIGJvb2wgc3RhcnQpIHsKKyAgICAvLyBPa2F5IHRvIG5vdCB0cmFjayBpbiBhcHAgb3BzIGFzIGF1ZGlvIHNlcnZlciBpcyB1cyBhbmQgaWYKKyAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuIHRydWU7CisKKyAgICAvLyBXZSBzcGVjaWZ5IGEgcGlkIGFuZCB1aWQgaGVyZSBhcyBtZWRpYXNlcnZlciAoYWthIE1lZGlhUmVjb3JkZXIgb3IgU3RhZ2VGcmlnaHRSZWNvcmRlcikKKyAgICAvLyBtYXkgb3BlbiBhIHJlY29yZCB0cmFjayBvbiBiZWhhbGYgb2YgYSBjbGllbnQuICBOb3RlIHRoYXQgcGlkIG1heSBiZSBhIHRpZC4KKyAgICAvLyBJTVBPUlRBTlQ6IERPTidUIFVTRSBQZXJtaXNzaW9uQ2FjaGUgLSBSVU5USU1FIFBFUk1JU1NJT05TIENIQU5HRS4KKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKKyAgICBjb25zdCBib29sIG9rID0gcGVybWlzc2lvbkNvbnRyb2xsZXIuY2hlY2tQZXJtaXNzaW9uKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvLCBwaWQsIHVpZCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyAlcyIsIFN0cmluZzgoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nMTYgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lID0gcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKAorICAgICAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIsIG9wUGFja2FnZU5hbWUsIHVpZCk7CisgICAgaWYgKHJlc29sdmVkT3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQXBwT3BzTWFuYWdlciBhcHBPcHM7CisgICAgY29uc3QgaW50MzJfdCBvcCA9IGFwcE9wcy5wZXJtaXNzaW9uVG9PcENvZGUoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pOworICAgIGlmIChzdGFydCkgeworICAgICAgICBpZiAoYXBwT3BzLnN0YXJ0T3BOb1Rocm93KG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSwgLypzdGFydElmTW9kZURlZmF1bHQqLyBmYWxzZSkKKyAgICAgICAgICAgICAgICAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFwcE9wcy5jaGVja09wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSkgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CisgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyBmYWxzZSk7Cit9CisKK2Jvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gdHJ1ZSk7Cit9CisKK3ZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKKyAgICAvLyBPa2F5IHRvIG5vdCB0cmFjayBpbiBhcHAgb3BzIGFzIGF1ZGlvIHNlcnZlciBpcyB1cyBhbmQgaWYKKyAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuOworCisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7CisgICAgU3RyaW5nMTYgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lID0gcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKAorICAgICAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIsIG9wUGFja2FnZU5hbWUsIHVpZCk7CisgICAgaWYgKHJlc29sdmVkT3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQXBwT3BzTWFuYWdlciBhcHBPcHM7CisgICAgY29uc3QgaW50MzJfdCBvcCA9IGFwcE9wcy5wZXJtaXNzaW9uVG9PcENvZGUoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pOworICAgIGFwcE9wcy5maW5pc2hPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpOworfQorCitib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVBdWRpb091dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7CisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQsIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgLy8gQ0FQVFVSRV9BVURJT19IT1RXT1JEIHBlcm1pc3Npb24gaW1wbGllcyBSRUNPUkRfQVVESU8gcGVybWlzc2lvbgorICAgIGJvb2wgb2sgPSByZWNvcmRpbmdBbGxvd2VkKFN0cmluZzE2KCIiKSwgcGlkLCB1aWQpOworCisgICAgaWYgKG9rKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CisgICAgICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOworICAgIH0KKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBzZXR0aW5nc0FsbG93ZWQoKSB7CisgICAgLy8gZ2l2ZW4gdGhpcyBpcyBhIHBlcm1pc3Npb24gY2hlY2ssIGNvdWxkIHRoaXMgYmUgaXNBdWRpb1NlcnZlck9yUm9vdFVpZCgpPworICAgIGlmIChpc0F1ZGlvU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHJldHVybiB0cnVlOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQXVkaW9TZXR0aW5ncygiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQXVkaW9TZXR0aW5ncyk7CisgICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIG1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoCisgICAgICAgICAgICAiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKTsKKworI2lmZGVmIFRBUkdFVF9BTkRST0lEX1RISU5HUworICAgIGlmICghb2spIHsKKyAgICAgICAgLy8gVXNlIGEgc2Vjb25kYXJ5IHBlcm1pc3Npb24gb24gQW5kcm9pZCBUaGluZ3MgdG8gYWxsb3cgYSBtb3JlIGxlbmllbnQgbGV2ZWwgb2YgcHJvdGVjdGlvbi4KKyAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQW5kcm9pZFRoaW5nc0FsbG93ZWQoCisgICAgICAgICAgICAgICAgImNvbS5nb29nbGUuYW5kcm9pZC50aGluZ3MucGVybWlzc2lvbi5NT0RJRllfREVGQVVMVF9BVURJT19FRkZFQ1RTIik7CisgICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQW5kcm9pZFRoaW5nc0FsbG93ZWQpOworICAgIH0KKyAgICBpZiAoIW9rKSBBTE9HRSgiY29tLmdvb2dsZS5hbmRyb2lkLnRoaW5ncy5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyNlbHNlCisgICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfREVGQVVMVF9BVURJT19FRkZFQ1RTIik7CisjZW5kaWYKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgZHVtcEFsbG93ZWQoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCk7CisgICAgLy8gY29udmVudGlvbiBpcyBmb3IgY2FsbGVyIHRvIGR1bXAgYW4gZXJyb3IgbWVzc2FnZSB0byBmZCBpbnN0ZWFkIG9mIGxvZ2dpbmcgaGVyZQorICAgIC8vaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeVBob25lU3RhdGUoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7CisgICAgcmV0dXJuIG9rOworfQorCitzdGF0dXNfdCBjaGVja0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpCit7CisgICAgaWYgKGlNZW1vcnkgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXMgY2hlY2sgZmFpbGVkOiBOVUxMIElNZW1vcnkgcG9pbnRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBpTWVtb3J5LT5nZXRNZW1vcnkoKTsKKyAgICBpZiAoaGVhcCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBjaGVjayBmYWlsZWQ6IE5VTEwgaGVhcCBwb2ludGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBvZmZfdCBzaXplID0gbHNlZWsoaGVhcC0+Z2V0SGVhcElEKCksIDAsIFNFRUtfRU5EKTsKKyAgICBsc2VlayhoZWFwLT5nZXRIZWFwSUQoKSwgMCwgU0VFS19TRVQpOworCisgICAgaWYgKGlNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMIHx8IHNpemUgPCAob2ZmX3QpaU1lbW9yeS0+c2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjaGVjayBmYWlsZWQ6IHBvaW50ZXIgJXAgc2l6ZSAlenUgZmQgc2l6ZSAldSIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaU1lbW9yeS0+cG9pbnRlcigpLCBpTWVtb3J5LT5zaXplKCksICh1aW50MzJfdClzaXplKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3NwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IE1lZGlhUGFja2FnZU1hbmFnZXI6OnJldHJlaXZlUGFja2FnZU1hbmFnZXIoKSB7CisgICAgY29uc3Qgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIGlmIChzbSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogZmFpbGVkIHRvIHJldHJpZXZlIGRlZmF1bHRTZXJ2aWNlTWFuYWdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNwPElCaW5kZXI+IHBhY2thZ2VNYW5hZ2VyID0gc20tPmNoZWNrU2VydmljZShTdHJpbmcxNihuYXRpdmVQYWNrYWdlTWFuYWdlck5hbWUpKTsKKyAgICBpZiAocGFja2FnZU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IGZhaWxlZCB0byByZXRyaWV2ZSBuYXRpdmUgcGFja2FnZSBtYW5hZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+KHBhY2thZ2VNYW5hZ2VyKTsKK30KKworc3RkOjpvcHRpb25hbDxib29sPiBNZWRpYVBhY2thZ2VNYW5hZ2VyOjpkb0lzQWxsb3dlZCh1aWRfdCB1aWQpIHsKKyAgICBpZiAobVBhY2thZ2VNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgLyoqIENhbiBub3QgZmV0Y2ggcGFja2FnZSBtYW5hZ2VyIGF0IGNvbnN0cnVjdGlvbiBpdCBtYXkgbm90IHlldCBiZSByZWdpc3RlcmVkLiAqLworICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSByZXRyZWl2ZVBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGlmIChtUGFja2FnZU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1coIiVzOiBQbGF5YmFjayBjYXB0dXJlIGlzIGRlbmllZCBhcyBwYWNrYWdlIG1hbmFnZXIgaXMgbm90IHJlYWNoYWJsZSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFja2FnZU5hbWVzOworICAgIGF1dG8gc3RhdHVzID0gbVBhY2thZ2VNYW5hZ2VyLT5nZXROYW1lc0ZvclVpZHMoeyhpbnQzMl90KXVpZH0sICZwYWNrYWdlTmFtZXMpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGZvciB1aWQgJXUgYXMgdGhlIHBhY2thZ2UgbmFtZXMgY291bGQgbm90IGJlICIKKyAgICAgICAgICAgICAgInJldHJpZXZlZCBmcm9tIHRoZSBwYWNrYWdlIG1hbmFnZXI6ICVzIiwgX19mdW5jX18sIHVpZCwgc3RhdHVzLnRvU3RyaW5nOCgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKyAgICBpZiAocGFja2FnZU5hbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBQbGF5YmFjayBjYXB0dXJlIGZvciB1aWQgJXUgaXMgZGVuaWVkIGFzIG5vIHBhY2thZ2UgbmFtZSBjb3VsZCBiZSByZXRyaWV2ZWQgIgorICAgICAgICAgICAgICAiZnJvbSB0aGUgcGFja2FnZSBtYW5hZ2VyOiAlcyIsIF9fZnVuY19fLCB1aWQsIHN0YXR1cy50b1N0cmluZzgoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gaXNBbGxvd2VkOworICAgIHN0YXR1cyA9IG1QYWNrYWdlTWFuYWdlci0+aXNBdWRpb1BsYXliYWNrQ2FwdHVyZUFsbG93ZWQocGFja2FnZU5hbWVzLCAmaXNBbGxvd2VkKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBQbGF5YmFjayBjYXB0dXJlIGlzIGRlbmllZCBmb3IgdWlkICV1IGFzIHRoZSBtYW5pZmVzdCBwcm9wZXJ0eSBjb3VsZCBub3QgYmUgIgorICAgICAgICAgICAgICAicmV0cmlldmVkIGZyb20gdGhlIHBhY2thZ2UgbWFuYWdlcjogJXMiLCBfX2Z1bmNfXywgdWlkLCBzdGF0dXMudG9TdHJpbmc4KCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIGlmIChwYWNrYWdlTmFtZXMuc2l6ZSgpICE9IGlzQWxsb3dlZC5zaXplKCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBQbGF5YmFjayBjYXB0dXJlIGlzIGRlbmllZCBmb3IgdWlkICV1IGFzIHRoZSBwYWNrYWdlIG1hbmFnZXIgcmV0dXJuZWQgaW5jb2hlcmVudCIKKyAgICAgICAgICAgICAgIiByZXNwb25zZSBzaXplOiAlenUgIT0gJXp1IiwgX19mdW5jX18sIHVpZCwgcGFja2FnZU5hbWVzLnNpemUoKSwgaXNBbGxvd2VkLnNpemUoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorCisgICAgLy8gWmlwIHRvZ2V0aGVyIHBhY2thZ2VOYW1lcyBhbmQgaXNBbGxvd2VkIGZvciBkZWJ1ZyBsb2dzCisgICAgUGFja2FnZXMmIHBhY2thZ2VzID0gbURlYnVnTG9nW3VpZF07CisgICAgcGFja2FnZXMucmVzaXplKHBhY2thZ2VOYW1lcy5zaXplKCkpOyAvLyBSZXVzZSBhbGwgb2JqZWN0cworICAgIHN0ZDo6dHJhbnNmb3JtKGJlZ2luKHBhY2thZ2VOYW1lcyksIGVuZChwYWNrYWdlTmFtZXMpLCBiZWdpbihpc0FsbG93ZWQpLAorICAgICAgICAgICAgICAgICAgIGJlZ2luKHBhY2thZ2VzKSwgW10gKGF1dG8mIG5hbWUsIGJvb2wgaXNBbGxvd2VkKSAtPiBQYWNrYWdlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtzdGQ6Om1vdmUobmFtZSksIGlzQWxsb3dlZH07CisgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAvLyBPbmx5IGFsbG93IHBsYXliYWNrIHJlY29yZCBpZiBhbGwgcGFja2FnZXMgaW4gdGhpcyBVSUQgYWxsb3cgaXQKKyAgICBib29sIHBsYXliYWNrQ2FwdHVyZUFsbG93ZWQgPSBzdGQ6OmFsbF9vZihiZWdpbihpc0FsbG93ZWQpLCBlbmQoaXNBbGxvd2VkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYm9vbCBiKSB7IHJldHVybiBiOyB9KTsKKworICAgIHJldHVybiBwbGF5YmFja0NhcHR1cmVBbGxvd2VkOworfQorCit2b2lkIE1lZGlhUGFja2FnZU1hbmFnZXI6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdCB7CisgICAgZHByaW50ZihmZCwgIiUqc0FsbG93IHBsYXliYWNrIGNhcHR1cmUgbG9nOlxuIiwgc3BhY2VzLCAiIik7CisgICAgaWYgKG1QYWNrYWdlTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIGRwcmludGYoZmQsICIlKnNObyBwYWNrYWdlIG1hbmFnZXJcbiIsIHNwYWNlcyArIDIsICIiKTsKKyAgICB9CisgICAgZHByaW50ZihmZCwgIiUqc1BhY2thZ2UgbWFuYWdlciBlcnJvcnM6ICV1XG4iLCBzcGFjZXMgKyAyLCAiIiwgbVBhY2thZ2VNYW5hZ2VyRXJyb3JzKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgdWlkQ2FjaGUgOiBtRGVidWdMb2cpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYWNrYWdlIDogc3RkOjpnZXQ8UGFja2FnZXM+KHVpZENhY2hlKSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIiUqcy0gdWlkPSU1dSwgYWxsb3dQbGF5YmFja0NhcHR1cmU9JXMsIHBhY2thZ2VOYW1lPSVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8Y29uc3QgdWlkX3Q+KHVpZENhY2hlKSwKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5wbGF5YmFja0NhcHR1cmVBbGxvd2VkID8gInRydWUgIiA6ICJmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UubmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcCBiL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljZjRlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgorI2luY2x1ZGUgPG1lZGlhL0V2ZW50TG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogc3RhdGljICovCitzcDxUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZD4gVGltZUNoZWNrOjpnZXRUaW1lQ2hlY2tUaHJlYWQoKQoreworICAgIHN0YXRpYyBzcDxUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZD4gc1RpbWVDaGVja1RocmVhZCA9IG5ldyBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZCgpOworICAgIHJldHVybiBzVGltZUNoZWNrVGhyZWFkOworfQorCitUaW1lQ2hlY2s6OlRpbWVDaGVjayhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykKKyAgICA6IG1FbmRUaW1lTnMoZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0YXJ0TW9uaXRvcmluZyh0YWcsIHRpbWVvdXRNcykpCit7Cit9CisKK1RpbWVDaGVjazo6flRpbWVDaGVjaygpIHsKKyAgICBnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RvcE1vbml0b3JpbmcobUVuZFRpbWVOcyk7Cit9CisKK1RpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp+VGltZUNoZWNrVGhyZWFkKCkKK3sKKyAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICByZXF1ZXN0RXhpdCgpOworICAgIG1Nb25pdG9yUmVxdWVzdHMuY2xlYXIoKTsKKyAgICBtQ29uZC5zaWduYWwoKTsKK30KKworbnNlY3NfdCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RhcnRNb25pdG9yaW5nKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtaWxsaXNlY29uZHModGltZW91dE1zKTsKKyAgICBmb3IgKDsgbU1vbml0b3JSZXF1ZXN0cy5pbmRleE9mS2V5KGVuZFRpbWVOcykgPj0gMDsgKytlbmRUaW1lTnMpOworICAgIG1Nb25pdG9yUmVxdWVzdHMuYWRkKGVuZFRpbWVOcywgdGFnKTsKKyAgICBtQ29uZC5zaWduYWwoKTsKKyAgICByZXR1cm4gZW5kVGltZU5zOworfQorCit2b2lkIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdG9wTW9uaXRvcmluZyhuc2Vjc190IGVuZFRpbWVOcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOworICAgIG1Nb25pdG9yUmVxdWVzdHMucmVtb3ZlSXRlbShlbmRUaW1lTnMpOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCitib29sIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBUSU1FRF9PVVQ7CisgICAgY29uc3QgY2hhciAqdGFnOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisKKyAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG5zZWNzX3QgZW5kVGltZU5zID0gSU5UNjRfTUFYOworICAgICAgICAvLyBLZXllZFZlY3RvciBtTW9uaXRvclJlcXVlc3RzIGlzIG9yZGVyZWQgc28gdGFrZSBmaXJzdCBlbnRyeSBhcyBuZXh0IHRpbWVvdXQKKyAgICAgICAgaWYgKG1Nb25pdG9yUmVxdWVzdHMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIGVuZFRpbWVOcyA9IG1Nb25pdG9yUmVxdWVzdHMua2V5QXQoMCk7CisgICAgICAgICAgICB0YWcgPSBtTW9uaXRvclJlcXVlc3RzLnZhbHVlQXQoMCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBuc2Vjc190IHdhaXRUaW1lTnMgPSBlbmRUaW1lTnMgLSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGlmICh3YWl0VGltZU5zID4gMCkgeworICAgICAgICAgICAgc3RhdHVzID0gbUNvbmQud2FpdFJlbGF0aXZlKG1NdXRleCwgd2FpdFRpbWVOcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dfRVZFTlRfU1RSSU5HKExPR1RBR19BVURJT19CSU5ERVJfVElNRU9VVCwgdGFnKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVGltZUNoZWNrIHRpbWVvdXQgZm9yICVzIiwgdGFnKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YmRlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBSU1BR0VfUkVBREVSX1VUSUxTX0gKKyNkZWZpbmUgQUlNQUdFX1JFQURFUl9VVElMU19ICisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpbWcgeworCit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworLy8gUmV0cmlldmVzIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgY29ycmVzcG9uZGluZyB0byB0aGUgbmF0aXZlX2hhbmRsZV90CisvLyBwcm92aWRlZCAodGhpcyBuYXRpdmUgaGFuZGxlIE1VU1QgaGF2ZSBiZWVuIG9idGFpbmVkIGJ5IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUoKSkuCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpOworCit9Ly8gbmFtZXNwYWNlIGFpbWcKK30vLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BSU1BR0VfUkVBREVSX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0V2ZW50TG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzZDNiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX0FVRElPX0VWRU5UX0xPR19IXworI2RlZmluZSBBTkRST0lEX0FVRElPX0VWRU5UX0xPR19IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGtlZXAgdmFsdWVzIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2F2L21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCitlbnVtIHsKKyAgTE9HVEFHX0FVRElPX0JJTkRFUl9USU1FT1VUID0gNjEwMDAsCit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRVZFTlRfTE9HX0hfCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDM3MGVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQVVUSUxTX1NFUlZJQ0VVVElMSVRJRVNfSAorI2RlZmluZSBBTkRST0lEX01FRElBVVRJTFNfU0VSVklDRVVUSUxJVElFU19ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXJOYXRpdmUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ29udHJvbGxlci5oPgorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEF1ZGlvIHBlcm1pc3Npb24gdXRpbGl0aWVzCisKKy8vIFVzZWQgZm9yIGNhbGxzIHRoYXQgc2hvdWxkIG9yaWdpbmF0ZSBmcm9tIHN5c3RlbSBzZXJ2aWNlcy4KKy8vIFdlIGFsbG93IHRoYXQgc29tZSBzZXJ2aWNlcyBtaWdodCBoYXZlIHNlcGFyYXRlIHByb2Nlc3NlcyB0bworLy8gaGFuZGxlIG11bHRpcGxlIHVzZXJzLCBlLmcuIHUxMF9zeXN0ZW0sIHUxMF9ibHVldG9vdGgsIHUxMF9yYWRpby4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1NlcnZpY2VVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIG11bHRpdXNlcl9nZXRfYXBwX2lkKHVpZCkgPCBBSURfQVBQX1NUQVJUOworfQorCisvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBvcmlnaW5hdGUgZnJvbSBhdWRpb3NlcnZlci4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyVWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiB1aWQgPT0gQUlEX0FVRElPU0VSVkVSOworfQorCisvLyBVc2VkIGZvciBzb21lIHBlcm1pc3Npb24gY2hlY2tzLgorLy8gQUlEX1JPT1QgaXMgT0sgZm9yIGNvbW1hbmQtbGluZSB0ZXN0cy4gIE5hdGl2ZSBhdWRpb3NlcnZlciBhbHdheXMgT0suCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gdWlkID09IEFJRF9BVURJT1NFUlZFUiB8fCB1aWQgPT0gQUlEX1JPT1Q7Cit9CisKKy8vIFVzZWQgZm9yIGNhbGxzIHRoYXQgc2hvdWxkIGNvbWUgZnJvbSBzeXN0ZW0gc2VydmVyIG9yIGludGVybmFsLgorLy8gTm90ZTogc3lzdGVtIHNlcnZlciBpcyBtdWx0aXByb2Nlc3MgZm9yIG11bHRpcGxlIHVzZXJzLiAgYXVkaW9zZXJ2ZXIgaXMgbm90Lgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclN5c3RlbVNlcnZlclVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA9PSBBSURfU1lTVEVNIHx8IHVpZCA9PSBBSURfQVVESU9TRVJWRVI7Cit9CisKKy8vIE1lZGlhc2VydmVyIG1heSBmb3J3YXJkIHRoZSBjbGllbnQgUElEIGFuZCBVSUQgYXMgcGFydCBvZiBhIGJpbmRlciBpbnRlcmZhY2UgY2FsbDsKKy8vIG90aGVyd2lzZSB0aGUgY2FsbGluZyBVSUQgbXVzdCBiZSBlcXVhbCB0byB0aGUgY2xpZW50IFVJRC4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZCh1aWRfdCB1aWQpIHsKKyAgICBzd2l0Y2ggKHVpZCkgeworICAgIGNhc2UgQUlEX01FRElBOgorICAgIGNhc2UgQUlEX0FVRElPU0VSVkVSOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK3ZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpOworYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgc2V0dGluZ3NBbGxvd2VkKCk7Citib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKTsKK2Jvb2wgZHVtcEFsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworc3RhdHVzX3QgY2hlY2tJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KTsKKworY2xhc3MgTWVkaWFQYWNrYWdlTWFuYWdlciB7CitwdWJsaWM6CisgICAgLyoqIFF1ZXJ5IHRoZSBQYWNrYWdlTWFuYWdlciB0byBjaGVjayBpZiBhbGwgYXBwcyBvZiBhbiBVSUQgYWxsb3cgcGxheWJhY2sgY2FwdHVyZS4gKi8KKyAgICBib29sIGFsbG93UGxheWJhY2tDYXB0dXJlKHVpZF90IHVpZCkgeworICAgICAgICBhdXRvIHJlc3VsdCA9IGRvSXNBbGxvd2VkKHVpZCk7CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBtUGFja2FnZU1hbmFnZXJFcnJvcnMrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKGZhbHNlKTsKKyAgICB9CisgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIG5hdGl2ZVBhY2thZ2VNYW5hZ2VyTmFtZSA9ICJwYWNrYWdlX25hdGl2ZSI7CisgICAgc3RkOjpvcHRpb25hbDxib29sPiBkb0lzQWxsb3dlZCh1aWRfdCB1aWQpOworICAgIHNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IHJldHJlaXZlUGFja2FnZU1hbmFnZXIoKTsKKyAgICBzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBtUGFja2FnZU1hbmFnZXI7IC8vIFRvIGNoZWNrIGFwcHMgbWFuaWZlc3QKKyAgICB1aW50X3QgbVBhY2thZ2VNYW5hZ2VyRXJyb3JzID0gMDsKKyAgICBzdHJ1Y3QgUGFja2FnZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIGJvb2wgcGxheWJhY2tDYXB0dXJlQWxsb3dlZCA9IGZhbHNlOworICAgIH07CisgICAgdXNpbmcgUGFja2FnZXMgPSBzdGQ6OnZlY3RvcjxQYWNrYWdlPjsKKyAgICBzdGQ6Om1hcDx1aWRfdCwgUGFja2FnZXM+IG1EZWJ1Z0xvZzsKK307Cit9CisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBVVRJTFNfU0VSVklDRVVUSUxJVElFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCnJlbmFtZSB0byBtZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjlkYzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBwYWNrYWdlIGlzIGV4Y2x1ZGVkIGZyb20gYnVpbGQgZm9yIG5vdyBzaW5jZSBBUElzIHVzaW5nIHRoaXMgYXBrIGJlY2FtZSBoaWRkZW4uCi0jCi0jTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotI2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLHRydWUpICMgQnVpbGQgTWVkaWFDb21wb25lbnRzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBQREsgYnVpbGQuICBNZWRpYUNvbXBvbmVudHMgd29uJ3QKLSMjIGJ1aWxkIGluIFBESyBidWlsZHMgYmVjYXVzZSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhIGlzIG5vdCBhdmFpbGFibGUgYnV0Ci0jIyBJTWVkaWFTZXNzaW9uMi5haWRsIGFuZCBJTWVkaWFDb250cm9sbGVyMi5haWRsIGFyZSB1c2luZyBjbGFzc2VzIGZyb20KLSMjIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEuCi0jCi0jaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0jCi0jTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50cwotI0xPQ0FMX01PRFVMRV9PV05FUiA6PSBnb29nbGUKLSMKLSMjIFRPRE86IGNyZWF0ZSBhIHNlcGFyYXRlIGtleSBmb3IgdGhpcyBwYWNrYWdlLgotI0xPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCi0jCi0jIyBUT0RPOiBVc2UgU3lzdGVtIFNESyBvbmNlIHB1YmxpYyBBUElzIGFyZSBhcHByb3ZlZAotIyMgTE9DQUxfU0RLX1ZFUlNJT04gOj0gc3lzdGVtX2N1cnJlbnQKLSNMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQotIwotI0xPQ0FMX1NSQ19GSUxFUyA6PSBcCi0jICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCi0jICAgICQoY2FsbCBhbGwtSWFpZGwtZmlsZXMtdW5kZXIsIHNyYykKLSMKLSNMT0NBTF9QUk9HVUFSRF9GTEFHX0ZJTEVTIDo9IHByb2d1YXJkLmNmZwotIwotI0xPQ0FMX01VTFRJTElCIDo9IGZpcnN0Ci0jCi0jTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC1zdXBwb3J0LWFubm90YXRpb25zCi0jCi0jIyBUbyBlbWJlZCBuYXRpdmUgbGlicmFyaWVzIGluIHBhY2thZ2UsIHVuY29tbWVudCB0aGUgbGluZXMgYmVsb3cuCi0jI0xPQ0FMX01PRFVMRV9UQUdTIDo9IHNhbXBsZXMKLSMjTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotIyMgICAgbGliYWFjZXh0cmFjdG9yIFwKLSMjICAgIGxpYmFtcmV4dHJhY3RvciBcCi0jIyAgICBsaWJmbGFjZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1pZGlleHRyYWN0b3IgXAotIyMgICAgbGlibWt2ZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1wM2V4dHJhY3RvciBcCi0jIyAgICBsaWJtcDRleHRyYWN0b3IgXAotIyMgICAgbGlibXBlZzJleHRyYWN0b3IgXAotIyMgICAgbGlib2dnZXh0cmFjdG9yIFwKLSMjICAgIGxpYndhdmV4dHJhY3RvciBcCi0jCi0jIyBUT0RPOiBSZW1vdmUgZGVwZW5kZW5jeSB3aXRoIG90aGVyIHN1cHBvcnQgbGlicmFyaWVzLgotI0xPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyArPSBcCi0jICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCi0jICAgIGFuZHJvaWQtc3VwcG9ydC12Ny1hcHBjb21wYXQgXAotIyAgICBhbmRyb2lkLXN1cHBvcnQtdjctcGFsZXR0ZQotI0xPQ0FMX1VTRV9BQVBUMiA6PSB0cnVlCi0jCi0jaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0jCi0jZW5kaWYgICMgaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksdHJ1ZSkKLSMKLSNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZkY2ExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgotICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiCi0gICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIiA+Ci0KLSAgICA8YXBwbGljYXRpb24KLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWEgQ29tcG9uZW50cyBVcGRhdGUiCi0gICAgICAgIGFuZHJvaWQ6bXVsdGlBcmNoPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpoYXNDb2RlPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpleHRyYWN0TmF0aXZlTGlicz0iZmFsc2UiPgotICAgIDwvYXBwbGljYXRpb24+Ci0KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZjczMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIEtlZXAgZW50cnkgcG9pbnQgZm9yIHVwZGF0YWJsZSBKYXZhIGNsYXNzZXMKLS1rZWVwIHB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpRmFjdG9yeSB7Ci0gICBwdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlGYWN0b3J5IGluaXRpYWxpemUoYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZkNTFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M4MjUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhkZGVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTljZDc1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTkyYWQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjcwN2VhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzMyZDAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ1ZWUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWQzNDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNmI2NWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTRmNjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZmViZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkMzA1ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3ZmRlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzlkZjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzM0NGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMDM0MjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyM2U0NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGMyNWEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmRiOWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQ2YzEwOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzYmY0ODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5MTFiNWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NGVkNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjdlMGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTU4YTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTFhODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWFlZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDY4ZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzc3N2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDg3OTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkMmM5Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwMmFiNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1NGY2MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhmZWJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ2ZWE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDc5MGM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwMWRjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0ZDU4Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiYjc3Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NjOTg0NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyNjE3ZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlZmVmM2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTAwNDdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E1ZDZhMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEzNDMxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM4OTlmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc4ZTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTkyZmM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg4NGU2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBhYzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTIxMDRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVjMDYyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJkNDk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzkzMzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzVhNmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkZDIxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3YmRjZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZlNTc2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTVkNmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWRmYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWZlMGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjNDhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZTkxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQyMThhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjMwZmFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWE5MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTJmMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4NzFlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1N2Y2My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQxYjAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJiNjk0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTEwMTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzUyYzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MzJlOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2YmEzMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmEzYjVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRiYjIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTYxMjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTdhOWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmNjMzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MTgxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZhNTNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzA1ZGNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTRlYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjcyNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzYjQxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxOGFiZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTgxMTMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODBiMTkxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWJhM2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzRkNWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5NTdiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkMzg0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGM2Mjk3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGFiNjg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTdmNzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTNjYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhZWNkZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZDBiNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDBiZTNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRmMWJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMThiNDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YzJjMDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmYWU0NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0YzI4OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWY5MzI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWUxZjY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmZhZmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMmJkODcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczYTFmOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjMTA2OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjJiODAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZiYTAyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2YyZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjU0NzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5NWFmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwYjdmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTU3Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ZDZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFkZmEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmZTBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzQ4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWU5MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0MjE4YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMGZhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FhOTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyZjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODcxZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTdmNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MWIwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiYjY5NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUxMDEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzM1MmMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTMyZTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmJhMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhM2I1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YmIyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzU3MGY0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE0MDNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDRiZmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDYwNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwZDU1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiYzQ4ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQ4ZjhlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI5MGU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjM0YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDQ1MmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxY2Y1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMDhiNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmViM2YxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlOGIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMGZjMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTE2YWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1OThjYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2ZDE2ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDcwNDU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTZkYjEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMzgyOGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhY2NjNzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4Y2VkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwMWI5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMxZGQzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY3OGU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzJjZGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzViZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhZDBkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhNTkyMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg3ZTI1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA2ZGI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjI1YmEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Njk3ZGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3ZWMyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NDBiZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ1ZTNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM3YzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGRjMTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ2MTdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzMDc3My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1ZDdkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzOGQ1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQwMzQ5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2N2M0NjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmY2ViZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTMyYTdhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDYyY2EzNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzEzMTI1Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTMxZTFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTk0NmEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODVlODdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWI0NDAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWE3ZTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYzNTM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ1YzNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGEzYmE1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNWNhMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzE4M2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjc5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjA1MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgzOTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MzY2FmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDQ0Y2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDYzNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZDFkYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlNzEwOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY1OTZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjhlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjBkZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlMzllNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYzE1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFlYmFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE2YTRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjkxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjY2ZjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlYTM0Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyZGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjFhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRiY2MwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjZiMzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NWE4ZmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlYjEzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhMmI2MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjgwYWE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVlZmU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGNjMzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWU2ZmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MTZjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0MjkzMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ1YjdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNhMGZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMmE2NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGViYzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlNzhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzZjk5MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ZhZDllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRkOGQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MGZkNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGI1YzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMWVmMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3MTBkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjFjMDgwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTZiMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZThmZTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiODQwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyNDA1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWMxOGMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk3NTNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjkxYjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWM2MTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNGE3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlMGE2MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IxZjNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzU1MWVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODY2N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjgxODMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5M2YxOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1ZTE1Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjY3OWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzYwNTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MzkxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjM2NhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0NGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2Mzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmQxZGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTcxMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNTk2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY4ZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIwZGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTM5ZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGMxNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZWJhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhNmE0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI5MWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2NmY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWEzNGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmRlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YmNjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmZmYTAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY3ZTU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWM0ZGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYTg2ZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwMTA5MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5NmYwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTkwMDFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcxNTgxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTYyMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjk1MDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlMWJkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlOGYxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMyZTk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ1ZDJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGQ1MjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NjFhZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhM2Y4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkMTY2Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU1MjdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWIyYThlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzdhZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjMxZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkOWY1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4ZWI3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmEwZTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQyNWUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzZlMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMmYxZWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmZGNkZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlOWI4MTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5ZTQ0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5Y2E4OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmM3NWQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2JkMjdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYmIwYWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTE0YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3ZmU1Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiMmMxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NzllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2MDUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiMjEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlN2UzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjAxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTI4ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MmZkNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxNzFhOGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGNiNmNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Yzg4NjNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTMzNTAzOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YTQ4NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjYTY3ODcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzA1ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM5NWQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhNzI4Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjBmNTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE4MGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjMzkzOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDI1MzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTIyOGY0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0Mjc3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjViZmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M1ZDZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmNGFkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzA2NDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTkzMjRlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2MThmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ3NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ3NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGI0ZTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNWYwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWM3NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTVjN2ZhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyODdlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2QwY2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWZhNzJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1MGVlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDQzNTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg3N2MzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyN2YwYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjE5YmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjU5MjFlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiNzZiMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzA1ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhOTUyNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzMxYTZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxsYXllci1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2JhY2tncm91bmQiPgotICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzI2MDAwMDAwIiAvPgotICAgICAgICA8L3NoYXBlPgotICAgIDwvaXRlbT4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9zZWNvbmRhcnlQcm9ncmVzcyI+Ci0gICAgICAgIDxjbGlwPgotICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjNUNmZmZmZmYiIC8+Ci0gICAgICAgICAgICA8L3NoYXBlPgotICAgICAgICA8L2NsaXA+Ci0gICAgPC9pdGVtPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3Byb2dyZXNzIj4KLSAgICAgICAgPGNsaXA+Ci0gICAgICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiNmZmZmZmYiIC8+Ci0gICAgICAgICAgICA8L3NoYXBlPgotICAgICAgICA8L2NsaXA+Ci0gICAgPC9pdGVtPgotPC9sYXllci1saXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzNTk3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2hhcGU9Im92YWwiID4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iI2ZmZmZmZiIgLz4KLSAgICA8c2l6ZQotICAgICAgICBhbmRyb2lkOmhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1ZjcxZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTIwLDExSDcuODNsNS41OSwtNS41OUwxMiw0bC04LDggOCw4IDEuNDEsLTEuNDFMNy44MywxM0gyMHYtMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyMjhlNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksMTJoLTJ2M2gtM3YyaDV2LTV6TTcsOWgzTDEwLDdMNSw3djVoMkw3LDl6TTIxLDNMMywzYy0xLjEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjksMiAyLDJoMThjMS4xLDAgMiwtMC45IDIsLTJMMjMsNWMwLC0xLjEgLTAuOSwtMiAtMiwtMnpNMjEsMTkuMDFMMywxOS4wMUwzLDQuOTloMTh2MTQuMDJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMTJiNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDN2OS4yOGMtMC40NywtMC4xNyAtMC45NywtMC4yOCAtMS41LC0wLjI4QzguMDEsMTIgNiwxNC4wMSA2LDE2LjVTOC4wMSwyMSAxMC41LDIxYzIuMzEsMCA0LjIsLTEuNzUgNC40NSwtNEgxNVY2aDRWM2gtN3oiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmNzIwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTkgMTYuMkw0LjggMTJsLTEuNCAxLjRMOSAxOSAyMSA3bC0xLjQtMS40TDkgMTYuMnoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzZkMTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE1LjQxLDcuNDFMMTQsNmwtNiw2IDYsNiAxLjQxLC0xLjQxTDEwLjgzLDEyeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMmNlMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMCw2TDguNTksNy40MSAxMy4xNywxMmwtNC41OCw0LjU5TDEwLDE4bDYsLTZ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZTY0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjUxMmRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSI1MTJkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjUxMiIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSI1MTIiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiM2MTYxNjEiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0gMCAwIEggNTEyIFYgNTEyIEggMCBWIDAgWiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzUyNTI1MiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTI1NiwxNTF2MTIzLjE0Yy02Ljg4LTQuMDItMTQuODItNi40OC0yMy4zMy02LjQ4IGMtMjUuNzgsMC00Ni42NywyMC44OC00Ni42Nyw0Ni42N2MwLDI1Ljc4LDIwLjg4LDQ2LjY3LDQ2LjY3LDQ2LjY3czQ2LjY3LTIwLjg4LDQ2LjY3LTQ2LjY3VjE5Ny42N0gzMjZWMTUxSDI1NnoiIC8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZkZjE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPGdyb3VwPgotICAgICAgICA8Y2xpcC1wYXRoIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNCwyNEgwVjBoMjR2MjR6IE0gMCwwIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05LjYgMTMuNWguNGMuMiAwIC40LC0uMS41LC0uMnMuMiwtLjIuMiwtLjR2LS4ycy0uMSwtLjEsLS4xLC0uMiwtLjEsLS4xLC0uMiwtLjFoLS41cy0uMS4xLC0uMi4xLC0uMS4xLC0uMS4ydi4yaC0xYzAsLS4yIDAsLS4zLjEsLS41cy4yLC0uMy4zLC0uNC4zLC0uMi40LC0uMi40LC0uMS41LC0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjIsLS4xLjMsLS4xLjIsLS4yLjIsLS4yLjEsLS4zLjJjLjIuMS40LjIuNS40cy4yLjQuMi42YzAgLjIgMCAuNCwtLjEuNXMtLjIuMywtLjMuNCwtLjMuMiwtLjUuMiwtLjQuMSwtLjYuMWMtLjIgMCwtLjQgMCwtLjUsLS4xcy0uMywtLjEsLS41LC0uMiwtLjIsLS4yLC0uMywtLjQsLS4xLC0uNCwtLjEsLS42aC44di4ycy4xLjEuMS4yLjEuMS4yLjFoLjVzLjEsLS4xLjIsLS4xLjEsLS4xLjEsLS4ydi0uNXMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNiwtLjEuOGwtLjMuNnMtLjMuMywtLjUuMywtLjQuMSwtLjYuMSwtLjQgMCwtLjYsLS4xLC0uMywtLjIsLS41LC0uMywtLjIsLS4zLC0uMywtLjYsLS4xLC0uNSwtLjEsLS44di0uN2MwLC0uMyAwLC0uNi4xLC0uOGwuMywtLjZzLjMsLS4zLjUsLS4zLjQsLS4xLjYsLS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjksLS44di0uNXMtLjEsLS4yLC0uMSwtLjMsLS4xLC0uMSwtLjIsLS4yLC0uMiwtLjEsLS4zLC0uMSwtLjIgMCwtLjMuMWwtLjIuMnMtLjEuMiwtLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMsLS4xbC4yLC0uMnMuMSwtLjIuMSwtLjN2LTEuNXpNNCAxM2MwIDQuNCAzLjYgOCA4IDhzOCwtMy42IDgsLThoLTJjMCAzLjMsLTIuNyA2LC02IDZzLTYsLTIuNywtNiwtNiAyLjcsLTYgNiwtNnY0bDUsLTUsLTUsLTV2NGMtNC40IDAsLTggMy42LC04IDh6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotICAgIDwvZ3JvdXA+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjRmNmJjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNywxNEw1LDE0djVoNXYtMkw3LDE3di0zek01LDEwaDJMNyw3aDNMMTAsNUw1LDV2NXpNMTcsMTdoLTN2Mmg1di01aC0ydjN6TTE0LDV2MmgzdjNoMkwxOSw1aC01eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzIwNGUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik01LDE2aDN2M2gydi01TDUsMTR2MnpNOCw4TDUsOHYyaDVMMTAsNUw4LDV2M3pNMTQsMTloMnYtM2gzdi0yaC01djV6TTE2LDhMMTYsNWgtMnY1aDVMMTksOGgtM3oiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDFkNzVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xCi0xN2gtMnYtMmgydjJ6bTIuMDctNy43NWwtLjkgLjkyIEMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xIC40NSAtMi4xCi0xLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYgLjU5IC0uODYgLjU5IC0xLjQxIDAtMS4xLS45LTItMi0ycy0yIC45LTIgMkg4YzAtMi4yMQotMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2ZTIyZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMzRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMzRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSA0SDVjLTEuMTEgMC0yIDAuOS0yIDJ2MTJjMCAxLjEgMC44OSAyIDIgMmgxNGMxLjEgMCAyLTAuOSAyLTJWNmMwLTEuMS0wLjktMi0yLTJ6bS04IDExSDkuNXYtMmgtMnYySDZWOWgxLjV2Mi41aDJWOUgxMXY2em03LTFjMCAwLjU1LTAuNDUgMS0xIDFoLTAuNzV2MS41aC0xLjVWMTVIMTRjLTAuNTUgMC0xLTAuNDUtMS0xdi00YzAtMC41NSAwLjQ1IC0xIDEtMWgzYzAuNTUgMCAxIDAuNDUgMSAxdjR6bS0zLjUtMC41aDJ2LTNoLTJ2M3oiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YWY2YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDE5SDVWNWg3VjNINWMtMS4xMSwwIC0yLDAuOSAtMiwydjE0YzAsMS4xIDAuODksMiAyLDJoMTRjMS4xLDAgMiwtMC45IDIsLTJ2LTdoLTJ2N3pNMTQsM3YyaDMuNTlsLTkuODMsOS44MyAxLjQxLDEuNDFMMTksNi40MVYxMGgyVjNoLTd6Ii8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwYWFlYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE2LjUsMTJjMCwtMS43NyAtMS4wMiwtMy4yOSAtMi41LC00LjAzdjIuMjFsMi40NSwyLjQ1YzAuMDMsLTAuMiAwLjA1LC0wLjQxIDAuMDUsLTAuNjN6TTE5LDEyYzAsMC45NCAtMC4yLDEuODIgLTAuNTQsMi42NGwxLjUxLDEuNTFDMjAuNjMsMTQuOTEgMjEsMTMuNSAyMSwxMmMwLC00LjI4IC0yLjk5LC03Ljg2IC03LC04Ljc3djIuMDZjMi44OSwwLjg2IDUsMy41NCA1LDYuNzF6TTQuMjcsM0wzLDQuMjcgNy43Myw5TDMsOXY2aDRsNSw1di02LjczbDQuMjUsNC4yNWMtMC42NywwLjUyIC0xLjQyLDAuOTMgLTIuMjUsMS4xOHYyLjA2YzEuMzgsLTAuMzEgMi42MywtMC45NSAzLjY5LC0xLjgxTDE5LjczLDIxIDIxLDE5LjczbC05LC05TDQuMjcsM3pNMTIsNEw5LjkxLDYuMDkgMTIsOC4xOEwxMiw0eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmUyMjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTExLDE2TDksMTZMOSw4aDJ2OHpNMTUsMTZoLTJMMTMsOGgydjh6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzlkZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDJDNi40OCwyIDIsNi40OCAyLDEyczQuNDgsMTAgMTAsMTAgMTAsLTQuNDggMTAsLTEwUzE3LjUyLDIgMTIsMnpNMTAsMTYuNXYtOWw2LDQuNSAtNiw0LjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZkNWQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbFR5cGU9ImV2ZW5PZGQiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiwyLDYuNDgsMiwxMmMwLDUuNTIsNC40OCwxMCwxMCwxMGM1LjUyLDAsMTAtNC40OCwxMC0xMAotQzIyLDYuNDgsMTcuNTIsMiwxMiwyegotTTE4LDEyYzAsMy4zMS0yLjY5LDYtNiw2Yy0zLjMxLDAtNi0yLjY5LTYtNmgyYzAsMi4yMSwxLjc5LDQsNCw0czQtMS43OSw0LTRzLTEuNzktNC00LTR2M0w4LDdsNC00djMKLUMxNS4zMSw2LDE4LDguNjksMTgsMTJ6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTU4NmI0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8Z3JvdXA+Ci0gICAgICAgIDxjbGlwLXBhdGggYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IE0gMCwwIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiA1VjFMNyA2bDUgNVY3YzMuMyAwIDYgMi43IDYgNnMtMi43IDYsLTYgNiwtNiwtMi43LC02LC02SDRjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04LC0zLjYsLTgsLTgsLTh6bS0xLjEgMTFIMTB2LTMuM0w5IDEzdi0uN2wxLjgsLS42aC4xVjE2em00LjMsLTEuOGMwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMWMuMi4xLjMuMi41LjNzLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotICAgIDwvZ3JvdXA+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlY2I2ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDNINUMzLjg5LDMsMywzLjksMyw1djE0YzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjVDMjEsMy45LDIwLjEsMywxOSwzegotTTEzLDloNGMwLjU1LDAsMSwwLjQ1LDEsMXY0IGMwLDAuNTUtMC40NSwxLTEsMWgtNFY5egotTTkuNSwxMy41di0xSDdjLTAuNTUsMC0xLTAuNDUtMS0xVjEwYzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDF2MUg5LjV2LTAuNWgtMnYxSDEwCi1jMC41NSwwLDEsMC40NSwxLDFWMTRjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTFoMS41djAuNUg5LjV6Ci1NMTQuNSwxMy41aDJ2LTNoLTJWMTMuNXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTllY2MxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjQzLDEyLjk4YzAuMDQsLTAuMzIgMC4wNywtMC42NCAwLjA3LC0wLjk4cy0wLjAzLC0wLjY2IC0wLjA3LC0wLjk4bDIuMTEsLTEuNjVjMC4xOSwtMC4xNSAwLjI0LC0wLjQyIDAuMTIsLTAuNjRsLTIsLTMuNDZjLTAuMTIsLTAuMjIgLTAuMzksLTAuMyAtMC42MSwtMC4yMmwtMi40OSwxYy0wLjUyLC0wLjQgLTEuMDgsLTAuNzMgLTEuNjksLTAuOThsLTAuMzgsLTIuNjVDMTQuNDYsMi4xOCAxNC4yNSwyIDE0LDJoLTRjLTAuMjUsMCAtMC40NiwwLjE4IC0wLjQ5LDAuNDJsLTAuMzgsMi42NWMtMC42MSwwLjI1IC0xLjE3LDAuNTkgLTEuNjksMC45OGwtMi40OSwtMWMtMC4yMywtMC4wOSAtMC40OSwwIC0wLjYxLDAuMjJsLTIsMy40NmMtMC4xMywwLjIyIC0wLjA3LDAuNDkgMC4xMiwwLjY0bDIuMTEsMS42NWMtMC4wNCwwLjMyIC0wLjA3LDAuNjUgLTAuMDcsMC45OHMwLjAzLDAuNjYgMC4wNywwLjk4bC0yLjExLDEuNjVjLTAuMTksMC4xNSAtMC4yNCwwLjQyIC0wLjEyLDAuNjRsMiwzLjQ2YzAuMTIsMC4yMiAwLjM5LDAuMyAwLjYxLDAuMjJsMi40OSwtMWMwLjUyLDAuNCAxLjA4LDAuNzMgMS42OSwwLjk4bDAuMzgsMi42NWMwLjAzLDAuMjQgMC4yNCwwLjQyIDAuNDksMC40Mmg0YzAuMjUsMCAwLjQ2LC0wLjE4IDAuNDksLTAuNDJsMC4zOCwtMi42NWMwLjYxLC0wLjI1IDEuMTcsLTAuNTkgMS42OSwtMC45OGwyLjQ5LDFjMC4yMywwLjA5IDAuNDksMCAwLjYxLC0wLjIybDIsLTMuNDZjMC4xMiwtMC4yMiAwLjA3LC0wLjQ5IC0wLjEyLC0wLjY0bC0yLjExLC0xLjY1ek0xMiwxNS41Yy0xLjkzLDAgLTMuNSwtMS41NyAtMy41LC0zLjVzMS41NywtMy41IDMuNSwtMy41IDMuNSwxLjU3IDMuNSwzLjUgLTEuNTcsMy41IC0zLjUsMy41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWYyODEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDE4bDguNSwtNkw2LDZ2MTJ6TTE2LDZ2MTJoMlY2aC0yeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZGEzMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDZoMnYxMkw2LDE4ek05LjUsMTJsOC41LDZMMTgsNnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhNzI3YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjUsNS41djEzaC0xNXYtMTNIMTkuNXogTTE5LDRINUMzLjg5LDQsMyw0LjksMyw2djEyYzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjZDMjEsNC45LDIwLjEsNCwxOSw0TDE5LDR6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTEsMTFIOS41di0wLjVoLTJ2M2gyVjEzSDExdjFjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTRjMC0wLjU1LDAuNDUtMSwxLTFoM2MwLjU1LDAsMSwwLjQ1LDEsMVYxMXoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOCwxMWgtMS41di0wLjVoLTJ2M2gyVjEzSDE4djFjMCwwLjU1LTAuNDUsMS0xLDFoLTNjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5MWMwNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5IDRINWMtMS4xMSAwLTIgMC45LTIgMnYxMmMwIDEuMSAwLjg5IDIgMiAyaDE0YzEuMSAwIDItMC45IDItMlY2YzAtMS4xLTAuOS0yLTItMnptLTggN0g5LjV2LTAuNWgtMnYzaDJWMTNIMTF2MWMwIDAuNTUtMC40NSAxLTEgMUg3Yy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxem03IDBoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAgMC41NS0wLjQ1IDEtMSAxaC0zYy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYjJiOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMyw5djZoNGw1LDVMMTIsNEw3LDlMMyw5ek0xNi41LDEyYzAsLTEuNzcgLTEuMDIsLTMuMjkgLTIuNSwtNC4wM3Y4LjA1YzEuNDgsLTAuNzMgMi41LC0yLjI1IDIuNSwtNC4wMnpNMTQsMy4yM3YyLjA2YzIuODksMC44NiA1LDMuNTQgNSw2Ljcxcy0yLjExLDUuODUgLTUsNi43MXYyLjA2YzQuMDEsLTAuOTEgNywtNC40OSA3LC04Ljc3cy0yLjk5LC03Ljg2IC03LC04Ljc3eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTBmZjEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmYzdmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhZjdiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9ImZhbHNlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiNDE3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjFkZmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzZDg0ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0IiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OGM4YzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTBlMGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfbGlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgotICAgIDwvaXRlbT4KLQotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmM3ZWNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBpcyB0aGUgY29weSBvZiBAZHJhd2FibGUvYWJjX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsgZXhjZXB0IGZvciBpbnNldAotICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfZGFyayIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiMjM1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGlzIHRoZSBjb3B5IG9mIEBkcmF3YWJsZS9hYmNfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQgZXhjZXB0IGZvciBpbnNldAotICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfbGlnaHQiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzJiYzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wOCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2ZkYjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDYiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDgiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDkiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjIxOGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wYXVzZV9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDFmMDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtPgotICAgICAgICA8Yml0bWFwCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX21lZGlhX3BhdXNlX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQ1YTMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3BsYXlfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmYjdhNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTEwOGE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3N0b3BfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjNmNlOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9zdG9wX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY0ZmQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2F1ZGlvdHJhY2tfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5ZGJjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2YTE3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwLjQiCi0gICAgYW5kcm9pZDpjb250cm9sWTE9IjAiCi0gICAgYW5kcm9pZDpjb250cm9sWDI9IjAuMiIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMj0iMSIvPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmYyOTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCi0gICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZDM2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgPFZpZXcKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIvPgotCi0gICAgPEltYWdlVmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjUiCi0gICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIgLz4KLQotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU2ZGNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0N2E3Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19jaGVjayIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2E1OTU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXciIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlNzA1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjQjMwMEZGMDAiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfaW1hZ2UiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY190ZXh0IgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY0xhbmRzY2FwZS5UZXh0Ij4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMHNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIgLz4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FydGlzdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNCQkJCQkIiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWYxYmIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY19pbWFnZSIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNQb3J0cmFpdC5JbWFnZSI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX3RleHQiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuVGV4dCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+Ci0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJlYTVlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlX29wYWNpdHlfNzAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMjhkMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfY2hlY2siLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTE0Nzg1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnZpc2liaWxpdHk9InZpc2libGUiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcHJldiIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmV3IiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Zmd2QiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dCIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1OGYwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfYmFyIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBsYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50IgotICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyIj4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JhY2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uQmFjayIvPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2JhY2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE1c3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9yaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX2V4dGVybmFsX2xpbmsiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KLQotICAgICAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3RleHQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMHNwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRkZGIiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfbGF1bmNoIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uTGF1bmNoIiAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgICAgIDx2aWV3IGNsYXNzPSJjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FzdCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhckJ1dHRvbiIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NlbnRlcl92aWV3IgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21pbmltYWxfZXh0cmFfdmlldyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiPgotCi0gICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mdWxsc2NyZWVuIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKLSAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+Ci0KLSAgICAgICAgPFNlZWtCYXIKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvZ3Jlc3MiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21jdjJfc2Vla19iYXJfZGVzYyIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMGRwIgotICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsZXZhdGlvbj0iMTBkcCIvPgotCi0gICAgICAgIDxWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzX2J1ZmZlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2J1ZmZlcl92aWV3X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYm90dG9tX2Jhcl9iYWNrZ3JvdW5kIgotICAgICAgICAgICAgYW5kcm9pZDplbGV2YXRpb249IjBkcCIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ0ZHAiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JvdHRvbV9iYXJfYmFja2dyb3VuZCI+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX2xlZnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3NraXBfdGltZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvYm90dG9tX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiID4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2N1cnJlbnQiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5DdXJyZW50Ii8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfaW50ZXJwdW5jdCIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpbWVUZXh0LkludGVycHVuY3QiLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9lbmQiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5FbmQiLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX3JpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRFbmQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0Ij4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFzaWNfY29udHJvbHMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+Ci0KLSAgICAgICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9yZW1haW5pbmciCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211dGUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLk11dGUiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3VidGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uQ0MiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnVsbHNjcmVlbiIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uRnVsbFNjcmVlbiIvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL292ZXJmbG93X3JpZ2h0IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd1JpZ2h0Ii8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXh0cmFfY29udHJvbHMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+Ci0KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY3VzdG9tX2J1dHRvbnMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmlkZW9fcXVhbGl0eSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uVmlkZW9RdWFsaXR5IiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHRpbmdzIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5TZXR0aW5ncyIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdmVyZmxvd19sZWZ0IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMGM4MGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvTWluaW1hbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIiAvPgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg5ZTE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLSAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3RpdGxlIgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbXJfY2hvb3Nlcl90aXRsZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIC8+Ci0gICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9saXN0IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXI9IkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXJIZWlnaHQ9IjBkcCIgLz4KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjQwZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjkwZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfc2VhcmNoaW5nIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+Ci0gICAgICAgIDxQcm9ncmVzc0JhciBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZHAiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5kZXRlcm1pbmF0ZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODg3OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjU2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIgPgotCi0gICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfaWNvbiIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjI0ZHAiIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfbmFtZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzJkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiAvPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfZGVzYyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwNDQ3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC9tcl9leHBhbmRhYmxlX2FyZWEiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9kaWFsb2dfYXJlYSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2NvbG9yQmFja2dyb3VuZEZsb2F0aW5nIj4KLSAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX3RpdGxlX2JhciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNzJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiAvPgotICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2xvc2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2N1c3RvbV9jb250cm9sIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2RlZmF1bHRfY29udHJvbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLSAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9hcnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2NvbG9yUHJpbWFyeSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbWVkaWFfbWFpbl9jb250cm9sIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIxNmRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjE2ZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iP2F0dHIvbWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+Ci0gICAgICAgICAgICAgICAgICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl9wbGF5YmFja19jb250cm9sIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIiA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3BsYXliYWNrX2N0cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9wbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3RpdGxlX2NvbnRhaW5lciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvbXJfY29udHJvbF9wbGF5YmFja19jdHJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF90aXRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfc3VidGl0bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9kaXZpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2NvbnRyb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJjZW50ZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2luY2UgZGlhbG9nJ3MgdG9wIGxheW91dCBtcl9leHBhbmRhYmxlX2FyZWEgaXMgY2xpY2thYmxlLCBpdCBwcm9wYWdhdGVzIHByZXNzZWQgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaXRzIG5vbi1jbGlja2FibGUgY2hpbGRyZW4uIFNwZWNpZnkgYW5kcm9pZDpjbGlja2FibGU9InRydWUiIHRvIHByZXZlbnQgdm9sdW1lIHNsaWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGhhdmluZyBmYWxzZSBwcmVzc2VkIHN0YXRlLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlVm9sdW1lU2xpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfc2xpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX2dyb3VwX2V4cGFuZF9jb2xsYXBzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgotICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2dyb3VwX2xpc3QiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3AiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFyU3R5bGU9Im91dHNpZGVPdmVybGF5IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaXBUb1BhZGRpbmc9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSI/YXR0ci9tZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5IiAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDwvRnJhbWVMYXlvdXQ+Ci0gICAgICAgIDxTY3JvbGxWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvblBhbmVsIgotICAgICAgICAgICAgc3R5bGU9Ij9hdHRyL2J1dHRvbkJhclN0eWxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpmaWxsVmlld3BvcnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOnNjcm9sbEluZGljYXRvcnM9InRvcHxib3R0b20iPgotICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkcCI+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24zIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJOZXV0cmFsQnV0dG9uU3R5bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2UKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGFjZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIi8+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24yIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJOZWdhdGl2ZUJ1dHRvblN0eWxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyUG9zaXRpdmVCdXR0b25TdHlsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgIDwvYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ+Ci0gICAgICAgIDwvU2Nyb2xsVmlldz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODkwNThiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3ZvbHVtZV9pdGVtX2NvbnRhaW5lciIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjYwZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjhkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+Ci0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+Ci0gICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2l0ZW1faWNvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiAvPgotICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzA1MzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoIgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQG51bGwiCi0gICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiPgotPC9MaXN0Vmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxZmM2ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGdyYWRpZW50Ci0gICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iQGNvbG9yL3RpdGxlX2Jhcl9ncmFkaWVudF9zdGFydCIKLSAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iQGNvbG9yL3RpdGxlX2Jhcl9ncmFkaWVudF9lbmQiCi0gICAgICAgIGFuZHJvaWQ6YW5nbGU9Ii0yNzAiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MjMwYWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3RlbHNlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUb2VzdGVsbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtub3BwaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJVaXRzYWFpLWtub3BwaWUuIE9udGtvcHBlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVWl0c2FhaS1rbm9wcGllLiBLb3BwZWwgdGFucyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJVaXRzYWFpLWtub3BwaWUuIEdla29wcGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNhYWkgdWl0IG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVmluZCB0YW5zIHRvZXN0ZWxsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPbnRrb3BwZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIb3Ugb3AgdWl0c2FhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWFhayB0b2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iTGFhdCB3YWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVm91IHVpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVm91IGluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1rdW5zd2VyayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVnbHllciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBpcyBnZWtpZXMgbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJHZWVuIGlubGlndGluZyBiZXNraWtiYWFyIG5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2FhaSB0YW5zIHNrZXJtIHVpdCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhMTkwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhiLXhiK3hi5PhibUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YiY4Yij4Yiq4Yur4YuO4Ym9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YuoQ2FzdCDhiqDhi53hiKvhiK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IOGKoOGLneGIq+GIreGNoiDhjI3hipXhipnhipDhibUg4Ymw4YmL4Yit4Yyn4YiNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOGKoOGLneGIq+GIrSDhiaDhiJvhjIjhipPhipjhibUg4YiL4YutIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4Yqg4Yud4Yir4Yit4Y2iIOGJsOGMiOGKk+GKneGJt+GIjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IOGKoOGLteGIreGMjSDhi4jhi7AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhiJjhiKPhiKrhi6vhi47hib3hipUg4Ymg4Yib4YyN4YqY4Ym1IOGIi+GLrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhjI3hipXhipnhipDhibUg4Yqg4YmL4Yit4YylIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdCDhiJvhi7XhiKjhjI0g4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhi53hjIsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhiqDhjKvhi43hibUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGIiOGKoOGNjeGJsyDhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhiqDhiLXhjYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGIsOGJpeGIteGJpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGLqOGKoOGIjeGJoOGInSDhiLXhipAt4Yyl4Ymg4YmlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGJsOGKleGIuOGIq+GJs+GJvSDhi6jhi7XhiJ3hjYUg4YiY4YmG4Yyj4Yyg4Yiq4YurIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhiJ3hipXhiJ0g4Yib4YiF4Yuw4Yio4YiY4Yio4YyDIOGKoOGIjeGJsOGImOGIqOGMoOGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Yid4YqV4YidIOGImOGIqOGMgyDhiqDhi63hjIjhip3hiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGIm+GLqyDhjIjhjL3hipUg4Ymg4YiY4YuN4Yiw4Yu1IOGIi+GLrSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmYjk3ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYp9mE2YbYuNin2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2KfZhNij2KzZh9iy2KkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLYstixINin2YTYpdix2LPYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2LLYsSDYp9mE2KXYsdiz2KfZhC4g2KrZhSDZgti32Lkg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itiy2LEg2KfZhNil2LHYs9in2YQuINis2KfYsdmNINin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itiy2LEg2KfZhNil2LHYs9in2YQuINiq2YUg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KXYsdiz2KfZhCDYpdmE2YkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLYrNin2LHZjSDYp9mE2KjYrdirINi52YYg2KPYrNmH2LLYqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLZgti32Lkg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLYpdmK2YLYp9mBINin2YTYpdix2LPYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYpdi62YTYp9mCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2KrYtNi62YrZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2KXZitmC2KfZgSDZhdik2YLYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itil2YrZgtin2YEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLYqtmI2LPZiti5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLYqti12LrZitixIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i2LXZiNix2Kkg2KfZhNij2YTYqNmI2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2LTYsdmK2Lcg2KrZhdix2YrYsSDZhdiz2KrZiNmJINin2YTYtdmI2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItmE2YUg2YrYqtmFINin2K7YqtmK2KfYsSDYo9mKINmI2LPYp9im2LciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItmE2Kcg2KrYqtmI2YHYsSDYo9mKINmF2LnZhNmI2YXYp9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYrNin2LHZjSDYpdix2LPYp9mEINin2YTYtNin2LTYqSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNjBhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW0gZMO8eW3JmXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFtIGTDvHltyZlzaS4gQmHEn2xhbnTEsSBryZlzaWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsZHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQnVyYSB5YXnEsW1sYXnEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJDaWhhemxhciBheHRhcsSxbMSxciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxbsSxIGvJmXNpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbcSxIGRheWFuZMSxcsSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iUWFwYWTEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hZMSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyZHVydW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEYXlhbmTEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9syZluZGlyaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlnEscSfY2FtbGHFn2TEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBpbmPJmXPJmW7JmXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlPJmXMgaMmZcm1pIGRpeWlyY8mZeWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhlw6cgYmlyIG1lZGlhIHNlw6dpbG3JmXlpYiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4ixo9sw6dhdGFuIG3JmWx1bWF0IHlveGR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFtbGFuxLFyIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWJkNmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcmXEkWFqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkR1Z21lIFByZWJhY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJEdWdtZSBQcmViYWNpLiBWZXphIGplIHByZWtpbnV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXp1amUgc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXphbiBqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmViYWN1aiBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlByb25hbGHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHVzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2t1cGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPbW90IGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGphxI1pbnUgenZ1a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbWEgaXphYnJhbmloIG1lZGlqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmlzdSBkb3N0dXBuZSBuaWtha3ZlIGluZm9ybWFjaWplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzkxYzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHRltGB0YLRjdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0J/RgNGL0LvQsNC00YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCQ0LTQutC70Y7Rh9Cw0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQhtC00LfQtSDQv9Cw0LTQutC70Y7Rh9GN0L3QvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0J/QsNC00LrQu9GO0YfQsNC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70ZbRgNCw0LLQsNGG0Ywg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7RiNGD0Log0L/RgNGL0LvQsNC0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCQ0LTQu9GD0YfRi9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC/0YvQvdGW0YbRjCDRgtGA0LDQvdGB0LvRj9GG0YvRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GA0LDQudCz0YDQsNGG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDRi9C/0YvQvdGW0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/Ri9C90ZbRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPQsNGA0L3Rg9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCX0LPQsNGA0L3Rg9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQktC+0LrQu9Cw0LTQutCwINCw0LvRjNCx0L7QvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LDRntC30YPQvdC+0Log0LPRg9GH0L3QsNGB0YbRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00YvRj9GE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC90YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCG0L3RhNCw0YDQvNCw0YbRi9GPINCw0LTRgdGD0YLQvdGW0YfQsNC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQrdC60YDQsNC9INGC0YDQsNC90YHQu9GP0YbRi9GWIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjcxMmQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YHRgtGA0L7QudGB0YLQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCS0YDRitC30LrQsNGC0LAg0LUg0L/RgNC10LrRgNCw0YLQtdC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCh0LLRitGA0LfQstCwINGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtS4g0KPRgdGC0LDQvdC+0LLQtdC90LAg0LUg0LLRgNGK0LfQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCf0YDQtdC00LDQstCw0L3QtSDQutGK0LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotGK0YDRgdGP0YIg0YHQtSDRg9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutGA0LDRgtGP0LLQsNC90LUg0L3QsCDQstGA0YrQt9C60LDRgtCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9C40YDQsNC90LUg0L3QsCDQv9GA0LXQtNCw0LLQsNC90LXRgtC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstCw0YDRj9C90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHQutCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QvtGB0YLQsNCy0Y/QvdC1INC90LAg0L/QsNGD0LfQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/QuNGA0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPRitCy0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LjQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwINC90LAg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LvRitC30LPQsNGHINC30LAg0YHQuNC70LDRgtCwINC90LAg0LfQstGD0LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3Rj9C80LAg0LjQt9Cx0YDQsNC90LAg0LzRg9C70YLQuNC80LXQtNC40Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0Y/QvNCwINC90LDQu9C40YfQvdCwINC40L3RhNC+0YDQvNCw0YbQuNGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90YrRgiDRgdC1INC/0YDQtdC00LDQstCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmY1OTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCmuOCmv+CmuOCnjeCmn+Cnh+CmriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpqHgpr/gpq3gpr7gpofgprjgppfgp4HgprLgpr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4Kau4Ke3IOCmuOCmguCmr+Cni+CmlyDgpqzgpr/gpprgp43gppvgpr/gpqjgp43gpqgg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4vgppcg4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4HgppXgp43gpqQg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCmj+CmpOCnhyDgppXgpr7gprjgp43gpp8g4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kah4Ka/4Kat4Ka+4KaH4Ka44KaX4KeB4Kay4Ka/4KaV4KeHIOCmluCni+CmgeCmnOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Ka44KaC4Kav4KeL4KaXIOCmrOCmv+CmmuCnjeCmm+Cmv+CmqOCnjeCmqCDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpprgpr7gprLgpr7gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCmrOCmv+CmsOCmvuCmriDgpqbgpr/gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpqXgpr7gpq7gpr7gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpqzgpqHgprwg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgprjgppngp43gppXgp4Hgpprgpr/gpqQg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KaF4KeN4Kav4Ka+4Kay4Kas4Ka+4KauIOCmtuCniOCmsuCmvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpq3gprLgpr/gpongpq4g4Ka44KeN4Kay4Ka+4KaH4Kah4Ka+4KawIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgppXgp4vgpqjgp4sg4Kau4Ka/4Kah4Ka/4Kav4Ka84Ka+IOCmqOCmv+CmsOCnjeCmrOCmvuCmmuCmqCDgppXgprDgpr4g4Ka54Kav4Ka84Kao4Ka/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgppXgp4vgpqjgp4sg4Kak4Kal4KeN4KavIOCmieCmquCmsuCmrOCnjeCmpyDgpqjgp4fgpociPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCmuOCnjeCmleCnjeCmsOCngOCmqCDgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExYzc0Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJEdWdtZSB6YSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iRHVnbWUgemEgZW1pdGlyYW5qZS4gVmV6YSBqZSBwcmVraW51dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFBvdmV6YW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpcmFuamUgbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJUcmHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUHJvxaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNrdXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT21vdCBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBqYcSNaW51IHp2dWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWplZGFuIG1lZGlqIG5pamUgb2RhYnJhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVtYSBkb3N0dXBuaWggaW5mb3JtYWNpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWJhY3VqZSBzZSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NWFjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7MgZFwnZW1ldHJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7MgRW1ldC4gRGVzY29ubmVjdGF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7MgRW1ldC4gU1wnZXN0w6AgY29ubmVjdGFudC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7MgRW1ldC4gQ29ubmVjdGF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWV0IGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTXCdlc3RhbiBjZXJjYW50IGRpc3Bvc2l0aXVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Nvbm5lY3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXR1cmEgbFwnZW1pc3Npw7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlRhbmNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWVpeCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG9zYSBlbiBwYXVzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkF0dXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRGVzcGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlcGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWF0Z2UgZGUgbFwnw6BsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgbGxpc2NhbnQgZGUgdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNcJ2hhIHNlbGVjY2lvbmF0IGNhcCBmaXR4ZXIgbXVsdGltw6hkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhpIGhhIGluZm9ybWFjacOzIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNzacOzIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWE4OTIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmHFmcOtemVuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBPZHBvamVubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60uIFDFmWlwb2pvdsOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBQxZlpcG9qZW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Ik9kZXPDrWxhdCBkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkhsZWTDoW7DrSB6YcWZw616ZW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvaml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2aXQgb2Rlc8OtbMOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXbFmcOtdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlDFmWVocsOhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ilphc3Rhdml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNiYWxpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9iYWwgYWxiYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQb3N1dm7DrWsgaGxhc2l0b3N0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVieWxhIHZ5YnLDoW5hIMW+w6FkbsOhIG3DqWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVqc291IGvCoGRpc3BvemljaSDFvsOhZG7DqSBpbmZvcm1hY2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik9kZXPDrWzDoW7DrSBvYnNhaHUgb2JyYXpvdmt5Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdhNzkwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFbmhlZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbmFwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwLiBGb3JiaW5kZWxzZW4gZXIgYWZicnVkdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwLiBPcHJldHRlciBmb3JiaW5kZWxzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXAuIFRpbHNsdXR0ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kZXIgZW5oZWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBZmJyeWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIG1lZCBhdCBjYXN0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQWZzcGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTw6Z0IHDDpSBwYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVZHZpZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2tqdWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWdyYWZpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJMeWRzdHlya2Vza3lkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkluZ2VuIG1lZGllciBlciBtYXJrZXJldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRGVyIGVyIGluZ2VuIHRpbGfDpm5nZWxpZ2Ugb3BseXNuaW5nZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrw6ZybWVuIGNhc3RlcyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiZjU3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iR2Vyw6R0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtU3ltYm9sIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIE5pY2h0IHZlcmJ1bmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJpbmR1bmcgd2lyZCBoZXJnZXN0ZWxsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJTdHJlYW1pbmctU2NoYWx0ZmzDpGNoZS4gVmVyYnVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN0cmVhbWVuIGF1ZiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkdlcsOkdGUgd2VyZGVuIGdlc3VjaHQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlZlcmJpbmR1bmcgdHJlbm5lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0cmVhbWluZyBiZWVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTY2hsaWXDn2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iV2llZGVyZ2ViZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNpZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlZW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNYXhpbWllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5pbWllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1jb3ZlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTY2hpZWJlcmVnbGVyIGbDvHIgZGllIExhdXRzdMOkcmtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLZWluZSBNZWRpZW4gYXVzZ2V3w6RobHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IktlaW5lIEluZm9ybWF0aW9uZW4gdmVyZsO8Z2JhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQmlsZHNjaGlybSB3aXJkIGdlc3RyZWFtdC4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmY2OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4izqPPjc+Dz4TOt868zrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4izqPPhc+DzrrOtc+Fzq3PgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Is6azr/Phc68z4DOryBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrfPgi4gzpHPgM6/z4PPhc69zrTOrc64zrfOus61Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POty4gzqPPjc69zrTOtc+Dzrcgz4POtSDOtc6+zq3Ou865zr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POt8+CLiDOo8+Fzr3OtM6tzrjOt866zrUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4izpzOtc+EzqzOtM6/z4POtyDPg861Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4izpXPjc+BzrXPg863IM+Dz4XPg866zrXPhc+Ozr0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4izpHPgM6/z4PPjc69zrTOtc+DzrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLOlM65zrHOus6/z4DOriDOvM61z4TOrM60zr/Pg863z4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Is6azrvOtc6vz4POuc68zr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLOkc69zrHPgM6xz4HOsc6zz4nOs86uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLOoM6xz43Pg863Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4izpTOuc6xzrrOv8+Azq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLOkc69zqzPgM+Ez4XOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLOo8+NzrzPgM+Ez4XOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4izpXOvs+Oz4bPhc67zrvOvyDOrM67zrzPgM6/z4XOvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLOoc+FzrjOvM65z4PPhM65zrrPjCDOrc69z4TOsc+DzrfPgiDOrs+Hzr/PhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4izpTOtc69IM6tz4fOv8+Fzr0gzrXPgM65zrvOtc6zzrXOryDOvM6tz4POsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4izpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrTOuc6xzrjOrc+DzrnOvM61z4Igz4DOu863z4HOv8+Gzr/Pgc6vzrXPgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4izpzOtc+EzqzOtM6/z4POtyDOv864z4zOvc63z4IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODcwMDdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI5TeXN0ZW3igI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCORGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjkNhc3QgYnV0dG9u4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCOQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCOQ2FzdCBidXR0b24uIENvbm5lY3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCOQ2FzdCBidXR0b24uIENvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI/igI/igI7igI5DYXN0IHRv4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCORmluZGluZyBkZXZpY2Vz4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjkRpc2Nvbm5lY3TigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI5TdG9wIGNhc3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjkNsb3Nl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCOUGxheeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCOUGF1c2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI5TdG9w4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCORXhwYW5k4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI/igI/igI/igI/igI7igI5Db2xsYXBzZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjkFsYnVtIGFydOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI5Wb2x1bWUgc2xpZGVy4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI5ObyBtZWRpYSBzZWxlY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCOTm8gaW5mbyBhdmFpbGFibGXigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjkNhc3Rpbmcgc2NyZWVu4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MWVhZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGRlc2NvbmVjdGFkbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFuZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFkbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZW5lciBsYSB0cmFuc21pc2nDs24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkRldGVuZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNb3N0cmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJPY3VsdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VuIGRlbCDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlbCB2b2x1bWVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzZSBzZWxlY2Npb27DsyBuaW5nw7puIGNvbnRlbmlkbyBtdWx0aW1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJTaW4gaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aWVuZG8gcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDMwMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gZGUgZW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIGRlIGVudmlhci4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gZGUgZW52aWFyLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBkZSBlbnZpYXIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbnZpYXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVuZXIgZW52w61vIGRlIGNvbnRlbmlkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2VycmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlbmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTW9zdHJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iT2N1bHRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBvcnRhZGEgZGVsIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGRlc2xpemFudGUgZGUgdm9sdW1lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmfDum4gbWVkaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhheSBpbmZvcm1hY2nDs24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW52aWFuZG8gcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzIzNWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU8O8c3RlZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iU2VhZG1lZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOcbGVrYW5kZW51cHAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDnGxla2FuZGVudXBwLiDDnGhlbmR1cyBvbiBrYXRrZXN0YXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDnGxla2FuZG1pbmUgc2VhZG1lc3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU2VhZG1ldGUgb3RzaW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS2F0a2VzdGEgw7xoZW5kdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQZWF0YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGdlbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVzaXRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGVhdGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGVhdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWllbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQWhlbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaSBrdWp1bmR1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJIZWxpdHVnZXZ1c2UgbGl1Z3VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJNZWVkaWF0IHBvbGUgdmFsaXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGVhdmUgcHV1ZHViIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhYW5pa3V2YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTE5ZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJHYWlsdWFrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWdvcnJpIGJvdG9pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Iklnb3J0emVrbyBib3RvaWEuIERlc2tvbmVrdGF0dXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHplbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJJZ29ycmkgaG9uYToiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHYWlsdWFrIGJpbGF0emVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2tvbmVrdGF0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlV0emkgaWdvcnR6ZWFyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXR4aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVycmVwcm9kdXppdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJHZWxkaXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWmFiYWxkdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVG9sZXN0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYXJlbiBhemFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJCb2x1bWVuYXJlbiBncmFkdWF0emFpbGVhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFeiBkYSBoYXV0YXR1IG11bHRpbWVkaWEtZWR1a2lyaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkV6IGRhZ28gaW5mb3JtYXppb3JpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUGFudGFpbGEgaWdvcnR6ZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNmM3NzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2LPbjNiz2KrZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYr9iz2Krar9in2YfigIzZh9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2K/aqdmF2Ycg2KfYsdiz2KfZhCDZhdit2KrZiNinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINin2LHYqtio2KfYtyDZgti32Lkg2LTYryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINiv2LHYrdin2YQg2YXYsdiq2KjYt+KAjNiz2KfYstuMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDZhdix2KrYqNi3INi02K8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KfYsdiz2KfZhCDZhdit2KrZiNinINio2YciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLZvtuM2K/YpyDaqdix2K/ZhiDYr9iz2Krar9in2YfigIzZh9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItmC2LfYuSDYp9ix2KrYqNin2LciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLYqtmI2YLZgSDYp9ix2LPYp9mEINmF2K3YqtmI2KciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itio2LPYqtmGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2b7Yrti0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdqp2KsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYqtmI2YLZgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itio2LLYsdqvINqp2LHYr9mGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLaqdmI2obaqSDaqdix2K/ZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Iti52qnYsyDYsdmI24wg2KzZhNivINii2YTYqNmI2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2YTYutiy2YbYr9mHINmF24zYstin2YYg2LXYr9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLYsdiz2KfZhtmHINin2YbYqtiu2KfYqCDZhti02K/ZhyDYp9iz2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Itin2LfZhNin2LnYp9iqINiv2LEg2K/Ys9iq2LHYsyDZhtuM2LPYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2K/Ysdit2KfZhCDZgdix2LPYqtin2K/ZhiDYtdmB2K3ZhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4MzQzNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJKw6RyamVzdGVsbcOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkxhaXR0ZWV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1wYWluaWtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1wYWluaWtlLiBZaHRleXMga2F0a2Fpc3R1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LXBhaW5pa2UuIFloZGlzdGV0w6TDpG4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldHR5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN1b3JhdG9pc3RvbiBrb2hkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkV0c2l0w6TDpG4gbGFpdHRlaXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGthaXNlIHlodGV5cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkxvcGV0YSBzdW9yYXRvaXN0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU3VsamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJUb2lzdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iktlc2tleXTDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlB5c8OkeXTDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkxhYWplbm5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJUaWl2aXN0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWluIGthbnNpa3V2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLDhMOkbmVudm9pbWFra3V1ZGVuIGxpdWt1c8Okw6RkaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkVpIHZhbGl0dHVhIG1lZGlhYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRpZXRvamEgZWkgb2xlIHNhYXRhdmlsbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlN1b3JhdG9pc3RldGFhbiBuw6R5dHTDtsOkIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Zjk4NGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdXRvbiBEaWZmdXNlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdXRvbiBEaWZmdXNlci4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5leGlvbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJEaWZmdXNlciBzdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNlIGTDqWNvbm5lY3RlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgcsOpZ2xhZ2UgZHUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzMxMmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOobWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWPDtG5lIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJY8O0bmUgQ2FzdC4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJY8O0bmUgQ2FzdC4gQ29ubmV4aW9u4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikljw7RuZSBDYXN0LiBDb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGVyIHN1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJlY2hlcmNoZSBkXCdhcHBhcmVpbHPigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRMOpY29ubmVjdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXJyw6p0ZXIgbGEgZGlmZnVzaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZXJtZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWN0dXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkFycsOqdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRMOpdmVsb3BwZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlLDqWR1aXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2UgZGUgbFwnYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ3Vyc2V1ciBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkF1Y3VuIG3DqWRpYSBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBdWN1bmUgaW5mb3JtYXRpb24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRGlmZnVzaW9uIGRlIGxcJ8OpY3JhbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyYzM1NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBkZSBlbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gZGUgZW1pdGlyLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7NuIGRlIGVtaXRpci4gQ29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZXIgZW1pc2nDs24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlBlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkFtcGxpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbnRyYWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUG9ydGFkYSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNwcmF6YWJsZSBkbyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vbiBzZSBzZWxlY2Npb25hcm9uIHJlY3Vyc29zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOb24gaGFpIGluZm9ybWFjacOzbiBkaXNwb8OxaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW1pc2nDs24gZGUgcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDVmM2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Kq44Kq/4Kq44KuN4Kqf4KquIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCqieCqquCqleCqsOCqo+CriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq43gqq/gq4HgqoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqpXgqqjgq4fgqpXgq43gqp8g4Kql4KqIIOCqsOCqueCrjeCqr+CrgeCqgiDgqpvgq4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqleCqqOCrh+CqleCrjeCqnyDgqqXgqq/gq4HgqoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KqG4Kqo4Kq+IOCqquCqsCDgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KqJ4Kqq4KqV4Kqw4Kqj4KuLIOCqtuCri+Cqp+CrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuA4KqPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4Kq14Kq+4Kqo4KuB4KqCIOCqsOCri+CqleCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kqs4KqC4KqnIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCqmuCqsuCqvuCqteCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kql4KuL4Kqt4Kq+4Kq14KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kqw4KuL4KqV4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Kq14Kq/4Kq44KuN4Kqk4KuD4KqkIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Kq44KqC4KqV4KuB4Kqa4Kq/4KqkIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCqhuCqsuCrjeCqrOCqriDgqpXgqrLgqr4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Kq14KuJ4Kqy4KuN4Kqv4KuB4KquIOCquOCrjeCqsuCqvuCqh+CqoeCqsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KqV4KuL4KqIIOCqruCrgOCqoeCqv+Cqr+CqviDgqqrgqrjgqoLgqqYg4KqV4Kqw4KuH4KqyIOCqqOCqpeCrgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KqV4KuL4KqIIOCqruCqvuCqueCqv+CqpOCrgCDgqongqqrgqrLgqqzgq43gqqcg4Kqo4Kql4KuAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqrjgq43gqpXgq43gqrDgq4Dgqqjgqqjgq4cg4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuHIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTUyYTU5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpL7gpIfgpLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpKHgpL/gpLjgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliyDgpLDgpLngpL4g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCkh+CkuCDgpKrgpLAg4KSV4KS+4KS44KWN4oCN4KSfIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCkvuCkh+CkuCDgpKLgpYLgpILgpKIg4KSw4KS54KS+IOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpKHgpL/gpLjgpJXgpKjgpYfgpJXgpY3gpJ8g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOCkqOCkviDgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSa4KSy4KS+4KSP4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4KS14KS/4KS44KWN4KSk4KS+4KSwIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4KSb4KWL4KSf4KS+IOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCkj+CksuCljeCkrOCkriDgpIbgpLDgpY3gpJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4KS14KWJ4KSy4KWN4KSv4KWC4KSuIOCkuOCljeCksuCkvuCkh+CkoeCksCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KSV4KWL4KSIIOCkruClgOCkoeCkv+Ckr+CkviDgpJrgpK/gpKjgpL/gpKQg4KSo4KS54KWA4KSCIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSV4KWL4KSIIOCknOCkvuCkqOCkleCkvuCksOClgCDgpK7gpYzgpJzgpYLgpKYg4KSo4KS54KWA4KSCIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KWA4KSoIOCkleCkvuCkuOCljeCknyDgpLngpYsg4KSw4KS54KWAIOCkueCliCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0M2VlNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTdXN0YXYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJHdW1iIHphIGVtaXRpcmFuamUuIFZlemEgcHJla2ludXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikd1bWIgemEgZW1pdGlyYW5qZS4gUG92ZXphbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdHZhcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1a2NpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpdmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhxb5pbWFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJOYXNsb3ZuaWNhIGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGdsYXNub8SHdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZSBvZGFicmFuIG5pamVkYW4gbWVkaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZm9ybWFjaWplIG5pc3UgZG9zdHVwbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXRpcmFuamUgemFzbG9uYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2YmRmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJSZW5kc3plciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFc3prw7Z6w7ZrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw4F0a8O8bGTDqXMgZ29tYiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOBdGvDvGxkw6lzIGdvbWIuIEthcGNzb2xhdCBib250dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOBdGvDvGxkw6lzIGdvbWIuIENzYXRsYWtvesOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDgXRrw7xsZMOpcyBnb21iLiBDc2F0bGFrb3p0YXR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDgXRrw7xsZMOpcyBpZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFc3prw7Z6w7ZrIGtlcmVzw6lzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJMZXbDoWxhc3p0w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iw4F0a8O8bGTDqXMgbGXDoWxsw610w6FzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQmV6w6Fyw6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVqw6F0c3rDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlN6w7xuZXRlbHRldMOpcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ikxlw6FsbMOtdMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IktpYm9udMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iw5Zzc3plY3N1a8OhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkxlbWV6Ym9yw610w7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGFuZ2VyxZFzemFiw6FseXrDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmluY3MgbcOpZGlhIGtpdsOhbGFzenR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmluY3MgaW5mb3Jtw6FjacOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLw6lwZXJuecWRdGFydGFsb20gw6F0a8O8bGTDqXNlIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWM4MmI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItWA1aHVtNWh1a/VodaA1aMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i1Y3VodaA1oTVpdaAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNW2INWh1bbVu9Wh1b/VvtWh1a4g1aciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVqCDVr9Wh1brVodWv1oHVvtW41oLVtCDVpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1agg1a/VodW61aHVr9aB1b7VodWuINWnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItS41bbVv9aA1aXWhCDVvdWh1oDWhNWoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i1Y3VodaA1oTVpdaA1asg1bjWgNW41bbVuNaC1bQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i1LHVttW71aHVv9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLUtNWh1aTVodaA1aXWgdW21aXVrCDVsNWl1bzVodaA1bHVodWv1bjWgtW01agiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItWT1aHVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLVhtW+1aHVo9Wh1oDVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItS01aHVpNWh1oAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLUtNWh1aTVodaA1aXWgdW21aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItS41bbVpNWh1oDVsdWh1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLUv9W41a7Vr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLUsdWs1aLVuNW01asg1bfVodW61avVryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLVgdWh1bXVttWrINW41oLVqtWj1bbVuNaC1anVtdWh1bYg1a/VodaA1aPVodW+1bjWgNWr1bkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItWE1aXVpNWr1aEg1obVodW11azVpdaAINW51aXVtiDVqNW21b/WgNW+1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i1Y/VpdWy1aXVr9W41oLVqdW11bjWgtW21bbVpdaA1agg1bDVodW91aHVttWl1azVqyDVudWl1bYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItS31a/WgNWh1bbVqCDVsNWl1bzVodaA1bHVodWv1b7VuNaC1bQg1aciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMjc1MmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBlcmFuZ2thdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRvbWJvbCBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVG9tYm9sIENhc3QuIFRlcnB1dHVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUb21ib2wgQ2FzdC4gTWVuZ2h1YnVuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUb21ib2wgQ2FzdC4gVGVyaHVidW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWlzaWthbiBrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik1lbmNhcmkgcGVyYW5na2F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkhlbnRpa2FuIGNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHV0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkplZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZXJoZW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikx1YXNrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNpdXRrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTYW1wdWwgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQmlsYWggZ2VzZXIgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJUaWRhayBhZGEgbWVkaWEgeWFuZyBkaXBpbGloIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWRhayBhZGEgaW5mbyB5YW5nIHRlcnNlZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pc2kgbGF5YXIiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzVlYTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iS2VyZmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVMOma2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDmnRzZW5kaW5nYXJobmFwcHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gQWZ0ZW5ndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gVGVuZ2lzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDmnRzZW5kaW5nYXJobmFwcHVyLiBUZW5ndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTZW5kYSDDunQgw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZWl0YcOwIGHDsCB0w6ZranVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkFmdGVuZ2phc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdMO2w7B2YSDDunRzZW5kaW5ndSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTG9rYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJIbMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3TDtsOwdmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJTdMOma2thIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5ua2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQbMO2dHV1bXNsYWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGxqw7PDsHN0eXJrc3NsZcOwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRW5naW5uIG1pw7BpbGwgdmFsaW5uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJFbmdhciB1cHBsw71zaW5nYXIgw60gYm/DsGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrasOhciBzZW5kdXIgw7p0Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTZlM2FjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQdWxzYW50ZSBUcmFzbWV0dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIERpc2Nvbm5lc3NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIENvbm5lc3Npb25lIGluIGNvcnNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlB1bHNhbnRlIFRyYXNtZXR0aS4gQ29ubmVzc28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhc21ldHRpIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSaWNlcmNhIGRpIGRpc3Bvc2l0aXZpIGluIGNvcnNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNjb2xsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21waSB0cmFzbWlzc2lvbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNoaXVkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJpcHJvZHVjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJbnRlcnJvbXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXNwYW5kaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29tcHJpbWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJDb3BlcnRpbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRGlzcG9zaXRpdm8gZGkgc2NvcnJpbWVudG8gZGVsIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVzc3VuIGNvbnRlbnV0byBtdWx0aW1lZGlhbGUgc2VsZXppb25hdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lc3N1bmEgaW5mb3JtYXppb25lIGRpc3BvbmliaWxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFzbWlzc2lvbmUgZGVsbG8gc2NoZXJtbyBpbiBjb3JzbyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyYjBjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLXntei16jXm9eqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itee15vXqdeZ16jXmdedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteg15XXqtenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLigI/XnNeX16bXnyDXlNek16LXnNeqIENhc3QuINee16rXl9eR16giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteX15XXkdeoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IteU16LXkdeo15Qg15DXnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itee15fXpNepINee15vXqdeZ16jXmdedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Iteg16rXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IteU16TXodenINeQ16og15TXlNei15HXqNeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLXodeS15XXqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IteU16TXotecIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLXlNep15TXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IteU16TXodenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i15TXqNeX15EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Iteb15XXldelIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i16LXmNeZ16TXqiDXkNec15HXldedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Itee15fXldeV158g16LXldem157XlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i15zXkCDXoNeR15fXqNeUINee15PXmdeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLXkNeZ158g157XmdeT16Ig15bXnteZ158iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IteU16LXkdeo16og157XodeaINee16rXkdem16LXqiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0OTcyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLjgrfjgrnjg4bjg6AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i56uv5pyrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i44Kt44Oj44K544OI44Ki44Kk44Kz44OzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muino+mZpOa4iOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muS4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLjgq3jg6Pjgrnjg4gg44Ki44Kk44Kz44Oz44CC5o6l57aa5riI44G/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuOCreODo+OCueODiOOBmeOCi+ODh+ODkOOCpOOCuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuerr+acq+OCkuaknOe0ouOBl+OBpuOBhOOBvuOBmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmjqXntprjgpLop6PpmaQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLjgq3jg6Pjgrnjg4jjgpLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumWieOBmOOCiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuWGjeeUnyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5LiA5pmC5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmipjjgorjgZ/jgZ/jgoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLjgqLjg6vjg5Djg6DjgqLjg7zjg4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP44K544Op44Kk44OA44O8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLjg6Hjg4fjgqPjgqLjgYzpgbjmip7jgZXjgozjgabjgYTjgb7jgZvjgpMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuaDheWgseOBjOOBguOCiuOBvuOBm+OCkyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i55S76Z2i44KS44Kt44Oj44K544OI44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGEwODFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGDoeGDmOGDoeGDouGDlOGDm+GDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhg5vhg53hg6zhg6fhg53hg5Hhg5jhg5rhg53hg5Hhg5Thg5Hhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOS4YOQ4YOX4YOY4YOo4YOj4YOa4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5vhg5jhg5vhg5Phg5jhg5zhg5Dhg6Dhg5Thg53hg5Hhg6Eg4YOT4YOQ4YOZ4YOQ4YOV4YOo4YOY4YOg4YOU4YOR4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDk+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDo+GDmuGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5A6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YOb4YOd4YOs4YOn4YOd4YOR4YOY4YOa4YOd4YOR4YOU4YOR4YOY4YOhIOGDm+GDneGDq+GDmOGDlOGDkeGDkC4uLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5jhg6Eg4YOS4YOQ4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDqOGDlOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4YOT4YOQ4YOu4YOj4YOg4YOV4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4YOT4YOQ4YOZ4YOV4YOg4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhg57hg5Dhg6Phg5bhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhg6jhg5Thg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhg5Lhg5Dhg6jhg5rhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGDqeGDkOGDmeGDlOGDquGDleGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGDkOGDmuGDkeGDneGDm+GDmOGDoSDhg5Lhg5Dhg6Dhg5Thg5nhg5Dhg5zhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4YOu4YOb4YOY4YOhIOGDoeGDmuGDkOGDmOGDk+GDlOGDoOGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4YOb4YOU4YOT4YOY4YOQIOGDkOGDoOGDqeGDlOGDo+GDmuGDmCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhg5jhg5zhg6Thg53hg6Dhg5vhg5Dhg6rhg5jhg5Ag4YOQ4YOgIOGDkOGDoOGDmOGDoSDhg67hg5Thg5rhg5vhg5jhg6Hhg5Dhg6zhg5Xhg5Phg53hg5vhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGDm+GDmOGDm+GDk+GDmOGDnOGDkOGDoOGDlOGDneGDkeGDoSDhg5Thg5nhg6Dhg5Dhg5zhg5jhg6Eg4YOS4YOQ4YOT4YOQ4YOq4YOU4YOb4YOQIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRjYmIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCW0q/QudC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItKa0rHRgNGL0LvSk9GL0LvQsNGAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMg0YLSr9C50LzQtdGB0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINCQ0LbRi9GA0LDRgtGD0LvRiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDSmtC+0YHRi9C70YPQtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9C00YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JrQtdC70LXRgdGW0LPQtSDRgtGA0LDQvdGB0LvRj9GG0LjRj9C70LDRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItKa0rHRgNGL0LvSk9GL0LvQsNGA0LTRiyDRgtCw0LHRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC20YvRgNCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGD0LTRiyDRgtC+0pvRgtCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JbQsNCx0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCa0ZbQtNGW0YDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0LjRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCQ0LvRjNCx0L7QvCDRiNC10LHQtdGA0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JTRi9Cx0YvRgSDQtNC10qPQs9C10LnRltC90ZbSoyDQttKv0LPRltGA0YLQutGW0YHRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JXRiNCx0ZbRgCDRgtCw0YHRg9GI0Ysg0YLQsNKj0LTQsNC70LzQsNKT0LDQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0prQvtC7INC20LXRgtGW0LzQtNGWINCw0pvQv9Cw0YDQsNGCINC20L7SmyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvdC00Ysg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDc4MGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Z6U4Z+S4Z6a4Z6W4Z+Q4Z6T4Z+S4Z6SIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGep+GelOGegOGemuGejuGfjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGelOGfiuGevOGej+Geu+GehOGegeGetuGenyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnpThnrbhnpPhnoDhnrbhno/hn4vhnpXhn5Lhno/hnrbhnoXhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnoDhn4bhnpbhnrvhnoThnpfhn5LhnofhnrbhnpThn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Z6B4Z624Z6f4Z6U4Z+K4Z684Z6P4Z674Z6E4Z+WIOGelOGetuGek+Gel+GfkuGeh+GetuGelOGfi+GeoOGevuGemSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhnpThnonhn5LhnofhnrzhnpPhnpHhn4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhnoDhn4bhnpbhnrvhnoThnp/hn5Lhnpzhn4LhnoThnprhnoDhnqfhnpThnoDhnprhno7hn40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Z6V4Z+S4Z6K4Z624Z6F4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Z6I4Z6U4Z+L4Z6X4Z+S4Z6H4Z624Z6U4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhnpThnrfhnpEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhnoXhnrbhnoDhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGeleGfkuGeouGetuGegCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGeiOGelOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGeluGehOGfkuGemuGeuOGegCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Z6U4Z6E4Z+S4Z6a4Z694Z6YIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Z6f4Z+S4Z6T4Z624Z6K4Z+D4Z6f4Z634Z6b4Z+S4Z6U4Z+I4Z6i4Z624Z6b4Z+L4Z6U4Z+K4Z674Z6YIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGemuGelOGetuGemuGegOGemOGfkuGemuGet+Gej+Gen+GfhuGeoeGfgeGehCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Z6C4Z+S4Z6Y4Z624Z6T4Z6A4Z624Z6a4Z6H4Z+S4Z6a4Z6+4Z6f4Z6Y4Z+B4Z6M4Z+A4Z6R4Z+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhnpjhnrfhnpPhnpjhnrbhnpPhnpbhn5Dhno/hn4zhnpjhnrbhnpPhnpHhn4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGegOGfhuGeluGeu+GehOGegeGetuGen+GeouGfgeGegOGfkuGemuGehOGfiyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzN2ZkZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgsrjgsr/gsrjgs43gsp/gsoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LK44LK+4LKn4LKo4LKX4LKz4LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCylSDgspXgsqHgsr/gsqTgspfgs4rgsrPgsr/gsrjgsrLgsr7gspfgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCyleCyv+CyuOCysuCyvuCyl+CzgeCypOCzjeCypOCyv+CypuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspXgsr/gsqTgspfgs4rgsoLgsqHgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LKH4LKm4LKV4LON4LKV4LOGIOCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCyuOCyvuCyp+CyqOCyl+Cys+CyqOCzjeCyqOCzgSDgsrngs4HgsqHgs4HgspXgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LK44LKC4LKq4LKw4LON4LKVIOCyleCyoeCyv+CypOCyl+CziuCys+Cyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgeCyteCyv+CyleCzhiDgsqjgsr/gsrLgs43gsrLgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCyruCzgeCymuCzjeCymuCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCyquCzjeCysuCzhyDgsq7gsr7gsqHgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCyteCyv+CysOCyvuCyriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCyqOCyv+CysuCzjeCysuCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCyteCyv+CyuOCzjeCypOCysOCyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LK44LKC4LKV4LOB4LKa4LK/4LK44LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LKG4LKy4LON4LKs4LKu4LONIOCyleCysuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgsrXgsr7gsrLgs43gsq/gs4Lgsq7gs40g4LK44LON4LKy4LOI4LKh4LKw4LONIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgsq/gsr7gsrXgs4Hgsqbgs4cg4LKu4LK+4LKn4LON4LKv4LKuIOCyhuCyr+CzjeCyleCzhuCyruCyvuCyoeCysuCyvuCyl+Cyv+CysuCzjeCysiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LKv4LK+4LK14LOB4LKm4LOHIOCyruCyvuCyueCyv+CypOCyvyDgsrLgsq3gs43gsq/gsrXgsr/gsrLgs43gsrIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCyquCysOCypuCzhuCyr+CyqOCzjeCyqOCzgSDgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODkzYTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i7Iuc7Iqk7YWcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuq4sOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuyghOyGoSDrsoTtirwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7ZW07KCc65CoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7KSRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuyghOyGoSDrsoTtirwuIOyXsOqysOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLsoITshqHtlaAg6riw6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i6riw6riw66W8IOywvuuKlCDspJEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i7Jew6rKwIO2VtOygnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuyghOyGoSDspJHsp4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuuLq+q4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuyerOyDnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i7J287Iuc7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i7Y687LmY6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLsoJHquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLslajrspTslYTtirgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i67O866WoIOyKrOudvOydtOuNlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i7ISg7YOd7ZWcIOuvuOuUlOyWtCDsl4bsnYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuygleuztOqwgCDsl4bsirXri4jri6QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLtmZTrqbQg7KCE7IahIOykkSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4MTNhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQotGD0YLRg9C8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCi0q/Qt9C806nQutGC06nRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0LDQttGL0YDQsNC/INGC0YPRgNCw0YIuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0YLRg9GC0LDRiNGD0YPQtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsuINCi0q/Qt9C806nQuiDRgtGD0YLQsNGI0YvQvyDRgtGD0YDQsNGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi06nQvNOp0L3QutKv0LPTqSDRh9GL0LPQsNGA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi0q/Qt9C806nQutGC06nRgCDQuNC30LTQtdC70q/Sr9C006kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YvRiNC6INGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDQvdGDINGC0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QvtGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0KLRi9C90LTRi9GA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0LnRi9C/INC606nRgNGB06nRgtKv0q8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0YvQudGL0YjRgtGL0YDRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JDQu9GM0LHQvtC8INC80YPQutCw0LHQsNGB0YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0q7QvdC00q8g0LrQsNGC0YPRg9C70LDRgtGD0YPRh9GDINGB0YvQtNGL0YDQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQkdC40YAg0LTQsCDQvNC10LTQuNCwINGE0LDQudC7INGC0LDQvdC00LDQu9Cz0LDQvSDQttC+0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCt0Ycg0LzQsNCw0LvRi9C80LDRgiDQttC+0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGL0LvRg9GD0LTQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWYxZTFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIE1lZGlhUm91dGVDb250cm9sbGVyJ3Mgdm9sdW1lIGdyb3VwIGxpc3QgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBNYXhpbXVtIGhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgbGlzdC4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCI+MTMyZHA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHZvbHVtZSBncm91cCBpdGVtLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCI+NjFkcDwvZGltZW4+Ci0gICAgPCEtLSBTaXplIG9mIGFuIGl0ZW0ncyBpY29uLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSI+MThkcDwvZGltZW4+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzM3ZGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lql4Lqw4Lqa4Lq74LqaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC6reC6uOC6m+C6sOC6geC6reC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC6m+C6uOC7iOC6oeKAi+C6hOC6suKAi+C6quKAi+C6l+C7jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC6m+C6uOC7iOC6oeC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mS4g4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuI4LuB4Lql4LuJ4LqnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6geC6s+C6peC6seC6h+C7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguqrgurvgu4jguofguqrgurHgupnguo3gurLgupnguqvgurIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguoHgurPguqXgurHguofigIvguorguq3guoHigIvguqvgurLigIvguq3gurjigIvgupvgurDigIvguoHguq3gupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lqi4Lq44LqU4LqB4Lqy4LqZ4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgupvgurTgupQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguqvgurzgurTgu4ngupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC6ouC6uOC6lOC6iuC6u+C7iOC6p+C6hOC6suC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC6ouC6uOC6lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC6guC6sOC6q+C6jeC6suC6jSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lqr4LqN4LuN4LuJ4Lql4Lq74LqHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Luc4LuJ4Lqy4Lqb4Lq74LqB4Lqt4Lqw4Lql4Lqw4Lqa4LuN4LuJ4LqyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC6leC6u+C6p+C6m+C6seC6muC6peC6sOC6lOC6seC6muC6quC6veC6hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Lqa4LuN4LuI4oCL4LuE4LqU4LuJ4oCL4LuA4Lql4Lq34Lqt4LqB4oCL4Lqh4Lq14oCL4LuA4LqU4LqN4oCL4LuD4LqU4oCL4LuE4Lqn4LuJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguprgu43gu4jigIvguqHgurXigIvguoLgu43gu4nigIvguqHgurngupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC6geC6suC6meC6quC6u+C7iOC6h+C6nuC6suC6muC7nOC7ieC6suC6iOC7jSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwMzZkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IsSucmVuZ2luaWFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUGVyZGF2aW1vIG15Z3R1a2FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUGVyZGF2aW1vIG15Z3R1a2FzLiBBdHNpanVuZ3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQZXJkYXZpbW8gbXlndHVrYXMuIFByaXNpanVuZ2lhbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUGVyZGF2aW1vIG15Z3R1a2FzLiBQcmlzaWp1bmd0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQZXJkdW90aSDEryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJhbmRhbWkgxK9yZW5naW5pYWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXRqdW5ndGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdXN0YWJkeXRpIHBlcmRhdmltxIUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlXFvmRhcnl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlaXN0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUHJpc3RhYmR5dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdXN0YWJkeXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iScWhc2tsZWlzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN1dHJhdWt0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtbyB2aXLFoWVsaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iR2Fyc3VtbyDFoWxpYXXFvmlrbGlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZXBhc2lyaW5rdGEgam9raWEgbWVkaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqYSBuZXBhc2lla2lhbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBlcmR1b2RhbWFzIGVrcmFuYXMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDA2M2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdMSTbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iSWVyxKtjZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJBcHJhaWRlcyBwb2dhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQXByYWlkZXMgcG9nYS4gU2F2aWVub2p1bXMgcMSBcnRyYXVrdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkFwcmFpZGVzIHBvZ2EuIE5vdGllayBzYXZpZW5vanVtYSBpenZlaWRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkFwcmFpZGVzIHBvZ2EuIFNhdmllbm9qdW1zIGl6dmVpZG90cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJBcHJhaWTEq8WhYW5hIHV6IGllcsSrY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJOb3RpZWsgaWVyxKvEjXUgbWVrbMSTxaFhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXR2aWVub3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcHR1csSTdCBhcHJhaWRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJBaXp2xJNydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkF0c2thxYZvdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iQXB0dXLEk3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcHR1csSTdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikl6dsSTcnN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYWvEvGF1dCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYSB2xIFjacWGxaEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2thxLx1bWEgc2zEq2RuaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5hdiBhdGxhc8SrdGkgbXVsdGl2aWRlcyBmYWlsaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmF2IHBpZWVqYW1hIGluZm9ybcSBY2lqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iTm90aWVrIGVrcsSBbmEgYXByYWlkZSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkZWUzNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgNC10LTQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L7Qv9GH0LXRgtC+INC30LAgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQmNGB0LrQu9GD0YfQtdC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQodC1INC/0L7QstGA0LfRg9Cy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvtC/0YfQtSDQt9CwIENhc3QuINCf0L7QstGA0LfQsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JXQvNC40YLRg9Cy0LDRmCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KHQtSDQsdCw0YDQsNCw0YIg0YPRgNC10LTQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQmNGB0LrQu9GD0YfQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L7Qv9GA0Lgg0LPQviDQtdC80LjRgtGD0LLQsNGa0LXRgtC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCg0LXQv9GA0L7QtNGD0YbQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QsNGD0LfQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L7Qv9GA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQn9GA0L7RiNC40YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQvtCx0LXRgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JrQvtGA0LjRhtCwINC90LAg0LDQu9Cx0YPQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQm9C40LfQs9Cw0Ycg0LfQsCDRmNCw0YfQuNC90LAg0L3QsCDQt9Cy0YPQuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3QtSDRgdC1INC40LfQsdGA0LDQvdC4INC80LXQtNC40YPQvNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsCDQtNC+0YHRgtCw0L/QvdC4INC40L3RhNC+0YDQvNCw0YbQuNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90L7RgiDRgdC1INC10LzQuNGC0YPQstCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDkxNGI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC0uOC0v+C0uOC1jeC0seC1jeC0seC0giI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgtIngtKrgtJXgtLDgtKPgtJngtY3gtJngtb4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgtJ/gtL7gtKrgtY3gtKrgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtLXgtL/gtJrgtY3gtJvgtYfgtKbgtL/gtJrgtY3gtJrgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1jSDgtKzgtJ/gtY3gtJ/gtbouIOC0leC0o+C0leC1jeKAjOC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtJXgtKPgtJXgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtKTgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LSH4LSk4LS/4LSy4LWH4LSV4LWN4LSV4LWNIOC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC0ieC0quC0leC0sOC0o+C0meC1jeC0meC1viDgtJXgtKPgtY3gtJ/gtYbgtKTgtY3gtKTgtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LS14LS/4LSa4LWN4LSb4LWH4LSm4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LW9IOC0qOC0v+C1vOC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LSF4LS14LS44LS+4LSo4LS/4LSq4LWN4LSq4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LSq4LWN4LSy4LWHIOC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LSk4LW94LSV4LWN4LSV4LS+4LSy4LSCIOC0qOC0v+C1vOC0pOC1jeC0pOC1giI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC0qOC0v+C0sOC1jeKAjeC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC0teC0v+C0leC0uOC0v+C0quC1jeC0quC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LSa4LWB4LSw4LWB4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LSG4LW94LSs4LSCIOC0huC1vOC0n+C1jeC0n+C1jSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgtLXgtYvgtLPgtL/gtK/gtIIg4LS44LWN4LSy4LWI4LSh4LW8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgtK7gtYDgtKHgtL/gtK/gtK/gtYrgtKjgtY3gtKjgtYHgtIIg4LSk4LS/4LSw4LSe4LWN4LSe4LWG4LSf4LWB4LSk4LWN4LSk4LS/4LSf4LWN4LSf4LS/4LSy4LWN4LSyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtLXgtL/gtLXgtLDgtJngtY3gtJngtLPgtYrgtKjgtY3gtKjgtYHgtIIg4LSy4LSt4LWN4LSv4LSu4LSy4LWN4LSyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgtLjgtY3igIzgtJXgtY3gtLDgtYDgtbsg4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg3YzkyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQotOp0YXTqdOp0YDTqdC80LbSr9Kv0LQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQodCw0LvRgdCw0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQpdC+0LvQsdC+0LYg0LHQsNC50L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KXQvtC70LHQvtCz0LTRgdC+0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JTQsNC80LbRg9GD0LvQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLTqdGF06nTqdGA06nQvNC2INGF0LDQudC2INCx0LDQudC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0KHQsNC70LPQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0JTQsNC80LbRg9GD0LvQsNGF0YvQsyDQt9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0KXQsNCw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQotC+0LPQu9GD0YPQu9Cw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCi0q/RgCDQt9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCX0L7Qs9GB0L7QvtGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JTRjdC70LPRjdGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQpdGD0YDQsNCw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQptC+0LzQs9C40LnQvSDQt9GD0YDQsNCzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCU0YPRg9C90Ysg0YLSr9Cy0YjQuNC9INGC0LDQsNGA0YPRg9C70LDQs9GHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQr9C80LDRgCDRhyDQvNC10LTQuNCwINGB0L7QvdCz0L7QvtCz0q/QuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0JzRjdC00Y3RjdC70Y3QuyDQsdCw0LnRhdCz0q/QuSDQsdCw0LnQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQlNGN0LvQs9GN0YbQuNC50LMg0LTQsNC80LbRg9GD0LvQtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZiZWJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSs4KSf4KSjIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSh4KS/4KS44KWN4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpK/gpL7gpLXgpLAg4KSV4KS+4KS44KWN4KSfIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCljeCkueCkvuCkh+CkuOClh+CkuCDgpLbgpYvgpKfgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkoeCkv+CkuOCljeKAjeCkleCkqOClh+CkleCljeKAjeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KSj4KWHIOCkpeCkvuCkguCkrOCkteCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkquCljeCksuClhyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCkteCkv+CksOCkvuCkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCkpeCkvuCkguCkrOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOClg+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkuOCkguCkleClgeCkmuCkv+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpIXgpLLgpY3gpKzgpK4g4KSV4KSy4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteCljeCkueClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpK/gpKHgpLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkruClgOCkoeCkv+Ckr+CkviDgpKjgpL/gpLXgpKHgpLLgpL4g4KSo4KS+4KS54KWAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJXgpYvgpKPgpKTgpYDgpLngpYAg4KSu4KS+4KS54KS/4KSk4KWAIOCkieCkquCksuCkrOCljeCkpyDgpKjgpL7gpLngpYAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3igI3gpJ8g4KSV4KSw4KSkIOCkhuCkueClhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1ZTQ4MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUGVyYW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dGFuZyBIYW50YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRhbmcgaGFudGFyLiBTYW1idW5nYW4gZGlwdXR1c2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0YW5nIGhhbnRhci4gTWVueWFtYnVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRhbmcgaGFudGFyLiBEaXNhbWJ1bmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSGFudGFyIGtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTWVuY2FyaSBwZXJhbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkJlcmhlbnRpIG1lbmdoYW50YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTWFpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSmVkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlcmhlbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iS2VtYmFuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUnVudHVoa2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2VuaSBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQZWx1bmN1ciBrZWxhbnRhbmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlhZGEgbWVkaWEgZGlwaWxpaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTWFrbHVtYXQgdGlkYWsgdGVyc2VkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik1lbmdoYW50YXIgc2tyaW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2Q4MDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4YCF4YCU4YCF4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGAheGAgOGAuuGAleGAheGAueGAheGAiuGAuuGAuOGAmeGAu+GArOGAuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGAgOGArOGAheGAuuGAkOGAuuGAnOGAr+GAleGAuuGAm+GAlOGAuiDhgIHhgJzhgK/hgJDhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCZ4YCR4YCs4YC44YCV4YCrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCU4YCx4YCe4YCK4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGAgOGArOGAheGAuuGAgeGAnOGAr+GAkOGAuuGBiyDhgIHhgLvhgK3hgJDhgLrhgIbhgIDhgLrhgJHhgKzhgLjhgJ7hgIrhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4YCA4YCs4YCF4YC64YCc4YCv4YCV4YC64YCb4YCU4YC6IOGAheGAgOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGAheGAgOGAuuGAleGAheGAueGAheGAiuGAuuGAuOGAmeGAu+GArOGAuCDhgJvhgL7hgKzhgJbhgL3hgLHhgIHhgLzhgIThgLrhgLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YCG4YCA4YC64YCe4YC94YCa4YC64YCZ4YC+4YCvIOGAluGAvOGAkOGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGAgOGArOGAheGAuuGAnOGAr+GAleGAuuGAgeGAvOGAhOGAuuGAuCDhgJvhgJXhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGAleGAreGAkOGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGAluGAveGAhOGAt+GAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YCB4YCP4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4YCW4YC84YCU4YC34YC64YCB4YC74YCb4YCU4YC64YGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhgIHhgLHhgKvhgIDhgLrhgJ7hgK3hgJnhgLrhgLjhgJvhgJThgLouLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhgKHhgJrhgLrhgJzhgLrhgJjhgJnhgLrhgJXhgK/hgLYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4YCh4YCe4YC24YCh4YCQ4YCt4YCv4YC44YCh4YCA4YC74YCa4YC64YCB4YC74YCt4YCU4YC64YCe4YCK4YC34YC6IOGAhuGAnOGAreGAr+GAgOGAuuGAkuGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4YCZ4YCK4YC64YCe4YCK4YC34YC64YCZ4YCu4YCS4YCu4YCZ4YC+IOGAmeGAm+GAveGAseGAuOGAgeGAu+GAmuGAuuGAkeGArOGAuOGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4YCh4YCB4YC74YCA4YC64YCh4YCc4YCA4YC6IOGAmeGAm+GAm+GAvuGAreGAlOGAreGAr+GAhOGAuuGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4YCQ4YCK4YC64YC44YCW4YC84YCQ4YC64YCb4YCx4YC4IOGAmeGAu+GAgOGAuuGAlOGAvuGArOGAleGAvOGAhOGAuiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3NjRjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWtvbmV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwcGVuLiBGcmFrb2JsZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcHBlbi4gS29ibGVyIHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIFRpbGtvYmxldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlPDuGtlciBldHRlciBlbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvYmxlIGZyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3BwIGNhc3RpbmdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxsIGF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTZXR0IHDDpSBwYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXR2aWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWtrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaWRlYnJ5dGVyIGZvciB2b2x1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRHUgaGFyIGlra2UgdmFsZ3Qgbm9lbiBtZWRpZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZ2VuIGluZm9ybWFzam9uIGVyIHRpbGdqZW5nZWxpZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGVyIHNramVybWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkquCljeCksOCko+CkvuCksuClgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpIngpKrgpJXgpLDgpKPgpLngpLDgpYIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IOCkrOCkn+CkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpLXgpL/gpJrgpY3gpJvgpYfgpKYg4KSt4KSv4KWLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KS54KWB4KSB4KSm4KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpK3gpK/gpYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS44KSu4KS+IENhc3Qg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KSv4KSo4KWN4KSk4KWN4KSw4KS54KSw4KWCIOCkquCkpOCljeCkpOCkviDgpLLgpJfgpL7gpIngpIHgpKbgpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KS14KS/4KSa4KWN4KSb4KWH4KSmIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ImNhc3Rpbmcg4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpKjgpY3gpKYg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSs4KSc4KS+4KSJ4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpL7gpLAg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpY3gpLfgpL/gpKrgpY3gpKQg4KSq4KS+4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSP4KSy4KWN4KSs4KSuIOCkhuCksOCljeCknyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpK3gpYvgpLLgpY3gpK/gpYHgpK7gpJXgpYsg4KS44KWN4KSy4KS+4KSH4KSh4KSwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpJXgpYHgpKjgpYgg4KSu4KS/4KSh4KS/4KSv4KS+IOCkmuCkr+CkqCDgpK3gpI/gpJXgpYsg4KSb4KWI4KSoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSJ4KSq4KSy4KSs4KWN4KSnIOCkm+CliOCkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KS/4KSoIGNhc3Qg4KSX4KSw4KWN4KSm4KWIIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRmNjJkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJhdGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1pY29vbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QtaWNvb24uIFZlcmJpbmRpbmcgdmVyYnJva2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWljb29uLiBWZXJiaW5kaW5nIG1ha2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QtaWNvb24uIFZlcmJvbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0ZW4gbmFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkFwcGFyYXRlbiB6b2VrZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTG9za29wcGVsZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJDYXN0ZW4gc3RvcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU2x1aXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkFmc3BlbGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJPbmRlcmJyZWtlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVaXR2b3V3ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhbWVudm91d2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ob2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZXNjaHVpZnJlZ2VsYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJHZWVuIG1lZGlhIGdlc2VsZWN0ZWVyZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iR2VlbiBpbmZvcm1hdGllIGJlc2NoaWtiYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTY2hlcm0gY2FzdGVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjVkZjcxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCouOCov+CouOCon+CoriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgqKHgqL/gqLXgqL7gqIjgqLjgqL7gqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4KioIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOCol+Cov+CohiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOConOCoviDgqLDgqL/gqLngqL4g4Ki54KmIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KiP4Kil4KmHIOColeCovuCouOConyDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgqKHgqYDgqLXgqL7gqIjgqLjgqL7gqIIg4Kio4KmC4KmwIOCosuCpseCoreCov+CohiDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KiV4Ki+4Ki44KifIOColeCosOCoqOCoviDgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kiq4Kiy4KmHIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kiw4KmL4KiV4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCoteCov+CouOCopOCovuCosCDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgqJDgqLLgqKzgqK4g4KiG4Kiw4KifIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCoteCpjOCosuCor+CpguCoriDgqLjgqLLgqL7gqIjgqKHgqLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuColeCpi+CoiCDgqLXgqYAg4Kiu4KmA4Kih4KmA4KiGIOCoqOCoueCpgOCogiDgqJrgqYHgqKPgqL/gqIYg4KiX4Ki/4KiGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgqJXgqYvgqIgg4Kic4Ki+4Kij4KiV4Ki+4Kiw4KmAIOCoieCoquCosuCorOCopyDgqKjgqLngqYDgqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCouOColeCpjeCosOCpgOCoqCDgqJzgqYvgqZwg4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5MmE2ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJ6xIVkemVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQcnp5Y2lzayBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBSb3rFgsSFY3pvbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gxYHEhWN6xJkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBQb8WCxIVjem9ubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcnplc3nFgmFqIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iWm5hamRvd2FuaWUgdXJ6xIVkemXFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZMWCxIVjeiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdHJ6eW1haiBwcnplc3nFgmFuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphbWtuaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPZHR3w7NyeiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iV3N0cnp5bWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF0cnp5bWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96d2nFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWndpxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPa8WCYWRrYSBhbGJ1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU3V3YWsgZ8WCb8Wbbm/Fm2NpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgd3licmFubyBtdWx0aW1lZGnDs3ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJyYWsgaW5mb3JtYWNqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJ6ZXN5xYJhbSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M2MTlkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjBhNjFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFRyYW5zbWl0aXIuIERlc2xpZ2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w6NvIFRyYW5zbWl0aXIuIEEgbGlnYXIuLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFRyYW5zbWl0aXIuIExpZ2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBIGxvY2FsaXphciBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzYXNzb2NpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQYXJhciBhIHRyYW5zbWlzc8OjbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVjaGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWR1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VtIGRvIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sbyBkZSBkZXNsaXplIGRvIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVuaHVtIHN1cG9ydGUgbXVsdGltw6lkaWEgc2VsZWNpb25hZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbmh1bWEgaW5mb3JtYcOnw6NvIGRpc3BvbsOtdmVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJBIHRyYW5zbWl0aXIgbyBlY3LDoyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNjE5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViYjJmNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG96aXRpdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIERlY29uZWN0YXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gU2UgY29uZWN0ZWF6xIMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBDb25lY3RhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcm9pZWN0YcibaSBwZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNlIGNhdXTEgyBkaXNwb3ppdGl2ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZWNvbmVjdGHIm2ktdsSDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iTnUgbWFpIHByb2llY3RhyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLDjm5jaGlkZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlZGHIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IsOObnRyZXJ1cGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJPcHJpyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXh0aW5kZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVzdHLDom5nZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkdyYWZpY2EgYWxidW11bHVpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaXNvciBwZW50cnUgdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pY2l1biBmaciZaWVyIG1lZGlhIHNlbGVjdGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdSBzdW50IGRpc3BvbmliaWxlIGluZm9ybWHIm2lpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTZSBwcm9pZWN0ZWF6xIMgZWNyYW51bCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0NjJkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L7RgtC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbQuNC4LiDQo9GB0YLRgNC+0LnRgdGC0LLQviDQv9C+0LTQutC70Y7Rh9Cw0LXRgtGB0Y8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQtdC90L4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCS0YvQsdC10YDQuNGC0LUg0YPRgdGC0YDQvtC50YHRgtCy0L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0LjRgdC6INGD0YHRgtGA0L7QudGB0YLQsuKApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQntGC0LrQu9GO0YfQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LXQutGA0LDRgtC40YLRjCDRgtGA0LDQvdGB0LvRj9GG0LjRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQktC+0YHQv9GA0L7QuNC30LLQtdGB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/RgNC40L7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQntGB0YLQsNC90L7QstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QsdC70L7QttC60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0KDQtdCz0YPQu9GP0YLQvtGAINCz0YDQvtC80LrQvtGB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00LjQsNGE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQlNCw0L3QvdGL0YUg0L3QtdGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQn9C+0LTQutC70Y7Rh9C10L3QuNC1INC6INGD0LTQsNC70LXQvdC90L7QvNGDINC80L7QvdC40YLQvtGA0YMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NWNlNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4La04Lav4LeK4Law4Lat4LeS4La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC2i+C2tOC3j+C2guC2nCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4LiDgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74LaxIOC2veC2r+C3kyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uCDgt4Pgtrjgt4rgtrbgtrHgt4rgtrAg4Laa4La74La44LeS4Lax4LeKIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgg4LeD4La44LeK4La24Lax4LeK4LawIOC2muC2u+C2sSDgtr3gtq/gt5MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LeA4LeS4Laa4LeP4LeB4La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LaL4La04LeP4LaC4LacIOC3g+C3meC3gOC3k+C2uCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LeA4LeS4Laa4LeP4LeBIOC2muC3kuC2u+C3k+C2uCDgtrHgtq3gtrsg4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgt4Dgt4PgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgtrDgt4/gt4DgtrHgtrog4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgt4Dgt5Lgtrvgt4/gtrgg4Lac4Lax4LeK4LeA4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lax4Lat4La7IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC2r+C3kuC2nCDgt4Tgtrvgt5LgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC3hOC2muC3lOC3heC2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC2h+C2veC3iuC2tuC2uCDgtprgtr3gt4/gt4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LeE4LasIOC2tOC2u+C3kuC2uOC3jyDgt4Pgt4rgtr3gtrrgt5LgtqngtrvgtroiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC2uOC3j+C2sOC3iuKAjeC2uuC2uiDgtq3gt53gtrvgt48g4Lax4LeQ4LatIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtr3gtrbgt48g4Lac4LatIOC3hOC3kOC2muC3kiDgtq3gt5zgtrvgtq3gt5Tgtrvgt5Qg4Lax4Lec4La44LeQ4LatIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgt4Dgt5Lgtprgt4/gt4Eg4Lat4LeS4La74La6Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThhYTExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmFyaWFkZW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRsYcSNaWRsbyBwcmVub3N1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVGxhxI1pZGxvIHByZW5vc3UuIE9kcG9qZW7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI1pZGxvIHByZW5vc3UuIFByaXDDoWphIHNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNaWRsbyBwcmVub3N1LiBQcmlwb2plbsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByZW5vcyBkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkjEvmFkYWrDuiBzYSB6YXJpYWRlbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9kcG9qacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2acWlIHByZW7DocWhYW5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF2cmllxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQcmVocmHFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXN0YXZpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJSb3piYWxpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlpiYWxpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPYnLDoXpvayBhbGJ1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUG9zw7p2YcSNIGhsYXNpdG9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pZSBzw7ogdnlicmFuw6kgxb5pYWRuZSBtw6lkacOhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOaWUgc8O6IGvCoGRpc3BvesOtY2lpIMW+aWFkbmUgaW5mb3Jtw6FjaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZW7DocWhYSBzYSBvYnJhem92a2EiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTRjZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Ik5hcHJhdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIHByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgcHJla2luamVuYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFZ6cG9zdGF2bGphbmplIHBvdmV6YXZlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIHByZWR2YWphbmplLiBQb3ZlemF2YSBqZSB2enBvc3RhdmxqZW5hLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVkdmFqYW5qZSBwcmVrOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iklza2FuamUgbmFwcmF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgcG92ZXphdm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJVc3RhdmkgcHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphcHJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUmF6xaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN0cm5pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRHJzbmlrIHphIGdsYXNub3N0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaSBpemJyYW5lIHByZWRzdGF2bm9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlBvZGF0a2kgbmlzbyBuYSB2b2xqbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlZHZhamFuamUgemFzbG9uYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2ZTExMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBhamlzamV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b25pIGkgdHJhbnNtZXRpbWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b25pIGkgdHJhbnNtZXRpbWl0LiBKZSBpIHNoa8OrcHV0dXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gUG8gbGlkaGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gSmUgaSBsaWRodXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtZXRvIHRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUG8ga8OrcmtvbiBwYWppc2plIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNoa8OrcHV0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik5kYWxvIHRyYW5zbWV0aW1pbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWJ5bGwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMdWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6w6siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJOZGFsbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlpnamVyb2plIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJQYWxvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJLb3BlcnRpbmEgZSBhbGJ1bWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlJyw6tzaHFpdMOrc2kgaSB2b2x1bWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOdWsgdSB6Z2pvZGggYXNuasOrIG1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdWsgamVwZXQgYXNuasOrIGluZm9ybWFjaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQbyB0cmFuc21ldG9uIGVrcmFuaW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWJhZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YDQtdGS0LDRmNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCS0LXQt9CwINGY0LUg0L/RgNC10LrQuNC90YPRgtCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQn9C+0LLQtdC30YPRmNC1INGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0J/QvtCy0LXQt9Cw0L0g0ZjQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQn9GA0LXQsdCw0YbRg9GYINC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9GA0L7QvdCw0LvQsNC20LXRmtC1INGD0YDQtdGS0LDRmNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCf0YDQtdC60LjQvdC4INCy0LXQt9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0JfQsNGD0YHRgtCw0LLQuCDQv9GA0LXQsdCw0YbQuNCy0LDRmtC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCf0YPRgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0LDRg9C30LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQl9Cw0YPRgdGC0LDQstC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0J/RgNC+0YjQuNGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0LrRg9C/0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntC80L7RgiDQsNC70LHRg9C80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JrQu9C40LfQsNGHINC30LAg0ZjQsNGH0LjQvdGDINC30LLRg9C60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0LXQvNCwINC40LfQsNCx0YDQsNC90LjRhSDQvNC10LTQuNGY0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0LjRgdGDINC00L7RgdGC0YPQv9C90LUg0L3QuNC60LDQutCy0LUg0LjQvdGE0L7RgNC80LDRhtC40ZjQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0J/RgNC10LHQsNGG0YPRmNC1INGB0LUg0LXQutGA0LDQvSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3ZDNlMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnLDpW5rb3BwbGFkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qta25hcHBlbi4gQW5zbHV0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGEgdGlsbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxldGFyIGVmdGVyIGVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS29wcGxhIGZyw6VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU2x1dGEgY2FzdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN0w6RuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwZWxhIHVwcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdmJyeXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVdMO2a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IktvbXByaW1lcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTa2l2b21zbGFnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHltcmVnbGFnZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSW5nYSBtZWRpYSBoYXIgdmFsdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRldCBmaW5ucyBpbmdlbiBpbmZvcm1hdGlvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2vDpHJtZW4gY2FzdGFzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYyY2IxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ik1mdW1vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlZpZmFhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iS2l0dWZlIGNoYSBrdXR1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZW9uZG9sZXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2luYXVuZ2FuaXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZXVuZ2FuaXNod2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHVtYSBrd2VueWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJbmF0YWZ1dGEgdmlmYWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT25kb2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBY2hhIGt1dHVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRnVuZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJDaGV6YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2l0aXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlNpbWFtaXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlBhbnVhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLdW5qYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNhbmFhIHlhIGFsYmFtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLaXRlbGV6aSBjaGEgc2F1dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhha3VuYSBtYXVkaHVpIHlhbGl5b2NoYWd1bGl3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGFrdW5hIG1hZWxlem8geWFsaXlvcGF0aWthbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkluYXR1bWEgc2tyaW5pIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDIzNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1ham9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIGxhbmRzY2FwZSkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWFqb3IiPjYwJTwvaXRlbT4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtaW5vciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBwb3J0cmFpdCkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IiPjkwJTwvaXRlbT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRhYjhkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj41MCU8L2l0ZW0+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj43MCU8L2l0ZW0+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTc4ZjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4K6a4K6/4K644K+N4K6f4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCupOCuv+CusOCviOCur+Cuv+Cun+CvgSDgrqrgrp/gr43grp/grqngr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrqTgr4HgrqPgr43grp/grr/grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCupOCusuCvjSDgrqrgr4rgrqTgr43grqTgrr7grqngr40uIOCuh+Cuo+CviOCuleCvjeCuleCuv+CuseCupOCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrofgrqPgr4jgrpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4K6H4K6k4K6x4K+N4K6V4K+BIOCuheCuqeCvgeCuquCvjeCuquCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CviOCupOCvjSDgrqTgr4fgrp/gr4HgrpXgrr/grrHgrqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4K6k4K+K4K6f4K6w4K+N4K6q4K+I4K6k4K+NIOCupOCvgeCuo+CvjeCun+CuvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCuteCupOCviCDgrqjgrr/grrHgr4HgrqTgr43grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCuruCvguCun+CvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCuh+Cur+CuleCvjeCuleCvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4K6H4K6f4K+I4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K614K6k4K6x4K+N4K6V4K6+4K6pIOCuquCviuCupOCvjeCupOCuvuCuqeCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCuteCuv+CusOCuv+CuteCuvuCuleCvjeCuleCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4K6a4K+B4K6w4K+B4K6V4K+N4K6V4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4K6G4K6y4K+N4K6q4K6u4K+NIOCuhuCusOCvjeCun+CvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgrpLgrrLgrr/grq/grrPgrrXgr4Eg4K644K+N4K6y4K+I4K6f4K6w4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgrq7gr4Dgrp/grr/grq/grr4g4K6O4K6k4K+B4K614K+B4K6u4K+NIOCupOCvh+CusOCvjeCuqOCvjeCupOCvhuCun+CvgeCuleCvjeCuleCuquCvjeCuquCun+CuteCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4K6k4K6V4K614K6y4K+NIOCujuCupOCvgeCuteCvgeCuruCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4K6k4K6/4K6w4K+I4K6v4K+IIOCuheCuqeCvgeCuquCvjeCuquCvgeCuleCuv+CuseCvgOCusOCvjeCuleCus+CvjSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzMTJlMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgsLjgsL/gsLjgsY3gsJ/gsK7gsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LCq4LCw4LC/4LCV4LCw4LC+4LCy4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LCq4LGN4LCw4LC44LC+4LCw4LCCIOCwmuCxh+Cwr+CwvyDgsKzgsJ/gsKjgsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsKHgsL/gsLjgsY3igIzgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LCs4LCh4LC/4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LC44LGN4LCk4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCwquCxjeCwsOCwuOCwvuCwsCDgsKzgsJ/gsKjgsY0uIOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsKzgsKHgsL/gsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LCm4LGA4LCo4LC/4LCV4LC/IOCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsK/gsILgsKHgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgsKrgsLDgsL/gsJXgsLDgsL7gsLLgsKjgsYEg4LCV4LCo4LGB4LCX4LGK4LCC4LCf4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCwoeCwv+CwuOCxjeKAjOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgsKrgsY3gsLDgsLjgsL7gsLDgsL7gsKjgsY3gsKjgsL8g4LCG4LCq4LC/4LC14LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgsK7gsYLgsLjgsL/gsLXgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgsKrgsY3gsLLgsYcg4LCa4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgsKrgsL7gsJzgsY0g4LCa4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4LCG4LCq4LC/4LC14LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LC14LC/4LC44LGN4LCk4LCw4LC/4LCC4LCq4LCc4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgsJXgsYHgsKbgsL/gsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgsIbgsLLgsY3gsKzgsK7gsY0g4LCG4LCw4LGN4LCf4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCwteCwvuCwsuCxjeCwr+CxguCwruCxjSDgsLjgsY3gsLLgsK/gsL/gsKHgsLDgsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCwruCxgOCwoeCwv+Cwr+CwviDgsI/gsKbgsYAg4LCO4LCC4LCa4LGB4LCV4LGL4LCs4LCh4LCy4LGH4LCm4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgsLjgsK7gsL7gsJrgsL7gsLDgsIIg4LCF4LCC4LCm4LGB4LCs4LC+4LCf4LGB4LCy4LGLIOCwsuCxh+CwpuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LC44LGN4LCV4LGN4LCw4LGA4LCo4LGN4oCM4LCo4LGBIOCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsLjgsY3gsKTgsYvgsILgsKbgsL8iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYThhZTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lij4Liw4Lia4LiaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiDguIHguLPguKXguLHguIfguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4Lit4LmB4Lil4LmJ4LinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC5geC4hOC4quC4leC5jOC5hOC4m+C4ouC4seC4hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC4geC4s+C4peC4seC4h+C4hOC5ieC4meC4q+C4suC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLguKLguIHguYDguKXguLTguIHguIHguLLguKPguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLguKvguKLguLjguJTguYHguITguKrguJXguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC4m+C4tOC4lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC5gOC4peC5iOC4mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Lir4Lii4Li44LiU4LiK4Lix4LmI4Lin4LiE4Lij4Liy4LinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lir4Lii4Li44LiUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LiC4Lii4Liy4LiiIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLguKLguLjguJoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLguJvguIHguK3guLHguKXguJrguLHguYnguKEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LmB4LiW4Lia4LmA4Lil4Li34LmI4Lit4LiZ4Lib4Lij4Lix4Lia4Lij4Liw4LiU4Lix4Lia4LmA4Liq4Li14Lii4LiHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLguYTguKHguYjguYTguJTguYnguYDguKXguLfguK3guIHguKrguLfguYjguK3guYTguKfguYkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC5hOC4oeC5iOC4oeC4teC4guC5ieC4reC4oeC4ueC4pSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LiB4Liz4Lil4Lix4LiH4LmB4LiE4Liq4LiV4LmM4Lir4LiZ4LmJ4Liy4LiI4LitIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJlM2QwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJNZ2EgRGV2aWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0dG9uIG5hIEktY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dHRvbiBuYSBJLWNhc3QuIE5hZGlza29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0dG9uIG5hIEktY2FzdC4gS3Vtb2tvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0dG9uIG5hIEktY2FzdC4gTmFrYWtvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSS1jYXN0IHNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTmFnaGFoYW5hcCBuZyBtZ2EgZGV2aWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IklkaXNrb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSWhpbnRvIGFuZyBwYWctY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXNhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJJLXBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkktcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJaGludG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQYWxhd2FraW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkktY29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2xpZGVyIG5nIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iV2FsYW5nIHBpbmlsaW5nIG1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJXYWxhbmcgYXZhaWxhYmxlIG5hIGltcG9ybWFzeW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLaW5hLWNhc3QgYW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmNjM5Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW5sYSBkw7zEn21lc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJZYXnEsW5sYSBkw7zEn21lc2kuIEJhxJ9sYW50xLEga2VzaWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFuxLF5b3IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFuZMSxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IsWedXJheWEgeWF5xLFubGE6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQ2loYXpsYXIgYnVsdW51eW9yIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkJhxJ9sYW50xLF5xLEga2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWWF5xLFuxLEgZHVyZHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJLYXBhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik95bmF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJEdXJha2xhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkR1cmR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkdlbmnFn2xldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iRGFyYWx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxiw7xtIGthcGHEn8SxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNlcyBkw7x6ZXlpIGtheWTEsXJtYSDDp3VidcSfdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTWVkeWEgc2XDp2lsbWVkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQmlsZ2kgeW9rIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhbiB5YXnEsW5sYW7EsXlvciI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkMzY1ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQn9GA0LjRgdGC0YDQvtGXIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQktGW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC90Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQn9GW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70Y7QstCw0YLQuCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtGI0YPQuiDQv9GA0LjRgdGC0YDQvtGX0LIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JLRltC00LrQu9GO0YfQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LjQv9C40L3QuNGC0Lgg0YLRgNCw0L3RgdC70Y/RhtGW0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLRltC00YLQstC+0YDQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC30YPQv9C40L3QuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQn9GA0LjQv9C40L3QuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNC+0LfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQutC70LDQtNC40L3QutCwINCw0LvRjNCx0L7QvNGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0L7QstC30YPQvdC+0Log0LPRg9GH0L3QvtGB0YLRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00ZbQsC3RhNCw0LnQuyDQvdC1INCy0LjQsdGA0LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsNGUINC00LDQvdC40YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YDQsNC90YHQu9GP0YbRltGPINC10LrRgNCw0L3QsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyYzU5OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYs9iz2bnZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYotmE2KfYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDYutuM2LEg2YXZhtiz2YTaqSDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HZiCDYsduB2Kcg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLYp9izINmF24zauiDaqdin2LPZuSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itii2YTYp9iqINiq2YTYp9i0INuB2Ygg2LHbgduSINuB24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLYutuM2LEg2YXZhtiz2YTaqSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Itqp2KfYs9m5INqp2LHZhtinINio2YbYryDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KjZhtivINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2obZhNin2KbbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdmI2YLZiNmBINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2LHZiNqp24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itm+2r7bjNmE2KfYptuM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Itiz2qnbjNqR24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itin2YTYqNmFINii2LHZuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLZiNin2YTbjNmI2YUg2LPZhNin2KbbjNqI2LEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itqp2YjYptuMINmF24zaiNuM2Kcg2YXZhtiq2K7YqCDZhtuB24zauiDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLaqdmI2KbbjCDZhdi52YTZiNmF2KfYqiDYr9iz2KrbjNin2Kgg2YbbgduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiz2qnYsduM2YYg2qnYp9iz2bkg24HZiCDYsduB24wg24HbkiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMDgxNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJUaXppbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJRdXJpbG1hbGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVXppbGRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVWxhbm1vcWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpLiBVbGFuZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUXV5aWRhZ2lnYSB0cmFuc2xhdHNpeWEgcWlsaXNoOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlF1cmlsbWFsYXJuaSB0b3Bpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iVWxhbmlzaG5pIHV6aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVHJhbnNsYXRzaXlhbmkgdG/igJh4dGF0aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJZb3Bpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJCb3NobGFzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iVG/igJh4dGF0aWIgdHVyaXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVG/igJh4dGF0aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWW95aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJZaWfigJhpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBtdXFvdmFzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUb3Z1c2ggYmFsYW5kbGlnaSBzbGF5ZGVyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTXVsdGltZWRpYSB0YW5sYW1hZ2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJIZWNoIHFhbmRheSBtYeKAmWx1bW90IHlv4oCYcSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW5uaSB0cmFuc2xhdHNpeWEgcWlsaXNoIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDk4Y2NhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ikjhu4cgdGjhu5FuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUaGnhur90IGLhu4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJOw7p0IHRydXnhu4FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iTsO6dCB0cnV54buBbi4gxJDDoyBuZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ik7DunQgdHJ1eeG7gW4uIMSQYW5nIGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJ1eeG7gW4gdOG7m2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLEkGFuZyB0w6xtIHRoaeG6v3QgYuG7iyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJOZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJE4burbmcgdHJ1eeG7gW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IsSQw7NuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBow6F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJU4bqhbSBk4burbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJE4burbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJN4bufIHLhu5luZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGh1IGfhu41uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4bqibmggYsOsYSBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUaGFuaCB0csaw4bujdCDDom0gbMaw4bujbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Iktow7RuZyBjw7MgcGjGsMahbmcgdGnhu4duIG7DoG8gxJHGsOG7o2MgY2jhu41uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLaMO0bmcgY8OzIHRow7RuZyB0aW4gbsOgbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4ixJBhbmcgdHJ1eeG7gW4gbcOgbiBow6xuaCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIyZDAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vnu58iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6K6+5aSHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5bCE5oyJ6ZKuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5bCE5oyJ6ZKu44CC5bey5pat5byA6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXlsITmjInpkq7jgILmraPlnKjov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5bCE5oyJ6ZKu44CC5bey6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleWwhOWIsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOafpeaJvuiuvuWkhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmlq3lvIDov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXlsIQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuWFs+mXrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqC5YGcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV5byAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLbotbciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLkuJPovpHlsIHpnaIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5Z2XIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLmnKrpgInmi6nku7vkvZXlqpLkvZMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuayoeacieS7u+S9leebuOWFs+S/oeaBryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5bCE5bGP5bmVIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmU1YzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e1sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLoo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXmlL7mjInpiJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXmlL7mjInpiJXjgILlt7Lop6PpmaTpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleaUvuaMiemIleOAguato+WcqOmAo+aOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXmlL7mjInpiJXjgILlt7LpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5pS+6IezIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5bCL5om+6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6Zec6ZaJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmqvlgZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtuWQiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuWwiOi8r+WwgemdoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5Hmob8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuWwmuacqumBuOaTh+WqkumrlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKS5pyJ6Kmz57Sw6LOH5paZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXmlL7onqLluZUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhZmRlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757WxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleaUvuaMiemIlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleaUvuaMiemIle+8m+W3suS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5pS+5oyJ6YiV77yb6YCj57ea5LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleaUvuaMiemIle+8m+W3sumAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXmlL7liLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjlsIvmib7oo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5Lit5pa36YCj57eaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLpl5zplokiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iuaaq+WBnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS25ZCIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5bCI6Lyv5bCB6Z2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keahvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5pyq6YG45Y+W5Lu75L2V5aqS6auUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmspLmnInlj6/nlKjnmoTos4foqIoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleaUvuieouW5lSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwN2M0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJJc2lzdGltdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBbWFkaXZheWlzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Iklua2lub2JobyB5ZS1DYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1bnFhbnl1bGl3ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1eWF4aHVueXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdXhodW55aXdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNha2F6YSBrdS0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJdGhvbGEgYW1hZGl2YXlpc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTnFhbXVsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik1pc2EgdWt1c2FrYXphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJWYWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iRGxhbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Ik1pc2EgaXNpa2hhc2hhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJNaXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTndlYmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkdvcWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJVYnVjaWtvIGJlLWFsYmhhbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSXNpbGF5aWRhIHNldm9sdW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBeWlraG8gaW1pZGl5YSBla2hldGhpd2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkFsdWtobyB1bHdhemkgb2x1dGhvbGFrYWxheW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IklzaWtyaW5pIHNva3VzYWthemEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTg3MzIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPGludGVnZXItYXJyYXkgbmFtZT0ic3BlZWRfbXVsdGlwbGllZF9ieV8xMDAiPgotICAgICAgICA8aXRlbT4yNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+NTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjc1PC9pdGVtPgotICAgICAgICA8aXRlbT4xMDA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEyNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTUwPC9pdGVtPgotICAgICAgICA8aXRlbT4yMDA8L2l0ZW0+Ci0gICAgPC9pbnRlZ2VyLWFycmF5PgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzcyODViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWVkaWFSb3V0ZUJ1dHRvbiI+Ci0gICAgICAgIDwhLS0gVGhpcyBkcmF3YWJsZSBpcyBhIHN0YXRlIGxpc3Qgd2hlcmUgdGhlICJjaGVja2VkIiBzdGF0ZQotICAgICAgICAgICAgIGluZGljYXRlcyBhY3RpdmUgbWVkaWEgcm91dGluZy4gIENoZWNrYWJsZSBpbmRpY2F0ZXMgY29ubmVjdGluZwotICAgICAgICAgICAgIGFuZCBub24tY2hlY2tlZCAvIG5vbi1jaGVja2FibGUgaW5kaWNhdGVzCi0gICAgICAgICAgICAgdGhhdCBtZWRpYSBpcyBwbGF5aW5nIHRvIHRoZSBsb2NhbCBkZXZpY2Ugb25seS4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgICAgICA8IS0tIFRpbnQgdG8gYXBwbHkgdG8gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblRpbnQiIGZvcm1hdD0iY29sb3IiIC8+Ci0KLSAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5XaWR0aCIgLz4KLSAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5IZWlnaHQiIC8+Ci0gICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KLQotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlVGhlbWUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiYzI5OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxjb2xvciBuYW1lPSJncmF5Ij4jODA4MDgwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0id2hpdGUiPiNmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ3aGl0ZV9vcGFjaXR5XzcwIj4jQjNmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJibGFja19vcGFjaXR5XzcwIj4jQjMwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ0aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiPiM1MDAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9InRpdGxlX2Jhcl9ncmFkaWVudF9lbmQiPiMwMDAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJvdHRvbV9iYXJfYmFja2dyb3VuZCI+IzQwMjAyMDIwPC9jb2xvcj4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdiMDIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBEaWFsb2cgc2l6ZSAtLT4KLSAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj4zMjBkcDwvZGltZW4+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj4zMjBkcDwvZGltZW4+Ci0KLSAgICA8IS0tIE1lZGlhUm91dGVDb250cm9sbGVyJ3Mgdm9sdW1lIGdyb3VwIGxpc3QgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBNYXhpbXVtIGhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgbGlzdC4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCI+Mjg4ZHA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHZvbHVtZSBncm91cCBpdGVtLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCI+NjhkcDwvZGltZW4+Ci0gICAgPCEtLSBTaXplIG9mIGFuIGl0ZW0ncyBpY29uLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9wYWRkaW5nX3RvcCI+MTZkcDwvZGltZW4+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGV4cGFuZC9jb2xsYXBzZSBhbmltYXRpb24gZHVyYXRpb24uIC0tPgotICAgIDxpbnRlZ2VyIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfYW5pbWF0aW9uX2R1cmF0aW9uX21zIj40MDA8L2ludGVnZXI+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGZhZGUgaW4gYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfaW5fZHVyYXRpb25fbXMiPjQwMDwvaW50ZWdlcj4KLSAgICA8IS0tIEdyb3VwIGxpc3QgZmFkZSBvdXQgYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfb3V0X2R1cmF0aW9uX21zIj4yMDA8L2ludGVnZXI+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCI+MTUwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCI+MzZkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIj4yMGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCI+MThkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiPjEyc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiPjEwc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3Nfd2lkdGgiPjIyNWRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCI+NTRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiPjMwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiPjI3ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiPjE2c3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSI+MTNzcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfc2V0dGluZ3Nfb2Zmc2V0Ij44ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciPjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfcGF1c2VfaWNvbl9zaXplIj4zNmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX2ljb25fc2l6ZSI+MjhkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfaWNvbl9zaXplIj4yNGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9taW5pbWFsX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfaWNvbl9tYXJnaW4iPjEwZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIj4yMzJkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9hbGJ1bV9pbWFnZV9sYW5kc2NhcGVfc2l6ZSI+MTc2ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIj4yZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIj4xMmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9idWZmZXJfdmlld19oZWlnaHQiPjVkcDwvZGltZW4+Ci0gICAgPCEtLSBUT0RPOiBhZGp1c3QgYm90dG9tIGJhciB2aWV3IC0tPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTk3YTNiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotCi0gICAgPCEtLSBOYW1lIGZvciB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgcHJpb3IgdG8gSmVsbHliZWFuLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSI+U3lzdGVtPC9zdHJpbmc+Ci0KLSAgICA8IS0tIE5hbWUgZm9yIHRoZSB1c2VyIHJvdXRlIGNhdGVnb3J5IGNyZWF0ZWQgd2hlbiBwdWJsaXNoaW5nIHJvdXRlcyB0byB0aGUgc3lzdGVtIGluIEplbGx5YmVhbiBhbmQgYWJvdmUuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSI+RGV2aWNlczwvc3RyaW5nPgotCi0gICAgPCEtLSBTdHJpbmcgdG8gYmUgc2hvd24gYXMgYSB0b29sdGlwIG9mIE1lZGlhUm91dGVCdXR0b24KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiI+Q2FzdCBidXR0b248L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIG5vIHJlbW90ZSBkZXZpY2UgaXMgY29ubmVjdGVkLgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIj5DYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSBkZXZpY2UuCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIj5DYXN0IGJ1dHRvbi4gQ29ubmVjdGluZzwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoZW4gYSByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIENvbm5lY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBUaXRsZSBvZiB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiPkNhc3QgdG88L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gZGV2aWNlcyBoYXZlIGJlZW4gZm91bmQuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIj5GaW5kaW5nIGRldmljZXM8L3N0cmluZz4KLQotICAgIDwhLS0gQnV0dG9uIHRvIGRpc2Nvbm5lY3QgZnJvbSBhIG1lZGlhIHJvdXRlLiAgW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0Ij5EaXNjb25uZWN0PC9zdHJpbmc+Ci0KLSAgICA8IS0tIEJ1dHRvbiB0byBzdG9wIHBsYXliYWNrIGFuZCBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciPlN0b3AgY2FzdGluZzwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IGRpYWxvZyBjbG9zZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiI+Q2xvc2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwbGF5IGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiPlBsYXk8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwYXVzZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSI+UGF1c2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBzdG9wIGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiPlN0b3A8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBleHBhbmQgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gc2hvd3MgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIj5FeHBhbmQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBjb2xsYXBzZSBidXR0b24uIFByZXNzaW5nIGJ1dHRvbiBoaWRlcyBncm91cCBtZW1iZXJzIG9mIGEgc2VsZWN0ZWQgcm91dGUgZ3JvdXAuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCI+Q29sbGFwc2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBhbGJ1bSBhcnQgYnV0dG9uLiBDbGlja2luZyBvbiB0aGUgYWxidW0gYXJ0IHRha2VzIHVzZXIgdG8gYSBwcmVkZWZpbmVkIGFjdGl2aXR5IHBlciBtZWRpYSBhcHAuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0Ij5BbGJ1bSBhcnQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiB2b2x1bWUgc2xpZGVyLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciI+Vm9sdW1lIHNsaWRlcjwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyBtZWRpYSBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIHBsYXliYWNrLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIj5ObyBtZWRpYSBzZWxlY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyB0aXRsZS9kZXNjcmlwdGlvbiBoYXZlIGJlZW4gZm91bmQgZm9yIGEgZ2l2ZW4gc29uZy92aWRlby4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSI+Tm8gaW5mbyBhdmFpbGFibGU8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaXMgY3VycmVudGx5IGNhc3Rpbmcgc2NyZWVuLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIj5DYXN0aW5nIHNjcmVlbjwvc3RyaW5nPgotCi0gICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY29udGFpbmVyIGlzIG5vdCB2YWxpZCBmb3IgcHJvZ3Jlc3NpdmUgZG93bmxvYWQvcGxheWJhY2suIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X2ludmFsaWRfcHJvZ3Jlc3NpdmVfcGxheWJhY2siPlRoaXMgdmlkZW8gaXNuXCd0IHZhbGlkIGZvciBzdHJlYW1pbmcgdG8gdGhpcyBkZXZpY2UuPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gSXQgY2FuIGJlIHVzZWQgYnkgYW55IGFwcC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX3RleHRfdW5rbm93biI+Q2FuXCd0IHBsYXkgdGhpcyB2aWRlby48L3N0cmluZz4KLSAgICA8IS0tIEJ1dHRvbiB0byBjbG9zZSBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX2J1dHRvbiI+T0s8L3N0cmluZz4KLQotICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyBhZCBza2lwIHdhaXQgdGltZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSI+Ci0gICAgICAgIFlvdSBjYW4gc2tpcCBBZCBpbiA8eGxpZmY6ZyBpZD0id2FpdF90aW1lIiBleGFtcGxlPSI1Ij4lMSRkPC94bGlmZjpnPnMKLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgdG90YWwgcmVtYWluaW5nIHRpbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUiPgotICAgICAgICBBZCDCtyA8eGxpZmY6ZyBpZD0icmVtYWluaW5nX3RpbWUiIGV4YW1wbGU9IjE6MTUiPiUxJHM8L3hsaWZmOmc+IHJlbWFpbmluZwotICAgIDwvc3RyaW5nPgotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgY2FuIHByZXNzIHRoZSBidXR0b24gdG8gZ28gdG8gYW4gZXh0ZXJuYWwgd2Vic2l0ZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0Ij5WaXNpdCBBZHZlcnRpc2VyPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90ZXh0Ij5DbG9zZWQgY2FwdGlvbjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfb2ZmX3RleHQiPk9mZjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCI+QXVkaW8gdHJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCI+Tm9uZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV90ZXh0Ij5WaWRlbyBxdWFsaXR5PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCI+QXV0bzwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0Ij5IZWxwICZhbXA7IGZlZWRiYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0Ij5QbGF5YmFjayBzcGVlZDwvc3RyaW5nPgotICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzIj4KLSAgICAgICAgPGl0ZW0+MC4yNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjAuNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjAuNzV4PC9pdGVtPgotICAgICAgICA8aXRlbT5Ob3JtYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEuMjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4xLjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4yeDwvaXRlbT4KLSAgICA8L3N0cmluZy1hcnJheT4KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgZm9yIGRpc3BsYXlpbmcgdGltZS4gVXNlZCB0byBjYWxjdWxhdGUgd2hpY2ggc2l6ZSBsYXlvdXQgdG8gdXNlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXIiPjAwOjAwOjAwPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgc3VidGl0bGUgdHJhY2sgbnVtYmVyLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0Ij4KLSAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9InRyYWNrX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYXVkaW8gdHJhY2sgbnVtYmVyLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0Ij4KLSAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9ImF1ZGlvX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBzb25nIHRpdGxlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0Ij5Tb25nIHRpdGxlIHVua25vd248L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBhcnRpc3QgbmFtZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiPkFydGlzdCB1bmtub3duPC9zdHJpbmc+Ci0KLSAgICA8IS0tQ29udGVudCBEZXNjcmlwdGlvbnMgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2JhY2tfYnV0dG9uX2Rlc2MiPkJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfbGVmdF9idXR0b25fZGVzYyI+U2VlIG1vcmUgYnV0dG9uczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYyI+QmFjayB0byBwcmV2aW91cyBidXR0b24gbGlzdDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZWVrX2Jhcl9kZXNjIj5QbGF5YmFjayBwcm9ncmVzczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYyI+U2V0dGluZ3M8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdmlkZW9fcXVhbGl0eV9idXR0b25fZGVzYyI+VmlkZW8gUXVhbGl0eSBTZWxlY3Rpb248L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb24iPlN1YnRpdGxlIGlzIG9uLiBDbGljayB0byBoaWRlIGl0Ljwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9jY19pc19vZmYiPlN1YnRpdGxlIGlzIG9mZi4gQ2xpY2sgdG8gc2hvdyBpdC48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjIj5SZXBsYXk8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGxheV9idXR0b25fZGVzYyI+UGxheTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9wYXVzZV9idXR0b25fZGVzYyI+UGF1c2U8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2MiPlByZXZpb3VzIG1lZGlhPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX25leHRfYnV0dG9uX2Rlc2MiPk5leHQgbWVkaWE8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmV3aW5kX2J1dHRvbl9kZXNjIj5SZXdpbmQgYnkgMTAgc2Vjb25kczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mZndkX2J1dHRvbl9kZXNjIj5HbyBmb3J3YXJkIGJ5IDMwIHNlY29uZHM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbGF1bmNoX2J1dHRvbl9kZXNjIj5MYXVuY2ggTGluazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXRlZF9idXR0b25fZGVzYyI+TXV0ZWQuIENsaWNrIHRvIHVubXV0ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjIj5DbGljayB0byBNdXRlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2Z1bGxfc2NyZWVuX2J1dHRvbl9kZXNjIj5GdWxsIHNjcmVlbjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOWE4ZWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08cmVzb3VyY2VzPgotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfcHJldmlvdXM8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX25leHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wYXVzZV9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mb3J3YXJkXzMwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZmZ3ZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3Jld2luZF8xMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3Jld2luZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9uZXh0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2ZvcndhcmRfMzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Zmd2RfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcmV3aW5kXzEwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJNaW5pbWFsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhciI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+NDZkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjVkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nRW5kIj41ZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj4zNmRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjM2ZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5CYWNrIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19hcnJvd19iYWNrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2JhY2tfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5MYXVuY2giPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2xhdW5jaDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9sYXVuY2hfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdTdGFydCI+NGRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdFbmQiPjRkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuQ3VycmVudCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuSW50ZXJwdW5jdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij7CtzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkVuZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij5Ac3RyaW5nL01lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfaG9yaXpvbnRhbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkNDIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmY8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfY2NfaXNfb2ZmPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2Z1bGxzY3JlZW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZnVsbF9zY3JlZW5fYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dSaWdodCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2NoZXZyb25fbGVmdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19sZWZ0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLlNldHRpbmdzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zZXR0aW5nczwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5NdXRlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY191bm11dGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfdW5tdXRlZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5WaWRlb1F1YWxpdHkiPgotICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19oaWdoX3F1YWxpdHk8L2l0ZW0+Ci0gICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+MGRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdC5UZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+dG9wfGNlbnRlcjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpvcmllbnRhdGlvbiI+dmVydGljYWw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MGRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC4zNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJ8cmlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQiPjI0ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyfGxlZnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6b3JpZW50YXRpb24iPnZlcnRpY2FsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU2OTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5NZWRpYVJvdXRlci5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgcGFyZW50PSJXaWRnZXQuQXBwQ29tcGF0LkFjdGlvbkJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9idXR0b25fZGFyazwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgcGFyZW50PSJXaWRnZXQuQXBwQ29tcGF0LkxpZ2h0LkFjdGlvbkJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9idXR0b25fbGlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuVGl0bGUiIC8+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LlN1YmhlYWQiIC8+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuQm9keTEiIC8+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGU4YzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotLyogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLWphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJjYyIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9ImZmd2QiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJtZWRpYWNvbnRyb2xsZXJfcHJvZ3Jlc3MiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJuZXh0IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icGF1c2UiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJwcmV2IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icmV3IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0idGltZSIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWVfY3VycmVudCIgLy0tPgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTc1NGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlciIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbjwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyazwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0Q29udHJvbFBhbmVsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QHN0eWxlL1RoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5MaWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uPC9pdGVtPgotCi0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX21yX2J1dHRvbl9ncmV5PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodDwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0LkRhcmtDb250cm9sUGFuZWwiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5Ac3R5bGUvVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkRhcms8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuRGFyayIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrPC9pdGVtPgotCi0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjFhMWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFVzYWdlICcuIHJ1bmN0cy5zaCcKLQotZnVuY3Rpb24gX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlKCkgewotICBlY2hvICdydW50ZXN0LWN0cy1NZWRpYUNvbXBvbmVudHMgW29wdGlvbl06IEJ1aWxkLCBmbGFzaCBkZXZpY2UsJwotICBlY2hvICcgICAgICAgICAgICAgIGFuZCBydW4gc3Vic2V0IG9mIEN0c01lZGlhVGVzdENhc2VzIHRoYXQgTWVkaWFDb21wb25lbnRzIGNvdmVycy4nCi0gIGVjaG8gJyAgICAgICAgICAqV2FybmluZyogVGhpcyBieXBhc3NlcyBDVFMgc2V0dXAgKGUuZy4gZG93bmxvYWQgbWVkaWEgY29udGVudHMgZnJvbSBzZXJ2ZXIpJwotICBlY2hvICcgICAgICAgICAgRm9yIHJ1bm5pbmcgQ1RTIGluIG9mZmljaWFsIHdheSwgdXNlIGF0ZXN0IG9yIGN0cy10cmFkZWZlZCAnCi0gIGVjaG8gJyAgICAgLWh8LS1oZWxwOiBUaGlzIGhlbHAnCi0gIGVjaG8gJyAgICAgLS1za2lwOiBTa2lwIGJ1aWxkIGFuZCBmbGFzaC4gSnVzdCByZXJ1bi10ZXN0cycKLSAgZWNobyAnICAgICAtLW1pbjogT25seSByZWJ1aWxkIHRlc3RzIGFuZCB1cGRhdGFibGUgbGlicmFyeS4nCi0gIGVjaG8gJyAgICAgLS10ZXN0OiBPbmx5IHJlYnVpbGQgdGVzdHMnCi0gIGVjaG8gJyAgICAgLXMgW2RldmljZV9pZF06IFNwZWNpZnkgYSBkZXZpY2UgbmFtZSB0byBydW4gdGVzdCBhZ2FpbnN0LicKLSAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBkZWZpbmUgJHtBREJIT1NUfSBpbnN0ZWFkLicKLSAgZWNobyAnICAgICAtciBbY291bnRdOiBSZXBlYXQgdGVzdHMgZm9yIGdpdmVuIGNvdW50LiBJdCB3aWxsIHN0b3Agd2hlbiBmYWlscy4nCi0gIGVjaG8gJyAgICAgLS1pZ25vcmU6IEtlZXAgcmVwZWF0aW5nIHRlc3RzIGV2ZW4gd2hlbiBpdCBmYWlscy4nCi0gIGVjaG8gJyAgICAgLXQgW3Rlc3RdOiBPbmx5IHJ1biB0aGUgc3BlY2lmaWMgdGVzdC4gQ2FuIGJlIGVpdGhlciBhIGNsYXNzIG9yIGEgbWV0aG9kLicKLX0KLQotZnVuY3Rpb24gcnVudGVzdC1jdHMtTWVkaWFDb21wb25lbnRzKCkgewotICAjIEVkaXQgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IG90aGVyIHRlc3RzLgotICAjIExpc3QgdXAgbGlicyBhbmQgYXBrcyBpbiB0aGUgbWVkaWFfYXBpIG5lZWRlZCBmb3IgdGVzdHMsIGFuZCBwbGFjZSB0ZXN0IHRhcmdldCBhdCB0aGUgbGFzdC4KLSAgbG9jYWwgVEVTVF9QQUNLQUdFX0RJUj0oImZyYW1ld29ya3MvYXYvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3QiKQotICBsb2NhbCBURVNUX1BBQ0tBR0U9KCJhbmRyb2lkLm1lZGlhLmN0cyIpCi0gIGxvY2FsIEJVSUxEX1RBUkdFVFM9KCJNZWRpYUNvbXBvbmVudHMiICJDdHNNZWRpYVRlc3RDYXNlcyIpCi0gICMgRG9uJ3QgaW5jbHVkZSBNZWRpYUNvbXBvbmVudHMgLS0gaWYgd2Ugc2ltcGx5IGluc3RhbGwgaXQsIHN5c3RlbSBzZXJ2ZXIKLSAgIyB3b3VsZG4ndCB1c2UgdGhlIGluc3RhbGxlZCBvbmUuCi0gIGxvY2FsIElOU1RBTExfVEFSR0VUUz0oIkN0c01lZGlhVGVzdENhc2VzIikKLSAgbG9jYWwgVEVTVF9SVU5ORVI9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCi0gIGxvY2FsIERFUEVOREVOQ0lFUz0oIm1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCIgImFuZHJvaWQtc3VwcG9ydC10ZXN0IiAiY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCIpCi0gIGxvY2FsIERFRkFVTFRfVEVTVF9UQVJHRVQ9IiIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9ImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhQnJvd3NlcjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhQ29udHJvbGxlcjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhTWV0YWRhdGEyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb24yVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb24yX1Blcm1pc3Npb25UZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhU2Vzc2lvbk1hbmFnZXJfTWVkaWFTZXNzaW9uMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuU2Vzc2lvblRva2VuMlRlc3QiCi0gIGlmIFtbIC16ICIke0FORFJPSURfQlVJTERfVE9QfSIgXV07IHRoZW4KLSAgICBlY2hvICJOZWVkcyB0byBsdW5jaCBhIHRhcmdldCBmaXJzdCIKLSAgICByZXR1cm4KLSAgZmkKLQotICBsb2NhbCBvbGRfcGF0aD0ke09MRFBXRH0KLSAgd2hpbGUgdHJ1ZTsgZG8KLSAgICBsb2NhbCBPUFRJT05fU0tJUD0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX01JTj0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1RFU1Q9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9SRVBFQVRfQ09VTlQ9IjEiCi0gICAgbG9jYWwgT1BUSU9OX0lHTk9SRT0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1RFU1RfVEFSR0VUPSIke0RFRkFVTFRfVEVTVF9UQVJHRVR9IgotICAgIGxvY2FsIGFkYmhvc3RfbG9jYWwKLSAgICB3aGlsZSAoKCAiJCMiICkpOyBkbwotICAgICAgY2FzZSAiJHsxfSIgaW4KLSAgICAgICAgLWh8LS1oZWxwKQotICAgICAgICAgIF9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZQotICAgICAgICAgIHJldHVybgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tc2tpcCkKLSAgICAgICAgICBPUFRJT05fU0tJUD0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtLW1pbikKLSAgICAgICAgICBPUFRJT05fTUlOPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tdGVzdCkKLSAgICAgICAgICBPUFRJT05fVEVTVD0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtcykKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIGFkYmhvc3RfbG9jYWw9JHsxfQotICAgICAgICAgIDs7Ci0gICAgICAgIC1yKQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgT1BUSU9OX1JFUEVBVF9DT1VOVD0iJHsxfSIKLSAgICAgICAgICA7OwotICAgICAgICAtLWlnbm9yZSkKLSAgICAgICAgICBPUFRJT05fSUdOT1JFPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC10KQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgT1BUSU9OX1RFU1RfVEFSR0VUPSIkezF9IgotICAgICAgZXNhYwotICAgICAgc2hpZnQKLSAgICBkb25lCi0KLSAgICAjIEJ1aWxkIGFkYiBjb21tYW5kLgotICAgIGxvY2FsIGFkYgotICAgIGlmIFtbIC16ICIke2FkYmhvc3RfbG9jYWx9IiBdXTsgdGhlbgotICAgICAgYWRiaG9zdF9sb2NhbD0ke0FEQkhPU1R9Ci0gICAgZmkKLSAgICBpZiBbWyAteiAiJHthZGJob3N0X2xvY2FsfSIgXV07IHRoZW4KLSAgICAgIGxvY2FsIGRldmljZV9jb3VudD0kKGFkYiBkZXZpY2VzIHwgc2VkICcvXltbOnNwYWNlOl1dKiQvZCcgfCB3YyAtbCkKLSAgICAgIGlmIFtbICIke2RldmljZV9jb3VudH0iICE9ICIyIiBdXTsgdGhlbgotICAgICAgICBlY2hvICJUb28gbWFueSBkZXZpY2VzLiBTcGVjaWZ5IGEgZGV2aWNlLiIgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgICBhZGI9ImFkYiIKLSAgICBlbHNlCi0gICAgICBhZGI9ImFkYiAtcyAke2FkYmhvc3RfbG9jYWx9IgotICAgIGZpCi0KLSAgICBsb2NhbCB0YXJnZXRfZGlyPSIke0FORFJPSURfQlVJTERfVE9QfS8ke1RFU1RfUEFDS0FHRV9ESVJ9IgotICAgICNsb2NhbCBURVNUX1BBQ0tBR0U9JChzZWQgLW4gJ3MvXi4qXGJwYWNrYWdlXGI9IlwoW2EtejAtOVwuXSpcKSIuKiQvXDEvcCcgJHt0YXJnZXRfZGlyfS9BbmRyb2lkTWFuaWZlc3QueG1sKQotCi0gICAgaWYgW1sgIiR7T1BUSU9OX1NLSVB9IiAhPSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICMgQnVpbGQgZGVwZW5kZW5jaWVzIGlmIG5lZWRlZC4KLSAgICAgIGxvY2FsIGRlcGVuZGVuY3kKLSAgICAgIGxvY2FsIGJ1aWxkX2RlcGVuZGVuY3k9IiIKLSAgICAgIGZvciBkZXBlbmRlbmN5IGluICR7REVQRU5ERU5DSUVTW0BdfTsgZG8KLSAgICAgICAgaWYgW1sgIiR7ZGVwZW5kZW5jeX0iID09ICJvdXQvIiogXV07IHRoZW4KLSAgICAgICAgICBpZiBbWyAhIC1mICR7QU5EUk9JRF9CVUlMRF9UT1B9LyR7ZGVwZW5kZW5jeX0gXV07IHRoZW4KLSAgICAgICAgICAgIGJ1aWxkX2RlcGVuZGVuY3k9InRydWUiCi0gICAgICAgICAgICBicmVhawotICAgICAgICAgIGZpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBpZiBbWyAiJChmaW5kICR7T1VUfSAtbmFtZSAke2RlcGVuZGVuY3l9X2ludGVybWVkaWF0ZXMgfCB3YyAtbCkiID09ICIwIiBdXTsgdGhlbgotICAgICAgICAgICAgYnVpbGRfZGVwZW5kZW5jeT0idHJ1ZSIKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgIGRvbmUKLSAgICAgIGlmIFtbICIke2J1aWxkX2RlcGVuZGVuY3l9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiQnVpbGRpbmcgZGVwZW5kZW5jaWVzLiBXaWxsIG9ubHkgcHJpbnQgc3RkZXJyLiIKLSAgICAgICAgbSAke0RFUEVOREVOQ0lFU1tAXX0gLWogPiAvZGV2L251bGwKLSAgICAgIGZpCi0KLSAgICAgICMgQnVpbGQgdGVzdCBhcGsgYW5kIHJlcXVpcmVkIGFway4KLSAgICAgIGxvY2FsIGJ1aWxkX3RhcmdldHMKLSAgICAgIGlmIFtbICIke09QVElPTl9URVNUfSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGJ1aWxkX3RhcmdldHM9IiR7SU5TVEFMTF9UQVJHRVRTW0BdfSIKLSAgICAgIGVsaWYgW1sgIiR7T1BUSU9OX01JTn0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBidWlsZF90YXJnZXRzPSIke0JVSUxEX1RBUkdFVFNbQF19IgotICAgICAgZWxzZQotICAgICAgICBidWlsZF90YXJnZXRzPSIke0JVSUxEX1RBUkdFVFNbQF19IGRyb2lkIgotICAgICAgZmkKLSAgICAgIG0gJHtidWlsZF90YXJnZXRzfSAtaiB8fCBicmVhawotCi0gICAgICBpZiBbWyAiJHtPUFRJT05fVEVTVH0iICE9ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICAjIEZsYXNoIG9ubHkgd2hlbiBuZWVkZWQKLSAgICAgICAgbG9jYWwgZGV2aWNlX2J1aWxkX3R5cGU9IiQoJHthZGJ9IHNoZWxsIGdldHByb3Agcm8uYnVpbGQudHlwZSkiCi0gICAgICAgIGlmIFtbICIke2RldmljZV9idWlsZF90eXBlfSIgPT0gInVzZXIiIF1dOyB0aGVuCi0gICAgICAgICAgIyBVc2VyIGJ1aWxkLiBDYW5ub3QgYWRiIHN5bmMKLSAgICAgICAgICAke2FkYn0gcmVib290IGJvb3Rsb2FkZXIKLSAgICAgICAgICBmYXN0Ym9vdCBmbGFzaGFsbAotICAgICAgICBlbHNlCi0gICAgICAgICAgJHthZGJ9IHJvb3QKLSAgICAgICAgICBsb2NhbCBkZXZpY2VfdmVyaXR5X21vZGU9IiQoJHthZGJ9IHNoZWxsIGdldHByb3Agcm8uYm9vdC52ZXJpdHltb2RlKSIKLSAgICAgICAgICBpZiBbWyAiJHtkZXZpY2VfdmVyaXR5X21vZGV9IiAhPSAiZGlzYWJsZWQiIF1dOyB0aGVuCi0gICAgICAgICAgICAke2FkYn0gZGlzYWJsZS12ZXJpdHkKLSAgICAgICAgICAgICR7YWRifSByZWJvb3QKLSAgICAgICAgICAgICR7YWRifSB3YWl0LWZvci1kZXZpY2UgfHwgYnJlYWsKLSAgICAgICAgICAgICR7YWRifSByb290Ci0gICAgICAgICAgZmkKLSAgICAgICAgICAke2FkYn0gcmVtb3VudAotICAgICAgICAgICR7YWRifSBzaGVsbCBzdG9wCi0gICAgICAgICAgJHthZGJ9IHNoZWxsIHNldHByb3AgbG9nLnRhZy5NZWRpYVNlc3Npb25TZXJ2aWNlIERFQlVHCi0gICAgICAgICAgJHthZGJ9IHN5bmMKLSAgICAgICAgICAke2FkYn0gc2hlbGwgc3RhcnQKLSAgICAgICAgZmkKLSAgICAgICAgJHthZGJ9IHdhaXQtZm9yLWRldmljZSB8fCBicmVhawotICAgICAgICAjIEVuc3VyZSBwYWNrYWdlIG1hbmFnZXIgaXMgbG9hZGVkLgotICAgICAgICAjIFRPRE8oamFld2FuKTogRmluZCBiZXR0ZXIgd2F5IHRvIHdhaXQKLSAgICAgICAgc2xlZXAgMTUKLSAgICAgIGZpCi0KLSAgICAgICMgSW5zdGFsbCBhcGtzCi0gICAgICBsb2NhbCBpbnN0YWxsX2ZhaWxlZD0iZmFsc2UiCi0gICAgICBmb3IgdGFyZ2V0IGluICR7SU5TVEFMTF9UQVJHRVRTW0BdfTsgZG8KLSAgICAgICAgbG9jYWwgYXBrX3BhdGg9JChmaW5kICR7T1VUfS9zeXN0ZW0gJHtPVVR9L2RhdGEgLW5hbWUgJHt0YXJnZXR9LmFwaykKLSAgICAgICAgbG9jYWwgYXBrX251bT0kKGZpbmQgJHtPVVR9L3N5c3RlbSAke09VVH0vZGF0YSAtbmFtZSAke3RhcmdldH0uYXBrIHwgd2MgLWwpCi0gICAgICAgIGlmIFtbICIke2Fwa19udW19IiAhPSAiMSIgXV07IHRoZW4KLSAgICAgICAgICBlY2hvICJDYW5ub3QgbG9jYXRlIGEgJHt0YXJnZXR9LmFway4gRm91bmQgJHthcGtfbnVtfSBhcGtzIiAmJiBicmVhawotICAgICAgICBmaQotICAgICAgICBlY2hvICJJbnN0YWxsaW5nICR7dGFyZ2V0fS5hcGsuIHBhdGg9JHthcGtfcGF0aH0iCi0gICAgICAgICR7YWRifSBpbnN0YWxsIC1yICR7YXBrX3BhdGh9Ci0gICAgICAgIGlmIFtbICIkez99IiAhPSAiMCIgXV07IHRoZW4KLSAgICAgICAgICBpbnN0YWxsX2ZhaWxlZD0idHJ1ZSIKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgICAgZG9uZQotICAgICAgaWYgW1sgIiR7aW5zdGFsbF9mYWlsZWR9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiRmFpbGVkIHRvIGluc3RhbGwuIFRlc3Qgd291bGRuJ3QgcnVuLiIKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGxvY2FsIHRlc3RfdGFyZ2V0PSIiCi0gICAgaWYgW1sgLW4gIiR7T1BUSU9OX1RFU1RfVEFSR0VUfSIgXV07IHRoZW4KLSAgICAgIHRlc3RfdGFyZ2V0PSItZSBjbGFzcyAke09QVElPTl9URVNUX1RBUkdFVH0iCi0gICAgZmkKLQotICAgIGxvY2FsIGkKLSAgICBsb2NhbCB0bXBmaWxlPSQodGVtcGZpbGUpCi0gICAgZm9yICgoaT0xOyBpIDw9ICR7T1BUSU9OX1JFUEVBVF9DT1VOVH07IGkrKykpOyBkbwotICAgICAgZWNobyAiUnVuIHRlc3QgJHtpfS8ke09QVElPTl9SRVBFQVRfQ09VTlR9IgotICAgICAgJHthZGJ9IHNoZWxsIGFtIGluc3RydW1lbnQgJHt0ZXN0X3RhcmdldH0gLXcgJHtURVNUX1BBQ0tBR0V9LyR7VEVTVF9SVU5ORVJ9ID4mICR7dG1wZmlsZX0KLSAgICAgIGNhdCAke3RtcGZpbGV9Ci0gICAgICBpZiBbWyAiJHtPUFRJT05fSUdOT1JFfSIgIT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGlmIFtbIC1uICIkKGdyZXAgJHt0bXBmaWxlfSAtZSAnRkFJTFVSRVx8Y3Jhc2hlZCcpIiBdXTsgdGhlbgotICAgICAgICAgICMgYW0gaW5zdHJ1bWVudCBkb2Vzbid0IHJldHVybiBlcnJvciBjb2RlIHNvIG5lZWQgdG8gZ3JlcCByZXN1bHQgbWVzc2FnZSBpbnN0ZWFkCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIHJtICR7dG1wZmlsZX0KLSAgICBicmVhawotICBkb25lCi19Ci0KLWVjaG8gIkZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGFkZGVkIHRvIHlvdXIgZW52aXJvbm1lbnQ6IgotX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODhiNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYVNlc3Npb24yOwotCi0vKioKLSAqIEludGVyZmFjZSBmcm9tIE1lZGlhU2Vzc2lvbjIgdG8gTWVkaWFDb250cm9sbGVyMi4KLSAqIDxwPgotICogS2VlcCB0aGlzIGludGVyZmFjZSBvbmV3YXkuIE90aGVyd2lzZSBhIG1hbGljaW91cyBhcHAgbWF5IGltcGxlbWVudCBmYWtlIHZlcnNpb24gb2YgdGhpcywKLSAqIGFuZCBob2xkcyBjYWxscyBmcm9tIHNlc3Npb24gdG8gbWFrZSBzZXNzaW9uIG93bmVyKHMpIGZyb3plbi4KLSAqLwotLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KLS8vICAgICAgICAgICAgICAgTm90ZSB0aGF0IFBhcmNlbGxlZFNsaWNlTGlzdCBpc24ndCBhIGdvb2QgaWRlYSBmb3IgdGhlIHB1cnBvc2UuIChzZWU6IGIvMzc0OTM2NzcpCi1vbmV3YXkgaW50ZXJmYWNlIElNZWRpYUNvbnRyb2xsZXIyIHsKLSAgICB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSk7Ci0gICAgdm9pZCBvblBvc2l0aW9uQ2hhbmdlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpOwotICAgIHZvaWQgb25QbGF5YmFja1NwZWVkQ2hhbmdlZChmbG9hdCBzcGVlZCk7Ci0gICAgdm9pZCBvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKGluIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIG9uUGxheWJhY2tJbmZvQ2hhbmdlZChpbiBCdW5kbGUgcGxheWJhY2tJbmZvKTsKLSAgICB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpOwotICAgIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoaW50IHNodWZmbGVNb2RlKTsKLSAgICB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIGluIEJ1bmRsZSBjb21tYW5kR3JvdXAsCi0gICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIGluIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCByZXBlYXRNb2RlLCBpbnQgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICB2b2lkIG9uRGlzY29ubmVjdGVkKCk7Ci0KLSAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gY29tbWFuZEJ1dHRvbmxpc3QpOwotICAgIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGluIEJ1bmRsZSBjb21tYW5kcyk7Ci0KLSAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChpbiBCdW5kbGUgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBCcm93c2VyIHNlcGNpZmljCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoaW4gQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBpbiBCdW5kbGUgcm9vdEV4dHJhKTsKLSAgICB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSByZXN1bHQpOwotICAgIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoU3RyaW5nIHJvb3RNZWRpYUlkLCBpbnQgaXRlbUNvdW50LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBpbiBMaXN0PEJ1bmRsZT4gcmVzdWx0LAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDQ2N2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuSU1lZGlhQ29udHJvbGxlcjI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZyb20gTWVkaWFDb250cm9sbGVyMiB0byBNZWRpYVNlc3Npb24yLgotICogPHA+Ci0gKiBLZWVwIHRoaXMgaW50ZXJmYWNlIG9uZXdheS4gT3RoZXJ3aXNlIGEgbWFsaWNpb3VzIGFwcCBtYXkgaW1wbGVtZW50IGZha2UgdmVyc2lvbiBvZiB0aGlzLAotICogYW5kIGhvbGRzIGNhbGxzIGZyb20gc2Vzc2lvbiB0byBtYWtlIHNlc3Npb24gb3duZXIocykgZnJvemVuLgotICovCi0gLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KLSAvLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQotb25ld2F5IGludGVyZmFjZSBJTWVkaWFTZXNzaW9uMiB7Ci0gICAgLy8gVE9ETyhqYWV3YW4pOiBhZGQgb25Db21tYW5kKCkgdG8gc2VuZCBwcml2YXRlIGNvbW1hbmQKLQotICAgIC8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgV2UgbWF5IGNvbnNpZGVyIHRvIGFkZCBhbm90aGVyIGJpbmRlciBqdXN0IGZvciB0aGUgY29ubmVjdGlvbgotICAgIC8vICAgICAgICAgICAgICAgbm90IHRvIGV4cG9zZSBvdGhlciBtZXRob2RzIHRvIHRoZSBjb250cm9sbGVyIHdob3NlIGNvbm5lY3Rpb24gd2Fzbid0IGFjY2VwdGVkLgotICAgIC8vICAgICAgICAgICAgICAgQnV0IHRoaXMgd291bGQgYmUgZW5vdWdoIGZvciBub3cgYmVjYXVzZSBpdCdzIHRoZSBzYW1lIGFzIGV4aXN0aW5nCi0gICAgLy8gICAgICAgICAgICAgICBNZWRpYUJyb3dzZXIgYW5kIE1lZGlhQnJvd3NlclNlcnZpY2UuCi0gICAgdm9pZCBjb25uZWN0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKTsKLSAgICB2b2lkIHJlbGVhc2UoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLQotICAgIHZvaWQgc2V0Vm9sdW1lVG8oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgdmFsdWUsIGludCBmbGFncyk7Ci0gICAgdm9pZCBhZGp1c3RWb2x1bWUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIHNlbmQgY29tbWFuZAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCi0gICAgICAgICAgICBpbnQgY29tbWFuZENvZGUsIGluIEJ1bmRsZSBhcmdzKTsKLSAgICB2b2lkIHNlbmRDdXN0b21Db21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLAotICAgICAgICAgICAgaW4gUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpOwotCi0gICAgdm9pZCBwcmVwYXJlRnJvbVVyaShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcGxheUZyb21VcmkoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tU2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tTWVkaWFJZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHNldFJhdGluZyhJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmF0aW5nKTsKLQotICAgIHZvaWQgc2V0UGxheWxpc3QoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIGFkZFBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLSAgICB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0gICAgdm9pZCBzZXRSZXBlYXRNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHJlcGVhdE1vZGUpOwotICAgIHZvaWQgc2V0U2h1ZmZsZU1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgc2h1ZmZsZU1vZGUpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGxpYnJhcnkgc2VydmljZSBzcGVjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIGdldExpYnJhcnlSb290KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIHJvb3RIaW50cyk7Ci0gICAgdm9pZCBnZXRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQpOwotICAgIHZvaWQgZ2V0Q2hpbGRyZW4oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBnZXRTZWFyY2hSZXN1bHQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCB1bnN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MDkwOTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyLkJyb3dzZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUJyb3dzZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUJyb3dzZXIySW1wbCBleHRlbmRzIE1lZGlhQ29udHJvbGxlcjJJbXBsIGltcGxlbWVudHMgTWVkaWFCcm93c2VyMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFCcm93c2VyMiI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBjaGFuZ2UuCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQnJvd3NlcjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIE1lZGlhQnJvd3NlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFCcm93c2VyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBCcm93c2VyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIE1lZGlhQnJvd3NlcjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoTWVkaWFCcm93c2VyMikgc3VwZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdF9pbXBsKEJ1bmRsZSByb290SGludHMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmdldExpYnJhcnlSb290KGdldENvbnRyb2xsZXJTdHViKCksIHJvb3RIaW50cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmVfaW1wbChTdHJpbmcgcGFyZW50SWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc3Vic2NyaWJlKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmVfaW1wbChTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIudW5zdWJzY3JpYmUoZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0SXRlbV9pbXBsKFN0cmluZyBtZWRpYUlkKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRJdGVtKGdldENvbnRyb2xsZXJTdHViKCksIG1lZGlhSWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW5faW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRDaGlsZHJlbihnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNlYXJjaChnZXRDb250cm9sbGVyU3R1YigpLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldFNlYXJjaFJlc3VsdF9pbXBsKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRTZWFyY2hSZXN1bHQoZ2V0Q29udHJvbGxlclN0dWIoKSwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzLCBmaW5hbCBTdHJpbmcgcm9vdE1lZGlhSWQsIGZpbmFsIEJ1bmRsZSByb290RXh0cmEpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0TGlicmFyeVJvb3REb25lKGdldEluc3RhbmNlKCksIHJvb3RIaW50cywgcm9vdE1lZGlhSWQsIHJvb3RFeHRyYSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRJdGVtRG9uZShnZXRJbnN0YW5jZSgpLCBtZWRpYUlkLCBpdGVtKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRDaGlsZHJlbkRvbmUoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0Q2hpbGRyZW5Eb25lKGdldEluc3RhbmNlKCksIHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblNlYXJjaFJlc3VsdENoYW5nZWQoU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNlYXJjaFJlc3VsdENoYW5nZWQoZ2V0SW5zdGFuY2UoKSwgcXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldFNlYXJjaFJlc3VsdERvbmUoZ2V0SW5zdGFuY2UoKSwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKGZpbmFsIFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25DaGlsZHJlbkNoYW5nZWQoZ2V0SW5zdGFuY2UoKSwgcGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDkzNjVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUX01FVEFEQVRBOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1NIVUZGTEVfTU9ERTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0g7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkk7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUmVwZWF0TW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5TaHVmZmxlTW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xsZXIyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xsZXIyU3R1YiBtQ29udHJvbGxlclN0dWI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1Ub2tlbjsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRyb2xsZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1JlbGVhc2VkOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1QbGF5bGlzdE1ldGFkYXRhOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEBSZXBlYXRNb2RlIGludCBtUmVwZWF0TW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBAU2h1ZmZsZU1vZGUgaW50IG1TaHVmZmxlTW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgbVBsYXllclN0YXRlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgbG9uZyBtUG9zaXRpb25NczsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmbG9hdCBtUGxheWJhY2tTcGVlZDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBsb25nIG1CdWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kR3JvdXAyIG1BbGxvd2VkQ29tbWFuZHM7Ci0KLSAgICAvLyBBc3NpZ25tZW50IHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIGxvY2sgaG9sZCwgYnV0IHNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQKLSAgICAvLyBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgLy8gUG9zdGZpeCAtQmluZGVyIGlzIGFkZGVkIHRvIGV4cGxpY2l0bHkgc2hvdyB0aGF0IGl0J3MgcG90ZW50aWFsbHkgcmVtb3RlIHByb2Nlc3MgY2FsbC4KLSAgICAvLyBUZWNobmljYWxseSAtSW50ZXJmYWNlIGlzIG1vcmUgY29ycmVjdCwgYnV0IGl0IG1heSBtaXNyZWFkIHRoYXQgaXQncyBpbnRlcmZhY2UgKHZzIGNsYXNzKQotICAgIC8vIHNvIGxldCdzIGtlZXAgdGhpcyBwb3N0Zml4IHVudGlsIHdlIGZpbmQgYmV0dGVyIHBvc3RmaXguCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgdm9sYXRpbGUgSU1lZGlhU2Vzc2lvbjIgbVNlc3Npb25CaW5kZXI7Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlcXVpcmUgc2Vzc2lvbiBhY3RpdmVuZXNzIGNoYW5nZWQgbGlzdGVuZXIsIGJlY2F1c2UgY29udHJvbGxlciBjYW4gYmUKLSAgICAvLyAgICAgICAgICAgICAgIGF2YWlsYWJsZSB3aGVuIHRoZSBzZXNzaW9uJ3MgcGxheWVyIGlzIG51bGwuCi0gICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFDb250cm9sbGVyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb250cm9sbGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidG9rZW4gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1Db250cm9sbGVyU3R1YiA9IG5ldyBNZWRpYUNvbnRyb2xsZXIyU3R1Yih0aGlzKTsKLSAgICAgICAgbVRva2VuID0gdG9rZW47Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICBtRGVhdGhSZWNpcGllbnQgPSAoKSAtPiB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgfTsKLQotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBNb3JlIHNhbml0eSBjaGVja3MuCi0gICAgICAgIGlmIChtVG9rZW4uZ2V0VHlwZSgpID09IFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OKSB7Ci0gICAgICAgICAgICAvLyBTZXNzaW9uCi0gICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgY29ubmVjdFRvU2Vzc2lvbihTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbikuZ2V0U2Vzc2lvbkJpbmRlcigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFNlc3Npb24gc2VydmljZQotICAgICAgICAgICAgaWYgKFByb2Nlc3MubXlVaWQoKSA9PSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKLSAgICAgICAgICAgICAgICAvLyBJdCdzIHN5c3RlbSBzZXJ2ZXIgKE1lZGlhU2Vzc2lvblNlcnZpY2UpIHRoYXQgd2FudHMgdG8gbW9uaXRvciBzZXNzaW9uLgotICAgICAgICAgICAgICAgIC8vIERvbid0IGJpbmQgaWYgYWJsZS4uCi0gICAgICAgICAgICAgICAgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGJpbmRlciBpbiB0aGUgc2Vzc2lvbiB0b2tlbiBpbnN0ZWFkIG9mIGJpbmQgYnkgaXRzIG93bi4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlcnZlciB3aWxsIGhvbGRzIHRoZSBiaW5kaW5nIHRvIHRoZSBzZXJ2aWNlICpmb3JldmVyKiBhbmQgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5ldmVyIHN0b3AuCi0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBoYXBwZW4gb25seSB3aGVuIHN5c3RlbSBzZXJ2ZXIgd2FudHMgdG8gZGlzcGF0Y2ggbWVkaWEga2V5IGV2ZW50cyB0bwotICAgICAgICAgICAgICAgICAgICAvLyBhIGRlYWQgc2VydmljZS4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3lzdGVtIHNlcnZlciBiaW5kcyB0byBhIHNlc3Npb24gc2VydmljZS4gU2hvdWxkIHVuYmluZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBuZXcgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBjb25uZWN0VG9TZXJ2aWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29ubmVjdFRvU2VydmljZSgpIHsKLSAgICAgICAgLy8gU2VydmljZS4gTmVlZHMgdG8gZ2V0IGZyZXNoIGJpbmRlciB3aGVuZXZlciBjb25uZWN0aW9uIGlzIG5lZWRlZC4KLSAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgaW1wbCA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKTsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UpOwotICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpLCBpbXBsLmdldFNlcnZpY2VOYW1lKCkpOwotCi0gICAgICAgIC8vIFVzZSBiaW5kU2VydmljZSgpIGluc3RlYWQgb2Ygc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpIHRvIHN0YXJ0IHNlc3Npb24gc2VydmljZSBmb3IgdGhyZWUKLSAgICAgICAgLy8gcmVhc29ucy4KLSAgICAgICAgLy8gMS4gUHJldmVudCBzZXNzaW9uIHNlcnZpY2Ugb3duZXIncyBzdG9wU2VsZigpIGZyb20gZGVzdHJveWluZyBzZXJ2aWNlLgotICAgICAgICAvLyAgICBXaXRoIHRoZSBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCksIHNlcnZpY2UncyBjYWxsIG9mIHN0b3BTZWxmKCkgd2lsbCB0cmlnZ2VyIGltbWVkaWF0ZQotICAgICAgICAvLyAgICBvbkRlc3Ryb3koKSBjYWxscyBvbiB0aGUgbWFpbiB0aHJlYWQgZXZlbiB3aGVuIG9uQ29ubmVjdCgpIGlzIHJ1bm5pbmcgaW4gYW5vdGhlcgotICAgICAgICAvLyAgICB0aHJlYWQuCi0gICAgICAgIC8vIDIuIE1pbmltaXplIEFQSXMgZm9yIGRldmVsb3BlcnMgdG8gdGFrZSBjYXJlIGFib3V0LgotICAgICAgICAvLyAgICBXaXRoIGJpbmRTZXJ2aWNlKCksIGRldmVsb3BlcnMgb25seSBuZWVkIHRvIHRha2UgY2FyZSBhYm91dCBTZXJ2aWNlLm9uQmluZCgpCi0gICAgICAgIC8vICAgIGJ1dCBTZXJ2aWNlLm9uU3RhcnRDb21tYW5kKCkgc2hvdWxkIGJlIGFsc28gdGFrZW4gY2FyZSBhYm91dCB3aXRoIHRoZQotICAgICAgICAvLyAgICBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCkuCi0gICAgICAgIC8vIDMuIEZ1dHVyZSBzdXBwb3J0IGZvciBVSS1sZXNzIHBsYXliYWNrCi0gICAgICAgIC8vICAgIElmIGEgc2VydmljZSB3YW50cyB0byBrZWVwIHJ1bm5pbmcsIGl0IHNob3VsZCBiZSBlaXRoZXIgZm9yZWdyb3VuZCBzZXJ2aWNlIG9yCi0gICAgICAgIC8vICAgIGJvdW5kZWQgc2VydmljZS4gQnV0IHRoZXJlIGhhZCBiZWVuIHJlcXVlc3QgZm9yIHRoZSBmZWF0dXJlIGZvciBzeXN0ZW0gYXBwcwotICAgICAgICAvLyAgICBhbmQgdXNpbmcgYmluZFNlcnZpY2UoKSB3aWxsIGJlIGJldHRlciBmaXQgd2l0aCBpdC4KLSAgICAgICAgYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7Ci0gICAgICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2VBc1VzZXIoKSBmb3IgYmluZGluZyBmcm9tIHN5c3RlbSBzZXJ2aWNlIHRvIGF2b2lkIGZvbGxvd2luZyB3YXJuaW5nLgotICAgICAgICAgICAgLy8gQ29udGV4dEltcGw6IENhbGxpbmcgYSBtZXRob2QgaW4gdGhlIHN5c3RlbSBwcm9jZXNzIHdpdGhvdXQgYSBxdWFsaWZpZWQgdXNlcgotICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2VBc1VzZXIoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSwKLSAgICAgICAgICAgICAgICAgICAgVXNlckhhbmRsZS5nZXRVc2VySGFuZGxlRm9yVWlkKG1Ub2tlbi5nZXRVaWQoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgZmFpbGVkIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgc3VjY2VzcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1Nlc3Npb24oSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Vzc2lvbkJpbmRlci5jb25uZWN0KG1Db250cm9sbGVyU3R1YiwgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gY2FsbCBjb25uZWN0aW9uIHJlcXVlc3QuIEZyYW1ld29yayB3aWxsIHJldHJ5IgotICAgICAgICAgICAgICAgICAgICArICIgYXV0b21hdGljYWxseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2VfaW1wbCgpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNlIGZyb20gIiArIG1Ub2tlbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUlzUmVsZWFzZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLWVudGVyYW5jZSBmcm9tIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Jc1JlbGVhc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgICAgICAgICBtQ29udHJvbGxlclN0dWIuZGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuYXNCaW5kZXIoKS51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlbGVhc2UobUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8tb3AuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQobUluc3RhbmNlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOwotICAgIH0KLQotICAgIE1lZGlhQ29udHJvbGxlcjJTdHViIGdldENvbnRyb2xsZXJTdHViKCkgewotICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJTdHViOwotICAgIH0KLQotICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICB9Ci0KLSAgICBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIC8vIFJldHVybnMgc2Vzc2lvbiBiaW5kZXIgaWYgdGhlIGNvbnRyb2xsZXIgY2FuIHNlbmQgdGhlIGNvbW1hbmQuCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZENvZGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBpc24ndCBhbGxvd2VkIHRvLgotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCB0byBjYWxsIGNvbW1hbmQsIGNvbW1hbmRDb2RlPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY29tbWFuZENvZGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGRvIHRoaXMgd2l0aCB0aGUgbG9jayBob2xkPwotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDYW5ub3Qgc2VuZCBiZWNhdXNlIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJpbmRlcjsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kPSIgKyBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0U2Vzc2lvblRva2VuX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWRfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIHJldHVybiBiaW5kZXIgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BMQVkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1ApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1ByZXZpb3VzSXRlbShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9OZXh0SXRlbShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoY29tbWFuZENvZGUsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kQ29kZSwgYXJncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQZW5kaW5nSW50ZW50IGdldFNlc3Npb25BY3Rpdml0eV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUb19pbXBsKGludCB2YWx1ZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFZvbHVtZVRvKG1Db250cm9sbGVyU3R1YiwgdmFsdWUsIGZsYWdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRqdXN0Vm9sdW1lX2ltcGwoaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKSB7Ci0gICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmFkanVzdFZvbHVtZShtQ29udHJvbGxlclN0dWIsIGRpcmVjdGlvbiwgZmxhZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaV9pbXBsKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJKTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1cmkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tVXJpKG1Db250cm9sbGVyU3R1YiwgdXJpLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucHJlcGFyZUZyb21TZWFyY2gobUNvbnRyb2xsZXJTdHViLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWRfaW1wbChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRCk7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tTWVkaWFJZChtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSSk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0gpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnBsYXlGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQpOwotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZ19pbXBsKFN0cmluZyBtZWRpYUlkLCBSYXRpbmcyIHJhdGluZykgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyYXRpbmcgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFJhdGluZyhtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIHJhdGluZy50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoY29tbWFuZCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZEN1c3RvbUNvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kLnRvQnVuZGxlKCksIGFyZ3MsIGNiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5bGlzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0X2ltcGwoTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1QpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChsaXN0LmdldChpKS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2V0UGxheWxpc3QobUNvbnRyb2xsZXJTdHViLCBidW5kbGVMaXN0LCBtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3RNZXRhZGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1Db250cm9sbGVyU3R1YiwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BSRVBBUkUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZhc3RGb3J3YXJkX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCBmYXN0IGZvcndhcmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCi0gICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fRkFTVF9GT1JXQVJEKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXdpbmRfaW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgdGhpcy4gTm90ZSB0aGF0IHJld2luZCBpc24ndCBhIHRyYW5zcG9ydCBjb21tYW5kIGFueW1vcmUKLSAgICAgICAgLy9zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoTWVkaWFTZXNzaW9uMi5DT01NQU5EX0NPREVfU0VTU0lPTl9SRVdJTkQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7Ci0gICAgICAgIGlmIChwb3MgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwb3NpdGlvbiBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYXJncy5wdXRMb25nKE1lZGlhU2Vzc2lvbjJTdHViLkFSR1VNRU5UX0tFWV9QT1NJVElPTiwgcG9zKTsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTywgYXJncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5kZXggc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5hZGRQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucmVtb3ZlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU0pOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlcGxhY2VQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFNodWZmbGVNb2RlKG1Db250cm9sbGVyU3R1Yiwgc2h1ZmZsZU1vZGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFJlcGVhdE1vZGUobUNvbnRyb2xsZXJTdHViLCByZXBlYXRNb2RlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm9faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja0luZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbG9uZyB0aW1lRGlmZiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbVBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICBsb25nIGV4cGVjdGVkUG9zaXRpb24gPSBtUG9zaXRpb25NcyArIChsb25nKSAobVBsYXliYWNrU3BlZWQgKiB0aW1lRGlmZik7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwZWN0ZWRQb3NpdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWJhY2tTcGVlZF9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3BlZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRCdWZmZXJlZFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtQnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudE1lZGlhSXRlbV9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5ZXJTdGF0ZUNoYW5nZXMoZmluYWwgaW50IHN0YXRlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHN0YXRlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXllclN0YXRlQ2hhbmdlZChtSW5zdGFuY2UsIHN0YXRlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUgdG8gc2VlayBjb21wbGV0ZWQKLSAgICB2b2lkIHB1c2hQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBldmVudFRpbWVNcywgZmluYWwgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gZXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2Vla0NvbXBsZXRlZChtSW5zdGFuY2UsIHBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhmaW5hbCBmbG9hdCBzcGVlZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHNwZWVkOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKG1JbnN0YW5jZSwgc3BlZWQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlcyhmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQnVmZmVyZWRQb3NpdGlvbk1zID0gYnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogRml4IHRoaXMgLS0gaXQncyBub3cgYnVmZmVyZWQgc3RhdGUKLSAgICAgICAgICAgIC8vbUNhbGxiYWNrLm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobUluc3RhbmNlLCBidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrSW5mb0NoYW5nZWQobUluc3RhbmNlLCBpbmZvKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWxpc3RDaGFuZ2VzKGZpbmFsIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OwotICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlcyhNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3RNZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgbWV0YWRhdGEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hTaHVmZmxlTW9kZUNoYW5nZXMoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUmVwZWF0TW9kZUNoYW5nZXMoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcmVwZWF0TW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaEVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRXJyb3IobUluc3RhbmNlLCBlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIHZvaWQgb25Db25uZWN0ZWROb3RMb2NrZWQoSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciwKLSAgICAgICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcywKLSAgICAgICAgICAgIGZpbmFsIGludCBwbGF5ZXJTdGF0ZSwKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25NcywKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICBmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcywKLSAgICAgICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvLAotICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUsCi0gICAgICAgICAgICBmaW5hbCBpbnQgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LAotICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbm5lY3RlZE5vdExvY2tlZCBzZXNzaW9uQmluZGVyPSIgKyBzZXNzaW9uQmluZGVyCi0gICAgICAgICAgICAgICAgICAgICsgIiwgYWxsb3dlZENvbW1hbmRzPSIgKyBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gY2xvc2UgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uQmluZGVyID09IG51bGwgfHwgYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHJlamVjdGVkLgotICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uQmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGJlIG5vdGlmaWVkIGFib3V0IHRoZSBjb25uZWN0aW9uIHJlc3VsdCBtYW55IHRpbWVzLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgUHJvYmFibHkgYSBidWcgb3IgbWFsaWNpb3VzIGFwcC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZHMgPSBhbGxvd2VkQ29tbWFuZHM7Ci0gICAgICAgICAgICAgICAgbVBsYXllclN0YXRlID0gcGxheWVyU3RhdGU7Ci0gICAgICAgICAgICAgICAgbVBvc2l0aW9uRXZlbnRUaW1lTXMgPSBwb3NpdGlvbkV2ZW50VGltZU1zOwotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbk1zID0gcG9zaXRpb25NczsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHBsYXliYWNrU3BlZWQ7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgICAgICAgICAgbVBsYXlsaXN0ID0gcGxheWxpc3Q7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb25BY3Rpdml0eTsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIHRoZSBsb2NhbCBiaW5kZXIgaXMgbm8tb3AsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIGNhbiBiZSB1c2VkIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50LCAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gZGllZCB0b28gZWFybHkuIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBLZWVwIGNvbW1hbmRzIHRvIHByZXZlbnRzIGlsbGVnYWwgQVBJIGNhbGxzLgotICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZTogV2UgbWF5IHRyaWdnZXIgQ29udHJvbGxlckNhbGxiYWNrcyB3aXRoIHRoZSBpbml0aWFsIHZhbHVlcwotICAgICAgICAgICAgICAgIC8vIEJ1dCBpdCdzIGhhcmQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiB0aGUgY29udHJvbGxlciBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyBPbmx5IG5vdGlmeSBhYm91dCB0aGUKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db25uZWN0ZWQobUluc3RhbmNlLCBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY2xvc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBUcmljayB0byBjYWxsIHJlbGVhc2UoKSB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2ssIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrCi0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgZGV2ZWxvcGVyJ3MgY3VzdG9tIGxvY2sgd2l0aGluIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKS4KLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25DdXN0b21Db21tYW5kKGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBmaW5hbCBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25DdXN0b21Db21tYW5kIGNtZD0iICsgY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiB0aGUgY29udHJvbGxlciBleGlzdHMuCi0gICAgICAgICAgICBtQ2FsbGJhY2sub25DdXN0b21Db21tYW5kKG1JbnN0YW5jZSwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQobUluc3RhbmNlLCBjb21tYW5kcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKGZpbmFsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChtSW5zdGFuY2UsIGxheW91dCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgotICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24gewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyBhbHdheXMgbWFpbi10aHJlYWQuCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblNlcnZpY2VDb25uZWN0ZWQgIiArIG5hbWUgKyAiICIgKyB0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjawotICAgICAgICAgICAgaWYgKCFtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMobmFtZS5nZXRQYWNrYWdlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCBuYW1lICsgIiB3YXMgY29ubmVjdGVkLCBidXQgZXhwZWN0ZWQgcGtnPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVRva2VuLmdldFBhY2thZ2VOYW1lKCkgKyAiIHdpdGggaWQ9IiArIG1Ub2tlbi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyID0gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKLSAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oc2Vzc2lvbkJpbmRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgewotICAgICAgICAgICAgLy8gVGVtcG9yYWwgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIGNyYXNoLiBTeXN0ZW0gd2lsbCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAvLyByZWJpbmQsIHNvIGp1c3Qgbm8tb3AuCi0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlYWxseT8gRWl0aGVyIGRpc2Nvbm5lY3QgY2xlYW5seSBvcgotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBzZXJ2aWNlICIgKyBuYW1lICsgIiBpcyBkaXNjb25uZWN0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25CaW5kaW5nRGllZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIC8vIFBlcm1hbmVudCBsb3NlIG9mIHRoZSBiaW5kaW5nIGJlY2F1c2Ugb2YgdGhlIHNlcnZpY2UgcGFja2FnZSB1cGRhdGUgb3IgcmVtb3ZlZC4KLSAgICAgICAgICAgIC8vIFRoaXMgU2Vzc2lvblNlcnZpY2VSZWNvcmQgd2lsbCBiZSByZW1vdmVkIGFjY29yZGluZ2x5LCBidXQgZm9yZ2V0IHNlc3Npb24gYmluZGVyIGhlcmUKLSAgICAgICAgICAgIC8vIGZvciBzdXJlLgotICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mb0ltcGwgaW1wbGVtZW50cyBQbGF5YmFja0luZm9Qcm92aWRlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19UWVBFID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5wbGF5YmFja190eXBlIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX1RZUEUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmNvbnRyb2xfdHlwZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX1ZPTFVNRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwubWF4X3ZvbHVtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ1VSUkVOVF9WT0xVTUUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmN1cnJlbnRfdm9sdW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19BVFRSSUJVVEVTID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5hdWRpb19hdHRycyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQbGF5YmFja0luZm8gbUluc3RhbmNlOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250cm9sVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIG1BdWRpb0F0dHJzOwotCi0gICAgICAgIHByaXZhdGUgUGxheWJhY2tJbmZvSW1wbChpbnQgcGxheWJhY2tUeXBlLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMsIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IHBsYXliYWNrVHlwZTsKLSAgICAgICAgICAgIG1BdWRpb0F0dHJzID0gYXR0cnM7Ci0gICAgICAgICAgICBtQ29udHJvbFR5cGUgPSBjb250cm9sVHlwZTsKLSAgICAgICAgICAgIG1NYXhWb2x1bWUgPSBtYXg7Ci0gICAgICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUGxheWJhY2tJbmZvKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1BdWRpb0F0dHJzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29udHJvbFR5cGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxheWJhY2tJbmZvIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1bmRsZSB0b0J1bmRsZSgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBtUGxheWJhY2tUeXBlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTlRST0xfVFlQRSwgbUNvbnRyb2xUeXBlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX01BWF9WT0xVTUUsIG1NYXhWb2x1bWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfQ1VSUkVOVF9WT0xVTUUsIG1DdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTLCBtQXVkaW9BdHRycyk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLAotICAgICAgICAgICAgICAgIGludCBjb250cm9sVHlwZSwgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tJbmZvSW1wbChwbGF5YmFja1R5cGUsIGF0dHJzLCBjb250cm9sVHlwZSwgbWF4LCBjdXJyZW50KQotICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCB2b2x1bWVUeXBlID0gYnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lQ29udHJvbCA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NPTlRST0xfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWF4Vm9sdW1lID0gYnVuZGxlLmdldEludChLRVlfTUFYX1ZPTFVNRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY3VycmVudFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FKTsKLSAgICAgICAgICAgIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBhdHRycyA9IGJ1bmRsZS5nZXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVUeXBlLCBhdHRycywgdm9sdW1lQ29udHJvbCwgbWF4Vm9sdW1lLCBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmYzVkZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIyU3R1YiBleHRlbmRzIElNZWRpYUNvbnRyb2xsZXIyLlN0dWIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMlN0dWIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZQotCi0gICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhQ29udHJvbGxlcjJJbXBsPiBtQ29udHJvbGxlcjsKLQotICAgIE1lZGlhQ29udHJvbGxlcjJTdHViKE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyMkltcGwgZ2V0Q29udHJvbGxlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRyb2xsZXIgaXMgcmVsZWFzZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhQnJvd3NlcjJJbXBsIGdldEJyb3dzZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBNZWRpYUJyb3dzZXIySW1wbCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUJyb3dzZXIySW1wbCkgY29udHJvbGxlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICBtQ29udHJvbGxlci5jbGVhcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXllclN0YXRlQ2hhbmdlcyhzdGF0ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50VGltZU1zIDwgMCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25Qb3NpdGlvbkNoYW5nZWQoKTogSWdub3JpbmcgbmVnYXRpdmUgZXZlbnRUaW1lTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zaXRpb25NcyA8IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIHBvc2l0aW9uTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQb3NpdGlvbkNoYW5nZXMoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhzcGVlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uTXMgPCAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIGJ1ZmZlcmVkUG9zaXRpb25NcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaEJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VzKGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTGlzdDxCdW5kbGU+IHBsYXlsaXN0QnVuZGxlLCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWxpc3RCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5bGlzdENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5bGlzdCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IHBsYXlsaXN0QnVuZGxlKSB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXlsaXN0Q2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGl0ZW0gaW4gcGxheWxpc3QiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGxheWxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXlsaXN0Q2hhbmdlcyhwbGF5bGlzdCwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoQnVuZGxlIG1ldGFkYXRhQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMobWV0YWRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hSZXBlYXRNb2RlQ2hhbmdlcyhyZXBlYXRNb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoQnVuZGxlIHBsYXliYWNrSW5mbykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheWJhY2tJbmZvQ2hhbmdlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm8gaW5mbyA9IFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pOwotICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXliYWNrSW5mb0NoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5YmFja0luZm8iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFNodWZmbGVNb2RlQ2hhbmdlcyhzaHVmZmxlTW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25FcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoRXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIEJ1bmRsZSBjb21tYW5kR3JvdXAsCi0gICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCBzaHVmZmxlTW9kZSwgaW50IHJlcGVhdE1vZGUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWQgYWZ0ZXIgTWVkaWFDb250cm9sbGVyMi5jbG9zZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUJ1bmRsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoaXRlbUJ1bmRsZUxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkNvbm5lY3RlZE5vdExvY2tlZChzZXNzaW9uQmluZGVyLAotICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyLmZyb21CdW5kbGUoY29tbWFuZEdyb3VwKSwKLSAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwgYnVmZmVyZWRQb3NpdGlvbk1zLAotICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pLCByZXBlYXRNb2RlLCBzaHVmZmxlTW9kZSwKLSAgICAgICAgICAgICAgICBpdGVtTGlzdCwgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkRpc2Nvbm5lY3RlZCBhZnRlciBNZWRpYUNvbnRyb2xsZXIyLmNsb3NlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLmdldEluc3RhbmNlKCkuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KSB7Ci0gICAgICAgIGlmIChjb21tYW5kQnV0dG9ubGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkN1c3RvbUxheW91dENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kQnV0dG9ubGlzdCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kQnV0dG9ubGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbiBidXR0b24gPSBDb21tYW5kQnV0dG9uSW1wbC5mcm9tQnVuZGxlKGNvbW1hbmRCdXR0b25saXN0LmdldChpKSk7Ci0gICAgICAgICAgICBpZiAoYnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsYXlvdXQuYWRkKGJ1dHRvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkN1c3RvbUxheW91dENoYW5nZWQobGF5b3V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoQnVuZGxlIGNvbW1hbmRzQnVuZGxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMgPSBTZXNzaW9uQ29tbWFuZEdyb3VwMi5mcm9tQnVuZGxlKGNvbW1hbmRzQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmRzIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tQ29tbWFuZChCdW5kbGUgY29tbWFuZEJ1bmRsZSwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShjb21tYW5kQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25DdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIE1lZGlhQnJvd3NlciBzcGVjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBCdW5kbGUgcm9vdEV4dHJhKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRMaWJyYXJ5Um9vdERvbmUocm9vdEhpbnRzLCByb290TWVkaWFJZCwgcm9vdEV4dHJhKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBpdGVtQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0SXRlbURvbmUoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0SXRlbURvbmUobWVkaWFJZCwgTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGl0ZW1CdW5kbGUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0Q2hpbGRyZW5Eb25lKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBpdGVtQnVuZGxlTGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRDaGlsZHJlbkRvbmUocGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25TZWFyY2hSZXN1bHRDaGFuZ2VkKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25HZXRTZWFyY2hSZXN1bHREb25lKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogaXRlbUJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShxdWVyeSwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ2hpbGRyZW5DaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGEwZjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZMQUdfQlJPV1NBQkxFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRkxBR19QTEFZQUJMRTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRmxhZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFJdGVtMkltcGwgaW1wbGVtZW50cyBNZWRpYUl0ZW0yUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLmlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZMQUdTID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5mbGFncyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NRVRBREFUQSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIubWV0YWRhdGEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVVJRCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIudXVpZCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhSXRlbTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtRmxhZ3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVVUlEIG1VVUlEOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgRGF0YVNvdXJjZURlc2MgbURhdGFTb3VyY2VEZXNjOwotCi0gICAgLy8gRnJvbSB0aGUgcHVibGljIEFQSQotICAgIHB1YmxpYyBNZWRpYUl0ZW0ySW1wbChATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSwgQEZsYWdzIGludCBmbGFncykgewotICAgICAgICB0aGlzKG1lZGlhSWQsIGRzZCwgbWV0YWRhdGEsIGZsYWdzLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTJJbXBsKEBOb25OdWxsIFN0cmluZyBtZWRpYUlkLCBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkLAotICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhLCBARmxhZ3MgaW50IGZsYWdzLCBATnVsbGFibGUgVVVJRCB1dWlkKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhtZWRpYUlkLCBtZXRhZGF0YS5nZXRNZWRpYUlkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRhZGF0YSdzIGlkIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIG1lZGlhaWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JZCA9IG1lZGlhSWQ7Ci0gICAgICAgIG1EYXRhU291cmNlRGVzYyA9IGRzZDsKLSAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICBtVVVJRCA9ICh1dWlkID09IG51bGwpID8gVVVJRC5yYW5kb21VVUlEKCkgOiB1dWlkOwotCi0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYUl0ZW0yKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTWVkaWFJdGVtMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNZWRpYUl0ZW0yIG90aGVyID0gKE1lZGlhSXRlbTIpIG9iajsKLSAgICAgICAgcmV0dXJuIG1VVUlELmVxdWFscygoKE1lZGlhSXRlbTJJbXBsKSBvdGhlci5nZXRQcm92aWRlcigpKS5tVVVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoaXMgb2JqZWN0IGFzIGEgYnVuZGxlIHRvIHNoYXJlIGJldHdlZW4gcHJvY2Vzc2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5ldyBidW5kbGUgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBtSWQpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9GTEFHUywgbUZsYWdzKTsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9NRVRBREFUQSwgbU1ldGFkYXRhLnRvQnVuZGxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1VVSUQsIG1VVUlELnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lZGlhSXRlbTIgZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgd2hpY2ggd2FzIHB1Ymxpc2hlZCBieSB7QGxpbmsgTWVkaWFJdGVtMiN0b0J1bmRsZSgpfS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIE1lZGlhSXRlbTIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgdXVpZFN0cmluZyA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1VVSUQpOwotICAgICAgICByZXR1cm4gZnJvbUJ1bmRsZShidW5kbGUsIFVVSUQuZnJvbVN0cmluZyh1dWlkU3RyaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgTWVkaWFJdGVtMiBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfSB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIFVVSUR9LgotICAgICAqIElmIHtAbGluayBVVUlEfQotICAgICAqIGNhbiBiZSBudWxsIGZvciBjcmVhdGluZyBuZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgd2hpY2ggd2FzIHB1Ymxpc2hlZCBieSB7QGxpbmsgTWVkaWFJdGVtMiN0b0J1bmRsZSgpfS4KLSAgICAgKiBAcGFyYW0gdXVpZCBBIHtAbGluayBVVUlEfSB0byBvdmVycmlkZS4gQ2FuIGJlIHtAbGluayBudWxsfSBmb3Igb3ZlcnJpZGUuCi0gICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBNZWRpYUl0ZW0yCi0gICAgICovCi0gICAgc3RhdGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZShATm9uTnVsbCBCdW5kbGUgYnVuZGxlLCBATnVsbGFibGUgVVVJRCB1dWlkKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gYnVuZGxlLmdldFN0cmluZyhLRVlfSUQpOwotICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSBidW5kbGUuZ2V0QnVuZGxlKEtFWV9NRVRBREFUQSk7Ci0gICAgICAgIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGZpbmFsIGludCBmbGFncyA9IGJ1bmRsZS5nZXRJbnQoS0VZX0ZMQUdTKTsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbChpZCwgbnVsbCwgbWV0YWRhdGEsIGZsYWdzLCB1dWlkKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiTWVkaWFJdGVtMnsiKTsKLSAgICAgICAgc2IuYXBwZW5kKCJtRmxhZ3M9IikuYXBwZW5kKG1GbGFncyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBtTWV0YWRhdGE9IikuYXBwZW5kKG1NZXRhZGF0YSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnfScpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQEZsYWdzIGludCBnZXRGbGFnc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbUZsYWdzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQnJvd3NhYmxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAobUZsYWdzICYgRkxBR19CUk9XU0FCTEUpICE9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQbGF5YWJsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfUExBWUFCTEUpICE9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMobUlkLCBtZXRhZGF0YS5nZXRNZWRpYUlkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRhZGF0YSdzIGlkIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIG1lZGlhSWQiKTsKLSAgICAgICAgfQotICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOb25OdWxsIFN0cmluZyBnZXRNZWRpYUlkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBnZXREYXRhU291cmNlRGVzY19pbXBsKCkgewotICAgICAgICByZXR1cm4gbURhdGFTb3VyY2VEZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgaW1wbGVtZW50cyBNZWRpYUl0ZW0yUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBCdWlsZGVyIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBARmxhZ3MgaW50IG1GbGFnczsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU1lZGlhSWQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1EYXRhU291cmNlRGVzYzsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQnVpbGRlciBpbnN0YW5jZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1lZGlhSWRfaW1wbChATnVsbGFibGUgU3RyaW5nIG1lZGlhSWQpIHsKLSAgICAgICAgICAgIG1NZWRpYUlkID0gbWVkaWFJZDsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREYXRhU291cmNlRGVzY19pbXBsKEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkYXRhU291cmNlRGVzYykgewotICAgICAgICAgICAgbURhdGFTb3VyY2VEZXNjID0gZGF0YVNvdXJjZURlc2M7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSAobU1ldGFkYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfTUVESUFfSUQpIDogbnVsbDsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gIFRPRE8oamFld2FuKTogRG91YmxlIGNoZWNrIGlmIGl0cyBzdWZmaWNpZW50IChlLmcuIFVzZSBVVUlEIGluc3RlYWQ/KQotICAgICAgICAgICAgICAgIGlkID0gKG1NZWRpYUlkICE9IG51bGwpID8gbU1lZGlhSWQgOiB0b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbChpZCwgbURhdGFTb3VyY2VEZXNjLCBtTWV0YWRhdGEsIG1GbGFncykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjM0Y2Q0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLkxpYnJhcnlSb290OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQnVpbGRlckJhc2VJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cwotICAgICAgICBNZWRpYUxpYnJhcnlTZXJ2aWNlMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvblNlcnZpY2UyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIE1lZGlhTGlicmFyeVNlc3Npb24gbUxpYnJhcnlTZXNzaW9uOwotCi0gICAgcHVibGljIE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICBzdXBlcihpbnN0YW5jZSk7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlX2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlX2ltcGwoKTsKLQotICAgICAgICAvLyBFZmZlY3RpdmVseSBmaW5hbAotICAgICAgICBNZWRpYVNlc3Npb24yIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmICghKHNlc3Npb24gaW5zdGFuY2VvZiBNZWRpYUxpYnJhcnlTZXNzaW9uKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIE1lZGlhTGlicmFyeVNlc3Npb24sIGJ1dCByZXR1cm5lZCBNZWRpYVNlc3Npb24yIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUxpYnJhcnlTZXNzaW9uID0gKE1lZGlhTGlicmFyeVNlc3Npb24pIGdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBpbnQgZ2V0U2Vzc2lvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBTZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb24ySW1wbAotICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYUxpYnJhcnlTZXNzaW9uUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLAotICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LCBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLAotICAgICAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcGxheWVyLCBpZCwgcGxheWxpc3RBZ2VudCwgdm9sdW1lUHJvdmlkZXIsIHNlc3Npb25BY3Rpdml0eSwKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tFeGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICAgICAgLy8gRG9uJ3QgcHV0IGFueSBleHRyYSBpbml0aWFsaXphdGlvbiBoZXJlLiBIZXJlJ3MgdGhlIHJlYXNvbi4KLSAgICAgICAgICAgIC8vIFN5c3RlbSBzZXJ2aWNlIHdpbGwgcmVjb2duaXplIHRoaXMgc2Vzc2lvbiBpbnNpZGUgb2YgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGFuZCB3b3VsZAotICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGlzIHNlc3Npb24gYXNzdW1pbmcgdGhhdCBpbml0aWFsaXphdGlvbiBpcyBmaW5pc2hlZC4gSG93ZXZlciwgaWYgYW55Ci0gICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYyBpcyBoZXJlLCBjYWxscyBmcm9tIHRoZSBzZXJ2ZXIgd291bGQgZmFpbC4KLSAgICAgICAgICAgIC8vIHNlZTogTWVkaWFTZXNzaW9uMlN0dWIjY29ubmVjdCgpCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBjcmVhdGVJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUxpYnJhcnlTZXNzaW9uKSBzdXBlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBnZXRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrKSBzdXBlci5nZXRDYWxsYmFjaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoY29udHJvbGxlciwgcGFyZW50SWQsIGl0ZW1Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlTZWFyY2hSZXN1bHRDaGFuZ2VkKGNvbnRyb2xsZXIsIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsCi0gICAgICAgICAgICBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYUxpYnJhcnlTZXNzaW9uLCBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s+IHsKLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsIEJ1aWxkZXIgaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihzZXJ2aWNlKTsKLSAgICAgICAgICAgIHNldFNlc3Npb25DYWxsYmFja19pbXBsKGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbChtQ29udGV4dCwgbVBsYXllciwgbUlkLCBtUGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyLCBtU2Vzc2lvbkFjdGl2aXR5LCBtQ2FsbGJhY2tFeGVjdXRvciwgbUNhbGxiYWNrKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5Um9vdEltcGwgaW1wbGVtZW50cyBMaWJyYXJ5Um9vdFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaWJyYXJ5Um9vdCBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb290SWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7Ci0KLSAgICAgICAgcHVibGljIExpYnJhcnlSb290SW1wbChMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKHJvb3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm9vdElkIHNob3VsZG4ndCBiZSBudWxsLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtUm9vdElkID0gcm9vdElkOwotICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3RJZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb290SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMWM1MzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuKjsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQml0bWFwS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkxvbmdLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5SYXRpbmdLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5UZXh0S2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1lZGlhTWV0YWRhdGEySW1wbCBpbXBsZW1lbnRzIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFNZXRhZGF0YTIiOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0xPTkcgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9URVhUID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfQklUTUFQID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfUkFUSU5HID0gMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfRkxPQVQgPSA0OwotICAgIHN0YXRpYyBmaW5hbCBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+IE1FVEFEQVRBX0tFWVNfVFlQRTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRSA9IG5ldyBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVVUSE9SLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9XUklURVIsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0NPTVBPU0VSLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfREFURSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfWUVBUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfR0VOUkUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJULCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVF9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORywgTUVUQURBVEFfVFlQRV9SQVRJTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OLCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX0lELCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRSwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BRFZFUlRJU0VNRU5ULCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ET1dOTE9BRF9TVEFUVVMsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQFRleHRLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVIgPSB7Ci0gICAgICAgICAgICBNRVRBREFUQV9LRVlfVElUTEUsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUSVNULAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9XUklURVIsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVVUSE9SLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBPU0VSCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBCaXRtYXBLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfQklUTUFQX09SREVSID0gewotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlQsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX1VSSV9PUkRFUiA9IHsKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVF9VUkksCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEySW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYU1ldGFkYXRhMih0aGlzKTsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXlfaW1wbChTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Q2hhclNlcXVlbmNlKGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmdldFN0cmluZyhNRVRBREFUQV9LRVlfTUVESUFfSUQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nX2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbUJ1bmRsZS5nZXRDaGFyU2VxdWVuY2Uoa2V5KTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoa2V5LCAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBnZXRSYXRpbmdfaW1wbChAUmF0aW5nS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIFJhdGluZzIgcmF0aW5nID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJhdGluZyA9IFJhdGluZzIuZnJvbUJ1bmRsZShtQnVuZGxlLmdldEJ1bmRsZShrZXkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIHJhdGluZwotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIFJhdGluZy4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmF0aW5nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdF9pbXBsKEBGbG9hdEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0RmxvYXQoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQml0bWFwIGdldEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIEJpdG1hcCBibXAgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm1wID0gbUJ1bmRsZS5nZXRQYXJjZWxhYmxlKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYSBiaXRtYXAKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhIGtleSBhcyBCaXRtYXAuIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJtcDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGFuIGJ1bmRsZQotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGFuIGV4dHJhIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBzaXplX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLnNpemUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmtleVNldCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gKGJ1bmRsZSA9PSBudWxsKSA/IG51bGwgOiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsKGJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2Ugc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoc291cmNlLnRvQnVuZGxlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKGludCBtYXhCaXRtYXBTaXplKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFNZXRhZGF0YTIuQnVpbGRlcih0aGlzKTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1CdW5kbGUua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtQnVuZGxlLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpdG1hcCkgewotICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm1wID0gKEJpdG1hcCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibXAuZ2V0SGVpZ2h0KCkgPiBtYXhCaXRtYXBTaXplIHx8IGJtcC5nZXRXaWR0aCgpID4gbWF4Qml0bWFwU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnB1dEJpdG1hcChrZXksIHNjYWxlQml0bWFwKGJtcCwgbWF4Qml0bWFwU2l6ZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBDaGFyU2VxdWVuY2UgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIENoYXJTZXF1ZW5jZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRTdHJpbmdfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfTE9ORykgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgbG9uZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0UmF0aW5nX2ltcGwoQFJhdGluZ0tleSBTdHJpbmcga2V5LCBSYXRpbmcyIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9SQVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFJhdGluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKGtleSwgdmFsdWUudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSwgQml0bWFwIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9CSVRNQVApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIEJpdG1hcCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0RmxvYXRfaW1wbChARmxvYXRLZXkgU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBmbG9hdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0RmxvYXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMsIGJ1bmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhMkltcGwobUJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQml0bWFwIHNjYWxlQml0bWFwKEJpdG1hcCBibXAsIGludCBtYXhTaXplKSB7Ci0gICAgICAgICAgICBmbG9hdCBtYXhTaXplRiA9IG1heFNpemU7Ci0gICAgICAgICAgICBmbG9hdCB3aWR0aFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGZsb2F0IGhlaWdodFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKHdpZHRoU2NhbGUsIGhlaWdodFNjYWxlKTsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSAoaW50KSAoYm1wLmdldEhlaWdodCgpICogc2NhbGUpOwotICAgICAgICAgICAgaW50IHdpZHRoID0gKGludCkgKGJtcC5nZXRXaWR0aCgpICogc2NhbGUpOwotICAgICAgICAgICAgcmV0dXJuIEJpdG1hcC5jcmVhdGVTY2FsZWRCaXRtYXAoYm1wLCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkNGUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkNhbGxiYWNrRXhlY3V0b3I7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsIGltcGxlbWVudHMgTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFQbGF5bGlzdEFnZW50IjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IG1JbnN0YW5jZTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IG1DYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOwotCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudEltcGwoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrX2ltcGwoCi0gICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwgQE5vbk51bGwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJleGVjdXRvciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja3MuZ2V0KGNhbGxiYWNrKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY2FsbGJhY2sgaXMgYWxyZWFkeSBhZGRlZC4gSWdub3JpbmcuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrcy5wdXQoY2FsbGJhY2ssIGV4ZWN1dG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2tfaW1wbCgKLSAgICAgICAgICAgIEBOb25OdWxsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tzLnJlbW92ZShjYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3Q9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdCgpOwotICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UGxheWxpc3RNZXRhZGF0YSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0U2h1ZmZsZU1vZGUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRSZXBlYXRNb2RlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTGlzdDxNZWRpYUl0ZW0yPiBnZXRQbGF5bGlzdF9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYUl0ZW0yIGdldE1lZGlhSXRlbV9pbXBsKEBOb25OdWxsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRzZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBtSW5zdGFuY2UuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgaWYgKGl0ZW1MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGl0ZW1MaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5nZXREYXRhU291cmNlRGVzYygpID09IGRzZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gZ2V0Q2FsbGJhY2tzKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBjYWxsYmFja3MucHV0QWxsKG1DYWxsYmFja3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWxsYmFja3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM2MDQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfQ1VTVE9NOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT047Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllclN0YXRlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb24ySW1wbCBpbXBsZW1lbnRzIE1lZGlhU2Vzc2lvbjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVNlc3Npb24yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsvL0xvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOwotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMlN0dWIgbVNlc3Npb25TdHViOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtU2Vzc2lvblRva2VuOwotICAgIHByaXZhdGUgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7Ci0KLSAgICAvLyBtUGxheWVyIGlzIHNldCB0byBudWxsIHdoZW4gdGhlIHNlc3Npb24gaXMgY2xvc2VkLCBhbmQgd2Ugc2hvdWxkbid0IHRocm93IGFuIGV4Y2VwdGlvbgotICAgIC8vIG5vciBsZWF2ZSBsb2cgYWx3YXlzIGZvciB1c2luZyBtUGxheWVyIHdoZW4gaXQncyBudWxsLiBIZXJlJ3MgdGhlIHJlYXNvbi4KLSAgICAvLyBXaGVuIGEgTWVkaWFTZXNzaW9uMiBpcyBjbG9zZWQsIHRoZXJlIGNvdWxkIGJlIGEgcGVuZGVkIG9wZXJhdGlvbiBpbiB0aGUgc2Vzc2lvbiBjYWxsYmFjawotICAgIC8vIGV4ZWN1dG9yIHRoYXQgbWF5IHdhbnQgdG8gYWNjZXNzIHRoZSBwbGF5ZXIuIEhlcmUncyB0aGUgc2FtcGxlIGNvZGUgc25pcHBldCBmb3IgdGhhdC4KLSAgICAvLwotICAgIC8vICAgcHVibGljIHZvaWQgb25Gb28oKSB7Ci0gICAgLy8gICAgIGlmIChtUGxheWVyID09IG51bGwpIHJldHVybjsgLy8gZmlyc3QgY2hlY2sKLSAgICAvLyAgICAgbVNlc3Npb25DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dG9yKCgpIC0+IHsKLSAgICAvLyAgICAgICAvLyBFcnJvci4gU2Vzc2lvbiBtYXkgYmUgY2xvc2VkIGFuZCBtUGxheWVyIGNhbiBiZSBudWxsIGhlcmUuCi0gICAgLy8gICAgICAgbVBsYXllci5mb28oKTsKLSAgICAvLyAgICAgfSk7Ci0gICAgLy8gICB9Ci0gICAgLy8KLSAgICAvLyBCeSBhZGRpbmcgcHJvdGVjdGl2ZSBjb2RlLCB3ZSBjYW4gYWxzbyBwcm90ZWN0IEFQSXMgZnJvbSBiZWluZyBjYWxsZWQgYWZ0ZXIgdGhlIGNsb3NlKCkKLSAgICAvLwotICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIHB1dCB2b2xhdGlsZSBoZXJlPwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBQbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbzsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDYW4gYmUgb25seSBjYWxsZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyI2J1aWxkKCl9LgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIHBsYXllcgotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEBwYXJhbSBwbGF5bGlzdEFnZW50Ci0gICAgICogQHBhcmFtIHZvbHVtZVByb3ZpZGVyCi0gICAgICogQHBhcmFtIHNlc3Npb25BY3Rpdml0eQotICAgICAqIEBwYXJhbSBjYWxsYmFja0V4ZWN1dG9yCi0gICAgICogQHBhcmFtIGNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgU3RyaW5nIGlkLAotICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKLSAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LAotICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBvdGhlciBwYXJhbXMuCi0gICAgICAgIG1JbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7Ci0KLSAgICAgICAgLy8gQXJndW1lbnQgY2hlY2tzIGFyZSBkb25lIGJ5IGJ1aWxkZXIgYWxyZWFkeS4KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBmaW5hbHMgZmlyc3QuCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7Ci0gICAgICAgIG1TZXNzaW9uU3R1YiA9IG5ldyBNZWRpYVNlc3Npb24yU3R1Yih0aGlzKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sodGhpcyk7Ci0KLSAgICAgICAgLy8gSW5mZXIgdHlwZSBmcm9tIHRoZSBpZCBhbmQgcGFja2FnZSBuYW1lLgotICAgICAgICBTdHJpbmcgbGlicmFyeVNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOwotICAgICAgICBTdHJpbmcgc2Vzc2lvblNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOwotICAgICAgICBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCAmJiBsaWJyYXJ5U2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfTElCUkFSWV9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBsaWJyYXJ5U2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKFByb2Nlc3MubXlVaWQoKSwgVFlQRV9TRVNTSU9OX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIHNlc3Npb25TZXJ2aWNlLCBpZCwgbVNlc3Npb25TdHViKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbnVsbCwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKLQotICAgICAgICAvLyBBc2sgc2VydmVyIGZvciB0aGUgc2FuaXR5IGNoZWNrLCBhbmQgc3RhcnRzCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgbWFraW5nIHNlc3Npb24gSUQgdW5pcXVlICdwZXIgcGFja2FnZScgY2Fubm90IGJlIGRvbmUgaW4gaGVyZS4KLSAgICAgICAgLy8gU2VydmVyIGNhbiBvbmx5IGtub3cgaWYgdGhlIHBhY2thZ2UgaGFzIGFub3RoZXIgcHJvY2VzcyBhbmQgaGFzIGFub3RoZXIgc2Vzc2lvbiB3aXRoIHRoZQotICAgICAgICAvLyBzYW1lIGlkLiBOb3RlIHRoYXQgJ0lEIGlzIHVuaXF1ZSBwZXIgcGFja2FnZScgaXMgaW1wb3J0YW50IGZvciBjb250cm9sbGVyIHRvIGRpc3Rpbmd1aXNoCi0gICAgICAgIC8vIGEgc2Vzc2lvbiBpbiBhbm90aGVyIHBhY2thZ2UuCi0gICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgKE1lZGlhU2Vzc2lvbk1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICBpZiAoIW1hbmFnZXIuY3JlYXRlU2Vzc2lvbjIobVNlc3Npb25Ub2tlbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNlc3Npb24gd2l0aCB0aGUgc2FtZSBpZCBpcyBhbHJlYWR5IHVzZWQgYnkiCi0gICAgICAgICAgICAgICAgICAgICsgIiBhbm90aGVyIHByb2Nlc3MuIFVzZSBNZWRpYUNvbnRyb2xsZXIyIGluc3RlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGNyZWF0ZUluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHNlcnZpY2VBY3Rpb24sIFN0cmluZyBpZCkgewotICAgICAgICBQYWNrYWdlTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBJbnRlbnQgc2VydmljZUludGVudCA9IG5ldyBJbnRlbnQoc2VydmljZUFjdGlvbik7Ci0gICAgICAgIHNlcnZpY2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBzZXJ2aWNlcyA9IG1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhzZXJ2aWNlSW50ZW50LAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlSWQgPSBTZXNzaW9uVG9rZW4ySW1wbC5nZXRTZXNzaW9uSWQoc2VydmljZXMuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUlkICE9IG51bGwgJiYgVGV4dFV0aWxzLmVxdWFscyhpZCwgc2VydmljZUlkKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlcy5nZXQoaSkuc2VydmljZUluZm8ubmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWVyKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCwKLSAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgb2xkQWdlbnQ7Ci0gICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvID0gY3JlYXRlUGxheWJhY2tJbmZvKHZvbHVtZVByb3ZpZGVyLCBwbGF5ZXIuZ2V0QXVkaW9BdHRyaWJ1dGVzKCkpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBvbGRQbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAgICAgb2xkQWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudCh0aGlzLCBtUGxheWVyKTsKLSAgICAgICAgICAgICAgICBpZiAobURzbUhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKG1Ec21IZWxwZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZ2VudCA9IG1TZXNzaW9uUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gYWdlbnQ7Ci0gICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKLSAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gb2xkUGxheWVyKSB7Ci0gICAgICAgICAgICBwbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgICAgICBpZiAob2xkUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICBvbGRQbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChhZ2VudCAhPSBvbGRBZ2VudCkgewotICAgICAgICAgICAgYWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrRXhlY3V0b3IsIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgaWYgKG9sZEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICBvbGRBZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChpbmZvKTsKLSAgICAgICAgICAgIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQob2xkUGxheWVyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlcGVhdCB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIHBsYXlsaXN0IGFnZW50LgotICAgIH0KLQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIGNyZWF0ZVBsYXliYWNrSW5mbyhWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsIEF1ZGlvQXR0cmlidXRlcyBhdHRycykgewotICAgICAgICBQbGF5YmFja0luZm8gaW5mbzsKLSAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzdHJlYW07Ci0gICAgICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGF0dHJzLmdldFZvbHVtZUNvbnRyb2xTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvTWFuYWdlci5VU0VfREVGQVVMVF9TVFJFQU1fVFlQRSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJdCBtYXkgaGFwcGVuIGlmIHRoZSBBdWRpb0F0dHJpYnV0ZXMgZG9lc24ndCBoYXZlIHVzYWdlLgotICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaXQgdG8gdGhlIFNUUkVBTV9NVVNJQyBiZWNhdXNlIGl0J3Mgbm90IHN1cHBvcnRlZCBieSBhdWRpbyBtYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgIC8vIGZvciBxdWVyeWluZyB2b2x1bWUgbGV2ZWwuCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCwKLSAgICAgICAgICAgICAgICAgICAgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNWb2x1bWVGaXhlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURSwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoc3RyZWFtKSwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoc3RyZWFtKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvID0gTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbC5jcmVhdGVQbGF5YmFja0luZm8oCi0gICAgICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URSAvKiBDb250cm9sVHlwZSAqLywKLSAgICAgICAgICAgICAgICAgICAgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldENvbnRyb2xUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldE1heFZvbHVtZSgpLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDdXJyZW50Vm9sdW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7Ci0gICAgICAgIC8vIFN0b3Agc3lzdGVtIHNlcnZpY2UgZnJvbSBsaXN0ZW5pbmcgdGhpcyBzZXNzaW9uIGZpcnN0LgotICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgbWFuYWdlci5kZXN0cm95U2Vzc2lvbjIobVNlc3Npb25Ub2tlbik7Ci0KLSAgICAgICAgaWYgKG1TZXNzaW9uU3R1YiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXNzaW9uIGlzIG5vdyB1bmF2YWlsYWJsZSwgaWQ9IiArIG1JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHByZXZpb3VzbHkgcHVibGlzaGVkIHNlc3Npb24gc3R1Yi4KLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5kZXN0cm95Tm90TG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcjsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50OwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAgICAgbVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBudWxsOwotICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci51bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobVBsYXlsaXN0RXZlbnRDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcl9pbXBsKCkgewotICAgICAgICByZXR1cm4gZ2V0UGxheWVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudCBnZXRQbGF5bGlzdEFnZW50X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0VG9rZW5faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uVG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8Q29udHJvbGxlckluZm8+IGdldENvbm5lY3RlZENvbnRyb2xsZXJzX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWIuZ2V0Q29udHJvbGxlcnMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKEF1ZGlvRm9jdXNSZXF1ZXN0IGFmcikgewotICAgICAgICAvLyBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnBsYXkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnJlc2V0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21MYXlvdXRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxheW91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsYXlvdXQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5Q3VzdG9tTGF5b3V0Tm90TG9ja2VkKGNvbnRyb2xsZXIsIGxheW91dCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCBmb2xsb3dzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRDb21tYW5kc19pbXBsKEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmRzIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLnNldEFsbG93ZWRDb21tYW5kcyhjb250cm9sbGVyLCBjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb21tYW5kLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRQbGF5bGlzdChsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LmFkZFBsYXlsaXN0SXRlbShpbmRleCwgaXRlbSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudFBsYXlsaXN0SXRlbV9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRSZXBlYXRNb2RlKHJlcGVhdE1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGVfaW1wbChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRTaHVmZmxlTW9kZShzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnByZXBhcmUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnNlZWtUbyhwb3MpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBQbGF5ZXJTdGF0ZSBpbnQgZ2V0UGxheWVyU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9FUlJPUjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RXJyb3JfaW1wbChpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlFcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcl9pbXBsKEBOb25OdWxsIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIGlmIChoZWxwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaGVscGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgICAgIGlmIChtU2Vzc2lvblBsYXlsaXN0QWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKGhlbHBlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBFbmZvcmNlcyBkZXZlbG9wZXJzIHRvIGNhbGwgYWxsIHRoZSBtZXRob2RzIG9uIHRoZSBpbml0aWFsbHkgZ2l2ZW4gdGhyZWFkCi0gICAgLy8gYmVjYXVzZSBjYWxscyBmcm9tIHRoZSBNZWRpYUNvbnRyb2xsZXIyIHdpbGwgYmUgcnVuIG9uIHRoZSB0aHJlYWQuCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgYWxsb3cgY2FsbHMgZnJvbSB0aGUgbXVsdGlwbGUgdGhyZWFkPwotICAgIC8vICAgICAgICAgICAgICAgSSBwcmVmZXIgdGhpcyB3YXkgYmVjYXVzZSBhbGxvd2luZyBtdWx0aXBsZSB0aHJlYWQgbWF5IGNhc2UgdHJpY2t5IGlzc3VlIGxpa2UKLSAgICAvLyAgICAgICAgICAgICAgIGIvNjM0NDYzNjAuIElmIHRoZSB7QGxpbmsgI3NldFBsYXllcigpfSB3aXRoIHtAY29kZSBudWxsfSBjYW4gYmUgY2FsbGVkIGZyb20KLSAgICAvLyAgICAgICAgICAgICAgIGFub3RoZXIgdGhyZWFkLCB0cmFuc3BvcnQgY29udHJvbHMgY2FuIGJlIGNhbGxlZCBhZnRlciB0aGF0LgotICAgIC8vICAgICAgICAgICAgICAgVGhhdCdzIGJhc2ljYWxseSB0aGUgZGV2ZWxvcGVyJ3MgbWlzdGFrZSwgYnV0IHRoZXkgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCdzCi0gICAgLy8gICAgICAgICAgICAgICBoYXBwZW5pbmcgYmVoaW5kIHVudGlsIHdlIHRlbGwgdGhlbSBzby4KLSAgICAvLyAgICAgICAgICAgICAgIElmIGVuZm9yY2luZyBjYWxsbGluZyB0aHJlYWQgZG9lc24ndCBsb29rIGdvb2QsIHdlIGNhbiBhbHRlcm5hdGl2ZWx5IHBpY2sKLSAgICAvLyAgICAgICAgICAgICAgIDEuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLgotICAgIC8vICAgICAgICAgICAgICAgMi4gQWxsb3cgY2FsbHMgZnJvbSByYW5kb20gdGhyZWFkcyBmb3IgYWxsIG1ldGhvZHMsIGV4Y2VwdCBmb3IgdGhlCi0gICAgLy8gICAgICAgICAgICAgICAgICB7QGxpbmsgI3NldFBsYXllcigpfS4KLSAgICB2b2lkIGVuc3VyZUNhbGxpbmdUaHJlYWQoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IG9yIHJlbW92ZQotICAgICAgICAvKgotICAgICAgICBpZiAobUhhbmRsZXIuZ2V0TG9vcGVyKCkgIT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJ1biB0aGlzIG9uIHRoZSBnaXZlbiB0aHJlYWQiKTsKLSAgICAgICAgfSovCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIGxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE5vdExvY2tlZChsaXN0LCBtZXRhZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgbWV0YWRhdGEpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQobWV0YWRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWROb3RMb2NrZWQocmVwZWF0TW9kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKHNodWZmbGVNb2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UGxheWVyVXBkYXRlZE5vdExvY2tlZChNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKSBGaW5kIGJldHRlciB3YXkgZm9yIHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpIC8vCi0gICAgICAgIC8vICAgICAgICAgICAgICAgSW4gdGhlb3J5LCBTZXNzaW9uLmdldFhYWCgpIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgUGxheWVyLmdldFhYWCgpCi0gICAgICAgIC8vICAgICAgICAgICAgICAgYW5kIHdlIHNob3VsZCBub3RpZnkgaW5mb3JtYXRpb24gb2YgdGhlIHNlc3Npb24uZ2V0WFhYKCkgaW5zdGVhZCBvZgotICAgICAgICAvLyAgICAgICAgICAgICAgIHBsYXllci5nZXRYWFgoKQotICAgICAgICAvLyBOb3RpZnkgdG8gY29udHJvbGxlcnMgYXMgd2VsbC4KLSAgICAgICAgZmluYWwgaW50IHN0YXRlID0gcGxheWVyLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBvbGRQbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbiA9IHBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKHBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChjdXJyZW50VGltZU1zLCBwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBmbG9hdCBzcGVlZCA9IHBsYXllci5nZXRQbGF5YmFja1NwZWVkKCk7Ci0gICAgICAgIGlmIChzcGVlZCAhPSBvbGRQbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tTcGVlZENoYW5nZWROb3RMb2NrZWQoc3BlZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uID0gcGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgaWYgKGJ1ZmZlcmVkUG9zaXRpb24gIT0gb2xkUGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGJ1ZmZlcmVkUG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRleHQ7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBNZWRpYVBsYXllckJhc2UgZ2V0UGxheWVyKCkgewotICAgICAgICByZXR1cm4gbVBsYXllcjsKLSAgICB9Ci0KLSAgICBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5bGlzdEFnZW50OwotICAgIH0KLQotICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICB9Ci0KLSAgICBTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2s7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMlN0dWIgZ2V0U2Vzc2lvblN0dWIoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWI7Ci0gICAgfQotCi0gICAgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOwotICAgIH0KLQotICAgIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm8oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgICAgIHByaXZhdGUgTXlQbGF5ZXJFdmVudENhbGxiYWNrKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKLSAgICAgICAgICAgIG1TZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1cnJlbnRNZWRpYUl0ZW1DaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbk1lZGlhUHJlcGFyZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25NZWRpYVByZXBhcmVkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRTZXNzaW9uU3R1YigpLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQnVmZmVyaW5nU3RhdGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBtcGIsIGl0ZW0sIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW0oTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBzZXNzaW9uLmdldFBsYXlsaXN0QWdlbnQoKTsKLSAgICAgICAgICAgIGlmIChhZ2VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaXMgY2xvc2VkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBhZ2VudC5nZXRNZWRpYUl0ZW0oZHNkKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ291bGQgbm90IGZpbmQgbWF0Y2hpbmcgaXRlbSBmb3IgZHNkPSIgKyBkc2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXlsaXN0RXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICAgICAgcHJpdmF0ZSBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb21tYW5kSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DT0RFCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmNvbW1hbmRfY29kZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jdXN0b21fY29tbWFuZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9FWFRSQVMKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuZXh0cmFzIjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kMiBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db21tYW5kQ29kZTsKLSAgICAgICAgLy8gTm9ubnVsbCBpZiBpdCdzIGN1c3RvbSBjb21tYW5kCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DdXN0b21Db21tYW5kOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIGludCBjb21tYW5kQ29kZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBjb21tYW5kQ29kZTsKLSAgICAgICAgICAgIG1DdXN0b21Db21tYW5kID0gbnVsbDsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRJbXBsKFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbiwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1Db21tYW5kQ29kZSA9IENPTU1BTkRfQ09ERV9DVVNUT007Ci0gICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IGFjdGlvbjsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb21tYW5kQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRDdXN0b21Db21tYW5kX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1c3RvbUNvbW1hbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IEJ1bmRsZSBpbnN0YW5jZSBmcm9tIHRoZSBDb21tYW5kCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTU1BTkRfQ09ERSwgbUNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQsIG1DdXN0b21Db21tYW5kKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTLCBtRXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBDb21tYW5kIGluc3RhbmNlIGZyb20gdGhlIEJ1bmRsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGNvZGUgPSBjb21tYW5kLmdldEludChLRVlfQ09NTUFORF9DT0RFKTsKLSAgICAgICAgICAgIGlmIChjb2RlICE9IENPTU1BTkRfQ09ERV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Db21tYW5kMihjb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGN1c3RvbUNvbW1hbmQgPSBjb21tYW5kLmdldFN0cmluZyhLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY3VzdG9tQ29tbWFuZCwgY29tbWFuZC5nZXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29tbWFuZEltcGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29tbWFuZEltcGwgb3RoZXIgPSAoQ29tbWFuZEltcGwpIG9iajsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29tcGFyZSBDb21tYW5kcyB3aXRoIHRoZSBnZW5lcmF0ZWQgVVVJRCwgYXMgd2UncmUgZG9pbmcgZm9yIHRoZSBNSTIuCi0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRDb2RlID09IG90aGVyLm1Db21tYW5kQ29kZQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1DdXN0b21Db21tYW5kLCBvdGhlci5tQ3VzdG9tQ29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7Ci0gICAgICAgICAgICByZXR1cm4gKChtQ3VzdG9tQ29tbWFuZCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/IG1DdXN0b21Db21tYW5kLmhhc2hDb2RlKCkgOiAwKSAqIHByaW1lICsgbUNvbW1hbmRDb2RlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50IHNldCBvZiB7QGxpbmsgU2Vzc2lvbkNvbW1hbmQyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRHcm91cEltcGwgaW1wbGVtZW50cyBDb21tYW5kR3JvdXBQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORFMgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhc2Vzc2lvbjIuY29tbWFuZGdyb3VwLmNvbW1hbmRzIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGFsbCBjb21tYW5kIGNvZGVzCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFID0gIkNPTU1BTkRfQ09ERV8iOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5ZXJCYXNlCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlCQUNLID0gIkNPTU1BTkRfQ09ERV9QTEFZQkFDS18iOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5bGlzdEFnZW50Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlMSVNUID0gIkNPTU1BTkRfQ09ERV9QTEFZTElTVF8iOwotCi0gICAgICAgIHByaXZhdGUgU2V0PFNlc3Npb25Db21tYW5kMj4gbUNvbW1hbmRzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIG1JbnN0YW5jZTsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbChTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIGlmIChvdGhlciAhPSBudWxsICYmIG90aGVyIGluc3RhbmNlb2YgQ29tbWFuZEdyb3VwSW1wbCkgewotICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGRBbGwoKChDb21tYW5kR3JvdXBJbXBsKSBvdGhlcikubUNvbW1hbmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kR3JvdXBJbXBsKCkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21tYW5kcy5hZGQoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQWxsUHJlZGVmaW5lZENvbW1hbmRzX2ltcGwoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEFsbFBsYXlsaXN0Q29tbWFuZHMoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBwb3N0LVApOiBEb24ndCB1c2UgcmVmbGVjdGlvbiBmb3IgdGhpcyBwdXJwb3NlLgotICAgICAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBNZWRpYVNlc3Npb24yLmNsYXNzLmdldEZpZWxkcygpOwotICAgICAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGQobmV3IFNlc3Npb25Db21tYW5kMihmaWVsZHNbaV0uZ2V0SW50KG51bGwpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkICIgKyBmaWVsZHNbaV0gKyAiIGluIE1lZGlhU2Vzc2lvbjIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tbWFuZHMucmVtb3ZlKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZHMuY29udGFpbnMoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWFuZF9pbXBsKGludCBjb2RlKSB7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXNlIGhhc0NvbW1hbmQoQ29tbWFuZCkgZm9yIGN1c3RvbSBjb21tYW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2V0PFNlc3Npb25Db21tYW5kMj4gZ2V0Q29tbWFuZHNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb21tYW5kcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzKCkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChtQ29tbWFuZHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gbmV3IGJ1bmRsZSBmcm9tIHRoZSBDb21tYW5kR3JvdXAKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoY29tbWFuZC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMsIGxpc3QpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBDb21tYW5kR3JvdXAgZnJvbSB0aGUgYnVuZGxlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEBOdWxsYWJsZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGNvbW1hbmRzKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxQYXJjZWxhYmxlPiBsaXN0ID0gY29tbWFuZHMuZ2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMpOwotICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZEdyb3VwID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJjZWxhYmxlIHBhcmNlbGFibGUgPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIShwYXJjZWxhYmxlIGluc3RhbmNlb2YgQnVuZGxlKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSAoQnVuZGxlKSBwYXJjZWxhYmxlOwotICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb21tYW5kR3JvdXAuYWRkQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tbWFuZEdyb3VwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250cm9sbGVySW5mb0ltcGwgaW1wbGVtZW50cyBDb250cm9sbGVySW5mb1Byb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVySW5mbyBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1RydXN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgbUNvbnRyb2xsZXJCaW5kZXI7Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2xsZXJJbmZvSW1wbChDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLAotICAgICAgICAgICAgICAgIGludCBwaWQsIEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtVWlkID0gdWlkOwotICAgICAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgICAgICBtQ29udHJvbGxlckJpbmRlciA9IGNhbGxiYWNrOwotICAgICAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICAgICAgLy8gQXNrIHNlcnZlciB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGlzIHRydXN0ZWQuCi0gICAgICAgICAgICAvLyBBcHAgY2Fubm90IGtub3cgdGhpcyBiZWNhdXNlIGFwcHMgY2Fubm90IHF1ZXJ5IGVuYWJsZWQgbm90aWZpY2F0aW9uIGxpc3RlbmVyIGZvcgotICAgICAgICAgICAgLy8gYW5vdGhlciBwYWNrYWdlLCBidXQgc3lzdGVtIHNlcnZlciBjYW4gZG8uCi0gICAgICAgICAgICBtSXNUcnVzdGVkID0gbWFuYWdlci5pc1RydXN0ZWRGb3JNZWRpYUNvbnRyb2woCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVWlkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVHJ1c3RlZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc1RydXN0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29udHJvbGxlckluZm8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoKENvbnRyb2xsZXJJbmZvKSBvYmopLmdldFByb3ZpZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiAiQ29udHJvbGxlckluZm8ge3BrZz0iICsgbVBhY2thZ2VOYW1lICsgIiwgdWlkPSIgKyBtVWlkICsgIiwgdHJ1c3RlZD0iCi0gICAgICAgICAgICAgICAgICAgICsgbUlzVHJ1c3RlZCArICJ9IjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvSW1wbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250cm9sbGVySW5mb0ltcGwgb3RoZXIgPSAoQ29udHJvbGxlckluZm9JbXBsKSBvYmo7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKS5lcXVhbHMob3RoZXIubUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250cm9sbGVySW5mbyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJQmluZGVyIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIENvbnRyb2xsZXJJbmZvSW1wbCBmcm9tKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ29udHJvbGxlckluZm9JbXBsKSBjb250cm9sbGVyLmdldFByb3ZpZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRCdXR0b25JbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5ECi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5jb21tYW5kIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JQ09OX1JFU19JRAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uaWNvbl9yZXNfaWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU1BMQVlfTkFNRQotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZGlzcGxheV9uYW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmV4dHJhcyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZW5hYmxlZCI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uSW1wbChATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIGludCBpY29uUmVzSWQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkaXNwbGF5TmFtZSwgQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICBtQ29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlc0lkOwotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IENvbW1hbmRCdXR0b24odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZQotICAgICAgICBTZXNzaW9uQ29tbWFuZDIgZ2V0Q29tbWFuZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SWNvblJlc0lkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUljb25SZXNJZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXREaXNwbGF5TmFtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FbmFibGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgQnVuZGxlIHRvQnVuZGxlKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkQsIG1Db21tYW5kLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfSUNPTl9SRVNfSUQsIG1JY29uUmVzSWQpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfRElTUExBWV9OQU1FLCBtRGlzcGxheU5hbWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBtRXh0cmFzKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBtRW5hYmxlZCk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIEBOdWxsYWJsZSBDb21tYW5kQnV0dG9uIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29tbWFuZChTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShidW5kbGUuZ2V0QnVuZGxlKEtFWV9DT01NQU5EKSkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRJY29uUmVzSWQoYnVuZGxlLmdldEludChLRVlfSUNPTl9SRVNfSUQsIDApKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGlzcGxheU5hbWUoYnVuZGxlLmdldFN0cmluZyhLRVlfRElTUExBWV9OQU1FKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEV4dHJhcyhidW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChidW5kbGUuZ2V0Qm9vbGVhbihLRVlfRU5BQkxFRCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWxmb3JtZWQgb3IgdmVyc2lvbiBtaXNtYXRjaC4gUmV0dXJuIG51bGwgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgQ29tbWFuZEJ1dHRvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRCdXR0b24uQnVpbGRlciBtSW5zdGFuY2U7Ci0gICAgICAgICAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kMiBtQ29tbWFuZDsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7Ci0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0gICAgICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0Q29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRJY29uUmVzSWRfaW1wbChpbnQgcmVzSWQpIHsKLSAgICAgICAgICAgICAgICBtSWNvblJlc0lkID0gcmVzSWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldERpc3BsYXlOYW1lX2ltcGwoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24gYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQgJiYgbUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbmFibGVkIGJ1dHRvbiBuZWVkcyBDb21tYW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgY29udHJvbGxlciB0byBpbnZva2UgdGhlIGNvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Db21tYW5kICE9IG51bGwgJiYgbUNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobUljb25SZXNJZCA9PSAwIHx8IFRleHRVdGlscy5pc0VtcHR5KG1EaXNwbGF5TmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkN1c3RvbSBjb21tYW5kcyBuZWVkcyBpY29uIGFuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYW5kIG5hbWUgdG8gZGlzcGxheSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1hbmRCdXR0b25JbXBsKG1Db21tYW5kLCBtSWNvblJlc0lkLCBtRGlzcGxheU5hbWUsIG1FeHRyYXMsIG1FbmFibGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgLm1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQnVpbGRlckJhc2VJbXBsPFQgZXh0ZW5kcyBNZWRpYVNlc3Npb24yLCBDIGV4dGVuZHMgU2Vzc2lvbkNhbGxiYWNrPgotICAgICAgICAgICAgaW1wbGVtZW50cyBCdWlsZGVyQmFzZVByb3ZpZGVyPFQsIEM+IHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICAgICAgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgICAgIFN0cmluZyBtSWQ7Ci0gICAgICAgIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgICAgICBDIG1DYWxsYmFjazsKLSAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBWb2x1bWVQcm92aWRlcjIgbVZvbHVtZVByb3ZpZGVyOwotICAgICAgICBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQKLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgcGxheWVyIGlzIGEKLSAgICAgICAgICogICAgICB7QGxpbmsgTWVkaWFTZXNzaW9uMn0gb3Ige0BsaW5rIE1lZGlhQ29udHJvbGxlcjJ9LgotICAgICAgICAgKi8KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBbHNvIG5lZWQgZXhlY3V0b3IKLSAgICAgICAgcHVibGljIEJ1aWxkZXJCYXNlSW1wbChATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgICAgICAvLyBFbnN1cmUgbm9uLW51bGwKLSAgICAgICAgICAgIG1JZCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKLSAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXllciA9IHBsYXllcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdEFnZW50X2ltcGwoQE5vbk51bGwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIGlmIChwbGF5bGlzdEFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5bGlzdEFnZW50IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IHBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lUHJvdmlkZXJfaW1wbChWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciA9IHZvbHVtZVByb3ZpZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BY3Rpdml0eV9pbXBsKFBlbmRpbmdJbnRlbnQgcGkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBwaTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZF9pbXBsKEBOb25OdWxsIFN0cmluZyBpZCkgewotICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNhbGxiYWNrX2ltcGwoQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIEMgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVCBidWlsZF9pbXBsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IHsKLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbnRleHQgY29udGV4dCwgQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbjIgYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tFeGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBtQ29udGV4dC5nZXRNYWluRXhlY3V0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uQ2FsbGJhY2soKSB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2NTdkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLk1lZGlhTGlicmFyeVNlc3Npb25JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1lZGlhU2Vzc2lvbjJTdHViIGV4dGVuZHMgSU1lZGlhU2Vzc2lvbjIuU3R1YiB7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QT1NJVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9wb3NpdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfSVRFTV9JTkRFWCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9pdGVtX2luZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QTEFZTElTVF9QQVJBTVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIua2V5X3BsYXlsaXN0X3BhcmFtcyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhU2Vzc2lvbjJTdHViIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUuCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxTZXNzaW9uQ29tbWFuZDI+IHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QgPQotICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxJQmluZGVyLCBDb250cm9sbGVySW5mbz4gbUNvbnRyb2xsZXJzID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SUJpbmRlcj4gbUNvbm5lY3RpbmdDb250cm9sbGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxDb250cm9sbGVySW5mbywgU2Vzc2lvbkNvbW1hbmRHcm91cDI+IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwID0KLSAgICAgICAgICAgIG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8Q29udHJvbGxlckluZm8sIFNldDxTdHJpbmc+PiBtU3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0KLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlN0dWIoTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgewotICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBpZiAoc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIENvbW1hbmRHcm91cEltcGwgZ3JvdXAgPSBuZXcgQ29tbWFuZEdyb3VwSW1wbCgpOwotICAgICAgICAgICAgICAgIGdyb3VwLmFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBncm91cC5hZGRBbGxQbGF5bGlzdENvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgU2V0PFNlc3Npb25Db21tYW5kMj4gY29tbWFuZHMgPSBncm91cC5nZXRDb21tYW5kcygpOwotICAgICAgICAgICAgICAgIGZvciAoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgOiBjb21tYW5kcykgewotICAgICAgICAgICAgICAgICAgICBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmFwcGVuZChjb21tYW5kLmdldENvbW1hbmRDb2RlKCksIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lOb3RMb2NrZWQoKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8Q29udHJvbGxlckluZm8+IGxpc3Q7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1TZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgICAgICBsaXN0ID0gZ2V0Q29udHJvbGxlcnMoKTsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgY29udHJvbGxlckJpbmRlciA9Ci0gICAgICAgICAgICAgICAgICAgICgoQ29udHJvbGxlckluZm9JbXBsKSBsaXN0LmdldChpKS5nZXRQcm92aWRlcigpKS5nZXRDb250cm9sbGVyQmluZGVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIGhvbGQgdG8gcHJldmVudCBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgY29udHJvbGxlckJpbmRlci5vbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIGlzIGdvbmUuIFNob3VsZCBiZSBmaW5lIGJlY2F1c2Ugd2UncmUgZGVzdHJveWluZy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBnZXRMaWJyYXJ5U2Vzc2lvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2Vzc2lvbiBpc24ndCBhIGxpYnJhcnkgc2Vzc2lvbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpIHNlc3Npb247Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG1Db250cm9sbGVycy5nZXQoY2FsbGVyLmFzQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzIGRpc2Nvbm5lY3RlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciB3aXRoIG51bGwgYWxsb3dlZCBjb21tYW5kcy4gSWdub3JpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYmluZGVyIGlmIHRoZSBzZXNzaW9uIGlzIGFibGUgdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuCi0gICAgcHJpdmF0ZSBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgaWYgKGdldFNlc3Npb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXRTZXNzaW9uKCkgYWxyZWFkeSBsb2dnZWQgaWYgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mb0ltcGwgaW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmdldChpbXBsLmdldElkKCkpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgbUNvbm5lY3RpbmdDb250cm9sbGVycy5jb250YWlucyhpbXBsLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGwuZ2V0Q29udHJvbGxlckJpbmRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb250cm9sbGVyICsgIiBpc24ndCBjb25uZWN0ZWQgbm9yIGNvbm5lY3RpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGJpbmRlciBpZiB0aGUgc2Vzc2lvbiBpcyBhYmxlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgotICAgIHByaXZhdGUgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbW1hbmQoQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kQ29kZSk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmRDb2RlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmdldChjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHRlZCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbW1hbmRSZXF1ZXN0KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIGlmICghYWNjZXB0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcnVuIHJlamVjdGVkIGNvbW1hbmQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29tbWFuZCAoY29kZT0iICsgY29tbWFuZENvZGUgKyAiKSBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sbGVyICsgIiB3YXMgcmVqZWN0ZWQgYnkgIiArIHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oc2Vzc2lvbiwgY29udHJvbGxlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkJyb3dzZXJDb21tYW5kKEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIExpYnJhcnlTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgc2Vzc2lvbiA9IGdldExpYnJhcnlTZXNzaW9uKCk7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29uc2lkZXIgY29tbWFuZCBjb2RlCi0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbnNpZGVyIGNvbW1hbmQgY29kZQotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVubmFibGUucnVuKHNlc3Npb24sIGNvbnRyb2xsZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlBbGwoaW50IGNvbW1hbmRDb2RlLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSksIGNvbW1hbmRDb2RlKSwgcnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFsbChATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSkpLCBydW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciksIHJ1bm5hYmxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIGludCBjb21tYW5kQ29kZSwKLSAgICAgICAgICAgIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwgY29tbWFuZENvZGUpLCBydW5uYWJsZSk7Ci0gICAgfQotCi0gICAgLy8gRG8gbm90IGNhbGwgdGhpcyBBUEkgZGlyZWN0bHkuIFVzZSBub3RpZnkoKSBpbnN0ZWFkLgotICAgIHByaXZhdGUgdm9pZCBub3RpZnlJbnRlcm5hbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwgfHwgaUNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oY29udHJvbGxlciwgaUNvbnRyb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29udHJvbGxlci50b1N0cmluZygpICsgIiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbkNvbnRyb2xsZXJDbG9zZWQoaUNvbnRyb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ3VycmVudGx5IGl0J3MgVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBvciBEZWFkU3lzdGVtRXhjZXB0aW9uLgotICAgICAgICAgICAgLy8gV2UnZCBiZXR0ZXIgdG8gbGVhdmUgbG9nIGZvciB0aG9zZSBjYXNlcyBiZWNhdXNlCi0gICAgICAgICAgICAvLyAgIC0gVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBtZWFucyB0aGF0IHdlIG1heSBuZWVkIHRvIGZpeCBvdXIgY29kZS4KLSAgICAgICAgICAgIC8vICAgICAoZS5nLiBhZGQgcGFnaW5hdGlvbiBvciBzcGVjaWFsIHdheSB0byBkZWxpdmVyIEJpdG1hcCkKLSAgICAgICAgICAgIC8vICAgLSBEZWFkU3lzdGVtRXhjZXB0aW9uIG1lYW5zIHRoYXQgZXJyb3JzIGFyb3VuZCBpdCBjYW4gYmUgaWdub3JlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIkV4Y2VwdGlvbiBpbiAiICsgY29udHJvbGxlci50b1N0cmluZygpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbnRyb2xsZXJDbG9zZWQoSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIpIHsKLSAgICAgICAgQ29udHJvbGxlckluZm8gY29udHJvbGxlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgY29udHJvbGxlciA9IG1Db250cm9sbGVycy5yZW1vdmUoaUNvbnRyb2xsZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNpbmcgIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKGNvbnRyb2xsZXIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25EaXNjb25uZWN0ZWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFJREwgbWV0aG9kcyBmb3Igc2Vzc2lvbiBvdmVycmlkZXMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29ubmVjdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBjYWxsaW5nUGFja2FnZSkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHNlc3Npb24uZ2V0Q29udGV4dCgpOwotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG5ldyBDb250cm9sbGVySW5mbyhjb250ZXh0LAotICAgICAgICAgICAgICAgIEJpbmRlci5nZXRDYWxsaW5nVWlkKCksIEJpbmRlci5nZXRDYWxsaW5nUGlkKCksIGNhbGxpbmdQYWNrYWdlLCBjYWxsZXIpOwotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAvLyBLZWVwIGNvbm5lY3RpbmcgY29udHJvbGxlcnMuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyBzZXNzaW9ucyB0byBjYWxsIEFQSXMgaW4gdGhlIG9uQ29ubmVjdCgpIChlLmcuIHNldEN1c3RvbUxheW91dCgpKQotICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgcGVuZGluZyB0aGVtLgotICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMuYWRkKENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgLy8gRG9uJ3QgcmVqZWN0IGNvbm5lY3Rpb24gZm9yIHRoZSByZXF1ZXN0IGZyb20gdHJ1c3RlZCBhcHAuCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugc2VydmVyIHdpbGwgZmFpbCB0byByZXRyaWV2ZSBzZXNzaW9uJ3MgaW5mb3JtYXRpb24gdG8gZGlzcGF0Y2gKLSAgICAgICAgICAgIC8vIG1lZGlhIGtleXMgdG8uCi0gICAgICAgICAgICBib29sZWFuIGFjY2VwdCA9IGFsbG93ZWRDb21tYW5kcyAhPSBudWxsIHx8IGNvbnRyb2xsZXJJbmZvLmlzVHJ1c3RlZCgpOwotICAgICAgICAgICAgaWYgKGFjY2VwdCkgewotICAgICAgICAgICAgICAgIENvbnRyb2xsZXJJbmZvSW1wbCBjb250cm9sbGVySW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQWNjZXB0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbGxvd2VkQ29tbWFuZHM9IiArIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgdHJ1c3RlZCBhcHBzLCBzZW5kIG5vbi1udWxsIGFsbG93ZWQgY29tbWFuZHMgdG8ga2VlcCBjb25uZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29tbWFuZHMgPSBuZXcgU2Vzc2lvbkNvbW1hbmRHcm91cDIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySW1wbC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnB1dChjb250cm9sbGVySW1wbC5nZXRJZCgpLCAgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5wdXQoY29udHJvbGxlckluZm8sIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIElmIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsIG5vdGlmeSB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGUgY29udHJvbGxlci4KLSAgICAgICAgICAgICAgICAvLyBJdCdzIG5lZWRlZCBiZWNhdXNlIHdlIGNhbm5vdCBjYWxsIHN5bmNocm9ub3VzIGNhbGxzIGJldHdlZW4gc2Vzc2lvbi9jb250cm9sbGVyLgotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlJ3JlIGRvaW5nIHRoaXMgYWZ0ZXIgdGhlIG9uQ29ubmVjdGlvbkNoYW5nZWQoKSwgYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdGhhdCBldmVudHMgaGVyZSBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlIG9uQ29ubmVjdGVkKCkgYmVjYXVzZQotICAgICAgICAgICAgICAgIC8vICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGlzIG9uZXdheSAoaS5lLiBhc3luYyBjYWxsKSBhbmQgU3R1YiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdXNlIHRocmVhZCBwb2xsIGZvciBpbmNvbWluZyBjYWxscy4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgcGxheWJhY2tTcGVlZCA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5YmFja1NwZWVkKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBwbGF5YmFja0luZm9CdW5kbGUgPSAoKE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFBsYXliYWNrSW5mbygpLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaHVmZmxlTW9kZSA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbi5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXlsaXN0KCkgOiBudWxsOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdEJ1bmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpbmQgYSB3YXkgdG8gYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsYXlsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGl0ZW1CdW5kbGUgPSBpdGVtLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1CdW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZS5hZGQoaXRlbUJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERvdWJsZSBjaGVjayBpZiBzZXNzaW9uIGlzIHN0aWxsIHRoZXJlLCBiZWNhdXNlIGNsb3NlKCkgY2FuIGJlIGNhbGxlZCBpbiBhbm90aGVyCi0gICAgICAgICAgICAgICAgLy8gdGhyZWFkLgotICAgICAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkNvbm5lY3RlZChNZWRpYVNlc3Npb24yU3R1Yi50aGlzLCBhbGxvd2VkQ29tbWFuZHMudG9CdW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZFBvc2l0aW9uTXMsIHBsYXliYWNrSW5mb0J1bmRsZSwgcmVwZWF0TW9kZSwgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUsIHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBtYXkgYmUgZGllZCBwcmVtYXR1cmVseS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgaGVyZS4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5yZW1vdmUoQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlckluZm8pLmdldElkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVqZWN0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgbWF5IGJlIGRpZWQgcHJlbWF0dXJlbHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBhbiBpc3N1ZSBiZWNhdXNlIHdlJ2xsIGlnbm9yZSBpdCBhbnl3YXkuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29udHJvbGxlckNsb3NlZChjYWxsZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVRvKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgaW50IHZhbHVlLCBmaW5hbCBpbnQgZmxhZ3MpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIgPSBzZXNzaW9uLmdldFZvbHVtZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNldCBsb2NhbCBzdHJlYW0gdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5vblNldFZvbHVtZVRvKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBkaXJlY3Rpb24sIGludCBmbGFncykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVRfVk9MVU1FLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciA9IHNlc3Npb24uZ2V0Vm9sdW1lUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRqdXN0IGxvY2FsIHN0cmVhbSB2b2x1bWUKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLm9uQWRqdXN0Vm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBjb21tYW5kQ29kZSwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZENvZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUExBWToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1A6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTzoKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNlZWtUbyhhcmdzLmdldExvbmcoQVJHVU1FTlRfS0VZX1BPU0lUSU9OKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmVzZW5kIHVua25vd24gKG5ldykgY29tbWFuZHMgdGhyb3VnaCB0aGUgY3VzdG9tIGNvbW1hbmQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIGNvbW1hbmRCdW5kbGUsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXJncywgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgInNlbmRDdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1c3RvbUNvbW1hbmQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkksCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbU1lZGlhSWQoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblByZXBhcmVGcm9tTWVkaWFJZChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkksCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21NZWRpYUlkKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbU1lZGlhSWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmF0aW5nKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgcmF0aW5nQnVuZGxlKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9TRVRfUkFUSU5HLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFJhdGluZygpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZ0J1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmdCdW5kbGUgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUmF0aW5nMiByYXRpbmcgPSBSYXRpbmcyLmZyb21CdW5kbGUocmF0aW5nQnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF0aW5nQnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmcgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblNldFJhdGluZyhzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIG1lZGlhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNULCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBsYXlsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRQbGF5bGlzdCgpOiBJZ25vcmluZyBudWxsIHBsYXlsaXN0IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIFJlY3JlYXRlcyBVVUlEIGluIHRoZSBwbGF5bGlzdAotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUocGxheWxpc3QuZ2V0KGkpLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRQbGF5bGlzdChsaXN0LCBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgbWV0YWRhdGEpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YSkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgYWRkUGxheWxpc3RJdGVtLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuYWRkUGxheWxpc3RJdGVtKGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUobWVkaWFJdGVtLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUobWVkaWFJdGVtKTsKLSAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFUExBQ0VfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgcmVwbGFjZVBsYXlsaXN0SXRlbS4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZShtZWRpYUl0ZW0sIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9UT19QTEFZTElTVF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2tpcFRvUGxheWxpc3RJdGVtKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJdGVtIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvUGxheWxpc3RJdGVtKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShtZWRpYUl0ZW0pKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9QUkVWX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfTkVYVF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFNodWZmbGVNb2RlKHNodWZmbGVNb2RlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQUlETCBtZXRob2RzIGZvciBMaWJyYXJ5U2Vzc2lvbiBvdmVycmlkZXMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSByb290SGludHMpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgZmluYWwgTGlicmFyeVJvb3Qgcm9vdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldExpYnJhcnlSb290KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcm9vdEhpbnRzKTsKLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0TGlicmFyeVJvb3REb25lKHJvb3RIaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPT0gbnVsbCA/IG51bGwgOiByb290LmdldFJvb3RJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9PSBudWxsID8gbnVsbCA6IHJvb3QuZ2V0RXh0cmFzKCkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldEl0ZW0oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtMiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRJdGVtKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgbWVkaWFJZCk7Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldEl0ZW1Eb25lKG1lZGlhSWQsIHJlc3VsdCA9PSBudWxsID8gbnVsbCA6IHJlc3VsdC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbihmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgIGZpbmFsIGludCBwYWdlLCBmaW5hbCBpbnQgcGFnZVNpemUsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0Q2hpbGRyZW4oc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRDaGlsZHJlbigpIHNob3VsZG4ndCByZXR1cm4gbWVkaWEgaXRlbXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAibW9yZSB0aGFuIHBhZ2VTaXplLiByZXN1bHQuc2l6ZSgpPSIgKyByZXN1bHQuc2l6ZSgpICsgIiBwYWdlU2l6ZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBhZ2VTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFJdGVtMiBpdGVtIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGl0ZW0gPT0gbnVsbCA/IG51bGwgOiBpdGVtLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldENoaWxkcmVuRG9uZShwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGJ1bmRsZUxpc3QsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0U2VhcmNoUmVzdWx0KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgaW50IHBhZ2UsIGZpbmFsIGludCBwYWdlU2l6ZSwgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRTZWFyY2hSZXN1bHQoKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgImdldFNlYXJjaFJlc3VsdCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBwYWdlIC8gcGFnZVNpemUuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBhZ2U9IiArIHBhZ2UgKyAiIHBhZ2VTaXplPSIgKyBwYWdlU2l6ZSArICIgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRTZWFyY2hSZXN1bHQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRTZWFyY2hSZXN1bHQoKSBzaG91bGRuJ3QgcmV0dXJuIG1lZGlhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIml0ZW1zIG1vcmUgdGhhbiBwYWdlU2l6ZS4gcmVzdWx0LnNpemUoKT0iICsgcmVzdWx0LnNpemUoKSArICIgcGFnZVNpemU9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhSXRlbTIgaXRlbSA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRTZWFyY2hSZXN1bHREb25lKHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgYnVuZGxlTGlzdCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmUoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgb3B0aW9uKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TdWJzY3JpYmUoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgb3B0aW9uKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdWJzY3JpcHRpb24gPSBtU3Vic2NyaXB0aW9ucy5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucHV0KGNvbnRyb2xsZXIsIHN1YnNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5hZGQocGFyZW50SWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1bnN1YnNjcmliZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAidW5zdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25VbnN1YnNjcmliZShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHBhcmVudElkKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5yZW1vdmUoY29udHJvbGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBUElzIGZvciBNZWRpYVNlc3Npb24ySW1wbAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBQb3N0LVApIE5lZWQgYSB3YXkgdG8gZ2V0IGNvbnRyb2xsZXIgd2l0aCBwZXJtaXNzaW9ucwotICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb250cm9sbGVycygpIHsKLSAgICAgICAgQXJyYXlMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250cm9sbGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJzLmFkZChtQ29udHJvbGxlcnMudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJzOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChpbnQgc3RhdGUpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5ZXJTdGF0ZUNoYW5nZWQoc3RhdGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlbmFtZQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25Qb3NpdGlvbkNoYW5nZWQoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5YmFja1NwZWVkQ2hhbmdlZE5vdExvY2tlZChmbG9hdCBzcGVlZCkgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKHNwZWVkKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QnVmZmVyZWRQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDdXN0b21MYXlvdXROb3RMb2NrZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gbGF5b3V0QnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKChDb21tYW5kQnV0dG9uSW1wbCkgbGF5b3V0LmdldChpKS5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsYXlvdXRCdW5kbGVzLmFkZChidW5kbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChsYXlvdXRCdW5kbGVzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkTm90TG9ja2VkKExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwbGF5bGlzdC5nZXQoaSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gcGxheWxpc3QuZ2V0KGkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdENoYW5nZWQoYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1RfTUVUQURBVEEpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUX01FVEFEQVRBLAotICAgICAgICAgICAgICAgICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25SZXBlYXRNb2RlQ2hhbmdlZChyZXBlYXRNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChNZWRpYUNvbnRyb2xsZXIyLlBsYXliYWNrSW5mbyBwbGF5YmFja0luZm8pIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIHBsYXliYWNrSW5mb0J1bmRsZSA9Ci0gICAgICAgICAgICAgICAgKChNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsKSBwbGF5YmFja0luZm8uZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrSW5mb0NoYW5nZWQocGxheWJhY2tJbmZvQnVuZGxlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxsb3dlZENvbW1hbmRzKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLnB1dChjb250cm9sbGVyLCBjb21tYW5kcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMudG9CdW5kbGUoKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChyZWNlaXZlciAhPSBudWxsICYmIGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCBpZiByZXN1bHQgcmVjZWl2ZXIgaXMiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kQnVuZGxlLCBhcmdzLCBudWxsKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZEJ1bmRsZSwgYXJncywgbnVsbCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFQSXMgZm9yIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25TZWFyY2hSZXN1bHRDaGFuZ2VkKHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKGlzU3Vic2NyaWJlZChjb250cm9sbGVyLCBwYXJlbnRJZCkpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkNoaWxkcmVuQ2hhbmdlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChpc1N1YnNjcmliZWQoY29udHJvbGxlciwgcGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3Vic2NyaWJlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gc3Vic2NyaXB0aW9ucyA9IG1TdWJzY3JpcHRpb25zLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zID09IG51bGwgfHwgIXN1YnNjcmlwdGlvbnMuY29udGFpbnMocGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBNaXNjCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBTZXNzaW9uUnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIExpYnJhcnlTZXNzaW9uUnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIE5vdGlmeVJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBpQ29udHJvbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzZWI2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLy8gVE9ETyhqYWV3YW4pOiBOZWVkIGEgdGVzdCBmb3Igc2Vzc2lvbiBzZXJ2aWNlIGl0c2VsZi4KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cyBNZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTVBTZXNzaW9uU2VydmljZSI7IC8vIHRvIG1lZXQgMjMgY2hhciBsaW1pdCBpbiBMb2cgdGFnCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlIHRoaXMuIChiLzc0MDk0NjExKQotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25TZXJ2aWNlMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uU2VydmljZUV2ZW50Q2FsbGJhY2soKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvbk1hbmFnZXIgbU5vdGlmaWNhdGlvbk1hbmFnZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgSW50ZW50IG1TdGFydFNlbGZJbnRlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzUnVubmluZ0ZvcmVncm91bmQ7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24yIG1TZXNzaW9uOwotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbCgiICsgaW5zdGFuY2UgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yIGdldFNlc3Npb25faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvbiBvblVwZGF0ZU5vdGlmaWNhdGlvbl9pbXBsKCkgewotICAgICAgICAvLyBQcm92aWRlIGRlZmF1bHQgbm90aWZpY2F0aW9uIFVJIGxhdGVyLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZV9pbXBsKCkgewotICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlciA9IChOb3RpZmljYXRpb25NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICBOT1RJRklDQVRJT05fU0VSVklDRSk7Ci0gICAgICAgIG1TdGFydFNlbGZJbnRlbnQgPSBuZXcgSW50ZW50KG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldENsYXNzKCkpOwotCi0gICAgICAgIFNlc3Npb25Ub2tlbjIgdG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMihtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmICh0b2tlbi5nZXRUeXBlKCkgIT0gZ2V0U2Vzc2lvblR5cGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHNlc3Npb24gc2VydmljZSwgYnV0IHdhcyAiICsgdG9rZW4uZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvbiA9IG1JbnN0YW5jZS5vbkNyZWF0ZVNlc3Npb24odG9rZW4uZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChtU2Vzc2lvbiA9PSBudWxsIHx8ICF0b2tlbi5nZXRJZCgpLmVxdWFscyhtU2Vzc2lvbi5nZXRUb2tlbigpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgc2Vzc2lvbiB3aXRoIGlkICIgKyB0b2tlbi5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgYnV0IGdvdCAiICsgbVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IGhlcmUuCi0gICAgICAgIC8vIG1TZXNzaW9uLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtQ2FsbGJhY2ssIG1TZXNzaW9uLmdldEV4ZWN1dG9yKCkpOwotICAgIH0KLQotICAgIEBUb2tlblR5cGUgaW50IGdldFNlc3Npb25UeXBlKCkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmRfaW1wbChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRS5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFTZXNzaW9uMkltcGwpIG1TZXNzaW9uLmdldFByb3ZpZGVyKCkpLmdldFNlc3Npb25TdHViKCkuYXNCaW5kZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKGludCBwbGF5ZXJTdGF0ZSkgewotICAgICAgICBNZWRpYU5vdGlmaWNhdGlvbiBtZWRpYU5vdGlmaWNhdGlvbiA9IG1JbnN0YW5jZS5vblVwZGF0ZU5vdGlmaWNhdGlvbigpOwotICAgICAgICBpZiAobWVkaWFOb3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaChwbGF5ZXJTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgaWYgKCFtSXNSdW5uaW5nRm9yZWdyb3VuZCkgewotICAgICAgICAgICAgICAgICAgICBtSXNSdW5uaW5nRm9yZWdyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdGFydEZvcmVncm91bmRTZXJ2aWNlKG1TdGFydFNlbGZJbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RhcnRGb3JlZ3JvdW5kKG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbklkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0lETEU6Ci0gICAgICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc1J1bm5pbmdGb3JlZ3JvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdG9wRm9yZWdyb3VuZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkobWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uSWQoKSwKLSAgICAgICAgICAgICAgICBtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXNzaW9uU2VydmljZUV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFOb3RpZmljYXRpb25JbXBsIGltcGxlbWVudHMgTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Ob3RpZmljYXRpb25JZDsKLSAgICAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb24gbU5vdGlmaWNhdGlvbjsKLQotICAgICAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb25JbXBsKE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsCi0gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90aWZpY2F0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uSWQgPSBub3RpZmljYXRpb25JZDsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb24gPSBub3RpZmljYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXROb3RpZmljYXRpb25JZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmljYXRpb25JZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTm90aWZpY2F0aW9uIGdldE5vdGlmaWNhdGlvbl9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmljYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTgxMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLio7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLlN0eWxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlJhdGluZzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSYXRpbmcySW1wbCBpbXBsZW1lbnRzIFJhdGluZzJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSYXRpbmcyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RZTEUgPSAiYW5kcm9pZC5tZWRpYS5yYXRpbmcyLnN0eWxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBTFVFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi52YWx1ZSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBmbG9hdCBSQVRJTkdfTk9UX1JBVEVEID0gLTEuMGY7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJhdGluZzIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1SYXRpbmdTdHlsZTsKLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1SYXRpbmdWYWx1ZTsKLQotICAgIHByaXZhdGUgUmF0aW5nMkltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSwgZmxvYXQgcmF0aW5nKSB7Ci0gICAgICAgIG1SYXRpbmdTdHlsZSA9IHJhdGluZ1N0eWxlOwotICAgICAgICBtUmF0aW5nVmFsdWUgPSByYXRpbmc7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBSYXRpbmcyKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuICJSYXRpbmcyOnN0eWxlPSIgKyBtUmF0aW5nU3R5bGUgKyAiIHJhdGluZz0iCi0gICAgICAgICAgICAgICAgKyAobVJhdGluZ1ZhbHVlIDwgMC4wZiA/ICJ1bnJhdGVkIiA6IFN0cmluZy52YWx1ZU9mKG1SYXRpbmdWYWx1ZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmF0aW5nMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBSYXRpbmcySW1wbCBvdGhlciA9IChSYXRpbmcySW1wbCkgKChSYXRpbmcyKSBvYmopLmdldFByb3ZpZGVyKCk7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGUgPT0gb3RoZXIubVJhdGluZ1N0eWxlCi0gICAgICAgICAgICAgICAgJiYgbVJhdGluZ1ZhbHVlID09IG90aGVyLm1SYXRpbmdWYWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobVJhdGluZ1N0eWxlLCBtUmF0aW5nVmFsdWUpOwotICAgIH0KLQotICAgIFJhdGluZzIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChidW5kbGUuZ2V0SW50KEtFWV9TVFlMRSksIGJ1bmRsZS5nZXRGbG9hdChLRVlfVkFMVUUpKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfU1RZTEUsIG1SYXRpbmdTdHlsZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRGbG9hdChLRVlfVkFMVUUsIG1SYXRpbmdWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1VucmF0ZWRSYXRpbmdfaW1wbChAU3R5bGUgaW50IHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgIHN3aXRjaChyYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfSEVBUlQ6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR19USFVNQl9VUF9ET1dOOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfUEVSQ0VOVEFHRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHJhdGluZ1N0eWxlLCBSQVRJTkdfTk9UX1JBVEVEKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19pbXBsKGJvb2xlYW4gaGFzSGVhcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfSEVBUlQsIGhhc0hlYXJ0ID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX2ltcGwoYm9vbGVhbiB0aHVtYklzVXApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfVEhVTUJfVVBfRE9XTiwgdGh1bWJJc1VwID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfaW1wbChpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7Ci0gICAgICAgIGZsb2F0IG1heFJhdGluZyA9IFJBVElOR19OT1RfUkFURUQ7Ci0gICAgICAgIHN3aXRjaChzdGFyUmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gMy4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNC4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNS4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCByYXRpbmcgc3R5bGUgKCIgKyBzdGFyUmF0aW5nU3R5bGUgKyAiKSBmb3IgYSBzdGFyIHJhdGluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoc3RhclJhdGluZyA8IDAuMGYpIHx8IChzdGFyUmF0aW5nID4gbWF4UmF0aW5nKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVHJ5aW5nIHRvIHNldCBvdXQgb2YgcmFuZ2Ugc3Rhci1iYXNlZCByYXRpbmciKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX2ltcGwoZmxvYXQgcGVyY2VudCkgewotICAgICAgICBpZiAoKHBlcmNlbnQgPCAwLjBmKSB8fCAocGVyY2VudCA+IDEwMC4wZikpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcGVyY2VudGFnZS1iYXNlZCByYXRpbmcgdmFsdWUiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfUEVSQ0VOVEFHRSwgcGVyY2VudCkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmF0ZWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZSA+PSAwLjBmOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmF0aW5nU3R5bGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdTdHlsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFydF9pbXBsKCkgewotICAgICAgICBpZiAobVJhdGluZ1N0eWxlICE9IFJBVElOR19IRUFSVCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RodW1iVXBfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfVEhVTUJfVVBfRE9XTikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0U3RhclJhdGluZ19pbXBsKCkgewotICAgICAgICBzd2l0Y2ggKG1SYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgICAgIGlmIChtSW5zdGFuY2UuaXNSYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLTEuMGY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UGVyY2VudFJhdGluZ19pbXBsKCkgewotICAgICAgICBpZiAoKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfUEVSQ0VOVEFHRSkgfHwgIW1JbnN0YW5jZS5pc1JhdGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMS4wZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTBkMzQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFTZXNzaW9uU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5JdGVtQWN0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TZXNzaW9uQWN0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TdGF0dXNDYWxsYmFjazsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLUBSZXF1aXJlc0FwaShhcGkgPSBCdWlsZC5WRVJTSU9OX0NPREVTLkxPTExJUE9QKQotcHVibGljIGNsYXNzIFJvdXRlUGxheWVyIGV4dGVuZHMgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUExBWUJBQ0tfQUNUSU9OUyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFCi0gICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVkgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPCi0gICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKLQotICAgIHByaXZhdGUgUmVtb3RlUGxheWJhY2tDbGllbnQgbUNsaWVudDsKLSAgICBwcml2YXRlIFN0cmluZyBtU2Vzc2lvbklkOwotICAgIHByaXZhdGUgU3RyaW5nIG1JdGVtSWQ7Ci0gICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgU3RhdHVzQ2FsbGJhY2sgbVN0YXR1c0NhbGxiYWNrID0gbmV3IFN0YXR1c0NhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBSb3V0ZVBsYXllcihDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBtQ2xpZW50ID0gbmV3IFJlbW90ZVBsYXliYWNrQ2xpZW50KGNvbnRleHQsIHJvdXRlKTsKLSAgICAgICAgbUNsaWVudC5zZXRTdGF0dXNDYWxsYmFjayhtU3RhdHVzQ2FsbGJhY2spOwotICAgICAgICBtQ2xpZW50LnN0YXJ0U2Vzc2lvbihudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKLSAgICAgICAgbUNsaWVudC5yZXN1bWUobnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBtQ2xpZW50LnBhdXNlKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKLSAgICAgICAgbUNsaWVudC5zZWVrKG1JdGVtSWQsIHBvcywgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgbUNsaWVudC5zdG9wKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgbUNsaWVudC5wbGF5KGRzZC5nZXRVcmkoKSwgInZpZGVvL21wNCIsIG51bGwsIDAsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgIHBsYXlJbnRlcm5hbChkc2QuZ2V0VXJpKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBpZiAobUNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2xpZW50LnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1DbGllbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwbGF5SW50ZXJuYWwoVXJpIHVyaSkgewotICAgICAgICBtQ2xpZW50LnBsYXkodXJpLCAidmlkZW8vbXA0IiwgbnVsbCwgMCwgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZXNzaW9uU3RhdHVzKFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUl0ZW1TdGF0dXMoU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgbUl0ZW1JZCA9IGl0ZW1JZDsKLSAgICAgICAgaWYgKGl0ZW1TdGF0dXMgPT0gbnVsbCB8fCBtQ2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQoaXRlbVN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1NzBhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKLQotcHVibGljIGNsYXNzIFNlc3Npb25QbGF5bGlzdEFnZW50IGV4dGVuZHMgTWVkaWFQbGF5bGlzdEFnZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNlc3Npb25QbGF5bGlzdEFnZW50IjsKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9QTEFZTElTVCA9IC0xOwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMSURfSVRFTVMgPSAtMjsKLQotICAgIHByaXZhdGUgZmluYWwgUGxheUl0ZW0gbUVvcFBsYXlJdGVtID0gbmV3IFBsYXlJdGVtKEVORF9PRl9QTEFZTElTVCwgbnVsbCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIG1TZXNzaW9uSW1wbDsKLSAgICBwcml2YXRlIGZpbmFsIE15UGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyQ2FsbGJhY2s7Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7Ci0gICAgLy8gVE9ETzogQ2hlY2sgaWYgaGF2aW5nIHRoZSBzYW1lIGl0ZW0gaXMgb2theSAoYi83NDA5MDc0MSkKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhSXRlbTI+IG1TaHVmZmxlZExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNYXA8TWVkaWFJdGVtMiwgRGF0YVNvdXJjZURlc2M+IG1JdGVtRHNkTWFwID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWV0YWRhdGE7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IG1SZXBlYXRNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGludCBtU2h1ZmZsZU1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheUl0ZW0gbUN1cnJlbnQ7Ci0KLSAgICAvLyBDYWxsZWQgb24gc2Vzc2lvbiBjYWxsYmFjayBleGVjdXRvci4KLSAgICBwcml2YXRlIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgbXBiLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIGlmIChtUGxheWVyICE9IG1wYikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBpZiAoZHNkID09IG51bGwgJiYgbUN1cnJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQbGF5SXRlbSB7Ci0gICAgICAgIGludCBzaHVmZmxlZElkeDsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkOwotICAgICAgICBNZWRpYUl0ZW0yIG1lZGlhSXRlbTsKLQotICAgICAgICBQbGF5SXRlbShpbnQgc2h1ZmZsZWRJZHgpIHsKLSAgICAgICAgICAgIHRoaXMoc2h1ZmZsZWRJZHgsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxheUl0ZW0oaW50IHNodWZmbGVkSWR4LCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIHRoaXMuc2h1ZmZsZWRJZHggPSBzaHVmZmxlZElkeDsKLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tZWRpYUl0ZW0gPSBtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHNkID0gcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZCh0aGlzLm1lZGlhSXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmRzZCA9IGRzZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgICAgICBpZiAodGhpcyA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSBtU2h1ZmZsZWRMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gIT0gbVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lZGlhSXRlbS5nZXREYXRhU291cmNlRGVzYygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIW1lZGlhSXRlbS5nZXREYXRhU291cmNlRGVzYygpLmVxdWFscyhkc2QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvblBsYXlsaXN0QWdlbnQoQE5vbk51bGwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbkltcGwsCi0gICAgICAgICAgICBATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSW1wbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXNzaW9uSW1wbCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25JbXBsID0gc2Vzc2lvbkltcGw7Ci0gICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgIG1QbGF5ZXJDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2soKTsKLSAgICAgICAgbVBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVNlc3Npb25JbXBsLmdldENhbGxiYWNrRXhlY3V0b3IoKSwgbVBsYXllckNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXIoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgewotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbVBsYXllcikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgICAgICBtUGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JbXBsLmdldENhbGxiYWNrRXhlY3V0b3IoKSwgbVBsYXllckNhbGxiYWNrKTsKLSAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcigpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3QoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1QbGF5bGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5jbGVhcigpOwotCi0gICAgICAgICAgICBtUGxheWxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1QbGF5bGlzdC5hZGRBbGwobGlzdCk7Ci0gICAgICAgICAgICBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCk7Ci0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1NZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEgPT0gbU1ldGFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGluZGV4ID0gY2xhbXAoaW5kZXgsIG1QbGF5bGlzdC5zaXplKCkpOwotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gaW5kZXg7Ci0gICAgICAgICAgICBtUGxheWxpc3QuYWRkKGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIGlmIChtU2h1ZmZsZU1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5hZGQoaW5kZXgsIGl0ZW0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGl0ZW0gaW4gcmFuZG9tIHBvc2l0aW9uIG9mIG1TaHVmZmxlZExpc3QuCi0gICAgICAgICAgICAgICAgc2h1ZmZsZWRJZHggPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dEludChtU2h1ZmZsZWRMaXN0LnNpemUoKSArIDEpOwotICAgICAgICAgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkKHNodWZmbGVkSWR4LCBpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIW1QbGF5bGlzdC5yZW1vdmUoaXRlbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtUGxheWxpc3Quc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmRleCA9IGNsYW1wKGluZGV4LCBtUGxheWxpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YobVBsYXlsaXN0LmdldChpbmRleCkpOwotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucmVtb3ZlKG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KSk7Ci0gICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LnNldChzaHVmZmxlZElkeCwgaXRlbSk7Ci0gICAgICAgICAgICBtUGxheWxpc3Quc2V0KGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IGl0ZW0uZXF1YWxzKG1DdXJyZW50Lm1lZGlhSXRlbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YoaXRlbSk7Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnQgPSBuZXcgUGxheUl0ZW0oc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQbGF5SXRlbSBwcmV2ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIC0xKTsKLSAgICAgICAgICAgIGlmIChwcmV2ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gcHJldjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQbGF5SXRlbSBuZXh0ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOwotICAgICAgICAgICAgaWYgKG5leHQgIT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBuZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGlmIChyZXBlYXRNb2RlIDwgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUKLSAgICAgICAgICAgICAgICB8fCByZXBlYXRNb2RlID4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudCAhPSBudWxsICYmIG1DdXJyZW50ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOgotICAgICAgICAgICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFNodWZmbGVNb2RlKCkgewotICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBpZiAoc2h1ZmZsZU1vZGUgPCBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUKLSAgICAgICAgICAgICAgICB8fCBzaHVmZmxlTW9kZSA+IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgICAgICBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCk7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBpbnQgZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGhhc1ZhbGlkSXRlbSgpID8gbUN1cnJlbnQuc2h1ZmZsZWRJZHggOiBOT19WQUxJRF9JVEVNUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRJdGVtKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnQgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZCA9IGl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKTsKLSAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5wdXQoaXRlbSwgZHNkKTsKLSAgICAgICAgICAgIHJldHVybiBkc2Q7Ci0gICAgICAgIH0KLSAgICAgICAgZHNkID0gbUl0ZW1Ec2RNYXAuZ2V0KGl0ZW0pOwotICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkc2Q7Ci0gICAgICAgIH0KLSAgICAgICAgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIgPSBtRHNtSGVscGVyOwotICAgICAgICBpZiAoaGVscGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IERvIG5vdCBjYWxsIG9uRGF0YVNvdXJjZU1pc3Npbmcgd2l0aCB0aGUgbG9jayAoYi83NDA5MDc0MSkuCi0gICAgICAgICAgICBkc2QgPSBoZWxwZXIub25EYXRhU291cmNlTWlzc2luZyhtU2Vzc2lvbkltcGwuZ2V0SW5zdGFuY2UoKSwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSXRlbURzZE1hcC5wdXQoaXRlbSwgZHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHNkOwotICAgIH0KLQotICAgIC8vIFRPRE86IGNvbnNpZGVyIHRvIGNhbGwgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkIGluc2lkZSAoYi83NDA5MDc0MSkKLSAgICBwcml2YXRlIFBsYXlJdGVtIGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKGludCBjdXJTaHVmZmxlZElkeCwgaW50IGRpcmVjdGlvbikgewotICAgICAgICBpbnQgc2l6ZSA9IG1QbGF5bGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChjdXJTaHVmZmxlZElkeCA9PSBFTkRfT0ZfUExBWUxJU1QpIHsKLSAgICAgICAgICAgIGN1clNodWZmbGVkSWR4ID0gKGRpcmVjdGlvbiA+IDApID8gLTEgOiBzaXplOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBjdXJTaHVmZmxlZElkeCArPSBkaXJlY3Rpb247Ci0gICAgICAgICAgICBpZiAoY3VyU2h1ZmZsZWRJZHggPCAwIHx8IGN1clNodWZmbGVkSWR4ID49IG1QbGF5bGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJlcGVhdE1vZGUgPT0gUkVQRUFUX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkgPT0gc2l6ZSAtIDEpID8gbnVsbCA6IG1Fb3BQbGF5SXRlbTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjdXJTaHVmZmxlZElkeCA9IGN1clNodWZmbGVkSWR4IDwgMCA/IG1QbGF5bGlzdC5zaXplKCkgLSAxIDogMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QgPSByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKG1TaHVmZmxlZExpc3QuZ2V0KGN1clNodWZmbGVkSWR4KSk7Ci0gICAgICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXlJdGVtKGN1clNodWZmbGVkSWR4LCBkc2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKSB7Ci0gICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgbUN1cnJlbnQuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKG1DdXJyZW50Lm1lZGlhSXRlbSk7Ci0gICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBBZGRlZCBhbiBpdGVtLgotICAgICAgICAgICAgbUN1cnJlbnQuc2h1ZmZsZWRJZHggPSBzaHVmZmxlZElkeDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3VycmVudC5zaHVmZmxlZElkeCA+PSBtU2h1ZmZsZWRMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtU2h1ZmZsZWRMaXN0LnNpemUoKSAtIDEsIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnQubWVkaWFJdGVtID0gbVNodWZmbGVkTGlzdC5nZXQobUN1cnJlbnQuc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgaWYgKHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQobUN1cnJlbnQubWVkaWFJdGVtKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudCA9PSBudWxsIHx8IG1DdXJyZW50ID09IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUGxheWVyLmdldEN1cnJlbnREYXRhU291cmNlKCkgIT0gbUN1cnJlbnQuZHNkKSB7Ci0gICAgICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UobUN1cnJlbnQuZHNkKTsKLSAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQobVJlcGVhdE1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogQ2FsbCBzZXROZXh0RGF0YVNvdXJjZSAoYi83NDA5MDc0MSkKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpIHsKLSAgICAgICAgbVNodWZmbGVkTGlzdC5jbGVhcigpOwotICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZEFsbChtUGxheWxpc3QpOwotICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMCi0gICAgICAgICAgICAgICAgfHwgbVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUobVNodWZmbGVkTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDbGFtcHMgdmFsdWUgdG8gWzAsIHNpemVdCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsYW1wKGludCB2YWx1ZSwgaW50IHNpemUpIHsKLSAgICAgICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSA+IHNpemUpID8gc2l6ZSA6IHZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZjhjNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFNlc3Npb25Ub2tlbjJJbXBsIGltcGxlbWVudHMgU2Vzc2lvblRva2VuMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VJRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnVpZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UWVBFID0gImFuZHJvaWQubWVkaWEudG9rZW4udHlwZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5wYWNrYWdlX25hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVklDRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2VydmljZV9uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEudG9rZW4uaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9CSU5ERVIgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5zZXNzaW9uX2JpbmRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBAVG9rZW5UeXBlIGludCBtVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOwotCi0gICAgLyoqCi0gICAgICogUHVibGljIGNvbnN0cnVjdG9yIGZvciB0aGUgbGVnYWN5IHN1cHBvcnQgKGkuZS4gYnJvd3NlciBjYW4gdHJ5IGNvbm5lY3RpbmcgdG8gYW55IGJyb3dzZXIKLSAgICAgKiBzZXJ2aWNlIGlmIGl0IGtub3dzIHRoZSBzZXJ2aWNlIG5hbWUpCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjJJbXBsKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhY2thZ2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAvLyBDYWxjdWxhdGUgdWlkIGlmIGl0J3Mgbm90IHNwZWNpZmllZC4KLSAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKHVpZCA8IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdWlkID0gbWFuYWdlci5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1VaWQgPSB1aWQ7Ci0KLSAgICAgICAgLy8gSW5mZXIgaWQgYW5kIHR5cGUgZnJvbSBwYWNrYWdlIG5hbWUgYW5kIHNlcnZpY2UgbmFtZQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBtdWx0aS11c2VyLgotICAgICAgICBTdHJpbmcgaWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgICAgICBtVHlwZSA9IFRZUEVfTElCUkFSWV9TRVJWSUNFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmV0cnkgd2l0aCBzZXNzaW9uIHNlcnZpY2UKLSAgICAgICAgICAgIG1JZCA9IGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKG1hbmFnZXIsIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLAotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOwotICAgICAgICAgICAgbVR5cGUgPSBUWVBFX1NFU1NJT05fU0VSVklDRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgIiArIHNlcnZpY2VOYW1lICsgIiBkb2Vzbid0IGltcGxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZSBub3IgbGlicmFyeSBzZXJ2aWNlLiBVc2Ugc2VydmljZSdzIGZ1bGwgbmFtZS4iKTsKLSAgICAgICAgfQotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBTZXNzaW9uVG9rZW4ySW1wbChpbnQgdWlkLCBpbnQgdHlwZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGQgc2FuaXR5IGNoZWNrIChiLzczODYzODY1KQotICAgICAgICBtVWlkID0gdWlkOwotICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICBtU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gc2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Ub2tlbjIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBzZXJ2aWNlSW50ZXJmYWNlLAotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VJbnRlcmZhY2UpOwotICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UocGFja2FnZU5hbWUpOwotICAgICAgICAvLyBVc2UgcXVlcnlJbnRlbnRTZXJ2aWNlcyB0byBmaW5kIHNlcnZpY2VzIHdpdGggTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuCi0gICAgICAgIC8vIFdlIGNhbm5vdCB1c2UgcmVzb2x2ZVNlcnZpY2Ugd2l0aCBpbnRlbnQgc3BlY2lmaWVkIGNsYXNzIG5hbWUsIGJlY2F1c2UgcmVzb2x2ZVNlcnZpY2UKLSAgICAgICAgLy8gaWdub3JlcyBhY3Rpb25zIGlmIEludGVudC5zZXRDbGFzc05hbWUoKSBpcyBzcGVjaWZpZWQuCi0gICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IGxpc3QgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoCi0gICAgICAgICAgICAgICAgc2VydmljZUludGVudCwgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFJlc29sdmVJbmZvIHJlc29sdmVJbmZvID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubmFtZSwgc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTZXNzaW9uSWQocmVzb2x2ZUluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWQoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8pIHsKLSAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubWV0YURhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9NRVRBX0RBVEEsICIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFVpZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVVpZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkX2ltcCgpIHsKLSAgICAgICAgcmV0dXJuIG1JZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFR5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVyKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXNzaW9uVG9rZW4yIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHVpZCA9IGJ1bmRsZS5nZXRJbnQoS0VZX1VJRCk7Ci0gICAgICAgIGZpbmFsIEBUb2tlblR5cGUgaW50IHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9UWVBFLCAtMSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICAgICAgZmluYWwgSUJpbmRlciBzZXNzaW9uQmluZGVyID0gYnVuZGxlLmdldEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIpOwotCi0gICAgICAgIC8vIFNhbml0eSBjaGVjay4KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRZUEVfU0VTU0lPTjoKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2Vzc2lvbkJpbmRlciBmb3Igc2Vzc2lvbiwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT05fU0VSVklDRToKLSAgICAgICAgICAgIGNhc2UgVFlQRV9MSUJSQVJZX1NFUlZJQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHNlcnZpY2UgbmVlZHMgc2VydmljZSBuYW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpIHx8IGlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhY2thZ2UgbmFtZSBub3IgSUQgY2Fubm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uVG9rZW4ySW1wbCh1aWQsIHR5cGUsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgaWQsCi0gICAgICAgICAgICAgICAgc2Vzc2lvbkJpbmRlciAhPSBudWxsID8gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXNzaW9uQmluZGVyKSA6IG51bGwpCi0gICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9VSUQsIG1VaWQpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUsIG1QYWNrYWdlTmFtZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSwgbVNlcnZpY2VOYW1lKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfSUQsIG1JZCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1RZUEUsIG1UeXBlKTsKLSAgICAgICAgYnVuZGxlLnB1dEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIsCi0gICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkgOiBudWxsKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOwotICAgICAgICByZXR1cm4gbVR5cGUKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1VaWQKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1QYWNrYWdlTmFtZS5oYXNoQ29kZSgpCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtSWQuaGFzaENvZGUoKQotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobVNlcnZpY2VOYW1lICE9IG51bGwgPyBtU2VydmljZU5hbWUuaGFzaENvZGUoKSA6IDApKSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgU2Vzc2lvblRva2VuMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTZXNzaW9uVG9rZW4ySW1wbCBvdGhlciA9IGZyb20oKFNlc3Npb25Ub2tlbjIpIG9iaik7Ci0gICAgICAgIHJldHVybiBtVWlkID09IG90aGVyLm1VaWQKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1QYWNrYWdlTmFtZSwgb3RoZXIubVBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobVNlcnZpY2VOYW1lLCBvdGhlci5tU2VydmljZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtSWQsIG90aGVyLm1JZCkKLSAgICAgICAgICAgICAgICAmJiBtVHlwZSA9PSBvdGhlci5tVHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAiU2Vzc2lvblRva2VuIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIgaWQ9IiArIG1JZCArICIgdHlwZT0iICsgbVR5cGUKLSAgICAgICAgICAgICAgICArICIgc2VydmljZT0iICsgbVNlcnZpY2VOYW1lICsgIiBiaW5kZXI9IiArIG1TZXNzaW9uQmluZGVyICsgIn0iOwotICAgIH0KLQotICAgIHN0YXRpYyBTZXNzaW9uVG9rZW4ySW1wbCBmcm9tKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKLSAgICAgICAgcmV0dXJuICgoU2Vzc2lvblRva2VuMkltcGwpIHRva2VuLmdldFByb3ZpZGVyKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjJlMWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX1JFTEFUSVZFOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBWb2x1bWVQcm92aWRlcjJJbXBsIGltcGxlbWVudHMgVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXIgewotICAgIHByaXZhdGUgZmluYWwgVm9sdW1lUHJvdmlkZXIyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKLQotICAgIHByaXZhdGUgaW50IG1DdXJyZW50Vm9sdW1lOwotICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMkltcGwoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLAotICAgICAgICAgICAgQFZvbHVtZVByb3ZpZGVyMi5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIGlmIChjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9GSVhFRCAmJiBjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9SRUxBVElWRQotICAgICAgICAgICAgICAgICYmIGNvbnRyb2xUeXBlICE9IFZPTFVNRV9DT05UUk9MX0FCU09MVVRFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyBjb250cm9sVHlwZSAiICsgY29udHJvbFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXhWb2x1bWUgPCAwIHx8IGN1cnJlbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2b2x1bWUgc2hvdWxkbid0IGJlIG5lZ2F0aXZlIgotICAgICAgICAgICAgICAgICAgICArICIsIG1heFZvbHVtZT0iICsgbWF4Vm9sdW1lICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPiBtYXhWb2x1bWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImN1cnJlbnRWb2x1bWUgc2hvdWxkbid0IGJlIGdyZWF0ZXIgdGhhbiBtYXhWb2x1bWUiCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbWF4Vm9sdW1lPSIgKyBtYXhWb2x1bWUgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7Ci0gICAgICAgIG1NYXhWb2x1bWUgPSBtYXhWb2x1bWU7Ci0gICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NYXhWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vm9sdW1lX2ltcGwoaW50IGN1cnJlbnRWb2x1bWUpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjdXJyZW50Vm9sdW1lIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uVm9sdW1lQ2hhbmdlZChtSW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgdm9sdW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblZvbHVtZUNoYW5nZWQoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3ZWVjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuU3R5bGVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VbmRlcmxpbmVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VcGRhdGVBcHBlYXJhbmNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25TdHlsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5DbG9zZWRDYXB0aW9uUmVuZGVyZXIgc2luY2UgUAotcHVibGljIGNsYXNzIENsb3NlZENhcHRpb25SZW5kZXJlciBleHRlbmRzIFN1YnRpdGxlQ29udHJvbGxlci5SZW5kZXJlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgQ2VhNjA4Q0NXaWRnZXQgbUNDV2lkZ2V0OwotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25SZW5kZXJlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9NSU1FKSkgewotICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVEVYVF9DRUFfNjA4LmVxdWFscyhtaW1lVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKLSAgICAgICAgaWYgKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1RFWFRfQ0VBXzYwOC5lcXVhbHMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAobUNDV2lkZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ0NXaWRnZXQgPSBuZXcgQ2VhNjA4Q0NXaWRnZXQobUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDZWE2MDhDYXB0aW9uVHJhY2sobUNDV2lkZ2V0LCBmb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBtYXRjaGluZyBmb3JtYXQ6ICIgKyBmb3JtYXQudG9TdHJpbmcoKSk7Ci0gICAgfQotfQotCi1jbGFzcyBDZWE2MDhDYXB0aW9uVHJhY2sgZXh0ZW5kcyBTdWJ0aXRsZVRyYWNrIHsKLSAgICBwcml2YXRlIGZpbmFsIENlYTYwOENDUGFyc2VyIG1DQ1BhcnNlcjsKLSAgICBwcml2YXRlIGZpbmFsIENlYTYwOENDV2lkZ2V0IG1SZW5kZXJpbmdXaWRnZXQ7Ci0KLSAgICBDZWE2MDhDYXB0aW9uVHJhY2soQ2VhNjA4Q0NXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0LCBNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3VwZXIoZm9ybWF0KTsKLQotICAgICAgICBtUmVuZGVyaW5nV2lkZ2V0ID0gcmVuZGVyaW5nV2lkZ2V0OwotICAgICAgICBtQ0NQYXJzZXIgPSBuZXcgQ2VhNjA4Q0NQYXJzZXIobVJlbmRlcmluZ1dpZGdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EYXRhKGJ5dGVbXSBkYXRhLCBib29sZWFuIGVvcywgbG9uZyBydW5JRCkgewotICAgICAgICBtQ0NQYXJzZXIucGFyc2UoZGF0YSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtUmVuZGVyaW5nV2lkZ2V0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZpZXcoVmVjdG9yPEN1ZT4gYWN0aXZlQ3VlcykgewotICAgICAgICAvLyBPdmVycmlkaW5nIHdpdGggTk8tT1AsIENDIHJlbmRlcmluZyBieS1wYXNzZXMgdGhpcwotICAgIH0KLX0KLQotLyoqCi0gKiBBYnN0cmFjdCB3aWRnZXQgY2xhc3MgdG8gcmVuZGVyIGEgY2xvc2VkIGNhcHRpb24gdHJhY2suCi0gKi8KLWFic3RyYWN0IGNsYXNzIENsb3NlZENhcHRpb25XaWRnZXQgZXh0ZW5kcyBWaWV3R3JvdXAgaW1wbGVtZW50cyBTdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldCB7Ci0KLSAgICBpbnRlcmZhY2UgQ2xvc2VkQ2FwdGlvbkxheW91dCB7Ci0gICAgICAgIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpOwotICAgICAgICB2b2lkIHNldEZvbnRTY2FsZShmbG9hdCBzY2FsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FwdGlvblN0eWxlIERFRkFVTFRfQ0FQVElPTl9TVFlMRSA9IENhcHRpb25TdHlsZS5ERUZBVUxUOwotCi0gICAgLyoqIENhcHRpb25pbmcgbWFuYWdlciwgdXNlZCB0byBvYnRhaW4gYW5kIHRyYWNrIGNhcHRpb24gcHJvcGVydGllcy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIENhcHRpb25pbmdNYW5hZ2VyIG1NYW5hZ2VyOwotCi0gICAgLyoqIEN1cnJlbnQgY2FwdGlvbiBzdHlsZS4gKi8KLSAgICBwcm90ZWN0ZWQgQ2FwdGlvblN0eWxlIG1DYXB0aW9uU3R5bGU7Ci0KLSAgICAvKiogQ2FsbGJhY2sgZm9yIHJlbmRlcmluZyBjaGFuZ2VzLiAqLwotICAgIHByb3RlY3RlZCBPbkNoYW5nZWRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAvKiogQ29uY3JldGUgbGF5b3V0IG9mIENDLiAqLwotICAgIHByb3RlY3RlZCBDbG9zZWRDYXB0aW9uTGF5b3V0IG1DbG9zZWRDYXB0aW9uTGF5b3V0OwotCi0gICAgLyoqIFdoZXRoZXIgYSBjYXB0aW9uIHN0eWxlIGNoYW5nZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzQ2hhbmdlTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0KLSAgICAgICAgLy8gQ2Fubm90IHJlbmRlciB0ZXh0IG92ZXIgdmlkZW8gd2hlbiBsYXllciB0eXBlIGlzIGhhcmR3YXJlLgotICAgICAgICBzZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX1NPRlRXQVJFLCBudWxsKTsKLQotICAgICAgICBtTWFuYWdlciA9IChDYXB0aW9uaW5nTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0FQVElPTklOR19TRVJWSUNFKTsKLSAgICAgICAgbUNhcHRpb25TdHlsZSA9IERFRkFVTFRfQ0FQVElPTl9TVFlMRS5hcHBseVN0eWxlKG1NYW5hZ2VyLmdldFVzZXJTdHlsZSgpKTsKLQotICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dCA9IGNyZWF0ZUNhcHRpb25MYXlvdXQoY29udGV4dCk7Ci0gICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldENhcHRpb25TdHlsZShtQ2FwdGlvblN0eWxlKTsKLSAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Rm9udFNjYWxlKG1NYW5hZ2VyLmdldEZvbnRTY2FsZSgpKTsKLSAgICAgICAgYWRkVmlldygoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLQotICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IENsb3NlZENhcHRpb25MYXlvdXQgY3JlYXRlQ2FwdGlvbkxheW91dChDb250ZXh0IGNvbnRleHQpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25DaGFuZ2VkTGlzdGVuZXIoT25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyh3aWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0KLSAgICAgICAgbWVhc3VyZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotICAgICAgICBsYXlvdXQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgKChWaWV3R3JvdXApIG1DbG9zZWRDYXB0aW9uTGF5b3V0KS5tZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgICgoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkubGF5b3V0KGwsIHQsIHIsIGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbmFnZXMgd2hldGhlciB0aGlzIHJlbmRlcmVyIGlzIGxpc3RlbmluZyBmb3IgY2FwdGlvbiBzdHlsZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nTGlzdGVuZXIgPSBuZXcgQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Vc2VyU3R5bGVDaGFuZ2VkKENhcHRpb25TdHlsZSB1c2VyU3R5bGUpIHsKLSAgICAgICAgICAgIG1DYXB0aW9uU3R5bGUgPSBERUZBVUxUX0NBUFRJT05fU1RZTEUuYXBwbHlTdHlsZSh1c2VyU3R5bGUpOwotICAgICAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Q2FwdGlvblN0eWxlKG1DYXB0aW9uU3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRm9udFNjYWxlQ2hhbmdlZChmbG9hdCBmb250U2NhbGUpIHsKLSAgICAgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldEZvbnRTY2FsZShmb250U2NhbGUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkc0xpc3RlbmVyID0gaXNBdHRhY2hlZFRvV2luZG93KCkgJiYgZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKLSAgICAgICAgaWYgKG1IYXNDaGFuZ2VMaXN0ZW5lciAhPSBuZWVkc0xpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtSGFzQ2hhbmdlTGlzdGVuZXIgPSBuZWVkc0xpc3RlbmVyOwotCi0gICAgICAgICAgICBpZiAobmVlZHNMaXN0ZW5lcikgewotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcihtQ2FwdGlvbmluZ0xpc3RlbmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKG1DYXB0aW9uaW5nTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIENDUGFyc2VyIHByb2Nlc3NlcyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9uIGRhdGEuCi0gKgotICogSXQgY2FsbHMgYmFjayBpbnRvIE9uRGlzcGxheUNoYW5nZWRMaXN0ZW5lciB1cG9uCi0gKiBkaXNwbGF5IGNoYW5nZSB3aXRoIHN0eWxlZCB0ZXh0IGZvciByZW5kZXJpbmcuCi0gKgotICovCi1jbGFzcyBDZWE2MDhDQ1BhcnNlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1MgPSAxNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQ09MUyA9IDMyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDZWE2MDhDQ1BhcnNlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEID0gLTE7Ci0KLSAgICAvLyBFSUEtQ0VBLTYwODogVGFibGUgNzAgLSBDb250cm9sIENvZGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJDTCA9IDB4MjA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJTICA9IDB4MjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFPRiA9IDB4MjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFPTiA9IDB4MjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFUiA9IDB4MjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVMiA9IDB4MjU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVMyA9IDB4MjY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVNCA9IDB4Mjc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPTiA9IDB4Mjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJEQyA9IDB4Mjk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSICA9IDB4MmE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJURCA9IDB4MmI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVETSA9IDB4MmM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSICA9IDB4MmQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOTSA9IDB4MmU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVPQyA9IDB4MmY7Ci0KLSAgICAvLyBUcmFuc3BhcmVudCBTcGFjZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVFMgPSAnXHUwMEEwJzsKLQotICAgIC8vIENhcHRpb25pbmcgTW9kZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9VTktOT1dOID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9QQUlOVF9PTiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUk9MTF9VUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUE9QX09OID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9URVhUID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgRGlzcGxheUxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgaW50IG1Nb2RlID0gTU9ERV9QQUlOVF9PTjsKLSAgICBwcml2YXRlIGludCBtUm9sbFVwU2l6ZSA9IDQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0KLSAgICBwcml2YXRlIENDTWVtb3J5IG1EaXNwbGF5ID0gbmV3IENDTWVtb3J5KCk7Ci0gICAgcHJpdmF0ZSBDQ01lbW9yeSBtTm9uRGlzcGxheSA9IG5ldyBDQ01lbW9yeSgpOwotICAgIHByaXZhdGUgQ0NNZW1vcnkgbVRleHRNZW0gPSBuZXcgQ0NNZW1vcnkoKTsKLQotICAgIENlYTYwOENDUGFyc2VyKERpc3BsYXlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShieXRlW10gZGF0YSkgewotICAgICAgICBDQ0RhdGFbXSBjY0RhdGEgPSBDQ0RhdGEuZnJvbUJ5dGVBcnJheShkYXRhKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjY0RhdGFbaV0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYW5kbGVDdHJsQ29kZShjY0RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZVRhYk9mZnNldHMoY2NEYXRhW2ldKQotICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVQQUNDb2RlKGNjRGF0YVtpXSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlTWlkUm93Q29kZShjY0RhdGFbaV0pKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhhbmRsZURpc3BsYXlhYmxlQ2hhcnMoY2NEYXRhW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludGVyZmFjZSBEaXNwbGF5TGlzdGVuZXIgewotICAgICAgICB2b2lkIG9uRGlzcGxheUNoYW5nZWQoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHN0eWxlZFRleHRzKTsKLSAgICAgICAgQ2FwdGlvblN0eWxlIGdldENhcHRpb25TdHlsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ0NNZW1vcnkgZ2V0TWVtb3J5KCkgewotICAgICAgICAvLyBnZXQgdGhlIENDIG1lbW9yeSB0byBvcGVyYXRlIG9uIGZvciBjdXJyZW50IG1vZGUKLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICBjYXNlIE1PREVfUE9QX09OOgotICAgICAgICAgICAgcmV0dXJuIG1Ob25EaXNwbGF5OwotICAgICAgICBjYXNlIE1PREVfVEVYVDoKLSAgICAgICAgICAgIC8vIFRPRE8oY2h6KTogc3VwcG9ydCBvbmx5IGNhcHRpb24gbW9kZSBmb3Igbm93LAotICAgICAgICAgICAgLy8gaW4gdGV4dCBtb2RlLCBkdW1wIGV2ZXJ5dGhpbmcgdG8gdGV4dCBtZW0uCi0gICAgICAgICAgICByZXR1cm4gbVRleHRNZW07Ci0gICAgICAgIGNhc2UgTU9ERV9QQUlOVF9PTjoKLSAgICAgICAgY2FzZSBNT0RFX1JPTExfVVA6Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJ1bnJlY29naW5pemVkIG1vZGU6ICIgKyBtTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVEaXNwbGF5YWJsZUNoYXJzKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgaWYgKCFjY0RhdGEuaXNEaXNwbGF5YWJsZUNoYXIoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRXh0ZW5kZWQgY2hhciBpbmNsdWRlcyAxIGF1dG9tYXRpYyBiYWNrc3BhY2UKLSAgICAgICAgaWYgKGNjRGF0YS5pc0V4dGVuZGVkQ2hhcigpKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS5icygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVUZXh0KGNjRGF0YS5nZXREaXNwbGF5VGV4dCgpKTsKLQotICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9QQUlOVF9PTiB8fCBtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVNaWRSb3dDb2RlKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgU3R5bGVDb2RlIG0gPSBjY0RhdGEuZ2V0TWlkUm93KCk7Ci0gICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLndyaXRlTWlkUm93Q29kZShtKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUEFDQ29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIFBBQyBwYWMgPSBjY0RhdGEuZ2V0UEFDKCk7Ci0KLSAgICAgICAgaWYgKHBhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWVtb3J5KCkubW92ZUJhc2VsaW5lVG8ocGFjLmdldFJvdygpLCBtUm9sbFVwU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS53cml0ZVBBQyhwYWMpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVRhYk9mZnNldHMoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBpbnQgdGFicyA9IGNjRGF0YS5nZXRUYWJPZmZzZXQoKTsKLQotICAgICAgICBpZiAodGFicyA+IDApIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLnRhYih0YWJzKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVDdHJsQ29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIGludCBjdHJsQ29kZSA9IGNjRGF0YS5nZXRDdHJsQ29kZSgpOwotCi0gICAgICAgIGlmIChtUHJldkN0cmxDb2RlICE9IElOVkFMSUQgJiYgbVByZXZDdHJsQ29kZSA9PSBjdHJsQ29kZSkgewotICAgICAgICAgICAgLy8gZGlzY2FyZCBkb3VibGUgY3RybCBjb2RlcyAoYnV0IGlmIHRoZXJlJ3MgYSAzcmQgb25lLCB3ZSBzdGlsbCB0YWtlIHRoYXQpCi0gICAgICAgICAgICBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKGN0cmxDb2RlKSB7Ci0gICAgICAgIGNhc2UgUkNMOgotICAgICAgICAgICAgLy8gc2VsZWN0IHBvcC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BPUF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJTOgotICAgICAgICAgICAgZ2V0TWVtb3J5KCkuYnMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFUjoKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLmRlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlUyOgotICAgICAgICBjYXNlIFJVMzoKLSAgICAgICAgY2FzZSBSVTQ6Ci0gICAgICAgICAgICBtUm9sbFVwU2l6ZSA9IChjdHJsQ29kZSAtIDB4MjMpOwotICAgICAgICAgICAgLy8gZXJhc2UgbWVtb3J5IGlmIGN1cnJlbnRseSBpbiBvdGhlciBzdHlsZQotICAgICAgICAgICAgaWYgKG1Nb2RlICE9IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICAgICAgbU5vbkRpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNlbGVjdCByb2xsLXVwIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUk9MTF9VUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPTjoKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkZsYXNoIE9uIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSREM6Ci0gICAgICAgICAgICAvLyBzZWxlY3QgcGFpbnQtb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QQUlOVF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSOgotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1RFWFQ7Ci0gICAgICAgICAgICBtVGV4dE1lbS5lcmFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlREOgotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1RFWFQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFRE06Ci0gICAgICAgICAgICAvLyBlcmFzZSBkaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgbURpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENSOgotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLnJvbGxVcChtUm9sbFVwU2l6ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLmNyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU5NOgotICAgICAgICAgICAgLy8gZXJhc2Ugbm9uLWRpc3BsYXkgbWVtb3J5Ci0gICAgICAgICAgICBtTm9uRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU9DOgotICAgICAgICAgICAgLy8gc3dhcCBkaXNwbGF5L25vbi1kaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgc3dhcE1lbW9yeSgpOwotICAgICAgICAgICAgLy8gc3dpdGNoIHRvIHBvcC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BPUF9PTjsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElOVkFMSUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1QcmV2Q3RybENvZGUgPSBjdHJsQ29kZTsKLQotICAgICAgICAvLyBoYW5kbGVkCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEaXNwbGF5KCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUgPSBtTGlzdGVuZXIuZ2V0Q2FwdGlvblN0eWxlKCk7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25EaXNwbGF5Q2hhbmdlZChtRGlzcGxheS5nZXRTdHlsZWRUZXh0KGNhcHRpb25TdHlsZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN3YXBNZW1vcnkoKSB7Ci0gICAgICAgIENDTWVtb3J5IHRlbXAgPSBtRGlzcGxheTsKLSAgICAgICAgbURpc3BsYXkgPSBtTm9uRGlzcGxheTsKLSAgICAgICAgbU5vbkRpc3BsYXkgPSB0ZW1wOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0eWxlQ29kZSB7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfV0hJVEUgPSAwOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0dSRUVOID0gMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9CTFVFID0gMjsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9DWUFOID0gMzsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9SRUQgPSA0OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1lFTExPVyA9IDU7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfTUFHRU5UQSA9IDY7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfSU5WQUxJRCA9IDc7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVFlMRV9JVEFMSUNTICAgPSAweDAwMDAwMDAxOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNUWUxFX1VOREVSTElORSA9IDB4MDAwMDAwMDI7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1Db2xvck1hcCA9IHsKLSAgICAgICAgICAgICJXSElURSIsICJHUkVFTiIsICJCTFVFIiwgIkNZQU4iLCAiUkVEIiwgIllFTExPVyIsICJNQUdFTlRBIiwgIklOVkFMSUQiCi0gICAgICAgIH07Ci0KLSAgICAgICAgZmluYWwgaW50IG1TdHlsZTsKLSAgICAgICAgZmluYWwgaW50IG1Db2xvcjsKLQotICAgICAgICBzdGF0aWMgU3R5bGVDb2RlIGZyb21CeXRlKGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIGludCBzdHlsZSA9IDA7Ci0gICAgICAgICAgICBpbnQgY29sb3IgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmICgoZGF0YTIgJiAweDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb2xvciA9PSBDT0xPUl9JTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgLy8gV0hJVEUgSVRBTElDUwotICAgICAgICAgICAgICAgIGNvbG9yID0gQ09MT1JfV0hJVEU7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfSVRBTElDUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHlsZUNvZGUoc3R5bGUsIGNvbG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0eWxlQ29kZShpbnQgc3R5bGUsIGludCBjb2xvcikgewotICAgICAgICAgICAgbVN0eWxlID0gc3R5bGU7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNJdGFsaWNzKCkgewotICAgICAgICAgICAgcmV0dXJuIChtU3R5bGUgJiBTVFlMRV9JVEFMSUNTKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1VuZGVybGluZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAobVN0eWxlICYgU1RZTEVfVU5ERVJMSU5FKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENvbG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgc3RyLmFwcGVuZCgieyIpOwotICAgICAgICAgICAgc3RyLmFwcGVuZChtQ29sb3JNYXBbbUNvbG9yXSk7Ci0gICAgICAgICAgICBpZiAoKG1TdHlsZSAmIFNUWUxFX0lUQUxJQ1MpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIsIElUQUxJQ1MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobVN0eWxlICYgU1RZTEVfVU5ERVJMSU5FKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCBVTkRFUkxJTkUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci5hcHBlbmQoIn0iKTsKLQotICAgICAgICAgICAgcmV0dXJuIHN0ci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUEFDIGV4dGVuZHMgU3R5bGVDb2RlIHsKLSAgICAgICAgZmluYWwgaW50IG1Sb3c7Ci0gICAgICAgIGZpbmFsIGludCBtQ29sOwotCi0gICAgICAgIHN0YXRpYyBQQUMgZnJvbUJ5dGVzKGJ5dGUgZGF0YTEsIGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIGludFtdIHJvd1RhYmxlID0gezExLCAxLCAzLCAxMiwgMTQsIDUsIDcsIDl9OwotICAgICAgICAgICAgaW50IHJvdyA9IHJvd1RhYmxlW2RhdGExICYgMHgwN10gKyAoKGRhdGEyICYgMHgyMCkgPj4gNSk7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSAwOwotICAgICAgICAgICAgaWYgKChkYXRhMiAmIDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGRhdGEyICYgMHgxMCkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGluZGVudCBjb2RlCi0gICAgICAgICAgICAgICAgaW50IGluZGVudCA9IChkYXRhMiA+PiAxKSAmIDB4NzsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBBQyhyb3csIGluZGVudCAqIDQsIHN0eWxlLCBDT0xPUl9XSElURSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHN0eWxlIGNvZGUKLSAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29sb3IgPT0gQ09MT1JfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXSElURSBJVEFMSUNTCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yID0gQ09MT1JfV0hJVEU7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX0lUQUxJQ1M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUEFDKHJvdywgLTEsIHN0eWxlLCBjb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBQQUMoaW50IHJvdywgaW50IGNvbCwgaW50IHN0eWxlLCBpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIHN1cGVyKHN0eWxlLCBjb2xvcik7Ci0gICAgICAgICAgICBtUm93ID0gcm93OwotICAgICAgICAgICAgbUNvbCA9IGNvbDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNJbmRlbnRQQUMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1Db2wgPj0gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Um93KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Q29sKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2w7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7JWQsICVkfSwgJXMiLAotICAgICAgICAgICAgICAgICAgICBtUm93LCBtQ29sLCBzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11dGFibGUgdmVyc2lvbiBvZiBCYWNrZ3JvdW5kU3BhbiB0byBmYWNpbGl0YXRlIHRleHQgcmVuZGVyaW5nIHdpdGggZWRnZSBzdHlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbiBleHRlbmRzIENoYXJhY3RlclN0eWxlCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFVwZGF0ZUFwcGVhcmFuY2UgewotICAgICAgICBwcml2YXRlIGludCBtQ29sb3I7Ci0KLSAgICAgICAgcHVibGljIE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuKGludCBjb2xvcikgewotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEcmF3U3RhdGUoVGV4dFBhaW50IGRzKSB7Ci0gICAgICAgICAgICBkcy5iZ0NvbG9yID0gbUNvbG9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ0NMaW5lQnVpbGRlciBrZWVwcyB0cmFjayBvZiBkaXNwbGF5YWJsZSBjaGFycywgYXMgd2VsbCBhcwotICAgICAqIE1pZFJvdyBzdHlsZXMgYW5kIFBBQ3MsIGZvciBhIHNpbmdsZSBsaW5lIG9mIENDIG1lbW9yeS4KLSAgICAgKgotICAgICAqIEl0IGdlbmVyYXRlcyBzdHlsZWQgdGV4dCB2aWEgZ2V0U3R5bGVkVGV4dCgpIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xpbmVCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIG1EaXNwbGF5Q2hhcnM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3R5bGVDb2RlW10gbU1pZFJvd1N0eWxlczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHlsZUNvZGVbXSBtUEFDU3R5bGVzOwotCi0gICAgICAgIENDTGluZUJ1aWxkZXIoU3RyaW5nIHN0cikgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycyA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cik7Ci0gICAgICAgICAgICBtTWlkUm93U3R5bGVzID0gbmV3IFN0eWxlQ29kZVttRGlzcGxheUNoYXJzLmxlbmd0aCgpXTsKLSAgICAgICAgICAgIG1QQUNTdHlsZXMgPSBuZXcgU3R5bGVDb2RlW21EaXNwbGF5Q2hhcnMubGVuZ3RoKCldOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRDaGFyQXQoaW50IGluZGV4LCBjaGFyIGNoKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzLnNldENoYXJBdChpbmRleCwgY2gpOwotICAgICAgICAgICAgbU1pZFJvd1N0eWxlc1tpbmRleF0gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRNaWRSb3dBdChpbnQgaW5kZXgsIFN0eWxlQ29kZSBtKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzLnNldENoYXJBdChpbmRleCwgJyAnKTsKLSAgICAgICAgICAgIG1NaWRSb3dTdHlsZXNbaW5kZXhdID0gbTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UEFDQXQoaW50IGluZGV4LCBQQUMgcGFjKSB7Ci0gICAgICAgICAgICBtUEFDU3R5bGVzW2luZGV4XSA9IHBhYzsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Q2hhcnMuY2hhckF0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZW5ndGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlDaGFycy5sZW5ndGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXBwbHlTdHlsZVNwYW4oCi0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzdHlsZWRUZXh0LAotICAgICAgICAgICAgICAgIFN0eWxlQ29kZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIGlmIChzLmlzSXRhbGljcygpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0eWxlU3BhbihhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlLklUQUxJQyksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLmlzVW5kZXJsaW5lKCkpIHsKLSAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVW5kZXJsaW5lU3BhbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGdldFN0eWxlZFRleHQoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzdHlsZWRUZXh0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIobURpc3BsYXlDaGFycyk7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSAtMSwgbmV4dCA9IDA7Ci0gICAgICAgICAgICBpbnQgc3R5bGVTdGFydCA9IC0xOwotICAgICAgICAgICAgU3R5bGVDb2RlIGN1clN0eWxlID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0IDwgbURpc3BsYXlDaGFycy5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIFN0eWxlQ29kZSBuZXdTdHlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1NaWRSb3dTdHlsZXNbbmV4dF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBtaWQtcm93IHN0eWxlIGNoYW5nZQotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IG1NaWRSb3dTdHlsZXNbbmV4dF07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUEFDU3R5bGVzW25leHRdICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgKHN0eWxlU3RhcnQgPCAwIHx8IHN0YXJ0IDwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgUEFDIHN0eWxlIGNoYW5nZSwgb25seSBpZjoKLSAgICAgICAgICAgICAgICAgICAgLy8gMS4gbm8gc3R5bGUgc2V0LCBvcgotICAgICAgICAgICAgICAgICAgICAvLyAyLiBzdHlsZSBzZXQsIGJ1dCBwcmV2IGNoYXIgaXMgbm9uZS1kaXNwbGF5YWJsZQotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IG1QQUNTdHlsZXNbbmV4dF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1clN0eWxlID0gbmV3U3R5bGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVN0YXJ0ID49IDAgJiYgc3RhcnQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHlsZVNwYW4oc3R5bGVkVGV4dCwgbmV3U3R5bGUsIHN0eWxlU3RhcnQsIG5leHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlU3RhcnQgPSBuZXh0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtRGlzcGxheUNoYXJzLmNoYXJBdChuZXh0KSAhPSBUUykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGV4cGFuZGVkU3RhcnQgPSBtRGlzcGxheUNoYXJzLmNoYXJBdChzdGFydCkgPT0gJyAnID8gc3RhcnQgOiBzdGFydCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZEVuZCA9IG1EaXNwbGF5Q2hhcnMuY2hhckF0KG5leHQgLSAxKSA9PSAnICcgPyBuZXh0IDogbmV4dCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4oY2FwdGlvblN0eWxlLmJhY2tncm91bmRDb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRTdGFydCwgZXhwYW5kZWRFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3R5bGVTcGFuKHN0eWxlZFRleHQsIGN1clN0eWxlLCBzdHlsZVN0YXJ0LCBleHBhbmRlZEVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV4dCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3R5bGVkVGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ0NNZW1vcnkgbW9kZWxzIGEgY29uc29sZS1zdHlsZSBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTWVtb3J5IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUJsYW5rTGluZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDQ0xpbmVCdWlsZGVyW10gbUxpbmVzID0gbmV3IENDTGluZUJ1aWxkZXJbTUFYX1JPV1MgKyAyXTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVJvdzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbDsKLQotICAgICAgICBDQ01lbW9yeSgpIHsKLSAgICAgICAgICAgIGNoYXJbXSBibGFuayA9IG5ldyBjaGFyW01BWF9DT0xTICsgMl07Ci0gICAgICAgICAgICBBcnJheXMuZmlsbChibGFuaywgVFMpOwotICAgICAgICAgICAgbUJsYW5rTGluZSA9IG5ldyBTdHJpbmcoYmxhbmspOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlcmFzZSgpIHsKLSAgICAgICAgICAgIC8vIGVyYXNlIGFsbCBsaW5lcwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJvdyA9IE1BWF9ST1dTOwotICAgICAgICAgICAgbUNvbCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGRlcigpIHsKLSAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10uY2hhckF0KGkpICE9IFRTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gbUNvbDsgaiA8IG1MaW5lc1ttUm93XS5sZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2pdLnNldENoYXJBdChqLCBUUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxpbmVzW21Sb3ddID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGFiKGludCB0YWJzKSB7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2wodGFicyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGJzKCkgewotICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKC0xKTsKLSAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XS5zZXRDaGFyQXQobUNvbCwgVFMpOwotICAgICAgICAgICAgICAgIGlmIChtQ29sID09IE1BWF9DT0xTIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTcGVjIHJlY29tbWVuZGF0aW9uOgotICAgICAgICAgICAgICAgICAgICAvLyBpZiBjdXJzb3Igd2FzIGF0IGNvbCAzMiwgbW92ZSBjdXJzb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byBjb2wgMzEgYW5kIGVyYXNlIGJvdGggY29sIDMxJjMyCi0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XS5zZXRDaGFyQXQoTUFYX0NPTFMsIFRTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNyKCkgewotICAgICAgICAgICAgbW92ZUN1cnNvclRvKG1Sb3cgKyAxLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcm9sbFVwKGludCB3aW5kb3dTaXplKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbVJvdyAtIHdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3RhcnRSb3cgPSBtUm93IC0gd2luZG93U2l6ZSArIDE7Ci0gICAgICAgICAgICBpZiAoc3RhcnRSb3cgPCAxKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRSb3cgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gc3RhcnRSb3c7IGkgPCBtUm93OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBtTGluZXNbaSArIDFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gbVJvdzsgaSA8IG1MaW5lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIGNsZWFyIGJhc2Ugcm93Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gY29sIDEsIGluIGNhc2UgUEFDIGlzIG5vdCBzZW50Ci0gICAgICAgICAgICBtQ29sID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0Q2hhckF0KG1Db2wsIHRleHQuY2hhckF0KGkpKTsKLSAgICAgICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlTWlkUm93Q29kZShTdHlsZUNvZGUgbSkgewotICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRNaWRSb3dBdChtQ29sLCBtKTsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVQQUMoUEFDIHBhYykgewotICAgICAgICAgICAgaWYgKHBhYy5pc0luZGVudFBBQygpKSB7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvclRvKHBhYy5nZXRSb3coKSwgcGFjLmdldENvbCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvclRvKHBhYy5nZXRSb3coKSwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldFBBQ0F0KG1Db2wsIHBhYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gZ2V0U3R5bGVkVGV4dChDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3Bhbm5hYmxlU3RyaW5nQnVpbGRlcj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8PihNQVhfUk9XUyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcm93cy5hZGQobUxpbmVzW2ldICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2ldLmdldFN0eWxlZFRleHQoY2FwdGlvblN0eWxlKSA6IG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvd3MudG9BcnJheShuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltNQVhfUk9XU10pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsYW1wKGludCB4LCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0gICAgICAgICAgICByZXR1cm4geCA8IG1pbiA/IG1pbiA6ICh4ID4gbWF4ID8gbWF4IDogeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclRvKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgICAgIG1Sb3cgPSBjbGFtcChyb3csIDEsIE1BWF9ST1dTKTsKLSAgICAgICAgICAgIG1Db2wgPSBjbGFtcChjb2wsIDEsIE1BWF9DT0xTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yVG9Sb3coaW50IHJvdykgewotICAgICAgICAgICAgbVJvdyA9IGNsYW1wKHJvdywgMSwgTUFYX1JPV1MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JCeUNvbChpbnQgY29sKSB7Ci0gICAgICAgICAgICBtQ29sID0gY2xhbXAobUNvbCArIGNvbCwgMSwgTUFYX0NPTFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVCYXNlbGluZVRvKGludCBiYXNlUm93LCBpbnQgd2luZG93U2l6ZSkgewotICAgICAgICAgICAgaWYgKG1Sb3cgPT0gYmFzZVJvdykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBhY3R1YWxXaW5kb3dTaXplID0gd2luZG93U2l6ZTsKLSAgICAgICAgICAgIGlmIChiYXNlUm93IDwgYWN0dWFsV2luZG93U2l6ZSkgewotICAgICAgICAgICAgICAgIGFjdHVhbFdpbmRvd1NpemUgPSBiYXNlUm93OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Sb3cgPCBhY3R1YWxXaW5kb3dTaXplKSB7Ci0gICAgICAgICAgICAgICAgYWN0dWFsV2luZG93U2l6ZSA9IG1Sb3c7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgaWYgKGJhc2VSb3cgPCBtUm93KSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIGJvdHRvbSB0byB0b3Agcm93Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gYWN0dWFsV2luZG93U2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1tiYXNlUm93IC0gaV0gPSBtTGluZXNbbVJvdyAtIGldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIHRvcCB0byBib3R0b20gcm93Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFjdHVhbFdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtTGluZXNbYmFzZVJvdyAtIGldID0gbUxpbmVzW21Sb3cgLSBpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjbGVhciByZXN0IG9mIHRoZSByb3dzCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGJhc2VSb3cgLSB3aW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gYmFzZVJvdyArIDE7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBDQ0xpbmVCdWlsZGVyIGdldExpbmVCdWZmZXIoaW50IHJvdykgewotICAgICAgICAgICAgaWYgKG1MaW5lc1tyb3ddID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbcm93XSA9IG5ldyBDQ0xpbmVCdWlsZGVyKG1CbGFua0xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1MaW5lc1tyb3ddOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDQ0RhdGEgcGFyc2VzIHRoZSByYXcgQ0MgYnl0ZSBwYWlyIGludG8gZGlzcGxheWFibGUgY2hhcnMsCi0gICAgICogbWlzYyBjb250cm9sIGNvZGVzLCBNaWQtUm93IG9yIFByZWFtYmxlIEFkZHJlc3MgQ29kZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NEYXRhIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1UeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGExOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGEyOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1DdHJsQ29kZU1hcCA9IHsKLSAgICAgICAgICAgICJSQ0wiLCAiQlMiICwgIkFPRiIsICJBT04iLAotICAgICAgICAgICAgIkRFUiIsICJSVTIiLCAiUlUzIiwgIlJVNCIsCi0gICAgICAgICAgICAiRk9OIiwgIlJEQyIsICJUUiIgLCAiUlREIiwKLSAgICAgICAgICAgICJFRE0iLCAiQ1IiICwgIkVOTSIsICJFT0MiLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TcGVjaWFsQ2hhck1hcCA9IHsKLSAgICAgICAgICAgICJcdTAwQUUiLAotICAgICAgICAgICAgIlx1MDBCMCIsCi0gICAgICAgICAgICAiXHUwMEJEIiwKLSAgICAgICAgICAgICJcdTAwQkYiLAotICAgICAgICAgICAgIlx1MjEyMiIsCi0gICAgICAgICAgICAiXHUwMEEyIiwKLSAgICAgICAgICAgICJcdTAwQTMiLAotICAgICAgICAgICAgIlx1MjY2QSIsIC8vIEVpZ2h0aCBub3RlCi0gICAgICAgICAgICAiXHUwMEUwIiwKLSAgICAgICAgICAgICJcdTAwQTAiLCAvLyBUcmFuc3BhcmVudCBzcGFjZQotICAgICAgICAgICAgIlx1MDBFOCIsCi0gICAgICAgICAgICAiXHUwMEUyIiwKLSAgICAgICAgICAgICJcdTAwRUEiLAotICAgICAgICAgICAgIlx1MDBFRSIsCi0gICAgICAgICAgICAiXHUwMEY0IiwKLSAgICAgICAgICAgICJcdTAwRkIiLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TcGFuaXNoQ2hhck1hcCA9IHsKLSAgICAgICAgICAgIC8vIFNwYW5pc2ggYW5kIG1pc2MgY2hhcnMKLSAgICAgICAgICAgICJcdTAwQzEiLCAvLyBBCi0gICAgICAgICAgICAiXHUwMEM5IiwgLy8gRQotICAgICAgICAgICAgIlx1MDBEMyIsIC8vIEkKLSAgICAgICAgICAgICJcdTAwREEiLCAvLyBPCi0gICAgICAgICAgICAiXHUwMERDIiwgLy8gVQotICAgICAgICAgICAgIlx1MDBGQyIsIC8vIHUKLSAgICAgICAgICAgICJcdTIwMTgiLCAvLyBvcGVuaW5nIHNpbmdsZSBxdW90ZQotICAgICAgICAgICAgIlx1MDBBMSIsIC8vIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmsKLSAgICAgICAgICAgICIqIiwKLSAgICAgICAgICAgICInIiwKLSAgICAgICAgICAgICJcdTIwMTQiLCAvLyBlbSBkYXNoCi0gICAgICAgICAgICAiXHUwMEE5IiwgLy8gQ29weXJpZ2h0Ci0gICAgICAgICAgICAiXHUyMTIwIiwgLy8gU2VydmljZW1hcmsKLSAgICAgICAgICAgICJcdTIwMjIiLCAvLyByb3VuZCBidWxsZXQKLSAgICAgICAgICAgICJcdTIwMUMiLCAvLyBvcGVuaW5nIGRvdWJsZSBxdW90ZQotICAgICAgICAgICAgIlx1MjAxRCIsIC8vIGNsb3NpbmcgZG91YmxlIHF1b3RlCi0gICAgICAgICAgICAvLyBGcmVuY2gKLSAgICAgICAgICAgICJcdTAwQzAiLAotICAgICAgICAgICAgIlx1MDBDMiIsCi0gICAgICAgICAgICAiXHUwMEM3IiwKLSAgICAgICAgICAgICJcdTAwQzgiLAotICAgICAgICAgICAgIlx1MDBDQSIsCi0gICAgICAgICAgICAiXHUwMENCIiwKLSAgICAgICAgICAgICJcdTAwRUIiLAotICAgICAgICAgICAgIlx1MDBDRSIsCi0gICAgICAgICAgICAiXHUwMENGIiwKLSAgICAgICAgICAgICJcdTAwRUYiLAotICAgICAgICAgICAgIlx1MDBENCIsCi0gICAgICAgICAgICAiXHUwMEQ5IiwKLSAgICAgICAgICAgICJcdTAwRjkiLAotICAgICAgICAgICAgIlx1MDBEQiIsCi0gICAgICAgICAgICAiXHUwMEFCIiwKLSAgICAgICAgICAgICJcdTAwQkIiCi0gICAgICAgIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbVByb3R1Z3Vlc2VDaGFyTWFwID0gewotICAgICAgICAgICAgLy8gUG9ydHVndWVzZQotICAgICAgICAgICAgIlx1MDBDMyIsCi0gICAgICAgICAgICAiXHUwMEUzIiwKLSAgICAgICAgICAgICJcdTAwQ0QiLAotICAgICAgICAgICAgIlx1MDBDQyIsCi0gICAgICAgICAgICAiXHUwMEVDIiwKLSAgICAgICAgICAgICJcdTAwRDIiLAotICAgICAgICAgICAgIlx1MDBGMiIsCi0gICAgICAgICAgICAiXHUwMEQ1IiwKLSAgICAgICAgICAgICJcdTAwRjUiLAotICAgICAgICAgICAgInsiLAotICAgICAgICAgICAgIn0iLAotICAgICAgICAgICAgIlxcIiwKLSAgICAgICAgICAgICJeIiwKLSAgICAgICAgICAgICJfIiwKLSAgICAgICAgICAgICJ8IiwKLSAgICAgICAgICAgICJ+IiwKLSAgICAgICAgICAgIC8vIEdlcm1hbiBhbmQgbWlzYyBjaGFycwotICAgICAgICAgICAgIlx1MDBDNCIsCi0gICAgICAgICAgICAiXHUwMEU0IiwKLSAgICAgICAgICAgICJcdTAwRDYiLAotICAgICAgICAgICAgIlx1MDBGNiIsCi0gICAgICAgICAgICAiXHUwMERGIiwKLSAgICAgICAgICAgICJcdTAwQTUiLAotICAgICAgICAgICAgIlx1MDBBNCIsCi0gICAgICAgICAgICAiXHUyNTAyIiwgLy8gdmVydGljYWwgYmFyCi0gICAgICAgICAgICAiXHUwMEM1IiwKLSAgICAgICAgICAgICJcdTAwRTUiLAotICAgICAgICAgICAgIlx1MDBEOCIsCi0gICAgICAgICAgICAiXHUwMEY4IiwKLSAgICAgICAgICAgICJcdTI1MEMiLCAvLyB0b3AtbGVmdCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTAiLCAvLyB0b3AtcmlnaHQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTE0IiwgLy8gbG93ZXItbGVmdCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTgiLCAvLyBsb3dlci1yaWdodCBjb3JuZXIKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgQ0NEYXRhW10gZnJvbUJ5dGVBcnJheShieXRlW10gZGF0YSkgewotICAgICAgICAgICAgQ0NEYXRhW10gY2NEYXRhID0gbmV3IENDRGF0YVtkYXRhLmxlbmd0aCAvIDNdOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNjRGF0YVtpXSA9IG5ldyBDQ0RhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDMgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDMgKyAyXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjY0RhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBDQ0RhdGEoYnl0ZSB0eXBlLCBieXRlIGRhdGExLCBieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBtRGF0YTEgPSBkYXRhMTsKLSAgICAgICAgICAgIG1EYXRhMiA9IGRhdGEyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldEN0cmxDb2RlKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxNCB8fCBtRGF0YTEgPT0gMHgxYykKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4MmYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbURhdGEyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHlsZUNvZGUgZ2V0TWlkUm93KCkgewotICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0IHN0YW5kYXJkIE1pZC1yb3cgY29kZXMsIGlnbm9yZQotICAgICAgICAgICAgLy8gb3B0aW9uYWwgYmFja2dyb3VuZC9mb3JlZ3JvdW5kIG1pZC1yb3cgY29kZXMKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTEgfHwgbURhdGExID09IDB4MTkpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDJmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlQ29kZS5mcm9tQnl0ZShtRGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBQQUMgZ2V0UEFDKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgJiAweDcwKSA9PSAweDEwCi0gICAgICAgICAgICAgICAgICAgICYmIChtRGF0YTIgJiAweDQwKSA9PSAweDQwCi0gICAgICAgICAgICAgICAgICAgICYmICgobURhdGExICYgMHgwNykgIT0gMCB8fCAobURhdGEyICYgMHgyMCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUEFDLmZyb21CeXRlcyhtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRUYWJPZmZzZXQoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDE3IHx8IG1EYXRhMSA9PSAweDFmKQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMSAmJiBtRGF0YTIgPD0gMHgyMykgewotICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YTIgJiAweDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNEaXNwbGF5YWJsZUNoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNCYXNpY0NoYXIoKSB8fCBpc1NwZWNpYWxDaGFyKCkgfHwgaXNFeHRlbmRlZENoYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXREaXNwbGF5VGV4dCgpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBnZXRCYXNpY0NoYXJzKCk7Ci0KLSAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0ciA9ICBnZXRTcGVjaWFsQ2hhcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IGdldEV4dGVuZGVkQ2hhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGN0cmxDb2RlVG9TdHJpbmcoaW50IGN0cmxDb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN0cmxDb2RlTWFwW2N0cmxDb2RlIC0gMHgyMF07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNCYXNpY0NoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURhdGExID49IDB4MjAgJiYgbURhdGExIDw9IDB4N2Y7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTcGVjaWFsQ2hhcigpIHsKLSAgICAgICAgICAgIHJldHVybiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgzMCAmJiBtRGF0YTIgPD0gMHgzZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNFeHRlbmRlZENoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChtRGF0YTEgPT0gMHgxMiB8fCBtRGF0YTEgPT0gMHgxQQotICAgICAgICAgICAgICAgICAgICB8fCBtRGF0YTEgPT0gMHgxMyB8fCBtRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjaGFyIGdldEJhc2ljQ2hhcihieXRlIGRhdGEpIHsKLSAgICAgICAgICAgIGNoYXIgYzsKLSAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIG5vbi1BU0NJSSBvbmVzCi0gICAgICAgICAgICBzd2l0Y2ggKGRhdGEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDB4MkE6IGMgPSAnXHUwMEUxJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDVDOiBjID0gJ1x1MDBFOSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg1RTogYyA9ICdcdTAwRUQnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NUY6IGMgPSAnXHUwMEYzJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDYwOiBjID0gJ1x1MDBGQSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3QjogYyA9ICdcdTAwRTcnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0M6IGMgPSAnXHUwMEY3JzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdEOiBjID0gJ1x1MDBEMSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3RTogYyA9ICdcdTAwRjEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0Y6IGMgPSAnXHUyNTg4JzsgYnJlYWs7IC8vIEZ1bGwgYmxvY2sKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBjID0gKGNoYXIpIGRhdGE7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNpY0NoYXJzKCkgewotICAgICAgICAgICAgaWYgKG1EYXRhMSA+PSAweDIwICYmIG1EYXRhMSA8PSAweDdmKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMik7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QmFzaWNDaGFyKG1EYXRhMSkpOwotICAgICAgICAgICAgICAgIGlmIChtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHg3ZikgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRCYXNpY0NoYXIobURhdGEyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3BlY2lhbENoYXIoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgzMCAmJiBtRGF0YTIgPD0gMHgzZikgewotICAgICAgICAgICAgICAgIHJldHVybiBtU3BlY2lhbENoYXJNYXBbbURhdGEyIC0gMHgzMF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5kZWRDaGFyKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMiB8fCBtRGF0YTEgPT0gMHgxQSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpewotICAgICAgICAgICAgICAgIC8vIDEgU3BhbmlzaC9GcmVuY2ggY2hhcgotICAgICAgICAgICAgICAgIHJldHVybiBtU3BhbmlzaENoYXJNYXBbbURhdGEyIC0gMHgyMF07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChtRGF0YTEgPT0gMHgxMyB8fCBtRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpewotICAgICAgICAgICAgICAgIC8vIDEgUG9ydHVndWVzZS9HZXJtYW4vRGFuaXNoIGNoYXIKLSAgICAgICAgICAgICAgICByZXR1cm4gbVByb3R1Z3Vlc2VDaGFyTWFwW21EYXRhMiAtIDB4MjBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nIHN0cjsKLQotICAgICAgICAgICAgaWYgKG1EYXRhMSA8IDB4MTAgJiYgbURhdGEyIDwgMHgxMCkgewotICAgICAgICAgICAgICAgIC8vIE51bGwgUGFkLCBpZ25vcmUKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXU51bGw6ICUwMnggJTAyeCIsIG1UeXBlLCBtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjdHJsQ29kZSA9IGdldEN0cmxDb2RlKCk7Ci0gICAgICAgICAgICBpZiAoY3RybENvZGUgIT0gSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdJXMiLCBtVHlwZSwgY3RybENvZGVUb1N0cmluZyhjdHJsQ29kZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdGFiT2Zmc2V0ID0gZ2V0VGFiT2Zmc2V0KCk7Ci0gICAgICAgICAgICBpZiAodGFiT2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdVGFiJWQiLCBtVHlwZSwgdGFiT2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUEFDIHBhYyA9IGdldFBBQygpOwotICAgICAgICAgICAgaWYgKHBhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1QQUM6ICVzIiwgbVR5cGUsIHBhYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3R5bGVDb2RlIG0gPSBnZXRNaWRSb3coKTsKLSAgICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXU1pZC1yb3c6ICVzIiwgbVR5cGUsIG0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0Rpc3BsYXlhYmxlQ2hhcigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1EaXNwbGF5YWJsZTogJXMgKCUwMnggJTAyeCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGUsIGdldERpc3BsYXlUZXh0KCksIG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1JbnZhbGlkOiAlMDJ4ICUwMngiLCBtVHlwZSwgbURhdGExLCBtRGF0YTIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIFdpZGdldCBjYXBhYmxlIG9mIHJlbmRlcmluZyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9ucy4KLSAqLwotY2xhc3MgQ2VhNjA4Q0NXaWRnZXQgZXh0ZW5kcyBDbG9zZWRDYXB0aW9uV2lkZ2V0IGltcGxlbWVudHMgQ2VhNjA4Q0NQYXJzZXIuRGlzcGxheUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0IG1UZXh0Qm91bmRzID0gbmV3IFJlY3QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbUR1bW15VGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0IjsKLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENsb3NlZENhcHRpb25MYXlvdXQgY3JlYXRlQ2FwdGlvbkxheW91dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDQ0xheW91dChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc3BsYXlDaGFuZ2VkKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBzdHlsZWRUZXh0cykgewotICAgICAgICAoKENDTGF5b3V0KSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkudXBkYXRlKHN0eWxlZFRleHRzKTsKLQotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNoYW5nZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2FwdGlvblN0eWxlIGdldENhcHRpb25TdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DYXB0aW9uU3R5bGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMaW5lQm94IGV4dGVuZHMgVGV4dFZpZXcgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBGT05UX1BBRERJTkdfUkFUSU8gPSAwLjc1ZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRURHRV9PVVRMSU5FX1JBVElPID0gMC4xZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRURHRV9TSEFET1dfUkFUSU8gPSAwLjA1ZjsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtT3V0bGluZVdpZHRoOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TaGFkb3dSYWRpdXM7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVNoYWRvd09mZnNldDsKLQotICAgICAgICBwcml2YXRlIGludCBtVGV4dENvbG9yID0gQ29sb3IuV0hJVEU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1CZ0NvbG9yID0gQ29sb3IuQkxBQ0s7Ci0gICAgICAgIHByaXZhdGUgaW50IG1FZGdlVHlwZSA9IENhcHRpb25TdHlsZS5FREdFX1RZUEVfTk9ORTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUVkZ2VDb2xvciA9IENvbG9yLlRSQU5TUEFSRU5UOwotCi0gICAgICAgIENDTGluZUJveChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUik7Ci0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IuVFJBTlNQQVJFTlQpOwotICAgICAgICAgICAgc2V0VGV4dENvbG9yKENvbG9yLldISVRFKTsKLSAgICAgICAgICAgIHNldFR5cGVmYWNlKFR5cGVmYWNlLk1PTk9TUEFDRSk7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBkZWZhdWx0ICh3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgZHVyaW5nIG1lYXN1cmUpCi0gICAgICAgICAgICBtT3V0bGluZVdpZHRoID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9vdXRsaW5lX3dpZHRoKTsKLSAgICAgICAgICAgIG1TaGFkb3dSYWRpdXMgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX3NoYWRvd19yYWRpdXMpOwotICAgICAgICAgICAgbVNoYWRvd09mZnNldCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfc2hhZG93X29mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBtVGV4dENvbG9yID0gY2FwdGlvblN0eWxlLmZvcmVncm91bmRDb2xvcjsKLSAgICAgICAgICAgIG1CZ0NvbG9yID0gY2FwdGlvblN0eWxlLmJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgIG1FZGdlVHlwZSA9IGNhcHRpb25TdHlsZS5lZGdlVHlwZTsKLSAgICAgICAgICAgIG1FZGdlQ29sb3IgPSBjYXB0aW9uU3R5bGUuZWRnZUNvbG9yOwotCi0gICAgICAgICAgICBzZXRUZXh0Q29sb3IobVRleHRDb2xvcik7Ci0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfRFJPUF9TSEFET1cpIHsKLSAgICAgICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCBtU2hhZG93T2Zmc2V0LCBtU2hhZG93T2Zmc2V0LCBtRWRnZUNvbG9yKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgICAgIGZsb2F0IGZvbnRTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYykgKiBGT05UX1BBRERJTkdfUkFUSU87Ci0gICAgICAgICAgICBzZXRUZXh0U2l6ZShUeXBlZFZhbHVlLkNPTVBMRVhfVU5JVF9QWCwgZm9udFNpemUpOwotCi0gICAgICAgICAgICBtT3V0bGluZVdpZHRoID0gRURHRV9PVVRMSU5FX1JBVElPICogZm9udFNpemUgKyAxLjBmOwotICAgICAgICAgICAgbVNoYWRvd1JhZGl1cyA9IEVER0VfU0hBRE9XX1JBVElPICogZm9udFNpemUgKyAxLjBmOzsKLSAgICAgICAgICAgIG1TaGFkb3dPZmZzZXQgPSBtU2hhZG93UmFkaXVzOwotCi0gICAgICAgICAgICAvLyBzZXQgZm9udCBzY2FsZSBpbiB0aGUgWCBkaXJlY3Rpb24gdG8gbWF0Y2ggdGhlIHJlcXVpcmVkIHdpZHRoCi0gICAgICAgICAgICBzZXRTY2FsZVgoMS4wZik7Ci0gICAgICAgICAgICBnZXRQYWludCgpLmdldFRleHRCb3VuZHMobUR1bW15VGV4dCwgMCwgbUR1bW15VGV4dC5sZW5ndGgoKSwgbVRleHRCb3VuZHMpOwotICAgICAgICAgICAgZmxvYXQgYWN0dWFsVGV4dFdpZHRoID0gbVRleHRCb3VuZHMud2lkdGgoKTsKLSAgICAgICAgICAgIGZsb2F0IHJlcXVpcmVkVGV4dFdpZHRoID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIHNldFNjYWxlWChyZXF1aXJlZFRleHRXaWR0aCAvIGFjdHVhbFRleHRXaWR0aCk7Ci0KLSAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjKSB7Ci0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfVU5TUEVDSUZJRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfTk9ORQotICAgICAgICAgICAgICAgICAgICB8fCBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9EUk9QX1NIQURPVykgewotICAgICAgICAgICAgICAgIC8vIHRoZXNlIGVkZ2Ugc3R5bGVzIGRvbid0IHJlcXVpcmUgYSBzZWNvbmQgcGFzcwotICAgICAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9PVVRMSU5FKSB7Ci0gICAgICAgICAgICAgICAgZHJhd0VkZ2VPdXRsaW5lKGMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBSYWlzZWQgb3IgZGVwcmVzc2VkCi0gICAgICAgICAgICAgICAgZHJhd0VkZ2VSYWlzZWRPckRlcHJlc3NlZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3RWRnZU91dGxpbmUoQ2FudmFzIGMpIHsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZXh0UGFpbnQgPSBnZXRQYWludCgpOwotCi0gICAgICAgICAgICBQYWludC5TdHlsZSBwcmV2aW91c1N0eWxlID0gdGV4dFBhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICBQYWludC5Kb2luIHByZXZpb3VzSm9pbiA9IHRleHRQYWludC5nZXRTdHJva2VKb2luKCk7Ci0gICAgICAgICAgICBmbG9hdCBwcmV2aW91c1dpZHRoID0gdGV4dFBhaW50LmdldFN0cm9rZVdpZHRoKCk7Ci0KLSAgICAgICAgICAgIHNldFRleHRDb2xvcihtRWRnZUNvbG9yKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMX0FORF9TVFJPS0UpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZUpvaW4oUGFpbnQuSm9pbi5ST1VORCk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlV2lkdGgobU91dGxpbmVXaWR0aCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgb3V0bGluZSBhbmQgYmFja2dyb3VuZCBvbmx5LgotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzLgotICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1UZXh0Q29sb3IpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKHByZXZpb3VzU3R5bGUpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZUpvaW4ocHJldmlvdXNKb2luKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VXaWR0aChwcmV2aW91c1dpZHRoKTsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKENvbG9yLlRSQU5TUEFSRU5UKTsKLSAgICAgICAgICAgIC8vIERyYXcgZm9yZWdyb3VuZCBvbmx5LgotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhtQmdDb2xvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0VkZ2VSYWlzZWRPckRlcHJlc3NlZChDYW52YXMgYykgewotICAgICAgICAgICAgVGV4dFBhaW50IHRleHRQYWludCA9IGdldFBhaW50KCk7Ci0KLSAgICAgICAgICAgIFBhaW50LlN0eWxlIHByZXZpb3VzU3R5bGUgPSB0ZXh0UGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKLQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByYWlzZWQgPSBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9SQUlTRUQ7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JVcCA9IHJhaXNlZCA/IENvbG9yLldISVRFIDogbUVkZ2VDb2xvcjsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2xvckRvd24gPSByYWlzZWQgPyBtRWRnZUNvbG9yIDogQ29sb3IuV0hJVEU7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBvZmZzZXQgPSBtU2hhZG93UmFkaXVzIC8gMmY7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgYmFja2dyb3VuZCBhbmQgdGV4dCB3aXRoIHNoYWRvdyB1cAotICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgLW9mZnNldCwgLW9mZnNldCwgY29sb3JVcCk7Ci0gICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhDb2xvci5UUkFOU1BBUkVOVCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgdGV4dCB3aXRoIHNoYWRvdyBkb3duCi0gICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCArb2Zmc2V0LCArb2Zmc2V0LCBjb2xvckRvd24pOwotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIHNldHRpbmdzCi0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUocHJldmlvdXNTdHlsZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMobUJnQ29sb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEJhY2tncm91bmRTcGFucyhpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gZ2V0VGV4dCgpOwotICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGUgc3Bhbm5hYmxlID0gKFNwYW5uYWJsZSkgdGV4dDsKLSAgICAgICAgICAgICAgICBDZWE2MDhDQ1BhcnNlci5NdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbltdIGJnU3BhbnMgPSBzcGFubmFibGUuZ2V0U3BhbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCBzcGFubmFibGUubGVuZ3RoKCksIENlYTYwOENDUGFyc2VyLk11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJnU3BhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYmdTcGFuc1tpXS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGF5b3V0IGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgQ2xvc2VkQ2FwdGlvbkxheW91dCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUk9XUyA9IENlYTYwOENDUGFyc2VyLk1BWF9ST1dTOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTQUZFX0FSRUFfUkFUSU8gPSAwLjlmOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ0NMaW5lQm94W10gbUxpbmVCb3hlcyA9IG5ldyBDQ0xpbmVCb3hbTUFYX1JPV1NdOwotCi0gICAgICAgIENDTGF5b3V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBzZXRHcmF2aXR5KEdyYXZpdHkuU1RBUlQpOwotICAgICAgICAgICAgc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0gPSBuZXcgQ0NMaW5lQm94KGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkVmlldyhtTGluZUJveGVzW2ldLCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRDYXB0aW9uU3R5bGUoY2FwdGlvblN0eWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb250U2NhbGUoZmxvYXQgZm9udFNjYWxlKSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmVzIHRoZSBmb250IHNjYWxlIGNoYW5nZXMgb2YgdGhlIHN5c3RlbSB3aWRlIENDIHByZWZlcmVuY2UuCi0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZShTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gdGV4dEJ1ZmZlcikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHRCdWZmZXJbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFRleHQodGV4dEJ1ZmZlcltpXSwgVGV4dFZpZXcuQnVmZmVyVHlwZS5TUEFOTkFCTEUpOwotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgaW50IHNhZmVXaWR0aCA9IGdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBzYWZlSGVpZ2h0ID0gZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLQotICAgICAgICAgICAgLy8gQ0VBLTYwOCBhc3N1bWVzIDQ6MyB2aWRlbwotICAgICAgICAgICAgaWYgKHNhZmVXaWR0aCAqIDMgPj0gc2FmZUhlaWdodCAqIDQpIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSBzYWZlSGVpZ2h0ICogNCAvIDM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSBzYWZlV2lkdGggKiAzIC8gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhZmVXaWR0aCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBzYWZlSGVpZ2h0ICo9IFNBRkVfQVJFQV9SQVRJTzsKLQotICAgICAgICAgICAgaW50IGxpbmVIZWlnaHQgPSBzYWZlSGVpZ2h0IC8gTUFYX1JPV1M7Ci0gICAgICAgICAgICBpbnQgbGluZUhlaWdodE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgIGludCBsaW5lV2lkdGhNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgc2FmZVdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5tZWFzdXJlKGxpbmVXaWR0aE1lYXN1cmVTcGVjLCBsaW5lSGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgICAgIC8vIHNhZmUgY2FwdGlvbiBhcmVhCi0gICAgICAgICAgICBpbnQgdmlld1BvcnRXaWR0aCA9IHIgLSBsOwotICAgICAgICAgICAgaW50IHZpZXdQb3J0SGVpZ2h0ID0gYiAtIHQ7Ci0gICAgICAgICAgICBpbnQgc2FmZVdpZHRoLCBzYWZlSGVpZ2h0OwotICAgICAgICAgICAgLy8gQ0VBLTYwOCBhc3N1bWVzIDQ6MyB2aWRlbwotICAgICAgICAgICAgaWYgKHZpZXdQb3J0V2lkdGggKiAzID49IHZpZXdQb3J0SGVpZ2h0ICogNCkgewotICAgICAgICAgICAgICAgIHNhZmVXaWR0aCA9IHZpZXdQb3J0SGVpZ2h0ICogNCAvIDM7Ci0gICAgICAgICAgICAgICAgc2FmZUhlaWdodCA9IHZpZXdQb3J0SGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSB2aWV3UG9ydFdpZHRoOwotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSB2aWV3UG9ydFdpZHRoICogMyAvIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYWZlV2lkdGggKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgc2FmZUhlaWdodCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBpbnQgbGVmdCA9ICh2aWV3UG9ydFdpZHRoIC0gc2FmZVdpZHRoKSAvIDI7Ci0gICAgICAgICAgICBpbnQgdG9wID0gKHZpZXdQb3J0SGVpZ2h0IC0gc2FmZUhlaWdodCkgLyAyOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLmxheW91dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBzYWZlSGVpZ2h0ICogaSAvIE1BWF9ST1dTLAotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIHNhZmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcCArIHNhZmVIZWlnaHQgKiAoaSArIDEpIC8gTUFYX1JPV1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM2ZDdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLS8vIE5vdGU6IFRoaXMgaXMganVzdCBjb3BpZWQgZnJvbSBhbmRyb2lkLm1lZGlhLk1lZGlhVGltZVByb3ZpZGVyLgotcHVibGljIGludGVyZmFjZSBNZWRpYVRpbWVQcm92aWRlciB7Ci0gICAgLy8gd2UgZG8gbm90IGFsbG93IG5lZ2F0aXZlIG1lZGlhIHRpbWUKLSAgICAvKioKLSAgICAgKiBQcmVzZW50YXRpb24gdGltZSB2YWx1ZSBpZiBubyB0aW1lZCBldmVudCBub3RpZmljYXRpb24gaXMgcmVxdWVzdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBOT19USU1FID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LiAgSXQKLSAgICAgKiByZWdpc3RlcnMgdGhlIGxpc3RlbmVyIHRvIGdldCBzZWVrIGFuZCBzdG9wIG5vdGlmaWNhdGlvbnMuICBJZiB0aW1lVXMgaXMKLSAgICAgKiBub3QgbmVnYXRpdmUsIGl0IGFsc28gcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciBmb3IgYSB0aW1lZCBldmVudAotICAgICAqIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBwcmVzZW50YXRpb24gdGltZSByZWFjaGVzIChiZWNvbWVzIGdyZWF0ZXIpIHRoYW4KLSAgICAgKiB0aGUgdmFsdWUgc3BlY2lmaWVkLiAgVGhpcyBoYXBwZW5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgKiBpcyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aW1lVXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGltZVVzIHByZXNlbnRhdGlvbiB0aW1lIHRvIGdldCB0aW1lZCBldmVudCBjYWxsYmFjayBhdCAob3IKLSAgICAgKiAgICAgICAgICAgICAgIHtAbGluayAjTk9fVElNRX0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QXQobG9uZyB0aW1lVXMsIE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0Ci0gICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGhlIG1lZGlhCi0gICAgICogaXMgc3RvcHBlZCwgdGhlIGxpc3RlbmVyIHdpbGwgaW1tZWRpYXRlbHkgcmVjZWl2ZSBhIHN0b3Agbm90aWZpY2F0aW9uLgotICAgICAqIE90aGVyd2lzZSwgaXQgd2lsbCByZWNlaXZlIGEgdGltZWQgZXZlbnQgbm90aWZpY2F0b24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2NoZWR1bGVVcGRhdGUoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhbmNlbE5vdGlmaWNhdGlvbnMoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcHJlc2VudGF0aW9uIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlY2lzZSAgIFdoZXRoZXIgZ2V0dGluZyBhIHByZWNpc2UgdGltZSBpcyBpbXBvcnRhbnQuIFRoaXMgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgIG1vcmUgY29zdGx5LgotICAgICAqIEBwYXJhbSBtb25vdG9uaWMgV2hldGhlciByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBtb25vdG9uaWM6IHRoYXQgaXMsCi0gICAgICogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxhc3QgcmV0dXJuZWQgdGltZS4gIERvbid0Ci0gICAgICogICAgICAgICAgICAgICAgICBhbHdheXMgc2V0IHRoaXMgdG8gdHJ1ZS4gIEUuZy4gdGhpcyBoYXMgdW5kZXNpcmVkCi0gICAgICogICAgICAgICAgICAgICAgICBjb25zZXF1ZW5jZXMgaWYgdGhlIG1lZGlhIGlzIHNlZWtlZCBiZXR3ZWVuIGNhbGxzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBtZWRpYSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50VGltZVVzKGJvb2xlYW4gcHJlY2lzZSwgYm9vbGVhbiBtb25vdG9uaWMpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT25NZWRpYVRpbWVMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVnaXN0ZXJlZCB0aW1lIHdhcyByZWFjaGVkIG5hdHVyYWxseS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHRpbWUgY2hhbmdlZCBkdWUgdG8gc2Vla2luZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBsYXliYWNrIHN0b3BwZWQuICBUaGlzIGlzIG5vdCBjYWxsZWQgb24gcGF1c2UsIG9ubHkKLSAgICAgICAgICogb24gZnVsbCBzdG9wLCBhdCB3aGljaCBwb2ludCB0aGVyZSBpcyBubyBmdXJ0aGVyIGN1cnJlbnQgbWVkaWEgdGltZS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25TdG9wKCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNTVkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQ7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZUNvbnRyb2xsZXIgc2luY2UgUAotLyoqCi0gKiBUaGUgc3VidGl0bGUgY29udHJvbGxlciBwcm92aWRlcyB0aGUgYXJjaGl0ZWN0dXJlIHRvIGRpc3BsYXkgc3VidGl0bGVzIGZvciBhCi0gKiBtZWRpYSBzb3VyY2UuICBJdCBhbGxvd3Mgc3BlY2lmeWluZyB3aGljaCB0cmFja3MgdG8gZGlzcGxheSwgb24gd2hpY2ggYW5jaG9yCi0gKiB0byBkaXNwbGF5IHRoZW0sIGFuZCBhbHNvIGFsbG93cyBhZGRpbmcgZXh0ZXJuYWwsIG91dC1vZi1iYW5kIHN1YnRpdGxlIHRyYWNrcy4KLSAqLwotcHVibGljIGNsYXNzIFN1YnRpdGxlQ29udHJvbGxlciB7Ci0gICAgcHJpdmF0ZSBNZWRpYVRpbWVQcm92aWRlciBtVGltZVByb3ZpZGVyOwotICAgIHByaXZhdGUgVmVjdG9yPFJlbmRlcmVyPiBtUmVuZGVyZXJzOwotICAgIHByaXZhdGUgVmVjdG9yPFN1YnRpdGxlVHJhY2s+IG1UcmFja3M7Ci0gICAgcHJpdmF0ZSBTdWJ0aXRsZVRyYWNrIG1TZWxlY3RlZFRyYWNrOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd2luZzsKLSAgICBwcml2YXRlIENhcHRpb25pbmdNYW5hZ2VyIG1DYXB0aW9uaW5nTWFuYWdlcjsKLSAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TSE9XID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9ISURFID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TRUxFQ1RfVFJBQ0sgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlci5DYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgSGFuZGxlci5DYWxsYmFjaygpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9TSE9XOgotICAgICAgICAgICAgICAgIGRvU2hvdygpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX0hJREU6Ci0gICAgICAgICAgICAgICAgZG9IaWRlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX1RSQUNLOgotICAgICAgICAgICAgICAgIGRvU2VsZWN0VHJhY2soKFN1YnRpdGxlVHJhY2spbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0s6Ci0gICAgICAgICAgICAgICAgZG9TZWxlY3REZWZhdWx0VHJhY2soKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIgPQotICAgICAgICBuZXcgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVuYWJsZWRDaGFuZ2VkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIHNlbGVjdERlZmF1bHRUcmFjaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYWxlQ2hhbmdlZChMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVDb250cm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdWJ0aXRsZSBjb250cm9sbGVyIGZvciBhIG1lZGlhIHBsYXliYWNrIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLSAgICAgKiB0aGUgTWVkaWFUaW1lUHJvdmlkZXIgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWVQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIsCi0gICAgICAgICAgICBMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOwotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQotICAgICAgICBtUmVuZGVyZXJzID0gbmV3IFZlY3RvcjxSZW5kZXJlcj4oKTsKLSAgICAgICAgbVNob3dpbmcgPSBmYWxzZTsKLSAgICAgICAgbVRyYWNrcyA9IG5ldyBWZWN0b3I8U3VidGl0bGVUcmFjaz4oKTsKLSAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyID0KLSAgICAgICAgICAgIChDYXB0aW9uaW5nTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQVBUSU9OSU5HX1NFUlZJQ0UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYXZhaWxhYmxlIHN1YnRpdGxlIHRyYWNrcyBmb3IgdGhpcyBtZWRpYS4gVGhlc2UgaW5jbHVkZQotICAgICAqIHRoZSB0cmFja3MgZm91bmQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSBhcyB3ZWxsIGFzIGFueSB0cmFja3MgYWRkZWQKLSAgICAgKiBtYW51YWxseSB2aWEge0BsaW5rICNhZGRUcmFja30uCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2tbXSBnZXRUcmFja3MoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICBTdWJ0aXRsZVRyYWNrW10gdHJhY2tzID0gbmV3IFN1YnRpdGxlVHJhY2tbbVRyYWNrcy5zaXplKCldOwotICAgICAgICAgICAgbVRyYWNrcy50b0FycmF5KHRyYWNrcyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1YnRpdGxlIHRyYWNrCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgZ2V0U2VsZWN0ZWRUcmFjaygpIHsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IGdldFJlbmRlcmluZ1dpZGdldCgpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjay5nZXRSZW5kZXJpbmdXaWRnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIGEgc3VidGl0bGUgdHJhY2suICBBcyBhIHJlc3VsdCwgdGhpcyB0cmFjayB3aWxsIHJlY2VpdmUKLSAgICAgKiBpbi1iYW5kIGRhdGEgZnJvbSB0aGUge0BsaW5rIE1lZGlhUGxheWVyfS4gIEhvd2V2ZXIsIHRoaXMgZG9lcwotICAgICAqIG5vdCBjaGFuZ2UgdGhlIHN1YnRpdGxlIHZpc2liaWxpdHkuCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqCi0gICAgICogQHBhcmFtIHRyYWNrIFRoZSBzdWJ0aXRsZSB0cmFjayB0byBzZWxlY3QuICBUaGlzIG11c3QgYmUgb25lIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICB0cmFja3MgaW4ge0BsaW5rICNnZXRUcmFja3N9LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhY2sgd2FzIHN1Y2Nlc3NmdWxseSBzZWxlY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RUcmFjayhTdWJ0aXRsZVRyYWNrIHRyYWNrKSB7Ci0gICAgICAgIGlmICh0cmFjayAhPSBudWxsICYmICFtVHJhY2tzLmNvbnRhaW5zKHRyYWNrKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfVFJBQ0ssIHRyYWNrKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdFRyYWNrKFN1YnRpdGxlVHJhY2sgdHJhY2spIHsKLSAgICAgICAgbVRyYWNrSXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSB0cmFjaykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZWxlY3RlZFRyYWNrID0gdHJhY2s7Ci0gICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQoZ2V0UmVuZGVyaW5nV2lkZ2V0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihtVGltZVByb3ZpZGVyKTsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm9uU3VidGl0bGVUcmFja1NlbGVjdGVkKHRyYWNrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3VidGl0bGUgdHJhY2sgYmFzZWQgb24gc3lzdGVtIHByZWZlcmVuY2VzLCBvciBudWxsLAotICAgICAqIGlmIG5vIHN1Y2ggdHJhY2sgZXhpc3RzIGluIHRoaXMgbWFuYWdlci4KLSAgICAgKgotICAgICAqIFN1cHBvcnRzIEhMUy1mbGFnczogQVVUT1NFTEVDVCwgRk9SQ0VEICYgREVGQVVMVC4KLSAgICAgKgotICAgICAqIDEuIElmIGNhcHRpb25pbmcgaXMgZGlzYWJsZWQsIG9ubHkgY29uc2lkZXIgRk9SQ0VEIHRyYWNrcy4gT3RoZXJ3aXNlLAotICAgICAqIGNvbnNpZGVyIGFsbCB0cmFja3MsIGJ1dCBwcmVmZXIgbm9uLUZPUkNFRCBvbmVzLgotICAgICAqIDIuIElmIHVzZXIgc2VsZWN0ZWQgIkRlZmF1bHQiIGNhcHRpb24gbGFuZ3VhZ2U6Ci0gICAgICogICBhLiBJZiB0aGVyZSBpcyBhIGNvbnNpZGVyZWQgdHJhY2sgd2l0aCBERUZBVUxUPXllcywgcmV0dXJucyB0aGF0IHRyYWNrCi0gICAgICogICAgICAoZmF2b3IgdGhlIGZpcnN0IG9uZSBpbiB0aGUgY3VycmVudCBsYW5ndWFnZSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuCi0gICAgICogICAgICBvbmUgZGVmYXVsdCB0cmFja3MsIG9yIHRoZSBmaXJzdCBpbiBnZW5lcmFsIGlmIG5vbmUgb2YgdGhlbSBhcmUgaW4KLSAgICAgKiAgICAgIHRoZSBjdXJyZW50IGxhbmd1YWdlKS4KLSAgICAgKiAgIGIuIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIEFVVE9TRUxFQ1Q9eWVzIGluIHRoZSBjdXJyZW50Ci0gICAgICogICAgICBsYW5ndWFnZSwgcmV0dXJuIHRoYXQgb25lLgotICAgICAqICAgYy4gSWYgdGhlcmUgYXJlIG5vIGRlZmF1bHQgdHJhY2tzLCBhbmQgbm8gYXV0b3NlbGVjdGFibGUgdHJhY2tzIGluIHRoZQotICAgICAqICAgICAgY3VycmVudCBsYW5ndWFnZSwgcmV0dXJuIG51bGwuCi0gICAgICogMy4gSWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIHRoZSBjYXB0aW9uIGxhbmd1YWdlLCBzZWxlY3QgdGhhdCBvbmUuICBQcmVmZXIKLSAgICAgKiB0aGUgb25lIHdpdGggQVVUT1NFTEVDVD1uby4KLSAgICAgKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UgZmxhZ3MgYXJlIERFRkFVTFQ9bm8sIEFVVE9TRUxFQ1Q9eWVzCi0gICAgICogYW5kIEZPUkNFRD1uby4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBnZXREZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIFN1YnRpdGxlVHJhY2sgYmVzdFRyYWNrID0gbnVsbDsKLSAgICAgICAgaW50IGJlc3RTY29yZSA9IC0xOwotCi0gICAgICAgIExvY2FsZSBzZWxlY3RlZExvY2FsZSA9IG1DYXB0aW9uaW5nTWFuYWdlci5nZXRMb2NhbGUoKTsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IHNlbGVjdGVkTG9jYWxlOwotICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzZWxlY3RGb3JjZWQgPSAhbUNhcHRpb25pbmdNYW5hZ2VyLmlzRW5hYmxlZCgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICBmb3IgKFN1YnRpdGxlVHJhY2sgdHJhY2s6IG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSB0cmFjay5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9MQU5HVUFHRSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZWQgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFLCAwKSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b3NlbGVjdCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULCAxKSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNfZGVmYXVsdCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULCAwKSAhPSAwOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBsYW5ndWFnZU1hdGNoZXMgPQotICAgICAgICAgICAgICAgICAgICAobG9jYWxlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKCIiKSB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlKSB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMobGFuZ3VhZ2UpKTsKLSAgICAgICAgICAgICAgICAvLyBpc19kZWZhdWx0IGlzIG1lYW5pbmdsZXNzIHVubGVzcyBjYXB0aW9uIGxhbmd1YWdlIGlzICdkZWZhdWx0JwotICAgICAgICAgICAgICAgIGludCBzY29yZSA9IChmb3JjZWQgPyAwIDogOCkgKwotICAgICAgICAgICAgICAgICAgICAoKChzZWxlY3RlZExvY2FsZSA9PSBudWxsKSAmJiBpc19kZWZhdWx0KSA/IDQgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgIChhdXRvc2VsZWN0ID8gMCA6IDIpICsgKGxhbmd1YWdlTWF0Y2hlcyA/IDEgOiAwKTsKLQotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RGb3JjZWQgJiYgIWZvcmNlZCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSB0cmVhdCBudWxsIGxvY2FsZS9sYW5ndWFnZSBhcyBtYXRjaGluZyBhbnkgbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICBpZiAoKHNlbGVjdGVkTG9jYWxlID09IG51bGwgJiYgaXNfZGVmYXVsdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGxhbmd1YWdlTWF0Y2hlcyAmJgotICAgICAgICAgICAgICAgICAgICAgKGF1dG9zZWxlY3QgfHwgZm9yY2VkIHx8IHNlbGVjdGVkTG9jYWxlICE9IG51bGwpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFRyYWNrID0gdHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJlc3RUcmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVRyYWNrSXNFeHBsaWNpdCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLQotICAgIC8qKiBzaG91bGQgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgaWYgKG1UcmFja0lzRXhwbGljaXQpIHsKLSAgICAgICAgICAgIC8vIElmIHRyYWNrIHNlbGVjdGlvbiBpcyBleHBsaWNpdCwgYnV0IHZpc2liaWxpdHkKLSAgICAgICAgICAgIC8vIGlzIG5vdCwgaXQgZmFsbHMgYmFjayB0byB0aGUgY2FwdGlvbmluZyBzZXR0aW5nCi0gICAgICAgICAgICBpZiAoIW1WaXNpYmlsaXR5SXNFeHBsaWNpdCkgewotICAgICAgICAgICAgICAgIGlmIChtQ2FwdGlvbmluZ01hbmFnZXIuaXNFbmFibGVkKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmdldEZvcm1hdCgpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgMCkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvdygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVNlbGVjdGVkVHJhY2suZ2V0VHJhY2tUeXBlKCkgPT0gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGlkZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGNhbiBoYXZlIGEgZGVmYXVsdCAoZm9yY2VkKSB0cmFjayBldmVuIGlmIGNhcHRpb25pbmcKLSAgICAgICAgLy8gaXMgbm90IGVuYWJsZWQuICBUaGlzIGlzIGhhbmRsZWQgYnkgZ2V0RGVmYXVsdFRyYWNrKCkuCi0gICAgICAgIC8vIFNob3cgdGhpcyB0cmFjayB1bmxlc3Mgc3VidGl0bGVzIHdlcmUgZXhwbGljaXRseSBoaWRkZW4uCi0gICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBnZXREZWZhdWx0VHJhY2soKTsKLSAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlbGVjdFRyYWNrKHRyYWNrKTsKLSAgICAgICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICghbVZpc2liaWxpdHlJc0V4cGxpY2l0KSB7Ci0gICAgICAgICAgICAgICAgc2hvdygpOwotICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIG11c3QgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOwotICAgICAgICBoaWRlKCk7Ci0gICAgICAgIHNlbGVjdFRyYWNrKG51bGwpOwotICAgICAgICBtVHJhY2tzLmNsZWFyKCk7Ci0gICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldywgZXh0ZXJuYWwgc3VidGl0bGUgdHJhY2sgdG8gdGhlIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGxpbmsgU3VidGl0bGVUcmFja30gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgYWRkVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICBmb3IgKFJlbmRlcmVyIHJlbmRlcmVyOiBtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnN1cHBvcnRzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHJlbmRlcmVyLmNyZWF0ZVRyYWNrKGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFjazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSBzZWxlY3RlZCAob3IgZGVmYXVsdCkgc3VidGl0bGUgdHJhY2suCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0hPVykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1Nob3coKSB7Ci0gICAgICAgIG1TaG93aW5nID0gdHJ1ZTsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhpZGUgdGhlIHNlbGVjdGVkIChvciBkZWZhdWx0KSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgKgotICAgICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgKFVJKSB0aHJlYWQuIHtAc2VlICNBbmNob3IuZ2V0U3VidGl0bGVMb29wZXJ9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGlkZSgpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9ISURFKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvSGlkZSgpIHsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKLSAgICAgICAgfQotICAgICAgICBtU2hvd2luZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3Igc3VwcG9ydGluZyBhIHNpbmdsZSBvciBtdWx0aXBsZSBzdWJ0aXRsZSB0eXBlcyBpbiB7QGxpbmsKLSAgICAgKiBNZWRpYVBsYXllcn0uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBSZW5kZXJlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IHdoZW4gYSBuZXcKLSAgICAgICAgICogc3VidGl0bGUgdHJhY2sgaXMgZGV0ZWN0ZWQsIHRvIHNlZSBpZiBpdCBzaG91bGQgdXNlIHRoaXMgb2JqZWN0IHRvCi0gICAgICAgICAqIHBhcnNlIGFuZCBkaXNwbGF5IHRoaXMgc3VidGl0bGUgdHJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdGhhdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3QKLSAgICAgICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHJhY2sgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGlzCi0gICAgICAgICAqIHJlbmRlcmVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IGZvciBlYWNoCi0gICAgICAgICAqIHN1YnRpdGxlIHRyYWNrIHRoYXQgd2FzIGRldGVjdGVkIGFuZCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBvYmplY3QgdG8KLSAgICAgICAgICogY3JlYXRlIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdC4gIFRoaXMgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZAotICAgICAgICAgKiBmb3IgZWFjaCB0cmFjayB0aGF0IHdhcyBmb3VuZC4gIElmIHRoZSB0cmFjayBpcyBzZWxlY3RlZCBmb3IgZGlzcGxheSwKLSAgICAgICAgICogdGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIGFuZCBkaXNwbGF5IHRoZSB0cmFjayBkYXRhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB0byBwYXJzZQotICAgICAgICAgKiBhbmQgcmVuZGVyIHRoZSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0IGluIHtAbGluayBNZWRpYVBsYXllcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXIgYSB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyLlJlbmRlcmVyfSBvYmplY3QgdGhhdCBhZGRzCi0gICAgICogICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVuZGVyZXIoUmVuZGVyZXIgcmVuZGVyZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGlmICghbVJlbmRlcmVycy5jb250YWlucyhyZW5kZXJlcikpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCBhZGRlZCByZW5kZXJlcnMgb3ZlcnJpZGUgZXhpc3Rpbmcgb25lcyAodG8gYWxsb3cgcmVwbGFjaW5nPykKLSAgICAgICAgICAgICAgICBtUmVuZGVyZXJzLmFkZChyZW5kZXJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kZXJlckZvcihNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGZvciAoUmVuZGVyZXIgcmVuZGVyZXI6IG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuc3VwcG9ydHMoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJ0aXRsZSBhbmNob3IsIGFuIG9iamVjdCB0aGF0IGlzIGFibGUgdG8gZGlzcGxheSBhIHN1YnRpdGxlIHJlbmRlcmVyLAotICAgICAqIGUuZy4gYSBWaWRlb1ZpZXcuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBBbmNob3IgewotICAgICAgICAvKioKLSAgICAgICAgICogQW5jaG9yIHNob3VsZCB1c2UgdGhlIHN1cHBsaWVkIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQsIG9yCi0gICAgICAgICAqIG5vbmUgaWYgaXQgaXMgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlV2lkZ2V0KFJlbmRlcmluZ1dpZGdldCBzdWJ0aXRsZVdpZGdldCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuY2hvcnMgcHJvdmlkZSB0aGUgbG9vcGVyIG9uIHdoaWNoIGFsbCB0cmFjayB2aXNpYmlsaXR5IGNoYW5nZXMKLSAgICAgICAgICogKHRyYWNrLnNob3cvaGlkZSwgc2V0U3VidGl0bGVXaWRnZXQpIHdpbGwgdGFrZSBwbGFjZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFuY2hvciBtQW5jaG9yOwotCi0gICAgLyoqCi0gICAgICogIGNhbGxlZCBmcm9tIGFuY2hvcidzIGxvb3BlciAoaWYgYW55LCBib3RoIHdoZW4gdW5zZXR0aW5nIGFuZAotICAgICAqICBzZXR0aW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvcihBbmNob3IgYW5jaG9yKSB7Ci0gICAgICAgIGlmIChtQW5jaG9yID09IGFuY2hvcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFuY2hvciA9IGFuY2hvcjsKLSAgICAgICAgbUhhbmRsZXIgPSBudWxsOwotICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1BbmNob3IuZ2V0U3VidGl0bGVMb29wZXIoKSwgbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KGdldFJlbmRlcmluZ1dpZGdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0FuY2hvckxvb3BlcigpIHsKLSAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7Ci0gICAgICAgIGFzc2VydCBMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKQotICAgICAgICAgICAgICAgIDogIk11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIGxvb3BlciI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NPbkFuY2hvcihNZXNzYWdlIG0pIHsKLSAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7Ci0gICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKSkgewotICAgICAgICAgICAgbUhhbmRsZXIuZGlzcGF0Y2hNZXNzYWdlKG0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgc3VidGl0bGUgdHJhY2sgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0cmFjayBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjayBvciBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlVHJhY2tTZWxlY3RlZChTdWJ0aXRsZVRyYWNrIHRyYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3RlbmVyIG1MaXN0ZW5lcjsKLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTA2NGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuVHJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU3VidGl0bGVEYXRhOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb25nU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuU3VidGl0bGVUcmFjayBzaW5jZSBQCi0vKioKLSAqIEEgc3VidGl0bGUgdHJhY2sgYWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIGFuZCBkaXNwbGF5aW5nCi0gKiBhbiBpbnN0YW5jZSBvZiBhIHBhcnRpY3VsYXIgdHlwZSBvZiBzdWJ0aXRsZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN1YnRpdGxlVHJhY2sgaW1wbGVtZW50cyBNZWRpYVRpbWVQcm92aWRlci5Pbk1lZGlhVGltZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN1YnRpdGxlVHJhY2siOwotICAgIHByaXZhdGUgbG9uZyBtTGFzdFVwZGF0ZVRpbWVNczsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RUaW1lTXM7Ci0KLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1SdW5uYWJsZTsKLQotICAgIGZpbmFsIHByaXZhdGUgTG9uZ1NwYXJzZUFycmF5PFJ1bj4gbVJ1bnNCeUVuZFRpbWUgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFJ1bj4oKTsKLSAgICBmaW5hbCBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxSdW4+IG1SdW5zQnlJRCA9IG5ldyBMb25nU3BhcnNlQXJyYXk8UnVuPigpOwotCi0gICAgcHJpdmF0ZSBDdWVMaXN0IG1DdWVzOwotICAgIGZpbmFsIHByaXZhdGUgVmVjdG9yPEN1ZT4gbUFjdGl2ZUN1ZXMgPSBuZXcgVmVjdG9yPEN1ZT4oKTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtVmlzaWJsZTsKLQotICAgIHB1YmxpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIE1lZGlhRm9ybWF0IG1Gb3JtYXQ7Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgbUN1ZXMgPSBuZXcgQ3VlTGlzdCgpOwotICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgbUxhc3RUaW1lTXMgPSAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTWVkaWFGb3JtYXQgZ2V0Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gbUZvcm1hdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSAtMTsKLQotICAgIHB1YmxpYyB2b2lkIG9uRGF0YShTdWJ0aXRsZURhdGEgZGF0YSkgewotICAgICAgICBsb25nIHJ1bklEID0gZGF0YS5nZXRTdGFydFRpbWVVcygpICsgMTsKLSAgICAgICAgb25EYXRhKGRhdGEuZ2V0RGF0YSgpLCB0cnVlIC8qIGVvcyAqLywgcnVuSUQpOwotICAgICAgICBzZXRSdW5EaXNjYXJkVGltZU1zKAotICAgICAgICAgICAgICAgIHJ1bklELAotICAgICAgICAgICAgICAgIChkYXRhLmdldFN0YXJ0VGltZVVzKCkgKyBkYXRhLmdldER1cmF0aW9uVXMoKSkgLyAxMDAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGVyZSBpcyBpbnB1dCBkYXRhIGZvciB0aGUgc3VidGl0bGUgdHJhY2suICBUaGUKLSAgICAgKiBjb21wbGV0ZSBzdWJ0aXRsZSBmb3IgYSB0cmFjayBjYW4gaW5jbHVkZSBtdWx0aXBsZSB3aG9sZSB1bml0cwotICAgICAqIChydW5zKS4gIEVhY2ggb2YgdGhlc2UgdW5pdHMgY2FuIGhhdmUgbXVsdGlwbGUgc2VjdGlvbnMuICBUaGUKLSAgICAgKiBjb250ZW50cyBvZiBhIHJ1biBhcmUgc3VibWl0dGVkIGluIHNlcXVlbnRpYWwgb3JkZXIsIHdpdGggZW9zCi0gICAgICogaW5kaWNhdGluZyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBydW4uICBDYWxscyBmcm9tIGRpZmZlcmVudAotICAgICAqIHJ1bnMgbXVzdCBub3QgYmUgaW50ZXJtaXhlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHN1YnRpdGxlIGRhdGEgYnl0ZSBidWZmZXIKLSAgICAgKiBAcGFyYW0gZW9zIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBydW4uCi0gICAgICogQHBhcmFtIHJ1bklEIG1vc3RseS11bmlxdWUgSUQgZm9yIHRoaXMgcnVuIG9mIGRhdGEuICBTdWJ0aXRsZSBjdWVzCi0gICAgICogICAgICAgICAgICAgIHdpdGggcnVuSUQgb2YgMCBhcmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IGFmdGVyCi0gICAgICogICAgICAgICAgICAgIGRpc3BsYXkuICBDdWVzIHdpdGggcnVuSUQgb2YgfjAgYXJlIGRpc2NhcmRlZAotICAgICAqICAgICAgICAgICAgICBvbmx5IGF0IHRoZSBkZWxldGlvbiBvZiB0aGUgdHJhY2sgb2JqZWN0LiAgQ3VlcwotICAgICAqICAgICAgICAgICAgICB3aXRoIG90aGVyIHJ1bklELXMgYXJlIGRpc2NhcmRlZCBhdCB0aGUgZW5kIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICBydW4sIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdGltZXN0YW1wIG9mCi0gICAgICogICAgICAgICAgICAgIGFueSBvZiBpdHMgY3VlcyAod2l0aCB0aGlzIHJ1bklEKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkRhdGEoYnl0ZVtdIGRhdGEsIGJvb2xlYW4gZW9zLCBsb25nIHJ1bklEKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGFkZGluZyB0aGUgc3VidGl0bGUgcmVuZGVyaW5nIHdpZGdldCB0byB0aGUgdmlldyBoaWVyYXJjaHksCi0gICAgICogYXMgd2VsbCBhcyB3aGVuIHNob3dpbmcgb3IgaGlkaW5nIHRoZSBzdWJ0aXRsZSB0cmFjaywgb3Igd2hlbiB0aGUgdmlkZW8KLSAgICAgKiBzdXJmYWNlIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgd2lkZ2V0IHRoYXQgcmVuZGVycyB0aGlzIHN1YnRpdGxlIHRyYWNrLiBGb3IgbW9zdCByZW5kZXJlcnMKLSAgICAgKiAgICAgICAgIHRoZXJlIHNob3VsZCBiZSBhIHNpbmdsZSBzaGFyZWQgaW5zdGFuY2UgdGhhdCBpcyB1c2VkIGZvciBhbGwKLSAgICAgKiAgICAgICAgIHRyYWNrcyBzdXBwb3J0ZWQgYnkgdGhhdCByZW5kZXJlciwgYXMgYXQgbW9zdCBvbmUgc3VidGl0bGUgdHJhY2sKLSAgICAgKiAgICAgICAgIGlzIHZpc2libGUgYXQgb25lIHRpbWUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3RpdmUgY3VlcyBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIHN1YnRpdGxlCi0gICAgICogdmlldyBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVWaWV3KFZlY3RvcjxDdWU+IGFjdGl2ZUN1ZXMpOwotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZUFjdGl2ZUN1ZXMoYm9vbGVhbiByZWJ1aWxkLCBsb25nIHRpbWVNcykgewotICAgICAgICAvLyBvdXQtb2Ytb3JkZXIgdGltZXMgbWVhbiBzZWVraW5nIG9yIG5ldyBhY3RpdmUgY3VlcyBiZWluZyBhZGRlZAotICAgICAgICAvLyAoZHVyaW5nIHRoZWlyIG93biB0aW1lc3BhbikKLSAgICAgICAgaWYgKHJlYnVpbGQgfHwgbUxhc3RVcGRhdGVUaW1lTXMgPiB0aW1lTXMpIHsKLSAgICAgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IGl0ID0KLSAgICAgICAgICAgICAgICBtQ3Vlcy5lbnRyaWVzQmV0d2VlbihtTGFzdFVwZGF0ZVRpbWVNcywgdGltZU1zKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgUGFpcjxMb25nLCBDdWU+IGV2ZW50ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgQ3VlIGN1ZSA9IGV2ZW50LnNlY29uZDsKLQotICAgICAgICAgICAgaWYgKGN1ZS5tRW5kVGltZU1zID09IGV2ZW50LmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHBhc3QgY3VlcwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUmVtb3ZpbmcgIiArIGN1ZSk7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZUN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZS5tUnVuSUQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1ZS5tU3RhcnRUaW1lTXMgPT0gZXZlbnQuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGN1ZXMKLSAgICAgICAgICAgICAgICAvLyBUUklDS1k6IHRoaXMgd2lsbCBoYXBwZW4gaW4gc3RhcnQgb3JkZXIKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyAiICsgY3VlKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdWUub25UaW1lKHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3RpdmVDdWVzLmFkZChjdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gY3VlIGlzIG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgY3VlLm9uVGltZSh0aW1lTXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29tcGxldGUgYW55IHJ1bnMgKi8KLSAgICAgICAgd2hpbGUgKG1SdW5zQnlFbmRUaW1lLnNpemUoKSA+IDAgJiYKLSAgICAgICAgICAgICAgIG1SdW5zQnlFbmRUaW1lLmtleUF0KDApIDw9IHRpbWVNcykgewotICAgICAgICAgICAgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KDApOyAvLyByZW1vdmVzIGVsZW1lbnQKLSAgICAgICAgfQotICAgICAgICBtTGFzdFVwZGF0ZVRpbWVNcyA9IHRpbWVNczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KGludCBpeCkgewotICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUVuZFRpbWUudmFsdWVBdChpeCk7Ci0gICAgICAgIHdoaWxlIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgQ3VlIGN1ZSA9IHJ1bi5tRmlyc3RDdWU7Ci0gICAgICAgICAgICB3aGlsZSAoY3VlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUoY3VlKTsKLSAgICAgICAgICAgICAgICBDdWUgbmV4dEN1ZSA9IGN1ZS5tTmV4dEluUnVuOwotICAgICAgICAgICAgICAgIGN1ZS5tTmV4dEluUnVuID0gbnVsbDsKLSAgICAgICAgICAgICAgICBjdWUgPSBuZXh0Q3VlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJ1bnNCeUlELnJlbW92ZShydW4ubVJ1bklEKTsKLSAgICAgICAgICAgIFJ1biBuZXh0UnVuID0gcnVuLm1OZXh0UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgICAgICBydW4ubVByZXZSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICBydW4ubU5leHRSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICBydW4gPSBuZXh0UnVuOwotICAgICAgICB9Ci0gICAgICAgIG1SdW5zQnlFbmRUaW1lLnJlbW92ZUF0KGl4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKiByZW1vdmUgYWxsIGN1ZXMgKHVudGFuZ2xlIGFsbCBjcm9zcy1saW5rcykgKi8KLSAgICAgICAgaW50IHNpemUgPSBtUnVuc0J5RW5kVGltZS5zaXplKCk7Ci0gICAgICAgIGZvcihpbnQgaXggPSBzaXplIC0gMTsgaXggPj0gMDsgaXgtLSkgewotICAgICAgICAgICAgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KGl4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB0YWtlVGltZShsb25nIHRpbWVNcykgewotICAgICAgICBtTGFzdFRpbWVNcyA9IHRpbWVNczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY2xlYXJBY3RpdmVDdWVzKCkgewotICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkNsZWFyaW5nICIgKyBtQWN0aXZlQ3Vlcy5zaXplKCkgKyAiIGFjdGl2ZSBjdWVzIik7Ci0gICAgICAgIG1BY3RpdmVDdWVzLmNsZWFyKCk7Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZU1zID0gLTE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NoZWR1bGVUaW1lZEV2ZW50cygpIHsKLSAgICAgICAgLyogZ2V0IHRpbWVzIGZvciB0aGUgbmV4dCBldmVudCAqLwotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA9IG1DdWVzLm5leHRUaW1lQWZ0ZXIobUxhc3RUaW1lTXMpOwotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzY2hlZCBAIiArIG1OZXh0U2NoZWR1bGVkVGltZU1zICsgIiBhZnRlciAiICsgbUxhc3RUaW1lTXMpOwotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5ub3RpZnlBdCgKLSAgICAgICAgICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPj0gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAobU5leHRTY2hlZHVsZWRUaW1lTXMgKiAxMDAwKSA6IE1lZGlhVGltZVByb3ZpZGVyLk5PX1RJTUUsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25UaW1lZEV2ZW50ICIgKyB0aW1lVXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZU1zID0gdGltZVVzIC8gMTAwMDsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXMoZmFsc2UsIHRpbWVNcyk7Ci0gICAgICAgICAgICB0YWtlVGltZSh0aW1lTXMpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25TZWVrICIgKyB0aW1lVXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZU1zID0gdGltZVVzIC8gMTAwMDsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXModHJ1ZSwgdGltZU1zKTsKLSAgICAgICAgICAgIHRha2VUaW1lKHRpbWVNcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgIHNjaGVkdWxlVGltZWRFdmVudHMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblN0b3AiKTsKLSAgICAgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICAgICAgbUxhc3RUaW1lTXMgPSAtMTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSAtMTsKLSAgICAgICAgbVRpbWVQcm92aWRlci5ub3RpZnlBdChNZWRpYVRpbWVQcm92aWRlci5OT19USU1FLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWVkaWFUaW1lUHJvdmlkZXIgbVRpbWVQcm92aWRlcjsKLQotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIGlmIChtVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVZpc2libGUgPSB0cnVlOwotICAgICAgICBSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0ID0gZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChyZW5kZXJpbmdXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGVyaW5nV2lkZ2V0LnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5zY2hlZHVsZVVwZGF0ZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgIGlmICghbVZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuY2FuY2VsTm90aWZpY2F0aW9ucyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0ID0gZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChyZW5kZXJpbmdXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGVyaW5nV2lkZ2V0LnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIG1WaXNpYmxlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGFkZEN1ZShDdWUgY3VlKSB7Ci0gICAgICAgIG1DdWVzLmFkZChjdWUpOwotCi0gICAgICAgIGlmIChjdWUubVJ1bklEICE9IDApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KGN1ZS5tUnVuSUQpOwotICAgICAgICAgICAgaWYgKHJ1biA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVuID0gbmV3IFJ1bigpOwotICAgICAgICAgICAgICAgIG1SdW5zQnlJRC5wdXQoY3VlLm1SdW5JRCwgcnVuKTsKLSAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IGN1ZS5tRW5kVGltZU1zOwotICAgICAgICAgICAgfSBlbHNlIGlmIChydW4ubUVuZFRpbWVNcyA8IGN1ZS5tRW5kVGltZU1zKSB7Ci0gICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSBjdWUubUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbGluay11cCBjdWVzIGluIHRoZSBzYW1lIHJ1bgotICAgICAgICAgICAgY3VlLm1OZXh0SW5SdW4gPSBydW4ubUZpcnN0Q3VlOwotICAgICAgICAgICAgcnVuLm1GaXJzdEN1ZSA9IGN1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIGEgY3VlIGlzIGFkZGVkIHRoYXQgc2hvdWxkIGJlIHZpc2libGUsIG5lZWQgdG8gcmVmcmVzaCB2aWV3Ci0gICAgICAgIGxvbmcgbm93TXMgPSAtMTsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub3dNcyA9IG1UaW1lUHJvdmlkZXIuZ2V0Q3VycmVudFRpbWVVcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHByZWNpc2UgKi8sIHRydWUgLyogbW9ub3RvbmljICovKSAvIDEwMDA7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhcyBpdCB3ZSBhcmUgbm90IHBsYXlpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibVZpc2libGU9IiArIG1WaXNpYmxlICsgIiwgIiArCi0gICAgICAgICAgICAgICAgY3VlLm1TdGFydFRpbWVNcyArICIgPD0gIiArIG5vd01zICsgIiwgIiArCi0gICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgKyAiID49ICIgKyBtTGFzdFRpbWVNcyk7Ci0KLSAgICAgICAgaWYgKG1WaXNpYmxlICYmCi0gICAgICAgICAgICAgICAgY3VlLm1TdGFydFRpbWVNcyA8PSBub3dNcyAmJgotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IHRydXN0IG5vd01zLCBzbyBjaGVjayBhbnkgY3VlIHNpbmNlIGxhc3QgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyA+PSBtTGFzdFRpbWVNcykgewotICAgICAgICAgICAgaWYgKG1SdW5uYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gdGhpczsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgdGhlbk1zID0gbm93TXM7Ci0gICAgICAgICAgICBtUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBldmVuIHdpdGggc3luY2hyb25pemVkLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGFyZSBnb2luZwotICAgICAgICAgICAgICAgICAgICAvLyB0byBkbyBtdWx0aXBsZSB1cGRhdGVzIGFzIHRoZSBydW5uYWJsZSBjb3VsZCBiZSBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJ1bm5pbmcuCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SdW5uYWJsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKHRydWUsIHRoZW5Ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAvLyBkZWxheSB1cGRhdGUgc28gd2UgZG9uJ3QgdXBkYXRlIHZpZXcgb24gZXZlcnkgY3VlLiAgVE9ETyB3aHkgMTA/Ci0gICAgICAgICAgICBpZiAobUhhbmRsZXIucG9zdERlbGF5ZWQobVJ1bm5hYmxlLCAxMCAvKiBkZWxheSAqLykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNjaGVkdWxpbmcgdXBkYXRlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLncoVEFHLCAiZmFpbGVkIHRvIHNjaGVkdWxlIHN1YnRpdGxlIHZpZXcgdXBkYXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVmlzaWJsZSAmJgotICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zID49IG1MYXN0VGltZU1zICYmCi0gICAgICAgICAgICAgICAgKGN1ZS5tU3RhcnRUaW1lTXMgPCBtTmV4dFNjaGVkdWxlZFRpbWVNcyB8fAotICAgICAgICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA8IDApKSB7Ci0gICAgICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFRpbWVQcm92aWRlcihNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIpIHsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgPT0gdGltZVByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5jYW5jZWxOb3RpZmljYXRpb25zKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lUHJvdmlkZXIgPSB0aW1lUHJvdmlkZXI7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuc2NoZWR1bGVVcGRhdGUodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHN0YXRpYyBjbGFzcyBDdWVMaXN0IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdWVMaXN0IjsKLSAgICAgICAgLy8gc2ltcGxpc3RpYywgaW5lZmZpY2llbnQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcHJpdmF0ZSBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBtQ3VlczsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkRXZlbnQoQ3VlIGN1ZSwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFZlY3RvcjxDdWU+IGN1ZXMgPSBtQ3Vlcy5nZXQodGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdWVzID0gbmV3IFZlY3RvcjxDdWU+KDIpOwotICAgICAgICAgICAgICAgIG1DdWVzLnB1dCh0aW1lTXMsIGN1ZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWVzLmNvbnRhaW5zKGN1ZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgZHVwbGljYXRlIGN1ZXMKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1ZXMuYWRkKGN1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVFdmVudChDdWUgY3VlLCBsb25nIHRpbWVNcykgewotICAgICAgICAgICAgVmVjdG9yPEN1ZT4gY3VlcyA9IG1DdWVzLmdldCh0aW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkKEN1ZSBjdWUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBub24tcG9zaXRpdmUtZHVyYXRpb24gY3VlcwotICAgICAgICAgICAgaWYgKGN1ZS5tU3RhcnRUaW1lTXMgPj0gY3VlLm1FbmRUaW1lTXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoIWFkZEV2ZW50KGN1ZSwgY3VlLm1TdGFydFRpbWVNcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgbGFzdFRpbWVNcyA9IGN1ZS5tU3RhcnRUaW1lTXM7Ci0gICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lTXMgPiBsYXN0VGltZU1zICYmIHRpbWVNcyA8IGN1ZS5tRW5kVGltZU1zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VGltZU1zID0gdGltZU1zOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRFdmVudChjdWUsIGN1ZS5tRW5kVGltZU1zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZShDdWUgY3VlKSB7Ci0gICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubUVuZFRpbWVNcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmFibGU8UGFpcjxMb25nLCBDdWU+PiBlbnRyaWVzQmV0d2VlbigKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGxhc3RUaW1lTXMsIGZpbmFsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlPFBhaXI8TG9uZywgQ3VlPiA+KCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzbGljZSAoIiArIGxhc3RUaW1lTXMgKyAiLCAiICsgdGltZU1zICsgIl09Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdWVzLnN1Yk1hcChsYXN0VGltZU1zICsgMSwgdGltZU1zICsgMSkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgbmV4dFRpbWVBZnRlcihsb25nIHRpbWVNcykgewotICAgICAgICAgICAgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+PiB0YWlsID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IG1DdWVzLnRhaWxNYXAodGltZU1zICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFpbC5maXJzdEtleSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfSBjYXRjaChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiAhbURvbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFBhaXI8TG9uZywgQ3VlPiBuZXh0KCkgewotICAgICAgICAgICAgICAgIGlmIChtRG9uZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXN0RW50cnkgPSBuZXcgUGFpcjxMb25nLCBDdWU+KAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lTXMsIG1MaXN0SXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG1MaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0S2V5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtTGFzdEVudHJ5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHJlbW92aW5nIGVuZCB0YWdzCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0TGlzdEl0ZXJhdG9yID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RW50cnkuc2Vjb25kLm1FbmRUaW1lTXMgIT0gbUxhc3RFbnRyeS5maXJzdCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgZW5kLWN1ZQotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobUN1ZXMuZ2V0KG1MYXN0RW50cnkuZmlyc3QpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZShtTGFzdEVudHJ5LmZpcnN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgcmVzdCBvZiB0aGUgY3VlcwotICAgICAgICAgICAgICAgIEN1ZSBjdWUgPSBtTGFzdEVudHJ5LnNlY29uZDsKLSAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpOwotICAgICAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBFbnRyeUl0ZXJhdG9yKFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IGN1ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgY3VlcyArICIiKTsKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IGN1ZXM7Ci0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgIG5leHRLZXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG5leHRLZXkoKSB7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZW1haW5pbmdDdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVNcyA9IG1SZW1haW5pbmdDdWVzLmZpcnN0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGlzdEl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3Vlcy5nZXQobUN1cnJlbnRUaW1lTXMpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMudGFpbE1hcChtQ3VycmVudFRpbWVNcyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoIW1MaXN0SXRlcmF0b3IuaGFzTmV4dCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIG1DdXJyZW50VGltZU1zOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxDdWU+IG1MaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURvbmU7Ci0gICAgICAgICAgICBwcml2YXRlIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IG1SZW1haW5pbmdDdWVzOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxDdWU+IG1MYXN0TGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgcHJpdmF0ZSBQYWlyPExvbmcsQ3VlPiBtTGFzdEVudHJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQ3VlTGlzdCgpIHsKLSAgICAgICAgICAgIG1DdWVzID0gbmV3IFRyZWVNYXA8TG9uZywgVmVjdG9yPEN1ZT4+KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1ZSB7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1TdGFydFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmcgbUVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmdbXSBtSW5uZXJUaW1lc01zOwotICAgICAgICBwdWJsaWMgbG9uZyBtUnVuSUQ7Ci0KLSAgICAgICAgcHVibGljIEN1ZSBtTmV4dEluUnVuOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZShsb25nIHRpbWVNcykgeyB9Ci0gICAgfQotCi0gICAgLyoqIHVwZGF0ZSBtUnVuc0J5RW5kVGltZSAod2l0aCBkZWZhdWx0IGVuZCB0aW1lKSAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaGVkUnVuKGxvbmcgcnVuSUQpIHsKLSAgICAgICAgaWYgKHJ1bklEICE9IDAgJiYgcnVuSUQgIT0gfjApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KHJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bi5zdG9yZUJ5RW5kVGltZU1zKG1SdW5zQnlFbmRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB1cGRhdGUgbVJ1bnNCeUVuZFRpbWUgd2l0aCBnaXZlbiBlbmQgdGltZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bkRpc2NhcmRUaW1lTXMobG9uZyBydW5JRCwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgaWYgKHJ1bklEICE9IDAgJiYgcnVuSUQgIT0gfjApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KHJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gdGltZU1zOwotICAgICAgICAgICAgICAgIHJ1bi5zdG9yZUJ5RW5kVGltZU1zKG1SdW5zQnlFbmRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB3aGV0aGVyIHRoaXMgaXMgYSB0ZXh0IHRyYWNrIHdobyBmaXJlcyBldmVudHMgaW5zdGVhZCBnZXR0aW5nIHJlbmRlcmVkICovCi0gICAgcHVibGljIGludCBnZXRUcmFja1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZW5kZXJpbmdXaWRnZXQoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgPyBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQKLSAgICAgICAgICAgICAgICA6IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUnVuIHsKLSAgICAgICAgcHVibGljIEN1ZSBtRmlyc3RDdWU7Ci0gICAgICAgIHB1YmxpYyBSdW4gbU5leHRSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIFJ1biBtUHJldlJ1bkF0RW5kVGltZU1zOwotICAgICAgICBwdWJsaWMgbG9uZyBtRW5kVGltZU1zID0gLTE7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1SdW5JRCA9IDA7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RvcmVkRW5kVGltZU1zID0gLTE7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcmVCeUVuZFRpbWVNcyhMb25nU3BhcnNlQXJyYXk8UnVuPiBydW5zQnlFbmRUaW1lKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgb2xkIHZhbHVlIGlmIGFueQotICAgICAgICAgICAgaW50IGl4ID0gcnVuc0J5RW5kVGltZS5pbmRleE9mS2V5KG1TdG9yZWRFbmRUaW1lTXMpOwotICAgICAgICAgICAgaWYgKGl4ID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobVByZXZSdW5BdEVuZFRpbWVNcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCh0aGlzID09IHJ1bnNCeUVuZFRpbWUudmFsdWVBdChpeCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnJlbW92ZUF0KGl4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUuc2V0VmFsdWVBdChpeCwgbU5leHRSdW5BdEVuZFRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQXRFbmRUaW1lTXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIG5ldyB2YWx1ZQotICAgICAgICAgICAgaWYgKG1FbmRUaW1lTXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMgPSBydW5zQnlFbmRUaW1lLmdldChtRW5kVGltZU1zKTsKLSAgICAgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMubVByZXZSdW5BdEVuZFRpbWVNcyA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUucHV0KG1FbmRUaW1lTXMsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1TdG9yZWRFbmRUaW1lTXMgPSBtRW5kVGltZU1zOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQXRFbmRUaW1lTXMoKSB7Ci0gICAgICAgICAgICBSdW4gcHJldiA9IG1QcmV2UnVuQXRFbmRUaW1lTXM7Ci0KLSAgICAgICAgICAgIGlmIChtUHJldlJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zLm1OZXh0UnVuQXRFbmRUaW1lTXMgPSBtTmV4dFJ1bkF0RW5kVGltZU1zOwotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMubVByZXZSdW5BdEVuZFRpbWVNcyA9IHByZXY7Ci0gICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHJlbmRlcmluZyBzdWJ0aXRsZXMgb250byBhIENhbnZhcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmluZ1dpZGdldCB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB3aWRnZXQncyBjYWxsYmFjaywgd2hpY2ggaXMgdXNlZCB0byBzZW5kIHVwZGF0ZXMgd2hlbiB0aGUKLSAgICAgICAgICogcmVuZGVyZWQgZGF0YSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIHVwZGF0ZSBjYWxsYmFjawotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25DaGFuZ2VkTGlzdGVuZXIoT25DaGFuZ2VkTGlzdGVuZXIgY2FsbGJhY2spOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB3aWRnZXQncyBzaXplLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggaW4gcGl4ZWxzCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IGluIHBpeGVscwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHdpZGdldCBzaG91bGQgZHJhdyBzdWJ0aXRsZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgaWYgc3VidGl0bGVzIHNob3VsZCBiZSBkcmF3biwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbmRlcnMgc3VidGl0bGVzIG9udG8gYSB7QGxpbmsgQ2FudmFzfS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGMgY2FudmFzIG9uIHdoaWNoIHRvIHJlbmRlciBzdWJ0aXRsZXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGF0dGFjaGVkIHRvIGEgd2luZG93LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgZGV0YWNoZWQgZnJvbSBhIHdpbmRvdy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxiYWNrIHVzZWQgdG8gc2VuZCB1cGRhdGVzIGFib3V0IGNoYW5nZXMgdG8gcmVuZGVyaW5nIGRhdGEuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIE9uQ2hhbmdlZExpc3RlbmVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlbmRlcmluZyBkYXRhIGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEBwYXJhbSByZW5kZXJpbmdXaWRnZXQgdGhlIHdpZGdldCB3aG9zZSBkYXRhIGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZChSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZTU0OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5Db250cm9sbGVyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuU2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQnJvd3NlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbGxlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlci5MaWJyYXJ5Um9vdFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTWV0YWRhdGEyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5CdWlsZGVyQmFzZVByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db21tYW5kQnV0dG9uUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlci5NZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlNlc3Npb25Ub2tlbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TdGF0aWNQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWRlb1ZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuTGlicmFyeVJvb3RJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnRJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5SYXRpbmcySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzJJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcGlGYWN0b3J5IGltcGxlbWVudHMgU3RhdGljUHJvdmlkZXIgewotICAgIHByaXZhdGUgQXBpRmFjdG9yeSgpIHsgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdGF0aWNQcm92aWRlciBpbml0aWFsaXplKEFwcGxpY2F0aW9uSW5mbyB1cGRhdGFibGVJbmZvKSB7Ci0gICAgICAgIEFwaUhlbHBlci5pbml0aWFsaXplKHVwZGF0YWJsZUluZm8pOwotICAgICAgICByZXR1cm4gbmV3IEFwaUZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbGxlcjIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sbGVyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIyUHJvdmlkZXIgY3JlYXRlTWVkaWFCcm93c2VyMihDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuLCBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFCcm93c2VyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kKAotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUsIFN0cmluZyBhY3Rpb24sIEJ1bmRsZSBleHRyYSkgewotICAgICAgICBpZiAoYWN0aW9uID09IG51bGwgJiYgZXh0cmEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kSW1wbChpbnN0YW5jZSwgY29tbWFuZENvZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGFjdGlvbiwgZXh0cmEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZChCdW5kbGUgY29tbWFuZCkgewotICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwuZnJvbUJ1bmRsZV9pbXBsKGNvbW1hbmQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEdyb3VwUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uMkNvbW1hbmRHcm91cCgKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGluc3RhbmNlLCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBvdGhlcikgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGwoaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgKG90aGVyID09IG51bGwpID8gbnVsbCA6IG90aGVyLmdldFByb3ZpZGVyKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX01lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoQnVuZGxlIGNvbW1hbmRzKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db250cm9sbGVySW5mb1Byb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb250cm9sbGVySW5mbygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQ29udHJvbGxlckluZm8gaW5zdGFuY2UsIGludCB1aWQsIGludCBwaWQsIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIElJbnRlcmZhY2UgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db250cm9sbGVySW5mb0ltcGwoY29udGV4dCwKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSwgdWlkLCBwaWQsIHBhY2thZ2VOYW1lLCAoSU1lZGlhQ29udHJvbGxlcjIpIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kQnV0dG9uQnVpbGRlcigKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEJ1dHRvbkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhU2Vzc2lvbjIsIFNlc3Npb25DYWxsYmFjaz4gY3JlYXRlTWVkaWFTZXNzaW9uMkJ1aWxkZXIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhU2Vzc2lvbjIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJJbXBsKGNvbnRleHQsIGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb25TZXJ2aWNlMihNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTJNZWRpYU5vdGlmaWNhdGlvbigKLSAgICAgICAgICAgIE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuTWVkaWFOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgIGluc3RhbmNlLCBub3RpZmljYXRpb25JZCwgbm90aWZpY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMihNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJCYXNlUHJvdmlkZXI8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPgotICAgICAgICBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMkJ1aWxkZXIoTWVkaWFMaWJyYXJ5U2VydmljZTIgc2VydmljZSwKLSAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlciBpbnN0YW5jZSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5CdWlsZGVySW1wbChzZXJ2aWNlLCBpbnN0YW5jZSwgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgICAgICBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpYnJhcnlSb290UHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJMaWJyYXJ5Um9vdCgKLSAgICAgICAgICAgIExpYnJhcnlSb290IGluc3RhbmNlLCBTdHJpbmcgcm9vdElkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlicmFyeVJvb3RJbXBsKGluc3RhbmNlLCByb290SWQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgY3JlYXRlTWVkaWFDb250cm9sVmlldzIoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIsCi0gICAgICAgICAgICBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZGVvVmlldzJQcm92aWRlciBjcmVhdGVWaWRlb1ZpZXcyKAotICAgICAgICAgICAgVmlkZW9WaWV3MiBpbnN0YW5jZSwgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAotICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVmlkZW9WaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjJQcm92aWRlciBjcmVhdGVTZXNzaW9uVG9rZW4yKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgdWlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX1Nlc3Npb25Ub2tlbjIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFJdGVtMkJ1aWxkZXIoTWVkaWFJdGVtMi5CdWlsZGVyIGluc3RhbmNlLAotICAgICAgICAgICAgaW50IGZsYWdzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UsIGZsYWdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFJdGVtMiBmcm9tQnVuZGxlX01lZGlhSXRlbTIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyIGNyZWF0ZVZvbHVtZVByb3ZpZGVyMihWb2x1bWVQcm92aWRlcjIgaW5zdGFuY2UsIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVm9sdW1lUHJvdmlkZXIySW1wbChpbnN0YW5jZSwgY29udHJvbFR5cGUsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGZyb21CdW5kbGVfTWVkaWFNZXRhZGF0YTIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gTWVkaWFNZXRhZGF0YTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYU1ldGFkYXRhMkJ1aWxkZXIoCi0gICAgICAgICAgICBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBzb3VyY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIGZyb21CdW5kbGVfUmF0aW5nMihCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX1JhdGluZzIoaW50IHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdVbnJhdGVkUmF0aW5nX2ltcGwocmF0aW5nU3R5bGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld0hlYXJ0UmF0aW5nX1JhdGluZzIoYm9vbGVhbiBoYXNIZWFydCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3SGVhcnRSYXRpbmdfaW1wbChoYXNIZWFydCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3VGh1bWJSYXRpbmdfUmF0aW5nMihib29sZWFuIHRodW1iSXNVcCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VGh1bWJSYXRpbmdfaW1wbCh0aHVtYklzVXApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfUmF0aW5nMihpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdTdGFyUmF0aW5nX2ltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX1JhdGluZzIoZmxvYXQgcGVyY2VudCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKHBlcmNlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlciBjcmVhdGVNZWRpYVBsYXlsaXN0QWdlbnQoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFQbGF5bGlzdEFnZW50SW1wbChpbnN0YW5jZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4YmI0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVCdXR0b247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBpSGVscGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbkluZm8gc1VwZGF0YWJsZUluZm87Ci0KLSAgICBAR3VhcmRlZEJ5KCJ0aGlzIikKLSAgICBwcml2YXRlIHN0YXRpYyBUaGVtZSBzTGliVGhlbWU7Ci0KLSAgICBwcml2YXRlIEFwaUhlbHBlcigpIHsgfQotCi0gICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgewotICAgICAgICBpZiAoc1VwZGF0YWJsZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5pdGlhbGl6ZSBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc1VwZGF0YWJsZUluZm8gPSB1cGRhdGFibGVJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VzIGdldExpYlJlc291cmNlcyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldExpYlRoZW1lKGNvbnRleHQpLmdldFJlc291cmNlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGhlbWUgZ2V0TGliVGhlbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChzTGliVGhlbWUgIT0gbnVsbCkgcmV0dXJuIHNMaWJUaGVtZTsKLQotICAgICAgICByZXR1cm4gZ2V0TGliVGhlbWVTeW5jaHJvbml6ZWQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUaGVtZSBnZXRMaWJUaGVtZShDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZUlkKSB7Ci0gICAgICAgIFRoZW1lIHRoZW1lID0gZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLm5ld1RoZW1lKCk7Ci0gICAgICAgIHRoZW1lLmFwcGx5U3R5bGUodGhlbWVJZCwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0aGVtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExheW91dEluZmxhdGVyIGdldExheW91dEluZmxhdGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZ2V0TGF5b3V0SW5mbGF0ZXIoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lKSB7Ci0gICAgICAgIGlmICh0aGVtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGVtZSA9IGdldExpYlRoZW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgbGF5b3V0SW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmNsb25lSW5Db250ZXh0KAotICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKSk7Ci0gICAgICAgIGxheW91dEluZmxhdGVyLnNldEZhY3RvcnkyKG5ldyBMYXlvdXRJbmZsYXRlci5GYWN0b3J5MigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KAotICAgICAgICAgICAgICAgICAgICBWaWV3IHBhcmVudCwgU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1lZGlhUm91dGVCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChPdmVybGF5TGlzdFZpZXcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJsYXlMaXN0Vmlldyhjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCdXR0b25CYXJMYXlvdXQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkJhckxheW91dChjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTcGFjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3BhY2UoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uQ3JlYXRlVmlldyhudWxsLCBuYW1lLCBjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gbGF5b3V0SW5mbGF0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBpbnQgbGliUmVzSWQpIHsKLSAgICAgICAgcmV0dXJuIGluZmxhdGVMaWJMYXlvdXQoY29udGV4dCwgZ2V0TGliVGhlbWUoY29udGV4dCksIGxpYlJlc0lkLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSwgaW50IGxpYlJlc0lkKSB7Ci0gICAgICAgIHJldHVybiBpbmZsYXRlTGliTGF5b3V0KGNvbnRleHQsIHRoZW1lLCBsaWJSZXNJZCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUsIGludCBsaWJSZXNJZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBWaWV3R3JvdXAgcm9vdCwgYm9vbGVhbiBhdHRhY2hUb1Jvb3QpIHsKLSAgICAgICAgdHJ5IChYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBnZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0TGF5b3V0KGxpYlJlc0lkKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldExheW91dEluZmxhdGVyKGNvbnRleHQsIHRoZW1lKS5pbmZsYXRlKHBhcnNlciwgcm9vdCwgYXR0YWNoVG9Sb290KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBUaGVtZSBnZXRMaWJUaGVtZVN5bmNocm9uaXplZChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNMaWJUaGVtZSAhPSBudWxsKSByZXR1cm4gc0xpYlRoZW1lOwotCi0gICAgICAgIGlmIChzVXBkYXRhYmxlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbml0aWFsaXplIGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc0xpYlRoZW1lID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihzVXBkYXRhYmxlSW5mbykubmV3VGhlbWUoKTsKLSAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDZhZjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotLy8gQEBSZXF1aXJlc0FwaSgyNCkKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQXBpMjQgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGV2aWNlVHlwZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXREZXZpY2VUeXBlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlOGQ0Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnZpZXcuQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGUgbWVkaWEgcm91dGUgYWN0aW9uIHByb3ZpZGVyIGRpc3BsYXlzIGEge0BsaW5rIE1lZGlhUm91dGVCdXR0b24gbWVkaWEgcm91dGUgYnV0dG9ufQotICogaW4gdGhlIGFwcGxpY2F0aW9uJ3Mge0BsaW5rIEFjdGlvbkJhcn0gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQKLSAqIHRvIGNvbnRyb2wgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKLSAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKLSAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgotICogPC9wPjxwPgotICogUmVmZXIgdG8ge0BsaW5rIE1lZGlhUm91dGVCdXR0b259IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBidXR0b24gdGhhdCB3aWxsCi0gKiBhcHBlYXIgaW4gdGhlIGFjdGlvbiBiYXIgbWVudS4gIE5vdGUgdGhhdCBpbnN0ZWFkIG9mIGRpc2FibGluZyB0aGUgYnV0dG9uCi0gKiB3aGVuIG5vIHJvdXRlcyBhcmUgYXZhaWxhYmxlLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgaW5zdGVhZCBtYWtlIHRoZQotICogbWVudSBpdGVtIGludmlzaWJsZS4gIEluIHRoaXMgd2F5LCB0aGUgYnV0dG9uIHdpbGwgb25seSBiZSB2aXNpYmxlIHdoZW4gaXQKLSAqIGlzIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbWF0Y2hpbmcgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciwgdGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZgotICoge0BsaW5rIEFwcENvbXBhdEFjdGl2aXR5fSBmcm9tIHRoZSA8Y29kZT5hbmRyb2lkLnN1cHBvcnQudjcuYXBwY29tcGF0PC9jb2RlPgotICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKiA8L3A+Ci0gKgotICogPGgzPkV4YW1wbGU8L2gzPgotICogPHA+Ci0gKiA8L3A+PHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGRlZmluZSBhIG1lbnUgcmVzb3VyY2UgdG8gaW5jbHVkZSB0aGUgcHJvdmlkZXIgaW4gdGhlCi0gKiBhY3Rpb24gYmFyIG9wdGlvbnMgbWVudS4gIE5vdGUgdGhhdCB0aGUgc3VwcG9ydCBsaWJyYXJ5IGFjdGlvbiBiYXIgdXNlcyBhdHRyaWJ1dGVzCi0gKiB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHJlc291cmNlIG5hbWVzcGFjZSByYXRoZXIgdGhhbiB0aGUgZnJhbWV3b3JrJ3MKLSAqIHJlc291cmNlIG5hbWVzcGFjZSB0byBjb25maWd1cmUgZWFjaCBpdGVtLgotICogPC9wPjxwcmU+Ci0gKiAmbHQ7bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gKiAgICAgICAgIHhtbG5zOmFwcD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy1hdXRvIj4KLSAqICAgICAmbHQ7aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lZGlhX3JvdXRlX21lbnVfaXRlbSIKLSAqICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZWRpYV9yb3V0ZV9tZW51X3RpdGxlIgotICogICAgICAgICBhcHA6c2hvd0FzQWN0aW9uPSJhbHdheXMiCi0gKiAgICAgICAgIGFwcDphY3Rpb25Qcm92aWRlckNsYXNzPSJhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciIvPgotICogJmx0Oy9tZW51PgotICogPC9wcmU+PHA+Ci0gKiBUaGVuIGNvbmZpZ3VyZSB0aGUgbWVudSBhbmQgc2V0IHRoZSByb3V0ZSBzZWxlY3RvciBmb3IgdGhlIGNob29zZXIuCi0gKiA8L3A+PHByZT4KLSAqIHB1YmxpYyBjbGFzcyBNeUFjdGl2aXR5IGV4dGVuZHMgQXBwQ29tcGF0QWN0aXZpdHkgewotICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gKgotICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAqICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAqCi0gKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKLSAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKLSAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAqICAgICAgICAgbUNhbGxiYWNrID0gbmV3IE15Q2FsbGJhY2soKTsKLSAqICAgICB9Ci0gKgotICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCi0gKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCi0gKiAgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAqICAgICAgICAgc3VwZXIub25TdGFydCgpOwotICoKLSAqICAgICAgICAgbWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssCi0gKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7Ci0gKgotICogICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci51cGRhdGVTZWxlY3RlZFJvdXRlKG1TZWxlY3Rvcik7Ci0gKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgotICogICAgIH0KLSAqCi0gKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgotICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgotICogICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAqICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gKgotICogICAgICAgICBtZWRpYVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICogICAgIH0KLSAqCi0gKiAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLSAqICAgICAgICAgc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKLSAqCi0gKiAgICAgICAgIGdldE1lbnVJbmZsYXRlcigpLmluZmxhdGUoUi5tZW51LnNhbXBsZV9tZWRpYV9yb3V0ZXJfbWVudSwgbWVudSk7Ci0gKgotICogICAgICAgICBNZW51SXRlbSBtZWRpYVJvdXRlTWVudUl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQubWVkaWFfcm91dGVfbWVudV9pdGVtKTsKLSAqICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIG1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciA9Ci0gKiAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcilNZW51SXRlbUNvbXBhdC5nZXRBY3Rpb25Qcm92aWRlcihtZWRpYVJvdXRlTWVudUl0ZW0pOwotICogICAgICAgICBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAqICAgICB9Ci0gKgotICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAqICAgICAgICAgLy8gSW1wbGVtZW50IGNhbGxiYWNrIG1ldGhvZHMgYXMgbmVlZGVkLgotICogICAgIH0KLSAqIH0KLSAqIDwvcHJlPgotICoKLSAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBleHRlbmRzIEFjdGlvblByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IG1EaWFsb2dGYWN0b3J5ID0gTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtQnV0dG9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWN0aW9uIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0KLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBhY3Rpb24gcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGlzIHN0aWxsIG5lZWRlZCBieSB0aGUgVUkuICBVbmZvcnR1bmF0ZWx5IHRoaXMgbWVhbnMgdGhlIGFjdGlvbiBwcm92aWRlcgotICAgICAgICAgICAgLy8gbWF5IGxlYWsgY2FsbGJhY2tzIHVudGlsIGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuICBUaGlzIG1heSByZXN1bHQgaW4KLSAgICAgICAgICAgIC8vIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBkb2luZyBtb3JlIHdvcmsgdGhhbiBuZWNlc3NhcnkgaW4gdGhlIHNob3J0IHRlcm0KLSAgICAgICAgICAgIC8vIHdoaWxlIHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIG9mIGludGVyZXN0IHRvIHRoZQotICAgICAgICAgICAgLy8gYXBwbGljYXRpb24uICBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHRoZSBhY3Rpb24gcHJvdmlkZXIgd2lsbCBuZWVkIHNvbWUKLSAgICAgICAgICAgIC8vIGluZGljYXRpb24gZnJvbSB0aGUgZnJhbWV3b3JrIHRoYXQgaXQgaXMgYmVpbmcgZGVzdHJveWVkLgotICAgICAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLQotICAgICAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGlhbG9nRmFjdG9yeSAhPSBmYWN0b3J5KSB7Ci0gICAgICAgICAgICBtRGlhbG9nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0KLSAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhc3NvY2lhdGVkIG1lZGlhIHJvdXRlIGJ1dHRvbiwgb3IgbnVsbCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQuCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gZ2V0TWVkaWFSb3V0ZUJ1dHRvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgYnV0dG9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbiBvbkNyZWF0ZU1lZGlhUm91dGVCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUJ1dHRvbihnZXRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIFZpZXcgb25DcmVhdGVBY3Rpb25WaWV3KCkgewotICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJvbkNyZWF0ZUFjdGlvblZpZXc6IHRoaXMgQWN0aW9uUHJvdmlkZXIgaXMgYWxyZWFkeSBhc3NvY2lhdGVkICIgKwotICAgICAgICAgICAgICAgICAgICAid2l0aCBhIG1lbnUgaXRlbS4gRG9uJ3QgcmV1c2UgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIGluc3RhbmNlcyEgIiArCi0gICAgICAgICAgICAgICAgICAgICJBYmFuZG9uaW5nIHRoZSBvbGQgbWVudSBpdGVtLi4uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnV0dG9uID0gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCk7Ci0gICAgICAgIG1CdXR0b24uc2V0Q2hlYXRTaGVldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkobURpYWxvZ0ZhY3RvcnkpOwotICAgICAgICBtQnV0dG9uLnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOwotICAgICAgICByZXR1cm4gbUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblBlcmZvcm1EZWZhdWx0QWN0aW9uKCkgewotICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1dHRvbi5zaG93RGlhbG9nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG92ZXJyaWRlc0l0ZW1WaXNpYmlsaXR5KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlZnJlc2hSb3V0ZSgpIHsKLSAgICAgICAgcmVmcmVzaFZpc2liaWxpdHkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyPiBtUHJvdmlkZXJXZWFrOwotCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlckNhbGxiYWNrKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotICAgICAgICAgICAgbVByb3ZpZGVyV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4ocHJvdmlkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFJvdXRlKE1lZGlhUm91dGVyIHJvdXRlcikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVyV2Vhay5nZXQoKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXIucmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdXRlci5yZW1vdmVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZThhNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LlRvb2x0aXBDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU291bmRFZmZlY3RDb25zdGFudHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQgdG8gY29udHJvbCB0aGUKLSAqIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKLSAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKLSAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgotICogPC9wPjxwPgotICogV2hlbiB0aGUgZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCBvciB3aGVuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcyBub3QKLSAqIG1hdGNoIHRoZSB7QGxpbmsgI2dldFJvdXRlU2VsZWN0b3IoKSBzZWxlY3Rvcn0sIHRoZSBidXR0b24gd2lsbCBhcHBlYXIgaW4KLSAqIGFuIGluYWN0aXZlIHN0YXRlIGluZGljYXRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgbm90IGNvbm5lY3RlZCB0byBhCi0gKiByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIENsaWNraW5nIG9uIHRoZSBidXR0b24gb3BlbnMKLSAqIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfSB0byBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYSByb3V0ZS4KLSAqIElmIG5vIG5vbi1kZWZhdWx0IHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYW4gYWN0aXZlCi0gKiBzY2FuIHRvIGRpc2NvdmVyIGFueSBtYXRjaGluZyByb3V0ZXMsIHRoZW4gdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZCBhbmQgY2Fubm90Ci0gKiBiZSBjbGlja2VkLgotICogPC9wPjxwPgotICogV2hlbiBhIG5vbi1kZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsIHRoZSBidXR0b24gd2lsbAotICogYXBwZWFyIGluIGFuIGFjdGl2ZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGNvbm5lY3RlZAotICogdG8gYSByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIFRoZSBidXR0b24gbWF5IGFsc28gYXBwZWFyCi0gKiBpbiBhbiBpbnRlcm1lZGlhcnkgY29ubmVjdGluZyBzdGF0ZSBpZiB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZwotICogdG8gdGhlIGRlc3RpbmF0aW9uIGJ1dCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZG9pbmcgc28uICBJbiBlaXRoZXIgY2FzZSwgY2xpY2tpbmcKLSAqIG9uIHRoZSBidXR0b24gb3BlbnMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9IHRvIGFsbG93IHRoZSB1c2VyCi0gKiB0byBjb250cm9sIG9yIGRpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudCByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+UHJlcmVxdWlzaXRlczwvaDM+Ci0gKiA8cD4KLSAqIFRvIHVzZSB0aGUgbWVkaWEgcm91dGUgYnV0dG9uLCB0aGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCi0gKiB7QGxpbmsgRnJhZ21lbnRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY0PC9jb2RlPgotICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVCdXR0b24gZXh0ZW5kcyBWaWV3IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVCdXR0b24iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIT09TRVJfRlJBR01FTlRfVEFHID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xMRVJfRlJBR01FTlRfVEFHID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIGludCBtUm91dGVDYWxsYmFja0ZsYWdzOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgbURpYWxvZ0ZhY3RvcnkgPSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUgPQotICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oMik7Ci0gICAgcHJpdmF0ZSBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgbVJlbW90ZUluZGljYXRvckxvYWRlcjsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1SZW1vdGVJbmRpY2F0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1SZW1vdGVBY3RpdmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Nvbm5lY3Rpbmc7Ci0KLSAgICBwcml2YXRlIENvbG9yU3RhdGVMaXN0IG1CdXR0b25UaW50OwotICAgIHByaXZhdGUgaW50IG1NaW5XaWR0aDsKLSAgICBwcml2YXRlIGludCBtTWluSGVpZ2h0OwotCi0gICAgLy8gVGhlIGNoZWNrZWQgc3RhdGUgaXMgdXNlZCB3aGVuIGNvbm5lY3RlZCB0byBhIHJlbW90ZSByb3V0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0VEX1NUQVRFX1NFVCA9IHsKLSAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfY2hlY2tlZAotICAgIH07Ci0KLSAgICAvLyBUaGUgY2hlY2thYmxlIHN0YXRlIGlzIHVzZWQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSByb3V0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0FCTEVfU1RBVEVfU0VUID0gewotICAgICAgICBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9jaGVja2FibGUKLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgUi5hdHRyLm1lZGlhUm91dGVCdXR0b25TdHlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5jcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KGNvbnRleHQpLCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0KLSAgICAgICAgUmVzb3VyY2VzLlRoZW1lIHRoZW1lID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5uZXdUaGVtZSgpOwotICAgICAgICB0aGVtZS5hcHBseVN0eWxlKE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSwgdHJ1ZSk7Ci0gICAgICAgIFR5cGVkQXJyYXkgYSA9IHRoZW1lLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbiwgZGVmU3R5bGVBdHRyLCAwKTsKLQotICAgICAgICBtQnV0dG9uVGludCA9IGEuZ2V0Q29sb3JTdGF0ZUxpc3QoUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9tZWRpYVJvdXRlQnV0dG9uVGludCk7Ci0gICAgICAgIG1NaW5XaWR0aCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fYW5kcm9pZF9taW5XaWR0aCwgMCk7Ci0gICAgICAgIG1NaW5IZWlnaHQgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2FuZHJvaWRfbWluSGVpZ2h0LCAwKTsKLSAgICAgICAgaW50IHJlbW90ZUluZGljYXRvclJlc0lkID0gYS5nZXRSZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSwgMCk7Ci0gICAgICAgIGEucmVjeWNsZSgpOwotCi0gICAgICAgIGlmIChyZW1vdGVJbmRpY2F0b3JSZXNJZCAhPSAwKSB7Ci0gICAgICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIHJlbW90ZUluZGljYXRvclN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgc1JlbW90ZUluZGljYXRvckNhY2hlLmdldChyZW1vdGVJbmRpY2F0b3JSZXNJZCk7Ci0gICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKHJlbW90ZUluZGljYXRvclN0YXRlLm5ld0RyYXdhYmxlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbmV3IFJlbW90ZUluZGljYXRvckxvYWRlcihyZW1vdGVJbmRpY2F0b3JSZXNJZCk7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suVEhSRUFEX1BPT0xfRVhFQ1VUT1IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBjYWxsYmFjay4gTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZgotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI01lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCi0gICAgICogICAgICAgICAgICAgIHtAbGluayAjTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgewotICAgICAgICBpZiAobVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikgJiYgbVJvdXRlQ2FsbGJhY2tGbGFncyA9PSBmbGFncykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsIHx8IHNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MgPSBmbGFnczsKLQotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywgZmxhZ3MpOwotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1EaWFsb2dGYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSByb3V0ZSBjaG9vc2VyIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBkZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIG9yIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcwotICAgICAqIG5vdCBtYXRjaCB0aGUge0BsaW5rICNnZXRSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yfSwgdGhlbiBzaG93cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICogT3RoZXJ3aXNlLCBzaG93cyB0aGUgcm91dGUgY29udHJvbGxlciBkaWFsb2cgdG8gb2ZmZXIgdGhlIHVzZXIKLSAgICAgKiBhIGNob2ljZSB0byBkaXNjb25uZWN0IGZyb20gdGhlIHJvdXRlIG9yIHBlcmZvcm0gb3RoZXIgY29udHJvbCBhY3Rpb25zCi0gICAgICogc3VjaCBhcyBzZXR0aW5nIHRoZSByb3V0ZSdzIHZvbHVtZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiBjdXN0b21pemUgdGhlIGRpYWxvZ3MgYnkgY2FsbGluZyB7QGxpbmsgI3NldERpYWxvZ0ZhY3Rvcnl9Ci0gICAgICogdG8gcHJvdmlkZSBhIGN1c3RvbWl6ZWQgZGlhbG9nIGZhY3RvcnkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBkaWFsb2cgd2FzIGFjdHVhbGx5IHNob3duLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGFjdGl2aXR5IGlzIG5vdCBhIHN1YmNsYXNzIG9mCi0gICAgICoge0BsaW5rIEZyYWdtZW50QWN0aXZpdHl9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKSB7Ci0gICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldEFjdGl2aXR5KCkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChmbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEZyYWdtZW50QWN0aXZpdHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBpZiAocm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB8fCAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3RvcikpIHsKLSAgICAgICAgICAgIGlmIChmbS5maW5kRnJhZ21lbnRCeVRhZyhDSE9PU0VSX0ZSQUdNRU5UX1RBRykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3dEaWFsb2coKTogUm91dGUgY2hvb3NlciBkaWFsb2cgYWxyZWFkeSBzaG93aW5nISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZiA9Ci0gICAgICAgICAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5Lm9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgICAgICAgICBmLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgICAgIGYuc2hvdyhmbSwgQ0hPT1NFUl9GUkFHTUVOVF9UQUcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZtLmZpbmRGcmFnbWVudEJ5VGFnKENPTlRST0xMRVJfRlJBR01FTlRfVEFHKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvd0RpYWxvZygpOiBSb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBhbHJlYWR5IHNob3dpbmchIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCBmID0KLSAgICAgICAgICAgICAgICAgICAgbURpYWxvZ0ZhY3Rvcnkub25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICAgICAgICAgIGYuc2hvdyhmbSwgQ09OVFJPTExFUl9GUkFHTUVOVF9UQUcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKLSAgICAgICAgLy8gR3Jvc3Mgd2F5IG9mIHVud3JhcHBpbmcgdGhlIEFjdGl2aXR5IHNvIHdlIGNhbiBnZXQgdGhlIEZyYWdtZW50TWFuYWdlcgotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0gICAgICAgIHdoaWxlIChjb250ZXh0IGluc3RhbmNlb2YgQ29udGV4dFdyYXBwZXIpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEFjdGl2aXR5KWNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0ID0gKChDb250ZXh0V3JhcHBlciljb250ZXh0KS5nZXRCYXNlQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgc2hvd2luZyBhIHRvYXN0IHdpdGggdGhlIGNvbnRlbnQgZGVzY3JpcHRvciBvZiB0aGUKLSAgICAgKiBidXR0b24gd2hlbiB0aGUgYnV0dG9uIGlzIGxvbmcgcHJlc3NlZC4KLSAgICAgKi8KLSAgICB2b2lkIHNldENoZWF0U2hlZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIFRvb2x0aXBDb21wYXQuc2V0VG9vbHRpcFRleHQodGhpcywgZW5hYmxlCi0gICAgICAgICAgICAgICAgPyBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZyhSLnN0cmluZy5tcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbikKLSAgICAgICAgICAgICAgICA6IG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DbGljaygpIHsKLSAgICAgICAgLy8gU2VuZCB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzaWJpbGl0eSBldmVudHMgYW5kIGNhbGwgbGlzdGVuZXJzCi0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLnBlcmZvcm1DbGljaygpOwotICAgICAgICBpZiAoIWhhbmRsZWQpIHsKLSAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChTb3VuZEVmZmVjdENvbnN0YW50cy5DTElDSyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNob3dEaWFsb2coKSB8fCBoYW5kbGVkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnRbXSBvbkNyZWF0ZURyYXdhYmxlU3RhdGUoaW50IGV4dHJhU3BhY2UpIHsKLSAgICAgICAgZmluYWwgaW50W10gZHJhd2FibGVTdGF0ZSA9IHN1cGVyLm9uQ3JlYXRlRHJhd2FibGVTdGF0ZShleHRyYVNwYWNlICsgMSk7Ci0KLSAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2Ugc2hvdWxkIGJlIGhhbmRsaW5nIHRoaXMgbW9yZSBjb21wbGV0ZWx5LCBidXQgdGhlc2UKLSAgICAgICAgLy8gYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaGVyZS4gQ2hlY2thYmxlIGlzIHVzZWQgdG8gZXhwcmVzcyB0aGUgY29ubmVjdGluZwotICAgICAgICAvLyBkcmF3YWJsZSBzdGF0ZSBhbmQgaXQncyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjaGVjayBmb3IgdGhlIHB1cnBvc2VzCi0gICAgICAgIC8vIG9mIHN0YXRlIHNlbGVjdGlvbiBoZXJlLgotICAgICAgICBpZiAobUlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgbWVyZ2VEcmF3YWJsZVN0YXRlcyhkcmF3YWJsZVN0YXRlLCBDSEVDS0FCTEVfU1RBVEVfU0VUKTsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICBtZXJnZURyYXdhYmxlU3RhdGVzKGRyYXdhYmxlU3RhdGUsIENIRUNLRURfU1RBVEVfU0VUKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHJhd2FibGVTdGF0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKLSAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRbXSBteURyYXdhYmxlU3RhdGUgPSBnZXREcmF3YWJsZVN0YXRlKCk7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldFN0YXRlKG15RHJhd2FibGVTdGF0ZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSByZW1vdGUgcm91dGUgaW5kaWNhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKERyYXdhYmxlIGQpIHsKLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5jYW5jZWwoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRDYWxsYmFjayhudWxsKTsKLSAgICAgICAgICAgIHVuc2NoZWR1bGVEcmF3YWJsZShtUmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUJ1dHRvblRpbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGQgPSBEcmF3YWJsZUNvbXBhdC53cmFwKGQubXV0YXRlKCkpOwotICAgICAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0LnNldFRpbnRMaXN0KGQsIG1CdXR0b25UaW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGQuc2V0Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICBkLnNldFN0YXRlKGdldERyYXdhYmxlU3RhdGUoKSk7Ci0gICAgICAgICAgICBkLnNldFZpc2libGUoZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtUmVtb3RlSW5kaWNhdG9yID0gZDsKLQotICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOwotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cgJiYgbVJlbW90ZUluZGljYXRvciAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBBbmltYXRpb25EcmF3YWJsZSkgewotICAgICAgICAgICAgQW5pbWF0aW9uRHJhd2FibGUgY3VyRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpOwotICAgICAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0b3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoY3VyRHJhd2FibGUuZ2V0TnVtYmVyT2ZGcmFtZXMoKSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5RHJhd2FibGUoRHJhd2FibGUgd2hvKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci52ZXJpZnlEcmF3YWJsZSh3aG8pIHx8IHdobyA9PSBtUmVtb3RlSW5kaWNhdG9yOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCBzdXBlciB0byBoYW5kbGUgdGhlIGJhY2tncm91bmQgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgotICAgICAgICAvL3N1cGVyLmp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpOwotICAgICAgICBpZiAoZ2V0QmFja2dyb3VuZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0Lmp1bXBUb0N1cnJlbnRTdGF0ZShnZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIG91ciBvd24gcmVtb3RlIGluZGljYXRvci4KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgRHJhd2FibGVDb21wYXQuanVtcFRvQ3VycmVudFN0YXRlKG1SZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0VmlzaWJsZShnZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgbVJvdXRlQ2FsbGJhY2tGbGFncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBmaW5hbCBpbnQgd2lkdGhTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodFNpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgobU1pbldpZHRoLCBtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwgPwotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljV2lkdGgoKSArIGdldFBhZGRpbmdMZWZ0KCkgKyBnZXRQYWRkaW5nUmlnaHQoKSA6IDApOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgobU1pbkhlaWdodCwgbVJlbW90ZUluZGljYXRvciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpICsgZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpIDogMCk7Ci0KLSAgICAgICAgaW50IG1lYXN1cmVkV2lkdGg7Ci0gICAgICAgIHN3aXRjaCAod2lkdGhNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkVYQUNUTFk6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHdpZHRoU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gTWF0aC5taW4od2lkdGhTaXplLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWVhc3VyZWRIZWlnaHQ7Ci0gICAgICAgIHN3aXRjaCAoaGVpZ2h0TW9kZSkgewotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gaGVpZ2h0U2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IE1hdGgubWluKGhlaWdodFNpemUsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IGdldFBhZGRpbmdMZWZ0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHQgPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdG9wID0gZ2V0UGFkZGluZ1RvcCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd1dpZHRoID0gbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNXaWR0aCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdIZWlnaHQgPSBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdMZWZ0ID0gbGVmdCArIChyaWdodCAtIGxlZnQgLSBkcmF3V2lkdGgpIC8gMjsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3VG9wID0gdG9wICsgKGJvdHRvbSAtIHRvcCAtIGRyYXdIZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRCb3VuZHMoZHJhd0xlZnQsIGRyYXdUb3AsCi0gICAgICAgICAgICAgICAgICAgIGRyYXdMZWZ0ICsgZHJhd1dpZHRoLCBkcmF3VG9wICsgZHJhd0hlaWdodCk7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmRyYXcoY2FudmFzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcmVmcmVzaFJvdXRlKCkgewotICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1JlbW90ZSA9ICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzQ29ubmVjdGluZyA9IGlzUmVtb3RlICYmIHJvdXRlLmlzQ29ubmVjdGluZygpOwotICAgICAgICBib29sZWFuIG5lZWRzUmVmcmVzaCA9IGZhbHNlOwotICAgICAgICBpZiAobVJlbW90ZUFjdGl2ZSAhPSBpc1JlbW90ZSkgewotICAgICAgICAgICAgbVJlbW90ZUFjdGl2ZSA9IGlzUmVtb3RlOwotICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzQ29ubmVjdGluZyAhPSBpc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmcgPSBpc0Nvbm5lY3Rpbmc7Ci0gICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5lZWRzUmVmcmVzaCkgewotICAgICAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgc2V0RW5hYmxlZChtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKSBpbnN0YW5jZW9mIEFuaW1hdGlvbkRyYXdhYmxlKSB7Ci0gICAgICAgICAgICBBbmltYXRpb25EcmF3YWJsZSBjdXJEcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG5lZWRzUmVmcmVzaCB8fCBpc0Nvbm5lY3RpbmcpICYmICFjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZW1vdGUgJiYgIWlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJvdXRlIGlzIGFscmVhZHkgY29ubmVjdGVkIGJlZm9yZSB0aGUgdmlldyBpcyBhdHRhY2hlZCwgc2hvdyB0aGUgbGFzdAotICAgICAgICAgICAgICAgIC8vIGZyYW1lIG9mIHRoZSBjb25uZWN0ZWQgYW5pbWF0aW9uIGltbWVkaWF0ZWx5LgotICAgICAgICAgICAgICAgIGlmIChjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGN1ckRyYXdhYmxlLmdldE51bWJlck9mRnJhbWVzKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGludCByZXNJZDsKLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fY29ubmVjdGluZzsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkuZ2V0U3RyaW5nKHJlc0lkKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgRHJhd2FibGU+IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJlc0lkOwotCi0gICAgICAgIFJlbW90ZUluZGljYXRvckxvYWRlcihpbnQgcmVzSWQpIHsKLSAgICAgICAgICAgIG1SZXNJZCA9IHJlc0lkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBEcmF3YWJsZSBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgewotICAgICAgICAgICAgcmV0dXJuIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoZ2V0Q29udGV4dCgpKS5nZXREcmF3YWJsZShtUmVzSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBjYWNoZUFuZFJlc2V0KHJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgICAgICBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ2FuY2VsbGVkKERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgY2FjaGVBbmRSZXNldChyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNhY2hlQW5kUmVzZXQoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUucHV0KG1SZXNJZCwgcmVtb3RlSW5kaWNhdG9yLmdldENvbnN0YW50U3RhdGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjNjRkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5BcHBDb21wYXREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmb3Ige0BsaW5rIE1lZGlhUm91dGVyfS4KLSAqIDxwPgotICogVGhpcyBkaWFsb2cgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIHJvdXRlIHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHNlbGVjdG9yLgotICogPC9wPgotICoKLSAqIEBzZWUgTWVkaWFSb3V0ZUJ1dHRvbgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyI7Ci0KLSAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSByb3V0ZSBsaXN0IGltbWVkaWF0ZWx5IHRvIGF2b2lkIHVubmF0dXJhbCBkaWFsb2cgY2hhbmdlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX1JPVVRFU19ERUxBWV9NUyA9IDMwMEw7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1JPVVRFUyA9IDE7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtUm91dGVzOwotICAgIHByaXZhdGUgUm91dGVBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWRUb1dpbmRvdzsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RVcGRhdGVUaW1lOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1JPVVRFUzoKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUm91dGVzKChMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4pIG1lc3NhZ2Uub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOwotICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGZpbHRlciB0aGUgc2V0IG9mIHJvdXRlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBvdmVyIGFsbCByb3V0ZXMgaW4gdGhlIHByb3ZpZGVkIGxpc3QgYW5kCi0gICAgICogcmVtb3ZlcyB0aG9zZSBmb3Igd2hpY2gge0BsaW5rICNvbkZpbHRlclJvdXRlfSByZXR1cm5zIGZhbHNlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZXMgVGhlIGxpc3Qgb2Ygcm91dGVzIHRvIGZpbHRlciBpbi1wbGFjZSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkZpbHRlclJvdXRlcyhATm9uTnVsbCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSByb3V0ZXMuc2l6ZSgpOyBpLS0gPiAwOyApIHsKLSAgICAgICAgICAgIGlmICghb25GaWx0ZXJSb3V0ZShyb3V0ZXMuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgIHJvdXRlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgZm9yIGVuYWJsZWQgbm9uLWRlZmF1bHQgcm91dGVzIHRoYXQKLSAgICAgKiBtYXRjaCB0aGUgc2VsZWN0b3IuICBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgcm91dGVzCi0gICAgICogZGlmZmVyZW50bHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBjb25zaWRlciwgbmV2ZXIgbnVsbC4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gb25GaWx0ZXJSb3V0ZShATm9uTnVsbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLmlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgJiYgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7Ci0gICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoaW50IHRpdGxlSWQpIHsKLSAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlSWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChnZXRDb250ZXh0KCksIEFwaUhlbHBlci5nZXRMaWJUaGVtZShnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGdldENvbnRleHQoKSkpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2Nob29zZXJfZGlhbG9nKSk7Ci0KLSAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtQWRhcHRlciA9IG5ldyBSb3V0ZUFkYXB0ZXIoZ2V0Q29udGV4dCgpLCBtUm91dGVzKTsKLSAgICAgICAgbUxpc3RWaWV3ID0gKExpc3RWaWV3KWZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfbGlzdCk7Ci0gICAgICAgIG1MaXN0Vmlldy5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKLSAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobUFkYXB0ZXIpOwotICAgICAgICBtTGlzdFZpZXcuc2V0RW1wdHlWaWV3KGZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuZW1wdHkpKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfdGl0bGUpOwotCi0gICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBnZXRXaW5kb3coKS5zZXRMYXlvdXQoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXREaWFsb2dXaWR0aChnZXRDb250ZXh0KCkpLAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gdHJ1ZTsKLSAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfUk9VVEVTKTsKLQotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2hlcyB0aGUgbGlzdCBvZiByb3V0ZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGNob29zZXIgZGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gbmV3IEFycmF5TGlzdDw+KG1Sb3V0ZXIuZ2V0Um91dGVzKCkpOwotICAgICAgICAgICAgb25GaWx0ZXJSb3V0ZXMocm91dGVzKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocm91dGVzLCBSb3V0ZUNvbXBhcmF0b3Iuc0luc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1MYXN0VXBkYXRlVGltZSA+PSBVUERBVEVfUk9VVEVTX0RFTEFZX01TKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUm91dGVzKHJvdXRlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfUk9VVEVTKTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19VUERBVEVfUk9VVEVTLCByb3V0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RVcGRhdGVUaW1lICsgVVBEQVRFX1JPVVRFU19ERUxBWV9NUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVJvdXRlcyhMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtUm91dGVzLmNsZWFyKCk7Ci0gICAgICAgIG1Sb3V0ZXMuYWRkQWxsKHJvdXRlcyk7Ci0gICAgICAgIG1BZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSb3V0ZUFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPgotICAgICAgICAgICAgaW1wbGVtZW50cyBMaXN0Vmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtRGVmYXVsdEljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVR2SWNvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtU3BlYWtlckljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVNwZWFrZXJHcm91cEljb247Ci0KLSAgICAgICAgcHVibGljIFJvdXRlQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIHJvdXRlcyk7Ci0KLSAgICAgICAgICAgIFR5cGVkQXJyYXkgc3R5bGVkQXR0cmlidXRlcyA9IEFwaUhlbHBlci5nZXRMaWJUaGVtZShjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIG1EZWZhdWx0SWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMCk7Ci0gICAgICAgICAgICBtVHZJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgxKTsKLSAgICAgICAgICAgIG1TcGVha2VySWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMik7Ci0gICAgICAgICAgICBtU3BlYWtlckdyb3VwSWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMyk7Ci0gICAgICAgICAgICBzdHlsZWRBdHRyaWJ1dGVzLnJlY3ljbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcmVBbGxJdGVtc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldEl0ZW0ocG9zaXRpb24pLmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQoZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlRoZW1lKGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGdldENvbnRleHQoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY2hvb3Nlcl9saXN0X2l0ZW0sIHBhcmVudCwgZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFRleHRWaWV3IHRleHQxID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfbmFtZSk7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0MiA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX2Rlc2MpOwotICAgICAgICAgICAgdGV4dDEuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcm91dGUuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcgPQotICAgICAgICAgICAgICAgICAgICByb3V0ZS5nZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJvdXRlLmdldENvbm5lY3Rpb25TdGF0ZSgpID09IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZE9yQ29ubmVjdGluZyAmJiAhVGV4dFV0aWxzLmlzRW1wdHkoZGVzY3JpcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgdGV4dDEuc2V0R3Jhdml0eShHcmF2aXR5LkJPVFRPTSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFRleHQoZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZXh0MS5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWV3LnNldEVuYWJsZWQocm91dGUuaXNFbmFibGVkKCkpOwotCi0gICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfaWNvbik7Ci0gICAgICAgICAgICBpZiAoaWNvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUoZ2V0SWNvbkRyYXdhYmxlKHJvdXRlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIHJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0SWNvbkRyYXdhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgVXJpIGljb25VcmkgPSByb3V0ZS5nZXRJY29uVXJpKCk7Ci0gICAgICAgICAgICBpZiAoaWNvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbklucHV0U3RyZWFtKGljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IERyYXdhYmxlLmNyZWF0ZUZyb21TdHJlYW0oaXMsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gbG9hZCAiICsgaWNvblVyaSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZhbGxzIGJhY2suCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJY29uRHJhd2FibGUocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXREZWZhdWx0SWNvbkRyYXdhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBpcyBzcGVjaWZpZWQsIHVzZSBpdC4KLSAgICAgICAgICAgIHN3aXRjaCAocm91dGUuZ2V0RGV2aWNlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkRFVklDRV9UWVBFX1RWOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVR2SWNvbjsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUm91dGVyLlJvdXRlSW5mby5ERVZJQ0VfVFlQRV9TUEVBS0VSOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWFrZXJJY29uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGJlc3QgZ3Vlc3MgYmFzZWQgb24gb3RoZXIgcm91dGUgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgLy8gT25seSBzcGVha2VycyBjYW4gYmUgZ3JvdXBlZCBmb3Igbm93LgotICAgICAgICAgICAgICAgIHJldHVybiBtU3BlYWtlckdyb3VwSWNvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdEljb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUm91dGVDb21wYXJhdG9yIHNJbnN0YW5jZSA9IG5ldyBSb3V0ZUNvbXBhcmF0b3IoKTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyBsaHMsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByaHMpIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmhzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWU2YjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcwotICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBtRGlhbG9nOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUoYXJncy5nZXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGRpYWxvZyA9IChNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZylnZXREaWFsb2coKTsKLSAgICAgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgb25DcmVhdGVDaG9vc2VyRGlhbG9nKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNob29zZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBtRGlhbG9nLnNldFJvdXRlU2VsZWN0b3IoZ2V0Um91dGVTZWxlY3RvcigpKTsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2c7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGNmY2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1BBVVNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZX1BBVVNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9TVE9QOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbkNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFNZXRhZGF0YUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcuZ3JhcGhpY3MuUGFsZXR0ZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25TZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNsYXRlQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0Vmlldy5PdmVybGF5T2JqZWN0OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZvciB7QGxpbmsgTWVkaWFSb3V0ZXJ9LgotICogPHA+Ci0gKiBUaGlzIGRpYWxvZyBhbGxvd3MgdGhlIHVzZXIgdG8gY29udHJvbCBvciBkaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBleHRlbmRzIEFsZXJ0RGlhbG9nIHsKLSAgICAvLyBUYWdzIHNob3VsZCBiZSBsZXNzIHRoYW4gMjQgY2hhcmFjdGVycyBsb25nIChzZWUgZG9jcyBmb3IgYW5kcm9pZC51dGlsLkxvZy5pc0xvZ2dhYmxlKCkpCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUN0cmxEaWFsb2ciOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgLy8gVGltZSB0byB3YWl0IGJlZm9yZSB1cGRhdGluZyB0aGUgdm9sdW1lIHdoZW4gdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2VlayBiYXIKLSAgICAvLyB0byBhbGxvdyB0aGUgcm91dGUgcHJvdmlkZXIgdGltZSB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZSBhbmQgcHVibGlzaCBhIG5ldwotICAgIC8vIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfVVBEQVRFX0RFTEFZX01JTExJUyA9IDUwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMgPSAoaW50KSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwTCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX05FVVRSQUxfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9TVE9QX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24xOwotCi0gICAgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0KLSAgICBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ3JlYXRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0KLSAgICBwcml2YXRlIGludCBtRGlhbG9nQ29udGVudFdpZHRoOwotCi0gICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21Db250cm9sVmlldzsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1EaXNjb25uZWN0QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1TdG9wQ2FzdGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5YmFja0NvbnRyb2xCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQ2xvc2VCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b247Ci0KLSAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1FeHBhbmRhYmxlQXJlYUxheW91dDsKLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtRGlhbG9nQXJlYUxheW91dDsKLSAgICBGcmFtZUxheW91dCBtRGVmYXVsdENvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtQ3VzdG9tQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIEltYWdlVmlldyBtQXJ0VmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVJvdXRlTmFtZVRleHRWaWV3OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCA9IHRydWU7Ci0gICAgLy8gTGF5b3V0IGZvciBtZWRpYSBjb250cm9sbGVycyBpbmNsdWRpbmcgcGxheS9wYXVzZSBidXR0b24gYW5kIHRoZSBtYWluIHZvbHVtZSBzbGlkZXIuCi0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBSZWxhdGl2ZUxheW91dCBtUGxheWJhY2tDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1Wb2x1bWVDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgVmlldyBtRGl2aWRlclZpZXc7Ci0KLSAgICBPdmVybGF5TGlzdFZpZXcgbVZvbHVtZUdyb3VwTGlzdDsKLSAgICBWb2x1bWVHcm91cEFkYXB0ZXIgbVZvbHVtZUdyb3VwQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXM7Ci0gICAgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQ7Ci0gICAgcHJpdmF0ZSBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkOwotICAgIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXA7Ci0gICAgU2Vla0JhciBtVm9sdW1lU2xpZGVyOwotICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcjsKLSAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkOwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcDsKLSAgICBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBTZWVrQmFyPiBtVm9sdW1lU2xpZGVyTWFwOwotCi0gICAgTWVkaWFDb250cm9sbGVyQ29tcGF0IG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgbUNvbnRyb2xsZXJDYWxsYmFjazsKLSAgICBQbGF5YmFja1N0YXRlQ29tcGF0IG1TdGF0ZTsKLSAgICBNZWRpYURlc2NyaXB0aW9uQ29tcGF0IG1EZXNjcmlwdGlvbjsKLQotICAgIEZldGNoQXJ0VGFzayBtRmV0Y2hBcnRUYXNrOwotICAgIEJpdG1hcCBtQXJ0SWNvbkJpdG1hcDsKLSAgICBVcmkgbUFydEljb25Vcmk7Ci0gICAgYm9vbGVhbiBtQXJ0SWNvbklzTG9hZGVkOwotICAgIEJpdG1hcCBtQXJ0SWNvbkxvYWRlZEJpdG1hcDsKLSAgICBpbnQgbUFydEljb25CYWNrZ3JvdW5kQ29sb3I7Ci0KLSAgICBib29sZWFuIG1IYXNQZW5kaW5nVXBkYXRlOwotICAgIGJvb2xlYW4gbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQ7Ci0KLSAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpbmc7Ci0gICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nOwotICAgIGludCBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NczsKLSAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NczsKLSAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXM7Ci0KLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotCi0gICAgZmluYWwgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotCi0gICAgUnVubmFibGUgbUdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOwotICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtQ29udHJvbGxlckNhbGxiYWNrID0gbmV3IE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCk7Ci0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShtQ29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0gICAgICAgIG1Sb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBzZXRNZWRpYVNlc3Npb24obVJvdXRlci5nZXRNZWRpYVNlc3Npb25Ub2tlbigpKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3AgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3ApOwotICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChBY2Nlc3NpYmlsaXR5TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3IgPSBBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKAotICAgICAgICAgICAgICAgIG1Db250ZXh0LCBhbmRyb2lkLlIuaW50ZXJwb2xhdG9yLmxpbmVhcl9vdXRfc2xvd19pbik7Ci0gICAgICAgIG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcigKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgYW5kcm9pZC5SLmludGVycG9sYXRvci5mYXN0X291dF9zbG93X2luKTsKLSAgICAgICAgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yID0gbmV3IEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUgdGhhdCB0aGlzIGRpYWxvZyBpcyBjb250cm9sbGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGdldFJvdXRlKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBnZXRHcm91cCgpIHsKLSAgICAgICAgaWYgKG1Sb3V0ZSBpbnN0YW5jZW9mIE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgbVJvdXRlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIHRoZSBzdWJjbGFzcyBhbiBvcHBvcnR1bml0eSB0byBjcmVhdGUgYSB2aWV3IHRoYXQgd2lsbCByZXBsYWNlIHRoZSBkZWZhdWx0IG1lZGlhCi0gICAgICogY29udHJvbHMgZm9yIHRoZSBjdXJyZW50bHkgcGxheWluZyBjb250ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBUaGUgZGlhbG9nJ3Mgc2F2ZWQgaW5zdGFuY2Ugc3RhdGUuCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgY29udHJvbCB2aWV3LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXcgb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgY29udHJvbCB2aWV3IHRoYXQgd2FzIGNyZWF0ZWQgYnkge0BsaW5rICNvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoQnVuZGxlKX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBjb250cm9sIHZpZXcsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmlldyBnZXRNZWRpYUNvbnRyb2xWaWV3KCkgewotICAgICAgICByZXR1cm4gbUN1c3RvbUNvbnRyb2xWaWV3OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgdGhlIHZvbHVtZSBzbGlkZXIgYW5kIHZvbHVtZSBjb250cm9sIHVzaW5nIHRoZSB2b2x1bWUga2V5cwotICAgICAqIHdoZW4gdGhlIHJvdXRlIHN1cHBvcnRzIGl0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNvbnRyb2xFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtVm9sdW1lQ29udHJvbEVuYWJsZWQgIT0gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtVm9sdW1lQ29udHJvbEVuYWJsZWQgPSBlbmFibGU7Ci0gICAgICAgICAgICBpZiAobUNyZWF0ZWQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdm9sdW1lIHNsaWRlciBhbmQgdm9sdW1lIGNvbnRyb2wgdXNpbmcgdGhlIHZvbHVtZSBrZXlzCi0gICAgICogd2hlbiB0aGUgcm91dGUgc3VwcG9ydHMgaXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWb2x1bWVDb250cm9sRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLiBUaGUgZGlhbG9nCi0gICAgICogd2lsbCBsaXN0ZW4gdG8gY2hhbmdlcyBvbiB0aGlzIHNlc3Npb24gYW5kIHVwZGF0ZSB0aGUgVUkgYXV0b21hdGljYWxseSBpbgotICAgICAqIHJlc3BvbnNlIHRvIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vzc2lvblRva2VuIFRoZSB0b2tlbiBmb3IgdGhlIHNlc3Npb24gdG8gdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb24oTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIHNlc3Npb25Ub2tlbikgewotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnVucmVnaXN0ZXJDYWxsYmFjayhtQ29udHJvbGxlckNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXNzaW9uVG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG5ldyBNZWRpYUNvbnRyb2xsZXJDb21wYXQobUNvbnRleHQsIHNlc3Npb25Ub2tlbik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjcmVhdGluZyBtZWRpYSBjb250cm9sbGVyIGluIHNldE1lZGlhU2Vzc2lvbi4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSA9IG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgICAgICA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBtU3RhdGUgPSBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOwotICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlUmVzb3VyY2UoYW5kcm9pZC5SLmNvbG9yLnRyYW5zcGFyZW50KTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtQ29udGV4dCwKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliVGhlbWUobUNvbnRleHQsIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChtQ29udGV4dCkpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IpKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIG5ldXRyYWwgYnV0dG9uLgotICAgICAgICBmaW5kVmlld0J5SWQoQlVUVE9OX05FVVRSQUxfUkVTX0lEKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDbGlja0xpc3RlbmVyKCk7Ci0KLSAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZXhwYW5kYWJsZV9hcmVhKTsKLSAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbURpYWxvZ0FyZWFMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9kaWFsb2dfYXJlYSk7Ci0gICAgICAgIG1EaWFsb2dBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgLy8gRWF0IHVuaGFuZGxlZCB0b3VjaCBldmVudHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpbnQgY29sb3IgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldEJ1dHRvblRleHRDb2xvcihtQ29udGV4dCk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uID0gZmluZFZpZXdCeUlkKEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCkpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRUZXh0Q29sb3IoY29sb3IpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbiA9IGZpbmRWaWV3QnlJZChCVVRUT05fU1RPUF9SRVNfSUQpOwotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmcpKTsKLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldFRleHRDb2xvcihjb2xvcik7Ci0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1Sb3V0ZU5hbWVUZXh0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX25hbWUpOwotICAgICAgICBtQ2xvc2VCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jbG9zZSk7Ci0gICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2N1c3RvbV9jb250cm9sKTsKLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZGVmYXVsdF9jb250cm9sKTsKLQotICAgICAgICAvLyBTdGFydCB0aGUgc2Vzc2lvbiBhY3Rpdml0eSB3aGVuIGEgY29udGVudCBpdGVtIChhbGJ1bSBhcnQsIHRpdGxlIG9yIHN1YnRpdGxlKSBpcyBjbGlja2VkLgotICAgICAgICBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBvbkNsaWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuc2VuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgcGkgKyAiIHdhcyBub3Qgc2VudCwgaXQgaGFkIGJlZW4gY2FuY2VsZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1BcnRWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfYXJ0KTsKLSAgICAgICAgbUFydFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG9uQ2xpY2tMaXN0ZW5lcik7Ci0gICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfdGl0bGVfY29udGFpbmVyKS5zZXRPbkNsaWNrTGlzdGVuZXIob25DbGlja0xpc3RlbmVyKTsKLQotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX21lZGlhX21haW5fY29udHJvbCk7Ci0gICAgICAgIG1EaXZpZGVyVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfZGl2aWRlcik7Ci0KLSAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3BsYXliYWNrX2NvbnRyb2wpOwotICAgICAgICBtVGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF90aXRsZSk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3N1YnRpdGxlKTsKLSAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfcGxheWJhY2tfY3RybCk7Ci0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9jb250cm9sKTsKLSAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICBtVm9sdW1lU2xpZGVyID0gZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0VGFnKG1Sb3V0ZSk7Ci0gICAgICAgIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWb2x1bWVDaGFuZ2VMaXN0ZW5lcigpOwotICAgICAgICBtVm9sdW1lU2xpZGVyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcik7Ci0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9ncm91cF9saXN0KTsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIgPSBuZXcgVm9sdW1lR3JvdXBBZGFwdGVyKG1Wb2x1bWVHcm91cExpc3QuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcyk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0QWRhcHRlcihtVm9sdW1lR3JvdXBBZGFwdGVyKTsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcCA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1Wb2x1bWVHcm91cExpc3QsIGdldEdyb3VwKCkgIT0gbnVsbCk7Ci0gICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0Vm9sdW1lU2xpZGVyQ29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIG1Wb2x1bWVTbGlkZXIsIG1NZWRpYU1haW5Db250cm9sTGF5b3V0KTsKLSAgICAgICAgbVZvbHVtZVNsaWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQobVJvdXRlLCBtVm9sdW1lU2xpZGVyKTsKLQotICAgICAgICBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbiA9Ci0gICAgICAgICAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQubXJfZ3JvdXBfZXhwYW5kX2NvbGxhcHNlKTsKLSAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID0gIW1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwRXhwYW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvYWRJbnRlcnBvbGF0b3IoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBsb2FkSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgIG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICBSLmludGVnZXIubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9hbmltYXRpb25fZHVyYXRpb25fbXMpOwotICAgICAgICBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9pbl9kdXJhdGlvbl9tcyk7Ci0gICAgICAgIG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9vdXRfZHVyYXRpb25fbXMpOwotCi0gICAgICAgIG1DdXN0b21Db250cm9sVmlldyA9IG9uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LmFkZFZpZXcobUN1c3RvbUNvbnRyb2xWaWV3KTsKLSAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgICAgICBtQ3JlYXRlZCA9IHRydWU7Ci0gICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBpbnQgd2lkdGggPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldERpYWxvZ1dpZHRoKG1Db250ZXh0KTsKLSAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KHdpZHRoLCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0KLSAgICAgICAgVmlldyBkZWNvclZpZXcgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKLSAgICAgICAgbURpYWxvZ0NvbnRlbnRXaWR0aCA9IHdpZHRoIC0gZGVjb3JWaWV3LmdldFBhZGRpbmdMZWZ0KCkgLSBkZWNvclZpZXcuZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0KLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0KTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQpOwotCi0gICAgICAgIC8vIEZldGNoIGFydCBpY29ucyBhZ2FpbiBmb3IgbGF5b3V0IGNoYW5nZXMgdG8gcmVzaXplIGl0IGFjY29yZGluZ2x5Ci0gICAgICAgIG1BcnRJY29uQml0bWFwID0gbnVsbDsKLSAgICAgICAgbUFydEljb25VcmkgPSBudWxsOwotICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKLSAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0KLSAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFksIG1DYWxsYmFjaywKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG1Sb3V0ZXIuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG51bGwpOwotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgotICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApIHsKLSAgICAgICAgICAgIG1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTiA/IC0xIDogMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOCi0gICAgICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBEZWZlciBkaWFsb2cgdXBkYXRlcyBpZiBhIHVzZXIgaXMgYWRqdXN0aW5nIGEgdm9sdW1lIGluIHRoZSBsaXN0Ci0gICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhhc1BlbmRpbmdVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQgfD0gYW5pbWF0ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtSGFzUGVuZGluZ1VwZGF0ZSA9IGZhbHNlOwotICAgICAgICBtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoIW1Sb3V0ZS5pc1NlbGVjdGVkKCkgfHwgbVJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKLSAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1DcmVhdGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtUm91dGVOYW1lVGV4dFZpZXcuc2V0VGV4dChtUm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VmlzaWJpbGl0eShtUm91dGUuY2FuRGlzY29ubmVjdCgpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIG1BcnRJY29uSXNMb2FkZWQpIHsKLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKG1BcnRJY29uTG9hZGVkQml0bWFwKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IHNldCBhcnR3b3JrIGltYWdlIHdpdGggcmVjeWNsZWQgYml0bWFwOiAiICsgbUFydEljb25Mb2FkZWRCaXRtYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRJbWFnZUJpdG1hcChtQXJ0SWNvbkxvYWRlZEJpdG1hcCk7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1BcnRJY29uQmFja2dyb3VuZENvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVm9sdW1lQ29udHJvbExheW91dCgpOwotICAgICAgICB1cGRhdGVQbGF5YmFja0NvbnRyb2xMYXlvdXQoKTsKLSAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JpdG1hcFJlY3ljbGVkKEJpdG1hcCBiaXRtYXApIHsKLSAgICAgICAgcmV0dXJuIGJpdG1hcCAhPSBudWxsICYmIGJpdG1hcC5pc1JlY3ljbGVkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiAobURlc2NyaXB0aW9uICE9IG51bGwgfHwgbVN0YXRlICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiBtYWluIG1lZGlhIGNvbnRyb2xsZXIgd2hpY2ggaW5jbHVkZXMgcGxheWJhY2sgY29udHJvbCBhbmQgbWFzdGVyCi0gICAgICogdm9sdW1lIGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TWFpbkNvbnRyb2xsZXJIZWlnaHQoYm9vbGVhbiBzaG93UGxheWJhY2tDb250cm9sKSB7Ci0gICAgICAgIGludCBoZWlnaHQgPSAwOwotICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCB8fCBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBoZWlnaHQgKz0gbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ1RvcCgpCi0gICAgICAgICAgICAgICAgICAgICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ0JvdHRvbSgpOwotICAgICAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgKz0gIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCAmJiBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1EaXZpZGVyVmlldy5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWlnaHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkoYm9vbGVhbiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSB7Ci0gICAgICAgIC8vIFRPRE86IFVwZGF0ZSB0aGUgdG9wIGFuZCBib3R0b20gcGFkZGluZyBvZiB0aGUgY29udHJvbCBsYXlvdXQgYWNjb3JkaW5nIHRvIHRoZSBkaXNwbGF5Ci0gICAgICAgIC8vIGhlaWdodC4KLSAgICAgICAgbURpdmlkZXJWaWV3LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUKLSAgICAgICAgICAgICAgICAmJiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUKLSAgICAgICAgICAgICAgICAmJiAhY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgPyBWaWV3LkdPTkUgOiBWaWV3LlZJU0lCTEUpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlTGF5b3V0SGVpZ2h0KGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZmVyIHRoZSB1cGRhdGUgdW50aWwgdGhlIGZpcnN0IGxheW91dCBoYXMgb2NjdXJyZWQsIGFzIHdlIGRvbid0IHlldCBrbm93IHRoZQotICAgICAgICAvLyBvdmVyYWxsIHZpc2libGUgZGlzcGxheSBzaXplIGluIHdoaWNoIHRoZSB3aW5kb3cgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvIGhhcyBiZWVuCi0gICAgICAgIC8vIHBvc2l0aW9uZWQgaW4uCi0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGFuaW1hdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgaGVpZ2h0IG9mIHZpZXdzIGFuZCBoaWRlIGFydHdvcmsgb3IgbWV0YWRhdGEgaWYgc3BhY2UgaXMgbGltaXRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBNZWFzdXJlIHRoZSBzaXplIG9mIHdpZGdldHMgYW5kIGdldCB0aGUgaGVpZ2h0IG9mIG1haW4gY29tcG9uZW50cy4KLSAgICAgICAgaW50IG9sZEhlaWdodCA9IGdldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCk7Ci0gICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7Ci0gICAgICAgIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0gICAgICAgIGRlY29yVmlldy5tZWFzdXJlKAotICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhnZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAotICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBvbGRIZWlnaHQpOwotICAgICAgICBpbnQgYXJ0Vmlld0hlaWdodCA9IDA7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpIGluc3RhbmNlb2YgQml0bWFwRHJhd2FibGUpIHsKLSAgICAgICAgICAgIEJpdG1hcCBhcnQgPSAoKEJpdG1hcERyYXdhYmxlKSBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpKS5nZXRCaXRtYXAoKTsKLSAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSBnZXREZXNpcmVkQXJ0SGVpZ2h0KGFydC5nZXRXaWR0aCgpLCBhcnQuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFNjYWxlVHlwZShhcnQuZ2V0V2lkdGgoKSA+PSBhcnQuZ2V0SGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfWFkgOiBJbWFnZVZpZXcuU2NhbGVUeXBlLkZJVF9DRU5URVIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7Ci0gICAgICAgIGludCB2b2x1bWVHcm91cExpc3RDb3VudCA9IG1Hcm91cE1lbWJlclJvdXRlcy5zaXplKCk7Ci0gICAgICAgIC8vIFNjYWxlIGRvd24gdm9sdW1lIGdyb3VwIGxpc3QgaXRlbXMgaW4gbGFuZHNjYXBlIG1vZGUuCi0gICAgICAgIGludCBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA9IGdldEdyb3VwKCkgPT0gbnVsbCA/IDAgOgotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0ICogZ2V0R3JvdXAoKS5nZXRSb3V0ZXMoKS5zaXplKCk7Ci0gICAgICAgIGlmICh2b2x1bWVHcm91cExpc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ICs9IG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wOwotICAgICAgICB9Ci0gICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ID0gTWF0aC5taW4oZXhwYW5kZWRHcm91cExpc3RIZWlnaHQsIG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQpOwotICAgICAgICBpbnQgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCA9IG1Jc0dyb3VwRXhwYW5kZWQgPyBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA6IDA7Ci0KLSAgICAgICAgaW50IGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OwotICAgICAgICBSZWN0IHZpc2libGVSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICAgICAgZGVjb3JWaWV3LmdldFdpbmRvd1Zpc2libGVEaXNwbGF5RnJhbWUodmlzaWJsZVJlY3QpOwotICAgICAgICAvLyBIZWlnaHQgb2Ygbm9uLWNvbnRyb2wgdmlld3MgaW4gZGVjb3Igdmlldy4KLSAgICAgICAgLy8gVGhpcyBpbmNsdWRlcyB0aXRsZSBiYXIsIGJ1dHRvbiBiYXIsIGFuZCBkaWFsb2cncyB2ZXJ0aWNhbCBwYWRkaW5nIHdoaWNoIHNob3VsZCBiZQotICAgICAgICAvLyBhbHdheXMgc2hvd24uCi0gICAgICAgIGludCBub25Db250cm9sVmlld0hlaWdodCA9IG1EaWFsb2dBcmVhTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAtIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAvLyBNYXhpbXVtIGFsbG93ZWQgaGVpZ2h0IGZvciBjb250cm9scyB0byBmaXQgc2NyZWVuLgotICAgICAgICBpbnQgbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0ID0gdmlzaWJsZVJlY3QuaGVpZ2h0KCkgLSBub25Db250cm9sVmlld0hlaWdodDsKLQotICAgICAgICAvLyBTaG93IGFydHdvcmsgaWYgaXQgZml0cyB0aGUgc2NyZWVuLgotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgYXJ0Vmlld0hlaWdodCA+IDAKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtQXJ0VmlldywgYXJ0Vmlld0hlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QpICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICA+PSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSAwOwotICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0ICsgbWFpbkNvbnRyb2xsZXJIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2hvdyB0aGUgcGxheWJhY2sgY29udHJvbCBpZiBpdCBmaXRzIHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpOwotICAgICAgICBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KAotICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OwotCi0gICAgICAgIC8vIExpbWl0IHRoZSB2b2x1bWUgZ3JvdXAgbGlzdCBoZWlnaHQgdG8gZml0IHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA+IG1heGltdW1Db250cm9sVmlld0hlaWdodCkgewotICAgICAgICAgICAgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCAtPSAoZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgLSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpOwotICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBsYXlvdXRzIHdpdGggdGhlIGNvbXB1dGVkIGhlaWdodHMuCi0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIGlmIChhbmltYXRlKSB7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtYWluQ29udHJvbGxlckhlaWdodCk7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOwotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtRGVmYXVsdENvbnRyb2xMYXlvdXQsIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgbWFpbkNvbnRyb2xsZXJIZWlnaHQpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1EZWZhdWx0Q29udHJvbExheW91dCwgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE1heGltaXplIHRoZSB3aW5kb3cgc2l6ZSB3aXRoIGEgdHJhbnNwYXJlbnQgbGF5b3V0IGluIGFkdmFuY2UgZm9yIHNtb290aCBhbmltYXRpb24uCi0gICAgICAgIHNldExheW91dEhlaWdodChtRXhwYW5kYWJsZUFyZWFMYXlvdXQsIHZpc2libGVSZWN0LmhlaWdodCgpKTsKLSAgICAgICAgcmVidWlsZFZvbHVtZUdyb3VwTGlzdChhbmltYXRlKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodChWaWV3IGl0ZW0pIHsKLSAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KGNvbnRhaW5lciwgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQpOwotICAgICAgICBWaWV3IGljb24gPSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9pdGVtX2ljb24pOwotICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gaWNvbi5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgbHAud2lkdGggPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgICAgICBscC5oZWlnaHQgPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgICAgICBpY29uLnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVMYXlvdXRIZWlnaHQoZmluYWwgVmlldyB2aWV3LCBpbnQgdGFyZ2V0SGVpZ2h0KSB7Ci0gICAgICAgIGZpbmFsIGludCBzdGFydFZhbHVlID0gZ2V0TGF5b3V0SGVpZ2h0KHZpZXcpOwotICAgICAgICBmaW5hbCBpbnQgZW5kVmFsdWUgPSB0YXJnZXRIZWlnaHQ7Ci0gICAgICAgIEFuaW1hdGlvbiBhbmltID0gbmV3IEFuaW1hdGlvbigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IHN0YXJ0VmFsdWUgLSAoaW50KSAoKHN0YXJ0VmFsdWUgLSBlbmRWYWx1ZSkgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKLSAgICAgICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQodmlldywgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgYW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAyMSkgewotICAgICAgICAgICAgYW5pbS5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltKTsKLSAgICB9Ci0KLSAgICB2b2lkIGxvYWRJbnRlcnBvbGF0b3IoKSB7Ci0gICAgICAgIG1JbnRlcnBvbGF0b3IgPQotICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPyBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yIDogbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVZvbHVtZUNvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUobVJvdXRlKSkgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRNYXgobVJvdXRlLmdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKG1Sb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0VmlzaWJpbGl0eShnZXRHcm91cCgpID09IG51bGwgPyBWaWV3LkdPTkUKLSAgICAgICAgICAgICAgICAgICAgICAgIDogVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWJ1aWxkVm9sdW1lR3JvdXBMaXN0KGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gZ2V0R3JvdXAoKSA9PSBudWxsID8gbnVsbCA6IGdldEdyb3VwKCkuZ2V0Um91dGVzKCk7Ci0gICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5saXN0VW5vcmRlcmVkRXF1YWxzKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKSkgewotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSGFzaE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCA9IGFuaW1hdGUKLSAgICAgICAgICAgICAgICAgICAgPyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1Cb3VuZE1hcChtVm9sdW1lR3JvdXBMaXN0LCBtVm9sdW1lR3JvdXBBZGFwdGVyKQotICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgICBIYXNoTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXAgPSBhbmltYXRlCi0gICAgICAgICAgICAgICAgICAgID8gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtQml0bWFwTWFwKG1Db250ZXh0LCBtVm9sdW1lR3JvdXBMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIpIDogbnVsbDsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtc0FkZGVkKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1zUmVtb3ZlZChtR3JvdXBNZW1iZXJSb3V0ZXMsCi0gICAgICAgICAgICAgICAgICAgIHJvdXRlcyk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMuYWRkQWxsKDAsIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5yZW1vdmVBbGwobUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCk7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAoYW5pbWF0ZSAmJiBtSXNHcm91cEV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSArIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGFuaW1hdGVHcm91cExpc3RJdGVtcyhwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zKGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCwKLSAgICAgICAgICAgIGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwKSB7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpbmcgPSB0cnVlOwotICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7Ci0gICAgICAgIG9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25HbG9iYWxMYXlvdXQoKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBhbmltYXRlR3JvdXBMaXN0SXRlbXNJbnRlcm5hbChwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFuaW1hdGVHcm91cExpc3RJdGVtc0ludGVybmFsKAotICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgUmVjdD4gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLAotICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXApIHsKLSAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID09IG51bGwgfHwgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGdyb3VwU2l6ZURlbHRhID0gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuc2l6ZSgpIC0gbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5zaXplKCk7Ci0gICAgICAgIGJvb2xlYW4gbGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc3RhcnRBbmltYXRpb25BbGwoKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnBvc3REZWxheWVkKG1Hcm91cExpc3RGYWRlSW5BbmltYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gQW5pbWF0ZSB2aXNpYmxlIGl0ZW1zIGZyb20gcHJldmlvdXMgcG9zaXRpb25zIHRvIGN1cnJlbnQgcG9zaXRpb25zIGV4Y2VwdCByb3V0ZXMgYWRkZWQKLSAgICAgICAgLy8ganVzdCBiZWZvcmUuIEFkZGVkIHJvdXRlcyB3aWxsIHJlbWFpbiBoaWRkZW4gdW50aWwgdHJhbnNsYXRlIGFuaW1hdGlvbiBmaW5pc2hlcy4KLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBSZWN0IHByZXZpb3VzQm91bmRzID0gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBpbnQgY3VycmVudFRvcCA9IHZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICBpbnQgcHJldmlvdXNUb3AgPSBwcmV2aW91c0JvdW5kcyAhPSBudWxsID8gcHJldmlvdXNCb3VuZHMudG9wCi0gICAgICAgICAgICAgICAgICAgIDogKGN1cnJlbnRUb3AgKyBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCAqIGdyb3VwU2l6ZURlbHRhKTsKLSAgICAgICAgICAgIEFuaW1hdGlvblNldCBhbmltU2V0ID0gbmV3IEFuaW1hdGlvblNldCh0cnVlKTsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIHByZXZpb3VzVG9wID0gY3VycmVudFRvcDsKLSAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24oYWxwaGFBbmltKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFuaW1hdGlvbiB0cmFuc2xhdGlvbkFuaW0gPSBuZXcgVHJhbnNsYXRlQW5pbWF0aW9uKDAsIDAsIHByZXZpb3VzVG9wIC0gY3VycmVudFRvcCwgMCk7Ci0gICAgICAgICAgICB0cmFuc2xhdGlvbkFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24odHJhbnNsYXRpb25BbmltKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICAgICAgaWYgKCFsaXN0ZW5lclJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFuaW1TZXQuc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlldy5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltU2V0KTsKLSAgICAgICAgICAgIHByZXZpb3VzUm91dGVCb3VuZE1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICAgICAgcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgYSBtZW1iZXIgcm91dGUgZG9lc24ndCBleGlzdCBhbnkgbG9uZ2VyLCBpdCBjYW4gYmUgZWl0aGVyIHJlbW92ZWQgb3IgbW92ZWQgb3V0IG9mIHRoZQotICAgICAgICAvLyBMaXN0VmlldyBsYXlvdXQgYm91bmRhcnkuIEluIHRoaXMgY2FzZSwgdXNlIHRoZSBwcmV2aW91c2x5IGNhcHR1cmVkIGJpdG1hcHMgZm9yCi0gICAgICAgIC8vIGFuaW1hdGlvbi4KLSAgICAgICAgZm9yIChNYXAuRW50cnk8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gaXRlbQotICAgICAgICAgICAgICAgIDogcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBpdGVtLmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgQml0bWFwRHJhd2FibGUgYml0bWFwID0gaXRlbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgUmVjdCBib3VuZHMgPSBwcmV2aW91c1JvdXRlQm91bmRNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBkZWx0YVkgPSBncm91cFNpemVEZWx0YSAqIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0OwotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGRlbHRhWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbmltYXRpb25FbmRMaXN0ZW5lcihuZXcgT3ZlcmxheU9iamVjdC5PbkFuaW1hdGlvbkVuZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmFkZE92ZXJsYXlPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb24oKSB7Ci0gICAgICAgIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKHRydWUpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb25JbnRlcm5hbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uSW50ZXJuYWwoKSB7Ci0gICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBmYWRlSW5BZGRlZFJvdXRlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hBbmltYXRpb24oYm9vbGVhbiBhbmltYXRlKSB7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0gbnVsbDsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7Ci0gICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZykgewotICAgICAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOwotICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmFkZUluQWRkZWRSb3V0ZXMoKSB7Ci0gICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KLSAgICAgICAgfTsKLSAgICAgICAgYm9vbGVhbiBsaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAxLjBmKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGJvb2xlYW4gZXhjZXB0QWRkZWRSb3V0ZXMpIHsKLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoZXhjZXB0QWRkZWRSb3V0ZXMgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgQW5pbWF0aW9uU2V0IGFuaW1TZXQgPSBuZXcgQW5pbWF0aW9uU2V0KHRydWUpOwotICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAxLjBmKTsKLSAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICBBbmltYXRpb24gdHJhbnNsYXRpb25BbmltID0gbmV3IFRyYW5zbGF0ZUFuaW1hdGlvbigwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHRyYW5zbGF0aW9uQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbVNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zdG9wQW5pbWF0aW9uQWxsKCk7Ci0gICAgICAgIGlmICghZXhjZXB0QWRkZWRSb3V0ZXMpIHsKLSAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tDb250cm9sTGF5b3V0KCkgewotICAgICAgICBpZiAoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0VGl0bGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpOwotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3VidGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0U3VidGl0bGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzU3VidGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkoc3VidGl0bGUpOwotCi0gICAgICAgICAgICBib29sZWFuIHNob3dUaXRsZSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBzaG93U3VidGl0bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtUm91dGUuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkKLSAgICAgICAgICAgICAgICAgICAgIT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBjdXJyZW50bHkgY2FzdGluZyBzY3JlZW4uCi0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4pKTsKLSAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gbnVsbCB8fCBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBTaG93ICJObyBtZWRpYSBzZWxlY3RlZCIgYXMgd2UgZG9uJ3QgeWV0IGtub3cgdGhlIHBsYXliYWNrIHN0YXRlLgotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1RpdGxlICYmICFoYXNTdWJ0aXRsZSkgewotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1RpdGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoYXNTdWJ0aXRsZSkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQoc3VidGl0bGUpOwotICAgICAgICAgICAgICAgICAgICBzaG93U3VidGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShzaG93VGl0bGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KHNob3dTdWJ0aXRsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9CVUZGRVJJTkcKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICBDb250ZXh0IHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQgPSBtUGxheWJhY2tDb250cm9sQnV0dG9uLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGludCBpY29uRHJhd2FibGVBdHRyID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgaWNvbkRlc2NSZXNJZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlUGF1c2VEcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGF1c2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlU3RvcERyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpY29uRHJhd2FibGVBdHRyID0gUi5hdHRyLm1lZGlhUm91dGVQbGF5RHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BsYXk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0VGhlbWVSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQsIGljb25EcmF3YWJsZUF0dHIpKTsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tDb250cm9sQnV0dG9uQ29udGV4dC5nZXRSZXNvdXJjZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoaWNvbkRlc2NSZXNJZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIChBQ1RJT05fUExBWSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgKEFDVElPTl9QQVVTRSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiBBQ1RJT05fU1RPUCkgIT0gMDsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCAmJiByb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpCi0gICAgICAgICAgICAgICAgPT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldykgewotICAgICAgICByZXR1cm4gdmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldywgaW50IGhlaWdodCkgewotICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgbHAuaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB2aWV3LnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1cmlFcXVhbHMoVXJpIHVyaTEsIFVyaSB1cmkyKSB7Ci0gICAgICAgIGlmICh1cmkxICE9IG51bGwgJiYgdXJpMS5lcXVhbHModXJpMikpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHVyaTEgPT0gbnVsbCAmJiB1cmkyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGRlc2lyZWQgYXJ0IGhlaWdodCB0byBmaXQgaW50byBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RGVzaXJlZEFydEhlaWdodChpbnQgb3JpZ2luYWxXaWR0aCwgaW50IG9yaWdpbmFsSGVpZ2h0KSB7Ci0gICAgICAgIGlmIChvcmlnaW5hbFdpZHRoID49IG9yaWdpbmFsSGVpZ2h0KSB7Ci0gICAgICAgICAgICAvLyBGb3IgbGFuZHNjYXBlIGFydCwgZml0IHdpZHRoIHRvIGRpYWxvZyB3aWR0aC4KLSAgICAgICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogb3JpZ2luYWxIZWlnaHQgLyBvcmlnaW5hbFdpZHRoICsgMC41Zik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRm9yIHBvcnRyYWl0IGFydCwgZml0IGhlaWdodCB0byAxNjo5IHJhdGlvIGNhc2UncyBoZWlnaHQuCi0gICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogOSAvIDE2ICsgMC41Zik7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKSB7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgIT0gbnVsbCB8fCAhaXNJY29uQ2hhbmdlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1GZXRjaEFydFRhc2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUZldGNoQXJ0VGFzay5jYW5jZWwodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUZldGNoQXJ0VGFzayA9IG5ldyBGZXRjaEFydFRhc2soKTsKLSAgICAgICAgbUZldGNoQXJ0VGFzay5leGVjdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGJpdG1hcCBsb2FkZWQgYnkgRmV0Y2hBcnRUYXNrLiBXaWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbG9hZGVkIGJpdG1hcHMgYXJlIGFwcGxpZWQKLSAgICAgKiB0byBhcnR3b3JrLCBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICovCi0gICAgdm9pZCBjbGVhckxvYWRlZEJpdG1hcCgpIHsKLSAgICAgICAgbUFydEljb25Jc0xvYWRlZCA9IGZhbHNlOwotICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IG51bGw7Ci0gICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuZXcgYXJ0IGltYWdlIGlzIGRpZmZlcmVudCBmcm9tIGFuIG9yaWdpbmFsIGFydCBpbWFnZS4gQ29tcGFyZXMKLSAgICAgKiBCaXRtYXAgb2JqZWN0cyBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZXMgVVJJcyBvbmx5IGlmIGJpdG1hcCBpcyB1bmNoYW5nZWQgd2l0aAotICAgICAqIGEgbnVsbCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJY29uQ2hhbmdlZCgpIHsKLSAgICAgICAgQml0bWFwIG5ld0JpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgIFVyaSBuZXdVcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOwotICAgICAgICBCaXRtYXAgb2xkQml0bWFwID0gbUZldGNoQXJ0VGFzayA9PSBudWxsID8gbUFydEljb25CaXRtYXAgOiBtRmV0Y2hBcnRUYXNrLmdldEljb25CaXRtYXAoKTsKLSAgICAgICAgVXJpIG9sZFVyaSA9IG1GZXRjaEFydFRhc2sgPT0gbnVsbCA/IG1BcnRJY29uVXJpIDogbUZldGNoQXJ0VGFzay5nZXRJY29uVXJpKCk7Ci0gICAgICAgIGlmIChvbGRCaXRtYXAgIT0gbmV3Qml0bWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvbGRCaXRtYXAgPT0gbnVsbCAmJiAhdXJpRXF1YWxzKG9sZFVyaSwgbmV3VXJpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgdXBkYXRlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBTZWVrQmFyIHZvbHVtZVNsaWRlciA9IG1Wb2x1bWVTbGlkZXJNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIGludCB2b2x1bWUgPSByb3V0ZS5nZXRWb2x1bWUoKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUm91dGVWb2x1bWVDaGFuZ2VkKCksIHJvdXRlLmdldFZvbHVtZToiICsgdm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2b2x1bWVTbGlkZXIgIT0gbnVsbCAmJiBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3Modm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXJDb21wYXQuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25EZXN0cm95ZWQoKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci51bnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlQ29tcGF0IHN0YXRlKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSkgewotICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7Ci0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGlja0xpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgewotICAgICAgICBDbGlja0xpc3RlbmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgaWQgPSB2LmdldElkKCk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEIHx8IGlkID09IEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCkgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGUuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXIudW5zZWxlY3QoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jb250cm9sX3BsYXliYWNrX2N0cmwpIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsICYmIG1TdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uRGVzY1Jlc0lkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wYXVzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3N0b3A7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wbGF5OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFubm91bmNlIHRoZSBhY3Rpb24gZm9yIGFjY2Vzc2liaWxpdHkuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eU1hbmFnZXIgIT0gbnVsbCAmJiBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3Rpb25EZXNjUmVzSWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Q29tcGF0LlRZUEVfQU5OT1VOQ0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhhY3Rpb25EZXNjUmVzSWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jbG9zZSkgewotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU3RvcFRyYWNraW5nVG91Y2ggPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IYXNQZW5kaW5nVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUobVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5yZW1vdmVDYWxsYmFja3MobVN0b3BUcmFja2luZ1RvdWNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCA9IChNZWRpYVJvdXRlci5Sb3V0ZUluZm8pIHNlZWtCYXIuZ2V0VGFnKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIC8vIERlZmVyIHJlc2V0dGluZyBtVm9sdW1lU2xpZGVyVG91Y2hlZCB0byBhbGxvdyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGEgbGl0dGxlIHRpbWUgdG8gc2V0dGxlIGludG8gaXRzIG5ldyBzdGF0ZSBhbmQgcHVibGlzaCB0aGUgZmluYWwKLSAgICAgICAgICAgIC8vIHZvbHVtZSB1cGRhdGUuCi0gICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2tpbmdUb3VjaCwgVk9MVU1FX1VQREFURV9ERUxBWV9NSUxMSVMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICBpZiAoZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSAoTWVkaWFSb3V0ZXIuUm91dGVJbmZvKSBzZWVrQmFyLmdldFRhZygpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblByb2dyZXNzQ2hhbmdlZCgpOiBjYWxsaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYVJvdXRlci5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZSgiICsgcHJvZ3Jlc3MgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHByb2dyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lR3JvdXBBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gewotICAgICAgICBmaW5hbCBmbG9hdCBtRGlzYWJsZWRBbHBoYTsKLQotICAgICAgICBwdWJsaWMgVm9sdW1lR3JvdXBBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG9iamVjdHMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIG9iamVjdHMpOwotICAgICAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoZmluYWwgaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBWaWV3IHYgPSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2ID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShwYXJlbnQuZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY29udHJvbGxlcl92b2x1bWVfaXRlbSwgcGFyZW50LCBmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodCh2KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAocm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkID0gcm91dGUuaXNFbmFibGVkKCk7Ci0KLSAgICAgICAgICAgICAgICBUZXh0VmlldyByb3V0ZU5hbWUgPSAoVGV4dFZpZXcpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgcm91dGVOYW1lLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICByb3V0ZU5hbWUuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciB2b2x1bWVTbGlkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRWb2x1bWVTbGlkZXJDb2xvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRDb250ZXh0KCksIHZvbHVtZVNsaWRlciwgbVZvbHVtZUdyb3VwTGlzdCk7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFRhZyhyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQocm91dGUsIHZvbHVtZVNsaWRlcik7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEhpZGVUaHVtYighaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIGlmIChpc0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRNYXgocm91dGUuZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKHJvdXRlLmdldFZvbHVtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtVm9sdW1lQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldE1heCgxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJbWFnZVZpZXcgdm9sdW1lSXRlbUljb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKEltYWdlVmlldykgdi5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfaXRlbV9pY29uKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVJdGVtSWNvbi5zZXRBbHBoYShpc0VuYWJsZWQgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSkpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgb3ZlcmxheSBiaXRtYXAgZXhpc3RzLCByZWFsIHZpZXcgc2hvdWxkIHJlbWFpbiBoaWRkZW4gdW50aWwKLSAgICAgICAgICAgICAgICAvLyB0aGUgYW5pbWF0aW9uIGVuZHMuCi0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIHYuZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmNvbnRhaW5zKHJvdXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSb3V0ZXMgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHdpbGwgYmUgaW52aXNpYmxlIHVudGlsIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgdi5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB2LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEZldGNoQXJ0VGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBCaXRtYXA+IHsKLSAgICAgICAgLy8gU2hvdyBhbmltYXRpb24gb25seSB3aGVuIGZldGNoaW5nIHRha2VzIGEgbG9uZyB0aW1lLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMgPSAxMjBMOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1JY29uQml0bWFwOwotICAgICAgICBwcml2YXRlIGZpbmFsIFVyaSBtSWNvblVyaTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWVNaWxsaXM7Ci0KLSAgICAgICAgRmV0Y2hBcnRUYXNrKCkgewotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChiaXRtYXApKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZmV0Y2ggdGhlIGdpdmVuIGFydCBiaXRtYXAgYmVjYXVzZSBpdCdzIGFscmVhZHkgcmVjeWNsZWQuIik7Ci0gICAgICAgICAgICAgICAgYml0bWFwID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JY29uQml0bWFwID0gYml0bWFwOwotICAgICAgICAgICAgbUljb25VcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJpdG1hcCBnZXRJY29uQml0bWFwKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uQml0bWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlRXhlY3V0ZSgpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIEJpdG1hcCBkb0luQmFja2dyb3VuZChWb2lkLi4uIGFyZykgewotICAgICAgICAgICAgQml0bWFwIGFydCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUljb25CaXRtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFydCA9IG1JY29uQml0bWFwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtSWNvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbSA9IG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKG1JY29uVXJpKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBRdWVyeSBhcnQgc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5KdXN0RGVjb2RlQm91bmRzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oc3RyZWFtLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub3V0V2lkdGggPT0gMCB8fCBvcHRpb25zLm91dEhlaWdodCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgdGhlIHN0cmVhbSBpbiBvcmRlciB0byByZXN0YXJ0IGFydCBkZWNvZGluZy4KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsZWQgdG8gcmV3aW5kIHRoZSBzdHJlYW0sIHRyeSB0byByZW9wZW4gaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtID0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUobUljb25VcmkpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHJlcXVpcmVkIHNpemUgdG8gZGVjb2RlIHRoZSBhcnQgYW5kIHBvc3NpYmx5IHJlc2l6ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbkp1c3REZWNvZGVCb3VuZHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlcUhlaWdodCA9IGdldERlc2lyZWRBcnRIZWlnaHQob3B0aW9ucy5vdXRXaWR0aCwgb3B0aW9ucy5vdXRIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmF0aW8gPSBvcHRpb25zLm91dEhlaWdodCAvIHJlcUhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pblNhbXBsZVNpemUgPSBNYXRoLm1heCgxLCBJbnRlZ2VyLmhpZ2hlc3RPbmVCaXQocmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFydCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmksIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKGFydCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCB1c2UgcmVjeWNsZWQgYml0bWFwOiAiICsgYXJ0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCAmJiBhcnQuZ2V0V2lkdGgoKSA8IGFydC5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIC8vIFBvcnRyYWl0IGFydCByZXF1aXJlcyBkb21pbmFudCBjb2xvciBhcyBiYWNrZ3JvdW5kIGNvbG9yLgotICAgICAgICAgICAgICAgIFBhbGV0dGUgcGFsZXR0ZSA9IG5ldyBQYWxldHRlLkJ1aWxkZXIoYXJ0KS5tYXhpbXVtQ29sb3JDb3VudCgxKS5nZW5lcmF0ZSgpOwotICAgICAgICAgICAgICAgIG1CYWNrZ3JvdW5kQ29sb3IgPSBwYWxldHRlLmdldFN3YXRjaGVzKCkuaXNFbXB0eSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IDAgOiBwYWxldHRlLmdldFN3YXRjaGVzKCkuZ2V0KDApLmdldFJnYigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEJpdG1hcCBhcnQpIHsKLSAgICAgICAgICAgIG1GZXRjaEFydFRhc2sgPSBudWxsOwotICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvbkJpdG1hcCwgbUljb25CaXRtYXApCi0gICAgICAgICAgICAgICAgICAgIHx8ICFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvblVyaSwgbUljb25VcmkpKSB7Ci0gICAgICAgICAgICAgICAgbUFydEljb25CaXRtYXAgPSBtSWNvbkJpdG1hcDsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IGFydDsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvblVyaSA9IG1JY29uVXJpOwotICAgICAgICAgICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gbUJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbklzTG9hZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb25nIGVsYXBzZWRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtU3RhcnRUaW1lTWlsbGlzOwotICAgICAgICAgICAgICAgIC8vIExvYWRlZCBiaXRtYXAgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBuZXh0IHVwZGF0ZQotICAgICAgICAgICAgICAgIHVwZGF0ZShlbGFwc2VkVGltZU1pbGxpcyA+IFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShVcmkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UuZXF1YWxzKHNjaGVtZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5ULmVxdWFscyhzY2hlbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfRklMRS5lcXVhbHMoc2NoZW1lKSkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRDb25uZWN0VGltZW91dChDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgICAgICAgICBjb25uLnNldFJlYWRUaW1lb3V0KENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMpOwotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoc3RyZWFtID09IG51bGwpID8gbnVsbCA6IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVkNzRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcwotICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBtRGlhbG9nOwotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbnRyb2xsZXIgZGlhbG9nIGlzIGJlaW5nIGNyZWF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHRoZSBkaWFsb2cuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2coCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZyhnZXRDb250ZXh0KCksIHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cuY2xlYXJHcm91cExpc3RBbmltYXRpb24oZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWFmMzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbWVkaWEgcm91dGUKLSAqIGNob29zZXIgYW5kIGNvbnRyb2xsZXIgZGlhbG9ncyBhcyBuZWVkZWQuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VzdG9taXplIHRoZSBkaWFsb2dzIGJ5IHByb3ZpZGluZyBhIHN1YmNsYXNzIG9mIHRoZQotICogZGlhbG9nIGZhY3RvcnkgdG8gdGhlIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uI3NldERpYWxvZ0ZhY3Rvcnkgc2V0RGlhbG9nRmFjdG9yeX0gbWV0aG9kLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHNEZWZhdWx0ID0gbmV3IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCBmYWN0b3J5IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHNEZWZhdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYWJmN2IuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyIHsKLSAgICAvKioKLSAgICAgKiBUaGUgZnJhbWV3b3JrIHNob3VsZCBzZXQgdGhlIGRpYWxvZyB3aWR0aCBwcm9wZXJseSwgYnV0IHNvbWVob3cgaXQgZG9lc24ndCB3b3JrLCBoZW5jZQotICAgICAqIGR1cGxpY2F0aW5nIGEgc2ltaWxhciBsb2dpYyBoZXJlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZGlhbG9nIHdpZHRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERpYWxvZ1dpZHRoKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBib29sZWFuIGlzUG9ydHJhaXQgPSBtZXRyaWNzLndpZHRoUGl4ZWxzIDwgbWV0cmljcy5oZWlnaHRQaXhlbHM7Ci0KLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0VmFsdWUoaXNQb3J0cmFpdAotICAgICAgICAgICAgICAgID8gUi5kaW1lbi5tcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IKLSAgICAgICAgICAgICAgICA6IFIuZGltZW4ubXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIGlmICh2YWx1ZS50eXBlID09IFR5cGVkVmFsdWUuVFlQRV9ESU1FTlNJT04pIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXREaW1lbnNpb24obWV0cmljcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRlJBQ1RJT04pIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXRGcmFjdGlvbihtZXRyaWNzLndpZHRoUGl4ZWxzLCBtZXRyaWNzLndpZHRoUGl4ZWxzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdDEgQSBsaXN0Ci0gICAgICogQHBhcmFtIGxpc3QyIEEgbGlzdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSBsaXN0MX0KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdHdvIGxpc3RzIGhhdmUgZXhhY3RseSBzYW1lIGl0ZW1zIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGxpc3RVbm9yZGVyZWRFcXVhbHMoTGlzdDxFPiBsaXN0MSwgTGlzdDxFPiBsaXN0MikgewotICAgICAgICBIYXNoU2V0PEU+IHNldDEgPSBuZXcgSGFzaFNldDw+KGxpc3QxKTsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQyID0gbmV3IEhhc2hTZXQ8PihsaXN0Mik7Ci0gICAgICAgIHJldHVybiBzZXQxLmVxdWFscyhzZXQyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gbGlzdHMgYW5kIHJldHVybnMgYSBzZXQgb2YgaXRlbXMgd2hpY2ggZXhpc3QKLSAgICAgKiBhZnRlci1saXN0IGJ1dCBiZWZvcmUtbGlzdCwgd2hpY2ggbWVhbnMgbmV3bHkgYWRkZWQgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAotICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQotICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgbmV3bHkgYWRkZWQgaXRlbXMgd2hpbGUKLSAgICAgKiBjb21wYXJpbmcge0Bjb2RlIGFmdGVyfSB0byB7QGNvZGUgYmVmb3JlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gZ2V0SXRlbXNBZGRlZChMaXN0PEU+IGJlZm9yZSwgTGlzdDxFPiBhZnRlcikgewotICAgICAgICBIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PD4oYWZ0ZXIpOwotICAgICAgICBzZXQucmVtb3ZlQWxsKGJlZm9yZSk7Ci0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIGFuZCByZXR1cm5zIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGV4aXN0Ci0gICAgICogYmVmb3JlLWxpc3QgYnV0IGFmdGVyLWxpc3QsIHdoaWNoIG1lYW5zIHJlbW92ZWQgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAotICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQotICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgcmVtb3ZlZCBpdGVtcyB3aGlsZQotICAgICAqIGNvbXBhcmluZyB7QGNvZGUgYWZ0ZXJ9IHRvIHtAY29kZSBiZWZvcmV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBnZXRJdGVtc1JlbW92ZWQoTGlzdDxFPiBiZWZvcmUsIExpc3Q8RT4gYWZ0ZXIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KGJlZm9yZSk7Ci0gICAgICAgIHNldC5yZW1vdmVBbGwoYWZ0ZXIpOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLVJlY3QgbWFwIHdoaWNoIGluZGljYXRlcyB3aGVyZSBtZW1iZXIKLSAgICAgKiBpdGVtcyBhcmUgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gTGlzdFZpZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdFZpZXcgQSBsaXN0IHZpZXcKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhcnJheSBhZGFwdGVyIHdoaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGl0ZW1zLgotICAgICAqIEByZXR1cm4gQSBtYXAgb2YgaXRlbXMgYW5kIGJvdW5kcyBvZiB0aGVpciB2aWV3cyBsb2NhdGVkIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBSZWN0PiBnZXRJdGVtQm91bmRNYXAoTGlzdFZpZXcgbGlzdFZpZXcsCi0gICAgICAgICAgICBBcnJheUFkYXB0ZXI8RT4gYWRhcHRlcikgewotICAgICAgICBIYXNoTWFwPEUsIFJlY3Q+IGl0ZW1Cb3VuZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOwotICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpdGVtQm91bmRNYXAucHV0KGl0ZW0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHZpZXcuZ2V0TGVmdCgpLCB2aWV3LmdldFRvcCgpLCB2aWV3LmdldFJpZ2h0KCksIHZpZXcuZ2V0Qm90dG9tKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbUJvdW5kTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLUJpdG1hcERyYXdhYmxlIG1hcCB3aGljaCBzdG9yZXMgc25hcHNob3RzCi0gICAgICogb2YgbWVtYmVyIGl0ZW1zIGluIHRoZSBnaXZlbiBMaXN0Vmlldy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dAotICAgICAqIEBwYXJhbSBsaXN0VmlldyBBIGxpc3QgdmlldwotICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFycmF5IGFkYXB0ZXIgd2hpY2ggY29udGFpbnMgYW4gYXJyYXkgb2YgaXRlbXMuCi0gICAgICogQHJldHVybiBBIG1hcCBvZiBpdGVtcyBhbmQgc25hcHNob3RzIG9mIHRoZWlyIHZpZXdzIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gZ2V0SXRlbUJpdG1hcE1hcChDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBMaXN0VmlldyBsaXN0VmlldywgQXJyYXlBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLSAgICAgICAgSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gaXRlbUJpdG1hcE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOwotICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpdGVtQml0bWFwTWFwLnB1dChpdGVtLCBnZXRWaWV3Qml0bWFwKGNvbnRleHQsIHZpZXcpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbUJpdG1hcE1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCaXRtYXBEcmF3YWJsZSBnZXRWaWV3Qml0bWFwKENvbnRleHQgY29udGV4dCwgVmlldyB2aWV3KSB7Ci0gICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHZpZXcuZ2V0V2lkdGgoKSwgdmlldy5nZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7Ci0gICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7Ci0gICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICByZXR1cm4gbmV3IEJpdG1hcERyYXdhYmxlKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCksIGJpdG1hcCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWUxMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgZGlzY292ZXJ5IGZyYWdtZW50LgotICogPHA+Ci0gKiBUaGlzIGZyYWdtZW50IHRha2VzIGNhcmUgb2YgcmVnaXN0ZXJpbmcgYSBjYWxsYmFjayBmb3IgbWVkaWEgcm91dGUgZGlzY292ZXJ5Ci0gKiBkdXJpbmcgdGhlIHtAbGluayBGcmFnbWVudCNvblN0YXJ0IG9uU3RhcnQoKX0gcGhhc2UKLSAqIGFuZCByZW1vdmluZyBpdCBkdXJpbmcgdGhlIHtAbGluayBGcmFnbWVudCNvblN0b3Agb25TdG9wKCl9IHBoYXNlLgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3VwcGx5IGEgcm91dGUgc2VsZWN0b3IgdG8gc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzCi0gKiB0byBkaXNjb3Zlci4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyBvdmVycmlkZSB7QGxpbmsgI29uQ3JlYXRlQ2FsbGJhY2t9IHRvCi0gKiBwcm92aWRlIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXJ9IGNhbGxiYWNrIHRvIHJlZ2lzdGVyLgotICogPC9wPjxwPgotICogTm90ZSB0aGF0IHRoZSBkaXNjb3ZlcnkgY2FsbGJhY2sgbWFrZXMgdGhlIGFwcGxpY2F0aW9uIGJlIGNvbm5lY3RlZCB3aXRoIGFsbCB0aGUKLSAqIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlc30KLSAqIHdoaWxlIGl0IGlzIHJlZ2lzdGVyZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGVyIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlciBnZXRNZWRpYVJvdXRlcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVyKCk7Ci0gICAgICAgIHJldHVybiBtUm91dGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXIoKSB7Ci0gICAgICAgIGlmIChtUm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShnZXRDb250ZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRvIGJlIGRpc2NvdmVyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdG8gYmUgZGlzY292ZXJlZC4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZyYWdtZW50IGlzIGFkZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MucHV0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SLCBzZWxlY3Rvci5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgIHNldEFyZ3VtZW50cyhhcmdzKTsKLQotICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKGFyZ3MuZ2V0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gY3JlYXRlIHRoZSB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIGNhbGxiYWNrfQotICAgICAqIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGNhbGxiYWNrIGRvZXMgbm90aGluZy4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KLSAgICAgKiBzdXBwbHkgaXRzIG93biBjYWxsYmFjay4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY2FsbGJhY2ssIG9yIG51bGwgaWYgbm8gY2FsbGJhY2sgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVyLkNhbGxiYWNrIG9uQ3JlYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7IH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIHByZXBhcmUgdGhlIGNhbGxiYWNrIGZsYWdzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFja30gaXMgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkZXNpcmVkIGNhbGxiYWNrIGZsYWdzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgc3VwZXIub25TdGFydCgpOwotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgZW5zdXJlUm91dGVyKCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG9uQ3JlYXRlQ2FsbGJhY2soKTsKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwYTk1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuQ29udGV4dENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotLyoqCi0gKiBDaGV2cm9uL0NhcmV0IGJ1dHRvbiB0byBleHBhbmQvY29sbGFwc2UgZ3JvdXAgdm9sdW1lIGxpc3Qgd2l0aCBhbmltYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gZXh0ZW5kcyBJbWFnZUJ1dHRvbiB7Ci0gICAgZmluYWwgQW5pbWF0aW9uRHJhd2FibGUgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlOwotICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlOwotICAgIGZpbmFsIFN0cmluZyBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbjsKLSAgICBmaW5hbCBTdHJpbmcgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbjsKLSAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgT25DbGlja0xpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm1yX2dyb3VwX2V4cGFuZCk7Ci0gICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9jb2xsYXBzZSk7Ci0KLSAgICAgICAgQ29sb3JGaWx0ZXIgZmlsdGVyID0gbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCBkZWZTdHlsZUF0dHIpLAotICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pOwotICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKLQotICAgICAgICBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXApOwotICAgICAgICBtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwKTsKLQotICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5nZXRGcmFtZSgwKSk7Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgc3VwZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA9ICFtSXNHcm91cEV4cGFuZGVkOwotICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cEV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEltYWdlRHJhd2FibGUobUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKG1FeHBhbmRHcm91cERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNsaWNrKHZpZXcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVkMjBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotCi0vKioKLSAqIFZvbHVtZSBzbGlkZXIgd2l0aCBzaG93aW5nLCBoaWRpbmcsIGFuZCBhcHBseWluZyBhbHBoYSBzdXBwb3J0cyB0byB0aGUgdGh1bWIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIGV4dGVuZHMgU2Vla0JhciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIjsKLQotICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURpc2FibGVkQWxwaGE7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhpZGVUaHVtYjsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1UaHVtYjsKLSAgICBwcml2YXRlIGludCBtQ29sb3I7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKLSAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKLSAgICAgICAgaW50IGFscGhhID0gaXNFbmFibGVkKCkgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSk7Ci0KLSAgICAgICAgLy8gVGhlIHRodW1iIGRyYXdhYmxlIGlzIGEgY29sbGVjdGlvbiBvZiBkcmF3YWJsZXMgYW5kIGl0cyBjdXJyZW50IGRyYXdhYmxlcyBhcmUgY2hhbmdlZCBwZXIKLSAgICAgICAgLy8gc3RhdGUuIEFwcGx5IHRoZSBjb2xvciBmaWx0ZXIgYW5kIGFscGhhIG9uIGV2ZXJ5IHN0YXRlIGNoYW5nZS4KLSAgICAgICAgaWYgKG1UaHVtYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGh1bWIuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgICAgIG1UaHVtYi5zZXRBbHBoYShhbHBoYSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRQcm9ncmVzc0RyYXdhYmxlKCkuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldEFscGhhKGFscGhhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRUaHVtYihEcmF3YWJsZSB0aHVtYikgewotICAgICAgICBtVGh1bWIgPSB0aHVtYjsKLSAgICAgICAgc3VwZXIuc2V0VGh1bWIobUhpZGVUaHVtYiA/IG51bGwgOiBtVGh1bWIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBzaG93IG9yIGhpZGUgdGh1bWIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGlkZVRodW1iKGJvb2xlYW4gaGlkZVRodW1iKSB7Ci0gICAgICAgIGlmIChtSGlkZVRodW1iID09IGhpZGVUaHVtYikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1IaWRlVGh1bWIgPSBoaWRlVGh1bWI7Ci0gICAgICAgIHN1cGVyLnNldFRodW1iKG1IaWRlVGh1bWIgPyBudWxsIDogbVRodW1iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2b2x1bWUgc2xpZGVyIGNvbG9yLiBUaGUgY2hhbmdlIHRha2VzIGVmZmVjdCBuZXh0IHRpbWUgZHJhd2FibGUgc3RhdGUgaXMgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29sb3IgY2Fubm90IGJlIHRyYW5zbHVjZW50LCBvdGhlcndpc2UgdGhlIHVuZGVybHlpbmcgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgc2VlbiB0aHJvdWdoCi0gICAgICogdGhlIHRodW1iLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgaWYgKG1Db2xvciA9PSBjb2xvcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDb2xvci5hbHBoYShjb2xvcikgIT0gMHhGRikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVm9sdW1lIHNsaWRlciBjb2xvciBjYW5ub3QgYmUgdHJhbnNsdWNlbnQ6ICMiICsgSW50ZWdlci50b0hleFN0cmluZyhjb2xvcikpOwotICAgICAgICB9Ci0gICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjA0MmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuQ29sb3JVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOX0NPTlRSQVNUID0gMy4wZjsKLQotICAgIEBJbnREZWYoe0NPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCwgQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5EfSkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENvbnRyb2xsZXJDb2xvclR5cGUge30KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EID0gMHhERTAwMDAwMDsgLyogT3BhY2l0eSBvZiA4NyUgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORCA9IENvbG9yLldISVRFOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlclRoZW1lSGVscGVyKCkgewotICAgIH0KLQotICAgIHN0YXRpYyBDb250ZXh0IGNyZWF0ZVRoZW1lZEJ1dHRvbkNvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIEFwcGx5IGJhc2UgTWVkaWEgUm91dGVyIHRoZW1lLgotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSk7Ci0KLSAgICAgICAgLy8gQXBwbHkgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZS4KLSAgICAgICAgaW50IHN0eWxlID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKTsKLSAgICAgICAgaWYgKHN0eWxlICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBzdHlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgYXJlIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24uIFRoZXkgc2hvdWxkIGJlIHVzZWQgdG8gcHJlcGFyZQotICAgICAqIHRoZSBjb250ZXh0IGFuZCB0aGVtZSBmb3IgYSBzdXBlciBjbGFzcyBjb25zdHJ1Y3RvciAodGhlIGxhdHRlciBtZXRob2QgcmVsaWVzIG9uIHRoZQotICAgICAqIGZvcm1lciBtZXRob2QgdG8gcHJvcGVybHkgcHJlcGFyZSB0aGUgY29udGV4dCk6Ci0gICAgICogICBzdXBlcihjb250ZXh0ID0gY3JlYXRlVGhlbWVkRGlhbG9nQ29udGV4dChjb250ZXh0LCB0aGVtZSksCi0gICAgICogICAgICAgICAgIGNyZWF0ZVRoZW1lZERpYWxvZ1N0eWxlKGNvbnRleHQpKTsKLSAgICAgKgotICAgICAqIEl0IHdpbGwgYXBwbHkgdGhlbWUgaW4gdGhlIGZvbGxvd2luZyBvcmRlciAoc3R5bGUgbG9va3VwcyB3aWxsIGJlIGRvbmUgaW4gcmV2ZXJzZSk6Ci0gICAgICogICAxKSBDdXJyZW50IHRoZW1lCi0gICAgICogICAyKSBTdXBwbGllZCB0aGVtZQotICAgICAqICAgMykgQmFzZSBNZWRpYSBSb3V0ZXIgdGhlbWUKLSAgICAgKiAgIDQpIEN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUsIGlmIHByb3ZpZGVkCi0gICAgICovCi0gICAgc3RhdGljIENvbnRleHQgY3JlYXRlVGhlbWVkRGlhbG9nQ29udGV4dChDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSwgYm9vbGVhbiBhbGVydERpYWxvZykgewotICAgICAgICAvLyAxKSBDdXJyZW50IHRoZW1lIGlzIGFscmVhZHkgYXBwbGllZCB0byB0aGUgY29udGV4dAotCi0gICAgICAgIC8vIDIpIElmIG5vIHRoZW1lIGlzIHN1cHBsaWVkLCBsb29rIGl0IHVwIGZyb20gdGhlIGNvbnRleHQgKGRpYWxvZ1RoZW1lL2FsZXJ0RGlhbG9nVGhlbWUpCi0gICAgICAgIGlmICh0aGVtZSA9PSAwKSB7Ci0gICAgICAgICAgICB0aGVtZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIWFsZXJ0RGlhbG9nID8gYW5kcm9pZC5SLmF0dHIuZGlhbG9nVGhlbWUgOiBhbmRyb2lkLlIuYXR0ci5hbGVydERpYWxvZ1RoZW1lKTsKLSAgICAgICAgfQotICAgICAgICAvLyAgICBBcHBseSBpdAotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgdGhlbWUpOwotCi0gICAgICAgIC8vIDMpIElmIGEgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZSBpcyBwcm92aWRlZCB0aGVuIGFwcGx5IHRoZSBiYXNlIHRoZW1lCi0gICAgICAgIGlmIChnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsIFIuYXR0ci5tZWRpYVJvdXRlVGhlbWUpICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLSAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBtZXRob2QuCi0gICAgc3RhdGljIGludCBjcmVhdGVUaGVtZWREaWFsb2dTdHlsZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gNCkgQXBwbHkgdGhlIGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUKLSAgICAgICAgaW50IHRoZW1lID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKTsKLSAgICAgICAgaWYgKHRoZW1lID09IDApIHsKLSAgICAgICAgICAgIC8vIDMpIE5vIGN1c3RvbSBNZWRpYVJvdXRlciB0aGVtZSB3YXMgcHJvdmlkZWQgc28gYXBwbHkgdGhlIGJhc2UgdGhlbWUgaW5zdGVhZAotICAgICAgICAgICAgdGhlbWUgPSBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoZW1lOwotICAgIH0KLSAgICAvLyBFTkQuIFByZXZpb3VzIHR3byBtZXRob2RzIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uLgotCi0gICAgc3RhdGljIGludCBnZXRUaGVtZVJlc291cmNlKENvbnRleHQgY29udGV4dCwgaW50IGF0dHIpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhdHRyLCB2YWx1ZSwgdHJ1ZSkgPyB2YWx1ZS5yZXNvdXJjZUlkIDogMDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmxvYXQgZ2V0RGlzYWJsZWRBbHBoYShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhbmRyb2lkLlIuYXR0ci5kaXNhYmxlZEFscGhhLCB2YWx1ZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICA/IHZhbHVlLmdldEZsb2F0KCkgOiAwLjVmOwotICAgIH0KLQotICAgIHN0YXRpYyBAQ29udHJvbGxlckNvbG9yVHlwZSBpbnQgZ2V0Q29udHJvbGxlckNvbG9yKENvbnRleHQgY29udGV4dCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIGludCBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIHN0eWxlLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IDApIHsKLSAgICAgICAgICAgIHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgc3R5bGUsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7Ci0gICAgICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSAweEZGMDAwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChDb2xvclV0aWxzLmNhbGN1bGF0ZUNvbnRyYXN0KENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORCwgcHJpbWFyeUNvbG9yKQotICAgICAgICAgICAgICAgID49IE1JTl9DT05UUkFTVCkgewotICAgICAgICAgICAgcmV0dXJuIENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0QnV0dG9uVGV4dENvbG9yKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvckJhY2tncm91bmQpOwotCi0gICAgICAgIGlmIChDb2xvclV0aWxzLmNhbGN1bGF0ZUNvbnRyYXN0KHByaW1hcnlDb2xvciwgYmFja2dyb3VuZENvbG9yKSA8IE1JTl9DT05UUkFTVCkgewotICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjb2xvckFjY2VudCBpZiB0aGUgY29udHJhc3QgcmF0aW8gaXMgbG93LgotICAgICAgICAgICAgcmV0dXJuIGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JBY2NlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmltYXJ5Q29sb3I7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TWVkaWFDb250cm9sc0JhY2tncm91bmRDb2xvcigKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgVmlldyBtYWluQ29udHJvbHMsIFZpZXcgZ3JvdXBDb250cm9scywgYm9vbGVhbiBoYXNHcm91cCkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpbnQgcHJpbWFyeURhcmtDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5RGFyayk7Ci0gICAgICAgIGlmIChoYXNHcm91cCAmJiBnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHNob3dpbmcgZGFyayBjb250cm9scyBpbiBhIHBvc3NpYmx5IGRhcmsgKGkuZS4gdGhlIHByaW1hcnkgZGFyayksIG1vZGVsCi0gICAgICAgICAgICAvLyB0aGUgd2hpdGUgZGlhbG9nIGFuZCB1c2UgdGhlIHByaW1hcnkgY29sb3IgZm9yIHRoZSBncm91cCBjb250cm9scy4KLSAgICAgICAgICAgIHByaW1hcnlEYXJrQ29sb3IgPSBwcmltYXJ5Q29sb3I7Ci0gICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSBDb2xvci5XSElURTsKLSAgICAgICAgfQotICAgICAgICBtYWluQ29udHJvbHMuc2V0QmFja2dyb3VuZENvbG9yKHByaW1hcnlDb2xvcik7Ci0gICAgICAgIGdyb3VwQ29udHJvbHMuc2V0QmFja2dyb3VuZENvbG9yKHByaW1hcnlEYXJrQ29sb3IpOwotICAgICAgICAvLyBBbHNvIHN0b3JlIHRoZSBiYWNrZ3JvdW5kIGNvbG9ycyB0byB0aGUgdmlldyB0YWdzLiBUaGV5IGFyZSB1c2VkIGluCi0gICAgICAgIC8vIHNldFZvbHVtZVNsaWRlckNvbG9yKCkgYmVsb3cuCi0gICAgICAgIG1haW5Db250cm9scy5zZXRUYWcocHJpbWFyeUNvbG9yKTsKLSAgICAgICAgZ3JvdXBDb250cm9scy5zZXRUYWcocHJpbWFyeURhcmtDb2xvcik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0Vm9sdW1lU2xpZGVyQ29sb3IoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgdm9sdW1lU2xpZGVyLCBWaWV3IGJhY2tncm91bmRWaWV3KSB7Ci0gICAgICAgIGludCBjb250cm9sbGVyQ29sb3IgPSBnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCk7Ci0gICAgICAgIGlmIChDb2xvci5hbHBoYShjb250cm9sbGVyQ29sb3IpICE9IDB4RkYpIHsKLSAgICAgICAgICAgIC8vIENvbXBvc2l0ZSB3aXRoIHRoZSBiYWNrZ3JvdW5kIGluIG9yZGVyIG5vdCB0byBzaG93IHRoZSB1bmRlcmx5aW5nIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgdGh1bWIuCi0gICAgICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yID0gKGludCkgYmFja2dyb3VuZFZpZXcuZ2V0VGFnKCk7Ci0gICAgICAgICAgICBjb250cm9sbGVyQ29sb3IgPSBDb2xvclV0aWxzLmNvbXBvc2l0ZUNvbG9ycyhjb250cm9sbGVyQ29sb3IsIGJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdm9sdW1lU2xpZGVyLnNldENvbG9yKGNvbnRyb2xsZXJDb2xvcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpZ2h0VGhlbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICAvLyBUT0RPKHN1bmdzb28pOiBTd2l0Y2ggdG8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmlzTGlnaHRUaGVtZQotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYW5kcm9pZC5zdXBwb3J0LnY3LmFwcGNvbXBhdC5SLmF0dHIuaXNMaWdodFRoZW1lLAotICAgICAgICAgICAgICAgIHZhbHVlLCB0cnVlKSAmJiB2YWx1ZS5kYXRhICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFRoZW1lQ29sb3IoQ29udGV4dCBjb250ZXh0LCBpbnQgc3R5bGUsIGludCBhdHRyKSB7Ci0gICAgICAgIGlmIChzdHlsZSAhPSAwKSB7Ci0gICAgICAgICAgICBpbnRbXSBhdHRycyA9IHsgYXR0ciB9OwotICAgICAgICAgICAgVHlwZWRBcnJheSB0YSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhzdHlsZSwgYXR0cnMpOwotICAgICAgICAgICAgaW50IGNvbG9yID0gdGEuZ2V0Q29sb3IoMCwgMCk7Ci0gICAgICAgICAgICB0YS5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICBpZiAoY29sb3IgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0ciwgdmFsdWUsIHRydWUpOwotICAgICAgICBpZiAodmFsdWUucmVzb3VyY2VJZCAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb2xvcih2YWx1ZS5yZXNvdXJjZUlkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUuZGF0YTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGdldFJvdXRlclRoZW1lSWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGludCB0aGVtZUlkOwotICAgICAgICBpZiAoaXNMaWdodFRoZW1lKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyX0xpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodF9EYXJrQ29udHJvbFBhbmVsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodENvbnRyb2xQYW5lbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoZW1lSWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGRlZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgTGlzdFZpZXcgd2hpY2ggaGFzIGFuIGFkZGl0aW9uYWwgb3ZlcmxheSBsYXllci4ge0BsaW5rIEJpdG1hcERyYXdhYmxlfQotICogY2FuIGJlIGFkZGVkIHRvIHRoZSBsYXllciBhbmQgY2FuIGJlIGFuaW1hdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3ZlcmxheUxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPdmVybGF5T2JqZWN0PiBtT3ZlcmxheU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0IEFuIG9iamVjdCB0byBiZSBhZGRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRPdmVybGF5T2JqZWN0KE92ZXJsYXlPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIG1PdmVybGF5T2JqZWN0cy5hZGQob2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbkFsbCgpIHsKLSAgICAgICAgZm9yIChPdmVybGF5T2JqZWN0IG9iamVjdCA6IG1PdmVybGF5T2JqZWN0cykgewotICAgICAgICAgICAgaWYgKCFvYmplY3QuaXNBbmltYXRpb25TdGFydGVkKCkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3Quc3RhcnRBbmltYXRpb24oZ2V0RHJhd2luZ1RpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wcyBhbGwgYW5pbWF0aW9ucyBvZiBvYmplY3RzIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb25BbGwoKSB7Ci0gICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKLSAgICAgICAgICAgIG9iamVjdC5zdG9wQW5pbWF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1PdmVybGF5T2JqZWN0cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxPdmVybGF5T2JqZWN0PiBpdCA9IG1PdmVybGF5T2JqZWN0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIEJpdG1hcERyYXdhYmxlIGJpdG1hcCA9IG9iamVjdC5nZXRCaXRtYXBEcmF3YWJsZSgpOwotICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBiaXRtYXAuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC51cGRhdGUoZ2V0RHJhd2luZ1RpbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gb2JqZWN0IHRvIGJlIHNob3duIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3ZlcmxheU9iamVjdCB7Ci0gICAgICAgIHByaXZhdGUgQml0bWFwRHJhd2FibGUgbUJpdG1hcDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtQ3VycmVudEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBSZWN0IG1DdXJyZW50Qm91bmRzOwotICAgICAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotICAgICAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uOwotICAgICAgICBwcml2YXRlIFJlY3QgbVN0YXJ0UmVjdDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbURlbHRhWTsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU3RhcnRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbUVuZEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBbmltYXRpb25TdGFydGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uRW5kZWQ7Ci0gICAgICAgIHByaXZhdGUgT25BbmltYXRpb25FbmRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3QoQml0bWFwRHJhd2FibGUgYml0bWFwLCBSZWN0IHN0YXJ0UmVjdCkgewotICAgICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgICAgIG1TdGFydFJlY3QgPSBzdGFydFJlY3Q7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcyA9IG5ldyBSZWN0KHN0YXJ0UmVjdCk7Ci0gICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGJpdG1hcCB0aGF0IHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQml0bWFwRHJhd2FibGUgdGhhdCB0aGlzIG9iamVjdCBoYXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQml0bWFwRHJhd2FibGUgZ2V0Qml0bWFwRHJhd2FibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJpdG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFydGVkIHN0YXR1cyBvZiB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbmltYXRpb25TdGFydGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc0FuaW1hdGlvblN0YXJ0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhbmltYXRpb24gZm9yIHZhcnlpbmcgYWxwaGEuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzdGFydEFscGhhIFN0YXJ0aW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLCB3aGVyZSAxLjAgbWVhbnMKLSAgICAgICAgICogZnVsbHkgb3BhcXVlIGFuZCAwLjAgbWVhbnMgZnVsbHkgdHJhbnNwYXJlbnQuCi0gICAgICAgICAqIEBwYXJhbSBlbmRBbHBoYSBFbmRpbmcgYWxwaGEgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldEFscGhhQW5pbWF0aW9uKGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7Ci0gICAgICAgICAgICBtU3RhcnRBbHBoYSA9IHN0YXJ0QWxwaGE7Ci0gICAgICAgICAgICBtRW5kQWxwaGEgPSBlbmRBbHBoYTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciBtb3Zpbmcgb2JqZWN0cyB2ZXJ0aWNhbGx5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGVsdGFZIERpc3RhbmNlIHRvIG1vdmUgaW4gcGl4ZWxzLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGludCBkZWx0YVkpIHsKLSAgICAgICAgICAgIG1EZWx0YVkgPSBkZWx0YVk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBsYXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgYWNjZWxlcmF0aW9uIGN1cnZlIGZvciB0aGlzIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHdoaWNoIGRlZmluZXMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZQotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgewotICAgICAgICAgICAgbUludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJpbmRzIGFuIGFuaW1hdGlvbiBlbmQgbGlzdGVuZXIgdG8gdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbmltYXRpb25FbmRMaXN0ZW5lcihPbkFuaW1hdGlvbkVuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXJ0cyB0aGUgYW5pbWF0aW9uIGFuZCBzZXRzIHRoZSBzdGFydCB0aW1lLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIFN0YXJ0IHRpbWUgdG8gYmUgc2V0IGluIE1pbGxpcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24obG9uZyBzdGFydFRpbWUpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBzdGFydFRpbWU7Ci0gICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdG9wcyB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcEFuaW1hdGlvbigpIHsKLSAgICAgICAgICAgIG1Jc0FuaW1hdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbUlzQW5pbWF0aW9uRW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBjdXJyZW50IGJvdW5kcyBhbmQgYWxwaGEgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBDdXJyZW50IHRpbWUuaW4gbWlsbGlzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGUobG9uZyBjdXJyZW50VGltZSkgewotICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvbkVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgbm9ybWFsaXplZFRpbWUgPSAoY3VycmVudFRpbWUgLSBtU3RhcnRUaW1lKSAvIChmbG9hdCkgbUR1cmF0aW9uOwotICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBub3JtYWxpemVkVGltZSkpOwotICAgICAgICAgICAgaWYgKCFtSXNBbmltYXRpb25TdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSAwLjBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgaW50ZXJwb2xhdGVkVGltZSA9IChtSW50ZXJwb2xhdG9yID09IG51bGwpID8gbm9ybWFsaXplZFRpbWUKLSAgICAgICAgICAgICAgICAgICAgOiBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24obm9ybWFsaXplZFRpbWUpOwotICAgICAgICAgICAgaW50IGRlbHRhWSA9IChpbnQpIChtRGVsdGFZICogaW50ZXJwb2xhdGVkVGltZSk7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcy50b3AgPSBtU3RhcnRSZWN0LnRvcCArIGRlbHRhWTsKLSAgICAgICAgICAgIG1DdXJyZW50Qm91bmRzLmJvdHRvbSA9IG1TdGFydFJlY3QuYm90dG9tICsgZGVsdGFZOwotICAgICAgICAgICAgbUN1cnJlbnRBbHBoYSA9IG1TdGFydEFscGhhICsgKG1FbmRBbHBoYSAtIG1TdGFydEFscGhhKSAqIGludGVycG9sYXRlZFRpbWU7Ci0gICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvblN0YXJ0ZWQgJiYgbm9ybWFsaXplZFRpbWUgPj0gMS4wZikgewotICAgICAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICFtSXNBbmltYXRpb25FbmRlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhbmltYXRpb24gbGlzdGVuZXIgdGhhdCByZWNlaXZlcyBub3RpZmljYXRpb25zIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkFuaW1hdGlvbkVuZExpc3RlbmVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTm90aWZpZXMgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTM5YmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vLyBAQFJlcXVpcmVzQXBpKDE3KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEiOwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQ2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDYWxsYmFja1Byb3h5PENhbGxiYWNrPihjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KCkgd2FzCi0gICAgICAgICAgICAvLyBhZGRlZCBpbiBBUEkgMTcuIEhvd2V2ZXIsIHNvbWUgZmFjdG9yeSByZWxlYXNlcyBvZiBKQiBNUjEgbWlzc2VkIGl0LgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgZ2V0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGZvciB0aGUgcm91dGUuIiwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSB2ZXJzaW9uIG9mIE1lZGlhUm91dGVyLmFkZENhbGxiYWNrKCkgdGhhdCBhY2NlcHRzIGEKLSAgICAgKiBmbGFnIHRvIHBlcmZvcm0gYW4gYWN0aXZlIHNjYW4gZG9lcyBub3QgZXhpc3QgaW4gSkIgTVIxIHNvIHdlIG5lZWQgdG8gZm9yY2UKLSAgICAgKiB3aWZpIGRpc3BsYXkgc2NhbnMgZGlyZWN0bHkgdGhyb3VnaCB0aGUgRGlzcGxheU1hbmFnZXIuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWN0aXZlU2Nhbldvcmthcm91bmQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIC8vIFRpbWUgYmV0d2VlbiB3aWZpIGRpc3BsYXkgc2NhbnMgd2hlbiBhY3RpdmVseSBzY2FubmluZyBpbiBtaWxsaXNlY29uZHMuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCA9IDE1MDAwOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgRGlzcGxheU1hbmFnZXIgbURpc3BsYXlNYW5hZ2VyOwotICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5czsKLQotICAgICAgICBwdWJsaWMgQWN0aXZlU2Nhbldvcmthcm91bmQoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURpc3BsYXlNYW5hZ2VyID0gKERpc3BsYXlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ESVNQTEFZX1NFUlZJQ0UpOwotICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2NhbldpZmlEaXNwbGF5c01ldGhvZCA9IERpc3BsYXlNYW5hZ2VyLmNsYXNzLmdldE1ldGhvZCgic2NhbldpZmlEaXNwbGF5cyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhpbnQgcm91dGVUeXBlcykgewotICAgICAgICAgICAgLy8gT24gSkIgTVIxLCB0aGVyZSBpcyBubyBBUEkgdG8gc2NhbiB3aWZpIGRpc3BsYXkgcm91dGVzLgotICAgICAgICAgICAgLy8gSW5zdGVhZCB3ZSBtdXN0IG1ha2UgYSBkaXJlY3QgY2FsbCBpbnRvIHRoZSBEaXNwbGF5TWFuYWdlciB0byBzY2FuCi0gICAgICAgICAgICAvLyB3aWZpIGRpc3BsYXlzIG9uIHRoaXMgdmVyc2lvbiBidXQgb25seSB3aGVuIGxpdmUgdmlkZW8gcm91dGVzIGFyZSByZXF1ZXN0ZWQuCi0gICAgICAgICAgICAvLyBTZWUgYWxzbyB0aGUgSmVsbHliZWFuTXIySW1wbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgIC8vIFRoaXMgd2FzIGZpeGVkIGluIEpCIE1SMiBieSBhZGRpbmcgYSBuZXcgb3ZlcmxvYWQgb2YgYWRkQ2FsbGJhY2soKSB0bwotICAgICAgICAgICAgLy8gZW5hYmxlIGFjdGl2ZSBzY2FubmluZyBvbiByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNjYW5XaWZpRGlzcGxheXNNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdCh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzIGJlY2F1c2UgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRGlzcGxheU1hbmFnZXIuc2NhbldpZmlEaXNwbGF5cygpIG1ldGhvZCBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vdCBhdmFpbGFibGUgb24gdGhpcyBkZXZpY2UuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3ModGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kLmludm9rZShtRGlzcGxheU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZCh0aGlzLCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGlzQ29ubmVjdGluZygpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBNUjEuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1HZXRTdGF0dXNDb2RlTWV0aG9kOwotICAgICAgICBwcml2YXRlIGludCBtU3RhdHVzQ29ubmVjdGluZzsKLQotICAgICAgICBwdWJsaWMgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWVsZCBzdGF0dXNDb25uZWN0aW5nRmllbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MuZ2V0RmllbGQoIlNUQVRVU19DT05ORUNUSU5HIik7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0Nvbm5lY3RpbmcgPSBzdGF0dXNDb25uZWN0aW5nRmllbGQuZ2V0SW50KG51bGwpOwotICAgICAgICAgICAgICAgIG1HZXRTdGF0dXNDb2RlTWV0aG9kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3RhdHVzQ29kZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmo7Ci0KLSAgICAgICAgICAgIGlmIChtR2V0U3RhdHVzQ29kZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1c0NvZGUgPSAoSW50ZWdlciltR2V0U3RhdHVzQ29kZU1ldGhvZC5pbnZva2Uocm91dGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzQ29kZSA9PSBtU3RhdHVzQ29ubmVjdGluZzsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQXNzdW1lIG5vdCBjb25uZWN0aW5nLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFja1Byb3h5PFQ+IHsKLSAgICAgICAgcHVibGljIENhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwMzU0OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi0vLyBAQFJlcXVpcmVzQXBpKDE4KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIgewotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXREZWZhdWx0Um91dGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3QgY2FsbGJhY2tPYmosIGludCBmbGFncykgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaiwgZmxhZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFVzZXJSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYjU5YjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLy8gQEBSZXF1aXJlc0FwaSgxNikKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVySmVsbHliZWFuIjsKLQotICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCA9IDB4ODA7Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgPSAweDEwMDsKLSAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiA9IDB4MjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9PVVRfQkxVRVRPT1RIID0gMHg4MCB8IDB4MTAwIHwgMHgyMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX0xJVkVfQVVESU8gPSAweDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX1ZJREVPID0gMHgyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfVVNFUiA9IDB4MDA4MDAwMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfUk9VVEVfVFlQRVMgPQotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPCi0gICAgICAgICAgICB8IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTwotICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1JPVVRFUl9TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Um91dGVDb3VudCgpOwotICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldFJvdXRlQXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYXRlZ29yaWVzKE9iamVjdCByb3V0ZXJPYmopIHsKLSAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5nZXRDYXRlZ29yeUNvdW50KCk7Ci0gICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgb3V0LmFkZChyb3V0ZXIuZ2V0Q2F0ZWdvcnlBdChpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTZWxlY3RlZFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXRTZWxlY3RlZFJvdXRlKHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5zZWxlY3RSb3V0ZSh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCBjYWxsYmFja09iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCBjYWxsYmFja09iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5yZW1vdmVDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlUm91dGVDYXRlZ29yeShPYmplY3Qgcm91dGVyT2JqLAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNHcm91cGFibGUpIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVJvdXRlQ2F0ZWdvcnkobmFtZSwgaXNHcm91cGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVXNlclJvdXRlKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlVXNlclJvdXRlKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tQcm94eTxDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVm9sdW1lQ2FsbGJhY2tQcm94eTxWb2x1bWVDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGNoZWNrUm91dGVkVG9CbHVldG9vdGgoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBdWRpb01hbmFnZXIgYXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGF1ZGlvTWFuYWdlci5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlc0ZvclN0cmVhbSIsIGludC5jbGFzcyk7Ci0gICAgICAgICAgICBpbnQgZGV2aWNlID0gKEludGVnZXIpIG1ldGhvZC5pbnZva2UoYXVkaW9NYW5hZ2VyLCBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKLSAgICAgICAgICAgIHJldHVybiAoZGV2aWNlICYgREVWSUNFX09VVF9CTFVFVE9PVEgpICE9IDA7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXROYW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN0YXR1cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldENhdGVnb3J5KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldENhdGVnb3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRJY29uRHJhd2FibGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1R5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVNYXgoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRWb2x1bWVIYW5kbGluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VGFnKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRhZyhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB0YWcpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnNldFRhZyh0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEdyb3VwKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldEdyb3VwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZU9iaiBpbnN0YW5jZW9mIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVHcm91cCB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEdyb3VwZWRSb3V0ZXMoT2JqZWN0IGdyb3VwT2JqKSB7Ci0gICAgICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKWdyb3VwT2JqOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ3JvdXAuZ2V0Um91dGVDb3VudCgpOwotICAgICAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG91dC5hZGQoZ3JvdXAuZ2V0Um91dGVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgbmFtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIHN0YXR1cykgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFN0YXR1cyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmosIERyYXdhYmxlIGljb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRJY29uRHJhd2FibGUoaWNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tUeXBlKE9iamVjdCByb3V0ZU9iaiwgaW50IHR5cGUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRQbGF5YmFja1R5cGUodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tTdHJlYW0oT2JqZWN0IHJvdXRlT2JqLCBpbnQgc3RyZWFtKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZU1heCkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZU1heCh2b2x1bWVNYXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUhhbmRsaW5nKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZUhhbmRsaW5nKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lSGFuZGxpbmcodm9sdW1lSGFuZGxpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHZvbHVtZUNhbGxiYWNrT2JqKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrKXZvbHVtZUNhbGxiYWNrT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHJjY09iaikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFJlbW90ZUNvbnRyb2xDbGllbnQoCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnQpcmNjT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVDYXRlZ29yeSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IGNhdGVnb3J5T2JqLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0TmFtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0Um91dGVzKG91dCk7Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cGFibGUoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmlzR3JvdXBhYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCBmb3IgbGltaXRhdGlvbnMgb2Ygc2VsZWN0Um91dGUoKSBvbiBKQiBhbmQgSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1TZWxlY3RSb3V0ZUludE1ldGhvZDsKLQotICAgICAgICBwdWJsaWMgU2VsZWN0Um91dGVXb3JrYXJvdW5kKCkgewotICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA8IDE2IHx8IEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZCA9IGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuY2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdFJvdXRlSW50IiwgaW50LmNsYXNzLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqOwotCi0gICAgICAgICAgICBpbnQgcm91dGVUeXBlcyA9IHJvdXRlLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgICAgICBpZiAoKHJvdXRlVHlwZXMgJiBST1VURV9UWVBFX1VTRVIpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbm9uLXVzZXIgcm91dGVzLgotICAgICAgICAgICAgICAgIC8vIE9uIEpCIGFuZCBKQiBNUjEsIHRoZSBzZWxlY3RSb3V0ZSgpIEFQSSBvbmx5IHN1cHBvcnRzIHByb2dyYW1tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcgdXNlciByb3V0ZXMuICBTbyBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlIGhpZGRlbiBzZWxlY3RSb3V0ZUludCgpCi0gICAgICAgICAgICAgICAgLy8gbWV0aG9kIG9uIHRoZXNlIHZlcnNpb25zIG9mIHRoZSBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGxpbWl0YXRpb24gd2FzIHJlbW92ZWQgaW4gSkIgTVIyLgotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVJbnRNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlSW50TWV0aG9kLmludm9rZShyb3V0ZXIsIHR5cGVzLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIHN1Y2Nlc3MhCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIiwgZXgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmVjYXVzZSB0aGUgcGxhdGZvcm0gaXMgbWlzc2luZyB0aGUgc2VsZWN0Um91dGVJbnQoKSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibWV0aG9kLiAgTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBEZWZhdWx0IGhhbmRsaW5nLgotICAgICAgICAgICAgcm91dGVyLnNlbGVjdFJvdXRlKHR5cGVzLCByb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGdldERlZmF1bHRSb3V0ZSgpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBhbmQgSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZDsKLQotICAgICAgICBwdWJsaWMgR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3lzdGVtQXVkaW9Sb3V0ZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLQotICAgICAgICAgICAgaWYgKG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QuaW52b2tlKHJvdXRlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIHRoZSBtZXRob2Qgb3IgaXQgZG9lcyBub3Qgd29yay4KLSAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZmlyc3Qgcm91dGUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgotICAgICAgICAgICAgcmV0dXJuIHJvdXRlci5nZXRSb3V0ZUF0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOwotCi0gICAgICAgIHB1YmxpYyBDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlU2VsZWN0ZWQodHlwZSwgcm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGludCB0eXBlLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVVbnNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlQWRkZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBncm91cCwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUdyb3VwZWQocm91dGUsIGdyb3VwLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXApIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5ncm91cGVkKHJvdXRlLCBncm91cCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgVm9sdW1lQ2FsbGJhY2tQcm94eTxUIGV4dGVuZHMgVm9sdW1lQ2FsbGJhY2s+Ci0gICAgICAgICAgICBleHRlbmRzIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVCBtQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHVibGljIFZvbHVtZUNhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qocm91dGUsIHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVVwZGF0ZVJlcXVlc3Qocm91dGUsIGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWU3NzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgbWVkaWEgY29udHJvbCBpbnRlbnRzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGRlY2xhcmVzIGEgc2V0IG9mIHN0YW5kYXJkIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgYW5kIGFjdGlvbnMgdGhhdAotICogYXBwbGljYXRpb25zIGNhbiB1c2UgdG8gaWRlbnRpZnkgdGhlIGNhcGFiaWxpdGllcyBvZiBtZWRpYSByb3V0ZXMgYW5kIGNvbnRyb2wgdGhlbS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllczwvaDM+Ci0gKiA8cD4KLSAqIE1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgc3BlY2lmeSBtZWFucyBieSB3aGljaCBhcHBsaWNhdGlvbnMgY2FuCi0gKiBzZW5kIG1lZGlhIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlLiAgQ2F0ZWdvcmllcyBhcmUgc29tZXRpbWVzIHJlZmVycmVkCi0gKiB0byBhcyBkZXNjcmliaW5nICJ0eXBlcyIgb3IgImtpbmRzIiBvZiByb3V0ZXMuCi0gKiA8L3A+PHA+Ci0gKiBGb3IgZXhhbXBsZSwgaWYgYSByb3V0ZSBzdXBwb3J0cyB0aGUge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrIGNhdGVnb3J5fSwKLSAqIHRoZW4gYW4gYXBwbGljYXRpb24gY2FuIGFzayBpdCB0byBwbGF5IG1lZGlhIHJlbW90ZWx5IGJ5IHNlbmRpbmcgYQotICoge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGludGVudCB3aXRoIHRoZSBVcmkgb2YgdGhlCi0gKiBtZWRpYSBjb250ZW50IHRvIHBsYXkuICBTdWNoIGEgcm91dGUgbWF5IHRoZW4gYmUgcmVmZXJyZWQgdG8gYXMKLSAqIGEgInJlbW90ZSBwbGF5YmFjayByb3V0ZSIgYmVjYXVzZSBpdCBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMuICBJdCBpcyBjb21tb24KLSAqIGZvciBhIHJvdXRlIHRvIHN1cHBvcnQgbXVsdGlwbGUgY2F0ZWdvcmllcyBvZiByZXF1ZXN0cyBhdCB0aGUgc2FtZSB0aW1lLCBzdWNoIGFzCi0gKiBsaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvLgotICogPC9wPjxwPgotICogVGhlIGZvbGxvd2luZyBzdGFuZGFyZCByb3V0ZSBjYXRlZ29yaWVzIGFyZSBkZWZpbmVkLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX0xJVkVfQVVESU8gTGl2ZSBhdWRpb306IFRoZSByb3V0ZSBzdXBwb3J0cyBzdHJlYW1pbmcgbGl2ZSBhdWRpbwotICogZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gIExpdmUgYXVkaW8gcm91dGVzIGluY2x1ZGUgbG9jYWwgc3BlYWtlcnMKLSAqIGFuZCBCbHVldG9vdGggaGVhZHNldHMuCi0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIExpdmUgdmlkZW99OiBUaGUgcm91dGUgc3VwcG9ydHMgc3RyZWFtaW5nIGxpdmUgdmlkZW8KLSAqIGZyb20gdGhlIGRldmljZSB0byB0aGUgZGVzdGluYXRpb24uICBMaXZlIHZpZGVvIHJvdXRlcyBpbmNsdWRlIGxvY2FsIGRpc3BsYXlzCi0gKiBhbmQgd2lyZWxlc3MgZGlzcGxheXMgdGhhdCBzdXBwb3J0IG1pcnJvcmluZyBhbmQKLSAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gcHJlc2VudGF0aW9uc30uICBMaXZlIHZpZGVvIHJvdXRlcyB0eXBpY2FsbHkgYWxzbwotICogc3VwcG9ydCBsaXZlIGF1ZGlvIGNhcGFiaWxpdGllcy4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyBSZW1vdGUgcGxheWJhY2t9OiBUaGUgcm91dGUgc3VwcG9ydHMgc2VuZGluZwotICogcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIGZvciBtZWRpYSBjb250ZW50IHRvIHRoZSBkZXN0aW5hdGlvbi4gIFRoZSBjb250ZW50IHRvIGJlCi0gKiBwbGF5ZWQgaXMgaWRlbnRpZmllZCBieSBhIFVyaSBhbmQgbWltZS10eXBlLgotICogPC91bD48cD4KLSAqIE1lZGlhIHJvdXRlIHByb3ZpZGVycyBtYXkgZGVmaW5lIGN1c3RvbSBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIG9mIHRoZWlyIG93biBpbgotICogYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIG9uZXMuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgdmFyaWV0eQotICogb2YgZmVhdHVyZXMgdG8gYXBwbGljYXRpb25zIHRoYXQgcmVjb2duaXplIGFuZCBrbm93IGhvdyB0byB1c2UgdGhlbS4gIEZvciBleGFtcGxlLAotICogYSBtZWRpYSByb3V0ZSBwcm92aWRlciBtaWdodCBkZWZpbmUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gaW5kaWNhdGUgdGhhdCBpdHMgcm91dGVzCi0gKiBzdXBwb3J0IGEgc3BlY2lhbCBkZXZpY2Utc3BlY2lmaWMgY29udHJvbCBpbnRlcmZhY2UgaW4gYWRkaXRpb24gdG8gb3RoZXIKLSAqIHN0YW5kYXJkIGZlYXR1cmVzLgotICogPC9wPjxwPgotICogQXBwbGljYXRpb25zIGNhbiBkZXRlcm1pbmUgd2hpY2ggY2F0ZWdvcmllcyBhIHJvdXRlIHN1cHBvcnRzIGJ5IHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnl9Ci0gKiBvciB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzIE1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRDb250cm9sRmlsdGVyc30KLSAqIG1ldGhvZHMuICBBcHBsaWNhdGlvbnMgY2FuIGFsc28gc3BlY2lmeSB0aGUgdHlwZXMgb2Ygcm91dGVzIHRoYXQgdGhleSB3YW50IHRvIHVzZSBieQotICogY3JlYXRpbmcge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3RvcnN9IHRoYXQgY29udGFpbiB0aGUgZGVzaXJlZAotICogY2F0ZWdvcmllcyBhbmQgYXJlIHVzZWQgdG8gZmlsdGVyIHJvdXRlcyBpbiBzZXZlcmFsIHBhcnRzIG9mIHRoZSBtZWRpYSByb3V0ZXIgQVBJLgotICogPC9wPgotICoKLSAqIDxoMz5NZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zPC9oMz4KLSAqIDxwPgotICogTWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9ucyBzcGVjaWZ5IHBhcnRpY3VsYXIgZnVuY3Rpb25zIHRoYXQgYXBwbGljYXRpb25zCi0gKiBjYW4gYXNrIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlIHRvIHBlcmZvcm0uICBNZWRpYSByb3V0ZSBjb250cm9sIHJlcXVlc3RzCi0gKiB0YWtlIHRoZSBmb3JtIG9mIGludGVudHMgaW4gYSBzaW1pbGFyIG1hbm5lciB0byBvdGhlciBpbnRlbnRzIHVzZWQgdG8gc3RhcnQgYWN0aXZpdGllcwotICogb3Igc2VuZCBicm9hZGNhc3RzLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtZWRpYSBjb250cm9sIGludGVudHMgYXJlIGRpcmVjdGVkIHRvCi0gKiByb3V0ZXMgcmF0aGVyIHRoYW4gYWN0aXZpdHkgb3IgYnJvYWRjYXN0IHJlY2VpdmVyIGNvbXBvbmVudHMuCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIG1lZGlhIHJvdXRlIGNvbnRyb2wgaW50ZW50IHNwZWNpZmllcyBhbiBhY3Rpb24sIGEgY2F0ZWdvcnkgYW5kIHNvbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKLSAqIHRoYXQgYXJlIHN1cHBsaWVkIGFzIGV4dHJhcy4gIEFwcGxpY2F0aW9ucyBzZW5kIG1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgdG8gcm91dGVzIHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnNlbmRDb250cm9sUmVxdWVzdH0KLSAqIG1ldGhvZCBhbmQgcmVjZWl2ZSByZXN1bHRzIHZpYSBhIGNhbGxiYWNrLgotICogPC9wPjxwPgotICogQWxsIG1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcwotICogdGhhdCBzdXBwb3J0IHRoZW0uICBUaHVzIG9ubHkgcmVtb3RlIHBsYXliYWNrIHJvdXRlcyBtYXkgcGVyZm9ybSByZW1vdGUgcGxheWJhY2sgYWN0aW9ucy4KLSAqIFRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggYWN0aW9uIHNwZWNpZmllcyB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhlIGFjdGlvbiBiZWxvbmdzLAotICogdGhlIHBhcmFtZXRlcnMgaXQgcmVxdWlyZXMsIGFuZCB0aGUgcmVzdWx0cyBpdCByZXR1cm5zLgotICogPC9wPgotICoKLSAqIDxoMz5MaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvIHJvdXRlczwvaDM+Ci0gKiA8cD4KLSAqIHtAbGluayAjQ0FURUdPUllfTElWRV9BVURJTyBMaXZlIGF1ZGlvfSBhbmQge0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIGxpdmUgdmlkZW99Ci0gKiByb3V0ZXMgcHJlc2VudCBtZWRpYSB1c2luZyBzdGFuZGFyZCBzeXN0ZW0gaW50ZXJmYWNlcyBzdWNoIGFzIGF1ZGlvIHN0cmVhbXMsCi0gKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbnN9IG9yIGRpc3BsYXkgbWlycm9yaW5nLiAgVGhlc2Ugcm91dGVzIGFyZQotICogdGhlIGVhc2llc3QgdG8gdXNlIGJlY2F1c2UgYXBwbGljYXRpb25zIHNpbXBseSByZW5kZXIgY29udGVudCBsb2NhbGx5IG9uIHRoZSBkZXZpY2UKLSAqIGFuZCB0aGUgc3lzdGVtIHN0cmVhbXMgaXQgdG8gdGhlIHJvdXRlIGRlc3RpbmF0aW9uIGF1dG9tYXRpY2FsbHkuCi0gKiA8L3A+PHA+Ci0gKiBJbiBtb3N0IGNhc2VzLCBhcHBsaWNhdGlvbnMgY2FuIHN0cmVhbSBjb250ZW50IHRvIGxpdmUgYXVkaW8gYW5kIGxpdmUgdmlkZW8gcm91dGVzIGluCi0gKiB0aGUgc2FtZSB3YXkgdGhleSB3b3VsZCBwbGF5IHRoZSBjb250ZW50IGxvY2FsbHkgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9uLiAgSG93ZXZlciwKLSAqIGFwcGxpY2F0aW9ucyBtYXkgYWxzbyBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIG1vcmUgc29waGlzdGljYXRlZCBmZWF0dXJlcyBzdWNoCi0gKiBhcyBzZWNvbmQtc2NyZWVuIHByZXNlbnRhdGlvbiBBUElzIHRoYXQgYXJlIHBhcnRpY3VsYXIgdG8gdGhlc2Ugcm91dGVzLgotICogPC9wPgotICoKLSAqIDxoMz5SZW1vdGUgcGxheWJhY2sgcm91dGVzPC9oMz4KLSAqIDxwPgotICoge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgUmVtb3RlIHBsYXliYWNrfSByb3V0ZXMgcHJlc2VudCBtZWRpYSByZW1vdGVseQotICogYnkgcGxheWluZyBjb250ZW50IGZyb20gYSBVcmkuCi0gKiBUaGVzZSByb3V0ZXMgZGVzdGluYXRpb25zIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIGZldGNoaW5nIGFuZCByZW5kZXJpbmcgY29udGVudAotICogb24gdGhlaXIgb3duLiAgQXBwbGljYXRpb25zIGRvIG5vdCByZW5kZXIgdGhlIGNvbnRlbnQgdGhlbXNlbHZlczsgaW5zdGVhZCwgYXBwbGljYXRpb25zCi0gKiBzZW5kIGNvbnRyb2wgcmVxdWVzdHMgdG8gaW5pdGlhdGUgcGxheSwgcGF1c2UsIHJlc3VtZSwgb3Igc3RvcCBtZWRpYSBpdGVtcyBhbmQgcmVjZWl2ZQotICogc3RhdHVzIHVwZGF0ZXMgYXMgdGhleSBjaGFuZ2Ugc3RhdGUuCi0gKiA8L3A+Ci0gKgotICogPGg0PlNlc3Npb25zPC9oND4KLSAqIDxwPgotICogRWFjaCByZW1vdGUgbWVkaWEgcGxheWJhY2sgYWN0aW9uIGlzIGNvbmR1Y3RlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2Vzc2lvbi4KLSAqIFNlc3Npb25zIGFyZSB1c2VkIHRvIHByZXZlbnQgYXBwbGljYXRpb25zIGZyb20gYWNjaWRlbnRhbGx5IGludGVyZmVyaW5nIHdpdGggb25lCi0gKiBhbm90aGVyIGJlY2F1c2UgYXQgbW9zdCBvbmUgc2Vzc2lvbiBjYW4gYmUgdmFsaWQgYXQgYSB0aW1lLgotICogPC9wPjxwPgotICogQSBzZXNzaW9uIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb24gYWN0aW9ufQotICogYW5kIHRlcm1pbmF0ZWQgdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9uIGFjdGlvbn0gd2hlbiB0aGUKLSAqIHJvdXRlIHByb3ZpZGVzIGV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcy4KLSAqIDwvcD48cD4KLSAqIEV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCB3YXMgYWRkZWQgaW4gYSBsYXRlciByZXZpc2lvbiBvZiB0aGUgcHJvdG9jb2wgc28gbm90Ci0gKiBhbGwgcm91dGVzIHN1cHBvcnQgaXQuICBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBleHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQKLSAqIHRoZW4gaW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50IG1heSBzdGlsbCBiZSB1c2VkLiAgSW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50Ci0gKiByZWxpZXMgb24gdGhlIHVzZSBvZiB0aGUge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBhbmQge0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfQotICogYWN0aW9ucyB3aGljaCBoYXZlIHRoZSBzaWRlLWVmZmVjdCBvZiBjcmVhdGluZyBhIG5ldyBzZXNzaW9uIGlmIG5vbmUgaXMgcHJvdmlkZWQKLSAqIGFzIGFyZ3VtZW50LgotICogPC9wPjxwPgotICogV2hlbiBhIG5ldyBzZXNzaW9uIGlzIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGFuZCBhbnkgb25nb2luZwotICogbWVkaWEgcGxheWJhY2sgaXMgc3RvcHBlZCBiZWZvcmUgdGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgcGVyZm9ybWVkLiAgQW55IGF0dGVtcHQKLSAqIHRvIHVzZSBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgKFByb3RvY29sIGltcGxlbWVudGF0aW9ucwotICogYXJlIGVuY291cmFnZWQgdG8gYWdncmVzc2l2ZWx5IGRpc2NhcmQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGludmFsaWRhdGVkIHNlc3Npb25zCi0gKiBzaW5jZSBpdCBpcyBubyBsb25nZXIgb2YgdXNlLikKLSAqIDwvcD48cD4KLSAqIEVhY2ggc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIHNlc3Npb24gaWQgdGhhdCBtYXkgYmUgdXNlZCB0byBjb250cm9sCi0gKiB0aGUgc2Vzc2lvbiB1c2luZyBhY3Rpb25zIHN1Y2ggYXMgcGF1c2UsIHJlc3VtZSwgc3RvcCBhbmQgZW5kIHNlc3Npb24uCi0gKiA8L3A+Ci0gKgotICogPGg0Pk1lZGlhIGl0ZW1zPC9oND4KLSAqIDxwPgotICogRWFjaCBzdWNjZXNzZnVsIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24KLSAqIHJldHVybnMgYSB1bmlxdWUgbWVkaWEgaXRlbSBpZCB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gbW9uaXRvciBhbmQgY29udHJvbAotICogcGxheWJhY2suICBUaGUgbWVkaWEgaXRlbSBpZCBtYXkgYmUgcGFzc2VkIHRvIG90aGVyIGFjdGlvbnMgc3VjaCBhcwotICoge0BsaW5rICNBQ1RJT05fU0VFSyBzZWVrfSBvciB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LiAgSXQgd2lsbCBhbHNvIGFwcGVhcgotICogYXMgYSBwYXJhbWV0ZXIgaW4gc3RhdHVzIHVwZGF0ZSBicm9hZGNhc3RzIHRvIGlkZW50aWZ5IHRoZSBhc3NvY2lhdGVkIHBsYXliYWNrIHJlcXVlc3QuCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIG1lZGlhIGl0ZW0gaXMgc2NvcGVkIHRvIHRoZSBzZXNzaW9uIGluIHdoaWNoIGl0IHdhcyBjcmVhdGVkLiAgVGhlcmVmb3JlIG1lZGlhIGl0ZW0KLSAqIGlkcyBhcmUgb25seSBldmVyIHVzZWQgdG9nZXRoZXIgd2l0aCBzZXNzaW9uIGlkcy4gIE1lZGlhIGl0ZW0gaWRzIGFyZSBtZWFuaW5nbGVzcwotICogb24gdGhlaXIgb3duLiAgV2hlbiB0aGUgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCwgYWxsIG9mIGl0cyBtZWRpYSBpdGVtcyBhcmUgYWxzbwotICogaW52YWxpZGF0ZWQuCi0gKiA8L3A+Ci0gKgotICogPGg0PlRoZSBwbGF5YmFjayBxdWV1ZTwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggc2Vzc2lvbiBoYXMgaXRzIG93biBwbGF5YmFjayBxdWV1ZSB0aGF0IGNvbnNpc3RzIG9mIHRoZSBtZWRpYSBpdGVtcyB0aGF0Ci0gKiBhcmUgcGVuZGluZywgcGxheWluZywgYnVmZmVyaW5nIG9yIHBhdXNlZC4gIEl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgcXVldWUgd2hlbgotICogYSBwbGF5YmFjayByZXF1ZXN0IGlzIGlzc3VlZC4gIEl0ZW1zIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHdoZW4gdGhleSBhcmUgbm8KLSAqIGxvbmdlciBlbGlnaWJsZSBmb3IgcGxheWJhY2sgKGVudGVyIHRlcm1pbmFsIHN0YXRlcykuCi0gKiA8L3A+PHA+Ci0gKiBBcyBkZXNjcmliZWQgaW4gdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGNsYXNzLCBtZWRpYSBpdGVtcyBpbml0aWFsbHkKLSAqIHN0YXJ0IGluIGEgcGVuZGluZyBzdGF0ZSwgdHJhbnNpdGlvbiB0byB0aGUgcGxheWluZyAob3IgYnVmZmVyaW5nIG9yIHBhdXNlZCkgc3RhdGUKLSAqIGR1cmluZyBwbGF5YmFjaywgYW5kIGVuZCBpbiBhIGZpbmlzaGVkLCBjYW5jZWxlZCwgaW52YWxpZGF0ZWQgb3IgZXJyb3Igc3RhdGUuCi0gKiBPbmNlIHRoZSBjdXJyZW50IGl0ZW0gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUsIHBsYXliYWNrIHByb2NlZWRzIG9uIHRvIHRoZQotICogbmV4dCBpdGVtLgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZXRlcm1pbmUgd2hldGhlciB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBieSBjaGVja2luZwotICogd2hldGhlciB0aGUge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gYWN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSByb3V0ZSdzIGNvbnRyb2wgZmlsdGVyCi0gKiB1c2luZyB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QgUm91dGVJbmZvLnN1cHBvcnRzQ29udHJvbFJlcXVlc3R9LgotICogPC9wPjxwPgotICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJvdXRlLCB0aGVuIHRoZSByb3V0ZSBwcm9taXNlcwotICogdG8gYWxsb3cgYXQgbGVhc3QgdHdvIGl0ZW1zIChwb3NzaWJseSBtb3JlKSB0byBiZSBlbnF1ZXVlZCBhdCBhIHRpbWUuICBFbnF1ZXVlZCBpdGVtcyBwbGF5Ci0gKiBiYWNrIHRvIGJhY2sgb25lIGFmdGVyIHRoZSBvdGhlciBhcyB0aGUgcHJldmlvdXMgaXRlbSBjb21wbGV0ZXMuICBJZGVhbGx5IHRoZXJlIHNob3VsZAotICogYmUgbm8gYXVkaWJsZSBwYXVzZSBiZXR3ZWVuIGl0ZW1zIGZvciBzdGFuZGFyZCBhdWRpbyBjb250ZW50IHR5cGVzLgotICogPC9wPjxwPgotICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByb3V0ZSwgdGhlbiB0aGUgcXVldWUKLSAqIGVmZmVjdGl2ZWx5IGNvbnRhaW5zIGF0IG1vc3Qgb25lIGl0ZW0gYXQgYSB0aW1lLiAgRWFjaCBwbGF5IGFjdGlvbiBoYXMgdGhlIGVmZmVjdCBvZgotICogY2xlYXJpbmcgdGhlIHF1ZXVlIGFuZCByZXNldHRpbmcgaXRzIHN0YXRlIGJlZm9yZSB0aGUgbmV4dCBpdGVtIGlzIHBsYXllZC4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+SW1wYWN0IG9mIHBhdXNlLCByZXN1bWUsIHN0b3AgYW5kIHBsYXkgYWN0aW9ucyBvbiB0aGUgcGxheWJhY2sgcXVldWU8L2g0PgotICogPHA+Ci0gKiBUaGUgcGF1c2UsIHJlc3VtZSBhbmQgc3RvcCBhY3Rpb25zIGFmZmVjdCB0aGUgc2Vzc2lvbidzIHdob2xlIHF1ZXVlLiAgUGF1c2UgY2F1c2VzCi0gKiB0aGUgcGxheWJhY2sgcXVldWUgdG8gYmUgc3VzcGVuZGVkIG5vIG1hdHRlciB3aGljaCBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgotICogUmVzdW1lIHJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHBhdXNlLiAgU3RvcCBjbGVhcnMgdGhlIHF1ZXVlIGFuZCBhbHNvIHJlc2V0cwotICogdGhlIHBhdXNlIGZsYWcganVzdCBsaWtlIHJlc3VtZS4KLSAqIDwvcD48cD4KLSAqIEFzIGRlc2NyaWJlZCBlYXJsaWVyLCB0aGUgcGxheSBhY3Rpb24gaGFzIHRoZSBlZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlCi0gKiBhbmQgY29tcGxldGVseSByZXNldHRpbmcgaXRzIHN0YXRlIChsaWtlIHRoZSBzdG9wIGFjdGlvbikgdGhlbiBlbnF1ZXVpbmcgYQotICogbmV3IG1lZGlhIGl0ZW0gdG8gYmUgcGxheWVkIGltbWVkaWF0ZWx5LiAgUGxheSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudAotICogdG8gc3RvcCBmb2xsb3dlZCBieSBhbiBhY3Rpb24gdG8gZW5xdWV1ZSBhbiBpdGVtLgotICogPC9wPjxwPgotICogVGhlIHBsYXkgYWN0aW9uIGlzIGFsc28gc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbnMuCi0gKiBBbiBhcHBsaWNhdGlvbiB3aXRoIHNpbXBsZSBuZWVkcyBtYXkgZmluZCB0aGF0IGl0IG9ubHkgbmVlZHMgdG8gdXNlIHBsYXkKLSAqIChhbmQgb2NjYXNpb25hbGx5IHN0b3ApIHRvIGNvbnRyb2wgcGxheWJhY2suCi0gKiA8L3A+Ci0gKgotICogPGg0PlJlc29sdmluZyBjb25mbGljdHMgYmV0d2VlbiBhcHBsaWNhdGlvbnM8L2g0PgotICogPHA+Ci0gKiBXaGVuIGFuIGFwcGxpY2F0aW9uIGhhcyBhIHZhbGlkIHNlc3Npb24sIGl0IGlzIGVzc2VudGlhbGx5IGluIGNvbnRyb2wgb2YgcmVtb3RlIHBsYXliYWNrCi0gKiBvbiB0aGUgcm91dGUuICBObyBvdGhlciBhcHBsaWNhdGlvbiBjYW4gdmlldyBvciBtb2RpZnkgdGhlIHJlbW90ZSBwbGF5YmFjayBzdGF0ZQotICogb2YgdGhhdCBhcHBsaWNhdGlvbidzIHNlc3Npb24gd2l0aG91dCBrbm93aW5nIGl0cyBpZC4KLSAqIDwvcD48cD4KLSAqIEhvd2V2ZXIsIG90aGVyIGFwcGxpY2F0aW9ucyBjYW4gcGVyZm9ybSBhY3Rpb25zIHRoYXQgaGF2ZSB0aGUgZWZmZWN0IG9mIHN0b3BwaW5nCi0gKiBwbGF5YmFjayBhbmQgaW52YWxpZGF0aW5nIHRoZSBjdXJyZW50IHNlc3Npb24uICBXaGVuIHRoaXMgb2NjdXJzLCB0aGUgZm9ybWVyIGFwcGxpY2F0aW9uCi0gKiB3aWxsIGJlIGluZm9ybWVkIHRoYXQgaXQgaGFzIGxvc3QgY29udHJvbCBieSB3YXkgb2YgaW5kaXZpZHVhbCBtZWRpYSBpdGVtIHN0YXR1cwotICogdXBkYXRlIGJyb2FkY2FzdHMgdGhhdCBpbmRpY2F0ZSB0aGF0IGl0cyBxdWV1ZWQgbWVkaWEgaXRlbXMgaGF2ZSBiZWNvbWUKLSAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LiAgVGhpcyBicm9hZGNhc3QKLSAqIGltcGxpZXMgdGhhdCBwbGF5YmFjayB3YXMgdGVybWluYXRlZCBhYm5vcm1hbGx5IGJ5IGFuIGV4dGVybmFsIGNhdXNlLgotICogPC9wPjxwPgotICogQXBwbGljYXRpb25zIHNob3VsZCBoYW5kbGUgY29uZmxpY3RzIGNvbnNlcnZhdGl2ZWx5IHRvIGFsbG93IG90aGVyIGFwcGxpY2F0aW9ucyB0bwotICogc21vb3RobHkgYXNzdW1lIGNvbnRyb2wgb3ZlciB0aGUgcm91dGUuICBXaGVuIGEgY29uZmxpY3Qgb2NjdXJzLCB0aGUgY3VycmVudGx5IHBsYXlpbmcKLSAqIGFwcGxpY2F0aW9uIHNob3VsZCByZWxlYXNlIGl0cyBzZXNzaW9uIGFuZCBhbGxvdyB0aGUgbmV3IGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUKLSAqIHJvdXRlIHVudGlsIHN1Y2ggdGltZSBhcyB0aGUgdXNlciBpbnRlcnZlbmVzIHRvIHRha2Ugb3ZlciB0aGUgcm91dGUgYWdhaW4gYW5kIGJlZ2luCi0gKiBhIG5ldyBwbGF5YmFjayBzZXNzaW9uLgotICogPC9wPgotICoKLSAqIDxoND5CYXNpYyBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBiYXNpYyBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgYWxsIHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzLiAgVGhlc2UgYWN0aW9ucyBmb3JtIHRoZSBiYXNpcyBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sCi0gKiBhbmQgYXJlIHJlcXVpcmVkIGluIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX1BMQVkgUGxheX06IFN0YXJ0cyBwbGF5aW5nIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gVXJpCi0gKiBhbmQgcmV0dXJucyBhIG5ldyBtZWRpYSBpdGVtIGlkIHRvIGRlc2NyaWJlIHRoZSByZXF1ZXN0LiAgSW1wbGljaXRseSBjcmVhdGVzIGEgbmV3Ci0gKiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9TRUVLIFNlZWt9OiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIG9mIGEgc3BlY2lmaWMgbWVkaWEgaXRlbS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIEdldCBzdGF0dXN9OiBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtCi0gKiBpbmNsdWRpbmcgdGhlIGl0ZW0ncyBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGFuZCBwcm9ncmVzcy4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9QQVVTRSBQYXVzZX06IFBhdXNlcyBwbGF5YmFjayBvZiB0aGUgcXVldWUuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUkVTVU1FIFJlc3VtZX06IFJlc3VtZXMgcGxheWJhY2sgb2YgdGhlIHF1ZXVlLgotICogPGxpPntAbGluayAjQUNUSU9OX1NUT1AgU3RvcH06IFN0b3BzIHBsYXliYWNrLCBjbGVhcnMgdGhlIHF1ZXVlLCBhbmQgcmVzZXRzIHRoZQotICogcGF1c2Ugc3RhdGUuCi0gKiA8L3VsPgotICoKLSAqIDxoND5RdWV1ZSBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBxdWV1ZSBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgcmVtb3RlCi0gKiBwbGF5YmFjayByb3V0ZXMgdGhhdCBvZmZlciBvcHRpb25hbCBxdWV1aW5nIGNhcGFiaWxpdGllcy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fRU5RVUVVRSBFbnF1ZXVlfTogRW5xdWV1ZXMgY29udGVudCBzcGVjaWZpZWQgYnkgYSBnaXZlbiBVcmkKLSAqIGFuZCByZXR1cm5zIGEgbmV3IG1lZGlhIGl0ZW0gaWQgdG8gZGVzY3JpYmUgdGhlIHJlcXVlc3QuICBJbXBsaWNpdGx5IGNyZWF0ZXMgYSBuZXcKLSAqIHNlc3Npb24gaWYgbm8gc2Vzc2lvbiBpZCB3YXMgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyLgotICogPGxpPntAbGluayAjQUNUSU9OX1JFTU9WRSBSZW1vdmV9OiBSZW1vdmVzIGEgc3BlY2lmaWVkIG1lZGlhIGl0ZW0gZnJvbSB0aGUgcXVldWUuCi0gKiA8L3VsPgotICoKLSAqIDxoND5TZXNzaW9uIGFjdGlvbnM8L2g0PgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIHNlc3Npb24gYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzIHRoYXQgb2ZmZXIgb3B0aW9uYWwgc2Vzc2lvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTiBTdGFydCBzZXNzaW9ufTogU3RhcnRzIGEgbmV3IHNlc3Npb24gZXhwbGljaXRseS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgR2V0IHNlc3Npb24gc3RhdHVzfTogR2V0cyB0aGUgc3RhdHVzIG9mIGEgc2Vzc2lvbi4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9FTkRfU0VTU0lPTiBFbmQgc2Vzc2lvbn06IEVuZHMgYSBzZXNzaW9uIGV4cGxpY2l0bHkuCi0gKiA8L3VsPgotICoKLSAqIDxoND5JbXBsZW1lbnRhdGlvbiBub3RlPC9oND4KLSAqIDxwPgotICogSW1wbGVtZW50YXRpb25zIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgbXVzdCBpbXBsZW1lbnQgPGVtPmFsbDwvZW0+IG9mIHRoZQotICogZG9jdW1lbnRlZCBhY3Rpb25zLCBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzLiAgTm90ZSB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGlzIHdyaXR0ZW4gZnJvbQotICogdGhlIHBlcnNwZWN0aXZlIG9mIGEgY2xpZW50IG9mIHRoZSBwcm90b2NvbC4gIEluIHBhcnRpY3VsYXIsIHdoZW5ldmVyIGEgcGFyYW1ldGVyCi0gKiBpcyBkZXNjcmliZWQgYXMgYmVpbmcgIm9wdGlvbmFsIiwgaXQgaXMgb25seSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgY2xpZW50LgotICogQ29tcGxpYW50IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIHByb3RvY29sIG11c3Qgc3VwcG9ydCBhbGwKLSAqIG9mIHRoZSBmZWF0dXJlcyBkZXNjcmliZWQgaGVyZWluLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sSW50ZW50IHsKLSAgICAvKiBSb3V0ZSBjYXRlZ29yaWVzLiAqLwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSBhdWRpby4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyByb3V0aW5nIHdpbGwgYWxsb3cgdGhlIG1lZGlhIGF1ZGlvIHN0cmVhbQotICAgICAqIHRvIGJlIHNlbnQgdG8gc3VwcG9ydGVkIGRlc3RpbmF0aW9ucy4gIFRoaXMgY2FuIGluY2x1ZGUgaW50ZXJuYWwgc3BlYWtlcnMgb3IKLSAgICAgKiBhdWRpbyBqYWNrcyBvbiB0aGUgZGV2aWNlIGl0c2VsZiwgQTJEUCBkZXZpY2VzLCBhbmQgbW9yZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBhIGxpdmUgYXVkaW8gcm91dGUgaXMgc2VsZWN0ZWQsIGF1ZGlvIHJvdXRpbmcgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIEFsbCBhdWRpbyBwbGF5ZWQgb24gdGhlIG1lZGlhIHN0cmVhbSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgc2VsZWN0ZWQgZGVzdGluYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIGFib3V0IGxpdmUgYXVkaW8gcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9MSVZFX0FVRElPID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LkxJVkVfQVVESU8iOwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSB2aWRlby4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSB2aWRlbyByb3V0aW5nIHdpbGwgYWxsb3cgYSBtaXJyb3JlZCB2ZXJzaW9uCi0gICAgICogb2YgdGhlIGRldmljZSdzIHByaW1hcnkgZGlzcGxheSBvciBhIGN1c3RvbWl6ZWQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIFByZXNlbnRhdGlvbn0gdG8gYmUgc2VudCB0byBzdXBwb3J0ZWQKLSAgICAgKiBkZXN0aW5hdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gYSBsaXZlIHZpZGVvIHJvdXRlIGlzIHNlbGVjdGVkLCBhdWRpbyBhbmQgdmlkZW8gcm91dGluZyBpcyB0cmFuc3BhcmVudAotICAgICAqIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEJ5IGRlZmF1bHQsIGF1ZGlvIGFuZCB2aWRlbyBpcyByb3V0ZWQgdG8gdGhlIHNlbGVjdGVkCi0gICAgICogZGVzdGluYXRpb24uICBGb3IgY2VydGFpbiBsaXZlIHZpZGVvIHJvdXRlcywgdGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHVzZSBhCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBQcmVzZW50YXRpb259IHRvIHJlcGxhY2UgdGhlIG1pcnJvcmVkIHZpZXcKLSAgICAgKiBvbiB0aGUgZXh0ZXJuYWwgZGlzcGxheSB3aXRoIGRpZmZlcmVudCBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCBsaXZlIHZpZGVvIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKLSAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0xJVkVfVklERU8gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuTElWRV9WSURFTyI7Ci0KLSAgICAvKioKLSAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3J5OiBSZW1vdGUgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjayByb3V0aW5nIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gc2VuZAotICAgICAqIHJlcXVlc3RzIHRvIHBsYXkgY29udGVudCByZW1vdGVseSB0byBzdXBwb3J0ZWQgZGVzdGluYXRpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgcm91dGVzIGRlc3RpbmF0aW9ucyBvcGVyYXRlIGluZGVwZW5kZW50bHkgb2YgdGhlIGxvY2FsIGRldmljZS4KLSAgICAgKiBXaGVuIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIGlzIHNlbGVjdGVkLCB0aGUgYXBwbGljYXRpb24gY2FuIGNvbnRyb2wgdGhlIGNvbnRlbnQKLSAgICAgKiBwbGF5aW5nIG9uIHRoZSBkZXN0aW5hdGlvbiBieSBzZW5kaW5nIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0byB0aGUgcm91dGUuCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgZnJvbSB0aGUgcm91dGUgcmVnYXJkaW5nCi0gICAgICogcmVtb3RlIHBsYXliYWNrLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCByZW1vdGUgcGxheWJhY2sgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuUkVNT1RFX1BMQVlCQUNLIjsKLQotICAgIC8qIFJlbW90ZSBwbGF5YmFjayBhY3Rpb25zIHRoYXQgYWZmZWN0IGluZGl2aWR1YWwgaXRlbXMuICovCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBsYXkgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHN0YXJ0IHBsYXlpbmcgY29udGVudCB3aXRoCi0gICAgICogdGhlIHtAbGluayBVcml9IHNwZWNpZmllZCBpbiB0aGUge0BsaW5rIEludGVudH0ncyB7QGxpbmsgSW50ZW50I2dldERhdGEoKSBkYXRhIHVyaX0uCi0gICAgICogVGhlIGFjdGlvbiByZXR1cm5zIGEgbWVkaWEgc2Vzc2lvbiBpZCBhbmQgbWVkaWEgaXRlbSBpZCB3aGljaCBjYW4gYmUgdXNlZAotICAgICAqIHRvIGNvbnRyb2wgcGxheWJhY2sgdXNpbmcgb3RoZXIgcmVtb3RlIHBsYXliYWNrIGFjdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIE9uY2UgaW5pdGlhdGVkLCBwbGF5YmFjayBvZiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgd2lsbCBiZSBtYW5hZ2VkIGluZGVwZW5kZW50bHkKLSAgICAgKiBieSB0aGUgZGVzdGluYXRpb24uICBUaGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFzIHRoZSBzdGF0ZQotICAgICAqIG9mIHRoZSBtZWRpYSBpdGVtIGNoYW5nZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBkYXRhIHVyaSBzcGVjaWZpZXMgYW4gSFRUUCBvciBIVFRQUyBzY2hlbWUsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIGlzCi0gICAgICogcmVzcG9uc2libGUgZm9yIGZvbGxvd2luZyBIVFRQIHJlZGlyZWN0cyB0byBhIHJlYXNvbmFibGUgZGVwdGggb2YgYXQgbGVhc3QgMwotICAgICAqIGxldmVscyBhcyBtaWdodCB0eXBpY2FsbHkgYmUgaGFuZGxlZCBieSBhIHdlYiBicm93c2VyLiAgSWYgYW4gSFRUUCBlcnJvcgotICAgICAqIG9jY3VycywgdGhlbiB0aGUgZGVzdGluYXRpb24gc2hvdWxkIHNlbmQgYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIHN0YXR1cyB1cGRhdGV9Ci0gICAgICogYmFjayB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9Ci0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNnZXRQbGF5YmFja1N0YXRlKCkgcGxheWJhY2sgc3RhdGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5PbmUgaXRlbSBhdCBhIHRpbWU8L2gzPgotICAgICAqIDxwPgotICAgICAqIEVhY2ggc3VjY2Vzc2Z1bCBwbGF5IGFjdGlvbiA8ZW0+cmVwbGFjZXM8L2VtPiB0aGUgcHJldmlvdXMgcGxheSBhY3Rpb24uCi0gICAgICogSWYgYW4gaXRlbSBpcyBhbHJlYWR5IHBsYXlpbmcsIHRoZW4gaXQgaXMgY2FuY2VsZWQsIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUKLSAgICAgKiBpcyBjbGVhcmVkIGFuZCB0aGUgbmV3IGl0ZW0gYmVnaW5zIHBsYXlpbmcgaW1tZWRpYXRlbHkgKHJlZ2FyZGxlc3Mgb2YKLSAgICAgKiB3aGV0aGVyIHRoZSBwcmV2aW91c2x5IHBsYXlpbmcgaXRlbSBoYWQgYmVlbiBwYXVzZWQpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGF5IGlzIHRoZXJlZm9yZSBlcXVpdmFsZW50IHRvIHtAbGluayAjQUNUSU9OX1NUT1Agc3RvcH0gZm9sbG93ZWQgYnkgYW4gYWN0aW9uCi0gICAgICogdG8gZW5xdWV1ZSBhIG5ldyBtZWRpYSBpdGVtIHRvIGJlIHBsYXllZCBpbW1lZGlhdGVseS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+U2Vzc2lvbnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmVxdWVzdCBoYXMgdGhlIGVmZmVjdCBvZiBpbXBsaWNpdGx5IGNyZWF0aW5nIGEgbWVkaWEgc2Vzc2lvbiB3aGVuZXZlciB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IHRoZSB7QGxpbmsgI0VYVFJBX1NFU1NJT05fSUQgc2Vzc2lvbiBpZH0gcGFyYW1ldGVyLgotICAgICAqIEJlY2F1c2UgdGhlcmUgY2FuIG9ubHkgYmUgYXQgbW9zdCBvbmUgdmFsaWQgc2Vzc2lvbiBhdCBhIHRpbWUsIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24KLSAgICAgKiBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIGludmFsaWRhdGluZyBhbnkgZXhpc3Rpbmcgc2Vzc2lvbnMgYW5kIHRoZWlyIG1lZGlhIGl0ZW1zLAotICAgICAqIHRoZW4gaGFuZGxpbmcgdGhlIHBsYXliYWNrIHJlcXVlc3Qgd2l0aCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVzIGFuIGludmFsaWQgc2Vzc2lvbiBpZCwgdGhlbiBhbiBlcnJvciBpcyByZXR1cm5lZC4KLSAgICAgKiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBhc3N1bWUgdGhhdCBpdHMgc2Vzc2lvbgotICAgICAqIGlzIG5vIGxvbmdlciB2YWxpZC4gIFRvIG9idGFpbiBhIG5ldyBzZXNzaW9uLCB0aGUgYXBwbGljYXRpb24gbWF5IHRyeSBhZ2FpbgotICAgICAqIGFuZCBvbWl0IHRoZSBzZXNzaW9uIGlkIHBhcmFtZXRlci4gIEhvd2V2ZXIsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQKLSAgICAgKiBvbmx5IHJldHJ5IHJlcXVlc3RzIGR1ZSB0byBhbiBleHBsaWNpdCBhY3Rpb24gcGVyZm9ybWVkIGJ5IHRoZSB1c2VyLAotICAgICAqIHN1Y2ggYXMgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSAicGxheSIgYnV0dG9uIGluIHRoZSBVSSwgc2luY2UgYW5vdGhlcgotICAgICAqIGFwcGxpY2F0aW9uIG1heSBiZSB0cnlpbmcgdG8gdGFrZSBjb250cm9sIG9mIHRoZSByb3V0ZSBhbmQgdGhlIGZvcm1lcgotICAgICAqIGFwcGxpY2F0aW9uIHNob3VsZCB0cnkgdG8gc3RheSBvdXQgb2YgaXRzIHdheS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2Vzc2lvbnMsIHF1ZXVlcyBhbmQgbWVkaWEgaXRlbXMsIHBsZWFzZSByZWZlciB0byB0aGUKLSAgICAgKiBjbGFzcyBkb2N1bWVudGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0byB3aGljaCB0aGUgcGxheWJhY2sgcmVxdWVzdCBiZWxvbmdzLiAgSWYgb21pdHRlZCwgYSBuZXcgc2Vzc2lvbgotICAgICAqIGlzIGNyZWF0ZWQgaW1wbGljaXRseS4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT059IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgaW5pdGlhbAotICAgICAqIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tCi0gICAgICogdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX01FVEFEQVRBfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgbWV0YWRhdGEgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhlIGNvbnRlbnQgc3VjaCBhcyB0aGUgdGl0bGUgb2YgYSBzb25nLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCi0gICAgICogYWJvdXQgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0aGF0IHdhcyBhZmZlY3RlZCBieSB0aGUgcmVxdWVzdC4gIFRoaXMgd2lsbCBiZSBhIG5ldyBzZXNzaW9uIGluCi0gICAgICogdGhlIGNhc2Ugd2hlcmUgbm8gc2Vzc2lvbiBpZCB3YXMgc3VwcGxpZWQgYXMgYSBwYXJhbWV0ZXIuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyBhbiBvcGFxdWUgc3RyaW5nIGlkZW50aWZpZXIKLSAgICAgKiB0byB1c2UgdG8gcmVmZXIgdG8gdGhlIG1lZGlhIGl0ZW0gaW4gc3Vic2VxdWVudCByZXF1ZXN0cyBzdWNoIGFzCi0gICAgICoge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGluaXRpYWwgc3RhdHVzIG9mCi0gICAgICogdGhlIG5ldyBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYW4KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBpdGVtIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHBsYXliYWNrIHN0YXJ0cyBvcgotICAgICAqIHN0b3BzLiAgVGhlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gY2hhbmdlcy4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IHJldHJpZXZlIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gbmVjZXNzYXJ5Ci0gICAgICogdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9IHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgYSBzZXNzaW9uIGlkIHdhcyBwcm92aWRlZCBidXQgaXMgdW5rbm93biBvcgotICAgICAqIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGl0ZW0gVXJpIG9yIGNvbnRlbnQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciBpZgotICAgICAqIGFueSBvdGhlciBhcmd1bWVudHMgYXJlIGludmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgKiBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICogSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICAgKiBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICogaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKLSAgICAgKiBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7Ci0gICAgICogICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgKiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICogICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3Qgc3VjY2VlZGVkLgotICAgICAqICAgICAgICAgICAgIC8vIFBsYXliYWNrIG1heSBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSByZXR1cm5lZCBzZXNzaW9uIGFuZCBpdGVtIGlkLgotICAgICAqICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7Ci0gICAgICogICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKTsKLSAgICAgKiAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoZGF0YS5nZXRCdW5kbGUoCi0gICAgICogICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgKiAgICAgICAgICAgICAvLyAuLi4KLSAgICAgKiAgICAgICAgIH0KLSAgICAgKgotICAgICAqICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgbWVzc2FnZSwgQnVuZGxlIGRhdGEpIHsKLSAgICAgKiAgICAgICAgICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCEKLSAgICAgKiAgICAgICAgIH0KLSAgICAgKiAgICAgfTsKLSAgICAgKiAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgY2FsbGJhY2spOwotICAgICAqIH08L3ByZT4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUExBWSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUExBWSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEVucXVldWUgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gd29ya3MganVzdCBsaWtlIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gZXhjZXB0IHRoYXQgaXQgZG9lcwotICAgICAqIG5vdCBjbGVhciB0aGUgcXVldWUgb3IgcmVzZXQgdGhlIHBhdXNlIHN0YXRlIHdoZW4gaXQgZW5xdWV1ZXMgdGhlCi0gICAgICogbmV3IG1lZGlhIGl0ZW0gaW50byB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlLiAgVGhpcyBhY3Rpb24gb25seQotICAgICAqIGVucXVldWVzIGEgbWVkaWEgaXRlbSB3aXRoIG5vIG90aGVyIHNpZGUtZWZmZWN0cyBvbiB0aGUgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBxdWV1ZSBpcyBjdXJyZW50bHkgZW1wdHkgYW5kIHRoZW4gdGhlIGl0ZW0gd2lsbCBwbGF5IGltbWVkaWF0ZWx5Ci0gICAgICogKGFzc3VtaW5nIHRoZSBxdWV1ZSBpcyBub3QgcGF1c2VkKS4gIE90aGVyd2lzZSwgdGhlIGl0ZW0gd2lsbCBwbGF5Ci0gICAgICogYWZ0ZXIgYWxsIGVhcmxpZXIgaXRlbXMgaW4gdGhlIHF1ZXVlIGhhdmUgZmluaXNoZWQgb3IgYmVlbiByZW1vdmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgZW5xdWV1ZSBhY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBzZXNzaW9ucyBqdXN0IGxpa2UgcGxheS4KLSAgICAgKiBJdHMgcGFyYW1ldGVycyBhbmQgcmVzdWx0cyBhcmUgYWxzbyB0aGUgc2FtZS4gIE9ubHkgdGhlIHF1ZXVpbmcgYmVoYXZpb3IKLSAgICAgKiBpcyBkaWZmZXJlbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5RVUVVRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uRU5RVUVVRSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFNlZWsgbWVkaWEgaXRlbSB0byBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIG1vZGlmeSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbgotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gb25seSBhZmZlY3RzIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBvZiB0aGUgbWVkaWEgaXRlbTsgbm90IGl0cyBwbGF5YmFjayBzdGF0ZS4KLSAgICAgKiBJZiB0aGUgcGxheWJhY2sgcXVldWUgaXMgcGF1c2VkLCB0aGVuIHNlZWtpbmcgc2V0cyB0aGUgcG9zaXRpb24gYnV0IHRoZSBpdGVtCi0gICAgICogcmVtYWlucyBwYXVzZWQuICBMaWtld2lzZSBpZiB0aGUgaXRlbSBpcyBwbGF5aW5nLCB0aGVuIHNlZWtpbmcgd2lsbCBjYXVzZSBwbGF5YmFjawotICAgICAqIHRvIGp1bXAgdG8gdGhlIG5ldyBwb3NpdGlvbiBhbmQgY29udGludWUgcGxheWluZyBmcm9tIHRoYXQgcG9pbnQuICBJZiB0aGUgaXRlbSBoYXMKLSAgICAgKiBub3QgeWV0IHN0YXJ0ZWQgcGxheWluZywgdGhlbiB0aGUgbmV3IHBsYXliYWNrIHBvc2l0aW9uIGlzIHJlbWVtYmVyZWQgYnkgdGhlCi0gICAgICogcXVldWUgYW5kIHVzZWQgYXMgdGhlIGl0ZW0ncyBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gd2hlbiBwbGF5YmFjayBldmVudHVhbGx5IGJlZ2lucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIG1lZGlhIGl0ZW0ncyBwbGF5YmFjayBwb3NpdGlvbiBpcyBjaGFuZ2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHNlZWsuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG5ldwotICAgICAqIGNvbnRlbnQgcG9zaXRpb24gZm9yIHBsYXliYWNrIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQotICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGNvbnRlbnQgcG9zaXRpb24gaXMgaW52YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0KLSAgICAgKiBpcyBpbiBhIHRlcm1pbmFsIHN0YXRlLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRUVLID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TRUVLIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIGl0ZW0gcGxheWJhY2sgc3RhdHVzCi0gICAgICogYW5kIHByb2dyZXNzIGluZm9ybWF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBwbGF5YmFjayBzdGF0dXMgYW5kIHByb2dyZXNzCi0gICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHF1ZXJ5LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgY3VycmVudCBzdGF0dXMgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBvciBtZWRpYSBpdGVtIGlkIGFyZSB1bmtub3duCi0gICAgICogb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU1RBVFVTID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUmVtb3ZlIG1lZGlhIGl0ZW0gZnJvbSBzZXNzaW9uJ3MgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbQotICAgICAqIGZyb20gdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZS4gIElmIHRoZSBjdXJyZW50IGl0ZW0gaXMgcmVtb3ZlZCwgdGhlbgotICAgICAqIHBsYXliYWNrIHdpbGwgcHJvY2VlZCB0byB0aGUgbmV4dCBtZWRpYSBpdGVtIChhc3N1bWluZyB0aGUgcXVldWUgaGFzIG5vdCBiZWVuCi0gICAgICogcGF1c2VkKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBwYXVzZSBzdGF0ZSBvZiB0aGUgcXVldWUuICBJZiB0aGUgcXVldWUgd2FzIHBhdXNlZAotICAgICAqIHRoZW4gaXQgcmVtYWlucyBwYXVzZWQgKGV2ZW4gaWYgaXQgaXMgbm93IGVtcHR5KSB1bnRpbCBhIHJlc3VtZSwgc3RvcCBvciBwbGF5Ci0gICAgICogYWN0aW9uIGlzIGlzc3VlZCB0aGF0IGNhdXNlcyB0aGUgcGF1c2Ugc3RhdGUgdG8gYmUgY2xlYXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byByZW1vdmUuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0gaXMgaW4gYSB0ZXJtaW5hbCBzdGF0ZSAoYW5kIHRoZXJlZm9yZQotICAgICAqIG5vIGxvbmdlciBpbiB0aGUgcXVldWUpLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRU1PVkUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlJFTU9WRSI7Ci0KLSAgICAvKiBSZW1vdGUgcGxheWJhY2sgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGUgd2hvbGUgcGxheWJhY2sgcXVldWUuICovCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBhdXNlIG1lZGlhIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSBwYXVzZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHBhdXNlZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QQVVTRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUEFVU0UiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBSZXN1bWUgbWVkaWEgcGxheWJhY2sgKHVucGF1c2UpLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSByZXN1bWVkLgotICAgICAqIFJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHtAbGluayAjQUNUSU9OX1BBVVNFfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgcmVzdW1lZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFU1VNRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUkVTVU1FIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RvcCBtZWRpYSBwbGF5YmFjayAoY2xlYXIgcXVldWUgYW5kIHVucGF1c2UpLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gc3RvcCBwbGF5YmFjaywgY2FuY2VsIGFuZCByZW1vdmUKLSAgICAgKiBhbGwgbWVkaWEgaXRlbXMgZnJvbSB0aGUgc2Vzc2lvbidzIG1lZGlhIGl0ZW0gcXVldWUgYW5kLCByZXNldCB0aGUgcXVldWUncwotICAgICAqIHBhdXNlIHN0YXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50Ci0gICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMgb2YgZWFjaCBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSBzdG9wcGVkIChjbGVhcmVkIGFuZCB1bnBhdXNlZCkuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVE9QID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVE9QIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RhcnQgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGludmFsaWRhdGUgdGhlIGN1cnJlbnQgc2Vzc2lvbgotICAgICAqIGFuZCBzdGFydCBhIG5ldyBzZXNzaW9uLiAgVGhlIG5ldyBzZXNzaW9uIGluaXRpYWxseSBoYXMgYW4gZW1wdHkgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZQotICAgICAqIGlzIHNlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMKLSAgICAgKiBvZiBlYWNoIGl0ZW0uICBUaGUgcHJldmlvdXMgc2Vzc2lvbiBiZWNvbWVzIG5vIGxvbmdlciB2YWxpZCBhbmQgdGhlIG5ldyBzZXNzaW9uCi0gICAgICogdGFrZXMgY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCi0gICAgICogYWJvdXQgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20KLSAgICAgKiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHRoYXQgd2FzIHN0YXJ0ZWQgYnkgdGhlIHJlcXVlc3QuICBUaGlzIHdpbGwgYWx3YXlzIGJlIGEgYnJhbmQgbmV3IHNlc3Npb24KLSAgICAgKiBkaXN0aW5jdCBmcm9tIGFueSBvdGhlciBwcmV2aW91c2x5IGNyZWF0ZWQgc2Vzc2lvbnMuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYQotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBzZXNzaW9uIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHRoZSBzZXNzaW9uJ3MKLSAgICAgKiBxdWV1ZSBpcyBwYXVzZWQgb3IgcmVzdW1lZCBvciB3aGVuIHRoZSBzZXNzaW9uIGlzIHRlcm1pbmF0ZWQgb3IgaW52YWxpZGF0ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXN9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5DdXN0b20gbWVzc2FnZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYSB7QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVIgbWVzc2FnZSByZWNlaXZlcn0KLSAgICAgKiB0aGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgcmVjZWl2ZXIKLSAgICAgKiB3aGVuIHRoZSBzZXNzaW9uIGhhcyBhbnkgbWVzc2FnZXMgdG8gc2VuZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8ge0BsaW5rICNFWFRSQV9NRVNTQUdFfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVEFSVF9TRVNTSU9OIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIHNlc3Npb24gc3RhdHVzIGluZm9ybWF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgc3BlY2lmaWVkIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHdob3NlIHN0YXR1cyBpcyB0byBiZSByZXRyaWV2ZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU0VTU0lPTl9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBFbmQgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGVuZCB0aGUgc3BlY2lmaWVkIHNlc3Npb24uCi0gICAgICogVGhlIHNlc3Npb24gYmVjb21lcyBubyBsb25nZXIgdmFsaWQgYW5kIHRoZSByb3V0ZSBjZWFzZXMgdG8gYmUgdW5kZXIgY29udHJvbAotICAgICAqIG9mIHRoZSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMjU0VTU0lPTl9TVEFURV9FTkRFRH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50IHRvCi0gICAgICogdGhlIHNlc3Npb24ncyBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBZGRpdGlvbmFsbHksIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBxdWV1ZSBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSBhbmQgYSBzdGF0dXMgdXBkYXRlIGlzIHNlbnQKLSAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnMgaW5kaWNhdGluZyB0aGUgbmV3IHN0YXR1cyBvZiBlYWNoIGl0ZW0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uIHRvIGVuZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIEluIG90aGVyIHdvcmRzLCBpdCBpcyBhbiBlcnJvciB0byBhdHRlbXB0IHRvIGVuZCBhIHNlc3Npb24gb3RoZXIgdGhhbiB0aGUKLSAgICAgKiBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VORF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5FTkRfU0VTU0lPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBDdXN0b20gbWVkaWEgY29udHJvbCBhY3Rpb246IFNlbmQge0BsaW5rICNFWFRSQV9NRVNTQUdFfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcm91dGUgdG8gaGFuZGxlIGEgbWVzc2FnZSBkZXNjcmliZWQgYnkgRVhUUkFfTUVTU0FHRS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggd2lsbCBoYW5kbGUgdGhpcyBtZXNzYWdlLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSB0byBzZW5kLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIEFueSBtZXNzYWdlcyBkZWZpbmVkIGJ5IGVhY2ggbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiBBbnkgZXJyb3IgbWVzc2FnZXMgZGVmaW5lZCBieSBlYWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFTkRfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU0VORF9NRVNTQUdFIjsKLQotICAgIC8qIEV4dHJhcyBhbmQgcmVsYXRlZCBjb25zdGFudHMuICovCi0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gaWQuCi0gICAgICogPHA+Ci0gICAgICogQW4gb3BhcXVlIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVtb3RlIHBsYXliYWNrIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB2YXJpb3VzIGFjdGlvbnMgdG8gc3BlY2lmeSB0aGUgaWQgb2YgdGhlIG1lZGlhIHNlc3Npb24gdG8gYmUgY29udHJvbGxlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fSUQgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLlNFU1NJT05fSUQiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIHN0YXR1cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIG1lZGlhIHNlc3Npb24gYWN0aW9ucyBzdWNoIGFzIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059LAotICAgICAqIHtAbGluayAjQUNUSU9OX1BBVVNFfSwgYW5kIHtAbGluayAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30KLSAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKLSAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICogYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QgdXNpbmcKLSAgICAgKiB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gdG8gc3BlY2lmeSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbiBjaGFuZ2VzLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiBpZCBhbmQgaXRzIHVwZGF0ZWQgc3RhdHVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICogc2Vzc2lvbiBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBtZXNzYWdlIHJlY2VpdmVyLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSB0byBzcGVjaWZ5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gaGFzIGEgbWVzc2FnZSB0byBzZW5kLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiBpZCBhbmQgaXRzIG1lc3NhZ2UuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSBmcm9tCi0gICAgICogdGhlIHNlc3Npb24gYXMgYSBidW5kbGUgb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FU1NBR0VfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLk1FU1NBR0VfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIGlkLgotICAgICAqIDxwPgotICAgICAqIEFuIG9wYXF1ZSB1bmlxdWUgaWRlbnRpZmllciByZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yCi0gICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdGhhdCByZXByZXNlbnRzIHRoZSBtZWRpYSBpdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlCi0gICAgICogcGxheWJhY2sgcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHZhcmlvdXMgYWN0aW9ucyB0byBzcGVjaWZ5IHRoZSBpZCBvZiB0aGUgbWVkaWEgaXRlbSB0byBiZSBjb250cm9sbGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIGl0ZW0gaW4gcXVlc3Rpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9JRCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9JRCI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzLgotICAgICAqIDxwPgotICAgICAqIFJldHVybmVkIGFzIGEgcmVzdWx0IGZyb20gbWVkaWEgaXRlbSBhY3Rpb25zIHN1Y2ggYXMge0BsaW5rICNBQ1RJT05fUExBWX0sCi0gICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0sIHtAbGluayAjQUNUSU9OX1NFRUt9LCBhbmQge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30KLSAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKLSAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICogYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QgdXNpbmcKLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIExvbmcgZXh0cmE6IE1lZGlhIGl0ZW0gY29udGVudCBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSB0aGUKLSAgICAgKiBzdGFydGluZyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFRUt9IHRvIHNldCBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqIDxwPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1BPU0lUSU9OIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBtZXRhZGF0YS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSBtZXRhZGF0YQotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudCBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgbWV0YWRhdGEga2V5LXZhbHVlIHBhaXJzIGFzIGRlZmluZWQKLSAgICAgKiBpbiB7QGxpbmsgTWVkaWFJdGVtTWV0YWRhdGF9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX01FVEFEQVRBID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX01FVEFEQVRBIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogSFRUUCByZXF1ZXN0IGhlYWRlcnMuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgSFRUUCByZXF1ZXN0Ci0gICAgICogaGVhZGVycyB0byBiZSBpbmNsdWRlZCB3aGVuIGZldGNoaW5nIHRvIHRoZSBjb250ZW50IGluZGljYXRlZCBieSB0aGUgbWVkaWEKLSAgICAgKiBpdGVtJ3MgZGF0YSBVcmkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgZXh0cmEgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBhdXRoZW50aWNhdGlvbiB0b2tlbnMgYW5kIG90aGVyCi0gICAgICogcGFyYW1ldGVycyB0byB0aGUgc2VydmVyIHNlcGFyYXRlbHkgZnJvbSB0aGUgbWVkaWEgaXRlbSdzIGRhdGEgVXJpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKLSAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVycy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9IVFRQX0hFQURFUlMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLkhUVFBfSEVBREVSUyI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeQotICAgICAqIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFib3V0IGEgcGFydGljdWxhcgotICAgICAqIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIGl0ZW0gY2hhbmdlcywgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIGl0ZW0gYmVsb25ncywgdGhlIHNlc3Npb24gc3RhdHVzLCB0aGUgaXRlbSdzIGlkCi0gICAgICogYW5kIHRoZSBpdGVtJ3MgdXBkYXRlZCBzdGF0dXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBzYW1lIHBlbmRpbmcgaW50ZW50IGFuZCBicm9hZGNhc3QgcmVjZWl2ZXIgbWF5IGJlIHNoYXJlZCBieSBhbnkgbnVtYmVyIG9mCi0gICAgICogbWVkaWEgaXRlbXMgc2luY2UgdGhlIGJyb2FkY2FzdCBpbnRlbnQgaW5jbHVkZXMgdGhlIG1lZGlhIHNlc3Npb24gaWQKLSAgICAgKiBhbmQgbWVkaWEgaXRlbSBpZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YgdGhlCi0gICAgICogbWVkaWEgaXRlbSBpbiBxdWVzdGlvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICogaXRlbSBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lc3NhZ2UuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFTkRfTUVTU0FHRX0sIGFuZCBpbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSIG1lc3NhZ2UgcmVjZWl2ZXJzfSB0byBkZXNjcmliZSBhIG1lc3NhZ2UgYmV0d2VlbiBhCi0gICAgICogc2Vzc2lvbiBhbmQgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5NRVNTQUdFIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIgZXh0cmE6IEVycm9yIGNvZGUuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIGFsbCBtZWRpYSBjb250cm9sIHJlcXVlc3RzIHRvIGRlc2NyaWJlIHRoZSBjYXVzZSBvZiBhbiBlcnJvci4KLSAgICAgKiBUaGlzIGV4dHJhIG1heSBiZSBvbWl0dGVkIHdoZW4gdGhlIGVycm9yIGlzIHVua25vd24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBvbmUgb2Y6IHtAbGluayAjRVJST1JfVU5LTk9XTn0sIHtAbGluayAjRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OfSwKLSAgICAgKiB7QGxpbmsgI0VSUk9SX0lOVkFMSURfU0VTU0lPTl9JRH0sIHtAbGluayAjRVJST1JfSU5WQUxJRF9JVEVNX0lEfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRVJST1JfQ09ERSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5FUlJPUl9DT0RFIjsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IEFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5LTk9XTiA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OID0gMTsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IFRoZSBzZXNzaW9uIGlkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX1NFU1NJT05fSUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogVGhlIGl0ZW0gaWQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpbnZhbGlkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfSVRFTV9JRCA9IDM7Ci0KLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbEludGVudCgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJkZGI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3Igc3BlY2lmeWluZyBtZXRhZGF0YSBhYm91dCBhIG1lZGlhIGl0ZW0gYXMgYSB7QGxpbmsgQnVuZGxlfS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgotICogPC9wPjxwPgotICogTWVkaWEgaXRlbSBtZXRhZGF0YSBpcyBkZXNjcmliZWQgYXMgYSBidW5kbGUgb2Yga2V5L3ZhbHVlIHBhaXJzIGFzIGRlZmluZWQKLSAqIGluIHRoaXMgY2xhc3MuICBUaGUgZG9jdW1lbnRhdGlvbiBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdmFsdWUgYXNzb2NpYXRlZAotICogd2l0aCBlYWNoIGtleS4KLSAqIDwvcD48cD4KLSAqIEFuIGFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IGFkZGl0aW9uYWwgY3VzdG9tIG1ldGFkYXRhIGtleXMgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZQotICogdGhhdCB0aGV5IHdpbGwgYmUgcmVjb2duaXplZCBieSB0aGUgZGVzdGluYXRpb24uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYUl0ZW1NZXRhZGF0YSB7Ci0gICAgLyoKLSAgICAgKiBOb3RlOiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIGFsc28gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgbWV0YWRhdGEga2V5cyB0aGF0IGNhbiBiZQotICAgICAqIHJldHJpZXZlZCBmcm9tIGEgY29udGVudCBzdHJlYW0gYWx0aG91Z2ggdGhlIHJlcHJlc2VudGF0aW9uIGlzIHNvbWV3aGF0IGRpZmZlcmVudCBoZXJlCi0gICAgICogc2luY2Ugd2UgYXJlIHNlbmRpbmcgdGhlIGRhdGEgdG8gYSByZW1vdGUgZW5kcG9pbnQuCi0gICAgICovCi0KLSAgICBwcml2YXRlIE1lZGlhSXRlbU1ldGFkYXRhKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFsYnVtIGFydGlzdCBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FMQlVNX0FSVElTVCA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX0FSVElTVCI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBbGJ1bSB0aXRsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEJVTV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX1RJVExFIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFydHdvcmsgVXJpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBVUkkgZm9yIGFuIGltYWdlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSBpdGVtLAotICAgICAqIHN1Y2ggYXMgYWxidW0gb3IgY292ZXIgYXJ0LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJUV09SS19VUkkgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRXT1JLX1VSSSI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBcnRpc3QgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRJU1QiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQXV0aG9yIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVUSE9SID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVVUSE9SIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IENvbXBvc2VyIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NUE9TRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5DT01QT1NFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBUcmFjayB0aXRsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRJVExFIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIga2V5OiBZZWFyIG9mIHB1YmxpY2F0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHllYXIgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfWUVBUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLllFQVIiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBrZXk6IFRyYWNrIG51bWJlciAoc3VjaCBhcyBhIHRyYWNrIG9uIGEgQ0QpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIG9uZS1iYXNlZCBpbnRlZ2VyIHRyYWNrIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RSQUNLX05VTUJFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRSQUNLX05VTUJFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGtleTogRGlzYyBudW1iZXIgd2l0aGluIGEgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBvbmUtYmFzZWQgaW50ZWdlciBkaXNjIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU0NfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTQ19OVU1CRVIiOwotCi0gICAgLyoqCi0gICAgICogTG9uZyBrZXk6IEl0ZW0gcGxheWJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIDxjb2RlPmxvbmc8L2NvZGU+IG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBkdXJhdGlvbiBtZXRhZGF0YSBpcyBvbmx5IGEgaGludCB0byBlbmFibGUgYSByZW1vdGUgbWVkaWEgcGxheWVyIHRvCi0gICAgICogZ3Vlc3MgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IGJlZm9yZSBpdCBhY3R1YWxseSBvcGVucyB0aGUgbWVkaWEgc3RyZWFtLgotICAgICAqIFRoZSByZW1vdGUgbWVkaWEgcGxheWVyIHNob3VsZCBzdGlsbCBkZXRlcm1pbmUgdGhlIGFjdHVhbCBjb250ZW50IGR1cmF0aW9uIGZyb20KLSAgICAgKiB0aGUgbWVkaWEgc3RyZWFtIGl0c2VsZiBpbmRlcGVuZGVudCBvZiB0aGUgdmFsdWUgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoaXMga2V5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRFVSQVRJT04gPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5EVVJBVElPTiI7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWEyZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCi0gKiA8L3A+PHA+Ci0gKiBBcyBhIG1lZGlhIGl0ZW0gaXMgcGxheWVkLCBpdCB0cmFuc2l0aW9ucyB0aHJvdWdoIGEgc2VxdWVuY2Ugb2Ygc3RhdGVzIGluY2x1ZGluZzoKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElORyBwZW5kaW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9CVUZGRVJJTkcgYnVmZmVyaW5nfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlORyBwbGF5aW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUQgcGF1c2VkfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQgZmluaXNoZWR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LCBhbmQKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9LiAgUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBzdGF0ZQotICogZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgotICogPC9wPjxwPgotICogV2hpbGUgdGhlIGl0ZW0gaXMgcGxheWluZywgdGhlIHBsYXliYWNrIHN0YXR1cyBtYXkgYWxzbyBpbmNsdWRlIHByb2dyZXNzIGluZm9ybWF0aW9uCi0gKiBhYm91dCB0aGUge0BsaW5rICNnZXRDb250ZW50UG9zaXRpb24gY29udGVudCBwb3NpdGlvbn0gYW5kCi0gKiB7QGxpbmsgI2dldENvbnRlbnREdXJhdGlvbiBjb250ZW50IGR1cmF0aW9ufSBhbHRob3VnaCBub3QgYWxsIHJvdXRlIGRlc3RpbmF0aW9ucwotICogd2lsbCByZXBvcnQgaXQuCi0gKiA8L3A+PHA+Ci0gKiBUbyBtb25pdG9yIHBsYXliYWNrIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5YmFjayByZXF1ZXN0fS4gIE5vdGUgdGhhdAotICogdGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIG1ham9yIHN0YXR1cyBjaGFuZ2VzIHN1Y2ggYXMgYQotICogdHJhbnNpdGlvbiBmcm9tIHBsYXlpbmcgdG8gZmluaXNoZWQuCi0gKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgotICogVGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmb3IgbWlub3IgcHJvZ3Jlc3MgdXBkYXRlcyBzdWNoIGFzCi0gKiBjaGFuZ2VzIHRvIHBsYXliYWNrIHBvc2l0aW9uIG9yIGR1cmF0aW9uLiAgSWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIG1vbml0b3IKLSAqIHBsYXliYWNrIHByb2dyZXNzLCB0aGVuIGl0IG11c3QgdXNlIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzIHJlcXVlc3R9IHRvIHBvbGwgZm9yIGNoYW5nZXMKLSAqIHBlcmlvZGljYWxseSBhbmQgZXN0aW1hdGUgdGhlIHBsYXliYWNrIHBvc2l0aW9uIHdoaWxlIHBsYXlpbmcuICBOb3RlIHRoYXQgdGhlcmUgbWF5Ci0gKiBiZSBhIHNpZ25pZmljYW50IHBvd2VyIGltcGFjdCB0byBwb2xsaW5nIHNvIHRoZSBhcHBsaWNhdGlvbiBpcyBhZHZpc2VkIG9ubHkKLSAqIHRvIHBvbGwgd2hlbiB0aGUgc2NyZWVuIGlzIG9uIGFuZCBuZXZlciBtb3JlIHRoYW4gYWJvdXQgb25jZSBldmVyeSA1IHNlY29uZHMgb3Igc28uCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtU3RhdHVzIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USU1FU1RBTVAgPSAidGltZXN0YW1wIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVEFURSA9ICJwbGF5YmFja1N0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05URU5UX1BPU0lUSU9OID0gImNvbnRlbnRQb3NpdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9EVVJBVElPTiA9ICJjb250ZW50RHVyYXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGVuZGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgbm90IHlldCBzdGFydGVkIHBsYXliYWNrIGJ1dCB3aWxsIGJlIHBsYXllZCBldmVudHVhbGx5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QRU5ESU5HID0gMDsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQbGF5aW5nLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QTEFZSU5HID0gMTsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQYXVzZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGl0ZW0gaGFzIGJlZW4gcGF1c2VkLiAgUGxheWJhY2sgY2FuIGJlCi0gICAgICogcmVzdW1lZCB1c2luZyB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIHJlc3VtZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QQVVTRUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IEJ1ZmZlcmluZyBvciBzZWVraW5nIHRvIGEgbmV3IHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHRlbXBvcmFyaWx5IGludGVycnVwdGVkCi0gICAgICogdG8gZmV0Y2ggbW9yZSBjb250ZW50LiAgUGxheWJhY2sgd2lsbCBjb250aW51ZSBhdXRvbWF0aWNhbGx5Ci0gICAgICogd2hlbiBlbm91Z2ggY29udGVudCBoYXMgYmVlbiBidWZmZXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HID0gMzsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBGaW5pc2hlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBwbGF5ZWQgdG8gdGhlIGVuZCBvZiB0aGUgY29udGVudCBhbmQgZmluaXNoZWQgbm9ybWFsbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgZmluaXNoZWQgbWVkaWEgaXRlbSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEID0gNDsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBDYW5jZWxlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgZXhwbGljaXRseSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGJ5IHRoZQotICAgICAqIGFwcGxpY2F0aW9uLiAgSXRlbXMgbWF5IGJlIGNhbmNlbGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHVzaW5nCi0gICAgICogdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSByZW1vdmV9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBzdG9wfSBhY3Rpb24gb3IgYnkgaXNzdWluZwotICAgICAqIGFub3RoZXIge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBhY3Rpb24gdGhhdCBoYXMgdGhlCi0gICAgICogc2lkZS1lZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIGNhbmNlbGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9DQU5DRUxFRCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogSW52YWxpZGF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGludmFsaWRhdGVkIHBlcm1hbmVudGx5IGFuZCBpbnZvbHVudGFyaWx5LgotICAgICAqIFRoaXMgc3RhdGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBhbmQgcmVtb3ZlZAotICAgICAqIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgdGhlIHNlc3Npb24gdG8gd2hpY2ggaXQgYmVsb25ncyB3YXMgaW52YWxpZGF0ZWQKLSAgICAgKiAodHlwaWNhbGx5IGJ5IGFub3RoZXIgYXBwbGljYXRpb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBpbnZhbGlkYXRpb24gb2NjdXJzLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGdlbmVyYWxseSB3YWl0IGZvciB0aGUgdXNlcgotICAgICAqIHRvIHBlcmZvcm0gYW4gZXhwbGljaXQgYWN0aW9uLCBzdWNoIGFzIGNsaWNraW5nIG9uIGEgcGxheSBidXR0b24gaW4gdGhlIFVJLAotICAgICAqIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBtZWRpYSBzZXNzaW9uIHRvIGF2b2lkIHVubmVjZXNzYXJpbHkgaW50ZXJydXB0aW5nCi0gICAgICogYW5vdGhlciBhcHBsaWNhdGlvbiB0aGF0IG1heSBoYXZlIGp1c3Qgc3RhcnRlZCB1c2luZyB0aGUgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWJhY2sgaGFsdGVkIG9yIGFib3J0ZWQgZHVlIHRvIGFuIGVycm9yLgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGVzIG9mIGVycm9ycyBhcmUgbm8gbmV0d29yayBjb25uZWN0aXZpdHkgd2hlbiBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIGNvbnRlbnQKLSAgICAgKiBmcm9tIGEgc2VydmVyLCBvciBleHBpcmVkIHVzZXIgY3JlZGVudGlhbHMgd2hlbiB0cnlpbmcgdG8gcGxheSBzdWJzY3JpcHRpb24tYmFzZWQKLSAgICAgKiBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIG1lZGlhIGl0ZW0gaW4gdGhlIGVycm9yIHN0YXRlIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwKLSAgICAgKiB0aGUgYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfRVJST1IgPSA3OwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBleHRyYTogSFRUUCBzdGF0dXMgY29kZS4KLSAgICAgKiA8cD4KLSAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgZW5jb3VudGVyZWQgd2hlbiB0aGUgY29udGVudAotICAgICAqIHdhcyByZXF1ZXN0ZWQgYWZ0ZXIgYWxsIHJlZGlyZWN0cyB3ZXJlIGZvbGxvd2VkLiAgVGhpcyBrZXkgb25seSBuZWVkcyB0bwotICAgICAqIHNwZWNpZmllZCB3aGVuIHRoZSBjb250ZW50IHVyaSB1c2VzIHRoZSBIVFRQIG9yIEhUVFBTIHNjaGVtZSBhbmQgYW4gZXJyb3IKLSAgICAgKiBvY2N1cnJlZC4gIFRoaXMga2V5IG1heSBiZSBvbWl0dGVkIGlmIHRoZSBjb250ZW50IHdhcyBhYmxlIHRvIGJlIHBsYXllZAotICAgICAqIHN1Y2Nlc3NmdWxseTsgdGhlcmUgaXMgbm8gbmVlZCB0byByZXBvcnQgYSAyMDAgKE9LKSBzdGF0dXMgY29kZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGFuIGludGVnZXIgSFRUUCBzdGF0dXMgY29kZSwgc3VjaCBhcyA0MDEgKFVuYXV0aG9yaXplZCksCi0gICAgICogNDA0IChOb3QgRm91bmQpLCBvciA1MDAgKFNlcnZlciBFcnJvciksIG9yIDAgaWYgbm9uZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSFRUUF9TVEFUVVNfQ09ERSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9TVEFUVVNfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IEhUVFAgcmVzcG9uc2UgaGVhZGVycy4KLSAgICAgKiA8cD4KLSAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2hlbiB0aGUgY29udGVudCB3YXMKLSAgICAgKiByZXF1ZXN0ZWQgZnJvbSB0aGUgbmV0d29yay4gIFRoZSBoZWFkZXJzIG1heSBpbmNsdWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgY29udGVudCBvciBhbnkgZXJyb3JzIGNvbmRpdGlvbnMgdGhhdCB3ZXJlIGVuY291bnRlcmVkIHdoaWxlCi0gICAgICogdHJ5aW5nIHRvIGZldGNoIHRoZSBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKLSAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfUkVTUE9OU0VfSEVBREVSUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9SRVNQT05TRV9IRUFERVJTIjsKLQotICAgIE1lZGlhSXRlbVN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHBsYXliYWNrIHN0YXRlLiAgT25lIG9mIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElOR30sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9QTEFZSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUR9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9GSU5JU0hFRH0sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRH0sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUR9LAotICAgICAqIG9yIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1J9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgUExBWUJBQ0tfU1RBVEVfRVJST1IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwotICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gaW4gbWlsbGlzZWNvbmRzLCBvciAtMSBpZiB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YKLSAgICAgKiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50RHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfRFVSQVRJT04sIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhSXRlbVN0YXR1c3sgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKLSAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwbGF5YmFja1N0YXRlPSIpLmFwcGVuZChwbGF5YmFja1N0YXRlVG9TdHJpbmcoZ2V0UGxheWJhY2tTdGF0ZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudFBvc2l0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50UG9zaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudER1cmF0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50RHVyYXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGxheWJhY2tTdGF0ZVRvU3RyaW5nKGludCBwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAocGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QRU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAicGVuZGluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ1ZmZlcmluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJwbGF5aW5nIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAicGF1c2VkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmaW5pc2hlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0NBTkNFTEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiY2FuY2VsZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlcnJvciI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcocGxheWJhY2tTdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFJdGVtU3RhdHVzIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFJdGVtU3RhdHVzKGJ1bmRsZSkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMgbWVkaWEgaXRlbSBzdGF0dXMgb2JqZWN0c30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIGl0ZW0gc3RhdHVzIGJ1aWxkZXIgdXNpbmcgdGhlIGN1cnJlbnQgdGltZSBhcyB0aGUKLSAgICAgICAgICogcmVmZXJlbmNlIHRpbWVzdGFtcC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBsYXliYWNrU3RhdGUgVGhlIGl0ZW0gcGxheWJhY2sgc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7Ci0gICAgICAgICAgICBzZXRQbGF5YmFja1N0YXRlKHBsYXliYWNrU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RhdGUoaW50IHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgcGxheWJhY2tTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgICAgICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudFBvc2l0aW9uKGxvbmcgcG9zaXRpb25NaWxsaXNlY29uZHMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXNlY29uZHMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdG90YWwgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQgdG8gYmUgcGxheWVkIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlcgotICAgICAgICAgKiBvZiBtaWxsaXNlY29uZHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb250ZW50RHVyYXRpb24obG9uZyBkdXJhdGlvbk1pbGxpc2Vjb25kcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCBkdXJhdGlvbk1pbGxpc2Vjb25kcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFJdGVtU3RhdHVzIGJ1aWxkKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW1TdGF0dXMobUJ1bmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmM4NGZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiBhIHJvdXRlLgotICogPHA+Ci0gKiBFYWNoIHJvdXRlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgYW4gb3BhcXVlIGlkIHN0cmluZy4gIFRoaXMgdG9rZW4KLSAqIG1heSB0YWtlIGFueSBmb3JtIGFzIGxvbmcgYXMgaXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURlc2NyaXB0b3IgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImlkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9HUk9VUF9NRU1CRVJfSURTID0gImdyb3VwTWVtYmVySWRzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gIm5hbWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0NSSVBUSU9OID0gInN0YXR1cyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9VUkkgPSAiaWNvblVyaSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRCA9ICJlbmFibGVkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05ORUNUSU5HID0gImNvbm5lY3RpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTk5FQ1RJT05fU1RBVEUgPSAiY29ubmVjdGlvblN0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX0ZJTFRFUlMgPSAiY29udHJvbEZpbHRlcnMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1RZUEUgPSAicGxheWJhY2tUeXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVFJFQU0gPSAicGxheWJhY2tTdHJlYW0iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRV9UWVBFID0gImRldmljZVR5cGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRSA9ICJ2b2x1bWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRV9NQVggPSAidm9sdW1lTWF4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUVfSEFORExJTkcgPSAidm9sdW1lSGFuZGxpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lEID0gInByZXNlbnRhdGlvbkRpc3BsYXlJZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ0FOX0RJU0NPTk5FQ1QgPSAiY2FuRGlzY29ubmVjdCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VUVElOR1NfSU5URU5UID0gInNldHRpbmdzSW50ZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04gPSAibWluQ2xpZW50VmVyc2lvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX0NMSUVOVF9WRVJTSU9OID0gIm1heENsaWVudFZlcnNpb24iOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgTGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKLQotICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8SW50ZW50RmlsdGVyPiBjb250cm9sRmlsdGVycykgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBjb250cm9sRmlsdGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQotICAgICAqIGlkZW50aWZpZXIgZm9yIHRoZSByb3V0ZSBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYWxsIHJvdXRlcyBvZmZlcmVkCi0gICAgICogYnkgdGhlIHByb3ZpZGVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBncm91cCBtZW1iZXIgaWRzIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAqIDwvcD4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHcm91cE1lbWJlcklkcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZyhLRVlfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICBTdHJpbmcgaWNvblVyaSA9IG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9JQ09OX1VSSSk7Ci0gICAgICAgIHJldHVybiBpY29uVXJpID09IG51bGwgPyBudWxsIDogVXJpLnBhcnNlKGljb25VcmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgY29ubmVjdGluZy4KLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ09OTkVDVElORywgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIGNhbiBub3JtYWxseSBiZSBkaXNjb25uZWN0ZWQgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjayB3aGVuCi0gICAgICogdGhlIGRlc3RpbmF0aW9uIGRldmljZSBvbiB0aGUgcm91dGUgaXMgY29ubmVjdGVkIHRvIHR3byBvciBtb3JlIHNvdXJjZQotICAgICAqIGRldmljZXMuIFRoZSByb3V0ZSBwcm92aWRlciBzaG91bGQgdXBkYXRlIHRoZSByb3V0ZSBpbW1lZGlhdGVseSB3aGVuIHRoZQotICAgICAqIG51bWJlciBvZiBjb25uZWN0ZWQgZGV2aWNlcyBjaGFuZ2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUbyBzcGVjaWZ5IHRoYXQgdGhlIHJvdXRlIHNob3VsZCBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgdXNlCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyI3Vuc2VsZWN0KGludCl9IHdpdGgKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ0FOX0RJU0NPTk5FQ1QsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIHtAbGluayBJbnRlbnRTZW5kZXJ9IGZvciBzdGFydGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICogcm91dGUuIFRoZSBhY3Rpdml0eSBtYXkgaGF2ZSBzcGVjaWZpYyByb3V0ZSBzZXR0aW5ncyBvciBnZW5lcmFsIHNldHRpbmdzCi0gICAgICogZm9yIHRoZSBjb25uZWN0ZWQgZGV2aWNlIG9yIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBBbiB7QGxpbmsgSW50ZW50U2VuZGVyfSB0byBzdGFydCBhIHNldHRpbmdzIGFjdGl2aXR5LgotICAgICAqLwotICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NBY3Rpdml0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfU0VUVElOR1NfSU5URU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKLSAgICB9Ci0KLSAgICB2b2lkIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG1CdW5kbGUuPEludGVudEZpbHRlcj5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gQ29sbGVjdGlvbnMuPEludGVudEZpbHRlcj5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RSRUFNLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfVFZ9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfREVWSUNFX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUVfTUFYKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6Ci0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfRklYRUR9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FX0hBTkRMSU5HLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludCgKLSAgICAgICAgICAgICAgICBLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQsIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyByb3V0ZSBkZXNjcmlwdG9yLgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgaW50IGdldE1pbkNsaWVudFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUlOX0NMSUVOVF9WRVJTSU9OLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OX1NUQVJUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgaW50IGdldE1heENsaWVudFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUFYX0NMSUVOVF9WRVJTSU9OLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBkZXNjcmlwdG9yIGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVDb250cm9sRmlsdGVycygpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ2V0SWQoKSkKLSAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShnZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgfHwgbUNvbnRyb2xGaWx0ZXJzLmNvbnRhaW5zKG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlRGVzY3JpcHRvcnsgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoImlkPSIpLmFwcGVuZChnZXRJZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBncm91cE1lbWJlcklkcz0iKS5hcHBlbmQoZ2V0R3JvdXBNZW1iZXJJZHMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZT0iKS5hcHBlbmQoZ2V0TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbj0iKS5hcHBlbmQoZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaWNvblVyaT0iKS5hcHBlbmQoZ2V0SWNvblVyaSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0VuYWJsZWQ9IikuYXBwZW5kKGlzRW5hYmxlZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0Nvbm5lY3Rpbmc9IikuYXBwZW5kKGlzQ29ubmVjdGluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uU3RhdGU9IikuYXBwZW5kKGdldENvbm5lY3Rpb25TdGF0ZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb250cm9sRmlsdGVycz0iKS5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xGaWx0ZXJzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tUeXBlPSIpLmFwcGVuZChnZXRQbGF5YmFja1R5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdHJlYW09IikuYXBwZW5kKGdldFBsYXliYWNrU3RyZWFtKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRldmljZVR5cGU9IikuYXBwZW5kKGdldERldmljZVR5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lPSIpLmFwcGVuZChnZXRWb2x1bWUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lTWF4PSIpLmFwcGVuZChnZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lSGFuZGxpbmc9IikuYXBwZW5kKGdldFZvbHVtZUhhbmRsaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iKS5hcHBlbmQoZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWluQ2xpZW50VmVyc2lvbj0iKS5hcHBlbmQoZ2V0TWluQ2xpZW50VmVyc2lvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBtYXhDbGllbnRWZXJzaW9uPSIpLmFwcGVuZChnZXRNYXhDbGllbnRWZXJzaW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcnN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUdyb3VwTWVtYmVySWRzOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShkZXNjcmlwdG9yLm1CdW5kbGUpOwotCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubUNvbnRyb2xGaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPihkZXNjcmlwdG9yLm1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQotICAgICAgICAgKiBpZGVudGlmaWVyIGZvciB0aGUgcm91dGUgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCByb3V0ZXMgb2ZmZXJlZAotICAgICAgICAgKiBieSB0aGUgcHJvdmlkZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBpZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgZ3JvdXAgbWVtYmVyIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIEEgcm91dGUgZGVzY3JpcHRvciB0aGF0IGhhcyBvbmUgb3IgbW9yZSBncm91cCBtZW1iZXIgcm91dGUgaWRzCi0gICAgICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRHcm91cE1lbWJlcklkKFN0cmluZyBncm91cE1lbWJlcklkKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ3JvdXBNZW1iZXJJZCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJncm91cE1lbWJlcklkIG11c3Qgbm90IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlcklkcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtR3JvdXBNZW1iZXJJZHMuY29udGFpbnMoZ3JvdXBNZW1iZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJJZHMuYWRkKGdyb3VwTWVtYmVySWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2YgZ3JvdXAgbWVtYmVyIGlkcyBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXBNZW1iZXJJZHMoQ29sbGVjdGlvbjxTdHJpbmc+IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdyb3VwTWVtYmVySWRzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFncm91cE1lbWJlcklkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkR3JvdXBNZW1iZXJJZChncm91cE1lbWJlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfTkFNRSwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoZSBVUkkgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT5jb250ZW50ICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfQ09OVEVOVH0pPC9saT4KLSAgICAgICAgICogPGxpPmFuZHJvaWQucmVzb3VyY2UgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9BTkRST0lEX1JFU09VUkNFfSkKLSAgICAgICAgICogPC9saT4KLSAgICAgICAgICogPGxpPmZpbGUgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9GSUxFfSk8L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJY29uVXJpKFVyaSBpY29uVXJpKSB7Ci0gICAgICAgICAgICBpZiAoaWNvblVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWNvblVyaSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfSUNPTl9VUkksIGljb25VcmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBEaXNhYmxlZCByb3V0ZXMgcmVwcmVzZW50IHJvdXRlcyB0aGF0IGEgcm91dGUgcHJvdmlkZXIga25vd3MgYWJvdXQsIHN1Y2ggYXMgcGFpcmVkCi0gICAgICAgICAqIFdpZmkgRGlzcGxheSByZWNlaXZlcnMsIGJ1dCB0aGF0IGFyZSBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBlbmFibGVkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAotICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQuCi0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb25uZWN0aW5nKGJvb2xlYW4gY29ubmVjdGluZykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DT05ORUNUSU5HLCBjb25uZWN0aW5nKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY29ubmVjdGlvbiBzdGF0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25TdGF0ZSBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29ubmVjdGlvblN0YXRlKGludCBjb25uZWN0aW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLCBjb25uZWN0aW9uU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDYW5EaXNjb25uZWN0KGJvb2xlYW4gY2FuRGlzY29ubmVjdCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DQU5fRElTQ09OTkVDVCwgY2FuRGlzY29ubmVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyB0aGUgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgICAgICogcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTZXR0aW5nc0FjdGl2aXR5KEludGVudFNlbmRlciBpcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9TRVRUSU5HU19JTlRFTlQsIGlzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXIgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xGaWx0ZXIoSW50ZW50RmlsdGVyIGZpbHRlcikgewotICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsdGVyIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5jb250YWlucyhmaWx0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZChmaWx0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyBmb3IgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbEZpbHRlcnMoQ29sbGVjdGlvbjxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWx0ZXJzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoSW50ZW50RmlsdGVyIGZpbHRlciA6IGZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udHJvbEZpbHRlcihmaWx0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgdHlwZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBsYXliYWNrVHlwZSBUaGUgcGxheWJhY2sgdHlwZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1R5cGUoaW50IHBsYXliYWNrVHlwZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUsIHBsYXliYWNrVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHN0cmVhbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RyZWFtKGludCBwbGF5YmFja1N0cmVhbSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1NUUkVBTSwgcGxheWJhY2tTdHJlYW0pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyByZWNlaXZlciBkZXZpY2UgdHlwZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRldmljZVR5cGUgVGhlIHJlY2VpdmUgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1RWfSBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGV2aWNlVHlwZShpbnQgZGV2aWNlVHlwZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX0RFVklDRV9UWVBFLCBkZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FLCB2b2x1bWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lTWF4KGludCB2b2x1bWVNYXgpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9WT0xVTUVfTUFYLCB2b2x1bWVNYXgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyB2b2x1bWUgaGFuZGxpbmcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWVIYW5kbGluZyBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lSGFuZGxpbmcoaW50IHZvbHVtZUhhbmRsaW5nKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FX0hBTkRMSU5HLCB2b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKGludCBwcmVzZW50YXRpb25EaXNwbGF5SWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCwgcHJlc2VudGF0aW9uRGlzcGxheUlkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1pbmltdW0gY2xpZW50IHZlcnNpb24uCi0gICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgbG93ZXIgdGhhbiB0aGlzIHdpbGwgbm90IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWluQ2xpZW50VmVyc2lvbihpbnQgbWluVmVyc2lvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX01JTl9DTElFTlRfVkVSU0lPTiwgbWluVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gY2xpZW50IHZlcnNpb24uCi0gICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgaGlnaGVyIHRoYW4gdGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhpcyByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1heENsaWVudFZlcnNpb24oaW50IG1heFZlcnNpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9NQVhfQ0xJRU5UX1ZFUlNJT04sIG1heFZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTlRST0xfRklMVEVSUywgbUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTLCBtR3JvdXBNZW1iZXJJZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihtQnVuZGxlLCBtQ29udHJvbEZpbHRlcnMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5NjI3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUgbWVkaWEgcm91dGVyIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIKLSAqIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUNUSVZFX1NDQU4gPSAiYWN0aXZlU2NhbiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgcm91dGUgc2VsZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3Zlci4KLSAgICAgKiBAcGFyYW0gYWN0aXZlU2NhbiBUcnVlIGlmIGFjdGl2ZSBzY2FubmluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGJvb2xlYW4gYWN0aXZlU2NhbikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQUNUSVZFX1NDQU4sIGFjdGl2ZVNjYW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUobUJ1bmRsZS5nZXRCdW5kbGUoS0VZX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWN0aXZlIHNjYW5uaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlU2NhbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQUNUSVZFX1NDQU4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlzY292ZXJ5IHJlcXVlc3QgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3IuaXNWYWxpZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBvdGhlciA9IChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdClvOwotICAgICAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuZXF1YWxzKG90aGVyLmdldFNlbGVjdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzQWN0aXZlU2NhbigpID09IG90aGVyLmlzQWN0aXZlU2NhbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0U2VsZWN0b3IoKS5oYXNoQ29kZSgpIF4gKGlzQWN0aXZlU2NhbigpID8gMSA6IDApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiRGlzY292ZXJ5UmVxdWVzdHsgc2VsZWN0b3I9IikuYXBwZW5kKGdldFNlbGVjdG9yKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGFjdGl2ZVNjYW49IikuYXBwZW5kKGlzQWN0aXZlU2NhbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChidW5kbGUpIDogbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYTJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKLQotLyoqCi0gKiBNZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIHVzZWQgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyBmb3IKLSAqIHVzZSB3aXRoaW4gYW4gYXBwbGljYXRpb24uICBNZWRpYSByb3V0ZSBwcm92aWRlcnMgbWF5IGFsc28gYmUgZGVjbGFyZWQKLSAqIGFzIGEgc2VydmljZSB0byBwdWJsaXNoIGFkZGl0aW9uYWwgbWVkaWEgcm91dGVzIHRvIGFsbCBhcHBsaWNhdGlvbnMKLSAqIGluIHRoZSBzeXN0ZW0uCi0gKiA8cD4KLSAqIFRoZSBwdXJwb3NlIG9mIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgdG8gZGlzY292ZXIgbWVkaWEgcm91dGVzIHRoYXQgc2F0aXNmeQotICogdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBieSB0aGUgY3VycmVudCB7QGxpbmsgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3R9IGFuZCBwdWJsaXNoIGEKLSAqIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yfSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcm91dGUgYnkgY2FsbGluZwotICoge0BsaW5rICNzZXREZXNjcmlwdG9yfSB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIHtAbGluayBDYWxsYmFja30uCi0gKiA8L3A+PHA+Ci0gKiBUaGUgcHJvdmlkZXIgc2hvdWxkIHdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCBieSBpbXBsZW1lbnRpbmcKLSAqIHtAbGluayAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZH0gYW5kIHVwZGF0aW5nIHRoZSBzZXQgb2Ygcm91dGVzIHRoYXQgaXQgaXMKLSAqIGF0dGVtcHRpbmcgdG8gZGlzY292ZXIuICBJdCBzaG91bGQgYWxzbyBoYW5kbGUgcm91dGUgY29udHJvbCByZXF1ZXN0cyBzdWNoCi0gKiBhcyB2b2x1bWUgY2hhbmdlcyBvciB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50c30KLSAqIGJ5IGltcGxlbWVudGluZyB7QGxpbmsgI29uQ3JlYXRlUm91dGVDb250cm9sbGVyfSB0byByZXR1cm4gYSB7QGxpbmsgUm91dGVDb250cm9sbGVyfQotICogZm9yIGEgcGFydGljdWxhciByb3V0ZS4KLSAqIDwvcD48cD4KLSAqIEEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWF5IGJlIHVzZWQgcHJpdmF0ZWx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBzaW5nbGUKLSAqIGFwcGxpY2F0aW9uIHByb2Nlc3MgYnkgY2FsbGluZyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkUHJvdmlkZXIgTWVkaWFSb3V0ZXIuYWRkUHJvdmlkZXJ9Ci0gKiB0byBhZGQgaXQgdG8gdGhlIGxvY2FsIHtAbGluayBNZWRpYVJvdXRlcn0uICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBhbHNvIGJlIG1hZGUKLSAqIGF2YWlsYWJsZSBnbG9iYWxseSB0byBhbGwgYXBwbGljYXRpb25zIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2V9Ci0gKiBpbiB0aGUgcHJvdmlkZXIncyBtYW5pZmVzdC4gIFdoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQKLSAqIGFzIGEgc2VydmljZSwgYWxsIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgbWVkaWEgcm91dGVyIEFQSSB3aWxsIGJlIGFibGUgdG8KLSAqIGRpc2NvdmVyIGFuZCB1c2VkIHRoZSBwcm92aWRlcidzIHJvdXRlcyB3aXRob3V0IGhhdmluZyB0byBpbnN0YWxsIGFueXRoaW5nIGVsc2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBtdXN0IG9ubHkgYmUgYWNjZXNzZWQgb24gdGhlIG1haW4gdGhyZWFkLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyIHsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEID0gMjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJIYW5kbGVyIG1IYW5kbGVyID0gbmV3IFByb3ZpZGVySGFuZGxlcigpOwotCi0gICAgcHJpdmF0ZSBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2U7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCwgUHJvdmlkZXJNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgaWYgKG1ldGFkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG5ldyBQcm92aWRlck1ldGFkYXRhKG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIGdldENsYXNzKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGV4dCBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgaGFuZGxlciB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gdGhyZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBtSGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHNvbWUgbWV0YWRhdGEgYWJvdXQgdGhlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IgY2hhbmdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gdXNlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FsbGJhY2soQE51bGxhYmxlIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0IHdoaWNoIGluZm9ybXMgdGhlIHByb3ZpZGVyIGFib3V0IHRoZQotICAgICAqIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGdldERpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgIHJldHVybiBtRGlzY292ZXJ5UmVxdWVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZGlzY292ZXJ5IHJlcXVlc3QgdG8gaW5mb3JtIHRoZSBwcm92aWRlciBhYm91dCB0aGUga2luZHMgb2YKLSAgICAgKiByb3V0ZXMgdGhhdCBpdHMgY2xpZW50cyB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgotICAgICAqCi0gICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgIGlmICghbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCkgewotICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSBmYWxzZTsKLSAgICAgICAgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiB0aGUge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGRpc2NvdmVyeSByZXF1ZXN0fQotICAgICAqIGhhcyBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIFdoZW5ldmVyIGFuIGFwcGxpY2F0aW9ucyBjYWxscyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2t9IHRvIHJlZ2lzdGVyCi0gICAgICogYSBjYWxsYmFjaywgaXQgYWxzbyBwcm92aWRlcyBhIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0Ci0gICAgICogaXQgaXMgaW50ZXJlc3RlZCBpbi4gIFRoZSBtZWRpYSByb3V0ZXIgY29tYmluZXMgYWxsIG9mIHRoZXNlIHNlbGVjdG9ycyB0b2dldGhlcgotICAgICAqIHRvIGdlbmVyYXRlIGEge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgbm90aWZpZXMgZWFjaCBwcm92aWRlciB3aGVuIGEgY2hhbmdlCi0gICAgICogb2NjdXJzIGJ5IGNhbGxpbmcge0BsaW5rICNzZXREaXNjb3ZlcnlSZXF1ZXN0fSB3aGljaCBwb3N0cyBhIG1lc3NhZ2UgdG8gaW52b2tlCi0gICAgICogdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBwcm92aWRlciBzaG91bGQgZXhhbWluZSB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9Ci0gICAgICogaW4gdGhlIGRpc2NvdmVyeSByZXF1ZXN0J3Mge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gdG8gZGV0ZXJtaW5lIHdoYXQKLSAgICAgKiBraW5kcyBvZiByb3V0ZXMgaXQgc2hvdWxkIHRyeSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciBpdCBzaG91bGQgcGVyZm9ybSBhY3RpdmUKLSAgICAgKiBvciBwYXNzaXZlIHNjYW5zLiAgSW4gbWFueSBjYXNlcywgdGhlIHByb3ZpZGVyIG1heSBiZSBhYmxlIHRvIHNhdmUgcG93ZXIgYnkKLSAgICAgKiBkZXRlcm1pbmluZyB0aGF0IHRoZSBzZWxlY3RvciBkb2VzIG5vdCBjb250YWluIGFueSBjYXRlZ29yaWVzIHRoYXQgaXQgc3VwcG9ydHMKLSAgICAgKiBhbmQgaXQgY2FuIHRoZXJlZm9yZSBhdm9pZCBwZXJmb3JtaW5nIGFueSBzY2FucyBhdCBhbGwuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIG5ldyBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKEBOdWxsYWJsZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGFuZAotICAgICAqIHRoZSByb3V0ZXMgdGhhdCBpdCBwdWJsaXNoZXMuICBXYXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGVzY3JpcHRvcgotICAgICAqIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSB3aXRoIHtAbGluayAjc2V0Q2FsbGJhY2t9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIG11c3QgY2FsbCB0aGlzIG1ldGhvZCB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkCi0gICAgICoge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSBhYm91dCB0aGUgY2hhbmdlIHRvIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIHVwZGF0ZWQgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHNlZSBDYWxsYmFjayNvbkRlc2NyaXB0b3JDaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGVzY3JpcHRvcihATnVsbGFibGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBpZiAoIW1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkZWxpdmVyRGVzY3JpcHRvckNoYW5nZWQoKSB7Ci0gICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IGZhbHNlOwotCi0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywgbURlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCi0gICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKLSAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlIHdoaWNoIGlzIGEKLSAgICAgKiBtZW1iZXIgb2Yge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlR3JvdXB9LgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCi0gICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIG1lbWJlciByb3V0ZS4KLSAgICAgKiBAcGFyYW0gcm91dGVHcm91cElkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlIGdyb3VwLgotICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKLSAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQsCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGVHcm91cElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlR3JvdXBJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXNjcmliZXMgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgcHJvdmlkZXIncyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVyTWV0YWRhdGEgewotICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudE5hbWU7Ci0KLSAgICAgICAgUHJvdmlkZXJNZXRhZGF0YShDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21wb25lbnROYW1lIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGNvbXBvbmVudCBuYW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tcG9uZW50TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlck1ldGFkYXRheyBjb21wb25lbnROYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgKyBtQ29tcG9uZW50TmFtZS5mbGF0dGVuVG9TaG9ydFN0cmluZygpICsgIiB9IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGNvbnRyb2wgb3ZlciBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lZGlhIHJvdXRlciBvYnRhaW5zIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSByb3V0ZSB3aGVuZXZlciBpdCBuZWVkcwotICAgICAqIHRvIGNvbnRyb2wgYSByb3V0ZS4gIFdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzCi0gICAgICogdGhlIHtAbGluayAjb25TZWxlY3R9IG1ldGhvZCBvZiBpdHMgcm91dGUgY29udHJvbGxlci4gIFdoaWxlIHNlbGVjdGVkLAotICAgICAqIHRoZSBtZWRpYSByb3V0ZXIgbWF5IGNhbGwgb3RoZXIgbWV0aG9kcyBvZiB0aGUgcm91dGUgY29udHJvbGxlciB0bwotICAgICAqIHJlcXVlc3QgdGhhdCBpdCBwZXJmb3JtIGNlcnRhaW4gYWN0aW9ucyB0byB0aGUgcm91dGUuICBXaGVuIGEgcm91dGUgaXMKLSAgICAgKiB1bnNlbGVjdGVkLCB0aGUgbWVkaWEgcm91dGVyIGludm9rZXMgdGhlIHtAbGluayAjb25VbnNlbGVjdH0gbWV0aG9kIG9mIGl0cwotICAgICAqIHJvdXRlIGNvbnRyb2xsZXIuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBubyBsb25nZXIgbmVlZHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIKLSAgICAgKiBpdCB3aWxsIGludm9rZSB0aGUge0BsaW5rICNvblJlbGVhc2V9IG1ldGhvZCB0byBhbGxvdyB0aGUgcm91dGUgY29udHJvbGxlcgotICAgICAqIHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlcmUgbWF5IGJlIG11bHRpcGxlIHJvdXRlIGNvbnRyb2xsZXJzIHNpbXVsdGFuZW91c2x5IGFjdGl2ZSBmb3IgdGhlCi0gICAgICogc2FtZSByb3V0ZS4gIEVhY2ggcm91dGUgY29udHJvbGxlciB3aWxsIGJlIHJlbGVhc2VkIHNlcGFyYXRlbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFsbCBvcGVyYXRpb25zIG9uIHRoZSByb3V0ZSBjb250cm9sbGVyIGFyZSBhc3luY2hyb25vdXMgYW5kCi0gICAgICogcmVzdWx0cyBhcmUgY29tbXVuaWNhdGVkIHZpYSBjYWxsYmFja3MuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbGVhc2VzIHRoZSByb3V0ZSBjb250cm9sbGVyLCBhbGxvd2luZyBpdCB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VsZWN0cyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblNlbGVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlIGFuZCBwcm92aWRlcyBhIHJlYXNvbi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogY2FsbHMge0BsaW5rICNvblVuc2VsZWN0KCl9LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJlYXNvbiBwcm92aWRlZCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICAgICAgb25VbnNlbGVjdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIHRvIHNldCB0aGUgdm9sdW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayBNZWRpYVJvdXRlRGVzY3JpcHRvciNnZXRWb2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUGVyZm9ybXMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QKLSAgICAgICAgICogYXN5bmNocm9ub3VzbHkgb24gYmVoYWxmIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSB7QGxpbmsgQ29udHJvbFJlcXVlc3RDYWxsYmFja30gdG8gaW52b2tlIHdpdGggdGhlIHJlc3VsdAotICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyByZXN1bHQgaXMgcmVxdWlyZWQuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udHJvbGxlciBpbnRlbmRzIHRvIGhhbmRsZSB0aGUgcmVxdWVzdCBhbmQgd2lsbAotICAgICAgICAgKiBpbnZva2UgdGhlIGNhbGxiYWNrIHdoZW4gZmluaXNoZWQuICBGYWxzZSBpZiB0aGUgY29udHJvbGxlciB3aWxsIG5vdAotICAgICAgICAgKiBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwgbm90IGludm9rZSB0aGUgY2FsbGJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0KEludGVudCBpbnRlbnQsIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayB3aGljaCBpcyBpbnZva2VkIHdoZW4gcm91dGUgaW5mb3JtYXRpb24gYmVjb21lcyBhdmFpbGFibGUgb3IgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGluZm9ybWF0aW9uIGFib3V0IGEgcm91dGUgcHJvdmlkZXIgYW5kIGl0cyByb3V0ZXMgY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB0aGF0IGNoYW5nZWQsIG5ldmVyIG51bGwuCi0gICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBuZXcgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgUHJvdmlkZXJIYW5kbGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWNlMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgc3RhdGUgb2YgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQgdGhlIHJvdXRlcyB0aGF0IGl0IHB1Ymxpc2hlcy4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUk9VVEVTID0gInJvdXRlcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihCdW5kbGUgYnVuZGxlLCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgbVJvdXRlcyA9IHJvdXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCByb3V0ZXMgdGhhdCB0aGlzIHByb3ZpZGVyIGhhcyBwdWJsaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IGdldFJvdXRlcygpIHsKLSAgICAgICAgZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgIHJldHVybiBtUm91dGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IHJvdXRlQnVuZGxlcyA9IG1CdW5kbGUuPEJ1bmRsZT5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMpOwotICAgICAgICAgICAgaWYgKHJvdXRlQnVuZGxlcyA9PSBudWxsIHx8IHJvdXRlQnVuZGxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gQ29sbGVjdGlvbnMuPE1lZGlhUm91dGVEZXNjcmlwdG9yPmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZUJ1bmRsZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPihjb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKE1lZGlhUm91dGVEZXNjcmlwdG9yLmZyb21CdW5kbGUocm91dGVCdW5kbGVzLmdldChpKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBhbmQgYWxsIG9mIHRoZSByb3V0ZXMgdGhhdAotICAgICAqIGl0IGNvbnRhaW5zIGhhdmUgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB2ZXJpZmljYXRpb24gaXMgZGVlcC4gIElmIHRoZSBwcm92aWRlciBkZXNjcmlwdG9yIGlzIGtub3duIHRvIGJlCi0gICAgICogdmFsaWQgdGhlbiBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwge0BsaW5rICNpc1ZhbGlkfSBvbiBlYWNoIG9mIGl0cyByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcygpOwotICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSBtUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsIHx8ICFyb3V0ZS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgicm91dGVzPSIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZ2V0Um91dGVzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1aWxkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKGRlc2NyaXB0b3IubUJ1bmRsZSk7Ci0KLSAgICAgICAgICAgIGRlc2NyaXB0b3IuZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubVJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oZGVzY3JpcHRvci5tUm91dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSb3V0ZShNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBkZXNjcmlwdG9yIGFscmVhZHkgYWRkZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKHJvdXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHJvdXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJvdXRlcyhDb2xsZWN0aW9uPE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUm91dGUocm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGxpc3Qgb2Ygcm91dGVzLgotICAgICAgICAgKi8KLSAgICAgICAgQnVpbGRlciBzZXRSb3V0ZXMoQ29sbGVjdGlvbjxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVzID09IG51bGwgfHwgcm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1CdW5kbGUucmVtb3ZlKEtFWV9ST1VURVMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KHJvdXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gcm91dGVCdW5kbGVzID0gbmV3IEFycmF5TGlzdDxCdW5kbGU+KGNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcm91dGVCdW5kbGVzLmFkZChtUm91dGVzLmdldChpKS5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMsIHJvdXRlQnVuZGxlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IobUJ1bmRsZSwgbVJvdXRlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlOTM0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGNvbW11bmljYXRpb24gcHJvdG9jb2wgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzLgotICovCi1hYnN0cmFjdCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSI7Ci0KLSAgICAvKgotICAgICAqIE1lc3NhZ2VzIHNlbnQgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2aWNlLgotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFJlZ2lzdGVyIGNsaWVudC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IGNsaWVudCB2ZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19SRUdJU1RFUiA9IDE7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVbnJlZ2lzdGVyIGNsaWVudC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVU5SRUdJU1RFUiA9IDI7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBDcmVhdGUgcm91dGUgY29udHJvbGxlci4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1JPVVRFX0lEIDogcm91dGUgaWQgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUiA9IDM7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSZWxlYXNlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIgPSA0OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2VsZWN0IHJvdXRlLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFID0gNTsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVuc2VsZWN0IHJvdXRlLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEUgPSA2OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2V0IHJvdXRlIHZvbHVtZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1ZPTFVNRSA6IHZvbHVtZSBpbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FID0gNzsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVwZGF0ZSByb3V0ZSB2b2x1bWUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9WT0xVTUUgOiB2b2x1bWUgZGVsdGEgaW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSA9IDg7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3QuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBvYmogICAgIDogbWVkaWEgY29udHJvbCBpbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVCA9IDk7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBTZXRzIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IGRpc2NvdmVyeSByZXF1ZXN0IGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1QgPSAxMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1JPVVRFX0lEID0gInJvdXRlSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAgPSAicm91dGVHcm91cElkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9WT0xVTUUgPSAidm9sdW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04gPSAidW5zZWxlY3RSZWFzb24iOwotCi0gICAgLyoKLSAgICAgKiBNZXNzYWdlcyBzZW50IGZyb20gdGhlIHNlcnZpY2UgdG8gdGhlIGNsaWVudC4KLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogR2VuZXJpYyBmYWlsdXJlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYW55IHVucmVjb2duaXplZCBvciBtYWxmb3JtZWQgcmVxdWVzdC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFID0gMDsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBHZW5lcmljIGZhaWx1cmUgc2VudCBpbiByZXNwb25zZSB0byBhIHN1Y2Nlc3NmdWwgbWVzc2FnZS4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTID0gMTsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSZWdpc3RyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiBzZXJ2ZXIgdmVyc2lvbgotICAgICAqIC0gb2JqICAgICA6IHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfUkVHSVNURVJFRCA9IDI7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2Nlc3MgcmVzdWx0LgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiByZXN1bHQgZGF0YSBidW5kbGUsIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEID0gMzsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZmFpbHVyZSByZXN1bHQuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IHJlc3VsdCBkYXRhIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqIC0gU0VSVklDRV9EQVRBX0VSUk9SOiBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCA9IDQ7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBjaGFuZ2VkLiAgKHVuc29saWNpdGVkIGV2ZW50KQotICAgICAqIC0gYXJnMSAgICA6IHJlc2VydmVkICgwKQotICAgICAqIC0gb2JqICAgICA6IHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEID0gNTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfREFUQV9FUlJPUiA9ICJlcnJvciI7Ci0KLSAgICAvKgotICAgICAqIFJlY29nbml6ZWQgY2xpZW50IHZlcnNpb24gbnVtYmVycy4gIChSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4pCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsaWVudCB2ZXJzaW9uIHVzZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OXzEgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsaWVudCB2ZXJzaW9uIHVzZWQgZnJvbSBzdXBwb3J0IGxpYnJhcnkgdjI0LjEuMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl8yID0gMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IGNsaWVudCB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OX0NVUlJFTlQgPSBDTElFTlRfVkVSU0lPTl8yOwotCi0gICAgLyoKLSAgICAgKiBSZWNvZ25pemVkIHNlcnZlciB2ZXJzaW9uIG51bWJlcnMuICAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuKQotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFRoZSBzZXJ2aWNlIHZlcnNpb24gdXNlZCBmcm9tIHRoZSBiZWdpbm5pbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9WRVJTSU9OXzEgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgc2VydmljZSB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UID0gU0VSVklDRV9WRVJTSU9OXzE7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OX1NUQVJUID0gQ0xJRU5UX1ZFUlNJT05fMTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2VuZ2VyIG9iamVjdCBpcyB2YWxpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVzc2VuZ2VyIGNvbnN0cnVjdG9yIGFuZCB1bnBhcmNlbGluZyBjb2RlIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgdGhlCi0gICAgICogcHJvdmlkZWQgSUJpbmRlciBpcyBhIHZhbGlkIElNZXNzZW5nZXIgb2JqZWN0LiAgQXMgYSByZXN1bHQsIGl0J3MgcG9zc2libGUKLSAgICAgKiBmb3IgYSBwZWVyIHRvIHNlbmQgYW4gaW52YWxpZCBJQmluZGVyIHRoYXQgd2lsbCByZXN1bHQgaW4gY3Jhc2hlcyBkb3duc3RyZWFtLgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGF0IHRoZSBtZXNzZW5nZXIgaXMgaW4gYSB2YWxpZCBzdGF0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1lc3NlbmdlciAhPSBudWxsICYmIG1lc3Nlbmdlci5nZXRCaW5kZXIoKSAhPSBudWxsOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIG1lc3NlbmdlciB3YXMgY29uc3RydWN0ZWQgd2l0aCBhIGJpbmRlciBpbnRlcmZhY2Ugb3RoZXIgdGhhbgotICAgICAgICAgICAgLy8gSU1lc3NlbmdlciB0aGVuIHRoZSBjYWxsIHRvIGdldEJpbmRlcigpIHdpbGwgY3Jhc2ggd2l0aCBhbiBOUEUuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZGUxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1JPVVRFX0lEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT047Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1NFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1VOUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl8xOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfREFUQV9FUlJPUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX01TR19SRUdJU1RFUkVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmlzVmFsaWRSZW1vdGVNZXNzZW5nZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMuCi0gKiA8cD4KLSAqIEEgbWVkaWEgcm91dGVyIHdpbGwgYmluZCB0byBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB3aGVuIGEgY2FsbGJhY2sgaXMgYWRkZWQgdmlhCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBNZWRpYVJvdXRlci5DYWxsYmFjaywgaW50KX0gd2l0aCBhIGRpc2NvdmVyeQotICogZmxhZzoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9LAotICoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZfSwgb3IKLSAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59LCBhbmQgd2lsbCB1bmJpbmQgd2hlbiB0aGUgY2FsbGJhY2sKLSAqIGlzIHJlbW92ZWQgdmlhIHtAbGluayBNZWRpYVJvdXRlciNyZW1vdmVDYWxsYmFjayhNZWRpYVJvdXRlci5DYWxsYmFjayl9LgotICogPC9wPjxwPgotICogVG8gaW1wbGVtZW50IHlvdXIgb3duIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UsIGV4dGVuZCB0aGlzIGNsYXNzIGFuZAotICogb3ZlcnJpZGUgdGhlIHtAbGluayAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXJ9IG1ldGhvZCB0byByZXR1cm4gYW4KLSAqIGluc3RhbmNlIG9mIHlvdXIge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0uCi0gKiA8L3A+PHA+Ci0gKiBEZWNsYXJlIHlvdXIgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZSBpbiB5b3VyIGFwcGxpY2F0aW9uIG1hbmlmZXN0Ci0gKiBsaWtlIHRoaXM6Ci0gKiA8L3A+Ci0gKiA8cHJlPgotICogICAmbHQ7c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5NeU1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiCi0gKiAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9teV9tZWRpYV9yb3V0ZV9wcm92aWRlcl9zZXJ2aWNlIj4KLSAqICAgICAgICZsdDtpbnRlbnQtZmlsdGVyPgotICogICAgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiIC8+Ci0gKiAgICAgICAmbHQ7L2ludGVudC1maWx0ZXI+Ci0gKiAgICZsdDsvc2VydmljZT4KLSAqIDwvcHJlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVQcm92aWRlclNydiI7IC8vIG1heC4gMjMgY2hhcnMKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENsaWVudFJlY29yZD4gbUNsaWVudHMgPSBuZXcgQXJyYXlMaXN0PENsaWVudFJlY29yZD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIFJlY2VpdmVIYW5kbGVyIG1SZWNlaXZlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtUmVjZWl2ZU1lc3NlbmdlcjsKLSAgICBmaW5hbCBQcml2YXRlSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckNhbGxiYWNrIG1Qcm92aWRlckNhbGxiYWNrOwotCi0gICAgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPSBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0lOVEVSRkFDRTsKLQotICAgIC8qCi0gICAgICogUHJpdmF0ZSBtZXNzYWdlcyB1c2VkIGludGVybmFsbHkuICAoWWVzLCB5b3UgY2FuIHJlbnVtYmVyIHRoZXNlLikKLSAgICAgKi8KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9NU0dfQ0xJRU5UX0RJRUQgPSAxOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UoKSB7Ci0gICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKLSAgICAgICAgbVJlY2VpdmVNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1SZWNlaXZlSGFuZGxlcik7Ci0gICAgICAgIG1Qcml2YXRlSGFuZGxlciA9IG5ldyBQcml2YXRlSGFuZGxlcigpOwotICAgICAgICBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBzeXN0ZW0gd2hlbiBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgotICAgICAqIHRoaXMgc2VydmljZSBoYXMgZGVjaWRlZCBub3QgdG8gb2ZmZXIgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTWVkaWFSb3V0ZVByb3ZpZGVyIG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG9mZmVyZWQgYnkgdGhpcyBzZXJ2aWNlLCBvciBudWxsIGlmCi0gICAgICogaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotICAgICAqCi0gICAgICogQHNlZSAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0TWVkaWFSb3V0ZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFNFUlZJQ0VfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgaWYgKG1Qcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdmlkZXJQYWNrYWdlID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3ZpZGVyUGFja2FnZS5lcXVhbHMoZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkgcmV0dXJuZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIHByb3ZpZGVyIHdob3NlIHBhY2thZ2UgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFja2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5hbWUgb2YgdGhlIHNlcnZpY2UuICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgY2FuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib25seSBleHBvcnQgaXRzIG93biBtZWRpYSByb3V0ZSBwcm92aWRlcnMuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlByb3ZpZGVyIHBhY2thZ2UgbmFtZTogIiArIHByb3ZpZGVyUGFja2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuICBTZXJ2aWNlIHBhY2thZ2UgbmFtZTogIiArIGdldFBhY2thZ2VOYW1lKCkgKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIuc2V0Q2FsbGJhY2sobVByb3ZpZGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUmVjZWl2ZU1lc3Nlbmdlci5nZXRCaW5kZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vblVuYmluZChpbnRlbnQpOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25SZWdpc3RlckNsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgdmVyc2lvbikgewotICAgICAgICBpZiAodmVyc2lvbiA+PSBDTElFTlRfVkVSU0lPTl8xKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG5ldyBDbGllbnRSZWNvcmQobWVzc2VuZ2VyLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50LnJlZ2lzdGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNsaWVudHMuYWRkKGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSZWdpc3RlcmVkLCB2ZXJzaW9uPSIgKyB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1Qcm92aWRlci5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19SRUdJU1RFUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblVucmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogVW5yZWdpc3RlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGllbnQuZGlzcG9zZSgpOwotICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQmluZGVyRGllZChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBCaW5kZXIgZGllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50LmNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQsIGNvbnRyb2xsZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIGNyZWF0ZWQsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByb3V0ZUlkPSIgKyByb3V0ZUlkICsgIiwgcm91dGVHcm91cElkPSIgKyByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNsaWVudC5yZWxlYXNlUm91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIHJlbGVhc2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uU2VsZWN0Um91dGUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgc2VsZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VbnNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdW5zZWxlY3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblNldFJvdXRlVm9sdW1lKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSBjaGFuZ2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCB2b2x1bWU9IiArIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VcGRhdGVSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IGRlbHRhKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdm9sdW1lIHVwZGF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGRlbHRhPSIgKyBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25Sb3V0ZUNvbnRyb2xSZXF1ZXN0KGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIsIGZpbmFsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBmaW5hbCBpbnQgY29udHJvbGxlcklkLCBmaW5hbCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGZpbmFsIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpbnRlbnQ9IiArIGludGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kQ2xpZW50KG1lc3NlbmdlcikgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBmYWlsZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGVycm9yPSIgKyBlcnJvciArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKFNFUlZJQ0VfREFUQV9FUlJPUiwgZXJyb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IGRlbGl2ZXJlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGludGVudD0iICsgaW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25TZXREaXNjb3ZlcnlSZXF1ZXN0KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIGFjdHVhbGx5Q2hhbmdlZCA9IGNsaWVudC5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZXQgZGlzY292ZXJ5IHJlcXVlc3QsIHJlcXVlc3Q9IiArIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgYWN0dWFsbHlDaGFuZ2VkPSIgKyBhY3R1YWxseUNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdD0iICsgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBzZW5kUmVwbHkoY2xpZW50Lm1NZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwgY2xpZW50Lm1WZXJzaW9uKSwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFNlbnQgZGVzY3JpcHRvciBjaGFuZ2UgZXZlbnQsIGRlc2NyaXB0b3I9IiArIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIEJ1bmRsZSBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICBpbnQgY2xpZW50VmVyc2lvbikgewotICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcihkZXNjcmlwdG9yKTsKLSAgICAgICAgYnVpbGRlci5zZXRSb3V0ZXMobnVsbCk7Ci0gICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiBkZXNjcmlwdG9yLmdldFJvdXRlcygpKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50VmVyc2lvbiA+PSByb3V0ZS5nZXRNaW5DbGllbnRWZXJzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgY2xpZW50VmVyc2lvbiA8PSByb3V0ZS5nZXRNYXhDbGllbnRWZXJzaW9uKCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKHJvdXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpLmFzQnVuZGxlKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBjb21wb3NpdGUgPSBudWxsOwotICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBzZWxlY3RvckJ1aWxkZXIgPSBudWxsOwotICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QgPSBtQ2xpZW50cy5nZXQoaSkubURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICghcmVxdWVzdC5nZXRTZWxlY3RvcigpLmlzRW1wdHkoKSB8fCByZXF1ZXN0LmlzQWN0aXZlU2NhbigpKSkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gfD0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlID0gcmVxdWVzdDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihjb21wb3NpdGUuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JCdWlsZGVyLmFkZFNlbGVjdG9yKHJlcXVlc3QuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RvckJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tcG9zaXRlID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yQnVpbGRlci5idWlsZCgpLCBhY3RpdmVTY2FuKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0LCBjb21wb3NpdGUpKSB7Ci0gICAgICAgICAgICBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCA9IGNvbXBvc2l0ZTsKLSAgICAgICAgICAgIG1Qcm92aWRlci5zZXREaXNjb3ZlcnlSZXF1ZXN0KGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGllbnRSZWNvcmQgZ2V0Q2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IG1DbGllbnRzLmdldChpbmRleCkgOiBudWxsOwotICAgIH0KLQotICAgIGludCBmaW5kQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50Lmhhc01lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlbmRHZW5lcmljRmFpbHVyZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFLCByZXF1ZXN0SWQsIDAsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY1N1Y2Nlc3MoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUywgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlbmRSZXBseShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgd2hhdCwKLSAgICAgICAgICAgIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgbXNnLndoYXQgPSB3aGF0OwotICAgICAgICBtc2cuYXJnMSA9IHJlcXVlc3RJZDsKLSAgICAgICAgbXNnLmFyZzIgPSBhcmc7Ci0gICAgICAgIG1zZy5vYmogPSBvYmo7Ci0gICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVzc2VuZ2VyLnNlbmQobXNnKTsKLSAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBkaWVkLgotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gIiArIGdldENsaWVudElkKG1lc3NlbmdlciksIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICByZXR1cm4gIkNsaWVudCBjb25uZWN0aW9uICIgKyBtZXNzZW5nZXIuZ2V0QmluZGVyKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByaXZhdGVIYW5kbGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEOgotICAgICAgICAgICAgICAgICAgICBvbkJpbmRlckRpZWQoKE1lc3Nlbmdlciltc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByb3ZpZGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIuQ2FsbGJhY2sgewotICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgc2VuZERlc2NyaXB0b3JDaGFuZ2VkKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGllbnRSZWNvcmQgaW1wbGVtZW50cyBEZWF0aFJlY2lwaWVudCB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBNZXNzZW5nZXIgbU1lc3NlbmdlcjsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBtVmVyc2lvbjsKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4gbUNvbnRyb2xsZXJzID0KLSAgICAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4oKTsKLQotICAgICAgICBwdWJsaWMgQ2xpZW50UmVjb3JkKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCB2ZXJzaW9uKSB7Ci0gICAgICAgICAgICBtTWVzc2VuZ2VyID0gbWVzc2VuZ2VyOwotICAgICAgICAgICAgbVZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy52YWx1ZUF0KGkpLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkudW5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLQotICAgICAgICAgICAgc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01lc3NlbmdlcihNZXNzZW5nZXIgb3RoZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWVzc2VuZ2VyLmdldEJpbmRlcigpID09IG90aGVyLmdldEJpbmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkLAotICAgICAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbGxlcnMuaW5kZXhPZktleShjb250cm9sbGVySWQpIDwgMCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlR3JvdXBJZCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG1Qcm92aWRlci5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5wdXQoY29udHJvbGxlcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVsZWFzZVJvdXRlQ29udHJvbGxlcihpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBnZXRSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVycy5nZXQoY29udHJvbGxlcklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtRGlzY292ZXJ5UmVxdWVzdCwgcmVxdWVzdCkpIHsKLSAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1bnMgb24gYSBiaW5kZXIgdGhyZWFkLgotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVELCBtTWVzc2VuZ2VyKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldENsaWVudElkKG1NZXNzZW5nZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHNlcnZpY2UKLSAgICAgKiB0byBwcmV2ZW50IHRoZSBzZXJ2aWNlIGZyb20gYmVpbmcgbGVha2VkIGluIGNhc2Ugb25lIG9mIHRoZSBjbGllbnRzIGlzIGhvbGRpbmcgYW4KLSAgICAgKiBhY3RpdmUgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2ZXIncyBtZXNzZW5nZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgaGFuZGxlciBzaG91bGQgbm90IGJlIHVzZWQgdG8gaGFuZGxlIGFueSBtZXNzYWdlcyBvdGhlciB0aGFuIHRob3NlCi0gICAgICogdGhhdCBjb21lIGZyb20gdGhlIGNsaWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjZWl2ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+IG1TZXJ2aWNlUmVmOwotCi0gICAgICAgIHB1YmxpYyBSZWNlaXZlSGFuZGxlcihNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZT4oc2VydmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgZmluYWwgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IG1zZy5yZXBseVRvOwotICAgICAgICAgICAgaWYgKGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2Uod2hhdCwgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgb2JqLCBkYXRhKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgZ2V0Q2xpZW50SWQobWVzc2VuZ2VyKSArICI6IE1lc3NhZ2UgZmFpbGVkLCB3aGF0PSIgKyB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVxdWVzdElkPSIgKyByZXF1ZXN0SWQgKyAiLCBhcmc9IiArIGFyZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG9iaj0iICsgb2JqICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNGYWlsdXJlKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJZ25vcmluZyBtZXNzYWdlIHdpdGhvdXQgdmFsaWQgcmVwbHkgbWVzc2VuZ2VyLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShpbnQgd2hhdCwKLSAgICAgICAgICAgICAgICBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlID0gbVNlcnZpY2VSZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19SRUdJU1RFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1VOUkVHSVNURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVucmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjogewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlSWQgPSBkYXRhLmdldFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm91dGVHcm91cElkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCByb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25SZWxlYXNlUm91dGVDb250cm9sbGVyKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURToKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24gPSBkYXRhID09IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVuc2VsZWN0Um91dGUobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcmVhc29uKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZXRSb3V0ZVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVwZGF0ZVJvdXRlVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEludGVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUm91dGVDb250cm9sUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIChJbnRlbnQpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmZyb21CdW5kbGUoKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0RGlzY292ZXJ5UmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCAhPSBudWxsICYmIHJlcXVlc3QuaXNWYWxpZCgpID8gcmVxdWVzdCA6IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjY5YjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGNhcGFiaWxpdGllcyBvZiByb3V0ZXMgdGhhdCBhcHBsaWNhdGlvbnMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgdXNlLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICoKLSAqIDxoMz5FeGFtcGxlPC9oMz4KLSAqIDxwcmU+Ci0gKiBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3JCdWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykKLSAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQotICogICAgICAgICAuYnVpbGQoKTsKLSAqCi0gKiBNZWRpYVJvdXRlciByb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAqIHJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlU2VsZWN0b3IgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRST0xfQ0FURUdPUklFUyA9ICJjb250cm9sQ2F0ZWdvcmllcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIExpc3Q8U3RyaW5nPiBtQ29udHJvbENhdGVnb3JpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciB0aGF0IHdpbGwgbm90IG1hdGNoIGFueSByb3V0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3IgRU1QVFkgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKG5ldyBCdW5kbGUoKSwgbnVsbCk7Ci0KLSAgICBNZWRpYVJvdXRlU2VsZWN0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxTdHJpbmc+IGNvbnRyb2xDYXRlZ29yaWVzKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IGNvbnRyb2xDYXRlZ29yaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IGluIHRoZSBzZWxlY3Rvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgY2F0ZWdvcmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbnRyb2xDYXRlZ29yaWVzKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzOwotICAgIH0KLQotICAgIHZvaWQgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbUJ1bmRsZS5nZXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUyk7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwgfHwgbUNvbnRyb2xDYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2F0ZWdvcnkgaXMgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250cm9sQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgZmluYWwgaW50IGNhdGVnb3J5Q291bnQgPSBtQ29udHJvbENhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzLmdldChpKS5lcXVhbHMoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBsaXN0IG9mIGNvbnRyb2wgZmlsdGVycyB0byBjb25zaWRlci4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgYSBtYXRjaCBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzQ29udHJvbEZpbHRlcnMoTGlzdDxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjYXRlZ29yeUNvdW50ID0gbUNvbnRyb2xDYXRlZ29yaWVzLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeUNvdW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlsdGVyQ291bnQgPSBmaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlciA9IGZpbHRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2F0ZWdvcnlDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShtQ29udHJvbENhdGVnb3JpZXMuZ2V0KGopKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIGJlIGV4YW1pbmVkLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgc2VsZWN0b3IuZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnNBbGwoc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBjYXBhYmlsaXRpZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcy5jb250YWlucyhudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVTZWxlY3RvcikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yIG90aGVyID0gKE1lZGlhUm91dGVTZWxlY3RvcilvOwotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIG90aGVyLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmVxdWFscyhvdGhlci5tQ29udHJvbENhdGVnb3JpZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlU2VsZWN0b3J7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJjb250cm9sQ2F0ZWdvcmllcz0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xDYXRlZ29yaWVzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZnJvbUJ1bmRsZShATnVsbGFibGUgQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db250cm9sQ2F0ZWdvcmllczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciBidWlsZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzZWxlY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGVjdG9yLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBpZiAoIXNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3J5fSB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBhZGQgdG8gdGhlIHNldCBvZiBkZXNpcmVkIGNhcGFiaWxpdGllcywgc3VjaCBhcwotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcmllcyBUaGUgbGlzdCBjYXRlZ29yaWVzIHRvIGFkZCB0byB0aGUgc2V0IG9mIGRlc2lyZWQgY2FwYWJpbGl0aWVzLAotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30uCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbENhdGVnb3JpZXMoQE5vbk51bGwgQ29sbGVjdGlvbjxTdHJpbmc+IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yaWVzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhdGVnb3J5IDogY2F0ZWdvcmllcykgewotICAgICAgICAgICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcnkoY2F0ZWdvcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgdGhlIGNvbnRlbnRzIG9mIGFuIGV4aXN0aW5nIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZSBhZGRlZC4KLSAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcmllcyhzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3Rvcn0uCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUywgbUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjAwNTJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uSW50RGVmOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuQWN0aXZpdHlNYW5hZ2VyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5Wb2x1bWVQcm92aWRlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25Db21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuUGFpcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Qcm92aWRlck1ldGFkYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBNZWRpYVJvdXRlciBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGNvbnRyb2wgdGhlIHJvdXRpbmcgb2YgbWVkaWEgY2hhbm5lbHMKLSAqIGFuZCBzdHJlYW1zIGZyb20gdGhlIGN1cnJlbnQgZGV2aWNlIHRvIGV4dGVybmFsIHNwZWFrZXJzIGFuZCBkZXN0aW5hdGlvbiBkZXZpY2VzLgotICogPHA+Ci0gKiBBIE1lZGlhUm91dGVyIGluc3RhbmNlIGlzIHJldHJpZXZlZCB0aHJvdWdoIHtAbGluayAjZ2V0SW5zdGFuY2V9LiAgQXBwbGljYXRpb25zCi0gKiBjYW4gcXVlcnkgdGhlIG1lZGlhIHJvdXRlciBhYm91dCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGFuZCBpdHMgY2FwYWJpbGl0aWVzCi0gKiB0byBkZXRlcm1pbmUgaG93IHRvIHNlbmQgY29udGVudCB0byB0aGUgcm91dGUncyBkZXN0aW5hdGlvbi4gIEFwcGxpY2F0aW9ucyBjYW4KLSAqIGFsc28ge0BsaW5rIFJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3Qgc2VuZCBjb250cm9sIHJlcXVlc3RzfSB0byB0aGUgcm91dGUKLSAqIHRvIGFzayB0aGUgcm91dGUncyBkZXN0aW5hdGlvbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVtb3RlIGNvbnRyb2wgZnVuY3Rpb25zCi0gKiBzdWNoIGFzIHBsYXlpbmcgbWVkaWEuCi0gKiA8L3A+PHA+Ci0gKiBTZWUgYWxzbyB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfSBmb3IgaW5mb3JtYXRpb24gb24gaG93IGFuIGFwcGxpY2F0aW9uCi0gKiBjYW4gcHVibGlzaCBuZXcgbWVkaWEgcm91dGVzIHRvIHRoZSBtZWRpYSByb3V0ZXIuCi0gKiA8L3A+PHA+Ci0gKiBUaGUgbWVkaWEgcm91dGVyIEFQSSBpcyBub3QgdGhyZWFkLXNhZmU7IGFsbCBpbnRlcmFjdGlvbnMgd2l0aCBpdCBtdXN0IGJlCi0gKiBkb25lIGZyb20gdGhlIG1haW4gdGhyZWFkIG9mIHRoZSBwcm9jZXNzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXIgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVyIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgcmVhc29uIHRoZSByb3V0ZQotICAgICAqIHdhcyB1bnNlbGVjdGVkIGlzIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1VOS05PV04gPSAwOwotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgdXNlciBwcmVzc2VkCi0gICAgICogdGhlIGRpc2Nvbm5lY3QgYnV0dG9uIHRvIGRpc2Nvbm5lY3QgYW5kIGtlZXAgcGxheWluZy4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZURlc2NyaXB0b3IjY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEID0gMTsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgcHJlc3NlZAotICAgICAqIHRoZSBzdG9wIGNhc3RpbmcgYnV0dG9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9TVE9QUEVEID0gMjsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgc2VsZWN0ZWQKLSAgICAgKiBhIGRpZmZlcmVudCByb3V0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCA9IDM7Ci0KLSAgICAvLyBNYWludGFpbnMgZ2xvYmFsIG1lZGlhIHJvdXRlciBzdGF0ZSBmb3IgdGhlIHByb2Nlc3MuCi0gICAgLy8gVGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZCBpbiBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZSgpIGJlZm9yZSBhbnkKLSAgICAvLyBNZWRpYVJvdXRlciBvYmplY3RzIGFyZSBpbnN0YW50aWF0ZWQgc28gaXQgaXMgZ3VhcmFudGVlZCB0byBiZQotICAgIC8vIHZhbGlkIHdoZW5ldmVyIGFueSBpbnN0YW5jZSBtZXRob2QgaXMgaW52b2tlZC4KLSAgICBzdGF0aWMgR2xvYmFsTWVkaWFSb3V0ZXIgc0dsb2JhbDsKLQotICAgIC8vIENvbnRleHQtYm91bmQgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlci4KLSAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIGZpbmFsIEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4gbUNhbGxiYWNrUmVjb3JkcyA9IG5ldyBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+KCk7Ci0KLSAgICBASW50RGVmKGZsYWcgPSB0cnVlLAotICAgICAgICAgICAgdmFsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTiwKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSwKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUwotICAgICAgICAgICAgfQotICAgICkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENhbGxiYWNrRmxhZ3Mge30KLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBBY3RpdmVseSBzY2FuIGZvciByb3V0ZXMgd2hpbGUgdGhpcyBjYWxsYmFjawotICAgICAqIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgbWVkaWEgcm91dGVyIHdpbGwgYWN0aXZlbHkgc2NhbiBmb3IgbmV3Ci0gICAgICogcm91dGVzLiAgQ2VydGFpbiByb3V0ZXMsIHN1Y2ggYXMgd2lmaSBkaXNwbGF5IHJvdXRlcywgbWF5IG5vdCBiZSBkaXNjb3ZlcmFibGUKLSAgICAgKiBleGNlcHQgd2hlbiBhY3RpdmVseSBzY2FubmluZy4gIFRoaXMgZmxhZyBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSByb3V0ZSBwaWNrZXIKLSAgICAgKiBkaWFsb2cgaGFzIGJlZW4gb3BlbmVkIGJ5IHRoZSB1c2VyIHRvIGVuc3VyZSB0aGF0IHRoZSByb3V0ZSBpbmZvcm1hdGlvbiBpcwotICAgICAqIHVwIHRvIGRhdGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFjdGl2ZSBzY2FubmluZyBtYXkgY29uc3VtZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBwb3dlciBhbmQgbWF5IGhhdmUgaW50cnVzaXZlCi0gICAgICogZWZmZWN0cyBvbiB3aXJlbGVzcyBjb25uZWN0aXZpdHkuICBUaGVyZWZvcmUgaXQgaXMgaW1wb3J0YW50IHRoYXQgYWN0aXZlIHNjYW5uaW5nCi0gICAgICogb25seSBiZSByZXF1ZXN0ZWQgd2hlbiBpdCBpcyBhY3R1YWxseSBuZWVkZWQgdG8gc2F0aXNmeSBhIHVzZXIgcmVxdWVzdCB0bwotICAgICAqIGRpc2NvdmVyIGFuZCBzZWxlY3QgYSBuZXcgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgZmxhZyBpbXBsaWVzIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gYnV0IHBlcmZvcm1pbmcKLSAgICAgKiBhY3RpdmUgc2NhbnMgaXMgbXVjaCBtb3JlIGV4cGVuc2l2ZSB0aGFuIGEgbm9ybWFsIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4gPSAxIDw8IDA7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogRG8gbm90IGZpbHRlciByb3V0ZSBldmVudHMuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGZvciBldmVudHMgdGhhdCBhZmZlY3QgYW55Ci0gICAgICogcm91dGUgZXZlbiBpZiB0aGV5IGRvIG5vdCBtYXRjaCB0aGUgY2FsbGJhY2sncyBmaWx0ZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMgPSAxIDw8IDE7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogUmVxdWVzdCBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSB3aGlsZSB0aGlzCi0gICAgICogY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgZXhjZXB0IG9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfS4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSBtZWRpYSByb3V0ZXIgd2lsbCB0cnkgdG8gZGlzY292ZXIgcm91dGVzLgotICAgICAqIEFsdGhvdWdoIHJvdXRlIGRpc2NvdmVyeSBpcyBpbnRlbmRlZCB0byBiZSBlZmZpY2llbnQsIGNoZWNraW5nIGZvciBuZXcgcm91dGVzIG1heQotICAgICAqIHJlc3VsdCBpbiBzb21lIG5ldHdvcmsgYWN0aXZpdHkgYW5kIGNvdWxkIHNsb3dseSBkcmFpbiB0aGUgYmF0dGVyeS4gIFRoZXJlZm9yZQotICAgICAqIGFwcGxpY2F0aW9ucyBzaG91bGQgb25seSBzcGVjaWZ5IHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gd2hlbgotICAgICAqIHRoZXkgYXJlIHJ1bm5pbmcgaW4gdGhlIGZvcmVncm91bmQgYW5kIHdvdWxkIGxpa2UgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIHRoZQotICAgICAqIG9wdGlvbiBvZiBjb25uZWN0aW5nIHRvIG5ldyByb3V0ZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdHlwaWNhbGx5IGFkZCBhIGNhbGxiYWNrIHVzaW5nIHRoaXMgZmxhZyBpbiB0aGUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkgYWN0aXZpdHknc30ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RhcnQgb25TdGFydH0KLSAgICAgKiBtZXRob2QgYW5kIHJlbW92ZSBpdCBpbiB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3B9IG1ldGhvZC4KLSAgICAgKiBUaGUge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50fSBmcmFnbWVudCBtYXkKLSAgICAgKiBhbHNvIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIGZsYWcKLSAgICAgKiB3aWxsIGJlIGlnbm9yZWQuICBSZWZlciB0bwotICAgICAqIHtAbGluayAjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KSBhZGRDYWxsYmFja30gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkgPSAxIDw8IDI7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogUmVxdWVzdCBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSB3aGlsZSB0aGlzCi0gICAgICogY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgZXZlbiBvbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPHAgY2xhc3M9Im5vdGUiPgotICAgICAqIFRoaXMgZmxhZyBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gbG93LVJBTSBkZXZpY2VzCi0gICAgICogc2luY2UgaXQgbWF5IGNhdXNlIG1hbnkgbWVkaWEgcm91dGUgcHJvdmlkZXJzIHRvIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCi0gICAgICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gdXNlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gaW5zdGVhZCB0byBhdm9pZAotICAgICAqIHBlcmZvcm1pbmcgcGFzc2l2ZSBkaXNjb3Zlcnkgb24gdGhlc2UgZGV2aWNlcyBhbHRvZ2V0aGVyLiAgUmVmZXIgdG8KLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkgYWRkQ2FsbGJhY2t9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWSA9IDEgPDwgMzsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX06IElnbm9yZSB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIG1hdGNoaW5nIG5vbi1kZWZhdWx0IHJvdXRlIGlzIGF2YWlsYWJsZS4KLSAgICAgKiBUaGlzIGNvbnN0cmFpbnQgbWF5IGJlIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gb2ZmZXIgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nCi0gICAgICogdG8gdGhlIHVzZXIuICBUaGVyZSBpcyBubyBwb2ludCBvZmZlcmluZyB0aGUgY2hvb3NlciBpZiB0aGVyZSBhcmUgbm8KLSAgICAgKiBub24tZGVmYXVsdCBjaG9pY2VzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSA9IDEgPDwgMDsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX06IFJlcXVpcmUgYW4gYWN0dWFsIHJvdXRlIHRvIGJlIG1hdGNoZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIHRoZW4ge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSB3aWxsIHJldHVybiB0cnVlCi0gICAgICogaWYgaXQgaXMgcG9zc2libGUgdG8gZGlzY292ZXIgYSBtYXRjaGluZyByb3V0ZSBldmVuIGlmIGRpc2NvdmVyeSBpcyBub3QgaW4KLSAgICAgKiBwcm9ncmVzcyBvciBpZiBubyBtYXRjaGluZyByb3V0ZSBoYXMgeWV0IGJlZW4gZm91bmQuICBUaGlzIGZlYXR1cmUgaXMgdXNlZCB0bwotICAgICAqIHNhdmUgcmVzb3VyY2VzIGJ5IHJlbW92aW5nIHRoZSBuZWVkIHRvIHBlcmZvcm0gcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgb24KLSAgICAgKiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZW4ge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSB3aWxsIG9ubHkgcmV0dXJuIHRydWUgaWYKLSAgICAgKiBhIG1hdGNoaW5nIHJvdXRlIGhhcyBhY3R1YWxseSBiZWVuIGRpc2NvdmVyZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0ggPSAxIDw8IDE7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnN0YW5jZSBvZiB0aGUgbWVkaWEgcm91dGVyIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgaG9sZGluZyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIHJldHVybmVkCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyfSBpbnN0YW5jZSwgc3VjaCBhcyBieSBzdG9yaW5nIHRoZSBpbnN0YW5jZSBpbiBhIGZpZWxkIG9mCi0gICAgICogdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sIHRvIGVuc3VyZSB0aGF0IHRoZSBtZWRpYSByb3V0ZXIgcmVtYWlucyBhbGl2ZQotICAgICAqIGFzIGxvbmcgYXMgdGhlIGFwcGxpY2F0aW9uIGlzIHVzaW5nIGl0cyBmZWF0dXJlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBzdXBwb3J0IGxpYnJhcnkgb25seSBob2xkcyBhIHtAbGluayBXZWFrUmVmZXJlbmNlIHdlYWsgcmVmZXJlbmNlfQotICAgICAqIHRvIGVhY2ggbWVkaWEgcm91dGVyIGluc3RhbmNlLiAgV2hlbiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIHRoZQotICAgICAqIG1lZGlhIHJvdXRlciBpbnN0YW5jZSwgYWxsIG9mIGl0cyBjYWxsYmFja3Mgd2lsbCBiZSByZW1vdmVkIGFuZCByb3V0ZSBkaXNjb3ZlcnkKLSAgICAgKiB3aWxsIG5vIGxvbmdlciBiZSBwZXJmb3JtZWQgb24gaXRzIGJlaGFsZi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZXIgaW5zdGFuY2UgZm9yIHRoZSBjb250ZXh0LiAgVGhlIGFwcGxpY2F0aW9uIG11c3QgaG9sZAotICAgICAqIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCBhcyBsb25nIGFzIGl0IGlzIGluIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVyIGdldEluc3RhbmNlKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzR2xvYmFsID0gbmV3IEdsb2JhbE1lZGlhUm91dGVyKGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkpOwotICAgICAgICAgICAgc0dsb2JhbC5zdGFydCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFJvdXRlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlc30gY3VycmVudGx5IGtub3duIHRvCi0gICAgICogdGhpcyBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRSb3V0ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHJvdXRlIHByb3ZpZGVyc30KLSAgICAgKiBjdXJyZW50bHkga25vd24gdG8gdGhpcyBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvdmlkZXJJbmZvPiBnZXRQcm92aWRlcnMoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRQcm92aWRlcnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdXRlIGZvciBwbGF5aW5nIG1lZGlhIGNvbnRlbnQgb24gdGhlIHN5c3RlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3lzdGVtIGFsd2F5cyBwcm92aWRlcyBhIGRlZmF1bHQgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCByb3V0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFJvdXRlSW5mbyBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYmx1ZXRvb3RoIHJvdXRlIGZvciBwbGF5aW5nIG1lZGlhIGNvbnRlbnQgb24gdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBibHVldG9vdGggcm91dGUsIGlmIGV4aXN0LCBvdGhlcndpc2UgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUm91dGVJbmZvIGdldEJsdWV0b290aFJvdXRlKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Qmx1ZXRvb3RoUm91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBleGFtaW5lIHRoZSByb3V0ZSdzCi0gICAgICoge0BsaW5rIFJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycyBtZWRpYSBjb250cm9sIGludGVudCBmaWx0ZXJzfSB0byBhc3Nlc3MgdGhlCi0gICAgICogY2FwYWJpbGl0aWVzIG9mIHRoZSByb3V0ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byB1c2UgaXQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIGJvb2xlYW4gcGxheU1vdmllKCkgewotICAgICAqICAgICBNZWRpYVJvdXRlciBtZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAqICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICoKLSAgICAgKiAgICAgLy8gRmlyc3QgdHJ5IHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgaW50ZXJmYWNlLCBpZiBzdXBwb3J0ZWQuCi0gICAgICogICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgewotICAgICAqICAgICAgICAgLy8gVGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiAgICAgICAgIC8vIFRyeSB0byBzZW5kIGl0IHRoZSBVcmkgb2YgdGhlIG1vdmllIHRvIHBsYXkuCi0gICAgICogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpOwotICAgICAqICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAqICAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKLSAgICAgKiAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KGludGVudCkpIHsKLSAgICAgKiAgICAgICAgICAgICByb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBudWxsKTsKLSAgICAgKiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gc2VudCB0aGUgcmVxdWVzdCB0byBwbGF5IHRoZSBtb3ZpZQotICAgICAqICAgICAgICAgfQotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gSWYgcmVtb3RlIHBsYXliYWNrIHdhcyBub3QgcG9zc2libGUsIHRoZW4gcGxheSBsb2NhbGx5LgotICAgICAqICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pKSB7Ci0gICAgICogICAgICAgICAvLyBUaGUgcm91dGUgc3VwcG9ydHMgbGl2ZSB2aWRlbyBzdHJlYW1pbmcuCi0gICAgICogICAgICAgICAvLyBQcmVwYXJlIHRvIHBsYXkgY29udGVudCBsb2NhbGx5IGluIGEgd2luZG93IG9yIGluIGEgcHJlc2VudGF0aW9uLgotICAgICAqICAgICAgICAgcmV0dXJuIHBsYXlNb3ZpZUluV2luZG93KCk7Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBOZWl0aGVyIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQsIHNvIHdlIGNhbid0IHBsYXkgdGhlIG1vdmllIHRvIHRoaXMgcm91dGUuCi0gICAgICogICAgIHJldHVybiBmYWxzZTsKLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RlZCByb3V0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqCi0gICAgICogQHNlZSBSb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeQotICAgICAqIEBzZWUgUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0U2VsZWN0ZWRSb3V0ZSgpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCByb3V0ZSBpZiBpdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IsIG90aGVyd2lzZQotICAgICAqIHNlbGVjdHMgdGhlIGRlZmF1bHQgcm91dGUgYW5kIHJldHVybnMgaXQuIElmIHRoZXJlIGlzIG9uZSBsaXZlIGF1ZGlvIHJvdXRlCi0gICAgICogKHVzdWFsbHkgQmx1ZXRvb3RoIEEyRFApLCBpdCB3aWxsIGJlIHNlbGVjdGVkIGluc3RlYWQgb2YgZGVmYXVsdCByb3V0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2guCi0gICAgICogQHJldHVybiBUaGUgcHJldmlvdXNseSBzZWxlY3RlZCByb3V0ZSBpZiBpdCBtYXRjaGVkIHRoZSBzZWxlY3Rvciwgb3RoZXJ3aXNlIHRoZQotICAgICAqIG5ld2x5IHNlbGVjdGVkIGRlZmF1bHQgcm91dGUgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlU2VsZWN0b3IKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNtYXRjaGVzU2VsZWN0b3IKLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gdXBkYXRlU2VsZWN0ZWRSb3V0ZShATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInVwZGF0ZVNlbGVjdGVkUm91dGU6ICIgKyBzZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIGlmICghcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgcm91dGUgPSBzR2xvYmFsLmNob29zZUZhbGxiYWNrUm91dGUoKTsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUocm91dGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb3V0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIHNlbGVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNlbGVjdFJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUocm91dGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVuc2VsZWN0cyB0aGUgY3VycmVudCByb3VuZCBhbmQgc2VsZWN0cyB0aGUgZGVmYXVsdCByb3V0ZSBpbnN0ZWFkLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZWFzb24gZ2l2ZW4gbXVzdCBiZSBvbmUgb2Y6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIGRpc2Nvbm5lY3RpbmcgdGhlIGN1cnJlbnQgcm91dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICBpZiAocmVhc29uIDwgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04gfHwKLSAgICAgICAgICAgICAgICByZWFzb24gPiBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgcmVhc29uIHRvIHVuc2VsZWN0IHJvdXRlIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgLy8gQ2hvb3NlIHRoZSBmYWxsYmFjayByb3V0ZSBpZiBpdCdzIG5vdCBhbHJlYWR5IHNlbGVjdGVkLgotICAgICAgICAvLyBPdGhlcndpc2UsIHNlbGVjdCB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgUm91dGVJbmZvIGZhbGxiYWNrUm91dGUgPSBzR2xvYmFsLmNob29zZUZhbGxiYWNrUm91dGUoKTsKLSAgICAgICAgaWYgKHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpICE9IGZhbGxiYWNrUm91dGUpIHsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUoZmFsbGJhY2tSb3V0ZSwgcmVhc29uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUoc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKSwgcmVhc29uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHJvdXRlIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGF2YWlsYWJsZSByb3V0ZXMgdGhhdCBtYXRjaCB0aGUKLSAgICAgKiBzZWxlY3RvciByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gSWYgdGhlCi0gICAgICoge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURX0gZmxhZyBpcyBzcGVjaWZpZWQsIHRoZW4KLSAgICAgKiB0aGUgbWV0aG9kIHdpbGwgb25seSBjb25zaWRlciBub24tZGVmYXVsdCByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBtZXRob2QKLSAgICAgKiB3aWxsIHJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgbWF0Y2hpbmcgcm91dGUgZXZlbiBpZgotICAgICAqIGRpc2NvdmVyeSBpcyBub3QgaW4gcHJvZ3Jlc3Mgb3IgaWYgbm8gbWF0Y2hpbmcgcm91dGUgaGFzIHlldCBiZWVuIGZvdW5kLgotICAgICAqIFVzZSB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0h9IHRvIHJlcXVpcmUgYW4gYWN0dWFsIG1hdGNoLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2guCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGRldGVybWluYXRpb24gb2Ygd2hldGhlciBhIHJvdXRlIG1heSBiZQotICAgICAqICAgICAgICAgICAgYXZhaWxhYmxlLiBNYXkgYmUgemVybyBvciBzb21lIGNvbWJpbmF0aW9uIG9mCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFfSBhbmQKLSAgICAgKiAgICAgICAgICAgIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSH0uCi0gICAgICogQHJldHVybiBUcnVlIGlmIGEgbWF0Y2hpbmcgcm91dGUgbWF5IGJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdXRlQXZhaWxhYmxlKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuaXNSb3V0ZUF2YWlsYWJsZShzZWxlY3RvciwgZmxhZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgdG8gcmVjZWl2ZQotICAgICAqIGV2ZW50cyB3aGVuIHRoZXkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCl9IHdpdGhvdXQgZmxhZ3MuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIEEgcm91dGUgc2VsZWN0b3IgdGhhdCBpbmRpY2F0ZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZQotICAgICAqIGNhbGxiYWNrIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBhZGQuCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGFkZENhbGxiYWNrKHNlbGVjdG9yLCBjYWxsYmFjaywgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCB0byByZWNlaXZlCi0gICAgICogZXZlbnRzIHdoZW4gdGhleSBjaGFuZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNlbGVjdG9yIGRlc2NyaWJlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvCi0gICAgICogZGlzY292ZXIuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHVzZQotICAgICAqIGxpdmUgYXVkaW8gcm91dGVzIHRoZW4gaXQgc2hvdWxkIGluY2x1ZGUgdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPIGxpdmUgYXVkaW8gbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcnl9Ci0gICAgICogaW4gaXRzIHNlbGVjdG9yIHdoZW4gaXQgYWRkcyBhIGNhbGxiYWNrIHRvIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICogVGhlIHNlbGVjdG9yIG1heSBpbmNsdWRlIGFueSBudW1iZXIgb2YgY2F0ZWdvcmllcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgdGhlbiB0aGUgc2VsZWN0b3IgaXMgYWRkZWQgdG8KLSAgICAgKiB0aGUgc2V0IG9mIHNlbGVjdG9ycyBiZWluZyBtb25pdG9yZWQgYnkgdGhlIGNhbGxiYWNrLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBCeSBkZWZhdWx0LCB0aGUgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIGV2ZW50cyB0aGF0IGFmZmVjdCByb3V0ZXMKLSAgICAgKiB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuICBFdmVudCBmaWx0ZXJpbmcgbWF5IGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcKLSAgICAgKiB0aGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfSBmbGFnIHdoZW4gdGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9IG1ldGhvZCB0byBkZXRlcm1pbmUKLSAgICAgKiB3aGV0aGVyIGlzIGl0IHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgcm91dGUgd2l0aCB0aGUgZGVzaXJlZCBjYXBhYmlsaXRpZXMKLSAgICAgKiBhbmQgdGhlcmVmb3JlIHdoZXRoZXIgdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBzaG91bGQgYmUgc2hvd24gdG8gdGhlIHVzZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogaXMgaW4gdGhlIGZvcmVncm91bmQgdG8gcmVxdWVzdCB0aGF0IHBhc3NpdmUgZGlzY292ZXJ5IGJlIHBlcmZvcm1lZCBpZiB0aGVyZSBhcmUKLSAgICAgKiBzdWZmaWNpZW50IHJlc291cmNlcyB0byBhbGxvdyBjb250aW51b3VzIHBhc3NpdmUgZGlzY292ZXJ5LgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIGZsYWcgd2lsbCBiZQotICAgICAqIGlnbm9yZWQgdG8gY29uc2VydmUgcmVzb3VyY2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWX0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICogcGFzc2l2ZSBkaXNjb3ZlcnkgYWJzb2x1dGVseSBtdXN0IGJlIHBlcmZvcm1lZCwgZXZlbiBvbiBsb3ctUkFNIGRldmljZXMuCi0gICAgICogVGhpcyBmbGFnIGhhcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBvbiBsb3ctUkFNIGRldmljZXMKLSAgICAgKiBzaW5jZSBpdCBtYXkgY2F1c2UgbWFueSBtZWRpYSByb3V0ZSBwcm92aWRlcnMgdG8gYmUgc3RhcnRlZCBzaW11bHRhbmVvdXNseS4KLSAgICAgKiBJdCBpcyBtdWNoIGJldHRlciB0byB1c2Uge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBpbnN0ZWFkIHRvIGF2b2lkCi0gICAgICogcGVyZm9ybWluZyBwYXNzaXZlIGRpc2NvdmVyeSBvbiB0aGVzZSBkZXZpY2VzIGFsdG9nZXRoZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZQotICAgICAqIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGlzIHNob3dpbmcgdG8gY29uZmlybSB0aGUgcHJlc2VuY2Ugb2YgYXZhaWxhYmxlCi0gICAgICogcm91dGVzIHRoYXQgdGhlIHVzZXIgbWF5IGNvbm5lY3QgdG8uICBUaGlzIGZsYWcgbWF5IHVzZSBzdWJzdGFudGlhbGx5IG1vcmUKLSAgICAgKiBwb3dlci4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXhhbXBsZTwvaDM+Ci0gICAgICogPHByZT4KLSAgICAgKiBwdWJsaWMgY2xhc3MgTXlBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgICAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgICAqCi0gICAgICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKLSAgICAgKiAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7Ci0gICAgICogICAgICAgICBtU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKQotICAgICAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCi0gICAgICogICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gQWRkIHRoZSBjYWxsYmFjayBvbiBzdGFydCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgd2hhdCBraW5kcyBvZiByb3V0ZXMKLSAgICAgKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCi0gICAgICogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vblN0YXJ0KCk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLAotICAgICAqICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKTsKLSAgICAgKgotICAgICAqICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIudXBkYXRlU2VsZWN0ZWRSb3V0ZShtU2VsZWN0b3IpOwotICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHJvdXRlLi4uCi0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBSZW1vdmUgdGhlIHNlbGVjdG9yIG9uIHN0b3AgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHRoYXQgaXQgbm8gbG9uZ2VyCi0gICAgICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgotICAgICAqICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICAgKgotICAgICAqICAgICAgICAgbWVkaWFSb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgKiAgICAgICAgIC8vIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2RzIGFzIG5lZWRlZC4KLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHJvdXRlIHNlbGVjdG9yIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUKLSAgICAgKiBjYWxsYmFjayB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgY2FsbGJhY2suCi0gICAgICogTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZiB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCi0gICAgICoge0BsaW5rICNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfS4KLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENhbGxiYWNrKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgQE5vbk51bGwgQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBAQ2FsbGJhY2tGbGFncyBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkQ2FsbGJhY2s6IHNlbGVjdG9yPSIgKyBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICArICIsIGNhbGxiYWNrPSIgKyBjYWxsYmFjayArICIsIGZsYWdzPSIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGZsYWdzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDYWxsYmFja1JlY29yZCByZWNvcmQ7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDYWxsYmFja1JlY29yZChjYWxsYmFjayk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJlY29yZCA9IG5ldyBDYWxsYmFja1JlY29yZCh0aGlzLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVjb3JkID0gbUNhbGxiYWNrUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gdXBkYXRlTmVlZGVkID0gZmFsc2U7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiB+cmVjb3JkLm1GbGFncykgIT0gMCkgewotICAgICAgICAgICAgcmVjb3JkLm1GbGFncyB8PSBmbGFnczsKLSAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZWNvcmQubVNlbGVjdG9yLmNvbnRhaW5zKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgcmVjb3JkLm1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihyZWNvcmQubVNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICAuYWRkU2VsZWN0b3Ioc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgdXBkYXRlTmVlZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBkYXRlTmVlZGVkKSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBjYWxsYmFjay4gIEl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgZXZlbnRzIGFib3V0Ci0gICAgICogY2hhbmdlcyB0byBtZWRpYSByb3V0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS4KLSAgICAgKiBAc2VlICNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVDYWxsYmFjazogY2FsbGJhY2s9IiArIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpbmRleCA9IGZpbmRDYWxsYmFja1JlY29yZChjYWxsYmFjayk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tSZWNvcmRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGZpbmRDYWxsYmFja1JlY29yZChDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVjb3Jkcy5nZXQoaSkubUNhbGxiYWNrID09IGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uIHByb2Nlc3MuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYWxsIHtAbGluayBNZWRpYVJvdXRlcn0KLSAgICAgKiBpbnN0YW5jZXMgd2l0aGluIHRoaXMgcHJvY2VzcyBjYW4gdXNlIHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJJbnN0YW5jZSBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW5zdGFuY2UgdG8gYWRkLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChwcm92aWRlckluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVySW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUHJvdmlkZXI6ICIgKyBwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLmFkZFByb3ZpZGVyKHByb3ZpZGVySW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVucmVnaXN0ZXJzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2l0aGluIHRoaXMgYXBwbGljYXRpb24gcHJvY2Vzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYWxsIHtAbGluayBNZWRpYVJvdXRlcn0KLSAgICAgKiBpbnN0YW5jZXMgd2l0aGluIHRoaXMgcHJvY2VzcyBjYW4gdXNlIHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJJbnN0YW5jZSBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW5zdGFuY2UgdG8gcmVtb3ZlLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgKiBAc2VlICNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChwcm92aWRlckluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVySW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUHJvdmlkZXI6ICIgKyBwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVySW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZW1vdGUgY29udHJvbCBjbGllbnQgdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUKLSAgICAgKiBvZiB0aGUgc2VsZWN0ZWQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlbW90ZSBjb250cm9sIGNsaWVudCBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHRoZSBhdWRpbyBtYW5hZ2VyIHVzaW5nIHRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIjcmVnaXN0ZXJSZW1vdGVDb250cm9sQ2xpZW50Ci0gICAgICogQXVkaW9NYW5hZ2VyLnJlZ2lzdGVyUmVtb3RlQ29udHJvbENsaWVudH0gbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZW1vdGVDb250cm9sQ2xpZW50IFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50fSB0byByZWdpc3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW1vdGVDb250cm9sQ2xpZW50KEBOb25OdWxsIE9iamVjdCByZW1vdGVDb250cm9sQ2xpZW50KSB7Ci0gICAgICAgIGlmIChyZW1vdGVDb250cm9sQ2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbW90ZUNvbnRyb2xDbGllbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUmVtb3RlQ29udHJvbENsaWVudDogIiArIHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuYWRkUmVtb3RlQ29udHJvbENsaWVudChyZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbW90ZUNvbnRyb2xDbGllbnQgVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnR9Ci0gICAgICogICAgICAgICAgICB0byB1bnJlZ2lzdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQoQE5vbk51bGwgT2JqZWN0IHJlbW90ZUNvbnRyb2xDbGllbnQpIHsKLSAgICAgICAgaWYgKHJlbW90ZUNvbnRyb2xDbGllbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVtb3RlQ29udHJvbENsaWVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQ6ICIgKyByZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQocmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgc2Vzc2lvbiB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZSBvZiB0aGUKLSAgICAgKiBzZWxlY3RlZCByb3V0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICoge0BsaW5rICNhZGRSZW1vdGVDb250cm9sQ2xpZW50fSB3aGVuIHVzaW5nIG1lZGlhIHNlc3Npb25zLiBTZXQgdGhlCi0gICAgICogc2Vzc2lvbiB0byBudWxsIHRvIGNsZWFyIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lZGlhU2Vzc2lvbiBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb259IHRvCi0gICAgICogICAgICAgICAgICB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE9iamVjdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRNZWRpYVNlc3Npb246ICIgKyBtZWRpYVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2V0TWVkaWFTZXNzaW9uKG1lZGlhU2Vzc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNvbXBhdCBtZWRpYSBzZXNzaW9uIHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lIG9mIHRoZQotICAgICAqIHNlbGVjdGVkIHJvdXRlLiBUaGlzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YKLSAgICAgKiB7QGxpbmsgI2FkZFJlbW90ZUNvbnRyb2xDbGllbnR9IHdoZW4gdXNpbmcge0BsaW5rIE1lZGlhU2Vzc2lvbkNvbXBhdH0uCi0gICAgICogU2V0IHRoZSBzZXNzaW9uIHRvIG51bGwgdG8gY2xlYXIgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVkaWFTZXNzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uQ29tcGF0KE1lZGlhU2Vzc2lvbkNvbXBhdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRNZWRpYVNlc3Npb25Db21wYXQ6ICIgKyBtZWRpYVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2V0TWVkaWFTZXNzaW9uQ29tcGF0KG1lZGlhU2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb25Ub2tlbigpIHsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgY2FsbHMgaW50byB0aGUgbWVkaWEgcm91dGVyIGFyZSBvbiB0aGUgY29ycmVjdCB0aHJlYWQuCi0gICAgICogSXQgcGF5cyB0byBiZSBhIGxpdHRsZSBwYXJhbm9pZCB3aGVuIGdsb2JhbCBzdGF0ZSBpbnZhcmlhbnRzIGFyZSBhdCByaXNrLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGNoZWNrQ2FsbGluZ1RocmVhZCgpIHsKLSAgICAgICAgaWYgKExvb3Blci5teUxvb3BlcigpICE9IExvb3Blci5nZXRNYWluTG9vcGVyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZWRpYSByb3V0ZXIgc2VydmljZSBtdXN0IG9ubHkgYmUgIgotICAgICAgICAgICAgICAgICAgICArICJhY2Nlc3NlZCBvbiB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyA8VD4gYm9vbGVhbiBlcXVhbChUIGEsIFQgYikgewotICAgICAgICByZXR1cm4gYSA9PSBiIHx8IChhICE9IG51bGwgJiYgYiAhPSBudWxsICYmIGEuZXF1YWxzKGIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggbWVkaWEgcm91dGUgaGFzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9Ci0gICAgICoge0BsaW5rICNnZXRDb250cm9sRmlsdGVycyBpbnRlbnQgZmlsdGVyc30gdGhhdCBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZQotICAgICAqIHJvdXRlIGFuZCB0aGUgbWFubmVyIGluIHdoaWNoIGl0IGlzIHVzZWQgYW5kIGNvbnRyb2xsZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckluZm8gbVByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVzY3JpcHRvcklkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVW5pcXVlSWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtRGVzY3JpcHRpb247Ci0gICAgICAgIHByaXZhdGUgVXJpIG1JY29uVXJpOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGluZzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5EaXNjb25uZWN0OwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGludCBtUGxheWJhY2tUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtUGxheWJhY2tTdHJlYW07Ci0gICAgICAgIHByaXZhdGUgaW50IG1EZXZpY2VUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lSGFuZGxpbmc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWVNYXg7Ci0gICAgICAgIHByaXZhdGUgRGlzcGxheSBtUHJlc2VudGF0aW9uRGlzcGxheTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IFBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkU7Ci0gICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7Ci0gICAgICAgIHByaXZhdGUgSW50ZW50U2VuZGVyIG1TZXR0aW5nc0ludGVudDsKLSAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0KLSAgICAgICAgQEludERlZih7Q09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORywKLSAgICAgICAgICAgICAgICBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENvbm5lY3Rpb25TdGF0ZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QgeWV0Ci0gICAgICAgICAqIHJlYWR5IGZvciB1c2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCA9IDI7Ci0KLSAgICAgICAgQEludERlZih7UExBWUJBQ0tfVFlQRV9MT0NBTCxQTEFZQkFDS19UWVBFX1JFTU9URX0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIFBsYXliYWNrVHlwZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBwbGF5YmFjayB0eXBlLCAibG9jYWwiLCBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhCi0gICAgICAgICAqIGlzIGhhcHBlbmluZyBvbiB0aGUgc2FtZSBkZXZpY2UgKGUuZy4gYSBwaG9uZSwgYSB0YWJsZXQpIGFzIHdoZXJlIGl0IGlzCi0gICAgICAgICAqIGNvbnRyb2xsZWQgZnJvbS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0UGxheWJhY2tUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19UWVBFX0xPQ0FMID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBwbGF5YmFjayB0eXBlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nIG9uCi0gICAgICAgICAqIGEgZGlmZmVyZW50IGRldmljZSAoaS5lLiB0aGUgcmVtb3RlIGRldmljZSkgdGhhbiB3aGVyZSBpdCBpcyBjb250cm9sbGVkIGZyb20uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFBsYXliYWNrVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9SRU1PVEUgPSAxOwotCi0gICAgICAgIEBJbnREZWYoe0RFVklDRV9UWVBFX1VOS05PV04sIERFVklDRV9UWVBFX1RWLCBERVZJQ0VfVFlQRV9TUEVBS0VSLCBERVZJQ0VfVFlQRV9CTFVFVE9PVEh9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBEZXZpY2VUeXBlIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSB0eXBlIGlzIHVua25vd24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1VOS05PV04gPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIFRWLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9UViA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgc3BlYWtlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfU1BFQUtFUiA9IDI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgYmx1ZXRvb3RoIGRldmljZSBzdWNoIGFzIGEgYmx1ZXRvb3RoIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX0JMVUVUT09USCA9IDM7Ci0KLSAgICAgICAgQEludERlZih7UExBWUJBQ0tfVk9MVU1FX0ZJWEVELFBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIFBsYXliYWNrVm9sdW1lIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBsYXliYWNrIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhlIHBsYXliYWNrIHZvbHVtZSBpcyBmaXhlZCwgaS5lLiBpdCBjYW5ub3QgYmUKLSAgICAgICAgICogY29udHJvbGxlZCBmcm9tIHRoaXMgb2JqZWN0LiBBbiBleGFtcGxlIG9mIGZpeGVkIHBsYXliYWNrIHZvbHVtZSBpcyBhIHJlbW90ZSBwbGF5ZXIsCi0gICAgICAgICAqIHBsYXlpbmcgb3ZlciBIRE1JIHdoZXJlIHRoZSB1c2VyIHByZWZlcnMgdG8gY29udHJvbCB0aGUgdm9sdW1lIG9uIHRoZSBIRE1JIHNpbmssIHJhdGhlcgotICAgICAgICAgKiB0aGFuIGF0dGVudWF0ZSBhdCB0aGUgc291cmNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRWb2x1bWVIYW5kbGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVk9MVU1FX0ZJWEVEID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUGxheWJhY2sgaW5mb3JtYXRpb24gaW5kaWNhdGluZyB0aGUgcGxheWJhY2sgdm9sdW1lIGlzIHZhcmlhYmxlIGFuZCBjYW4gYmUgY29udHJvbGxlZAotICAgICAgICAgKiBmcm9tIHRoaXMgb2JqZWN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRWb2x1bWVIYW5kbGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQgaW5kaWNhdGluZyBubyBwcmVzZW50YXRpb24gZGlzcGxheSBpcyBhc3NvY2lhdGVkCi0gICAgICAgICAqIHdpdGggdGhlIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSA9IC0xOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX0dFTkVSQUwgPSAxIDw8IDA7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1ZPTFVNRSA9IDEgPDwgMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVkgPSAxIDw8IDI7Ci0KLSAgICAgICAgLy8gU2hvdWxkIG1hdGNoIHRvIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5QQUNLQUdFX05BTUUuCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX01FRElBX1JPVVRFX1BST1ZJREVSX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKLQotICAgICAgICBSb3V0ZUluZm8oUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgZGVzY3JpcHRvcklkLCBTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgbURlc2NyaXB0b3JJZCA9IGRlc2NyaXB0b3JJZDsKLSAgICAgICAgICAgIG1VbmlxdWVJZCA9IHVuaXF1ZUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3ZpZGVyIG9mIHRoaXMgbWVkaWEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUHJvdmlkZXJJbmZvIGdldFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIHVuaXF1ZSBpZCBmdW5jdGlvbnMgYXMgYSBzdGFibGUgaWRlbnRpZmllciBieSB3aGljaCB0aGUgcm91dGUgaXMga25vd24uCi0gICAgICAgICAqIEZvciBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoaXMgaWQgYXMgYSB0b2tlbiB0byByZW1lbWJlciB0aGUKLSAgICAgICAgICogc2VsZWN0ZWQgcm91dGUgYWNyb3NzIHJlc3RhcnRzIG9yIHRvIGNvbW11bmljYXRlIGl0cyBpZGVudGl0eSB0byBhIHNlcnZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZSwgbmV2ZXIgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVuaXF1ZUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBuYW1lLCBhbiBhbGlhcywgb3IgZGV2aWNlIHNlcmlhbCBudW1iZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgYSBtZWRpYSByb3V0ZS4gIFRoaXMgaXMgdGhlIHN0cmluZyBwcmVzZW50ZWQKLSAgICAgICAgICogdG8gdXNlcnMgd2hvIG1heSBzZWxlY3QgdGhpcyBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGVuYWJsZWQgYW5kIG1heSBiZSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdAotICAgICAgICAgKiB5ZXQgcmVhZHkgZm9yIHVzZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOiB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgICAgICoge0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvciB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgICAgICovCi0gICAgICAgIEBDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXRTZWxlY3RlZFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0RGVmYXVsdFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldERlZmF1bHRSb3V0ZSgpID09IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgYSBibHVldG9vdGggcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGEgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldEJsdWV0b290aFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JsdWV0b290aCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Qmx1ZXRvb3RoUm91dGUoKSA9PSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCB0aGUgZGV2aWNlIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCB0aGUgZGV2aWNlIHNwZWFrZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RldmljZVNwZWFrZXIoKSB7Ci0gICAgICAgICAgICBpbnQgZGVmYXVsdEF1ZGlvUm91dGVOYW1lUmVzb3VyY2VJZCA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRJZGVudGlmaWVyKAotICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdF9hdWRpb19yb3V0ZV9uYW1lIiwgInN0cmluZyIsICJhbmRyb2lkIik7Ci0gICAgICAgICAgICByZXR1cm4gaXNEZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldFRleHQoZGVmYXVsdEF1ZGlvUm91dGVOYW1lUmVzb3VyY2VJZCkuZXF1YWxzKG1OYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzIHRoYXQKLSAgICAgICAgICogZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIHJvdXRlIGFuZCB0aGUgbWVkaWEgY29udHJvbCBhY3Rpb25zIHRoYXQKLSAgICAgICAgICogaXQgc3VwcG9ydHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIGludGVudCBmaWx0ZXJzIHRoYXQgc3BlY2lmaWVzIHRoZSBtZWRpYSBjb250cm9sIGludGVudHMgdGhhdAotICAgICAgICAgKiB0aGlzIHJvdXRlIHN1cHBvcnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeQotICAgICAgICAgKiBAc2VlICNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxJbnRlbnRGaWx0ZXI+IGdldENvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzCi0gICAgICAgICAqIGRlc2NyaWJlZCBieSBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBjYXBhYmlsaXRpZXMgdG8gY2hlY2suCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYXQgbGVhc3Qgb25lIG9mIHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICogZGVzY3JpYmVkIGluIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXNTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZWN0b3IubWF0Y2hlc0NvbnRyb2xGaWx0ZXJzKG1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3JpZXMgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIHJvdXRlCi0gICAgICAgICAqIHN1Y2ggYXMgd2hldGhlciBpdCBzdXBwb3J0cyBsaXZlIGF1ZGlvIHN0cmVhbWluZyBvciByZW1vdGUgcGxheWJhY2suCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeQotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLfSwgb3IgYSBwcm92aWRlci1kZWZpbmVkCi0gICAgICAgICAqIG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnkuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBpbnRlbnQgY2F0ZWdvcnkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzLmdldChpKS5oYXNDYXRlZ29yeShjYXRlZ29yeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5IGFuZCBhY3Rpb24uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIGFjdGlvbnMgZGVzY3JpYmUgc3BlY2lmaWMgcmVxdWVzdHMgdGhhdCBhbiBhcHBsaWNhdGlvbgotICAgICAgICAgKiBjYW4gYXNrIGEgcm91dGUgdG8gcGVyZm9ybS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5Ci0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0t9LCBvciBhIHByb3ZpZGVyLWRlZmluZWQKLSAgICAgICAgICogbWVkaWEgY29udHJvbCBjYXRlZ29yeS4KLSAgICAgICAgICogQHBhcmFtIGFjdGlvbiBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gYWN0aW9uCi0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWX0uCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBpbnRlbnQgYWN0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sQWN0aW9uKEBOb25OdWxsIFN0cmluZyBjYXRlZ29yeSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbikgewotICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbUNvbnRyb2xGaWx0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmhhc0NhdGVnb3J5KGNhdGVnb3J5KSAmJiBmaWx0ZXIuaGFzQWN0aW9uKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIHJlcXVlc3RzIGFyZSB1c2VkIHRvIHJlcXVlc3QgdGhlIHJvdXRlIHRvIHBlcmZvcm0KLSAgICAgICAgICogYWN0aW9ucyBzdWNoIGFzIHN0YXJ0aW5nIHJlbW90ZSBwbGF5YmFjayBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIGNhbiBoYW5kbGUgdGhlIHNwZWNpZmllZCBpbnRlbnQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KEBOb25OdWxsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IHNHbG9iYWwuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycy5nZXQoaSkubWF0Y2goY29udGVudFJlc29sdmVyLCBpbnRlbnQsIHRydWUsIFRBRykgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VuZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QgdG8gYmUgcGVyZm9ybWVkCi0gICAgICAgICAqIGFzeW5jaHJvbm91c2x5IGJ5IHRoZSByb3V0ZSdzIGRlc3RpbmF0aW9uLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCByZXF1ZXN0cyBhcmUgdXNlZCB0byByZXF1ZXN0IHRoZSByb3V0ZSB0byBwZXJmb3JtCi0gICAgICAgICAqIGFjdGlvbnMgc3VjaCBhcyBzdGFydGluZyByZW1vdGUgcGxheWJhY2sgb2YgYSBtZWRpYSBpdGVtLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VsZWN0ZWQgcm91dGUuICBDb250cm9sIHJlcXVlc3RzCi0gICAgICAgICAqIHNlbnQgdG8gdW5zZWxlY3RlZCByb3V0ZXMgd2lsbCBmYWlsLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEge0BsaW5rIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2t9IHRvIGludm9rZSB3aXRoIHRoZSByZXN1bHQKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gcmVzdWx0IGlzIHJlcXVpcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VuZENvbnRyb2xSZXF1ZXN0KEBOb25OdWxsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgc0dsb2JhbC5zZW5kQ29udHJvbFJlcXVlc3QodGhpcywgaW50ZW50LCBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToge0BsaW5rICNQTEFZQkFDS19UWVBFX0xPQ0FMfQotICAgICAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgICAgICovCi0gICAgICAgIEBQbGF5YmFja1R5cGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBhdWRpbyBzdHJlYW0gb3ZlciB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBzdHJlYW0gb3ZlciB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1N0cmVhbSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTdHJlYW07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayAjREVWSUNFX1RZUEVfVFZ9IG9yIHtAbGluayAjREVWSUNFX1RZUEVfU1BFQUtFUn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURldmljZVR5cGU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB7Ci0gICAgICAgICAgICBpZiAoaXNEZWZhdWx0KCkgfHwgbURldmljZVR5cGUgPT0gREVWSUNFX1RZUEVfQkxVRVRPT1RIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgcGxhdGZvcm0gdmVyc2lvbiAyMyBvciBiZWxvdyB3aGVyZSB0aGUgc3lzdGVtIHJvdXRlCi0gICAgICAgICAgICAvLyBwcm92aWRlciBkb2Vzbid0IHNwZWNpZnkgZGV2aWNlIHR5cGUgZm9yIGJsdWV0b290aCBtZWRpYSByb3V0ZXMuCi0gICAgICAgICAgICByZXR1cm4gaXNTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIodGhpcykKLSAgICAgICAgICAgICAgICAgICAgJiYgc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pCi0gICAgICAgICAgICAgICAgICAgICYmICFzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJvdXRlIGlzIHNlbGVjdGFibGUuCi0gICAgICAgICAqLwotICAgICAgICBib29sZWFuIGlzU2VsZWN0YWJsZSgpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgdGVzdHMgd2hldGhlciB0aGUgcm91dGUgaXMgc3RpbGwgdmFsaWQgYW5kIGVuYWJsZWQuCi0gICAgICAgICAgICAvLyBUaGUgcm91dGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzZXQgdG8gbnVsbCB3aGVuIHRoZSByb3V0ZSBpcyByZW1vdmVkLgotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yICE9IG51bGwgJiYgbUVuYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5lcXVhbHMocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpLmdldE1ldGFkYXRhKCkuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgU1lTVEVNX01FRElBX1JPVVRFX1BST1ZJREVSX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6IHtAbGluayAjUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfQotICAgICAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0uCi0gICAgICAgICAqLwotICAgICAgICBAUGxheWJhY2tWb2x1bWUKLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVIYW5kbGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lSGFuZGxpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgY3VycmVudCB2b2x1bWUgZm9yIHRoaXMgcm91dGUuIERlcGVuZGluZyBvbiB0aGUgcm91dGUsIHRoaXMgbWF5IG9ubHkKLSAgICAgICAgICogYmUgdmFsaWQgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIG1heGltdW0gdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICogdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lTWF4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgd2hldGhlciB0aGlzIHJvdXRlIHN1cHBvcnRzIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCBpbnRlcnJ1cHRpbmcKLSAgICAgICAgICogcGxheWJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGNhbiBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2ssCi0gICAgICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuRGlzY29ubmVjdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2FuRGlzY29ubmVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhIHZvbHVtZSBjaGFuZ2UgZm9yIHRoaXMgcm91dGUgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgSXQgd2lsbCBoYXZlCi0gICAgICAgICAqIG5vIGVmZmVjdCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayAjZ2V0Vm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnJlcXVlc3RTZXRWb2x1bWUodGhpcywgTWF0aC5taW4obVZvbHVtZU1heCwgTWF0aC5tYXgoMCwgdm9sdW1lKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoaXMgcm91dGUgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgSXQgd2lsbCBoYXZlCi0gICAgICAgICAqIG5vIGVmZmVjdCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICBzR2xvYmFsLnJlcXVlc3RVcGRhdGVWb2x1bWUodGhpcywgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHtAbGluayBEaXNwbGF5fSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBzaG93Ci0gICAgICAgICAqIGEge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbn0gb24gYW4gZXh0ZXJuYWwgZGlzcGxheSB3aGVuIHRoaXMgcm91dGUgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAqIERlcGVuZGluZyBvbiB0aGUgcm91dGUsIHRoaXMgbWF5IG9ubHkgYmUgdmFsaWQgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseQotICAgICAgICAgKiBzZWxlY3RlZC4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSBwcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRpc3BsYXkgbWF5IGNoYW5nZSBpbmRlcGVuZGVudGx5IG9mIHRoZSByb3V0ZQotICAgICAgICAgKiBiZWluZyBzZWxlY3RlZCBvciB1bnNlbGVjdGVkLiAgRm9yIGV4YW1wbGUsIHRoZSBwcmVzZW50YXRpb24gZGlzcGxheQotICAgICAgICAgKiBvZiB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgbWF5IGNoYW5nZSB3aGVuIGFuIGV4dGVybmFsIEhETUkgZGlzcGxheSBpcyBjb25uZWN0ZWQKLSAgICAgICAgICogb3IgZGlzY29ubmVjdGVkIGV2ZW4gdGhvdWdoIHRoZSByb3V0ZSBpdHNlbGYgaGFzIG5vdCBjaGFuZ2VkLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBleHRlcm5hbCBkaXNwbGF5IGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgKiB0aGUgcm91dGUgb3IgaWYgdGhlIGRpc3BsYXkgaXMgbm90IHJlYWR5IHRvIHNob3cgVUkgeWV0LgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBwcmVzZW50YXRpb24gZGlzcGxheQotICAgICAgICAgKiB1c2luZyB0aGUge0BsaW5rIENhbGxiYWNrI29uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZH0gY2FsbGJhY2sgYW5kCi0gICAgICAgICAqIHNob3cgb3IgZGlzbWlzcyBpdHMge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbn0gYWNjb3JkaW5nbHkgd2hlbiB0aGUgZGlzcGxheQotICAgICAgICAgKiBiZWNvbWVzIGF2YWlsYWJsZSBvciBpcyByZW1vdmVkLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIG9ubHkgbWFrZXMgc2Vuc2UgZm9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFTyBsaXZlIHZpZGVvfSByb3V0ZXMuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgcHJlZmVycmVkIHByZXNlbnRhdGlvbiBkaXNwbGF5IHRvIHVzZSB3aGVuIHRoaXMgcm91dGUgaXMKLSAgICAgICAgICogc2VsZWN0ZWQgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPCi0gICAgICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIERpc3BsYXkgZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPj0gMCAmJiBtUHJlc2VudGF0aW9uRGlzcGxheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXkgPSBzR2xvYmFsLmdldERpc3BsYXkobVByZXNlbnRhdGlvbkRpc3BsYXlJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVByZXNlbnRhdGlvbkRpc3BsYXk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QcmVzZW50YXRpb25EaXNwbGF5SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBhIGNvbGxlY3Rpb24gb2YgZXh0cmEgcHJvcGVydGllcyBhYm91dCB0aGlzIHJvdXRlIHRoYXQgd2VyZSBzdXBwbGllZAotICAgICAgICAgKiBieSBpdHMgbWVkaWEgcm91dGUgcHJvdmlkZXIsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgYW4gaW50ZW50IHNlbmRlciBmb3IgbGF1bmNoaW5nIGEgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgICAgICogcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIEludGVudFNlbmRlciBnZXRTZXR0aW5nc0ludGVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2V0dGluZ3NJbnRlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VsZWN0cyB0aGlzIG1lZGlhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk1lZGlhUm91dGVyLlJvdXRlSW5mb3sgdW5pcXVlSWQ9IiArIG1VbmlxdWVJZAotICAgICAgICAgICAgICAgICAgICArICIsIG5hbWU9IiArIG1OYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGVzY3JpcHRpb249IiArIG1EZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICArICIsIGljb25Vcmk9IiArIG1JY29uVXJpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZW5hYmxlZD0iICsgbUVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25uZWN0aW5nPSIgKyBtQ29ubmVjdGluZwotICAgICAgICAgICAgICAgICAgICArICIsIGNvbm5lY3Rpb25TdGF0ZT0iICsgbUNvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIGNhbkRpc2Nvbm5lY3Q9IiArIG1DYW5EaXNjb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgcGxheWJhY2tUeXBlPSIgKyBtUGxheWJhY2tUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgcGxheWJhY2tTdHJlYW09IiArIG1QbGF5YmFja1N0cmVhbQotICAgICAgICAgICAgICAgICAgICArICIsIGRldmljZVR5cGU9IiArIG1EZXZpY2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdm9sdW1lSGFuZGxpbmc9IiArIG1Wb2x1bWVIYW5kbGluZwotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZT0iICsgbVZvbHVtZQotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZU1heD0iICsgbVZvbHVtZU1heAotICAgICAgICAgICAgICAgICAgICArICIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iICsgbVByZXNlbnRhdGlvbkRpc3BsYXlJZAotICAgICAgICAgICAgICAgICAgICArICIsIGV4dHJhcz0iICsgbUV4dHJhcwotICAgICAgICAgICAgICAgICAgICArICIsIHNldHRpbmdzSW50ZW50PSIgKyBtU2V0dGluZ3NJbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwcm92aWRlclBhY2thZ2VOYW1lPSIgKyBtUHJvdmlkZXIuZ2V0UGFja2FnZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgfSI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWF5YmVVcGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlcyA9IHVwZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB1cGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1OYW1lLCBkZXNjcmlwdG9yLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5hbWUgPSBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtRGVzY3JpcHRpb24sIGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1JY29uVXJpLCBkZXNjcmlwdG9yLmdldEljb25VcmkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUljb25VcmkgPSBkZXNjcmlwdG9yLmdldEljb25VcmkoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkICE9IGRlc2NyaXB0b3IuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBkZXNjcmlwdG9yLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RpbmcgIT0gZGVzY3JpcHRvci5pc0Nvbm5lY3RpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZyA9IGRlc2NyaXB0b3IuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblN0YXRlICE9IGRlc2NyaXB0b3IuZ2V0Q29ubmVjdGlvblN0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25TdGF0ZSA9IGRlc2NyaXB0b3IuZ2V0Q29ubmVjdGlvblN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbUNvbnRyb2xGaWx0ZXJzLmVxdWFscyhkZXNjcmlwdG9yLmdldENvbnRyb2xGaWx0ZXJzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuYWRkQWxsKGRlc2NyaXB0b3IuZ2V0Q29udHJvbEZpbHRlcnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUeXBlICE9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tTdHJlYW0gIT0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1N0cmVhbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1N0cmVhbSA9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1EZXZpY2VUeXBlICE9IGRlc2NyaXB0b3IuZ2V0RGV2aWNlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlID0gZGVzY3JpcHRvci5nZXREZXZpY2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lSGFuZGxpbmcgIT0gZGVzY3JpcHRvci5nZXRWb2x1bWVIYW5kbGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVIYW5kbGluZyA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZSA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZU1heCAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZU1heCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVNYXggPSBkZXNjcmlwdG9yLmdldFZvbHVtZU1heCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmVzZW50YXRpb25EaXNwbGF5SWQgIT0gZGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uRGlzcGxheUlkID0gZGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1FeHRyYXMsIGRlc2NyaXB0b3IuZ2V0RXh0cmFzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBkZXNjcmlwdG9yLmdldEV4dHJhcygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1TZXR0aW5nc0ludGVudCwgZGVzY3JpcHRvci5nZXRTZXR0aW5nc0FjdGl2aXR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc0ludGVudCA9IGRlc2NyaXB0b3IuZ2V0U2V0dGluZ3NBY3Rpdml0eSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNhbkRpc2Nvbm5lY3QgIT0gZGVzY3JpcHRvci5jYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FuRGlzY29ubmVjdCA9IGRlc2NyaXB0b3IuY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0RGVzY3JpcHRvcklkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9ySWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogQGhpZGUgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlciBnZXRQcm92aWRlckluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5nZXRQcm92aWRlckluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIHJvdXRlIHRoYXQgY29uc2lzdHMgb2YgbXVsdGlwbGUgb3RoZXIgcm91dGVzIGluIGEgZ3JvdXAuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVHcm91cCBleHRlbmRzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBSb3V0ZUdyb3VwKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIGRlc2NyaXB0b3JJZCwgU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBzdXBlcihwcm92aWRlciwgZGVzY3JpcHRvcklkLCB1bmlxdWVJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJvdXRlcyBpbiB0aGlzIGdyb3VwCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFJvdXRlQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcm91dGUgaW4gdGhpcyBncm91cCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCB0byBmZXRjaAotICAgICAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBhdCBpbmRleAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFJvdXRlSW5mbyBnZXRSb3V0ZUF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXMuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHRoZSByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtUm91dGVzLmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ10nKTsKLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIGludCBtYXliZVVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBncm91cE1lbWJlcklkcyA9IGRlc2NyaXB0b3IuZ2V0R3JvdXBNZW1iZXJJZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gZ3JvdXBNZW1iZXJJZHMuc2l6ZSgpICE9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVJZCA9IHNHbG9iYWwuZ2V0VW5pcXVlSWQoZ2V0UHJvdmlkZXIoKSwgZ3JvdXBNZW1iZXJJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gZ3JvdXBNZW1iZXIgPSBzR2xvYmFsLmdldFJvdXRlKHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cE1lbWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzLmFkZChncm91cE1lbWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkICYmICFtUm91dGVzLmNvbnRhaW5zKGdyb3VwTWVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSByb3V0ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKGNoYW5nZWQgPyBDSEFOR0VfR0VORVJBTCA6IDApIHwgc3VwZXIudXBkYXRlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBvYmplY3QgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcwotICAgICAqIHB1Ymxpc2hlZCBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvdmlkZXJJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXIgbVByb3ZpZGVySW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzb3VyY2VzTm90QXZhaWxhYmxlOwotCi0gICAgICAgIFByb3ZpZGVySW5mbyhNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlckluc3RhbmNlID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBwcm92aWRlci5nZXRNZXRhZGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgdW5kZXJseWluZyB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfSBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlckluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGNvbXBvbmVudCBuYW1lIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhLmdldENvbXBvbmVudE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlc30gcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCkgewotICAgICAgICAgICAgaWYgKG1SZXNvdXJjZXMgPT0gbnVsbCAmJiAhbVJlc291cmNlc05vdEF2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gc0dsb2JhbC5nZXRQcm92aWRlckNvbnRleHQocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9idGFpbiByZXNvdXJjZXMgZm9yIHJvdXRlIHByb3ZpZGVyIHBhY2thZ2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlc05vdEF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1SZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaW5kUm91dGVCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZXMuZ2V0KGkpLm1EZXNjcmlwdG9ySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiTWVkaWFSb3V0ZXIuUm91dGVQcm92aWRlckluZm97IHBhY2thZ2VOYW1lPSIgKyBnZXRQYWNrYWdlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiB9IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3IgcmVjZWl2aW5nIGV2ZW50cyBhYm91dCBtZWRpYSByb3V0aW5nIGNoYW5nZXMuCi0gICAgICogQWxsIG1ldGhvZHMgb2YgdGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBIENhbGxiYWNrIHdpbGwgb25seSByZWNlaXZlIGV2ZW50cyByZWxldmFudCB0byByb3V0ZXMgdGhhdCB0aGUgY2FsbGJhY2sKLSAgICAgKiB3YXMgcmVnaXN0ZXJlZCBmb3IgdW5sZXNzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30KLSAgICAgKiBmbGFnIHdhcyBzcGVjaWZpZWQgaW4ge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KQotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjcmVtb3ZlQ2FsbGJhY2soQ2FsbGJhY2spCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3VwcGxpZWQgbWVkaWEgcm91dGUgYmVjb21lcyBzZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgdW5zZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKiBGb3IgZGV0YWlsZWQgcmVhc29uLCBvdmVycmlkZSB7QGxpbmsgI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9Ci0gICAgICAgICAqIGluc3RlYWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gdW5zZWxlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgdW5zZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB7QGxpbmsgI29uUm91dGVVbnNlbGVjdGVkfS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByZWFzb24gcHJvdmlkZWQgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiB1bnNlbGVjdGVkLgotICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBvblJvdXRlVW5zZWxlY3RlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIGhhcyBiZWVuIGFkZGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWNvbWUgYXZhaWxhYmxlIGZvciB1c2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGF2YWlsYWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBvZiB0aGUgaW5kaWNhdGVkIG1lZGlhIHJvdXRlIGhhcyBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IHdhcyBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlJ3Mgdm9sdW1lIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHdob3NlIHZvbHVtZSBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlcy4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBiZWNvbWVzCi0gICAgICAgICAqIGF2YWlsYWJsZSwgaXMgcmVtb3ZlZCBvciBoYXMgY2hhbmdlcyB0byBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIChzdWNoIGFzIGl0cyBzaXplKS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB3aG9zZSBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIFJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGJlZW4gYWRkZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgaGFzIGJlY29tZSBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYXZhaWxhYmlsaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlclJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IG9mIHRoZSBpbmRpY2F0ZWQgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgd2FzIGNoYW5nZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSByZXN1bHQgb2YgYSBtZWRpYSBjb250cm9sIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSBjb250cm9sIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFJlc3VsdCBkYXRhLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqIENvbnRlbnRzIGRlcGVuZCBvbiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGFjdGlvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKLSAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBFcnJvciBkYXRhLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqIENvbnRlbnRzIGRlcGVuZCBvbiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGFjdGlvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENhbGxiYWNrUmVjb3JkIHsKLSAgICAgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgICAgICBwdWJsaWMgaW50IG1GbGFnczsKLQotICAgICAgICBwdWJsaWMgQ2FsbGJhY2tSZWNvcmQoTWVkaWFSb3V0ZXIgcm91dGVyLCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgbVJvdXRlciA9IHJvdXRlcjsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZmlsdGVyUm91dGVFdmVudChSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUykgIT0gMAotICAgICAgICAgICAgICAgICAgICB8fCByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdsb2JhbCBzdGF0ZSBmb3IgdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgKiA8cD4KLSAgICAgKiBNZWRpYSByb3V0ZXMgYW5kIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBhcmUgZ2xvYmFsIHRvIHRoZSBwcm9jZXNzOyB0aGVpcgotICAgICAqIHN0YXRlIGFuZCB0aGUgYnVsayBvZiB0aGUgbWVkaWEgcm91dGVyIGltcGxlbWVudGF0aW9uIGxpdmVzIGhlcmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEdsb2JhbE1lZGlhUm91dGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5TeW5jQ2FsbGJhY2ssCi0gICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5DYWxsYmFjayB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgbUFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZXI+PiBtUm91dGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UGFpcjxTdHJpbmcsIFN0cmluZz4sIFN0cmluZz4gbVVuaXF1ZUlkTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQcm92aWRlckluZm8+IG1Qcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVtb3RlQ29udHJvbENsaWVudFJlY29yZD4gbVJlbW90ZUNvbnRyb2xDbGllbnRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZmluYWwgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5QbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbyA9Ci0gICAgICAgICAgICAgICAgbmV3IFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuUGxheWJhY2tJbmZvKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJDYWxsYmFjayBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7Ci0gICAgICAgIGZpbmFsIENhbGxiYWNrSGFuZGxlciBtQ2FsbGJhY2tIYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlNYW5hZ2VyQ29tcGF0IG1EaXNwbGF5TWFuYWdlcjsKLSAgICAgICAgZmluYWwgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIG1TeXN0ZW1Qcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Mb3dSYW07Ci0KLSAgICAgICAgcHJpdmF0ZSBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlciBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlcjsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUluZm8gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUluZm8gbUJsdWV0b290aFJvdXRlOwotICAgICAgICBSb3V0ZUluZm8gbVNlbGVjdGVkUm91dGU7Ci0gICAgICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlcjsKLSAgICAgICAgLy8gQSBtYXAgZnJvbSByb3V0ZSBkZXNjcmlwdG9yIElEIHRvIFJvdXRlQ29udHJvbGxlciBmb3IgdGhlIG1lbWJlciByb3V0ZXMgaW4gdGhlIGN1cnJlbnRseQotICAgICAgICAvLyBzZWxlY3RlZCByb3V0ZSBncm91cC4KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBSb3V0ZUNvbnRyb2xsZXI+IG1Sb3V0ZUNvbnRyb2xsZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgbURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uUmVjb3JkIG1NZWRpYVNlc3Npb247Ci0gICAgICAgIE1lZGlhU2Vzc2lvbkNvbXBhdCBtUmNjTWVkaWFTZXNzaW9uOwotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbkNvbXBhdCBtQ29tcGF0U2Vzc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25Db21wYXQuT25BY3RpdmVDaGFuZ2VMaXN0ZW5lciBtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBuZXcgTWVkaWFTZXNzaW9uQ29tcGF0Lk9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZlQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBpZihtUmNjTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SY2NNZWRpYVNlc3Npb24uaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KG1SY2NNZWRpYVNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBHbG9iYWxNZWRpYVJvdXRlcihDb250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgbUFwcGxpY2F0aW9uQ29udGV4dCA9IGFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgICAgIG1EaXNwbGF5TWFuYWdlciA9IERpc3BsYXlNYW5hZ2VyQ29tcGF0LmdldEluc3RhbmNlKGFwcGxpY2F0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICBtTG93UmFtID0gQWN0aXZpdHlNYW5hZ2VyQ29tcGF0LmlzTG93UmFtRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAoQWN0aXZpdHlNYW5hZ2VyKWFwcGxpY2F0aW9uQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSkpOwotCi0gICAgICAgICAgICAvLyBBZGQgdGhlIHN5c3RlbSBtZWRpYSByb3V0ZSBwcm92aWRlciBmb3IgaW50ZXJvcGVyYXRpbmcgd2l0aAotICAgICAgICAgICAgLy8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuICBUaGlzIG9uZSBpcyBzcGVjaWFsIGFuZCByZWNlaXZlcwotICAgICAgICAgICAgLy8gc3luY2hyb25pemF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlciA9IFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5vYnRhaW4oYXBwbGljYXRpb25Db250ZXh0LCB0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICAgICAgYWRkUHJvdmlkZXIobVN5c3RlbVByb3ZpZGVyKTsKLQotICAgICAgICAgICAgLy8gU3RhcnQgd2F0Y2hpbmcgZm9yIHJvdXRlcyBwdWJsaXNoZWQgYnkgcmVnaXN0ZXJlZCBtZWRpYSByb3V0ZQotICAgICAgICAgICAgLy8gcHJvdmlkZXIgc2VydmljZXMuCi0gICAgICAgICAgICBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlciA9IG5ldyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlcigKLSAgICAgICAgICAgICAgICAgICAgbUFwcGxpY2F0aW9uQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgICAgICBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlci5zdGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVyIGdldFJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdXRlci5tQ29udGV4dCA9PSBjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm91dGVyID0gbmV3IE1lZGlhUm91dGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVJvdXRlcnMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVyPihyb3V0ZXIpKTsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29udGVudFJlc29sdmVyIGdldENvbnRlbnRSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRleHQgZ2V0UHJvdmlkZXJDb250ZXh0KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuUEFDS0FHRV9OQU1FKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dC5jcmVhdGVQYWNrYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBDb250ZXh0LkNPTlRFWFRfUkVTVFJJQ1RFRCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoaW50IGRpc3BsYXlJZCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TWFuYWdlci5nZXREaXNwbGF5KGRpc3BsYXlJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZW5kQ29udHJvbFJlcXVlc3QoUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQsIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFNldFZvbHVtZShSb3V0ZUluZm8gcm91dGUsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Sb3V0ZUNvbnRyb2xsZXJNYXAuZ2V0KHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoUm91dGVJbmZvIHJvdXRlLCBpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUm91dGVJbmZvIGdldFJvdXRlKFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gaW5mbyA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5tVW5pcXVlSWQuZXF1YWxzKHVuaXF1ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFByb3ZpZGVySW5mbz4gZ2V0UHJvdmlkZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICBATm9uTnVsbCBSb3V0ZUluZm8gZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbmNlIHRoZSBtZWRpYSByb3V0ZXIgaGFzIGJlZW4gZnVsbHkKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBidXQgaXQgaXMgZ29vZCB0byBjaGVjayBmb3IgdGhlIGVycm9yIGluIGNhc2UgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBpbiBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBkZWZhdWx0IHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIG1lZGlhIHJvdXRlciBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBSb3V0ZUluZm8gZ2V0Qmx1ZXRvb3RoUm91dGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJsdWV0b290aFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgUm91dGVJbmZvIGdldFNlbGVjdGVkUm91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbmNlIHRoZSBtZWRpYSByb3V0ZXIgaGFzIGJlZW4gZnVsbHkKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBidXQgaXQgaXMgZ29vZCB0byBjaGVjayBmb3IgdGhlIGVycm9yIGluIGNhc2UgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBpbiBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgbWVkaWEgcm91dGVyIGhhcyBub3QgeWV0IGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkUm91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgc2VsZWN0Um91dGUocm91dGUsIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlLCBpbnQgdW5zZWxlY3RSZWFzb24pIHsKLSAgICAgICAgICAgIGlmICghbVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBhdHRlbXB0IHRvIHNlbGVjdCByZW1vdmVkIHJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcm91dGUubUVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBhdHRlbXB0IHRvIHNlbGVjdCBkaXNhYmxlZCByb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwocm91dGUsIHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUm91dGVBdmFpbGFibGUoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE9uIGxvdy1SQU0gZGV2aWNlcywgZG8gbm90IHJlbHkgb24gYWN0dWFsIGRpc2NvdmVyeSByZXN1bHRzIHVubGVzcyBhc2tlZCB0by4KLSAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIKSA9PSAwICYmIG1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhbnkgZXhpc3Rpbmcgcm91dGVzIG1hdGNoIHRoZSBzZWxlY3Rvci4KLSAgICAgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlLm1hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJdCBkb2Vzbid0IGxvb2sgbGlrZSB3ZSBjYW4gZmluZCBhIG1hdGNoaW5nIHJvdXRlIHJpZ2h0IG5vdy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgICAgICAvLyBDb21iaW5lIGFsbCBvZiB0aGUgY2FsbGJhY2sgc2VsZWN0b3JzIGFuZCBhY3RpdmUgc2NhbiBmbGFncy4KLSAgICAgICAgICAgIGJvb2xlYW4gZGlzY292ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja1JlY29yZCBjYWxsYmFjayA9IHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkU2VsZWN0b3IoY2FsbGJhY2subVNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2NhbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOyAvLyBwZXJmb3JtIGFjdGl2ZSBzY2FuIGltcGxpZXMgcmVxdWVzdCBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUxvd1JhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjay5tRmxhZ3MgJiBDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciA9IGRpc2NvdmVyID8gYnVpbGRlci5idWlsZCgpIDogTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICAgICAgICBpZiAobURpc2NvdmVyeVJlcXVlc3QgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtRGlzY292ZXJ5UmVxdWVzdC5nZXRTZWxlY3RvcigpLmVxdWFscyhzZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURpc2NvdmVyeVJlcXVlc3QuaXNBY3RpdmVTY2FuKCkgPT0gYWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IuaXNFbXB0eSgpICYmICFhY3RpdmVTY2FuKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzY292ZXJ5IGlzIG5vdCBuZWVkZWQuCi0gICAgICAgICAgICAgICAgaWYgKG1EaXNjb3ZlcnlSZXF1ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEaXNjb3ZlcnkgaXMgbmVlZGVkLgotICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yLCBhY3RpdmVTY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVwZGF0ZWQgZGlzY292ZXJ5IHJlcXVlc3Q6ICIgKyBtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGlzY292ZXIgJiYgIWFjdGl2ZVNjYW4gJiYgbUxvd1JhbSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvcmNpbmcgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgb24gYSBsb3ctUkFNIGRldmljZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAic3lzdGVtIHBlcmZvcm1hbmNlIG1heSBiZSBhZmZlY3RlZC4gIFBsZWFzZSBjb25zaWRlciB1c2luZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZIGluc3RlYWQgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vdGlmeSBwcm92aWRlcnMuCi0gICAgICAgICAgICBmaW5hbCBpbnQgcHJvdmlkZXJDb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmdldChpKS5tUHJvdmlkZXJJbnN0YW5jZS5zZXREaXNjb3ZlcnlSZXF1ZXN0KG1EaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBBZGQgdGhlIHByb3ZpZGVyIHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG5ldyBQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5hZGQocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm92aWRlciBhZGRlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfQURERUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAvLyAyLiBDcmVhdGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgcHJvdmlkZXJJbnN0YW5jZS5nZXREZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgICAgIC8vIDMuIFJlZ2lzdGVyIHRoZSBwcm92aWRlciBjYWxsYmFjay4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldENhbGxiYWNrKG1Qcm92aWRlckNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICAvLyA0LiBTZXQgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIDEuIFVucmVnaXN0ZXIgdGhlIHByb3ZpZGVyIGNhbGxiYWNrLgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gMi4gQ2xlYXIgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKLSAgICAgICAgICAgICAgICAvLyAzLiBEZWxldGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIG51bGwpOwotICAgICAgICAgICAgICAgIC8vIDQuIFJlbW92ZSB0aGUgcHJvdmlkZXIgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgcmVtb3ZlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfUkVNT1ZFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlUHJvdmlkZXJEZXNjcmlwdG9yKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRQcm92aWRlckluZm8oTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Qcm92aWRlcnMuZ2V0KGkpLm1Qcm92aWRlckluc3RhbmNlID09IHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXJEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIudXBkYXRlRGVzY3JpcHRvcihwcm92aWRlckRlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGFsbCBleGlzdGluZyByb3V0ZXMgYW5kIHJlb3JkZXIgdGhlbSB0byBtYXRjaAotICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRlciBvZiB0aGVpciBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlckRlc2NyaXB0b3IuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZURlc2NyaXB0b3JzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJEZXNjcmlwdG9yLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSByb3V0ZURlc2NyaXB0b3JzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0aW5nIHJvdXRlIGdyb3VwJ3MgY29udGVudHMgcmVxdWlyZXMgYWxsIG1lbWJlciByb3V0ZXMnIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBncm91cHMgdG8gdGhlIGxpc3RzIGFuZCB1cGRhdGUgdGhlbSBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPj4gYWRkZWRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPj4gdXBkYXRlZEdyb3VwcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZURlc2NyaXB0b3IgPSByb3V0ZURlc2NyaXB0b3JzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSByb3V0ZURlc2NyaXB0b3IuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc291cmNlSW5kZXggPSBwcm92aWRlci5maW5kUm91dGVCeURlc2NyaXB0b3JJZChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBBZGQgdGhlIHJvdXRlIHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBhc3NpZ25Sb3V0ZVVuaXF1ZUlkKHByb3ZpZGVyLCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHcm91cCA9IHJvdXRlRGVzY3JpcHRvci5nZXRHcm91cE1lbWJlcklkcygpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IGlzR3JvdXAgPyBuZXcgUm91dGVHcm91cChwcm92aWRlciwgaWQsIHVuaXF1ZUlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJvdXRlSW5mbyhwcm92aWRlciwgaWQsIHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubVJvdXRlcy5hZGQodGFyZ2V0SW5kZXgrKywgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVzLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIENyZWF0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkR3JvdXBzLmFkZChuZXcgUGFpcjw+KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihyb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gTm90aWZ5IGNsaWVudHMgYWJvdXQgYWRkaXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBhZGRlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0FEREVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPCB0YXJnZXRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyByb3V0ZSBkZXNjcmlwdG9yIHdpdGggZHVwbGljYXRlIGlkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFJlb3JkZXIgdGhlIHJvdXRlIHdpdGhpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5nZXQoc291cmNlSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zd2FwKHByb3ZpZGVyLm1Sb3V0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlSW5kZXgsIHRhcmdldEluZGV4KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBVcGRhdGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRHcm91cHMuYWRkKG5ldyBQYWlyPD4ocm91dGUsIHJvdXRlRGVzY3JpcHRvcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gTm90aWZ5IGNsaWVudHMgYWJvdXQgY2hhbmdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkocm91dGUsIHJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbmV3IGFuZC9vciBleGlzdGluZyBncm91cHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcGFpciA6IGFkZGVkR3JvdXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3IocGFpci5zZWNvbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBhZGRlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQURERUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPiBwYWlyIDogdXBkYXRlZEdyb3VwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShyb3V0ZSwgcGFpci5zZWNvbmQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgaW52YWxpZCBwcm92aWRlciBkZXNjcmlwdG9yOiAiICsgcHJvdmlkZXJEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERpc3Bvc2UgYWxsIHJlbWFpbmluZyByb3V0ZXMgdGhhdCBkbyBub3QgaGF2ZSBtYXRjaGluZyBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcHJvdmlkZXIubVJvdXRlcy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gMS4gRGVsZXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAvLyAyLiBSZW1vdmUgdGhlIHJvdXRlIGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIHJvdXRlIGlmIG5lZWRlZC4KLSAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQoc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyBub3RpZnkgY2xpZW50cyBhYm91dCByb3V0ZXMgdGhhdCB3ZXJlIHJlbW92ZWQuCi0gICAgICAgICAgICAgICAgLy8gV2UgZG8gdGhpcyBhZnRlciB1cGRhdGluZyB0aGUgc2VsZWN0ZWQgcm91dGUgdG8gZW5zdXJlCi0gICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBvYnNlcnZlcyB0aGUgbmV3IHJvdXRlCi0gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uIGJlZm9yZSB0aGUgcmVtb3ZhbCBzaW5jZSByZW1vdmluZyB0aGUgY3VycmVudGx5Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0ZWQgcm91dGUgbWF5IGhhdmUgc2lkZS1lZmZlY3RzLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwcm92aWRlci5tUm91dGVzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSByZW1vdmVkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1JFTU9WRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RpZnkgcHJvdmlkZXIgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgY2hhbmdlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfQ0hBTkdFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgdXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KFJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZURlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9HRU5FUkFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgY2hhbmdlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9DSEFOR0VELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfVk9MVU1FKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgdm9sdW1lIGNoYW5nZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfVk9MVU1FX0NIQU5HRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXNzaWduUm91dGVVbmlxdWVJZChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyByb3V0ZURlc2NyaXB0b3JJZCkgewotICAgICAgICAgICAgLy8gQWx0aG91Z2ggcm91dGUgZGVzY3JpcHRvciBpZHMgYXJlIHVuaXF1ZSB3aXRoaW4gYSBwcm92aWRlciwgaXQncwotICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIHR3byBwcm92aWRlcnMgd2l0aCB0aGUgc2FtZSBwYWNrYWdlIG5hbWUuCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbXVzdCBkZWR1cGUgdGhlIGNvbXBvc2l0ZSBpZC4KLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBjb21wb25lbnROYW1lICsgIjoiICsgcm91dGVEZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBpZiAoZmluZFJvdXRlQnlVbmlxdWVJZCh1bmlxdWVJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVVuaXF1ZUlkTWFwLnB1dChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSwgdW5pcXVlSWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB1bmlxdWVJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy53KFRBRywgIkVpdGhlciAiICsgcm91dGVEZXNjcmlwdG9ySWQgKyAiIGlzbid0IHVuaXF1ZSBpbiAiICsgY29tcG9uZW50TmFtZQotICAgICAgICAgICAgICAgICAgICArICIgb3Igd2UncmUgdHJ5aW5nIHRvIGFzc2lnbiBhIHVuaXF1ZSBJRCBmb3IgYW4gYWxyZWFkeSBhZGRlZCByb3V0ZSIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1VuaXF1ZUlkID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICIlc18lZCIsIHVuaXF1ZUlkLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmluZFJvdXRlQnlVbmlxdWVJZChuZXdVbmlxdWVJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1VbmlxdWVJZE1hcC5wdXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCksIG5ld1VuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1VuaXF1ZUlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRSb3V0ZUJ5VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGVzLmdldChpKS5tVW5pcXVlSWQuZXF1YWxzKHVuaXF1ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVJZChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyByb3V0ZURlc2NyaXB0b3JJZCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBwcm92aWRlci5nZXRDb21wb25lbnROYW1lKCkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBtVW5pcXVlSWRNYXAuZ2V0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQoYm9vbGVhbiBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgIT0gbnVsbCAmJiAhbURlZmF1bHRSb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNsZWFyaW5nIHRoZSBkZWZhdWx0IHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtRGVmYXVsdFJvdXRlKTsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlID09IG51bGwgJiYgIW1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N5c3RlbURlZmF1bHRSb3V0ZShyb3V0ZSkgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0Um91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGRlZmF1bHQgcm91dGU6ICIgKyBtRGVmYXVsdFJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhSb3V0ZSAhPSBudWxsICYmICFtQmx1ZXRvb3RoUm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyB0aGUgYmx1ZXRvb3RoIHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtQmx1ZXRvb3RoUm91dGUpOwotICAgICAgICAgICAgICAgIG1CbHVldG9vdGhSb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aFJvdXRlID09IG51bGwgJiYgIW1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShyb3V0ZSkgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRm91bmQgYmx1ZXRvb3RoIHJvdXRlOiAiICsgbUJsdWV0b290aFJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgcm91dGUuCi0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gbnVsbCB8fCAhbVNlbGVjdGVkUm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJVbnNlbGVjdGluZyB0aGUgY3VycmVudCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbVNlbGVjdGVkUm91dGUpOwotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChjaG9vc2VGYWxsYmFja1JvdXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCkgewotICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIHNlbGVjdGVkIHJvdXRlIGlzIGEgcm91dGUgZ3JvdXAsIHNlbGVjdC91bnNlbGVjdCByb3V0ZSBjb250cm9sbGVycwotICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgYWRkZWQvcmVtb3ZlZCByb3V0ZSBtZW1iZXJzLgotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9ICgoUm91dGVHcm91cCkgbVNlbGVjdGVkUm91dGUpLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIHNldCBvZiBkZXNjcmlwdG9yIElEcyBmb3IgdGhlIG5ldyByb3V0ZSBncm91cC4KLSAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gaWRTZXQgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZFNldC5hZGQocm91dGUubURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gVW5zZWxlY3Qgcm91dGUgY29udHJvbGxlcnMgZm9yIHRoZSByZW1vdmVkIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgUm91dGVDb250cm9sbGVyPj4gaXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgUm91dGVDb250cm9sbGVyPiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZFNldC5jb250YWlucyhlbnRyeS5nZXRLZXkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCByb3V0ZSBjb250cm9sbGVycyBmb3IgdGhlIGFkZGVkIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5jb250YWluc0tleShyb3V0ZS5tRGVzY3JpcHRvcklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1EZXNjcmlwdG9ySWQsIG1TZWxlY3RlZFJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLnB1dChyb3V0ZS5tRGVzY3JpcHRvcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBsYXliYWNrIGluZm8gYmVjYXVzZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgaGF2ZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBSb3V0ZUluZm8gY2hvb3NlRmFsbGJhY2tSb3V0ZSgpIHsKLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIGN1cnJlbnQgcm91dGUgaXMgcmVtb3ZlZCBvciBubyBsb25nZXIgc2VsZWN0YWJsZSwKLSAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gcmV2ZXJ0IHRvIGEgbGl2ZSBhdWRpbyByb3V0ZSBpZiB0aGVyZSBpcwotICAgICAgICAgICAgLy8gb25lICh1c3VhbGx5IEJsdWV0b290aCBBMkRQKS4gIEZhaWxpbmcgdGhhdCwgdXNlCi0gICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgIGlmIChyb3V0ZSAhPSBtRGVmYXVsdFJvdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShyb3V0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgPT0gbVN5c3RlbVByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAgICAgICAgICAgICAgICAmJiAhcm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtRGVmYXVsdFJvdXRlKFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSA9PSBtU3lzdGVtUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUubURlc2NyaXB0b3JJZC5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLkRFRkFVTFRfUk9VVEVfSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUsIGludCB1bnNlbGVjdFJlYXNvbikgewotICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBmb2xsb3dpbmcgbG9nZ2luZyB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCi0gICAgICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsIHx8IChtQmx1ZXRvb3RoUm91dGUgIT0gbnVsbCAmJiByb3V0ZS5pc0RlZmF1bHQoKSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdGFja1RyYWNlRWxlbWVudFtdIGNhbGxTdGFjayA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIC8vIGNhbGxTdGFja1szXSBpcyB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAzOyBpIDwgY2FsbFN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IGNhbGxlciA9IGNhbGxTdGFja1tpXTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNhbGxlci5nZXRDbGFzc05hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNhbGxlci5nZXRNZXRob2ROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiOiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWxsZXIuZ2V0TGluZU51bWJlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzR2xvYmFsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsIGlzIGNhbGxlZCB3aGlsZSBzR2xvYmFsIGlzIG51bGw6IHBrZ05hbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIiwgY2FsbGVycz0iICsgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCB3aGlsZSBhIEJUIHJvdXRlIGlzIGF2YWlsYWJsZTogcGtnTmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQXBwbGljYXRpb25Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLCBjYWxsZXJzPSIgKyBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSByb3V0ZSkgewotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgdW5zZWxlY3RlZDogIiArIG1TZWxlY3RlZFJvdXRlICsgIiByZWFzb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfVU5TRUxFQ1RFRCwgbVNlbGVjdGVkUm91dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblVuc2VsZWN0KHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtUm91dGVDb250cm9sbGVyTWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA6IG1Sb3V0ZUNvbnRyb2xsZXJNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uVW5zZWxlY3QodW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciA9IHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHNlbGVjdGVkOiAiICsgbVNlbGVjdGVkUm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9TRUxFQ1RFRCwgbVNlbGVjdGVkUm91dGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlIGluc3RhbmNlb2YgUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFJvdXRlSW5mbz4gcm91dGVzID0gKChSb3V0ZUdyb3VwKSBtU2VsZWN0ZWRSb3V0ZSkuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gciA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmdldFByb3ZpZGVySW5zdGFuY2UoKS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm1EZXNjcmlwdG9ySWQsIG1TZWxlY3RlZFJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5wdXQoci5tRGVzY3JpcHRvcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0gcm91dGUgaXMgc2VsZWN0ZWQsIGRvIG5vdCBzeW5jIHRoZSByb3V0ZSB3ZSBzZWxlY3RlZCBiZWZvcmUuCi0gICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfU0VMRUNURUQpOwotICAgICAgICAgICAgaW50IHByb3ZpZGVySW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKG1TeXN0ZW1Qcm92aWRlcik7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXJJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQocHJvdmlkZXJJbmRleCk7Ci0gICAgICAgICAgICAgICAgaW50IHJvdXRlSW5kZXggPSBwcm92aWRlci5maW5kUm91dGVCeURlc2NyaXB0b3JJZChpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5tUm91dGVzLmdldChyb3V0ZUluZGV4KS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBuZXcgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVDb250cm9sQ2xpZW50cy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICByZWNvcmQuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE9iamVjdCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBzZXRNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbiAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uKSA6IG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uQ29tcGF0KGZpbmFsIE1lZGlhU2Vzc2lvbkNvbXBhdCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtQ29tcGF0U2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgICAgICBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjEpIHsKLSAgICAgICAgICAgICAgICBzZXRNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbiAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uKSA6IG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNCkgewotICAgICAgICAgICAgICAgIGlmIChtUmNjTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SY2NNZWRpYVNlc3Npb24ucmVtb3ZlT25BY3RpdmVDaGFuZ2VMaXN0ZW5lcihtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVJjY01lZGlhU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmFkZE9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIobVNlc3Npb25BY3RpdmVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQoc2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldE1lZGlhU2Vzc2lvblJlY29yZChNZWRpYVNlc3Npb25SZWNvcmQgbWVkaWFTZXNzaW9uUmVjb3JkKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uID0gbWVkaWFTZXNzaW9uUmVjb3JkOwotICAgICAgICAgICAgaWYgKG1lZGlhU2Vzc2lvblJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1NZWRpYVNlc3Npb24uZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbXBhdFNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ29tcGF0U2Vzc2lvbi5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSA9PSByY2MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZSA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZSgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lTWF4ID0gbVNlbGVjdGVkUm91dGUuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWVIYW5kbGluZyA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby5wbGF5YmFja1N0cmVhbSA9IG1TZWxlY3RlZFJvdXRlLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby5wbGF5YmFja1R5cGUgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRQbGF5YmFja1R5cGUoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnVwZGF0ZVBsYXliYWNrSW5mbygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSA9PSBnZXREZWZhdWx0Um91dGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TZWxlY3RlZFJvdXRlID09IGdldEJsdWV0b290aFJvdXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsIHJvdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNsZWFyVm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlckNvbXBhdC5WT0xVTUVfQ09OVFJPTF9GSVhFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tJbmZvLnZvbHVtZUhhbmRsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sVHlwZSA9IFZvbHVtZVByb3ZpZGVyQ29tcGF0LlZPTFVNRV9DT05UUk9MX0FCU09MVVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jb25maWd1cmVWb2x1bWUoY29udHJvbFR5cGUsIG1QbGF5YmFja0luZm8udm9sdW1lTWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyLkNhbGxiYWNrIHsKLSAgICAgICAgICAgIFByb3ZpZGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyRGVzY3JpcHRvcihwcm92aWRlciwgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblJlY29yZCB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbkNvbXBhdCBtTXNDb21wYXQ7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgQFZvbHVtZVByb3ZpZGVyQ29tcGF0LkNvbnRyb2xUeXBlIGludCBtQ29udHJvbFR5cGU7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBtTWF4Vm9sdW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBWb2x1bWVQcm92aWRlckNvbXBhdCBtVnBDb21wYXQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25SZWNvcmQoT2JqZWN0IG1lZGlhU2Vzc2lvbikgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdCA9IE1lZGlhU2Vzc2lvbkNvbXBhdC5mcm9tTWVkaWFTZXNzaW9uKG1BcHBsaWNhdGlvbkNvbnRleHQsIG1lZGlhU2Vzc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25SZWNvcmQoTWVkaWFTZXNzaW9uQ29tcGF0IG1lZGlhU2Vzc2lvbkNvbXBhdCkgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdCA9IG1lZGlhU2Vzc2lvbkNvbXBhdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlVm9sdW1lKEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBtYXgsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1WcENvbXBhdCAhPSBudWxsICYmIGNvbnRyb2xUeXBlID09IG1Db250cm9sVHlwZSAmJiBtYXggPT0gbU1heFZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGNoYW5nZWQgY29udHJvbCB0eXBlIG9yIG1heCBqdXN0IHNldCB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGN1cnJlbnQgdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIG1WcENvbXBhdC5zZXRDdXJyZW50Vm9sdW1lKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgcHJvdmlkZXIgYW5kIHVwZGF0ZQotICAgICAgICAgICAgICAgICAgICBtVnBDb21wYXQgPSBuZXcgVm9sdW1lUHJvdmlkZXJDb21wYXQoY29udHJvbFR5cGUsIG1heCwgY3VycmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZVRvKGZpbmFsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFkanVzdFZvbHVtZShmaW5hbCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgIG1Nc0NvbXBhdC5zZXRQbGF5YmFja1RvUmVtb3RlKG1WcENvbXBhdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGVhclZvbHVtZUhhbmRsaW5nKCkgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdC5zZXRQbGF5YmFja1RvTG9jYWwobVBsYXliYWNrSW5mby5wbGF5YmFja1N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgbVZwQ29tcGF0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRUb2tlbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1zQ29tcGF0LmdldFNlc3Npb25Ub2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50cyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBtUmNjQ29tcGF0OwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1EaXNjb25uZWN0ZWQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0ID0gUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5vYnRhaW4obUFwcGxpY2F0aW9uQ29udGV4dCwgcmNjKTsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFZvbHVtZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mbygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1SY2NDb21wYXQuZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1SY2NDb21wYXQuc2V0Vm9sdW1lQ2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXliYWNrSW5mbygpIHsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFBsYXliYWNrSW5mbyhtUGxheWJhY2tJbmZvKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCAmJiBtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQgJiYgbVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDYWxsYmFja0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPiBtVGVtcENhbGxiYWNrUmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+KCk7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9NQVNLID0gMHhmZjAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX1JPVVRFID0gMHgwMTAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX1BST1ZJREVSID0gMHgwMjAwOwotCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfQURERUQgPSBNU0dfVFlQRV9ST1VURSB8IDE7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfUkVNT1ZFRCA9IE1TR19UWVBFX1JPVVRFIHwgMjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCAzOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCA0OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQgPSBNU0dfVFlQRV9ST1VURSB8IDU7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfU0VMRUNURUQgPSBNU0dfVFlQRV9ST1VURSB8IDY7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfVU5TRUxFQ1RFRCA9IE1TR19UWVBFX1JPVVRFIHwgNzsKLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX0FEREVEID0gTVNHX1RZUEVfUFJPVklERVIgfCAxOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX1JFTU9WRUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPVklERVJfQ0hBTkdFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMzsKLQotICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KGludCBtc2csIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKG1zZywgb2JqKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgbXNnLCBPYmplY3Qgb2JqLCBpbnQgYXJnKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gb2J0YWluTWVzc2FnZShtc2csIG9iaik7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5hcmcxID0gYXJnOwotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGFyZyA9IG1zZy5hcmcxOwotCi0gICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTVNHX1JPVVRFX0NIQU5HRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldFNlbGVjdGVkUm91dGUoKS5nZXRJZCgpLmVxdWFscygoKFJvdXRlSW5mbykgb2JqKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU3luY2hyb25pemUgc3RhdGUgd2l0aCB0aGUgc3lzdGVtIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgICAgICBzeW5jV2l0aFN5c3RlbVByb3ZpZGVyKHdoYXQsIG9iaik7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbnZva2UgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLgotICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBjYWxsYmFja3MgYmVmb3JlIGludm9raW5nIHRoZW0gaW4gY2FzZSBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBkdXJpbmcgZGlzcGF0Y2guCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVtcENhbGxiYWNrUmVjb3Jkcy5hZGRBbGwocm91dGVyLm1DYWxsYmFja1JlY29yZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNhbGxiYWNrQ291bnQgPSBtVGVtcENhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VDYWxsYmFjayhtVGVtcENhbGxiYWNrUmVjb3Jkcy5nZXQoaSksIHdoYXQsIG9iaiwgYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZW1wQ2FsbGJhY2tSZWNvcmRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgc3luY1dpdGhTeXN0ZW1Qcm92aWRlcihpbnQgd2hhdCwgT2JqZWN0IG9iaikgewotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZUFkZGVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZVJlbW92ZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlQ2hhbmdlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1NFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlU2VsZWN0ZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGludm9rZUNhbGxiYWNrKENhbGxiYWNrUmVjb3JkIHJlY29yZCwgaW50IHdoYXQsIE9iamVjdCBvYmosIGludCBhcmcpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlciByb3V0ZXIgPSByZWNvcmQubVJvdXRlcjsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFjayA9IHJlY29yZC5tQ2FsbGJhY2s7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0ICYgTVNHX1RZUEVfTUFTSykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19UWVBFX1JPVVRFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSb3V0ZUluZm8gcm91dGUgPSAoUm91dGVJbmZvKW9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3JkLmZpbHRlclJvdXRlRXZlbnQocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZUFkZGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9SRU1PVkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlUmVtb3ZlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVNlbGVjdGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9VTlNFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlVW5zZWxlY3RlZChyb3V0ZXIsIHJvdXRlLCBhcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RZUEVfUFJPVklERVI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IChQcm92aWRlckluZm8pb2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJBZGRlZChyb3V0ZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Qcm92aWRlclJlbW92ZWQocm91dGVyLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJDaGFuZ2VkKHJvdXRlciwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNjU5Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlRpbWVVdGlsczsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHBsYXliYWNrIHN0YXR1cyBvZiBhIG1lZGlhIHNlc3Npb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBtZWRpYSBzZXNzaW9uIGlzIGNyZWF0ZWQsIGl0IGlzIGluaXRpYWxseSBpbiB0aGUKLSAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9BQ1RJVkUgYWN0aXZlfSBzdGF0ZS4gIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gZW5kcwotICogbm9ybWFsbHksIGl0IHRyYW5zaXRpb25zIHRvIHRoZSB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUQgZW5kZWR9IHN0YXRlLgotICogSWYgdGhlIG1lZGlhIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQgZHVlIHRvIGFub3RoZXIgc2Vzc2lvbiBmb3JjaWJseSB0YWtpbmcKLSAqIGNvbnRyb2wgb2YgdGhlIHJvdXRlLCB0aGVuIGl0IHRyYW5zaXRpb25zIHRvIHRoZQotICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSBzdGF0ZS4KLSAqIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgotICogPC9wPjxwPgotICogVG8gbW9uaXRvciBzZXNzaW9uIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzZXNzaW9uIHN0YXJ0IHJlcXVlc3R9LgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblN0YXR1cyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9TVEFURSA9ICJzZXNzaW9uU3RhdGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1FVRVVFX1BBVVNFRCA9ICJxdWV1ZVBhdXNlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0KLSAgICBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEFjdGl2ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiBpcyBhY3RpdmUgYW5kIGluIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0FDVElWRSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBFbmRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgZW5kZWQgbm9ybWFsbHkgdXNpbmcgdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259IGFjdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSB0ZXJtaW5hdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0VOREVEID0gMTsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEludmFsaWRhdGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzZXNzaW9uIHdhcyBpbnZhbGlkYXRlZCBpbnZvbHVudGFyaWx5IGR1ZSB0bwotICAgICAqIGFub3RoZXIgc2Vzc2lvbiB0YWtpbmcgY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEID0gMjsKLQotICAgIE1lZGlhU2Vzc2lvblN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2Vzc2lvbiBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFfSwKLSAgICAgKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUR9LCBvciB7QGxpbmsgI1NFU1NJT05fU1RBVEVfSU5WQUxJREFURUR9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblN0YXRlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1NFU1NJT05fU1RBVEUsIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1F1ZXVlUGF1c2VkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFTZXNzaW9uU3RhdHVzeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgidGltZXN0YW1wPSIpOwotICAgICAgICBUaW1lVXRpbHMuZm9ybWF0RHVyYXRpb24oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBnZXRUaW1lc3RhbXAoKSwgcmVzdWx0KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIG1zIGFnbyIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNlc3Npb25TdGF0ZT0iKS5hcHBlbmQoc2Vzc2lvblN0YXRlVG9TdHJpbmcoZ2V0U2Vzc2lvblN0YXRlKCkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBxdWV1ZVBhdXNlZD0iKS5hcHBlbmQoaXNRdWV1ZVBhdXNlZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXNzaW9uU3RhdGVUb1N0cmluZyhpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfQUNUSVZFOgotICAgICAgICAgICAgICAgIHJldHVybiAiYWN0aXZlIjsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9FTkRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVuZGVkIjsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhzZXNzaW9uU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhU2Vzc2lvblN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhidW5kbGUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzIG1lZGlhIHNlc3Npb24gc3RhdHVzIG9iamVjdHN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCi0gICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdGUgVGhlIHNlc3Npb24gc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgc2V0VGltZXN0YW1wKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKLSAgICAgICAgICAgIHNldFNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhU2Vzc2lvblN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2Vzc2lvblN0YXRlKGludCBzZXNzaW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBzZXNzaW9uU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRRdWV1ZVBhdXNlZChib29sZWFuIHF1ZXVlUGF1c2VkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX1FVRVVFX1BBVVNFRCwgcXVldWVQYXVzZWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3R9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvblN0YXR1cyBidWlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU3RhdHVzKG1CdW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTRlMjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fMTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1haW50YWlucyBhIGNvbm5lY3Rpb24gdG8gYSBwYXJ0aWN1bGFyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCi0gKi8KLWZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgICAgaW1wbGVtZW50cyBTZXJ2aWNlQ29ubmVjdGlvbiB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkiOyAgLy8gbWF4LiAyMyBjaGFycwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOwotICAgIGZpbmFsIFByaXZhdGVIYW5kbGVyIG1Qcml2YXRlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDb250cm9sbGVyPiBtQ29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2xsZXI+KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Cb3VuZDsKLSAgICBwcml2YXRlIENvbm5lY3Rpb24gbUFjdGl2ZUNvbm5lY3Rpb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0aW9uUmVhZHk7Ci0KLSAgICBwdWJsaWMgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShjb21wb25lbnROYW1lKSk7Ci0KLSAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVJZCwgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChtQ29ubmVjdGlvblJlYWR5KSB7Ci0gICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBDb25uZWN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQm91bmQpIHsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLQotICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IChzZXJ2aWNlICE9IG51bGwgPyBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAoaXNWYWxpZFJlbW90ZU1lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24obWVzc2VuZ2VyKTsKLSAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5yZWdpc3RlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCB0aGlzICsgIjogU2VydmljZSByZXR1cm5lZCBpbnZhbGlkIG1lc3NlbmdlciBiaW5kZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlNlcnZpY2UgY29ubmVjdGlvbiAiICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21wb25lbnROYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFN0YXJ0aW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU3RvcHBpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlYmluZElmRGlzY29ubmVjdGVkKCkgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gbnVsbCAmJiBzaG91bGRCaW5kKCkpIHsKLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICAgICAgYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJpbmRpbmcoKSB7Ci0gICAgICAgIGlmIChzaG91bGRCaW5kKCkpIHsKLSAgICAgICAgICAgIGJpbmQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEJpbmQoKSB7Ci0gICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgLy8gQmluZCB3aGVuZXZlciB0aGVyZSBpcyBhIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKGdldERpc2NvdmVyeVJlcXVlc3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgd2hlbmV2ZXIgdGhlIGFwcGxpY2F0aW9uIGhhcyBhbiBhY3RpdmUgcm91dGUgY29udHJvbGxlci4KLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBvbmUgb2YgdGhpcyBwcm92aWRlcidzIHJvdXRlcyBpcyBzZWxlY3RlZC4KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xsZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmluZCgpIHsKLSAgICAgICAgaWYgKCFtQm91bmQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSW50ZW50IHNlcnZpY2UgPSBuZXcgSW50ZW50KE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgICAgIHNlcnZpY2Uuc2V0Q29tcG9uZW50KG1Db21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJvdW5kID0gZ2V0Q29udGV4dCgpLmJpbmRTZXJ2aWNlKHNlcnZpY2UsIHRoaXMsIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQm91bmQgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kIGZhaWxlZCIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW5iaW5kKCkgewotICAgICAgICBpZiAobUJvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBVbmJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBnZXRDb250ZXh0KCkudW5iaW5kU2VydmljZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcyA9IGRlc2NyaXB0b3IuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSByb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRJZCgpLmVxdWFscyhyb3V0ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMuYWRkKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25SZWFkeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvblJlYWR5KENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IHRydWU7Ci0gICAgICAgICAgICBhdHRhY2hDb250cm9sbGVyc1RvQ29ubmVjdGlvbigpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gZ2V0RGlzY292ZXJ5UmVxdWVzdCgpOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLnNldERpc2NvdmVyeVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkRpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGNvbm5lY3Rpb24gZGllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBlcnJvcikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBjb25uZWN0aW9uIGVycm9yIC0gIiArIGVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sCi0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IERlc2NyaXB0b3IgY2hhbmdlZCwgZGVzY3JpcHRvcj0iICsgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKG51bGwpOwotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IGZhbHNlOwotICAgICAgICAgICAgZGV0YWNoQ29udHJvbGxlcnNGcm9tQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uZGlzcG9zZSgpOwotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbnRyb2xsZXJSZWxlYXNlZChDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVyKTsKLSAgICAgICAgY29udHJvbGxlci5kZXRhY2hDb25uZWN0aW9uKCk7Ci0gICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoQ29udHJvbGxlcnNUb0Nvbm5lY3Rpb24oKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmdldChpKS5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRhY2hDb250cm9sbGVyc0Zyb21Db25uZWN0aW9uKCkgewotICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5nZXQoaSkuZGV0YWNoQ29ubmVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJvdXRlSWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb3V0ZUdyb3VwSWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3RlZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YTsKLQotICAgICAgICBwcml2YXRlIENvbm5lY3Rpb24gbUNvbm5lY3Rpb247Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db250cm9sbGVySWQ7Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgICAgIG1Sb3V0ZUlkID0gcm91dGVJZDsKLSAgICAgICAgICAgIG1Sb3V0ZUdyb3VwSWQgPSByb3V0ZUdyb3VwSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhdHRhY2hDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IGNvbm5lY3Rpb24uY3JlYXRlUm91dGVDb250cm9sbGVyKG1Sb3V0ZUlkLCBtUm91dGVHcm91cElkKTsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNlbGVjdFJvdXRlKG1Db250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1NldFZvbHVtZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIG1QZW5kaW5nU2V0Vm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnVwZGF0ZVZvbHVtZShtQ29udHJvbGxlcklkLCBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGV0YWNoQ29ubmVjdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24ucmVsZWFzZVJvdXRlQ29udHJvbGxlcihtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICAgICAgb25Db250cm9sbGVyUmVsZWFzZWQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KCkgewotICAgICAgICAgICAgb25VbnNlbGVjdChNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdChpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24udW5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkLCByZWFzb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIHZvbHVtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nU2V0Vm9sdW1lID0gdm9sdW1lOwotICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi51cGRhdGVWb2x1bWUobUNvbnRyb2xsZXJJZCwgZGVsdGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhICs9IGRlbHRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3QoSW50ZW50IGludGVudCwgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb24uc2VuZENvbnRyb2xSZXF1ZXN0KG1Db250cm9sbGVySWQsIGludGVudCwgY2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtU2VydmljZU1lc3NlbmdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1SZWNlaXZlTWVzc2VuZ2VyOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1OZXh0UmVxdWVzdElkID0gMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRDb250cm9sbGVySWQgPSAxOwotICAgICAgICBwcml2YXRlIGludCBtU2VydmljZVZlcnNpb247IC8vIG5vbi16ZXJvIHdoZW4gcmVnaXN0cmF0aW9uIGNvbXBsZXRlCi0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxDb250cm9sUmVxdWVzdENhbGxiYWNrPiBtUGVuZGluZ0NhbGxiYWNrcyA9Ci0gICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s+KCk7Ci0KLSAgICAgICAgcHVibGljIENvbm5lY3Rpb24oTWVzc2VuZ2VyIHNlcnZpY2VNZXNzZW5nZXIpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyID0gc2VydmljZU1lc3NlbmdlcjsKLSAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKLSAgICAgICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gbU5leHRSZXF1ZXN0SWQrKzsKLSAgICAgICAgICAgIGlmICghc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUdJU1RFUiwKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVCwgbnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlJFR0lTVEVSLCAwLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5nZXRCaW5kZXIoKS51bmxpbmtUb0RlYXRoKHRoaXMsIDApOwotCi0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsUGVuZGluZ0NhbGxiYWNrcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBmYWlsUGVuZGluZ0NhbGxiYWNrcygpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QZW5kaW5nQ2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MudmFsdWVBdChpKS5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uR2VuZXJpY0ZhaWx1cmUoaW50IHJlcXVlc3RJZCkgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA9PSBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IDA7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRXJyb3IodGhpcywgIlJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBtUGVuZGluZ0NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucmVtb3ZlKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25HZW5lcmljU3VjY2VzcyhpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uUmVnaXN0ZXJlZChpbnQgcmVxdWVzdElkLCBpbnQgc2VydmljZVZlcnNpb24sCi0gICAgICAgICAgICAgICAgQnVuZGxlIGRlc2NyaXB0b3JCdW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChtU2VydmljZVZlcnNpb24gPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiByZXF1ZXN0SWQgPT0gbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZAotICAgICAgICAgICAgICAgICAgICAmJiBzZXJ2aWNlVmVyc2lvbiA+PSBTRVJWSUNFX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSAwOwotICAgICAgICAgICAgICAgIG1TZXJ2aWNlVmVyc2lvbiA9IHNlcnZpY2VWZXJzaW9uOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmZyb21CdW5kbGUoZGVzY3JpcHRvckJ1bmRsZSkpOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvblJlYWR5KHRoaXMpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25EZXNjcmlwdG9yQ2hhbmdlZChCdW5kbGUgZGVzY3JpcHRvckJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlVmVyc2lvbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuZnJvbUJ1bmRsZShkZXNjcmlwdG9yQnVuZGxlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKGludCByZXF1ZXN0SWQsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KGRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdEZhaWxlZChpbnQgcmVxdWVzdElkLCBTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EaWVkKENvbm5lY3Rpb24udGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCA9IG1OZXh0Q29udHJvbGxlcklkKys7Ci0gICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0lELCByb3V0ZUlkKTsKLSAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFTEVDVF9ST1VURSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0Um91dGUoaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGV4dHJhcy5wdXRJbnQoQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OLCByZWFzb24pOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZGF0YS5wdXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCB2b2x1bWUpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlVm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgewotICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBkYXRhLnB1dEludChDTElFTlRfREFUQV9WT0xVTUUsIGRlbHRhKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNlbmRDb250cm9sUmVxdWVzdChpbnQgY29udHJvbGxlcklkLCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGludCByZXF1ZXN0SWQgPSBtTmV4dFJlcXVlc3RJZCsrOwotICAgICAgICAgICAgaWYgKHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGNvbnRyb2xsZXJJZCwgaW50ZW50LCBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnB1dChyZXF1ZXN0SWQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCAwLCByZXF1ZXN0ICE9IG51bGwgPyByZXF1ZXN0LmFzQnVuZGxlKCkgOiBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kUmVxdWVzdChpbnQgd2hhdCwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgICAgIG1zZy53aGF0ID0gd2hhdDsKLSAgICAgICAgICAgIG1zZy5hcmcxID0gcmVxdWVzdElkOwotICAgICAgICAgICAgbXNnLmFyZzIgPSBhcmc7Ci0gICAgICAgICAgICBtc2cub2JqID0gb2JqOwotICAgICAgICAgICAgbXNnLnNldERhdGEoZGF0YSk7Ci0gICAgICAgICAgICBtc2cucmVwbHlUbyA9IG1SZWNlaXZlTWVzc2VuZ2VyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5zZW5kKG1zZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZpY2UgZGllZC4KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmICh3aGF0ICE9IENMSUVOVF9NU0dfVU5SRUdJU1RFUikgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvIHNlcnZpY2UuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByaXZhdGVIYW5kbGVyKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIGNvbm5lY3Rpb24KLSAgICAgKiB0byBwcmV2ZW50IHRoZSBjbGllbnQgZnJvbSBiZWluZyBsZWFrZWQgaW4gY2FzZSB0aGUgc2VydmljZSBpcyBob2xkaW5nIGFuCi0gICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgY2xpZW50J3MgbWVzc2VuZ2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQotICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBzZXJ2aWNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWNlaXZlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Q29ubmVjdGlvbj4gbUNvbm5lY3Rpb25SZWY7Ci0KLSAgICAgICAgcHVibGljIFJlY2VpdmVIYW5kbGVyKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxDb25uZWN0aW9uPihjb25uZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGlvblJlZi5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG1Db25uZWN0aW9uUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2UoY29ubmVjdGlvbiwgd2hhdCwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVbmhhbmRsZWQgbWVzc2FnZSBmcm9tIHNlcnZlcjogIiArIG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU6Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ub25HZW5lcmljRmFpbHVyZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm9uR2VuZXJpY1N1Y2Nlc3MocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uUmVnaXN0ZXJlZChyZXF1ZXN0SWQsIGFyZywgKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uRGVzY3JpcHRvckNoYW5nZWQoKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gKGRhdGEgPT0gbnVsbCA/IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uQ29udHJvbFJlcXVlc3RGYWlsZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgZXJyb3IsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWY2NDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBXYXRjaGVzIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB0byBiZSBpbnN0YWxsZWQuCi0gKiBBZGRzIGEgcHJvdmlkZXIgdG8gdGhlIG1lZGlhIHJvdXRlciBmb3IgZWFjaCByZWdpc3RlcmVkIHNlcnZpY2UuCi0gKgotICogQHNlZSBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcj4gbVByb3ZpZGVycyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXI+KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1SdW5uaW5nOwotCi0gICAgcHVibGljIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyKENvbnRleHQgY29udGV4dCwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmICghbVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKLQotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFTU9WRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQ0hBTkdFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVBMQUNFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVNUQVJURUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZERhdGFTY2hlbWUoInBhY2thZ2UiKTsKLSAgICAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVNjYW5QYWNrYWdlc1JlY2VpdmVyLCBmaWx0ZXIsIG51bGwsIG1IYW5kbGVyKTsKLQotICAgICAgICAgICAgLy8gU2NhbiBwYWNrYWdlcy4KLSAgICAgICAgICAgIC8vIEFsc28gaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiByZXN0YXJ0aW5nIHByb3ZpZGVycyBpZiBuZWVkZWQuCi0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KG1TY2FuUGFja2FnZXNSdW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBpZiAobVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtU2NhblBhY2thZ2VzUmVjZWl2ZXIpOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1TY2FuUGFja2FnZXNSdW5uYWJsZSk7Ci0KLSAgICAgICAgICAgIC8vIFN0b3AgYWxsIHByb3ZpZGVycy4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUHJvdmlkZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5nZXQoaSkuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzY2FuUGFja2FnZXMoKSB7Ci0gICAgICAgIGlmICghbVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBwcm92aWRlcnMgZm9yIGFsbCBuZXcgc2VydmljZXMuCi0gICAgICAgIC8vIFJlb3JkZXIgdGhlIGxpc3Qgc28gdGhhdCBwcm92aWRlcnMgbGVmdCBhdCB0aGUgZW5kIHdpbGwgYmUgdGhlIG9uZXMgdG8gcmVtb3ZlLgotICAgICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgZm9yIChSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA6IG1QYWNrYWdlTWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKGludGVudCwgMCkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gcmVzb2x2ZUluZm8uc2VydmljZUluZm87Ci0gICAgICAgICAgICBpZiAoc2VydmljZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBzb3VyY2VJbmRleCA9IGZpbmRQcm92aWRlcihzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZShzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmFkZCh0YXJnZXRJbmRleCsrLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5hZGRQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VJbmRleCA+PSB0YXJnZXRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoc291cmNlSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5zdGFydCgpOyAvLyByZXN0YXJ0IHRoZSBwcm92aWRlciBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIucmViaW5kSWZEaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcChtUHJvdmlkZXJzLCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHByb3ZpZGVycyBmb3IgbWlzc2luZyBzZXJ2aWNlcy4KLSAgICAgICAgaWYgKHRhcmdldEluZGV4IDwgbVByb3ZpZGVycy5zaXplKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUHJvdmlkZXJzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sucmVtb3ZlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMucmVtb3ZlKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBwcm92aWRlci5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBmaW5kUHJvdmlkZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlci5oYXNDb21wb25lbnROYW1lKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVNjYW5QYWNrYWdlc1JlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgc2NhblBhY2thZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU2NhblBhY2thZ2VzUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBzY2FuUGFja2FnZXMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKLSAgICAgICAgdm9pZCBhZGRQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpOwotICAgICAgICB2b2lkIHJlbW92ZVByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjQ0OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBQcm92aWRlcyBhY2Nlc3MgdG8gZmVhdHVyZXMgb2YgdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAqCi0gKiBIaWRkZW4gZm9yIG5vdyBidXQgd2UgbWlnaHQgd2FudCB0byBtYWtlIHRoaXMgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucwotICogaW4gdGhlIGZ1dHVyZS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUmNjOwotICAgIHByb3RlY3RlZCBWb2x1bWVDYWxsYmFjayBtVm9sdW1lQ2FsbGJhY2s7Ci0KLSAgICBwcm90ZWN0ZWQgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUmNjID0gcmNjOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCByY2MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0LCByY2MpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1SY2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBwbGF5YmFjayBpbmZvcm1hdGlvbi4KLSAgICAgKiBNdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHRvIGF0dGFjaCB0byB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZm8gVGhlIHBsYXliYWNrIGluZm9ybWF0aW9uLiAgTXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB2b2x1bWUgY2hhbmdlIHJlcXVlc3RzIGZyb20gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgdm9sdW1lIGNhbGxiYWNrIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lQ2FsbGJhY2soVm9sdW1lQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbVZvbHVtZUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF5YmFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lOwotICAgICAgICBwdWJsaWMgaW50IHZvbHVtZU1heDsKLSAgICAgICAgcHVibGljIGludCB2b2x1bWVIYW5kbGluZyA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQ7Ci0gICAgICAgIHB1YmxpYyBpbnQgcGxheWJhY2tTdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrVHlwZSA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2b2x1bWUgdXBkYXRlcyBhcmUgcmVxdWVzdGVkIGJ5IHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBWb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIHNob3VsZCBiZSBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIEFuIGludGVnZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2b2x1bWUgaXMgdG8gYmUgaW5jcmVhc2VkCi0gICAgICAgICAqIChwb3NpdGl2ZSB2YWx1ZSkgb3IgZGVjcmVhc2VkIChuZWdhdGl2ZSB2YWx1ZSkuCi0gICAgICAgICAqIEZvciBidW5kbGVkIGNoYW5nZXMsIHRoZSBhYnNvbHV0ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjaGFuZ2VzCi0gICAgICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiwgZS5nLiArMyBjb3JyZXNwb25kcyB0byB0aHJlZSAidm9sdW1lIHVwIiBjaGFuZ2VzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIGZvciB0aGUgcm91dGUgc2hvdWxkIGJlIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgQW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBuZXcgdm9sdW1lIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQsCi0gICAgICAgICAqIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIHRoZSB2YWx1ZSBzZXQgYnkge0BsaW5rIFBsYXliYWNrSW5mbyN2b2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgotICAgICAqIERvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgTGVnYWN5SW1wbCBleHRlbmRzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgewotICAgICAgICBwdWJsaWMgTGVnYWN5SW1wbChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHJjYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3IgSmVsbHliZWFuLgotICAgICAqCi0gICAgICogVGhlIGJhc2ljIGlkZWEgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byBhdHRhY2ggdGhlIFJDQyB0byBhIFVzZXJSb3V0ZUluZm8KLSAgICAgKiBpbiBvcmRlciB0byBob29rIHVwIHN0cmVhbSBtZXRhZGF0YSBhbmQgdm9sdW1lIGNhbGxiYWNrcyBiZWNhdXNlIHRoZXJlIGlzIG5vCi0gICAgICogb3RoZXIgQVBJIGF2YWlsYWJsZSB0byBkbyBzbyBpbiB0aGlzIHBsYXRmb3JtIHZlcnNpb24uICBUaGUgVXNlclJvdXRlSW5mbyBpdHNlbGYKLSAgICAgKiBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIE1lZGlhUm91dGVyIHNvIGl0IGlzIHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTYpCi0gICAgc3RhdGljIGNsYXNzIEplbGx5YmVhbkltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOwotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtVXNlclJvdXRlT2JqOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlZ2lzdGVyZWQ7Ci0KLSAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOwotCi0gICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCAiIiwgZmFsc2UpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnZvbHVtZSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVNYXgpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrU3RyZWFtKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrVHlwZSk7Ci0KLSAgICAgICAgICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhtVXNlclJvdXRlT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWb2x1bWVDYWxsYmFja1dyYXBwZXIodGhpcykpKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFJlbW90ZUNvbnRyb2xDbGllbnQobVVzZXJSb3V0ZU9iaiwgbVJjYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWb2x1bWVDYWxsYmFja1dyYXBwZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZSBmcmFtZXdvcmsgbmV2ZXIgdW5yZWdpc3RlcnMgaXRzIHZvbHVtZSBvYnNlcnZlciBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgYXVkaW8gc2VydmljZSBzbyB0aGUgVXNlclJvdXRlSW5mbyBvYmplY3QgbWF5IGxlYWsgYWxvbmcgd2l0aAotICAgICAgICAgICAgLy8gYW55IGNhbGxiYWNrcyB0aGF0IHdlIGF0dGFjaCB0byBpdC4gIFVzZSBhIHdlYWsgcmVmZXJlbmNlIHRvIHByZXZlbnQKLSAgICAgICAgICAgIC8vIHRoZSB2b2x1bWUgY2FsbGJhY2sgZnJvbSBob2xkaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIGFueXRoaW5nIGltcG9ydGFudC4KLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxKZWxseWJlYW5JbXBsPiBtSW1wbFdlYWs7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1dyYXBwZXIoSmVsbHliZWFuSW1wbCBpbXBsKSB7Ci0gICAgICAgICAgICAgICAgbUltcGxXZWFrID0gbmV3IFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4oaW1wbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgIEplbGx5YmVhbkltcGwgaW1wbCA9IG1JbXBsV2Vhay5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1wbCAhPSBudWxsICYmIGltcGwubVZvbHVtZUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5tVm9sdW1lQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lU2V0UmVxdWVzdCh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTE0OTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgcGxheWluZyBtZWRpYSBvbiByZW1vdGUgcm91dGVzIHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wKLSAqIGRlZmluZWQgYnkge0BsaW5rIE1lZGlhQ29udHJvbEludGVudH0uCi0gKiA8cD4KLSAqIFRoZSBjbGllbnQgbWFpbnRhaW5zIHNlc3Npb24gc3RhdGUgYW5kIG9mZmVycyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIGZvciBpc3N1aW5nCi0gKiByZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRvIGEgc2luZ2xlIHJvdXRlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlUGxheWJhY2tDbGllbnQgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbW90ZVBsYXliYWNrQ2xpZW50IjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpb25SZWNlaXZlciBtQWN0aW9uUmVjZWl2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudDsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25TdGF0dXNQZW5kaW5nSW50ZW50OwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjazsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c01lc3NhZ2luZzsKLQotICAgIFN0cmluZyBtU2Vzc2lvbklkOwotICAgIFN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjazsKLSAgICBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlbW90ZSBwbGF5YmFjayBjbGllbnQgZm9yIGEgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIG1lZGlhIHJvdXRlLgotICAgICAqLwotICAgIHB1YmxpYyBSZW1vdGVQbGF5YmFja0NsaWVudChDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUm91dGUgPSByb3V0ZTsKLQotICAgICAgICBJbnRlbnRGaWx0ZXIgYWN0aW9uRmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpOwotICAgICAgICBtQWN0aW9uUmVjZWl2ZXIgPSBuZXcgQWN0aW9uUmVjZWl2ZXIoKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpb25SZWNlaXZlciwgYWN0aW9uRmlsdGVyKTsKLQotICAgICAgICBJbnRlbnQgaXRlbVN0YXR1c0ludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBpdGVtU3RhdHVzSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbUl0ZW1TdGF0dXNQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgY29udGV4dCwgMCwgaXRlbVN0YXR1c0ludGVudCwgMCk7Ci0KLSAgICAgICAgSW50ZW50IHNlc3Npb25TdGF0dXNJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgc2Vzc2lvblN0YXR1c0ludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAotICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIHNlc3Npb25TdGF0dXNJbnRlbnQsIDApOwotCi0gICAgICAgIEludGVudCBtZXNzYWdlSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCk7Ci0gICAgICAgIG1lc3NhZ2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtTWVzc2FnZVBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKLSAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBtZXNzYWdlSW50ZW50LCAwKTsKLSAgICAgICAgZGV0ZWN0RmVhdHVyZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlcyByZXNvdXJjZXMgb3duZWQgYnkgdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUFjdGlvblJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2ssIHRoZW4gbm9uZSBvZiB0aGUgZnVuY3Rpb25hbGl0eQotICAgICAqIG9mZmVyZWQgYnkgdGhlIGNsaWVudCB3aWxsIGJlIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGZvbGxvd2luZwotICAgICAqIGFjdGlvbnM6IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFSyBzZWVrfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIHBhdXNlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgcmVzdW1lfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QIHN0b3B9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiByZW1vdGUgcGxheWJhY2sgaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBmZWF0dXJlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLCB0aGVuIGF0IG1vc3Qgb25lIG1lZGlhIGl0ZW0gY2FuIGJlIHBsYXllZAotICAgICAqIGF0IGEgdGltZSBhbmQgdGhlIHtAbGluayAjZW5xdWV1ZX0gbWV0aG9kIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgcXVldWluZyBpcyBzdXBwb3J0ZWQuICBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0KLSAgICAgKiBpcyBhbHNvIHRydWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWV1aW5nU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgc2Vzc2lvbiBtYW5hZ2VtZW50IGZlYXR1cmVzLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudCwgdGhlbiB0aGUgc2Vzc2lvbiB3aWxsCi0gICAgICogbm90IGJlIGNyZWF0ZWQgdW50aWwgdGhlIGZpcnN0IG1lZGlhIGl0ZW0gaXMgcGxheWVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgYmFzaWMgcmVtb3RlIHBsYXliYWNrCi0gICAgICogYWN0aW9ucyBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb259LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyBnZXQgc2Vzc2lvbiBzdGF0dXN9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgc2Vzc2lvbiBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZC4KLSAgICAgKiBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0gaXMgYWxzbyB0cnVlLgotICAgICAqCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgbWVzc2FnZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9ufSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0Ugc2VuZCBtZXNzYWdlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHNlc3Npb24gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCi0gICAgICogSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9IGlzIGFsc28gdHJ1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2luZ1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNlc3Npb24gaWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25JZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBzZXNzaW9uIGlkLgotICAgICAqIDxwPgotICAgICAqIEl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byBzZXQgdGhlIHNlc3Npb24gaWQgZXhwbGljaXRseSBzaW5jZQotICAgICAqIGl0IGlzIGNyZWF0ZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiBvdGhlciByZXF1ZXN0cyBzdWNoIGFzCi0gICAgICoge0BsaW5rICNwbGF5fSwge0BsaW5rICNlbnF1ZXVlfSwgYW5kIHtAbGluayAjc3RhcnRTZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBuZXcgc2Vzc2lvbiBpZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25JZChTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpZCBpcyBub3c6ICIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICAgICAgICAgIGlmIChtU3RhdHVzQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vblNlc3Npb25DaGFuZ2VkKHNlc3Npb25JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBjdXJyZW50bHkgaGFzIGEgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBFcXVpdmFsZW50IHRvIGNoZWNraW5nIHdoZXRoZXIge0BsaW5rICNnZXRTZXNzaW9uSWR9IHJldHVybnMgYSBub24tbnVsbCByZXN1bHQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGEgY3VycmVudCBzZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1Nlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgd2hlbiB0aGUgc3RhdGUgb2YKLSAgICAgKiBtZWRpYSBzZXNzaW9ucyBvciBtZWRpYSBpdGVtcyBjcmVhdGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHJlbW90ZQotICAgICAqIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkIG9yIGFueSBwbGF5Ci0gICAgICogY29tbWFuZHMgYXJlIGlzc3VlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHNldC4gIE1heSBiZSBudWxsIHRvIHJlbW92ZSB0aGUgcHJldmlvdXMgY2FsbGJhY2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdHVzQ2FsbGJhY2soU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbVN0YXR1c0NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgbWVzc2FnZXMgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCBmcm9tCi0gICAgICogbWVkaWEgc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBiZSBzZXQgYmVmb3JlIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBjYWxsYmFjayB0byBzZXQuICBNYXkgYmUgbnVsbCB0byByZW1vdmUgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIoT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBwbGF5IGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBDbGVhcnMgdGhlIHF1ZXVlIGFuZCBzdGFydHMgcGxheWluZyB0aGUgbmV3IGl0ZW0gaW1tZWRpYXRlbHkuICBJZiB0aGUgcXVldWUKLSAgICAgKiB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHRoZW4gaXQgaXMgcmVzdW1lZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIEFDVElPTl9QTEFZfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBwbGF5LgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwbGF5KFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBwbGF5T3JFbnF1ZXVlKGNvbnRlbnRVcmksIG1pbWVUeXBlLCBtZXRhZGF0YSwgcG9zaXRpb25NaWxsaXMsCi0gICAgICAgICAgICAgICAgZXh0cmFzLCBjYWxsYmFjaywgTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZW5xdWV1ZSBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogRW5xdWV1ZXMgYSBuZXcgaXRlbSB0byBwbGF5LiAgSWYgdGhlIHF1ZXVlIHdhcyBwcmV2aW91c2x5IHBhdXNlZCwgdGhlbiB3aWxsCi0gICAgICogcmVtYWluIHBhdXNlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIEFDVElPTl9FTlFVRVVFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBlbnF1ZXVlLgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5xdWV1ZShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcGxheU9yRW5xdWV1ZShjb250ZW50VXJpLCBtaW1lVHlwZSwgbWV0YWRhdGEsIHBvc2l0aW9uTWlsbGlzLAotICAgICAgICAgICAgICAgIGV4dHJhcywgY2FsbGJhY2ssIE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBsYXlPckVucXVldWUoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywKLSAgICAgICAgICAgIGZpbmFsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaywgU3RyaW5nIGFjdGlvbikgewotICAgICAgICBpZiAoY29udGVudFVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZW50VXJpIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKSkgewotICAgICAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7Ci0gICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZShjb250ZW50VXJpLCBtaW1lVHlwZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgIG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fTUVUQURBVEEsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zaXRpb25NaWxsaXMgIT0gMCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzKTsKLSAgICAgICAgfQotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIG51bGwsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzZWVrIHRvIGEgbmV3IHBvc2l0aW9uIGluIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWVrcyB0byBhIG5ldyBwb3NpdGlvbi4gIElmIHRoZSBxdWV1ZSB3YXMgcHJldmlvdXNseSBwYXVzZWQgdGhlbiBpdAotICAgICAqIHJlbWFpbnMgcGF1c2VkIGJ1dCB0aGUgaXRlbSdzIG5ldyBwb3NpdGlvbiBpcyBzdGlsbCByZW1lbWJlcmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsgQUNUSU9OX1NFRUt9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb25NaWxsaXMgVGhlIG5ldyBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VlayhTdHJpbmcgaXRlbUlkLCBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLAotICAgICAgICAgICAgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VFSyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpcyk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBBQ1RJT05fR0VUX1NUQVRVU30gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVN9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRTdGF0dXMoU3RyaW5nIGl0ZW1JZCwgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NUQVRVUyk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVtb3ZlIGEgbWVkaWEgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSBBQ1RJT05fUkVNT1ZFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBpdGVtSWQsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFTU9WRSk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcGF1c2UgbWVkaWEgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBwbGF5YmFjayBpcyBhbHJlYWR5IHBhdXNlZAotICAgICAqIHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIEFDVElPTl9QQVVTRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXVzZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BBVVNFKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVzdW1lICh1bnBhdXNlKSBtZWRpYSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHBsYXliYWNrIGlzIG5vdCBwYXVzZWQKLSAgICAgKiB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgQUNUSU9OX1JFU1VNRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUV9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3VtZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFU1VNRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHN0b3AgbWVkaWEgcGxheWJhY2sgYW5kIGNsZWFyIHRoZSBtZWRpYSBwbGF5YmFjayBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5Ci0gICAgICogZW1wdHkgdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBBQ1RJT05fU1RPUH0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUT1ApOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzdGFydCBhIG5ldyBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHdhaXQgZm9yIHRoZSBjYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVxdWVzdAotICAgICAqIGlzIGNvbXBsZXRlIGJlZm9yZSBpc3N1aW5nIG90aGVyIHJlcXVlc3RzIHRoYXQgYWZmZWN0IHRoZSBzZXNzaW9uLiAgSWYgdGhpcwotICAgICAqIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCB0aGVuIHRoZSBwcmV2aW91cyBzZXNzaW9uIHdpbGwgYmUgaW52YWxpZGF0ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIEFDVElPTl9TVEFSVF9TRVNTSU9OfQotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT059IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNlc3Npb24oQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RBUlRfU0VTU0lPTik7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIGlmIChtUm91dGVTdXBwb3J0c01lc3NhZ2luZykgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9NRVNTQUdFX1JFQ0VJVkVSLCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbnVsbCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSBtZXNzYWdlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgYnVuZGxlIG1lc3NhZ2UgZGVub3Rpbmcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9NRVNTQUdFfS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRQotICAgICAqIEBzZWUgI2lzTWVzc2FnaW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoQnVuZGxlIG1lc3NhZ2UsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotICAgICAgICB0aHJvd0lmTWVzc2FnZU5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VORF9NRVNTQUdFKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBtZXNzYWdlLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGdldCB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCi0gICAgICogQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0U2Vzc2lvblN0YXR1cyhCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBlbmQgdGhlIG1lZGlhIHBsYXliYWNrIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGlzIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwKLSAgICAgKiB0aGUge0BsaW5rICNnZXRTZXNzaW9uSWQgc2Vzc2lvbiBpZCBwcm9wZXJ0eX0gd2lsbCBiZSBzZXQgdG8gbnVsbCBhZnRlcgotICAgICAqIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gQUNUSU9OX0VORF9TRVNTSU9OfQotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybUl0ZW1BY3Rpb24oZmluYWwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXNzaW9uSWQsIGZpbmFsIFN0cmluZyBpdGVtSWQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzLCBmaW5hbCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCwgc2Vzc2lvbklkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCwgaXRlbUlkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYXMoZXh0cmFzKTsKLSAgICAgICAgfQotICAgICAgICBsb2dSZXF1ZXN0KGludGVudCk7Ci0gICAgICAgIG1Sb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzID0gTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoaXRlbUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkb3B0U2Vzc2lvbihzZXNzaW9uSWRSZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkUmVzdWx0ICE9IG51bGwgJiYgaXRlbUlkUmVzdWx0ICE9IG51bGwgJiYgaXRlbVN0YXR1cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbUlkPSIgKyBpdGVtSWRSZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbVN0YXR1cz0iICsgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZFJlc3VsdCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlSW52YWxpZFJlc3VsdChpbnRlbnQsIGNhbGxiYWNrLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihpbnRlbnQsIGNhbGxiYWNrLCBlcnJvciwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtU2Vzc2lvbkFjdGlvbihmaW5hbCBJbnRlbnQgaW50ZW50LCBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgZmluYWwgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQsIHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVxdWVzdChpbnRlbnQpOwotICAgICAgICBtUm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBhZG9wdFNlc3Npb24oc2Vzc2lvbklkUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZFJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2Vzc2lvbklkUmVzdWx0LmVxdWFscyhtU2Vzc2lvbklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZXNzaW9uSWQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZUludmFsaWRSZXN1bHQoaW50ZW50LCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW50ZW50LCBjYWxsYmFjaywgZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkb3B0U2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUludmFsaWRSZXN1bHQoSW50ZW50IGludGVudCwgQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBCdW5kbGUgZGF0YSkgewotICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBpbnZhbGlkIHJlc3VsdCBkYXRhIGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICsgIjogZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOwotICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOLCBkYXRhKTsKLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUVycm9yKEludGVudCBpbnRlbnQsIEFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICBmaW5hbCBpbnQgY29kZTsKLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgY29kZSA9IGRhdGEuZ2V0SW50KE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9FUlJPUl9DT0RFLAotICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb2RlID0gTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV047Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBlcnJvciBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiOiBlcnJvcj0iICsgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb2RlPSIgKyBjb2RlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGNvZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRlY3RGZWF0dXJlcygpIHsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjayA9IHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRUVLKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU1RBVFVTKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QQVVTRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVTVU1FKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVE9QKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNRdWV1aW5nID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjawotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRU1PVkUpOwotICAgICAgICBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50ID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjawotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVEFSVF9TRVNTSU9OKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcgPSBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHJvdXRlU3VwcG9ydHNBY3Rpb24oU3RyaW5nIGFjdGlvbikgewotICAgICAgICByZXR1cm4gbVJvdXRlLnN1cHBvcnRzQ29udHJvbEFjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLLCBhY3Rpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCkgewotICAgICAgICBmb3IgKEludGVudEZpbHRlciBmaWx0ZXIgOiBtUm91dGUuZ2V0Q29udHJvbEZpbHRlcnMoKSkgewotICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRU5EX01FU1NBR0UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjaykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNRdWV1aW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgIgotICAgICAgICAgICAgICAgICAgICArICJzZXNzaW9uIG1hbmFnZW1lbnQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZk1lc3NhZ2VOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgbWVzc2FnZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpIHsKLSAgICAgICAgaWYgKG1TZXNzaW9uSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBpbmZlck1pc3NpbmdSZXN1bHQoU3RyaW5nIHJlcXVlc3QsIFN0cmluZyByZXN1bHQpIHsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBSZXN1bHQgaXMgbWlzc2luZy4KLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVxdWVzdC5lcXVhbHMocmVzdWx0KSkgewotICAgICAgICAgICAgLy8gUmVxdWVzdCBkaWRuJ3Qgc3BlY2lmeSBhIHZhbHVlIG9yIHJlc3VsdCBtYXRjaGVzIHJlcXVlc3QuCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlc3VsdCBjb25mbGljdHMgd2l0aCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1JlcXVlc3QoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNlbmRpbmcgcmVxdWVzdDogIiArIGludGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGJ1bmRsZVRvU3RyaW5nKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUuc2l6ZSgpOyAvLyBmb3JjZSBidW5kbGUgdG8gYmUgdW5wYXJjZWxsZWQKLSAgICAgICAgICAgIHJldHVybiBidW5kbGUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIm51bGwiOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQWN0aW9uUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCI7Ci0KLSAgICAgICAgQWN0aW9uUmVjZWl2ZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IG51bGwgfHwgIXNlc3Npb25JZC5lcXVhbHMobVNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJ3aXRoIG1pc3Npbmcgb3IgaW52YWxpZCBzZXNzaW9uIGlkOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIGlkLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMgPSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbVN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIHN0YXR1cy4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBpdGVtIHN0YXR1cyBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1JZD0iICsgaXRlbUlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtU3RhdHVzPSIgKyBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uSXRlbVN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cywgaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIG1lZGlhIHN0YXR1cyBjYWxsYmFjayB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIm1pc3Npbmcgc2Vzc2lvbiBzdGF0dXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgc2Vzc2lvbiBzdGF0dXMgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uU2Vzc2lvblN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBtZXNzYWdlIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIub25NZXNzYWdlUmVjZWl2ZWQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfTUVTU0FHRSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgbWVkaWEgc3RhdHVzIHVwZGF0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbSBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1TdGF0dXMgVGhlIGl0ZW0gc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIG5ldyBzZXNzaW9uIGlkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uQ2hhbmdlZChTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNlIGNhbGxiYWNrIHR5cGUgZm9yIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKLSAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgotICAgICAgICAgKiBAcGFyYW0gY29kZSBUaGUgZXJyb3IgY29kZSwgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFUlJPUl9VTktOT1dOfSBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZXJyb3IgZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBpbnQgY29kZSwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIGl0ZW1zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSXRlbUFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAgICAgKiBAcGFyYW0gaXRlbVN0YXR1cyBUaGUgaXRlbSBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIHNlc3Npb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWVkaWEgc2Vzc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSByZWNlaXZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBidW5kbGUgbWVzc2FnZSBkZW5vdGluZyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VYVFJBX01FU1NBR0V9LgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChTdHJpbmcgc2Vzc2lvbklkLCBCdW5kbGUgbWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg0OTFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIFByb3ZpZGVzIHJvdXRlcyBmb3IgYnVpbHQtaW4gc3lzdGVtIGRlc3RpbmF0aW9ucyBzdWNoIGFzIHRoZSBsb2NhbCBkaXNwbGF5Ci0gKiBhbmQgc3BlYWtlci4gIE9uIEplbGx5YmVhbiBhbmQgbmV3ZXIgcGxhdGZvcm0gcmVsZWFzZXMsIHF1ZXJpZXMgdGhlIGZyYW1ld29yawotICogTWVkaWFSb3V0ZXIgZm9yIGZyYW1ld29yay1wcm92aWRlZCByb3V0ZXMgYW5kIHJlZ2lzdGVycyBub24tZnJhbWV3b3JrLXByb3ZpZGVkCi0gKiByb3V0ZXMgYXMgdXNlciByb3V0ZXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImFuZHJvaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUk9VVEVfSUQgPSAiREVGQVVMVF9ST1VURSI7Ci0KLSAgICBwcm90ZWN0ZWQgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShuZXcgQ29tcG9uZW50TmFtZShQQUNLQUdFX05BTUUsCi0gICAgICAgICAgICAgICAgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXBpMjRJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxOCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5NcjJJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5NcjFJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5JbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lJbXBsKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBhZGRlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVBZGRlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgcmVtb3ZlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBjaGFuZ2VkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrcyBpbnRvIHRoZSBtZWRpYSByb3V0ZXIgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aCB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFN5bmNDYWxsYmFjayB7Ci0gICAgICAgIHZvaWQgb25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTeXN0ZW1Sb3V0ZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVnYWN5IGltcGxlbWVudGF0aW9uIGZvciBwbGF0Zm9ybSB2ZXJzaW9ucyBwcmlvciB0byBKZWxseWJlYW4uCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIExlZ2FjeUltcGwgZXh0ZW5kcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgewotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUUkVBTSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLSAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotCi0gICAgICAgICAgICBDT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIENPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWb2x1bWVDaGFuZ2VSZWNlaXZlciBtVm9sdW1lQ2hhbmdlUmVjZWl2ZXI7Ci0gICAgICAgIGludCBtTGFzdFJlcG9ydGVkVm9sdW1lID0gLTE7Ci0KLSAgICAgICAgcHVibGljIExlZ2FjeUltcGwoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgbVZvbHVtZUNoYW5nZVJlY2VpdmVyID0gbmV3IFZvbHVtZUNoYW5nZVJlY2VpdmVyKCk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtVm9sdW1lQ2hhbmdlUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoVm9sdW1lQ2hhbmdlUmVjZWl2ZXIuVk9MVU1FX0NIQU5HRURfQUNUSU9OKSk7Ci0gICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHB1Ymxpc2hSb3V0ZXMoKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIGludCBtYXhWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgbUxhc3RSZXBvcnRlZFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciBkZWZhdWx0Um91dGUgPSBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ST1VURV9JRCwgci5nZXRTdHJpbmcoUi5zdHJpbmcubXJfc3lzdGVtX3JvdXRlX25hbWUpKQotICAgICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbEZpbHRlcnMoQ09OVFJPTF9GSUxURVJTKQotICAgICAgICAgICAgICAgICAgICAuc2V0UGxheWJhY2tTdHJlYW0oUExBWUJBQ0tfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAuc2V0UGxheWJhY2tUeXBlKE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX0xPQ0FMKQotICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lSGFuZGxpbmcoTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZU1heChtYXhWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWUobUxhc3RSZXBvcnRlZFZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXJEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRSb3V0ZShkZWZhdWx0Um91dGUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihwcm92aWRlckRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZUlkLmVxdWFscyhERUZBVUxUX1JPVVRFX0lEKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJvdXRlQ29udHJvbGxlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBjbGFzcyBEZWZhdWx0Um91dGVDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSwgdm9sdW1lLCAwKTsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICAgICAgaW50IG1heFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICAgICAgaW50IG5ld1ZvbHVtZSA9IE1hdGgubWluKG1heFZvbHVtZSwgTWF0aC5tYXgoMCwgdm9sdW1lICsgZGVsdGEpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3Vm9sdW1lICE9IHZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0sIHZvbHVtZSwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGNsYXNzIFZvbHVtZUNoYW5nZVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICAgICAgLy8gVGhlc2UgY29uc3RhbnRzIGNvbWUgZnJvbSBBdWRpb01hbmFnZXIuCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0xVTUVfQ0hBTkdFRF9BQ1RJT04gPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5WT0xVTUVfQ0hBTkdFRF9BQ1RJT04iOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFIjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUgPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5FWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFIjsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVk9MVU1FX0NIQU5HRURfQUNUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RyZWFtVHlwZSA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbVR5cGUgPT0gUExBWUJBQ0tfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWUgPj0gMCAmJiB2b2x1bWUgIT0gbUxhc3RSZXBvcnRlZFZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE2KQotICAgIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5JbXBsIGV4dGVuZHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrLCBNZWRpYVJvdXRlckplbGx5YmVhbi5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLQotICAgICAgICAgICAgTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLQotICAgICAgICAgICAgTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3luY0NhbGxiYWNrIG1TeW5jQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUm91dGVyT2JqOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1DYWxsYmFja09iajsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtVm9sdW1lQ2FsbGJhY2tPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1Sb3V0ZVR5cGVzOwotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQWN0aXZlU2NhbjsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNhbGxiYWNrUmVnaXN0ZXJlZDsKLQotICAgICAgICAvLyBNYWludGFpbnMgYW4gYXNzb2NpYXRpb24gZnJvbSBmcmFtZXdvcmsgcm91dGVzIHRvIHN1cHBvcnQgbGlicmFyeSByb3V0ZXMuCi0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW5ub3QgdXNlIHRoZSB0YWcgZmllbGQgZm9yIHRoaXMgYmVjYXVzZSBhbiBhcHBsaWNhdGlvbiBtYXkKLSAgICAgICAgLy8gaGF2ZSBwdWJsaXNoZWQgaXRzIG93biB1c2VyIHJvdXRlcyB0byB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBhbmQgYWxyZWFkeQotICAgICAgICAvLyB1c2VkIHRoZSB0YWcgZm9yIGl0cyBvd24gcHVycG9zZXMuCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8U3lzdGVtUm91dGVSZWNvcmQ+IG1TeXN0ZW1Sb3V0ZVJlY29yZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3lzdGVtUm91dGVSZWNvcmQ+KCk7Ci0KLSAgICAgICAgLy8gTWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGZyb20gc3VwcG9ydCBsaWJyYXJ5IHJvdXRlcyB0byBmcmFtZXdvcmsgcm91dGVzLgotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PFVzZXJSb3V0ZVJlY29yZD4gbVVzZXJSb3V0ZVJlY29yZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8VXNlclJvdXRlUmVjb3JkPigpOwotCi0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW4uU2VsZWN0Um91dGVXb3JrYXJvdW5kIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW4uR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZDsKLQotICAgICAgICBwdWJsaWMgSmVsbHliZWFuSW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVN5bmNDYWxsYmFjayA9IHN5bmNDYWxsYmFjazsKLSAgICAgICAgICAgIG1Sb3V0ZXJPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRNZWRpYVJvdXRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1DYWxsYmFja09iaiA9IGNyZWF0ZUNhbGxiYWNrT2JqKCk7Ci0gICAgICAgICAgICBtVm9sdW1lQ2FsbGJhY2tPYmogPSBjcmVhdGVWb2x1bWVDYWxsYmFja09iaigpOwotCi0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCByLmdldFN0cmluZyhSLnN0cmluZy5tcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUpLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlSWQpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIGludCBuZXdSb3V0ZVR5cGVzID0gMDsKLSAgICAgICAgICAgIGJvb2xlYW4gbmV3QWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciA9IHJlcXVlc3QuZ2V0U2VsZWN0b3IoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY2F0ZWdvcmllcyA9IHNlbGVjdG9yLmdldENvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gY2F0ZWdvcmllcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeSA9IGNhdGVnb3JpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfQVVESU87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZVR5cGVzIHw9IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfVVNFUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdBY3RpdmVTY2FuID0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Sb3V0ZVR5cGVzICE9IG5ld1JvdXRlVHlwZXMgfHwgbUFjdGl2ZVNjYW4gIT0gbmV3QWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVR5cGVzID0gbmV3Um91dGVUeXBlczsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU2NhbiA9IG5ld0FjdGl2ZVNjYW47Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKHJvdXRlT2JqKSkgewotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKSB7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsYmFjaygpOwotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCByb3V0ZU9iaiA6IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFJvdXRlcyhtUm91dGVyT2JqKSkgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2gocm91dGVPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2goT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gYXNzaWduUm91dGVJZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbmV3IFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqLCBpZCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgbVN5c3RlbVJvdXRlUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFzc2lnblJvdXRlSWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBUaGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBzaG91bGQgc3VwcGx5IGEgdW5pcXVlIHJvdXRlIGlkIHRoYXQKLSAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgaGVyZS4gIEZvciBub3cgd2UgdXNlIGEgaGFzaCBvZiB0aGUgcm91dGUgbmFtZSBhbmQgdGFrZSBjYXJlCi0gICAgICAgICAgICAvLyB0byBkZWR1cGUgaXQuCi0gICAgICAgICAgICBib29sZWFuIGlzRGVmYXVsdCA9IChnZXREZWZhdWx0Um91dGUoKSA9PSByb3V0ZU9iaik7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBpc0RlZmF1bHQgPyBERUZBVUxUX1JPVVRFX0lEIDoKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICJST1VURV8lMDh4IiwgZ2V0Um91dGVOYW1lKHJvdXRlT2JqKS5oYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIGlmIChmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChpZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld0lkID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICIlc18lZCIsIGlkLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQobmV3SWQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJvdXRlUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld1ZvbHVtZSA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWUocm91dGVPYmopOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3Vm9sdW1lICE9IHJlY29yZC5tUm91dGVEZXNjcmlwdG9yLmdldFZvbHVtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKHJlY29yZC5tUm91dGVEZXNjcmlwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lKG5ld1ZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZU9iaiAhPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRTZWxlY3RlZFJvdXRlKG1Sb3V0ZXJPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUykpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGhhcyBhbHJlYWR5IGNoYW5nZWQgc28gdGhpcyBjYWxsYmFjawotICAgICAgICAgICAgICAgIC8vIGlzIHN0YWxlLiAgRHJvcCBpdCB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzeW5jIGxvb3BzLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHVzZXJSb3V0ZVJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAodXNlclJvdXRlUmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VyUm91dGVSZWNvcmQubVJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIHJvdXRlIGlmIGl0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBjb21wYXQgbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgd2Ugd2lsbCBzZWxlY3QgaXQgaW5zdGVhZCB3aGVuIHRoZSByb3V0ZSBpcyBhZGRlZC4KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbVN5bmNDYWxsYmFjay5vblN5c3RlbVJvdXRlU2VsZWN0ZWRCeURlc2NyaXB0b3JJZChyZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbyB3aGVuIGEgcm91dGUgaXMgdW5zZWxlY3RlZC4KLSAgICAgICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgd2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IGdyb3VwT2JqLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIC8vIFJvdXRlIGdyb3VwaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaikgewotICAgICAgICAgICAgLy8gUm91dGUgZ3JvdXBpbmcgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVBZGRlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIE9iamVjdCByb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIG1Vc2VyUm91dGVDYXRlZ29yeU9iaik7Ci0gICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG5ldyBVc2VyUm91dGVSZWNvcmQocm91dGUsIHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uc2V0VGFnKHJvdXRlT2JqLCByZWNvcmQpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2socm91dGVPYmosIG1Wb2x1bWVDYWxsYmFja09iaik7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmFkZFVzZXJSb3V0ZShtUm91dGVyT2JqLCByb3V0ZU9iaik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXdseSBhZGRlZCByb3V0ZSBpcyB0aGUgY291bnRlcnBhcnQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAgICAgICAgICAgICAgIC8vIHJvdXRlIGluIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIHRoZW4gZW5zdXJlIGl0IGlzIHNlbGVjdGVkIGluCi0gICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBhdCBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICAgICAgT2JqZWN0IHJvdXRlT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0U2VsZWN0ZWRSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUyk7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkLmVxdWFscyhyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlUmVtb3ZlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uc2V0VGFnKHJlY29yZC5tUm91dGVPYmosIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKHJlY29yZC5tUm91dGVPYmosIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVVc2VyUm91dGUobVJvdXRlck9iaiwgcmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQ2hhbmdlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAoIXJvdXRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgaGFzIGFscmVhZHkgY2hhbmdlZCBzbyB0aGlzIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgLy8gaXMgc3RhbGUuICBEcm9wIGl0IHRvIHByZXZlbnQgZ2V0dGluZyBpbnRvIHN5bmMgbG9vcHMuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um91dGUocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3RSb3V0ZShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoUm91dGVzKCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUm91dGUobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFN5c3RlbVJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlT2JqID09IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGVEZXNjcmlwdG9ySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRVc2VyUm91dGVSZWNvcmQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtVXNlclJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZSA9PSByb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgVXNlclJvdXRlUmVjb3JkIGdldFVzZXJSb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIE9iamVjdCB0YWcgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0VGFnKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIHJldHVybiB0YWcgaW5zdGFuY2VvZiBVc2VyUm91dGVSZWNvcmQgPyAoVXNlclJvdXRlUmVjb3JkKXRhZyA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICAvLyBXZSBtdXN0IGFsd2F5cyByZWNyZWF0ZSB0aGUgcm91dGUgZGVzY3JpcHRvciB3aGVuIG1ha2luZyBhbnkgY2hhbmdlcwotICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGV5IGFyZSBpbnRlbmRlZCB0byBiZSBpbW11dGFibGUgb25jZSBwdWJsaXNoZWQuCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZCwgZ2V0Um91dGVOYW1lKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLSAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSb3V0ZU5hbWUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBSb3V0ZXMgc2hvdWxkIG5vdCBoYXZlIG51bGwgbmFtZXMgYnV0IGl0IG1heSBoYXBwZW4gZm9yIGJhZGx5IGNvbmZpZ3VyZWQKLSAgICAgICAgICAgIC8vIHVzZXIgcm91dGVzLiAgV2UgdG9sZXJhdGUgdGhpcyBieSB1c2luZyBhbiBlbXB0eSBuYW1lIHN0cmluZyBoZXJlIGJ1dAotICAgICAgICAgICAgLy8gc3VjaCB1bm5hbWVkIHJvdXRlcyB3aWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgbWVkaWEgcm91dGVyIHVwc3RyZWFtCi0gICAgICAgICAgICAvLyAod2l0aCBhIGxvZyBtZXNzYWdlIHNvIHdlIGNhbiB0cmFjayBkb3duIHRoZSBwcm9ibGVtKS4KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBuYW1lID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldE5hbWUocm91dGVPYmosIGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gbmFtZS50b1N0cmluZygpIDogIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIGludCBzdXBwb3J0ZWRUeXBlcyA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRTdXBwb3J0ZWRUeXBlcygKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAoKHN1cHBvcnRlZFR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb250cm9sRmlsdGVycyhMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHN1cHBvcnRlZFR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb250cm9sRmlsdGVycyhMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0UGxheWJhY2tUeXBlKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRQbGF5YmFja1N0cmVhbShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZU1heChyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lSGFuZGxpbmcocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhVc2VyUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldE5hbWUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFBsYXliYWNrVHlwZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0UGxheWJhY2tTdHJlYW0oKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVDYWxsYmFjayhtUm91dGVyT2JqLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVJvdXRlVHlwZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmFkZENhbGxiYWNrKG1Sb3V0ZXJPYmosIG1Sb3V0ZVR5cGVzLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVm9sdW1lQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVXb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuLlNlbGVjdFJvdXRlV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZC5zZWxlY3RSb3V0ZShtUm91dGVyT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMsIHJvdXRlT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW4uR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kLmdldERlZmF1bHRSb3V0ZShtUm91dGVyT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFN5c3RlbVJvdXRlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlLmdldERlc2NyaXB0b3JJZCgpKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KS5tUm91dGVPYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXByZXNlbnRzIGEgcm91dGUgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlcgotICAgICAgICAgKiBhbmQgcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIgdG8gdGhlIHN1cHBvcnQgbGlicmFyeSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFN5c3RlbVJvdXRlUmVjb3JkIHsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotICAgICAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtUm91dGVEZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbVJvdXRlRGVzY3JpcHRvcjsgLy8gYXNzaWduZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpb24KLQotICAgICAgICAgICAgcHVibGljIFN5c3RlbVJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaiwgU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlT2JqID0gcm91dGVPYmo7Ci0gICAgICAgICAgICAgICAgbVJvdXRlRGVzY3JpcHRvcklkID0gaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwcmVzZW50cyBhIHJvdXRlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIHN1cHBvcnQgbGlicmFyeSBtZWRpYSByb3V0ZXIKLSAgICAgICAgICogYW5kIHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyIHRvIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVSZWNvcmQgewotICAgICAgICAgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLQotICAgICAgICAgICAgcHVibGljIFVzZXJSb3V0ZVJlY29yZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIgZXh0ZW5kcyBSb3V0ZUNvbnRyb2xsZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotCi0gICAgICAgICAgICBwdWJsaWMgU3lzdGVtUm91dGVDb250cm9sbGVyKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZShtUm91dGVPYmosIHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnJlcXVlc3RVcGRhdGVWb2x1bWUobVJvdXRlT2JqLCBkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gTVIxIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTcpCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVsbHliZWFuTXIxSW1wbCBleHRlbmRzIEplbGx5YmVhbkltcGwKLSAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkFjdGl2ZVNjYW5Xb3JrYXJvdW5kIG1BY3RpdmVTY2FuV29ya2Fyb3VuZDsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kOwotCi0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5NcjFJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgRGlzcGxheSBuZXdQcmVzZW50YXRpb25EaXNwbGF5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpbnQgbmV3UHJlc2VudGF0aW9uRGlzcGxheUlkID0gKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXdQcmVzZW50YXRpb25EaXNwbGF5LmdldERpc3BsYXlJZCgpIDogLTEpOwotICAgICAgICAgICAgICAgIGlmIChuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHJlY29yZC5tUm91dGVEZXNjcmlwdG9yLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcihyZWNvcmQubVJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgaWYgKCFNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uaXNFbmFibGVkKHJlY29yZC5tUm91dGVPYmopKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGluZyhyZWNvcmQpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDb25uZWN0aW5nKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEaXNwbGF5IHByZXNlbnRhdGlvbkRpc3BsYXkgPQotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25EaXNwbGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChwcmVzZW50YXRpb25EaXNwbGF5LmdldERpc3BsYXlJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZUNhbGxiYWNrKCk7Ci0KLSAgICAgICAgICAgIGlmIChtQWN0aXZlU2Nhbldvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVTY2FuV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5BY3RpdmVTY2FuV29ya2Fyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKSwgZ2V0SGFuZGxlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BY3RpdmVTY2FuV29ya2Fyb3VuZC5zZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhtQWN0aXZlU2NhbiA/IG1Sb3V0ZVR5cGVzIDogMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5jcmVhdGVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGluZyhTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIGlmIChtSXNDb25uZWN0aW5nV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUlzQ29ubmVjdGluZ1dvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kLmlzQ29ubmVjdGluZyhyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBNUjIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxOCkKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5NcjJJbXBsIGV4dGVuZHMgSmVsbHliZWFuTXIxSW1wbCB7Ci0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5NcjJJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuUm91dGVJbmZvLmdldERlc2NyaXB0aW9uKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uc2VsZWN0Um91dGUobVJvdXRlck9iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTLCByb3V0ZU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuZ2V0RGVmYXVsdFJvdXRlKG1Sb3V0ZXJPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMoVXNlclJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgc3VwZXIudXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Vc2VyUm91dGVJbmZvLnNldERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVDYWxsYmFjayhtUm91dGVyT2JqLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLmFkZENhbGxiYWNrKG1Sb3V0ZXJPYmosIG1Sb3V0ZVR5cGVzLCBtQ2FsbGJhY2tPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMKLSAgICAgICAgICAgICAgICAgICAgfCAobUFjdGl2ZVNjYW4gPyBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4gOiAwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25uZWN0aW5nKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlJvdXRlSW5mby5pc0Nvbm5lY3RpbmcocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcGkyNCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDI0KQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFwaTI0SW1wbCBleHRlbmRzIEplbGx5YmVhbk1yMkltcGwgewotICAgICAgICBwdWJsaWMgQXBpMjRJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgYnVpbGRlci5zZXREZXZpY2VUeXBlKE1lZGlhUm91dGVyQXBpMjQuUm91dGVJbmZvLmdldERldmljZVR5cGUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmFhZjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+Ci0KLTxib2R5PgotCi08cD5Db250YWlucyBBUElzIHRoYXQgY29udHJvbCB0aGUgcm91dGluZyBvZiBtZWRpYSBjaGFubmVscyBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZQotICB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2NDcxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLk1hcmdpbkxheW91dFBhcmFtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCYXNlTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwSW1wbCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXAgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVN1cGVyUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtUHJpdmF0ZVByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gbU1hdGNoUGFyZW50Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PD4oMSk7Ci0KLSAgICBwdWJsaWMgQmFzZUxheW91dChWaWV3R3JvdXAgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7Ci0gICAgICAgIG1Qcml2YXRlUHJvdmlkZXIgPSBwcml2YXRlUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChMYXlvdXRQYXJhbXMgcCkgewotICAgICAgICByZXR1cm4gcCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGF0dHJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoTGF5b3V0UGFyYW1zIGxwKSB7Ci0gICAgICAgIGlmIChscCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtcykgewotICAgICAgICAgICAgcmV0dXJuIGxwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKGxwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBtZWFzdXJlTWF0Y2hQYXJlbnRDaGlsZHJlbiA9Ci0gICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpICE9IFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKSAhPSBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFk7Ci0gICAgICAgIG1NYXRjaFBhcmVudENoaWxkcmVuLmNsZWFyKCk7Ci0KLSAgICAgICAgaW50IG1heEhlaWdodCA9IDA7Ci0gICAgICAgIGludCBtYXhXaWR0aCA9IDA7Ci0gICAgICAgIGludCBjaGlsZFN0YXRlID0gMDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVQcm92aWRlci5tZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQsIHdpZHRoTWVhc3VyZVNwZWMsIDAsIGhlaWdodE1lYXN1cmVTcGVjLCAwKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpICsgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luKTsKLSAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpICsgbHAudG9wTWFyZ2luICsgbHAuYm90dG9tTWFyZ2luKTsKLSAgICAgICAgICAgICAgICBjaGlsZFN0YXRlID0gY2hpbGRTdGF0ZSB8IGNoaWxkLmdldE1lYXN1cmVkU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAobWVhc3VyZU1hdGNoUGFyZW50Q2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxwLndpZHRoID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1hdGNoUGFyZW50Q2hpbGRyZW4uYWRkKGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgdG9vCi0gICAgICAgIG1heFdpZHRoICs9IGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIG1heEhlaWdodCArPSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIG1pbmltdW0gaGVpZ2h0IGFuZCB3aWR0aAotICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIG1Qcml2YXRlUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkpOwotICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBtUHJpdmF0ZVByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkpOwotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIGZvcmVncm91bmQncyBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKLSAgICAgICAgZmluYWwgRHJhd2FibGUgZHJhd2FibGUgPSBtSW5zdGFuY2UuZ2V0Rm9yZWdyb3VuZCgpOwotICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBkcmF3YWJsZS5nZXRNaW5pbXVtSGVpZ2h0KCkpOwotICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgZHJhd2FibGUuZ2V0TWluaW11bVdpZHRoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVByaXZhdGVQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXNvbHZlU2l6ZUFuZFN0YXRlKG1heFdpZHRoLCB3aWR0aE1lYXN1cmVTcGVjLCBjaGlsZFN0YXRlKSwKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVzb2x2ZVNpemVBbmRTdGF0ZShtYXhIZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA8PCBWaWV3Lk1FQVNVUkVEX0hFSUdIVF9TVEFURV9TSElGVCkpOwotCi0gICAgICAgIGNvdW50ID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICBpZiAoY291bnQgPiAxKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkV2lkdGhNZWFzdXJlU3BlYzsKLSAgICAgICAgICAgICAgICBpZiAobHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heCgwLCBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgLSBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC5sZWZ0TWFyZ2luIC0gbHAucmlnaHRNYXJnaW4pOwotICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBWaWV3Lk1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyh3aWR0aE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLndpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYzsKLSAgICAgICAgICAgICAgICBpZiAobHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KDAsIG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSAtIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC50b3BNYXJnaW4gLSBscC5ib3R0b21NYXJnaW4pOwotICAgICAgICAgICAgICAgICAgICBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyhoZWlnaHRNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLnRvcE1hcmdpbiArIGxwLmJvdHRvbU1hcmdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoY2hpbGRXaWR0aE1lYXN1cmVTcGVjLCBjaGlsZEhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgZmluYWwgaW50IHBhcmVudExlZnQgPSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIGZpbmFsIGludCBwYXJlbnRSaWdodCA9IHJpZ2h0IC0gbGVmdCAtIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IHBhcmVudFRvcCA9IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBmaW5hbCBpbnQgcGFyZW50Qm90dG9tID0gYm90dG9tIC0gdG9wIC0gZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbUluc3RhbmNlLmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgaW50IGNoaWxkTGVmdDsKLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRUb3A7Ci0KLSAgICAgICAgICAgICAgICBjaGlsZExlZnQgPSBwYXJlbnRMZWZ0ICsgKHBhcmVudFJpZ2h0IC0gcGFyZW50TGVmdCAtIHdpZHRoKSAvIDIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luOwotCi0gICAgICAgICAgICAgICAgY2hpbGRUb3AgPSBwYXJlbnRUb3AgKyAocGFyZW50Qm90dG9tIC0gcGFyZW50VG9wIC0gaGVpZ2h0KSAvIDIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbHAudG9wTWFyZ2luIC0gbHAuYm90dG9tTWFyZ2luOwotCi0gICAgICAgICAgICAgICAgY2hpbGQubGF5b3V0KGNoaWxkTGVmdCwgY2hpbGRUb3AsIGNoaWxkTGVmdCArIHdpZHRoLCBjaGlsZFRvcCArIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nTGVmdCgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdMZWZ0KCkgKyAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSArIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nVG9wKCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ1RvcCgpICsgMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdCb3R0b20oKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nQm90dG9tKCkgKyAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmYxNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sVmlldzJJbXBsIGV4dGVuZHMgQmFzZUxheW91dCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sVmlldzIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xWaWV3MiBtSW5zdGFuY2U7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOID0gImZ1bGxTY3JlZW4iOwotCi0gICAgLy8gVE9ETzogTW92ZSB0aGVzZSBjb25zdGFudHMgdG8gcHVibGljIGFwaSB0byBzdXBwb3J0IGN1c3RvbSB2aWRlbyB2aWV3LgotICAgIC8vIFRPRE86IENvbWJpbmUgdGhlc2UgY29uc3RhbnRzIGludG8gb25lIHJlZ2FyZGluZyBUcmFja0luZm8uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVklERU9fVFJBQ0tfQ09VTlQgPSAiVmlkZW9UcmFja0NvdW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19UUkFDS19DT1VOVCA9ICJBdWRpb1RyYWNrQ291bnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5UID0gIlN1YnRpdGxlVHJhY2tDb3VudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1BFRUQgPSAiUGxheWJhY2tTcGVlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfQVVESU9fSU5ERVggPSAiU2VsZWN0ZWRBdWRpb0luZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCA9ICJTZWxlY3RlZFN1YnRpdGxlSW5kZXgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUyA9ICJVcGRhdGVUcmFja1N0YXR1cyI7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBvbmNlIGludGVncmF0aW5nIHdpdGggTWVkaWFTZXNzaW9uMiAmIE1lZGlhTWV0YWRhdGEyCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCA9ICJNZWRpYVR5cGVBZHZlcnRpc2VtZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUyA9ICJVcGRhdGVNZWRpYVR5cGVTdGF0dXMiOwotCi0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2hvdyBzdWJ0aXRsZSB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NIT1dfU1VCVElUTEUgPSAic2hvd1N1YnRpdGxlIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBoaWRlIHN1YnRpdGxlIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfSElERV9TVUJUSVRMRSA9ICJoaWRlU3VidGl0bGUiOwotICAgIC8vIFRPRE86IHJlbW92ZSBvbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyByZXZpc2VkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfRlVMTFNDUkVFTiA9ICJzZXRGdWxsc2NyZWVuIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzZWxlY3QgYXVkaW8gdHJhY2sgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0sgPSAiU2VsZWN0VHJhY2siOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNldCBwbGF5YmFjayBzcGVlZCB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRCA9ICJTZXRQbGF5YmFja1NwZWVkIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBtdXRlIGF1ZGlvIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTVVURT0gIk11dGUiOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHVubXV0ZSBhdWRpbyB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1VOTVVURSA9ICJVbm11dGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0sgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9IRUxQID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWSA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfTUFJTiA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NQRUVEXzF4X0lOREVYID0gMzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX0RFRkFVTFQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX01VU0lDID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9BRFZFUlRJU0VNRU5UID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRU1CRURERUQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRlVMTCA9IDE7Ci0gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIE1pbmltYWwgc2l6ZSB0eXBlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfTUlOSU1BTCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BST0dSRVNTID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFV0lORF9USU1FX01TID0gMTAwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUldBUkRfVElNRV9NUyA9IDMwMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRF9TS0lQX1dBSVRfVElNRV9NUyA9IDUwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX05PTl9FWElTVEVOVCA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9FTVBUWSA9ICIiOwotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlciBtQ29udHJvbGxlcjsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlci5UcmFuc3BvcnRDb250cm9scyBtQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlIG1QbGF5YmFja1N0YXRlOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBpbnQgbUR1cmF0aW9uOwotICAgIHByaXZhdGUgaW50IG1QcmV2U3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKLSAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKLSAgICBwcml2YXRlIGludCBtT3JpZ2luYWxMZWZ0QmFyV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvVHJhY2tDb3VudDsKLSAgICBwcml2YXRlIGludCBtQXVkaW9UcmFja0NvdW50OwotICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVRyYWNrQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdzTW9kZTsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFZpZGVvUXVhbGl0eUluZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFNwZWVkSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdzV2luZG93TWFyZ2luOwotICAgIHByaXZhdGUgaW50IG1NZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemVUeXBlOwotICAgIHByaXZhdGUgbG9uZyBtUGxheWJhY2tBY3Rpb25zOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhZ2dpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Z1bGxTY3JlZW47Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1PdmVyZmxvd0V4cGFuZGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTdG9wcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVJc0VuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TZWVrQXZhaWxhYmxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBZHZlcnRpc2VtZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNdXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFVYVXBkYXRlOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtUm9vdDsKLSAgICBwcml2YXRlIFZpZXcgbVRpdGxlQmFyOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIFZpZXcgbUFkRXh0ZXJuYWxMaW5rOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUJhY2tCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQnV0dG9uIG1Sb3V0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtUm91dGVTZWxlY3RvcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUNlbnRlclZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UcmFuc3BvcnRDb250cm9sczsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5UGF1c2VCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtRmZ3ZEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1SZXdCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtTmV4dEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QcmV2QnV0dG9uOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gTWluaW1hbCBFeHRyYSBWaWV3Ci0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1pbmltYWxFeHRyYVZpZXc7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIgVmlldwotICAgIHByaXZhdGUgUHJvZ3Jlc3NCYXIgbVByb2dyZXNzOwotICAgIHByaXZhdGUgVmlldyBtUHJvZ3Jlc3NCdWZmZXI7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBMZWZ0IFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyTGVmdFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbVRpbWVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUVuZFRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ3VycmVudFRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQWRTa2lwVmlldzsKLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbUZvcm1hdEJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBGb3JtYXR0ZXIgbUZvcm1hdHRlcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgUmlnaHQgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1Cb3R0b21CYXJSaWdodFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJhc2ljQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUV4dHJhQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUN1c3RvbUJ1dHRvbnM7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU3VidGl0bGVCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtRnVsbFNjcmVlbkJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PdmVyZmxvd0J1dHRvblJpZ2h0OwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU92ZXJmbG93QnV0dG9uTGVmdDsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1NdXRlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVZpZGVvUXVhbGl0eUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1TZXR0aW5nc0J1dHRvbjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1BZFJlbWFpbmluZ1ZpZXc7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBTZXR0aW5ncyBMaXN0IFZpZXcKLSAgICBwcml2YXRlIExpc3RWaWV3IG1TZXR0aW5nc0xpc3RWaWV3OwotICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVNldHRpbmdzV2luZG93OwotICAgIHByaXZhdGUgU2V0dGluZ3NBZGFwdGVyIG1TZXR0aW5nc0FkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBTdWJTZXR0aW5nc0FkYXB0ZXIgbVN1YlNldHRpbmdzQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU2V0dGluZ3NNYWluVGV4dHNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TZXR0aW5nc1N1YlRleHRzTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gbVNldHRpbmdzSWNvbklkc0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtQXVkaW9UcmFja0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVZpZGVvUXVhbGl0eUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVBsYXliYWNrU3BlZWRUZXh0TGlzdDsKLSAgICBwcml2YXRlIExpc3Q8RmxvYXQ+IG1QbGF5YmFja1NwZWVkTGlzdDsKLQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIG1SZXNvdXJjZXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICAvLyBJbmZsYXRlIE1lZGlhQ29udHJvbFZpZXcyIGZyb20gWE1MCi0gICAgICAgIG1Sb290ID0gbWFrZUNvbnRyb2xsZXJWaWV3KCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1Sb290KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb25Ub2tlbl9pbXBsKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPbkZ1bGxTY3JlZW5MaXN0ZW5lcl9pbXBsKE1lZGlhQ29udHJvbFZpZXcyLk9uRnVsbFNjcmVlbkxpc3RlbmVyIGwpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyX2ltcGwoTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMgPSBjb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCk7Ci0gICAgICAgICAgICAvLyBTZXQgbU1ldGFkYXRhIGFuZCBtUGxheWJhY2tTdGF0ZSB0byBleGlzdGluZyBNZWRpYVNlc3Npb24gdmFyaWFibGVzIHNpbmNlIHRoZXkgbWF5Ci0gICAgICAgICAgICAvLyBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQKLSAgICAgICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgbU1ldGFkYXRhID0gbUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uKCk7Ci0gICAgICAgICAgICB1cGRhdGVUaXRsZSgpOwotCi0gICAgICAgICAgICBtQ29udHJvbGxlci5yZWdpc3RlckNhbGxiYWNrKG5ldyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1dHRvblZpc2liaWxpdHlfaW1wbChpbnQgYnV0dG9uLCBpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICAvLyBUT0RPOiBhZGQgbWVtYmVyIHZhcmlhYmxlcyBmb3IgRmFzdC1Gb3J3YXJkL1BydmlvdXMvUmV3aW5kIGJ1dHRvbnMgdG8gc2F2ZSB2aXNpYmlsaXR5IGluCi0gICAgICAgIC8vIG9yZGVyIHRvIHByZXZlbnQgYmVpbmcgb3ZlcnJpZGVuIGluc2lkZSB1cGRhdGVMYXlvdXQoKS4KLSAgICAgICAgc3dpdGNoIChidXR0b24pIHsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1BMQVlfUEFVU0U6Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCAmJiBjYW5QYXVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9GRldEOgotICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsICYmIGNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9SRVc6Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCAmJiBjYW5TZWVrQmFja3dhcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fTkVYVDoKLSAgICAgICAgICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1BSRVY6Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9TVUJUSVRMRToKLSAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlQnV0dG9uICE9IG51bGwgJiYgbVN1YnRpdGxlVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fRlVMTF9TQ1JFRU46Ci0gICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9PVkVSRkxPVzoKLSAgICAgICAgICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodC5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX01VVEU6Ci0gICAgICAgICAgICAgICAgaWYgKG1NdXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9TRVRUSU5HUzoKLSAgICAgICAgICAgICAgICBpZiAobVNldHRpbmdzQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RQbGF5QnV0dG9uRm9jdXNfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5yZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gTWVkaWFDb250cm9sVmlldzIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBmdW5jdGlvbiBiZSByZW1vdmVkPwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBzdXBlci5vbk1lYXN1cmVfaW1wbCh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIGxheW91dCB3aGVuIHRoaXMgdmlldydzIHdpZHRoIGNoYW5nZXMgaW4gb3JkZXIgdG8gYXZvaWQgYW55IFVJIG92ZXJsYXAgYmV0d2VlbgotICAgICAgICAvLyB0cmFuc3BvcnQgY29udHJvbHMuCi0gICAgICAgIGlmIChtUHJldldpZHRoICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKLSAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSB8fCBtTmVlZFVYVXBkYXRlKSB7Ci0gICAgICAgICAgICAvLyBEaXNtaXNzIFNldHRpbmdzV2luZG93IGlmIGl0IGlzIHNob3dpbmcuCi0gICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotCi0gICAgICAgICAgICAvLyBUaGVzZSB2aWV3cyBtYXkgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZCB5ZXQuCi0gICAgICAgICAgICBpZiAobVRyYW5zcG9ydENvbnRyb2xzLmdldFdpZHRoKCkgPT0gMCB8fCBtVGltZVZpZXcuZ2V0V2lkdGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY3VycldpZHRoID0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICBXaW5kb3dNYW5hZ2VyIG1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLSAgICAgICAgICAgIFBvaW50IHNjcmVlblNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgICAgIG1hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRTaXplKHNjcmVlblNpemUpOwotICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoID0gc2NyZWVuU2l6ZS54OwotICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKLSAgICAgICAgICAgIGludCBmdWxsSWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZnVsbF9pY29uX3NpemUpOwotICAgICAgICAgICAgaW50IGVtYmVkZGVkSWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSk7Ci0gICAgICAgICAgICBpbnQgbWFyZ2luU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9pY29uX21hcmdpbik7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBBZHZlcnRpc2VtZW50IE1vZGUuCi0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIGljb25zIGluc2lkZSBCb3R0b21CYXJSaWdodFZpZXcgZm9yIE11c2ljIG1vZGUgaXMgNC4KLSAgICAgICAgICAgICAgICBpbnQgbWF4SWNvbkNvdW50ID0gNDsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQobWF4SWNvbkNvdW50LCBmdWxsSWNvblNpemUsIGVtYmVkZGVkSWNvblNpemUsIG1hcmdpblNpemUsIGN1cnJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJIZWlnaHQsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBpZiAobU5lZWRVWFVwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPbmUtdGltZSBvcGVyYXRpb24gZm9yIE11c2ljIG1lZGlhIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMucmVtb3ZlVmlldyhtTXV0ZUJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLmFkZFZpZXcobU11dGVCdXR0b24sIDApOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTmVlZFVYVXBkYXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIGljb25zIGluc2lkZSBCb3R0b21CYXJSaWdodFZpZXcgZm9yIE11c2ljIG1vZGUgaXMgMy4KLSAgICAgICAgICAgICAgICBpbnQgbWF4SWNvbkNvdW50ID0gMzsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQobWF4SWNvbkNvdW50LCBmdWxsSWNvblNpemUsIGVtYmVkZGVkSWNvblNpemUsIG1hcmdpblNpemUsIGN1cnJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJIZWlnaHQsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVByZXZXaWR0aCA9IGN1cnJXaWR0aDsKLSAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gY3VyckhlaWdodDsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24uCi0gICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBiYXIgcGFyYW1ldGVycyBpbiBvcmRlciB0byBhdm9pZCBvdmVybGFwIGJldHdlZW4gdGl0bGUgdmlldyBhbmQgdGhlIHJpZ2h0Ci0gICAgICAgIC8vIHNpZGUgb2YgdGhlIHRpdGxlIGJhci4KLSAgICAgICAgdXBkYXRlVGl0bGVCYXJMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIHN1cGVyLnNldEVuYWJsZWRfaW1wbChlbmFibGVkKTsKLQotICAgICAgICAvLyBUT0RPOiBNZXJnZSB0aGUgYmVsb3cgY29kZSB3aXRoIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKS4KLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoYm9vbGVhbiBpc1Zpc2libGUpIHsKLSAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGlzVmlzaWJsZSk7Ci0KLSAgICAgICAgaWYgKGlzVmlzaWJsZSkgewotICAgICAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIG1Sb3V0ZVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIGlmIChtUm91dGVTZWxlY3RvciAhPSBudWxsICYmICFtUm91dGVTZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pOwotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWSk7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGxheWluZygpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q3VycmVudFBvc2l0aW9uKCkgewotICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBtUGxheWJhY2tTdGF0ZS5nZXRQb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEJ1ZmZlclBlcmNlbnRhZ2UoKSB7Ci0gICAgICAgIGlmIChtRHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb25nIGJ1ZmZlcmVkUG9zID0gbVBsYXliYWNrU3RhdGUuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIChidWZmZXJlZFBvcyA9PSAtMSkgPyAtMSA6IChpbnQpIChidWZmZXJlZFBvcyAqIDEwMCAvIG1EdXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblBhdXNlKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkgIT0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2Vla0JhY2t3YXJkKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZWtGb3J3YXJkKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2aWV3IHRoYXQgaG9sZHMgdGhlIHdpZGdldHMgdGhhdCBjb250cm9sIHBsYXliYWNrLgotICAgICAqIERlcml2ZWQgY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBjcmVhdGUgdGhlaXIgb3duLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udHJvbGxlciB2aWV3LgotICAgICAqIEBoaWRlIFRoaXMgZG9lc24ndCB3b3JrIGFzIGFkdmVydGlzZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmlld0dyb3VwIG1ha2VDb250cm9sbGVyVmlldygpIHsKLSAgICAgICAgVmlld0dyb3VwIHJvb3QgPSAoVmlld0dyb3VwKSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1lZGlhX2NvbnRyb2xsZXIpOwotICAgICAgICBpbml0Q29udHJvbGxlclZpZXcocm9vdCk7Ci0gICAgICAgIHJldHVybiByb290OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0Q29udHJvbGxlclZpZXcoVmlld0dyb3VwIHYpIHsKLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyIFZpZXcKLSAgICAgICAgbVRpdGxlQmFyID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXIpOwotICAgICAgICBtVGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZV90ZXh0KTsKLSAgICAgICAgbUFkRXh0ZXJuYWxMaW5rID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9leHRlcm5hbF9saW5rKTsKLSAgICAgICAgbUJhY2tCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJhY2spOwotICAgICAgICBpZiAobUJhY2tCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1CYWNrTGlzdGVuZXIpOwotICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIG1Sb3V0ZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY2FzdCk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgbUNlbnRlclZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmNlbnRlcl92aWV3KTsKLSAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmVtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgIG1DZW50ZXJWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBNaW5pbWFsIEV4dHJhIFZpZXcKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcgPSAoTGluZWFyTGF5b3V0KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1pbmltYWxfZXh0cmFfdmlldyk7Ci0gICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0KLSAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgbU1pbmltYWxFeHRyYVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGludCBpY29uU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9pY29uX3NpemUpOwotICAgICAgICBpbnQgbWFyZ2luU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9pY29uX21hcmdpbik7Ci0gICAgICAgIHBhcmFtcy5zZXRNYXJnaW5zKDAsIChpY29uU2l6ZSArIG1hcmdpblNpemUgKiAyKSAqICgtMSksIDAsIDApOwotICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhciBWaWV3Ci0gICAgICAgIG1Qcm9ncmVzcyA9IHYuZmluZFZpZXdCeUlkKFIuaWQucHJvZ3Jlc3MpOwotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3MgaW5zdGFuY2VvZiBTZWVrQmFyKSB7Ci0gICAgICAgICAgICAgICAgU2Vla0JhciBzZWVrZXIgPSAoU2Vla0JhcikgbVByb2dyZXNzOwotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtU2Vla0xpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0UHJvZ3Jlc3NEcmF3YWJsZShtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzKSk7Ci0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRNYXgoTUFYX1BST0dSRVNTKTsKLSAgICAgICAgfQotICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByb2dyZXNzX2J1ZmZlcik7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXIpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgTGVmdCBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXJMZWZ0VmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYm90dG9tX2Jhcl9sZWZ0KTsKLSAgICAgICAgbVRpbWVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lKTsKLSAgICAgICAgbUVuZFRpbWUgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpbWVfZW5kKTsKLSAgICAgICAgbUN1cnJlbnRUaW1lID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lX2N1cnJlbnQpOwotICAgICAgICBtQWRTa2lwVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfc2tpcF90aW1lKTsKLSAgICAgICAgbUZvcm1hdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBtRm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihtRm9ybWF0QnVpbGRlciwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBSaWdodCBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXJSaWdodFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXJfcmlnaHQpOwotICAgICAgICBtQmFzaWNDb250cm9scyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYmFzaWNfY29udHJvbHMpOwotICAgICAgICBtRXh0cmFDb250cm9scyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZXh0cmFfY29udHJvbHMpOwotICAgICAgICBtQ3VzdG9tQnV0dG9ucyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY3VzdG9tX2J1dHRvbnMpOwotICAgICAgICBtU3VidGl0bGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnN1YnRpdGxlKTsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdWJ0aXRsZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgIGlmIChtRnVsbFNjcmVlbkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyBUT0RPOiBTaG93IEZ1bGxzY3JlZW4gYnV0dG9uIHdoZW4gb25seSBpdCBpcyBwb3NzaWJsZS4KLSAgICAgICAgfQotICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodCA9IHYuZmluZFZpZXdCeUlkKFIuaWQub3ZlcmZsb3dfcmlnaHQpOwotICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQuc2V0T25DbGlja0xpc3RlbmVyKG1PdmVyZmxvd1JpZ2h0TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1PdmVyZmxvd0J1dHRvbkxlZnQgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm92ZXJmbG93X2xlZnQpOwotICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uTGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25MZWZ0LnNldE9uQ2xpY2tMaXN0ZW5lcihtT3ZlcmZsb3dMZWZ0TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1NdXRlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5tdXRlKTsKLSAgICAgICAgaWYgKG1NdXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtTXV0ZUJ1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtU2V0dGluZ3NCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnNldHRpbmdzKTsKLSAgICAgICAgaWYgKG1TZXR0aW5nc0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TZXR0aW5nc0J1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC52aWRlb19xdWFsaXR5KTsKLSAgICAgICAgaWYgKG1WaWRlb1F1YWxpdHlCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVZpZGVvUXVhbGl0eUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtQWRSZW1haW5pbmdWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9yZW1haW5pbmcpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFNldHRpbmdzIExpc3QgVmlldwotICAgICAgICBpbml0aWFsaXplU2V0dGluZ3NMaXN0cygpOwotICAgICAgICBtU2V0dGluZ3NMaXN0VmlldyA9IChMaXN0VmlldykgQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5zZXR0aW5nc19saXN0KTsKLSAgICAgICAgbVNldHRpbmdzQWRhcHRlciA9IG5ldyBTZXR0aW5nc0FkYXB0ZXIobVNldHRpbmdzTWFpblRleHRzTGlzdCwgbVNldHRpbmdzU3ViVGV4dHNMaXN0LAotICAgICAgICAgICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0KTsKLSAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlciA9IG5ldyBTdWJTZXR0aW5nc0FkYXB0ZXIobnVsbCwgMCk7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldEFkYXB0ZXIobVNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldENob2ljZU1vZGUoTGlzdFZpZXcuQ0hPSUNFX01PREVfU0lOR0xFKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtU2V0dGluZ3NJdGVtQ2xpY2tMaXN0ZW5lcik7Ci0KLSAgICAgICAgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGggPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgpOwotICAgICAgICBtRnVsbFNldHRpbmdzSXRlbVdpZHRoID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2Z1bGxfc2V0dGluZ3Nfd2lkdGgpOwotICAgICAgICBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0KTsKLSAgICAgICAgbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQpOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3dNYXJnaW4gPSAoLTEpICogbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX3NldHRpbmdzX29mZnNldCk7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdyA9IG5ldyBQb3B1cFdpbmRvdyhtU2V0dGluZ3NMaXN0VmlldywgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGgsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGUgcGF1c2Ugb3Igc2VlayBidXR0b25zIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIHBhdXNlZCBvciBzZWVrZWQuCi0gICAgICogVGhpcyByZXF1aXJlcyB0aGUgY29udHJvbCBpbnRlcmZhY2UgdG8gYmUgYSBNZWRpYVBsYXllckNvbnRyb2xFeHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwgJiYgIWNhblBhdXNlKCkpIHsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCAmJiAhY2FuU2Vla0JhY2t3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwgJiYgIWNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8gV2hhdCB3ZSByZWFsbHkgc2hvdWxkIGRvIGlzIGFkZCBhIGNhblNlZWsgdG8gdGhlIE1lZGlhUGxheWVyQ29udHJvbCBpbnRlcmZhY2U7Ci0gICAgICAgICAgICAvLyB0aGlzIHNjaGVtZSBjYW4gYnJlYWsgdGhlIGNhc2Ugd2hlbiBhcHBsaWNhdGlvbnMgd2FudCB0byBhbGxvdyBzZWVrIHRocm91Z2ggdGhlCi0gICAgICAgICAgICAvLyBwcm9ncmVzcyBiYXIgYnV0IGRpc2FibGUgZm9yd2FyZC9iYWNrd2FyZCBidXR0b25zLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGN1cnJlbnRseSB0aGUgZmxhZ3MgU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUsIFNFRUtfRk9SV0FSRF9BVkFJTEFCTEUsCi0gICAgICAgICAgICAvLyBhbmQgU0VFS19BVkFJTEFCTEUgYXJlIGFsbCAodW4pc2V0IHRvZ2V0aGVyOyBhcyBzdWNoIHRoZSBhZm9yZW1lbnRpb25lZCBpc3N1ZQotICAgICAgICAgICAgLy8gc2hvdWxkbid0IGFyaXNlIGluIGV4aXN0aW5nIGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCAmJiAhY2FuU2Vla0JhY2t3YXJkKCkgJiYgIWNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IgZXgpIHsKLSAgICAgICAgICAgIC8vIFdlIHdlcmUgZ2l2ZW4gYW4gb2xkIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZSwgdGhhdCBkb2Vzbid0IGhhdmUKLSAgICAgICAgICAgIC8vIHRoZSBjYW5QYXVzZS9jYW5TZWVrWFlaIG1ldGhvZHMuIFRoaXMgaXMgT0ssIGl0IGp1c3QgbWVhbnMgd2UKLSAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgbWVkaWEgY2FuIGJlIHBhdXNlZCBhbmQgc2Vla2VkLCBhbmQgc28gd2UgZG9uJ3QgZGlzYWJsZQotICAgICAgICAgICAgLy8gdGhlIGJ1dHRvbnMuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1VcGRhdGVQcm9ncmVzcyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBzZXRQcm9ncmVzcygpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1Nob3dpbmcgPSBtSW5zdGFuY2UuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKLSAgICAgICAgICAgIGlmICghbURyYWdnaW5nICYmIGlzU2hvd2luZyAmJiBpc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0RGVsYXllZChtVXBkYXRlUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TIC0gKHBvcyAlIERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzdHJpbmdGb3JUaW1lKGludCB0aW1lTXMpIHsKLSAgICAgICAgaW50IHRvdGFsU2Vjb25kcyA9IHRpbWVNcyAvIDEwMDA7Ci0KLSAgICAgICAgaW50IHNlY29uZHMgPSB0b3RhbFNlY29uZHMgJSA2MDsKLSAgICAgICAgaW50IG1pbnV0ZXMgPSAodG90YWxTZWNvbmRzIC8gNjApICUgNjA7Ci0gICAgICAgIGludCBob3VycyA9IHRvdGFsU2Vjb25kcyAvIDM2MDA7Ci0KLSAgICAgICAgbUZvcm1hdEJ1aWxkZXIuc2V0TGVuZ3RoKDApOwotICAgICAgICBpZiAoaG91cnMgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZvcm1hdHRlci5mb3JtYXQoIiVkOiUwMmQ6JTAyZCIsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZXIuZm9ybWF0KCIlMDJkOiUwMmQiLCBtaW51dGVzLCBzZWNvbmRzKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgc2V0UHJvZ3Jlc3MoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbGxlciA9PSBudWxsIHx8IG1EcmFnZ2luZykgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHBvc2l0aW9uT25Qcm9ncmVzc0JhciA9IDA7Ci0gICAgICAgIGludCBjdXJyZW50UG9zaXRpb24gPSBnZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKG1EdXJhdGlvbiA+IDApIHsKLSAgICAgICAgICAgIHBvc2l0aW9uT25Qcm9ncmVzc0JhciA9IChpbnQpIChNQVhfUFJPR1JFU1MgKiAobG9uZykgY3VycmVudFBvc2l0aW9uIC8gbUR1cmF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwgJiYgY3VycmVudFBvc2l0aW9uICE9IG1EdXJhdGlvbikgewotICAgICAgICAgICAgbVByb2dyZXNzLnNldFByb2dyZXNzKHBvc2l0aW9uT25Qcm9ncmVzc0Jhcik7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgbWVkaWEgaXMgYSBsb2NhbCBmaWxlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBhIGJ1ZmZlciwgc28gc2V0IHNlY29uZGFyeQotICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgdG8gbWF4aW11bS4KLSAgICAgICAgICAgIGlmIChnZXRCdWZmZXJQZXJjZW50YWdlKCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldFNlY29uZGFyeVByb2dyZXNzKE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRTZWNvbmRhcnlQcm9ncmVzcyhnZXRCdWZmZXJQZXJjZW50YWdlKCkgKiAxMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUVuZFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVuZFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKG1EdXJhdGlvbikpOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DdXJyZW50VGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKGN1cnJlbnRQb3NpdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBzZWNvbmRzIHVudGlsIHRoZSBmaXJzdCA1IHNlY29uZHMgb2YgdGhlCi0gICAgICAgICAgICAvLyBhZHZlcnRpc2VtZW50LgotICAgICAgICAgICAgaWYgKG1BZFNraXBWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc2l0aW9uIDw9IEFEX1NLSVBfV0FJVF9USU1FX01TKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNraXBUaW1lVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2FkX3NraXBfd2FpdF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURfU0tJUF9XQUlUX1RJTUVfTVMgLSBjdXJyZW50UG9zaXRpb24pIC8gMTAwMCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VGV4dChza2lwVGltZVRleHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uY2xlYXJDb2xvckZpbHRlcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhlIGFkdmVydGlzZW1lbnQuCi0gICAgICAgICAgICBpZiAobUFkUmVtYWluaW5nVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZ1RpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1EdXJhdGlvbiAtIGN1cnJlbnRQb3NpdGlvbiA8IDApID8gMCA6IChtRHVyYXRpb24gLSBjdXJyZW50UG9zaXRpb24pOwotICAgICAgICAgICAgICAgIFN0cmluZyByZW1haW5pbmdUaW1lVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdGb3JUaW1lKHJlbWFpbmluZ1RpbWUpKTsKLSAgICAgICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFRleHQocmVtYWluaW5nVGltZVRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UG9zaXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZVBhdXNlUGxheVN0YXRlKCkgewotICAgICAgICBpZiAoaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5wYXVzZSgpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMucGxheSgpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZXJlIGFyZSB0d28gc2NlbmFyaW9zIHRoYXQgY2FuIHRyaWdnZXIgdGhlIHNlZWtiYXIgbGlzdGVuZXIgdG8gdHJpZ2dlcjoKLSAgICAvLwotICAgIC8vIFRoZSBmaXJzdCBpcyB0aGUgdXNlciB1c2luZyB0aGUgdG91Y2hwYWQgdG8gYWRqdXN0IHRoZSBwb3NpdGl0b24gb2YgdGhlCi0gICAgLy8gc2Vla2JhcidzIHRodW1iLiBJbiB0aGlzIGNhc2Ugb25TdGFydFRyYWNraW5nVG91Y2ggaXMgY2FsbGVkIGZvbGxvd2VkIGJ5Ci0gICAgLy8gYSBudW1iZXIgb2Ygb25Qcm9ncmVzc0NoYW5nZWQgbm90aWZpY2F0aW9ucywgY29uY2x1ZGVkIGJ5IG9uU3RvcFRyYWNraW5nVG91Y2guCi0gICAgLy8gV2UncmUgc2V0dGluZyB0aGUgZmllbGQgIm1EcmFnZ2luZyIgdG8gdHJ1ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBkcmFnZ2luZwotICAgIC8vIHNlc3Npb24gdG8gYXZvaWQganVtcHMgaW4gdGhlIHBvc2l0aW9uIGluIGNhc2Ugb2Ygb25nb2luZyBwbGF5YmFjay4KLSAgICAvLwotICAgIC8vIFRoZSBzZWNvbmQgc2NlbmFyaW8gaW52b2x2ZXMgdGhlIHVzZXIgb3BlcmF0aW5nIHRoZSBzY3JvbGwgYmFsbCwgaW4gdGhpcwotICAgIC8vIGNhc2UgdGhlcmUgV09OJ1QgQkUgb25TdGFydFRyYWNraW5nVG91Y2gvb25TdG9wVHJhY2tpbmdUb3VjaCBub3RpZmljYXRpb25zLAotICAgIC8vIHdlIHdpbGwgc2ltcGx5IGFwcGx5IHRoZSB1cGRhdGVkIHBvc2l0aW9uIHdpdGhvdXQgc3VzcGVuZGluZyByZWd1bGFyIHVwZGF0ZXMuCi0gICAgcHJpdmF0ZSBmaW5hbCBPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciBtU2Vla0xpc3RlbmVyID0gbmV3IE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBiYXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmFnZ2luZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIEJ5IHJlbW92aW5nIHRoZXNlIHBlbmRpbmcgcHJvZ3Jlc3MgbWVzc2FnZXMgd2UgbWFrZSBzdXJlCi0gICAgICAgICAgICAvLyB0aGF0IGEpIHdlIHdvbid0IHVwZGF0ZSB0aGUgcHJvZ3Jlc3Mgd2hpbGUgdGhlIHVzZXIgYWRqdXN0cwotICAgICAgICAgICAgLy8gdGhlIHNlZWtiYXIgYW5kIGIpIG9uY2UgdGhlIHVzZXIgaXMgZG9uZSBkcmFnZ2luZyB0aGUgdGh1bWIKLSAgICAgICAgICAgIC8vIHdlIHdpbGwgcG9zdCBvbmUgb2YgdGhlc2UgbWVzc2FnZXMgdG8gdGhlIHF1ZXVlIGFnYWluIGFuZAotICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlcmUgd2lsbCBiZSBleGFjdGx5IG9uZSBtZXNzYWdlIHF1ZXVlZCB1cC4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcGxheWJhY2sgaXMgY3VycmVudGx5IHN0b3BwZWQuIEluIHRoaXMgY2FzZSwgdXBkYXRlIHRoZSBwYXVzZSBidXR0b24gdG8KLSAgICAgICAgICAgIC8vIHNob3cgdGhlIHBsYXkgaW1hZ2UgaW5zdGVhZCBvZiB0aGUgcmVwbGF5IGltYWdlLgotICAgICAgICAgICAgaWYgKG1Jc1N0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNTdG9wcGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBiYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgaWYgKCFtU2Vla0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiBwcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlZCBjaGFuZ2VzIHRvCi0gICAgICAgICAgICAgICAgLy8gdGhlIHByb2dyZXNzIGJhcidzIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRHVyYXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gKGludCkgKCgobG9uZykgbUR1cmF0aW9uICogcHJvZ3Jlc3MpIC8gTUFYX1BST0dSRVNTKTsKLSAgICAgICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvc2l0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBiYXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRHJhZ2dpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgcHJvZ3Jlc3MgaXMgcHJvcGVybHkgdXBkYXRlZCBpbiB0aGUgZnV0dXJlLAotICAgICAgICAgICAgLy8gdGhlIGNhbGwgdG8gc2hvdygpIGRvZXMgbm90IGd1YXJhbnRlZSB0aGlzIGJlY2F1c2UgaXQgaXMgYQotICAgICAgICAgICAgLy8gbm8tb3AgaWYgd2UgYXJlIGFscmVhZHkgc2hvd2luZy4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUGxheVBhdXNlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdG9nZ2xlUGF1c2VQbGF5U3RhdGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1SZXdMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgLSBSRVdJTkRfVElNRV9NUzsKLSAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zKTsKLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRmZ3ZExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBnZXRDdXJyZW50UG9zaXRpb24oKSArIEZPUldBUkRfVElNRV9NUzsKLSAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zKTsKLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtTmV4dExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5za2lwVG9OZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUHJldkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5za2lwVG9QcmV2aW91cygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUJhY2tMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0KTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVZpZGVvUXVhbGl0eUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1WaWRlb1F1YWxpdHlMaXN0KTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleCk7Ci0gICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRnVsbFNjcmVlbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNFbnRlcmluZ0Z1bGxTY3JlZW4gPSAhbUlzRnVsbFNjcmVlbjsKLSAgICAgICAgICAgIC8vIFRPRE86IFJlLWFycmFuZ2UgdGhlIGJ1dHRvbiBsYXlvdXRzIGFjY29yZGluZyB0byB0aGUgVVguCi0gICAgICAgICAgICBpZiAoaXNFbnRlcmluZ0Z1bGxTY3JlZW4pIHsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW5fZXhpdCwgbnVsbCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW4sIG51bGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYXJncy5wdXRCb29sZWFuKEFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOLCBpc0VudGVyaW5nRnVsbFNjcmVlbik7Ci0gICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1NFVF9GVUxMU0NSRUVOLCBhcmdzLCBudWxsKTsKLQotICAgICAgICAgICAgbUlzRnVsbFNjcmVlbiA9IGlzRW50ZXJpbmdGdWxsU2NyZWVuOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU92ZXJmbG93UmlnaHRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQmFzaWNDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtRXh0cmFDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtT3ZlcmZsb3dMZWZ0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU11dGVCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011dGUpIHsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX211dGUsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211dGVkX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9NVVRFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY191bm11dGUsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3VubXV0ZWRfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNNdXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9VTk1VVEUsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVNldHRpbmdzQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfTUFJTjsKLSAgICAgICAgICAgIG1TZXR0aW5nc0FkYXB0ZXIuc2V0U3ViVGV4dHMobVNldHRpbmdzU3ViVGV4dHNMaXN0KTsKLSAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbVNldHRpbmdzSXRlbUNsaWNrTGlzdGVuZXIKLSAgICAgICAgICAgID0gbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TZXR0aW5nc01vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfTUFJTjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobUF1ZGlvVHJhY2tMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT0gU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtUGxheWJhY2tTcGVlZFRleHRMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRTcGVlZEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfSEVMUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRJbnQoS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLCBwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0ssIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5nZXRNYWluVGV4dChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZFNwZWVkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFNwZWVkSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEZsb2F0KEtFWV9QTEFZQkFDS19TUEVFRCwgbVBsYXliYWNrU3BlZWRMaXN0LmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQsIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5nZXRNYWluVGV4dChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9IRUxQOgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0SW50KEtFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwgcG9zaXRpb24gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NIT1dfU1VCVElUTEUsIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zdWJ0aXRsZV9vbiwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX2NjX2lzX29uKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlSXNFbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9ISURFX1NVQlRJVExFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zdWJ0aXRsZV9vZmYsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9jY19pc19vZmYpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUlzRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZOgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgdmlkZW8gcXVhbGl0eQotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleCA9IHBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRHVyYXRpb24oKSB7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTikpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSBtTWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTik7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGUoKSB7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIHRpdGxlIGJhciBpcyBtYWRlIHVwIG9mIHR3byBzZXBhcmF0ZSBMaW5lYXJMYXlvdXRzLiBJZiB0aGUgc3VtIG9mIHRoZSB0d28gYmFycyBhcmUKLSAgICAvLyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgdGl0bGUgYmFyLCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxlZnQgYmFyICh3aGljaCBtYWtlcyB0aGUKLSAgICAvLyBUZXh0VmlldyB0aGF0IGNvbnRhaW5zIHRoZSB0aXRsZSBvZiB0aGUgbWVkaWEgZmlsZSBzaHJpbmspLgotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZUJhckxheW91dCgpIHsKLSAgICAgICAgaWYgKG1UaXRsZUJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgdGl0bGVCYXJXaWR0aCA9IG1UaXRsZUJhci5nZXRXaWR0aCgpOwotCi0gICAgICAgICAgICBWaWV3IGxlZnRCYXIgPSBtVGl0bGVCYXIuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyX2xlZnQpOwotICAgICAgICAgICAgVmlldyByaWdodEJhciA9IG1UaXRsZUJhci5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXJfcmlnaHQpOwotICAgICAgICAgICAgaW50IGxlZnRCYXJXaWR0aCA9IGxlZnRCYXIuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGludCByaWdodEJhcldpZHRoID0gcmlnaHRCYXIuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMpIGxlZnRCYXIuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICBpZiAobGVmdEJhcldpZHRoICsgcmlnaHRCYXJXaWR0aCA+IHRpdGxlQmFyV2lkdGgpIHsKLSAgICAgICAgICAgICAgICBwYXJhbXMud2lkdGggPSB0aXRsZUJhcldpZHRoIC0gcmlnaHRCYXJXaWR0aDsKLSAgICAgICAgICAgICAgICBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggPSBsZWZ0QmFyV2lkdGg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRCYXJXaWR0aCArIHJpZ2h0QmFyV2lkdGggPCB0aXRsZUJhcldpZHRoICYmIG1PcmlnaW5hbExlZnRCYXJXaWR0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gbU9yaWdpbmFsTGVmdEJhcldpZHRoOwotICAgICAgICAgICAgICAgIG1PcmlnaW5hbExlZnRCYXJXaWR0aCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZWZ0QmFyLnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUF1ZGlvTWV0YWRhdGEoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlVGV4dCA9ICIiOwotICAgICAgICAgICAgU3RyaW5nIGFydGlzdFRleHQgPSAiIjsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKSB7Ci0gICAgICAgICAgICAgICAgdGl0bGVUZXh0ID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRpdGxlVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9BUlRJU1QpKSB7Ci0gICAgICAgICAgICAgICAgYXJ0aXN0VGV4dCA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNUKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBmb3IgRW1iZWRkZWQgc2l6ZSB0eXBlCi0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGVUZXh0ICsgIiAtICIgKyBhcnRpc3RUZXh0KTsKLQotICAgICAgICAgICAgLy8gU2V0IHRvIHRydWUgdG8gdXBkYXRlIGxheW91dCBpbnNpZGUgb25NZWFzdXJlKCkKLSAgICAgICAgICAgIG1OZWVkVVhVcGRhdGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgaWYgKG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVRpbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtQWRFeHRlcm5hbExpbmsuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldENvbG9yRmlsdGVyKFIuY29sb3IuZ3JheSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUFkRXh0ZXJuYWxMaW5rLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uY2xlYXJDb2xvckZpbHRlcigpOwotICAgICAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dChpbnQgbWF4SWNvbkNvdW50LCBpbnQgZnVsbEljb25TaXplLCBpbnQgZW1iZWRkZWRJY29uU2l6ZSwKLSAgICAgICAgICAgICBpbnQgbWFyZ2luU2l6ZSwgaW50IGN1cnJXaWR0aCwgaW50IGN1cnJIZWlnaHQsIGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCkgewotICAgICAgICBpbnQgZnVsbEJvdHRvbUJhclJpZ2h0V2lkdGhNYXggPSBmdWxsSWNvblNpemUgKiBtYXhJY29uQ291bnQKLSAgICAgICAgICAgICAgICArIG1hcmdpblNpemUgKiAobWF4SWNvbkNvdW50ICogMik7Ci0gICAgICAgIGludCBlbWJlZGRlZEJvdHRvbUJhclJpZ2h0V2lkdGhNYXggPSBlbWJlZGRlZEljb25TaXplICogbWF4SWNvbkNvdW50Ci0gICAgICAgICAgICAgICAgKyBtYXJnaW5TaXplICogKG1heEljb25Db3VudCAqIDIpOwotICAgICAgICBpbnQgZnVsbFdpZHRoID0gbVRyYW5zcG9ydENvbnRyb2xzLmdldFdpZHRoKCkgKyBtVGltZVZpZXcuZ2V0V2lkdGgoKQotICAgICAgICAgICAgICAgICsgZnVsbEJvdHRvbUJhclJpZ2h0V2lkdGhNYXg7Ci0gICAgICAgIGludCBlbWJlZGRlZFdpZHRoID0gbVRpbWVWaWV3LmdldFdpZHRoKCkgKyBlbWJlZGRlZEJvdHRvbUJhclJpZ2h0V2lkdGhNYXg7Ci0gICAgICAgIGludCBzY3JlZW5NYXhMZW5ndGggPSBNYXRoLm1heChzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLQotICAgICAgICBpZiAoZnVsbFdpZHRoID4gc2NyZWVuTWF4TGVuZ3RoKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBzY3JlZW4gbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG5lZWRlZCBmb3IgRnVsbCBzaXplLgotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0Z1bGxTaXplID0gKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9ERUZBVUxUKSA/IChjdXJyV2lkdGggPT0gc2NyZWVuTWF4TGVuZ3RoKSA6Ci0gICAgICAgICAgICAgICAgKGN1cnJXaWR0aCA9PSBzY3JlZW5XaWR0aCAmJiBjdXJySGVpZ2h0ID09IHNjcmVlbkhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGlzRnVsbFNpemUpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9GVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlbWJlZGRlZFdpZHRoIDw9IGN1cnJXaWR0aCkgewotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9FTUJFRERFRCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9NSU5JTUFMKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfTUlOSU1BTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShpbnQgc2l6ZVR5cGUpIHsKLSAgICAgICAgbVNpemVUeXBlID0gc2l6ZVR5cGU7Ci0gICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcyB0aW1lVmlld1BhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcykgbVRpbWVWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICBTZWVrQmFyIHNlZWtlciA9IChTZWVrQmFyKSBtUHJvZ3Jlc3M7Ci0gICAgICAgIHN3aXRjaCAobVNpemVUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9FTUJFRERFRDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1Cb3R0b21CYXJSaWdodFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQuZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVWaWV3UGFyYW1zLmdldFJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5yZW1vdmVSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YpOwotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5hZGRSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GLCBSLmlkLmJvdHRvbV9iYXJfbGVmdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfRlVMTDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1Cb3R0b21CYXJSaWdodFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmZ1bGxfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMsIDApOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVWaWV3UGFyYW1zLmdldFJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMucmVtb3ZlUnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRik7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLmFkZFJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRiwgUi5pZC5ib3R0b21fYmFyX3JpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9NSU5JTUFMOgotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhcgotICAgICAgICAgICAgICAgIG1UaXRsZUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gRnVsbCBTY3JlZW4gQnV0dG9uCi0gICAgICAgICAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gbU1pbmltYWxFeHRyYVZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0Lm1pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobnVsbCk7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzQnVmZmVyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtVGltZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHRpbWVWaWV3UGFyYW1zKTsKLQotICAgICAgICBpZiAoaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNGdWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbl9leGl0LCBudWxsKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbiwgbnVsbCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWaWV3IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhpbnQgbGF5b3V0SWQpIHsKLSAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOwotICAgICAgICBtUGxheVBhdXNlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5wYXVzZSk7Ci0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24ucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUGxheVBhdXNlTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1GZndkQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5mZndkKTsKLSAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRmZ3ZExpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVJld0J1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucmV3KTsKLSAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVJld0xpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgTmV4dCBhbmQgUHJldmlvdXMgYnV0dG9ucwotICAgICAgICBtTmV4dEJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQubmV4dCk7Ci0gICAgICAgIGlmIChtTmV4dEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU5leHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByZXZCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByZXYpOwotICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1QcmV2TGlzdGVuZXIpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU2V0dGluZ3NMaXN0cygpIHsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja190ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkX3RleHQpKTsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0KSk7Ci0KLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmdBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuYXJyYXkuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzKVtQTEFZQkFDS19TUEVFRF8xeF9JTkRFWF0pOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKFJFU09VUkNFX0VNUFRZKTsKLQotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QuYWRkKFIuZHJhd2FibGUuaWNfYXVkaW90cmFjayk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX2hlbHApOwotCi0gICAgICAgIG1BdWRpb1RyYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtQXVkaW9UcmFja0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotCi0gICAgICAgIG1WaWRlb1F1YWxpdHlMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1WaWRlb1F1YWxpdHlMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCkpOwotCi0gICAgICAgIG1QbGF5YmFja1NwZWVkVGV4dExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZ0FycmF5KFIuYXJyYXkuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzKSkpOwotICAgICAgICAvLyBTZWxlY3QgdGhlICIxeCIgc3BlZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgIG1TZWxlY3RlZFNwZWVkSW5kZXggPSBQTEFZQkFDS19TUEVFRF8xeF9JTkRFWDsKLQotICAgICAgICBtUGxheWJhY2tTcGVlZExpc3QgPSBuZXcgQXJyYXlMaXN0PEZsb2F0PigpOwotICAgICAgICBpbnRbXSBzcGVlZHMgPSBtUmVzb3VyY2VzLmdldEludEFycmF5KFIuYXJyYXkuc3BlZWRfbXVsdGlwbGllZF9ieV8xMDApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWVkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmxvYXQgc3BlZWQgPSAoZmxvYXQpIHNwZWVkc1tpXSAvIDEwMC4wZjsKLSAgICAgICAgICAgIG1QbGF5YmFja1NwZWVkTGlzdC5hZGQoc3BlZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhCYXNlQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIC8vIFNldCBBZGFwdGVyCi0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0KLSAgICAgICAgLy8gU2V0IHdpZHRoIG9mIHdpbmRvdwotICAgICAgICBpbnQgaXRlbVdpZHRoID0gKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRU1CRURERUQpCi0gICAgICAgICAgICAgICAgPyBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aCA6IG1GdWxsU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5zZXRXaWR0aChpdGVtV2lkdGgpOwotCi0gICAgICAgIC8vIENhbGN1bGF0ZSBoZWlnaHQgb2Ygd2luZG93IGFuZCBzaG93Ci0gICAgICAgIGludCBpdGVtSGVpZ2h0ID0gKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRU1CRURERUQpCi0gICAgICAgICAgICAgICAgPyBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQgOiBtRnVsbFNldHRpbmdzSXRlbUhlaWdodDsKLSAgICAgICAgaW50IHRvdGFsSGVpZ2h0ID0gYWRhcHRlci5nZXRDb3VudCgpICogaXRlbUhlaWdodDsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LnNob3dBc0Ryb3BEb3duKG1JbnN0YW5jZSwgbVNldHRpbmdzV2luZG93TWFyZ2luLAotICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvd01hcmdpbiAtIHRvdGFsSGVpZ2h0LCBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuUklHSFQpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXIuQ2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlIHN0YXRlKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IHN0YXRlOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgcGF1c2UgYnV0dG9uIGRlcGVuZGluZyBvbiBwbGF5YmFjayBzdGF0ZSBmb3IgdGhlIGZvbGxvd2luZyB0d28gcmVhc29uczoKLSAgICAgICAgICAgIC8vICAgMSkgTmVlZCB0byBoYW5kbGUgY2FzZSB3aGVyZSBhcHAgY3VzdG9taXplcyBwbGF5YmFjayBzdGF0ZSBiZWhhdmlvciB3aGVuIGFwcAotICAgICAgICAgICAgLy8gICAgICBhY3Rpdml0eSBpcyByZXN1bWVkLgotICAgICAgICAgICAgLy8gICAyKSBOZWVkIHRvIGhhbmRsZSBjYXNlIHdoZXJlIHRoZSBtZWRpYSBmaWxlIHJlYWNoZXMgZW5kIG9mIGR1cmF0aW9uLgotICAgICAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkgIT0gbVByZXZTdGF0ZSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3JlcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9yZXBsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1N0b3BwZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVByZXZTdGF0ZSA9IG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUGxheWJhY2tBY3Rpb25zICE9IG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSkgewotICAgICAgICAgICAgICAgIGxvbmcgbmV3QWN0aW9ucyA9IG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrQXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtU2Vla0F2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tBY3Rpb25zID0gbmV3QWN0aW9uczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIGJ1dHRvbnMgaWYgY3VzdG9tIGFjdGlvbnMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBjdXN0b21BY3Rpb25zID0gbVBsYXliYWNrU3RhdGUuZ2V0Q3VzdG9tQWN0aW9ucygpOwotICAgICAgICAgICAgbUN1c3RvbUJ1dHRvbnMucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgIGlmIChjdXN0b21BY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiA6IGN1c3RvbUFjdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VCdXR0b24gYnV0dG9uID0gbmV3IEltYWdlQnV0dG9uKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBBdHRyaWJ1dGVTZXQgKi8sIDAgLyogU3R5bGUgKi8pOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBcHBseSBSLnN0eWxlLkJvdHRvbUJhckJ1dHRvbiB0byB0aGlzIGJ1dHRvbiB1c2luZyBsaWJyYXJ5IGNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFJlZmVyIENvbnN0cnVjdG9yIHdpdGggYXJndW1lbnQgKGludCBkZWZTdHlsZVJlcykgb2YgVmlldy5qYXZhCi0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKGFjdGlvbi5nZXRJY29uKCkpOwotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0VG9vbHRpcFRleHQoYWN0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb25TdHJpbmcgPSBhY3Rpb24uZ2V0QWN0aW9uKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCB3ZSBhcmUganVzdCBzZW5kaW5nIGV4dHJhcyB0aGF0IGNhbWUgZnJvbSBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIGl0IHRoZSByaWdodCBiZWhhdmlvcj8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbHMuc2VuZEN1c3RvbUFjdGlvbihhY3Rpb25TdHJpbmcsIGFjdGlvbi5nZXRFeHRyYXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXN0b21CdXR0b25zLmFkZFZpZXcoYnV0dG9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgICAgICB1cGRhdGVEdXJhdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLSAgICAgICAgICAgIHVwZGF0ZUF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25FdmVudChTdHJpbmcgZXZlbnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9UUkFDS19TVEFUVVM6Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9WSURFT19UUkFDS19DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9uZSBvciBtb3JlIGF1ZGlvIHRyYWNrcywgYW5kIHRoaXMgaW5mb3JtYXRpb24gaGFzIG5vdCBiZWVuCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZmxlY3RlZCBpbnRvIHRoZSBTZXR0aW5ncyB3aW5kb3cgeWV0LCBhdXRvbWF0aWNhbGx5IGNoZWNrIHRoZSBmaXJzdCB0cmFjay4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgQXVkaW8gVHJhY2sgc2VsZWN0aW9uIHdpbGwgYmUgZGVmYXVsdGVkIHRvICJOb25lIi4KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX0FVRElPX1RSQUNLX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIG1vcmUgdGV4dCBhYm91dCB0cmFjayBpbmZvLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQXVkaW9UcmFja0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2sgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0LCBpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2Ugc3ViIHRleHQgaW5zaWRlIHRoZSBTZXR0aW5ncyB3aW5kb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5nZXQoMCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZChtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1RyYWNrQ291bnQgPT0gMCAmJiBtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZSA9IE1FRElBX1RZUEVfTVVTSUM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdC5hZGQobVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX29mZl90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1TdWJ0aXRsZVRyYWNrQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0cmFjayA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdHJhY2tfbnVtYmVyX3RleHQsIGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0LmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTOgotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1N0YXR1cyA9IGV4dHJhcy5nZXRCb29sZWFuKEtFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXR1cyAhPSBtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNBZHZlcnRpc2VtZW50ID0gbmV3U3RhdHVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNldHRpbmdzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1JY29uSWRzOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTWFpblRleHRzOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU3ViVGV4dHM7Ci0KLSAgICAgICAgcHVibGljIFNldHRpbmdzQWRhcHRlcihMaXN0PFN0cmluZz4gbWFpblRleHRzLCBATnVsbGFibGUgTGlzdDxTdHJpbmc+IHN1YlRleHRzLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBMaXN0PEludGVnZXI+IGljb25JZHMpIHsKLSAgICAgICAgICAgIG1NYWluVGV4dHMgPSBtYWluVGV4dHM7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgICAgIG1JY29uSWRzID0gaWNvbklkczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN1YlRleHRzKExpc3Q8U3RyaW5nPiBzdWJUZXh0cykgewotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgICAgICBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYWluVGV4dChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChtTWFpblRleHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtTWFpblRleHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU1haW5UZXh0cy5nZXQocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBSRVNPVVJDRV9FTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIChtTWFpblRleHRzID09IG51bGwpID8gMCA6IG1NYWluVGV4dHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIGNvbnRhaW5lcikgewotICAgICAgICAgICAgVmlldyByb3c7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmZ1bGxfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmVtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUZXh0VmlldyBtYWluVGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5tYWluX3RleHQpOwotICAgICAgICAgICAgVGV4dFZpZXcgc3ViVGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5zdWJfdGV4dCk7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuaWNvbik7Ci0KLSAgICAgICAgICAgIC8vIFNldCBtYWluIHRleHQKLSAgICAgICAgICAgIG1haW5UZXh0Vmlldy5zZXRUZXh0KG1NYWluVGV4dHMuZ2V0KHBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBzdWIgdGV4dCBhbmQgY2VudGVyIHRoZSBtYWluIHRleHQgaWYgc3ViIHRleHRzIGRvIG5vdCBleGlzdCBhdCBhbGwgb3IgdGhlIHN1YgotICAgICAgICAgICAgLy8gdGV4dCBhdCB0aGlzIHBhcnRpY3VsYXIgcG9zaXRpb24gaXMgZW1wdHkuCi0gICAgICAgICAgICBpZiAobVN1YlRleHRzID09IG51bGwgfHwgbVN1YlRleHRzLmdldChwb3NpdGlvbikgPT0gUkVTT1VSQ0VfRU1QVFkpIHsKLSAgICAgICAgICAgICAgICBzdWJUZXh0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IHN1YiB0ZXh0LgotICAgICAgICAgICAgICAgIHN1YlRleHRWaWV3LnNldFRleHQobVN1YlRleHRzLmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZW1vdmUgbWFpbiBpY29uIGFuZCBzZXQgdmlzaWJpbGl0eSB0byBnb25lIGlmIGljb25zIGFyZSBzZXQgdG8gbnVsbCBvciB0aGUgaWNvbiBhdAotICAgICAgICAgICAgLy8gdGhpcyBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIHNldCB0byBSRVNPVVJDRV9OT05fRVhJU1RFTlQuCi0gICAgICAgICAgICBpZiAobUljb25JZHMgPT0gbnVsbCB8fCBtSWNvbklkcy5nZXQocG9zaXRpb24pID09IFJFU09VUkNFX05PTl9FWElTVEVOVCkgewotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgbWFpbiBpY29uLgotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUobVJlc291cmNlcy5nZXREcmF3YWJsZShtSWNvbklkcy5nZXQocG9zaXRpb24pLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U3ViVGV4dHMoTGlzdDxTdHJpbmc+IHN1YlRleHRzKSB7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IGV4dGVuZCB0aGlzIGNsYXNzIGZyb20gU2V0dGluZ3NBZGFwdGVyCi0gICAgcHJpdmF0ZSBjbGFzcyBTdWJTZXR0aW5nc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1UZXh0czsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNoZWNrUG9zaXRpb247Ci0KLSAgICAgICAgcHVibGljIFN1YlNldHRpbmdzQWRhcHRlcihMaXN0PFN0cmluZz4gdGV4dHMsIGludCBjaGVja1Bvc2l0aW9uKSB7Ci0gICAgICAgICAgICBtVGV4dHMgPSB0ZXh0czsKLSAgICAgICAgICAgIG1DaGVja1Bvc2l0aW9uID0gY2hlY2tQb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRleHQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBpZiAobVRleHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtVGV4dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtVGV4dHMuZ2V0KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobVRleHRzID09IG51bGwpID8gMCA6IG1UZXh0cy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgY29udGFpbmVyKSB7Ci0gICAgICAgICAgICBWaWV3IHJvdzsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmVtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKLSAgICAgICAgICAgIEltYWdlVmlldyBjaGVja1ZpZXcgPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuY2hlY2spOwotCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KG1UZXh0cy5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtQ2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIGNoZWNrVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0cyhMaXN0PFN0cmluZz4gdGV4dHMpIHsKLSAgICAgICAgICAgIG1UZXh0cyA9IHRleHRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tQb3NpdGlvbihpbnQgY2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgbUNoZWNrUG9zaXRpb24gPSBjaGVja1Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiMmNkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0OwotCi1jbGFzcyBTdWJ0aXRsZVZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCBpbXBsZW1lbnRzIEFuY2hvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVZpZXciOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJpbmdXaWRnZXQgbVN1YnRpdGxlV2lkZ2V0OwotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZVdpZGdldChSZW5kZXJpbmdXaWRnZXQgc3VidGl0bGVXaWRnZXQpIHsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCA9PSBzdWJ0aXRsZVdpZGdldCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBhdHRhY2hlZFRvV2luZG93ID0gaXNBdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG1TdWJ0aXRsZVdpZGdldCA9IHN1YnRpdGxlV2lkZ2V0OwotCi0gICAgICAgIGlmIChzdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9IG5ldyBSZW5kZXJpbmdXaWRnZXQuT25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcoZmFsc2UpOwotICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQuc2V0T25DaGFuZ2VkTGlzdGVuZXIobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExvb3BlciBnZXRTdWJ0aXRsZUxvb3BlcigpIHsKLSAgICAgICAgcmV0dXJuIExvb3Blci5nZXRNYWluTG9vcGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgc3VwZXIub25MYXlvdXQoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCkgLSBnZXRQYWRkaW5nTGVmdCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7Ci0KLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShnZXRQYWRkaW5nTGVmdCgpLCBnZXRQYWRkaW5nVG9wKCkpOwotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gU3VidGl0bGVWaWV3LmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTJlODUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVzsKLQotY2xhc3MgVmlkZW9TdXJmYWNlVmlldyBleHRlbmRzIFN1cmZhY2VWaWV3IGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvU3VyZmFjZVZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotICAgIHByaXZhdGUgU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlTGlzdGVuZXIgbVN1cmZhY2VMaXN0ZW5lciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKLQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgICAgICBnZXRIb2xkZXIoKS5hZGRDYWxsYmFjayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlcik7Ci0gICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtcC5zZXREaXNwbGF5KG1TdXJmYWNlSG9sZGVyKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1TdXJmYWNlTGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBWSUVXX1RZUEVfU1VSRkFDRVZJRVc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIG1NZWRpYVBsYXllciA9IG1wOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KSB7Ci0gICAgICAgIGlmIChhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpKSB7Ci0gICAgICAgICAgICAoKFZpZXcpIG9sZFZpZXcpLnNldFZpc2liaWxpdHkoR09ORSk7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSB0cnVlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBvbGRWaWV3OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIChtU3VyZmFjZUhvbGRlciAhPSBudWxsICYmIG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2UoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAic3VyZmFjZUNyZWF0ZWQ6IG1TdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXIgKyAiLCBuZXcgaG9sZGVyOiAiICsgaG9sZGVyKTsKLSAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBob2xkZXI7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlY3QgcmVjdCA9IG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2VGcmFtZSgpOwotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgLy8gQWZ0ZXIgd2UgcmV0dXJuIGZyb20gdGhpcyB3ZSBjYW4ndCB1c2UgdGhlIHN1cmZhY2UgYW55IG1vcmUKLSAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBudWxsOwotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IEludmVzdGlnYXRlIHRoZSB3YXkgdG8gbW92ZSBvbk1lYXN1cmUoKSBjb2RlIGludG8gRnJhbWVMYXlvdXQuCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOwotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7Ci0KLSAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcwotICAgICAgICB9Ci0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogU3VyZmFjZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YTNhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVzsKLQotQFJlcXVpcmVzQXBpKDI2KQotY2xhc3MgVmlkZW9UZXh0dXJlVmlldyBleHRlbmRzIFRleHR1cmVWaWV3Ci0gICAgICAgIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBUZXh0dXJlVmlldy5TdXJmYWNlVGV4dHVyZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvVGV4dHVyZVZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBTdXJmYWNlVGV4dHVyZSBtU3VyZmFjZVRleHR1cmU7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlIG1TdXJmYWNlOwotICAgIHByaXZhdGUgU3VyZmFjZUxpc3RlbmVyIG1TdXJmYWNlTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICAgICAgc2V0U3VyZmFjZVRleHR1cmVMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgaWYgKG1wID09IG51bGwgfHwgIWhhc0F2YWlsYWJsZVN1cmZhY2UoKSkgewotICAgICAgICAgICAgLy8gU3VyZmFjZSBpcyBub3QgcmVhZHkuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbXAuc2V0U3VyZmFjZShtU3VyZmFjZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCkgewotICAgICAgICBtU3VyZmFjZUxpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlKCkgewotICAgICAgICByZXR1cm4gVklFV19UWVBFX1RFWFRVUkVWSUVXOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBtTWVkaWFQbGF5ZXIgPSBtcDsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldykgewotICAgICAgICBpZiAoYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKSkgewotICAgICAgICAgICAgKChWaWV3KSBvbGRWaWV3KS5zZXRWaXNpYmlsaXR5KEdPTkUpOwotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gb2xkVmlldzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAobVN1cmZhY2VUZXh0dXJlICE9IG51bGwgJiYgIW1TdXJmYWNlVGV4dHVyZS5pc1JlbGVhc2VkKCkgJiYgbVN1cmZhY2UgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lcgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZVRleHR1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlOiBtU3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmUKLSAgICAgICAgICAgICAgICArICIsIG5ldyBzdXJmYWNlOiAiICsgc3VyZmFjZVRleHR1cmUpOwotICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBzdXJmYWNlVGV4dHVyZTsKLSAgICAgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShtU3VyZmFjZVRleHR1cmUpOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVNpemVDaGFuZ2VkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDaGFuZ2VkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHJlcXVlc3RMYXlvdXQoKTsgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaWYgaXQgc2hvdWxkIGJlIGNhbGxlZCBoZXJlPwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVVcGRhdGVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UpIHsKLSAgICAgICAgLy8gbm8tb3AKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblN1cmZhY2VUZXh0dXJlRGVzdHJveWVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlRGVzdHJveWVkKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlVGV4dHVyZSA9IG51bGw7Ci0gICAgICAgIG1TdXJmYWNlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOwotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7Ci0KLSAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcwotICAgICAgICB9Ci0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogVGV4dHVyZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmU7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNzlkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb2N1c1JlcXVlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5PblN1YnRpdGxlRGF0YUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIySW1wbDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZXRhZGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlBsYXliYWNrUGFyYW1zOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVGltZWRUZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlci5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuZ3JhcGhpY3MucGFsZXR0ZS5QYWxldHRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLlJvdXRlUGxheWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLkNsb3NlZENhcHRpb25SZW5kZXJlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFJdGVtU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFDb250cm9sSW50ZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWaWRlb1ZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQKLSAgICAgICAgaW1wbGVtZW50cyBWaWRlb1ZpZXcyUHJvdmlkZXIsIFZpZGVvVmlld0ludGVyZmFjZS5TdXJmYWNlTGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9WaWV3MiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFNUT1BTSElQOiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUyA9IDIwMDA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZGVvVmlldzIgbUluc3RhbmNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VSUk9SID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lETEUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJJTkcgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJFRCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BMQVlJTkcgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QQVVTRUQgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZQkFDS19DT01QTEVURUQgPSA1OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfVFJBQ0tfSU5ERVggPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBJTlZBTElEX1NQRUVEID0gMGY7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOwotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOwotCi0gICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICBwcml2YXRlIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgaW50IG1BdWRpb0ZvY3VzVHlwZSA9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU47IC8vIGxlZ2FjeSBmb2N1cyBnYWluCi0KLSAgICBwcml2YXRlIFBhaXI8RXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lcj4gbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkOwotICAgIHByaXZhdGUgVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbUN1cnJlbnRWaWV3OwotICAgIHByaXZhdGUgVmlkZW9UZXh0dXJlVmlldyBtVGV4dHVyZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1N1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKLQotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1Ec2Q7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBtTWVkaWFDb250cm9sVmlldzsKLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbiBtTWVkaWFTZXNzaW9uOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyIG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWVkaWFNZXRhZGF0YTsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgbVJldHJpZXZlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVcGRhdGVNZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBCdW5kbGUgbU1lZGlhVHlwZURhdGE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOwotCi0gICAgLy8gVE9ETzogbW92ZSBtdXNpYyB2aWV3IGluc2lkZSBTdXJmYWNlVmlldy9UZXh0dXJlVmlldyBvciBpbXBsZW1lbnQgVmlkZW9WaWV3SW50ZXJmYWNlLgotICAgIHByaXZhdGUgV2luZG93TWFuYWdlciBtTWFuYWdlcjsKLSAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOwotICAgIHByaXZhdGUgVmlldyBtTXVzaWNWaWV3OwotICAgIHByaXZhdGUgRHJhd2FibGUgbU11c2ljQWxidW1EcmF3YWJsZTsKLSAgICBwcml2YXRlIFN0cmluZyBtTXVzaWNUaXRsZVRleHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljQXJ0aXN0VGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXVzaWNNZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKLSAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKLSAgICBwcml2YXRlIGludCBtRG9taW5hbnRDb2xvcjsKLSAgICBwcml2YXRlIGludCBtU2l6ZVR5cGU7Ci0KLSAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUuQnVpbGRlciBtU3RhdGVCdWlsZGVyOwotICAgIHByaXZhdGUgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gbUN1c3RvbUFjdGlvbkxpc3Q7Ci0gICAgcHJpdmF0ZSBpbnQgbVRhcmdldFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBwcml2YXRlIGludCBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBwcml2YXRlIGludCBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2U7Ci0gICAgcHJpdmF0ZSBsb25nIG1TZWVrV2hlblByZXBhcmVkOyAgLy8gcmVjb3JkaW5nIHRoZSBzZWVrIHBvc2l0aW9uIHdoaWxlIHByZXBhcmluZwotCi0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvSGVpZ2h0OwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZWdlcj4gbVZpZGVvVHJhY2tJbmRpY2VzOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1BdWRpb1RyYWNrSW5kaWNlczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+PiBtU3VidGl0bGVUcmFja0luZGljZXM7Ci0gICAgcHJpdmF0ZSBTdWJ0aXRsZUNvbnRyb2xsZXIgbVN1YnRpdGxlQ29udHJvbGxlcjsKLQotICAgIC8vIHNlbGVjdGVkIHZpZGVvL2F1ZGlvL3N1YnRpdGxlIHRyYWNrIGluZGV4IGFzIE1lZGlhUGxheWVyMiByZXR1cm5zCi0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7Ci0KLSAgICBwcml2YXRlIFN1YnRpdGxlVmlldyBtU3VidGl0bGVWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVFbmFibGVkOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtU3BlZWQ7Ci0gICAgLy8gVE9ETzogUmVtb3ZlIG1GYWxsYmFja1NwZWVkIHdoZW4gaW50ZWdyYXRpb24gd2l0aCBNZWRpYVBsYXllcjIncyBuZXcgc2V0UGxheWJhY2tQYXJhbXMoKS4KLSAgICAvLyBSZWZlcjogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xbnpBZm5zNmkyaEozUmthVXJlM1FNVDZ3c0RlZEo1T05MaUFfT09CRkZYOC9lZGl0Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRmFsbGJhY2tTcGVlZDsgIC8vIGtlZXAgdGhlIG9yaWdpbmFsIHNwZWVkIGJlZm9yZSAncGF1c2UnIGlzIGNhbGxlZC4KLSAgICBwcml2YXRlIGZsb2F0IG1Wb2x1bWVMZXZlbEZsb2F0OwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVMZXZlbDsKLQotICAgIHByaXZhdGUgbG9uZyBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtTWVkaWFSb3V0ZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgIHByaXZhdGUgUm91dGVQbGF5ZXIgbVJvdXRlUGxheWVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBtUm91dGVyQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgewotICAgICAgICAgICAgICAgIC8vIFN0b3AgbG9jYWwgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG5ldyBSb3V0ZVBsYXllcihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnNldFBsYXllckV2ZW50Q2FsbGJhY2sobmV3IFJvdXRlUGxheWVyLlBsYXllckV2ZW50Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5CdWlsZGVyIHBzQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRBY3Rpb25zKFJvdXRlUGxheWVyLlBMQVlCQUNLX0FDVElPTlMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGl0ZW1TdGF0dXMuZ2V0Q29udGVudFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW1TdGF0dXMuZ2V0UGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEVORElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfTk9ORSwgcG9zaXRpb24sIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORywgcG9zaXRpb24sIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9CVUZGRVJJTkcsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgcGJTdGF0ZSA9IHBzQnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRQbGF5YmFja1N0YXRlKHBiU3RhdGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgbW1CdWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbW1CdWlsZGVyLnB1dExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TdGF0dXMuZ2V0Q29udGVudER1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShtbUJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAvLyBTdGFydCByZW1vdGUgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKG1Ec2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlICE9IG51bGwgJiYgbVJvdXRlUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJvdXRlID09IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFzb24gIT0gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXN1bWUgbG9jYWwgcGxheWJhY2sgIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgb3BlblZpZGVvKG1Ec2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBWaWRlb1ZpZXcySW1wbChWaWRlb1ZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBtVmlkZW9XaWR0aCA9IDA7Ci0gICAgICAgIG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgICAgIG1TcGVlZCA9IDEuMGY7Ci0gICAgICAgIG1GYWxsYmFja1NwZWVkID0gbVNwZWVkOwotICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOwotICAgICAgICAvLyBUT0RPOiBhZGQgYXR0cmlidXRlcyB0byBnZXQgdGhpcyB2YWx1ZS4KLSAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IERFRkFVTFRfU0hPV19DT05UUk9MTEVSX0lOVEVSVkFMX01TOwotCi0gICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotCi0gICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpLnNldFVzYWdlKEF1ZGlvQXR0cmlidXRlcy5VU0FHRV9NRURJQSkKLSAgICAgICAgICAgICAgICAuc2V0Q29udGVudFR5cGUoQXVkaW9BdHRyaWJ1dGVzLkNPTlRFTlRfVFlQRV9NT1ZJRSkuYnVpbGQoKTsKLSAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotICAgICAgICBtSW5zdGFuY2UucmVxdWVzdEZvY3VzKCk7Ci0KLSAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGtlZXAgYSBzaW5nbGUgY2hpbGQgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsd2F5cyBoYXZpbmcgYm90aC4KLSAgICAgICAgbVRleHR1cmVWaWV3ID0gbmV3IFZpZGVvVGV4dHVyZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1TdXJmYWNlVmlldyA9IG5ldyBWaWRlb1N1cmZhY2VWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBMYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICBtVGV4dHVyZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1TdXJmYWNlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVRleHR1cmVWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVN1cmZhY2VWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVRleHR1cmVWaWV3KTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVN1cmZhY2VWaWV3KTsKLQotICAgICAgICBtU3VidGl0bGVWaWV3ID0gbmV3IFN1YnRpdGxlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IoMCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdWJ0aXRsZVZpZXcpOwotCi0gICAgICAgIGJvb2xlYW4gZW5hYmxlQ29udHJvbFZpZXcgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJlbmFibGVDb250cm9sVmlldyIsIHRydWUpOwotICAgICAgICBpZiAoZW5hYmxlQ29udHJvbFZpZXcpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbmV3IE1lZGlhQ29udHJvbFZpZXcyKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IChhdHRycyA9PSBudWxsKSB8fCBhdHRycy5nZXRBdHRyaWJ1dGVCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIsCi0gICAgICAgICAgICAgICAgImVuYWJsZVN1YnRpdGxlIiwgZmFsc2UpOwotCi0gICAgICAgIC8vIFRPRE86IENob29zZSBUZXh0dXJlVmlldyB3aGVuIFN1cmZhY2VWaWV3IGNhbm5vdCBiZSBjcmVhdGVkLgotICAgICAgICAvLyBDaG9vc2Ugc3VyZmFjZSB2aWV3IGJ5IGRlZmF1bHQKLSAgICAgICAgaW50IHZpZXdUeXBlID0gKGF0dHJzID09IG51bGwpID8gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVcKLSAgICAgICAgICAgICAgICA6IGF0dHJzLmdldEF0dHJpYnV0ZUludFZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJ2aWV3VHlwZSIsIFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKTsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ2aWV3VHlwZSBhdHRyaWJ1dGUgaXMgc3VyZmFjZVZpZXcuIik7Ci0gICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1DdXJyZW50VmlldyA9IG1TdXJmYWNlVmlldzsKLSAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHRleHR1cmVWaWV3LiIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtVGV4dHVyZVZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLSAgICAgICAgbVJvdXRlU2VsZWN0b3IgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFDb250cm9sVmlldzJfaW1wbChNZWRpYUNvbnRyb2xWaWV3MiBtZWRpYUNvbnRyb2xWaWV3LCBsb25nIGludGVydmFsTXMpIHsKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcgPSBtZWRpYUNvbnRyb2xWaWV3OwotICAgICAgICBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zID0gaW50ZXJ2YWxNczsKLSAgICAgICAgLy8gVE9ETzogQ2FsbCBNZWRpYUNvbnRyb2xWaWV3Mi5zZXRSb3V0ZVNlbGVjdG9yIG9ubHkgd2hlbiBjYXN0IGF2YWlsYWxiZS4KLSAgICAgICAgKChNZWRpYUNvbnRyb2xWaWV3MkltcGwpIG1NZWRpYUNvbnRyb2xWaWV3LmdldFByb3ZpZGVyKCkpLnNldFJvdXRlU2VsZWN0b3IobVJvdXRlU2VsZWN0b3IpOwotCi0gICAgICAgIGlmIChtSW5zdGFuY2UuaXNBdHRhY2hlZFRvV2luZG93KCkpIHsKLSAgICAgICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIgZ2V0TWVkaWFDb250cm9sbGVyX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lZGlhU2Vzc2lvbiBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldE1lZGlhU2Vzc2lvblRva2VuX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MiBnZXRNZWRpYUNvbnRyb2xWaWV3Ml9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbFZpZXc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldE1lZGlhTWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NZWRpYU1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhTWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBUT0RPOiBpbnRlZ3JhdGUgdGhpcyB3aXRoIE1lZGlhU2Vzc2lvbjIjTWVkaWFJdGVtMgotICAgICAgICBtTWVkaWFNZXRhZGF0YSA9IG1ldGFkYXRhOwotCi0gICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBoYW5kbGluZyB3ZWJzaXRlIGxpbmsKLSAgICAgICAgbU1lZGlhVHlwZURhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNBZCA9IG1ldGFkYXRhID09IG51bGwgPwotICAgICAgICAgICAgICAgIGZhbHNlIDogbWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfQURWRVJUSVNFTUVOVCkgIT0gMDsKLSAgICAgICAgbU1lZGlhVHlwZURhdGEucHV0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQsIGlzQWQpOwotCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudCgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywgbU1lZGlhVHlwZURhdGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVXBkYXRlIGxhdGVyIGluc2lkZSBPblByZXBhcmVkTGlzdGVuZXIgYWZ0ZXIgTWVkaWFTZXNzaW9uIGlzIGluaXRpYWxpemVkLgotICAgICAgICAgICAgbU5lZWRVcGRhdGVNZWRpYVR5cGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKGVuYWJsZSAhPSBtU3VidGl0bGVFbmFibGVkKSB7Ci0gICAgICAgICAgICBzZWxlY3RPckRlc2VsZWN0U3VidGl0bGUoZW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBtU3VidGl0bGVFbmFibGVkID0gZW5hYmxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VidGl0bGVFbmFibGVkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidGl0bGVFbmFibGVkOwotICAgIH0KLQotICAgIC8vIFRPRE86IHJlbW92ZSBzZXRTcGVlZF9pbXBsIG9uY2UgTWVkaWFDb250cm9sbGVyMiBpcyByZWFkeS4KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTcGVlZF9pbXBsKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIGlmIChzcGVlZCA8PSAwLjBmKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbnN1cHBvcnRlZCBzcGVlZCAoIiArIHNwZWVkICsgIikgaXMgaWdub3JlZC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgaWYgKG1NZWRpYVBsYXllciAhPSBudWxsICYmIG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgYXBwbHlTcGVlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKGludCBmb2N1c0dhaW4pIHsKLSAgICAgICAgaWYgKGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU4KLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlQKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfTUFZX0RVQ0sKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGF1ZGlvIGZvY3VzIHR5cGUgIiArIGZvY3VzR2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvRm9jdXNUeXBlID0gZm9jdXNHYWluOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEF1ZGlvQXR0cmlidXRlc19pbXBsKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgbnVsbCBBdWRpb0F0dHJpYnV0ZXMiKTsKLSAgICAgICAgfQotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1BhdGhfaW1wbChTdHJpbmcgcGF0aCkgewotICAgICAgICBtSW5zdGFuY2Uuc2V0VmlkZW9VcmkoVXJpLnBhcnNlKHBhdGgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1VyaV9pbXBsKFVyaSB1cmkpIHsKLSAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKHVyaSwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSwgaGVhZGVycywgbnVsbCk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXREYXRhU291cmNlKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFJdGVtX2ltcGwoTWVkaWFJdGVtMiBtZWRpYUl0ZW0pIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlX2ltcGwoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIG1Ec2QgPSBkc2Q7Ci0gICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKLSAgICAgICAgb3BlblZpZGVvKGRzZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld1R5cGVfaW1wbChpbnQgdmlld1R5cGUpIHsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgVmlkZW9WaWV3SW50ZXJmYWNlIHRhcmdldFZpZXc7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFRleHR1cmVWaWV3Iik7Ci0gICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVRleHR1cmVWaWV3OwotICAgICAgICB9IGVsc2UgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzd2l0Y2hpbmcgdG8gU3VyZmFjZVZpZXciKTsKLSAgICAgICAgICAgIHRhcmdldFZpZXcgPSBtU3VyZmFjZVZpZXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHZpZXcgdHlwZTogIiArIHZpZXdUeXBlKTsKLSAgICAgICAgfQotICAgICAgICAoKFZpZXcpIHRhcmdldFZpZXcpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgdGFyZ2V0Vmlldy50YWtlT3ZlcihtQ3VycmVudFZpZXcpOwotICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUFjdGlvbnNfaW1wbCgKLSAgICAgICAgICAgIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IGFjdGlvbkxpc3QsCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgVmlkZW9WaWV3Mi5PbkN1c3RvbUFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ID0gYWN0aW9uTGlzdDsKLSAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkID0gbmV3IFBhaXI8PihleGVjdXRvciwgbGlzdGVuZXIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwbGF5YmFjayBidWlsZGVyIGluIG9yZGVyIHRvIGNsZWFyIGV4aXN0aW5nIHRoZSBjdXN0b20gYWN0aW9ucy4KLSAgICAgICAgbVN0YXRlQnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIGwpIHsKLSAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PbkZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgbCkgewotICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIE1lZGlhU2Vzc2lvbgotICAgICAgICBtTWVkaWFTZXNzaW9uID0gbmV3IE1lZGlhU2Vzc2lvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCAiVmlkZW9WaWV3Mk1lZGlhU2Vzc2lvbiIpOwotICAgICAgICBtTWVkaWFTZXNzaW9uLnNldENhbGxiYWNrKG5ldyBNZWRpYVNlc3Npb25DYWxsYmFjaygpKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRBY3RpdmUodHJ1ZSk7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgbU1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1NZWRpYVJvdXRlci5zZXRNZWRpYVNlc3Npb24obU1lZGlhU2Vzc2lvbik7Ci0gICAgICAgIG1NZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtUm91dGVTZWxlY3RvciwgbVJvdXRlckNhbGxiYWNrKTsKLSAgICAgICAgYXR0YWNoTWVkaWFDb250cm9sVmlldygpOwotICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBhZnRlciBtb3ZpbmcgTWVkaWFTZXNzaW9uIGNyZWF0aW5nIGNvZGUgaW5zaWRlIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCi0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSB7Ci0gICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgICAgICBpZiAobU5lZWRVcGRhdGVNZWRpYVR5cGUpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZURhdGEpOwotICAgICAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7Ci0KLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5yZWxlYXNlKCk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24gPSBudWxsOwotICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIFZpZGVvVmlldzIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Ub3VjaEV2ZW50KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICBpZiAoZXYuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQICYmIG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghbUlzTXVzaWNNZWRpYVR5cGUgfHwgbVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5vblRyYWNrYmFsbEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIC8vIFRPRE86IFRlc3QgdG91Y2ggZXZlbnQgaGFuZGxpbmcgbG9naWMgdGhvcm91Z2hseSBhbmQgc2ltcGxpZnkgdGhlIGxvZ2ljLgotICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGlmIChtSXNNdXNpY01lZGlhVHlwZSkgewotICAgICAgICAgICAgaWYgKG1QcmV2V2lkdGggIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQotICAgICAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIGludCBjdXJyV2lkdGggPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgc2NyZWVuU2l6ZSA9IG5ldyBQb2ludCgpOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKLSAgICAgICAgICAgICAgICBpbnQgc2NyZWVuV2lkdGggPSBzY3JlZW5TaXplLng7Ci0gICAgICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKLQotICAgICAgICAgICAgICAgIGlmIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uID0gcmV0cmlldmVPcmllbnRhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9sYW5kc2NhcGVfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZU11c2ljVmlldyhSLmxheW91dC5mdWxsX3BvcnRyYWl0X211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9GVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIG1GYWRlT3V0IGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9FTUJFRERFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG5ldyBtRmFkZU91dCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucG9zdERlbGF5ZWQobUZhZGVPdXQsIG1TaG93Q29udHJvbGxlckludGVydmFsTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7Ci0gICAgICAgICAgICAgICAgbVByZXZIZWlnaHQgPSBjdXJySGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gSW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ3JlYXRlZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFZpZXcgdmlldykgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZURlc3Ryb3llZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBjYWxsIHJlcXVlc3RMYXlvdXQgaGVyZT8KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VDaGFuZ2VkKCkuIHdpZHRoL2hlaWdodDogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUYWtlT3ZlckRvbmUoKS4gTm93IGN1cnJlbnQgdmlldyBpczogIiArIHZpZXcpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50VmlldyA9IHZpZXc7Ci0gICAgICAgIGlmIChtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyLm9uVmlld1R5cGVDaGFuZ2VkKG1JbnN0YW5jZSwgdmlldy5nZXRWaWV3VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCkgewotICAgICAgICAvLyBHZXQgTWVkaWFDb250cm9sbGVyIGZyb20gTWVkaWFTZXNzaW9uIGFuZCBzZXQgaXQgaW5zaWRlIE1lZGlhQ29udHJvbFZpZXcKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0Q29udHJvbGxlcihtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKSk7Ci0KLSAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU1lZGlhQ29udHJvbFZpZXcsIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5QbGF5YmFja1N0YXRlKCkgewotICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX1BSRVBBUklORzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbmVlZFRvU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAobU1lZGlhUGxheWVyICE9IG51bGwgfHwgbVJvdXRlUGxheWVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QTEFZSU5HCi0gICAgICAgICAgICAgICAgJiYgbVRhcmdldFN0YXRlID09IFNUQVRFX1BMQVlJTkc7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlcyBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBhbmQgcHJlcGFyZSBwbGF5YmFjay4KLSAgICBwcml2YXRlIHZvaWQgb3BlblZpZGVvKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBVcmkgdXJpID0gZHNkLmdldFVyaSgpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBkc2QuZ2V0VXJpSGVhZGVycygpOwotICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKGRzZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGhhdmUgYSBmb2N1cyBsaXN0ZW5lcgotICAgICAgICAgICAgQXVkaW9Gb2N1c1JlcXVlc3QgZm9jdXNSZXF1ZXN0OwotICAgICAgICAgICAgZm9jdXNSZXF1ZXN0ID0gbmV3IEF1ZGlvRm9jdXNSZXF1ZXN0LkJ1aWxkZXIobUF1ZGlvRm9jdXNUeXBlKQotICAgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5yZXF1ZXN0QXVkaW9Gb2N1cyhmb2N1c1JlcXVlc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpOiBjcmVhdGluZyBuZXcgTWVkaWFQbGF5ZXIyIGluc3RhbmNlLiIpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbmV3IE1lZGlhUGxheWVyMkltcGwoKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcuYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLQotICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUluc3RhbmNlLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCB0aW1lbHkgZmlyaW5nIGxvZ2ljIGZvciBtb3JlIGFjY3VyYXRlIHN5bmMgYmV0d2VlbiBDQyBhbmQgdmlkZW8gZnJhbWUKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIgPSBuZXcgU3VidGl0bGVDb250cm9sbGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZWdpc3RlclJlbmRlcmVyKG5ldyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoY29udGV4dCkpOwotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZXRBbmNob3IoKFN1YnRpdGxlQ29udHJvbGxlci5BbmNob3IpIG1TdWJ0aXRsZVZpZXcpOwotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IgPSBuZXcgRXhlY3V0b3IoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soZXhlY3V0b3IsIG1NZWRpYVBsYXllcjJDYWxsYmFjayk7Ci0KLSAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IC0xOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldERhdGFTb3VyY2UoZHNkKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25TdWJ0aXRsZURhdGFMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyB3ZSBkb24ndCBzZXQgdGhlIHRhcmdldCBzdGF0ZSBoZXJlIGVpdGhlciwgYnV0IHByZXNlcnZlIHRoZQotICAgICAgICAgICAgLy8gdGFyZ2V0IHN0YXRlIHRoYXQgd2FzIHRoZXJlIGJlZm9yZS4KLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIucHJlcGFyZSgpOwotCi0gICAgICAgICAgICAvLyBTYXZlIGZpbGUgbmFtZSBhcyB0aXRsZSBzaW5jZSB0aGUgZmlsZSBtYXkgbm90IGhhdmUgYSB0aXRsZSBNZXRhZGF0YS4KLSAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOwotICAgICAgICAgICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIHNjaGVtZS5lcXVhbHMoImZpbGUiKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwotICAgICAgICAgICAgbVJldHJpZXZlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSk7Ci0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbiBjb250ZW50OiAiICsgdXJpLCBleCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllcjJDYWxsYmFjay5vbkVycm9yKG1NZWRpYVBsYXllciwgZHNkLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuTUVESUFfRVJST1JfVU5LTk9XTiwgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX0lPKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVzZXQgdGhlIG1lZGlhIHBsYXllciBpbiBhbnkgc3RhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRQbGF5ZXIoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXIyIHBsYXllciA9IG1NZWRpYVBsYXllcjsKLSAgICAgICAgICAgIG5ldyBBc3luY1Rhc2s8TWVkaWFQbGF5ZXIyLCBWb2lkLCBWb2lkPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgVm9pZCBkb0luQmFja2dyb3VuZChNZWRpYVBsYXllcjIuLi4gcGxheWVycykgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaXggTlBFIHdoaWxlIE1lZGlhUGxheWVyMi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgIC8vcGxheWVyc1swXS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LmV4ZWN1dGVPbkV4ZWN1dG9yKEFzeW5jVGFzay5TRVJJQUxfRVhFQ1VUT1IsIHBsYXllcik7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOwotICAgICAgICAgICAgLy9tUGVuZGluZ1N1YnRpdGxlVHJhY2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1WaWRlb1dpZHRoID0gMDsKLSAgICAgICAgbVZpZGVvSGVpZ2h0ID0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgaWYgKG1TdGF0ZUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHBsYXllciBmb3IgdGhpcyBzdHJlYW0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1NZWRpYVBsYXllci5nZXRNZXRhZGF0YShNZWRpYVBsYXllcjIuTUVUQURBVEFfQUxMLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuQllQQVNTX01FVEFEQVRBX0ZJTFRFUik7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBQbGF5IGFjdGlvbiBhcyBkZWZhdWx0Ci0gICAgICAgICAgICBsb25nIHBsYXliYWNrQWN0aW9ucyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVk7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU1ldGFkYXRhLmdldEJvb2xlYW4oTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19GT1JXQVJEX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSAoUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UgfAotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN0YXRlQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0QWN0aW9ucyhwbGF5YmFja0FjdGlvbnMpOwotCi0gICAgICAgICAgICBpZiAobUN1c3RvbUFjdGlvbkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gYWN0aW9uIDogbUN1c3RvbUFjdGlvbkxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5hZGRDdXN0b21BY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRTdGF0ZShnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpLAotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSwgbVNwZWVkKTsKLSAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKLSAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfSURMRQotICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggTWVkaWFQbGF5ZXIyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSBvbmNlIGl0IGlzCi0gICAgICAgICAgICAvLyBpbXBsZW1lbnRlZC4KLSAgICAgICAgICAgIGlmIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oLTEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgKG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSAvIDEwMC4wICogbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCBQbGF5YmFja1N0YXRlIGZvciBNZWRpYVNlc3Npb24KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgUGxheWJhY2tTdGF0ZSBzdGF0ZSA9IG1TdGF0ZUJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgc3dpdGNoIChtQ3VycmVudFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX0VSUk9SOwotICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX05PTkU7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbUZhZGVPdXQgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBzaG93Q29udHJvbGxlcigpIHsKLSAgICAgICAgLy8gVE9ETzogRGVjaWRlIHdoYXQgdG8gc2hvdyB3aGVuIHRoZSBzdGF0ZSBpcyBub3QgaW4gcGxheWJhY2sgc3RhdGUKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ID09IG51bGwgfHwgIWlzSW5QbGF5YmFja1N0YXRlKCkKLSAgICAgICAgICAgICAgICB8fCAobUlzTXVzaWNNZWRpYVR5cGUgJiYgbVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgaWYgKG1TaG93Q29udHJvbGxlckludGVydmFsTXMgIT0gMAotICAgICAgICAgICAgJiYgIW1BY2Nlc3NpYmlsaXR5TWFuYWdlci5pc1RvdWNoRXhwbG9yYXRpb25FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpIHsKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U3BlZWQoKSB7Ci0gICAgICAgIFBsYXliYWNrUGFyYW1zIHBhcmFtcyA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKTsKLSAgICAgICAgaWYgKG1TcGVlZCAhPSBwYXJhbXMuZ2V0U3BlZWQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXJhbXMuc2V0U3BlZWQobVNwZWVkKTsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0UGxheWJhY2tQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGxheWJhY2tQYXJhbXMgaGFzIHVuc3VwcG9ydGVkIHZhbHVlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHJldmlzZSB0aGlzIHBhcnQgYWZ0ZXIgaW50ZWdyYXRpbmcgd2l0aCBNUDIuCi0gICAgICAgICAgICAgICAgLy8gSWYgbVNwZWVkIGhhZCBhbiBpbGxlZ2FsIHZhbHVlIGZvciBzcGVlZCByYXRlLCBzeXN0ZW0gd2lsbCBkZXRlcm1pbmUgYmVzdAotICAgICAgICAgICAgICAgIC8vIGhhbmRsaW5nIChzZWUgUGxheWJhY2tQYXJhbXMuQVVESU9fRkFMTEJBQ0tfTU9ERV9ERUZBVUxUKS4KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgcHJlLU1QMiByZXR1cm5zIDAuMGYgd2hlbiBpdCBpcyBwYXVzZWQuIEluIHRoaXMgY2FzZSwgVmlkZW9WaWV3MiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gdXNlIG1GYWxsYmFja1NwZWVkIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgZmxvYXQgZmFsbGJhY2tTcGVlZCA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKS5nZXRTcGVlZCgpOwotICAgICAgICAgICAgICAgIGlmIChmYWxsYmFja1NwZWVkID4gMC4wZikgewotICAgICAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IGZhbGxiYWNrU3BlZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1TcGVlZCA9IG1GYWxsYmFja1NwZWVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVtb3RlUGxheWJhY2soKSB7Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBQbGF5YmFja0luZm8gcGxheWJhY2tJbmZvID0gbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja0luZm8oKTsKLSAgICAgICAgcmV0dXJuIHBsYXliYWNrSW5mbyAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgcGxheWJhY2tJbmZvLmdldFBsYXliYWNrVHlwZSgpID09IFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGJvb2xlYW4gc2VsZWN0KSB7Ci0gICAgICAgIGlmICghaXNJblBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3QpIHsKLSAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBzZWxlY3Rpb24gZHluYW1pYwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoMCkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZWxlY3RUcmFjayhtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLnNlY29uZCk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlbGVjdFRyYWNrKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZGVzZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IElOVkFMSURfVFJBQ0tfSU5ERVg7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdFRyYWNrcygpIHsKLSAgICAgICAgTGlzdDxNZWRpYVBsYXllcjIuVHJhY2tJbmZvPiB0cmFja0luZm9zID0gbU1lZGlhUGxheWVyLmdldFRyYWNrSW5mbygpOwotICAgICAgICBtVmlkZW9UcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyLnJlc2V0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2tJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaW50IHRyYWNrVHlwZSA9IHRyYWNrSW5mb3MuZ2V0KGkpLmdldFRyYWNrVHlwZSgpOwotICAgICAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0luZGljZXMuYWRkKGkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzLmFkZChpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRQotICAgICAgICAgICAgICAgICAgICB8fCB0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgewotICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBtU3VidGl0bGVDb250cm9sbGVyLmFkZFRyYWNrKHRyYWNrSW5mb3MuZ2V0KGkpLmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMuYWRkKG5ldyBQYWlyPD4oaSwgdHJhY2spKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2VsZWN0IGZpcnN0IHRyYWNrcyBhcyBkZWZhdWx0Ci0gICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkgPT0gMCAmJiBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUlzTXVzaWNNZWRpYVR5cGUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfVklERU9fVFJBQ0tfQ09VTlQsIG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkpOwotICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX0FVRElPX1RSQUNLX0NPVU5ULCBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpKTsKLSAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCwgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKG1TdWJ0aXRsZUVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudChNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUywgZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RNZXRhZGF0YSgpIHsKLSAgICAgICAgLy8gR2V0IGFuZCBzZXQgZHVyYXRpb24gYW5kIHRpdGxlIHZhbHVlcyBhcyBNZWRpYU1ldGFkYXRhIGZvciBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsICYmIG1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuVElUTEUpKSB7Ci0gICAgICAgICAgICBtVGl0bGUgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1ldGFkYXRhLlRJVExFKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbVRpdGxlKTsKLSAgICAgICAgYnVpbGRlci5wdXRMb25nKAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBtTWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKSk7Ci0KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RBdWRpb01ldGFkYXRhKCkgewotICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbU1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotCi0gICAgICAgIGJ5dGVbXSBhbGJ1bSA9IG1SZXRyaWV2ZXIuZ2V0RW1iZWRkZWRQaWN0dXJlKCk7Ci0gICAgICAgIGlmIChhbGJ1bSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoYWxidW0sIDAsIGFsYnVtLmxlbmd0aCk7Ci0gICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKGJpdG1hcCk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCB2aXN1YWxpemVyCi0gICAgICAgICAgICBQYWxldHRlLmdlbmVyYXRlQXN5bmMoYml0bWFwLCBuZXcgUGFsZXR0ZS5QYWxldHRlQXN5bmNMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdlbmVyYXRlZChQYWxldHRlIHBhbGV0dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIGRvbWluYW50IGNvbG9yIGZvciBkZWZhdWx0IGFsYnVtIGltYWdlLgotICAgICAgICAgICAgICAgICAgICBtRG9taW5hbnRDb2xvciA9IHBhbGV0dGUuZ2V0RG9taW5hbnRDb2xvcigwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NdXNpY1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU11c2ljVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2RlZmF1bHRfYWxidW1faW1hZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfVElUTEUpOwotICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gdGl0bGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNUaXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXJ0aXN0ID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQVJUSVNUKTsKLSAgICAgICAgaWYgKGFydGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTXVzaWNBcnRpc3RUZXh0ID0gYXJ0aXN0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZW5kIHRpdGxlIGFuZCBhcnRpc3Qgc3RyaW5nIHRvIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgIE1lZGlhTWV0YWRhdGEuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbU11c2ljVGl0bGVUZXh0KTsKLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNULCBtTXVzaWNBcnRpc3RUZXh0KTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIERpc3BsYXkgRW1iZWRkZWQgbW9kZSBhcyBkZWZhdWx0Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1TdXJmYWNlVmlldyk7Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1UZXh0dXJlVmlldyk7Ci0gICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHJldHJpZXZlT3JpZW50YXRpb24oKSB7Ci0gICAgICAgIERpc3BsYXlNZXRyaWNzIGRtID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGludCB3aWR0aCA9IGRtLndpZHRoUGl4ZWxzOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZG0uaGVpZ2h0UGl4ZWxzOwotCi0gICAgICAgIHJldHVybiAoaGVpZ2h0ID4gd2lkdGgpID8KLSAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUIDoKLSAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX0xBTkRTQ0FQRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5mbGF0ZU11c2ljVmlldyhpbnQgbGF5b3V0SWQpIHsKLSAgICAgICAgbUluc3RhbmNlLnJlbW92ZVZpZXcobU11c2ljVmlldyk7Ci0KLSAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOwotICAgICAgICB2LnNldEJhY2tncm91bmRDb2xvcihtRG9taW5hbnRDb2xvcik7Ci0KLSAgICAgICAgSW1hZ2VWaWV3IGFsYnVtVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWxidW0pOwotICAgICAgICBpZiAoYWxidW1WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFsYnVtVmlldy5zZXRJbWFnZURyYXdhYmxlKG1NdXNpY0FsYnVtRHJhd2FibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGV4dFZpZXcgdGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZSk7Ci0gICAgICAgIGlmICh0aXRsZVZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgdGl0bGVWaWV3LnNldFRleHQobU11c2ljVGl0bGVUZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFRleHRWaWV3IGFydGlzdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFydGlzdCk7Ci0gICAgICAgIGlmIChhcnRpc3RWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFydGlzdFZpZXcuc2V0VGV4dChtTXVzaWNBcnRpc3RUZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NdXNpY1ZpZXcgPSB2OwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtTXVzaWNWaWV3LCAwKTsKLSAgICB9Ci0KLSAgICBPblN1YnRpdGxlRGF0YUxpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBPblN1YnRpdGxlRGF0YUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VidGl0bGVEYXRhKE1lZGlhUGxheWVyMiBtcCwgU3VidGl0bGVEYXRhIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRDdXJyZW50UG9zaXRpb246ICIgKyBtcC5nZXRDdXJyZW50UG9zaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGdldFN0YXJ0VGltZVVzKCk6ICIgKyBkYXRhLmdldFN0YXJ0VGltZVVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBkaWZmOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRhdGEuZ2V0U3RhcnRUaW1lVXMoKS8xMDAwIC0gbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1zLCBnZXREdXJhdGlvblVzKCk6ICIgKyBkYXRhLmdldER1cmF0aW9uVXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gZGF0YS5nZXRUcmFja0luZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VidGl0bGVEYXRhKCk6IGdldFRyYWNrSW5kZXg6ICIgKyBkYXRhLmdldFRyYWNrSW5kZXgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlbGVjdGVkIHRyYWNrIGluZGV4OiAiICsgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8SW50ZWdlciwgU3VidGl0bGVUcmFjaz4gcCA6IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuZmlyc3QgPT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gcC5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sub25EYXRhKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgIE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgbU1lZGlhUGxheWVyMkNhbGxiYWNrID0KLSAgICAgICAgICAgIG5ldyBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVmlkZW9TaXplQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogc2l6ZTogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogbVZpZGVvU2l6ZToiICsgbVZpZGVvV2lkdGggKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9XaWR0aCAhPSAwICYmIG1WaWRlb0hlaWdodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWVkIHRleHQgcmVsYXRlZCBjb2RlIGxhdGVyIG9uY2UgcmVsZXZhbnQgUmVuZGVyZXIgaXMgZGVmaW5lZC4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZWRUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIFRpbWVkVGV4dCB0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUaW1lZFRleHQ6ICIgKyB0ZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblByZXBhcmVkKG1wLCBkc2QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUExBWUJBQ0tfQ09NUExFVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Db21wbGV0aW9uKG1wLCBkc2QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fQlVGRkVSSU5HX1VQREFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkJ1ZmZlcmluZ1VwZGF0ZShtcCwgZHNkLCBleHRyYSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBmcmFtZXdvcmtFcnIsIGludCBpbXBsRXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6ICIgKyBmcmFtZXdvcmtFcnIgKyAiLCIgKyBpbXBsRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9TRUVLX1RPICYmIHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25QcmVwYXJlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk9uUHJlcGFyZWRMaXN0ZW5lcigpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBzZXQgcGxheWJhY2sgc3RhdGUgZm9yIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byBzZW5kIFRyYWNrSW5mb3MgdG8gTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY3JlYXRlIE1lZGlhU2Vzc2lvbiB3aGVuIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RUcmFja3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCB2aWRlb1dpZHRoID0gbXAuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSBtcC5nZXRWaWRlb0hlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG1TZWVrV2hlblByZXBhcmVkIG1heSBiZSBjaGFuZ2VkIGFmdGVyIHNlZWtUbygpIGNhbGwKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBzZWVrVG9Qb3NpdGlvbiA9IG1TZWVrV2hlblByZXBhcmVkOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vla1RvUG9zaXRpb24gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnNlZWtUbyhzZWVrVG9Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSAwICYmIHZpZGVvSGVpZ2h0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICE9IG1WaWRlb1dpZHRoIHx8IHZpZGVvSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKSA6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlkZW8gc2l6ZTogIiArIHZpZGVvV2lkdGggKyAiLyIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIG1JbnN0YW5jZS5nZXRXaWR0aCgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgdmlkZW8gc2l6ZSB5ZXQsIGJ1dCBzaG91bGQgc3RhcnQgYW55d2F5LgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZpZGVvIHNpemUgbWlnaHQgYmUgcmVwb3J0ZWQgdG8gdXMgbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25Db21wbGV0aW9uKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWJhbmRvbkF1ZGlvRm9jdXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25CdWZmZXJpbmdVcGRhdGUoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBwZXJjZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgcHJpdmF0ZSBjbGFzcyBNZWRpYVNlc3Npb25DYWxsYmFjayBleHRlbmRzIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vbkNvbW1hbmQoY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlSW5kZXggPSBhcmdzLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VidGl0bGVJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoc3VidGl0bGVJbmRleCkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gc3VidGl0bGVUcmFja0luZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX0hJREVfU1VCVElUTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9GVUxMU0NSRUVOOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lci5vbkZ1bGxTY3JlZW5SZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRCb29sZWFuKE1lZGlhQ29udHJvbFZpZXcySW1wbC5BUkdVTUVOVF9LRVlfRlVMTFNDUkVFTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvSW5kZXggPSBhcmdzLmdldEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX1RSQUNLX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9UcmFja0luZGV4ID0gbUF1ZGlvVHJhY2tJbmRpY2VzLmdldChhdWRpb0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9UcmFja0luZGV4ICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBhdWRpb1RyYWNrSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gYXJncy5nZXRGbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9QTEFZQkFDS19TUEVFRCwgSU5WQUxJRF9TUEVFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWQgIT0gSU5WQUxJRF9TUEVFRCAmJiBzcGVlZCAhPSBtU3BlZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3BlZWQoc3BlZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcGVlZCA9IHNwZWVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfTVVURToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVMZXZlbCA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9VTk1VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCBtVm9sdW1lTGV2ZWwsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUFjdGlvbihTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuZmlyc3QuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuc2Vjb25kLm9uQ3VzdG9tQWN0aW9uKGFjdGlvbiwgZXh0cmFzKSk7Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpICYmIChtQ3VycmVudFZpZXcuaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHx8IG1Jc011c2ljTWVkaWFUeXBlKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uUGxheSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QbGF5KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblBhdXNlKCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlZWtUbyhsb25nIHBvcykgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblNlZWtUbyhwb3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWVrVG8ocG9zLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSBwb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TdG9wKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc2V0UGxheWVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0ZDQ3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWludGVyZmFjZSBWaWRlb1ZpZXdJbnRlcmZhY2UgewotICAgIC8qKgotICAgICAqIEFzc2lnbnMgdGhlIHZpZXcncyBzdXJmYWNlIHRvIHRoZSBnaXZlbiBNZWRpYVBsYXllcjIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXAgTWVkaWFQbGF5ZXIyCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIHN1Y2Nlc3NmdWxseSBhc3NpZ25lZCwgZmFsc2UgaWYgbm90LiBJdCB3aWxsIGZhaWwgdG8gYXNzaWduCi0gICAgICogICAgICAgICBpZiBhbnkgb2YgTWVkaWFQbGF5ZXIyIG9yIHN1cmZhY2UgaXMgdW5hdmFpbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApOwotICAgIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKTsKLSAgICBpbnQgZ2V0Vmlld1R5cGUoKTsKLSAgICB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCk7Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlcyBvdmVyIG9sZFZpZXcuIEl0IG1lYW5zIHRoYXQgdGhlIE1lZGlhUGxheWVyMiB3aWxsIHN0YXJ0IHJlbmRlcmluZyBvbiB0aGlzIHZpZXcuCi0gICAgICogVGhlIHZpc2liaWxpdHkgb2Ygb2xkVmlldyB3aWxsIGJlIHNldCBhcyB7QGxpbmsgVmlldy5HT05FfS4gSWYgdGhlIHZpZXcgZG9lc24ndCBoYXZlIGEKLSAgICAgKiBNZWRpYVBsYXllcjIgaW5zdGFuY2Ugb3IgaXRzIHN1cmZhY2UgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGFjdHVhbCBleGVjdXRpb24gaXMgZGVmZXJyZWQgdW50aWwKLSAgICAgKiBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBpcyBzZXQgYnkge0BsaW5rICNzZXRNZWRpYVBsYXllcn0gb3IgaXRzIHN1cmZhY2UgYmVjb21lcyBhdmFpbGFibGUuCi0gICAgICoge0BsaW5rIFN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmV9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGFjdHVhbCBleGVjdXRpb24gaXMKLSAgICAgKiBkb25lLgotICAgICAqCi0gICAgICogQHBhcmFtIG9sZFZpZXcgVGhlIHZpZXcgdGhhdCBNZWRpYVBsYXllcjIgaXMgY3VycmVudGx5IHJlbmRlcmluZyBvbi4KLSAgICAgKi8KLSAgICB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgdmlldydzIHN1cmZhY2UgaXMgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIEFuIGluc3RhbmNlIG9mIFZpZGVvVmlld0ludGVyZmFjZSBjYWxscyB0aGVzZSBzdXJmYWNlIG5vdGlmaWNhdGlvbiBtZXRob2RzIGFjY29yZGluZ2x5IGlmCi0gICAgICogYSBsaXN0ZW5lciBoYXMgYmVlbiByZWdpc3RlcmVkIHZpYSB7QGxpbmsgI3NldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIpfS4KLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgU3VyZmFjZUxpc3RlbmVyIHsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VEZXN0cm95ZWQoVmlldyB2aWV3KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNjgyNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld0dyb3VwSW1wbCBpbXBsZW1lbnRzIFZpZXdHcm91cFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1TdXBlclByb3ZpZGVyOwotCi0gICAgcHVibGljIFZpZXdHcm91cEltcGwoVmlld0dyb3VwIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyID0gc3VwZXJQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25BdHRhY2hlZFRvV2luZG93X2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIub25UcmFja2JhbGxFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaEluZmxhdGVfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25GaW5pc2hJbmZsYXRlX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLnNldEVuYWJsZWRfaW1wbChlbmFibGVkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoYm9vbGVhbiBpc1Zpc2libGUpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGlzVmlzaWJsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25MYXlvdXRfaW1wbChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25MYXlvdXRfaW1wbChjaGFuZ2VkLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbChpbnQgbWVhc3VyZWRXaWR0aCwgaW50IG1lYXN1cmVkSGVpZ2h0KSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLnNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwobWVhc3VyZWRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5kaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHApIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmNoZWNrTGF5b3V0UGFyYW1zX2ltcGwocCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKGF0dHJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHApIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwobHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLnNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoVmlldyBjaGlsZCwKLSAgICAgICAgaW50IHBhcmVudFdpZHRoTWVhc3VyZVNwZWMsIGludCB3aWR0aFVzZWQsIGludCBwYXJlbnRIZWlnaHRNZWFzdXJlU3BlYywgaW50IGhlaWdodFVzZWQpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIubWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbChjaGlsZCwKLSAgICAgICAgICAgICAgICBwYXJlbnRXaWR0aE1lYXN1cmVTcGVjLCB3aWR0aFVzZWQsIHBhcmVudEhlaWdodE1lYXN1cmVTcGVjLCBoZWlnaHRVc2VkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5tayBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGRmZDJhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAotICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKLSAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGp1bml0Ci0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50c1Rlc3QKLQotTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUiA6PSBNZWRpYUNvbXBvbmVudHMKLQotTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKLQotTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjU1MjY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS50ZXN0cyI+Ci0KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iTWVkaWEgQVBJIFRlc3QiPgotICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPCEtLQotICAgIFRvIHJ1biB0aGUgdGVzdHMgdXNlIHRoZSBjb21tYW5kOgotICAgICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBjb20uYW5kcm9pZC5tZWRpYS50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZWRpYSBBUEkgdGVzdCIgLz4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWIwODQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcubW9ja2l0by5NYXRjaGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLS8qKgotICogVGVzdHMge0BsaW5rIFNlc3Npb25QbGF5bGlzdEFnZW50fS4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25QbGF5bGlzdEFnZW50VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1RJTUVfTVMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1JFUEVBVF9NT0RFID0gLTEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9TSFVGRkxFX01PREUgPSAtMTAwOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgRXhlY3V0b3IgbUhhbmRsZXJFeGVjdXRvcjsKLQotICAgIHByaXZhdGUgT2JqZWN0IG1XYWl0TG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24ySW1wbCBtU2Vzc2lvbkltcGw7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBwcml2YXRlIFBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckV2ZW50Q2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtQWdlbnQ7Ci0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1EYXRhU291cmNlSGVscGVyOwotICAgIHByaXZhdGUgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgbUV2ZW50Q2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgY2xhc3MgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrIHsKLSAgICAgICAgYm9vbGVhbiBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZDsKLSAgICAgICAgYm9vbGVhbiBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkQ2FsbGVkOwotICAgICAgICBib29sZWFuIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQ7Ci0gICAgICAgIGJvb2xlYW4gb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgbVdhaXRMb2NrOwotCi0gICAgICAgIHB1YmxpYyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhPYmplY3Qgd2FpdExvY2spIHsKLSAgICAgICAgICAgIG1XYWl0TG9jayA9IHdhaXRMb2NrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25QbGF5bGlzdENoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBvblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RGF0YVNvdXJjZUhlbHBlciBpbXBsZW1lbnRzIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERhdGFTb3VyY2VEZXNjIG9uRGF0YVNvdXJjZU1pc3NpbmcoTWVkaWFTZXNzaW9uMiBzZXNzaW9uLCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgICAgIGlmIChpdGVtLmdldE1lZGlhSWQoKS5jb250YWlucygiV0lUSE9VVF9EU0QiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UoZ2V0Q29udGV4dCgpLCBVcmkucGFyc2UoImRzZDovL3Rlc3QiKSkKLSAgICAgICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoaXRlbS5nZXRNZWRpYUlkKCkpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE1vY2tQbGF5ZXIgZXh0ZW5kcyBNZWRpYVBsYXllckJhc2UgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcGxheSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhdXNlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHQoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2Vla1RvKGxvbmcgcG9zKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5ZXJTdGF0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyaW5nU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2UoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2VzKExpc3Q8RGF0YVNvdXJjZURlc2M+IGRzZHMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGF0YVNvdXJjZURlc2MgZ2V0Q3VycmVudERhdGFTb3VyY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBsb29wQ3VycmVudChib29sZWFuIGxvb3ApIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja1NwZWVkKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmbG9hdCBnZXRQbGF5ZXJWb2x1bWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soRXhlY3V0b3IgZSwgUGxheWVyRXZlbnRDYWxsYmFjayBjYikgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKFBsYXllckV2ZW50Q2FsbGJhY2sgY2IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB9Ci0gICAgfQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Db250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBkZXhtYWtlciBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGV4bWFrZXIvaXNzdWVzL2RldGFpbD9pZD0yCi0gICAgICAgIC8vIERleG1ha2VyIGlzIHVzZWQgYnkgbW9ja2l0by4KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJkZXhtYWtlci5kZXhjYWNoZSIsIG1Db250ZXh0LmdldENhY2hlRGlyKCkuZ2V0UGF0aCgpKTsKLQotICAgICAgICBIYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiU2Vzc2lvblBsYXlsaXN0QWdlbnQiKTsKLSAgICAgICAgaGFuZGxlclRocmVhZC5zdGFydCgpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKGhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOwotICAgICAgICBtSGFuZGxlckV4ZWN1dG9yID0gKHJ1bm5hYmxlKSAtPiB7Ci0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KHJ1bm5hYmxlKTsKLSAgICAgICAgfTsKLQotICAgICAgICBtUGxheWVyID0gbW9jayhNb2NrUGxheWVyLmNsYXNzKTsKLSAgICAgICAgZG9BbnN3ZXIoaW52b2NhdGlvbiAtPiB7Ci0gICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrID0gKFBsYXllckV2ZW50Q2FsbGJhY2spIGFyZ3NbMV07Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSkud2hlbihtUGxheWVyKS5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soTWF0Y2hlcnMuYW55KCksIE1hdGNoZXJzLmFueSgpKTsKLQotICAgICAgICBtU2Vzc2lvbkltcGwgPSBtb2NrKE1lZGlhU2Vzc2lvbjJJbXBsLmNsYXNzKTsKLSAgICAgICAgbURhdGFTb3VyY2VIZWxwZXIgPSBuZXcgTXlEYXRhU291cmNlSGVscGVyKCk7Ci0gICAgICAgIG1BZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudChtU2Vzc2lvbkltcGwsIG1QbGF5ZXIpOwotICAgICAgICBtQWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihtRGF0YVNvdXJjZUhlbHBlcik7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrID0gbmV3IE15UGxheWxpc3RFdmVudENhbGxiYWNrKG1XYWl0TG9jayk7Ci0gICAgICAgIG1BZ2VudC5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtSGFuZGxlckV4ZWN1dG9yLCBtRXZlbnRDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdFNhZmVseSgpOwotICAgICAgICBtSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIG1IYW5kbGVyRXhlY3V0b3IgPSBudWxsOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldEFuZEdldFNodWZsbGVNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzaHVmZmxlTW9kZSA9IG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICBpZiAoc2h1ZmZsZU1vZGUgIT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotCi0gICAgICAgIC8vIElOVkFMSURfU0hVRkZMRV9NT0RFIHdpbGwgbm90IGNoYW5nZSB0aGUgc2h1ZmZsZSBtb2RlLgotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKElOVkFMSURfU0hVRkZMRV9NT0RFKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVAsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRSZXBlYXRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXBlYXRNb2RlID0gbUFnZW50LmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgaWYgKHJlcGVhdE1vZGUgIT0gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVAsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIC8vIElOVkFMSURfU0hVRkZMRV9NT0RFIHdpbGwgbm90IGNoYW5nZSB0aGUgc2h1ZmZsZSBtb2RlLgotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoSU5WQUxJRF9SRVBFQVRfTU9ERSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UGxheWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMTA7Ci0gICAgICAgIGNyZWF0ZUFuZFNldFBsYXlsaXN0KDEwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplLCBtQWdlbnQuZ2V0UGxheWxpc3QoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcEl0ZW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDU7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOwotICAgICAgICAvLyBUZXN0IHNraXBUb1BsYXlsaXN0SXRlbQotICAgICAgICBmb3IgKGludCBpID0gbGlzdFNpemUgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShwbGF5bGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9OZXh0SXRlbQotICAgICAgICAvLyBjdXJQbGF5UG9zID0gMAotICAgICAgICBmb3IgKGludCBjdXJQbGF5UG9zID0gMDsgY3VyUGxheVBvcyA8IGxpc3RTaXplIC0gMTsgKytjdXJQbGF5UG9zKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjdXJQbGF5UG9zICsgMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvUHJldmlvdXMKLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMQotICAgICAgICBmb3IgKGludCBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxOyBjdXJQbGF5UG9zID4gMDsgLS1jdXJQbGF5UG9zKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VyUGxheVBvcyAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOwotICAgICAgICAvLyBUZXN0IHNraXBUb1ByZXZpb3VzIHdpdGggcmVwZWF0IG1vZGUgYWxsCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSAwCi0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9OZXh0IHdpdGggcmVwZWF0IG1vZGUgYWxsCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEKLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEsIG5leHRQbGF5UG9zID0gMAotICAgICAgICAvLyBUZXN0IG5leHQgcGxheSBwb3MgYWZ0ZXIgc2V0dGluZyByZXBlYXQgbW9kZSBub25lLgotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVkaXRQbGF5bGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSA1OwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIC8vIFRlc3QgYWRkIGl0ZW06IFswIChjdXIpLCAxLCAyLCAzLCA0XSAtPiBbMCAoY3VyKSwgMSwgNSwgMiwgMywgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBpdGVtXzUgPSBnZW5lcmF0ZU1lZGlhSXRlbSg1KTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgLy8gTW92ZSBjdXJyZW50OiBbMCAoY3VyKSwgMSwgNSwgMiwgMywgNF0gLT4gWzAsIDEsIDUgKGN1ciksIDIsIDMsIDRdCi0gICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbV81KTsKLSAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzAsIDEsIDUgKGN1ciksIDIsIDMsIDRdIC0+IFswLCAxLCAyIChjdXIpLCAzLCA0XQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW1fNSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBwcmV2aW91cyBpdGVtOiBbMCwgMSwgMiAoY3VyKSwgMywgNF0gLT4gWzAsIDIgKGN1ciksIDMsIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgcHJldmlvdXNJdGVtID0gcGxheWxpc3QuZ2V0KDEpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKHByZXZpb3VzSXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKHByZXZpb3VzSXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBuZXh0IGl0ZW06IFswLCAyIChjdXIpLCAzLCA0XSAtPiBbMCwgMiAoY3VyKSwgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBuZXh0SXRlbSA9IHBsYXlsaXN0LmdldCgyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShuZXh0SXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKG5leHRJdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSBpdGVtOiBbMCwgMiAoY3VyKSwgNF0gLT4gWzAsIDIgKGN1ciksIDVdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5zZXQoMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1BZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIE1vdmUgbGFzdCBhbmQgcmVtb3ZlIHRoZSBsYXN0IGl0ZW06IFswLCAyIChjdXIpLCA1XSAtPiBbMCwgMiwgNSAoY3VyKV0gLT4gWzAsIDIgKGN1cildCi0gICAgICAgIE1lZGlhSXRlbTIgbGFzdEl0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7Ci0gICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0obGFzdEl0ZW0pOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGxhc3RJdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0obGFzdEl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgYWxsIGl0ZW1zCi0gICAgICAgIGZvciAoaW50IGkgPSBwbGF5bGlzdC5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdFdpdGhJbnZhbGlkSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAyOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIC8vIEFkZCBpdGVtOiBbMCAoY3VyKSwgMV0gLT4gWzAgKGN1ciksIDMgKG5vX2RzZCksIDFdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0yID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMSwgaW52YWxpZEl0ZW0yKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0yKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwIHRvIG5leHQgaXRlbTogIFswIChjdXIpLCAyIChub19kc2QpLCAxXSAtPiBbMCwgMiAobm9fZHNkKSwgMSAoY3VyKV0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXAgdG8gcHJldmlvdXMgaXRlbTogWzAsIDIgKG5vX2RzZCksIDEgKGN1cildIC0+IFswIChjdXIpLCAyIChub19kc2QpLCAxXQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0gLT4gWzIgKG5vX2RzZCksIDEgKGN1cildCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldCgwKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFsyIChub19kc2QpLCAxIChjdXIpXSAtPiBbMiAobm9fZHNkKV0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgaXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBBZGQgaW52YWxpZCBpdGVtOiBbMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0wID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMCk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMCwgaW52YWxpZEl0ZW0wKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMCwgaW52YWxpZEl0ZW0wKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIEFkZCB2YWxpZCBpdGVtOiBbMCAobm9fZHNkKSwgMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDEsIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0xID0gZ2VuZXJhdGVNZWRpYUl0ZW0oMSk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMSwgaW52YWxpZEl0ZW0xKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0xKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSB0aGUgdmFsaWQgaXRlbSB3aXRoIGFuIGludmFsaWQgaXRlbToKLSAgICAgICAgLy8gWzAgKG5vX2RzZCksIDEgKGN1ciksIDIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAzIChub19kc2QpLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMyA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDMpOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3Quc2V0KDEsIGludmFsaWRJdGVtMyk7Ci0gICAgICAgICAgICBtQWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbSgxLCBpbnZhbGlkSXRlbTMpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBsYXlsaXN0QWZ0ZXJPbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAyOwotICAgICAgICB2ZXJpZnkobVBsYXllcikucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKE1hdGNoZXJzLmFueSgpLCBNYXRjaGVycy5hbnkoKSk7Ci0KLSAgICAgICAgY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gY3JlYXRlQW5kU2V0UGxheWxpc3QoaW50IGxpc3RTaXplKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyArK2kpIHsKLSAgICAgICAgICAgIGl0ZW1zLmFkZChnZW5lcmF0ZU1lZGlhSXRlbShpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRQbGF5bGlzdChpdGVtcywgbnVsbCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQbGF5bGlzdEVxdWFscyhMaXN0PE1lZGlhSXRlbTI+IGV4cGVjdGVkLCBMaXN0PE1lZGlhSXRlbTI+IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnNpemUoKSwgYWN0dWFsLnNpemUoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQuZ2V0KGkpLmVxdWFscyhhY3R1YWwuZ2V0KGkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoaW50IGtleSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTIuQnVpbGRlcigwKQotICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKCJURVNUX01FRElBX0lEX1dJVEhPVVRfRFNEXyIgKyBrZXkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdlbmVyYXRlTWVkaWFJdGVtKGludCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0yLkJ1aWxkZXIoMCkKLSAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZCgiVEVTVF9NRURJQV9JRF8iICsga2V5KQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL09XTkVSUyBiL3BhY2thZ2VzL09XTkVSUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjNGNlZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9PV05FUlMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWFrZXJzdGVuQGdvb2dsZS5jb20KLWR3a2FuZ0Bnb29nbGUuY29tCi1qYWV3YW5AZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCi1zdW5nc29vQGdvb2dsZS5jb20KLXdqaWFAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvT1dORVJTIGIvc2VydmljZXMvT1dORVJTCmluZGV4IGQ1ZDAwZGEuLjY2YTRiY2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL09XTkVSUworKysgYi9zZXJ2aWNlcy9PV05FUlMKQEAgLTEsNCArMSw3IEBACitjaHpAZ29vZ2xlLmNvbQogZWxhdXJlbnRAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KIGV0YWx2YWxhQGdvb2dsZS5jb20KIGdrYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IDc0MTllNjQuLjQwOTgwYTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC0yLDI0ICsyLDYgQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgU2VydmljZVV0aWxpdGllcy5jcHAKLQotIyBGSVhNRSBNb3ZlIHRoaXMgbGlicmFyeSB0byBmcmFtZXdvcmtzL25hdGl2ZQotTE9DQUxfTU9EVUxFIDo9IGxpYnNlcnZpY2V1dGlsaXR5Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGliYmluZGVyCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCiAgICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKQEAgLTMxLDcgKzEzLDggQEAKICAgICBQYXRjaFBhbmVsLmNwcCAgICAgICAgICAgICAgXAogICAgIFN0YXRlUXVldWUuY3BwICAgICAgICAgICAgICBcCiAgICAgQnVmTG9nLmNwcCAgICAgICAgICAgICAgICAgIFwKLSAgICBUeXBlZExvZ2dlci5jcHAKKyAgICBUeXBlZExvZ2dlci5jcHAgICAgICAgICAgICAgXAorICAgIE5CQUlPX1RlZS5jcHAgICAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXApAQCAtNDksMTcgKzMyLDE5IEBACiAgICAgbGliYmluZGVyIFwKICAgICBsaWJhdWRpb2NsaWVudCBcCiAgICAgbGlibWVkaWFsb2dzZXJ2aWNlIFwKKyAgICBsaWJtZWRpYW1ldHJpY3MgXAogICAgIGxpYm1lZGlhdXRpbHMgXAogICAgIGxpYm5iYWlvIFwKICAgICBsaWJuYmxvZyBcCiAgICAgbGlicG93ZXJtYW5hZ2VyIFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGlibWVkaWF1dGlscyBcCiAgICAgbGlibWVtdW5yZWFjaGFibGUgXAotICAgIGxpYm1lZGlhX2hlbHBlcgorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGlidmlicmF0b3IKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3B1c3RhdHMgXAorICAgIGxpYnNuZGZpbGUgXAogCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQogCkBAIC04Miw2ICs2Nyw3IEBACiBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgogCiBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfU0FOSVRJWkUgOj0gaW50ZWdlcl9vdmVyZmxvdwogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggNjg3YjVhNi4uYjhmODhjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTIzLDEyICsyMywxMyBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvb3MvSUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KQEAgLTQ3LDcgKzQ4LDcgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAKQEAgLTU2LDcgKzU3LDYgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3RyaW5nLmg+CiAKICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+CiAKQEAgLTY0LDggKzY0LDggQEAKICNpbmNsdWRlIDxtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKIC8vI2RlZmluZSBCVUZMT0dfTkRFQlVHIDAKQEAgLTEwMCwxNyArMTAwLDYgQEAKIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjptU2NyZWVuU3RhdGU7CiAKLQotI2lmZGVmIFRFRV9TSU5LCi1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtJbnB1dEVuYWJsZWQgPSBmYWxzZTsKLWJvb2wgQXVkaW9GbGluZ2VyOjptVGVlU2lua091dHB1dEVuYWJsZWQgPSBmYWxzZTsKLWJvb2wgQXVkaW9GbGluZ2VyOjptVGVlU2lua1RyYWNrRW5hYmxlZCA9IGZhbHNlOwotCi1zaXplX3QgQXVkaW9GbGluZ2VyOjptVGVlU2lua0lucHV0RnJhbWVzID0ga1RlZVNpbmtJbnB1dEZyYW1lc0RlZmF1bHQ7Ci1zaXplX3QgQXVkaW9GbGluZ2VyOjptVGVlU2lua091dHB1dEZyYW1lcyA9IGtUZWVTaW5rT3V0cHV0RnJhbWVzRGVmYXVsdDsKLXNpemVfdCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rVHJhY2tGcmFtZXMgPSBrVGVlU2lua1RyYWNrRnJhbWVzRGVmYXVsdDsKLSNlbmRpZgotCiAvLyBJbiBvcmRlciB0byBhdm9pZCBpbnZhbGlkYXRpbmcgb2ZmbG9hZGVkIHRyYWNrcyBlYWNoIHRpbWUgYSBWaXN1YWxpemVyIGlzIHR1cm5lZCBvbiBhbmQgb2ZmCiAvLyB3ZSBkZWZpbmUgYSBtaW5pbXVtIHRpbWUgZHVyaW5nIHdoaWNoIGEgZ2xvYmFsIGVmZmVjdCBpcyBjb25zaWRlcmVkIGVuYWJsZWQuCiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWluR2xvYmFsRWZmZWN0RW5hYmxldGltZU5zID0gc2Vjb25kcyg3MjAwKTsKQEAgLTEzNCw2ICsxMjMsMjEgQEAKICAgICB9CiB9CiAKKy8vIEtlZXAgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIGV4dGVybmFsIHZpYnJhdG9yIHNlcnZpY2UKK3N0YXRpYyBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBzRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U7CisKK3N0YXRpYyBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBnZXRFeHRlcm5hbFZpYnJhdG9yU2VydmljZSgpIHsKKyAgICBpZiAoc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlID09IDApIHsKKyAgICAgICAgc3AgPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKAorICAgICAgICAgICAgU3RyaW5nMTYoImV4dGVybmFsX3ZpYnJhdG9yX3NlcnZpY2UiKSk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICAgICAgc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPihiaW5kZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RkOjpzdHJpbmcgZm9ybWF0VG9TdHJpbmcoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CkBAIC0xNjAsNiArMTY0LDcgQEAKICAgICAgIG1Ub3RhbE1lbW9yeSgwKSwKICAgICAgIG1DbGllbnRTaGFyZWRIZWFwU2l6ZShrTWluaW11bUNsaWVudFNoYXJlZEhlYXBTaXplQnl0ZXMpLAogICAgICAgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWUoMCksCisgICAgICBtUGF0Y2hQYW5lbCh0aGlzKSwKICAgICAgIG1TeXN0ZW1SZWFkeShmYWxzZSkKIHsKICAgICAvLyB1bnNpZ25lZCBpbnN0ZWFkIG9mIGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCwgYmVjYXVzZSArKyBvcGVyYXRvciBpcyB1bmF2YWlsYWJsZSBmb3IgZW51bQpAQCAtMTY4LDcgKzE3Myw2IEBACiAgICAgICAgIG1OZXh0VW5pcXVlSWRzW3VzZV0gPSBBVURJT19VTklRVUVfSURfVVNFX01BWDsKICAgICB9CiAKLSAgICBnZXRwaWRfY2FjaGVkID0gZ2V0cGlkKCk7CiAgICAgY29uc3QgYm9vbCBkb0xvZyA9IHByb3BlcnR5X2dldF9ib29sKCJyby50ZXN0X2hhcm5lc3MiLCBmYWxzZSk7CiAgICAgaWYgKGRvTG9nKSB7CiAgICAgICAgIG1Mb2dNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTG9nV3JpdGVycyIsCkBAIC0xODUsMjcgKzE4OSw2IEBACiAgICAgbUVmZmVjdHNGYWN0b3J5SGFsID0gRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpOwogCiAgICAgbU1lZGlhTG9nTm90aWZpZXItPnJ1bigiTWVkaWFMb2dOb3RpZmllciIpOwotCi0jaWZkZWYgVEVFX1NJTksKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgKHZvaWQpIHByb3BlcnR5X2dldCgicm8uZGVidWdnYWJsZSIsIHZhbHVlLCAiMCIpOwotICAgIGludCBkZWJ1Z2dhYmxlID0gYXRvaSh2YWx1ZSk7Ci0gICAgaW50IHRlZUVuYWJsZWQgPSAwOwotICAgIGlmIChkZWJ1Z2dhYmxlKSB7Ci0gICAgICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoImFmLnRlZSIsIHZhbHVlLCAiMCIpOwotICAgICAgICB0ZWVFbmFibGVkID0gYXRvaSh2YWx1ZSk7Ci0gICAgfQotICAgIC8vIEZJWE1FIHN5bWJvbGljIGNvbnN0YW50cyBoZXJlCi0gICAgaWYgKHRlZUVuYWJsZWQgJiAxKSB7Ci0gICAgICAgIG1UZWVTaW5rSW5wdXRFbmFibGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiAyKSB7Ci0gICAgICAgIG1UZWVTaW5rT3V0cHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgfQotICAgIGlmICh0ZWVFbmFibGVkICYgNCkgewotICAgICAgICBtVGVlU2lua1RyYWNrRW5hYmxlZCA9IHRydWU7Ci0gICAgfQotI2VuZGlmCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpvbkZpcnN0UmVmKCkKQEAgLTIyNiw4ICsyMDksNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgbVBhdGNoUGFuZWwgPSBuZXcgUGF0Y2hQYW5lbCh0aGlzKTsKLQogICAgIG1Nb2RlID0gQVVESU9fTU9ERV9OT1JNQUw7CiAKICAgICBnQXVkaW9GbGluZ2VyID0gdGhpczsKQEAgLTI0Myw2ICsyMjQsMTQgQEAKICAgICAgICAgLy8gY2xvc2VPdXRwdXRfbm9udmlydHVhbCgpIHdpbGwgcmVtb3ZlIHNwZWNpZmllZCBlbnRyeSBmcm9tIG1QbGF5YmFja1RocmVhZHMKICAgICAgICAgY2xvc2VPdXRwdXRfbm9udmlydHVhbChtUGxheWJhY2tUaHJlYWRzLmtleUF0KDApKTsKICAgICB9CisgICAgd2hpbGUgKCFtTW1hcFRocmVhZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gbU1tYXBUaHJlYWRzLmtleUF0KDApOworICAgICAgICBpZiAobU1tYXBUaHJlYWRzLnZhbHVlQXQoMCktPmlzT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0X25vbnZpcnR1YWwoaW8pOyAvLyByZW1vdmVzIGVudHJ5IGZyb20gbU1tYXBUaHJlYWRzCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbG9zZUlucHV0X25vbnZpcnR1YWwoaW8pOyAgLy8gcmVtb3ZlcyBlbnRyeSBmcm9tIG1NbWFwVGhyZWFkcworICAgICAgICB9CisgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgLy8gbm8gbUhhcmR3YXJlTG9jayBuZWVkZWQsIGFzIHRoZXJlIGFyZSBubyBvdGhlciByZWZlcmVuY2VzIHRvIHRoaXMKQEAgLTMxMSwxMyArMzAwLDE2IEBACiAgICAgICAgIGZ1bGxDb25maWcuc2FtcGxlX3JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwogICAgICAgICBmdWxsQ29uZmlnLmNoYW5uZWxfbWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOwogICAgICAgICBmdWxsQ29uZmlnLmZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OworICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoYXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1UeXBlLCBjbGllbnQuY2xpZW50UGlkLCBjbGllbnQuY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVsbENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCwgJnBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgICAgIEFMT0dXX0lGKCFzZWNvbmRhcnlPdXRwdXRzLmVtcHR5KCksCisgICAgICAgICAgICAgICAgICIlcyBkb2VzIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzLCBpZ25vcmluZyB0aGVtIiwgX19mdW5jX18pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoYXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNlc3Npb25JZCwKQEAgLTM0MSw3ICszMzMsNyBAQAogICAgICAgICAqc2Vzc2lvbklkID0gYWN0dWFsU2Vzc2lvbklkOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX09VVFBVVCkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoaW8sIHN0cmVhbVR5cGUsIGFjdHVhbFNlc3Npb25JZCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgICAgICB9CkBAIC0zNTMsNiArMzQ1LDI3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorLyogc3RhdGljICovCitpbnQgQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pIHsKKyAgICBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBldnMgPSBnZXRFeHRlcm5hbFZpYnJhdG9yU2VydmljZSgpOworICAgIGlmIChldnMgIT0gMCkgeworICAgICAgICBpbnQzMl90IHJldDsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gZXZzLT5vbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoKmV4dGVybmFsVmlicmF0aW9uLCAmcmV0KTsKKyAgICAgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9NVVRFOworfQorCisvKiBzdGF0aWMgKi8KK3ZvaWQgQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RvcChjb25zdCBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+JiBleHRlcm5hbFZpYnJhdGlvbikgeworICAgIHNwPG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U+IGV2cyA9IGdldEV4dGVybmFsVmlicmF0b3JTZXJ2aWNlKCk7CisgICAgaWYgKGV2cyAhPSAwKSB7CisgICAgICAgIGV2cy0+b25FeHRlcm5hbFZpYnJhdGlvblN0b3AoKmV4dGVybmFsVmlicmF0aW9uKTsKKyAgICB9Cit9CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXVkaW9faW50ZXJmYWNlc1tdID0gewogICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZLAogICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLApAQCAtNDc4LDcgKzQ5MSw3IEBACiAgICAgICAgICAgICBtSGFyZHdhcmVMb2NrLnVubG9jaygpOwogICAgICAgICB9CiAKLSAgICAgICAgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CisgICAgICAgIGNvbnN0IGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogCiAgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gQXVkaW9GbGluZ2VyIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKICAgICAgICAgaWYgKCFsb2NrZWQpIHsKQEAgLTUzNCwxMiArNTQ3LDIyIEBACiAgICAgICAgICAgICBkZXYtPmR1bXAoZmQpOwogICAgICAgICB9CiAKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAvLyBkdW1wIHRoZSBzZXJpYWxseSBzaGFyZWQgcmVjb3JkIHRlZSBzaW5rCi0gICAgICAgIGlmIChtUmVjb3JkVGVlU291cmNlICE9IDApIHsKLSAgICAgICAgICAgIGR1bXBUZWUoZmQsIG1SZWNvcmRUZWVTb3VyY2UsIEFVRElPX0lPX0hBTkRMRV9OT05FLCAnQycpOwotICAgICAgICB9Ci0jZW5kaWYKKyAgICAgICAgbVBhdGNoUGFuZWwuZHVtcChmZCk7CisKKyAgICAgICAgLy8gZHVtcCBleHRlcm5hbCBzZXRQYXJhbWV0ZXJzCisgICAgICAgIGF1dG8gZHVtcExvZ2dlciA9IFtmZF0oU2ltcGxlTG9nJiBsb2dnZXIsIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzIHNldFBhcmFtZXRlcnM6XG4iLCBuYW1lKTsKKyAgICAgICAgICAgIGxvZ2dlci5kdW1wKGZkLCAiICAgICIgLyogcHJlZml4ICovKTsKKyAgICAgICAgfTsKKyAgICAgICAgZHVtcExvZ2dlcihtUmVqZWN0ZWRTZXRQYXJhbWV0ZXJMb2csICJSZWplY3RlZCIpOworICAgICAgICBkdW1wTG9nZ2VyKG1BcHBTZXRQYXJhbWV0ZXJMb2csICJBcHAiKTsKKyAgICAgICAgZHVtcExvZ2dlcihtU3lzdGVtU2V0UGFyYW1ldGVyTG9nLCAiU3lzdGVtIik7CisKKyAgICAgICAgLy8gZHVtcCBoaXN0b3JpY2FsIHRocmVhZHMgaW4gdGhlIGxhc3QgMTAgc2Vjb25kcworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB0aHJlYWRMb2cgPSBtVGhyZWFkTG9nLmR1bXBUb1N0cmluZygKKyAgICAgICAgICAgICAgICAiSGlzdG9yaWNhbCBUaHJlYWQgTG9nICIsIDAgLyogbGluZXMgKi8sCisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpIC0gMTAgKiA2MCAqIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICB3cml0ZShmZCwgdGhyZWFkTG9nLmNfc3RyKCksIHRocmVhZExvZy5zaXplKCkpOwogCiAgICAgICAgIEJVRkxPR19SRVNFVDsKIApAQCAtNTQ3LDYgKzU3MCwxMCBAQAogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgIH0KIAorI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIC8vIE5CQUlPX1RlZSBkdW1wIGlzIHNhZmUgdG8gY2FsbCBvdXRzaWRlIG9mIEFGIGxvY2suCisgICAgICAgIE5CQUlPX1RlZTo6ZHVtcEFsbChmZCwgIl9EVU1QIik7CisjZW5kaWYKICAgICAgICAgLy8gYXBwZW5kIGEgY29weSBvZiBtZWRpYS5sb2cgaGVyZSBieSBmb3J3YXJkaW5nIGZkIHRvIGl0LCBidXQgZG9uJ3QgYXR0ZW1wdAogICAgICAgICAvLyB0byBsb29rdXAgdGhlIHNlcnZpY2UgaWYgaXQncyBub3QgcnVubmluZywgYXMgaXQgd2lsbCBibG9jayBmb3IgYSBzZWNvbmQKICAgICAgICAgaWYgKHNNZWRpYUxvZ1NlcnZpY2VBc0JpbmRlciAhPSAwKSB7CkBAIC02NjIsMTEgKzY4OSwxMiBAQAogICAgIHN0YXR1c190IGxTdGF0dXM7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKIAogICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIHVpZF90IGNsaWVudFVpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50VWlkOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKQEAgLTY5Niw3ICs3MjQsNyBAQAogCiAgICAgbFN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZpbnB1dC5hdHRyLCAmb3V0cHV0Lm91dHB1dElkLCBzZXNzaW9uSWQsICZzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgJmlucHV0LmNvbmZpZywgaW5wdXQuZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOwogCiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgfHwgb3V0cHV0Lm91dHB1dElkID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGdldE91dHB1dEZvckF0dHIoKSByZXR1cm4gZXJyb3IgJWQgb3IgaW52YWxpZCBvdXRwdXQgaGFuZGxlIiwgbFN0YXR1cyk7CkBAIC03NjcsNiArNzk1LDYyIEBACiAgICAgICAgIG91dHB1dC5hZkZyYW1lQ291bnQgPSB0aHJlYWQtPmZyYW1lQ291bnQoKTsKICAgICAgICAgb3V0cHV0LmFmU2FtcGxlUmF0ZSA9IHRocmVhZC0+c2FtcGxlUmF0ZSgpOwogICAgICAgICBvdXRwdXQuYWZMYXRlbmN5TXMgPSB0aHJlYWQtPmxhdGVuY3koKTsKKyAgICAgICAgb3V0cHV0LnBvcnRJZCA9IHBvcnRJZDsKKworICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gQ29ubmVjdCBzZWNvbmRhcnkgb3V0cHV0cy4gRmFpbHVyZSBvbiBhIHNlY29uZGFyeSBvdXRwdXQgbXVzdCBub3QgaW1wZWQgdGhlIHByaW1hcnkKKyAgICAgICAgICAgIC8vIEFueSBzZWNvbmRhcnkgb3V0cHV0IHNldHVwIGZhaWx1cmUgd2lsbCBsZWFkIHRvIGEgZGVzeW5jIGJldHdlZW4gdGhlIEFQIGFuZCBBRiB1bnRpbAorICAgICAgICAgICAgLy8gdGhlIHRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIFRlZVBhdGNoZXMgdGVlUGF0Y2hlczsKKyAgICAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgc2Vjb25kYXJ5T3V0cHV0IDogc2Vjb25kYXJ5T3V0cHV0cykgeworICAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpzZWNvbmRhcnlUaHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2woc2Vjb25kYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vjb25kYXJ5VGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm5vIHBsYXliYWNrIHRocmVhZCBmb3VuZCBmb3Igc2Vjb25kYXJ5IG91dHB1dCAlZCIsIG91dHB1dC5vdXRwdXRJZCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gc3RkOjpsY20odGhyZWFkLT5mcmFtZUNvdW50KCksIHNlY29uZGFyeVRocmVhZC0+ZnJhbWVDb3VudCgpKTsKKworICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKyAgICAgICAgICAgICAgICBhdXRvIGluQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2spOworICAgICAgICAgICAgICAgIHNwIHBhdGNoUmVjb3JkID0gbmV3IFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQobnVsbHB0ciAvKiB0aHJlYWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogYnVmZmVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBucyAvKiB0aW1lb3V0ICovKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXRjaFJlY29yZC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiU2Vjb25kYXJ5IG91dHB1dCBwYXRjaFJlY29yZCBpbml0IGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3AgcGF0Y2hUcmFjayA9IG5ldyBQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjayhzZWNvbmRhcnlUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFJlY29yZC0+YnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMG5zIC8qIHRpbWVvdXQgKi8pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhdGNoVHJhY2stPmluaXRDaGVjaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlNlY29uZGFyeSBvdXRwdXQgcGF0Y2hUcmFjayBpbml0IGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVlUGF0Y2hlcy5wdXNoX2JhY2soe3BhdGNoUmVjb3JkLCBwYXRjaFRyYWNrfSk7CisgICAgICAgICAgICAgICAgc2Vjb25kYXJ5VGhyZWFkLT5hZGRQYXRjaFRyYWNrKHBhdGNoVHJhY2spOworICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIGRvd25zdHJlYW0gcGF0Y2hUcmFjayBvbiB0aGUgc2Vjb25kYXJ5VGhyZWFkIHRlbXBvcmFyaWx5IG91dGxpdmVzCisgICAgICAgICAgICAgICAgLy8gb3VyIGNyZWF0ZWQgdHJhY2ssIGVuc3VyZSB0aGUgY29ycmVzcG9uZGluZyBwYXRjaFJlY29yZCBpcyBzdGlsbCBhbGl2ZS4KKyAgICAgICAgICAgICAgICBwYXRjaFRyYWNrLT5zZXRQZWVyUHJveHkocGF0Y2hSZWNvcmQsIHRydWUgLyogaG9sZFJlZmVyZW5jZSAqLyk7CisgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPnNldFBlZXJQcm94eShwYXRjaFRyYWNrLCBmYWxzZSAvKiBob2xkUmVmZXJlbmNlICovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNrLT5zZXRUZWVQYXRjaGVzKHN0ZDo6bW92ZSh0ZWVQYXRjaGVzKSk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBtb3ZlIGVmZmVjdCBjaGFpbiB0byB0aGlzIG91dHB1dCB0aHJlYWQgaWYgYW4gZWZmZWN0IG9uIHNhbWUgc2Vzc2lvbiB3YXMgd2FpdGluZwogICAgICAgICAvLyBmb3IgYSB0cmFjayB0byBiZSBjcmVhdGVkCkBAIC04MTMsNyArODk3LDcgQEAKIAogRXhpdDoKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiAmJiBvdXRwdXQub3V0cHV0SWQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQob3V0cHV0Lm91dHB1dElkLCBzdHJlYW1UeXBlLCBzZXNzaW9uSWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgIH0KICAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gdHJhY2tIYW5kbGU7CkBAIC05MTcsNiArMTAwMSw0MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpCit7CisgICAgc3RhdHVzX3QgcmV0ID0gaW5pdENoZWNrKCk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICAvLyBjaGVjayByYW5nZQorICAgIGlmIChpc25hbihiYWxhbmNlKSB8fCBmYWJzKGJhbGFuY2UpID4gMS5mKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIHNob3J0IGN1dC4KKyAgICBpZiAobU1hc3RlckJhbGFuY2UgPT0gYmFsYW5jZSkgcmV0dXJuIE5PX0VSUk9SOworCisgICAgbU1hc3RlckJhbGFuY2UgPSBiYWxhbmNlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRpbmcoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKQogewogICAgIHN0YXR1c190IHJldCA9IGluaXRDaGVjaygpOwpAQCAtMTA1Niw2ICsxMTc0LDEzIEBACiAgICAgcmV0dXJuIG1hc3RlclZvbHVtZV9sKCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICpiYWxhbmNlID0gZ2V0TWFzdGVyQmFsYW5jZV9sKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOyAvLyBpZiBjYWxsZWQgdGhyb3VnaCBiaW5kZXIsIG1heSByZXR1cm4gYSB0cmFuc2FjdGlvbmFsIGVycm9yCit9CisKIGJvb2wgQXVkaW9GbGluZ2VyOjptYXN0ZXJNdXRlKCkgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTA2Nyw2ICsxMTkyLDExIEBACiAgICAgcmV0dXJuIG1NYXN0ZXJWb2x1bWU7CiB9CiAKK2Zsb2F0IEF1ZGlvRmxpbmdlcjo6Z2V0TWFzdGVyQmFsYW5jZV9sKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbU1hc3RlckJhbGFuY2U7Cit9CisKIGJvb2wgQXVkaW9GbGluZ2VyOjptYXN0ZXJNdXRlX2woKSBjb25zdAogewogICAgIHJldHVybiBtTWFzdGVyTXV0ZTsKQEAgLTEwNzgsOSArMTIwOCw5IEBACiAgICAgICAgIEFMT0dXKCJjaGVja1N0cmVhbVR5cGUoKSBpbnZhbGlkIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCAmJiBjYWxsZXIgIT0gZ2V0cGlkX2NhY2hlZCkgewotICAgICAgICBBTE9HVygiY2hlY2tTdHJlYW1UeXBlKCkgcGlkICVkIGNhbm5vdCB1c2UgaW50ZXJuYWwgc3RyZWFtIHR5cGUgJWQiLCBjYWxsZXIsIHN0cmVhbSk7CisgICAgY29uc3QgdWlkX3QgY2FsbGVyVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UICYmICFpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCkpIHsKKyAgICAgICAgQUxPR1coImNoZWNrU3RyZWFtVHlwZSgpIHVpZCAlZCBjYW5ub3QgdXNlIGludGVybmFsIHN0cmVhbSB0eXBlICVkIiwgY2FsbGVyVWlkLCBzdHJlYW0pOwogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCkBAIC0xMTgwLDYgKzEzMTAsMjMgQEAKICAgICB9CiB9CiAKKy8vIGZvcndhcmRBdWRpb0h3U3luY1RvRG93bnN0cmVhbVBhdGNoZXNfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6Zm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2woCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHVwU3RyZWFtLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCkKK3sKKyAgICBzdGQ6OnZlY3RvcjxQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiBzd1BhdGNoZXM7CisgICAgaWYgKG1QYXRjaFBhbmVsLmdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXModXBTdHJlYW0sICZzd1BhdGNoZXMpICE9IE9LKSByZXR1cm47CisgICAgQUxPR1ZfSUYoIXN3UGF0Y2hlcy5lbXB0eSgpLCAiJXMgZm91bmQgJXp1IGRvd25zdHJlYW0gcGF0Y2hlcyBmb3Igc3RyZWFtIElEICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzd1BhdGNoZXMuc2l6ZSgpLCB1cFN0cmVhbSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBzd1BhdGNoIDogc3dQYXRjaGVzKSB7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiBkb3duU3RyZWFtID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKHN3UGF0Y2guZ2V0UGxheWJhY2tUaHJlYWRIYW5kbGUoKSk7CisgICAgICAgIGlmIChkb3duU3RyZWFtICE9IE5VTEwgJiYgKHVzZVRocmVhZCA9PSBudWxscHRyIHx8IHVzZVRocmVhZChkb3duU3RyZWFtKSkpIHsKKyAgICAgICAgICAgIGRvd25TdHJlYW0tPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8vIEZpbHRlciByZXNlcnZlZCBrZXlzIGZyb20gc2V0UGFyYW1ldGVycygpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIGF1ZGlvIEhBTCBvciBhY3RpbmcgdXBvbi4KIC8vIFNvbWUga2V5cyBhcmUgdXNlZCBmb3IgYXVkaW8gcm91dGluZyBhbmQgYXVkaW8gcGF0aCBjb25maWd1cmF0aW9uIGFuZCBzaG91bGQgYmUgcmVzZXJ2ZWQgZm9yIHVzZQogLy8gYnkgYXVkaW8gcG9saWN5IGFuZCBhdWRpbyBmbGluZ2VyIGZvciBmdW5jdGlvbmFsLCBwcml2YWN5IGFuZCBzZWN1cml0eSByZWFzb25zLgpAQCAtMTIwMCwyMyArMTM0NywzOSBAQAogICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwKICAgICB9OwogCi0gICAgLy8gbXVsdGl1c2VyIGZyaWVuZGx5IGFwcCBJRCBjaGVjayBmb3IgcmVxdWVzdHMgY29taW5nIGZyb20gYXVkaW9zZXJ2ZXIKLSAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoY2FsbGluZ1VpZCkgPT0gQUlEX0FVRElPU0VSVkVSKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoaXNBdWRpb1NlcnZlclVpZChjYWxsaW5nVWlkKSkgeworICAgICAgICByZXR1cm47IC8vIG5vIG5lZWQgdG8gZmlsdGVyIGlmIGF1ZGlvc2VydmVyLgogICAgIH0KIAogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlycyk7CiAgICAgU3RyaW5nOCB2YWx1ZTsKKyAgICBBdWRpb1BhcmFtZXRlciByZWplY3RlZFBhcmFtOwogICAgIGZvciAoYXV0byYga2V5IDoga1Jlc2VydmVkUGFyYW1ldGVycykgewogICAgICAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXM6IGZpbHRlcmluZyBrZXkgJXMgdmFsdWUgJXMgZnJvbSB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCksIGNhbGxpbmdVaWQpOworICAgICAgICAgICAgcmVqZWN0ZWRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKICAgICAgICAgfQogICAgIH0KKyAgICBsb2dGaWx0ZXJlZFBhcmFtZXRlcnMocGFyYW0uc2l6ZSgpICsgcmVqZWN0ZWRQYXJhbS5zaXplKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkUGFyYW0uc2l6ZSgpLCByZWplY3RlZFBhcmFtLnRvU3RyaW5nKCksIGNhbGxpbmdVaWQpOwogICAgIGtleVZhbHVlUGFpcnMgPSBwYXJhbS50b1N0cmluZygpOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6bG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHNpemVfdCBvcmlnaW5hbEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIG9yaWdpbmFsS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlamVjdGVkS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgcmVqZWN0ZWRLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjYWxsaW5nVWlkKSB7CisgICAgYXV0byBwcmVmaXggPSBTdHJpbmc4Ojpmb3JtYXQoIlVJRCAlNWQiLCBjYWxsaW5nVWlkKTsKKyAgICBhdXRvIHN1ZmZpeCA9IFN0cmluZzg6OmZvcm1hdCgiJXp1IEtWUCByZWNlaXZlZDogJXMiLCBvcmlnaW5hbEtWUFNpemUsIG9yaWdpbmFsS1ZQcy5jX3N0cigpKTsKKyAgICBpZiAocmVqZWN0ZWRLVlBTaXplICE9IDApIHsKKyAgICAgICAgYXV0byBlcnJvciA9IFN0cmluZzg6OmZvcm1hdCgiJXp1IEtWUCByZWplY3RlZDogJXMiLCByZWplY3RlZEtWUFNpemUsIHJlamVjdGVkS1ZQcy5jX3N0cigpKTsKKyAgICAgICAgQUxPR1coIiVzOiAlcywgJXMsICVzIiwgX19mdW5jX18sIHByZWZpeC5jX3N0cigpLCBlcnJvci5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgICAgIG1SZWplY3RlZFNldFBhcmFtZXRlckxvZy5sb2coIiVzLCAlcywgJXMiLCBwcmVmaXguY19zdHIoKSwgZXJyb3IuY19zdHIoKSwgc3VmZml4LmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG8mIGxvZ2dlciA9IChpc1NlcnZpY2VVaWQoY2FsbGluZ1VpZCkgPyBtU3lzdGVtU2V0UGFyYW1ldGVyTG9nIDogbUFwcFNldFBhcmFtZXRlckxvZyk7CisgICAgICAgIGxvZ2dlci5sb2coIiVzLCAlcyIsIHByZWZpeC5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgQUxPR1YoInNldFBhcmFtZXRlcnMoKTogaW8gJWQsIGtleXZhbHVlICVzLCBjYWxsaW5nIHBpZCAlZCBjYWxsaW5nIHVpZCAlZCIsCkBAIC0xMjk2LDcgKzE0NTksOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICByZXR1cm4gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOworICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CkBAIC0xNjM2LDcgKzE4MDEsNyBAQAogICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIHVpZF90IGNsaWVudFVpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50VWlkOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKQEAgLTE3NTEsNiArMTkxNiw3IEBACiAKICAgICBvdXRwdXQuY2JsayA9IHJlY29yZFRyYWNrLT5nZXRDYmxrKCk7CiAgICAgb3V0cHV0LmJ1ZmZlcnMgPSByZWNvcmRUcmFjay0+Z2V0QnVmZmVycygpOworICAgIG91dHB1dC5wb3J0SWQgPSBwb3J0SWQ7CiAKICAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAogICAgIHJlY29yZEhhbmRsZSA9IG5ldyBSZWNvcmRIYW5kbGUocmVjb3JkVHJhY2spOwpAQCAtMTg1NCw2ICsyMDIwLDEwIEBACiAKICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICB9CisgICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwKSB7CisgICAgICAgIC8vIEFuIE1TRCBtb2R1bGUgaXMgaW5zZXJ0ZWQgYmVmb3JlIGhhcmR3YXJlIG1vZHVsZXMgaW4gb3JkZXIgdG8gbWl4IGVuY29kZWQgc3RyZWFtcy4KKyAgICAgICAgZmxhZ3MgPSBzdGF0aWNfY2FzdDxBdWRpb0h3RGV2aWNlOjpGbGFncz4oZmxhZ3MgfCBBdWRpb0h3RGV2aWNlOjpBSFdEX0lTX0lOU0VSVCk7CisgICAgfQogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSA9IChhdWRpb19tb2R1bGVfaGFuZGxlX3QpIG5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX01PRFVMRSk7CiAgICAgbUF1ZGlvSHdEZXZzLmFkZChoYW5kbGUsIG5ldyBBdWRpb0h3RGV2aWNlKGhhbmRsZSwgbmFtZSwgZGV2LCBmbGFncykpOwpAQCAtMTg4NSw3ICsyMDU1LDcgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpCiB7CiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICh1aWQgIT0gQUlEX1NZU1RFTSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yU3lzdGVtU2VydmVyVWlkKHVpZCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTkzMCw2ICsyMTAwLDI4IEBACiAgICAgcmV0dXJuIG1DbGllbnRTaGFyZWRIZWFwU2l6ZTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgQUxPR1YoX19mdW5jX18pOworCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZTsKKyAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5taXguaHdfbW9kdWxlOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygiJXMoKSBiYWQgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIG1vZHVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Cit9CisKIGF1ZGlvX2h3X3N5bmNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xOTc1LDcgKzIxNjcsMTAgQEAKICAgICAgICAgaWYgKHNlc3Npb25zICYgVGhyZWFkQmFzZTo6VFJBQ0tfU0VTU0lPTikgewogICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUh3QXZTeW5jKSwgdmFsdWUpOwotICAgICAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKHRocmVhZC0+aWQoKSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpIHsgcmV0dXJuIHRocmVhZC0+dXNlc0h3QXZTeW5jKCk7IH0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDIxLDcgKzIyMTYsMTAgQEAKICAgICAgICAgQUxPR1YoInNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sIGZvdW5kIElEICVkIGZvciBzZXNzaW9uICVkIiwgc3luY0lkLCBzZXNzaW9uSWQpOwogICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyksIHN5bmNJZCk7Ci0gICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKKyAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpIHsgcmV0dXJuIHRocmVhZC0+dXNlc0h3QXZTeW5jKCk7IH0pOwogICAgIH0KIH0KIApAQCAtMjExMSw2ICsyMzA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoKm91dHB1dCwgdGhyZWFkKTsKKyAgICAgICAgICAgIG1QYXRjaFBhbmVsLm5vdGlmeVN0cmVhbU9wZW5lZChvdXRId0RldiwgKm91dHB1dCk7CiAgICAgICAgICAgICByZXR1cm4gdGhyZWFkOwogICAgICAgICB9CiAgICAgfQpAQCAtMjIwOSw2ICsyNDA4LDggQEAKICAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkICE9IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpICVkIiwgb3V0cHV0KTsKIAorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wocGxheWJhY2tUaHJlYWQpOworCiAgICAgICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUikgewogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0aW5nKCkpIHsKQEAgLTIyNDAsMTIgKzI0NDEsMTQgQEAKICAgICAgICAgICAgIGlmIChtbWFwVGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wobW1hcFRocmVhZCk7CiAgICAgICAgICAgICBtTW1hcFRocmVhZHMucmVtb3ZlSXRlbShvdXRwdXQpOwogICAgICAgICAgICAgQUxPR0QoImNsb3NpbmcgbW1hcFRocmVhZCAlcCIsIG1tYXBUaHJlYWQuZ2V0KCkpOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUgPSBvdXRwdXQ7CiAgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19PVVRQVVRfQ0xPU0VELCBpb0Rlc2MpOworICAgICAgICBtUGF0Y2hQYW5lbC5ub3RpZnlTdHJlYW1DbG9zZWQob3V0cHV0KTsKICAgICB9CiAgICAgLy8gVGhlIHRocmVhZCBlbnRpdHkgKGFjdGl2ZSB1bml0IG9mIGV4ZWN1dGlvbikgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcgaGVyZSwKICAgICAvLyBidXQgdGhlIFRocmVhZEJhc2UgY29udGFpbmVyIHN0aWxsIGV4aXN0cy4KQEAgLTIyNzQsNyArMjQ3Nyw3IEBACiAgICAgZGVsZXRlIG91dDsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlT3V0cHV0SW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpCiB7CiAgICAgbVBsYXliYWNrVGhyZWFkcy5yZW1vdmVJdGVtKHRocmVhZC0+bUlkKTsKICAgICB0aHJlYWQtPmV4aXQoKTsKQEAgLTIzMjYsNyArMjUyOSw4IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3BlbklucHV0X2wobW9kdWxlLCBpbnB1dCwgY29uZmlnLCAqZGV2aWNlcywgYWRkcmVzcywgc291cmNlLCBmbGFncyk7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3BlbklucHV0X2woCisgICAgICAgICAgICBtb2R1bGUsIGlucHV0LCBjb25maWcsICpkZXZpY2VzLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzLCBBVURJT19ERVZJQ0VfTk9ORSwgU3RyaW5nOHt9KTsKIAogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IGlucHV0IGNyZWF0aW9uCkBAIC0yMzQyLDcgKzI1NDYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgb3V0cHV0RGV2aWNlQWRkcmVzcykKIHsKICAgICBBdWRpb0h3RGV2aWNlICppbkh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsIGRldmljZXMpOwogICAgIGlmIChpbkh3RGV2ID09IE5VTEwpIHsKQEAgLTIzNTAsNiArMjU1Niw5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8vIFNvbWUgZmxhZ3MgYXJlIHNwZWNpZmljIHRvIGZyYW1ld29yayBhbmQgbXVzdCBub3QgbGVhayB0byB0aGUgSEFMLgorICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oZmxhZ3MgJiB+QVVESU9fSU5QVVRfRlJBTUVXT1JLX0ZMQUdTKTsKKwogICAgIC8vIEF1ZGlvIFBvbGljeSBjYW4gcmVxdWVzdCBhIHNwZWNpZmljIGhhbmRsZSBmb3IgaGFyZHdhcmUgaG90d29yZC4KICAgICAvLyBUaGUgZ29hbCBoZXJlIGlzIG5vdCB0byByZS1vcGVuIGFuIGFscmVhZHkgb3BlbmVkIGlucHV0LgogICAgIC8vIEl0IGlzIHRvIHVzZSBhIHByZS1hc3NpZ25lZCBJL08gaGFuZGxlLgpAQCAtMjM2OCw3ICsyNTc3LDggQEAKICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGluSHdIYWwgPSBpbkh3RGV2LT5od0RldmljZSgpOwogICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiBpblN0cmVhbTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsICZpblN0cmVhbSk7CisgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsCisgICAgICAgICAgICBvdXRwdXREZXZpY2UsIG91dHB1dERldmljZUFkZHJlc3MsICZpblN0cmVhbSk7CiAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBkZXZpY2VzICUjeCwgU2FtcGxpbmdSYXRlICVkIgogICAgICAgICAgICAiLCBGb3JtYXQgJSN4LCBDaGFubmVscyAlI3gsIGZsYWdzICUjeCwgc3RhdHVzICVkIGFkZHIgJXMiLAogICAgICAgICAgICAgaW5TdHJlYW0uZ2V0KCksCkBAIC0yMzkxLDcgKzI2MDEsOCBAQAogICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSByZW9wZW5pbmcgd2l0aCBwcm9wb3NlZCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIG1hc2siKTsKICAgICAgICAgaW5TdHJlYW0uY2xlYXIoKTsKICAgICAgICAgc3RhdHVzID0gaW5Id0hhbC0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICppbnB1dCwgZGV2aWNlcywgJmhhbGNvbmZpZywgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSwgJmluU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsCisgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaW5TdHJlYW0pOwogICAgICAgICAvLyBGSVhNRSBsb2cgdGhpcyBuZXcgc3RhdHVzOyBIQUwgc2hvdWxkIG5vdCBwcm9wb3NlIGFueSBmdXJ0aGVyIGNoYW5nZXMKICAgICB9CiAKQEAgLTI0MDcsNTUgKzI2MTgsNiBAQAogICAgICAgICAgICAgICAgICAgICB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICAgICAgfSBlbHNlIHsKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgLy8gVHJ5IHRvIHJlLXVzZSBtb3N0IHJlY2VudGx5IHVzZWQgUGlwZSB0byBhcmNoaXZlIGEgY29weSBvZiBpbnB1dCBmb3IgZHVtcHN5cywKLSAgICAgICAgICAgIC8vIG9yIChyZS0pY3JlYXRlIGlmIGN1cnJlbnQgUGlwZSBpcyBpZGxlIGFuZCBkb2VzIG5vdCBtYXRjaCB0aGUgbmV3IGZvcm1hdAotICAgICAgICAgICAgc3A8TkJBSU9fU2luaz4gdGVlU2luazsKLSAgICAgICAgICAgIGVudW0gewotICAgICAgICAgICAgICAgIFRFRV9TSU5LX05PLCAgICAvLyBkb24ndCBjb3B5IGlucHV0Ci0gICAgICAgICAgICAgICAgVEVFX1NJTktfTkVXLCAgIC8vIGNvcHkgaW5wdXQgdXNpbmcgYSBuZXcgcGlwZQotICAgICAgICAgICAgICAgIFRFRV9TSU5LX09MRCwgICAvLyBjb3B5IGlucHV0IHVzaW5nIGFuIGV4aXN0aW5nIHBpcGUKLSAgICAgICAgICAgIH0ga2luZDsKLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKGhhbGNvbmZpZy5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soaGFsY29uZmlnLmNoYW5uZWxfbWFzayksIGhhbGNvbmZpZy5mb3JtYXQpOwotICAgICAgICAgICAgaWYgKCFtVGVlU2lua0lucHV0RW5hYmxlZCkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIUZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1SZWNvcmRUZWVTaW5rID09IDApIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTkVXOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVGVlU2luay0+Z2V0U3Ryb25nQ291bnQoKSAhPSAxKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICAgICAgfSBlbHNlIGlmIChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIG1SZWNvcmRUZWVTaW5rLT5mb3JtYXQoKSkpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfT0xEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTkVXOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAgICAgICBjYXNlIFRFRV9TSU5LX05FVzogewotICAgICAgICAgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShtVGVlU2lua0lucHV0RnJhbWVzLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge2Zvcm1hdH07Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IHBpcGUtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7Ci0gICAgICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBtUmVjb3JkVGVlU2luayA9IHBpcGU7Ci0gICAgICAgICAgICAgICAgbVJlY29yZFRlZVNvdXJjZSA9IHBpcGVSZWFkZXI7Ci0gICAgICAgICAgICAgICAgdGVlU2luayA9IHBpcGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBURUVfU0lOS19PTEQ6Ci0gICAgICAgICAgICAgICAgdGVlU2luayA9IG1SZWNvcmRUZWVTaW5rOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBURUVfU0lOS19OTzoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQogICAgICAgICAgICAgLy8gU3RhcnQgcmVjb3JkIHRocmVhZAogICAgICAgICAgICAgLy8gUmVjb3JkVGhyZWFkIHJlcXVpcmVzIGJvdGggaW5wdXQgYW5kIG91dHB1dCBkZXZpY2UgaW5kaWNhdGlvbiB0byBmb3J3YXJkIHRvIGF1ZGlvCiAgICAgICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzCkBAIC0yNDY1LDkgKzI2MjcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5T3V0cHV0RGV2aWNlX2woKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJlYWR5Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0ZWVTaW5rCi0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRzLmFkZCgqaW5wdXQsIHRocmVhZCk7CiAgICAgICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSBjcmVhdGVkIHJlY29yZCB0aHJlYWQ6IElEICVkIHRocmVhZCAlcCIsICppbnB1dCwgdGhyZWFkLmdldCgpKTsKQEAgLTI0OTYsNiArMjY1NSw4IEBACiAgICAgICAgIGlmIChyZWNvcmRUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgQUxPR1YoImNsb3NlSW5wdXQoKSAlZCIsIGlucHV0KTsKIAorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wocmVjb3JkVGhyZWFkKTsKKwogICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBlZmZlY3QgY2hhaW5zLCBpdCBtZWFucyB0aGF0IGEgY2xpZW50IHN0aWxsIGhvbGRzIGEgaGFuZGxlCiAgICAgICAgICAgICAvLyBvbiBhdCBsZWFzdCBvbmUgZWZmZWN0LiBXZSBtdXN0IGVpdGhlciBtb3ZlIHRoZSBjaGFpbiB0byBhbiBleGlzdGluZyB0aHJlYWQgd2l0aCB0aGUKICAgICAgICAgICAgIC8vIHNhbWUgc2Vzc2lvbiBJRCBvciBwdXQgaXQgYXNpZGUgaW4gY2FzZSBhIG5ldyByZWNvcmQgdGhyZWFkIGlzIG9wZW5lZCBmb3IgYQpAQCAtMjUzOCw2ICsyNjk5LDcgQEAKICAgICAgICAgICAgIGlmIChtbWFwVGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wobW1hcFRocmVhZCk7CiAgICAgICAgICAgICBtTW1hcFRocmVhZHMucmVtb3ZlSXRlbShpbnB1dCk7CiAgICAgICAgIH0KICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGlvRGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOwpAQCAtMjU2Nyw3ICsyNzI5LDcgQEAKICAgICBkZWxldGUgaW47CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZUlucHV0SW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCkKIHsKICAgICBtUmVjb3JkVGhyZWFkcy5yZW1vdmVJdGVtKHRocmVhZC0+bUlkKTsKICAgICBjbG9zZUlucHV0RmluaXNoKHRocmVhZCk7CkBAIC0yNjA1LDcgKzI3NjcsOCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIEFMT0dWKCJhY3F1aXJpbmcgJWQgZnJvbSAlZCwgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7Ci0gICAgaWYgKHBpZCAhPSAtMSAmJiAoY2FsbGVyID09IGdldHBpZF9jYWNoZWQpKSB7CisgICAgY29uc3QgdWlkX3QgY2FsbGVyVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmIChwaWQgIT0gLTEgJiYgaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpKSB7IC8vIGNoZWNrIG11c3QgbWF0Y2ggcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKCkKICAgICAgICAgY2FsbGVyID0gcGlkOwogICAgIH0KIApAQCAtMjYzOSw3ICsyODAyLDggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBBTE9HVigicmVsZWFzaW5nICVkIGZyb20gJWQgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7Ci0gICAgaWYgKHBpZCAhPSAtMSAmJiAoY2FsbGVyID09IGdldHBpZF9jYWNoZWQpKSB7CisgICAgY29uc3QgdWlkX3QgY2FsbGVyVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmIChwaWQgIT0gLTEgJiYgaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpKSB7IC8vIGNoZWNrIG11c3QgbWF0Y2ggYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKCkKICAgICAgICAgY2FsbGVyID0gcGlkOwogICAgIH0KICAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwpAQCAtMjY1Niw5ICsyODIwLDEwIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gSWYgdGhlIGNhbGxlciBpcyBtZWRpYXNlcnZlciBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgc2Vzc2lvbiBiZWluZyByZWxlYXNlZCB3YXMgYWNxdWlyZWQKKyAgICAvLyBJZiB0aGUgY2FsbGVyIGlzIGF1ZGlvc2VydmVyIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBzZXNzaW9uIGJlaW5nIHJlbGVhc2VkIHdhcyBhY3F1aXJlZAogICAgIC8vIG9uIGJlaGFsZiBvZiBhIHByb2Nlc3Mgbm90IGluIG5vdGlmaWNhdGlvbiBjbGllbnRzIGFuZCB3ZSBpZ25vcmUgdGhlIHdhcm5pbmcuCi0gICAgQUxPR1dfSUYoY2FsbGVyICE9IGdldHBpZF9jYWNoZWQsICJzZXNzaW9uIGlkICVkIG5vdCBmb3VuZCBmb3IgcGlkICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOworICAgIEFMT0dXX0lGKCFpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCksCisgICAgICAgICAgICAic2Vzc2lvbiBpZCAlZCBub3QgZm91bmQgZm9yIHBpZCAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OmlzU2Vzc2lvbkFjcXVpcmVkX2woYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbikKQEAgLTI3MzMsNiArMjg5OCwxNyBAQAogICAgIHJldHVybjsKIH0KIAorLy8gZHVtcFRvVGhyZWFkTG9nX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBUb1RocmVhZExvZ19sKGNvbnN0IHNwPFRocmVhZEJhc2U+ICZ0aHJlYWQpCit7CisgICAgYXVkaW9fdXRpbHM6OkZkVG9TdHJpbmcgZmRUb1N0cmluZzsKKyAgICBjb25zdCBpbnQgZmQgPSBmZFRvU3RyaW5nLmZkKCk7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgdGhyZWFkLT5kdW1wKGZkLCB7fSAvKiBhcmdzICovKTsKKyAgICAgICAgbVRocmVhZExvZy5sb2dzKC0xIC8qIHRpbWUgKi8sIGZkVG9TdHJpbmcuZ2V0U3RyaW5nQW5kQ2xvc2UoKSk7CisgICAgfQorfQorCiAvLyBjaGVja1RocmVhZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZSAqQXVkaW9GbGluZ2VyOjpjaGVja1RocmVhZF9sKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdAogewpAQCAtMjkzOCwxNiArMzExNCw3NCBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcFV1aWQsCi0gICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGVVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0CiB7CisgICAgaWYgKHBVdWlkID09IE5VTEwgfHwgcFR5cGVVdWlkID09IE5VTEwgfHwgZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5SGFsLmdldCgpKSB7Ci0gICAgICAgIHJldHVybiBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IocFV1aWQsIGRlc2NyaXB0b3IpOwotICAgIH0gZWxzZSB7CisKKyAgICBpZiAoIW1FZmZlY3RzRmFjdG9yeUhhbC5nZXQoKSkgewogICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICB9Ci19CiAKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoIUVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKHBVdWlkKSkgeworICAgICAgICAvLyBJZiB1dWlkIGlzIHNwZWNpZmllZCwgcmVxdWVzdCBlZmZlY3QgZGVzY3JpcHRvciBmcm9tIHRoYXQuCisgICAgICAgIHN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihwVXVpZCwgZGVzY3JpcHRvcik7CisgICAgfSBlbHNlIGlmICghRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQocFR5cGVVdWlkKSkgeworICAgICAgICAvLyBJZiB1dWlkIGlzIG5vdCBzcGVjaWZpZWQsIGxvb2sgZm9yIGFuIGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAvLyBvZiB0aGUgcmVxdWlyZWQgdHlwZSBpbnN0ZWFkLgorCisgICAgICAgIC8vIFVzZSBhIHRlbXBvcmFyeSBkZXNjcmlwdG9yIHRvIGF2b2lkIG1vZGlmeWluZyB8ZGVzY3JpcHRvcnwgaW4gdGhlIGZhaWx1cmUgY2FzZS4KKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOworICAgICAgICBkZXNjLmZsYWdzID0gMDsgLy8gcHJldmVudCBjb21waWxlciB3YXJuaW5nCisKKyAgICAgICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7CisgICAgICAgIHN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+cXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRFZmZlY3REZXNjcmlwdG9yKCkgZXJyb3IgJWQgZnJvbSBGYWN0b3J5SGFsIHF1ZXJ5TnVtYmVyRWZmZWN0cyIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgaSsrKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IoaSwgJmRlc2MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiZ2V0RWZmZWN0RGVzY3JpcHRvcigpIGVycm9yICVkIGZyb20gRmFjdG9yeUhhbCBnZXREZXNjcmlwdG9yIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZW1jbXAoJmRlc2MudHlwZSwgcFR5cGVVdWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBtYXRjaGluZyB0eXBlIGZvdW5kIHNhdmUgZWZmZWN0IGRlc2NyaXB0b3IuCisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICpkZXNjcmlwdG9yID0gZGVzYzsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gcHJlZmVycmVkIGZsYWcgb3IgdGhpcyBkZXNjcmlwdG9yIG1hdGNoZXMgdGhlIHByZWZlcnJlZAorICAgICAgICAgICAgICAgIC8vIGZsYWcsIHN1Y2Nlc3MhIElmIHRoaXMgZGVzY3JpcHRvciBkb2Vzbid0IG1hdGNoIHRoZSBwcmVmZXJyZWQKKyAgICAgICAgICAgICAgICAvLyBmbGFnLCBjb250aW51ZSBlbnVtZXJhdGlvbiBpbiBjYXNlIGEgYmV0dGVyIG1hdGNoaW5nIHZlcnNpb24gb2YgdGhpcworICAgICAgICAgICAgICAgIC8vIGVmZmVjdCB0eXBlIGlzIGF2YWlsYWJsZS4gTm90ZSB0aGF0IHRoaXMgbWVhbnMgaWYgbm8gZWZmZWN0IHdpdGggYQorICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgZmxhZyBpcyBmb3VuZCwgdGhlIGRlc2NyaXB0b3IgcmV0dXJuZWQgd2lsbCBjb3JyZXNwb25kIHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIGxhc3QgZWZmZWN0IHRoYXQgYXQgbGVhc3QgaGFkIGEgbWF0Y2hpbmcgdHlwZSB1dWlkIChpZiBhbnkpLgorICAgICAgICAgICAgICAgIGlmIChwcmVmZXJyZWRUeXBlRmxhZyA9PSBFRkZFQ1RfRkxBR19UWVBFX01BU0sgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IHByZWZlcnJlZFR5cGVGbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOworICAgICAgICAgICAgQUxPR1coImdldEVmZmVjdERlc2NyaXB0b3IoKTogRWZmZWN0IG5vdCBmb3VuZCBieSB0eXBlLiIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiZ2V0RWZmZWN0RGVzY3JpcHRvcigpOiBFaXRoZXIgdXVpZCBvciB0eXBlIHV1aWQgbXVzdCBiZSBub24tbnVsbCBVVUlEcy4iKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KIAogc3A8SUVmZmVjdD4gQXVkaW9GbGluZ2VyOjpjcmVhdGVFZmZlY3QoCiAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLApAQCAtMjk2Niw3ICszMjAwLDcgQEAKICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CiAKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChwaWQgPT0gLTEgfHwgIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAocGlkID09IC0xIHx8ICFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICBBTE9HV19JRihwaWQgIT0gLTEgJiYgcGlkICE9IGNhbGxpbmdQaWQsCiAgICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgcGlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyBwaWQgJWQiLApAQCAtMjk4Miw4NCArMzIxNiw1NSBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gY2hlY2sgYXVkaW8gc2V0dGluZ3MgcGVybWlzc2lvbiBmb3IgZ2xvYmFsIGVmZmVjdHMKLSAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJiAhc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLy8gU2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBpcyByZXNlcnZlZCBmb3Igb3V0cHV0IHN0YWdlIGVmZmVjdHMKLSAgICAvLyB0aGF0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgKHJ1bm5pbmcgaW4gc2FtZSBwcm9jZXNzKQotICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYgZ2V0cGlkX2NhY2hlZCAhPSBwaWQpIHsKLSAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCiAgICAgaWYgKG1FZmZlY3RzRmFjdG9yeUhhbCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbm8gZWZmZWN0cyBmYWN0b3J5IGhhbCIsIF9fZnVuY19fKTsKICAgICAgICAgbFN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICAgICAgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZCgmcERlc2MtPnV1aWQpKSB7Ci0gICAgICAgICAgICAvLyBpZiB1dWlkIGlzIHNwZWNpZmllZCwgcmVxdWVzdCBlZmZlY3QgZGVzY3JpcHRvcgotICAgICAgICAgICAgbFN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcigmcERlc2MtPnV1aWQsICZkZXNjKTsKLSAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdEdldERlc2NyaXB0b3IiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpZiB1dWlkIGlzIG5vdCBzcGVjaWZpZWQsIGxvb2sgZm9yIGFuIGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgLy8gb2YgdGhlIHJlcXVpcmVkIHR5cGUgaW4gZWZmZWN0IGZhY3RvcnkKLSAgICAgICAgICAgIGlmIChFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZCgmcERlc2MtPnR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIG5vIGVmZmVjdCB0eXBlIik7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZDsKLSAgICAgICAgICAgIGQuZmxhZ3MgPSAwOyAvLyBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcKLSAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLQotICAgICAgICAgICAgbFN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+cXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKLSAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKGksICZkZXNjKTsKLSAgICAgICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gRWZmZWN0UXVlcnlFZmZlY3QiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoJmRlc2MudHlwZSwgJnBEZXNjLT50eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgbWF0Y2hpbmcgdHlwZSBmb3VuZCBzYXZlIGVmZmVjdCBkZXNjcmlwdG9yLiBJZiB0aGUgc2Vzc2lvbiBpcwotICAgICAgICAgICAgICAgICAgICAvLyAwIGFuZCB0aGUgZWZmZWN0IGlzIG5vdCBhdXhpbGlhcnksIGNvbnRpbnVlIGVudW1lcmF0aW9uIGluIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gYW4gYXV4aWxpYXJ5IHZlcnNpb24gb2YgdGhpcyBlZmZlY3QgdHlwZSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBkID0gZGVzYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGb3Igc2FtZSBlZmZlY3QgdHlwZSwgY2hvc2UgYXV4aWxpYXJ5IHZlcnNpb24gb3ZlciBpbnNlcnQgdmVyc2lvbiBpZgotICAgICAgICAgICAgLy8gY29ubmVjdCB0byBvdXRwdXQgbWl4IChDb21wbGlhbmNlIHRvIE9wZW5TTCBFUykKLSAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCi0gICAgICAgICAgICAgICAgICAgIChkLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewotICAgICAgICAgICAgICAgIGRlc2MgPSBkOwotICAgICAgICAgICAgfQorICAgIC8vIGNoZWNrIGF1ZGlvIHNldHRpbmdzIHBlcm1pc3Npb24gZm9yIGdsb2JhbCBlZmZlY3RzCisgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBwZXJtaXNzaW9uIGZvciBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgeworICAgICAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogb25seSBBUE0gY2FuIGNyZWF0ZSB1c2luZyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBBUE0gbXVzdCBzcGVjaWZ5IG91dHB1dCB3aGVuIHVzaW5nIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIiwgX19mdW5jX18pOworICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGdlbmVyYWwgc2Vzc2lvbklkLgorCisgICAgICAgIGlmIChhdWRpb191bmlxdWVfaWRfZ2V0X3VzZShzZXNzaW9uSWQpICE9IEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHNlc3Npb25JZCAlZCIsIF9fZnVuY19fLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjaGVjayBpZiB0aGUgY2FsbGluZ1VpZCAobGltaXRlZCB0byBwaWQpIGlzIGluIG1BdWRpb1Nlc3Npb25SZWZzCisgICAgICAgIC8vIHRvIHByZXZlbnQgY3JlYXRpbmcgYW4gZWZmZWN0IHdoZW4gb25lIGRvZXNuJ3QgYWN0dWFsbHkgaGF2ZSB0cmFjayB3aXRoIHRoYXQgc2Vzc2lvbj8KICAgICB9CisKICAgICB7CisgICAgICAgIC8vIEdldCB0aGUgZnVsbCBlZmZlY3QgZGVzY3JpcHRvciBmcm9tIHRoZSB1dWlkL3R5cGUuCisgICAgICAgIC8vIElmIHRoZSBzZXNzaW9uIGlzIHRoZSBvdXRwdXQgbWl4LCBwcmVmZXIgYW4gYXV4aWxpYXJ5IGVmZmVjdCwKKyAgICAgICAgLy8gb3RoZXJ3aXNlIG5vIHByZWZlcmVuY2UuCisgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGUgPSAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkgOiBFRkZFQ1RfRkxBR19UWVBFX01BU0spOworICAgICAgICBsU3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmcERlc2MtPnV1aWQsICZwRGVzYy0+dHlwZSwgcHJlZmVycmVkVHlwZSwgJmRlc2MpOworICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIGdldEVmZmVjdERlc2NyaXB0b3IiLCBsU3RhdHVzKTsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIERvIG5vdCBhbGxvdyBhdXhpbGlhcnkgZWZmZWN0cyBvbiBhIHNlc3Npb24gZGlmZmVyZW50IGZyb20gMCAob3V0cHV0IG1peCkKICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKQEAgLTMwOTQsMzQgKzMyOTksMTMgQEAKICAgICAgICAgLy8gYmVjYXVzZSBvZiBjb2RlIGNoZWNraW5nIG91dHB1dCB3aGVuIGVudGVyaW5nIHRoZSBmdW5jdGlvbi4KICAgICAgICAgLy8gTm90ZTogaW8gaXMgbmV2ZXIgMCB3aGVuIGNyZWF0aW5nIGFuIGVmZmVjdCBvbiBhbiBpbnB1dAogICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpIHsKLSAgICAgICAgICAgICAgICAvLyBvdXRwdXQgbXVzdCBiZSBzcGVjaWZpZWQgYnkgQXVkaW9Qb2xpY3lNYW5hZ2VyIHdoZW4gdXNpbmcgc2Vzc2lvbgotICAgICAgICAgICAgICAgIC8vIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFCi0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbiBpcyBwcmVzZW50Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlvID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaW8gPSBmaW5kSW9IYW5kbGVCeVNlc3Npb25JZF9sKHNlc3Npb25JZCwgbVBsYXliYWNrVGhyZWFkcyk7CisgICAgICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBpbyA9IGZpbmRJb0hhbmRsZUJ5U2Vzc2lvbklkX2woc2Vzc2lvbklkLCBtUmVjb3JkVGhyZWFkcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbyA9IG1SZWNvcmRUaHJlYWRzLmtleUF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NbWFwVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobU1tYXBUaHJlYWRzLnZhbHVlQXQoaSktPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvID0gbU1tYXBUaHJlYWRzLmtleUF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW8gPSBmaW5kSW9IYW5kbGVCeVNlc3Npb25JZF9sKHNlc3Npb25JZCwgbU1tYXBUaHJlYWRzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIElmIG5vIG91dHB1dCB0aHJlYWQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElELCBkZWZhdWx0IHRvCiAgICAgICAgICAgICAvLyBmaXJzdCBvdXRwdXQuIFRoZSBlZmZlY3QgY2hhaW4gd2lsbCBiZSBtb3ZlZCB0byB0aGUgY29ycmVjdCBvdXRwdXQKQEAgLTMxMzAsNiArMzMxNCwyMSBAQAogICAgICAgICAgICAgICAgIGlvID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdCgwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVFZmZlY3QoKSBnb3QgaW8gJWQgZm9yIGVmZmVjdCAlcyIsIGlvLCBkZXNjLm5hbWUpOworICAgICAgICB9IGVsc2UgaWYgKGNoZWNrUGxheWJhY2tUaHJlYWRfbChpbykgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gYWxsb3cgb25seSBvbmUgZWZmZWN0IGNoYWluIHBlciBzZXNzaW9uSWQgb24gbVBsYXliYWNrVGhyZWFkcy4KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGNoZWNrSW8gPSBtUGxheWJhY2tUaHJlYWRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChpbyA9PSBjaGVja0lvKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzZXNzaW9uVHlwZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGlmICgoc2Vzc2lvblR5cGUgJiBUaHJlYWRCYXNlOjpFRkZFQ1RfU0VTU0lPTikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGVmZmVjdCAlcyBpbyAlZCBkZW5pZWQgYmVjYXVzZSBzZXNzaW9uICVkIGVmZmVjdCBleGlzdHMgb24gaW8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLm5hbWUsIChpbnQpaW8sIChpbnQpc2Vzc2lvbklkLCAoaW50KWNoZWNrSW8pOworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyMzIzNzk3NCIpOworICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFRocmVhZEJhc2UgKnRocmVhZCA9IGNoZWNrUmVjb3JkVGhyZWFkX2woaW8pOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKQEAgLTMzNzQsMTM2ICszNTczLDYgQEAKIH0KIAogCi1zdHJ1Y3QgRW50cnkgewotI2RlZmluZSBURUVfTUFYX0ZJTEVOQU1FIDMyIC8vICVZJW0lZCVIJU0lU18lZC53YXYgPSA0KzIrMisyKzIrMisxKzErNCsxID0gMjEKLSAgICBjaGFyIG1GaWxlTmFtZVtURUVfTUFYX0ZJTEVOQU1FXTsKLX07Ci0KLWludCBjb21wYXJFbnRyeShjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gICAgcmV0dXJuIHN0cmNtcCgoKGNvbnN0IEVudHJ5ICopIHAxKS0+bUZpbGVOYW1lLCAoKGNvbnN0IEVudHJ5ICopIHAyKS0+bUZpbGVOYW1lKTsKLX0KLQotI2lmZGVmIFRFRV9TSU5LCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFRlZShpbnQgZmQsIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGNoYXIgc3VmZml4KQotewotICAgIE5CQUlPX1NvdXJjZSAqdGVlU291cmNlID0gc291cmNlLmdldCgpOwotICAgIGlmICh0ZWVTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAvLyAud2F2IHJvdGF0aW9uCi0gICAgICAgIC8vIFRoZXJlIGlzIGEgYmVuaWduIHJhY2UgY29uZGl0aW9uIGlmIDIgdGhyZWFkcyBjYWxsIHRoaXMgc2ltdWx0YW5lb3VzbHkuCi0gICAgICAgIC8vIFRoZXkgd291bGQgYm90aCB0cmF2ZXJzZSB0aGUgZGlyZWN0b3J5LCBidXQgdGhlIHJlc3VsdCB3b3VsZCBzaW1wbHkgYmUKLSAgICAgICAgLy8gZmFpbHVyZXMgYXQgdW5saW5rKCkgd2hpY2ggYXJlIGlnbm9yZWQuICBJdCdzIGFsc28gdW5saWtlbHkgc2luY2UKLSAgICAgICAgLy8gbm9ybWFsbHkgZHVtcHN5cyBpcyBvbmx5IGRvbmUgYnkgYnVncmVwb3J0IG9yIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgICAgY2hhciB0ZWVQYXRoW1BBVEhfTUFYXSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyIjsKLSAgICAgICAgc2l6ZV90IHRlZVBhdGhMZW4gPSBzdHJsZW4odGVlUGF0aCk7Ci0gICAgICAgIERJUiAqZGlyID0gb3BlbmRpcih0ZWVQYXRoKTsKLSAgICAgICAgdGVlUGF0aFt0ZWVQYXRoTGVuKytdID0gJy8nOwotICAgICAgICBpZiAoZGlyICE9IE5VTEwpIHsKLSNkZWZpbmUgVEVFX01BWF9TT1JUIDIwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIHNvcnQKLSNkZWZpbmUgVEVFX01BWF9LRUVQIDEwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAKLSAgICAgICAgICAgIHN0cnVjdCBFbnRyeSBlbnRyaWVzW1RFRV9NQVhfU09SVF07Ci0gICAgICAgICAgICBzaXplX3QgZW50cnlDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoZW50cnlDb3VudCA8IFRFRV9NQVhfU09SVCkgewotICAgICAgICAgICAgICAgIGVycm5vID0gMDsgLy8gY2xlYXIgZXJybm8gYmVmb3JlIHJlYWRkaXIoKSB0byB0cmFjayBwb3RlbnRpYWwgZXJyb3JzLgotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkaXJlbnQgKnJlc3VsdCA9IHJlYWRkaXIoZGlyKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJybm8gIT0gMCwgInRlZSByZWFkZGlyKCkgZmFpbHVyZSAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbm9uIC53YXYgZmlsZSBlbnRyaWVzCi0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG5hbWVMZW4gPSBzdHJsZW4ocmVzdWx0LT5kX25hbWUpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lTGVuIDw9IDQgfHwgbmFtZUxlbiA+PSBURUVfTUFYX0ZJTEVOQU1FIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoJnJlc3VsdC0+ZF9uYW1lW25hbWVMZW4gLSA0XSwgIi53YXYiKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweShlbnRyaWVzW2VudHJ5Q291bnQrK10ubUZpbGVOYW1lLCByZXN1bHQtPmRfbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAodm9pZCkgY2xvc2VkaXIoZGlyKTsKLSAgICAgICAgICAgIGlmIChlbnRyeUNvdW50ID4gVEVFX01BWF9LRUVQKSB7Ci0gICAgICAgICAgICAgICAgcXNvcnQoZW50cmllcywgZW50cnlDb3VudCwgc2l6ZW9mKEVudHJ5KSwgY29tcGFyRW50cnkpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlDb3VudCAtIFRFRV9NQVhfS0VFUDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNweSgmdGVlUGF0aFt0ZWVQYXRoTGVuXSwgZW50cmllc1tpXS5tRmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAodm9pZCkgdW5saW5rKHRlZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInVuYWJsZSB0byByb3RhdGUgdGVlcyBpbiAlLipzOiAlc1xuIiwgKGludCkgdGVlUGF0aExlbiwgdGVlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciB0ZWVUaW1lWzE2XTsKLSAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotICAgICAgICBzdHJ1Y3QgdG0gdG07Ci0gICAgICAgIGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZ0bSk7Ci0gICAgICAgIHN0cmZ0aW1lKHRlZVRpbWUsIHNpemVvZih0ZWVUaW1lKSwgIiVZJW0lZCVIJU0lUyIsICZ0bSk7Ci0gICAgICAgIHNucHJpbnRmKCZ0ZWVQYXRoW3RlZVBhdGhMZW5dLCBzaXplb2YodGVlUGF0aCkgLSB0ZWVQYXRoTGVuLCAiJXNfJWRfJWMud2F2IiwgdGVlVGltZSwgaWQsCi0gICAgICAgICAgICAgICAgc3VmZml4KTsKLSAgICAgICAgLy8gaWYgMiBkdW1wc3lzIGFyZSBkb25lIHdpdGhpbiAxIHNlY29uZCwgYW5kIHJvdGF0aW9uIGRpZG4ndCB3b3JrLCB0aGVuIGRpc2NhcmQgMm5kCi0gICAgICAgIGludCB0ZWVGZCA9IG9wZW4odGVlUGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19OT0ZPTExPVywgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgICAgICBpZiAodGVlRmQgPj0gMCkgewotICAgICAgICAgICAgLy8gRklYTUUgdXNlIGxpYnNuZGZpbGUKLSAgICAgICAgICAgIGNoYXIgd2F2SGVhZGVyWzQ0XTsKLSAgICAgICAgICAgIG1lbWNweSh3YXZIZWFkZXIsCi0gICAgICAgICAgICAgICAgIlJJRkZcMFwwXDBcMFdBVkVmbXQgXDIwXDBcMFwwXDFcMFwyXDBcMTA0XDI1NFwwXDBcMFwwXDBcMFw0XDBcMjBcMGRhdGFcMFwwXDBcMCIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKHdhdkhlYWRlcikpOwotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IHRlZVNvdXJjZS0+Zm9ybWF0KCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCk7Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMjJdID0gY2hhbm5lbENvdW50OyAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgIHdhdkhlYWRlclsyNF0gPSBzYW1wbGVSYXRlOyAgICAgICAgIC8vIHNhbXBsZSByYXRlCi0gICAgICAgICAgICB3YXZIZWFkZXJbMjVdID0gc2FtcGxlUmF0ZSA+PiA4OwotICAgICAgICAgICAgd2F2SGVhZGVyWzMyXSA9IGZyYW1lU2l6ZTsgICAgICAgICAgLy8gYmxvY2sgYWxpZ25tZW50Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMzNdID0gZnJhbWVTaXplID4+IDg7Ci0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgd2F2SGVhZGVyLCBzaXplb2Yod2F2SGVhZGVyKSk7Ci0gICAgICAgICAgICBzaXplX3QgdG90YWwgPSAwOwotICAgICAgICAgICAgYm9vbCBmaXJzdFJlYWQgPSB0cnVlOwotI2RlZmluZSBURUVfU0lOS19SRUFEIDEwMjQgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIHBlciBJL08gb3BlcmF0aW9uCi0gICAgICAgICAgICB2b2lkICpidWZmZXIgPSBtYWxsb2MoVEVFX1NJTktfUkVBRCAqIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gVEVFX1NJTktfUkVBRDsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGFjdHVhbCA9IHRlZVNvdXJjZS0+cmVhZChidWZmZXIsIGNvdW50KTsKLSAgICAgICAgICAgICAgICBib29sIHdhc0ZpcnN0UmVhZCA9IGZpcnN0UmVhZDsKLSAgICAgICAgICAgICAgICBmaXJzdFJlYWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA9PSAoc3NpemVfdCkgT1ZFUlJVTiAmJiB3YXNGaXJzdFJlYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChhY3R1YWwgPD0gKHNzaXplX3QpY291bnQpOwotICAgICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCBidWZmZXIsIGFjdHVhbCAqIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgdG90YWwgKz0gYWN0dWFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShidWZmZXIpOwotICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNCwgU0VFS19TRVQpOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9IDQ0ICsgdG90YWwgKiBmcmFtZVNpemUgLSA4OwotICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQotICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwotICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNDAsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHRlbXAgPSAgdG90YWwgKiBmcmFtZVNpemU7Ci0gICAgICAgICAgICAvLyBGSVhNRSBub3QgYmlnLWVuZGlhbiBzYWZlCi0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7Ci0gICAgICAgICAgICBjbG9zZSh0ZWVGZCk7Ci0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCBjcmVhdGUgZmlsZSB3aXRoIHRlbXBvcmFyeSBuYW1lIGFuZCB0aGVuIHJlbmFtZSB0byBmaW5hbCBpZiBub24tZW1wdHkuCi0gICAgICAgICAgICBpZiAodG90YWwgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInRlZSBjb3BpZWQgdG8gJXNcbiIsIHRlZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5saW5rKHRlZVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidW5hYmxlIHRvIGNyZWF0ZSB0ZWUgJXM6ICVzXG4iLCB0ZWVQYXRoLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotI2VuZGlmCi0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvblRyYW5zYWN0KApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDk2M2E4N2QuLmVjNWRmYjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTIxLDEzICsyMSwxOSBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9vcy9CbkV4dGVybmFsVmlicmF0aW9uQ29udHJvbGxlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KQEAgLTYyLDcgKzY4LDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvTGluZWFyTWFwLmg+CiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0ZkVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9TaW1wbGVMb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9UaW1lc3RhbXBWZXJpZmllci5oPgogCiAjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKQEAgLTcxLDYgKzgwLDcgQEAKICNpbmNsdWRlICJBdWRpb1N0cmVhbU91dC5oIgogI2luY2x1ZGUgIlNwZGlmU3RyZWFtT3V0LmgiCiAjaW5jbHVkZSAiQXVkaW9Id0RldmljZS5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KIApAQCAtNzgsNiArODgsOCBAQAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9FZmZlY3RTaGFyZWQuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KIAorI2luY2x1ZGUgPHZpYnJhdG9yL0V4dGVybmFsVmlicmF0aW9uLmg+CisKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0JuQXVkaW9SZWNvcmQuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTMxLDYgKzE0MywxMCBAQAogICAgIHZpcnR1YWwgICAgIGZsb2F0ICAgICAgIG1hc3RlclZvbHVtZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIG1hc3Rlck11dGUoKSBjb25zdDsKIAorICAgIC8vIEJhbGFuY2UgdmFsdWUgbXVzdCBiZSB3aXRoaW4gLTEuZiAobGVmdCBvbmx5KSB0byAxLmYgKHJpZ2h0IG9ubHkpIGluY2x1c2l2ZS4KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0IG92ZXJyaWRlOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIG11dGVkKTsKQEAgLTIwMiw2ICsyMTgsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZVV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KApAQCAtMjc2LDYgKzI5NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8TW1hcFN0cmVhbUludGVyZmFjZT4mIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgc3RhdGljIGludCBvbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pOworICAgIHN0YXRpYyB2b2lkIG9uRXh0ZXJuYWxWaWJyYXRpb25TdG9wKGNvbnN0IHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4mIGV4dGVybmFsVmlicmF0aW9uKTsKIHByaXZhdGU6CiAgICAgLy8gRklYTUUgVGhlIDQwMCBpcyB0ZW1wb3JhcmlseSB0b28gaGlnaCB1bnRpbCBhIGxlYWsgb2Ygd3JpdGVycyBpbiBtZWRpYS5sb2cgaXMgZml4ZWQuCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTG9nTWVtb3J5U2l6ZSA9IDQwMCAqIDEwMjQ7CkBAIC0zNTcsMTYgKzM3OCwxNyBAQAogICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CiAgICAgICAgIHN3aXRjaCAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykpIHsKICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OOiB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBGQ0NfMjsgLy8gc3RlcmVvIGlzIGRlZmF1bHQKLSAgICAgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRDaGFubmVscykgewotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA8IEZDQ18yIC8vIG1vbm8gaXMgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEhhcHRpYyBjaGFubmVsIG1hc2sgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjaGFubmVsIHBvc2l0aW9uIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtYXhDaGFubmVsQ291bnQgPSBrRW5hYmxlRXh0ZW5kZWRDaGFubmVscworICAgICAgICAgICAgICAgICAgICA/IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMgOiBGQ0NfMjsKKyAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPCBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCisgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxDb3VudCA+IG1heENoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgY2hhbm5lbE1hc2sgaXMgdGhlICJjYW5vbmljYWwiIG9uZSB3ZSBleHBlY3QgZm9yIHRoZSBjaGFubmVsQ291bnQuCi0gICAgICAgICAgICByZXR1cm4gY2hhbm5lbE1hc2sgPT0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9wb3NpdGlvbl9tYXNrX2lzX291dF9jYW5vbmljYWwoY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVg6CiAgICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKQEAgLTQxNiw2ICs0MzgsMTEgQEAKICAgICB2b2lkIGR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKKyAgICBTaW1wbGVMb2cgbVRocmVhZExvZ3sxNn07IC8vIDE2IFRocmVhZCBoaXN0b3J5IGxpbWl0CisKKyAgICBjbGFzcyBUaHJlYWRCYXNlOworICAgIHZvaWQgZHVtcFRvVGhyZWFkTG9nX2woY29uc3Qgc3A8VGhyZWFkQmFzZT4gJnRocmVhZCk7CisKICAgICAvLyAtLS0gQ2xpZW50IC0tLQogICAgIGNsYXNzIENsaWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBwdWJsaWM6CkBAIC01MDIsNiArNTI5LDkgQEAKICAgICBjbGFzcyBFZmZlY3RDaGFpbjsKIAogICAgIHN0cnVjdCBBdWRpb1N0cmVhbUluOworICAgIHN0cnVjdCBUZWVQYXRjaDsKKyAgICB1c2luZyBUZWVQYXRjaGVzID0gc3RkOjp2ZWN0b3I8VGVlUGF0Y2g+OworCiAKICAgICBzdHJ1Y3QgIHN0cmVhbV90eXBlX3QgewogICAgICAgICBzdHJlYW1fdHlwZV90KCkKQEAgLTUyOCw2ICs1NTgsMjYgQEAKIAogI2luY2x1ZGUgIlBhdGNoUGFuZWwuaCIKIAorICAgIC8vIEZpbmQgaW8gaGFuZGxlIGJ5IHNlc3Npb24gaWQuCisgICAgLy8gUHJlZmVyZW5jZSBpcyBnaXZlbiB0byBhbiBpbyBoYW5kbGUgd2l0aCBhIG1hdGNoaW5nIGVmZmVjdCBjaGFpbiB0byBzZXNzaW9uIGlkLgorICAgIC8vIElmIG5vbmUgZm91bmQsIEFVRElPX0lPX0hBTkRMRV9OT05FIGlzIHJldHVybmVkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBmaW5kSW9IYW5kbGVCeVNlc3Npb25JZF9sKAorICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgY29uc3QgVCYgdGhyZWFkcykgeworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2Vzc2lvblR5cGUgPSB0aHJlYWRzLnZhbHVlQXQoaSktPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgaWYgKHNlc3Npb25UeXBlICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbyA9IHRocmVhZHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKChzZXNzaW9uVHlwZSAmIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6RUZGRUNUX1NFU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGVmZmVjdCBjaGFpbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW87CisgICAgfQorCiAgICAgLy8gc2VydmVyIHNpZGUgb2YgdGhlIGNsaWVudCdzIElBdWRpb1RyYWNrCiAgICAgY2xhc3MgVHJhY2tIYW5kbGUgOiBwdWJsaWMgYW5kcm9pZDo6Qm5BdWRpb1RyYWNrIHsKICAgICBwdWJsaWM6CkBAIC01NDAsNiArNTkwLDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBwYXVzZSgpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CiAgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CkBAIC01NjQsNiArNjE1LDEwIEBACiAgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBzdG9wKCk7CiAgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgICAgIGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pOworICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCiAgICAgcHJpdmF0ZToKICAgICAgICAgY29uc3Qgc3A8UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gbVJlY29yZFRyYWNrOwogCkBAIC02MDUsNyArNjYwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBvdXRwdXREZXZpY2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gb3Blbk91dHB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLApAQCAtNjc1LDYgKzczMiw5IEBACiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIHVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOwogCiAgICAgICAgICAgICAgICAgdm9pZCBicm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICB2b2lkIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgdXBTdHJlYW0sIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCA9IG51bGxwdHIpOwogCiAgICAgLy8gQXVkaW9TdHJlYW1JbiBpcyBpbW11dGFibGUsIHNvIHRoZWlyIGZpZWxkcyBhcmUgY29uc3QuCiAgICAgLy8gRm9yIGVtcGhhc2lzLCB3ZSBjb3VsZCBhbHNvIG1ha2UgYWxsIHBvaW50ZXJzIHRvIHRoZW0gYmUgImNvbnN0ICoiLApAQCAtNjkxLDYgKzc1MSwxMSBAQAogICAgICAgICAgICAgYXVkaW9Id0RldihkZXYpLCBzdHJlYW0oaW4pLCBmbGFncyhmbGFncykge30KICAgICB9OwogCisgICAgc3RydWN0IFRlZVBhdGNoIHsKKyAgICAgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gcGF0Y2hSZWNvcmQ7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiBwYXRjaFRyYWNrOworICAgIH07CisKICAgICAvLyBmb3IgbUF1ZGlvU2Vzc2lvblJlZnMgb25seQogICAgIHN0cnVjdCBBdWRpb1Nlc3Npb25SZWYgewogICAgICAgICBBdWRpb1Nlc3Npb25SZWYoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25pZCwgcGlkX3QgcGlkKSA6CkBAIC03NTIsNiArODE3LDcgQEAKICAgICAgICAgICAgICAgICAvLyBtZW1iZXIgdmFyaWFibGVzIGJlbG93IGFyZSBwcm90ZWN0ZWQgYnkgbUxvY2sKICAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyVm9sdW1lOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJNdXRlOworICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlID0gMC5mOwogICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB2YXJpYWJsZXMgcHJvdGVjdGVkIGJ5IG1Mb2NrCiAKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxSZWNvcmRUaHJlYWQ+ID4gICAgbVJlY29yZFRocmVhZHM7CkBAIC03NjksNiArODM1LDcgQEAKICAgICAgICAgICAgICAgICBWZWN0b3I8QXVkaW9TZXNzaW9uUmVmKj4gbUF1ZGlvU2Vzc2lvblJlZnM7CiAKICAgICAgICAgICAgICAgICBmbG9hdCAgICAgICBtYXN0ZXJWb2x1bWVfbCgpIGNvbnN0OworICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgIGdldE1hc3RlckJhbGFuY2VfbCgpIGNvbnN0OwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG1hc3Rlck11dGVfbCgpIGNvbnN0OwogICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsb2FkSHdNb2R1bGVfbChjb25zdCBjaGFyICpuYW1lKTsKIApAQCAtNzkxLDQ0ICs4NTgsMTkgQEAKIAogICAgIC8vIGZvciB1c2UgZnJvbSBkZXN0cnVjdG9yCiAgICAgc3RhdHVzX3QgICAgY2xvc2VPdXRwdXRfbm9udmlydHVhbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0SW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKTsKICAgICBzdGF0dXNfdCAgICBjbG9zZUlucHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZvaWQgICAgICAgIGNsb3NlSW5wdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCk7CiAgICAgdm9pZCAgICAgICAgc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2woUGxheWJhY2tUaHJlYWQgKnRocmVhZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKICAgICBzdGF0dXNfdCAgICBjaGVja1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OwogCiAgICAgdm9pZCAgICAgICAgZmlsdGVyUmVzZXJ2ZWRQYXJhbWV0ZXJzKFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIHVpZF90IGNhbGxpbmdVaWQpOwotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBhbGwgcmVjb3JkIHRocmVhZHMgc2VyaWFsbHkgc2hhcmUgYSBjb21tb24gdGVlIHNpbmssIHdoaWNoIGlzIHJlLWNyZWF0ZWQgb24gZm9ybWF0IGNoYW5nZQotICAgIHNwPE5CQUlPX1Npbms+ICAgbVJlY29yZFRlZVNpbms7Ci0gICAgc3A8TkJBSU9fU291cmNlPiBtUmVjb3JkVGVlU291cmNlOwotI2VuZGlmCisgICAgdm9pZCAgICAgICAgbG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHNpemVfdCBvcmlnaW5hbEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIG9yaWdpbmFsS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlamVjdGVkS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgcmVqZWN0ZWRLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjYWxsaW5nVWlkKTsKIAogcHVibGljOgotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyB0ZWUgc2luaywgaWYgZW5hYmxlZCBieSBwcm9wZXJ0eSwgYWxsb3dzIGR1bXBzeXMgdG8gd3JpdGUgbW9zdCByZWNlbnQgYXVkaW8gdG8gLndhdiBmaWxlCi0gICAgc3RhdGljIHZvaWQgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGNoYXIgc3VmZml4KTsKLQotICAgIC8vIHdoZXRoZXIgdGVlIHNpbmsgaXMgZW5hYmxlZCBieSBwcm9wZXJ0eQotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rSW5wdXRFbmFibGVkOwotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rT3V0cHV0RW5hYmxlZDsKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua1RyYWNrRW5hYmxlZDsKLQotICAgIC8vIHJ1bnRpbWUgY29uZmlndXJlZCBzaXplIG9mIGVhY2ggdGVlIHNpbmsgcGlwZSwgaW4gZnJhbWVzCi0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua0lucHV0RnJhbWVzOwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtPdXRwdXRGcmFtZXM7Ci0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua1RyYWNrRnJhbWVzOwotCi0gICAgLy8gY29tcGlsZS10aW1lIGRlZmF1bHQgc2l6ZSBvZiB0ZWUgc2luayBwaXBlcywgaW4gZnJhbWVzCi0gICAgLy8gMHgyMDAwMDAgc3RlcmVvIDE2LWJpdCBQQ00gZnJhbWVzID0gNDcuNSBzZWNvbmRzIGF0IDQ0LjEga0h6LCA4IG1lZ2FieXRlcwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtJbnB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rT3V0cHV0RnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSNlbmRpZgotCiAgICAgLy8gVGhlc2UgbWV0aG9kcyByZWFkIHZhcmlhYmxlcyBhdG9taWNhbGx5IHdpdGhvdXQgbUxvY2ssCiAgICAgLy8gdGhvdWdoIHRoZSB2YXJpYWJsZXMgYXJlIHVwZGF0ZWQgd2l0aCBtTG9jay4KICAgICBib29sICAgIGlzTG93UmFtRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTG93UmFtRGV2aWNlOyB9CkBAIC04NDMsMTAgKzg4NSwxNSBAQAogCiAgICAgbnNlY3NfdCBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZTsgIC8vIHdoZW4gYSBnbG9iYWwgZWZmZWN0IHdhcyBsYXN0IGVuYWJsZWQKIAotICAgIHNwPFBhdGNoUGFuZWw+IG1QYXRjaFBhbmVsOworICAgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgIFBhdGNoUGFuZWwgbVBhdGNoUGFuZWw7CiAgICAgc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1FZmZlY3RzRmFjdG9yeUhhbDsKIAotICAgIGJvb2wgICAgICAgIG1TeXN0ZW1SZWFkeTsKKyAgICBib29sICAgICAgIG1TeXN0ZW1SZWFkeTsKKworICAgIFNpbXBsZUxvZyAgbVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nOworICAgIFNpbXBsZUxvZyAgbUFwcFNldFBhcmFtZXRlckxvZzsKKyAgICBTaW1wbGVMb2cgIG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2c7CiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCmluZGV4IGViODI2YzYuLmQ0Mjk5YjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaApAQCAtMzUsNiArMzUsOSBAQAogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX1ZPTFVNRSAgPSAweDEsCiAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSAgICA9IDB4MiwKKyAgICAgICAgLy8gTWVhbnMgdGhhdCB0aGlzIGlzbid0IGEgdGVybWluYWwgbW9kdWxlLCBhbmQgc29mdHdhcmUgcGF0Y2hlcworICAgICAgICAvLyBhcmUgdXNlZCB0byB0cmFuc3BvcnQgYXVkaW8gZGF0YSBmdXJ0aGVyLgorICAgICAgICBBSFdEX0lTX0lOU0VSVCAgICAgICAgICAgICAgPSAweDQsCiAgICAgfTsKIAogICAgIEF1ZGlvSHdEZXZpY2UoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKQEAgLTU1LDYgKzU4LDEwIEBACiAgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFKSk7CiAgICAgfQogCisgICAgYm9vbCBpc0luc2VydCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0lTX0lOU0VSVCkpOworICAgIH0KKwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CiAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGVOYW1lOyB9CiAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKaW5kZXggMWQ0YjNmZS4uYTYwYTVmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCkBAIC02Niw4ICs2Niw5IEBACiAgICAgLy8gTWFpbnRhaW4gYSA2NC1iaXQgcmVuZGVyIHBvc2l0aW9uIHVzaW5nIHRoZSAzMi1iaXQgcmVzdWx0IGZyb20gdGhlIEhBTC4KICAgICAvLyBUaGlzIGRlbHRhIGNhbGN1bGF0aW9uIHJlbGllcyBvbiB0aGUgYXJpdGhtZXRpYyBvdmVyZmxvdyBiZWhhdmlvcgogICAgIC8vIG9mIGludGVnZXJzLiBGb3IgZXhhbXBsZSAoMTAwIC0gMHhGRkZGRkZGMCkgPSAxMTYuCi0gICAgdWludDMyX3QgdHJ1bmNhdGVkUG9zaXRpb24gPSAodWludDMyX3QpbVJlbmRlclBvc2l0aW9uOwotICAgIGludDMyX3QgZGVsdGFIYWxQb3NpdGlvbiA9IChpbnQzMl90KShoYWxQb3NpdGlvbiAtIHRydW5jYXRlZFBvc2l0aW9uKTsKKyAgICBjb25zdCB1aW50MzJfdCB0cnVuY2F0ZWRQb3NpdGlvbiA9ICh1aW50MzJfdCltUmVuZGVyUG9zaXRpb247CisgICAgaW50MzJfdCBkZWx0YUhhbFBvc2l0aW9uOyAvLyBpbml0aWFsaXphdGlvbiBub3QgbmVlZGVkLCBvdmVyd2l0dGVuIGJ5IF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coKQorICAgICh2b2lkKSBfX2J1aWx0aW5fc3ViX292ZXJmbG93KGhhbFBvc2l0aW9uLCB0cnVuY2F0ZWRQb3NpdGlvbiwgJmRlbHRhSGFsUG9zaXRpb24pOwogICAgIGlmIChkZWx0YUhhbFBvc2l0aW9uID4gMCkgewogICAgICAgICBtUmVuZGVyUG9zaXRpb24gKz0gZGVsdGFIYWxQb3NpdGlvbjsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKaW5kZXggYjNmNWVmZC4uZWNhZWI1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcApAQCAtMzEsOSArMzEsOSBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMDksOCArMzA5LDggQEAKICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGVmZmVjdCBidWZmZXJzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXJ5IGVmZmVjdCBwcm9jZXNzLgogICAgIC8vIFRPRE86IGNvbnNpZGVyIGltcGxlbWVudGluZyBjaGFubmVsIGNvbnZlcnNpb24uCiAgICAgY29uc3Qgc2l6ZV90IHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50ID0KLSAgICAgICAgICAgIGluQ2hhbm5lbENvdW50ICE9IG91dENoYW5uZWxDb3VudCA/IDAKLSAgICAgICAgICAgICAgICAgICAgOiBvdXRDaGFubmVsQ291bnQgKiBzdGQ6Om1pbigKKyAgICAgICAgICAgIG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZCAhPSBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkID8gMAorICAgICAgICAgICAgICAgICAgICA6IG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgKiBzdGQ6Om1pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICBjb25zdCBhdXRvIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0ID0gW3RoaXMsIHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50XSgpIHsKQEAgLTQ4MCw3ICs0ODAsMTIgQEAKICAgICAgICAgLy8gYWNjdW11bGF0ZSBpbnB1dCBvbnRvIG91dHB1dAogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtQ2hhaW4ucHJvbW90ZSgpOwogICAgICAgICBpZiAoY2hhaW4uZ2V0KCkgIT0gbnVsbHB0ciAmJiBjaGFpbi0+YWN0aXZlVHJhY2tDbnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgLy8gc2ltaWxhciBoYW5kbGluZyB3aXRoIGRhdGFfYnlwYXNzIGFib3ZlLgorICAgICAgICAgICAgaWYgKG1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQorICAgICAgICAgICAgICAgIGNvcHlJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xMTMxLDcgKzExMzYsOCBAQAogICAgIC8vIGlmIGNvbnRyb2xsZXIgZmxhZyBpcyBzZXQgKE5vdGUgdGhhdCBjb250cm9sbGVyID09IFRSVUUgPT4gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgc2V0KQogICAgIGlmIChpc1Byb2Nlc3NFbmFibGVkKCkgJiYKICAgICAgICAgICAgICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgfHwKLSAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EKSkgeworICAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EIHx8CisgICAgICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9NT05JVE9SKSkgewogICAgICAgICB1aW50MzJfdCB2b2x1bWVbMl07CiAgICAgICAgIHVpbnQzMl90ICpwVm9sdW1lID0gTlVMTDsKICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZih2b2x1bWUpOwpAQCAtMTMyNiw2ICsxMzMyLDcgQEAKICAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9OT05FOiBzLmFwcGVuZCgibm9uZSIpOyBicmVhazsKICAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMOiBzLmFwcGVuZCgiaW1wbGVtZW50cyBjb250cm9sIik7IGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORDogcy5hcHBlbmQoInJlcXVpcmVzIGluZGljYXRpb24iKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfTU9OSVRPUjogcy5hcHBlbmQoIm1vbml0b3JzIHZvbHVtZSIpOyBicmVhazsKICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKICAgICB9CiAgICAgcy5hcHBlbmQoIiwgIik7CkBAIC0xNDkzLDYgKzE1MDAsMTEgQEAKIAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5sZW5ndGgoKSk7CiAKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSAhPSAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICJcdEVmZmVjdCBJRCAlZCBIQUwgZHVtcDpcbiIsIG1JZCk7CisgICAgICAgICh2b2lkKW1FZmZlY3RJbnRlcmZhY2UtPmR1bXAoZmQpOworICAgIH0KKwogICAgIGlmIChsb2NrZWQpIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgfQpAQCAtMTg1OSw3ICsxODcxLDcgQEAKICAgICBib29sIGxvY2tlZCA9IG1DYmxrICE9IE5VTEwgJiYgQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtQ2Jsay0+bG9jayk7CiAKICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJcdFx0XHQlNWQgICAgJTVkICAlM3MgICAgJTNzICAlNXUgICU1dVxuIiwKLSAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVByaW9yaXR5LAogICAgICAgICAgICAgbUhhc0NvbnRyb2wgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICBsb2NrZWQgPyAieWVzIiA6ICJubyIsCkBAIC0yMjcyLDcgKzIyODQsNyBAQAogICAgIH0KICAgICAvLyB0aGVuIGluZGljYXRlIHZvbHVtZSB0byBhbGwgb3RoZXIgZWZmZWN0cyBpbiBjaGFpbi4KICAgICAvLyBQYXNzIGFsdGVyZWQgdm9sdW1lIHRvIGVmZmVjdHMgYmVmb3JlIHZvbHVtZSBjb250cm9sbGVyCi0gICAgLy8gYW5kIHJlcXVlc3RlZCB2b2x1bWUgdG8gZWZmZWN0cyBhZnRlciBjb250cm9sbGVyCisgICAgLy8gYW5kIHJlcXVlc3RlZCB2b2x1bWUgdG8gZWZmZWN0cyBhZnRlciBjb250cm9sbGVyIG9yIHdpdGggdm9sdW1lIG1vbml0b3IgZmxhZwogICAgIHVpbnQzMl90IGxWb2wgPSBuZXdMZWZ0OwogICAgIHVpbnQzMl90IHJWb2wgPSBuZXdSaWdodDsKIApAQCAtMjI4NSw3ICsyMjk3LDEyIEBACiAgICAgICAgICAgICBsVm9sID0gKmxlZnQ7CiAgICAgICAgICAgICByVm9sID0gKnJpZ2h0OwogICAgICAgICB9Ci0gICAgICAgIG1FZmZlY3RzW2ldLT5zZXRWb2x1bWUoJmxWb2wsICZyVm9sLCBmYWxzZSk7CisgICAgICAgIC8vIFBhc3MgcmVxdWVzdGVkIHZvbHVtZSBkaXJlY3RseSBpZiB0aGlzIGlzIHZvbHVtZSBtb25pdG9yIG1vZHVsZQorICAgICAgICBpZiAobUVmZmVjdHNbaV0tPmlzVm9sdW1lTW9uaXRvcigpKSB7CisgICAgICAgICAgICBtRWZmZWN0c1tpXS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0LCBmYWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRWZmZWN0c1tpXS0+c2V0Vm9sdW1lKCZsVm9sLCAmclZvbCwgZmFsc2UpOworICAgICAgICB9CiAgICAgfQogICAgICpsZWZ0ID0gbmV3TGVmdDsKICAgICAqcmlnaHQgPSBuZXdSaWdodDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCmluZGV4IDE1YTI2ZWEuLjU4Y2UzNTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaApAQCAtMTM0LDYgKzEzNCw5IEBACiAgICAgYm9vbCAgICAgICAgICAgICBpc1ZvbHVtZUNvbnRyb2woKSBjb25zdAogICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkw7IH0KKyAgICBib29sICAgICAgICAgICAgIGlzVm9sdW1lTW9uaXRvcigpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfTU9OSVRPUjsgfQogICAgIHN0YXR1c190ICAgICAgICAgc2V0T2ZmbG9hZGVkKGJvb2wgb2ZmbG9hZGVkLCBhdWRpb19pb19oYW5kbGVfdCBpbyk7CiAgICAgYm9vbCAgICAgICAgICAgICBpc09mZmxvYWRlZCgpIGNvbnN0OwogICAgIHZvaWQgICAgICAgICAgICAgYWRkRWZmZWN0VG9IYWxfbCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKaW5kZXggZDA2Mzc3Mi4uZGQ4NGJmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19BVURJTwogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CkBAIC0xNjEsNyArMTYyLDIxIEBACiAgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSBtQ3VycmVudDsKICAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOwogICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IG1Db21tYW5kOwotICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKyAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciA9IGN1cnJlbnQtPm1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlcjsKKyAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgcGF0Y2hCdWZmZXI7CisKKyAgICBpZiAoZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgIT0gMCkgeworICAgICAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gfjA7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZwYXRjaEJ1ZmZlcik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCBpdCBkb2Vzbid0IGNhdXNlIGFueSBpc3N1ZXMgaWYgd2UganVzdCBnZXQgYSBzbWFsbCBhdmFpbGFibGUKKyAgICAgICAgICAgIC8vIGJ1ZmZlciBmcm9tIHRoZSBidWZmZXIgcHJvdmlkZXIuCisgICAgICAgICAgICBmcmFtZUNvdW50ID0gcGF0Y2hCdWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGlmICgoY29tbWFuZCAmIEZhc3RDYXB0dXJlU3RhdGU6OlJFQUQpIC8qJiYgaXNXYXJtKi8pIHsKICAgICAgICAgQUxPR19BU1NFUlQobUlucHV0U291cmNlICE9IE5VTEwpOwpAQCAtMTc2LDYgKzE5MSw3IEBACiAgICAgICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7CiAgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkID0gbVRvdGFsTmF0aXZlRnJhbWVzUmVhZDsKICAgICAgICAgICAgIG1SZWFkQnVmZmVyU3RhdGUgPSBmcmFtZXNSZWFkOworICAgICAgICAgICAgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lc1JlYWQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkdW1wU3RhdGUtPm1SZWFkRXJyb3JzKys7CiAgICAgICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlID0gMDsKQEAgLTE5MywxMSArMjA5LDE4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1SZWFkQnVmZmVyU3RhdGUgPiAwKSB7CiAgICAgICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBtUGlwZVNpbmstPndyaXRlKG1SZWFkQnVmZmVyLCBtUmVhZEJ1ZmZlclN0YXRlKTsKLSAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgc3VwcG9ydHMgYXQgbW9zdCBvbmUgZmFzdCBjYXB0dXJlIGNsaWVudC4KLSAgICAgICAgICAgIC8vICAgICAgIFRvIGhhbmRsZSBtdWx0aXBsZSBjbGllbnRzIHRoaXMgY291bGQgYmUgY29udmVydGVkIHRvIGFuIGFycmF5LAotICAgICAgICAgICAgLy8gICAgICAgb3Igd2l0aCBhIGxvdCBtb3JlIHdvcmsgdGhlIGNvbnRyb2wgYmxvY2sgY291bGQgYmUgc2hhcmVkIGJ5IGFsbCBjbGllbnRzLgogICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gY3VycmVudC0+bUNibGs7Ci0gICAgICAgICAgICBpZiAoY2JsayAhPSBOVUxMICYmIGZyYW1lc1dyaXR0ZW4gPiAwKSB7CisgICAgICAgICAgICBpZiAoZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoZSBmYXN0IHRyYWNrIGlzIGEgcGF0Y2ggcmVjb3JkLCB1cGRhdGUgdGhlIGNibGsgYnkKKyAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIHJlbGVhc2VCdWZmZXIoKS4KKyAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KHBhdGNoQnVmZmVyLnJhdywgY3VycmVudC0+bUZhc3RQYXRjaFJlY29yZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZWFkQnVmZmVyLCBtRm9ybWF0Lm1Gb3JtYXQsIGZyYW1lc1dyaXR0ZW4gKiBtRm9ybWF0Lm1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXNXcml0dGVuOworICAgICAgICAgICAgICAgIGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZwYXRjaEJ1ZmZlcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNibGsgIT0gTlVMTCAmJiBmcmFtZXNXcml0dGVuID4gMCkgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgc3VwcG9ydHMgYXQgbW9zdCBvbmUgZmFzdCBjYXB0dXJlIGNsaWVudC4KKyAgICAgICAgICAgICAgICAvLyAgICAgICBUbyBoYW5kbGUgbXVsdGlwbGUgY2xpZW50cyB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBhcnJheSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICBvciB3aXRoIGEgbG90IG1vcmUgd29yayB0aGUgY29udHJvbCBibG9jayBjb3VsZCBiZSBzaGFyZWQgYnkgYWxsIGNsaWVudHMuCiAgICAgICAgICAgICAgICAgaW50MzJfdCByZWFyID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOwogICAgICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoZnJhbWVzV3JpdHRlbiArIHJlYXIsICZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOwogICAgICAgICAgICAgICAgIGNibGstPm1TZXJ2ZXIgKz0gZnJhbWVzV3JpdHRlbjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCmluZGV4IDliY2EyZDQuLmQyODcyMzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9TVEFURV9ICiAKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlICJGYXN0VGhyZWFkU3RhdGUuaCIKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KIApAQCAtMzcsNiArMzgsMTAgQEAKICAgICBzaXplX3QgICAgICAgICAgbUZyYW1lQ291bnQ7ICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHBlciBmYXN0IGNhcHR1cmUgYnVmZmVyCiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBtQ2JsazsgICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgdGhlIHNpbmdsZSBmYXN0IGNsaWVudCwgb3IgTlVMTAogCisgICAgYXVkaW9fZm9ybWF0X3QgIG1GYXN0UGF0Y2hSZWNvcmRGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBtRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgPSBudWxscHRyOyAgIC8vIGEgcmVmZXJlbmNlIHRvIGEgcGF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCBpbiBmYXN0IG1vZGUKKwogICAgIC8vIEV4dGVuZHMgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kCiAgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhbHNvIHByb2Nlc3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBhbmQgY2FuIGJlICJvciJlZDoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggNzliYjlmZS4uYzViOTk1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTMyLDEzICszMiwxNCBAQAogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUwotI2luY2x1ZGUgPGNwdXN0YXRzL0NlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9TdGF0aXN0aWNzLmg+CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KICNlbmRpZgogI2VuZGlmCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvbW9ub19ibGVuZC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbW9ub19ibGVuZC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvTWl4ZXIuaD4KICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJUeXBlZExvZ2dlci5oIgpAQCAtNDcsNyArNDgsOCBAQAogCiAvKnN0YXRpYyovIGNvbnN0IEZhc3RNaXhlclN0YXRlIEZhc3RNaXhlcjo6c0luaXRpYWw7CiAKLUZhc3RNaXhlcjo6RmFzdE1peGVyKCkgOiBGYXN0VGhyZWFkKCJjeWNsZV9tcyIsICJsb2FkX3VzIiksCitGYXN0TWl4ZXI6OkZhc3RNaXhlcihhdWRpb19pb19oYW5kbGVfdCBwYXJlbnRJb0hhbmRsZSkKKyAgICA6IEZhc3RUaHJlYWQoImN5Y2xlX21zIiwgImxvYWRfdXMiKSwKICAgICAvLyBtRmFzdFRyYWNrTmFtZXMKICAgICAvLyBtR2VuZXJhdGlvbnMKICAgICBtT3V0cHV0U2luayhOVUxMKSwKQEAgLTU4LDcgKzYwLDYgQEAKICAgICBtU2lua0NoYW5uZWxDb3VudChGQ0NfMiksCiAgICAgbU1peGVyQnVmZmVyKE5VTEwpLAogICAgIG1NaXhlckJ1ZmZlclNpemUoMCksCi0gICAgbU1peGVyQnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKICAgICBtTWl4ZXJCdWZmZXJTdGF0ZShVTkRFRklORUQpLAogICAgIG1Gb3JtYXQoRm9ybWF0X0ludmFsaWQpLAogICAgIG1TYW1wbGVSYXRlKDApLApAQCAtNjYsOCArNjcsMTEgQEAKICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKDApLAogICAgIC8vIHRpbWVzdGFtcAogICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKDApLCAgIC8vIHRoZSA9IDAgaXMgdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIKLSAgICBtTWFzdGVyTW9ubyhmYWxzZSkKKyAgICBtTWFzdGVyTW9ubyhmYWxzZSksCisgICAgbVRocmVhZElvSGFuZGxlKHBhcmVudElvSGFuZGxlKQogeworICAgICh2b2lkKW1UaHJlYWRJb0hhbmRsZTsgLy8gcHJldmVudCB1bnVzZWQgd2FybmluZywgc2VlIEMrKzE3IFtbbWF5YmVfdW51c2VkXV0KKwogICAgIC8vIEZJWE1FIHBhc3Mgc0luaXRpYWwgYXMgcGFyYW1ldGVyIHRvIGJhc2UgY2xhc3MgY29uc3RydWN0b3IsIGFuZCBtYWtlIGl0IHN0YXRpYyBsb2NhbAogICAgIG1QcmV2aW91cyA9ICZzSW5pdGlhbDsKICAgICBtQ3VycmVudCA9ICZzSW5pdGlhbDsKQEAgLTEzNSw2ICsxMzksNzUgQEAKICAgICB9CiB9CiAKK3ZvaWQgRmFzdE1peGVyOjp1cGRhdGVNaXhlclRyYWNrKGludCBpbmRleCwgUmVhc29uIHJlYXNvbikgeworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKKyAgICBjb25zdCBGYXN0VHJhY2sgKiBjb25zdCBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaW5kZXhdOworCisgICAgLy8gY2hlY2sgYW5kIHVwZGF0ZSBnZW5lcmF0aW9uCisgICAgaWYgKHJlYXNvbiA9PSBSRUFTT05fTU9ESUZZICYmIG1HZW5lcmF0aW9uc1tpbmRleF0gPT0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbikgeworICAgICAgICByZXR1cm47IC8vIG5vIGNoYW5nZSBvbiBhbiBhbHJlYWR5IGNvbmZpZ3VyZWQgdHJhY2suCisgICAgfQorICAgIG1HZW5lcmF0aW9uc1tpbmRleF0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworCisgICAgLy8gbU1peGVyID09IG51bGxwdHIgb24gY29uZmlndXJhdGlvbiBmYWlsdXJlIChjaGVjayBkb25lIGFmdGVyIGdlbmVyYXRpb24gdXBkYXRlKS4KKyAgICBpZiAobU1peGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAocmVhc29uKSB7CisgICAgY2FzZSBSRUFTT05fUkVNT1ZFOgorICAgICAgICBtTWl4ZXItPmRlc3Ryb3koaW5kZXgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJFQVNPTl9BREQ6IHsKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gbU1peGVyLT5jcmVhdGUoCisgICAgICAgICAgICAgICAgaW5kZXgsIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLCBmYXN0VHJhY2stPm1Gb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgICAgICIlczogY2Fubm90IGNyZWF0ZSBmYXN0IHRyYWNrIGluZGV4IgorICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4IGluIEF1ZGlvTWl4ZXIiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpbmRleCwgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2ssIGZhc3RUcmFjay0+bUZvcm1hdCk7CisgICAgfQorICAgICAgICBbW2ZhbGx0aHJvdWdoXV07ICAvLyBub3cgZmFsbHRocm91Z2ggdG8gdXBkYXRlIHRoZSBuZXdseSBjcmVhdGVkIHRyYWNrLgorICAgIGNhc2UgUkVBU09OX01PRElGWToKKyAgICAgICAgbU1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihpbmRleCwgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIpOworCisgICAgICAgIGZsb2F0IHZsZiwgdnJmOworICAgICAgICBpZiAoZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3QgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7CisgICAgICAgICAgICB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CisgICAgICAgICAgICB2cmYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmxmID0gdnJmID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCB2b2x1bWUgdG8gYXZvaWQgcmFtcCB3aGVuZXZlciB0aGUgdHJhY2sgaXMgdXBkYXRlZCAob3IgY3JlYXRlZCkuCisgICAgICAgIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgZGlzdGluZ3Vpc2ggZnJvbSBzdGFydGluZyBmcmVzaCBvcgorICAgICAgICAvLyByZXN1bWluZyBmcm9tIGEgcGF1c2VkIHN0YXRlLgorICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7CisKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLCBBdWRpb01peGVyOjpSRU1PVkUsIG51bGxwdHIpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAorICAgICAgICAgICAgICAgICh2b2lkICopbU1peGVyQnVmZmVyKTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Rk9STUFULAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1Gb3JtYXQpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6SEFQVElDX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCk7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6SEFQVElDX0lOVEVOU0lUWSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tSGFwdGljSW50ZW5zaXR5KTsKKworICAgICAgICBtTWl4ZXItPmVuYWJsZShpbmRleCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBpbnZhbGlkIHVwZGF0ZSByZWFzb24gJWQiLCBfX2Z1bmNfXywgcmVhc29uKTsKKyAgICB9Cit9CisKIHZvaWQgRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlKCkKIHsKICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CkBAIC0xNTUsMjAgKzIyOCwyNSBAQAogICAgIGlmIChjdXJyZW50LT5tT3V0cHV0U2lua0dlbiAhPSBtT3V0cHV0U2lua0dlbikgewogICAgICAgICBtT3V0cHV0U2luayA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rOwogICAgICAgICBtT3V0cHV0U2lua0dlbiA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuOworICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gY3VycmVudC0+bVNpbmtDaGFubmVsTWFzazsKKyAgICAgICAgbUJhbGFuY2Uuc2V0Q2hhbm5lbE1hc2sobVNpbmtDaGFubmVsTWFzayk7CiAgICAgICAgIGlmIChtT3V0cHV0U2luayA9PSBOVUxMKSB7CiAgICAgICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7CiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IDA7CiAgICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IDA7CiAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICAgICAgbUF1ZGlvQ2hhbm5lbENvdW50ID0gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1Gb3JtYXQgPSBtT3V0cHV0U2luay0+Zm9ybWF0KCk7CiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKG1Gb3JtYXQpOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KG1Gb3JtYXQpOwogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU2lua0NoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpOwogCi0gICAgICAgICAgICAvLyBUT0RPOiBBZGQgY2hhbm5lbCBtYXNrIHRvIE5CQUlPX0Zvcm1hdAotICAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCi0gICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGlmIChtU2lua0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobVNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUF1ZGlvQ2hhbm5lbENvdW50ID0gbVNpbmtDaGFubmVsQ291bnQgLSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOwogICAgICAgICB9CiAgICAgICAgIGR1bXBTdGF0ZS0+bVNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICB9CkBAIC0xODIsMTUgKzI2MCwxNSBAQAogICAgICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKICAgICAgICAgbVNpbmtCdWZmZXIgPSBOVUxMOwogICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDAgJiYgbVNhbXBsZVJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAvLyBUaGUgbWl4ZXIgcHJvZHVjZXMgZWl0aGVyIDE2IGJpdCBQQ00gb3IgZmxvYXQgb3V0cHV0LCBzZWxlY3QKLSAgICAgICAgICAgIC8vIGZsb2F0IG91dHB1dCBpZiB0aGUgSEFMIHN1cHBvcnRzIGhpZ2hlciB0aGFuIDE2IGJpdCBwcmVjaXNpb24uCi0gICAgICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQgPSBtRm9ybWF0Lm1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgPwotICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CiAgICAgICAgICAgICAvLyBGSVhNRSBuZXcgbWF5IGJsb2NrIGZvciB1bmJvdW5kZWQgdGltZSBhdCBpbnRlcm5hbCBtdXRleCBvZiB0aGUgaGVhcAogICAgICAgICAgICAgLy8gICAgICAgaW1wbGVtZW50YXRpb247IGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIG5vcm1hbCBtaXhlciBhbGxvY2F0ZSBmb3IgdXMKICAgICAgICAgICAgIC8vICAgICAgIHRvIGF2b2lkIGJsb2NraW5nIGhlcmUgYW5kIHRvIHByZXZlbnQgcG9zc2libGUgcHJpb3JpdHkgaW52ZXJzaW9uCiAgICAgICAgICAgICBtTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihmcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAvLyBGSVhNRSBTZWUgdGhlIG90aGVyIEZJWE1FIGF0IEZhc3RNaXhlcjo6c2V0TkJMb2dXcml0ZXIoKQorICAgICAgICAgICAgTkJMb2c6OnRocmVhZF9wYXJhbXNfdCBwYXJhbXM7CisgICAgICAgICAgICBwYXJhbXMuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgICAgICAgICBwYXJhbXMuc2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgICAgICAgICAgTE9HX1RIUkVBRF9QQVJBTVMocGFyYW1zKTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtaXhlckZyYW1lU2l6ZSA9IG1TaW5rQ2hhbm5lbENvdW50CiAgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtTWl4ZXJCdWZmZXJGb3JtYXQpOwogICAgICAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSA9IG1peGVyRnJhbWVTaXplICogZnJhbWVDb3VudDsKQEAgLTIyMCw2ICsyOTgsMTAgQEAKICAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSAwOwogICAgICAgICBtRmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuIC0gMTsKICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgbVRlZS5zZXQobUZvcm1hdCwgTkJBSU9fVGVlOjpURUVfRkxBR19PVVRQVVRfVEhSRUFEKTsKKyAgICAgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobVRocmVhZElvSGFuZGxlKSArICJfRiIpOworI2VuZGlmCiAgICAgfSBlbHNlIHsKICAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSBwcmV2aW91cy0+bVRyYWNrTWFzazsKICAgICB9CkBAIC0yMjcsMjEgKzMwOSwxNiBAQAogICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gYWN0aXZlIHRyYWNrIHNldAogICAgIGNvbnN0IHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOwogICAgIGR1bXBTdGF0ZS0+bVRyYWNrTWFzayA9IGN1cnJlbnRUcmFja01hc2s7CisgICAgZHVtcFN0YXRlLT5tTnVtVHJhY2tzID0gcG9wY291bnQoY3VycmVudFRyYWNrTWFzayk7CiAgICAgaWYgKGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuICE9IG1GYXN0VHJhY2tzR2VuKSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKG1NaXhlckJ1ZmZlciAhPSBOVUxMKTsKIAogICAgICAgICAvLyBwcm9jZXNzIHJlbW92ZWQgdHJhY2tzIGZpcnN0IHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIHRyYWNrIG5hbWVzCiAgICAgICAgIHVuc2lnbmVkIHJlbW92ZWRUcmFja3MgPSBwcmV2aW91c1RyYWNrTWFzayAmIH5jdXJyZW50VHJhY2tNYXNrOwogICAgICAgICB3aGlsZSAocmVtb3ZlZFRyYWNrcyAhPSAwKSB7CiAgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHoocmVtb3ZlZFRyYWNrcyk7CiAgICAgICAgICAgICByZW1vdmVkVHJhY2tzICY9IH4oMSA8PCBpKTsKLSAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICBpZiAobU1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTWl4ZXItPmRlc3Ryb3koaSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVNaXhlclRyYWNrKGksIFJFQVNPTl9SRU1PVkUpOwogICAgICAgICAgICAgLy8gZG9uJ3QgcmVzZXQgdHJhY2sgZHVtcCBzdGF0ZSwgc2luY2Ugb3RoZXIgc2lkZSBpcyBpZ25vcmluZyBpdAotICAgICAgICAgICAgbUdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKICAgICAgICAgfQogCiAgICAgICAgIC8vIG5vdyBwcm9jZXNzIGFkZGVkIHRyYWNrcwpAQCAtMjQ5LDM2ICszMjYsNyBAQAogICAgICAgICB3aGlsZSAoYWRkZWRUcmFja3MgIT0gMCkgewogICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KGFkZGVkVHJhY2tzKTsKICAgICAgICAgICAgIGFkZGVkVHJhY2tzICY9IH4oMSA8PCBpKTsKLSAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKLSAgICAgICAgICAgIGlmIChtTWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gaTsgLy8gZm9yIGNsYXJpdHksIGNob29zZSBuYW1lIGFzIGZhc3QgdHJhY2sgaW5kZXguCi0gICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1peGVyLT5jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7Ci0gICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLCBmYXN0VHJhY2stPm1Gb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOwotICAgICAgICAgICAgICAgIC8vIG5ld2x5IGFsbG9jYXRlZCB0cmFjayBuYW1lcyBkZWZhdWx0IHRvIGZ1bGwgc2NhbGUgdm9sdW1lCi0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Rk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltU2lua0NoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICBtTWl4ZXItPmVuYWJsZShuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgICAgICB1cGRhdGVNaXhlclRyYWNrKGksIFJFQVNPTl9BREQpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gZmluYWxseSBwcm9jZXNzIChwb3RlbnRpYWxseSkgbW9kaWZpZWQgdHJhY2tzOyB0aGVzZSB1c2UgdGhlIHNhbWUgc2xvdApAQCAtMjg3LDQwICszMzUsMTAgQEAKICAgICAgICAgd2hpbGUgKG1vZGlmaWVkVHJhY2tzICE9IDApIHsKICAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihtb2RpZmllZFRyYWNrcyk7CiAgICAgICAgICAgICBtb2RpZmllZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1HZW5lcmF0aW9uICE9IG1HZW5lcmF0aW9uc1tpXSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgd2FzIGFjdHVhbGx5IG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAobU1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5hbWUgPSBpOwotICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGYgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRU1PVkUsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Rk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGVuYWJsZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZU1peGVyVHJhY2soaSwgUkVBU09OX01PRElGWSk7CiAgICAgICAgIH0KIAogICAgICAgICBtRmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuOwotCi0gICAgICAgIGR1bXBTdGF0ZS0+bU51bVRyYWNrcyA9IHBvcGNvdW50KGN1cnJlbnRUcmFja01hc2spOwogICAgIH0KIH0KIApAQCAtMzI4LDEzICszNDYsMjQgQEAKIHsKICAgICAvLyBUT0RPOiBwYXNzIGFuIElEIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB3aGljaCB0aW1lIHNlcmllcyB3ZSB3YW50IHRvIHdyaXRlIHRvIGluIE5CTG9nLmNwcAogICAgIC8vIE9yOiBwYXNzIGJvdGggb2YgdGhlc2UgaW50byBhIHNpbmdsZSBjYWxsIHdpdGggYSBib29sZWFuCi0gICAgaWYgKG1Jc1dhcm0pIHsKLSAgICAgICAgTE9HX0hJU1RfVFMoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKLSAgICB9CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1DdXJyZW50OwogICAgIEZhc3RNaXhlckR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0TWl4ZXJEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKKworICAgIGlmIChtSXNXYXJtKSB7CisgICAgICAgIC8vIExvZ2dpbmcgdGltZXN0YW1wcyBmb3IgRmFzdE1peGVyIGlzIGN1cnJlbnRseSBkaXNhYmxlZCB0byBtYWtlIG1lbW9yeSByb29tIGZvciBsb2dnaW5nCisgICAgICAgIC8vIG90aGVyIHN0YXRpc3RpY3MgaW4gRmFzdE1peGVyLgorICAgICAgICAvLyBUbyByZS1lbmFibGUsIGRlbGV0ZSB0aGUgI2lmZGVmIEZBU1RNSVhFUl9MT0dfSElTVF9UUyBsaW5lcyAoYW5kIHRoZSAjZW5kaWYgbGluZXMpLgorI2lmZGVmIEZBU1RNSVhFUl9MT0dfSElTVF9UUworICAgICAgICBMT0dfSElTVF9UUygpOworI2VuZGlmCisgICAgICAgIC8vQUxPR0QoIkVyaWMgRmFzdE1peGVyOjpvbldvcmsoKSBtSXNXYXJtIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHVtcFN0YXRlLT5tVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAvLyBTZWUgY29tbWVudCBpbiBpZiBibG9jay4KKyNpZmRlZiBGQVNUTUlYRVJfTE9HX0hJU1RfVFMKKyAgICAgICAgTE9HX0FVRElPX1NUQVRFKCk7CisjZW5kaWYKKyAgICB9CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IG1Db21tYW5kOwogICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CiAKQEAgLTM3Niw4ICs0MDUsOCBAQAogICAgICAgICAgICAgICAgIGZsb2F0IHZsZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKICAgICAgICAgICAgICAgICBmbG9hdCB2cmYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOwogCi0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKLSAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBGSVhNRSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBmcmFtZXNSZWFkeSgpIGZvciBmYXN0IHRyYWNrcwogICAgICAgICAgICAgLy8gdGFrZXMgYSB0cnlMb2NrLCB3aGljaCBjYW4gYmxvY2sKQEAgLTQzOSwxNyArNDY4LDI5IEBACiAgICAgICAgICAgICBtb25vX2JsZW5kKG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LCBGb3JtYXRfY2hhbm5lbENvdW50KG1Gb3JtYXQpLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qbGltaXQqLyk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBCYWxhbmNlIG11c3QgdGFrZSBlZmZlY3QgYWZ0ZXIgbW9ubyBjb252ZXJzaW9uLgorICAgICAgICAvLyBtQmFsYW5jZSBkZXRlY3RzIHplcm8gYmFsYW5jZSB3aXRoaW4gdGhlIGNsYXNzIGZvciBzcGVlZCAobm90IG5lZWRlZCBoZXJlKS4KKyAgICAgICAgbUJhbGFuY2Uuc2V0QmFsYW5jZShtTWFzdGVyQmFsYW5jZS5sb2FkKCkpOworICAgICAgICBtQmFsYW5jZS5wcm9jZXNzKChmbG9hdCAqKW1NaXhlckJ1ZmZlciwgZnJhbWVDb3VudCk7CisKICAgICAgICAgLy8gcHJlcGFyZSB0aGUgYnVmZmVyIHVzZWQgdG8gd3JpdGUgdG8gc2luawogICAgICAgICB2b2lkICpidWZmZXIgPSBtU2lua0J1ZmZlciAhPSBOVUxMID8gbVNpbmtCdWZmZXIgOiBtTWl4ZXJCdWZmZXI7CiAgICAgICAgIGlmIChtRm9ybWF0Lm1Gb3JtYXQgIT0gbU1peGVyQnVmZmVyRm9ybWF0KSB7IC8vIHNpbmsgZm9ybWF0IG5vdCB0aGUgc2FtZSBhcyBtaXhlciBmb3JtYXQKICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBtRm9ybWF0Lm1Gb3JtYXQsIG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KSk7CiAgICAgICAgIH0KLSAgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKCkgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luawotICAgICAgICBOQkFJT19TaW5rKiB0ZWVTaW5rOwotICAgICAgICBpZiAoKHRlZVNpbmsgPSBjdXJyZW50LT5tVGVlU2luaykgIT0gTlVMTCkgewotICAgICAgICAgICAgKHZvaWQpIHRlZVNpbmstPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisgICAgICAgIGlmIChtU2lua0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgICAgICAvLyBXaGVuIHRoZXJlIGFyZSBoYXB0aWMgY2hhbm5lbHMsIHRoZSBzYW1wbGUgZGF0YSBpcyBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQuCisgICAgICAgICAgICAvLyBNYWtlIHRoZSBzYW1wbGUgZGF0YSBmdWxseSBpbnRlcmxlYXZlZCBoZXJlLgorICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZShidWZmZXIsIG1BdWRpb0NoYW5uZWxDb3VudCwgYnVmZmVyLCBtU2lua0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0Lm1Gb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1BdWRpb0NoYW5uZWxDb3VudCwgbUZvcm1hdC5tRm9ybWF0KSk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKCkgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luaworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIG1UZWUud3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyNlbmRpZgogICAgICAgICAvLyBGSVhNRSB3cml0ZSgpIGlzIG5vbi1ibG9ja2luZyBhbmQgbG9jay1mcmVlIGZvciBhIHByb3Blcmx5IGltcGxlbWVudGVkIE5CQUlPIHNpbmssCiAgICAgICAgIC8vICAgICAgIGJ1dCB0aGlzIGNvZGUgc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGhhbmRsZSBib3RoIG5vbi1ibG9ja2luZyBhbmQgYmxvY2tpbmcgc2lua3MKICAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVTZXF1ZW5jZSsrOwpAQCAtNDcwLDM1ICs1MTEsNDkgQEAKICAgICAgICAgbUF0dGVtcHRlZFdyaXRlID0gdHJ1ZTsKICAgICAgICAgLy8gRklYTUUgY291bnQgIyBvZiB3cml0ZXMgYmxvY2tlZCBleGNlc3NpdmVseSwgQ1BVIHVzYWdlLCBldGMuIGZvciBkdW1wCiAKLSAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyBsb2NhbAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT3V0cHV0U2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKLSAgICAgICAgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgIGlmIChtSXNXYXJtKSB7CisgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIGxvY2FsCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT3V0cHV0U2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVGltZXN0YW1wVmVyaWZpZXIuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPQogICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiAtIHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgY29tcGVuc2F0ZSBmb3Igc2VydmVyIC0ga2VybmVsIHRpbWUgZGlmZmVyZW5jZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1cGRhdGUgbGF0ZW5jeSBpZiB3ZSBoYXZlIHZhbGlkIGluZm8uCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgKiAxMDAwIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUxhdGVuY3lNcyA9IGxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgTE9HX0xBVEVOQ1kobGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBIQUwgcmVwb3J0ZWQgdGhhdCBtb3JlIGZyYW1lcyB3ZXJlIHByZXNlbnRlZCB0aGFuIHdlcmUgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSEFMIHJlcG9ydGVkIHRoYXQgbW9yZSBmcmFtZXMgd2VyZSBwcmVzZW50ZWQgdGhhbiB3ZXJlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9IDA7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVGltZXN0YW1wVmVyaWZpZXIuZXJyb3IoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPQotICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBmZXRjaCBzZXJ2ZXIgdGltZSBpZiB3ZSBjYW4ndCBnZXQgdGltZXN0YW1wCi0gICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPQotICAgICAgICAgICAgICAgICAgICBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgICAgICAgICAvLyBjbGVhciBvdXQga2VybmVsIGNhY2hlZCBwb3NpdGlvbiBhcyB0aGlzIG1heSBnZXQgcmFwaWRseSBzdGFsZQotICAgICAgICAgICAgLy8gaWYgd2UgbmV2ZXIgZ2V0IGEgbmV3IHZhbGlkIHRpbWVzdGFtcAotICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSAwOwotICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gLTE7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZmV0Y2ggc2VydmVyIHRpbWUgaWYgd2UgY2FuJ3QgZ2V0IHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGtlcm5lbCBjYWNoZWQgcG9zaXRpb24gYXMgdGhpcyBtYXkgZ2V0IHJhcGlkbHkgc3RhbGUKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBuZXZlciBnZXQgYSBuZXcgdmFsaWQgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSAwOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IC0xOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCmluZGV4IDIzNWQyM2YuLjk3YWI2MzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKQEAgLTE4LDEwICsxOCwxMiBAQAogI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfSAogCiAjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0JhbGFuY2UuaD4KICNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCisjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzIsMTIgKzM0LDE2IEBACiBjbGFzcyBGYXN0TWl4ZXIgOiBwdWJsaWMgRmFzdFRocmVhZCB7CiAKIHB1YmxpYzoKLSAgICAgICAgICAgIEZhc3RNaXhlcigpOworICAgIC8qKiBGYXN0TWl4ZXIgY29uc3RydWN0b3IgdGFrZXMgYXMgcGFyYW0gdGhlIHBhcmVudCBNaXhlclRocmVhZCdzIGlvIGhhbmRsZSAoaWQpCisgICAgICAgIGZvciBwdXJwb3NlcyBvZiBpZGVudGlmaWNhdGlvbi4gKi8KKyAgICBleHBsaWNpdCBGYXN0TWl4ZXIoYXVkaW9faW9faGFuZGxlX3QgdGhyZWFkSW9IYW5kbGUpOwogICAgIHZpcnR1YWwgfkZhc3RNaXhlcigpOwogCiAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlKiBzcSgpOwogCiAgICAgdmlydHVhbCB2b2lkIHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSB7IG1NYXN0ZXJNb25vLnN0b3JlKG1vbm8pOyAvKiBtZW1vcnlfb3JkZXJfc2VxX2NzdCAqLyB9CisgICAgdmlydHVhbCB2b2lkIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgeyBtTWFzdGVyQmFsYW5jZS5zdG9yZShiYWxhbmNlKTsgfQorICAgIHZpcnR1YWwgZmxvYXQgZ2V0TWFzdGVyQmFsYW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1NYXN0ZXJCYWxhbmNlLmxvYWQoKTsgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRCb290dGltZU9mZnNldChpbnQ2NF90IGJvb3R0aW1lT2Zmc2V0KSB7CiAgICAgICAgIG1Cb290dGltZU9mZnNldC5zdG9yZShib290dGltZU9mZnNldCk7IC8qIG1lbW9yeV9vcmRlcl9zZXFfY3N0ICovCiAgICAgfQpAQCAtNTMsNiArNTksMTQgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZSgpOwogICAgIHZpcnR1YWwgdm9pZCBvbldvcmsoKTsKIAorICAgIGVudW0gUmVhc29uIHsKKyAgICAgICAgUkVBU09OX1JFTU9WRSwKKyAgICAgICAgUkVBU09OX0FERCwKKyAgICAgICAgUkVBU09OX01PRElGWSwKKyAgICB9OworICAgIC8vIGNhbGxlZCB3aGVuIGEgZmFzdCB0cmFjayBvZiBpbmRleCBoYXMgYmVlbiByZW1vdmVkLCBhZGRlZCwgb3IgbW9kaWZpZWQKKyAgICB2b2lkIHVwZGF0ZU1peGVyVHJhY2soaW50IGluZGV4LCBSZWFzb24gcmVhc29uKTsKKwogICAgIC8vIEZJWE1FIHRoZXNlIGZvcm1lciBsb2NhbCB2YXJpYWJsZXMgbmVlZCBjb21tZW50cwogICAgIHN0YXRpYyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBzSW5pdGlhbDsKIApAQCAtNzEsNyArODUsOSBAQAogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1TaW5rQ2hhbm5lbE1hc2s7CiAgICAgdm9pZCogICAgICAgICAgIG1NaXhlckJ1ZmZlcjsgICAgICAgLy8gbWl4ZXIgb3V0cHV0IGJ1ZmZlci4KICAgICBzaXplX3QgICAgICAgICAgbU1peGVyQnVmZmVyU2l6ZTsKLSAgICBhdWRpb19mb3JtYXRfdCAgbU1peGVyQnVmZmVyRm9ybWF0OyAvLyBtaXhlciBvdXRwdXQgZm9ybWF0OiBBVURJT19GT1JNQVRfUENNXygxNl9CSVR8RkxPQVQpLgorICAgIHN0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3QgbU1peGVyQnVmZmVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKworICAgIHVpbnQzMl90ICAgICAgICBtQXVkaW9DaGFubmVsQ291bnQ7IC8vIGF1ZGlvIGNoYW5uZWwgY291bnQsIGV4Y2x1ZGVzIGhhcHRpYyBjaGFubmVscy4KIAogICAgIGVudW0ge1VOREVGSU5FRCwgTUlYRUQsIFpFUk9FRH0gbU1peGVyQnVmZmVyU3RhdGU7CiAgICAgTkJBSU9fRm9ybWF0ICAgIG1Gb3JtYXQ7CkBAIC04NCw5ICsxMDAsMTcgQEAKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBtVGltZXN0YW1wOwogICAgIGludDY0X3QgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKIAorICAgIGF1ZGlvX3V0aWxzOjpCYWxhbmNlIG1CYWxhbmNlOworCiAgICAgLy8gYWNjZXNzZWQgd2l0aG91dCBsb2NrIGJldHdlZW4gbXVsdGlwbGUgdGhyZWFkcy4KICAgICBzdGQ6OmF0b21pY19ib29sIG1NYXN0ZXJNb25vOworICAgIHN0ZDo6YXRvbWljPGZsb2F0PiBtTWFzdGVyQmFsYW5jZXt9OwogICAgIHN0ZDo6YXRvbWljX2ludF9mYXN0NjRfdCBtQm9vdHRpbWVPZmZzZXQ7CisKKyAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtVGhyZWFkSW9IYW5kbGU7IC8vIHBhcmVudCB0aHJlYWQgaWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworI2lmZGVmIFRFRV9TSU5LCisgICAgTkJBSU9fVGVlICAgICAgIG1UZWU7CisjZW5kaWYKIH07ICAvLyBjbGFzcyBGYXN0TWl4ZXIKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCmluZGV4IDJlNGZiOGMuLmE0MmUwOWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUwotI2luY2x1ZGUgPGNwdXN0YXRzL0NlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9TdGF0aXN0aWNzLmg+CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KICNlbmRpZgpAQCAtNjgsMjEgKzY4LDIyIEBACiAgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIGNvbW1hbmQ9JXMgd3JpdGVTZXF1ZW5jZT0ldSBmcmFtZXNXcml0dGVuPSV1XG4iCiAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG51bVRyYWNrcz0ldSB3cml0ZUVycm9ycz0ldSB1bmRlcnJ1bnM9JXUgb3ZlcnJ1bnM9JXVcbiIKICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgc2FtcGxlUmF0ZT0ldSBmcmFtZUNvdW50PSV6dSBtZWFzdXJlZFdhcm11cD0lLjNnIG1zLCB3YXJtdXBDeWNsZXM9JXVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbWl4UGVyaW9kPSUuMmYgbXNcbiIsCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zIGxhdGVuY3k9JS4yZiBtc1xuIiwKICAgICAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKG1Db21tYW5kKSwgbVdyaXRlU2VxdWVuY2UsIG1GcmFtZXNXcml0dGVuLAogICAgICAgICAgICAgICAgIG1OdW1UcmFja3MsIG1Xcml0ZUVycm9ycywgbVVuZGVycnVucywgbU92ZXJydW5zLAogICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbWVhc3VyZWRXYXJtdXBNcywgbVdhcm11cEN5Y2xlcywKLSAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMpOworICAgICAgICAgICAgICAgIG1peFBlcmlvZFNlYyAqIDFlMywgbUxhdGVuY3lNcyk7CisgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIFRpbWVzdGFtcCBzdGF0czogJXNcbiIsIG1UaW1lc3RhbXBWZXJpZmllci50b1N0cmluZygpLmNfc3RyKCkpOwogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKICAgICAvLyBmaW5kIHRoZSBpbnRlcnZhbCBvZiB2YWxpZCBzYW1wbGVzCi0gICAgdWludDMyX3QgYm91bmRzID0gbUJvdW5kczsKLSAgICB1aW50MzJfdCBuZXdlc3RPcGVuID0gYm91bmRzICYgMHhGRkZGOworICAgIGNvbnN0IHVpbnQzMl90IGJvdW5kcyA9IG1Cb3VuZHM7CisgICAgY29uc3QgdWludDMyX3QgbmV3ZXN0T3BlbiA9IGJvdW5kcyAmIDB4RkZGRjsKICAgICB1aW50MzJfdCBvbGRlc3RDbG9zZWQgPSBib3VuZHMgPj4gMTY7CiAKICAgICAvL3VpbnQzMl90IG4gPSAobmV3ZXN0T3BlbiAtIG9sZGVzdENsb3NlZCkgJiAweEZGRkY7CiAgICAgdWludDMyX3QgbjsKICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KG5ld2VzdE9wZW4sIG9sZGVzdENsb3NlZCwgJm4pOwotICAgIG4gPSBuICYgMHhGRkZGOworICAgIG4gJj0gMHhGRkZGOwogCiAgICAgaWYgKG4gPiBtU2FtcGxpbmdOKSB7CiAgICAgICAgIEFMT0dFKCJ0b28gbWFueSBzYW1wbGVzICV1Iiwgbik7CkBAIC05MCw5ICs5MSw5IEBACiAgICAgfQogICAgIC8vIHN0YXRpc3RpY3MgZm9yIG1vbm90b25pYyAod2FsbCBjbG9jaykgdGltZSwgdGhyZWFkIHJhdyBDUFUgbG9hZCBpbiB0aW1lLCBDUFUgY2xvY2sgZnJlcXVlbmN5LAogICAgIC8vIGFuZCBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeQotICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3Mgd2FsbCwgbG9hZE5zOworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gd2FsbCwgbG9hZE5zOwogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3Mga0h6LCBsb2FkTUh6OworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4ga0h6LCBsb2FkTUh6OwogICAgIHVpbnQzMl90IHByZXZpb3VzQ3B1a0h6ID0gMDsKICNlbmRpZgogICAgIC8vIEFzc3VtaW5nIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBmb3IgY3ljbGUgdGltZXMsIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMgb24gZWl0aGVyIHNpZGUgb2YKQEAgLTEwNywxOCArMTA4LDE4IEBACiAgICAgICAgIGlmICh0YWlsICE9IE5VTEwpIHsKICAgICAgICAgICAgIHRhaWxbal0gPSB3YWxsTnM7CiAgICAgICAgIH0KLSAgICAgICAgd2FsbC5zYW1wbGUod2FsbE5zKTsKKyAgICAgICAgd2FsbC5hZGQod2FsbE5zKTsKICAgICAgICAgdWludDMyX3Qgc2FtcGxlTG9hZE5zID0gbUxvYWROc1tpXTsKLSAgICAgICAgbG9hZE5zLnNhbXBsZShzYW1wbGVMb2FkTnMpOworICAgICAgICBsb2FkTnMuYWRkKHNhbXBsZUxvYWROcyk7CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUNwdWtIeiA9IG1DcHVrSHpbaV07CiAgICAgICAgIC8vIHNraXAgYmFkIGtIeiBzYW1wbGVzCiAgICAgICAgIGlmICgoc2FtcGxlQ3B1a0h6ICYgfjB4RikgIT0gMCkgewotICAgICAgICAgICAga0h6LnNhbXBsZShzYW1wbGVDcHVrSHogPj4gNCk7CisgICAgICAgICAgICBrSHouYWRkKHNhbXBsZUNwdWtIeiA+PiA0KTsKICAgICAgICAgICAgIGlmIChzYW1wbGVDcHVrSHogPT0gcHJldmlvdXNDcHVrSHopIHsKICAgICAgICAgICAgICAgICBkb3VibGUgbWVnYWN5Y2xlcyA9IChkb3VibGUpIHNhbXBsZUxvYWROcyAqIChkb3VibGUpIChzYW1wbGVDcHVrSHogPj4gNCkgKiAxZS0xMjsKICAgICAgICAgICAgICAgICBkb3VibGUgYWRqTUh6ID0gbWVnYWN5Y2xlcyAvIG1peFBlcmlvZFNlYzsgIC8vIF9ub3RfIHdhbGxOcyAqIDFlOQotICAgICAgICAgICAgICAgIGxvYWRNSHouc2FtcGxlKGFkak1Ieik7CisgICAgICAgICAgICAgICAgbG9hZE1Iei5hZGQoYWRqTUh6KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBwcmV2aW91c0NwdWtIeiA9IHNhbXBsZUNwdWtIejsKQEAgLTEyNiw0MiArMTI3LDQyIEBACiAgICAgfQogICAgIGlmIChuKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIFNpbXBsZSBtb3Zpbmcgc3RhdGlzdGljcyBvdmVyIGxhc3QgJS4xZiBzZWNvbmRzOlxuIiwKLSAgICAgICAgICAgICAgICAgICAgd2FsbC5uKCkgKiBtaXhQZXJpb2RTZWMpOworICAgICAgICAgICAgICAgICAgICB3YWxsLmdldE4oKSAqIG1peFBlcmlvZFNlYyk7CiAgICAgICAgIGRwcmludGYoZmQsICIgICAgd2FsbCBjbG9jayB0aW1lIGluIG1zIHBlciBtaXggY3ljbGU6XG4iCiAgICAgICAgICAgICAgICAgICAgICIgICAgICBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwubWVhbigpKjFlLTYsIHdhbGwubWluaW11bSgpKjFlLTYsIHdhbGwubWF4aW11bSgpKjFlLTYsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwuc3RkZGV2KCkqMWUtNik7CisgICAgICAgICAgICAgICAgICAgIHdhbGwuZ2V0TWVhbigpKjFlLTYsIHdhbGwuZ2V0TWluKCkqMWUtNiwgd2FsbC5nZXRNYXgoKSoxZS02LAorICAgICAgICAgICAgICAgICAgICB3YWxsLmdldFN0ZERldigpKjFlLTYpOwogICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHJhdyBDUFUgbG9hZCBpbiB1cyBwZXIgbWl4IGN5Y2xlOlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAotICAgICAgICAgICAgICAgICAgICBsb2FkTnMubWVhbigpKjFlLTMsIGxvYWROcy5taW5pbXVtKCkqMWUtMywgbG9hZE5zLm1heGltdW0oKSoxZS0zLAotICAgICAgICAgICAgICAgICAgICBsb2FkTnMuc3RkZGV2KCkqMWUtMyk7CisgICAgICAgICAgICAgICAgICAgIGxvYWROcy5nZXRNZWFuKCkqMWUtMywgbG9hZE5zLmdldE1pbigpKjFlLTMsIGxvYWROcy5nZXRNYXgoKSoxZS0zLAorICAgICAgICAgICAgICAgICAgICBsb2FkTnMuZ2V0U3RkRGV2KCkqMWUtMyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gRmFzdE1peGVyIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGN1cnJlbnRseVxuIik7CiAgICAgfQogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgIGRwcmludGYoZmQsICIgIENQVSBjbG9jayBmcmVxdWVuY3kgaW4gTUh6OlxuIgogICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAotICAgICAgICAgICAgICAgIGtIei5tZWFuKCkqMWUtMywga0h6Lm1pbmltdW0oKSoxZS0zLCBrSHoubWF4aW11bSgpKjFlLTMsIGtIei5zdGRkZXYoKSoxZS0zKTsKKyAgICAgICAgICAgICAgICBrSHouZ2V0TWVhbigpKjFlLTMsIGtIei5nZXRNaW4oKSoxZS0zLCBrSHouZ2V0TWF4KCkqMWUtMywga0h6LmdldFN0ZERldigpKjFlLTMpOwogICAgIGRwcmludGYoZmQsICIgIGFkanVzdGVkIENQVSBsb2FkIGluIE1IeiAoaS5lLiBub3JtYWxpemVkIGZvciBDUFUgY2xvY2sgZnJlcXVlbmN5KTpcbiIKICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4xZiBtaW49JS4xZiBtYXg9JS4xZiBzdGRkZXY9JS4xZlxuIiwKLSAgICAgICAgICAgICAgICBsb2FkTUh6Lm1lYW4oKSwgbG9hZE1Iei5taW5pbXVtKCksIGxvYWRNSHoubWF4aW11bSgpLCBsb2FkTUh6LnN0ZGRldigpKTsKKyAgICAgICAgICAgICAgICBsb2FkTUh6LmdldE1lYW4oKSwgbG9hZE1Iei5nZXRNaW4oKSwgbG9hZE1Iei5nZXRNYXgoKSwgbG9hZE1Iei5nZXRTdGREZXYoKSk7CiAjZW5kaWYKICAgICBpZiAodGFpbCAhPSBOVUxMKSB7CiAgICAgICAgIHFzb3J0KHRhaWwsIG4sIHNpemVvZih1aW50MzJfdCksIGNvbXBhcmVfdWludDMyX3QpOwogICAgICAgICAvLyBhc3N1bWUgc2FtZSBudW1iZXIgb2YgdGFpbCBzYW1wbGVzIG9uIGVhY2ggc2lkZSwgbGVmdCBhbmQgcmlnaHQKICAgICAgICAgdWludDMyX3QgY291bnQgPSBuIC8ga1RhaWxEZW5vbWluYXRvcjsKLSAgICAgICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBsZWZ0LCByaWdodDsKKyAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBsZWZ0LCByaWdodDsKICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIGxlZnQuc2FtcGxlKHRhaWxbaV0pOwotICAgICAgICAgICAgcmlnaHQuc2FtcGxlKHRhaWxbbiAtIChpICsgMSldKTsKKyAgICAgICAgICAgIGxlZnQuYWRkKHRhaWxbaV0pOworICAgICAgICAgICAgcmlnaHQuYWRkKHRhaWxbbiAtIChpICsgMSldKTsKICAgICAgICAgfQogICAgICAgICBkcHJpbnRmKGZkLCAiICBEaXN0cmlidXRpb24gb2YgbWl4IGN5Y2xlIHRpbWVzIGluIG1zIGZvciB0aGUgdGFpbHMgIgogICAgICAgICAgICAgICAgICAgICAiKD4gfjMgc3RkZGV2IG91dGxpZXJzKTpcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICBsZWZ0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgIHJpZ2h0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbGVmdC5tZWFuKCkqMWUtNiwgbGVmdC5taW5pbXVtKCkqMWUtNiwgbGVmdC5tYXhpbXVtKCkqMWUtNiwgbGVmdC5zdGRkZXYoKSoxZS02LAotICAgICAgICAgICAgICAgICAgICByaWdodC5tZWFuKCkqMWUtNiwgcmlnaHQubWluaW11bSgpKjFlLTYsIHJpZ2h0Lm1heGltdW0oKSoxZS02LAotICAgICAgICAgICAgICAgICAgICByaWdodC5zdGRkZXYoKSoxZS02KTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdC5nZXRNZWFuKCkqMWUtNiwgbGVmdC5nZXRNaW4oKSoxZS02LCBsZWZ0LmdldE1heCgpKjFlLTYsIGxlZnQuZ2V0U3RkRGV2KCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgcmlnaHQuZ2V0TWVhbigpKjFlLTYsIHJpZ2h0LmdldE1pbigpKjFlLTYsIHJpZ2h0LmdldE1heCgpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LmdldFN0ZERldigpKjFlLTYpOwogICAgICAgICBkZWxldGVbXSB0YWlsOwogICAgIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCmluZGV4IDhlZjMxZDEuLjliOTFjYmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0RVTVBfU1RBVEVfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvVGltZXN0YW1wVmVyaWZpZXIuaD4KICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAiRmFzdFRocmVhZER1bXBTdGF0ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCkBAIC02Niw2ICs2Nyw3IEBACiAKICAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsgICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc3RhYmxlIGNvcHksIG5vdCB0aGUgb3JpZ2luYWwKIAorICAgIGRvdWJsZSAgIG1MYXRlbmN5TXMgPSAwLjsgICAvLyBtZWFzdXJlZCBsYXRlbmN5LCBkZWZhdWx0IG9mIDAgaWYgbm8gdmFsaWQgdGltZXN0YW1wIHJlYWQuCiAgICAgdWludDMyX3QgbVdyaXRlU2VxdWVuY2U7ICAgIC8vIGluY3JlbWVudGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCB3cml0ZSgpCiAgICAgdWludDMyX3QgbUZyYW1lc1dyaXR0ZW47ICAgIC8vIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkKICAgICB1aW50MzJfdCBtTnVtVHJhY2tzOyAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBmYXN0IHRyYWNrcwpAQCAtNzQsNiArNzYsOSBAQAogICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OwogICAgIHVpbnQzMl90IG1UcmFja01hc2s7ICAgICAgICAvLyBtYXNrIG9mIGFjdGl2ZSB0cmFja3MKICAgICBGYXN0VHJhY2tEdW1wICAgbVRyYWNrc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOworCisgICAgLy8gRm9yIHRpbWVzdGFtcCBzdGF0aXN0aWNzLgorICAgIFRpbWVzdGFtcFZlcmlmaWVyPGludDY0X3QgLyogZnJhbWUgY291bnQgKi8sIGludDY0X3QgLyogdGltZSBucyAqLz4gbVRpbWVzdGFtcFZlcmlmaWVyOwogfTsKIAogfSAgIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCmluZGV4IDM2ZDhlZWYuLmI5ODg0MmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcApAQCAtMzUsNyArMzUsNyBAQAogRmFzdE1peGVyU3RhdGU6OkZhc3RNaXhlclN0YXRlKCkgOiBGYXN0VGhyZWFkU3RhdGUoKSwKICAgICAvLyBtRmFzdFRyYWNrcwogICAgIG1GYXN0VHJhY2tzR2VuKDApLCBtVHJhY2tNYXNrKDApLCBtT3V0cHV0U2luayhOVUxMKSwgbU91dHB1dFNpbmtHZW4oMCksCi0gICAgbUZyYW1lQ291bnQoMCksIG1UZWVTaW5rKE5VTEwpCisgICAgbUZyYW1lQ291bnQoMCkKIHsKICAgICBpbnQgb2sgPSBwdGhyZWFkX29uY2UoJnNNYXhGYXN0VHJhY2tzT25jZSwgc01heEZhc3RUcmFja3NJbml0KTsKICAgICBpZiAob2sgIT0gMCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAppbmRleCAyYmUxZTkxLi4zOTZjNzk3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9NaXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KQEAgLTQ3LDYgKzQ4LDkgQEAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAgICBtQ2hhbm5lbE1hc2s7ICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX01PTk8gb3IgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAvLyB0cmFjayBmb3JtYXQKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtR2VuZXJhdGlvbjsgICAgIC8vIGluY3JlbWVudCB3aGVuIGFueSBmaWVsZCBpcyBhc3NpZ25lZAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsgLy8gaGFwdGljIHBsYXliYWNrIGlzIGVuYWJsZWQgb3Igbm90CisgICAgQXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90IG1IYXB0aWNJbnRlbnNpdHkgPSBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsgLy8gaW50ZW5zaXR5IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFwdGljIGRhdGEKIH07CiAKIC8vIFJlcHJlc2VudHMgYSBzaW5nbGUgc3RhdGUgb2YgdGhlIGZhc3QgbWl4ZXIKQEAgLTY5LDYgKzczLDkgQEAKICAgICBOQkFJT19TaW5rKiBtT3V0cHV0U2luazsgICAgLy8gSEFMIG91dHB1dCBkZXZpY2UsIG11c3QgYWxyZWFkeSBiZSBuZWdvdGlhdGVkCiAgICAgaW50ICAgICAgICAgbU91dHB1dFNpbmtHZW47IC8vIGluY3JlbWVudCB3aGVuIG1PdXRwdXRTaW5rIGlzIGFzc2lnbmVkCiAgICAgc2l6ZV90ICAgICAgbUZyYW1lQ291bnQ7ICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIGZhc3QgbWl4IGJ1ZmZlcgorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1TaW5rQ2hhbm5lbE1hc2s7IC8vIElmIG5vdCBBVURJT19DSEFOTkVMX05PTkUsIHNwZWNpZmllcyBzaW5rIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXNrIHdoZW4gaXQgY2Fubm90IGJlIGRpcmVjdGx5IGNhbGN1bGF0ZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwgY291bnQKIAogICAgIC8vIEV4dGVuZHMgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kCiAgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKQEAgLTc3LDkgKzg0LDYgQEAKICAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgLy8gd3JpdGUgdG8gb3V0cHV0IHNpbmsKICAgICAgICAgTUlYX1dSSVRFID0gMHgxODsgICAgICAgLy8gbWl4IHRyYWNrcyBhbmQgd3JpdGUgdG8gb3V0cHV0IHNpbmsKIAotICAgIC8vIFRoaXMgbWlnaHQgYmUgYSBvbmUtdGltZSBjb25maWd1cmF0aW9uIHJhdGhlciB0aGFuIHBlci1zdGF0ZQotICAgIE5CQUlPX1NpbmsqIG1UZWVTaW5rOyAgICAgICAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKXMgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luawotCiAgICAgLy8gbmV2ZXIgcmV0dXJucyBOVUxMOyBhc3NlcnRzIGlmIGNvbW1hbmQgaXMgaW52YWxpZAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb21tYW5kVG9TdHJpbmcoQ29tbWFuZCBjb21tYW5kKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCmluZGV4IGRjMTU0ODcuLjA0YjMyYzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CkBAIC02NSw4ICs2Niw2IEBACiAgICAgLyogbU1lYXN1cmVkV2FybXVwVHMoezAsIDB9KSwgKi8KICAgICBtV2FybXVwQ3ljbGVzKDApLAogICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXMoMCksCi0gICAgLy8gbUR1bW15TkJMb2dXcml0ZXIKLSAgICBtTkJMb2dXcml0ZXIoJm1EdW1teU5CTG9nV3JpdGVyKSwKICAgICBtVGltZXN0YW1wU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKSwKIAogICAgIG1Db21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksCkBAIC05Myw3ICs5Miw3IEBACiB7CiAgICAgLy8gTE9HVCBub3cgd29ya3MgZXZlbiBpZiB0bE5CTG9nV3JpdGVyIGlzIG51bGxwdHIsIGJ1dCB3ZSdyZSBjb25zaWRlcmluZyBjaGFuZ2luZyB0aGF0LAogICAgIC8vIHNvIHRoaXMgaW5pdGlhbGl6YXRpb24gcGVybWl0cyBhIGZ1dHVyZSBjaGFuZ2UgdG8gcmVtb3ZlIHRoZSBjaGVjayBmb3IgbnVsbHB0ci4KLSAgICB0bE5CTG9nV3JpdGVyID0gJm1EdW1teU5CTG9nV3JpdGVyOworICAgIHRsTkJMb2dXcml0ZXIgPSBtRHVtbXlOQkxvZ1dyaXRlci5nZXQoKTsKICAgICBmb3IgKDs7KSB7CiAKICAgICAgICAgLy8gZWl0aGVyIG5hbm9zbGVlcCwgc2NoZWRfeWllbGQsIG9yIGJ1c3kgd2FpdApAQCAtMTIzLDkgKzEyMiw5IEBACiAKICAgICAgICAgICAgIC8vIEFzIHNvb24gYXMgcG9zc2libGUgb2YgbGVhcm5pbmcgb2YgYSBuZXcgZHVtcCBhcmVhLCBzdGFydCB1c2luZyBpdAogICAgICAgICAgICAgbUR1bXBTdGF0ZSA9IG5leHQtPm1EdW1wU3RhdGUgIT0gTlVMTCA/IG5leHQtPm1EdW1wU3RhdGUgOiBtRHVtbXlEdW1wU3RhdGU7Ci0gICAgICAgICAgICBtTkJMb2dXcml0ZXIgPSBuZXh0LT5tTkJMb2dXcml0ZXIgIT0gTlVMTCA/IG5leHQtPm1OQkxvZ1dyaXRlciA6ICZtRHVtbXlOQkxvZ1dyaXRlcjsKLSAgICAgICAgICAgIHNldE5CTG9nV3JpdGVyKG1OQkxvZ1dyaXRlcik7ICAgLy8gRmFzdE1peGVyIGluZm9ybXMgaXRzIEF1ZGlvTWl4ZXIsIEZhc3RDYXB0dXJlIGlnbm9yZXMKLSAgICAgICAgICAgIHRsTkJMb2dXcml0ZXIgPSBtTkJMb2dXcml0ZXI7CisgICAgICAgICAgICB0bE5CTG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICBuZXh0LT5tTkJMb2dXcml0ZXIgOiBtRHVtbXlOQkxvZ1dyaXRlci5nZXQoKTsKKyAgICAgICAgICAgIHNldE5CTG9nV3JpdGVyKHRsTkJMb2dXcml0ZXIpOyAvLyBGYXN0TWl4ZXIgaW5mb3JtcyBpdHMgQXVkaW9NaXhlciwgRmFzdENhcHR1cmUgaWdub3JlcwogCiAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGFsd2F5cyBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyAobm9uLWlkbGUpIHN0YXRlLgogICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHN0YXRlIHF1ZXVlIG9ubHkgZ3VhcmFudGVlcyBhY2Nlc3MgdG8gY3VycmVudCBhbmQgcHJldmlvdXMgc3RhdGVzLgpAQCAtMjYwLDYgKzI1OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXYXJtID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1NZWFzdXJlZFdhcm11cFRzID0gbU1lYXN1cmVkV2FybXVwVHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gbVdhcm11cEN5Y2xlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtZWFzdXJlZFdhcm11cE1zID0gKG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyAqIDFlMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAqIDFlLTYpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HX1dBUk1VUF9USU1FKG1lYXN1cmVkV2FybXVwTXMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1TbGVlcE5zID0gLTE7CkBAIC0yNzAsNiArMjcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmRlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19VTkRFUlJVTihhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZuZXdUcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgbU92ZXJydW5OcykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JZ25vcmVOZXh0T3ZlcnJ1bikgewpAQCAtMjc5LDYgKzI4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1PdmVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19PVkVSUlVOKGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJm5ld1RzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCkBAIC0zMzksNiArMzQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3RvcmVzICMxLCAjMiwgIzMgYXJlIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsCiAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHdpdGggcmVzcGVjdCB0byBzdG9yZSAjNCBiZWxvdwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKKyAgICAgICAgICAgICAgICAgICAgTE9HX1dPUktfVElNRShtb25vdG9uaWNOcyk7CiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1Mb2FkTnNbaV0gPSBsb2FkTnM7CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1DcHVrSHpbaV0gPSBrSHo7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaAppbmRleCAyYTcxNDE0Li4zZjZiMjA2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKQEAgLTc4LDEyICs3OCwxMSBAQAogICAgIHVuc2lnbmVkICAgICAgICBtQ29sZEdlbjsgICAgICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgogICAgIGJvb2wgICAgICAgICAgICBtSXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBtZWFucyB3YWl0IGZvciB3YXJtdXAgYmVmb3JlIG1peGluZwotICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKLSAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIGR1cmluZyB3YXJtdXAgcGhhc2UKLSAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlczsgICAgLy8gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiByYW5nZQotICAgIE5CTG9nOjpXcml0ZXIgICBtRHVtbXlOQkxvZ1dyaXRlcjsKLSAgICBOQkxvZzo6V3JpdGVyKiAgbU5CTG9nV3JpdGVyOyAgIC8vIGFsd2F5cyBub24tbnVsbHB0cjogcmVhbCBOQkxvZzo6V3JpdGVyKiBvciAmbUR1bW15TkJMb2dXcml0ZXIKLSAgICBzdGF0dXNfdCAgICAgICAgbVRpbWVzdGFtcFN0YXR1czsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKKyAgICB1aW50MzJfdCAgICAgICAgICBtV2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgZHVyaW5nIHdhcm11cCBwaGFzZQorICAgIHVpbnQzMl90ICAgICAgICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXM7ICAgIC8vIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gcmFuZ2UKKyAgICBjb25zdCBzcDxOQkxvZzo6V3JpdGVyPiBtRHVtbXlOQkxvZ1dyaXRlcntuZXcgTkJMb2c6OldyaXRlcigpfTsKKyAgICBzdGF0dXNfdCAgICAgICAgICBtVGltZXN0YW1wU3RhdHVzOwogCiAgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIG1Db21tYW5kOwogICAgIGJvb2wgICAgICAgICAgICBtQXR0ZW1wdGVkV3JpdGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCA2ZjU0NmMzLi45NjhkNWFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKQEAgLTM5LDggKzQwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbik7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICAgICBzdGF0aWMgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IE1NYXBUaHJlYWQ6Om1Mb2NrCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDgzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmNwcApAQCAtMCwwICsxLDUxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJBSU9fVGVlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmdXR1cmU+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgorCisvLyBFbmFibGVkIHdpdGggVEVFX1NJTksgaW4gQ29uZmlndXJhdGlvbi5oCisjaWZkZWYgVEVFX1NJTksKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorIFRlZSBmaWxlbmFtZXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CisKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9DX3JlYXNvbi53YXYiIFJlY29yZFRocmVhZAorICJhZnRlZV9EYXRlX1RocmVhZElkX01fcmVhc29uLndhdiIgTWl4ZXJUaHJlYWQgKE5vcm1hbCkKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9GX3JlYXNvbi53YXYiIE1peGVyVGhyZWFkIChGYXN0KQorICJhZnRlZV9EYXRlX1RocmVhZElkX1RyYWNrSWRfUl9yZWFzb24ud2F2IiBSZWNvcmRUcmFjaworICJhZnRlZV9EYXRlX1RocmVhZElkX1RyYWNrSWRfVHJhY2tOYW1lX1RfcmVhc29uLndhdiIgUGxheWJhY2tUcmFjaworCisgd2hlcmUgRGF0ZSA9IFlZWVltbWRkX0hITU1TU19NU0VDCisKKyB3aGVyZSBSZWFzb24gPSBbIERUT1IgfCBEVU1QIHwgUkVNT1ZFIF0KKworIEV4YW1wbGVzOgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MTFfMDM4XzEzXzU3XzJfVF9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgxMV8yMThfMTNfNTdfMl9UX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODExXzM3OF8xM181N18yX1RfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MjVfMTQ3XzYyX0NfRFVNUC53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODI1XzE0OF82Ml81OV9SX0RVTVAud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgyNV8xNDlfMTNfRl9EVU1QLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4NDJfMTI1XzYyXzU5X1JfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4NDJfMTY4XzYyX0NfRFRPUi53YXYKKyovCisKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBERUZBVUxUX1BSRUZJWFtdID0gImFmdGVlXyI7CitzdGF0aWMgY29uc3RleHByIGNoYXIgREVGQVVMVF9ESVJFQ1RPUllbXSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyIjsKK3N0YXRpYyBjb25zdGV4cHIgc2l6ZV90IERFRkFVTFRfVEhSRUFEUE9PTF9TSVpFID0gODsKKworLyoqIEF1ZGlvRmlsZUhhbmRsZXIgbWFuYWdlcyB0ZW1wb3JhcnkgYXVkaW8gd2F2IGZpbGVzIHdpdGggYSBsZWFzdCByZWNlbnRseSBjcmVhdGVkCisgICAgcmV0ZW50aW9uIHBvbGljeS4KKworICAgIFRoZSB0ZW1wb3JhcnkgZmlsZW5hbWVzIGFyZSBzeXN0ZW1hdGljYWxseSBnZW5lcmF0ZWQuIEEgY29tbW9uIGZpbGVuYW1lIHByZWZpeCwKKyAgICBzdG9yYWdlIGRpcmVjdG9yeSwgYW5kIGNvbmN1cnJlbmN5IHBvb2wgYXJlIHBhc3NlZCBpbiBvbiBjcmVhdGluZyB0aGUgb2JqZWN0LgorCisgICAgVGVtcG9yYXJ5IGZpbGVzIGFyZSBjcmVhdGVkIGJ5ICJjcmVhdGUiLCB3aGljaCByZXR1cm5zIGEgZmlsZW5hbWUgZ2VuZXJhdGVkIGJ5CisKKyAgICBwcmVmaXggKyAxNCBjaGFyIGRhdGUgKyBzdWZmaXgKKworICAgIFRPRE8gTW92ZSB0byBhdWRpb191dGlscy4KKyAgICBUT0RPIEF2b2lkIHBvaW50aW5nIHR3byBBdWRpb0ZpbGVIYW5kbGVycyB0byB0aGUgc2FtZSBkaXJlY3RvcnkgYW5kIHByZWZpeAorICAgIGFzIHdlIGRvbid0IGhhdmUgYSBwcmVmaXggc3BlY2lmaWMgbG9jayBmaWxlLiAqLworCitjbGFzcyBBdWRpb0ZpbGVIYW5kbGVyIHsKK3B1YmxpYzoKKworICAgIEF1ZGlvRmlsZUhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnByZWZpeCwgY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSwgc2l6ZV90IHBvb2wpCisgICAgICAgIDogbVRocmVhZFBvb2wocG9vbCkKKyAgICAgICAgLCBtUHJlZml4KHByZWZpeCkKKyAgICB7CisgICAgICAgICh2b2lkKXNldERpcmVjdG9yeShkaXJlY3RvcnkpOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIGZpbGVuYW1lIG9mIGNyZWF0ZWQgYXVkaW8gZmlsZSwgZWxzZSBlbXB0eSBzdHJpbmcgb24gZmFpbHVyZS4gKi8KKyAgICBzdGQ6OnN0cmluZyBjcmVhdGUoCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCk7CisKK3ByaXZhdGU6CisgICAgLyoqIHNldHMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiB0aGlzIGlzIGN1cnJlbnRseSBwcml2YXRlIHRvIGF2b2lkIGNvbmZ1c2lvbgorICAgICAgICB3aGVuIGNoYW5naW5nIHdoaWxlIHBlbmRpbmcgb3BlcmF0aW9ucyBhcmUgb2NjdXJyaW5nIChpdCdzIG9rYXksIGJ1dAorICAgICAgICB3ZWFrbHkgc3luY2hyb25pemVkKS4gKi8KKyAgICBzdGF0dXNfdCBzZXREaXJlY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSk7CisKKyAgICAvKiogY2xlYW5zIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBkaXJlY3RvcnkgbmFtZSBkb25lLiAqLworICAgIHN0YXR1c190IGNsZWFuKHN0ZDo6c3RyaW5nICpkaXIgPSBudWxscHRyKTsKKworICAgIC8qKiBjcmVhdGVzIGFuIGF1ZGlvIGZpbGUgZnJvbSBhIHJlYWRlciBmdW5jdG9yIHBhc3NlZCBpbi4gKi8KKyAgICBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbCgKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpOworCisgICAgc3RhdGljIGJvb2wgaXNEaXJlY3RvcnlWYWxpZChjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5KSB7CisgICAgICAgIHJldHVybiBkaXJlY3Rvcnkuc2l6ZSgpID4gMCAmJiBkaXJlY3RvcnlbMF0gPT0gJy8nOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlRmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCkgY29uc3QgeworICAgICAgICBjaGFyIGZpbGVUaW1lW3NpemVvZigiWVlZWW1tZGRfSEhNTVNTX1wwIildOworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgICAgICAgIHN0cnVjdCB0bSB0bTsKKyAgICAgICAgbG9jYWx0aW1lX3IoJnR2LnR2X3NlYywgJnRtKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJmdGltZShmaWxlVGltZSwgc2l6ZW9mKGZpbGVUaW1lKSwgIiVZJW0lZF8lSCVNJVNfIiwgJnRtKSA9PSAwLAorICAgICAgICAgICAgImluY29ycmVjdCBmaWxlVGltZSBidWZmZXIiKTsKKyAgICAgICAgY2hhciBtc2VjWzRdOworICAgICAgICAodm9pZClzbnByaW50Zihtc2VjLCBzaXplb2YobXNlYyksICIlMDNkIiwgKGludCkodHYudHZfdXNlYyAvIDEwMDApKTsKKyAgICAgICAgcmV0dXJuIG1QcmVmaXggKyBmaWxlVGltZSArIG1zZWMgKyBzdWZmaXggKyAiLndhdiI7CisgICAgfQorCisgICAgYm9vbCBpc01hbmFnZWRGaWxlbmFtZShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgICAgIGNvbnN0ZXhwciBzaXplX3QgRklMRU5BTUVfTEVOX0RBVEUgPSA0ICsgMiArIDIgLy8gJVklbSVkJQorICAgICAgICAgICAgKyAxICsgMiArIDIgKyAyIC8vIF9IJU0lUworICAgICAgICAgICAgKyAxICsgMzsgLy9fTVNFQworICAgICAgICBjb25zdCBzaXplX3QgcHJlZml4TGVuID0gbVByZWZpeC5zaXplKCk7CisgICAgICAgIGNvbnN0IHNpemVfdCBuYW1lTGVuID0gc3RybGVuKG5hbWUpOworCisgICAgICAgIC8vIHJlamVjdCBvbiBzaXplLCBwcmVmaXgsIGFuZCAud2F2CisgICAgICAgIGlmIChuYW1lTGVuIDwgcHJlZml4TGVuICsgRklMRU5BTUVfTEVOX0RBVEUgKyA0IC8qIC53YXYgKi8KKyAgICAgICAgICAgICB8fCBzdHJuY21wKG5hbWUsIG1QcmVmaXguY19zdHIoKSwgcHJlZml4TGVuKSAhPSAwCisgICAgICAgICAgICAgfHwgc3RyY21wKG5hbWUgKyBuYW1lTGVuIC0gNCwgIi53YXYiKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWxpZGF0ZSBkYXRlIHBvcnRpb24KKyAgICAgICAgY29uc3QgY2hhciAqZGF0ZSA9IG5hbWUgKyBwcmVmaXhMZW47CisgICAgICAgIHJldHVybiBzdGQ6OmFsbF9vZihkYXRlLCBkYXRlICsgOCwgaXNkaWdpdCkKKyAgICAgICAgICAgICYmIGRhdGVbOF0gPT0gJ18nCisgICAgICAgICAgICAmJiBzdGQ6OmFsbF9vZihkYXRlICsgOSwgZGF0ZSArIDE1LCBpc2RpZ2l0KQorICAgICAgICAgICAgJiYgZGF0ZVsxNV0gPT0gJ18nCisgICAgICAgICAgICAmJiBzdGQ6OmFsbF9vZihkYXRlICsgMTYsIGRhdGUgKyAxOSwgaXNkaWdpdCk7CisgICAgfQorCisgICAgLy8geWV0IGFub3RoZXIgVGhyZWFkUG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAgICBjbGFzcyBUaHJlYWRQb29sIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRocmVhZFBvb2woc2l6ZV90IHNpemUpCisgICAgICAgICAgICA6IG1UaHJlYWRQb29sU2l6ZShzaXplKQorICAgICAgICB7IH0KKworICAgICAgICAvKiogbGF1bmNoZXMgdGFzayAibmFtZSIgd2l0aCBhc3NvY2lhdGVkIGZ1bmN0aW9uICJmdW5jIi4KKyAgICAgICAgICAgIGlmIHRoZSB0aHJlYWRwb29sIGlzIGV4aGF1c3RlZCwgaXQgd2lsbCBsYXVuY2ggb24gY2FsbGluZyBmdW5jdGlvbiAqLworICAgICAgICBzdGF0dXNfdCBsYXVuY2goY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gZnVuYyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nLCBzdGQ6OmZ1dHVyZTxzdGF0dXNfdD4+PiBtRnV0dXJlczsgLy8gR1VBUkRFRF9CWShtTG9jaykKKworICAgICAgICBjb25zdCBzaXplX3QgbVRocmVhZFBvb2xTaXplOworICAgIH0gbVRocmVhZFBvb2w7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtUHJlZml4OworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpzdHJpbmcgbURpcmVjdG9yeTsgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgIHN0ZDo6ZGVxdWU8c3RkOjpzdHJpbmc+IG1GaWxlczsgLy8gR1VBUkRFRF9CWShtTG9jaykgIHNvcnRlZCBsaXN0IG9mIGZpbGVzIGJ5IGNyZWF0aW9uIHRpbWUKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IEZSQU1FU19QRVJfUkVBRCA9IDEwMjQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgTUFYX0ZJTEVTX1JFQUQgPSAxMDI0OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IE1BWF9GSUxFU19LRUVQID0gMzI7Cit9OworCisvKiBzdGF0aWMgKi8KK3ZvaWQgTkJBSU9fVGVlOjpOQkFJT19UZWVJbXBsOjpkdW1wVGVlKAorICAgICAgICBpbnQgZmQsIGNvbnN0IE5CQUlPX1NpbmtTb3VyY2UgJnNpbmtTb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpCit7CisgICAgLy8gU2luZ2xldG9uLiBDb25zdHJ1Y3RlZCB0aHJlYWQtc2FmZSBvbiBmaXJzdCBjYWxsLCBuZXZlciBkZXN0cm95ZWQuCisgICAgc3RhdGljIEF1ZGlvRmlsZUhhbmRsZXIgYXVkaW9GaWxlSGFuZGxlcigKKyAgICAgICAgICAgIERFRkFVTFRfUFJFRklYLCBERUZBVUxUX0RJUkVDVE9SWSwgREVGQVVMVF9USFJFQURQT09MX1NJWkUpOworCisgICAgYXV0byAmc291cmNlID0gc2lua1NvdXJjZS5zZWNvbmQ7CisgICAgaWYgKHNvdXJjZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gc291cmNlLT5mb3JtYXQoKTsKKyAgICBib29sIGZpcnN0UmVhZCA9IHRydWU7CisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBhdWRpb0ZpbGVIYW5kbGVyLmNyZWF0ZSgKKyAgICAgICAgICAgIC8vIHRoaXMgZnVuY3RvciBtdXN0IG5vdCBob2xkIHJlZmVyZW5jZXMgdG8gc3RhY2sKKyAgICAgICAgICAgIFtmaXJzdFJlYWQsIHNpbmtTb3VyY2VdICh2b2lkICpidWZmZXIsIHNpemVfdCBmcmFtZXMpIG11dGFibGUgeworICAgICAgICAgICAgICAgICAgICBhdXRvICZzb3VyY2UgPSBzaW5rU291cmNlLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBhY3R1YWxSZWFkID0gc291cmNlLT5yZWFkKGJ1ZmZlciwgZnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFJlYWQgPT0gKHNzaXplX3QpT1ZFUlJVTiAmJiBmaXJzdFJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2hlY2sgb25jZQorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUmVhZCA9IHNvdXJjZS0+cmVhZChidWZmZXIsIGZyYW1lcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmlyc3RSZWFkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWxSZWFkOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpLAorICAgICAgICAgICAgRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpLAorICAgICAgICAgICAgZm9ybWF0Lm1Gb3JtYXQsCisgICAgICAgICAgICBzdWZmaXgpOworCisgICAgaWYgKGZkID49IDAgJiYgZmlsZW5hbWUuc2l6ZSgpID4gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAidGVlIHdyb3RlIHRvICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICB9Cit9CisKKy8qIHN0YXRpYyAqLworTkJBSU9fVGVlOjpOQkFJT19UZWVJbXBsOjpOQkFJT19TaW5rU291cmNlIE5CQUlPX1RlZTo6TkJBSU9fVGVlSW1wbDo6bWFrZVNpbmtTb3VyY2UoCisgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LCBzaXplX3QgZnJhbWVzLCBib29sICplbmFibGVkKQoreworICAgIGlmIChGb3JtYXRfaXNWYWxpZChmb3JtYXQpICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0Lm1Gb3JtYXQpKSB7CisgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShmcmFtZXMsIGZvcm1hdCk7CisgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKKyAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OworICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygicGlwZSBmYWlsdXJlIHRvIG5lZ290aWF0ZTogJXpkIiwgaW5kZXgpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7CisgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICAgICAgQUxPR1coInBpcGVSZWFkZXIgZmFpbHVyZSB0byBuZWdvdGlhdGU6ICV6ZCIsIGluZGV4KTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5hYmxlZCAhPSBudWxscHRyKSAqZW5hYmxlZCA9IHRydWU7CisgICAgICAgIHJldHVybiB7cGlwZSwgcGlwZVJlYWRlcn07CisgICAgfQorZXhpdDoKKyAgICBpZiAoZW5hYmxlZCAhPSBudWxscHRyKSAqZW5hYmxlZCA9IGZhbHNlOworICAgIHJldHVybiB7bnVsbHB0ciwgbnVsbHB0cn07Cit9CisKK3N0ZDo6c3RyaW5nIEF1ZGlvRmlsZUhhbmRsZXI6OmNyZWF0ZSgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gZ2VuZXJhdGVGaWxlbmFtZShzdWZmaXgpOworCisgICAgaWYgKG1UaHJlYWRQb29sLmxhdW5jaChzdGQ6OnN0cmluZygiY3JlYXRlICIpICsgZmlsZW5hbWUsCisgICAgICAgICAgICBbPV0oKSB7IHJldHVybiBjcmVhdGVJbnRlcm5hbChyZWFkZXIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgZm9ybWF0LCBmaWxlbmFtZSk7IH0pCisgICAgICAgICAgICA9PSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmlsZW5hbWU7CisgICAgfQorICAgIHJldHVybiAiIjsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6c2V0RGlyZWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnkpCit7CisgICAgaWYgKCFpc0RpcmVjdG9yeVZhbGlkKGRpcmVjdG9yeSkpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBUT0RPOiBjb25zaWRlciB1c2luZyBzdGQ6OmZpbGVzeXN0ZW0gaW4gQysrMTcKKyAgICBESVIgKmRpciA9IG9wZW5kaXIoZGlyZWN0b3J5LmNfc3RyKCkpOworCisgICAgaWYgKGRpciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogY2Fubm90IG9wZW4gZGlyZWN0b3J5ICVzIiwgX19mdW5jX18sIGRpcmVjdG9yeS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgdG9SZW1vdmUgPSAwOworICAgIGRlY2x0eXBlKG1GaWxlcykgZmlsZXM7CisKKyAgICB3aGlsZSAoZmlsZXMuc2l6ZSgpIDwgTUFYX0ZJTEVTX1JFQUQpIHsKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBjb25zdCBzdHJ1Y3QgZGlyZW50ICpyZXN1bHQgPSByZWFkZGlyKGRpcik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1dfSUYoZXJybm8gIT0gMCwgIiVzOiByZWFkZGlyIGZhaWx1cmUgJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIGlzIGl0IGEgbWFuYWdlZCBmaWxlbmFtZT8KKyAgICAgICAgaWYgKCFpc01hbmFnZWRGaWxlbmFtZShyZXN1bHQtPmRfbmFtZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZpbGVzLmVtcGxhY2VfYmFjayhyZXN1bHQtPmRfbmFtZSk7CisgICAgfQorICAgICh2b2lkKWNsb3NlZGlyKGRpcik7CisKKyAgICAvLyBPUFRJTUlaQVRJT046IHdlIGRvbid0IG5lZWQgdG8gc3RhdCBlYWNoIGZpbGUsIHRoZSBmaWxlbmFtZXMgbmFtZXMgYXJlCisgICAgLy8gYWxyZWFkeSAocm91Z2hseSkgb3JkZXJlZCBieSBjcmVhdGlvbiBkYXRlLiAgd2UgdXNlIHN0ZDo6ZGVxdWUgaW5zdGVhZAorICAgIC8vIG9mIHN0ZDo6c2V0IGZvciBmYXN0ZXIgaW5zZXJ0aW9uIGFuZCBzb3J0aW5nIHRpbWVzLgorCisgICAgaWYgKGZpbGVzLnNpemUoKSA+IE1BWF9GSUxFU19LRUVQKSB7CisgICAgICAgIC8vIHJlbW92ZWQgZmlsZXMgY2FuIHVzZSBhIHBhcnRpdGlvbiAobm8gbmVlZCB0byBkbyBhIGZ1bGwgc29ydCkuCisgICAgICAgIHRvUmVtb3ZlID0gZmlsZXMuc2l6ZSgpIC0gTUFYX0ZJTEVTX0tFRVA7CisgICAgICAgIHN0ZDo6bnRoX2VsZW1lbnQoZmlsZXMuYmVnaW4oKSwgZmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlIC0gMSwgZmlsZXMuZW5kKCkpOworICAgIH0KKworICAgIC8vIGtlcHQgZmlsZXMgbXVzdCBiZSBzb3J0ZWQuCisgICAgc3RkOjpzb3J0KGZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSwgZmlsZXMuZW5kKCkpOworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworCisgICAgICAgIG1EaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisgICAgICAgIG1GaWxlcyA9IHN0ZDo6bW92ZShmaWxlcyk7CisgICAgfQorCisgICAgaWYgKHRvUmVtb3ZlID4gMCkgeyAvLyBsYXVuY2ggYSBjbGVhbiBpbiBiYWNrZ3JvdW5kLgorICAgICAgICAodm9pZCltVGhyZWFkUG9vbC5sYXVuY2goCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoImNsZWFuaW5nICIpICsgZGlyZWN0b3J5LCBbdGhpc10oKSB7IHJldHVybiBjbGVhbigpOyB9KTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpjbGVhbihzdGQ6OnN0cmluZyAqZGlyZWN0b3J5KQoreworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWxlc1RvUmVtb3ZlOworICAgIHN0ZDo6c3RyaW5nIGRpcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisKKyAgICAgICAgaWYgKCFpc0RpcmVjdG9yeVZhbGlkKG1EaXJlY3RvcnkpKSByZXR1cm4gTk9fSU5JVDsKKworICAgICAgICBkaXIgPSBtRGlyZWN0b3J5OworICAgICAgICBpZiAobUZpbGVzLnNpemUoKSA+IE1BWF9GSUxFU19LRUVQKSB7CisgICAgICAgICAgICBzaXplX3QgdG9SZW1vdmUgPSBtRmlsZXMuc2l6ZSgpIC0gTUFYX0ZJTEVTX0tFRVA7CisKKyAgICAgICAgICAgIC8vIHVzZSBtb3ZlIGFuZCBlcmFzZSB0byBlZmZpY2llbnRseSB0cmFuc2ZlciBzdGQ6OnN0cmluZworICAgICAgICAgICAgc3RkOjptb3ZlKG1GaWxlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBtRmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZmlsZXNUb1JlbW92ZSkpOworICAgICAgICAgICAgbUZpbGVzLmVyYXNlKG1GaWxlcy5iZWdpbigpLCBtRmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGRpcnAgPSBkaXIgKyAiLyI7CisgICAgLy8gcmVtb3ZlIGZpbGVzIG91dHNpZGUgb2YgbG9jayBmb3IgYmV0dGVyIGNvbmN1cnJlbmN5LgorICAgIGZvciAoY29uc3QgYXV0byAmZmlsZSA6IGZpbGVzVG9SZW1vdmUpIHsKKyAgICAgICAgKHZvaWQpdW5saW5rKChkaXJwICsgZmlsZSkuY19zdHIoKSk7CisgICAgfQorCisgICAgLy8gcmV0dXJuIHRoZSBkaXJlY3RvcnkgaWYgcmVxdWVzdGVkLgorICAgIGlmIChkaXJlY3RvcnkgIT0gbnVsbHB0cikgeworICAgICAgICAqZGlyZWN0b3J5ID0gZGlyOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OlRocmVhZFBvb2w6OmxhdW5jaCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gZnVuYykKK3sKKyAgICBpZiAobVRocmVhZFBvb2xTaXplID4gMSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICBpZiAobUZ1dHVyZXMuc2l6ZSgpID49IG1UaHJlYWRQb29sU2l6ZSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gbUZ1dHVyZXMuYmVnaW4oKTsgaXQgIT0gbUZ1dHVyZXMuZW5kKCk7KSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lID0gaXQtPmZpcnN0OworICAgICAgICAgICAgICAgIHN0ZDo6ZnV0dXJlPHN0YXR1c190PiAmZnV0dXJlID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICBpZiAoIWZ1dHVyZS52YWxpZCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMCkpID09IHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBmdXR1cmUgJXMgcmVhZHkiLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUZ1dHVyZXMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZnV0dXJlICVzIG5vdCByZWFkeSIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GdXR1cmVzLnNpemUoKSA8IG1UaHJlYWRQb29sU2l6ZSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBkZWZlcnJlZCBjYWxsaW5nICVzIiwgX19mdW5jX18sIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtRnV0dXJlcy5lbXBsYWNlX2JhY2sobmFtZSwgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIGZ1bmMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXM6IGltbWVkaWF0ZSBjYWxsaW5nICVzIiwgX19mdW5jX18sIG5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIGZ1bmMoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6Y3JlYXRlSW50ZXJuYWwoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKQoreworICAgIC8vIEF0dGVtcHQgdG8gY2hvb3NlIHRoZSBiZXN0IG1hdGNoaW5nIGZpbGUgZm9ybWF0LgorICAgIC8vIFdlIGNhbiBjaG9vc2UgYW55IHNmX2Zvcm1hdAorICAgIC8vIGJ1dCB3cml0ZUZvcm1hdCBtdXN0IGJlIG9uZSBvZiAxNiwgMzIsIGZsb2F0CisgICAgLy8gZHVlIHRvIHNmX3dyaXRlZiBjb21wYXRpYmlsaXR5LgorICAgIGludCBzZl9mb3JtYXQ7CisgICAgYXVkaW9fZm9ybWF0X3Qgd3JpdGVGb3JtYXQ7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgc2ZfZm9ybWF0ID0gU0ZfRk9STUFUX1BDTV8xNjsKKyAgICAgICAgd3JpdGVGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyB1c2luZyBQQ01fMTYgZm9yIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgZm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6CisgICAgICAgIHNmX2Zvcm1hdCA9IFNGX0ZPUk1BVF9QQ01fMzI7CisgICAgICAgIHdyaXRlRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ7CisgICAgICAgIEFMT0dWKCIlczogJXMgdXNpbmcgUENNXzMyIGZvciBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIGZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgc2ZfZm9ybWF0ID0gU0ZfRk9STUFUX0ZMT0FUOworICAgICAgICB3cml0ZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgIEFMT0dWKCIlczogJXMgdXNpbmcgUENNX0ZMT0FUIGZvciBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIGZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIFRPRE86CisgICAgICAgIC8vIGhhbmRsZSBhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcygpIGZvcm1hdHMuCisgICAgICAgIC8vIGhhbmRsZSBjb21wcmVzc2VkIGZvcm1hdHMgYXMgc2luZ2xlIGJ5dGUgZmlsZXMuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZGlyZWN0b3J5OworICAgIHN0YXR1c190IHN0YXR1cyA9IGNsZWFuKCZkaXJlY3RvcnkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgc3RkOjpzdHJpbmcgZGlyUHJlZml4ID0gZGlyZWN0b3J5ICsgIi8iOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9IGRpclByZWZpeCArIGZpbGVuYW1lOworCisgICAgLyogY29uc3QgKi8gU0ZfSU5GTyBpbmZvID0geworICAgICAgICAuZnJhbWVzID0gMCwKKyAgICAgICAgLnNhbXBsZXJhdGUgPSAoaW50KXNhbXBsZVJhdGUsCisgICAgICAgIC5jaGFubmVscyA9IChpbnQpY2hhbm5lbENvdW50LAorICAgICAgICAuZm9ybWF0ID0gU0ZfRk9STUFUX1dBViB8IHNmX2Zvcm1hdCwKKyAgICB9OworICAgIFNOREZJTEUgKnNmID0gc2Zfb3BlbihwYXRoLmNfc3RyKCksIFNGTV9XUklURSwgJmluZm8pOworICAgIGlmIChzZiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzaXplX3QgdG90YWwgPSAwOworICAgIHZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhGUkFNRVNfUEVSX1JFQUQgKiBzdGQ6Om1heCgKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUod3JpdGVGb3JtYXQpLCAvL291dHB1dCBmcmFtZXNpemUKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkpOyAvLyBpbnB1dCBmcmFtZXNpemUKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgc2ZfY2xvc2Uoc2YpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgY29uc3Qgc3NpemVfdCBhY3R1YWxSZWFkID0gcmVhZGVyKGJ1ZmZlciwgRlJBTUVTX1BFUl9SRUFEKTsKKyAgICAgICAgaWYgKGFjdHVhbFJlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IGlucHV0IGZvcm1hdCB0byB3cml0ZUZvcm1hdCBhcyBuZWVkZWQuCisgICAgICAgIGlmIChmb3JtYXQgIT0gd3JpdGVGb3JtYXQpIHsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgd3JpdGVGb3JtYXQsIGJ1ZmZlciwgZm9ybWF0LCBhY3R1YWxSZWFkICogaW5mby5jaGFubmVscyk7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IHJlYWxseVdyaXR0ZW47CisgICAgICAgIHN3aXRjaCAod3JpdGVGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJlYWxseVdyaXR0ZW4gPSBzZl93cml0ZWZfc2hvcnQoc2YsIChjb25zdCBpbnQxNl90ICopYnVmZmVyLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICAgICAgcmVhbGx5V3JpdHRlbiA9IHNmX3dyaXRlZl9pbnQoc2YsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZWFsbHlXcml0dGVuID0gc2Zfd3JpdGVmX2Zsb2F0KHNmLCAoY29uc3QgZmxvYXQgKilidWZmZXIsIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogJXMgd3JpdGVGb3JtYXQ6ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCB3cml0ZUZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWFsbHlXcml0dGVuIDwgMCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiAlcyB3cml0ZSBlcnJvcjogJXpkIiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIHJlYWxseVdyaXR0ZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdG90YWwgKz0gcmVhbGx5V3JpdHRlbjsKKyAgICAgICAgaWYgKHJlYWxseVdyaXR0ZW4gPCBhY3R1YWxSZWFkKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6ICVzIHdyaXRlIHNob3J0IGNvdW50OiAlemQgPCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIHJlYWxseVdyaXR0ZW4sIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc2ZfY2xvc2Uoc2YpOworICAgIGZyZWUoYnVmZmVyKTsKKyAgICBpZiAodG90YWwgPT0gMCkgeworICAgICAgICAodm9pZCl1bmxpbmsocGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICAvLyBTdWNjZXNzOiBhZGQgb3VyIG5hbWUgdG8gbWFuYWdlZCBmaWxlcy4KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgIC8vIHdlYWsgc3luY2hyb25pemF0aW9uIC0gb25seSB1cGRhdGUgbUZpbGVzIGlmIHRoZSBkaXJlY3RvcnkgaGFzbid0IGNoYW5nZWQuCisgICAgICAgIGlmIChtRGlyZWN0b3J5ID09IGRpcmVjdG9yeSkgeworICAgICAgICAgICAgbUZpbGVzLmVtcGxhY2VfYmFjayhmaWxlbmFtZSk7ICAvLyBhZGQgdG8gdGhlIGVuZCB0byBwcmVzZXJ2ZSBzb3J0LgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsgLy8gcmV0dXJuIGZ1bGwgcGF0aAorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBURUVfU0lOSwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDhjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBFbmFibGVkIHdpdGggVEVFX1NJTksgaW4gQ29uZmlndXJhdGlvbi5oCisjaWZuZGVmIEFORFJPSURfTkJBSU9fVEVFX0gKKyNkZWZpbmUgQU5EUk9JRF9OQkFJT19URUVfSAorCisjaWZkZWYgVEVFX1NJTksKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGUgTkJBSU9fVGVlIHVzZXMgdGhlIE5CQUlPIFBpcGUgYW5kIFBpcGVSZWFkZXIgZm9yIG5vbmJsb2NraW5nCisgKiBkYXRhIGNvbGxlY3Rpb24sIGZvciBldmVudHVhbCBkdW1wIHRvIGxvZyBmaWxlcy4KKyAqIFNlZSBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL2F1ZGlvL2RlYnVnZ2luZyBmb3IgaG93IHRvCisgKiBlbmFibGUgYnkgcm8uZGVidWdnYWJsZSBhbmQgYWYudGVlIHByb3BlcnRpZXMuCisgKgorICogVGhlIHdyaXRlKCkgaW50byB0aGUgTkJBSU9fVGVlIGlzIHRoZXJlZm9yZSBub25ibG9ja2luZywKKyAqIGJ1dCBjaGFuZ2luZyBOQkFJT19UZWUgZm9ybWF0cyB3aXRoIHNldCgpIGNhbm5vdCBiZSBkb25lIGR1cmluZyBhIHdyaXRlKCk7CisgKiB1c3VhbGx5IHRoZSBjYWxsZXIgYWxyZWFkeSBpbXBsZW1lbnRzIHRoaXMgbXV0dWFsIGV4Y2x1c2lvbi4KKyAqCisgKiBBbGwgb3RoZXIgY2FsbHMgZXhjZXB0IHNldCgpIHZzIHdyaXRlKCkgbWF5IG9jY3VyIGF0IGFueSB0aW1lLgorICoKKyAqIGR1bXAoKSBkaXNydXB0aW9uIGlzIG1pbmltaXplZCB0byB0aGUgY2FsbGVyIHNpbmNlIHN5c3RlbSBjYWxscyBhcmUgZXhlY3V0ZWQKKyAqIGluIGFuIGFzeW5jaHJvbm91cyB0aHJlYWQgKHdoZW4gcG9zc2libGUpLgorICoKKyAqIEN1cnJlbnRseSB0aGUgTkJBSU9fVGVlIGlzICJoYXJkd2lyZWQiIGZvciBBdWRpb0ZsaW5nZXIgc3VwcG9ydC4KKyAqCisgKiBTb21lIEF1ZGlvRmxpbmdlciBzcGVjaWZpYyBub3RlczoKKyAqCisgKiAxKSBUZWVzIGNhcHR1cmUgb25seSBsaW5lYXIgUENNIGRhdGEuCisgKiAyKSBUZWVzIHdpdGhvdXQgYW55IGRhdGEgd3JpdHRlbiBhcmUgY29uc2lkZXJlZCBlbXB0eSBhbmQgZG8gbm90IGdlbmVyYXRlCisgKiAgICBhbnkgb3V0cHV0IGZpbGVzLgorICogMikgT25jZSBhIFRlZSBkdW1wcyBkYXRhLCBpdCBpcyBjb25zaWRlcmVkICJlbXB0aWVkIiBhbmQgbmV3IGRhdGEKKyAqICAgIG5lZWRzIHRvIGJlIHdyaXR0ZW4gYmVmb3JlIGFub3RoZXIgVGVlIGZpbGUgaXMgZ2VuZXJhdGVkLgorICogMykgVGVlIGZpbGUgZm9ybWF0IGlzCisgKiAgICBXQVYgaW50ZWdlciBQQ00gMTYgYml0IGZvciBBVURJT19GT1JNQVRfUENNXzhfQklULCBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAqICAgIFdBViBpbnRlZ2VyIFBDTSAzMiBiaXQgZm9yIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQsIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQuCisgKiAgICBXQVYgZmxvYXQgUENNIDMyIGJpdCBmb3IgQVVESU9fRk9STUFUX1BDTV9GTE9BVC4KKyAqCisgKiBJbnB1dF9UaHJlYWQ6CisgKiAxKSBDYXB0dXJlIGJ1ZmZlciBpcyB0ZWVkIHdoZW4gcmVhZCBmcm9tIHRoZSBIQUwsIGJlZm9yZSByZXNhbXBsaW5nIGZvciB0aGUgQXVkaW9SZWNvcmQKKyAqICAgIGNsaWVudC4KKyAqCisgKiBPdXRwdXRfVGhyZWFkOgorICogMSkgTWl4ZXJUaHJlYWRzIHdpbGwgdGVlIGF0IHRoZSBGYXN0TWl4ZXIgb3V0cHV0IChpZiBpdCBoYXMgb25lKSBvciBhdCB0aGUKKyAqICAgIE5vcm1hbE1peGVyIG91dHB1dCAoaWYgbm8gRmFzdE1peGVyKS4KKyAqIDIpIER1cGxpY2F0aW5nVGhyZWFkcyBkbyBub3QgdGVlIGFueSBtaXhlZCBkYXRhLiBBcHBseSBhIHRlZSBvbiB0aGUgZG93bnN0cmVhbSBPdXRwdXRUcmFjaworICogICAgb3Igb24gdGhlIHVwc3RyZWFtIHBsYXliYWNrIFRyYWNrcy4KKyAqIDMpIERpcmVjdFRocmVhZHMgYW5kIE9mZmxvYWRUaHJlYWRzIGRvIG5vdCB0ZWUgYW55IGRhdGEuIFRoZSB1cHN0cmVhbSB0cmFjaworICogICAgKGlmIGxpbmVhciBQQ00gZm9ybWF0KSBtYXkgYmUgdGVlZCB0byBkaXNjb3ZlciBkYXRhLgorICogNCkgTW1hcFRocmVhZHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgKgorICogVHJhY2tzOgorICogMSkgUmVjb3JkVHJhY2tzIGFuZCBwbGF5YmFjayBUcmFja3MgdGVlIGFzIGRhdGEgaXMgYmVpbmcgd3JpdHRlbiB0byBvcgorICogICAgcmVhZCBmcm9tIHRoZSBzaGFyZWQgY2xpZW50LXNlcnZlciB0cmFjayBidWZmZXIgYnkgdGhlIGFzc29jaWF0ZWQgVGhyZWFkcy4KKyAqIDIpIFRoZSBtZWNoYW5pc20gaXMgb24gdGhlIEF1ZGlvQnVmZmVyUHJvdmlkZXIgcmVsZWFzZSgpIHNvIGxhcmdlIHN0YXRpYyBUcmFjaworICogICAgcGxheWJhY2sgbWF5IG5vdCBzaG93IGFueSBUZWUgZGF0YSBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyByZWxlYXNlZC4KKyAqIDMpIFdoZW4gYSB0cmFjayBiZWNvbWVzIGluYWN0aXZlLCB0aGUgVGhyZWFkIHdpbGwgdHJpZ2dlciBhIGR1bXAuCisgKi8KKworY2xhc3MgTkJBSU9fVGVlIHsKK3B1YmxpYzoKKyAgICAvKiBURUVfRkxBRyBpcyB1c2VkIGluIHNldCgpIGFuZCBtdXN0IG1hdGNoIHRoZSBmbGFncyBmb3IgdGhlIGFmLnRlZSBwcm9wZXJ0eQorICAgICAgIGdpdmVuIGluIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvYXVkaW8vZGVidWdnaW5nCisgICAgKi8KKyAgICBlbnVtIFRFRV9GTEFHIHsKKyAgICAgICAgVEVFX0ZMQUdfTk9ORSA9IDAsCisgICAgICAgIFRFRV9GTEFHX0lOUFVUX1RIUkVBRCA9ICgxIDw8IDApLCAgLy8gdHJlYXQgYXMgYSBUZWUgZm9yIGlucHV0IChDYXB0dXJlKSBUaHJlYWRzCisgICAgICAgIFRFRV9GTEFHX09VVFBVVF9USFJFQUQgPSAoMSA8PCAxKSwgLy8gdHJlYXQgYXMgYSBUZWUgZm9yIG91dHB1dCAoUGxheWJhY2spIFRocmVhZHMKKyAgICAgICAgVEVFX0ZMQUdfVFJBQ0sgPSAoMSA8PCAyKSwgICAgICAgICAvLyB0cmVhdCBhcyBhIFRlZSBmb3IgdHJhY2tzIChSZWNvcmQgYW5kIFBsYXliYWNrKQorICAgIH07CisKKyAgICBOQkFJT19UZWUoKQorICAgICAgICA6IG1UZWUoc3RkOjptYWtlX3NoYXJlZDxOQkFJT19UZWVJbXBsPigpKQorICAgIHsKKyAgICAgICAgZ2V0UnVubmluZ1RlZXMoKS5hZGQobVRlZSk7CisgICAgfQorCisgICAgfk5CQUlPX1RlZSgpIHsKKyAgICAgICAgZ2V0UnVubmluZ1RlZXMoKS5yZW1vdmUobVRlZSk7CisgICAgICAgIGR1bXAoLTEsICJfRFRPUiIpOyAvLyBsb2cgYW55IGRhdGEgcmVtYWluaW5nIGluIFRlZS4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgc2V0IGlzIHVzZWQgZm9yIGRlZmVycmVkIGNvbmZpZ3VyYXRpb24gb2YgVGVlLgorICAgICAqCisgICAgICogIE1heSBiZSBjYWxsZWQgYW55dGltZSBleGNlcHQgY29uY3VycmVudGx5IHdpdGggd3JpdGUoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmb3JtYXQgTkJBSU9fRm9ybWF0IHVzZWQgdG8gb3BlbiBOQkFJTyBwaXBlcworICAgICAqIFxwYXJhbSBmbGFncyAoaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9hdWRpby9kZWJ1Z2dpbmcpCisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfTk9ORSB0byBieXBhc3MgYWYudGVlIHByb3BlcnR5IGNoZWNrcyAoZGVmYXVsdCk7CisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfSU5QVVRfVEhSRUFEIHRvIGNoZWNrIGFmLnRlZSBpZiBpbnB1dCB0aHJlYWQgbG9nZ2luZyBzZXQ7CisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCB0byBjaGVjayBhZi50ZWUgaWYgb3V0cHV0IHRocmVhZCBsb2dnaW5nIHNldDsKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19UUkFDSyB0byBjaGVjayBhZi50ZWUgaWYgdHJhY2sgbG9nZ2luZyBzZXQuCisgICAgICogXHBhcmFtIGZyYW1lcyBudW1iZXIgb2YgZnJhbWVzIHRvIG9wZW4gdGhlIE5CQUlPIHBpcGUgKHNldCB0byAwIHRvIHVzZSBkZWZhdWx0KS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4KKyAgICAgKiAgICAgICAgIC0gTk9fRVJST1Igb24gc3VjY2VzcyAob3IgZm9ybWF0IHVuY2hhbmdlZCkKKyAgICAgKiAgICAgICAgIC0gQkFEX1ZBTFVFIGlmIGZvcm1hdCBvciBmbGFncyBpbnZhbGlkLgorICAgICAqICAgICAgICAgLSBQRVJNSVNTSU9OX0RFTklFRCBpZiBmbGFncyBub3QgYWxsb3dlZCBieSBhZi50ZWUKKyAgICAgKi8KKworICAgIHN0YXR1c190IHNldChjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwKKyAgICAgICAgICAgIFRFRV9GTEFHIGZsYWdzID0gVEVFX0ZMQUdfTk9ORSwgc2l6ZV90IGZyYW1lcyA9IDApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UZWUtPnNldChmb3JtYXQsIGZsYWdzLCBmcmFtZXMpOworICAgIH0KKworICAgIHN0YXR1c190IHNldCh1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIFRFRV9GTEFHIGZsYWdzID0gVEVFX0ZMQUdfTk9ORSwgc2l6ZV90IGZyYW1lcyA9IDApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UZWUtPnNldChGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgZm9ybWF0KSwgZmxhZ3MsIGZyYW1lcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIHdyaXRlIGRhdGEgdG8gdGhlIHRlZS4KKyAgICAgKgorICAgICAqIFRoaXMgY2FsbCBpcyBsb2NrIGZyZWUgKGFzIHNoYXJlZCBwb2ludGVyIGFuZCBOQkFJTyBpcyBsb2NrIGZyZWUpOworICAgICAqIG1heSBiZSBjYWxsZWQgc2ltdWx0YW5lb3VzIHRvIGFsbCBtZXRob2RzIGV4Y2VwdCBzZXQoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBidWZmZXIgdG8gd3JpdGUgdG8gcGlwZS4KKyAgICAgKiBccGFyYW0gZnJhbWVDb3VudCBpbiBmcmFtZXMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBmb3JtYXQgcGFzc2VkIHRvIHNldCgpCisgICAgICovCisKKyAgICB2b2lkIHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGZyYW1lQ291bnQpIGNvbnN0IHsKKyAgICAgICAgbVRlZS0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICB9CisKKyAgICAvKiogc2V0cyBUZWUgaWQgc3RyaW5nIHdoaWNoIGlkZW50aWZpZXMgdGhlIGdlbmVyYXRlZCBmaWxlIChzaG91bGQgYmUgdW5pcXVlKS4gKi8KKyAgICB2b2lkIHNldElkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3QgeworICAgICAgICBtVGVlLT5zZXRJZChpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIGR1bXAgdGhlIGF1ZGlvIGNvbnRlbnQgd3JpdHRlbiB0byB0aGUgVGVlLgorICAgICAqCisgICAgICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSBkdW1wZWQgZmlsZW5hbWUgZm9yIGxvZ2dpbmcsIHVzZSAtMSB0byBpZ25vcmUuCisgICAgICogXHBhcmFtIHJlYXNvbiBzdHJpbmcgc3VmZml4IHRvIGFwcGVuZCB0byB0aGUgZ2VuZXJhdGVkIGZpbGUuCisgICAgICovCisgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbiA9ICIiKSBjb25zdCB7CisgICAgICAgIG1UZWUtPmR1bXAoZmQsIHJlYXNvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIGR1bXAgYWxsIFRlZXMgY3VycmVudGx5IGFsaXZlLgorICAgICAqCisgICAgICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSBkdW1wZWQgZmlsZW5hbWUgZm9yIGxvZ2dpbmcsIHVzZSAtMSB0byBpZ25vcmUuCisgICAgICogXHBhcmFtIHJlYXNvbiBzdHJpbmcgc3VmZml4IHRvIGFwcGVuZCB0byB0aGUgZ2VuZXJhdGVkIGZpbGUuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZHVtcEFsbChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24gPSAiIikgeworICAgICAgICBnZXRSdW5uaW5nVGVlcygpLmR1bXAoZmQsIHJlYXNvbik7CisgICAgfQorCitwcml2YXRlOgorCisgICAgLyoqIFRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUZWUgLSB0aGUgbGlmZXRpbWUgaXMgdGhyb3VnaAorICAgICAgICBhIHNoYXJlZCBwb2ludGVyIHNvIGRlc3RydWN0aW9uIG9mIHRoZSBOQkFJT19UZWUgY29udGFpbmVyIG1heSBwcm9jZWVkCisgICAgICAgIGV2ZW4gdGhvdWdoIGR1bXBpbmcgaXMgb2NjdXJyaW5nLiAqLworICAgIGNsYXNzIE5CQUlPX1RlZUltcGwgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdHVzX3Qgc2V0KGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LCBURUVfRkxBRyBmbGFncywgc2l6ZV90IGZyYW1lcykgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCB0ZWVDb25maWcgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8uZGVidWdnYWJsZSIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgID8gcHJvcGVydHlfZ2V0X2ludDMyKCJhZi50ZWUiLCAwKSA6IDA7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoZSB0eXBlIG9mIFRlZQorICAgICAgICAgICAgY29uc3QgVEVFX0ZMQUcgdHlwZSA9IFRFRV9GTEFHKAorICAgICAgICAgICAgICAgICAgICBmbGFncyAmIChURUVfRkxBR19JTlBVVF9USFJFQUQgfCBURUVfRkxBR19PVVRQVVRfVEhSRUFEIHwgVEVFX0ZMQUdfVFJBQ0spKTsKKworICAgICAgICAgICAgLy8gcGFyYW1ldGVyIGZsYWdzIGNhbid0IHNlbGVjdCBtdWx0aXBsZSB0eXBlcy4KKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fcG9wY291bnQodHlwZSkgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdHlwZSBpcyBzZXQsIHdlIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBwZXJtaXR0ZWQgYnkgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgIGlmICh0eXBlICE9IDAgJiYgKHR5cGUgJiB0ZWVDb25maWcpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRldGVybWluZSBudW1iZXIgb2YgZnJhbWVzIGZvciBUZWUKKyAgICAgICAgICAgIGlmIChmcmFtZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIHZhcnlpbmcgZnJhbWUgY291bnQgYmFzZWQgb24gdHlwZS4KKyAgICAgICAgICAgICAgICBmcmFtZXMgPSBERUZBVUxUX1RFRV9GUkFNRVM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjaGVjayBtaW5pbXVtIG51bWJlciBvZiBmcmFtZXM/CisKKyAgICAgICAgICAgIC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIGZvcm1hdCBhbmQgZnJhbWVzIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgICAgIGlmIChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIG1Gb3JtYXQpICYmIGZyYW1lcyA9PSBtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGF1dG8gc2lua3NvdXJjZSA9IG1ha2VTaW5rU291cmNlKGZvcm1hdCwgZnJhbWVzLCAmZW5hYmxlZCk7CisKKyAgICAgICAgICAgIC8vIGVuYWJsZWQgaXMgc2V0IGlmIG1ha2VTaW5rU291cmNlIGlzIHN1Y2Nlc3NmdWwuCisgICAgICAgICAgICAvLyBOb3RlOiBhcyBtZW50aW9uZWQgaW4gTkJBSU9fVGVlOjpzZXQoKSwgZG9uJ3QgY2FsbCBzZXQoKSB3aGlsZSB3cml0ZSgpIGlzCisgICAgICAgICAgICAvLyBvbmdvaW5nLgorICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOworICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7IC8vIGNvdWxkIGdldCB0aGlzIGZyb20gdGhlIFNpbmsuCisgICAgICAgICAgICAgICAgbUZyYW1lcyA9IGZyYW1lczsKKyAgICAgICAgICAgICAgICBtU2lua1NvdXJjZSA9IHN0ZDo6bW92ZShzaW5rc291cmNlKTsKKyAgICAgICAgICAgICAgICBtRW5hYmxlZC5zdG9yZSh0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRJZChjb25zdCBzdGQ6OnN0cmluZyAmaWQpIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIHsKKyAgICAgICAgICAgIGlmICghbURhdGFSZWFkeS5leGNoYW5nZShmYWxzZSkpIHJldHVybjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeDsKKyAgICAgICAgICAgIE5CQUlPX1NpbmtTb3VyY2Ugc2lua1NvdXJjZTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgICAgIHN1ZmZpeCA9IG1JZCArIHJlYXNvbjsKKyAgICAgICAgICAgICAgICBzaW5rU291cmNlID0gbVNpbmtTb3VyY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkdW1wVGVlKGZkLCBzaW5rU291cmNlLCBzdWZmaXgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICBpZiAoIW1FbmFibGVkLmxvYWQoKSB8fCBmcmFtZUNvdW50ID09IDApIHJldHVybjsKKyAgICAgICAgICAgICh2b2lkKW1TaW5rU291cmNlLmZpcnN0LT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgbURhdGFSZWFkeS5zdG9yZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gVFJJQ0tZOiBXZSBuZWVkIHRvIGtlZXAgdGhlIE5CQUlPX1NpbmsgYW5kIE5CQUlPX1NvdXJjZSBib3RoIGFsaXZlIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgLy8gYmVjYXVzZSBQaXBlUmVhZGVyIGhvbGRzIGEgbmFrZWQgcmVmZXJlbmNlIChub3QgYSBzdHJvbmcgb3Igd2VhayBwb2ludGVyKSB0byBQaXBlLgorICAgICAgICB1c2luZyBOQkFJT19TaW5rU291cmNlID0gc3RkOjpwYWlyPHNwPE5CQUlPX1Npbms+LCBzcDxOQkFJT19Tb3VyY2U+PjsKKworICAgICAgICBzdGF0aWMgdm9pZCBkdW1wVGVlKGludCBmZCwgY29uc3QgTkJBSU9fU2lua1NvdXJjZSYgc2lua1NvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCk7CisKKyAgICAgICAgc3RhdGljIE5CQUlPX1NpbmtTb3VyY2UgbWFrZVNpbmtTb3VyY2UoCisgICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsIHNpemVfdCBmcmFtZXMsIGJvb2wgKmVuYWJsZWQpOworCisgICAgICAgIC8vIDB4MjAwMDAwIHN0ZXJlbyAxNi1iaXQgUENNIGZyYW1lcyA9IDQ3LjUgc2Vjb25kcyBhdCA0NC4xIGtIeiwgOCBtZWdhYnl0ZXMKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgREVGQVVMVF9URUVfRlJBTUVTID0gMHgyMDAwMDA7CisKKyAgICAgICAgLy8gYXRvbWljIHN0YXR1cyBjaGVja2luZworICAgICAgICBzdGQ6OmF0b21pYzxib29sPiBtRW5hYmxlZHtmYWxzZX07CisgICAgICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1EYXRhUmVhZHl7ZmFsc2V9OworCisgICAgICAgIC8vIGxvY2tlZCBkdW1wIGluZm9ybWF0aW9uCisgICAgICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjpzdHJpbmcgbUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgVEVFX0ZMQUcgbUZsYWdzID0gVEVFX0ZMQUdfTk9ORTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgTkJBSU9fRm9ybWF0IG1Gb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgc2l6ZV90IG1GcmFtZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgTkJBSU9fU2lua1NvdXJjZSBtU2lua1NvdXJjZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICB9OworCisgICAgLyoqIFJ1bm5pbmdUZWVzIHRyYWNrcyBjdXJyZW50IHJ1bm5pbmcgdGVlcyBmb3IgZHVtcCBwdXJwb3Nlcy4KKyAgICAgICAgSXQgaXMgaW1wbGVtZW50ZWQgdG8gaGF2ZSBtaW5pbWFsIGxvY2tlZCByZWdpb25zLCB0byBiZSB0cmFuc3BhcmVudCB0byB0aGUgY2FsbGVyLiAqLworICAgIGNsYXNzIFJ1bm5pbmdUZWVzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgYWRkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPiAmdGVlKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgQUxPR1dfSUYoIW1UZWVzLmVtcGxhY2UodGVlKS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICIlczogJXAgYWxyZWFkeSBleGlzdHMgaW4gbVRlZXMiLCBfX2Z1bmNfXywgdGVlLmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVtb3ZlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPiAmdGVlKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgQUxPR1dfSUYobVRlZXMuZXJhc2UodGVlKSAhPSAxLAorICAgICAgICAgICAgICAgICAgICAiJXM6ICVwIGRvZXNuJ3QgZXhpc3QgaW4gbVRlZXMiLCBfX2Z1bmNfXywgdGVlLmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPj4gdGVlczsgLy8gc2FmZSBzbmFwc2hvdCBvZiB0ZWVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICB0ZWVzLmluc2VydCh0ZWVzLmVuZCgpLCBtVGVlcy5iZWdpbigpLCBtVGVlcy5lbmQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRlZSA6IHRlZXMpIHsKKyAgICAgICAgICAgICAgICB0ZWUtPmR1bXAoZmQsIHJlYXNvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPj4gbVRlZXM7IC8vIEdVQVJERURfQlkobUxvY2spCisgICAgfTsKKworICAgIC8vIHNpbmdsZXRvbgorICAgIHN0YXRpYyBSdW5uaW5nVGVlcyAmZ2V0UnVubmluZ1RlZXMoKSB7CisgICAgICAgIHN0YXRpYyBSdW5uaW5nVGVlcyBydW5uaW5nVGVlczsKKyAgICAgICAgcmV0dXJuIHJ1bm5pbmdUZWVzOworICAgIH0KKworICAgIC8vIFRoZSBOQkFJTyBUZWVJbXBsIG1heSBoYXZlIGxpZmV0aW1lIGxvbmdlciB0aGFuIE5CQUlPX1RlZSBpZgorICAgIC8vIFJ1bm5pbmdUZWVzOjpkdW1wKCkgaXMgYmVpbmcgY2FsbGVkIHNpbXVsdGFuZW91cyB0byB+TkJBSU9fVGVlKCkuCisgICAgLy8gVGhpcyBpcyBhbGxvd2VkIGZvciBtYXhpbXVtIGNvbmN1cnJlbmN5LgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPiBtVGVlOworfTsgLy8gTkJBSU9fVGVlCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFRFRV9TSU5LCisjZW5kaWYgLy8gIUFORFJPSURfTkJBSU9fVEVFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAppbmRleCBlNWNiOGEyLi5hMjEwYTZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCkBAIC0yNCw4ICsyNCw5IEBACiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNDksMTExICs1MCw3NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmxpc3RBdWRpb1BvcnRzKG51bV9wb3J0cywgcG9ydHMpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwubGlzdEF1ZGlvUG9ydHMobnVtX3BvcnRzLCBwb3J0cyk7CiB9CiAKIC8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+Z2V0QXVkaW9Qb3J0KHBvcnQpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwuZ2V0QXVkaW9Qb3J0KHBvcnQpOwogfQogCi0KIC8qIENvbm5lY3QgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7CiB9CiAKIC8qIERpc2Nvbm5lY3QgYSBwYXRjaCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOwogfQogCi0KIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGV5IGF0dHJpYnV0ZXMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+bGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcyk7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g6OmdldExhdGVuY3lNc19sKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8mIGl0ZXIgPSBtUGF0Y2hQYW5lbC5tUGF0Y2hlcy5maW5kKG1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGl0ZXIgIT0gbVBhdGNoUGFuZWwubVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZC5nZXRMYXRlbmN5TXMobGF0ZW5jeU1zKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLwotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotCi1BdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoUGFuZWwoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKQotewotfQotCi1BdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6On5QYXRjaFBhbmVsKCkKLXsKIH0KIAogLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyBfX3VudXNlZCkKIHsKLSAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMiKTsKKyAgICBBTE9HVihfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImdldEF1ZGlvUG9ydCIpOworICAgIEFMT0dWKF9fZnVuY19fKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQogLyogQ29ubmVjdCBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQogewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMIHx8IHBhdGNoID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQgaGFuZGxlICVkIiwKLSAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MsICpoYW5kbGUpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9CisgICAgQUxPR1YoIiVzKCkgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIGhhbmRsZSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzLCAqaGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKIAotICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKLSAgICAgICAgICAgIChwYXRjaC0+bnVtX3NpbmtzID09IDAgJiYgcGF0Y2gtPm51bV9zb3VyY2VzICE9IDIpIHx8Ci0gICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgaWYgKCFhdWRpb19wYXRjaF9pc192YWxpZChwYXRjaCkgfHwgKHBhdGNoLT5udW1fc2lua3MgPT0gMCAmJiBwYXRjaC0+bnVtX3NvdXJjZXMgIT0gMikpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gbGltaXQgbnVtYmVyIG9mIHNvdXJjZXMgdG8gMSBmb3Igbm93IG9yIDIgc291cmNlcyBmb3Igc3BlY2lhbCBjcm9zcyBodyBtb2R1bGUgY2FzZS4KQEAgLTE2Myw4MSArMTMwLDczIEBACiAgICAgfQogCiAgICAgaWYgKCpoYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyAqaGFuZGxlICE9IDAgJiYgaW5kZXggPCBtUGF0Y2hlcy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgICAgIGlmICgqaGFuZGxlID09IG1QYXRjaGVzW2luZGV4XS0+bUhhbmRsZSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcmVtb3ZpbmcgcGF0Y2ggaGFuZGxlICVkIiwgKmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gbVBhdGNoZXNbaW5kZXhdLT5tSGFsSGFuZGxlOwotICAgICAgICAgICAgICAgIFBhdGNoICpyZW1vdmVkUGF0Y2ggPSBtUGF0Y2hlc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgLy8gZnJlZSByZXNvdXJjZXMgb3duZWQgYnkgdGhlIHJlbW92ZWQgcGF0Y2ggaWYgYXBwbGljYWJsZQotICAgICAgICAgICAgICAgIC8vIDEpIGlmIGEgc29mdHdhcmUgcGF0Y2ggaXMgcHJlc2VudCwgcmVsZWFzZSB0aGUgcGxheWJhY2sgYW5kIGNhcHR1cmUgdGhyZWFkcyBhbmQKLSAgICAgICAgICAgICAgICAvLyB0cmFja3MgY3JlYXRlZC4gVGhpcyB3aWxsIGFsc28gcmVsZWFzZSB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBIQUwgcGF0Y2hlcwotICAgICAgICAgICAgICAgIGlmICgocmVtb3ZlZFBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWRQYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhyZW1vdmVkUGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyAyKSBpZiB0aGUgbmV3IHBhdGNoIGFuZCBvbGQgcGF0Y2ggc291cmNlIG9yIHNpbmsgYXJlIGRldmljZXMgZnJvbSBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAvLyBodyBtb2R1bGVzLCAgY2xlYXIgdGhlIGF1ZGlvIEhBTCBwYXRjaGVzIG5vdyBiZWNhdXNlIHRoZXkgd2lsbCBub3QgYmUgdXBkYXRlZAotICAgICAgICAgICAgICAgIC8vIGJ5IGNhbGwgdG8gY3JlYXRlX2F1ZGlvX3BhdGNoKCkgYmVsb3cgd2hpY2ggd2lsbCBoYXBwZW4gb24gYSBkaWZmZXJlbnQgSFcgbW9kdWxlCi0gICAgICAgICAgICAgICAgaWYgKGhhbEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaHdNb2R1bGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocGF0Y2gtPm51bV9zaW5rcyA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGF0Y2gtPnNpbmtzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIG9uIChwYXRjaC0+bnVtX3NpbmtzID09IDApOiB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbm90IGhhcHBlbiBhcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3BlY2lhbCBwYXRjaGVzIGFyZSBvbmx5IGNyZWF0ZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIGJ1dCBqdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlLCBzeXN0ZW1hdGljYWxseSBjbGVhciB0aGUgSEFMIHBhdGNoLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2gubnVtX3NpbmtzIGNhbm5vdCBiZSAwIGhlcmUgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFsSGFuZGxlIHdvdWxkIGJlIEFVRElPX1BBVENIX0hBTkRMRV9OT05FIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaHdNb2R1bGUgIT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShod01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCktPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbEhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBhdGNoZXMucmVtb3ZlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSByZW1vdmVkUGF0Y2g7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGF1dG8gaXRlciA9IG1QYXRjaGVzLmZpbmQoKmhhbmRsZSk7CisgICAgICAgIGlmIChpdGVyICE9IG1QYXRjaGVzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMoKSByZW1vdmluZyBwYXRjaCBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgKmhhbmRsZSk7CisgICAgICAgICAgICBQYXRjaCAmcmVtb3ZlZFBhdGNoID0gaXRlci0+c2Vjb25kOworICAgICAgICAgICAgLy8gZnJlZSByZXNvdXJjZXMgb3duZWQgYnkgdGhlIHJlbW92ZWQgcGF0Y2ggaWYgYXBwbGljYWJsZQorICAgICAgICAgICAgLy8gMSkgaWYgYSBzb2Z0d2FyZSBwYXRjaCBpcyBwcmVzZW50LCByZWxlYXNlIHRoZSBwbGF5YmFjayBhbmQgY2FwdHVyZSB0aHJlYWRzIGFuZAorICAgICAgICAgICAgLy8gdHJhY2tzIGNyZWF0ZWQuIFRoaXMgd2lsbCBhbHNvIHJlbGVhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW8gSEFMIHBhdGNoZXMKKyAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2guaXNTb2Z0d2FyZSgpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLmNsZWFyQ29ubmVjdGlvbnModGhpcyk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAyKSBpZiB0aGUgbmV3IHBhdGNoIGFuZCBvbGQgcGF0Y2ggc291cmNlIG9yIHNpbmsgYXJlIGRldmljZXMgZnJvbSBkaWZmZXJlbnQKKyAgICAgICAgICAgIC8vIGh3IG1vZHVsZXMsICBjbGVhciB0aGUgYXVkaW8gSEFMIHBhdGNoZXMgbm93IGJlY2F1c2UgdGhleSB3aWxsIG5vdCBiZSB1cGRhdGVkCisgICAgICAgICAgICAvLyBieSBjYWxsIHRvIGNyZWF0ZV9hdWRpb19wYXRjaCgpIGJlbG93IHdoaWNoIHdpbGwgaGFwcGVuIG9uIGEgZGlmZmVyZW50IEhXIG1vZHVsZQorICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGh3TW9kdWxlID0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmb2xkUGF0Y2ggPSByZW1vdmVkUGF0Y2gubUF1ZGlvUGF0Y2g7CisgICAgICAgICAgICAgICAgaWYgKG9sZFBhdGNoLnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gb2xkUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFBhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSBvbiAocGF0Y2gtPm51bV9zaW5rcyA9PSAwKTogdGhpcyBzaXR1YXRpb24gc2hvdWxkIG5vdCBoYXBwZW4gYXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3BlY2lhbCBwYXRjaGVzIGFyZSBvbmx5IGNyZWF0ZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIGJ1dCBqdXN0CisgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UsIHN5c3RlbWF0aWNhbGx5IGNsZWFyIHRoZSBIQUwgcGF0Y2guCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCByZW1vdmVkUGF0Y2gubUF1ZGlvUGF0Y2gubnVtX3NpbmtzIGNhbm5vdCBiZSAwIGhlcmUgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSB3b3VsZCBiZSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gb2xkUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBmaW5kSHdEZXZpY2VCeU1vZHVsZShod01vZHVsZSk7CisgICAgICAgICAgICAgICAgaWYgKGh3RGV2aWNlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGF0Y2hlcy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgIHJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKCpoYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgUGF0Y2ggKm5ld1BhdGNoID0gbmV3IFBhdGNoKHBhdGNoKTsKKyAgICBQYXRjaCBuZXdQYXRjaHsqcGF0Y2h9OworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBpbnNlcnRlZE1vZHVsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKIAogICAgIHN3aXRjaCAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSkgewogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6IHsKICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKCFhdWRpb0h3RGV2aWNlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBvbmx5IG9uZSBzaW5rIGlmIGNvbm5lY3Rpb24gdG8gYSBtaXggb3IgYWNyb3NzIEhXIG1vZHVsZXMKICAgICAgICAgICAgICAgICBpZiAoKHBhdGNoLT5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5leHQubWl4Lmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID4gMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBtdWx0aXBsZSBzaW5rcyBmb3IgbWl4IG9yIGFjcm9zcyBtb2R1bGVzIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIHJlamVjdCBjb25uZWN0aW9uIHRvIGRpZmZlcmVudCBzaW5rIHR5cGVzCiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IHBhdGNoLT5zaW5rc1swXS50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgZGlmZmVyZW50IHNpbmsgdHlwZXMgaW4gc2FtZSBwYXRjaCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGRpZmZlcmVudCBzaW5rIHR5cGVzIGluIHNhbWUgcGF0Y2ggbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjUyLDQyICsyMTEsNTYgQEAKICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmCiAgICAgICAgICAgICAgICAgICgocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgfHwKICAgICAgICAgICAgICAgICAgICFhdWRpb0h3RGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpKSkpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlID0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG91dHB1dERldmljZUFkZHJlc3MgPSBTdHJpbmc4KHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMikgewogICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5udW1fc2lua3MgIT0gMCAmJiBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXguaHdfbW9kdWxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNvdXJjZSBjb21iaW5hdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgaW52YWxpZCBzb3VyY2UgY29tYmluYXRpb24iLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5oYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID0gKE1peGVyVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXIuY2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGNhbm5vdCBnZXQgcGxheWJhY2sgdGhyZWFkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBjYW5ub3QgZ2V0IHBsYXliYWNrIHRocmVhZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBpcyByZXVzZWQsIHNvIGl0IGlzIG5vdCBjbG9zZWQgd2hlbiBwYXRjaCBpcyBjbGVhcmVkCisgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm1QbGF5YmFjay5zZXRUaHJlYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQbGF5YmFja1RocmVhZCo+KHRocmVhZC5nZXQoKSksIGZhbHNlIC8qY2xvc2VUaHJlYWQqLyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+b3Blbk91dHB1dF9sKAorICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gcGF0Y2gtPnNpbmtzWzBdLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBwYXRjaC0+c2lua3NbMF0uY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBwYXRjaC0+c2lua3NbMF0uZm9ybWF0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBwYXRjaC0+c2lua3NbMF0uZmxhZ3Mub3V0cHV0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIub3Blbk91dHB1dF9sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhdWRpb2ZsaW5nZXItPm9wZW5PdXRwdXRfbCgpIHJldHVybmVkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQuZ2V0KCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigibUF1ZGlvRmxpbmdlci5vcGVuT3V0cHV0X2woKSByZXR1cm5lZCAlcCIsIHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm1QbGF5YmFjay5zZXRUaHJlYWQocmVpbnRlcnByZXRfY2FzdDxQbGF5YmFja1RocmVhZCo+KHRocmVhZC5nZXQoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlOwogICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKQEAgLTI5Nyw1MiArMjcwLDY3IEBACiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBuZXdQYXRjaC5tUGxheWJhY2sudGhyZWFkKCktPnNhbXBsZVJhdGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2s7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsQ291bnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUGxheWJhY2sudGhyZWFkKCktPmNoYW5uZWxDb3VudCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbmV3UGF0Y2gubVBsYXliYWNrLnRocmVhZCgpLT5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZsYWdzLmlucHV0IDogQVVESU9fSU5QVVRfRkxBR19OT05FOwogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5vcGVuSW5wdXRfbChzcmNNb2R1bGUsCisgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5vcGVuSW5wdXRfbChzcmNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOwotICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiYXVkaW9mbGluZ2VyLT5vcGVuSW5wdXRfbCgpIHJldHVybmVkICVwIGluQ2hhbm5lbE1hc2sgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQuZ2V0KCksIGNvbmZpZy5jaGFubmVsX21hc2spOwotICAgICAgICAgICAgICAgIGlmIChuZXdQYXRjaC0+bVJlY29yZFRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZUFkZHJlc3MpOworICAgICAgICAgICAgICAgIEFMT0dWKCJtQXVkaW9GbGluZ2VyLm9wZW5JbnB1dF9sKCkgcmV0dXJuZWQgJXAgaW5DaGFubmVsTWFzayAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQuZ2V0KCksIGNvbmZpZy5jaGFubmVsX21hc2spOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gY3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhuZXdQYXRjaCwgcGF0Y2gpOworICAgICAgICAgICAgICAgIG5ld1BhdGNoLm1SZWNvcmQuc2V0VGhyZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8UmVjb3JkVGhyZWFkKj4odGhyZWFkLmdldCgpKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gbmV3UGF0Y2guY3JlYXRlQ29ubmVjdGlvbnModGhpcyk7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT5pc0luc2VydCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGluc2VydGVkTW9kdWxlID0gYXVkaW9Id0RldmljZS0+aGFuZGxlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCisgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tSZWNvcmRUaHJlYWRfbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHBhdGNoLCAmaGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHN0YWxlIGF1ZGlvIHBhdGNoIHdpdGggc2FtZSBpbnB1dCBhcyBzaW5rIGlmIGFueQorICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGl0ZXIgOiBtUGF0Y2hlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLm1BdWRpb1BhdGNoLnNpbmtzWzBdLmV4dC5taXguaGFuZGxlID09IHRocmVhZC0+aWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaGVzLmVyYXNlKGl0ZXIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLT5udW1fc291cmNlcywKQEAgLTM1Niw5ICszNDQsOSBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6IHsKICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb0ZsaW5nZXIubUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBzcmNNb2R1bGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICB9CkBAIC0zNjYsOCArMzU0LDggQEAKICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzaW5rIHR5cGUgJWQgZm9yIG1peCBzb3VyY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0udHlwZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGludmFsaWQgc2luayB0eXBlICVkIGZvciBtaXggc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CkBAIC0zNzksMzE5ICszNjcsNDQ4IEBACiAgICAgICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRocmVhZCA9PSBhdWRpb2ZsaW5nZXItPnByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkpIHsKKyAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gbUF1ZGlvRmxpbmdlci5wcmltYXJ5UGxheWJhY2tUaHJlYWRfbCgpKSB7CiAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCl0eXBlKTsKIAotICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+YnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2wocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5icm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChwYXJhbS50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHBhdGNoLCAmaGFsSGFuZGxlKTsKKworICAgICAgICAgICAgLy8gcmVtb3ZlIHN0YWxlIGF1ZGlvIHBhdGNoIHdpdGggc2FtZSBvdXRwdXQgYXMgc291cmNlIGlmIGFueQorICAgICAgICAgICAgZm9yIChhdXRvJiBpdGVyIDogbVBhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXRlci5zZWNvbmQubUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQubWl4LmhhbmRsZSA9PSB0aHJlYWQtPmlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBhdGNoZXMuZXJhc2UoaXRlci5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiBleGl0OgotICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HVigiJXMoKSBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGF1ZGlvZmxpbmdlci0+bmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0gpOwotICAgICAgICBuZXdQYXRjaC0+bUhhbmRsZSA9ICpoYW5kbGU7Ci0gICAgICAgIG5ld1BhdGNoLT5tSGFsSGFuZGxlID0gaGFsSGFuZGxlOwotICAgICAgICBtUGF0Y2hlcy5hZGQobmV3UGF0Y2gpOwotICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIGFkZGVkIG5ldyBwYXRjaCBoYW5kbGUgJWQgaGFsSGFuZGxlICVkIiwgKmhhbmRsZSwgaGFsSGFuZGxlKTsKKyAgICAgICAgKmhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgbUF1ZGlvRmxpbmdlci5uZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9QQVRDSCk7CisgICAgICAgIG5ld1BhdGNoLm1IYWxIYW5kbGUgPSBoYWxIYW5kbGU7CisgICAgICAgIG1QYXRjaGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigqaGFuZGxlLCBzdGQ6Om1vdmUobmV3UGF0Y2gpKSk7CisgICAgICAgIGlmIChpbnNlcnRlZE1vZHVsZSAhPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIGFkZFNvZnR3YXJlUGF0Y2hUb0luc2VydGVkTW9kdWxlcyhpbnNlcnRlZE1vZHVsZSwgKmhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzKCkgYWRkZWQgbmV3IHBhdGNoIGhhbmRsZSAlZCBoYWxIYW5kbGUgJWQiLCBfX2Z1bmNfXywgKmhhbmRsZSwgaGFsSGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMobmV3UGF0Y2gpOwotICAgICAgICBkZWxldGUgbmV3UGF0Y2g7CisgICAgICAgIG5ld1BhdGNoLmNsZWFyQ29ubmVjdGlvbnModGhpcyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICphdWRpb1BhdGNoKQorQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6flBhdGNoKCkKK3sKKyAgICBBTE9HRV9JRihpc1NvZnR3YXJlKCksICJTb2Z0d2FyZSBwYXRjaCBjb25uZWN0aW9ucyBsZWFrZWQgJWQgJWQiLAorICAgICAgICAgICAgbVJlY29yZC5oYW5kbGUoKSwgbVBsYXliYWNrLmhhbmRsZSgpKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6Y3JlYXRlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpCiB7CiAgICAgLy8gY3JlYXRlIHBhdGNoIGZyb20gc291cmNlIGRldmljZSB0byByZWNvcmQgdGhyZWFkIGlucHV0Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIHN1YlBhdGNoOwotICAgIHN1YlBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICBzdWJQYXRjaC5zb3VyY2VzWzBdID0gYXVkaW9QYXRjaC0+c291cmNlc1swXTsKLSAgICBzdWJQYXRjaC5udW1fc2lua3MgPSAxOwotCi0gICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmdldEF1ZGlvUG9ydENvbmZpZygmc3ViUGF0Y2guc2lua3NbMF0pOwotICAgIHN1YlBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmc3ViUGF0Y2gsICZwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIFBhdGNoQnVpbGRlcigpLmFkZFNvdXJjZShtQXVkaW9QYXRjaC5zb3VyY2VzWzBdKS4KKyAgICAgICAgICAgICAgICBhZGRTaW5rKG1SZWNvcmQudGhyZWFkKCksIHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUMgfSkucGF0Y2goKSwKKyAgICAgICAgICAgIG1SZWNvcmQuaGFuZGxlUHRyKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAqbVJlY29yZC5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogICAgIC8vIGNyZWF0ZSBwYXRjaCBmcm9tIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKLSAgICBpZiAoYXVkaW9QYXRjaC0+bnVtX3NpbmtzICE9IDApIHsKLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Z2V0QXVkaW9Qb3J0Q29uZmlnKCZzdWJQYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgc3ViUGF0Y2guc2lua3NbMF0gPSBhdWRpb1BhdGNoLT5zaW5rc1swXTsKLSAgICAgICAgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmc3ViUGF0Y2gsICZwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworICAgIGlmIChtQXVkaW9QYXRjaC5udW1fc2lua3MgIT0gMCkgeworICAgICAgICBzdGF0dXMgPSBwYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgICAgICBQYXRjaEJ1aWxkZXIoKS5hZGRTb3VyY2UobVBsYXliYWNrLnRocmVhZCgpKS5hZGRTaW5rKG1BdWRpb1BhdGNoLnNpbmtzWzBdKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgIG1QbGF5YmFjay5oYW5kbGVQdHIoKSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgKm1QbGF5YmFjay5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAqbVBsYXliYWNrLmhhbmRsZVB0cigpID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogCiAgICAgLy8gdXNlIGEgcHNldWRvIExDTSBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgZnJhbWVjb3VudAotICAgIHNpemVfdCBwbGF5YmFja0ZyYW1lQ291bnQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCk7CisgICAgc2l6ZV90IHBsYXliYWNrRnJhbWVDb3VudCA9IG1QbGF5YmFjay50aHJlYWQoKS0+ZnJhbWVDb3VudCgpOwogICAgIGludCBwbGF5YmFja1NoaWZ0ID0gX19idWlsdGluX2N0eihwbGF5YmFja0ZyYW1lQ291bnQpOwotICAgIHNpemVfdCByZWNvcmRGcmFtZWNvdW50ID0gcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKTsKLSAgICBpbnQgc2hpZnQgPSBfX2J1aWx0aW5fY3R6KHJlY29yZEZyYW1lY291bnQpOworICAgIHNpemVfdCByZWNvcmRGcmFtZUNvdW50ID0gbVJlY29yZC50aHJlYWQoKS0+ZnJhbWVDb3VudCgpOworICAgIGludCBzaGlmdCA9IF9fYnVpbHRpbl9jdHoocmVjb3JkRnJhbWVDb3VudCk7CiAgICAgaWYgKHBsYXliYWNrU2hpZnQgPCBzaGlmdCkgewogICAgICAgICBzaGlmdCA9IHBsYXliYWNrU2hpZnQ7CiAgICAgfQotICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKHBsYXliYWNrRnJhbWVDb3VudCAqIHJlY29yZEZyYW1lY291bnQpID4+IHNoaWZ0OwotICAgIEFMT0dWKCJjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgcGxheWZyYW1lQ291bnQgJXp1IHJlY29yZEZyYW1lY291bnQgJXp1IGZyYW1lQ291bnQgJXp1IiwKLSAgICAgICAgICBwbGF5YmFja0ZyYW1lQ291bnQsIHJlY29yZEZyYW1lY291bnQsIGZyYW1lQ291bnQpOworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKHBsYXliYWNrRnJhbWVDb3VudCAqIHJlY29yZEZyYW1lQ291bnQpID4+IHNoaWZ0OworICAgIEFMT0dWKCIlcygpIHBsYXlmcmFtZUNvdW50ICV6dSByZWNvcmRGcmFtZUNvdW50ICV6dSBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcGxheWJhY2tGcmFtZUNvdW50LCByZWNvcmRGcmFtZUNvdW50LCBmcmFtZUNvdW50KTsKIAogICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWwgcmVjb3JkIHRyYWNrIHRvIGNhcHR1cmUgZnJvbSByZWNvcmQgdGhyZWFkCi0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbENvdW50KCk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbVBsYXliYWNrLnRocmVhZCgpLT5jaGFubmVsQ291bnQoKTsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbkNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRDaGFubmVsTWFzayA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxNYXNrKCk7Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mb3JtYXQoKTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRDaGFubmVsTWFzayA9IG1QbGF5YmFjay50aHJlYWQoKS0+Y2hhbm5lbE1hc2soKTsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVBsYXliYWNrLnRocmVhZCgpLT5zYW1wbGVSYXRlKCk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gbVBsYXliYWNrLnRocmVhZCgpLT5mb3JtYXQoKTsKIAotICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQgPSBuZXcgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmdldCgpLAorICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0ID0gbVJlY29yZC50aHJlYWQoKS0+Zm9ybWF0KCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGlucHV0Rm9ybWF0KSkgeworICAgICAgICAvLyBUaGUgcGxheWJhY2tUaHJlYWQgZm9ybWF0IHdpbGwgc2F5IFBDTSBmb3IgSUVDNjE5MzcgcGFja2V0aXplZCBzdHJlYW0uCisgICAgICAgIC8vIFVzZSByZWNvcmRUaHJlYWQgZm9ybWF0LgorICAgICAgICBmb3JtYXQgPSBpbnB1dEZvcm1hdDsKKyAgICB9CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBpbnB1dEZsYWdzID0gbUF1ZGlvUGF0Y2guc291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTID8KKyAgICAgICAgICAgIG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZmxhZ3MuaW5wdXQgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gbVJlY29yZC50aHJlYWQoKS0+c2FtcGxlUmF0ZSgpICYmCisgICAgICAgICAgICBpbkNoYW5uZWxNYXNrID09IG1SZWNvcmQudGhyZWFkKCktPmNoYW5uZWxNYXNrKCkgJiYKKyAgICAgICAgICAgIG1SZWNvcmQudGhyZWFkKCktPmZhc3RUcmFja0F2YWlsYWJsZSgpICYmCisgICAgICAgICAgICBtUmVjb3JkLnRocmVhZCgpLT5oYXNGYXN0Q2FwdHVyZSgpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIGZhc3QgdHJhY2sgaWYgdGhlIHJlY29yZCB0aHJlYWQgaGFzIGZhc3QgY2FwdHVyZSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgorICAgICAgICAvLyBPbmx5IGVuYWJsZSBmYXN0IG1vZGUgd2hlbiB0aGVyZSBpcyBubyByZXNhbXBsZSBuZWVkZWQuCisgICAgICAgIGlucHV0RmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKGlucHV0RmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX0ZBU1QpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZhc3QgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgaW5wdXRGbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoaW5wdXRGbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpOworICAgIH0KKyAgICBzcDxSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiB0ZW1wUmVjb3JkVHJhY2sgPSBuZXcgKHN0ZDo6bm90aHJvdykgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmQudGhyZWFkKCkuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOwotICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgc3RhdHVzID0gcGF0Y2gtPm1QYXRjaFJlY29yZC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZsYWdzKTsKKyAgICBzdGF0dXMgPSBtUmVjb3JkLmNoZWNrVHJhY2sodGVtcFJlY29yZFRyYWNrLmdldCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5hZGRQYXRjaFJlY29yZChwYXRjaC0+bVBhdGNoUmVjb3JkKTsKKworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dEZsYWdzID0gbUF1ZGlvUGF0Y2guc2lua3NbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUyA/CisgICAgICAgICAgICBtQXVkaW9QYXRjaC5zaW5rc1swXS5mbGFncy5vdXRwdXQgOiBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICBpZiAobUF1ZGlvUGF0Y2gubnVtX3NvdXJjZXMgPT0gMiAmJiBtQXVkaW9QYXRjaC5zb3VyY2VzWzFdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAvLyAicmV1c2Ugb25lIGV4aXN0aW5nIG91dHB1dCBtaXgiIGNhc2UKKyAgICAgICAgc3RyZWFtVHlwZSA9IG1BdWRpb1BhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbTsKKyAgICB9CisgICAgaWYgKG1QbGF5YmFjay50aHJlYWQoKS0+aGFzRmFzdE1peGVyKCkpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgZmFzdCB0cmFjayBpZiB0aGUgcGxheWJhY2sgdGhyZWFkIGhhcyBmYXN0IG1peGVyIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICAgIG91dHB1dEZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAob3V0cHV0RmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19GQVNUKTsKKyAgICB9CiAKICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHBsYXliYWNrIHRyYWNrIHRvIHJlbmRlciB0byBwbGF5YmFjayB0aHJlYWQuCiAgICAgLy8gdGhpcyB0cmFjayBpcyBnaXZlbiB0aGUgc2FtZSBidWZmZXIgYXMgdGhlIFBhdGNoUmVjb3JkIGJ1ZmZlcgotICAgIHBhdGNoLT5tUGF0Y2hUcmFjayA9IG5ldyBQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvUGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSwKKyAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gdGVtcFBhdGNoVHJhY2sgPSBuZXcgKHN0ZDo6bm90aHJvdykgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrLnRocmVhZCgpLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5idWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5idWZmZXJTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSk7Ci0gICAgc3RhdHVzID0gcGF0Y2gtPm1QYXRjaFRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVjb3JkVHJhY2stPmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSZWNvcmRUcmFjay0+YnVmZmVyU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzKTsKKyAgICBzdGF0dXMgPSBtUGxheWJhY2suY2hlY2tUcmFjayh0ZW1wUGF0Y2hUcmFjay5nZXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5hZGRQYXRjaFRyYWNrKHBhdGNoLT5tUGF0Y2hUcmFjayk7CiAKICAgICAvLyB0aWUgcGxheWJhY2sgYW5kIHJlY29yZCB0cmFja3MgdG9nZXRoZXIKLSAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zZXRQZWVyUHJveHkocGF0Y2gtPm1QYXRjaFRyYWNrLmdldCgpKTsKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnNldFBlZXJQcm94eShwYXRjaC0+bVBhdGNoUmVjb3JkLmdldCgpKTsKKyAgICBtUmVjb3JkLnNldFRyYWNrQW5kUGVlcih0ZW1wUmVjb3JkVHJhY2ssIHRlbXBQYXRjaFRyYWNrKTsKKyAgICBtUGxheWJhY2suc2V0VHJhY2tBbmRQZWVyKHRlbXBQYXRjaFRyYWNrLCB0ZW1wUmVjb3JkVHJhY2spOwogCiAgICAgLy8gc3RhcnQgY2FwdHVyZSBhbmQgcGxheWJhY2sKLSAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zdGFydChBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLCBBVURJT19TRVNTSU9OX05PTkUpOwotICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c3RhcnQoKTsKKyAgICBtUmVjb3JkLnRyYWNrKCktPnN0YXJ0KEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsIEFVRElPX1NFU1NJT05fTk9ORSk7CisgICAgbVBsYXliYWNrLnRyYWNrKCktPnN0YXJ0KCk7CiAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y2xlYXJQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6Y2xlYXJDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCkKIHsKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm47CisgICAgQUxPR1YoIiVzKCkgbVJlY29yZC5oYW5kbGUgJWQgbVBsYXliYWNrLmhhbmRsZSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVJlY29yZC5oYW5kbGUoKSwgbVBsYXliYWNrLmhhbmRsZSgpKTsKKyAgICBtUmVjb3JkLnN0b3BUcmFjaygpOworICAgIG1QbGF5YmFjay5zdG9wVHJhY2soKTsKKyAgICBtUmVjb3JkLmNsZWFyVHJhY2tQZWVyKCk7IC8vIG1SZWNvcmQgc3RvcCBpcyBzeW5jaHJvbm91cy4gQnJlYWsgUGVlclByb3h5IHNwPD4gY3ljbGUuCisgICAgbVJlY29yZC5jbG9zZUNvbm5lY3Rpb25zKHBhbmVsKTsKKyAgICBtUGxheWJhY2suY2xvc2VDb25uZWN0aW9ucyhwYW5lbCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmdldExhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcykgY29uc3QKK3sKKyAgICBpZiAoIWlzU29mdHdhcmUoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgYXV0byByZWNvcmRUcmFjayA9IG1SZWNvcmQuY29uc3RfdHJhY2soKTsKKyAgICBpZiAocmVjb3JkVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgYXV0byBwbGF5YmFja1RyYWNrID0gbVBsYXliYWNrLmNvbnN0X3RyYWNrKCk7CisgICAgaWYgKHBsYXliYWNrVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgLy8gTGF0ZW5jeSBpbmZvcm1hdGlvbiBmb3IgdHJhY2tzIG1heSBiZSBjYWxsZWQgd2l0aG91dCBvYnRhaW5pbmcKKyAgICAvLyB0aGUgdW5kZXJseWluZyB0aHJlYWQgbG9jay4KKyAgICAvLworICAgIC8vIFdlIHVzZSByZWNvcmQgc2VydmVyIGxhdGVuY3kgKyBwbGF5YmFjayB0cmFjayBsYXRlbmN5IChnZW5lcmFsbHkgc21hbGxlciB0aGFuIHRoZQorICAgIC8vIHJldmVyc2UgZHVlIHRvIGludGVybmFsIGJpYXNlcykuCisgICAgLy8KKyAgICAvLyBUT0RPOiBpcyB0aGlzIHN0YWJsZSBlbm91Z2g/IENvbnNpZGVyIGEgUGF0Y2hUcmFjayBzeW5jaHJvbml6ZWQgdmVyc2lvbiBvZiB0aGlzLgorCisgICAgLy8gRm9yIFBDTSB0cmFja3MgZ2V0IHNlcnZlciBsYXRlbmN5LgorICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKHJlY29yZFRyYWNrLT5mb3JtYXQoKSkpIHsKKyAgICAgICAgZG91YmxlIHJlY29yZFNlcnZlckxhdGVuY3lNcywgcGxheWJhY2tUcmFja0xhdGVuY3lNczsKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5nZXRTZXJ2ZXJMYXRlbmN5TXMoJnJlY29yZFNlcnZlckxhdGVuY3lNcykgPT0gT0sKKyAgICAgICAgICAgICAgICAmJiBwbGF5YmFja1RyYWNrLT5nZXRUcmFja0xhdGVuY3lNcygmcGxheWJhY2tUcmFja0xhdGVuY3lNcykgPT0gT0spIHsKKyAgICAgICAgICAgICpsYXRlbmN5TXMgPSByZWNvcmRTZXJ2ZXJMYXRlbmN5TXMgKyBwbGF5YmFja1RyYWNrTGF0ZW5jeU1zOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoImNsZWFyUGF0Y2hDb25uZWN0aW9ucygpIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgJWQgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlLCBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworICAgIC8vIFNlZSBpZiBrZXJuZWwgbGF0ZW5jaWVzIGFyZSBhdmFpbGFibGUuCisgICAgLy8gSWYgc28sIGRvIGEgZnJhbWUgZGlmZiBhbmQgdGltZSBkaWZmZXJlbmNlIGNvbXB1dGF0aW9uIHRvIGVzdGltYXRlCisgICAgLy8gdGhlIHRvdGFsIHBhdGNoIGxhdGVuY3kuIFRoaXMgcmVxdWlyZXMgdGhhdCBmcmFtZSBjb3VudHMgYXJlIHJlcG9ydGVkIGJ5IHRoZQorICAgIC8vIEhBTCBhcmUgbWF0Y2hlZCBwcm9wZXJseSBpbiB0aGUgY2FzZSBvZiByZWNvcmQgb3ZlcnJ1bnMgYW5kIHBsYXliYWNrIHVuZGVycnVucy4KKyAgICBUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OkZyYW1lVGltZSByZWNvcmRGVHt9LCBwbGF5RlR7fTsKKyAgICByZWNvcmRUcmFjay0+Z2V0S2VybmVsRnJhbWVUaW1lKCZyZWNvcmRGVCk7CisgICAgcGxheWJhY2tUcmFjay0+Z2V0S2VybmVsRnJhbWVUaW1lKCZwbGF5RlQpOworICAgIGlmIChyZWNvcmRGVC50aW1lTnMgPiAwICYmIHBsYXlGVC50aW1lTnMgPiAwKSB7CisgICAgICAgIGNvbnN0IGludDY0X3QgZnJhbWVEaWZmID0gcmVjb3JkRlQuZnJhbWVzIC0gcGxheUZULmZyYW1lczsKKyAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lRGlmZk5zID0gcmVjb3JkRlQudGltZU5zIC0gcGxheUZULnRpbWVOczsKIAotICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKLSAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c3RvcCgpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKLSAgICAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zdG9wKCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUpOwotICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVJlY29yZFRocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5kZWxldGVQYXRjaFJlY29yZChwYXRjaC0+bVBhdGNoUmVjb3JkKTsKKyAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgcGF0Y2ggdHJhY2sgYW5kIHBhdGNoIHJlY29yZCBoYXZlIGEgbGFyZ2UgdGltZSBkaXNwYXJpdHkgYmVjYXVzZQorICAgICAgICAvLyBvbmUgdGhyZWFkIHJ1bnMgYnV0IGFub3RoZXIgaXMgc3RvcHBlZC4gIFdlIGFyYml0cmFyaWx5IGNob29zZSB0aGUgbWF4aW11bSB0aW1lc3RhbXAKKyAgICAgICAgLy8gdGltZSBkaWZmZXJlbmNlIGJhc2VkIG9uIGhvdyBvZnRlbiB3ZSBleHBlY3QgdGhlIHRpbWVzdGFtcHMgdG8gdXBkYXRlIGluIG5vcm1hbCBvcGVyYXRpb24KKyAgICAgICAgLy8gKHR5cGljYWwgc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiA1MCBtcykuCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoZSB0aW1lc3RhbXBzIGFyZW4ndCBzYW1wbGVkIGNsb3NlIGVub3VnaCwgdGhlIHBhdGNoIGxhdGVuY3kgaXMgbm90CisgICAgICAgIC8vIGNvbnNpZGVyZWQgdmFsaWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIGJhc2VkIG9uIG1vcmUgZXhwZXJpbWVudHMuCisgICAgICAgIGNvbnN0ZXhwciBpbnQ2NF90IG1heFZhbGlkVGltZURpZmZOcyA9IDIwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKKyAgICAgICAgaWYgKHN0ZDo6YWJzKHRpbWVEaWZmTnMpIDwgbWF4VmFsaWRUaW1lRGlmZk5zKSB7CisgICAgICAgICAgICAqbGF0ZW5jeU1zID0gZnJhbWVEaWZmICogMWUzIC8gcmVjb3JkVHJhY2stPnNhbXBsZVJhdGUoKQorICAgICAgICAgICAgICAgICAgIC0gdGltZURpZmZOcyAqIDFlLTY7CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZUlucHV0SW50ZXJuYWxfbChwYXRjaC0+bVJlY29yZFRocmVhZCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBsYXliYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5kZWxldGVQYXRjaFRyYWNrKHBhdGNoLT5tUGF0Y2hUcmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgbnVtIHNvdXJjZXMgPT0gMiB3ZSBhcmUgcmV1c2luZyBhbiBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgc28gd2UgZG8gbm90IGNsb3NlIGl0Ci0gICAgICAgIGlmIChwYXRjaC0+bUF1ZGlvUGF0Y2gubnVtX3NvdXJjZXMgIT0gMikgewotICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZU91dHB1dEludGVybmFsX2wocGF0Y2gtPm1QbGF5YmFja1RocmVhZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUmVjb3JkVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBsYXliYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2suY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLmNsZWFyKCk7CiAgICAgfQogCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitTdHJpbmc4IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmR1bXAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbXlIYW5kbGUpIGNvbnN0Cit7CisgICAgLy8gVE9ETzogQ29uc2lkZXIgdGFibGUgZHVtcCBmb3JtIGZvciBwYXRjaGVzLCBqdXN0IGxpa2UgdHJhY2tzLgorICAgIFN0cmluZzggcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJQYXRjaCAlZDogdGhyZWFkICVwID0+IHRocmVhZCAlcCIsCisgICAgICAgICAgICBteUhhbmRsZSwgbVJlY29yZC5jb25zdF90aHJlYWQoKS5nZXQoKSwgbVBsYXliYWNrLmNvbnN0X3RocmVhZCgpLmdldCgpKTsKKworICAgIC8vIGFkZCBsYXRlbmN5IGlmIGl0IGV4aXN0cworICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgaWYgKGdldExhdGVuY3lNcygmbGF0ZW5jeU1zKSA9PSBPSykgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGxhdGVuY3k6ICUuMmxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogRGlzY29ubmVjdCBhIHBhdGNoICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKIHsKLSAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2ggaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19mdW5jX18sIGhhbmRsZSk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgc2l6ZV90IGluZGV4OwogCi0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbVBhdGNoZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmIChoYW5kbGUgPT0gbVBhdGNoZXNbaW5kZXhdLT5tSGFuZGxlKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaW5kZXggPT0gbVBhdGNoZXMuc2l6ZSgpKSB7CisgICAgYXV0byBpdGVyID0gbVBhdGNoZXMuZmluZChoYW5kbGUpOworICAgIGlmIChpdGVyID09IG1QYXRjaGVzLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIFBhdGNoICpyZW1vdmVkUGF0Y2ggPSBtUGF0Y2hlc1tpbmRleF07Ci0gICAgbVBhdGNoZXMucmVtb3ZlQXQoaW5kZXgpOworICAgIFBhdGNoICZyZW1vdmVkUGF0Y2ggPSBpdGVyLT5zZWNvbmQ7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICZwYXRjaCA9IHJlbW92ZWRQYXRjaC5tQXVkaW9QYXRjaDsKIAotICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggPSAmcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaDsKLQotICAgIHN3aXRjaCAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSkgeworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAmc3JjID0gcGF0Y2guc291cmNlc1swXTsKKyAgICBzd2l0Y2ggKHNyYy50eXBlKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRTogewotICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gZmluZEh3RGV2aWNlQnlNb2R1bGUoc3JjLmV4dC5kZXZpY2UuaHdfbW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChod0RldmljZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgc3JjLmV4dC5kZXZpY2UuaHdfbW9kdWxlKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSB8fAotICAgICAgICAgICAgICAgICAgICByZW1vdmVkUGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKHJlbW92ZWRQYXRjaCk7CisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLmlzU29mdHdhcmUoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZWRQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgaWYgKHBhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gcGF0Y2guc2lua3NbMF0uZXh0Lm1peC5oYW5kbGU7CisgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja1JlY29yZFRocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrTW1hcFRocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwgX19mdW5jX18sIGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogewotICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKGZpbmRId0RldmljZUJ5TW9kdWxlKHNyYy5leHQubWl4Lmh3X21vZHVsZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyYy5leHQubWl4Lmh3X21vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IHNyYy5leHQubWl4LmhhbmRsZTsKKyAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tQbGF5YmFja1RocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwgX19mdW5jX18sIGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGRlbGV0ZSByZW1vdmVkUGF0Y2g7CisgICAgbVBhdGNoZXMuZXJhc2UoaXRlcik7CisgICAgcmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoaGFuZGxlKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi0KIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGV5IGF0dHJpYnV0ZXMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyBfX3VudXNlZCkKIHsKLSAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcyIpOworICAgIEFMT0dWKF9fZnVuY19fKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpnZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0sCisgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6U29mdHdhcmVQYXRjaD4gKnBhdGNoZXMpIGNvbnN0CiB7Ci0gICAgQUxPR1YoInNldEF1ZGlvUG9ydENvbmZpZyIpOwotCi0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIGlmIChtb2R1bGUuc2Vjb25kLnN0cmVhbXMuY291bnQoc3RyZWFtKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXRjaEhhbmRsZSA6IG1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcykgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8mIHBhdGNoX2l0ZXIgPSBtUGF0Y2hlcy5maW5kKHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hfaXRlciAhPSBtUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXRjaCAmcGF0Y2ggPSBwYXRjaF9pdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoZXMtPmVtcGxhY2VfYmFjaygqdGhpcywgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gubVBsYXliYWNrLmNvbnN0X3RocmVhZCgpLT5pZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLm1SZWNvcmQuY29uc3RfdGhyZWFkKCktPmlkKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTdGFsZSBwYXRjaCBoYW5kbGUgaW4gdGhlIGNhY2hlOiAlZCIsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9CisgICAgLy8gVGhlIHN0cmVhbSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBvZiBpbnNlcnRlZCBtb2R1bGVzLgorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CiAKLSAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlOwotICAgIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGU7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bm90aWZ5U3RyZWFtT3BlbmVkKAorICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pCit7CisgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPmlzSW5zZXJ0KCkpIHsKKyAgICAgICAgbUluc2VydGVkTW9kdWxlc1thdWRpb0h3RGV2aWNlLT5oYW5kbGUoKV0uc3RyZWFtcy5pbnNlcnQoc3RyZWFtKTsKICAgICB9Cit9CiAKLSAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Om5vdGlmeVN0cmVhbUNsb3NlZChhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pCit7CisgICAgZm9yIChhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIG1vZHVsZS5zZWNvbmQuc3RyZWFtcy5lcmFzZShzdHJlYW0pOworICAgIH0KK30KKworQXVkaW9Id0RldmljZSogQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpCit7CisgICAgaWYgKG1vZHVsZSA9PSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHJldHVybiBudWxscHRyOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9GbGluZ2VyLm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic2V0QXVkaW9Qb3J0Q29uZmlnKCkgYmFkIGh3IG1vZHVsZSAlZCIsIG1vZHVsZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dXKCIlcygpIGJhZCBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgbW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9GbGluZ2VyLm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKK30KKworc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmZpbmRId0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpCit7CisgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUobW9kdWxlKTsKKyAgICByZXR1cm4gYXVkaW9Id0RldmljZSA/IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCkgOiBudWxscHRyOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6YWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKAorICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgbUluc2VydGVkTW9kdWxlc1ttb2R1bGVdLnN3X3BhdGNoZXMuaW5zZXJ0KGhhbmRsZSk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpyZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcygKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIGZvciAoYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMuZXJhc2UoaGFuZGxlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpkdW1wKGludCBmZCkgY29uc3QKK3sKKyAgICBTdHJpbmc4IHBhdGNoUGFuZWxEdW1wOworICAgIGNvbnN0IGNoYXIgKmluZGVudCA9ICIgICI7CisKKyAgICAvLyBPbmx5IGR1bXAgc29mdHdhcmUgcGF0Y2hlcy4KKyAgICBib29sIGhlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBtUGF0Y2hlcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQuaXNTb2Z0d2FyZSgpKSB7CisgICAgICAgICAgICBpZiAoIWhlYWRlclByaW50ZWQpIHsKKyAgICAgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcCArPSAiXG5Tb2Z0d2FyZSBwYXRjaGVzOlxuIjsKKyAgICAgICAgICAgICAgICBoZWFkZXJQcmludGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wLmFwcGVuZEZvcm1hdCgiJXMlc1xuIiwgaW5kZW50LCBpdGVyLnNlY29uZC5kdW1wKGl0ZXIuZmlyc3QpLnN0cmluZygpKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKLSAgICByZXR1cm4gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgaGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBpZiAoIW1vZHVsZS5zZWNvbmQuc3RyZWFtcy5lbXB0eSgpIHx8ICFtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKCFoZWFkZXJQcmludGVkKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAgKz0gIlxuVHJhY2tlZCBpbnNlcnRlZCBtb2R1bGVzOlxuIjsKKyAgICAgICAgICAgICAgICBoZWFkZXJQcmludGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzggbW9kdWxlRHVtcCA9IFN0cmluZzg6OmZvcm1hdCgiTW9kdWxlICVkOiBJL08gaGFuZGxlczogIiwgbW9kdWxlLmZpcnN0KTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbW9kdWxlLnNlY29uZC5zdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRHVtcC5hcHBlbmRGb3JtYXQoIiVkICIsIHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb2R1bGVEdW1wLmFwcGVuZCgiOyBTVyBQYXRjaGVzOiAiKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGF0Y2ggOiBtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVEdW1wLmFwcGVuZEZvcm1hdCgiJWQgIiwgcGF0Y2gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAuYXBwZW5kRm9ybWF0KCIlcyVzXG4iLCBpbmRlbnQsIG1vZHVsZUR1bXAuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFwYXRjaFBhbmVsRHVtcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgd3JpdGUoZmQsIHBhdGNoUGFuZWxEdW1wLnN0cmluZygpLCBwYXRjaFBhbmVsRHVtcC5zaXplKCkpOworICAgIH0KIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKaW5kZXggZDM3YzBkMy4uMTgxZTI3YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCkBAIC0xOSwxMyArMTksMzMgQEAKICAgICAjZXJyb3IgVGhpcyBoZWFkZXIgZmlsZSBzaG91bGQgb25seSBiZSBpbmNsdWRlZCBmcm9tIEF1ZGlvRmxpbmdlci5oCiAjZW5kaWYKIAotY2xhc3MgUGF0Y2hQYW5lbCA6IHB1YmxpYyBSZWZCYXNlIHsKKworLy8gUGF0Y2hQYW5lbCBpcyBjb25jZWFsZWQgd2l0aGluIEF1ZGlvRmxpbmdlciwgdGhlaXIgbGlmZXRpbWVzIGFyZSB0aGUgc2FtZS4KK2NsYXNzIFBhdGNoUGFuZWwgewogcHVibGljOgorICAgIGNsYXNzIFNvZnR3YXJlUGF0Y2ggeworICAgICAgcHVibGljOgorICAgICAgICBTb2Z0d2FyZVBhdGNoKGNvbnN0IFBhdGNoUGFuZWwgJnBhdGNoUGFuZWwsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHBsYXliYWNrVGhyZWFkSGFuZGxlLCBhdWRpb19pb19oYW5kbGVfdCByZWNvcmRUaHJlYWRIYW5kbGUpCisgICAgICAgICAgICAgICAgOiBtUGF0Y2hQYW5lbChwYXRjaFBhbmVsKSwgbVBhdGNoSGFuZGxlKHBhdGNoSGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZEhhbmRsZShwbGF5YmFja1RocmVhZEhhbmRsZSksCisgICAgICAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkSGFuZGxlKHJlY29yZFRocmVhZEhhbmRsZSkge30KKyAgICAgICAgU29mdHdhcmVQYXRjaChjb25zdCBTb2Z0d2FyZVBhdGNoJikgPSBkZWZhdWx0OworICAgICAgICBTb2Z0d2FyZVBhdGNoJiBvcGVyYXRvcj0oY29uc3QgU29mdHdhcmVQYXRjaCYpID0gZGVmYXVsdDsKIAotICAgIGNsYXNzIFBhdGNoOworICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCB1bmRlciBBdWRpb0ZsaW5nZXI6Om1Mb2NrCisgICAgICAgIHN0YXR1c190IGdldExhdGVuY3lNc19sKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdDsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGU7IH07CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldFBsYXliYWNrVGhyZWFkSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBsYXliYWNrVGhyZWFkSGFuZGxlOyB9OworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRSZWNvcmRUaHJlYWRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUmVjb3JkVGhyZWFkSGFuZGxlOyB9OworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgUGF0Y2hQYW5lbCAmbVBhdGNoUGFuZWw7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKKyAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVBsYXliYWNrVGhyZWFkSGFuZGxlOworICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtUmVjb3JkVGhyZWFkSGFuZGxlOworICAgIH07CiAKLSAgICBleHBsaWNpdCBQYXRjaFBhbmVsKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlcik7Ci0gICAgdmlydHVhbCB+UGF0Y2hQYW5lbCgpOworICAgIGV4cGxpY2l0IFBhdGNoUGFuZWwoQXVkaW9GbGluZ2VyKiBhdWRpb0ZsaW5nZXIpIDogbUF1ZGlvRmxpbmdlcigqYXVkaW9GbGluZ2VyKSB7fQogCiAgICAgLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KICAgICBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTQ1LDQ2ICs2NSwxNTcgQEAKICAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyk7CiAKLSAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICAvLyBSZXRyaWV2ZXMgYWxsIGN1cnJlbnRseSBlc3RyYWJsaXNoZWQgc29mdHdhcmUgcGF0Y2hlcyBmb3IgYSBzdHJlYW0KKyAgICAvLyBvcGVuZWQgb24gYW4gaW50ZXJtZWRpYXRlIG1vZHVsZS4KKyAgICBzdGF0dXNfdCBnZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNvZnR3YXJlUGF0Y2g+ICpwYXRjaGVzKSBjb25zdDsKIAotICAgIHN0YXR1c190IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICphdWRpb1BhdGNoKTsKLSAgICB2b2lkIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gpOworICAgIC8vIE5vdGlmaWVzIHBhdGNoIHBhbmVsIGFib3V0IGFsbCBvcGVuZWQgYW5kIGNsb3NlZCBzdHJlYW1zLgorICAgIHZvaWQgbm90aWZ5U3RyZWFtT3BlbmVkKEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSk7CisgICAgdm9pZCBub3RpZnlTdHJlYW1DbG9zZWQoYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKTsKKworICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OworCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRocmVhZFR5cGUsIHR5cGVuYW1lIFRyYWNrVHlwZT4KKyAgICBjbGFzcyBFbmRwb2ludCB7CisgICAgcHVibGljOgorICAgICAgICBFbmRwb2ludCgpID0gZGVmYXVsdDsKKyAgICAgICAgRW5kcG9pbnQoY29uc3QgRW5kcG9pbnQmKSA9IGRlbGV0ZTsKKyAgICAgICAgRW5kcG9pbnQmIG9wZXJhdG9yPShjb25zdCBFbmRwb2ludCYpID0gZGVsZXRlOworICAgICAgICBFbmRwb2ludChFbmRwb2ludCYmIG90aGVyKSBub2V4Y2VwdCB7IHN3YXAob3RoZXIpOyB9CisgICAgICAgIEVuZHBvaW50JiBvcGVyYXRvcj0oRW5kcG9pbnQmJiBvdGhlcikgbm9leGNlcHQgeworICAgICAgICAgICAgc3dhcChvdGhlcik7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgfkVuZHBvaW50KCkgeworICAgICAgICAgICAgQUxPR0VfSUYobUhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgIkEgbm9uIGVtcHR5IFBhdGNoIEVuZHBvaW50IGxlYWtlZCwgaGFuZGxlICVkIiwgbUhhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBjaGVja1RyYWNrKFRyYWNrVHlwZSAqdHJhY2tPck51bGwpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmICh0cmFja09yTnVsbCA9PSBudWxscHRyKSByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuIHRyYWNrT3JOdWxsLT5pbml0Q2hlY2soKTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CisgICAgICAgIHNwPFRocmVhZFR5cGU+IHRocmVhZCgpIHsgcmV0dXJuIG1UaHJlYWQ7IH0KKyAgICAgICAgc3A8VHJhY2tUeXBlPiB0cmFjaygpIHsgcmV0dXJuIG1UcmFjazsgfQorICAgICAgICBzcDxjb25zdCBUaHJlYWRUeXBlPiBjb25zdF90aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkOyB9CisgICAgICAgIHNwPGNvbnN0IFRyYWNrVHlwZT4gY29uc3RfdHJhY2soKSBjb25zdCB7IHJldHVybiBtVHJhY2s7IH0KKworICAgICAgICB2b2lkIGNsb3NlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpIHsKKyAgICAgICAgICAgIGlmIChtSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgcGFuZWwtPnJlbGVhc2VBdWRpb1BhdGNoKG1IYW5kbGUpOworICAgICAgICAgICAgICAgIG1IYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVRocmVhZC0+ZGVsZXRlUGF0Y2hUcmFjayhtVHJhY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNsb3NlVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIHBhbmVsLT5tQXVkaW9GbGluZ2VyLmNsb3NlVGhyZWFkSW50ZXJuYWxfbChtVGhyZWFkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QqIGhhbmRsZVB0cigpIHsgcmV0dXJuICZtSGFuZGxlOyB9CisgICAgICAgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHNwPFRocmVhZFR5cGU+JiB0aHJlYWQsIGJvb2wgY2xvc2VUaHJlYWQgPSB0cnVlKSB7CisgICAgICAgICAgICBtVGhyZWFkID0gdGhyZWFkOworICAgICAgICAgICAgbUNsb3NlVGhyZWFkID0gY2xvc2VUaHJlYWQ7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgc2V0VHJhY2tBbmRQZWVyKGNvbnN0IHNwPFRyYWNrVHlwZT4mIHRyYWNrLCBjb25zdCBzcDxUPiAmcGVlcikgeworICAgICAgICAgICAgbVRyYWNrID0gdHJhY2s7CisgICAgICAgICAgICBtVGhyZWFkLT5hZGRQYXRjaFRyYWNrKG1UcmFjayk7CisgICAgICAgICAgICBtVHJhY2stPnNldFBlZXJQcm94eShwZWVyLCB0cnVlIC8qIGhvbGRSZWZlcmVuY2UgKi8pOworICAgICAgICB9CisgICAgICAgIHZvaWQgY2xlYXJUcmFja1BlZXIoKSB7IGlmIChtVHJhY2spIG1UcmFjay0+Y2xlYXJQZWVyUHJveHkoKTsgfQorICAgICAgICB2b2lkIHN0b3BUcmFjaygpIHsgaWYgKG1UcmFjaykgbVRyYWNrLT5zdG9wKCk7IH0KKworICAgICAgICB2b2lkIHN3YXAoRW5kcG9pbnQgJm90aGVyKSBub2V4Y2VwdCB7CisgICAgICAgICAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgICAgICAgICBzd2FwKG1UaHJlYWQsIG90aGVyLm1UaHJlYWQpOworICAgICAgICAgICAgc3dhcChtQ2xvc2VUaHJlYWQsIG90aGVyLm1DbG9zZVRocmVhZCk7CisgICAgICAgICAgICBzd2FwKG1IYW5kbGUsIG90aGVyLm1IYW5kbGUpOworICAgICAgICAgICAgc3dhcChtVHJhY2ssIG90aGVyLm1UcmFjayk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgdm9pZCBzd2FwKEVuZHBvaW50ICZhLCBFbmRwb2ludCAmYikgbm9leGNlcHQgeworICAgICAgICAgICAgYS5zd2FwKGIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzcDxUaHJlYWRUeXBlPiBtVGhyZWFkOworICAgICAgICBib29sIG1DbG9zZVRocmVhZCA9IHRydWU7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgc3A8VHJhY2tUeXBlPiBtVHJhY2s7CisgICAgfTsKIAogICAgIGNsYXNzIFBhdGNoIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IFBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gpIDoKLSAgICAgICAgICAgIG1BdWRpb1BhdGNoKCpwYXRjaCksIG1IYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLAotICAgICAgICAgICAgbUhhbEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1SZWNvcmRQYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksCi0gICAgICAgICAgICBtUGxheWJhY2tQYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkge30KLSAgICAgICAgflBhdGNoKCkge30KKyAgICAgICAgZXhwbGljaXQgUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICZwYXRjaCkgOiBtQXVkaW9QYXRjaChwYXRjaCkge30KKyAgICAgICAgflBhdGNoKCk7CisgICAgICAgIFBhdGNoKGNvbnN0IFBhdGNoJikgPSBkZWxldGU7CisgICAgICAgIFBhdGNoKFBhdGNoJiYpID0gZGVmYXVsdDsKKyAgICAgICAgUGF0Y2gmIG9wZXJhdG9yPShjb25zdCBQYXRjaCYpID0gZGVsZXRlOworICAgICAgICBQYXRjaCYgb3BlcmF0b3I9KFBhdGNoJiYpID0gZGVmYXVsdDsKIAorICAgICAgICBzdGF0dXNfdCBjcmVhdGVDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCk7CisgICAgICAgIHZvaWQgY2xlYXJDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCk7CisgICAgICAgIGJvb2wgaXNTb2Z0d2FyZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtUmVjb3JkLmhhbmRsZSgpICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FIHx8CisgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFjay5oYW5kbGUoKSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsgfQorCisgICAgICAgIC8vIHJldHVybnMgdGhlIGxhdGVuY3kgb2YgdGhlIHBhdGNoIChmcm9tIHJlY29yZCB0byBwbGF5YmFjaykuCisgICAgICAgIHN0YXR1c190IGdldExhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcykgY29uc3Q7CisKKyAgICAgICAgU3RyaW5nOCBkdW1wKGF1ZGlvX3BhdGNoX2hhbmRsZV90IG15SGFuZGxlKSBjb25zdDsKKworICAgICAgICAvLyBOb3RlIHRoYXQgYXVkaW9fcGF0Y2g6OmlkIGlzIG9ubHkgdW5pcXVlIHdpdGhpbiBhIEhBTCBtb2R1bGUKICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICAgICAgICAgICAgICBtQXVkaW9QYXRjaDsKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFuZGxlOwogICAgICAgICAvLyBoYW5kbGUgZm9yIGF1ZGlvIEhBTCBwYXRjaCBoYW5kbGUgcHJlc2VudCBvbmx5IHdoZW4gdGhlIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzID49IDMuMAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYWxIYW5kbGU7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbUhhbEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICAvLyBiZWxvdyBtZW1iZXJzIGFyZSB1c2VkIGJ5IGEgc29mdHdhcmUgYXVkaW8gcGF0Y2ggY29ubmVjdGluZyBhIHNvdXJjZSBkZXZpY2UgZnJvbSBhCiAgICAgICAgIC8vIGdpdmVuIGF1ZGlvIEhXIG1vZHVsZSB0byBhIHNpbmsgZGV2aWNlIG9uIGFuIG90aGVyIGF1ZGlvIEhXIG1vZHVsZS4KLSAgICAgICAgLy8gcGxheWJhY2sgdGhyZWFkIGNyZWF0ZWQgYnkgY3JlYXRlQXVkaW9QYXRjaCgpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKSBpZgotICAgICAgICAvLyBubyBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgY2FuIGJlIHVzZWQgYnkgdGhlIHNvZnR3YXJlIHBhdGNoCi0gICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiAgICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkOwotICAgICAgICAvLyBhdWRpbyB0cmFjayBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+ICBtUGF0Y2hUcmFjazsKLSAgICAgICAgLy8gcmVjb3JkIHRocmVhZCBjcmVhdGVkIGJ5IGNyZWF0ZUF1ZGlvUGF0Y2goKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiAgICAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkOwotICAgICAgICAvLyBhdWRpbyByZWNvcmQgY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIHNwPFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+ICAgbVBhdGNoUmVjb3JkOwotICAgICAgICAvLyBoYW5kbGUgZm9yIGF1ZGlvIHBhdGNoIGNvbm5lY3Rpbmcgc291cmNlIGRldmljZSB0byByZWNvcmQgdGhyZWFkIGlucHV0LgotICAgICAgICAvLyBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtUmVjb3JkUGF0Y2hIYW5kbGU7Ci0gICAgICAgIC8vIGhhbmRsZSBmb3IgYXVkaW8gcGF0Y2ggY29ubmVjdGluZyBwbGF5YmFjayB0aHJlYWQgb3V0cHV0IHRvIHNpbmsgZGV2aWNlCi0gICAgICAgIC8vIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1QbGF5YmFja1BhdGNoSGFuZGxlOwotCisgICAgICAgIC8vIHRoZSBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGNyZWF0ZUNvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyQ29ubmVjdGlvbnMoKQorICAgICAgICAvLyBwbGF5YmFjayB0aHJlYWQgaXMgY3JlYXRlZCBpZiBubyBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgY2FuIGJlIHVzZWQKKyAgICAgICAgLy8gY29ubmVjdHMgcGxheWJhY2sgdGhyZWFkIG91dHB1dCB0byBzaW5rIGRldmljZQorICAgICAgICBFbmRwb2ludDxQbGF5YmFja1RocmVhZCwgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+IG1QbGF5YmFjazsKKyAgICAgICAgLy8gY29ubmVjdHMgc291cmNlIGRldmljZSB0byByZWNvcmQgdGhyZWFkIGlucHV0CisgICAgICAgIEVuZHBvaW50PFJlY29yZFRocmVhZCwgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gbVJlY29yZDsKICAgICB9OwogCi1wcml2YXRlOgotICAgIGNvbnN0IHdwPEF1ZGlvRmxpbmdlcj4gICAgICBtQXVkaW9GbGluZ2VyOwotICAgIFNvcnRlZFZlY3RvciA8UGF0Y2ggKj4gICAgICBtUGF0Y2hlczsKKyAgICBBdWRpb0h3RGV2aWNlKiBmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpOworICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gZmluZEh3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSk7CisgICAgdm9pZCBhZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoCisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgIHZvaWQgcmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgIEF1ZGlvRmxpbmdlciAmbUF1ZGlvRmxpbmdlcjsKKyAgICBzdGQ6Om1hcDxhdWRpb19wYXRjaF9oYW5kbGVfdCwgUGF0Y2g+IG1QYXRjaGVzOworCisgICAgLy8gVGhpcyBtYXAgYWxsb3dzIGdvaW5nIGZyb20gYSB0aHJlYWQgdG8gImRvd25zdHJlYW0iIHNvZnR3YXJlIHBhdGNoZXMKKyAgICAvLyB3aGVuIGEgcHJvY2Vzc2luZyBtb2R1bGUgaW5zZXJ0ZWQgaW4gYmV0d2Vlbi4gRXhhbXBsZToKKyAgICAvLworICAgIC8vICBmcm9tIG1hcCB2YWx1ZS5zdHJlYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCBrZXkKKyAgICAvLyAgW01peGVyIHRocmVhZF0gLS0+IFtWaXJ0dWFsIG91dHB1dCBkZXZpY2VdIC0tPiBbUHJvY2Vzc2luZyBtb2R1bGVdIC0tLVwKKyAgICAvLyAgICAgICBbSGFyd2FyZSBtb2R1bGVdIDwtLSBbUGh5c2ljYWwgb3V0cHV0IGRldmljZV0gPC0tIFtTL1cgUGF0Y2hdIDwtLS8KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1hcCB2YWx1ZS5zd19wYXRjaGVzCisgICAgLy8KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgbWl4ZXIgdGhyZWFkIHRvIGxvb2sgdXAgdGhlIHRocmVhZHMgb2YgdGhlIHNvZnR3YXJlIHBhdGNoCisgICAgLy8gZm9yIHByb3BhZ2F0aW5nIHRpbWluZyBpbmZvLCBwYXJhbWV0ZXJzLCBldGMuCisgICAgLy8KKyAgICAvLyBUaGUgY3VycmVudCBhc3N1bXB0aW9ucyBhcmU6CisgICAgLy8gICAxKSBUaGUgcHJvY2Vzc2luZyBtb2R1bGUgYWN0cyBhcyBhIG1peGVyIHdpdGggc2V2ZXJhbCBvdXRwdXRzIHdoaWNoCisgICAgLy8gICAgICByZXByZXNlbnQgZGlmZmVyZW50bHkgZG93bm1peGVkIGFuZCAvIG9yIGVuY29kZWQgdmVyc2lvbnMgb2YgdGhlIHNhbWUKKyAgICAvLyAgICAgIG1peGVkIHN0cmVhbS4gVGhlcmUgaXMgbm8gMToxIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gdGhlIGlucHV0IHN0cmVhbXMKKyAgICAvLyAgICAgIGFuZCB0aGUgc29mdHdhcmUgcGF0Y2hlcywgYnV0IHJhdGhlciBhIE46TiBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuCisgICAgLy8gICAgICBhIGdyb3VwIG9mIHN0cmVhbXMgYW5kIGEgZ3JvdXAgb2YgcGF0Y2hlcy4KKyAgICAvLyAgIDIpIFRoZXJlIGFyZSBvbmx5IGEgY291cGxlIG9mIGluc2VydGVkIHByb2Nlc3NpbmcgbW9kdWxlcyBpbiB0aGUgc3lzdGVtLAorICAgIC8vICAgICAgc28gd2hlbiBsb29raW5nIGZvciBhIHN0cmVhbSBvciBwYXRjaCBoYW5kbGUgd2UgY2FuIGl0ZXJhdGUgb3ZlcgorICAgIC8vICAgICAgYWxsIG1vZHVsZXMuCisgICAgc3RydWN0IE1vZHVsZUNvbm5lY3Rpb25zIHsKKyAgICAgICAgc3RkOjpzZXQ8YXVkaW9faW9faGFuZGxlX3Q+IHN0cmVhbXM7CisgICAgICAgIHN0ZDo6c2V0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PiBzd19wYXRjaGVzOworICAgIH07CisgICAgc3RkOjptYXA8YXVkaW9fbW9kdWxlX2hhbmRsZV90LCBNb2R1bGVDb25uZWN0aW9ucz4gbUluc2VydGVkTW9kdWxlczsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCmluZGV4IGE3OGJlOTkuLjM1NzM3MGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCkBAIC00MSwyMiArNDEsMTUgQEAKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UcmFjaygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3Q7CiAKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBwYXVzZSgpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgZGVzdHJveSgpOwotICAgICAgICAgICAgaW50ICAgICAgICAgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0gICAgICAgICAgICB2b2lkICAgICAgICBzZXROYW1lKGludCBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtTmFtZSA+PSAwICYmIG5hbWUgPj0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcyBib3RoIG9sZCBuYW1lICVkIGFuZCBuZXcgbmFtZSAlZCBhcmUgdmFsaWQiLCBfX2Z1bmNfXywgbU5hbWUsIG5hbWUpOwotICAgICAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgICAgIH0KIAogICAgIHZpcnR1YWwgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0OwogCkBAIC02NSwxMiArNTgsMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDA7IH0KLSAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0KCkgY29uc3QgeyByZXR1cm4gKG1GbGFncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTdGF0aWMoKSBjb25zdCB7IHJldHVybiAgbVNoYXJlZEJ1ZmZlci5nZXQoKSAhPSBudWxscHRyOyB9CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0QXV4QnVmZmVyKGludCBFZmZlY3RJZCwgaW50MzJfdCAqYnVmZmVyKTsKICAgICAgICAgICAgIGludDMyX3QgICAgICphdXhCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtQXV4QnVmZmVyOyB9CkBAIC04Nyw2ICs4MywxMCBAQAogCiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAhPSAwOyB9CiAKKyAgICAgICAgICAgIGRvdWJsZSAgICAgIGJ1ZmZlckxhdGVuY3lNcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNTdGF0aWMoKSA/IDAuIDogVHJhY2tCYXNlOjpidWZmZXJMYXRlbmN5TXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogLy8gaW1wbGVtZW50IHZvbHVtZSBoYW5kbGluZy4KICAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLApAQCAtMTExLDYgKzExMSwyNiBAQAogICAgIC8qKiBDb3B5IHRoZSB0cmFjayBtZXRhZGF0YSBpbiB0aGUgcHJvdmlkZWQgaXRlcmF0b3IuIFRocmVhZCBzYWZlLiAqLwogICAgIHZpcnR1YWwgdm9pZCAgICBjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0OwogCisgICAgICAgICAgICAvKiogUmV0dXJuIGhhcHRpYyBwbGF5YmFjayBvZiB0aGUgdHJhY2sgaXMgZW5hYmxlZCBvciBub3QsIHVzZWQgaW4gbWl4ZXIuICovCisgICAgICAgICAgICBib29sICAgIGdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7IH0KKyAgICAgICAgICAgIC8qKiBTZXQgaGFwdGljIHBsYXliYWNrIG9mIHRoZSB0cmFjayBpcyBlbmFibGVkIG9yIG5vdCwgc2hvdWxkIGJlCisgICAgICAgICAgICAgKiAgc2V0IGFmdGVyIHF1ZXJ5IG9yIGdldCBjYWxsYmFjayBmcm9tIHZpYnJhdG9yIHNlcnZpY2UgKi8KKyAgICAgICAgICAgIHZvaWQgICAgc2V0SGFwdGljUGxheWJhY2tFbmFibGVkKGJvb2wgaGFwdGljUGxheWJhY2tFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgbUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKiBSZXR1cm4gYXQgd2hhdCBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWNzLCB1c2VkIGluIG1peGVyLiAqLworICAgICAgICAgICAgQXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90IGdldEhhcHRpY0ludGVuc2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1IYXB0aWNJbnRlbnNpdHk7IH0KKyAgICAgICAgICAgIC8qKiBTZXQgaW50ZW5zaXR5IG9mIGhhcHRpYyBwbGF5YmFjaywgc2hvdWxkIGJlIHNldCBhZnRlciBxdWVyeWluZyB2aWJyYXRvciBzZXJ2aWNlLiAqLworICAgICAgICAgICAgdm9pZCAgICBzZXRIYXB0aWNJbnRlbnNpdHkoQXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICAgICAgICAgIGlmIChBdWRpb01peGVyOjppc1ZhbGlkSGFwdGljSW50ZW5zaXR5KGhhcHRpY0ludGVuc2l0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhhcHRpY0ludGVuc2l0eSA9IGhhcHRpY0ludGVuc2l0eTsKKyAgICAgICAgICAgICAgICAgICAgc2V0SGFwdGljUGxheWJhY2tFbmFibGVkKG1IYXB0aWNJbnRlbnNpdHkgIT0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4gZ2V0RXh0ZXJuYWxWaWJyYXRpb24oKSBjb25zdCB7IHJldHVybiBtRXh0ZXJuYWxWaWJyYXRpb247IH0KKworICAgICAgICAgICAgdm9pZCAgICBzZXRUZWVQYXRjaGVzKFRlZVBhdGNoZXMgdGVlUGF0Y2hlcyk7CisKIHByb3RlY3RlZDoKICAgICAvLyBmb3IgbnVtZXJvdXMKICAgICBmcmllbmQgY2xhc3MgUGxheWJhY2tUaHJlYWQ7CkBAIC0xMjEsOCArMTQxLDggQEAKICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHJhY2spOwogCiAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOwotICAgIC8vIHJlbGVhc2VCdWZmZXIoKSBub3Qgb3ZlcnJpZGRlbgorICAgIHN0YXR1c190IGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikgb3ZlcnJpZGU7CiAKICAgICAvLyBFeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiAgICAgdmlydHVhbCBzaXplX3QgZnJhbWVzUmVhZHkoKSBjb25zdDsKQEAgLTE0MCw3ICsxNjAsNyBAQAogICAgIGJvb2wgaXNSZXN1bWVQZW5kaW5nKCk7CiAgICAgdm9pZCByZXN1bWVBY2soKTsKICAgICB2b2lkIHVwZGF0ZVRyYWNrRnJhbWVJbmZvKGludDY0X3QgdHJhY2tGcmFtZXNSZWxlYXNlZCwgaW50NjRfdCBzaW5rRnJhbWVzV3JpdHRlbiwKLSAgICAgICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApOworICAgICAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCk7CiAKICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CiAKQEAgLTE3MSw3ICsxOTEsNiBAQAogCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzZXREb25lOwogICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtTmFtZTsKICAgICBlZmZlY3RfYnVmZmVyX3QgICAgICptTWFpbkJ1ZmZlcjsKIAogICAgIGludDMyX3QgICAgICAgICAgICAgKm1BdXhCdWZmZXI7CkBAIC0xODgsNyArMjA3LDI5IEBACiAKICAgICBzcDxtZWRpYTo6Vm9sdW1lSGFuZGxlcj4gIG1Wb2x1bWVIYW5kbGVyOyAvLyBoYW5kbGVzIG11bHRpcGxlIFZvbHVtZVNoYXBlciBjb25maWdzIGFuZCBvcGVyYXRpb25zCiAKKyAgICBib29sICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsgLy8gaW5kaWNhdGVzIGhhcHRpYyBwbGF5YmFjayBlbmFibGVkIG9yIG5vdAorICAgIC8vIGludGVuc2l0eSB0byBwbGF5IGhhcHRpYyBkYXRhCisgICAgQXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90IG1IYXB0aWNJbnRlbnNpdHkgPSBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsKKyAgICBjbGFzcyBBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIgOiBwdWJsaWMgb3M6OkJuRXh0ZXJuYWxWaWJyYXRpb25Db250cm9sbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcihUcmFjayogdHJhY2spIDogbVRyYWNrKHRyYWNrKSB7fQorICAgICAgICBiaW5kZXI6OlN0YXR1cyBtdXRlKC8qb3V0Ki8gYm9vbCAqcmV0KSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgdW5tdXRlKC8qb3V0Ki8gYm9vbCAqcmV0KSBvdmVycmlkZTsKKyAgICBwcml2YXRlOgorICAgICAgICBUcmFjayogY29uc3QgbVRyYWNrOworICAgIH07CisgICAgc3A8QXVkaW9WaWJyYXRpb25Db250cm9sbGVyPiBtQXVkaW9WaWJyYXRpb25Db250cm9sbGVyOworICAgIHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4gICAgbUV4dGVybmFsVmlicmF0aW9uOworCiBwcml2YXRlOgorICAgIHZvaWQgICAgICAgICAgICAgICAgaW50ZXJjZXB0QnVmZmVyKGNvbnN0IEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYnVmZmVyKTsKKyAgICAvKiogV3JpdGUgdGhlIHNvdXJjZSBkYXRhIGluIHRoZSBidWZmZXIgcHJvdmlkZXIuIEByZXR1cm4gd3JpdHRlbiBmcmFtZSBjb3VudC4gKi8KKyAgICBzaXplX3QgICAgICAgICAgICAgIHdyaXRlRnJhbWVzKEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGRlc3QsIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IGZyYW1lQ291bnQpOworICAgIHRlbXBsYXRlIDxjbGFzcyBGPgorICAgIHZvaWQgICAgICAgICAgICAgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soRiBmKSB7CisgICAgICAgIGZvciAoYXV0byYgdHAgOiBtVGVlUGF0Y2hlcykgeyBmKHRwLnBhdGNoVHJhY2spOyB9CisgICAgfTsKKwogICAgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IGZvciBmYXN0IHRyYWNrcywgYW5kIHNob3VsZCBiZSBpbiBhIHN1YmNsYXNzCiAgICAgaW50ICAgICAgICAgICAgICAgICBtRmFzdEluZGV4OyAvLyBpbmRleCB3aXRoaW4gRmFzdE1peGVyU3RhdGU6Om1GYXN0VHJhY2tzW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlaXRoZXIgbUZhc3RJbmRleCA9PSAtMSBpZiBub3QgaXNGYXN0VHJhY2soKQpAQCAtMjA4LDYgKzI0OSw3IEBACiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOwogICAgIC8vIElmIHRoZSBsYXN0IHRyYWNrIGNoYW5nZSB3YXMgbm90aWZpZWQgdG8gdGhlIGNsaWVudCB3aXRoIHJlYWRBbmRDbGVhckhhc0NoYW5nZWQKICAgICBzdGQ6OmF0b21pY19mbGFnICAgICBtQ2hhbmdlTm90aWZpZWQgPSBBVE9NSUNfRkxBR19JTklUOworICAgIFRlZVBhdGNoZXMgIG1UZWVQYXRjaGVzOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCiAKQEAgLTIzMyw3ICsyNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uID0gQVVESU9fU0VTU0lPTl9OT05FKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgIGJvb2wgICAgICAgIHdyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcyk7CisgICAgICAgICAgICBzc2l6ZV90ICAgICB3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpOwogICAgICAgICAgICAgYm9vbCAgICAgICAgYnVmZmVyUXVldWVFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJRdWV1ZS5zaXplKCkgPT0gMDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNBY3RpdmUoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlOyB9CiAgICAgY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1UaHJlYWQ7IH0KQEAgLTI0MSw2ICsyODMsMTggQEAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGNvcHlNZXRhZGF0YVRvKE1ldGFkYXRhSW5zZXJ0ZXImIGJhY2tJbnNlcnRlcikgY29uc3Qgb3ZlcnJpZGU7CiAgICAgLyoqIFNldCB0aGUgbWV0YWRhdGFzIG9mIHRoZSB1cHN0cmVhbSB0cmFja3MuIFRocmVhZCBzYWZlLiAqLwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWV0YWRhdGFzKGNvbnN0IFNvdXJjZU1ldGFkYXRhcyYgbWV0YWRhdGFzKTsKKyAgICAvKiogcmV0dXJucyBjbGllbnQgdGltZXN0YW1wIHRvIHRoZSB1cHN0cmVhbSBkdXBsaWNhdGluZyB0aHJlYWQuICovCisgICAgRXh0ZW5kZWRUaW1lc3RhbXAgICBnZXRDbGllbnRQcm94eVRpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIgLSBrZXJuZWwgZGlmZmVyZW5jZSBpcyBub3QgdHJ1ZSBsYXRlbmN5IHdoZW4gZHJhaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZS4gbVNlcnZlclByb3h5LT5pc0RyYWluZWQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG1DbGllbnRQcm94eS0+Z2V0VGltZXN0YW1wKCZ0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3MsIHRoZSB0aW1lc3RhbXAgTE9DQVRJT05fU0VSVkVSIGFuZCBMT0NBVElPTl9LRVJORUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIHdpbGwgYmUgcHJvcGVybHkgZmlsbGVkLiBJZiBnZXRUaW1lc3RhbXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuc3VjY2Vzc2Z1bCwgdGhlbiBhIGRlZmF1bHQgaW5pdGlhbGl6ZWQgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdpdGggbVRpbWVOc1tdIGZpbGxlZCB3aXRoIC0xJ3MpIGlzIHJldHVybmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3QgICAgICAgICAgICBvYnRhaW5CdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsCkBAIC0yNTcsNiArMzExLDcgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZTsKICAgICBEdXBsaWNhdGluZ1RocmVhZCogY29uc3QgICAgbVNvdXJjZVRocmVhZDsgLy8gZm9yIHdhaXRUaW1lTXMoKSBpbiB3cml0ZSgpCiAgICAgc3A8QXVkaW9UcmFja0NsaWVudFByb3h5PiAgIG1DbGllbnRQcm94eTsKKwogICAgIC8qKiBBdHRyaWJ1dGVzIG9mIHRoZSBzb3VyY2UgdHJhY2tzLgogICAgICAqCiAgICAgICogVGhpcyBtZW1iZXIgbXVzdCBiZSBhY2Nlc3NlZCB3aXRoIG1UcmFja01ldGFkYXRhc011dGV4IHRha2VuLgpAQCAtMjc0LDcgKzMyOSw3IEBACiB9OyAgLy8gZW5kIG9mIE91dHB1dFRyYWNrCiAKIC8vIHBsYXliYWNrIHRyYWNrLCB1c2VkIGJ5IFBhdGNoUGFuZWwKLWNsYXNzIFBhdGNoVHJhY2sgOiBwdWJsaWMgVHJhY2ssIHB1YmxpYyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgeworY2xhc3MgUGF0Y2hUcmFjayA6IHB1YmxpYyBUcmFjaywgcHVibGljIFBhdGNoVHJhY2tCYXNlIHsKIHB1YmxpYzoKIAogICAgICAgICAgICAgICAgICAgICAgICAgUGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCkBAIC0yODUsNyArMzQwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQgPSB7fSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGF0Y2hUcmFjaygpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KQEAgLTMwMSwxMiArMzU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVPdXQgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyKTsKIAotICAgICAgICAgICAgdm9pZCBzZXRQZWVyUHJveHkoUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyICpwcm94eSkgeyBtUGVlclByb3h5ID0gcHJveHk7IH0KLQogcHJpdmF0ZToKICAgICAgICAgICAgIHZvaWQgcmVzdGFydElmRGlzYWJsZWQoKTsKIAotICAgIHNwPENsaWVudFByb3h5PiAgICAgICAgICAgICBtUHJveHk7Ci0gICAgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyKiAgIG1QZWVyUHJveHk7Ci0gICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgICAgIG1QZWVyVGltZW91dDsKIH07ICAvLyBlbmQgb2YgUGF0Y2hUcmFjawpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IGZjMmRiYmIuLmFiNGFmMzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgICAgIGJvb2wgICAgICAgIHNldE92ZXJmbG93KCkgeyBib29sIHRtcCA9IG1PdmVyZmxvdzsgbU92ZXJmbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bXA7IH0KIAotICAgIHN0YXRpYyAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwpAQCAtNjMsMTIgKzYzLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZXN0YW1wKTsKIAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSAhPSAwOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQogCiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRTaWxlbmNlZChib29sIHNpbGVuY2VkKSB7IGlmICghaXNQYXRjaFRyYWNrKCkpIG1TaWxlbmNlZCA9IHNpbGVuY2VkOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbVNpbGVuY2VkOyB9CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAorICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKKyAgICBzdGF0aWMgIGJvb2wgICAgICAgIGNoZWNrU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKSA9PSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAvLyBmb3IgbVN0YXRlCiAKQEAgLTEwMiw3ICsxMTMsNyBAQAogfTsKIAogLy8gcGxheWJhY2sgdHJhY2ssIHVzZWQgYnkgUGF0Y2hQYW5lbAotY2xhc3MgUGF0Y2hSZWNvcmQgOiB2aXJ0dWFsIHB1YmxpYyBSZWNvcmRUcmFjaywgcHVibGljIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciB7CitjbGFzcyBQYXRjaFJlY29yZCA6IHB1YmxpYyBSZWNvcmRUcmFjaywgcHVibGljIFBhdGNoVHJhY2tCYXNlIHsKIHB1YmxpYzoKIAogICAgIFBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLApAQCAtMTEyLDcgKzEyMyw4IEBACiAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCA9IHt9KTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFJlY29yZCgpOwogCiAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKQEAgLTEyMywxMSArMTM1LDQgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIgKmJ1ZmZlcik7Ci0KLSAgICB2b2lkIHNldFBlZXJQcm94eShQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgKnByb3h5KSB7IG1QZWVyUHJveHkgPSBwcm94eTsgfQotCi1wcml2YXRlOgotICAgIHNwPENsaWVudFByb3h5PiAgICAgICAgICAgICBtUHJveHk7Ci0gICAgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyKiAgIG1QZWVyUHJveHk7Ci0gICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgICAgIG1QZWVyVGltZW91dDsKIH07ICAvLyBlbmQgb2YgUGF0Y2hSZWNvcmQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNjdlYS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgotCi0vKiBXaGVuIHBlcmZvcm1pbmcgcGVybWlzc2lvbiBjaGVja3Mgd2UgZG8gbm90IHVzZSBwZXJtaXNzaW9uIGNhY2hlIGZvcgotICogcnVudGltZSBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBkYW5nZXJvdXMpIGFzIHRoZXkgbWF5IGNoYW5nZSBhdAotICogcnVudGltZS4gQWxsIG90aGVyIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIG5vcm1hbCBhbmQgZGFuZ2Vyb3VzKQotICogY2FuIGJlIGNhY2hlZCBhcyB0aGV5IG5ldmVyIGNoYW5nZS4gT2YgY291cnNlIGFsbCBwZXJtaXNzaW9uIGNoZWNrZWQKLSAqIGhlcmUgYXJlIHBsYXRmb3JtIGRlZmluZWQuCi0gKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgU3RyaW5nMTYgc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8oImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKLQotLy8gTm90IHZhbGlkIHVudGlsIGluaXRpYWxpemVkIGJ5IEF1ZGlvRmxpbmdlciBjb25zdHJ1Y3Rvci4gIEl0IHdvdWxkIGhhdmUgdG8gYmUKLS8vIHJlLWluaXRpYWxpemVkIGlmIHRoZSBwcm9jZXNzIGNvbnRhaW5pbmcgQXVkaW9GbGluZ2VyIHNlcnZpY2UgZm9ya3MgKHdoaWNoIGl0IGRvZXNuJ3QpLgotLy8gVGhpcyBpcyBvZnRlbiB1c2VkIHRvIHZhbGlkYXRlIGJpbmRlciBpbnRlcmZhY2UgY2FsbHMgd2l0aGluIGF1ZGlvc2VydmVyCi0vLyAoZS5nLiBBdWRpb1BvbGljeU1hbmFnZXIgdG8gQXVkaW9GbGluZ2VyKS4KLXBpZF90IGdldHBpZF9jYWNoZWQ7Ci0KLS8vIEEgdHJ1c3RlZCBjYWxsaW5nIFVJRCBtYXkgc3BlY2lmeSB0aGUgY2xpZW50IFVJRCBhcyBwYXJ0IG9mIGEgYmluZGVyIGludGVyZmFjZSBjYWxsLgotLy8gb3RoZXJ3aXNlIHRoZSBjYWxsaW5nIFVJRCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjbGllbnQgVUlELgotYm9vbCBpc1RydXN0ZWRDYWxsaW5nVWlkKHVpZF90IHVpZCkgewotICAgIHN3aXRjaCAodWlkKSB7Ci0gICAgY2FzZSBBSURfTUVESUE6Ci0gICAgY2FzZSBBSURfQVVESU9TRVJWRVI6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBTdHJpbmcxNiByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoUGVybWlzc2lvbkNvbnRyb2xsZXImIHBlcm1pc3Npb25Db250cm9sbGVyLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7Ci0gICAgaWYgKG9wUGFja2FnZU5hbWUuc2l6ZSgpID4gMCkgewotICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsKLSAgICB9Ci0gICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgY2FsbGluZyBjb2RlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgaXQgcnVucyB1bmRlci4KLSAgICAvLyBGb3IgZXhhbXBsZSwgY29kZSB1c2luZyB0aGUgd2lsaGVsbSBmcmFtZXdvcmsncyBPcGVuU0wtRVMgQVBJcy4gSW4gdGhpcwotICAgIC8vIGNhc2Ugd2Ugd2lsbCBnZXQgdGhlIHBhY2thZ2VzIGZvciB0aGUgY2FsbGluZyBVSUQgYW5kIHBpY2sgdGhlIGZpcnN0IG9uZQotICAgIC8vIGZvciBhdHRyaWJ1dGluZyB0aGUgYXBwIG9wLiBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIHJ1bnRpbWUgcGVybWlzc2lvbnMKLSAgICAvLyBhcyBmb3IgbGVnYWN5IGFwcHMgd2Ugd2lsbCB0b2dnbGUgdGhlIGFwcCBvcCBmb3IgYWxsIHBhY2thZ2VzIGluIHRoZSBVSUQuCi0gICAgLy8gVGhlIGNhdmVhdCBpcyB0aGF0IHRoZSBvcGVyYXRpb24gbWF5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdyb25nIHBhY2thZ2UgYW5kCi0gICAgLy8gc3RhdHMgYmFzZWQgb24gYXBwIG9wcyBtYXkgYmUgc2xpZ2h0bHkgb2ZmLgotICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7Ci0gICAgcGVybWlzc2lvbkNvbnRyb2xsZXIuZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7Ci0gICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIHVpZCAlZCIsIHVpZCk7Ci0gICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOyAvLyBlbXB0eSBzdHJpbmcKLSAgICB9Ci0gICAgcmV0dXJuIHBhY2thZ2VzWzBdOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yUm9vdCh1aWRfdCB1aWQpIHsKLSAgICAvLyBBSURfUk9PVCBpcyBPSyBmb3IgY29tbWFuZC1saW5lIHRlc3RzLiAgTmF0aXZlIHVuZm9ya2VkIGF1ZGlvc2VydmVyIGFsd2F5cyBPSy4KLSAgICByZXR1cm4gdWlkID09IEFJRF9ST09UIHx8IHVpZCA9PSBBSURfQVVESU9TRVJWRVIgOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja1JlY29yZGluZ0ludGVybmFsKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsCi0gICAgICAgIHVpZF90IHVpZCwgYm9vbCBzdGFydCkgewotICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgotICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KLSAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdCh1aWQpKSByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIFdlIHNwZWNpZnkgYSBwaWQgYW5kIHVpZCBoZXJlIGFzIG1lZGlhc2VydmVyIChha2EgTWVkaWFSZWNvcmRlciBvciBTdGFnZUZyaWdodFJlY29yZGVyKQotICAgIC8vIG1heSBvcGVuIGEgcmVjb3JkIHRyYWNrIG9uIGJlaGFsZiBvZiBhIGNsaWVudC4gIE5vdGUgdGhhdCBwaWQgbWF5IGJlIGEgdGlkLgotICAgIC8vIElNUE9SVEFOVDogRE9OJ1QgVVNFIFBlcm1pc3Npb25DYWNoZSAtIFJVTlRJTUUgUEVSTUlTU0lPTlMgQ0hBTkdFLgotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOwotICAgIGNvbnN0IGJvb2wgb2sgPSBwZXJtaXNzaW9uQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24oc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8sIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbykuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCi0gICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKLSAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKLSAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7Ci0gICAgaWYgKHN0YXJ0KSB7Ci0gICAgICAgIGlmIChhcHBPcHMuc3RhcnRPcE5vVGhyb3cob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKQotICAgICAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewotICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYXBwT3BzLm5vdGVPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewotICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gZmFsc2UpOwotfQotCi1ib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIHRydWUpOwotfQotCi12b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7Ci0gICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCi0gICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgotICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290KHVpZCkpIHJldHVybjsKLQotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOwotICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKLSAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOwotICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwotICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKLSAgICBhcHBPcHMuZmluaXNoT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKTsKLX0KLQotYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVBdWRpb091dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7Ci0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQsIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgLy8gQ0FQVFVSRV9BVURJT19IT1RXT1JEIHBlcm1pc3Npb24gaW1wbGllcyBSRUNPUkRfQVVESU8gcGVybWlzc2lvbgotICAgIGJvb2wgb2sgPSByZWNvcmRpbmdBbGxvd2VkKFN0cmluZzE2KCIiKSwgcGlkLCB1aWQpOwotCi0gICAgaWYgKG9rKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOwotICAgIH0KLSAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBzZXR0aW5nc0FsbG93ZWQoKSB7Ci0gICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0F1ZGlvU2V0dGluZ3MoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0F1ZGlvU2V0dGluZ3MpOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpIHsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBkdW1wQWxsb3dlZCgpIHsKLSAgICAvLyBkb24ndCBvcHRpbWl6ZSBmb3Igc2FtZSBwaWQsIHNpbmNlIG1lZGlhc2VydmVyIG5ldmVyIGR1bXBzIGl0c2VsZgotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0R1bXApOwotICAgIC8vIGNvbnZlbnRpb24gaXMgZm9yIGNhbGxlciB0byBkdW1wIGFuIGVycm9yIG1lc3NhZ2UgdG8gZmQgaW5zdGVhZCBvZiBsb2dnaW5nIGhlcmUKLSAgICAvL2lmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlQaG9uZVN0YXRlKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7Ci0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNNb2RpZnlQaG9uZVN0YXRlLCBwaWQsIHVpZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOwotICAgIHJldHVybiBvazsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWFkYTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1leHRlcm4gcGlkX3QgZ2V0cGlkX2NhY2hlZDsKLWJvb2wgaXNUcnVzdGVkQ2FsbGluZ1VpZCh1aWRfdCB1aWQpOwotYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci12b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKTsKLWJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIHNldHRpbmdzQWxsb3dlZCgpOwotYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7Ci1ib29sIGR1bXBBbGxvd2VkKCk7Ci1ib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCBjMjMyMGJjLi4zZWNiMzdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CkBAIC0zNiw2ICszOCw4IEBACiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CYWxhbmNlLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgpAQCAtNjIsOCArNjYsOCBAQAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgotI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgpAQCAtNzEsNyArNzUsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19DUFVfVVNBR0UKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKIApAQCAtMjAwLDcgKzIwNCw3IEBACiAvLyBJbml0aWFsbHkgdGhpcyBoZWFwIGlzIHVzZWQgdG8gYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMgZm9yICJmYXN0IiBBdWRpb1JlY29yZC4KIC8vIEV2ZW50dWFsbHkgaXQgd2lsbCBiZSB0aGUgc2luZ2xlIGJ1ZmZlciB0aGF0IEZhc3RDYXB0dXJlIHdyaXRlcyBpbnRvIHZpYSBIQUwgcmVhZCgpLAogLy8gYW5kIHRoYXQgYWxsICJmYXN0IiBBdWRpb1JlY29yZCBjbGllbnRzIHJlYWQgZnJvbS4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2l6ZSBjYW4gYmUgc21hbGwuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplID0gMHg0MDAwOworc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4RDAwMDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMzMsOSArMzM3LDkgQEAKICNpZmRlZiBERUJVR19DUFVfVVNBR0UKIHByaXZhdGU6CiAgICAgVGhyZWFkQ3B1VXNhZ2UgbUNwdVVzYWdlOyAgICAgICAgICAgLy8gaW5zdGFudGFuZW91cyB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIG1XY1N0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbVdjU3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiB3YWxsIGNsb2NrIG5zCiAKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIG1IelN0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gY3ljbGVzCisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtSHpTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIGN5Y2xlcwogCiAgICAgaW50IG1DcHVOdW07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkJ3MgY3VycmVudCBDUFUgbnVtYmVyCiAgICAgaW50IG1DcHVrSHo7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlcXVlbmN5IG9mIHRocmVhZCdzIGN1cnJlbnQgQ1BVIGluIGtIegpAQCAtMzYxLDcgKzM2NSw3IEBACiAKICAgICAvLyByZWNvcmQgc2FtcGxlIGZvciB3YWxsIGNsb2NrIHN0YXRpc3RpY3MKICAgICBpZiAodmFsaWQpIHsKLSAgICAgICAgbVdjU3RhdHMuc2FtcGxlKHdjTnMpOworICAgICAgICBtV2NTdGF0cy5hZGQod2NOcyk7CiAgICAgfQogCiAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IENQVSBudW1iZXIKQEAgLTM4MCwyNiArMzg0LDI2IEBACiAKICAgICAvLyBpZiBubyBjaGFuZ2UgaW4gQ1BVIG51bWJlciBvciBmcmVxdWVuY3ksIHRoZW4gcmVjb3JkIHNhbXBsZSBmb3IgY3ljbGUgc3RhdGlzdGljcwogICAgIGlmICh2YWxpZCAmJiBtQ3B1a0h6ID4gMCkgewotICAgICAgICBkb3VibGUgY3ljbGVzID0gd2NOcyAqIGNwdWtIeiAqIDAuMDAwMDAxOwotICAgICAgICBtSHpTdGF0cy5zYW1wbGUoY3ljbGVzKTsKKyAgICAgICAgY29uc3QgZG91YmxlIGN5Y2xlcyA9IHdjTnMgKiBjcHVrSHogKiAwLjAwMDAwMTsKKyAgICAgICAgbUh6U3RhdHMuYWRkKGN5Y2xlcyk7CiAgICAgfQogCi0gICAgdW5zaWduZWQgbiA9IG1XY1N0YXRzLm4oKTsKKyAgICBjb25zdCB1bnNpZ25lZCBuID0gbVdjU3RhdHMuZ2V0TigpOwogICAgIC8vIG1DcHVVc2FnZS5lbGFwc2VkKCkgaXMgZXhwZW5zaXZlLCBzbyBkb24ndCBjYWxsIGl0IGV2ZXJ5IGxvb3AKICAgICBpZiAoKG4gJiAxMjcpID09IDEpIHsKLSAgICAgICAgbG9uZyBsb25nIGVsYXBzZWQgPSBtQ3B1VXNhZ2UuZWxhcHNlZCgpOworICAgICAgICBjb25zdCBsb25nIGxvbmcgZWxhcHNlZCA9IG1DcHVVc2FnZS5lbGFwc2VkKCk7CiAgICAgICAgIGlmIChlbGFwc2VkID49IERFQlVHX0NQVV9VU0FHRSAqIDEwMDAwMDAwMDBMTCkgewotICAgICAgICAgICAgZG91YmxlIHBlckxvb3AgPSBlbGFwc2VkIC8gKGRvdWJsZSkgbjsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wMTAwID0gcGVyTG9vcCAqIDAuMDE7Ci0gICAgICAgICAgICBkb3VibGUgcGVyTG9vcDFrID0gcGVyTG9vcCAqIDAuMDAxOwotICAgICAgICAgICAgZG91YmxlIG1lYW4gPSBtV2NTdGF0cy5tZWFuKCk7Ci0gICAgICAgICAgICBkb3VibGUgc3RkZGV2ID0gbVdjU3RhdHMuc3RkZGV2KCk7Ci0gICAgICAgICAgICBkb3VibGUgbWluaW11bSA9IG1XY1N0YXRzLm1pbmltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhpbXVtID0gbVdjU3RhdHMubWF4aW11bSgpOwotICAgICAgICAgICAgZG91YmxlIG1lYW5DeWNsZXMgPSBtSHpTdGF0cy5tZWFuKCk7Ci0gICAgICAgICAgICBkb3VibGUgc3RkZGV2Q3ljbGVzID0gbUh6U3RhdHMuc3RkZGV2KCk7Ci0gICAgICAgICAgICBkb3VibGUgbWluQ3ljbGVzID0gbUh6U3RhdHMubWluaW11bSgpOwotICAgICAgICAgICAgZG91YmxlIG1heEN5Y2xlcyA9IG1IelN0YXRzLm1heGltdW0oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwZXJMb29wID0gZWxhcHNlZCAvIChkb3VibGUpIG47CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcGVyTG9vcDEwMCA9IHBlckxvb3AgKiAwLjAxOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBlckxvb3AxayA9IHBlckxvb3AgKiAwLjAwMTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtZWFuID0gbVdjU3RhdHMuZ2V0TWVhbigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHN0ZGRldiA9IG1XY1N0YXRzLmdldFN0ZERldigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1pbmltdW0gPSBtV2NTdGF0cy5nZXRNaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhpbXVtID0gbVdjU3RhdHMuZ2V0TWF4KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhbkN5Y2xlcyA9IG1IelN0YXRzLmdldE1lYW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzdGRkZXZDeWNsZXMgPSBtSHpTdGF0cy5nZXRTdGREZXYoKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5DeWNsZXMgPSBtSHpTdGF0cy5nZXRNaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhDeWNsZXMgPSBtSHpTdGF0cy5nZXRNYXgoKTsKICAgICAgICAgICAgIG1DcHVVc2FnZS5yZXNldEVsYXBzZWQoKTsKICAgICAgICAgICAgIG1XY1N0YXRzLnJlc2V0KCk7CiAgICAgICAgICAgICBtSHpTdGF0cy5yZXNldCgpOwpAQCAtNDUzLDUwICs0NTcsNiBAQAogICAgIH0KIH0KIAotc3RkOjpzdHJpbmcgZGV2aWNlc1RvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBpZiAoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9CSVRfSU4pIHsKLSAgICAgICAgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGRldmljZXMsIHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0ZDo6c3RyaW5nIGlucHV0RmxhZ3NUb1N0cmluZyhhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhmbGFncywgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnN0cmluZyBvdXRwdXRGbGFnc1RvU3RyaW5nKGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZmxhZ3MsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY29uc3QgY2hhciAqc291cmNlVG9TdHJpbmcoYXVkaW9fc291cmNlX3Qgc291cmNlKQotewotICAgIHN3aXRjaCAoc291cmNlKSB7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDogICAgICAgICAgICAgIHJldHVybiAiZGVmYXVsdCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOiAgICAgICAgICAgICAgICAgIHJldHVybiAibWljIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6ICAgICAgICAgcmV0dXJuICJ2b2ljZSB1cGxpbmsiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOiAgICAgICByZXR1cm4gInZvaWNlIGRvd25saW5rIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOiAgICAgICAgICAgcmV0dXJuICJ2b2ljZSBjYWxsIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6ICAgICAgICAgICAgcmV0dXJuICJjYW1jb3JkZXIiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOiAgICByZXR1cm4gInZvaWNlIHJlY29nbml0aW9uIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOiAgcmV0dXJuICJ2b2ljZSBjb21tdW5pY2F0aW9uIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOiAgICAgICAgcmV0dXJuICJyZW1vdGUgc3VibWl4IjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDogICAgICAgICAgcmV0dXJuICJ1bnByb2Nlc3NlZCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6ICAgICAgICAgICAgIHJldHVybiAiRk0gdHVuZXIiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6ICAgICAgICAgICAgICByZXR1cm4gImhvdHdvcmQiOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24iOwotICAgIH0KLX0KLQogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUaHJlYWRCYXNlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgYXVkaW9faW9faGFuZGxlX3QgaWQsCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpCiAgICAgOiAgIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLApAQCAtNTI4LDYgKzQ4OCw4IEBACiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Qb3dlck1hbmFnZXIpOwogICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKICAgICB9CisKKyAgICBzZW5kU3RhdGlzdGljcyh0cnVlIC8qIGZvcmNlICovKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpyZWFkeVRvUnVuKCkKQEAgLTYxMSw2ICs1NzMsMTUgQEAKIC8vIHNlbmRJb0NvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKQogeworICAgIC8vIFRoZSBhdWRpbyBzdGF0aXN0aWNzIGhpc3RvcnkgaXMgZXhwb25lbnRpYWxseSB3ZWlnaHRlZCB0byBmb3JnZXQgZXZlbnRzCisgICAgLy8gYWJvdXQgZml2ZSBvciBtb3JlIHNlY29uZHMgaW4gdGhlIHBhc3QuICBJbiBvcmRlciB0byBoYXZlCisgICAgLy8gY3Jpc3BlciBzdGF0aXN0aWNzIGZvciBtZWRpYW1ldHJpY3MsIHdlIHJlc2V0IHRoZSBzdGF0aXN0aWNzIG9uCisgICAgLy8gYW4gSW9Db25maWdFdmVudCwgdG8gcmVmbGVjdCBkaWZmZXJlbnQgcHJvcGVydGllcyBmb3IgYSBuZXcgZGV2aWNlLgorICAgIG1Jb0ppdHRlck1zLnJlc2V0KCk7CisgICAgbUxhdGVuY3lNcy5yZXNldCgpOworICAgIG1Qcm9jZXNzVGltZU1zLnJlc2V0KCk7CisgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKwogICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBJb0NvbmZpZ0V2ZW50KGV2ZW50LCBwaWQpOwogICAgIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKIH0KQEAgLTcxMSw4ICs2ODIsOCBAQAogICAgICAgICAgICAgZXZlbnQtPm1TdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoX2woJmRhdGEtPm1QYXRjaCwgJmRhdGEtPm1IYW5kbGUpOwogICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZSgpOwogICAgICAgICAgICAgbUxvY2FsTG9nLmxvZygiQ0ZHX0VWRU5UX0NSRUFURV9BVURJT19QQVRDSDogb2xkIGRldmljZSAlI3ggKCVzKSBuZXcgZGV2aWNlICUjeCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW9sZERldmljZSwgZGV2aWNlc1RvU3RyaW5nKG9sZERldmljZSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW5ld0RldmljZSwgZGV2aWNlc1RvU3RyaW5nKG5ld0RldmljZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClvbGREZXZpY2UsIHRvU3RyaW5nKG9sZERldmljZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW5ld0RldmljZSwgdG9TdHJpbmcobmV3RGV2aWNlKS5jX3N0cigpKTsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDRkdfRVZFTlRfUkVMRUFTRV9BVURJT19QQVRDSDogewogICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IG9sZERldmljZSA9IGdldERldmljZSgpOwpAQCAtNzIxLDggKzY5Miw4IEBACiAgICAgICAgICAgICBldmVudC0+bVN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoX2woZGF0YS0+bUhhbmRsZSk7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlKCk7CiAgICAgICAgICAgICBtTG9jYWxMb2cubG9nKCJDRkdfRVZFTlRfUkVMRUFTRV9BVURJT19QQVRDSDogb2xkIGRldmljZSAlI3ggKCVzKSBuZXcgZGV2aWNlICUjeCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW9sZERldmljZSwgZGV2aWNlc1RvU3RyaW5nKG9sZERldmljZSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW5ld0RldmljZSwgZGV2aWNlc1RvU3RyaW5nKG5ld0RldmljZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClvbGREZXZpY2UsIHRvU3RyaW5nKG9sZERldmljZSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW5ld0RldmljZSwgdG9TdHJpbmcobmV3RGV2aWNlKS5jX3N0cigpKTsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAicHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKQEAgLTc0OSw2ICs3MjAsNyBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihtYXNrKTsKIAogICAgIHN3aXRjaCAocmVwcmVzZW50YXRpb24pIHsKKyAgICAvLyBUcmF2ZWwgYWxsIHNpbmdsZSBiaXQgY2hhbm5lbCBtYXNrIHRvIGNvbnZlcnQgY2hhbm5lbCBtYXNrIHRvIHN0cmluZy4KICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT046IHsKICAgICAgICAgaWYgKG91dHB1dCkgewogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgiZnJvbnQtbGVmdCwgIik7CkBAIC03NjksNiArNzQxLDEwIEBACiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJ0b3AtYmFjay1sZWZ0LCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWJhY2stY2VudGVyLCAiICk7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUKSBzLmFwcGVuZCgidG9wLWJhY2stcmlnaHQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfTEVGVCkgcy5hcHBlbmQoInRvcC1zaWRlLWxlZnQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfUklHSFQpIHMuYXBwZW5kKCJ0b3Atc2lkZS1yaWdodCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQikgcy5hcHBlbmQoImhhcHRpYy1CLCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BKSBzLmFwcGVuZCgiaGFwdGljLUEsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MRUZUKSBzLmFwcGVuZCgibGVmdCwgIik7CkBAIC03ODMsNiArNzU5LDEyIEBACiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTKSBzLmFwcGVuZCgiWCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWV9BWElTKSBzLmFwcGVuZCgiWSwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWl9BWElTKSBzLmFwcGVuZCgiWiwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19MRUZUKSBzLmFwcGVuZCgiYmFjay1sZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX1JJR0hUKSBzLmFwcGVuZCgiYmFjay1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQ0VOVEVSKSBzLmFwcGVuZCgiY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MT1dfRlJFUVVFTkNZKSBzLmFwcGVuZCgibG93IGZyZXEsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1RPUF9MRUZUKSBzLmFwcGVuZCgidG9wLWxlZnQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfUklHSFQpIHMuYXBwZW5kKCJ0b3AtcmlnaHQsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTkspIHMuYXBwZW5kKCJ2b2ljZS11cGxpbmssICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykgcy5hcHBlbmQoInZvaWNlLWRubGluaywgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX0lOX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKQEAgLTg0MSw5ICs4MjMsNDEgQEAKICAgICAgICAgZHByaW50ZihmZCwgIiBub25lXG4iKTsKICAgICB9CiAgICAgLy8gTm90ZTogb3V0cHV0IGRldmljZSBtYXkgYmUgdXNlZCBieSBjYXB0dXJlIHRocmVhZHMgZm9yIGVmZmVjdHMgc3VjaCBhcyBBRUMuCi0gICAgZHByaW50ZihmZCwgIiAgT3V0cHV0IGRldmljZTogJSN4ICglcylcbiIsIG1PdXREZXZpY2UsIGRldmljZXNUb1N0cmluZyhtT3V0RGV2aWNlKS5jX3N0cigpKTsKLSAgICBkcHJpbnRmKGZkLCAiICBJbnB1dCBkZXZpY2U6ICUjeCAoJXMpXG4iLCBtSW5EZXZpY2UsIGRldmljZXNUb1N0cmluZyhtSW5EZXZpY2UpLmNfc3RyKCkpOwotICAgIGRwcmludGYoZmQsICIgIEF1ZGlvIHNvdXJjZTogJWQgKCVzKVxuIiwgbUF1ZGlvU291cmNlLCBzb3VyY2VUb1N0cmluZyhtQXVkaW9Tb3VyY2UpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBPdXRwdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbU91dERldmljZSwgdG9TdHJpbmcobU91dERldmljZSkuY19zdHIoKSk7CisgICAgZHByaW50ZihmZCwgIiAgSW5wdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbUluRGV2aWNlLCB0b1N0cmluZyhtSW5EZXZpY2UpLmNfc3RyKCkpOworICAgIGRwcmludGYoZmQsICIgIEF1ZGlvIHNvdXJjZTogJWQgKCVzKVxuIiwgbUF1ZGlvU291cmNlLCB0b1N0cmluZyhtQXVkaW9Tb3VyY2UpLmNfc3RyKCkpOworCisgICAgLy8gRHVtcCB0aW1lc3RhbXAgc3RhdGlzdGljcyBmb3IgdGhlIFRocmVhZCB0eXBlcyB0aGF0IHN1cHBvcnQgaXQuCisgICAgaWYgKG1UeXBlID09IFJFQ09SRAorICAgICAgICAgICAgfHwgbVR5cGUgPT0gTUlYRVIKKyAgICAgICAgICAgIHx8IG1UeXBlID09IERVUExJQ0FUSU5HCisgICAgICAgICAgICB8fCBtVHlwZSA9PSBESVJFQ1QKKyAgICAgICAgICAgIHx8IG1UeXBlID09IE9GRkxPQUQpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgVGltZXN0YW1wIHN0YXRzOiAlc1xuIiwgbVRpbWVzdGFtcFZlcmlmaWVyLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIGRwcmludGYoZmQsICIgIFRpbWVzdGFtcCBjb3JyZWN0ZWQ6ICVzXG4iLCBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgPyAieWVzIiA6ICJubyIpOworICAgIH0KKworICAgIGlmIChtTGFzdElvQmVnaW5OcyA+IDApIHsgLy8gTU1BUCBtYXkgbm90IHNldCB0aGlzCisgICAgICAgIGRwcmludGYoZmQsICIgIExhc3QgJXMgb2NjdXJyZWQgKG1zZWNzKTogJWxsZFxuIiwKKyAgICAgICAgICAgICAgICBpc091dHB1dCgpID8gIndyaXRlIiA6ICJyZWFkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSAoc3lzdGVtVGltZSgpIC0gbUxhc3RJb0JlZ2luTnMpIC8gTkFOT1NfUEVSX01JTExJU0VDT05EKTsKKyAgICB9CisKKyAgICBpZiAobVByb2Nlc3NUaW1lTXMuZ2V0TigpID4gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBQcm9jZXNzIHRpbWUgbXMgc3RhdHM6ICVzXG4iLCBtUHJvY2Vzc1RpbWVNcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChtSW9KaXR0ZXJNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIEhhbCAlcyBqaXR0ZXIgbXMgc3RhdHM6ICVzXG4iLAorICAgICAgICAgICAgICAgIGlzT3V0cHV0KCkgPyAid3JpdGUiIDogInJlYWQiLAorICAgICAgICAgICAgICAgIG1Jb0ppdHRlck1zLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKG1MYXRlbmN5TXMuZ2V0TigpID4gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBUaHJlYWRsb29wICVzIGxhdGVuY3kgc3RhdHM6ICVzXG4iLAorICAgICAgICAgICAgICAgIGlzT3V0cHV0KCkgPyAid3JpdGUiIDogInJlYWQiLAorICAgICAgICAgICAgICAgIG1MYXRlbmN5TXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CiAKICAgICBpZiAobG9ja2VkKSB7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwpAQCAtMTUxOSw3ICsxNTMzLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7CiAgICAgY29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKICAgICBjb25maWctPmV4dC5taXguaGFuZGxlID0gbUlkOwpAQCAtMTU3MSw2ICsxNTg1LDkgQEAKICAgICAtLW1CYXR0ZXJ5Q291bnRlclt0cmFjay0+dWlkKCldLnNlY29uZDsKICAgICAvLyBtTGF0ZXN0QWN0aXZlVHJhY2sgaXMgbm90IGNsZWFyZWQgZXZlbiBpZiBpcyB0aGUgc2FtZSBhcyB0cmFjay4KICAgICBtSGFzQ2hhbmdlZCA9IHRydWU7CisjaWZkZWYgVEVFX1NJTksKKyAgICB0cmFjay0+ZHVtcFRlZSgtMSAvKiBmZCAqLywgIl9SRU1PVkUiKTsKKyNlbmRpZgogICAgIHJldHVybiBpbmRleDsKIH0KIApAQCAtMTY0NSw2ICsxNjYyLDY1IEBACiAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7CiB9CiAKKy8vIENhbGwgb25seSBmcm9tIHRocmVhZExvb3AoKSBvciB3aGVuIGl0IGlzIGlkbGUuCisvLyBEbyBub3QgY2FsbCBmcm9tIGhpZ2ggcGVyZm9ybWFuY2UgY29kZSBhcyB0aGlzIG1heSBkbyBiaW5kZXIgcnBjIHRvIHRoZSBNZWRpYU1ldHJpY3Mgc2VydmljZS4KK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kU3RhdGlzdGljcyhib29sIGZvcmNlKQoreworICAgIC8vIERvIG5vdCBsb2cgaWYgd2UgaGF2ZSBubyBzdGF0cy4KKyAgICAvLyBXZSBjaG9vc2UgdGhlIHRpbWVzdGFtcCB2ZXJpZmllciBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGxpa2VseSBpdGVtIHRvIGJlIHByZXNlbnQuCisgICAgY29uc3QgaW50NjRfdCBuc3RhdHMgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0TigpIC0gbUxhc3RSZWNvcmRlZFRpbWVzdGFtcFZlcmlmaWVyTjsKKyAgICBpZiAobnN0YXRzID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIERvbid0IGxvZyBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlIHBlciAxMiBob3Vycy4KKyAgICAvLyBXZSB1c2UgQk9PVFRJTUUgdG8gaW5jbHVkZSBzdXNwZW5kIHRpbWUuCisgICAgY29uc3QgaW50NjRfdCB0aW1lTnMgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKKyAgICBjb25zdCBpbnQ2NF90IHNpbmNlTnMgPSB0aW1lTnMgLSBtTGFzdFJlY29yZGVkVGltZU5zOyAvLyBvayBpZiBtTGFzdFJlY29yZGVkVGltZU5zID0gMAorICAgIGlmICghZm9yY2UgJiYgc2luY2VOcyA8PSAxMiAqIE5BTk9TX1BFUl9IT1VSKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtTGFzdFJlY29yZGVkVGltZXN0YW1wVmVyaWZpZXJOID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldE4oKTsKKyAgICBtTGFzdFJlY29yZGVkVGltZU5zID0gdGltZU5zOworCisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gaXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgiYXVkaW90aHJlYWQiKSk7CisKKyNkZWZpbmUgTU1fUFJFRklYICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLiIgLy8gYXZvaWQgY3V0LW4tcGFzdGUgZXJyb3JzLgorCisgICAgLy8gdGhyZWFkIGNvbmZpZ3VyYXRpb24KKyAgICBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImlkIiwgKGludDMyX3QpbUlkKTsgLy8gSU8gaGFuZGxlCisgICAgLy8gaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJwb3J0SWQiLCAoaW50MzJfdCltUG9ydElkKTsKKyAgICBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAidHlwZSIsIHRocmVhZFR5cGVUb1N0cmluZyhtVHlwZSkpOworICAgIGl0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAic2FtcGxlUmF0ZSIsIChpbnQzMl90KW1TYW1wbGVSYXRlKTsKKyAgICBpdGVtLT5zZXRJbnQ2NChNTV9QUkVGSVggImNoYW5uZWxNYXNrIiwgKGludDY0X3QpbUNoYW5uZWxNYXNrKTsKKyAgICBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiZW5jb2RpbmciLCB0b1N0cmluZyhtRm9ybWF0KS5jX3N0cigpKTsKKyAgICBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImZyYW1lQ291bnQiLCAoaW50MzJfdCltRnJhbWVDb3VudCk7CisgICAgaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggIm91dERldmljZSIsIHRvU3RyaW5nKG1PdXREZXZpY2UpLmNfc3RyKCkpOworICAgIGl0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJpbkRldmljZSIsIHRvU3RyaW5nKG1JbkRldmljZSkuY19zdHIoKSk7CisKKyAgICAvLyB0aHJlYWQgc3RhdGlzdGljcworICAgIGlmIChtSW9KaXR0ZXJNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImlvSml0dGVyTXMubWVhbiIsIG1Jb0ppdHRlck1zLmdldE1lYW4oKSk7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImlvSml0dGVyTXMuc3RkIiwgbUlvSml0dGVyTXMuZ2V0U3RkRGV2KCkpOworICAgIH0KKyAgICBpZiAobVByb2Nlc3NUaW1lTXMuZ2V0TigpID4gMCkgeworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJwcm9jZXNzVGltZU1zLm1lYW4iLCBtUHJvY2Vzc1RpbWVNcy5nZXRNZWFuKCkpOworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJwcm9jZXNzVGltZU1zLnN0ZCIsIG1Qcm9jZXNzVGltZU1zLmdldFN0ZERldigpKTsKKyAgICB9CisgICAgY29uc3QgYXV0byB0c2ppdHRlciA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRKaXR0ZXJNcygpOworICAgIGlmICh0c2ppdHRlci5nZXROKCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInRpbWVzdGFtcEppdHRlck1zLm1lYW4iLCB0c2ppdHRlci5nZXRNZWFuKCkpOworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJ0aW1lc3RhbXBKaXR0ZXJNcy5zdGQiLCB0c2ppdHRlci5nZXRTdGREZXYoKSk7CisgICAgfQorICAgIGlmIChtTGF0ZW5jeU1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAibGF0ZW5jeU1zLm1lYW4iLCBtTGF0ZW5jeU1zLmdldE1lYW4oKSk7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5zdGQiLCBtTGF0ZW5jeU1zLmdldFN0ZERldigpKTsKKyAgICB9CisKKyAgICBpdGVtLT5zZWxmcmVjb3JkKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUGxheWJhY2sKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE2NzQsNyArMTc1MCw3IEBACiAgICAgICAgIC8vIG1TdHJlYW1UeXBlc1tdIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGJvZHkKICAgICAgICAgbVRyYWNrcyh0eXBlID09IE1JWEVSKSwKICAgICAgICAgbU91dHB1dChvdXRwdXQpLAotICAgICAgICBtTGFzdFdyaXRlVGltZSgtMSksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCisgICAgICAgIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCiAgICAgICAgIG1NaXhlclN0YXR1cyhNSVhFUl9JRExFKSwKICAgICAgICAgbU1peGVyU3RhdHVzSWdub3JpbmdGYXN0VHJhY2tzKE1JWEVSX0lETEUpLAogICAgICAgICBtU3RhbmRieURlbGF5TnMoQXVkaW9GbGluZ2VyOjptU3RhbmRieVRpbWVJbk5zZWNzKSwKQEAgLTE3MDksMTAgKzE3ODUsMjEgQEAKICAgICAgICAgaWYgKG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmNhblNldE1hc3Rlck11dGUoKSkgewogICAgICAgICAgICAgbU1hc3Rlck11dGUgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBtSXNNc2REZXZpY2UgPSBzdHJjbXAoCisgICAgICAgICAgICAgICAgbU91dHB1dC0+YXVkaW9Id0Rldi0+bW9kdWxlTmFtZSgpLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwOwogICAgIH0KIAogICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKIAorICAgIC8vIFRPRE86IFdlIG1heSBhbHNvIG1hdGNoIG9uIGFkZHJlc3MgYXMgd2VsbCBhcyBkZXZpY2UgdHlwZSBmb3IKKyAgICAvLyBBVURJT19ERVZJQ0VfT1VUX0JVUywgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCwgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisgICAgaWYgKHR5cGUgPT0gTUlYRVIgfHwgdHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXByb3BlcnR5X2dldF9pbnQ2NCgKKyAgICAgICAgICAgICAgICAiYXVkaW8udGltZXN0YW1wLmNvcnJlY3RlZF9vdXRwdXRfZGV2aWNlcyIsCisgICAgICAgICAgICAgICAgKGludDY0X3QpKG1Jc01zZERldmljZSA/IEFVRElPX0RFVklDRV9PVVRfQlVTIC8vIHR1cm4gb24gYnkgZGVmYXVsdCBmb3IgTVNECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFVRElPX0RFVklDRV9OT05FKSk7CisgICAgfQorCiAgICAgLy8gKysgb3BlcmF0b3IgZG9lcyBub3QgY29tcGlsZQogICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7CiAgICAgICAgICAgICBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgKHN0cmVhbSArIDEpKSB7CkBAIC0xNzczLDcgKzE4NjAsNyBAQAogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgewpAQCAtMTc5Myw3ICsxODgwLDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CkBAIC0xODEwLDkgKzE4OTcsMTIgQEAKIHsKICAgICBkdW1wQmFzZShmZCwgYXJncyk7CiAKKyAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgbXV0ZTogJXNcbiIsIG1NYXN0ZXJNdXRlID8gIm9uIiA6ICJvZmYiKTsKKyAgICBpZiAobUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBIYXB0aWMgY2hhbm5lbCBtYXNrOiAlI3ggKCVzKVxuIiwgbUhhcHRpY0NoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrVG9TdHJpbmcobUhhcHRpY0NoYW5uZWxNYXNrLCB0cnVlIC8qIG91dHB1dCAqLykuY19zdHIoKSk7CisgICAgfQogICAgIGRwcmludGYoZmQsICIgIE5vcm1hbCBmcmFtZSBjb3VudDogJXp1XG4iLCBtTm9ybWFsRnJhbWVDb3VudCk7Ci0gICAgZHByaW50ZihmZCwgIiAgTGFzdCB3cml0ZSBvY2N1cnJlZCAobXNlY3MpOiAlbGx1XG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbnMybXMoc3lzdGVtVGltZSgpIC0gbUxhc3RXcml0ZVRpbWUpKTsKICAgICBkcHJpbnRmKGZkLCAiICBUb3RhbCB3cml0ZXM6ICVkXG4iLCBtTnVtV3JpdGVzKTsKICAgICBkcHJpbnRmKGZkLCAiICBEZWxheWVkIHdyaXRlczogJWRcbiIsIG1OdW1EZWxheWVkV3JpdGVzKTsKICAgICBkcHJpbnRmKGZkLCAiICBCbG9ja2VkIGluIHdyaXRlOiAlc1xuIiwgbUluV3JpdGUgPyAieWVzIiA6ICJubyIpOwpAQCAtMTgyNSw3ICsxOTE1LDcgQEAKICAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0ID0gbU91dHB1dDsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IG91dHB1dCAhPSBOVUxMID8gb3V0cHV0LT5mbGFncyA6IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9TdHJlYW1PdXQ6ICVwIGZsYWdzICUjeCAoJXMpXG4iLAotICAgICAgICAgICAgb3V0cHV0LCBmbGFncywgb3V0cHV0RmxhZ3NUb1N0cmluZyhmbGFncykuY19zdHIoKSk7CisgICAgICAgICAgICBvdXRwdXQsIGZsYWdzLCB0b1N0cmluZyhmbGFncykuY19zdHIoKSk7CiAgICAgZHByaW50ZihmZCwgIiAgRnJhbWVzIHdyaXR0ZW46ICVsbGRcbiIsIChsb25nIGxvbmcpbUZyYW1lc1dyaXR0ZW4pOwogICAgIGRwcmludGYoZmQsICIgIFN1c3BlbmRlZCBmcmFtZXM6ICVsbGRcbiIsIChsb25nIGxvbmcpbVN1c3BlbmRlZEZyYW1lcyk7CiAgICAgaWYgKG1QaXBlU2luay5nZXQoKSAhPSBudWxscHRyKSB7CkBAIC0xODgwLDExICsxOTcwLDE3IEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRGbGFncyA9IG1PdXRwdXQtPmZsYWdzOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IHJlcXVlc3RlZEZsYWdzID0gKmZsYWdzOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDAgJiYgY2hlY2tJTWVtb3J5KHNoYXJlZEJ1ZmZlcikgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIGlmICgqcFNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICAqcFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICB9Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9ICpwU2FtcGxlUmF0ZTsKKyAgICBzYW1wbGVSYXRlID0gKnBTYW1wbGVSYXRlOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBGQVNUIGZsYWcgY29uc2lkZXJlZCBPSyBpZiBmYXN0IG1peGVyIGlzIHByZXNlbnQKICAgICBpZiAoaGFzRmFzdE1peGVyKCkpIHsKQEAgLTE5MDUsNyArMjAwMSw3IEBACiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKICAgICAgICAgICAgIC8vIFRPRE86IGV4dHJhY3QgYXMgYSBkYXRhIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBjaGVja3MgdGhhdCBhIGNvbXB1dGF0aW9uYWxseQogICAgICAgICAgICAgLy8gZXhwZW5zaXZlIGRvd25taXhlciBpcyBub3QgcmVxdWlyZWQ6IGlzRmFzdE91dHB1dENoYW5uZWxDb252ZXJzaW9uKCkKLSAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBtQ2hhbm5lbE1hc2sgfHwKKyAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSAobUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrKSB8fAogICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIHx8CiAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogJiYgbUNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyAqLykpICYmCkBAIC0yMTc0LDQ4ICsyMjcwLDE3IEBACiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrczxUPjo6YWRkKGNvbnN0IHNwPFQ+ICZ0cmFjaykKLXsKLSAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5hZGQodHJhY2spOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIC8vIHNldCBuYW1lIGZvciB0cmFjayB3aGVuIGFkZGluZy4KLSAgICAgICAgaW50IG5hbWU7Ci0gICAgICAgIGlmIChtVW51c2VkVHJhY2tOYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBuYW1lID0gbVRyYWNrcy5zaXplKCkgLSAxOyAvLyBuZXcgbmFtZSB7MCAuLi4gc2l6ZS0xfS4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJldXNlIHNtYWxsZXN0IG5hbWUgZm9yIGRlbGV0ZWQgdHJhY2suCi0gICAgICAgICAgICBhdXRvIGl0ID0gbVVudXNlZFRyYWNrTmFtZXMuYmVnaW4oKTsKLSAgICAgICAgICAgIG5hbWUgPSAqaXQ7Ci0gICAgICAgICAgICAodm9pZCltVW51c2VkVHJhY2tOYW1lcy5lcmFzZShpdCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJhY2stPnNldE5hbWUobmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiY2Fubm90IGFkZCB0cmFjayIpOwotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrczxUPjo6cmVtb3ZlKGNvbnN0IHNwPFQ+ICZ0cmFjaykKIHsKLSAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKICAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIC8vIGludmFsaWRhdGUgbmFtZSB3aGVuIHJlbW92aW5nIGZyb20gbVRyYWNrcy4KLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihuYW1lIDwgMCwgImludmFsaWQgbmFtZSAlZCBmb3IgdHJhY2sgb24gbVRyYWNrcyIsIG5hbWUpOwotCi0gICAgICAgIGlmIChtU2F2ZURlbGV0ZWRUcmFja05hbWVzKSB7CisgICAgICAgIGlmIChtU2F2ZURlbGV0ZWRUcmFja0lkcykgewogICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZGlyZWN0bHkgYWNjZXNzIG1BdWRpb01peGVyIHNpbmNlIHRoZSBjYWxsZXIgbWF5IGJlIG91dHNpZGUgb2YgdGhyZWFkTG9vcC4KLSAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGFkZCB0byBtRGVsZXRlZFRyYWNrTmFtZXMgd2hpY2ggaXMgc29sZWx5IHVzZWQgZm9yIG1BdWRpb01peGVyIHVwZGF0ZSwKKyAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGFkZCB0byBtRGVsZXRlZFRyYWNrSWRzIHdoaWNoIGlzIHNvbGVseSB1c2VkIGZvciBtQXVkaW9NaXhlciB1cGRhdGUsCiAgICAgICAgICAgICAvLyB0byBiZSBoYW5kbGVkIHdoZW4gTWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgpIG5leHQgY2hhbmdlcyBtQXVkaW9NaXhlci4KLSAgICAgICAgICAgIG1EZWxldGVkVHJhY2tOYW1lcy5lbXBsYWNlKG5hbWUpOworICAgICAgICAgICAgbURlbGV0ZWRUcmFja0lkcy5lbXBsYWNlKHRyYWNrSWQpOwogICAgICAgICB9Ci0KLSAgICAgICAgbVVudXNlZFRyYWNrTmFtZXMuZW1wbGFjZShuYW1lKTsKLSAgICAgICAgdHJhY2stPnNldE5hbWUoVDo6VFJBQ0tfTkFNRV9QRU5ESU5HKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5hbWUgPj0gMCwKLSAgICAgICAgICAgICAgICAidmFsaWQgbmFtZSAlZCBmb3IgdHJhY2sgbm90IGluIG1UcmFja3MgKHJldHVybmVkICV6ZCkiLCBuYW1lLCBpbmRleCk7CiAgICAgfQogICAgIHJldHVybiBpbmRleDsKIH0KQEAgLTIyNTEsNiArMjMxNiwxMSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpCit7CisgICAgbU1hc3RlckJhbGFuY2Uuc3RvcmUoYmFsYW5jZSk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6c2V0TWFzdGVyTXV0ZShib29sIG11dGVkKQogewogICAgIGlmIChpc0R1cGxpY2F0aW5nKCkpIHsKQEAgLTIzMDMsMTUgKzIzNzMsMTMgQEAKICAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgVHJhY2tCYXNlOjp0cmFja19zdGF0ZSBzdGF0ZSA9IHRyYWNrLT5tU3RhdGU7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgLy8gYWJvcnQgdHJhY2sgd2FzIHN0b3BwZWQvcGF1c2VkIHdoaWxlIHdlIHJlbGVhc2VkIHRoZSBsb2NrCiAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gdHJhY2stPm1TdGF0ZSkgewogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yMzQwLDYgKzI0MDgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDAgPyBUcmFjazo6RlNfRklMTEVEIDogVHJhY2s6OkZTX0ZJTExJTkc7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoKHRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAmJiBtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgICAgICAvLyBVbmxvY2sgZHVlIHRvIFZpYnJhdG9yU2VydmljZSB3aWxsIGxvY2sgZm9yIHRoaXMgY2FsbCBhbmQgd2lsbAorICAgICAgICAgICAgLy8gY2FsbCBUcmFja3MubXV0ZS91bm11dGUgd2hpY2ggYWxzbyByZXF1aXJlIHRocmVhZCdzIGxvY2suCisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBpbnRlbnNpdHkgPSBBdWRpb0ZsaW5nZXI6Om9uRXh0ZXJuYWxWaWJyYXRpb25TdGFydCgKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPmdldEV4dGVybmFsVmlicmF0aW9uKCkpOworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgdHJhY2stPnNldEhhcHRpY0ludGVuc2l0eShzdGF0aWNfY2FzdDxBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3Q+KGludGVuc2l0eSkpOworICAgICAgICAgICAgLy8gSGFwdGljIHBsYXliYWNrIHNob3VsZCBiZSBlbmFibGVkIGJ5IHZpYnJhdG9yIHNlcnZpY2UuCisgICAgICAgICAgICBpZiAodHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBoYXB0aWMgcGxheWJhY2sgb2YgYWxsIGFjdGl2ZSB0cmFjayB0byBlbnN1cmUgb25seQorICAgICAgICAgICAgICAgIC8vIG9uZSB0cmFjayBwbGF5aW5nIGhhcHRpYyBpZiBjdXJyZW50IHRyYWNrIHNob3VsZCBwbGF5IGhhcHRpYy4KKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgICAgIHQtPnNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgdHJhY2stPm1SZXNldERvbmUgPSBmYWxzZTsKICAgICAgICAgdHJhY2stPm1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyA9IDA7CiAgICAgICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKQEAgLTI0MDUsNiArMjQ5MiwxNCBAQAogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobU91dHB1dCA9PSBudWxscHRyIHx8IG1PdXRwdXQtPnN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbU91dHB1dC0+c3RyZWFtLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSB7CiAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKICAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZCwgdGhyZWFkICVwLCBldmVudCAlZCIsIHRoaXMsIGV2ZW50KTsKQEAgLTI0NjIsNiArMjU1NywxMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gcmVqZWN0IG91dCBvZiBzZXF1ZW5jZSByZXF1ZXN0cwogICAgIGlmICgobURyYWluU2VxdWVuY2UgJiAxKSAmJiAoc2VxdWVuY2UgPT0gbURyYWluU2VxdWVuY2UpKSB7CisgICAgICAgIC8vIFJlZ2lzdGVyIGRpc2NvbnRpbnVpdHkgd2hlbiBIVyBkcmFpbiBpcyBjb21wbGV0ZWQgYmVjYXVzZSB0aGF0IGNhbiBjYXVzZQorICAgICAgICAvLyB0aGUgdGltZXN0YW1wIGZyYW1lIHBvc2l0aW9uIHRvIHJlc2V0IHRvIDAgZm9yIGRpcmVjdCBhbmQgb2ZmbG9hZCB0aHJlYWRzLgorICAgICAgICAvLyAoT3V0IG9mIHNlcXVlbmNlIHJlcXVlc3RzIGFyZSBpZ25vcmVkLCBzaW5jZSB0aGUgZGlzY29udGludWl0eSB3b3VsZCBiZSBoYW5kbGVkCisgICAgICAgIC8vIGVsc2V3aGVyZSwgZS5nLiBpbiBmbHVzaCkuCisgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CiAgICAgICAgIG1EcmFpblNlcXVlbmNlICY9IH4xOwogICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKICAgICB9CkBAIC0yNDgxLDYgKzI1ODEsNyBAQAogICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayk7CiAgICAgfQogICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrKTsKKyAgICBtQmFsYW5jZS5zZXRDaGFubmVsTWFzayhtQ2hhbm5lbE1hc2spOwogCiAgICAgLy8gR2V0IGFjdHVhbCBIQUwgZm9ybWF0LgogICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0Rm9ybWF0KCZtSEFMRm9ybWF0KTsKQEAgLTI2MDAsNyArMjcwMSw3IEBACiAgICAgZnJlZShtTWl4ZXJCdWZmZXIpOwogICAgIG1NaXhlckJ1ZmZlciA9IE5VTEw7CiAgICAgaWYgKG1NaXhlckJ1ZmZlckVuYWJsZWQpIHsKLSAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsgLy8gYWxzbyB2YWxpZDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7IC8vIG5vIGxvbmdlciB2YWxpZDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCiAgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQKICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1NaXhlckJ1ZmZlciwgMzIsIG1NaXhlckJ1ZmZlclNpemUpOwpAQCAtMjYxNCw2ICsyNzE1LDExIEBACiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtRWZmZWN0QnVmZmVyLCAzMiwgbUVmZmVjdEJ1ZmZlclNpemUpOwogICAgIH0KIAorICAgIG1IYXB0aWNDaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBtQ2hhbm5lbE1hc2sgJj0gfm1IYXB0aWNDaGFubmVsTWFzazsKKyAgICBtSGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1IYXB0aWNDaGFubmVsTWFzayk7CisgICAgbUNoYW5uZWxDb3VudCAtPSBtSGFwdGljQ2hhbm5lbENvdW50OworCiAgICAgLy8gZm9yY2UgcmVjb25maWd1cmF0aW9uIG9mIGVmZmVjdCBjaGFpbnMgYW5kIGVuZ2luZXMgdG8gdGFrZSBuZXcgYnVmZmVyIHNpemUgYW5kIGF1ZGlvCiAgICAgLy8gcGFyYW1ldGVycyBpbnRvIGFjY291bnQKICAgICAvLyBOb3RlIHRoYXQgbUxvY2sgaXMgbm90IGhlbGQgd2hlbiByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yCkBAIC0yNjgyLDI4ICsyNzg4LDYgQEAKICAgICB9CiB9CiAKLS8vIGhhc0F1ZGlvU2Vzc2lvbl9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdAotewotICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgaWYgKGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IEVGRkVDVF9TRVNTSU9OOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwotICAgICAgICBpZiAoc2Vzc2lvbklkID09IHRyYWNrLT5zZXNzaW9uSWQoKSAmJiAhdHJhY2stPmlzSW52YWxpZCgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgfD0gVFJBQ0tfU0VTU0lPTjsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBGQVNUX1NFU1NJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCiB7CiAgICAgLy8gc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggaXMgcGxhY2VkIGluIHNhbWUgc3RyYXRlZ3kgYXMgTVVTSUMgc3RyZWFtIHNvIHRoYXQKQEAgLTI3ODEsMjQgKzI4NjUsMTggQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6dGhyZWFkTG9vcF9yZW1vdmVUcmFja3MoCiAgICAgICAgIGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQogewotICAgIHNpemVfdCBjb3VudCA9IHRyYWNrc1RvUmVtb3ZlLnNpemUoKTsKLSAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgIC8vIE1pc2NlbGxhbmVvdXMgdHJhY2sgY2xlYW51cCB3aGVuIHJlbW92ZWQgZnJvbSB0aGUgYWN0aXZlIGxpc3QsCisgICAgLy8gY2FsbGVkIHdpdGhvdXQgVGhyZWFkIGxvY2sgYnV0IHN5bmNocm9uaXplZCB3aXRoIHRocmVhZExvb3AgcHJvY2Vzc2luZy4KICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCi0gICAgICAgICAgICAgICAgLy8gdG8gdHJhY2sgdGhlIHNwZWFrZXIgdXNhZ2UKLSAgICAgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdG9wKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWNrIDogdHJhY2tzVG9SZW1vdmUpIHsKKyAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgLy8gdG8gdHJhY2sgdGhlIHNwZWFrZXIgdXNhZ2UKKyAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YUF1ZGlvRmxpbmdlclN0b3ApOwogICAgICAgICB9CiAgICAgfQorI2Vsc2UKKyAgICAodm9pZCl0cmFja3NUb1JlbW92ZTsgLy8gc3VwcHJlc3MgdW51c2VkIHdhcm5pbmcKKyNlbmRpZgogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNoZWNrU2lsZW50TW9kZV9sKCkKQEAgLTI4NTAsNiArMjkyOCw5IEBACiAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPiAwKSB7CiAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuICogbUZyYW1lU2l6ZTsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICAgbVRlZS53cml0ZSgoY2hhciAqKW1TaW5rQnVmZmVyICsgb2Zmc2V0LCBmcmFtZXNXcml0dGVuKTsKKyNlbmRpZgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbjsKICAgICAgICAgfQpAQCAtMjk4OSw3ICszMDcwLDcgQEAKICAgICAgICAgLy8gT25seSBvbmUgZWZmZWN0IGNoYWluIGNhbiBiZSBwcmVzZW50IGluIGRpcmVjdCBvdXRwdXQgdGhyZWFkIGFuZCBpdCB1c2VzCiAgICAgICAgIC8vIHRoZSBzaW5rIGJ1ZmZlciBhcyBpbnB1dAogICAgICAgICBpZiAobVR5cGUgIT0gRElSRUNUKSB7Ci0gICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQgKiAobUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQpOwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5hbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpLAogICAgICAgICAgICAgICAgICAgICAmaGFsSW5CdWZmZXIpOwpAQCAtMzEzMCw4ICszMjExLDggQEAKICAgICBWZWN0b3I8IHNwPFRyYWNrPiA+IHRyYWNrc1RvUmVtb3ZlOwogCiAgICAgbVN0YW5kYnlUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgbnNlY3NfdCBsYXN0V3JpdGVGaW5pc2hlZCA9IC0xOyAvLyB0aW1lIGxhc3Qgc2VydmVyIHdyaXRlIGNvbXBsZXRlZAotICAgIGludDY0X3QgbGFzdEZyYW1lc1dyaXR0ZW4gPSAtMTsgLy8gdHJhY2sgY2hhbmdlcyBpbiB0aW1lc3RhbXAgc2VydmVyIGZyYW1lcyB3cml0dGVuCisgICAgaW50NjRfdCBsYXN0TG9vcENvdW50V3JpdHRlbiA9IC0yOyAvLyBuZXZlciBtYXRjaGVzICJwcmV2aW91cyIgbG9vcCwgd2hlbiBsb29wQ291bnQgPSAwLgorICAgIGludDY0X3QgbGFzdEZyYW1lc1dyaXR0ZW4gPSAtMTsgICAgLy8gdHJhY2sgY2hhbmdlcyBpbiB0aW1lc3RhbXAgc2VydmVyIGZyYW1lcyB3cml0dGVuCiAKICAgICAvLyBNSVhFUgogICAgIG5zZWNzX3QgbGFzdFdhcm5pbmcgPSAwOwpAQCAtMzE2Nyw3ICszMjQ4LDE4IEBACiAKICAgICBjaGVja1NpbGVudE1vZGVfbCgpOwogCi0gICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQorICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BRCB0aHJlYWRzIHNob3VsZCByZXNldCBmcmFtZSBjb3VudCB0byB6ZXJvIG9uIHN0b3AvZmx1c2gKKyAgICAvLyBUT0RPOiBhZGQgY29uZmlybWF0aW9uIGNoZWNrczoKKyAgICAvLyAxKSBESVJFQ1QgdGhyZWFkcyBhbmQgbGluZWFyIFBDTSBmb3JtYXQgcmVhbGx5IHJlc2V0cyB0byAwPworICAgIC8vIDIpIElzIGZyYW1lIGNvdW50IHJlYWxseSB2YWxpZCBpZiBub3QgbGluZWFyIHBjbT8KKyAgICAvLyAzKSBBcmUgYWxsIDY0IGJpdHMgb2YgcG9zaXRpb24gcmV0dXJuZWQsIG5vdCBqdXN0IGxvd2VzdCAzMiBiaXRzPworICAgIGlmIChtVHlwZSA9PSBPRkZMT0FEIHx8IG1UeXBlID09IERJUkVDVCkgeworICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuc2V0RGlzY29udGludWl0eU1vZGUobVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9aRVJPKTsKKyAgICB9CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworCisgICAgLy8gbG9vcENvdW50IGlzIHVzZWQgZm9yIHN0YXRpc3RpY3MgYW5kIGRpYWdub3N0aWNzLgorICAgIGZvciAoaW50NjRfdCBsb29wQ291bnQgPSAwOyAhZXhpdFBlbmRpbmcoKTsgKytsb29wQ291bnQpCiAgICAgewogICAgICAgICAvLyBMb2cgbWVyZ2UgcmVxdWVzdHMgYXJlIHBlcmZvcm1lZCBkdXJpbmcgQXVkaW9GbGluZ2VyIGJpbmRlciB0cmFuc2FjdGlvbnMsIGJ1dAogICAgICAgICAvLyB0aGF0IGRvZXMgbm90IGNvdmVyIGF1ZGlvIHBsYXliYWNrLiBJdCdzIHJlcXVlc3RlZCBoZXJlIGZvciB0aGF0IHJlYXNvbi4KQEAgLTMxNzcsNiArMzI2OSw0OSBAQAogCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCisgICAgICAgIC8vIElmIHRoZSBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9CVVMsIGNoZWNrIGZvciBkb3duc3RyZWFtIGxhdGVuY3kuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGU6IHdlIGFjY2VzcyBvdXREZXZpY2UoKSBvdXRzaWRlIG9mIG1Mb2NrLgorICAgICAgICBpZiAoaXNNc2REZXZpY2UoKSAmJiAob3V0RGV2aWNlKCkgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgeworICAgICAgICAgICAgLy8gSGVyZSwgd2UgdHJ5IGZvciB0aGUgQUYgbG9jaywgYnV0IGRvIG5vdCBibG9jayBvbiBpdCBhcyB0aGUgbGF0ZW5jeQorICAgICAgICAgICAgLy8gaXMgbW9yZSBpbmZvcm1hdGlvbmFsLgorICAgICAgICAgICAgaWYgKG1BdWRpb0ZsaW5nZXItPm1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g+IHN3UGF0Y2hlczsKKyAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGRvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIGlmIChtQXVkaW9GbGluZ2VyLT5tUGF0Y2hQYW5lbC5nZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKGlkKCksICZzd1BhdGNoZXMpID09IE9LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzd1BhdGNoZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3dQYXRjaGVzWzBdLmdldExhdGVuY3lNc19sKCZsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICAgICAgZG93bnN0cmVhbVBhdGNoSGFuZGxlID0gc3dQYXRjaGVzWzBdLmdldFBhdGNoSGFuZGxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkb3duc3RyZWFtUGF0Y2hIYW5kbGUgIT0gbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IGRvd25zdHJlYW1QYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgZG93bnN0cmVhbSBsYXRlbmN5ICh3ZSBhc3N1bWUgYSBtYXggcmVhc29uYWJsZQorICAgICAgICAgICAgICAgICAgICAvLyBsYXRlbmN5IG9mIDUgc2Vjb25kcykuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5MYXRlbmN5ID0gMC4sIG1heExhdGVuY3kgPSA1MDAwLjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyA+PSBtaW5MYXRlbmN5ICYmIGxhdGVuY3lNcyA8PSBtYXhMYXRlbmN5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibmV3IGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm91dCBvZiByYW5nZSBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPCBtaW5MYXRlbmN5KSBsYXRlbmN5TXMgPSBtaW5MYXRlbmN5OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGF0ZW5jeU1zID4gbWF4TGF0ZW5jeSkgbGF0ZW5jeU1zID0gbWF4TGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPm1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAvLyBvdXIgZGV2aWNlIGlzIG5vIGxvbmdlciBBVURJT19ERVZJQ0VfT1VUX0JVUywgcmVzZXQgcGF0Y2ggaGFuZGxlIGFuZCBzdGF0cy4KKyAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMzE5MCwxNiArMzMyNSw1MSBAQAogICAgICAgICAgICAgICAgIGxvZ1N0cmluZyA9IE5VTEw7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIENvbGxlY3QgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBQbGF5YmFjayBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgorICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSCisgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IERVUExJQ0FUSU5HCisgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IERJUkVDVAorICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7IC8vIG5vIGluZGVudGF0aW9uCiAgICAgICAgICAgICAvLyBHYXRoZXIgdGhlIGZyYW1lc1JlbGVhc2VkIGNvdW50ZXJzIGZvciBhbGwgYWN0aXZlIHRyYWNrcywKICAgICAgICAgICAgIC8vIGFuZCBhc3NvY2lhdGUgd2l0aCB0aGUgc2luayBmcmFtZXMgd3JpdHRlbiBvdXQuICBXZSBuZWVkCiAgICAgICAgICAgICAvLyB0aGlzIHRvIGNvbnZlcnQgdGhlIHNpbmsgdGltZXN0YW1wIHRvIHRoZSB0cmFjayB0aW1lc3RhbXAuCiAgICAgICAgICAgICBib29sIGtlcm5lbExvY2F0aW9uVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobU5vcm1hbFNpbmsgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBEdXBsaWNhdGluZ1RocmVhZCBtYXkgbm90IGhhdmUgYSBtTm9ybWFsU2luay4KKyAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gdXNlIHByaXZhdGUgY29weSB0byBmZXRjaAorICAgICAgICAgICAgaWYgKG1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgmdGltZXN0YW1wKSA9PSBPSykgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5hZGQodGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjb3JyZWN0ZWRUaW1lc3RhbXAgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0TGFzdENvcnJlY3RlZFRpbWVzdGFtcCgpOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsIGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pOworCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IERvd25zdHJlYW0gbGF0ZW5jeSBvbmx5IGFkZGVkIGlmIHRpbWVzdGFtcCBjb3JyZWN0aW9uIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgeyAvLyB3ZSBoYXZlIGxhdGVuY3kgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbmV3UG9zaXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaW50NjRfdChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgcmV0cm9ncmFkZQorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IG1heCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVN1c3BlbmRlZEZyYW1lcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gV2UgYWx3YXlzIGZldGNoIHRoZSB0aW1lc3RhbXAgaGVyZSBiZWNhdXNlIG9mdGVuIHRoZSBkb3duc3RyZWFtCiAgICAgICAgICAgICAgICAgLy8gc2luayB3aWxsIGJsb2NrIHdoaWxlIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyB1c2UgcHJpdmF0ZSBjb3B5IHRvIGZldGNoCi0gICAgICAgICAgICAgICAgKHZvaWQpIG1Ob3JtYWxTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKIAogICAgICAgICAgICAgICAgIC8vIFdlIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgdmFsaWQga2VybmVsIHBvc2l0aW9uIGluIGNhc2Ugd2UgYXJlIGluIHVuZGVycnVuCiAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBub3JtYWwgbWl4ZXIgcGVyaW9kIGlzIHRoZSBzYW1lIGFzIHRoZSBmYXN0IG1peGVyIHBlcmlvZCwgb3IgdGhlcmUKQEAgLTMyMjgsNyArMzM5OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3VzcGVuZGVkRnJhbWVzOyAvLyBhZGQgZnJhbWVzIGRpc2NhcmRlZCB3aGVuIHN1c3BlbmRlZAogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIG1GcmFtZXNXcml0dGVuIGZvciBub24tb2ZmbG9hZGVkIHRyYWNrcyBhcmUgY29udGlndW91cwogICAgICAgICAgICAgLy8gZXZlbiBhZnRlciBzdGFuZGJ5KCkgaXMgY2FsbGVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhlIHRyYWNrIGZyYW1lCiAgICAgICAgICAgICAvLyB0byBzaW5rIGZyYW1lIG1hcHBpbmcuCkBAIC0zMjQ0LDExICszNDE3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgdGltZSBiZWZvcmUgd2UgY2FsbGVkIHRoZSBIQUwgd3JpdGUgLSBpdCBpcyBhIGJpdCBtb3JlIGFjY3VyYXRlCiAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHdoZW4gdGhlIHNlcnZlciBsYXN0IHJlYWQgZGF0YSB0aGFuIHRoZSBjdXJyZW50IHRpbWUgaGVyZS4KICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCB3cml0dGVuIGFueXRoaW5nLCBtTGFzdFdyaXRlVGltZSB3aWxsIGJlIC0xCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3Qgd3JpdHRlbiBhbnl0aGluZywgbUxhc3RJb0JlZ2luTnMgd2lsbCBiZSAtMQogICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2UgdXNlIHN5c3RlbVRpbWUoKS4KICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBtRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbUxhc3RXcml0ZVRpbWUgPT0gLTEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN5c3RlbVRpbWUoKSA6IG1MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBtTGFzdElvQmVnaW5OcyA9PSAtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3lzdGVtVGltZSgpIDogbUxhc3RJb0JlZ2luTnM7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzcDxUcmFjaz4gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CkBAIC0zMjU2LDEwICszNDI5LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0LT51cGRhdGVUcmFja0ZyYW1lSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKG1Gb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IG1UaW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zICE9IDAuKSB7IC8vIG5vdGUgMC4gbWVhbnMgdGltZXN0YW1wIGlzIGVtcHR5LgorICAgICAgICAgICAgICAgICAgICBtTGF0ZW5jeU1zLmFkZChsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSAvLyBpZiAobVR5cGUgLi4uICkgeyAvLyBubyBpbmRlbnRhdGlvbgogI2lmIDAKICAgICAgICAgICAgIC8vIGxvZ0Zvcm1hdCBleGFtcGxlCiAgICAgICAgICAgICBpZiAoeiAlIDEwMCA9PSAwKSB7CkBAIC0zMzAwLDcgKzM0ODMsNyBAQAogCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCFtQWN0aXZlVHJhY2tzLnNpemUoKSAmJiBzeXN0ZW1UaW1lKCkgPiBtU3RhbmRieVRpbWVOcykgfHwKKyAgICAgICAgICAgIGlmICgobUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkgJiYgc3lzdGVtVGltZSgpID4gbVN0YW5kYnlUaW1lTnMpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VzcGVuZGVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBwdXQgYXVkaW8gaGFyZHdhcmUgaW50byBzdGFuZGJ5IGFmdGVyIHNob3J0IGRlbGF5CiAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFN0YW5kYnlfbCgpKSB7CkBAIC0zMzEyLDkgKzM0OTUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIExPR19BVURJT19TVEFURSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFN0YXRpc3RpY3MoZmFsc2UgLyogZm9yY2UgKi8pOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICghbUFjdGl2ZVRyYWNrcy5zaXplKCkgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gd2FpdCwgZmx1c2ggdGhlIGJpbmRlciBjb21tYW5kIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKQEAgLTMzOTQsOCArMzU3OCwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypsaW1pdCovKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAoIWhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJhbGFuY2UgbXVzdCB0YWtlIGVmZmVjdCBhZnRlciBtb25vIGNvbnZlcnNpb24uCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIGl0IGhlcmUgaWYgdGhlcmUgaXMgbm8gRmFzdE1peGVyLgorICAgICAgICAgICAgICAgICAgICAvLyBtQmFsYW5jZSBkZXRlY3RzIHplcm8gYmFsYW5jZSB3aXRoaW4gdGhlIGNsYXNzIGZvciBzcGVlZCAobm90IG5lZWRlZCBoZXJlKS4KKyAgICAgICAgICAgICAgICAgICAgbUJhbGFuY2Uuc2V0QmFsYW5jZShtTWFzdGVyQmFsYW5jZS5sb2FkKCkpOworICAgICAgICAgICAgICAgICAgICBtQmFsYW5jZS5wcm9jZXNzKChmbG9hdCAqKW1NaXhlckJ1ZmZlciwgbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBmb3JtYXQsIG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KSk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBnb2luZyBkaXJlY3RseSB0byB0aGUgc2luayBhbmQgdGhlcmUgYXJlIGhhcHRpYyBjaGFubmVscywKKyAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgYWRqdXN0IGNoYW5uZWxzIGFzIHRoZSBzYW1wbGUgZGF0YSBpcyBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgaWYgKCFtRWZmZWN0QnVmZmVyVmFsaWQgJiYgbUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZShidWZmZXIsIG1DaGFubmVsQ291bnQsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQsIGZvcm1hdCkgKiBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtQ3VycmVudFdyaXRlTGVuZ3RoOwpAQCAtMzQzOCw4ICszNjQwLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qbGltaXQqLyk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmICghaGFzRmFzdE1peGVyKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBCYWxhbmNlIG11c3QgdGFrZSBlZmZlY3QgYWZ0ZXIgbW9ubyBjb252ZXJzaW9uLgorICAgICAgICAgICAgICAgIC8vIFdlIGRvIGl0IGhlcmUgaWYgdGhlcmUgaXMgbm8gRmFzdE1peGVyLgorICAgICAgICAgICAgICAgIC8vIG1CYWxhbmNlIGRldGVjdHMgemVybyBiYWxhbmNlIHdpdGhpbiB0aGUgY2xhc3MgZm9yIHNwZWVkIChub3QgbmVlZGVkIGhlcmUpLgorICAgICAgICAgICAgICAgIG1CYWxhbmNlLnNldEJhbGFuY2UobU1hc3RlckJhbGFuY2UubG9hZCgpKTsKKyAgICAgICAgICAgICAgICBtQmFsYW5jZS5wcm9jZXNzKChmbG9hdCAqKW1FZmZlY3RCdWZmZXIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgbUZvcm1hdCwgbUVmZmVjdEJ1ZmZlciwgbUVmZmVjdEJ1ZmZlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiAobUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQpKTsKKyAgICAgICAgICAgIC8vIFRoZSBzYW1wbGUgZGF0YSBpcyBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQgd2hlbiBoYXB0aWMgY2hhbm5lbHMgZXhpc3QsCisgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkanVzdCBjaGFubmVscyBoZXJlLgorICAgICAgICAgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZShtU2lua0J1ZmZlciwgbUNoYW5uZWxDb3VudCwgbVNpbmtCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNoYW5uZWxDb3VudCwgbUZvcm1hdCkgKiBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KQEAgLTM0NDksNDMgKzM2NjcsNjggQEAKICAgICAgICAgICAgIC8vIG1TbGVlcFRpbWVVcyA9PSAwIG1lYW5zIHdlIG11c3Qgd3JpdGUgdG8gYXVkaW8gaGFyZHdhcmUKICAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgewogICAgICAgICAgICAgICAgIHNzaXplX3QgcmV0ID0gMDsKLSAgICAgICAgICAgICAgICAvLyBXZSBzYXZlIGxhc3RXcml0ZUZpbmlzaGVkIGhlcmUsIGFzIHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQsCi0gICAgICAgICAgICAgICAgLy8gZm9yIHRocm90dGxpbmcuIE9uIHRocmVhZCBzdGFydCwgcHJldmlvdXNMYXN0V3JpdGVGaW5pc2hlZCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgLy8gc2V0IHRvIC0xLCB3aGljaCBwcm9wZXJseSByZXN1bHRzIGluIG5vIHRocm90dGxpbmcgYWZ0ZXIgdGhlIGZpcnN0IHdyaXRlLgotICAgICAgICAgICAgICAgIG5zZWNzX3QgcHJldmlvdXNMYXN0V3JpdGVGaW5pc2hlZCA9IGxhc3RXcml0ZUZpbmlzaGVkOwotICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEgPSAwOworICAgICAgICAgICAgICAgIC8vIHdyaXRlUGVyaW9kTnMgaXMgdXBkYXRlZCA+PSAwIHdoZW4gcmV0ID4gMC4KKyAgICAgICAgICAgICAgICBpbnQ2NF90IHdyaXRlUGVyaW9kTnMgPSAtMTsKICAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVtYWluaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJld3JpdGUgdG8gcmVkdWNlIG51bWJlciBvZiBzeXN0ZW0gY2FsbHMKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7ICAvLyBhbHNvIHVzZWQgZm9yIGR1bXBzeXMKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYXN0SW9CZWdpbk5zID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgICAgICAgICByZXQgPSB0aHJlYWRMb29wX3dyaXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RXcml0ZUZpbmlzaGVkID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGxhc3RXcml0ZUZpbmlzaGVkIC0gbUxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvRW5kTnMgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gcmV0OwogICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nIC09IHJldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuICs9IHJldCAvIG1GcmFtZVNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGZyYW1lcyA9IHJldCAvIG1GcmFtZVNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSBmcmFtZXM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUGVyaW9kTnMgPSBsYXN0SW9FbmROcyAtIG1MYXN0SW9FbmROczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gd3JpdGUgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBpbiBhIGNvbnRpbnVvdXMgbWl4aW5nIGN5Y2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BDb3VudCA9PSBsYXN0TG9vcENvdW50V3JpdHRlbiArIDEpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgaml0dGVyTXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcFZlcmlmaWVyPGludDY0X3QsIGludDY0X3Q+Ojpjb21wdXRlSml0dGVyTXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJhbWVzLCB3cml0ZVBlcmlvZE5zfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSAvKiBsYXN0VGltZXN0YW1wICovLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwcm9jZXNzTXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RJb0JlZ2luTnMgLSBtTGFzdElvRW5kTnMpICogMWUtNjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW9KaXR0ZXJNcy5hZGQoaml0dGVyTXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzc1RpbWVNcy5hZGQocHJvY2Vzc01zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBibG9ja2VkIGRldGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZGVsdGFXcml0ZU5zID0gbGFzdElvRW5kTnMgLSBsYXN0SW9CZWdpbk5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiBkZWx0YVdyaXRlTnMgPiBtYXhQZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsYXN0SW9FbmROcyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygid3JpdGUgYmxvY2tlZCBmb3IgJWxsZCBtc2VjcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgZGVsYXllZCB3cml0ZXMsIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsdGFXcml0ZU5zIC8gTkFOT1NfUEVSX01JTExJU0VDT05ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcywgbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbGFzdElvRW5kTnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGltaW5nIGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdElvQmVnaW5OcyA9IGxhc3RJb0JlZ2luTnM7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdElvRW5kTnMgPSBsYXN0SW9FbmROczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RMb29wQ291bnRXcml0dGVuID0gbG9vcENvdW50OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgobU1peGVyU3RhdHVzID09IE1JWEVSX0RSQUlOX1RSQUNLKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9BTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocmVhZExvb3BfZHJhaW4oKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSICYmICFtU3RhbmRieSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBibG9ja2VkIGRldGVjdGlvbgotICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPiBtYXhQZXJpb2QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxhc3RXcml0ZUZpbmlzaGVkIC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIndyaXRlIGJsb2NrZWQgZm9yICVsbHUgbXNlY3MsICVkIGRlbGF5ZWQgd3JpdGVzLCB0aHJlYWQgJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbnMybXMoZGVsdGEpLCBtTnVtRGVsYXllZFdyaXRlcywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBsYXN0V3JpdGVGaW5pc2hlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtVGhyZWFkVGhyb3R0bGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZIC8vIHdlIGFyZSBtaXhpbmcgKGFjdGl2ZSB0cmFja3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmV0ID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3cm90ZSBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB3cml0ZVBlcmlvZE5zID4gMCkgeyAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgd3JpdGUgcGVyaW9kIGluZm8KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpbWl0IE1peGVyVGhyZWFkIGRhdGEgcHJvY2Vzc2luZyB0byBubyBtb3JlIHRoYW4gdHdpY2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBwcm9jZXNzaW5nIHJhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLwpAQCAtMzUwNCwxMiArMzc0Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiB0aHJlYWRMb29wX21peCAoc2lnbmlmaWNhbnQgZm9yIGhlYXZ5IG1peGluZywgZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIG9uIGxvdyB0aWVyIHByb2Nlc3NvcnMpCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgT0sgaWYgZGVsdGFNcyAoYW5kIGRlbHRhTnMpIGlzIGFuIG92ZXJlc3RpbWF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsdGFOczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbHRhTnMgPSBsYXN0V3JpdGVGaW5pc2hlZCAtIHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXcml0ZUZpbmlzaGVkLHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQsICZkZWx0YU5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVsdGFNcyA9IGRlbHRhTnMgLyAxMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBPSyBpZiBkZWx0YU1zIGlzIGFuIG92ZXJlc3RpbWF0ZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZWx0YU1zID0gd3JpdGVQZXJpb2ROcyAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKIAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCB0aHJvdHRsZU1zID0gKGludDMyX3QpbUhhbGZCdWZmZXJNcyAtIGRlbHRhTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNpZ25lZCltSGFsZkJ1ZmZlck1zID49IHRocm90dGxlTXMgJiYgdGhyb3R0bGVNcyA+IDApIHsKQEAgLTM1MjIsNyArMzc2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZFRocm90dGxlVGltZU1zICs9IHRocm90dGxlTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhyb3R0bGUgbXVzdCBiZSBhdHRyaWJ1dGVkIHRvIHRoZSBwcmV2aW91cyBtaXhlciBsb29wJ3Mgd3JpdGUgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFsbG93IGJhY2stdG8tYmFjayB0aHJvdHRsaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXcml0ZUZpbmlzaGVkICs9IHRocm90dGxlTXMgKiAxMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxzbyBlbnN1cmVzIHByb3BlciB0aW1pbmcgc3RhdGlzdGljcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdElvRW5kTnMgPSBzeXN0ZW1UaW1lKCk7ICAvLyB3ZSBmZXRjaCB0aGUgd3JpdGUgZW5kIHRpbWUgYWdhaW4uCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRpZmYgPSBtVGhyZWFkVGhyb3R0bGVUaW1lTXMgLSBtVGhyZWFkVGhyb3R0bGVFbmRNczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDApIHsKQEAgLTM2MDUsMjQgKzM4NDYsMzYgQEAKIC8vIHJlbW92ZVRyYWNrc19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbW92ZVRyYWNrc19sKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQogewotICAgIHNpemVfdCBjb3VudCA9IHRyYWNrc1RvUmVtb3ZlLnNpemUoKTsKLSAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS5pdGVtQXQoaSk7Ci0gICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7Ci0gICAgICAgICAgICBBTE9HVigicmVtb3ZlVHJhY2tzX2wgcmVtb3ZpbmcgdHJhY2sgb24gc2Vzc2lvbiAlZCIsIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzdG9wcGluZyB0cmFjayBvbiBjaGFpbiAlcCBmb3Igc2Vzc2lvbiBJZDogJWQiLCBjaGFpbi5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgY2hhaW4tPmRlY0FjdGl2ZVRyYWNrQ250KCk7Ci0gICAgICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IHRyYWNrc1RvUmVtb3ZlKSB7CisgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHRyYWNrKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcmVtb3ZpbmcgdHJhY2sgb24gc2Vzc2lvbiAlZCIsIF9fZnVuY19fLCB0cmFjay0+aWQoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogc3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHRyYWNrLT5pZCgpLCBjaGFpbi5nZXQoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIGNoYWluLT5kZWNBY3RpdmVUcmFja0NudCgpOworICAgICAgICB9CisgICAgICAgIC8vIElmIGFuIGV4dGVybmFsIGNsaWVudCB0cmFjaywgaW5mb3JtIEFQTSB3ZSdyZSBubyBsb25nZXIgYWN0aXZlLCBhbmQgcmVtb3ZlIGlmIG5lZWRlZC4KKyAgICAgICAgLy8gV2UgZG8gdGhpcyB1bmRlciBsb2NrIHNvIHRoYXQgdGhlIHN0YXRlIGlzIGNvbnNpc3RlbnQgaWYgdGhlIFRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIG91ciB0cmFja3MgdmVjdG9yCisgICAgICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAmJiBtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAvLyBVbmxvY2sgZHVlIHRvIFZpYnJhdG9yU2VydmljZSB3aWxsIGxvY2sgZm9yIHRoaXMgY2FsbCBhbmQgd2lsbAorICAgICAgICAgICAgLy8gY2FsbCBUcmFja3MubXV0ZS91bm11dGUgd2hpY2ggYWxzbyByZXF1aXJlIHRocmVhZCdzIGxvY2suCisgICAgICAgICAgICBBdWRpb0ZsaW5nZXI6Om9uRXh0ZXJuYWxWaWJyYXRpb25TdG9wKHRyYWNrLT5nZXRFeHRlcm5hbFZpYnJhdGlvbigpKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgfQogICAgIH0KLQogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRUaW1lc3RhbXBfbChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKQpAQCAtMzYzOSw2ICszODkyLDE1IEBACiAgICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uNjQ7CiAgICAgICAgIGlmIChtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigmcG9zaXRpb242NCwgJnRpbWVzdGFtcC5tVGltZSkgPT0gT0spIHsKICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpcG9zaXRpb242NDsKKyAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBvc2l0aW9uT2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25PZmZzZXQgPiB0aW1lc3RhbXAubVBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gLT0gcG9zaXRpb25PZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgfQpAQCAtMzY3MSw2ICszOTMzLDcgQEAKICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOwogICAgIH0KIAorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2lua1BvcnRJZCA9IHBhdGNoLT5zaW5rc1swXS5pZDsKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAgICAgLy8gd2hlbiBjaGFuZ2luZyB0aGUgYXVkaW8gb3V0cHV0IGRldmljZSwgY2FsbCBhZGRCYXR0ZXJ5RGF0YSB0byBub3RpZnkKICAgICAvLyB0aGUgY2hhbmdlCkBAIC0zNzAwLDcgKzM5NjMsNyBAQAogCiAgICAgLy8gbVByZXZPdXREZXZpY2UgaXMgdGhlIGxhdGVzdCBkZXZpY2Ugc2V0IGJ5IGNyZWF0ZUF1ZGlvUGF0Y2hfbCgpLiBJdCBpcyBub3Qgc2V0IHdoZW4KICAgICAvLyB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQgc28gdGhhdCB0aGUgZmlyc3QgcGF0Y2ggY3JlYXRpb24gdHJpZ2dlcnMgYW4gaW9Db25maWdDaGFuZ2VkIGNhbGxiYWNrCi0gICAgYm9vbCBjb25maWdDaGFuZ2VkID0gbVByZXZPdXREZXZpY2UgIT0gdHlwZTsKKyAgICBib29sIGNvbmZpZ0NoYW5nZWQgPSAobVByZXZPdXREZXZpY2UgIT0gdHlwZSkgfHwgKG1EZXZpY2VJZCAhPSBzaW5rUG9ydElkKTsKICAgICBtT3V0RGV2aWNlID0gdHlwZTsKICAgICBtUGF0Y2ggPSAqcGF0Y2g7CiAKQEAgLTM3MjksNiArMzk5Miw3IEBACiAgICAgfQogICAgIGlmIChjb25maWdDaGFuZ2VkKSB7CiAgICAgICAgIG1QcmV2T3V0RGV2aWNlID0gdHlwZTsKKyAgICAgICAgbURldmljZUlkID0gc2lua1BvcnRJZDsKICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMzc3NywxMiArNDA0MSwxNiBAQAogICAgIGRlc3Ryb3lUcmFja19sKHRyYWNrKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewotICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIFRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKICAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aGFuZGxlKCk7CiAgICAgY29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgaWYgKG1PdXRwdXQgJiYgbU91dHB1dC0+ZmxhZ3MgIT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLm91dHB1dCA9IG1PdXRwdXQtPmZsYWdzOworICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzc5OCw2ICs0MDY2LDcgQEAKICAgICAgICAgLy8gbVBpcGVTaW5rIGJlbG93CiAgICAgICAgIC8vIG1Ob3JtYWxTaW5rIGJlbG93CiB7CisgICAgc2V0TWFzdGVyQmFsYW5jZShhdWRpb0ZsaW5nZXItPmdldE1hc3RlckJhbGFuY2VfbCgpKTsKICAgICBBTE9HVigiTWl4ZXJUaHJlYWQoKSBpZD0lZCBkZXZpY2U9JSN4IHR5cGU9JWQiLCBpZCwgZGV2aWNlLCB0eXBlKTsKICAgICBBTE9HVigibVNhbXBsZVJhdGU9JXUsIG1DaGFubmVsTWFzaz0lI3gsIG1DaGFubmVsQ291bnQ9JXUsIG1Gb3JtYXQ9JSN4LCBtRnJhbWVTaXplPSV6dSwgIgogICAgICAgICAgICAgIm1GcmFtZUNvdW50PSV6dSwgbU5vcm1hbEZyYW1lQ291bnQ9JXp1IiwKQEAgLTM4MTQsNyArNDA4Myw4IEBACiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNpbmsgZm9yIHRoZSBIQUwgb3V0cHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1PdXRwdXRTaW5rID0gbmV3IEF1ZGlvU3RyZWFtT3V0U2luayhvdXRwdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCl9OworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQygKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCwgbUZvcm1hdCl9OwogI2lmICFMT0dfTkRFQlVHCiAgICAgc3NpemVfdCBpbmRleCA9CiAjZWxzZQpAQCAtMzg1NiwxNiArNDEyNiwxNCBAQAogICAgICAgICAgICAgLy8gY2hhbmdlIG91ciBTaW5rIGZvcm1hdCB0byBhY2NlcHQgb3VyIGludGVybWVkaWF0ZSBwcmVjaXNpb24KICAgICAgICAgICAgIG1Gb3JtYXQgPSBmYXN0TWl4ZXJGb3JtYXQ7CiAgICAgICAgICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKLSAgICAgICAgICAgIG1GcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsIG1Gb3JtYXQpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpbmtCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgc2lua0J1ZmZlclNpemUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY3JlYXRlIGEgTW9ub1BpcGUgdG8gY29ubmVjdCBvdXIgc3VibWl4IHRvIEZhc3RNaXhlcgogICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gbU91dHB1dFNpbmstPmZvcm1hdCgpOwotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIE5CQUlPX0Zvcm1hdCBvcmlnZm9ybWF0ID0gZm9ybWF0OwotI2VuZGlmCisKICAgICAgICAgLy8gYWRqdXN0IGZvcm1hdCB0byBtYXRjaCB0aGF0IG9mIHRoZSBGYXN0IE1peGVyCiAgICAgICAgIEFMT0dWKCJmb3JtYXQgY2hhbmdlZCBmcm9tICUjeCB0byAlI3giLCBmb3JtYXQubUZvcm1hdCwgZmFzdE1peGVyRm9ybWF0KTsKICAgICAgICAgZm9ybWF0Lm1Gb3JtYXQgPSBmYXN0TWl4ZXJGb3JtYXQ7CkBAIC0zODc3LDcgKzQxNDUsNyBAQAogICAgICAgICBNb25vUGlwZSAqbW9ub1BpcGUgPSBuZXcgTW9ub1BpcGUobU5vcm1hbEZyYW1lQ291bnQgKiA0LCBmb3JtYXQsIHRydWUgLyp3cml0ZUNhbkJsb2NrKi8pOwogICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge2Zvcm1hdH07CiAgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSNpZiAhTE9HX05ERUJVRyB8fCBkZWZpbmVkKFRFRV9TSU5LKQorI2lmICFMT0dfTkRFQlVHCiAgICAgICAgIHNzaXplX3QgaW5kZXggPQogI2Vsc2UKICAgICAgICAgKHZvaWQpCkBAIC0zODg4LDI1ICs0MTU2LDggQEAKICAgICAgICAgICAgICAgICAobW9ub1BpcGUtPm1heEZyYW1lcygpICogNykgLyA4IDogbU5vcm1hbEZyYW1lQ291bnQgKiAyKTsKICAgICAgICAgbVBpcGVTaW5rID0gbW9ub1BpcGU7CiAKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBpZiAobVRlZVNpbmtPdXRwdXRFbmFibGVkKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBQaXBlIHRvIGFyY2hpdmUgYSBjb3B5IG9mIEZhc3RNaXhlcidzIG91dHB1dCBmb3IgZHVtcHN5cwotICAgICAgICAgICAgUGlwZSAqdGVlU2luayA9IG5ldyBQaXBlKG1UZWVTaW5rT3V0cHV0RnJhbWVzLCBvcmlnZm9ybWF0KTsKLSAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnMyWzFdID0ge29yaWdmb3JtYXR9OwotICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IHRlZVNpbmstPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgbVRlZVNpbmsgPSB0ZWVTaW5rOwotICAgICAgICAgICAgUGlwZVJlYWRlciAqdGVlU291cmNlID0gbmV3IFBpcGVSZWFkZXIoKnRlZVNpbmspOwotICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IHRlZVNvdXJjZS0+bmVnb3RpYXRlKG9mZmVyczIsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICBtVGVlU291cmNlID0gdGVlU291cmNlOwotICAgICAgICB9Ci0jZW5kaWYKLQogICAgICAgICAvLyBjcmVhdGUgZmFzdCBtaXhlciBhbmQgY29uZmlndXJlIGl0IGluaXRpYWxseSB3aXRoIGp1c3Qgb25lIGZhc3QgdHJhY2sgZm9yIG91ciBzdWJtaXgKLSAgICAgICAgbUZhc3RNaXhlciA9IG5ldyBGYXN0TWl4ZXIoKTsKKyAgICAgICAgbUZhc3RNaXhlciA9IG5ldyBGYXN0TWl4ZXIobUlkKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKICAgICAgICAgc3EtPnNldE9ic2VydmVyRHVtcCgmbVN0YXRlUXVldWVPYnNlcnZlckR1bXApOwpAQCAtMzkxNyw4ICs0MTY4LDEwIEBACiAgICAgICAgIC8vIHdyYXAgdGhlIHNvdXJjZSBzaWRlIG9mIHRoZSBNb25vUGlwZSB0byBtYWtlIGl0IGFuIEF1ZGlvQnVmZmVyUHJvdmlkZXIKICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPSBuZXcgU291cmNlQXVkaW9CdWZmZXJQcm92aWRlcihuZXcgTW9ub1BpcGVSZWFkZXIobW9ub1BpcGUpKTsKICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IgYXVkaW8gdG8gRmFzdE1peGVyCisgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrOyAvLyBtUGlwZVNpbmsgY2hhbm5lbCBtYXNrIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gdG8gRmFzdE1peGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IG1Gb3JtYXQ7IC8vIG1QaXBlU2luayBmb3JtYXQgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FOwogICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgIHN0YXRlLT5tRmFzdFRyYWNrc0dlbisrOwogICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayA9IDE7CkBAIC0zOTI2LDI0ICs0MTc5LDMwIEBACiAgICAgICAgIHN0YXRlLT5tT3V0cHV0U2luayA9IG1PdXRwdXRTaW5rLmdldCgpOwogICAgICAgICBzdGF0ZS0+bU91dHB1dFNpbmtHZW4rKzsKICAgICAgICAgc3RhdGUtPm1GcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CisgICAgICAgIC8vIHNwZWNpZnkgc2luayBjaGFubmVsIG1hc2sgd2hlbiBoYXB0aWMgY2hhbm5lbCBtYXNrIHByZXNlbnQgYXMgaXQgY2FuIG5vdAorICAgICAgICAvLyBiZSBjYWxjdWxhdGVkIGRpcmVjdGx5IGZyb20gY2hhbm5lbCBjb3VudAorICAgICAgICBzdGF0ZS0+bVNpbmtDaGFubmVsTWFzayA9IG1IYXB0aWNDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICA/IEFVRElPX0NIQU5ORUxfTk9ORSA6IG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzazsKICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkNPTERfSURMRTsKICAgICAgICAgLy8gYWxyZWFkeSBkb25lIGluIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGxpc3QKICAgICAgICAgLy9tRmFzdE1peGVyRnV0ZXggPSAwOwogICAgICAgICBzdGF0ZS0+bUNvbGRGdXRleEFkZHIgPSAmbUZhc3RNaXhlckZ1dGV4OwogICAgICAgICBzdGF0ZS0+bUNvbGRHZW4rKzsKICAgICAgICAgc3RhdGUtPm1EdW1wU3RhdGUgPSAmbUZhc3RNaXhlckR1bXBTdGF0ZTsKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBzdGF0ZS0+bVRlZVNpbmsgPSBtVGVlU2luay5nZXQoKTsKLSNlbmRpZgogICAgICAgICBtRmFzdE1peGVyTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtGYXN0TWl4ZXJMb2dTaXplLCAiRmFzdE1peGVyIik7CiAgICAgICAgIHN0YXRlLT5tTkJMb2dXcml0ZXIgPSBtRmFzdE1peGVyTkJMb2dXcml0ZXIuZ2V0KCk7CiAgICAgICAgIHNxLT5lbmQoKTsKICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEKTsKIAorICAgICAgICBOQkxvZzo6dGhyZWFkX2luZm9fdCBpbmZvOworICAgICAgICBpbmZvLmlkID0gbUlkOworICAgICAgICBpbmZvLnR5cGUgPSBOQkxvZzo6RkFTVE1JWEVSOworICAgICAgICBtRmFzdE1peGVyTkJMb2dXcml0ZXItPmxvZzxOQkxvZzo6RVZFTlRfVEhSRUFEX0lORk8+KGluZm8pOworCiAgICAgICAgIC8vIHN0YXJ0IHRoZSBmYXN0IG1peGVyCiAgICAgICAgIG1GYXN0TWl4ZXItPnJ1bigiRmFzdE1peGVyIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKICAgICAgICAgcGlkX3QgdGlkID0gbUZhc3RNaXhlci0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CiAgICAgICAgIHN0cmVhbSgpLT5zZXRIYWxUaHJlYWRQcmlvcml0eShrUHJpb3JpdHlGYXN0TWl4ZXIpOwogCiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKQEAgLTM5NTIsOSArNDIxMSwxNCBAQAogICAgICAgICBtQXVkaW9XYXRjaGRvZy0+c2V0RHVtcCgmbUF1ZGlvV2F0Y2hkb2dEdW1wKTsKICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnJ1bigiQXVkaW9XYXRjaGRvZyIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHRpZCA9IG1BdWRpb1dhdGNoZG9nLT5nZXRUaWQoKTsKLSAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkKCksIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKICNlbmRpZgotCisgICAgfSBlbHNlIHsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAvLyBPbmx5IHVzZSB0aGUgTWl4ZXJUaHJlYWQgdGVlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgbVRlZS5zZXQobU91dHB1dFNpbmstPmZvcm1hdCgpLCBOQkFJT19UZWU6OlRFRV9GTEFHX09VVFBVVF9USFJFQUQpOworICAgICAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9NIik7CisjZW5kaWYKICAgICB9CiAKICAgICBzd2l0Y2ggKGtVc2VGYXN0TWl4ZXIpIHsKQEAgLTQwMTgsMTIgKzQyODIsNiBAQAogICAgIHJldHVybiBsYXRlbmN5OwogfQogCi0KLXZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF9yZW1vdmVUcmFja3MoY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCi17Ci0gICAgUGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKHRyYWNrc1RvUmVtb3ZlKTsKLX0KLQogc3NpemVfdCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp0aHJlYWRMb29wX3dyaXRlKCkKIHsKICAgICAvLyBGSVhNRSB3ZSBzaG91bGQgb25seSBkbyBvbmUgcHVzaCBwZXIgY3ljbGU7IGNvbmZpcm0gdGhpcyBpcyB0cnVlCkBAIC00MjIyLDE0ICs0NDgwLDE0IEBACiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjptaXhlcl9zdGF0ZSBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woCiAgICAgICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gKnRyYWNrc1RvUmVtb3ZlKQogewotICAgIC8vIGNsZWFuIHVwIGRlbGV0ZWQgdHJhY2sgbmFtZXMgaW4gQXVkaW9NaXhlciBiZWZvcmUgYWxsb2NhdGluZyBuZXcgdHJhY2tzCi0gICAgKHZvaWQpbVRyYWNrcy5wcm9jZXNzRGVsZXRlZFRyYWNrTmFtZXMoW3RoaXNdKGludCBuYW1lKSB7Ci0gICAgICAgIC8vIGZvciBlYWNoIG5hbWUsIGRlc3Ryb3kgaXQgaW4gdGhlIEF1ZGlvTWl4ZXIKLSAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5kZXN0cm95KG5hbWUpOworICAgIC8vIGNsZWFuIHVwIGRlbGV0ZWQgdHJhY2sgaWRzIGluIEF1ZGlvTWl4ZXIgYmVmb3JlIGFsbG9jYXRpbmcgbmV3IHRyYWNrcworICAgICh2b2lkKW1UcmFja3MucHJvY2Vzc0RlbGV0ZWRUcmFja0lkcyhbdGhpc10oaW50IHRyYWNrSWQpIHsKKyAgICAgICAgLy8gZm9yIGVhY2ggdHJhY2tJZCwgZGVzdHJveSBpdCBpbiB0aGUgQXVkaW9NaXhlcgorICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgeworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRlc3Ryb3kodHJhY2tJZCk7CiAgICAgICAgIH0KICAgICB9KTsKLSAgICBtVHJhY2tzLmNsZWFyRGVsZXRlZFRyYWNrTmFtZXMoKTsKKyAgICBtVHJhY2tzLmNsZWFyRGVsZXRlZFRyYWNrSWRzKCk7CiAKICAgICBtaXhlcl9zdGF0ZSBtaXhlclN0YXR1cyA9IE1JWEVSX0lETEU7CiAgICAgLy8gZmluZCBvdXQgd2hpY2ggdHJhY2tzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCkBAIC00MjcwLDYgKzQ1MjgsMzggQEAKICAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IGZhbHNlOyAgLy8gbU1peGVyQnVmZmVyIGhhcyBubyB2YWxpZCBkYXRhIHVudGlsIGFwcHJvcHJpYXRlIHRyYWNrcyBmb3VuZC4KICAgICBtRWZmZWN0QnVmZmVyVmFsaWQgPSBmYWxzZTsgLy8gbUVmZmVjdEJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCB0cmFja3MgZm91bmQuCiAKKyAgICAvLyBEZWZlcnJlZE9wZXJhdGlvbnMgaGFuZGxlcyBzdGF0aXN0aWNzIGFmdGVyIHNldHRpbmcgbWl4ZXJTdGF0dXMuCisgICAgY2xhc3MgRGVmZXJyZWRPcGVyYXRpb25zIHsKKyAgICBwdWJsaWM6CisgICAgICAgIERlZmVycmVkT3BlcmF0aW9ucyhtaXhlcl9zdGF0ZSAqbWl4ZXJTdGF0dXMpCisgICAgICAgICAgICA6IG1NaXhlclN0YXR1cyhtaXhlclN0YXR1cykgeyB9CisKKyAgICAgICAgLy8gd2hlbiBsZWF2aW5nIHNjb3BlLCB0YWxseSBmcmFtZXMgcHJvcGVybHkuCisgICAgICAgIH5EZWZlcnJlZE9wZXJhdGlvbnMoKSB7CisgICAgICAgICAgICAvLyBUYWxseSB1bmRlcnJ1biBmcmFtZXMgb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgbWl4aW5nIChNSVhFUl9UUkFDS1NfUkVBRFkpCisgICAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgaXMgd2hlbiB0aGUgdW5kZXJydW4gb2NjdXJzLgorICAgICAgICAgICAgLy8gV2UgZG8gbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gRmFzdFRyYWNrcyBhbmQgTm9ybWFsVHJhY2tzIGhlcmUuCisgICAgICAgICAgICBpZiAoKm1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnVuZGVycnVuIDogbVVuZGVycnVuRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVuLmZpcnN0LT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVuLnNlY29uZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGFsbHlVbmRlcnJ1bkZyYW1lcygpIGlzIGNhbGxlZCB0byB1cGRhdGUgdGhlIHRyYWNrIGNvdW50ZXJzCisgICAgICAgIC8vIHdpdGggdGhlIG51bWJlciBvZiB1bmRlcnJ1biBmcmFtZXMgZm9yIGEgcGFydGljdWxhciBtaXhlciBwZXJpb2QuCisgICAgICAgIC8vIFdlIGRlZmVyIHRhbGx5aW5nIHVudGlsIHdlIGtub3cgdGhlIGZpbmFsIG1peGVyIHN0YXR1cy4KKyAgICAgICAgdm9pZCB0YWxseVVuZGVycnVuRnJhbWVzKHNwPFRyYWNrPiB0cmFjaywgc2l6ZV90IHVuZGVycnVuRnJhbWVzKSB7CisgICAgICAgICAgICBtVW5kZXJydW5GcmFtZXMuZW1wbGFjZV9iYWNrKHRyYWNrLCB1bmRlcnJ1bkZyYW1lcyk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IG1peGVyX3N0YXRlICogY29uc3QgbU1peGVyU3RhdHVzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3A8VHJhY2s+LCBzaXplX3Q+PiBtVW5kZXJydW5GcmFtZXM7CisgICAgfSBkZWZlcnJlZE9wZXJhdGlvbnMoJm1peGVyU3RhdHVzKTsgLy8gaW1wbGljaXQgbmVzdGVkIHNjb3BlIGZvciB2YXJpYWJsZSBjYXB0dXJlCisKKyAgICBib29sIG5vRmFzdEhhcHRpY1RyYWNrID0gdHJ1ZTsKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiB0ID0gbUFjdGl2ZVRyYWNrc1tpXTsKIApAQCAtNDI3OCw2ICs0NTY4LDkgQEAKIAogICAgICAgICAvLyBwcm9jZXNzIGZhc3QgdHJhY2tzCiAgICAgICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIG5vRmFzdEhhcHRpY1RyYWNrID0gZmFsc2U7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEl0J3MgdGhlb3JldGljYWxseSBwb3NzaWJsZSAodGhvdWdoIHVubGlrZWx5KSBmb3IgYSBmYXN0IHRyYWNrIHRvIGJlIGNyZWF0ZWQKICAgICAgICAgICAgIC8vIGFuZCB0aGVuIHJlbW92ZWQgd2l0aGluIHRoZSBzYW1lIG5vcm1hbCBtaXggY3ljbGUuICBUaGlzIGlzIG5vdCBhIHByb2JsZW0sIGFzCkBAIC00MzA0LDEzICs0NTk3LDE0IEBACiAgICAgICAgICAgICB0cmFjay0+bU9ic2VydmVkVW5kZXJydW5zID0gdW5kZXJydW5zOwogICAgICAgICAgICAgLy8gZG9uJ3QgY291bnQgdW5kZXJydW5zIHRoYXQgb2NjdXIgd2hpbGUgc3RvcHBpbmcgb3IgcGF1c2luZwogICAgICAgICAgICAgLy8gb3Igc3RvcHBlZCB3aGljaCBjYW4gb2NjdXIgd2hlbiBmbHVzaCgpIGlzIGNhbGxlZCB3aGlsZSBhY3RpdmUKKyAgICAgICAgICAgIHNpemVfdCB1bmRlcnJ1bkZyYW1lcyA9IDA7CiAgICAgICAgICAgICBpZiAoISh0cmFjay0+aXNTdG9wcGluZygpIHx8IHRyYWNrLT5pc1BhdXNpbmcoKSB8fCB0cmFjay0+aXNTdG9wcGVkKCkpICYmCiAgICAgICAgICAgICAgICAgICAgIHJlY2VudFVuZGVycnVucyA+IDApIHsKICAgICAgICAgICAgICAgICAvLyBGSVhNRSBmYXN0IG1peGVyIHdpbGwgcHVsbCAmIG1peCBwYXJ0aWFsIGJ1ZmZlcnMsIGJ1dCB3ZSBjb3VudCBhcyBhIGZ1bGwgdW5kZXJydW4KLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhyZWNlbnRVbmRlcnJ1bnMgKiBtRnJhbWVDb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOworICAgICAgICAgICAgICAgIHVuZGVycnVuRnJhbWVzID0gcmVjZW50VW5kZXJydW5zICogbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbW1lZGlhdGVseSBhY2NvdW50IGZvciBGYXN0VHJhY2sgdW5kZXJydW5zLgorICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXModW5kZXJydW5GcmFtZXMpOwogCiAgICAgICAgICAgICAvLyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUgZm9yIG5vcm1hbCB0cmFja3MsCiAgICAgICAgICAgICAvLyB3aXRoIGEgZmV3IG1vZGlmaWNhdGlvbnMgZm9yIGZhc3QgdHJhY2tzLgpAQCAtNDQwMiw2ICs0Njk2LDggQEAKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSB2cDsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSB0cmFjay0+bUNoYW5uZWxNYXNrOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSB0cmFjay0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpOworICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNJbnRlbnNpdHkgPSB0cmFjay0+Z2V0SGFwdGljSW50ZW5zaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUdlbmVyYXRpb24rKzsKICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgfD0gMSA8PCBqOwogICAgICAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOwpAQCAtNDQ0Nyw2ICs0NzQzLDEwIEBACiAgICAgICAgICAgICAgICAgLy8gQXZvaWRzIGEgbWlzbGVhZGluZyBkaXNwbGF5IGluIGR1bXBzeXMKICAgICAgICAgICAgICAgICB0cmFjay0+bU9ic2VydmVkVW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9GVUxMOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCAhPSB0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSB0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCk7CisgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKQEAgLTQ0NTYsMTkgKzQ3NTYsMjEgQEAKIAogICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSBhIHRyYWNrIGlzIGFkZGVkIHdlIHdhaXQKICAgICAgICAgLy8gZm9yIGFsbCBpdHMgYnVmZmVycyB0byBiZSBmaWxsZWQgYmVmb3JlIHByb2Nlc3NpbmcgaXQKLSAgICAgICAgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgICAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOwogCiAgICAgICAgIC8vIGlmIGFuIGFjdGl2ZSB0cmFjayBkb2Vzbid0IGV4aXN0IGluIHRoZSBBdWRpb01peGVyLCBjcmVhdGUgaXQuCi0gICAgICAgIGlmICghbUF1ZGlvTWl4ZXItPmV4aXN0cyhuYW1lKSkgeworICAgICAgICAvLyB1c2UgdGhlIHRyYWNrSWQgYXMgdGhlIEF1ZGlvTWl4ZXIgbmFtZS4KKyAgICAgICAgaWYgKCFtQXVkaW9NaXhlci0+ZXhpc3RzKHRyYWNrSWQpKSB7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9NaXhlci0+Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TZXNzaW9uSWQpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dXKCIlczogY2Fubm90IGNyZWF0ZSB0cmFjayBuYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCwgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCBpbiBBdWRpb01peGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuYW1lLCB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpOiBBdWRpb01peGVyIGNhbm5vdCBjcmVhdGUgdHJhY2soJWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFja0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICB0cmFjay0+aW52YWxpZGF0ZSgpOyAvLyBjb25zaWRlciBpdCBkZWFkLgogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNDQ4OSw3ICs0NzkxLDcgQEAKICAgICAgICAgLy8gVE9ETzogT05MWSBVU0VEIEZPUiBMRUdBQ1kgUkVTQU1QTEVSUywgcmVtb3ZlIHdoZW4gdGhleSBhcmUgcmVtb3ZlZC4KICAgICAgICAgLy8gYWRkIGZyYW1lcyBhbHJlYWR5IGNvbnN1bWVkIGJ1dCBub3QgeWV0IHJlbGVhc2VkIGJ5IHRoZSByZXNhbXBsZXIKICAgICAgICAgLy8gYmVjYXVzZSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeSgpIHdpbGwgaW5jbHVkZSB0aGVzZSBmcmFtZXMKLSAgICAgICAgZGVzaXJlZEZyYW1lcyArPSBtQXVkaW9NaXhlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcyh0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgZGVzaXJlZEZyYW1lcyArPSBtQXVkaW9NaXhlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcyh0cmFja0lkKTsKIAogICAgICAgICB1aW50MzJfdCBtaW5GcmFtZXMgPSAxOwogICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSA9PSAwKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpICYmICF0cmFjay0+aXNQYXVzaW5nKCkgJiYKQEAgLTQ1MDEsMTMgKzQ4MDMsMTMgQEAKICAgICAgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKICAgICAgICAgICAgIC8vIEkgd2lzaCB3ZSBoYWQgZm9ybWF0dGVkIHRyYWNlIG5hbWVzCiAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0cmFjZU5hbWUoIm5SZHkiKTsKLSAgICAgICAgICAgIHRyYWNlTmFtZSArPSBzdGQ6OnRvX3N0cmluZyh0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgICAgIHRyYWNlTmFtZSArPSBzdGQ6OnRvX3N0cmluZyh0cmFja0lkKTsKICAgICAgICAgICAgIEFUUkFDRV9JTlQodHJhY2VOYW1lLmNfc3RyKCksIGZyYW1lc1JlYWR5KTsKICAgICAgICAgfQogICAgICAgICBpZiAoKGZyYW1lc1JlYWR5ID49IG1pbkZyYW1lcykgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbT0tdIG9uIHRocmVhZCAlcCIsIG5hbWUsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOworICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayglZCkgcz0lMDh4IFtPS10gb24gdGhyZWFkICVwIiwgdHJhY2tJZCwgY2Jsay0+bVNlcnZlciwgdGhpcyk7CiAKICAgICAgICAgICAgIG1peGVkVHJhY2tzKys7CiAKQEAgLTQ1MjQsOSArNDgyNiw5IEBACiAgICAgICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzV2l0aEVmZmVjdCsrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwcmVwYXJlVHJhY2tzX2woKTogdHJhY2sgJWQgYXR0YWNoZWQgdG8gZWZmZWN0IGJ1dCBubyBjaGFpbiBmb3VuZCBvbiAiCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwcmVwYXJlVHJhY2tzX2woKTogdHJhY2soJWQpIGF0dGFjaGVkIHRvIGVmZmVjdCBidXQgbm8gY2hhaW4gZm91bmQgb24gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXNzaW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC00NTM3LDkgKzQ4MzksMTIgQEAKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpSRVNVTUlORykgewogICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtID0gQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUU7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgbmV3IHRyYWNrIGlzIHBhdXNlZCBpbW1lZGlhdGVseSBhZnRlciBzdGFydCwgZG8gbm90IHJhbXAgb24gcmVzdW1lLgorICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsay0+bVNlcnZlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsIEF1ZGlvTWl4ZXI6OlJFU0VULCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLCBBdWRpb01peGVyOjpSRVNFVCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgbUxlZnRWb2xGbG9hdCA9IC0xLjA7CiAgICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgbm90IG1ha2UgYSBkZWNpc2lvbiBiYXNlZCBvbiBtU2VydmVyCiAgICAgICAgICAgICB9IGVsc2UgaWYgKGNibGstPm1TZXJ2ZXIgIT0gMCkgewpAQCAtNDYzNSwyNCArNDk0MCwyNSBAQAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gWFhYOiB0aGVzZSB0aGluZ3MgRE9OJ1QgbmVlZCB0byBiZSBkb25lIGVhY2ggdGltZQotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIHRyYWNrKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIodHJhY2tJZCwgdHJhY2spOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZSh0cmFja0lkKTsKIAotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAmdmFmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIHBhcmFtLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJnZhZik7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpGT1JNQVQsICh2b2lkICopdHJhY2stPmZvcm1hdCgpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywgKHZvaWQgKikodWludHB0cl90KXRyYWNrLT5jaGFubmVsTWFzaygpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAotICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywgKHZvaWQgKikodWludHB0cl90KW1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCkobUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrKSk7CiAgICAgICAgICAgICAvLyBsaW1pdCB0cmFjayBzYW1wbGUgcmF0ZSB0byAyIHggb3V0cHV0IHNhbXBsZSByYXRlLCB3aGljaCBjaGFuZ2VzIGF0IHJlLWNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgIHVpbnQzMl90IG1heFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZSAqIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWDsKICAgICAgICAgICAgIHVpbnQzMl90IHJlcVNhbXBsZVJhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpOwpAQCAtNDY2MiwxNCArNDk2OCwxNCBAQAogICAgICAgICAgICAgICAgIHJlcVNhbXBsZVJhdGUgPSBtYXhTYW1wbGVSYXRlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCiAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KXJlcVNhbXBsZVJhdGUpOwogCiAgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0UGxheWJhY2tSYXRlKCk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUSU1FU1RSRVRDSCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpQTEFZQkFDS19SQVRFLAogICAgICAgICAgICAgICAgICZwbGF5YmFja1JhdGUpOwpAQCAtNDY5MCwyOSArNDk5NiwzNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiAodHJhY2stPm1haW5CdWZmZXIoKSA9PSBtU2lua0J1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRyYWNrLT5tYWluQnVmZmVyKCkgPT0gbU1peGVyQnVmZmVyKSkgewogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOwogICAgICAgICAgICAgICAgIC8vIFRPRE86IG92ZXJyaWRlIHRyYWNrLT5tYWluQnVmZmVyKCk/CiAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKilFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKil0cmFjay0+bWFpbkJ1ZmZlcigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkFVWF9CVUZGRVIsICh2b2lkICopdHJhY2stPmF1eEJ1ZmZlcigpKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpIQVBUSUNfRU5BQkxFRCwgKHZvaWQgKikodWludHB0cl90KXRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6SEFQVElDX0lOVEVOU0lUWSwgKHZvaWQgKikodWludHB0cl90KXRyYWNrLT5nZXRIYXB0aWNJbnRlbnNpdHkoKSk7CiAKICAgICAgICAgICAgIC8vIHJlc2V0IHJldHJ5IGNvdW50CiAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzOwpAQCAtNDcyNSwxMyArNTAzOSwxMyBAQAogICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX1JFQURZOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IHVuZGVycnVuRnJhbWVzID0gMDsKICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA8IGRlc2lyZWRGcmFtZXMgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2VkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigidHJhY2soJXApIHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjaywgZnJhbWVzUmVhZHksIGRlc2lyZWRGcmFtZXMpOwotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKGRlc2lyZWRGcmFtZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigidHJhY2soJWQpIHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCBmcmFtZXNSZWFkeSwgZGVzaXJlZEZyYW1lcyk7CisgICAgICAgICAgICAgICAgdW5kZXJydW5GcmFtZXMgPSBkZXNpcmVkRnJhbWVzOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmZXJyZWRPcGVyYXRpb25zLnRhbGx5VW5kZXJydW5GcmFtZXModHJhY2ssIHVuZGVycnVuRnJhbWVzKTsKIAogICAgICAgICAgICAgLy8gY2xlYXIgZWZmZWN0IGNoYWluIGlucHV0IGJ1ZmZlciBpZiBhbiBhY3RpdmUgdHJhY2sgdW5kZXJydW5zIHRvIGF2b2lkIHNlbmRpbmcKICAgICAgICAgICAgIC8vIHByZXZpb3VzIGF1ZGlvIGJ1ZmZlciBhZ2FpbiB0byBlZmZlY3RzCkBAIC00NzQwLDcgKzUwNTQsNyBAQAogICAgICAgICAgICAgICAgIGNoYWluLT5jbGVhcklucHV0QnVmZmVyKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtOT1QgUkVBRFldIG9uIHRocmVhZCAlcCIsIG5hbWUsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOworICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayglZCkgcz0lMDh4IFtOT1QgUkVBRFldIG9uIHRocmVhZCAlcCIsIHRyYWNrSWQsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOwogICAgICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgIT0gMCkgfHwgdHJhY2stPmlzVGVybWluYXRlZCgpIHx8CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1N0b3BwZWQoKSB8fCB0cmFjay0+aXNQYXVzZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29uc3VtZWQgYWxsIHRoZSBidWZmZXJzIG9mIHRoaXMgdHJhY2suCkBAIC00NzU5LDcgKzUwNzMsOCBAQAogICAgICAgICAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgZm9yIHRoaXMgdHJhY2suIEdpdmUgaXQgYSBmZXcgY2hhbmNlcyB0bwogICAgICAgICAgICAgICAgIC8vIGZpbGwgYSBidWZmZXIsIHRoZW4gcmVtb3ZlIGl0IGZyb20gYWN0aXZlIGxpc3QuCiAgICAgICAgICAgICAgICAgaWYgKC0tKHRyYWNrLT5tUmV0cnlDb3VudCkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCBvbiB0aHJlYWQgJXAiLCBuYW1lLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3Qgb24gdGhyZWFkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRvIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuOwogICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQpAQCAtNDc3MiwxMyArNTA4NywyNCBAQAogICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5kaXNhYmxlKG5hbWUpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRpc2FibGUodHJhY2tJZCk7CiAgICAgICAgIH0KIAogICAgICAgICB9ICAgLy8gbG9jYWwgdmFyaWFibGUgc2NvcGUgdG8gYXZvaWQgZ290byB3YXJuaW5nCiAKICAgICB9CiAKKyAgICBpZiAobUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSAmJiBzcSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZmFzdCB0cmFjayBwbGF5aW5nIGhhcHRpYyBhbmQgRmFzdE1peGVyIGV4aXN0cywKKyAgICAgICAgLy8gZW5hYmxpbmcgdGhlIGZpcnN0IEZhc3RUcmFjaywgd2hpY2ggcHJvdmlkZXMgbWl4ZWQgZGF0YSBmcm9tIG5vcm1hbAorICAgICAgICAvLyB0cmFja3MsIHRvIHBsYXkgaGFwdGljIGRhdGEuCisgICAgICAgIEZhc3RUcmFjayAqZmFzdFRyYWNrID0gJnN0YXRlLT5tRmFzdFRyYWNrc1swXTsKKyAgICAgICAgaWYgKGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCAhPSBub0Zhc3RIYXB0aWNUcmFjaykgeworICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gbm9GYXN0SGFwdGljVHJhY2s7CisgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gUHVzaCB0aGUgbmV3IEZhc3RNaXhlciBzdGF0ZSBpZiBuZWNlc3NhcnkKICAgICBib29sIHBhdXNlQXVkaW9XYXRjaGRvZyA9IGZhbHNlOwogICAgIGlmIChkaWRNb2RpZnkpIHsKQEAgLTQ4MzMsOSArNTE1OSw5IEBACiAgICAgLy8gb2YgcHJlcGFyZVRyYWNrc19sKCk7IHRoaXMgcmVsZWFzZXMgYW55IG91dHN0YW5kaW5nIGJ1ZmZlciBiYWNrIHRvIHRoZSB0cmFjay4KICAgICAvLyBTZWUgYWxzbyB0aGUgaW1wbGVtZW50YXRpb24gb2YgZGVzdHJveVRyYWNrX2woKS4KICAgICBmb3IgKGNvbnN0IGF1dG8gJnRyYWNrIDogKnRyYWNrc1RvUmVtb3ZlKSB7Ci0gICAgICAgIGNvbnN0IGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKLSAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsgLy8gTm9ybWFsIHRyYWNrcyBoZXJlLCBmYXN0IHRyYWNrcyBpbiBGYXN0TWl4ZXIuCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgbnVsbHB0ciAvKiBidWZmZXJQcm92aWRlciAqLyk7CisgICAgICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CisgICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKHRyYWNrSWQpKSB7IC8vIE5vcm1hbCB0cmFja3MgaGVyZSwgZmFzdCB0cmFja3MgaW4gRmFzdE1peGVyLgorICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKHRyYWNrSWQsIG51bGxwdHIgLyogYnVmZmVyUHJvdmlkZXIgKi8pOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MDA0LDE3ICs1MzMwLDE3IEBACiAgICAgICAgICAgICBkZWxldGUgbUF1ZGlvTWl4ZXI7CiAgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRyYWNrIDogbVRyYWNrcykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOwogICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb01peGVyLT5jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogQXVkaW9NaXhlciBjYW5ub3QgY3JlYXRlIHRyYWNrKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICB9CkBAIC01MDMwLDcgKzUzNTYsOSBAQAogICAgIGRwcmludGYoZmQsICIgIFRocmVhZCB0aHJvdHRsZSB0aW1lIChtc2Vjcyk6ICV1XG4iLCBtVGhyZWFkVGhyb3R0bGVUaW1lTXMpOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvTWl4ZXIgdHJhY2tzOiAlc1xuIiwgbUF1ZGlvTWl4ZXItPnRyYWNrTmFtZXMoKS5jX3N0cigpKTsKICAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKLQorICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBiYWxhbmNlOiAlZiAoJXMpXG4iLCBtTWFzdGVyQmFsYW5jZS5sb2FkKCksCisgICAgICAgICAgICAoaGFzRmFzdE1peGVyKCkgPyBzdGQ6OnRvX3N0cmluZyhtRmFzdE1peGVyLT5nZXRNYXN0ZXJCYWxhbmNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQmFsYW5jZS50b1N0cmluZygpKS5jX3N0cigpKTsKICAgICBpZiAoaGFzRmFzdE1peGVyKCkpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIHRocmVhZCAlcCB0aWQ9JWQiLCBtRmFzdE1peGVyLmdldCgpLCBtRmFzdE1peGVyLT5nZXRUaWQoKSk7CiAKQEAgLTUwMzgsOSArNTM2Niw5IEBACiAgICAgICAgIC8vIHdoaWxlIHdlIGFyZSBkdW1waW5nIGl0LiAgSXQgbWF5IGJlIGluY29uc2lzdGVudCwgYnV0IGl0IHdvbid0IG11dGF0ZSEKICAgICAgICAgLy8gVGhpcyBpcyBhIGxhcmdlIG9iamVjdCBzbyB3ZSBwbGFjZSBpdCBvbiB0aGUgaGVhcC4KICAgICAgICAgLy8gRklYTUUgMjU5NzI5NTg6IE5lZWQgYW4gaW50ZWxsaWdlbnQgY29weSBjb25zdHJ1Y3RvciB0aGF0IGRvZXMgbm90IHRvdWNoIHVudXNlZCBwYWdlcy4KLSAgICAgICAgY29uc3QgRmFzdE1peGVyRHVtcFN0YXRlICpjb3B5ID0gbmV3IEZhc3RNaXhlckR1bXBTdGF0ZShtRmFzdE1peGVyRHVtcFN0YXRlKTsKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEZhc3RNaXhlckR1bXBTdGF0ZT4gY29weSA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxGYXN0TWl4ZXJEdW1wU3RhdGU+KG1GYXN0TWl4ZXJEdW1wU3RhdGUpOwogICAgICAgICBjb3B5LT5kdW1wKGZkKTsKLSAgICAgICAgZGVsZXRlIGNvcHk7CiAKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCiAgICAgICAgIC8vIFNpbWlsYXIgZm9yIHN0YXRlIHF1ZXVlCkBAIC01MDYxLDEyICs1Mzg5LDYgQEAKICAgICB9IGVsc2UgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBGYXN0TWl4ZXJcbiIpOwogICAgIH0KLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gV3JpdGUgdGhlIHRlZSBvdXRwdXQgdG8gYSAud2F2IGZpbGUKLSAgICBkdW1wVGVlKGZkLCBtVGVlU291cmNlLCBtSWQsICdNJyk7Ci0jZW5kaWYKLQogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjppZGxlU2xlZXBUaW1lVXMoKSBjb25zdApAQCAtNTA5MywyMyArNTQxNSwzNCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6RGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKLSAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpCi0gICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCBESVJFQ1QsIHN5c3RlbVJlYWR5KQotewotfQotCi1BdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6RGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKLSAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSwKKyAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgdHlwZSwgc3lzdGVtUmVhZHkpCi0gICAgICAgICwgbVZvbHVtZVNoYXBlckFjdGl2ZShmYWxzZSkKIHsKKyAgICBzZXRNYXN0ZXJCYWxhbmNlKGF1ZGlvRmxpbmdlci0+Z2V0TWFzdGVyQmFsYW5jZV9sKCkpOwogfQogCiBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6fkRpcmVjdE91dHB1dFRocmVhZCgpCiB7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoreworICAgIFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgYmFsYW5jZTogJWYgIExlZnQ6ICVmICBSaWdodDogJWZcbiIsCisgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZS5sb2FkKCksIG1NYXN0ZXJCYWxhbmNlTGVmdCwgbU1hc3RlckJhbGFuY2VSaWdodCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtTWFzdGVyQmFsYW5jZSAhPSBiYWxhbmNlKSB7CisgICAgICAgIG1NYXN0ZXJCYWxhbmNlLnN0b3JlKGJhbGFuY2UpOworICAgICAgICBtQmFsYW5jZS5jb21wdXRlU3RlcmVvQmFsYW5jZShiYWxhbmNlLCAmbU1hc3RlckJhbGFuY2VMZWZ0LCAmbU1hc3RlckJhbGFuY2VSaWdodCk7CisgICAgICAgIGJyb2FkY2FzdF9sKCk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpwcm9jZXNzVm9sdW1lX2woVHJhY2sgKnRyYWNrLCBib29sIGxhc3RUcmFjaykKIHsKICAgICBmbG9hdCBsZWZ0LCByaWdodDsKQEAgLTUxMzMsMTIgKzU0NjYsMTIgQEAKICAgICAgICAgaWYgKGxlZnQgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CiAgICAgICAgICAgICBsZWZ0ID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICAgICAgfQotICAgICAgICBsZWZ0ICo9IHY7CisgICAgICAgIGxlZnQgKj0gdiAqIG1NYXN0ZXJCYWxhbmNlTGVmdDsgLy8gRGlyZWN0T3V0cHV0VGhyZWFkIGJhbGFuY2UgYXBwbGllZCBhcyB0cmFjayB2b2x1bWUKICAgICAgICAgcmlnaHQgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOwogICAgICAgICBpZiAocmlnaHQgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CiAgICAgICAgICAgICByaWdodCA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgICAgIH0KLSAgICAgICAgcmlnaHQgKj0gdjsKKyAgICAgICAgcmlnaHQgKj0gdiAqIG1NYXN0ZXJCYWxhbmNlUmlnaHQ7CiAgICAgfQogCiAgICAgaWYgKGxhc3RUcmFjaykgewpAQCAtNTE4MCw2ICs1NTEzLDExIEBACiAgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHByZXZpb3VzVHJhY2sgPT0gMCkgeworICAgICAgICAvLyB0aGVyZSBjb3VsZCBiZSBhbiBvbGQgdHJhY2sgYWRkZWQgYmFjayBkdXJpbmcgdHJhY2sgdHJhbnNpdGlvbiBmb3IgZGlyZWN0CisgICAgICAgIC8vIG91dHB1dCwgc28gYWx3YXlzIGlzc3VlcyBmbHVzaCB0byBmbHVzaCBkYXRhIG9mIHRoZSBwcmV2aW91cyB0cmFjayBpZiBpdAorICAgICAgICAvLyB3YXMgYWxyZWFkeSBkZXN0cm95ZWQgd2l0aCBIQUwgcGF1c2VkLCB0aGVuIGZsdXNoIGNhbiByZXN1bWUgdGhlIHBsYXliYWNrCisgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgIH0KICAgICBQbGF5YmFja1RocmVhZDo6b25BZGROZXdUcmFja19sKCk7CiB9CkBAIC01MjE4LDcgKzU1NTYsNiBAQAogICAgICAgICAgICAgICAgIGRvSHdQYXVzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0ZsdXNoUGVuZGluZygpKSB7CiAgICAgICAgICAgICB0cmFjay0+Zmx1c2hBY2soKTsKICAgICAgICAgICAgIGlmIChsYXN0KSB7CkBAIC01MjUzLDcgKzU1OTAsNyBAQAogICAgICAgICBpZiAoKHRyYWNrLT5mcmFtZXNSZWFkeSgpID49IG1pbkZyYW1lcykgJiYgdHJhY2stPmlzUmVhZHkoKSAmJiAhdHJhY2stPmlzUGF1c2VkKCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzU3RvcHBpbmdfMigpICYmICF0cmFjay0+aXNTdG9wcGVkKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbT0tdIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogCiAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKQEAgLTUzMTUsNyArNTY1Miw4IEBACiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBtQnl0ZXNXcml0dGVuIC8gbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgICBpZiAobVN0YW5kYnkgfHwgIWxhc3QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1BhdXNlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTUzMjksNyArNTY2Nyw3IEBACiAgICAgICAgICAgICAgICAgLy8gZmlsbCBhIGJ1ZmZlciwgdGhlbiByZW1vdmUgaXQgZnJvbSBhY3RpdmUgbGlzdC4KICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGxhc3QgdHJhY2sgc3RhcnRlZCBmb3IgbWl4ZXIgc3RhdGUgY29udHJvbAogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUgdHJhY2soJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFjay0+aWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTU1NjgsNiArNTkwNiw3IEBACiAgICAgbU91dHB1dC0+Zmx1c2goKTsKICAgICBtSHdQYXVzZWQgPSBmYWxzZTsKICAgICBtRmx1c2hQZW5kaW5nID0gZmFsc2U7CisgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsgLy8gRElSRUNUIGFuZCBPRkZMT0FERUQgZmx1c2ggcmVzZXRzIGZyYW1lIGNvdW50LgogfQogCiBpbnQ2NF90IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpjb21wdXRlV2FpdFRpbWVOc19sKCkgY29uc3QgewpAQCAtNTgxMSw3ICs2MTUwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSAgZWxzZSBpZiAodHJhY2stPmZyYW1lc1JlYWR5KCkgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpICYmICF0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKLSAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2soJWQpIHM9JTA4eCBbT0tdIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CiAgICAgICAgICAgICAgICAgaWYgKGxhc3QpIHsKQEAgLTU4NTUsNyArNjE5NCw3IEBACiAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrICVkIHM9JTA4eCBbTk9UIFJFQURZXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOworICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayglZCkgcz0lMDh4IFtOT1QgUkVBRFldIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzEoKSkgewogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSGFyZHdhcmUgYnVmZmVyIGNhbiBob2xkIGEgbGFyZ2UgYW1vdW50IG9mIGF1ZGlvIHNvIHdlIG11c3QKQEAgLTU5MDIsNiArNjI0MSwxNCBAQAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CisgICAgICAgICAgICAgICAgICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIHN0b3AgcmVzZXRzIGZyYW1lIGNvdW50cy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtVXNlQXN5bmNXcml0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZ2V0IGV4cGxpY2l0IGRyYWluIG5vdGlmaWNhdGlvbiB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBkaXNjb250aW51aXR5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKCFsYXN0KSBvciB0aGUgdXBjb21pbmcgKGxhc3QpIHRyYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBza2lwcGluZyB0aGUgZGlzY29udGludWl0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgZm9yIHRoaXMgdHJhY2suIEdpdmUgaXQgYSBmZXcgY2hhbmNlcyB0bwpAQCAtNTkyMyw4ICs2MjcwLDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsgLy8gc3RpbGwgcnVubmluZywgZ2l2ZSB1cyBtb3JlIHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkVGhyZWFkOiBCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZFRocmVhZDogQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSB0cmFjayglZCkgZnJvbSBhY3RpdmUgbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsbCBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC02MDY3LDcgKzY0MTQsMjIgQEAKIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3V0cHV0VHJhY2tzW2ldLT53cml0ZShtU2lua0J1ZmZlciwgd3JpdGVGcmFtZXMpOworICAgICAgICBjb25zdCBzc2l6ZV90IGFjdHVhbFdyaXR0ZW4gPSBvdXRwdXRUcmFja3NbaV0tPndyaXRlKG1TaW5rQnVmZmVyLCB3cml0ZUZyYW1lcyk7CisKKyAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGZpcnN0IE91dHB1dFRyYWNrIGZvciB0aW1lc3RhbXAgYW5kIGZyYW1lIGNvdW50aW5nLgorCisgICAgICAgIC8vIFRoZSB0aHJlYWRMb29wKCkgZ2VuZXJhbGx5IGFzc3VtZXMgd3JpdGluZyBhIGZ1bGwgc2luayBidWZmZXIgc2l6ZSBhdCBhIHRpbWUuCisgICAgICAgIC8vIEhlcmUsIHdlIGNvcnJlY3QgZm9yIHdyaXRlRnJhbWVzIG9mIDAgKGEgc3RvcCkgb3IgdW5kZXJydW5zIGJlY2F1c2UKKyAgICAgICAgLy8gd2UgYWx3YXlzIGNsYWltIHN1Y2Nlc3MuCisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgY29ycmVjdGlvbiA9IG1TaW5rQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemUgLSBhY3R1YWxXcml0dGVuOworICAgICAgICAgICAgQUxPR0RfSUYoY29ycmVjdGlvbiAhPSAwICYmIHdyaXRlRnJhbWVzICE9IDAsCisgICAgICAgICAgICAgICAgICAgICIlczogd3JpdGVGcmFtZXM6JXUgIGFjdHVhbFdyaXR0ZW46JXpkICBjb3JyZWN0aW9uOiV6ZCAgbUZyYW1lc1dyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB3cml0ZUZyYW1lcywgYWN0dWFsV3JpdHRlbiwgY29ycmVjdGlvbiwgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlbik7CisgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiAtPSBjb3JyZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogUmVwb3J0IGNvcnJlY3Rpb24gZm9yIHRoZSBvdGhlciBvdXRwdXQgdHJhY2tzIGFuZCBzaG93IGluIHRoZSBkdW1wLgogICAgIH0KICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgIHJldHVybiAoc3NpemVfdCltU2lua0J1ZmZlclNpemU7CkBAIC02MDkyLDcgKzY0NTQsNyBAQAogICAgICAgICBzcyA8PCAiOiI7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiBtT3V0cHV0VHJhY2tzKSB7CiAgICAgICAgICAgICBjb25zdCBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSB0cmFjay0+dGhyZWFkKCkucHJvbW90ZSgpOwotICAgICAgICAgICAgc3MgPDwgIiAoIiA8PCB0cmFjay0+bmFtZSgpIDw8ICIgOiAiOworICAgICAgICAgICAgc3MgPDwgIiAoIiA8PCB0cmFjay0+aWQoKSA8PCAiIDogIjsKICAgICAgICAgICAgIGlmICh0aHJlYWQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIHNzIDw8IHRocmVhZC5nZXQoKSA8PCAiLCAiIDw8IHRocmVhZC0+aWQoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02MjMyLDkgKzY1OTQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IHNwPE5CQUlPX1Npbms+JiB0ZWVTaW5rCi0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6CiAgICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBSRUNPUkQsIHN5c3RlbVJlYWR5KSwKICAgICBtSW5wdXQoaW5wdXQpLApAQCAtNjI0Miw5ICs2NjAxLDYgQEAKICAgICBtUnNtcEluQnVmZmVyKE5VTEwpLAogICAgIC8vIG1Sc21wSW5GcmFtZXMsIG1Sc21wSW5GcmFtZXNQMiwgYW5kIG1Sc21wSW5GcmFtZXNPQSBhcmUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiAgICAgbVJzbXBJblJlYXIoMCkKLSNpZmRlZiBURUVfU0lOSwotICAgICwgbVRlZVNpbmsodGVlU2luaykKLSNlbmRpZgogICAgICwgbVJlYWRPbmx5SGVhcChuZXcgTWVtb3J5RGVhbGVyKGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplLAogICAgICAgICAgICAgIlJlY29yZFRocmVhZFJPIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSkpCiAgICAgLy8gbUZhc3RDYXB0dXJlIGJlbG93CkBAIC02MjYxLDggKzY2MTcsMjAgQEAKICAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb0luXyVYIiwgaWQpOwogICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1UaHJlYWROYW1lKTsKIAorICAgIGlmIChtSW5wdXQgIT0gbnVsbHB0ciAmJiBtSW5wdXQtPmF1ZGlvSHdEZXYgIT0gbnVsbHB0cikgeworICAgICAgICBtSXNNc2REZXZpY2UgPSBzdHJjbXAoCisgICAgICAgICAgICAgICAgbUlucHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CisgICAgfQorCiAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CiAKKyAgICAvLyBUT0RPOiBXZSBtYXkgYWxzbyBtYXRjaCBvbiBhZGRyZXNzIGFzIHdlbGwgYXMgZGV2aWNlIHR5cGUgZm9yCisgICAgLy8gQVVESU9fREVWSUNFX0lOX0JVUywgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQLCBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClwcm9wZXJ0eV9nZXRfaW50NjQoCisgICAgICAgICAgICAiYXVkaW8udGltZXN0YW1wLmNvcnJlY3RlZF9pbnB1dF9kZXZpY2VzIiwKKyAgICAgICAgICAgIChpbnQ2NF90KShtSXNNc2REZXZpY2UgPyBBVURJT19ERVZJQ0VfSU5fQlVTIC8vIHR1cm4gb24gYnkgZGVmYXVsdCBmb3IgTVNECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fREVWSUNFX05PTkUpKTsKKwogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzb3VyY2UgZm9yIHRoZSBIQUwgaW5wdXQgc3RyZWFtLCBhbmQgbmVnb3RpYXRlCiAgICAgbUlucHV0U291cmNlID0gbmV3IEF1ZGlvU3RyZWFtSW5Tb3VyY2UoaW5wdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwpAQCAtNjM1OSw3ICs2NzI3LDcgQEAKICAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgY2FwdHVyZQogICAgICAgICBtRmFzdENhcHR1cmUtPnJ1bigiRmFzdENhcHR1cmUiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0Q2FwdHVyZS0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0Q2FwdHVyZSwgZmFsc2UgLypmb3JBcHAqLyk7CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkKCksIHRpZCwga1ByaW9yaXR5RmFzdENhcHR1cmUsIGZhbHNlIC8qZm9yQXBwKi8pOwogICAgICAgICBzdHJlYW0oKS0+c2V0SGFsVGhyZWFkUHJpb3JpdHkoa1ByaW9yaXR5RmFzdENhcHR1cmUpOwogI2lmZGVmIEFVRElPX1dBVENIRE9HCiAgICAgICAgIC8vIEZJWE1FCkBAIC02MzY3LDYgKzY3MzUsMTAgQEAKIAogICAgICAgICBtRmFzdFRyYWNrQXZhaWwgPSB0cnVlOwogICAgIH0KKyNpZmRlZiBURUVfU0lOSworICAgIG1UZWUuc2V0KG1JbnB1dFNvdXJjZS0+Zm9ybWF0KCksIE5CQUlPX1RlZTo6VEVFX0ZMQUdfSU5QVVRfVEhSRUFEKTsKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9DIik7CisjZW5kaWYKIGZhaWxlZDogOwogCiAgICAgLy8gRklYTUUgbU5vcm1hbFNvdXJjZQpAQCAtNjQyNyw4ICs2Nzk5LDEwIEBACiAgICAgLy8gdXNlZCB0byByZXF1ZXN0IGEgZGVmZXJyZWQgc2xlZXAsIHRvIGJlIGV4ZWN1dGVkIGxhdGVyIHdoaWxlIG11dGV4IGlzIHVubG9ja2VkCiAgICAgdWludDMyX3Qgc2xlZXBVcyA9IDA7CiAKKyAgICBpbnQ2NF90IGxhc3RMb29wQ291bnRSZWFkID0gLTI7ICAvLyBuZXZlciBtYXRjaGVzICJwcmV2aW91cyIgbG9vcCwgd2hlbiBsb29wQ291bnQgPSAwLgorCiAgICAgLy8gbG9vcCB3aGlsZSB0aGVyZSBpcyB3b3JrIHRvIGRvCi0gICAgZm9yICg7OykgeworICAgIGZvciAoaW50NjRfdCBsb29wQ291bnQgPSAwOzsgKytsb29wQ291bnQpIHsgIC8vIGxvb3BDb3VudCB1c2VkIGZvciBzdGF0aXN0aWNzIHRyYWNraW5nCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCiAgICAgICAgIC8vIGFjdGl2ZVRyYWNrcyBhY2N1bXVsYXRlcyBhIGNvcHkgb2YgYSBzdWJzZXQgb2YgbUFjdGl2ZVRyYWNrcwpAQCAtNjQ5NCw2ICs2ODY4LDcgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpQQVVTSU5HOgogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZShhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlBBVVNFRDsKICAgICAgICAgICAgICAgICAgICAgZG9Ccm9hZGNhc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBzaXplLS07CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNjUxNSwxMiArNjg5MCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBhbGxTdG9wcGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OklETEU6Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRTogICAgLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBpZGxlCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlBBVVNFRDogIC8vIGNhbm5vdCBiZSBvbiBBY3RpdmVUcmFja3MgaWYgcGF1c2VkCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlNUT1BQRUQ6IC8vIGNhbm5vdCBiZSBvbiBBY3RpdmVUcmFja3MgaWYgZGVzdHJveWVkL3Rlcm1pbmF0ZWQKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmV4cGVjdGVkIGFjdGl2ZVRyYWNrU3RhdGUgJWQiLCBhY3RpdmVUcmFja1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXM6IFVuZXhwZWN0ZWQgYWN0aXZlIHRyYWNrIHN0YXRlOiVkLCBpZDolZCwgdHJhY2tzOiV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGFjdGl2ZVRyYWNrU3RhdGUsIGFjdGl2ZVRyYWNrLT5pZCgpLCBzaXplKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBhY3RpdmVUcmFja3MuYWRkKGFjdGl2ZVRyYWNrKTsKQEAgLTY1NDUsNyArNjkyMCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHNsZWVwIGlmIHRoZXJlIGFyZSBubyBhY3RpdmUgdHJhY2tzIHRvIHByb2Nlc3MKLSAgICAgICAgICAgIGlmIChhY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNsZWVwVXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzbGVlcFVzID0ga1JlY29yZFRocmVhZFNsZWVwVXM7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjU5Niw2ICs2OTcxLDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBhYnAgPSAoZmFzdFRyYWNrICE9IDAgJiYgZmFzdFRyYWNrLT5pc1BhdGNoVHJhY2soKSkgPworICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEF1ZGlvQnVmZmVyUHJvdmlkZXIqPihmYXN0VHJhY2suZ2V0KCkpIDogbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IGFicCkgeworICAgICAgICAgICAgICAgIHN0YXRlLT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgPSBhYnA7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1GYXN0UGF0Y2hSZWNvcmRGb3JtYXQgPSBmYXN0VHJhY2sgPT0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCA6IGZhc3RUcmFjay0+Zm9ybWF0KCk7CisgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNxLT5lbmQoZGlkTW9kaWZ5KTsKICAgICAgICAgICAgIGlmIChkaWRNb2RpZnkpIHsKICAgICAgICAgICAgICAgICBzcS0+cHVzaChibG9jayk7CkBAIC02NjE4LDExICs3MDAxLDExIEBACiAKICAgICAgICAgaW50MzJfdCByZWFyID0gbVJzbXBJblJlYXIgJiAobVJzbXBJbkZyYW1lc1AyIC0gMSk7CiAgICAgICAgIHNzaXplX3QgZnJhbWVzUmVhZDsKKyAgICAgICAgY29uc3QgaW50NjRfdCBsYXN0SW9CZWdpbk5zID0gc3lzdGVtVGltZSgpOyAvLyBzdGFydCBJTyB0aW1pbmcKIAogICAgICAgICAvLyBJZiBhbiBOQkFJTyBzb3VyY2UgaXMgcHJlc2VudCwgdXNlIGl0IHRvIHJlYWQgdGhlIG5vcm1hbCBjYXB0dXJlJ3MgZGF0YQogICAgICAgICBpZiAobVBpcGVTb3VyY2UgIT0gMCkgewotICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1RvUmVhZCA9IG1CdWZmZXJTaXplIC8gbUZyYW1lU2l6ZTsKLSAgICAgICAgICAgIGZyYW1lc1RvUmVhZCA9IG1pbihtUnNtcEluRnJhbWVzT0EgLSByZWFyLCBtUnNtcEluRnJhbWVzUDIgLyAyKTsKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1JlYWQgPSBtaW4obVJzbXBJbkZyYW1lc09BIC0gcmVhciwgbVJzbXBJbkZyYW1lc1AyIC8gMik7CiAKICAgICAgICAgICAgIC8vIFRoZSBhdWRpbyBmaWZvIHJlYWQoKSByZXR1cm5zIE9WRVJSVU4gb24gb3ZlcmZsb3csIGFuZCBhZHZhbmNlcyB0aGUgcmVhZCBwb2ludGVyCiAgICAgICAgICAgICAvLyB0byB0aGUgZnVsbCBidWZmZXIgcG9pbnQgKGNsZWFyaW5nIHRoZSBvdmVyZmxvdyBjb25kaXRpb24pLiAgVXBvbiBPVkVSUlVOIGVycm9yLApAQCAtNjY3NiwxNiArNzA1OSwzNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgY29uc3QgaW50NjRfdCBsYXN0SW9FbmROcyA9IHN5c3RlbVRpbWUoKTsgLy8gZW5kIElPIHRpbWluZworCiAgICAgICAgIC8vIFVwZGF0ZSBzZXJ2ZXIgdGltZXN0YW1wIHdpdGggc2VydmVyIHN0YXRzCiAgICAgICAgIC8vIHN5c3RlbVRpbWUoKSBpcyBvcHRpb25hbCBpZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgdGltZXN0YW1wcy4KICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gKz0gZnJhbWVzUmVhZDsKLSAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gc3lzdGVtVGltZSgpOworICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBsYXN0SW9FbmROczsKIAogICAgICAgICAvLyBVcGRhdGUgc2VydmVyIHRpbWVzdGFtcCB3aXRoIGtlcm5lbCBzdGF0cwogICAgICAgICBpZiAobVBpcGVTb3VyY2UuZ2V0KCkgPT0gbnVsbHB0ciAvKiBkb24ndCBvYnRhaW4gZm9yIEZhc3RDYXB0dXJlLCBjb3VsZCBibG9jayAqLykgewogICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbiwgdGltZTsKLSAgICAgICAgICAgIGludCByZXQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKCZwb3NpdGlvbiwgJnRpbWUpOwotICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUlucHV0LT5zdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigmcG9zaXRpb24sICZ0aW1lKSA9PSBOT19FUlJPUgorICAgICAgICAgICAgICAgICAgICAmJiB0aW1lID4gbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKSB7CisKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuYWRkKHBvc2l0aW9uLCB0aW1lLCBtU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBDb3JyZWN0IHRpbWVzdGFtcHMKKyAgICAgICAgICAgICAgICBpZiAoaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoKSwgKGxvbmcgbG9uZyl0aW1lLCAobG9uZyBsb25nKXBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjb3JyZWN0ZWRUaW1lc3RhbXAgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0TGFzdENvcnJlY3RlZFRpbWVzdGFtcCgpOworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tRnJhbWVzOworICAgICAgICAgICAgICAgICAgICB0aW1lID0gY29ycmVjdGVkVGltZXN0YW1wLm1UaW1lTnM7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19BRlRFUjogJWQgJWxsZCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCgpLCAobG9uZyBsb25nKXRpbWUsIChsb25nIGxvbmcpcG9zaXRpb24pOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gcG9zaXRpb247CiAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gdGltZTsKICAgICAgICAgICAgICAgICAvLyBOb3RlOiBJbiBnZW5lcmFsIHJlY29yZCBidWZmZXJzIHNob3VsZCB0ZW5kIHRvIGJlIGVtcHR5IGluCkBAIC02NjkzLDggKzcwOTQsMTkgQEAKICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgIC8vIEFsc28sIGl0IGlzIG5vdCBhZHZhbnRhZ2VvdXMgdG8gY2FsbCBnZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uIGR1cmluZyB0aGUgcmVhZAogICAgICAgICAgICAgICAgIC8vIGFzIHRoZSByZWFkIG9idGFpbnMgYSBsb2NrLCBwcmV2ZW50aW5nIHRoZSB0aW1lc3RhbXAgY2FsbCBmcm9tIGV4ZWN1dGluZy4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyBGcm9tIHRoZSB0aW1lc3RhbXAsIGlucHV0IHJlYWQgbGF0ZW5jeSBpcyBuZWdhdGl2ZSBvdXRwdXQgd3JpdGUgbGF0ZW5jeS4KKyAgICAgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IG1JbnB1dCAhPSBOVUxMID8gbUlucHV0LT5mbGFncyA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IFJlY29yZFRyYWNrOjpjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQobUZvcm1hdCwgZmxhZ3MpCisgICAgICAgICAgICAgICAgPyAtIG1UaW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKG1TYW1wbGVSYXRlKSA6IDAuOworICAgICAgICBpZiAobGF0ZW5jeU1zICE9IDAuKSB7IC8vIG5vdGUgMC4gbWVhbnMgdGltZXN0YW1wIGlzIGVtcHR5LgorICAgICAgICAgICAgbUxhdGVuY3lNcy5hZGQobGF0ZW5jeU1zKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFVzZSB0aGlzIHRvIHRyYWNrIHRpbWVzdGFtcCBpbmZvcm1hdGlvbgogICAgICAgICAvLyBBTE9HRCgiJXMiLCBtVGltZXN0YW1wLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKQEAgLTY3MDgsMTAgKzcxMjAsMjkgQEAKICAgICAgICAgICAgIGdvdG8gdW5sb2NrOwogICAgICAgICB9CiAgICAgICAgIEFMT0dfQVNTRVJUKGZyYW1lc1JlYWQgPiAwKTsKKyAgICAgICAgbUZyYW1lc1JlYWQgKz0gZnJhbWVzUmVhZDsKIAotICAgICAgICBpZiAobVRlZVNpbmsgIT0gMCkgewotICAgICAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZSgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgaWYgKGF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKG1Gb3JtYXQpCisgICAgICAgICAgICAgICAgJiYgbG9vcENvdW50ID09IGxhc3RMb29wQ291bnRSZWFkICsgMSkgeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCByZWFkUGVyaW9kTnMgPSBsYXN0SW9FbmROcyAtIG1MYXN0SW9FbmROczsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBqaXR0ZXJNcyA9CisgICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcFZlcmlmaWVyPGludDY0X3QsIGludDY0X3Q+Ojpjb21wdXRlSml0dGVyTXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyYW1lc1JlYWQsIHJlYWRQZXJpb2ROc30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9IC8qIGxhc3RUaW1lc3RhbXAgKi8sIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwcm9jZXNzTXMgPSAobGFzdElvQmVnaW5OcyAtIG1MYXN0SW9FbmROcykgKiAxZS02OworCisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAgICAgbUlvSml0dGVyTXMuYWRkKGppdHRlck1zKTsKKyAgICAgICAgICAgIG1Qcm9jZXNzVGltZU1zLmFkZChwcm9jZXNzTXMpOwogICAgICAgICB9CisgICAgICAgIC8vIHVwZGF0ZSB0aW1pbmcgaW5mby4KKyAgICAgICAgbUxhc3RJb0JlZ2luTnMgPSBsYXN0SW9CZWdpbk5zOworICAgICAgICBtTGFzdElvRW5kTnMgPSBsYXN0SW9FbmROczsKKyAgICAgICAgbGFzdExvb3BDb3VudFJlYWQgPSBsb29wQ291bnQ7CisKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAodm9pZCltVGVlLndyaXRlKCh1aW50OF90KiltUnNtcEluQnVmZmVyICsgcmVhciAqIG1GcmFtZVNpemUsIGZyYW1lc1JlYWQpOworI2VuZGlmCiAgICAgICAgIC8vIElmIGRlc3RpbmF0aW9uIGlzIG5vbi1jb250aWd1b3VzLCB3ZSBub3cgY29ycmVjdCBmb3IgcmVhZGluZyBwYXN0IGVuZCBvZiBidWZmZXIuCiAgICAgICAgIHsKICAgICAgICAgICAgIHNpemVfdCBwYXJ0MSA9IG1Sc21wSW5GcmFtZXNQMiAtIHJlYXI7CkBAIC02NzY5LDkgKzcyMDAsMzMgQEAKICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBtaW4oZnJhbWVzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25GcmFtZXNQb3NzaWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIG1TYW1wbGVSYXRlLCBhY3RpdmVUcmFjay0+bVNhbXBsZVJhdGUpKTsKLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGZyYW1lcyBmcm9tIHRoZSBSZWNvcmRUaHJlYWQgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSBSZWNvcmRUcmFjayBidWZmZXIKLSAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBhY3RpdmVUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+Y29udmVydCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIsIGZyYW1lc091dCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzRGlyZWN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8gUmVjb3JkQnVmZmVyQ29udmVydGVyIHVzZWQgZm9yIGRpcmVjdCBzdHJlYW1zLiBQYXNzCisgICAgICAgICAgICAgICAgICAgIC8vIHN0cmFpZ2h0IGZyb20gUmVjb3JkVGhyZWFkIGJ1ZmZlciB0byBSZWNvcmRUcmFjayBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LICYmIGJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKGJ1ZmZlci5mcmFtZUNvdW50ICE9IGZyYW1lc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCkgcmVhZCBsZXNzIHRoYW4gZXhwZWN0ZWQgKCV6dSB2cyAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJ1ZmZlci5mcmFtZUNvdW50LCBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYWN0aXZlVHJhY2stPm1TaW5rLnJhdywgYnVmZmVyLnJhdywgYnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgY2Fubm90IGZpbGwgcmVxdWVzdCwgc3RhdHVzOiAlZCwgZnJhbWVDb3VudDogJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCBidWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGZyYW1lcyBmcm9tIHRoZSBSZWNvcmRUaHJlYWQgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSBSZWNvcmRUcmFjaworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmNvbnZlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA+IDAgJiYgKG92ZXJydW4gPT0gT1ZFUlJVTl9VTktOT1dOKSkgewogICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9GQUxTRTsKQEAgLTY5NDIsNiArNzM5NywxMiBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpICYmICgqZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIG9uIGFuIGVuY29kZWQgc3RyZWFtIHJlcXVpcmVzIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUIik7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKICAgICBpZiAoKnBTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgKnBTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQpAQCAtNzEwNyw4ICs3NTY4LDE0IEBACiAgICAgewogICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgYSByZW5kZXp2b3VzIGJldHdlZW4gYmluZGVyIHRocmVhZCBleGVjdXRpbmcgc3RhcnQoKSBhbmQgUmVjb3JkVGhyZWFkCiAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA+PSAwKSB7CiAgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlbid0IHN0b3BwZWQgeWV0IChtb3ZlZCB0byBQQVVTRUQgYW5kIG5vdCBpbiBtQWN0aXZlVHJhY2tzKQorICAgICAgICAgICAgICAgIC8vIHNvIG5vIG5lZWQgdG8gc3RhcnRJbnB1dCgpLgogICAgICAgICAgICAgICAgIEFMT0dWKCJhY3RpdmUgcmVjb3JkIHRyYWNrIFBBVVNJTkcgLT4gQUNUSVZFIik7CiAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTcxMjUsMTcgKzc1OTIsMzQgQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgYm9vbCBzaWxlbmNlZDsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSwgJnNpbGVuY2VkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgdmVyaWZ5IHRoYXQgcmVjb3JkVHJhY2sgaXMgc3RpbGwgaW4gbUFjdGl2ZVRyYWNrcworICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6U1RBUlRJTkdfMSkgeworICAgICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOworICAgICAgICAgICAgICAgICAgICAvLyBTVEFSVElOR18yIGZvcmNlcyBkZXN0cm95IHRvIGNhbGwgc3RvcElucHV0LgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSAhPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzEpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiB1bnN5bmNocm9uaXplZCBtU3RhdGU6JWQgY2hhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICAvLyBTb21lb25lIGVsc2UgaGFzIGNoYW5nZWQgc3RhdGUsIGxldCB0aGVtIHRha2Ugb3ZlciwKKyAgICAgICAgICAgICAgICAvLyBsZWF2ZSBtU3RhdGUgaW4gdGhlIG5ldyBzdGF0ZS4KKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdlJ3JlIG9rLCBidXQgcGVyaGFwcyBzdGFydElucHV0IGhhcyBmYWlsZWQKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBzdGFydElucHV0IGZhaWxlZCwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpbiBBY3RpdmVUcmFja3MgaWYgU1RBUlRJTkdfMSBhbmQgdmFsaWQsIHNvIHJlbW92ZSBmcm9tIEFjdGl2ZVRyYWNrcywKKyAgICAgICAgICAgICAgICAvLyBsZWF2ZSBpbiBTVEFSVElOR18xLCBzbyBkZXN0cm95KCkgd2lsbCBub3QgY2FsbCBzdG9wSW5wdXQuCiAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUocmVjb3JkVHJhY2spOwogICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RhcnQgZXJyb3IgJWQiLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWNvcmRUcmFjay0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIENhdGNoIHVwIHdpdGggY3VycmVudCBidWZmZXIgaW5kaWNlcyBpZiB0aHJlYWQgaXMgYWxyZWFkeSBydW5uaW5nLgogICAgICAgICAvLyBUaGlzIGlzIHdoYXQgbWFrZXMgYSBuZXcgY2xpZW50IGRpc2NhcmQgYWxsIGJ1ZmZlcmVkIGRhdGEuICBJZiB0aGUgdHJhY2sncyBtUnNtcEluRnJvbnQKQEAgLTcxNDMsMjYgKzc2MjcsMTUgQEAKICAgICAgICAgLy8gc2VlIHByZXZpb3VzbHkgYnVmZmVyZWQgZGF0YSBiZWZvcmUgaXQgY2FsbGVkIHN0YXJ0KCksIGJ1dCB3aXRoIGdyZWF0ZXIgcmlzayBvZiBvdmVycnVuLgogCiAgICAgICAgIHJlY29yZFRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgICAgIC8vIGNsZWFyIGFueSBjb252ZXJ0ZXIgc3RhdGUgYXMgbmV3IGRhdGEgd2lsbCBiZSBkaXNjb250aW51b3VzCi0gICAgICAgIHJlY29yZFRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5yZXNldCgpOworICAgICAgICBpZiAoIXJlY29yZFRyYWNrLT5pc0RpcmVjdCgpKSB7CisgICAgICAgICAgICAvLyBjbGVhciBhbnkgY29udmVydGVyIHN0YXRlIGFzIG5ldyBkYXRhIHdpbGwgYmUgZGlzY29udGludW91cworICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPnJlc2V0KCk7CisgICAgICAgIH0KICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMjsKICAgICAgICAgLy8gc2lnbmFsIHRocmVhZCB0byBzdGFydAogICAgICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiUmVjb3JkIGZhaWxlZCB0byBzdGFydCIpOwotICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgZ290byBzdGFydEVycm9yOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotCi1zdGFydEVycm9yOgotICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCkpOwotICAgIH0KLSAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgIC8vIEZJWE1FIEkgd29uZGVyIHdoeSB3ZSBkbyBub3QgcmVzZXQgdGhlIHN0YXRlIGhlcmU/Ci0gICAgcmV0dXJuIHN0YXR1czsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3luY1N0YXJ0RXZlbnRDYWxsYmFjayhjb25zdCB3cDxTeW5jRXZlbnQ+JiBldmVudCkKQEAgLTcxODEsMjQgKzc2NTQsMjggQEAKIGJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN0b3AoUmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIHsKICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzdG9wIik7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICAvLyBpZiB3ZSdyZSBpbnZhbGlkLCB3ZSBjYW4ndCBiZSBvbiB0aGUgQWN0aXZlVHJhY2tzLgogICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCB8fCByZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIC8vIG5vdGUgdGhhdCB0aHJlYWRMb29wIG1heSBzdGlsbCBiZSBwcm9jZXNzaW5nIHRoZSB0cmFjayBhdCB0aGlzIHBvaW50IFt3aXRob3V0IGxvY2tdCiAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6UEFVU0lORzsKLSAgICAvLyBzaWduYWwgdGhyZWFkIHRvIHN0b3AKLSAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsKLSAgICAvLyBkbyBub3Qgd2FpdCBmb3IgbVN0YXJ0U3RvcENvbmQgaWYgZXhpdGluZwotICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gTk9URTogV2FpdGluZyBoZXJlIGlzIGltcG9ydGFudCB0byBrZWVwIHN0b3Agc3luY2hyb25vdXMuCisgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHByb3BlciBwYXRjaFJlY29yZCBwZWVyIHJlbGVhc2UuCisgICAgd2hpbGUgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HICYmICFyZWNvcmRUcmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7IC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RvcAorICAgICAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKICAgICB9Ci0gICAgLy8gRklYTUUgaW5jb3JyZWN0IHVzYWdlIG9mIHdhaXQ6IG5vIGV4cGxpY2l0IHByZWRpY2F0ZSBvciBsb29wCi0gICAgbVN0YXJ0U3RvcENvbmQud2FpdChtTG9jayk7Ci0gICAgLy8gaWYgd2UgaGF2ZSBiZWVuIHJlc3RhcnRlZCwgcmVjb3JkVHJhY2sgaXMgaW4gbUFjdGl2ZVRyYWNrcyBoZXJlCi0gICAgaWYgKGV4aXRQZW5kaW5nKCkgfHwgbUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDApIHsKKworICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0VEKSB7IC8vIHN1Y2Nlc3NmdWwgc3RvcAogICAgICAgICBBTE9HVigiUmVjb3JkIHN0b3BwZWQgT0siKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorCisgICAgLy8gZG9uJ3QgaGFuZGxlIGFueXRoaW5nIC0gd2UndmUgYmVlbiBpbnZhbGlkYXRlZCBvciByZXN0YXJ0ZWQgYW5kIGluIGEgZGlmZmVyZW50IHN0YXRlCisgICAgQUxPR1dfSUYoIiVzKCVkKTogdW5zeW5jaHJvbml6ZWQgc3RvcCwgc3RhdGU6ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgcmVjb3JkVHJhY2stPm1TdGF0ZSk7CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC03MjQxLDYgKzc3MTgsMjAgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikKK3sKKyAgICBBTE9HVigic2V0TWljcm9waG9uZURpcmVjdGlvbiglZCkiLCBkaXJlY3Rpb24pOworICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgcmV0dXJuIG1JbnB1dC0+c3RyZWFtLT5zZXRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkKK3sKKyAgICBBTE9HVigic2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKCVmKSIsIHpvb20pOworICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgcmV0dXJuIG1JbnB1dC0+c3RyZWFtLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnVwZGF0ZU1ldGFkYXRhX2woKQogewogICAgIGlmIChtSW5wdXQgPT0gbnVsbHB0ciB8fCBtSW5wdXQtPnN0cmVhbSA9PSBudWxscHRyIHx8CkBAIC03Mjk5LDggKzc3OTAsOSBAQAogICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0ID0gbUlucHV0OwogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBpbnB1dCAhPSBOVUxMID8gaW5wdXQtPmZsYWdzIDogQVVESU9fSU5QVVRfRkxBR19OT05FOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvU3RyZWFtSW46ICVwIGZsYWdzICUjeCAoJXMpXG4iLAotICAgICAgICAgICAgaW5wdXQsIGZsYWdzLCBpbnB1dEZsYWdzVG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOwotICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBpbnB1dCwgZmxhZ3MsIHRvU3RyaW5nKGZsYWdzKS5jX3N0cigpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGcmFtZXMgcmVhZDogJWxsZFxuIiwgKGxvbmcgbG9uZyltRnJhbWVzUmVhZCk7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSByZWNvcmQgY2xpZW50c1xuIik7CiAgICAgfQogCkBAIC03MzE2LDkgKzc4MDgsOSBAQAogICAgIC8vIHdoaWxlIHdlIGFyZSBkdW1waW5nIGl0LiAgSXQgbWF5IGJlIGluY29uc2lzdGVudCwgYnV0IGl0IHdvbid0IG11dGF0ZSEKICAgICAvLyBUaGlzIGlzIGEgbGFyZ2Ugb2JqZWN0IHNvIHdlIHBsYWNlIGl0IG9uIHRoZSBoZWFwLgogICAgIC8vIEZJWE1FIDI1OTcyOTU4OiBOZWVkIGFuIGludGVsbGlnZW50IGNvcHkgY29uc3RydWN0b3IgdGhhdCBkb2VzIG5vdCB0b3VjaCB1bnVzZWQgcGFnZXMuCi0gICAgY29uc3QgRmFzdENhcHR1cmVEdW1wU3RhdGUgKmNvcHkgPSBuZXcgRmFzdENhcHR1cmVEdW1wU3RhdGUobUZhc3RDYXB0dXJlRHVtcFN0YXRlKTsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RmFzdENhcHR1cmVEdW1wU3RhdGU+IGNvcHkgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxGYXN0Q2FwdHVyZUR1bXBTdGF0ZT4obUZhc3RDYXB0dXJlRHVtcFN0YXRlKTsKICAgICBjb3B5LT5kdW1wKGZkKTsKLSAgICBkZWxldGUgY29weTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCkBAIC03MzMyLDcgKzc4MjQsNyBAQAogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTczNTIsNyArNzg0NCw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewpAQCAtNzY0NywxMCArODEzOSwxNSBAQAogewogICAgIHN0YXR1c190IHJlc3VsdCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoJm1TYW1wbGVSYXRlLCAmbUNoYW5uZWxNYXNrLCAmbUhBTEZvcm1hdCk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gT0ssICJFcnJvciByZXRyaWV2aW5nIGF1ZGlvIHByb3BlcnRpZXMgZnJvbSBIQUw6ICVkIiwgcmVzdWx0KTsKLSAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DaGFubmVsQ291bnQgPiBGQ0NfOCwgIkhBTCBjaGFubmVsIGNvdW50ICVkID4gJWQiLCBtQ2hhbm5lbENvdW50LCBGQ0NfOCk7CiAgICAgbUZvcm1hdCA9IG1IQUxGb3JtYXQ7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRighYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSwgIkhBTCBmb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgbUZvcm1hdCk7CisgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7CisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2hhbm5lbENvdW50ID4gRkNDXzgsICJIQUwgY2hhbm5lbCBjb3VudCAlZCA+ICVkIiwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50LCBGQ0NfOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2FuIGhhdmUgbW9yZSB0aGF0IEZDQ184IGNoYW5uZWxzIGluIGVuY29kZWQgc3RyZWFtcy4KKyAgICAgICAgQUxPR0koIkhBTCBmb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgbUZvcm1hdCk7CisgICAgfQogICAgIHJlc3VsdCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRGcmFtZVNpemUoJm1GcmFtZVNpemUpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3IgcmV0cmlldmluZyBmcmFtZSBzaXplIGZyb20gSEFMOiAlZCIsIHJlc3VsdCk7CiAgICAgcmVzdWx0ID0gbUlucHV0LT5zdHJlYW0tPmdldEJ1ZmZlclNpemUoJm1CdWZmZXJTaXplKTsKQEAgLTc3MDAsMjcgKzgxOTcsNiBAQAogICAgIHJldHVybiAwOwogfQogCi0vLyBoYXNBdWRpb1Nlc3Npb25fbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Omhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0Ci17Ci0gICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpICE9IDApIHsKLSAgICAgICAgcmVzdWx0ID0gRUZGRUNUX1NFU1NJT047Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgPT0gbVRyYWNrc1tpXS0+c2Vzc2lvbklkKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCB8PSBUUkFDS19TRVNTSU9OOwotICAgICAgICAgICAgaWYgKG1UcmFja3NbaV0tPmlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gRkFTVF9TRVNTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiBLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIGJvb2w+IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXNzaW9uSWRzKCkgY29uc3QKIHsKICAgICBLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIGJvb2w+IGlkczsKQEAgLTc3NTUsNyArODIzMSw3IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKQogewogICAgIC8vIG9ubHkgb25lIGNoYWluIHBlciBpbnB1dCB0aHJlYWQKLSAgICBpZiAobUVmZmVjdENoYWlucy5zaXplKCkgIT0gMCkgeworICAgIGlmICghbUVmZmVjdENoYWlucy5pc0VtcHR5KCkpIHsKICAgICAgICAgQUxPR1coImFkZEVmZmVjdENoYWluX2woKSBhbHJlYWR5IG9uZSBjaGFpbiAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC03Nzk0LDYgKzgyNzAsNyBAQAogCiAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCiAgICAgbUluRGV2aWNlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBwYXRjaC0+c291cmNlc1swXS5pZDsKICAgICBtUGF0Y2ggPSAqcGF0Y2g7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1JbkRldmljZSk7CkBAIC03ODM1LDkgKzgzMTIsMTAgQEAKICAgICAgICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KIAotICAgIGlmIChtSW5EZXZpY2UgIT0gbVByZXZJbkRldmljZSkgeworICAgIGlmICgobUluRGV2aWNlICE9IG1QcmV2SW5EZXZpY2UpIHx8IChtRGV2aWNlSWQgIT0gZGV2aWNlSWQpKSB7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICBtUHJldkluRGV2aWNlID0gbUluRGV2aWNlOworICAgICAgICBtRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICB9CiAKICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNzg2MCwyNCArODMzOCwyOCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZFBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1UcmFja3MuYWRkKHJlY29yZCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGRlc3Ryb3lUcmFja19sKHJlY29yZCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewotICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIFRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7CiAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1JbnB1dC0+YXVkaW9Id0Rldi0+aGFuZGxlKCk7CiAgICAgY29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gbUF1ZGlvU291cmNlOworICAgIGlmIChtSW5wdXQgJiYgbUlucHV0LT5mbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5pbnB1dCA9IG1JbnB1dC0+ZmxhZ3M7CisgICAgfQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03OTMwLDcgKzg0MTIsNyBAQAogICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpCiAgICAgOiBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIE1NQVAsIHN5c3RlbVJlYWR5KSwKICAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9OT05FKSwKLSAgICAgIG1EZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCiAgICAgICBtSGFsU3RyZWFtKHN0cmVhbSksIG1IYWxEZXZpY2UoaHdEZXYtPmh3RGV2aWNlKCkpLCBtQXVkaW9Id0Rldihod0RldiksCiAgICAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpLAogICAgICAgbUhhbFZvbEZsb2F0KC0xLjBmKSwgLy8gSW5pdGlhbGl6ZSB0byBpbGxlZ2FsIHZhbHVlIHNvIGl0IGFsd2F5cyBnZXRzIHNldCBwcm9wZXJseSBsYXRlci4KQEAgLTc5NjQsNyArODQ0Niw3IEBACiAgICAgfQogICAgIC8vIFRoaXMgd2lsbCBkZWNyZW1lbnQgcmVmZXJlbmNlcyBhbmQgbWF5IGNhdXNlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIHRocmVhZC4KICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1Qb3J0SWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7CiAgICAgfQpAQCAtODA0Myw2ICs4NTI1LDcgQEAKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQogICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBtRGV2aWNlSWQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOwogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbUF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSwKQEAgLTgwNTEsNyArODUzNCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICBBTE9HRF9JRighc2Vjb25kYXJ5T3V0cHV0cy5lbXB0eSgpLAorICAgICAgICAgICAgICAgICAiTW1hcFRocmVhZDo6c3RhcnQgZG9lcyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cywgaWdub3JpbmcgdGhlbSIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnOwogICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBtU2FtcGxlUmF0ZTsKQEAgLTgwNzYsMjEgKzg1NjIsMjAgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBib29sIHNpbGVuY2VkID0gZmFsc2U7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KHBvcnRJZCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocG9ydElkLCAmc2lsZW5jZWQpOworICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChwb3J0SWQpOwogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gYWJvcnQgaWYgc3RhcnQgaXMgcmVqZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIKICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCIlczogZXJyb3Igc3RhcnQgcmVqZWN0ZWQgYnkgQXVkaW9Qb2xpY3lNYW5hZ2VyID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0gICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIGlmICghbUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgICAgICAgICAgfQpAQCAtODEwMSwyMSArODU4NiwyMSBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCisgICAgLy8gR2l2ZW4gdGhhdCBNbWFwVGhyZWFkOjptQXR0ciBpcyBtdXRhYmxlLCBzaG91bGQgYSBNbWFwVHJhY2sgaGF2ZSBhdHRyaWJ1dGVzID8KKyAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtQXR0ciwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc091dHB1dCgpLCBjbGllbnQuY2xpZW50VWlkLCBjbGllbnQuY2xpZW50UGlkLCBwb3J0SWQpOworCiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgLy8gZm9yY2Ugdm9sdW1lIHVwZGF0ZSB3aGVuIGEgbmV3IHRyYWNrIGlzIGFkZGVkCiAgICAgICAgIG1IYWxWb2xGbG9hdCA9IC0xLjBmOwotICAgIH0gZWxzZSBpZiAoIXNpbGVuY2VkKSB7Ci0gICAgICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7Ci0gICAgICAgICAgICBpZiAodHJhY2stPmlzU2lsZW5jZWRfbCgpICYmIHRyYWNrLT51aWQoKSAhPSBjbGllbnQuY2xpZW50VWlkKQotICAgICAgICAgICAgICAgIHRyYWNrLT5pbnZhbGlkYXRlKCk7CisgICAgfSBlbHNlIGlmICghdHJhY2stPmlzU2lsZW5jZWRfbCgpKSB7CisgICAgICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdCA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgIGlmICh0LT5pc1NpbGVuY2VkX2woKSAmJiB0LT51aWQoKSAhPSBjbGllbnQuY2xpZW50VWlkKQorICAgICAgICAgICAgICAgIHQtPmludmFsaWRhdGUoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIEdpdmVuIHRoYXQgTW1hcFRocmVhZDo6bUF0dHIgaXMgbXV0YWJsZSwgc2hvdWxkIGEgTW1hcFRyYWNrIGhhdmUgYXR0cmlidXRlcyA/Ci0gICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG5ldyBNbWFwVHJhY2sodGhpcywgbUF0dHIsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCwgcG9ydElkKTsKIAotICAgIHRyYWNrLT5zZXRTaWxlbmNlZF9sKHNpbGVuY2VkKTsKICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CiAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChtU2Vzc2lvbklkKTsKICAgICBpZiAoY2hhaW4gIT0gMCkgewpAQCAtODE2Miw4ICs4NjQ3LDggQEAKIAogICAgIG1Mb2NrLnVubG9jaygpOwogICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICB9IGVsc2UgewogICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQodHJhY2stPnBvcnRJZCgpKTsKQEAgLTgxODgsNyArODY3Myw3IEBACiAgICAgaWYgKG1IYWxTdHJlYW0gPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpICE9IDApIHsKKyAgICBpZiAoIW1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgbUhhbFN0cmVhbS0+c3RhbmRieSgpOwpAQCAtODIxOSw5ICs4NzA0LDExIEBACiAKICAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCiAgICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAorICAgICAgICB7IC8vIHVuZGVyIFRocmVhZCBsb2NrCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKICAgICAgICAgaWYgKG1TaWduYWxQZW5kaW5nKSB7CiAgICAgICAgICAgICAvLyBBIHNpZ25hbCB3YXMgcmFpc2VkIHdoaWxlIHdlIHdlcmUgdW5sb2NrZWQKICAgICAgICAgICAgIG1TaWduYWxQZW5kaW5nID0gZmFsc2U7CkBAIC04MjU2LDEwICs4NzQzLDEzIEBACiAgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKTsKIAogICAgICAgICBsb2NrRWZmZWN0Q2hhaW5zX2woZWZmZWN0Q2hhaW5zKTsKKyAgICAgICAgfSAvLyByZWxlYXNlIFRocmVhZCBsb2NrCisKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOworICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsgLy8gVGhyZWFkIGlzIG5vdCBsb2NrZWQsIGJ1dCBlZmZlY3QgY2hhaW4gaXMgbG9ja2VkCiAgICAgICAgIH0KLSAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCisKKyAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluLCBpbmNsdWRpbmcgbW92aW5nIHRvIGFub3RoZXIgdGhyZWFkLgogICAgICAgICB1bmxvY2tFZmZlY3RDaGFpbnMoZWZmZWN0Q2hhaW5zKTsKICAgICAgICAgLy8gRWZmZWN0IGNoYWlucyB3aWxsIGJlIGFjdHVhbGx5IGRlbGV0ZWQgaGVyZSBpZiB0aGV5IHdlcmUgcmVtb3ZlZCBmcm9tCiAgICAgICAgIC8vIG1FZmZlY3RDaGFpbnMgbGlzdCBkdXJpbmcgbWl4aW5nIG9yIGVmZmVjdHMgcHJvY2Vzc2luZwpAQCAtODQxNSw3ICs4OTA1LDcgQEAKICAgICAgICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KIAotICAgIGlmIChpc091dHB1dCgpICYmIG1QcmV2T3V0RGV2aWNlICE9IG1PdXREZXZpY2UpIHsKKyAgICBpZiAoaXNPdXRwdXQoKSAmJiAobVByZXZPdXREZXZpY2UgIT0gbU91dERldmljZSB8fCBtRGV2aWNlSWQgIT0gZGV2aWNlSWQpKSB7CiAgICAgICAgIG1QcmV2T3V0RGV2aWNlID0gdHlwZTsKICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKQEAgLTg0MjYsNyArODkxNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgfQotICAgIGlmICghaXNPdXRwdXQoKSAmJiBtUHJldkluRGV2aWNlICE9IG1JbkRldmljZSkgeworICAgIGlmICghaXNPdXRwdXQoKSAmJiAobVByZXZJbkRldmljZSAhPSBtSW5EZXZpY2UgfHwgbURldmljZUlkICE9IGRldmljZUlkKSkgewogICAgICAgICBtUHJldkluRGV2aWNlID0gdHlwZTsKICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwpAQCAtODQ1OSw5ICs4OTQ5LDkgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewotICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIFRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKICAgICAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1BdWRpb0h3RGV2LT5oYW5kbGUoKTsKQEAgLTg1MjAsMjggKzkwMTAsNiBAQAogICAgIHJldHVybiBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKIH0KIAotLy8gaGFzQXVkaW9TZXNzaW9uX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6aGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCkgIT0gMCkgewotICAgICAgICByZXN1bHQgPSBFRkZFQ1RfU0VTU0lPTjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BY3RpdmVUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgfD0gVFJBQ0tfU0VTU0lPTjsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBGQVNUX1NFU1NJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjp0aHJlYWRMb29wX3N0YW5kYnkoKQogewogICAgIG1IYWxTdHJlYW0tPnN0YW5kYnkoKTsKQEAgLTg2MjYsNyArOTA5NCw3IEBACiAgICAgZHByaW50ZihmZCwgIiAgQXR0cmlidXRlczogY29udGVudCB0eXBlICVkIHVzYWdlICVkIHNvdXJjZSAlZFxuIiwKICAgICAgICAgICAgIG1BdHRyLmNvbnRlbnRfdHlwZSwgbUF0dHIudXNhZ2UsIG1BdHRyLnNvdXJjZSk7CiAgICAgZHByaW50ZihmZCwgIiAgU2Vzc2lvbjogJWQgcG9ydCBJZDogJWRcbiIsIG1TZXNzaW9uSWQsIG1Qb3J0SWQpOwotICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSBjbGllbnRzXG4iKTsKICAgICB9CiB9CkBAIC04NjM5LDcgKzkxMDcsNyBAQAogICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgTW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwpAQCAtODg0NSw2ICs5MzEzLDE1IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGlmIChtT3V0cHV0ICYmIG1PdXRwdXQtPmZsYWdzICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5vdXRwdXQgPSBtT3V0cHV0LT5mbGFnczsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIE1tYXBUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwpAQCAtODg2Nyw3ICs5MzQ0LDEzIEBACiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OmV4aXRTdGFuZGJ5KCkKIHsKLSAgICBtSW5wdXQtPnN0cmVhbS0+c2V0R2FpbigxLjBmKTsKKyAgICB7CisgICAgICAgIC8vIG1JbnB1dCBtaWdodCBoYXZlIGJlZW4gY2xlYXJlZCBieSBjbGVhcklucHV0KCkKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1JbnB1dCAhPSBudWxscHRyICYmIG1JbnB1dC0+c3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1JbnB1dC0+c3RyZWFtLT5zZXRHYWluKDEuMGYpOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiBNbWFwVGhyZWFkOjpleGl0U3RhbmRieSgpOwogfQogCkBAIC04OTM1LDQgKzk0MTgsMTMgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwQ2FwdHVyZVRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgTW1hcFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBpZiAobUlucHV0ICYmIG1JbnB1dC0+ZmxhZ3MgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBtSW5wdXQtPmZsYWdzOworICAgIH0KK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggZWEyOTQ1NS4uNDdlNTgwYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC0yODEsNyArMjgxLDcgQEAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKIAogCiAgICAgICAgICAgICAgICAgLy8gc2VlIG5vdGUgYXQgZGVjbGFyYXRpb24gb2YgbVN0YW5kYnksIG1PdXREZXZpY2UgYW5kIG1JbkRldmljZQpAQCAtMzU2LDYgKzM1NiwyNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzQXVkaW9TZXNzaW9uX2woc2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBjb25zdCBUJiB0cmFja3MpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBFRkZFQ1RfU0VTU0lPTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tCYXNlPiYgdHJhY2sgPSB0cmFja3NbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IHRyYWNrLT5zZXNzaW9uSWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdHJhY2stPmlzSW52YWxpZCgpICAgICAgIC8vIG5vdCB5ZXQgcmVtb3ZlZCBmcm9tIHRyYWNrcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBUUkFDS19TRVNTSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gRkFTVF9TRVNTSU9OOyAgLy8gY2F1dGlvbiwgb25seSByZXByZXNlbnRzIGZpcnN0IHRyYWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIG5vdCBpbXBvcnRhbnQgYXMgdGhlCiAgICAgICAgICAgICAgICAgLy8gc3RyYXRlZ3kgaXMgb25seSBtZWFuaW5nZnVsIGZvciBQbGF5YmFja1RocmVhZCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kCiAgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkIF9fdW51c2VkKQpAQCAtMzkzLDYgKzQxNCwxNSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBicm9hZGNhc3RfbCgpOwogCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sICAgICAgICBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgaXNNc2REZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSXNNc2REZXZpY2U7IH0KKworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKKworICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXIgc3RhdHMgdG8gbWVkaWFtZXRyaWNzLgorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZFN0YXRpc3RpY3MoYm9vbCBmb3JjZSk7CisKICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKIAogcHJvdGVjdGVkOgpAQCAtNDM0LDYgKzQ2NCwxMiBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3Rlck1vbm9fbChib29sIG1vbm8gX191bnVzZWQpIHsgfQogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHJlcXVpcmVNb25vQmxlbmQoKSB7IHJldHVybiBmYWxzZTsgfQogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIHdpdGhpbiB0aGUgdGhyZWFkTG9vcCB0byBvYnRhaW4gdGltZXN0YW1wIGZyb20gdGhlIEhBTC4KKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCBfX3VudXNlZCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgICAgICAvLyBmb3IgbUVmZmVjdENoYWlucwogCiAgICAgICAgICAgICAgICAgY29uc3QgdHlwZV90ICAgICAgICAgICAgbVR5cGU7CkBAIC00NzMsNiArNTA5LDEwIEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbVByZXZPdXREZXZpY2U7ICAgLy8gcHJldmlvdXMgb3V0cHV0IGRldmljZQogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1QcmV2SW5EZXZpY2U7ICAgIC8vIHByZXZpb3VzIGlucHV0IGRldmljZQogICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgICAgIG1QYXRjaDsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBAYnJpZWYgbURldmljZUlkICBjdXJyZW50IGRldmljZSBwb3J0IHVuaXF1ZSBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbURldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAgICAgICAgICBtQXVkaW9Tb3VyY2U7CiAKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtSWQ7CkBAIC00OTMsMTAgKzUzMywzMSBAQAogICAgICAgICAgICAgICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1OQkxvZ1dyaXRlcjsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUmVhZHk7CiAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgICAgICAgbVRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjwgLy8gRm9yIHRpbWVzdGFtcCBzdGF0aXN0aWNzLgorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKiBmcmFtZSBjb3VudCAqLywgaW50NjRfdCAvKiB0aW1lIG5zICovPiBtVGltZXN0YW1wVmVyaWZpZXI7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKworICAgICAgICAgICAgICAgIC8vIFRocmVhZExvb3Agc3RhdGlzdGljcyBwZXIgaXRlcmF0aW9uLgorICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0SW9CZWdpbk5zID0gLTE7CisgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gLTE7CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSByZWFkIHVuZGVyIFRocmVhZEJhc2UgbG9jayAoaWYgbm90IG9uIHRoZSB0aHJlYWRMb29wIHRocmVhZCkuCisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtSW9KaXR0ZXJNc3swLjk5NSAvKiBhbHBoYSAqL307CisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtUHJvY2Vzc1RpbWVNc3swLjk5NSAvKiBhbHBoYSAqL307CisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtTGF0ZW5jeU1zezAuOTk1IC8qIGFscGhhICovfTsKKworICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGxhc3QgY291bnQgd2hlbiB3ZSBkZWxpdmVyZWQgc3RhdGlzdGljcyB0byBtZWRpYW1ldHJpY3MuCisgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbUxhc3RSZWNvcmRlZFRpbWVzdGFtcFZlcmlmaWVyTiA9IDA7CisgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbUxhc3RSZWNvcmRlZFRpbWVOcyA9IDA7ICAvLyBCT09UVElNRSB0byBpbmNsdWRlIHN1c3BlbmQuCisKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtSXNNc2REZXZpY2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAvLyBBIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgZXZhbHVhdGVkIGJ5IHRoZSB0aHJlYWQgbG9vcCBoYXMgY2hhbmdlZCBhbmQKICAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IG5vdCB3YWl0IGZvciBhc3luYyB3cml0ZSBjYWxsYmFjayBpbiB0aGUgdGhyZWFkIGxvb3AgYmVmb3JlIGV2YWx1YXRpbmcgaXQKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU2lnbmFsUGVuZGluZzsKIAorI2lmZGVmIFRFRV9TSU5LCisgICAgICAgICAgICAgICAgTkJBSU9fVGVlICAgICAgICAgICAgICAgbVRlZTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIC8vIEFjdGl2ZVRyYWNrcyBpcyBhIHNvcnRlZCB2ZWN0b3Igb2YgdHJhY2sgdHlwZSBUIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgICAgICAgICAvLyBhY3RpdmUgdHJhY2tzIG9mIHRocmVhZExvb3AoKSB0byBiZSBjb25zaWRlcmVkIGJ5IHRoZSBsb2NrZWQgcHJlcGFyZSBwb3J0aW9uLgogICAgICAgICAgICAgICAgIC8vIEFjdGl2ZVRyYWNrcyBzaG91bGQgYmUgYWNjZXNzZWQgd2l0aCB0aGUgVGhyZWFkQmFzZSBsb2NrIGhlbGQuCkBAIC01NDMsNiArNjA0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluZGV4T2YoY29uc3Qgc3A8VD4mIGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aXZlVHJhY2tzLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY0NSw3ICs3MDksNyBAQAogICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGxheWJhY2tUaHJlYWQoKTsKIAotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CkBAIC03MDcsNiArNzcxLDcgQEAKIAogICAgICAgICAgICAgICAgIC8vIFZvbHVtZUludGVyZmFjZQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3RlclZvbHVtZShmbG9hdCB2YWx1ZSk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJNdXRlKGJvb2wgbXV0ZWQpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdmFsdWUpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgbXV0ZWQpOwpAQCAtNzY2LDcgKzgzMSw5IEBACiAKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBzaXplX3QgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWRCYXNlOjpoYXNBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQsIG1UcmFja3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKIApAQCAtNzg0LDcgKzg1MSw3IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKTsKIAotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBhc3luY2hyb25vdXMgc2lnbmFsIHdhaXQgdGltZS4KICAgICB2aXJ0dWFsICAgICBpbnQ2NF90ICAgICBjb21wdXRlV2FpdFRpbWVOc19sKCkgY29uc3QgeyByZXR1cm4gSU5UNjRfTUFYOyB9CkBAIC04MDEsNiArODY4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVHJhY2tzLnNpemUoKSA8IFBsYXliYWNrVGhyZWFkOjprTWF4VHJhY2tzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXREZXZpY2UgJiBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGRldmljZSkgJiYgcG9wY291bnQoZGV2aWNlKSA+IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogcHJvdGVjdGVkOgogICAgIC8vIHVwZGF0ZWQgYnkgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudDsgIC8vIG5vcm1hbCBtaXhlciBhbmQgZWZmZWN0cwpAQCAtODgwLDYgKzk1MiwxMSBAQAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbjsKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuOyAvLyBub3QgcmVzZXQgb24gc3RhbmRieQogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgbVN1c3BlbmRlZEZyYW1lczsgLy8gbm90IHJlc2V0IG9uIHN0YW5kYnkKKworICAgIC8vIG1IYXB0aWNDaGFubmVsTWFzayBhbmQgbUhhcHRpY0NoYW5uZWxDb3VudCB3aWxsIG9ubHkgYmUgdmFsaWQgd2hlbiB0aGUgdGhyZWFkIHN1cHBvcnQKKyAgICAvLyBoYXB0aWMgcGxheWJhY2suCisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgICAgICAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtSGFwdGljQ2hhbm5lbENvdW50ID0gMDsKIHByaXZhdGU6CiAgICAgLy8gbU1hc3Rlck11dGUgaXMgaW4gYm90aCBQbGF5YmFja1RocmVhZCBhbmQgaW4gQXVkaW9GbGluZ2VyLiAgV2hlbiBhCiAgICAgLy8gUGxheWJhY2tUaHJlYWQgbmVlZHMgdG8gZmluZCBvdXQgaWYgbWFzdGVyLW11dGVkLCBpdCBjaGVja3MgaXQncyBsb2NhbApAQCAtOTM1LDE2ICsxMDEyLDE5IEBACiAgICAgdmlydHVhbCB2b2lkIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKLSAgICAvLyBUaGUgVHJhY2tzIGNsYXNzIG1hbmFnZXMgbmFtZXMgZm9yIGFsbCB0cmFja3MKLSAgICAvLyBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBUaHJlYWQuCisgICAgLy8gVGhlIFRyYWNrcyBjbGFzcyBtYW5hZ2VzIHRyYWNrcyBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBUaHJlYWQuCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgY2xhc3MgVHJhY2tzIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIFRyYWNrcyhib29sIHNhdmVEZWxldGVkVHJhY2tOYW1lcykgOgotICAgICAgICAgICAgbVNhdmVEZWxldGVkVHJhY2tOYW1lcyhzYXZlRGVsZXRlZFRyYWNrTmFtZXMpIHsgfQorICAgICAgICBUcmFja3MoYm9vbCBzYXZlRGVsZXRlZFRyYWNrSWRzKSA6CisgICAgICAgICAgICBtU2F2ZURlbGV0ZWRUcmFja0lkcyhzYXZlRGVsZXRlZFRyYWNrSWRzKSB7IH0KIAogICAgICAgICAvLyBTb3J0ZWRWZWN0b3IgbWV0aG9kcwotICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPFQ+ICZ0cmFjayk7CisgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgc3A8VD4gJnRyYWNrKSB7CisgICAgICAgICAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5hZGQodHJhY2spOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA8IDAsICJjYW5ub3QgYWRkIHRyYWNrIik7CisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIH0KICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZShjb25zdCBzcDxUPiAmdHJhY2spOwogICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSgpIGNvbnN0IHsKICAgICAgICAgICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKQEAgLTk2NSwyOCArMTA0NSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIG1UcmFja3MuZW5kKCk7CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgICAgICAgICAgcHJvY2Vzc0RlbGV0ZWRUcmFja05hbWVzKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBmKSB7Ci0gICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1EZWxldGVkVHJhY2tOYW1lcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogbURlbGV0ZWRUcmFja05hbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYobmFtZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBzaXplX3QgICAgICAgICAgcHJvY2Vzc0RlbGV0ZWRUcmFja0lkcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4gZikgeworICAgICAgICAgICAgZm9yIChjb25zdCBpbnQgdHJhY2tJZCA6IG1EZWxldGVkVHJhY2tJZHMpIHsKKyAgICAgICAgICAgICAgICBmKHRyYWNrSWQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICByZXR1cm4gbURlbGV0ZWRUcmFja0lkcy5zaXplKCk7CiAgICAgICAgIH0KIAotICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXJEZWxldGVkVHJhY2tOYW1lcygpIHsgbURlbGV0ZWRUcmFja05hbWVzLmNsZWFyKCk7IH0KKyAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyRGVsZXRlZFRyYWNrSWRzKCkgeyBtRGVsZXRlZFRyYWNrSWRzLmNsZWFyKCk7IH0KIAogICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIFRyYWNrIG5hbWVzIHBlbmRpbmcgZGVsZXRpb24gZm9yIE1JWEVSIHR5cGUgdGhyZWFkcwotICAgICAgICBjb25zdCBib29sIG1TYXZlRGVsZXRlZFRyYWNrTmFtZXM7IC8vIHRydWUgdG8gZW5hYmxlIHRyYWNraW5nCi0gICAgICAgIHN0ZDo6c2V0PGludD4gbURlbGV0ZWRUcmFja05hbWVzOwotCi0gICAgICAgIC8vIEZhc3QgbG9va3VwIG9mIHByZXZpb3VzbHkgZGVsZXRlZCB0cmFjayBuYW1lcyBmb3IgcmV1c2UuCi0gICAgICAgIC8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IGRlY2lzaW9uIChhY3R1YWxseSBhbnkgbm9uLW5lZ2F0aXZlCi0gICAgICAgIC8vIGludGVnZXIgdGhhdCBpc24ndCBpbiBtVHJhY2tzWypdLT5uYW1lcygpIGNvdWxkIGJlIHVzZWQpIC0gd2UgYXR0ZW1wdAotICAgICAgICAvLyB0byB1c2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGF2YWlsYWJsZSBuYW1lLgotICAgICAgICBzdGQ6OnNldDxpbnQ+IG1VbnVzZWRUcmFja05hbWVzOworICAgICAgICAvLyBUcmFja3MgcGVuZGluZyBkZWxldGlvbiBmb3IgTUlYRVIgdHlwZSB0aHJlYWRzCisgICAgICAgIGNvbnN0IGJvb2wgbVNhdmVEZWxldGVkVHJhY2tJZHM7IC8vIHRydWUgdG8gZW5hYmxlIHRyYWNraW5nCisgICAgICAgIHN0ZDo6c2V0PGludD4gbURlbGV0ZWRUcmFja0lkczsKIAogICAgICAgICBTb3J0ZWRWZWN0b3I8c3A8VD4+IG1UcmFja3M7IC8vIHdyYXBwZWQgU29ydGVkVmVjdG9yLgogICAgIH07CkBAIC05OTcsNyArMTA2OCw4IEBACiAgICAgQXVkaW9TdHJlYW1PdXQgICAgICAgICAgICAgICAgICAqbU91dHB1dDsKIAogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlclZvbHVtZTsKLSAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lOworICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgICAgICAgICAgICAgbU1hc3RlckJhbGFuY2V7fTsKKyAgICBhdWRpb191dGlsczo6QmFsYW5jZSAgICAgICAgICAgIG1CYWxhbmNlOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVdyaXRlczsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluV3JpdGU7CkBAIC0xMDU2LDE2ICsxMTI4LDEzIEBACiAgICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgbVBpcGVTaW5rOwogICAgIC8vIFRoZSBjdXJyZW50IHNpbmsgZm9yIHRoZSBub3JtYWwgbWl4ZXIgdG8gd3JpdGUgaXQncyAoc3ViKW1peCwgbU91dHB1dFNpbmsgb3IgbVBpcGVTaW5rCiAgICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgbU5vcm1hbFNpbms7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBGb3IgZHVtcHN5cwotICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1UZWVTaW5rOwotICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgIG1UZWVTb3VyY2U7Ci0jZW5kaWYKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2NyZWVuU3RhdGU7ICAgLy8gY2FjaGVkIGNvcHkgb2YgZ1NjcmVlblN0YXRlCiAgICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgYW5kIGFkanVzdCBzaXplIGFzIG5lZWRlZAogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgIGtGYXN0TWl4ZXJMb2dTaXplID0gOCAqIDEwMjQ7CiAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyOwogCisgICAgLy8gRG93bnN0cmVhbSBwYXRjaCBsYXRlbmN5LCBhdmFpbGFibGUgaWYgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDAuCisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXN7MC45OTl9OwogCiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgPSAwOwpAQCAtMTEyMSw3ICsxMTkwLDYgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3N0YW5kYnkoKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX21peCgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3Bfc2xlZXBUaW1lKCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9yZW1vdmVUcmFja3MoY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGNvcnJlY3RMYXRlbmN5X2wodWludDMyX3QgbGF0ZW5jeSkgY29uc3Q7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKQEAgLTExNTQsNiArMTIyMiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1GYXN0TWl4ZXJEdW1wU3RhdGUubVRyYWNrc1tmYXN0SW5kZXhdLm1VbmRlcnJ1bnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ob3JtYWxTaW5rLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTm9ybWFsU2luay0+Z2V0VGltZXN0YW1wKCp0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgIHNldE1hc3Rlck1vbm9fbChib29sIG1vbm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyTW9uby5zdG9yZShtb25vKTsKQEAgLTExNjUsMjEgKzEyNDEsMzcgQEAKICAgICAgICAgICAgICAgICAvLyBCbGVuZGluZyB3aXRoIGxpbWl0ZXIgaXMgbm90IGlkZW1wb3RlbnQsCiAgICAgICAgICAgICAgICAgLy8gYW5kIGJsZW5kaW5nIHdpdGhvdXQgbGltaXRlciBpcyBpZGVtcG90ZW50IGJ1dCBpbmVmZmljaWVudCB0byBkbyB0d2ljZS4KICAgICB2aXJ0dWFsICAgICBib29sICAgICAgIHJlcXVpcmVNb25vQmxlbmQoKSB7IHJldHVybiBtTWFzdGVyTW9uby5sb2FkKCkgJiYgIWhhc0Zhc3RNaXhlcigpOyB9CisKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlLnN0b3JlKGJhbGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmFzdE1peGVyLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIH07CiAKIGNsYXNzIERpcmVjdE91dHB1dFRocmVhZCA6IHB1YmxpYyBQbGF5YmFja1RocmVhZCB7CiBwdWJsaWM6CiAKICAgICBEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQorICAgICAgICA6IERpcmVjdE91dHB1dFRocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgRElSRUNULCBzeXN0ZW1SZWFkeSkgeyB9CisKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+RGlyZWN0T3V0cHV0VGhyZWFkKCk7CiAKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKKwogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOwogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaWRsZVNsZWVwVGltZVVzKCkgY29uc3Q7CkBAIC0xMTk1LDEwICsxMjg3LDEwIEBACiAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkFkZE5ld1RyYWNrX2woKTsKIAotICAgIGJvb2wgbVZvbHVtZVNoYXBlckFjdGl2ZTsKKyAgICBib29sIG1Wb2x1bWVTaGFwZXJBY3RpdmUgPSBmYWxzZTsKIAogICAgIERpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlLCBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZvaWQgcHJvY2Vzc1ZvbHVtZV9sKFRyYWNrICp0cmFjaywgYm9vbCBsYXN0VHJhY2spOwogCkBAIC0xMjA3LDEwICsxMjk5LDMxIEBACiAKICAgICB3cDxUcmFjaz4gICAgICAgICAgICAgICBtUHJldmlvdXNUcmFjazsgICAgICAgICAvLyB1c2VkIHRvIGRldGVjdCB0cmFjayBzd2l0Y2gKIAorICAgIC8vIFRoaXMgbXVzdCBiZSBpbml0aWFsaXplZCBmb3IgaW5pdGlhbCBjb25kaXRpb24gb2YgbU1hc3RlckJhbGFuY2UgPSAwIChkaXNhYmxlZCkuCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1hc3RlckJhbGFuY2VMZWZ0ID0gMS5mOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlUmlnaHQgPSAxLmY7CisKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCiAgICAgdmlydHVhbCAgICAgaW50NjRfdCAgICAgY29tcHV0ZVdhaXRUaW1lTnNfbCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbChFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBESVJFQ1QgYW5kIE9GRkxPQUQgdGhyZWFkcywgcXVlcnkgdGhlIG91dHB1dCBzaW5rIGRpcmVjdGx5LgorICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1cG9zaXRpb242NDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXQtPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBvc2l0aW9uNjQsICZ0aW1lKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChpbnQ2NF90KXVwb3NpdGlvbjY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+bVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KIH07CiAKIGNsYXNzIE9mZmxvYWRUaHJlYWQgOiBwdWJsaWMgRGlyZWN0T3V0cHV0VGhyZWFkIHsKQEAgLTEzMTgsNiArMTQzMSwyMiBAQAogICAgIFNvcnRlZFZlY3RvciA8IHNwPE91dHB1dFRyYWNrPiA+ICBtT3V0cHV0VHJhY2tzOwogcHVibGljOgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1PdXRwdXRUcmFja3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgLy8gZm9yd2FyZCB0aGUgZmlyc3QgT3V0cHV0VHJhY2sncyBrZXJuZWwgaW5mb3JtYXRpb24gZm9yIHRpbWVzdGFtcC4KKyAgICAgICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wIHRyYWNrVGltZXN0YW1wID0KKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFRyYWNrc1swXS0+Z2V0Q2xpZW50UHJveHlUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgIGlmICh0cmFja1RpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID4gMCkgeworICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+bVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1RpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7ICAvLyBkaXNjYXJkIHNlcnZlciB0aW1lc3RhbXAgLSB0aGF0J3MgaWdub3JlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogfTsKIAogLy8gcmVjb3JkIHRocmVhZApAQCAtMTM3Niw5ICsxNTA1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgICAgICAgICAgLCBjb25zdCBzcDxOQkFJT19TaW5rPiYgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICB2aXJ0dWFsICAgICB+UmVjb3JkVGhyZWFkKCk7CiAKQEAgLTE0MjUsNyArMTU1MSw3IEBACiAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbGVyIHNob3VsZCB0aGVuIGRvIGl0J3MgcGFydCBvZiB0aGUgc3RvcHBpbmcgcHJvY2VzcwogICAgICAgICAgICAgYm9vbCAgICAgICAgc3RvcChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spOwogCi0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiBjbGVhcklucHV0KCk7CiAgICAgICAgICAgICB2aXJ0dWFsIHNwPFN0cmVhbUhhbEludGVyZmFjZT4gc3RyZWFtKCkgY29uc3Q7CiAKQEAgLTE0MzksMTUgKzE1NjUsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKIAotICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CiAgICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRJbnB1dEZyYW1lc0xvc3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKICAgICB2aXJ0dWFsIHNpemVfdCByZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwotICAgIHZpcnR1YWwgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Q7CisgICAgICAgICAgICB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZEJhc2U6Omhhc0F1ZGlvU2Vzc2lvbl9sKHNlc3Npb25JZCwgbVRyYWNrcyk7CisgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgc2V0IG9mIHVuaXF1ZSBzZXNzaW9uIElEcyBhY3Jvc3MgYWxsIHRyYWNrcy4KICAgICAgICAgICAgIC8vIFRoZSBrZXlzIGFyZSB0aGUgc2Vzc2lvbiBJRHMsIGFuZCB0aGUgYXNzb2NpYXRlZCB2YWx1ZXMgYXJlIG1lYW5pbmdsZXNzLgpAQCAtMTQ2MSw3ICsxNTg5LDcgQEAKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CiAgICAgICAgICAgICBib29sICAgICAgICBoYXNGYXN0Q2FwdHVyZSgpIGNvbnN0IHsgcmV0dXJuIG1GYXN0Q2FwdHVyZSAhPSAwOyB9Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CkBAIC0xNDc5LDggKzE2MDcsMTggQEAKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKwogICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpIG92ZXJyaWRlOwogCisgICAgICAgICAgICBib29sICAgICAgICBmYXN0VHJhY2tBdmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBtRmFzdFRyYWNrQXZhaWw7IH0KKworICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVja3MgcG9wY291bnQgZm9yIGV4YWN0bHkgb25lIGRldmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfaW5wdXRfZGV2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluRGV2aWNlICYgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogcHJpdmF0ZToKICAgICAgICAgICAgIC8vIEVudGVyIHN0YW5kYnkgaWYgbm90IGFscmVhZHkgaW4gc3RhbmRieSwgYW5kIHNldCBtU3RhbmRieSBmbGFnCiAgICAgICAgICAgICB2b2lkICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKQEAgLTE1MDgsOCArMTY0Niw2IEBACiAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluUmVhcjsgICAgLy8gbGFzdCBmaWxsZWQgZnJhbWUgKyAxCiAKICAgICAgICAgICAgIC8vIEZvciBkdW1wc3lzCi0gICAgICAgICAgICBjb25zdCBzcDxOQkFJT19TaW5rPiAgICAgICAgICAgICAgICBtVGVlU2luazsKLQogICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiAgICAgICAgICAgICAgbVJlYWRPbmx5SGVhcDsKIAogICAgICAgICAgICAgLy8gb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIG5vIGxvY2tzIHJlcXVpcmVkCkBAIC0xNTUyLDYgKzE2ODgsOCBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZhc3RUcmFja0F2YWlsOyAgICAvLyB0cnVlIGlmIGZhc3QgdHJhY2sgYXZhaWxhYmxlCiAgICAgICAgICAgICAvLyBjb21tb24gc3RhdGUgdG8gYWxsIHJlY29yZCB0aHJlYWRzCiAgICAgICAgICAgICBzdGQ6OmF0b21pY19ib29sICAgICAgICAgICAgICAgICAgICBtQnROcmVjU3VzcGVuZGVkOworCisgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVhZCA9IDA7ICAgIC8vIGNvbnRpbnVvdXMgcnVubmluZyBjb3VudGVyLgogfTsKIAogY2xhc3MgTW1hcFRocmVhZCA6IHB1YmxpYyBUaHJlYWRCYXNlCkBAIC0xNjA0LDcgKzE3NDIsNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICB2aXJ0dWFsICAgICBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1IYWxTdHJlYW07IH0KICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBhZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwpAQCAtMTYxMiw3ICsxNzUwLDEwIEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogCi0gICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Q7CisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiB1c2luZyBtQWN0aXZlVHJhY2tzIGFzIG5vIG1UcmFja3MgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZEJhc2U6Omhhc0F1ZGlvU2Vzc2lvbl9sKHNlc3Npb25JZCwgbUFjdGl2ZVRyYWNrcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNWYWxpZFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkgY29uc3Q7CiAKQEAgLTE2MjcsNyArMTc2OCw3IEBACiAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgVUlEIHJlY29yZHMgc2lsZW5jZQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCBfX3VudXNlZCwgYm9vbCBzaWxlbmNlZCBfX3VudXNlZCkge30KIAotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMTYzNSw3ICsxNzc2LDYgQEAKIAogICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgICAgIG1BdHRyOwogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7Ci0gICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbURldmljZUlkOwogICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7CiAKICAgICAgICAgICAgICAgICB3cDxNbWFwU3RyZWFtQ2FsbGJhY2s+ICBtQ2FsbGJhY2s7CkBAIC0xNjg4LDYgKzE4MjgsOCBAQAogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCiBwcm90ZWN0ZWQ6CiAKICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICAgICAgbVN0cmVhbVR5cGU7CkBAIC0xNzE2LDYgKzE4NTgsOCBAQAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgIHByb2Nlc3NWb2x1bWVfbCgpIG92ZXJyaWRlOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkgb3ZlcnJpZGU7CiAKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKIHByb3RlY3RlZDoKIAogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qICBtSW5wdXQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKaW5kZXggY2NmYjY5Zi4uNDQwMmQ5OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaApAQCAtMjUsMTMgKzI1LDEzIEBACiBwdWJsaWM6CiAgICAgZW51bSB0cmFja19zdGF0ZSB7CiAgICAgICAgIElETEUsCi0gICAgICAgIEZMVVNIRUQsCisgICAgICAgIEZMVVNIRUQsICAgICAgICAvLyBmb3IgUGxheWJhY2tUcmFja3Mgb25seQogICAgICAgICBTVE9QUEVELAogICAgICAgICAvLyBuZXh0IDIgc3RhdGVzIGFyZSBjdXJyZW50bHkgdXNlZCBmb3IgZmFzdCB0cmFja3MKICAgICAgICAgLy8gYW5kIG9mZmxvYWRlZCB0cmFja3Mgb25seQogICAgICAgICBTVE9QUElOR18xLCAgICAgLy8gd2FpdGluZyBmb3IgZmlyc3QgdW5kZXJydW4KICAgICAgICAgU1RPUFBJTkdfMiwgICAgIC8vIHdhaXRpbmcgZm9yIHByZXNlbnRhdGlvbiBjb21wbGV0ZQotICAgICAgICBSRVNVTUlORywKKyAgICAgICAgUkVTVU1JTkcsICAgICAgIC8vIGZvciBQbGF5YmFja1RyYWNrcyBvbmx5CiAgICAgICAgIEFDVElWRSwKICAgICAgICAgUEFVU0lORywKICAgICAgICAgUEFVU0VELApAQCAtNTQsMTEgKzU0LDYgQEAKICAgICAgICAgVFlQRV9QQVRDSCwKICAgICB9OwogCi0gICAgZW51bSB7Ci0gICAgICAgIFRSQUNLX05BTUVfUEVORElORyA9IC0xLAotICAgICAgICBUUkFDS19OQU1FX0ZBSUxVUkUgPSAtMiwKLSAgICB9OwotCiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoVGhyZWFkQmFzZSAqdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgbUF0dHIsCkBAIC05MSw2ICs4Niw3IEBACiAgICAgICAgICAgICB2b2lkKiAgICAgICBidWZmZXIoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyOyB9CiAgICAgICAgICAgICBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCA9IDA7CiAgICAgICAgICAgICBib29sICAgICAgICBpc091dHB1dFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfT1VUUFVUKTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNQYXRjaFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfUEFUQ0gpOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc0V4dGVybmFsVHJhY2soKSBjb25zdCB7IHJldHVybiAhaXNPdXRwdXRUcmFjaygpICYmICFpc1BhdGNoVHJhY2soKTsgfQpAQCAtOTgsOCArOTQsMTExIEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICBpbnZhbGlkYXRlKCkgeyBtSXNJbnZhbGlkID0gdHJ1ZTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gbUlzSW52YWxpZDsgfQogCisgICAgICAgICAgICB2b2lkICAgICAgICB0ZXJtaW5hdGUoKSB7IG1UZXJtaW5hdGVkID0gdHJ1ZTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUZXJtaW5hdGVkKCkgY29uc3QgeyByZXR1cm4gbVRlcm1pbmF0ZWQ7IH0KKwogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyOyB9CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICB2b2lkICAgICAgICAgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlZS5kdW1wKGZkLCByZWFzb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8qKiByZXR1cm5zIHRoZSBidWZmZXIgY29udGVudHMgc2l6ZSBjb252ZXJ0ZWQgdG8gdGltZSBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgICAgICAqIGZvciBQQ00gUGxheWJhY2sgb3IgUmVjb3JkIHN0cmVhbWluZyB0cmFja3MuIFRoZSByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IKKyAgICAgICAgICAgICAqIFBDTSBzdGF0aWMgdHJhY2tzIGFuZCBub3QgZGVmaW5lZCBmb3Igbm9uLVBDTSB0cmFja3MuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLgorICAgICAgICAgICAgICovCisgICAgdmlydHVhbCBkb3VibGUgICAgICBidWZmZXJMYXRlbmN5TXMoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCkgKiAxMDAwIC8gc2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiogcmV0dXJucyB3aGV0aGVyIHRoZSB0cmFjayBzdXBwb3J0cyBzZXJ2ZXIgbGF0ZW5jeSBjb21wdXRhdGlvbi4KKyAgICAgICAgICAgICAqIFRoaXMgaXMgc2V0IGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgY29uc3RhbnQgdGhyb3VnaG91dCB0aGUgdHJhY2sgbGlmZXRpbWUuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgY29uc3QgeyByZXR1cm4gbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQ7IH0KKworICAgICAgICAgICAgLyoqIGNvbXB1dGVzIHRoZSBzZXJ2ZXIgbGF0ZW5jeSBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCB0cmFjaworICAgICAgICAgICAgICogdG8gdGhlIGRldmljZSBzaW5rL3NvdXJjZS4gIFRoaXMgaXMgdGhlIHRpbWUgZm9yIHRoZSBuZXh0IGZyYW1lIGluIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgICAgICAqIHdyaXR0ZW4gb3IgcmVhZCBmcm9tIHRoZSBzZXJ2ZXIgdGhyZWFkIHRvIHRoZSBkZXZpY2Ugc291cmNlIG9yIHNpbmsuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLCBidXQgbGF0ZW5jeU1zIGFuZCBmcm9tVHJhY2sKKyAgICAgICAgICAgICAqIG1heSBiZSBub3QgYmUgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSBQYXRjaFBhbmVsIG1heSBub3Qgb2J0YWluIHRoZQorICAgICAgICAgICAgICogdGhyZWFkIGxvY2sgYmVmb3JlIGNhbGxpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHBhcmFtIGxhdGVuY3lNcyBvbiBzdWNjZXNzIGlzIHNldCB0byB0aGUgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlCisgICAgICAgICAgICAgKiAgICAgICAgbmV4dCBmcmFtZSB3cml0dGVuL3JlYWQgYnkgdGhlIHNlcnZlciB0aHJlYWQgdG8vZnJvbSB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgZGV2aWNlIHNvdXJjZS9zaW5rLgorICAgICAgICAgICAgICogXHBhcmFtIGZyb21UcmFjayBvbiBzdWNjZXNzIGlzIHNldCB0byB0cnVlIGlmIGxhdGVuY3kgd2FzIGNvbXB1dGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgdHJhY2sgdGltZXN0YW1wOyBvdGhlcndpc2Ugc2V0IHRvIGZhbHNlIGlmIGxhdGVuY3kgd2FzCisgICAgICAgICAgICAgKiAgICAgICAgZXN0aW1hdGVkIGZyb20gdGhlIHNlcnZlciB0aW1lc3RhbXAuCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbVRyYWNrIG1heSBiZSBudWxscHRyIG9yIG9taXR0ZWQgaWYgbm90IHJlcXVpcmVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxyZXR1cm5zIE9LIG9yIElOVkFMSURfT1BFUkFUSU9OIG9uIGZhaWx1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFNlcnZlckxhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcywgYm9vbCAqZnJvbVRyYWNrID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHRocmVhZCBsb2NrIGlzIGFjcXVpcmVkLCB0aGVzZSBhdG9taWNzIGFyZSBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZWQgd2l0aCBlYWNoIG90aGVyLCBjb25zaWRlcmVkIGEgYmVuaWduIHJhY2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgc2VydmVyTGF0ZW5jeU1zID0gbVNlcnZlckxhdGVuY3lNcy5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckxhdGVuY3lNcyA9PSAwLikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnJvbVRyYWNrID0gbVNlcnZlckxhdGVuY3lGcm9tVHJhY2subG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeU1zID0gc2VydmVyTGF0ZW5jeU1zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIGNvbXB1dGVzIHRoZSB0b3RhbCBjbGllbnQgbGF0ZW5jeSBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCB0cmFja3MKKyAgICAgICAgICAgICAqIGZvciB0aGUgbmV4dCBjbGllbnQgYXBwIGFjY2VzcyB0byB0aGUgZGV2aWNlIHNpbmsvc291cmNlOyBpLmUuIHRoZQorICAgICAgICAgICAgICogc2VydmVyIGxhdGVuY3kgcGx1cyB0aGUgYnVmZmVyIGxhdGVuY3kuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLCBidXQgbGF0ZW5jeU1zIGFuZCBmcm9tVHJhY2sKKyAgICAgICAgICAgICAqIG1heSBiZSBub3QgYmUgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSBQYXRjaFBhbmVsIG1heSBub3Qgb2J0YWluIHRoZQorICAgICAgICAgICAgICogdGhyZWFkIGxvY2sgYmVmb3JlIGNhbGxpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHBhcmFtIGxhdGVuY3lNcyBvbiBzdWNjZXNzIGlzIHNldCB0byB0aGUgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlCisgICAgICAgICAgICAgKiAgICAgICAgbmV4dCBmcmFtZSB3cml0dGVuL3JlYWQgYnkgdGhlIGNsaWVudCBhcHAgdG8vZnJvbSB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgZGV2aWNlIHNpbmsvc291cmNlLgorICAgICAgICAgICAgICogXHBhcmFtIGZyb21UcmFjayBvbiBzdWNjZXNzIGlzIHNldCB0byB0cnVlIGlmIGxhdGVuY3kgd2FzIGNvbXB1dGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgdHJhY2sgdGltZXN0YW1wOyBvdGhlcndpc2Ugc2V0IHRvIGZhbHNlIGlmIGxhdGVuY3kgd2FzCisgICAgICAgICAgICAgKiAgICAgICAgZXN0aW1hdGVkIGZyb20gdGhlIHNlcnZlciB0aW1lc3RhbXAuCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbVRyYWNrIG1heSBiZSBudWxscHRyIG9yIG9taXR0ZWQgaWYgbm90IHJlcXVpcmVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxyZXR1cm5zIE9LIG9yIElOVkFMSURfT1BFUkFUSU9OIG9uIGZhaWx1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRyYWNrTGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zLCBib29sICpmcm9tVHJhY2sgPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNlcnZlckxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRTZXJ2ZXJMYXRlbmN5TXMoJnNlcnZlckxhdGVuY3lNcywgZnJvbVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsYXRlbmN5TXMgPSBzZXJ2ZXJMYXRlbmN5TXMgKyBidWZmZXJMYXRlbmN5TXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBtYWtpbmcgdGhpcyBleHRlcm5hbC4KKyAgICAgICAgICAgc3RydWN0IEZyYW1lVGltZSB7CisgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lczsKKyAgICAgICAgICAgICAgIGludDY0X3QgdGltZU5zOworICAgICAgICAgICB9OworCisgICAgICAgICAgIC8vIEtlcm5lbEZyYW1lVGltZSBpcyB1cGRhdGVkIHBlciAibWl4IiBwZXJpb2QgZXZlbiBmb3Igbm9uLXBjbSB0cmFja3MuCisgICAgICAgICAgIHZvaWQgICAgICAgICBnZXRLZXJuZWxGcmFtZVRpbWUoRnJhbWVUaW1lICpmdCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZ0ID0gbUtlcm5lbEZyYW1lVGltZS5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgICAgICAgICBpbnQgaWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKwogcHJvdGVjdGVkOgogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUcmFja0Jhc2UpOwogCkBAIC0xMTEsOCArMjEwLDYgQEAKICAgICAvLyBidXQgcHV0dGluZyBpdCBpbiBUcmFja0Jhc2UgYXZvaWRzIHRoZSBjb21wbGV4aXR5IG9mIHZpcnR1YWwgaW5oZXJpdGFuY2UKICAgICB2aXJ0dWFsIHNpemVfdCAgZnJhbWVzUmVhZHkoKSBjb25zdCB7IHJldHVybiBTSVpFX01BWDsgfQogCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQotCiAgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2s7IH0KQEAgLTEzNCwxNCArMjMxLDYgQEAKICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVE9QUElOR18yOwogICAgIH0KIAotICAgIGJvb2wgaXNUZXJtaW5hdGVkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVRlcm1pbmF0ZWQ7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXJtaW5hdGUoKSB7Ci0gICAgICAgIG1UZXJtaW5hdGVkID0gdHJ1ZTsKLSAgICB9Ci0KICAgICAvLyBVcHBlciBjYXNlIGNoYXJhY3RlcnMgYXJlIGZpbmFsIHN0YXRlcy4KICAgICAvLyBMb3dlciBjYXNlIGNoYXJhY3RlcnMgYXJlIHRyYW5zaXRvcnkuCiAgICAgY29uc3QgY2hhciAqZ2V0VHJhY2tTdGF0ZVN0cmluZygpIGNvbnN0IHsKQEAgLTIwOCwxMyArMjk3LDE5IEBACiAgICAgY29uc3QgYm9vbCAgICAgICAgICBtSXNPdXQ7CiAgICAgc3A8U2VydmVyUHJveHk+ICAgICBtU2VydmVyUHJveHk7CiAgICAgY29uc3QgaW50ICAgICAgICAgICBtSWQ7Ci0gICAgc3A8TkJBSU9fU2luaz4gICAgICBtVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+ICAgIG1UZWVTb3VyY2U7CisjaWZkZWYgVEVFX1NJTksKKyAgICBOQkFJT19UZWUgICAgICAgICAgIG1UZWU7CisjZW5kaWYKICAgICBib29sICAgICAgICAgICAgICAgIG1UZXJtaW5hdGVkOwogICAgIHRyYWNrX3R5cGUgICAgICAgICAgbVR5cGU7ICAgICAgLy8gbXVzdCBiZSBvbmUgb2YgVFlQRV9ERUZBVUxULCBUWVBFX09VVFBVVCwgVFlQRV9QQVRDSCAuLi4KICAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1UaHJlYWRJb0hhbmRsZTsgLy8gSS9PIGhhbmRsZSBvZiB0aGUgdGhyZWFkIHRoZSB0cmFjayBpcyBhdHRhY2hlZCB0bwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsgLy8gdW5pcXVlIElEIGZvciB0aGlzIHRyYWNrIHVzZWQgYnkgYXVkaW8gcG9saWN5CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNJbnZhbGlkOyAvLyBub24tcmVzZXR0YWJsZSBsYXRjaCwgc2V0IGJ5IGludmFsaWRhdGUoKQorCisgICAgYm9vbCAgICAgICAgICAgICAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IGZhbHNlOworICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2t7fTsgLy8gbGF0ZW5jeSBmcm9tIHRyYWNrIG9yIHNlcnZlciB0aW1lc3RhbXAuCisgICAgc3RkOjphdG9taWM8ZG91YmxlPiBtU2VydmVyTGF0ZW5jeU1ze307ICAgICAgICAvLyBsYXN0IGxhdGVuY3kgcHVzaGVkIGZyb20gc2VydmVyIHRocmVhZC4KKyAgICBzdGQ6OmF0b21pYzxGcmFtZVRpbWU+IG1LZXJuZWxGcmFtZVRpbWV7fTsgICAgIC8vIGxhc3QgZnJhbWUgdGltZSBvbiBrZXJuZWwgc2lkZS4KIH07CiAKIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgUGF0Y2hUcmFjayBhbmQgUGF0Y2hSZWNvcmQuCkBAIC0yMjksMyArMzI0LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpyZXF1ZXN0ZWQgPSBOVUxMKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcikgPSAwOwogfTsKKworY2xhc3MgUGF0Y2hUcmFja0Jhc2UgOiBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyCit7CitwdWJsaWM6CisgICAgdXNpbmcgVGltZW91dCA9IHN0ZDo6b3B0aW9uYWw8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2tCYXNlKHNwPENsaWVudFByb3h5PiBwcm94eSwgY29uc3QgVGhyZWFkQmFzZSYgdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRQZWVyVGltZW91dChzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgdGltZW91dCk7CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFBlZXJQcm94eShjb25zdCBzcDxUPiAmcHJveHksIGJvb2wgaG9sZFJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZWVyUmVmZXJlbmNlSG9sZCA9IGhvbGRSZWZlcmVuY2UgPyBwcm94eSA6IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlZXJQcm94eSA9IHByb3h5LmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgY2xlYXJQZWVyUHJveHkoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlZXJSZWZlcmVuY2VIb2xkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlZXJQcm94eSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBzcDxDbGllbnRQcm94eT4gICAgICAgbVByb3h5OworICAgIHNwPFJlZkJhc2U+ICAgICAgICAgICAgICAgICBtUGVlclJlZmVyZW5jZUhvbGQ7ICAgLy8ga2VlcHMgbVBlZXJQcm94eSBhbGl2ZSBkdXJpbmcgYWNjZXNzLgorICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5ID0gbnVsbHB0cjsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICAgICAgbVBlZXJUaW1lb3V0e307CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDZkMjVmYjkuLjVhNDM2OTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0yOCwxMSArMjgsMTEgQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvUmVjb3JkQnVmZmVyQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTU2LDYgKzU2LDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgVHJhY2tCYXNlCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2tCYXNlIgogCiBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBuZXh0VHJhY2tJZCA9IDU1OwogCkBAIC05NywxNCArOTksMTUgQEAKICAgICAgICAgbUlkKGFuZHJvaWRfYXRvbWljX2luYygmbmV4dFRyYWNrSWQpKSwKICAgICAgICAgbVRlcm1pbmF0ZWQoZmFsc2UpLAogICAgICAgICBtVHlwZSh0eXBlKSwKLSAgICAgICAgbVRocmVhZElvSGFuZGxlKHRocmVhZC0+aWQoKSksCisgICAgICAgIG1UaHJlYWRJb0hhbmRsZSh0aHJlYWQgPyB0aHJlYWQtPmlkKCkgOiBBVURJT19JT19IQU5ETEVfTk9ORSksCiAgICAgICAgIG1Qb3J0SWQocG9ydElkKSwKICAgICAgICAgbUlzSW52YWxpZChmYWxzZSkKIHsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSB8fCBjbGllbnRVaWQgPT0gQVVESU9fVUlEX0lOVkFMSUQpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpIHx8IGNsaWVudFVpZCA9PSBBVURJT19VSURfSU5WQUxJRCkgewogICAgICAgICBBTE9HV19JRihjbGllbnRVaWQgIT0gQVVESU9fVUlEX0lOVkFMSUQgJiYgY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCi0gICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CiAgICAgICAgIGNsaWVudFVpZCA9IGNhbGxpbmdVaWQ7CiAgICAgfQogICAgIC8vIGNsaWVudFVpZCBjb250YWlucyB0aGUgdWlkIG9mIHRoZSBhcHAgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyB0cmFjaywgc28gd2UgY2FuIGJsYW1lCkBAIC0xNDQsNyArMTQ3LDcgQEAKICAgICAgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoc2l6ZSk7CiAgICAgICAgIGlmIChtQ2Jsa01lbW9yeSA9PSAwIHx8CiAgICAgICAgICAgICAgICAgKG1DYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1IiwgX19mdW5jX18sIG1JZCwgc2l6ZSk7CiAgICAgICAgICAgICBjbGllbnQtPmhlYXAoKS0+ZHVtcCgiQXVkaW9UcmFjayIpOwogICAgICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE1Miw3ICsxNTUsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DYmxrID0gKGF1ZGlvX3RyYWNrX2NibGtfdCAqKSBtYWxsb2Moc2l6ZSk7CiAgICAgICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1IiwgX19mdW5jX18sIG1JZCwgc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjYsNyArMTY5LDggQEAKICAgICAgICAgICAgIGlmIChyb0hlYXAgPT0gMCB8fAogICAgICAgICAgICAgICAgICAgICAobUJ1ZmZlck1lbW9yeSA9IHJvSGVhcC0+YWxsb2NhdGUoYnVmZmVyU2l6ZSkpID09IDAgfHwKICAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXIgPSBtQnVmZmVyTWVtb3J5LT5wb2ludGVyKCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHJlYWQtb25seSBidWZmZXIgc2l6ZT0lenUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgcmVhZC1vbmx5IGJ1ZmZlciBzaXplPSV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBidWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICBpZiAocm9IZWFwICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgcm9IZWFwLT5kdW1wKCJidWZmZXIiKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMDUsMjcgKzIwOSwxMiBAQAogICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBhbGxvY2F0aW9uIHR5cGU6ICVkIiwgKGludClhbGxvYyk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IGludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIF9fZnVuY19fLCBtSWQsIChpbnQpYWxsb2MpOwogICAgICAgICB9CiAgICAgICAgIG1CdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKIAogI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIGlmIChtVGVlU2lua1RyYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IHBpcGVGb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBtRm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChGb3JtYXRfaXNWYWxpZChwaXBlRm9ybWF0KSkgewotICAgICAgICAgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShtVGVlU2lua1RyYWNrRnJhbWVzLCBwaXBlRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtwaXBlRm9ybWF0fTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgUGlwZVJlYWRlciAqcGlwZVJlYWRlciA9IG5ldyBQaXBlUmVhZGVyKCpwaXBlKTsKLSAgICAgICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIG1UZWVTaW5rID0gcGlwZTsKLSAgICAgICAgICAgICAgICBtVGVlU291cmNlID0gcGlwZVJlYWRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtVGVlLnNldChzYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBmb3JtYXQsIE5CQUlPX1RlZTo6VEVFX0ZMQUdfVFJBQ0spOwogI2VuZGlmCiAKICAgICB9CkBAIC0yNDQsOSArMjMzLDYgQEAKIAogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6On5UcmFja0Jhc2UoKQogewotI2lmZGVmIFRFRV9TSU5LCi0gICAgZHVtcFRlZSgtMSwgbVRlZVNvdXJjZSwgbUlkLCAnVCcpOwotI2VuZGlmCiAgICAgLy8gZGVsZXRlIHRoZSBwcm94eSBiZWZvcmUgZGVsZXRpbmcgdGhlIHNoYXJlZCBtZW1vcnkgaXQgcmVmZXJzIHRvLCB0byBhdm9pZCBkYW5nbGluZyByZWZlcmVuY2UKICAgICBtU2VydmVyUHJveHkuY2xlYXIoKTsKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewpAQCAtMjc0LDkgKzI2MCw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewogI2lmZGVmIFRFRV9TSU5LCi0gICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZShidWZmZXItPnJhdywgYnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICB9CisgICAgbVRlZS53cml0ZShidWZmZXItPnJhdywgYnVmZmVyLT5mcmFtZUNvdW50KTsKICNlbmRpZgogCiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CkBAIC0yOTMsOSArMjc3LDMyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlBhdGNoVHJhY2tCYXNlOjpQYXRjaFRyYWNrQmFzZShzcDxDbGllbnRQcm94eT4gcHJveHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRCYXNlJiB0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0KQorICAgIDogbVByb3h5KHByb3h5KQoreworICAgIGlmICh0aW1lb3V0KSB7CisgICAgICAgIHNldFBlZXJUaW1lb3V0KCp0aW1lb3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBEb3VibGUgYnVmZmVyIG1peGVyCisgICAgICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogdGhyZWFkLmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQuc2FtcGxlUmF0ZSgpOworICAgICAgICBzZXRQZWVyVGltZW91dChzdGQ6OmNocm9ubzo6bmFub3NlY29uZHN7bWl4QnVmZmVyTnN9KTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpQYXRjaFRyYWNrQmFzZTo6c2V0UGVlclRpbWVvdXQoc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzIHRpbWVvdXQpIHsKKyAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gdGltZW91dC5jb3VudCgpIC8gc3RkOjpuYW5vOjpkZW47CisgICAgbVBlZXJUaW1lb3V0LnR2X25zZWMgPSB0aW1lb3V0LmNvdW50KCkgJSBzdGQ6Om5hbm86OmRlbjsKK30KKworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFBsYXliYWNrCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2tIYW5kbGUiCiAKIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OlRyYWNrSGFuZGxlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiYgdHJhY2spCiAgICAgOiBCbkF1ZGlvVHJhY2soKSwKQEAgLTM0MCw2ICszNDcsMTAgQEAKICAgICByZXR1cm4gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgcmV0dXJuIG1UcmFjay0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOworfQorCiBWb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjphcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKQEAgLTM2OCw2ICszNzksOCBAQAogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2siCiAKIC8vIFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OlRyYWNrKApAQCAtMzk3LDcgKzQxMCw2IEBACiAgICAgLy8gbVJldHJ5Q291bnQgaW5pdGlhbGl6ZWQgbGF0ZXIgd2hlbiBuZWVkZWQKICAgICBtU2hhcmVkQnVmZmVyKHNoYXJlZEJ1ZmZlciksCiAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCi0gICAgbU5hbWUoVFJBQ0tfTkFNRV9GQUlMVVJFKSwgIC8vIHNldCB0byBUUkFDS19OQU1FX1BFTkRJTkcgb24gY29uc3RydWN0b3Igc3VjY2Vzcy4KICAgICBtTWFpbkJ1ZmZlcih0aHJlYWQtPnNpbmtCdWZmZXIoKSksCiAgICAgbUF1eEJ1ZmZlcihOVUxMKSwKICAgICBtQXV4RWZmZWN0SWQoMCksIG1IYXNWb2x1bWVDb250cm9sbGVyKGZhbHNlKSwKQEAgLTQxNyw4ICs0MjksOCBAQAogICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKICAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7CiAKLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAiJXMoJWQpOiBzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQzNCw3ICs0NDYsNyBAQAogICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAKICAgICBpZiAoIXRocmVhZC0+aXNUcmFja0FsbG93ZWRfbChjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQsIHVpZCkpIHsKLSAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2tzIGF2YWlsYWJsZSIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBubyBtb3JlIHRyYWNrcyBhdmFpbGFibGUiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQpAQCAtNDUzLDEyICs0NjUsMjQgQEAKICAgICAgICAgbUZhc3RJbmRleCA9IGk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CiAgICAgfQotICAgIG1OYW1lID0gVFJBQ0tfTkFNRV9QRU5ESU5HOworCisgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUgorICAgICAgICAgICAgfHwgdGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RFVQTElDQVRJTkc7CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCisgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX1QiKTsKKyNlbmRpZgorCisgICAgaWYgKGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgIG1BdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIgPSBuZXcgQXVkaW9WaWJyYXRpb25Db250cm9sbGVyKHRoaXMpOworICAgICAgICBtRXh0ZXJuYWxWaWJyYXRpb24gPSBuZXcgb3M6OkV4dGVybmFsVmlicmF0aW9uKAorICAgICAgICAgICAgICAgIG1VaWQsICIiIC8qIHBrZyAqLywgbUF0dHIsIG1BdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIpOworICAgIH0KIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6On5UcmFjaygpCiB7Ci0gICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjpUcmFjayBkZXN0cnVjdG9yIik7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogCiAgICAgLy8gVGhlIGRlc3RydWN0b3Igd291bGQgY2xlYXIgbVNoYXJlZEJ1ZmZlciwKICAgICAvLyBidXQgaXQgd2lsbCBub3QgcHVzaCB0aGUgZGVjcmVtZW50ZWQgcmVmZXJlbmNlIGNvdW50LApAQCAtNDcyLDcgKzQ5Niw3IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aW5pdENoZWNrKCkgY29uc3QKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFja0Jhc2U6OmluaXRDaGVjaygpOwotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbU5hbWUgPT0gVFJBQ0tfTkFNRV9GQUlMVVJFKSB7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBtQ2JsayA9PSBudWxscHRyKSB7CiAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTQ5OCwxOCArNTIyLDIxIEBACiAgICAgICAgICAgICB3YXNBY3RpdmUgPSBwbGF5YmFja1RocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpICYmICF3YXNBY3RpdmUpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1UaHJlYWRJb0hhbmRsZSwgbVN0cmVhbVR5cGUsIG1TZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICB9CisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPmRlc3Ryb3koKTsgfSk7CiB9CiAKLS8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJUIE5hbWUgQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICIKLSAgICAgICAgICAgICAgICAgICIgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgIgotICAgICAgICAgICAgICAgICAgIlNUICBMIGRCICBSIGRCICBWUyBkQiAiCi0gICAgICAgICAgICAgICAgICAiICBTZXJ2ZXIgRnJtQ250ICBGcm1SZHkgRiBVbmRlcnJ1bnMgIEZsdXNoZWQgIgotICAgICAgICAgICAgICAgICAgIk1haW4gQnVmICBBdXggQnVmXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJUeXBlICAgICBJZCBBY3RpdmUgQ2xpZW50IFNlc3Npb24gUG9ydCBJZCBTICBGbGFncyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJTVCBVc2cgQ1QgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBHIGRiICBMIGRCICBSIGRCICBWUyBkQiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiICBTZXJ2ZXIgRnJtQ250ICBGcm1SZHkgRiBVbmRlcnJ1bnMgIEZsdXNoZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAiJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSA/ICIgICBMYXRlbmN5IiA6ICIiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQpAQCAtNTE4LDcgKzU0NSw3IEBACiAgICAgc3dpdGNoIChtVHlwZSkgewogICAgIGNhc2UgVFlQRV9ERUZBVUxUOgogICAgIGNhc2UgVFlQRV9PVVRQVVQ6Ci0gICAgICAgIGlmIChtU2hhcmVkQnVmZmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzU3RhdGljKCkpIHsKICAgICAgICAgICAgIHRyYWNrVHlwZSA9ICdTJzsgLy8gc3RhdGljCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFja1R5cGUgPSAnICc7IC8vIG5vcm1hbApAQCAtNTMyLDEzICs1NTksOSBAQAogICAgIH0KIAogICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkYlYyAlM2QiLCB0cmFja1R5cGUsIG1GYXN0SW5kZXgpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPT0gVFJBQ0tfTkFNRV9QRU5ESU5HKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjIHBlbmQiLCB0cmFja1R5cGUpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPT0gVFJBQ0tfTkFNRV9GQUlMVVJFKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjIGZhaWwiLCB0cmFja1R5cGUpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWQgJWMgJTZkIiwgbUZhc3RJbmRleCwgdHJhY2tUeXBlLCBtSWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjICU0ZCIsIHRyYWNrVHlwZSwgbU5hbWUpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAlYyAlNmQiLCB0cmFja1R5cGUsIG1JZCk7CiAgICAgfQogCiAgICAgY2hhciBub3dJblVuZGVycnVuOwpAQCAtNTkzLDIyICs2MTYsMjcgQEAKICAgICAgICAgICAgID8gJ3InIC8qIGJ1ZmZlciByZWR1Y2VkICovOiBidWZmZXJTaXplSW5GcmFtZXMgPiBtRnJhbWVDb3VudAogICAgICAgICAgICAgICAgICAgICA/ICdlJyAvKiBlcnJvciAqLyA6ICcgJyAvKiBpZGVudGljYWwgKi87CiAKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlN3MgJTZ1ICU3dSAlMnMgMHglMDNYICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTUuMmcgJTUuMmcgJTUuMmclYyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOHpYICUwOHpYXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU3cyAlNnUgJTd1ICU3dSAlMnMgMHglMDNYICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTN4ICUyeCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTUuMmcgJTUuMmcgJTUuMmcgJTUuMmclYyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UiLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCiAKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCksCisgICAgICAgICAgICBzYW1wbGVSYXRlKCksCiAKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbUF0dHIudXNhZ2UsCisgICAgICAgICAgICBtQXR0ci5jb250ZW50X3R5cGUsCisKKyAgICAgICAgICAgIDIwLjAgKiBsb2cxMChtRmluYWxWb2x1bWUpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAodnNWb2x1bWUuZmlyc3QpLCAvLyBWb2x1bWVTaGFwZXIocykgdG90YWwgdm9sdW1lCkBAIC02MjEsMTEgKzY0OSwyMSBAQAogICAgICAgICAgICAgZmlsbGluZ1N0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCksCiAgICAgICAgICAgICBub3dJblVuZGVycnVuLAotICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwLAotCi0gICAgICAgICAgICAoc2l6ZV90KW1NYWluQnVmZmVyLCAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKLSAgICAgICAgICAgIChzaXplX3QpbUF1eEJ1ZmZlciAgIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAorICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwCiAgICAgICAgICAgICApOworCisgICAgaWYgKGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgIGJvb2wgZnJvbVRyYWNrOworICAgICAgICBpZiAoZ2V0VHJhY2tMYXRlbmN5TXMoJmxhdGVuY3lNcywgJmZyb21UcmFjaykgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFNob3cgbGF0ZW5jeSBpbiBtc2VjLCBmb2xsb3dlZCBieSAndCcgaWYgZnJvbSB0cmFjayB0aW1lc3RhbXAgKHRoZSBtb3N0IGFjY3VyYXRlKQorICAgICAgICAgICAgLy8gb3IgJ2snIGlmIGVzdGltYXRlZCBmcm9tIGtlcm5lbCBiZWNhdXNlIHRyYWNrIGZyYW1lcyBoYXZlbid0IGJlZW4gcHJlc2VudGVkIHlldC4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAlNy4ybGYgJWMiLCBsYXRlbmN5TXMsIGZyb21UcmFjayA/ICd0JyA6ICdrJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMTBzIiwgbUNibGstPm1TZXJ2ZXIgIT0gMCA/ICJ1bmF2YWlsIiA6ICJuZXciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2FtcGxlUmF0ZSgpIGNvbnN0IHsKQEAgLTYzMyw4ICs2NzEsNyBAQAogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldE5leHRCdWZmZXIoCi0gICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7CiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgc2l6ZV90IGRlc2lyZWRGcmFtZXMgPSBidWZmZXItPmZyYW1lQ291bnQ7CkBAIC02NDMsMTYgKzY4MCw3MiBAQAogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKICAgICBidWZmZXItPnJhdyA9IGJ1Zi5tUmF3OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCAmJiAhaXNTdG9wcGluZygpICYmICFpc1N0b3BwZWQoKSAmJiAhaXNQYXVzZWQoKSkgewotICAgICAgICBBTE9HVigidW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpLCBzdGF0ZTogJWQiLAotICAgICAgICAgICAgICAgIGJ1Zi5tRnJhbWVDb3VudCwgZGVzaXJlZEZyYW1lcywgbVN0YXRlKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpLCBzdGF0ZTogJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGJ1Zi5tRnJhbWVDb3VudCwgZGVzaXJlZEZyYW1lcywgbVN0YXRlKTsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOwogICAgIH0KLQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCit7CisgICAgaW50ZXJjZXB0QnVmZmVyKCpidWZmZXIpOworICAgIFRyYWNrQmFzZTo6cmVsZWFzZUJ1ZmZlcihidWZmZXIpOworfQorCisvLyBUT0RPOiBjb21wZW5zYXRlIGZvciB0aW1lIHNoaWZ0IGJldHdlZW4gSFcgbW9kdWxlcy4KK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmludGVyY2VwdEJ1ZmZlcigKKyAgICAgICAgY29uc3QgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBzb3VyY2VCdWZmZXIpIHsKKyAgICBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBzb3VyY2VCdWZmZXIuZnJhbWVDb3VudDsKKyAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybjsgIC8vIE5vIGF1ZGlvIHRvIGludGVyY2VwdC4KKyAgICAgICAgLy8gQWRkaXRpb25hbGx5IFBhdGNoUHJveHlCdWZmZXJQcm92aWRlcjo6b2J0YWluQnVmZmVyIChjYWxsZWQgYnkgUGF0aFRyYWNrOjpnZXROZXh0QnVmZmVyKQorICAgICAgICAvLyBkb2VzIG5vdCBhbGxvdyAwIGZyYW1lIHNpemUgcmVxdWVzdCBjb250cmFyeSB0byBnZXROZXh0QnVmZmVyCisgICAgfQorICAgIGZvciAoYXV0byYgdGVlUGF0Y2ggOiBtVGVlUGF0Y2hlcykgeworICAgICAgICBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKiBwYXRjaFJlY29yZCA9IHRlZVBhdGNoLnBhdGNoUmVjb3JkLmdldCgpOworCisgICAgICAgIHNpemVfdCBmcmFtZXNXcml0dGVuID0gd3JpdGVGcmFtZXMocGF0Y2hSZWNvcmQsIHNvdXJjZUJ1ZmZlci5pOCwgZnJhbWVDb3VudCk7CisgICAgICAgIC8vIE9uIGJ1ZmZlciB3cmFwLCB0aGUgYnVmZmVyIGZyYW1lIGNvdW50IHdpbGwgYmUgbGVzcyB0aGFuIHJlcXVlc3RlZCwKKyAgICAgICAgLy8gd2hlbiB0aGlzIGhhcHBlbnMgYSBzZWNvbmQgYnVmZmVyIG5lZWRzIHRvIGJlIHVzZWQgdG8gd3JpdGUgdGhlIGxlZnRvdmVyIGF1ZGlvCisgICAgICAgIHNpemVfdCBmcmFtZXNMZWZ0ID0gZnJhbWVDb3VudCAtIGZyYW1lc1dyaXR0ZW47CisgICAgICAgIGlmIChmcmFtZXNXcml0dGVuICE9IDAgJiYgZnJhbWVzTGVmdCAhPSAwKSB7CisgICAgICAgICAgICBmcmFtZXNXcml0dGVuICs9CisgICAgICAgICAgICAgICAgd3JpdGVGcmFtZXMocGF0Y2hSZWNvcmQsIHNvdXJjZUJ1ZmZlci5pOCArIGZyYW1lc1dyaXR0ZW4gKiBtRnJhbWVTaXplLCBmcmFtZXNMZWZ0KTsKKyAgICAgICAgICAgIGZyYW1lc0xlZnQgPSBmcmFtZUNvdW50IC0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgfQorICAgICAgICBBTE9HV19JRihmcmFtZXNMZWZ0ICE9IDAsICIlcyglZCkgUGF0Y2hSZWNvcmQgJWQgY2FuIG5vdCBwcm92aWRlIGJpZyBlbm91Z2ggIgorICAgICAgICAgICAgICAgICAiYnVmZmVyICV6dS8lenUsIGRyb3BwaW5nICV6dSBmcmFtZXMiLCBfX2Z1bmNfXywgbUlkLCBwYXRjaFJlY29yZC0+bUlkLAorICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuLCBmcmFtZUNvdW50LCBmcmFtZXNMZWZ0KTsKKyAgICB9CisgICAgYXV0byBzcGVudCA9IGNlaWw8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBzdGFydCk7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworICAgIC8vIEF2ZXJhZ2UgaXMgfjIwdXMgcGVyIHRyYWNrLCB0aGlzIHNob3VsZCB2aXJ0dWFsbHkgbmV2ZXIgYmUgbG9nZ2VkIChMb2dnaW5nIHRha2VzID4yMDB1cykKKyAgICBBTE9HRF9JRihzcGVudCA+IDIwMHVzLCAiJXM6IHRvb2sgJWxsZHVzIHRvIGludGVyY2VwdCAlenUgdHJhY2tzIiwgX19mdW5jX18sCisgICAgICAgICAgICAgc3BlbnQuY291bnQoKSwgbVRlZVBhdGNoZXMuc2l6ZSgpKTsKK30KKworc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp3cml0ZUZyYW1lcyhBdWRpb0J1ZmZlclByb3ZpZGVyKiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIHBhdGNoQnVmZmVyOworICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIGF1dG8gc3RhdHVzID0gZGVzdC0+Z2V0TmV4dEJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICBBTE9HVygiJXMgUGF0aFJlY29yZCBnZXROZXh0QnVmZmVyIGZhaWxlZCB3aXRoIGVycm9yICVkOiAlcyIsCisgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgc3RyZXJyb3IoLXN0YXR1cykpOworICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBBTE9HX0FTU0VSVChwYXRjaEJ1ZmZlci5mcmFtZUNvdW50IDw9IGZyYW1lQ291bnQpOworICAgIG1lbWNweShwYXRjaEJ1ZmZlci5yYXcsIHNyYywgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOworICAgIGF1dG8gZnJhbWVzV3JpdHRlbiA9IHBhdGNoQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgZGVzdC0+cmVsZWFzZUJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgIHJldHVybiBmcmFtZXNXcml0dGVuOworfQorCiAvLyByZWxlYXNlQnVmZmVyKCkgaXMgbm90IG92ZXJyaWRkZW4KIAogLy8gRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQpAQCAtNjgyLDYgKzc3NSwxMyBAQAogICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldFRpbWVzdGFtcCh0aW1lc3RhbXApOwogCiAgICAgLy8gV2UgZG8gbm90IHNldCBkcmFpbmVkIGhlcmUsIGFzIEZhc3RUcmFjayB0aW1lc3RhbXAgbWF5IG5vdCBnbyB0byB2ZXJ5IGxhc3QgZnJhbWUuCisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kuCisgICAgLy8gVE9ETzogQ29uc2lkZXIgd2hldGhlciB0aGUgc2VydmVyIGxhdGVuY3kgbWF5IGJlIHBhc3NlZCBpbiBieSBGYXN0TWl4ZXIKKyAgICAvLyBhcyBhIGNvbnN0YW50IGZvciBhbGwgYWN0aXZlIEZhc3RUcmFja3MuCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IHRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoc2FtcGxlUmF0ZSgpKTsKKyAgICBtU2VydmVyTGF0ZW5jeUZyb21UcmFjay5zdG9yZSh0cnVlKTsKKyAgICBtU2VydmVyTGF0ZW5jeU1zLnN0b3JlKGxhdGVuY3lNcyk7CiB9CiAKIC8vIERvbid0IGNhbGwgZm9yIGZhc3QgdHJhY2tzOyB0aGUgZnJhbWVzUmVhZHkoKSBjb3VsZCByZXN1bHQgaW4gcHJpb3JpdHkgaW52ZXJzaW9uCkBAIC03MTAsOCArODEwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgQUxPR1YoInN0YXJ0KCVkKSwgY2FsbGluZyBwaWQgJWQgc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICBtTmFtZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtU2Vzc2lvbklkKTsKKyAgICBBTE9HVigiJXMoJWQpOiBjYWxsaW5nIHBpZCAlZCBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbVNlc3Npb25JZCk7CiAKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKQEAgLTczNywxNCArODM3LDE3IEBACiAgICAgICAgICAgICBpZiAobVJlc3VtZVRvU3RvcHBpbmcpIHsKICAgICAgICAgICAgICAgICAvLyBoYXBwZW5lZCB3ZSBuZWVkIHRvIHJlc3VtZSB0byBTVE9QUElOR18xCiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUElOR18xOwotICAgICAgICAgICAgICAgIEFMT0dWKCJQQVVTRUQgPT4gU1RPUFBJTkdfMSAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBQQVVTRUQgPT4gU1RPUFBJTkdfMSBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBUcmFja0Jhc2U6OlJFU1VNSU5HOwotICAgICAgICAgICAgICAgIEFMT0dWKCJQQVVTRUQgPT4gUkVTVU1JTkcgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogUEFVU0VEID0+IFJFU1VNSU5HIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7Ci0gICAgICAgICAgICBBTE9HVigiPyA9PiBBQ1RJVkUgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiA/ID0+IEFDVElWRSBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBzdGF0ZXMgdG8gcmVzZXQgcG9zaXRpb24gaW5mbyBmb3Igbm9uLW9mZmxvYWRlZC9kaXJlY3QgdHJhY2tzCkBAIC03OTAsMTIgKzg5MywxNSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+c3RhcnQoKTsgfSk7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0b3AoKQogewotICAgIEFMT0dWKCJzdG9wKCVkKSwgY2FsbGluZyBwaWQgJWQiLCBtTmFtZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBjYWxsaW5nIHBpZCAlZCIsIF9fZnVuY19fLCBtSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKQEAgLTgxOSwxNSArOTI1LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7Ci0gICAgICAgICAgICBBTE9HVigibm90IHN0b3BwaW5nL3N0b3BwZWQgPT4gc3RvcHBpbmcvc3RvcHBlZCAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLAotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZCk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBub3Qgc3RvcHBpbmcvc3RvcHBlZCA9PiBzdG9wcGluZy9zdG9wcGVkIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+c3RvcCgpOyB9KTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cGF1c2UoKQogewotICAgIEFMT0dWKCJwYXVzZSglZCksIGNhbGxpbmcgcGlkICVkIiwgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04NDYsNyArOTUzLDggQEAKICAgICAgICAgY2FzZSBBQ1RJVkU6CiAgICAgICAgIGNhc2UgUkVTVU1JTkc6CiAgICAgICAgICAgICBtU3RhdGUgPSBQQVVTSU5HOwotICAgICAgICAgICAgQUxPR1YoIkFDVElWRS9SRVNVTUlORyA9PiBQQVVTSU5HICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBBQ1RJVkUvUkVTVU1JTkcgPT4gUEFVU0lORyBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICAgICAgICAgIGJyZWFrOwogCkBAIC04NTQsMTEgKzk2MiwxMyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gUGF1c2luZyB0aGUgVGVlUGF0Y2ggdG8gYXZvaWQgYSBnbGl0Y2ggb24gdW5kZXJydW4sIGF0IHRoZSBjb3N0IG9mIGJ1ZmZlcmVkIGF1ZGlvIGxvc3MuCisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPnBhdXNlKCk7IH0pOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpmbHVzaCgpCiB7Ci0gICAgQUxPR1YoImZsdXNoKCVkKSIsIG1OYW1lKTsKKyAgICBBTE9HVigiJXMoJWQpIiwgX19mdW5jX18sIG1JZCk7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKQEAgLTg4MCwxMSArOTkwLDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigiZmx1c2g6IG9mZmxvYWQgZmx1c2giKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IG9mZmxvYWQgZmx1c2giLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgIHJlc2V0KCk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkdfMSB8fCBtU3RhdGUgPT0gU1RPUFBJTkdfMikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmbHVzaGVkIGluIFNUT1BQSU5HXzEgb3IgMiBzdGF0ZSwgY2hhbmdlIHN0YXRlIHRvIEFDVElWRSIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZsdXNoZWQgaW4gU1RPUFBJTkdfMSBvciAyIHN0YXRlLCBjaGFuZ2Ugc3RhdGUgdG8gQUNUSVZFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQpOwogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKICAgICAgICAgICAgIH0KIApAQCAtOTE0LDYgKzEwMjUsOCBAQAogICAgICAgICAvLyBiZWNhdXNlIHRoZSBoYXJkd2FyZSBidWZmZXIgY291bGQgaG9sZCBhIGxhcmdlIGFtb3VudCBvZiBhdWRpbwogICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICB9CisgICAgLy8gRmx1c2ggdGhlIFRlZSB0byBhdm9pZCBvbiByZXN1bWUgcGxheWluZyBvbGQgZGF0YSBhbmQgZ2xpdGNoaW5nIG9uIHRoZSB0cmFuc2l0aW9uIHRvIG5ldyBkYXRhCisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPmZsdXNoKCk7IH0pOwogfQogCiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKQEAgLTk0OSw3ICsxMDYyLDcgQEAKIHsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgQUxPR0UoInRocmVhZCBpcyBkZWFkIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IHRocmVhZCBpcyBkZWFkIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgfSBlbHNlIGlmICgodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUKSB8fAogICAgICAgICAgICAgICAgICAgICAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCkpIHsKQEAgLTk1OSw2ICsxMDcyLDE5IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwKKyAgICAgICAgaW50IHByb2dyYW1JZCkgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICBBTE9HRSgidGhyZWFkIGlzIGRlYWQiKTsKKyAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9IGVsc2UgaWYgKCh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1QpIHx8ICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSkgeworICAgICAgICBEaXJlY3RPdXRwdXRUaHJlYWQgKmRpcmVjdE91dHB1dFRocmVhZCA9IHN0YXRpY19jYXN0PERpcmVjdE91dHB1dFRocmVhZCo+KHRocmVhZC5nZXQoKSk7CisgICAgICAgIHJldHVybiBkaXJlY3RPdXRwdXRUaHJlYWQtPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKKyAgICB9CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBWb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKQpAQCAtOTY5LDggKzEwOTUsMTAgQEAKICAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPcHRpb25GbGFnIG9wdGlvbkZsYWcKICAgICAgICAgICAgID0gY29uZmlndXJhdGlvbi0+Z2V0T3B0aW9uRmxhZ3MoKTsKICAgICAgICAgaWYgKChvcHRpb25GbGFnICYgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPUFRJT05fRkxBR19DTE9DS19USU1FKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgdHJhY2tzIGRvIG5vdCBzdXBwb3J0IGZyYW1lIGNvdW50ZWQgVm9sdW1lU2hhcGVyLCIKLSAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBjbG9jayB0aW1lIGluc3RlYWQiLCBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWQiIDogIkRpcmVjdCIpOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogJXMgdHJhY2tzIGRvIG5vdCBzdXBwb3J0IGZyYW1lIGNvdW50ZWQgVm9sdW1lU2hhcGVyLCIKKyAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBjbG9jayB0aW1lIGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAorICAgICAgICAgICAgICAgICAgICBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWQiIDogIkRpcmVjdCIpOwogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24oKmNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbi0+c2V0T3B0aW9uRmxhZ3MoCiAgICAgICAgICAgICAgICAgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPcHRpb25GbGFnKG9wdGlvbkZsYWcKQEAgLTk4NSw3ICsxMTEzLDcgQEAKICAgICAgICAgLy8gU2lnbmFsIHRocmVhZCB0byBmZXRjaCBuZXcgdm9sdW1lLgogICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgdGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAxNyw2ICsxMTQ1LDExIEBACiAgICAgfTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2V0VGVlUGF0Y2hlcyhUZWVQYXRjaGVzIHRlZVBhdGNoZXMpIHsKKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+ZGVzdHJveSgpOyB9KTsKKyAgICBtVGVlUGF0Y2hlcyA9IHN0ZDo6bW92ZSh0ZWVQYXRjaGVzKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKQogewogICAgIGlmICghaXNPZmZsb2FkZWQoKSAmJiAhaXNEaXJlY3QoKSkgewpAQCAtMTEwNSwxMSArMTIzOCwxNCBAQAogICAgIC8vIHRvIGRldGVjdCB3aGVuIGFsbCBmcmFtZXMgaGF2ZSBiZWVuIHBsYXllZC4gSW4gdGhpcyBjYXNlIGZyYW1lc1dyaXR0ZW4gaXNuJ3QKICAgICAvLyB1c2VmdWwgYmVjYXVzZSBpdCBkb2Vzbid0IGFsd2F5cyByZWZsZWN0IHdoZXRoZXIgdGhlcmUgaXMgZGF0YSBpbiB0aGUgaC93CiAgICAgLy8gYnVmZmVycywgcGFydGljdWxhcmx5IGlmIGEgdHJhY2sgaGFzIGJlZW4gcGF1c2VkIGFuZCByZXN1bWVkIGR1cmluZyBkcmFpbmluZwotICAgIEFMT0dWKCJwcmVzZW50YXRpb25Db21wbGV0ZSgpIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyAlbGxkIGZyYW1lc1dyaXR0ZW4gJWxsZCIsCisgICAgQUxPR1YoIiVzKCVkKTogcHJlc2VudGF0aW9uQ29tcGxldGUoKSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBmcmFtZXNXcml0dGVuICVsbGQiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgIChsb25nIGxvbmcpbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzLCAobG9uZyBsb25nKWZyYW1lc1dyaXR0ZW4pOwogICAgIGlmIChtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgPT0gMCkgewogICAgICAgICBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgPSBmcmFtZXNXcml0dGVuICsgYXVkaW9IYWxGcmFtZXM7Ci0gICAgICAgIEFMT0dWKCJwcmVzZW50YXRpb25Db21wbGV0ZSgpIHJlc2V0OiBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBhdWRpb0hhbEZyYW1lcyAlenUiLAorICAgICAgICBBTE9HVigiJXMoJWQpOiBwcmVzZW50YXRpb25Db21wbGV0ZSgpIHJlc2V0OiIKKyAgICAgICAgICAgICAgICAiIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyAlbGxkIGF1ZGlvSGFsRnJhbWVzICV6dSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcywgYXVkaW9IYWxGcmFtZXMpOwogICAgIH0KIApAQCAtMTE3NSw3ICsxMzExLDggQEAKICAgICBpZiAoaXNUZXJtaW5hdGVkKCkgfHwgbVN0YXRlID09IFBBVVNFRCB8fAogICAgICAgICAgICAgKChmcmFtZXNSZWFkeSgpID09IDApICYmICgobVNoYXJlZEJ1ZmZlciAhPSAwKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVN0YXRlID09IFNUT1BQRUQpKSkpIHsKLSAgICAgICAgQUxPR1coIlRyYWNrOjpzZXRTeW5jRXZlbnQoKSBpbiBpbnZhbGlkIHN0YXRlICVkIG9uIHNlc3Npb24gJWQgJXMgbW9kZSwgZnJhbWVzUmVhZHkgJXp1IiwKKyAgICAgICAgQUxPR1coIiVzKCVkKTogaW4gaW52YWxpZCBzdGF0ZSAlZCBvbiBzZXNzaW9uICVkICVzIG1vZGUsIGZyYW1lc1JlYWR5ICV6dSIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgIG1TdGF0ZSwgbVNlc3Npb25JZCwgKG1TaGFyZWRCdWZmZXIgIT0gMCkgPyAic3RhdGljIiA6ICJzdHJlYW0iLCBmcmFtZXNSZWFkeSgpKTsKICAgICAgICAgZXZlbnQtPmNhbmNlbCgpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMjQ2LDcgKzEzODMsMTcgQEAKIC8vVG8gYmUgY2FsbGVkIHdpdGggdGhyZWFkIGxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6dXBkYXRlVHJhY2tGcmFtZUluZm8oCiAgICAgICAgIGludDY0X3QgdHJhY2tGcmFtZXNSZWxlYXNlZCwgaW50NjRfdCBzaW5rRnJhbWVzV3JpdHRlbiwKLSAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCkgeworICAgICAgICB1aW50MzJfdCBoYWxTYW1wbGVSYXRlLCBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZVN0YW1wKSB7CisgICAvLyBNYWtlIHRoZSBrZXJuZWwgZnJhbWV0aW1lIGF2YWlsYWJsZS4KKyAgICBjb25zdCBGcmFtZVRpbWUgZnR7CisgICAgICAgICAgICB0aW1lU3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgdGltZVN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF19OworICAgIC8vIEFMT0dEKCJGcmFtZVRpbWU6ICVsbGQgJWxsZCIsIChsb25nIGxvbmcpZnQuZnJhbWVzLCAobG9uZyBsb25nKWZ0LnRpbWVOcyk7CisgICAgbUtlcm5lbEZyYW1lVGltZS5zdG9yZShmdCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICAvL3VwZGF0ZSBmcmFtZSBtYXAKICAgICBtRnJhbWVNYXAucHVzaCh0cmFja0ZyYW1lc1JlbGVhc2VkLCBzaW5rRnJhbWVzV3JpdHRlbik7CiAKQEAgLTEyNTUsNiArMTQwMiw3IEBACiAgICAgLy8gT3VyIHRpbWVzdGFtcHMgYXJlIG9ubHkgdXBkYXRlZCB3aGVuIHRoZSB0cmFjayBpcyBvbiB0aGUgVGhyZWFkIGFjdGl2ZSBsaXN0LgogICAgIC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdHJhY2tzIGFyZSBub3QgcmVtb3ZlZCBiZWZvcmUgZnVsbCBkcmFpbi4KICAgICBFeHRlbmRlZFRpbWVzdGFtcCBsb2NhbCA9IHRpbWVTdGFtcDsKKyAgICBib29sIGRyYWluZWQgPSB0cnVlOyAvLyBkZWZhdWx0IGFzc3VtZSBkcmFpbmVkLCBpZiBubyBzZXJ2ZXIgaW5mbyBmb3VuZAogICAgIGJvb2wgY2hlY2tlZCA9IGZhbHNlOwogICAgIGZvciAoaW50IGkgPSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fTUFYIC0gMTsKICAgICAgICAgICAgIGkgPj0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUjsgLS1pKSB7CkBAIC0xMjYzLDIxICsxNDExLDY0IEBACiAgICAgICAgICAgICBsb2NhbC5tUG9zaXRpb25baV0gPSBtRnJhbWVNYXAuZmluZFgobG9jYWwubVBvc2l0aW9uW2ldKTsKICAgICAgICAgICAgIC8vIGNoZWNrIGRyYWluIHN0YXRlIGZyb20gdGhlIGxhdGVzdCBzdGFnZSBpbiB0aGUgcGlwZWxpbmUuCiAgICAgICAgICAgICBpZiAoIWNoZWNrZWQgJiYgaSA8PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLm1Qb3NpdGlvbltpXSA+PSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKTsKKyAgICAgICAgICAgICAgICBkcmFpbmVkID0gbG9jYWwubVBvc2l0aW9uW2ldID49IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCk7CiAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFjaGVja2VkKSB7IC8vIG5vIHNlcnZlciBpbmZvLCBhc3N1bWUgZHJhaW5lZC4KLSAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZCh0cnVlKTsKLSAgICB9CisKKyAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXREcmFpbmVkKGRyYWluZWQpOwogICAgIC8vIFNldCBjb3JyZWN0aW9uIGZvciBmbHVzaGVkIGZyYW1lcyB0aGF0IGFyZSBub3QgYWNjb3VudGVkIGZvciBpbiByZWxlYXNlZC4KICAgICBsb2NhbC5tRmx1c2hlZCA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKTsKICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcChsb2NhbCk7CisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kgaW5mby4KKyAgICBjb25zdCBib29sIHVzZVRyYWNrVGltZXN0YW1wID0gIWRyYWluZWQ7CisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IHVzZVRyYWNrVGltZXN0YW1wCisgICAgICAgICAgICA/IGxvY2FsLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhzYW1wbGVSYXRlKCkpCisgICAgICAgICAgICA6IHRpbWVTdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoaGFsU2FtcGxlUmF0ZSk7CisKKyAgICBtU2VydmVyTGF0ZW5jeUZyb21UcmFjay5zdG9yZSh1c2VUcmFja1RpbWVzdGFtcCk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOworfQorCitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6QXVkaW9WaWJyYXRpb25Db250cm9sbGVyOjptdXRlKAorICAgICAgICAvKm91dCovIGJvb2wgKnJldCkgeworICAgICpyZXQgPSBmYWxzZTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVHJhY2stPm1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAvLyBMb2NrIGZvciB1cGRhdGluZyBtSGFwdGljUGxheWJhY2tFbmFibGVkLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgaWYgKChtVHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICYmIHBsYXliYWNrVGhyZWFkLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgbVRyYWNrLT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgKnJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6QXVkaW9WaWJyYXRpb25Db250cm9sbGVyOjp1bm11dGUoCisgICAgICAgIC8qb3V0Ki8gYm9vbCAqcmV0KSB7CisgICAgKnJldCA9IGZhbHNlOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UcmFjay0+bVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgIC8vIExvY2sgZm9yIHVwZGF0aW5nIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICBpZiAoKG1UcmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgJiYgcGxheWJhY2tUaHJlYWQtPm1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICBtVHJhY2stPnNldEhhcHRpY1BsYXliYWNrRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICpyZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6Ok91dHB1dFRyYWNrIgogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6T3V0cHV0VHJhY2soCiAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCkBAIC0xMjk5LDkgKzE0OTAsOSBAQAogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7CiAgICAgICAgIG1PdXRCdWZmZXIuZnJhbWVDb3VudCA9IDA7CiAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tVHJhY2tzLmFkZCh0aGlzKTsKLSAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrIGNvbnN0cnVjdG9yIG1DYmxrICVwLCBtQnVmZmVyICVwLCAiCisgICAgICAgIEFMT0dWKCIlcygpOiBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgIgogICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSwgbUNoYW5uZWxNYXNrIDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1DYmxrLCBtQnVmZmVyLAogICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1DaGFubmVsTWFzayk7CiAgICAgICAgIC8vIHNpbmNlIGNsaWVudCBhbmQgc2VydmVyIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLAogICAgICAgICAvLyB0aGUgYnVmZmVyIGhhcyB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3Mgb24gYm90aCBzaWRlcwpAQCAtMTMxMSw3ICsxNTAyLDggQEAKICAgICAgICAgbUNsaWVudFByb3h5LT5zZXRTZW5kTGV2ZWwoMC4wKTsKICAgICAgICAgbUNsaWVudFByb3h5LT5zZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJFcnJvciBjcmVhdGluZyBvdXRwdXQgdHJhY2sgb24gdGhyZWFkICVwIiwgcGxheWJhY2tUaHJlYWQpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBFcnJvciBjcmVhdGluZyBvdXRwdXQgdHJhY2sgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgfQogfQogCkBAIC0xMzQyLDcgKzE1MzQsNyBAQAogICAgIG1BY3RpdmUgPSBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6d3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKQorc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6d3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKQogewogICAgIEJ1ZmZlciAqcEluQnVmZmVyOwogICAgIEJ1ZmZlciBpbkJ1ZmZlcjsKQEAgLTEzNzMsOCArMTU2NSw5IEBACiAgICAgICAgICAgICBuc2Vjc190IHN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9idGFpbkJ1ZmZlcigmbU91dEJ1ZmZlciwgd2FpdFRpbWVMZWZ0TXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gTk9UX0VOT1VHSF9EQVRBKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCBubyBtb3JlIG91dHB1dCBidWZmZXJzOyBzdGF0dXMgJWQiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogdGhyZWFkICVkIG5vIG1vcmUgb3V0cHV0IGJ1ZmZlcnM7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCltVGhyZWFkSW9IYW5kbGUsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyRnVsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNDEwLDggKzE2MDMsOSBAQAogICAgICAgICAgICAgICAgIGlmIChwSW5CdWZmZXIgIT0gJmluQnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5CdWZmZXI7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgcmVsZWFzZWQgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogdGhyZWFkICVkIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNDI5LDExICsxNjIzLDE0IEBACiAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5yYXcgPSBwSW5CdWZmZXItPm1CdWZmZXI7CiAgICAgICAgICAgICAgICAgbWVtY3B5KHBJbkJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci5yYXcsIGluQnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUuYWRkKHBJbkJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCBhZGRpbmcgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogdGhyZWFkICVkIGFkZGluZyBvdmVyZmxvdyBidWZmZXIgJXp1IiwgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAvLyBhdWRpbyBkYXRhIGlzIGNvbnN1bWVkIChzdG9yZWQgbG9jYWxseSk7IHNldCBmcmFtZUNvdW50IHRvIDAuCisgICAgICAgICAgICAgICAgaW5CdWZmZXIuZnJhbWVDb3VudCA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgbm8gbW9yZSBvdmVyZmxvdyBidWZmZXJzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiB0aHJlYWQgJWQgbm8gbW9yZSBvdmVyZmxvdyBidWZmZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXR1cm4gZXJyb3IgZm9yIHRoaXMuCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDQ0LDcgKzE2NDEsNyBAQAogICAgICAgICBzdG9wKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIG91dHB1dEJ1ZmZlckZ1bGw7CisgICAgcmV0dXJuIGZyYW1lcyAtIGluQnVmZmVyLmZyYW1lQ291bnQ7ICAvLyBudW1iZXIgb2YgZnJhbWVzIGNvbnN1bWVkLgogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjpjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0CkBAIC0xNDk2LDYgKzE2OTMsMTAgQEAKICAgICB9CiB9CiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpQYXRjaFRyYWNrIgorCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpQYXRjaFRyYWNrKFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLApAQCAtMTUwNCwzMSArMTcwNSwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0KQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3IgcGF0Y2ggdHJhY2sgKi8sCiAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgbnVsbHB0ciAvKiBzaGFyZWRCdWZmZXIgKi8sCi0gICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKLSAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSkpCisgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgQUlEX0FVRElPU0VSVkVSLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgIFBhdGNoVHJhY2tCYXNlKG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICpwbGF5YmFja1RocmVhZCwgdGltZW91dCkKIHsKLSAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7Ci0gICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IG1peEJ1ZmZlck5zIC8gMTAwMDAwMDAwMDsKLSAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IChpbnQpIChtaXhCdWZmZXJOcyAlIDEwMDAwMDAwMDApOwotCi0gICAgQUxPR1YoIlBhdGNoVHJhY2sgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgIEFMT0dWKCIlcyglZCk6IHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6flBhdGNoVHJhY2soKQogeworICAgIEFMT0dWKCIlcyglZCkiLCBfX2Z1bmNfXywgbUlkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6c3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2s6OnN0YXJ0KGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMTU0MiwxMSArMTc0MSwxMSBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6Z2V0TmV4dEJ1ZmZlcigKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hUcmFjazo6Z2V0TmV4dEJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyKCZidWYsICZtUGVlclRpbWVvdXQpOwotICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIlBhdGNoVHJhY2soKSAlcCBnZXROZXh0QnVmZmVyIHN0YXR1cyAlZCIsIHRoaXMsIHN0YXR1cyk7CisgICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiJXMoJWQpOiBnZXROZXh0QnVmZmVyIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtSWQsIHN0YXR1cyk7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmLm1GcmFtZUNvdW50OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CkBAIC0xNTU3LDcgKzE3NTYsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgYnVmLm1SYXcgPSBidWZmZXItPnJhdzsKQEAgLTE1OTIsNyArMTc5MSw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnJlc3RhcnRJZkRpc2FibGVkKCkKIHsKICAgICBpZiAoYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncykgJiBDQkxLX0RJU0FCTEVEKSB7Ci0gICAgICAgIEFMT0dXKCJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIik7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICBzdGFydCgpOwogICAgIH0KIH0KQEAgLTE2MDAsNiArMTc5OSw4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFJlY29yZAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlJlY29yZEhhbmRsZSIKIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OlJlY29yZEhhbmRsZSgKICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiYgcmVjb3JkVHJhY2spCkBAIC0xNjE1LDcgKzE4MTYsNyBAQAogCiBiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LAogICAgICAgICBpbnQgLyphdWRpb19zZXNzaW9uX3QqLyB0cmlnZ2VyU2Vzc2lvbikgewotICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OnN0YXJ0KCkiKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKAogICAgICAgICBtUmVjb3JkVHJhY2stPnN0YXJ0KChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90KWV2ZW50LCAoYXVkaW9fc2Vzc2lvbl90KSB0cmlnZ2VyU2Vzc2lvbikpOwogfQpAQCAtMTYyNiwxOCArMTgyNywzMiBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdG9wX25vbnZpcnR1YWwoKSB7Ci0gICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6c3RvcCgpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgbVJlY29yZFRyYWNrLT5zdG9wKCk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpIHsKLSAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCgKICAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpKTsKIH0KIAorYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgIGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pIHsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKG1SZWNvcmRUcmFjay0+c2V0TWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Q+KGRpcmVjdGlvbikpKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVChtUmVjb3JkVHJhY2stPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpSZWNvcmRUcmFjayIKIAogLy8gUmVjb3JkVHJhY2sgY29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OlJlY29yZFRyYWNrKApAQCAtMTY3MiwxOCArMTg4NywyMCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbVJlY29yZEJ1ZmZlckNvbnZlcnRlciA9IG5ldyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCi0gICAgICAgICAgICB0aHJlYWQtPm1DaGFubmVsTWFzaywgdGhyZWFkLT5tRm9ybWF0LCB0aHJlYWQtPm1TYW1wbGVSYXRlLAotICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2FtcGxlUmF0ZSk7Ci0gICAgLy8gQ2hlY2sgaWYgdGhlIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBjb25zdHJ1Y3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCi0gICAgLy8gSWYgbm90LCBkb24ndCBjb250aW51ZSB3aXRoIGNvbnN0cnVjdGlvbi4KLSAgICAvLwotICAgIC8vIE5PVEU6IEl0IHdvdWxkIGJlIGV4dHJlbWVseSByYXJlIHRoYXQgdGhlIHJlY29yZCB0cmFjayBjYW5ub3QgYmUgY3JlYXRlZAotICAgIC8vIGZvciB0aGUgY3VycmVudCBkZXZpY2UsIGJ1dCBhIHBlbmRpbmcgb3IgZnV0dXJlIGRldmljZSBjaGFuZ2Ugd291bGQgbWFrZQotICAgIC8vIHRoZSByZWNvcmQgdHJhY2sgY29uZmlndXJhdGlvbiB2YWxpZC4KLSAgICBpZiAobVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlJlY29yZFRyYWNrIHVuYWJsZSB0byBjcmVhdGUgcmVjb3JkIGJ1ZmZlciBjb252ZXJ0ZXIiKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmICghaXNEaXJlY3QoKSkgeworICAgICAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyID0gbmV3IFJlY29yZEJ1ZmZlckNvbnZlcnRlcigKKyAgICAgICAgICAgICAgICB0aHJlYWQtPm1DaGFubmVsTWFzaywgdGhyZWFkLT5tRm9ybWF0LCB0aHJlYWQtPm1TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUpOworICAgICAgICAvLyBDaGVjayBpZiB0aGUgUmVjb3JkQnVmZmVyQ29udmVydGVyIGNvbnN0cnVjdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAgLy8gSWYgbm90LCBkb24ndCBjb250aW51ZSB3aXRoIGNvbnN0cnVjdGlvbi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTk9URTogSXQgd291bGQgYmUgZXh0cmVtZWx5IHJhcmUgdGhhdCB0aGUgcmVjb3JkIHRyYWNrIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICAgIC8vIGZvciB0aGUgY3VycmVudCBkZXZpY2UsIGJ1dCBhIHBlbmRpbmcgb3IgZnV0dXJlIGRldmljZSBjaGFuZ2Ugd291bGQgbWFrZQorICAgICAgICAvLyB0aGUgcmVjb3JkIHRyYWNrIGNvbmZpZ3VyYXRpb24gdmFsaWQuCisgICAgICAgIGlmIChtUmVjb3JkQnVmZmVyQ29udmVydGVyLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogUmVjb3JkVHJhY2sgdW5hYmxlIHRvIGNyZWF0ZSByZWNvcmQgYnVmZmVyIGNvbnZlcnRlciIsIF9fZnVuY19fLCBtSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfQogCiAgICAgbVNlcnZlclByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCkBAIC0xNjk0LDEyICsxOTExLDIwIEBACiAgICAgaWYgKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsKTsKICAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBvbmx5IE5vcm1hbCBSZWNvcmQgaGFzIHRpbWVzdGFtcHMgKEZhc3QgUmVjb3JkIGRvZXMgbm90KS4KKyAgICAgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSBjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQobUZvcm1hdCwgZmxhZ3MpOwogICAgIH0KKyNpZmRlZiBURUVfU0lOSworICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkKKyAgICAgICAgICAgICsgIl8iICsgc3RkOjp0b19zdHJpbmcobUlkKQorICAgICAgICAgICAgKyAiX1IiKTsKKyNlbmRpZgogfQogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6On5SZWNvcmRUcmFjaygpCiB7Ci0gICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBtUmVjb3JkQnVmZmVyQ29udmVydGVyOwogICAgIGRlbGV0ZSBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI7CiB9CkBAIC0xNzU2LDE3ICsxOTgxLDM0IEBACiAgICAgLy8gc2VlIGNvbW1lbnRzIGF0IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkZXN0cm95KCkKICAgICBzcDxSZWNvcmRUcmFjaz4ga2VlcCh0aGlzKTsKICAgICB7Ci0gICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBBQ1RJVkUgfHwgbVN0YXRlID09IFJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtUG9ydElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7Ci0gICAgICAgIH0KKyAgICAgICAgdHJhY2tfc3RhdGUgcHJpb3JTdGF0ZSA9IG1TdGF0ZTsKICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopIHRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgIHJlY29yZFRocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7CisgICAgICAgICAgICBwcmlvclN0YXRlID0gbVN0YXRlOworICAgICAgICAgICAgcmVjb3JkVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsgLy8gbW92ZSBtU3RhdGUgdG8gU1RPUFBFRCwgdGVybWluYXRlCisgICAgICAgIH0KKyAgICAgICAgLy8gQVBNIHBvcnRpZC9jbGllbnQgbWFuYWdlbWVudCBkb25lIG91dHNpZGUgb2YgbG9jay4KKyAgICAgICAgLy8gTk9URTogaWYgdGhyZWFkIGRvZXNuJ3QgZXhpc3QsIHRoZSBpbnB1dCBkZXNjcmlwdG9yIHByb2JhYmx5IGRvZXNuJ3QgZWl0aGVyLgorICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocHJpb3JTdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBBQ1RJVkU6ICAgICAvLyBpbnZhbGlkYXRlZCB3aGlsZSBzdGlsbCBhY3RpdmUKKyAgICAgICAgICAgIGNhc2UgU1RBUlRJTkdfMjogLy8gaW52YWxpZGF0ZWQvc3RhcnQtYWJvcnRlZCBhZnRlciBzdGFydElucHV0IHN1Y2Nlc3NmdWxseSBjYWxsZWQKKyAgICAgICAgICAgIGNhc2UgUEFVU0lORzogICAgLy8gaW52YWxpZGF0ZWQgd2hpbGUgaW4gdGhlIG1pZGRsZSBvZiBzdG9wKCkgcGF1c2luZyAoc3RpbGwgYWN0aXZlKQorICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVBvcnRJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1RBUlRJTkdfMTogLy8gaW52YWxpZGF0ZWQvc3RhcnQtYWJvcnRlZCBhbmQgc3RhcnRJbnB1dCBub3Qgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgY2FzZSBQQVVTRUQ6ICAgICAvLyBPSywgbm90IGFjdGl2ZQorICAgICAgICAgICAgY2FzZSBJRExFOiAgICAgICAvLyBPSywgbm90IGFjdGl2ZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUT1BQRUQ6ICAgIC8vIHVuZXhwZWN0ZWQgKGRlc3Ryb3llZCkKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBpbnZhbGlkIHByaW9yIHN0YXRlOiAlZCIsIF9fZnVuY19fLCBtSWQsIHByaW9yU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtUG9ydElkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE3ODMsMzEgKzIwMjUsNTAgQEAKIH0KIAogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICAgU2VydmVyIEZybUNudCBTaWxcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkFjdGl2ZSAgICAgSWQgQ2xpZW50IFNlc3Npb24gUG9ydCBJZCAgUyAgRmxhZ3MgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgRm9ybWF0IENobiBtYXNrICBTUmF0ZSBTb3VyY2UgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgU2VydmVyIEZybUNudCBGcm1SZHkgU2lsJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSA/ICIgICBMYXRlbmN5IiA6ICIiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKIHsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyU1cyAlNnUgJTd1ICUycyAweCUwM1ggIgotICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgotICAgICAgICAgICAgIiUwOFggJTZ6dSAlM2NcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMlNXMgJTZkICU2dSAlN3UgJTd1ICAlMnMgMHglMDNYICIKKyAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICU2WCAiCisgICAgICAgICAgICAiJTA4WCAlNnp1ICU2enUgJTNjIiwKICAgICAgICAgICAgIGlzRmFzdFRyYWNrKCkgPyAnRicgOiAnICcsCiAgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCi0gICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIG1JZCwKKyAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBtUG9ydElkLAogICAgICAgICAgICAgZ2V0VHJhY2tTdGF0ZVN0cmluZygpLAogICAgICAgICAgICAgbUNibGstPm1GbGFncywKIAogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAorICAgICAgICAgICAgbUF0dHIuc291cmNlLAogCiAgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LAorICAgICAgICAgICAgbVNlcnZlclByb3h5LT5mcmFtZXNSZWFkeVNhZmUoKSwKICAgICAgICAgICAgIGlzU2lsZW5jZWQoKSA/ICdzJyA6ICduJwogICAgICAgICAgICAgKTsKKyAgICBpZiAoaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgZG91YmxlIGxhdGVuY3lNczsKKyAgICAgICAgYm9vbCBmcm9tVHJhY2s7CisgICAgICAgIGlmIChnZXRUcmFja0xhdGVuY3lNcygmbGF0ZW5jeU1zLCAmZnJvbVRyYWNrKSA9PSBPSykgeworICAgICAgICAgICAgLy8gU2hvdyBsYXRlbmN5IGluIG1zZWMsIGZvbGxvd2VkIGJ5ICd0JyBpZiBmcm9tIHRyYWNrIHRpbWVzdGFtcCAodGhlIG1vc3QgYWNjdXJhdGUpCisgICAgICAgICAgICAvLyBvciAnaycgaWYgZXN0aW1hdGVkIGZyb20ga2VybmVsICh1c3VhbGx5IGZvciBkZWJ1Z2dpbmcpLgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICU3LjJsZiAlYyIsIGxhdGVuY3lNcywgZnJvbVRyYWNrID8gJ3QnIDogJ2snKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUxMHMiLCBtQ2Jsay0+bVNlcnZlciAhPSAwID8gInVuYXZhaWwiIDogIm5ldyIpOworICAgICAgICB9CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkKQEAgLTE4MzcsNiArMjA5OCwxNiBAQAogICAgICAgICBpbnQ2NF90IHRyYWNrRnJhbWVzUmVsZWFzZWQsIGludDY0X3Qgc291cmNlRnJhbWVzUmVhZCwKICAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVzdGFtcCkKIHsKKyAgIC8vIE1ha2UgdGhlIGtlcm5lbCBmcmFtZXRpbWUgYXZhaWxhYmxlLgorICAgIGNvbnN0IEZyYW1lVGltZSBmdHsKKyAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXX07CisgICAgLy8gQUxPR0QoIkZyYW1lVGltZTogJWxsZCAlbGxkIiwgKGxvbmcgbG9uZylmdC5mcmFtZXMsIChsb25nIGxvbmcpZnQudGltZU5zKTsKKyAgICBtS2VybmVsRnJhbWVUaW1lLnN0b3JlKGZ0KTsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIEV4dGVuZGVkVGltZXN0YW1wIGxvY2FsID0gdGltZXN0YW1wOwogCiAgICAgLy8gQ29udmVydCBIQUwgZnJhbWVzIHRvIHNlcnZlci1zaWRlIHRyYWNrIGZyYW1lcyBhdCB0cmFjayBzYW1wbGUgcmF0ZS4KQEAgLTE4NTAsNiArMjEyMSwxNSBAQAogICAgICAgICB9CiAgICAgfQogICAgIG1TZXJ2ZXJQcm94eS0+c2V0VGltZXN0YW1wKGxvY2FsKTsKKworICAgIC8vIENvbXB1dGUgbGF0ZW5jeSBpbmZvLgorICAgIGNvbnN0IGJvb2wgdXNlVHJhY2tUaW1lc3RhbXAgPSB0cnVlOyAvLyB1c2UgdHJhY2sgdW5sZXNzIGRlYnVnZ2luZy4KKyAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gLSAodXNlVHJhY2tUaW1lc3RhbXAKKyAgICAgICAgICAgID8gbG9jYWwuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHNhbXBsZVJhdGUoKSkKKyAgICAgICAgICAgIDogdGltZXN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhoYWxTYW1wbGVSYXRlKSk7CisKKyAgICBtU2VydmVyTGF0ZW5jeUZyb21UcmFjay5zdG9yZSh1c2VUcmFja1RpbWVzdGFtcCk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKApAQCAtMTg2NCw2ICsyMTQ0LDMxIEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlY29yZFRocmVhZC0+c2V0TWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlY29yZFRocmVhZC0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UGF0Y2hSZWNvcmQiCisKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6UGF0Y2hSZWNvcmQoUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLApAQCAtMTg3MSwzOCArMjE3NiwzNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCkKICAgICA6ICAgUmVjb3JkVHJhY2socmVjb3JkVGhyZWFkLCBOVUxMLAogICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdHt9IC8qIGN1cnJlbnRseSB1bnVzZWQgZm9yIHBhdGNoIHRyYWNrICovLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCi0gICAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgZmFsc2UsIHRydWUpKQorICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBBSURfQVVESU9TRVJWRVIsCisgICAgICAgICAgICAgICAgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICBQYXRjaFRyYWNrQmFzZShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKnJlY29yZFRocmVhZCwgdGltZW91dCkKIHsKLSAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHJlY29yZFRocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFRocmVhZC0+c2FtcGxlUmF0ZSgpOwotICAgIG1QZWVyVGltZW91dC50dl9zZWMgPSBtaXhCdWZmZXJOcyAvIDEwMDAwMDAwMDA7Ci0gICAgbVBlZXJUaW1lb3V0LnR2X25zZWMgPSAoaW50KSAobWl4QnVmZmVyTnMgJSAxMDAwMDAwMDAwKTsKLQotICAgIEFMT0dWKCJQYXRjaFJlY29yZCAlcCBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHNhbXBsZVJhdGUsCisgICAgQUxPR1YoIiVzKCVkKTogc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1QZWVyVGltZW91dC50dl9zZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1QZWVyVGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCkpOwogfQogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6On5QYXRjaFJlY29yZCgpCiB7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpnZXROZXh0QnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyKCZidWYsICZtUGVlclRpbWVvdXQpOwogICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKLSAgICAgICAgICAgICAiUGF0Y2hSZWNvcmQoKSAlcCBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICAgICAgICAgICAiJXMoJWQpOiBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIgc3RhdHVzICVkIiwgX19mdW5jX18sIG1JZCwgc3RhdHVzKTsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CiAgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKQEAgLTE5MTMsNyArMjIxNyw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoUmVjb3JkOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OwpAQCAtMTkzMiw3ICsyMjM2LDkgQEAKICAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKIH0KIAotCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6TW1hcFRyYWNrIgogCiBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6TW1hcFRyYWNrKFRocmVhZEJhc2UgKnRocmVhZCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLApAQCAtMTk0MCwxMyArMjI0NiwxNCBAQAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICBib29sIGlzT3V0LAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIE5VTEwsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCAoc2l6ZV90KTAgLyogZnJhbWVDb3VudCAqLywKICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKLSAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKiBpc091dCAqLywKKyAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCBpc091dCwKICAgICAgICAgICAgICAgICAgIEFMTE9DX05PTkUsCiAgICAgICAgICAgICAgICAgICBUWVBFX0RFRkFVTFQsIHBvcnRJZCksCiAgICAgICAgIG1QaWQocGlkKSwgbVNpbGVuY2VkKGZhbHNlKSwgbVNpbGVuY2VkTm90aWZpZWQoZmFsc2UpCkBAIC0xOTYzLDcgKzIyNzAsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6c3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiBfX3VudXNlZCkKIHsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0xOTk0LDE5ICsyMzAxLDI4IEBACiB7CiB9CiAKLS8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJDbGllbnQgU2Vzc2lvbiAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGVcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNsaWVudCBTZXNzaW9uIFBvcnQgSWQgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgRmxhZ3MgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc091dCgpID8gIlVzZyBDVCI6ICJTb3VyY2UiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlIF9fdW51c2VkKQogewotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2dSAlN3UgJTA4WCAlMDhYICU2dVxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNnUgJTd1ICU3dSAlMDhYICUwOFggJTZ1IDB4JTAzWCAiLAogICAgICAgICAgICAgbVBpZCwKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBtUG9ydElkLAogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlLAorICAgICAgICAgICAgbUF0dHIuZmxhZ3MpOworICAgIGlmIChpc091dCgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUzeCAlMngiLCBtQXR0ci51c2FnZSwgbUF0dHIuY29udGVudF90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNngiLCBtQXR0ci5zb3VyY2UpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCmluZGV4IDM4YzNjMDIuLjZlZjE5YmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCkBAIC05Nyw4ICs5Nyw0MiBAQAogI2RlZmluZSBMT0dfQVVESU9fU1RBVEUoKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCiAgICAgICAgIHgtPmxvZ0V2ZW50SGlzdFRzKE5CTG9nOjpFVkVOVF9BVURJT19TVEFURSwgaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQogCisvLyBMb2cgdGhlIGRpZmZlcmVuY2UgYmV3dGVlbiBmcmFtZXMgcHJlc2VudGVkIGJ5IEhBTCBhbmQgZnJhbWVzIHdyaXR0ZW4gdG8gSEFMIG91dHB1dCBzaW5rLAorLy8gZGl2aWRlZCBieSB0aGUgc2FtcGxlIHJhdGUuIFBhcmFtZXRlciBtcyBpcyBvZiB0eXBlIGRvdWJsZS4KKyNkZWZpbmUgTE9HX0xBVEVOQ1kobXMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9MQVRFTkNZPihtcyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgb3ZlcnJ1biBldmVudCBuYW5vc2Vjb25kIHRpbWVzdGFtcC4gUGFyYW1ldGVyIG5zIGlzIGFuIGludDY0X3QuCisjZGVmaW5lIExPR19PVkVSUlVOKG5zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfT1ZFUlJVTj4obnMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIGluZm8uIFRoaXMgY3VycmVudGx5IGluY2x1ZGVzIHR5cGUsIGZyYW1lQ291bnQsIGFuZCBzYW1wbGVSYXRlLgorLy8gUGFyYW1ldGVyIHR5cGUgaXMgdGhyZWFkX2luZm9fdCBhcyBkZWZpbmVkIGluIE5CTG9nLmguCisjZGVmaW5lIExPR19USFJFQURfSU5GTyhpbmZvKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBcCisgICAgICAgIGlmICh4ICE9IG51bGxwdHIpIHgtPmxvZzxOQkxvZzo6RVZFTlRfVEhSRUFEX0lORk8+KGluZm8pOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIExPR19USFJFQURfUEFSQU1TKHBhcmFtcykgZG8ge05CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBcCisgICAgICAgIGlmICh4ICE9IG51bGxwdHIpIHgtPmxvZzxOQkxvZzo6RVZFTlRfVEhSRUFEX1BBUkFNUz4ocGFyYW1zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCB1bmRlcnJ1biBldmVudCBuYW5vc2Vjb25kIHRpbWVzdGFtcC4gUGFyYW1ldGVyIG5zIGlzIGFuIGludDY0X3QuCisjZGVmaW5lIExPR19VTkRFUlJVTihucykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX1VOREVSUlVOPihucyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgd2FybXVwIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBQYXJhbWV0ZXIgbXMgaXMgb2YgdHlwZSBkb3VibGUuCisjZGVmaW5lIExPR19XQVJNVVBfVElNRShtcykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX1dBUk1VUF9USU1FPihtcyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCBhIHR5cGVkIGVudHJ5IHRoYXQgcmVwcmVzZW50cyBhIHRocmVhZCdzIHdvcmsgdGltZSBpbiBuYW5vc2Vjb25kcy4KKy8vIFBhcmFtZXRlciBucyBzaG91bGQgYmUgb2YgdHlwZSB1aW50MzJfdC4KKyNkZWZpbmUgTE9HX1dPUktfVElNRShucykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX1dPUktfVElNRT4obnMpOyB9IHdoaWxlICgwKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBleHRlcm4gIkMiIHsKKy8vIFRPRE8gY29uc2lkZXIgYWRkaW5nIGEgdGhyZWFkX2xvY2FsIE5CTG9nOjpXcml0ZXIgdGxEdW1teU5CTG9nV3JpdGVyIGFuZCB0aGVuCisvLyBpbml0aWFsaXplIGJlbG93IHRsTkJMb2dXcml0ZXIgdG8gJnRsRHVtbXlOQkxvZ1dyaXRlciB0byByZW1vdmUgdGhlIG5lZWQgdG8KKy8vIGNoZWNrIGZvciBudWxscHRyIGV2ZXJ5IHRpbWUuIEFsc28gcmVkdWNlcyB0aGUgbmVlZCB0byBhZGQgYSBuZXcgbG9nZ2luZyBtYWNybyBhYm92ZQorLy8gZWFjaCB0aW1lIHdlIHdhbnQgdG8gbG9nIGEgbmV3IHR5cGUuCiBleHRlcm4gdGhyZWFkX2xvY2FsIE5CTG9nOjpXcml0ZXIgKnRsTkJMb2dXcml0ZXI7CiB9CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawppbmRleCA0YzkwYmI1Li4zYmFkZGExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKQEAgLTExLDkgKzExLDEwIEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcworCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjdXRpbHMgXApAQCAtMjIsMTEgKzIzLDE1IEBACiAgICAgbGliYmluZGVyIFwKICAgICBsaWJhdWRpb2NsaWVudCBcCiAgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyIFwKICAgICBsaWJtZWRpYV9oZWxwZXIgXAogICAgIGxpYm1lZGlhbWV0cmljcyBcCi0gICAgbGliZWZmZWN0c2NvbmZpZworICAgIGxpYm1lZGlhdXRpbHMgXAorICAgIGxpYmVmZmVjdHNjb25maWcgXAorICAgIGxpYnNlbnNvcnByaXZhY3kKKworTE9DQUxfRVhQT1JUX1NIQVJFRF9MSUJSQVJZX0hFQURFUlMgOj0gXAorICAgIGxpYnNlbnNvcnByaXZhY3kKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCkBAIC00OCw2ICs1Myw3IEBACiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nIFwKKyAgICBsaWJhdWRpb3BvbGljeSBcCiAgICAgbGlic291bmR0cmlnZ2VyCiAKIGlmZXEgKCQoVVNFX0NPTkZJR1VSQUJMRV9BVURJT19QT0xJQ1kpLCAxKQpAQCAtNTYsMTAgKzYyLDYgQEAKICQoZXJyb3IgQ29uZmlndXJhYmxlIHBvbGljeSBkb2VzIG5vdCBzdXBwb3J0IGxlZ2FjeSBjb25mIGZpbGUpCiBlbmRpZiAjaWZuZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCiAKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAotICAgIHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5IFwKLSAgICBhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiBcCi0KIExPQ0FMX0NfSU5DTFVERVMgKz0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZQogTE9DQUxfQ19JTkNMVURFUyArPSBmcmFtZXdvcmtzL2F2L2luY2x1ZGUKIApAQCAtNzIsOSArNzQsMTEgQEAKIGVuZGlmICMgaWZlcSAoJChVU0VfQ09ORklHVVJBQkxFX0FVRElPX1BPTElDWSksIDEpCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwpAQCAtODIsOSArODYsOSBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJtZWRpYV9oZWxwZXIKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFtZXRyaWNzCiAKLWlmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnhtbDIKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliYmluZGVyIGxpYmhpZGxiYXNlIGxpYnhtbDIKIAoraWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKIExPQ0FMX0NGTEFHUyArPSAtRFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKIGVuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQogCkBAIC0xMTAsOCArMTE0LDExIEBACiAgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZQorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMKIAogTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKaW5kZXggNDgxMmIxZi4uYWNiZmM5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC01OCwyNyArNTgsMTUgQEAKICAgICB0eXBlZGVmIGVudW0gewogICAgICAgICBBUElfSU5QVVRfSU5WQUxJRCA9IC0xLAogICAgICAgICBBUElfSU5QVVRfTEVHQUNZICA9IDAsLy8gZS5nLiBhdWRpbyByZWNvcmRpbmcgZnJvbSBhIG1pY3JvcGhvbmUKLSAgICAgICAgQVBJX0lOUFVUX01JWF9DQVBUVVJFLC8vIHVzZWQgZm9yICJyZW1vdGUgc3VibWl4IiwgY2FwdHVyZSBvZiB0aGUgbWVkaWEgdG8gcGxheSBpdCByZW1vdGVseQorICAgICAgICBBUElfSU5QVVRfTUlYX0NBUFRVUkUsLy8gdXNlZCBmb3IgInJlbW90ZSBzdWJtaXgiIGxlZ2FjeSBtb2RlIChubyBEQVApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBvZiB0aGUgbWVkaWEgdG8gcGxheSBpdCByZW1vdGVseQogICAgICAgICBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURSwvLyB1c2VkIGZvciBwbGF0Zm9ybSBhdWRpbyByZXJvdXRpbmcsIHdoZXJlIG1peGVzIGFyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVkIGJ5IGV4dGVybmFsIGFuZCBkeW5hbWljYWxseSBpbnN0YWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9saWNpZXMgd2hpY2ggcmVyb3V0ZSBhdWRpbyBtaXhlcworICAgICAgICBBUElfSU5QVVRfTUlYX1BVQkxJQ19DQVBUVVJFX1BMQVlCQUNLLCAgLy8gdXNlZCBmb3IgcGxheWJhY2sgY2FwdHVyZSB3aXRoIGEgTWVkaWFQcm9qZWN0aW9uCiAgICAgICAgIEFQSV9JTlBVVF9URUxFUEhPTllfUlgsIC8vIHVzZWQgZm9yIGNhcHR1cmUgZnJvbSB0ZWxlcGhvbnkgUlggcGF0aAogICAgIH0gaW5wdXRfdHlwZV90OwogCi0gICAgZW51bSB7Ci0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FID0gMCwKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEwgPSAoMSA8PCAwKSwgICAgICAvLyBDb25jdXJyZW5jeSB3aXRoIGEgY2FsbAotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSA9ICgxIDw8IDEpLCAgIC8vIENvbmN1cnJlbmN5IHdpdGggYW5vdGhlciBjYXB0dXJlCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9IT1RXT1JEID0gKDEgPDwgMiksICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhIGhvdHdvcmQKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX1BSRUVNUFQgPSAoMSA8PCAzKSwgICAvLyBwcmUtZW1wdGVkIHNvbWVvbmUKLSAgICAgICAgICAgICAgICAvLyBOQjogcHJlZW1wdCBpcyBtYXJrZWQgb24gYSBzdWNjZXNzZnVsIHJldHVybiwgb3RoZXJzIGFyZSBvbiBmYWlsaW5nIGNhbGxzCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9MQVNUID0gKDEgPDwgNCksCi0KLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCA9IChBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTEFTVCAtIDEpLAotICAgIH07Ci0KLSAgICB0eXBlZGVmIHVpbnQzMl90IGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdDsKLQogcHVibGljOgogICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5SW50ZXJmYWNlKCkge30KICAgICAvLwpAQCAtODksMTQgKzc3LDE2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgLy8gcmV0cmlldmUgYSBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29uZmlndXJhdGlvbgogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gcGhvbmUgc3RhdGUuIFZhbGlkIHBob25lcyBzdGF0ZXMgYXJlIGRlZmluZWQgYnkgYXVkaW9fbW9kZV90CiAgICAgdmlydHVhbCB2b2lkIHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKSA9IDA7CiAgICAgLy8gZm9yY2UgdXNpbmcgYSBzcGVjaWZpYyBkZXZpY2UgY2F0ZWdvcnkgZm9yIHRoZSBzcGVjaWZpZWQgdXNhZ2UKQEAgLTEyMiwxOSArMTEyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RhcnRzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0b3BzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gcmVsZWFzZXMgdGhlIG91dHB1dC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgLy8gcmVxdWVzdCBhbiBpbnB1dCBhcHByb3ByaWF0ZSBmb3IgcmVjb3JkIGZyb20gdGhlIHN1cHBsaWVkIGRldmljZSB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLApAQCAtMTQ3LDE2ICsxMzIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlX3QgKmlucHV0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCAqY29uY3VycmVuY3kpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0b3BzIGJlaW5nIHVzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIHJlbGVhc2VzIHRoZSBpbnB1dC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICAvLwogICAgIC8vIHZvbHVtZSBjb250cm9sIGZ1bmN0aW9ucwpAQCAtMTgxLDYgKzE2MSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkgPSAwOworCiAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAKQEAgLTIwNiw2ICsxOTksOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpID0gMDsKIAogICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKSA9IDA7CisgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLApAQCAtMjMzLDExICsyMjgsMTUgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCisgICAgICAgICAgICA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubykgPSAwOwpAQCAtMjUxLDcgKzI1MCwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCk7CisgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykgPSAwOworCisgICAgdmlydHVhbCB2b2lkICAgICBzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkgPSAwOwogfTsKIAogCkBAIC0zMjQsMTEgKzMzOCw2IEBACiAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCiAgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKIAotICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZwotICAgIC8vIG92ZXIgYSB0ZWxlcGhvbnkgZGV2aWNlIGR1cmluZyBhIHBob25lIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKSA9IDA7Ci0KICAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKSA9IDA7CiAKQEAgLTM1MywxNSArMzYyLDIwIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpID0gMDsKIAorICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpID0gMDsKKwogICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpID0gMDsKIH07CiAKIGV4dGVybiAiQyIgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTRmZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiYXVkaW9wb2xpY3lfdGVzdHMiCisgICAgfSwKKyAgICB7CisgICAgICAgIm5hbWUiOiAic3lzdGVtYXVkaW9fdGVzdHMiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MjViOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDQgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvUm91dGluZ1N0cmF0ZWd5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODk2N2UuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvUm91dGluZ1N0cmF0ZWd5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgbWVkaWEgc3RvcHBlZCBwbGF5aW5nIGR1cmluZyB3aGljaCB3ZSBjb25zaWRlciB0aGF0IHRoZQotLy8gc29uaWZpY2F0aW9uIHNob3VsZCBiZSBhcyB1bm9idHJ1c2l2ZSBhcyBkdXJpbmcgdGhlIHRpbWUgbWVkaWEgd2FzIHBsYXlpbmcuCi0jZGVmaW5lIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZIDUwMDAKLQotZW51bSByb3V0aW5nX3N0cmF0ZWd5IHsKLSAgICBTVFJBVEVHWV9NRURJQSwKLSAgICBTVFJBVEVHWV9QSE9ORSwKLSAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sCi0gICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsCi0gICAgU1RSQVRFR1lfRFRNRiwKLSAgICBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLAotICAgIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiwKLSAgICBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLAotICAgIFNUUkFURUdZX1JFUk9VVElORywKLSAgICBOVU1fU1RSQVRFR0lFUwotfTsKLQotfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAppbmRleCBmYzAxMmEyLi41NjFmMTAwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMTYsMTAgKzE2LDMwIEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworCisKKy8qKgorICogVm9sdW1lU291cmNlIGlzIHRoZSBkaXNjcmltaW5lbnQgZm9yIHZvbHVtZSBtYW5hZ2VtZW50IG9uIGFuIG91dHB1dC4KKyAqIEl0IHVzZWQgdG8gYmUgdGhlIHN0cmVhbSB0eXBlIGJ5IGxlZ2FjeSwgaXQgbWF5IGJlIGhvc3Qgdm9sdW1lIGdyb3VwIG9yIGEgdm9sdW1lIGN1cnZlcyBpZgorICogd2UgYWxsb3cgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIGN1cnZlIHBlciB2b2x1bWUgZ3JvdXAgKG1hbmRhdG9yeSB0byBnZXQgcmlkIG9mIEF1ZGlvU2VydmVyCisgKiBzdHJlYW0gYWxpYXNlcy4KKyAqLworZW51bSBWb2x1bWVTb3VyY2UgOiBzdGQ6OnVuZGVybHlpbmdfdHlwZTx2b2x1bWVfZ3JvdXBfdD46OnR5cGU7CitzdGF0aWMgY29uc3QgVm9sdW1lU291cmNlIFZPTFVNRV9TT1VSQ0VfTk9ORSA9IHN0YXRpY19jYXN0PFZvbHVtZVNvdXJjZT4oVk9MVU1FX0dST1VQX05PTkUpOworCitzdGF0aWMgaW5saW5lIFZvbHVtZVNvdXJjZSBzdHJlYW1Ub1ZvbHVtZVNvdXJjZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KHN0cmVhbSk7Cit9CisKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCiAvLyBBYnNvbHV0ZSBtaW4gdm9sdW1lIGluIGRCIChjYW4gYmUgcmVwcmVzZW50ZWQgaW4gc2luZ2xlIHByZWNpc2lvbiBub3JtYWwgZmxvYXQgdmFsdWUpCiAjZGVmaW5lIFZPTFVNRV9NSU5fREIgKC03NTgpCiAKQEAgLTEzNCw2ICsxNTQsNyBAQAogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRToKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBOwogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRToKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCmluZGV4IDliZDY4ZTEuLjYwNWZjMWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCkBAIC0xNyw5ICsxNywyMCBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgU3RyZWFtVHlwZVZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OworCitzdGF0aWMgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGRlZmF1bHRBdHRyID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBzdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgZ0R5bmFtaWNGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKIAorc3RhdGljIGNvbnN0IHVpbnQzMl90IFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZID0gNTAwMDsKKwogLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB0aGUgcG9saWN5IHdpbGwgdXNlIG1heCBtaXhlciBzYW1wbGluZyByYXRlcy4KIC8vIERvIG5vdCBsaW1pdCBzYW1wbGluZyByYXRlIG90aGVyd2lzZQogI2RlZmluZSBTQU1QTEVfUkFURV9IWl9NQVggMTkyMDAwCkBAIC0zMiwxNCArNDMsNiBAQAogI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCBGQ0NfOAogCiAvKioKLSAqIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInZpcnR1YWwiIHdoZW4gZXZhbHVhdGluZwotICogYWN0aXZlIGlucHV0cyBpbiBnZXRBY3RpdmVJbnB1dHMoKQotICovCi0jZGVmaW5lIEFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYfFwKLSAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVU3xBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpCi0KLQotLyoqCiAgKiBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIHdoZXJlIG1hdGNoaW5nIGlucHV0cy9vdXRwdXRzIG9uIGRldmljZQogICogdHlwZSBhbG9uZSBpcyBub3QgZW5vdWdoOiB0aGUgYWRkcmVzcyBtdXN0IG1hdGNoIHRvbwogICovCkBAIC02OCwyMyArNzEsNiBAQAogfQogCiAvKioKLSAqIENoZWNrIGlmIHRoZSBpbnB1dCBkZXZpY2UgZ2l2ZW4gaXMgY29uc2lkZXJlZCBhcyBhIHZpcnR1YWwgZGV2aWNlLgotICoKLSAqIEBwYXJhbVtpbl0gZGV2aWNlIHRvIGNvbnNpZGVyCi0gKgotICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgYSB2aXJ0dWFsIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKLSAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKChkZXZpY2UgJiB+QVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCkgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioKICAqIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQogICogd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIKICAqCkBAIC0xMDEsNiArODcsMjEgQEAKIH0KIAogLyoqCisgKiBDaGVjayB3aGV0aGVyIGF1ZGlvIGRldmljZSBoYXMgZW5jb2RpbmcgY2FwYWJpbGl0eS4KKyAqCisgKiBAcGFyYW1baW5dIGRldmljZSB0byBjb25zaWRlcgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBkZXZpY2UgaGFzIGVuY29kaW5nIGNhcGFiaWxpdHksIGZhbHNlIG90aGVyd2lzZS4uCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBkZXZpY2VfaGFzX2VuY29kaW5nX2NhcGFiaWxpdHkoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKICAqIFJldHVybnMgdGhlIHByaW9yaXR5IG9mIGEgZ2l2ZW4gYXVkaW8gc291cmNlIGZvciBjYXB0dXJlLiBUaGUgcHJpb3JpdHkgaXMgdXNlZCB3aGVuIG1vcmUgdGhhbiBvbmUKICAqIGNhcHR1cmUgc2Vzc2lvbiBpcyBhY3RpdmUgb24gYSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8gZGV0ZXJtaW5lIHdoaWNoIHNlc3Npb24gZHJpdmVzIHJvdXRpbmcgYW5kCiAgKiBlZmZlY3QgY29uZmlndXJhdGlvbi4KQEAgLTEwOCw3ICsxMDksMTAgQEAKICAqIEBwYXJhbVtpbl0gaW5wdXRTb3VyY2UgdG8gY29uc2lkZXIuIFZhbGlkIHNvdXJjZXMgYXJlOgogICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTgogICogLSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSCisgKiAtIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRQorICogLSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQKICAqIC0gQVVESU9fU09VUkNFX01JQworICogLSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UKICAqIC0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCiAgKiAtIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTgogICogLSBBVURJT19TT1VSQ0VfSE9UV09SRApAQCAtMTIxLDEwICsxMjUsMTYgQEAKIHsKICAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIDY7CisgICAgICAgIHJldHVybiA5OwogICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKLSAgICAgICAgcmV0dXJuIDU7CisgICAgICAgIHJldHVybiA4OworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFOgorICAgICAgICByZXR1cm4gNzsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDoKKyAgICAgICAgcmV0dXJuIDY7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgorICAgICAgICByZXR1cm4gNTsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRToKICAgICAgICAgcmV0dXJuIDQ7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CiAgICAgICAgIHJldHVybiAzOwpAQCAtMTUyLDMgKzE2MiwyNSBAQAogICAgIH0KICAgICByZXR1cm4gZm9ybWF0MSA9PSBmb3JtYXQyOwogfQorCisvKioKKyAqIEBicmllZiBoYXNTdHJlYW0gY2hlY2tzIGlmIGEgZ2l2ZW4gc3RyZWFtIHR5cGUgaXMgZm91bmQgaW4gdGhlIGxpc3Qgb2Ygc3RyZWFtcworICogQHBhcmFtIHN0cmVhbXMgY29sbGVjdGlvbiBvZiBzdHJlYW0gdHlwZXMgdG8gY29uc2lkZXIuCisgKiBAcGFyYW0gc3RyZWFtVHlwZSB0byBjb25zaWRlcgorICogQHJldHVybiB0cnVlIGlmIHZvaWNlIHN0cmVhbSBpcyBmb3VuZCBpbiB0aGUgZ2l2ZW4gc3RyZWFtcywgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNTdHJlYW0oY29uc3QgYW5kcm9pZDo6U3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIHJldHVybiBzdGQ6OmZpbmQoYmVnaW4oc3RyZWFtcyksIGVuZChzdHJlYW1zKSwgc3RyZWFtVHlwZSkgIT0gZW5kKHN0cmVhbXMpOworfQorCisvKioKKyAqIEBicmllZiBoYXNWb2ljZVN0cmVhbSBjaGVja3MgaWYgYSB2b2ljZSBzdHJlYW0gaXMgZm91bmQgaW4gdGhlIGxpc3Qgb2Ygc3RyZWFtcworICogQHBhcmFtIHN0cmVhbXMgY29sbGVjdGlvbiB0byBjb25zaWRlci4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB2b2ljZSBzdHJlYW0gaXMgZm91bmQgaW4gdGhlIGdpdmVuIHN0cmVhbXMsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzVm9pY2VTdHJlYW0oY29uc3QgYW5kcm9pZDo6U3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcykKK3sKKyAgICByZXR1cm4gaGFzU3RyZWFtKHN0cmVhbXMsIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTAzN2ExCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9HYWluLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1BhdGNoLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qb2xpY3lNaXguY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1BvcnQuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1Byb2ZpbGUuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1JvdXRlLmNwcCIsCisgICAgICAgICJzcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0RldmljZURlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvSHdNb2R1bGUuY3BwIiwKKyAgICAgICAgInNyYy9JT1Byb2ZpbGUuY3BwIiwKKyAgICAgICAgInNyYy9TZXJpYWxpemVyLmNwcCIsCisgICAgICAgICJzcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAiLAorICAgICAgICAic3JjL1R5cGVDb252ZXJ0ZXIuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJtZWRpYSJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmF1ZGlvcG9saWN5Y29tbW9uIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjRjNWNjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIHNyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0F1ZGlvR2Fpbi5jcHAgXAotICAgIHNyYy9Id01vZHVsZS5jcHAgXAotICAgIHNyYy9JT1Byb2ZpbGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Qb3J0LmNwcCBcCi0gICAgc3JjL0F1ZGlvUHJvZmlsZS5jcHAgXAotICAgIHNyYy9BdWRpb1JvdXRlLmNwcCBcCi0gICAgc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBcCi0gICAgc3JjL0F1ZGlvUGF0Y2guY3BwIFwKLSAgICBzcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIFwKLSAgICBzcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9Tb3VuZFRyaWdnZXJTZXNzaW9uLmNwcCBcCi0gICAgc3JjL1Nlc3Npb25Sb3V0ZS5jcHAgXAotICAgIHNyYy9BdWRpb1NvdXJjZURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvVm9sdW1lQ3VydmUuY3BwIFwKLSAgICBzcmMvVHlwZUNvbnZlcnRlci5jcHAgXAotICAgIHNyYy9BdWRpb1Nlc3Npb24uY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibWVkaWEgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotCi1MT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJtZWRpYQotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzIFwKLSAgICBzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSBcCi0KLWlmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBzcmMvU2VyaWFsaXplci5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJ4bWwyCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGV4dGVybmFsL2xpYnhtbDIvaW5jbHVkZSBcCi0KLWVsc2UKLQotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICBzcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBcCi0gICAgc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvR2FpbnMuY3BwCi0KLWVuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCmluZGV4IGY4NmU3NWEuLmE5NDhlYTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaApAQCAtMzgsNyArMzgsNyBAQAogY2xhc3MgQXVkaW9Sb3V0ZVZlY3RvciA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9Sb3V0ZT4gPgogewogcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaAppbmRleCA0YWM1MDhmLi40YWY5M2UxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCkBAIC0xOCw3ICsxOCw5IEBACiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01MywxNyArNTUsNDEgQEAKICAgICBpbnQgZ2V0TWF4UmFtcEluTXMoKSBjb25zdCB7IHJldHVybiBtR2Fpbi5tYXhfcmFtcF9tczsgfQogCiAgICAgLy8gVE9ETzogcmVtb3ZlIGR1bXAgZnJvbSBoZXJlIChzcGxpdCBzZXJpYWxpemF0aW9uKQotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAogICAgIHZvaWQgZ2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CiAgICAgc3RhdHVzX3QgY2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOwogCisgICAgdm9pZCBzZXRVc2VGb3JWb2x1bWUoYm9vbCBjYW5Vc2VGb3JWb2x1bWUpIHsgbVVzZUZvclZvbHVtZSA9IGNhblVzZUZvclZvbHVtZTsgfQorICAgIGJvb2wgY2FuVXNlRm9yVm9sdW1lKCkgY29uc3QgeyByZXR1cm4gbVVzZUZvclZvbHVtZTsgfQorCiAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW4gJmdldEdhaW4oKSBjb25zdCB7IHJldHVybiBtR2FpbjsgfQogCiBwcml2YXRlOgogICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKICAgICBzdHJ1Y3QgYXVkaW9fZ2FpbiBtR2FpbjsKICAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKKyAgICBib29sICAgICAgICAgICAgICBtVXNlRm9yVm9sdW1lID0gZmFsc2U7Cit9OworCitjbGFzcyBBdWRpb0dhaW5zIDogcHVibGljIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvR2Fpbj4gPgoreworcHVibGljOgorICAgIGJvb2wgY2FuVXNlRm9yVm9sdW1lKCkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmZ2FpbjogKnRoaXMpIHsKKyAgICAgICAgICAgIGlmIChnYWluLT5jYW5Vc2VGb3JWb2x1bWUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGFkZChjb25zdCBzcDxBdWRpb0dhaW4+IGdhaW4pCisgICAgeworICAgICAgICBwdXNoX2JhY2soZ2Fpbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyOTYzMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEludGVyZmFjZSBmb3IgSS9PIGRlc2NyaXB0b3JzIHRvIGltcGxlbWVudCBzbyBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBjb250ZXh0CisgKiBjYW4gYmUgcXVlcmllZCBhbmQgdXBkYXRlZC4KKyAqLworY2xhc3MgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSgpIHt9OworCisgICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgSW9EZXNjcmlwdG9yLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kUHJlZmVycmVkRGV2aWNlKAorICAgICAgICBJb0Rlc2NyaXB0b3ImIGRlc2MsIEZpbHRlciBmaWx0ZXIsIGJvb2wmIGFjdGl2ZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKQoreworICAgIGF1dG8gYWN0aXZlQ2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8pOworICAgIGF1dG8gYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZSA9CisgICAgICAgIGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8sIGZpbHRlciwgdHJ1ZSAvKnByZWZlcnJlZERldmljZSovKTsKKyAgICBhY3RpdmUgPSBhY3RpdmVDbGllbnRzLnNpemUoKSA+IDA7CisgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmVDbGllbnRzLnNpemUoKSA9PSBhY3RpdmVDbGllbnRzV2l0aFJvdXRlLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZVswXS0+cHJlZmVycmVkRGV2aWNlSWQoKSk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSW9Db2xsZWN0aW9uLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kUHJlZmVycmVkRGV2aWNlKAorICAgICAgICBJb0NvbGxlY3Rpb24mIGlvQ29sbGVjdGlvbiwgRmlsdGVyIGZpbHRlciwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKQoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlvQ29sbGVjdGlvbi5zaXplKCk7IGkrKykgeworICAgICAgICBhdXRvIGRlc2MgPSBpb0NvbGxlY3Rpb24udmFsdWVBdChpKTsKKyAgICAgICAgYm9vbCBhY3RpdmU7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGN1ckRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2UoZGVzYywgZmlsdGVyLCBhY3RpdmUsIGRldmljZXMpOworICAgICAgICBpZiAoYWN0aXZlICYmIGN1ckRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJEZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZGV2aWNlID0gY3VyRGV2aWNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKaW5kZXggYjI1ZDZkNC4uZTA3MWZlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKQEAgLTE2LDM2ICsxNiw0NSBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbi5oIgotI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSAiQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkVmZmVjdERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJT1Byb2ZpbGU7Ci1jbGFzcyBBdWRpb01peDsKK2NsYXNzIEF1ZGlvUG9saWN5TWl4OworY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2U7CiAKIC8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIGlucHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gaW5wdXQKIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIGlucHV0LgotY2xhc3MgQXVkaW9JbnB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcsIHB1YmxpYyBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIKK2NsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKKyAgICAsIHB1YmxpYyBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+CiB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7CiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwotICAgIHVpbnQzMl90IGdldE9wZW5SZWZDb3VudCgpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VUeXBlKCkgY29uc3QgeyByZXR1cm4gKG1EZXZpY2UgIT0gbnVsbHB0cikgPworICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLT50eXBlKCkgOiBBVURJT19ERVZJQ0VfTk9ORTsgfQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2U7IH0KKyAgICB2b2lkIHNldERldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSB7IG1EZXZpY2UgPSBkZXZpY2U7IH0KKyAgICBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0ICB7CisgICAgICAgIHJldHVybiBtUHJvZmlsZSAhPSBudWxscHRyID8gbVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSA6ICBEZXZpY2VWZWN0b3IoKTsgfQogCi0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgICAgICAgbUlvSGFuZGxlOyAgICAgICAvLyBpbnB1dCBoYW5kbGUKLSAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICBtRGV2aWNlOyAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgaW5wdXQgaXMgcm91dGVkIHRvCi0gICAgQXVkaW9NaXggICAgICAgICAgICAgICAgICAgICAgKm1Qb2xpY3lNaXg7ICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQotICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gICAgICAgICAgIG1Qcm9maWxlOyAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOyAvLyBpbnB1dCBoYW5kbGUKKyAgICB3cDxBdWRpb1BvbGljeU1peD4gIG1Qb2xpY3lNaXg7ICAgICAgICAgICAgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CisgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgICAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KIAogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CkBAIC01NSw0MyArNjQsNTAgQEAKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBnZXRQcmVlbXB0ZWRTZXNzaW9ucygpIGNvbnN0OwogICAgIGJvb2wgaGFzUHJlZW1wdGVkU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgY29uc3Q7CiAgICAgdm9pZCBjbGVhclByZWVtcHRlZFNlc3Npb25zKCk7Ci0gICAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdCB7IHJldHVybiBtR2xvYmFsQWN0aXZlQ291bnQgPiAwOyB9CiAgICAgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdDsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UoKSBjb25zdDsKICAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgYWRkQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pOwotICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3A8QXVkaW9TZXNzaW9uPiBnZXRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0OwotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gZ2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotICAgIHNpemVfdCBnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotICAgIGF1ZGlvX3NvdXJjZV90IGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotCi0gICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCi0gICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0OwotICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdDsKLQotICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0SGlnaGVzdFByaW9yaXR5QXR0cmlidXRlcygpIGNvbnN0OworICAgIHZvaWQgc2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKTsKKyAgICBpbnQzMl90IGFjdGl2ZUNvdW50KCkgeyByZXR1cm4gbUdsb2JhbEFjdGl2ZUNvdW50OyB9CisgICAgdm9pZCB0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwgYm9vbCBlbmFibGVkKTsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0OworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCBvdmVycmlkZTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQpOwogICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQuCi0gICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoMSkKKyAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgdHJ1ZSkKICAgICBzdGF0dXNfdCBzdGFydCgpOwogICAgIC8vIENhbGxlZCBhZnRlciBhIHN0cmVhbSBpcyBzdG9wcGVkCi0gICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoLTEpCisgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKQogICAgIHZvaWQgc3RvcCgpOwogICAgIHZvaWQgY2xvc2UoKTsKIAotcHJpdmF0ZToKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICBtUGF0Y2hIYW5kbGU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgbUlkOwotICAgIC8vIGF1ZGlvIHNlc3Npb25zIGF0dGFjaGVkIHRvIHRoaXMgaW5wdXQKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uICAgICAgICBtU2Vzc2lvbnM7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGdldENsaWVudHNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxULCBib29sIHByZWZlcnJlZERldmljZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisKKyAgICB2b2lkIHNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOworCisgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPgorICAgIHZvaWQgYWRkQ2xpZW50KGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ICZjbGllbnQpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKworICAgIHZvaWQgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihpbnQgZXZlbnQsIGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpOworCisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGV2aWNlID0gbnVsbHB0cjsgLyoqPCBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0byAqLworCiAgICAgLy8gQmVjYXVzZSBhIHByZWVtcHRpYmxlIGNhcHR1cmUgc2Vzc2lvbiBjYW4gcHJlZW1wdCBhbm90aGVyIG9uZSwgd2UgZW5kIHVwIGluIGFuIGVuZGxlc3MgbG9vcAogICAgIC8vIHNpdHVhdGlvbiB3ZXJlIGVhY2ggc2Vzc2lvbiBpcyBhbGxvd2VkIHRvIHJlc3RhcnQgYWZ0ZXIgYmVpbmcgcHJlZW1wdGVkLAogICAgIC8vIHRodXMgcHJlZW1wdGluZyB0aGUgb3RoZXIgb25lIHdoaWNoIHJlc3RhcnRzIGFuZCBzbyBvbi4KQEAgLTk5LDcgKzExNSw5IEBACiAgICAgLy8gYSBwYXJ0aWN1bGFyIGlucHV0IHN0YXJ0ZWQgYW5kIHByZXZlbnQgcHJlZW1wdGlvbiBvZiB0aGlzIGFjdGl2ZSBpbnB1dCBieSB0aGlzIHNlc3Npb24uCiAgICAgLy8gV2UgYWxzbyBpbmhlcml0IHNlc3Npb25zIGZyb20gdGhlIHByZWVtcHRlZCBpbnB1dCB0byBhdm9pZCBhIDMgd2F5IHByZWVtcHRpb24gbG9vcCBldGMuLi4KICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBtUHJlZW1wdGVkU2Vzc2lvbnM7Ci0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOworICAgIGludDMyX3QgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMDsgIC8vIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZpdHkgcmVmIGNvdW50CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVuYWJsZWRFZmZlY3RzOwogfTsKIAogY2xhc3MgQXVkaW9JbnB1dENvbGxlY3Rpb24gOgpAQCAtMTExLDE5ICsxMjksMzEgQEAKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAKICAgICAvLyBjb3VudCBhY3RpdmUgY2FwdHVyZSBzZXNzaW9ucyB1c2luZyBvbmUgb2YgdGhlIHNwZWNpZmllZCBkZXZpY2VzLgotICAgIC8vIGlnbm9yZSBkZXZpY2VzIGlmIEFVRElPX0RFVklDRV9JTl9ERUZBVUxUIGlzIHBhc3NlZAotICAgIHVpbnQzMl90IGFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX0lOX0RFRkFVTFQpIGNvbnN0OworICAgIC8vIGlnbm9yZSBkZXZpY2VzIGlmIGVtcHR5IHZlY3RvciBpcyBwYXNzZWQKKyAgICB1aW50MzJfdCBhY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogcmV0dXJuIGlvIGhhbmRsZSBvZiBhY3RpdmUgaW5wdXQgb3IgMCBpZiBubyBpbnB1dCBpcyBhY3RpdmUKICAgICAgKiBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgogICAgICAqIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KICAgICAgKi8KLSAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGdldEFjdGl2ZUlucHV0cyhib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMgPSB0cnVlKTsKKyAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGdldEFjdGl2ZUlucHV0cygpOwogCi0gICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAvKioKKyAgICAqIEBicmllZiBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2U6IHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBhbmQgaWYgdGhpcyBkZXZpY2UgaGFzCisgICAgKiBiZWVuIGNob3NlbiBhcyB0aGUgcHJlZmVycmVkIGRldmljZSBieSBhbnkgY2xpZW50LCB0aGUgcG9saWN5IG1hbmFnZXIgc2hhbGwKKyAgICAqIHByZXZlbnQgZnJvbSB1c2luZyB0aGlzIGRldmljZSBhbnkgbW9yZSBieSBjbGVhcmluZyBhbGwgdGhlIHNlc3Npb24gcm91dGVzIGludm9sdmluZyB0aGlzCisgICAgKiBkZXZpY2UuCisgICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIHByZWZlcnJlZCBkZXZpY2UgcG9ydCBpZCBvZiB0aGVzZSBjbGllbnRzIHdpbGwgYmUgcmVzZXR0ZWQgdG8gTk9ORS4KKyAgICAqIEBwYXJhbSBkaXNjb25uZWN0ZWREZXZpY2UgZGV2aWNlIHRvIGJlIGRpc2Nvbm5lY3RlZAorICAgICovCisgICAgdm9pZCBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSk7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCmluZGV4IDVlNWQzOGIuLmNkNTQwODUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKQEAgLTE2LDU1ICsxNiwyMzQgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSAiQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBJT1Byb2ZpbGU7Ci1jbGFzcyBBdWRpb01peDsKK2NsYXNzIEF1ZGlvUG9saWN5TWl4OwogY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2U7Ci1jbGFzcyBEZXZpY2VEZXNjcmlwdG9yOworCitjbGFzcyBBY3Rpdml0eVRyYWNraW5nCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QWN0aXZpdHlUcmFja2luZygpID0gZGVmYXVsdDsKKyAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtQWN0aXZpdHlDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpblBhc3RNcyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN5c1RpbWUgPT0gMCkgeworICAgICAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnMybXMoc3lzVGltZSAtIG1TdG9wVGltZSkgPCBpblBhc3RNcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2b2lkIGNoYW5nZUFjdGl2aXR5Q291bnQoaW50IGRlbHRhKQorICAgIHsKKyAgICAgICAgaWYgKChkZWx0YSArIChpbnQpbUFjdGl2aXR5Q291bnQpIDwgMCkgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXM6IGludmFsaWQgZGVsdGEgJWQsIHJlZkNvdW50ICVkIiwgX19mdW5jX18sIGRlbHRhLCBtQWN0aXZpdHlDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgbUFjdGl2aXR5Q291bnQgKz0gZGVsdGE7CisgICAgICAgIGlmICghbUFjdGl2aXR5Q291bnQpIHsKKyAgICAgICAgICAgIHNldFN0b3BUaW1lKHN5c3RlbVRpbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWN0aXZpdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3Rpdml0eUNvdW50OyB9CisgICAgbnNlY3NfdCBnZXRTdG9wVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1TdG9wVGltZTsgfQorICAgIHZvaWQgc2V0U3RvcFRpbWUobnNlY3NfdCBzdG9wVGltZSkgeyBtU3RvcFRpbWUgPSBzdG9wVGltZTsgfQorCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAorICAgIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQWN0aXZpdHlDb3VudDogJWQsIFN0b3BUaW1lOiAlIiBQUklkNjQgIiwgIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlDb3VudCgpLCBnZXRTdG9wVGltZSgpKTsKKyAgICB9Citwcml2YXRlOgorICAgIHVpbnQzMl90IG1BY3Rpdml0eUNvdW50ID0gMDsKKyAgICBuc2Vjc190IG1TdG9wVGltZSA9IDA7Cit9OworCisvKioKKyAqIEBicmllZiBWb2x1bWVBY3Rpdml0eTogaXQgdHJhY2tzIHRoZSBhY3Rpdml0eSBmb3Igdm9sdW1lIHBvbGljeSAodm9sdW1lIGluZGV4LCBtdXRlLAorICogbWVtb3JpemUgcHJldmlvdXMgc3RvcCwgYW5kIHN0b3JlIG11dGUgaWYgaW5jb21wYXRpYmxlIGRldmljZSB3aXRoIGFub3RoZXIgc3RyYXRlZ3kuCisgKi8KK2NsYXNzIFZvbHVtZUFjdGl2aXR5IDogcHVibGljIEFjdGl2aXR5VHJhY2tpbmcKK3sKK3B1YmxpYzoKKyAgICBib29sIGlzTXV0ZWQoKSBjb25zdCB7IHJldHVybiBtTXV0ZUNvdW50ID4gMDsgfQorICAgIGludCBnZXRNdXRlQ291bnQoKSBjb25zdCB7IHJldHVybiBtTXV0ZUNvdW50OyB9CisgICAgaW50IGluY011dGVDb3VudCgpIHsgcmV0dXJuICsrbU11dGVDb3VudDsgfQorICAgIGludCBkZWNNdXRlQ291bnQoKSB7IHJldHVybiBtTXV0ZUNvdW50ID4gMCA/IC0tbU11dGVDb3VudCA6IC0xOyB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdCBvdmVycmlkZQorICAgIHsKKyAgICAgICAgQWN0aXZpdHlUcmFja2luZzo6ZHVtcChkc3QsIHNwYWNlcyk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIsIFZvbHVtZTogJS4wM2YsIE11dGVDb3VudDogJTAyZFxuIiwgbUN1clZvbHVtZURiLCBtTXV0ZUNvdW50KTsKKyAgICB9CisgICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIpIHsgbUN1clZvbHVtZURiID0gdm9sdW1lRGI7IH0KKyAgICBmbG9hdCBnZXRWb2x1bWUoKSBjb25zdCB7IHJldHVybiBtQ3VyVm9sdW1lRGI7IH0KKworcHJpdmF0ZToKKyAgICBpbnQgbU11dGVDb3VudCA9IDA7IC8qKjwgbXV0ZSByZXF1ZXN0IGNvdW50ZXIgKi8KKyAgICBmbG9hdCBtQ3VyVm9sdW1lRGIgPSBOQU47IC8qKjwgY3VycmVudCB2b2x1bWUgaW4gZEIuICovCit9OworLyoqCisgKiBOb3RlOiB2b2x1bWUgYWN0aXZpdGllcyBzaGFsbCBiZSBpbmRleGVkIGJ5IEN1cnZlc0lkIGlmIHdlIHdhbnQgdG8gYWxsb3cgbXVsdGlwbGUKKyAqIGN1cnZlcyBwZXIgdm9sdW1lIHNvdXJjZSwgaW5mZXJyaW5nIGEgbXV0ZSBtYW5hZ2VtZW50IG9yIHZvbHVtZSBiYWxhbmNpbmcgYmV0d2VlbiBIVyBhbmQgU1cgaXMKKyAqIGRvbmUKKyAqLwordXNpbmcgVm9sdW1lQWN0aXZpdGllcyA9IHN0ZDo6bWFwPFZvbHVtZVNvdXJjZSwgVm9sdW1lQWN0aXZpdHk+OworCisvKioKKyAqIEBicmllZiBUaGUgQWN0aXZpdHkgY2xhc3M6IGl0IHRyYWNrcyB0aGUgYWN0aXZpdHkgZm9yIHZvbHVtZSBwb2xpY3kgKHZvbHVtZSBpbmRleCwgbXV0ZSwKKyAqIG1lbW9yaXplIHByZXZpb3VzIHN0b3AsIGFuZCBzdG9yZSBtdXRlIGlmIGluY29tcGF0aWJsZSBkZXZpY2Ugd2l0aCBhbm90aGVyIHN0cmF0ZWd5LgorICogSGF2aW5nIHRoaXMgY2xhc3MgcHJldmVudHMgZnJvbSBsb29waW5nIG9uIGFsbCBhdHRyaWJ1dGVzIChsZWdhY3kgc3RyZWFtcykgb2YgdGhlIHN0cmF0ZWd5CisgKi8KK2NsYXNzIFJvdXRpbmdBY3Rpdml0eSA6IHB1YmxpYyBBY3Rpdml0eVRyYWNraW5nCit7CitwdWJsaWM6CisgICAgdm9pZCBzZXRNdXRlZEJ5RGV2aWNlKCBib29sIGlzTXV0ZWQpIHsgbUlzTXV0ZWRCeURldmljZSA9IGlzTXV0ZWQ7IH0KKyAgICBib29sIGlzTXV0ZWRCeURldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc011dGVkQnlEZXZpY2U7IH0KKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgQWN0aXZpdHlUcmFja2luZzo6ZHVtcChkc3QsIHNwYWNlcyk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOworICAgIH0KK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogc3RyYXRlZ2llcyBtdXRlZCBiZWNhdXNlIG9mIGluY29tcGF0aWJsZSBkZXZpY2Ugc2VsZWN0aW9uLgorICAgICAqIFNlZSBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKQorICAgICAqLworICAgIGJvb2wgbUlzTXV0ZWRCeURldmljZSA9IGZhbHNlOworfTsKK3VzaW5nIFJvdXRpbmdBY3Rpdml0aWVzID0gc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBSb3V0aW5nQWN0aXZpdHk+OwogCiAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBvdXRwdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBvdXRwdXQKIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIG91dHB1dCBieSBlYWNoIGF1ZGlvIHN0cmVhbSB0eXBlLgotY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCitjbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcsIHB1YmxpYyBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgICwgcHVibGljIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPgogewogcHVibGljOgogICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5BdWRpb091dHB1dERlc2NyaXB0b3IoKSB7fQogCi0gICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgICAgICAgIGxvZyhjb25zdCBjaGFyKiBpbmRlbnQpOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7Ci0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGRldmljZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlczsgfQorICAgIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMoKSBjb25zdCAgeyByZXR1cm4gbURldmljZXM7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNEdXBsaWNhdGVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koKSB7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBib29sIGlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDEoKSB7IHJldHVybiAwOyB9Ci0gICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDIoKSB7IHJldHVybiAwOyB9Ci0gICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOwogCi0gICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc2V0U3RvcFRpbWUgc2V0IHRoZSBzdG9wIHRpbWUgZHVlIHRvIHRoZSBjbGllbnQgc3RvcHBhZ2Ugb3IgYSByZSByb3V0aW5nIG9mIHRoaXMKKyAgICAgKiBjbGllbnQKKyAgICAgKiBAcGFyYW0gY2xpZW50IHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gc3lzVGltZSB3aGVuIHRoZSBjbGllbnQgc3RvcHBlZC93YXMgcmVyb3V0ZWQKKyAgICAgKi8KKyAgICB2b2lkIHNldFN0b3BUaW1lKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgbnNlY3NfdCBzeXNUaW1lKTsKKworICAgIC8qKgorICAgICAqIENoYW5nZXMgdGhlIGNsaWVudC0+YWN0aXZlKCkgc3RhdGUgYW5kIHRoZSBvdXRwdXQgZGVzY3JpcHRvcidzIGdsb2JhbCBhY3RpdmUgY291bnQsCisgICAgICogYWxvbmcgd2l0aCB0aGUgc3RyZWFtIGFjdGl2ZSBjb3VudCBhbmQgbUFjdGl2ZUNsaWVudHMuCisgICAgICogVGhlIGNsaWVudCBtdXN0IGJlIHByZXZpb3VzbHkgYWRkZWQgYnkgdGhlIGJhc2UgY2xhc3MgYWRkQ2xpZW50KCkuCisgICAgICogSW4gY2FzZSBvZiBkdXBsaWNhdGluZyB0aHJlYWQsIGNsaWVudCBzaGFsbCBiZSBhZGRlZCBvbiB0aGUgZHVwbGljYXRlZCB0aHJlYWQsIG5vdCBvbiB0aGUKKyAgICAgKiBpbnZvbHZlZCBvdXRwdXRzIGJ1dCBzZXRDbGllbnRBY3RpdmUgd2lsbCBiZSBjYWxsZWQgb24gYWxsIG91dHB1dCB0byB0cmFjayBzdHJhdGVneSBhbmQKKyAgICAgKiBhY3RpdmUgY2xpZW50IGZvciBhIGdpdmVuIG91dHB1dC4KKyAgICAgKiBBY3RpdmUgcmVmIGNvdW50IG9mIHRoZSBjbGllbnQgd2lsbCBiZSBpbmNyZW1lbnRlZC9kZWNyZW1lbnRlZCB0aHJvdWdoIHNldEFjdGl2ZSBBUEkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpOworCisgICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcykgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlID0gVk9MVU1FX1NPVVJDRV9OT05FLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLAorICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FueUFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0OworCisgICAgc3RkOjp2ZWN0b3I8Vm9sdW1lU291cmNlPiBnZXRBY3RpdmVWb2x1bWVTb3VyY2VzKCkgY29uc3QgeworICAgICAgICBzdGQ6OnZlY3RvcjxWb2x1bWVTb3VyY2U+IGFjdGl2ZUxpc3Q7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Wb2x1bWVBY3Rpdml0aWVzKSB7CisgICAgICAgICAgICBpZiAoaXRlci5zZWNvbmQuaXNBY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIGFjdGl2ZUxpc3QucHVzaF9iYWNrKGl0ZXIuZmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhY3RpdmVMaXN0OworICAgIH0KKyAgICB1aW50MzJfdCBnZXRBY3Rpdml0eUNvdW50KFZvbHVtZVNvdXJjZSB2cykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllcy5maW5kKHZzKSAhPSBzdGQ6OmVuZChtVm9sdW1lQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5nZXRBY3Rpdml0eUNvdW50KCkgOiAwOworICAgIH0KKyAgICBib29sIGlzTXV0ZWQoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmlzTXV0ZWQoKSA6IGZhbHNlOworICAgIH0KKyAgICBpbnQgZ2V0TXV0ZUNvdW50KFZvbHVtZVNvdXJjZSB2cykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllcy5maW5kKHZzKSAhPSBzdGQ6OmVuZChtVm9sdW1lQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5nZXRNdXRlQ291bnQoKSA6IDA7CisgICAgfQorICAgIGludCBpbmNNdXRlQ291bnQoVm9sdW1lU291cmNlIHZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzW3ZzXS5pbmNNdXRlQ291bnQoKTsKKyAgICB9CisgICAgaW50IGRlY011dGVDb3VudChWb2x1bWVTb3VyY2UgdnMpCisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXNbdnNdLmRlY011dGVDb3VudCgpOworICAgIH0KKyAgICB2b2lkIHNldEN1clZvbHVtZShWb2x1bWVTb3VyY2UgdnMsIGZsb2F0IHZvbHVtZURiKQorICAgIHsKKyAgICAgICAgLy8gRXZlbiBpZiBub3QgYWN0aXZpdHkgZm9yIHRoaXMgc291cmNlIHJlZ2lzdGVyZWQsIG5lZWQgdG8gY3JlYXRlIGFueXdheQorICAgICAgICBtVm9sdW1lQWN0aXZpdGllc1t2c10uc2V0Vm9sdW1lKHZvbHVtZURiKTsKKyAgICB9CisgICAgZmxvYXQgZ2V0Q3VyVm9sdW1lKFZvbHVtZVNvdXJjZSB2cykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllcy5maW5kKHZzKSAhPSBzdGQ6OmVuZChtVm9sdW1lQWN0aXZpdGllcykgPworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuZ2V0Vm9sdW1lKCkgOiBOQU47CisgICAgfQorCisgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgdWludDMyX3QgaW5QYXN0TXMgPSAwLCBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Sb3V0aW5nQWN0aXZpdGllcy5maW5kKHBzKSAhPSBzdGQ6OmVuZChtUm91dGluZ0FjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtUm91dGluZ0FjdGl2aXRpZXMuYXQocHMpLmlzQWN0aXZlKGluUGFzdE1zLCBzeXNUaW1lKSA6IGZhbHNlOworICAgIH0KKyAgICBib29sIGlzU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtUm91dGluZ0FjdGl2aXRpZXMuZmluZChwcykgIT0gc3RkOjplbmQobVJvdXRpbmdBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzLmF0KHBzKS5pc011dGVkQnlEZXZpY2UoKSA6IGZhbHNlOworICAgIH0KKyAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMsIGJvb2wgaXNNdXRlZCkKKyAgICB7CisgICAgICAgIG1Sb3V0aW5nQWN0aXZpdGllc1twc10uc2V0TXV0ZWRCeURldmljZShpc011dGVkKTsKKyAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwpAQCAtNzMsMjIgKzI1Miw1OCBAQAogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwogCi0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGU7IH07Ci0gICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIHsgbVBhdGNoSGFuZGxlID0gaGFuZGxlOyB9OworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCBvdmVycmlkZTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKIAotICAgIHNwPEF1ZGlvUG9ydD4gICAgICAgbVBvcnQ7Ci0gICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwotICAgIHVpbnQzMl90IG1SZWZDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgLy8gbnVtYmVyIG9mIHN0cmVhbXMgb2YgZWFjaCB0eXBlIHVzaW5nIHRoaXMgb3V0cHV0Ci0gICAgbnNlY3NfdCBtU3RvcFRpbWVbQVVESU9fU1RSRUFNX0NOVF07Ci0gICAgZmxvYXQgbUN1clZvbHVtZVtBVURJT19TVFJFQU1fQ05UXTsgICAvLyBjdXJyZW50IHN0cmVhbSB2b2x1bWUgaW4gZEIKLSAgICBpbnQgbU11dGVDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgICAgIC8vIG11dGUgcmVxdWVzdCBjb3VudGVyCi0gICAgYm9vbCBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW05VTV9TVFJBVEVHSUVTXTsgLy8gc3RyYXRlZ2llcyBtdXRlZCBiZWNhdXNlIG9mIGluY29tcGF0aWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBzZWxlY3Rpb24uIFNlZSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkKLSAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbUNsaWVudEludGVyZmFjZTsKKyAgICBUcmFja0NsaWVudFZlY3RvciBjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBQUk9EVUNUX1NUUkFURUdZX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5ID0gZmFsc2UpIGNvbnN0OworCisgICAgLy8gb3ZlcnJpZGUgQ2xpZW50TWFwSGFuZGxlciB0byBhYm9ydCB3aGVuIHJlbW92aW5nIGEgY2xpZW50IHdoZW4gYWN0aXZlLgorICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSBvdmVycmlkZSB7CisgICAgICAgIGF1dG8gY2xpZW50ID0gZ2V0Q2xpZW50KHBvcnRJZCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2xpZW50LmdldCgpID09IG51bGxwdHIsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogbm9uZXhpc3RlbnQgY2xpZW50IHBvcnRJZCAlZCIsIF9fZnVuY19fLCBtSWQsIHBvcnRJZCk7CisgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2hlbiBhIGNsaWVudCBpcyByZW1vdmVkLCB3ZSBjb3VsZCByZW1vdmUgaXRzCisgICAgICAgIC8vIGFzc29jaWF0ZWQgYWN0aXZlIGNvdW50IGJ5IGNhbGxpbmcgY2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoKSwKKyAgICAgICAgLy8gYnV0IHRoYXQgd291bGQgYmUgaGlkaW5nIGEgcHJvYmxlbSwgc28gd2UgbG9nIGZhdGFsIGluc3RlYWQuCisgICAgICAgIGF1dG8gY2xpZW50SXRlciA9IHN0ZDo6ZmluZChiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksIGNsaWVudCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2xpZW50SXRlciAhPSBtQWN0aXZlQ2xpZW50cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpIHJlbW92aW5nIGNsaWVudCBwb3J0SWQgJWQgd2hpY2ggaXMgYWN0aXZlIChjb3VudCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHBvcnRJZCwgY2xpZW50LT5nZXRBY3Rpdml0eUNvdW50KCkpOworICAgICAgICBDbGllbnRNYXBIYW5kbGVyPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj46OnJlbW92ZUNsaWVudChwb3J0SWQpOworICAgIH0KKworICAgIGNvbnN0IFRyYWNrQ2xpZW50VmVjdG9yJiBnZXRBY3RpdmVDbGllbnRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFjdGl2ZUNsaWVudHM7CisgICAgfQorCisgICAgYm9vbCB1c2VId0dhaW4oKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICFkZXZpY2VzKCkuaXNFbXB0eSgpID8gZGV2aWNlcygpLml0ZW1BdCgwKS0+aGFzR2FpbkNvbnRyb2xsZXIoKSA6IGZhbHNlOworICAgIH0KKworICAgIERldmljZVZlY3RvciBtRGV2aWNlczsgLyoqPCBjdXJyZW50IGRldmljZXMgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvICovCisgICAgd3A8QXVkaW9Qb2xpY3lNaXg+IG1Qb2xpY3lNaXg7ICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogCiBwcm90ZWN0ZWQ6Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOworICAgIGNvbnN0IHNwPEF1ZGlvUG9ydD4gbVBvcnQ7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOworICAgIHVpbnQzMl90IG1HbG9iYWxBY3RpdmVDb3VudCA9IDA7ICAvLyBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2ZSBjb3VudAorICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKworICAgIC8vIFRoZSBBY3RpdmVDbGllbnRzIHNob3dzIHRoZSBjbGllbnRzIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgQFZvbHVtZVNvdXJjZSBjb3VudHMKKyAgICAvLyBhbmQgbWF5IGluY2x1ZGUgdXBzdHJlYW0gY2xpZW50cyBmcm9tIGEgZHVwbGljYXRpbmcgdGhyZWFkLgorICAgIC8vIENvbXBhcmUgd2l0aCB0aGUgQ2xpZW50TWFwIChtQ2xpZW50cykgd2hpY2ggYXJlIGV4dGVybmFsIEF1ZGlvVHJhY2sgY2xpZW50cyBvZiB0aGUKKyAgICAvLyBvdXRwdXQgZGVzY3JpcHRvciAoYW5kIGRvIG5vdCBjb3VudCBpbnRlcm5hbCBQYXRjaFRyYWNrcykuCisgICAgVHJhY2tDbGllbnRWZWN0b3IgbUFjdGl2ZUNsaWVudHM7CisKKyAgICBSb3V0aW5nQWN0aXZpdGllcyBtUm91dGluZ0FjdGl2aXRpZXM7IC8qKjwgdHJhY2sgcm91dGluZyBhY3Rpdml0eSBvbiB0aGlzIG91cHV0LiovCisKKyAgICBWb2x1bWVBY3Rpdml0aWVzIG1Wb2x1bWVBY3Rpdml0aWVzOyAvKio8IHRyYWNrIHZvbHVtZSBhY3Rpdml0eSBvbiB0aGlzIG91cHV0LiovCiB9OwogCiAvLyBBdWRpbyBvdXRwdXQgZHJpdmVuIGJ5IGEgc29mdHdhcmUgbWl4ZXIgaW4gYXVkaW8gZmxpbmdlci4KQEAgLTk5LDE5ICszMTQsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Td0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGRldmljZXMoKSBjb25zdDsKKyAgICB2b2lkIHNldERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSB7IG1EZXZpY2VzID0gZGV2aWNlczsgfQorICAgIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBkZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpOwogICAgIHZpcnR1YWwgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiAobU91dHB1dDEgIT0gTlVMTCAmJiBtT3V0cHV0MiAhPSBOVUxMKTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQxKCkgeyByZXR1cm4gbU91dHB1dDE7IH0KLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIG1PdXRwdXQyOyB9Ci0gICAgdmlydHVhbCB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOwotICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDEoKSB7IHJldHVybiBtT3V0cHV0MTsgfQorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQyKCkgeyByZXR1cm4gbU91dHB1dDI7IH0KKyAgICB2b2lkIHNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKSBvdmVycmlkZTsKKyAgICB2b2lkIHNldEFsbENsaWVudHNJbmFjdGl2ZSgpCisgICAgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGNsaWVudHNMaXN0KHRydWUpKSB7CisgICAgICAgICAgICBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpOwpAQCAtMTIwLDQ4ICszNDIsNzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKIAotICAgICAgICAgICAgc3RhdHVzX3Qgb3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpOwotICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUgc3RhcnRlZAotICAgICAgICAgICAgLy8gTm90ZTogY2FsbGVkIGJlZm9yZSBjaGFuZ2VSZWZDb3VudCgxKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgICAgICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZC4KLSAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBjaGFuZ2VSZWZDb3VudCgtMSk7Ci0gICAgICAgICAgICB2b2lkIHN0b3AoKTsKLSAgICAgICAgICAgIHZvaWQgY2xvc2UoKTsKLSAgICAgICAgICAgIHN0YXR1c190IG9wZW5EdXBsaWNhdGluZyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSk7CisgICAgICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCk7CisKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUgc3RhcnRlZAorICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYmVmb3JlIHNldENsaWVudEFjdGl2ZSh0cnVlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQuCisgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBzZXRDbGllbnRBY3RpdmUoZmFsc2UpOworICAgICAgICB2b2lkIHN0b3AoKTsKKyAgICAgICAgdm9pZCBjbG9zZSgpOworICAgICAgICBzdGF0dXNfdCBvcGVuRHVwbGljYXRpbmcoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c0RldmljZQorICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIGJ5IHR5cGUgKGZvciBub24gYnVzIC8gcmVtb3RlIHN1Ym1peCBkZXZpY2VzKSwKKyAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKGJvdGggdHlwZSBhbmQgYWRkcmVzcykgZm9yIGJ1cyAvIHJlbW90ZSBzdWJtaXgKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc3VwcG9ydHNBbGxEZXZpY2VzCisgICAgICogQHBhcmFtIGRldmljZXMgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgd2Vha2x5IHN1cHBvcnRlZCBieSB0eXBlIChlLmcuIGZvciBub24gYnVzIC8gcnN1Ym1peCBkZXZpY2VzKSwKKyAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKGJvdGggdHlwZSBhbmQgYWRkcmVzcykgZm9yIGJ1cyAvIHJlbW90ZSBzdWJtaXgKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyB0YWtlcyBhIHZlY3RvciBvZiBkZXZpY2VzIGFuZCBmaWx0ZXJzIHRoZW0gYWNjb3JkaW5nIHRvIHRoZQorICAgICAqIGRldmljZSBzdXBwb3J0ZWQgYnkgdGhpcyBvdXRwdXQgKHRoZSBwcm9maWxlIGZyb20gd2hpY2ggdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tKQorICAgICAqIEBwYXJhbSBkZXZpY2VzIHJlZmVyZW5jZSBkZXZpY2UgdmVjdG9yIHRvIGJlIGZpbHRlcmVkCisgICAgICogQHJldHVybiB2ZWN0b3Igb2YgZGV2aWNlcyBmaWx0ZXJlZCBmcm9tIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyBvZiB0aGlzIG91dHB1dCAod2Vha2x5IG9yIG5vdAorICAgICAqIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlIHR5cGUpCisgICAgICovCisgICAgRGV2aWNlVmVjdG9yIGZpbHRlclN1cHBvcnRlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKIAogICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1Jb0hhbmRsZTsgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKICAgICB1aW50MzJfdCBtTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvLwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLwotICAgIEF1ZGlvTWl4ICptUG9saWN5TWl4OyAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKICAgICBhdWRpb19zZXNzaW9uX3QgbURpcmVjdENsaWVudFNlc3Npb247IC8vIHNlc3Npb24gaWQgb2YgdGhlIGRpcmVjdCBvdXRwdXQgY2xpZW50Ci0gICAgdWludDMyX3QgbUdsb2JhbFJlZkNvdW50OyAgLy8gbm9uLXN0cmVhbS1zcGVjaWZpYyByZWYgY291bnQKIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYW4gaW5wdXQgZGV2aWNlIGRpcmVjdGx5LgogY2xhc3MgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb091dHB1dERlc2NyaXB0b3IKIHsKIHB1YmxpYzoKLSAgICBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2UsCisgICAgSHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKQEAgLTE3MCw3ICs0MTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwogCi0gICAgY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBtU291cmNlOworICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IG1Tb3VyY2U7CiAKIH07CiAKQEAgLTE3OCwyNSArNDI0LDUyIEBACiAgICAgICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPgogewogcHVibGljOgotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCisgICAgICogcmV0dXJuIHdoZXRoZXIgYW55IHNvdXJjZSBjb250cmlidXRpbmcgdG8gVm9sdW1lU291cmNlIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlCisgICAgICogdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCiAgICAgICogbG9jYWwvcmVtb3RlIHBsYXliYWNrLCB1c2VkIGZvciBpbnN0YW5jZSBieSBub3RpZmljYXRpb24gbWFuYWdlciB0byBub3QgbWFrZQogICAgICAqIG1lZGlhIHBsYXllcnMgbG9zZSBhdWRpbyBmb2N1cyB3aGVuIG5vdCBwbGF5aW5nIGxvY2FsbHkKICAgICAgKiBGb3IgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24sICJyZW1vdGVseSIgbWVhbnMgcGxheWluZyBkdXJpbmcgc2NyZWVuIG1pcnJvcmluZyB3aGljaAogICAgICAqIHVzZXMgYW4gb3V0cHV0IGZvciBwbGF5YmFjayB3aXRoIGEgbm9uLWVtcHR5LCBub24gIjAiIGFkZHJlc3MuCiAgICAgICovCi0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmVSZW1vdGVseShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZywgYnV0IG5vdCBvbiBhICJyZW1vdGUiIGRldmljZS4KKyAgICAgKiByZXR1cm4gd2hldGhlciBhbnkgc291cmNlIGNvbnRyaWJ1dGluZyB0byBWb2x1bWVTb3VyY2UgaXMgcGxheWluZywgYnV0IG5vdCBvbiBhICJyZW1vdGUiCisgICAgICogZGV2aWNlLgogICAgICAqIE92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBhIGxvY2FsL3JlbW90ZSBwbGF5YmFjay4KICAgICAgKiBVc2VkIGZvciBpbnN0YW5jZSBieSBwb2xpY3kgbWFuYWdlciB0byBhbHRlciB0aGUgc3BlYWtlciBwbGF5YmFjayAoInNwZWFrZXIgc2FmZSIgYmVoYXZpb3IpCiAgICAgICogd2hlbiBtZWRpYSBwbGF5cyBvciBub3QgbG9jYWxseS4KICAgICAgKiBGb3IgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24sICJyZW1vdGVseSIgbWVhbnMgcGxheWluZyBkdXJpbmcgc2NyZWVuIG1pcnJvcmluZy4KICAgICAgKi8KLSAgICBib29sIGlzU3RyZWFtQWN0aXZlTG9jYWxseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlTG9jYWxseShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUgY2hlY2tzIGlmIHRoZSBnaXZlbiBzdHJhdGVneSBpcyBhY3RpdmUgKG9yIHdhcyBhY3RpdmUKKyAgICAgKiBpbiB0aGUgcGFzdCkgb24gdGhlIGdpdmVuIG91dHB1dCBhbmQgYWxsIHRoZSBvdXRwdXRzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBIVyBNb2R1bGUKKyAgICAgKiB0aGUgc2FtZSBtb2R1bGUgdGhhbiB0aGUgZ2l2ZW4gb3V0cHV0CisgICAgICogQHBhcmFtIG91dHB1dERlc2MgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBwcyBwcm9kdWN0IHN0cmF0ZWd5IHRvIGJlIGNoZWNrZWQgdXBvbiBhY3Rpdml0eSBzdGF0dXMKKyAgICAgKiBAcGFyYW0gaW5QYXN0TXMgaWYgMCwgY2hlY2sgY3VycmVudGx5LCBvdGhlcndpc2UsIGNoZWNrIGluIHRoZSBwYXN0CisgICAgICogQHBhcmFtIHN5c1RpbWUgc2hhbGwgYmUgc2V0IGlmIHJlcXVlc3QgaXMgZG9uZSBmb3IgdGhlIHBhc3QgYWN0aXZpdHkuCisgICAgICogQHJldHVybiB0cnVlIGlmIGFuIG91dHB1dCBmb2xsb3dpbmcgdGhlIHN0cmF0ZWd5IGlzIGFjdGl2ZSBvbiB0aGUgc2FtZSBtb2R1bGUgdGhhbiBkZXNjLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLCBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2U6IHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBhbmQgaWYgdGhpcyBkZXZpY2UgaGFzCisgICAgICogYmVlbiBjaG9zZW4gYXMgdGhlIHByZWZlcnJlZCBkZXZpY2UgYnkgYW55IGNsaWVudCwgdGhlIHBvbGljeSBtYW5hZ2VyIHNoYWxsCisgICAgICogcHJldmVudCBmcm9tIHVzaW5nIHRoaXMgZGV2aWNlIGFueSBtb3JlIGJ5IGNsZWFyaW5nIGFsbCB0aGUgc2Vzc2lvbiByb3V0ZXMgaW52b2x2aW5nIHRoaXMKKyAgICAgKiBkZXZpY2UuCisgICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBwcmVmZXJyZWQgZGV2aWNlIHBvcnQgaWQgb2YgdGhlc2UgY2xpZW50cyB3aWxsIGJlIHJlc2V0dGVkIHRvIE5PTkUuCisgICAgICogQHBhcmFtIGRpc2Nvbm5lY3RlZERldmljZSBkZXZpY2UgdG8gYmUgZGlzY29ubmVjdGVkCisgICAgICovCisgICAgdm9pZCBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSk7CiAKICAgICAvKioKICAgICAgKiByZXR1cm5zIHRoZSBBMkRQIG91dHB1dCBoYW5kbGUgaWYgaXQgaXMgb3BlbiBvciAwIG90aGVyd2lzZQpAQCAtMjE4LDI3ICs0OTEsNTMgQEAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0UHJpbWFyeU91dHB1dCgpIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBwbGF5aW5nIGFueXRoaW5nIGJlc2lkZXMgdGhlIHN0cmVhbSB0byBpZ25vcmUKKyAgICAgKiBAYnJpZWYgaXNBbnlPdXRwdXRBY3RpdmUgY2hlY2tzIGlmIGFueSBvdXRwdXQgaXMgYWN0aXZlIChha2EgcGxheWluZykgZXhjZXB0IHRoZSBvbmUocykgdGhhdAorICAgICAqIGhvbGQgdGhlIHZvbHVtZSBzb3VyY2UgdG8gYmUgaWdub3JlZAorICAgICAqIEBwYXJhbSB2b2x1bWVTb3VyY2VUb0lnbm9yZSBzb3VyY2Ugbm90IHRvIGJlIGNvbnNpZGVyZWQgaW4gdGhlIGFjdGl2aXR5IGRldGVjdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSBmb3IgYW55IHZvbHVtZSBzb3VyY2UgZXhjZXB0IHRoZSBvbmUgdG8gYmUgaWdub3JlZAogICAgICAqLwotICAgIGJvb2wgaXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgY29uc3Q7CisgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FueUFjdGl2ZSh2b2x1bWVTb3VyY2VUb0lnbm9yZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCiAgICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogY2xhc3MgSHdBdWRpb091dHB1dENvbGxlY3Rpb24gOgogICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+ID4KIHsKIHB1YmxpYzoKLSAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgcGxheWluZyBhbnl0aGluZyBiZXNpZGVzIHRoZSBzdHJlYW0gdG8gaWdub3JlCisgICAgICogQGJyaWVmIGlzQW55T3V0cHV0QWN0aXZlIGNoZWNrcyBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSAoYWthIHBsYXlpbmcpIGV4Y2VwdCB0aGUgb25lKHMpIHRoYXQKKyAgICAgKiBob2xkIHRoZSB2b2x1bWUgc291cmNlIHRvIGJlIGlnbm9yZWQKKyAgICAgKiBAcGFyYW0gdm9sdW1lU291cmNlVG9JZ25vcmUgc291cmNlIG5vdCB0byBiZSBjb25zaWRlcmVkIGluIHRoZSBhY3Rpdml0eSBkZXRlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBhY3RpdmUgZm9yIGFueSB2b2x1bWUgc291cmNlIGV4Y2VwdCB0aGUgb25lIHRvIGJlIGlnbm9yZWQKICAgICAgKi8KLSAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIGNvbnN0OworICAgIGJvb2wgaXNBbnlPdXRwdXRBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZVRvSWdub3JlKSBjb25zdAorICAgIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBbnlBY3RpdmUodm9sdW1lU291cmNlVG9JZ25vcmUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKaW5kZXggYzFjM2YzYy4uMDg0M2ZlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMwLDcgKzMxLDcgQEAKIHB1YmxpYzoKICAgICBBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCk7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOwpAQCAtNDcsNyArNDgsNyBAQAogCiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAppbmRleCA0M2Y2ZWQ2Li4yMjY0ZDhmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaApAQCAtMTYsOCArMTYsMTAgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KLSNpbmNsdWRlIDxWb2x1bWVDdXJ2ZS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CkBAIC0yOCw3ICszMCw2IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNaXguaD4KICNpbmNsdWRlIDxFZmZlY3REZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8U291bmRUcmlnZ2VyU2Vzc2lvbi5oPgotI2luY2x1ZGUgPFNlc3Npb25Sb3V0ZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM4LDIxICszOSwyMCBAQAogICAgIEF1ZGlvUG9saWN5Q29uZmlnKEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAogICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqdm9sdW1lcyA9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2UpCiAgICAgICAgIDogbUh3TW9kdWxlcyhod01vZHVsZXMpLAogICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKGF2YWlsYWJsZU91dHB1dERldmljZXMpLAogICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMoYXZhaWxhYmxlSW5wdXREZXZpY2VzKSwKLSAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZXMoZGVmYXVsdE91dHB1dERldmljZXMpLAotICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXModm9sdW1lcyksCisgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UoZGVmYXVsdE91dHB1dERldmljZSksCiAgICAgICAgICAgbUlzU3BlYWtlckRyY0VuYWJsZWQoZmFsc2UpCiAgICAge30KIAotICAgIHZvaWQgc2V0Vm9sdW1lcyhjb25zdCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICZ2b2x1bWVzKQotICAgIHsKLSAgICAgICAgaWYgKG1Wb2x1bWVDdXJ2ZXMgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgKm1Wb2x1bWVDdXJ2ZXMgPSB2b2x1bWVzOwotICAgICAgICB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFNvdXJjZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2U7CisgICAgfQorCisgICAgdm9pZCBzZXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUpIHsKKyAgICAgICAgbVNvdXJjZSA9IGZpbGU7CiAgICAgfQogCiAgICAgdm9pZCBzZXRId01vZHVsZXMoY29uc3QgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMpCkBAIC0xMDAsNTEgKzEwMCw4MyBAQAogCiAgICAgdm9pZCBzZXREZWZhdWx0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0RGV2aWNlKQogICAgIHsKLSAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzID0gZGVmYXVsdERldmljZTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBkZWZhdWx0RGV2aWNlOwogICAgIH0KIAotICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2VzOyB9CisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGVmYXVsdE91dHB1dERldmljZTsgfQogCiAgICAgdm9pZCBzZXREZWZhdWx0KHZvaWQpCiAgICAgewotICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZXMgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwotICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlOworICAgICAgICBtU291cmNlID0gIkF1ZGlvUG9saWN5Q29uZmlnOjpzZXREZWZhdWx0IjsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKSk7CiAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRJbnB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyk7Ci0gICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZXMpOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IG1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX0lOX01PTk8sIDgwMDApOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShtaWNQcm9maWxlKTsKKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKIAotICAgICAgICBtb2R1bGUgPSBuZXcgSHdNb2R1bGUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpOworICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZLCAyIC8qaGFsVmVyc2lvbk1ham9yKi8pOworICAgICAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZS0+YXR0YWNoKG1vZHVsZSk7CisgICAgICAgIGRlZmF1bHRJbnB1dERldmljZS0+YXR0YWNoKG1vZHVsZSk7CiAKLSAgICAgICAgc3A8T3V0cHV0UHJvZmlsZT4gb3V0UHJvZmlsZTsKLSAgICAgICAgb3V0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7Ci0gICAgICAgIG91dFByb2ZpbGUtPmF0dGFjaChtb2R1bGUpOworICAgICAgICBzcDxPdXRwdXRQcm9maWxlPiBvdXRQcm9maWxlID0gbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKICAgICAgICAgb3V0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKAogICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDQxMDApKTsKLSAgICAgICAgb3V0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1EZWZhdWx0T3V0cHV0RGV2aWNlcyk7CisgICAgICAgIG91dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtRGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIG91dFByb2ZpbGUtPnNldEZsYWdzKEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpOwogICAgICAgICBtb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUob3V0UHJvZmlsZSk7CiAKLSAgICAgICAgc3A8SW5wdXRQcm9maWxlPiBpblByb2ZpbGU7Ci0gICAgICAgIGluUHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKLSAgICAgICAgaW5Qcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKLSAgICAgICAgaW5Qcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoCi0gICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKSk7CisgICAgICAgIHNwPElucHV0UHJvZmlsZT4gaW5Qcm9maWxlID0gbmV3IElucHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOworICAgICAgICBpblByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShtaWNQcm9maWxlKTsKICAgICAgICAgaW5Qcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGVmYXVsdElucHV0RGV2aWNlKTsKICAgICAgICAgbW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUoaW5Qcm9maWxlKTsKIAotICAgICAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOworICAgICAgICBzZXREZWZhdWx0U3Vycm91bmRGb3JtYXRzKCk7CisgICAgfQorCisgICAgLy8gU3Vycm91bmQgZm9ybWF0cywgd2l0aCBhbiBvcHRpb25hbCBsaXN0IG9mIHN1YmZvcm1hdHMgdGhhdCBhcmUgZXF1aXZhbGVudCBmcm9tIHVzZXJzJyBQT1YuCisgICAgdXNpbmcgU3Vycm91bmRGb3JtYXRzID0gc3RkOjp1bm9yZGVyZWRfbWFwPGF1ZGlvX2Zvcm1hdF90LCBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+PjsKKworICAgIGNvbnN0IFN1cnJvdW5kRm9ybWF0cyAmZ2V0U3Vycm91bmRGb3JtYXRzKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtU3Vycm91bmRGb3JtYXRzOworICAgIH0KKworICAgIHZvaWQgc2V0U3Vycm91bmRGb3JtYXRzKGNvbnN0IFN1cnJvdW5kRm9ybWF0cyAmc3Vycm91bmRGb3JtYXRzKQorICAgIHsKKyAgICAgICAgbVN1cnJvdW5kRm9ybWF0cyA9IHN1cnJvdW5kRm9ybWF0czsKKyAgICB9CisKKyAgICB2b2lkIHNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKQorICAgIHsKKyAgICAgICAgbVN1cnJvdW5kRm9ybWF0cyA9IHsKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfQUMzLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0VfQUMzLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RUUywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9EVFNfSEQsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfQUFDX0xDLCB7CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEsIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIsIEFVRElPX0ZPUk1BVF9BQUNfRUxELAorICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1hIRX19LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9ET0xCWV9UUlVFSEQsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRV9BQzNfSk9DLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0FDNCwge319fTsKICAgICB9CiAKIHByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbVNvdXJjZTsKICAgICBId01vZHVsZUNvbGxlY3Rpb24gJm1Id01vZHVsZXM7IC8qKjwgQ29sbGVjdGlvbiBvZiBNb2R1bGUsIHdpdGggUHJvZmlsZXMsIGkuZS4gTWl4IFBvcnRzLiAqLwogICAgIERldmljZVZlY3RvciAmbUF2YWlsYWJsZU91dHB1dERldmljZXM7CiAgICAgRGV2aWNlVmVjdG9yICZtQXZhaWxhYmxlSW5wdXREZXZpY2VzOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZtRGVmYXVsdE91dHB1dERldmljZXM7Ci0gICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqbVZvbHVtZUN1cnZlczsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmbURlZmF1bHRPdXRwdXREZXZpY2U7CiAgICAgLy8gVE9ETzogcmVtb3ZlIHdoZW4gbGVnYWN5IGNvbmYgZmlsZSBpcyByZW1vdmVkLiB0cnVlIG9uIGRldmljZXMgdGhhdCB1c2UgRFJDIG9uIHRoZQogICAgIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSIHBhdGggdG8gYm9vc3Qgc29mdCBzb3VuZHMsIHVzZWQgdG8gYWRqdXN0IHZvbHVtZSBjdXJ2ZXMgYWNjb3JkaW5nbHkuCiAgICAgLy8gTm90ZTogcmVtb3ZlIGFsc28gc3BlYWtlcl9kcmNfZW5hYmxlZCBmcm9tIGdsb2JhbCBjb25maWd1cmF0aW9uIG9mIFhNTCBjb25maWcgZmlsZS4KICAgICBib29sIG1Jc1NwZWFrZXJEcmNFbmFibGVkOworICAgIFN1cnJvdW5kRm9ybWF0cyBtU3Vycm91bmRGb3JtYXRzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaAppbmRleCA4ZmM2ZmU5Li43YTljMjZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaApAQCAtMTYsMzcgKzE2LDM0IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCi1uYW1lc3BhY2UgYW5kcm9pZCB7CisjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgogCi1jbGFzcyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKK25hbWVzcGFjZSBhbmRyb2lkIHsKIAogLyoqCiAgKiBjdXN0b20gbWl4IGVudHJ5IGluIG1Qb2xpY3lNaXhlcwogICovCi1jbGFzcyBBdWRpb1BvbGljeU1peCA6IHB1YmxpYyBSZWZCYXNlIHsKK2NsYXNzIEF1ZGlvUG9saWN5TWl4IDogcHVibGljIEF1ZGlvTWl4LCBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Qb2xpY3lNaXgoKSB7fQorICAgIEF1ZGlvUG9saWN5TWl4KGNvbnN0IEF1ZGlvTWl4ICZtaXgpIDogQXVkaW9NaXgobWl4KSB7fQorICAgIEF1ZGlvUG9saWN5TWl4KGNvbnN0IEF1ZGlvUG9saWN5TWl4JikgPSBkZWxldGU7CisgICAgQXVkaW9Qb2xpY3lNaXgmIG9wZXJhdG9yPShjb25zdCBBdWRpb1BvbGljeU1peCYpID0gZGVsZXRlOwogCi0gICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZnZXRPdXRwdXQoKSBjb25zdDsKKyAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmdldE91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXQ7IH0KKyAgICB2b2lkIHNldE91dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCkgeyBtT3V0cHV0ID0gb3V0cHV0OyB9CisgICAgdm9pZCBjbGVhck91dHB1dCgpIHsgbU91dHB1dC5jbGVhcigpOyB9CiAKLSAgICB2b2lkIHNldE91dHB1dChzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCk7Ci0KLSAgICB2b2lkIGNsZWFyT3V0cHV0KCk7Ci0KLSAgICBhbmRyb2lkOjpBdWRpb01peCAqZ2V0TWl4KCk7Ci0KLSAgICB2b2lkIHNldE1peChBdWRpb01peCAmbWl4KTsKLQotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgQXVkaW9NaXggICAgbU1peDsgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gcG9saWN5IG1peCBkZXNjcmlwdG9yCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQ7ICAvLyBDb3JyZXNwb25kaW5nIG91dHB1dCBzdHJlYW0KIH07CiAKQEAgLTY2LDIxICs2MywzOSBAQAogICAgICAqIFRyeSB0byBmaW5kIGFuIG91dHB1dCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gYXR0cmlidXRlcyB0byBjb25zaWRlciBmb3dyIHRoZSByZXNlYXJjaCBvZiBvdXRwdXQgZGVzY3JpcHRvci4KLSAgICAgKiBAcGFyYW1bb3V0XSBkZXNjIHRvIHJldHVybiBpZiBhbiBvdXRwdXQgY291bGQgYmUgZm91bmQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGFuIG91dHB1dCB3YXMgZm91bmQgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgKGluIHRoaXMgY2FzZSwgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIG91dHB1dCBwYXJhbSBpcyBpbml0aWFsaXplZCksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbVtvdXRdIGRlc2MgdG8gcmV0dXJuIGlmIGFuIHByaW1hcnkgb3V0cHV0IGNvdWxkIGJlIGZvdW5kLgorICAgICAqIEBwYXJhbVtvdXRdIHNlY29uZGFyeURlc2Mgb3RoZXIgZGVzYyB0aGF0IHRoZSBhdWRpbyBzaG91bGQgYmUgcm91dGVkIHRvLgogICAgICAqLwotICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwKLSAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYyk7CisgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJnByaW1hcnlEZXNjLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKTsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKnBvbGljeU1peCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIEF1ZGlvTWl4ICoqcG9saWN5TWl4KTsKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgdHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBtaXggZm9yIGEgZ2l2ZW4gb3V0cHV0IGRlc2NyaXB0b3IgYW5kIHJldHVybnMgdGhlIGFzc29jaWF0ZWQKKyAgICAgKiBvdXRwdXQgZGV2aWNlLgorICAgICAqIEBwYXJhbSBvdXRwdXQgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBhdmFpbGFibGVPdXRwdXREZXZpY2VzIGxpc3Qgb2Ygb3V0cHV0IGRldmljZXMgY3VycmVudGx5IHJlYWNoYWJsZQorICAgICAqIEByZXR1cm4gZGV2aWNlIHNlbGVjdGVkIGZyb20gdGhlIG1peCBhdHRhY2hlZCB0byB0aGUgb3V0cHV0LCBudWxsIHBvaW50ZXIgb3RoZXJ3aXNlCisgICAgICovCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlQW5kTWl4Rm9yT3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHN0YXR1c190IGdldElucHV0TWl4Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciwgc3A8QXVkaW9Qb2xpY3lNaXg+ICpwb2xpY3lNaXgpOworCisgICAgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOworICAgIHN0YXR1c190IGdldERldmljZXNGb3JVaWQodWlkX3QgdWlkLCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZW51bSBjbGFzcyBNaXhNYXRjaFN0YXR1cyB7IE1BVENILCBOT19NQVRDSCwgSU5WQUxJRF9NSVggfTsKKyAgICBNaXhNYXRjaFN0YXR1cyBtaXhNYXRjaChjb25zdCBBdWRpb01peCogbWl4LCBzaXplX3QgbWl4SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCmluZGV4IDA5YTg2ZGQuLjJkMTgyYmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgIkF1ZGlvQ29sbGVjdGlvbnMuaCIKICNpbmNsdWRlICJBdWRpb1Byb2ZpbGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlICJIYW5kbGVHZW5lcmF0b3IuaCIKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0yOSw5ICszMCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEh3TW9kdWxlOwotY2xhc3MgQXVkaW9HYWluOwogY2xhc3MgQXVkaW9Sb3V0ZTsKLXR5cGVkZWYgVmVjdG9yPHNwPEF1ZGlvR2Fpbj4gPiBBdWRpb0dhaW5Db2xsZWN0aW9uOwogCiBjbGFzcyBBdWRpb1BvcnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjxhdWRpb19wb3J0X2hhbmRsZV90PgogewpAQCAtNDksOCArNDgsOCBAQAogCiAgICAgdmlydHVhbCBjb25zdCBTdHJpbmc4IGdldFRhZ05hbWUoKSBjb25zdCA9IDA7CiAKLSAgICB2b2lkIHNldEdhaW5zKGNvbnN0IEF1ZGlvR2FpbkNvbGxlY3Rpb24gJmdhaW5zKSB7IG1HYWlucyA9IGdhaW5zOyB9Ci0gICAgY29uc3QgQXVkaW9HYWluQ29sbGVjdGlvbiAmZ2V0R2FpbnMoKSBjb25zdCB7IHJldHVybiBtR2FpbnM7IH0KKyAgICB2b2lkIHNldEdhaW5zKGNvbnN0IEF1ZGlvR2FpbnMgJmdhaW5zKSB7IG1HYWlucyA9IGdhaW5zOyB9CisgICAgY29uc3QgQXVkaW9HYWlucyAmZ2V0R2FpbnMoKSBjb25zdCB7IHJldHVybiBtR2FpbnM7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBzZXRGbGFncyh1aW50MzJfdCBmbGFncykKICAgICB7CkBAIC02NSw2ICs2NCw3IEBACiAgICAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKICAgICBib29sIGlzQXR0YWNoZWQoKSB7IHJldHVybiBtTW9kdWxlICE9IDA7IH0KIAogICAgIC8vIEF1ZGlvIHBvcnQgSURzIGFyZSBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBBdWRpb0ZsaW5nZXIgdW5pcXVlIElEcwpAQCAtMTE2LDYgKzExNiw3IEBACiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldE1vZHVsZVZlcnNpb25NYWpvcigpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldE1vZHVsZU5hbWUoKSBjb25zdDsKKyAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZTsgfQogCiAgICAgYm9vbCB1c2VJbnB1dENoYW5uZWxNYXNrKCkgY29uc3QKICAgICB7CkBAIC0xMzIsMTYgKzEzMywxNyBAQAogICAgIHZvaWQgYWRkUm91dGUoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSB7IG1Sb3V0ZXMuYWRkKHJvdXRlKTsgfQogICAgIGNvbnN0IEF1ZGlvUm91dGVWZWN0b3IgJmdldFJvdXRlcygpIGNvbnN0IHsgcmV0dXJuIG1Sb3V0ZXM7IH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworCiAgICAgdm9pZCBsb2coY29uc3QgY2hhciogaW5kZW50KSBjb25zdDsKIAotICAgIEF1ZGlvR2FpbkNvbGxlY3Rpb24gbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCi0gICAgc3A8SHdNb2R1bGU+IG1Nb2R1bGU7ICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCisgICAgQXVkaW9HYWlucyBtR2FpbnM7IC8vIGdhaW4gY29udHJvbGxlcnMKIAogcHJpdmF0ZToKICAgICB2b2lkIHBpY2tDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpIGNvbnN0OwogICAgIHZvaWQgcGlja1NhbXBsaW5nUmF0ZSh1aW50MzJfdCAmcmF0ZSxjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVzKSBjb25zdDsKIAorICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQogICAgIFN0cmluZzggIG1OYW1lOwogICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOwogICAgIGF1ZGlvX3BvcnRfcm9sZV90IG1Sb2xlOwpAQCAtMTUzLDIyICsxNTUsMjIgQEAKIGNsYXNzIEF1ZGlvUG9ydENvbmZpZyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBBdWRpb1BvcnRDb25maWcoKTsKLSAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDb25maWcoKSB7fQotCiAgICAgc3RhdHVzX3QgYXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBib29sIGhhc1NhbWVId01vZHVsZUFzKGNvbnN0IHNwPEF1ZGlvUG9ydENvbmZpZz4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAob3RoZXIgIT0gMCkgJiYKKyAgICAgICAgcmV0dXJuIChvdGhlciAhPSAwKSAmJiAob3RoZXItPmdldEF1ZGlvUG9ydCgpICE9IDApICYmIChnZXRBdWRpb1BvcnQoKSAhPSAwKSAmJgogICAgICAgICAgICAgICAgIChvdGhlci0+Z2V0QXVkaW9Qb3J0KCktPmdldE1vZHVsZUhhbmRsZSgpID09IGdldEF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVIYW5kbGUoKSk7CiAgICAgfQotICAgIHVpbnQzMl90IG1TYW1wbGluZ1JhdGU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7Ci0gICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluOworICAgIGJvb2wgaGFzR2FpbkNvbnRyb2xsZXIoYm9vbCBjYW5Vc2VGb3JWb2x1bWUgPSBmYWxzZSkgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBpbnQgbVNhbXBsaW5nUmF0ZSA9IDB1OworICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluID0geyAuaW5kZXggPSAtMSB9OworICAgIHVuaW9uIGF1ZGlvX2lvX2ZsYWdzIG1GbGFncyA9IHsgQVVESU9fSU5QVVRfRkxBR19OT05FIH07CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKaW5kZXggODc0MWM2Ni4uYjU4OGQ1NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaApAQCAtMTYsOTEgKzE2LDg0IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgInBvbGljeS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHR5cGVkZWYgU29ydGVkVmVjdG9yPHVpbnQzMl90PiBTYW1wbGVSYXRlVmVjdG9yOwotdHlwZWRlZiBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IENoYW5uZWxzVmVjdG9yOwogdHlwZWRlZiBWZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IEZvcm1hdFZlY3RvcjsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIG9wZXJhdG9yID09IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpOworYm9vbCBvcGVyYXRvcj09IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpCit7CisgICAgaWYgKGxlZnQuc2l6ZSgpICE9IHJpZ2h0LnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCByaWdodC5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGxlZnRbaW5kZXhdICE9IHJpZ2h0W2luZGV4XSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgb3BlcmF0b3IhPSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KQoreworICAgIHJldHVybiAhKGxlZnQgPT0gcmlnaHQpOworfQorCitjbGFzcyBDaGFubmVsc1ZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+Cit7CitwdWJsaWM6CisgICAgQ2hhbm5lbHNWZWN0b3IoKSA9IGRlZmF1bHQ7CisgICAgQ2hhbm5lbHNWZWN0b3IoY29uc3QgQ2hhbm5lbHNWZWN0b3ImKSA9IGRlZmF1bHQ7CisgICAgQ2hhbm5lbHNWZWN0b3IoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiYgc3YpIDoKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4oc3YpIHt9CisgICAgQ2hhbm5lbHNWZWN0b3ImIG9wZXJhdG9yPShjb25zdCBDaGFubmVsc1ZlY3RvciYpID0gZGVmYXVsdDsKKworICAgIC8vIEFwcGxpZXMgYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbiB0byBhbGwgZWxlbWVudHMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICBDaGFubmVsc1ZlY3RvciBhc0luTWFzaygpIGNvbnN0OworICAgIC8vIEFwcGxpZXMgYXVkaW9fY2hhbm5lbF9tYXNrX2luX3RvX291dCB0byBhbGwgZWxlbWVudHMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICBDaGFubmVsc1ZlY3RvciBhc091dE1hc2soKSBjb25zdDsKK307CiAKIGNsYXNzIEF1ZGlvUHJvZmlsZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgOgotICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCi0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KQotICAgIHsKLSAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2tzKTsKLSAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHNhbXBsaW5nUmF0ZSk7Ci0gICAgfQorICAgIHN0YXRpYyBzcDxBdWRpb1Byb2ZpbGU+IGNyZWF0ZUZ1bGxEeW5hbWljKCk7CiAKKyAgICBBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza3MsIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSk7CiAgICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywKLSAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikgOgotICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCi0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUNoYW5uZWxNYXNrcyhjaGFubmVsTWFza3MpLAotICAgICAgICBtU2FtcGxpbmdSYXRlcyhzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKQotICAgIHt9CisgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pOwogCiAgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQotCi0gICAgdm9pZCBzZXRDaGFubmVscyhjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKQotICAgIHsKLSAgICAgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgewotICAgICAgICAgICAgbUNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrczsKLSAgICAgICAgfQotICAgIH0KICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmZ2V0Q2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2tzOyB9Ci0KLSAgICB2b2lkIHNldFNhbXBsZVJhdGVzKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzKQotICAgIHsKLSAgICAgICAgaWYgKG1Jc0R5bmFtaWNSYXRlKSB7Ci0gICAgICAgICAgICBtU2FtcGxpbmdSYXRlcyA9IHNhbXBsZVJhdGVzOwotICAgICAgICB9Ci0gICAgfQogICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJmdldFNhbXBsZVJhdGVzKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsaW5nUmF0ZXM7IH0KKyAgICB2b2lkIHNldENoYW5uZWxzKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpOworICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXMoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMpOwogCisgICAgdm9pZCBjbGVhcigpOwogICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIGhhc1ZhbGlkRm9ybWF0KCkgJiYgaGFzVmFsaWRSYXRlcygpICYmIGhhc1ZhbGlkQ2hhbm5lbHMoKTsgfQotCi0gICAgdm9pZCBjbGVhcigpCi0gICAgewotICAgICAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc0R5bmFtaWNSYXRlKSB7Ci0gICAgICAgICAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW5saW5lIGJvb2wgc3VwcG9ydHNDaGFubmVscyhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscykgY29uc3QKKyAgICBib29sIHN1cHBvcnRzQ2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbUNoYW5uZWxNYXNrcy5pbmRleE9mKGNoYW5uZWxzKSA+PSAwOwogICAgIH0KLSAgICBpbmxpbmUgYm9vbCBzdXBwb3J0c1JhdGUodWludDMyX3QgcmF0ZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtU2FtcGxpbmdSYXRlcy5pbmRleE9mKHJhdGUpID49IDA7Ci0gICAgfQorICAgIGJvb2wgc3VwcG9ydHNSYXRlKHVpbnQzMl90IHJhdGUpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGluZ1JhdGVzLmluZGV4T2YocmF0ZSkgPj0gMDsgfQogCiAgICAgc3RhdHVzX3QgY2hlY2tFeGFjdCh1aW50MzJfdCByYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKLQogICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICZ1cGRhdGVkQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgcG9ydFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUpIGNvbnN0OwotCiAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0OwogCkBAIC0xMTksNyArMTEyLDcgQEAKIAogICAgIGJvb2wgaXNEeW5hbWljKCkgeyByZXR1cm4gbUlzRHluYW1pY0Zvcm1hdCB8fCBtSXNEeW5hbWljQ2hhbm5lbHMgfHwgbUlzRHluYW1pY1JhdGU7IH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIFN0cmluZzggIG1OYW1lOwpAQCAtMTM2LDIxMyArMTI5LDQ4IEBACiBjbGFzcyBBdWRpb1Byb2ZpbGVWZWN0b3IgOiBwdWJsaWMgVmVjdG9yPHNwPEF1ZGlvUHJvZmlsZT4gPgogewogcHVibGljOgotICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpCi0gICAgewotICAgICAgICBzc2l6ZV90IGluZGV4ID0gVmVjdG9yOjphZGQocHJvZmlsZSk7Ci0gICAgICAgIC8vIHdlIHNvcnQgZnJvbSB3b3JzdCB0byBiZXN0LCBzbyB0aGF0IEFVRElPX0ZPUk1BVF9ERUZBVUxUIGlzIGFsd2F5cyB0aGUgZmlyc3QgZW50cnkuCi0gICAgICAgIC8vIFRPRE86IGNvbXBhcmVGb3JtYXRzIGNvdWxkIGJlIGEgbGFtYmRhIHRvIGNvbnZlcnQgYmV0d2VlbiBwb2ludGVyLXRvLWZvcm1hdCB0byBmb3JtYXQ6Ci0gICAgICAgIC8vIFtdKGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQxLCBjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MikgewotICAgICAgICAvLyAgICAgcmV0dXJuIGNvbXBhcmVGb3JtYXRzKCpmb3JtYXQxLCAqZm9ybWF0Mik7Ci0gICAgICAgIC8vIH0KLSAgICAgICAgc29ydChjb21wYXJlRm9ybWF0cyk7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KKyAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKTsKICAgICAvLyBUaGlzIEFQSSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSBwb2xpY3kgbWFuYWdlciBvbmNlIHJldHJpZXZpbmcgY2FwYWJpbGl0aWVzCiAgICAgLy8gZm9yIGEgcHJvZmlsZSB3aXRoIGR5bmFtaWMgZm9ybWF0LCByYXRlIGFuZCBjaGFubmVscyBhdHRyaWJ1dGVzCi0gICAgc3NpemVfdCBhZGRQcm9maWxlRnJvbUhhbChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlVG9BZGQpCi0gICAgewotICAgICAgICAvLyBDaGVjayB2YWxpZCBwcm9maWxlIHRvIGFkZDoKLSAgICAgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIHNldEZvcm1hdHMoRm9ybWF0VmVjdG9yKGZvcm1hdHMpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgIHNldFNhbXBsZVJhdGVzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0U2FtcGxlUmF0ZXMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICBzZXRDaGFubmVsc0Zvcihwcm9maWxlVG9BZGQtPmdldENoYW5uZWxzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBwcm9maWxlIHRvIGF2b2lkIGR1cGxpY2F0ZXMKLSAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZUluZGV4ID0gMDsgcHJvZmlsZUluZGV4IDwgc2l6ZSgpOyBwcm9maWxlSW5kZXgrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSA9IGl0ZW1BdChwcm9maWxlSW5kZXgpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzVmFsaWQoKSAmJiBwcm9maWxlID09IHByb2ZpbGVUb0FkZCkgewotICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZUluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gc2V0IHRoZSBmb3JtYXQgYXMgZHluYW1pYyB0byBhbGxvdyByZW1vdmFsCi0gICAgICAgIHJldHVybiBhZGQocHJvZmlsZVRvQWRkKTsKLSAgICB9Ci0KLSAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldEZpcnN0VmFsaWRQcm9maWxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNWYWxpZFByb2ZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpICE9IDA7IH0KKyAgICBzc2l6ZV90IGFkZFByb2ZpbGVGcm9tSGFsKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGVUb0FkZCk7CiAKICAgICBzdGF0dXNfdCBjaGVja0V4YWN0UHJvZmlsZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7Ci0KICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVQcm9maWxlKHVpbnQzMl90ICZzYW1wbGluZ1JhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICZjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICZmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCBwb3J0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlKSBjb25zdDsKKyAgICB2b2lkIGNsZWFyUHJvZmlsZXMoKTsKKyAgICAvLyBBc3N1bWluZyB0aGF0IHRoaXMgcHJvZmlsZSB2ZWN0b3IgY29udGFpbnMgaW5wdXQgcHJvZmlsZXMsCisgICAgLy8gZmluZCB0aGUgYmVzdCBtYXRjaGluZyBjb25maWcgZnJvbSAnb3V0cHV0UHJvZmlsZXMnLCBhY2NvcmRpbmcgdG8KKyAgICAvLyB0aGUgZ2l2ZW4gcHJlZmVyZW5jZXMgZm9yIGF1ZGlvIGZvcm1hdHMgYW5kIGNoYW5uZWwgbWFza3MuCisgICAgLy8gTm90ZTogc3RkOjp2ZWN0b3JzIGFyZSB1c2VkIGJlY2F1c2Ugc3BlY2lhbGl6ZWQgY29udGFpbmVycyBmb3IgZm9ybWF0cworICAgIC8vICAgICAgIGFuZCBjaGFubmVscyBjYW4gYmUgc29ydGVkIGFuZCB1c2UgdGhlaXIgb3duIG9yZGVyaW5nLgorICAgIHN0YXR1c190IGZpbmRCZXN0TWF0Y2hpbmdPdXRwdXRDb25maWcoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBvdXRwdXRQcm9maWxlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiYgcHJlZmVycmVkRm9ybWF0cywgLy8gb3JkZXI6IG1vc3QgcHJlZiAtPiBsZWFzdCBwcmVmCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4mIHByZWZlcnJlZE91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgYm9vbCBwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzLAorICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2UgKmJlc3RPdXRwdXRDb25maWcpIGNvbnN0OwogCi0gICAgRm9ybWF0VmVjdG9yIGdldFN1cHBvcnRlZEZvcm1hdHMoKSBjb25zdAotICAgIHsKLSAgICAgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmhhc1ZhbGlkRm9ybWF0KCkpIHsKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRGb3JtYXRzLmFkZChpdGVtQXQoaSktPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwcG9ydGVkRm9ybWF0czsKLSAgICB9CisgICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpIGNvbnN0OworICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICBib29sIGhhc1ZhbGlkUHJvZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0VmFsaWRQcm9maWxlKCkgIT0gMDsgfQogCi0gICAgYm9vbCBoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc0R5bmFtaWMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0R5bmFtaWNGb3JtYXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpICE9IDA7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljQ2hhbm5lbHNGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljUmF0ZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgRm9ybWF0VmVjdG9yIGdldFN1cHBvcnRlZEZvcm1hdHMoKSBjb25zdDsKKyAgICBib29sIGhhc0R5bmFtaWNDaGFubmVsc0ZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY0Zvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpICE9IDA7IH0KKyAgICBib29sIGhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljUmF0ZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwogCiAgICAgLy8gT25lIGF1ZGlvIHByb2ZpbGUgd2lsbCBiZSBhZGRlZCBmb3IgZWFjaCBmb3JtYXQgc3VwcG9ydGVkIGJ5IEF1ZGlvIEhBTAotICAgIHZvaWQgc2V0Rm9ybWF0cyhjb25zdCBGb3JtYXRWZWN0b3IgJmZvcm1hdHMpCi0gICAgewotICAgICAgICAvLyBPbmx5IGFsbG93IHRvIGNoYW5nZSB0aGUgZm9ybWF0IG9mIGR5bmFtaWMgcHJvZmlsZQotICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNGb3JtYXRQcm9maWxlID0gZ2V0UHJvZmlsZUZvcihnRHluYW1pY0Zvcm1hdCk7Ci0gICAgICAgIGlmIChkeW5hbWljRm9ybWF0UHJvZmlsZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdHNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKGR5bmFtaWNGb3JtYXRQcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNSYXRlKGR5bmFtaWNGb3JtYXRQcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpOwotICAgICAgICAgICAgYWRkKHByb2ZpbGUpOwotICAgICAgICB9Ci0gICAgfQorICAgIHZvaWQgc2V0Rm9ybWF0cyhjb25zdCBGb3JtYXRWZWN0b3IgJmZvcm1hdHMpOwogCi0gICAgdm9pZCBjbGVhclByb2ZpbGVzKCkKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBzaXplKCk7IGkgIT0gMDsgKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoLS1pKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0R5bmFtaWNGb3JtYXQoKSAmJiBwcm9maWxlLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9maWxlLT5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKLSAgICB7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFByb2ZpbGVzOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzUHJvZmlsZSAlenU6Iiwgc3BhY2VzICsgNCwgIiIsIGkpOwotICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGZkLCBzcGFjZXMgKyA4KTsKLSAgICAgICAgfQotICAgIH0KKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICB2b2lkIHNldFNhbXBsZVJhdGVzRm9yKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCi0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgewotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcHJvZmlsZSB3aXRoIHNhbWUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXQsIHByb2ZpbGUtPmdldENoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKLSAgICAgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0U2FtcGxlUmF0ZXMoc2FtcGxlUmF0ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNldENoYW5uZWxzRm9yKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5oYXNWYWxpZENoYW5uZWxzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcHJvZmlsZSB3aXRoIHNhbWUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXQsIGNoYW5uZWxNYXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOwotICAgICAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCi0gICAgICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldENoYW5uZWxzKGNoYW5uZWxNYXNrcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0UHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICB2b2lkIHNldFNhbXBsZVJhdGVzRm9yKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworICAgIHZvaWQgc2V0Q2hhbm5lbHNGb3IoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKIAogICAgIHN0YXRpYyBpbnQgY29tcGFyZUZvcm1hdHMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTEsIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUyKTsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaAppbmRleCA2YjI0ZmRlLi4wMzU3ZmY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKQEAgLTQ2LDcgKzQ2LDIwIEBACiAKICAgICBhdWRpb19yb3V0ZV90eXBlX3QgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc3VwcG9ydHNQYXRjaCBjaGVja3MgaWYgYW4gYXVkaW8gcGF0Y2ggaXMgc3VwcG9ydGVkIGJ5IGEgUm91dGUgZGVjbGFyZWQgaW4KKyAgICAgKiB0aGUgYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGZpbGUuCisgICAgICogSWYgdGhlIHBhdGNoIGlzIHN1cHBvcnRlZCBuYXRpdmVseSBieSBhbiBBdWRpb0hBTCAod2hpY2ggc3VwcG9ydHMgb2YgY291cnNlIFJvdXRpbmcgQVBJIDMuMCksCisgICAgICogYXVkaW9wb2xpY3kgd2lsbCBub3QgcmVxdWVzdCBBdWRpb0ZsaW5nZXIgdG8gdXNlIGEgc29mdHdhcmUgYnJpZGdlIHRvIHJlYWxpemUgYSBwYXRjaAorICAgICAqIGJldHdlZW4gMiBwb3J0cy4KKyAgICAgKiBAcGFyYW0gc3JjUG9ydCAoYWthIHRoZSBzb3VyY2UpIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gZHN0UG9ydCAoYWthIHRoZSBzaW5rKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdWRpbyByb3V0ZSBzdXBwb3J0cyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBzaW5rIGFuZCB0aGUgc291cmNlLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIEF1ZGlvUG9ydFZlY3RvciBtU291cmNlczsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1MjQ3ZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+Ci0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2U7Ci0KLWNsYXNzIEF1ZGlvU2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi17Ci1wdWJsaWM6Ci0gICAgQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICBib29sIGlzU291bmRUcmlnZ2VyLAotICAgICAgICAgICAgICAgICBBdWRpb01peCogcG9saWN5TWl4LAotICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKLQotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwotCi0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uOyB9Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UoKWNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZTsgfQotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuZm9ybWF0OyB9Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuc2FtcGxlX3JhdGU7IH0KLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuY2hhbm5lbF9tYXNrOyB9Ci0gICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQotICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnVpZDsgfQotICAgIHZvaWQgc2V0VWlkKHVpZF90IHVpZCkgeyBtUmVjb3JkQ2xpZW50SW5mby51aWQgPSB1aWQ7IH0KLSAgICBib29sIG1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0OwotICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIoKSBjb25zdCB7IHJldHVybiBtSXNTb3VuZFRyaWdnZXI7IH0KLSAgICB2b2lkIHNldFNpbGVuY2VkKGJvb2wgc2lsZW5jZWQpIHsgbVNpbGVuY2VkID0gc2lsZW5jZWQ7IH0KLSAgICBib29sIGlzU2lsZW5jZWQoKSBjb25zdCB7IHJldHVybiBtU2lsZW5jZWQ7IH0KLSAgICB1aW50MzJfdCBvcGVuQ291bnQoKSBjb25zdCB7IHJldHVybiBtT3BlbkNvdW50OyB9IDsKLSAgICB1aW50MzJfdCBhY3RpdmVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3RpdmVDb3VudDsgfSA7Ci0KLSAgICB1aW50MzJfdCBjaGFuZ2VPcGVuQ291bnQoaW50IGRlbHRhKTsKLSAgICB1aW50MzJfdCBjaGFuZ2VBY3RpdmVDb3VudChpbnQgZGVsdGEpOwotCi0gICAgdm9pZCBzZXRJbmZvUHJvdmlkZXIoQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcik7Ci0gICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi0gICAgdmlydHVhbCB2b2lkIG9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICByZWNvcmRfY2xpZW50X2luZm9fdCBtUmVjb3JkQ2xpZW50SW5mbzsKLSAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbUNvbmZpZzsKLSAgICBjb25zdCBhdWRpb19pbnB1dF9mbGFnc190IG1GbGFnczsKLSAgICBib29sICBtSXNTb3VuZFRyaWdnZXI7Ci0gICAgYm9vbCBtU2lsZW5jZWQ7Ci0gICAgdWludDMyX3QgIG1PcGVuQ291bnQ7Ci0gICAgdWludDMyX3QgIG1BY3RpdmVDb3VudDsKLSAgICBBdWRpb01peCogbVBvbGljeU1peDsgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKLSAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSogbUNsaWVudEludGVyZmFjZTsKLSAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIG1JbmZvUHJvdmlkZXI7Ci19OwotCi1jbGFzcyBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIDoKLSAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgc3A8QXVkaW9TZXNzaW9uPiA+LAotICAgIHB1YmxpYyBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICBzdGF0dXNfdCBhZGRTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpOwotCi0gICAgc3RhdHVzX3QgcmVtb3ZlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICB1aW50MzJfdCBnZXRPcGVuQ291bnQoKSBjb25zdDsKLQotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gZ2V0QWN0aXZlU2Vzc2lvbnMoKSBjb25zdDsKLSAgICBzaXplX3QgZ2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgY29uc3Q7Ci0gICAgYm9vbCBoYXNBY3RpdmVTZXNzaW9uKCkgY29uc3Q7Ci0gICAgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwotICAgIGF1ZGlvX3NvdXJjZV90IGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotCi0gICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi0gICAgdmlydHVhbCB2b2lkIG9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdDsKLQotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwMzdmYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGlucHV0IGRlc2NyaXB0b3JzIHRvIGltcGxlbWVudCBzbyBkZXBlbmRlbnQgYXVkaW8gc2Vzc2lvbnMgY2FuIHF1ZXJ5IGluZm9ybWF0aW9uCi0gKiBhYm91dCB0aGVpciBjb250ZXh0Ci0gKi8KLWNsYXNzIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcgotewotcHVibGljOgotICAgIHZpcnR1YWwgfkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcigpIHt9OwotCi0gICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCA9IDA7Ci0KLX07Ci0KLWNsYXNzIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIHZpcnR1YWwgfkF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcigpIHt9OwotCi0gICAgdmlydHVhbCB2b2lkIG9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdCA9IDA7OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDkwZjQyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgotI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKLWNsYXNzIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOwotY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKLQotY2xhc3MgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yOiBwdWJsaWMgUmVmQmFzZQotewotcHVibGljOgotICAgIEF1ZGlvU291cmNlRGVzY3JpcHRvcihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSA6Ci0gICAgICAgIG1EZXZpY2UoZGV2aWNlKSwgbUF0dHJpYnV0ZXMoKmF0dHJpYnV0ZXMpLCBtVWlkKHVpZCkge30KLSAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZURlc2NyaXB0b3IoKSB7fQotCi0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0SGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoRGVzYy0+bUhhbmRsZTsgfQotCi0gICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOwotCi0gICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURldmljZTsKLSAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgbUF0dHJpYnV0ZXM7Ci0gICAgdWlkX3QgbVVpZDsKLSAgICBzcDxBdWRpb1BhdGNoPiBtUGF0Y2hEZXNjOwotICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3dPdXRwdXQ7Ci0gICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Id091dHB1dDsKLX07Ci0KLWNsYXNzIEF1ZGlvU291cmNlQ29sbGVjdGlvbiA6Ci0gICAgICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+ID4KLXsKLXB1YmxpYzoKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmIyMjVkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPFZvbHVtZS5oPgorI2luY2x1ZGUgIkF1ZGlvUGF0Y2guaCIKKyNpbmNsdWRlICJFZmZlY3REZXNjcmlwdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKK2NsYXNzIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I7CisKK2NsYXNzIENsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZSkgOgorICAgICAgICBtUG9ydElkKHBvcnRJZCksIG1VaWQodWlkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKKyAgICAgICAgbUNvbmZpZyhjb25maWcpLCBtUHJlZmVycmVkRGV2aWNlSWQocHJlZmVycmVkRGV2aWNlSWQpLCBtQWN0aXZlKGZhbHNlKSwKKyAgICAgICAgbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZShpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSl7fQorICAgIH5DbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TaG9ydFN0cmluZygpIGNvbnN0OworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9CisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnOyB9CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCgpIGNvbnN0IHsgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZDsgfTsKKyAgICB2b2lkIHNldFByZWZlcnJlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQpIHsKKyAgICAgICAgbVByZWZlcnJlZERldmljZUlkID0gcHJlZmVycmVkRGV2aWNlSWQ7CisgICAgfQorICAgIGJvb2wgaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoKSBjb25zdCB7IHJldHVybiBtUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlOyB9CisgICAgdmlydHVhbCB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgeyBtQWN0aXZlID0gYWN0aXZlOyB9CisgICAgYm9vbCBhY3RpdmUoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlOyB9CisgICAgYm9vbCBoYXNQcmVmZXJyZWREZXZpY2UoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICYmICghYWN0aXZlT25seSB8fCBtQWN0aXZlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOyAgLy8gdW5pcXVlIElkIGZvciB0aGlzIGNsaWVudAorICAgIGNvbnN0IHVpZF90IG1VaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAorICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbklkOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzOyAvLyB1c2FnZS4uLgorICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgbUNvbmZpZzsKKyAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1QcmVmZXJyZWREZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgYm9vbCBtQWN0aXZlOworICAgICAgICAgIGJvb2wgbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IGZhbHNlOworfTsKKworY2xhc3MgVHJhY2tDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHNlY29uZGFyeU91dHB1dHMpIDoKKyAgICAgICAgQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgc2Vzc2lvbklkLCBhdHRyaWJ1dGVzLCBjb25maWcsIHByZWZlcnJlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKSwKKyAgICAgICAgbVN0cmVhbShzdHJlYW0pLCBtU3RyYXRlZ3koc3RyYXRlZ3kpLCBtVm9sdW1lU291cmNlKHZvbHVtZVNvdXJjZSksIG1GbGFncyhmbGFncyksCisgICAgICAgIG1TZWNvbmRhcnlPdXRwdXRzKHN0ZDo6bW92ZShzZWNvbmRhcnlPdXRwdXRzKSkge30KKyAgICB+VHJhY2tDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIHRvU2hvcnRTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBtU3RyZWFtOyB9CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KCkgY29uc3QgeyByZXR1cm4gbVN0cmF0ZWd5OyB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiYgZ2V0U2Vjb25kYXJ5T3V0cHV0cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZWNvbmRhcnlPdXRwdXRzOworICAgIH07CisgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1Wb2x1bWVTb3VyY2U7IH0KKworICAgIHZvaWQgc2V0QWN0aXZlKGJvb2wgYWN0aXZlKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgICAgICBjaGFuZ2VBY3Rpdml0eUNvdW50KGRlbHRhKTsKKyAgICB9CisgICAgdm9pZCBjaGFuZ2VBY3Rpdml0eUNvdW50KGludCBkZWx0YSkKKyAgICB7CisgICAgICAgIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eUNvdW50ICs9IGRlbHRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighbUFjdGl2aXR5Q291bnQsICIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgaW5hY3RpdmUgY2xpZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgZGVsdGEpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0aWNfY2FzdDxpbnQ+KG1BY3Rpdml0eUNvdW50KSA8IC1kZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVzKSBpbnZhbGlkIGRlbHRhICVkLCBhY3RpdmUgY2xpZW50IGNvdW50ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgZGVsdGEsIG1BY3Rpdml0eUNvdW50KTsKKyAgICAgICAgICAgIG1BY3Rpdml0eUNvdW50ICs9IGRlbHRhOworICAgICAgICB9CisgICAgICAgIENsaWVudERlc2NyaXB0b3I6OnNldEFjdGl2ZShtQWN0aXZpdHlDb3VudCA+IDApOworICAgIH0KKyAgICB1aW50MzJfdCBnZXRBY3Rpdml0eUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2aXR5Q291bnQ7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CisgICAgY29uc3QgcHJvZHVjdF9zdHJhdGVneV90IG1TdHJhdGVneTsKKyAgICBjb25zdCBWb2x1bWVTb3VyY2UgbVZvbHVtZVNvdXJjZTsKKyAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBtU2Vjb25kYXJ5T3V0cHV0czsKKworICAgIC8qKgorICAgICAqIHJlcXVpcmVkIGZvciBkdXBsaWNhdGluZyB0aHJlYWQsIHByZXZlbnQgZnJvbSByZW1vdmluZyBhY3RpdmUgY2xpZW50IGZyb20gYW4gb3V0cHV0CisgICAgICogaW52b2x2ZWQgaW4gYSBkdXBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBtQWN0aXZpdHlDb3VudCA9IDA7Cit9OworCitjbGFzcyBSZWNvcmRDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFJlY29yZENsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsIGJvb2wgaXNTb3VuZFRyaWdnZXIpIDoKKyAgICAgICAgQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgc2Vzc2lvbklkLCBhdHRyaWJ1dGVzLCBjb25maWcsIHByZWZlcnJlZERldmljZUlkKSwKKyAgICAgICAgbVNvdXJjZShzb3VyY2UpLCBtRmxhZ3MoZmxhZ3MpLCBtSXNTb3VuZFRyaWdnZXIoaXNTb3VuZFRyaWdnZXIpLCBtQXBwU3RhdGUoQVBQX1NUQVRFX0lETEUpIHt9CisgICAgflJlY29yZENsaWVudERlc2NyaXB0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB1c2luZyBDbGllbnREZXNjcmlwdG9yOjpkdW1wOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtU291cmNlOyB9CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIoKSBjb25zdCB7IHJldHVybiBtSXNTb3VuZFRyaWdnZXI7IH0KKyAgICB2b2lkIHNldEFwcFN0YXRlKGFwcF9zdGF0ZV90IGFwcFN0YXRlKSB7IG1BcHBTdGF0ZSA9IGFwcFN0YXRlOyB9CisgICAgYXBwX3N0YXRlX3QgYXBwU3RhdGUoKSB7IHJldHVybiBtQXBwU3RhdGU7IH0KKyAgICBib29sIGlzU2lsZW5jZWQoKSBjb25zdCB7IHJldHVybiBtQXBwU3RhdGUgPT0gQVBQX1NUQVRFX0lETEU7IH0KKyAgICB2b2lkIHRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGdldEVuYWJsZWRFZmZlY3RzKCkgY29uc3QgeyByZXR1cm4gbUVuYWJsZWRFZmZlY3RzOyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fc291cmNlX3QgbVNvdXJjZTsKKyAgICBjb25zdCBhdWRpb19pbnB1dF9mbGFnc190IG1GbGFnczsKKyAgICBjb25zdCBib29sIG1Jc1NvdW5kVHJpZ2dlcjsKKyAgICAgICAgICBhcHBfc3RhdGVfdCBtQXBwU3RhdGU7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVuYWJsZWRFZmZlY3RzOworfTsKKworY2xhc3MgU291cmNlQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIFRyYWNrQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFNvdXJjZUNsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiYgcGF0Y2hEZXNjLCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc3JjRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UpOworICAgIH5Tb3VyY2VDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoRGVzYzsgfQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1TcmNEZXZpY2U7IH07CisgICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbVN3T3V0cHV0OyB9CisgICAgdm9pZCBzZXRTd091dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIHN3T3V0cHV0KTsKKyAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtSHdPdXRwdXQ7IH0KKyAgICB2b2lkIHNldEh3T3V0cHV0KGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgaHdPdXRwdXQpOworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiBtUGF0Y2hEZXNjOworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IG1TcmNEZXZpY2U7CisgICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Td091dHB1dDsKKyAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbUh3T3V0cHV0OworfTsKKworY2xhc3MgU291cmNlQ2xpZW50Q29sbGVjdGlvbiA6CisgICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gPgoreworcHVibGljOgorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OworfTsKKwordHlwZWRlZiBzdGQ6OnZlY3Rvcjwgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiA+IFRyYWNrQ2xpZW50VmVjdG9yOwordHlwZWRlZiBzdGQ6OnZlY3Rvcjwgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gPiBSZWNvcmRDbGllbnRWZWN0b3I7CisKKy8vIEEgTWFwIHRoYXQgYXNzb2NpYXRlcyBhIHBvcnRJZCB3aXRoIGEgY2xpZW50ICh0eXBlIFQpCisvLyB3aGljaCBpcyBlaXRoZXIgVHJhY2tDbGllbnREZXNjcmlwdG9yIG9yIFJlY29yZENsaWVudERlc2NyaXB0b3IuCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDbGllbnRNYXBIYW5kbGVyIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5DbGllbnRNYXBIYW5kbGVyKCkgPSBkZWZhdWx0OworCisgICAgLy8gVHJhY2sgY2xpZW50IG1hbmFnZW1lbnQKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2xpZW50KGNvbnN0IHNwPFQ+ICZjbGllbnQpIHsKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBjbGllbnQtPnBvcnRJZCgpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFtQ2xpZW50cy5lbXBsYWNlKHBvcnRJZCwgY2xpZW50KS5zZWNvbmQsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogYXR0ZW1wdGluZyB0byBhZGQgY2xpZW50IHRoYXQgYWxyZWFkeSBleGlzdHMiLCBfX2Z1bmNfXywgcG9ydElkKTsKKyAgICB9CisgICAgc3A8VD4gZ2V0Q2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtQ2xpZW50cy5maW5kKHBvcnRJZCk7CisgICAgICAgIGlmIChpdCA9PSBtQ2xpZW50cy5lbmQoKSkgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ2xpZW50cy5maW5kKHBvcnRJZCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXQgPT0gbUNsaWVudHMuZW5kKCksCisgICAgICAgICAgICAgICAgIiVzKCVkKTogY2xpZW50IGRvZXMgbm90IGV4aXN0IiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXQtPnNlY29uZC0+YWN0aXZlKCksCisgICAgICAgICAgICAgICAgIiVzKCVkKTogcmVtb3ZpbmcgY2xpZW50IHN0aWxsIGFjdGl2ZSEiLCBfX2Z1bmNfXywgcG9ydElkKTsKKyAgICAgICAgKHZvaWQpbUNsaWVudHMuZXJhc2UoaXQpOworICAgIH0KKyAgICBzaXplX3QgZ2V0Q2xpZW50Q291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50cy5zaXplKCk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3QgeworICAgICAgICBzaXplX3QgaW5kZXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgMiwgaW5kZXgrKyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBoZWxwZXIgdHlwZXMKKyAgICB1c2luZyBDbGllbnRNYXAgPSBzdGQ6Om1hcDxhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxUPj47CisgICAgdXNpbmcgQ2xpZW50TWFwSXRlcmF0b3IgPSB0eXBlbmFtZSBDbGllbnRNYXA6OmNvbnN0X2l0ZXJhdG9yOyAgLy8gQ2xpZW50TWFwIGlzIGNvbnN0IHF1YWxpZmllZAorICAgIGNsYXNzIENsaWVudEl0ZXJhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENsaWVudEl0ZXJhYmxlKGNvbnN0IENsaWVudE1hcEhhbmRsZXI8VD4gJnJlZikgOiBtQ2xpZW50TWFwSGFuZGxlcihyZWYpIHsgfQorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgLy8gdHJhaXRzCisgICAgICAgICAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisgICAgICAgICAgICB1c2luZyB2YWx1ZV90eXBlID0gc3A8VD47CisgICAgICAgICAgICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBwdHJkaWZmX3Q7CisgICAgICAgICAgICB1c2luZyBwb2ludGVyID0gY29uc3Qgc3A8VD4qOyAgICAvLyBOb3RlOiBjb25zdAorICAgICAgICAgICAgdXNpbmcgcmVmZXJlbmNlID0gY29uc3Qgc3A8VD4mOyAgLy8gTm90ZTogY29uc3QKKworICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIGV4cGxpY2l0IGl0ZXJhdG9yKGNvbnN0IENsaWVudE1hcEl0ZXJhdG9yICZpdCkgOiBtSXQoaXQpIHsgfQorICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKSAgICAvKiBwcmVmaXggKi8gICAgIHsgKyttSXQ7IHJldHVybiAqdGhpczsgfQorICAgICAgICAgICAgcmVmZXJlbmNlIG9wZXJhdG9yKiAoKSBjb25zdCAgICAgICAgICAgICAgIHsgcmV0dXJuIG1JdC0+c2Vjb25kOyB9CisgICAgICAgICAgICByZWZlcmVuY2Ugb3BlcmF0b3ItPigpIGNvbnN0ICAgICAgICAgICAgICAgeyByZXR1cm4gbUl0LT5zZWNvbmQ7IH0gLy8gYXMgaWYgc3A8PgorICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShjb25zdCBpdGVyYXRvciYgcmhzKSB7cmV0dXJuIG1JdCAtIHJocy5tSXQ7IH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgcmhzKSBjb25zdCB7IHJldHVybiBtSXQgPT0gcmhzLm1JdDsgfQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiByaHMpIGNvbnN0IHsgcmV0dXJuIG1JdCAhPSByaHMubUl0OyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBDbGllbnRNYXBJdGVyYXRvciBtSXQ7CisgICAgICAgIH07CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcnttQ2xpZW50TWFwSGFuZGxlci5tQ2xpZW50cy5iZWdpbigpfTsgfQorICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcnttQ2xpZW50TWFwSGFuZGxlci5tQ2xpZW50cy5lbmQoKX07IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IENsaWVudE1hcEhhbmRsZXI8VD4mIG1DbGllbnRNYXBIYW5kbGVyOyAvLyBpdGVyYXRpbmcgZG9lcyBub3QgbW9kaWZ5IG1hcC4KKyAgICB9OworCisgICAgLy8gcmV0dXJuIGFuIGl0ZXJhYmxlIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIGEgcmFuZ2UtYmFzZWQtZm9yIHRvIGVudW1lcmF0ZSBjbGllbnRzLgorICAgIC8vIHRoaXMgaXRlcmFibGUgZG9lcyBub3QgYWxsb3cgbW9kaWZpY2F0aW9uLCBpdCBzaG91bGQgYmUgdXNlZCBhcyBhIHRlbXBvcmFyeS4KKyAgICBDbGllbnRJdGVyYWJsZSBnZXRDbGllbnRJdGVyYWJsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENsaWVudEl0ZXJhYmxleyp0aGlzfTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gQ2xpZW50TWFwIG1hcHMgYSBwb3J0SWQgdG8gYSBjbGllbnQgZGVzY3JpcHRvciAoYm90aCB1bmlxdWVseSBpZGVudGlmeSBlYWNoIG90aGVyKS4KKyAgICBDbGllbnRNYXAgbUNsaWVudHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMDc4NTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lDb25maWcuaCIKLSNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJhdWRpb19wb2xpY3lfY29uZi5oIgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlZmluaXRpb25zIGZvciBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ29uZmlnUGFyc2luZ1V0aWxzCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRDb25maWcoY29uc3QgY2hhciAqcGF0aCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIHZvaWQgbG9hZEF1ZGlvUG9ydEdhaW4oY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0LCBpbnQgaW5kZXgpOwotICAgIHN0YXRpYyB2b2lkIGxvYWRBdWRpb1BvcnRHYWlucyhjbm9kZSAqcm9vdCwgQXVkaW9Qb3J0ICZhdWRpb1BvcnQpOwotICAgIHN0YXRpYyB2b2lkIGxvYWREZXZpY2VEZXNjcmlwdG9yR2FpbnMoY25vZGUgKnJvb3QsIHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2VEZXNjKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEh3TW9kdWxlRGV2aWNlKGNub2RlICpyb290LCBEZXZpY2VWZWN0b3IgJmRldmljZXMpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkSHdNb2R1bGVQcm9maWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZERldmljZXNGcm9tVGFnKGNvbnN0IGNoYXIgKnRhZywgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGVjbGFyZWREZXZpY2VzKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkSHdNb2R1bGVzKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxId01vZHVsZT4gJnByaW1hcnlNb2R1bGUpOwotICAgIHN0YXRpYyB2b2lkIGxvYWRNb2R1bGVHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIGNvbnN0IHNwPEh3TW9kdWxlPiAmbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKaW5kZXggOTJhNGMzZS4uY2M0M2ZlNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCkBAIC0zMSwxNSArMzEsMzEgQEAKIHB1YmxpYzoKICAgICAgLy8gTm90ZSB0aGF0IGVtcHR5IG5hbWUgcmVmZXJzIGJ5IGNvbnZlbnRpb24gdG8gYSBnZW5lcmljIGRldmljZS4KICAgICBleHBsaWNpdCBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lID0gU3RyaW5nOCgiIikpOworICAgIERldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lID0gU3RyaW5nOCgiIikpOwogCiAgICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvcigpIHt9CiAKICAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzggZ2V0VGFnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1UYWdOYW1lOyB9CiAKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlOyB9CisgICAgU3RyaW5nOCBhZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gbUFkZHJlc3M7IH0KKyAgICB2b2lkIHNldEFkZHJlc3MoY29uc3QgU3RyaW5nOCAmYWRkcmVzcykgeyBtQWRkcmVzcyA9IGFkZHJlc3M7IH0KKworICAgIGNvbnN0IEZvcm1hdFZlY3RvciYgZW5jb2RlZEZvcm1hdHMoKSBjb25zdCB7IHJldHVybiBtRW5jb2RlZEZvcm1hdHM7IH0KKworICAgIGF1ZGlvX2Zvcm1hdF90IGdldEVuY29kZWRGb3JtYXQoKSB7IHJldHVybiBtQ3VycmVudEVuY29kZWRGb3JtYXQ7IH0KKworICAgIHZvaWQgc2V0RW5jb2RlZEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0ID0gZm9ybWF0OworICAgIH0KIAogICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3Q7CiAKKyAgICBib29sIGhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCkgY29uc3Q7CisKKyAgICBib29sIHN1cHBvcnRzRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisKICAgICAvLyBBdWRpb1BvcnRDb25maWcKICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gKEF1ZGlvUG9ydCopIHRoaXM7IH0KICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCkBAIC00Nyw0NCArNjMsMTQxIEBACiAKICAgICAvLyBBdWRpb1BvcnQKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7CisKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCBpbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogICAgIHZvaWQgbG9nKCkgY29uc3Q7Ci0KLSAgICBTdHJpbmc4IG1BZGRyZXNzOworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CiAKIHByaXZhdGU6CisgICAgU3RyaW5nOCBtQWRkcmVzc3siIn07CiAgICAgU3RyaW5nOCBtVGFnTmFtZTsgLy8gVW5pcXVlIGh1bWFuIHJlYWRhYmxlIGlkZW50aWZpZXIgZm9yIGEgZGV2aWNlIHBvcnQgZm91bmQgaW4gY29uZiBmaWxlLgogICAgIGF1ZGlvX2RldmljZXNfdCAgICAgbURldmljZVR5cGU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7Ci0KLWZyaWVuZCBjbGFzcyBEZXZpY2VWZWN0b3I7CisgICAgRm9ybWF0VmVjdG9yICAgICAgICBtRW5jb2RlZEZvcm1hdHM7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0OwogfTsKIAogY2xhc3MgRGV2aWNlVmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3RvcjxzcDxEZXZpY2VEZXNjcmlwdG9yPiA+CiB7CiBwdWJsaWM6CiAgICAgRGV2aWNlVmVjdG9yKCkgOiBTb3J0ZWRWZWN0b3IoKSwgbURldmljZVR5cGVzKEFVRElPX0RFVklDRV9OT05FKSB7fQorICAgIGV4cGxpY2l0IERldmljZVZlY3Rvcihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgOiBEZXZpY2VWZWN0b3IoKQorICAgIHsKKyAgICAgICAgYWRkKGl0ZW0pOworICAgIH0KIAogICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKICAgICB2b2lkIGFkZChjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpOwogICAgIHNzaXplX3QgcmVtb3ZlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKKyAgICB2b2lkIHJlbW92ZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpOwogICAgIHNzaXplX3QgaW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3Q7CiAKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZXM7IH0KIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3Q7Ci0gICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpIGNvbnN0OworICAgIC8vIElmICdhZGRyZXNzJyBpcyBlbXB0eSBhbmQgJ2NvZGVjJyBpcyBBVURJT19GT1JNQVRfREVGQVVMVCwgYSBkZXZpY2Ugd2l0aCBhIG5vbi1lbXB0eQorICAgIC8vIGFkZHJlc3MgbWF5IGJlIHJldHVybmVkIGlmIHRoZXJlIGlzIG5vIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgJ3R5cGUnIGFuZCBlbXB0eSBhZGRyZXNzLgorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWMpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVNYXNrKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0RGV2aWNlRnJvbUlkCisgICAgICogQHBhcmFtIGlkIG9mIHRoZSBEZXZpY2VEZXNjcmlwdG9yIHRvIHNlYWNoIChha2EgUG9ydCBoYW5kbGUpLgorICAgICAqIEByZXR1cm4gRGV2aWNlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHRvIHBvcnQgaWQgaWYgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlLiBJZiB0aGUgaWQgaXMKKyAgICAgKiBlcXVhbCB0byBBVURJT19QT1JUX0hBTkRMRV9OT05FLCBpdCBhbHNvIHJldHVybnMgYSBudWxscHRyLgorICAgICAqLwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tVGFnTmFtZShjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSBjb25zdDsKLSAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3Q7CisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OwogCi0gICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3Q7CisgICAgYm9vbCBjb250YWlucyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3QgeyByZXR1cm4gaW5kZXhPZihpdGVtKSA+PSAwOyB9CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzID0gMCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgLyoqCisgICAgICogQGJyaWVmIGNvbnRhaW5zQXRMZWFzdE9uZQorICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGNoZWNrIGFnYWluc3QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBEZXZpY2VWZWN0b3IgY29udGFpbnMgYXQgbGlzdCBvbmUgb2YgdGhlIGRldmljZXMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnNBdExlYXN0T25lKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY29udGFpbnNBbGxEZXZpY2VzCisgICAgICogQHBhcmFtIGRldmljZXMgdmVjdG9yIG9mIGRldmljZXMgdG8gY2hlY2sgYWdhaW5zdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIERldmljZVZlY3RvciBjb250YWlucyBhbGwgdGhlIGRldmljZXMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yCisgICAgICovCisgICAgYm9vbCBjb250YWluc0FsbERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBmaWx0ZXIgdGhlIGRldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29sbGVjdGlvbiBhZ2FpbnN0IGFub3RoZXIgY29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRvIGZpbHRlciBhZ2FpbnN0CisgICAgICogQHJldHVybgorICAgICAqLworICAgIERldmljZVZlY3RvciBmaWx0ZXIoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBtZXJnZSB0d28gdmVjdG9ycy4gQXMgU29ydGVkVmVjdG9yIEltcGxlbWVudGF0aW9uIGlzIGJ1Z2d5IChpdCBkb2VzIG5vdCBjaGVjayB0aGUgc2l6ZQorICAgICAqIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IsIG9ubHkgb2YgdGhlIHNvdXJjZSwgaXQgcHJvdmlkZXMgYSBzYWZlIGltcGxlbWVudGF0aW9uCisgICAgICogQHBhcmFtIGRldmljZXMgc291cmNlIGRldmljZSB2ZWN0b3IgdG8gbWVyZ2Ugd2l0aAorICAgICAqIEByZXR1cm4gc2l6ZSBvZiB0aGUgbWVyZ2VkIHZlY3Rvci4KKyAgICAgKi8KKyAgICBzc2l6ZV90IG1lcmdlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKKyAgICB7CisgICAgICAgIGlmIChpc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFkZChkZXZpY2VzKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNvcnRlZFZlY3Rvcjo6bWVyZ2UoZGV2aWNlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIG9wZXJhdG9yID09IERldmljZVZlY3RvciBhcmUgZXF1YWxzIGlmIGFsbCB0aGUgRGV2aWNlRGVzY3JpcHRvciBjYW4gYmUgZm91bmQgKGFrYQorICAgICAqIERldmljZURlc2NyaXB0b3Igd2l0aCBzYW1lIHR5cGUgYW5kIGFkZHJlc3MpIGFuZCB0aGUgdmVjdG9yIGhhcyBzYW1lIHNpemUuCisgICAgICogQHBhcmFtIHJpZ2h0IERldmljZVZlY3RvciB0byBjb21wYXJlIHRvLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByaWdodCBjb250YWlucyB0aGUgc2FtZSBkZXZpY2UgYW5kIGhhcyB0aGUgc2FtZSBzaXplLgorICAgICAqLworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZXZpY2VWZWN0b3IgJnJpZ2h0KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHNpemUoKSAhPSByaWdodC5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAocmlnaHQuaW5kZXhPZihkZXZpY2UpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGV2aWNlVmVjdG9yICZyaWdodCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShyaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldEZpcnN0VmFsaWRBZGRyZXNzCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgdmFsaWQgYWRkcmVzcyBvZiBhIGxpc3Qgb2YgZGV2aWNlLCAiIiBpZiBubyBkZXZpY2Ugd2l0aCB2YWxpZCBhZGRyZXNzCisgICAgICogZm91bmQuCisgICAgICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gaGVscHMgbWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSB3aGVyZSB3ZSB1c2VkIHRvIGhhdmUgYQorICAgICAqIGRldmljZXMgbWFzayBhbmQgYW4gYWRkcmVzcy4KKyAgICAgKi8KKyAgICBTdHJpbmc4IGdldEZpcnN0VmFsaWRBZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2UtPmFkZHJlc3MoKSAhPSAiIikgeworICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UtPmFkZHJlc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RyaW5nOCgiIik7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHZvaWQgcmVmcmVzaFR5cGVzKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAppbmRleCAwNDgzMWM2Li43ZjAxZGM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKQEAgLTE2LDI1ICsxNiwzOCBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotCiBjbGFzcyBFZmZlY3REZXNjcmlwdG9yIDogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisgICAgRWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBib29sIGlzTXVzaWNFZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICBpbnQgaWQsIGludCBpbywgaW50IHNlc3Npb24pIDoKKyAgICAgICAgbUlkKGlkKSwgbUlvKGlvKSwgbVNlc3Npb24oc2Vzc2lvbiksIG1FbmFibGVkKGZhbHNlKSwKKyAgICAgICAgbUlzTXVzaWNFZmZlY3QoaXNNdXNpY0VmZmVjdCkKKyAgICB7CisgICAgICAgIG1lbWNweSAoJm1EZXNjLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIH0KIAorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKKworICAgIGludCBtSWQ7ICAgICAgICAgICAgICAgIC8vIGVmZmVjdCB1bmlxdWUgSUQKICAgICBpbnQgbUlvOyAgICAgICAgICAgICAgICAvLyBpbyB0aGUgZWZmZWN0IGlzIGF0dGFjaGVkIHRvCi0gICAgcm91dGluZ19zdHJhdGVneSBtU3RyYXRlZ3k7IC8vIHJvdXRpbmcgc3RyYXRlZ3kgdGhlIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvCiAgICAgaW50IG1TZXNzaW9uOyAgICAgICAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgogICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2M7ICAvLyBlZmZlY3QgZGVzY3JpcHRvcgogICAgIGJvb2wgbUVuYWJsZWQ7ICAgICAgICAgICAgICAvLyBlbmFibGVkIHN0YXRlOiBDUFUgbG9hZCBiZWluZyB1c2VkIG9yIG5vdAorCisgICAgYm9vbCBpc011c2ljRWZmZWN0KCkgY29uc3QgeyByZXR1cm4gbUlzTXVzaWNFZmZlY3Q7IH0KKworcHJpdmF0ZToKKyAgICBib29sIG1Jc011c2ljRWZmZWN0OwogfTsKIAogY2xhc3MgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gOiBwdWJsaWMgS2V5ZWRWZWN0b3I8aW50LCBzcDxFZmZlY3REZXNjcmlwdG9yPiA+CkBAIC00MywxNCArNTYsMTYgQEAKICAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbigpOwogCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksIGludCBzZXNzaW9uLCBpbnQgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLCBpbnQgaWQsIGJvb2wgaXNNdXNpY0VmZmVjdCk7CiAgICAgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGdldEVmZmVjdChpbnQgaWQpIGNvbnN0OwogICAgIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpOworICAgIGJvb2wgICAgIGlzRWZmZWN0RW5hYmxlZChpbnQgaWQpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldE1heEVmZmVjdHNDcHVMb2FkKCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0TWF4RWZmZWN0c01lbW9yeSgpIGNvbnN0OwotICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKTsKKyAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjIyOWE0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8U3RyZWFtRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmVhbURlc2NyaXB0b3I7Ci0KLWNsYXNzIEdhaW5zCi17Ci1wdWJsaWMgOgotICAgIHN0YXRpYyBmbG9hdCB2b2xJbmRleFRvRGIoY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQsIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSk7Ci0KLSAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZQotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneQotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gdm9sdW1lIGN1cnZlIGZvciBub24tbWVkaWEgYXVkaW8gb24gZXh0IG1lZGlhIG91dHB1dHMgKEhETUksIExpbmUsIGV0YykKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneSBvbiBzcGVha2VycwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyB2b2x1bWUgY3VydmUgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBvbiBzcGVha2VycwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzTGluZWFyVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTaWxlbnRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhcmluZ0FpZFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXMgcGVyIHN0cmVhbSBhbmQgZGV2aWNlIGNhdGVnb3J5LiBTZWUgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKaW5kZXggY2I5ZjQ5ZS4uZWIzNGRhNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKQEAgLTQ2LDYgKzQ2LDIyIEBACiAKICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmdldERlY2xhcmVkRGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1EZWNsYXJlZERldmljZXM7IH0KICAgICB2b2lkIHNldERlY2xhcmVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpOworICAgIERldmljZVZlY3RvciBnZXRBbGxEZXZpY2VzKCkgY29uc3QKKyAgICB7CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbURlY2xhcmVkRGV2aWNlczsKKyAgICAgICAgZGV2aWNlcy5tZXJnZShtRHluYW1pY0RldmljZXMpOworICAgICAgICByZXR1cm4gZGV2aWNlczsKKyAgICB9CisgICAgdm9pZCBhZGREeW5hbWljRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCisgICAgeworICAgICAgICBtRHluYW1pY0RldmljZXMuYWRkKGRldmljZSk7CisgICAgfQorCisgICAgYm9vbCByZW1vdmVEeW5hbWljRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCisgICAgeworICAgICAgICByZXR1cm4gbUR5bmFtaWNEZXZpY2VzLnJlbW92ZShkZXZpY2UpID49IDA7CisgICAgfQorICAgIERldmljZVZlY3RvciBnZXREeW5hbWljRGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1EeW5hbWljRGV2aWNlczsgfQogCiAgICAgY29uc3QgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiAmZ2V0SW5wdXRQcm9maWxlcygpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dFByb2ZpbGVzOyB9CiAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJmdldE91dHB1dFByb2ZpbGVzKCkgY29uc3QgeyByZXR1cm4gbU91dHB1dFByb2ZpbGVzOyB9CkBAIC04MSw4ICs5NywxOSBAQAogICAgICAgICByZXR1cm4gbVBvcnRzLmZpbmRCeVRhZ05hbWUodGFnTmFtZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGJyaWVmIHN1cHBvcnRzUGF0Y2ggY2hlY2tzIGlmIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gMiBwb3J0cyBiZWxvZ2luZyB0byB0aGlzIEh3TW9kdWxlCisgICAgICogaXMgc3VwcG9ydGVkIGJ5IGEgSHdNb2R1bGUuIFRoZSBwb3J0cyBhbmQgdGhlIHJvdXRlIHNoYWxsIGJlIGRlY2xhcmVkIGluIHRoZQorICAgICAqIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBmaWxlLgorICAgICAqIEBwYXJhbSBzcmNQb3J0IChha2EgdGhlIHNvdXJjZSkgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBkc3RQb3J0IChha2EgdGhlIHNpbmspIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEh3TW9kdWxlIHN1cHBvcnRzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIHNpbmsgYW5kIHRoZSBzb3VyY2UsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBzdXBwb3J0c1BhdGNoKGNvbnN0IHNwPEF1ZGlvUG9ydD4gJnNyY1BvcnQsIGNvbnN0IHNwPEF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0OworCiAgICAgLy8gVE9ETyByZW1vdmUgZnJvbSBoZXJlIChzcGxpdCBzZXJpYWxpemF0aW9uKQotICAgIHZvaWQgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHZvaWQgcmVmcmVzaFN1cHBvcnRlZERldmljZXMoKTsKQEAgLTkzLDYgKzEyMCw3IEBACiAgICAgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiBtSW5wdXRQcm9maWxlczsgIC8vIGlucHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKICAgICB1aW50MzJfdCBtSGFsVmVyc2lvbjsgLy8gYXVkaW8gSEFMIEFQSSB2ZXJzaW9uCiAgICAgRGV2aWNlVmVjdG9yIG1EZWNsYXJlZERldmljZXM7IC8vIGRldmljZXMgZGVjbGFyZWQgaW4gYXVkaW9fcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICBEZXZpY2VWZWN0b3IgbUR5bmFtaWNEZXZpY2VzOyAvKio8IGRldmljZXMgdGhhdCBjYW4gYmUgYWRkZWQvcmVtb3ZlZCBhdCBydW50aW1lIChlLmcuIHJzYnVtaXgpKi8KICAgICBBdWRpb1JvdXRlVmVjdG9yIG1Sb3V0ZXM7CiAgICAgQXVkaW9Qb3J0VmVjdG9yIG1Qb3J0czsKIH07CkBAIC0xMDIsMTQgKzEzMCw2NCBAQAogcHVibGljOgogICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKIAotICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZVR5cGVzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0OwogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZHJlc3MgPSB0cnVlKSBjb25zdDsKKyAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0QXZhaWxhYmxlRGV2aWNlc0Zyb21Nb2R1bGVOYW1lKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZURldmljZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldERldmljZURlc2NyaXB0b3IgcmV0dXJucyBhIGRldmljZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgdG8gdGhlIGRldmljZSB0eXBlIGFuZAorICAgICAqIGRldmljZSBhZGRyZXNzIChpZiBtYXRjaEFkZHJlc3MgaXMgdHJ1ZSkuCisgICAgICogSXQgbWF5IGxvb3AgdHdpY2Ugb24gYWxsIG1vZHVsZXMgdG8gY2hlY2sgaWYgYWxsb3dUb0NyZWF0ZSBpcyB0cnVlCisgICAgICogICAgICAtZmlyc3QgbG9vcCB3aWxsIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgZm91bmQgb24gYSBtb2R1bGUgc2luY2UgZGVjbGFyZWQgaW4gdGhlIGxpc3QKKyAgICAgKiBvZiBkZXZpY2UgcG9ydCBpbiBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgKiAgICAgIC0oYWxsb3dUb0NyZWF0ZSBpcyB0cnVlKXNlY29uZCBsb29wIHdpbGwgY2hlY2sgaWYgdGhlIGRldmljZSBpcyB3ZWFrbHkgc3VwcG9ydGVkIGJ5IG9uZQorICAgICAqIG9yIG1vcmUgcHJvZmlsZXMgb24gYSBnaXZlbiBtb2R1bGUgYW5kIHdpbGwgYWRkIGFzIGEgc3VwcG9ydGVkIGRldmljZSBmb3IgdGhpcyBtb2R1bGUuCisgICAgICogICAgICAgVGhlIGRldmljZSB3aWxsIGFsc28gYmUgYWRkZWQgdG8gdGhlIGR5bmFtaWMgbGlzdCBvZiBkZXZpY2Ugb2YgdGhpcyBtb2R1bGUKKyAgICAgKiBAcGFyYW0gdHlwZSBvZiB0aGUgZGV2aWNlIHJlcXVlc3RlZAorICAgICAqIEBwYXJhbSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgcmVxdWVzdGVkCisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIGRldmljZSB0aGF0IHJlcXVlc3RlZAorICAgICAqIEBwYXJhbSBlbmNvZGVkRm9ybWF0IGlmIG5vdCBBVURJT19GT1JNQVRfREVGQVVMVCwgbXVzdCBtYXRjaCBvbmUgc3VwcG9ydGVkIGZvcm1hdAorICAgICAqIEBwYXJhbSBtYXRjaEFkZHJlc3MgdHJ1ZSBpZiBhIHN0cm9uZyBtYXRjaCBpcyByZXF1aXJlZAorICAgICAqIEBwYXJhbSBhbGxvd1RvQ3JlYXRlIHRydWUgaWYgYWxsb3dlZCB0byBjcmVhdGUgZHluYW1pYyBkZXZpY2UgKGUuZy4gaGRtaSwgdXNiLi4uKQorICAgICAqIEByZXR1cm4gZGV2aWNlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB0byB0aGUgdHlwZSAoYW5kIGFkZHJlc3MgaWYgbWF0Y2hBZGRyZXNzIGlzIHRydWUpCisgICAgICovCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dUb0NyZWF0ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkZHJlc3MgPSB0cnVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBjcmVhdGVEZXZpY2UgY3JlYXRlcyBhIG5ldyBkZXZpY2UgZnJvbSB0aGUgdHlwZSBhbmQgYWRkcmVzcyBnaXZlbi4gSXQgY2hlY2tzIHRoYXQKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGRldmljZSB0eXBlLCBhIG1vZHVsZSBpcyBzdXBwb3J0aW5nIHRoaXMgZGV2aWNlICh3ZWFrIGNoZWNrKS4KKyAgICAgKiBUaGlzIGNvbmNlcm5zIG9ubHkgZHluYW1pYyBkZXZpY2UsIGFrYSBkZXZpY2Ugd2l0aCBhIHNwZWNpZmljIGFkZHJlc3MgYW5kIG5vdAorICAgICAqIGFscmVhZHkgc3VwcG9ydGVkIGJ5IG1vZHVsZS91bmRlcmx5aW5nIHByb2ZpbGVzLgorICAgICAqIEBwYXJhbSB0eXBlIG9mIHRoZSBkZXZpY2UgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBkZXZpY2UgdG8gYmUgY3JlYXRlZAorICAgICAqIEByZXR1cm4gZGV2aWNlIGRlc2NyaXB0b3IgaWYgYSBtb2R1bGUgaXMgc3VwcG9ydGluZyB0aGlzIHR5cGUsIG51bGxwdHIgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGNyZWF0ZURldmljZShjb25zdCBhdWRpb19kZXZpY2VzX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY2xlYW5VcEZvckRldmljZTogbG9vcCBvbiBhbGwgcHJvZmlsZXMgb2YgYWxsIG1vZHVsZXMgdG8gcmVtb3ZlIGRldmljZSBmcm9tCisgICAgICogdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZS4gSWYgdGhpcyBkZXZpY2UgaXMgYSBkeW5hbWljIGRldmljZSAoYWthIGEgZGV2aWNlIG5vdCBpbiB0aGUKKyAgICAgKiB4bWwgZmlsZSB3aXRoIGEgcnVudGltZSBhZGRyZXNzKSwgaXQgaXMgYWxzbyByZW1vdmVkIGZyb20gdGhlIG1vZHVsZSBjb2xsZWN0aW9uIG9mIGR5bmFtaWMKKyAgICAgKiBkZXZpY2VzLgorICAgICAqIEBwYXJhbSBkZXZpY2UgdGhhdCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQKKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXBGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSk7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaAppbmRleCA2N2FjOWJjLi5lMGI1NmQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCkBAIC0zNSw3ICszNSw3IEBACiBwdWJsaWM6CiAgICAgSU9Qcm9maWxlKGNvbnN0IFN0cmluZzggJm5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpCiAgICAgICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUpLAotICAgICAgICAgIG1heE9wZW5Db3VudCgocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSA/IDEgOiAwKSwKKyAgICAgICAgICBtYXhPcGVuQ291bnQoMSksCiAgICAgICAgICAgY3VyT3BlbkNvdW50KDApLAogICAgICAgICAgIG1heEFjdGl2ZUNvdW50KDEpLAogICAgICAgICAgIGN1ckFjdGl2ZUNvdW50KDApIHt9CkBAIC01NywxMiArNTcsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGlucHV0IGFuZCBkaXJlY3Qgb3V0cHV0LCBhbmQgaXMgbm90IHVzZWQgZm9yIG90aGVyIG91dHB1dC4KLSAgICAvLyBJZiBwYXJhbWV0ZXIgdXBkYXRlZFNhbXBsaW5nUmF0ZSBpcyBub24tTlVMTCwgaXQgaXMgYXNzaWduZWQgdGhlIGFjdHVhbCBzYW1wbGUgcmF0ZS4KLSAgICAvLyBGb3IgaW5wdXQsIGZsYWdzIGlzIGludGVycHJldGVkIGFzIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCi0gICAgLy8gVE9ETzogbWVyZ2UgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgYW5kIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCi0gICAgYm9vbCBpc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgLyoqCisgICAgICogQGJyaWVmIGlzQ29tcGF0aWJsZVByb2ZpbGU6IFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGlucHV0IGFuZCBkaXJlY3Qgb3V0cHV0LAorICAgICAqIGFuZCBpcyBub3QgdXNlZCBmb3Igb3RoZXIgb3V0cHV0LgorICAgICAqIENoZWNrcyBpZiB0aGUgSU8gcHJvZmlsZSBpcyBjb21wYXRpYmxlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgICAgICogRm9yIGlucHV0LCBmbGFncyBpcyBpbnRlcnByZXRlZCBhcyBhdWRpb19pbnB1dF9mbGFnc190LgorICAgICAqIFRPRE86IG1lcmdlIGF1ZGlvX291dHB1dF9mbGFnc190IGFuZCBhdWRpb19pbnB1dF9mbGFnc190LgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZXMgdmVjdG9yIG9mIGRldmljZXMgdG8gYmUgY2hlY2tlZCBmb3IgY29tcGF0aWJpbGl0eQorICAgICAqIEBwYXJhbSBzYW1wbGluZ1JhdGUgdG8gYmUgY2hlY2tlZCBmb3IgY29tcGF0aWJpbGl0eS4gTXVzdCBiZSBzcGVjaWZpZWQKKyAgICAgKiBAcGFyYW0gdXBkYXRlZFNhbXBsaW5nUmF0ZSBpZiBub24tTlVMTCwgaXQgaXMgYXNzaWduZWQgdGhlIGFjdHVhbCBzYW1wbGUgcmF0ZS4KKyAgICAgKiBAcGFyYW0gZm9ybWF0IHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkuIE11c3QgYmUgc3BlY2lmaWVkCisgICAgICogQHBhcmFtIHVwZGF0ZWRGb3JtYXQgaWYgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgZm9ybWF0CisgICAgICogQHBhcmFtIGNoYW5uZWxNYXNrIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkuIE11c3QgYmUgc3BlY2lmaWVkCisgICAgICogQHBhcmFtIHVwZGF0ZWRDaGFubmVsTWFzayBpZiBub24tTlVMTCwgaXQgaXMgYXNzaWduZWQgdGhlIGFjdHVhbCBjaGFubmVsIG1hc2sKKyAgICAgKiBAcGFyYW0gZmxhZ3MgdG8gYmUgY2hlY2tlZCBmb3IgY29tcGF0aWJpbGl0eQorICAgICAqIEBwYXJhbSBleGFjdE1hdGNoUmVxdWlyZWRGb3JJbnB1dEZsYWdzIHRydWUgaWYgZXhhY3QgbWF0Y2ggaXMgcmVxdWlyZWQgb24gZmxhZ3MKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb2ZpbGUgaXMgY29tcGF0aWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgaXNDb21wYXRpYmxlUHJvZmlsZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKQEAgLTczLDU0ICs4Niw2NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleGFjdE1hdGNoUmVxdWlyZWRGb3JJbnB1dEZsYWdzID0gZmFsc2UpIGNvbnN0OwogCi0gICAgdm9pZCBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiAgICAgdm9pZCBsb2coKTsKIAogICAgIGJvb2wgaGFzU3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuICFtU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCk7IH0KIAotICAgIGJvb2wgc3VwcG9ydERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorICAgIGJvb2wgc3VwcG9ydHNEZXZpY2VUeXBlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAogICAgIHsKICAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGRldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlOworICAgICAgICAgICAgaWYgKGRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgKGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKTsKICAgICB9CiAKLSAgICBib29sIHN1cHBvcnREZXZpY2VBZGRyZXNzKGNvbnN0IFN0cmluZzggJmFkZHJlc3MpIGNvbnN0CisgICAgLyoqCisgICAgICogQGJyaWVmIHN1cHBvcnRzRGV2aWNlCisgICAgICogQHBhcmFtIGRldmljZSB0byBiZSBjaGVja2VkIGFnYWluc3QKKyAgICAgKiAgICAgICAgZm9yY2VDaGVja09uQWRkcmVzcyBpZiB0cnVlLCBjaGVjayBvbiB0eXBlIGFuZCBhZGRyZXNzIHdoYXRldmVyIHRoZSB0eXBlLCBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgdGhlIGFkZHJlc3MgZW5mb3JjZW1lbnQgaXMgbGltaXRlZCB0byAib2ZmaWNhbCBkZXZpY2VzIiB0aGF0IGRpc3Rpbmd1aXNoZSBvbiBhZGRyZXNzCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIGJ5IHR5cGUgKGZvciBub24gYnVzIC8gcmVtb3RlIHN1Ym1peCBkZXZpY2VzKSwKKyAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKGJvdGggdHlwZSBhbmQgYWRkcmVzcykgZm9yIGJ1cyAvIHJlbW90ZSBzdWJtaXgKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwgYm9vbCBmb3JjZUNoZWNrT25BZGRyZXNzID0gZmFsc2UpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXNbMF0tPm1BZGRyZXNzID09IGFkZHJlc3M7Ci0gICAgfQotCi0gICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gbVN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mIGRldmljZVR5cGUKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlRm9yVHlwZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IG1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBtU3VwcG9ydGVkRGV2aWNlc1trXS0+dHlwZSgpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGVUeXBlICYgZGV2aWNlVHlwZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlVHlwZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZS0+dHlwZSgpKSAmJiAhZm9yY2VDaGVja09uQWRkcmVzcykgeworICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRzRGV2aWNlVHlwZXMoZGV2aWNlLT50eXBlKCkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzLmNvbnRhaW5zKGRldmljZSk7CiAgICAgfQogCi0gICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXNUeXBlKCkgY29uc3QgeyByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsgfQorICAgIGJvb2wgZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHJlcXVpcmVkIGZvciBpc09mZmxvYWRTdXBwb3J0ZWQoKSBjaGVjaworICAgICAgICB9CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0KKyAgICAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKKyAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXZpY2VMaXN0Lml0ZW1BdCgwKS0+aGFzQ3VycmVudEVuY29kZWRGb3JtYXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCiAgICAgdm9pZCBjbGVhclN1cHBvcnRlZERldmljZXMoKSB7IG1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7IH0KICAgICB2b2lkIGFkZFN1cHBvcnRlZERldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQogICAgIHsKICAgICAgICAgbVN1cHBvcnRlZERldmljZXMuYWRkKGRldmljZSk7CiAgICAgfQotCisgICAgdm9pZCByZW1vdmVTdXBwb3J0ZWREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkKKyAgICB7CisgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzLnJlbW92ZShkZXZpY2UpOworICAgIH0KICAgICB2b2lkIHNldFN1cHBvcnRlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQogICAgIHsKICAgICAgICAgbVN1cHBvcnRlZERldmljZXMgPSBkZXZpY2VzOwogICAgIH0KIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldFN1cHBvcnRlZERldmljZUJ5QWRkcmVzcyhhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZSh0eXBlLCBhZGRyZXNzKTsKLSAgICB9Ci0KICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmdldFN1cHBvcnRlZERldmljZXMoKSBjb25zdCB7IHJldHVybiBtU3VwcG9ydGVkRGV2aWNlczsgfQogCiAgICAgYm9vbCBjYW5PcGVuTmV3SW8oKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlcy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDA4NDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXMuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElWb2x1bWVDdXJ2ZXMKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5JVm9sdW1lQ3VydmVzKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KSA9IDA7CisgICAgdmlydHVhbCBib29sIGNhbkJlTXV0ZWQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGRldmljZV9jYXRlZ29yeSBkZXZpY2UsIGludCBpbmRleEluVWkpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFZvbHVtZShpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkgPSAwOworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8YXVkaW9fYXR0cmlidXRlc190PiBnZXRBdHRyaWJ1dGVzKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdD4gZ2V0U3RyZWFtVHlwZXMoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdCA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWY2YjA4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8Vm9sdW1lLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbigpID0gZGVmYXVsdDsKLQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgY2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIC8qaXNTcGVha2VyRHJjRW5hYmxlZCovKSB7fQotICAgIHZpcnR1YWwgdm9pZCBzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBkc3QpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgIHsKLSAgICAgICAgc3dpdGNoVm9sdW1lQ3VydmUoc3RyZWFtLCBzdHJlYW0pOwotICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0ID0gMDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCmluZGV4IDI5ZGU4NDguLjQ4YzQxNDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaApAQCAtMTcsMjIzICsxNyw5IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgIkF1ZGlvUG9saWN5Q29uZmlnLmgiCi0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotCi1zdHJ1Y3QgX3htbE5vZGU7Ci1zdHJ1Y3QgX3htbERvYzsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQXVkaW9HYWluVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtb2RlW107IC8qKjwgZ2FpbiBtb2RlcyBzdXBwb3J0ZWQsIGUuZy4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLwotICAgICAgICAvKiogY29udHJvbGxlZCBjaGFubmVscywgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBjaGFubmVsTWFza1tdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtaW5WYWx1ZU1CW107IC8qKjwgbWluIHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhWYWx1ZU1CW107IC8qKjwgbWF4IHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0VmFsdWVNQltdOyAvKio8IGRlZmF1bHQgdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHN0ZXBWYWx1ZU1CW107IC8qKjwgc3RlcCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWluUmFtcE1zW107IC8qKjwgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heFJhbXBNc1tdOyAvKio8IC5uZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUCAqLwotICAgIH07Ci0KLSAgICB0eXBlZGVmIEF1ZGlvR2FpbiBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RWxlbWVudD4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEF1ZGlvR2FpbkNvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBHYWluIGhhcyBubyBjaGlsZAotfTsKLQotLy8gQSBwcm9maWxlIHNlY3Rpb24gY29udGFpbnMgYSBuYW1lLCAgb25lIGF1ZGlvIGZvcm1hdCBhbmQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzCi0vLyBhbmQgY2hhbm5lbCBtYXNrcyBmb3IgdGhpcyBmb3JtYXQKLXN0cnVjdCBBdWRpb1Byb2ZpbGVUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc2FtcGxpbmdSYXRlc1tdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBmb3JtYXRbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhbm5lbE1hc2tzW107Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgQXVkaW9Qcm9maWxlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxBdWRpb1Byb2ZpbGU+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBBdWRpb1Byb2ZpbGVWZWN0b3IgQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci19OwotCi1zdHJ1Y3QgTWl4UG9ydFRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbmFtZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByb2xlW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGZsYWdzW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heE9wZW5Db3VudFtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhBY3RpdmVDb3VudFtdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIElPUHJvZmlsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RWxlbWVudD4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIElPUHJvZmlsZUNvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBDaGlsZHJlbiBhcmU6IEdhaW5UcmFpdHMKLX07Ci0KLXN0cnVjdCBEZXZpY2VQb3J0VHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0YWdOYW1lW107IC8qKjwgIDxkZXZpY2UgdGFnIG5hbWU+OiBhbnkgc3RyaW5nIHdpdGhvdXQgc3BhY2UuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHR5cGVbXTsgLyoqPCA8ZGV2aWNlIHR5cGU+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByb2xlW107IC8qKjwgPGRldmljZSByb2xlOiBzaW5rIG9yIHNvdXJjZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJvbGVTb3VyY2VbXTsgLyoqPCA8YXR0cmlidXRlIHJvbGUgc291cmNlIHZhbHVlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgYWRkcmVzc1tdOyAvKio8IG9wdGlvbmFsOiBkZXZpY2UgYWRkcmVzcywgY2hhciBzdHJpbmcgbGVzcyB0aGFuIDY0LiAqLwotICAgIH07Ci0gICAgdHlwZWRlZiBEZXZpY2VEZXNjcmlwdG9yIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxEZXZpY2VEZXNjcmlwdG9yPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgRGV2aWNlVmVjdG9yIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotICAgIC8vIENoaWxkcmVuIGFyZTogR2FpblRyYWl0cyAob3B0aW9ubmFsKQotfTsKLQotc3RydWN0IFJvdXRlVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eXBlW107IC8qKjwgPHJvdXRlIHR5cGU+OiBtaXggb3IgbXV4LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eXBlTWl4W107IC8qKjwgdHlwZSBhdHRyaWJ1dGUgbWl4IHZhbHVlLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzaW5rW107IC8qKjwgPHNpbms6IGludm9sdmVkIGluIHRoaXMgcm91dGU+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzb3VyY2VzW107IC8qKjwgc291cmNlczogYWxsIHNvdXJjZSB0aGF0IGNhbiBiZSBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlLiAqLwotICAgIH07Ci0gICAgdHlwZWRlZiBBdWRpb1JvdXRlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxBdWRpb1JvdXRlPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgQXVkaW9Sb3V0ZVZlY3RvciBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgSHdNb2R1bGUgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCk7Ci19OwotCi1zdHJ1Y3QgTW9kdWxlVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGRBdHRhY2hlZERldmljZVRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIEh3TW9kdWxlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxFbGVtZW50PiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgSHdNb2R1bGVDb2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLQotICAgIC8vIENoaWxkcmVuIGFyZTogbWl4UG9ydFRyYWl0cywgZGV2aWNlUG9ydFRyYWl0cyBhbmQgcm91dGVUcmFpdHMKLSAgICAvLyBOZWVkIHRvIGNhbGwgZGVzZXJpYWxpemUgb24gZWFjaCBjaGlsZAotfTsKLQotc3RydWN0IEdsb2JhbENvbmZpZ1RyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc3BlYWtlckRyY0VuYWJsZWRbXTsKLSAgICB9OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IF94bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLX07Ci0KLXN0cnVjdCBWb2x1bWVUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2b2x1bWVQb2ludFRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzdHJlYW1bXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZGV2aWNlQ2F0ZWdvcnlbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcmVmZXJlbmNlW107Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgVm9sdW1lQ3VydmUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPFZvbHVtZUN1cnZlPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLQotICAgIC8vIE5vIENoaWxkCi19OwotCi1jbGFzcyBQb2xpY3lTZXJpYWxpemVyCi17Ci1wcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByb290TmFtZTsKLQotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ZXJzaW9uQXR0cmlidXRlOwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBnTWFqb3I7IC8qKjwgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZ01pbm9yOyAvKio8IHRoZSBtaW5vciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCi0KLXB1YmxpYzoKLSAgICBQb2xpY3lTZXJpYWxpemVyKCk7Ci0gICAgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgY2hhciAqc3RyLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLQotcHJpdmF0ZToKLSAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnIEVsZW1lbnQ7Ci0KLSAgICBzdGQ6OnN0cmluZyBtUm9vdEVsZW1lbnROYW1lOwotICAgIHN0ZDo6c3RyaW5nIG1WZXJzaW9uOwotCi0gICAgLy8gQ2hpbGRyZW4gYXJlOiBNb2R1bGVzVHJhaXRzLCBWb2x1bWVUcmFpdHMKLX07CitzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShjb25zdCBjaGFyICpmaWxlTmFtZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiNDQ0MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKLWNsYXNzIERldmljZVZlY3RvcjsKLQotY2xhc3MgU2Vzc2lvblJvdXRlIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAvLyBGb3IgSW5wdXQgKFNvdXJjZSkgcm91dGVzLCB1c2UgU1RSRUFNX1RZUEVfTkEgKCJOQSIgPSAibm90IGFwcGxpY2FibGUpZm9yIHRoZQotICAgIC8vIHN0cmVhbVR5cGUgYXJndW1lbnQKLSAgICBzdGF0aWMgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBTVFJFQU1fVFlQRV9OQSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwotCi0gICAgLy8gRm9yIE91dHB1dCAoU2luaykgcm91dGVzLCB1c2UgU09VUkNFX1RZUEVfTkEgKCJOQSIgPSAibm90IGFwcGxpY2FibGUiKSBmb3IgdGhlCi0gICAgLy8gc291cmNlIGFyZ3VtZW50Ci0KLSAgICBzdGF0aWMgY29uc3QgYXVkaW9fc291cmNlX3QgU09VUkNFX1RZUEVfTkEgPSBBVURJT19TT1VSQ0VfREVGQVVMVDsKLQotICAgIFNlc3Npb25Sb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLSAgICAgICAgOiBtVWlkKHVpZCksCi0gICAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgICAgbURldmljZURlc2NyaXB0b3IoZGV2aWNlRGVzY3JpcHRvciksCi0gICAgICAgICAgbVJlZkNvdW50KDApLAotICAgICAgICAgIG1BY3Rpdml0eUNvdW50KDApLAotICAgICAgICAgIG1DaGFuZ2VkKGZhbHNlKSwKLSAgICAgICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKLSAgICAgICAgICBtU291cmNlKHNvdXJjZSkKLSAgICB7fQotCi0gICAgdm9pZCBsb2coY29uc3QgY2hhciogcHJlZml4KTsKLQotICAgIGJvb2wgaXNBY3RpdmVPckNoYW5nZWQoKSB7Ci0gICAgICAgIHJldHVybiAobURldmljZURlc2NyaXB0b3IgIT0gMCkgJiYgKG1DaGFuZ2VkIHx8IChtQWN0aXZpdHlDb3VudCA+IDApKTsKLSAgICB9Ci0KLSAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKLSAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICAgICAgbVNlc3Npb247Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yOwotCi0gICAgLy8gInJlZmVyZW5jZSIgY291bnRpbmcKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVJlZkNvdW50OyAgICAgIC8vICsvLSBvbiByZWZlcmVuY2VzCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eUNvdW50OyAvLyArLy0gb24gc3RhcnQvc3RvcAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbmdlZDsKLSAgICAvLyBmb3Igb3V0cHV0cwotICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgICBtU3RyZWFtVHlwZTsKLSAgICAvLyBmb3IgaW5wdXRzCi0gICAgY29uc3QgYXVkaW9fc291cmNlX3QgICAgICAgIG1Tb3VyY2U7Ci19OwotCi1jbGFzcyBTZXNzaW9uUm91dGVNYXA6IHB1YmxpYyBLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIHNwPFNlc3Npb25Sb3V0ZT4gPgotewotcHVibGljOgotICAgIC8vIFRoZXNlIGNvbnN0YW50cyBpZGVudGlmeSB0aGUgU2Vzc2lvblJvdXRNYXAgYXMgaG9sZGluZyBFSVRIRVIgaW5wdXQgcm91dGVzLAotICAgIC8vIG9yIG91dHB1dCByb3V0ZXMuICBBbiBlcnJvciB3aWxsIG9jY3VyIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhZGQgYSBTZXNzaW9uUm91dGUKLSAgICAvLyBvYmplY3Qgd2l0aCBtU3RyZWFtVHlwZSA9PSBTVFJFQU1fVFlQRV9OQSAoaS5lLiBhbiBpbnB1dCBTZXNzaW9uUm91dGUpIHRvIGEKLSAgICAvLyBTZXNzaW9uUm91dE1hcCB0aGF0IGlzIG1hcmtlZCBmb3Igb3V0cHV0IChpLmUuIG1NYXBUeXBlID09IFNFU1NJT05fUk9VVEVfTUFQX09VVFBVVCkKLSAgICAvLyBhbmQgc2ltaWxhcmx5ICBmb3Igb3V0cHV0IFNlc3Npb25Sb3V0ZXMgYW5kIElucHV0IFNlc3Npb25Sb3V0ZU1hcHMuCi0gICAgdHlwZWRlZiBlbnVtCi0gICAgewotICAgICAgICBNQVBUWVBFX0lOUFVUID0gMCwKLSAgICAgICAgTUFQVFlQRV9PVVRQVVQgPSAxCi0gICAgfSBzZXNzaW9uX3JvdXRlX21hcF90eXBlX3Q7Ci0KLSAgICBleHBsaWNpdCBTZXNzaW9uUm91dGVNYXAoc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90IG1hcFR5cGUpIDoKLSAgICAgICAgbU1hcFR5cGUobWFwVHlwZSkKLSAgICB7fQotCi0gICAgYm9vbCBoYXNSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICB2b2lkIHJlbW92ZVJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLQotICAgIGludCBpbmNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBpbnQgZGVjUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgYm9vbCBnZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7IC8vIGFsc28gY2xlYXJzIHRoZSBjaGFuZ2VkIGZsYWcKLSAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBjYXB0aW9uKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgYXZhaWxhYmxlRGV2aWNlcyk7Ci0gICAgLy8gU3BlY2lmeSBhbiBPdXRwdXQoU2luaykgcm91dGUgYnkgcGFzc2luZyBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BIGluIHRoZQotICAgIC8vIHNvdXJjZSBhcmd1bWVudC4KLSAgICAvLyBTcGVjaWZ5IGFuIElucHV0KFNvdXJjZSkgcm91dCBieSBwYXNzaW5nIFNlc3Npb25Sb3V0ZTo6QVVESU9fU1RSRUFNX0RFRkFVTFQKLSAgICAvLyBpbiB0aGUgc3RyZWFtVHlwZSBhcmd1bWVudC4KLSAgICB2b2lkIGFkZFJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwotCi1wcml2YXRlOgotICAgIC8vIFVzZWQgdG8gbWFyayBhIFNlc3Npb25Sb3V0ZSBhcyBmb3IgZWl0aGVyIGlucHV0cyAobU1hcFR5cGUgPT0ga1Nlc3Npb25Sb3V0ZU1hcF9JbnB1dCkKLSAgICAvLyBvciBvdXRwdXRzIChtTWFwVHlwZSA9PSBrU2Vzc2lvblJvdXRlTWFwX091dHB1dCkKLSAgICBjb25zdCBzZXNzaW9uX3JvdXRlX21hcF90eXBlX3QgbU1hcFR5cGU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiMTAzNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIklWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RyZWFtIGRlc2NyaXB0b3IgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wKLWNsYXNzIFN0cmVhbURlc2NyaXB0b3IKLXsKLXB1YmxpYzoKLSAgICBTdHJlYW1EZXNjcmlwdG9yKCk7Ci0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7Ci0gICAgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgeyByZXR1cm4gbUNhbkJlTXV0ZWQ7IH0KLSAgICB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCk7Ci0gICAgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KTsKLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXhNYXg7IH0KLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbik7Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpOwotICAgIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7Ci0gICAgICAgIHJldHVybiBtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpID49IDA7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LCBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCk7Ci0gICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqZ2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqbVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9DTlRdOwotICAgIEtleWVkVmVjdG9yPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7IC8qKjwgY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZS4gKi8KLSAgICBpbnQgbUluZGV4TWluOyAvKio8IG1pbiB2b2x1bWUgaW5kZXguICovCi0gICAgaW50IG1JbmRleE1heDsgLyoqPCBtYXggdm9sdW1lIGluZGV4LiAqLwotICAgIGJvb2wgbUNhbkJlTXV0ZWQ7IC8qKjwgdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZC4gKi8KLX07Ci0KLS8qKgotICogc3RyZWFtIGRlc2NyaXB0b3JzIGNvbGxlY3Rpb24gZm9yIHZvbHVtZSBjb250cm9sCi0gKi8KLWNsYXNzIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uIDogcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90LCBTdHJlYW1EZXNjcmlwdG9yPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uCi17Ci1wdWJsaWM6Ci0gICAgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7Ci0gICAgdmlydHVhbCBib29sIGNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXhNaW4oKTsKLSAgICB9Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWF4KCk7Ci0gICAgfQotICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpOwotICAgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgdmlydHVhbCB2b2lkIHN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtU3JjLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCk7Ci0gICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB2b2lkIHNldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpOwotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmdldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0OwotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWluKTsKLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWF4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1heCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaAppbmRleCA2M2MxOWQxLi42YjA0NzZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKQEAgLTIzLDI2ICsyMywxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBEZXZpY2VDYXRlZ29yeVRyYWl0cwotewotICAgIHR5cGVkZWYgZGV2aWNlX2NhdGVnb3J5IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgTWl4VHlwZVRyYWl0cwotewotICAgIHR5cGVkZWYgaW50MzJfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFJvdXRlRmxhZ1RyYWl0cwotewotICAgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBSdWxlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiB1aW50MzJfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Oworc3RydWN0IFJ1bGVUcmFpdHMgOiBwdWJsaWMgRGVmYXVsdFRyYWl0czx1aW50MzJfdD4ge307Cit1c2luZyBEZXZpY2VDYXRlZ29yeVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8ZGV2aWNlX2NhdGVnb3J5PjsKK3N0cnVjdCBNaXhUeXBlVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8aW50MzJfdD4ge307CitzdHJ1Y3QgUm91dGVGbGFnVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8dWludDMyX3Q+IHt9OwogCiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8RGV2aWNlQ2F0ZWdvcnlUcmFpdHM+IERldmljZUNhdGVnb3J5Q29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPE1peFR5cGVUcmFpdHM+IE1peFR5cGVDb252ZXJ0ZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZiMmI0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIklWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSA8cG9saWN5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQ3VydmVQb2ludAotewotICAgIEN1cnZlUG9pbnQoKSB7fQotICAgIEN1cnZlUG9pbnQoaW50IGluZGV4LCBpbnQgYXR0ZW51YXRpb25Jbk1iKSA6Ci0gICAgICAgIG1JbmRleChpbmRleCksIG1BdHRlbnVhdGlvbkluTWIoYXR0ZW51YXRpb25Jbk1iKSB7fQotICAgIHVpbnQzMl90IG1JbmRleDsKLSAgICBpbnQgbUF0dGVudWF0aW9uSW5NYjsKLX07Ci0KLWlubGluZSBib29sIG9wZXJhdG9yPCAoY29uc3QgQ3VydmVQb2ludCAmbGhzLCBjb25zdCBDdXJ2ZVBvaW50ICZyaHMpCi17Ci0gICAgcmV0dXJuIGxocy5tSW5kZXggPCByaHMubUluZGV4OwotfQotCi0vLyBBIHZvbHVtZSBjdXJ2ZSBmb3IgYSBnaXZlbiB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5Ci0vLyBJdCBjb250YWlucyBvZiBsaXN0IG9mIHBvaW50cyBvZiB0aGlzIGN1cnZlIGV4cHJlc3NpbmcgdGhlIGF0dGVudWF0aW9uIGluIE1pbGxpYmVscyBmb3IKLS8vIGEgZ2l2ZW4gdm9sdW1lIGluZGV4IGZyb20gMCB0byAxMDAKLWNsYXNzIFZvbHVtZUN1cnZlIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBWb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgOgotICAgICAgICBtRGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKSwgbVN0cmVhbVR5cGUoc3RyZWFtKSB7fQotCi0gICAgZGV2aWNlX2NhdGVnb3J5IGdldERldmljZUNhdGVnb3J5KCkgY29uc3QgeyByZXR1cm4gbURldmljZUNhdGVnb3J5OyB9Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KLQotICAgIHZvaWQgYWRkKGNvbnN0IEN1cnZlUG9pbnQgJnBvaW50KSB7IG1DdXJ2ZVBvaW50cy5hZGQocG9pbnQpOyB9Ci0KLSAgICBmbG9hdCB2b2xJbmRleFRvRGIoaW50IGluZGV4SW5VaSwgaW50IHZvbEluZGV4TWluLCBpbnQgdm9sSW5kZXhNYXgpIGNvbnN0OwotCi0gICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgU29ydGVkVmVjdG9yPEN1cnZlUG9pbnQ+IG1DdXJ2ZVBvaW50czsKLSAgICBkZXZpY2VfY2F0ZWdvcnkgbURldmljZUNhdGVnb3J5OwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGU7Ci19OwotCi0vLyBWb2x1bWUgQ3VydmVzIGZvciBhIGdpdmVuIHVzZSBjYXNlIGluZGV4ZWQgYnkgZGV2aWNlIGNhdGVnb3J5Ci1jbGFzcyBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0gOiBwdWJsaWMgS2V5ZWRWZWN0b3I8ZGV2aWNlX2NhdGVnb3J5LCBzcDxWb2x1bWVDdXJ2ZT4gPgotewotcHVibGljOgotICAgIFZvbHVtZUN1cnZlc0ZvclN0cmVhbSgpIDogbUluZGV4TWluKDApLCBtSW5kZXhNYXgoMSksIG1DYW5CZU11dGVkKHRydWUpCi0gICAgewotICAgICAgICBtSW5kZXhDdXIuYWRkKEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCAwKTsKLSAgICB9Ci0KLSAgICBzcDxWb2x1bWVDdXJ2ZT4gZ2V0Q3VydmVzRm9yKGRldmljZV9jYXRlZ29yeSBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoaW5kZXhPZktleShkZXZpY2UpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKGRldmljZSk7Ci0gICAgfQotCi0gICAgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgICAgICAvLyB0aGVyZSBpcyBhbHdheXMgYSB2YWxpZCBlbnRyeSBmb3IgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUKLSAgICAgICAgaWYgKG1JbmRleEN1ci5pbmRleE9mS2V5KGRldmljZSkgPCAwKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUluZGV4Q3VyLnZhbHVlRm9yKGRldmljZSk7Ci0gICAgfQotCi0gICAgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgeyByZXR1cm4gbUNhbkJlTXV0ZWQ7IH0KLSAgICB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCkgeyBtSW5kZXhDdXIuY2xlYXIoKTsgfQotICAgIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkgeyBtSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOyB9Ci0KLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbikgeyBtSW5kZXhNaW4gPSB2b2xJbmRleE1pbjsgfQotICAgIGludCBnZXRWb2x1bWVJbmRleE1pbigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1pbjsgfQotCi0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpIHsgbUluZGV4TWF4ID0gdm9sSW5kZXhNYXg7IH0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXhNYXg7IH0KLQotICAgIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7Ci0gICAgICAgIHJldHVybiBtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpID49IDA7Ci0gICAgfQotCi0gICAgY29uc3Qgc3A8Vm9sdW1lQ3VydmU+IGdldE9yaWdpblZvbHVtZUN1cnZlKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSkgY29uc3QKLSAgICB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKG1PcmlnaW5Wb2x1bWVDdXJ2ZXMuaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSkgPj0gMCwgIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5Iik7Ci0gICAgICAgIHJldHVybiBtT3JpZ2luVm9sdW1lQ3VydmVzLnZhbHVlRm9yKGRldmljZUNhdGVnb3J5KTsKLSAgICB9Ci0gICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksIGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmdm9sdW1lQ3VydmUpCi0gICAgewotICAgICAgICBBTE9HX0FTU0VSVChpbmRleE9mS2V5KGRldmljZUNhdGVnb3J5KSA+PSAwLCAiSW52YWxpZCBkZXZpY2UgY2F0ZWdvcnkgZm9yIFZvbHVtZSBDdXJ2ZSIpOwotICAgICAgICByZXBsYWNlVmFsdWVGb3IoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQotICAgIHsKLSAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5ID0gdm9sdW1lQ3VydmUtPmdldERldmljZUNhdGVnb3J5KCk7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGRldmljZUNhdGVnb3J5KTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBvcmlnaW5hbCBWb2x1bWUgQ3VydmVzIHBlciBkZXZpY2UgY2F0ZWdvcnkgaW4gb3JkZXIgdG8gc3dpdGNoIGN1cnZlcy4KLSAgICAgICAgICAgIG1PcmlnaW5Wb2x1bWVDdXJ2ZXMuYWRkKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7Ci0gICAgICAgICAgICByZXR1cm4gS2V5ZWRWZWN0b3I6OmFkZChkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICBmbG9hdCB2b2xJbmRleFRvRGIoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdCwgaW50IGluZGV4SW5VaSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHNwPFZvbHVtZUN1cnZlPiB2YyA9IGdldEN1cnZlc0ZvcihkZXZpY2VDYXQpOwotICAgICAgICBpZiAodmMgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHZjLT52b2xJbmRleFRvRGIoaW5kZXhJblVpLCBtSW5kZXhNaW4sIG1JbmRleE1heCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgY2F0ZWdvcnkgJWQgZm9yIFZvbHVtZSBDdXJ2ZSIsIGRldmljZUNhdCk7Ci0gICAgICAgICAgICByZXR1cm4gMC4wZjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGJvb2wgY3VydmVQb2ludHMgPSBmYWxzZSkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgS2V5ZWRWZWN0b3I8ZGV2aWNlX2NhdGVnb3J5LCBzcDxWb2x1bWVDdXJ2ZT4gPiBtT3JpZ2luVm9sdW1lQ3VydmVzOwotICAgIEtleWVkVmVjdG9yPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7IC8qKjwgY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZS4gKi8KLSAgICBpbnQgbUluZGV4TWluOyAvKio8IG1pbiB2b2x1bWUgaW5kZXguICovCi0gICAgaW50IG1JbmRleE1heDsgLyoqPCBtYXggdm9sdW1lIGluZGV4LiAqLwotICAgIGJvb2wgbUNhbkJlTXV0ZWQ7IC8qKjwgdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZC4gKi8KLX07Ci0KLS8vIENvbGxlY3Rpb24gb2YgVm9sdW1lIEN1cnZlcyBpbmRleGVkIGJ5IHVzZSBjYXNlCi1jbGFzcyBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uIDogcHVibGljIEtleWVkVmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3QsIFZvbHVtZUN1cnZlc0ZvclN0cmVhbT4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uCi17Ci1wdWJsaWM6Ci0gICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbigpCi0gICAgewotICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgY29sbGVjdGlvbiBvZiBjdXJ2ZXMKLSAgICAgICAgZm9yIChzc2l6ZV90IGkgPSAwIDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihpKTsKLSAgICAgICAgICAgIEtleWVkVmVjdG9yOjphZGQoc3RyZWFtLCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPbmNlIFhNTCBoYXMgYmVlbiBwYXJzZWQsIG11c3QgYmUgY2FsbCBmaXJzdCB0byBzYW5pdHkgY2hlY2sgdGFibGUgYW5kIGluaXRpYWxpemUgaW5kZXhlcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpCi0gICAgewotICAgICAgICBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWluKGluZGV4TWluKTsKLSAgICAgICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1heChpbmRleE1heCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgIHsKLSAgICAgICAgZWRpdEN1cnZlc0ZvcihzdHJlYW0pLmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIGVkaXRDdXJ2ZXNGb3Ioc3RyZWFtKS5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoZGV2aWNlLCBpbmRleCk7Ci0gICAgfQotICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7IHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5jYW5CZU11dGVkKCk7IH0KLQotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnZlc0ZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWluKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWF4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnZlc0ZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWF4KCk7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnZlc0ZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4KGRldmljZSk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpCi0gICAgewotICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0gJnNvdXJjZUN1cnZlcyA9IGdldEN1cnZlc0ZvcihzdHJlYW1TcmMpOwotICAgICAgICBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0gJmRzdEN1cnZlcyA9IGVkaXRDdXJ2ZXNGb3Ioc3RyZWFtRHN0KTsKLSAgICAgICAgQUxPR19BU1NFUlQoc291cmNlQ3VydmVzLnNpemUoKSA9PSBkc3RDdXJ2ZXMuc2l6ZSgpLCAiZGV2aWNlIGNhdGVnb3J5IG5vdCBhbGlnbmVkIik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBzb3VyY2VDdXJ2ZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgY2F0ID0gc291cmNlQ3VydmVzLmtleUF0KGluZGV4KTsKLSAgICAgICAgICAgIGRzdEN1cnZlcy5zZXRWb2x1bWVDdXJ2ZShjYXQsIHNvdXJjZUN1cnZlcy5nZXRPcmlnaW5Wb2x1bWVDdXJ2ZShjYXQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGNhdCwgaW50IGluZGV4SW5VaSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS52b2xJbmRleFRvRGIoY2F0LCBpbmRleEluVWkpOwotICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkuaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKLQotICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmdm9sdW1lQ3VydmUpCi0gICAgewotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSB2b2x1bWVDdXJ2ZS0+Z2V0U3RyZWFtVHlwZSgpOwotICAgICAgICByZXR1cm4gZWRpdEN1cnZlc0ZvcihzdHJlYW1UeXBlKS5hZGQodm9sdW1lQ3VydmUpOwotICAgIH0KLSAgICBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0gJmVkaXRDdXJ2ZXNGb3IoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgewotICAgICAgICBBTE9HX0FTU0VSVChpbmRleE9mS2V5KHN0cmVhbSkgPj0gMCwgIkludmFsaWQgc3RyZWFtIHR5cGUgZm9yIFZvbHVtZSBDdXJ2ZSIpOwotICAgICAgICByZXR1cm4gZWRpdFZhbHVlQXQoc3RyZWFtKTsKLSAgICB9Ci0gICAgY29uc3QgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZnZXRDdXJ2ZXNGb3IoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci0gICAgewotICAgICAgICBBTE9HX0FTU0VSVChpbmRleE9mS2V5KHN0cmVhbSkgPj0gMCwgIkludmFsaWQgc3RyZWFtIHR5cGUgZm9yIFZvbHVtZSBDdXJ2ZSIpOwotICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKTsKLSAgICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwCmluZGV4IGNhNjdiODcuLmM5MGE1ODIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwCkBAIC0zNSwyMiArMzUsMTYgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Sb3V0ZVZlY3Rvcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Cit2b2lkIEF1ZGlvUm91dGVWZWN0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewogICAgIGlmIChpc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4lKnNBdWRpbyBSb3V0ZXMgKCV6dSk6XG4iLCBzcGFjZXMsICIiLCBzaXplKCkpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnNBdWRpbyBSb3V0ZXMgKCV6dSk6XG4iLCBzcGFjZXMsICIiLCBzaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBSb3V0ZSAlenU6XG4iLCBzcGFjZXMsICIiLCBpICsgMSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGZkLCA0KTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUm91dGUgJXp1OlxuIiwgc3BhY2VzLCAiIiwgaSArIDEpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCA0KTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcAppbmRleCAxOTNkNGE2Li4yNzI1ODcwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKQEAgLTk4LDMyICs5OCwxNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb0dhaW46OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit2b2lkIEF1ZGlvR2Fpbjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0dhaW4gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtb2RlOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tb2RlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsX21hc2s6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLmNoYW5uZWxfbWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRlZmF1bHRfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5kZWZhdWx0X3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzdGVwX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uc3RlcF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fcmFtcF9tcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfcmFtcF9tcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0dhaW4gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtb2RlOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tb2RlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBjaGFubmVsX21hc2s6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLmNoYW5uZWxfbWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWluX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3ZhbHVlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtYXhfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfdmFsdWUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRlZmF1bHRfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5kZWZhdWx0X3ZhbHVlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBzdGVwX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uc3RlcF92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWluX3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fcmFtcF9tcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWF4X3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfcmFtcF9tcyk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAppbmRleCAxZTA2NDBjLi42MzVkZTZmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCkBAIC0xNywyMiArMTcsMjAgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb0lucHV0RGVzY3JpcHRvciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAiQXVkaW9JbnB1dERlc2NyaXB0b3IuaCIKLSNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJId01vZHVsZS5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJBdWRpb0lucHV0RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWl4LmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6QXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDogbUlvSGFuZGxlKDApLAotICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1Qb2xpY3lNaXgoTlVMTCksCi0gICAgICBtUHJvZmlsZShwcm9maWxlKSwgbVBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbUlkKDApLAotICAgICAgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpCisgICAgOiBtUHJvZmlsZShwcm9maWxlKQorICAgICwgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQogewogICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKICAgICAgICAgcHJvZmlsZS0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOwpAQCAtNTAsMTkgKzQ4LDE0IEBACiAgICAgcmV0dXJuIG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKTsKIH0KIAotdWludDMyX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldE9wZW5SZWZDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRPcGVuQ291bnQoKTsKLX0KLQogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdAogewogICAgIHJldHVybiBtSWQ7CiB9CiAKLWF1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppbnB1dFNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0CithdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c291cmNlKCkgY29uc3QKIHsKLSAgICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGFjdGl2ZU9ubHkpOworICAgIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCkuc291cmNlOwogfQogCiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKQEAgLTgzLDcgKzc2LDcgQEAKICAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwogICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKICAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOwotICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IGlucHV0U291cmNlKCk7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gc291cmNlKCk7CiB9CiAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdApAQCAtMTE4LDU3ICsxMTEsNTUgQEAKICAgICBtUHJlZW1wdGVkU2Vzc2lvbnMuY2xlYXIoKTsKIH0KIAotYm9vbCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5oYXNBY3RpdmVTZXNzaW9uKCk7Ci19Ci0KIGJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKIHsKLSAgICByZXR1cm4gbVNlc3Npb25zLmlzU291cmNlQWN0aXZlKHNvdXJjZSk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpICYmCisgICAgICAgICAgICAoKGNsaWVudC0+c291cmNlKCkgPT0gc291cmNlKSB8fAorICAgICAgICAgICAgICAgICgoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNsaWVudC0+c291cmNlKCkgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWF1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAorYXVkaW9fYXR0cmlidXRlc190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCkgY29uc3QKIHsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUIH07CiAKLSAgICByZXR1cm4gbVNlc3Npb25zLmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShhY3RpdmVPbmx5KTsKKyAgICBmb3IgKGJvb2wgYWN0aXZlT25seSA6IHsgdHJ1ZSwgZmFsc2UgfSkgeworICAgICAgICBpbnQzMl90IHRvcFByaW9yaXR5ID0gLTE7CisgICAgICAgIGFwcF9zdGF0ZV90IHRvcFN0YXRlID0gQVBQX1NUQVRFX0lETEU7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgIWNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcHBfc3RhdGVfdCBjdXJTdGF0ZSA9IGNsaWVudC0+YXBwU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChjdXJTdGF0ZSA+PSB0b3BTdGF0ZSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgY3VyUHJpb3JpdHkgPSBzb3VyY2VfcHJpb3JpdHkoY2xpZW50LT5zb3VyY2UoKSk7CisgICAgICAgICAgICAgICAgaWYgKGN1clByaW9yaXR5ID4gdG9wUHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IGNsaWVudC0+YXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgICAgICB0b3BQcmlvcml0eSA9IGN1clByaW9yaXR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3BTdGF0ZSA9IGN1clN0YXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CiB9CiAKIGJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzU291bmRUcmlnZ2VyKCkgY29uc3QgewotICAgIC8vIHNvdW5kIHRyaWdnZXIgYW5kIG5vbiBzb3VuZCB0cmlnZ2VyIHNlc3Npb25zIGFyZSBub3QgbWl4ZWQKLSAgICAvLyBvbiBhIGdpdmVuIGlucHV0Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUF0KDApLT5pc1NvdW5kVHJpZ2dlcigpOwotfQotCi1zcDxBdWRpb1Nlc3Npb24+IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRBdWRpb1Nlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0IHsKLSAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb24pOwotfQotCi1BdWRpb1Nlc3Npb25Db2xsZWN0aW9uIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRBdWRpb1Nlc3Npb25zKGJvb2wgYWN0aXZlT25seSkgY29uc3QKLXsKLSAgICBpZiAoYWN0aXZlT25seSkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zLmdldEFjdGl2ZVNlc3Npb25zKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uczsKKyAgICAvLyBzb3VuZCB0cmlnZ2VyIGFuZCBub24gc291bmQgdHJpZ2dlciBjbGllbnRzIGFyZSBub3QgbWl4ZWQgb24gYSBnaXZlbiBpbnB1dAorICAgIC8vIHNvIGNoZWNrIG9ubHkgZmlyc3QgY2xpZW50CisgICAgaWYgKGdldENsaWVudENvdW50KCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotfQotCi1zaXplX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEF1ZGlvU2Vzc2lvbkNvdW50KGJvb2wgYWN0aXZlT25seSkgY29uc3QKLXsKLSAgICBpZiAoYWN0aXZlT25seSkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zLmdldEFjdGl2ZVNlc3Npb25Db3VudCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnMuc2l6ZSgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmFkZEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pIHsKLSAgICByZXR1cm4gbVNlc3Npb25zLmFkZFNlc3Npb24oc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLCAvKkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciovdGhpcyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpyZW1vdmVBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIHsKLSAgICByZXR1cm4gbVNlc3Npb25zLnJlbW92ZVNlc3Npb24oc2Vzc2lvbik7CisgICAgcmV0dXJuIGdldENsaWVudEl0ZXJhYmxlKCkuYmVnaW4oKS0+aXNTb3VuZFRyaWdnZXIoKTsKIH0KIAogYXVkaW9fcGF0Y2hfaGFuZGxlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldFBhdGNoSGFuZGxlKCkgY29uc3QKQEAgLTE3OSw3ICsxNzAsMTEgQEAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBtUGF0Y2hIYW5kbGUgPSBoYW5kbGU7Ci0gICAgbVNlc3Npb25zLm9uU2Vzc2lvbkluZm9VcGRhdGUoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwgY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogYXVkaW9fY29uZmlnX2Jhc2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0Q29uZmlnKCkgY29uc3QKQEAgLTE5MCw4ICsxODUsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6b3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCkKQEAgLTIwOCwyNCArMjAyLDI2IEBACiAKICAgICBtRGV2aWNlID0gZGV2aWNlOwogCi0gICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAlMDh4IGFkZHJlc3MgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICBtRGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAorICAgICAgICAgIG1EZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBtRGV2aWNlLT50eXBlKCk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQobVByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS0+YWRkcmVzcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgIT0gZGV2aWNlLAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZS0+dHlwZSgpICE9IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3BlbklucHV0IHJldHVybmVkIGRldmljZSAlMDh4IHdoZW4gZ2l2ZW4gZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLT50eXBlKCksIGRldmljZVR5cGUpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCppbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3BlbklucHV0IHJldHVybmVkIGlucHV0IGhhbmRsZSAlZCBmb3IgZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKmlucHV0LCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuSW5wdXQgcmV0dXJuZWQgaW5wdXQgaGFuZGxlICVkIGZvciBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKmlucHV0LCBtRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICBtU2FtcGxpbmdSYXRlID0gbENvbmZpZy5zYW1wbGVfcmF0ZTsKICAgICAgICAgbUNoYW5uZWxNYXNrID0gbENvbmZpZy5jaGFubmVsX21hc2s7CiAgICAgICAgIG1Gb3JtYXQgPSBsQ29uZmlnLmZvcm1hdDsKQEAgLTIzOSw3ICsyMzUsNyBAQAogCiBzdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c3RhcnQoKQogewotICAgIGlmIChnZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKICAgICAgICAgaWYgKCFtUHJvZmlsZS0+Y2FuU3RhcnROZXdJbygpKSB7CiAgICAgICAgICAgICBBTE9HSSgiJXMgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50ICVkIiwgX19mdW5jX18sIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yNjIsNDIgKzI1OCwxODkgQEAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmNsb3NlKCkKIHsKICAgICBpZiAobUlvSGFuZGxlICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIC8vIGNsZWFuIHVwIGFjdGl2ZSBjbGllbnRzIGlmIGFueSAoY2FuIGhhcHBlbiBpZiBjbG9zZSgpIGlzIGNhbGxlZCB0byBmb3JjZQorICAgICAgICAvLyBjbGllbnRzIHRvIHJlY29ubmVjdAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGNsaWVudCB3aXRoIHBvcnQgSUQgJWQgc3RpbGwgYWN0aXZlIG9uIGlucHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+cG9ydElkKCksIG1JZCk7CisgICAgICAgICAgICAgICAgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOworICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlvSGFuZGxlKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUHJvZmlsZS0+Y3VyT3BlbkNvdW50IDwgMSwgIiVzIHByb2ZpbGUgb3BlbiBjb3VudCAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50KTsKLSAgICAgICAgLy8gZG8gbm90IGNhbGwgc3RvcCgpIGhlcmUgYXMgc3RvcCgpIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBhZnRlcgotICAgICAgICAvLyBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KC0xKSBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBzZXNzaW9ucwotICAgICAgICAvLyBhcmUgc3RpbGwgYWN0aXZlIGF0IHRoaXMgdGltZQotICAgICAgICBpZiAoaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07Ci0gICAgICAgIH0KKwogICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8ICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogbVByb2ZpbGUtPmN1ck9wZW5Db3VudCAlZCA8IG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZC4iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQsIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6YWRkQ2xpZW50KGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ICZjbGllbnQpIHsKKyAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjphZGRDbGllbnQoY2xpZW50KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVuYWJsZWRFZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtRW5hYmxlZEVmZmVjdHMudmFsdWVBdChpKS0+bVNlc3Npb24gPT0gY2xpZW50LT5zZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+dHJhY2tFZmZlY3RFbmFibGVkKG1FbmFibGVkRWZmZWN0cy52YWx1ZUF0KGkpLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2xpZW50KGNsaWVudC0+cG9ydElkKCkpID09IG51bGxwdHIsCisgICAgICAgICIlcyglZCkgZG9lcyBub3QgZXhpc3Qgb24gaW5wdXQgZGVzY3JpcHRvciIsIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpKTsKKyAgICBpZiAoYWN0aXZlID09IGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIGdldElkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIC8vIEhhbmRsZSBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIGludDMyX3Qgb2xkR2xvYmFsQWN0aXZlQ291bnQgPSBtR2xvYmFsQWN0aXZlQ291bnQ7CisgICAgaWYgKCFhY3RpdmUgJiYgbUdsb2JhbEFjdGl2ZUNvdW50IDwgMSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCkgaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxBY3RpdmVDb3VudCAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICAgICAgLy8gbUdsb2JhbEFjdGl2ZUNvdW50ID0gMTsKKyAgICB9CisgICAgY29uc3QgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBtUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICBpZiAoKG9sZEdsb2JhbEFjdGl2ZUNvdW50ID09IDApICYmIChtR2xvYmFsQWN0aXZlQ291bnQgPiAwKSkgeworICAgICAgICBpZiAoKHBvbGljeU1peCAhPSBOVUxMKSAmJiAoKHBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgob2xkR2xvYmFsQWN0aXZlQ291bnQgPiAwKSAmJiAobUdsb2JhbEFjdGl2ZUNvdW50ID09IDApKSB7CisgICAgICAgIGlmICgocG9saWN5TWl4ICE9IE5VTEwpICYmICgocG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQogCi0gICAgbVNlc3Npb25zLmR1bXAoZmQsIDEpOworICAgIGNsaWVudC0+c2V0QWN0aXZlKGFjdGl2ZSk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgaW50IGV2ZW50ID0gYWN0aXZlID8gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCA6IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RPUDsKKyAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKGV2ZW50LCBjbGllbnQpOworCit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oCisgICAgaW50IGV2ZW50LCBjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KQoreworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3Qgc2Vzc2lvbkNvbmZpZyA9IGNsaWVudC0+Y29uZmlnKCk7CisgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgcmVjb3JkQ2xpZW50SW5mb3tjbGllbnQtPnVpZCgpLCBjbGllbnQtPnNlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+c291cmNlKCksIGNsaWVudC0+cG9ydElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlzU2lsZW5jZWQoKX07CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSBnZXRDb25maWcoKTsKKworICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHM7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZWZmZWN0c0xpc3QgPSBjbGllbnQtPmdldEVuYWJsZWRFZmZlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBjbGllbnRFZmZlY3RzLnB1c2hfYmFjayhlZmZlY3RzTGlzdC52YWx1ZUF0KGkpLT5tRGVzYyk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0czsKKyAgICBlZmZlY3RzTGlzdCA9IGdldEVuYWJsZWRFZmZlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBlZmZlY3RzLnB1c2hfYmFjayhlZmZlY3RzTGlzdC52YWx1ZUF0KGkpLT5tRGVzYyk7CisgICAgfQorCisgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmcmVjb3JkQ2xpZW50SW5mbywgJnNlc3Npb25Db25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEVmZmVjdHMsICZjb25maWcsIGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaEhhbmRsZSwgc291cmNlKCkpOworfQorCitSZWNvcmRDbGllbnRWZWN0b3IgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldENsaWVudHNGb3JTZXNzaW9uKAorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoY2xpZW50LT5zZXNzaW9uKCkgPT0gc2Vzc2lvbikgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xpZW50czsKK30KKworUmVjb3JkQ2xpZW50VmVjdG9yIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHksIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5KSBjb25zdAoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUIHx8IHNvdXJjZSA9PSBjbGllbnQtPnNvdXJjZSgpKQorICAgICAgICAgICAgJiYgKCFwcmVmZXJyZWREZXZpY2VPbmx5IHx8IGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkpKSB7CisgICAgICAgICAgICBjbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbGllbnRzOworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWRFZmZlY3RzLnJlcGxhY2VWYWx1ZUZvcihlZmZlY3QtPm1JZCwgZWZmZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVtb3ZlSXRlbShlZmZlY3QtPm1JZCk7CisgICAgfQorCisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBnZXRDbGllbnRzRm9yU2Vzc2lvbigoYXVkaW9fc2Vzc2lvbl90KWVmZmVjdC0+bVNlc3Npb24pOworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBjbGllbnRFZmZlY3QgPSBjbGllbnQtPmdldEVuYWJsZWRFZmZlY3RzKCkuZ2V0RWZmZWN0KGVmZmVjdC0+bUlkKTsKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gKGVuYWJsZWQgJiYgY2xpZW50RWZmZWN0ID09IG51bGxwdHIpCisgICAgICAgICAgICAgICAgfHwgKCFlbmFibGVkICYmIGNsaWVudEVmZmVjdCAhPSBudWxscHRyKTsKKyAgICAgICAgY2xpZW50LT50cmFja0VmZmVjdEVuYWJsZWQoZWZmZWN0LCBlbmFibGVkKTsKKyAgICAgICAgaWYgKGNoYW5nZWQgJiYgY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJULCBjbGllbnQpOworICAgICAgICB9CisgICAgfQorfQorCitFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0RW5hYmxlZEVmZmVjdHMoKSBjb25zdAoreworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVuYWJsZWRFZmZlY3RzOworICAgIC8vIHJlcG9ydCBlZmZlY3RzIGZvciBoaWdoZXN0IHByaW9yaXR5IGFjdGl2ZSBzb3VyY2UgYXMgYXBwbGllZCB0byBhbGwgY2xpZW50cworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0KKyAgICAgICAgY2xpZW50c0xpc3QodHJ1ZSAvKmFjdGl2ZU9ubHkqLywgc291cmNlKCksIGZhbHNlIC8qcHJlZmVycmVkRGV2aWNlT25seSovKTsKKyAgICBpZiAoY2xpZW50cy5zaXplKCkgPiAwKSB7CisgICAgICAgIGVuYWJsZWRFZmZlY3RzID0gY2xpZW50c1swXS0+Z2V0RW5hYmxlZEVmZmVjdHMoKTsKKyAgICB9CisgICAgcmV0dXJuIGVuYWJsZWRFZmZlY3RzOworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKSB7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBjbGllbnRzTGlzdChmYWxzZSAvKmFjdGl2ZU9ubHkqLyk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgaWYgKHVpZCA9PSBjbGllbnQtPnVpZCgpKSB7CisgICAgICAgICAgICBib29sIHdhc1NpbGVuY2VkID0gY2xpZW50LT5pc1NpbGVuY2VkKCk7CisgICAgICAgICAgICBjbGllbnQtPnNldEFwcFN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpICYmIHdhc1NpbGVuY2VkICE9IGNsaWVudC0+aXNTaWxlbmNlZCgpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJULCBjbGllbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgZ2V0SWQoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlcyAlc1xuIiwgbURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBnZXRFbmFibGVkRWZmZWN0cygpLmR1bXAoZHN0LCAxIC8qc3BhY2VzKi8sIGZhbHNlIC8qdmVyYm9zZSovKTsKKyAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvUmVjb3JkIENsaWVudHM6XG4iKTsKKyAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjpkdW1wKGRzdCk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CiB9CiAKIGJvb2wgQXVkaW9JbnB1dENvbGxlY3Rpb246OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKQEAgLTMyMiw1NiArNDY1LDc0IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXVpbnQzMl90IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjphY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykgY29uc3QKK3VpbnQzMl90IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjphY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0CiB7CiAgICAgdWludDMyX3QgY291bnQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSB2YWx1ZUF0KGkpOwogICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5pc0FjdGl2ZSgpICYmCi0gICAgICAgICAgICAgICAgKChkZXZpY2VzID09IEFVRElPX0RFVklDRV9JTl9ERUZBVUxUKSB8fAotICAgICAgICAgICAgICAgICAoKGlucHV0RGVzY3JpcHRvci0+bURldmljZSAmIGRldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkpKSB7CisgICAgICAgICAgICAgICAgKGRldmljZXMuaXNFbXB0eSgpIHx8IGRldmljZXMuY29udGFpbnMoaW5wdXREZXNjcmlwdG9yLT5nZXREZXZpY2UoKSkpKSB7CiAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBjb3VudDsKIH0KIAotVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0QWN0aXZlSW5wdXRzKGJvb2wgaWdub3JlVmlydHVhbElucHV0cykKK1ZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldEFjdGl2ZUlucHV0cygpCiB7CiAgICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHM7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKChpbnB1dERlc2NyaXB0b3ItPmlzQWN0aXZlKCkpCi0gICAgICAgICAgICAgICAgJiYgKCFpZ25vcmVWaXJ0dWFsSW5wdXRzIHx8Ci0gICAgICAgICAgICAgICAgICAgICFpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2NyaXB0b3ItPm1EZXZpY2UpKSkgeworICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5pc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICBhY3RpdmVJbnB1dHMuYWRkKGlucHV0RGVzY3JpcHRvcik7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGFjdGl2ZUlucHV0czsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3QKK3NwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0SW5wdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IHZhbHVlRm9yKGhhbmRsZSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBpbnB1dERlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOwotICAgIHJldHVybiBkZXZpY2VzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2M7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXR1c190IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgQXVkaW9JbnB1dENvbGxlY3Rpb246OnRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBJbnB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzYy0+bUlvSGFuZGxlID09IGVmZmVjdC0+bUlvKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjLT50cmFja0VmZmVjdEVuYWJsZWQoZWZmZWN0LCBlbmFibGVkKTsKKyAgICAgICAgfQogICAgIH0KK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK3ZvaWQgQXVkaW9JbnB1dENvbGxlY3Rpb246OmNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZSgKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGlzY29ubmVjdGVkRGV2aWNlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogaW5wdXREZXNjLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5wcmVmZXJyZWREZXZpY2VJZCgpID09IGRpc2Nvbm5lY3RlZERldmljZS0+Z2V0SWQoKSkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0UHJlZmVycmVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kKCJcbklucHV0cyBkdW1wOlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBJbnB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CisgICAgfQogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAppbmRleCA5OWI0NWM4Li45N2I3YTAxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKQEAgLTE5LDEwICsxOSwxMiBAQAogCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KICNpbmNsdWRlICJBdWRpb091dHB1dERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJBdWRpb1BvbGljeU1peC5oIgogI2luY2x1ZGUgIklPUHJvZmlsZS5oIgogI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgogI2luY2x1ZGUgIlZvbHVtZS5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KIApAQCAtMzQsMTkgKzM2LDggQEAKIAogQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBtUG9ydChwb3J0KSwgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKQorICAgIDogbVBvcnQocG9ydCksIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQogewotICAgIC8vIGNsZWFyIHVzYWdlIGNvdW50IGZvciBhbGwgc3RyZWFtIHR5cGVzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgbVJlZkNvdW50W2ldID0gMDsKLSAgICAgICAgbUN1clZvbHVtZVtpXSA9IC0xLjA7Ci0gICAgICAgIG1NdXRlQ291bnRbaV0gPSAwOwotICAgICAgICBtU3RvcFRpbWVbaV0gPSAwOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOwotICAgIH0KICAgICBpZiAobVBvcnQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBtUG9ydC0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOwogICAgICAgICBpZiAobVBvcnQtPm1HYWlucy5zaXplKCkgPiAwKSB7CkBAIC01NSw0OCArNDYsODggQEAKICAgICB9CiB9CiAKK2F1ZGlvX2NvbmZpZ19iYXNlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRDb25maWcoKSBjb25zdAoreworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0geyAuc2FtcGxlX3JhdGUgPSBtU2FtcGxpbmdSYXRlLCAuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgLmZvcm1hdCA9IG1Gb3JtYXQgfTsKKyAgICByZXR1cm4gY29uZmlnOworfQorCiBhdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRNb2R1bGVIYW5kbGUoKSBjb25zdAogewogICAgIHJldHVybiBtUG9ydC5nZXQoKSAhPSBudWxscHRyID8gbVBvcnQtPmdldE1vZHVsZUhhbmRsZSgpIDogQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwogfQogCithdWRpb19wYXRjaF9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldFBhdGNoSGFuZGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVBhdGNoSGFuZGxlOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIG1QYXRjaEhhbmRsZSA9IGhhbmRsZTsKK30KKwogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlkOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAotewotICAgIHJldHVybiBtRGV2aWNlOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKLXsKLSAgICByZXR1cm4gbURldmljZTsKLX0KLQogYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykKIHsKLSAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5zdWJPdXRwdXQxKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5zdWJPdXRwdXQyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBoYXNTYW1lSHdNb2R1bGVBcyhvdXRwdXREZXNjKTsKLSAgICB9CisgICAgcmV0dXJuIGhhc1NhbWVId01vZHVsZUFzKG91dHB1dERlc2MpOwogfQogCi12b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFN0b3BUaW1lKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgbnNlY3NfdCBzeXNUaW1lKQogewotICAgIGlmICgoZGVsdGEgKyAoaW50KW1SZWZDb3VudFtzdHJlYW1dKSA8IDApIHsKLSAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBmb3Igc3RyZWFtICVkLCByZWZDb3VudCAlZCIsCi0gICAgICAgICAgICAgIGRlbHRhLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKLSAgICAgICAgbVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgIG1Wb2x1bWVBY3Rpdml0aWVzW2NsaWVudC0+dm9sdW1lU291cmNlKCldLnNldFN0b3BUaW1lKHN5c1RpbWUpOworICAgIG1Sb3V0aW5nQWN0aXZpdGllc1tjbGllbnQtPnN0cmF0ZWd5KCldLnNldFN0b3BUaW1lKHN5c1RpbWUpOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpCit7CisgICAgYXV0byBjbGllbnRJdGVyID0gc3RkOjpmaW5kKGJlZ2luKG1BY3RpdmVDbGllbnRzKSwgZW5kKG1BY3RpdmVDbGllbnRzKSwgY2xpZW50KTsKKyAgICBpZiAoYWN0aXZlID09IChjbGllbnRJdGVyICE9IGVuZChtQWN0aXZlQ2xpZW50cykpKSB7CisgICAgICAgIEFMT0dXKCIlcyglcyk6IGlnbm9yZWQgYWN0aXZlOiAlZCwgY3VycmVudCBzdHJlYW0gY291bnQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgY2xpZW50LT50b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgYWN0aXZlLAorICAgICAgICAgICAgICBtUm91dGluZ0FjdGl2aXRpZXMuYXQoY2xpZW50LT5zdHJhdGVneSgpKS5nZXRBY3Rpdml0eUNvdW50KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1SZWZDb3VudFtzdHJlYW1dICs9IGRlbHRhOwotICAgIEFMT0dWKCJjaGFuZ2VSZWZDb3VudCgpIHN0cmVhbSAlZCwgY291bnQgJWQiLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKKyAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIG1BY3RpdmVDbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BY3RpdmVDbGllbnRzLmVyYXNlKGNsaWVudEl0ZXIpOworICAgIH0KKyAgICBjb25zdCBpbnQgZGVsdGEgPSBhY3RpdmUgPyAxIDogLTE7CisgICAgLy8gSWYgcHMgaXMgdW5rbm93biwgaXQgaXMgdGltZSB0byB0cmFjayBpdCEKKyAgICBtUm91dGluZ0FjdGl2aXRpZXNbY2xpZW50LT5zdHJhdGVneSgpXS5jaGFuZ2VBY3Rpdml0eUNvdW50KGRlbHRhKTsKKyAgICBtVm9sdW1lQWN0aXZpdGllc1tjbGllbnQtPnZvbHVtZVNvdXJjZSgpXS5jaGFuZ2VBY3Rpdml0eUNvdW50KGRlbHRhKTsKKworICAgIC8vIEhhbmRsZSBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIGludDMyX3Qgb2xkR2xvYmFsQWN0aXZlQ291bnQgPSBtR2xvYmFsQWN0aXZlQ291bnQ7CisgICAgaWYgKCFhY3RpdmUgJiYgbUdsb2JhbEFjdGl2ZUNvdW50IDwgMSkgeworICAgICAgICBBTE9HVygiJXMoJXMpOiBpbnZhbGlkIGRlYWN0aXZhdGlvbiB3aXRoIGdsb2JhbFJlZkNvdW50ICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksIG1HbG9iYWxBY3RpdmVDb3VudCk7CisgICAgICAgIG1HbG9iYWxBY3RpdmVDb3VudCA9IDE7CisgICAgfQorICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKKworICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBtUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICBpZiAoKHBvbGljeU1peCAhPSBOVUxMKSAmJiAoKHBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgeworICAgICAgICBpZiAoKG9sZEdsb2JhbEFjdGl2ZUNvdW50ID09IDApIHx8IChtR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkpIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgbUdsb2JhbEFjdGl2ZUNvdW50ID4gMCA/IE1JWF9TVEFURV9NSVhJTkcgOiBNSVhfU1RBVEVfSURMRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xpZW50LT5zZXRBY3RpdmUoYWN0aXZlKTsKK30KKworYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2cywgdWludDMyX3QgaW5QYXN0TXMsIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKK3sKKyAgICByZXR1cm4gKHZzID09IFZPTFVNRV9TT1VSQ0VfTk9ORSkgPworICAgICAgICAgICAgICAgIGlzQWN0aXZlKGluUGFzdE1zKSA6IChtVm9sdW1lQWN0aXZpdGllcy5maW5kKHZzKSAhPSBzdGQ6OmVuZChtVm9sdW1lQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmlzQWN0aXZlKGluUGFzdE1zLCBzeXNUaW1lKSA6IGZhbHNlKTsKIH0KIAogYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zKSBjb25zdApAQCAtMTA1LDU0ICsxMzYsMzUgQEAKICAgICBpZiAoaW5QYXN0TXMgIT0gMCkgewogICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgIGlmIChpID09IEFVRElPX1NUUkVBTV9QQVRDSCkgeworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Wb2x1bWVBY3Rpdml0aWVzKSB7CisgICAgICAgIGlmIChpdGVyLmZpcnN0ID09IHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9QQVRDSCkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLmlzQWN0aXZlKGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGlmIChtUmVmQ291bnRbc3RyZWFtXSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoaW5QYXN0TXMgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChzeXNUaW1lID09IDApIHsKLSAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICB9Ci0gICAgaWYgKG5zMm1zKHN5c1RpbWUgLSBtU3RvcFRpbWVbc3RyZWFtXSkgPCBpblBhc3RNcykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0KIGJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgX191bnVzZWQpCiB7CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgX191bnVzZWQsCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICYvKnN0cmVhbXMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IC8qZGV2aWNlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7CiAgICAgLy8gV2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB2b2x1bWUgaWY6CiAgICAgLy8gLSB0aGUgZmxvYXQgdmFsdWUgcmV0dXJuZWQgYnkgY29tcHV0ZVZvbHVtZSgpIGNoYW5nZWQKICAgICAvLyAtIHRoZSBmb3JjZSBmbGFnIGlzIHNldAotICAgIGlmICh2b2x1bWUgIT0gbUN1clZvbHVtZVtzdHJlYW1dIHx8IGZvcmNlKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRWb2x1bWUoKSBmb3Igc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgc3RyZWFtLCB2b2x1bWUsIGRlbGF5TXMpOwotICAgICAgICBtQ3VyVm9sdW1lW3N0cmVhbV0gPSB2b2x1bWU7CisgICAgaWYgKHZvbHVtZURiICE9IGdldEN1clZvbHVtZSh2b2x1bWVTb3VyY2UpIHx8IGZvcmNlKSB7CisgICAgICAgIEFMT0dWKCIlcyBmb3Igdm9sdW1lU3JjICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgX19mdW5jX18sIHZvbHVtZVNvdXJjZSwgdm9sdW1lRGIsIGRlbGF5TXMpOworICAgICAgICBzZXRDdXJWb2x1bWUodm9sdW1lU291cmNlLCB2b2x1bWVEYik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0xODQsMzIgKzE5Niw1NSBAQAogICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCitUcmFja0NsaWVudFZlY3RvciBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSwgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsCi0gICAgICAgICAgICAgICAgIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBUcmFja0NsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FIHx8IHN0cmF0ZWd5ID09IGNsaWVudC0+c3RyYXRlZ3koKSkKKyAgICAgICAgICAgICYmICghcHJlZmVycmVkRGV2aWNlT25seSB8fAorICAgICAgICAgICAgICAgIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmICFjbGllbnQtPmlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkpKSkgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gY2xpZW50czsKK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FueUFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICBbJnZvbHVtZVNvdXJjZVRvSWdub3JlXShjb25zdCBhdXRvICZjbGllbnQpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudC0+dm9sdW1lU291cmNlKCkgIT0gdm9sdW1lU291cmNlVG9JZ25vcmU7IH0pICE9IGVuZChtQWN0aXZlQ2xpZW50cyk7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgbUlkKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXM6ICVzXG4iLCBkZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEdsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Sb3V0aW5nQWN0aXZpdGllcykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByb2R1Y3QgU3RyYXRlZ3kgaWQ6ICVkIiwgaXRlci5maXJzdCk7CisgICAgICAgIGl0ZXIuc2Vjb25kLmR1bXAoZHN0LCA0KTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBWb2x1bWUgQWN0aXZpdGllcyBpZDogJWQiLCBpdGVyLmZpcnN0KTsKKyAgICAgICAgaXRlci5zZWNvbmQuZHVtcChkc3QsIDQpOworICAgIH0KKyAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIGlmICghbUFjdGl2ZUNsaWVudHMuZW1wdHkoKSkgeworICAgICAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgYWN0aXZlIChzdHJlYW0pIGNsaWVudHM6XG4iKTsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBtQWN0aXZlQ2xpZW50cykgeworICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgMiwgaW5kZXgrKyk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIiBcbiIpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmxvZyhjb25zdCBjaGFyKiBpbmRlbnQpCkBAIC0yMjMsNDMgKzI1OCwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCiAgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgY2xpZW50SW50ZXJmYWNlKSwKICAgICBtUHJvZmlsZShwcm9maWxlKSwgbUlvSGFuZGxlKEFVRElPX0lPX0hBTkRMRV9OT05FKSwgbUxhdGVuY3koMCksCi0gICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbVBvbGljeU1peChOVUxMKSwKKyAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLAogICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbURpcmVjdE9wZW5Db3VudCgwKSwKLSAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpLCBtR2xvYmFsUmVmQ291bnQoMCkKKyAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpCiB7CiAgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewogICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcHJvZmlsZS0+Z2V0RmxhZ3MoKTsKICAgICB9CiB9CiAKLXN0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKIH0KIAotYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAorRGV2aWNlVmVjdG9yIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2VzKCkgY29uc3QKIHsKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5tRGV2aWNlIHwgbU91dHB1dDItPm1EZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlOworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1PdXRwdXQxLT5kZXZpY2VzKCk7CisgICAgICAgIGRldmljZXMubWVyZ2UobU91dHB1dDItPmRldmljZXMoKSk7CisgICAgICAgIHJldHVybiBkZXZpY2VzOwogICAgIH0KKyAgICByZXR1cm4gbURldmljZXM7CiB9CiAKIGJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKQogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewogICAgICAgICByZXR1cm4gbU91dHB1dDEtPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKSB8fCBtT3V0cHV0Mi0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpOwpAQCAtMjcxLDEyICsyOTcsMzkgQEAKICAgICB9CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCitEZXZpY2VWZWN0b3IgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKSBjb25zdAogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKSB8IG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcyA9IG1PdXRwdXQxLT5zdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgIHN1cHBvcnRlZERldmljZXMubWVyZ2UobU91dHB1dDItPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWREZXZpY2VzOworICAgIH0KKyAgICByZXR1cm4gbVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydHNEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgY29uc3QKK3sKKyAgICByZXR1cm4gc3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSk7Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRzQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN1cHBvcnRlZERldmljZXMoKS5jb250YWluc0FsbERldmljZXMoZGV2aWNlcyk7Cit9CisKK0RldmljZVZlY3RvciBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICByZXR1cm4gZmlsdGVyZWREZXZpY2VzLmZpbHRlcihkZXZpY2VzKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKG1PdXRwdXQxLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dDItPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOworICAgICAgIHJldHVybiBtUHJvZmlsZS0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2UpOwogICAgIH0KIH0KIApAQCAtMjg5LDQxICszNDIsMTYgQEAKICAgICB9CiB9CiAKLXZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewogICAgIC8vIGZvcndhcmQgdXNhZ2UgY291bnQgY2hhbmdlIHRvIGF0dGFjaGVkIG91dHB1dHMKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbU91dHB1dDEtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgICAgIG1PdXRwdXQxLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBhY3RpdmUpOworICAgICAgICBtT3V0cHV0Mi0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgYWN0aXZlKTsKICAgICB9Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKLQotICAgIC8vIGhhbmRsZSBzdHJlYW0taW5kZXBlbmRlbnQgcmVmIGNvdW50Ci0gICAgdWludDMyX3Qgb2xkR2xvYmFsUmVmQ291bnQgPSBtR2xvYmFsUmVmQ291bnQ7Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbUdsb2JhbFJlZkNvdW50KSA8IDApIHsKLSAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBnbG9iYWxSZWZDb3VudCAlZCIsIGRlbHRhLCBtR2xvYmFsUmVmQ291bnQpOwotICAgICAgICBtR2xvYmFsUmVmQ291bnQgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1HbG9iYWxSZWZDb3VudCArPSBkZWx0YTsKLSAgICB9Ci0gICAgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA9PSAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID4gMCkpIHsKLSAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA+IDApICYmIChtR2xvYmFsUmVmQ291bnQgPT0gMCkpIHsKLSAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjbGllbnQsIGFjdGl2ZSk7CiB9CiAKLQogYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogICAgIC8vIHVuaXQgZ2FpbiBpZiByZXJvdXRpbmcgdG8gZXh0ZXJuYWwgcG9saWN5CkBAIC0zNjQsMzQgKzM5Miw3MiBAQAogICAgICAgICAgICAgbUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCA/IEFVRElPX0xBVEVOQ1lfTE9XIDogQVVESU9fTEFURU5DWV9OT1JNQUw7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCitib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZzLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1UeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKLSAgICBib29sIGNoYW5nZWQgPSBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWUsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7Ci0KLSAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAvLyBGb3JjZSBWT0lDRV9DQUxMIHRvIHRyYWNrIEJMVUVUT09USF9TQ08gc3RyZWFtIHZvbHVtZSB3aGVuIGJsdWV0b290aCBhdWRpbyBpcwotICAgICAgICAvLyBlbmFibGVkCi0gICAgICAgIGZsb2F0IHZvbHVtZSA9IFZvbHVtZTo6RGJUb0FtcGwobUN1clZvbHVtZVtzdHJlYW1dKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lLCBtSW9IYW5kbGUsIGRlbGF5TXMpOwotICAgICAgICB9Ci0gICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXMgPSBzdHJlYW1UeXBlczsKKyAgICBpZiAoIUF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKHZvbHVtZURiLCB2cywgc3RyZWFtVHlwZXMsIGRldmljZSwgZGVsYXlNcywgZm9yY2UpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgaWYgKHN0cmVhbXMuZW1wdHkoKSkgeworICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhBVURJT19TVFJFQU1fTVVTSUMpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZVBvcnQgOiBkZXZpY2VzKCkpIHsKKyAgICAgICAgLy8gQVBNIGxvb3BzIG9uIGFsbCBncm91cCwgc28gZmlsdGVyIG9uIGFjdGl2ZSBncm91cCB0byBzZXQgdGhlIHBvcnQgZ2FpbiwKKyAgICAgICAgLy8gbGV0IHRoZSBvdGhlciBncm91cHMgc2V0IHRoZSBzdHJlYW0gdm9sdW1lIGFzIHBlciBsZWdhY3kKKyAgICAgICAgLy8gVE9ETzogUGFzcyBpbiB0aGUgZGV2aWNlIGFkZHJlc3MgYW5kIGNoZWNrIGFnYWluc3QgaXQuCisgICAgICAgIGlmIChkZXZpY2UgPT0gZGV2aWNlUG9ydC0+dHlwZSgpICYmCisgICAgICAgICAgICAgICAgZGV2aWNlUG9ydC0+aGFzR2FpbkNvbnRyb2xsZXIodHJ1ZSkgJiYgaXNBY3RpdmUodnMpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IGRldmljZSAlcyBoYXMgZ2FpbiBjb250cm9sbGVyIiwgX19mdW5jX18sIGRldmljZVBvcnQtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAvLyBAdG9kbzogaGVyZSB3ZSBtaWdodCBiZSBpbiB0cm91YmxlIGlmIHRoZSBTd091dHB1dCBoYXMgc2V2ZXJhbCBhY3RpdmUgY2xpZW50cyB3aXRoCisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgVm9sdW1lIFNvdXJjZSAob3IgaWYgd2UgYWxsb3cgc2V2ZXJhbCBjdXJ2ZXMgd2l0aGluIHNhbWUgdm9sdW1lIGdyb3VwKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEB0b2RvOiBkZWZhdWx0IHN0cmVhbSB2b2x1bWUgdG8gbWF4ICgwKSB3aGVuIHVzaW5nIEhXIFBvcnQgZ2Fpbj8KKyAgICAgICAgICAgIGZsb2F0IHZvbHVtZUFtcGwgPSBWb2x1bWU6OkRiVG9BbXBsKDApOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBzdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lQW1wbCwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXVkaW9HYWlucyBnYWlucyA9IGRldmljZVBvcnQtPmdldEdhaW5zKCk7CisgICAgICAgICAgICBpbnQgZ2Fpbk1pblZhbHVlSW5NYiA9IGdhaW5zWzBdLT5nZXRNaW5WYWx1ZUluTWIoKTsKKyAgICAgICAgICAgIGludCBnYWluTWF4VmFsdWVJbk1iID0gZ2FpbnNbMF0tPmdldE1heFZhbHVlSW5NYigpOworICAgICAgICAgICAgaW50IGdhaW5TdGVwVmFsdWVJbk1iID0gZ2FpbnNbMF0tPmdldFN0ZXBWYWx1ZUluTWIoKTsKKyAgICAgICAgICAgIGludCBnYWluVmFsdWVNYiA9ICgodm9sdW1lRGIgKiAxMDApLyBnYWluU3RlcFZhbHVlSW5NYikgKiBnYWluU3RlcFZhbHVlSW5NYjsKKyAgICAgICAgICAgIGdhaW5WYWx1ZU1iID0gc3RkOjptYXgoZ2Fpbk1pblZhbHVlSW5NYiwgc3RkOjptaW4oZ2FpblZhbHVlTWIsIGdhaW5NYXhWYWx1ZUluTWIpKTsKKworICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnID0ge307CisgICAgICAgICAgICBkZXZpY2VQb3J0LT50b0F1ZGlvUG9ydENvbmZpZygmY29uZmlnKTsKKyAgICAgICAgICAgIGNvbmZpZy5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgICAgICAgICBjb25maWcuZ2Fpbi52YWx1ZXNbMF0gPSBnYWluVmFsdWVNYjsKKyAgICAgICAgICAgIHJldHVybiBtQ2xpZW50SW50ZXJmYWNlLT5zZXRBdWRpb1BvcnRDb25maWcoJmNvbmZpZywgMCkgPT0gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gRm9yY2UgVk9JQ0VfQ0FMTCB0byB0cmFjayBCTFVFVE9PVEhfU0NPIHN0cmVhbSB2b2x1bWUgd2hlbiBibHVldG9vdGggYXVkaW8gaXMgZW5hYmxlZAorICAgIGZsb2F0IHZvbHVtZUFtcGwgPSBWb2x1bWU6OkRiVG9BbXBsKGdldEN1clZvbHVtZSh2cykpOworICAgIGlmIChoYXNTdHJlYW0oc3RyZWFtcywgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pKSB7CisgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lQW1wbCwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBzdHJlYW1zKSB7CisgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgJWQgZm9yIHZvbHVtZVNvdXJjZSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCBzdHJlYW09JXMiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgbUlvSGFuZGxlLCB2cywgdm9sdW1lRGIsIGRlbGF5TXMsIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6b3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCkKIHsKKyAgICBtRGV2aWNlcyA9IGRldmljZXM7CisgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyA9IGRldmljZXMuZ2V0Rmlyc3RWYWxpZEFkZHJlc3MoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2aWNlcy50eXBlcygpOworCiAgICAgYXVkaW9fY29uZmlnX3QgbENvbmZpZzsKICAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKICAgICAgICAgbENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKQEAgLTQwMiw3ICs0NjgsNiBAQAogICAgICAgICBsQ29uZmlnID0gKmNvbmZpZzsKICAgICB9CiAKLSAgICBtRGV2aWNlID0gZGV2aWNlOwogICAgIC8vIGlmIHRoZSBzZWxlY3RlZCBwcm9maWxlIGlzIG9mZmxvYWRlZCBhbmQgbm8gb2ZmbG9hZCBpbmZvIHdhcyBzcGVjaWZpZWQsCiAgICAgLy8gY3JlYXRlIGEgZGVmYXVsdCBvbmUKICAgICBpZiAoKG1Qcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgJiYKQEAgLTQyMCwxOSArNDg1LDE5IEBACiAKICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1GbGFncyB8IGZsYWdzKTsKIAotICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggYWRkcmVzcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgIG1EZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIG1Qcm9maWxlLmdldCgpLCBtUHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKyAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAorICAgICAgICAgIG1EZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxhdGVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSAhPSBkZXZpY2UsCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlcy50eXBlcygpICE9IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuT3V0cHV0IHJldHVybmVkIGRldmljZSAlMDh4IHdoZW4gZ2l2ZW4gZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlcy50eXBlcygpLCBkZXZpY2UpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUsCkBAIC00OTEsNiArNTU2LDE3IEBACiB2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjbG9zZSgpCiB7CiAgICAgaWYgKG1Jb0hhbmRsZSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAvLyBjbGVhbiB1cCBhY3RpdmUgY2xpZW50cyBpZiBhbnkgKGNhbiBoYXBwZW4gaWYgY2xvc2UoKSBpcyBjYWxsZWQgdG8gZm9yY2UKKyAgICAgICAgLy8gY2xpZW50cyB0byByZWNvbm5lY3QKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjbGllbnQgd2l0aCBwb3J0IElEICVkIHN0aWxsIGFjdGl2ZSBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpLCBtSWQpOworICAgICAgICAgICAgICAgIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKICAgICAgICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtSW9IYW5kbGUsIHBhcmFtLnRvU3RyaW5nKCkpOwpAQCAtNDk5LDExICs1NzUsNiBAQAogCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7Ci0gICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpCi0gICAgICAgIC8vIGFuZCB3ZSBkb24ndCBrbm93IGhvdyBtYW55IHN0cmVhbXMgYXJlIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHRpbWUKLSAgICAgICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudC0tOwotICAgICAgICB9CiAgICAgICAgIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQtLTsKICAgICAgICAgbUlvSGFuZGxlID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgfQpAQCAtNTM0LDU1ICs2MDUsNDIgQEAKIH0KIAogLy8gSHdBdWRpb091dHB1dERlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24KLUh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2UsCitId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6SHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHNvdXJjZS0+bURldmljZSwgY2xpZW50SW50ZXJmYWNlKSwKKyAgICA6IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihzb3VyY2UtPnNyY0RldmljZSgpLCBjbGllbnRJbnRlcmZhY2UpLAogICAgICAgbVNvdXJjZShzb3VyY2UpCiB7CiB9CiAKLXN0YXR1c190IEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGZkKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlNvdXJjZTpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBtU291cmNlLT5kdW1wKGZkKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYXVkaW9fZGV2aWNlc190IEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKLXsKLSAgICByZXR1cm4gbURldmljZTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKKyAgICBkc3QtPmFwcGVuZCgiU291cmNlOlxuIik7CisgICAgbVNvdXJjZS0+ZHVtcChkc3QsIDAsIDApOwogfQogCiB2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKIHsKLSAgICBtU291cmNlLT5tRGV2aWNlLT50b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisgICAgbVNvdXJjZS0+c3JjRGV2aWNlKCktPnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKIH0KIAogdm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CiB7Ci0gICAgbVNvdXJjZS0+bURldmljZS0+dG9BdWRpb1BvcnQocG9ydCk7CisgICAgbVNvdXJjZS0+c3JjRGV2aWNlKCktPnRvQXVkaW9Qb3J0KHBvcnQpOwogfQogCiAKLWJvb2wgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCitib29sIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKLSAgICBib29sIGNoYW5nZWQgPSBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWUsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CisgICAgYm9vbCBjaGFuZ2VkID0KKyAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUodm9sdW1lRGIsIHZvbHVtZVNvdXJjZSwgc3RyZWFtcywgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CiAKICAgICBpZiAoY2hhbmdlZCkgewogICAgICAgLy8gVE9ETzogdXNlIGdhaW4gY29udHJvbGxlciBvbiBzb3VyY2UgZGV2aWNlIGlmIGFueSB0byBhZGp1c3Qgdm9sdW1lCkBAIC01OTEsMzkgKzY0OSwzOCBAQAogfQogCiAvLyBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbgotYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAorYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CiAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB0aGlzLT52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlTG9jYWxseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZUxvY2FsbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CiAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB0aGlzLT52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkKLSAgICAgICAgICAgICAgICAmJiAoKG91dHB1dERlc2MtPmRldmljZSgpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgPT0gMCkpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSwgaW5QYXN0TXMsIHN5c1RpbWUpCisgICAgICAgICAgICAgICAgJiYgKChvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpID09IDApKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQWN0aXZlUmVtb3RlbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CiAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICBpZiAoKChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpICE9IDApICYmCi0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgaWYgKCgob3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CiAgICAgICAgICAgICAvLyBkbyBub3QgY29uc2lkZXIgcmUgcm91dGluZyAod2hlbiB0aGUgb3V0cHV0IGlzIGdvaW5nIHRvIGEgZHluYW1pYyBwb2xpY3kpCiAgICAgICAgICAgICAvLyBhcyAicmVtb3RlIHBsYXliYWNrIgogICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1Qb2xpY3lNaXggPT0gTlVMTCkgewpAQCAtNjM0LDExICs2OTEsMjggQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdF9zdHJhdGVneV90IHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLCBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3RoZXJEZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGRlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChvdGhlckRlc2MpICYmCisgICAgICAgICAgICAgICAgb3RoZXJEZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHBzLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogYXVkaW9faW9faGFuZGxlX3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldEEyZHBPdXRwdXQoKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmIG91dHB1dERlc2MtPmRldmljZSgpICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgeworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmCisgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCAmJgorICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoCisgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSkgewogICAgICAgICAgICAgcmV0dXJuIHRoaXMtPmtleUF0KGkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjUwLDEyICs3MjQsMTEgQEAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcHJpbWFyeU91dHB1dCA9IGdldFByaW1hcnlPdXRwdXQoKTsKIAogICAgIGlmICgocHJpbWFyeU91dHB1dCAhPSBOVUxMKSAmJiAocHJpbWFyeU91dHB1dC0+bVByb2ZpbGUgIT0gTlVMTCkKLSAgICAgICAgJiYgKHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlLT5tTW9kdWxlICE9IE5VTEwpKSB7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBwcmltYXJ5SHdNb2R1bGUgPSBwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+bU1vZHVsZTsKLSAgICAgICAgVmVjdG9yIDxzcDxJT1Byb2ZpbGU+PiBwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlId01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKHByaW1hcnlId01vZHVsZU91dHB1dFByb2ZpbGVzW2ldLT5zdXBwb3J0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApKSB7CisgICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+Z2V0TW9kdWxlKCkgIT0gTlVMTCkpIHsKKyAgICAgICAgc3A8SHdNb2R1bGU+IHByaW1hcnlId01vZHVsZSA9IHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlLT5nZXRNb2R1bGUoKTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm91dHB1dFByb2ZpbGUgOiBwcmltYXJ5SHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRQcm9maWxlLT5zdXBwb3J0c0RldmljZVR5cGVzKEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY5MCw4OSArNzYzLDU5IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIGNvbnN0CitzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldE91dHB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBmb3IgKHNpemVfdCBzID0gMCA7IHMgPCBBVURJT19TVFJFQU1fQ05UIDsgcysrKSB7Ci0gICAgICAgIGlmIChzID09IChzaXplX3QpIHN0cmVhbVRvSWdub3JlKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldENsaWVudChwb3J0SWQpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXREZXNjOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc10gIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Y2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKAorICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGlzY29ubmVjdGVkRGV2aWNlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBvdXRwdXREZXNjLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5wcmVmZXJyZWREZXZpY2VJZCgpID09IGRpc2Nvbm5lY3RlZERldmljZS0+Z2V0SWQoKSkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0UHJlZmVycmVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwogfQogCi1hdWRpb19kZXZpY2VzX3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdAordm9pZCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUZvcihoYW5kbGUpOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCk7Ci0gICAgcmV0dXJuIGRldmljZXM7Ci19Ci0KLQotc3RhdHVzX3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogLy8gSHdBdWRpb091dHB1dENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24KLWJvb2wgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK2Jvb2wgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdAordm9pZCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgZm9yIChzaXplX3QgcyA9IDAgOyBzIDwgQVVESU9fU1RSRUFNX0NOVCA7IHMrKykgewotICAgICAgICBpZiAocyA9PSAoc2l6ZV90KSBzdHJlYW1Ub0lnbm9yZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0dXNfdCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5PdXRwdXRzIGR1bXA6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CiAgICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCmluZGV4IGE5ZmU0OGQuLjNhNGRiOTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCkBAIC0zNCw1MyArMzQsMjcgQEAKIHsKIH0KIAotc3RhdHVzX3QgQXVkaW9QYXRjaDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3N0YXRpYyB2b2lkIGR1bXBQYXRjaEVuZHBvaW50cygKKyAgICAgICAgU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyICpwcmVmaXgsIGludCBjb3VudCwgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgKmNmZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBwYXRjaCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhdWRpbyBmbGluZ2VyIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtQWZQYXRjaEhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNvdXJjZXM6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NvdXJjZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc291cmNlczsgaSsrKSB7Ci0gICAgICAgIGlmIChtUGF0Y2guc291cmNlc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICAgICAgICAgIGRldmljZVRvU3RyaW5nKG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5kZXZpY2UudHlwZSwgZGV2aWNlKTsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmlkLAotICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmNfc3RyKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyAmY2ZnID0gY2Znc1tpXTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAgWyVzICVkXSAiLCBzcGFjZXMsICIiLCBwcmVmaXgsIGkgKyAxKTsKKyAgICAgICAgaWYgKGNmZy50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJEZXZpY2UgSUQgJWQgJXMiLCBjZmcuaWQsIHRvU3RyaW5nKGNmZy5leHQuZGV2aWNlLnR5cGUpLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgbVBhdGNoLnNvdXJjZXNbaV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIk1peCBJRCAlZCBJL08gaGFuZGxlICVkIiwgY2ZnLmlkLCBjZmcuZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICAgICAgICAgIGRldmljZVRvU3RyaW5nKG1QYXRjaC5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICBkZXZpY2UuY19zdHIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgbVBhdGNoLnNpbmtzW2ldLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQorfQogCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBBdWRpb1BhdGNoOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQYXRjaCAlZDogb3duZXIgdWlkICU0ZCwgaGFuZGxlICUyZCwgYWYgaGFuZGxlICUyZFxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsIGluZGV4ICsgMSwgbVVpZCwgbUhhbmRsZSwgbUFmUGF0Y2hIYW5kbGUpOworICAgIGR1bXBQYXRjaEVuZHBvaW50cyhkc3QsIHNwYWNlcywgInNyYyAiLCBtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsKKyAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzaW5rIiwgbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OmFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLApAQCAtMTYxLDE2ICsxMzUsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgQXVkaW9QYXRjaENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gUGF0Y2hlczpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQYXRjaGVzOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkLCAyLCBpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAppbmRleCAwODkzMGYxLi5mNzI4OWNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC0yNyw4OSArMjcsNTMgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi12b2lkIEF1ZGlvUG9saWN5TWl4OjpzZXRPdXRwdXQoc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXQpCit2b2lkIEF1ZGlvUG9saWN5TWl4OjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAogewotICAgIG1PdXRwdXQgPSBvdXRwdXQ7Ci19Ci0KLWNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmQXVkaW9Qb2xpY3lNaXg6OmdldE91dHB1dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1PdXRwdXQ7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNaXg6OmNsZWFyT3V0cHV0KCkKLXsKLSAgICBtT3V0cHV0LmNsZWFyKCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNaXg6OnNldE1peChBdWRpb01peCAmbWl4KQotewotICAgIG1NaXggPSBtaXg7Ci19Ci0KLWFuZHJvaWQ6OkF1ZGlvTWl4ICpBdWRpb1BvbGljeU1peDo6Z2V0TWl4KCkKLXsKLSAgICByZXR1cm4gJm1NaXg7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gUG9saWN5IE1peCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzQXVkaW8gUG9saWN5IE1peCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4ICsgMSk7CiAgICAgc3RkOjpzdHJpbmcgbWl4VHlwZUxpdGVyYWw7Ci0gICAgaWYgKCFNaXhUeXBlQ29udmVydGVyOjp0b1N0cmluZyhtTWl4Lm1NaXhUeXBlLCBtaXhUeXBlTGl0ZXJhbCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBtaXggdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbU1peC5tTWl4VHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKCFNaXhUeXBlQ29udmVydGVyOjp0b1N0cmluZyhtTWl4VHlwZSwgbWl4VHlwZUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgbWl4IHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1NaXhUeXBlKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1peCB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbWl4VHlwZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1peCB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbWl4VHlwZUxpdGVyYWwuY19zdHIoKSk7CisKICAgICBzdGQ6OnN0cmluZyByb3V0ZUZsYWdMaXRlcmFsOwotICAgIFJvdXRlRmxhZ1R5cGVDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhtTWl4Lm1Sb3V0ZUZsYWdzLCByb3V0ZUZsYWdMaXRlcmFsKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFJvdXRlIEZsYWdzOiAlc1xuIiwgc3BhY2VzLCAiIiwgcm91dGVGbGFnTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc3RkOjpzdHJpbmcgZGV2aWNlTGl0ZXJhbDsKLSAgICBkZXZpY2VUb1N0cmluZyhtTWl4Lm1EZXZpY2VUeXBlLCBkZXZpY2VMaXRlcmFsKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRldmljZSB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZXZpY2UgYWRkcmVzczogJXNcbiIsIHNwYWNlcywgIiIsIG1NaXgubURldmljZUFkZHJlc3Muc3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBSb3V0ZUZsYWdUeXBlQ29udmVydGVyOjptYXNrVG9TdHJpbmcobVJvdXRlRmxhZ3MsIHJvdXRlRmxhZ0xpdGVyYWwpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJvdXRlIEZsYWdzOiAlc1xuIiwgc3BhY2VzLCAiIiwgcm91dGVGbGFnTGl0ZXJhbC5jX3N0cigpKTsKKworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgdG9TdHJpbmcobURldmljZVR5cGUpLmNfc3RyKCkpOworCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZGV2aWNlIGFkZHJlc3M6ICVzXG4iLCBzcGFjZXMsICIiLCBtRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBpbnQgaW5kZXhDcml0ZXJpb24gPSAwOwotICAgIGZvciAoY29uc3QgYXV0byAmY3JpdGVyaW9uIDogbU1peC5tQ3JpdGVyaWEpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBDcml0ZXJpb24gJWQ6XG4iLCBzcGFjZXMgKyAyLCAiIiwgaW5kZXhDcml0ZXJpb24rKyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNyaXRlcmlvbiA6IG1Dcml0ZXJpYSkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBDcml0ZXJpb24gJWQ6XG4iLCBzcGFjZXMgKyAyLCAiIiwgaW5kZXhDcml0ZXJpb24rKyk7CisKICAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2VMaXRlcmFsOwogICAgICAgICBpZiAoIVVzYWdlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1WYWx1ZS5tVXNhZ2UsIHVzYWdlTGl0ZXJhbCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgdXNhZ2UgJWQiLCBfX0ZVTkNUSU9OX18sIGNyaXRlcmlvbi5tVmFsdWUubVVzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBVc2FnZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHVzYWdlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBpZiAobU1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVXNhZ2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCB1c2FnZUxpdGVyYWwuY19zdHIoKSk7CisKKyAgICAgICAgaWYgKG1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlTGl0ZXJhbDsKICAgICAgICAgICAgIGlmICghU291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1WYWx1ZS5tU291cmNlLCBzb3VyY2VMaXRlcmFsKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBjcml0ZXJpb24ubVZhbHVlLm1Tb3VyY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBTb3VyY2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBzb3VyY2VMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgc291cmNlTGl0ZXJhbC5jX3N0cigpKTsKKwogICAgICAgICB9Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gVWlkOiVkXG4iLCBzcGFjZXMgKyA0LCAiIiwgY3JpdGVyaW9uLm1WYWx1ZS5tVWlkKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBVaWQ6JWRcbiIsIHNwYWNlcyArIDQsICIiLCBjcml0ZXJpb24ubVZhbHVlLm1VaWQpOworCiAgICAgICAgIHN0ZDo6c3RyaW5nIHJ1bGVMaXRlcmFsOwogICAgICAgICBpZiAoIVJ1bGVUeXBlQ29udmVydGVyOjp0b1N0cmluZyhjcml0ZXJpb24ubVJ1bGUsIHJ1bGVMaXRlcmFsKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sY3JpdGVyaW9uLm1SdWxlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBSdWxlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgcnVsZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUnVsZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHJ1bGVMaXRlcmFsLmNfc3RyKCkpOwogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6cmVnaXN0ZXJNaXgoY29uc3QgU3RyaW5nOCYgYWRkcmVzcywgQXVkaW9NaXggbWl4LApAQCAtMTIwLDEyICs4NCwxMSBAQAogICAgICAgICBBTE9HRSgicmVnaXN0ZXJQb2xpY3lNaXhlcygpOiBtaXggZm9yIGFkZHJlc3MgJXMgYWxyZWFkeSByZWdpc3RlcmVkIiwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBuZXcgQXVkaW9Qb2xpY3lNaXgoKTsKLSAgICBwb2xpY3lNaXgtPnNldE1peChtaXgpOworICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBuZXcgQXVkaW9Qb2xpY3lNaXgobWl4KTsKICAgICBhZGQoYWRkcmVzcywgcG9saWN5TWl4KTsKIAogICAgIGlmIChkZXNjICE9IDApIHsKLSAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7CisgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7CiAgICAgICAgIHBvbGljeU1peC0+c2V0T3V0cHV0KGRlc2MpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC0xNjUsMTM3ICsxMjgsMjAwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldE91dHB1dEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldE91dHB1dEZvckF0dHIoCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcywgdWlkX3QgdWlkLCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJnByaW1hcnlEZXNjLAorICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+ICpzZWNvbmRhcnlEZXNjcykKIHsKICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHF1ZXJ5aW5nICV6dSBtaXhlczoiLCBzaXplKCkpOwotICAgIGRlc2MgPSAwOworICAgIHByaW1hcnlEZXNjID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSB2YWx1ZUF0KGkpOwotICAgICAgICBBdWRpb01peCAqbWl4ID0gcG9saWN5TWl4LT5nZXRNaXgoKTsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHBvbGljeURlc2MgPSBwb2xpY3lNaXgtPmdldE91dHB1dCgpOworICAgICAgICBpZiAoIXBvbGljeURlc2MpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogU2tpcGluZyAlenU6IE1peCBoYXMgbm8gb3V0cHV0IiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotICAgICAgICBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGlmIGFkZGluZyBtb3JlIHBsYXllciBydWxlcyAoY3VycmVudGx5IG9ubHkgMiksIG1ha2UgcnVsZSBoYW5kbGluZyAiZ2VuZXJpYyIKLSAgICAgICAgICAgIC8vICAgICAgYXMgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGUgdHJlYXRtZW50IG9mIHVzYWdlLSBvciB1aWQtYmFzZWQgcnVsZXMKLSAgICAgICAgICAgIGJvb2wgaGFzVXNhZ2VNYXRjaFJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIGhhc1VzYWdlRXhjbHVkZVJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHVzYWdlTWF0Y2hGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisgICAgICAgIGNvbnN0IGJvb2wgcHJpbWFyeU91dHB1dE1peCA9ICFpc19taXhfbG9vcGJhY2tfcmVuZGVyKHBvbGljeU1peC0+bVJvdXRlRmxhZ3MpOwogCi0gICAgICAgICAgICBib29sIGhhc1VpZE1hdGNoUnVsZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgaGFzVWlkRXhjbHVkZVJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHVpZE1hdGNoRm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgdWlkRXhjbHVzaW9uRm91bmQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHByaW1hcnlPdXRwdXRNaXggJiYgcHJpbWFyeURlc2MgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBTa2lwaW5nICV6dTogUHJpbWFyeSBvdXRwdXQgYWxyZWFkeSBmb3VuZCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBQcmltYXJ5IG91dHB1dCBhbHJlYWR5IGZvdW5kCisgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbCBoYXNBZGRyTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtaXhNYXRjaChwb2xpY3lNaXguZ2V0KCksIGksIGF0dHJpYnV0ZXMsIHVpZCkpIHsKKyAgICAgICAgICAgIGNhc2UgTWl4TWF0Y2hTdGF0dXM6OklOVkFMSURfTUlYOiByZXR1cm4gQkFEX1ZBTFVFOyAvLyBUT0RPOiBEbyB3ZSByZWFsbHkgd2FudCB0byBhYm9ydD8KKyAgICAgICAgICAgIGNhc2UgTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOgorICAgICAgICAgICAgICAgIEFMT0dWKCIlczogTWl4ICV6dTogZG9lcyBub3QgbWF0Y2giLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgdGhlIG1peAorICAgICAgICAgICAgY2FzZSBNaXhNYXRjaFN0YXR1czo6TUFUQ0g6OworICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBhbGwgbWl4IGNyaXRlcmlhIHRvIGxpc3Qgd2hhdCBydWxlcyB0aGlzIG1peCBjb250YWlucwotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIEFMT0dWKCIgZ2V0T3V0cHV0Rm9yQXR0cjogbWl4ICV6dTogaW5zcGVjdGluZyBtaXggY3JpdGVyaWEgJXp1IG9mICV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpLCBqLCBtaXgtPm1Dcml0ZXJpYS5zaXplKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gYWRkcmVzcyBtYXRjaCwgcHJpb3JpdGl6ZSB0aGF0IG1hdGNoCi0gICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzICsgc3RybGVuKCJhZGRyPSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc0FkZHJNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN3aXRjaCAobWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFOgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIGZvciB1c2FnZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzVXNhZ2VNYXRjaFJ1bGVzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UgPT0gYXR0cmlidXRlcy51c2FnZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgb25lIG1hdGNoIGFnYWluc3QgYWxsIGFsbG93ZWQgdXNhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZU1hdGNoRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRToKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFIGZvciB1c2FnZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1VzYWdlRXhjbHVkZVJ1bGVzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UgPT0gYXR0cmlidXRlcy51c2FnZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhpcyB1c2FnZSBpcyB0byBiZSBleGNsdWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2VFeGNsdXNpb25Gb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSVUxFX01BVENIX1VJRDoKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX01BVENIX1VJRCBmb3IgdWlkICVkIiwgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpOwotICAgICAgICAgICAgICAgICAgICBoYXNVaWRNYXRjaFJ1bGVzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgb25lIFVJRCBtYXRjaCBhZ2FpbnN0IGFsbCBhbGxvd2VkIFVJRHMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpZE1hdGNoRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUlVMRV9FWENMVURFX1VJRDoKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX0VYQ0xVREVfVUlEIGZvciB1aWQgJWQiLCBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1VpZEV4Y2x1ZGVSdWxlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoaXMgVUlEIGlzIHRvIGJlIGV4Y2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICB1aWRFeGNsdXNpb25Gb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY29uc2lzdGVuY3kgY2hlY2tzOiBmb3IgZWFjaCAiZGltZW5zaW9uIiBvZiBydWxlcyAodXNhZ2UsIHVpZC4uLiksIHdlIGNhbgotICAgICAgICAgICAgICAgIC8vIG9ubHkgaGF2ZSBNQVRDSCBydWxlcywgb3IgRVhDTFVERSBydWxlcyBpbiBlYWNoIGRpbWVuc2lvbiwgbm90IGEgY29tYmluYXRpb24KLSAgICAgICAgICAgICAgICBpZiAoaGFzVXNhZ2VNYXRjaFJ1bGVzICYmIGhhc1VzYWdlRXhjbHVkZVJ1bGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyOiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgaW4gbWl4ICV6dSIsIGkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaGFzVWlkTWF0Y2hSdWxlcyAmJiBoYXNVaWRFeGNsdWRlUnVsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHI6IGludmFsaWQgY29tYmluYXRpb24gb2YgUlVMRV9NQVRDSF9VSUQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgUlVMRV9FWENMVURFX1VJRCBpbiBtaXggJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKChoYXNVc2FnZUV4Y2x1ZGVSdWxlcyAmJiB1c2FnZUV4Y2x1c2lvbkZvdW5kKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGhhc1VpZEV4Y2x1ZGVSdWxlcyAmJiB1aWRFeGNsdXNpb25Gb3VuZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHN0b3AgaXRlcmF0aW5nIG9uIGNyaXRlcmlhIGJlY2F1c2UgYW4gZXhjbHVzaW9uIHdhcyBmb3VuZCAod2lsbCBmYWlsKQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfS8vaXRlcmF0ZSBvbiBtaXggY3JpdGVyaWEKLQotICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGV4aXRpbmcgb24gc3VjY2VzcyAob3IgaW1wbGljaXQgZmFpbHVyZSBhcyBkZXNjIGlzIDApCi0gICAgICAgICAgICBpZiAoaGFzQWRkck1hdGNoIHx8Ci0gICAgICAgICAgICAgICAgICAgICEoKGhhc1VzYWdlRXhjbHVkZVJ1bGVzICYmIHVzYWdlRXhjbHVzaW9uRm91bmQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKGhhc1VzYWdlTWF0Y2hSdWxlcyAmJiAhdXNhZ2VNYXRjaEZvdW5kKSAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoaGFzVWlkRXhjbHVkZVJ1bGVzICYmIHVpZEV4Y2x1c2lvbkZvdW5kKSB8fAotICAgICAgICAgICAgICAgICAgICAgIChoYXNVaWRNYXRjaFJ1bGVzICYmICF1aWRNYXRjaEZvdW5kKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRnZXRPdXRwdXRGb3JBdHRyIHdpbGwgdXNlIG1peCAlenUiLCBpKTsKLSAgICAgICAgICAgICAgICBkZXNjID0gcG9saWN5TWl4LT5nZXRPdXRwdXQoKTsKKyAgICAgICAgcG9saWN5RGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKKyAgICAgICAgaWYgKHByaW1hcnlPdXRwdXRNaXgpIHsKKyAgICAgICAgICAgIHByaW1hcnlEZXNjID0gcG9saWN5RGVzYzsKKyAgICAgICAgICAgIEFMT0dWKCIlczogTWl4ICV6dTogc2V0IHByaW1hcnkgZGVzYyIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwb2xpY3lEZXNjLT5tSW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IE1peCAlenUgaWdub3JlZCBhcyBzZWNvbmRhcnlPdXRwdXQgYmVjYXVzZSBub3Qgb3BlbmVkIHlldCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBBZGQgYSBzZWNvbmRhcnkgZGVzYyAlenUiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RGVzY3MtPnB1c2hfYmFjayhwb2xpY3lEZXNjKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHByaW1hcnlEZXNjID09IG51bGxwdHIgJiYgc2Vjb25kYXJ5RGVzY3MtPmVtcHR5KCkpID8gQkFEX1ZBTFVFIDogTk9fRVJST1I7Cit9CiAKLSAgICAgICAgfSBlbHNlIGlmIChtaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgorQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpNaXhNYXRjaFN0YXR1cyBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246Om1peE1hdGNoKAorICAgICAgICBjb25zdCBBdWRpb01peCogbWl4LCBzaXplX3QgbWl4SW5kZXgsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcywgdWlkX3QgdWlkKSB7CisKKyAgICBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgIC8vIExvb3BiYWNrIHJlbmRlciBtaXhlcyBhcmUgY3JlYXRlZCBmcm9tIGEgcHVibGljIEFQSSBhbmQgdGh1cyByZXN0cmljdGVkCisgICAgICAgIC8vIHRvIG5vbiBzZW5zaWJsZSBhdWRpbyB0aGF0IGhhdmUgbm90IG9wdGVkIG91dC4KKyAgICAgICAgaWYgKGlzX21peF9sb29wYmFja19yZW5kZXIobWl4LT5tUm91dGVGbGFncykpIHsKKyAgICAgICAgICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfTk9fQ0FQVFVSRSkgPT0gQVVESU9fRkxBR19OT19DQVBUVVJFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVU5LTk9XTiB8fAorICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9NRURJQSB8fAorICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9HQU1FKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyBpZiBhZGRpbmcgbW9yZSBwbGF5ZXIgcnVsZXMgKGN1cnJlbnRseSBvbmx5IDIpLCBtYWtlIHJ1bGUgaGFuZGxpbmcgImdlbmVyaWMiCisgICAgICAgIC8vICAgICAgYXMgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGUgdHJlYXRtZW50IG9mIHVzYWdlLSBvciB1aWQtYmFzZWQgcnVsZXMKKyAgICAgICAgYm9vbCBoYXNVc2FnZU1hdGNoUnVsZXMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBoYXNVc2FnZUV4Y2x1ZGVSdWxlcyA9IGZhbHNlOworICAgICAgICBib29sIHVzYWdlTWF0Y2hGb3VuZCA9IGZhbHNlOworICAgICAgICBib29sIHVzYWdlRXhjbHVzaW9uRm91bmQgPSBmYWxzZTsKKworICAgICAgICBib29sIGhhc1VpZE1hdGNoUnVsZXMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBoYXNVaWRFeGNsdWRlUnVsZXMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCB1aWRNYXRjaEZvdW5kID0gZmFsc2U7CisgICAgICAgIGJvb2wgdWlkRXhjbHVzaW9uRm91bmQgPSBmYWxzZTsKKworICAgICAgICBib29sIGhhc0FkZHJNYXRjaCA9IGZhbHNlOworCisgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBhbGwgbWl4IGNyaXRlcmlhIHRvIGxpc3Qgd2hhdCBydWxlcyB0aGlzIG1peCBjb250YWlucworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBBTE9HVigiIGdldE91dHB1dEZvckF0dHI6IG1peCAlenU6IGluc3BlY3RpbmcgbWl4IGNyaXRlcmlhICV6dSBvZiAlenUiLAorICAgICAgICAgICAgICAgICAgICBtaXhJbmRleCwgaiwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gYWRkcmVzcyBtYXRjaCwgcHJpb3JpdGl6ZSB0aGF0IG1hdGNoCisgICAgICAgICAgICBpZiAoc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgogICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gcG9saWN5TWl4LT5nZXRPdXRwdXQoKTsKKyAgICAgICAgICAgICAgICBoYXNBZGRyTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlKSB7CisgICAgICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFOgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UgZm9yIHVzYWdlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSk7CisgICAgICAgICAgICAgICAgaGFzVXNhZ2VNYXRjaFJ1bGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSA9PSBhdHRyaWJ1dGVzLnVzYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSBtYXRjaCBhZ2FpbnN0IGFsbCBhbGxvd2VkIHVzYWdlcworICAgICAgICAgICAgICAgICAgICB1c2FnZU1hdGNoRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRToKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgZm9yIHVzYWdlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UpOworICAgICAgICAgICAgICAgIGhhc1VzYWdlRXhjbHVkZVJ1bGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSA9PSBhdHRyaWJ1dGVzLnVzYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoaXMgdXNhZ2UgaXMgdG8gYmUgZXhjbHVkZWQKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2VFeGNsdXNpb25Gb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSVUxFX01BVENIX1VJRDoKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfTUFUQ0hfVUlEIGZvciB1aWQgJWQiLCBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCk7CisgICAgICAgICAgICAgICAgaGFzVWlkTWF0Y2hSdWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkID09IHVpZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgVUlEIG1hdGNoIGFnYWluc3QgYWxsIGFsbG93ZWQgVUlEcworICAgICAgICAgICAgICAgICAgICB1aWRNYXRjaEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJVTEVfRVhDTFVERV9VSUQ6CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX0VYQ0xVREVfVUlEIGZvciB1aWQgJWQiLCBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCk7CisgICAgICAgICAgICAgICAgaGFzVWlkRXhjbHVkZVJ1bGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoaXMgVUlEIGlzIHRvIGJlIGV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgICAgIHVpZEV4Y2x1c2lvbkZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb25zaXN0ZW5jeSBjaGVja3M6IGZvciBlYWNoICJkaW1lbnNpb24iIG9mIHJ1bGVzICh1c2FnZSwgdWlkLi4uKSwgd2UgY2FuCisgICAgICAgICAgICAvLyBvbmx5IGhhdmUgTUFUQ0ggcnVsZXMsIG9yIEVYQ0xVREUgcnVsZXMgaW4gZWFjaCBkaW1lbnNpb24sIG5vdCBhIGNvbWJpbmF0aW9uCisgICAgICAgICAgICBpZiAoaGFzVXNhZ2VNYXRjaFJ1bGVzICYmIGhhc1VzYWdlRXhjbHVkZVJ1bGVzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHI6IGludmFsaWQgY29tYmluYXRpb24gb2YgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFIGluIG1peCAlenUiLCBtaXhJbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpJTlZBTElEX01JWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNVaWRNYXRjaFJ1bGVzICYmIGhhc1VpZEV4Y2x1ZGVSdWxlcykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyOiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIFJVTEVfTUFUQ0hfVUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgUlVMRV9FWENMVURFX1VJRCBpbiBtaXggJXp1IiwgbWl4SW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6SU5WQUxJRF9NSVg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoaGFzVXNhZ2VFeGNsdWRlUnVsZXMgJiYgdXNhZ2VFeGNsdXNpb25Gb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGhhc1VpZEV4Y2x1ZGVSdWxlcyAmJiB1aWRFeGNsdXNpb25Gb3VuZCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsgLy8gc3RvcCBpdGVyYXRpbmcgb24gY3JpdGVyaWEgYmVjYXVzZSBhbiBleGNsdXNpb24gd2FzIGZvdW5kICh3aWxsIGZhaWwpCisgICAgICAgICAgICB9CisKKyAgICAgICAgfS8vaXRlcmF0ZSBvbiBtaXggY3JpdGVyaWEKKworICAgICAgICAvLyBkZXRlcm1pbmUgaWYgZXhpdGluZyBvbiBzdWNjZXNzIChvciBpbXBsaWNpdCBmYWlsdXJlIGFzIGRlc2MgaXMgMCkKKyAgICAgICAgaWYgKGhhc0FkZHJNYXRjaCB8fAorICAgICAgICAgICAgICAgICEoKGhhc1VzYWdlRXhjbHVkZVJ1bGVzICYmIHVzYWdlRXhjbHVzaW9uRm91bmQpIHx8CisgICAgICAgICAgICAgICAgICAoaGFzVXNhZ2VNYXRjaFJ1bGVzICYmICF1c2FnZU1hdGNoRm91bmQpICB8fAorICAgICAgICAgICAgICAgICAgKGhhc1VpZEV4Y2x1ZGVSdWxlcyAmJiB1aWRFeGNsdXNpb25Gb3VuZCkgfHwKKyAgICAgICAgICAgICAgICAgIChoYXNVaWRNYXRjaFJ1bGVzICYmICF1aWRNYXRjaEZvdW5kKSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdGdldE91dHB1dEZvckF0dHIgd2lsbCB1c2UgbWl4ICV6dSIsIG1peEluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6TUFUQ0g7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGRlc2MgIT0gMCkgewotICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IG1peDsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKworICAgIH0gZWxzZSBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UgJiYKKyAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCisgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCisgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpNQVRDSDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4KQorc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXREZXZpY2VBbmRNaXhGb3JPdXRwdXQoCisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0LAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBBdWRpb01peCAqbWl4ID0gdmFsdWVBdChpKS0+Z2V0TWl4KCk7CisgICAgICAgIGlmICh2YWx1ZUF0KGkpLT5nZXRPdXRwdXQoKSA9PSBvdXRwdXQpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgRGVzYyBpcyBpbnZvbHZlZCBpbiBhIE1peCwgd2hpY2ggaGFzIHRoZSBoaWdoZXN0IHByaW8KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gdmFsdWVBdChpKS0+bURldmljZVR5cGU7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSB2YWx1ZUF0KGkpLT5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIEFMT0dWKCIlczogZGV2aWNlICgweCV4LCBhZGRyPSVzKSBmb3JjZWQgYnkgbWl4IiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlVHlwZSwgYWRkcmVzcy5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShkZXZpY2VUeXBlLCBhZGRyZXNzLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CiAKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsRGV2aWNlcywKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICpwb2xpY3lNaXgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBBdWRpb1BvbGljeU1peCAqbWl4ID0gdmFsdWVBdChpKS5nZXQoKTsKICAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMzA0LDIwICszMzAsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Tb3VyY2UgPT0gaW5wdXRTb3VyY2UpIHx8CiAgICAgICAgICAgICAgICAoUlVMRV9FWENMVURFX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVCA9PSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgogICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVNvdXJjZSAhPSBpbnB1dFNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXZhaWxEZXZpY2VzICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvbGljeU1peCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gYXNzdW1pbmcgUG9saWN5TWl4IG9ubHkgZm9yIHJlbW90ZSBzdWJtaXggZm9yIGlucHV0CisgICAgICAgICAgICAgICAgLy8gc28gbWl4LT5tRGV2aWNlVHlwZSBjYW4gb25seSBiZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICAgICAgYXV0byBtaXhEZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxEZXZpY2VzLmdldERldmljZShkZXZpY2UsIG1peC0+bURldmljZUFkZHJlc3MsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICBpZiAobWl4RGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvbGljeU1peCAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAqcG9saWN5TWl4ID0gbWl4OwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1peERldmljZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgIHJldHVybiBudWxscHRyOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldElucHV0TWl4Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciwgQXVkaW9NaXggKipwb2xpY3lNaXgpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldElucHV0TWl4Rm9yQXR0cigKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqcG9saWN5TWl4KQogewogICAgIGlmIChzdHJuY21wKGF0dHIudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0zMjcsOSArMzU5LDggQEAKICNpZmRlZiBMT0dfTkRFQlVHCiAgICAgQUxPR1YoImdldElucHV0TWl4Rm9yQXR0ciBsb29raW5nIGZvciBhZGRyZXNzICVzXG4gIG1peGVzIGF2YWlsYWJsZToiLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gdmFsdWVBdChpKTsKLSAgICAgICAgICAgIEF1ZGlvTWl4ICptaXggPSBwb2xpY3lNaXgtPmdldE1peCgpOwotICAgICAgICAgICAgQUxPR1YoIlx0bWl4ICV6dSBhZGRyZXNzPSVzIiwgaSwgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gYXVkaW9Qb2xpY3lNaXggPSB2YWx1ZUF0KGkpOworICAgICAgICAgICAgQUxPR1YoIlx0bWl4ICV6dSBhZGRyZXNzPSVzIiwgaSwgYXVkaW9Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKICAgICB9CiAjZW5kaWYKIApAQCAtMzM5LDI0ICszNzAsMTA2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBhdWRpb1BvbGljeU1peCA9IHZhbHVlQXQoaW5kZXgpOwotICAgIEF1ZGlvTWl4ICptaXggPSBhdWRpb1BvbGljeU1peC0+Z2V0TWl4KCk7CiAKLSAgICBpZiAobWl4LT5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgaWYgKGF1ZGlvUG9saWN5TWl4LT5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7CiAgICAgICAgIEFMT0dXKCJnZXRJbnB1dE1peEZvckF0dHIoKSBiYWQgcG9saWN5IG1peCB0eXBlIGZvciBhZGRyZXNzICVzIiwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgICpwb2xpY3lNaXggPSBtaXg7CisgICAgaWYgKHBvbGljeU1peCAhPSBudWxscHRyKSB7CisgICAgICAgICpwb2xpY3lNaXggPSBhdWRpb1BvbGljeU1peDsKKyAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIHN0ZDo6c3RyaW5nIGxvZygiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7Ci0gICAgd3JpdGUoZmQsIGxvZy5jX3N0cigpLCBsb2cuc2l6ZSgpKTsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgIC8vIHJlbW92ZSBleGlzdGluZyBydWxlcyBmb3IgdGhpcyB1aWQKKyAgICByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZCk7CisKKyAgICAvLyBmb3IgZWFjaCBwbGF5ZXIgbWl4OiBhZGQgYSBydWxlIHRvIG1hdGNoIG9yIGV4Y2x1ZGUgdGhlIHVpZCBiYXNlZCBvbiB0aGUgZGV2aWNlCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkLCAyLCBpKTsKKyAgICAgICAgY29uc3QgQXVkaW9Qb2xpY3lNaXggKm1peCA9IHZhbHVlQXQoaSkuZ2V0KCk7CisgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgbWl4IGdvZXMgdG8gYSBkZXZpY2UgaW4gdGhlIGxpc3Qgb2YgZGV2aWNlcworICAgICAgICBib29sIGRldmljZU1hdGNoID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZGV2aWNlcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgaWYgKGRldmljZXNbal0ubVR5cGUgPT0gbWl4LT5tRGV2aWNlVHlwZQorICAgICAgICAgICAgICAgICAgICAmJiBkZXZpY2VzW2pdLm1BZGRyZXNzID09IG1peC0+bURldmljZUFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZU1hdGNoKSB7CisgICAgICAgICAgICBtaXgtPnNldE1hdGNoVWlkKHVpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aGlzIG1peCBkb2Vzbid0IGdvIHRvIG9uZSBvZiB0aGUgbGlzdGVkIGRldmljZXMgZm9yIHRoZSBnaXZlbiB1aWQsCisgICAgICAgICAgICAvLyBtb2RpZnkgaXRzIHJ1bGVzIHRvIGV4Y2x1ZGUgdGhlIHVpZAorICAgICAgICAgICAgbWl4LT5zZXRFeGNsdWRlVWlkKHVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICAvLyBmb3IgZWFjaCBwbGF5ZXIgbWl4OiByZW1vdmUgZXhpc3RpbmcgcnVsZXMgdGhhdCBtYXRjaCBvciBleGNsdWRlIHRoaXMgdWlkCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBib29sIGZvdW5kVWlkUnVsZSA9IGZhbHNlOworICAgICAgICBjb25zdCBBdWRpb1BvbGljeU1peCAqbWl4ID0gdmFsdWVBdChpKS5nZXQoKTsKKyAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBjcml0ZXJpYVRvUmVtb3ZlOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBydWxlID0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGU7CisgICAgICAgICAgICAvLyBpcyB0aGlzIHJ1bGUgYWZmZWN0aW5nIHRoZSB1aWQ/CisgICAgICAgICAgICBpZiAoKHJ1bGUgPT0gUlVMRV9FWENMVURFX1VJRCB8fCBydWxlID09IFJVTEVfTUFUQ0hfVUlEKQorICAgICAgICAgICAgICAgICAgICAmJiB1aWQgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpIHsKKyAgICAgICAgICAgICAgICBmb3VuZFVpZFJ1bGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGNyaXRlcmlhVG9SZW1vdmUuaW5zZXJ0KGNyaXRlcmlhVG9SZW1vdmUuYmVnaW4oKSwgaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kVWlkUnVsZSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjcml0ZXJpYVRvUmVtb3ZlLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWEucmVtb3ZlQXQoY3JpdGVyaWFUb1JlbW92ZVtqXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldERldmljZXNGb3JVaWQodWlkX3QgdWlkLAorICAgICAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIGNvbnN0IHsKKyAgICAvLyBmb3IgZWFjaCBwbGF5ZXIgbWl4OiBmaW5kIHJ1bGVzIHRoYXQgZG9uJ3QgZXhjbHVkZSB0aGlzIHVpZCwgYW5kIGFkZCB0aGUgZGV2aWNlIHRvIHRoZSBsaXN0CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBib29sIHJ1bGVBbGxvd3NVaWQgPSB0cnVlOworICAgICAgICBjb25zdCBBdWRpb1BvbGljeU1peCAqbWl4ID0gdmFsdWVBdChpKS5nZXQoKTsKKyAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcnVsZSA9IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlOworICAgICAgICAgICAgaWYgKHJ1bGUgPT0gUlVMRV9FWENMVURFX1VJRAorICAgICAgICAgICAgICAgICAgICAmJiB1aWQgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpIHsKKyAgICAgICAgICAgICAgICBydWxlQWxsb3dzVWlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bGVBbGxvd3NVaWQpIHsKKyAgICAgICAgICAgIGRldmljZXMuYWRkKEF1ZGlvRGV2aWNlVHlwZUFkZHIobWl4LT5tRGV2aWNlVHlwZSwgbWl4LT5tRGV2aWNlQWRkcmVzcykpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kKCJcbkF1ZGlvIFBvbGljeSBNaXg6XG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKKyAgICB9Cit9CisKIH07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCmluZGV4IGQ4NTU2MmUuLmE2NmM2OTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcApAQCAtMzEsOSArMzEsMTUgQEAKIC8vIC0tLSBBdWRpb1BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24KIHZvaWQgQXVkaW9Qb3J0OjphdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCiB7CisgICAgQUxPR1YoIiVzOiBhdHRhY2hpbmcgbW9kdWxlICVzIHRvIHBvcnQgJXMiLCBfX0ZVTkNUSU9OX18sIGdldE1vZHVsZU5hbWUoKSwgbU5hbWUuc3RyaW5nKCkpOwogICAgIG1Nb2R1bGUgPSBtb2R1bGU7CiB9CiAKK3ZvaWQgQXVkaW9Qb3J0OjpkZXRhY2goKQoreworICAgIG1Nb2R1bGUgPSBudWxscHRyOworfQorCiAvLyBOb3RlIHRoYXQgaXMgYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gQXVkaW9GbGluZ2VyIHVuaXF1ZSBJRHMKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKQogewpAQCAtMzU0LDI2ICszNjAsMTggQEAKICAgICByZXR1cm4gbUdhaW5zW2luZGV4XS0+Y2hlY2tDb25maWcoZ2FpbkNvbmZpZyk7CiB9CiAKLXZvaWQgQXVkaW9Qb3J0OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAordm9pZCBBdWRpb1BvcnQ6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KICAgICBpZiAoIW1OYW1lLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgfQogICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgIG1Qcm9maWxlcy5kdW1wKGZkLCBzcGFjZXMpOworICAgICAgICBtUHJvZmlsZXMuZHVtcChkc3QsIHNwYWNlcyk7CiAKICAgICAgICAgaWYgKG1HYWlucy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBnYWluczpcbiIsIHNwYWNlcywgIiIpOwotICAgICAgICAgICAgcmVzdWx0ID0gYnVmZmVyOwotICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBnYWluczpcbiIsIHNwYWNlcywgIiIpOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtR2FpbnNbaV0tPmR1bXAoZmQsIHNwYWNlcyArIDIsIGkpOworICAgICAgICAgICAgICAgIG1HYWluc1tpXS0+ZHVtcChkc3QsIHNwYWNlcyArIDIsIGkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzg2LDIyICszODQsMTIgQEAKIAogLy8gLS0tIEF1ZGlvUG9ydENvbmZpZyBjbGFzcyBpbXBsZW1lbnRhdGlvbgogCi1BdWRpb1BvcnRDb25maWc6OkF1ZGlvUG9ydENvbmZpZygpCi17Ci0gICAgbVNhbXBsaW5nUmF0ZSA9IDA7Ci0gICAgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwotICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICBtZW1zZXQoJm1HYWluLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnKSk7Ci0gICAgbUdhaW4uaW5kZXggPSAtMTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcpCiB7Ci0gICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGxvY2FsQmFja3VwQ29uZmlnOworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBsb2NhbEJhY2t1cENvbmZpZyA9IHsgLmNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzayB9OwogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCi0gICAgbG9jYWxCYWNrdXBDb25maWcuY29uZmlnX21hc2sgPSBjb25maWctPmNvbmZpZ19tYXNrOwogICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CiAKICAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvcG9ydCA9IGdldEF1ZGlvUG9ydCgpOwpAQCAtNDI1LDYgKzQxMyw5IEBACiAgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CiAgICAgICAgIG1HYWluID0gY29uZmlnLT5nYWluOwogICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7CisgICAgICAgIG1GbGFncyA9IGNvbmZpZy0+ZmxhZ3M7CisgICAgfQogCiBleGl0OgogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTQzNiwzMyArNDI3LDM4IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorbmFtZXNwYWNlIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgdXBkYXRlRmllbGQoCisgICAgICAgIGNvbnN0IFQmIHBvcnRDb25maWdGaWVsZCwgVCBhdWRpb19wb3J0X2NvbmZpZzo6KnBvcnRfY29uZmlnX2ZpZWxkLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcsCisgICAgICAgIHVuc2lnbmVkIGludCBjb25maWdNYXNrLCBUIGRlZmF1bHRWYWx1ZSkKK3sKKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIGNvbmZpZ01hc2spIHsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gbnVsbHB0cikgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBjb25maWdNYXNrKSkgeworICAgICAgICAgICAgZHN0Q29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQgPSBzcmNDb25maWctPipwb3J0X2NvbmZpZ19maWVsZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gcG9ydENvbmZpZ0ZpZWxkOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQgPSBkZWZhdWx0VmFsdWU7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZQorCiB2b2lkIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0CiB7Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgewotICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSBzcmNDb25maWctPnNhbXBsZV9yYXRlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IDA7Ci0gICAgfQotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOwotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gc3JjQ29uZmlnLT5jaGFubmVsX21hc2s7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKLSAgICB9Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gc3JjQ29uZmlnLT5mb3JtYXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIH0KKyAgICB1cGRhdGVGaWVsZChtU2FtcGxpbmdSYXRlLCAmYXVkaW9fcG9ydF9jb25maWc6OnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFLCAwdSk7CisgICAgdXBkYXRlRmllbGQobUNoYW5uZWxNYXNrLCAmYXVkaW9fcG9ydF9jb25maWc6OmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpQVVESU9fQ0hBTk5FTF9OT05FKTsKKyAgICB1cGRhdGVGaWVsZChtRm9ybWF0LCAmYXVkaW9fcG9ydF9jb25maWc6OmZvcm1hdCwKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKwogICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CiAgICAgaWYgKChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgJiYgYXVkaW9wb3J0ICE9IE5VTEwpIHsKICAgICAgICAgZHN0Q29uZmlnLT5nYWluID0gbUdhaW47CkBAIC00NzgsNiArNDc0LDE5IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayAmPSB+QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKICAgICB9CisKKyAgICB1cGRhdGVGaWVsZChtRmxhZ3MsICZhdWRpb19wb3J0X2NvbmZpZzo6ZmxhZ3MsCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MsIHsgQVVESU9fSU5QVVRfRkxBR19OT05FIH0pOworfQorCitib29sIEF1ZGlvUG9ydENvbmZpZzo6aGFzR2FpbkNvbnRyb2xsZXIoYm9vbCBjYW5Vc2VGb3JWb2x1bWUpIGNvbnN0Cit7CisgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKKyAgICBpZiAoYXVkaW9wb3J0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gY2FuVXNlRm9yVm9sdW1lID8gYXVkaW9wb3J0LT5nZXRHYWlucygpLmNhblVzZUZvclZvbHVtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvcG9ydC0+Z2V0R2FpbnMoKS5zaXplKCkgPiAwOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcAppbmRleCBmZDZmYzFjLi5hNjQ1ZTAyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKQEAgLTE0LDIwICsxNCwxMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKwogI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUHJvZmlsZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQXVkaW9Qcm9maWxlLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorQ2hhbm5lbHNWZWN0b3IgQ2hhbm5lbHNWZWN0b3I6OmFzSW5NYXNrKCkgY29uc3QKK3sKKyAgICBDaGFubmVsc1ZlY3RvciBpbk1hc2tWZWN0b3I7CisgICAgZm9yIChjb25zdCBhdXRvJiBjaGFubmVsIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4oY2hhbm5lbCkgIT0gQVVESU9fQ0hBTk5FTF9JTlZBTElEKSB7CisgICAgICAgICAgICBpbk1hc2tWZWN0b3IuYWRkKGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4oY2hhbm5lbCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbk1hc2tWZWN0b3I7Cit9CisKK0NoYW5uZWxzVmVjdG9yIENoYW5uZWxzVmVjdG9yOjphc091dE1hc2soKSBjb25zdAoreworICAgIENoYW5uZWxzVmVjdG9yIG91dE1hc2tWZWN0b3I7CisgICAgZm9yIChjb25zdCBhdXRvJiBjaGFubmVsIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19pbl90b19vdXQoY2hhbm5lbCkgIT0gQVVESU9fQ0hBTk5FTF9JTlZBTElEKSB7CisgICAgICAgICAgICBvdXRNYXNrVmVjdG9yLmFkZChhdWRpb19jaGFubmVsX21hc2tfaW5fdG9fb3V0KGNoYW5uZWwpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0TWFza1ZlY3RvcjsKK30KKworYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJmNvbXBhcmVUbykKK3sKKyAgICByZXR1cm4gKGxlZnQuZ2V0Rm9ybWF0KCkgPT0gY29tcGFyZVRvLmdldEZvcm1hdCgpKSAmJgorICAgICAgICAgICAgKGxlZnQuZ2V0Q2hhbm5lbHMoKSA9PSBjb21wYXJlVG8uZ2V0Q2hhbm5lbHMoKSkgJiYKKyAgICAgICAgICAgIChsZWZ0LmdldFNhbXBsZVJhdGVzKCkgPT0gY29tcGFyZVRvLmdldFNhbXBsZVJhdGVzKCkpOworfQorCitzdGF0aWMgQXVkaW9Qcm9maWxlKiBjcmVhdGVGdWxsRHluYW1pY0ltcGwoKQoreworICAgIEF1ZGlvUHJvZmlsZSogZHluYW1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAorICAgICAgICAgICAgQ2hhbm5lbHNWZWN0b3IoKSwgU2FtcGxlUmF0ZVZlY3RvcigpKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHRydWUpOworICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljUmF0ZSh0cnVlKTsKKyAgICByZXR1cm4gZHluYW1pY1Byb2ZpbGU7Cit9CisKKy8vIHN0YXRpYworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkKK3sKKyAgICBzdGF0aWMgc3A8QXVkaW9Qcm9maWxlPiBkeW5hbWljUHJvZmlsZSA9IGNyZWF0ZUZ1bGxEeW5hbWljSW1wbCgpOworICAgIHJldHVybiBkeW5hbWljUHJvZmlsZTsKK30KKworQXVkaW9Qcm9maWxlOjpBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlKSA6CisgICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpCit7CisgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2tzKTsKKyAgICBtU2FtcGxpbmdSYXRlcy5hZGQoc2FtcGxpbmdSYXRlKTsKK30KKworQXVkaW9Qcm9maWxlOjpBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIDoKKyAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1DaGFubmVsTWFza3MoY2hhbm5lbE1hc2tzKSwKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMoc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikge30KKwordm9pZCBBdWRpb1Byb2ZpbGU6OnNldENoYW5uZWxzKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpCit7CisgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgeworICAgICAgICBtQ2hhbm5lbE1hc2tzID0gY2hhbm5lbE1hc2tzOworICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGU6OnNldFNhbXBsZVJhdGVzKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzKQoreworICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgeworICAgICAgICBtU2FtcGxpbmdSYXRlcyA9IHNhbXBsZVJhdGVzOworICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGU6OmNsZWFyKCkKK3sKKyAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7CisgICAgICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKG1Jc0R5bmFtaWNSYXRlKSB7CisgICAgICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OmNoZWNrRXhhY3QodWludDMyX3Qgc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0CiB7CkBAIC0zOSwyNyArMTMxLDYgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKLXsKLSAgICBpZiAobGVmdC5zaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZm9yKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcmlnaHQuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmIChsZWZ0W2luZGV4XSAhPSByaWdodFtpbmRleF0pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJmNvbXBhcmVUbykKLXsKLSAgICByZXR1cm4gKGxlZnQuZ2V0Rm9ybWF0KCkgPT0gY29tcGFyZVRvLmdldEZvcm1hdCgpKSAmJgotICAgICAgICAgICAgKGxlZnQuZ2V0Q2hhbm5lbHMoKSA9PSBjb21wYXJlVG8uZ2V0Q2hhbm5lbHMoKSkgJiYKLSAgICAgICAgICAgIChsZWZ0LmdldFNhbXBsZVJhdGVzKCkgPT0gY29tcGFyZVRvLmdldFNhbXBsZVJhdGVzKCkpOwotfQotCiBzdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OmNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3QKIHsKQEAgLTE4Miw0NyArMjUzLDc5IEBACiAgICAgcmV0dXJuIGJlc3RNYXRjaCA+IDAgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKIH0KIAotdm9pZCBBdWRpb1Byb2ZpbGU6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1Byb2ZpbGU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMlcyVzXG4iLCBtSXNEeW5hbWljRm9ybWF0ID8gIltkeW5hbWljIGZvcm1hdF0iIDogIiIsCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzJXMlc1xuIiwgbUlzRHluYW1pY0Zvcm1hdCA/ICJbZHluYW1pYyBmb3JtYXRdIiA6ICIiLAogICAgICAgICAgICAgIG1Jc0R5bmFtaWNDaGFubmVscyA/ICJbZHluYW1pYyBjaGFubmVsc10iIDogIiIsCiAgICAgICAgICAgICAgbUlzRHluYW1pY1JhdGUgPyAiW2R5bmFtaWMgcmF0ZXNdIiA6ICIiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgaWYgKG1OYW1lLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgfQogICAgIHN0ZDo6c3RyaW5nIGZvcm1hdExpdGVyYWw7CiAgICAgaWYgKEZvcm1hdENvbnZlcnRlcjo6dG9TdHJpbmcobUZvcm1hdCwgZm9ybWF0TGl0ZXJhbCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXQ6ICVzXG4iLCBzcGFjZXMsICIiLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGZvcm1hdDogJXNcbiIsIHNwYWNlcywgIiIsIGZvcm1hdExpdGVyYWwuY19zdHIoKSk7CiAgICAgfQogICAgIGlmICghbVNhbXBsaW5nUmF0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2FtcGxpbmcgcmF0ZXM6Iiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gc2FtcGxpbmcgcmF0ZXM6Iiwgc3BhY2VzLCAiIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtU2FtcGxpbmdSYXRlcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZChpID09IChtU2FtcGxpbmdSYXRlcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQogCiAgICAgaWYgKCFtQ2hhbm5lbE1hc2tzLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFza3M6Iiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gY2hhbm5lbCBtYXNrczoiLCBzcGFjZXMsICIiKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIweCUwNHgiLCBtQ2hhbm5lbE1hc2tzW2ldKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUNoYW5uZWxNYXNrcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK3NzaXplX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjphZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gVmVjdG9yOjphZGQocHJvZmlsZSk7CisgICAgLy8gd2Ugc29ydCBmcm9tIHdvcnN0IHRvIGJlc3QsIHNvIHRoYXQgQVVESU9fRk9STUFUX0RFRkFVTFQgaXMgYWx3YXlzIHRoZSBmaXJzdCBlbnRyeS4KKyAgICAvLyBUT0RPOiBjb21wYXJlRm9ybWF0cyBjb3VsZCBiZSBhIGxhbWJkYSB0byBjb252ZXJ0IGJldHdlZW4gcG9pbnRlci10by1mb3JtYXQgdG8gZm9ybWF0OgorICAgIC8vIFtdKGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQxLCBjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MikgeworICAgIC8vICAgICByZXR1cm4gY29tcGFyZUZvcm1hdHMoKmZvcm1hdDEsICpmb3JtYXQyKTsKKyAgICAvLyB9CisgICAgc29ydChjb21wYXJlRm9ybWF0cyk7CisgICAgcmV0dXJuIGluZGV4OworfQorCitzc2l6ZV90IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6YWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKQoreworICAgIC8vIENoZWNrIHZhbGlkIHByb2ZpbGUgdG8gYWRkOgorICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZEZvcm1hdCgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKKyAgICAgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7CisgICAgICAgIGZvcm1hdHMuYWRkKHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOworICAgICAgICBzZXRGb3JtYXRzKEZvcm1hdFZlY3Rvcihmb3JtYXRzKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmIHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIHNldFNhbXBsZVJhdGVzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0U2FtcGxlUmF0ZXMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAocHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIHNldENoYW5uZWxzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0Q2hhbm5lbHMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIHByb2ZpbGUgdG8gYXZvaWQgZHVwbGljYXRlcworICAgIGZvciAoc2l6ZV90IHByb2ZpbGVJbmRleCA9IDA7IHByb2ZpbGVJbmRleCA8IHNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSA9IGl0ZW1BdChwcm9maWxlSW5kZXgpOworICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpICYmIHByb2ZpbGUgPT0gcHJvZmlsZVRvQWRkKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCisgICAgICAgICAgICByZXR1cm4gcHJvZmlsZUluZGV4OworICAgICAgICB9CisgICAgfQorICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gc2V0IHRoZSBmb3JtYXQgYXMgZHluYW1pYyB0byBhbGxvdyByZW1vdmFsCisgICAgcmV0dXJuIGFkZChwcm9maWxlVG9BZGQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNoZWNrRXhhY3RQcm9maWxlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKQEAgLTI4MSw2ICszODQsMjI4IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNsZWFyUHJvZmlsZXMoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSBzaXplKCk7IGkgIT0gMDsgKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdCgtLWkpOworICAgICAgICBpZiAocHJvZmlsZS0+aXNEeW5hbWljRm9ybWF0KCkgJiYgcHJvZmlsZS0+aGFzVmFsaWRGb3JtYXQoKSkgeworICAgICAgICAgICAgcmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwcm9maWxlLT5jbGVhcigpOworICAgIH0KK30KKworLy8gUmV0dXJucyBhbiBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0d28gcG9zc2libHkgdW5zb3J0ZWQgdmVjdG9ycyBhbmQgdGhlIGNvbnRlbnRzIG9mICdvcmRlcicuCisvLyBUaGUgcmVzdWx0IGlzIG9yZGVyZWQgYWNjb3JkaW5nIHRvICdvcmRlcicuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBPcmRlcj4KK3N0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IGludGVyc2VjdEZpbHRlckFuZE9yZGVyKAorICAgICAgICBjb25zdCBUJiBpbnB1dDEsIGNvbnN0IFQmIGlucHV0MiwgY29uc3QgT3JkZXImIG9yZGVyKQoreworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHNldDF7aW5wdXQxLmJlZ2luKCksIGlucHV0MS5lbmQoKX07CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gc2V0MntpbnB1dDIuYmVnaW4oKSwgaW5wdXQyLmVuZCgpfTsKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBjb21tb247CisgICAgc3RkOjpzZXRfaW50ZXJzZWN0aW9uKHNldDEuYmVnaW4oKSwgc2V0MS5lbmQoKSwgc2V0Mi5iZWdpbigpLCBzZXQyLmVuZCgpLAorICAgICAgICAgICAgc3RkOjppbnNlcnRlcihjb21tb24sIGNvbW1vbi5iZWdpbigpKSk7CisgICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gcmVzdWx0OworICAgIGZvciAoY29uc3QgYXV0byYgZSA6IG9yZGVyKSB7CisgICAgICAgIGlmIChjb21tb24uZmluZChlKSAhPSBjb21tb24uZW5kKCkpIHJlc3VsdC5wdXNoX2JhY2soZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEludGVyc2VjdCB0d28gcG9zc2libHkgdW5zb3J0ZWQgdmVjdG9ycywgcmV0dXJuIGNvbW1vbiBlbGVtZW50cyBhY2NvcmRpbmcgdG8gJ2NvbXAnIG9yZGVyaW5nLgorLy8gJ2NvbXAnIGlzIGEgY29tcGFyYXRvciBmdW5jdGlvbi4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbXBhcmU+CitzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBpbnRlcnNlY3RBbmRPcmRlcigKKyAgICAgICAgY29uc3QgVCYgaW5wdXQxLCBjb25zdCBUJiBpbnB1dDIsIENvbXBhcmUgY29tcCkKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBDb21wYXJlPiBzZXQxe2lucHV0MS5iZWdpbigpLCBpbnB1dDEuZW5kKCksIGNvbXB9OworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUsIENvbXBhcmU+IHNldDJ7aW5wdXQyLmJlZ2luKCksIGlucHV0Mi5lbmQoKSwgY29tcH07CisgICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gcmVzdWx0OworICAgIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihzZXQxLmJlZ2luKCksIHNldDEuZW5kKCksIHNldDIuYmVnaW4oKSwgc2V0Mi5lbmQoKSwKKyAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihyZXN1bHQpLCBjb21wKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmZpbmRCZXN0TWF0Y2hpbmdPdXRwdXRDb25maWcoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBvdXRwdXRQcm9maWxlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiYgcHJlZmVycmVkRm9ybWF0cywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiYgcHJlZmVycmVkT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICBib29sIHByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMsCisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZSAqYmVzdE91dHB1dENvbmZpZykgY29uc3QKK3sKKyAgICBhdXRvIGZvcm1hdHMgPSBpbnRlcnNlY3RGaWx0ZXJBbmRPcmRlcihnZXRTdXBwb3J0ZWRGb3JtYXRzKCksCisgICAgICAgICAgICBvdXRwdXRQcm9maWxlcy5nZXRTdXBwb3J0ZWRGb3JtYXRzKCksIHByZWZlcnJlZEZvcm1hdHMpOworICAgIC8vIFBpY2sgdGhlIGJlc3QgY29tcGF0aWJsZSBwcm9maWxlLgorICAgIGZvciAoY29uc3QgYXV0byYgZiA6IGZvcm1hdHMpIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBpbnB1dFByb2ZpbGUgPSBnZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihmKTsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBvdXRwdXRQcm9maWxlID0gb3V0cHV0UHJvZmlsZXMuZ2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoZik7CisgICAgICAgIGlmIChpbnB1dFByb2ZpbGUgPT0gbnVsbHB0ciB8fCBvdXRwdXRQcm9maWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gY2hhbm5lbHMgPSBpbnRlcnNlY3RGaWx0ZXJBbmRPcmRlcihpbnB1dFByb2ZpbGUtPmdldENoYW5uZWxzKCkuYXNPdXRNYXNrKCksCisgICAgICAgICAgICAgICAgb3V0cHV0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwgcHJlZmVycmVkT3V0cHV0Q2hhbm5lbHMpOworICAgICAgICBpZiAoY2hhbm5lbHMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBzYW1wbGVSYXRlcyA9IHByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMgPworICAgICAgICAgICAgICAgIGludGVyc2VjdEFuZE9yZGVyKGlucHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwgb3V0cHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z3JlYXRlcjx0eXBlbmFtZSBTYW1wbGVSYXRlVmVjdG9yOjp2YWx1ZV90eXBlPigpKSA6CisgICAgICAgICAgICAgICAgaW50ZXJzZWN0QW5kT3JkZXIoaW5wdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLCBvdXRwdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsZXNzPHR5cGVuYW1lIFNhbXBsZVJhdGVWZWN0b3I6OnZhbHVlX3R5cGU+KCkpOworICAgICAgICBpZiAoc2FtcGxlUmF0ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIiVzKCkgZm91bmQgY2hhbm5lbCBtYXNrICUjeCBhbmQgc2FtcGxlIHJhdGUgJWQgZm9yIGZvcm1hdCAlI3guIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKmNoYW5uZWxzLmJlZ2luKCksICpzYW1wbGVSYXRlcy5iZWdpbigpLCBmKTsKKyAgICAgICAgYmVzdE91dHB1dENvbmZpZy0+Zm9ybWF0ID0gZjsKKyAgICAgICAgYmVzdE91dHB1dENvbmZpZy0+c2FtcGxlX3JhdGUgPSAqc2FtcGxlUmF0ZXMuYmVnaW4oKTsKKyAgICAgICAgYmVzdE91dHB1dENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gKmNoYW5uZWxzLmJlZ2luKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldEZpcnN0VmFsaWRQcm9maWxlKCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmlzVmFsaWQoKSAmJiBpdGVtQXQoaSktPmdldEZvcm1hdCgpID09IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworRm9ybWF0VmVjdG9yIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0Cit7CisgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5oYXNWYWxpZEZvcm1hdCgpKSB7CisgICAgICAgICAgICBzdXBwb3J0ZWRGb3JtYXRzLmFkZChpdGVtQXQoaSktPmdldEZvcm1hdCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3VwcG9ydGVkRm9ybWF0czsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNDaGFubmVsc0ZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6aGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNEeW5hbWljKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OnNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKQoreworICAgIC8vIE9ubHkgYWxsb3cgdG8gY2hhbmdlIHRoZSBmb3JtYXQgb2YgZHluYW1pYyBwcm9maWxlCisgICAgc3A8QXVkaW9Qcm9maWxlPiBkeW5hbWljRm9ybWF0UHJvZmlsZSA9IGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpOworICAgIGlmIChkeW5hbWljRm9ybWF0UHJvZmlsZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0c1tpXSwKKyAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7CisgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7CisgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyhkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSk7CisgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNSYXRlKGR5bmFtaWNGb3JtYXRQcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpOworICAgICAgICBhZGQocHJvZmlsZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUHJvZmlsZXM6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQcm9maWxlICV6dToiLCBzcGFjZXMgKyA0LCAiIiwgaSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIHNwYWNlcyArIDgpOworICAgIH0KK30KKworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6c2V0U2FtcGxlUmF0ZXNGb3IoCisgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcHJvZmlsZSB3aXRoIHNhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgcHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVzKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCisgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldFNhbXBsZVJhdGVzKHNhbXBsZVJhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OnNldENoYW5uZWxzRm9yKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRDaGFubmVscygpKSB7CisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcHJvZmlsZSB3aXRoIHNhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZworICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRDaGFubmVscyhjaGFubmVsTWFza3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCisvLyBzdGF0aWMKIGludCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNvbXBhcmVGb3JtYXRzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTIpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCmluZGV4IDc5YWQxZjcuLjc5ZjA5MTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCkBAIC0yNCwyOSArMjQsMzIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkCiB7CiAKLXZvaWQgQXVkaW9Sb3V0ZTo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Cit2b2lkIEF1ZGlvUm91dGU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBUeXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVR5cGUgPT0gQVVESU9fUk9VVEVfTVVYID8gIk11eCIgOiAiTWl4Iik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBTaW5rOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVNpbmstPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UeXBlID09IEFVRElPX1JPVVRFX01VWCA/ICJNdXgiIDogIk1peCIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNpbms6ICVzXG4iLCBzcGFjZXMsICIiLCBtU2luay0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKICAgICBpZiAobVNvdXJjZXMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBTb3VyY2VzOiBcbiIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZXM6IFxuIiwgc3BhY2VzLCAiIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcyVzIFxuIiwgc3BhY2VzICsgNCwgIiIsIG1Tb3VyY2VzW2ldLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzIFxuIiwgc3BhY2VzICsgNCwgIiIsIG1Tb3VyY2VzW2ldLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7Cit9CiAKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK2Jvb2wgQXVkaW9Sb3V0ZTo6c3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdAoreworICAgIGlmIChtU2luayA9PSAwIHx8IGRzdFBvcnQgPT0gMCB8fCBkc3RQb3J0ICE9IG1TaW5rKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBzaW5rcyAlcyBtYXRjaGluZyIsIF9fRlVOQ1RJT05fXywgbVNpbmstPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZzb3VyY2VQb3J0IDogbVNvdXJjZXMpIHsKKyAgICAgICAgaWYgKHNvdXJjZVBvcnQgPT0gc3JjUG9ydCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBzb3VyY2VzICVzIG1hdGNoaW5nIiwgX19GVU5DVElPTl9fLCBzb3VyY2VQb3J0LT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkYTQ2Yi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9TZXNzaW9uIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJwb2xpY3kuaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb24uaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCi0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUF1ZGlvU2Vzc2lvbjo6QXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKSA6Ci0gICAgbVJlY29yZENsaWVudEluZm8oeyAudWlkID0gdWlkLCAuc2Vzc2lvbiA9IHNlc3Npb24sIC5zb3VyY2UgPSBpbnB1dFNvdXJjZX0pLAotICAgIG1Db25maWcoeyAuZm9ybWF0ID0gZm9ybWF0LCAuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlLCAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2t9KSwKLSAgICBtRmxhZ3MoZmxhZ3MpLCBtSXNTb3VuZFRyaWdnZXIoaXNTb3VuZFRyaWdnZXIpLAotICAgIG1PcGVuQ291bnQoMSksIG1BY3RpdmVDb3VudCgwKSwgbVBvbGljeU1peChwb2xpY3lNaXgpLCBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCi0gICAgbUluZm9Qcm92aWRlcihOVUxMKQotewotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb246OmNoYW5nZU9wZW5Db3VudChpbnQgZGVsdGEpCi17Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbU9wZW5Db3VudCkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBpbnZhbGlkIGRlbHRhICVkLCBvcGVuIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZWx0YSwgbU9wZW5Db3VudCk7Ci0gICAgICAgIG1PcGVuQ291bnQgPSAodWludDMyX3QpKC1kZWx0YSk7Ci0gICAgfQotICAgIG1PcGVuQ291bnQgKz0gZGVsdGE7Ci0gICAgQUxPR1YoIiVzIG9wZW4gY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIG1PcGVuQ291bnQpOwotICAgIHJldHVybiBtT3BlbkNvdW50OwotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KGludCBkZWx0YSkKLXsKLSAgICBjb25zdCB1aW50MzJfdCBvbGRBY3RpdmVDb3VudCA9IG1BY3RpdmVDb3VudDsKLSAgICBpZiAoKGRlbHRhICsgKGludCltQWN0aXZlQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZWx0YSwgbUFjdGl2ZUNvdW50KTsKLSAgICAgICAgbUFjdGl2ZUNvdW50ID0gKHVpbnQzMl90KSgtZGVsdGEpOwotICAgIH0KLSAgICBtQWN0aXZlQ291bnQgKz0gZGVsdGE7Ci0gICAgQUxPR1YoIiVzIGFjdGl2ZSBjb3VudCAlZCIsIF9fRlVOQ1RJT05fXywgbUFjdGl2ZUNvdW50KTsKLSAgICBpbnQgZXZlbnQgPSBSRUNPUkRfQ09ORklHX0VWRU5UX05PTkU7Ci0KLSAgICBpZiAoKG9sZEFjdGl2ZUNvdW50ID09IDApICYmIChtQWN0aXZlQ291bnQgPiAwKSkgewotICAgICAgICBldmVudCA9IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQ7Ci0gICAgfSBlbHNlIGlmICgob2xkQWN0aXZlQ291bnQgPiAwKSAmJiAobUFjdGl2ZUNvdW50ID09IDApKSB7Ci0gICAgICAgIGV2ZW50ID0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QOwotICAgIH0KLQotICAgIGlmIChldmVudCAhPSBSRUNPUkRfQ09ORklHX0VWRU5UX05PTkUpIHsKLSAgICAgICAgLy8gRHluYW1pYyBwb2xpY3kgY2FsbGJhY2s6Ci0gICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCi0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoZXZlbnQgPT0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCkgPyBNSVhfU1RBVEVfTUlYSU5HIDogTUlYX1NUQVRFX0lETEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gY2FsbGJhY2s6Ci0gICAgICAgIGNvbnN0IEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciogcHJvdmlkZXIgPSBtSW5mb1Byb3ZpZGVyOwotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZyA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRDb25maWcoKSA6Ci0gICAgICAgICAgICAgICAgQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldFBhdGNoSGFuZGxlKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICBpZiAocGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJm1SZWNvcmRDbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1BY3RpdmVDb3VudDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb246Om1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKG90aGVyLT5zZXNzaW9uKCkgPT0gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbiAmJgotICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UgJiYKLSAgICAgICAgb3RoZXItPmZvcm1hdCgpID09IG1Db25maWcuZm9ybWF0ICYmCi0gICAgICAgIG90aGVyLT5zYW1wbGVSYXRlKCkgPT0gbUNvbmZpZy5zYW1wbGVfcmF0ZSAmJgotICAgICAgICBvdGhlci0+Y2hhbm5lbE1hc2soKSA9PSBtQ29uZmlnLmNoYW5uZWxfbWFzayAmJgotICAgICAgICBvdGhlci0+ZmxhZ3MoKSA9PSBtRmxhZ3MgJiYKLSAgICAgICAgb3RoZXItPnVpZCgpID09IG1SZWNvcmRDbGllbnRJbmZvLnVpZCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvU2Vzc2lvbjo6c2V0SW5mb1Byb3ZpZGVyKEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpCi17Ci0gICAgbUluZm9Qcm92aWRlciA9IHByb3ZpZGVyOwotfQotCi12b2lkIEF1ZGlvU2Vzc2lvbjo6b25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1BY3RpdmVDb3VudCA+IDApIHsKLSAgICAgICAgLy8gcmVzZW5kIHRoZSBjYWxsYmFjayBhZnRlciByZXF1ZXJ5aW5nIHRoZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgaW5mbyBwcm92aWRlcgotICAgICAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIHByb3ZpZGVyID0gbUluZm9Qcm92aWRlcjsKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWcgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0Q29uZmlnKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwotICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRQYXRjaEhhbmRsZSgpIDoKLSAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwKLSAgICAgICAgICAgICAgICAgICAgJm1SZWNvcmRDbGllbnRJbmZvLCAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb246OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBzZXNzaW9uICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2Vzc2lvbjogJTJkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8udWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpbnB1dCBzb3VyY2U6ICVkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdDogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUNvbmZpZy5mb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsZTogJWRcbiIsIHNwYWNlcywgIiIsIG1Db25maWcuc2FtcGxlX3JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFzazogJTA4eFxuIiwKLSAgICAgICAgICAgICBzcGFjZXMsICIiLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaXMgc291bmR0cmlnZ2VyOiAlc1xuIiwKLSAgICAgICAgICAgICBzcGFjZXMsICIiLCBtSXNTb3VuZFRyaWdnZXIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvcGVuIGNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbU9wZW5Db3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWN0aXZlIGNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2ZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmFkZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcikKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKLQotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTZXNzaW9uKCkgc2Vzc2lvbiAlZCBhbHJlYWR5IGluIiwgc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0gICAgYXVkaW9TZXNzaW9uLT5zZXRJbmZvUHJvdmlkZXIocHJvdmlkZXIpOwotICAgIGFkZChzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwotICAgIEFMT0dWKCJhZGRTZXNzaW9uKCkgc2Vzc2lvbiAlZCAgY2xpZW50ICVkIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBzZXNzaW9uLCBhdWRpb1Nlc3Npb24tPnVpZCgpLCBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6cmVtb3ZlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbW92ZVNlc3Npb24oKSBzZXNzaW9uICVkIG5vdCBpbiIsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotICAgIEFMT0dWKCJyZW1vdmVTZXNzaW9uKCkgc2Vzc2lvbiAlZCIsIHNlc3Npb24pOwotICAgIHZhbHVlQXQoaW5kZXgpLT5zZXRJbmZvUHJvdmlkZXIoTlVMTCk7Ci0gICAgcmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRPcGVuQ291bnQoKSBjb25zdAotewotICAgIHVpbnQzMl90IG9wZW5Db3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBvcGVuQ291bnQgKz0gdmFsdWVBdChpKS0+b3BlbkNvdW50KCk7Ci0gICAgfQotICAgIHJldHVybiBvcGVuQ291bnQ7Ci19Ci0KLUF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0QWN0aXZlU2Vzc2lvbnMoKSBjb25zdAotewotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAodmFsdWVBdChpKS0+YWN0aXZlQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY3RpdmVTZXNzaW9ucy5hZGQodmFsdWVBdChpKS0+c2Vzc2lvbigpLCB2YWx1ZUF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWN0aXZlU2Vzc2lvbnM7Ci19Ci0KLXNpemVfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRBY3RpdmVTZXNzaW9uQ291bnQoKSBjb25zdAotewotICAgIHNpemVfdCBhY3RpdmVDb3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAodmFsdWVBdChpKS0+YWN0aXZlQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY3RpdmVDb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhY3RpdmVDb3VudDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpoYXNBY3RpdmVTZXNzaW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgIT0gMDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICBhdWRpb1Nlc3Npb24gPSB2YWx1ZUF0KGkpOwotICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBlcXVpdmFsZW50IHRvIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBvbmx5IGlmIGl0Ci0gICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjYXB0dXJlIHRyaWdnZXJlZCBieSBhIGhhcmR3YXJlIGhvdHdvcmQgcmVjb2duaXRpb24KLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAoKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBzb3VyY2UpIHx8Ci0gICAgICAgICAgICAgICAgKChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSAmJgotICAgICAgICAgICAgICAgICAoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJgotICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmlzU291bmRUcmlnZ2VyKCkpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1hdWRpb19zb3VyY2VfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAotewotICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUOwotICAgIGludDMyX3QgcHJpb3JpdHkgPSAtMTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAgYXVkaW9TZXNzaW9uID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgY3VyUHJpb3JpdHkgPSBzb3VyY2VfcHJpb3JpdHkoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKLSAgICAgICAgaWYgKGN1clByaW9yaXR5ID4gcHJpb3JpdHkpIHsKLSAgICAgICAgICAgIHByaW9yaXR5ID0gY3VyUHJpb3JpdHk7Ci0gICAgICAgICAgICBzb3VyY2UgPSBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3QKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPm9uU2Vzc2lvbkluZm9VcGRhdGUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIFNlc3Npb25zOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzNlNTcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Tb3VyY2VEZXNjcmlwdG9yIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8SHdNb2R1bGUuaD4KLSNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KLSNpbmNsdWRlIDxBdWRpb1NvdXJjZURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8SU9Qcm9maWxlLmg+Ci0jaW5jbHVkZSA8QXVkaW9PdXRwdXREZXNjcmlwdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdHVzX3QgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIm1TdHJlYW06ICVkXG4iLCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtRGV2aWNlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1EZXZpY2UtPmR1bXAoZmQsIDIgLCAwKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLQotc3RhdHVzX3QgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gc291cmNlcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBTb3VyY2UgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwN2FiMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE1fQ2xpZW50RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPFR5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJBdWRpb091dHB1dERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIklPUHJvZmlsZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0ZDo6c3RyaW5nIENsaWVudERlc2NyaXB0b3I6OnRvU2hvcnRTdHJpbmcoKSBjb25zdAoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgc3MgPDwgIlBvcnRJZDogIiA8PCBtUG9ydElkIDw8ICIgU2Vzc2lvbklkOiAiIDw8IG1TZXNzaW9uSWQgPDwgIiBVaWQ6ICIgPDwgbVVpZDsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzQ2xpZW50ICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUG9ydCBJZDogJWQgU2Vzc2lvbiBJZDogJWQgVUlEOiAlZFxuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgICBtUG9ydElkLCBtU2Vzc2lvbklkLCBtVWlkKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBGb3JtYXQ6ICUwOHggU2FtcGxpbmcgcmF0ZTogJWQgQ2hhbm5lbHM6ICUwOHhcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgbUNvbmZpZy5mb3JtYXQsIG1Db25maWcuc2FtcGxlX3JhdGUsIG1Db25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBBdHRyaWJ1dGVzOiAlc1xuIiwgc3BhY2VzLCAiIiwgdG9TdHJpbmcobUF0dHJpYnV0ZXMpLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByZWZlcnJlZCBEZXZpY2UgSWQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1QcmVmZXJyZWREZXZpY2VJZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU3RhdGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtQWN0aXZlID8gIkFjdGl2ZSIgOiAiSW5hY3RpdmUiKTsKK30KKwordm9pZCBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFN0cmVhbTogJWQgZmxhZ3M6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1TdHJlYW0sIG1GbGFncyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUmVmY291bnQ6ICVkXG4iLCBzcGFjZXMsICIiLCBtQWN0aXZpdHlDb3VudCk7Cit9CisKK3N0ZDo6c3RyaW5nIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBzcyA8PCBDbGllbnREZXNjcmlwdG9yOjp0b1Nob3J0U3RyaW5nKCkgPDwgIiBTdHJlYW06ICIgPDwgbVN0cmVhbTsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVwbGFjZVZhbHVlRm9yKGVmZmVjdC0+bUlkLCBlZmZlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmFibGVkRWZmZWN0cy5yZW1vdmVJdGVtKGVmZmVjdC0+bUlkKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBpbmRleCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlOiAlZCBmbGFnczogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbVNvdXJjZSwgbUZsYWdzKTsKKyAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIHNwYWNlcyArIDIgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOworfQorCitTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpTb3VyY2VDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsCisgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoRGVzYywKKyAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBzcmNEZXZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlKSA6CisgICAgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpUcmFja0NsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIEFVRElPX1NFU1NJT05fTk9ORSwgYXR0cmlidXRlcywKKyAgICAgICAgQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVIsIEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgIHN0cmVhbSwgc3RyYXRlZ3ksIHZvbHVtZVNvdXJjZSwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgZmFsc2UsCisgICAgICAgIHt9IC8qIFNvdXJjZXMgZG8gbm90IHN1cHBvcnQgc2Vjb25kYXJ5IG91dHB1dHMqLyksCisgICAgICAgIG1QYXRjaERlc2MocGF0Y2hEZXNjKSwgbVNyY0RldmljZShzcmNEZXZpY2UpCit7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6c2V0U3dPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBzd091dHB1dCkKK3sKKyAgICBtU3dPdXRwdXQgPSBzd091dHB1dDsKK30KKwordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpzZXRId091dHB1dChjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGh3T3V0cHV0KQoreworICAgIG1Id091dHB1dCA9IGh3T3V0cHV0OworfQorCit2b2lkIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBpbmRleCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRGV2aWNlOlxuIiwgc3BhY2VzLCAiIik7CisgICAgbVNyY0RldmljZS0+ZHVtcChkc3QsIDIsIDApOworfQorCit2b2lkIFNvdXJjZUNsaWVudENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kKCJcbkF1ZGlvIHNvdXJjZXM6XG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKKyAgICB9Cit9CisKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTEwNWY1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpDb25maWdQYXJzaW5nVXRpbHMiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJDb25maWdQYXJzaW5nVXRpbHMuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLSBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQXVkaW9Qb3J0R2Fpbihjbm9kZSAqcm9vdCwgQXVkaW9Qb3J0ICZhdWRpb1BvcnQsIGludCBpbmRleCkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgc3A8QXVkaW9HYWluPiBnYWluID0gbmV3IEF1ZGlvR2FpbihpbmRleCwgYXVkaW9Qb3J0LnVzZUlucHV0Q2hhbm5lbE1hc2soKSk7Ci0KLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTU9ERSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0TW9kZShHYWluTW9kZUNvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9DSEFOTkVMUykgPT0gMCkgewotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzazsKLSAgICAgICAgICAgIGlmIChhdWRpb1BvcnQudXNlSW5wdXRDaGFubmVsTWFzaygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKElucHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhub2RlLT52YWx1ZSwgbWFzaykpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2Fpbi0+c2V0Q2hhbm5lbE1hc2sobWFzayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhub2RlLT52YWx1ZSwgbWFzaykpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2Fpbi0+c2V0Q2hhbm5lbE1hc2sobWFzayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0TWluVmFsdWVJbk1iKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1heFZhbHVlSW5NYihhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fREVGQVVMVF9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0RGVmYXVsdFZhbHVlSW5NYihhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fU1RFUF9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0U3RlcFZhbHVlSW5NYihhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1JBTVBfTVMpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1pblJhbXBJbk1zKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfUkFNUF9NUykgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0TWF4UmFtcEluTXMoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLQotICAgIEFMT0dWKCJsb2FkR2FpbigpIGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsCi0gICAgICAgICAgZ2Fpbi0+Z2V0TW9kZSgpLCBnYWluLT5nZXRDaGFubmVsTWFzaygpLCBnYWluLT5nZXRNaW5WYWx1ZUluTWIoKSwKLSAgICAgICAgICBnYWluLT5nZXRNYXhWYWx1ZUluTWIoKSk7Ci0KLSAgICBpZiAoZ2Fpbi0+Z2V0TW9kZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhdWRpb1BvcnQubUdhaW5zLmFkZChnYWluKTsKLX0KLQotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRBdWRpb1BvcnRHYWlucyhjbm9kZSAqcm9vdCwgQXVkaW9Qb3J0ICZhdWRpb1BvcnQpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkR2FpbnMoKSBsb2FkaW5nIGdhaW4gJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgbG9hZEF1ZGlvUG9ydEdhaW4obm9kZSwgYXVkaW9Qb3J0LCBpbmRleCsrKTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWREZXZpY2VEZXNjcmlwdG9yR2FpbnMoY25vZGUgKnJvb3QsIHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2VEZXNjKQotewotICAgIGxvYWRBdWRpb1BvcnRHYWlucyhyb290LCAqZGV2aWNlRGVzYyk7Ci0gICAgaWYgKGRldmljZURlc2MtPm1HYWlucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIGRldmljZURlc2MtPm1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmZGV2aWNlRGVzYy0+bUdhaW4pOwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlRGV2aWNlKGNub2RlICpyb290LCBEZXZpY2VWZWN0b3IgJmRldmljZXMpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBBUE1fREVWSUNFX1RZUEUpID09IDApIHsKLSAgICAgICAgICAgIGRldmljZUZyb21TdHJpbmcobm9kZS0+dmFsdWUsIHR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9OT05FIHx8Ci0gICAgICAgICAgICAoIWF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSAmJiAhYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSkpIHsKLSAgICAgICAgQUxPR1coImxvYWREZXZpY2UoKSBiYWQgdHlwZSAlMDh4IiwgdHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlLCBTdHJpbmc4KHJvb3QtPm5hbWUpKTsKLQotICAgIG5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEFQTV9ERVZJQ0VfQUREUkVTUykgPT0gMCkgewotICAgICAgICAgICAgZGV2aWNlRGVzYy0+bUFkZHJlc3MgPSBTdHJpbmc4KChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VEZXNjLT5hZGRBdWRpb1Byb2ZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlVmVjdG9yKCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+YWRkQXVkaW9Qcm9maWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q2hhbm5lbE1hc2tzRnJvbVN0cmluZyhub2RlLT52YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGVWZWN0b3IoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIGxvYWREZXZpY2VEZXNjcmlwdG9yR2FpbnMobm9kZSwgZGV2aWNlRGVzYyk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotCi0gICAgQUxPR1YoImxvYWREZXZpY2UoKSBhZGRpbmcgZGV2aWNlIHRhZyAobGl0ZXJhbCB0eXBlKSAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgZGV2aWNlRGVzYy0+Z2V0VGFnTmFtZSgpLnN0cmluZygpLCB0eXBlLCBkZXZpY2VEZXNjLT5tQWRkcmVzcy5zdHJpbmcoKSk7Ci0KLSAgICBkZXZpY2VzLmFkZChkZXZpY2VEZXNjKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZVByb2ZpbGUoY25vZGUgKnJvb3QsIHNwPEh3TW9kdWxlPiAmbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChyb290LT5uYW1lKSwgcm9sZSk7Ci0KLSAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgYXVkaW9Qcm9maWxlczsKLSAgICBTYW1wbGVSYXRlVmVjdG9yIHNhbXBsZVJhdGVzOwotICAgIENoYW5uZWxzVmVjdG9yIGNoYW5uZWxzOwotICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOwotCi0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGT1JNQVRTX1RBRykgPT0gMCAmJgotICAgICAgICAgICAgICAgIHN0cmNtcChub2RlLT52YWx1ZSwgRFlOQU1JQ19WQUxVRV9UQUcpICE9IDApIHsKLSAgICAgICAgICAgIGZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIFNBTVBMSU5HX1JBVEVTX1RBRykgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgc3RyY21wKG5vZGUtPnZhbHVlLCBEWU5BTUlDX1ZBTFVFX1RBRykgIT0gMCkgewotICAgICAgICAgICAgY29sbGVjdGlvbkZyb21TdHJpbmc8U2FtcGxlUmF0ZVRyYWl0cz4obm9kZS0+dmFsdWUsIHNhbXBsZVJhdGVzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgc3RyY21wKG5vZGUtPnZhbHVlLCBEWU5BTUlDX1ZBTFVFX1RBRykgIT0gMCkgewotICAgICAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKLSAgICAgICAgICAgICAgICBjaGFubmVscyA9IGlucHV0Q2hhbm5lbE1hc2tzRnJvbVN0cmluZyhub2RlLT52YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gb3V0cHV0Q2hhbm5lbE1hc2tzRnJvbVN0cmluZyhub2RlLT52YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRVNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICAgICAgICAgIGxvYWREZXZpY2VzRnJvbVRhZyhub2RlLT52YWx1ZSwgZGV2aWNlcywgbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXRTdXBwb3J0ZWREZXZpY2VzKGRldmljZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGTEFHU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0RmxhZ3MoSW5wdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhub2RlLT52YWx1ZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRGbGFncyhPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhub2RlLT52YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIGxvYWRBdWRpb1BvcnRHYWlucyhub2RlLCAqcHJvZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIGlmIChmb3JtYXRzLmlzRW1wdHkoKSkgewotICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGVSYXRlcyk7Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljQ2hhbm5lbHMoY2hhbm5lbHMuaXNFbXB0eSgpKTsKLSAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljUmF0ZShzYW1wbGVSYXRlcy5pc0VtcHR5KCkpOwotICAgICAgICBhdWRpb1Byb2ZpbGVzLmFkZChwcm9maWxlVG9BZGQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgcmVhc29uLCBmb3IgZWFjaCBmb3JtYXQsIGNyZWF0ZXMgYSBwcm9maWxlIHdpdGggdGhlIHNhbWUKLSAgICAgICAgICAgIC8vIGNvbGxlY3Rpb24gb2YgcmF0ZSBhbmQgY2hhbm5lbHMuCi0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0c1tpXSwgY2hhbm5lbHMsIHNhbXBsZVJhdGVzKTsKLSAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdChmb3JtYXRzW2ldID09IGdEeW5hbWljRm9ybWF0KTsKLSAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0NoYW5uZWxzKGNoYW5uZWxzLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNSYXRlKHNhbXBsZVJhdGVzLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICBhdWRpb1Byb2ZpbGVzLmFkZChwcm9maWxlVG9BZGQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByb2ZpbGUtPnNldEF1ZGlvUHJvZmlsZXMoYXVkaW9Qcm9maWxlcyk7Ci0gICAgQUxPR1dfSUYoIXByb2ZpbGUtPmhhc1N1cHBvcnRlZERldmljZXMoKSwgImxvYWQlcygpIGludmFsaWQgc3VwcG9ydGVkIGRldmljZXMiLAotICAgICAgICAgICAgIHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgPyAiSW5wdXQiIDogIk91dHB1dCIpOwotICAgIGlmIChwcm9maWxlLT5oYXNTdXBwb3J0ZWREZXZpY2VzKCkpIHsKLSAgICAgICAgQUxPR1YoImxvYWQlcygpIGFkZGluZyBTdXBwb3J0ZWQgRGV2aWNlcyAlMDR4LCBtRmxhZ3MgJTA0eCIsCi0gICAgICAgICAgICAgIHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgPyAiSW5wdXQiIDogIk91dHB1dCIsCi0gICAgICAgICAgICAgIHByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCksIHByb2ZpbGUtPmdldEZsYWdzKCkpOwotICAgICAgICByZXR1cm4gbW9kdWxlLT5hZGRQcm9maWxlKHByb2ZpbGUpOwotICAgIH0KLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi0vL3N0YXRpYwotc3RhdHVzX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QsIHNwPEh3TW9kdWxlPiAmbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIERFVklDRVNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBkZXZpY2UgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IGxvYWRId01vZHVsZURldmljZShub2RlLCBkZXZpY2VzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgbW9kdWxlLT5zZXREZWNsYXJlZERldmljZXMoZGV2aWNlcyk7Ci0gICAgfQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBPVVRQVVRTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBvdXRwdXQgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IGxvYWRId01vZHVsZVByb2ZpbGUobm9kZSwgbW9kdWxlLCBBVURJT19QT1JUX1JPTEVfU09VUkNFKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIElOUFVUU19UQUcpOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgaW5wdXQgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IGxvYWRId01vZHVsZVByb2ZpbGUobm9kZSwgbW9kdWxlLCBBVURJT19QT1JUX1JPTEVfU0lOSyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgfQotICAgIGxvYWRNb2R1bGVHbG9iYWxDb25maWcocm9vdCwgbW9kdWxlLCBjb25maWcpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgQVVESU9fSFdfTU9EVUxFX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGVzKCkgbG9hZGluZyBtb2R1bGUgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShub2RlLT5uYW1lKTsKLSAgICAgICAgaWYgKGxvYWRId01vZHVsZShub2RlLCBtb2R1bGUsIGNvbmZpZykgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGh3TW9kdWxlcy5hZGQobW9kdWxlKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZERldmljZXNGcm9tVGFnKGNvbnN0IGNoYXIgKnRhZywgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRlY2xhcmVkRGV2aWNlcykKLXsKLSAgICBjaGFyICp0YWdMaXRlcmFsID0gc3RybmR1cCh0YWcsIHN0cmxlbih0YWcpKTsKLSAgICBjaGFyICpkZXZUYWcgPSBzdHJ0b2sodGFnTGl0ZXJhbCwgQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7Ci0gICAgd2hpbGUgKGRldlRhZyAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJsZW4oZGV2VGFnKSAhPSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZTsKLSAgICAgICAgICAgIGlmIChkZXZpY2VGcm9tU3RyaW5nKGRldlRhZywgdHlwZSkpIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBpbkJpdCA9IHR5cGUgJiBBVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICAgICAgICAgIHR5cGUgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHR5cGUpIHsKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBzaW5nbGVUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluQml0IHwgKDEgPDwgKDMxIC0gX19idWlsdGluX2Nseih0eXBlKSkpOwotICAgICAgICAgICAgICAgICAgICB0eXBlICY9IH5zaW5nbGVUeXBlOwotICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXYgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihzaW5nbGVUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzLmdldERldmljZUZyb21UYWdOYW1lKFN0cmluZzgoZGV2VGFnKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZURlc2MgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2VEZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGV2VGFnID0gc3RydG9rKE5VTEwsIEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwotICAgIH0KLSAgICBmcmVlKHRhZ0xpdGVyYWwpOwotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRNb2R1bGVHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIGNvbnN0IHNwPEh3TW9kdWxlPiAmbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEdMT0JBTF9DT05GSUdfVEFHKTsKLQotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzOwotICAgIGlmIChtb2R1bGUgIT0gTlVMTCkgewotICAgICAgICBkZWNsYXJlZERldmljZXMgPSBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpOwotICAgIH0KLQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKEFUVEFDSEVEX09VVFBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXM7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlc0Zyb21UYWcobm9kZS0+dmFsdWUsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF0dGFjaGVkIE91dHB1dCBEZXZpY2VzICUwOHgiLAotICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKTsKLSAgICAgICAgICAgIGNvbmZpZy5hZGRBdmFpbGFibGVPdXRwdXREZXZpY2VzKGF2YWlsYWJsZU91dHB1dERldmljZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChERUZBVUxUX09VVFBVVF9ERVZJQ0VfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgICAgICAgICBkZXZpY2VGcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCBkZXZpY2UpOwotICAgICAgICAgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOwotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXREZWZhdWx0T3V0cHV0RGV2aWNlKGRlZmF1bHRPdXRwdXREZXZpY2UpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbURlZmF1bHRPdXRwdXREZXZpY2UgJTA4eCIsIGRlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJsb2FkR2xvYmFsQ29uZmlnKCkgZGVmYXVsdCBkZXZpY2Ugbm90IHNwZWNpZmllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVFRBQ0hFRF9JTlBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlczsKLSAgICAgICAgICAgIGxvYWREZXZpY2VzRnJvbVRhZyhub2RlLT52YWx1ZSwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBkZWNsYXJlZERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBBdmFpbGFibGUgSW5wdXREZXZpY2VzICUwOHgiLCBhdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSk7Ci0gICAgICAgICAgICBjb25maWcuYWRkQXZhaWxhYmxlSW5wdXREZXZpY2VzKGF2YWlsYWJsZUlucHV0RGV2aWNlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKEFVRElPX0hBTF9WRVJTSU9OX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgdWludDMyX3QgbWFqb3IsIG1pbm9yOwotICAgICAgICAgICAgc3NjYW5mKChjaGFyICopbm9kZS0+dmFsdWUsICIldS4ldSIsICZtYWpvciwgJm1pbm9yKTsKLSAgICAgICAgICAgIG1vZHVsZS0+c2V0SGFsVmVyc2lvbihtYWpvciwgbWlub3IpOwotICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtSGFsVmVyc2lvbiA9IG1ham9yICV1IG1pbm9yICV1IiwgbWFqb3IsIG1pbm9yKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEh3TW9kdWxlPiYgcHJpbWFyeU1vZHVsZSkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEdMT0JBTF9DT05GSUdfVEFHKTsKLQotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChTUEVBS0VSX0RSQ19FTkFCTEVEX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgYm9vbCBzcGVha2VyRHJjRW5hYmxlZDsKLSAgICAgICAgICAgIGlmICh1dGlsaXRpZXM6OmNvbnZlcnRUbzxzdGQ6OnN0cmluZywgYm9vbD4obm9kZS0+dmFsdWUsIHNwZWFrZXJEcmNFbmFibGVkKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbVNwZWFrZXJEcmNFbmFibGVkID0gJWQiLCBzcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldFNwZWFrZXJEcmNFbmFibGVkKHNwZWFrZXJEcmNFbmFibGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgbG9hZE1vZHVsZUdsb2JhbENvbmZpZyhyb290LCBwcmltYXJ5TW9kdWxlLCBjb25maWcpOwotfQotCi0vL3N0YXRpYwotc3RhdHVzX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgY25vZGUgKnJvb3Q7Ci0gICAgY2hhciAqZGF0YTsKLQotICAgIGRhdGEgPSAoY2hhciAqKWxvYWRfZmlsZShwYXRoLCBOVUxMKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKLSAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKLQotICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBod01vZHVsZXM7Ci0gICAgbG9hZEh3TW9kdWxlcyhyb290LCBod01vZHVsZXMsIGNvbmZpZyk7Ci0KLSAgICAvLyBsZWdhY3kgYXVkaW9fcG9saWN5LmNvbmYgZmlsZXMgaGF2ZSBvbmUgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gc2VjdGlvbiwgYXR0YWNoZWQgdG8gcHJpbWFyeS4KLSAgICBsb2FkR2xvYmFsQ29uZmlnKHJvb3QsIGNvbmZpZywgaHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSk7Ci0KLSAgICBjb25maWcuc2V0SHdNb2R1bGVzKGh3TW9kdWxlcyk7Ci0KLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0KLSAgICBBTE9HSSgibG9hZEF1ZGlvUG9saWN5Q29uZmlnKCkgbG9hZGVkICVzXG4iLCBwYXRoKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAppbmRleCAxOWMyMDYyLi45MTk2MWQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApAQCAtMTgsNiArMTgsOCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgpAQCAtMjYsMTQgKzI4LDMwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIERldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzggJnRhZ05hbWUpIDoKKyAgICAgICAgRGV2aWNlRGVzY3JpcHRvcih0eXBlLCBGb3JtYXRWZWN0b3J7fSwgdGFnTmFtZSkKK3sKK30KKworRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgRm9ybWF0VmVjdG9yICZlbmNvZGVkRm9ybWF0cywKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgOgogICAgIEF1ZGlvUG9ydChTdHJpbmc4KCIiKSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwKICAgICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/IEFVRElPX1BPUlRfUk9MRV9TSU5LIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpLAotICAgIG1BZGRyZXNzKCIiKSwgbVRhZ05hbWUodGFnTmFtZSksIG1EZXZpY2VUeXBlKHR5cGUpLCBtSWQoMCkKKyAgICBtVGFnTmFtZSh0YWdOYW1lKSwgbURldmljZVR5cGUodHlwZSksIG1FbmNvZGVkRm9ybWF0cyhlbmNvZGVkRm9ybWF0cykKIHsKKyAgICBtQ3VycmVudEVuY29kZWRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCB8fCB0eXBlID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCApIHsKICAgICAgICAgbUFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CiAgICAgfQorICAgIC8qIElmIGZyYW1ld29yayBydW5zIGFnYWluc3QgYSBwcmUgNS4wIEF1ZGlvIEhBTCwgZW5jb2RlZCBmb3JtYXRzIGFyZSBhYnNlbnQgZnJvbSB0aGUgY29uZmlnLgorICAgICAqIEZJWE1FOiBBUE0gc2hvdWxkIGtub3cgdGhlIHZlcnNpb24gb2YgdGhlIEhBTCBhbmQgZG9uJ3QgYWRkIHRoZSBmb3JtYXRzIGZvciBWNS4wLgorICAgICAqIEZvciBub3csIHRoZSB3b3JrYXJvdW5kIHRvIHJlbW92ZSBBQzMgYW5kIElFQzYxOTM3IHN1cHBvcnQgb24gSERNSSBpcyB0byBkZWNsYXJlCisgICAgICogc29tZXRoaW5nIGxpa2UgJ2VuY29kZWRGb3JtYXRzPSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCInIG9uIHRoZSBIRE1JIGRldmljZVBvcnQuCisgICAgICovCisgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JICYmIG1FbmNvZGVkRm9ybWF0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbUVuY29kZWRGb3JtYXRzLmFkZChBVURJT19GT1JNQVRfQUMzKTsKKyAgICAgICAgbUVuY29kZWRGb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOworICAgIH0KIH0KIAogYXVkaW9fcG9ydF9oYW5kbGVfdCBEZXZpY2VEZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CkBAIC00NywxNSArNjUsNTcgQEAKICAgICBtSWQgPSBnZXROZXh0VW5pcXVlSWQoKTsKIH0KIAordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpkZXRhY2goKSB7CisgICAgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBBdWRpb1BvcnQ6OmRldGFjaCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBjaGVja0VxdWFsKGNvbnN0IFQmIGYxLCBjb25zdCBUJiBmMikKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBzMShmMS5iZWdpbigpLCBmMS5lbmQoKSk7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gczIoZjIuYmVnaW4oKSwgZjIuZW5kKCkpOworICAgIHJldHVybiBzMSA9PSBzMjsKK30KKwogYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjplcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdAogewogICAgIC8vIERldmljZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleToKICAgICAvLyAtIGFyZSBvZiB0aGUgc2FtZSB0eXBlIChhIGRldmljZSB0eXBlIGNhbm5vdCBiZSBBVURJT19ERVZJQ0VfTk9ORSkKICAgICAvLyAtIGhhdmUgdGhlIHNhbWUgYWRkcmVzcworICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBlbmNvZGluZ0Zvcm1hdHMgKGlmIGRldmljZSBzdXBwb3J0cyBlbmNvZGluZykKICAgICBpZiAob3RoZXIgPT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiAobURldmljZVR5cGUgPT0gb3RoZXItPm1EZXZpY2VUeXBlKSAmJiAobUFkZHJlc3MgPT0gb3RoZXItPm1BZGRyZXNzKTsKKworICAgIHJldHVybiAobURldmljZVR5cGUgPT0gb3RoZXItPm1EZXZpY2VUeXBlKSAmJiAobUFkZHJlc3MgPT0gb3RoZXItPm1BZGRyZXNzKSAmJgorICAgICAgICAgICBjaGVja0VxdWFsKG1FbmNvZGVkRm9ybWF0cywgb3RoZXItPm1FbmNvZGVkRm9ybWF0cyk7Cit9CisKK2Jvb2wgRGV2aWNlRGVzY3JpcHRvcjo6aGFzQ3VycmVudEVuY29kZWRGb3JtYXQoKSBjb25zdAoreworICAgIGlmICghZGV2aWNlX2hhc19lbmNvZGluZ19jYXBhYmlsaXR5KHR5cGUoKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChtRW5jb2RlZEZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiAobUN1cnJlbnRFbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKK30KKworYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjpzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgaWYgKG1FbmNvZGVkRm9ybWF0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZGb3JtYXQgOiBtRW5jb2RlZEZvcm1hdHMpIHsKKyAgICAgICAgaWYgKGRldkZvcm1hdCA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpCkBAIC03MCw3ICsxMzAsNyBAQAogc3NpemVfdCBEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbS0+ZXF1YWxzKGl0ZW1BdChpKSkpIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+ZXF1YWxzKGl0ZW0pKSB7IC8vIGl0ZW0gbWF5IGJlIG51bGwgc3A8PiwgaS5lLiBBVURJT19ERVZJQ0VfTk9ORQogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjEsNzAgKzE4MSw4NCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3QKK3ZvaWQgRGV2aWNlVmVjdG9yOjpyZW1vdmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtb2R1bGVIYW5kbGUpIHsKLSAgICAgICAgICAgIGRldmljZXMgfD0gaXRlbUF0KGkpLT50eXBlKCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIHJlbW92ZShkZXZpY2UpOworICAgIH0KK30KKworRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBkZXZpY2VzOwogfQogCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3QKK2F1ZGlvX2RldmljZXNfdCBEZXZpY2VWZWN0b3I6OmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0Cit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGVzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoZGV2aWNlLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtb2R1bGVIYW5kbGUpIHsKKyAgICAgICAgICAgIGRldmljZVR5cGVzIHw9IGRldmljZS0+dHlwZSgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VUeXBlczsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0CiB7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKGl0ZW1BdChpKS0+dHlwZSgpID09IHR5cGUpIHsKLSAgICAgICAgICAgIGlmIChhZGRyZXNzID09ICIiIHx8IGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgLy8gSWYgZm9ybWF0IGlzIHNwZWNpZmllZCwgbWF0Y2ggaXQgYW5kIGlnbm9yZSBhZGRyZXNzCisgICAgICAgICAgICAvLyBPdGhlcndpc2UgaWYgYWRkcmVzcyBpcyBzcGVjaWZpZWQgbWF0Y2ggaXQKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBhbHdheXMgbWF0Y2gKKyAgICAgICAgICAgIGlmICgoKGFkZHJlc3MgPT0gIiIgfHwgaXRlbUF0KGkpLT5hZGRyZXNzKCkgPT0gYWRkcmVzcykgJiYKKyAgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB8fAorICAgICAgICAgICAgICAgIChpdGVtQXQoaSktPnN1cHBvcnRzRm9ybWF0KGZvcm1hdCkgJiYgZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSkgewogICAgICAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+YWRkcmVzcygpID09IGFkZHJlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZSgpIGZvciB0eXBlICUwOHggYWRkcmVzcyAlcyBmb3VuZCAlcCIsCi0gICAgICAgICAgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgZGV2aWNlLmdldCgpKTsKKyAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjolcygpIGZvciB0eXBlICUwOHggYWRkcmVzcyBcIiVzXCIgZm91bmQgJXAgZm9ybWF0ICUwOHgiLAorICAgICAgICAgICAgX19mdW5jX18sIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSwgZm9ybWF0KTsKICAgICByZXR1cm4gZGV2aWNlOwogfQogCiBzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAogewotICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKLSAgICAgICAgaWYgKGRldmljZS0+Z2V0SWQoKSA9PSBpZCkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICBpZiAoaWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlLT5nZXRJZCgpID09IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdAorRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlTWFzayhhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3QKIHsKICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKICAgICBib29sIGlzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXModHlwZSk7CiAgICAgdHlwZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgKGkgPCBzaXplKCkpICYmICh0eXBlICE9IEFVRElPX0RFVklDRV9OT05FKTsgaSsrKSB7Ci0gICAgICAgIGJvb2wgY3VySXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhpdGVtQXQoaSktPm1EZXZpY2VUeXBlKTsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1clR5cGUgPSBpdGVtQXQoaSktPm1EZXZpY2VUeXBlICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIGJvb2wgY3VySXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhpdGVtQXQoaSktPnR5cGUoKSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJUeXBlID0gaXRlbUF0KGkpLT50eXBlKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKICAgICAgICAgaWYgKChpc091dHB1dCA9PSBjdXJJc091dHB1dCkgJiYgKCh0eXBlICYgY3VyVHlwZSkgIT0gMCkpIHsKICAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7CiAgICAgICAgICAgICB0eXBlICY9IH5jdXJUeXBlOwotICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKCkgZm9yIHR5cGUgJXggZm91bmQgJXAiLAotICAgICAgICAgICAgICAgICAgaXRlbUF0KGkpLT50eXBlKCksIGl0ZW1BdChpKS5nZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZXM7Ci19Ci0KLURldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZUFkZHIoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdAotewotICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKLSAgICAgICAgaWYgKGRldmljZS0+dHlwZSgpID09IHR5cGUgJiYgZGV2aWNlLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6JXMoKSBmb3IgdHlwZSAlMDh4IGZvdW5kICVwIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGl0ZW1BdChpKS0+dHlwZSgpLCBpdGVtQXQoaSkuZ2V0KCkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBkZXZpY2VzOwpAQCAtMjAwLDIwICsyNzQsMTUgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3RhdHVzX3QgRGV2aWNlVmVjdG9yOjpkdW1wKGludCBmZCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0Cit2b2lkIERldmljZVZlY3Rvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAogewogICAgIGlmIChpc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlcyBkZXZpY2VzOlxuIiwgc3BhY2VzLCAiIiwgdGFnLnN0cmluZygpKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gJXMgZGV2aWNlczpcbiIsIHNwYWNlcywgIiIsIHRhZy5zdHJpbmcoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDIsIGksIHZlcmJvc2UpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBpLCB2ZXJib3NlKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB2b2lkIERldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLApAQCAtMjQ2LDE5ICszMTUsMTggQEAKICAgICAvLyB3aXRob3V0IHRoZSB0ZXN0PwogICAgIC8vIFRoaXMgaGFzIGJlZW4gZGVtb25zdHJhdGVkIHRvIE5PVCBiZSB0cnVlIChhdCBzdGFydCB1cCkKICAgICAvLyBBTE9HX0FTU0VSVChtTW9kdWxlICE9IE5VTEwpOwotICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPQotICAgICAgICAgICAgbU1vZHVsZSAhPSAwID8gbU1vZHVsZS0+Z2V0SGFuZGxlKCkgOiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CisgICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOwogICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHlfemVyb2ZpbGwoZHN0Q29uZmlnLT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpKTsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKIHsKLSAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSBoYW5kbGUgJWQgdHlwZSAleCIsIG1JZCwgbURldmljZVR5cGUpOworICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICUwOHgiLCBtSWQsIG1EZXZpY2VUeXBlKTsKICAgICBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHBvcnQpOwogICAgIHBvcnQtPmlkID0gbUlkOwogICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKICAgICBwb3J0LT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZTsKLSAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IG1Nb2R1bGUtPmdldEhhbmRsZSgpOworICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweV96ZXJvZmlsbChwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpKTsKIH0KIApAQCAtMjcwLDQyICszMzgsNzEgQEAKICAgICBwb3J0LT5waWNrQXVkaW9Qcm9maWxlKG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzaywgbUZvcm1hdCk7CiB9CiAKLXN0YXR1c190IERldmljZURlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzRGV2aWNlICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNEZXZpY2UgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCArIDEpOwogICAgIGlmIChtSWQgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gaWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUlkKTsKICAgICB9CiAgICAgaWYgKCFtVGFnTmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSB0YWcgbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UYWdOYW1lLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSB0YWcgbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UYWdOYW1lLnN0cmluZygpKTsKICAgICB9Ci0gICAgc3RkOjpzdHJpbmcgZGV2aWNlTGl0ZXJhbDsKLSAgICBpZiAoZGV2aWNlVG9TdHJpbmcobURldmljZVR5cGUsIGRldmljZUxpdGVyYWwpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdHlwZTogJS00OHNcbiIsIHNwYWNlcywgIiIsIGRldmljZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgaWYgKG1BZGRyZXNzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWRkcmVzczogJS0zMnNcbiIsIHNwYWNlcywgIiIsIG1BZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIHNwYWNlcywgdmVyYm9zZSk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gdHlwZTogJS00OHNcbiIsIHNwYWNlcywgIiIsIDo6YW5kcm9pZDo6dG9TdHJpbmcobURldmljZVR5cGUpLmNfc3RyKCkpOworCisgICAgaWYgKG1BZGRyZXNzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgfQorICAgIEF1ZGlvUG9ydDo6ZHVtcChkc3QsIHNwYWNlcywgdmVyYm9zZSk7Cit9CisKK3N0ZDo6c3RyaW5nIERldmljZURlc2NyaXB0b3I6OnRvU3RyaW5nKCkgY29uc3QKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOworICAgIHNzdHJlYW0gPDwgInR5cGU6MHgiIDw8IHN0ZDo6aGV4IDw8IHR5cGUoKSA8PCAiLEA6IiA8PCBtQWRkcmVzczsKKyAgICByZXR1cm4gc3N0cmVhbS5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgRGV2aWNlVmVjdG9yOjp0b1N0cmluZygpIGNvbnN0Cit7CisgICAgaWYgKGlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4geyJBVURJT19ERVZJQ0VfTk9ORSJ9OworICAgIH0KKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSB7InsifTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UgIT0gKmJlZ2luKCkpIHsKKyAgICAgICAgICAgcmVzdWx0ICs9ICI7IjsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gZGV2aWNlLT50b1N0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0ICsgIn0iOworfQorCitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpmaWx0ZXIoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBmaWx0ZXJlZERldmljZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoZGV2aWNlcy5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBmaWx0ZXJlZERldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZpbHRlcmVkRGV2aWNlczsKK30KKworYm9vbCBEZXZpY2VWZWN0b3I6OmNvbnRhaW5zQXRMZWFzdE9uZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuICFmaWx0ZXIoZGV2aWNlcykuaXNFbXB0eSgpOworfQorCitib29sIERldmljZVZlY3Rvcjo6Y29udGFpbnNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICByZXR1cm4gZmlsdGVyKGRldmljZXMpLnNpemUoKSA9PSBkZXZpY2VzLnNpemUoKTsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpsb2coKSBjb25zdAogewotICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICBkZXZpY2VUb1N0cmluZyhtRGV2aWNlVHlwZSwgZGV2aWNlKTsKLSAgICBBTE9HSSgiRGV2aWNlIGlkOiVkIHR5cGU6MHglWDolcywgYWRkcjolcyIsIG1JZCwgIG1EZXZpY2VUeXBlLCBkZXZpY2UuY19zdHIoKSwKKyAgICBBTE9HSSgiRGV2aWNlIGlkOiVkIHR5cGU6MHglMDhYOiVzLCBhZGRyOiVzIiwgbUlkLCAgbURldmljZVR5cGUsCisgICAgICAgICAgOjphbmRyb2lkOjp0b1N0cmluZyhtRGV2aWNlVHlwZSkuY19zdHIoKSwKICAgICAgICAgICBtQWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBBdWRpb1BvcnQ6OmxvZygiICAiKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKaW5kZXggN2IyMzQxZS4uODlmOTg5OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAKQEAgLTIyLDI1ICsyMiwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXR1c190IEVmZmVjdERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBFZmZlY3REZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJL086ICVkXG4iLCBtSW8pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyYXRlZ3k6ICVkXG4iLCBtU3RyYXRlZ3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2Vzc2lvbjogJWRcbiIsIG1TZXNzaW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE5hbWU6ICVzXG4iLCAgbURlc2MubmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlc1xuIiwgIG1FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNJRDogJWRcbiIsIHNwYWNlcywgIiIsIG1JZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0kvTzogJWRcbiIsIHNwYWNlcywgIiIsIG1Jbyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc011c2ljIEVmZmVjdDogJXNcbiIsIHNwYWNlcywgIiIsIGlzTXVzaWNFZmZlY3QoKT8gInllcyIgOiAibm8iKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU2Vzc2lvbjogJWRcbiIsIHNwYWNlcywgIiIsIG1TZXNzaW9uKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzTmFtZTogJXNcbiIsIHNwYWNlcywgIiIsICBtRGVzYy5uYW1lKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXNcbiIsIHNwYWNlcywgIiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwogfQogCiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6RWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKSA6CkBAIC01MywxMCArNDIsMTQgQEAKIAogc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwgYm9vbCBpc011c2ljRWZmZWN0KQogeworICAgIGlmIChnZXRFZmZlY3QoaWQpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzIGVmZmVjdCAlcyBhbHJlYWR5IHJlZ2lzdGVyZWQiLCBfX0ZVTkNUSU9OX18sIGRlc2MtPm5hbWUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgKyBkZXNjLT5tZW1vcnlVc2FnZSA+IGdldE1heEVmZmVjdHNNZW1vcnkoKSkgewogICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBNZW1vcnkgJWQgS0IiLAogICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIGRlc2MtPm1lbW9yeVVzYWdlKTsKQEAgLTY2LDM0ICs1OSwzMyBAQAogICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ID4gbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQpIHsKICAgICAgICAgbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQgPSBtVG90YWxFZmZlY3RzTWVtb3J5OwogICAgIH0KLSAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIGlvICVkLCBzdHJhdGVneSAlZCBzZXNzaW9uICVkIGlkICVkIiwKLSAgICAgICAgICAgIGRlc2MtPm5hbWUsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgaW8gJWQsIHNlc3Npb24gJWQgaWQgJWQiLAorICAgICAgICAgICAgZGVzYy0+bmFtZSwgaW8sIHNlc3Npb24sIGlkKTsKICAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgJWQsIHRvdGFsIG1lbW9yeSAlZCIsIGRlc2MtPm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKIAotICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBuZXcgRWZmZWN0RGVzY3JpcHRvcigpOwotICAgIG1lbWNweSAoJmVmZmVjdERlc2MtPm1EZXNjLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgIGVmZmVjdERlc2MtPm1JbyA9IGlvOwotICAgIGVmZmVjdERlc2MtPm1TdHJhdGVneSA9IHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KHN0cmF0ZWd5KTsKLSAgICBlZmZlY3REZXNjLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBmYWxzZTsKLQorICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBuZXcgRWZmZWN0RGVzY3JpcHRvcihkZXNjLCBpc011c2ljRWZmZWN0LCBpZCwgaW8sIHNlc3Npb24pOwogICAgIGFkZChpZCwgZWZmZWN0RGVzYyk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3NwPEVmZmVjdERlc2NyaXB0b3I+IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpnZXRFZmZlY3QoaW50IGlkKSBjb25zdAogewogICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGlkKTsKICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBpZCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gdmFsdWVBdChpbmRleCk7Cit9CisKK3N0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gZ2V0RWZmZWN0KGlkKTsKKyAgICBpZiAoZWZmZWN0RGVzYyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyB1bmtub3duIGVmZmVjdCBJRCAlZCIsIF9fRlVOQ1RJT05fXywgaWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IHZhbHVlQXQoaW5kZXgpOwotCi0gICAgc2V0RWZmZWN0RW5hYmxlZChlZmZlY3REZXNjLCBmYWxzZSk7Ci0KICAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSA8IGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlKSB7CiAgICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkIHRvbyBiaWcgZm9yIHRvdGFsICVkIiwKICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CkBAIC0xMTksNiArMTExLDE0IEBACiAgICAgcmV0dXJuIHNldEVmZmVjdEVuYWJsZWQodmFsdWVBdChpbmRleCksIGVuYWJsZWQpOwogfQogCitib29sIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjppc0VmZmVjdEVuYWJsZWQoaW50IGlkKSBjb25zdAoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlQXQoaW5kZXgpLT5tRW5hYmxlZDsKK30KIAogc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OnNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpCkBAIC0xNTAsMTEgKzE1MCwxMSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKQorYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChlZmZlY3REZXNjLT5tRW5hYmxlZCAmJiAoZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgorICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bUVuYWJsZWQgJiYgKGVmZmVjdERlc2MtPmlzTXVzaWNFZmZlY3QoKSkgJiYKICAgICAgICAgICAgICAgICAoKGVmZmVjdERlc2MtPm1EZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQpID09IDApKSB7CiAgICAgICAgICAgICBBTE9HVigiaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSBub24gb2ZmbG9hZGFibGUgZWZmZWN0ICVzIGVuYWJsZWQgb24gc2Vzc2lvbiAlZCIsCiAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCBlZmZlY3REZXNjLT5tU2Vzc2lvbik7CkBAIC0xNzQsMjQgKzE3NCwyMiBAQAogICAgIHJldHVybiBNQVhfRUZGRUNUU19NRU1PUlk7CiB9CiAKLXN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkKK3ZvaWQgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAiXG5Ub3RhbCBFZmZlY3RzIENQVTogJWYgTUlQUywgVG90YWwgRWZmZWN0cyBtZW1vcnk6ICVkIEtCLCBNYXggbWVtb3J5IHVzZWQ6ICVkIEtCXG4iLAotICAgICAgICAgICAgIChmbG9hdCltVG90YWxFZmZlY3RzQ3B1TG9hZC8xMCwgbVRvdGFsRWZmZWN0c01lbW9yeSwgbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlZ2lzdGVyZWQgZWZmZWN0czpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gRWZmZWN0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAiXG4lKnNUb3RhbCBFZmZlY3RzIENQVTogJWYgTUlQUywgIgorICAgICAgICAgICAgIlRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQiwgTWF4IG1lbW9yeSB1c2VkOiAlZCBLQlxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsCisgICAgICAgICAgICAoZmxvYXQpIG1Ub3RhbEVmZmVjdHNDcHVMb2FkIC8gMTAsCisgICAgICAgICAgICBtVG90YWxFZmZlY3RzTWVtb3J5LAorICAgICAgICAgICAgbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0VmZmVjdHM6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEVmZmVjdCAlZDpcbiIsIHNwYWNlcywgIiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIHNwYWNlcyArIDIpOworICAgIH0KIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDA3YTE3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0dhaW5zLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkdhaW5zIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0vLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2RlZmluZSBBTE9HVlYgQUxPR1YKLSNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaW5jbHVkZSAiR2FpbnMuaCIKLSNpbmNsdWRlIDxWb2x1bWUuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEVuZ2luZWRlZmF1bHQKLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTQ5LjVmfSwgezMzLCAtMzMuNWZ9LCB7NjYsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTE3LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMjEuMGZ9LCB7MTAwLCAtMTAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU2LjBmfSwgezIwLCAtMzQuMGZ9LCB7NjAsIC0xMS4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU1LjBmfSwgezIwLCAtNDMuMGZ9LCB7ODYsIC0xMi4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0yOS43Zn0sIHszMywgLTIwLjFmfSwgezY2LCAtMTAuMmZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMzUuN2Z9LCB7MzMsIC0yNi4xZn0sIHs2NiwgLTEzLjJmfSwgezEwMCwgMC4wZn0KLX07Ci0KLS8vIEFVRElPX1NUUkVBTV9TWVNURU0sIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIGFuZCBBVURJT19TVFJFQU1fRFRNRiB2b2x1bWUgdHJhY2tzCi0vLyBBVURJT19TVFJFQU1fUklORyBvbiBwaG9uZXMgYW5kIEFVRElPX1NUUkVBTV9NVVNJQyBvbiB0YWJsZXRzLgotLy8gQVVESU9fU1RSRUFNX0RUTUYgdHJhY2tzIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHdoaWxlIGluIGNhbGwgKFNlZSBBdWRpb1NlcnZpY2UuamF2YSkuCi0vLyBUaGUgcmFuZ2UgaXMgY29uc3RyYWluZWQgYmV0d2VlbiAtMjRkQiBhbmQgLTZkQiBvdmVyIHNwZWFrZXIgYW5kIC0zMGRCIGFuZCAtMThkQiBvdmVyIGhlYWRzZXQuCi0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTI0LjBmfSwgezMzLCAtMTguMGZ9LCB7NjYsIC0xMi4wZn0sIHsxMDAsIC02LjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMzQuMGZ9LCB7MzMsIC0yNC4wZn0sIHs2NiwgLTE1LjBmfSwgezEwMCwgLTYuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zMC4wZn0sIHszMywgLTI2LjBmfSwgezY2LCAtMjIuMGZ9LCB7MTAwLCAtMTguMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTQyLjBmfSwgezMzLCAtMjguMGZ9LCB7NjYsIC0xNC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTI0LjBmfSwgezMzLCAtMTYuMGZ9LCB7NjYsIC04LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzTGluZWFyVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtOTYuMGZ9LCB7MzMsIC02OC4wZn0sIHs2NiwgLTM0LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtOTYuMGZ9LCB7MSwgLTk2LjBmfSwgezIsIC05Ni4wZn0sIHsxMDAsIC05Ni4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAwLjBmfSwgezEsIDAuMGZ9LCB7MiwgMC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0xMjguMGZ9LCB7MjAsIC04MC4wZn0sIHs2MCwgLTQwLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKkdhaW5zOjpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RFVklDRV9DQVRFR09SWV9DTlRdID0gewotICAgIHsgLy8gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fU1lTVEVNCi0gICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fUklORwotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX01VU0lDCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX0FMQVJNCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTwotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRQotICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAgLy8gQVVESU9fU1RSRUFNX0RUTUYKLSAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1RUUwotICAgICAgLy8gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciI6IGFsd2F5cyBzaWxlbnQgZXhjZXB0IG9uIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsICAgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlLCAgICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fUkVST1VUSU5HCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fUEFUQ0gKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLX07Ci0KLS8vc3RhdGljCi1mbG9hdCBHYWluczo6dm9sSW5kZXhUb0RiKGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmN1cnZlLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCwgaW50IGluZGV4SW5VaSkKLXsKLSAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtIHR5cGUKLSAgICBpbnQgbmJTdGVwcyA9IDEgKyBjdXJ2ZVtWb2x1bWU6OlZPTE1BWF0ubUluZGV4IC0gY3VydmVbVm9sdW1lOjpWT0xNSU5dLm1JbmRleDsKLSAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gaW5kZXhNaW4pKSAvIChpbmRleE1heCAtIGluZGV4TWluKTsKLQotICAgIC8vIGZpbmQgd2hhdCBwYXJ0IG9mIHRoZSBjdXJ2ZSB0aGlzIGluZGV4IHZvbHVtZSBiZWxvbmdzIHRvLCBvciBpZiBpdCdzIG91dCBvZiBib3VuZHMKLSAgICBpbnQgc2VnbWVudCA9IDA7Ci0gICAgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MTUlOXS5tSW5kZXgpIHsgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIHJldHVybiBWT0xVTUVfTUlOX0RCOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xLTkVFMV0ubUluZGV4KSB7Ci0gICAgICAgIHNlZ21lbnQgPSAwOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xLTkVFMl0ubUluZGV4KSB7Ci0gICAgICAgIHNlZ21lbnQgPSAxOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDw9IGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDI7Ci0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIHJldHVybiAwLjBmOwotICAgIH0KLQotICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgotICAgIGZsb2F0IGRlY2liZWxzID0gY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24gKwotICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKgotICAgICAgICAgICAgICAgICggKGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24gLQotICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24pIC8KLSAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkoY3VydmVbc2VnbWVudCsxXS5tSW5kZXggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICk7Ci0KLSAgICBBTE9HVlYoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSIsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgsIHZvbElkeCwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4LAotICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24sCi0gICAgICAgICAgICBkZWNpYmVscywKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24pOwotCi0gICAgcmV0dXJuIGRlY2liZWxzOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKaW5kZXggYWVmN2RiZS4uZWM3ZmY1NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcApAQCAtNTEsNyArNTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlKSk7CiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgZGV2RGVzYy0+c2V0QWRkcmVzcyhhZGRyZXNzKTsKKyAgICBhZGREeW5hbWljRGV2aWNlKGRldkRlc2MpOworICAgIC8vIFJlY2lwcm9jYWxseSBhdHRhY2ggdGhlIGRldmljZSB0byB0aGUgbW9kdWxlCisgICAgZGV2RGVzYy0+YXR0YWNoKHRoaXMpOwogICAgIHByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZXZEZXNjKTsKIAogICAgIHJldHVybiBhZGRPdXRwdXRQcm9maWxlKHByb2ZpbGUpOwpAQCAtOTcsNiArMTAwLDkgQEAKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobU91dHB1dFByb2ZpbGVzW2ldLT5nZXROYW1lKCkgPT0gbmFtZSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiBtT3V0cHV0UHJvZmlsZXNbaV0tPmdldFN1cHBvcnRlZERldmljZXMoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZUR5bmFtaWNEZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlcy5yZW1vdmVBdChpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMTMsNyArMTE5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSkpOwogCiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgIGRldkRlc2MtPnNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgYWRkRHluYW1pY0RldmljZShkZXZEZXNjKTsKKyAgICAvLyBSZWNpcHJvY2FsbHkgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIG1vZHVsZQorICAgIGRldkRlc2MtPmF0dGFjaCh0aGlzKTsKICAgICBwcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGV2RGVzYyk7CiAKICAgICBBTE9HVigiYWRkSW5wdXRQcm9maWxlKCkgbmFtZSAlcyByYXRlICVkIG1hc2sgMHglMDh4IiwKQEAgLTEyNiw2ICsxMzUsOSBAQAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1JbnB1dFByb2ZpbGVzW2ldLT5nZXROYW1lKCkgPT0gbmFtZSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiBtSW5wdXRQcm9maWxlc1tpXS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRHluYW1pY0RldmljZShkZXZpY2UpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbUlucHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjE4LDM3ICsyMzAsMzcgQEAKICAgICBtSGFuZGxlID0gaGFuZGxlOwogfQogCi12b2lkIEh3TW9kdWxlOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKK2Jvb2wgSHdNb2R1bGU6OnN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8QXVkaW9Qb3J0PiAmc3JjUG9ydCwgY29uc3Qgc3A8QXVkaW9Qb3J0PiAmZHN0UG9ydCkgY29uc3QgeworICAgIGZvciAoY29uc3QgYXV0byAmcm91dGUgOiBtUm91dGVzKSB7CisgICAgICAgIGlmIChyb3V0ZS0+c3VwcG9ydHNQYXRjaChzcmNQb3J0LCBkc3RQb3J0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIG5hbWU6ICVzXG4iLCBnZXROYW1lKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gaGFuZGxlOiAlZFxuIiwgbUhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSB2ZXJzaW9uOiAldS4ldVxuIiwgZ2V0SGFsVmVyc2lvbk1ham9yKCksIGdldEhhbFZlcnNpb25NaW5vcigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit2b2lkIEh3TW9kdWxlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIG5hbWU6ICVzXG4iLCBnZXROYW1lKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gaGFuZGxlOiAlZFxuIiwgbUhhbmRsZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSB2ZXJzaW9uOiAldS4ldVxuIiwgZ2V0SGFsVmVyc2lvbk1ham9yKCksIGdldEhhbFZlcnNpb25NaW5vcigpKTsKICAgICBpZiAobU91dHB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICB3cml0ZShmZCwgIiAgLSBvdXRwdXRzOlxuIiwgc3RybGVuKCIgIC0gb3V0cHV0czpcbiIpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIiAgLSBvdXRwdXRzOlxuIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOwotICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGRzdCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1JbnB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICB3cml0ZShmZCwgIiAgLSBpbnB1dHM6XG4iLCBzdHJsZW4oIiAgLSBpbnB1dHM6XG4iKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKCIgIC0gaW5wdXRzOlxuIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBpbnB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgaW5wdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QpOwogICAgICAgICB9CiAgICAgfQotICAgIG1EZWNsYXJlZERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiRGVjbGFyZWQiKSwgIDIsIHRydWUpOwotICAgIG1Sb3V0ZXMuZHVtcChmZCwgMik7CisgICAgbURlY2xhcmVkRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiRGVjbGFyZWQiKSwgMiwgdHJ1ZSk7CisgICAgbUR5bmFtaWNEZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJEeW5hbWljIiksICAyLCB0cnVlKTsKKyAgICBtUm91dGVzLmR1bXAoZHN0LCAyKTsKIH0KIAogc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0CkBAIC0yNjEsNjQgKzI3MywxNjAgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZvckRldmljZVR5cGVzKGF1ZGlvX2RldmljZXNfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0CiB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiAqdGhpcykgewotICAgICAgICBjb25zdCBhdXRvJiBwcm9maWxlcyA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSA/CisgICAgICAgIGNvbnN0IGF1dG8mIHByb2ZpbGVzID0gYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/CiAgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpIDogbW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IHByb2ZpbGVzKSB7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZVR5cGVzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlcyA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7CisgICAgICAgICAgICAgICAgICAgIHNwIDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlKHR5cGUsIFN0cmluZzgoKSwgZW5jb2RlZEZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEZXNjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXNwPERldmljZURlc2NyaXB0b3I+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZHJlc3MpIGNvbnN0CitzcDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3QKIHsKLSAgICBTdHJpbmc4IGFkZHJlc3MgPSAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0cikgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOworICAgIHJldHVybiBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhkZXZpY2UtPnR5cGUoKSwgZW5jb2RlZEZvcm1hdCk7Cit9CisKK0RldmljZVZlY3RvciBId01vZHVsZUNvbGxlY3Rpb246OmdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZSgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VzKSBjb25zdAoreworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBnZXRNb2R1bGVGcm9tTmFtZShuYW1lKTsKKyAgICBpZiAobW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcigpOworICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1vZHVsZS0+Z2V0SGFuZGxlKCkpOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBId01vZHVsZUNvbGxlY3Rpb246OmdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd1RvQ3JlYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZGRyZXNzKSBjb25zdAoreworICAgIFN0cmluZzggZGV2QWRkcmVzcyA9IChhZGRyZXNzID09IG51bGxwdHIgfHwgIW1hdGNoQWRkcmVzcykgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoYWRkcmVzcyk7CiAgICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCi0gICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJiAoYWRkcmVzcy5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpICYmIChkZXZBZGRyZXNzLmxlbmd0aCgpID09IDApKSB7CisgICAgICAgIGRldkFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CiAgICAgfQogCiAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6ICp0aGlzKSB7Ci0gICAgICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBod01vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOworICAgICAgICBEZXZpY2VWZWN0b3IgbW9kdWxlRGV2aWNlcyA9IGh3TW9kdWxlLT5nZXRBbGxEZXZpY2VzKCk7CisgICAgICAgIGF1dG8gbW9kdWxlRGV2aWNlID0gbW9kdWxlRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwgZGV2QWRkcmVzcywgZW5jb2RlZEZvcm1hdCk7CisgICAgICAgIGlmIChtb2R1bGVEZXZpY2UpIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5zZXRFbmNvZGVkRm9ybWF0KGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5zZXRBZGRyZXNzKGRldkFkZHJlc3MpOworICAgICAgICAgICAgaWYgKGFsbG93VG9DcmVhdGUpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVEZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbW9kdWxlRGV2aWNlOwogICAgICAgICB9Ci0gICAgICAgIGlmICghbWF0Y2hBZHJlc3MpIHsKLSAgICAgICAgICAgIGRldmljZUxpc3QgPSBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOworICAgIH0KKyAgICBpZiAoIWFsbG93VG9DcmVhdGUpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlcyAlMDR4IGFkZHJlc3MgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIG5hbWUsIGRldmljZVR5cGUsIGFkZHJlc3MpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNyZWF0ZURldmljZShkZXZpY2VUeXBlLCBhZGRyZXNzLCBuYW1lLCBlbmNvZGVkRm9ybWF0KTsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gSHdNb2R1bGVDb2xsZWN0aW9uOjpjcmVhdGVEZXZpY2UoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0Cit7CisgICAgc3A8SHdNb2R1bGU+IGh3TW9kdWxlID0gZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZXModHlwZSwgZW5jb2RlZEZvcm1hdCk7CisgICAgaWYgKGh3TW9kdWxlID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDR4IGFkZHJlc3MgJXMiLCBfX0ZVTkNUSU9OX18sIHR5cGUsCisgICAgICAgICAgICAgIGFkZHJlc3MpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgU3RyaW5nOChuYW1lKSk7CisgICAgZGV2aWNlLT5zZXROYW1lKFN0cmluZzgobmFtZSkpOworICAgIGRldmljZS0+c2V0QWRkcmVzcyhTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICBkZXZpY2UtPnNldEVuY29kZWRGb3JtYXQoZW5jb2RlZEZvcm1hdCk7CisKKyAgLy8gQWRkIHRoZSBkZXZpY2UgdG8gdGhlIGxpc3Qgb2YgZHluYW1pYyBkZXZpY2VzCisgICAgaHdNb2R1bGUtPmFkZER5bmFtaWNEZXZpY2UoZGV2aWNlKTsKKyAgICAvLyBSZWNpcHJvY2FsbHkgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIG1vZHVsZQorICAgIGRldmljZS0+YXR0YWNoKGh3TW9kdWxlKTsKKyAgICBBTE9HRCgiJXM6IGFkZGluZyBkeW5hbWljIGRldmljZSAlcyB0byBtb2R1bGUgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGh3TW9kdWxlLT5nZXROYW1lKCkpOworCisgICAgY29uc3QgYXV0byAmcHJvZmlsZXMgPSAoYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2ZpbGUgOiBwcm9maWxlcykgeworICAgICAgICAvLyBBZGQgdGhlIGRldmljZSBhcyBzdXBwb3J0ZWQgdG8gYWxsIHByb2ZpbGUgc3VwcG9ydGluZyAid2Vha2x5IiBvciBub3QgdGhlIGRldmljZQorICAgICAgICAvLyBhY2NvcmRpbmcgdG8gaXRzIHR5cGUKKyAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSwgZmFsc2UgLyptYXRjaEFkcmVzcyovKSkgeworCisgICAgICAgICAgICAvLyBAdG9kbyBxdWlkIG9mIGF1ZGlvIHByb2ZpbGU/IGltcG9ydCB0aGUgcHJvZmlsZSBmcm9tIGRldmljZSBvZiB0aGUgc2FtZSB0eXBlPworICAgICAgICAgICAgY29uc3QgYXV0byAmaXNvVHlwZURldmljZUZvclByb2ZpbGUgPQorICAgICAgICAgICAgICAgIHByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKS5nZXREZXZpY2UodHlwZSwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChpc29UeXBlRGV2aWNlRm9yUHJvZmlsZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7CisKKyAgICAgICAgICAgIEFMT0dWKCIlczogYWRkaW5nIGRldmljZSAlcyB0byBwcm9maWxlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgSHdNb2R1bGVDb2xsZWN0aW9uOjpjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCit7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6ICp0aGlzKSB7CisgICAgICAgIERldmljZVZlY3RvciBtb2R1bGVEZXZpY2VzID0gaHdNb2R1bGUtPmdldEFsbERldmljZXMoKTsKKyAgICAgICAgaWYgKCFtb2R1bGVEZXZpY2VzLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGRldmljZS0+ZGV0YWNoKCk7CisgICAgICAgIC8vIE9ubHkgcmVtb3ZlIGZyb20gZHluYW1pYyBsaXN0LCBub3QgZnJvbSBkZWNsYXJlZCBsaXN0ISEhCisgICAgICAgIGlmICghaHdNb2R1bGUtPmdldER5bmFtaWNEZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGh3TW9kdWxlLT5yZW1vdmVEeW5hbWljRGV2aWNlKGRldmljZSk7CisgICAgICAgIEFMT0dWKCIlczogcmVtb3ZlZCBkeW5hbWljIGRldmljZSAlcyBmcm9tIG1vZHVsZSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGh3TW9kdWxlLT5nZXROYW1lKCkpOworCisgICAgICAgIGNvbnN0IElPUHJvZmlsZUNvbGxlY3Rpb24gJnByb2ZpbGVzID0gYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UtPnR5cGUoKSkgPworICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSA6IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcHJvZmlsZSA6IHByb2ZpbGVzKSB7CisgICAgICAgICAgICAvLyBGb3IgY2xlYW51cCwgc3Ryb25nIG1hdGNoIGlzIHJlcXVpcmVkCisgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlLCB0cnVlIC8qbWF0Y2hBZHJlc3MqLykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IHJlbW92aW5nIGRldmljZSAlcyBmcm9tIHByb2ZpbGUgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlLT5yZW1vdmVTdXBwb3J0ZWREZXZpY2UoZGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOwotICAgIGRldkRlc2MtPnNldE5hbWUoU3RyaW5nOChkZXZpY2VfbmFtZSkpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKLSAgICByZXR1cm4gZGV2RGVzYzsKIH0KIAotc3RhdHVzX3QgSHdNb2R1bGVDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgSHdNb2R1bGVDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kKCJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIEhXIE1vZHVsZSAlenU6XG4iLCBpICsgMSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKaW5kZXggMzkwZWEzNi4uZmUyZWFlZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCkBAIC0yNSwxMSArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIGNoZWNrcyBpZiB0aGUgSU8gcHJvZmlsZSBpcyBjb21wYXRpYmxlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0vLyBTYW1wbGluZyByYXRlLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFzayBtdXN0IGJlIHNwZWNpZmllZCBpbiBvcmRlciB0bwotLy8gZ2V0IGEgdmFsaWQgYSBtYXRjaAotYm9vbCBJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCitib29sIElPUHJvZmlsZTo6aXNDb21wYXRpYmxlUHJvZmlsZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKQEAgLTQ2LDE0ICs0Miw4IEBACiAgICAgICAgICAgICBnZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CiAgICAgQUxPR19BU1NFUlQoaXNQbGF5YmFja1RocmVhZCAhPSBpc1JlY29yZFRocmVhZCk7CiAKLQotICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgLy8ganVzdCBjaGVjayB0eXBlcyBpZiBtdWx0aXBsZSBkZXZpY2VzIGFyZSBzZWxlY3RlZAotICAgICAgICBpZiAocG9wY291bnQoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pID4gMSkgewotICAgICAgICAgICAgaWYgKChtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSAhPSBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobVN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgYWRkcmVzcykgPT0gMCkgeworICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFtU3VwcG9ydGVkRGV2aWNlcy5jb250YWluc0FsbERldmljZXMoZGV2aWNlcykpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTExMywxNiArMTAzLDExIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgSU9Qcm9maWxlOjpkdW1wKGludCBmZCkKK3ZvaWQgSU9Qcm9maWxlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBBdWRpb1BvcnQ6OmR1bXAoZHN0LCA0KTsKIAotICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgNCk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7CiAgICAgc3RkOjpzdHJpbmcgZmxhZ3NMaXRlcmFsOwogICAgIGlmIChnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKICAgICAgICAgSW5wdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZ2V0RmxhZ3MoKSwgZmxhZ3NMaXRlcmFsKTsKQEAgLTEzMCwyMSArMTE1LDE0IEBACiAgICAgICAgIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhnZXRGbGFncygpLCBmbGFnc0xpdGVyYWwpOwogICAgIH0KICAgICBpZiAoIWZsYWdzTGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiU3VwcG9ydGVkIiksIDQsIGZhbHNlKTsKLQotICAgIHJlc3VsdC5jbGVhcigpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIlN1cHBvcnRlZCIpLCA0LCBmYWxzZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCiAgICAgICAgICAgICAgbWF4T3BlbkNvdW50LCBjdXJPcGVuQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBtYXhBY3RpdmVDb3VudDogJXUgLSBjdXJBY3RpdmVDb3VudDogJXVcbiIsCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICAtIG1heEFjdGl2ZUNvdW50OiAldSAtIGN1ckFjdGl2ZUNvdW50OiAldVxuIiwKICAgICAgICAgICAgICBtYXhBY3RpdmVDb3VudCwgY3VyQWN0aXZlQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCiB2b2lkIElPUHJvZmlsZTo6bG9nKCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKaW5kZXggYTI1MzExMy4uNWY4MjBjMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKQEAgLTE3LDI0MSArMTcsNDMyIEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6U2VyaWFsaXplciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIlNlcmlhbGl6ZXIuaCIKLSNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+Ci0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgogI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGlzdHJlYW0+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOworI2luY2x1ZGUgPG1lZGlhL2NvbnZlcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgIlNlcmlhbGl6ZXIuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK25hbWVzcGFjZSB7CisKKy8vIFRPRE8obW5hZ2Fub3YpOiBDb25zaWRlciBmaW5kaW5nIGFuIGFsdGVybmF0aXZlIGZvciB1c2luZyBISURMIGNvZGUuCit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgaGFyZHdhcmU6OlN0YXR1czsKK3VzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSBDPgorc3RydWN0IEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzIHsKKyAgICB0eXBlZGVmIHNwPEU+IEVsZW1lbnQ7CisgICAgdHlwZWRlZiBDIENvbGxlY3Rpb247CisgICAgdHlwZWRlZiB2b2lkKiBQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRFbGVtZW50VG9Db2xsZWN0aW9uKGNvbnN0IEVsZW1lbnQgJmVsZW1lbnQsIENvbGxlY3Rpb24gKmNvbGxlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24tPmFkZChlbGVtZW50KSA+PSAwID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK3N0cnVjdCBTdGRDb2xsZWN0aW9uVHJhaXRzIHsKKyAgICB0eXBlZGVmIEMgQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEM6OnZhbHVlX3R5cGUgRWxlbWVudDsKKyAgICB0eXBlZGVmIHZvaWQqIFB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIHN0YXR1c190IGFkZEVsZW1lbnRUb0NvbGxlY3Rpb24oY29uc3QgRWxlbWVudCAmZWxlbWVudCwgQ29sbGVjdGlvbiAqY29sbGVjdGlvbikgeworICAgICAgICBhdXRvIHBhaXIgPSBjb2xsZWN0aW9uLT5pbnNlcnQoZWxlbWVudCk7CisgICAgICAgIHJldHVybiBwYWlyLnNlY29uZCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworICAgIH0KK307CisKK3N0cnVjdCBBdWRpb0dhaW5UcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9HYWluLCBBdWRpb0dhaW5zPgogewotICAgIHhtbENoYXIgKnhtbFZhbHVlID0geG1sR2V0UHJvcChjdXIsIChjb25zdCB4bWxDaGFyKilhdHRyaWJ1dGUpOwotICAgIGlmICh4bWxWYWx1ZSA9PSBOVUxMKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZ2FpbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImdhaW5zIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICAvKiogZ2FpbiBtb2RlcyBzdXBwb3J0ZWQsIGUuZy4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1vZGUgPSAibW9kZSI7CisgICAgICAgIC8qKiBjb250cm9sbGVkIGNoYW5uZWxzLCBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hhbm5lbE1hc2sgPSAiY2hhbm5lbF9tYXNrIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptaW5WYWx1ZU1CID0gIm1pblZhbHVlTUIiOyAvKio8IG1pbiB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhWYWx1ZU1CID0gIm1heFZhbHVlTUIiOyAvKio8IG1heCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgLyoqIGRlZmF1bHQgdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZGVmYXVsdFZhbHVlTUIgPSAiZGVmYXVsdFZhbHVlTUIiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0ZXBWYWx1ZU1CID0gInN0ZXBWYWx1ZU1CIjsgLyoqPCBzdGVwIHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICAvKiogbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWluUmFtcE1zID0gIm1pblJhbXBNcyI7CisgICAgICAgIC8qKiBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhSYW1wTXMgPSAibWF4UmFtcE1zIjsKKyAgICAgICAgLyoqIG5lZWRlZCB0byBhbGxvdyB1c2Ugc2V0UG9ydEdhaW4gaW5zdGVhZCBvZiBzZXRTdHJlYW1Wb2x1bWUuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdXNlRm9yVm9sdW1lID0gInVzZUZvclZvbHVtZSI7CisKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gTm8gY2hpbGRyZW4KK307CisKKy8vIEEgcHJvZmlsZSBzZWN0aW9uIGNvbnRhaW5zIGEgbmFtZSwgIG9uZSBhdWRpbyBmb3JtYXQgYW5kIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcworLy8gYW5kIGNoYW5uZWwgbWFza3MgZm9yIHRoaXMgZm9ybWF0CitzdHJ1Y3QgQXVkaW9Qcm9maWxlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUHJvZmlsZSwgQXVkaW9Qcm9maWxlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInByb2ZpbGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJwcm9maWxlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzYW1wbGluZ1JhdGVzID0gInNhbXBsaW5nUmF0ZXMiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICJmb3JtYXQiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoYW5uZWxNYXNrcyA9ICJjaGFubmVsTWFza3MiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKK307CisKK3N0cnVjdCBNaXhQb3J0VHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPElPUHJvZmlsZSwgSU9Qcm9maWxlQ29sbGVjdGlvbj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJtaXhQb3J0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAibWl4UG9ydHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlID0gInJvbGUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGVTb3VyY2UgPSAic291cmNlIjsgLyoqPCA8YXR0cmlidXRlIHJvbGUgc291cmNlIHZhbHVlPi4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpmbGFncyA9ICJmbGFncyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4T3BlbkNvdW50ID0gIm1heE9wZW5Db3VudCI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4QWN0aXZlQ291bnQgPSAibWF4QWN0aXZlQ291bnQiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogR2FpblRyYWl0cworfTsKKworc3RydWN0IERldmljZVBvcnRUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8RGV2aWNlRGVzY3JpcHRvciwgRGV2aWNlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImRldmljZVBvcnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJkZXZpY2VQb3J0cyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgLyoqICA8ZGV2aWNlIHRhZyBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZ05hbWUgPSAidGFnTmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsgLyoqPCA8ZGV2aWNlIHR5cGU+LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGUgPSAicm9sZSI7IC8qKjwgPGRldmljZSByb2xlOiBzaW5rIG9yIHNvdXJjZT4uICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZVNvdXJjZSA9ICJzb3VyY2UiOyAvKio8IDxhdHRyaWJ1dGUgcm9sZSBzb3VyY2UgdmFsdWU+LiAqLworICAgICAgICAvKiogb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYWRkcmVzcyA9ICJhZGRyZXNzIjsKKyAgICAgICAgLyoqIG9wdGlvbmFsOiB0aGUgbGlzdCBvZiBlbmNvZGVkIGF1ZGlvIGZvcm1hdHMgdGhhdCBhcmUga25vd24gdG8gYmUgc3VwcG9ydGVkLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmVuY29kZWRGb3JtYXRzID0gImVuY29kZWRGb3JtYXRzIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gQ2hpbGRyZW46IEdhaW5UcmFpdHMgKG9wdGlvbmFsKQorfTsKKworc3RydWN0IFJvdXRlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUm91dGUsIEF1ZGlvUm91dGVWZWN0b3I+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAicm91dGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJyb3V0ZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsgLyoqPCA8cm91dGUgdHlwZT46IG1peCBvciBtdXguICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZU1peCA9ICJtaXgiOyAvKio8IHR5cGUgYXR0cmlidXRlIG1peCB2YWx1ZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzaW5rID0gInNpbmsiOyAvKio8IDxzaW5rOiBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlPi4gKi8KKyAgICAgICAgLyoqIHNvdXJjZXM6IGFsbCBzb3VyY2UgdGhhdCBjYW4gYmUgaW52b2x2ZWQgaW4gdGhpcyByb3V0ZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzb3VyY2VzID0gInNvdXJjZXMiOworICAgIH07CisKKyAgICB0eXBlZGVmIEh3TW9kdWxlICpQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworfTsKKworc3RydWN0IE1vZHVsZVRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxId01vZHVsZSwgSHdNb2R1bGVDb2xsZWN0aW9uPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gIm1vZHVsZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gIm1vZHVsZXMiOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyA9ICJhdHRhY2hlZERldmljZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hpbGRBdHRhY2hlZERldmljZVRhZyA9ICJpdGVtIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZyA9ICJkZWZhdWx0T3V0cHV0RGV2aWNlIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdmVyc2lvbiA9ICJoYWxWZXJzaW9uIjsKKyAgICB9OworCisgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogbWl4UG9ydFRyYWl0cywgZGV2aWNlUG9ydFRyYWl0cywgYW5kIHJvdXRlVHJhaXRzCisgICAgLy8gTmVlZCB0byBjYWxsIGRlc2VyaWFsaXplIG9uIGVhY2ggY2hpbGQKK307CisKK3N0cnVjdCBHbG9iYWxDb25maWdUcmFpdHMKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJnbG9iYWxDb25maWd1cmF0aW9uIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNwZWFrZXJEcmNFbmFibGVkID0gInNwZWFrZXJfZHJjX2VuYWJsZWQiOworICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7Cit9OworCitzdHJ1Y3QgU3Vycm91bmRTb3VuZFRyYWl0cworeworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInN1cnJvdW5kU291bmQiOworCisgICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworICAgIC8vIENoaWxkcmVuOiBTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzCit9OworCitzdHJ1Y3QgU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0cyA6IHB1YmxpYyBTdGRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUG9saWN5Q29uZmlnOjpTdXJyb3VuZEZvcm1hdHM+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZm9ybWF0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiZm9ybWF0cyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN1YmZvcm1hdHMgPSAic3ViZm9ybWF0cyI7CisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworfTsKKworY2xhc3MgUG9saWN5U2VyaWFsaXplcgoreworcHVibGljOgorICAgIFBvbGljeVNlcmlhbGl6ZXIoKSA6IG1WZXJzaW9ue3N0ZDo6dG9fc3RyaW5nKGdNYWpvcikgKyAiLiIgKyBzdGQ6OnRvX3N0cmluZyhnTWlub3IpfQorICAgIHsKKyAgICAgICAgQUxPR1YoIiVzOiBWZXJzaW9uPSVzIFJvb3Q9JXMiLCBfX2Z1bmNfXywgbVZlcnNpb24uY19zdHIoKSwgcm9vdE5hbWUpOworICAgIH0KKyAgICBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvb3ROYW1lID0gImF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp2ZXJzaW9uQXR0cmlidXRlID0gInZlcnNpb24iOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgZ01ham9yID0gMTsgLyoqPCB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgZ01pbm9yID0gMDsgLyoqPCB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLworCisgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyBFbGVtZW50OworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVZlcnNpb247CisKKyAgICAvLyBDaGlsZHJlbjogTW9kdWxlc1RyYWl0cywgVm9sdW1lVHJhaXRzLCBTdXJyb3VuZFNvdW5kVHJhaXRzIChvcHRpb25hbCkKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIHZvaWQgKCp4bWxEZWxldGVyKShUKiB0KTsKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgYXV0byB4bWxEZWxldGVyPHhtbERvYz4gPSB4bWxGcmVlRG9jOworLy8gaHR0cDovL2IvMTExMDY3Mjc3IC0gQWRkIGJhY2sgY29uc3RleHByIHdoZW4gd2Ugc3dpdGNoIHRvIEMrKzE3LgordGVtcGxhdGUgPD4KK2F1dG8geG1sRGVsZXRlcjx4bWxDaGFyPiA9IFtdKHhtbENoYXIgKnMpIHsgeG1sRnJlZShzKTsgfTsKKworLyoqIEByZXR1cm4gYSB1bmlxdWVfcHRyIHdpdGggdGhlIGNvcnJlY3QgZGVsZXRlciBmb3IgdGhlIGxpYnhtbDIgb2JqZWN0LiAqLwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYXV0byBtYWtlX3htbFVuaXF1ZShUICp0KSB7CisgICAgLy8gV3JhcCBkZWxldGVyIGluIGxhbWJkYSB0byBlbmFibGUgZW1wdHkgYmFzZSBvcHRpbWl6YXRpb24KKyAgICBhdXRvIGRlbGV0ZXIgPSBbXShUICp0KSB7IHhtbERlbGV0ZXI8VD4odCk7IH07CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxULCBkZWNsdHlwZShkZWxldGVyKT57dCwgZGVsZXRlcn07Cit9CisKK3N0ZDo6c3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK3sKKyAgICBhdXRvIHhtbFZhbHVlID0gbWFrZV94bWxVbmlxdWUoeG1sR2V0UHJvcChjdXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGF0dHJpYnV0ZSkpKTsKKyAgICBpZiAoeG1sVmFsdWUgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gIiI7CiAgICAgfQotICAgIHN0cmluZyB2YWx1ZSgoY29uc3QgY2hhciopeG1sVmFsdWUpOwotICAgIHhtbEZyZWUoeG1sVmFsdWUpOworICAgIHN0ZDo6c3RyaW5nIHZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHhtbFZhbHVlLmdldCgpKSk7CiAgICAgcmV0dXJuIHZhbHVlOwogfQogCi11c2luZyB1dGlsaXRpZXM6OmNvbnZlcnRUbzsKLQotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U2VyaWFsaXplcjo6cm9vdE5hbWUgPSAiYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVNlcmlhbGl6ZXI6OnZlcnNpb25BdHRyaWJ1dGUgPSAidmVyc2lvbiI7Ci1jb25zdCB1aW50MzJfdCBQb2xpY3lTZXJpYWxpemVyOjpnTWFqb3IgPSAxOwotY29uc3QgdWludDMyX3QgUG9saWN5U2VyaWFsaXplcjo6Z01pbm9yID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlRWxlbWVudE5hbWUgPSAicmVmZXJlbmNlIjsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSA9ICJuYW1lIjsKLQogdGVtcGxhdGUgPGNsYXNzIFRyYWl0Pgotc3RhdGljIHZvaWQgZ2V0UmVmZXJlbmNlKGNvbnN0IF94bWxOb2RlICpyb290LCBjb25zdCBfeG1sTm9kZSAqJnJlZk5vZGUsIGNvbnN0IHN0cmluZyAmcmVmTmFtZSkKK2NvbnN0IHhtbE5vZGUqIGdldFJlZmVyZW5jZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWZOYW1lKQogewotICAgIGNvbnN0IF94bWxOb2RlICpjb2wgPSByb290OwotICAgIHdoaWxlIChjb2wgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChjb2wtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSB7Ci0gICAgICAgICAgICBjb25zdCB4bWxOb2RlICpjdXIgPSBjb2wtPmNoaWxkcmVuOwotICAgICAgICAgICAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilnUmVmZXJlbmNlRWxlbWVudE5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lKTsKKyAgICBmb3IgKDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjdXItPmNoaWxkcmVuOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKCgheG1sU3RyY21wKGNoaWxkLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0OjpyZWZlcmVuY2VUYWcpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgVHJhaXQ6OkF0dHJpYnV0ZXM6OnJlZmVyZW5jZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmVmTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWZOb2RlID0gY3VyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjb2wgPSBjb2wtPm5leHQ7CiAgICAgfQotICAgIHJldHVybjsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogdGVtcGxhdGUgPGNsYXNzIFRyYWl0Pgotc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplQ29sbGVjdGlvbihfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6UHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KQorc3RhdHVzX3QgZGVzZXJpYWxpemVDb2xsZWN0aW9uKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OkNvbGxlY3Rpb24gKmNvbGxlY3Rpb24sCisgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpCiB7Ci0gICAgY29uc3QgeG1sTm9kZSAqcm9vdCA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgIHdoaWxlIChyb290ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSAmJgotICAgICAgICAgICAgICAgIHhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7Ci0gICAgICAgICAgICByb290ID0gcm9vdC0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBOVUxMOworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkpIHsKKyAgICAgICAgICAgIGNoaWxkID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7CisgICAgICAgIH0gZWxzZSBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojp0YWcpKSkgeworICAgICAgICAgICAgY2hpbGQgPSBjdXI7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByb290OwotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykpIHsKLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPnhtbENoaWxkcmVuTm9kZTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKLSAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6UHRyRWxlbWVudCBlbGVtZW50OwotICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjpkZXNlcmlhbGl6ZShkb2MsIGNoaWxkLCBlbGVtZW50LCBzZXJpYWxpemluZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgZWxlbWVudCB0byAlcyBjb2xsZWN0aW9uIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpdDo6Y29sbGVjdGlvblRhZyk7CisgICAgICAgIGZvciAoOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnRhZykpKSB7CisgICAgICAgICAgICAgICAgYXV0byBlbGVtZW50ID0gVHJhaXQ6OmRlc2VyaWFsaXplKGNoaWxkLCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFpdDo6YWRkRWxlbWVudFRvQ29sbGVjdGlvbihlbGVtZW50LCBjb2xsZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgYWRkIGVsZW1lbnQgdG8gJXMgY29sbGVjdGlvbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWl0Ojpjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCF4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojp0YWcpKSkgewogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHJvb3QgPSByb290LT5uZXh0OwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvR2FpblRyYWl0czo6dGFnID0gImdhaW4iOwotY29uc3QgY2hhciAqY29uc3QgQXVkaW9HYWluVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gImdhaW5zIjsKLQotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1vZGVbXSA9ICJtb2RlIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjpjaGFubmVsTWFza1tdID0gImNoYW5uZWxfbWFzayI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWluVmFsdWVNQltdID0gIm1pblZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1heFZhbHVlTUJbXSA9ICJtYXhWYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsdWVNQltdID0gImRlZmF1bHRWYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjpzdGVwVmFsdWVNQltdID0gInN0ZXBWYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptaW5SYW1wTXNbXSA9ICJtaW5SYW1wTXMiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1heFJhbXBNc1tdID0gIm1heFJhbXBNcyI7Ci0KLXN0YXR1c190IEF1ZGlvR2FpblRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48QXVkaW9HYWluVHJhaXRzOjpFbGVtZW50PiBBdWRpb0dhaW5UcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKICAgICBzdGF0aWMgdWludDMyX3QgaW5kZXggPSAwOwotICAgIGdhaW4gPSBuZXcgRWxlbWVudChpbmRleCsrLCB0cnVlKTsKKyAgICBFbGVtZW50IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4KyssIHRydWUpOwogCi0gICAgc3RyaW5nIG1vZGUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bW9kZSk7CisgICAgc3RkOjpzdHJpbmcgbW9kZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1vZGUpOwogICAgIGlmICghbW9kZS5lbXB0eSgpKSB7CiAgICAgICAgIGdhaW4tPnNldE1vZGUoR2Fpbk1vZGVDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG1vZGUpKTsKICAgICB9CiAKLSAgICBzdHJpbmcgY2hhbm5lbHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrKTsKKyAgICBzdGQ6OnN0cmluZyBjaGFubmVsc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFzayk7CiAgICAgaWYgKCFjaGFubmVsc0xpdGVyYWwuZW1wdHkoKSkgewogICAgICAgICBnYWluLT5zZXRDaGFubmVsTWFzayhjaGFubmVsTWFza0Zyb21TdHJpbmcoY2hhbm5lbHNMaXRlcmFsKSk7CiAgICAgfQogCi0gICAgc3RyaW5nIG1pblZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1pblZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIG1pblZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWluVmFsdWVNQik7CiAgICAgaW50MzJfdCBtaW5WYWx1ZU1COwogICAgIGlmICghbWluVmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWluVmFsdWVNQkxpdGVyYWwsIG1pblZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldE1pblZhbHVlSW5NYihtaW5WYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWF4VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWF4VmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgbWF4VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptYXhWYWx1ZU1CKTsKICAgICBpbnQzMl90IG1heFZhbHVlTUI7CiAgICAgaWYgKCFtYXhWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtYXhWYWx1ZU1CTGl0ZXJhbCwgbWF4VmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWF4VmFsdWVJbk1iKG1heFZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBkZWZhdWx0VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6ZGVmYXVsdFZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWx1ZU1CKTsKICAgICBpbnQzMl90IGRlZmF1bHRWYWx1ZU1COwogICAgIGlmICghZGVmYXVsdFZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKGRlZmF1bHRWYWx1ZU1CTGl0ZXJhbCwgZGVmYXVsdFZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldERlZmF1bHRWYWx1ZUluTWIoZGVmYXVsdFZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBzdGVwVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c3RlcFZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIHN0ZXBWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnN0ZXBWYWx1ZU1CKTsKICAgICB1aW50MzJfdCBzdGVwVmFsdWVNQjsKICAgICBpZiAoIXN0ZXBWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhzdGVwVmFsdWVNQkxpdGVyYWwsIHN0ZXBWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXRTdGVwVmFsdWVJbk1iKHN0ZXBWYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWluUmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptaW5SYW1wTXMpOworICAgIHN0ZDo6c3RyaW5nIG1pblJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptaW5SYW1wTXMpOwogICAgIHVpbnQzMl90IG1pblJhbXBNczsKICAgICBpZiAoIW1pblJhbXBNc0xpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWluUmFtcE1zTGl0ZXJhbCwgbWluUmFtcE1zKSkgewogICAgICAgICBnYWluLT5zZXRNaW5SYW1wSW5NcyhtaW5SYW1wTXMpOwogICAgIH0KIAotICAgIHN0cmluZyBtYXhSYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1heFJhbXBNcyk7CisgICAgc3RkOjpzdHJpbmcgbWF4UmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1heFJhbXBNcyk7CiAgICAgdWludDMyX3QgbWF4UmFtcE1zOwogICAgIGlmICghbWF4UmFtcE1zTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtYXhSYW1wTXNMaXRlcmFsLCBtYXhSYW1wTXMpKSB7CiAgICAgICAgIGdhaW4tPnNldE1heFJhbXBJbk1zKG1heFJhbXBNcyk7CiAgICAgfQotICAgIEFMT0dWKCIlczogYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgIGdhaW4tPmdldE1vZGUoKSwgZ2Fpbi0+Z2V0Q2hhbm5lbE1hc2soKSwgZ2Fpbi0+Z2V0TWluVmFsdWVJbk1iKCksCi0gICAgICAgICAgZ2Fpbi0+Z2V0TWF4VmFsdWVJbk1iKCkpOwotCi0gICAgaWYgKGdhaW4tPmdldE1vZGUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgc3RkOjpzdHJpbmcgdXNlRm9yVm9sdW1lTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnVzZUZvclZvbHVtZSk7CisgICAgYm9vbCB1c2VGb3JWb2x1bWUgPSBmYWxzZTsKKyAgICBpZiAoIXVzZUZvclZvbHVtZUxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8odXNlRm9yVm9sdW1lTGl0ZXJhbCwgdXNlRm9yVm9sdW1lKSkgeworICAgICAgICBnYWluLT5zZXRVc2VGb3JWb2x1bWUodXNlRm9yVm9sdW1lKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIEFMT0dWKCIlczogYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIFVzZUZvclZvbHVtZTogJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBnYWluLT5nZXRNb2RlKCksIGdhaW4tPmdldENoYW5uZWxNYXNrKCksIGdhaW4tPmdldE1pblZhbHVlSW5NYigpLAorICAgICAgICAgIGdhaW4tPmdldE1heFZhbHVlSW5NYigpLCB1c2VGb3JWb2x1bWUpOworCisgICAgaWYgKGdhaW4tPmdldE1vZGUoKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBnYWluOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQogfQogCi1jb25zdCBjaGFyICpjb25zdCBBdWRpb1Byb2ZpbGVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAicHJvZmlsZXMiOwotY29uc3QgY2hhciAqY29uc3QgQXVkaW9Qcm9maWxlVHJhaXRzOjp0YWcgPSAicHJvZmlsZSI7Ci0KLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpuYW1lW10gPSAibmFtZSI7Ci1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6c2FtcGxpbmdSYXRlc1tdID0gInNhbXBsaW5nUmF0ZXMiOwotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6OmZvcm1hdFtdID0gImZvcm1hdCI7Ci1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6Y2hhbm5lbE1hc2tzW10gPSAiY2hhbm5lbE1hc2tzIjsKLQotc3RhdHVzX3QgQXVkaW9Qcm9maWxlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxBdWRpb1Byb2ZpbGVUcmFpdHM6OkVsZW1lbnQ+IEF1ZGlvUHJvZmlsZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewotICAgIHN0cmluZyBzYW1wbGluZ1JhdGVzID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXMpOwotICAgIHN0cmluZyBmb3JtYXQgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6Zm9ybWF0KTsKLSAgICBzdHJpbmcgY2hhbm5lbHMgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2tzKTsKKyAgICBzdGQ6OnN0cmluZyBzYW1wbGluZ1JhdGVzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c2FtcGxpbmdSYXRlcyk7CisgICAgc3RkOjpzdHJpbmcgZm9ybWF0ID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Zm9ybWF0KTsKKyAgICBzdGQ6OnN0cmluZyBjaGFubmVscyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrcyk7CiAKLSAgICBwcm9maWxlID0gbmV3IEVsZW1lbnQoZm9ybWF0RnJvbVN0cmluZyhmb3JtYXQsIGdEeW5hbWljRm9ybWF0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzRnJvbVN0cmluZyhjaGFubmVscywgIiwiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoc2FtcGxpbmdSYXRlcywgIiwiKSk7CisgICAgRWxlbWVudCBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRGcm9tU3RyaW5nKGZvcm1hdCwgZ0R5bmFtaWNGb3JtYXQpLAorICAgICAgICAgICAgY2hhbm5lbE1hc2tzRnJvbVN0cmluZyhjaGFubmVscywgIiwiKSwKKyAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKHNhbXBsaW5nUmF0ZXMsICIsIikpOwogCiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBnRHluYW1pY0Zvcm1hdCk7CiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHByb2ZpbGUtPmdldENoYW5uZWxzKCkuaXNFbXB0eSgpKTsKICAgICBwcm9maWxlLT5zZXREeW5hbWljUmF0ZShwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLmlzRW1wdHkoKSk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIHByb2ZpbGU7CiB9CiAKLQotY29uc3QgY2hhciAqY29uc3QgTWl4UG9ydFRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJtaXhQb3J0cyI7Ci1jb25zdCBjaGFyICpjb25zdCBNaXhQb3J0VHJhaXRzOjp0YWcgPSAibWl4UG9ydCI7Ci0KLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bmFtZVtdID0gIm5hbWUiOwotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpyb2xlW10gPSAicm9sZSI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OmZsYWdzW10gPSAiZmxhZ3MiOwotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnRbXSA9ICJtYXhPcGVuQ291bnQiOwotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhBY3RpdmVDb3VudFtdID0gIm1heEFjdGl2ZUNvdW50IjsKLQotc3RhdHVzX3QgTWl4UG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsIFB0ckVsZW1lbnQgJm1peFBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPE1peFBvcnRUcmFpdHM6OkVsZW1lbnQ+IE1peFBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmNoaWxkLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewotICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpuYW1lKTsKICAgICBpZiAobmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7Ci0gICAgc3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnJvbGUpOwogICAgIGlmIChyb2xlLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6cm9sZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6cm9sZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogUm9sZT0lcyIsIF9fRlVOQ1RJT05fXywgcm9sZS5jX3N0cigpKTsKLSAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IHJvbGUgPT0gInNvdXJjZSIgPyBBVURJT19QT1JUX1JPTEVfU09VUkNFIDogQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgQUxPR1YoIiVzOiBSb2xlPSVzIiwgX19mdW5jX18sIHJvbGUuY19zdHIoKSk7CisgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUgPSAocm9sZSA9PSBBdHRyaWJ1dGVzOjpyb2xlU291cmNlKSA/CisgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFIDogQVVESU9fUE9SVF9ST0xFX1NJTks7CiAKLSAgICBtaXhQb3J0ID0gbmV3IEVsZW1lbnQoU3RyaW5nOChuYW1lLmNfc3RyKCkpLCBwb3J0Um9sZSk7CisgICAgRWxlbWVudCBtaXhQb3J0ID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KG5hbWUuY19zdHIoKSksIHBvcnRSb2xlKTsKIAogICAgIEF1ZGlvUHJvZmlsZVRyYWl0czo6Q29sbGVjdGlvbiBwcm9maWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihkb2MsIGNoaWxkLCBwcm9maWxlcywgTlVMTCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvUHJvZmlsZVRyYWl0cz4oY2hpbGQsICZwcm9maWxlcywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNwIDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxzVmVjdG9yKCksIFNhbXBsZVJhdGVWZWN0b3IoKSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY1JhdGUodHJ1ZSk7Ci0gICAgICAgIHByb2ZpbGVzLmFkZChkeW5hbWljUHJvZmlsZSk7CisgICAgICAgIHByb2ZpbGVzLmFkZChBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOwogICAgIH0KICAgICBtaXhQb3J0LT5zZXRBdWRpb1Byb2ZpbGVzKHByb2ZpbGVzKTsKIAotICAgIHN0cmluZyBmbGFncyA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6ZmxhZ3MpOworICAgIHN0ZDo6c3RyaW5nIGZsYWdzID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpmbGFncyk7CiAgICAgaWYgKCFmbGFncy5lbXB0eSgpKSB7CiAgICAgICAgIC8vIFNvdXJjZSByb2xlCiAgICAgICAgIGlmIChwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CkBAIC0yNjEsNTIgKzQ1Miw0NiBAQAogICAgICAgICAgICAgbWl4UG9ydC0+c2V0RmxhZ3MoSW5wdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncykpOwogICAgICAgICB9CiAgICAgfQotICAgIHN0cmluZyBtYXhPcGVuQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudCk7CisgICAgc3RkOjpzdHJpbmcgbWF4T3BlbkNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnQpOwogICAgIGlmICghbWF4T3BlbkNvdW50LmVtcHR5KCkpIHsKICAgICAgICAgY29udmVydFRvKG1heE9wZW5Db3VudCwgbWl4UG9ydC0+bWF4T3BlbkNvdW50KTsKICAgICB9Ci0gICAgc3RyaW5nIG1heEFjdGl2ZUNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhBY3RpdmVDb3VudCk7CisgICAgc3RkOjpzdHJpbmcgbWF4QWN0aXZlQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50KTsKICAgICBpZiAoIW1heEFjdGl2ZUNvdW50LmVtcHR5KCkpIHsKICAgICAgICAgY29udmVydFRvKG1heEFjdGl2ZUNvdW50LCBtaXhQb3J0LT5tYXhBY3RpdmVDb3VudCk7CiAgICAgfQogICAgIC8vIERlc2VyaWFsaXplIGNoaWxkcmVuCiAgICAgQXVkaW9HYWluVHJhaXRzOjpDb2xsZWN0aW9uIGdhaW5zOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGRvYywgY2hpbGQsIGdhaW5zLCBOVUxMKTsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihjaGlsZCwgJmdhaW5zLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1peFBvcnQtPnNldEdhaW5zKGdhaW5zKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gbWl4UG9ydDsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgRGV2aWNlUG9ydFRyYWl0czo6dGFnID0gImRldmljZVBvcnQiOwotY29uc3QgY2hhciAqY29uc3QgRGV2aWNlUG9ydFRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJkZXZpY2VQb3J0cyI7Ci0KLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6dGFnTmFtZVtdID0gInRhZ05hbWUiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjp0eXBlW10gPSAidHlwZSI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnJvbGVbXSA9ICJyb2xlIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6YWRkcmVzc1tdID0gImFkZHJlc3MiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpyb2xlU291cmNlW10gPSAic291cmNlIjsKLQotc3RhdHVzX3QgRGV2aWNlUG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZGV2aWNlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48RGV2aWNlUG9ydFRyYWl0czo6RWxlbWVudD4gRGV2aWNlUG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewotICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKICAgICBpZiAobmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnRhZ05hbWUsIG5hbWUuY19zdHIoKSk7Ci0gICAgc3RyaW5nIHR5cGVOYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0YWdOYW1lLCBuYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHR5cGVOYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dHlwZSk7CiAgICAgaWYgKHR5cGVOYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyB0eXBlIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyB0eXBlIGZvciAlcyIsIF9fZnVuY19fLCBuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGVOYW1lLmNfc3RyKCkpOwotICAgIHN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlTmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6cm9sZSk7CiAgICAgaWYgKHJvbGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpyb2xlLCByb2xlLmNfc3RyKCkpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjpyb2xlLCByb2xlLmNfc3RyKCkpOwogICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gKHJvbGUgPT0gQXR0cmlidXRlczo6cm9sZVNvdXJjZSkgPwogICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIApAQCAtMzE0LDMzOCArNDk5LDMwMSBAQAogICAgIGlmICghZGV2aWNlRnJvbVN0cmluZyh0eXBlTmFtZSwgdHlwZSkgfHwKICAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmIHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHx8CiAgICAgICAgICAgICAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHR5cGUpICYmIHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSkgewotICAgICAgICBBTE9HVygiJXM6IGJhZCB0eXBlICUwOHgiLCBfX0ZVTkNUSU9OX18sIHR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HVygiJXM6IGJhZCB0eXBlICUwOHgiLCBfX2Z1bmNfXywgdHlwZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIGRldmljZURlc2MgPSBuZXcgRWxlbWVudCh0eXBlLCBTdHJpbmc4KG5hbWUuY19zdHIoKSkpOworICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRGb3JtYXRzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmVuY29kZWRGb3JtYXRzKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6ZW5jb2RlZEZvcm1hdHMsIGVuY29kZWRGb3JtYXRzTGl0ZXJhbC5jX3N0cigpKTsKKyAgICBGb3JtYXRWZWN0b3IgZW5jb2RlZEZvcm1hdHM7CisgICAgaWYgKCFlbmNvZGVkRm9ybWF0c0xpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBlbmNvZGVkRm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKGVuY29kZWRGb3JtYXRzTGl0ZXJhbCwgIiAiKTsKKyAgICB9CisgICAgRWxlbWVudCBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgZW5jb2RlZEZvcm1hdHMsIFN0cmluZzgobmFtZS5jX3N0cigpKSk7CiAKLSAgICBzdHJpbmcgYWRkcmVzcyA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjphZGRyZXNzKTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6YWRkcmVzcyk7CiAgICAgaWYgKCFhZGRyZXNzLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBhZGRyZXNzPSVzIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICBkZXZpY2VEZXNjLT5tQWRkcmVzcyA9IFN0cmluZzgoYWRkcmVzcy5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIiVzOiBhZGRyZXNzPSVzIGZvciAlcyIsIF9fZnVuY19fLCBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7CisgICAgICAgIGRldmljZURlc2MtPnNldEFkZHJlc3MoU3RyaW5nOChhZGRyZXNzLmNfc3RyKCkpKTsKICAgICB9CiAKICAgICBBdWRpb1Byb2ZpbGVUcmFpdHM6OkNvbGxlY3Rpb24gcHJvZmlsZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvUHJvZmlsZVRyYWl0cz4oZG9jLCByb290LCBwcm9maWxlcywgTlVMTCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvUHJvZmlsZVRyYWl0cz4oY3VyLCAmcHJvZmlsZXMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICBzcCA8QXVkaW9Qcm9maWxlPiBkeW5hbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsc1ZlY3RvcigpLCBTYW1wbGVSYXRlVmVjdG9yKCkpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNSYXRlKHRydWUpOwotICAgICAgICBwcm9maWxlcy5hZGQoZHluYW1pY1Byb2ZpbGUpOworICAgICAgICBwcm9maWxlcy5hZGQoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKICAgICB9CiAgICAgZGV2aWNlRGVzYy0+c2V0QXVkaW9Qcm9maWxlcyhwcm9maWxlcyk7CiAKICAgICAvLyBEZXNlcmlhbGl6ZSBBdWRpb0dhaW4gY2hpbGRyZW4KLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihkb2MsIHJvb3QsIGRldmljZURlc2MtPm1HYWlucywgTlVMTCk7Ci0gICAgQUxPR1YoIiVzOiBhZGRpbmcgZGV2aWNlIHRhZyAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICBkZXZpY2VEZXNjLT5nZXROYW1lKCkuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oY3VyLCAmZGV2aWNlRGVzYy0+bUdhaW5zLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorICAgIEFMT0dWKCIlczogYWRkaW5nIGRldmljZSB0YWcgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLCBfX2Z1bmNfXywKKyAgICAgICAgICBkZXZpY2VEZXNjLT5nZXROYW1lKCkuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPmFkZHJlc3MoKS5zdHJpbmcoKSk7CisgICAgcmV0dXJuIGRldmljZURlc2M7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IFJvdXRlVHJhaXRzOjp0YWcgPSAicm91dGUiOwotY29uc3QgY2hhciAqY29uc3QgUm91dGVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAicm91dGVzIjsKLQotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6dHlwZVtdID0gInR5cGUiOwotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6dHlwZU1peFtdID0gIm1peCI7Ci1jb25zdCBjaGFyIFJvdXRlVHJhaXRzOjpBdHRyaWJ1dGVzOjpzaW5rW10gPSAic2luayI7Ci1jb25zdCBjaGFyIFJvdXRlVHJhaXRzOjpBdHRyaWJ1dGVzOjpzb3VyY2VzW10gPSAic291cmNlcyI7Ci0KLQotc3RhdHVzX3QgUm91dGVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKK1JldHVybjxSb3V0ZVRyYWl0czo6RWxlbWVudD4gUm91dGVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggY3R4KQogewotICAgIHN0cmluZyB0eXBlID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIHN0ZDo6c3RyaW5nIHR5cGUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp0eXBlKTsKICAgICBpZiAodHlwZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICBhdWRpb19yb3V0ZV90eXBlX3Qgcm91dGVUeXBlID0gKHR5cGUgPT0gQXR0cmlidXRlczo6dHlwZU1peCkgPwogICAgICAgICAgICAgICAgIEFVRElPX1JPVVRFX01JWCA6IEFVRElPX1JPVVRFX01VWDsKIAotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZS5jX3N0cigpKTsKLSAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQocm91dGVUeXBlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZS5jX3N0cigpKTsKKyAgICBFbGVtZW50IHJvdXRlID0gbmV3IEF1ZGlvUm91dGUocm91dGVUeXBlKTsKIAotICAgIHN0cmluZyBzaW5rQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzaW5rKTsKKyAgICBzdGQ6OnN0cmluZyBzaW5rQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNpbmspOwogICAgIGlmIChzaW5rQXR0ci5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnNpbmspOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnNpbmspOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICAvLyBDb252ZXJ0IFNpbmsgbmFtZSB0byBwb3J0IHBvaW50ZXIKICAgICBzcDxBdWRpb1BvcnQ+IHNpbmsgPSBjdHgtPmZpbmRQb3J0QnlUYWdOYW1lKFN0cmluZzgoc2lua0F0dHIuY19zdHIoKSkpOwogICAgIGlmIChzaW5rID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBzaW5rIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fRlVOQ1RJT05fXywgc2lua0F0dHIuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogbm8gc2luayBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX2Z1bmNfXywgc2lua0F0dHIuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIGVsZW1lbnQtPnNldFNpbmsoc2luayk7CisgICAgcm91dGUtPnNldFNpbmsoc2luayk7CiAKLSAgICBzdHJpbmcgc291cmNlc0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c291cmNlcyk7CisgICAgc3RkOjpzdHJpbmcgc291cmNlc0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKICAgICBpZiAoc291cmNlc0F0dHIuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgLy8gVG9rZW5pemUgYW5kIENvbnZlcnQgU291cmNlcyBuYW1lIHRvIHBvcnQgcG9pbnRlcgogICAgIEF1ZGlvUG9ydFZlY3RvciBzb3VyY2VzOwotICAgIGNoYXIgKnNvdXJjZXNMaXRlcmFsID0gc3RybmR1cChzb3VyY2VzQXR0ci5jX3N0cigpLCBzdHJsZW4oc291cmNlc0F0dHIuY19zdHIoKSkpOwotICAgIGNoYXIgKmRldlRhZyA9IHN0cnRvayhzb3VyY2VzTGl0ZXJhbCwgIiwiKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBzb3VyY2VzTGl0ZXJhbHtzdHJuZHVwKAorICAgICAgICAgICAgICAgIHNvdXJjZXNBdHRyLmNfc3RyKCksIHN0cmxlbihzb3VyY2VzQXR0ci5jX3N0cigpKSl9OworICAgIGNoYXIgKmRldlRhZyA9IHN0cnRvayhzb3VyY2VzTGl0ZXJhbC5nZXQoKSwgIiwiKTsKICAgICB3aGlsZSAoZGV2VGFnICE9IE5VTEwpIHsKICAgICAgICAgaWYgKHN0cmxlbihkZXZUYWcpICE9IDApIHsKICAgICAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc291cmNlID0gY3R4LT5maW5kUG9ydEJ5VGFnTmFtZShTdHJpbmc4KGRldlRhZykpOwogICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzb3VyY2UgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19GVU5DVElPTl9fLCBkZXZUYWcpOwotICAgICAgICAgICAgICAgIGZyZWUoc291cmNlc0xpdGVyYWwpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzb3VyY2UgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIGRldlRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNvdXJjZXMuYWRkKHNvdXJjZSk7CiAgICAgICAgIH0KICAgICAgICAgZGV2VGFnID0gc3RydG9rKE5VTEwsICIsIik7CiAgICAgfQotICAgIGZyZWUoc291cmNlc0xpdGVyYWwpOwogCi0gICAgc2luay0+YWRkUm91dGUoZWxlbWVudCk7CisgICAgc2luay0+YWRkUm91dGUocm91dGUpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc291cmNlcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxBdWRpb1BvcnQ+IHNvdXJjZSA9IHNvdXJjZXMuaXRlbUF0KGkpOwotICAgICAgICBzb3VyY2UtPmFkZFJvdXRlKGVsZW1lbnQpOworICAgICAgICBzb3VyY2UtPmFkZFJvdXRlKHJvdXRlKTsKICAgICB9Ci0gICAgZWxlbWVudC0+c2V0U291cmNlcyhzb3VyY2VzKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcm91dGUtPnNldFNvdXJjZXMoc291cmNlcyk7CisgICAgcmV0dXJuIHJvdXRlOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNoaWxkQXR0YWNoZWREZXZpY2VzVGFnID0gImF0dGFjaGVkRGV2aWNlcyI7Ci1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNoaWxkQXR0YWNoZWREZXZpY2VUYWcgPSAiaXRlbSI7Ci1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZyA9ICJkZWZhdWx0T3V0cHV0RGV2aWNlIjsKLQotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjp0YWcgPSAibW9kdWxlIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJtb2R1bGVzIjsKLQotY29uc3QgY2hhciBNb2R1bGVUcmFpdHM6OkF0dHJpYnV0ZXM6Om5hbWVbXSA9ICJuYW1lIjsKLWNvbnN0IGNoYXIgTW9kdWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjp2ZXJzaW9uW10gPSAiaGFsVmVyc2lvbiI7Ci0KLXN0YXR1c190IE1vZHVsZVRyYWl0czo6ZGVzZXJpYWxpemUoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCitSZXR1cm48TW9kdWxlVHJhaXRzOjpFbGVtZW50PiBNb2R1bGVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggY3R4KQogewotICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpuYW1lKTsKICAgICBpZiAobmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICB1aW50MzJfdCB2ZXJzaW9uTWFqb3IgPSAwLCB2ZXJzaW9uTWlub3IgPSAwOwotICAgIHN0cmluZyB2ZXJzaW9uTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp2ZXJzaW9uKTsKKyAgICBzdGQ6OnN0cmluZyB2ZXJzaW9uTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnZlcnNpb24pOwogICAgIGlmICghdmVyc2lvbkxpdGVyYWwuZW1wdHkoKSkgewogICAgICAgICBzc2NhbmYodmVyc2lvbkxpdGVyYWwuY19zdHIoKSwgIiV1LiV1IiwgJnZlcnNpb25NYWpvciwgJnZlcnNpb25NaW5vcik7Ci0gICAgICAgIEFMT0dWKCIlczogbUhhbFZlcnNpb24gPSBtYWpvciAldSBtaW5vciAldSIsICBfX0ZVTkNUSU9OX18sCisgICAgICAgIEFMT0dWKCIlczogbUhhbFZlcnNpb24gPSBtYWpvciAldSBtaW5vciAldSIsICBfX2Z1bmNfXywKICAgICAgICAgICAgICAgdmVyc2lvbk1ham9yLCB2ZXJzaW9uTWFqb3IpOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKIAotICAgIG1vZHVsZSA9IG5ldyBFbGVtZW50KG5hbWUuY19zdHIoKSwgdmVyc2lvbk1ham9yLCB2ZXJzaW9uTWlub3IpOworICAgIEVsZW1lbnQgbW9kdWxlID0gbmV3IEh3TW9kdWxlKG5hbWUuY19zdHIoKSwgdmVyc2lvbk1ham9yLCB2ZXJzaW9uTWlub3IpOwogCiAgICAgLy8gRGVzZXJpYWxpemUgY2hpbGRyZW5zOiBBdWRpbyBNaXggUG9ydCwgQXVkaW8gRGV2aWNlIFBvcnRzIChTb3VyY2UvU2luayksIEF1ZGlvIFJvdXRlcwogICAgIE1peFBvcnRUcmFpdHM6OkNvbGxlY3Rpb24gbWl4UG9ydHM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPE1peFBvcnRUcmFpdHM+KGRvYywgcm9vdCwgbWl4UG9ydHMsIE5VTEwpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNaXhQb3J0VHJhaXRzPihjdXIsICZtaXhQb3J0cywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtb2R1bGUtPnNldFByb2ZpbGVzKG1peFBvcnRzKTsKIAogICAgIERldmljZVBvcnRUcmFpdHM6OkNvbGxlY3Rpb24gZGV2aWNlUG9ydHM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPERldmljZVBvcnRUcmFpdHM+KGRvYywgcm9vdCwgZGV2aWNlUG9ydHMsIE5VTEwpOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxEZXZpY2VQb3J0VHJhaXRzPihjdXIsICZkZXZpY2VQb3J0cywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtb2R1bGUtPnNldERlY2xhcmVkRGV2aWNlcyhkZXZpY2VQb3J0cyk7CiAKICAgICBSb3V0ZVRyYWl0czo6Q29sbGVjdGlvbiByb3V0ZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFJvdXRlVHJhaXRzPihkb2MsIHJvb3QsIHJvdXRlcywgbW9kdWxlLmdldCgpKTsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Um91dGVUcmFpdHM+KGN1ciwgJnJvdXRlcywgbW9kdWxlLmdldCgpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1vZHVsZS0+c2V0Um91dGVzKHJvdXRlcyk7CiAKLSAgICBjb25zdCB4bWxOb2RlICpjaGlsZHJlbiA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAoY2hpbGRyZW4gIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljaGlsZEF0dGFjaGVkRGV2aWNlc1RhZykpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZXNUYWcpOwotICAgICAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgICAgICAgICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljaGlsZEF0dGFjaGVkRGV2aWNlVGFnKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxDaGFyICphdHRhY2hlZERldmljZSA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZERldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopYXR0YWNoZWREZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KChjb25zdCBjaGFyKilhdHRhY2hlZERldmljZSkpOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGRyZW4gPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY2hpbGRyZW4gIT0gTlVMTDsKKyAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4tPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXMgZm91bmQiLCBfX2Z1bmNfXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZTsgY2hpbGQgIT0gTlVMTDsKKyAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihjaGlsZEF0dGFjaGVkRGV2aWNlVGFnKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBhdHRhY2hlZERldmljZSA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQtPmRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNoZWREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGF0dGFjaGVkRGV2aWNlLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZERldmljZS5nZXQoKSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+YWRkQXZhaWxhYmxlRGV2aWNlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKGF0dGFjaGVkRGV2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZykpIHsKLSAgICAgICAgICAgIHhtbENoYXIgKmRlZmF1bHRPdXRwdXREZXZpY2UgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGUsIDEpOzsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0T3V0cHV0RGV2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIGNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopZGVmYXVsdE91dHB1dERldmljZSk7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOCgoY29uc3QgY2hhciopZGVmYXVsdE91dHB1dERldmljZSkpOworICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZykpKSB7CisgICAgICAgICAgICBhdXRvIGRlZmF1bHRPdXRwdXREZXZpY2UgPSBtYWtlX3htbFVuaXF1ZSh4bWxOb2RlTGlzdEdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi0+ZG9jLCBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSk7CisgICAgICAgICAgICBpZiAoZGVmYXVsdE91dHB1dERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIGNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRlZmF1bHRPdXRwdXREZXZpY2UuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLmdldERldmljZUZyb21UYWdOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkZWZhdWx0T3V0cHV0RGV2aWNlLmdldCgpKSkpOwogICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gMCAmJiBjdHgtPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGN0eC0+c2V0RGVmYXVsdE91dHB1dERldmljZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGRlZmF1bHQgaXMgJTA4eCIsIF9fRlVOQ1RJT05fXywgY3R4LT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZGVmYXVsdCBpcyAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY3R4LT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbEZyZWUoZGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi0+bmV4dDsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBtb2R1bGU7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IEdsb2JhbENvbmZpZ1RyYWl0czo6dGFnID0gImdsb2JhbENvbmZpZ3VyYXRpb24iOwotCi1jb25zdCBjaGFyIEdsb2JhbENvbmZpZ1RyYWl0czo6QXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWRbXSA9ICJzcGVha2VyX2RyY19lbmFibGVkIjsKLQotCi1zdGF0dXNfdCBHbG9iYWxDb25maWdUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKK3N0YXR1c190IEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKIHsKLSAgICBjb25zdCB4bWxOb2RlICpyb290ID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKHJvb3QgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKXRhZykpIHsKLSAgICAgICAgICAgIHN0cmluZyBzcGVha2VyRHJjRW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgIGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzcGVha2VyRHJjRW5hYmxlZCk7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih0YWcpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3BlYWtlckRyY0VuYWJsZWQgPQorICAgICAgICAgICAgICAgICAgICBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzcGVha2VyRHJjRW5hYmxlZCk7CiAgICAgICAgICAgICBib29sIGlzU3BlYWtlckRyY0VuYWJsZWQ7CiAgICAgICAgICAgICBpZiAoIXNwZWFrZXJEcmNFbmFibGVkLmVtcHR5KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgY29udmVydFRvPHN0cmluZywgYm9vbD4oc3BlYWtlckRyY0VuYWJsZWQsIGlzU3BlYWtlckRyY0VuYWJsZWQpKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldFNwZWFrZXJEcmNFbmFibGVkKGlzU3BlYWtlckRyY0VuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG88c3RkOjpzdHJpbmcsIGJvb2w+KHNwZWFrZXJEcmNFbmFibGVkLCBpc1NwZWFrZXJEcmNFbmFibGVkKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+c2V0U3BlYWtlckRyY0VuYWJsZWQoaXNTcGVha2VyRHJjRW5hYmxlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgcm9vdCA9IHJvb3QtPm5leHQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi1jb25zdCBjaGFyICpjb25zdCBWb2x1bWVUcmFpdHM6OnRhZyA9ICJ2b2x1bWUiOwotY29uc3QgY2hhciAqY29uc3QgVm9sdW1lVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gInZvbHVtZXMiOwotY29uc3QgY2hhciAqY29uc3QgVm9sdW1lVHJhaXRzOjp2b2x1bWVQb2ludFRhZyA9ICJwb2ludCI7Ci0KLWNvbnN0IGNoYXIgVm9sdW1lVHJhaXRzOjpBdHRyaWJ1dGVzOjpzdHJlYW1bXSA9ICJzdHJlYW0iOwotY29uc3QgY2hhciBWb2x1bWVUcmFpdHM6OkF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5W10gPSAiZGV2aWNlQ2F0ZWdvcnkiOwotY29uc3QgY2hhciBWb2x1bWVUcmFpdHM6OkF0dHJpYnV0ZXM6OnJlZmVyZW5jZVtdID0gInJlZiI7Ci0KLXN0YXR1c190IFZvbHVtZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK3N0YXR1c190IFN1cnJvdW5kU291bmRUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpCiB7Ci0gICAgc3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnN0cmVhbSk7Ci0gICAgaWYgKHN0cmVhbVR5cGVMaXRlcmFsLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOwotICAgIGlmICghU3RyZWFtVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJlYW1UeXBlTGl0ZXJhbCwgc3RyZWFtVHlwZSkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW0pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdHJpbmcgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKLSAgICBpZiAoZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnk7Ci0gICAgaWYgKCFEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhkZXZpY2VDYXRlZ29yeUxpdGVyYWwsIGRldmljZUNhdGVnb3J5KSkgewotICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICBkZXZpY2VDYXRlZ29yeUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorICAgIGNvbmZpZy0+c2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpOwogCi0gICAgc3RyaW5nIHJlZmVyZW5jZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6cmVmZXJlbmNlKTsKLSAgICBjb25zdCBfeG1sTm9kZSAqcmVmID0gTlVMTDsKLSAgICBpZiAoIXJlZmVyZW5jZU5hbWUuZW1wdHkoKSkgewotICAgICAgICBnZXRSZWZlcmVuY2U8Vm9sdW1lVHJhaXRzPihyb290LT5wYXJlbnQsIHJlZiwgcmVmZXJlbmNlTmFtZSk7Ci0gICAgICAgIGlmIChyZWYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBObyByZWZlcmVuY2UgUHRyIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoZGV2aWNlQ2F0ZWdvcnksIHN0cmVhbVR5cGUpOwotCi0gICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPyByb290LT54bWxDaGlsZHJlbk5vZGUgOiByZWYtPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKil2b2x1bWVQb2ludFRhZykpIHsKLSAgICAgICAgICAgIHhtbENoYXIgKnBvaW50RGVmaW5pdGlvbiA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSk7OwotICAgICAgICAgICAgaWYgKHBvaW50RGVmaW5pdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmN1ciA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KHRhZykpKSB7CisgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZzo6U3Vycm91bmRGb3JtYXRzIGZvcm1hdHM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0cz4oCisgICAgICAgICAgICAgICAgICAgIGN1ciwgJmZvcm1hdHMsIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+c2V0U3Vycm91bmRGb3JtYXRzKGZvcm1hdHMpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIiVzOiAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCAoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uKTsKLSAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90PiBwb2ludDsKLSAgICAgICAgICAgIGNvbGxlY3Rpb25Gcm9tU3RyaW5nPERlZmF1bHRUcmFpdHM8aW50MzJfdD4gPigoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uLCBwb2ludCwgIiwiKTsKLSAgICAgICAgICAgIGlmIChwb2ludC5zaXplKCkgIT0gMikgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlczogJXMiLCBfX0ZVTkNUSU9OX18sIHZvbHVtZVBvaW50VGFnLAotICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilwb2ludERlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbGVtZW50LT5hZGQoQ3VydmVQb2ludChwb2ludFswXSwgcG9pbnRbMV0pKTsKLSAgICAgICAgICAgIHhtbEZyZWUocG9pbnREZWZpbml0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLVBvbGljeVNlcmlhbGl6ZXI6OlBvbGljeVNlcmlhbGl6ZXIoKSA6IG1Sb290RWxlbWVudE5hbWUocm9vdE5hbWUpCitSZXR1cm48U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6RWxlbWVudD4gU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6ZGVzZXJpYWxpemUoCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwotICAgIG9zcyA8PCBnTWFqb3IgPDwgIi4iIDw8IGdNaW5vcjsKLSAgICBtVmVyc2lvbiA9IG9zcy5zdHIoKTsKLSAgICBBTE9HVigiJXM6IFZlcnNpb249JXMgUm9vdD0lcyIsIF9fRlVOQ1RJT05fXywgbVZlcnNpb24uY19zdHIoKSwgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKGZvcm1hdExpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIGZvciBhIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0RnJvbVN0cmluZyhmb3JtYXRMaXRlcmFsKTsKKyAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5yZWNvZ25pemVkIGZvcm1hdCAlcyIsIF9fZnVuY19fLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBFbGVtZW50IHBhaXIgPSBzdGQ6Om1ha2VfcGFpcihmb3JtYXQsIENvbGxlY3Rpb246Om1hcHBlZF90eXBle30pOworCisgICAgc3RkOjpzdHJpbmcgc3ViZm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdWJmb3JtYXRzKTsKKyAgICBpZiAoc3ViZm9ybWF0c0xpdGVyYWwuZW1wdHkoKSkgcmV0dXJuIHBhaXI7CisgICAgRm9ybWF0VmVjdG9yIHN1YmZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhzdWJmb3JtYXRzTGl0ZXJhbCwgIiAiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YmZvcm1hdCA6IHN1YmZvcm1hdHMpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBwYWlyLnNlY29uZC5pbnNlcnQoc3ViZm9ybWF0KTsKKyAgICAgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgc3ViZm9ybWF0ICV4IHRvIGNvbGxlY3Rpb24iLCBfX2Z1bmNfXywgc3ViZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBhaXI7CiB9CiAKLXN0YXR1c190IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCitzdGF0dXNfdCBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIHhtbERvY1B0ciBkb2M7Ci0gICAgZG9jID0geG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpOwotICAgIGlmIChkb2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGF1dG8gZG9jID0gbWFrZV94bWxVbmlxdWUoeG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpKTsKKyAgICBpZiAoZG9jID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB4bWxOb2RlUHRyIGN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7Ci0gICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOwotICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgeG1sTm9kZVB0ciByb290ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jLmdldCgpKTsKKyAgICBpZiAocm9vdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX2Z1bmNfXywgY29uZmlnRmlsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKLSAgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jLmdldCgpKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uICVzIGRvY3VtZW50LiIsIF9fZnVuY19fLCBjb25maWdGaWxlKTsKICAgICB9CiAKLSAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKSkgIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgIChjb25zdCBjaGFyICopY3VyLT5uYW1lKTsKLSAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgIGlmICh4bWxTdHJjbXAocm9vdC0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4ocm9vdE5hbWUpKSkgIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19mdW5jX18sIHJvb3ROYW1lLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJvb3QtPm5hbWUpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJpbmcgdmVyc2lvbiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIHZlcnNpb25BdHRyaWJ1dGUpOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgdmVyc2lvbkF0dHJpYnV0ZSk7CiAgICAgaWYgKHZlcnNpb24uZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19mdW5jX18sIHJvb3ROYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKHZlcnNpb24gIT0gbVZlcnNpb24pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3QgJXMgZ290ICVzIiwgX19GVU5DVElPTl9fLCBtVmVyc2lvbi5jX3N0cigpLAorICAgICAgICBBTE9HRSgiJXM6IFZlcnNpb24gZG9lcyBub3QgbWF0Y2g7IGV4cGVjdCAlcyBnb3QgJXMiLCBfX2Z1bmNfXywgbVZlcnNpb24uY19zdHIoKSwKICAgICAgICAgICAgICAgdmVyc2lvbi5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gTGV0cyBkZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIC8vIE1vZHVsZXMKICAgICBNb2R1bGVUcmFpdHM6OkNvbGxlY3Rpb24gbW9kdWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihkb2MsIGN1ciwgbW9kdWxlcywgJmNvbmZpZyk7Ci0gICAgY29uZmlnLnNldEh3TW9kdWxlcyhtb2R1bGVzKTsKLQotICAgIC8vIGRlc2VyaWFsaXplIHZvbHVtZSBzZWN0aW9uCi0gICAgVm9sdW1lVHJhaXRzOjpDb2xsZWN0aW9uIHZvbHVtZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZvbHVtZVRyYWl0cz4oZG9jLCBjdXIsIHZvbHVtZXMsICZjb25maWcpOwotICAgIGNvbmZpZy5zZXRWb2x1bWVzKHZvbHVtZXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNb2R1bGVUcmFpdHM+KHJvb3QsICZtb2R1bGVzLCBjb25maWcpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgY29uZmlnLT5zZXRId01vZHVsZXMobW9kdWxlcyk7CiAKICAgICAvLyBHbG9iYWwgQ29uZmlndXJhdGlvbgotICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY3VyLCBjb25maWcpOworICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKIAotICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICAvLyBTdXJyb3VuZCBjb25maWd1cmF0aW9uCisgICAgU3Vycm91bmRTb3VuZFRyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKKwogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIAorfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICByZXR1cm4gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShmaWxlTmFtZSwgY29uZmlnKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDY1MjYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE1fU2Vzc2lvblJvdXRlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiU2Vzc2lvblJvdXRlLmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIFNlc3Npb25Sb3V0ZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgotdm9pZCBTZXNzaW9uUm91dGU6OmxvZyhjb25zdCBjaGFyKiBwcmVmaXgpCi17Ci0gICAgQUxPR0koIiVzW1Nlc3Npb25Sb3V0ZSBzdHJtOjB4JVgsIHNyYzolZCwgc2VzczoweCVYLCBkZXY6MHglWCByZWZzOiVkIGFjdDolZCIsCi0gICAgICAgICAgcHJlZml4LCBtU3RyZWFtVHlwZSwgbVNvdXJjZSwgbVNlc3Npb24sCi0gICAgICAgICAgbURldmljZURlc2NyaXB0b3IgIT0gMCA/IG1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCkgOiBBVURJT19ERVZJQ0VfTk9ORSwKLSAgICAgICAgICBtUmVmQ291bnQsIG1BY3Rpdml0eUNvdW50KTsKLX0KLQotLy8gLS0tIFNlc3Npb25Sb3V0ZU1hcCBjbGFzcyBpbXBsZW1lbnRhdGlvbgotYm9vbCBTZXNzaW9uUm91dGVNYXA6Omhhc1JvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHJldHVybiBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgJiYgdmFsdWVGb3Ioc2Vzc2lvbiktPm1EZXZpY2VEZXNjcmlwdG9yICE9IDA7Ci19Ci0KLWJvb2wgU2Vzc2lvblJvdXRlTWFwOjpnZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBpZiAoaW5kZXhPZktleShzZXNzaW9uKSA+PSAwKSB7Ci0gICAgICAgIGlmICh2YWx1ZUZvcihzZXNzaW9uKS0+bUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHZhbHVlRm9yKHNlc3Npb24pLT5tQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6cmVtb3ZlUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLSAgICBpZiAocm91dGUgIT0gMCkgewotICAgICAgICBBTE9HX0FTU0VSVChyb3V0ZS0+bVJlZkNvdW50ID4gMCk7Ci0gICAgICAgIC0tcm91dGUtPm1SZWZDb3VudDsKLSAgICAgICAgaWYgKHJvdXRlLT5tUmVmQ291bnQgPD0gMCkgewotICAgICAgICAgICAgcmVtb3ZlSXRlbShzZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW50IFNlc3Npb25Sb3V0ZU1hcDo6aW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwotICAgIHJldHVybiByb3V0ZSAhPSAwID8gKysocm91dGUtPm1BY3Rpdml0eUNvdW50KSA6IC0xOwotfQotCi1pbnQgU2Vzc2lvblJvdXRlTWFwOjpkZWNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0gICAgaWYgKHJvdXRlICE9IDAgJiYgcm91dGUtPm1BY3Rpdml0eUNvdW50ID4gMCkgewotICAgICAgICByZXR1cm4gLS0ocm91dGUtPm1BY3Rpdml0eUNvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6bG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pCi17Ci0gICAgQUxPR0koIiVzIC0tLS0iLCBjYXB0aW9uKTsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaW5kZXgpLT5sb2coIiAgIik7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6YWRkUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi17Ci0gICAgaWYgKG1NYXBUeXBlID09IE1BUFRZUEVfSU5QVVQgJiYgc3RyZWFtVHlwZSAhPSBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BKSB7Ci0gICAgICAgIEFMT0dFKCJBZGRpbmcgT3V0cHV0IFJvdXRlIHRvIElucHV0Um91dGVNYXAiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobU1hcFR5cGUgPT0gTUFQVFlQRV9PVVRQVVQgJiYgc291cmNlICE9IFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEpIHsKLSAgICAgICAgQUxPR0UoIkFkZGluZyBJbnB1dCBSb3V0ZSB0byBPdXRwdXRSb3V0ZU1hcCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLQotICAgIGlmIChyb3V0ZSAhPSAwKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDAgfHwgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcm91dGUtPm1SZWZDb3VudCsrOwotICAgICAgICByb3V0ZS0+bURldmljZURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJvdXRlID0gbmV3IFNlc3Npb25Sb3V0ZShzZXNzaW9uLCBzdHJlYW1UeXBlLCBzb3VyY2UsIGRlc2NyaXB0b3IsIHVpZCk7Ci0gICAgICAgIHJvdXRlLT5tUmVmQ291bnQrKzsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhZGQoc2Vzc2lvbiwgcm91dGUpOwotICAgIH0KLX0KLQotYXVkaW9fZGV2aWNlc190IFNlc3Npb25Sb3V0ZU1hcDo6Z2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gdmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChzdHJlYW1UeXBlID09IHJvdXRlLT5tU3RyZWFtVHlwZSAmJiByb3V0ZS0+aXNBY3RpdmVPckNoYW5nZWQoKQotICAgICAgICAgICAgICAgICYmIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7Ci0gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjQ5ZmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0vLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2RlZmluZSBBTE9HVlYgQUxPR1YKLSNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaW5jbHVkZSAiU3RyZWFtRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkdhaW5zLmgiCi0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLSBTdHJlYW1EZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLVN0cmVhbURlc2NyaXB0b3I6OlN0cmVhbURlc2NyaXB0b3IoKQotICAgIDogICBtSW5kZXhNaW4oMCksIG1JbmRleE1heCgxKSwgbUNhbkJlTXV0ZWQodHJ1ZSkKLXsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBjdXJyZW50IHN0cmVhbSdzIGluZGV4IHRvIG1JbmRleE1heCBzbyB2b2x1bWUgaXNuJ3QgMCBpbgotICAgIC8vIGNhc2VzIHdoZXJlIHRoZSBKYXZhIGxheWVyIGRvZXNuJ3QgY2FsbCBpbnRvIHRoZSBhdWRpbyBwb2xpY3kgc2VydmljZSB0bwotICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2b2x1bWUuCi0gICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgbUluZGV4TWF4KTsKLX0KLQotaW50IFN0cmVhbURlc2NyaXB0b3I6OmdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci17Ci0gICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAvLyB0aGVyZSBpcyBhbHdheXMgYSB2YWxpZCBlbnRyeSBmb3IgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUKLSAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7Ci0gICAgfQotICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpCi17Ci0gICAgbUluZGV4Q3VyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLXsKLSAgICBtSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbikKLXsKLSAgICBtSW5kZXhNaW4gPSB2b2xJbmRleE1pbjsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpCi17Ci0gICAgbUluZGV4TWF4ID0gdm9sSW5kZXhNYXg7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpCi17Ci0gICAgbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XSA9IHBvaW50OwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCi0gICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKLSAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAotICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotCi1TdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6U3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKQotewotICAgIGZvciAoc2l6ZV90IHN0cmVhbSA9IDAgOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgewotICAgICAgICBhZGQoc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtKSwgU3RyZWFtRGVzY3JpcHRvcigpKTsKLSAgICB9Ci19Ci0KLWJvb2wgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5jYW5CZU11dGVkKCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlQ2F0ZWdvcnksIHBvaW50KTsKLX0KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmdldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5nZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWluKQotewotICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWluKHZvbEluZGV4TWluKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWF4KQotewotICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWF4KHZvbEluZGV4TWF4KTsKLX0KLQotZmxvYXQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdAotewotICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSB2YWx1ZUF0KHN0cmVhbSk7Ci0gICAgcmV0dXJuIEdhaW5zOjp2b2xJbmRleFRvRGIoc3RyZWFtRGVzYy5nZXRWb2x1bWVDdXJ2ZVBvaW50KGNhdGVnb3J5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjLmdldFZvbHVtZUluZGV4TWluKCksIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXhNYXgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluVWkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQotewotICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1pbiA+PSBpbmRleE1heCkgewotICAgICAgICBBTE9HVygiaW5pdFN0cmVhbVZvbHVtZSgpIGludmFsaWQgaW5kZXggbGltaXRzIGZvciBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwKLSAgICAgICAgICAgICAgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2V0Vm9sdW1lSW5kZXhNaW4oc3RyZWFtLCBpbmRleE1pbik7Ci0gICAgc2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtLCBpbmRleE1heCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZGV2aWNlX2NhdGVnb3J5PihqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tpXVtqXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVjayBhdmFpbGFiaWxpdHkgb2YgRFJDIG9uIHNwZWFrZXIgcGF0aDogaWYgYXZhaWxhYmxlLCBvdmVycmlkZSBzb21lIG9mIHRoZSBzcGVha2VyIGN1cnZlcwotICAgIGlmIChpc1NwZWFrZXJEcmNFbmFibGVkKSB7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX1NZU1RFTSwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9SSU5HLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FMQVJNLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9NVVNJQywgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmMpOwotICAgIH0KLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCkKLXsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KHN0cmVhbURzdCwgc3RhdGljX2Nhc3Q8ZGV2aWNlX2NhdGVnb3J5PihqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1ZvbHVtZVByb2ZpbGVzW3N0cmVhbVNyY11bal0pOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggNmY0OGVhZS4uN2M3NmQ4YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTQ1LDYgKzQ1LDcgQEAKIGNvbnN0IFJvdXRlRmxhZ1R5cGVDb252ZXJ0ZXI6OlRhYmxlIFJvdXRlRmxhZ1R5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShNSVhfUk9VVEVfRkxBR19SRU5ERVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKE1JWF9ST1VURV9GTEFHX0FMTCksCiAgICAgVEVSTUlOQVRPUgogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzZjFiYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVDdXJ2ZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIlZvbHVtZUN1cnZlLmgiCi0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWZsb2F0IFZvbHVtZUN1cnZlOjp2b2xJbmRleFRvRGIoaW50IGluZGV4SW5VaSwgaW50IHZvbEluZGV4TWluLCBpbnQgdm9sSW5kZXhNYXgpIGNvbnN0Ci17Ci0gICAgQUxPR19BU1NFUlQoIW1DdXJ2ZVBvaW50cy5pc0VtcHR5KCksICJJbnZhbGlkIHZvbHVtZSBjdXJ2ZSIpOwotCi0gICAgc2l6ZV90IG5iQ3VydmVQb2ludHMgPSBtQ3VydmVQb2ludHMuc2l6ZSgpOwotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0KLSAgICBpbnQgbmJTdGVwcyA9IDEgKyBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1JbmRleCAtIG1DdXJ2ZVBvaW50c1swXS5tSW5kZXg7Ci0gICAgaWYgKGluZGV4SW5VaSA8IHZvbEluZGV4TWluKSB7Ci0gICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWluIGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1pbik7Ci0gICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWluOwotICAgIH0gZWxzZSBpZiAoaW5kZXhJblVpID4gdm9sSW5kZXhNYXgpIHsKLSAgICAgICAgQUxPR1YoIlZPTFVNRSByZW1hcHBpbmcgaW5kZXggZnJvbSAlZCB0byBtYXggaW5kZXggJWQiLCBpbmRleEluVWksIHZvbEluZGV4TWF4KTsKLSAgICAgICAgaW5kZXhJblVpID0gdm9sSW5kZXhNYXg7Ci0gICAgfQotICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSB2b2xJbmRleE1pbikpIC8gKHZvbEluZGV4TWF4IC0gdm9sSW5kZXhNaW4pOwotCi0gICAgLy8gV2hlcmUgd291bGQgdGhpcyB2b2x1bWUgaW5kZXggYmVlbiBpbnNlcnRlZCBpbiB0aGUgY3VydmUgcG9pbnQKLSAgICBzaXplX3QgaW5kZXhJblVpUG9zaXRpb24gPSBtQ3VydmVQb2ludHMub3JkZXJPZihDdXJ2ZVBvaW50KHZvbElkeCwgMCkpOwotICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiA+PSBuYkN1cnZlUG9pbnRzKSB7Ci0gICAgICAgIC8vdXNlIGxhc3QgcG9pbnQgb2YgdGFibGUKLSAgICAgICAgcmV0dXJuIG1DdXJ2ZVBvaW50c1tuYkN1cnZlUG9pbnRzIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZjsKLSAgICB9Ci0gICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uID09IDApIHsKLSAgICAgICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uICE9IG1DdXJ2ZVBvaW50c1swXS5tSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBWT0xVTUVfTUlOX0RCOyAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DdXJ2ZVBvaW50c1swXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmOwotICAgIH0KLSAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKLSAgICBmbG9hdCBkZWNpYmVscyA9IChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSArCi0gICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgpKSAqCi0gICAgICAgICAgICAgICAgKCAoKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikgLQotICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpKSAvCi0gICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUluZGV4IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgpKSApOwotCi0gICAgQUxPR1YoIlZPTFVNRSBtRGV2aWNlQ2F0ZWdvcnkgJWQsIG1TdHJlYW1UeXBlICVkIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIiwKLSAgICAgICAgICAgIG1EZXZpY2VDYXRlZ29yeSwgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgsIHZvbElkeCwKLSAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUluZGV4LAotICAgICAgICAgICAgKChmbG9hdCltQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSwgZGVjaWJlbHMsCi0gICAgICAgICAgICAoKGZsb2F0KW1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikpOwotCi0gICAgcmV0dXJuIGRlY2liZWxzOwotfQotCi12b2lkIFZvbHVtZUN1cnZlOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgeyIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DdXJ2ZVBvaW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIoJTNkLCAlNWQpIiwKLSAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2ldLm1JbmRleCwgbUN1cnZlUG9pbnRzW2ldLm1BdHRlbnVhdGlvbkluTWIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUN1cnZlUG9pbnRzLnNpemUoKSAtIDEpID8gIiB9XG4iIDogIiwgIik7Ci0gICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotCi12b2lkIFZvbHVtZUN1cnZlc0ZvclN0cmVhbTo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMgPSAwLCBib29sIGN1cnZlUG9pbnRzKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgaWYgKCFjdXJ2ZVBvaW50cykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyAgICAgICAgICUwMmQgICAgICAgICAlMDJkICAgICAgICAgIiwKLSAgICAgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUluZGV4Q3VyLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwgbUluZGV4Q3VyLmtleUF0KGkpLCBtSW5kZXhDdXIudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdExpdGVyYWw7Ci0gICAgICAgIERldmljZUNhdGVnb3J5Q29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgZGV2aWNlQ2F0TGl0ZXJhbCk7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcyAlcyA6IiwKLSAgICAgICAgICAgICAgICAgc3BhY2VzLCAiIiwgZGV2aWNlQ2F0TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotc3RhdHVzX3QgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN0cmVhbXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgIiBTdHJlYW0gIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyenUgICAgICAiLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQpOwotICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblZvbHVtZSBDdXJ2ZXMgZm9yIFVzZSBDYXNlcyAoYWthIFN0cmVhbSB0eXBlcykgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsOwotICAgICAgICBTdHJlYW1UeXBlQ29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgc3RyZWFtVHlwZUxpdGVyYWwpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgICAgICIgJXMgKCUwMnp1KTogQ3VydmUgcG9pbnRzIGZvciBkZXZpY2UgY2F0ZWdvcnkgKGluZGV4LCBhdHRlbnVhdGlvbiBpbiBtaWxsaWJlbClcbiIsCi0gICAgICAgICAgICAgICAgIHN0cmVhbVR5cGVMaXRlcmFsLmNfc3RyKCksIGkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSkuZHVtcChmZCwgMiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCAzNzlmN2U1Li5iMjgzODFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTE4NSwxNCArMTg1LDI3IEBACiAgICAgICAgIDwhLS0gQmx1ZXRvb3RoIEF1ZGlvIEhBTCAtLT4KICAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgogCisgICAgICAgIDwhLS0gTVNEIEF1ZGlvIEhBTCAob3B0aW9uYWwpIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJtc2RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKICAgICA8L21vZHVsZXM+CiAgICAgPCEtLSBFbmQgb2YgTW9kdWxlcyBzZWN0aW9uIC0tPgogCi0gICAgPCEtLSBWb2x1bWUgc2VjdGlvbiAtLT4KKyAgICA8IS0tIFZvbHVtZSBzZWN0aW9uOgorICAgICAgICBJTVBPUlRBTlQgTk9URTogVm9sdW1lIHRhYmxlcyBoYXZlIGJlZW4gbW92ZWQgdG8gZW5naW5lIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBLZWVwIGl0IGhlcmUgZm9yIGxlZ2FjeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVuZ2luZSB3aWxsIGZhbGxiYWNrIG9uIHRoZXNlIGZpbGVzIGlmIG5vbmUgYXJlIHByb3ZpZGVkIGJ5IGVuZ2luZS4KKyAgICAgLS0+CiAKICAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfdm9sdW1lcy54bWwiLz4KICAgICA8eGk6aW5jbHVkZSBocmVmPSJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIi8+CiAKICAgICA8IS0tIEVuZCBvZiBWb2x1bWUgc2VjdGlvbiAtLT4KIAorICAgIDwhLS0gU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9InN1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbCIvPgorCisgICAgPCEtLSBFbmQgb2YgU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKwogPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbAppbmRleCBhNzVmMWNiLi5iNGNjMWQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9ibHVldG9vdGhfbGVnYWN5X2hhbC54bWwKQEAgLTE4NSwxNCArMTg1LDI3IEBACiAgICAgICAgIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIC0tPgogICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJoZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAorICAgICAgICA8IS0tIE1TRCBBdWRpbyBIQUwgKG9wdGlvbmFsKSAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ibXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCiAgICAgPC9tb2R1bGVzPgogICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KIAotICAgIDwhLS0gVm9sdW1lIHNlY3Rpb24gLS0+CisgICAgPCEtLSBWb2x1bWUgc2VjdGlvbjoKKyAgICAgICAgSU1QT1JUQU5UIE5PVEU6IFZvbHVtZSB0YWJsZXMgaGF2ZSBiZWVuIG1vdmVkIHRvIGVuZ2luZSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCBpdCBoZXJlIGZvciBsZWdhY3kuCisgICAgICAgICAgICAgICAgICAgICAgICBFbmdpbmUgd2lsbCBmYWxsYmFjayBvbiB0aGVzZSBmaWxlcyBpZiBub25lIGFyZSBwcm92aWRlZCBieSBlbmdpbmUuCisgICAgIC0tPgogCiAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0iZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCIvPgogCiAgICAgPCEtLSBFbmQgb2YgVm9sdW1lIHNlY3Rpb24gLS0+CiAKKyAgICA8IS0tIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMueG1sCmluZGV4IDU4NzY4YzMuLjlhZDYwOWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYy54bWwKQEAgLTMwLDExICszMCwyMSBAQAogICAgIDwvbW9kdWxlcz4KICAgICA8IS0tIEVuZCBvZiBNb2R1bGVzIHNlY3Rpb24gLS0+CiAKLSAgICA8IS0tIFZvbHVtZSBzZWN0aW9uIC0tPgorICAgIDwhLS0gVm9sdW1lIHNlY3Rpb246CisgICAgICAgIElNUE9SVEFOVCBOT1RFOiBWb2x1bWUgdGFibGVzIGhhdmUgYmVlbiBtb3ZlZCB0byBlbmdpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgaXQgaGVyZSBmb3IgbGVnYWN5LgorICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIHdpbGwgZmFsbGJhY2sgb24gdGhlc2UgZmlsZXMgaWYgbm9uZSBhcmUgcHJvdmlkZWQgYnkgZW5naW5lLgorICAgICAtLT4KIAogICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgogICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KIAogICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgogCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCiA8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljX3R2LnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljX3R2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjFjYTMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWNfdHYueG1sCkBAIC0wLDAgKzEsNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8IS0tIHZlcnNpb24gc2VjdGlvbiBjb250YWlucyBhIOKAnHZlcnNpb27igJ0gdGFnIGluIHRoZSBmb3JtIOKAnG1ham9yLm1pbm9y4oCdIGUuZyB2ZXJzaW9uPeKAnTEuMOKAnSAtLT4KKworICAgIDwhLS0gR2xvYmFsIGNvbmZpZ3VyYXRpb24gRGVjYWxhcmF0aW9uIC0tPgorICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9ImZhbHNlIi8+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90di54bWwiLz4KKworICAgICAgICA8IS0tIFVzYiBBdWRpbyBIQUwgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InVzYl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKworICAgICAgICA8IS0tIFJlbW90ZSBTdWJtaXggQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJyX3N1Ym1peF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKworICAgIDwvbW9kdWxlcz4KKyAgICA8IS0tIEVuZCBvZiBNb2R1bGVzIHNlY3Rpb24gLS0+CisKKyAgICA8IS0tIFZvbHVtZSBzZWN0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCIvPgorCisgICAgPCEtLSBFbmQgb2YgVm9sdW1lIHNlY3Rpb24gLS0+CisKKyAgICA8IS0tIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKzwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3N0dWIueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3N0dWIueG1sCmluZGV4IDI2YzM4MWYuLjgzNTBlYjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9zdHViLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fc3R1Yi54bWwKQEAgLTE1LDYgKzE1LDkgQEAKIC0tPgogCiA8YXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICAgIDwhLS0gR2xvYmFsIGNvbmZpZ3VyYXRpb24gRGVjYWxhcmF0aW9uIC0tPgorICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9ImZhbHNlIi8+CisKICAgICA8bW9kdWxlcz4KICAgICAgICAgPCEtLSBTdHViIEF1ZGlvIEhBTCAtLT4KICAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3R1Yl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KQEAgLTI2LDUgKzI5LDYgQEAKIAogICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgogICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KIAogPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9tc2RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTdiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTctMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIE11bHRpIFN0cmVhbSBEZWNvZGVyIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9Im1zZCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8YXR0YWNoZWREZXZpY2VzPgorICAgICAgICA8aXRlbT5NUzEyIElucHV0PC9pdGVtPgorICAgICAgICA8aXRlbT5NUzEyIE91dHB1dDwvaXRlbT4KKyAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgaW5wdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGNvbXByZXNzZWQgaW5wdXQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUfEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUR8QVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEiLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzX0pPQyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDwhLS0gVGhlIEhXIEFWIFN5bmMgZmxhZyBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpcyByZWNvbW1lbmRlZCAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBvdXRwdXQiIHJvbGU9InNpbmsiIGZsYWdzPSJBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgIDwvbWl4UG9ydHM+CisgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBJbnB1dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CVVMiICByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEiLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzX0pPQyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJNUzEyIE91dHB1dCIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JVUyIgIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iTVMxMiBJbnB1dCIgc291cmNlcz0ibXMxMiBpbnB1dCxtczEyIGNvbXByZXNzZWQgaW5wdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0ibXMxMiBvdXRwdXQiIHNvdXJjZXM9Ik1TMTIgT3V0cHV0Ii8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCA1YjdhZTdmLi5lZWRjOTZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0xLDUgKzEsNSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRGVmYXVsdCBQcmltYXJ5IEF1ZGlvIEhBTCBNb2R1bGUgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gaW5jbHVkZSBmbGllIC0tPgorPCEtLSBEZWZhdWx0IFByaW1hcnkgQXVkaW8gSEFMIE1vZHVsZSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBpbmNsdWRlIGZpbGUgLS0+CiA8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CiAgICAgPGF0dGFjaGVkRGV2aWNlcz4KICAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3R2LnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3R2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjYwMTVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fdHYueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIERlZmF1bHQgUHJpbWFyeSBBdWRpbyBIQUwgTW9kdWxlIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGluY2x1ZGUgZmlsZSBmb3IgVFYgLS0+Cis8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KKyAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICA8ZGVmYXVsdE91dHB1dERldmljZT5TcGVha2VyPC9kZWZhdWx0T3V0cHV0RGV2aWNlPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0icHJpbWFyeSBvdXRwdXQiIHJvbGU9InNvdXJjZSIgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iZGlyZWN0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QiIC8+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9InR1bm5lbCIgcm9sZT0ic291cmNlIgorICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUfEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMiIC8+CisgICA8L21peFBvcnRzPgorICAgPGRldmljZVBvcnRzPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIHJvbGU9InNpbmsiIC8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik91dCBBdXggRGlnaXRhbCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCIgcm9sZT0ic2luayIKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHM9IkFVRElPX0ZPUk1BVF9BQzMgQVVESU9fRk9STUFUX0lFQzYxOTM3IiAvPgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iU3BlYWtlciIgc291cmNlcz0icHJpbWFyeSBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iT3V0IEF1eCBEaWdpdGFsIiBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCxkaXJlY3QsdHVubmVsIi8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9zdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MGExODEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxzdXJyb3VuZFNvdW5kPgorICA8IS0tIEVhY2ggb2YgdGhlIGxpc3RlZCBmb3JtYXRzIGdldHMgYW4gZW50cnkgaW4gU3Vycm91bmQgU2V0dGluZ3MgZGlhbG9nIG9uIFRWIGRldmljZXMuCisgICAgICAgVGhlcmUgbXVzdCBiZSBhIGNvcnJlc3BvbmRpbmcgSmF2YSBFTkNPRElOR18uLi4gY29udGFudCBkZWZpbmVkIGluIEF1ZGlvRm9ybWF0LmphdmEsCisgICAgICAgYW5kIGEgZGlzcGxheSBuYW1lIGRlZmluZWQgaW4gQXVkaW9Gb3JtYXQudG9EaXNwbGF5TmFtZS4gRm9yIHRoZSBmb3JtYXRzIHRoYXQgZG9uJ3QKKyAgICAgICBuZWVkIGEgZGVkaWNhdGVkIFN1cnJvbmQgU2V0dGluZ3MgZGlhbG9nIGVudHJ5LCBhIHN1YmZvcm1hdHMgbGlzdCBoYXMgdG8gYmUgdXNlZC4gLS0+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FDMyIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9FX0FDMyIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRE9MQllfVFJVRUhEIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0RUUyIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9EVFNfSEQiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfQUFDX0xDIiBzdWJmb3JtYXRzPSJBVURJT19GT1JNQVRfQUFDX0hFX1YxIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIgQVVESU9fRk9STUFUX0FBQ19FTEQgQVVESU9fRk9STUFUX0FBQ19YSEUiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfQUM0IiAvPgorICA8L2Zvcm1hdHM+Cis8L3N1cnJvdW5kU291bmQ+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9BbmRyb2lkLm1rCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tawpyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc3NWFkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbiIsCisgICAgc3JjczogWworICAgICAgICAic3JjL0VuZ2luZUJhc2UuY3BwIiwKKyAgICAgICAgInNyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwIiwKKyAgICAgICAgInNyYy9Wb2x1bWVDdXJ2ZS5jcHAiLAorICAgICAgICAic3JjL1ZvbHVtZUdyb3VwLmNwcCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbl9oZWFkZXJzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfY29uZmlnIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkYzc4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPEVuZ2luZUNvbmZpZy5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPFByb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPFZvbHVtZUdyb3VwLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCitjbGFzcyBFbmdpbmVCYXNlIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQoreworcHVibGljOgorICAgIC8vLworICAgIC8vLyBmcm9tIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQorICAgIC8vLworICAgIGFuZHJvaWQ6OnN0YXR1c190IGluaXRDaGVjaygpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1QaG9uZVN0YXRlOyB9CisKKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdCBvdmVycmlkZQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Gb3JjZVVzZVt1c2FnZV07CisgICAgfQorICAgIGFuZHJvaWQ6OnN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAvKmRldkRlc2MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IC8qc3RhdGUqLykgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCBvdmVycmlkZTsKKworICAgIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdCBvdmVycmlkZTsKKworICAgIEF0dHJpYnV0ZXNWZWN0b3IgZ2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0IG92ZXJyaWRlOworCisgICAgU3RyYXRlZ3lWZWN0b3IgZ2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIFZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBJVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JWb2x1bWVHcm91cCh2b2x1bWVfZ3JvdXBfdCBncm91cCkgY29uc3Qgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgcmV0dXJuIG1Wb2x1bWVHcm91cHMuZmluZChncm91cCkgIT0gZW5kKG1Wb2x1bWVHcm91cHMpID8KKyAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBzLmF0KGdyb3VwKS0+Z2V0Vm9sdW1lQ3VydmVzKCkgOiBudWxscHRyOworICAgIH0KKworICAgIFZvbHVtZUdyb3VwVmVjdG9yIGdldFZvbHVtZUdyb3VwcygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKKworCisgICAgZW5naW5lQ29uZmlnOjpQYXJzaW5nUmVzdWx0IGxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOworCisgICAgY29uc3QgUHJvZHVjdFN0cmF0ZWd5TWFwICZnZXRQcm9kdWN0U3RyYXRlZ2llcygpIGNvbnN0IHsgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llczsgfQorCisgICAgUHJvZHVjdFN0cmF0ZWd5TWFwICZnZXRQcm9kdWN0U3RyYXRlZ2llcygpIHsgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llczsgfQorCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CisKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdDsKKworICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpnZXRBcG1PYnNlcnZlcigpIGNvbnN0IHsgcmV0dXJuIG1BcG1PYnNlcnZlcjsgfQorCisgICAgaW5saW5lIGJvb2wgaXNJbkNhbGwoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX3N0YXRlX2luX2NhbGwoZ2V0UGhvbmVTdGF0ZSgpKTsKKyAgICB9CisKKyAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Vm9sdW1lU291cmNlPihnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KTsKKworICAgIHN0YXR1c190IHJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyBwcml2YXRlOgorICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXIgPSBudWxscHRyOworCisgICAgUHJvZHVjdFN0cmF0ZWd5TWFwIG1Qcm9kdWN0U3RyYXRlZ2llczsKKyAgICBWb2x1bWVHcm91cE1hcCBtVm9sdW1lR3JvdXBzOworICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZSA9IEFVRElPX01PREVfTk9STUFMOyAgLyoqPCBjdXJyZW50IHBob25lIHN0YXRlLiAqLworCisgICAgLyoqIGN1cnJlbnQgZm9yY2VkIHVzZSBjb25maWd1cmF0aW9uLiAqLworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXSA9IHt9OworfTsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvUHJvZHVjdFN0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvUHJvZHVjdFN0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyYTE5OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Qcm9kdWN0U3RyYXRlZ3kuaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiVm9sdW1lR3JvdXAuaCIKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxIYW5kbGVHZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBAYnJpZWYgVGhlIFByb2R1Y3RTdHJhdGVneSBjbGFzcyBkZXNjcmliZXMgZm9yIGVhY2ggcHJvZHVjdF9zdHJhdGVneV90IGlkZW50aWZpZXIgdGhlCisgKiBhc3NvY2lhdGVkIGF1ZGlvIGF0dHJpYnV0ZXMsIHRoZSBkZXZpY2UgdHlwZXMgdG8gdXNlLCB0aGUgZGV2aWNlIGFkZHJlc3MgdG8gdXNlLgorICogVGhlIGlkZW50aWZpZXIgaXMgdm9sdW50YXJpbHkgbm90IHN0cm9uZ2x5IHR5cGVkIGluIG9yZGVyIHRvIGJlIGV4dGVuc2libGUgYnkgT0VNLgorICovCitjbGFzcyBQcm9kdWN0U3RyYXRlZ3kgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjx1aW50MzJfdD4KK3sKK3ByaXZhdGU6CisgICAgc3RydWN0IEF1ZGlvQXR0cmlidXRlcyB7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgICAgICB2b2x1bWVfZ3JvdXBfdCBtVm9sdW1lR3JvdXAgPSBWT0xVTUVfR1JPVVBfTk9ORTsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICB9OworCisgICAgdXNpbmcgQXVkaW9BdHRyaWJ1dGVzVmVjdG9yID0gc3RkOjp2ZWN0b3I8QXVkaW9BdHRyaWJ1dGVzPjsKKworcHVibGljOgorICAgIFByb2R1Y3RTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisKKyAgICB2b2lkIGFkZEF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhdWRpb0F0dHJpYnV0ZXMpOworCisgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6QXVkaW9BdHRyaWJ1dGVzPiBsaXN0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3Q7CisKKyAgICBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0OworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorICAgIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3VwcG9ydGVkU3RyZWFtcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIG1hdGNoZXMgY2hlY2tzIGlmIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzIHNoYWxsIGZvbGxvdyB0aGUgc3RyYXRlZ3kuCisgICAgICogICAgICAgIE9yZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpdGhpbiBhIHN0cmF0ZWd5IG1hdHRlcnMuCisgICAgICogICAgICAgIElmIG9ubHkgdGhlIHVzYWdlIGlzIGF2YWlsYWJsZSwgdGhlIGNoZWNrIGlzIHBlcmZvcm1lZCBvbiB0aGUgdXNhZ2VzIG9mIHRoZSBnaXZlbgorICAgICAqICAgICAgICBhdHRyaWJ1dGVzLCBvdGhlcndpc2UgYWxsIGZpZWxkcyBtdXN0IG1hdGNoLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRvIGNvbnNpZGVyCisgICAgICogQHJldHVybiB0cnVlIGlmIGF0dHJpYnV0ZXMgbWF0Y2hlcyB3aXRoIHRoZSBzdHJhdGVneSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcykgY29uc3Q7CisKKyAgICBib29sIHN1cHBvcnRTdHJlYW1UeXBlKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbVR5cGUpIGNvbnN0OworCisgICAgdm9pZCBzZXREZXZpY2VBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKQorICAgIHsKKyAgICAgICAgbURldmljZUFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGdldERldmljZUFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlQWRkcmVzczsgfQorCisgICAgdm9pZCBzZXREZXZpY2VUeXBlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKKyAgICB7CisgICAgICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZVR5cGVzKCkgY29uc3QgeyByZXR1cm4gbUFwcGxpY2FibGVEZXZpY2VzOyB9CisKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworICAgIHZvbHVtZV9ncm91cF90IGdldERlZmF1bHRWb2x1bWVHcm91cCgpIGNvbnN0OworCisgICAgYm9vbCBpc0RlZmF1bHQoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKworICAgIEF1ZGlvQXR0cmlidXRlc1ZlY3RvciBtQXR0cmlidXRlc1ZlY3RvcjsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBtSWQ7CisKKyAgICBzdGQ6OnN0cmluZyBtRGV2aWNlQWRkcmVzczsgLyoqPCBEZXZpY2UgYWRkcmVzcyBhcHBsaWNhYmxlIGZvciB0aGlzIHN0cmF0ZWd5LCBtYXliZSBlbXB0eSAqLworCisgICAgLyoqCisgICAgICogQXBwbGljYWJsZSBkZXZpY2UocykgdHlwZSBtYXNrIGZvciB0aGlzIHN0cmF0ZWd5LgorICAgICAqLworICAgIGF1ZGlvX2RldmljZXNfdCBtQXBwbGljYWJsZURldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKK307CisKK2NsYXNzIFByb2R1Y3RTdHJhdGVneU1hcCA6IHB1YmxpYyBzdGQ6Om1hcDxwcm9kdWN0X3N0cmF0ZWd5X3QsIHNwPFByb2R1Y3RTdHJhdGVneT4gPgoreworcHVibGljOgorICAgIC8qKgorICAgICAqIEBicmllZiBpbml0aWFsaXplOiBzZXQgZGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGluIGNhY2hlLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZSgpOworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGUuIFRoZSBvcmRlciBvZiB0aGUgdmVjdG9yIGlzIGRpbWVuc2lvbm5pbmcuCisgICAgICogQHBhcmFtIGF0dHIKKyAgICAgKiBAcmV0dXJuIGFwcGxpY2FibGUgcHJvZHVjdCBzdHJhdGVneSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSwgZGVmYXVsdCBpZiBub25lIGFwcGxpY2FibGUuCisgICAgICovCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5IGNhbiBiZSBjYWxsZWQgZnJvbQorICAgICAqICAgICAgICBBdWRpb01hbmFnZXI6IGluIHRoaXMgY2FzZSwgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgSVMgdGhlIGZvcm1lciByb3V0aW5nIHN0cmF0ZWd5CisgICAgICogICAgICAgIENhckF1ZGlvTWFuYWdlcjogaW4gdGhpcyBjYXNlLCB0aGUgcHJvZHVjdCBzdHJhdGVneSBJUyB0aGUgY2FyIHVzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgW2dldEF1ZGlvQXR0cmlidXRlc0ZvckNhclVzYWdlXQorICAgICAqICAgICAgICBPZW1FeHRlbnNpb246IGluIHRoaXMgY2FzZSwgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgSVMgdGhlIE9lbSB1c2FnZQorICAgICAqCisgICAgICogQHBhcmFtIHN0cmF0ZWd5CisgICAgICogQHJldHVybiBhdWRpbyBhdHRyaWJ1dGVzIChvciBhdCBsZWFzdCBvbmUgb2YgdGhlIGF0dHJpYnV0ZXMpIGZvbGxvd2luZyB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICovCisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCisgICAgc3RkOjpzdHJpbmcgZ2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Q7CisKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCkgY29uc3Q7CisKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0RGVmYXVsdCgpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworCitwcml2YXRlOgorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBtRGVmYXVsdFN0cmF0ZWd5ID0gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUN1cnZlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvVm9sdW1lQ3VydmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDMxNGUzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUN1cnZlLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIklWb2x1bWVDdXJ2ZXMuaCIKKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8SGFuZGxlR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQ3VydmVQb2ludAoreworICAgIEN1cnZlUG9pbnQoKSB7fQorICAgIEN1cnZlUG9pbnQoaW50IGluZGV4LCBpbnQgYXR0ZW51YXRpb25Jbk1iKSA6CisgICAgICAgIG1JbmRleChpbmRleCksIG1BdHRlbnVhdGlvbkluTWIoYXR0ZW51YXRpb25Jbk1iKSB7fQorICAgIHVpbnQzMl90IG1JbmRleDsKKyAgICBpbnQgbUF0dGVudWF0aW9uSW5NYjsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPCAoY29uc3QgQ3VydmVQb2ludCAmbGhzLCBjb25zdCBDdXJ2ZVBvaW50ICZyaHMpCit7CisgICAgcmV0dXJuIGxocy5tSW5kZXggPCByaHMubUluZGV4OworfQorCisvLyBBIHZvbHVtZSBjdXJ2ZSBmb3IgYSBnaXZlbiB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5CisvLyBJdCBjb250YWlucyBvZiBsaXN0IG9mIHBvaW50cyBvZiB0aGlzIGN1cnZlIGV4cHJlc3NpbmcgdGhlIGF0dGVudWF0aW9uIGluIE1pbGxpYmVscyBmb3IKKy8vIGEgZ2l2ZW4gdm9sdW1lIGluZGV4IGZyb20gMCB0byAxMDAKK2NsYXNzIFZvbHVtZUN1cnZlIDogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICBWb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlKSA6IG1EZXZpY2VDYXRlZ29yeShkZXZpY2UpIHt9CisKKyAgICB2b2lkIGFkZChjb25zdCBDdXJ2ZVBvaW50ICZwb2ludCkgeyBtQ3VydmVQb2ludHMuYWRkKHBvaW50KTsgfQorCisgICAgZmxvYXQgdm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0OworCisgICAgZGV2aWNlX2NhdGVnb3J5IGdldERldmljZUNhdGVnb3J5KCkgY29uc3QgeyByZXR1cm4gbURldmljZUNhdGVnb3J5OyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgZGV2aWNlX2NhdGVnb3J5IG1EZXZpY2VDYXRlZ29yeTsKKyAgICBTb3J0ZWRWZWN0b3I8Q3VydmVQb2ludD4gbUN1cnZlUG9pbnRzOworfTsKKworLy8gVm9sdW1lIEN1cnZlcyBmb3IgYSBnaXZlbiB1c2UgY2FzZSBpbmRleGVkIGJ5IGRldmljZSBjYXRlZ29yeQorY2xhc3MgVm9sdW1lQ3VydmVzIDogcHVibGljIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4sCisgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVZvbHVtZUN1cnZlcworeworcHVibGljOgorICAgIFZvbHVtZUN1cnZlcyhpbnQgaW5kZXhNaW4gPSAwLCBpbnQgaW5kZXhNYXggPSAxMDApIDoKKyAgICAgICAgbUluZGV4TWluKGluZGV4TWluKSwgbUluZGV4TWF4KGluZGV4TWF4KQorICAgIHsKKyAgICAgICAgYWRkQ3VycmVudFZvbHVtZUluZGV4KEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCAwKTsKKyAgICB9CisgICAgc3RhdHVzX3QgaW5pdFZvbHVtZShpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIG1JbmRleE1pbiA9IGluZGV4TWluOworICAgICAgICBtSW5kZXhNYXggPSBpbmRleE1heDsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHNwPFZvbHVtZUN1cnZlPiBnZXRDdXJ2ZXNGb3IoZGV2aWNlX2NhdGVnb3J5IGRldmljZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpbmRleE9mS2V5KGRldmljZSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWVGb3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorICAgIHsKKyAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKKyAgICAgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FCisgICAgICAgIGlmIChtSW5kZXhDdXIuZmluZChkZXZpY2UpID09IGVuZChtSW5kZXhDdXIpKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmF0KGRldmljZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGNhbkJlTXV0ZWQoKSBjb25zdCB7IHJldHVybiBtQ2FuQmVNdXRlZDsgfQorICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpIHsgbUluZGV4Q3VyLmNsZWFyKCk7IH0KKyAgICB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpIG92ZXJyaWRlCisgICAgeworICAgICAgICBtSW5kZXhDdXJbZGV2aWNlXSA9IGluZGV4OworICAgIH0KKworICAgIGludCBnZXRWb2x1bWVJbmRleE1pbigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1pbjsgfQorCisgICAgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWF4OyB9CisKKyAgICBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0CisgICAgeworICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmZpbmQoZGV2aWNlKSAhPSBlbmQobUluZGV4Q3VyKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzd2l0Y2hDdXJ2ZXNGcm9tKGNvbnN0IFZvbHVtZUN1cnZlcyAmcmVmZXJlbmNlQ3VydmVzKQorICAgIHsKKyAgICAgICAgaWYgKHNpemUoKSAhPSByZWZlcmVuY2VDdXJ2ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMhIGRldmljZSBjYXRlZ29yeSBub3QgYWxpZ25lZCwgY2Fubm90IHN3aXRjaCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgeworICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGNhdCA9IGtleUF0KGluZGV4KTsKKyAgICAgICAgICAgIHNldFZvbHVtZUN1cnZlKGNhdCwgcmVmZXJlbmNlQ3VydmVzLmdldE9yaWdpblZvbHVtZUN1cnZlKGNhdCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzd2l0Y2hDdXJ2ZXNGcm9tKCp0aGlzKTsKKyAgICB9CisKKyAgICBjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gZ2V0T3JpZ2luVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAorICAgIHsKKyAgICAgICAgQUxPR19BU1NFUlQobU9yaWdpblZvbHVtZUN1cnZlcy5pbmRleE9mS2V5KGRldmljZUNhdGVnb3J5KSA+PSAwLCAiSW52YWxpZCBkZXZpY2UgY2F0ZWdvcnkiKTsKKyAgICAgICAgcmV0dXJuIG1PcmlnaW5Wb2x1bWVDdXJ2ZXMudmFsdWVGb3IoZGV2aWNlQ2F0ZWdvcnkpOworICAgIH0KKyAgICB2b2lkIHNldFZvbHVtZUN1cnZlKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZ2b2x1bWVDdXJ2ZSkKKyAgICB7CisgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpID49IDAsICJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSBmb3IgVm9sdW1lIEN1cnZlIik7CisgICAgICAgIHJlcGxhY2VWYWx1ZUZvcihkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOworICAgIH0KKworICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmdm9sdW1lQ3VydmUpCisgICAgeworICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkgPSB2b2x1bWVDdXJ2ZS0+Z2V0RGV2aWNlQ2F0ZWdvcnkoKTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIG9yaWdpbmFsIFZvbHVtZSBDdXJ2ZXMgcGVyIGRldmljZSBjYXRlZ29yeSBpbiBvcmRlciB0byBzd2l0Y2ggY3VydmVzLgorICAgICAgICAgICAgbU9yaWdpblZvbHVtZUN1cnZlcy5hZGQoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKKyAgICAgICAgICAgIHJldHVybiBLZXllZFZlY3Rvcjo6YWRkKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXQsIGludCBpbmRleEluVWkpIGNvbnN0CisgICAgeworICAgICAgICBzcDxWb2x1bWVDdXJ2ZT4gdmMgPSBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KTsKKyAgICAgICAgaWYgKHZjICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB2Yy0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5ICVkIGZvciBWb2x1bWUgQ3VydmUiLCBkZXZpY2VDYXQpOworICAgICAgICAgICAgcmV0dXJuIDAuMGY7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBhZGRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKKyAgICB7CisgICAgICAgIG1BdHRyaWJ1dGVzLnB1c2hfYmFjayhhdHRyKTsKKyAgICB9CisgICAgQXR0cmlidXRlc1ZlY3RvciBnZXRBdHRyaWJ1dGVzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUF0dHJpYnV0ZXM7IH0KKyAgICB2b2lkIGFkZFN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgeworICAgICAgICBtU3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtKTsKKyAgICB9CisgICAgU3RyZWFtVHlwZVZlY3RvciBnZXRTdHJlYW1UeXBlcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1TdHJlYW1zOyB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBLZXllZFZlY3RvcjxkZXZpY2VfY2F0ZWdvcnksIHNwPFZvbHVtZUN1cnZlPiA+IG1PcmlnaW5Wb2x1bWVDdXJ2ZXM7CisgICAgc3RkOjptYXA8YXVkaW9fZGV2aWNlc190LCBpbnQ+IG1JbmRleEN1cjsgLyoqPCBjdXJyZW50IHZvbHVtZSBpbmRleCBwZXIgZGV2aWNlLiAqLworICAgIGludCBtSW5kZXhNaW47IC8qKjwgbWluIHZvbHVtZSBpbmRleC4gKi8KKyAgICBpbnQgbUluZGV4TWF4OyAvKio8IG1heCB2b2x1bWUgaW5kZXguICovCisgICAgY29uc3QgYm9vbCBtQ2FuQmVNdXRlZCA9IHRydWU7IC8qKjwgdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZC4gKi8KKworICAgIEF0dHJpYnV0ZXNWZWN0b3IgbUF0dHJpYnV0ZXM7CisgICAgU3RyZWFtVHlwZVZlY3RvciBtU3RyZWFtczsgLyoqPCBLZWVwIGl0IGZvciBsZWdhY3kuICovCit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvVm9sdW1lR3JvdXAuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVHcm91cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNGI0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvVm9sdW1lR3JvdXAuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxWb2x1bWVDdXJ2ZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxIYW5kbGVHZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBWb2x1bWVHcm91cCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHByaXZhdGUgSGFuZGxlR2VuZXJhdG9yPHVpbnQzMl90PgoreworcHVibGljOgorICAgIFZvbHVtZUdyb3VwKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7CisgICAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKworICAgIHZvaWQgYWRkKGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmY3VydmUpOworCisgICAgVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXMoKSB7IHJldHVybiAmbUdyb3VwVm9sdW1lQ3VydmVzOyB9CisKKyAgICB2b2lkIGFkZFN1cHBvcnRlZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldFN1cHBvcnRlZEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtR3JvdXBWb2x1bWVDdXJ2ZXMuZ2V0QXR0cmlidXRlcygpOyB9CisKKyAgICB2b2lkIGFkZFN1cHBvcnRlZFN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgU3RyZWFtVHlwZVZlY3RvciBnZXRTdHJlYW1UeXBlcygpIGNvbnN0IHsgcmV0dXJuIG1Hcm91cFZvbHVtZUN1cnZlcy5nZXRTdHJlYW1UeXBlcygpOyB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7CisgICAgY29uc3Qgdm9sdW1lX2dyb3VwX3QgbUlkOworICAgIFZvbHVtZUN1cnZlcyBtR3JvdXBWb2x1bWVDdXJ2ZXM7Cit9OworCitjbGFzcyBWb2x1bWVHcm91cE1hcCA6IHB1YmxpYyBzdGQ6Om1hcDx2b2x1bWVfZ3JvdXBfdCwgc3A8Vm9sdW1lR3JvdXA+ID4KK3sKK3B1YmxpYzoKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTdlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcApAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9CYXNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRW5naW5lQmFzZS5oIgorI2luY2x1ZGUgIkVuZ2luZURlZmF1bHRDb25maWcuaCIKKyNpbmNsdWRlIDxUeXBlQ29udmVydGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCit2b2lkIEVuZ2luZUJhc2U6OnNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKK3sKKyAgICBBTE9HX0FTU0VSVChvYnNlcnZlciAhPSBOVUxMLCAiSW52YWxpZCBBdWRpbyBQb2xpY3kgTWFuYWdlciBvYnNlcnZlciIpOworICAgIG1BcG1PYnNlcnZlciA9IG9ic2VydmVyOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjppbml0Q2hlY2soKQoreworICAgIHJldHVybiAobUFwbU9ic2VydmVyICE9IG51bGxwdHIpPyBOT19FUlJPUiA6IE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQoreworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgc3RhdGUgJWQiLCBzdGF0ZSk7CisKKyAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID49IEFVRElPX01PREVfQ05UKSB7CisgICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgaW52YWxpZCBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUgPT0gbVBob25lU3RhdGUgKSB7CisgICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgc2V0dGluZyBzYW1lIHN0YXRlICVkIiwgc3RhdGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIHN0b3JlIHByZXZpb3VzIHBob25lIHN0YXRlIGZvciBtYW5hZ2VtZW50IG9mIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBiZWxvdworICAgIGludCBvbGRTdGF0ZSA9IG1QaG9uZVN0YXRlOworICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7CisKKyAgICBpZiAoIWlzX3N0YXRlX2luX2NhbGwob2xkU3RhdGUpICYmIGlzX3N0YXRlX2luX2NhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIEVudGVyaW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7CisgICAgICAgIHN3aXRjaFZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBBVURJT19TVFJFQU1fRFRNRik7CisgICAgfSBlbHNlIGlmIChpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiAhaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIiAgRXhpdGluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICByZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoQVVESU9fU1RSRUFNX0RUTUYpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBFbmdpbmVCYXNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoYXR0cik7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgRW5naW5lQmFzZTo6Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoYXR0cik7Cit9CisKK2F1ZGlvX2F0dHJpYnV0ZXNfdCBFbmdpbmVCYXNlOjpnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBFbmdpbmVCYXNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IEVuZ2luZUJhc2U6OmdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtUHJvZHVjdFN0cmF0ZWdpZXMpIHsKKyAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLT5nZXROYW1lKCkgPT0gbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXIuc2Vjb25kLT5nZXRJZCgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7Cit9CisKK2VuZ2luZUNvbmZpZzo6UGFyc2luZ1Jlc3VsdCBFbmdpbmVCYXNlOjpsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKQoreworICAgIGF1dG8gbG9hZFByb2R1Y3RTdHJhdGVnaWVzID0KKyAgICAgICAgICAgIFtdKGF1dG8mIHN0cmF0ZWd5Q29uZmlncywgYXV0byYgcHJvZHVjdFN0cmF0ZWdpZXMsIGF1dG8mIHZvbHVtZUdyb3VwcykgeworICAgICAgICBmb3IgKGF1dG8mIHN0cmF0ZWd5Q29uZmlnIDogc3RyYXRlZ3lDb25maWdzKSB7CisgICAgICAgICAgICBzcDxQcm9kdWN0U3RyYXRlZ3k+IHN0cmF0ZWd5ID0gbmV3IFByb2R1Y3RTdHJhdGVneShzdHJhdGVneUNvbmZpZy5uYW1lKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZ3JvdXAgOiBzdHJhdGVneUNvbmZpZy5hdHRyaWJ1dGVzR3JvdXBzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbih2b2x1bWVHcm91cHMpLCBlbmQodm9sdW1lR3JvdXBzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZncm91cF0oY29uc3QgYXV0byAmdm9sdW1lR3JvdXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cC52b2x1bWVHcm91cCA9PSB2b2x1bWVHcm91cC5zZWNvbmQtPmdldE5hbWUoKTsgfSk7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaXRlciAhPSBlbmQodm9sdW1lR3JvdXBzKSwgIkludmFsaWQgVm9sdW1lIEdyb3VwIE5hbWUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLnZvbHVtZUdyb3VwLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmIChncm91cC5zdHJlYW0gIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5hZGRTdXBwb3J0ZWRTdHJlYW0oZ3JvdXAuc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZhdHRyIDogZ3JvdXAuYXR0cmlidXRlc1ZlY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3ktPmFkZEF0dHJpYnV0ZXMoe2dyb3VwLnN0cmVhbSwgaXRlci0+c2Vjb25kLT5nZXRJZCgpLCBhdHRyfSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+YWRkU3VwcG9ydGVkQXR0cmlidXRlcyhhdHRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3lJZCA9IHN0cmF0ZWd5LT5nZXRJZCgpOworICAgICAgICAgICAgcHJvZHVjdFN0cmF0ZWdpZXNbc3RyYXRlZ3lJZF0gPSBzdHJhdGVneTsKKyAgICAgICAgfQorICAgIH07CisgICAgYXV0byBsb2FkVm9sdW1lR3JvdXBzID0gW10oYXV0byAmdm9sdW1lQ29uZmlncywgYXV0byAmdm9sdW1lR3JvdXBzKSB7CisgICAgICAgIGZvciAoYXV0byAmdm9sdW1lQ29uZmlnIDogdm9sdW1lQ29uZmlncykgeworICAgICAgICAgICAgc3A8Vm9sdW1lR3JvdXA+IHZvbHVtZUdyb3VwID0gbmV3IFZvbHVtZUdyb3VwKHZvbHVtZUNvbmZpZy5uYW1lLCB2b2x1bWVDb25maWcuaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lQ29uZmlnLmluZGV4TWF4KTsKKyAgICAgICAgICAgIHZvbHVtZUdyb3Vwc1t2b2x1bWVHcm91cC0+Z2V0SWQoKV0gPSB2b2x1bWVHcm91cDsKKworICAgICAgICAgICAgZm9yIChhdXRvICZjb25maWdDdXJ2ZSA6IHZvbHVtZUNvbmZpZy52b2x1bWVDdXJ2ZXMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ID0gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVI7CisgICAgICAgICAgICAgICAgaWYgKCFEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhjb25maWdDdXJ2ZS5kZXZpY2VDYXRlZ29yeSwgZGV2aWNlQ2F0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXMiLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0N1cnZlLmRldmljZUNhdGVnb3J5LmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8Vm9sdW1lQ3VydmU+IGN1cnZlID0gbmV3IFZvbHVtZUN1cnZlKGRldmljZUNhdCk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvICZwb2ludCA6IGNvbmZpZ0N1cnZlLmN1cnZlUG9pbnRzKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnZlLT5hZGQoe3BvaW50LmluZGV4LCBwb2ludC5hdHRlbnVhdGlvbkluTWJ9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdm9sdW1lR3JvdXAtPmFkZChjdXJ2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIGF1dG8gcmVzdWx0ID0gZW5naW5lQ29uZmlnOjpwYXJzZSgpOworICAgIGlmIChyZXN1bHQucGFyc2VkQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBObyBjb25maWd1cmF0aW9uIGZvdW5kLCB1c2luZyBkZWZhdWx0IG1hdGNoaW5nIHBob25lIGV4cGVyaWVuY2UuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZW5naW5lQ29uZmlnOjpDb25maWcgY29uZmlnID0gZ0RlZmF1bHRFbmdpbmVDb25maWc7CisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHJldCA9IGVuZ2luZUNvbmZpZzo6cGFyc2VMZWdhY3lWb2x1bWVzKGNvbmZpZy52b2x1bWVHcm91cHMpOworICAgICAgICByZXN1bHQgPSB7c3RkOjptYWtlX3VuaXF1ZTxlbmdpbmVDb25maWc6OkNvbmZpZz4oY29uZmlnKSwKKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0ID09IE5PX0VSUk9SID8gMCA6IDEpfTsKKyAgICB9CisgICAgQUxPR0VfSUYocmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQgIT0gMCwgInNraXBwZWQgJXp1IGVsZW1lbnRzIiwgcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQpOworICAgIGxvYWRWb2x1bWVHcm91cHMocmVzdWx0LnBhcnNlZENvbmZpZy0+dm9sdW1lR3JvdXBzLCBtVm9sdW1lR3JvdXBzKTsKKyAgICBsb2FkUHJvZHVjdFN0cmF0ZWdpZXMocmVzdWx0LnBhcnNlZENvbmZpZy0+cHJvZHVjdFN0cmF0ZWdpZXMsIG1Qcm9kdWN0U3RyYXRlZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3Vwcyk7CisgICAgbVByb2R1Y3RTdHJhdGVnaWVzLmluaXRpYWxpemUoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitTdHJhdGVneVZlY3RvciBFbmdpbmVCYXNlOjpnZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSBjb25zdAoreworICAgIGF1dG8gZmluZEJ5RmxhZyA9IFtdKGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVnaWVzLCBhdXRvIGZsYWcpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihwcm9kdWN0U3RyYXRlZ2llcyksIGVuZChwcm9kdWN0U3RyYXRlZ2llcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKGNvbnN0IGF1dG8gJnN0cmF0ZWd5KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZXMgOiBzdHJhdGVneS5zZWNvbmQtPmdldEF1ZGlvQXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKChhdHRyaWJ1dGVzLmZsYWdzICYgZmxhZykgPT0gZmxhZykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0pOworICAgIH07CisgICAgYXV0byBzdHJhdGVnaWVzID0gbVByb2R1Y3RTdHJhdGVnaWVzOworICAgIGF1dG8gZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3lJdGVyID0gZmluZEJ5RmxhZyhzdHJhdGVnaWVzLCBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpOworCisgICAgaWYgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEICYmCisgICAgICAgICAgICBlbmZvcmNlZEF1ZGlibGVTdHJhdGVneUl0ZXIgIT0gc3RyYXRlZ2llcy5lbmQoKSkgeworICAgICAgICBhdXRvIGVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5ID0gKmVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5SXRlcjsKKyAgICAgICAgc3RyYXRlZ2llcy5lcmFzZShlbmZvcmNlZEF1ZGlibGVTdHJhdGVneUl0ZXIpOworICAgICAgICBzdHJhdGVnaWVzLmluc2VydChiZWdpbihzdHJhdGVnaWVzKSwgZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3kpOworICAgIH0KKyAgICBTdHJhdGVneVZlY3RvciBvcmRlcmVkU3RyYXRlZ2llczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBzdHJhdGVnaWVzKSB7CisgICAgICAgIG9yZGVyZWRTdHJhdGVnaWVzLnB1c2hfYmFjayhpdGVyLnNlY29uZC0+Z2V0SWQoKSk7CisgICAgfQorICAgIHJldHVybiBvcmRlcmVkU3RyYXRlZ2llczsKK30KKworU3RyZWFtVHlwZVZlY3RvciBFbmdpbmVCYXNlOjpnZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0Cit7CisgICAgLy8gQFRPRE8gZGVmYXVsdCBtdXNpYyBzdHJlYW0gdG8gY29udHJvbCB2b2x1bWUgaWYgbm8gZ3JvdXA/CisgICAgcmV0dXJuIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChwcykgIT0gZW5kKG1Qcm9kdWN0U3RyYXRlZ2llcykpID8KKyAgICAgICAgICAgICAgICBtUHJvZHVjdFN0cmF0ZWdpZXMuYXQocHMpLT5nZXRTdXBwb3J0ZWRTdHJlYW1zKCkgOgorICAgICAgICAgICAgICAgIFN0cmVhbVR5cGVWZWN0b3IoQVVESU9fU1RSRUFNX01VU0lDKTsKK30KKworQXR0cmlidXRlc1ZlY3RvciBFbmdpbmVCYXNlOjpnZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QKK3sKKyAgICByZXR1cm4gKG1Qcm9kdWN0U3RyYXRlZ2llcy5maW5kKHBzKSAhPSBlbmQobVByb2R1Y3RTdHJhdGVnaWVzKSkgPworICAgICAgICAgICAgICAgIG1Qcm9kdWN0U3RyYXRlZ2llcy5hdChwcyktPmdldEF1ZGlvQXR0cmlidXRlcygpIDogQXR0cmlidXRlc1ZlY3RvcigpOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtUHJvZHVjdFN0cmF0ZWdpZXMpIHsKKyAgICAgICAgY29uc3QgYXV0byAmcHJvZHVjdFN0cmF0ZWd5ID0gaXRlci5zZWNvbmQ7CisgICAgICAgIHN0cmF0ZWdpZXMucHVzaF9iYWNrKAorICAgICAgICB7cHJvZHVjdFN0cmF0ZWd5LT5nZXROYW1lKCksIHByb2R1Y3RTdHJhdGVneS0+bGlzdEF1ZGlvQXR0cmlidXRlcygpLAorICAgICAgICAgcHJvZHVjdFN0cmF0ZWd5LT5nZXRJZCgpfSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworVm9sdW1lQ3VydmVzICpFbmdpbmVCYXNlOjpnZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICB2b2x1bWVfZ3JvdXBfdCB2b2xHciA9IG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgY29uc3QgYXV0byAmaXRlciA9IG1Wb2x1bWVHcm91cHMuZmluZCh2b2xHcik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpdGVyID09IHN0ZDo6ZW5kKG1Wb2x1bWVHcm91cHMpLCAiTm8gdm9sdW1lIGdyb3VwcyBmb3IgJXMiLCB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbVZvbHVtZUdyb3Vwcy5hdCh2b2xHciktPmdldFZvbHVtZUN1cnZlcygpOworfQorCitWb2x1bWVDdXJ2ZXMgKkVuZ2luZUJhc2U6OmdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgdm9sdW1lX2dyb3VwX3Qgdm9sR3IgPSBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgaWYgKHZvbEdyID09IFZPTFVNRV9HUk9VUF9OT05FKSB7CisgICAgICAgIHZvbEdyID0gbVByb2R1Y3RTdHJhdGVnaWVzLmdldERlZmF1bHRWb2x1bWVHcm91cCgpOworICAgIH0KKyAgICBjb25zdCBhdXRvICZpdGVyID0gbVZvbHVtZUdyb3Vwcy5maW5kKHZvbEdyKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0ZXIgPT0gc3RkOjplbmQobVZvbHVtZUdyb3VwcyksICJObyB2b2x1bWUgZ3JvdXBzIGZvciAlcyIsCisgICAgICAgICAgICAgICAgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbVZvbHVtZUdyb3Vwcy5hdCh2b2xHciktPmdldFZvbHVtZUN1cnZlcygpOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpCit7CisgICAgYXV0byBzcmNDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbVNyYyk7CisgICAgYXV0byBkc3RDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbURzdCk7CisKKyAgICBpZiAoc3JjQ3VydmVzID09IG51bGxwdHIgfHwgZHN0Q3VydmVzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIGRzdEN1cnZlcy0+c3dpdGNoQ3VydmVzRnJvbSgqc3JjQ3VydmVzKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6cmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIFZvbHVtZUN1cnZlcyAqY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgIHJldHVybiBjdXJ2ZXMgIT0gbnVsbHB0ciA/IGN1cnZlcy0+c3dpdGNoQ3VydmVzRnJvbSgqY3VydmVzKSA6IEJBRF9WQUxVRTsKK30KKworVm9sdW1lR3JvdXBWZWN0b3IgRW5naW5lQmFzZTo6Z2V0Vm9sdW1lR3JvdXBzKCkgY29uc3QKK3sKKyAgICBWb2x1bWVHcm91cFZlY3RvciBncm91cDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lR3JvdXBzKSB7CisgICAgICAgIGdyb3VwLnB1c2hfYmFjayhpdGVyLmZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuIGdyb3VwOworfQorCit2b2x1bWVfZ3JvdXBfdCBFbmdpbmVCYXNlOjpnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHIpOworfQorCit2b2x1bWVfZ3JvdXBfdCBFbmdpbmVCYXNlOjpnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoc3RyZWFtKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lR3JvdXBzKSB7CisgICAgICAgIGdyb3Vwcy5wdXNoX2JhY2soe2l0ZXIuc2Vjb25kLT5nZXROYW1lKCksIGl0ZXIuc2Vjb25kLT5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnNlY29uZC0+Z2V0U3VwcG9ydGVkQXR0cmlidXRlcygpLCBpdGVyLnNlY29uZC0+Z2V0U3RyZWFtVHlwZXMoKX0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgRW5naW5lQmFzZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgbVByb2R1Y3RTdHJhdGVnaWVzLmR1bXAoZHN0LCAyKTsKKyAgICBtVm9sdW1lR3JvdXBzLmR1bXAoZHN0LCAyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkZTBkOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8qKgorICogQGJyaWVmIEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMgaGFyZCBjb2RlZCBhcnJheSBvZiBzdHJhdGVnaWVzIHRvIGZpbGwgbmV3IGVuZ2luZSBBUEkgY29udHJhY3QuCisgKi8KK2NvbnN0IGVuZ2luZUNvbmZpZzo6UHJvZHVjdFN0cmF0ZWdpZXMgZ09yZGVyZWRTdHJhdGVnaWVzID0geworICAgIHsiU1RSQVRFR1lfUEhPTkUiLAorICAgICB7CisgICAgICAgICB7InBob25lIiwgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsICJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsCisgICAgICAgICAgICAiIn19LAorICAgICAgICAgfSwKKyAgICAgICAgIHsic2NvIiwgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08sICJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfU0NPLAorICAgICAgICAgICAgIiJ9fSwKKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfU09OSUZJQ0FUSU9OIiwKKyAgICAgeworICAgICAgICAgeyJyaW5nIiwgQVVESU9fU1RSRUFNX1JJTkcsICJBVURJT19TVFJFQU1fUklORyIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSwKKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9LAorICAgICAgICAgeyJhbGFybSIsIEFVRElPX1NUUkVBTV9BTEFSTSwgIkFVRElPX1NUUkVBTV9BTEFSTSIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQUxBUk0sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19LAorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSwgIkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwgIkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFksCisgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgIkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLAorICAgICAgICAgIHsKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfTUVESUEiLAorICAgICB7CisgICAgICAgICB7Im11c2ljIiwgQVVESU9fU1RSRUFNX01VU0lDLCAiQVVESU9fU1RSRUFNX01VU0lDIiwKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTUVESUEsIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfR0FNRSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BU1NJU1RBTlQsIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFLAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgfSwKKyAgICAgICAgIH0sCisgICAgICAgICB7InN5c3RlbSIsIEFVRElPX1NUUkVBTV9TWVNURU0sICJBVURJT19TVFJFQU1fU1lTVEVNIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiwKKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX0RUTUYiLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9EVE1GLCAiQVVESU9fU1RSRUFNX0RUTUYiLAorICAgICAgICAgIHsKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcsCisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgfQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIiLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9UVFMsICJBVURJT19TVFJFQU1fVFRTIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgIEFVRElPX0ZMQUdfQkVBQ09OLCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX1JFUk9VVElORyIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX1JFUk9VVElORywgIkFVRElPX1NUUkVBTV9SRVJPVVRJTkciLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX1BBVENIIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fUEFUQ0gsICJBVURJT19TVFJFQU1fUEFUQ0giLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfQorfTsKKworY29uc3QgZW5naW5lQ29uZmlnOjpDb25maWcgZ0RlZmF1bHRFbmdpbmVDb25maWcgPSB7CisgICAgMS4wLAorICAgIGdPcmRlcmVkU3RyYXRlZ2llcywKKyAgICB7fSwKKyAgICB7fSwKKyAgICB7fQorfTsKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NGYxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1Byb2R1Y3RTdHJhdGVneSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlByb2R1Y3RTdHJhdGVneS5oIgorCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1Byb2R1Y3RTdHJhdGVneTo6UHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSA6CisgICAgbU5hbWUobmFtZSksCisgICAgbUlkKHN0YXRpY19jYXN0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4oSGFuZGxlR2VuZXJhdG9yPHVpbnQzMl90Pjo6Z2V0TmV4dEhhbmRsZSgpKSkKK3sKK30KKwordm9pZCBQcm9kdWN0U3RyYXRlZ3k6OmFkZEF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhdWRpb0F0dHJpYnV0ZXMpCit7CisgICAgbUF0dHJpYnV0ZXNWZWN0b3IucHVzaF9iYWNrKGF1ZGlvQXR0cmlidXRlcyk7Cit9CisKK3N0ZDo6dmVjdG9yPGFuZHJvaWQ6OkF1ZGlvQXR0cmlidXRlcz4gUHJvZHVjdFN0cmF0ZWd5OjpsaXN0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3QKK3sKKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpBdWRpb0F0dHJpYnV0ZXM+IGFuZHJvaWRBYTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBhbmRyb2lkQWEucHVzaF9iYWNrKHthdHRyLm1Wb2x1bWVHcm91cCwgYXR0ci5tU3RyZWFtLCBhdHRyLm1BdHRyaWJ1dGVzfSk7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkQWE7Cit9CisKK0F0dHJpYnV0ZXNWZWN0b3IgUHJvZHVjdFN0cmF0ZWd5OjpnZXRBdWRpb0F0dHJpYnV0ZXMoKSBjb25zdAoreworICAgIEF0dHJpYnV0ZXNWZWN0b3IgYXR0clZlY3RvcjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJHcm91cCA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CisgICAgICAgIGF0dHJWZWN0b3IucHVzaF9iYWNrKGF0dHJHcm91cC5tQXR0cmlidXRlcyk7CisgICAgfQorICAgIGlmIChub3QgYXR0clZlY3Rvci5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBhdHRyVmVjdG9yOworICAgIH0KKyAgICByZXR1cm4geyBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSIH07Cit9CisKK2Jvb2wgUHJvZHVjdFN0cmF0ZWd5OjptYXRjaGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyKSBjb25zdAoreworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoYmVnaW4obUF0dHJpYnV0ZXNWZWN0b3IpLCBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZhdHRyXShjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyKSB7CisgICAgICAgIHJldHVybiBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6YXR0cmlidXRlc01hdGNoZXMoc3VwcG9ydGVkQXR0ci5tQXR0cmlidXRlcywgYXR0cik7CisgICAgfSkgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKTsKK30KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBQcm9kdWN0U3RyYXRlZ3k6OmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKG1BdHRyaWJ1dGVzVmVjdG9yKSwgZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZhdHRyXShjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyKSB7CisgICAgICAgIHJldHVybiBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6YXR0cmlidXRlc01hdGNoZXMoc3VwcG9ydGVkQXR0ci5tQXR0cmlidXRlcywgYXR0cik7IH0pOworICAgIHJldHVybiBpdGVyICE9IGVuZChtQXR0cmlidXRlc1ZlY3RvcikgPyBpdGVyLT5tU3RyZWFtIDogQVVESU9fU1RSRUFNX0RFRkFVTFQ7Cit9CisKK2F1ZGlvX2F0dHJpYnV0ZXNfdCBQcm9kdWN0U3RyYXRlZ3k6OmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4obUF0dHJpYnV0ZXNWZWN0b3IpLCBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0cmVhbVR5cGVdKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIpIHsKKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEF0dHIubVN0cmVhbSA9PSBzdHJlYW1UeXBlOyB9KTsKKyAgICByZXR1cm4gaXRlciAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpID8gaXRlci0+bUF0dHJpYnV0ZXMgOiBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworfQorCitib29sIFByb2R1Y3RTdHJhdGVneTo6aXNEZWZhdWx0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kX2lmKGJlZ2luKG1BdHRyaWJ1dGVzVmVjdG9yKSwgZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSwgW10oY29uc3QgYXV0byAmYXR0cikgeworICAgICAgICByZXR1cm4gYXR0ci5tQXR0cmlidXRlcyA9PSBkZWZhdWx0QXR0cjsgfSkgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKTsKK30KKworU3RyZWFtVHlwZVZlY3RvciBQcm9kdWN0U3RyYXRlZ3k6OmdldFN1cHBvcnRlZFN0cmVhbXMoKSBjb25zdAoreworICAgIFN0cmVhbVR5cGVWZWN0b3Igc3RyZWFtczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBpZiAoc3RkOjpmaW5kKGJlZ2luKHN0cmVhbXMpLCBlbmQoc3RyZWFtcyksIHN1cHBvcnRlZEF0dHIubVN0cmVhbSkgPT0gZW5kKHN0cmVhbXMpICYmCisgICAgICAgICAgICAgICAgc3VwcG9ydGVkQXR0ci5tU3RyZWFtICE9IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CisgICAgICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhzdXBwb3J0ZWRBdHRyLm1TdHJlYW0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdHJlYW1zOworfQorCitib29sIFByb2R1Y3RTdHJhdGVneTo6c3VwcG9ydFN0cmVhbVR5cGUoY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtVHlwZSkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kX2lmKGJlZ2luKG1BdHRyaWJ1dGVzVmVjdG9yKSwgZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RyZWFtVHlwZV0oY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0cikgeworICAgICAgICByZXR1cm4gc3VwcG9ydGVkQXR0ci5tU3RyZWFtID09IHN0cmVhbVR5cGU7IH0pICE9IGVuZChtQXR0cmlidXRlc1ZlY3Rvcik7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneTo6Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBpZiAoQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKHN1cHBvcnRlZEF0dHIubUF0dHJpYnV0ZXMsIGF0dHIpKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkQXR0ci5tVm9sdW1lR3JvdXA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZPTFVNRV9HUk9VUF9OT05FOworfQorCit2b2x1bWVfZ3JvdXBfdCBQcm9kdWN0U3RyYXRlZ3k6OmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBpZiAoc3VwcG9ydGVkQXR0ci5tU3RyZWFtID09IHN0cmVhbSkgeworICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEF0dHIubVZvbHVtZUdyb3VwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWT0xVTUVfR1JPVVBfTk9ORTsKK30KKwordm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5OjpnZXREZWZhdWx0Vm9sdW1lR3JvdXAoKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gJml0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4obUF0dHJpYnV0ZXNWZWN0b3IpLCBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgYXV0byAmYXR0cikge3JldHVybiBhdHRyLm1BdHRyaWJ1dGVzID09IGRlZmF1bHRBdHRyO30pOworICAgIHJldHVybiBpdGVyICE9IGVuZChtQXR0cmlidXRlc1ZlY3RvcikgPyBpdGVyLT5tVm9sdW1lR3JvdXAgOiBWT0xVTUVfR1JPVVBfTk9ORTsKK30KKwordm9pZCBQcm9kdWN0U3RyYXRlZ3k6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqcy0lcyAoaWQ6ICVkKVxuIiwgc3BhY2VzLCAiIiwgbU5hbWUuY19zdHIoKSwgbUlkKTsKKyAgICBzdGQ6OnN0cmluZyBkZXZpY2VMaXRlcmFsOworICAgIGlmICghT3V0cHV0RGV2aWNlQ29udmVydGVyOjp0b1N0cmluZyhtQXBwbGljYWJsZURldmljZXMsIGRldmljZUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgZGV2aWNlICVkIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZURldmljZXMpOworICAgIH0KKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU2VsZWN0ZWQgRGV2aWNlOiB7dHlwZTolcywgQDolc31cbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXRlcmFsLmNfc3RyKCksIG1EZXZpY2VBZGRyZXNzLmNfc3RyKCkpOworCisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0dyb3VwOiAlZCBzdHJlYW06ICVzXG4iLCBzcGFjZXMgKyAzLCAiIiwgYXR0ci5tVm9sdW1lR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnRvU3RyaW5nKGF0dHIubVN0cmVhbSkuY19zdHIoKSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgQXR0cmlidXRlczogIiwgc3BhY2VzICsgMywgIiIpOworICAgICAgICBzdGQ6OnN0cmluZyBhdHRTdHIgPQorICAgICAgICAgICAgICAgIGF0dHIubUF0dHJpYnV0ZXMgPT0gZGVmYXVsdEF0dHIgPyAieyBBbnkgfSIgOiBhbmRyb2lkOjp0b1N0cmluZyhhdHRyLm1BdHRyaWJ1dGVzKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzXG4iLCBhdHRTdHIuY19zdHIoKSk7CisgICAgfQorfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLT5tYXRjaGVzKGF0dHIpKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlci5zZWNvbmQtPmdldElkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzOiBObyBtYXRjaGluZyBwcm9kdWN0IHN0cmF0ZWd5IGZvciBhdHRyaWJ1dGVzICVzLCByZXR1cm4gZGVmYXVsdCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICByZXR1cm4gZ2V0RGVmYXVsdCgpOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBjb25zdCBhdXRvIHN0cmF0ZWd5ID0gaXRlci5zZWNvbmQ7CisgICAgICAgIGlmIChzdHJhdGVneS0+c3VwcG9ydFN0cmVhbVR5cGUoc3RyZWFtKSkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LT5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogTm8gcHJvZHVjdCBzdHJhdGVneSBmb3Igc3RyZWFtICVzLCB1c2luZyBkZWZhdWx0IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgcmV0dXJuIHt9OworfQorCithdWRpb19zdHJlYW1fdHlwZV90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IGl0ZXIuc2Vjb25kLT5nZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcyhhdHRyKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fREVGQVVMVCkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmVhbTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXM6IE5vIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIGF0dHJpYnV0ZXMgJXMsIHVzaW5nIGRlZmF1bHQgKGFrYSBNVVNJQykiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgcmV0dXJuICBBVURJT19TVFJFQU1fTVVTSUM7Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldERlZmF1bHQoKSBjb25zdAoreworICAgIGlmIChtRGVmYXVsdFN0cmF0ZWd5ICE9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRTdHJhdGVneTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLT5pc0RlZmF1bHQoKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiB1c2luZyBkZWZhdWx0ICVzIiwgX19GVU5DVElPTl9fLCBpdGVyLnNlY29uZC0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGl0ZXIuc2Vjb25kLT5nZXRJZCgpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dFKCIlczogTm8gZGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGRlZmluZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7Cit9CisKK2F1ZGlvX2F0dHJpYnV0ZXNfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3koCisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3QKK3sKKyAgICBpZiAoZmluZChzdHJhdGVneSkgPT0gZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgJWQgc3RyYXRlZ3kgcmVxdWVzdGVkIiwgc3RyYXRlZ3kpOworICAgICAgICByZXR1cm4gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICB9CisgICAgcmV0dXJuIGF0KHN0cmF0ZWd5KS0+Z2V0QXVkaW9BdHRyaWJ1dGVzKClbMF07Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQtPnN1cHBvcnRTdHJlYW1UeXBlKHN0cmVhbSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLnNlY29uZC0+Z2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXM6IE5vIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIHN0cmVhbSAlZCwgdXNpbmcgZGVmYXVsdCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtKTsKKyAgICByZXR1cm4gZ2V0RGVmYXVsdCgpOworfQorCisKK2F1ZGlvX2RldmljZXNfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KAorICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0Cit7CisgICAgaWYgKGZpbmQoc3RyYXRlZ3kpID09IGVuZCgpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkICVkIHN0cmF0ZWd5IHJlcXVlc3RlZCwgcmV0dXJuaW5nIGRldmljZSBmb3IgZGVmYXVsdCBzdHJhdGVneSIsIHN0cmF0ZWd5KTsKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IGRlZmF1bHRTdHJhdGVneSA9IGdldERlZmF1bHQoKTsKKyAgICAgICAgaWYgKGRlZmF1bHRTdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXQoZ2V0RGVmYXVsdCgpKS0+Z2V0RGV2aWNlVHlwZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIGF0KHN0cmF0ZWd5KS0+Z2V0RGV2aWNlVHlwZXMoKTsKK30KKworc3RkOjpzdHJpbmcgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwc0lkKSBjb25zdAoreworICAgIGlmIChmaW5kKHBzSWQpID09IGVuZCgpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkICVkIHN0cmF0ZWd5IHJlcXVlc3RlZCwgcmV0dXJuaW5nIGRldmljZSBmb3IgZGVmYXVsdCBzdHJhdGVneSIsIHBzSWQpOworICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZGVmYXVsdFN0cmF0ZWd5ID0gZ2V0RGVmYXVsdCgpOworICAgICAgICBpZiAoZGVmYXVsdFN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdChnZXREZWZhdWx0KCkpLT5nZXREZXZpY2VBZGRyZXNzKCk7CisgICAgfQorICAgIHJldHVybiBhdChwc0lkKS0+Z2V0RGV2aWNlQWRkcmVzcygpOworfQorCit2b2x1bWVfZ3JvdXBfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXAgPSBpdGVyLnNlY29uZC0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgICAgICBpZiAoZ3JvdXAgIT0gVk9MVU1FX0dST1VQX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiBncm91cDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCk7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIHZvbHVtZV9ncm91cF90IGdyb3VwID0gaXRlci5zZWNvbmQtPmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgICAgICBpZiAoZ3JvdXAgIT0gVk9MVU1FX0dST1VQX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiBncm91cDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVygiJXM6IG5vIHZvbHVtZSBncm91cCBmb3IgJXMsIHVzaW5nIGRlZmF1bHQiLCBfX2Z1bmNfXywgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICByZXR1cm4gZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCk7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0RGVmYXVsdFZvbHVtZUdyb3VwKCkgY29uc3QKK3sKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZGVmYXVsdFN0cmF0ZWd5ID0gZ2V0RGVmYXVsdCgpOworICAgIGlmIChkZWZhdWx0U3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgIHJldHVybiBWT0xVTUVfR1JPVVBfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIGF0KGRlZmF1bHRTdHJhdGVneSktPmdldERlZmF1bHRWb2x1bWVHcm91cCgpOworfQorCit2b2lkIFByb2R1Y3RTdHJhdGVneU1hcDo6aW5pdGlhbGl6ZSgpCit7CisgICAgbURlZmF1bHRTdHJhdGVneSA9IGdldERlZmF1bHQoKTsKKyAgICBBTE9HX0FTU0VSVChtRGVmYXVsdFN0cmF0ZWd5ICE9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSwgIk5vIGRlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBmb3VuZCIpOworfQorCit2b2lkIFByb2R1Y3RTdHJhdGVneU1hcDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1Byb2R1Y3QgU3RyYXRlZ2llcyBkdW1wOiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGl0ZXIuc2Vjb25kLT5kdW1wKGRzdCwgc3BhY2VzICsgMik7CisgICAgfQorfQorCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUN1cnZlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUN1cnZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzUyNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lQ3VydmUuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OlZvbHVtZUN1cnZlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiVm9sdW1lQ3VydmUuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Zsb2F0IFZvbHVtZUN1cnZlOjp2b2xJbmRleFRvRGIoaW50IGluZGV4SW5VaSwgaW50IHZvbEluZGV4TWluLCBpbnQgdm9sSW5kZXhNYXgpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQoIW1DdXJ2ZVBvaW50cy5pc0VtcHR5KCksICJJbnZhbGlkIHZvbHVtZSBjdXJ2ZSIpOworICAgIGlmICh2b2xJbmRleE1pbiA8IDAgfHwgdm9sSW5kZXhNYXggPCAwKSB7CisgICAgICAgIC8vIEluIG9yZGVyIHRvIGxldCBBdWRpb1NlcnZpY2UgaW5pdGlhbGl6ZSB0aGUgbWluIGFuZCBtYXgsIGNvbnZlbnRpb24gaXMgdG8gdXNlIC0xCisgICAgICAgIHJldHVybiBOQU47CisgICAgfQorICAgIGlmIChpbmRleEluVWkgPCB2b2xJbmRleE1pbikgeworICAgICAgICAvLyBhbiBpbmRleCBvZiAwIG1lYW5zIG11dGUgcmVxdWVzdCB3aGVuIHZvbEluZGV4TWluID4gMAorICAgICAgICBpZiAoaW5kZXhJblVpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJWT0xVTUUgZm9yY2luZyBtdXRlIGZvciBpbmRleCAwIHdpdGggbWluIGluZGV4ICVkIiwgdm9sSW5kZXhNaW4pOworICAgICAgICAgICAgcmV0dXJuIFZPTFVNRV9NSU5fREI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlZPTFVNRSByZW1hcHBpbmcgaW5kZXggZnJvbSAlZCB0byBtaW4gaW5kZXggJWQiLCBpbmRleEluVWksIHZvbEluZGV4TWluKTsKKyAgICAgICAgaW5kZXhJblVpID0gdm9sSW5kZXhNaW47CisgICAgfSBlbHNlIGlmIChpbmRleEluVWkgPiB2b2xJbmRleE1heCkgeworICAgICAgICBBTE9HVigiVk9MVU1FIHJlbWFwcGluZyBpbmRleCBmcm9tICVkIHRvIG1heCBpbmRleCAlZCIsIGluZGV4SW5VaSwgdm9sSW5kZXhNYXgpOworICAgICAgICBpbmRleEluVWkgPSB2b2xJbmRleE1heDsKKyAgICB9CisKKyAgICBzaXplX3QgbmJDdXJ2ZVBvaW50cyA9IG1DdXJ2ZVBvaW50cy5zaXplKCk7CisgICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbQorICAgIGludCBuYlN0ZXBzID0gMSArIG1DdXJ2ZVBvaW50c1tuYkN1cnZlUG9pbnRzIC0gMV0ubUluZGV4IC0gbUN1cnZlUG9pbnRzWzBdLm1JbmRleDsKKyAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gdm9sSW5kZXhNaW4pKSAvICh2b2xJbmRleE1heCAtIHZvbEluZGV4TWluKTsKKworICAgIC8vIFdoZXJlIHdvdWxkIHRoaXMgdm9sdW1lIGluZGV4IGJlZW4gaW5zZXJ0ZWQgaW4gdGhlIGN1cnZlIHBvaW50CisgICAgc2l6ZV90IGluZGV4SW5VaVBvc2l0aW9uID0gbUN1cnZlUG9pbnRzLm9yZGVyT2YoQ3VydmVQb2ludCh2b2xJZHgsIDApKTsKKyAgICBpZiAoaW5kZXhJblVpUG9zaXRpb24gPj0gbmJDdXJ2ZVBvaW50cykgeworICAgICAgICAvL3VzZSBsYXN0IHBvaW50IG9mIHRhYmxlCisgICAgICAgIHJldHVybiBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGY7CisgICAgfQorICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiA9PSAwKSB7CisgICAgICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiAhPSBtQ3VydmVQb2ludHNbMF0ubUluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ3VydmVQb2ludHNbMF0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZjsKKyAgICB9CisgICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCisgICAgZmxvYXQgZGVjaWJlbHMgPSAobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikgKworICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4KSkgKgorICAgICAgICAgICAgICAgICggKChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSkgLworICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1JbmRleCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4KSkgKTsKKworICAgIEFMT0dWKCJWT0xVTUUgdm9sIGluZGV4PVslZCAlZCAlZF0sIGRCPVslLjFmICUuMWYgJS4xZl0iLAorICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4LCB2b2xJZHgsCisgICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1JbmRleCwKKyAgICAgICAgICAgICgoZmxvYXQpbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZiksIGRlY2liZWxzLAorICAgICAgICAgICAgKChmbG9hdCltQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpKTsKKworICAgIHJldHVybiBkZWNpYmVsczsKK30KKwordm9pZCBWb2x1bWVDdXJ2ZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgY3VydmVQb2ludHMpIGNvbnN0Cit7CisgICAgaWYgKCFjdXJ2ZVBvaW50cykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRzdC0+YXBwZW5kKCIgeyIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUN1cnZlUG9pbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMoJTNkLCAlNWQpIiwgc3BhY2VzLCAiIiwgbUN1cnZlUG9pbnRzW2ldLm1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2ldLm1BdHRlbnVhdGlvbkluTWIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdChpID09IChtQ3VydmVQb2ludHMuc2l6ZSgpIC0gMSkgPyAiIH1cbiIgOiAiLCAiKTsKKyAgICB9Cit9CisKK3ZvaWQgVm9sdW1lQ3VydmVzOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKK3sKKyAgICBpZiAoIWN1cnZlUG9pbnRzKSB7CisvLyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyUwMmQgICAgICAlcyAgICAgICAgICUwM2QgICAgICAgICUwM2QgICAgICAgICIsIHNwYWNlcywgIiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbSwgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMgKyAxLCAiIik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsIHNwYWNlcyArIDEsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FuQmVNdXRlZCA/ICJ0cnVlICIgOiAiZmFsc2UiLCBtSW5kZXhNaW4sIG1JbmRleE1heCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1JbmRleEN1cikgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUwNHggOiAlMDJkLCAiLCBwYWlyLmZpcnN0LCBwYWlyLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtTmFtZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBtU3RyZWFtcykgeworICAgICAgICBzdHJlYW1OYW1lcyArPSBhbmRyb2lkOjp0b1N0cmluZyhzdHJlYW0pICsgIigiK3N0ZDo6dG9fc3RyaW5nKHN0cmVhbSkrIikgIjsKKyAgICB9CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1ZvbHVtZSBDdXJ2ZXMgU3RyZWFtcy9BdHRyaWJ1dGVzLCBDdXJ2ZSBwb2ludHMgU3RyZWFtcyBmb3IgZGV2aWNlIgorICAgICAgICAgICAgICAgICAgICAgICIgY2F0ZWdvcnkgKGluZGV4LCBhdHRlbnVhdGlvbiBpbiBtaWxsaWJlbClcbiIsIHNwYWNlcywgIiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgU3RyZWFtczogJXMgXG4iLCBzcGFjZXMsICIiLCBzdHJlYW1OYW1lcy5jX3N0cigpKTsKKyAgICBpZiAoIW1BdHRyaWJ1dGVzLmVtcHR5KCkpIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgQXR0cmlidXRlczoiLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZXMgOiBtQXR0cmlidXRlcykgeworICAgICAgICBzdGQ6OnN0cmluZyBhdHRTdHIgPSBhdHRyaWJ1dGVzID09IGRlZmF1bHRBdHRyID8gInsgQW55IH0iIDogYW5kcm9pZDo6dG9TdHJpbmcoYXR0cmlidXRlcyk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgJXNcbiIsIGF0dHJpYnV0ZXMgPT0gbUF0dHJpYnV0ZXMuZnJvbnQoKSA/IDAgOiBzcGFjZXMgKyAxMywgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dFN0ci5jX3N0cigpKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRMaXRlcmFsOworICAgICAgICBEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6dG9TdHJpbmcoa2V5QXQoaSksIGRldmljZUNhdExpdGVyYWwpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICVzIDoiLCBzcGFjZXMsICIiLCBkZXZpY2VDYXRMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMSwgdHJ1ZSk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVHcm91cC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVHcm91cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4OTgwNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUdyb3VwLmNwcApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1ZvbHVtZUdyb3VwIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiVm9sdW1lR3JvdXAuaCIKKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8KKy8vIFZvbHVtZUdyb3VwIGltcGxlbWVudGF0aW9uCisvLworVm9sdW1lR3JvdXA6OlZvbHVtZUdyb3VwKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkgOgorICAgIG1OYW1lKG5hbWUpLCBtSWQoc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KEhhbmRsZUdlbmVyYXRvcjx1aW50MzJfdD46OmdldE5leHRIYW5kbGUoKSkpLAorICAgIG1Hcm91cFZvbHVtZUN1cnZlcyhWb2x1bWVDdXJ2ZXMoaW5kZXhNaW4sIGluZGV4TWF4KSkKK3sKK30KKwordm9pZCBWb2x1bWVHcm91cDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzLSVzIChpZDogJWQpXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5jX3N0cigpLCBtSWQpOworICAgIG1Hcm91cFZvbHVtZUN1cnZlcy5kdW1wKGRzdCwgc3BhY2VzICsgMiwgdHJ1ZSk7CisgICAgbUdyb3VwVm9sdW1lQ3VydmVzLmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBmYWxzZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIik7Cit9CisKK3ZvaWQgVm9sdW1lR3JvdXA6OmFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJmN1cnZlKQoreworICAgIG1Hcm91cFZvbHVtZUN1cnZlcy5hZGQoY3VydmUpOworfQorCit2b2lkIFZvbHVtZUdyb3VwOjphZGRTdXBwb3J0ZWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKK3sKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMuYWRkQXR0cmlidXRlcyhhdHRyKTsKK30KKwordm9pZCBWb2x1bWVHcm91cDo6YWRkU3VwcG9ydGVkU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIG1Hcm91cFZvbHVtZUN1cnZlcy5hZGRTdHJlYW1UeXBlKHN0cmVhbSk7Cit9CisKKy8vCisvLyBWb2x1bWVHcm91cE1hcCBpbXBsZW1lbnRhdGlvbgorLy8KK3ZvaWQgVm9sdW1lR3JvdXBNYXA6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc1ZvbHVtZSBHcm91cHMgZHVtcDoiLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpdGVyLnNlY29uZC0+ZHVtcChkc3QsIHNwYWNlcyArIDIpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MmYyYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvQW5kcm9pZC5icApAQCAtMCwwICsxLDMxIEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbmZpZyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJ4bWwyL2luY2x1ZGUiLAorICAgICAgICAiZXh0ZXJuYWwvaWN1L2ljdTRjL3NvdXJjZS9jb21tb24iLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAic3JjL0VuZ2luZUNvbmZpZy5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJhbmRyb2lkaWN1IiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjVlZDVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK3N0cnVjdCBfeG1sTm9kZTsKK3N0cnVjdCBfeG1sRG9jOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW5naW5lQ29uZmlnIHsKKworLyoqIERlZmF1bHQgcGF0aCBvZiBhdWRpbyBwb2xpY3kgdXNhZ2VzIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KK2NvbnN0ZXhwciBjaGFyIERFRkFVTFRfUEFUSFtdID0gIi92ZW5kb3IvZXRjL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwiOworCisvKiogRGlyZWN0b3JpZXMgd2hlcmUgdGhlIGVmZmVjdCBsaWJyYXJpZXMgd2lsbCBiZSBzZWFyY2ggZm9yLiAqLworY29uc3RleHByIGNvbnN0IGNoYXIqIFBPTElDWV9VU0FHRV9MSUJSQVJZX1BBVEhbXSA9IHsiL29kbS9ldGMvIiwgIi92ZW5kb3IvZXRjLyIsICIvc3lzdGVtL2V0Yy8ifTsKKwordXNpbmcgQXR0cmlidXRlc1ZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX2F0dHJpYnV0ZXNfdD47Cit1c2luZyBTdHJlYW1WZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90PjsKKworc3RydWN0IEF0dHJpYnV0ZXNHcm91cCB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKKyAgICBzdGQ6OnN0cmluZyB2b2x1bWVHcm91cDsKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGF0dHJpYnV0ZXNWZWN0OworfTsKKwordXNpbmcgQXR0cmlidXRlc0dyb3VwcyA9IHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZXNHcm91cD47CisKK3N0cnVjdCBDdXJ2ZVBvaW50IHsKKyAgICBpbnQgaW5kZXg7CisgICAgaW50IGF0dGVudWF0aW9uSW5NYjsKK307Cit1c2luZyBDdXJ2ZVBvaW50cyA9IHN0ZDo6dmVjdG9yPEN1cnZlUG9pbnQ+OworCitzdHJ1Y3QgVm9sdW1lQ3VydmUgeworICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdGVnb3J5OworICAgIEN1cnZlUG9pbnRzIGN1cnZlUG9pbnRzOworfTsKK3VzaW5nIFZvbHVtZUN1cnZlcyA9IHN0ZDo6dmVjdG9yPFZvbHVtZUN1cnZlPjsKKworc3RydWN0IFZvbHVtZUdyb3VwIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGludCBpbmRleE1pbjsKKyAgICBpbnQgaW5kZXhNYXg7CisgICAgVm9sdW1lQ3VydmVzIHZvbHVtZUN1cnZlczsKK307Cit1c2luZyBWb2x1bWVHcm91cHMgPSBzdGQ6OnZlY3RvcjxWb2x1bWVHcm91cD47CisKK3N0cnVjdCBQcm9kdWN0U3RyYXRlZ3kgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgQXR0cmlidXRlc0dyb3VwcyBhdHRyaWJ1dGVzR3JvdXBzOworfTsKKwordXNpbmcgUHJvZHVjdFN0cmF0ZWdpZXMgPSBzdGQ6OnZlY3RvcjxQcm9kdWN0U3RyYXRlZ3k+OworCit1c2luZyBWYWx1ZVBhaXIgPSBzdGQ6OnBhaXI8dWludDMyX3QsIHN0ZDo6c3RyaW5nPjsKK3VzaW5nIFZhbHVlUGFpcnMgPSBzdGQ6OnZlY3RvcjxWYWx1ZVBhaXI+OworCitzdHJ1Y3QgQ3JpdGVyaW9uVHlwZQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYm9vbCBpc0luY2x1c2l2ZTsKKyAgICBWYWx1ZVBhaXJzIHZhbHVlUGFpcnM7Cit9OworCit1c2luZyBDcml0ZXJpb25UeXBlcyA9IHN0ZDo6dmVjdG9yPENyaXRlcmlvblR5cGU+OworCitzdHJ1Y3QgQ3JpdGVyaW9uCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZTsKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0TGl0ZXJhbFZhbHVlOworfTsKKwordXNpbmcgQ3JpdGVyaWEgPSBzdGQ6OnZlY3RvcjxDcml0ZXJpb24+OworCitzdHJ1Y3QgQ29uZmlnIHsKKyAgICBmbG9hdCB2ZXJzaW9uOworICAgIFByb2R1Y3RTdHJhdGVnaWVzIHByb2R1Y3RTdHJhdGVnaWVzOworICAgIENyaXRlcmlhIGNyaXRlcmlhOworICAgIENyaXRlcmlvblR5cGVzIGNyaXRlcmlvblR5cGVzOworICAgIFZvbHVtZUdyb3VwcyB2b2x1bWVHcm91cHM7Cit9OworCisvKiogUmVzdWx0IG9mIGBwYXJzZShjb25zdCBjaGFyKilgICovCitzdHJ1Y3QgUGFyc2luZ1Jlc3VsdCB7CisgICAgLyoqIFBhcnNlZCBjb25maWcsIG51bGxwdHIgaWYgdGhlIHhtbCBsaWIgY291bGQgbm90IGxvYWQgdGhlIGZpbGUgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiBwYXJzZWRDb25maWc7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQ7IC8vPCBOdW1iZXIgb2Ygc2tpcHBlZCBpbnZhbGlkIHByb2R1Y3Qgc3RyYXRlZ2llcworfTsKKworLyoqIFBhcnNlcyB0aGUgcHJvdmlkZWQgYXVkaW8gcG9saWN5IHVzYWdlIGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJuIGF1ZGlvIHBvbGljeSB1c2FnZSBAc2VlIENvbmZpZworICovCitQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGggPSBERUZBVUxUX1BBVEgpOworYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVzKFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKTsKKworfSAvLyBuYW1lc3BhY2UgZW5naW5lQ29uZmlnCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQ3NzM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcApAQCAtMCwwICsxLDY5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9Db25maWciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJFbmdpbmVDb25maWcuaCIKKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgorI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aXN0cmVhbT4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87CisKK25hbWVzcGFjZSBlbmdpbmVDb25maWcgeworCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmdWZXJzaW9uQXR0cmlidXRlID0gInZlcnNpb24iOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdSZWZlcmVuY2VFbGVtZW50TmFtZSA9ICJyZWZlcmVuY2UiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lID0gIm5hbWUiOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSBDPgorc3RydWN0IEJhc2VTZXJpYWxpemVyVHJhaXRzIHsKKyAgICB0eXBlZGVmIEUgRWxlbWVudDsKKyAgICB0eXBlZGVmIEMgQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHZvaWQqIFB0clNlcmlhbGl6aW5nQ3R4OworfTsKKworc3RydWN0IEF0dHJpYnV0ZXNHcm91cFRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxBdHRyaWJ1dGVzR3JvdXAsIEF0dHJpYnV0ZXNHcm91cHM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJBdHRyaWJ1dGVzR3JvdXAiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJBdHRyaWJ1dGVzR3JvdXBzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0cmVhbVR5cGUgPSAic3RyZWFtVHlwZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdm9sdW1lR3JvdXAgPSAidm9sdW1lR3JvdXAiOworICAgIH07CisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIENvbGxlY3Rpb24gJnBzKTsKK307CisKK3N0cnVjdCBQcm9kdWN0U3RyYXRlZ3lUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8UHJvZHVjdFN0cmF0ZWd5LCBQcm9kdWN0U3RyYXRlZ2llcz4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gIlByb2R1Y3RTdHJhdGVneSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gIlByb2R1Y3RTdHJhdGVnaWVzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgIH07CisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIENvbGxlY3Rpb24gJnBzKTsKK307CitzdHJ1Y3QgVmFsdWVUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8VmFsdWVQYWlyLCBWYWx1ZVBhaXJzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAidmFsdWUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJ2YWx1ZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmxpdGVyYWwgPSAibGl0ZXJhbCI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbnVtZXJpY2FsID0gIm51bWVyaWNhbCI7CisgICAgfTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZjb2xsZWN0aW9uKTsKK307CitzdHJ1Y3QgQ3JpdGVyaW9uVHlwZVRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxDcml0ZXJpb25UeXBlLCBDcml0ZXJpb25UeXBlcz4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImNyaXRlcmlvbl90eXBlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiY3JpdGVyaW9uX3R5cGVzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnR5cGUgPSAidHlwZSI7CisgICAgfTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZjb2xsZWN0aW9uKTsKK307CitzdHJ1Y3QgQ3JpdGVyaW9uVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPENyaXRlcmlvbiwgQ3JpdGVyaWE+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJjcml0ZXJpb24iOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJjcml0ZXJpYSI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0eXBlID0gInR5cGUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmRlZmF1bHRWYWwgPSAiZGVmYXVsdCI7CisgICAgfTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZjb2xsZWN0aW9uKTsKK307CitzdHJ1Y3QgVm9sdW1lVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFZvbHVtZUN1cnZlLCBWb2x1bWVDdXJ2ZXM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJ2b2x1bWUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJ2b2x1bWVzIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnZvbHVtZVBvaW50VGFnID0gInBvaW50IjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpkZXZpY2VDYXRlZ29yeSA9ICJkZXZpY2VDYXRlZ29yeSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3RyZWFtID0gInN0cmVhbSI7IC8vIEZvciBsZWdhY3kgdm9sdW1lIGN1cnZlcworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJlZmVyZW5jZSA9ICJyZWYiOyAvKio8IEZvciB2b2x1bWUgY3VydmVzIGZhY3Rvcml6YXRpb24uICovCisgICAgfTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZjb2xsZWN0aW9uKTsKK307CitzdHJ1Y3QgVm9sdW1lR3JvdXBUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8Vm9sdW1lR3JvdXAsIFZvbHVtZUdyb3Vwcz4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInZvbHVtZUdyb3VwIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAidm9sdW1lR3JvdXBzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0cmVhbSA9ICJzdHJlYW0iOyAvLyBGb3IgbGVnYWN5IHZvbHVtZSBjdXJ2ZXMKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICppbmRleE1pbiA9ICJpbmRleE1pbiI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqaW5kZXhNYXggPSAiaW5kZXhNYXgiOworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9OworCit1c2luZyB4bWxDaGFyVW5pcXVlID0gc3RkOjp1bmlxdWVfcHRyPHhtbENoYXIsIGRlY2x0eXBlKHhtbEZyZWUpPjsKKworc3RkOjpzdHJpbmcgZ2V0WG1sQXR0cmlidXRlKGNvbnN0IHhtbE5vZGUgKmN1ciwgY29uc3QgY2hhciAqYXR0cmlidXRlKQoreworICAgIHhtbENoYXJVbmlxdWUgY2hhclB0cih4bWxHZXRQcm9wKGN1ciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyICo+KGF0dHJpYnV0ZSkpLCB4bWxGcmVlKTsKKyAgICBpZiAoY2hhclB0ciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdmFsdWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oY2hhclB0ci5nZXQoKSkpOworICAgIHJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgZ2V0UmVmZXJlbmNlKGNvbnN0IF94bWxOb2RlICpyb290LCBjb25zdCBfeG1sTm9kZSAqJnJlZk5vZGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcpCit7CisgICAgZm9yIChyb290ID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOyByb290ICE9IE5VTEw7IHJvb3QgPSByb290LT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopY29sbGVjdGlvblRhZykpIHsKKyAgICAgICAgICAgIGZvciAoeG1sTm9kZSAqY3VyID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKCgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilnUmVmZXJlbmNlRWxlbWVudE5hbWUpKSkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgZ1JlZmVyZW5jZUF0dHJpYnV0ZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVmTmFtZSA9PSBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWZOb2RlID0gY3VyOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYWl0Pgorc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplQ29sbGVjdGlvbihfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgJm5iU2tpcHBlZEVsZW1lbnQpCit7CisgICAgZm9yIChjdXIgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykgJiYKKyAgICAgICAgICAgIHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY3VyOworICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykpIHsKKyAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPnhtbENoaWxkcmVuTm9kZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFpdDo6ZGVzZXJpYWxpemUoZG9jLCBjaGlsZCwgY29sbGVjdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBuYlNraXBwZWRFbGVtZW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICphdHRyaWJ1dGVzQXR0cmlidXRlUmVmID0gImF0dHJpYnV0ZXNSZWYiOyAvKio8IGZvciBmYWN0b3JpemF0aW9uLiAqLworCitzdGF0aWMgc3RhdHVzX3QgcGFyc2VBdHRyaWJ1dGVzKGNvbnN0IF94bWxOb2RlICpjdXIsIGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcykKK3sKKyAgICBmb3IgKDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJDb250ZW50VHlwZSIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29udGVudFR5cGVYbWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAidmFsdWUiKTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlOworICAgICAgICAgICAgaWYgKG5vdCBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKGNvbnRlbnRUeXBlWG1sLmNfc3RyKCksIGNvbnRlbnRUeXBlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNvbnRlbnQgdHlwZSAlcyIsIGNvbnRlbnRUeXBlWG1sLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IGNvbnRlbnRUeXBlOworICAgICAgICAgICAgQUxPR1YoIiVzIGNvbnRlbnQgdHlwZSAlcyIsICBfX0ZVTkNUSU9OX18sIGNvbnRlbnRUeXBlWG1sLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIlVzYWdlIikpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZVhtbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJ2YWx1ZSIpOworICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZTsKKyAgICAgICAgICAgIGlmIChub3QgVXNhZ2VUeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHVzYWdlWG1sLmNfc3RyKCksIHVzYWdlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHVzYWdlICVzIiwgdXNhZ2VYbWwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UgPSB1c2FnZTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyB1c2FnZSAlcyIsICBfX0ZVTkNUSU9OX18sIHVzYWdlWG1sLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkZsYWdzIikpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBmbGFncyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJ2YWx1ZSIpOworCisgICAgICAgICAgICBBTE9HVigiJXMgZmxhZ3MgJXMiLCAgX19GVU5DVElPTl9fLCBmbGFncy5jX3N0cigpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMuZmxhZ3MgPSBBdWRpb0ZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKGZsYWdzLCAiICIpOworICAgICAgICB9CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkJ1bmRsZSIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgYnVuZGxlS2V5ID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgImtleSIpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgYnVuZGxlVmFsdWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAidmFsdWUiKTsKKworICAgICAgICAgICAgQUxPR1YoIiVzIEJ1bmRsZSAlcyAlcyIsICBfX0ZVTkNUSU9OX18sIGJ1bmRsZUtleS5jX3N0cigpLCBidW5kbGVWYWx1ZS5jX3N0cigpKTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGFncyhidW5kbGVLZXkgKyAiPSIgKyBidW5kbGVWYWx1ZSk7CisgICAgICAgICAgICBzdGQ6OnN0cm5jcHkoYXR0cmlidXRlcy50YWdzLCB0YWdzLmNfc3RyKCksIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplQXR0cmlidXRlcyhfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcykgeworICAgIC8vIFJldHJpZXZlIGNvbnRlbnQgdHlwZSwgdXNhZ2UsIGZsYWdzLCBhbmQgYnVuZGxlIGZyb20geG1sCisgICAgZm9yICg7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQXR0cmlidXRlcyIpKSkgeworICAgICAgICAgICAgY29uc3QgeG1sTm9kZSAqYXR0ck5vZGUgPSBjdXI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBhdHRyUmVmID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgYXR0cmlidXRlc0F0dHJpYnV0ZVJlZik7CisgICAgICAgICAgICBpZiAoIWF0dHJSZWYuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGdldFJlZmVyZW5jZSh4bWxEb2NHZXRSb290RWxlbWVudChkb2MpLCBhdHRyTm9kZSwgYXR0clJlZiwgYXR0cmlidXRlc0F0dHJpYnV0ZVJlZik7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJOb2RlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBObyByZWZlcmVuY2UgZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBhdHRyUmVmLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVBdHRyaWJ1dGVzKGRvYywgYXR0ck5vZGUtPnhtbENoaWxkcmVuTm9kZSwgYXR0cmlidXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcGFyc2VBdHRyaWJ1dGVzKGF0dHJOb2RlLT54bWxDaGlsZHJlbk5vZGUsIGF0dHJpYnV0ZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkNvbnRlbnRUeXBlIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJVc2FnZSIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiRmxhZ3MiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkJ1bmRsZSIpKSkgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlQXR0cmlidXRlcyhjdXIsIGF0dHJpYnV0ZXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXNDb2xsZWN0aW9uKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNWZWN0b3IgJmNvbGxlY3Rpb24pCit7CisgICAgc3RhdHVzX3QgcmV0ID0gQkFEX1ZBTFVFOworICAgIC8vIEVpdGhlciB3ZSBkbyBwcm92aWRlIG9ubHkgb25lIGF0dHJpYnV0ZXMgb3IgYSBjb2xsZWN0aW9uIG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzCisgICAgZm9yIChjdXIgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAobm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJBdHRyaWJ1dGVzIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJDb250ZW50VHlwZSIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiVXNhZ2UiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkZsYWdzIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJCdW5kbGUiKSkpIHsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIHJldCA9IGRlc2VyaWFsaXplQXR0cmlidXRlcyhkb2MsIGN1ciwgYXR0cmlidXRlcyk7CisgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5wdXNoX2JhY2soYXR0cmlidXRlcyk7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGRvbmUgaWYgdGhlICJBdHRyaWJ1dGVzIiBiYWxpc2UgaXMgb21pdHRlZCwgb25seSBvbmUgQXR0cmlidXRlcyBpcyBhbGxvd2VkCisgICAgICAgICAgICAgICAgaWYgKHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJBdHRyaWJ1dGVzIikpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IEF0dHJpYnV0ZXNHcm91cFRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmF0dHJpYnV0ZXNHcm91cCkKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCJBdHRyaWJ1dGVzR3JvdXBUcmFpdHMgTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKworICAgIHN0ZDo6c3RyaW5nIHZvbHVtZUdyb3VwID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjp2b2x1bWVHcm91cCk7CisgICAgaWYgKHZvbHVtZUdyb3VwLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnZvbHVtZUdyb3VwKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp2b2x1bWVHcm91cCwgdm9sdW1lR3JvdXAuY19zdHIoKSk7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKyAgICBzdGQ6OnN0cmluZyBzdHJlYW1UeXBlWG1sID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RyZWFtVHlwZVhtbC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW1UeXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnN0cmVhbVR5cGUsIHN0cmVhbVR5cGVYbWwuY19zdHIoKSk7CisgICAgICAgIGlmIChub3QgU3RyZWFtVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJlYW1UeXBlWG1sLmNfc3RyKCksIHN0cmVhbVR5cGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzdHJlYW0gdHlwZSAlcyIsIHN0cmVhbVR5cGVYbWwuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIEF0dHJpYnV0ZXNWZWN0b3IgYXR0cmlidXRlc1ZlY3Q7CisgICAgZGVzZXJpYWxpemVBdHRyaWJ1dGVzQ29sbGVjdGlvbihkb2MsIGNoaWxkLCBhdHRyaWJ1dGVzVmVjdCk7CisKKyAgICBhdHRyaWJ1dGVzR3JvdXAucHVzaF9iYWNrKHtuYW1lLCBzdHJlYW1UeXBlLCB2b2x1bWVHcm91cCwgYXR0cmlidXRlc1ZlY3R9KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFZhbHVlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsIENvbGxlY3Rpb24gJnZhbHVlcykKK3sKKyAgICBzdGQ6OnN0cmluZyBsaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpsaXRlcmFsKTsKKyAgICBpZiAobGl0ZXJhbC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpsaXRlcmFsKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgdWludDMyX3QgbnVtZXJpY2FsID0gMDsKKyAgICBzdGQ6OnN0cmluZyBudW1lcmljYWxUYWcgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om51bWVyaWNhbCk7CisgICAgaWYgKG51bWVyaWNhbFRhZy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpsaXRlcmFsKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFjb252ZXJ0VG8obnVtZXJpY2FsVGFnLCBudW1lcmljYWwpKSB7CisgICAgICAgIEFMT0dFKCIlczogOiBJbnZhbGlkIHZhbHVlKCVzKSIsIF9fRlVOQ1RJT05fXywgbnVtZXJpY2FsVGFnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICB2YWx1ZXMucHVzaF9iYWNrKHtudW1lcmljYWwsIGxpdGVyYWx9KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IENyaXRlcmlvblR5cGVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY3JpdGVyaW9uVHlwZXMpCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworCisgICAgc3RkOjpzdHJpbmcgdHlwZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6dHlwZSk7CisgICAgaWYgKHR5cGUuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dHlwZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlLmNfc3RyKCkpOworICAgIGJvb2wgaXNJbmNsdXNpdmUodHlwZSA9PSAiaW5jbHVzaXZlIik7CisKKyAgICBWYWx1ZVBhaXJzIHBhaXJzOworICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50cyA9IDA7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZhbHVlVHJhaXRzPihkb2MsIGNoaWxkLCBwYWlycywgbmJTa2lwcGVkRWxlbWVudHMpOworICAgIGNyaXRlcmlvblR5cGVzLnB1c2hfYmFjayh7bmFtZSwgaXNJbmNsdXNpdmUsIHBhaXJzfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBDcml0ZXJpb25UcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY3JpdGVyaWEpCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6ZGVmYXVsdFZhbCk7CisgICAgaWYgKGRlZmF1bHRWYWx1ZS5lbXB0eSgpKSB7CisgICAgICAgIC8vIE5vdCBtYW5kYXRvcnkgdG8gcHJvdmlkZSBhIGRlZmF1bHQgdmFsdWUgZm9yIGEgY3JpdGVyaW9uLCBldmVuIGl0IGlzIHJlY29tbWFuZGVkLi4uCisgICAgICAgIEFMT0dWKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIChidXQgcmVjb21tYW5kZWQpIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsLCBkZWZhdWx0VmFsdWUuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6dHlwZSk7CisgICAgaWYgKHR5cGVOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGVOYW1lLmNfc3RyKCkpOworCisgICAgY3JpdGVyaWEucHVzaF9iYWNrKHtuYW1lLCB0eXBlTmFtZSwgZGVmYXVsdFZhbHVlfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBQcm9kdWN0U3RyYXRlZ3lUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZzdHJhdGVnaWVzKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIlByb2R1Y3RTdHJhdGVneVRyYWl0cyBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworCisgICAgc2l6ZV90IHNraXBwZWQgPSAwOworICAgIEF0dHJpYnV0ZXNHcm91cHMgYXR0ckdyb3VwczsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXR0cmlidXRlc0dyb3VwVHJhaXRzPihkb2MsIGNoaWxkLCBhdHRyR3JvdXBzLCBza2lwcGVkKTsKKworICAgIHN0cmF0ZWdpZXMucHVzaF9iYWNrKHtuYW1lLCBhdHRyR3JvdXBzfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBWb2x1bWVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIENvbGxlY3Rpb24gJnZvbHVtZXMpCit7CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0ZWdvcnkgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOworICAgIGlmIChkZXZpY2VDYXRlZ29yeS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVmZXJlbmNlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpyZWZlcmVuY2UpOworICAgIGNvbnN0IF94bWxOb2RlICpyZWYgPSBOVUxMOworICAgIGlmICghcmVmZXJlbmNlTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGdldFJlZmVyZW5jZSh4bWxEb2NHZXRSb290RWxlbWVudChkb2MpLCByZWYsIHJlZmVyZW5jZU5hbWUsIGNvbGxlY3Rpb25UYWcpOworICAgICAgICBpZiAocmVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm8gcmVmZXJlbmNlIFB0ciBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIHJlZmVyZW5jZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIC8vIFJldHJpZXZlIGN1cnZlIHBvaW50IGZyb20gcmVmZXJlbmNlIGVsZW1lbnQgaWYgZm91bmQgb3IgZGlyZWN0bHkgZnJvbSBjdXJyZW50IGN1cnZlCisgICAgQ3VydmVQb2ludHMgY3VydmVQb2ludHM7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IHJlZmVyZW5jZU5hbWUuZW1wdHkoKSA/CisgICAgICAgICByb290LT54bWxDaGlsZHJlbk5vZGUgOiByZWYtPnhtbENoaWxkcmVuTm9kZTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKil2b2x1bWVQb2ludFRhZykpIHsKKyAgICAgICAgICAgIHhtbENoYXJVbmlxdWUgcG9pbnRYbWwoeG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSwgeG1sRnJlZSk7CisgICAgICAgICAgICBpZiAocG9pbnRYbWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiJXM6ICVzPSVzIiwgX19mdW5jX18sIHRhZywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gcG9pbnQ7CisgICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxEZWZhdWx0VHJhaXRzPGludD4+KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpLCBwb2ludCwgIiwiKTsKKyAgICAgICAgICAgIGlmIChwb2ludC5zaXplKCkgIT0gMikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlczogJXMiLCBfX2Z1bmNfXywgdm9sdW1lUG9pbnRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VydmVQb2ludHMucHVzaF9iYWNrKHtwb2ludFswXSwgcG9pbnRbMV19KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2x1bWVzLnB1c2hfYmFjayh7IGRldmljZUNhdGVnb3J5LCBjdXJ2ZVBvaW50cyB9KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFZvbHVtZUdyb3VwVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBDb2xsZWN0aW9uICZ2b2x1bWVzKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgaW50IGluZGV4TWluID0gMDsKKyAgICBpbnQgaW5kZXhNYXggPSAwOworICAgIFN0cmVhbVZlY3RvciBzdHJlYW1zID0ge307CisgICAgQXR0cmlidXRlc1ZlY3RvciBhdHRyaWJ1dGVzVmVjdCA9IHt9OworCisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICBpZiAobm90IHhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilBdHRyaWJ1dGVzOjpuYW1lKSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBuYW1lWG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgaWYgKG5hbWVYbWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obmFtZVhtbC5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopQXR0cmlidXRlczo6aW5kZXhNaW4pKSB7CisgICAgICAgICAgICB4bWxDaGFyVW5pcXVlIGluZGV4TWluWG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgaWYgKGluZGV4TWluWG1sID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXhNaW5MaXRlcmFsKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGluZGV4TWluWG1sLmdldCgpKSk7CisgICAgICAgICAgICBpZiAoIWNvbnZlcnRUbyhpbmRleE1pbkxpdGVyYWwsIGluZGV4TWluKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopQXR0cmlidXRlczo6aW5kZXhNYXgpKSB7CisgICAgICAgICAgICB4bWxDaGFyVW5pcXVlIGluZGV4TWF4WG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgaWYgKGluZGV4TWF4WG1sID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXhNYXhMaXRlcmFsKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGluZGV4TWF4WG1sLmdldCgpKSk7CisgICAgICAgICAgICBpZiAoIWNvbnZlcnRUbyhpbmRleE1heExpdGVyYWwsIGluZGV4TWF4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZGVzZXJpYWxpemVBdHRyaWJ1dGVzQ29sbGVjdGlvbihkb2MsIHJvb3QsIGF0dHJpYnV0ZXNWZWN0KTsKKworICAgIHN0ZDo6c3RyaW5nIHN0cmVhbU5hbWVzOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtcykgeworICAgICAgICBzdHJlYW1OYW1lcyArPSBhbmRyb2lkOjp0b1N0cmluZyhzdHJlYW0pICsgIiAiOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBhdHRybU5hbWVzOworICAgIGZvciAoY29uc3QgYXV0byAmYXR0ciA6IGF0dHJpYnV0ZXNWZWN0KSB7CisgICAgICAgIGF0dHJtTmFtZXMgKz0gYW5kcm9pZDo6dG9TdHJpbmcoYXR0cikgKyAiXG4iOworICAgIH0KKyAgICBBTE9HVigiJXM6IGdyb3VwPSVzIGluZGV4TWluPSVkLCBpbmRleE1heD0lZCBzdHJlYW1zPSVzIGF0dHJpYnV0ZXM9JXMiLAorICAgICAgICAgIF9fZnVuY19fLCBuYW1lLmNfc3RyKCksIGluZGV4TWluLCBpbmRleE1heCwgc3RyZWFtTmFtZXMuY19zdHIoKSwgYXR0cm1OYW1lcy5jX3N0ciggKSk7CisKKyAgICBWb2x1bWVDdXJ2ZXMgZ3JvdXBWb2x1bWVDdXJ2ZXM7CisgICAgc2l6ZV90IHNraXBwZWQgPSAwOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxWb2x1bWVUcmFpdHM+KGRvYywgcm9vdCwgZ3JvdXBWb2x1bWVDdXJ2ZXMsIHNraXBwZWQpOworICAgIHZvbHVtZXMucHVzaF9iYWNrKHsgbmFtZSwgaW5kZXhNaW4sIGluZGV4TWF4LCBncm91cFZvbHVtZUN1cnZlcyB9KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbGVnYWN5Vm9sdW1lY29sbGVjdGlvblRhZyA9ICJ2b2x1bWVzIjsKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbGVnYWN5Vm9sdW1lVGFnID0gInZvbHVtZSI7CisKK3N0YXR1c190IGRlc2VyaWFsaXplTGVnYWN5Vm9sdW1lKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBWb2x1bWVDdXJ2ZXM+ICZsZWdhY3lWb2x1bWVzKQoreworICAgIHN0ZDo6c3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInN0cmVhbSIpOworICAgIGlmIChzdHJlYW1UeXBlTGl0ZXJhbC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlIHN0cmVhbSBmb3VuZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgImRldmljZUNhdGVnb3J5Iik7CisgICAgaWYgKGRldmljZUNhdGVnb3J5TGl0ZXJhbC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlIGRldmljZUNhdGVnb3J5IGZvdW5kIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyByZWZlcmVuY2VOYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInJlZiIpOworICAgIGNvbnN0IHhtbE5vZGUgKnJlZiA9IE5VTEw7CisgICAgaWYgKCFyZWZlcmVuY2VOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgZ2V0UmVmZXJlbmNlKHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyksIHJlZiwgcmVmZXJlbmNlTmFtZSwgbGVnYWN5Vm9sdW1lY29sbGVjdGlvblRhZyk7CisgICAgICAgIGlmIChyZWYgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBObyByZWZlcmVuY2UgUHRyIGZvdW5kIGZvciAlcyIsIF9fZnVuY19fLCByZWZlcmVuY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJXM6IHJlZmVyZW5jZSBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKKyAgICB9CisgICAgQ3VydmVQb2ludHMgY3VydmVQb2ludHM7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IHJlZmVyZW5jZU5hbWUuZW1wdHkoKSA/CisgICAgICAgICBjdXItPnhtbENoaWxkcmVuTm9kZSA6IHJlZi0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVZvbHVtZVRyYWl0czo6dm9sdW1lUG9pbnRUYWcpKSB7CisgICAgICAgICAgICB4bWxDaGFyVW5pcXVlIHBvaW50WG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgaWYgKHBvaW50WG1sID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIiVzOiAlcz0lcyIsIF9fZnVuY19fLCBsZWdhY3lWb2x1bWVUYWcsCisgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBwb2ludDsKKyAgICAgICAgICAgIGNvbGxlY3Rpb25Gcm9tU3RyaW5nPERlZmF1bHRUcmFpdHM8aW50Pj4oCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSksIHBvaW50LCAiLCIpOworICAgICAgICAgICAgaWYgKHBvaW50LnNpemUoKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzOiAlcyIsIF9fZnVuY19fLCBWb2x1bWVUcmFpdHM6OnZvbHVtZVBvaW50VGFnLAorICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2hfYmFjayh7cG9pbnRbMF0sIHBvaW50WzFdfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGVnYWN5Vm9sdW1lc1tzdHJlYW1UeXBlTGl0ZXJhbF0ucHVzaF9iYWNrKHsgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLCBjdXJ2ZVBvaW50cyB9KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUxlZ2FjeVZvbHVtZUNvbGxlY3Rpb24oX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVHcm91cHMgJnZvbHVtZUdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICZuYlNraXBwZWRFbGVtZW50KQoreworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBWb2x1bWVDdXJ2ZXM+IGxlZ2FjeVZvbHVtZU1hcDsKKyAgICBmb3IgKGN1ciA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICh4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWxlZ2FjeVZvbHVtZWNvbGxlY3Rpb25UYWcpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOworICAgICAgICBmb3IgKDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopbGVnYWN5Vm9sdW1lVGFnKSkgeworCisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVMZWdhY3lWb2x1bWUoZG9jLCBjaGlsZCwgbGVnYWN5Vm9sdW1lTWFwKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIG5iU2tpcHBlZEVsZW1lbnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZ2b2x1bWVNYXBJdGVyIDogbGVnYWN5Vm9sdW1lTWFwKSB7CisgICAgICAgIC8vIEluIG9yZGVyIHRvIGxldCBBdWRpb1NlcnZpY2Ugc2V0dGluZyB0aGUgbWluIGFuZCBtYXggKGNvbXBhdGliaWxpdHkpLCBzZXQgTWluIGFuZCBNYXgKKyAgICAgICAgLy8gdG8gLTEgZXhjZXB0IGZvciBwcml2YXRlIHN0cmVhbXMKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOworICAgICAgICBpZiAoIVN0cmVhbVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcodm9sdW1lTWFwSXRlci5maXJzdCwgc3RyZWFtVHlwZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBzdHJlYW0gJXMiLCBfX2Z1bmNfXywgdm9sdW1lTWFwSXRlci5maXJzdC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaW50IGluZGV4TWluID0gc3RyZWFtVHlwZSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCA/IDAgOiAtMTsKKyAgICAgICAgaW50IGluZGV4TWF4ID0gc3RyZWFtVHlwZSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCA/IDEwMCA6IC0xOworICAgICAgICB2b2x1bWVHcm91cHMucHVzaF9iYWNrKHsgdm9sdW1lTWFwSXRlci5maXJzdCwgaW5kZXhNaW4sIGluZGV4TWF4LCB2b2x1bWVNYXBJdGVyLnNlY29uZCB9KTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICB4bWxEb2NQdHIgZG9jOworICAgIGRvYyA9IHhtbFBhcnNlRmlsZShwYXRoKTsKKyAgICBpZiAoZG9jID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDB9OworICAgIH0KKyAgICB4bWxOb2RlUHRyIGN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7CisgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlOiBlbXB0eSBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICAgICAgcmV0dXJuIHtudWxscHRyLCAwfTsKKyAgICB9CisgICAgaWYgKHhtbFhJbmNsdWRlUHJvY2Vzcyhkb2MpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IGxpYnhtbCBmYWlsZWQgdG8gcmVzb2x2ZSBYSW5jbHVkZXMgb24gZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDB9OworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB2ZXJzaW9uID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgZ1ZlcnNpb25BdHRyaWJ1dGUpOworICAgIGlmICh2ZXJzaW9uLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyB2ZXJzaW9uIGZvdW5kIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDB9OworICAgIH0KKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudHMgPSAwOworICAgIGF1dG8gY29uZmlnID0gc3RkOjptYWtlX3VuaXF1ZTxDb25maWc+KCk7CisgICAgY29uZmlnLT52ZXJzaW9uID0gc3RkOjpzdG9mKHZlcnNpb24pOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxQcm9kdWN0U3RyYXRlZ3lUcmFpdHM+KAorICAgICAgICAgICAgICAgIGRvYywgY3VyLCBjb25maWctPnByb2R1Y3RTdHJhdGVnaWVzLCBuYlNraXBwZWRFbGVtZW50cyk7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPENyaXRlcmlvblRyYWl0cz4oCisgICAgICAgICAgICAgICAgZG9jLCBjdXIsIGNvbmZpZy0+Y3JpdGVyaWEsIG5iU2tpcHBlZEVsZW1lbnRzKTsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Q3JpdGVyaW9uVHlwZVRyYWl0cz4oCisgICAgICAgICAgICAgICAgZG9jLCBjdXIsIGNvbmZpZy0+Y3JpdGVyaW9uVHlwZXMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Vm9sdW1lR3JvdXBUcmFpdHM+KAorICAgICAgICAgICAgICAgIGRvYywgY3VyLCBjb25maWctPnZvbHVtZUdyb3VwcywgbmJTa2lwcGVkRWxlbWVudHMpOworCisgICAgcmV0dXJuIHtzdGQ6Om1vdmUoY29uZmlnKSwgbmJTa2lwcGVkRWxlbWVudHN9OworfQorCithbmRyb2lkOjpzdGF0dXNfdCBwYXJzZUxlZ2FjeVZvbHVtZUZpbGUoY29uc3QgY2hhciogcGF0aCwgVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMpIHsKKyAgICB4bWxEb2NQdHIgZG9jOworICAgIGRvYyA9IHhtbFBhcnNlRmlsZShwYXRoKTsKKyAgICBpZiAoZG9jID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICB4bWxOb2RlUHRyIGN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7CisgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlOiBlbXB0eSBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHhtbFhJbmNsdWRlUHJvY2Vzcyhkb2MpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IGxpYnhtbCBmYWlsZWQgdG8gcmVzb2x2ZSBYSW5jbHVkZXMgb24gZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudHMgPSAwOworICAgIHJldHVybiBkZXNlcmlhbGl6ZUxlZ2FjeVZvbHVtZUNvbGxlY3Rpb24oZG9jLCBjdXIsIHZvbHVtZUdyb3VwcywgbmJTa2lwcGVkRWxlbWVudHMpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqa0NvbmZpZ0xvY2F0aW9uTGlzdFtdID0geyIvb2RtL2V0YyIsICIvdmVuZG9yL2V0YyIsICIvc3lzdGVtL2V0YyJ9Oworc3RhdGljIGNvbnN0IGludCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZSA9CisgICAgICAgIChzaXplb2Yoa0NvbmZpZ0xvY2F0aW9uTGlzdCkgLyBzaXplb2Yoa0NvbmZpZ0xvY2F0aW9uTGlzdFswXSkpOworc3RhdGljIGNvbnN0IGludCBnQXBtWG1sQ29uZmlnRmlsZVBhdGhNYXhMZW5ndGggPSAxMjg7CisKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYXBtWG1sQ29uZmlnRmlsZU5hbWUgPSAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIjsKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYXBtQTJkcE9mZmxvYWREaXNhYmxlZFhtbENvbmZpZ0ZpbGVOYW1lID0KKyAgICAgICAgImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2EyZHBfb2ZmbG9hZF9kaXNhYmxlZC54bWwiOworCithbmRyb2lkOjpzdGF0dXNfdCBwYXJzZUxlZ2FjeVZvbHVtZXMoVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMpIHsKKyAgICBjaGFyIGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZVtnQXBtWG1sQ29uZmlnRmlsZVBhdGhNYXhMZW5ndGhdOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gZmlsZU5hbWVzOworICAgIHN0YXR1c190IHJldDsKKworICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5zdXBwb3J0ZWQiLCBmYWxzZSkgJiYKKyAgICAgICAgICAgIHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmJsdWV0b290aC5hMmRwX29mZmxvYWQuZGlzYWJsZWQiLCBmYWxzZSkpIHsKKyAgICAgICAgLy8gQTJEUCBvZmZsb2FkIHN1cHBvcnRlZCBidXQgZGlzYWJsZWQ6IHRyeSB0byB1c2Ugc3BlY2lhbCBYTUwgZmlsZQorICAgICAgICBmaWxlTmFtZXMucHVzaF9iYWNrKGFwbUEyZHBPZmZsb2FkRGlzYWJsZWRYbWxDb25maWdGaWxlTmFtZSk7CisgICAgfQorICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soYXBtWG1sQ29uZmlnRmlsZU5hbWUpOworCisgICAgZm9yIChjb25zdCBjaGFyKiBmaWxlTmFtZSA6IGZpbGVOYW1lcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb25maWdMb2NhdGlvbkxpc3RTaXplOyBpKyspIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgc2l6ZW9mKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSksCisgICAgICAgICAgICAgICAgICAgICAiJXMvJXMiLCBrQ29uZmlnTG9jYXRpb25MaXN0W2ldLCBmaWxlTmFtZSk7CisgICAgICAgICAgICByZXQgPSBwYXJzZUxlZ2FjeVZvbHVtZUZpbGUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCB2b2x1bWVHcm91cHMpOworICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworfSAvLyBuYW1lc3BhY2UgZW5naW5lQ29uZmlnCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhNDJiNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQW5kcm9pZC5icApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oCmluZGV4IDA0NTk0ZjUuLmI3ZmQwMzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaApAQCAtMTcsNyArMTcsMTAgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KKyNpbmNsdWRlIDxJVm9sdW1lQ3VydmVzLmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8Vm9sdW1lLmg+CiAjaW5jbHVkZSA8SHdNb2R1bGUuaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CkBAIC0yOCw2ICszMSwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIERldmljZVN0cmF0ZWd5TWFwID0gc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBEZXZpY2VWZWN0b3I+OwordXNpbmcgU3RyYXRlZ3lWZWN0b3IgPSBzdGQ6OnZlY3Rvcjxwcm9kdWN0X3N0cmF0ZWd5X3Q+OwordXNpbmcgVm9sdW1lR3JvdXBWZWN0b3IgPSBzdGQ6OnZlY3Rvcjx2b2x1bWVfZ3JvdXBfdD47CisKIC8qKgogICogVGhpcyBpbnRlcmZhY2UgaXMgZGVkaWNhdGVkIHRvIHRoZSBwb2xpY3kgbWFuYWdlciB0aGF0IGEgUG9saWN5IEVuZ2luZSBzaGFsbCBpbXBsZW1lbnQuCiAgKi8KQEAgLTUwLDQyICs1Nyw2IEBACiAgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikgPSAwOwogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBpbnB1dCBkZXZpY2Ugc2VsZWN0ZWQgZm9yIGEgZ2l2ZW4gaW5wdXQgc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBpbnB1dFNvdXJjZSB0byBnZXQgdGhlIHNlbGVjdGVkIGlucHV0IGRldmljZSBhc3NvY2lhdGVkIHRvCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHNlbGVjdGVkIGlucHV0IGRldmljZSBmb3IgdGhlIGdpdmVuIGlucHV0IHNvdXJjZSwgbWF5IGJlIG5vbmUgaWYgZXJyb3IuCi0gICAgICovCi0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgb3V0cHV0IGRldmljZSBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gc3RyYXRlZ3kuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHN0cmVhbSB0eXBlIGZvciB3aGljaCB0aGUgc2VsZWN0ZWQgb3VwdXQgZGV2aWNlIGlzIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc2VsZWN0ZWQgb3VwdXQgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3ksIG1heSBiZSBub25lIGlmIGVycm9yLgotICAgICAqLwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RhdGVneSkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdHJhdGVneSBzZWxlY3RlZCBmb3IgYSBnaXZlbiBzdHJlYW0gdHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtOiBmb3Igd2hpY2ggdGhlIHNlbGVjdGVkIHN0cmF0ZWd5IGZvbGxvd2VkIGJ5IGlzIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQuCi0gICAgICovCi0gICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0cmF0ZWd5IHNlbGVjdGVkIGZvciBhIGdpdmVuIHVzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSB1c2FnZSB0byBnZXQgdGhlIHNlbGVjdGVkIHN0cmF0ZWd5IGZvbGxvd2VkIGJ5LgotICAgICAqCi0gICAgICogQHJldHVybiBzdHJhdGVneSB0byBiZSBmb2xsb3dlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBTZXQgdGhlIFRlbGVwaG9ueSBNb2RlLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBtb2RlOiBBbmRyb2lkIFBob25lIHN0YXRlIChub3JtYWwsIHJpbmd0b25lLCBjc3YsIGluIGNvbW11bmljYXRpb24pCkBAIC0xMzMsNiArMTA0LDE5NiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkRldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0cmF0ZWd5IHNlbGVjdGVkIGZvciBhIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGF1ZGlvIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoZSBzZWxlY3RlZCBAcHJvZHVjdF9zdHJhdGVneV90IGZvbGxvd2VkIGJ5LgorICAgICAqCisgICAgICogQHJldHVybiBAcHJvZHVjdF9zdHJhdGVneV90IHRvIGJlIGZvbGxvd2VkLgorICAgICAqLworICAgIHZpcnR1YWwgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyByZXRyaWV2ZXMgdGhlIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgZ2l2ZW4KKyAgICAgKiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIG9mIHRoZSBvdXRwdXQgcmVxdWVzdGluZyBEZXZpY2Uocykgc2VsZWN0aW9uCisgICAgICogQHBhcmFtIHByZWZlcmVkRGV2aWNlIHZhbGlkIHJlZmVyZW5jZSBpZiBhIHByZWZlcmVkIGRldmljZSBpcyByZXF1ZXN0ZWQsIG51bGxwdHIgb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBmcm9tQ2FjaGUgaWYgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIGludGVybmFsIGNhY2hlLAorICAgICAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZWQgYnkgY3VycmVudCBzdGF0ZSAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCisgICAgICogQHJldHVybiB2ZWN0b3Igb2Ygc2VsZWN0ZWQgZGV2aWNlIGRlc2NyaXB0b3JzLgorICAgICAqICAgICAgICAgQXBwcm9wcmlhdGUgZGV2aWNlIGZvciBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBhdWRpbyBhdHRyaWJ1dGVzIGFjY29yZGluZworICAgICAqICAgICAgICAgdG8gY3VycmVudCBwaG9uZSBzdGF0ZSwgZm9yY2VkIHN0YXRlcywgY29ubmVjdGVkIGRldmljZXMuLi4KKyAgICAgKiAgICAgICAgIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gaW50ZXJuYWwgY2FjaGUsCisgICAgICogICAgICAgICBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lZCBieSBjdXJyZW50IHN0YXRlIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLCBmb3JjZSB1c2UsCisgICAgICogICAgICAgICBhMmRwIG91dHB1dC4uLikKKyAgICAgKiBUaGlzIGFsbG93cyB0bzoKKyAgICAgKiAgICAgIDEgc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBzdGF0ZSBpcyBzdGFibGUgKHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgYW4gb3V0cHV0KQorICAgICAqICAgICAgMiBhY2Nlc3MgdG8gZWl0aGVyIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IHRydWUpIG9yCisgICAgICogICAgICAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0CisgICAgICogICAgICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECisgICAgICogICAgICBiZWZvcmUgbWFuYWdlciB1cGRhdGVzIGl0cyBvdXRwdXRzLgorICAgICAqLworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcmVkRGV2aWNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtIExlZ2FjeSBmdW5jdGlvbiByZXRyaWV2aW5nIGRldmljZXMgZnJvbSBhIHN0cmVhbSB0eXBlLgorICAgICAqIEBwYXJhbSBzdHJlYW0gdHlwZSBvZiB0aGUgb3V0cHV0IHJlcXVlc3RpbmcgRGV2aWNlKHMpIHNlbGVjdGlvbgorICAgICAqIEBwYXJhbSBmcm9tQ2FjaGUgaWYgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIGludGVybmFsIGNhY2hlLAorICAgICAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZWQgYnkgY3VycmVudCBzdGF0ZSAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCisgICAgICogQHJldHVybiBhcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIGF1ZGlvIGF0dHJpYnV0ZXMgYWNjb3JkaW5nCisgICAgICogICAgICAgICB0byBjdXJyZW50IHBob25lIHN0YXRlLCBmb3JjZWQgc3RhdGVzLCBjb25uZWN0ZWQgZGV2aWNlcy4uLgorICAgICAqICAgICAgICAgaWYgZnJvbUNhY2hlIGlzIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBpbnRlcm5hbCBjYWNoZSwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmVkIGJ5IGN1cnJlbnQgc3RhdGUgKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwKKyAgICAgKiAgICAgICAgIGEyZHAgb3V0cHV0Li4uKQorICAgICAqIFRoaXMgYWxsb3dzIHRvOgorICAgICAqICAgICAgMSBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIHN0YXRlIGlzIHN0YWJsZSAod2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBhbiBvdXRwdXQpCisgICAgICogICAgICAyIGFjY2VzcyB0byBlaXRoZXIgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gdHJ1ZSkgb3IKKyAgICAgKiAgICAgICJmdXR1cmUiIGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSBmYWxzZSkgd2hlbiBjYWxsZWQgZnJvbSBhIGNvbnRleHQKKyAgICAgKiAgICAgIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGNoYW5naW5nIChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSwgc2V0UGhvbmVTdGF0ZSgpLi4uKSBBTkQKKyAgICAgKiAgICAgIGJlZm9yZSBtYW5hZ2VyIHVwZGF0ZXMgaXRzIG91dHB1dHMuCisgICAgICovCisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5wdXQgZGV2aWNlIHNlbGVjdGVkIGZvciBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBhdHRyIGF1ZGlvIGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIKKyAgICAgKiBAcGFyYW1bb3V0XSBtaXggdG8gYmUgdXNlZCBpZiBhIG1peCBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqIEByZXR1cm4gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGZvciB0aGUgYXVkaW8gYXR0cmlidXRlcywgbWF5IGJlIG51bGwgaWYgZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqbWl4ID0gbnVsbHB0cikgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsZWdhY3kgc3RyZWFtIHR5cGUgZm9yIGEgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gYXVkaW8gYXR0cmlidXRlcyB0byBnZXQgdGhlIGFzc29jaWF0ZWQgYXVkaW9fc3RyZWFtX3R5cGVfdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYXVkaW9fc3RyZWFtX3R5cGVfdCBhc3NvY2lhdGVkIHRvIHRoZSBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldEF0dHJpYnV0ZXNGb3JTdHJlYW0gZ2V0IHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGZyb20gbGVnYWN5IHN0cmVhbSB0eXBlCisgICAgICogQXR0cmlidXRlcyByZXR1cm5lZCBtaWdodCBvbmx5IGJlIHVzZWQgdG8gY2hlY2sgdXBvbiByb3V0aW5nIGRlY2lzaW9uLCBub3Qgdm9sdW1lIGRlY2lzaW9ucy4KKyAgICAgKiBAcGFyYW0gc3RyZWFtIHRvIGNvbnNpZGVyCisgICAgICogQHJldHVybiBhdWRpbyBhdHRyaWJ1dGVzIG1hdGNoaW5nIHRoZSBsZWdhY3kgc3RyZWFtIHR5cGUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5IHJldHJpZXZlcyB0aGUgbGlzdCBvZiBsZWdhY3kgc3RyZWFtIHR5cGUgZm9sbG93aW5nCisgICAgICogdGhlIGdpdmVuIHByb2R1Y3Qgc3RyYXRlZ3kKKyAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0byBjb25zaWRlcgorICAgICAqIEByZXR1cm4gYXNzb2NpYXRlZCBsZWdhY3kgU3RyZWFtIFR5cGVzIHZlY3RvciBvZiB0aGUgZ2l2ZW4gcHJvZHVjdCBzdHJhdGVneQorICAgICAqLworICAgIHZpcnR1YWwgU3RyZWFtVHlwZVZlY3RvciBnZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5IHJldHJpZXZlcyBhbGwgdGhlIGF0dHJpYnV0ZXMgZm9sbG93aW5nIHRoZSBnaXZlbgorICAgICAqIHByb2R1Y3Qgc3RyYXRlZ3kuIEFueSBhdHRyaWJ1dGVzIHRoYXQgIm1hdGNoZXMiIHdpdGggdGhpcyBvbmUgd2lsbCBmb2xsb3cgdGhlIHByb2R1Y3QKKyAgICAgKiBzdHJhdGVneS4KKyAgICAgKiAibWF0Y2hpbmciIG1lYW5zIHRoZSB1c2FnZSBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgYSBkZWZpbmVkIHVzYWdlLCBBTkQKKyAgICAgKiBjb250ZW50IHR5cGUgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGEgZGVmaW5lZCBjb250ZW50IHR5cGUgQU5ECisgICAgICogZmxhZ3Mgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGRlZmluZWQgZmxhZ3MgQU5ECisgICAgICogdGFncyBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgZGVmaW5lZCB0YWdzLgorICAgICAqIEBwYXJhbSBwcyBwcm9kdWN0IHN0cmF0ZWd5IHRvIGNvbnNpZGVyCisgICAgICogQHJldHVybiB2ZWN0b3Igb2YgcHJvZHVjdCBzdHJhdGVneSBpZHMsIGVtcHR5IGlmIHVua25vd24gc3RyYXRlZ3kuCisgICAgICovCisgICAgdmlydHVhbCBBdHRyaWJ1dGVzVmVjdG9yIGdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0T3JkZXJlZEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMKKyAgICAgKiBAcmV0dXJuIHByaW9yaXR5IG9yZGVyZWQgcHJvZHVjdCBzdHJhdGVnaWVzIHRvIGhlbHAgdGhlIEF1ZGlvUG9saWN5TWFuYWdlciBldmFsdWF0aW5nIHRoZQorICAgICAqIGRldmljZSBzZWxlY3Rpb24gcGVyIG91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIHByaW9yaXRpemVkIHN0cmF0ZWdpZXMuCisgICAgICovCisgICAgdmlydHVhbCBTdHJhdGVneVZlY3RvciBnZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUuIERldmljZSBzZWxlY3Rpb24gZm9yIEF1ZGlvQXR0cmlidXRlIC8gU3RyZWFtcyBpcyBjYWNoZWQKKyAgICAgKiBpbiB0aGUgZW5naW5lIGluIG9yZGVyIHRvIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgYXVkaW8gc3lzdGVtIGlzIHN0YWJsZS4KKyAgICAgKiBXaGVuIGEgZGV2aWNlIGlzIGNvbm5lY3RlZCwgdGhlIGFuZHJvaWQgbW9kZSBpcyBjaGFuZ2VkLCBlbmdpbmUgaXMgbm90aWZpZWQgYW5kIGNhbiB1cGRhdGUKKyAgICAgKiB0aGUgY2FjaGUuCisgICAgICogV2hlbiBzdGFydGluZyAvIHN0b3BwaW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24sIHRoZSBlbmdpbmUKKyAgICAgKiBuZWVkcyB0byB1cGRhdGUgdGhlIGNhY2hlIHVwb24gdGhpcyBmdW5jdGlvbiBjYWxsLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcy4gSW50cm9zcGVjdGlvbiBBUEkgdG8gcmV0cmlldmUgYSBjb2xsZWN0aW9uIG9mCisgICAgICogQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgdGhhdCBhbGxvd3MgdG8gYnVpbGQgQXVkaW9BdHRyaWJ1dGVzIGFjY29yZGluZyB0byBhCisgICAgICogcHJvZHVjdF9zdHJhdGVneSB3aGljaCBpcyBqdXN0IGFuIGluZGV4LiBJdCBoYXMgYWxzbyBhIGh1bWFuIHJlYWRhYmxlIG5hbWUgdG8gaGVscCB0aGUKKyAgICAgKiBDYXIvT2VtL0F1ZGlvTWFuYWdlciBpZGVudGl5aW5nIHRoZSB1c2UgY2FzZS4KKyAgICAgKiBAcGFyYW0gc3RyYXRlZ2llcyBjb2xsZWN0aW9uLgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIGxpc3QgaGFzIGJlZW4gcmV0cmlldmVkLCBlcnJvciBjb2RlIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzIHJldHJpZXZlcyB0aGUgVm9sdW1lIEN1cnZlcyBpbnRlcmZhY2UgZm9yIHRoZQorICAgICAqICAgICAgICByZXF1ZXN0ZWQgQXVkaW8gQXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gYXR0ciB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiBJVm9sdW1lQ3VydmVzIGludGVyZmFjZSBwb2ludGVyIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgSVZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlIHJldHJpZXZlcyB0aGUgVm9sdW1lIEN1cnZlcyBpbnRlcmZhY2UgZm9yIHRoZSBzdHJlYW0KKyAgICAgKiBAcGFyYW0gc3RyZWFtIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIElWb2x1bWVDdXJ2ZXMgaW50ZXJmYWNlIHBvaW50ZXIgaWYgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlCisgICAgICovCisgICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lQ3VydmVzRm9yVm9sdW1lR3JvdXAgcmV0cmlldmVzIHRoZSBWb2x1bWUgQ3VydmVzIGludGVyZmFjZSBmb3Igdm9sdW1lIGdyb3VwCisgICAgICogQHBhcmFtIGdyb3VwIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIElWb2x1bWVDdXJ2ZXMgaW50ZXJmYWNlIHBvaW50ZXIgaWYgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlCisgICAgICovCisgICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JWb2x1bWVHcm91cCh2b2x1bWVfZ3JvdXBfdCBncm91cCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFZvbHVtZUdyb3VwcyByZXRyaWV2ZXMgdGhlIGNvbGxlY3Rpb24gb2Ygdm9sdW1lIGdyb3Vwcy4KKyAgICAgKiBAcmV0dXJuIHZlY3RvciBvZiB2b2x1bWUgZ3JvdXBzCisgICAgICovCisgICAgdmlydHVhbCBWb2x1bWVHcm91cFZlY3RvciBnZXRWb2x1bWVHcm91cHMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzIGdldHMgdGhlIGFwcHJvcHJpYXRlIHZvbHVtZSBncm91cCB0byBiZSB1c2VkIGZvciBhIGdpdmVuCisgICAgICogQXVkaW8gQXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gYXR0ciB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB2b2x1bWUgZ3JvdXAgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcywgZGVmYXVsdCBncm91cCBpZiBub25lCisgICAgICogYXBwbGljYWJsZSwgVk9MVU1FX0dST1VQX05PTkUgaWYgbm8gZGVmYXVsdCBncm91cCBkZWZpbmVkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZSBnZXRzIHRoZSBhcHByb3ByaWF0ZSB2b2x1bWUgZ3JvdXAgdG8gYmUgdXNlZCBmb3IgYSBnaXZlbgorICAgICAqIGxlZ2FjeSBzdHJlYW0gdHlwZQorICAgICAqIEBwYXJhbSBzdHJlYW0gdHlwZSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB2b2x1bWUgZ3JvdXAgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUsIGRlZmF1bHQgZ3JvdXAgaWYgbm9uZSBhcHBsaWNhYmxlLAorICAgICAqIFZPTFVNRV9HUk9VUF9OT05FIGlmIG5vIGRlZmF1bHQgZ3JvdXAgZGVmaW5lZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyBpbnRyb3NwZWN0aW9uIEFQSSB0byBnZXQgdGhlIEF1ZGlvIFZvbHVtZSBHcm91cHMsIGFrYQorICAgICAqIGZvcm1lciBzdHJlYW0gYWxpYXNlcyBpbiBBdWRpbyBTZXJ2aWNlLCBkZWZpbmluZyB2b2x1bWUgY3VydmVzIGF0dGFjaGVkIHRvIG9uZSBvciBtb3JlCisgICAgICogQXVkaW8gQXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gZ3JvdXBzCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgdm9sdW1lIGdyb3VwcyB3ZXJlIHJldHJpZXZlZCBzdWNjZXNzZnVsbHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0ID0gMDsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSgpIHt9CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCmluZGV4IGI3OTAyY2YuLjQzYmE2MjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmgKQEAgLTE2LDcgKzE2LDYgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oPgogI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KQEAgLTUxLDggKzUwLDYgQEAKIAogICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRBdmFpbGFibGVJbnB1dERldmljZXMoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICZnZXRWb2x1bWVDdXJ2ZXMoKSA9IDA7Ci0KICAgICB2aXJ0dWFsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgPSAwOwogCiBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLm1rCmluZGV4IGMyMTA1ZTkuLjg0YTQ0MjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLm1rCkBAIC0xMSwxNCArMTEsMTEgQEAKICAgICBzcmMvRW5naW5lLmNwcCBcCiAgICAgc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBcCiAgICAgc3JjL1N0cmVhbS5jcHAgXAotICAgIHNyYy9TdHJhdGVneS5jcHAgXAotICAgIHNyYy9Vc2FnZS5jcHAgXAogICAgIHNyYy9JbnB1dFNvdXJjZS5jcHAgXAogCiBhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbiA6PSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UKIAogTE9DQUxfQ0ZMQUdTICs9IFwKICAgICAtV2FsbCBcCkBAIC0zMiw4ICsyOSwxMSBAQAogICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pIFwKICAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvaHcgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBmcmFtZXdvcmtzLWF2KSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZQorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzCiAKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKQEAgLTQyLDE2ICs0MiwxOSBAQAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeXBmd3dyYXBwZXIgXAotICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cworICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uIFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZV9jb25maWcgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJsb2cgXAotICAgIGxpYmN1dGlscyBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZyBcCisgICAgbGliY3V0aWxzIFwKICAgICBsaWJhdWRpb3V0aWxzIFwKICAgICBsaWJwYXJhbWV0ZXIgXAogICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGliYXVkaW9wb2xpY3kgXAogICAgIGxpYnhtbDIKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL0FuZHJvaWQubWsKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tawpjb3B5IHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzI3MWI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNDkgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworVE9PTFMgOj0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMKK1BST1ZJU0lPTl9DUklURVJJT05fVFlQRVMgOj0gJChUT09MUykvcHJvdmlzaW9uX2NyaXRlcmlvbl90eXBlc19mcm9tX2FuZHJvaWRfaGVhZGVycy5taworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBUT1AgRklMRQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIHBob25lX2NvbmZpZ3VyYWJsZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCisKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCAgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCisKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworZW5kaWYgIyBpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBwaG9uZV9jb25maWd1cmFibGUpCisKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLGF1dG9tb3RpdmVfY29uZmlndXJhYmxlIGNhcmVtdV9jb25maWd1cmFibGUpKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQVVUT01PVElWRSBDT05GSUdVUkFUSU9OIFRPUCBGSUxFCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBhdXRvbW90aXZlLyQoTE9DQUxfTU9EVUxFKQorCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKKworaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLGF1dG9tb3RpdmVfY29uZmlndXJhYmxlIGNhcmVtdV9jb25maWd1cmFibGUpKQorCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gRklMRVMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBhdXRvbW90aXZlLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gYXV0b21vdGl2ZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIGF1dG9tb3RpdmVfY29uZmlndXJhYmxlKQorCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBjYXJlbXVfY29uZmlndXJhYmxlKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBGSUxFUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNhcmVtdS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNhcmVtdS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIGNhcmVtdV9jb25maWd1cmFibGUpCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxwaG9uZV9jb25maWd1cmFibGUgYXV0b21vdGl2ZV9jb25maWd1cmFibGUgY2FyZW11X2NvbmZpZ3VyYWJsZSkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gY29tbW9uLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gXAorICAgICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKworQU5EUk9JRF9BVURJT19CQVNFX0hFQURFUl9GSUxFIDo9IHN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlL3N5c3RlbS9hdWRpby1iYXNlLmgKK0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9jb21tb24vJChMT0NBTF9NT0RVTEUpLmluCisKK2luY2x1ZGUgJChQUk9WSVNJT05fQ1JJVEVSSU9OX1RZUEVTKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLHBob25lX2NvbmZpZ3VyYWJsZSBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTE0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8Y29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbCIvPgorCis8L2NvbmZpZ3VyYXRpb24+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDg3ZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC0wLDAgKzEsMTcwIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8UHJvZHVjdFN0cmF0ZWdpZXM+CisgICAgPCEtLSBPRU0gVXNhZ2VzIC0tPgorICAgIDwhLS0gcHJvZHVjdF9zdHJhdGVneSB3aWxsIGJlIGRlZmluZWQgYWNjb3JkaW5nIHRoaXMgb3JkZXIKKyAgICBwcm9kdWN0X3N0cmF0ZWd5IGlzIG9lbV90cmFmZmljX2Fub3VuY2VtZW50IGlmIGFsbCB0aGUgY29uZGl0aW9ucyBhcmUgc2F0aXNmaWVkIGZvcgorICAgIEF1ZGlvQXR0cmlidXRlcyBhYQorCisgICAgaW50IHR5cGUgPSAwOworICAgIGlmIChidW5kbGUgIT0gbnVsbCkgeworICAgIHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9PRU1fVFlQRSwgMCk7CisgICAgfQorICAgIGlmKAorICAgICggYWEubUNvbnRlbnRUeXBlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19DT05URU5UX1RZUEVfU1BFRUNIICkgJiYKKyAgICAoIGFhLm1Vc2FnZSA9PSBBdWRpb0F0dHJpYnV0ZXMuQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFICkgJiYKKyAgICAoIHR5cGUgPT0gMSApICkKKyAgICAtLT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ib2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJvZW1fdHJhZmZpY19hbm91bmNlbWVudCI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+CisgICAgICAgICAgICA8IS0tICB0cmFmZmljX2Fubm91Y2VtZW50ID0gMSAtLT4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJvZW0iIHZhbHVlPSIxIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ib2VtX3N0cmF0ZWd5XzEiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJvZW1fYWRhc18yIj4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJvZW0iIHZhbHVlPSIyIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ib2VtX3N0cmF0ZWd5XzIiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJvZW1fYWRhc18zIj4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJvZW0iIHZhbHVlPSIzIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBDYXIgVXNhZ2VzIC0tPgorICAgIDwhLS0gS2VlcCB0aG9zZSBsaW5lcyBvbmx5IGZvciBjYXIgLS0+CisgICAgPCEtLSBDaGVjayBjYXIgY29uZGl0aW9ucyBpZiBhbnkgT0VNIGNvbmRpdGlvbnMgbWF0Y2hlZCAtLT4KKyAgICA8IS0tIEFzIGRlZmluZWQgYnkgQ2FyQXVkaW9BdHRyaWJ1dGVzVXRpbC5qYXZhIC0tPgorICAgIDwhLS0gcHJvZHVjdF9zdHJhdGVneSB3aWxsIGJlIGRlZmluZWQgYWNjb3JkaW5nIHRoaXMgb3JkZXIKKyAgICBwcm9kdWN0X3N0cmF0ZWd5IGlzIHJhZGlvIGlmIGFsbCB0aGUgY29uZGl0aW9ucyBhcmUgc2F0aXNmaWVkIGZvciBBdWRpb0F0dHJpYnV0ZXMgYWEKKworICAgICAgICBpbnQgdHlwZSA9IENBUl9BVURJT19UWVBFX0RFRkFVTFQ7CisgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgeworICAgICAgICB0eXBlID0gYnVuZGxlLmdldEludChLRVlfQ0FSX0FVRElPX1RZUEUsIENBUl9BVURJT19UWVBFX0RFRkFVTFQpOworICAgICAgICB9CisgICAgICAgIGlmKAorICAgICAgICAoIGFhLm1Db250ZW50VHlwZSA9PSBBdWRpb0F0dHJpYnV0ZXMuQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCApICYmCisgICAgICAgICggYWEubVVzYWdlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UgKSAmJgorICAgICAgICAoIHR5cGUgPT0gQ0FSX0FVRElPX1RZUEVfUkFESU8gKSApCisgICAgICAgIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0icmFkaW8iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJtZWRpYV9jYXJfYXVkaW9fdHlwZV8zIj4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0iY2FyX2F1ZGlvX3R5cGUiIHZhbHVlPSIzIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iZXh0X2F1ZGlvX3NvdXJjZSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im1lZGlhX2Nhcl9hdWRpb190eXBlXzciPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfTVVTSUMiLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjciLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJ2b2ljZV9jb21tYW5kIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ic3BlZWNoIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPgorICAgICAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+CisgICAgICAgICAgICAgICAgPCEtLSAgQ0FSX0FVRElPX1RZUEVfVk9JQ0VfQ09NTUFORCA9IDEgLS0+CisgICAgICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iMSIvPgorICAgICAgICAgICAgPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ic2FmZXR5X2FsZXJ0Ij4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ic3lzdGVtIj4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTiIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT04iLz4KKyAgICAgICAgICAgIDwhLS0gIENBUl9BVURJT19UWVBFX1NBRkVUWV9BTEVSVCA9IDIgLS0+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0iY2FyX2F1ZGlvX3R5cGUiIHZhbHVlPSIyIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBUbyBiZSBjaGVja2VkCisgICAgQ0FSX0FVRElPX1RZUEVfQ0FSU0VSVklDRV9CT1RUT00KKyAgICBDQVJfQVVESU9fVFlQRV9DQVJTRVJWSUNFX0NBUl9QUk9YWQorICAgIENBUl9BVURJT19UWVBFX0NBUlNFUlZJQ0VfTUVESUFfTVVURQorICAgIC0tPgorCisgICAgPCEtLSBHZW5lcmljIFVzYWdlcyAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im11c2ljIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTVVTSUMiIHZvbHVtZUdyb3VwPSJtZWRpYSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9HQU1FIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDwhLS0gRGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGhhcyBlbXB0eSBhdHRyaWJ1dGVzIC0tPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ibmF2X2d1aWRhbmNlIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ic3BlZWNoIj4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0idm9pY2VfY2FsbCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiIHZvbHVtZUdyb3VwPSJwaG9uZSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiB2b2x1bWVHcm91cD0icGhvbmUiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19TQ08iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9ImFsYXJtIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQUxBUk0iIHZvbHVtZUdyb3VwPSJyaW5nIj4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQUxBUk0iLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJyaW5nIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUklORyIgdm9sdW1lR3JvdXA9InJpbmciPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ibm90aWZpY2F0aW9uIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJzeXN0ZW0iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9TWVNURU0iIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InR0cyI+CisgICAgICAgIDwhLS0gVFRTIHN0cmVhbSBNVVNUIEJFIE1BTkFHRUQgT1VUU0lERSBkZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaWYgTk8gREVESUNBVEVEIE9VVFBVVAorICAgICAgICAgICAgIGZvciBUVFMsIG90aGVyd2lzZSB3aGVuIGJlYWNvbiBoYXBwZW5zLCBkZWZhdWx0IHN0cmF0ZWd5IGlzIC4uLiBtdXRlZC4KKyAgICAgICAgICAgICBJZiBpdCBpcyBtZWRpYSwgaXQgaXMgYW5ub3lpbmcuLi4gLS0+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1RUUyIgdm9sdW1lR3JvdXA9InR0cyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX0JFQUNPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorPC9Qcm9kdWN0U3RyYXRlZ2llcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjM2Q3NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKQEAgLTAsMCArMSwxOTIgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPCEtLSBWb2x1bWUgR3JvdXBzIFRhYmxlcyBpbmNsdWRlZCBieSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPCEtLSBOb3RlOgorICAgICAgICBJdCBpcyBWQUxJRCB0byBoYXZlIGEgZ3JvdXAgd2l0aG91dCBhdHRyaWJ1dGVzIGlmIGEgcHJvZHVjdCBzdHJhdGVneSBpcyBmb2xsb3dpbmcKKyAgICAgICAgdGhpcyBncm91cCBmb3IgYWxsIGF0dHJpYnV0ZXMuCisgICAgICAgIE90aGVyd2lzZSwgYXR0cmlidXRlcyBtdXN0IGJlIHNwZWNpZmllZAorLS0+CisKKzx2b2x1bWVHcm91cHM+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5vZW1fdHJhZmZpY19hbm91bmNlbWVudDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKzwhLS0gT0VNIEFEQVMgaXMgYSB2b2x1bWUgZ3JvdXAgdGhhdCBoYXMgYSBzaW5nbGUgcG9ydCBnYWluICh0aGlzIGlzIHRoZSByZWFzb24gd2h5IGl0IGlzIGEgZ3JvdXAKKyAgICAgYnV0IG1heSBob3N0IGRpZmZlcmVudCBzdHJlYW1zLgorICAgICBBIHByaW9yaXR5IG11c3QgYmUgZ2l2ZW4gYW1vbmcgdGhlbSAoZWl0aGVyIHRoZXkgYXJlIG11bHR1YWx5IGV4Y2x1aXN2ZSwgc28gdGhlIHZvbHVtZQorICAgICB3aWxsIGJlIHRoZSBvbmUgb2YgdGhlIGN1cnJlbnRseSBhY2l0dmUgc3RyZWFtLCBvdGhlcndpc2UgYSBwcmlvcml0eSBtdXN0IGJlIGdpdmVuIGJ5CisgICAgIGFueSBtZWFuLiAtLT4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm9lbV9hZGFzXzI8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+b2VtX2FkYXNfMzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworPCEtLSBNRURJQSBpcyBhIHZvbHVtZSBncm91cCB0aGF0IGhhcyBhIHNpbmdsZSBwb3J0IGdhaW4gKHRoaXMgaXMgdGhlIHJlYXNvbiB3aHkgaXQgaXMgYSBncm91cAorICAgICBidXQgbWF5IGhvc3QgZGlmZmVyZW50IHN0cmVhbXMuCisgICAgIEEgcHJpb3JpdHkgbXVzdCBiZSBnaXZlbiBhbW9uZyB0aGVtIChlaXRoZXIgdGhleSBhcmUgbXVsdHVhbHkgZXhjbHVzaXZlLCBzbyB0aGUgdm9sdW1lCisgICAgIHdpbGwgYmUgdGhlIG9uZSBvZiB0aGUgYWN0aXZlIHN0cmVhbSB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkgKE9SREVSIE1BVFRFUlMpIHVubGVzcyB0aGUgY3VydmVzCisgICAgIGZvbGxvd2VkIHdpbGwgdGhlIHRoZSBjdXJ2ZXMgZm9yIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcy4tLT4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm1lZGlhX2Nhcl9hdWRpb190eXBlXzM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bWVkaWFfY2FyX2F1ZGlvX3R5cGVfNzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm1lZGlhPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zcGVlY2g8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zeXN0ZW08L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5waG9uZTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnJpbmc8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT50dHM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKzwvdm9sdW1lR3JvdXBzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jYXJlbXUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODdkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtMCwwICsxLDE3MCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFByb2R1Y3RTdHJhdGVnaWVzPgorICAgIDwhLS0gT0VNIFVzYWdlcyAtLT4KKyAgICA8IS0tIHByb2R1Y3Rfc3RyYXRlZ3kgd2lsbCBiZSBkZWZpbmVkIGFjY29yZGluZyB0aGlzIG9yZGVyCisgICAgcHJvZHVjdF9zdHJhdGVneSBpcyBvZW1fdHJhZmZpY19hbm91bmNlbWVudCBpZiBhbGwgdGhlIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCBmb3IKKyAgICBBdWRpb0F0dHJpYnV0ZXMgYWEKKworICAgIGludCB0eXBlID0gMDsKKyAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKKyAgICB0eXBlID0gYnVuZGxlLmdldEludChLRVlfT0VNX1RZUEUsIDApOworICAgIH0KKyAgICBpZigKKyAgICAoIGFhLm1Db250ZW50VHlwZSA9PSBBdWRpb0F0dHJpYnV0ZXMuQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCApICYmCisgICAgKCBhYS5tVXNhZ2UgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSApICYmCisgICAgKCB0eXBlID09IDEgKSApCisgICAgLS0+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im9lbV90cmFmZmljX2Fub3VuY2VtZW50Ij4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ib2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPCEtLSAgdHJhZmZpY19hbm5vdWNlbWVudCA9IDEgLS0+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0ib2VtIiB2YWx1ZT0iMSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im9lbV9zdHJhdGVneV8xIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ib2VtX2FkYXNfMiI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0ib2VtIiB2YWx1ZT0iMiIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im9lbV9zdHJhdGVneV8yIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ib2VtX2FkYXNfMyI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0ib2VtIiB2YWx1ZT0iMyIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gQ2FyIFVzYWdlcyAtLT4KKyAgICA8IS0tIEtlZXAgdGhvc2UgbGluZXMgb25seSBmb3IgY2FyIC0tPgorICAgIDwhLS0gQ2hlY2sgY2FyIGNvbmRpdGlvbnMgaWYgYW55IE9FTSBjb25kaXRpb25zIG1hdGNoZWQgLS0+CisgICAgPCEtLSBBcyBkZWZpbmVkIGJ5IENhckF1ZGlvQXR0cmlidXRlc1V0aWwuamF2YSAtLT4KKyAgICA8IS0tIHByb2R1Y3Rfc3RyYXRlZ3kgd2lsbCBiZSBkZWZpbmVkIGFjY29yZGluZyB0aGlzIG9yZGVyCisgICAgcHJvZHVjdF9zdHJhdGVneSBpcyByYWRpbyBpZiBhbGwgdGhlIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCBmb3IgQXVkaW9BdHRyaWJ1dGVzIGFhCisKKyAgICAgICAgaW50IHR5cGUgPSBDQVJfQVVESU9fVFlQRV9ERUZBVUxUOworICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKKyAgICAgICAgdHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NBUl9BVURJT19UWVBFLCBDQVJfQVVESU9fVFlQRV9ERUZBVUxUKTsKKyAgICAgICAgfQorICAgICAgICBpZigKKyAgICAgICAgKCBhYS5tQ29udGVudFR5cGUgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0ggKSAmJgorICAgICAgICAoIGFhLm1Vc2FnZSA9PSBBdWRpb0F0dHJpYnV0ZXMuQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFICkgJiYKKyAgICAgICAgKCB0eXBlID09IENBUl9BVURJT19UWVBFX1JBRElPICkgKQorICAgICAgICAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InJhZGlvIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ibWVkaWFfY2FyX2F1ZGlvX3R5cGVfMyI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQyIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iMyIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9ImV4dF9hdWRpb19zb3VyY2UiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJtZWRpYV9jYXJfYXVkaW9fdHlwZV83Ij4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0iY2FyX2F1ZGlvX3R5cGUiIHZhbHVlPSI3Ii8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0idm9pY2VfY29tbWFuZCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9InNwZWVjaCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4KKyAgICAgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgICAgIDwhLS0gIENBUl9BVURJT19UWVBFX1ZPSUNFX0NPTU1BTkQgPSAxIC0tPgorICAgICAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjEiLz4KKyAgICAgICAgICAgIDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InNhZmV0eV9hbGVydCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9InN5c3RlbSI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT04iLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OIi8+CisgICAgICAgICAgICA8IS0tICBDQVJfQVVESU9fVFlQRV9TQUZFVFlfQUxFUlQgPSAyIC0tPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iMiIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gVG8gYmUgY2hlY2tlZAorICAgIENBUl9BVURJT19UWVBFX0NBUlNFUlZJQ0VfQk9UVE9NCisgICAgQ0FSX0FVRElPX1RZUEVfQ0FSU0VSVklDRV9DQVJfUFJPWFkKKyAgICBDQVJfQVVESU9fVFlQRV9DQVJTRVJWSUNFX01FRElBX01VVEUKKyAgICAtLT4KKworICAgIDwhLS0gR2VuZXJpYyBVc2FnZXMgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJtdXNpYyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIiB2b2x1bWVHcm91cD0ibWVkaWEiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfR0FNRSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8IS0tIERlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBoYXMgZW1wdHkgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im5hdl9ndWlkYW5jZSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9InNwZWVjaCI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InZvaWNlX2NhbGwiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiB2b2x1bWVHcm91cD0icGhvbmUiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkciLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIgdm9sdW1lR3JvdXA9InBob25lIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfU0NPIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJhbGFybSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FMQVJNIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FMQVJNIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0icmluZyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1JJTkciIHZvbHVtZUdyb3VwPSJyaW5nIj4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im5vdGlmaWNhdGlvbiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIgdm9sdW1lR3JvdXA9InJpbmciPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ic3lzdGVtIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIiB2b2x1bWVHcm91cD0ic3lzdGVtIj4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJ0dHMiPgorICAgICAgICA8IS0tIFRUUyBzdHJlYW0gTVVTVCBCRSBNQU5BR0VEIE9VVFNJREUgZGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGlmIE5PIERFRElDQVRFRCBPVVRQVVQKKyAgICAgICAgICAgICBmb3IgVFRTLCBvdGhlcndpc2Ugd2hlbiBiZWFjb24gaGFwcGVucywgZGVmYXVsdCBzdHJhdGVneSBpcyAuLi4gbXV0ZWQuCisgICAgICAgICAgICAgSWYgaXQgaXMgbWVkaWEsIGl0IGlzIGFubm95aW5nLi4uIC0tPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9UVFMiIHZvbHVtZUdyb3VwPSJ0dHMiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19CRUFDT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKzwvUHJvZHVjdFN0cmF0ZWdpZXM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jYXJlbXUvYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jYXJlbXUvYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWMzZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9hdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sCkBAIC0wLDAgKzEsMTkyIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzwhLS0gVm9sdW1lIEdyb3VwcyBUYWJsZXMgaW5jbHVkZWQgYnkgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzwhLS0gTm90ZToKKyAgICAgICAgSXQgaXMgVkFMSUQgdG8gaGF2ZSBhIGdyb3VwIHdpdGhvdXQgYXR0cmlidXRlcyBpZiBhIHByb2R1Y3Qgc3RyYXRlZ3kgaXMgZm9sbG93aW5nCisgICAgICAgIHRoaXMgZ3JvdXAgZm9yIGFsbCBhdHRyaWJ1dGVzLgorICAgICAgICBPdGhlcndpc2UsIGF0dHJpYnV0ZXMgbXVzdCBiZSBzcGVjaWZpZWQKKy0tPgorCis8dm9sdW1lR3JvdXBzPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+b2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQ8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCis8IS0tIE9FTSBBREFTIGlzIGEgdm9sdW1lIGdyb3VwIHRoYXQgaGFzIGEgc2luZ2xlIHBvcnQgZ2FpbiAodGhpcyBpcyB0aGUgcmVhc29uIHdoeSBpdCBpcyBhIGdyb3VwCisgICAgIGJ1dCBtYXkgaG9zdCBkaWZmZXJlbnQgc3RyZWFtcy4KKyAgICAgQSBwcmlvcml0eSBtdXN0IGJlIGdpdmVuIGFtb25nIHRoZW0gKGVpdGhlciB0aGV5IGFyZSBtdWx0dWFseSBleGNsdWlzdmUsIHNvIHRoZSB2b2x1bWUKKyAgICAgd2lsbCBiZSB0aGUgb25lIG9mIHRoZSBjdXJyZW50bHkgYWNpdHZlIHN0cmVhbSwgb3RoZXJ3aXNlIGEgcHJpb3JpdHkgbXVzdCBiZSBnaXZlbiBieQorICAgICBhbnkgbWVhbi4gLS0+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5vZW1fYWRhc18yPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm9lbV9hZGFzXzM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKzwhLS0gTUVESUEgaXMgYSB2b2x1bWUgZ3JvdXAgdGhhdCBoYXMgYSBzaW5nbGUgcG9ydCBnYWluICh0aGlzIGlzIHRoZSByZWFzb24gd2h5IGl0IGlzIGEgZ3JvdXAKKyAgICAgYnV0IG1heSBob3N0IGRpZmZlcmVudCBzdHJlYW1zLgorICAgICBBIHByaW9yaXR5IG11c3QgYmUgZ2l2ZW4gYW1vbmcgdGhlbSAoZWl0aGVyIHRoZXkgYXJlIG11bHR1YWx5IGV4Y2x1c2l2ZSwgc28gdGhlIHZvbHVtZQorICAgICB3aWxsIGJlIHRoZSBvbmUgb2YgdGhlIGFjdGl2ZSBzdHJlYW0gd2l0aCBoaWdoZXN0IHByaW9yaXR5IChPUkRFUiBNQVRURVJTKSB1bmxlc3MgdGhlIGN1cnZlcworICAgICBmb2xsb3dlZCB3aWxsIHRoZSB0aGUgY3VydmVzIGZvciB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMuLS0+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5tZWRpYV9jYXJfYXVkaW9fdHlwZV8zPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm1lZGlhX2Nhcl9hdWRpb190eXBlXzc8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5tZWRpYTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+c3BlZWNoPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+c3lzdGVtPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cGhvbmU8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5yaW5nPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dHRzPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0wPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+Cis8L3ZvbHVtZUdyb3Vwcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NvbW1vbi9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4MmIyZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjcml0ZXJpYT4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgdHlwZT0iSW5wdXREZXZpY2VzTWFza1R5cGUiIGRlZmF1bHQ9Im5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkF2YWlsYWJsZU91dHB1dERldmljZXMiIHR5cGU9Ik91dHB1dERldmljZXNNYXNrVHlwZSIgZGVmYXVsdD0ibm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyIgdHlwZT0iT3V0cHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiIGRlZmF1bHQ9Im5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkF2YWlsYWJsZUlucHV0RGV2aWNlc0FkZHJlc3NlcyIgdHlwZT0iSW5wdXREZXZpY2VzQWRkcmVzc2VzVHlwZSIgZGVmYXVsdD0ibm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iVGVsZXBob255TW9kZSIgdHlwZT0iQW5kcm9pZE1vZGVUeXBlIiBkZWZhdWx0PSJOb3JtYWwiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgdHlwZT0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvck1lZGlhIiB0eXBlPSJGb3JjZVVzZUZvck1lZGlhVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvclJlY29yZCIgdHlwZT0iRm9yY2VVc2VGb3JSZWNvcmRUeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9yRG9jayIgdHlwZT0iRm9yY2VVc2VGb3JEb2NrVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvclN5c3RlbSIgdHlwZT0iRm9yY2VVc2VGb3JTeXN0ZW1UeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIiB0eXBlPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmQiIHR5cGU9IkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvclZpYnJhdGVSaW5naW5nIiB0eXBlPSJGb3JjZVVzZUZvclZpYnJhdGVSaW5naW5nVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+Cis8L2NyaXRlcmlhPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NvbW1vbi9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwuaW4gYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTE3MzY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NvbW1vbi9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwuaW4KQEAgLTAsMCArMSw5NiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjcml0ZXJpb25fdHlwZXM+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9Ik91dHB1dERldmljZXNNYXNrVHlwZSIgdHlwZT0iaW5jbHVzaXZlIi8+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IklucHV0RGV2aWNlc01hc2tUeXBlIiB0eXBlPSJpbmNsdXNpdmUiLz4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iT3V0cHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiIHR5cGU9ImluY2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8IS0tIGxlZ2FjeSByZW1vdGUgc3VibWl4IC0tPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IjAiIG51bWVyaWNhbD0iMSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJJbnB1dERldmljZXNBZGRyZXNzZXNUeXBlIiB0eXBlPSJpbmNsdXNpdmUiLz4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iQW5kcm9pZE1vZGVUeXBlIiB0eXBlPSJleGNsdXNpdmUiLz4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iQm9vbGVhblR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRmFsc2UiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IlRydWUiIG51bWVyaWNhbD0iMSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb25UeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VTcGVha2VyIiBudW1lcmljYWw9IjEiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0U2NvIiBudW1lcmljYWw9IjMiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JNZWRpYVR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVNwZWFrZXIiIG51bWVyaWNhbD0iMSIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlSGVhZHBob25lcyIgbnVtZXJpY2FsPSIyIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdEEyZHAiIG51bWVyaWNhbD0iNCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlV2lyZWRBY2Nlc3NvcnkiIG51bWVyaWNhbD0iNSIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQW5hbG9nRG9jayIgbnVtZXJpY2FsPSI4Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VEaWdpdGFsRG9jayIgbnVtZXJpY2FsPSI5Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb0J0QTJkcCIgbnVtZXJpY2FsPSIxMCIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvclJlY29yZFR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0U2NvIiBudW1lcmljYWw9IjMiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVdpcmVkQWNjZXNzb3J5IiBudW1lcmljYWw9IjUiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JEb2NrVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlV2lyZWRBY2Nlc3NvcnkiIG51bWVyaWNhbD0iNSIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnRDYXJEb2NrIiBudW1lcmljYWw9IjYiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0RGVza0RvY2siIG51bWVyaWNhbD0iNyIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQW5hbG9nRG9jayIgbnVtZXJpY2FsPSI4Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VEaWdpdGFsRG9jayIgbnVtZXJpY2FsPSI5Ii8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yU3lzdGVtVHlwZSIgdHlwZT0iZXhjbHVzaXZlIiA+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVN5c3RlbUVuZm9yY2VkIiBudW1lcmljYWw9IjExIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkIiBudW1lcmljYWw9IjEyIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlRW5jb2RlZFN1cnJvdW5kTmV2ZXIiIG51bWVyaWNhbD0iMTMiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUVuY29kZWRTdXJyb3VuZEFsd2F5cyIgbnVtZXJpY2FsPSIxNCIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvclZpYnJhdGVSaW5naW5nVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnRTY28iIG51bWVyaWNhbD0iMyIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorPC9jcml0ZXJpb25fdHlwZXM+CisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EzM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzxjb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIi8+CisKKzwvY29uZmlndXJhdGlvbj4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWU2ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKQEAgLTAsMCArMSwxMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIERlZmF1bHQgVm9sdW1lIFRhYmxlcyBpbmNsdWRlZCBieSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPCEtLSBGdWxsIERlZmF1bHQgVm9sdW1lIHRhYmxlIGZvciBhbGwgZGV2aWNlIGNhdGVnb3J5IC0tPgorPHZvbHVtZXM+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBGdWxsIFNjYWxlIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4wLDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iU0lMRU5UX1ZPTFVNRV9DVVJWRSI+CisgICAgICAgIDxwb2ludD4wLC05NjAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtOTYwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBTeXN0ZW0gcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTI0MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTE4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTEyMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC02MDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBNZWRpYSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIFNwZWFrZXIgTWVkaWEgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1NZU1RFTV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBpcyBTcGVha2VyIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC00NjgwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjQyLC0yMDcwPC9wb2ludD4KKyAgICAgICAgPHBvaW50Pjg1LC01NDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBpcyBFeHQgTWVkaWEgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTIxMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC0xMDAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgSGVhcmluZyBBaWQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtMTI3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTgwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgICA8IS0tIE5vbi1tdXRhYmxlIGRlZmF1bHQgdm9sdW1lIGN1cnZlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgKiBmaXJzdCBwb2ludCBpcyBhbHdheXMgZm9yIGluZGV4IDAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICogYXR0ZW51YXRpb24gaXMgc21hbGwgZW5vdWdoIHRoYXQgc3RyZWFtIGNhbiBzdGlsbCBiZSBoZWFyZCAtLT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICAgICBiYXNlZCBvbiBERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgbm9uLW11dGFibGUgVm9sdW1lIEN1cnZlIGZvciBoZWFkc2V0IC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBTcGVha2VyIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgbm9uLW11dGFibGUgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0VYVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBFeHQgTWVkaWEgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTEwMDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBIZWFyaW5nIEFpZCBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgYmFzZWQgb24gREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC0xMjcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtODAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+Cis8L3ZvbHVtZXM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk4NzQzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtMCwwICsxLDExMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzxQcm9kdWN0U3RyYXRlZ2llcz4KKworICAgIDwhLS0gImhpZGRlbiBzdHJhdGVnaWVzIiBsaWtlIFRUUywgZW5mb3JjZWQgYXVkaWJsZToKKyAgICAgICAgICAgIFNoYWxsIHdlIGV4cG9zZSB0aGVtIGhlcmUgb3Iga2VlcCBpdCBoYXJkIGNvZGVkIC0tPgorCisgICAgPCEtLSBVc2VkIHRvIGlkZW50aWZ5IHRoZSB2b2x1bWUgb2YgYXVkaW8gc3RyZWFtcyBmb3IgZW5mb3JjZWQgc3lzdGVtIHNvdW5kcyBpbiBjZXJ0YWluCisgICAgICAgICBjb3VudHJpZXMgKGUuZy4gY2FtZXJhIGluIEphcGFuKQorICAgICAgICAgVGhpcyBzdHJhdGVneSB3aWxsIG9ubHkgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBwaG9uZSBpZiBmb3JjZSBmb3Igc3lzdGVtIGlzIHNldCB0bworICAgICAgICAgZW5mb3JjZWQuIC0tPgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9QSE9ORSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiIHZvbHVtZUdyb3VwPSJ2b2ljZV9jYWxsIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIgdm9sdW1lR3JvdXA9ImJsdWV0b290aF9zY28iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19TQ08iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfU09OSUZJQ0FUSU9OIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUklORyIgdm9sdW1lR3JvdXA9InJpbmciPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BTEFSTSIgdm9sdW1lR3JvdXA9ImFsYXJtIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FMQVJNIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIiB2b2x1bWVHcm91cD0iZW5mb3JjZWRfYXVkaWJsZSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfQUNDRVNTSUJJTElUWSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiIHZvbHVtZUdyb3VwPSJhY2Nlc3NpYmlsaXR5Ij4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIgdm9sdW1lR3JvdXA9Im5vdGlmaWNhdGlvbiI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX01FRElBIj4KKyAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIiB2b2x1bWVHcm91cD0ibXVzaWMiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfR0FNRSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1NZU1RFTSIgdm9sdW1lR3JvdXA9InN5c3RlbSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9EVE1GIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fRFRNRiIgdm9sdW1lR3JvdXA9ImR0bWYiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHZvbHVtZSBvZiBhdWRpbyBzdHJlYW1zIGV4Y2x1c2l2ZWx5IHRyYW5zbWl0dGVkIHRocm91Z2ggdGhlICBzcGVha2VyCisgICAgICAgICAoVFRTKSBvZiB0aGUgZGV2aWNlIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVFRTIiB2b2x1bWVHcm91cD0idHRzIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQkVBQ09OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFJvdXRpbmcgU3RyYXRlZ3kgcmVyb3V0aW5nIG1heSBiZSByZW1vdmVkIGFzIGZvbGxvd2luZyBtZWRpYT8/PyAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1JFUk9VVElORyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1JFUk9VVElORyIgdm9sdW1lR3JvdXA9InJlcm91dGluZyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBEZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaGFzIGVtcHR5IGF0dHJpYnV0ZXMgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9QQVRDSCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1BBVENIIiB2b2x1bWVHcm91cD0icGF0Y2giPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworCis8L1Byb2R1Y3RTdHJhdGVnaWVzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3YTE4NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDIzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVm9sdW1lIHNlY3Rpb24gZGVmaW5lcyBhIHZvbHVtZSBjdXJ2ZSBmb3IgYSBnaXZlbiB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5LgorSXQgY29udGFpbnMgYSBsaXN0IG9mIHBvaW50cyBvZiB0aGlzIGN1cnZlIGV4cHJlc3NpbmcgdGhlIGF0dGVudWF0aW9uIGluIE1pbGxpYmVscyBmb3IgYSBnaXZlbgordm9sdW1lIGluZGV4IGZyb20gMCB0byAxMDAuCis8dm9sdW1lIGRldmljZUNhdGVnb3J5PeKAneKAnT4KKzxwb2ludD4wLC05NjAwPC9wb2ludD4KKzxwb2ludD4xMDAsMDwvcG9pbnQ+Cis8L3ZvbHVtZT4KKy0tPgorCis8dm9sdW1lR3JvdXBzPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dm9pY2VfY2FsbDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNzAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTkwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zeXN0ZW08L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTUxMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjU3LC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjUwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+ODUsLTIzMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8IS0tdm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLy0tPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5yaW5nPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bXVzaWM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjI1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmFsYXJtPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfRVhUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5ub3RpZmljYXRpb248L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+Ymx1ZXRvb3RoX3NjbzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmVuZm9yY2VkX2F1ZGlibGU8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTM0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTIwMDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+ZHRtZjwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTQwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE0MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dHRzPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+YWNjZXNzaWJpbGl0eTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnJlcm91dGluZzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnBhdGNoPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKzwvdm9sdW1lR3JvdXBzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKaW5kZXggYTU5N2U4Ny4uZWZjNjlkYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaApAQCAtMTksMTAgKzE5LDggQEAKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZTsKIGNsYXNzIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIGNsYXNzIEVuZ2luZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCmluZGV4IDJlMjlhOWIuLjFmYzIyNjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKQEAgLTE2LDEwICsxNiwxMSBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPEVuZ2luZURlZmluaXRpb24uaD4KICNpbmNsdWRlIDxWb2x1bWUuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbW1vblR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTM2LDE5ICszNyw2IEBACiB7CiBwdWJsaWM6CiAgICAgLyoqCi0gICAgICogQWRkIGEgc3RyYXRlZ3kgdG8gdGhlIGVuZ2luZQotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBzdHJhdGVneSB0byBhZGQKLSAgICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXI6IHRoZSBudW1lcmljYWwgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGlzIG1lbWJlci4gSXQgTVVTVCBtYXRjaCBlaXRoZXIKLSAgICAgKiAgICAgICAgICAgIHN5c3RlbS9hdWRpby5oIG9yIHN5c3RlbS9hdWRpb19wb2xpY3kuaCBlbnVtcmF0aW9uIHZhbHVlIGluIG9yZGVyIHRvIGxpbmsgdGhlCi0gICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgY29udHJvbGVkIGJ5IHRoZSBQRlcgYW5kIHRoZSBwb2xpY3kgbWFuYWdlciBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBzdHJhdGVneSBoYXMgYmVlbiBhZGRlZCBzdWNjZXNzZnVsbHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICovCi0gICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBhZGRTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgcm91dGluZ19zdHJhdGVneSBpZCkgPSAwOwotCi0gICAgLyoqCiAgICAgICogQWRkIGEgc3RyZWFtcyB0byB0aGUgZW5naW5lLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBzdHJlYW0gdG8gYWRkCkBAIC02MiwxOSArNTAsNiBAQAogICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IGlkKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBBZGQgYSB1c2FnZSB0byB0aGUgZW5naW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHVzYWdlIHRvIGFkZAotICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgotICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKLSAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHVzYWdlIGhhcyBiZWVuIGFkZGVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb191c2FnZV90IGlkKSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBBZGQgYW4gaW5wdXQgc291cmNlIHRvIHRoZSBlbmdpbmUKICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgaW5wdXQgc291cmNlIHRvIGFkZApAQCAtODgsMjYgKzYzLDYgQEAKICAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZElucHV0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zb3VyY2VfdCBpZCkgPSAwOwogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXZpY2UgdG8gYmUgdXNlZCBieSBhIHN0cmF0ZWd5LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBzdHJhdGVneTogbmFtZSBvZiB0aGUgc3RyYXRlZ3kgZm9yIHdoaWNoIHRoZSBkZXZpY2UgdG8gdXNlIGhhcyB0byBiZSBzZXQKLSAgICAgKiBAcGFyYW1baW5dIGRldmljZXM7IG1hc2sgb2YgZGV2aWNlcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZXMgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmF0ZWd5LCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIHNldERldmljZUZvclN0cmF0ZWd5KGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgJnN0cmF0ZWd5LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykgPSAwOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZCBieSBhIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtOiBuYW1lIG9mIHRoZSBzdHJlYW0gZm9yIHdoaWNoIHRoZSBzdHJhdGVneSB0byB1c2UgaGFzIHRvIGJlIHNldAotICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3kgdG8gZm9sbG93IGZvciB0aGUgZ2l2ZW4gc3RyZWFtLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJhdGVneSB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgc3RyZWFtLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgPSAwOwotCi0gICAgLyoqCiAgICAgICogU2V0IHRoZSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZCBieSBhIHN0cmVhbS4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtOiBuYW1lIG9mIHRoZSBzdHJlYW0gZm9yIHdoaWNoIHRoZSBzdHJhdGVneSB0byB1c2UgaGFzIHRvIGJlIHNldApAQCAtMTE5LDE2ICs3NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmdm9sdW1lUHJvZmlsZSkgPSAwOwogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZCBieSBhIHVzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSB1c2FnZTogbmFtZSBvZiB0aGUgdXNhZ2UgZm9yIHdoaWNoIHRoZSBzdHJhdGVneSB0byB1c2UgaGFzIHRvIGJlIHNldAotICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3kgdG8gZm9sbG93IGZvciB0aGUgZ2l2ZW4gdXNhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmF0ZWd5IHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyB1c2FnZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclVzYWdlKGNvbnN0IGF1ZGlvX3VzYWdlX3QgJnVzYWdlLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBTZXQgdGhlIGlucHV0IGRldmljZSB0byBiZSB1c2VkIGJ5IGFuIGlucHV0IHNvdXJjZS4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gaW5wdXRTb3VyY2U6IG5hbWUgb2YgdGhlIGlucHV0IHNvdXJjZSBmb3Igd2hpY2ggdGhlIGRldmljZSB0byB1c2UgaGFzIHRvIGJlIHNldApAQCAtMTM5LDYgKzg0LDIyIEBACiAgICAgdmlydHVhbCBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOwogCisgICAgdmlydHVhbCB2b2lkIHNldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRldmljZSB0byBiZSB1c2VkIGJ5IGEgcHJvZHVjdCBzdHJhdGVneS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3k6IG5hbWUgb2YgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIHdoaWNoIHRoZSBkZXZpY2UgdG8gdXNlIGhhcyB0byBiZSBzZXQKKyAgICAgKiBAcGFyYW1baW5dIGRldmljZXM7IG1hc2sgb2YgZGV2aWNlcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZXMgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmF0ZWd5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMpID0gMDsKKworICAgIHZpcnR1YWwgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSB7fQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9BbmRyb2lkLm1rCmluZGV4IGJhYWVmZDIuLjc4MmZlODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQW5kcm9pZC5tawpAQCAtNywxNTYgKzcsMTc2IEBACiAjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotaWZlcSAoMSwgMCkKLQogTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCQoZmlsdGVyICQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTikscGhvbmVfY29uZmlndXJhYmxlIGF1dG9tb3RpdmVfY29uZmlndXJhYmxlIGNhcmVtdV9jb25maWd1cmFibGUgbm8tb3V0cHV0X2NvbmZpZ3VyYWJsZSBuby1pbnB1dF9jb25maWd1cmFibGUpKQorCiBQRldfQ09SRSA6PSBleHRlcm5hbC9wYXJhbWV0ZXItZnJhbWV3b3JrCi1CVUlMRF9QRldfU0VUVElOR1MgOj0gJChQRldfQ09SRSkvc3VwcG9ydC9hbmRyb2lkL2J1aWxkX3Bmd19zZXR0aW5ncy5taworI0BUT0RPOiB1cHN0cmVhbSBuZXcgZG9tYWluIGdlbmVyYXRvcgorI0JVSUxEX1BGV19TRVRUSU5HUyA6PSAkKFBGV19DT1JFKS9zdXBwb3J0L2FuZHJvaWQvYnVpbGRfcGZ3X3NldHRpbmdzLm1rCiBQRldfREVGQVVMVF9TQ0hFTUFTX0RJUiA6PSAkKFBGV19DT1JFKS91cHN0cmVhbS9zY2hlbWFzCiBQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKIAorVE9PTFMgOj0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMKK0JVSUxEX1BGV19TRVRUSU5HUyA6PSAkKFRPT0xTKS9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKKworUFJPVklTSU9OX1NUUkFURUdJRVNfU1RSVUNUVVJFIDo9ICQoVE9PTFMpL3Byb3Zpc2lvbl9zdHJhdGVnaWVzX3N0cnVjdHVyZS5taworCitlbmRpZgorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgQ09ORklHVVJBVElPTiBGSUxFUwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyMjIyMjIyMgUG9saWN5IFBGVyB0b3AgbGV2ZWwgZmlsZSAjIyMjIyMjIyMKIAoraWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLHBob25lX2NvbmZpZ3VyYWJsZSBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlKSkKKwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEUgOj0gUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX01PRFVMRSkuaW4KIAorIyBleHRlcm5hbC9wYXJhbWV0ZXItZnJhbWV3b3JrIHByZXZlbnRzIGZyb20gdXNpbmcgZGVidWcgaW50ZXJmYWNlCiBBVURJT19QQVRURVJOID0gQFRVTklOR19BTExPV0VEQAotaWZlcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksdXNlcikKKyNpZmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQogQVVESU9fVkFMVUUgPSBmYWxzZQotZWxzZQotQVVESU9fVkFMVUUgPSB0cnVlCi1lbmRpZgorI2Vsc2UKKyNBVURJT19WQUxVRSA9IHRydWUKKyNlbmRpZgogCi1MT0NBTF9QT1NUX0lOU1RBTExfQ01EIDo9ICQoaGlkZSkgc2VkIC1pIC1lICdzfCQoQVVESU9fUEFUVEVSTil8JChBVURJT19WQUxVRSl8ZycgJChMT0NBTF9NT0RVTEVfUEFUSCkvJChMT0NBTF9NT0RVTEUpCitMT0NBTF9QT1NUX0lOU1RBTExfQ01EIDo9ICQoaGlkZSkgc2VkIC1pIC1lICdzfCQoQVVESU9fUEFUVEVSTil8JChBVURJT19WQUxVRSl8ZycgJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpLyQoTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEgpLyQoTE9DQUxfTU9EVUxFKQogCiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiAKLQotIyMjIyMjIyMjIyBQb2xpY3kgUEZXIFN0cnVjdHVyZXMgIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IFBvbGljeUNsYXNzLnhtbAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQotTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRSkKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKyMjIyMjIyMjIyMgUG9saWN5IFBGVyBDb21tb24gU3RydWN0dXJlcyAjIyMjIyMjIyMKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEUgOj0gUG9saWN5U3Vic3lzdGVtLnhtbAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCiAgICAgUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBcCisgICAgUHJvZHVjdFN0cmF0ZWdpZXMueG1sIFwKICAgICBQb2xpY3lTdWJzeXN0ZW0tVm9sdW1lLnhtbCBcCiAgICAgbGlicG9saWN5LXN1YnN5c3RlbSBcCiAKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQotTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRSkKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbW1vbi9TdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbW1vbi9TdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiAKLSMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzICMjIyMjIyMjIwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCitMT0NBTF9NT0RVTEUgOj0gUG9saWN5Q2xhc3MueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKLSAgICAgICAgUG9saWN5Q2xhc3MueG1sIFwKLSAgICAgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCi0gICAgICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCi0KLWlmZXEgKCQocGZ3X3JlYnVpbGRfc2V0dGluZ3MpLHRydWUpCi1QRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCi1QRldfQ1JJVEVSSUFfRklMRSA6PSAkKExPQ0FMX1BBVEgpL3BvbGljeV9jcml0ZXJpYS50eHQKLVBGV19FRERfRklMRVMgOj0gXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3ZvbHVtZXMucGZ3Ci0KLWluY2x1ZGUgJChCVUlMRF9QRldfU0VUVElOR1MpCi1lbHNlCi0jIFVzZSB0aGUgZXhpc3RpbmcgZmlsZQotTE9DQUxfU1JDX0ZJTEVTIDo9IFNldHRpbmdzLyQoTE9DQUxfTU9EVUxFX1NURU0pCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbW1vbi9TdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi1lbmRpZiAjIHBmd19yZWJ1aWxkX3NldHRpbmdzCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gUHJvZHVjdFN0cmF0ZWdpZXMueG1sCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKK0FVRElPX1BPTElDWV9FTkdJTkVfQ09ORklHVVJBVElPTl9GSUxFIDo9IFwKKyAgICAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbAorU1RSQVRFR0lFU19TVFJVQ1RVUkVfRklMRSA6PSAkKExPQ0FMX1BBVEgpL2NvbW1vbi9TdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpLmluCisKK2luY2x1ZGUgJChQUk9WSVNJT05fU1RSQVRFR0lFU19TVFJVQ1RVUkUpCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCQoZmlsdGVyICQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTikscGhvbmVfY29uZmlndXJhYmxlIGF1dG9tb3RpdmVfY29uZmlndXJhYmxlIGNhcmVtdV9jb25maWd1cmFibGUpKQorCisjIyMjIyMjIyMjIFBvbGljeSBQRlcgRXhhbXBsZSBTdHJ1Y3R1cmVzICMjIyMjIyMjIworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLG5vLW91dHB1dF9jb25maWd1cmFibGUgbm8taW5wdXRfY29uZmlndXJhYmxlKSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gUG9saWN5U3Vic3lzdGVtLW5vLXN0cmF0ZWd5LnhtbAorTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5U3Vic3lzdGVtLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBcCisgICAgUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwgXAorICAgIGxpYnBvbGljeS1zdWJzeXN0ZW0gXAorCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjb21tb24vU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFX1NURU0pCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2VuZGlmICMgaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLG5vLW91dHB1dF9jb25maWd1cmFibGUgbm8taW5wdXRfY29uZmlndXJhYmxlKSkKIAogIyMjIyMjIyMjIFBvbGljeSBQRlcgU2V0dGluZ3MgLSBObyBPdXRwdXQgIyMjIyMjIyMjCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLG5vLW91dHB1dF9jb25maWd1cmFibGUpCisKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5Lm5vLW91dHB1dAorTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5CiBMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLU5vT3V0cHV0RGV2aWNlLnhtbAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeQotTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gXAotICAgICAgICBQb2xpY3lDbGFzcy54bWwgXAotICAgICAgICBQb2xpY3lTdWJzeXN0ZW0ueG1sIFwKLSAgICAgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwgXAorICAgIFBvbGljeVN1YnN5c3RlbS1uby1zdHJhdGVneS54bWwgXAorICAgIFBvbGljeUNsYXNzLnhtbCBcCisgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKIAotUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9wb2xpY3lfY3JpdGVyaWEudHh0CitQRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKK1BGV19DUklURVJJQV9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAogUEZXX0VERF9GSUxFUyA6PSBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy92b2x1bWVzLnBmdwogCiBpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQotCitlbmRpZiAjIGlmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksbm8tb3V0cHV0X2NvbmZpZ3VyYWJsZSkKICMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzIC0gTm8gSW5wdXQgIyMjIyMjIyMjCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkKKwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kubm8taW5wdXQKK0xPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeQogTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy1Ob0lucHV0RGV2aWNlLnhtbAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeQotTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gXAotICAgICAgICBQb2xpY3lDbGFzcy54bWwgXAotICAgICAgICBQb2xpY3lTdWJzeXN0ZW0ueG1sIFwKLSAgICAgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwgXAorICAgIFBvbGljeVN1YnN5c3RlbS1uby1zdHJhdGVneS54bWwgXAorICAgIFBvbGljeUNsYXNzLnhtbCBcCisgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKIAotUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9wb2xpY3lfY3JpdGVyaWEudHh0CitQRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKK1BGV19DUklURVJJQV9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAogUEZXX0VERF9GSUxFUyA6PSBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3N0cmVhbS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncgXAogICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzTm9JbnB1dC9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAogICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3ZvbHVtZXMucGZ3CiAKIGluY2x1ZGUgJChCVUlMRF9QRldfU0VUVElOR1MpCiAKLWVuZGlmICMgaWZlcSAoMSwgMCkKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJlY3Vyc2l2ZSBjYWxsIHN1Yi1mb2xkZXIgQW5kcm9pZC5taworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjYThlMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBATk9URToKKyMgQXVkaW8gUG9saWN5IEVuZ2luZSBjb25maWd1cmFibGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKKyMKKyMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIGF1dG9tb3RpdmVfY29uZmlndXJhYmxlKQorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitQRldfQ09SRSA6PSBleHRlcm5hbC9wYXJhbWV0ZXItZnJhbWV3b3JrCitQRldfREVGQVVMVF9TQ0hFTUFTX0RJUiA6PSAkKFBGV19DT1JFKS91cHN0cmVhbS9zY2hlbWFzCitQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKKworVE9PTFMgOj0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMKK0JVSUxEX1BGV19TRVRUSU5HUyA6PSAkKFRPT0xTKS9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBGSUxFUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMgUG9saWN5IFBGVyBTdHJ1Y3R1cmVzICMjIyMjIyMjIworIyMjIyMjIyMjIFBvbGljeSBQRlcgU2V0dGluZ3MgIyMjIyMjIyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeQorTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKKworUEZXX0VERF9GSUxFUyA6PSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL3ZvbHVtZXMucGZ3CisKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKKyAgICAkKFBGV19FRERfRklMRVMpCisKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAorICAgIFBvbGljeUNsYXNzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbCBcCisgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKKworUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKK1BGV19DUklURVJJQV9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAorCitQRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorCitQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKKworaW5jbHVkZSAkKEJVSUxEX1BGV19TRVRUSU5HUykKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIGF1dG9tb3RpdmVfY29uZmlndXJhYmxlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVnaWVzLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhZDU5MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncKQEAgLTAsMCArMSw3NjAgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWdpZXMKKwlzdXBEb21haW46IE9lbVRyYWZmaWNBbm91bmNlbWVudAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fdHJhZmZpY19hbm91bmNlbWVudC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwOF9PRU0xCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA4X09FTTEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKwlzdXBEb21haW46IE9lbVN0cmF0ZWd5MQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvZGV2aWNlX2FkZHJlc3MgPSBCVVMwOF9PRU0xCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA4X09FTTEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCisJc3VwRG9tYWluOiBPZW1TdHJhdGVneTIKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL2RldmljZV9hZGRyZXNzID0gQlVTMDhfT0VNMQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOF9PRU0xCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogUmFkaW8KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL2RldmljZV9hZGRyZXNzID0gQlVTMDlfT0VNMgorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOV9PRU0yCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKwlzdXBEb21haW46IEV4dEF1ZGlvU291cmNlCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2UvZGV2aWNlX2FkZHJlc3MgPSBCVVMwOV9PRU0yCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA5X09FTTIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogVm9pY2VDb21tYW5kCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMl9WT0lDRV9DT01NQU5ECisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAyX1ZPSUNFX0NPTU1BTkQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY29tbWFuZC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBTYWZldHlBbGVydAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NhZmV0eV9hbGVydC9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogTXVzaWMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IE5hdkd1aWRhbmNlCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL2RldmljZV9hZGRyZXNzID0gQlVTMDFfTkFWX0dVSURBTkNFCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAxX05BVl9HVUlEQU5DRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IFZvaWNlQ2FsbAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL2RldmljZV9hZGRyZXNzID0gQlVTMDRfQ0FMTAorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNF9DQUxMCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogQWxhcm0KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL2RldmljZV9hZGRyZXNzID0gQlVTMDVfQUxBUk0KKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDVfQUxBUk0KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBSaW5nCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JpbmcvZGV2aWNlX2FkZHJlc3MgPSBCVVMwM19DQUxMX1JJTkcKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDNfQ0FMTF9SSU5HCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogTm90aWZpY2F0aW9uCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL2RldmljZV9hZGRyZXNzID0gQlVTMDZfTk9USUZJQ0FUSU9OCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA2X05PVElGSUNBVElPTgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IFN5c3RlbQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9kZXZpY2VfYWRkcmVzcyA9IEJVUzA3X1NZU1RFTV9TT1VORAorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwN19TWVNURU1fU09VTkQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCXN1cERvbWFpbjogVHRzCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHRzL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyRW11L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhOGYwYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBATk9URToKKyMgQXVkaW8gUG9saWN5IEVuZ2luZSBjb25maWd1cmFibGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKKyMKKyMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIGNhcmVtdV9jb25maWd1cmFibGUpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK1BGV19DT1JFIDo9IGV4dGVybmFsL3BhcmFtZXRlci1mcmFtZXdvcmsKK1BGV19ERUZBVUxUX1NDSEVNQVNfRElSIDo9ICQoUEZXX0NPUkUpL3Vwc3RyZWFtL3NjaGVtYXMKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCitUT09MUyA6PSBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scworQlVJTERfUEZXX1NFVFRJTkdTIDo9ICQoVE9PTFMpL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5taworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIFN0cnVjdHVyZXMgIyMjIyMjIyMjCisjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5CitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeQorCitQRldfRUREX0ZJTEVTIDo9IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vU2V0dGluZ3Mvdm9sdW1lcy5wZncKKworTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gXAorICAgICQoUEZXX0VERF9GSUxFUykKKworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCisgICAgUG9saWN5Q2xhc3MueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIFwKKyAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorCitQRldfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbAorUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCisKK1BGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCisKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCitpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgY2FyZW11X2NvbmZpZ3VyYWJsZSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzQ2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3CkBAIC0wLDAgKzEsNjkwIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVnaWVzCisJc3VwRG9tYWluOiBPZW1UcmFmZmljQW5vdW5jZW1lbnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKwlzdXBEb21haW46IE9lbVN0cmF0ZWd5MQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMl9PRU0xCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAyX09FTTEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCisJc3VwRG9tYWluOiBPZW1TdHJhdGVneTIKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL2RldmljZV9hZGRyZXNzID0gQlVTMDFfTkFWX0dVSURBTkNFCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAxX05BVl9HVUlEQU5DRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IFJhZGlvCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBFeHRBdWRpb1NvdXJjZQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogVm9pY2VDb21tYW5kCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwNF9WT0lDRQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNF9WT0lDRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY29tbWFuZC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogU2FmZXR5QWxlcnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMF9NRURJQQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE11c2ljCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogTmF2R3VpZGFuY2UKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2UvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMV9OQVZfR1VJREFOQ0UKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDFfTkFWX0dVSURBTkNFCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogVm9pY2VDYWxsCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvZGV2aWNlX2FkZHJlc3MgPSBCVVMwNF9WT0lDRQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNF9WT0lDRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogQWxhcm0KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogUmluZworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL2RldmljZV9hZGRyZXNzID0gQlVTMDRfVk9JQ0UKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDRfVk9JQ0UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE5vdGlmaWNhdGlvbgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogU3lzdGVtCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL2RldmljZV9hZGRyZXNzID0gQlVTMDNfU1lTVEVNX1NPVU5ECisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAzX1NZU1RFTV9TT1VORAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBUdHMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHRzL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90dHMvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorIAorCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sLmluIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwuaW4KaW5kZXggZjU2MTVjZC4uZjgwYTA3ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwuaW4KKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwuaW4KQEAgLTEsNiArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgogPFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb24geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICBTeXN0ZW1DbGFzc05hbWU9IlBvbGljeSIgU2VydmVyUG9ydD0iNTAxOSIgVHVuaW5nQWxsb3dlZD0iQFRVTklOR19BTExPV0VEQCI+CisgICAgU3lzdGVtQ2xhc3NOYW1lPSJQb2xpY3kiIFNlcnZlclBvcnQ9Ii9kZXYvc29ja2V0L2F1ZGlvc2VydmVyL3BvbGljeV9kZWJ1ZyIKKyAgICBUdW5pbmdBbGxvd2VkPSJAVFVOSU5HX0FMTE9XRURAIj4KIAogICAgIDxTdWJzeXN0ZW1QbHVnaW5zPgogICAgICAgICA8TG9jYXRpb24gRm9sZGVyPSIiPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4NDViOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2NiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEBOT1RFOgorIyBBdWRpbyBQb2xpY3kgRW5naW5lIGNvbmZpZ3VyYWJsZSBleGFtcGxlIGZvciBnZW5lcmljIGRldmljZSBidWlsZAorIworIyBBbnkgdmVuZG9yIHNoYWxsIGhhdmUgaXRzIG93biBjb25maWd1cmF0aW9uIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UgZm9sZGVyCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfY29uZmlndXJhYmxlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK1BGV19DT1JFIDo9IGV4dGVybmFsL3BhcmFtZXRlci1mcmFtZXdvcmsKK1BGV19ERUZBVUxUX1NDSEVNQVNfRElSIDo9ICQoUEZXX0NPUkUpL3Vwc3RyZWFtL3NjaGVtYXMKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCitUT09MUyA6PSBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scworQlVJTERfUEZXX1NFVFRJTkdTIDo9ICQoVE9PTFMpL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5taworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBGSUxFUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIFBvbGljeSBQRlcgU3RydWN0dXJlcyAjIyMjIyMjIyMKKyMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzICMjIyMjIyMjIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kKK0xPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5CisKK1BGV19FRERfRklMRVMgOj0gXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vU2V0dGluZ3Mvdm9sdW1lcy5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9tZWRpYS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2R0bWYucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9waG9uZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9wYXRjaC5wZncKKworTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gXAorICAgICQoUEZXX0VERF9GSUxFUykKKworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCisgICAgUG9saWN5Q2xhc3MueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIFwKKyAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorCitQRldfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbAorUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCisKK1BGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCisKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCitpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfY29uZmlndXJhYmxlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTkzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKQEAgLTAsMCArMSw1OTYgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisKKwlzdXBEb21haW46IEFjY2Vzc2liaWxpdHkKKwkJIworCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9QSE9ORSBpZiBpbiBjYWxsIHdpZGVseSBzcGVha2luZworCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9NRURJQSBvdGhlcndpc2UKKwkJIworCQkjIE90aGVyIGNhc2UgYXJlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBoYXMgaW52b2x2aW5nIGFjdGl2aXR5IG9mIHN0cmVhbXMuCisJCSMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCisJCWRvbWFpbjogRGV2aWNlCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQkjCisJCQkJIyBBY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyAwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgQWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29DYXJraXQKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSGRtaSBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAxCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZHRtZi5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZHRtZi5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0MjZjNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9kdG1mLnBmdwpAQCAtMCwwICsxLDYyNSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ2llcworCXN1cERvbWFpbjogRHRtZgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWlwID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyAwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBGb3JjZVNwZWFrZXJXaGVuTm90SW5DYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY28KKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMgYnV0IExpbmUgaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiBXaXJlZEhlYWRzZXQgaW4gdGhpcyBjYXNlLgorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBIZG1pCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBIZG1pIG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQlkb21haW46IEFyYworCQkJIworCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaUFyYworCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAorCisJCWRvbWFpbjogU3BkaWYKKwkJCSMKKwkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAwCisKKwkJZG9tYWluOiBBdXhMaW5lCisJCQkjCisJCQkjIERUTUYgc3RyYXRlZ3kgZm9sbG93cyBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhYTlhYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdwpAQCAtMCwwICsxLDM2MSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKworCXN1cERvbWFpbjogRW5mb3JjZWRBdWRpYmxlCisKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCSMgbm8gZW5mb3JjZWRfYXVkaWJsZSBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCisJCWRvbWFpbjogU3BlYWtlcgorCQkJY29uZjogU2VsZWN0ZWQKKwkJCQkjCisJCQkJIyBzdHJhdGVneSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIHVzZXMgc2FtZSByb3V0aW5nIHBvbGljeSBhcyBTVFJBVEVHWV9TT05JRklDQVRJT04KKwkJCQkjIGV4Y2VwdDoKKwkJCQkjICAgIC0gd2hlbiBpbiBjYWxsIHdoZXJlIGl0IGRvZXNuJ3QgZGVmYXVsdCB0byBTVFJBVEVHWV9QSE9ORSBiZWhhdmlvcgorCQkJCSMgICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJRm9yY2VVc2VGb3JTeXN0ZW0gSXMgRm9yY2VTeXN0ZW1FbmZvcmNlZAorCQkJCQlBTEwKKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCQkJQU5ZCisJCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkJIworCQkJCQkjIFNwZWFrZXIgaXMgYWxzbyB0aGUgZmFsbGJhY2sgZGV2aWNlIGlmIGFueSBvZiB0aGUgZGV2aWNlIGZyb20gRGV2aWNlMiBkb21haW4KKwkJCQkJIyBpcyBzZWxlY3RlZC4KKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHBob25lCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JEZXZpY2UKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEhkbWkKKwkJCQkJCUFOWQorCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJCQkJRm9yY2VVc2VGb3JEb2NrIElzTm90IEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgMAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEhkbWkKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IE5vRGV2aWNlCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfbWVkaWEucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X21lZGlhLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQzNTVjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X21lZGlhLnBmdwpAQCAtMCwwICsxLDM0MCBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKwlzdXBEb21haW46IE1lZGlhCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgMAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJIworCQkJCSMgSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgorCQkJCSMKKwkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMQorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJIworCQkJCSMgSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgorCQkJCSMKKwkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCWRvbWFpbjogQXJjCisJCQkjCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaUFyYworCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCisKKwkJZG9tYWluOiBTcGRpZgorCQkJIworCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDAKKworCQlkb21haW46IEF1eExpbmUKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9wYXRjaC5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGF0Y2gucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2MwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGF0Y2gucGZ3CkBAIC0wLDAgKzEsMzYgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBQYXRjaAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9wYXRjaC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9wYXRjaC9kZXZpY2VfYWRkcmVzcyA9CisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3Bob25lLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9waG9uZS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5M2Q0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9waG9uZS5wZncKQEAgLTAsMCArMSw0ODMgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBQaG9uZQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCSMgbm8gc29uaWZpY2F0aW9uIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogRGV2aWNlCisJCQljb25mOiBTY29DYXJraXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCQkJCUFOWQorCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisJCQkJCUFMTAorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCQkJIworCQkJCQkJIyBJbiBjYXNlIG9mIEZvcmNlIFNwZWFrZXIsIHByaW9yaXR5IGJldHdlZW4gZGV2aWNlIGFuZCBhY2Nlc3NvcnkgYXJlCisJCQkJCQkjIGludmVydGVkIGNvbXBhcmVkIHRvIEZvcmNlIE5vbmUgb3IgQnQgU2NvCisJCQkJCQkjCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogSGRtaQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJIworCQkJCSMgRmFsbGJhY2sgb24gZGVmYXVsdCBvdXRwdXQgZGV2aWNlIHdoaWNoIGNhbiBiZSBzcGVha2VyIGZvciBleGFtcGxlCisJCQkJIworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMQorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9yZXJvdXRpbmcucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3Jlcm91dGluZy5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmODgxNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9yZXJvdXRpbmcucGZ3CkBAIC0wLDAgKzEsMzYgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBSZXJvdXRpbmcKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jlcm91dGluZy9kZXZpY2VfYWRkcmVzcyA9CisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGVkZWViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncKQEAgLTAsMCArMSw0OTAgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBTb25pZmljYXRpb24KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgYnV0IEhETUkgaXMgbm90IHJlYWNoYWJsZQorCQkJCQkjCisJCQkJCWhkbWkgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IFNwZWFrZXIKKworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIEVORk9SQ0VEX0FVRElCTEUgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkJIworCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBTY29DYXJraXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU2NvSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU2NvCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkJIworCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVTQiBBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBOb25lCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZGQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncKQEAgLTAsMCArMSw1MzYgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBTb25pZmljYXRpb25SZXNwZWN0ZnVsCisJCSMKKwkJIyBTb25pZmljaWF0aW9uIFJlc3BlY3RmdWwgZm9sbG93czoKKwkJIwktIElmIGluIGNhbGw6IFN0cmF0ZWd5IHNvbmlmaWNhdGlvbiAodGhhdCBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGluIGNhbGwgYWxzby4uLikKKwkJIwktIElmIG5vdCBpbiBjYWxsIEFORCBhIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUgcmVtb3RlbHk6IFN0cmF0ZWd5IHNvbmlmaWNhdGlvbiAodGhhdAorCQkjICAgICBmb2xsb3dzIGVuZm9yY2VkIGF1ZGlibGUsIHdoaWNoIGZvbGxvd3MgbWVkaWEpCisJCSMJLSBpZiBub3QgaW4gY2FsbCBhbmQgbm8gbXVzaWMgc3RyZWFtIGFjdGl2ZSByZW1vdGVseSBhbmQgbXVzaWMgc3RyZWFtIGFjdGl2ZSk6IHN0cmF0ZWd5CisJCSMgICAgIG1lZGlhCisJCSMgICAtIE90aGVyd2lzZSBmb2xsb3dzIHNvbmlmaWNhdGlvbiBieSByZXBsYWNpbmcgc3BlYWtlciB3aXRoIHNwZWFrZXIgc2FmZSBpZiBzcGVha2VyIGlzCisJCSMJICBzZWxlY3RlZC4KKwkJIworCQkjIENhc2Ugb2Ygc3RyZWFtIGFjdGl2ZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBTcGVha2VycworCisJCQljb25mOiBTcGVha2VyU2FmZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlclNhZmUKKwkJCQkjCisJCQkJIyBGb2xsb3dzIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCBhbmQgcmVwbGFjZSBzcGVha2VyIGJ5IHNwZWFrZXIgc2FmZQorCQkJCSMgaWYgYW5kIG9ubHkgaWYgc3BlYWtlciBvbmx5IHNlbGVjdGVkCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMQorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBGb2xsb3dzIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vbmUKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQlkb21haW46IERldmljZTIKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29DYXJraXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY28KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQU5ZCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkJIworCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkJCSMKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMgYnV0IExpbmUgaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiBXaXJlZEhlYWRzZXQgaW4gdGhpcyBjYXNlLgorCQkJCQkjCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUFOWQorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJCQkjCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgVXNiQWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBBdXhEaWdpdGFsCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBIRE1JIG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAxCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmM3NjcwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKQEAgLTAsMCArMSw0MyBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKwlzdXBEb21haW46IFRyYW5zbWl0dGVkVGhyb3VnaFNwZWFrZXIKKwkJZG9tYWluOiBVbnJlYWNoZWFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IFNwZWFrZXIKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKaW5kZXggYjQzZjgzYi4uMDcxMDQ0MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKQEAgLTg0NzIsNyArODQ3Miw3IEBACiAgICAgPENvbmZpZ3VyYXRpb25zPgogICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU29uaWZpY2F0aW9uIj4KICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgotICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iUmluZ1RvbmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IlJpbmd0b25lIi8+CiAgICAgICAgIDwvQ29tcG91bmRSdWxlPgogICAgICAgPC9Db25maWd1cmF0aW9uPgogICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUGhvbmUiPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTE5ODAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IEFjY2Vzc2liaWxpdHkKLQkJIwotCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9QSE9ORSBpZiBpbiBjYWxsIHdpZGVseSBzcGVha2luZwotCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9NRURJQSBvdGhlcndpc2UKLQkJIwotCQkjIE90aGVyIGNhc2UgYXJlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBoYXMgaW52b2x2aW5nIGFjdGl2aXR5IG9mIHN0cmVhbXMuCi0JCSMKLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UKLQkJCWNvbmY6IFJlbW90ZVN1Ym1peAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgVVNCIGFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEhkbWkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDEKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEVhcnBpZWNlCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzYzc0MS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNjIzICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogRHRtZgotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0JCQljb25mOiBSZW1vdGVTdWJtaXgKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY28KLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbwotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMQotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCQkjCi0JCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgVVNCIGFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogSGRtaQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgSGRtaSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jawotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBTcGVha2VyCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IEFyYwotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaUFyYwotCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCi0KLQkJZG9tYWluOiBTcGRpZgotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BkaWYKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAotCi0JCWRvbWFpbjogQXV4TGluZQotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQXV4TGluZQotCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwNDYzMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogRW5mb3JjZWRBdWRpYmxlCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQkjIG5vIGVuZm9yY2VkX2F1ZGlibGUgb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VyCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCSMKLQkJCQkjIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgotCQkJCSMgZXhjZXB0OgotCQkJCSMgICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCi0JCQkJIyAgICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUFOWQotCQkJCQlGb3JjZVVzZUZvclN5c3RlbSBJcyBGb3JjZVN5c3RlbUVuZm9yY2VkCi0JCQkJCUFMTAotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4Ci0JCQkJCQlBTlkKLQkJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHAKLQkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgU3BlYWtlciBpcyBhbHNvIHRoZSBmYWxsYmFjayBkZXZpY2UgaWYgYW55IG9mIHRoZSBkZXZpY2UgZnJvbSBEZXZpY2UyIGRvbWFpbgotCQkJCQkjIGlzIHNlbGVjdGVkLgotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBSZW1vdGVTdWJtaXgKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkRldmljZQotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgSGRtaQotCQkJCQkJQU5ZCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQkJCQlGb3JjZVVzZUZvckRvY2sgSXNOb3QgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMQotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogVXNiQWNjZXNzb3J5Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogSGRtaQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBOb0RldmljZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjZhZTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5Ci0KLQlkb21haW5Hcm91cDogTWVkaWEKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCi0JCQkJIwotCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAxCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCi0JCQkJIwotCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogRGVmYXVsdAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQlkb21haW46IEFyYwotCQkJIwotCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKLQkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQotCQkJIwotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCi0KLQkJZG9tYWluOiBTcGRpZgotCQkJIwotCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKLQkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQotCQkJIwotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCi0KLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAotCi0JCWRvbWFpbjogQXV4TGluZQotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEF1eExpbmUKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzcxYWQ5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogUGhvbmUKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IERldmljZQotCQkJY29uZjogU2NvQ2Fya2l0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDEKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogVXNiRGV2aWNlCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQotCQkJCQlBTEwKLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJCSMKLQkJCQkJCSMgSW4gY2FzZSBvZiBGb3JjZSBTcGVha2VyLCBwcmlvcml0eSBiZXR3ZWVuIGRldmljZSBhbmQgYWNjZXNzb3J5IGFyZQotCQkJCQkJIyBpbnZlcnRlZCBjb21wYXJlZCB0byBGb3JjZSBOb25lIG9yIEJ0IFNjbwotCQkJCQkJIwotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEhkbWkKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IERlZmF1bHQKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBvbiBkZWZhdWx0IG91dHB1dCBkZXZpY2Ugd2hpY2ggY2FuIGJlIHNwZWFrZXIgZm9yIGV4YW1wbGUKLQkJCQkjCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMQotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlNjJmNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5Ci0KLQlkb21haW5Hcm91cDogUmVyb3V0aW5nCi0JCSMKLQkJIyBGYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5Ci0JCSMKLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0JCQljb25mOiBSZW1vdGVTdWJtaXgKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQkjCi0JCQkJIyBSZXJvdXRpbmcgaXMgc2ltaWxhciB0byBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIChleGVwdCBoZXJlOiBzb25pZmljYXRpb24gaXMgbm90IGFsbG93ZWQgb24gSERNSSkKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMQotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IERlZmF1bHQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzQwZDEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogU29uaWZpY2F0aW9uCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCSMgbm8gc29uaWZpY2F0aW9uIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCBidXQgSERNSSBpcyBub3QgcmVhY2hhYmxlCi0JCQkJCSMKLQkJCQkJaGRtaSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IFNwZWFrZXIKLQotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIEVORk9SQ0VEX0FVRElCTEUgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkJIwotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IERldmljZTIKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNjb0NhcmtpdAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNjbwotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDEKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVTQiBBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEVhcnBpZWNlCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjczYzRmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLWRvbWFpbkdyb3VwOiBEZXZpY2VGb3JTdHJhdGVneQotCi0JZG9tYWluR3JvdXA6IFNvbmlmaWNhdGlvblJlc3BlY3RmdWwKLQkJIwotCQkjIFNvbmlmaWNpYXRpb24gUmVzcGVjdGZ1bCBmb2xsb3dzOgotCQkjCS0gSWYgaW4gY2FsbDogU3RyYXRlZ3kgc29uaWZpY2F0aW9uICh0aGF0IGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaW4gY2FsbCBhbHNvLi4uKQotCQkjCS0gSWYgbm90IGluIGNhbGwgQU5EIGEgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZSByZW1vdGVseTogU3RyYXRlZ3kgc29uaWZpY2F0aW9uICh0aGF0Ci0JCSMgICAgIGZvbGxvd3MgZW5mb3JjZWQgYXVkaWJsZSwgd2hpY2ggZm9sbG93cyBtZWRpYSkKLQkJIwktIGlmIG5vdCBpbiBjYWxsIGFuZCBubyBtdXNpYyBzdHJlYW0gYWN0aXZlIHJlbW90ZWx5IGFuZCBtdXNpYyBzdHJlYW0gYWN0aXZlKTogc3RyYXRlZ3kKLQkJIyAgICAgbWVkaWEKLQkJIyAgIC0gT3RoZXJ3aXNlIGZvbGxvd3Mgc29uaWZpY2F0aW9uIGJ5IHJlcGxhY2luZyBzcGVha2VyIHdpdGggc3BlYWtlciBzYWZlIGlmIHNwZWFrZXIgaXMKLQkJIwkgIHNlbGVjdGVkLgotCQkjCi0JCSMgQ2FzZSBvZiBzdHJlYW0gYWN0aXZlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseQotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWZtID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VycwotCi0JCQljb25mOiBTcGVha2VyU2FmZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlclNhZmUKLQkJCQkjCi0JCQkJIyBGb2xsb3dzIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCBhbmQgcmVwbGFjZSBzcGVha2VyIGJ5IHNwZWFrZXIgc2FmZQotCQkJCSMgaWYgYW5kIG9ubHkgaWYgc3BlYWtlciBvbmx5IHNlbGVjdGVkCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDEKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBjYWxsCi0JCQkJCQkjCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IERldmljZTIKLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29DYXJraXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjbwotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQU5ZCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkJIwotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkJCSMKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUFOWQotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJCSMKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCQkjCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJCSMKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCQkjCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVzYkFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBBdXhEaWdpdGFsCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBIRE1JIG5vdCByZWFjaGFibGUgaW4gY2FsbC4KLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMQotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRWFycGllY2UKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOWMyMTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQotCi0Jc3VwRG9tYWluOiBUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyCi0JCWRvbWFpbjogVW5yZWFjaGVhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCXNwZGlmID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogU3BlYWtlcgotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTQwYjlkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotZG9tYWluOiBTdHJhdGVneUZvclN0cmVhbQotCi0JY29uZjogQ2FsaWJyYXRpb24KLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBwaG9uZQotCQkjCi0JCSMgTk9URTogU1lTVEVNIHN0cmVhbSB1c2VzIE1FRElBIHN0cmF0ZWd5IGJlY2F1c2UgbXV0aW5nIG11c2ljIGFuZCBzd2l0Y2hpbmcgb3V0cHV0cwotCQkjIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0Ci0JCSMKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbgotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBwaG9uZQotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGVuZm9yY2VkX2F1ZGlibGUKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBkdG1mCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSB0cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBhY2Nlc3NpYmlsaXR5Ci0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSByZXJvdXRpbmcKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncKaW5kZXggYjMxMTVlNy4uZmJlYTllMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3CkBAIC0yNCw3ICsyNCw3IEBACiAJCQkjIEluIGNhc2Ugb2YgUmluZyBvciBBbGFybSBzdHJlYW0gdHlwZSBhY3RpdmUsIHN3aXRjaGluZyB0byBzb25pZmljYXRpb24KIAkJCSMgQHRvZG86IGhhbmRsZSB0aGlzIGR5bmFtaWMgY2FzZS4gQXMgYSBXQSwgdXNpbmcgUmluZ3RvbmUgbW9kZS4uLgogCQkJIwotCQkJVGVsZXBob255TW9kZSBJcyBSaW5nVG9uZQorCQkJVGVsZXBob255TW9kZSBJcyBSaW5ndG9uZQogCiAJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3CmluZGV4IDkxN2Q0YTcuLmY5MjM2MTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvZGV2aWNlX2Zvcl9zdHJhdGVnaWVzLnBmdworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L2RldmljZV9mb3Jfc3RyYXRlZ2llcy5wZncKQEAgLTksNyArOSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMzcsNyArMzcsNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKQEAgLTY1LDcgKzY1LDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCkBAIC05Myw3ICs5Myw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMTIxLDcgKzEyMSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMTQ5LDcgKzE0OSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMjA1LDcgKzIwNSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtMjMzLDcgKzIzMyw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxZTQ0YS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPENvbXBvbmVudFR5cGVTZXQgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgICAgICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJTY2hlbWFzL0NvbXBvbmVudFR5cGVTZXQueHNkIj4KLSAgICA8IS0tIE91dHB1dCBkZXZpY2VzIGRlZmluaXRpb24gYXMgYSBiaXRmaWVsZCBmb3IgdGhlIHN1cHBvcnRlZCBkZXZpY2VzIHBlciBvdXRwdXQKLSAgICBwcm9maWxlLiBJdCBtdXN0IG1hdGNoIHdpdGggdGhlIG91dHB1dCBkZXZpY2UgZW51bSBwYXJhbWV0ZXIuCi0gICAgLS0+Ci0gICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9Ik91dHB1dERldmljZXNNYXNrIiBEZXNjcmlwdGlvbj0iMzJ0aCBiaXQgaXMgbm90IGFsbG93ZWQgYXMgZGVkaWNhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnB1dCBkZXZpY2VzIGRldGVjdGlvbiI+Ci0gICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIiBTaXplPSIxIiBQb3M9IjAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciIgU2l6ZT0iMSIgUG9zPSIxIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiIFNpemU9IjEiIFBvcz0iMyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIiBTaXplPSIxIiBQb3M9IjQiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjUiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiIFNpemU9IjEiIFBvcz0iNiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCIgU2l6ZT0iMSIgUG9zPSI3Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiIFNpemU9IjEiIFBvcz0iOCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIiBTaXplPSIxIiBQb3M9IjkiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSIgU2l6ZT0iMSIgUG9zPSIxMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIxMSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIxMiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5IiBTaXplPSIxIiBQb3M9IjEzIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiIFNpemU9IjEiIFBvcz0iMTQiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCIgU2l6ZT0iMSIgUG9zPSIxNSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiIFNpemU9IjEiIFBvcz0iMTYiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSIgU2l6ZT0iMSIgUG9zPSIxNyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyIgU2l6ZT0iMSIgUG9zPSIxOCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiIgU2l6ZT0iMSIgUG9zPSIxOSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSIgU2l6ZT0iMSIgUG9zPSIyMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSIgU2l6ZT0iMSIgUG9zPSIyMSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiIFNpemU9IjEiIFBvcz0iMjIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaXAiIFNpemU9IjEiIFBvcz0iMjMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVzIiBTaXplPSIxIiBQb3M9IjI0Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InN0dWIiIFNpemU9IjEiIFBvcz0iMzAiLz4KLSAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIElucHV0IGRldmljZXMgZGVmaW5pdGlvbiBhcyBhIGJpdGZpZWxkIGZvciB0aGUgc3VwcG9ydGVkIGRldmljZXMgcGVyIElucHV0Ci0gICAgcHJvZmlsZS4gSXQgbXVzdCBtYXRjaCB3aXRoIHRoZSBJbnB1dCBkZXZpY2UgZW51bSBwYXJhbWV0ZXIuCi0gICAgLS0+Ci0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXREZXZpY2VzTWFzayI+Ci0gICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNvbW11bmljYXRpb24iIFNpemU9IjEiIFBvcz0iMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50IiBTaXplPSIxIiBQb3M9IjEiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiIFNpemU9IjEiIFBvcz0iMiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjQiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSIgU2l6ZT0iMSIgUG9zPSI1Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCIgU2l6ZT0iMSIgUG9zPSI2Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIiBTaXplPSIxIiBQb3M9IjciLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCIgU2l6ZT0iMSIgUG9zPSI4Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjkiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSIgU2l6ZT0iMSIgUG9zPSIxMSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIiBTaXplPSIxIiBQb3M9IjEyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIiBTaXplPSIxIiBQb3M9IjEzIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIiBTaXplPSIxIiBQb3M9IjE0Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiIFNpemU9IjEiIFBvcz0iMTUiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiIFNpemU9IjEiIFBvcz0iMTYiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiIFNpemU9IjEiIFBvcz0iMTciLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siIFNpemU9IjEiIFBvcz0iMTgiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaXAiIFNpemU9IjEiIFBvcz0iMTkiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVzIiBTaXplPSIxIiBQb3M9IjIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InN0dWIiIFNpemU9IjEiIFBvcz0iMzAiLz4KLSAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJPdXRwdXRGbGFncyIKLSAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0idGhlIGF1ZGlvIG91dHB1dCBmbGFncyBzZXJ2ZSB0d28gcHVycG9zZXM6Ci0gICAgICAgICAgICAgICAgICAgIC0gd2hlbiBhbiBBdWRpb1RyYWNrIGlzIGNyZWF0ZWQgdGhleSBpbmRpY2F0ZSBhIHdpc2ggdG8gYmUgY29ubmVjdGVkIHRvIGFuCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHN0cmVhbSB3aXRoIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZsYWdzLgotICAgICAgICAgICAgICAgICAgICAtIHdoZW4gcHJlc2VudCBpbiBhbiBvdXRwdXQgcHJvZmlsZSBkZXNjcmlwdG9yIGxpc3RlZCBmb3IgYSBwYXJ0aWN1bGFyIGF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgbW9kdWxlLCB0aGV5IGluZGljYXRlIHRoYXQgYW4gb3V0cHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyB0aGUgYXR0cmlidXRlcyBpbmRpY2F0ZWQgYnkgdGhlIGZsYWdzLgotICAgICAgICAgICAgICAgICAgICBUaGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgd2lsbCB0cnkgdG8gbWF0Y2ggdGhlIGZsYWdzIGluIHRoZSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgICh3aGVuIGdldE91cHV0KCkgaXMgY2FsbGVkKSB0byBhbiBhdmFpbGFibGUgb3V0cHV0IHN0cmVhbS4iPgotICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkaXJlY3QiIFNpemU9IjEiIFBvcz0iMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJwcmltYXJ5IiBTaXplPSIxIiBQb3M9IjEiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZmFzdCIgU2l6ZT0iMSIgUG9zPSIyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRlZXBfYnVmZmVyIiBTaXplPSIxIiBQb3M9IjMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tcHJlc3Nfb2ZmbG9hZCIgU2l6ZT0iMSIgUG9zPSI0Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Im5vbl9ibG9ja2luZyIgU2l6ZT0iMSIgUG9zPSI1Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imh3X2F2X3N5bmMiIFNpemU9IjEiIFBvcz0iNiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dHMiIFNpemU9IjEiIFBvcz0iNyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyYXciIFNpemU9IjEiIFBvcz0iOCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzeW5jIiBTaXplPSIxIiBQb3M9IjkiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaWVjOTU4X25vbmF1ZGlvIiBTaXplPSIxIiBQb3M9IjEwIi8+Ci0gICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRGbGFncyIKLSAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVGhlIGF1ZGlvIGlucHV0IGZsYWdzIGFyZSBhbmFsb2dvdXMgdG8gYXVkaW8gb3V0cHV0IGZsYWdzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHkgdGhleSBhcmUgdXNlZCBvbmx5IHdoZW4gYW4gQXVkaW9SZWNvcmQgaXMgY3JlYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5kaWNhdGUgYSBwcmVmZXJlbmNlIHRvIGJlIGNvbm5lY3RlZCB0byBhbiBpbnB1dCBzdHJlYW0gd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmbGFncy4iPgotICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmYXN0IiBTaXplPSIxIiBQb3M9IjAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaHdfaG90d29yZCIgU2l6ZT0iMSIgUG9zPSIyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJhdyIgU2l6ZT0iMSIgUG9zPSIzIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InN5bmMiIFNpemU9IjEiIFBvcz0iNCIvPgotICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlc01hc2siIERlc2NyaXB0aW9uPSJUaGUgYXVkaW8gaW5wdXQgc291cmNlIGlzIGFsc28ga25vd24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIHVzZSBjYXNlLiI+Ci0gICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRlZmF1bHQiIFNpemU9IjEiIFBvcz0iMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJtaWMiIFNpemU9IjEiIFBvcz0iMSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV91cGxpbmsiIFNpemU9IjEiIFBvcz0iMiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9kb3dubGluayIgU2l6ZT0iMSIgUG9zPSIzIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX2NhbGwiIFNpemU9IjEiIFBvcz0iNCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjYW1jb3JkZXIiIFNpemU9IjEiIFBvcz0iNSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgU2l6ZT0iMSIgUG9zPSI2Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFNpemU9IjEiIFBvcz0iNyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4IiBTaXplPSIxIiBQb3M9IjgiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idW5wcm9jZXNzZWQiIFNpemU9IjEiIFBvcz0iOSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciIgU2l6ZT0iMSIgUG9zPSIxMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJob3R3b3JkIiBTaXplPSIxIiBQb3M9IjExIi8+Ci0gICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSBSb3V0aW5nIFN0cmF0ZWd5IGRlZmluaXRpb24gYXMgYW4gZW51bWVyYXRpb24uIE51bWVyaWNhbCB2YWx1ZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZQotICAgICAgICAgb2YgdGhlIHJvdXRpbmcgc3RyYXRlZ3kgaW4gcG9saWN5IGhlYWRlciBmaWxlLiAtLT4KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJhdGVneSI+Ci0gICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5IiBTaXplPSIzMiI+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9Im1lZGlhIiBOdW1lcmljYWw9IjAiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icGhvbmUiIE51bWVyaWNhbD0iMSIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJzb25pZmljYXRpb24iIE51bWVyaWNhbD0iMiIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJzb25pZmljYXRpb25fcmVzcGVjdGZ1bCIgTnVtZXJpY2FsPSIzIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImR0bWYiIE51bWVyaWNhbD0iNCIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJlbmZvcmNlZF9hdWRpYmxlIiBOdW1lcmljYWw9IjUiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0idHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyIiBOdW1lcmljYWw9IjYiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iYWNjZXNzaWJpbGl0eSIgTnVtZXJpY2FsPSI3Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InJlcm91dGluZyIgTnVtZXJpY2FsPSI4Ii8+Ci0gICAgICAgIDwvRW51bVBhcmFtZXRlcj4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iU3RyYXRlZ3k6JyUxJyI+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0ic2VsZWN0ZWRfb3V0cHV0X2RldmljZXMiIFR5cGU9Ik91dHB1dERldmljZXNNYXNrIi8+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJWb2x1bWVQcm9maWxlVHlwZSI+Ci0gICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InZvbHVtZV9wcm9maWxlIiBTaXplPSIzMiI+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InZvaWNlX2NhbGwiIE51bWVyaWNhbD0iMCIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJzeXN0ZW0iIE51bWVyaWNhbD0iMSIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJyaW5nIiBOdW1lcmljYWw9IjIiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ibXVzaWMiIE51bWVyaWNhbD0iMyIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJhbGFybSIgTnVtZXJpY2FsPSI0Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9Im5vdGlmaWNhdGlvbiIgTnVtZXJpY2FsPSI1Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImJsdWV0b290aF9zY28iIE51bWVyaWNhbD0iNiIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJlbmZvcmNlZF9hdWRpYmxlIiBOdW1lcmljYWw9IjciLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZHRtZiIgTnVtZXJpY2FsPSI4Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InR0cyIgTnVtZXJpY2FsPSI5Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImFjY2Vzc2liaWxpdHkiIE51bWVyaWNhbD0iMTAiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icmVyb3V0aW5nIiBOdW1lcmljYWw9IjExIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InBhdGNoIiBOdW1lcmljYWw9IjEyIi8+Ci0gICAgICAgIDwvRW51bVBhcmFtZXRlcj4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW0iPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfc3RyYXRlZ3kiIFR5cGU9IlN0cmF0ZWd5Ii8+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV92b2x1bWVfcHJvZmlsZSIgVHlwZT0iVm9sdW1lUHJvZmlsZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlZvbHVtZSBwcm9maWxlIGZvbGxvd2VkIGJ5IGEgZ2l2ZW4gc3RyZWFtIHR5cGUuIi8+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJVc2FnZSI+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9zdHJhdGVneSIgVHlwZT0iU3RyYXRlZ3kiIE1hcHBpbmc9IlVzYWdlOiclMSciLz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlIj4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX2lucHV0X2RldmljZSIgVHlwZT0iSW5wdXREZXZpY2VzTWFzayIKLSAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJJbnB1dFNvdXJjZTonJTEnIiBEZXNjcmlwdGlvbj0iU2VsZWN0ZWQgSW5wdXQgZGV2aWNlIi8+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLTwvQ29tcG9uZW50VHlwZVNldD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOWMzNTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxTdWJzeXN0ZW0geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJTY2hlbWFzL1N1YnN5c3RlbS54c2QiCi0gICAgICAgICAgIE5hbWU9InBvbGljeSIgVHlwZT0iUG9saWN5Ij4KLQotICAgIDxDb21wb25lbnRMaWJyYXJ5PgotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLSAgICAgICAgPCEtLSBDb21tb24gVHlwZXMgZGVmaW50aW9uIC0tPgotICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIi8+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmF0ZWdpZXMiIERlc2NyaXB0aW9uPSJJZGVudGlmaWVyIG11c3QgbWF0Y2ggdGhlIGVudW0gdmFsdWUgdG8gbWFrZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGluayBiZXR3ZWVuIHRoZSBQb2xpY3lNYW5hZ2VyIGFuZCBQRlciPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtZWRpYSIgVHlwZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IkFtZW5kMTpNZWRpYSxJZGVudGlmaWVyOjAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGhvbmUiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6UGhvbmUsSWRlbnRpZmllcjoxIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNvbmlmaWNhdGlvbiIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlNvbmlmaWNhdGlvbixJZGVudGlmaWVyOjIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6U29uaWZpY2F0aW9uUmVzcGVjdGZ1bCxJZGVudGlmaWVyOjMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IkFtZW5kMTpEdG1mLElkZW50aWZpZXI6NCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlbmZvcmNlZF9hdWRpYmxlIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkVuZm9yY2VkQXVkaWJsZSxJZGVudGlmaWVyOjUiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlRyYW5zbWl0dGVkVGhyb3VnaFNwZWFrZXIsSWRlbnRpZmllcjo2Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFjY2Vzc2liaWxpdHkiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6QWNjZXNzaWJpbGl0eSxJZGVudGlmaWVyOjciLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6UmVyb3V0aW5nLElkZW50aWZpZXI6OCIvPgotICAgICAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW1zIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zdHJlYW1fdHlwZV90IGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOlZvaWNlQ2FsbCxJZGVudGlmaWVyOjAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3lzdGVtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpTeXN0ZW0sSWRlbnRpZmllcjoxIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJpbmciIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOlJpbmcsSWRlbnRpZmllcjoyIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpNdXNpYyxJZGVudGlmaWVyOjMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOkFsYXJtLElkZW50aWZpZXI6NCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb24iIFR5cGU9IlN0cmVhbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJTdHJlYW06Tm90aWZpY2F0aW9uLElkZW50aWZpZXI6NSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJibHVldG9vdGhfc2NvIiBUeXBlPSJTdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IlN0cmVhbTpCbHVldG9vdGhTY28sSWRlbnRpZmllcjo2Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmVhbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iU3RyZWFtOkVuZm9yY2VBdWRpYmxlLElkZW50aWZpZXI6NyIKLSAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlNvdW5kcyB0aGF0IGNhbm5vdCBiZSBtdXRlZCBieSB1c2VyIGFuZCBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSByb3V0ZWQgdG8gc3BlYWtlciIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkdG1mIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpEdG1mLElkZW50aWZpZXI6OCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0dHMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOlR0cyxJZGVudGlmaWVyOjkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF5cyBvdmVyIHNwZWFrZXIgb25seSwgc2lsZW50IG9uIG90aGVyIGRldmljZXMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyZWFtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJTdHJlYW06QWNjZXNzaWJpbGl0eSxJZGVudGlmaWVyOjEwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGFjY2Vzc2liaWxpdHkgdGFsayBiYWNrIHByb21wdHMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpSZXJvdXRpbmcsSWRlbnRpZmllcjoxMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBkeW5hbWljIHBvbGljeSBvdXRwdXQgbWl4ZXMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGF0Y2giIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOlBhdGNoLElkZW50aWZpZXI6MTIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgaW50ZXJuYWwgYXVkaW8gZmxpbmdlciB0cmFja3MuIEZpeGVkIHZvbHVtZSIvPgotICAgICAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJVc2FnZXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3VzYWdlX3QgZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBtYXBwaW5nIG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSBlbnVtIj4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idW5rbm93biIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpVbmtub3duLElkZW50aWZpZXI6MCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtZWRpYSIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpNZWRpYSxJZGVudGlmaWVyOjEiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNvbW11bmljYXRpb24sSWRlbnRpZmllcjoyIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb25fc2lnbmFsbGluZyIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNvbW11bmljYXRpb25TaWduYWxsaW5nLElkZW50aWZpZXI6MyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhbGFybSIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpBbGFybSxJZGVudGlmaWVyOjQiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbixJZGVudGlmaWVyOjUiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uX3RlbGVwaG9ueV9yaW5ndG9uZSIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb25UZWxlcGhvbnlSaW5ndG9uZSxJZGVudGlmaWVyOjYiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fcmVxdWVzdCIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb25Db21tdW5pY2F0aW9uUmVxdWVzdCxJZGVudGlmaWVyOjciLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25faW5zdGFudCIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb25Db21tdW5pY2F0aW9uSW5zdGFudCxJZGVudGlmaWVyOjgiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fZGVsYXllZCIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb25Db21tdW5pY2F0aW9uRGVsYXRlZCxJZGVudGlmaWVyOjkiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uX2V2ZW50IiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uRXZlbnQsSWRlbnRpZmllcjoxMCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbmNlX2FjY2Vzc2liaWxpdHkiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6QXNzaXN0YW5jZUFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjoxMSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbmNlX25hdmlnYXRpb25fZ3VpZGFuY2UiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6QXNzaXN0YW5jZU5hdmlnYXRpb25HdWlkYW5jZSxJZGVudGlmaWVyOjEyIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFzc2lzdGFuY2Vfc29uaWZpY2F0aW9uIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VTb25pZmljYXRpb24sSWRlbnRpZmllcjoxMyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJnYW1lIiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOkJsdWV0b290aFNjbyxJZGVudGlmaWVyOjE0Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZpcnR1YWxfc291cmNlIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWaXJ0dWFsU291cmNlLElkZW50aWZpZXI6MTUiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW50IiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFudCxJZGVudGlmaWVyOjE2Ii8+Ci0gICAgICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc291cmNlX3QgZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBtYXBwaW5nIG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSBlbnVtIj4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZGVmYXVsdCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpEZWZhdWx0LElkZW50aWZpZXI6MCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtaWMiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6TWljLElkZW50aWZpZXI6MSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV91cGxpbmsiIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZVVwbGluayxJZGVudGlmaWVyOjIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfZG93bmxpbmsiIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlRG93bmxpbmssSWRlbnRpZmllcjozIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDYWxsLElkZW50aWZpZXI6NCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJjYW1jb3JkZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6Q2FtY29yZGVyLElkZW50aWZpZXI6NSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VSZWNvZ25pdGlvbixJZGVudGlmaWVyOjYiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNvbW11bmljYXRpb24sSWRlbnRpZmllcjo3Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlbW90ZV9zdWJtaXgiIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6UmVtb3RlU3VibWl4LElkZW50aWZpZXI6OCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ1bnByb2Nlc3NlZCIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpVbnByb2Nlc3NlZCxJZGVudGlmaWVyOjkiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZm1fdHVuZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6Rm1UdW5lcixJZGVudGlmaWVyOjE5OTgiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iaG90d29yZCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpIb3R3b3JkLElkZW50aWZpZXI6MTk5OSIvPgotICAgICAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDwvQ29tcG9uZW50TGlicmFyeT4KLQotICAgIDxJbnN0YW5jZURlZmluaXRpb24+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyZWFtcyIgVHlwZT0iU3RyZWFtcyIvPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN0cmF0ZWdpZXMiIFR5cGU9IlN0cmF0ZWdpZXMiLz4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJpbnB1dF9zb3VyY2VzIiBUeXBlPSJJbnB1dFNvdXJjZXMiLz4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ1c2FnZXMiIFR5cGU9IlVzYWdlcyIvPgotICAgIDwvSW5zdGFuY2VEZWZpbml0aW9uPgotPC9TdWJzeXN0ZW0+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5Q2xhc3MueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lDbGFzcy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lDbGFzcy54bWwKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5Q2xhc3MueG1sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjNWVkMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbApAQCAtMCwwICsxLDE4MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxDb21wb25lbnRUeXBlU2V0IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9Db21wb25lbnRUeXBlU2V0LnhzZCI+CisgICAgPCEtLSBPdXRwdXQgZGV2aWNlcyBkZWZpbml0aW9uIGFzIGEgYml0ZmllbGQgZm9yIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyBwZXIgb3V0cHV0CisgICAgcHJvZmlsZS4gSXQgbXVzdCBtYXRjaCB3aXRoIHRoZSBvdXRwdXQgZGV2aWNlIGVudW0gcGFyYW1ldGVyLgorICAgIC0tPgorICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJPdXRwdXREZXZpY2VzTWFzayIgRGVzY3JpcHRpb249IjMydGggYml0IGlzIG5vdCBhbGxvd2VkIGFzIGRlZGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaW5wdXQgZGV2aWNlcyBkZXRlY3Rpb24iPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSIgU2l6ZT0iMSIgUG9zPSIwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiIFNpemU9IjEiIFBvcz0iMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIiBTaXplPSIxIiBQb3M9IjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgU2l6ZT0iMSIgUG9zPSI0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0IiBTaXplPSIxIiBQb3M9IjYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiIFNpemU9IjEiIFBvcz0iNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIiBTaXplPSIxIiBQb3M9IjgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIgU2l6ZT0iMSIgUG9zPSI5Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiIFNpemU9IjEiIFBvcz0iMTAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSIgU2l6ZT0iMSIgUG9zPSIxMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIiBTaXplPSIxIiBQb3M9IjE0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iMTUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4IiBTaXplPSIxIiBQb3M9IjE2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiIFNpemU9IjEiIFBvcz0iMTciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiIFNpemU9IjEiIFBvcz0iMTgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiIFNpemU9IjEiIFBvcz0iMTkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iIFNpemU9IjEiIFBvcz0iMjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiIFNpemU9IjEiIFBvcz0iMjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIiBTaXplPSIxIiBQb3M9IjIyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImlwIiBTaXplPSIxIiBQb3M9IjIzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1cyIgU2l6ZT0iMSIgUG9zPSIyNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJwcm94eSIgU2l6ZT0iMSIgUG9zPSIyNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIyNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZWFyaW5nX2FpZCIgU2l6ZT0iMSIgUG9zPSIyNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlY2hvX2NhbmNlbGxlciIgU2l6ZT0iMSIgUG9zPSIyOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzdHViIiBTaXplPSIxIiBQb3M9IjMwIi8+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSBJbnB1dCBkZXZpY2VzIGRlZmluaXRpb24gYXMgYSBiaXRmaWVsZCBmb3IgdGhlIHN1cHBvcnRlZCBkZXZpY2VzIHBlciBJbnB1dAorICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgSW5wdXQgZGV2aWNlIGVudW0gcGFyYW1ldGVyLgorICAgIC0tPgorICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0RGV2aWNlc01hc2siPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCIgU2l6ZT0iMSIgUG9zPSIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiIFNpemU9IjEiIFBvcz0iNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiIFNpemU9IjEiIFBvcz0iNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyIgU2l6ZT0iMSIgUG9zPSI3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI5Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjEwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiIFNpemU9IjEiIFBvcz0iMTEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSIgU2l6ZT0iMSIgUG9zPSIxMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciIgU2l6ZT0iMSIgUG9zPSIxMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciIgU2l6ZT0iMSIgUG9zPSIxNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIiBTaXplPSIxIiBQb3M9IjE1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIiBTaXplPSIxIiBQb3M9IjE2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIiBTaXplPSIxIiBQb3M9IjE3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIiBTaXplPSIxIiBQb3M9IjE4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImlwIiBTaXplPSIxIiBQb3M9IjE5Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1cyIgU2l6ZT0iMSIgUG9zPSIyMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJwcm94eSIgU2l6ZT0iMSIgUG9zPSIyMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIyMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYmxlIiBTaXplPSIxIiBQb3M9IjIzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InN0dWIiIFNpemU9IjEiIFBvcz0iMzAiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJPdXRwdXRGbGFncyIKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0idGhlIGF1ZGlvIG91dHB1dCBmbGFncyBzZXJ2ZSB0d28gcHVycG9zZXM6CisgICAgICAgICAgICAgICAgICAgIC0gd2hlbiBhbiBBdWRpb1RyYWNrIGlzIGNyZWF0ZWQgdGhleSBpbmRpY2F0ZSBhIHdpc2ggdG8gYmUgY29ubmVjdGVkIHRvIGFuCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHN0cmVhbSB3aXRoIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZsYWdzLgorICAgICAgICAgICAgICAgICAgICAtIHdoZW4gcHJlc2VudCBpbiBhbiBvdXRwdXQgcHJvZmlsZSBkZXNjcmlwdG9yIGxpc3RlZCBmb3IgYSBwYXJ0aWN1bGFyIGF1ZGlvCisgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgbW9kdWxlLCB0aGV5IGluZGljYXRlIHRoYXQgYW4gb3V0cHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyB0aGUgYXR0cmlidXRlcyBpbmRpY2F0ZWQgYnkgdGhlIGZsYWdzLgorICAgICAgICAgICAgICAgICAgICBUaGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgd2lsbCB0cnkgdG8gbWF0Y2ggdGhlIGZsYWdzIGluIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICh3aGVuIGdldE91cHV0KCkgaXMgY2FsbGVkKSB0byBhbiBhdmFpbGFibGUgb3V0cHV0IHN0cmVhbS4iPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkaXJlY3QiIFNpemU9IjEiIFBvcz0iMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJwcmltYXJ5IiBTaXplPSIxIiBQb3M9IjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZmFzdCIgU2l6ZT0iMSIgUG9zPSIyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRlZXBfYnVmZmVyIiBTaXplPSIxIiBQb3M9IjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tcHJlc3Nfb2ZmbG9hZCIgU2l6ZT0iMSIgUG9zPSI0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Im5vbl9ibG9ja2luZyIgU2l6ZT0iMSIgUG9zPSI1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imh3X2F2X3N5bmMiIFNpemU9IjEiIFBvcz0iNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dHMiIFNpemU9IjEiIFBvcz0iNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyYXciIFNpemU9IjEiIFBvcz0iOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzeW5jIiBTaXplPSIxIiBQb3M9IjkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaWVjOTU4X25vbmF1ZGlvIiBTaXplPSIxIiBQb3M9IjEwIi8+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRGbGFncyIKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVGhlIGF1ZGlvIGlucHV0IGZsYWdzIGFyZSBhbmFsb2dvdXMgdG8gYXVkaW8gb3V0cHV0IGZsYWdzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHkgdGhleSBhcmUgdXNlZCBvbmx5IHdoZW4gYW4gQXVkaW9SZWNvcmQgaXMgY3JlYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5kaWNhdGUgYSBwcmVmZXJlbmNlIHRvIGJlIGNvbm5lY3RlZCB0byBhbiBpbnB1dCBzdHJlYW0gd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmbGFncy4iPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmYXN0IiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaHdfaG90d29yZCIgU2l6ZT0iMSIgUG9zPSIyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJhdyIgU2l6ZT0iMSIgUG9zPSIzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InN5bmMiIFNpemU9IjEiIFBvcz0iNCIvPgorICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlc01hc2siIERlc2NyaXB0aW9uPSJUaGUgYXVkaW8gaW5wdXQgc291cmNlIGlzIGFsc28ga25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIHVzZSBjYXNlLiI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRlZmF1bHQiIFNpemU9IjEiIFBvcz0iMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJtaWMiIFNpemU9IjEiIFBvcz0iMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV91cGxpbmsiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9kb3dubGluayIgU2l6ZT0iMSIgUG9zPSIzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX2NhbGwiIFNpemU9IjEiIFBvcz0iNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjYW1jb3JkZXIiIFNpemU9IjEiIFBvcz0iNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgU2l6ZT0iMSIgUG9zPSI2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFNpemU9IjEiIFBvcz0iNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4IiBTaXplPSIxIiBQb3M9IjgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idW5wcm9jZXNzZWQiIFNpemU9IjEiIFBvcz0iOSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciIgU2l6ZT0iMSIgUG9zPSIxMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJob3R3b3JkIiBTaXplPSIxIiBQb3M9IjExIi8+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlZvbHVtZVByb2ZpbGVUeXBlIj4KKyAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0idm9sdW1lX3Byb2ZpbGUiIFNpemU9IjMyIj4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0idm9pY2VfY2FsbCIgTnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InN5c3RlbSIgTnVtZXJpY2FsPSIxIi8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InJpbmciIE51bWVyaWNhbD0iMiIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJtdXNpYyIgTnVtZXJpY2FsPSIzIi8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImFsYXJtIiBOdW1lcmljYWw9IjQiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ibm90aWZpY2F0aW9uIiBOdW1lcmljYWw9IjUiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iYmx1ZXRvb3RoX3NjbyIgTnVtZXJpY2FsPSI2Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImVuZm9yY2VkX2F1ZGlibGUiIE51bWVyaWNhbD0iNyIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJkdG1mIiBOdW1lcmljYWw9IjgiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0idHRzIiBOdW1lcmljYWw9IjkiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iYWNjZXNzaWJpbGl0eSIgTnVtZXJpY2FsPSIxMCIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJyZXJvdXRpbmciIE51bWVyaWNhbD0iMTEiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icGF0Y2giIE51bWVyaWNhbD0iMTIiLz4KKyAgICAgICAgPC9FbnVtUGFyYW1ldGVyPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmVhbSIgIE1hcHBpbmc9IlN0cmVhbSI+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV92b2x1bWVfcHJvZmlsZSIgVHlwZT0iVm9sdW1lUHJvZmlsZVR5cGUiCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlZvbHVtZSBwcm9maWxlIGZvbGxvd2VkIGJ5IGEgZ2l2ZW4gc3RyZWFtIHR5cGUuIi8+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2UiPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfaW5wdXRfZGV2aWNlIiBUeXBlPSJJbnB1dERldmljZXNNYXNrIgorICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IklucHV0U291cmNlIiBEZXNjcmlwdGlvbj0iU2VsZWN0ZWQgSW5wdXQgZGV2aWNlIi8+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgUFJPRFVDVCBTVFJBVEVHWSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlByb2R1Y3RTdHJhdGVneSIgTWFwcGluZz0iUHJvZHVjdFN0cmF0ZWd5Ij4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzZWxlY3RlZF9vdXRwdXRfZGV2aWNlcyIgVHlwZT0iT3V0cHV0RGV2aWNlc01hc2siLz4KKyAgICAgICAgPFN0cmluZ1BhcmFtZXRlciBOYW1lPSJkZXZpY2VfYWRkcmVzcyIgTWF4TGVuZ3RoPSIyNTYiCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249ImlmIGFueSwgZGV2aWNlIGFkZHJlc3MgYXNzb2NpYXRlZCIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBQUk9EVUNUIFNUUkFURUdZIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworPC9Db21wb25lbnRUeXBlU2V0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tbm8tc3RyYXRlZ3kueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tbm8tc3RyYXRlZ3kueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTc1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1uby1zdHJhdGVneS54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTdWJzeXN0ZW0geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJTY2hlbWFzL1N1YnN5c3RlbS54c2QiCisgICAgICAgICAgIE5hbWU9InBvbGljeSIgVHlwZT0iUG9saWN5Ij4KKworICAgIDxDb21wb25lbnRMaWJyYXJ5PgorICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKyAgICAgICAgPCEtLSBDb21tb24gVHlwZXMgZGVmaW50aW9uIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIi8+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW1zIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zdHJlYW1fdHlwZV90IGRlZmluaXRpb24iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3lzdGVtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1NZU1RFTSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyaW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JJTkciLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibXVzaWMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fTVVTSUMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fQUxBUk0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJibHVldG9vdGhfc2NvIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIgorICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iU291bmRzIHRoYXQgY2Fubm90IGJlIG11dGVkIGJ5IHVzZXIgYW5kIG11c3QgYmUgcm91dGVkIHRvIHNwZWFrZXIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9EVE1GIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InR0cyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9UVFMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIuIFBsYXlzIG92ZXIgc3BlYWtlciBvbmx5LCBzaWxlbnQgb24gb3RoZXIgZGV2aWNlcyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgYWNjZXNzaWJpbGl0eSB0YWxrIGJhY2sgcHJvbXB0cyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZXJvdXRpbmciIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUkVST1VUSU5HIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGR5bmFtaWMgcG9saWN5IG91dHB1dCBtaXhlcyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwYXRjaCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9QQVRDSCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBpbnRlcm5hbCBhdWRpbyBmbGluZ2VyIHRyYWNrcy4gRml4ZWQgdm9sdW1lIi8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3NvdXJjZV90IGRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImRlZmF1bHQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9ERUZBVUxUIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1pYyIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX01JQyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV91cGxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9kb3dubGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJjYW1jb3JkZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9DQU1DT1JERVIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfcmVjb2duaXRpb24iIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVtb3RlX3N1Ym1peCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idW5wcm9jZXNzZWQiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJmbV90dW5lciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0ZNX1RVTkVSIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImhvdHdvcmQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9IT1RXT1JEIi8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPC9Db21wb25lbnRMaWJyYXJ5PgorCisgICAgPEluc3RhbmNlRGVmaW5pdGlvbj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzdHJlYW1zIiBUeXBlPSJTdHJlYW1zIi8+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0iaW5wdXRfc291cmNlcyIgVHlwZT0iSW5wdXRTb3VyY2VzIi8+CisgICAgPC9JbnN0YW5jZURlZmluaXRpb24+Cis8L1N1YnN5c3RlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVjZTJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCkBAIC0wLDAgKzEsODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8U3Vic3lzdGVtIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9TdWJzeXN0ZW0ueHNkIgorICAgICAgICAgICBOYW1lPSJwb2xpY3kiIFR5cGU9IlBvbGljeSI+CisKKyAgICA8Q29tcG9uZW50TGlicmFyeT4KKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisgICAgICAgIDwhLS0gQ29tbW9uIFR5cGVzIGRlZmludGlvbiAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCIvPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJQcm9kdWN0U3RyYXRlZ2llcy54bWwiLz4KKworCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9TWVNURU0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9SSU5HIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX01VU0lDIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FMQVJNIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlNvdW5kcyB0aGF0IGNhbm5vdCBiZSBtdXRlZCBieSB1c2VyIGFuZCBtdXN0IGJlIHJvdXRlZCB0byBzcGVha2VyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRFRNRiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0dHMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fVFRTIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLiBQbGF5cyBvdmVyIHNwZWFrZXIgb25seSwgc2lsZW50IG9uIG90aGVyIGRldmljZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGFjY2Vzc2liaWxpdHkgdGFsayBiYWNrIHByb21wdHMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JFUk9VVElORyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBkeW5hbWljIHBvbGljeSBvdXRwdXQgbWl4ZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGF0Y2giIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUEFUQ0giCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgaW50ZXJuYWwgYXVkaW8gZmxpbmdlciB0cmFja3MuIEZpeGVkIHZvbHVtZSIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zb3VyY2VfdCBkZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkZWZhdWx0IiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfREVGQVVMVCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtaWMiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9NSUMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfdXBsaW5rIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfZG93bmxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0NBTEwiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iY2FtY29yZGVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfQ0FNQ09SREVSIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlbW90ZV9zdWJtaXgiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVucHJvY2Vzc2VkIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZm1fdHVuZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9GTV9UVU5FUiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJob3R3b3JkIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfSE9UV09SRCIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKyAgICA8L0NvbXBvbmVudExpYnJhcnk+CisKKyAgICA8SW5zdGFuY2VEZWZpbml0aW9uPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN0cmVhbXMiIFR5cGU9IlN0cmVhbXMiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJpbnB1dF9zb3VyY2VzIiBUeXBlPSJJbnB1dFNvdXJjZXMiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwcm9kdWN0X3N0cmF0ZWdpZXMiIFR5cGU9IlByb2R1Y3RTdHJhdGVnaWVzIi8+CisgICAgPC9JbnN0YW5jZURlZmluaXRpb24+Cis8L1N1YnN5c3RlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUHJvZHVjdFN0cmF0ZWdpZXMueG1sLmluIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2MGIyNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUHJvZHVjdFN0cmF0ZWdpZXMueG1sLmluCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Q29tcG9uZW50VHlwZVNldCB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29tcG9uZW50VHlwZVNldC54c2QiPgorCisgIDwhLS0gYXV0b21hdGljYWxseSBwb3B1bGF0ZSB0aGUgc3RyYXRlZ3kgc3RydWN0dXJlIHBsdWdpbiBmaWxlIGZyb20gRW5naW5lIENvbmZpZ3VyYXRpb24gWE1MIGZpbGUKKyAgICAgICAgQ29tcG9uZW50IE5hbWU9Inh4eCIgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5Ii8tLT4KKyAgPENvbXBvbmVudFR5cGUgTmFtZT0iUHJvZHVjdFN0cmF0ZWdpZXMiIERlc2NyaXB0aW9uPSIiPgorICA8L0NvbXBvbmVudFR5cGU+CisKKzwvQ29tcG9uZW50VHlwZVNldD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL3BvbGljeV9jcml0ZXJpYS50eHQgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9wb2xpY3lfY3JpdGVyaWEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODBjYmUxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL3BvbGljeV9jcml0ZXJpYS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1FeGNsdXNpdmVDcml0ZXJpb24gVGVsZXBob255TW9kZSAgICAgICAgICAgICAgICA6ICAgTm9ybWFsICAgICAgICAgIFJpbmdUb25lICAgICAgICAgICAgICAgIEluQ2FsbCAgICAgICAgICAgICAgSW5Db21tdW5pY2F0aW9uCi1JbmNsdXNpdmVDcml0ZXJpb24gQXZhaWxhYmxlSW5wdXREZXZpY2VzICAgICAgICA6ICAgQ29tbXVuaWNhdGlvbiBBbWJpZW50IEJ1aWx0aW5NaWMgQmx1ZXRvb3RoU2NvSGVhZHNldCBXaXJlZEhlYWRzZXQgSGRtaSBUZWxlcGhvbnlSeCBCYWNrTWljIFJlbW90ZVN1Ym1peCBBbmxnRG9ja0hlYWRzZXQgRGd0bERvY2tIZWFkc2V0IFVzYkFjY2Vzc29yeSBVc2JEZXZpY2UgRm1UdW5lciBUdlR1bmVyIExpbmUgU3BkaWYgQmx1ZXRvb3RoQTJkcCBMb29wYmFjayBJcCBCdXMgU3R1YgotSW5jbHVzaXZlQ3JpdGVyaW9uIEF2YWlsYWJsZU91dHB1dERldmljZXMgICAgICAgOiAgIEVhcnBpZWNlIFNwZWFrZXIgV2lyZWRTcGVha2VyIFdpcmVkSGVhZHNldCBXaXJlZEhlYWRwaG9uZSBCbHVldG9vdGhTY28gQmx1ZXRvb3RoU2NvSGVhZHNldCBCbHVldG9vdGhTY29DYXJraXQgQmx1ZXRvb3RoQTJkcCBCbHVldG9vdGhBMmRwSGVhZHBob25lcyBCbHVldG9vdGhBMmRwU3BlYWtlciBIZG1pIEFubGdEb2NrSGVhZHNldCBEZ3RsRG9ja0hlYWRzZXQgVXNiQWNjZXNzb3J5IFVzYkRldmljZSBSZW1vdGVTdWJtaXggVGVsZXBob255VHggTGluZSBIZG1pQXJjIFNwZGlmIEZtIEF1eExpbmUgU3BlYWtlclNhZmUgSXAgQnVzIFN0dWIKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckNvbW11bmljYXRpb24gICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VTcGVha2VyICAgICAgICAgICAgRm9yY2VCdFNjbwotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yTWVkaWEgICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVNwZWFrZXIJCQlGb3JjZUhlYWRwaG9uZXMgICAgICAgICBGb3JjZUJ0QTJkcCAgICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkgRm9yY2VBbmFsb2dEb2NrIEZvcmNlRGlnaXRhbERvY2sgICAgRm9yY2VOb0J0QTJkcCAgICAgICBGb3JjZVN5c3RlbUVuZm9yY2VkCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JSZWNvcmQgICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlQnRTY28gICAgICAgICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckRvY2sgICAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VXaXJlZEFjY2Vzc29yeSAgICAgRm9yY2VCdENhckRvY2sgICAgICBGb3JjZUJ0RGVza0RvY2sgICAgIEZvcmNlQW5hbG9nRG9jayBGb3JjZURpZ2l0YWxEb2NrCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JTeXN0ZW0gICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlU3lzdGVtRW5mb3JjZWQKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZCAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VFbmNvZGVkU3Vycm91bmROZXZlciAgIEZvcmNlRW5jb2RlZFN1cnJvdW5kQWx3YXlzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCmluZGV4IDM1NTljZjEuLjQ3MDZkN2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCkBAIC04LDEwICs4LDkgQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAgICAgUG9saWN5U3Vic3lzdGVtQnVpbGRlci5jcHAgXAogICAgIFBvbGljeVN1YnN5c3RlbS5jcHAgXAotICAgIFN0cmF0ZWd5LmNwcCBcCiAgICAgSW5wdXRTb3VyY2UuY3BwIFwKICAgICBTdHJlYW0uY3BwIFwKLSAgICBVc2FnZS5jcHAKKyAgICBQcm9kdWN0U3RyYXRlZ3kuY3BwCiAKIExPQ0FMX0NGTEFHUyArPSBcCiAgICAgLVdhbGwgXApAQCAtMjEsMTggKzIwLDI1IEBACiAgICAgLWZ2aXNpYmlsaXR5PWhpZGRlbgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZSAgXAogICAgIGxpYnBhcmFtZXRlciBcCisgICAgbGlibWVkaWFfaGVscGVyIFwKICAgICBsaWJsb2cgXAogCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9jbGllbnRfaGVhZGVycyBcCisgICAgbGliYmFzZV9oZWFkZXJzCisKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicGZ3X3V0aWxpdHkKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYnBmd191dGlsaXR5IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX01PRFVMRSA6PSBsaWJwb2xpY3ktc3Vic3lzdGVtCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcAppbmRleCBlYWM0ZWZlLi5mOTFmOGQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgogI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCiAjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKIApAQCAtMzMsOSArMzQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKICAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpCiB7Ci0gICAgbUlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fc291cmNlX3Q+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUoY29udGV4dC5nZXRJdGVtKE1hcHBpbmdLZXlOYW1lKSk7CisKKyAgICBpZihub3QgYW5kcm9pZDo6U291cmNlVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhuYW1lLCBtSWQpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgSW5wdXQgU291cmNlIG5hbWU6ICVzLCBpbnZhbGlkIFhNTCBzdHJ1Y3R1cmUgZmlsZSIsIG5hbWUuY19zdHIoKSk7CisgICAgfQogICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkSW5wdXRTb3VyY2UoZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7CisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkSW5wdXRTb3VyY2UobmFtZSwgbUlkKTsKIH0KIAogYm9vbCBJbnB1dFNvdXJjZTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmNwcAppbmRleCA5OGQxMGE5Li44YmQ3ZjY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmNwcApAQCAtMTcsMTAgKzE3LDkgQEAKICNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKICNpbmNsdWRlICJTdWJzeXN0ZW1PYmplY3RGYWN0b3J5LmgiCiAjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKLSNpbmNsdWRlICJTdHJhdGVneS5oIgogI2luY2x1ZGUgIlN0cmVhbS5oIgogI2luY2x1ZGUgIklucHV0U291cmNlLmgiCi0jaW5jbHVkZSAiVXNhZ2UuaCIKKyNpbmNsdWRlICJQcm9kdWN0U3RyYXRlZ3kuaCIKICNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTM2LDkgKzM1LDggQEAKIAogCiBjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1TdHJlYW1Db21wb25lbnROYW1lID0gIlN0cmVhbSI7Ci1jb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1TdHJhdGVneUNvbXBvbmVudE5hbWUgPSAiU3RyYXRlZ3kiOwogY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptSW5wdXRTb3VyY2VDb21wb25lbnROYW1lID0gIklucHV0U291cmNlIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVVzYWdlQ29tcG9uZW50TmFtZSA9ICJVc2FnZSI7Citjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1Qcm9kdWN0U3RyYXRlZ3lDb21wb25lbnROYW1lID0gIlByb2R1Y3RTdHJhdGVneSI7CiAKIFBvbGljeVN1YnN5c3RlbTo6UG9saWN5U3Vic3lzdGVtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb3JlOjpsb2c6OkxvZ2dlciAmbG9nZ2VyKQogICAgIDogQ1N1YnN5c3RlbShuYW1lLCBsb2dnZXIpLApAQCAtNjUsMjIgKzYzLDE2IEBACiAgICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKICAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFN0cmVhbT4oCiAgICAgICAgICAgICBtU3RyZWFtQ29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKLSAgICAgICAgKTsKLSAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAotICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8U3RyYXRlZ3k+KAotICAgICAgICAgICAgbVN0cmF0ZWd5Q29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQotICAgICAgICApOwotICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCi0gICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxVc2FnZT4oCi0gICAgICAgICAgICBtVXNhZ2VDb21wb25lbnROYW1lLAotICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUFtZW5kMSkgfCAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5TmFtZSkpCiAgICAgICAgICk7CiAgICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKICAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PElucHV0U291cmNlPigKICAgICAgICAgICAgIG1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKKyAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlOYW1lKSkKKyAgICAgICAgKTsKKyAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAorICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8UHJvZHVjdFN0cmF0ZWd5PigKKyAgICAgICAgICAgIG1Qcm9kdWN0U3RyYXRlZ3lDb21wb25lbnROYW1lLCAoMSA8PCBNYXBwaW5nS2V5TmFtZSkpCiAgICAgICAgICk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uaAppbmRleCA4MjJlZWI5Li45YmYxYzIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5oCkBAIC01Myw3ICs1Myw2IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1LZXlBbWVuZDM7IC8qKjwgYW1lbmQzIGtleSBtYXBwaW5nIHN0cmluZy4gKi8KIAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtU3RyZWFtQ29tcG9uZW50TmFtZTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVN0cmF0ZWd5Q29tcG9uZW50TmFtZTsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbUlucHV0U291cmNlQ29tcG9uZW50TmFtZTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVVzYWdlQ29tcG9uZW50TmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVByb2R1Y3RTdHJhdGVneUNvbXBvbmVudE5hbWU7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQ5NDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5jcHAKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJQcm9kdWN0U3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgorI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OnByb2R1Y3Rfc3RyYXRlZ3lfdDsKKworUHJvZHVjdFN0cmF0ZWd5OjpQcm9kdWN0U3RyYXRlZ3koY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBjb3JlOjpsb2c6OkxvZ2dlciYgbG9nZ2VyKQorICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nS2V5QW1lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwcGluZ0tleUFtZW5kRW5kIC0gTWFwcGluZ0tleUFtZW5kMSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUoY29udGV4dC5nZXRJdGVtKE1hcHBpbmdLZXlOYW1lKSk7CisKKyAgICBBTE9HX0FTU0VSVChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgIT0gbnVsbHB0ciwgIkludmFsaWQgQ29uZmlndXJhYmxlIEVsZW1lbnQiKTsKKyAgICBtUG9saWN5U3Vic3lzdGVtID0gc3RhdGljX2Nhc3Q8Y29uc3QgUG9saWN5U3Vic3lzdGVtICo+KAorICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpOworICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lTdWJzeXN0ZW0gIT0gbnVsbHB0ciwgIkludmFsaWQgUG9saWN5IFN1YnN5c3RlbSIpOworCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZSA9IG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpOworICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgIT0gbnVsbHB0ciwgIkludmFsaWQgUG9saWN5IFBsdWdpbiBJbnRlcmZhY2UiKTsKKworICAgIG1JZCA9IG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShuYW1lKTsKKworICAgIEFMT0dfQVNTRVJUKG1JZCAhPSBQUk9EVUNUX1NUUkFURUdZX0lOVkFMSUQsICJQcm9kdWN0IFN0cmF0ZWd5ICVzIG5vdCBmb3VuZCIsIG5hbWUuY19zdHIoKSk7CisKKyAgICBBTE9HRSgiUHJvZHVjdCBTdHJhdGVneSAlcyBhZGRlZCIsIG5hbWUuY19zdHIoKSk7Cit9CisKK2Jvb2wgUHJvZHVjdFN0cmF0ZWd5OjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgRGV2aWNlIGRldmljZVBhcmFtczsKKyAgICBibGFja2JvYXJkUmVhZCgmZGV2aWNlUGFyYW1zLCBzaXplb2YoZGV2aWNlUGFyYW1zKSk7CisKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShtSWQsIGRldmljZVBhcmFtcy5hcHBsaWNhYmxlRGV2aWNlKTsKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KG1JZCwgZGV2aWNlUGFyYW1zLmRldmljZUFkZHJlc3MpOworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGYwODIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCisjaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCisjaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgUG9saWN5U3Vic3lzdGVtOworCitjbGFzcyBQcm9kdWN0U3RyYXRlZ3kgOiBwdWJsaWMgQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdAoreworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbU1heFN0cmluZ1NpemUgPSAyNTc7IC8qKjwgbWF4IHN0cmluZyBzaXplIChwbHVzIHplcm8gdGVybWluYWwpLiAqLworCisgICAgc3RydWN0IERldmljZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgYXBwbGljYWJsZURldmljZTsgLyoqPCBhcHBsaWNhYmxlIGRldmljZSBmb3IgdGhpcyBzdHJhdGVneS4gKi8KKyAgICAgICAgY2hhciBkZXZpY2VBZGRyZXNzW21NYXhTdHJpbmdTaXplXTsgLyoqPCBkZXZpY2UgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHJhdGVneS4gKi8KKyAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitwdWJsaWM6CisgICAgUHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwKKyAgICAgICAgICAgICBjb3JlOjpsb2c6OkxvZ2dlciYgbG9nZ2VyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCBzZW5kVG9IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOworCitwcml2YXRlOgorICAgIGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqbVBvbGljeVN1YnN5c3RlbTsgLyoqPCBSb3V0ZSBzdWJzeXRlbSBwbHVnaW4uICovCisKKyAgICBhbmRyb2lkOjpwcm9kdWN0X3N0cmF0ZWd5X3QgbUlkOworCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggQXVkaW8gUG9saWN5IEVuZ2luZS4KKyAgICAgKi8KKyAgICBhbmRyb2lkOjpBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqbVBvbGljeVBsdWdpbkludGVyZmFjZTsKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2YzNhOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJTdHJhdGVneS5oIgotI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCi0jaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCi0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgYW5kcm9pZDo6cm91dGluZ19zdHJhdGVneTsKLQotU3RyYXRlZ3k6OlN0cmF0ZWd5KGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAotICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgY29yZTo6bG9nOjpMb2dnZXImIGxvZ2dlcikKLSAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCksCi0gICAgICBtUG9saWN5U3Vic3lzdGVtKHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKLSAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpCi17Ci0gICAgbUlkID0gc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7Ci0KLSAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFN0cmF0ZWd5KGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOwotfQotCi1ib29sIFN0cmF0ZWd5OjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCi17Ci0gICAgdWludDMyX3QgYXBwbGljYWJsZU91dHB1dERldmljZTsKLSAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZU91dHB1dERldmljZSwgc2l6ZW9mKGFwcGxpY2FibGVPdXRwdXREZXZpY2UpKTsKLSAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlRm9yU3RyYXRlZ3kobUlkLCBhcHBsaWNhYmxlT3V0cHV0RGV2aWNlKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMmI4MmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QuaCIKLSNpbmNsdWRlICJJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJNYXBwaW5nQ29udGV4dC5oIgotI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1jbGFzcyBQb2xpY3lTdWJzeXN0ZW07Ci0KLWNsYXNzIFN0cmF0ZWd5IDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKLXsKLXB1YmxpYzoKLSAgICBTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAotICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKLSAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsCi0gICAgICAgICAgICAgY29yZTo6bG9nOjpMb2dnZXImIGxvZ2dlcik7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgc2VuZFRvSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKLQotcHJpdmF0ZToKLSAgICBjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKm1Qb2xpY3lTdWJzeXN0ZW07IC8qKjwgUm91dGUgc3Vic3l0ZW0gcGx1Z2luLiAqLwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggQXVkaW8gUG9saWN5IEVuZ2luZS4KLSAgICAgKi8KLSAgICBhbmRyb2lkOjpBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqbVBvbGljeVBsdWdpbkludGVyZmFjZTsKLQotICAgIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3kgbUlkOyAvKio8IHN0cmF0ZWd5IGlkZW50aWZpZXIgdG8gbGluayB3aXRoIGF1ZGlvLmguKi8KLX07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uY3BwCmluZGV4IGM2NDJhMjMuLjUyMzBlMGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uY3BwCkBAIC0xNyw5ICsxNyw5IEBACiAjaW5jbHVkZSAiU3RyZWFtLmgiCiAjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKICNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgYW5kcm9pZDo6cm91dGluZ19zdHJhdGVneTsKIAogU3RyZWFtOjpTdHJlYW0oY29uc3Qgc3RyaW5nICYvKm1hcHBpbmdWYWx1ZSovLAogICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LApAQCAtMjksMTAgKzI5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCiAgICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQogewotICAgIG1JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUoY29udGV4dC5nZXRJdGVtKE1hcHBpbmdLZXlOYW1lKSk7CisKKyAgICBpZiAobm90IGFuZHJvaWQ6OlN0cmVhbVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcobmFtZSwgbUlkKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIFN0cmVhbSB0eXBlIG5hbWU6ICVzLCBpbnZhbGlkIFhNTCBzdHJ1Y3R1cmUgZmlsZSIsIG5hbWUuY19zdHIoKSk7CisgICAgfQogCiAgICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRTdHJlYW0oZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7CisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkU3RyZWFtKG5hbWUsIG1JZCk7CiB9CiAKIGJvb2wgU3RyZWFtOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCkBAIC00MCwxMSArNDQsOCBAQAogICAgIEFwcGxpY2FibGUgcGFyYW1zOwogICAgIGJsYWNrYm9hcmRSZWFkKCZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKIAotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldFN0cmF0ZWd5Rm9yU3RyZWFtKG1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5PihwYXJhbXMuc3RyYXRlZ3kpKTsKLQotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0obUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4ocGFyYW1zLnZvbHVtZVByb2ZpbGUpKTsKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKAorICAgICAgICAgICAgICAgIG1JZCwgc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4ocGFyYW1zLnZvbHVtZVByb2ZpbGUpKTsKIAogICAgIHJldHVybiB0cnVlOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmgKaW5kZXggNGE4NzVkYi4uZTBjZTJmYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaApAQCAtMjksNyArMjksNiBAQAogcHJpdmF0ZToKICAgICBzdHJ1Y3QgQXBwbGljYWJsZQogICAgIHsKLSAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3k7IC8qKjwgYXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uICovCiAgICAgICAgIHVpbnQzMl90IHZvbHVtZVByb2ZpbGU7IC8qKjwgYXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uICovCiAgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTk5ZjguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVXNhZ2UuaCIKLSNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgotI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgotCi11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3k7Ci0KLVVzYWdlOjpVc2FnZShjb25zdCBzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LCBjb3JlOjpsb2c6OkxvZ2dlciAmbG9nZ2VyKQotICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nS2V5QW1lbmQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwcGluZ0tleUFtZW5kRW5kIC0gTWFwcGluZ0tleUFtZW5kMSArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSwKLSAgICAgIG1Qb2xpY3lTdWJzeXN0ZW0oc3RhdGljX2Nhc3Q8Y29uc3QgUG9saWN5U3Vic3lzdGVtICo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAotICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSkKLXsKLSAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb191c2FnZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKLQotICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkVXNhZ2UoZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7Ci19Ci0KLWJvb2wgVXNhZ2U6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKLXsKLSAgICB1aW50MzJfdCBhcHBsaWNhYmxlU3RyYXRlZ3k7Ci0gICAgYmxhY2tib2FyZFJlYWQoJmFwcGxpY2FibGVTdHJhdGVneSwgc2l6ZW9mKGFwcGxpY2FibGVTdHJhdGVneSkpOwotICAgIHJldHVybiBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRTdHJhdGVneUZvclVzYWdlKG1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5PihhcHBsaWNhYmxlU3RyYXRlZ3kpKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MDIwNGYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QuaCIKLSNpbmNsdWRlICJJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJNYXBwaW5nQ29udGV4dC5oIgotI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1jbGFzcyBQb2xpY3lTdWJzeXN0ZW07Ci0KLWNsYXNzIFVzYWdlIDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKLXsKLXB1YmxpYzoKLSAgICBVc2FnZShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAotICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKLSAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsCi0gICAgICAgICAgY29yZTo6bG9nOjpMb2dnZXImIGxvZ2dlcik7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgc2VuZFRvSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKLQotcHJpdmF0ZToKLSAgICBjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKm1Qb2xpY3lTdWJzeXN0ZW07IC8qKjwgUm91dGUgc3Vic3l0ZW0gcGx1Z2luLiAqLwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggQXVkaW8gUG9saWN5IEVuZ2luZS4KLSAgICAgKi8KLSAgICBhbmRyb2lkOjpBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqbVBvbGljeVBsdWdpbkludGVyZmFjZTsKLQotICAgIGF1ZGlvX3VzYWdlX3QgbUlkOyAvKio8IHVzYWdlIGlkZW50aWZpZXIgdG8gbGluayB3aXRoIGF1ZGlvLmguICovCi19OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2F1ZGlvc2VydmVyLnRlIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2F1ZGlvc2VydmVyLnRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDFkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvYXVkaW9zZXJ2ZXIudGUKQEAgLTAsMCArMSw0IEBACit1c2VyZGVidWdfb3JfZW5nKGAKKyAgYWxsb3cgYXVkaW9zZXJ2ZXIgYXVkaW9zZXJ2ZXJfc29ja2V0OmRpciByd19kaXJfcGVybXM7CisgIGFsbG93IGF1ZGlvc2VydmVyIGF1ZGlvc2VydmVyX3NvY2tldDpzb2NrX2ZpbGUgY3JlYXRlX2ZpbGVfcGVybXM7CisnKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGUudGUgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvZmlsZS50ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGIxOTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGUudGUKQEAgLTAsMCArMSwyIEBACisjIFBvbGljeSBFbmdpbmUgcmVtb3RlIGNvbm5lY3Rpb24gZm9yIHJ1bnRpbWUgZGVidWcgb2YgcGFyYW1ldGVyIGZyYW1ld29yawordHlwZSBhdWRpb3NlcnZlcl9zb2NrZXQsIGZpbGVfdHlwZSwgY29yZWRvbWFpbl9zb2NrZXQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvZmlsZV9jb250ZXh0cyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlX2NvbnRleHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MGZjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvZmlsZV9jb250ZXh0cwpAQCAtMCwwICsxIEBACisvZGV2L3NvY2tldC9hdWRpb3NlcnZlcigvLiopPyAgICB1Om9iamVjdF9yOmF1ZGlvc2VydmVyX3NvY2tldDpzMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0NvbGxlY3Rpb24uaAppbmRleCBiNzJkZWQ4Li4wMmI0MWNiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0NvbGxlY3Rpb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0NvbGxlY3Rpb24uaApAQCAtMTgsOCArMTgsNiBAQAogCiAjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIlN0cmVhbS5oIgotI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCi0jaW5jbHVkZSAiVXNhZ2UuaCIKICNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtMjgsMTAgKzI2LDggQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdHJpbmc+CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogLyoqCiAgKiBDb2xsZWN0aW9uIG9mIHBvbGljeSBlbGVtZW50IGFzIGEgbWFwIGluZGV4ZWQgd2l0aCBhIHRoZWlyIFVJRCB0eXBlLgpAQCAtMTQ5LDE1ICsxNDUsOSBAQAogdGVtcGxhdGUgPD4KIHN0cnVjdCBDb2xsZWN0aW9uPHN0ZDo6c3RyaW5nPjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKIHRlbXBsYXRlIDw+Ci1zdHJ1Y3QgQ29sbGVjdGlvbjxhdWRpb191c2FnZV90Pjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKLXRlbXBsYXRlIDw+CiBzdHJ1Y3QgQ29sbGVjdGlvbjxhdWRpb19zb3VyY2VfdD46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307Ci10ZW1wbGF0ZSA8Pgotc3RydWN0IENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307CiAKLXR5cGVkZWYgQ29sbGVjdGlvbjxyb3V0aW5nX3N0cmF0ZWd5PiBTdHJhdGVneUNvbGxlY3Rpb247CiB0eXBlZGVmIENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4gU3RyZWFtQ29sbGVjdGlvbjsKLXR5cGVkZWYgQ29sbGVjdGlvbjxhdWRpb191c2FnZV90PiBVc2FnZUNvbGxlY3Rpb247CiB0eXBlZGVmIENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+IElucHV0U291cmNlQ29sbGVjdGlvbjsKIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRWxlbWVudC5oCmluZGV4IDUyZTc3ZTUuLjk3OTUwZDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRWxlbWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRWxlbWVudC5oCkBAIC0yMiwxMCArMjIsOCBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CiBjbGFzcyBFbGVtZW50CkBAIC02NCw3ICs2Miw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKICAgICAgKiBvciBhIHN0cmluZy4KICAgICAgKgogICAgICAqIEB0cGFyYW0gUHJvcGVydHkgZm9yIHdoaWNoIHRoaXMgcG9saWN5IGVsZW1lbnQgaGFzIHNldHRlciAvIGdldHRlci4KQEAgLTc1LDcgKzczLDcgQEAKIAogICAgIC8qKgogICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgotICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIFByb3BlcnR5IG1heSBiZSBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAogICAgICAqIG9yIGEgc3RyaW5nLgogICAgICAqCiAgICAgICogQHRwYXJhbSBQcm9wZXJ0eSBmb3Igd2hpY2ggdGhpcyBwb2xpY3kgZWxlbWVudCBoYXMgc2V0dGVyIC8gZ2V0dGVyLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCmluZGV4IDBkMThmZmEuLjg5YWFhODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKQEAgLTI1LDkyICsyNSw2MyBAQAogI2VuZGlmCiAKICNpbmNsdWRlICJFbmdpbmUuaCIKLSNpbmNsdWRlICJTdHJhdGVneS5oIgogI2luY2x1ZGUgIlN0cmVhbS5oIgogI2luY2x1ZGUgIklucHV0U291cmNlLmgiCi0jaW5jbHVkZSAiVXNhZ2UuaCIKKworI2luY2x1ZGUgPEVuZ2luZUNvbmZpZy5oPgogI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8UGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaD4KIAogdXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBzdGQ6Om1hcDsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKLXRlbXBsYXRlIDw+Ci1TdHJhdGVneUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxyb3V0aW5nX3N0cmF0ZWd5PigpCi17Ci0gICAgcmV0dXJuIG1TdHJhdGVneUNvbGxlY3Rpb247Ci19CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwogdGVtcGxhdGUgPD4KIFN0cmVhbUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb19zdHJlYW1fdHlwZV90PigpCiB7CiAgICAgcmV0dXJuIG1TdHJlYW1Db2xsZWN0aW9uOwogfQogdGVtcGxhdGUgPD4KLVVzYWdlQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3VzYWdlX3Q+KCkKLXsKLSAgICByZXR1cm4gbVVzYWdlQ29sbGVjdGlvbjsKLX0KLXRlbXBsYXRlIDw+CiBJbnB1dFNvdXJjZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb19zb3VyY2VfdD4oKQogewogICAgIHJldHVybiBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uOwogfQogCiB0ZW1wbGF0ZSA8PgotY29uc3QgU3RyYXRlZ3lDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT4oKSBjb25zdAotewotICAgIHJldHVybiBtU3RyYXRlZ3lDb2xsZWN0aW9uOwotfQotdGVtcGxhdGUgPD4KIGNvbnN0IFN0cmVhbUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb19zdHJlYW1fdHlwZV90PigpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1TdHJlYW1Db2xsZWN0aW9uOwogfQogdGVtcGxhdGUgPD4KLWNvbnN0IFVzYWdlQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3VzYWdlX3Q+KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVVzYWdlQ29sbGVjdGlvbjsKLX0KLXRlbXBsYXRlIDw+CiBjb25zdCBJbnB1dFNvdXJjZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb19zb3VyY2VfdD4oKSBjb25zdAogewogICAgIHJldHVybiBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uOwogfQogCi1FbmdpbmU6OkVuZ2luZSgpCi0gICAgOiBtTWFuYWdlckludGVyZmFjZSh0aGlzKSwKLSAgICAgIG1QbHVnaW5JbnRlcmZhY2UodGhpcyksCi0gICAgICBtUG9saWN5UGFyYW1ldGVyTWdyKG5ldyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpKSwKLSAgICAgIG1BcG1PYnNlcnZlcihOVUxMKQorRW5naW5lOjpFbmdpbmUoKSA6IG1Qb2xpY3lQYXJhbWV0ZXJNZ3IobmV3IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCkpCiB7CisgICAgc3RhdHVzX3QgbG9hZFJlc3VsdCA9IGxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOworICAgIGlmIChsb2FkUmVzdWx0IDwgMCkgeworICAgICAgICBBTE9HRSgiUG9saWN5IEVuZ2luZSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuIik7CisgICAgfQogfQogCiBFbmdpbmU6On5FbmdpbmUoKQogewotICAgIG1TdHJhdGVneUNvbGxlY3Rpb24uY2xlYXIoKTsKICAgICBtU3RyZWFtQ29sbGVjdGlvbi5jbGVhcigpOwogICAgIG1JbnB1dFNvdXJjZUNvbGxlY3Rpb24uY2xlYXIoKTsKLSAgICBtVXNhZ2VDb2xsZWN0aW9uLmNsZWFyKCk7Ci19Ci0KLQotdm9pZCBFbmdpbmU6OnNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKLXsKLSAgICBBTE9HX0FTU0VSVChvYnNlcnZlciAhPSBOVUxMLCAiSW52YWxpZCBBdWRpbyBQb2xpY3kgTWFuYWdlciBvYnNlcnZlciIpOwotICAgIG1BcG1PYnNlcnZlciA9IG9ic2VydmVyOwogfQogCiBzdGF0dXNfdCBFbmdpbmU6OmluaXRDaGVjaygpCiB7Ci0gICAgaWYgKG1Qb2xpY3lQYXJhbWV0ZXJNZ3IgPT0gTlVMTCB8fCBtUG9saWN5UGFyYW1ldGVyTWdyLT5zdGFydCgpICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKG1Qb2xpY3lQYXJhbWV0ZXJNZ3IgPT0gbnVsbHB0ciB8fCBtUG9saWN5UGFyYW1ldGVyTWdyLT5zdGFydCgpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHN0YXJ0IFBvbGljeSBQRlciLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIChtQXBtT2JzZXJ2ZXIgIT0gTlVMTCk/IE5PX0VSUk9SIDogTk9fSU5JVDsKKyAgICByZXR1cm4gRW5naW5lQmFzZTo6aW5pdENoZWNrKCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CkBAIC0xMzgsNTUgKzEwOSwxNiBAQAogICAgIHJldHVybiBlbGVtZW50LT50ZW1wbGF0ZSBnZXQ8UHJvcGVydHk+KCk7CiB9CiAKLXJvdXRpbmdfc3RyYXRlZ3kgRW5naW5lOjpNYW5hZ2VySW50ZXJmYWNlSW1wbDo6Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQorYm9vbCBFbmdpbmU6OnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmcHJvZmlsZSkKIHsKLSAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fdXNhZ2VfdD4odXNhZ2UpOwotfQotCi1hdWRpb19kZXZpY2VzX3QgRW5naW5lOjpNYW5hZ2VySW50ZXJmYWNlSW1wbDo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3QKLXsKLSAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IG1Qb2xpY3lFbmdpbmUtPm1BcG1PYnNlcnZlci0+Z2V0T3V0cHV0cygpOwotCi0gICAgLyoqIFRoaXMgaXMgdGhlIG9ubHkgY2FzZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkgYmVjYXVzZSB0aGUgUEZXIGlzIHVuYWJsZSB0byBrbm93IHRoZQotICAgICAqIGFjdGl2aXR5IG9mIHN0cmVhbXMuCi0gICAgICoKLSAgICAgKiAtV2hpbGUgbWVkaWEgaXMgcGxheWluZyBvbiBhIHJlbW90ZSBkZXZpY2UsIHVzZSB0aGUgdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvci4KLSAgICAgKiBOb3RlIHRoYXQgd2UgdGVzdCB0aGlzIHVzZWNhc2UgYmVmb3JlIHRlc3RpbmcgaWYgbWVkaWEgaXMgcGxheWluZyBiZWNhdXNlCi0gICAgICogdGhlIGlzU3RyZWFtQWN0aXZlKCkgbWV0aG9kIG9ubHkgaW5mb3JtcyBhYm91dCB0aGUgYWN0aXZpdHkgb2YgYSBzdHJlYW0sIG5vdAotICAgICAqIGlmIGl0J3MgZm9yIGxvY2FsIHBsYXliYWNrLiBOb3RlIGFsc28gdGhhdCB3ZSB1c2UgdGhlIHNhbWUgZGVsYXkgYmV0d2VlbiBib3RoIHRlc3RzCi0gICAgICoKLSAgICAgKiAtV2hlbiBtZWRpYSBpcyBub3QgcGxheWluZyBhbnltb3JlLCBmYWxsIGJhY2sgb24gdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvcgotICAgICAqLwotICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCAmJgotICAgICAgICAgICAgIWlzX3N0YXRlX2luX2NhbGwoZ2V0UGhvbmVTdGF0ZSgpKSAmJgotICAgICAgICAgICAgIW91dHB1dHMuaXNTdHJlYW1BY3RpdmVSZW1vdGVseShBVURJT19TVFJFQU1fTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkgJiYKLSAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKLSAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgcm91dGluZ19zdHJhdGVneT4oU1RSQVRFR1lfTUVESUEpOwotICAgIH0KLSAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfQUNDRVNTSUJJTElUWSAmJgotICAgICAgICAob3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fUklORykgfHwgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fQUxBUk0pKSkgewotICAgICAgICAgICAgLy8gZG8gbm90IHJvdXRlIGFjY2Vzc2liaWxpdHkgcHJvbXB0cyB0byBhIGRpZ2l0YWwgb3V0cHV0IGN1cnJlbnRseSBjb25maWd1cmVkIHdpdGggYQotICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgotICAgICAgICAgICAgLy8gRGV2aWNlIEZvciBTb25pZmljYXRpb24gY29uZiBmaWxlIGhhcyBIRE1JLCBTUERJRiBhbmQgSERNSSBBUkMgdW5yZWFjaGVhYmxlLgotICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PigKLSAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgcm91dGluZ19zdHJhdGVneT4oc3RyYXRlZ3kpOwotfQotCi1ib29sIEVuZ2luZTo6UGx1Z2luSW50ZXJmYWNlSW1wbDo6c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZwcm9maWxlKQotewotICAgIGlmIChtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUpKSB7Ci0gICAgICAgIG1Qb2xpY3lFbmdpbmUtPm1BcG1PYnNlcnZlci0+Z2V0Vm9sdW1lQ3VydmVzKCkuc3dpdGNoVm9sdW1lQ3VydmUocHJvZmlsZSwgc3RyZWFtKTsKKyAgICBpZiAoc2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtLCBwcm9maWxlKSkgeworICAgICAgICBzd2l0Y2hWb2x1bWVDdXJ2ZShwcm9maWxlLCBzdHJlYW0pOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi0KIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eSwgdHlwZW5hbWUgS2V5PgogYm9vbCBFbmdpbmU6OnNldFByb3BlcnR5Rm9yS2V5KGNvbnN0IFByb3BlcnR5ICZwcm9wZXJ0eSwgY29uc3QgS2V5ICZrZXkpCiB7CkBAIC0yMDAsNyArMTMyLDExIEBACiAKIHN0YXR1c190IEVuZ2luZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKIHsKLSAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRQaG9uZVN0YXRlKG1vZGUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIEVuZ2luZUJhc2U6OnNldFBob25lU3RhdGUobW9kZSk7CiB9CiAKIGF1ZGlvX21vZGVfdCBFbmdpbmU6OmdldFBob25lU3RhdGUoKSBjb25zdApAQCAtMjExLDcgKzE0NywxMSBAQAogc3RhdHVzX3QgRW5naW5lOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQogewotICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBFbmdpbmVCYXNlOjpzZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKIH0KIAogYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBFbmdpbmU6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKQEAgLTIyMCwyOCArMTYwLDIxNiBAQAogfQogCiBzdGF0dXNfdCBFbmdpbmU6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IC8qc3RhdGUqLykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKIHsKKyAgICBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworCiAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2RGVzYy0+dHlwZSgpKSkgewogICAgICAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygKLSAgICAgICAgICAgICAgICAgICAgbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkudHlwZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKS50eXBlcygpKTsKICAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZEZXNjLT50eXBlKCkpKSB7CiAgICAgICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRBdmFpbGFibGVJbnB1dERldmljZXMoCi0gICAgICAgICAgICAgICAgICAgIG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkudHlwZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpLnR5cGVzKCkpOwogICAgIH0KICAgICByZXR1cm4gQkFEX1RZUEU7CiB9CiAKK3N0YXR1c190IEVuZ2luZTo6bG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCkKK3sKKyAgICBhdXRvIHJlc3VsdCA9IEVuZ2luZUJhc2U6OmxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOworCisgICAgLy8gQ3VzdG9tIFhNTCBQYXJzaW5nCisgICAgYXV0byBsb2FkQ3JpdGVyaWE9IFt0aGlzXShjb25zdCBhdXRvJiBjb25maWdDcml0ZXJpYSwgY29uc3QgYXV0byYgY29uZmlnQ3JpdGVyaW9uVHlwZXMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBjcml0ZXJpb24gOiBjb25maWdDcml0ZXJpYSkgeworICAgICAgICAgICAgZW5naW5lQ29uZmlnOjpDcml0ZXJpb25UeXBlIGNyaXRlcmlvblR5cGU7CisgICAgICAgICAgICBmb3IgKGF1dG8gJmNvbmZpZ0NyaXRlcmlvblR5cGUgOiBjb25maWdDcml0ZXJpb25UeXBlcykgeworICAgICAgICAgICAgICAgIGlmIChjb25maWdDcml0ZXJpb25UeXBlLm5hbWUgPT0gY3JpdGVyaW9uLnR5cGVOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvblR5cGUgPSBjb25maWdDcml0ZXJpb25UeXBlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HX0FTU0VSVChub3QgY3JpdGVyaW9uVHlwZS5uYW1lLmVtcHR5KCksICJJbnZhbGlkIGNyaXRlcmlvbiB0eXBlIGZvciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb24ubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPmFkZENyaXRlcmlvbihjcml0ZXJpb24ubmFtZSwgY3JpdGVyaW9uVHlwZS5pc0luY2x1c2l2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb25UeXBlLnZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uLmRlZmF1bHRMaXRlcmFsVmFsdWUpOworICAgICAgICB9CisgICAgfTsKKworICAgIGxvYWRDcml0ZXJpYShyZXN1bHQucGFyc2VkQ29uZmlnLT5jcml0ZXJpYSwgcmVzdWx0LnBhcnNlZENvbmZpZy0+Y3JpdGVyaW9uVHlwZXMpOworICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudCA9PSAwPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKK30KKworRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byBwcm9kdWN0U3RyYXRlZ2llcyA9IGdldFByb2R1Y3RTdHJhdGVnaWVzKCk7CisgICAgaWYgKHByb2R1Y3RTdHJhdGVnaWVzLmZpbmQocHMpID09IHByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIGdldCBkZXZpY2Ugb24gaW52YWxpZCBzdHJhdGVneSAlZCIsIF9fRlVOQ1RJT05fXywgcHMpOworICAgICAgICByZXR1cm4ge307CisgICAgfQorICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKKyAgICB1aW50MzJfdCBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKworICAgIC8qKiBUaGlzIGlzIHRoZSBvbmx5IGNhc2UgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5IGJlY2F1c2UgdGhlIFBGVyBpcyB1bmFibGUgdG8ga25vdyB0aGUKKyAgICAgKiBhY3Rpdml0eSBvZiBzdHJlYW1zLgorICAgICAqCisgICAgICogLVdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCisgICAgICogTm90ZSB0aGF0IHdlIHRlc3QgdGhpcyB1c2VjYXNlIGJlZm9yZSB0ZXN0aW5nIGlmIG1lZGlhIGlzIHBsYXlpbmcgYmVjYXVzZQorICAgICAqIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKKyAgICAgKiBpZiBpdCdzIGZvciBsb2NhbCBwbGF5YmFjay4gTm90ZSBhbHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGRlbGF5IGJldHdlZW4gYm90aCB0ZXN0cworICAgICAqCisgICAgICogLVdoZW4gbWVkaWEgaXMgbm90IHBsYXlpbmcgYW55bW9yZSwgZmFsbCBiYWNrIG9uIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IKKyAgICAgKi8KKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGlmIChwcyA9PSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX05PVElGSUNBVElPTikgJiYKKyAgICAgICAgICAgICFpc19zdGF0ZV9pbl9jYWxsKGdldFBob25lU3RhdGUoKSkgJiYKKyAgICAgICAgICAgICFvdXRwdXRzLmlzQWN0aXZlUmVtb3RlbHkoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX01VU0lDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpICYmCisgICAgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlKHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgeworICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3lGb3JNZWRpYSA9CisgICAgICAgICAgICAgICAgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgICAgIGRldmljZXMgPSBwcm9kdWN0U3RyYXRlZ2llcy5nZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneUZvck1lZGlhKTsKKyAgICB9IGVsc2UgaWYgKHBzID09IGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSkgJiYKKyAgICAgICAgKG91dHB1dHMuaXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1JJTkcpKSB8fAorICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0pKSkpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdCByb3V0ZSBhY2Nlc3NpYmlsaXR5IHByb21wdHMgdG8gYSBkaWdpdGFsIG91dHB1dCBjdXJyZW50bHkgY29uZmlndXJlZCB3aXRoIGEKKyAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFzIHRoZXkgd291bGQgbGlrZWx5IG5vdCBiZSBtaXhlZCBhbmQgZHJvcHBlZC4KKyAgICAgICAgICAgIC8vIERldmljZSBGb3IgU29uaWZpY2F0aW9uIGNvbmYgZmlsZSBoYXMgSERNSSwgU1BESUYgYW5kIEhETUkgQVJDIHVucmVhY2hlYWJsZS4KKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5Tm90aWZpY2F0aW9uID0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9SSU5HKTsKKyAgICAgICAgZGV2aWNlcyA9IHByb2R1Y3RTdHJhdGVnaWVzLmdldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5Tm90aWZpY2F0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZpY2VzID0gcHJvZHVjdFN0cmF0ZWdpZXMuZ2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHMpOworICAgIH0KKyAgICBpZiAoZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fAorICAgICAgICAgICAgKGRldmljZXMgJiBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSkgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgZGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOworICAgICAgICBBTE9HRV9JRihkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FLCAiJXM6IG5vIHZhbGlkIGRlZmF1bHQgZGV2aWNlIGRlZmluZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGdldEFwbU9ic2VydmVyKCktPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSk7CisgICAgfQorICAgIGlmICgvKmRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlcykqLyBkZXZpY2VzID09IEFVRElPX0RFVklDRV9PVVRfQlVTKSB7CisgICAgICAgIC8vIFdlIGRvIGV4cGVjdCBvbmx5IG9uZSBkZXZpY2UgZm9yIHRoZXNlIHR5cGVzIG9mIGRldmljZXMKKyAgICAgICAgLy8gQ3JpdGVyaW9uIGRldmljZSBhZGRyZXNzIGdhcmFudGVlIHRoaXMgb25lIGlzIGF2YWlsYWJsZQorICAgICAgICAvLyBJZiB0aGlzIGNyaXRlcmlvbiBpcyBub3Qgd2lzaGVkLCBuZWVkIHRvIGVuc3VyZSB0aGlzIGRldmljZSBpcyBhdmFpbGFibGUKKyAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKHByb2R1Y3RTdHJhdGVnaWVzLmdldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHMpLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiJXM6ZGV2aWNlIDB4JXggJXMgJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIGFkZHJlc3MuY19zdHIoKSwgcHMpOworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCkpOworICAgIH0KKyAgICBBTE9HVigiJXM6ZGV2aWNlIDB4JXggJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIHBzKTsKKyAgICByZXR1cm4gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZXMpOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmcHJlZmVycmVkRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpIGNvbnN0Cit7CisgICAgLy8gRmlyc3QgY2hlY2sgZm9yIGV4cGxpY3Qgcm91dGluZyBkZXZpY2UKKyAgICBpZiAocHJlZmVycmVkRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzIGV4cGxpY2l0IFJvdXRpbmcgb24gZGV2aWNlICVzIiwgX19mdW5jX18sIHByZWZlcnJlZERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihwcmVmZXJyZWREZXZpY2UpOworICAgIH0KKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKKyAgICAvLworICAgIC8vIEBUT0RPOiB3aGF0IGlzIHRoZSBwcmlvcml0eSBvZiBleHBsaWNpdCByb3V0aW5nPyBTaGFsbCBpdCBiZSBjb25zaWRlcmVkIGZpcnN0IGFzIGl0IHVzZWQgdG8KKyAgICAvLyBiZSBieSBBUE0/CisgICAgLy8KKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgYWxsIGFjdGl2ZSBjbGllbnRzIGhhdmUgYSBwcmVmZXJyZWQgcm91dGUgaW4gd2hpY2gKKyAgICAvLyBjYXNlIHRoZSBsYXN0IGFjdGl2ZSBjbGllbnQgcm91dGUgaXMgdXNlZAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2Uob3V0cHV0cywgc3RyYXRlZ3ksIGF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZyb21DYWNoZT8gbURldmljZXNGb3JTdHJhdGVnaWVzLmF0KHN0cmF0ZWd5KSA6IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIGZyb21DYWNoZSkgY29uc3QKK3sKKyAgICBhdXRvIGF0dHJpYnV0ZXMgPSBFbmdpbmVCYXNlOjpnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgIHJldHVybiBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCBmcm9tQ2FjaGUpOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBFbmdpbmU6OmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKm1peCkgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvICZwb2xpY3lNaXhlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbigpOworICAgIGNvbnN0IGF1dG8gJmF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOworICAgIGNvbnN0IGF1dG8gJmlucHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldElucHV0cygpOworICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3M7CisgICAgLy8KKyAgICAvLyBFeHBsaWNpdCBSb3V0aW5nID8/PyB3aGF0IGlzIHRoZSBwcmlvcml0eSBvZiBleHBsaWNpdCByb3V0aW5nPyBTaGFsbCBpdCBiZSBjb25zaWRlcmVkCisgICAgLy8gZmlyc3QgYXMgaXQgdXNlZCB0byBiZSBieSBBUE0/CisgICAgLy8KKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgYWxsIGFjdGl2ZSBjbGllbnRzIGhhdmUgYSBwcmVmZXJyZWQgcm91dGUgaW4gd2hpY2gKKyAgICAvLyBjYXNlIHRoZSBsYXN0IGFjdGl2ZSBjbGllbnQgcm91dGUgaXMgdXNlZAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CisgICAgICAgICAgICBmaW5kUHJlZmVycmVkRGV2aWNlKGlucHV0cywgYXR0ci5zb3VyY2UsIGF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorCisgICAgZGV2aWNlID0gcG9saWN5TWl4ZXMuZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXR0ci5zb3VyY2UsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgbWl4KTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGdldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGF0dHIuc291cmNlKTsKKworICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2VUeXBlKSkgeworICAgICAgICBhZGRyZXNzID0gIjAiOworICAgICAgICBzdGQ6OnNpemVfdCBwb3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3MgeyBhdHRyLnRhZ3MgfTsKKyAgICAgICAgaWYgKChwb3MgPSB0YWdzLmZpbmQoImFkZHI9IikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBhZGRyZXNzID0gdGFncy5zdWJzdHIocG9zICsgc3RkOjpzdHJsZW4oImFkZHI9IikpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKGRldmljZVR5cGUsIFN0cmluZzgoYWRkcmVzcy5jX3N0cigpKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworfQorCit2b2lkIEVuZ2luZTo6dXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKQoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IGdldFByb2R1Y3RTdHJhdGVnaWVzKCkpIHsKKyAgICAgICAgY29uc3QgYXV0byAmc3RyYXRlZ3kgPSBpdGVyLnNlY29uZDsKKyAgICAgICAgbURldmljZXNGb3JTdHJhdGVnaWVzW3N0cmF0ZWd5LT5nZXRJZCgpXSA9IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3ktPmdldElkKCkpOworICAgIH0KK30KKwordm9pZCBFbmdpbmU6OnNldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpCit7CisgICAgaWYgKGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuZmluZChzdHJhdGVneSkgPT0gZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBzZXQgYWRkcmVzcyAlcyBvbiBpbnZhbGlkIHN0cmF0ZWd5ICVkIiwgX19GVU5DVElPTl9fLCBhZGRyZXNzLmNfc3RyKCksCisgICAgICAgICAgICAgIHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmF0KHN0cmF0ZWd5KS0+c2V0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKTsKK30KKworYm9vbCBFbmdpbmU6OnNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgYXVkaW9fZGV2aWNlc190IGRldmljZXMpCit7CisgICAgaWYgKGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuZmluZChzdHJhdGVneSkgPT0gZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNldCBkZXZpY2UgJWQgb24gaW52YWxpZCBzdHJhdGVneSAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgc3RyYXRlZ3kpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuYXQoc3RyYXRlZ3kpLT5zZXREZXZpY2VUeXBlcyhkZXZpY2VzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdGVtcGxhdGUgPD4KIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCiB7Ci0gICAgcmV0dXJuICZtTWFuYWdlckludGVyZmFjZTsKKyAgICByZXR1cm4gdGhpczsKIH0KIAogdGVtcGxhdGUgPD4KIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKIHsKLSAgICByZXR1cm4gJm1QbHVnaW5JbnRlcmZhY2U7CisgICAgcmV0dXJuIHRoaXM7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKaW5kZXggMzI4ZDIzZC4uNDY2MmU3ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCkBAIC0xNiwyMiArMTYsMjAgQEAKIAogI3ByYWdtYSBvbmNlCiAKLQorI2luY2x1ZGUgIkVuZ2luZUJhc2UuaCIKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgogI2luY2x1ZGUgIkNvbGxlY3Rpb24uaCIKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyOwogCi1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogY2xhc3MgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI7CiBjbGFzcyBWb2x1bWVQcm9maWxlOwogCi1jbGFzcyBFbmdpbmUKK2NsYXNzIEVuZ2luZSA6IHB1YmxpYyBFbmdpbmVCYXNlLCBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZQogewogcHVibGljOgogICAgIEVuZ2luZSgpOwpAQCAtNDAsMTMyICszOCw2OSBAQAogICAgIHRlbXBsYXRlIDxjbGFzcyBSZXF1ZXN0ZWRJbnRlcmZhY2U+CiAgICAgUmVxdWVzdGVkSW50ZXJmYWNlICpxdWVyeUludGVyZmFjZSgpOwogCi1wcml2YXRlOgotICAgIC8vLyBJbnRlcmZhY2UgbWVtYmVycwotICAgIGNsYXNzIE1hbmFnZXJJbnRlcmZhY2VJbXBsIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQorICAgIC8vLworICAgIC8vLyBmcm9tIEVuZ2luZUJhc2UKKyAgICAvLy8KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBpbml0Q2hlY2soKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpIG92ZXJyaWRlOworCisgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpIG92ZXJyaWRlOworCisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkgb3ZlcnJpZGU7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmcHJlZmVyZWREZXZpY2UgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworICAgIERldmljZVZlY3RvciBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBzcDxBdWRpb1BvbGljeU1peD4gKm1peCA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9pZCB1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpIG92ZXJyaWRlOworCisgICAgLy8vCisgICAgLy8vIGZyb20gQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UKKyAgICAvLy8KKyAgICBzdGF0dXNfdCBhZGRTdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBvdmVycmlkZQogICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1hbmFnZXJJbnRlcmZhY2VJbXBsKEVuZ2luZSAqcG9saWN5RW5naW5lKQotICAgICAgICAgICAgOiBtUG9saWN5RW5naW5lKHBvbGljeUVuZ2luZSkge30KLQotICAgICAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGluaXRDaGVjaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5pbml0Q2hlY2soKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBtUG9saWN5RW5naW5lLT5zZXRPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihpbnB1dFNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdGF0ZWd5KSBjb25zdDsKLSAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFBob25lU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgRW5naW5lICptUG9saWN5RW5naW5lOwotICAgIH0gbU1hbmFnZXJJbnRlcmZhY2U7Ci0KLSAgICBjbGFzcyBQbHVnaW5JbnRlcmZhY2VJbXBsIDogcHVibGljIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlCisgICAgICAgIHJldHVybiBhZGQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4obmFtZSwgc3RyZWFtKTsKKyAgICB9CisgICAgc3RhdHVzX3QgYWRkSW5wdXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgb3ZlcnJpZGUKICAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBQbHVnaW5JbnRlcmZhY2VJbXBsKEVuZ2luZSAqcG9saWN5RW5naW5lKQotICAgICAgICAgICAgOiBtUG9saWN5RW5naW5lKHBvbGljeUVuZ2luZSkge30KKyAgICAgICAgcmV0dXJuIGFkZDxhdWRpb19zb3VyY2VfdD4obmFtZSwgc291cmNlKTsKKyAgICB9CisgICAgYm9vbCBzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmdm9sdW1lUHJvZmlsZSkgb3ZlcnJpZGU7CiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxyb3V0aW5nX3N0cmF0ZWd5PihuYW1lLCBzdHJhdGVneSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+YWRkPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KG5hbWUsIHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRVc2FnZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fdXNhZ2VfdCB1c2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb191c2FnZV90PihuYW1lLCB1c2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRJbnB1dFNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc291cmNlX3Qgc291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+YWRkPGF1ZGlvX3NvdXJjZV90PihuYW1lLCBzb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBzZXREZXZpY2VGb3JTdHJhdGVneShjb25zdCByb3V0aW5nX3N0cmF0ZWd5ICZzdHJhdGVneSwgYXVkaW9fZGV2aWNlc190IGRldmljZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90PihzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmdm9sdW1lUHJvZmlsZSk7CisgICAgYm9vbCBzZXREZXZpY2VGb3JJbnB1dFNvdXJjZShjb25zdCBhdWRpb19zb3VyY2VfdCAmaW5wdXRTb3VyY2UsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIG92ZXJyaWRlCisgICAgeworICAgICAgICByZXR1cm4gc2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCBhdWRpb19zb3VyY2VfdD4oZGV2aWNlLCBpbnB1dFNvdXJjZSk7CisgICAgfQorICAgIHZvaWQgc2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpIG92ZXJyaWRlOwogCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclVzYWdlKGNvbnN0IGF1ZGlvX3VzYWdlX3QgJnVzYWdlLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fdXNhZ2VfdD4oc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBzZXREZXZpY2VGb3JJbnB1dFNvdXJjZShjb25zdCBhdWRpb19zb3VyY2VfdCAmaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCBhdWRpb19zb3VyY2VfdD4oZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U291cmNlKTsKLSAgICAgICAgfQorICAgIGJvb2wgc2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykgb3ZlcnJpZGU7CiAKLSAgICBwcml2YXRlOgotICAgICAgICBFbmdpbmUgKm1Qb2xpY3lFbmdpbmU7Ci0gICAgfSBtUGx1Z2luSW50ZXJmYWNlOworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIG92ZXJyaWRlCisgICAgeworICAgICAgICByZXR1cm4gRW5naW5lQmFzZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKG5hbWUpOworICAgIH0KIAogcHJpdmF0ZToKICAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KICAgICBFbmdpbmUoY29uc3QgRW5naW5lICZvYmplY3QpOwogICAgIEVuZ2luZSAmb3BlcmF0b3I9KGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKIAotICAgIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKTsKLQotICAgIGJvb2wgc2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludHMgJnBvaW50cyk7Ci0KLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLSAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLSAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0OwotICAgIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwotICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdDsKLSAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKTsKLSAgICBTdHJhdGVneUNvbGxlY3Rpb24gbVN0cmF0ZWd5Q29sbGVjdGlvbjsgLyoqPCBTdHJhdGVnaWVzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KICAgICBTdHJlYW1Db2xsZWN0aW9uIG1TdHJlYW1Db2xsZWN0aW9uOyAvKio8IFN0cmVhbXMgaW5kZXhlZCBieSB0aGVpciBlbnVtIGlkLiAgKi8KLSAgICBVc2FnZUNvbGxlY3Rpb24gbVVzYWdlQ29sbGVjdGlvbjsgLyoqPCBVc2FnZXMgaW5kZXhlZCBieSB0aGVpciBlbnVtIGlkLiAqLwogICAgIElucHV0U291cmNlQ29sbGVjdGlvbiBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uOyAvKio8IElucHV0IHNvdXJjZXMgaW5kZXhlZCBieSB0aGVpciBlbnVtIGlkLiAqLwogCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KQEAgLTE4NiwxMiArMTIxLDE2IEBACiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5LCB0eXBlbmFtZSBLZXk+CiAgICAgYm9vbCBzZXRQcm9wZXJ0eUZvcktleShjb25zdCBQcm9wZXJ0eSAmcHJvcGVydHksIGNvbnN0IEtleSAma2V5KTsKIAorICAgIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOworCisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKKwogICAgIC8qKgogICAgICAqIFBvbGljeSBQYXJhbWV0ZXIgTWFuYWdlciBoaWRkZW4gdGhyb3VnaCBhIHdyYXBwZXIuCiAgICAgICovCiAgICAgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIgKm1Qb2xpY3lQYXJhbWV0ZXJNZ3I7CiAKLSAgICBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqbUFwbU9ic2VydmVyOworICAgIERldmljZVN0cmF0ZWd5TWFwIG1EZXZpY2VzRm9yU3RyYXRlZ2llczsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZUluc3RhbmNlLmNwcAppbmRleCA5YWE4OWIyLi4yNDQyNTkwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZUluc3RhbmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZUluc3RhbmNlLmNwcApAQCAtMjEsMTAgKzIxLDggQEAKIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogRW5naW5lSW5zdGFuY2U6OkVuZ2luZUluc3RhbmNlKCkKIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAKaW5kZXggYWUzOWZlZi4uZDI1MmQzZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAKQEAgLTIwLDEzICsyMCwxMyBAQAogCiB1c2luZyBzdGQ6OnN0cmluZzsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCiBzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3NvdXJjZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb19zb3VyY2VfdCBpZGVudGlmaWVyKQogewotICAgIGlmIChpZGVudGlmaWVyID4gQVVESU9fU09VUkNFX01BWCAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19TT1VSQ0VfTUFYICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQKKyAgICAgICAgJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIgJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oCmluZGV4IDZjNDk4ZGMuLmUxODY1Y2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmgKQEAgLTE4LDEwICsxOCw4IEBACiAKICNpbmNsdWRlICJFbGVtZW50LmgiCiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogLyoqCiAgKiBTcGVjaWFsaXphdGlvbiBvZiBwb2xpY3kgYmFzZSBjbGFzcyBlbGVtZW50IGZvciBhdWRpb19zb3VyY2VfdApAQCAtNjEsNyArNTksNyBAQAogCiAgICAgLyoqCiAgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogUHJvcGVydHkgbWF5IGJlIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CiAgICAgICogb3IgYSBzdHJpbmcuCiAgICAgICovCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzOTkxNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvU3RyYXRlZ3kiCi0KLSNpbmNsdWRlICJTdHJhdGVneS5oIgotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKLQotc3RhdHVzX3QgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5Pjo6c2V0SWRlbnRpZmllcihyb3V0aW5nX3N0cmF0ZWd5IGlkZW50aWZpZXIpCi17Ci0gICAgaWYgKGlkZW50aWZpZXIgPj0gTlVNX1NUUkFURUdJRVMpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwotICAgIEFMT0dEKCIlczogU3RyYXRlZ3kgJXMgaWRlbnRpZmllciAweCVYIiwgX19GVU5DVElPTl9fLCBnZXROYW1lKCkuY19zdHIoKSwgaWRlbnRpZmllcik7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFNldCB0aGUgZGV2aWNlIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneS4KLSAqIEl0IGNoZWNrcyBpZiB0aGUgb3V0cHV0IGRldmljZSBpcyB2YWxpZC4KLSAqCi0gKiBAcGFyYW1baW5dIGRldmljZXMgc2VsZWN0ZWQgZm9yIHRoZSBnaXZlbiBzdHJhdGVneS4KLSAqCi0gKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBkZXZpY2UgaXMgZWl0aGVyIHZhbGlkIG9yIG5vbmUsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICovCi10ZW1wbGF0ZSA8Pgotc3RhdHVzX3QgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5Pjo6c2V0PGF1ZGlvX2RldmljZXNfdD4oYXVkaW9fZGV2aWNlc190IGRldmljZXMpCi17Ci0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhkZXZpY2VzKSB8fCBkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIEFMT0dFKCIlczogdHJ5aW5nIHRvIHNldCBhbiBpbnZhbGlkIGRldmljZSAweCVYIGZvciBzdHJhdGVneSAlcyIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HRCgiJXM6IDB4JVggZm9yIHN0cmF0ZWd5ICVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgbUFwcGxpY2FibGVEZXZpY2VzID0gZGV2aWNlczsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1hdWRpb19kZXZpY2VzX3QgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5Pjo6Z2V0PGF1ZGlvX2RldmljZXNfdD4oKSBjb25zdAotewotICAgIEFMT0dWKCIlczogMHglWCBmb3Igc3RyYXRlZ3kgJXMiLCBfX0ZVTkNUSU9OX18sIG1BcHBsaWNhYmxlRGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBtQXBwbGljYWJsZURldmljZXM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTdkNTUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRWxlbWVudC5oIgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotewotCi0vKioKLSAqIEB0cGFyYW0gYXVkaW9fZGV2aWNlc190OiBBcHBsaWNhYmxlIG91dHB1dCBkZXZpY2UocykgZm9yIHRoaXMgc3RyYXRlZ3kuCi0gKi8KLXRlbXBsYXRlIDw+Ci1jbGFzcyBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+Ci17Ci1wdWJsaWM6Ci0gICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKLSAgICAgICAgOiBtTmFtZShuYW1lKSwKLSAgICAgICAgICBtQXBwbGljYWJsZURldmljZXMoQVVESU9fREVWSUNFX05PTkUpCi0gICAge30KLSAgICB+RWxlbWVudCgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAotICAgICAqCi0gICAgICogQHJldHVybnMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIHBvbGljeSBlbGVtZW50Ci0gICAgICovCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBvbGljeSBlbGVtZW50LgotICAgICoKLSAgICAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHVuaXF1ZSBpZGVudGlmaWVyLgotICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyIHRvIGJlIHNldC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBpZGVudGlmaWVyIGlzIHZhbGlkIGFuZCBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICAqLwotICAgIHN0YXR1c190IHNldElkZW50aWZpZXIocm91dGluZ19zdHJhdGVneSBpZGVudGlmaWVyKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQuCi0gICAgICovCi0gICAgcm91dGluZ19zdHJhdGVneSBnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbUlkZW50aWZpZXI7IH0KLQotICAgIC8qKgotICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgotICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAotICAgICAqIG9yIGEgc3RyaW5nLgotICAgICAqLwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KLSAgICBQcm9wZXJ0eSBnZXQoKSBjb25zdDsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KLSAgICBzdGF0dXNfdCBzZXQoUHJvcGVydHkgcHJvcGVydHkpOwotCi1wcml2YXRlOgotICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLwotICAgIEVsZW1lbnQoY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKLSAgICBFbGVtZW50ICZvcGVyYXRvcj0oY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKLQotICAgIHN0ZDo6c3RyaW5nIG1OYW1lOyAvKio8IFVuaXF1ZSBsaXRlcmFsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KLSAgICByb3V0aW5nX3N0cmF0ZWd5IG1JZGVudGlmaWVyOyAvKio8IFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwotCi0gICAgYXVkaW9fZGV2aWNlc190IG1BcHBsaWNhYmxlRGV2aWNlczsgLyoqPCBBcHBsaWNhYmxlIG91dHB1dCBkZXZpY2UocykgZm9yIHRoaXMgc3RyYXRlZ3kuICovCi19OwotCi10eXBlZGVmIEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT4gU3RyYXRlZ3k7Ci0KLX0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcAppbmRleCAwZWQzNjRmLi4yOTdlYjAyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwCkBAIC0yMSwxMCArMjEsOCBAQAogCiB1c2luZyBzdGQ6OnN0cmluZzsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiBzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXRJZGVudGlmaWVyKGF1ZGlvX3N0cmVhbV90eXBlX3QgaWRlbnRpZmllcikKIHsKQEAgLTM2LDMyICszNCw2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0vKioKLSogU2V0IHRoZSBzdHJhdGVneSB0byBmb2xsb3cgZm9yIHRoaXMgc3RyZWFtLgotKiBJdCBjaGVja3MgaWYgdGhlIHN0cmF0ZWd5IGlzIHZhbGlkLgotKgotKiBAcGFyYW1baW5dIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkLgotKgotKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBzdHJhdGVneSBpcyBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSovCi10ZW1wbGF0ZSA8Pgotc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6c2V0PHJvdXRpbmdfc3RyYXRlZ3k+KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi17Ci0gICAgaWYgKHN0cmF0ZWd5ID49IE5VTV9TVFJBVEVHSUVTKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1BcHBsaWNhYmxlU3RyYXRlZ3kgPSBzdHJhdGVneTsKLSAgICBBTE9HRCgiJXM6IDB4JVggZm9yIFN0cmVhbSAlcyIsIF9fRlVOQ1RJT05fXywgc3RyYXRlZ3ksIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1yb3V0aW5nX3N0cmF0ZWd5IEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD46OmdldDxyb3V0aW5nX3N0cmF0ZWd5PigpIGNvbnN0Ci17Ci0gICAgQUxPR1YoIiVzOiAweCVYIGZvciBTdHJlYW0gJXMiLCBfX0ZVTkNUSU9OX18sIG1BcHBsaWNhYmxlU3RyYXRlZ3ksIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gbUFwcGxpY2FibGVTdHJhdGVneTsKLX0KLQogdGVtcGxhdGUgPD4KIHN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD46OnNldDxhdWRpb19zdHJlYW1fdHlwZV90PihhdWRpb19zdHJlYW1fdHlwZV90IHZvbHVtZVByb2ZpbGUpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaAppbmRleCA2OTAyMDAzLi5hNGZkZDM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmgKQEAgLTE4LDIzICsxOCwyMCBAQAogCiAjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkVuZ2luZURlZmluaXRpb24uaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KICNpbmNsdWRlIDxtYXA+CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwogLyoqCi0gKiBAdHBhcmFtIHJvdXRpbmdfc3RyYXRlZ3k6IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLgorICogQHRwYXJhbSBwcm9kdWN0X3N0cmF0ZWd5X3Q6IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLgogICovCiB0ZW1wbGF0ZSA8PgogY2xhc3MgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90PgogewogcHVibGljOgogICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCi0gICAgICAgIDogbU5hbWUobmFtZSksCi0gICAgICAgICAgbUFwcGxpY2FibGVTdHJhdGVneShTVFJBVEVHWV9NRURJQSkKKyAgICAgICAgOiBtTmFtZShuYW1lKQogICAgIHt9CiAgICAgfkVsZW1lbnQoKSB7fQogCkBAIC02Miw3ICs1OSw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CiAgICAgICogb3IgYSBzdHJpbmcuCiAgICAgICovCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgpAQCAtNzksOCArNzYsNiBAQAogICAgIHN0ZDo6c3RyaW5nIG1OYW1lOyAvKio8IFVuaXF1ZSBsaXRlcmFsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1JZGVudGlmaWVyOyAvKio8IFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwogCi0gICAgcm91dGluZ19zdHJhdGVneSBtQXBwbGljYWJsZVN0cmF0ZWd5OyAvKio8IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLiAqLwotCiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtVm9sdW1lUHJvZmlsZTsgLyoqPCBWb2x1bWUgUHJvZmlsZSBmb2xsb3dlZCBieSB0aGlzIHN0cmVhbS4gKi8KIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjA4MjguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1VzYWdlIgotCi0jaW5jbHVkZSAiVXNhZ2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKLQotc3RhdHVzX3QgRWxlbWVudDxhdWRpb191c2FnZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb191c2FnZV90IGlkZW50aWZpZXIpCi17Ci0gICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19VU0FHRV9NQVgpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwotICAgIEFMT0dEKCIlczogVXNhZ2UgJXMgaGFzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdGVtcGxhdGUgPD4KLXN0YXR1c190IEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD46OnNldDxyb3V0aW5nX3N0cmF0ZWd5Pihyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotewotICAgIGlmIChzdHJhdGVneSA+PSBOVU1fU1RSQVRFR0lFUykgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HRCgiJXM6ICVkIGZvciBVc2FnZSAlcyIsIF9fRlVOQ1RJT05fXywgc3RyYXRlZ3ksIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICBtQXBwbGljYWJsZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi10ZW1wbGF0ZSA8Pgotcm91dGluZ19zdHJhdGVneSBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+OjpnZXQ8cm91dGluZ19zdHJhdGVneT4oKSBjb25zdAotewotICAgIEFMT0dEKCIlczogJWQgZm9yIFVzYWdlICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZVN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1BcHBsaWNhYmxlU3RyYXRlZ3k7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ZTBlMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci0KLS8qKgotICogQHRwYXJhbSByb3V0aW5nX3N0cmF0ZWd5OiBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHVzYWdlLgotICovCi10ZW1wbGF0ZSA8PgotY2xhc3MgRWxlbWVudDxhdWRpb191c2FnZV90PgotewotcHVibGljOgotICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCi0gICAgICAgIDogbU5hbWUobmFtZSksCi0gICAgICAgICAgbUFwcGxpY2FibGVTdHJhdGVneShTVFJBVEVHWV9NRURJQSkKLSAgICB7fQotICAgIH5FbGVtZW50KCkge30KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKLSAgICAgKi8KLSAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcG9saWN5IGVsZW1lbnQuCi0gICAgKgotICAgICogQHRwYXJhbSBLZXkgdHlwZSBvZiB0aGUgdW5pcXVlIGlkZW50aWZpZXIuCi0gICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXIgdG8gYmUgc2V0LgotICAgICoKLSAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGlkZW50aWZpZXIgaXMgdmFsaWQgYW5kIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICAgICovCi0gICAgc3RhdHVzX3Qgc2V0SWRlbnRpZmllcihhdWRpb191c2FnZV90IGlkZW50aWZpZXIpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KLSAgICAgKi8KLSAgICBhdWRpb191c2FnZV90IGdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQotCi0gICAgLyoqCi0gICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90Ci0gICAgICogb3IgYSBzdHJpbmcuCi0gICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgotICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgotICAgIHN0YXR1c190IHNldChQcm9wZXJ0eSBwcm9wZXJ0eSk7Ci0KLXByaXZhdGU6Ci0gICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCi0gICAgRWxlbWVudChjb25zdCBFbGVtZW50ICZvYmplY3QpOwotICAgIEVsZW1lbnQgJm9wZXJhdG9yPShjb25zdCBFbGVtZW50ICZvYmplY3QpOwotCi0gICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwotICAgIGF1ZGlvX3VzYWdlX3QgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0gICAgcm91dGluZ19zdHJhdGVneSBtQXBwbGljYWJsZVN0cmF0ZWd5OyAvKio8IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgdXNhZ2UuICovCi19OwotCi10eXBlZGVmIEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD4gVXNhZ2U7Ci0KLX0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxNjk3MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcHl0aG9uX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAidG9vbHNfZGVmYXVsdCIsCisgICAgdmVyc2lvbjogeworICAgICAgICBweTI6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgICAgIHB5MzogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weSIsCisgICAgbWFpbjogImJ1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImJ1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsidG9vbHNfZGVmYXVsdCJdLAorfQorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJkb21haW5HZW5lcmF0b3JQb2xpY3kucHkiLAorICAgIG1haW46ICJkb21haW5HZW5lcmF0b3JQb2xpY3kucHkiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImRvbWFpbkdlbmVyYXRvclBvbGljeS5weSIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWyJ0b29sc19kZWZhdWx0Il0sCisgICAgbGliczogWworICAgICAgICAiRWRkUGFyc2VyLnB5IiwKKyAgICAgICAgImhvc3RDb25maWcucHkiLAorICAgICAgICAiUEZXU2NyaXB0R2VuZXJhdG9yLnB5IiwKKyAgICBdLAorICAgIHJlcXVpcmVkOiBbCisgICAgICAgICJkb21haW5HZW5lcmF0b3JDb25uZWN0b3IiLAorICAgIF0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImJ1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkiLAorICAgIG1haW46ICJidWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJidWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5IiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbInRvb2xzX2RlZmF1bHQiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGZiNzBhNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CkBAIC0wLDAgKzEsMjQzIEBACisjIS91c3IvYmluL3B5dGhvbgorCisjCisjIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIEVUCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRJbmNsdWRlIGFzIEVJCitpbXBvcnQgeG1sLmRvbS5taW5pZG9tIGFzIE1JTklET00KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CisKKyMKKyMgSGVscGVyIHNjcmlwdCB0aGF0IGhlbHBzIHRvIGZlZWQgYXQgYnVpbGQgdGltZSB0aGUgWE1MIGNyaXRlcmlvbiB0eXBlcyBmaWxlIHVzZWQgYnkKKyMgdGhlIGVuZ2luZWNvbmZpZ3VyYWJsZSB0byBzdGFydCB0aGUgcGFyYW1ldGVyLWZyYW1ld29yay4KKyMgSXQgcHJldmVudHMgdG8gZmlsbCB0aGVtIG1hbnVhbGx5IGFuZCBhdm9pZCBkaXZlcmdlbmNlcyB3aXRoIGFuZHJvaWQuCisjCisjIFRoZSBEZXZpY2UgVHlwZXMgY3JpdGVyaW9uIHR5cGVzIGFyZSBmZWQgZnJvbSBhdWRpby1iYXNlLmggZmlsZSB3aXRoIHRoZSBvcHRpb24KKyMgICAgICAgICAgIC0tYW5kcm9pZGF1ZGlvYmFzZWhlYWRlciA8cGF0aC90by9hbmRyb2lkL2F1ZGlvL2Jhc2UvZmlsZS9hdWRpby1iYXNlLmg+CisjCisjIFRoZSBEZXZpY2UgQWRkcmVzc2VzIGNyaXRlcmlvbiB0eXBlcyBhcmUgZmVkIGZyb20gdGhlIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyMgaW4gb3JkZXIgdG8gZGlzY292ZXIgYWxsIHRoZSBkZXZpY2VzIGZvciB3aGljaCB0aGUgYWRkcmVzcyBtYXR0ZXIuCisjICAgICAgICAgICAtLWF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUgPHBhdGgvdG8vYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sPgorIworIyBUaGUgcmVmZXJlbmNlIGZpbGUgb2YgY3JpdGVyaW9uIHR5cGVzIG11c3QgYWxzbyBiZSBzZXQgYXMgYW4gaW5wdXQgb2YgdGhlIHNjcmlwdDoKKyMgICAgICAgICAgIC0tY3JpdGVyaW9udHlwZXMgPHBhdGgvdG8vY3JpdGVyaW9uL2ZpbGUvYXVkaW9fY3JpdGVyaW9uX3R5cGVzLnhtbC5pbj4KKyMKKyMgQXQgbGFzdCwgdGhlIG91dHB1dCBvZiB0aGUgc2NyaXB0IHNoYWxsIGJlIHNldCBhbHNvOgorIyAgICAgICAgICAgLS1vdXRwdXRmaWxlIDxwYXRoL3RvL291dC92ZW5kb3IvZXRjL2F1ZGlvX2NyaXRlcmlvbl90eXBlcy54bWw+CisjCisKK2RlZiBwYXJzZUFyZ3MoKToKKyAgICBhcmdwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iUGFyYW1ldGVyLUZyYW1ld29yayBYTUwgXAorICAgICAgICBhdWRpbyBjcml0ZXJpb24gdHlwZSBmaWxlIGdlbmVyYXRvci5cblwKKyAgICAgICAgRXhpdCB3aXRoIHRoZSBudW1iZXIgb2YgKHJlY292ZXJhYmxlIG9yIG5vdCkgZXJyb3IgdGhhdCBvY2N1cmVkLiIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyJywKKyAgICAgICAgICAgIGhlbHA9IkFuZHJvaWQgQXVkaW8gQmFzZSBDIGhlYWRlciBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkFORFJPSURfQVVESU9fQkFTRV9IRUFERVIiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUnLAorICAgICAgICAgICAgaGVscD0iQW5kcm9pZCBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IihBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFKSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tY3JpdGVyaW9udHlwZXMnLAorICAgICAgICAgICAgaGVscD0iQ3JpdGVyaW9uIHR5cGVzIFhNTCBiYXNlIGZpbGUsIGluIFwKKyAgICAgICAgICAgICc8Y3JpdGVyaW9uX3R5cGVzPiBcCisgICAgICAgICAgICAgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IiIgdHlwZT08aW5jbHVzaXZlfGV4Y2x1c2l2ZT4gdmFsdWVzPTx2YWx1ZTEsdmFsdWUyLC4uLj4vPicgXAorICAgICAgICBmb3JtYXQuIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgbWV0YXZhcj0iQ1JJVEVSSU9OX1RZUEVfRklMRSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0ZmlsZScsCisgICAgICAgICAgICBoZWxwPSJDcml0ZXJpb24gdHlwZXMgb3V0cHV0ZmlsZSBmaWxlLiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkNSSVRFUklPTl9UWVBFX09VVFBVVF9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3cnKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywKKyAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKyAgICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2RlZiBnZW5lcmF0ZVhtbENyaXRlcmlvblR5cGVzRmlsZShjcml0ZXJpb25UeXBlcywgYWRkcmVzc0NyaXRlcmlhLCBjcml0ZXJpb25UeXBlc0ZpbGUsIG91dHB1dEZpbGUpOgorCisgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uVHlwZXNGaWxlIHt9Ii5mb3JtYXQoY3JpdGVyaW9uVHlwZXNGaWxlKSkKKyAgICBjcml0ZXJpb25fdHlwZXNfaW5fdHJlZSA9IEVULnBhcnNlKGNyaXRlcmlvblR5cGVzRmlsZSkKKworICAgIGNyaXRlcmlvbl90eXBlc19yb290ID0gY3JpdGVyaW9uX3R5cGVzX2luX3RyZWUuZ2V0cm9vdCgpCisKKyAgICBmb3IgY3JpdGVyaW9uX25hbWUsIHZhbHVlc19kaWN0IGluIGNyaXRlcmlvblR5cGVzLml0ZW1zKCk6CisgICAgICAgIGZvciBjcml0ZXJpb25fdHlwZSBpbiBjcml0ZXJpb25fdHlwZXNfcm9vdC5maW5kYWxsKCdjcml0ZXJpb25fdHlwZScpOgorICAgICAgICAgICAgaWYgY3JpdGVyaW9uX3R5cGUuZ2V0KCduYW1lJykgPT0gY3JpdGVyaW9uX25hbWU6CisgICAgICAgICAgICAgICAgdmFsdWVzX25vZGUgPSBFVC5TdWJFbGVtZW50KGNyaXRlcmlvbl90eXBlLCAidmFsdWVzIikKKyAgICAgICAgICAgICAgICBvcmRlcmVkX3ZhbHVlcyA9IE9yZGVyZWREaWN0KHNvcnRlZCh2YWx1ZXNfZGljdC5pdGVtcygpLCBrZXk9bGFtYmRhIHg6IHhbMV0pKQorICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG9yZGVyZWRfdmFsdWVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KHZhbHVlc19ub2RlLCAidmFsdWUiKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnbnVtZXJpY2FsJywgc3RyKHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ2xpdGVyYWwnLCBrZXkpCisKKyAgICBpZiBhZGRyZXNzQ3JpdGVyaWE6CisgICAgICAgIGZvciBjcml0ZXJpb25fbmFtZSwgdmFsdWVzX2xpc3QgaW4gYWRkcmVzc0NyaXRlcmlhLml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgY3JpdGVyaW9uX3R5cGUgaW4gY3JpdGVyaW9uX3R5cGVzX3Jvb3QuZmluZGFsbCgnY3JpdGVyaW9uX3R5cGUnKToKKyAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fdHlwZS5nZXQoJ25hbWUnKSA9PSBjcml0ZXJpb25fbmFtZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzX25vZGUgPSBFVC5TdWJFbGVtZW50KGNyaXRlcmlvbl90eXBlLCAidmFsdWVzIikKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXNfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KHZhbHVlc19ub2RlLCAidmFsdWUiLCBsaXRlcmFsPXZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ251bWVyaWNhbCcsIHN0cigxIDw8IGluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKworICAgIHhtbHN0ciA9IEVULnRvc3RyaW5nKGNyaXRlcmlvbl90eXBlc19yb290LCBlbmNvZGluZz0ndXRmOCcsIG1ldGhvZD0neG1sJykKKyAgICByZXBhcnNlZCA9IE1JTklET00ucGFyc2VTdHJpbmcoeG1sc3RyKQorICAgIHByZXR0eVhtbFN0ciA9IHJlcGFyc2VkLnRvcHJldHR5eG1sKG5ld2w9J1xyXG4nKQorICAgIHByZXR0eVhtbFN0ciA9IG9zLmxpbmVzZXAuam9pbihbcyBmb3IgcyBpbiBwcmV0dHlYbWxTdHIuc3BsaXRsaW5lcygpIGlmIHMuc3RyaXAoKV0pCisgICAgb3V0cHV0RmlsZS53cml0ZShwcmV0dHlYbWxTdHIuZW5jb2RlKCd1dGYtOCcpKQorCitkZWYgY2FwaXRhbGl6ZUxpbmUobGluZSk6CisgICAgcmV0dXJuICcgJy5qb2luKCh3LmNhcGl0YWxpemUoKSBmb3IgdyBpbiBsaW5lLnNwbGl0KCcgJykpKQorCisKKyMKKyMgUGFyc2UgdGhlIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIG91dHB1dCBhIGRpY3Rpb25hcnkgb2YgZGV2aWNlIGNyaXRlcmlhIGFkZHJlc3NlcworIworZGVmIHBhcnNlQW5kcm9pZEF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbkZpbGUoYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSk6CisKKyAgICBsb2dnaW5nLmluZm8oIkNoZWNraW5nIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUge30iLmZvcm1hdChhdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlKSkKKyAgICAjCisgICAgIyBleHRyYWN0IGFsbCBkZXZpY2VzIGFkZHJlc3NlcyBmcm9tIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAjCisgICAgYWRkcmVzc19jcml0ZXJpYV9tYXBwaW5nX3RhYmxlID0geworICAgICAgICAnc2luaycgOiAiT3V0cHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiLAorICAgICAgICAnc291cmNlJyA6ICJJbnB1dERldmljZXNBZGRyZXNzZXNUeXBlIiB9CisKKyAgICBhZGRyZXNzX2NyaXRlcmlhID0geworICAgICAgICAnT3V0cHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUnIDogW10sCisgICAgICAgICdJbnB1dERldmljZXNBZGRyZXNzZXNUeXBlJyA6IFtdIH0KKworICAgIG9sZFdvcmtpbmdEaXIgPSBvcy5nZXRjd2QoKQorICAgIHByaW50ICJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICVzIiAlIG9sZFdvcmtpbmdEaXIKKworICAgIG5ld0RpciA9IG9zLnBhdGguam9pbihvbGRXb3JraW5nRGlyICwgYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZS5uYW1lKQorCisgICAgcG9saWN5X2luX3RyZWUgPSBFVC5wYXJzZShhdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlKQorICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLm5vcm1wYXRoKG5ld0RpcikpKQorCisgICAgcHJpbnQgIm5ldyB3b3JraW5nIGRpcmVjdG9yeSAlcyIgJSBvcy5nZXRjd2QoKQorCisgICAgcG9saWN5X3Jvb3QgPSBwb2xpY3lfaW5fdHJlZS5nZXRyb290KCkKKyAgICBFSS5pbmNsdWRlKHBvbGljeV9yb290KQorCisgICAgb3MuY2hkaXIob2xkV29ya2luZ0RpcikKKworICAgIGZvciBkZXZpY2UgaW4gcG9saWN5X3Jvb3QuaXRlcignZGV2aWNlUG9ydCcpOgorICAgICAgICBmb3Iga2V5IGluIGFkZHJlc3NfY3JpdGVyaWFfbWFwcGluZ190YWJsZS5rZXlzKCk6CisgICAgICAgICAgICBpZiBkZXZpY2UuZ2V0KCdyb2xlJykgPT0ga2V5IGFuZCBkZXZpY2UuZ2V0KCdhZGRyZXNzJykgOgorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygie306IDx7fT4iLmZvcm1hdChrZXksIGRldmljZS5nZXQoJ2FkZHJlc3MnKSkpCisgICAgICAgICAgICAgICAgYWRkcmVzc19jcml0ZXJpYVthZGRyZXNzX2NyaXRlcmlhX21hcHBpbmdfdGFibGVba2V5XV0uYXBwZW5kKGRldmljZS5nZXQoJ2FkZHJlc3MnKSkKKworICAgIGZvciBjcml0ZXJpYSBpbiBhZGRyZXNzX2NyaXRlcmlhOgorICAgICAgICB2YWx1ZXMgPSAnLCcuam9pbihhZGRyZXNzX2NyaXRlcmlhW2NyaXRlcmlhXSkKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJ7fTogPHt9PiIuZm9ybWF0KGNyaXRlcmlhLCB2YWx1ZXMpKQorCisgICAgcmV0dXJuIGFkZHJlc3NfY3JpdGVyaWEKKworIworIyBQYXJzZSB0aGUgYXVkaW8tYmFzZS5oIGZpbGUgYW5kIG91dHB1dCBhIGRpY3Rpb25hcnkgb2YgYW5kcm9pZCBkZXBlbmRlbnQgY3JpdGVyaW9uIHR5cGVzOgorIyAgIC1BbmRyb2lkIE1vZGUKKyMgICAtT3V0cHV0IGRldmljZXMgdHlwZQorIyAgIC1JbnB1dCBkZXZpY2VzIHR5cGUKKyMKK2RlZiBwYXJzZUFuZHJvaWRBdWRpb0ZpbGUoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpOgorICAgICMKKyAgICAjIEFkYXB0YXRpb24gdGFibGUgYmV0d2VlbiBBbmRyb2lkIEVudW1lcmF0aW9uIHByZWZpeCBhbmQgQXVkaW8gUEZXIENyaXRlcmlvbiB0eXBlIG5hbWVzCisgICAgIworICAgIGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlID0geworICAgICAgICAnQVVESU9fTU9ERScgOiAiQW5kcm9pZE1vZGVUeXBlIiwKKyAgICAgICAgJ0FVRElPX0RFVklDRV9PVVQnIDogIk91dHB1dERldmljZXNNYXNrVHlwZSIsCisgICAgICAgICdBVURJT19ERVZJQ0VfSU4nIDogIklucHV0RGV2aWNlc01hc2tUeXBlIn0KKworICAgIGFsbF9jcml0ZXJpYSA9IHsKKyAgICAgICAgJ0FuZHJvaWRNb2RlVHlwZScgOiB7fSwKKyAgICAgICAgJ091dHB1dERldmljZXNNYXNrVHlwZScgOiB7fSwKKyAgICAgICAgJ0lucHV0RGV2aWNlc01hc2tUeXBlJyA6IHt9IH0KKworICAgICMKKyAgICAjIF9DTlQsIF9NQVgsIF9BTEwgYW5kIF9OT05FIGFyZSBwcm9oaWJpdGVkIHZhbHVlcyBhcyB0aGVyIGFyZSBqdXN0IGhlbHBlcnMgZm9yIGVudW0gdXNlcnMuCisgICAgIworICAgIGlnbm9yZWRfdmFsdWVzID0gWyAnQ05UJywgJ01BWCcsICdBTEwnLCAnTk9ORScgXQorCisgICAgY3JpdGVyaWFfcGF0dGVybiA9IHJlLmNvbXBpbGUoCisgICAgICAgIHIiXHMqKD9QPHR5cGU+KD86IisnfCcuam9pbihjcml0ZXJpb25fbWFwcGluZ190YWJsZS5rZXlzKCkpICsgIikpXF8iIFwKKyAgICAgICAgciIoP1A8bGl0ZXJhbD4oPyEiICsgJ3wnLmpvaW4oaWdub3JlZF92YWx1ZXMpICsgIilcdyopXHMqPVxzKiIgXAorICAgICAgICByIig/UDx2YWx1ZXM+KD86MFt4WF0pP1swLTlhLWZBLUZdKykiKQorCisgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBbmRyb2lkIEhlYWRlciBmaWxlIHt9Ii5mb3JtYXQoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpKQorCisgICAgZm9yIGxpbmVfbnVtYmVyLCBsaW5lIGluIGVudW1lcmF0ZShhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSk6CisgICAgICAgIG1hdGNoID0gY3JpdGVyaWFfcGF0dGVybi5tYXRjaChsaW5lKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoIlRoZSBmb2xsb3dpbmcgbGluZSBpcyBWQUxJRDoge306e31cbnt9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUubmFtZSwgbGluZV9udW1iZXIsIGxpbmUpKQorCisgICAgICAgICAgICBjcml0ZXJpb25fbmFtZSA9IGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlW21hdGNoLmdyb3VwZGljdCgpWyd0eXBlJ11dCisgICAgICAgICAgICBsaXRlcmFsID0gJycuam9pbigody5jYXBpdGFsaXplKCkgZm9yIHcgaW4gbWF0Y2guZ3JvdXBkaWN0KClbJ2xpdGVyYWwnXS5zcGxpdCgnXycpKSkKKyAgICAgICAgICAgIG51bWVyaWNhbF92YWx1ZSA9IG1hdGNoLmdyb3VwZGljdCgpWyd2YWx1ZXMnXQorCisgICAgICAgICAgICAjIGZvciBBVURJT19ERVZJQ0VfSU46IG5lZWQgdG8gcmVtb3ZlIHNpZ24gYml0CisgICAgICAgICAgICBpZiBjcml0ZXJpb25fbmFtZSA9PSAiSW5wdXREZXZpY2VzTWFza1R5cGUiOgorICAgICAgICAgICAgICAgIG51bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKSAmIH4yMTQ3NDgzNjQ4KQorCisgICAgICAgICAgICAjIFJlbW92ZSBkdXBsaWNhdGVkIG51bWVyaWNhbCB2YWx1ZXMKKyAgICAgICAgICAgIGlmIGludChudW1lcmljYWxfdmFsdWUsIDApIGluIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV0udmFsdWVzKCk6CisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJjcml0ZXJpb24ge30gZHVwbGljYXRlZCB2YWx1ZXM6Ii5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygie306e30iLmZvcm1hdChudW1lcmljYWxfdmFsdWUsIGxpdGVyYWwpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiS0VFUElORyBMQVRFU1QiKQorICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXS5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1ba2V5XSA9PSBpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdW2tleV0KKworICAgICAgICAgICAgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtsaXRlcmFsXSA9IGludChudW1lcmljYWxfdmFsdWUsIDApCisKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoInR5cGU6e30sIi5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiaXRlcmFsOnt9LCIuZm9ybWF0KGxpdGVyYWwpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidmFsdWVzOnt9LiIuZm9ybWF0KG51bWVyaWNhbF92YWx1ZSkpCisKKyAgICByZXR1cm4gYWxsX2NyaXRlcmlhCisKKworZGVmIG1haW4oKToKKyAgICBsb2dnaW5nLnJvb3Quc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgIGFyZ3MgPSBwYXJzZUFyZ3MoKQorCisgICAgYWxsX2NyaXRlcmlhID0gcGFyc2VBbmRyb2lkQXVkaW9GaWxlKGFyZ3MuYW5kcm9pZGF1ZGlvYmFzZWhlYWRlcikKKworICAgIGFkZHJlc3NfY3JpdGVyaWEgPSBwYXJzZUFuZHJvaWRBdWRpb1BvbGljeUNvbmZpZ3VyYXRpb25GaWxlKGFyZ3MuYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSkKKworICAgIGNyaXRlcmlvbl90eXBlcyA9IGFyZ3MuY3JpdGVyaW9udHlwZXMKKworICAgIGdlbmVyYXRlWG1sQ3JpdGVyaW9uVHlwZXNGaWxlKGFsbF9jcml0ZXJpYSwgYWRkcmVzc19jcml0ZXJpYSwgY3JpdGVyaW9uX3R5cGVzLCBhcmdzLm91dHB1dGZpbGUpCisKKyMgSWYgdGhpcyBmaWxlIGlzIGRpcmVjdGx5IGV4ZWN1dGVkCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRTdHJhdGVnaWVzU3RydWN0dXJlRmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZTcwYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkKQEAgLTAsMCArMSwxMzkgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMKKyMgQ29weXJpZ2h0IDIwMTksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IG9zCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgRVQKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudEluY2x1ZGUgYXMgRUkKK2ltcG9ydCB4bWwuZG9tLm1pbmlkb20gYXMgTUlOSURPTQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKKworIworIyBIZWxwZXIgc2NyaXB0IHRoYXQgaGVscHMgdG8gZmVlZCBhdCBidWlsZCB0aW1lIHRoZSBYTUwgUHJvZHVjdCBTdHJhdGVnaWVzIFN0cnVjdHVyZSBmaWxlIGZpbGUgdXNlZAorIyBieSB0aGUgZW5naW5lY29uZmlndXJhYmxlIHRvIHN0YXJ0IHRoZSBwYXJhbWV0ZXItZnJhbWV3b3JrLgorIyBJdCBwcmV2ZW50cyB0byBmaWxsIHRoZW0gbWFudWFsbHkgYW5kIGF2b2lkIGRpdmVyZ2VuY2VzIHdpdGggYW5kcm9pZC4KKyMKKyMgVGhlIFByb2R1Y3QgU3RyYXRlZ2llcyBTdHJ1Y3R1cmUgZmlsZSBpcyBmZWQgZnJvbSB0aGUgYXVkaW8gcG9saWN5IGVuZ2luZSBjb25maWd1cmF0aW9uIGZpbGUKKyMgaW4gb3JkZXIgdG8gZGlzY292ZXIgYWxsIHRoZSBzdHJhdGVnaWVzIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCisjICAgICAgICAgICAtLWF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhdGlvbmZpbGUgPHBhdGgvdG8vYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbD4KKyMKKyMgVGhlIHJlZmVyZW5jZSBmaWxlIG9mIFByb2R1Y3RTdHJhdGVnaWVzIHN0cnVjdHVyZSBtdXN0IGFsc28gYmUgc2V0IGFzIGFuIGlucHV0IG9mIHRoZSBzY3JpcHQ6CisjICAgICAgICAgICAtLXByb2R1Y3RzdHJhdGVnaWVzc3RydWN0dXJlZmlsZSA8cGF0aC90by9zdHJ1Y3R1cmUvZmlsZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwuaW4+CisjCisjIEF0IGxhc3QsIHRoZSBvdXRwdXQgb2YgdGhlIHNjcmlwdCBzaGFsbCBiZSBzZXQgYWxzbzoKKyMgICAgICAgICAgIC0tb3V0cHV0ZmlsZSA8cGF0aC90by9vdXQvPHN5c3RlbXx2ZW5kb3J8b2RtPi9ldGMvUHJvZHVjdFN0cmF0ZWdpZXMueG1sPgorIworCitkZWYgcGFyc2VBcmdzKCk6CisgICAgYXJncGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IlBhcmFtZXRlci1GcmFtZXdvcmsgWE1MIFwKKyAgICAgICAgcHJvZHVjdCBzdHJhdGVnaWVzIHN0cnVjdHVyZSBmaWxlIGdlbmVyYXRvci5cblwKKyAgICAgICAgRXhpdCB3aXRoIHRoZSBudW1iZXIgb2YgKHJlY292ZXJhYmxlIG9yIG5vdCkgZXJyb3IgdGhhdCBvY2N1cmVkLiIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlJywKKyAgICAgICAgICAgIGhlbHA9IkFuZHJvaWQgQXVkaW8gUG9saWN5IEVuZ2luZSBDb25maWd1cmF0aW9uIGZpbGUsIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgbWV0YXZhcj0iKEFVRElPX1BPTElDWV9FTkdJTkVfQ09ORklHVVJBVElPTl9GSUxFKSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJvZHVjdHN0cmF0ZWdpZXNzdHJ1Y3R1cmVmaWxlJywKKyAgICAgICAgICAgIGhlbHA9IlByb2R1Y3QgU3RyYXRlZ2llcyBTdHJ1Y3R1cmUgWE1MIGJhc2UgZmlsZSwgTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJTVFJBVEVHSUVTX1NUUlVDVFVSRV9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXRmaWxlJywKKyAgICAgICAgICAgIGhlbHA9IlByb2R1Y3QgU3RyYXRlZ2llcyBTdHJ1Y3R1cmUgb3V0cHV0IGZpbGUsIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgbWV0YXZhcj0iU1RSQVRFR0lFU19TVFJVQ1RVUkVfT1VUUFVUX0ZJTEUiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgndycpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLAorICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJykKKworICAgIHJldHVybiBhcmdwYXJzZXIucGFyc2VfYXJncygpCisKKworZGVmIGdlbmVyYXRlWG1sU3RydWN0dXJlRmlsZShzdHJhdGVnaWVzLCBzdHJhdGVneVN0cnVjdHVyZUluRmlsZSwgb3V0cHV0RmlsZSk6CisKKyAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBzdHJhdGVneVN0cnVjdHVyZUluRmlsZSB7fSIuZm9ybWF0KHN0cmF0ZWd5U3RydWN0dXJlSW5GaWxlKSkKKyAgICBzdHJhdGVnaWVzX2luX3RyZWUgPSBFVC5wYXJzZShzdHJhdGVneVN0cnVjdHVyZUluRmlsZSkKKworICAgIHN0cmF0ZWdpZXNfcm9vdCA9IHN0cmF0ZWdpZXNfaW5fdHJlZS5nZXRyb290KCkKKyAgICBzdHJhdGVneV9jb21wb25lbnRzID0gc3RyYXRlZ2llc19yb290LmZpbmQoJ0NvbXBvbmVudFR5cGUnKQorCisgICAgZm9yIHN0cmF0ZWd5X25hbWUgaW4gc3RyYXRlZ2llczoKKyAgICAgICAgY29udGV4dF9tYXBwaW5nID0gIiIuam9pbihtYXAoc3RyLCBbIk5hbWU6Iiwgc3RyYXRlZ3lfbmFtZV0pKQorICAgICAgICBzdHJhdGVneV9wZndfbmFtZSA9IHN0cmF0ZWd5X25hbWUucmVwbGFjZSgnU1RSQVRFR1lfJywgJycpLmxvd2VyKCkKKyAgICAgICAgc3RyYXRlZ3lfY29tcG9uZW50X25vZGUgPSBFVC5TdWJFbGVtZW50KHN0cmF0ZWd5X2NvbXBvbmVudHMsICJDb21wb25lbnQiLCBOYW1lPXN0cmF0ZWd5X3Bmd19uYW1lLCBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLCBNYXBwaW5nPWNvbnRleHRfbWFwcGluZykKKworICAgIHhtbHN0ciA9IEVULnRvc3RyaW5nKHN0cmF0ZWdpZXNfcm9vdCwgZW5jb2Rpbmc9J3V0ZjgnLCBtZXRob2Q9J3htbCcpCisgICAgcmVwYXJzZWQgPSBNSU5JRE9NLnBhcnNlU3RyaW5nKHhtbHN0cikKKyAgICBwcmV0dHlYbWxTdHIgPSByZXBhcnNlZC50b3ByZXR0eXhtbChuZXdsPSdcclxuJykKKyAgICBwcmV0dHlYbWxTdHIgPSBvcy5saW5lc2VwLmpvaW4oW3MgZm9yIHMgaW4gcHJldHR5WG1sU3RyLnNwbGl0bGluZXMoKSBpZiBzLnN0cmlwKCldKQorICAgIG91dHB1dEZpbGUud3JpdGUocHJldHR5WG1sU3RyLmVuY29kZSgndXRmLTgnKSkKKworZGVmIGNhcGl0YWxpemVMaW5lKGxpbmUpOgorICAgIHJldHVybiAnICcuam9pbigody5jYXBpdGFsaXplKCkgZm9yIHcgaW4gbGluZS5zcGxpdCgnICcpKSkKKworCisjCisjIFBhcnNlIHRoZSBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBvdXRwdXQgYSBkaWN0aW9uYXJ5IG9mIGRldmljZSBjcml0ZXJpYSBhZGRyZXNzZXMKKyMKK2RlZiBwYXJzZUFuZHJvaWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZ3VyYXRpb25GaWxlKGF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhdGlvbmZpbGUpOgorCisgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBdWRpbyBQb2xpY3kgRW5naW5lIENvbmZpZ3VyYXRpb24gZmlsZSB7fSIuZm9ybWF0KGF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhdGlvbmZpbGUpKQorICAgICMKKyAgICAjIGV4dHJhY3QgYWxsIHByb2R1Y3Qgc3RyYXRlZ2llcyBuYW1lIGZyb20gYXVkaW8gcG9saWN5IGVuZ2luZSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAjCisgICAgc3RyYXRlZ3lfbmFtZXMgPSBbXQorCisgICAgb2xkV29ya2luZ0RpciA9IG9zLmdldGN3ZCgpCisgICAgcHJpbnQgIkN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgJXMiICUgb2xkV29ya2luZ0RpcgorCisgICAgbmV3RGlyID0gb3MucGF0aC5qb2luKG9sZFdvcmtpbmdEaXIgLCBhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlLm5hbWUpCisKKyAgICBwb2xpY3lfZW5naW5lX2luX3RyZWUgPSBFVC5wYXJzZShhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlKQorICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLm5vcm1wYXRoKG5ld0RpcikpKQorCisgICAgcHJpbnQgIm5ldyB3b3JraW5nIGRpcmVjdG9yeSAlcyIgJSBvcy5nZXRjd2QoKQorCisgICAgcG9saWN5X2VuZ2luZV9yb290ID0gcG9saWN5X2VuZ2luZV9pbl90cmVlLmdldHJvb3QoKQorICAgIEVJLmluY2x1ZGUocG9saWN5X2VuZ2luZV9yb290KQorCisgICAgb3MuY2hkaXIob2xkV29ya2luZ0RpcikKKworICAgIGZvciBzdHJhdGVneSBpbiBwb2xpY3lfZW5naW5lX3Jvb3QuaXRlcignUHJvZHVjdFN0cmF0ZWd5Jyk6CisgICAgICAgIHN0cmF0ZWd5X25hbWVzLmFwcGVuZChzdHJhdGVneS5nZXQoJ25hbWUnKSkKKworICAgIHJldHVybiBzdHJhdGVneV9uYW1lcworCisKK2RlZiBtYWluKCk6CisgICAgbG9nZ2luZy5yb290LnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICBhcmdzID0gcGFyc2VBcmdzKCkKKworICAgIHN0cmF0ZWdpZXMgPSBwYXJzZUFuZHJvaWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZ3VyYXRpb25GaWxlKGFyZ3MuYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmF0aW9uZmlsZSkKKworICAgIHByb2R1Y3Rfc3RyYXRlZ2llc19zdHJ1Y3R1cmUgPSBhcmdzLnByb2R1Y3RzdHJhdGVnaWVzc3RydWN0dXJlZmlsZQorCisgICAgZ2VuZXJhdGVYbWxTdHJ1Y3R1cmVGaWxlKHN0cmF0ZWdpZXMsIHByb2R1Y3Rfc3RyYXRlZ2llc19zdHJ1Y3R1cmUsIGFyZ3Mub3V0cHV0ZmlsZSkKKworIyBJZiB0aGlzIGZpbGUgaXMgZGlyZWN0bHkgZXhlY3V0ZWQKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRfYXVkaW9fcGZ3X3NldHRpbmdzLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg2NDY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5tawpAQCAtMCwwICsxLDM1IEBACitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCisKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChQRldfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX1RPT0wgOj0gZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5CiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX1RPUExFVkVMX0ZJTEUgOj0gJChQRldfVE9QTEVWRUxfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfQ1JJVEVSSUFfRklMRSA6PSAkKFBGV19DUklURVJJQV9GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9UVU5JTkdfRklMRSA6PSAkKFBGV19UVU5JTkdfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfRUREX0ZJTEVTIDo9ICQoUEZXX0VERF9GSUxFUykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfRE9NQUlOX0ZJTEVTIDo9ICQoUEZXX0RPTUFJTl9GSUxFUykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfU0NIRU1BU19ESVIgOj0gJChQRldfU0NIRU1BU19ESVIpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1JFUVVJUkVEX01PRFVMRVMpICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpIGRvbWFpbkdlbmVyYXRvclBvbGljeS5weQorCisJIiQoTVlfVE9PTCkiIC0tdmFsaWRhdGUgXAorCQktLXRvcGxldmVsLWNvbmZpZyAiJChNWV9UT1BMRVZFTF9GSUxFKSIgXAorCQktLWNyaXRlcmlhICIkKE1ZX0NSSVRFUklBX0ZJTEUpIiBcCisJCS0tY3JpdGVyaW9udHlwZXMgIiQoTVlfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUpIiBcCisJCS0taW5pdGlhbC1zZXR0aW5ncyAkKE1ZX1RVTklOR19GSUxFKSBcCisJCS0tYWRkLWVkZHMgJChNWV9FRERfRklMRVMpIFwKKwkJLS1hZGQtZG9tYWlucyAkKE1ZX0RPTUFJTl9GSUxFUykgXAorCQktLXNjaGVtYXMtZGlyICQoTVlfU0NIRU1BU19ESVIpID4gIiRAIgorCisKKyMgQ2xlYXIgdmFyaWFibGVzIGZvciBmdXJ0aGVyIHVzZQorUEZXX1RPUExFVkVMX0ZJTEUgOj0KK1BGV19TVFJVQ1RVUkVfRklMRVMgOj0KK1BGV19DUklURVJJQV9GSUxFIDo9CitQRldfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0KK1BGV19UVU5JTkdfRklMRSA6PQorUEZXX0VERF9GSUxFUyA6PQorUEZXX0RPTUFJTl9GSUxFUyA6PQorUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2RvbWFpbkdlbmVyYXRvclBvbGljeS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OTI5NDAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2RvbWFpbkdlbmVyYXRvclBvbGljeS5weQpAQCAtMCwwICsxLDI2OCBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIworIyBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgRWRkUGFyc2VyCitmcm9tIFBGV1NjcmlwdEdlbmVyYXRvciBpbXBvcnQgUGZ3U2NyaXB0VHJhbnNsYXRvcgoraW1wb3J0IGhvc3RDb25maWcKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IG9zCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgRVQKKworIworIyBJbiBvcmRlciB0byBidWlsZCB0aGUgWE1MIFNldHRpbmdzIGZpbGUgYXQgYnVpbGQgdGltZSwgYW4gaW5zdGFuY2Ugb2YgdGhlIHBhcmFtZXRlci1mcmFtZXdvcmsKKyMgc2hhbGwgYmUgc3RhcnRlZCBhbmQgZmVkIHdpdGggYWxsIHRoZSBjcml0ZXJpb24gdHlwZXMvY3JpdGVyaWEgdGhhdCB3aWxsIGJlIHVzZWQgYnkKKyMgdGhlIGVuZ2luZWNvbmZpZ3VyYWJsZS4KKyMgVGhpcyBzY3JpcHRzIGFsbG93cyBnZW5lcmF0ZXMgdGhlIHNldHRpbmdzIGZyb20gdGhlIHNhbWUgYXVkaW9fY3JpdGVyaW9uX3R5cGVzLnhtbCAvCisjIGF1ZGlvX2NyaXRlcmlhLnhtbCBmaWxlcyB1c2VkIGF0IHJ1biB0aW1lIGJ5IHRoZSBlbmdpbmVjb25maWd1cmFibGUKKyMKKworZGVmIHBhcnNlQXJncygpOgorICAgIGFyZ3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSJQYXJhbWV0ZXItRnJhbWV3b3JrIFhNTCBcCisgICAgICAgIFNldHRpbmdzIGZpbGUgZ2VuZXJhdG9yLlxuXAorICAgICAgICBFeGl0IHdpdGggdGhlIG51bWJlciBvZiAocmVjb3ZlcmFibGUgb3Igbm90KSBlcnJvciB0aGF0IG9jY3VyZWQuIikKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRvcGxldmVsLWNvbmZpZycsCisgICAgICAgICAgICBoZWxwPSJUb3AtbGV2ZWwgcGFyYW1ldGVyLWZyYW1ld29yayBjb25maWd1cmF0aW9uIGZpbGUuIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgbWV0YXZhcj0iVE9QTEVWRUxfQ09ORklHX0ZJTEUiLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNyaXRlcmlhJywKKyAgICAgICAgICAgIGhlbHA9IkNyaXRlcmlhIGZpbGUsIGluIFhNTCBmb3JtYXQ6IFwKKyAgICAgICAgICAgICAgICAgIGluICc8Y3JpdGVyaWE+IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGNyaXRlcmlvbiBuYW1lPSIiIHR5cGU9IiIvPiBcCisgICAgICAgICAgICAgICAgICAgICAgPC9jcml0ZXJpYT4nIFwKKyAgICAgICAgZm9ybWF0LiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkNSSVRFUklBX0ZJTEUiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNyaXRlcmlvbnR5cGVzJywKKyAgICAgICAgICAgIGhlbHA9IkNyaXRlcmlvbiB0eXBlcyBYTUwgZmlsZSwgaW4gXAorICAgICAgICAgICAgJzxjcml0ZXJpb25fdHlwZXM+IFwKKyAgICAgICAgICAgICAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iIiB0eXBlPTxpbmNsdXNpdmV8ZXhjbHVzaXZlPiB2YWx1ZXM9PHZhbHVlMSx2YWx1ZTIsLi4uPi8+IFwKKyAgICAgICAgICAgICA8L2NyaXRlcmlvbl90eXBlcz4nIFwKKyAgICAgICAgZm9ybWF0LiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkNSSVRFUklPTl9UWVBFX0ZJTEUiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9RmFsc2UpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1pbml0aWFsLXNldHRpbmdzJywKKyAgICAgICAgICAgIGhlbHA9IkluaXRpYWwgWE1MIHNldHRpbmdzIGZpbGUgKGNvbnRhaW5pbmcgYSBcCisgICAgICAgIDxDb25maWd1cmFibGVEb21haW5zPiAgdGFnIiwKKyAgICAgICAgICAgIG5hcmdzPSc/JywKKyAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgIG1ldGF2YXI9IlhNTF9TRVRUSU5HU19GSUxFIikKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWFkZC1kb21haW5zJywKKyAgICAgICAgICAgIGhlbHA9Ikxpc3Qgb2Ygc2luZ2xlIGRvbWFpbiBmaWxlcyAoZWFjaCBjb250YWluaW5nIGEgc2luZ2xlIFwKKyAgICAgICAgPENvbmZpZ3VyYWJsZURvbWFpbj4gdGFnIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IlhNTF9ET01BSU5fRklMRSIsCisgICAgICAgICAgICBuYXJncz0nKicsCisgICAgICAgICAgICBkZXN0PSd4bWxfZG9tYWluX2ZpbGVzJywKKyAgICAgICAgICAgIGRlZmF1bHQ9W10pCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hZGQtZWRkcycsCisgICAgICAgICAgICBoZWxwPSJMaXN0IG9mIGZpbGVzIGluIEVERCBzeW50YXggKGFrYSBcIi5wZndcIiBmaWxlcykiLAorICAgICAgICAgICAgbWV0YXZhcj0iRUREX0ZJTEUiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgbmFyZ3M9JyonLAorICAgICAgICAgICAgZGVmYXVsdD1bXSwKKyAgICAgICAgICAgIGRlc3Q9J2VkZF9maWxlcycpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zY2hlbWFzLWRpcicsCisgICAgICAgICAgICBoZWxwPSJEaXJlY3Rvcnkgb2YgcGFyYW1ldGVyLWZyYW1ld29yayBYTUwgU2NoZW1hcyBmb3IgZ2VuZXJhdGlvbiBcCisgICAgICAgIHZhbGlkYXRpb24iLAorICAgICAgICAgICAgZGVmYXVsdD1Ob25lKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdGFyZ2V0LXNjaGVtYXMtZGlyJywKKyAgICAgICAgICAgIGhlbHA9Iklnbm9yZWQuIEtlcHQgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkiKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmFsaWRhdGUnLAorICAgICAgICAgICAgaGVscD0iVmFsaWRhdGUgdGhlIHNldHRpbmdzIGFnYWluc3QgWE1MIHNjaGVtYXMiLAorICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLAorICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJykKKworICAgIHJldHVybiBhcmdwYXJzZXIucGFyc2VfYXJncygpCisKKyMKKyMgUGFyc2VzIGF1ZGlvX2NyaXRlcmlvbl90eXBlcy54bWwgLyBhdWRpb19jcml0ZXJpYS54bWwgZmlsZXMgdXNlZCBhdCBydW4gdGltZSBieSB0aGUKKyMgZW5naW5lY29uZmlndXJhYmxlIGFuZCBvdXRwdXRzIGEgZGljdGlvbm5hcnkgb2YgY3JpdGVyaWEuCisjIEZvciBlYWNoIGNyaXRlcmlhLCB0aGUgbmFtZSwgdHlwZSAoYWthIGluY2x1c2l2ZSAoYml0ZmllbGQpIG9yIGV4Y2x1c2l2ZSAoZW51bSksIHRoZSB2YWx1ZXMKKyMgYXJlIHByb3ZpZGVkLgorIworZGVmIHBhcnNlQ3JpdGVyaWFBbmRDcml0ZXJpb25UeXBlcyhjcml0ZXJpYUZpbGUsIGNyaXRlcmlvblR5cGVzRmlsZSk6CisgICAgIyBQYXJzZSBjcml0ZXJpYSBhbmQgY3JpdGVyaW9uIHR5cGVzIFhNTCBmaWxlcworICAgICMKKyAgICBjcml0ZXJpYV90cmVlID0gRVQucGFyc2UoY3JpdGVyaWFGaWxlKQorICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlhRmlsZSB7fSIuZm9ybWF0KGNyaXRlcmlhRmlsZSkpCisgICAgY3JpdGVyaW9uX3R5cGVzX3RyZWUgPSBFVC5wYXJzZShjcml0ZXJpb25UeXBlc0ZpbGUpCisgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uVHlwZXNGaWxlIHt9Ii5mb3JtYXQoY3JpdGVyaW9uVHlwZXNGaWxlKSkKKworICAgIGNyaXRlcmlhX3Jvb3QgPSBjcml0ZXJpYV90cmVlLmdldHJvb3QoKQorICAgIGNyaXRlcmlvbl90eXBlc19yb290ID0gY3JpdGVyaW9uX3R5cGVzX3RyZWUuZ2V0cm9vdCgpCisKKyAgICBhbGxfY3JpdGVyaWEgPSBbXQorICAgIGZvciBjcml0ZXJpb24gaW4gY3JpdGVyaWFfcm9vdC5maW5kYWxsKCdjcml0ZXJpb24nKToKKyAgICAgICAgY3JpdGVyaW9uX25hbWUgPSBjcml0ZXJpb24uZ2V0KCduYW1lJykKKyAgICAgICAgdHlwZV9uYW1lID0gY3JpdGVyaW9uLmdldCgndHlwZScpCisgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvbl9uYW1lIHt9Ii5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyB0eXBlX25hbWUge30iLmZvcm1hdCh0eXBlX25hbWUpKQorCisgICAgICAgIGZvciBjcml0ZXJpb25fdHlwZXMgaW4gY3JpdGVyaW9uX3R5cGVzX3RyZWUuZmluZGFsbCgnY3JpdGVyaW9uX3R5cGUnKToKKyAgICAgICAgICAgIGNyaXRlcmlvbl90eXBlX25hbWUgPSBjcml0ZXJpb25fdHlwZXMuZ2V0KCduYW1lJykKKyAgICAgICAgICAgIGlmIGNyaXRlcmlvbl90eXBlX25hbWUgPT0gdHlwZV9uYW1lOgorICAgICAgICAgICAgICAgIGNyaXRlcmlvbl9pbmNsdXNpdmVuZXNzID0gY3JpdGVyaW9uX3R5cGVzLmdldCgndHlwZScpCisKKyAgICAgICAgICAgICAgICBjcml0ZXJpb25fdmFsdWVzID0gW10KKworICAgICAgICAgICAgICAgIHZhbHVlc19ub2RlID0gY3JpdGVyaW9uX3R5cGVzLmZpbmQoJ3ZhbHVlcycpCisgICAgICAgICAgICAgICAgaWYgdmFsdWVzX25vZGU6CisgICAgICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXNfbm9kZS5maW5kYWxsKCd2YWx1ZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX3ZhbHVlcy5hcHBlbmQodmFsdWUuZ2V0KCdsaXRlcmFsJykpCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oY3JpdGVyaW9uX3ZhbHVlcykgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX3ZhbHVlcy5hcHBlbmQoJycpCisKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpb25fdHlwZV9uYW1lIHt9Ii5mb3JtYXQoY3JpdGVyaW9uX3R5cGVfbmFtZSkpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uX2luY2x1c2l2ZW5lc3Mge30iLmZvcm1hdChjcml0ZXJpb25faW5jbHVzaXZlbmVzcykpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uX3ZhbHVlcyB7fSIuZm9ybWF0KGNyaXRlcmlvbl92YWx1ZXMpKQorCisgICAgICAgICAgICAgICAgYWxsX2NyaXRlcmlhLmFwcGVuZCh7CisgICAgICAgICAgICAgICAgICAgICJuYW1lIiA6IGNyaXRlcmlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAiaW5jbHVzaXZlIiA6IGNyaXRlcmlvbl9pbmNsdXNpdmVuZXNzLAorICAgICAgICAgICAgICAgICAgICAidmFsdWVzIiA6IGNyaXRlcmlvbl92YWx1ZXN9KQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICByZXR1cm4gYWxsX2NyaXRlcmlhCisKKyMKKyMgUGFyc2VzIHRoZSBFZGQgZmlsZXMgKGFrYSAucGZ3IGV4dGVuc2lvbiBmaWxlKSwgd2hpY2ggaXMgYSBzaW1wbGlmaWVkIGxhbmd1YWdlIHRvIHdyaXRlIHRoZQorIyBwYXJhbWV0ZXIgZnJhbWV3b3JrIHNldHRpbmdzLgorIworZGVmIHBhcnNlRWRkKEVEREZpbGVzKToKKyAgICBwYXJzZWRfZWRkcyA9IFtdCisKKyAgICBmb3IgZWRkX2ZpbGUgaW4gRURERmlsZXM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJvb3QgPSBFZGRQYXJzZXIuUGFyc2VyKCkucGFyc2UoZWRkX2ZpbGUpCisgICAgICAgIGV4Y2VwdCBFZGRQYXJzZXIuTXlTeW50YXhFcnJvciBhcyBleDoKKyAgICAgICAgICAgIGxvZ2dpbmcuY3JpdGljYWwoc3RyKGV4KSkKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiRVhJVCBPTiBGQUlMVVJFIikKKyAgICAgICAgICAgIGV4aXQoMikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByb290LnByb3BhZ2F0ZSgpCisgICAgICAgIGV4Y2VwdCBFZGRQYXJzZXIuTXlQcm9wYWdhdGlvbkVycm9yLCBleCA6CisgICAgICAgICAgICBsb2dnaW5nLmNyaXRpY2FsKHN0cihleCkpCisgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkVYSVQgT04gRkFJTFVSRSIpCisgICAgICAgICAgICBleGl0KDEpCisKKyAgICAgICAgcGFyc2VkX2VkZHMuYXBwZW5kKChlZGRfZmlsZS5uYW1lLCByb290KSkKKyAgICByZXR1cm4gcGFyc2VkX2VkZHMKKworIworIyBHZW5lcmF0ZXMgYWxsIHRoZSByZXF1aXJlZCBjb21tYW5kcyB0byBiZSBzZW50IHRvIHRoZSBpbnN0YW5jZSBvZiBwYXJhbWV0ZXItZnJhbWV3b3JrIGxhdW5jaGVkCisjIGF0IHJ1bnRpbWUgdG8gZ2VuZXJhdGUgdGhlIFhNTCBTZXR0aW5ncyBmaWxlLgorIyBJdCB0YWtlcyBhcyBpbnB1dCB0aGUgY29sbGVjdGlvbiBvZiBjcml0ZXJpYSwgdGhlIGRvbWFpbnMgYW5kIHRoZSBzaW1wbGlmaWVkIHNldHRpbmdzIHJlYWQgZnJvbQorIyBwZncuCisjCitkZWYgZ2VuZXJhdGVEb21haW5Db21tYW5kcyhsb2dnaW5nLCBhbGxfY3JpdGVyaWEsIGluaXRpYWxfc2V0dGluZ3MsIHhtbF9kb21haW5fZmlsZXMsIHBhcnNlZF9lZGRzKToKKyAgICAgICAgIyBjcmVhdGUgYW5kIGluamVjdCBhbGwgdGhlIGNyaXRlcmlhCisgICAgICAgIGxvZ2dpbmcuaW5mbygiQ3JlYXRpbmcgYWxsIGNyaXRlcmlhIikKKyAgICAgICAgZm9yIGNyaXRlcmlvbiBpbiBhbGxfY3JpdGVyaWE6CisgICAgICAgICAgICB5aWVsZCBbImNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvbiIsIGNyaXRlcmlvblsnaW5jbHVzaXZlJ10sCisgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uWyduYW1lJ11dICsgY3JpdGVyaW9uWyd2YWx1ZXMnXQorCisgICAgICAgIHlpZWxkIFsic3RhcnQiXQorCisgICAgICAgICMgSW1wb3J0IGluaXRpYWwgc2V0dGluZ3MgZmlsZQorICAgICAgICBpZiBpbml0aWFsX3NldHRpbmdzOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgaW5pdGlhbCBzZXR0aW5ncyBmaWxlIHt9Ii5mb3JtYXQoaW5pdGlhbF9zZXR0aW5ncykpCisgICAgICAgICAgICB5aWVsZCBbImltcG9ydERvbWFpbnNXaXRoU2V0dGluZ3NYTUwiLCBpbml0aWFsX3NldHRpbmdzXQorCisgICAgICAgICMgSW1wb3J0IGVhY2ggc3RhbmRhbG9uZSBkb21haW4gZmlsZXMKKyAgICAgICAgZm9yIGRvbWFpbl9maWxlIGluIHhtbF9kb21haW5fZmlsZXM6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBzaW5nbGUgZG9tYWluIGZpbGUge30iLmZvcm1hdChkb21haW5fZmlsZSkpCisgICAgICAgICAgICB5aWVsZCBbImltcG9ydERvbWFpbldpdGhTZXR0aW5nc1hNTCIsIGRvbWFpbl9maWxlXQorCisgICAgICAgICMgR2VuZXJhdGUgdGhlIHNjcmlwdCBmb3IgZWFjaCBFREQgZmlsZQorICAgICAgICBmb3IgZmlsZW5hbWUsIHBhcnNlZF9lZGQgaW4gcGFyc2VkX2VkZHM6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlRyYW5zbGF0aW5nIGFuZCBpbmplY3RpbmcgRUREIGZpbGUge30iLmZvcm1hdChmaWxlbmFtZSkpCisgICAgICAgICAgICB0cmFuc2xhdG9yID0gUGZ3U2NyaXB0VHJhbnNsYXRvcigpCisgICAgICAgICAgICBwYXJzZWRfZWRkLnRyYW5zbGF0ZSh0cmFuc2xhdG9yKQorICAgICAgICAgICAgZm9yIGNvbW1hbmQgaW4gdHJhbnNsYXRvci5nZXRTY3JpcHQoKToKKyAgICAgICAgICAgICAgICB5aWVsZCBjb21tYW5kCisKKyMKKyMgRW50cnkgcG9pbnQgb2YgdGhlIGRvbWFpbiBnZW5lcmF0b3IuCisjICAgICAgIC1QYXJzZXMgQ3JpdGVyaW9uIHR5cGVzIGFuZCBjcml0ZXJpYSBmaWxlcworIyAgICAgICAtUGFyc2VzIHNldHRpbmdzIHdyaXR0ZW4gaW4gc2ltcGxpZmllZCBwZncgbGFuZ3VhZ2UuCisjICAgICAgIC1MYXVuY2hlcyBhIHBhcmFtZXRlci1mcmFtZXdvcmsKKyMgICAgICAgLVRyYW5zbGF0ZXMgdGhlIHNldHRpbmdzIGludG8gY29tbWFuZCB0aGF0IGNhbiBiZSBpbnRlcnByZXRlZCBieSBwYXJhbWV0ZXItZnJhbWV3b3JrLgorIyAgICAgICAtVXNlIHRoZSBleHBvcnRzIGNvbW1hbmQgYW5kIG91dHB1dCB0aGVtIGluIFhNTCBTZXR0aW5ncyBmaWxlLgorIworZGVmIG1haW4oKToKKyAgICBsb2dnaW5nLnJvb3Quc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgIGFyZ3MgPSBwYXJzZUFyZ3MoKQorCisgICAgYWxsX2NyaXRlcmlhID0gcGFyc2VDcml0ZXJpYUFuZENyaXRlcmlvblR5cGVzKGFyZ3MuY3JpdGVyaWEsIGFyZ3MuY3JpdGVyaW9udHlwZXMpCisKKyAgICAjCisgICAgIyBFREQgZmlsZXMgKGFrYSAiLnBmdyIgZmlsZXMpCisgICAgIworICAgIHBhcnNlZF9lZGRzID0gcGFyc2VFZGQoYXJncy5lZGRfZmlsZXMpCisKKyAgICAjIFdlIG5lZWQgdG8gbW9kaWZ5IHRoZSB0b3BsZXZlbCBjb25maWd1cmF0aW9uIGZpbGUgdG8gYWNjb3VudCBmb3IgZGlmZmVyZW5jZXMKKyAgICAjIGJldHdlZW4gZGV2ZWxvcG1lbnQgc2V0dXAgYW5kIHRhcmdldCAoaW5zdGFsbGF0aW9uKSBzZXR1cCwgaW4gcGFydGljdWxhciwgdGhlCisgICAgIyBUdW5pbmdNd2l0aCBvZGUgbXVzdCBiZSBlbmZvcmNlZCwgcmVnYXJkbGVzcyBvZiB3aGF0IHdpbGwgYmUgYWxsb3dlZCBvbiB0aGUgdGFyZ2V0CisgICAgZmFrZV90b3BsZXZlbF9jb25maWcgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUobW9kZT0ndycsIGRlbGV0ZT1GYWxzZSwgc3VmZml4PSIueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9IlRNUGRvbWFpbkdlbmVyYXRvclBGQ29uZmlnXyIpCisKKyAgICBpbnN0YWxsX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChhcmdzLnRvcGxldmVsX2NvbmZpZykpCisgICAgaG9zdENvbmZpZy5jb25maWd1cmUoCisgICAgICAgICAgICBpbmZpbGU9YXJncy50b3BsZXZlbF9jb25maWcsCisgICAgICAgICAgICBvdXRmaWxlPWZha2VfdG9wbGV2ZWxfY29uZmlnLAorICAgICAgICAgICAgc3RydWN0UGF0aD1pbnN0YWxsX3BhdGgpCisgICAgZmFrZV90b3BsZXZlbF9jb25maWcuY2xvc2UoKQorCisgICAgIyBDcmVhdGUgdGhlIGNvbm5lY3Rvci4gUGlwZSBpdHMgaW5wdXQgdG8gdXMgaW4gb3JkZXIgdG8gd3JpdGUgY29tbWFuZHM7CisgICAgIyBjb25uZWN0IGl0cyBvdXRwdXQgdG8gc3Rkb3V0IGluIG9yZGVyIHRvIGhhdmUgaXQgZHVtcCB0aGUgZG9tYWlucworICAgICMgdGhlcmU7IGNvbm5lY3QgaXRzIGVycm9yIG91dHB1dCB0byBzdGRlcnIuCisgICAgY29ubmVjdG9yID0gc3VicHJvY2Vzcy5Qb3BlbihbImRvbWFpbkdlbmVyYXRvckNvbm5lY3RvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFrZV90b3BsZXZlbF9jb25maWcubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyYm9zZScgaWYgYXJncy52ZXJib3NlIGVsc2UgJ25vLXZlcmJvc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWxpZGF0ZScgaWYgYXJncy52YWxpZGF0ZSBlbHNlICduby12YWxpZGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zY2hlbWFzX2Rpcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3lzLnN0ZG91dCwgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3lzLnN0ZGVycikKKworICAgIGluaXRpYWxfc2V0dGluZ3MgPSBOb25lCisgICAgaWYgYXJncy5pbml0aWFsX3NldHRpbmdzOgorICAgICAgICBpbml0aWFsX3NldHRpbmdzID0gb3MucGF0aC5yZWFscGF0aChhcmdzLmluaXRpYWxfc2V0dGluZ3MpCisKKyAgICBmb3IgY29tbWFuZCBpbiBnZW5lcmF0ZURvbWFpbkNvbW1hbmRzKGxvZ2dpbmcsIGFsbF9jcml0ZXJpYSwgaW5pdGlhbF9zZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MueG1sX2RvbWFpbl9maWxlcywgcGFyc2VkX2VkZHMpOgorICAgICAgICBjb25uZWN0b3Iuc3RkaW4ud3JpdGUoJ1wwJy5qb2luKGNvbW1hbmQpKQorICAgICAgICBjb25uZWN0b3Iuc3RkaW4ud3JpdGUoIlxuIikKKworICAgICMgQ2xvc2luZyB0aGUgY29ubmVjdG9yJ3MgaW5wdXQgdHJpZ2dlcnMgdGhlIGRvbWFpbiBnZW5lcmF0aW9uCisgICAgY29ubmVjdG9yLnN0ZGluLmNsb3NlKCkKKyAgICBjb25uZWN0b3Iud2FpdCgpCisgICAgb3MucmVtb3ZlKGZha2VfdG9wbGV2ZWxfY29uZmlnLm5hbWUpCisgICAgcmV0dXJuIGNvbm5lY3Rvci5yZXR1cm5jb2RlCisKKyMgSWYgdGhpcyBmaWxlIGlzIGRpcmVjdGx5IGV4ZWN1dGVkCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL3Byb3Zpc2lvbl9jcml0ZXJpb25fdHlwZXNfZnJvbV9hbmRyb2lkX2hlYWRlcnMubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvcHJvdmlzaW9uX2NyaXRlcmlvbl90eXBlc19mcm9tX2FuZHJvaWRfaGVhZGVycy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWJkZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL3Byb3Zpc2lvbl9jcml0ZXJpb25fdHlwZXNfZnJvbV9hbmRyb2lkX2hlYWRlcnMubWsKQEAgLTAsMCArMSwyMyBAQAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5taworCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoQ1JJVEVSSU9OX1RZUEVTX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0FORFJPSURfQVVESU9fQkFTRV9IRUFERVJfRklMRSA6PSAkKEFORFJPSURfQVVESU9fQkFTRV9IRUFERVJfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfQVVESU9fUE9MSUNZX0NPTkZJR1VSQVRJT05fRklMRSA6PSAkKEFVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0NSSVRFUklPTl9UT09MIDo9ICQoSE9TVF9PVVQpL2Jpbi9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUkVRVUlSRURfTU9EVUxFUykgJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykgXAorICAgICQoQ1JJVEVSSU9OX1RZUEVTX0ZJTEUpIFwKKyAgICAkKEFORFJPSURfQVVESU9fQkFTRV9IRUFERVJfRklMRSkKKworCSIkKE1ZX0NSSVRFUklPTl9UT09MKSIgXAorCQktLWFuZHJvaWRhdWRpb2Jhc2VoZWFkZXIgIiQoTVlfQU5EUk9JRF9BVURJT19CQVNFX0hFQURFUl9GSUxFKSIgXAorCQktLWF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUgIiQoTVlfQVVESU9fUE9MSUNZX0NPTkZJR1VSQVRJT05fRklMRSkiIFwKKwkJLS1jcml0ZXJpb250eXBlcyAiJChNWV9DUklURVJJT05fVFlQRVNfRklMRSkiIFwKKwkJLS1vdXRwdXRmaWxlICIkKEApIgorCisjIENsZWFyIHZhcmlhYmxlcyBmb3IgZnVydGhlciB1c2UKK0NSSVRFUklPTl9UWVBFU19GSUxFIDo9CitBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUgOj0KK0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9wcm92aXNpb25fc3RyYXRlZ2llc19zdHJ1Y3R1cmUubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvcHJvdmlzaW9uX3N0cmF0ZWdpZXNfc3RydWN0dXJlLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzkzOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvcHJvdmlzaW9uX3N0cmF0ZWdpZXNfc3RydWN0dXJlLm1rCkBAIC0wLDAgKzEsMjEgQEAKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKKworJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9TVFJBVEVHSUVTX1NUUlVDVFVSRV9GSUxFIDo9ICQoU1RSQVRFR0lFU19TVFJVQ1RVUkVfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfQVVESU9fUE9MSUNZX0VOR0lORV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0gJChBVURJT19QT0xJQ1lfRU5HSU5FX0NPTkZJR1VSQVRJT05fRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfUFJPVklTSU9OX1RPT0wgOj0gJChIT1NUX09VVCkvYmluL2J1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9SRVFVSVJFRF9NT0RVTEVTKSAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKSBcCisgICAgYnVpbGRTdHJhdGVnaWVzU3RydWN0dXJlRmlsZS5weSBcCisgICAgJChTVFJBVEVHSUVTX1NUUlVDVFVSRV9GSUxFKSBcCisgICAgJChBVURJT19QT0xJQ1lfRU5HSU5FX0NPTkZJR1VSQVRJT05fRklMRSkKKworCSIkKE1ZX1BST1ZJU0lPTl9UT09MKSIgXAorCQktLWF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhdGlvbmZpbGUgIiQoTVlfQVVESU9fUE9MSUNZX0VOR0lORV9DT05GSUdVUkFUSU9OX0ZJTEUpIiBcCisJCS0tcHJvZHVjdHN0cmF0ZWdpZXNzdHJ1Y3R1cmVmaWxlICIkKE1ZX1NUUkFURUdJRVNfU1RSVUNUVVJFX0ZJTEUpIiBcCisJCS0tb3V0cHV0ZmlsZSAiJChAKSIKKworIyBDbGVhciB2YXJpYWJsZXMgZm9yIGZ1cnRoZXIgdXNlCitTVFJBVEVHSUVTX1NUUlVDVFVSRV9GSUxFIDo9CitBVURJT19QT0xJQ1lfRU5HSU5FX0NPTkZJR1VSQVRJT05fRklMRSA6PQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKaW5kZXggMzZlMGY0Mi4uYzdkOGQzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCkBAIC0xMCwxMyArMTAsMjIgQEAKICAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMvY29udmVydCBcCisgICAgZXh0ZXJuYWwvbGlieG1sMi9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbgogCi1MT0NBTF9TUkNfRklMRVM6PSBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGlicGFyYW1ldGVyIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYnhtbDIKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCiAKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKQEAgLTI4LDE1ICszNywzIEBACiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENPTkZJR1VSQVRJT04gRklMRQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgc3BlY2lmaWMgbWFuYWdlbWVudCBvZiBhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKQotTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbmZpZy8kKExPQ0FMX01PRFVMRSkKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAppbmRleCA5YjA0NDJlLi40YjU3NDQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCkBAIC0xOCw3ICsxOCw2IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlICJQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oIgotI2luY2x1ZGUgImF1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgiCiAjaW5jbHVkZSA8UGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IuaD4KICNpbmNsdWRlIDxTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8U2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlLmg+CkBAIC01NiwxNSArNTUsMzcgQEAKICAgICB9CiB9OwogCi1uYW1lc3BhY2UgYW5kcm9pZAoteworbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyB1dGlsaXRpZXM6OmNvbnZlcnRUbzsKIAotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKIGNvbnN0IGNoYXIgKmNvbnN0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjptUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZSA9CiAgICAgIi9ldGMvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbCI7Citjb25zdCBjaGFyICpjb25zdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bVBvbGljeVBmd1ZlbmRvckNvbmZGaWxlTmFtZSA9CisgICAgIi92ZW5kb3IvZXRjL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwiOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ0lucHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSA9ICJBdmFpbGFibGVJbnB1dERldmljZXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdPdXRwdXREZXZpY2VDcml0ZXJpb25OYW1lID0gIkF2YWlsYWJsZU91dHB1dERldmljZXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdQaG9uZVN0YXRlQ3JpdGVyaW9uTmFtZSA9ICJUZWxlcGhvbnlNb2RlIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnT3V0cHV0RGV2aWNlQWRkcmVzc0NyaXRlcmlvbk5hbWUgPSAiQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ0lucHV0RGV2aWNlQWRkcmVzc0NyaXRlcmlvbk5hbWUgPSAiQXZhaWxhYmxlSW5wdXREZXZpY2VzQWRkcmVzc2VzIjsKKworLyoqCisgKiBPcmRlciBNVVNUIGJlIGFsaWduIHdpdGggZGVmaW50aWlvbiBvZiBhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3Qgd2l0aGluIGF1ZGlvX3BvbGljeS5oCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnRm9yY2VVc2VDcml0ZXJpb25UYWdbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0KK3sKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9ICAgICAgICAiRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gPSAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JNZWRpYSIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9ICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yUmVjb3JkIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9ICAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JEb2NrIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JTeXN0ZW0iLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9ICAgICJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORF0gPSAgICAgIkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkddID0gICAgICAiRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZyIKK307CiAKIHRlbXBsYXRlIDw+CiBzdHJ1Y3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnBhcmFtZXRlck1hbmFnZXJFbGVtZW50U3VwcG9ydGVkPElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+IHt9OwpAQCAtNzUsMTggKzk2LDQzIEBACiAgICAgOiBtUGZ3Q29ubmVjdG9yTG9nZ2VyKG5ldyBQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvckxvZ2dlcikKIHsKICAgICAvLyBDb25uZWN0b3IKLSAgICBtUGZ3Q29ubmVjdG9yID0gbmV3IENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvcihtUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZSk7CisgICAgaWYgKGFjY2VzcyhtUG9saWN5UGZ3VmVuZG9yQ29uZkZpbGVOYW1lLCBSX09LKSA9PSAwKSB7CisgICAgICAgIG1QZndDb25uZWN0b3IgPSBuZXcgQ1BhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yKG1Qb2xpY3lQZndWZW5kb3JDb25mRmlsZU5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1QZndDb25uZWN0b3IgPSBuZXcgQ1BhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yKG1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lKTsKKyAgICB9CiAKICAgICAvLyBMb2dnZXIKICAgICBtUGZ3Q29ubmVjdG9yLT5zZXRMb2dnZXIobVBmd0Nvbm5lY3RvckxvZ2dlcik7Cit9CiAKLSAgICAvLyBMb2FkIGNyaXRlcmlhIGZpbGUKLSAgICBpZiAoKGxvYWRBdWRpb1BvbGljeUNyaXRlcmlhQ29uZmlnKGdBdWRpb1BvbGljeUNyaXRlcmlhVmVuZG9yQ29uZkZpbGVQYXRoKSAhPSBOT19FUlJPUikgJiYKLSAgICAgICAgKGxvYWRBdWRpb1BvbGljeUNyaXRlcmlhQ29uZmlnKGdBdWRpb1BvbGljeUNyaXRlcmlhQ29uZkZpbGVQYXRoKSAhPSBOT19FUlJPUikpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBOZWl0aGVyIHZlbmRvciBjb25mIGZpbGUgKCVzKSBub3Igc3lzdGVtIGNvbmYgZmlsZSAoJXMpIGNvdWxkIGJlIGZvdW5kIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnQXVkaW9Qb2xpY3lDcml0ZXJpYVZlbmRvckNvbmZGaWxlUGF0aCwKLSAgICAgICAgICAgICAgZ0F1ZGlvUG9saWN5Q3JpdGVyaWFDb25mRmlsZVBhdGgpOworc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYm9vbCBpc0luY2x1c2l2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVQYWlycyBwYWlycywgY29uc3Qgc3RkOjpzdHJpbmcgJmRlZmF1bHRWYWx1ZSkKK3sKKyAgICBBTE9HX0FTU0VSVChub3QgaXNTdGFydGVkKCksICJDYW5ub3QgYWRkIGEgY3JpdGVyaW9uIGlmIFBGVyBpcyBhbHJlYWR5IHN0YXJ0ZWQiKTsKKyAgICBhdXRvIGNyaXRlcmlvblR5cGUgPSBtUGZ3Q29ubmVjdG9yLT5jcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb25UeXBlKGlzSW5jbHVzaXZlKTsKKworICAgIGZvciAoYXV0byBwYWlyIDogcGFpcnMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgICAgIEFMT0dWKCIlczogQWRkaW5nIHBhaXIgJWQsJXMgZm9yIGNyaXRlcmlvblR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sIHBhaXIuZmlyc3QsCisgICAgICAgICAgICAgIHBhaXIuc2Vjb25kLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7CisgICAgICAgIGNyaXRlcmlvblR5cGUtPmFkZFZhbHVlUGFpcihwYWlyLmZpcnN0LCBwYWlyLnNlY29uZCwgZXJyb3IpOwogICAgIH0KKyAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaWEuZmluZChuYW1lKSA9PSBtUG9saWN5Q3JpdGVyaWEuZW5kKCksCisgICAgICAgICAgICAgICAgIiVzOiBDcml0ZXJpb24gJXMgYWxyZWFkeSBhZGRlZCIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpKTsKKworICAgIGF1dG8gY3JpdGVyaW9uID0gbVBmd0Nvbm5lY3Rvci0+Y3JlYXRlU2VsZWN0aW9uQ3JpdGVyaW9uKG5hbWUsIGNyaXRlcmlvblR5cGUpOworICAgIG1Qb2xpY3lDcml0ZXJpYVtuYW1lXSA9IGNyaXRlcmlvbjsKKworICAgIGlmIChub3QgZGVmYXVsdFZhbHVlLmVtcHR5KCkpIHsKKyAgICAgICAgaW50IG51bWVyaWNhbFZhbHVlID0gMDsKKyAgICAgICAgaWYgKG5vdCBjcml0ZXJpb25UeXBlLT5nZXROdW1lcmljYWxWYWx1ZShkZWZhdWx0VmFsdWUuY19zdHIoKSwgbnVtZXJpY2FsVmFsdWUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM7IHRyeWluZyB0byBhcHBseSBpbnZhbGlkIGRlZmF1bHQgbGl0ZXJhbCB2YWx1ZSAoJXMpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUobnVtZXJpY2FsVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjp+UGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKQpAQCAtMTEyLDExMiArMTU4LDYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6YWRkQ3JpdGVyaW9uVHlwZShjb25zdCBzdHJpbmcgJnR5cGVOYW1lLCBib29sIGlzSW5jbHVzaXZlKQotewotICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5maW5kKHR5cGVOYW1lKSA9PSBtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIkNyaXRlcmlvblR5cGUgJXMgYWxyZWFkeSBhZGRlZCIsIHR5cGVOYW1lLmNfc3RyKCkpOwotICAgIEFMT0dEKCIlczogQWRkaW5nIG5ldyBjcml0ZXJpb25UeXBlICVzIiwgX19GVU5DVElPTl9fLCB0eXBlTmFtZS5jX3N0cigpKTsKLQotICAgIG1Qb2xpY3lDcml0ZXJpb25UeXBlc1t0eXBlTmFtZV0gPSBtUGZ3Q29ubmVjdG9yLT5jcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb25UeXBlKGlzSW5jbHVzaXZlKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6YWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcigKLSAgICBjb25zdCBzdHJpbmcgJnR5cGVOYW1lLAotICAgIHVpbnQzMl90IG51bWVyaWNWYWx1ZSwKLSAgICBjb25zdCBzdHJpbmcgJmxpdGVyYWxWYWx1ZSkKLXsKLSAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZmluZCh0eXBlTmFtZSkgIT0gbVBvbGljeUNyaXRlcmlvblR5cGVzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICJDcml0ZXJpb25UeXBlICVzIG5vdCBmb3VuZCIsIHR5cGVOYW1lLmNfc3RyKCkpOwotICAgIEFMT0dWKCIlczogQWRkaW5nIG5ldyB2YWx1ZSBwYWlyICglZCwlcykgZm9yIGNyaXRlcmlvblR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgbnVtZXJpY1ZhbHVlLCBsaXRlcmFsVmFsdWUuY19zdHIoKSwgdHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UgKmNyaXRlcmlvblR5cGUgPSBtUG9saWN5Q3JpdGVyaW9uVHlwZXNbdHlwZU5hbWVdOwotICAgIHN0ZDo6c3RyaW5nIGVycm9yOwotICAgIGNyaXRlcmlvblR5cGUtPmFkZFZhbHVlUGFpcihudW1lcmljVmFsdWUsIGxpdGVyYWxWYWx1ZSwgZXJyb3IpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCwgYm9vbCBpc0luY2x1c2l2ZSkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICBmb3IgKG5vZGUgPSByb290LT5maXJzdF9jaGlsZDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgewotCi0gICAgICAgIEFMT0dfQVNTRVJUKG5vZGUgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgICAgICBjb25zdCBjaGFyICp0eXBlTmFtZSA9IG5vZGUtPm5hbWU7Ci0gICAgICAgIGNoYXIgKnZhbHVlTmFtZXMgPSBzdHJuZHVwKG5vZGUtPnZhbHVlLCBzdHJsZW4obm9kZS0+dmFsdWUpKTsKLQotICAgICAgICBhZGRDcml0ZXJpb25UeXBlKHR5cGVOYW1lLCBpc0luY2x1c2l2ZSk7Ci0KLSAgICAgICAgdWludDMyX3QgaW5kZXggPSAwOwotICAgICAgICBjaGFyICpjdHg7Ci0gICAgICAgIGNoYXIgKnZhbHVlTmFtZSA9IHN0cnRva19yKHZhbHVlTmFtZXMsICIsIiwgJmN0eCk7Ci0gICAgICAgIHdoaWxlICh2YWx1ZU5hbWUgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHN0cmxlbih2YWx1ZU5hbWUpICE9IDApIHsKLQotICAgICAgICAgICAgICAgIC8vIENvbmYgZmlsZSBtYXkgdXNlIG9yIG5vdCBwYWlyLCBpZiBubyBwYWlyLCB1c2UgaW5jcmVtZW50YWwgaW5kZXgsIGVsc2UKLSAgICAgICAgICAgICAgICAvLyB1c2UgcHJvdmlkZWQgaW5kZXguCi0gICAgICAgICAgICAgICAgaWYgKHN0cmNocih2YWx1ZU5hbWUsICc6JykgIT0gTlVMTCkgewotCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgKmZpcnN0ID0gc3RydG9rKHZhbHVlTmFtZSwgIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqc2Vjb25kID0gc3RydG9rKE5VTEwsICI6Iik7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKChmaXJzdCAhPSBOVUxMKSAmJiAoc3RybGVuKGZpcnN0KSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vjb25kICE9IE5VTEwpICYmIChzdHJsZW4oc2Vjb25kKSAhPSAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdmFsdWUgcGFpciIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydFRvPHN0cmluZywgdWludDMyX3Q+KGZpcnN0LCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbmRleCglcykgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKHR5cGVOYW1lLCBpbmRleCwgc2Vjb25kKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBmd0luZGV4ID0gaXNJbmNsdXNpdmUgPyAxIDw8IGluZGV4IDogaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIodHlwZU5hbWUsIHBmd0luZGV4LCB2YWx1ZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlTmFtZSA9IHN0cnRva19yKE5VTEwsICIsIiwgJmN0eCk7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZSh2YWx1ZU5hbWVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRJbmNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ0luY2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcuY19zdHIoKSk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvYWRDcml0ZXJpb25UeXBlKG5vZGUsIHRydWUpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdFeGNsdXNpdmVDcml0ZXJpb25UeXBlVGFnLmNfc3RyKCkpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2FkQ3JpdGVyaW9uVHlwZShub2RlLCBmYWxzZSk7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnBhcnNlQ2hpbGRyZW4oY25vZGUgKnJvb3QsIHN0cmluZyAmZGVmYXVsdFZhbHVlLCBzdHJpbmcgJnR5cGUpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgZm9yIChub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IG5vZGUtPm5leHQpIHsKLSAgICAgICAgQUxPR19BU1NFUlQobm9kZSAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0KLSAgICAgICAgaWYgKHN0cmluZyhub2RlLT5uYW1lKSA9PSBnRGVmYXVsdFRhZykgewotICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gbm9kZS0+dmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nKG5vZGUtPm5hbWUpID09IGdUeXBlVGFnKSB7Ci0gICAgICAgICAgICB0eXBlID0gbm9kZS0+dmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgQUxPR0UoIiVzOiBVbnJlY29nbml6ZWQgJXMgJXMgbm9kZSIsIF9fRlVOQ1RJT05fXywgbm9kZS0+bmFtZSwgbm9kZS0+dmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotfQotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIFQgKlBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpnZXRFbGVtZW50KGNvbnN0IHN0cmluZyAmbmFtZSwgc3RkOjptYXA8c3RyaW5nLCBUICo+ICZlbGVtZW50c01hcCkKIHsKQEAgLTIzNiw5NyArMTc2LDYgQEAKICAgICByZXR1cm4gaXQgIT0gZWxlbWVudHNNYXAuZW5kKCkgPyBpdC0+c2Vjb25kIDogTlVMTDsKIH0KIAotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENyaXRlcmlhKGNub2RlICpyb290KQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ0NyaXRlcmlvblRhZy5jX3N0cigpKTsKLQotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIiVzOiBubyBpbmNsdXNpdmUgY3JpdGVyaWEgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAobm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7Ci0gICAgICAgIGxvYWRDcml0ZXJpb24obm9kZSk7Ci0gICAgfQotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb24oY29uc3Qgc3RyaW5nICZuYW1lLCBjb25zdCBzdHJpbmcgJnR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nICZkZWZhdWx0TGl0ZXJhbFZhbHVlKQotewotICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpYS5maW5kKG5hbWUpID09IG1Qb2xpY3lDcml0ZXJpYS5lbmQoKSwKLSAgICAgICAgICAgICAgICAiUm91dGUgQ3JpdGVyaW9uICVzIGFscmVhZHkgYWRkZWQiLCBuYW1lLmNfc3RyKCkpOwotCi0gICAgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UgKmNyaXRlcmlvblR5cGUgPQotICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZT4odHlwZU5hbWUsIG1Qb2xpY3lDcml0ZXJpb25UeXBlcyk7Ci0KLSAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQotICAgICAgICAgICAgbVBmd0Nvbm5lY3Rvci0+Y3JlYXRlU2VsZWN0aW9uQ3JpdGVyaW9uKG5hbWUsIGNyaXRlcmlvblR5cGUpOwotCi0gICAgbVBvbGljeUNyaXRlcmlhW25hbWVdID0gY3JpdGVyaW9uOwotICAgIGludCBudW1lcmljYWxWYWx1ZSA9IDA7Ci0gICAgaWYgKCFjcml0ZXJpb25UeXBlLT5nZXROdW1lcmljYWxWYWx1ZShkZWZhdWx0TGl0ZXJhbFZhbHVlLmNfc3RyKCksICBudW1lcmljYWxWYWx1ZSkpIHsKLSAgICAgICAgQUxPR0UoIiVzOyB0cnlpbmcgdG8gYXBwbHkgaW52YWxpZCBkZWZhdWx0IGxpdGVyYWwgdmFsdWUgKCVzKSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgZGVmYXVsdExpdGVyYWxWYWx1ZS5jX3N0cigpKTsKLSAgICB9Ci0gICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShudW1lcmljYWxWYWx1ZSk7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDcml0ZXJpb24oY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY29uc3QgY2hhciAqY3JpdGVyaW9uTmFtZSA9IHJvb3QtPm5hbWU7Ci0KLSAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaWEuZmluZChjcml0ZXJpb25OYW1lKSA9PSBtUG9saWN5Q3JpdGVyaWEuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIkNyaXRlcmlvbiAlcyBhbHJlYWR5IGFkZGVkIiwgY3JpdGVyaW9uTmFtZSk7Ci0KLSAgICBzdHJpbmcgcGFyYW1LZXlOYW1lID0gIiI7Ci0gICAgc3RyaW5nIHBhdGggPSAiIjsKLSAgICBzdHJpbmcgdHlwZU5hbWUgPSAiIjsKLSAgICBzdHJpbmcgZGVmYXVsdFZhbHVlID0gIiI7Ci0KLSAgICBwYXJzZUNoaWxkcmVuKHJvb3QsIGRlZmF1bHRWYWx1ZSwgdHlwZU5hbWUpOwotCi0gICAgYWRkQ3JpdGVyaW9uKGNyaXRlcmlvbk5hbWUsIHR5cGVOYW1lLCBkZWZhdWx0VmFsdWUpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ29uZmlnKGNub2RlICpyb290KQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ1BvbGljeUNvbmZUYWcuY19zdHIoKSk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCBmaW5kIG5vZGUgZm9yIHBmdyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQUxPR0QoIiVzOiBMb2FkaW5nIGNvbmYgZm9yIHBmdyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgbG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUobm9kZSk7Ci0gICAgbG9hZEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUobm9kZSk7Ci0gICAgbG9hZENyaXRlcmlhKG5vZGUpOwotfQotCi0KLXN0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhjb25zdCBjaGFyICpwYXRoKQotewotICAgIEFMT0dfQVNTRVJUKHBhdGggIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZTogZW1wdHkgcGF0aCIpOwotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0gICAgQUxPR0QoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGEgY29uZmlndXJhdGlvbiBub2RlIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0KLSAgICBsb2FkQ29uZmlnKHJvb3QpOwotCi0gICAgY29uZmlnX2ZyZWUocm9vdCk7Ci0gICAgZnJlZShyb290KTsKLSAgICBmcmVlKGRhdGEpOwotICAgIEFMT0dEKCIlczogbG9hZGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIGJvb2wgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmlzU3RhcnRlZCgpCiB7CiAgICAgcmV0dXJuIG1QZndDb25uZWN0b3IgJiYgbVBmd0Nvbm5lY3Rvci0+aXNTdGFydGVkKCk7CkBAIC0zMzUsOSArMTg0LDkgQEAKIHN0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQogewogICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9Ci0gICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdQaG9uZVN0YXRlQ3JpdGVyaW9uVGFnLCBtUG9saWN5Q3JpdGVyaWEpOworICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnUGhvbmVTdGF0ZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKCFpc1ZhbHVlVmFsaWRGb3JDcml0ZXJpb24oY3JpdGVyaW9uLCBzdGF0aWNfY2FzdDxpbnQ+KG1vZGUpKSkgewpAQCAtMzUxLDkgKzIwMCw5IEBACiBhdWRpb19tb2RlX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmdldFBob25lU3RhdGUoKSBjb25zdAogewogICAgIGNvbnN0IElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9Ci0gICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdQaG9uZVN0YXRlQ3JpdGVyaW9uVGFnLCBtUG9saWN5Q3JpdGVyaWEpOworICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnUGhvbmVTdGF0ZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfTk9STUFMOwogICAgIH0KICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fbW9kZV90Pihjcml0ZXJpb24tPmdldENyaXRlcmlvblN0YXRlKCkpOwpAQCAtMzcwLDcgKzIxOSw3IEBACiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KICAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoIWlzVmFsdWVWYWxpZEZvckNyaXRlcmlvbihjcml0ZXJpb24sIHN0YXRpY19jYXN0PGludD4oY29uZmlnKSkpIHsKQEAgLTM5MCw3ICsyMzksNyBAQAogICAgIGNvbnN0IElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9CiAgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0sIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdKTsKICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOwogICAgIH0KICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdD4oY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25TdGF0ZSgpKTsKQEAgLTQwNCwxMiArMjUzLDQ1IEBACiAgICAgcmV0dXJuIGludGVyZmFjZS0+Z2V0TGl0ZXJhbFZhbHVlKHZhbHVlVG9DaGVjaywgbGl0ZXJhbFZhbHVlKTsKIH0KIAorc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCit7CisgICAgc3RkOjpzdHJpbmcgY3JpdGVyaW9uTmFtZSA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2RGVzYy0+dHlwZSgpKSA/CisgICAgICAgICAgICAgICAgZ091dHB1dERldmljZUFkZHJlc3NDcml0ZXJpb25OYW1lIDogZ0lucHV0RGV2aWNlQWRkcmVzc0NyaXRlcmlvbk5hbWU7CisKKyAgICBBTE9HVigiJXM6IGRldmljZSB3aXRoIGFkZHJlc3MgJXMgJXMiLCBfX0ZVTkNUSU9OX18sIGRldkRlc2MtPmFkZHJlc3MoKS5zdHJpbmcoKSwKKyAgICAgICAgICBzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRT8gImRpc2Nvbm5lY3RlZCIgOiAiY29ubmVjdGVkIik7CisgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oY3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKKworICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGNyaXRlcmlvbk5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBhdXRvIGNyaXRlcmlvblR5cGUgPSBjcml0ZXJpb24tPmdldENyaXRlcmlvblR5cGUoKTsKKyAgICBpbnQgZGV2aWNlQWRkcmVzc0lkOworICAgIGlmIChub3QgY3JpdGVyaW9uVHlwZS0+Z2V0TnVtZXJpY2FsVmFsdWUoZGV2RGVzYy0+YWRkcmVzcygpLnN0cmluZygpLCBkZXZpY2VBZGRyZXNzSWQpKSB7CisgICAgICAgIEFMT0dXKCIlczogdW5rbm93biBkZXZpY2UgYWRkcmVzcyByZXBvcnRlZCAoJXMpIiwgX19GVU5DVElPTl9fLCBkZXZEZXNjLT5hZGRyZXNzKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisgICAgaW50IGN1cnJlbnRWYWx1ZU1hc2sgPSBjcml0ZXJpb24tPmdldENyaXRlcmlvblN0YXRlKCk7CisgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CisgICAgICAgIGN1cnJlbnRWYWx1ZU1hc2sgfD0gZGV2aWNlQWRkcmVzc0lkOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY3VycmVudFZhbHVlTWFzayAmPSB+ZGV2aWNlQWRkcmVzc0lkOworICAgIH0KKyAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKGN1cnJlbnRWYWx1ZU1hc2spOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldEF2YWlsYWJsZUlucHV0RGV2aWNlcyhhdWRpb19kZXZpY2VzX3QgaW5wdXREZXZpY2VzKQogewogICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9Ci0gICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdJbnB1dERldmljZUNyaXRlcmlvblRhZywgbVBvbGljeUNyaXRlcmlhKTsKKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ0lucHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnSW5wdXREZXZpY2VDcml0ZXJpb25UYWcuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0lucHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShpbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTik7CkBAIC00MjAsOSArMzAyLDkgQEAKIHN0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VzKQogewogICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9Ci0gICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdPdXRwdXREZXZpY2VDcml0ZXJpb25UYWcsIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdPdXRwdXREZXZpY2VDcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdPdXRwdXREZXZpY2VDcml0ZXJpb25UYWcuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUob3V0cHV0RGV2aWNlcyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9hdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmZDE3Ni4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9hdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgRGVmaW5pdGlvbnMgZm9yIGF1ZGlvIHBvbGljeSBjcml0ZXJpYSBjb25maWd1cmF0aW9uIGZpbGUgKGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mKSAgIC8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotLy8gICAgICBAVE9ETzogc2NyaXB0ZWQgZnJvbSBhdWRpby5oICYgYXVkaW9fcG9saWN5LGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZGaWxlUGF0aCA9Ci0gICAgIi9zeXN0ZW0vZXRjL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIjsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnQXVkaW9Qb2xpY3lDcml0ZXJpYVZlbmRvckNvbmZGaWxlUGF0aCA9Ci0gICAgIi92ZW5kb3IvZXRjL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIjsKLQotLyoqCi0gKiBQRlcgaW5zdGFuY2VzIHRhZ3MKLSAqLwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnUG9saWN5Q29uZlRhZyA9ICJQb2xpY3kiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnRGVmYXVsdFRhZyA9ICJEZWZhdWx0IjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ1R5cGVUYWcgPSAiVHlwZSI7Ci0KLS8qKgotICogUEZXIGVsZW1lbnRzIHRhZ3MKLSAqLwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZyA9ICJJbmNsdXNpdmVDcml0ZXJpb25UeXBlIjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0V4Y2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcgPSAiRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdDcml0ZXJpb25UYWcgPSAiQ3JpdGVyaW9uIjsKLQotLyoqCi0gKiBQRlcga25vd24gY3JpdGVyaW9uIHRhZ3MKLSAqLwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnSW5wdXREZXZpY2VDcml0ZXJpb25UYWcgPSAiQXZhaWxhYmxlSW5wdXREZXZpY2VzIjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ091dHB1dERldmljZUNyaXRlcmlvblRhZyA9ICJBdmFpbGFibGVPdXRwdXREZXZpY2VzIjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcgPSAiVGVsZXBob255TW9kZSI7Ci0KLS8qKgotICogT3JkZXIgTVVTVCBiZSBhbGlnbiB3aXRoIGRlZmludGlpb24gb2YgYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHdpdGhpbiBhdWRpb19wb2xpY3kuaAotICovCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXSA9Ci17Ci0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gPSAgICAgICAgIkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdID0gICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yTWVkaWEiLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclJlY29yZCIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10gPSAgICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yRG9jayIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9ICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yU3lzdGVtIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPSAgICAiRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8iLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkRdID0gICAgICJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZCIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HXSA9ICAgICAgIkZvcmNlVXNlRm9yVmlicmF0ZVJpbmdpbmciCi19OwotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvY29uZmlnL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvY29uZmlnL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDNkNWE2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2NvbmZpZy9hdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgQE5PVEU6Ci0jIEF1ZGlvIFBvbGljeSBDcml0ZXJpYSBmaWxlIGV4YW1wbGUgZm9yIGdlbmVyaWMgZGV2aWNlIGJ1aWxkCi0jCi0jIEFueSB2ZW5kb3Igc2hhbGwgaGF2ZSBpdHMgb3duIGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBmb2xkZXIKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ3JpdGVyaW9uIHR5cGUgRXhhbXBsZToKLSMgRm9yIGVhY2ggY3JpdGVyaW9uLCBhIGNvdXBsZSBvZiBudW1lcmljYWwsIGxpdGVyYWwgdmFsdWVzIG11c3QgYmUgcHJvdmlkZWQgdG8gdGhlIFBGVy4KLSMgVGhlIG51bWVyaWNhbCBwYXJ0IGlzIG5vdCBtYW5kYXRvcnkuIElmIG5vdCBmaWxsZWQgYnkgdGhlIHVzZXIsIGEgZGVmYXVsdCBudW1lcmljYWwgdmFsdWUgd2lsbCBiZQotIyBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIGJ5IGF1ZGlvIEhBTCB1c2luZyB0aGUgZm9sbG93aW5nIGxvZ2ljOgotIyAgIC0gRXhjbHVzaXZlIGNyaXRlcmlvbjoKLSMgICAgICAgICAgKiAwIC0+IGZpcnN0IGxpdGVyYWwgdmFsdWUsCi0jICAgICAgICAgICogMSAtPiBzZWNvbmQgbGl0ZXJhbCB2YWx1ZSwKLSMgICAgICAgICAgICAgICAuLi4KLSMgICAgICAgICAgKiBOIC0+IChOKzEpdGggbGl0ZXJhbCB2YWx1ZS4KLSMgICAtIEluY2x1c2l2ZSBjcml0ZXJpb246Ci0jICAgICAgICAgICogMSA8PCAwIC0+IGZpcnN0IGxpdGVyYWwgdmFsdWUsCi0jICAgICAgICAgICogMSA8PCAxIC0+IHNlY29uZCBsaXRlcmFsIHZhbHVlLAotIyAgICAgICAgICAgICAgIC4uLgotIyAgICAgICAgICAqIDEgPDwgTiAtPiAoTisxKXRoIGxpdGVyYWwgdmFsdWUsCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUG9saWN5IHsKLSMgICAgSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZXxFeGNsdXNpdmVDcml0ZXJpb25UeXBlIHsKLSMgICAgICAgIDxDcml0ZXJpb24gTmFtZT4gIFtudW1lcmljYWwgdmFsdWUgMTpdPGxpdGVyYWwgdmFsdWUgMT4sW251bWVyaWNhbCB2YWx1ZSAyOl08bGl0ZXJhbCB2YWx1ZSAyPiw8bGl0ZXJhbCB2YWx1ZSAzPiwuLi4KLSMgICAgfQotIyB9Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDcml0ZXJpb246Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUG9saWN5IHsKLSMgICAgQ3JpdGVyaW9uIHsKLSMgICAgICAgIDxDcml0ZXJpb24gTmFtZT4gewotIyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA8Q3JpdGVyaW9uIHR5cGUgbmFtZT4KLSMgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgPGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNyaXRlcmlvbj4KLSMgICAgICAgIH0KLSMgICAgfQotIyB9Ci0KLVBvbGljeSB7Ci0gICAgSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZSB7Ci0gICAgICAgICMKLSAgICAgICAgIyBETyBOT1QgQ0hBTkdFIE9SREVSLiBUaGlzIGRlZmluaXRpb24gbXVzdCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YKLSAgICAgICAgIyBBVURJT19ERVZJQ0VfT1VUXyogd2l0aGluIDxzeXN0ZW0vYXVkaW8uaD4gZmlsZSBvZiBhbmRyb2lkLgotICAgICAgICAjCi0gICAgICAgIE91dHB1dERldmljZXNNYXNrVHlwZSAgIEVhcnBpZWNlLFNwZWFrZXIsV2lyZWRIZWFkc2V0LFdpcmVkSGVhZHBob25lLEJsdWV0b290aFNjbyxCbHVldG9vdGhTY29IZWFkc2V0LEJsdWV0b290aFNjb0NhcmtpdCxCbHVldG9vdGhBMmRwLEJsdWV0b290aEEyZHBIZWFkcGhvbmVzLEJsdWV0b290aEEyZHBTcGVha2VyLEhkbWksQW5sZ0RvY2tIZWFkc2V0LERndGxEb2NrSGVhZHNldCxVc2JBY2Nlc3NvcnksVXNiRGV2aWNlLFJlbW90ZVN1Ym1peCxUZWxlcGhvbnlUeCxMaW5lLEhkbWlBcmMsU3BkaWYsRm0sQXV4TGluZSxTcGVha2VyU2FmZQotICAgICAgICAjCi0gICAgICAgICMgRE8gTk9UIENIQU5HRSBPUkRFUi4gVGhpcyBkZWZpbml0aW9uIG11c3QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mCi0gICAgICAgICMgQVVESU9fREVWSUNFX0lOXyogd2l0aGluIDxzeXN0ZW0vYXVkaW8uaD4gZmlsZSBvZiBhbmRyb2lkLgotICAgICAgICAjIE5vdGUgYWxzbyB0aGF0IGRpcmVjdGlvbiBiaXQgd2lsbCBiZSBkZWNpbWF0ZWQgYnkgQXVkaW9IQUwgaW4gb3JkZXIgdG8gYWxsb3cgdXNpbmcgYSBtYXNrCi0gICAgICAgICMgd2l0aCB0aGUgY2FyZGluYWxpdHkgb2YgMSBiZXR3ZWVuIGEgYml0IGFuZCBhbiBpbnB1dCBkZXZpY2UuCi0gICAgICAgICMKLSAgICAgICAgSW5wdXREZXZpY2VzTWFza1R5cGUgICAgQ29tbXVuaWNhdGlvbixBbWJpZW50LEJ1aWx0aW5NaWMsQmx1ZXRvb3RoU2NvSGVhZHNldCxXaXJlZEhlYWRzZXQsSGRtaSxUZWxlcGhvbnlSeCxCYWNrTWljLFJlbW90ZVN1Ym1peCxBbmxnRG9ja0hlYWRzZXQsRGd0bERvY2tIZWFkc2V0LFVzYkFjY2Vzc29yeSxVc2JEZXZpY2UsRm1UdW5lcixUdlR1bmUsTGluZSxTcGRpZixCbHVldG9vdGhBMmRwLExvb3BiYWNrCi0gICAgfQotICAgIEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUgewotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYXVkaW9fbW9kZV90Ci0gICAgICAgICMgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEFuZHJvaWRNb2RlVHlwZSAgICAgMDpOb3JtYWwsMTpSaW5nVG9uZSwyOkluQ2FsbCwzOkluQ29tbXVuaWNhdGlvbgotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvckNvbW11bmljYXRpb25UeXBlICAgIDA6Rm9yY2VOb25lLDE6Rm9yY2VTcGVha2VyLDM6Rm9yY2VCdFNjbwotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvck1lZGlhVHlwZSAgICAgICAgICAgIDA6Rm9yY2VOb25lLDE6Rm9yY2VTcGVha2VyLDI6Rm9yY2VIZWFkcGhvbmVzLDQ6Rm9yY2VCdEEyZHAsNTpGb3JjZVdpcmVkQWNjZXNzb3J5LDg6Rm9yY2VBbmFsb2dEb2NrLDk6Rm9yY2VEaWdpdGFsRG9jaywxMDpGb3JjZU5vQnRBMmRwCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yUmVjb3JkVHlwZSAgICAgICAgICAgMDpGb3JjZU5vbmUsMzpGb3JjZUJ0U2NvLDU6Rm9yY2VXaXJlZEFjY2Vzc29yeQotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvckRvY2tUeXBlICAgICAgICAgICAgIDA6Rm9yY2VOb25lLDU6Rm9yY2VXaXJlZEFjY2Vzc29yeSw2OkZvcmNlQnRDYXJEb2NrLDc6Rm9yY2VCdERlc2tEb2NrLDg6Rm9yY2VBbmFsb2dEb2NrLDk6Rm9yY2VEaWdpdGFsRG9jawotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvclN5c3RlbVR5cGUgICAgICAgICAgIDA6Rm9yY2VOb25lLDExOkZvcmNlU3lzdGVtRW5mb3JjZWQKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW9UeXBlICAwOkZvcmNlTm9uZSwxMjpGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvX3BvbGljeS5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmRUeXBlICAwOkZvcmNlTm9uZSwxMzpGb3JjZUVuY29kZWRTdXJyb3VuZE5ldmVyLDE0OkZvcmNlRW5jb2RlZFN1cnJvdW5kQWx3YXlzCi0gICAgfQotCi0gICAgQ3JpdGVyaW9uIHsKLSAgICAgICAgQXZhaWxhYmxlSW5wdXREZXZpY2VzIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBJbnB1dERldmljZXNNYXNrVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIG5vbmUKLSAgICAgICAgfQotICAgICAgICBBdmFpbGFibGVPdXRwdXREZXZpY2VzIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBPdXRwdXREZXZpY2VzTWFza1R5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBub25lCi0gICAgICAgIH0KLSAgICAgICAgVGVsZXBob255TW9kZSB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgQW5kcm9pZE1vZGVUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgTm9ybWFsCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckNvbW11bmljYXRpb25UeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JNZWRpYSB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JNZWRpYVR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvclJlY29yZCB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JSZWNvcmRUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JEb2NrIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckRvY2tUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JTeXN0ZW0gewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yU3lzdGVtVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZCB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmRUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaAppbmRleCA0YzFhY2ZlLi41YmZhZDI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCkBAIC0xNiwxMCArMTYsMTUgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KKyNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KKyNpbmNsdWRlIDxId01vZHVsZS5oPgorI2luY2x1ZGUgPERldmljZURlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUldMb2NrLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTI3LDI3ICszMiwyMCBAQAogCiBjbGFzcyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3I7CiBjbGFzcyBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlOwotY2xhc3MgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2U7CiBzdHJ1Y3QgY25vZGU7CiAKIGNsYXNzIFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKK3VzaW5nIFZhbHVlUGFpciA9IHN0ZDo6cGFpcjx1aW50MzJfdCwgc3RkOjpzdHJpbmc+OwordXNpbmcgVmFsdWVQYWlycyA9IHN0ZDo6dmVjdG9yPFZhbHVlUGFpcj47CiAKIGNsYXNzIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyCiB7CiBwcml2YXRlOgotICAgIHR5cGVkZWYgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhciAqPiBDcml0ZXJpb25UeXBlVmFsdWVQYWlyOwotCi0gICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqPiBDcml0ZXJpb25Db2xsZWN0aW9uOwotICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICo+IENyaXRlcmlvblR5cGVDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgQ3JpdGVyaW9uQ29sbGVjdGlvbjo6aXRlcmF0b3IgQ3JpdGVyaW9uTWFwSXRlcmF0b3I7Ci0gICAgdHlwZWRlZiBDcml0ZXJpb25Db2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBDcml0ZXJpb25NYXBDb25zdEl0ZXJhdG9yOwotICAgIHR5cGVkZWYgQ3JpdGVyaW9uVHlwZUNvbGxlY3Rpb246Oml0ZXJhdG9yIENyaXRlcmlvblR5cGVNYXBJdGVyYXRvcjsKLSAgICB0eXBlZGVmIENyaXRlcmlvblR5cGVDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBDcml0ZXJpYVR5cGVNYXBDb25zdEl0ZXJhdG9yOworICAgIHVzaW5nIENyaXRlcmlhID0gc3RkOjptYXA8c3RkOjpzdHJpbmcsIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKj47CiAKIHB1YmxpYzoKICAgICBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpOwpAQCAtMTIwLDYgKzExOCwyMCBAQAogICAgICAqLwogICAgIHN0YXR1c190IHNldEF2YWlsYWJsZU91dHB1dERldmljZXMoYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZXMpOwogCisgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgYWRkQ3JpdGVyaW9uIHRvIHRoZSBwb2xpY3kgcGZ3CisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIGNyaXRlcmlvbgorICAgICAqIEBwYXJhbSBpc0luY2x1c2l2ZSBpZiB0cnVlLCBpbmNsdXNpdmUsIGlmIGZhbHNlIGV4Y2x1c2l2ZSBjcml0ZXJpb24gdHlwZQorICAgICAqIEBwYXJhbSBwYWlycyBvZiBudW1lcmljYWwvbGl0ZXJhbCB2YWx1ZXMgb2YgdGhlIGNyaXRlcmlvbgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgcHJvdmlkZWQgYXMgbGl0ZXJhbC4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgc3RhdHVzX3QgYWRkQ3JpdGVyaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBib29sIGlzSW5jbHVzaXZlLCBWYWx1ZVBhaXJzIHBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZGVmYXVsdFZhbHVlKTsKKwogcHJpdmF0ZToKICAgICAvKioKICAgICAgKiBBcHBseSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcGxhdGZvcm0gb24gdGhlIHBvbGljeSBwYXJhbWV0ZXIgbWFuYWdlci4KQEAgLTEzMyw5NiArMTQ1LDcgQEAKICAgICAgKi8KICAgICB2b2lkIGFwcGx5UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CiAKLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBjcml0ZXJpb24gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBwYXRoIENyaXRlcmlvbiBjb25mIGZpbGUgcGF0aC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gTk9fRVJST1IgaXMgcGFyc2luZyBzdWNjZXNzZnVsLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKLQotICAgIC8qKgotICAgICAqIEFkZCBhIGNyaXRlcmlvbiB0eXBlIHRvIEF1ZGlvUG9saWN5UGZ3LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSB0eXBlTmFtZSBvZiB0aGUgUEZXIGNyaXRlcmlvbiB0eXBlLgotICAgICAqIEBwYXJhbVtpbl0gaXNJbmNsdXNpdmUgYXR0cmlidXRlIG9mIHRoZSBjcml0ZXJpb24gdHlwZS4KLSAgICAgKi8KLSAgICB2b2lkIGFkZENyaXRlcmlvblR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGVOYW1lLCBib29sIGlzSW5jbHVzaXZlKTsKLQotICAgIC8qKgotICAgICAqIEFkZCBhIGNyaXRlcmlvbiB0eXBlIHZhbHVlIHBhaXIgdG8gQXVkaW9Qb2xpY3lQZncuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHR5cGVOYW1lIGNyaXRlcmlvbiB0eXBlIG5hbWUgdG8gd2hpY2ggdGhpcyB2YWx1ZSBwYWlyIGlzIGFkZGVkIHRvLgotICAgICAqIEBwYXJhbVtpbl0gbnVtZXJpYyBwYXJ0IG9mIHRoZSB2YWx1ZSBwYWlyLgotICAgICAqIEBwYXJhbVtpbl0gbGl0ZXJhbCBwYXJ0IG9mIHRoZSB2YWx1ZSBwYWlyLgotICAgICAqLwotICAgIHZvaWQgYWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcihjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIHVpbnQzMl90IG51bWVyaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZsaXRlcmFsKTsKLQotICAgIC8qKgotICAgICAqIEFkZCBhIGNyaXRlcmlvbiB0byBBdWRpb1BvbGljeVBmdy4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgUEZXIGNyaXRlcmlvbi4KLSAgICAgKiBAcGFyYW1baW5dIHR5cGVOYW1lIGNyaXRlcmlvbiB0eXBlIG5hbWUgdG8gd2hpY2ggdGhpcyBjcml0ZXJpb24gaXMgYXNzb2NpYXRlZCB0by4KLSAgICAgKiBAcGFyYW1baW5dIGRlZmF1bHRMaXRlcmFsVmFsdWUgb2YgdGhlIFBGVyBjcml0ZXJpb24uCi0gICAgICovCi0gICAgdm9pZCBhZGRDcml0ZXJpb24oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZkZWZhdWx0TGl0ZXJhbFZhbHVlKTsKLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgaW5jbHVzaXZlIGNyaXRlcmlvbiB0eXBlIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRJbmNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBleGNsdXNpdmUgY3JpdGVyaW9uIHR5cGUgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbG9hZEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGNyaXRlcmlhIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRDcml0ZXJpYShjbm9kZSAqcm9vdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCBhIGNyaXRlcmlvbiBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkQ3JpdGVyaW9uKGNub2RlICpyb290KTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBjcml0ZXJpb24gdHlwZXMgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICogQHBhcmFtW2luXSBpc0luY2x1c2l2ZSB0cnVlIGlmIGluY2x1c2l2ZSwgZmFsc2UgaXMgZXhjbHVzaXZlLgotICAgICAqLwotICAgIHZvaWQgbG9hZENyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QsIGJvb2wgaXNJbmNsdXNpdmUpOwotCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRDb25maWcoY25vZGUgKnJvb3QpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGNoaWRyZW4gbm9kZSBmcm9tIGEgZ2l2ZW4gcm9vdCBub2RlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAqIEBwYXJhbVtvdXRdIGRlZmF1bHRWYWx1ZSBvZiB0aGUgcGFyYW1ldGVyIG1hbmFnZXIgZWxlbWVudCB0byByZXRyaWV2ZS4KLSAgICAgKiBAcGFyYW1bb3V0XSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgbWFuYWdlciBlbGVtZW50IHRvIHJldHJpZXZlLgotICAgICovCi0gICAgdm9pZCBwYXJzZUNoaWxkcmVuKGNub2RlICpyb290LCBzdGQ6OnN0cmluZyAmZGVmYXVsdFZhbHVlLCBzdGQ6OnN0cmluZyAmdHlwZSk7Ci0KLSAgICAvKioKKyAgICAgLyoqCiAgICAgICogUmV0cmlldmUgYW4gZWxlbWVudCBmcm9tIGEgbWFwIGJ5IGl0cyBuYW1lLgogICAgICAqCiAgICAgICogQHRwYXJhbSBUIHR5cGUgb2YgZWxlbWVudCB0byBzZWFyY2guCkBAIC0yNjYsOCArMTg5LDcgQEAKIAogICAgIGJvb2wgaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiwgaW50IHZhbHVlVG9DaGVjayk7CiAKLSAgICBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbiBtUG9saWN5Q3JpdGVyaW9uVHlwZXM7IC8qKjwgUG9saWN5IENyaXRlcmlvbiBUeXBlIG1hcC4gKi8KLSAgICBDcml0ZXJpb25Db2xsZWN0aW9uIG1Qb2xpY3lDcml0ZXJpYTsgLyoqPCBQb2xpY3kgQ3JpdGVyaW9uIE1hcC4gKi8KKyAgICBDcml0ZXJpYSBtUG9saWN5Q3JpdGVyaWE7IC8qKjwgUG9saWN5IENyaXRlcmlvbiBNYXAuICovCiAKICAgICBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IgKm1QZndDb25uZWN0b3I7IC8qKjwgUG9saWN5IFBhcmFtZXRlciBNYW5hZ2VyIGNvbm5lY3Rvci4gKi8KICAgICBQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvckxvZ2dlciAqbVBmd0Nvbm5lY3RvckxvZ2dlcjsgLyoqPCBQb2xpY3kgUEZXIGxvZ2dlci4gKi8KQEAgLTI4NCw2ICsyMDYsNyBAQAogICAgIHN0cnVjdCBwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDsKIAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZTsgLyoqPCBEZWZhdWx0IFBvbGljeSBQRlcgdG9wIGZpbGUgbmFtZS4qLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtUG9saWN5UGZ3VmVuZG9yQ29uZkZpbGVOYW1lOyAvKio8IFZlbmRvciBQb2xpY3kgUEZXIHRvcCBmaWxlIG5hbWUuKi8KIH07CiAKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDJjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9FbmdpbmUuY3BwIiwKKyAgICAgICAgInNyYy9FbmdpbmVJbnN0YW5jZS5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbmZpZyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGliYXVkaW9wb2xpY3kiLAorICAgICAgICAibGlieG1sMiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ZDViYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgQ29tcG9uZW50IGJ1aWxkCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBzcmMvRW5naW5lLmNwcCBcCi0gICAgc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBcCi0KLWF1ZGlvX3BvbGljeV9lbmdpbmVfaW5jbHVkZXNfY29tbW9uIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZQotCi1MT0NBTF9DRkxBR1MgKz0gXAotICAgIC1XYWxsIFwKLSAgICAtV2Vycm9yIFwKLSAgICAtV2V4dHJhIFwKLQotTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9IFwKLSAgICAkKGF1ZGlvX3BvbGljeV9lbmdpbmVfaW5jbHVkZXNfY29tbW9uKQotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGF1ZGlvX3BvbGljeV9lbmdpbmVfaW5jbHVkZXNfY29tbW9uKSBcCi0gICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL2h3IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZnJhbWV3b3Jrcy1hdikgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBiaW9uaWMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbGliYmFzZV9oZWFkZXJzCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgIGxpYmxvZyBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlibWVkaWFfaGVscGVyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rCmNvcHkgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYWRhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0OCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBUT1AgRklMRQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIHBob25lX2RlZmF1bHQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQorCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCisKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworZW5kaWYgIyBpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBwaG9uZV9kZWZhdWx0KQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTMzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzxjb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIi8+CisKKzwvY29uZmlndXJhdGlvbj4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTZkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKQEAgLTAsMCArMSwxMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIERlZmF1bHQgVm9sdW1lIFRhYmxlcyBpbmNsdWRlZCBieSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPCEtLSBGdWxsIERlZmF1bHQgVm9sdW1lIHRhYmxlIGZvciBhbGwgZGV2aWNlIGNhdGVnb3J5IC0tPgorPHZvbHVtZXM+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBGdWxsIFNjYWxlIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4wLDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iU0lMRU5UX1ZPTFVNRV9DVVJWRSI+CisgICAgICAgIDxwb2ludD4wLC05NjAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtOTYwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBTeXN0ZW0gcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTI0MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTE4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTEyMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC02MDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBNZWRpYSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIFNwZWFrZXIgTWVkaWEgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1NZU1RFTV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBpcyBTcGVha2VyIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC00NjgwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjQyLC0yMDcwPC9wb2ludD4KKyAgICAgICAgPHBvaW50Pjg1LC01NDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBpcyBFeHQgTWVkaWEgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTIxMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC0xMDAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgSGVhcmluZyBBaWQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtMTI3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTgwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgICA8IS0tIE5vbi1tdXRhYmxlIGRlZmF1bHQgdm9sdW1lIGN1cnZlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgKiBmaXJzdCBwb2ludCBpcyBhbHdheXMgZm9yIGluZGV4IDAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICogYXR0ZW51YXRpb24gaXMgc21hbGwgZW5vdWdoIHRoYXQgc3RyZWFtIGNhbiBzdGlsbCBiZSBoZWFyZCAtLT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICAgICBiYXNlZCBvbiBERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgbm9uLW11dGFibGUgVm9sdW1lIEN1cnZlIGZvciBoZWFkc2V0IC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBTcGVha2VyIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgbm9uLW11dGFibGUgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0VYVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBFeHQgTWVkaWEgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTEwMDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBIZWFyaW5nIEFpZCBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgYmFzZWQgb24gREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC0xMjcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtODAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+Cis8L3ZvbHVtZXM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTg3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtMCwwICsxLDExMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzxQcm9kdWN0U3RyYXRlZ2llcz4KKworICAgIDwhLS0gImhpZGRlbiBzdHJhdGVnaWVzIiBsaWtlIFRUUywgZW5mb3JjZWQgYXVkaWJsZToKKyAgICAgICAgICAgIFNoYWxsIHdlIGV4cG9zZSB0aGVtIGhlcmUgb3Iga2VlcCBpdCBoYXJkIGNvZGVkIC0tPgorCisgICAgPCEtLSBVc2VkIHRvIGlkZW50aWZ5IHRoZSB2b2x1bWUgb2YgYXVkaW8gc3RyZWFtcyBmb3IgZW5mb3JjZWQgc3lzdGVtIHNvdW5kcyBpbiBjZXJ0YWluCisgICAgICAgICBjb3VudHJpZXMgKGUuZy4gY2FtZXJhIGluIEphcGFuKQorICAgICAgICAgVGhpcyBzdHJhdGVneSB3aWxsIG9ubHkgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBwaG9uZSBpZiBmb3JjZSBmb3Igc3lzdGVtIGlzIHNldCB0bworICAgICAgICAgZW5mb3JjZWQuIC0tPgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9QSE9ORSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiIHZvbHVtZUdyb3VwPSJ2b2ljZV9jYWxsIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIgdm9sdW1lR3JvdXA9ImJsdWV0b290aF9zY28iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19TQ08iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfU09OSUZJQ0FUSU9OIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUklORyIgdm9sdW1lR3JvdXA9InJpbmciPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BTEFSTSIgdm9sdW1lR3JvdXA9ImFsYXJtIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FMQVJNIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIiB2b2x1bWVHcm91cD0iZW5mb3JjZWRfYXVkaWJsZSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfQUNDRVNTSUJJTElUWSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiIHZvbHVtZUdyb3VwPSJhY2Nlc3NpYmlsaXR5Ij4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIgdm9sdW1lR3JvdXA9Im5vdGlmaWNhdGlvbiI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX01FRElBIj4KKyAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIiB2b2x1bWVHcm91cD0ibXVzaWMiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfR0FNRSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1NZU1RFTSIgdm9sdW1lR3JvdXA9InN5c3RlbSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9EVE1GIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fRFRNRiIgdm9sdW1lR3JvdXA9ImR0bWYiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHZvbHVtZSBvZiBhdWRpbyBzdHJlYW1zIGV4Y2x1c2l2ZWx5IHRyYW5zbWl0dGVkIHRocm91Z2ggdGhlICBzcGVha2VyCisgICAgICAgICAoVFRTKSBvZiB0aGUgZGV2aWNlIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVFRTIiB2b2x1bWVHcm91cD0idHRzIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQkVBQ09OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFJvdXRpbmcgU3RyYXRlZ3kgcmVyb3V0aW5nIG1heSBiZSByZW1vdmVkIGFzIGZvbGxvd2luZyBtZWRpYT8/PyAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1JFUk9VVElORyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1JFUk9VVElORyIgdm9sdW1lR3JvdXA9InJlcm91dGluZyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBEZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaGFzIGVtcHR5IGF0dHJpYnV0ZXMgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9QQVRDSCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1BBVENIIiB2b2x1bWVHcm91cD0icGF0Y2giPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworCis8L1Byb2R1Y3RTdHJhdGVnaWVzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdhMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDIzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVm9sdW1lIHNlY3Rpb24gZGVmaW5lcyBhIHZvbHVtZSBjdXJ2ZSBmb3IgYSBnaXZlbiB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5LgorSXQgY29udGFpbnMgYSBsaXN0IG9mIHBvaW50cyBvZiB0aGlzIGN1cnZlIGV4cHJlc3NpbmcgdGhlIGF0dGVudWF0aW9uIGluIE1pbGxpYmVscyBmb3IgYSBnaXZlbgordm9sdW1lIGluZGV4IGZyb20gMCB0byAxMDAuCis8dm9sdW1lIGRldmljZUNhdGVnb3J5PeKAneKAnT4KKzxwb2ludD4wLC05NjAwPC9wb2ludD4KKzxwb2ludD4xMDAsMDwvcG9pbnQ+Cis8L3ZvbHVtZT4KKy0tPgorCis8dm9sdW1lR3JvdXBzPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dm9pY2VfY2FsbDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNzAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTkwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zeXN0ZW08L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTUxMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjU3LC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjUwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+ODUsLTIzMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8IS0tdm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLy0tPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5yaW5nPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bXVzaWM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjI1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmFsYXJtPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfRVhUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5ub3RpZmljYXRpb248L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+Ymx1ZXRvb3RoX3NjbzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmVuZm9yY2VkX2F1ZGlibGU8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTM0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTIwMDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+ZHRtZjwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTQwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE0MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dHRzPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+YWNjZXNzaWJpbGl0eTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnJlcm91dGluZzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnBhdGNoPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKzwvdm9sdW1lR3JvdXBzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcAppbmRleCBlODZhZTVmLi42NmE2OTY1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPElPUHJvZmlsZS5oPgorI2luY2x1ZGUgPEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMzgsNjAgKzM5LDMzIEBACiBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiB7CiAKK3N0cnVjdCBsZWdhY3lfc3RyYXRlZ3lfbWFwIHsgY29uc3QgY2hhciAqbmFtZTsgbGVnYWN5X3N0cmF0ZWd5IGlkOyB9Oworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGxlZ2FjeV9zdHJhdGVneV9tYXA+IGdMZWdhY3lTdHJhdGVneSA9IHsKKyAgICB7ICJTVFJBVEVHWV9OT05FIiwgU1RSQVRFR1lfTk9ORSB9LAorICAgIHsgIlNUUkFURUdZX01FRElBIiwgU1RSQVRFR1lfTUVESUEgfSwKKyAgICB7ICJTVFJBVEVHWV9QSE9ORSIsIFNUUkFURUdZX1BIT05FIH0sCisgICAgeyAiU1RSQVRFR1lfU09OSUZJQ0FUSU9OIiwgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIH0sCisgICAgeyAiU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwiLCBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCB9LAorICAgIHsgIlNUUkFURUdZX0RUTUYiLCBTVFJBVEVHWV9EVE1GIH0sCisgICAgeyAiU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSIsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgfSwKKyAgICB7ICJTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIiLCBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIgfSwKKyAgICB7ICJTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIiwgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSB9LAorICAgIHsgIlNUUkFURUdZX1JFUk9VVElORyIsIFNUUkFURUdZX1JFUk9VVElORyB9LAorICAgIHsgIlNUUkFURUdZX1BBVENIIiwgU1RSQVRFR1lfUkVST1VUSU5HIH0sIC8vIGJvaWxlciB0byBtYW5hZ2Ugc3RyZWFtIHBhdGNoIHZvbHVtZQorfTsKKwogRW5naW5lOjpFbmdpbmUoKQotICAgIDogbU1hbmFnZXJJbnRlcmZhY2UodGhpcyksCi0gICAgICBtUGhvbmVTdGF0ZShBVURJT19NT0RFX05PUk1BTCksCi0gICAgICBtQXBtT2JzZXJ2ZXIoTlVMTCkKIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpKyspIHsKLSAgICAgICAgbUZvcmNlVXNlW2ldID0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgYXV0byByZXN1bHQgPSBFbmdpbmVCYXNlOjpsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKyAgICBBTE9HRV9JRihyZXN1bHQubmJTa2lwcGVkRWxlbWVudCAhPSAwLAorICAgICAgICAgICAgICJQb2xpY3kgRW5naW5lIGNvbmZpZ3VyYXRpb24gaXMgcGFydGlhbGx5IGludmFsaWQsIHNraXBwZWQgJXp1IGVsZW1lbnRzIiwKKyAgICAgICAgICAgICByZXN1bHQubmJTa2lwcGVkRWxlbWVudCk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogZ0xlZ2FjeVN0cmF0ZWd5KSB7CisgICAgICAgIG1MZWdhY3lTdHJhdGVneU1hcFtnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoc3RyYXRlZ3kubmFtZSldID0gc3RyYXRlZ3kuaWQ7CiAgICAgfQogfQogCi1FbmdpbmU6On5FbmdpbmUoKQotewotfQotCi12b2lkIEVuZ2luZTo6c2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQotewotICAgIEFMT0dfQVNTRVJUKG9ic2VydmVyICE9IE5VTEwsICJJbnZhbGlkIEF1ZGlvIFBvbGljeSBNYW5hZ2VyIG9ic2VydmVyIik7Ci0gICAgbUFwbU9ic2VydmVyID0gb2JzZXJ2ZXI7Ci19Ci0KLXN0YXR1c190IEVuZ2luZTo6aW5pdENoZWNrKCkKLXsKLSAgICByZXR1cm4gKG1BcG1PYnNlcnZlciAhPSBOVUxMKSA/ICBOT19FUlJPUiA6IE5PX0lOSVQ7Ci19Ci0KLXN0YXR1c190IEVuZ2luZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCi17Ci0gICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBzdGF0ZSAlZCIsIHN0YXRlKTsKLQotICAgIGlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPj0gQVVESU9fTU9ERV9DTlQpIHsKLSAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBpbnZhbGlkIHN0YXRlICVkIiwgc3RhdGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChzdGF0ZSA9PSBtUGhvbmVTdGF0ZSApIHsKLSAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBzZXR0aW5nIHNhbWUgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gc3RvcmUgcHJldmlvdXMgcGhvbmUgc3RhdGUgZm9yIG1hbmFnZW1lbnQgb2Ygc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGJlbG93Ci0gICAgaW50IG9sZFN0YXRlID0gbVBob25lU3RhdGU7Ci0gICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKLQotICAgIGlmICghaXNfc3RhdGVfaW5fY2FsbChvbGRTdGF0ZSkgJiYgaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkpIHsKLSAgICAgICAgQUxPR1YoIiAgRW50ZXJpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKLSAgICAgICAgbUFwbU9ic2VydmVyLT5nZXRWb2x1bWVDdXJ2ZXMoKS5zd2l0Y2hWb2x1bWVDdXJ2ZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fRFRNRik7Ci0gICAgfSBlbHNlIGlmIChpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiAhaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkpIHsKLSAgICAgICAgQUxPR1YoIiAgRXhpdGluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOwotICAgICAgICBtQXBtT2JzZXJ2ZXItPmdldFZvbHVtZUN1cnZlcygpLnJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShBVURJT19TVFJFQU1fRFRNRik7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQogc3RhdHVzX3QgRW5naW5lOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQogewogICAgIHN3aXRjaCh1c2FnZSkgewpAQCAtMTAxLDcgKzc1LDYgQEAKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfQ09NTVVOSUNBVElPTiIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQToKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSEVBRFBIT05FUyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0EyRFAgJiYKQEAgLTExMiw3ICs4NSw2IEBACiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX01FRElBIiwgY29uZmlnKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRDoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCkBAIC0xMjAsNyArOTIsNiBAQAogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9SRUNPUkQiLCBjb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSzoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0NBUl9ET0NLICYmCkBAIC0xMzAsMjEgKzEwMSwxOCBAQAogICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9ESUdJVEFMX0RPQ0spIHsKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfRE9DSyIsIGNvbmZpZyk7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTToKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgogICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfU1lTVEVNIiwgY29uZmlnKTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU86CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKICAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQpIHsKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBIRE1JX1NZU1RFTV9BVURJTyIsIGNvbmZpZyk7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQ6CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKQEAgLTE1NCwxMDkgKzEyMiwyNSBAQAogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEVOQ09ERURfU1VSUk9VTkQiLCBjb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSB7CiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1ZJQlJBVEVfUklOR0lORyIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgdXNhZ2UgJWQiLCB1c2FnZSk7CiAgICAgICAgIGJyZWFrOyAvLyBUT0RPIHJldHVybiBCQURfVkFMVUU/CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gRW5naW5lQmFzZTo6c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CiB9CiAKLXJvdXRpbmdfc3RyYXRlZ3kgRW5naW5lOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICAvLyBzdHJlYW0gdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIHN3aXRjaCAoc3RyZWFtKSB7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfUEhPTkU7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTjsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfRFRNRjsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgidW5rbm93biBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbSk7Ci0gICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgLy8gTk9URTogU1lTVEVNIHN0cmVhbSB1c2VzIE1FRElBIHN0cmF0ZWd5IGJlY2F1c2UgbXV0aW5nIG11c2ljIGFuZCBzd2l0Y2hpbmcgb3V0cHV0cwotICAgICAgICAvLyB3aGlsZSBrZXkgY2xpY2tzIGFyZSBwbGF5ZWQgcHJvZHVjZXMgYSBwb29yIHJlc3VsdAotICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1JFUk9VVElORzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1JFUk9VVElORzsKLSAgICB9Ci19Ci0KLXJvdXRpbmdfc3RyYXRlZ3kgRW5naW5lOjpnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCi17Ci0gICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIHN3aXRjaCAodXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7Ci0gICAgfQotfQotCi1hdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAotewotICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7Ci0gICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7Ci0KLSAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IG1BcG1PYnNlcnZlci0+Z2V0T3V0cHV0cygpOwotCi0gICAgcmV0dXJuIGdldERldmljZUZvclN0cmF0ZWd5SW50KHN0cmF0ZWd5LCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsICh1aW50MzJfdClBVURJT19ERVZJQ0VfTk9ORSk7Ci19Ci0KLQotYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMsCi0gICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzLAotICAgICAgICB1aW50MzJfdCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKSBjb25zdAorYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQobGVnYWN5X3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKSBjb25zdAogewogICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwogICAgIHVpbnQzMl90IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlID0KQEAgLTI2OSwxNiArMTUzLDE3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDoKLSAgICAgICAgaWYgKGlzSW5DYWxsKCkgfHwgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSB7CisgICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBib29sIG1lZGlhX2FjdGl2ZV9sb2NhbGx5ID0KLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkKLSAgICAgICAgICAgICAgICAgICAgfHwgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX01VU0lDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpCisgICAgICAgICAgICAgICAgICAgIHx8IG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpLAorICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpOwogICAgICAgICAgICAgLy8gcm91dGluZyBpcyBzYW1lIGFzIG1lZGlhIHdpdGhvdXQgdGhlICJyZW1vdGUiIGRldmljZQogICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoU1RSQVRFR1lfTUVESUEsCiAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMsCkBAIC0zMTUsMTQgKzIwMCwxNCBAQAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gb3V0cHV0cy5nZXRQcmltYXJ5T3V0cHV0KCk7CiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlVHlwZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOwogCiAgICAgICAgICAgICAvLyBUT0RPOiBnZXRQcmltYXJ5T3V0cHV0IHJldHVybiBvbmx5IGRldmljZXMgZnJvbSBmaXJzdCBtb2R1bGUgaW4KICAgICAgICAgICAgIC8vIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCwgaGVhcmluZyBhaWQgaXMgbm90IHRoZXJlLCBidXQgaXQncwogICAgICAgICAgICAgLy8gYSBwcmltYXJ5IGRldmljZQogICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgbm90IHRoZSByaWdodCB3YXkgb2Ygc29sdmluZyB0aGlzIHByb2JsZW0KICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbFByaW1hcnlPdXRwdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAocHJpbWFyeU91dHB1dC0+c3VwcG9ydGVkRGV2aWNlcygpIHwgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCkgJgorICAgICAgICAgICAgICAgIChwcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkudHlwZXMoKSB8IEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpICYKICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CiAKICAgICAgICAgICAgIGlmICgoKGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKQEAgLTMzNCw3ICsyMTksNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIGZvciBwaG9uZSBzdHJhdGVneSwgd2UgZmlyc3QgY29uc2lkZXIgdGhlIGZvcmNlZCB1c2UgYW5kIHRoZW4gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIGJ5CiAgICAgICAgIC8vIG9yZGVyIG9mIHByaW9yaXR5Ci0gICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgc3dpdGNoIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSB8fCBzdHJhdGVneSAhPSBTVFJBVEVHWV9EVE1GKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOwpAQCAtMzUyLDcgKzIzNyw3IEBACiAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKICAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOwogICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwpAQCAtMzg2LDcgKzI3MSw3IEBACiAgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0bwogICAgICAgICAgICAgLy8gQTJEUCBzcGVha2VyIHdoZW4gZm9yY2luZyB0byBzcGVha2VyIG91dHB1dAogICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCi0gICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKQEAgLTQxMCw5ICsyOTUsOSBAQAogCiAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CiAKLSAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlOiBUaGUgcmVzdCBvZiB0aGUgYmVoYXZpb3IgaXMgaGFuZGxlZCBieQotICAgICAgICAvLyBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKS4KLSAgICAgICAgaWYgKGlzSW5DYWxsKCkgfHwgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSB7CisgICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZQorICAgICAgICBpZiAoaXNJbkNhbGwoKSB8fAorICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAogICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKQEAgLTQyNyw3ICszMTIsNyBAQAogICAgICAgICAvLyAgIC0gaW4gY291bnRyaWVzIHdoZXJlIG5vdCBlbmZvcmNlZCBpbiB3aGljaCBjYXNlIGl0IGZvbGxvd3MgU1RSQVRFR1lfTUVESUEKIAogICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKLSAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSkgeworICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwogICAgICAgICB9CiAKQEAgLTQ0Myw5ICszMjgsOSBAQAogICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFVzZSBPTkxZIEJsdWV0b290aCBTQ08gb3V0cHV0IHdoZW4gcmluZ2luZyBpbiB2aWJyYXRpb24gbW9kZQotICAgICAgICAgICAgaWYgKCEoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKKyAgICAgICAgICAgIGlmICghKChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKICAgICAgICAgICAgICAgICAgICAgJiYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSkgewotICAgICAgICAgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkddCisgICAgICAgICAgICAgICAgaWYgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HKQogICAgICAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgewogICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlMiAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gZGV2aWNlMjsKQEAgLTQ1NCw3ICszMzksNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFVzZSBib3RoIEJsdWV0b290aCBTQ08gYW5kIHBob25lIGRlZmF1bHQgb3V0cHV0IHdoZW4gcmluZ2luZyBpbiBub3JtYWwgbW9kZQotICAgICAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKKyAgICAgICAgICAgIGlmIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKICAgICAgICAgICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpIHsKQEAgLTQ3Niw3ICszNjEsNyBAQAogICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gb3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gZGVzYy0+ZGV2aWNlKCkgJgorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gZGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgJgogICAgICAgICAgICAgICAgICAgICAoQVVESU9fREVWSUNFX09VVF9IRE1JIHwgQVVESU9fREVWSUNFX09VVF9TUERJRiB8IEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpOwogICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc0FjdGl2ZSgpICYmICFhdWRpb19pc19saW5lYXJfcGNtKGRlc2MtPm1Gb3JtYXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzICE9IEFVRElPX0RFVklDRV9OT05FKSB7CkBAIC00ODQsOSArMzY5LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpOwotICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgeworICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpOworICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1JJTkcpKSB8fAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlKHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldERldmljZUZvclN0cmF0ZWd5SW50KAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CkBAIC01MDcsNyArMzkyLDcgQEAKICAgICAgICAgaWYgKHN0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikgewogICAgICAgICAgICAgLy8gbm8gc29uaWZpY2F0aW9uIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQogICAgICAgICAgICAgaWYgKGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIwIikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIwIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTE3LDExICs0MDIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAvLyBGSVhNRTogRmluZCBhIGJldHRlciBzb2x1dGlvbiB0byBwcmV2ZW50IHJvdXRpbmcgdG8gQlQgaGVhcmluZyBhaWQoYi8xMjI5MzEyNjEpLgorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSkgewogICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRDsKICAgICAgICAgfQogICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCi0gICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCiAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7CiAgICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewpAQCAtNTMyLDcgKzQxOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUikpIHsKKyAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUikpIHsKICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKICAgICAgICAgfQogICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewpAQCAtNTYxLDcgKzQ0OCw3IEBACiAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOwogICAgICAgICB9CiAgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLKSkgeworICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spID09IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSykpIHsKICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKQEAgLTU4Miw3ICs0NjksNyBAQAogCiAgICAgICAgIC8vIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KICAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKLSAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPT0KKyAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPKSA9PQogICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkpIHsKICAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwogICAgICAgICB9CkBAIC02MDQsNyArNDkxLDcgQEAKIAogICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgQUxPR1YoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciBzdHJhdGVneSAlZCIsIHN0cmF0ZWd5KTsKLSAgICAgICAgZGV2aWNlID0gbUFwbU9ic2VydmVyLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKTsKKyAgICAgICAgZGV2aWNlID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCk7CiAgICAgICAgIEFMT0dFX0lGKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSwKICAgICAgICAgICAgICAgICAgImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGVmYXVsdCBkZXZpY2UgZGVmaW5lZCIpOwogICAgIH0KQEAgLTYxNSw5ICs1MDIsOSBAQAogCiBhdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QKIHsKLSAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKLSAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7Ci0gICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBtQXBtT2JzZXJ2ZXItPmdldE91dHB1dHMoKTsKKyAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBhdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwogCiAgICAgdWludDMyX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CkBAIC02MzIsNiArNTE5LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CiAgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC02NTEsNyArNTM5LDcgQEAKICAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6CiAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7CiAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUDsKLSAgICB9IGVsc2UgaWYgKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCisgICAgfSBlbHNlIGlmICgoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCiAgICAgICAgIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpKSB7CiAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CiAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CkBAIC02NzEsMTIgKzU1OSwxMSBAQAogICAgICAgICBpZiAoKGdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwpICYmCiAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSA9PSAwKSB7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKLSAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzID0KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpCi0gICAgICAgICAgICAgICAgICAgICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgICAgIH0KIAotICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CisgICAgICAgIHN3aXRjaCAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSkgewogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086CiAgICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKICAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKQEAgLTcxMCw3ICs1OTcsNyBAQAogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOgogICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgogICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6Ci0gICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKKyAgICAgICAgaWYgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCiAgICAgICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOwogICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKQEAgLTczOSwxNiArNjI2LDMyIEBACiAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VUKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgogICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgewogICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgorICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgogICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpIHsKICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUjsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRToKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0VDSE9fUkVGRVJFTkNFKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1coImdldERldmljZUZvcklucHV0U291cmNlKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7CiAgICAgICAgIGJyZWFrOwpAQCAtNzY1LDEwICs2NjgsMTA3IEBACiAgICAgcmV0dXJuIGRldmljZTsKIH0KIAordm9pZCBFbmdpbmU6OnVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCkKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBnZXRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnN0cmF0ZWd5ID0gaXRlci5zZWNvbmQ7CisgICAgICAgIGF1dG8gZGV2aWNlcyA9IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3ktPmdldElkKCkpOworICAgICAgICBtRGV2aWNlc0ZvclN0cmF0ZWdpZXNbc3RyYXRlZ3ktPmdldElkKCldID0gZGV2aWNlczsKKyAgICAgICAgc3RyYXRlZ3ktPnNldERldmljZVR5cGVzKGRldmljZXMudHlwZXMoKSk7CisgICAgICAgIHN0cmF0ZWd5LT5zZXREZXZpY2VBZGRyZXNzKGRldmljZXMuZ2V0Rmlyc3RWYWxpZEFkZHJlc3MoKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdAoreworICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKKworICAgIGF1dG8gbGVnYWN5U3RyYXRlZ3kgPSBtTGVnYWN5U3RyYXRlZ3lNYXAuZmluZChzdHJhdGVneSkgIT0gZW5kKG1MZWdhY3lTdHJhdGVneU1hcCkgPworICAgICAgICAgICAgICAgIG1MZWdhY3lTdHJhdGVneU1hcC5hdChzdHJhdGVneSkgOiBTVFJBVEVHWV9OT05FOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQobGVnYWN5U3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KUFVRElPX0RFVklDRV9OT05FKTsKKyAgICByZXR1cm4gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZXMpOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmcHJlZmVycmVkRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpIGNvbnN0Cit7CisgICAgLy8gRmlyc3QgY2hlY2sgZm9yIGV4cGxpY3Qgcm91dGluZyBkZXZpY2UKKyAgICBpZiAocHJlZmVycmVkRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzIGV4cGxpY2l0IFJvdXRpbmcgb24gZGV2aWNlICVzIiwgX19mdW5jX18sIHByZWZlcnJlZERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihwcmVmZXJyZWREZXZpY2UpOworICAgIH0KKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKKyAgICAvLworICAgIC8vIEBUT0RPOiB3aGF0IGlzIHRoZSBwcmlvcml0eSBvZiBleHBsaWNpdCByb3V0aW5nPyBTaGFsbCBpdCBiZSBjb25zaWRlcmVkIGZpcnN0IGFzIGl0IHVzZWQgdG8KKyAgICAvLyBiZSBieSBBUE0/CisgICAgLy8KKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgYWxsIGFjdGl2ZSBjbGllbnRzIGhhdmUgYSBwcmVmZXJyZWQgcm91dGUgaW4gd2hpY2gKKyAgICAvLyBjYXNlIHRoZSBsYXN0IGFjdGl2ZSBjbGllbnQgcm91dGUgaXMgdXNlZAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2Uob3V0cHV0cywgc3RyYXRlZ3ksIGF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZyb21DYWNoZT8gbURldmljZXNGb3JTdHJhdGVnaWVzLmF0KHN0cmF0ZWd5KSA6IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIGZyb21DYWNoZSkgY29uc3QKK3sKKyAgICBhdXRvIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgIHJldHVybiBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCBmcm9tQ2FjaGUpOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBFbmdpbmU6OmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKm1peCkgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvICZwb2xpY3lNaXhlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbigpOworICAgIGNvbnN0IGF1dG8gJmF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOworICAgIGNvbnN0IGF1dG8gJmlucHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldElucHV0cygpOworICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3M7CisKKyAgICAvLworICAgIC8vIEV4cGxpY2l0IFJvdXRpbmcgPz8/IHdoYXQgaXMgdGhlIHByaW9yaXR5IG9mIGV4cGxpY2l0IHJvdXRpbmc/IFNoYWxsIGl0IGJlIGNvbnNpZGVyZWQKKyAgICAvLyBmaXJzdCBhcyBpdCB1c2VkIHRvIGJlIGJ5IEFQTT8KKyAgICAvLworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBhbGwgYWN0aXZlIGNsaWVudHMgaGF2ZSBhIHByZWZlcnJlZCByb3V0ZSBpbiB3aGljaAorICAgIC8vIGNhc2UgdGhlIGxhc3QgYWN0aXZlIGNsaWVudCByb3V0ZSBpcyB1c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KKyAgICAgICAgICAgIGZpbmRQcmVmZXJyZWREZXZpY2UoaW5wdXRzLCBhdHRyLnNvdXJjZSwgYXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisKKyAgICBkZXZpY2UgPSBwb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdHRyLnNvdXJjZSwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBtaXgpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGdldERldmljZUZvcklucHV0U291cmNlKGF0dHIuc291cmNlKTsKKworICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2VUeXBlKSkgeworICAgICAgICBhZGRyZXNzID0gIjAiOworICAgICAgICBzdGQ6OnNpemVfdCBwb3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3MgeyBhdHRyLnRhZ3MgfTsKKyAgICAgICAgaWYgKChwb3MgPSB0YWdzLmZpbmQoImFkZHI9IikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBhZGRyZXNzID0gdGFncy5zdWJzdHIocG9zICsgc3RkOjpzdHJsZW4oImFkZHI9IikpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKGRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChhZGRyZXNzLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKK30KKwogdGVtcGxhdGUgPD4KIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCiB7Ci0gICAgcmV0dXJuICZtTWFuYWdlckludGVyZmFjZTsKKyAgICByZXR1cm4gdGhpczsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oCmluZGV4IDA2MTg2YzEuLmQ1ZGZhY2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oCkBAIC0xNiw3ICsxNiw3IEBACiAKICNwcmFnbWEgb25jZQogCi0KKyNpbmNsdWRlICJFbmdpbmVCYXNlLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgiCiAjaW5jbHVkZSA8QXVkaW9HYWluLmg+CiAjaW5jbHVkZSA8cG9saWN5Lmg+CkBAIC0yOSwxMTQgKzI5LDY3IEBACiBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiB7CiAKLWNsYXNzIEVuZ2luZQorZW51bSBsZWdhY3lfc3RyYXRlZ3kgeworICAgIFNUUkFURUdZX05PTkUgPSAtMSwKKyAgICBTVFJBVEVHWV9NRURJQSwKKyAgICBTVFJBVEVHWV9QSE9ORSwKKyAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sCisgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsCisgICAgU1RSQVRFR1lfRFRNRiwKKyAgICBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLAorICAgIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiwKKyAgICBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLAorICAgIFNUUkFURUdZX1JFUk9VVElORywKK307CisKK2NsYXNzIEVuZ2luZSA6IHB1YmxpYyBFbmdpbmVCYXNlCiB7CiBwdWJsaWM6CiAgICAgRW5naW5lKCk7Ci0gICAgdmlydHVhbCB+RW5naW5lKCk7CisgICAgdmlydHVhbCB+RW5naW5lKCkgPSBkZWZhdWx0OwogCiAgICAgdGVtcGxhdGUgPGNsYXNzIFJlcXVlc3RlZEludGVyZmFjZT4KICAgICBSZXF1ZXN0ZWRJbnRlcmZhY2UgKnF1ZXJ5SW50ZXJmYWNlKCk7CiAKIHByaXZhdGU6Ci0gICAgLy8vIEludGVyZmFjZSBtZW1iZXJzCi0gICAgY2xhc3MgTWFuYWdlckludGVyZmFjZUltcGwgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgTWFuYWdlckludGVyZmFjZUltcGwoRW5naW5lICpwb2xpY3lFbmdpbmUpCi0gICAgICAgICAgICA6IG1Qb2xpY3lFbmdpbmUocG9saWN5RW5naW5lKSB7fQorICAgIC8vLworICAgIC8vLyBmcm9tIEVuZ2luZUJhc2UsIHNvIGZyb20gQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlCisgICAgLy8vCisgICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSBvdmVycmlkZTsKIAotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBtUG9saWN5RW5naW5lLT5zZXRPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdENoZWNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRTdHJhdGVneUZvclVzYWdlKHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQaG9uZVN0YXRlKG1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAvKmRldkRlc2MqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IC8qc3RhdGUqLykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgRW5naW5lICptUG9saWN5RW5naW5lOwotICAgIH0gbU1hbmFnZXJJbnRlcmZhY2U7CisgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcmVkRGV2aWNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgc3A8QXVkaW9Qb2xpY3lNaXg+ICptaXggPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvaWQgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KICAgICBFbmdpbmUoY29uc3QgRW5naW5lICZvYmplY3QpOwogICAgIEVuZ2luZSAmb3BlcmF0b3I9KGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKIAotICAgIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKTsKLQotICAgIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgaW5saW5lIGJvb2wgaXNJbkNhbGwoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzX3N0YXRlX2luX2NhbGwobVBob25lU3RhdGUpOwotICAgIH0KLQotICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpOwotICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtUGhvbmVTdGF0ZTsKLSAgICB9Ci0gICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7Ci0gICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKLSAgICB9CiAgICAgc3RhdHVzX3Qgc2V0RGVmYXVsdERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3Q7Ci0gICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5SW50KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cywKLSAgICAgICAgICAgIHVpbnQzMl90IG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpIGNvbnN0OworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneUludChsZWdhY3lfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSkgY29uc3Q7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCiAgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdDsKLSAgICBhdWRpb19tb2RlX3QgbVBob25lU3RhdGU7ICAvKio8IGN1cnJlbnQgcGhvbmUgc3RhdGUuICovCiAKLSAgICAvKiogY3VycmVudCBmb3JjZWQgdXNlIGNvbmZpZ3VyYXRpb24uICovCi0gICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdOworICAgIERldmljZVN0cmF0ZWd5TWFwIG1EZXZpY2VzRm9yU3RyYXRlZ2llczsKIAotICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXI7CisgICAgc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBsZWdhY3lfc3RyYXRlZ3k+IG1MZWdhY3lTdHJhdGVneU1hcDsKIH07CiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IGZkNDk0NzMuLjU1NzRlMWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMzgsMjEgKzM4LDIwIEBACiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPGF1ZGlvX3BvbGljeV9jb25mLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCi0jaWZuZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLSNpbmNsdWRlIDxDb25maWdQYXJzaW5nVXRpbHMuaD4KLSNpbmNsdWRlIDxTdHJlYW1EZXNjcmlwdG9yLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgPHBvbGljeS5oPgpAQCAtNjcsMjUgKzY2LDE1IEBACiAvLyBtZWRpYSAvIG5vdGlmaWNhdGlvbiAvIHN5c3RlbSB2b2x1bWUuCiBjb25zdGV4cHIgZmxvYXQgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQiA9IDMuZjsKIAotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKLS8vIEFycmF5IG9mIGFsbCBzdXJyb3VuZCBmb3JtYXRzLgotc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IFNVUlJPVU5EX0ZPUk1BVFNbXSA9IHsKLSAgICBBVURJT19GT1JNQVRfQUMzLAotICAgIEFVRElPX0ZPUk1BVF9FX0FDMywKLSAgICBBVURJT19GT1JNQVRfRFRTLAotICAgIEFVRElPX0ZPUk1BVF9EVFNfSEQsCi0gICAgQVVESU9fRk9STUFUX0FBQ19MQywKLSAgICBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELAotICAgIEFVRElPX0ZPUk1BVF9FX0FDM19KT0MsCi19OwotLy8gQXJyYXkgb2YgYWxsIEFBQyBmb3JtYXRzLiBXaGVuIEFBQyBpcyBlbmFibGVkIGJ5IHVzZXJzLCBhbGwgQUFDIGZvcm1hdHMgc2hvdWxkIGJlIGVuYWJsZWQuCi1zdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgQUFDX0ZPUk1BVFNbXSA9IHsKLSAgICBBVURJT19GT1JNQVRfQUFDX0xDLAotICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEsCi0gICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMiwKLSAgICBBVURJT19GT1JNQVRfQUFDX0VMRCwKLSAgICBBVURJT19GT1JNQVRfQUFDX1hIRSwKLX07CisvLyBDb21wcmVzc2VkIGZvcm1hdHMgZm9yIE1TRCBtb2R1bGUsIG9yZGVyZWQgZnJvbSBtb3N0IHByZWZlcnJlZCB0byBsZWFzdCBwcmVmZXJyZWQuCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGNvbXByZXNzZWRGb3JtYXRzT3JkZXIgPSB7eworICAgICAgICBBVURJT19GT1JNQVRfTUFUXzJfMSwgQVVESU9fRk9STUFUX01BVF8yXzAsIEFVRElPX0ZPUk1BVF9FX0FDMywKKyAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfX07CisvLyBDaGFubmVsIG1hc2tzIGZvciBNU0QgbW9kdWxlLCAzRCA+IDJEID4gMUQgb3JkZXJpbmcgKG1vc3QgcHJlZmVycmVkIHRvIGxlYXN0IHByZWZlcnJlZCkuCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IHN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIgPSB7eworICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gfX07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCkBAIC05NCw0MyArODMsNDkgQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewotICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmRldmljZV9hZGRyZXNzKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCiB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0oZGV2aWNlX2FkZHJlc3MpOworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtKGRldmljZS0+YWRkcmVzcygpKTsKICAgICBjb25zdCBTdHJpbmc4IGtleShzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSA/CiAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUNvbm5lY3QgOiBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtRGlzY29ubmVjdCk7Ci0gICAgcGFyYW0uYWRkSW50KGtleSwgZGV2aWNlKTsKKyAgICBwYXJhbS5hZGRJbnQoa2V5LCBkZXZpY2UtPnR5cGUoKSk7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewotICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoKSBkZXZpY2U6IDB4JVgsIHN0YXRlICVkLCBhZGRyZXNzICVzIG5hbWUgJXMiLAotICAgICAgICAgICAgZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KCkgZGV2aWNlOiAweCVYLCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyBuYW1lICVzIGZvcm1hdCAweCVYIiwKKyAgICAgICAgICAgIGRldmljZVR5cGUsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogCiAgICAgLy8gY29ubmVjdC9kaXNjb25uZWN0IG9ubHkgMSBkZXZpY2UgYXQgYSB0aW1lCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZVR5cGUpKSByZXR1cm4gQkFEX1ZBTFVFOwogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CisgICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlVHlwZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKKyAgICBpZiAoZGV2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIAogICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlcwotICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlKSkgewogICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOwogCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldkRlc2MpOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZpY2UpOwogCiAgICAgICAgIC8vIHNhdmUgYSBjb3B5IG9mIHRoZSBvcGVuZWQgb3V0cHV0IGRlc2NyaXB0b3JzIGJlZm9yZSBhbnkgb3V0cHV0IGlzIG9wZW5lZCBvciBjbG9zZWQKICAgICAgICAgLy8gYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuIFRoaXMgd2lsbCBiZSBuZWVkZWQgYnkgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKQEAgLTE0MCwyMSArMTM1LDIzIEBACiAgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGNvbm5lY3Rpb24KICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTogewogICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvbm5lY3RpbmcgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIGNvbm5lY3RpbmcgZGV2aWNlICVzIGZvcm1hdCAleCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgZW5jb2RlZEZvcm1hdCk7CiAKICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5ldyBkZXZpY2UgYXMgYXZhaWxhYmxlCi0gICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKKyAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKGRldmljZSk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UsIGVuY29kZWRGb3JtYXQpOwogICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgbW9kdWxlIG5hbWU9JXMiLCBtb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5hdHRhY2gobW9kdWxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKQEAgLTE2Miw5MyArMTU5LDEyNCBAQAogCiAgICAgICAgICAgICAvLyBCZWZvcmUgY2hlY2tpbmcgb3V0cHV0cywgYnJvYWRjYXN0IGNvbm5lY3QgZXZlbnQgdG8gYWxsb3cgSEFMIHRvIHJldHJpZXZlIGR5bmFtaWMKICAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgb24gbmV3bHkgY29ubmVjdGVkIGRldmljZXMgKGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgb3V0cHV0cy4uLikKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAKLSAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgb3V0cHV0cykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKIAotICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBtSHdNb2R1bGVzLmNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKKworICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQotICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAogICAgICAgICAgICAgLy8gb3V0cHV0cyBzaG91bGQgbmV2ZXIgYmUgZW1wdHkgaGVyZQogICAgICAgICAgICAgQUxPR19BU1NFUlQob3V0cHV0cy5zaXplKCkgIT0gMCwgInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiIKICAgICAgICAgICAgICAgICAgICAgImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkIG5vIG91dHB1dHMgYnV0IHN0YXR1cyBPSyIpOwotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkICV6dSBvdXRwdXRzIiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkICV6dSBvdXRwdXRzIiwgX19mdW5jX18sIG91dHB1dHMuc2l6ZSgpKTsKIAogICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgZGlzY29ubmVjdGlvbgogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6IHsKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3Rpbmcgb3V0cHV0IGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBkaXNjb25uZWN0aW5nIG91dHB1dCBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAvLyBTZW5kIERpc2Nvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAogICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldmljZSk7CiAKLSAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgbU91dHB1dHMuY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGRldmljZSk7CisKKyAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBvdXRwdXRzKTsKKworICAgICAgICAgICAgLy8gUmVzZXQgYWN0aXZlIGRldmljZSBjb2RlYworICAgICAgICAgICAgZGV2aWNlLT5zZXRFbmNvZGVkRm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKIAogICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCi0gICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogICAgICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBfX2Z1bmNfXywgc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGNoZWNrQTJkcFN1c3BlbmQgbXVzdCBydW4gYmVmb3JlIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBzbyB0aGF0IEEyRFAKLSAgICAgICAgLy8gb3V0cHV0IGlzIHN1c3BlbmRlZCBiZWZvcmUgYW55IHRyYWNrcyBhcmUgbW92ZWQgdG8gaXQKLSAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgICAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAotICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIE5vIG5lZWQgdG8gZXZhbHVhdGUgcGxheWJhY2sgcm91dGluZyB3aGVuIGNvbm5lY3RpbmcgYSByZW1vdGUgc3VibWl4CisgICAgICAgIC8vIG91dHB1dCBkZXZpY2UgdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5IG9mIHR5cGUgcmVjb3JkZXIgYXMgbm8KKyAgICAgICAgLy8gcGxheWJhY2sgdXNlIGNhc2UgaXMgYWZmZWN0ZWQuCisgICAgICAgIGJvb2wgZG9DaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMgPSB0cnVlOworICAgICAgICBpZiAoZGV2aWNlLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisgICAgICAgICAgICAgICAgJiYgc3RybmNtcChkZXZpY2VfYWRkcmVzcywgIjAiLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSAhPSAwKSB7CiAgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBkZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzdHJuY21wKGRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRvQ2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCi0gICAgICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7CiAgICAgICAgIH0KIAotICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwotICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgYXV0byBjaGVja0Nsb3NlT3V0cHV0cyA9IFsmXSgpIHsKKyAgICAgICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKKyAgICAgICAgICAgIGlmICghb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjaGVjayBBMkRQIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH07CisKKyAgICAgICAgaWYgKGRvQ2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKSB7CisgICAgICAgICAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoY2hlY2tDbG9zZU91dHB1dHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hlY2tDbG9zZU91dHB1dHMoKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciBtc2RPdXREZXZpY2VzID0gZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKGRlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBmb3JjZSBkZXZpY2UgY2hhbmdlIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IGJlY2F1c2UgaWYgZGV2aWNlIGlzIDAsIGl0IHdpbGwKICAgICAgICAgICAgICAgICAvLyBhbHNvIGZvcmNlIGEgZGV2aWNlIDAgZm9yIHRoZSB0d28gb3V0cHV0cyBpdCBpcyBkdXBsaWNhdGVkIHRvIHdoaWNoIG1heSBvdmVycmlkZQogICAgICAgICAgICAgICAgIC8vIGEgdmFsaWQgZGV2aWNlIHNlbGVjdGlvbiBvbiB0aG9zZSBvdXRwdXRzLgotICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSAhZGVzYy0+aXNEdXBsaWNhdGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpCisgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IChtc2RPdXREZXZpY2VzLmlzRW1wdHkoKSB8fCBtc2RPdXREZXZpY2VzICE9IGRlc2MtPmRldmljZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFkZXNjLT5pc0R1cGxpY2F0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBmb3JjZSB3aGVuIGRpc2Nvbm5lY3RpbmcgKGEgbm9uLWR1cGxpY2F0ZWQgZGV2aWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkpOwotICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBuZXdEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIG5ld0RldmljZXMsIGZvcmNlLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB7Ci0gICAgICAgICAgICBjbGVhblVwRm9yRGV2aWNlKGRldkRlc2MpOworICAgICAgICAgICAgY2xlYW5VcEZvckRldmljZShkZXZpY2UpOwogICAgICAgICB9CiAKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwpAQCAtMjU2LDY3ICsyODQsNjYgQEAKICAgICB9ICAvLyBlbmQgaWYgaXMgb3V0cHV0IGRldmljZQogCiAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZXMKLSAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZVR5cGUpKSB7CiAgICAgICAgIFNvcnRlZFZlY3RvciA8YXVkaW9faW9faGFuZGxlX3Q+IGlucHV0czsKIAotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKGRldkRlc2MpOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKGRldmljZSk7CiAgICAgICAgIHN3aXRjaCAoc3RhdGUpCiAgICAgICAgIHsKICAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBjb25uZWN0aW9uCiAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKTogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEJlZm9yZSBjaGVja2luZyBpbnRwdXRzLCBicm9hZGNhc3QgY29ubmVjdCBldmVudCB0byBhbGxvdyBIQUwgdG8gcmV0cmlldmUgZHluYW1pYwogICAgICAgICAgICAgLy8gcGFyYW1ldGVycyBvbiBuZXdseSBjb25uZWN0ZWQgZGV2aWNlcyAoaW5zdGVhZCBvZiBvcGVuaW5nIHRoZSBpbnB1dHMuLi4pCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogCi0gICAgICAgICAgICBpZiAoY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIGlucHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgaWYgKGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUsIGlucHV0cykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKTsKKworICAgICAgICAgICAgICAgIG1Id01vZHVsZXMuY2xlYW5VcEZvckRldmljZShkZXZpY2UpOworCiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRldkRlc2MpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+YXR0YWNoKG1vZHVsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRldmljZSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCi0gICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2UgZGlzY29ubmVjdGlvbgogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6IHsKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgaW5wdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIGRpc2Nvbm5lY3RpbmcgaW5wdXQgZGV2aWNlICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAotICAgICAgICAgICAgY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIGlucHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpOwotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICBjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBpbnB1dHMpOworICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKIAogICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCi0gICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSBpbnZhbGlkIHN0YXRlOiAleCIsIF9fZnVuY19fLCBzdGF0ZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKQEAgLTMyNiwxOSArMzUzLDE5IEBACiAgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAKICAgICAgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewotICAgICAgICAgICAgY2xlYW5VcEZvckRldmljZShkZXZEZXNjKTsKKyAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKICAgICAgICAgfQogCiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0gLy8gZW5kIGlmIGlzIGlucHV0IGRldmljZQogCi0gICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlOiAleCIsIGRldmljZSk7CisgICAgQUxPR1coIiVzKCkgaW52YWxpZCBkZXZpY2U6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCkBAIC0zNDYsMTEgKzM3MywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQogewogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsICIiLAorICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsICIiLCBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd1RvQ3JlYXRlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oZGV2aWNlX2FkZHJlc3MpICE9IDApLyptYXRjaEFkZHJlc3MqLyk7CiAKICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSB1bmRlY2xhcmVkIGRldmljZSwgdHlwZSAlMDh4LCBhZGRyZXNzOiAlcyIsCisgICAgICAgIEFMT0dWKCJnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSB1bmRlY2xhcmVkIGRldmljZSwgdHlwZSAlMDh4LCBhZGRyZXNzOiAlcyIsCiAgICAgICAgICAgICAgIGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKICAgICB9CkBAIC0zNjIsNTUgKzM5MCw2NSBAQAogICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVJbnB1dERldmljZXM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlIHR5cGUgJTA4eCIsIGRldmljZSk7CisgICAgICAgIEFMT0dXKCIlcygpIGludmFsaWQgZGV2aWNlIHR5cGUgJTA4eCIsIF9fZnVuY19fLCBkZXZpY2UpOwogICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKICAgICB9CiAKLSAgICByZXR1cm4gKGRldmljZVZlY3Rvci0+Z2V0RGV2aWNlKGRldmljZSwgU3RyaW5nOChkZXZpY2VfYWRkcmVzcykpICE9IDApID8KKyAgICByZXR1cm4gKGRldmljZVZlY3Rvci0+Z2V0RGV2aWNlKAorICAgICAgICAgICAgICAgIGRldmljZSwgU3RyaW5nOChkZXZpY2VfYWRkcmVzcyksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSAhPSAwKSA/CiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSA6IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBTdHJpbmc4IHJlcGx5OwogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwogICAgIGludCBpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCA9IDA7CiAKLSAgICBBTE9HVigiaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKCgpIGRldmljZTogMHglWCwgYWRkcmVzcyAlcyBuYW1lICVzIiwKLSAgICAgICAgICBkZXZpY2UsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgQUxPR1YoImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgoKSBkZXZpY2U6IDB4JVgsIGFkZHJlc3MgJXMgbmFtZSAlcyBlbmNvZGVkRm9ybWF0OiAweCVYIiwKKyAgICAgICAgICBkZXZpY2UsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiAKICAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7CiAKICAgICAvLyBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KLSAgICAgICAgICAgIG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7Ci0gICAgaWYgKGluZGV4IDwgMCkgeworICAgIERldmljZVZlY3RvciBhdmFpbGFibGVEZXZpY2VzID0gZ2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CisgICAgaWYgKGRldmljZUxpc3QuZW1wdHkoKSkgewogICAgICAgICAvLyBOb3RoaW5nIHRvIGRvOiBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKIAogICAgIC8vIEZvciBvZmZsb2FkZWQgQTJEUCwgSHcgbW9kdWxlcyBtYXkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0bwotICAgIC8vIGNvbmZpZ3VyZSBjb2RlY3MuIENoZWNrIGlmIGFueSBvZiB0aGUgbG9hZGVkIGh3IG1vZHVsZXMKLSAgICAvLyBzdXBwb3J0cyB0aGlzLgotICAgIC8vIElmIHN1cHBvcnRlZCwgc2VuZCBhIHNldCBwYXJhbWV0ZXIgdG8gY29uZmlndXJlIEEyRFAgY29kZWNzCi0gICAgLy8gYW5kIHJldHVybi4gTm8gbmVlZCB0byB0b2dnbGUgZGV2aWNlIHN0YXRlLgorICAgIC8vIGNvbmZpZ3VyZSBjb2RlY3MuCisgICAgLy8gSGFuZGxlIHR3byBzcGVjaWZpYyBjYXNlcyBieSBzZW5kaW5nIGEgc2V0IHBhcmFtZXRlciB0bworICAgIC8vIGNvbmZpZ3VyZSBBMkRQIGNvZGVjcy4gTm8gbmVlZCB0byB0b2dnbGUgZGV2aWNlIHN0YXRlLgorICAgIC8vIENhc2UgMTogQTJEUCBhY3RpdmUgZGV2aWNlIHN3aXRjaGVzIGZyb20gcHJpbWFyeSB0byBwcmltYXJ5CisgICAgLy8gbW9kdWxlCisgICAgLy8gQ2FzZSAyOiBBMkRQIGRldmljZSBjb25maWcgY2hhbmdlcyBvbiBwcmltYXJ5IG1vZHVsZS4KICAgICBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgewotICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgICAgICAgICBBVURJT19JT19IQU5ETEVfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwU3VwcG9ydGVkKSk7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHJlcGxpZWRQYXJhbWV0ZXJzKHJlcGx5KTsKLSAgICAgICAgcmVwbGllZFBhcmFtZXRlcnMuZ2V0SW50KAotICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcFN1cHBvcnRlZCksIGlzUmVjb25maWdBMmRwU3VwcG9ydGVkKTsKLSAgICAgICAgaWYgKGlzUmVjb25maWdBMmRwU3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICBjb25zdCBTdHJpbmc4IGtleShBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwKTsKLSAgICAgICAgICAgIHBhcmFtLmFkZChrZXksIFN0cmluZzgoInRydWUiKSk7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZVR5cGVzKGRldmljZSwgZW5jb2RlZEZvcm1hdCk7CisgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBwcmltYXJ5SGFuZGxlID0gbVByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpOworICAgICAgICBpZiAoYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKS5jb250YWlucyhkZXZEZXNjKSAmJgorICAgICAgICAgICAobW9kdWxlICE9IDAgJiYgbW9kdWxlLT5nZXRIYW5kbGUoKSA9PSBwcmltYXJ5SGFuZGxlKSkgeworICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwU3VwcG9ydGVkKSk7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciByZXBsaWVkUGFyYW1ldGVycyhyZXBseSk7CisgICAgICAgICAgICByZXBsaWVkUGFyYW1ldGVycy5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcFN1cHBvcnRlZCksIGlzUmVjb25maWdBMmRwU3VwcG9ydGVkKTsKKyAgICAgICAgICAgIGlmIChpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHApOworICAgICAgICAgICAgICAgIHBhcmFtLmFkZChrZXksIFN0cmluZzgoInRydWUiKSk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGRldkRlc2MtPnNldEVuY29kZWRGb3JtYXQoZW5jb2RlZEZvcm1hdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC00MTgsNyArNDU2LDggQEAKICAgICAvLyBUaGlzIHdpbGwgZm9yY2UgcmVhZGluZyBhZ2FpbiB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmdldEVuY29kZWRGb3JtYXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HVygiaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKCkgZXJyb3IgZGlzYWJsaW5nIGNvbm5lY3Rpb24gc3RhdGU6ICVkIiwKICAgICAgICAgICAgICAgc3RhdHVzKTsKQEAgLTQyNyw3ICs0NjYsNyBAQAogCiAgICAgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HVygiaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKCkgZXJyb3IgZW5hYmxpbmcgY29ubmVjdGlvbiBzdGF0ZTogJWQiLAogICAgICAgICAgICAgICBzdGF0dXMpOwpAQCAtNDM3LDE2ICs0NzYsNDAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQoreworICAgIEFMT0dWKCJnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCkiKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdFNldDsKKyAgICBzcDxId01vZHVsZT4gcHJpbWFyeU1vZHVsZSA9CisgICAgICAgICAgICBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKTsKKyAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzID0gcHJpbWFyeU1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzaygKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGVjbGFyZWREZXZpY2VzKSB7CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoZGV2aWNlLT5lbmNvZGVkRm9ybWF0cygpLmJlZ2luKCksIGRldmljZS0+ZW5jb2RlZEZvcm1hdHMoKS5lbmQoKSk7CisgICAgfQorICAgIGZvcm1hdHMtPmFzc2lnbihmb3JtYXRTZXQuYmVnaW4oKSwgZm9ybWF0U2V0LmVuZCgpKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nKGNvbnN0IERldmljZVZlY3RvciAmcnhEZXZpY2VzLCB1aW50MzJfdCBkZWxheU1zKQogewogICAgIGJvb2wgY3JlYXRlVHhQYXRjaCA9IGZhbHNlOworICAgIGJvb2wgY3JlYXRlUnhQYXRjaCA9IGZhbHNlOwogICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSAwOwogCi0gICAgaWYoIWhhc1ByaW1hcnlPdXRwdXQoKSB8fCBtUHJpbWFyeU91dHB1dC0+ZGV2aWNlKCkgPT0gQVVESU9fREVWSUNFX09VVF9TVFVCKSB7CisgICAgaWYoIWhhc1ByaW1hcnlPdXRwdXQoKSB8fCBtUHJpbWFyeU91dHB1dC0+ZGV2aWNlcygpLnR5cGVzKCkgPT0gQVVESU9fREVWSUNFX09VVF9TVFVCKSB7CiAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwogICAgIH0KLSAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7Ci0gICAgQUxPR1YoInVwZGF0ZUNhbGxSb3V0aW5nIGRldmljZSByeERldmljZSAlMDh4IHR4RGV2aWNlICUwOHgiLCByeERldmljZSwgdHhEZXZpY2UpOworICAgIEFMT0dfQVNTRVJUKCFyeERldmljZXMuaXNFbXB0eSgpLCAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyBzZWxlY3RlZCBvdXRwdXQgZGV2aWNlIik7CisKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIH07CisgICAgYXV0byB0eFNvdXJjZURldmljZSA9IG1FbmdpbmUtPmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhhdHRyKTsKKyAgICBBTE9HX0FTU0VSVCh0eFNvdXJjZURldmljZSAhPSAwLCAidXBkYXRlQ2FsbFJvdXRpbmcoKSBpbnB1dCBzZWxlY3RlZCBkZXZpY2Ugbm90IGF2YWlsYWJsZSIpOworCisgICAgQUxPR1YoInVwZGF0ZUNhbGxSb3V0aW5nIGRldmljZSByeERldmljZSAlcyB0eERldmljZSAlcyIsCisgICAgICAgICAgcnhEZXZpY2VzLml0ZW1BdCgwKS0+dG9TdHJpbmcoKS5jX3N0cigpLCB0eFNvdXJjZURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgIC8vIHJlbGVhc2UgZXhpc3RpbmcgUlggcGF0Y2ggaWYgYW55CiAgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7CkBAIC00NTksNTcgKzUyMiw5MiBAQAogICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKICAgICB9CiAKLSAgICAvLyBJZiB0aGUgUlggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgdGhlbiB1c2UgbGVnYWN5IHJvdXRpbmcgbWV0aG9kIGZvciB2b2ljZSBjYWxscwotICAgIC8vIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KLSAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSB0d28gYXVkaW8gcGF0Y2hlcyBmb3IgVFggYW5kIFJYIHBhdGguCi0gICAgaWYgKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkgJiByeERldmljZSkgewotICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgdHJ1ZSwgZGVsYXlNcyk7CisgICAgYXV0byB0ZWxlcGhvbnlSeE1vZHVsZSA9CisgICAgICAgIG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZXMoQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIGF1dG8gdGVsZXBob255VHhNb2R1bGUgPQorICAgICAgICBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZVR5cGVzKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgLy8gcmV0cmlldmUgUnggU291cmNlIGFuZCBUeCBTaW5rIGRldmljZSBkZXNjcmlwdG9ycworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U291cmNlRGV2aWNlID0KKyAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTaW5rRGV2aWNlID0KKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworCisgICAgLy8gUlggYW5kIFRYIFRlbGVwaG9ueSBkZXZpY2UgYXJlIGRlY2xhcmVkIGJ5IFByaW1hcnkgQXVkaW8gSEFMCisgICAgaWYgKGlzUHJpbWFyeU1vZHVsZSh0ZWxlcGhvbnlSeE1vZHVsZSkgJiYgaXNQcmltYXJ5TW9kdWxlKHRlbGVwaG9ueVR4TW9kdWxlKSAmJgorICAgICAgICAgICAgKHRlbGVwaG9ueVJ4TW9kdWxlLT5nZXRIYWxWZXJzaW9uTWFqb3IoKSA+PSAzKSkgeworICAgICAgICBpZiAocnhTb3VyY2VEZXZpY2UgPT0gMCB8fCB0eFNpbmtEZXZpY2UgPT0gMCkgeworICAgICAgICAgICAgLy8gUlggLyBUWCBUZWxlcGhvbnkgZGV2aWNlKHMpIGlzKGFyZSkgbm90IGN1cnJlbnRseSBhdmFpbGFibGUKKyAgICAgICAgICAgIEFMT0dFKCJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBUeCBhbmQvb3IgUlggZGV2aWNlIik7CisgICAgICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICAgICAgfQorICAgICAgICAvLyBkbyBub3QgY3JlYXRlIGEgcGF0Y2ggKGFrYSBTdyBCcmlkZ2luZykgaWYgUHJpbWFyeSBIVyBtb2R1bGUgaGFzIGRlY2xhcmVkIHN1cHBvcnRpbmcgYQorICAgICAgICAvLyByb3V0ZSBiZXR3ZWVuIHRlbGVwaG9ueSBSWCB0byBTaW5rIGRldmljZSBhbmQgU291cmNlIGRldmljZSB0byB0ZWxlcGhvbnkgVFgKKyAgICAgICAgY29uc3QgYXV0byAmcHJpbWFyeU1vZHVsZSA9IHRlbGVwaG9ueVJ4TW9kdWxlOworICAgICAgICBjcmVhdGVSeFBhdGNoID0gIXByaW1hcnlNb2R1bGUtPnN1cHBvcnRzUGF0Y2gocnhTb3VyY2VEZXZpY2UsIHJ4RGV2aWNlcy5pdGVtQXQoMCkpOworICAgICAgICBjcmVhdGVUeFBhdGNoID0gIXByaW1hcnlNb2R1bGUtPnN1cHBvcnRzUGF0Y2godHhTb3VyY2VEZXZpY2UsIHR4U2lua0RldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgdGhlIFJYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHRoZW4gdXNlIGxlZ2FjeSByb3V0aW5nIG1ldGhvZCBmb3IKKyAgICAgICAgLy8gdm9pY2UgY2FsbHMgdmlhIHNldE91dHB1dERldmljZSgpIG9uIHByaW1hcnkgb3V0cHV0LgorICAgICAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSB0d28gYXVkaW8gcGF0Y2hlcyBmb3IgVFggYW5kIFJYIHBhdGguCisgICAgICAgIGNyZWF0ZVJ4UGF0Y2ggPSAhKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkuY29udGFpbnMocnhEZXZpY2VzLml0ZW1BdCgwKSkpICYmCisgICAgICAgICAgICAgICAgKHJ4U291cmNlRGV2aWNlICE9IDApOwogICAgICAgICAvLyBJZiB0aGUgVFggZGV2aWNlIGlzIGFsc28gb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCBzZXRPdXRwdXREZXZpY2UoKSB3aWxsIHRha2UgY2FyZQogICAgICAgICAvLyBvZiBpdCBkdWUgdG8gbGVnYWN5IGltcGxlbWVudGF0aW9uLiBJZiBub3QsIGNyZWF0ZSBhIHBhdGNoLgotICAgICAgICBpZiAoKGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKSAmIHR4RGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pCi0gICAgICAgICAgICAgICAgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOwotICAgICAgICB9CisgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSAhKGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKS5jb250YWlucyh0eFNvdXJjZURldmljZSkpICYmCisgICAgICAgICAgICAgICAgKHR4U2lua0RldmljZSAhPSAwKTsKKyAgICB9CisgICAgLy8gVXNlIGxlZ2FjeSByb3V0aW5nIG1ldGhvZCBmb3Igdm9pY2UgY2FsbHMgdmlhIHNldE91dHB1dERldmljZSgpIG9uIHByaW1hcnkgb3V0cHV0LgorICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIHR3byBhdWRpbyBwYXRjaGVzIGZvciBUWCBhbmQgUlggcGF0aC4KKyAgICBpZiAoIWNyZWF0ZVJ4UGF0Y2gpIHsKKyAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlcywgdHJ1ZSwgZGVsYXlNcyk7CiAgICAgfSBlbHNlIHsgLy8gY3JlYXRlIFJYIHBhdGggYXVkaW8gcGF0Y2gKLSAgICAgICAgbUNhbGxSeFBhdGNoID0gY3JlYXRlVGVsZXBob255UGF0Y2godHJ1ZSAvKmlzUngqLywgcnhEZXZpY2UsIGRlbGF5TXMpOwotICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKKyAgICAgICAgbUNhbGxSeFBhdGNoID0gY3JlYXRlVGVsZXBob255UGF0Y2godHJ1ZSAvKmlzUngqLywgcnhEZXZpY2VzLml0ZW1BdCgwKSwgZGVsYXlNcyk7CisKKyAgICAgICAgLy8gSWYgdGhlIFRYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUgYnV0IFJYIGRldmljZSBpcworICAgICAgICAvLyBvbiBvdGhlciBIVyBtb2R1bGUsIFNpbmtNZXRhRGF0YSBvZiB0ZWxlcGhvbnkgaW5wdXQgc2hvdWxkIGhhbmRsZSBpdAorICAgICAgICAvLyBhc3N1bWluZyB0aGUgZGV2aWNlIHVzZXMgYXVkaW8gSEFMIFY1LjAgYW5kIGFib3ZlCiAgICAgfQogICAgIGlmIChjcmVhdGVUeFBhdGNoKSB7IC8vIGNyZWF0ZSBUWCBwYXRoIGF1ZGlvIHBhdGNoCi0gICAgICAgIG1DYWxsVHhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGZhbHNlIC8qaXNSeCovLCB0eERldmljZSwgZGVsYXlNcyk7CisgICAgICAgIG1DYWxsVHhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGZhbHNlIC8qaXNSeCovLCB0eFNvdXJjZURldmljZSwgZGVsYXlNcyk7CiAgICAgfQogCiAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiB9CiAKIHNwPEF1ZGlvUGF0Y2g+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y3JlYXRlVGVsZXBob255UGF0Y2goCi0gICAgICAgIGJvb2wgaXNSeCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdWludDMyX3QgZGVsYXlNcykgewotICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICAgICAgYm9vbCBpc1J4LCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKSB7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U291cmNlRGV2aWNlRGVzYzsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogICAgIGlmIChpc1J4KSB7Ci0gICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UobUF2YWlsYWJsZU91dHB1dERldmljZXMsIGRldmljZSwgJnBhdGNoLnNpbmtzWzBdKTsKLSAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCAmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKGRldmljZSkuCisgICAgICAgICAgICAgICAgYWRkU291cmNlKG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdHhTb3VyY2VEZXZpY2VEZXNjID0gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBkZXZpY2UsICZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsICZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UoZGV2aWNlKS4KKyAgICAgICAgICAgICAgICBhZGRTaW5rKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKICAgICB9CiAKLSAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlID0gaXNSeCA/IGRldmljZSA6IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2Uob3V0cHV0RGV2aWNlLCBtT3V0cHV0cyk7CisgICAgLy8gQFRPRE86IHN0aWxsIGlnbm9yaW5nIHRoZSBhZGRyZXNzLCBvciBub3QgZGVhbGluZyBwbGF0Zm9ybSB3aXRoIG11dGxpcGxlIHRlbGVwaG9ueWRldmljZXMKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBvdXRwdXREZXZpY2UgPSBpc1J4ID8KKyAgICAgICAgICAgICAgICBkZXZpY2UgOiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZXMoRGV2aWNlVmVjdG9yKG91dHB1dERldmljZSksIG1PdXRwdXRzKTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgQVVESU9fRk9STUFUX0lOVkFMSUQpOwogICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIHRhcmdldCBkZXZpY2UKICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKLSAgICAgICAgICAgICAgICAiJXMoKSAlI3ggZGV2aWNlIG91dHB1dCAlZCBpcyBkdXBsaWNhdGVkIiwgX19mdW5jX18sIG91dHB1dERldmljZSwgb3V0cHV0KTsKLSAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOwotICAgICAgICBwYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0g7Ci0gICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLCAiJXMoKSAlcyBkZXZpY2Ugb3V0cHV0ICVkIGlzIGR1cGxpY2F0ZWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIG91dHB1dCk7CisgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2Uob3V0cHV0RGVzYywgeyAuc3RyZWFtID0gQVVESU9fU1RSRUFNX1BBVENIIH0pOwogICAgIH0KIAogICAgIGlmICghaXNSeCkgewpAQCAtNTE4LDM5ICs2MTYsNTAgQEAKICAgICAgICAgLy8gY2FsbCBUWCBkZXZpY2UgYnV0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGluIHRoZSBhdWRpbyBwYXRjaCBhbmQgbG9naWMgaGVyZSBtdXN0IGJlCiAgICAgICAgIC8vIHN5bW1ldHJpYyB0byB0aGUgb25lIGluIHN0YXJ0SW5wdXQoKQogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlRGVzYy0+aGFzU2FtZUh3TW9kdWxlQXModHhTb3VyY2VEZXZpY2VEZXNjKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGFjdGl2ZVNlc3Npb25zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMua2V5QXQoaik7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVEZXNjLT5tSW9IYW5kbGUsIGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlRGVzYy0+bUlvSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWN0aXZlRGVzYy0+aGFzU2FtZUh3TW9kdWxlQXMoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGNsb3NlQWN0aXZlQ2xpZW50cyhhY3RpdmVEZXNjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIHBhdGNoQnVpbGRlci5wYXRjaCgpLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CiAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAogICAgICAgICAgICAgIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgJXMgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzLCBpc1J4ID8gIlJYIiA6ICJUWCIpOwogICAgIHNwPEF1ZGlvUGF0Y2g+IGF1ZGlvUGF0Y2g7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBhdWRpb1BhdGNoID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgYXVkaW9QYXRjaCA9IG5ldyBBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLCBtVWlkQ2FjaGVkKTsKICAgICAgICAgYXVkaW9QYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwogICAgICAgICBhdWRpb1BhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKICAgICB9CiAgICAgcmV0dXJuIGF1ZGlvUGF0Y2g7CiB9CiAKLXNwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kRGV2aWNlKAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0IHsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOwogICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKICAgICAgICAgICAgICIlcygpIHNlbGVjdGVkIGRldmljZSB0eXBlICUjeCBpcyBub3QgaW4gZGV2aWNlcyBsaXN0IiwgX19mdW5jX18sIGRldmljZSk7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgIGRldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Ci0gICAgcmV0dXJuIGRldmljZURlc2M7CisgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNb2R1bGVEZXZpY2VUeXBlcygKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3QgeworICAgIHNwPEh3TW9kdWxlPiBtb2QgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKG1vZHVsZUlkKTsKKyAgICByZXR1cm4gbW9kICE9IDAgPyBkZXZpY2VzLmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKG1vZC0+Z2V0SGFuZGxlKCkpIDogQVVESU9fREVWSUNFX05PTkU7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0RldmljZU9mTW9kdWxlKAorICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgY29uc3QgY2hhciAqbW9kdWxlSWQpIGNvbnN0IHsKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShtb2R1bGVJZCk7CisgICAgaWYgKG1vZHVsZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1vZHVsZS0+Z2V0SGFuZGxlKCkpCisgICAgICAgICAgICAgICAgLmluZGV4T2YoZGV2RGVzYykgIT0gTkFNRV9OT1RfRk9VTkQKKyAgICAgICAgICAgICAgICB8fCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUobW9kdWxlLT5nZXRIYW5kbGUoKSkKKyAgICAgICAgICAgICAgICAuaW5kZXhPZihkZXZEZXNjKSAhPSBOQU1FX05PVF9GT1VORDsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCkBAIC01NjQsMTQgKzY3Myw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgLy8vIE9wZW5zOiBjYW4gdGhlc2UgbGluZSBiZSBleGVjdXRlZCBhZnRlciB0aGUgc3dpdGNoIG9mIHZvbHVtZSBjdXJ2ZXM/Pz8KLSAgICAvLyBpZiBsZWF2aW5nIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkpIHsKICAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgZmFsc2UsIHRydWUpOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gZm9yY2UgcmVldmFsdWF0aW5nIGFjY2Vzc2liaWxpdHkgcm91dGluZyB3aGVuIGNhbGwgc3RvcHMKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgIH0KQEAgLTU4NCw0OCArNjg3LDQ3IEBACiAgICAgICAgICAgICAgICAgICB8fCAoaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkgJiYgKHN0YXRlICE9IG9sZFN0YXRlKSkpOwogCiAgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBwaG9uZSBzdGF0ZQotICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcygpOwogCiAgICAgaW50IGRlbGF5TXMgPSAwOwogICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewogICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGF1dG8gbXVzaWNTdHJhdGVneSA9IHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICAgICAgYXV0byBzb25pZmljYXRpb25TdHJhdGVneSA9IHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX0FMQVJNKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgLy8gbXV0ZSBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIHN0cmF0ZWdpZXMgYW5kIGRlbGF5IGRldmljZSBzd2l0Y2ggYnkgdGhlIGxhcmdlc3QKICAgICAgICAgICAgIC8vIGxhdGVuY3kgb2YgYW55IG91dHB1dCB3aGVyZSBlaXRoZXIgc3RyYXRlZ3kgaXMgYWN0aXZlLgogICAgICAgICAgICAgLy8gVGhpcyBhdm9pZCBzZW5kaW5nIHRoZSByaW5nIHRvbmUgb3IgbXVzaWMgdGFpbCBpbnRvIHRoZSBlYXJwaWVjZSBvciBoZWFkc2V0LgotICAgICAgICAgICAgaWYgKChpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIFNUUkFURUdZX01FRElBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpIHx8Ci0gICAgICAgICAgICAgICAgIGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpKSAmJgorICAgICAgICAgICAgaWYgKChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKG11c2ljU3RyYXRlZ3ksIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLCBzeXNUaW1lKSB8fAorICAgICAgICAgICAgICAgICBkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHNvbmlmaWNhdGlvblN0cmF0ZWd5LCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSkgJiYKICAgICAgICAgICAgICAgICAgICAgKGRlbGF5TXMgPCAoaW50KWRlc2MtPmxhdGVuY3koKSoyKSkgewogICAgICAgICAgICAgICAgIGRlbGF5TXMgPSBkZXNjLT5sYXRlbmN5KCkqMjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgdHJ1ZSwgZGVzYyk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCi0gICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLykpOwotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgZGVzYyk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAotICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUobXVzaWNTdHJhdGVneSwgdHJ1ZSwgZGVzYyk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUobXVzaWNTdHJhdGVneSwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywKKyAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCB0cnVlIC8qZnJvbUNhY2hlKi8pLnR5cGVzKCkpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHNvbmlmaWNhdGlvblN0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzb25pZmljYXRpb25TdHJhdGVneSwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywKKyAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX0FMQVJNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCB0cnVlIC8qZnJvbUNhY2hlKi8pLnR5cGVzKCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAvLyBOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IGdldE5ld091dHB1dERldmljZSgpIGlzIGNhbGxlZCBvbiB0aGUgcHJpbWFyeSBvdXRwdXQsCisgICAgICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlcygpIGlzIGNhbGxlZCBvbiB0aGUgcHJpbWFyeSBvdXRwdXQsCiAgICAgICAgIC8vIHRoZSBkZXZpY2UgcmV0dXJuZWQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWNoYWJsZSB2aWEgdGhpcyBvdXRwdXQKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIHJ4RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBlbmRpbmcgY2FsbAogICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCi0gICAgICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiByeERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgcnhEZXZpY2UgPSBtUHJpbWFyeU91dHB1dC0+ZGV2aWNlKCk7CisgICAgICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiByeERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByeERldmljZXMgPSBtUHJpbWFyeU91dHB1dC0+ZGV2aWNlcygpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewotICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcocnhEZXZpY2UsIGRlbGF5TXMpOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcocnhEZXZpY2VzLCBkZWxheU1zKTsKICAgICAgICAgfSBlbHNlIGlmIChvbGRTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKICAgICAgICAgICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgewogICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKQEAgLTYzNSw0MCArNzM3LDMwIEBACiAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOwogICAgICAgICAgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgZm9yY2UsIDApOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2VzLCBmb3JjZSwgMCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIGZvcmNlLCAwKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIHJlZXZhbHVhdGUgcm91dGluZyBvbiBhbGwgb3V0cHV0cyBpbiBjYXNlIHRyYWNrcyBoYXZlIGJlZW4gc3RhcnRlZCBkdXJpbmcgdGhlIGNhbGwKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgaWYgKHN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCB8fCBkZXNjICE9IG1QcmltYXJ5T3V0cHV0KSB7Ci0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgbmV3RGV2aWNlLCAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSwgMCAvKmRlbGF5TXMqLyk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIG5ld0RldmljZXMsICFuZXdEZXZpY2VzLmlzRW1wdHkoKSwgMCAvKmRlbGF5TXMqLyk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBpZiBlbnRlcmluZyBpbiBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCi0gICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCiAgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgaW4gY2FsbCBzdGF0ZSBtYW5hZ2VtZW50OiBuZXcgc3RhdGUgaXMgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIHRydWUsIHRydWUpOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gZm9yY2UgcmVldmFsdWF0aW5nIGFjY2Vzc2liaWxpdHkgcm91dGluZyB3aGVuIGNhbGwgc3RhcnRzCiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKICAgICB9CiAKICAgICAvLyBGbGFnIHRoYXQgcmluZ3RvbmUgdm9sdW1lIG11c3QgYmUgbGltaXRlZCB0byBtdXNpYyB2b2x1bWUgdW50aWwgd2UgZXhpdCBNT0RFX1JJTkdUT05FCi0gICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfUklOR1RPTkUgJiYKLSAgICAgICAgaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkpIHsKLSAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gZmFsc2U7Ci0gICAgfQorICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gKHN0YXRlID09IEFVRElPX01PREVfUklOR1RPTkUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSk7CiB9CiAKIGF1ZGlvX21vZGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFBob25lU3RhdGUoKSB7CkBAIC02NzYsNyArNzY4LDcgQEAKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCiB7CiAgICAgQUxPR1YoInNldEZvcmNlVXNlKCkgdXNhZ2UgJWQsIGNvbmZpZyAlZCwgbVBob25lU3RhdGUgJWQiLCB1c2FnZSwgY29uZmlnLCBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkpOwogICAgIGlmIChjb25maWcgPT0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpKSB7CkBAIC02OTIsOSArNzg0LDcgQEAKICAgICAgICAgICAgICh1c2FnZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSk7CiAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IGZvcmNlIHVzYWdlCi0gICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCk7CiAKICAgICAvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCiAgICAgLy8gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzIGhhbmRsZWQgYnkgc3lzdGVtIFVJCkBAIC03MDQsMjYgKzc5NCwyNyBAQAogICAgICAgICBkZWxheU1zID0gVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVM7CiAgICAgfQogICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICB3YWl0TXMgPSB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UsIGRlbGF5TXMpOworICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIHdhaXRNcyA9IHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMsIGRlbGF5TXMpOwogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgaWYgKChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fCAob3V0cHV0RGVzYyAhPSBtUHJpbWFyeU91dHB1dCkpIHsKLSAgICAgICAgICAgIHdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBuZXdEZXZpY2UsIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICAgICAgLy8gQXMgZG9uZSBpbiBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUsIHdlIGNvdWxkIGFsc28gZml4IGRlZmF1bHQgZGV2aWNlIGlzc3VlIGJ5CisgICAgICAgICAgICAvLyBwcmV2ZW50aW5nIHRoZSBmb3JjZSByZS1yb3V0aW5nIGluIGNhc2Ugb2YgZGVmYXVsdCBkZXYgdGhhdCBkaXN0aW5ndWlzaGVzIG9uIGFkZHJlc3MuCisgICAgICAgICAgICAvLyBMZXQncyBnaXZlIGJhY2sgdG8gZW5naW5lIGZ1bGwgZGV2aWNlIGNob2ljZSBkZWNpc2lvbiBob3dldmVyLgorICAgICAgICAgICAgd2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBuZXdEZXZpY2VzLCAhbmV3RGV2aWNlcy5pc0VtcHR5KCksIGRlbGF5TXMpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCAmJiAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSkgewotICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIG5ld0RldmljZSwgd2FpdE1zLCB0cnVlKTsKKyAgICAgICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsICYmICFuZXdEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIG5ld0RldmljZXMudHlwZXMoKSwgd2FpdE1zLCB0cnVlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGFjdGl2ZURlc2MpOworICAgICAgICBhdXRvIG5ld0RldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGFjdGl2ZURlc2MpOwogICAgICAgICAvLyBGb3JjZSBuZXcgaW5wdXQgc2VsZWN0aW9uIGlmIHRoZSBuZXcgZGV2aWNlIGNhbiBub3QgYmUgcmVhY2hlZCB2aWEgY3VycmVudCBpbnB1dAotICAgICAgICBpZiAoYWN0aXZlRGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKS50eXBlcygpICYKLSAgICAgICAgICAgICAgICAobmV3RGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7CisgICAgICAgIGlmIChhY3RpdmVEZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKG5ld0RldmljZSkpIHsKICAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgbmV3RGV2aWNlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNsb3NlSW5wdXQoYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKQEAgLTczNiwyOCArODI3LDMxIEBACiAgICAgQUxPR1YoInNldFN5c3RlbVByb3BlcnR5KCkgcHJvcGVydHkgJXMsIHZhbHVlICVzIiwgcHJvcGVydHksIHZhbHVlKTsKIH0KIAotLy8gRmluZCBhIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLCBldmVuIGlmIHRoZSBpbnB1dCBmbGFncyBkbwotLy8gbm90IGV4cGxpY2l0bHkgcmVxdWVzdCBhIGRpcmVjdCBvdXRwdXQKLXNwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCisvLyBGaW5kIGFuIG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQuIFdoZW4gImRpcmVjdE9ubHkiIGlzIHNldCwgcmVzdHJpY3QKKy8vIHNlYXJjaCB0byBwcm9maWxlcyBmb3IgZGlyZWN0IG91dHB1dHMuCitzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvck91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpcmVjdE9ubHkpCiB7Ci0gICAgLy8gb25seSByZXRhaW4gZmxhZ3MgdGhhdCB3aWxsIGRyaXZlIHRoZSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgc2VsZWN0aW9uCi0gICAgLy8gaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1JlbGV2YW50RmxhZ3MgPQotICAgICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKLSAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYKTsKLSAgICBmbGFncyA9Ci0gICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKGZsYWdzICYga1JlbGV2YW50RmxhZ3MpIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBpZiAoZGlyZWN0T25seSkgeworICAgICAgICAvLyBvbmx5IHJldGFpbiBmbGFncyB0aGF0IHdpbGwgZHJpdmUgdGhlIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBzZWxlY3Rpb24KKyAgICAgICAgLy8gaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxldmFudEZsYWdzID0KKyAgICAgICAgICAgICAgICAoQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfAorICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYKTsKKyAgICAgICAgZmxhZ3MgPQorICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSgoZmxhZ3MgJiBrUmVsZXZhbnRGbGFncykgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIH0KIAogICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY3VyUHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7Ci0gICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIE5VTEwgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCiAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgTlVMTCAvKnVwZGF0ZWRGb3JtYXQqLywKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIE5VTEwgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLywKQEAgLTc2NSwxMCArODU5LDE2IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyByZWplY3QgcHJvZmlsZXMgbm90IGNvcnJlc3BvbmRpbmcgdG8gYSBkZXZpY2UgY3VycmVudGx5IGF2YWlsYWJsZQotICAgICAgICAgICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgY3VyUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoY3VyUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgc2V2ZXJhbCBwcm9maWxlcyBhcmUgY29tcGF0aWJsZSwgZ2l2ZSBwcmlvcml0eSB0byBvbmUgd2l0aCBvZmZsb2FkIGNhcGFiaWxpdHkKKyAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBpZiBjb25uZWN0ZWQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29kZWMKKyAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRpcmVjdE9ubHkpIHJldHVybiBjdXJQcm9maWxlOworICAgICAgICAgICAgLy8gd2hlbiBzZWFyY2hpbmcgZm9yIGRpcmVjdCBvdXRwdXRzLCBpZiBzZXZlcmFsIHByb2ZpbGVzIGFyZSBjb21wYXRpYmxlLCBnaXZlIHByaW9yaXR5CisgICAgICAgICAgICAvLyB0byBvbmUgd2l0aCBvZmZsb2FkIGNhcGFiaWxpdHkKICAgICAgICAgICAgIGlmIChwcm9maWxlICE9IDAgJiYgKChjdXJQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTc4Myw4ICs4ODMsNyBAQAogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwogCiAgICAgLy8gTm90ZSB0aGF0IHJlbGF0ZWQgbWV0aG9kIGdldE91dHB1dEZvckF0dHIoKSB1c2VzIGdldE91dHB1dEZvckRldmljZSgpIG5vdCBzZWxlY3RPdXRwdXQoKS4KICAgICAvLyBXZSB1c2Ugc2VsZWN0T3V0cHV0KCkgaGVyZSBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSBkZXNpcmVkIEF1ZGlvVHJhY2sgc2FtcGxlIHJhdGUsCkBAIC03OTIsMTMgKzg5MSwxNTIgQEAKICAgICAvLyBnZXRPdXRwdXQoKSBzb2xlbHkgb24gYXVkaW9fc3RyZWFtX3R5cGUgc3VjaCBhcyBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgpCiAgICAgLy8gYW5kIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoKS4KIAotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMoZGV2aWNlcywgbU91dHB1dHMpOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CiAKLSAgICBBTE9HVigiZ2V0T3V0cHV0KCkgc3RyZWFtICVkIHNlbGVjdGVkIGRldmljZSAlMDh4LCBvdXRwdXQgJWQiLCBzdHJlYW0sIGRldmljZSwgb3V0cHV0KTsKKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkgc3RyZWFtICVkIHNlbGVjdGVkIGRldmljZXMgJXMsIG91dHB1dCAlZCIsIHN0cmVhbSwKKyAgICAgICAgICBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgb3V0cHV0KTsKICAgICByZXR1cm4gb3V0cHV0OwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvQXR0cmlidXRlcyhhdWRpb19hdHRyaWJ1dGVzX3QgKmRzdEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnNyY0F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSkKK3sKKyAgICBpZiAoc3JjQXR0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmICghaXNWYWxpZEF0dHJpYnV0ZXMoc3JjQXR0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgc3JjQXR0ci0+dXNhZ2UsIHNyY0F0dHItPmNvbnRlbnRfdHlwZSwgc3JjQXR0ci0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHNyY0F0dHItPnRhZ3MpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAqZHN0QXR0ciA9ICpzcmNBdHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzcmNTdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHNyY1N0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiAgaW52YWxpZCBzdHJlYW0gdHlwZSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKmRzdEF0dHIgPSBtRW5naW5lLT5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzcmNTdHJlYW0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yQXR0ckludCgKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICpyZXN1bHRBdHRyLAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICBib29sICppc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiAqc2Vjb25kYXJ5RGVzY3MpCit7CisgICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXM7CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCByZXF1ZXN0ZWRQb3J0SWQgPSAqc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBEZXZpY2VWZWN0b3IgbXNkRGV2aWNlcyA9IGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpOworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IHJlcXVlc3RlZERldmljZSA9CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChyZXF1ZXN0ZWRQb3J0SWQpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9BdHRyaWJ1dGVzKHJlc3VsdEF0dHIsIGF0dHIsICpzdHJlYW0pOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgKnN0cmVhbSA9IG1FbmdpbmUtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKCpyZXN1bHRBdHRyKTsKKworICAgIEFMT0dWKCIlcygpIGF0dHJpYnV0ZXM9JXMgc3RyZWFtPSVzIHNlc3Npb24gJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgIHRvU3RyaW5nKCpyZXN1bHRBdHRyKS5jX3N0cigpLCB0b1N0cmluZygqc3RyZWFtKS5jX3N0cigpLCBzZXNzaW9uLCByZXF1ZXN0ZWRQb3J0SWQpOworCisgICAgLy8gVGhlIHByaW1hcnkgb3V0cHV0IGlzIHRoZSBleHBsaWNpdCByb3V0aW5nIChlZy4gc2V0UHJlZmVycmVkRGV2aWNlKSBpZiBzcGVjaWZpZWQsCisgICAgLy8gICAgICAgb3RoZXJ3aXNlLCBmYWxsYmFjayB0byB0aGUgZHluYW1pYyBwb2xpY2llcywgaWYgbm9uZSBtYXRjaCwgcXVlcnkgdGhlIGVuZ2luZS4KKyAgICAvLyBTZWNvbmRhcnkgb3V0cHV0cyBhcmUgYWx3YXlzIGZvdW5kIGJ5IGR5bmFtaWMgcG9saWNpZXMgYXMgdGhlIGVuZ2luZSBkbyBub3Qgc3VwcG9ydCB0aGVtCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHBvbGljeURlc2M7CisgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKCpyZXN1bHRBdHRyLCB1aWQsIHBvbGljeURlc2MsIHNlY29uZGFyeURlc2NzKSAhPSBOT19FUlJPUikgeworICAgICAgICBwb2xpY3lEZXNjID0gbnVsbHB0cjsgLy8gcmVzZXQgZ2V0T3V0cHV0Rm9yQXR0ciBpbiBjYXNlIG9mIGZhaWx1cmUKKyAgICAgICAgc2Vjb25kYXJ5RGVzY3MtPmNsZWFyKCk7CisgICAgfQorICAgIC8vIEV4cGxpY2l0IHJvdXRpbmcgaXMgaGlnaGVyIHByaW9yaXR5IHRoZW4gYW55IGR5bmFtaWMgcG9saWN5IHByaW1hcnkgb3V0cHV0CisgICAgYm9vbCB1c2VQcmltYXJ5T3V0cHV0RnJvbVBvbGljeU1peGVzID0gcmVxdWVzdGVkRGV2aWNlID09IG51bGxwdHIgJiYgcG9saWN5RGVzYyAhPSBudWxscHRyOworCisgICAgLy8gRklYTUU6IGluIGNhc2Ugb2YgUkVOREVSIHBvbGljeSwgdGhlIG91dHB1dCBjYXBhYmlsaXRpZXMgc2hvdWxkIGJlIGNoZWNrZWQKKyAgICBpZiAoKHVzZVByaW1hcnlPdXRwdXRGcm9tUG9saWN5TWl4ZXMgfHwgIXNlY29uZGFyeURlc2NzLT5lbXB0eSgpKQorICAgICAgICAmJiAhYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKKyAgICAgICAgQUxPR0QoIiVzOiByZWplY3RpbmcgcmVxdWVzdCBhcyBkeW5hbWljIGF1ZGlvIHBvbGljeSBvbmx5IHN1cHBvcnQgcGNtIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAodXNlUHJpbWFyeU91dHB1dEZyb21Qb2xpY3lNaXhlcykgeworICAgICAgICAqb3V0cHV0ID0gcG9saWN5RGVzYy0+bUlvSGFuZGxlOworICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gbWl4ID0gcG9saWN5RGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShtaXgtPm1EZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gZGV2aWNlRGVzYyAhPSAwID8gZGV2aWNlRGVzYy0+Z2V0SWQoKSA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQiLCAqb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICAvLyBWaXJ0dWFsIHNvdXJjZXMgbXVzdCBhbHdheXMgYmUgZHluYW1pY2FseSBvciBleHBsaWNpdGx5IHJvdXRlZAorICAgIGlmIChyZXN1bHRBdHRyLT51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSkgeworICAgICAgICBBTE9HVygiZ2V0T3V0cHV0Rm9yQXR0cigpIG5vIHBvbGljeSBtaXggZm91bmQgZm9yIHVzYWdlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIC8vIGV4cGxpY2l0IHJvdXRpbmcgbWFuYWdlZCBieSBnZXREZXZpY2VGb3JTdHJhdGVneSBpbiBBUE0gaXMgbm93IGhhbmRsZWQgYnkgZW5naW5lCisgICAgLy8gaW4gb3JkZXIgdG8gbGV0IHRoZSBjaG9pY2Ugb2YgdGhlIG9yZGVyIHRvIGZ1dHVyZSB2ZW5kb3IgZW5naW5lCisgICAgb3V0cHV0RGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCpyZXN1bHRBdHRyLCByZXF1ZXN0ZWREZXZpY2UsIGZhbHNlKTsKKworICAgIGlmICgocmVzdWx0QXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisKKyAgICAvLyBTZXQgaW5jYWxsIG11c2ljIG9ubHkgaWYgZGV2aWNlIHdhcyBleHBsaWNpdGx5IHNldCwgYW5kIGZhbGxiYWNrIHRvIHRoZSBkZXZpY2Ugd2hpY2ggaXMKKyAgICAvLyBjaG9zZW4gYnkgdGhlIGVuZ2luZSBpZiBub3QuCisgICAgLy8gRklYTUU6IHByb3ZpZGUgYSBtb3JlIGdlbmVyaWMgYXBwcm9hY2ggd2hpY2ggaXMgbm90IGRldmljZSBzcGVjaWZpYyBhbmQgbW92ZSB0aGlzIGJhY2sKKyAgICAvLyB0byBnZXRPdXRwdXRGb3JEZXZpY2UuCisgICAgLy8gVE9ETzogUmVtb3ZlIGNoZWNrIG9mIEFVRElPX1NUUkVBTV9NVVNJQyBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZWQgb24gdGhlIGFwcCBzaWRlLgorICAgIGlmIChvdXRwdXREZXZpY2VzLnR5cGVzKCkgPT0gQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFggJiYKKyAgICAgICAgKCpzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDICB8fCByZXN1bHRBdHRyLT51c2FnZSA9PSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OKSAmJgorICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJgorICAgICAgICBpc0luQ2FsbCgpKSB7CisgICAgICAgIGlmIChyZXF1ZXN0ZWRQb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQzsKKyAgICAgICAgICAgICppc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiJXMoKSBkZXZpY2UgJXMsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsIGZsYWdzICUjeCBzdHJlYW0gJXMiLAorICAgICAgICAgIF9fZnVuY19fLCBvdXRwdXREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssICpmbGFncywgdG9TdHJpbmcoKnN0cmVhbSkuY19zdHIoKSk7CisKKyAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgaWYgKCFtc2REZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlcyhtc2REZXZpY2VzLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gb3V0cHV0RGV2aWNlcy5pc0VtcHR5KCkgPyBudWxscHRyIDogb3V0cHV0RGV2aWNlcy5pdGVtQXQoMCk7CisgICAgICAgIGlmICgqb3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FICYmIHNldE1zZFBhdGNoKGRldmljZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIFVzaW5nIE1TRCBkZXZpY2VzICVzIGluc3RlYWQgb2YgZGV2aWNlcyAlcyIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbXNkRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIG91dHB1dERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIG91dHB1dERldmljZXMgPSBtc2REZXZpY2VzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgfQorICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2VzKG91dHB1dERldmljZXMsIHNlc3Npb24sICpzdHJlYW0sIGNvbmZpZywKKyAgICAgICAgICAgICAgICBmbGFncywgYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX01VVEVfSEFQVElDKTsKKyAgICB9CisgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgICpzZWxlY3RlZERldmljZUlkID0gZ2V0Rmlyc3REZXZpY2VJZChvdXRwdXREZXZpY2VzKTsKKworICAgIEFMT0dWKCIlcyByZXR1cm5zIG91dHB1dCAlZCBzZWxlY3RlZERldmljZUlkICVkIiwgX19mdW5jX18sICpvdXRwdXQsICpzZWxlY3RlZERldmljZUlkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtODA3LDExMSArMTA0NSw3MyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpCiB7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKGF0dHIpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpIGludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgICAgICBhdHRyLT51c2FnZSwgYXR0ci0+Y29udGVudF90eXBlLCBhdHRyLT5mbGFncywKLSAgICAgICAgICAgICAgICAgIGF0dHItPnRhZ3MpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzID0gKmF0dHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCpzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8ICpzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyKCk6ICBpbnZhbGlkIHN0cmVhbSB0eXBlIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoKnN0cmVhbSwgJmF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAotICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgfQotCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7Ci0gICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKGF0dHJpYnV0ZXMsIHVpZCwgZGVzYykgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZGVzYyAhPSAwLCAiSW52YWxpZCBkZXNjIHJldHVybmVkIGJ5IGdldE91dHB1dEZvckF0dHIiKTsKLSAgICAgICAgaWYgKCFhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhjb25maWctPmZvcm1hdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0gICAgICAgICpvdXRwdXQgPSBkZXNjLT5tSW9IYW5kbGU7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQiLCAqb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSkgewotICAgICAgICBBTE9HVygiZ2V0T3V0cHV0Rm9yQXR0cigpIG5vIHBvbGljeSBtaXggZm91bmQgZm9yIHVzYWdlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSB1c2FnZT0lZCwgY29udGVudD0lZCwgdGFnPSVzIGZsYWdzPSUwOHgiCi0gICAgICAgICAgICAiIHNlc3Npb24gJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsCi0gICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlLCBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgYXR0cmlidXRlcy50YWdzLCBhdHRyaWJ1dGVzLmZsYWdzLAotICAgICAgICAgICAgc2Vzc2lvbiwgKnNlbGVjdGVkRGV2aWNlSWQpOwotCi0gICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0KLSAgICAvLyBFeHBsaWNpdCByb3V0aW5nPwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7Ci0gICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZCgqc2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgfQotICAgIG1PdXRwdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgKnN0cmVhbSwgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSwgZGV2aWNlRGVzYywgdWlkKTsKLQotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZhdHRyaWJ1dGVzKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotCi0gICAgaWYgKChhdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7Ci0gICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7Ci0gICAgfQotCi0gICAgLy8gU2V0IGluY2FsbCBtdXNpYyBvbmx5IGlmIGRldmljZSB3YXMgZXhwbGljaXRseSBzZXQsIGFuZCBmYWxsYmFjayB0byB0aGUgZGV2aWNlIHdoaWNoIGlzCi0gICAgLy8gY2hvc2VuIGJ5IHRoZSBlbmdpbmUgaWYgbm90LgotICAgIC8vIEZJWE1FOiBwcm92aWRlIGEgbW9yZSBnZW5lcmljIGFwcHJvYWNoIHdoaWNoIGlzIG5vdCBkZXZpY2Ugc3BlY2lmaWMgYW5kIG1vdmUgdGhpcyBiYWNrCi0gICAgLy8gdG8gZ2V0T3V0cHV0Rm9yRGV2aWNlLgotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFggJiYKLSAgICAgICAgKnN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMgJiYKLSAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKLSAgICAgICAgaXNJbkNhbGwoKSkgewotICAgICAgICBpZiAoKnNlbGVjdGVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgZGV2aWNlIDB4JXgsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsICIKLSAgICAgICAgICAiZmxhZ3MgJSN4IiwKLSAgICAgICAgICBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgKmZsYWdzKTsKLQotICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKLSAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIC8vIFRoZSBzdXBwbGllZCBwb3J0SWQgbXVzdCBiZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgaWYgKCpwb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQorICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcmVxdWVzdGVkUG9ydElkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgYm9vbCBpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IGZhbHNlOworICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc2Vjb25kYXJ5T3V0cHV0RGVzY3M7CisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcmVxdWVzdGVkRGV2aWNlID0KKyAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChyZXF1ZXN0ZWRQb3J0SWQpOwogCi0gICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IG91dHB1dERldmljZXMuc2l6ZSgpID4gMCA/IG91dHB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgLy8gUHJldmVudCBmcm9tIHN0b3JpbmcgaW52YWxpZCByZXF1ZXN0ZWQgZGV2aWNlIGlkIGluIGNsaWVudHMKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHNhbml0aXplZFJlcXVlc3RlZFBvcnRJZCA9CisgICAgICByZXF1ZXN0ZWREZXZpY2UgIT0gbnVsbHB0ciA/IHJlcXVlc3RlZFBvcnRJZCA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBzYW5pdGl6ZWRSZXF1ZXN0ZWRQb3J0SWQ7CiAKLSAgICBBTE9HVigiICBnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsICpvdXRwdXQsICpzZWxlY3RlZERldmljZUlkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRPdXRwdXRGb3JBdHRySW50KCZyZXN1bHRBdHRyLCBvdXRwdXQsIHNlc3Npb24sIGF0dHIsIHN0cmVhbSwgdWlkLAorICAgICAgICAgICAgY29uZmlnLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgJmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dERlc2NzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gd2Vha1NlY29uZGFyeU91dHB1dERlc2NzOworICAgIGZvciAoYXV0byYgc2Vjb25kYXJ5RGVzYyA6IHNlY29uZGFyeU91dHB1dERlc2NzKSB7CisgICAgICAgIHNlY29uZGFyeU91dHB1dHMtPnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB3ZWFrU2Vjb25kYXJ5T3V0cHV0RGVzY3MucHVzaF9iYWNrKHNlY29uZGFyeURlc2MpOworICAgIH0KKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY2xpZW50Q29uZmlnID0gey5zYW1wbGVfcmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgIC5mb3JtYXQgPSBjb25maWctPmZvcm1hdCwKKyAgICAgICAgLmNoYW5uZWxfbWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrIH07CisgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+IGNsaWVudERlc2MgPQorICAgICAgICBuZXcgVHJhY2tDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHVpZCwgc2Vzc2lvbiwgcmVzdWx0QXR0ciwgY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbml0aXplZFJlcXVlc3RlZFBvcnRJZCwgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKHJlc3VsdEF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVm9sdW1lU291cmNlKHJlc3VsdEF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdlYWtTZWNvbmRhcnlPdXRwdXREZXNjcykpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IoKm91dHB1dCk7CisgICAgb3V0cHV0RGVzYy0+YWRkQ2xpZW50KGNsaWVudERlc2MpOworCisgICAgQUxPR1YoIiVzKCkgcmV0dXJucyBvdXRwdXQgJWQgcmVxdWVzdGVkUG9ydElkICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQgZm9yIHBvcnQgSUQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAqb3V0cHV0LCByZXF1ZXN0ZWRQb3J0SWQsICpzZWxlY3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JEZXZpY2UoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckRldmljZXMoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MpCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgYm9vbCBmb3JjZU11dGluZ0hhcHRpYykKIHsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAKKyAgICAvLyBEaXNjYXJkIGhhcHRpYyBjaGFubmVsIG1hc2sgd2hlbiBmb3JjaW5nIG11dGluZyBoYXB0aWMgY2hhbm5lbHMuCisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBmb3JjZU11dGluZ0hhcHRpYworICAgICAgICAgICAgPyAoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSA6IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOworCiAgICAgLy8gb3BlbiBhIGRpcmVjdCBvdXRwdXQgaWYgcmVxdWlyZWQgYnkgc3BlY2lmaWVkIHBhcmFtZXRlcnMKICAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCiAgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKQEAgLTkzNCw3ICsxMTM0LDggQEAKICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKICAgICAgICAgKmZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfVFRTOwogICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmCi0gICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSkgeworICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICgqZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUMpID09IDApIHsKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgICAgIEFMT0dWKCJTZXQgVm9JUCBhbmQgRGlyZWN0IG91dHB1dCBmbGFncyBmb3IgUENNIGZvcm1hdCIpOwpAQCAtOTQ3LDcgKzExNDgsNyBAQAogICAgIC8vIGFuZCBub3QgZXhwbGljaXRseSByZXF1ZXN0ZWQKICAgICBpZiAoKCgqZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApICYmCiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJiBjb25maWctPnNhbXBsZV9yYXRlIDw9IFNBTVBMRV9SQVRFX0haX01BWCAmJgotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSA8PSAyKSB7CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spIDw9IDIpIHsKICAgICAgICAgZ290byBub25fZGlyZWN0X291dHB1dDsKICAgICB9CiAKQEAgLTk2MCwxMSArMTE2MSwxMiBAQAogCiAgICAgaWYgKCgoKmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkgfHwKICAgICAgICAgICAgICEobUVmZmVjdHMuaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSB8fCBtTWFzdGVyTW9ubykpIHsKLSAgICAgICAgcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSpmbGFncyk7CisgICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yT3V0cHV0KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKICAgICB9CiAKICAgICBpZiAocHJvZmlsZSAhPSAwKSB7CkBAIC05NzYsMTAgKzExNzgsMTAgQEAKICAgICAgICAgICAgICAgICAvLyBhbmQgY29uZmlndXJlZCB3aXRoIHNhbWUgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgIGlmICgoY29uZmlnLT5zYW1wbGVfcmF0ZSA9PSBkZXNjLT5tU2FtcGxpbmdSYXRlKSAmJgogICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5mb3JtYXQgPT0gZGVzYy0+bUZvcm1hdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+Y2hhbm5lbF9tYXNrID09IGRlc2MtPm1DaGFubmVsTWFzaykgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IGRlc2MtPm1DaGFubmVsTWFzaykgJiYKICAgICAgICAgICAgICAgICAgICAgKHNlc3Npb24gPT0gZGVzYy0+bURpcmVjdENsaWVudFNlc3Npb24pKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1EaXJlY3RPcGVuQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koImdldE91dHB1dEZvckRldmljZSgpIHJldXNpbmcgZGlyZWN0IG91dHB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIGRpcmVjdCBvdXRwdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX2Z1bmNfXywgCiAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSwgc2Vzc2lvbik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKICAgICAgICAgICAgICAgICB9CkBAIC05OTMsMjEgKzExOTUsMzYgQEAKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPQogICAgICAgICAgICAgICAgIG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CiAKLSAgICAgICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gb3V0cHV0RGV2aWNlcy5zaXplKCkgPiAwID8gb3V0cHV0RGV2aWNlcy5pdGVtQXQoMCktPm1BZGRyZXNzCi0gICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKKyAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZ2V0Rmlyc3REZXZpY2VBZGRyZXNzKGRldmljZXMpOwogCi0gICAgICAgIHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4oY29uZmlnLCBkZXZpY2UsIGFkZHJlc3MsIHN0cmVhbSwgKmZsYWdzLCAmb3V0cHV0KTsKKyAgICAgICAgLy8gTVNEIHBhdGNoIG1heSBiZSB1c2luZyB0aGUgb25seSBvdXRwdXQgc3RyZWFtIHRoYXQgY2FuIHNlcnZpY2UgdGhpcyByZXF1ZXN0LiBSZWxlYXNlCisgICAgICAgIC8vIE1TRCBwYXRjaCB0byBwcmlvcml0aXplIHRoaXMgcmVxdWVzdCBvdmVyIGFueSBhY3RpdmUgb3V0cHV0IG9uIE1TRC4KKyAgICAgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gbXNkUGF0Y2hlcyA9IGdldE1zZFBhdGNoZXMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtc2RQYXRjaGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvJiBwYXRjaCA9IG1zZFBhdGNoZXNbaV07CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzOyArK2opIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmsgPSAmcGF0Y2gtPm1QYXRjaC5zaW5rc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAoc2luay0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc2luay0+ZXh0LmRldmljZS50eXBlICYgZGV2aWNlcy50eXBlcygpKSAhPSBBVURJT19ERVZJQ0VfTk9ORSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHJlc3MuaXNFbXB0eSgpIHx8IHN0cm5jbXAoc2luay0+ZXh0LmRldmljZS5hZGRyZXNzLCBhZGRyZXNzLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+bUhhbmRsZSwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4oY29uZmlnLCBkZXZpY2VzLCBzdHJlYW0sICpmbGFncywgJm91dHB1dCk7CiAKICAgICAgICAgLy8gb25seSBhY2NlcHQgYW4gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzCiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKICAgICAgICAgICAgIChjb25maWctPnNhbXBsZV9yYXRlICE9IDAgJiYgY29uZmlnLT5zYW1wbGVfcmF0ZSAhPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSB8fAogICAgICAgICAgICAgKGNvbmZpZy0+Zm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUICYmIGNvbmZpZy0+Zm9ybWF0ICE9IG91dHB1dERlc2MtPm1Gb3JtYXQpIHx8Ci0gICAgICAgICAgICAoY29uZmlnLT5jaGFubmVsX21hc2sgIT0gMCAmJiBjb25maWctPmNoYW5uZWxfbWFzayAhPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgZmFpbGVkIG9wZW5pbmcgZGlyZWN0IG91dHB1dDogb3V0cHV0ICVkIHNhbXBsZSByYXRlICVkICVkLCIKLSAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlZCAlZCwgY2hhbm5lbCBtYXNrICUwNHggJTA0eCIsIG91dHB1dCwgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIChjaGFubmVsTWFzayAhPSAwICYmIGNoYW5uZWxNYXNrICE9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBmYWlsZWQgb3BlbmluZyBkaXJlY3Qgb3V0cHV0OiBvdXRwdXQgJWQgc2FtcGxlIHJhdGUgJWQgJWQsIiAKKyAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlZCAlZCwgY2hhbm5lbCBtYXNrICUwNHggJTA0eCIsIF9fZnVuY19fLCBvdXRwdXQsIGNvbmZpZy0+c2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBvdXRwdXREZXNjLT5tRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7CiAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+Y2xvc2UoKTsKICAgICAgICAgICAgIH0KQEAgLTEwMTgsMTQgKzEyMzUsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgfQotICAgICAgICBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9IDA7Ci0gICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gMDsKICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA9IDE7CiAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RDbGllbnRTZXNzaW9uID0gc2Vzc2lvbjsKIAogICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKICAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOwotICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIEFMT0dWKCIlcyByZXR1cm5zIG5ldyBkaXJlY3Qgb3V0cHV0ICVkIiwgX19mdW5jX18sIG91dHB1dCk7CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgcmV0dXJuIG91dHB1dDsKICAgICB9CkBAIC0xMDQ2LDMwICsxMjYxLDE4OCBAQAogICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSkgewogICAgICAgICAvLyBnZXQgd2hpY2ggb3V0cHV0IGlzIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbS4gVGhlIGFjdHVhbAogICAgICAgICAvLyByb3V0aW5nIGNoYW5nZSB3aWxsIGhhcHBlbiB3aGVuIHN0YXJ0T3V0cHV0KCkgd2lsbCBiZSBjYWxsZWQKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMoZGV2aWNlcywgbU91dHB1dHMpOwogCiAgICAgICAgIC8vIGF0IHRoaXMgc3RhZ2Ugd2Ugc2hvdWxkIGlnbm9yZSB0aGUgRElSRUNUIGZsYWcgYXMgbm8gZGlyZWN0IG91dHB1dCBjb3VsZCBiZSBmb3VuZCBlYXJsaWVyCiAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgICAgIG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCAqZmxhZ3MsIGNvbmZpZy0+Zm9ybWF0KTsKKyAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsICpmbGFncywgY29uZmlnLT5mb3JtYXQsIGNoYW5uZWxNYXNrLCBjb25maWctPnNhbXBsZV9yYXRlKTsKICAgICB9Ci0gICAgQUxPR1dfSUYoKG91dHB1dCA9PSAwKSwgImdldE91dHB1dEZvckRldmljZSgpIGNvdWxkIG5vdCBmaW5kIG91dHB1dCBmb3Igc3RyZWFtICVkLCAiCisgICAgQUxPR1dfSUYoKG91dHB1dCA9PSAwKSwgImdldE91dHB1dEZvckRldmljZXMoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgIgogICAgICAgICAgICAgInNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWxzICUjeCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICAgIHN0cmVhbSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCAqZmxhZ3MpOworICAgICAgICAgICAgc3RyZWFtLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY2hhbm5lbE1hc2ssICpmbGFncyk7CiAKICAgICByZXR1cm4gb3V0cHV0OwogfQogCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZEF1ZGlvSW5EZXZpY2UoKSBjb25zdCB7CisgICAgYXV0byBtc2RJbkRldmljZXMgPSBtSHdNb2R1bGVzLmdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgcmV0dXJuIG1zZEluRGV2aWNlcy5pc0VtcHR5KCk/IG51bGxwdHIgOiBtc2RJbkRldmljZXMuaXRlbUF0KDApOworfQorCitEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RBdWRpb091dERldmljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Id01vZHVsZXMuZ2V0QXZhaWxhYmxlRGV2aWNlc0Zyb21Nb2R1bGVOYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKK30KKworY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RQYXRjaGVzKCkgY29uc3QgeworICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXM7CisgICAgc3A8SHdNb2R1bGU+IG1zZE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CisgICAgaWYgKG1zZE1vZHVsZSAhPSAwKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUGF0Y2hlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2ggPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhdGNoLT5tUGF0Y2gubnVtX3NvdXJjZXM7ICsraikgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlID0gJnBhdGNoLT5tUGF0Y2guc291cmNlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+ZXh0LmRldmljZS5od19tb2R1bGUgPT0gbXNkTW9kdWxlLT5nZXRIYW5kbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBtc2RQYXRjaGVzLmFkZEF1ZGlvUGF0Y2gocGF0Y2gtPm1IYW5kbGUsIHBhdGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1zZFBhdGNoZXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QmVzdE1zZEF1ZGlvUHJvZmlsZUZvcihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlLAorICAgICAgICBib29sIGh3QXZTeW5jLCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlQ29uZmlnLCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua0NvbmZpZykgY29uc3QKK3sKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgdW5hYmxlIHRvIGdldCBNU0QgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3A8SHdNb2R1bGU+IGRldmljZU1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKG91dHB1dERldmljZSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIGlmIChkZXZpY2VNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSB1bmFibGUgdG8gZ2V0IG1vZHVsZSBmb3IgJXMiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgY29uc3QgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiAmaW5wdXRQcm9maWxlcyA9IG1zZE1vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpOworICAgIGlmIChpbnB1dFByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXMoKSBubyBpbnB1dCBwcm9maWxlcyBmb3IgTVNEIG1vZHVsZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZvdXRwdXRQcm9maWxlcyA9IGRldmljZU1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKKyAgICBpZiAob3V0cHV0UHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIG91dHB1dCBwcm9maWxlcyBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sIG91dHB1dERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBtc2RQcm9maWxlczsKKyAgICAvLyBFYWNoIElPUHJvZmlsZSByZXByZXNlbnRzIGEgTWl4UG9ydCBmcm9tIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorICAgIGZvciAoY29uc3QgYXV0byAmaW5Qcm9maWxlIDogaW5wdXRQcm9maWxlcykgeworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChpblByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7CisgICAgICAgICAgICBtc2RQcm9maWxlcy5hcHBlbmRWZWN0b3IoaW5Qcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICB9CisgICAgfQorICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBkZXZpY2VQcm9maWxlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dFByb2ZpbGUgOiBvdXRwdXRQcm9maWxlcykgeworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkpIHsKKyAgICAgICAgICAgIGRldmljZVByb2ZpbGVzLmFwcGVuZFZlY3RvcihvdXRQcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICB9CisgICAgfQorICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBiZXN0U2lua0NvbmZpZzsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtc2RQcm9maWxlcy5maW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGRldmljZVByb2ZpbGVzLAorICAgICAgICAgICAgY29tcHJlc3NlZEZvcm1hdHNPcmRlciwgc3Vycm91bmRDaGFubmVsTWFza3NPcmRlciwgdHJ1ZSAvKnByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMqLywKKyAgICAgICAgICAgICZiZXN0U2lua0NvbmZpZyk7CisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRCgiJXMoKSBubyBtYXRjaGluZyBwcm9maWxlcyBmb3VuZCBmb3IgZGV2aWNlOiAlcywgaHdBdlN5bmM6ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGh3QXZTeW5jKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgc2lua0NvbmZpZy0+c2FtcGxlX3JhdGUgPSBiZXN0U2lua0NvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICBzaW5rQ29uZmlnLT5jaGFubmVsX21hc2sgPSBiZXN0U2lua0NvbmZpZy5jaGFubmVsX21hc2s7CisgICAgc2lua0NvbmZpZy0+Zm9ybWF0ID0gYmVzdFNpbmtDb25maWcuZm9ybWF0OworICAgIC8vIEZvciBlbmNvZGVkIHN0cmVhbXMgZm9yY2UgZGlyZWN0IGZsYWcgdG8gcHJldmVudCBkb3duc3RyZWFtIG1peGluZy4KKyAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIHNvdXJjZUNvbmZpZy0+c2FtcGxlX3JhdGUgPSBiZXN0U2lua0NvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAvLyBTcGVjaWZ5IGV4YWN0IGNoYW5uZWwgbWFzayB0byBwcmV2ZW50IGd1ZXNzaW5nIGJ5IGJpdCBjb3VudCBpbiBQYXRjaFBhbmVsLgorICAgIHNvdXJjZUNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihiZXN0U2lua0NvbmZpZy5jaGFubmVsX21hc2spOworICAgIHNvdXJjZUNvbmZpZy0+Zm9ybWF0ID0gYmVzdFNpbmtDb25maWcuZm9ybWF0OworICAgIC8vIENvcHkgaW5wdXQgc3RyZWFtIGRpcmVjdGx5IHdpdGhvdXQgYW55IHByb2Nlc3NpbmcgKGUuZy4gcmVzYW1wbGluZykuCisgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCB8IEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBpZiAoaHdBdlN5bmMpIHsKKyAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOworICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICAgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCB8IEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFIHwKKyAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSyB8IEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCB8IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIHNpbmtDb25maWctPmNvbmZpZ19tYXNrIHw9IGNvbmZpZ19tYXNrOworICAgIHNvdXJjZUNvbmZpZy0+Y29uZmlnX21hc2sgfD0gY29uZmlnX21hc2s7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitQYXRjaEJ1aWxkZXIgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpidWlsZE1zZFBhdGNoKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UpIGNvbnN0Cit7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKGdldE1zZEF1ZGlvSW5EZXZpY2UoKSkuYWRkU2luayhvdXRwdXREZXZpY2UpOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNvdXJjZUNvbmZpZyA9IHBhdGNoQnVpbGRlci5wYXRjaCgpLT5zb3VyY2VzWzBdOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNpbmtDb25maWcgPSBwYXRjaEJ1aWxkZXIucGF0Y2goKS0+c2lua3NbMF07CisgICAgLy8gVE9ETzogRmlndXJlIG91dCB3aGV0aGVyIE1TRCBtb2R1bGUgaGFzIEhXX0FWX1NZTkMgZmxhZyBzZXQgaW4gdGhlIEFQIGNvbmZpZyBmaWxlLgorICAgIC8vIEZvciBub3csIHdlIGp1c3QgZm9yY2VmdWxseSB0cnkgd2l0aCBId0F2U3luYyBmaXJzdC4KKyAgICBzdGF0dXNfdCByZXMgPSBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKG91dHB1dERldmljZSwgdHJ1ZSAvKmh3QXZTeW5jKi8sCisgICAgICAgICAgICAmc291cmNlQ29uZmlnLCAmc2lua0NvbmZpZykgPT0gTk9fRVJST1IgPyBOT19FUlJPUiA6CisgICAgICAgICAgICBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UsIGZhbHNlIC8qaHdBdlN5bmMqLywgJnNvdXJjZUNvbmZpZywgJnNpbmtDb25maWcpOworICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gRm91bmQgYSBtYXRjaGluZyBwcm9maWxlIGZvciBlbmNvZGVkIGF1ZGlvLiBSZS1jcmVhdGUgUGF0Y2hCdWlsZGVyIHdpdGggdGhpcyBjb25maWcuCisgICAgICAgIHJldHVybiAoUGF0Y2hCdWlsZGVyKCkpLmFkZFNvdXJjZShzb3VyY2VDb25maWcpLmFkZFNpbmsoc2lua0NvbmZpZyk7CisgICAgfQorICAgIEFMT0dWKCIlcygpIG5vIG1hdGNoaW5nIHByb2ZpbGUgZm91bmQuIEZhbGwgdGhyb3VnaCB0byBkZWZhdWx0IFBDTSBwYXRjaCIKKyAgICAgICAgICAgICIgc3VwcG9ydGluZyBQQ00gZm9ybWF0IGNvbnZlcnNpb24uIiwgX19mdW5jX18pOworICAgIHJldHVybiBwYXRjaEJ1aWxkZXI7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0TXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSkgeworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG91dHB1dERldmljZTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gVXNlIG1lZGlhIHN0cmF0ZWd5IGZvciB1bnNwZWNpZmllZCBvdXRwdXQgZGV2aWNlLiBUaGlzIHNob3VsZCBvbmx5CisgICAgICAgIC8vIG9jY3VyIG9uIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcygpLiBEZXZpY2UgY29ubmVjdGlvbiBldmVudHMgbWF5CisgICAgICAgIC8vIHRoZXJlZm9yZSBpbnZhbGlkYXRlIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMuCisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLCBudWxscHRyLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXZpY2VzLmlzRW1wdHkoKSwgIm5vIG91dHB1ZGV2aWNlIHRvIHNldCBNc2QgUGF0Y2giKTsKKyAgICAgICAgZGV2aWNlID0gZGV2aWNlcy5pdGVtQXQoMCk7CisgICAgfQorICAgIEFMT0dWKCIlcygpIGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXIgPSBidWlsZE1zZFBhdGNoKGRldmljZSk7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCA9IHBhdGNoQnVpbGRlci5wYXRjaCgpOworICAgIGNvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgaWYgKCFtc2RQYXRjaGVzLmlzRW1wdHkoKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1zZFBhdGNoZXMuc2l6ZSgpID4gMSwKKyAgICAgICAgICAgICAgICAiVGhlIGN1cnJlbnQgTVNEIHByb3RvdHlwZSBvbmx5IHN1cHBvcnRzIG9uZSBvdXRwdXQgcGF0Y2giKTsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3VycmVudFBhdGNoID0gbXNkUGF0Y2hlcy52YWx1ZUF0KDApOworICAgICAgICBpZiAoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoJmN1cnJlbnRQYXRjaC0+bVBhdGNoLCBwYXRjaCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChjdXJyZW50UGF0Y2gtPm1IYW5kbGUsIG1VaWRDYWNoZWQpOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIC0xIC8qaW5kZXgqLywgbnVsbHB0ciAvKnBhdGNoSGFuZGxlKi8sCisgICAgICAgICAgICBwYXRjaCwgMCAvKmRlbGF5TXMqLywgbVVpZENhY2hlZCwgbnVsbHB0ciAvKnBhdGNoRGVzY1B0ciovKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcygpIGVycm9yICVkIGNyZWF0aW5nIE1TRCBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIEFMT0dJX0lGKHN0YXR1cyA9PSBOT19FUlJPUiwgIiVzKCkgUGF0Y2ggY3JlYXRlZCBmcm9tIE1TRF9JTiB0byAiCisgICAgICAgICAgICJkZXZpY2U6JXMgKGZvcm1hdDolI3ggY2hhbm5lbHM6JSN4IHNhbXBsZXJhdGU6JWQpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwKKyAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2ssIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlKQogewogICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgdGhhdCBwcm92aWRlIGEgcGF0aCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIG9yIHNldCBvZgotICAgIC8vIGRldmljZXMgKHRoZSBsaXN0IHdhcyBwcmV2aW91c2x5IGJ1aWxkIGJ5IGdldE91dHB1dHNGb3JEZXZpY2UoKSkuCisgICAgLy8gZGV2aWNlcyAodGhlIGxpc3Qgd2FzIHByZXZpb3VzbHkgYnVpbGQgYnkgZ2V0T3V0cHV0c0ZvckRldmljZXMoKSkuCiAgICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6Ci0gICAgLy8gMTogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgcG9saWN5IGZsYWdzCi0gICAgLy8gMjogdGhlIG91dHB1dCB3aXRoIHRoZSBiaXQgZGVwdGggdGhlIGNsb3Nlc3QgdG8gdGhlIHJlcXVlc3RlZCBvbmUKLSAgICAvLyAzOiB0aGUgcHJpbWFyeSBvdXRwdXQKLSAgICAvLyA0OiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CisgICAgLy8gMTogdGhlIG91dHB1dCBzdXBwb3J0aW5nIGhhcHRpYyBwbGF5YmFjayB3aGVuIHJlcXVlc3RpbmcgaGFwdGljIHBsYXliYWNrCisgICAgLy8gMjogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgcG9saWN5IGZsYWdzCisgICAgLy8gMzogdGhlIG91dHB1dCB3aXRoIHRoZSBiaXQgZGVwdGggdGhlIGNsb3Nlc3QgdG8gdGhlIHJlcXVlc3RlZCBvbmUKKyAgICAvLyA0OiB0aGUgcHJpbWFyeSBvdXRwdXQKKyAgICAvLyA1OiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CiAKICAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgewogICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC0xMDc5LDE4ICsxNDUyLDQ2IEBACiAgICAgfQogCiAgICAgaW50IG1heENvbW1vbkZsYWdzID0gMDsKKyAgICBjb25zdCBzaXplX3QgaGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgY2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvckZsYWdzID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yUHJpbWFyeSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvckZvcm1hdCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKICAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0Rm9yRmxhZ3MgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKIAorICAgIC8vIEZsYWdzIHdoaWNoIG11c3QgYmUgcHJlc2VudCBvbiBib3RoIHRoZSByZXF1ZXN0IGFuZCB0aGUgc2VsZWN0ZWQgb3V0cHV0CisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGtNYW5kYXRlZEZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KQorICAgICAgICAoQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyB8IEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpOworCiAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewogICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgaGFwdGljIGNoYW5uZWwgaXMgc3BlY2lmaWVkLCB1c2UgdGhlIGhhcHRpYyBvdXRwdXQgaWYgcHJlc2VudC4KKyAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgaGFwdGljIG91dHB1dCwgc2FtZSBhdWRpbyBmb3JtYXQgYW5kIHNhbXBsZSByYXRlIGFyZSByZXF1aXJlZC4KKyAgICAgICAgICAgIGlmIChoYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgaGFwdGljIGNoYW5uZWwgaXMgc3BlY2lmaWVkLCB1c2UgdGhlIGZpcnN0IG91dHB1dCB0aGF0CisgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBoYXB0aWMgcGxheWJhY2suCisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgPj0gaGFwdGljQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXQgPT0gb3V0cHV0RGVzYy0+bUZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2FtcGxpbmdSYXRlID09IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdoZW4gaGFwdGljIGNoYW5uZWwgaXMgbm90IHNwZWNpZmllZCwgc2tpcCBoYXB0aWMgb3V0cHV0LgorICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChrTWFuZGF0ZWRGbGFncyAmIGZsYWdzKSAhPQorICAgICAgICAgICAgICAgIChrTWFuZGF0ZWRGbGFncyAmIG91dHB1dERlc2MtPm1Qcm9maWxlLT5nZXRGbGFncygpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBpZiBhIHZhbGlkIGZvcm1hdCBpcyBzcGVjaWZpZWQsIHNraXAgb3V0cHV0IGlmIG5vdCBjb21wYXRpYmxlCiAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKQEAgLTExMzgsNjcgKzE1MzksMzIgQEAKICAgICByZXR1cm4gb3V0cHV0c1swXTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigic3RhcnRPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygic3RhcnRPdXRwdXQoKSBubyBvdXRwdXQgZm9yIGNsaWVudCAlZCIsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gb3V0cHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwKKyAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUsIGNsaWVudC0+c3RyZWFtKCksIGNsaWVudC0+c2Vzc2lvbigpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPnN0YXJ0KCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIC8vIFJvdXRpbmc/Ci0gICAgbU91dHB1dFJvdXRlcy5pbmNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotCi0gICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZTsKLSAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICphZGRyZXNzID0gTlVMTDsKLSAgICBpZiAob3V0cHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7Ci0gICAgICAgIHBvbGljeU1peCA9IG91dHB1dERlc2MtPm1Qb2xpY3lNaXg7Ci0gICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpOwotICAgICAgICBpZiAoKHBvbGljeU1peC0+bVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgewotICAgICAgICAgICAgbmV3RGV2aWNlID0gcG9saWN5TWl4LT5tRGV2aWNlVHlwZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld0RldmljZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobU91dHB1dFJvdXRlcy5nZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChzZXNzaW9uKSkgewotICAgICAgICBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGlmIChuZXdEZXZpY2UgIT0gb3V0cHV0RGVzYy0+ZGV2aWNlKCkpIHsKLSAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShnZXRTdHJhdGVneShzdHJlYW0pLCBvdXRwdXQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbmV3RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZGVsYXlNcyA9IDA7Ci0KLSAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBzdHJlYW0sIG5ld0RldmljZSwgYWRkcmVzcywgJmRlbGF5TXMpOworICAgIHVpbnQzMl90IGRlbGF5TXM7CisgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgY2xpZW50LCAmZGVsYXlNcyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1PdXRwdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKICAgICAgICAgb3V0cHV0RGVzYy0+c3RvcCgpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICAvLyBBdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdGFydGVkIG9uIGEgcmUgcm91dGluZyBtaXgKLSAgICAvLyBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShuZXdEZXZpY2UpICYmIHBvbGljeU1peCAhPSBOVUxMICYmCi0gICAgICAgICAgICBwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiKTsKLSAgICB9Ci0KICAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CiAgICAgICAgIHVzbGVlcChkZWxheU1zICogMTAwMCk7CiAgICAgfQpAQCAtMTIwNiwxOSArMTU3MiwyMiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRTb3VyY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGVsYXlNcykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKQogewogICAgIC8vIGNhbm5vdCBzdGFydCBwbGF5YmFjayBvZiBTVFJFQU1fVFRTIGlmIGFueSBvdGhlciBvdXRwdXQgaXMgYmVpbmcgdXNlZAogICAgIHVpbnQzMl90IGJlYWNvbk11dGVMYXRlbmN5ID0gMDsKIAogICAgICpkZWxheU1zID0gMDsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IGNsaWVudC0+c3RyZWFtKCk7CisgICAgYXV0byBjbGllbnRWb2xTcmMgPSBjbGllbnQtPnZvbHVtZVNvdXJjZSgpOworICAgIGF1dG8gY2xpZW50U3RyYXRlZ3kgPSBjbGllbnQtPnN0cmF0ZWd5KCk7CisgICAgYXV0byBjbGllbnRBdHRyID0gY2xpZW50LT5hdHRyaWJ1dGVzKCk7CiAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTKSB7CiAgICAgICAgIEFMT0dWKCJcdCBmb3VuZCBCRUFDT04gc3RyZWFtIik7Ci0gICAgICAgIGlmICghbVR0c091dHB1dEF2YWlsYWJsZSAmJiBtT3V0cHV0cy5pc0FueU91dHB1dEFjdGl2ZShBVURJT19TVFJFQU1fVFRTIC8qc3RyZWFtVG9JZ25vcmUqLykpIHsKKyAgICAgICAgaWYgKCFtVHRzT3V0cHV0QXZhaWxhYmxlICYmIG1PdXRwdXRzLmlzQW55T3V0cHV0QWN0aXZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1RUUykgLypzb3VyY2VUb0lnbm9yZSovKSkgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYmVhY29uTXV0ZUxhdGVuY3kgPSBoYW5kbGVFdmVudEZvckJlYWNvbihTVEFSVElOR19CRUFDT04pOwpAQCAtMTIzMyw2ICsxNjAyLDIzIEBACiAgICAgYm9vbCBmb3JjZSA9ICFvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmCiAgICAgICAgICAgICAob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSk7CiAKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gb3V0cHV0RGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9IE5VTEw7CisgICAgaWYgKHBvbGljeU1peCAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2VUeXBlOworICAgICAgICBhZGRyZXNzID0gcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKTsKKyAgICAgICAgaWYgKChwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKKyAgICAgICAgICAgIG5ld0RldmljZVR5cGUgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdEZXZpY2VUeXBlID0gcG9saWN5TWl4LT5tRGV2aWNlVHlwZTsKKyAgICAgICAgfQorICAgICAgICBzcCBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UobmV3RGV2aWNlVHlwZSwgU3RyaW5nOChhZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICBBTE9HX0FTU0VSVChkZXZpY2UsICIlczogbm8gZGV2aWNlIGZvdW5kIHQ9JXUsIGE9JXMiLCBfX2Z1bmNfXywgbmV3RGV2aWNlVHlwZSwgYWRkcmVzcyk7CisgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7CisgICAgfQorCiAgICAgLy8gcmVxdWlyZXNNdXRlQ2hlY2sgaXMgZmFsc2Ugd2hlbiB3ZSBjYW4gYnlwYXNzIG11dGUgc3RyYXRlZ3kuCiAgICAgLy8gSXQgY292ZXJzIGEgY29tbW9uIGNhc2Ugd2hlbiB0aGVyZSBpcyBubyBtYXRlcmlhbGx5IGFjdGl2ZSBhdWRpbwogICAgIC8vIGFuZCBtdXRpbmcgd291bGQgcmVzdWx0IGluIHVubmVjZXNzYXJ5IGRlbGF5IGFuZCBkcm9wcGVkIGF1ZGlvLgpAQCAtMTI0MiwzMSArMTYyOCwzNyBAQAogICAgIC8vIGluY3JlbWVudCB1c2FnZSBjb3VudCBmb3IgdGhpcyBzdHJlYW0gb24gdGhlIHJlcXVlc3RlZCBvdXRwdXQ6CiAgICAgLy8gTk9URSB0aGF0IHRoZSB1c2FnZSBjb3VudCBpcyB0aGUgc2FtZSBmb3IgZHVwbGljYXRlZCBvdXRwdXQgYW5kIGhhcmR3YXJlIG91dHB1dCB3aGljaCBpcwogICAgIC8vIG5lY2Vzc2FyeSBmb3IgYSBjb3JyZWN0IGNvbnRyb2wgb2YgaGFyZHdhcmUgb3V0cHV0IHJvdXRpbmcgYnkgc3RhcnRPdXRwdXQoKSBhbmQgc3RvcE91dHB1dCgpCi0gICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAxKTsKKyAgICBvdXRwdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCB0cnVlKTsKIAotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKHRydWUpKSB7CisgICAgICAgIGRldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAoZGV2aWNlcyAhPSBvdXRwdXREZXNjLT5kZXZpY2VzKCkpIHsKKyAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShjbGllbnRTdHJhdGVneSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50QXR0ciwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSkpKSB7CiAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgIH0KIAotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAxIHx8IGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMSB8fCAhZGV2aWNlcy5pc0VtcHR5KCkpIHsKICAgICAgICAgLy8gc3RhcnRpbmcgYW4gb3V0cHV0IGJlaW5nIHJlcm91dGVkPwotICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGlmIChkZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgIH0KLQotICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICAgICAgYm9vbCBzaG91bGRXYWl0ID0gKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJlYWNvbk11dGVMYXRlbmN5ID4gMCk7CisgICAgICAgIGJvb2wgc2hvdWxkV2FpdCA9CisgICAgICAgICAgICAoZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudEF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfQUxBUk0pKSB8fAorICAgICAgICAgICAgIGZvbGxvd3NTYW1lUm91dGluZyhjbGllbnRBdHRyLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX05PVElGSUNBVElPTikpIHx8CisgICAgICAgICAgICAgKGJlYWNvbk11dGVMYXRlbmN5ID4gMCkpOwogICAgICAgICB1aW50MzJfdCB3YWl0TXMgPSBiZWFjb25NdXRlTGF0ZW5jeTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MpIHsKICAgICAgICAgICAgICAgICAvLyBBbiBvdXRwdXQgaGFzIGEgc2hhcmVkIGRldmljZSBpZgogICAgICAgICAgICAgICAgIC8vIC0gbWFuYWdlZCBieSB0aGUgc2FtZSBodyBtb2R1bGUKICAgICAgICAgICAgICAgICAvLyAtIHN1cHBvcnRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlCiAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBzaGFyZWREZXZpY2UgPSBvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBkZXZpY2UpICE9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFkZXNjLT5maWx0ZXJTdXBwb3J0ZWREZXZpY2VzKGRldmljZXMpLmlzRW1wdHkoKSk7CiAKICAgICAgICAgICAgICAgICAvLyBmb3JjZSBhIGRldmljZSBjaGFuZ2UgaWYgYW55IG90aGVyIG91dHB1dCBpczoKICAgICAgICAgICAgICAgICAvLyAtIG1hbmFnZWQgYnkgdGhlIHNhbWUgaHcgbW9kdWxlCkBAIC0xMjc2LDcgKzE2NjgsNyBAQAogICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIGF1ZGlvIEhBTCBtdXN0IHJlY2VpdmUgdGhlIG5ldyBkZXZpY2Ugc2VsZWN0aW9uIHNvIHRoYXQgaXQgY2FuCiAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBkZXZpY2UgY3VycmVudGx5IHNlbGVjdGVkIGJ5IHRoZSBvdGhlciBvdXRwdXQuCiAgICAgICAgICAgICAgICAgaWYgKHNoYXJlZERldmljZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+ZGV2aWNlKCkgIT0gZGV2aWNlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5kZXZpY2VzKCkgIT0gZGV2aWNlcyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTI5OSwyNSArMTY5MSwyMSBAQAogICAgICAgICB9CiAKICAgICAgICAgY29uc3QgdWludDMyX3QgbXV0ZVdhaXRNcyA9Ci0gICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRldmljZSwgZm9yY2UsIDAsIE5VTEwsIGFkZHJlc3MsIHJlcXVpcmVzTXV0ZUNoZWNrKTsKLQotICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAotICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBkZXZpY2VzLCBmb3JjZSwgMCwgTlVMTCwgcmVxdWlyZXNNdXRlQ2hlY2spOwogCiAgICAgICAgIC8vIGFwcGx5IHZvbHVtZSBydWxlcyBmb3IgY3VycmVudCBzdHJlYW0gYW5kIGRldmljZSBpZiBuZWNlc3NhcnkKLSAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIG91dHB1dERlc2MtPmRldmljZSgpKSwKKyAgICAgICAgYXV0byAmY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKGNsaWVudC0+YXR0cmlidXRlcygpKTsKKyAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoY3VydmVzLCBjbGllbnQtPnZvbHVtZVNvdXJjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgob3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKTsKIAogICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RhcnRpbmcgYW4gb3V0cHV0IHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbgogICAgICAgICAvLyByb3V0aW5nCiAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oc3RyZWFtKTsKIAogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gcmluZ3RvbmUgb3IgYWxhcm0gc3RhcnRzCi0gICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKKyAgICAgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhjbGllbnRBdHRyLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX0FMQVJNKSkpIHsKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKICAgICAgICAgfQogCkBAIC0xMzM2LDU2ICsxNzI0LDM4IEBACiAKICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFICYmCiAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBvdXRwdXREZXNjKTsKKyAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX0FMQVJNKSwgdHJ1ZSwgb3V0cHV0RGVzYyk7CiAgICAgfQogCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSAmJgotICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgb3V0cHV0RGVzYyk7CisgICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RhcnRlZCBvbiBhIHJlIHJvdXRpbmcgbWl4CisgICAgLy8gb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlcy50eXBlcygpKSAmJiBwb2xpY3lNaXggIT0gTlVMTCAmJgorICAgICAgICBwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigic3RvcE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgbm8gb3V0cHV0IGZvciBjbGllbnQgJWQiLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IG91dHB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOwogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HVigic3RvcE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwKKyAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUsIGNsaWVudC0+c3RyZWFtKCksIGNsaWVudC0+c2Vzc2lvbigpKTsKIAotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAxKSB7Ci0gICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdG9wcGVkIG9uIGEKLSAgICAgICAgLy8gcmUgcm91dGluZyBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG91dHB1dERlc2MtPm1EZXZpY2UpICYmCi0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUm91dGluZz8KLSAgICBib29sIGZvcmNlRGV2aWNlVXBkYXRlID0gZmFsc2U7Ci0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID4gMCkgewotICAgICAgICBpbnQgYWN0aXZpdHlDb3VudCA9IG1PdXRwdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLSAgICAgICAgZm9yY2VEZXZpY2VVcGRhdGUgPSAobU91dHB1dFJvdXRlcy5oYXNSb3V0ZShzZXNzaW9uKSAmJiAoYWN0aXZpdHlDb3VudCA9PSAwKSk7Ci0KLSAgICAgICAgaWYgKGZvcmNlRGV2aWNlVXBkYXRlKSB7Ci0gICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgQVVESU9fSU9fSEFORExFX05PTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShvdXRwdXREZXNjLCBzdHJlYW0sIGZvcmNlRGV2aWNlVXBkYXRlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKG91dHB1dERlc2MsIGNsaWVudCk7CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICkgewogICAgICAgICBvdXRwdXREZXNjLT5zdG9wKCk7CkBAIC0xMzkzLDUyICsxNzYzLDY2IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wU291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlRGV2aWNlVXBkYXRlKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wU291cmNlKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpCiB7CiAgICAgLy8gYWx3YXlzIGhhbmRsZSBzdHJlYW0gc3RvcCwgY2hlY2sgd2hpY2ggc3RyZWFtIHR5cGUgaXMgc3RvcHBpbmcKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IGNsaWVudC0+c3RyZWFtKCk7CisgICAgYXV0byBjbGllbnRWb2xTcmMgPSBjbGllbnQtPnZvbHVtZVNvdXJjZSgpOworCiAgICAgaGFuZGxlRXZlbnRGb3JCZWFjb24oc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMgPyBTVE9QUElOR19CRUFDT04gOiBTVE9QUElOR19PVVRQVVQpOwogCi0gICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KKyAgICBpZiAob3V0cHV0RGVzYy0+Z2V0QWN0aXZpdHlDb3VudChjbGllbnRWb2xTcmMpID4gMCkgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+Z2V0QWN0aXZpdHlDb3VudChjbGllbnRWb2xTcmMpID09IDEpIHsKKyAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdG9wcGVkIG9uIGEKKyAgICAgICAgICAgIC8vIHJlIHJvdXRpbmcgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gb3V0cHV0RGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2Uob3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkpICYmCisgICAgICAgICAgICAgICAgcG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UodHJ1ZSkpIHsKKyAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShjbGllbnQtPnN0cmF0ZWd5KCksIEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgIGZvcmNlRGV2aWNlVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQogCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID4gMCkgewogICAgICAgICAvLyBkZWNyZW1lbnQgdXNhZ2UgY291bnQgb2YgdGhpcyBzdHJlYW0gb24gdGhlIG91dHB1dAotICAgICAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIC0xKTsKKyAgICAgICAgb3V0cHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOwogCiAgICAgICAgIC8vIHN0b3JlIHRpbWUgYXQgd2hpY2ggdGhlIHN0cmVhbSB3YXMgc3RvcHBlZCAtIHNlZSBpc1N0cmVhbUFjdGl2ZSgpCi0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAwIHx8IGZvcmNlRGV2aWNlVXBkYXRlKSB7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMCB8fCBmb3JjZURldmljZVVwZGF0ZSkgeworICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0U3RvcFRpbWUoY2xpZW50LCBzeXN0ZW1UaW1lKCkpOworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICAgICAgLy8gZGVsYXkgdGhlIGRldmljZSBzd2l0Y2ggYnkgdHdpY2UgdGhlIGxhdGVuY3kgYmVjYXVzZSBzdG9wT3V0cHV0KCkgaXMgZXhlY3V0ZWQgd2hlbgogICAgICAgICAgICAgLy8gdGhlIHRyYWNrIHN0b3AoKSBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBhdCB0aGF0IHRpbWUgdGhlIGF1ZGlvIHRyYWNrIGJ1ZmZlciBjYW4KICAgICAgICAgICAgIC8vIHN0aWxsIGNvbnRhaW4gZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGRyYWluZWQuIFRoZSBsYXRlbmN5IG9ubHkgY292ZXJzIHRoZSBhdWRpbyBIQUwKICAgICAgICAgICAgIC8vIGFuZCBrZXJuZWwgYnVmZmVycy4gQWxzbyB0aGUgbGF0ZW5jeSBkb2VzIG5vdCBhbHdheXMgaW5jbHVkZSBhZGRpdGlvbmFsIGRlbGF5IGluIHRoZQogICAgICAgICAgICAgLy8gYXVkaW8gcGF0aCAoYXVkaW8gRFNQLCBDT0RFQyAuLi4pCi0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgbmV3RGV2aWNlLCBmYWxzZSwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpKjIpOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBuZXdEZXZpY2VzLCBmYWxzZSwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpKjIpOwogCiAgICAgICAgICAgICAvLyBmb3JjZSByZXN0b3JpbmcgdGhlIGRldmljZSBzZWxlY3Rpb24gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgaWYgaXQgZGlmZmVycyBmcm9tIHRoZQogICAgICAgICAgICAgLy8gb25lIGJlaW5nIHNlbGVjdGVkIGZvciB0aGlzIG91dHB1dAogICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSoyOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmlzQWN0aXZlKCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0RldmljZSAhPSBkZXNjLT5kZXZpY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZTIgPSBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBkZXNjLT5kZXZpY2UoKSAhPSBuZXdEZXZpY2UyOworICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0RldmljZXMgIT0gZGVzYy0+ZGV2aWNlcygpKSkgeworICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlczIgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZGVzYy0+ZGV2aWNlcygpICE9IG5ld0RldmljZXMyOwogCi0gICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoZGVzYywgbmV3RGV2aWNlczIsIGZvcmNlLCBkZWxheU1zKTsKKwogICAgICAgICAgICAgICAgICAgICAvLyByZS1hcHBseSBkZXZpY2Ugc3BlY2lmaWMgdm9sdW1lIGlmIG5vdCBkb25lIGJ5IHNldE91dHB1dERldmljZSgpCiAgICAgICAgICAgICAgICAgICAgIGlmICghZm9yY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkZXNjLCBuZXdEZXZpY2UyLCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkZXNjLCBuZXdEZXZpY2VzMi50eXBlcygpLCBkZWxheU1zKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE0NDgsMTAgKzE4MzIsMTAgQEAKIAogICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFICYmCiAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9SSU5HKSwgZmFsc2UsIG91dHB1dERlc2MpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMpIHsKKyAgICAgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhjbGllbnQtPmF0dHJpYnV0ZXMoKSwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSkpKSB7CiAgICAgICAgICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC0xNDYxLDM1ICsxODQ1LDQxIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgcmVsZWFzaW5nIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CisgICAgICAgIC8vIElmIGFuIG91dHB1dCBkZXNjcmlwdG9yIGlzIGNsb3NlZCBkdWUgdG8gYSBkZXZpY2Ugcm91dGluZyBjaGFuZ2UsCisgICAgICAgIC8vIHRoZW4gdGhlcmUgYXJlIHJhY2UgY29uZGl0aW9ucyB3aXRoIHJlbGVhc2VPdXRwdXQgZnJvbSB0cmFja3MKKyAgICAgICAgLy8gdGhhdCBtYXkgYmUgZGVzdHJveWVkICh3aXRoIG5vIFBsYXliYWNrVGhyZWFkKSBvciBhIFBsYXliYWNrVGhyZWFkCisgICAgICAgIC8vIGRlc3Ryb3llZCBzaG9ydGx5IHRoZXJlYWZ0ZXIuCisgICAgICAgIC8vCisgICAgICAgIC8vIEhlcmUgd2UganVzdCBsb2cgYSB3YXJuaW5nLCBpbnN0ZWFkIG9mIGEgZmF0YWwgZXJyb3IuCisgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgbm8gb3V0cHV0IGZvciBjbGllbnQgJWQiLCBwb3J0SWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gUm91dGluZwotICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIGlmIChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKLSAgICAgICAgaWYgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPD0gMCkgeworICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPD0gMCkgewogICAgICAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSBpbnZhbGlkIG9wZW4gY291bnQgJWQgZm9yIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1EaXJlY3RPcGVuQ291bnQsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50LCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGlmICgtLWRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkgewotICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICB9CiAgICAgfQorICAgIC8vIHN0b3BPdXRwdXQoKSBuZWVkcyB0byBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkIGJlZm9yZSByZWxlYXNlT3V0cHV0KCkKKyAgICAvLyBvdGhlcndpc2UgdGhlcmUgbWF5IGJlIGluYWNjdXJhdGUgc3RyZWFtIHJlZmVyZW5jZSBjb3VudHMuCisgICAgLy8gVGhpcyBpcyBjaGVja2VkIGluIG91dHB1dERlc2MtPnJlbW92ZUNsaWVudCBiZWxvdy4KKyAgICBvdXRwdXREZXNjLT5yZW1vdmVDbGllbnQocG9ydElkKTsKIH0KIAotCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTE1MDAsMjggKzE4OTAsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogewotICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSBzb3VyY2UgJWQsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsIgotICAgICAgICAgICAgInNlc3Npb24gJWQsIGZsYWdzICUjeCIsCi0gICAgICAgICAgYXR0ci0+c291cmNlLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIHNlc3Npb24sIGZsYWdzKTsKKyAgICBBTE9HVigiJXMoKSBzb3VyY2UgJWQsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsIHNlc3Npb24gJWQsICIKKyAgICAgICAgICAiZmxhZ3MgJSN4IGF0dHJpYnV0ZXM9JXMiLCBfX2Z1bmNfXywgYXR0ci0+c291cmNlLCBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgc2Vzc2lvbiwgZmxhZ3MsIHRvU3RyaW5nKCphdHRyKS5jX3N0cigpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIC8vIGhhbmRsZSBsZWdhY3kgcmVtb3RlIHN1Ym1peCBjYXNlIHdoZXJlIHRoZSBhZGRyZXNzIHdhcyBub3QgYWx3YXlzIHNwZWNpZmllZAotICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOwogICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlOwotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlID0gYXR0ci0+c291cmNlOwotICAgIEF1ZGlvTWl4ICpwb2xpY3lNaXggPSBOVUxMOwotICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXM7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSAqYXR0cjsKKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4OworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudERlc2M7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCByZXF1ZXN0ZWREZXZpY2VJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgIGJvb2wgaXNTb3VuZFRyaWdnZXI7CiAKLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOworICAgIC8vIFRoZSBzdXBwbGllZCBwb3J0SWQgbXVzdCBiZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgaWYgKCpwb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICBhdHRyaWJ1dGVzLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CiAgICAgfQogCiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwotICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZCgqc2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgfQotICAgIG1JbnB1dFJvdXRlcy5hZGRSb3V0ZShzZXNzaW9uLCBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BLCBpbnB1dFNvdXJjZSwgZGV2aWNlRGVzYywgdWlkKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBleHBsaWNpdFJvdXRpbmdEZXZpY2UgPSAKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbW1hcCBjYXB0dXJlOiBpZiBhbiBpbnB1dCBJTyBoYW5kbGUgaXMgc3BlY2lmaWVkLCB3ZSByZXVzZSB0aGlzIGlucHV0IGlmCiAgICAgLy8gcG9zc2libGUKQEAgLTE1MzQsOCArMTkyOCw4IEBACiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKKyAgICAgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBpbnB1dERlc2MtPmdldENsaWVudHNGb3JTZXNzaW9uKHNlc3Npb24pOworICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sICppbnB1dCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTU0NCw3NSArMTkzOCw3MSBAQAogICAgICAgICAvLyBUaGUgc2Vjb25kIGNhbGwgaXMgZm9yIHRoZSBmaXJzdCBhY3RpdmUgY2xpZW50IGFuZCBzZXRzIHRoZSBVSUQuIEFueSBmdXJ0aGVyIGNhbGwKICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYSBuZXcgY2xpZW50IGFuZCBpcyBvbmx5IHBlcm1pdHRlZCBmcm9tIHRoZSBzYW1lIFVJRC4KICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IFVJRCBpcyBzaWxlbmNlZCwgYWxsb3cgYSBuZXcgVUlEIGNvbm5lY3Rpb24gYW5kIHJlcGxhY2Ugd2l0aCBuZXcgVUlECi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDEpIHsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0VWlkKHVpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9TZXNzaW9uLT51aWQoKSAhPSB1aWQpIHsKLSAgICAgICAgICAgIGlmICghYXVkaW9TZXNzaW9uLT5pc1NpbGVuY2VkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgYmFkIHVpZCAlZCBmb3Igc2Vzc2lvbiAlZCB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIHVpZCwgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBtYXAgaXMgb3JkZXJlZCBieSBrZXkgdmFsdWVzIChwb3J0SWQpIGFuZCBwb3J0SWRzIGFyZSBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbHkuIFNvIHRoZSBmaXJzdCBjbGllbnQgaW4gdGhpcyBsaXN0IGlzIHRoZSBvbmUgb3BlbmVkIGJ5IGF1ZGlvIGZsaW5nZXIKKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBtbWFwIHN0cmVhbSBpcyBjcmVhdGVkIGFuZCBzaG91bGQgYmUgaWdub3JlZCBhcyBpdCBkb2VzIG5vdCBjb3JyZXNwb25kCisgICAgICAgICAgICAgICAgLy8gdG8gYW4gYWN0dWFsIGNsaWVudAorICAgICAgICAgICAgICAgIGlmIChjbGllbnQgPT0gKmNsaWVudHMuY2JlZ2luKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh1aWQgIT0gY2xpZW50LT51aWQoKSAmJiAhY2xpZW50LT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIGNsaWVudCAlZCB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIGNsaWVudC0+cG9ydElkKCksIGNsaWVudC0+dWlkKCkpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFVpZCh1aWQpOwotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoMSk7CiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwotICAgICAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICAgICAgfQotICAgICAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShpbnB1dERlc2MtPm1EZXZpY2UpOwotICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQotICAgICAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgZGV2aWNlID0gaW5wdXREZXNjLT5nZXREZXZpY2UoKTsKIAotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIE1NQVAgaW5wdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX0ZVTkNUSU9OX18sICppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0lOVkFMSUQ7CiAKLSAgICBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGhhbElucHV0U291cmNlID0gYXR0cmlidXRlcy5zb3VyY2U7CiAKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgZXhpc3RpbmcgY2xpZW50IGZvciB0aGlzIHBvcnQgSUQKLSAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgIH0KLQotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7Ci0KLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVggJiYKLSAgICAgICAgICAgIHN0cm5jbXAoYXR0ci0+dGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRJbnB1dE1peEZvckF0dHIoKmF0dHIsICZwb2xpY3lNaXgpOworICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgorICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBtUG9saWN5TWl4ZXMuZ2V0SW5wdXRNaXhGb3JBdHRyKGF0dHJpYnV0ZXMsICZwb2xpY3lNaXgpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURTsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KGF0dHItPnRhZ3MgKyBzdHJsZW4oImFkZHI9IikpOworICAgICAgICBpZiAoaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzKSkgeworICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfUFVCTElDX0NBUFRVUkVfUExBWUJBQ0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoYXR0ci0+dGFncyArIHN0cmxlbigiYWRkcj0iKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICB9IGVsc2UgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSwgJnBvbGljeU1peCk7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBjb3VsZCBub3QgZmluZCBkZXZpY2UgZm9yIHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKKyAgICAgICAgaWYgKGV4cGxpY2l0Um91dGluZ0RldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBleHBsaWNpdFJvdXRpbmdEZXZpY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQcmV2ZW50IGZyb20gc3RvcmluZyBpbnZhbGlkIHJlcXVlc3RlZCBkZXZpY2UgaWQgaW4gY2xpZW50cworICAgICAgICAgICAgcmVxdWVzdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAgICAgZGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsICZwb2xpY3lNaXgpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgYXR0cmlidXRlcy5zb3VyY2UpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOwotICAgICAgICAgICAgaWYgKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCi0gICAgICAgICAgICAgICAgLy8gbWVhbmluZyBpdCByZWNlaXZlcyBhdWRpbyBpbmplY3RlZCBpbnRvIHRoZSBmcmFtZXdvcmssIHNvIHRoZSByZWNvcmRlciBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgLy8ga25vdyBhYm91dCBpdCBhbmQgaXMgdGhlcmVmb3JlIGNvbnNpZGVyZWQgImxlZ2FjeSIKLSAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3JkaW5nIGEgbWl4IG9mIHBsYXllcnMgZGVmaW5lZCBieSBhbiBleHRlcm5hbCBwb2xpY3ksIHdlJ3JlIHJlcm91dGluZyBmb3IKLSAgICAgICAgICAgICAgICAvLyBhbiBleHRlcm5hbCBwb2xpY3kKLSAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgaWYgKHBvbGljeU1peCkgeworICAgICAgICAgICAgQUxPR19BU1NFUlQocG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMsICJJbnZhbGlkIE1peCBUeXBlIik7CisgICAgICAgICAgICAvLyB0aGVyZSBpcyBhbiBleHRlcm5hbCBwb2xpY3ksIGJ1dCB0aGlzIGlucHV0IGlzIGF0dGFjaGVkIHRvIGEgbWl4IG9mIHJlY29yZGVycywKKyAgICAgICAgICAgIC8vIG1lYW5pbmcgaXQgcmVjZWl2ZXMgYXVkaW8gaW5qZWN0ZWQgaW50byB0aGUgZnJhbWV3b3JrLCBzbyB0aGUgcmVjb3JkZXIgZG9lc24ndAorICAgICAgICAgICAgLy8ga25vdyBhYm91dCBpdCBhbmQgaXMgdGhlcmVmb3JlIGNvbnNpZGVyZWQgImxlZ2FjeSIKKyAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOworICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZS0+dHlwZSgpKSkgewogICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfQ0FQVFVSRTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCkgeworICAgICAgICB9IGVsc2UgaWYgKGRldmljZS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpIHsKICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfVEVMRVBIT05ZX1JYOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7CkBAIC0xNjIwLDQzICsyMDEwLDQ5IEBACiAKICAgICB9CiAKLSAgICAqaW5wdXQgPSBnZXRJbnB1dEZvckRldmljZShkZXZpY2UsIGFkZHJlc3MsIHNlc3Npb24sIHVpZCwgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgpOworICAgICppbnB1dCA9IGdldElucHV0Rm9yRGV2aWNlKGRldmljZSwgc2Vzc2lvbiwgYXR0cmlidXRlcywgY29uZmlnLCBmbGFncywgcG9saWN5TWl4KTsKICAgICBpZiAoKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKLSAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKK2V4aXQ6CiAKLSAgICBBTE9HVigiZ2V0SW5wdXRGb3JBdHRyKCkgcmV0dXJucyBpbnB1dCAlZCB0eXBlICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAotICAgICAgICAgICAgKmlucHV0LCAqaW5wdXRUeXBlLCAqc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmNvbnRhaW5zKGRldmljZSkgPworICAgICAgICAgICAgICAgIGRldmljZS0+Z2V0SWQoKSA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisKKyAgICBpc1NvdW5kVHJpZ2dlciA9IGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCisgICAgICAgIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb24pID4gMDsKKyAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKworICAgIGNsaWVudERlc2MgPSBuZXcgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcigqcG9ydElkLCB1aWQsIHNlc3Npb24sICphdHRyLCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWREZXZpY2VJZCwgYXR0cmlidXRlcy5zb3VyY2UsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlcik7CisgICAgaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcigqaW5wdXQpOworICAgIGlucHV0RGVzYy0+YWRkQ2xpZW50KGNsaWVudERlc2MpOworCisgICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHJldHVybnMgaW5wdXQgJWQgdHlwZSAlZCBzZWxlY3RlZERldmljZUlkICVkIGZvciBwb3J0IElEICVkIiwKKyAgICAgICAgICAgICppbnB1dCwgKmlucHV0VHlwZSwgKnNlbGVjdGVkRGV2aWNlSWQsICpwb3J0SWQpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogCiBlcnJvcjoKLSAgICBtSW5wdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqcG9saWN5TWl4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BvbGljeU1peD4gJnBvbGljeU1peCkKIHsKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2UgPSBhdHRyaWJ1dGVzLnNvdXJjZTsKICAgICBib29sIGlzU291bmRUcmlnZ2VyID0gZmFsc2U7CiAKLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb24pOwogICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgaW5wdXQgPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMudmFsdWVGb3Ioc2Vzc2lvbik7CkBAIC0xNjY2LDcgKzIwNjIsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OICYmCisgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiAmJgogICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFgpOwogICAgIH0KQEAgLTE2ODEsOCArMjA3Nyw3IEBACiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBwcm9maWxlRmxhZ3MgPSBmbGFnczsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIHByb2ZpbGVGb3JtYXQgPSBjb25maWctPmZvcm1hdDsgLy8gcmVzZXQgZWFjaCB0aW1lIHRocm91Z2ggbG9vcCwgaW4gY2FzZSBpdCBpcyB1cGRhdGVkCi0gICAgICAgIHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVTYW1wbGluZ1JhdGUsIHByb2ZpbGVGb3JtYXQsIHByb2ZpbGVDaGFubmVsTWFzaywKKyAgICAgICAgcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsIHByb2ZpbGVTYW1wbGluZ1JhdGUsIHByb2ZpbGVGb3JtYXQsIHByb2ZpbGVDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlRmxhZ3MpOwogICAgICAgICBpZiAocHJvZmlsZSAhPSAwKSB7CiAgICAgICAgICAgICBicmVhazsgLy8gc3VjY2VzcwpAQCAtMTY5MSw5ICsyMDg2LDkgQEAKICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlRmxhZ3MgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FKSB7CiAgICAgICAgICAgICBwcm9maWxlRmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7IC8vIHJldHJ5CiAgICAgICAgIH0gZWxzZSB7IC8vIGZhaWwKLSAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckRldmljZSgpIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAweCVYLCAiCi0gICAgICAgICAgICAgICAgICAic2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrIDB4JVgsIGZsYWdzICUjeCIsCi0gICAgICAgICAgICAgICAgICAgIGRldmljZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncyk7CisgICAgICAgICAgICBBTE9HVygiJXMgY291bGQgbm90IGZpbmQgcHJvZmlsZSBmb3IgZGV2aWNlICVzLCBzYW1wbGluZyByYXRlICV1LCBmb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAgICAgICAiY2hhbm5lbCBtYXNrIDB4JVgsIGZsYWdzICUjeCIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgCisgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIGZsYWdzKTsKICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICAgICAgfQogICAgIH0KQEAgLTE3MDgsODYgKzIxMDMsNDEgQEAKICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgIH0KIAotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gbmV3IEF1ZGlvU2Vzc2lvbihzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU291bmRUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgsIG1wQ2xpZW50SW50ZXJmYWNlKTsKLQotLy8gRklYTUU6IGRpc2FibGUgY29uY3VycmVudCBjYXB0dXJlIHVudGlsIFVJIGlzIHJlYWR5Ci0jaWYgMAotICAgIC8vIHJldXNlIGFuIG9wZW4gaW5wdXQgaWYgcG9zc2libGUKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gcmV1c2VkSW5wdXREZXNjOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgLy8gcmV1c2UgaW5wdXQgaWY6Ci0gICAgICAgIC8vIC0gaXQgc2hhcmVzIHRoZSBzYW1lIHByb2ZpbGUKLSAgICAgICAgLy8gICAgICBBTkQKLSAgICAgICAgLy8gLSBpdCBpcyBub3QgYSByZXJvdXRlIHN1Ym1peCBpbnB1dAotICAgICAgICAvLyAgICAgIEFORAotICAgICAgICAvLyAtIGl0IGlzOiBub3QgdXNlZCBmb3Igc291bmQgdHJpZ2dlcgotICAgICAgICAvLyAgICAgICAgICAgICAgICBPUgotICAgICAgICAvLyAgICAgICAgICB1c2VkIGZvciBzb3VuZCB0cmlnZ2VyIGFuZCBhbGwgY2xpZW50cyB1c2UgdGhlIHNhbWUgc2Vzc2lvbiBJRAotICAgICAgICAvLwotICAgICAgICBpZiAoKHByb2ZpbGUgPT0gZGVzYy0+bVByb2ZpbGUpICYmCi0gICAgICAgICAgICAoaXNTb3VuZFRyaWdnZXIgPT0gZGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgJiYKLSAgICAgICAgICAgICFpc192aXJ0dWFsX2lucHV0X2RldmljZShkZXZpY2UpKSB7Ci0KLSAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXMgPSBkZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgICAgICBpZiAoYXMgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBhbGxvdyB1bm1hdGNoaW5nIHByb3BlcnRpZXMgb24gc2FtZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgaWYgKGFzLT5tYXRjaGVzKGF1ZGlvU2Vzc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXMtPmNoYW5nZU9wZW5Db3VudCgxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JEZXZpY2UoKSByZWNvcmQgd2l0aCBkaWZmZXJlbnQgYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBleGlzdHMgZm9yIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7ICkgeworICAgICAgICAgICAgc3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlICE9IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIHNvdW5kIHRyaWdnZXIsIHJldXNlIGlucHV0IGlmIHVzZWQgYnkgb3RoZXIgc291bmQgdHJpZ2dlciBvbiBzYW1lIHNlc3Npb24KKyAgICAgICAgICAgIC8vIGVsc2UKKyAgICAgICAgICAgIC8vICAgIHJldXNlIGlucHV0IGlmIGFjdGl2ZSBjbGllbnQgYXBwIGlzIG5vdCBpbiBJRExFIHN0YXRlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBkZXNjLT5jbGllbnRzTGlzdCgpOworICAgICAgICAgICAgYm9vbCBkb0Nsb3NlID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNTb3VuZFRyaWdnZXIgIT0gY2xpZW50LT5pc1NvdW5kVHJpZ2dlcigpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTb3VuZFRyaWdnZXIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50LT5pc1NvdW5kVHJpZ2dlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IGNsaWVudC0+c2Vzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy0+bUlvSGFuZGxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSAmJiBjbGllbnQtPmFwcFN0YXRlKCkgIT0gQVBQX1NUQVRFX0lETEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MtPm1Jb0hhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9DbG9zZSA9IHRydWU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJldXNlIHRoZSBhbHJlYWR5IG9wZW5lZCBpbnB1dCBzdHJlYW0gb24gdGhpcyBwcm9maWxlIGlmOgotICAgICAgICAgICAgLy8gLSB0aGUgbmV3IGNhcHR1cmUgc291cmNlIGlzIGJhY2tncm91bmQgT1IKLSAgICAgICAgICAgIC8vIC0gdGhlIHBhdGggcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb25zIG1hdGNoIE9SCi0gICAgICAgICAgICAvLyAtIHRoZSBuZXcgc291cmNlIHByaW9yaXR5IGlzIGxlc3MgdGhhbiB0aGUgaGlnaGVzdCBzb3VyY2UgcHJpb3JpdHkgb24gdGhpcyBpbnB1dAotICAgICAgICAgICAgLy8gSWYgdGhlIGlucHV0IHN0cmVhbSBjYW5ub3QgYmUgcmV1c2VkLCBjbG9zZSBpdCBiZWZvcmUgb3BlbmluZyBhIG5ldyBzdHJlYW0KLSAgICAgICAgICAgIC8vIG9uIHRoZSBzYW1lIHByb2ZpbGUgZm9yIHRoZSBuZXcgY2xpZW50IHNvIHRoYXQgdGhlIHJlcXVlc3RlZCBwYXRoIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIC8vIGNhbiBiZSBzZWxlY3RlZC4KLSAgICAgICAgICAgIGlmICghaXNDb25jdXJyZW50U291cmNlKGlucHV0U291cmNlKSAmJgotICAgICAgICAgICAgICAgICAgICAoKGRlc2MtPm1TYW1wbGluZ1JhdGUgIT0gc2FtcGxpbmdSYXRlIHx8Ci0gICAgICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayAhPSBjb25maWctPmNoYW5uZWxfbWFzayB8fAotICAgICAgICAgICAgICAgICAgICAhYXVkaW9fZm9ybWF0c19tYXRjaChkZXNjLT5tRm9ybWF0LCBjb25maWctPmZvcm1hdCkpICYmCi0gICAgICAgICAgICAgICAgICAgIChzb3VyY2VfcHJpb3JpdHkoZGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGZhbHNlIC8qYWN0aXZlT25seSovKSkgPAotICAgICAgICAgICAgICAgICAgICAgc291cmNlX3ByaW9yaXR5KGlucHV0U291cmNlKSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV1c2VkSW5wdXREZXNjID0gZGVzYzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChkb0Nsb3NlKSB7CisgICAgICAgICAgICAgICAgY2xvc2VJbnB1dChkZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXNjLT5hZGRBdWRpb1Nlc3Npb24oc2Vzc2lvbiwgYXVkaW9TZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6IHJldXNpbmcgaW5wdXQgJWQiLCBfX0ZVTkNUSU9OX18sIG1JbnB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5wdXRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChyZXVzZWRJbnB1dERlc2MgIT0gMCkgewotICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIHNlc3Npb25zID0gcmV1c2VkSW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb25zKGZhbHNlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzZXNzaW9ucy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGN1cnJlbnRTZXNzaW9uID0gc2Vzc2lvbnMua2V5QXQoaik7Ci0gICAgICAgICAgICBzdG9wSW5wdXQocmV1c2VkSW5wdXREZXNjLT5tSW9IYW5kbGUsIGN1cnJlbnRTZXNzaW9uKTsKLSAgICAgICAgICAgIHJlbGVhc2VJbnB1dChyZXVzZWRJbnB1dERlc2MtPm1Jb0hhbmRsZSwgY3VycmVudFNlc3Npb24pOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICB9Ci0KICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAogICAgIGF1ZGlvX2NvbmZpZ190IGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CkBAIC0xNzk1LDE0ICsyMTQ1LDcgQEAKICAgICBsQ29uZmlnLmNoYW5uZWxfbWFzayA9IHByb2ZpbGVDaGFubmVsTWFzazsKICAgICBsQ29uZmlnLmZvcm1hdCA9IHByb2ZpbGVGb3JtYXQ7CiAKLSAgICBpZiAoYWRkcmVzcyA9PSAiIikgewotICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgLy8gdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplID49IDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKLSAgICAgICAgYWRkcmVzcyA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MgOiBTdHJpbmc4KCIiKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPm9wZW4oJmxDb25maWcsIGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgIGhhbElucHV0U291cmNlLCBwcm9maWxlRmxhZ3MsICZpbnB1dCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5vcGVuKCZsQ29uZmlnLCBkZXZpY2UsIGhhbElucHV0U291cmNlLCBwcm9maWxlRmxhZ3MsICZpbnB1dCk7CiAKICAgICAvLyBvbmx5IGFjY2VwdCBpbnB1dCB3aXRoIHRoZSBleGFjdCByZXF1ZXN0ZWQgc2V0IG9mIHBhcmFtZXRlcnMKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIHx8CkBAIC0xODE5LDcgKzIxNjIsNiBAQAogICAgIH0KIAogICAgIGlucHV0RGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKLSAgICBpbnB1dERlc2MtPmFkZEF1ZGlvU2Vzc2lvbihzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwogCiAgICAgYWRkSW5wdXQoaW5wdXQsIGlucHV0RGVzYyk7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwpAQCAtMTgyNywzODkgKzIxNjksMTc4IEBACiAgICAgcmV0dXJuIGlucHV0OwogfQogCi0vL3N0YXRpYwotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQ29uY3VycmVudFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgcmV0dXJuIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHx8Ci0gICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgfHwKLSAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKTsKLX0KKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNDb25jdXJlbnRDYXB0dXJlQWxsb3dlZChjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYywKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKQotewotICAgIC8vIERvIG5vdCBhbGxvdyBjYXB0dXJlIGlmIGFuIGFjdGl2ZSB2b2ljZSBjYWxsIGlzIHVzaW5nIGEgc29mdHdhcmUgcGF0Y2ggYW5kCi0gICAgLy8gdGhlIGNhbGwgVFggc291cmNlIGRldmljZSBpcyBvbiB0aGUgc2FtZSBIVyBtb2R1bGUuCi0gICAgLy8gRklYTUU6IHdvdWxkIGJlIGJldHRlciB0byByZWZpbmUgdG8gb25seSBpbnB1dHMgd2hvc2UgcHJvZmlsZSBjb25uZWN0cyB0byB0aGUKLSAgICAvLyBjYWxsIFRYIGRldmljZSBidXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgaW4gdGhlIGF1ZGlvIHBhdGNoCi0gICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwICYmCi0gICAgICAgIGlucHV0RGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbUNhbGxUeFBhdGNoLT5tUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gc3RhcnRpbmcgY29uY3VycmVudCBjYXB0dXJlIGlzIGVuYWJsZWQgaWY6Ci0gICAgLy8gMSkgY2FwdHVyaW5nIGZvciByZS1yb3V0aW5nCi0gICAgLy8gMikgY2FwdHVyaW5nIGZvciBIT1RXT1JEIHNvdXJjZQotICAgIC8vIDMpIGNhcHR1cmluZyBmb3IgRk0gVFVORVIgc291cmNlCi0gICAgLy8gMykgQWxsIG90aGVyIGFjdGl2ZSBjYXB0dXJlcyBhcmUgZWl0aGVyIGZvciByZS1yb3V0aW5nIG9yIEhPVFdPUkQKLQotICAgIGlmIChpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpIHx8Ci0gICAgICAgICAgICBpc0NvbmN1cnJlbnRTb3VyY2UoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZUlucHV0IDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewotICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShhY3RpdmVJbnB1dC0+aW5wdXRTb3VyY2UodHJ1ZSkpICYmCi0gICAgICAgICAgICAgICAgIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGFjdGl2ZUlucHV0LT5tRGV2aWNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEZJWE1FOiByZW1vdmUgd2hlbiBjb25jdXJyZW50IGNhcHR1cmUgaXMgcmVhZHkuIFRoaXMgaXMgYSBoYWNrIHRvIHdvcmsgYXJvdW5kIGJ1ZyBiLzYzMDgzNTM3LgotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKSB7Ci0gICAgaWYgKCFtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKSB7Ci0gICAgICAgIGJvb2wgc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSA9IGZhbHNlOwotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlcyA9IDA7Ci0gICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKiBuTW9kdWxlcyA9IE5VTEw7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gU291bmRUcmlnZ2VyOjpsaXN0TW9kdWxlcyhuTW9kdWxlcywgJm51bU1vZHVsZXMpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG51bU1vZHVsZXMgIT0gMCkgewotICAgICAgICAgICAgbk1vZHVsZXMgPSAoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IqKSBjYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXMsIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvcikpOwotICAgICAgICAgICAgaWYgKG5Nb2R1bGVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgLy8gV2UgZmFpbGVkIHRvIG1hbGxvYyB0aGUgYnVmZmVyLCBzbyBqdXN0IHNheSBubyBmb3Igbm93LCBhbmQgaG9wZSB0aGF0IHdlIGhhdmUgbW9yZQotICAgICAgICAgICAgICAvLyByYW0gdGhlIG5leHQgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIG1vZHVsZSBkZXNjcmlwdG9ycyIpOwotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1cyA9IFNvdW5kVHJpZ2dlcjo6bGlzdE1vZHVsZXMobk1vZHVsZXMsICZudW1Nb2R1bGVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bU1vZHVsZXM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlICY9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1vZHVsZXNbaV0ucHJvcGVydGllcy5jb25jdXJyZW50X2NhcHR1cmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShuTW9kdWxlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgPSBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOwotICAgICAgICBtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOwotfQotCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCAqY29uY3VycmVuY3kpCi17Ci0KLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGlucHV0OiVkLCBzZXNzaW9uOiVkLCBzaWxlbmNlZDolZCwgY29uY3VycmVuY3k6JWQpIiwKLSAgICAgICAgICAgIGlucHV0LCBzZXNzaW9uLCBzaWxlbmNlZCwgKmNvbmN1cnJlbmN5KTsKLQotICAgICpjb25jdXJyZW5jeSA9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0vLyBGSVhNRTogZGlzYWJsZSBjb25jdXJyZW50IGNhcHR1cmUgdW50aWwgVUkgaXMgcmVhZHkKLSNpZiAwCi0gICAgaWYgKCFpc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGlucHV0RGVzYywgYXVkaW9TZXNzaW9uKSkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBvdGhlciBpbnB1dCBhbHJlYWR5IHN0YXJ0ZWQiLCBpbnB1dCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBpbnB1dERlc2MtPm1Jb0hhbmRsZTsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgIEFMT0dXKCIlcyBpbnB1dCAlZCBjbGllbnQgJWQgYWxyZWFkeSBzdGFydGVkIiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5wb3J0SWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEw7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBjbGllbnQtPnNlc3Npb24oKTsKKworICAgIEFMT0dWKCIlcyBpbnB1dDolZCwgc2Vzc2lvbjolZCkiLCBfX0ZVTkNUSU9OX18sIGlucHV0LCBzZXNzaW9uKTsKKworICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPnN0YXJ0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBpZiAobUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcygpICE9IDApIHsKLSAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgIH0KLSNlbHNlCi0gICAgaWYgKCFpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCAmJgotICAgICAgICAgICAgaW5wdXREZXNjLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtQ2FsbFR4UGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSB7Ci0gICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBjYWxsIGluIHByb2dyZXNzIiwgaW5wdXQpOwotICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9CiAKLSAgICAgICAgVmVjdG9yPHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPj4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLQotICAgICAgICAvLyBJZiBhIFVJRCBpcyBpZGxlIGFuZCByZWNvcmRzIHNpbGVuY2UgYW5kIGFub3RoZXIgbm90IHNpbGVuY2VkIHJlY29yZGluZyBzdGFydHMKLSAgICAgICAgLy8gZnJvbSBhbm90aGVyIFVJRCAoaWRsZSBvciBhY3RpdmUpIHdlIHN0b3AgdGhlIGN1cnJlbnQgaWRsZSBVSUQgcmVjb3JkaW5nIGluCi0gICAgICAgIC8vIGZhdm9yIG9mIHRoZSBuZXcgb25lIC0gIlRoZXJlIGNhbiBiZSBvbmx5IG9uZSIgVE0KLSAgICAgICAgaWYgKCFzaWxlbmNlZCkgewotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChhdWRpb1Nlc3Npb24tPmZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldElkKCkgPT0gaW5wdXREZXNjLT5nZXRJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucygKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLnZhbHVlQXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVNlc3Npb24tPmlzU2lsZW5jZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGFjdGl2ZVNlc3Npb25JZCA9IGFjdGl2ZVNlc3Npb24tPnNlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVTZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZVNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBzdG9wcGluZyBzaWxlbmNlZCBpbnB1dCAlZCIsIGlucHV0LCBhY3RpdmVJbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvU2Vzc2lvbi0+ZmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRJZCgpID09IGlucHV0RGVzYy0+Z2V0SWQoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhY3RpdmVTb3VyY2UgPSBhY3RpdmVEZXNjLT5pbnB1dFNvdXJjZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNQcmVlbXB0ZWRTZXNzaW9uKHNlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkIGZvciBIT1RXT1JEOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQgZm9yIEhPVFdPUkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgZmFpbGVkIGZvciBIT1RXT1JEOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNvdW5kIHRyaWdnZXIgc2Vzc2lvbiBzdXBwb3J0cyBjb25jdXJyZW50IGNhcHR1cmUgaWYgdGhlCi0gICAgICAgIC8vIGlucHV0IGlzIGFsc28gYSBzb3VuZCB0cmlnZ2VyIGlucHV0LiBPdGhlcndpc2UsIHdlIHNob3VsZCBwcmVlbXB0IGFueSBob3R3b3JkIHN0cmVhbQotICAgICAgICAvLyB0aGF0J3MgcnVubmluZy4KLSAgICAgICAgY29uc3QgYm9vbCBhbGxvd0NvbmN1cnJlbnRXaXRoU291bmRUcmlnZ2VyID0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSA/IHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKSA6IGZhbHNlOwotCi0gICAgICAgIC8vIGlmIGNhcHR1cmUgaXMgYWxsb3dlZCwgcHJlZW1wdCBjdXJyZW50bHkgYWN0aXZlIEhPVFdPUkQgY2FwdHVyZXMKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICBpZiAoYWxsb3dDb25jdXJyZW50V2l0aFNvdW5kVHJpZ2dlciAmJiBhY3RpdmVEZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGFjdGl2ZVNvdXJjZSA9IGFjdGl2ZURlc2MtPmlucHV0U291cmNlKHRydWUpOwotICAgICAgICAgICAgaWYgKGFjdGl2ZVNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KDApOwotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUhhbmRsZSA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBzZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldFByZWVtcHRlZFNlc3Npb25zKCk7Ci0gICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUOwotICAgICAgICAgICAgICAgIHNlc3Npb25zLmFkZChhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPnNldFByZWVtcHRlZFNlc3Npb25zKHNlc3Npb25zKTsKLSAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgZm9yIEhPVFdPUkQgcHJlZW1wdGluZyBIT1RXT1JEIGlucHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gTWFrZSBzdXJlIHdlIHN0YXJ0IHdpdGggdGhlIGNvcnJlY3Qgc2lsZW5jZSBzdGF0ZQotICAgIGF1ZGlvU2Vzc2lvbi0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOwotCi0gICAgLy8gaW5jcmVtZW50IGFjdGl2aXR5IGNvdW50IGJlZm9yZSBjYWxsaW5nIGdldE5ld0lucHV0RGV2aWNlKCkgYmVsb3cgYXMgb25seSBhY3RpdmUgc2Vzc2lvbnMKKyAgLy8gaW5jcmVtZW50IGFjdGl2aXR5IGNvdW50IGJlZm9yZSBjYWxsaW5nIGdldE5ld0lucHV0RGV2aWNlKCkgYmVsb3cgYXMgb25seSBhY3RpdmUgc2Vzc2lvbnMKICAgICAvLyBhcmUgY29uc2lkZXJlZCBmb3IgZGV2aWNlIHNlbGVjdGlvbgotICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoMSk7CisgICAgaW5wdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCB0cnVlKTsKIAotICAgIC8vIFJvdXRpbmc/Ci0gICAgbUlucHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisgICAgLy8gaW5kaWNhdGUgYWN0aXZlIGNhcHR1cmUgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIGlmIHN0YXJ0aW5nIGNhcHR1cmUgZnJvbSBhIG1pYyBvbgorICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKTsKKyAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZGV2aWNlLCB0cnVlIC8qIGZvcmNlICovKTsKIAotICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPT0gMSB8fCBtSW5wdXRSb3V0ZXMuZ2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoc2Vzc2lvbikpIHsKLSAgICAgICAgLy8gaW5kaWNhdGUgYWN0aXZlIGNhcHR1cmUgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIGlmIHN0YXJ0aW5nIGNhcHR1cmUgZnJvbSBhIG1pYyBvbgotICAgICAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKTsKLSAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGRldmljZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5zdGFydCgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtSW5wdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoLTEpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoaW5wdXREZXNjLT5hY3RpdmVDb3VudCgpICA9PSAxKSB7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgucHJvbW90ZSgpOworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKHBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgocG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKLSAgICAgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCi0gICAgICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAmJiAoKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7Ci0gICAgICAgICAgICB9CisgICAgICAgIERldmljZVZlY3RvciBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeU1vZHVsZUlucHV0RGV2aWNlcygpOworICAgICAgICBpZiAocHJpbWFyeUlucHV0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpICYmCisgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAxKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKLSAgICAgICAgICAgIGlmICgoKGRldmljZSAmIHByaW1hcnlJbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUodHJ1ZSk7CisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0YXJ0ZWQgaWYgbm90CisgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgorICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5nZXREZXZpY2VUeXBlKCkpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKKyAgICAgICAgICAgIGlmIChwb2xpY3lNaXggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkIGlmIG5vdAotICAgICAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7CisgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KCkgaW5wdXQgc291cmNlID0gJWQiLCBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpOworICAgIEFMT0dWKCIlcyBpbnB1dCAlZCBzb3VyY2UgPSAlZCBleGl0IiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5zb3VyY2UoKSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigic3RvcElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCBhbHJlYWR5IHN0b3BwZWQiLCBpbnB1dCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBpbnB1dERlc2MtPm1Jb0hhbmRsZTsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGlmICghY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICBBTE9HVygiJXMgaW5wdXQgJWQgY2xpZW50ICVkIGFscmVhZHkgc3RvcHBlZCIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIGNsaWVudC0+cG9ydElkKCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VBY3RpdmVDb3VudCgtMSk7CisgICAgaW5wdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CiAKLSAgICAvLyBSb3V0aW5nPwotICAgIG1JbnB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIGlucHV0RGVzYy0+c3RvcCgpOwotICAgICAgICBpZiAoaW5wdXREZXNjLT5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKSwgZmFsc2UgLyogZm9yY2UgKi8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkIGlmIG5vdAotICAgICAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBpbnB1dERlc2MtPm1EZXZpY2U7Ci0gICAgICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKLQotICAgICAgICAgICAgLy8gaW5kaWNhdGUgaW5hY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RvcHBpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCi0gICAgICAgICAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7Ci0gICAgICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMCkgewotICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOworICAgIGlucHV0RGVzYy0+c3RvcCgpOworICAgIGlmIChpbnB1dERlc2MtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyksIGZhbHNlIC8qIGZvcmNlICovKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAmJiAoKHBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkIGlmIG5vdAorICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5nZXREZXZpY2VUeXBlKCkpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKKyAgICAgICAgICAgIGlmIChwb2xpY3lNaXggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKKworICAgICAgICAvLyBpbmRpY2F0ZSBpbmFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdG9wcGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KKyAgICAgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKKyAgICAgICAgRGV2aWNlVmVjdG9yIHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCk7CisgICAgICAgIGlmIChwcmltYXJ5SW5wdXREZXZpY2VzLmNvbnRhaW5zKGlucHV0RGVzYy0+Z2V0RGV2aWNlKCkpICYmCisgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXREZXNjLT5jbGVhclByZWVtcHRlZFNlc3Npb25zKCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSByZWxlYXNpbmcgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOwogCi0gICAgLy8gUm91dGluZwotICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICBBTE9HVigiJXMgJWQiLCBfX0ZVTkNUSU9OX18sIGlucHV0KTsKIAotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIEFMT0dfQVNTRVJUKGlucHV0RGVzYyAhPSAwKTsKKyAgICBpbnB1dERlc2MtPnJlbW92ZUNsaWVudChwb3J0SWQpOwogCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBvbiBzZXNzaW9uICVkIiwKLSAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5vcGVuQ291bnQoKSwgc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoLTEpID09IDApIHsKLSAgICAgICAgaW5wdXREZXNjLT5yZW1vdmVBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgaWYgKGlucHV0RGVzYy0+Z2V0T3BlblJlZkNvdW50KCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0ID4gMCIpOworICAgIGlmIChpbnB1dERlc2MtPmdldENsaWVudENvdW50KCkgPiAwKSB7CisgICAgICAgIEFMT0dWKCIlcyglZCkgJXp1IGNsaWVudHMgcmVtYWluaW5nIiwgX19mdW5jX18sIHBvcnRJZCwgaW5wdXREZXNjLT5nZXRDbGllbnRDb3VudCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGNsb3NlSW5wdXQoaW5wdXQpOwogICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgZXhpdCIpOworICAgIEFMT0dWKCIlcyBleGl0IiwgX19GVU5DVElPTl9fKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQWN0aXZlQ2xpZW50cyhjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0KQoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gaW5wdXQtPmNsaWVudHNMaXN0KHRydWUpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgIGNsb3NlQ2xpZW50KGNsaWVudC0+cG9ydElkKCkpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQoreworICAgIHN0b3BJbnB1dChwb3J0SWQpOworICAgIHJlbGVhc2VJbnB1dChwb3J0SWQpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VBbGxJbnB1dHMoKSB7CkBAIC0yMjI2LDcgKzIzNTcsNiBAQAogICAgICAgICB9CiAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICB9Ci0gICAgbUlucHV0Um91dGVzLmNsZWFyKCk7CiAgICAgbUlucHV0cy5jbGVhcigpOwogICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwpAQCAtMjIzNiwxOSArMjM2NiwyMSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQogewogICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgbVZvbHVtZUN1cnZlcy0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1heCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIGZvciBzdHJlYW0gJWQ6IGludmFsaWQgbWluICVkIG9yIG1heCAlZCIsIF9fZnVuY19fLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGdldFZvbHVtZUN1cnZlcyhzdHJlYW0pLmluaXRWb2x1bWUoaW5kZXhNaW4sIGluZGV4TWF4KTsKIAogICAgIC8vIGluaXRpYWxpemUgb3RoZXIgcHJpdmF0ZSBzdHJlYW0gdm9sdW1lcyB3aGljaCBmb2xsb3cgdGhpcyBvbmUKICAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7CiAgICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUN1cnZlcy0+aW5pdFN0cmVhbVZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIGdldFZvbHVtZUN1cnZlcygoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pLmluaXRWb2x1bWUoaW5kZXhNaW4sIGluZGV4TWF4KTsKICAgICB9CiB9CiAKQEAgLTIyNTYsMTMgKzIzODgsMTc5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKKyAgICBhdXRvIGF0dHJpYnV0ZXMgPSBtRW5naW5lLT5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgIGF1dG8gdm9sdW1lR3JvdXAgPSBtRW5naW5lLT5nZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICBpZiAodm9sdW1lR3JvdXAgPT0gVk9MVU1FX0dST1VQX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBncm91cCBtYXRjaGluZyB3aXRoIHN0cmVhbSAlcyIsIF9fRlVOQ1RJT05fXywgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBzdHJlYW0gJXMgYXR0cmlidXRlcz0lcyIsIF9fZnVuY19fLAorICAgICAgICAgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSwgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSk7CisgICAgcmV0dXJuIHNldFZvbHVtZUdyb3VwSW5kZXgoZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSksIHZvbHVtZUdyb3VwLCBpbmRleCwgZGV2aWNlLCBhdHRyaWJ1dGVzKTsKK30KIAotICAgIC8vIFZPSUNFX0NBTEwgYW5kIEJMVUVUT09USF9TQ08gc3RyZWFtIGhhdmUgbWluVm9sdW1lSW5kZXggPiAwIGJ1dAotICAgIC8vIGNhbiBiZSBtdXRlZCBkaXJlY3RseSBieSBhbiBhcHAgdGhhdCBoYXMgTU9ESUZZX1BIT05FX1NUQVRFIHBlcm1pc3Npb24uCi0gICAgaWYgKCgoaW5kZXggPCBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleE1pbihzdHJlYW0pKSAmJgotICAgICAgICAgICAgISgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8IHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgJiYKLSAgICAgICAgICAgIGluZGV4ID09IDApKSB8fAotICAgICAgICAgICAgKGluZGV4ID4gbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtKSkpIHsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCByZXR1cm4gdm9sdW1lIGZvciBkZXZpY2Ugc2VsZWN0ZWQgZm9yIHRoaXMKKyAgICAvLyBzdHJlYW0gYnkgdGhlIGVuZ2luZS4KKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7CisgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oc3RyZWFtLCB0cnVlIC8qZnJvbUNhY2hlKi8pLnR5cGVzKCk7CisgICAgfQorICAgIHJldHVybiBnZXRWb2x1bWVJbmRleChnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKSwgKmluZGV4LCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIC8vIEdldCBWb2x1bWUgZ3JvdXAgbWF0Y2hpbmcgdGhlIEF1ZGlvIEF0dHJpYnV0ZXMKKyAgICBhdXRvIHZvbHVtZUdyb3VwID0gbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgIGlmICh2b2x1bWVHcm91cCA9PSBWT0xVTUVfR1JPVVBfTk9ORSkgeworICAgICAgICBBTE9HRCgiJXM6IGNvdWxkIG5vdCBmaW5kIGdyb3VwIG1hdGNoaW5nIHdpdGggJXMiLCBfX0ZVTkNUSU9OX18sIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6IGdyb3VwICVkIG1hdGNoaW5nIHdpdGggJXMiLCBfX0ZVTkNUSU9OX18sIHZvbHVtZUdyb3VwLCB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICByZXR1cm4gc2V0Vm9sdW1lR3JvdXBJbmRleChnZXRWb2x1bWVDdXJ2ZXMoYXR0ciksIHZvbHVtZUdyb3VwLCBpbmRleCwgZGV2aWNlLCBhdHRyKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRWb2x1bWVHcm91cEluZGV4KElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywgdm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMpCit7CisgICAgQUxPR1ZWKCIlczogZ3JvdXA9JWQiLCBfX2Z1bmNfXywgZ3JvdXApOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIFZvbHVtZVNvdXJjZSB2cyA9IHRvVm9sdW1lU291cmNlKGdyb3VwKTsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworCisgICAgc3RhdHVzID0gc2V0Vm9sdW1lQ3VydmVJbmRleChpbmRleCwgZGV2aWNlLCBjdXJ2ZXMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzIGZhaWxlZCB0byBzZXQgY3VydmUgaW5kZXggZm9yIGdyb3VwICVkIGRldmljZSAweCVYIiwgX19mdW5jX18sIGdyb3VwLCBkZXZpY2UpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAvLyB1cGRhdGUgdm9sdW1lIG9uIGFsbCBvdXRwdXRzIGFuZCBzdHJlYW1zIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmc6CisgICAgLy8gLSBUaGUgcmVxdWVzdGVkIHN0cmVhbSAob3IgYSBzdHJlYW0gbWF0Y2hpbmcgZm9yIHZvbHVtZSBjb250cm9sKSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dAorICAgIC8vIC0gVGhlIGRldmljZSAob3IgZGV2aWNlcykgc2VsZWN0ZWQgYnkgdGhlIGVuZ2luZSBmb3IgdGhpcyBzdHJlYW0gaW5jbHVkZXMKKyAgICAvLyB0aGUgcmVxdWVzdGVkIGRldmljZQorICAgIC8vIC0gRm9yIG5vbiBkZWZhdWx0IHJlcXVlc3RlZCBkZXZpY2UsIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2Ugb24gdGhlIG91dHB1dCBpcyBlaXRoZXIgdGhlCisgICAgLy8gcmVxdWVzdGVkIGRldmljZSBvciBvbmUgb2YgdGhlIGRldmljZXMgc2VsZWN0ZWQgYnkgdGhlIGVuZ2luZSBmb3IgdGhpcyBzdHJlYW0KKyAgICAvLyAtIEZvciBkZWZhdWx0IHJlcXVlc3RlZCBkZXZpY2UgKEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSwgYXBwbHkgdm9sdW1lIG9ubHkgaWYKKyAgICAvLyBubyBzcGVjaWZpYyBkZXZpY2Ugdm9sdW1lIHZhbHVlIGV4aXN0cyBmb3IgY3VycmVudGx5IHNlbGVjdGVkIGRldmljZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRlc2MtPmRldmljZXMoKS50eXBlcygpKTsKKworICAgICAgICAvLyBJbnRlciAvIGludHJhIHZvbHVtZSBncm91cCBwcmlvcml0eSBtYW5hZ2VtZW50OiBMb29wIG9uIHN0cmF0ZWdpZXMgYXJyYW5nZWQgYnkgcHJpb3JpdHkKKyAgICAgICAgLy8gSWYgYSBoaWdoZXIgcHJpb3JpdHkgc3RyYXRlZ3kgaXMgYWN0aXZlLCBhbmQgdGhlIG91dHB1dCBpcyByb3V0ZWQgdG8gYSBkZXZpY2Ugd2l0aCBhCisgICAgICAgIC8vIEhXIEdhaW4gbWFuYWdlbWVudCwgZG8gbm90IGNoYW5nZSB0aGUgdm9sdW1lCisgICAgICAgIGJvb2wgYXBwbHlWb2x1bWUgPSBmYWxzZTsKKyAgICAgICAgaWYgKGRlc2MtPnVzZUh3R2FpbigpKSB7CisgICAgICAgICAgICBpZiAoIShkZXNjLT5pc0FjdGl2ZShncm91cCkgfHwgaXNJbkNhbGwoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmcHJvZHVjdFN0cmF0ZWd5IDogbUVuZ2luZS0+Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFjdGl2ZUNsaWVudHMgPSBkZXNjLT5jbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovLCBwcm9kdWN0U3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypwcmVmZXJyZWREZXZpY2UqLyk7CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUNsaWVudHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBpc1ByZWVtcHRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJvb2wgaXNIaWdoZXJQcmlvcml0eSA9IHByb2R1Y3RTdHJhdGVneSA8IHN0cmF0ZWd5OworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogYWN0aXZlQ2xpZW50cykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNIaWdoZXJQcmlvcml0eSAmJiAoY2xpZW50LT52b2x1bWVTb3VyY2UoKSAhPSB2cykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogU3RyYXRlZ3k9JWQgKFxucmVxdWVzdGVyOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBncm91cCAlZCwgdm9sdW1lR3JvdXA9JWQgYXR0cmlidXRlcz0lcylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaGlnaGVyIHByaW9yaXR5IHNvdXJjZSBhY3RpdmU6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvbHVtZUdyb3VwPSVkIGF0dHJpYnV0ZXM9JXMpIFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvbiBvdXRwdXQgJXp1LCBiYWlsaW5nIG91dCIsIF9fZnVuY19fLCBwcm9kdWN0U3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCwgZ3JvdXAsIHRvU3RyaW5nKGF0dHJpYnV0ZXMpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnZvbHVtZVNvdXJjZSgpLCB0b1N0cmluZyhjbGllbnQtPmF0dHJpYnV0ZXMoKSkuY19zdHIoKSwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmVlbXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgY29udGludWUgZm9yIGxvb3AgdG8gZW5zdXJlIG5vIGhpZ2hlciBwcmlvIGNsaWVudHMgcnVubmluZyBvbiBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+dm9sdW1lU291cmNlKCkgPT0gdnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNQcmVlbXB0ZWQgfHwgYXBwbHlWb2x1bWUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFhcHBseVZvbHVtZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBuZXh0IG91dHB1dAorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoY3VydmVzLCB2cywgaW5kZXgsIGRlc2MsIGN1ckRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2cyA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fU1lTVEVNKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVMgOiAwKSk7CisgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdm9sU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGN1clZvbEdyb3VwIDogZ2V0Vm9sdW1lR3JvdXBzKCkpIHsKKyAgICAgICAgICAgIFZvbHVtZVNvdXJjZSBjdXJWb2xTcmMgPSB0b1ZvbHVtZVNvdXJjZShjdXJWb2xHcm91cCk7CisgICAgICAgICAgICBpZiAoY3VyVm9sU3JjICE9IHZzKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShkZXNjLT5pc0FjdGl2ZSh2cykgfHwgaXNJbkNhbGwoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJTcmNEZXZpY2U7CisgICAgICAgICAgICBhdXRvICZjdXJDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoY3VyVm9sU3JjKTsKKyAgICAgICAgICAgIGF1dG8gY3VyQ3VydkF0dHJzID0gY3VyQ3VydmVzLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGlmICghY3VyQ3VydkF0dHJzLmVtcHR5KCkgJiYgY3VyQ3VydkF0dHJzLmZyb250KCkgIT0gZGVmYXVsdEF0dHIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGF0dHIgPSBjdXJDdXJ2QXR0cnMuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBjdXJTcmNEZXZpY2UgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCBudWxscHRyLCBmYWxzZSkudHlwZXMoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWN1ckN1cnZlcy5nZXRTdHJlYW1UeXBlcygpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHN0cmVhbSA9IGN1ckN1cnZlcy5nZXRTdHJlYW1UeXBlcygpLmZyb250KCk7CisgICAgICAgICAgICAgICAgY3VyU3JjRGV2aWNlID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0sIGZhbHNlKS50eXBlcygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3JjICVkOiBubyB2YWxpZCBhdHRyaWJ1dGVzIG5vciBzdHJlYW0iLF9fZnVuY19fLCBjdXJWb2xTcmMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyU3JjRGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoY3VyU3JjRGV2aWNlKTsKKyAgICAgICAgICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSAmJiAoKGN1ckRldmljZSAmIGRldmljZSkgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpIHsKKyAgICAgICAgICAgICAgICBjdXJTcmNEZXZpY2UgfD0gZGV2aWNlOworICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gKGN1ckRldmljZSAmIGN1clNyY0RldmljZSkgIT0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXBwbHlWb2x1bWUgPSAhY3VydmVzLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGN1clNyY0RldmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXBwbHlWb2x1bWUpIHsKKyAgICAgICAgICAgICAgICAvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCisgICAgICAgICAgICAgICAgLy8gZGVsYXllZCB2b2x1bWUgY2hhbmdlIGZvciBzeXN0ZW0gc3RyZWFtIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgcHJvYmxlbSBpcworICAgICAgICAgICAgICAgIC8vIGhhbmRsZWQgYnkgc3lzdGVtIFVJCisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ3VydmVzLCBjdXJWb2xTcmMsIGluZGV4LCBkZXNjLCBjdXJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2cyA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fU1lTVEVNKSk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUyA6IDApKTsKKyAgICAgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIDAgLypmbGFncyovKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFZvbHVtZUN1cnZlSW5kZXgoaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZvbHVtZUN1cnZlcyAmdm9sdW1lQ3VydmVzKQoreworICAgIC8vIFZPSUNFX0NBTEwgc3RyZWFtIGhhcyBtaW5Wb2x1bWVJbmRleCA+IDAgIGJ1dCBjYW4gYmUgbXV0ZWQgZGlyZWN0bHkgYnkgYW4KKyAgICAvLyBhcHAgdGhhdCBoYXMgTU9ESUZZX1BIT05FX1NUQVRFIHBlcm1pc3Npb24uCisgICAgYm9vbCBoYXNWb2ljZSA9IGhhc1ZvaWNlU3RyZWFtKHZvbHVtZUN1cnZlcy5nZXRTdHJlYW1UeXBlcygpKTsKKyAgICBpZiAoKChpbmRleCA8IHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1pbigpKSAmJiAhKGhhc1ZvaWNlICYmIGluZGV4ID09IDApKSB8fAorICAgICAgICAgICAgKGluZGV4ID4gdm9sdW1lQ3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCkpKSB7CisgICAgICAgIEFMT0dEKCIlczogd3JvbmcgaW5kZXggJWQgbWluPSVkIG1heD0lZCIsIF9fRlVOQ1RJT05fXywgaW5kZXgsCisgICAgICAgICAgICAgIHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1pbigpLCB2b2x1bWVDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNYXgoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CkBAIC0yMjcwLDkwICsyNTY4LDQ5IEBACiAgICAgfQogCiAgICAgLy8gRm9yY2UgbWF4IHZvbHVtZSBpZiBzdHJlYW0gY2Fubm90IGJlIG11dGVkCi0gICAgaWYgKCFtVm9sdW1lQ3VydmVzLT5jYW5CZU11dGVkKHN0cmVhbSkpIGluZGV4ID0gbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtKTsKKyAgICBpZiAoIXZvbHVtZUN1cnZlcy5jYW5CZU11dGVkKCkpIGluZGV4ID0gdm9sdW1lQ3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCk7CiAKLSAgICBBTE9HVigic2V0U3RyZWFtVm9sdW1lSW5kZXgoKSBzdHJlYW0gJWQsIGRldmljZSAlMDh4LCBpbmRleCAlZCIsCi0gICAgICAgICAgc3RyZWFtLCBkZXZpY2UsIGluZGV4KTsKLQotICAgIC8vIHVwZGF0ZSBvdGhlciBwcml2YXRlIHN0cmVhbSB2b2x1bWVzIHdoaWNoIGZvbGxvdyB0aGlzIG9uZQotICAgIGZvciAoaW50IGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgY3VyU3RyZWFtKyspIHsKLSAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBtVm9sdW1lQ3VydmVzLT5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBkZXZpY2UsIGluZGV4KTsKLSAgICB9Ci0KLSAgICAvLyB1cGRhdGUgdm9sdW1lIG9uIGFsbCBvdXRwdXRzIGFuZCBzdHJlYW1zIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmc6Ci0gICAgLy8gLSBUaGUgcmVxdWVzdGVkIHN0cmVhbSAob3IgYSBzdHJlYW0gbWF0Y2hpbmcgZm9yIHZvbHVtZSBjb250cm9sKSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dAotICAgIC8vIC0gVGhlIGRldmljZSAob3IgZGV2aWNlcykgc2VsZWN0ZWQgYnkgdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzdHJlYW0gaW5jbHVkZXMKLSAgICAvLyB0aGUgcmVxdWVzdGVkIGRldmljZQotICAgIC8vIC0gRm9yIG5vbiBkZWZhdWx0IHJlcXVlc3RlZCBkZXZpY2UsIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2Ugb24gdGhlIG91dHB1dCBpcyBlaXRoZXIgdGhlCi0gICAgLy8gcmVxdWVzdGVkIGRldmljZSBvciBvbmUgb2YgdGhlIGRldmljZXMgc2VsZWN0ZWQgYnkgdGhlIHN0cmF0ZWd5Ci0gICAgLy8gLSBGb3IgZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlIChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSksIGFwcGx5IHZvbHVtZSBvbmx5IGlmCi0gICAgLy8gbm8gc3BlY2lmaWMgZGV2aWNlIHZvbHVtZSB2YWx1ZSBleGlzdHMgZm9yIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2UuCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBkZXNjLT5kZXZpY2UoKTsKLSAgICAgICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBjdXJTdHJlYW0rKykgewotICAgICAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIShkZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pIHx8Ci0gICAgICAgICAgICAgICAgICAgIChpc0luQ2FsbCgpICYmIChjdXJTdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgY3VyU3RyYXRlZ3kgPSBnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1clN0cmVhbURldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGdldERldmljZUZvclN0cmF0ZWd5KAotICAgICAgICAgICAgICAgICAgICBjdXJTdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLykpOwotICAgICAgICAgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpICYmCi0gICAgICAgICAgICAgICAgICAgICgoY3VyU3RyZWFtRGV2aWNlICYgZGV2aWNlKSA9PSAwKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbCBhcHBseVZvbHVtZTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpIHsKLSAgICAgICAgICAgICAgICBjdXJTdHJlYW1EZXZpY2UgfD0gZGV2aWNlOwotICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gKFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGN1ckRldmljZSkgJiBjdXJTdHJlYW1EZXZpY2UpICE9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gIW1Wb2x1bWVDdXJ2ZXMtPmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBjdXJTdHJlYW1EZXZpY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXBwbHlWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCi0gICAgICAgICAgICAgICAgLy8gZGVsYXllZCB2b2x1bWUgY2hhbmdlIGZvciBzeXN0ZW0gc3RyZWFtIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgcHJvYmxlbSBpcwotICAgICAgICAgICAgICAgIC8vIGhhbmRsZWQgYnkgc3lzdGVtIFVJCi0gICAgICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgaW5kZXgsIGRlc2MsIGN1ckRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pID8gVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVMgOiAwKTsKLSAgICAgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKKyAgICBBTE9HVigiJXMgZGV2aWNlICUwOHgsIGluZGV4ICVkIiwgX19GVU5DVElPTl9fICwgZGV2aWNlLCBpbmRleCk7CisgICAgdm9sdW1lQ3VydmVzLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewotICAgIGlmIChpbmRleCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCByZXR1cm4gdm9sdW1lIGZvciBkZXZpY2Ugc2VsZWN0ZWQgZm9yIHRoaXMKKyAgICAvLyBzdHJlYW0gYnkgdGhlIGVuZ2luZS4KKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7CisgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKTsKICAgICB9CisgICAgcmV0dXJuIGdldFZvbHVtZUluZGV4KGdldFZvbHVtZUN1cnZlcyhhdHRyKSwgaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0Vm9sdW1lSW5kZXgoY29uc3QgSVZvbHVtZUN1cnZlcyAmY3VydmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorewogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8KLSAgICAvLyB0aGUgc3RyYXRlZ3kgdGhlIHN0cmVhbSBiZWxvbmdzIHRvLgotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koZ2V0U3RyYXRlZ3koc3RyZWFtKSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICB9CiAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKKyAgICBpbmRleCA9IGN1cnZlcy5nZXRWb2x1bWVJbmRleChkZXZpY2UpOworICAgIEFMT0dWKCIlczogZGV2aWNlICUwOHggaW5kZXggJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZSwgaW5kZXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KIAotICAgICppbmRleCA9ICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSk7Ci0gICAgQUxPR1YoImdldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkIGRldmljZSAlMDh4IGluZGV4ICVkIiwgc3RyZWFtLCBkZXZpY2UsICppbmRleCk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KQoreworICAgIGluZGV4ID0gZ2V0Vm9sdW1lQ3VydmVzKGF0dHIpLmdldFZvbHVtZUluZGV4TWluKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KQoreworICAgIGluZGV4ID0gZ2V0Vm9sdW1lQ3VydmVzKGF0dHIpLmdldFZvbHVtZUluZGV4TWF4KCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0yMzY4LDkgKzI2MjUsOSBAQAogICAgIC8vIDM6IFRoZSBwcmltYXJ5IG91dHB1dAogICAgIC8vIDQ6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLCBudWxscHRyLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAKICAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgewogICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC0yMzg2LDcgKzI2NDMsNyBAQAogCiAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgIWRlc2MtPmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQykpIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmVPbmx5ICYmICFkZXNjLT5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cyBhY3RpdmVPbmx5ICVkIG91dHB1dCAlZCBmbGFncyAweCUwOHgiLApAQCAtMjQ0MSwyNCArMjY5OCw0NiBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBtRWZmZWN0cy5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKKyAgICByZXR1cm4gbUVmZmVjdHMucmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHNlc3Npb24sIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kgPT0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQoreworICAgIGlmIChtRWZmZWN0cy5nZXRFZmZlY3QoaWQpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtRWZmZWN0cy5pc0VmZmVjdEVuYWJsZWQoaWQpKSB7CisgICAgICAgIEFMT0dXKCIlcyBlZmZlY3QgJWQgZW5hYmxlZCIsIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICBzZXRFZmZlY3RFbmFibGVkKGlkLCBmYWxzZSk7CisgICAgfQorICAgIHJldHVybiBtRWZmZWN0cy51bnJlZ2lzdGVyRWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQoreworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdCA9IG1FZmZlY3RzLmdldEVmZmVjdChpZCk7CisgICAgaWYgKGVmZmVjdCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRWZmZWN0cy5zZXRFZmZlY3RFbmFibGVkKGlkLCBlbmFibGVkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1JbnB1dHMudHJhY2tFZmZlY3RFbmFibGVkKGVmZmVjdCwgZW5hYmxlZCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7Ci0gICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKLSAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQgJiYgIWFjdGl2ZTsgY3VyU3RyZWFtKyspIHsKLSAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBhY3RpdmUgPSBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0sIGluUGFzdE1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFjdGl2ZTsKKyAgICByZXR1cm4gbU91dHB1dHMuaXNBY3RpdmUodG9Wb2x1bWVTb3VyY2Uoc3RyZWFtKSwgaW5QYXN0TXMpOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1PdXRwdXRzLmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoc3RyZWFtLCBpblBhc3RNcyk7CisgICAgcmV0dXJuIG1PdXRwdXRzLmlzQWN0aXZlUmVtb3RlbHkodG9Wb2x1bWVTb3VyY2Uoc3RyZWFtKSwgaW5QYXN0TXMpOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdApAQCAtMjUwMywzMyArMjc4Miw0NSBAQAogICAgIHNwPEh3TW9kdWxlPiByU3VibWl4TW9kdWxlOwogICAgIC8vIGV4YW1pbmUgZWFjaCBtaXgncyByb3V0ZSB0eXBlCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaXhlcy5zaXplKCk7IGkrKykgewotICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLIG9yIE1JWF9ST1VURV9GTEFHX1JFTkRFUiwgbm90IHRoZSBjb21iaW5hdGlvbgotICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfQUxMKSA9PSBNSVhfUk9VVEVfRkxBR19BTEwpIHsKKyAgICAgICAgQXVkaW9NaXggbWl4ID0gbWl4ZXNbaV07CisgICAgICAgIC8vIE9ubHkgY2FwdHVyZSBvZiBwbGF5YmFjayBpcyBhbGxvd2VkIGluIExPT1BfQkFDSyAmIFJFTkRFUiBtb2RlCisgICAgICAgIGlmIChpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC5tUm91dGVGbGFncykgJiYgbWl4Lm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBQb2xpY3kgTWl4ICV6dSBvZiAlenU6ICIKKyAgICAgICAgICAgICAgICAgICJPbmx5IGNhcHR1cmUgb2YgcGxheWJhY2sgaXMgYWxsb3dlZCBpbiBMT09QX0JBQ0sgJiBSRU5ERVIgbW9kZSIsCisgICAgICAgICAgICAgICAgICAgaSwgbWl4ZXMuc2l6ZSgpKTsKICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSB7Ci0gICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJQb2xpY3lNaXhlcygpIG1peCAlenUgb2YgJXp1IGlzIExPT1BfQkFDSyIsIGksIG1peGVzLnNpemUoKSk7CisgICAgICAgIC8vIExPT1BfQkFDSyBhbmQgTE9PUF9CQUNLIHwgUkVOREVSIGhhdmUgdGhlIHNhbWUgcmVtb3RlIHN1Ym1peCBiYWNrZW5kIGFuZCBhcmUgaGFuZGxlZAorICAgICAgICAvLyBpbiB0aGUgc2FtZSB3YXkuCisgICAgICAgIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlclBvbGljeU1peGVzKCkgbWl4ICV6dSBvZiAlenUgaXMgTE9PUF9CQUNLICVkIiwgaSwgbWl4ZXMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgbWl4Lm1Sb3V0ZUZsYWdzKTsKICAgICAgICAgICAgIGlmIChyU3VibWl4TW9kdWxlID09IDApIHsKICAgICAgICAgICAgICAgICByU3VibWl4TW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKTsKICAgICAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIgVW5hYmxlIHRvIGZpbmQgYXVkaW8gbW9kdWxlIGZvciBzdWJtaXgsIGFib3J0aW5nIG1peCAlenUgcmVnaXN0cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIGF1ZGlvIG1vZHVsZSBmb3Igc3VibWl4LCBhYm9ydGluZyBtaXggJXp1IHJlZ2lzdHJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CiAgICAgICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peGVzW2ldLm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4Lm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgaWYgKG1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1peC5tRGV2aWNlVHlwZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXhlc1tpXSwgMCAvKm91dHB1dCBkZXNjKi8pICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBFcnJvciByZWdpc3RlcmluZyBtaXggJXp1IGZvciBhZGRyZXNzICVzIiwgaSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peCwgMCAvKm91dHB1dCBkZXNjKi8pICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGFkZHJlc3MgJXMiLCBpLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IG91dHB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBpbnB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBvdXRwdXRDb25maWcgPSBtaXgubUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGlucHV0Q29uZmlnID0gbWl4Lm1Gb3JtYXQ7CiAgICAgICAgICAgICAvLyBOT1RFOiBhdWRpbyBmbGluZ2VyIG1peGVyIGRvZXMgbm90IHN1cHBvcnQgbW9ubyBvdXRwdXQ6IGNvbmZpZ3VyZSByZW1vdGUgc3VibWl4IEhBTCBpbgogICAgICAgICAgICAgLy8gc3RlcmVvIGFuZCBsZXQgYXVkaW8gZmxpbmdlciBkbyB0aGUgY2hhbm5lbCBjb252ZXJzaW9uIGlmIG5lZWRlZC4KICAgICAgICAgICAgIG91dHB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CkBAIC0yNTM5LDMxICsyODMwLDM3IEBACiAgICAgICAgICAgICByU3VibWl4TW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUoYWRkcmVzcywgJmlucHV0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgYWRkcmVzcyk7CiAKLSAgICAgICAgICAgIGlmIChtaXhlc1tpXS5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICBpZiAobWl4Lm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKICAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBtaXhlc1tpXS5tRGV2aWNlVHlwZTsKKyAgICAgICAgfSBlbHNlIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gbWl4Lm1EZXZpY2VUeXBlOwogICAgICAgICAgICAgQUxPR1YoIiByZWdpc3RlclBvbGljeU1peGVzKCkgbWl4ICV6dSBvZiAlenUgaXMgUkVOREVSLCBkZXY9MHglWCBhZGRyPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgaSwgbWl4ZXMuc2l6ZSgpLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBpLCBtaXhlcy5zaXplKCksIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOworCisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgIG1peC5tRGV2aWNlVHlwZSwgbWl4Lm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sIGZvdW5kT3V0cHV0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMCA7IGogPCBtT3V0cHV0cy5zaXplKCkgOyBqKyspIHsKICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaik7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2ggPSBtQXVkaW9QYXRjaGVzLnZhbHVlRm9yKGRlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgICAgIGlmICgocGF0Y2ggIT0gMCkgJiYgKHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUgPT0gZGV2aWNlKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN0cm5jbXAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsIGFkZHJlc3Muc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4ZXNbaV0sIGRlc2MpICE9IE5PX0VSUk9SKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXgsIGRlc2MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IHJlZ2lzdGVyIG1peCBSRU5ERVIsICBkZXY9MHglWCBhZGRyPSVzIiwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE91dHB1dCA9IHRydWU7CkBAIC0yNTc0LDEyICsyODcxLDEyIEBACiAKICAgICAgICAgICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiIEVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGRldmljZSAweCVYIGFkZHIgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmICghZm91bmRPdXRwdXQpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiIE91dHB1dCBub3QgZm91bmQgZm9yIG1peCAlenUgZm9yIGRldmljZSAweCVYIGFkZHIgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjYyMCwxOCArMjkxNywxOCBAQAogICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgIHsKICAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIGFkZHJlc3Muc3RyaW5nKCkpID09CiAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSAgewogICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+cmVtb3ZlT3V0cHV0UHJvZmlsZShhZGRyZXNzKTsKICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPnJlbW92ZUlucHV0UHJvZmlsZShhZGRyZXNzKTsKIAotICAgICAgICB9IGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKKyAgICAgICAgfSBlbHNlIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChtaXgubURldmljZUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0yNjQxLDU3ICsyOTM4LDExNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wTWFudWFsU3Vycm91bmRGb3JtYXRzKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBzaXplX3QgaSA9IDA7CisgICAgY29uc3RleHByIHNpemVfdCBhdWRpb0Zvcm1hdFByZWZpeExlbiA9IHNpemVvZigiQVVESU9fRk9STUFUXyIpOworICAgIGZvciAoY29uc3QgYXV0byYgZm10IDogbU1hbnVhbFN1cnJvdW5kRm9ybWF0cykgeworICAgICAgICBpZiAoaSsrICE9IDApIGRzdC0+YXBwZW5kKCIsICIpOworICAgICAgICBzdGQ6OnN0cmluZyBzZm10OworICAgICAgICBGb3JtYXRDb252ZXJ0ZXI6OnRvU3RyaW5nKGZtdCwgc2ZtdCk7CisgICAgICAgIGRzdC0+YXBwZW5kKHNmbXQuc2l6ZSgpID49IGF1ZGlvRm9ybWF0UHJlZml4TGVuID8KKyAgICAgICAgICAgICAgICBzZm10LmNfc3RyKCkgKyBhdWRpb0Zvcm1hdFByZWZpeExlbiAtIDEgOiBzZm10LmNfc3RyKCkpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKKyAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSB7CisgICAgQUxPR1YoIiVzKCkgdWlkPSVkIG51bSBkZXZpY2VzICV6dSIsIF9fRlVOQ1RJT05fXywgdWlkLCBkZXZpY2VzLnNpemUoKSk7CisgICAgLy8gdWlkL2RldmljZSBhZmZpbml0eSBpcyBvbmx5IGZvciBvdXRwdXQgZGV2aWNlcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlc1tpXS5tVHlwZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRVaWREZXZpY2VBZmZpbml0aWVzKCkgZGV2aWNlPSUwOHggaXMgTk9UIGFuIG91dHB1dCBkZXZpY2UiLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VzW2ldLm1UeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdHVzX3QgcmVzID0gIG1Qb2xpY3lNaXhlcy5zZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CisgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyByZWV2YWx1YXRlIG91dHB1dHMgZm9yIGFsbCBnaXZlbiBkZXZpY2VzCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic2V0VWlkRGV2aWNlQWZmaW5pdGllcygpIGVycm9yIGluIGNoZWNrT3V0cHV0c0ZvckRldmljZSBmb3IgZGV2aWNlPSUwOHgiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFkZHI9JXMiLCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIEFMT0dWKCIlcygpIHVpZD0lZCIsIF9fRlVOQ1RJT05fXywgdWlkKTsKKyAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlczsKKyAgICBzdGF0dXNfdCByZXMgPSAgbVBvbGljeU1peGVzLmdldERldmljZXNGb3JVaWQodWlkLCBkZXZpY2VzKTsKKyAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHJlZXZhbHVhdGUgb3V0cHV0cyBmb3IgYWxsIGZvdW5kIGRldmljZXMKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKyAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSBlcnJvciBpbiBjaGVja091dHB1dHNGb3JEZXZpY2UgZm9yIGRldmljZT0lMDh4IGFkZHI9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwKKyAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkgPyBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlIDogQVVESU9fSU9fSEFORExFX05PTkUpOworICAgIHN0ZDo6c3RyaW5nIHN0YXRlTGl0ZXJhbDsKKyAgICBBdWRpb01vZGVDb252ZXJ0ZXI6OnRvU3RyaW5nKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSwgc3RhdGVMaXRlcmFsKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFBob25lIHN0YXRlOiAlc1xuIiwgc3RhdGVMaXRlcmFsLmNfc3RyKCkpOworICAgIGNvbnN0IGNoYXIqIGZvcmNlVXNlc1tBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF0gPSB7CisgICAgICAgICJjb21tdW5pY2F0aW9ucyIsICJtZWRpYSIsICJyZWNvcmQiLCAiZG9jayIsICJzeXN0ZW0iLAorICAgICAgICAiSERNSSBzeXN0ZW0gYXVkaW8iLCAiZW5jb2RlZCBzdXJyb3VuZCBvdXRwdXQiLCAidmlicmF0ZSByaW5naW5nIiB9OworICAgIGZvciAoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IGkgPSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT047CisgICAgICAgICBpIDwgQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQ7IGkgPSAoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90KSgoaW50KWkgKyAxKSkgeworICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlVmFsdWUgPSBtRW5naW5lLT5nZXRGb3JjZVVzZShpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JjZSB1c2UgZm9yICVzOiAlZCIsIGZvcmNlVXNlc1tpXSwgZm9yY2VVc2VWYWx1ZSk7CisgICAgICAgIGlmIChpID09IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCAmJgorICAgICAgICAgICAgICAgIGZvcmNlVXNlVmFsdWUgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZCgiIChNQU5VQUw6ICIpOworICAgICAgICAgICAgZHVtcE1hbnVhbFN1cnJvdW5kRm9ybWF0cyhkc3QpOworICAgICAgICAgICAgZHN0LT5hcHBlbmQoIikiKTsKKyAgICAgICAgfQorICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBUVFMgb3V0cHV0ICVzYXZhaWxhYmxlXG4iLCBtVHRzT3V0cHV0QXZhaWxhYmxlID8gIiIgOiAibm90ICIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgTWFzdGVyIG1vbm86ICVzXG4iLCBtTWFzdGVyTW9ubyA/ICJvbiIgOiAib2ZmIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDb25maWcgc291cmNlOiAlc1xuIiwgbUNvbmZpZy5nZXRTb3VyY2UoKS5jX3N0cigpKTsgLy8gZ2V0Q29uZmlnIG5vdCBjb25zdAorICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgb3V0cHV0IikpOworICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkF2YWlsYWJsZSBpbnB1dCIpKTsKKyAgICBtSHdNb2R1bGVzQWxsLmR1bXAoZHN0KTsKKyAgICBtT3V0cHV0cy5kdW1wKGRzdCk7CisgICAgbUlucHV0cy5kdW1wKGRzdCk7CisgICAgbUVmZmVjdHMuZHVtcChkc3QpOworICAgIG1BdWRpb1BhdGNoZXMuZHVtcChkc3QpOworICAgIG1Qb2xpY3lNaXhlcy5kdW1wKGRzdCk7CisgICAgbUF1ZGlvU291cmNlcy5kdW1wKGRzdCk7CisKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG5Qb2xpY3kgRW5naW5lIGR1bXA6XG4iKTsKKyAgICBtRW5naW5lLT5kdW1wKGRzdCk7Cit9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChpbnQgZmQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwKLSAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkgPyBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlIDogQVVESU9fSU9fSEFORExFX05PTkUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7Ci0gICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFBob25lIHN0YXRlOiAlc1xuIiwgc3RhdGVMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBjb21tdW5pY2F0aW9ucyAlZFxuIiwKLSAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgcmVjb3JkICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBkb2NrICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3Igc3lzdGVtICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBoZG1pIHN5c3RlbSBhdWRpbyAlZFxuIiwKLSAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU8pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZW5jb2RlZCBzdXJyb3VuZCBvdXRwdXQgJWRcbiIsCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFRUUyBvdXRwdXQgJXNcbiIsIG1UdHNPdXRwdXRBdmFpbGFibGUgPyAiYXZhaWxhYmxlIiA6ICJub3QgYXZhaWxhYmxlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KKyAgICBkdW1wKCZyZXN1bHQpOwogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKLSAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkF2YWlsYWJsZSBpbnB1dCIpKTsKLSAgICBtSHdNb2R1bGVzQWxsLmR1bXAoZmQpOwotICAgIG1PdXRwdXRzLmR1bXAoZmQpOwotICAgIG1JbnB1dHMuZHVtcChmZCk7Ci0gICAgbVZvbHVtZUN1cnZlcy0+ZHVtcChmZCk7Ci0gICAgbUVmZmVjdHMuZHVtcChmZCk7Ci0gICAgbUF1ZGlvUGF0Y2hlcy5kdW1wKGZkKTsKLSAgICBtUG9saWN5TWl4ZXMuZHVtcChmZCk7Ci0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTI3MTIsMTIgKzMwNjksOSBAQAogICAgIH0KIAogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKLSAgICBjaGFyIHByb3BWYWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIHByb3BWYWx1ZSwgIjAiKSkgewotICAgICAgICBpZiAoYXRvaShwcm9wVmFsdWUpICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZT0lcyIsIHByb3BWYWx1ZSApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKSkgeworICAgICAgICBBTE9HVigib2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8vIENoZWNrIGlmIHN0cmVhbSB0eXBlIGlzIG11c2ljLCB0aGVuIG9ubHkgYWxsb3cgb2ZmbG9hZCBhcyBvZiBub3cuCkBAIC0yNzM2LDkgKzMwOTAsMTIgQEAKICAgICB9CiAKICAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQotICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCBwcm9wVmFsdWUsIE5VTEwpKSB7Ci0gICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IChhdG9pKHByb3BWYWx1ZSkgKiAxMDAwMDAwICkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVzKSIsIHByb3BWYWx1ZSk7CisgICAgY29uc3QgaW50IG1pbl9kdXJhdGlvbl9zZWNzID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCAtMSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKKyAgICBpZiAobWluX2R1cmF0aW9uX3NlY3MgPj0gMCkgeworICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBtaW5fZHVyYXRpb25fc2VjcyAqIDEwMDAwMDBMTCkgeworICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbWluX2R1cmF0aW9uX3NlY3MpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyAqIDEwMDAwMDApIHsKQEAgLTI3NTgsMTUgKzMxMTUsMzQgQEAKIAogICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIHByb2ZpbGUgdG8gc3VwcG9ydCB0aGlzLgogICAgIC8vIEFVRElPX0RFVklDRV9OT05FCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChBVURJT19ERVZJQ0VfTk9ORSAvKmlnbm9yZSBkZXZpY2UgKi8sCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChEZXZpY2VWZWN0b3IoKSAvKmlnbm9yZSBkZXZpY2UgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlyZWN0T25seSAqLyk7CiAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZCgpIHByb2ZpbGUgJXNmb3VuZCIsIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiKTsKICAgICByZXR1cm4gKHByb2ZpbGUgIT0gMCk7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0X2ZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19mbGFnc190b19hdWRpb19vdXRwdXRfZmxhZ3MoYXR0cmlidXRlcy5mbGFncywgJm91dHB1dF9mbGFncyk7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChEZXZpY2VWZWN0b3IoKSAvKmlnbm9yZSBkZXZpY2UgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpcmVjdE9ubHkgKi8pOworICAgIEFMT0dWKCIlcygpIHByb2ZpbGUgJXNmb3VuZCB3aXRoIG5hbWU6ICVzLCAiCisgICAgICAgICJzYW1wbGUgcmF0ZTogJXUsIGZvcm1hdDogMHgleCwgY2hhbm5lbF9tYXNrOiAweCV4LCBvdXRwdXQgZmxhZ3M6IDB4JXgiLAorICAgICAgICBfX0ZVTkNUSU9OX18sIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiLAorICAgICAgICAocHJvZmlsZSAhPSAwID8gcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpIDogIm51bGwiKSwKKyAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuZm9ybWF0LCBjb25maWcuY2hhbm5lbF9tYXNrLCBvdXRwdXRfZmxhZ3MpOworICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTI4NzUsOCArMzI1MSw3IEBACiAgICAgfQogICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtIHNvdXJjZXMgJWQgbnVtIHNpbmtzICVkIiwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKIAotICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKLSAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fCBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgaWYgKCFhdWRpb19wYXRjaF9pc192YWxpZChwYXRjaCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gb25seSBvbmUgc291cmNlIHBlciBhdWRpbyBwYXRjaCBzdXBwb3J0ZWQgZm9yIG5vdwpAQCAtMjk0OCw4ICszMzIzLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIW91dHB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldkRlc2MtPnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MsCisgICAgICAgICAgICBpZiAoIW91dHB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKERldmljZVZlY3RvcihkZXZEZXNjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyB1cGRhdGVkU2FtcGxpbmdSYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwKQEAgLTI5NzAsNyArMzM0NCw3IEBACiAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCiAgICAgICAgICAgICAgIGRldmljZXMudHlwZXMoKSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRldmljZXMudHlwZXMoKSwgdHJ1ZSwgMCwgaGFuZGxlKTsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBkZXZpY2VzLCB0cnVlLCAwLCBoYW5kbGUpOwogICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgewpAQCAtMjk5OSwxNCArMzM3MywxMyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgaWYgKGRldkRlc2MgPT0gMCkgeworICAgICAgICAgICAgaWYgKGRldmljZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCFpbnB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldkRlc2MtPnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcywKKyAgICAgICAgICAgIGlmICghaW5wdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShEZXZpY2VWZWN0b3IoZGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkU2FtcGxlUmF0ZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdCwKQEAgLTMwMjAsOSArMzM5Myw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQotICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPnR5cGUoKSwgaW5wdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsIGRldkRlc2MtPnR5cGUoKSwgdHJ1ZSwgaGFuZGxlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIHNldHRpbmcgZGV2aWNlICVzIG9uIG91dHB1dCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZpY2UsIHRydWUsIGhhbmRsZSk7CiAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CkBAIC0zMDQyLDE2ICszNDE1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UgPQogICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICBpZiAoc3JjRGV2aWNlRGVzYyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoc3JjRGV2aWNlID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvL3VwZGF0ZSBzb3VyY2UgYW5kIHNpbmsgd2l0aCBvdXIgb3duIGRhdGEgYXMgdGhlIGRhdGEgcGFzc2VkIGluIHRoZSBwYXRjaCBtYXkKICAgICAgICAgICAgIC8vIGJlIGluY29tcGxldGUuCiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbmV3UGF0Y2ggPSAqcGF0Y2g7Ci0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1swXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgIHNyY0RldmljZS0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMF0sICZwYXRjaC0+c291cmNlc1swXSk7CiAKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKQEAgLTMwNTksMjkgKzM0MzIsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlID0KICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbaV0uaWQpOwotICAgICAgICAgICAgICAgIGlmIChzaW5rRGV2aWNlRGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2UgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNpbmtzW2ldLCAmcGF0Y2gtPnNpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBzaW5rRGV2aWNlLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOwogCiAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgc29mdHdhcmUgYnJpZGdlIGluIFBhdGNoUGFuZWwgaWY6CiAgICAgICAgICAgICAgICAgLy8gLSBzb3VyY2UgYW5kIHNpbmsgZGV2aWNlcyBhcmUgb24gZGlmZmVyZW50IEhXIG1vZHVsZXMgT1IKICAgICAgICAgICAgICAgICAvLyAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzIDwgMy4wCi0gICAgICAgICAgICAgICAgaWYgKCFzcmNEZXZpY2VEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlRGVzYykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzcmNEZXZpY2VEZXNjLT5tTW9kdWxlLT5nZXRIYWxWZXJzaW9uTWFqb3IoKSA8IDMpKSB7CisgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA+PSAzLjAgYnV0IG5vIHJvdXRlIGhhcyBiZWVuIGRlY2xhcmVkIGJldHdlZW4gZGV2aWNlcworICAgICAgICAgICAgICAgIGlmICghc3JjRGV2aWNlLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZS0+Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgPCAzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXNyY0RldmljZS0+Z2V0TW9kdWxlKCktPnN1cHBvcnRzUGF0Y2goc3JjRGV2aWNlLCBzaW5rRGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIHNpbmsgZGV2aWNlIGZvciBub3cgdG8gc2ltcGxpZnkgb3V0cHV0IHNlbGVjdGlvbiBsb2dpYwogICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHNpbmtEZXZpY2VEZXNjLT50eXBlKCksIG1PdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlcyhEZXZpY2VWZWN0b3Ioc2lua0RldmljZSksIG1PdXRwdXRzKTsKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8gZ28gdmlhCiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb3V0cHV0IHN0cmVhbSBieSBhZGRpbmcgYSBzZWNvbmQgc291cmNlIHRvIHRoZSBwYXRjaCBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewpAQCAtMzA5NSwyOCArMzQ2OCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmcm9tIHJvdXRpbmcgY2FwYWJpbGl0aWVzIGluIGNvbmZpZyBmaWxlIGFuZCBvdGhlciBjb25mbGljdGluZyBwYXRjaGVzCiAKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZuZXdQYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmbmV3UGF0Y2gsIHVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gbmV3UGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgICpoYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxQYXRjaChfX2Z1bmNfXywgaW5kZXgsIGhhbmRsZSwgJm5ld1BhdGNoLCAwLCB1aWQsICZwYXRjaERlc2MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsCiAgICAgICAgICAgICAgICAgc3RhdHVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0zMTU2LDExICszNTA5LDExIEBACiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CiAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CiAgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOwpAQCAtMzI0OSwxMCArMzYwMiwxMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWc7CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGJhY2t1cENvbmZpZyA9IHt9OwogICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCAmYmFja3VwQ29uZmlnKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWc7CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWcgPSB7fTsKICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCBjb25maWcpOwogICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIDApOwogICAgIH0KQEAgLTMyODAsMzEgKzM2MzMsMzEgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1N0cmF0ZWd5Um91dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrU3RyYXRlZ3lSb3V0ZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMsIGF1ZGlvX2lvX2hhbmRsZV90IG91cHR1dFRvU2tpcCkKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisgICAgLy8gVGFrZSB0aGUgZmlyc3QgYXR0cmlidXRlcyBmb2xsb3dpbmcgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgYXMgaXQgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgcm91dGVkCisgICAgLy8gZGV2aWNlLiBBbGwgYXR0cmlidXRlcyB3aWhpbiBhIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgInJvdXRpbmcgc3RyYXRlZ3kiCisgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcykuZnJvbnQoKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZhbHNlKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtT3V0cHV0cy5zaXplKCk7IGorKykgewogICAgICAgICBpZiAobU91dHB1dHMua2V5QXQoaikgPT0gb3VwdHV0VG9Ta2lwKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaik7Ci0gICAgICAgIGlmICghaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCAocm91dGluZ19zdHJhdGVneSlzdHJhdGVneSkpIHsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHBzKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgLy8gSWYgdGhlIGRlZmF1bHQgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5IGlzIG9uIGFub3RoZXIgb3V0cHV0IG1peCwKICAgICAgICAgLy8gaW52YWxpZGF0ZSBhbGwgdHJhY2tzIGluIHRoaXMgc3RyYXRlZ3kgdG8gZm9yY2UgcmUgY29ubmVjdGlvbi4KICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlbGVjdCBuZXcgZGV2aWNlIG9uIHRoZSBvdXRwdXQgbWl4LgogICAgICAgICBpZiAob3V0cHV0cy5pbmRleE9mKG1PdXRwdXRzLmtleUF0KGopKSA8IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoYXV0byBzdHJlYW0gOiBtRW5naW5lLT5nZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcykpIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBuZXdEZXZpY2UsIGZhbHNlKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLCBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0zMzEyLDEzICszNjY1LDE4IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYXJTZXNzaW9uUm91dGVzKHVpZF90IHVpZCkKIHsKICAgICAvLyByZW1vdmUgb3V0cHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKLSAgICBTb3J0ZWRWZWN0b3I8cm91dGluZ19zdHJhdGVneT4gYWZmZWN0ZWRTdHJhdGVnaWVzOwotICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbU91dHB1dFJvdXRlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1PdXRwdXRSb3V0ZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHJvdXRlLT5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgaWYgKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZmZWN0ZWRTdHJhdGVnaWVzLmFkZChnZXRTdHJhdGVneShyb3V0ZS0+bVN0cmVhbVR5cGUpKTsKKyAgICBzdGQ6OnZlY3Rvcjxwcm9kdWN0X3N0cmF0ZWd5X3Q+IGFmZmVjdGVkU3RyYXRlZ2llczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogb3V0cHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkgJiYgY2xpZW50LT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50U3RyYXRlZ3kgPSBjbGllbnQtPnN0cmF0ZWd5KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChiZWdpbihhZmZlY3RlZFN0cmF0ZWdpZXMpLCBlbmQoYWZmZWN0ZWRTdHJhdGVnaWVzKSwgY2xpZW50U3RyYXRlZ3kpICE9CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQoYWZmZWN0ZWRTdHJhdGVnaWVzKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWZmZWN0ZWRTdHJhdGVnaWVzLnB1c2hfYmFjayhjbGllbnQtPnN0cmF0ZWd5KCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzMyOSwxMiArMzY4NywxMiBAQAogCiAgICAgLy8gcmVtb3ZlIGlucHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc291cmNlX3Q+IGFmZmVjdGVkU291cmNlczsKLSAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1JbnB1dFJvdXRlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAocm91dGUtPm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICBtSW5wdXRSb3V0ZXMucmVtb3ZlSXRlbXNBdChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgICAgIGFmZmVjdGVkU291cmNlcy5hZGQocm91dGUtPm1Tb3VyY2UpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGlucHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkgJiYgY2xpZW50LT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgIGFmZmVjdGVkU291cmNlcy5hZGQoY2xpZW50LT5zb3VyY2UoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzQyLDcgKzM3MDAsNyBAQAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzVG9DbG9zZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGFmZmVjdGVkU291cmNlcy5pbmRleE9mKGlucHV0RGVzYy0+aW5wdXRTb3VyY2UoKSkgPj0gMCkgeworICAgICAgICBpZiAoYWZmZWN0ZWRTb3VyY2VzLmluZGV4T2YoaW5wdXREZXNjLT5zb3VyY2UoKSkgPj0gMCkgewogICAgICAgICAgICAgaW5wdXRzVG9DbG9zZS5hZGQoaW5wdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzM1NCw4ICszNzEyLDggQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvU291cmNlcyh1aWRfdCB1aWQpCiB7CiAgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9Tb3VyY2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChzb3VyY2VEZXNjLT5tVWlkID09IHVpZCkgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYy0+dWlkKCkgPT0gdWlkKSB7CiAgICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2UobUF1ZGlvU291cmNlcy5rZXlBdChpKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzY3LDg3ICszNzI1LDExMCBAQAogewogICAgICpzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOwogICAgICppb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX0lOUFVUKTsKLSAgICAqZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX0hPVFdPUkQpOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0geyAuc291cmNlID0gQVVESU9fU09VUkNFX0hPVFdPUkQgfTsKKyAgICAqZGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHIpLT50eXBlKCk7CiAKICAgICByZXR1cm4gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmFjcXVpcmVTZXNzaW9uKCpzZXNzaW9uLCAqaW9IYW5kbGUpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQogewotICAgIEFMT0dWKCIlcyBzb3VyY2UgJXAgYXR0cmlidXRlcyAlcCBoYW5kbGUgJXAiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlKTsKLSAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKworICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgcG9ydElkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzIGludmFsaWQgYXJndW1lbnQ6IHNvdXJjZSAlcCBhdHRyaWJ1dGVzICVwIGhhbmRsZSAlcCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLQogICAgIGlmIChzb3VyY2UtPnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fAogICAgICAgICAgICAgc291cmNlLT50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgQUxPR1YoIiVzIElOVkFMSURfT1BFUkFUSU9OIHNvdXJjZS0+cm9sZSAlZCBzb3VyY2UtPnR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+cm9sZSwgc291cmNlLT50eXBlKTsKKyAgICAgICAgQUxPR1coIiVzIElOVkFMSURfT1BFUkFUSU9OIHNvdXJjZS0+cm9sZSAlZCBzb3VyY2UtPnR5cGUgJWQiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+cm9sZSwgc291cmNlLT50eXBlKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSA9CiAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHNvdXJjZS0+ZXh0LmRldmljZS5hZGRyZXNzKSk7Ci0gICAgaWYgKHNyY0RldmljZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVigiJXMgc291cmNlLT5leHQuZGV2aWNlLnR5cGUgJTA4eCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoc291cmNlLT5leHQuZGV2aWNlLmFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIGlmIChzcmNEZXZpY2UgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgc291cmNlLT5leHQuZGV2aWNlLnR5cGUgJTA4eCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0KLSAgICAgICAgICAgIG5ldyBBdWRpb1NvdXJjZURlc2NyaXB0b3Ioc3JjRGV2aWNlRGVzYywgYXR0cmlidXRlcywgdWlkKTsKIAotICAgIHN0cnVjdCBhdWRpb19wYXRjaCBkdW1teVBhdGNoOworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworCisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIGR1bW15UGF0Y2ggPSB7fTsKICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmZHVtbXlQYXRjaCwgdWlkKTsKLSAgICBzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjID0gcGF0Y2hEZXNjOworCisgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9CisgICAgICAgIG5ldyBTb3VyY2VDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHVpZCwgKmF0dHJpYnV0ZXMsIHBhdGNoRGVzYywgc3JjRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygqYXR0cmlidXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoKmF0dHJpYnV0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1ZvbHVtZVNvdXJjZSgqYXR0cmlidXRlcykpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUF1ZGlvU291cmNlcy5hZGQoc291cmNlRGVzYy0+Z2V0SGFuZGxlKCksIHNvdXJjZURlc2MpOwotICAgICAgICAqaGFuZGxlID0gc291cmNlRGVzYy0+Z2V0SGFuZGxlKCk7CisgICAgICAgIG1BdWRpb1NvdXJjZXMuYWRkKCpwb3J0SWQsIHNvdXJjZURlc2MpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCiB7Ci0gICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOworICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKIAogICAgIC8vIG1ha2Ugc3VyZSB3ZSBvbmx5IGhhdmUgb25lIHBhdGNoIHBlciBzb3VyY2UuCiAgICAgZGlzY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOwogCi0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPSBzb3VyY2VEZXNjLT5tRGV2aWNlOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gc291cmNlRGVzYy0+YXR0cmlidXRlcygpOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc291cmNlRGVzYy0+c3RyZWFtKCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlID0gc291cmNlRGVzYy0+c3JjRGV2aWNlKCk7CiAKLSAgICBhdWRpb19kZXZpY2VzX3Qgc2lua0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlRGVzYyA9Ci0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2Uoc2lua0RldmljZSwgU3RyaW5nOCgiIikpOworICAgIERldmljZVZlY3RvciBzaW5rRGV2aWNlcyA9CisgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCB0cnVlKTsKKyAgICBBTE9HX0FTU0VSVCghc2lua0RldmljZXMuaXNFbXB0eSgpLCAiY29ubmVjdEF1ZGlvU291cmNlKCk6IG5vIGRldmljZSBmb3VuZCBmb3IgYXR0cmlidXRlcyIpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2UgPSBzaW5rRGV2aWNlcy5pdGVtQXQoMCk7CisgICAgQUxPR19BU1NFUlQobUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnMoc2lua0RldmljZSksICIlczogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1QYXRjaDsKIAotICAgIGlmIChzcmNEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+Z2V0SGFuZGxlKCkgPT0KLSAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+Z2V0SGFuZGxlKCkgJiYKLSAgICAgICAgICAgIHNyY0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5nZXRIYWxWZXJzaW9uTWFqb3IoKSA+PSAzICYmCi0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bUdhaW5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgQUxPR1YoIiVzIEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzAiLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChzcmNEZXZpY2UtPmhhc1NhbWVId01vZHVsZUFzKHNpbmtEZXZpY2UpICYmCisgICAgICAgICAgICBzcmNEZXZpY2UtPmdldE1vZHVsZVZlcnNpb25NYWpvcigpID49IDMgJiYKKyAgICAgICAgICAgIHNpbmtEZXZpY2UtPmdldE1vZHVsZSgpLT5zdXBwb3J0c1BhdGNoKHNyY0RldmljZSwgc2lua0RldmljZSkgJiYKKyAgICAgICAgICAgIHNyY0RldmljZS0+Z2V0QXVkaW9Qb3J0KCktPm1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgIEFMT0dWKCIlcyBEZXZpY2UgdG8gRGV2aWNlIHJvdXRlIHN1cHBvcnRlZCBieSA+PTMuMCBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAvLyBUT0RPOiBtYXkgZXhwbGljaXRseSBzcGVjaWZ5IHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBIVyBvciBTVyBwYXRjaAogICAgICAgICAvLyAgIGNyZWF0ZSBwYXRjaCBiZXR3ZWVuIHNyYyBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UKICAgICAgICAgLy8gICBjcmVhdGUgSHdvdXRwdXQgYW5kIGFkZCB0byBtSHdPdXRwdXRzCiAgICAgfSBlbHNlIHsKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlLCBtT3V0cHV0cyk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9Ci0gICAgICAgICAgICAgICAgc2VsZWN0T3V0cHV0KG91dHB1dHMsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNvdXJjZURlc2MtPmNvbmZpZygpLnNhbXBsZV9yYXRlOworICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gc291cmNlRGVzYy0+Y29uZmlnKCkuY2hhbm5lbF9tYXNrOworICAgICAgICBjb25maWcuZm9ybWF0ID0gc291cmNlRGVzYy0+Y29uZmlnKCkuZm9ybWF0OworICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIGJvb2wgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBzZWNvbmRhcnlPdXRwdXRzOworICAgICAgICBnZXRPdXRwdXRGb3JBdHRySW50KCZyZXN1bHRBdHRyLCAmb3V0cHV0LCBBVURJT19TRVNTSU9OX05PTkUsCisgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsICZzdHJlYW0sIHNvdXJjZURlc2MtPnVpZCgpLCAmY29uZmlnLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgJnNlbGVjdGVkRGV2aWNlSWQsICZpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKKyAgICAgICAgICAgICAgICAmc2Vjb25kYXJ5T3V0cHV0cyk7CiAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBubyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IiwgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBubyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IiwgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIG91dHB1dCBmb3IgZGV2aWNlICUwOHggaXMgZHVwbGljYXRlZCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCBpcyBkdXBsaWNhdGVkIiwgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5zdGFydCgpOwpAQCAtMzQ2MCw1MSArMzg0MSw1NiBAQAogICAgICAgICAvLyBiZSBjb25uZWN0ZWQgYXMgd2VsbCBhcyB0aGUgc3RyZWFtIHR5cGUgZm9yIHZvbHVtZSBjb250cm9sCiAgICAgICAgIC8vIC0gdGhlIHNpbmsgaXMgZGVmaW5lZCBieSB3aGF0ZXZlciBvdXRwdXQgZGV2aWNlIGlzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgdGhlIG91dHB1dAogICAgICAgICAvLyB0aG91Z2ggd2hpY2ggdGhpcyBwYXRjaCBpcyByb3V0ZWQuCi0gICAgICAgIHBhdGNoLT5udW1fc2lua3MgPSAwOwotICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMgPSAyOwotICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2gtPnNvdXJjZXNbMF0sIE5VTEwpOwotICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2gtPnNvdXJjZXNbMV0sIE5VTEwpOwotICAgICAgICBwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gc3RyZWFtOwotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwKKyAgICAgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShzcmNEZXZpY2UpLmFkZFNvdXJjZShvdXRwdXREZXNjLCB7IC5zdHJlYW0gPSBzdHJlYW0gfSk7CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAgICAgICAgIEFMT0dWKCIlcyBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1QYXRjaCA9ICpwYXRjaEJ1aWxkZXIucGF0Y2goKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coIiVzIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldENsaWVudChzb3VyY2VEZXNjLT5wb3J0SWQoKSkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBwb3J0SWQgaGFzIGFscmVhZHkgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXREZXNjIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlc2MtPmFkZENsaWVudChzb3VyY2VEZXNjKTsKKwogICAgICAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKLSAgICAgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBzaW5rRGV2aWNlLCBOVUxMLCAmZGVsYXlNcyk7CisgICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHNvdXJjZURlc2MsICZkZWxheU1zKTsKIAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgIHNvdXJjZURlc2MtPm1Td091dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG91dHB1dERlc2MpOwogICAgICAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CiAgICAgICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgIGFkZEF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSwgc291cmNlRGVzYy0+bVBhdGNoRGVzYyk7CisgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICBhZGRBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlLCBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSBfX3VudXNlZCkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVGb3IoaGFuZGxlKTsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKHBvcnRJZCk7CisgICAgQUxPR1YoIiVzIHBvcnQgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgaWYgKHNvdXJjZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgdW5rbm93biBzb3VyY2UgZm9yIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzIHVua25vd24gc291cmNlIGZvciBwb3J0IElEICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKLSAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0oaGFuZGxlKTsKKyAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNTQ5LDUxICszOTM1LDcgQEAKIGZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7Ci0gICAgcmV0dXJuIGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdXBwb3J0ZWRGb3JtYXRzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFZlY3RvciYgZm9ybWF0cykgewotICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBTdHJpbmc4IHJlcGx5OwotICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBpb0hhbmRsZSwgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cykpOwotICAgIEFMT0dWKCIlczogc3VwcG9ydGVkIGZvcm1hdHMgJXMiLCBfX0ZVTkNUSU9OX18sIHJlcGx5LnN0cmluZygpKTsKLSAgICBBdWRpb1BhcmFtZXRlciByZXBsaWVkUGFyYW1ldGVycyhyZXBseSk7Ci0gICAgaWYgKHJlcGxpZWRQYXJhbWV0ZXJzLmdldCgKLSAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpLCByZXBseSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmV0cmlldmUgZm9ybWF0LCBiYWlsaW5nIG91dCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGZvciAoYXV0byBmb3JtYXQgOiBmb3JtYXRzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSkpIHsKLSAgICAgICAgLy8gT25seSBBVURJT19GT1JNQVRfQUFDX0xDIHdpbGwgYmUgdXNlZCBpbiBTZXR0aW5ncyBVSSBmb3IgYWxsIEFBQyBmb3JtYXRzLgotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gQUFDX0ZPUk1BVFNbaV0pIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfQUFDX0xDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJvb2wgZXhpc3QgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ID09IGZvcm1hdHNbaV0pIHsKLSAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBpc1N1cnJvdW5kRm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoU1VSUk9VTkRfRk9STUFUU1tpXSA9PSBmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4aXN0ICYmIGlzU3Vycm91bmRGb3JtYXQpIHsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKGZvcm1hdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBjb21wdXRlVm9sdW1lKGdldFZvbHVtZUN1cnZlcyhzdHJlYW0pLCB0b1ZvbHVtZVNvdXJjZShzdHJlYW0pLCBpbmRleCwgZGV2aWNlKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdXJyb3VuZEZvcm1hdHModW5zaWduZWQgaW50ICpudW1TdXJyb3VuZEZvcm1hdHMsCkBAIC0zNjA1LDI2MSArMzk0NywxOTkgQEAKICAgICAgICAgICAgIChzdXJyb3VuZEZvcm1hdHMgPT0gTlVMTCB8fCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkID09IE5VTEwpKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiZ2V0U3Vycm91bmRGb3JtYXRzKCkgbnVtU3Vycm91bmRGb3JtYXRzICVkIHN1cnJvdW5kRm9ybWF0cyAlcCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkICVwIiwKLSAgICAgICAgICAgICpudW1TdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCk7Ci0KLSAgICAvLyBPbmx5IHJldHVybiB2YWx1ZSBpZiB0aGVyZSBpcyBIRE1JIG91dHB1dC4KLSAgICBpZiAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX0hETUkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KKyAgICBBTE9HVigiJXMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgJXAgcmVwb3J0ZWQgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sICpudW1TdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwgcmVwb3J0ZWQpOwogCiAgICAgc2l6ZV90IGZvcm1hdHNXcml0dGVuID0gMDsKICAgICBzaXplX3QgZm9ybWF0c01heCA9ICpudW1TdXJyb3VuZEZvcm1hdHM7Ci0gICAgKm51bVN1cnJvdW5kRm9ybWF0cyA9IDA7Ci0gICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRzOyAvLyBVc2VzIHByaW1hcnkgc3Vycm91bmQgZm9ybWF0cyBvbmx5CiAgICAgaWYgKHJlcG9ydGVkKSB7Ci0gICAgICAgIC8vIE9ubHkgZ2V0IHN1cnJvdW5kIGZvcm1hdHMgd2hpY2ggYXJlIHJlcG9ydGVkIGJ5IGRldmljZS4KLSAgICAgICAgLy8gRmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfSERNSTsKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOwotICAgICAgICBib29sIHJlcG9ydGVkRm9ybWF0Rm91bmQgPSBmYWxzZTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE9wZW4gYW4gb3V0cHV0IHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycy4KLSAgICAgICAgRGV2aWNlVmVjdG9yIGhkbWlPdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGRtaU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoQVVESU9fREVWSUNFX09VVF9IRE1JKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnN1cHBvcnREZXZpY2VBZGRyZXNzKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHMuaXRlbUF0KGopKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gb3V0cHV0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBnZXRTdXBwb3J0ZWRGb3JtYXRzKG91dHB1dHMuaXRlbUF0KGopLCBmb3JtYXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZEZvcm1hdEZvdW5kIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk1heCBPdXRwdXQgbnVtYmVyICV1IGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1heE9wZW5Db3VudCwgcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IHdpdGggcGFyYW1zICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLCBkZXZpY2UsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldFN1cHBvcnRlZEZvcm1hdHMob3V0cHV0LCBmb3JtYXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZEZvcm1hdEZvdW5kIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIC8vIFJldHVybiBmb3JtYXRzIGZyb20gYWxsIGRldmljZSBwcm9maWxlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkIGJ5CisgICAgICAgIC8vIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXTsKKyAgICAgICAgICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzID0KKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5nZXRBdWRpb1BvcnQoKS0+Z2V0QXVkaW9Qcm9maWxlcygpLmdldFN1cHBvcnRlZEZvcm1hdHMoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc3VwcG9ydGVkRm9ybWF0cy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmNvdW50KHN1cHBvcnRlZEZvcm1hdHNbal0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQoc3VwcG9ydGVkRm9ybWF0c1tqXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIuc2Vjb25kLmNvdW50KHN1cHBvcnRlZEZvcm1hdHNbal0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLmluc2VydChwYWlyLmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGlmICghcmVwb3J0ZWRGb3JtYXRGb3VuZCkgewotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoU1VSUk9VTkRfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoU1VSUk9VTkRfRk9STUFUU1tpXSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBhaXIuZmlyc3QpOwogICAgICAgICB9CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICpudW1TdXJyb3VuZEZvcm1hdHMgPSBmb3JtYXRzLnNpemUoKTsKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOworICAgIGZvciAoY29uc3QgYXV0byYgZm9ybWF0OiBmb3JtYXRzKSB7CiAgICAgICAgIGlmIChmb3JtYXRzV3JpdHRlbiA8IGZvcm1hdHNNYXgpIHsKLSAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c1tmb3JtYXRzV3JpdHRlbl0gPSBmb3JtYXRzW2ldOwotICAgICAgICAgICAgYm9vbCBmb3JtYXRFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0c1tpXSA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZmluZChBQUNfRk9STUFUU1tpXSkgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKTsKKyAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c1tmb3JtYXRzV3JpdHRlbl0gPSBmb3JtYXQ7CisgICAgICAgICAgICBib29sIGZvcm1hdEVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgc3dpdGNoIChmb3JjZVVzZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5jb3VudChmb3JtYXQpICE9IDA7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IG1TdXJyb3VuZEZvcm1hdHMuZmluZChmb3JtYXRzW2ldKSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVI6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gQVVUTyBvciBBTFdBWVMgPT4gdHJ1ZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRbZm9ybWF0c1dyaXR0ZW4rK10gPSBmb3JtYXRFbmFibGVkOwogICAgICAgICB9Ci0gICAgICAgICgqbnVtU3Vycm91bmRGb3JtYXRzKSsrOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpCiB7Ci0gICAgLy8gQ2hlY2sgaWYgYXVkaW8gZm9ybWF0IGlzIGEgc3Vycm91bmQgZm9ybWF0cy4KLSAgICBib29sIGlzU3Vycm91bmRGb3JtYXQgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoU1VSUk9VTkRfRk9STUFUUyk7IGkrKykgewotICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gU1VSUk9VTkRfRk9STUFUU1tpXSkgewotICAgICAgICAgICAgaXNTdXJyb3VuZEZvcm1hdCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWlzU3Vycm91bmRGb3JtYXQpIHsKKyAgICBBTE9HVigiJXMoKSBmb3JtYXQgMHglWCBlbmFibGVkICVkIiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKKyAgICBjb25zdCBhdXRvJiBmb3JtYXRJdGVyID0gbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKS5maW5kKGF1ZGlvRm9ybWF0KTsKKyAgICBpZiAoZm9ybWF0SXRlciA9PSBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCIlcygpIGZvcm1hdCAweCVYIGlzIG5vdCBhIGtub3duIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBhdWRpb0Zvcm1hdCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gTUFOVUFMLgotICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKLSAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwotICAgIGlmIChmb3JjZVVzZSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKKyAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKSAhPQorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7CisgICAgICAgIEFMT0dXKCIlcygpIG5vdCBpbiBtYW51YWwgbW9kZSBmb3Igc3Vycm91bmQgc291bmQgZm9ybWF0IHNlbGVjdGlvbiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGlmICgobVN1cnJvdW5kRm9ybWF0cy5maW5kKGF1ZGlvRm9ybWF0KSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpICYmIGVuYWJsZWQpCi0gICAgICAgICAgICB8fCAobVN1cnJvdW5kRm9ybWF0cy5maW5kKGF1ZGlvRm9ybWF0KSA9PSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpICYmICFlbmFibGVkKSkgeworICAgIGlmICgobU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5jb3VudChhdWRpb0Zvcm1hdCkgIT0gMCkgPT0gZW5hYmxlZCkgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgLy8gVGhlIG9wZXJhdGlvbiBpcyB2YWxpZCBvbmx5IHdoZW4gdGhlcmUgaXMgSERNSSBvdXRwdXQgYXZhaWxhYmxlLgotICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfSERNSSkgPT0gMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBzdXJyb3VuZEZvcm1hdHNCYWNrdXAobU1hbnVhbFN1cnJvdW5kRm9ybWF0cyk7CiAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YkZvcm1hdCA6IGZvcm1hdEl0ZXItPnNlY29uZCkgeworICAgICAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoc3ViRm9ybWF0KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWJGb3JtYXQgOiBmb3JtYXRJdGVyLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZXJhc2Uoc3ViRm9ybWF0KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjOwogICAgIGJvb2wgcHJvZmlsZVVwZGF0ZWQgPSBmYWxzZTsKLSAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgRGV2aWNlVmVjdG9yIGhkbWlPdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzaygKICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAvLyBTaW11bGF0ZSByZWNvbm5lY3Rpb24gdG8gdXBkYXRlIGVuYWJsZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cy4KLSAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaU91dHB1dERldmljZXNbaV0tPm1BZGRyZXNzOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+YWRkcmVzcygpOwogICAgICAgICBTdHJpbmc4IG5hbWUgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+Z2V0TmFtZSgpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIHByb2ZpbGVVcGRhdGVkIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwogICAgIH0KLSAgICBEZXZpY2VWZWN0b3IgaGRtaUlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAorICAgIC8vIEZJWE1FOiBXaHkgZG9pbmcgdGhpcyBmb3IgaW5wdXQgSERNSSBkZXZpY2VzIGlmIHdlIGRvbid0IGF1Z21lbnQgdGhlaXIgcmVwb3J0ZWQgZm9ybWF0cz8KKyAgICBEZXZpY2VWZWN0b3IgaGRtaUlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzaygKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSERNSSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIC8vIFNpbXVsYXRlIHJlY29ubmVjdGlvbiB0byB1cGRhdGUgZW5hYmxlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzLgotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKKyAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaUlucHV0RGV2aWNlc1tpXS0+YWRkcmVzcygpOwogICAgICAgICBTdHJpbmc4IG5hbWUgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5nZXROYW1lKCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fSERNSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIHByb2ZpbGVVcGRhdGVkIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwogICAgIH0KIAotICAgIC8vIFVuZG8gdGhlIHN1cnJvdW5kIGZvcm1hdHMgY2hhbmdlIGR1ZSB0byBubyBhdWRpbyBwcm9maWxlcyB1cGRhdGVkLgogICAgIGlmICghcHJvZmlsZVVwZGF0ZWQpIHsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShhdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR1coIiVzKCkgbm8gYXVkaW8gcHJvZmlsZXMgdXBkYXRlZCwgdW5kb2luZyBzdXJyb3VuZCBmb3JtYXRzIGNoYW5nZSIsIF9fZnVuY19fKTsKKyAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cyA9IHN0ZDo6bW92ZShzdXJyb3VuZEZvcm1hdHNCYWNrdXApOwogICAgIH0KIAogICAgIHJldHVybiBwcm9maWxlVXBkYXRlZCA/IE5PX0VSUk9SIDogSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSkKIHsKLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOnNldFJlY29yZFNpbGVuY2VkKHVpZDolZCwgc2lsZW5jZWQ6JWQpIiwgdWlkLCBzaWxlbmNlZCk7CisgICAgQUxPR1YoIiVzKHVpZDolZCwgc3RhdGU6JWQpIiwgX19mdW5jX18sIHVpZCwgc3RhdGUpOwogCi0gICAgVmVjdG9yPHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVJbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBhY3RpdmVJbnB1dHNbaV07Ci0gICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPSBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKHRydWUpOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGFjdGl2ZVNlc3Npb25zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy52YWx1ZUF0KGopOwotICAgICAgICAgICAgaWYgKGFjdGl2ZVNlc3Npb24tPnVpZCgpID09IHVpZCkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVNlc3Npb24tPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBpbnB1dERlc2MtPmNsaWVudHNMaXN0KGZhbHNlIC8qYWN0aXZlT25seSovKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICBpZiAodWlkID09IGNsaWVudC0+dWlkKCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldEFwcFN0YXRlKHN0YXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKIHsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKKyAgICAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmb3V0UHJvZmlsZSA6IG91dHB1dFByb2ZpbGVzKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBhdWRpb1BvcnQ7CisgICAgICAgICAgICBvdXRQcm9maWxlLT50b0F1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXVkaW9Qb3J0Lm51bV9jaGFubmVsX21hc2tzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9Qb3J0LmNoYW5uZWxfbWFza3NbaV0gJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KIAotICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVGb3Ioc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3sKKyAgICBBTE9HVigiJXMgcG9ydCBJZCAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+cG9ydElkKCkpOworCisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUZvcihzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAgICAgaWYgKHBhdGNoRGVzYyA9PSAwKSB7CiAgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgaGFzIG5vIHBhdGNoIHdpdGggaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICByZW1vdmVBdWRpb1BhdGNoKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUpOworICAgIHJlbW92ZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1IYW5kbGUpOwogCi0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXREZXNjID0gc291cmNlRGVzYy0+bVN3T3V0cHV0LnByb21vdGUoKTsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXREZXNjID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgaWYgKHN3T3V0cHV0RGVzYyAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uoc3dPdXRwdXREZXNjLCBzdHJlYW0sIGZhbHNlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShzd091dHB1dERlc2MsIHNvdXJjZURlc2MpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBzd091dHB1dERlc2MtPnN0b3AoKTsKICAgICAgICAgfQogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPm1Id091dHB1dC5wcm9tb3RlKCk7CisgICAgICAgIHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5od091dHB1dCgpLnByb21vdGUoKTsKICAgICAgICAgaWYgKGh3T3V0cHV0RGVzYyAhPSAwKSB7CiAgICAgICAgICAgLy8gICByZWxlYXNlIHBhdGNoIGJldHdlZW4gc3JjIGRldmljZSBhbmQgb3V0cHV0IGRldmljZQogICAgICAgICAgIC8vICAgY2xvc2UgSHdvdXRwdXQgYW5kIHJlbW92ZSBmcm9tIG1Id091dHB1dHMKQEAgLTM4NzAsMTYgKzQxNTAsMTUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTb3VyY2VGb3JTdHJhdGVneU9uT3V0cHV0KAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCitzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dCgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCiB7Ci0gICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2U7CisgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvU291cmNlcy5zaXplKCk7IGkrKykgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHNvdXJjZVN0cmF0ZWd5ID0KLSAgICAgICAgICAgICAgICAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gc291cmNlRGVzYy0+bVN3T3V0cHV0LnByb21vdGUoKTsKLSAgICAgICAgaWYgKHNvdXJjZVN0cmF0ZWd5ID09IHN0cmF0ZWd5ICYmIG91dHB1dERlc2MgIT0gMCAmJiBvdXRwdXREZXNjLT5tSW9IYW5kbGUgPT0gb3V0cHV0KSB7CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChmb2xsb3dzU2FtZVJvdXRpbmcoYXR0ciwgc291cmNlRGVzYy0+YXR0cmlidXRlcygpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MgIT0gMCAmJiBvdXRwdXREZXNjLT5tSW9IYW5kbGUgPT0gb3V0cHV0KSB7CiAgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2VEZXNjOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM4OTUsNyArNDE3NCw2IEBACiAgICAgcmV0dXJuIG1BdWRpb1BvcnRHZW5lcmF0aW9uKys7CiB9CiAKLSNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCiAvLyBUcmVibGl6ZWQgYXVkaW8gcG9saWN5IHhtbCBjb25maWcgd2lsbCBiZSBsb2NhdGVkIGluIC9vZG0vZXRjIG9yIC92ZW5kb3IvZXRjLgogc3RhdGljIGNvbnN0IGNoYXIgKmtDb25maWdMb2NhdGlvbkxpc3RbXSA9CiAgICAgICAgIHsiL29kbS9ldGMiLCAiL3ZlbmRvci9ldGMiLCAiL3N5c3RlbS9ldGMifTsKQEAgLTM5MjQsNDMgKzQyMDIsMzMgQEAKIAogICAgIGZvciAoY29uc3QgY2hhciogZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBQb2xpY3lTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CiAgICAgICAgICAgICBzbnByaW50ZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHNpemVvZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgIiVzLyVzIiwga0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSwgZmlsZU5hbWUpOwotICAgICAgICAgICAgcmV0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIGNvbmZpZyk7CisgICAgICAgICAgICByZXQgPSBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsICZjb25maWcpOwogICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTb3VyY2UoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9Ci0jZW5kaWYKIAogQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLypmb3JUZXN0aW5nKi8pCiAgICAgOgotICAgIG1VaWRDYWNoZWQoZ2V0dWlkKCkpLAorICAgIG1VaWRDYWNoZWQoQUlEX0FVRElPU0VSVkVSKSwgLy8gbm8gbmVlZCB0byBjYWxsIGdldHVpZCgpLCB0aGVyZSdzIG9ubHkgb25lIG9mIHVzIHJ1bm5pbmcuCiAgICAgbXBDbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwKICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksIG1MYXN0Vm9pY2VWb2x1bWUoLTEuMGYpLAogICAgIG1BMmRwU3VzcGVuZGVkKGZhbHNlKSwKLSNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0gICAgbVZvbHVtZUN1cnZlcyhuZXcgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbigpKSwKLSAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UsIHN0YXRpY19jYXN0PFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24qPihtVm9sdW1lQ3VydmVzLmdldCgpKSksCi0jZWxzZQotICAgIG1Wb2x1bWVDdXJ2ZXMobmV3IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCkpLAotICAgIG1Db25maWcobUh3TW9kdWxlc0FsbCwgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSksCi0jZW5kaWYKKyAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBtRGVmYXVsdE91dHB1dERldmljZSksCiAgICAgbUF1ZGlvUG9ydEdlbmVyYXRpb24oMSksCiAgICAgbUJlYWNvbk11dGVSZWZDb3VudCgwKSwKICAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50KDApLAogICAgIG1CZWFjb25NdXRlZChmYWxzZSksCiAgICAgbVR0c091dHB1dEF2YWlsYWJsZShmYWxzZSksCiAgICAgbU1hc3Rlck1vbm8oZmFsc2UpLAotICAgIG1NdXNpY0VmZmVjdE91dHB1dChBVURJT19JT19IQU5ETEVfTk9ORSksCi0gICAgbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZShmYWxzZSkKKyAgICBtTXVzaWNFZmZlY3RPdXRwdXQoQVVESU9fSU9fSEFORExFX05PTkUpCiB7CiB9CiAKQEAgLTM5NzEsMjEgKzQyMzksMjIgQEAKICAgICBpbml0aWFsaXplKCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQ29uZmlnKCkgewotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLSAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpIHsKLSNlbHNlCi0gICAgaWYgKChDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSwgZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKQotICAgICAgICAgICAmJiAoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9DT05GSUdfRklMRSwgZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSkgeworLy8gIFRoaXMgY2hlY2sgaXMgdG8gY2F0Y2ggYW55IGxlZ2FjeSBwbGF0Zm9ybSB1cGRhdGluZyB0byBRIHdpdGhvdXQgaGF2aW5nCisvLyAgc3dpdGNoZWQgdG8gWE1MIHNpbmNlIGl0cyBkZXByZWNhdGlvbiBvbiBPLgorLy8gVE9ETzogYWZ0ZXIgUSByZWxlYXNlLCByZW1vdmUgdGhpcyBjaGVjayBhbmQgZmxhZyBhcyBYTUwgaXMgbm93IHRoZSBvbmx5CisvLyAgICAgICAgb3B0aW9uIGFuZCBhbGwgbGVnYWN5IHBsYXRmb3JtIHNob3VsZCBoYXZlIHRyYW5zaXRpb25lZCB0byBYTUwuCisjaWZuZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKKyNlcnJvciBBdWRpbyBwb2xpY3kgbm8gbG9uZ2VyIHN1cHBvcnRzIGxlZ2FjeSAuY29uZiBjb25maWd1cmF0aW9uIGZvcm1hdAogI2VuZGlmCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQ29uZmlnKCkgeworICAgIGlmIChkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5WG1sQ29uZmlnKGdldENvbmZpZygpKSAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOwogICAgICAgICBnZXRDb25maWcoKS5zZXREZWZhdWx0KCk7CiAgICAgfQogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRpYWxpemUoKSB7Ci0gICAgbVZvbHVtZUN1cnZlcy0+aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhnZXRDb25maWcoKS5pc1NwZWFrZXJEcmNFbmFibGVkKCkpOwotCiAgICAgLy8gT25jZSBwb2xpY3kgY29uZmlnIGhhcyBiZWVuIHBhcnNlZCwgcmV0cmlldmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGVuZ2luZSBhbmQgaW5pdGlhbGl6ZSBpdC4KICAgICBhdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlICplbmdpbmVJbnN0YW5jZSA9IGF1ZGlvX3BvbGljeTo6RW5naW5lSW5zdGFuY2U6OmdldEluc3RhbmNlKCk7CiAgICAgaWYgKCFlbmdpbmVJbnN0YW5jZSkgewpAQCAtNDAwNyw4ICs0Mjc2LDYgQEAKIAogICAgIC8vIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGFuZCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIG5vdyBjb250YWluIGFsbCBhdHRhY2hlZCBkZXZpY2VzCiAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCi0gICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgaW5wdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwogICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzQWxsKSB7CiAgICAgICAgIGh3TW9kdWxlLT5zZXRIYW5kbGUobXBDbGllbnRJbnRlcmZhY2UtPmxvYWRId01vZHVsZShod01vZHVsZS0+Z2V0TmFtZSgpKSk7CiAgICAgICAgIGlmIChod01vZHVsZS0+Z2V0SGFuZGxlKCkgPT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7CkBAIC00MDM3LDUxICs0MzA0LDQ5IEBACiAgICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgbURlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKSkgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCk7CisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxQcm9maWxlRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMuZmlsdGVyKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHN1cHBvcnRlZERldmljZSA9IDA7CisgICAgICAgICAgICBpZiAoc3VwcG9ydGVkRGV2aWNlcy5jb250YWlucyhtRGVmYXVsdE91dHB1dERldmljZSkpIHsKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UgPSBtRGVmYXVsdE91dHB1dERldmljZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCi0gICAgICAgICAgICAgICAgLy8gb3V0cHV0RGV2aWNlVHlwZXMKLSAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZUZvclR5cGUob3V0cHV0RGV2aWNlVHlwZXMpOworICAgICAgICAgICAgICAgIC8vIGNob29zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBwcm9maWxlJ3MgU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKKyAgICAgICAgICAgICAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy4KKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxQcm9maWxlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1cHBvcnRlZERldmljZSA9IGF2YWlsUHJvZmlsZURldmljZXMuaXRlbUF0KDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG91dHB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zKHN1cHBvcnRlZERldmljZSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKG91dFByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7Ci0gICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNGb3JUeXBlID0gc3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZGV2aWNlc0ZvclR5cGUuc2l6ZSgpID4gMCA/IGRldmljZXNGb3JUeXBlLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3BlbihudWxscHRyLCBwcm9maWxlVHlwZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7Ci0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4obnVsbHB0ciwgRGV2aWNlVmVjdG9yKHN1cHBvcnRlZERldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IHN1cHBvcnRlZERldmljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChod01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0ID0gb3V0cHV0RGVzYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlcyAlcyBvbiBodyBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogYXZhaWxQcm9maWxlRGV2aWNlcykgeworICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2UtPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKKyAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yKHN1cHBvcnRlZERldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgICB9CiAgICAgICAgIC8vIG9wZW4gaW5wdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMgdG8gdmFsaWRhdGUKICAgICAgICAgLy8gbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBsaXN0CkBAIC00MDk2LDg1ICs0MzYxLDY4IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBwcm9maWxlJ3MgU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKLSAgICAgICAgICAgIC8vIGlucHV0RGV2aWNlVHlwZXMKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IGluUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlRm9yVHlwZShpbnB1dERldmljZVR5cGVzKTsKLQotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpID09IDApIHsKKyAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzCisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbFByb2ZpbGVEZXZpY2VzID0gc3VwcG9ydGVkRGV2aWNlcy5maWx0ZXIobUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgICAgICAgICBpZiAoYXZhaWxQcm9maWxlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IElucHV0IGRldmljZSBsaXN0IGlzIGVtcHR5ISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0KICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwotICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwotICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgQUxPR1YoIiAgZm9yIGlucHV0IGRldmljZSAweCV4IHVzaW5nIGFkZHJlc3MgJXMiLCBwcm9maWxlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRV9JRihpbnB1dERldmljZXMuc2l6ZSgpID09IDAsICJJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiKTsKLQogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbihudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxQcm9maWxlRGV2aWNlcy5pdGVtQXQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGV2IDogaW5Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXYpOwotICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZEZXNjLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hdHRhY2goaHdNb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChpblByb2ZpbGUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSwKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gaW5wdXQgc3RyZWFtIGZvciBkZXZpY2UgJXMgb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBhdmFpbFByb2ZpbGVEZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogYXZhaWxQcm9maWxlRGV2aWNlcykgeworICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2UtPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KGluUHJvZmlsZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIG1ha2Ugc3VyZSBhbGwgYXR0YWNoZWQgZGV2aWNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGEgdW5pcXVlIElECi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOykgewotICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+dHlwZSgpKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBhdXRvIGNoZWNrQW5kU2V0QXZhaWxhYmxlID0gW3RoaXNdKGF1dG8mIGRldmljZXMpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTspIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJmRldmljZSA9IGRldmljZXNbaV07CisgICAgICAgICAgICBpZiAoIWRldmljZS0+aXNBdHRhY2hlZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImRldmljZSAlcyBpcyB1bnJlYWNoYWJsZSIsIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLnJlbW92ZShkZXZpY2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQorICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgICAgICAgICAgaSsrOwogICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBkZXZpY2UgaXMgbm93IHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvZiB0aGUgZW5naW5lCi0gICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTspIHsKLSAgICAgICAgaWYgKCFtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSk7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBkZXZpY2UgaXMgbm93IHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvZiB0aGUgZW5naW5lCi0gICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOwotICAgICAgICBpKys7Ci0gICAgfQorICAgIH07CisgICAgY2hlY2tBbmRTZXRBdmFpbGFibGUobUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGNoZWNrQW5kU2V0QXZhaWxhYmxlKG1BdmFpbGFibGVJbnB1dERldmljZXMpOworCiAgICAgLy8gbWFrZSBzdXJlIGRlZmF1bHQgZGV2aWNlIGlzIHJlYWNoYWJsZQotICAgIGlmIChtRGVmYXVsdE91dHB1dERldmljZSA9PSAwIHx8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YobURlZmF1bHRPdXRwdXREZXZpY2UpIDwgMCkgewotICAgICAgICBBTE9HRSgiRGVmYXVsdCBkZXZpY2UgJTA4eCBpcyB1bnJlYWNoYWJsZSIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOworICAgIGlmIChtRGVmYXVsdE91dHB1dERldmljZSA9PSAwIHx8ICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhtRGVmYXVsdE91dHB1dERldmljZSkpIHsKKyAgICAgICAgQUxPR0VfSUYobURlZmF1bHRPdXRwdXREZXZpY2UgIT0gMCwgIkRlZmF1bHQgZGV2aWNlICVzIGlzIHVucmVhY2hhYmxlIiwKKyAgICAgICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgfQogICAgIC8vIElmIG1pY3JvcGhvbmVzIGFkZHJlc3MgaXMgZW1wdHksIHNldCBpdCBhY2NvcmRpbmcgdG8gZGV2aWNlIHR5cGUKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmFkZHJlc3MoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MgPSBTdHJpbmc4KEFVRElPX0JPVFRPTV9NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnNldEFkZHJlc3MoU3RyaW5nOChBVURJT19CT1RUT01fTUlDUk9QSE9ORV9BRERSRVNTKSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcyA9IFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnNldEFkZHJlc3MoU3RyaW5nOChBVURJT19CQUNLX01JQ1JPUEhPTkVfQUREUkVTUykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDIwNSw3ICs0NDUzLDcgQEAKICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXNBbGwuY2xlYXIoKTsKLSAgIG1TdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKKyAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0Q2hlY2soKQpAQCAtNDIzOCw0NCArNDQ4NiwyOCBAQAogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYyAvKmluKi8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzIC8qaW4qLywKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKSB7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgIGRlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VCeUFkZHJlc3MoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICBpZiAoZGV2RGVzYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIG9uIHNhbWUgYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICAgIGRlc2MtPm1Jb0hhbmRsZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIG91dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGRldmljZS0+dHlwZSgpOworICAgIGNvbnN0IFN0cmluZzggJmFkZHJlc3MgPSBkZXZpY2UtPmFkZHJlc3MoKTsKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKIAotICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7CisgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZVR5cGUpKSB7CiAgICAgICAgIC8vIGVyYXNlIGFsbCBjdXJyZW50IHNhbXBsZSByYXRlcywgZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcwotICAgICAgICBkZXZEZXNjLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKKyAgICAgICAgZGV2aWNlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKICAgICB9CiAKICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKICAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCIsIG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgIGNoZWNraW5nIGFkZHJlc3MgbWF0Y2ggZHVlIHRvIGRldmljZSAweCV4IiwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBkZXZpY2UsIGFkZHJlc3MsIG91dHB1dHMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAmJiBkZXNjLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCBvbiBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIHRoZW4gbG9vayBmb3Igb3V0cHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQpAQCAtNDI4MywxMyArNDUxNSwxMCBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2pdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQyOTcsNyArNDUyNiw3IEBACiAgICAgICAgIEFMT0dWKCIgIGZvdW5kICV6dSBwcm9maWxlcywgJXp1IG91dHB1dHMiLCBwcm9maWxlcy5zaXplKCksIG91dHB1dHMuc2l6ZSgpKTsKIAogICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIG91dHB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIApAQCAtNDMxMyw4ICs0NTQyLDggQEAKICAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcHJvZmlsZTogc2F2ZSB0aGUgc2FtcGxlIHJhdGVzLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBwcm9maWxlIGluIG91ciBkZXZpY2UgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTQzMzAsMTYgKzQ1NTksMTYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBwcm9maWxlLmdldCgpLCBwcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKICAgICAgICAgICAgIGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIGRldmljZSwgYWRkcmVzcywKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4obnVsbHB0ciwgRGV2aWNlVmVjdG9yKGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgdGhlIG91dF9zZXRfcGFyYW1ldGVycygpIGZvciBjYXJkICYgZGV2aWNlIGdldHMgY2FsbGVkCiAgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2VUeXBlLCBhZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBTdHJpbmc4KHBhcmFtKSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOwogICAgICAgICAgICAgICAgIH0KQEAgLTQzNTgsNyArNDU4Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBjb25maWcuZm9ybWF0OwogCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4oJmNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBBVURJT19TVFJFQU1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbigmY29uZmlnLCBEZXZpY2VWZWN0b3IoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC00MzY3LDE0ICs0NTk3LDE1IEBACiAKICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIGRlc2MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpICYmIGFkZHJlc3MgIT0gIjAiKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpICYmIGFkZHJlc3MgIT0gIjAiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRBdWRpb1BvbGljeU1peChhZGRyZXNzLCBwb2xpY3lNaXgpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNhbm5vdCBmaW5kIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLmdldEF1ZGlvUG9saWN5TWl4KGFkZHJlc3MsIHBvbGljeU1peCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPnNldE91dHB1dChkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY2Fubm90IGZpbmQgcG9saWN5IGZvciBhZGRyZXNzICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeU1peC0+c2V0T3V0cHV0KGRlc2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7CiAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSkgewpAQCAtNDQwNiwyOCArNDYzNywyOCBAQAogICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIG91dHB1dCBmb3IgZGV2aWNlICV4IiwgZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CiAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChvdXRwdXQpOwogICAgICAgICAgICAgICAgIC8vIExvYWQgZGlnaXRhbCBmb3JtYXQgaW5mbyBvbmx5IGZvciBkaWdpdGFsIGRldmljZXMKLSAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBzZXRPdXRwdXREZXZpY2UoZGV2PTB4JXgsIGFkZHI9JXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgZGV2aWNlLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IHNldE91dHB1dERldmljZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBEZXZpY2VWZWN0b3IoZGV2aWNlKSwgdHJ1ZS8qZm9yY2UqLywgMC8qZGVsYXkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLypwYXRjaCBoYW5kbGUqLyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG91dHB1dCAlZCIsIG91dHB1dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgeyAvLyBEaXNjb25uZWN0CkBAIC00NDM2LDEwICs0NjY3LDEwIEBACiAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBleGFjdCBtYXRjaCBvbiBkZXZpY2UKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpID09IGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBkZXZpY2UsIGFkZHJlc3MsIG91dHB1dHMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpICYmIGRlc2MtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRlc2MtPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgb3V0cHV0ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSk7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKQEAgLTQ0NTAsNyArNDY4MSw3IEBACiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKClbal07Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CkBAIC00NDYyLDI0ICs0NjkzLDIyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0lucHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT50eXBlKCk7CiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2M7CiAKLSAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UtPnR5cGUoKSkpIHsKICAgICAgICAgLy8gZXJhc2UgYWxsIGN1cnJlbnQgc2FtcGxlIHJhdGVzLCBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzCi0gICAgICAgIGRldkRlc2MtPmNsZWFyQXVkaW9Qcm9maWxlcygpOworICAgICAgICBkZXZpY2UtPmNsZWFyQXVkaW9Qcm9maWxlcygpOwogICAgIH0KIAogICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgewogICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBpbnB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCiAgICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewogICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7Ci0gICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlLT5zdXBwb3J0c0RldmljZVR5cGVzKGRldmljZS0+dHlwZSgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIGlucHV0ICVkIiwgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwogICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CiAgICAgICAgICAgICB9CkBAIC00NDkzLDE5ICs0NzIyLDE2IEBACiAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgewogICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKClbcHJvZmlsZV9pbmRleF07CiAKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkgJiYgaW5wdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1coIiVzOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKQEAgLTQ1MjAsOCArNDc0Niw4IEBACiAgICAgICAgICAgICBmb3IgKGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewogICAgICAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwogICAgICAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UtPnR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ1NDAsMTQgKzQ3NjYsMTQgQEAKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpOwogCiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyA9IGRldmljZS0+YWRkcmVzcygpOwogICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLT50eXBlKCksIGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhpbnB1dCwgU3RyaW5nOChwYXJhbSkpOwogICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKICAgICAgICAgICAgICAgICB9CkBAIC00NTY0LDIwICs0NzkwLDIxIEBACiAgICAgICAgICAgICB9IC8vIGVuZGlmIGlucHV0ICE9IDAKIAogICAgICAgICAgICAgaWYgKGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gaW5wdXQgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgY291bGQgbm90IG9wZW4gaW5wdXQgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCAgCisgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlucHV0cy5hZGQoaW5wdXQpOwotICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlLT50eXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIGlucHV0ICVkIiwgaW5wdXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IC8vIGVuZCBzY2FuIHByb2ZpbGVzCiAKICAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1coIiVzOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC00NTg1LDcgKzQ4MTIsNyBAQAogICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIGlucHV0IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUgYWZ0ZXIgZGlzY29ubmVjdGluZyBvbmUgZGV2aWNlCiAgICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewogICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7Ci0gICAgICAgICAgICBpZiAoIShkZXNjLT5tUHJvZmlsZS0+c3VwcG9ydERldmljZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkpKSkgeworICAgICAgICAgICAgaWYgKCFtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIGlucHV0ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CiAgICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CkBAIC00NTk3LDcgKzQ4MjQsNyBAQAogICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKS5zaXplKCk7CiAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgewogICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKClbcHJvZmlsZV9pbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBjbGVhcmluZyBkaXJlY3QgaW5wdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CkBAIC00NjE0LDM4ICs0ODQxLDMxIEBACiB7CiAgICAgQUxPR1YoImNsb3NlT3V0cHV0KCVkKSIsIG91dHB1dCk7CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBjbG9zaW5nT3V0cHV0ID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBpZiAoY2xvc2luZ091dHB1dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJjbG9zZU91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtUG9saWN5TWl4ZXMuY2xvc2VPdXRwdXQob3V0cHV0RGVzYyk7CisgICAgbVBvbGljeU1peGVzLmNsb3NlT3V0cHV0KGNsb3NpbmdPdXRwdXQpOwogCiAgICAgLy8gbG9vayBmb3IgZHVwbGljYXRlZCBvdXRwdXRzIGNvbm5lY3RlZCB0byB0aGUgb3V0cHV0IGJlaW5nIHJlbW92ZWQuCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJgotICAgICAgICAgICAgICAgIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjIHx8Ci0gICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDIgPT0gb3V0cHV0RGVzYykpIHsKLSAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjMjsKLSAgICAgICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dCA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkdXBPdXRwdXQtPmlzRHVwbGljYXRlZCgpICYmCisgICAgICAgICAgICAgICAgKGR1cE91dHB1dC0+bU91dHB1dDEgPT0gY2xvc2luZ091dHB1dCB8fCBkdXBPdXRwdXQtPm1PdXRwdXQyID09IGNsb3NpbmdPdXRwdXQpKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcmVtYWluaW5nT3V0cHV0ID0KKyAgICAgICAgICAgICAgICBkdXBPdXRwdXQtPm1PdXRwdXQxID09IGNsb3NpbmdPdXRwdXQgPyBkdXBPdXRwdXQtPm1PdXRwdXQyIDogZHVwT3V0cHV0LT5tT3V0cHV0MTsKICAgICAgICAgICAgIC8vIEFzIGFsbCBhY3RpdmUgdHJhY2tzIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IHdpbGwgYmUgZGVsZXRlZCwKICAgICAgICAgICAgIC8vIGFuZCBhcyB0aGV5IHdlcmUgYWxzbyByZWZlcmVuY2VkIG9uIHRoZSBvdGhlciBvdXRwdXQsIHRoZSByZWZlcmVuY2UKICAgICAgICAgICAgIC8vIGNvdW50IGZvciB0aGVpciBzdHJlYW0gdHlwZSBtdXN0IGJlIGFkanVzdGVkIGFjY29yZGluZ2x5IG9uCiAgICAgICAgICAgICAvLyB0aGUgb3RoZXIgb3V0cHV0LgotICAgICAgICAgICAgYm9vbCB3YXNBY3RpdmUgPSBvdXRwdXREZXNjMi0+aXNBY3RpdmUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQVVESU9fU1RSRUFNX0NOVDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gZHVwT3V0cHV0RGVzYy0+bVJlZkNvdW50W2pdOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5jaGFuZ2VSZWZDb3VudCgoYXVkaW9fc3RyZWFtX3R5cGVfdClqLC1yZWZDb3VudCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBib29sIHdhc0FjdGl2ZSA9IHJlbWFpbmluZ091dHB1dC0+aXNBY3RpdmUoKTsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vLW9wIG9uIHRoZSBjbG9zaW5nIG91dHB1dCB3aGVyZSBhbGwgY2xpZW50cyBoYXMgYWxyZWFkeSBiZWVuIHNldCBpbmFjdGl2ZQorICAgICAgICAgICAgZHVwT3V0cHV0LT5zZXRBbGxDbGllbnRzSW5hY3RpdmUoKTsKICAgICAgICAgICAgIC8vIHN0b3AoKSB3aWxsIGJlIGEgbm8gb3AgaWYgdGhlIG91dHB1dCBpcyBzdGlsbCBhY3RpdmUgYnV0IGlzIG5lZWRlZCBpbiBjYXNlIGFsbAogICAgICAgICAgICAgLy8gYWN0aXZlIHN0cmVhbXMgcmVmY291bnRzIHdoZXJlIGNsZWFyZWQgYWJvdmUKICAgICAgICAgICAgIGlmICh3YXNBY3RpdmUpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+c3RvcCgpOworICAgICAgICAgICAgICAgIHJlbWFpbmluZ091dHB1dC0+c3RvcCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHVwbGljYXRlZE91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOwogICAgICAgICAgICAgQUxPR1YoImNsb3NlT3V0cHV0KCkgY2xvc2luZyBhbHNvIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgZHVwbGljYXRlZE91dHB1dCk7CkBAIC00NjU3LDcgKzQ4NzcsNyBAQAogCiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKIAotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShjbG9zaW5nT3V0cHV0LT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICAodm9pZCkgLypzdGF0dXNfdCBzdGF0dXMqLyBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CkBAIC00NjY1LDEwICs0ODg1LDI2IEBACiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgfQogCi0gICAgb3V0cHV0RGVzYy0+Y2xvc2UoKTsKKyAgICBjbG9zaW5nT3V0cHV0LT5jbG9zZSgpOwogCiAgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7CiAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworCisgICAgLy8gTVNEIHBhdGNoZXMgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCB0byBzdXBwb3J0IGEgbm9uLU1TRCBkaXJlY3Qgb3V0cHV0LiBSZXNldCBNU0QgcGF0Y2ggaWYKKyAgICAvLyBubyBkaXJlY3Qgb3V0cHV0cyBhcmUgb3Blbi4KKyAgICBpZiAoIWdldE1zZEF1ZGlvT3V0RGV2aWNlcygpLmlzRW1wdHkoKSkgeworICAgICAgICBib29sIGRpcmVjdE91dHB1dE9wZW4gPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRzW2ldLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgICAgICAgICBkaXJlY3RPdXRwdXRPcGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWRpcmVjdE91dHB1dE9wZW4pIHsKKyAgICAgICAgICAgIEFMT0dWKCJubyBkaXJlY3Qgb3V0cHV0cyBvcGVuLCByZXNldCBNU0QgcGF0Y2giKTsKKyAgICAgICAgICAgIHNldE1zZFBhdGNoKCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQpAQCAtNDY4Myw2ICs0OTE5LDcgQEAKIAogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBpbnB1dERlc2MtPmdldERldmljZSgpOwogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwpAQCAtNDY5Myw1MSArNDkzMCw2NyBAQAogCiAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgIG1JbnB1dHMucmVtb3ZlSXRlbShpbnB1dCk7CisKKyAgICBEZXZpY2VWZWN0b3IgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKTsKKyAgICBpZiAocHJpbWFyeUlucHV0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpICYmCisgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDApIHsKKyAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOworICAgIH0KIH0KIAotU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpCitTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0c0ZvckRldmljZXMoCisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpCiB7CiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOwogCi0gICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgIEFMT0dWVigiJXMoKSBkZXZpY2VzICVzIiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWVigib3V0cHV0ICV6dSBpc0R1cGxpY2F0ZWQ9JWQgZGV2aWNlPSUwNHgiLAorICAgICAgICBBTE9HVlYoIm91dHB1dCAlenUgaXNEdXBsaWNhdGVkPSVkIGRldmljZT0lcyIsCiAgICAgICAgICAgICAgICAgaSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGVkKCksCi0gICAgICAgICAgICAgICAgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKTsKLSAgICAgICAgaWYgKChkZXZpY2UgJiBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IGRldmljZSkgewotICAgICAgICAgICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZm91bmQgb3V0cHV0ICVkIiwgb3Blbk91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKS50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBpZiAob3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydHNBbGxEZXZpY2VzKGRldmljZXMpCisgICAgICAgICAgICAgICAgJiYgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICBBTE9HVlYoIiVzKCkgZm91bmQgb3V0cHV0ICVkIiwgX19mdW5jX18sIG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgICAgIG91dHB1dHMuYWRkKG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb3V0cHV0czsKIH0KIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czIpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBvbk91dHB1dHNDaGVja2VkKQogewotICAgIGlmIChvdXRwdXRzMS5zaXplKCkgIT0gb3V0cHV0czIuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCisgICAgLy8gb3V0cHV0IGlzIHN1c3BlbmRlZCBiZWZvcmUgYW55IHRyYWNrcyBhcmUgbW92ZWQgdG8gaXQKKyAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgY2hlY2tTZWNvbmRhcnlPdXRwdXRzKCk7CisgICAgaWYgKG9uT3V0cHV0c0NoZWNrZWQgIT0gbnVsbHB0ciAmJiBvbk91dHB1dHNDaGVja2VkKCkpIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgIGlmIChtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpICE9IDApIHsKKyAgICAgICAgc2V0TXNkUGF0Y2goKTsKICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzMS5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAob3V0cHV0czFbaV0gIT0gb3V0cHV0czJbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmb2xsb3dzU2FtZVJvdXRpbmcoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZyQXR0cikgY29uc3QKIHsKLSAgICBhdWRpb19kZXZpY2VzX3Qgb2xkRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNyY091dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG9sZERldmljZSwgbVByZXZpb3VzT3V0cHV0cyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShuZXdEZXZpY2UsIG1PdXRwdXRzKTsKKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhsQXR0cikgPT0KKyAgICAgICAgICAgIG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMockF0dHIpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKK3sKKyAgICBhdXRvIHBzSWQgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHIpOworCisgICAgRGV2aWNlVmVjdG9yIG9sZERldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCAwLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgMCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMob2xkRGV2aWNlcywgbVByZXZpb3VzT3V0cHV0cyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMobmV3RGV2aWNlcywgbU91dHB1dHMpOwogCiAgICAgLy8gYWxzbyB0YWtlIGludG8gYWNjb3VudCBleHRlcm5hbCBwb2xpY3ktcmVsYXRlZCBjaGFuZ2VzOiBhZGQgYWxsIG91dHB1dHMgd2hpY2ggYXJlCiAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHBvbGljaWVzIGluIHRoZSAiYmVmb3JlIiBhbmQgImFmdGVyIiBvdXRwdXQgdmVjdG9ycwotICAgIEFMT0dWVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpOiBwb2xpY3kgcmVsYXRlZCBvdXRwdXRzIik7CisgICAgQUxPR1ZWKCIlcygpOiBwb2xpY3kgcmVsYXRlZCBvdXRwdXRzIiwgX19mdW5jX18pOwogICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1QcmV2aW91c091dHB1dHMuc2l6ZSgpIDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbVByZXZpb3VzT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGRlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgewpAQCAtNDc1Myw3ICs1MDA2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghdmVjdG9yc0VxdWFsKHNyY091dHB1dHMsZHN0T3V0cHV0cykpIHsKKyAgICBpZiAoc3JjT3V0cHV0cyAhPSBkc3RPdXRwdXRzKSB7CiAgICAgICAgIC8vIGdldCBtYXhpbXVtIGxhdGVuY3kgb2YgYWxsIHNvdXJjZSBvdXRwdXRzIHRvIGRldGVybWluZSB0aGUgbWluaW11bSBtdXRlIHRpbWUgZ3VhcmFudGVlaW5nCiAgICAgICAgIC8vIGF1ZGlvIGZyb20gaW52YWxpZGF0ZWQgdHJhY2tzIHdpbGwgYmUgcmVuZGVyZWQgd2hlbiB1bm11dGluZwogICAgICAgICB1aW50MzJfdCBtYXhMYXRlbmN5ID0gMDsKQEAgLTQ3NjMsNDggKzUwMTYsNjQgQEAKICAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gZGVzYy0+bGF0ZW5jeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlZCB0byBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICBzdHJhdGVneSwgc3JjT3V0cHV0c1swXSwgZHN0T3V0cHV0c1swXSk7CisgICAgICAgIEFMT0dWX0lGKCEoc3JjT3V0cHV0cy5pc0VtcHR5KCkgfHwgZHN0T3V0cHV0cy5pc0VtcHR5KCkpLAorICAgICAgICAgICAgICAiJXM6IHN0cmF0ZWd5ICVkLCBtb3ZpbmcgZnJvbSBvdXRwdXQgJXMgdG8gb3V0cHV0ICVzIiwgX19mdW5jX18sIHBzSWQsCisgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHNyY091dHB1dHNbMF0pLmNfc3RyKCksCisgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGRzdE91dHB1dHNbMF0pLmNfc3RyKCkpOwogICAgICAgICAvLyBtdXRlIHN0cmF0ZWd5IHdoaWxlIG1vdmluZyB0cmFja3MgZnJvbSBvbmUgb3V0cHV0IHRvIGFub3RoZXIKICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBzcmNPdXQgOiBzcmNPdXRwdXRzKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1QcmV2aW91c091dHB1dHMudmFsdWVGb3Ioc3JjT3V0KTsKLSAgICAgICAgICAgIGlmIChkZXNjICE9IDAgJiYgaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBzdHJhdGVneSkpIHsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIHRydWUsIGRlc2MpOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgZmFsc2UsIGRlc2MsIG1heExhdGVuY3kgKiBMQVRFTkNZX01VVEVfRkFDVE9SLCBuZXdEZXZpY2UpOworICAgICAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHBzSWQpKSB7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHBzSWQsIHRydWUsIGRlc2MpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShwc0lkLCBmYWxzZSwgZGVzYywgbWF4TGF0ZW5jeSAqIExBVEVOQ1lfTVVURV9GQUNUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZXMudHlwZXMoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoc3JjT3V0LCBzdHJhdGVneSk7CisgICAgICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2UgPSBnZXRTb3VyY2VGb3JBdHRyaWJ1dGVzT25PdXRwdXQoc3JjT3V0LCBhdHRyKTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gMCl7CiAgICAgICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBNb3ZlIGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7CisgICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyZWFtIGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKKyAgICAgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhhdHRyLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSkpIHsKICAgICAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgICAgICB9Ci0gICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KWkpOwotICAgICAgICAgICAgfQorICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyZWFtIChhbmQgbGlua2VkKSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGZvciAoYXV0byBzdHJlYW0gOiAgbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHNJZCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQogewotICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKTsKLSAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCi0gICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04pOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1JFUk9VVElORyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpLmZyb250KCk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1NlY29uZGFyeU91dHB1dHMoKSB7CisgICAgc3RkOjpzZXQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4gc3RyZWFtc1RvSW52YWxpZGF0ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzY3JpcHRvciA9IG1PdXRwdXRzW2ldOworICAgICAgICBmb3IgKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCA6IG91dHB1dERlc2NyaXB0b3ItPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIGNvZGUgZHVwbGljYXRlZCBmcm9tIGdldE91dHB1dEZvckF0dHJJbnQKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBzZWNvbmRhcnlEZXNjczsKKyAgICAgICAgICAgIG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKGNsaWVudC0+YXR0cmlidXRlcygpLCBjbGllbnQtPnVpZCgpLCBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZGFyeURlc2NzKTsKKyAgICAgICAgICAgIGlmICghc3RkOjplcXVhbChjbGllbnQtPmdldFNlY29uZGFyeU91dHB1dHMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Z2V0U2Vjb25kYXJ5T3V0cHV0cygpLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeURlc2NzLmJlZ2luKCksIHNlY29uZGFyeURlc2NzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIHN0cmVhbXNUb0ludmFsaWRhdGUuaW5zZXJ0KGNsaWVudC0+c3RyZWFtKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gOiBzdHJlYW1zVG9JbnZhbGlkYXRlKSB7CisgICAgICAgIEFMT0dEKCIlcyBJbnZhbGlkYXRlIHN0cmVhbSAlZCBkdWUgdG8gc2Vjb25kYXJ5IG91dHB1dCBjaGFuZ2UiLCBfX2Z1bmNfXywgc3RyZWFtKTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0EyZHBTdXNwZW5kKCkKQEAgLTQ4NTcsMTA4ICs1MTI2LDg3IEBACiAgICAgfQogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKK0RldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld091dHB1dERldmljZXMoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CiAKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CiAgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgewotICAgICAgICAgICAgQUxPR1YoImdldE5ld091dHB1dERldmljZSgpIGRldmljZSAlMDh4IGZvcmNlZCBieSBwYXRjaCAlZCIsCi0gICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2UoKSwgb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgICAgICBBTE9HVigiJXMgZGV2aWNlICVzIGZvcmNlZCBieSBwYXRjaCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnRvU3RyaW5nKCkuY19zdHIoKSwgb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgICAgICAgICByZXR1cm4gIG91dHB1dERlc2MtPmRldmljZXMoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIENoZWNrIGlmIGFuIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdCBleGlzdHMgZm9yIGFuIGFjdGl2ZSBzdHJlYW0gb24gdGhpcyBvdXRwdXQgYW5kCi0gICAgLy8gdXNlIGl0IGluIHByaW9yaXR5IGJlZm9yZSBhbnkgb3RoZXIgcnVsZQotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBmb3JjZWREZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Um91dGVzLmdldEFjdGl2ZURldmljZUZvclN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgbm8gY2xpZW50IHVzaW5nIGRlZmF1bHQgcm91dGluZyBpcyBhY3RpdmUgb24gdGhpcworICAgIC8vIGlucHV0OiBhIHNwZWNpZmljIGFwcCBjYW4gbm90IGZvcmNlIHJvdXRpbmcgZm9yIG90aGVyIGFwcHMgYnkgc2V0dGluZyBhIHByZWZlcnJlZCBkZXZpY2UuCisgICAgYm9vbCBhY3RpdmU7IC8vIHVudXNlZAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CisgICAgICAgIGZpbmRQcmVmZXJyZWREZXZpY2Uob3V0cHV0RGVzYywgUFJPRFVDVF9TVFJBVEVHWV9OT05FLCBhY3RpdmUsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihkZXZpY2UpOworICAgIH0KIAotICAgICAgICAgICAgaWYgKGZvcmNlZERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmb3JjZWREZXZpY2U7Ci0gICAgICAgICAgICB9CisgICAgLy8gTGVnYWN5IEVuZ2luZSBjYW5ub3QgdGFrZSBjYXJlIG9mIGJ1cyBkZXZpY2VzIGFuZCBtaXgsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBjb25mbGljdAorICAgIC8vIG9mIHNldEZvcmNlVXNlIC8gRGVmYXVsdCBCdXMgZGV2aWNlIGhlcmUKKyAgICBkZXZpY2UgPSBtUG9saWN5TWl4ZXMuZ2V0RGV2aWNlQW5kTWl4Rm9yT3V0cHV0KG91dHB1dERlc2MsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihkZXZpY2UpOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmcHJvZHVjdFN0cmF0ZWd5IDogbUVuZ2luZS0+Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkpIHsKKyAgICAgICAgU3RyZWFtVHlwZVZlY3RvciBzdHJlYW1zID0gbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdFN0cmF0ZWd5KTsKKyAgICAgICAgYXV0byBhdHRyID0gbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0U3RyYXRlZ3kpLmZyb250KCk7CisKKyAgICAgICAgaWYgKChoYXNWb2ljZVN0cmVhbShzdHJlYW1zKSAmJgorICAgICAgICAgICAgIChpc0luQ2FsbCgpIHx8IG1PdXRwdXRzLmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdFN0cmF0ZWd5LCBvdXRwdXREZXNjKSkpIHx8CisgICAgICAgICAgICAgKChoYXNTdHJlYW0oc3RyZWFtcywgQVVESU9fU1RSRUFNX0FMQVJNKSB8fCBoYXNTdHJlYW0oc3RyZWFtcywgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpKSAmJgorICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdFN0cmF0ZWd5LCBvdXRwdXREZXNjKSkgfHwKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3RTdHJhdGVneSkpIHsKKyAgICAgICAgICAgIC8vIFJldHJpZXZhbCBvZiBkZXZpY2VzIGZvciB2b2ljZSBETCBpcyBkb25lIG9uIHByaW1hcnkgb3V0cHV0IHByb2ZpbGUsIGNhbm5vdAorICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHJvdXRlICh3b3VsZCBmb3JjZSBtb2RpZnlpbmcgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGlzIHByb2ZpbGUpCisgICAgICAgICAgICBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgbnVsbHB0ciwgZnJvbUNhY2hlKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgotICAgIC8vIDE6IHRoZSBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBhbmQgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKLSAgICAvLyAyOiB3ZSBhcmUgaW4gY2FsbCBvciB0aGUgc3RyYXRlZ3kgcGhvbmUgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBwaG9uZQotICAgIC8vIDM6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBzb25pZmljYXRpb24KLSAgICAvLyA0OiB0aGUgc3RyYXRlZ3kgZm9yIGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGJ1dCBub3QgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSB0aGUgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCi0gICAgLy8gNTogdGhlIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5Ci0gICAgLy8gNjogdGhlIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uCi0gICAgLy8gNzogdGhlIHN0cmF0ZWd5IG1lZGlhIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgbWVkaWEKLSAgICAvLyA4OiB0aGUgc3RyYXRlZ3kgRFRNRiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IERUTUYKLSAgICAvLyA5OiB0aGUgc3RyYXRlZ3kgZm9yIGJlYWNvbiwgYS5rLmEuICJ0cmFuc21pdHRlZCB0aHJvdWdoIHNwZWFrZXIiIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgdC10LXMKLQotICAgIC8vIEZJWE1FOiBleHRlbmQgdXNlIG9mIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUoKSB0byBhbGwgc3RyYXRlZ2llcwotICAgIC8vIHdpdGggYSByZWZpbmVkIHJ1bGUgY29uc2lkZXJpbmcgbXV0dWFsbHkgZXhjbHVzaXZlIGRldmljZXMgKHVzaW5nIHNhbWUgYmFja2VuZCkKLSAgICAvLyBhcyBvcHBvc2VkIHRvIGFsbCBzdHJlYW1zIG9uIHRoZSBzYW1lIGF1ZGlvIEhBTCBtb2R1bGUuCi0gICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkgJiYKLSAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzSW5DYWxsKCkgfHwKLSAgICAgICAgICAgICAgIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUob3V0cHV0RGVzYywgU1RSQVRFR1lfUEhPTkUpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9NRURJQSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0RUTUYpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9SRVJPVVRJTkcpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1JFUk9VVElORywgZnJvbUNhY2hlKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgc2VsZWN0ZWQgZGV2aWNlICV4IiwgZGV2aWNlKTsKLSAgICByZXR1cm4gZGV2aWNlOworICAgIEFMT0dWKCIlcyBzZWxlY3RlZCBkZXZpY2VzICVzIiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gZGV2aWNlczsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3SW5wdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld0lucHV0RGV2aWNlKAorICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYykKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CiAgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgewotICAgICAgICAgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKLSAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwgaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPm1EZXZpY2U7CisgICAgICAgICAgICBBTE9HVigiZ2V0TmV3SW5wdXREZXZpY2UoKSBkZXZpY2UgJXMgZm9yY2VkIGJ5IHBhdGNoICVkIiwKKyAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+Z2V0RGV2aWNlKCktPnRvU3RyaW5nKCkuY19zdHIoKSwgaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPmdldERldmljZSgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gSWYgd2UgYXJlIG5vdCBpbiBjYWxsIGFuZCBubyBjbGllbnQgaXMgYWN0aXZlIG9uIHRoaXMgaW5wdXQsIHRoaXMgbWV0aG9kcyByZXR1cm5zCi0gICAgLy8gQVVESU9fREVWSUNFX05PTkUsIGNhdXNpbmcgdGhlIHBhdGNoIG9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gYmUgcmVsZWFzZWQuCi0gICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gaW5wdXREZXNjLT5nZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UodHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBpc0luQ2FsbCgpKSB7Ci0gICAgICAgIHNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBubyBjbGllbnQgdXNpbmcgZGVmYXVsdCByb3V0aW5nIGlzIGFjdGl2ZSBvbiB0aGlzCisgICAgLy8gaW5wdXQ6IGEgc3BlY2lmaWMgYXBwIGNhbiBub3QgZm9yY2Ugcm91dGluZyBmb3Igb3RoZXIgYXBwcyBieSBzZXR0aW5nIGEgcHJlZmVycmVkIGRldmljZS4KKyAgICBib29sIGFjdGl2ZTsKKyAgICBkZXZpY2UgPSBmaW5kUHJlZmVycmVkRGV2aWNlKGlucHV0RGVzYywgQVVESU9fU09VUkNFX0RFRkFVTFQsIGFjdGl2ZSwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CiAgICAgfQotICAgIGlmIChzb3VyY2UgIT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2Uoc291cmNlKTsKKworICAgIC8vIElmIHdlIGFyZSBub3QgaW4gY2FsbCBhbmQgbm8gY2xpZW50IGlzIGFjdGl2ZSBvbiB0aGlzIGlucHV0LCB0aGlzIG1ldGhvZHMgcmV0dXJucworICAgIC8vIGEgbnVsbCBzcDw+LCBjYXVzaW5nIHRoZSBwYXRjaCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIGJlIHJlbGVhc2VkLgorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gaW5wdXREZXNjLT5nZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCk7CisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUICYmIGlzSW5DYWxsKCkpIHsKKyAgICAgICAgYXR0cmlidXRlcy5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICB9CisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlICE9IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKICAgICB9CiAKICAgICByZXR1cm4gZGV2aWNlOwpAQCAtNDk2OSw2NSArNTIxNyw1MCBAQAogICAgIHJldHVybiAoc3RyZWFtMSA9PSBzdHJlYW0yKTsKIH0KIAotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewotICAgIHJldHVybiAodWludDMyX3QpZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLX0KLQogYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewogICAgIC8vIEJ5IGNoZWNraW5nIHRoZSByYW5nZSBvZiBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgZ2V0U3RyYXRlZ3ksIHdlIGF2b2lkCi0gICAgLy8gZ2V0U3RyYXRlZ3kncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLiAgZ2V0U3RyYXRlZ3kgd291bGQgZG8gYSBBTE9HRQotICAgIC8vIGFuZCB0aGVuIHJldHVybiBTVFJBVEVHWV9NRURJQSwgYnV0IHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBlbXB0eSBzZXQuCi0gICAgaWYgKHN0cmVhbSA8IChhdWRpb19zdHJlYW1fdHlwZV90KSAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgIC8vIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0ncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLgorICAgIC8vIGVuZ2luZSdzIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0gd291bGQgZmFsbGJhY2sgb24gaXRzIGRlZmF1bHQgYmVoYXZpb3IgKG1vc3QgcHJvYmFibHkKKyAgICAvLyBkZXZpY2UgZm9yIG11c2ljIHN0cmVhbSksIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgorICAgIGlmIChzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewogICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CiAgICAgfQotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBjdXJTdHJlYW0rKykgewotICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKKyAgICBEZXZpY2VWZWN0b3IgYWN0aXZlRGV2aWNlczsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3QgY3VyU3RyZWFtID0gQVVESU9fU1RSRUFNX01JTjsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQ7CisgICAgICAgICBjdXJTdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgKGN1clN0cmVhbSArIDEpKSB7CisgICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgY3VyU3RyZWFtKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgcm91dGluZ19zdHJhdGVneSBjdXJTdHJhdGVneSA9IGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2VzID0KLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSljdXJTdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogZ2V0T3V0cHV0c0ZvckRldmljZShjdXJEZXZpY2VzLCBtT3V0cHV0cykpIHsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGN1clN0cmVhbSwgZmFsc2UvKmZyb21DYWNoZSovKTsKKyAgICAgICAgZGV2aWNlcy5tZXJnZShjdXJEZXZpY2VzKTsKKyAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBnZXRPdXRwdXRzRm9yRGV2aWNlcyhjdXJEZXZpY2VzLCBtT3V0cHV0cykpIHsKICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgICAgIGN1ckRldmljZXMgfD0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVEZXZpY2VzLm1lcmdlKG91dHB1dERlc2MtPmRldmljZXMoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZGV2aWNlcyB8PSBjdXJEZXZpY2VzOwogICAgIH0KIAorICAgIC8vIEZhdm9yIGRldmljZXMgc2VsZWN0ZWQgb24gYWN0aXZlIHN0cmVhbXMgaWYgYW55IHRvIHJlcG9ydCBjb3JyZWN0IGRldmljZSBpbiBjYXNlIG9mCisgICAgLy8gZXhwbGljaXQgZGV2aWNlIHNlbGVjdGlvbgorICAgIGlmICghYWN0aXZlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgZGV2aWNlcyA9IGFjdGl2ZURldmljZXM7CisgICAgfQogICAgIC8qRmlsdGVyIFNQRUFLRVJfU0FGRSBvdXQgb2YgcmVzdWx0cywgYXMgQXVkaW9TZXJ2aWNlIGRvZXNuJ3Qga25vdyBhYm91dCBpdAogICAgICAgYW5kIGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8uKi8KLSAgICBpZiAoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSB7Ci0gICAgICAgIGRldmljZXMgfD0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICBkZXZpY2VzICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICBEZXZpY2VWZWN0b3Igc3BlYWtlclNhZmVEZXZpY2VzID0gZGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKTsKKyAgICBpZiAoIXNwZWFrZXJTYWZlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgZGV2aWNlcy5tZXJnZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikpOworICAgICAgICBkZXZpY2VzLnJlbW92ZShzcGVha2VyU2FmZURldmljZXMpOwogICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotcm91dGluZ19zdHJhdGVneSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotewotICAgIEFMT0dfQVNTRVJUKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fUEFUQ0gsImdldFN0cmF0ZWd5KCkgY2FsbGVkIGZvciBBVURJT19TVFJFQU1fUEFUQ0giKTsKLSAgICByZXR1cm4gbUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7Ci0gICAgLy8gZmxhZ3MgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0JFQUNPTikgPT0gQVVESU9fRkxBR19CRUFDT04pIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKLSAgICB9Ci0gICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4obUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdHRyLT51c2FnZSkpOworICAgIHJldHVybiBkZXZpY2VzLnR5cGVzKCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CiAgICAgc3dpdGNoKHN0cmVhbSkgewogICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OKSk7CiAgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC01MDc4LDExICs1MzExLDEwIEBACiAgICAgICAgIC8vIG11dGUvdW5tdXRlIEFVRElPX1NUUkVBTV9UVFMgb24gYWxsIG91dHB1dHMKICAgICAgICAgQUxPR1YoIlx0IG11dGluZyAlZCIsIG11dGUpOwogICAgICAgICB1aW50MzJfdCBtYXhMYXRlbmN5ID0gMDsKKyAgICAgICAgYXV0byB0dHNWb2x1bWVTb3VyY2UgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVFRTKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShBVURJT19TVFJFQU1fVFRTLCBtdXRlLypvbiovLAotICAgICAgICAgICAgICAgICAgICBkZXNjLAotICAgICAgICAgICAgICAgICAgICAwIC8qZGVsYXkqLywgQVVESU9fREVWSUNFX05PTkUpOworICAgICAgICAgICAgc2V0Vm9sdW1lU291cmNlTXV0ZSh0dHNWb2x1bWVTb3VyY2UsIG11dGUvKm9uKi8sIGRlc2MsIDAgLypkZWxheSovLCBBVURJT19ERVZJQ0VfTk9ORSk7CiAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBsYXRlbmN5ID0gZGVzYy0+bGF0ZW5jeSgpICogMjsKICAgICAgICAgICAgIGlmIChsYXRlbmN5ID4gbWF4TGF0ZW5jeSkgewogICAgICAgICAgICAgICAgIG1heExhdGVuY3kgPSBsYXRlbmN5OwpAQCAtNTA5NCw0MCArNTMyNiwxNCBAQAogICAgIHJldHVybiAwOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCi17Ci0gICAgLy8gQ2hlY2sgaWYgYW4gZXhwbGljaXQgcm91dGluZyByZXF1ZXN0IGV4aXN0cyBmb3IgYSBzdHJlYW0gdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgIC8vIHNwZWNpZmllZCBzdHJhdGVneSBhbmQgdXNlIGl0IGluIHByaW9yaXR5IG92ZXIgZGVmYXVsdCByb3V0aW5nIHJ1bGVzLgotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBmb3JjZWREZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Um91dGVzLmdldEFjdGl2ZURldmljZUZvclN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKLSAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZyb21DYWNoZSkgewotICAgICAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgZnJvbSBjYWNoZSBzdHJhdGVneSAlZCwgZGV2aWNlICV4IiwKLSAgICAgICAgICAgICAgc3RyYXRlZ3ksIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV0pOwotICAgICAgICByZXR1cm4gbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XTsKLSAgICB9Ci0gICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKLX0KLQogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgbURldmljZUZvclN0cmF0ZWd5W2ldID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgfQorICAgIG1FbmdpbmUtPnVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCk7CiAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOwogfQogCiB1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnByZXZEZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpCiB7CiAgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCkBAIC01MTM4LDM0ICs1MzQ0LDM2IEBACiAgICAgfQogCiAgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IDA7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOwotICAgIGJvb2wgc2hvdWxkTXV0ZSA9IG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKHBvcGNvdW50KGRldmljZSkgPj0gMik7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCk7CisgICAgYm9vbCBzaG91bGRNdXRlID0gb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlcy5zaXplKCkgPj0gMik7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICBjdXJEZXZpY2UgPSBjdXJEZXZpY2UgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCk7Ci0gICAgICAgIGJvb2wgbXV0ZSA9IHNob3VsZE11dGUgJiYgKGN1ckRldmljZSAmIGRldmljZSkgJiYgKGN1ckRldmljZSAhPSBkZXZpY2UpOworICAgIGF1dG8gcHJvZHVjdFN0cmF0ZWdpZXMgPSBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVneSA6IHByb2R1Y3RTdHJhdGVnaWVzKSB7CisgICAgICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdFN0cmF0ZWd5KS5mcm9udCgpOworICAgICAgICBEZXZpY2VWZWN0b3IgY3VyRGV2aWNlcyA9CisgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbnVsbHB0ciwgZmFsc2UvKmZyb21DYWNoZSovKTsKKyAgICAgICAgY3VyRGV2aWNlcyA9IGN1ckRldmljZXMuZmlsdGVyKG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIGJvb2wgbXV0ZSA9IHNob3VsZE11dGUgJiYgY3VyRGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoZGV2aWNlcykgJiYgY3VyRGV2aWNlcyAhPSBkZXZpY2VzOwogICAgICAgICBib29sIGRvTXV0ZSA9IGZhbHNlOwogCi0gICAgICAgIGlmIChtdXRlICYmICFvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldKSB7CisgICAgICAgIGlmIChtdXRlICYmICFvdXRwdXREZXNjLT5pc1N0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0U3RyYXRlZ3kpKSB7CiAgICAgICAgICAgICBkb011dGUgPSB0cnVlOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW11dGUgJiYgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSl7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5zZXRTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdFN0cmF0ZWd5LCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmICghbXV0ZSAmJiBvdXRwdXREZXNjLT5pc1N0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0U3RyYXRlZ3kpKSB7CiAgICAgICAgICAgICBkb011dGUgPSB0cnVlOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0U3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3RTdHJhdGVneSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGlmIChkb011dGUpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU91dHB1dHMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOwogICAgICAgICAgICAgICAgIC8vIHNraXAgb3V0cHV0IGlmIGl0IGRvZXMgbm90IHNoYXJlIGFueSBkZXZpY2Ugd2l0aCBjdXJyZW50IG91dHB1dAotICAgICAgICAgICAgICAgIGlmICgoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPnN1cHBvcnRlZERldmljZXMoKS5jb250YWluc0F0TGVhc3RPbmUob3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1ZWKCJjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkgJXMgc3RyYXRlZ3kgJXp1IChjdXJEZXZpY2UgJTA0eCkiLAotICAgICAgICAgICAgICAgICAgICAgIG11dGUgPyAibXV0aW5nIiA6ICJ1bm11dGluZyIsIGksIGN1ckRldmljZSk7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIG11dGUsIGRlc2MsIG11dGUgPyAwIDogZGVsYXlNcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVlYoIiVzKCkgJXMgKGN1ckRldmljZSAlcykiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICBtdXRlID8gIm11dGluZyIgOiAidW5tdXRpbmciLCBjdXJEZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHByb2R1Y3RTdHJhdGVneSwgbXV0ZSwgZGVzYywgbXV0ZSA/IDAgOiBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcm9kdWN0U3RyYXRlZ3kpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtdXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogc2hvdWxkIG5vdCBuZWVkIHRvIGRvdWJsZSBsYXRlbmN5IGlmIHZvbHVtZSBjb3VsZCBiZSBhcHBsaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBieSB0aGUgYXVkaW9mbGluZ2VyIG1peGVyLiBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBkZWxheQpAQCAtNTE4MywyMiArNTM5MSwxOSBAQAogCiAgICAgLy8gdGVtcG9yYXJ5IG11dGUgb3V0cHV0IGlmIGRldmljZSBzZWxlY3Rpb24gY2hhbmdlcyB0byBhdm9pZCB2b2x1bWUgYnVyc3RzIGR1ZSB0bwogICAgIC8vIGRpZmZlcmVudCBwZXIgZGV2aWNlIHZvbHVtZXMKLSAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlICE9IHByZXZEZXZpY2UpKSB7CisgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZXMgIT0gcHJldkRldmljZXMpKSB7CiAgICAgICAgIHVpbnQzMl90IHRlbXBNdXRlV2FpdE1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMjsKICAgICAgICAgLy8gdGVtcG9yYXJ5IG11dGUgZHVyYXRpb24gaXMgY29uc2VydmF0aXZlbHkgc2V0IHRvIDQgdGltZXMgdGhlIHJlcG9ydGVkIGxhdGVuY3kKICAgICAgICAgdWludDMyX3QgdGVtcE11dGVEdXJhdGlvbk1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogNDsKICAgICAgICAgaWYgKG11dGVXYWl0TXMgPCB0ZW1wTXV0ZVdhaXRNcykgewogICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IHRlbXBNdXRlV2FpdE1zOwogICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCAocm91dGluZ19zdHJhdGVneSlpKSkgewotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBzdGFydCB0aGUgdGVtcG9yYXJ5IG11dGUgcGVyaW9kIHRvbyBlYXJseSBpbiBjYXNlIG9mCi0gICAgICAgICAgICAgICAgLy8gZGVsYXllZCBkZXZpY2UgY2hhbmdlCi0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIHRydWUsIG91dHB1dERlc2MsIGRlbGF5TXMpOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSwgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyArIHRlbXBNdXRlRHVyYXRpb25NcywgZGV2aWNlKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZhY3RpdmVWcyA6IG91dHB1dERlc2MtPmdldEFjdGl2ZVZvbHVtZVNvdXJjZXMoKSkgeworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHN0YXJ0IHRoZSB0ZW1wb3JhcnkgbXV0ZSBwZXJpb2QgdG9vIGVhcmx5IGluIGNhc2Ugb2YKKyAgICAgICAgICAgIC8vIGRlbGF5ZWQgZGV2aWNlIGNoYW5nZQorICAgICAgICAgICAgc2V0Vm9sdW1lU291cmNlTXV0ZShhY3RpdmVWcywgdHJ1ZSwgb3V0cHV0RGVzYywgZGVsYXlNcyk7CisgICAgICAgICAgICBzZXRWb2x1bWVTb3VyY2VNdXRlKGFjdGl2ZVZzLCBmYWxzZSwgb3V0cHV0RGVzYywgZGVsYXlNcyArIHRlbXBNdXRlRHVyYXRpb25NcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTIxMSw0NiArNTQxNiw0NiBAQAogICAgIHJldHVybiAwOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE91dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrKQordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjaykKIHsKLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgZGV2aWNlICUwNHggZGVsYXlNcyAlZCIsIGRldmljZSwgZGVsYXlNcyk7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgQUxPR1YoIiVzIGRldmljZSAlcyBkZWxheU1zICVkIiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBkZWxheU1zKTsKICAgICB1aW50MzJfdCBtdXRlV2FpdE1zOwogCiAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zLAotICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIG51bGxwdHIgLyogYWRkcmVzcyAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOwotICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5zdWJPdXRwdXQyKCksIGRldmljZSwgZm9yY2UsIGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBwYXRjaEhhbmRsZSAqLywgbnVsbHB0ciAvKiBhZGRyZXNzICovLCByZXF1aXJlc011dGVDaGVjayk7CisgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSwgZGV2aWNlcywgZm9yY2UsIGRlbGF5TXMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBwYXRjaEhhbmRsZSAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOworICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpLCBkZXZpY2VzLCBmb3JjZSwgZGVsYXlNcywKKyAgICAgICAgICAgICAgICBudWxscHRyIC8qIHBhdGNoSGFuZGxlICovLCByZXF1aXJlc011dGVDaGVjayk7CiAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwogICAgIH0KLSAgICAvLyBubyBuZWVkIHRvIHByb2NlZWQgaWYgbmV3IGRldmljZSBpcyBub3QgQVVESU9fREVWSUNFX05PTkUgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudAotICAgIC8vIG91dHB1dCBwcm9maWxlCi0gICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmCi0gICAgICAgICAgICAoKGRldmljZSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkgPT0gQVVESU9fREVWSUNFX05PTkUpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KIAogICAgIC8vIGZpbHRlciBkZXZpY2VzIGFjY29yZGluZyB0byBvdXRwdXQgc2VsZWN0ZWQKLSAgICBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KShkZXZpY2UgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgIERldmljZVZlY3RvciBmaWx0ZXJlZERldmljZXMgPSBvdXRwdXREZXNjLT5maWx0ZXJTdXBwb3J0ZWREZXZpY2VzKGRldmljZXMpOworICAgIERldmljZVZlY3RvciBwcmV2RGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZXMoKTsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlID0gb3V0cHV0RGVzYy0+bURldmljZTsKKyAgICAvLyBubyBuZWVkIHRvIHByb2NlZWQgaWYgbmV3IGRldmljZSBpcyBub3QgQVVESU9fREVWSUNFX05PTkUgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudAorICAgIC8vIG91dHB1dCBwcm9maWxlIG9yIGlmIG5ldyBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCBBTkQgcHJldmlvdXMgZGV2aWNlKHMpIGlzKGFyZSkgc3RpbGwKKyAgICAvLyBhdmFpbGFibGUgKG90aGVyd2lzZSByZXNldCBkZXZpY2UgbXVzdCBiZSBkb25lIG9uIHRoZSBvdXRwdXQpCisgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSAmJiBmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAhbUF2YWlsYWJsZU91dHB1dERldmljZXMuZmlsdGVyKHByZXZEZXZpY2VzKS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCIlczogdW5zdXBwb3J0ZWQgZGV2aWNlICVzIGZvciBvdXRwdXQiLCBfX2Z1bmNfXywgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgcHJldkRldmljZSAweCUwNHgiLCBwcmV2RGV2aWNlKTsKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlcygpIHByZXZEZXZpY2UgJXMiLCBwcmV2RGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwogCi0gICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIGlmICghZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICBvdXRwdXREZXNjLT5zZXREZXZpY2VzKGZpbHRlcmVkRGV2aWNlcyk7CiAgICAgfQogCiAgICAgLy8gaWYgdGhlIG91dHB1dHMgYXJlIG5vdCBtYXRlcmlhbGx5IGFjdGl2ZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBtdXRlLgogICAgIGlmIChyZXF1aXJlc011dGVDaGVjaykgewotICAgICAgICBtdXRlV2FpdE1zID0gY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhvdXRwdXREZXNjLCBwcmV2RGV2aWNlLCBkZWxheU1zKTsKKyAgICAgICAgbXV0ZVdhaXRNcyA9IGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMob3V0cHV0RGVzYywgcHJldkRldmljZXMsIGRlbGF5TXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCIlczogc3VwcHJlc3NpbmcgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyIsIF9fZnVuY19fKTsKICAgICAgICAgbXV0ZVdhaXRNcyA9IDA7CkBAIC01MjYxLDg5ICs1NDY2LDMyIEBACiAgICAgLy8gICAgICBPUiB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IGRldmljZQogICAgIC8vICBBTkQgZm9yY2UgaXMgbm90IHNwZWNpZmllZAogICAgIC8vICBBTkQgdGhlIG91dHB1dCBpcyBjb25uZWN0ZWQgYnkgYSB2YWxpZCBhdWRpbyBwYXRjaC4KLSAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2UoKSB3aXRob3V0IGNvbmRpdGlvbnMKLSAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fCBkZXZpY2UgPT0gcHJldkRldmljZSkgJiYKLSAgICAgICAgIWZvcmNlICYmCi0gICAgICAgIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkgIT0gMCkgewotICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgc2V0dGluZyBzYW1lIGRldmljZSAweCUwNHggb3IgbnVsbCBkZXZpY2UiLCBkZXZpY2UpOworICAgIC8vIERvaW5nIHRoaXMgY2hlY2sgaGVyZSBhbGxvd3MgdGhlIGNhbGxlciB0byBjYWxsIHNldE91dHB1dERldmljZXMoKSB3aXRob3V0IGNvbmRpdGlvbnMKKyAgICBpZiAoKGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgfHwgZmlsdGVyZWREZXZpY2VzID09IHByZXZEZXZpY2VzKSAmJgorICAgICAgICAgICAgIWZvcmNlICYmIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkgIT0gMCkgeworICAgICAgICBBTE9HVigiJXMgc2V0dGluZyBzYW1lIGRldmljZSAlcyBvciBudWxsIGRldmljZSwgZm9yY2U9JWQsIHBhdGNoIGhhbmRsZT0lZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBmaWx0ZXJlZERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBmb3JjZSwgb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwogICAgIH0KIAotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjaGFuZ2luZyBkZXZpY2UiKTsKKyAgICBBTE9HVigiJXMgY2hhbmdpbmcgZGV2aWNlIHRvICVzIiwgX19mdW5jX18sIGZpbHRlcmVkRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgLy8gZG8gdGhlIHJvdXRpbmcKLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgaWYgKGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKICAgICAgICAgcmVzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGVsYXlNcywgTlVMTCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3Q7Ci0gICAgICAgIGlmICgoYWRkcmVzcyA9PSBOVUxMKSB8fCAoc3RybGVuKGFkZHJlc3MpID09IDApKSB7Ci0gICAgICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihkZXZpY2UsIFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKG91dHB1dERlc2MpOworICAgICAgICBBTE9HX0FTU0VSVChmaWx0ZXJlZERldmljZXMuc2l6ZSgpIDw9IEFVRElPX1BBVENIX1BPUlRTX01BWCwgIlRvbyBtYW55IHNpbmsgcG9ydHMiKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZmaWx0ZXJlZERldmljZSA6IGZpbHRlcmVkRGV2aWNlcykgeworICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoZmlsdGVyZWREZXZpY2UpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMDsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlTGlzdC5zaXplKCkgJiYgaSA8IEFVRElPX1BBVENIX1BPUlRTX01BWDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoaSktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1tpXSk7Ci0gICAgICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiCi0gICAgICAgICAgICAgICAgICAgICJudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlLCBwYXRjaC5udW1fc291cmNlcywgcGF0Y2gubnVtX3NpbmtzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBpbnB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBpbmZvcm0gaW5wdXQgJWQgb2YgZGV2aWNlOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRDbWQuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLGRldmljZSk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbWQudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBpbnN0YWxsUGF0Y2goX19mdW5jX18sIHBhdGNoSGFuZGxlLCBvdXRwdXREZXNjLmdldCgpLCBwYXRjaEJ1aWxkZXIucGF0Y2goKSwgZGVsYXlNcyk7CiAgICAgfQogCiAgICAgLy8gdXBkYXRlIHN0cmVhbSB2b2x1bWVzIGFjY29yZGluZyB0byBuZXcgZGV2aWNlCi0gICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIGRldmljZSwgZGVsYXlNcyk7CisgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIGZpbHRlcmVkRGV2aWNlcy50eXBlcygpLCBkZWxheU1zKTsKIAogICAgIHJldHVybiBtdXRlV2FpdE1zOwogfQpAQCAtNTM3Miw2MyArNTUyMCwzMCBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7Ci0gICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgfHwgZm9yY2UpKSB7Ci0gICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICBpZiAoKGRldmljZSAhPSBudWxscHRyKSAmJiAoKGRldmljZSAhPSBpbnB1dERlc2MtPmdldERldmljZSgpKSB8fCBmb3JjZSkpIHsKKyAgICAgICAgaW5wdXREZXNjLT5zZXREZXZpY2UoZGV2aWNlKTsKIAotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICAgICAgICAgIGlucHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXMuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKGlucHV0RGVzYywKICAgICAgICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seToKICAgICAgICAgICAgIC8vIGhhbmRsZWQgYXMgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIGJ5IHRoZSBhdWRpbyBIQUwKLSAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCi0gICAgICAgICAgICAgICAgICAgICFpbnB1dERlc2MtPmlzU291bmRUcmlnZ2VyKCkpIHsKLSAgICAgICAgICAgICAgICBwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgW2lucHV0RGVzY10oY29uc3QgUGF0Y2hCdWlsZGVyOjptaXhfdXNlY2FzZV90JiB1c2VjYXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IHVzZWNhc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJiAhaW5wdXREZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7IH0pLgogICAgICAgICAgICAgLy9vbmx5IG9uZSBpbnB1dCBkZXZpY2UgZm9yIG5vdwotICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoMCktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7Ci0gICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2M7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBBTE9HVigic2V0SW5wdXREZXZpY2UoKSBjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+c2V0UGF0Y2hIYW5kbGUocGF0Y2hEZXNjLT5tSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShkZXZpY2UpOworICAgICAgICAgICAgc3RhdHVzID0gaW5zdGFsbFBhdGNoKF9fZnVuY19fLCBwYXRjaEhhbmRsZSwgaW5wdXREZXNjLmdldCgpLCBwYXRjaEJ1aWxkZXIucGF0Y2goKSwgMCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTU0NTcsOCArNTU3Miw3IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0UHJvZmlsZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCYgY2hhbm5lbE1hc2ssCkBAIC01NDc4LDcgKzU1OTIsNyBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpKSB7CiAgICAgICAgICAgICAvLyBwcm9maWxlLT5sb2coKTsKICAgICAgICAgICAgIC8vdXBkYXRlZEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgYWRkcmVzcywgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldmljZSksIHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgICAgICAgLyp1cGRhdGVkRm9ybWF0Ki8KQEAgLTU0ODksNyArNTYwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyovKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpcnN0SW5leGFjdCA9PSBudWxscHRyICYmIHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLAorICAgICAgICAgICAgaWYgKGZpcnN0SW5leGFjdCA9PSBudWxscHRyICYmIHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBkYXRlZFNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKQEAgLTU1MTMsODMgKzU2MjcsNTEgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4KQotewotICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGF1ZGlvX2RldmljZXNfdCBzZWxlY3RlZERldmljZUZyb21NaXggPQotICAgICAgICAgICBtUG9saWN5TWl4ZXMuZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsIGF2YWlsYWJsZURldmljZVR5cGVzLCBwb2xpY3lNaXgpOwotCi0gICAgaWYgKHNlbGVjdGVkRGV2aWNlRnJvbU1peCAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICByZXR1cm4gc2VsZWN0ZWREZXZpY2VGcm9tTWl4OwotICAgIH0KLSAgICByZXR1cm4gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKLXsKLSAgICAvLyBSb3V0aW5nCi0gICAgLy8gU2NhbiB0aGUgd2hvbGUgUm91dGVNYXAgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhwbGljaXQgcm91dGU6Ci0gICAgLy8gaWYgdGhlIGlucHV0IHNvdXJjZSBpbiB0aGUgUm91dGVNYXAgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IGFib3ZlLAotICAgIC8vIGFuZCBhY3Rpdml0eSBjb3VudCBpcyBub24temVybyBhbmQgdGhlIGRldmljZSBpbiB0aGUgcm91dGUgZGVzY3JpcHRvciBpcyBhdmFpbGFibGUKLSAgICAvLyB0aGVuIHNlbGVjdCB0aGlzIGRldmljZS4KLSAgICBmb3IgKHNpemVfdCByb3V0ZUluZGV4ID0gMDsgcm91dGVJbmRleCA8IG1JbnB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgewotICAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOwotICAgICAgICAgaWYgKChpbnB1dFNvdXJjZSA9PSByb3V0ZS0+bVNvdXJjZSkgJiYgcm91dGUtPmlzQWN0aXZlT3JDaGFuZ2VkKCkgJiYKLSAgICAgICAgICAgICAgICAgKG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihyb3V0ZS0+bURldmljZURlc2NyaXB0b3IpID49IDApKSB7Ci0gICAgICAgICAgICAgcmV0dXJuIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOwotICAgICAgICAgfQotICAgICB9Ci0KLSAgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKLX0KLQotZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewotICAgIGZsb2F0IHZvbHVtZURCID0gbVZvbHVtZUN1cnZlcy0+dm9sSW5kZXhUb0RiKHN0cmVhbSwgVm9sdW1lOjpnZXREZXZpY2VDYXRlZ29yeShkZXZpY2UpLCBpbmRleCk7CisgICAgZmxvYXQgdm9sdW1lRGIgPSBjdXJ2ZXMudm9sSW5kZXhUb0RiKFZvbHVtZTo6Z2V0RGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKSwgaW5kZXgpOwogCiAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIG9mIGFjY2Vzc2liaWxpdHkgYWN0aXZlIHdoaWxlIGEgcmluZ3RvbmUgaXMgcGxheWluZzogaWYgdGhlIHJpbmd0b25lIGlzIG11Y2gKICAgICAvLyBsb3VkZXIgdGhhbiB0aGUgYWNjZXNzaWJpbGl0eSBwcm9tcHQsIHRoZSBwcm9tcHQgY2Fubm90IGJlIGhlYXJkLCB0aHVzIG1hc2tpbmcgdGhlIHRvdWNoCiAgICAgLy8gZXhwbG9yYXRpb24gb2YgdGhlIGRpYWxlciBVSS4gSW4gdGhpcyBzaXR1YXRpb24sIGJyaW5nIHRoZSBhY2Nlc3NpYmlsaXR5IHZvbHVtZSBjbG9zZXIgdG8KICAgICAvLyB0aGUgcmluZ3RvbmUgdm9sdW1lCi0gICAgaWYgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpCi0gICAgICAgICAgICAmJiAoQVVESU9fTU9ERV9SSU5HVE9ORSA9PSBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkpCi0gICAgICAgICAgICAmJiBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fUklORywgMCkpIHsKLSAgICAgICAgY29uc3QgZmxvYXQgcmluZ1ZvbHVtZURCID0gY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fUklORywgaW5kZXgsIGRldmljZSk7Ci0gICAgICAgIHJldHVybiByaW5nVm9sdW1lREIgLSA0ID4gdm9sdW1lREIgPyByaW5nVm9sdW1lREIgLSA0IDogdm9sdW1lREI7CisgICAgY29uc3QgYXV0byBjYWxsVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOworICAgIGNvbnN0IGF1dG8gcmluZ1ZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9SSU5HKTsKKyAgICBjb25zdCBhdXRvIG11c2ljVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICBjb25zdCBhdXRvIGFsYXJtVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FMQVJNKTsKKworICAgIGlmICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpCisgICAgICAgICAgICAmJiAoQVVESU9fTU9ERV9SSU5HVE9ORSA9PSBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkpICYmCisgICAgICAgICAgICBtT3V0cHV0cy5pc0FjdGl2ZShyaW5nVm9sdW1lU3JjLCAwKSkgeworICAgICAgICBhdXRvICZyaW5nQ3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKEFVRElPX1NUUkVBTV9SSU5HKTsKKyAgICAgICAgY29uc3QgZmxvYXQgcmluZ1ZvbHVtZURiID0gY29tcHV0ZVZvbHVtZShyaW5nQ3VydmVzLCByaW5nVm9sdW1lU3JjLCBpbmRleCwgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIHJpbmdWb2x1bWVEYiAtIDQgPiB2b2x1bWVEYiA/IHJpbmdWb2x1bWVEYiAtIDQgOiB2b2x1bWVEYjsKICAgICB9CiAKLSAgICAvLyBpbi1jYWxsOiBhbHdheXMgY2FwIGVhcnBpZWNlIHZvbHVtZSBieSB2b2ljZSB2b2x1bWUgKyBzb21lIGxvdyBoZWFkcm9vbQotICAgIGlmICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkgJiYKLSAgICAgICAgICAgIChpc0luQ2FsbCgpIHx8IG1PdXRwdXRzLmlzU3RyZWFtQWN0aXZlTG9jYWxseShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RyZWFtKSB7Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk6IHsKLSAgICAgICAgICAgIGludCB2b2ljZVZvbHVtZUluZGV4ID0KLSAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSk7Ci0gICAgICAgICAgICBjb25zdCBmbG9hdCBtYXhWb2ljZVZvbERiID0KLSAgICAgICAgICAgICAgICBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2ljZVZvbHVtZUluZGV4LCBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKQorICAgIC8vIGluLWNhbGw6IGFsd2F5cyBjYXAgdm9sdW1lIGJ5IHZvaWNlIHZvbHVtZSArIHNvbWUgbG93IGhlYWRyb29tCisgICAgaWYgKCh2b2x1bWVTb3VyY2UgIT0gY2FsbFZvbHVtZVNyYyAmJiAoaXNJbkNhbGwoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzQWN0aXZlTG9jYWxseShjYWxsVm9sdW1lU3JjKSkpICYmCisgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0pIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMgfHwgdm9sdW1lU291cmNlID09IG11c2ljVm9sdW1lU3JjIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IGFsYXJtVm9sdW1lU3JjIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRFRNRikgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpKSkgeworICAgICAgICBhdXRvICZ2b2ljZUN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhjYWxsVm9sdW1lU3JjKTsKKyAgICAgICAgaW50IHZvaWNlVm9sdW1lSW5kZXggPSB2b2ljZUN1cnZlcy5nZXRWb2x1bWVJbmRleChkZXZpY2UpOworICAgICAgICBjb25zdCBmbG9hdCBtYXhWb2ljZVZvbERiID0KKyAgICAgICAgICAgICAgICBjb21wdXRlVm9sdW1lKHZvaWNlQ3VydmVzLCBjYWxsVm9sdW1lU3JjLCB2b2ljZVZvbHVtZUluZGV4LCBkZXZpY2UpCiAgICAgICAgICAgICAgICAgKyBJTl9DQUxMX0VBUlBJRUNFX0hFQURST09NX0RCOwotICAgICAgICAgICAgaWYgKHZvbHVtZURCID4gbWF4Vm9pY2VWb2xEYikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lKCkgc3RyZWFtICVkIGF0IHZvbD0lZiBvdmVycmlkZW4gYnkgc3RyZWFtICVkIGF0IHZvbD0lZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIHZvbHVtZURCLCBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgbWF4Vm9pY2VWb2xEYik7Ci0gICAgICAgICAgICAgICAgdm9sdW1lREIgPSBtYXhWb2ljZVZvbERiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAodm9sdW1lRGIgPiBtYXhWb2ljZVZvbERiKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgdm9sdW1lIHNvdXJjZSAlZCBhdCB2b2w9JWYgb3ZlcnJpZGVuIGJ5IHZvbHVtZSBncm91cCAlZCBhdCB2b2w9JWYiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSwgdm9sdW1lRGIsIGNhbGxWb2x1bWVTcmMsIG1heFZvaWNlVm9sRGIpOworICAgICAgICAgICAgdm9sdW1lRGIgPSBtYXhWb2ljZVZvbERiOwogICAgICAgICB9CiAgICAgfQotCiAgICAgLy8gaWYgYSBoZWFkc2V0IGlzIGNvbm5lY3RlZCwgYXBwbHkgdGhlIGZvbGxvd2luZyBydWxlcyB0byByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zCiAgICAgLy8gdG8gYXZvaWQgc291bmQgbGV2ZWwgYnVyc3RzIGluIHVzZXIncyBlYXJzOgogICAgIC8vIC0gYWx3YXlzIGF0dGVudWF0ZSBub3RpZmljYXRpb25zIHZvbHVtZSBieSA2ZEIKQEAgLTU1OTcsMTEwICs1Njc5LDEzNyBAQAogICAgIC8vIHNwZWFrZXIgaXMgcGFydCBvZiB0aGUgc2VsZWN0IGRldmljZXMKICAgICAvLyAtIGlmIG11c2ljIGlzIHBsYXlpbmcsIGFsd2F5cyBsaW1pdCB0aGUgdm9sdW1lIHRvIGN1cnJlbnQgbXVzaWMgdm9sdW1lLAogICAgIC8vIHdpdGggYSBtaW5pbXVtIHRocmVzaG9sZCBhdCAtMzZkQiBzbyB0aGF0IG5vdGlmaWNhdGlvbiBpcyBhbHdheXMgcGVyY2VpdmVkLgotICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBpZiAoKGRldmljZSAmIChBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSkgJiYKLSAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKQotICAgICAgICAgICAgICAgIHx8IChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpCi0gICAgICAgICAgICAgICAgfHwgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKQotICAgICAgICAgICAgICAgIHx8ICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCi0gICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKLSAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmNhbkJlTXV0ZWQoc3RyZWFtKSkgeworICAgIGlmICgoZGV2aWNlICYgKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAorICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCB8IEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FIHwKKyAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUIHwgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCkpICYmCisgICAgICAgICAgICAoKHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAorICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykgfHwKKyAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pKSB8fAorICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkpIHx8CisgICAgICAgICAgICAgKCh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpKSAmJgorICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpICYmCisgICAgICAgICAgICBjdXJ2ZXMuY2FuQmVNdXRlZCgpKSB7CisKICAgICAgICAgLy8gd2hlbiB0aGUgcGhvbmUgaXMgcmluZ2luZyB3ZSBtdXN0IGNvbnNpZGVyIHRoYXQgbXVzaWMgY291bGQgaGF2ZSBiZWVuIHBhdXNlZCBqdXN0IGJlZm9yZQogICAgICAgICAvLyBieSB0aGUgbXVzaWMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBtdXNpYyB3YXMgYWN0aXZlIGlmIHRoZSBsYXN0IG11c2ljIHRyYWNrIHdhcwogICAgICAgICAvLyBqdXN0IHN0b3BwZWQKICAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpIHx8CiAgICAgICAgICAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUpIHsKLSAgICAgICAgICAgIHZvbHVtZURCICs9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREI7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIGZsb2F0IG11c2ljVm9sREIgPSBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKTsKLSAgICAgICAgICAgIGZsb2F0IG1pblZvbERCID0gKG11c2ljVm9sREIgPiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCKSA/Ci0gICAgICAgICAgICAgICAgICAgIG11c2ljVm9sREIgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCOwotICAgICAgICAgICAgaWYgKHZvbHVtZURCID4gbWluVm9sREIpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWVEQiA9IG1pblZvbERCOwotICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbERCLCBtdXNpY1ZvbERCKTsKKyAgICAgICAgICAgIHZvbHVtZURiICs9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREI7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgdHJ1ZSAvKmZyb21DYWNoZSovKS50eXBlcygpOworICAgICAgICAgICAgYXV0byAmbXVzaWNDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICAgICAgICAgIGZsb2F0IG11c2ljVm9sRGIgPSBjb21wdXRlVm9sdW1lKG11c2ljQ3VydmVzLCBtdXNpY1ZvbHVtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljQ3VydmVzLmdldFZvbHVtZUluZGV4KG11c2ljRGV2aWNlKSwgbXVzaWNEZXZpY2UpOworICAgICAgICAgICAgZmxvYXQgbWluVm9sRGIgPSAobXVzaWNWb2xEYiA+IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU5fREIpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sRGIgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCOworICAgICAgICAgICAgaWYgKHZvbHVtZURiID4gbWluVm9sRGIpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWVEYiA9IG1pblZvbERiOworICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbERiLCBtdXNpY1ZvbERiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTKSkgewogICAgICAgICAgICAgICAgIC8vIG9uIEEyRFAsIGFsc28gZW5zdXJlIG5vdGlmaWNhdGlvbiB2b2x1bWUgaXMgbm90IHRvbyBsb3cgY29tcGFyZWQgdG8gbWVkaWEgd2hlbgogICAgICAgICAgICAgICAgIC8vIGludGVuZGVkIHRvIGJlIHBsYXllZAotICAgICAgICAgICAgICAgIGlmICgodm9sdW1lREIgPiAtOTYuMGYpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAobXVzaWNWb2xEQiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCID4gdm9sdW1lREIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGluY3JlYXNpbmcgdm9sdW1lIGZvciBzdHJlYW09JWQgZGV2aWNlPTB4JVggZnJvbSAlZiB0byAlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lREIsIG11c2ljVm9sREIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQik7Ci0gICAgICAgICAgICAgICAgICAgIHZvbHVtZURCID0gbXVzaWNWb2xEQiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCOworICAgICAgICAgICAgICAgIGlmICgodm9sdW1lRGIgPiAtOTYuMGYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobXVzaWNWb2xEYiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCID4gdm9sdW1lRGIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBpbmNyZWFzaW5nIHZvbHVtZSBmb3Igdm9sdW1lIHNvdXJjZT0lZCBkZXZpY2U9MHglWCBmcm9tICVmIHRvICVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHZvbHVtZVNvdXJjZSwgZGV2aWNlLCB2b2x1bWVEYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNWb2xEYiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sdW1lRGIgPSBtdXNpY1ZvbERiIC0gU09OSUZJQ0FUSU9OX0EyRFBfTUFYX01FRElBX0RJRkZfREI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpICE9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgfHwKLSAgICAgICAgICAgICAgICBzdHJlYW1fc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7Ci0gICAgICAgICAgICB2b2x1bWVEQiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOworICAgICAgICAgICAgICAgICAgICghKHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fCB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykpKSB7CisgICAgICAgICAgICB2b2x1bWVEYiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHZvbHVtZURCOworICAgIHJldHVybiB2b2x1bWVEYjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoraW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVzY2FsZVZvbHVtZUluZGV4KGludCBzcmNJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IGRzdFN0cmVhbSkKIHsKLSAgICAvLyBkbyBub3QgY2hhbmdlIGFjdHVhbCBzdHJlYW0gdm9sdW1lIGlmIHRoZSBzdHJlYW0gaXMgbXV0ZWQKLSAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dICE9IDApIHsKLSAgICAgICAgQUxPR1ZWKCJjaGVja0FuZFNldFZvbHVtZSgpIHN0cmVhbSAlZCBtdXRlZCBjb3VudCAlZCIsCi0gICAgICAgICAgICAgIHN0cmVhbSwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKTsKKyAgICBpZiAoc3JjU3RyZWFtID09IGRzdFN0cmVhbSkgeworICAgICAgICByZXR1cm4gc3JjSW5kZXg7CisgICAgfQorICAgIGF1dG8gJnNyY0N1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhzcmNTdHJlYW0pOworICAgIGF1dG8gJmRzdEN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhkc3RTdHJlYW0pOworICAgIGZsb2F0IG1pblNyYyA9IChmbG9hdClzcmNDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKTsKKyAgICBmbG9hdCBtYXhTcmMgPSAoZmxvYXQpc3JjQ3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCk7CisgICAgZmxvYXQgbWluRHN0ID0gKGZsb2F0KWRzdEN1cnZlcy5nZXRWb2x1bWVJbmRleE1pbigpOworICAgIGZsb2F0IG1heERzdCA9IChmbG9hdClkc3RDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKKworICAgIC8vIHByZXNlcnZlIG11dGUgcmVxdWVzdCBvciBjb3JyZWN0IHJhbmdlCisgICAgaWYgKHNyY0luZGV4IDwgbWluU3JjKSB7CisgICAgICAgIGlmIChzcmNJbmRleCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzcmNJbmRleCA9IG1pblNyYzsKKyAgICB9IGVsc2UgaWYgKHNyY0luZGV4ID4gbWF4U3JjKSB7CisgICAgICAgIHNyY0luZGV4ID0gbWF4U3JjOworICAgIH0KKyAgICByZXR1cm4gKGludCkobWluRHN0ICsgKChzcmNJbmRleCAtIG1pblNyYykgKiAobWF4RHN0IC0gbWluRHN0KSkgLyAobWF4U3JjIC0gbWluU3JjKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoSVZvbHVtZUN1cnZlcyAmY3VydmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworICAgIC8vIGRvIG5vdCBjaGFuZ2UgYWN0dWFsIGF0dHJpYnV0ZXMgdm9sdW1lIGlmIHRoZSBhdHRyaWJ1dGVzIGlzIG11dGVkCisgICAgaWYgKG91dHB1dERlc2MtPmlzTXV0ZWQodm9sdW1lU291cmNlKSkgeworICAgICAgICBBTE9HVlYoIiVzOiB2b2x1bWUgc291cmNlICVkIG11dGVkIGNvdW50ICVkIGFjdGl2ZT0lZCIsIF9fZnVuY19fLCB2b2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5nZXRNdXRlQ291bnQodm9sdW1lU291cmNlKSwgb3V0cHV0RGVzYy0+aXNBY3RpdmUodm9sdW1lU291cmNlKSk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CisgICAgVm9sdW1lU291cmNlIGNhbGxWb2xTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CisgICAgVm9sdW1lU291cmNlIGJ0U2NvVm9sU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pOworICAgIGJvb2wgaXNWb2ljZVZvbFNyYyA9IGNhbGxWb2xTcmMgPT0gdm9sdW1lU291cmNlOworICAgIGJvb2wgaXNCdFNjb1ZvbFNyYyA9IGJ0U2NvVm9sU3JjID09IHZvbHVtZVNvdXJjZTsKKwogICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2VGb3JDb21tID0KICAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTik7CiAgICAgLy8gZG8gbm90IGNoYW5nZSBpbiBjYWxsIHZvbHVtZSBpZiBibHVldG9vdGggaXMgY29ubmVjdGVkIGFuZCB2aWNlIHZlcnNhCi0gICAgaWYgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgJiYgZm9yY2VVc2VGb3JDb21tID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8Ci0gICAgICAgIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08gJiYgZm9yY2VVc2VGb3JDb21tICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSB7Ci0gICAgICAgIEFMT0dWKCJjaGVja0FuZFNldFZvbHVtZSgpIGNhbm5vdCBzZXQgc3RyZWFtICVkIHZvbHVtZSB3aXRoIGZvcmNlIHVzZSA9ICVkIGZvciBjb21tIiwKLSAgICAgICAgICAgICBzdHJlYW0sIGZvcmNlVXNlRm9yQ29tbSk7CisgICAgLy8gaWYgc2NvIGFuZCBjYWxsIGZvbGxvdyBzYW1lIGN1cnZlcywgYnlwYXNzIGZvcmNlVXNlRm9yQ29tbQorICAgIGlmICgoY2FsbFZvbFNyYyAhPSBidFNjb1ZvbFNyYykgJiYKKyAgICAgICAgICAgICgoaXNWb2ljZVZvbFNyYyAmJiBmb3JjZVVzZUZvckNvbW0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgfHwKKyAgICAgICAgICAgICAoaXNCdFNjb1ZvbFNyYyAmJiBmb3JjZVVzZUZvckNvbW0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpKSB7CisgICAgICAgIEFMT0dWKCIlcyBjYW5ub3Qgc2V0IHZvbHVtZSBncm91cCAlZCB2b2x1bWUgd2l0aCBmb3JjZSB1c2UgPSAlZCBmb3IgY29tbSIsIF9fZnVuY19fLAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSwgZm9yY2VVc2VGb3JDb21tKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLQogICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpOwogICAgIH0KIAotICAgIGZsb2F0IHZvbHVtZURiID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOworICAgIGZsb2F0IHZvbHVtZURiID0gY29tcHV0ZVZvbHVtZShjdXJ2ZXMsIHZvbHVtZVNvdXJjZSwgaW5kZXgsIGRldmljZSk7CiAgICAgaWYgKG91dHB1dERlc2MtPmlzRml4ZWRWb2x1bWUoZGV2aWNlKSB8fAogICAgICAgICAgICAgLy8gRm9yY2UgVm9JUCB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPCi0gICAgICAgICAgICAoKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB8fCBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pICYmCi0gICAgICAgICAgICAgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTykgIT0gMCkpIHsKKyAgICAgICAgICAgICgoaXNWb2ljZVZvbFNyYyB8fCBpc0J0U2NvVm9sU3JjKSAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSAhPSAwKSkgewogICAgICAgICB2b2x1bWVEYiA9IDAuMGY7CiAgICAgfQorICAgIG91dHB1dERlc2MtPnNldFZvbHVtZSh2b2x1bWVEYiwgdm9sdW1lU291cmNlLCBjdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CiAKLSAgICBvdXRwdXREZXNjLT5zZXRWb2x1bWUodm9sdW1lRGIsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7Ci0KLSAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8Ci0gICAgICAgIHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgIGlmIChpc1ZvaWNlVm9sU3JjIHx8IGlzQnRTY29Wb2xTcmMpIHsKICAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CiAgICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSk7CisgICAgICAgIGlmIChpc1ZvaWNlVm9sU3JjKSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpY3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKICAgICAgICAgfQotCiAgICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lKSB7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9pY2VWb2x1bWUsIGRlbGF5TXMpOwogICAgICAgICAgICAgbUxhc3RWb2ljZVZvbHVtZSA9IHZvaWNlVm9sdW1lOwogICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC01NzEwLDYzICs1ODE5LDY4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQogewogICAgIEFMT0dWVigiYXBwbHlTdHJlYW1Wb2x1bWVzKCkgZm9yIGRldmljZSAlMDh4IiwgZGV2aWNlKTsKLQotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleCgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIGRldmljZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UpOworICAgIGZvciAoY29uc3QgYXV0byAmdm9sdW1lR3JvdXAgOiBtRW5naW5lLT5nZXRWb2x1bWVHcm91cHMoKSkgeworICAgICAgICBhdXRvICZjdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXModG9Wb2x1bWVTb3VyY2Uodm9sdW1lR3JvdXApKTsKKyAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoY3VydmVzLCB0b1ZvbHVtZVNvdXJjZSh2b2x1bWVHcm91cCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlcy5nZXRWb2x1bWVJbmRleChkZXZpY2UpLCBvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJhdGVneU11dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJhdGVneU11dGUocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBzdGQ6OnZlY3RvcjxWb2x1bWVTb3VyY2U+IHNvdXJjZXNUb011dGU7CisgICAgZm9yIChhdXRvIGF0dHJpYnV0ZXM6IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpKSB7CisgICAgICAgIEFMT0dWVigiJXMoKSBhdHRyaWJ1dGVzICVzLCBtdXRlICVkLCBvdXRwdXQgSUQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgIHRvU3RyaW5nKGF0dHJpYnV0ZXMpLmNfc3RyKCksIG9uLCBvdXRwdXREZXNjLT5nZXRJZCgpKTsKKyAgICAgICAgVm9sdW1lU291cmNlIHNvdXJjZSA9IHRvVm9sdW1lU291cmNlKGF0dHJpYnV0ZXMpOworICAgICAgICBpZiAoc3RkOjpmaW5kKGJlZ2luKHNvdXJjZXNUb011dGUpLCBlbmQoc291cmNlc1RvTXV0ZSksIHNvdXJjZSkgPT0gZW5kKHNvdXJjZXNUb011dGUpKSB7CisgICAgICAgICAgICBzb3VyY2VzVG9NdXRlLnB1c2hfYmFjayhzb3VyY2UpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoYXV0byBzb3VyY2UgOiBzb3VyY2VzVG9NdXRlKSB7CisgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUoc291cmNlLCBvbiwgb3V0cHV0RGVzYywgZGVsYXlNcywgZGV2aWNlKTsKKyAgICB9CisKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFZvbHVtZVNvdXJjZU11dGUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlT25seSkKIHsKLSAgICBBTE9HVlYoInNldFN0cmF0ZWd5TXV0ZSgpIHN0cmF0ZWd5ICVkLCBtdXRlICVkLCBvdXRwdXQgSUQgJWQiLAotICAgICAgICAgICBzdHJhdGVneSwgb24sIG91dHB1dERlc2MtPmdldElkKCkpOwotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgIHNldFN0cmVhbU11dGUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBvbiwgb3V0cHV0RGVzYywgZGVsYXlNcywgZGV2aWNlKTsKLSAgICAgICAgfQorICAgIGlmIChhY3RpdmVPbmx5ICYmICFvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UpKSB7CisgICAgICAgIHJldHVybjsKICAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewogICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpOwogICAgIH0KLQotICAgIEFMT0dWVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgbU11dGVDb3VudCAlZCBkZXZpY2UgJTA0eCIsCi0gICAgICAgICAgc3RyZWFtLCBvbiwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dLCBkZXZpY2UpOwotCisgICAgYXV0byAmY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKHZvbHVtZVNvdXJjZSk7CiAgICAgaWYgKG9uKSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVDdXJ2ZXMtPmNhbkJlTXV0ZWQoc3RyZWFtKSAmJgotICAgICAgICAgICAgICAgICAgICAoKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgewotICAgICAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgMCwgb3V0cHV0RGVzYywgZGV2aWNlLCBkZWxheU1zKTsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc011dGVkKHZvbHVtZVNvdXJjZSkpIHsKKyAgICAgICAgICAgIGlmIChjdXJ2ZXMuY2FuQmVNdXRlZCgpICYmCisgICAgICAgICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgIT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09CisgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgeworICAgICAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgdm9sdW1lU291cmNlLCAwLCBvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKLSAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7CisgICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90CisgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgb3V0cHV0RGVzYy0+aW5jTXV0ZUNvdW50KHZvbHVtZVNvdXJjZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNNdXRlZCh2b2x1bWVTb3VyY2UpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgdW5tdXRpbmcgbm9uIG11dGVkIGF0dHJpYnV0ZXMhIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGlmICgtLW91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7Ci0gICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSksCisgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZWNNdXRlQ291bnQodm9sdW1lU291cmNlKSA9PSAwKSB7CisgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIHZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlcy5nZXRWb2x1bWVJbmRleChkZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwpAQCAtNTc3NCwxMDYgKzU4ODgsOSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpCi17Ci0gICAgaWYoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gaWYgdGhlIHN0cmVhbSBwZXJ0YWlucyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgYW5kIHdlIGFyZSBpbiBjYWxsIHdlIG11c3QKLSAgICAvLyBtdXRlIHRoZSBzdHJlYW0gaWYgaXQgaXMgbG93IHZpc2liaWxpdHkuIElmIGl0IGlzIGhpZ2ggdmlzaWJpbGl0eSwgd2UgbXVzdCBwbGF5IGEgdG9uZQotICAgIC8vIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kgYW5kIHBsYXkgdGhlIHRvbmUgaWYgdGhlIHNlbGVjdGVkIGRldmljZSBkb2VzIG5vdAotICAgIC8vIGludGVyZmVyZSB3aXRoIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kKLSAgICAvLyBpZiBzdGF0ZUNoYW5nZSBpcyB0cnVlLCB3ZSBhcmUgY2FsbGVkIGZyb20gc2V0UGhvbmVTdGF0ZSgpIGFuZCB3ZSBtdXN0IG11dGUgb3IgdW5tdXRlIGFzCi0gICAgLy8gbWFueSB0aW1lcyBhcyB0aGVyZSBhcmUgYWN0aXZlIHRyYWNrcyBvbiB0aGUgb3V0cHV0Ci0gICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBzdHJlYW1fc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgIGlmICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKLSAgICAgICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkpIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtUHJpbWFyeU91dHB1dDsKLSAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIHN0cmVhbSAlZCBzdGFydGluZyAlZCBkZXZpY2UgJXggc3RhdGVDaGFuZ2UgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbSwgc3RhcnRpbmcsIG91dHB1dERlc2MtPm1EZXZpY2UsIHN0YXRlQ2hhbmdlKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dKSB7Ci0gICAgICAgICAgICBpbnQgbXV0ZUNvdW50ID0gMTsKLSAgICAgICAgICAgIGlmIChzdGF0ZUNoYW5nZSkgewotICAgICAgICAgICAgICAgIG11dGVDb3VudCA9IG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2xvd192aXNpYmlsaXR5KHN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgbG93IHZpc2liaWxpdHksIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkiKTsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIHRydWUgLypmcm9tQ2FjaGUqLykpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSBtdXRlZCwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdGFydFRvbmUoQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdG9wVG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCi17Ci0gICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19CRUFDT04pID09IEFVRElPX0ZMQUdfQkVBQ09OKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVFRTOwotICAgIH0KLQotICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotfQotCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpCiB7Ci0gICAgLy8gaGFzIGZsYWdzIHRoYXQgbWFwIHRvIGEgc3RyYXRlZ3k/CisgICAgLy8gaGFzIGZsYWdzIHRoYXQgbWFwIHRvIGEgc3RyZWFtIHR5cGU/CiAgICAgaWYgKChwYWEtPmZsYWdzICYgKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCB8IEFVRElPX0ZMQUdfU0NPIHwgQVVESU9fRkxBR19CRUFDT04pKSAhPSAwKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTU5MDQsMzcgKzU5MjEsNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJhdGVneUFjdGl2ZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgdWludDMyX3QgaW5QYXN0TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Ci17Ci0gICAgaWYgKChzeXNUaW1lID09IDApICYmIChpblBhc3RNcyAhPSAwKSkgewotICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBpKyspIHsKLSAgICAgICAgaWYgKCgoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHx8Ci0gICAgICAgICAgICAgICAgKE5VTV9TVFJBVEVHSUVTID09IHN0cmF0ZWd5KSkgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIHVpbnQzMl90IGluUGFzdE1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpCi0gICAgICAgICAgICAmJiBpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIHN0cmF0ZWd5LCBpblBhc3RNcywgc3lzVGltZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQogYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKIHsKICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwpAQCAtNTk1MywxMCArNTkzOSwxMCBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFuVXBGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZURlc2MpCiB7CiAgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9Tb3VyY2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChzb3VyY2VEZXNjLT5tRGV2aWNlLT5lcXVhbHMoZGV2aWNlRGVzYykpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyByZWxlYXNpbmcgYXVkaW8gc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7Ci0gICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2Uoc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYy0+c3JjRGV2aWNlKCktPmVxdWFscyhkZXZpY2VEZXNjKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIHJlbGVhc2luZyBhdWRpbyBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKKyAgICAgICAgICAgIHN0b3BBdWRpb1NvdXJjZShzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU5ODIsMTI5ICs1OTY4LDY3IEBACiAgICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYy0+bVVpZCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBtSW5wdXRzLmNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZShkZXZpY2VEZXNjKTsKKworICAgIG1Id01vZHVsZXMuY2xlYW5VcEZvckRldmljZShkZXZpY2VEZXNjKTsKIH0KIAotLy8gTW9kaWZ5IHRoZSBsaXN0IG9mIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMgc3VwcG9ydGVkLgotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbHRlclN1cnJvdW5kRm9ybWF0cyhGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpIHsKLSAgICBGb3JtYXRWZWN0b3IgJmZvcm1hdHMgPSAqZm9ybWF0c1B0cjsKLSAgICAvLyBUT0RPIFNldCB0aGlzIGJhc2VkIG9uIENvbmZpZyBwcm9wZXJ0aWVzLgotICAgIGNvbnN0IGJvb2wgYWx3YXlzRm9yY2VBQzMgPSB0cnVlOwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Om1vZGlmeVN1cnJvdW5kRm9ybWF0cygKKyAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cikgeworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZW5mb3JjZWRTdXJyb3VuZCgKKyAgICAgICAgICAgIGRldkRlc2MtPmVuY29kZWRGb3JtYXRzKCkuYmVnaW4oKSwgZGV2RGVzYy0+ZW5jb2RlZEZvcm1hdHMoKS5lbmQoKSk7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBhbGxTdXJyb3VuZDsgIC8vIEEgZmxhdCBzZXQgb2YgYWxsIGtub3duIHN1cnJvdW5kIGZvcm1hdHMKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CisgICAgICAgIGFsbFN1cnJvdW5kLmluc2VydChwYWlyLmZpcnN0KTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWJmb3JtYXQgOiBwYWlyLnNlY29uZCkgYWxsU3Vycm91bmQuaW5zZXJ0KHN1YmZvcm1hdCk7CisgICAgfQogCiAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKICAgICBBTE9HRCgiJXM6IGZvcmNlZCB1c2UgPSAlZCIsIF9fRlVOQ1RJT05fXywgZm9yY2VVc2UpOworICAgIC8vIFRoaXMgaXMgdGhlIHJlc3VsdGluZyBzZXQgb2YgZm9ybWF0cyBkZXBlbmRpbmcgb24gdGhlIHN1cnJvdW5kIG1vZGU6CisgICAgLy8gICAnYWxsIHN1cnJvdW5kJyA9IGFsbFN1cnJvdW5kCisgICAgLy8gICAnZW5mb3JjZWQgc3Vycm91bmQnID0gZW5mb3JjZWRTdXJyb3VuZCBbbWF5IGluY2x1ZGUgSUVDNjkxMzcgd2hpY2ggaXNuJ3QgcmF3IHN1cnJvdW5kIGZtdF0KKyAgICAvLyAgICdub24tc3Vycm91bmQnID0gbm90IGluICdhbGwgc3Vycm91bmQnIGFuZCBub3QgaW4gJ2VuZm9yY2VkIHN1cnJvdW5kJworICAgIC8vICAgJ21hbnVhbCBzdXJyb3VuZCcgPSBtTWFudWFsU3Vycm91bmRGb3JtYXRzCisgICAgLy8gQVVUTzogICBmb3JtYXRzIHYgJ2VuZm9yY2VkIHN1cnJvdW5kJworICAgIC8vIEFMV0FZUzogZm9ybWF0cyB2ICdhbGwgc3Vycm91bmQnIHYgJ2VuZm9yY2VkIHN1cnJvdW5kJworICAgIC8vIE5FVkVSOiAgZm9ybWF0cyBeICdub24tc3Vycm91bmQnCisgICAgLy8gTUFOVUFMOiBmb3JtYXRzIF4gKCdub24tc3Vycm91bmQnIHYgJ21hbnVhbCBzdXJyb3VuZCcgdiAoSUVDNjkxMzcgXiAnZW5mb3JjZWQgc3Vycm91bmQnKSkKIAotICAgIC8vIElmIE1BTlVBTCwga2VlcCB0aGUgc3VwcG9ydGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMgYXMgY3VycmVudCBlbmFibGVkIG9uZXMuCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRTZXQ7CisgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTAorICAgICAgICAgICAgfHwgZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVIpIHsKKyAgICAgICAgLy8gZm9ybWF0U2V0IGlzIChmb3JtYXRzIF4gJ25vbi1zdXJyb3VuZCcpCisgICAgICAgIGZvciAoYXV0byBmb3JtYXRJdGVyID0gZm9ybWF0c1B0ci0+YmVnaW4oKTsgZm9ybWF0SXRlciAhPSBmb3JtYXRzUHRyLT5lbmQoKTsgKytmb3JtYXRJdGVyKSB7CisgICAgICAgICAgICBpZiAoYWxsU3Vycm91bmQuY291bnQoKmZvcm1hdEl0ZXIpID09IDAgJiYgZW5mb3JjZWRTdXJyb3VuZC5jb3VudCgqZm9ybWF0SXRlcikgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoKmZvcm1hdEl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChmb3JtYXRzUHRyLT5iZWdpbigpLCBmb3JtYXRzUHRyLT5lbmQoKSk7CisgICAgfQorICAgIGZvcm1hdHNQdHItPmNsZWFyKCk7ICAvLyBSZS1maWxsZWQgZnJvbSB0aGUgZm9ybWF0U2V0IGF0IHRoZSBlbmQuCisKICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7Ci0gICAgICAgIGZvcm1hdHMuY2xlYXIoKTsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gbVN1cnJvdW5kRm9ybWF0cy5iZWdpbigpOyBpdCAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZCgqaXQpOworICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuYmVnaW4oKSwgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5lbmQoKSk7CisgICAgICAgIC8vIEVuYWJsZSBJRUM2MTkzNyB3aGVuIGluIE1BTlVBTCBtb2RlIGlmIGl0J3MgZW5mb3JjZWQgZm9yIHRoaXMgZGV2aWNlLgorICAgICAgICBpZiAoZW5mb3JjZWRTdXJyb3VuZC5jb3VudChBVURJT19GT1JNQVRfSUVDNjE5MzcpICE9IDApIHsKKyAgICAgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKICAgICAgICAgfQotICAgICAgICAvLyBBbHdheXMgZW5hYmxlIElFQzYxOTM3IHdoZW4gaW4gTUFOVUFMIG1vZGUuCi0gICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7Ci0gICAgfSBlbHNlIHsgLy8gTkVWRVIsIEFVVE8gb3IgQUxXQVlTCi0gICAgICAgIC8vIEFuYWx5emUgb3JpZ2luYWwgc3VwcG9ydCBmb3IgdmFyaW91cyBmb3JtYXRzLgotICAgICAgICBib29sIHN1cHBvcnRzQUMzID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOwotICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7Ci0gICAgICAgIGZvciAoc3NpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgKHNzaXplX3QpZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdHNbZm9ybWF0SW5kZXhdOwotICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTOgotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUU19IRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgQUxXQVlTLCByZW1vdmUgYWxsIG90aGVyIHN1cnJvdW5kIGZvcm1hdHMgaGVyZQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSB3aWxsIGFkZCB0aGVtIGxhdGVyLgotICAgICAgICAgICAgICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLnJlbW92ZUF0KGZvcm1hdEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEluZGV4LS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfSUVDNjE5Mzc6Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZvcmNlVXNlICE9IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7IC8vIEFVVE8gb3IgQUxXQVlTCisgICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKKyAgICAgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoYWxsU3Vycm91bmQuYmVnaW4oKSwgYWxsU3Vycm91bmQuZW5kKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgLy8gTW9kaWZ5IGZvcm1hdHMgYmFzZWQgb24gc3Vycm91bmQgcHJlZmVyZW5jZXMuCi0gICAgICAgIC8vIElmIE5FVkVSLCByZW1vdmUgc3VwcG9ydCBmb3Igc3Vycm91bmQgZm9ybWF0cy4KLSAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7Ci0gICAgICAgICAgICBpZiAoc3VwcG9ydHNBQzMgfHwgc3VwcG9ydHNPdGhlclN1cnJvdW5kIHx8IHN1cHBvcnRzSUVDNjE5MzcpIHsKLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc3Vycm91bmQgc291bmQgcmVsYXRlZCBmb3JtYXRzLgotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBmb3JtYXRzLnNpemUoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdHNbZm9ybWF0SW5kZXhdOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUU19IRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0lFQzYxOTM3OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMucmVtb3ZlQXQoZm9ybWF0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRJbmRleCsrOyAvLyBrZWVwIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNBQzMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c0lFQzYxOTM3ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vIEFVVE8gb3IgQUxXQVlTCi0gICAgICAgICAgICAvLyBNb3N0IFRWcyBzdXBwb3J0IEFDMyBldmVuIGlmIHRoZXkgZG8gbm90IHJlcG9ydCBpdCBpbiB0aGUgRURJRC4KLSAgICAgICAgICAgIGlmICgoYWx3YXlzRm9yY2VBQzMgfHwgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykpCi0gICAgICAgICAgICAgICAgICAgICYmICFzdXBwb3J0c0FDMykgewotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9BQzMpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgQUxXQVlTLCBhZGQgc3VwcG9ydCBmb3IgcmF3IHN1cnJvdW5kIGZvcm1hdHMgaWYgYWxsIGFyZSBtaXNzaW5nLgotICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgaWYgYW55IG9mIHRoZXNlIGZvcm1hdHMgYXJlIHJlcG9ydGVkIGJ5IHRoZSBIQUwKLSAgICAgICAgICAgIC8vIHRoZW4gdGhlIHJlcG9ydCBpcyB2YWxpZCBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KLSAgICAgICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRV9BQzMpOwotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9EVFMpOwotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9EVFNfSEQpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBzdXBwb3J0IGZvciBJRUM2MTkzNyBpZiBhbnkgcmF3IHN1cnJvdW5kIHN1cHBvcnRlZC4KLSAgICAgICAgICAgIC8vIFRoZSBIQUwgY291bGQgZG8gdGhpcyBidXQgYWRkIGl0IGhlcmUsIGp1c3QgaW4gY2FzZS4KLSAgICAgICAgICAgIGlmICgoc3VwcG9ydHNBQzMgfHwgc3VwcG9ydHNPdGhlclN1cnJvdW5kKSAmJiAhc3VwcG9ydHNJRUM2MTkzNykgewotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCByZXBvcnRlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIHRvIGVuYWJsZWQgc3Vycm91bmQgZm9ybWF0cy4KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBmb3JtYXRzLnNpemUoKTsgZm9ybWF0SW5kZXgrKykgewotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdHNbZm9ybWF0SW5kZXhdOwotICAgICAgICAgICAgICAgIHN3aXRjaChmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FBQ19MQzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhEOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDM19KT0M6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChlbmZvcmNlZFN1cnJvdW5kLmJlZ2luKCksIGVuZm9yY2VkU3Vycm91bmQuZW5kKCkpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZvcm1hdCA6IGZvcm1hdFNldCkgeworICAgICAgICBmb3JtYXRzUHRyLT5wdXNoKGZvcm1hdCk7CiAgICAgfQogfQogCi0vLyBNb2RpZnkgdGhlIGxpc3Qgb2YgY2hhbm5lbCBtYXNrcyBzdXBwb3J0ZWQuCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cikgewordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Om1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpIHsKICAgICBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzID0gKmNoYW5uZWxNYXNrc1B0cjsKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwpAQCAtNjEzNCwxNiArNjA1OCwxNyBAQAogICAgICAgICAvLyBJZiBub3QgdGhlbiBhZGQgNS4xIHN1cHBvcnQuCiAgICAgICAgIGlmICghc3VwcG9ydHM1ZG90MSkgewogICAgICAgICAgICAgY2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKTsKLSAgICAgICAgICAgIEFMT0dJKCIlczogZm9yY2UgQUxXQVlTLCBzbyBhZGRpbmcgY2hhbm5lbE1hc2sgZm9yIDUuMSBzdXJyb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBTE9HSSgiJXM6IGZvcmNlIE1BTlVBTCBvciBBTFdBWVMsIHNvIGFkZGluZyBjaGFubmVsTWFzayBmb3IgNS4xIHN1cnJvdW5kIiwgX19mdW5jX18pOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQXVkaW9Qcm9maWxlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUF1ZGlvUHJvZmlsZXMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciAmcHJvZmlsZXMpCiB7CiAgICAgU3RyaW5nOCByZXBseTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOwogCiAgICAgLy8gRm9ybWF0IE1VU1QgYmUgY2hlY2tlZCBmaXJzdCB0byB1cGRhdGUgdGhlIGxpc3Qgb2YgQXVkaW9Qcm9maWxlCiAgICAgaWYgKHByb2ZpbGVzLmhhc0R5bmFtaWNGb3JtYXQoKSkgewpAQCAtNjE1Nyw4ICs2MDgyLDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0hETUkpIHsKLSAgICAgICAgICAgIGZpbHRlclN1cnJvdW5kRm9ybWF0cygmZm9ybWF0cyk7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCisgICAgICAgICAgICAgICAgfHwgaXNEZXZpY2VPZk1vZHVsZShkZXZEZXNjLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSkgeworICAgICAgICAgICAgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGRldkRlc2MsICZmb3JtYXRzKTsKICAgICAgICAgfQogICAgICAgICBwcm9maWxlcy5zZXRGb3JtYXRzKGZvcm1hdHMpOwogICAgIH0KQEAgLTYxOTAsOCArNjExNiw5IEBACiAgICAgICAgICAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAogICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHJlcGx5KSA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcocmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlclN1cnJvdW5kQ2hhbm5lbE1hc2tzKCZjaGFubmVsTWFza3MpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0RldmljZU9mTW9kdWxlKGRldkRlc2MsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKCZjaGFubmVsTWFza3MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjE5OSw0ICs2MTI2LDU4IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSAqaW9EZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoCisgICAgICAgICAgICBwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgPworICAgICAgICAgICAgKnBhdGNoSGFuZGxlIDogaW9EZXNjcmlwdG9yLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKAorICAgICAgICAgICAgY2FsbGVyLCBpbmRleCwgcGF0Y2hIYW5kbGUsIHBhdGNoLCBkZWxheU1zLCBtVWlkQ2FjaGVkLCAmcGF0Y2hEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlvRGVzY3JpcHRvci0+c2V0UGF0Y2hIYW5kbGUocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+ICpwYXRjaERlc2NQdHIpCit7CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIEFMT0dWKCIlcygpIEFGOjpjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICBjYWxsZXIsIHN0YXR1cywgYWZQYXRjaEhhbmRsZSwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKHBhdGNoLCB1aWQpOworICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9ICpwYXRjaDsKKyAgICAgICAgfQorICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgIH0KKyAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoRGVzY1B0cikgKnBhdGNoRGVzY1B0ciA9IHBhdGNoRGVzYzsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCmluZGV4IDQ4ZTA0NzIuLjFmYzYxZTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCkBAIC0zMCw2ICszMSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCiAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KQEAgLTM4LDYgKzQwLDcgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeUNvbmZpZy5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KKyNpbmNsdWRlIDxBdWRpb1Byb2ZpbGUuaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8SU9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8SHdNb2R1bGUuaD4KQEAgLTQ2LDggKzQ5LDcgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgogI2luY2x1ZGUgPEVmZmVjdERlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxTb3VuZFRyaWdnZXJTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8U2Vzc2lvblJvdXRlLmg+Ci0jaW5jbHVkZSA8Vm9sdW1lQ3VydmUuaD4KKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtOTUsMTIgKzk3LDE0IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgdmlydHVhbCB2b2lkIHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKICAgICAgICAgdmlydHVhbCB2b2lkIHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKQEAgLTEwOSwyNCArMTEzLDE5IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwogICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCkBAIC0xMzgsMjAgKzEzNywyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwogCiAgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCAqY29uY3VycmVuY3kpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZUFsbElucHV0cygpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBpbml0U3RyZWFtVm9sdW1lOiBldmVuIGlmIHRoZSBlbmdpbmUgdm9sdW1lIGZpbGVzIHByb3ZpZGVzIG1pbiBhbmQgbWF4LCBrZWVwIHRoaXMKKyAgICAgICAgICogYXBpIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbi4KKyAgICAgICAgICogQXVkaW9TZXJ2ZXIgd2lsbCBnZXQgdGhlIG1pbiBhbmQgbWF4IGFuZCBtYXkgb3ZlcndyaXRlIHRoZW0gaWY6CisgICAgICAgICAqICAgICAgLXVzaW5nIHByb3BlcnR5IChoaWdoZXN0IHByaW9yaXR5KQorICAgICAgICAgKiAgICAgIC1ub3QgZGVmaW5lZCAoLTEgYnkgY29udmVudGlvbiksIGNhc2Ugd2hlbiBzdGlsbCB1c2luZyBhcG0gdm9sdW1lIHRhYmxlcyBYTUwgZmlsZXMKKyAgICAgICAgICogQHBhcmFtIHN0cmVhbSB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqIEBwYXJhbSBpbmRleE1pbiB0byBzZXQKKyAgICAgICAgICogQHBhcmFtIGluZGV4TWF4IHRvIHNldAorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CkBAIC0xNTksMTAgKzE2MSwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCk7CisKKyAgICAgICAgc3RhdHVzX3Qgc2V0Vm9sdW1lR3JvdXBJbmRleChJVm9sdW1lQ3VydmVzICZ2b2x1bWVDdXJ2ZXMsIHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMpOworCisgICAgICAgIHN0YXR1c190IHNldFZvbHVtZUN1cnZlSW5kZXgoaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZvbHVtZUN1cnZlcyAmdm9sdW1lQ3VydmVzKTsKKworICAgICAgICBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleChjb25zdCBJVm9sdW1lQ3VydmVzICZjdXJ2ZXMsIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OworCiAgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0cmVhbVRvU3RyYXRlZ3koc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyZWFtVG9TdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICB9CiAKICAgICAgICAgLy8gcmV0dXJuIHRoZSBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUKICAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CkBAIC0xNzMsMTQgKzIwMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLnVucmVnaXN0ZXJFZmZlY3QoaWQpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOwotICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKICAgICAgICAgLy8gcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCkBAIC0xOTMsMTAgKzIxNSwxNyBAQAogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgICAgICAvLyBoZWxwZXJzIGZvciBkdW1wKGludCBmZCkKKyAgICAgICAgdm9pZCBkdW1wTWFudWFsU3Vycm91bmRGb3JtYXRzKFN0cmluZzggKmRzdCkgY29uc3Q7CisgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OworCisgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBvdmVycmlkZTsKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbyk7CiAKKyAgICAgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcyk7CisKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC0yMjYsMTIgKzI1NSwxNSBAQAogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKQEAgLTI0NCwxMCArMjc2LDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOwogCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQorICAgICAgICB7CisgICAgICAgICAgICBwcm9kdWN0U3RyYXRlZ3kgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGFhLmdldEF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICByZXR1cm4gcHJvZHVjdFN0cmF0ZWd5ICE9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKGdyb3Vwcyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvbHVtZUdyb3VwID0gbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGFhLmdldEF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICByZXR1cm4gdm9sdW1lR3JvdXAgIT0gVk9MVU1FX0dST1VQX05PTkUgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKKyAgICAgICAgfQogCiBwcm90ZWN0ZWQ6CiAgICAgICAgIC8vIEEgY29uc3RydWN0b3IgdGhhdCBhbGxvd3MgbW9yZSBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIGluaXRpYWxpemF0aW9uIHByb2Nlc3MsCkBAIC0yOTQsNjcgKzM1Miw4NCBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKICAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICZnZXRWb2x1bWVDdXJ2ZXMoKSB7IHJldHVybiAqbVZvbHVtZUN1cnZlczsgfQogICAgICAgICB2aXJ0dWFsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlOwogICAgICAgICB9CiAKKyAgICAgICAgc3RkOjp2ZWN0b3I8dm9sdW1lX2dyb3VwX3Q+IGdldFZvbHVtZUdyb3VwcygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtRW5naW5lLT5nZXRWb2x1bWVHcm91cHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIFZvbHVtZVNvdXJjZSB0b1ZvbHVtZVNvdXJjZSh2b2x1bWVfZ3JvdXBfdCB2b2x1bWVHcm91cCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZvbHVtZVNvdXJjZT4odm9sdW1lR3JvdXApOworICAgICAgICB9CisgICAgICAgIFZvbHVtZVNvdXJjZSB0b1ZvbHVtZVNvdXJjZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0b1ZvbHVtZVNvdXJjZShtRW5naW5lLT5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcykpOworICAgICAgICB9CisgICAgICAgIFZvbHVtZVNvdXJjZSB0b1ZvbHVtZVNvdXJjZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRvVm9sdW1lU291cmNlKG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pKTsKKyAgICAgICAgfQorICAgICAgICBJVm9sdW1lQ3VydmVzICZnZXRWb2x1bWVDdXJ2ZXMoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgIGF1dG8gKmN1cnZlcyA9IG1FbmdpbmUtPmdldFZvbHVtZUN1cnZlc0ZvclZvbHVtZUdyb3VwKAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4odm9sdW1lU291cmNlKSk7CisgICAgICAgICAgQUxPR19BU1NFUlQoY3VydmVzICE9IG51bGxwdHIsICJObyBjdXJ2ZXMgZm9yIHZvbHVtZSBzb3VyY2UgJWQiLCB2b2x1bWVTb3VyY2UpOworICAgICAgICAgIHJldHVybiAqY3VydmVzOworICAgICAgICB9CisgICAgICAgIElWb2x1bWVDdXJ2ZXMgJmdldFZvbHVtZUN1cnZlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gKmN1cnZlcyA9IG1FbmdpbmUtPmdldFZvbHVtZUN1cnZlc0ZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChjdXJ2ZXMgIT0gbnVsbHB0ciwgIk5vIGN1cnZlcyBmb3IgYXR0cmlidXRlcyAlcyIsIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuICpjdXJ2ZXM7CisgICAgICAgIH0KKyAgICAgICAgSVZvbHVtZUN1cnZlcyAmZ2V0Vm9sdW1lQ3VydmVzKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBhdXRvICpjdXJ2ZXMgPSBtRW5naW5lLT5nZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChjdXJ2ZXMgIT0gbnVsbHB0ciwgIk5vIGN1cnZlcyBmb3Igc3RyZWFtICVzIiwgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAqY3VydmVzOworICAgICAgICB9CisKICAgICAgICAgdm9pZCBhZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwogICAgICAgICB2b2lkIHJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CiAKLSAgICAgICAgLy8gcmV0dXJuIGFwcHJvcHJpYXRlIGRldmljZSBmb3Igc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgYWNjb3JkaW5nIHRvIGN1cnJlbnQKLSAgICAgICAgLy8gcGhvbmUgc3RhdGUsIGNvbm5lY3RlZCBkZXZpY2VzLi4uCi0gICAgICAgIC8vIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gbURldmljZUZvclN0cmF0ZWd5W10sCi0gICAgICAgIC8vIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmUgYnkgY3VycmVudCBzdGF0ZQotICAgICAgICAvLyAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBhMmRwIG91dHB1dC4uLikKLSAgICAgICAgLy8gVGhpcyBhbGxvd3MgdG86Ci0gICAgICAgIC8vICAxIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgc3RhdGUgaXMgc3RhYmxlICh3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIGFuIG91dHB1dCkKLSAgICAgICAgLy8gIDIgYWNjZXNzIHRvIGVpdGhlciBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSB0cnVlKSBvcgotICAgICAgICAvLyAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0Ci0gICAgICAgIC8vICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECi0gICAgICAgIC8vICBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKLQotICAgICAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmUoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7Ci0KLSAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIHVpbnQzMl90IGluUGFzdE1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7Ci0KICAgICAgICAgLy8gY2hhbmdlIHRoZSByb3V0ZSBvZiB0aGUgc3BlY2lmaWVkIG91dHB1dC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdlIGhhdmUgc2xlcHQgdG8KICAgICAgICAgLy8gYWxsb3cgbmV3IHJvdXRpbmcgdG8gdGFrZSBlZmZlY3QgaW4gY2VydGFpbiBjYXNlcy4KLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrID0gdHJ1ZSk7CisgICAgICAgIHVpbnQzMl90IHNldE91dHB1dERldmljZXMoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrID0gdHJ1ZSk7CiAgICAgICAgIHN0YXR1c190IHJlc2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CiAgICAgICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwogICAgICAgICBzdGF0dXNfdCByZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwogCi0gICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKTsKLQogICAgICAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdm9sdW1lIGZvciBhIGdpdmVuIHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBpbmRleCBhbmQgYSBwYXJ0aWN1bGFyCiAgICAgICAgIC8vIGRldmljZQotICAgICAgICB2aXJ0dWFsIGZsb2F0IGNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgIHZpcnR1YWwgZmxvYXQgY29tcHV0ZVZvbHVtZShJVm9sdW1lQ3VydmVzICZjdXJ2ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAKKyAgICAgICAgLy8gcmVzY2FsZSB2b2x1bWUgaW5kZXggZnJvbSBzcmNTdHJlYW0gd2l0aGluIHJhbmdlIG9mIGRzdFN0cmVhbQorICAgICAgICBpbnQgcmVzY2FsZVZvbHVtZUluZGV4KGludCBzcmNJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IGRzdFN0cmVhbSk7CiAgICAgICAgIC8vIGNoZWNrIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBwZXJtaXR0ZWQsIGNvbXB1dGUgYW5kIHNlbmQgbmV3IHZvbHVtZSB0byBhdWRpbyBoYXJkd2FyZQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2hlY2tBbmRTZXRWb2x1bWUoSVZvbHVtZUN1cnZlcyAmY3VydmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOwpAQCAtMzYzLDIzICs0MzgsMzcgQEAKICAgICAgICAgdm9pZCBhcHBseVN0cmVhbVZvbHVtZXMoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOwogCi0gICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIGFsbCBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAotICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHNldFN0cmF0ZWd5TXV0ZSBNdXRlIG9yIHVubXV0ZSBhbGwgYWN0aXZlIGNsaWVudHMgb24gdGhlIGNvbnNpZGVyZWQgb3V0cHV0CisgICAgICAgICAqIGZvbGxvd2luZyB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICAgICAqIEBwYXJhbSBzdHJhdGVneSB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqIEBwYXJhbSBvbiB0cnVlIGZvciBtdXRlLCBmYWxzZSBmb3IgdW5tdXRlCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXREZXNjIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICogQHBhcmFtIGRlbGF5TXMKKyAgICAgICAgICogQHBhcmFtIGRldmljZQorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRTdHJhdGVneU11dGUocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkUpOwogCi0gICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKLSAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKLQotICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlcyBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHdoaWxlIGluIGNhbGw6IG11dGUgc3RyZWFtcyBvciByZXBsYWNlIGJ5Ci0gICAgICAgIC8vIGEgc3BlY2lhbCB0b25lIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgotICAgICAgICB2b2lkIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgc2V0Vm9sdW1lU291cmNlTXV0ZSBNdXRlIG9yIHVubXV0ZSB0aGUgdm9sdW1lIHNvdXJjZSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICAgKiBAcGFyYW0gdm9sdW1lU291cmNlIHRvIGJlIG11dGVkL3VubXV0ZSAobWF5IGhvc3QgbGVnYWN5IHN0cmVhbXMgb3IgYnkgZXh0ZW5zaW9uIHNldCBvZgorICAgICAgICAgKiBhdWRpbyBhdHRyaWJ1dGVzKQorICAgICAgICAgKiBAcGFyYW0gb24gdHJ1ZSB0byBtdXRlLCBmYWxzZSB0byB1bXV0ZQorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0RGVzYyBvbiB3aGljaCB0aGUgY2xpZW50IGZvbGxvd2luZyB0aGUgdm9sdW1lIGdyb3VwIHNoYWxsIGJlIG11dGVkL3VtdXRlZAorICAgICAgICAgKiBAcGFyYW0gZGVsYXlNcworICAgICAgICAgKiBAcGFyYW0gZGV2aWNlCisgICAgICAgICAqIEBwYXJhbSBhY3RpdmVPbmx5IGlmIHRydWUsIG11dGUgb25seSBpZiB0aGUgdm9sdW1lIGdyb3VwIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRWb2x1bWVTb3VyY2VNdXRlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKTsKIAogICAgICAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpOwogCkBAIC0zOTQsMTUgKzQ4MywxMyBAQAogICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG91dHB1dCBpcyBub3QgdXNlZCBhbnkgbW9yZSBhbmQKICAgICAgICAgLy8gcmV0dXJucyBpdHMgaGFuZGxlIGlmIGFueS4KICAgICAgICAgLy8gdHJhbnNmZXJzIHRoZSBhdWRpbyB0cmFja3MgYW5kIGVmZmVjdHMgZnJvbSBvbmUgb3V0cHV0IHRocmVhZCB0byBhbm90aGVyIGFjY29yZGluZ2x5LgotICAgICAgICBzdGF0dXNfdCBjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCisgICAgICAgIHN0YXR1c190IGNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyk7CiAKLSAgICAgICAgc3RhdHVzX3QgY2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCisgICAgICAgIHN0YXR1c190IGNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzKTsKIAogICAgICAgICAvLyBjbG9zZSBhbiBvdXRwdXQgYW5kIGl0cyBjb21wYW5pb24gZHVwbGljYXRpbmcgb3V0cHV0LgogICAgICAgICB2b2lkIGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CkBAIC00MTAsMTUgKzQ5NywzNSBAQAogICAgICAgICAvLyBjbG9zZSBhbiBpbnB1dC4KICAgICAgICAgdm9pZCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKIAotICAgICAgICAvLyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgYWxsIHN0cmF0ZWdpZXMuCi0gICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5Ci0gICAgICAgIC8vIGNoYW5nZXM6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KLSAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKLSAgICAgICAgdm9pZCBjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpOworICAgICAgICAvLyBydW5zIGFsbCB0aGUgY2hlY2tzIHJlcXVpcmVkIGZvciBhY2NvbW9kYXRpbmcgY2hhbmdlcyBpbiBkZXZpY2VzIGFuZCBvdXRwdXRzCisgICAgICAgIC8vIGlmICdvbk91dHB1dHNDaGVja2VkJyBjYWxsYmFjayBpcyBwcm92aWRlZCwgaXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIG91dHB1dHMKKyAgICAgICAgLy8gY2hlY2sgdmlhICdjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMnLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyAndHJ1ZScsCisgICAgICAgIC8vIEEyRFAgc3VzcGVuZCBzdGF0dXMgaXMgcmVjaGVja2VkLgorICAgICAgICB2b2lkIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gb25PdXRwdXRzQ2hlY2tlZCA9IG51bGxwdHIpOwogCi0gICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIGJ1dCBmb3IgYSBhbGwgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eQorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgdGhlCisgICAgICAgICAqIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICAgICAqIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuCisgICAgICAgICAqIGF0dHJpYnV0ZXMgY2hhbmdlczogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQorICAgICAgICAgKiBAcGFyYW0gYXR0ciB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpOworCisgICAgICAgIGJvb2wgZm9sbG93c1NhbWVSb3V0aW5nKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmbEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmckF0dHIpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIFNhbWUgYXMgQHNlZSBjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoKQorICAgICAgICAgKiAgICAgIGJ1dCBmb3IgYSBhbGwgcHJvZHVjdCBzdHJhdGVnaWVzIGluIG9yZGVyIG9mIHByaW9yaXR5CisgICAgICAgICAqLwogICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogCisgICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSBidXQgZm9yIHNlY29uZGFyeSBvdXRwdXRzLiBNYWtlIHN1cmUgaWYgYSBzZWNvbmRhcnkKKyAgICAgICAgLy8gb3V0cHV0IGNvbmRpdGlvbiBjaGFuZ2VzLCB0aGUgdHJhY2sgaXMgcHJvcGVybHkgcmVyb3V0ZWQKKyAgICAgICAgdm9pZCBjaGVja1NlY29uZGFyeU91dHB1dHMoKTsKKwogICAgICAgICAvLyBtYW5hZ2VzIEEyRFAgb3V0cHV0IHN1c3BlbmQvcmVzdG9yZSBhY2NvcmRpbmcgdG8gcGhvbmUgc3RhdGUgYW5kIEJUIFNDTyB1c2FnZQogICAgICAgICB2b2lkIGNoZWNrQTJkcFN1c3BlbmQoKTsKIApAQCAtNDI2LDE4ICs1MzMsMjEgQEAKICAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gb3V0cHV0IGlzCiAgICAgICAgIC8vIGNoYW5nZWQ6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIG91dHB1dCBzdGFydCwgb3V0cHV0IHN0b3AuLgogICAgICAgICAvLyBzZWUgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmb3IgdGhlIHVzZSBvZiBmcm9tQ2FjaGUgcGFyYW1ldGVyCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7CisgICAgICAgIERldmljZVZlY3RvciBnZXROZXdPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOwogCi0gICAgICAgIC8vIHVwZGF0ZXMgY2FjaGUgb2YgZGV2aWNlIHVzZWQgYnkgYWxsIHN0cmF0ZWdpZXMgKG1EZXZpY2VGb3JTdHJhdGVneVtdKQotICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneSBpcwotICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCi0gICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBpZiBwYXJhbWV0ZXIgZnJvbUNhY2hlIGlzIHRydWUuCi0gICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzOiB1cGRhdGVzIGNhY2hlIG9mIGRldmljZXMgb2YgdGhlIGVuZ2luZQorICAgICAgICAgKiBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBpcyBjaGFuZ2VkOgorICAgICAgICAgKiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCisgICAgICAgICAqIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSgpL2dldERldmljZXNGb3JBdHRyaWJ1dGVzIGlmCisgICAgICAgICAqIHBhcmFtZXRlciBmcm9tQ2FjaGUgaXMgdHJ1ZS4KKyAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKIAogICAgICAgICAvLyBzZWxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGRldmljZSBvbiBpbnB1dCBmb3IgY3VycmVudCBzdGF0ZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3SW5wdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXROZXdJbnB1dERldmljZShjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CiAKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpCiAgICAgICAgIHsKQEAgLTQ0OSwzNCArNTU5LDUwIEBACiAgICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMuZ2V0TWF4RWZmZWN0c01lbW9yeSgpOwogICAgICAgICB9CiAKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpOwotICAgICAgICBib29sIHZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMik7CisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZXMoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLCBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpOwogCi0gICAgICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgotICAgICAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAgICAgLy8gaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKLSAgICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdhaXRlZAotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMKKyAgICAgICAgICogICAgICB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uLgorICAgICAgICAgKiAgICAgIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgICAgICAgKiAgICAgIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgICAgICAqIEBwYXJhbSBvdXRwdXREZXNjCisgICAgICAgICAqIEBwYXJhbSBwcmV2RGV2aWNlCisgICAgICAgICAqIEBwYXJhbSBkZWxheU1zCisgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtcyB3YWl0ZWQKKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZwcmV2RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOwogCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDApOwogICAgICAgICAvLyBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2sgYXJlIGluL291dCBhbmQgc28gbWF5IGJlIG1vZGlmaWVkCi0gICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCYgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOwotICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBnZXRQcm9maWxlRm9yT3V0cHV0CisgICAgICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXNjcmlwdG9ycywgbWF5IGJlIGVtcHR5IGlmIGlnbm9yaW5nIHRoZSBkZXZpY2UgaXMgcmVxdWlyZWQKKyAgICAgICAgICogQHBhcmFtIHNhbXBsaW5nUmF0ZQorICAgICAgICAgKiBAcGFyYW0gZm9ybWF0CisgICAgICAgICAqIEBwYXJhbSBjaGFubmVsTWFzaworICAgICAgICAgKiBAcGFyYW0gZmxhZ3MKKyAgICAgICAgICogQHBhcmFtIGRpcmVjdE9ubHkKKyAgICAgICAgICogQHJldHVybiBJT1Byb2ZpbGUgdG8gYmUgdXNlZCBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvck91dHB1dChjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KTsKIAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKIApAQCAtNDg5LDYyICs2MTUsODcgQEAKICAgICAgICAgICAgIHJldHVybiBtQXVkaW9QYXRjaGVzLnJlbW92ZUF1ZGlvUGF0Y2goaGFuZGxlKTsKICAgICAgICAgfQogCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIGJvb2wgaXNQcmltYXJ5TW9kdWxlKGNvbnN0IHNwPEh3TW9kdWxlPiAmbW9kdWxlKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBpZiAobW9kdWxlID09IDAgfHwgIWhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2R1bGUtPmdldEhhbmRsZSgpID09IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVByaW1hcnlPdXRwdXQtPnN1cHBvcnRlZERldmljZXMoKSAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZmlsdGVyKG1QcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkpOwogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgY29uc3QKKyAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKAorICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgZ2V0Rmlyc3REZXZpY2VJZCBvZiB0aGUgRGV2aWNlIFZlY3RvcgorICAgICAgICAgKiBAcmV0dXJuIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG5vdCBlbXB0eSwgaXQgcmV0dXJucyB0aGUgZmlyc3QgZGV2aWNlIElkLAorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgICAgICAqLworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldEZpcnN0RGV2aWNlSWQoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpID4gMCkgPyBkZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKSA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCBnZXRGaXJzdERldmljZUFkZHJlc3MoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpID4gMCkgPyBkZXZpY2VzLml0ZW1BdCgwKS0+YWRkcmVzcygpIDogU3RyaW5nOCgiIik7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3JlYXRlVGVsZXBob255UGF0Y2goYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhjb25zdCBEZXZpY2VWZWN0b3IgJnJ4RGV2aWNlcywgdWludDMyX3QgZGVsYXlNcyA9IDApOworICAgICAgICBzcDxBdWRpb1BhdGNoPiBjcmVhdGVUZWxlcGhvbnlQYXRjaChib29sIGlzUngsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kRGV2aWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXRNb2R1bGVEZXZpY2VUeXBlcygKKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGNvbnN0IGNoYXIgKm1vZHVsZUlkKSBjb25zdDsKKyAgICAgICAgYm9vbCBpc0RldmljZU9mTW9kdWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3Q7CiAKLSAgICAgICAgLy8gaWYgYXJndW1lbnQgImRldmljZSIgaXMgZGlmZmVyZW50IGZyb20gQVVESU9fREVWSUNFX05PTkUsICBzdGFydFNvdXJjZSgpIHdpbGwgZm9yY2UKLSAgICAgICAgLy8gdGhlIHJlLWV2YWx1YXRpb24gb2YgdGhlIG91dHB1dCBkZXZpY2UuCi0gICAgICAgIHN0YXR1c190IHN0YXJ0U291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpOwotICAgICAgICBzdGF0dXNfdCBzdG9wU291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSk7CisgICAgICAgIHN0YXR1c190IHN0b3BTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCk7CiAKICAgICAgICAgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIGNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpOwotICAgICAgICB2b2lkIGNoZWNrU3RyYXRlZ3lSb3V0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tTdHJhdGVneVJvdXRlOiB3aGVuIGFuIG91dHB1dCBpcyBiZWVpbmcgcmVyb3V0ZWQsIHJlY29uc2lkZXIgZWFjaCBvdXRwdXQKKyAgICAgICAgICogdGhhdCBtYXkgaG9zdCBhIHN0cmF0ZWd5IHBsYXlpbmcgb24gdGhlIGNvbnNpZGVyZWQgb3V0cHV0LgorICAgICAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0aGF0IGluaXRpYXRlZCB0aGUgcmVyb3V0aW5nCisgICAgICAgICAqIEBwYXJhbSBvdXB0dXRUb1NraXAgb3V0cHV0IHRoYXQgaW5pdGlhdGVkIHRoZSByZXJvdXRpbmcKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2hlY2tTdHJhdGVneVJvdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKTsKIAogICAgICAgICBzdGF0dXNfdCBoYXNQcmltYXJ5T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbVByaW1hcnlPdXRwdXQgIT0gMDsgfQogCi0gICAgICAgIHN0YXR1c190IGNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKLSAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOwogCi0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CiAKICAgICAgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKTsKIAogICAgICAgICB2b2lkIGNsZWFyQXVkaW9Tb3VyY2VzKHVpZF90IHVpZCk7CiAKLSAgICAgICAgc3RhdGljIGJvb2wgaXNDb25jdXJyZW50U291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7Ci0KLSAgICAgICAgYm9vbCBpc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbik7Ci0KICAgICAgICAgc3RhdGljIGJvb2wgc3RyZWFtc01hdGNoRm9ydm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMik7CiAKLSAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKKyAgICAgICAgdm9pZCBjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCk7CisgICAgICAgIHZvaWQgY2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgICAgIGNvbnN0IHVpZF90IG1VaWRDYWNoZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFJRF9BVURJT1NFUlZFUgogICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVByaW1hcnlPdXRwdXQ7ICAgICAvLyBwcmltYXJ5IG91dHB1dCBkZXNjcmlwdG9yCiAgICAgICAgIC8vIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG91dHB1dHMgY3VycmVudGx5IG9wZW5lZApAQCAtNTU4LDIwICs3MDksMTcgQEAKICAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsgLy8gYWxsIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwogICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVJbnB1dERldmljZXM7ICAvLyBhbGwgYXZhaWxhYmxlIGlucHV0IGRldmljZXMKIAotICAgICAgICBTZXNzaW9uUm91dGVNYXAgbU91dHB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfT1VUUFVUKTsKLSAgICAgICAgU2Vzc2lvblJvdXRlTWFwIG1JbnB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfSU5QVVQpOwotCiAgICAgICAgIGJvb2wgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWU7ICAgICAgICAvLyBsaW1pdCByaW5ndG9uZSB2b2x1bWUgdG8gbXVzaWMgdm9sdW1lIGlmIGhlYWRzZXQgY29ubmVjdGVkCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlRm9yU3RyYXRlZ3lbTlVNX1NUUkFURUdJRVNdOworCiAgICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTAogICAgICAgICBib29sICAgIG1BMmRwU3VzcGVuZGVkOyAgLy8gdHJ1ZSBpZiBBMkRQIG91dHB1dCBpcyBzdXNwZW5kZWQKIAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24+IG1Wb2x1bWVDdXJ2ZXM7IC8vIFZvbHVtZSBDdXJ2ZXMgcGVyIHVzZSBjYXNlIGFuZCBkZXZpY2UgY2F0ZWdvcnkKICAgICAgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVmZmVjdHM7ICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgYXVkaW8gZWZmZWN0cwogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGVmYXVsdE91dHB1dERldmljZTsgLy8gb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSBkZWZhdWx0IGF0IGJvb3QgdGltZQogICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gbUh3TW9kdWxlczsgLy8gY29udGFpbnMgb25seSBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBzdWNjZXNzZnVsbHkKICAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1Id01vZHVsZXNBbGw7IC8vIG5vcm1hbGx5IG5vdCBuZWVkZWQsIHVzZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBhbmQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdW1wcworCiAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnIG1Db25maWc7CiAKICAgICAgICAgc3RkOjphdG9taWM8dWludDMyX3Q+IG1BdWRpb1BvcnRHZW5lcmF0aW9uOwpAQCAtNTg0LDcgKzczMiw3IEBACiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsUnhQYXRjaDsKIAogICAgICAgICBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBtSHdPdXRwdXRzOwotICAgICAgICBBdWRpb1NvdXJjZUNvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKKyAgICAgICAgU291cmNlQ2xpZW50Q29sbGVjdGlvbiBtQXVkaW9Tb3VyY2VzOwogCiAgICAgICAgIC8vIGZvciBzdXBwb3J0aW5nICJiZWFjb24iIHN0cmVhbXMsIGkuZS4gc3RyZWFtcyB0aGF0IG9ubHkgcGxheSBvbiBzcGVha2VyLCBhbmQgbmV2ZXIKICAgICAgICAgLy8gd2hlbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBTVFJFQU1fVFRTIChhLmsuYS4gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciIpIGlzIHBsYXlpbmcKQEAgLTYwOCwxNyArNzU2LDI3IEBACiAgICAgICAgIC8vIEF1ZGlvIFBvbGljeSBFbmdpbmUgSW50ZXJmYWNlLgogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKm1FbmdpbmU7CiAKLSAgICAgICAgLy8gU3Vycm91bmQgZm9ybWF0cyB0aGF0IGFyZSBlbmFibGVkLgotICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IG1TdXJyb3VuZEZvcm1hdHM7CisgICAgICAgIC8vIFN1cnJvdW5kIGZvcm1hdHMgdGhhdCBhcmUgZW5hYmxlZCBtYW51YWxseS4gVGFrZW4gaW50byBhY2NvdW50IHdoZW4KKyAgICAgICAgLy8gImVuY29kZWQgc3Vycm91bmQiIGlzIGZvcmNlZCBpbnRvICJtYW51YWwiIG1vZGUuCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gbU1hbnVhbFN1cnJvdW5kRm9ybWF0czsKIHByaXZhdGU6CiAgICAgICAgIC8vIEFkZCBvciByZW1vdmUgQUMzIERUUyBlbmNvZGluZ3MgYmFzZWQgb24gdXNlciBwcmVmZXJlbmNlcy4KLSAgICAgICAgdm9pZCBmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKTsKLSAgICAgICAgdm9pZCBmaWx0ZXJTdXJyb3VuZENoYW5uZWxNYXNrcyhDaGFubmVsc1ZlY3RvciAqY2hhbm5lbE1hc2tzUHRyKTsKKyAgICAgICAgdm9pZCBtb2RpZnlTdXJyb3VuZEZvcm1hdHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cik7CisgICAgICAgIHZvaWQgbW9kaWZ5U3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cik7CiAKLSAgICAgICAgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRm9ybWF0cyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgRm9ybWF0VmVjdG9yJiBmb3JtYXRzKTsKKyAgICAgICAgLy8gU3VwcG9ydCBmb3IgTXVsdGktU3RyZWFtIERlY29kZXIgKE1TRCkgbW9kdWxlCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldE1zZEF1ZGlvSW5EZXZpY2UoKSBjb25zdDsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpIGNvbnN0OworICAgICAgICBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBnZXRNc2RQYXRjaGVzKCkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGh3QXZTeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtDb25maWcpIGNvbnN0OworICAgICAgICBQYXRjaEJ1aWxkZXIgYnVpbGRNc2RQYXRjaChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlKSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3Qgc2V0TXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSA9IG51bGxwdHIpOwogCiAgICAgICAgIC8vIElmIGFueSwgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcyBvZiBhbiBBdWRpbyBQcm9maWxlcyBjb2xsZWN0aW9uCi0gICAgICAgIHZvaWQgdXBkYXRlQXVkaW9Qcm9maWxlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgdm9pZCB1cGRhdGVBdWRpb1Byb2ZpbGVzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgJnByb2ZpbGVzKTsKIAogICAgICAgICAvLyBOb3RpZnkgdGhlIHBvbGljeSBjbGllbnQgb2YgYW55IGNoYW5nZSBvZiBkZXZpY2Ugc3RhdGUgd2l0aCBBVURJT19JT19IQU5ETEVfTk9ORSwKQEAgLTYyNiw0MiArNzg0LDU4IEBACiAgICAgICAgIC8vIEl0IGNhbiBnaXZlIGEgY2hhbmNlIHRvIEhBTCBpbXBsZW1lbnRlciB0byByZXRyaWV2ZSBkeW5hbWljIGNhcGFiaWxpdGllcyBhc3NvY2lhdGVkCiAgICAgICAgIC8vIHRvIHRoaXMgZGV2aWNlIGZvciBleGFtcGxlLgogICAgICAgICAvLyBUT0RPIGF2b2lkIG9wZW5pbmcgc3RyZWFtIHRvIHJldHJpZXZlIGNhcGFiaWxpdGllcyBvZiBhIHByb2ZpbGUuCi0gICAgICAgIHZvaWQgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmZGV2aWNlX2FkZHJlc3MpOworICAgICAgICB2b2lkIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOwogCiAgICAgICAgIC8vIHVwZGF0ZXMgZGV2aWNlIGNhY2hpbmcgYW5kIG91dHB1dCBmb3Igc3RyZWFtcyB0aGF0IGNhbiBpbmZsdWVuY2UgdGhlCiAgICAgICAgIC8vICAgIHJvdXRpbmcgb2Ygbm90aWZpY2F0aW9ucwogICAgICAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAvLyBmaW5kIHRoZSBvdXRwdXRzIG9uIGEgZ2l2ZW4gb3V0cHV0IGRlc2NyaXB0b3IgdGhhdCBoYXZlIHRoZSBnaXZlbiBhZGRyZXNzLgotICAgICAgICAvLyB0byBiZSBjYWxsZWQgb24gYW4gQXVkaW9PdXRwdXREZXNjcmlwdG9yIHdob3NlIHN1cHBvcnRlZCBkZXZpY2VzIChhcyBkZWZpbmVkCi0gICAgICAgIC8vICAgaW4gbVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzKSBtYXRjaGVzIHRoZSBkZXZpY2Ugd2hvc2UgYWRkcmVzcyBpcyB0byBiZSBtYXRjaGVkLgotICAgICAgICAvLyBzZWUgZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QpIGZvciB3aGV0aGVyIHRoZSBkZXZpY2UgdHlwZSBpcyBvbmUKLSAgICAgICAgLy8gICB3aGVyZSBhZGRyZXNzZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbmUgY29ubmVjdGVkIGRldmljZSBhbmQgYW5vdGhlci4KLSAgICAgICAgdm9pZCBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYyAvKmluKi8sCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSAvKmluKi8sCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyAvKmluKi8sCi0gICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKTsKICAgICAgICAgdWludDMyX3QgY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb1BvcnRHZW5lcmF0aW9uOyB9CisgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCwgZ2V0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBmcm9tIGVpdGhlciBhIHNvdXJjZSBhdWRpb19hdHRyaWJ1dGVzX3QKKyAgICAgICAgLy8gb3IgYXVkaW9fc3RyZWFtX3R5cGVfdCwgcmVzcGVjdGl2ZWx5LgorICAgICAgICBzdGF0dXNfdCBnZXRBdWRpb0F0dHJpYnV0ZXMoYXVkaW9fYXR0cmlidXRlc190ICpkc3RBdHRyLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqc3JjQXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSk7CisgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCwgY2FsbGVkIGJ5IGdldE91dHB1dEZvckF0dHIoKSBhbmQgY29ubmVjdEF1ZGlvU291cmNlLgorICAgICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRySW50KGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcmVzdWx0QXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgYm9vbCAqaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiAqc2Vjb25kYXJ5RGVzY3MpOwogICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckRldmljZXMoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzKTsKLSAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgaW5wdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXRGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VNdXRpbmdIYXB0aWMgPSBmYWxzZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBnZXRJbnB1dEZvckRldmljZSBzZWxlY3RzIGFuIGlucHV0IGhhbmRsZSBmb3IgYSBnaXZlbiBpbnB1dCBkZXZpY2UgYW5kCisgICAgICAgICAqIHJlcXVlc3RlciBjb250ZXh0CisgICAgICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgdXNlZCBieSByZXF1ZXN0ZXIsIHNlbGVjdGVkIGJ5IHBvbGljeSBtaXggcnVsZXMgb3IgZW5naW5lCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uIHJlcXVlc3RlciBzZXNzaW9uIGlkCisgICAgICAgICAqIEBwYXJhbSB1aWQgcmVxdWVzdGVyIHVpZAorICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyByZXF1ZXN0ZXIgYXVkaW8gYXR0cmlidXRlcyAoZS5nLiBpbnB1dCBzb3VyY2UgYW5kIHRhZ3MgbWF0dGVyKQorICAgICAgICAgKiBAcGFyYW0gY29uZmlnIHJlcXVlc3RlciBhdWRpbyBjb25maWd1cmF0aW9uIChlLmcuIHNhbXBsZSByYXRlLCBmb3JtYXQsIGNoYW5uZWwgbWFzaykuCisgICAgICAgICAqIEBwYXJhbSBmbGFncyByZXF1ZXN0ZXIgaW5wdXQgZmxhZ3MKKyAgICAgICAgICogQHBhcmFtIHBvbGljeU1peCBtYXkgYmUgbnVsbCwgcG9saWN5IHJ1bGVzIHRvIGJlIGZvbGxvd2VkIGJ5IHRoZSByZXF1ZXN0ZXIKKyAgICAgICAgICogQHJldHVybiBpbnB1dCBpbyBoYW5kbGUgYWthIHVuaXF1ZSBpbnB1dCBpZGVudGlmaWVyIHNlbGVjdGVkIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0Rm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICBBdWRpb01peCAqcG9saWN5TWl4KTsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BvbGljeU1peD4gJnBvbGljeU1peCk7CiAKLSAgICAgICAgLy8gaW50ZXJuYWwgZnVuY3Rpb24gdG8gZGVyaXZlIGEgc3RyZWFtIHR5cGUgdmFsdWUgZnJvbSBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7CiAgICAgICAgIC8vIGV2ZW50IGlzIG9uZSBvZiBTVEFSVElOR19PVVRQVVQsIFNUQVJUSU5HX0JFQUNPTiwgU1RPUFBJTkdfT1VUUFVULCBTVE9QUElOR19CRUFDT04KICAgICAgICAgLy8gcmV0dXJucyAwIGlmIG5vIG11dGUvdW5tdXRlIGV2ZW50IGhhcHBlbmVkLCB0aGUgbGFyZ2VzdCBsYXRlbmN5IG9mIHRoZSBkZXZpY2Ugd2hlcmUKICAgICAgICAgLy8gICB0aGUgbXV0ZS91bm11dGUgaGFwcGVuZWQKQEAgLTY2OSwyNSArODQzLDI5IEBACiAgICAgICAgIHVpbnQzMl90IHNldEJlYWNvbk11dGUoYm9vbCBtdXRlKTsKICAgICAgICAgYm9vbCAgICAgaXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpOwogCi0gICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlIGFuZCByZXR1cm4gYXNzb2NpYXRlZCBwb2xpY3kKLSAgICAgICAgLy8gbWl4IGlmIGFueS4gQ2FsbHMgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKS4KLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCA9IE5VTEwpOwotCiAgICAgICAgIC8vIENhbGxlZCBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKS4KLSAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgICAgICB2b2lkIHVwZGF0ZU1vbm8oYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSB7CiAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0KSwgKGludCltTWFzdGVyTW9ubyk7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKCk7Ci0gICAgICAgIGJvb2wgbVNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmU7Ci0gICAgICAgIGJvb2wgbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZTsKKyAgICAgICAgc3RhdHVzX3QgaW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UgKmlvRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKyAgICAgICAgc3RhdHVzX3QgaW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiAqcGF0Y2hEZXNjUHRyKTsKIH07CiAKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKaW5kZXggYjA2NGY4Yy4uNTc0ODMzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApAQCAtMTU1LDE3ICsxNTUsNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdGFydFRvbmUodG9uZSwgc3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RvcFRvbmUoKQotewotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKIHsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7CkBAIC0yMjAsMTIgKzIwOSwyMyBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwLCBmbGFncyk7CiB9CiAKIGF1ZGlvX3VuaXF1ZV9pZF90IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAppbmRleCA0YTFjYWI0Li40OTQ3NzE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNDb25maWcuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTMxLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMxNyw2ICszMTcsMjAxIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjphZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgaWYgKHV1aWQgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogTnVsbCB1dWlkIG9yIHR5cGUgdXVpZCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gSE9UV09SRCwgRk1fVFVORVIgYW5kIEVDSE9fUkVGRVJFTkNFIGFyZSBzcGVjaWFsIGNhc2Ugc291cmNlcyA+IE1BWC4KKyAgICBpZiAoc291cmNlIDwgQVVESU9fU09VUkNFX0RFRkFVTFQgfHwKKyAgICAgICAgICAgIChzb3VyY2UgPiBBVURJT19TT1VSQ0VfTUFYICYmCisgICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCisgICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUiAmJgorICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IFVuc3VwcG9ydGVkIHNvdXJjZSB0eXBlICVkIiwgc291cmNlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHx1dWlkfCBvciB8dHlwZXwgY29ycmVzcG9uZHMgdG8gYW4gZWZmZWN0IG9uIHRoZSBzeXN0ZW0uCisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjcmlwdG9yID0ge307CisgICAgc3RhdHVzX3QgcmVzID0gQXVkaW9FZmZlY3Q6OmdldEVmZmVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICB1dWlkLCB0eXBlLCBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DLCAmZGVzY3JpcHRvcik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBGYWlsZWQgdG8gZmluZCBlZmZlY3QgZGVzY3JpcHRvciBtYXRjaGluZyB1dWlkL3R5cGUuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gT25seSBwcmUtcHJvY2Vzc2luZyBlZmZlY3RzIGNhbiBiZSBhZGRlZCBkeW5hbWljYWxseSBhcyBzb3VyY2UgZGVmYXVsdHMuCisgICAgaWYgKChkZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IERlc2lyZWQgZWZmZWN0IGNhbm5vdCBiZSBhdHRhY2hlZCAiCisgICAgICAgICAgICAgICJhcyBhIHNvdXJjZSBkZWZhdWx0IGVmZmVjdC4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gRmluZCB0aGUgRWZmZWN0RGVzY1ZlY3RvciBmb3IgdGhlIGdpdmVuIHNvdXJjZSB0eXBlLCBvciBjcmVhdGUgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS4KKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0U291cmNlcy5pbmRleE9mS2V5KHNvdXJjZSk7CisgICAgRWZmZWN0RGVzY1ZlY3RvciAqZGVzYyA9IE5VTEw7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAvLyBObyBlZmZlY3RzIGZvciB0aGlzIHNvdXJjZSB0eXBlIHlldC4KKyAgICAgICAgZGVzYyA9IG5ldyBFZmZlY3REZXNjVmVjdG9yKCk7CisgICAgICAgIG1JbnB1dFNvdXJjZXMuYWRkKHNvdXJjZSwgZGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzYyA9IG1JbnB1dFNvdXJjZXMudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbmV3IGVmZmVjdCBhbmQgYWRkIGl0IHRvIHRoZSB2ZWN0b3IuCisgICAgcmVzID0gQXVkaW9FZmZlY3Q6Om5ld0VmZmVjdFVuaXF1ZUlkKGlkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IGZhaWxlZCB0byBnZXQgbmV3IHVuaXF1ZSBpZC4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoCisgICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUsICp0eXBlLCBvcFBhY2thZ2VOYW1lLCAqdXVpZCwgcHJpb3JpdHksICppZCk7CisgICAgZGVzYy0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgLy8gVE9ETyhiLzcxODEzNjk3KTogU3VwcG9ydCBzZXR0aW5nIHBhcmFtcyBhcyB3ZWxsLgorCisgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmV0cm9hY3RpdmVseSBhdHRhY2ggdG8gYW55IGV4aXN0aW5nIHNvdXJjZXMgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgLy8gVGhpcyByZXF1aXJlcyB0cmFja2luZyB0aGUgc291cmNlIHR5cGUgb2YgZWFjaCBzZXNzaW9uIGlkIGluIGFkZGl0aW9uIHRvIHdoYXQgaXMKKyAgICAvLyBhbHJlYWR5IGJlaW5nIHRyYWNrZWQuCisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6YWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBpZiAodXVpZCA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBOdWxsIHV1aWQgb3IgdHlwZSB1dWlkIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZShhdHRyaWJ1dGVzX2luaXRpYWxpemVyKHVzYWdlKSk7CisKKyAgICBpZiAoc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW0pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgfHV1aWR8IG9yIHx0eXBlfCBjb3JyZXNwb25kcyB0byBhbiBlZmZlY3Qgb24gdGhlIHN5c3RlbS4KKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IgPSB7fTsKKyAgICBzdGF0dXNfdCByZXMgPSBBdWRpb0VmZmVjdDo6Z2V0RWZmZWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIHV1aWQsIHR5cGUsIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJULCAmZGVzY3JpcHRvcik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBGYWlsZWQgdG8gZmluZCBlZmZlY3QgZGVzY3JpcHRvciBtYXRjaGluZyB1dWlkL3R5cGUuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gT25seSBpbnNlcnQgZWZmZWN0cyBjYW4gYmUgYWRkZWQgZHluYW1pY2FsbHkgYXMgc3RyZWFtIGRlZmF1bHRzLgorICAgIGlmICgoZGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQpIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogRGVzaXJlZCBlZmZlY3QgY2Fubm90IGJlIGF0dGFjaGVkICIKKyAgICAgICAgICAgICAgImFzIGEgc3RyZWFtIGRlZmF1bHQgZWZmZWN0LiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBGaW5kIHRoZSBFZmZlY3REZXNjVmVjdG9yIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUsIG9yIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5LgorICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbSk7CisgICAgRWZmZWN0RGVzY1ZlY3RvciAqZGVzYyA9IE5VTEw7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAvLyBObyBlZmZlY3RzIGZvciB0aGlzIHN0cmVhbSB0eXBlIHlldC4KKyAgICAgICAgZGVzYyA9IG5ldyBFZmZlY3REZXNjVmVjdG9yKCk7CisgICAgICAgIG1PdXRwdXRTdHJlYW1zLmFkZChzdHJlYW0sIGRlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2MgPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZWZmZWN0IGFuZCBhZGQgaXQgdG8gdGhlIHZlY3Rvci4KKyAgICByZXMgPSBBdWRpb0VmZmVjdDo6bmV3RWZmZWN0VW5pcXVlSWQoaWQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogZmFpbGVkIHRvIGdldCBuZXcgdW5pcXVlIGlkLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBFZmZlY3REZXNjICplZmZlY3QgPSBuZXcgRWZmZWN0RGVzYygKKyAgICAgICAgICAgIGRlc2NyaXB0b3IubmFtZSwgKnR5cGUsIG9wUGFja2FnZU5hbWUsICp1dWlkLCBwcmlvcml0eSwgKmlkKTsKKyAgICBkZXNjLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKKyAgICAvLyBUT0RPKGIvNzE4MTM2OTcpOiBTdXBwb3J0IHNldHRpbmcgcGFyYW1zIGFzIHdlbGwuCisKKyAgICAvLyBUT0RPKGIvNzE4MTQzMDApOiBSZXRyb2FjdGl2ZWx5IGF0dGFjaCB0byBhbnkgZXhpc3Rpbmcgc3RyZWFtcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAvLyBUaGlzIHJlcXVpcmVzIHRyYWNraW5nIHRoZSBzdHJlYW0gdHlwZSBvZiBlYWNoIHNlc3Npb24gaWQgaW4gYWRkaXRpb24gdG8gd2hhdCBpcworICAgIC8vIGFscmVhZHkgYmVpbmcgdHJhY2tlZC4KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIGlmIChpZCA9PSBBVURJT19VTklRVUVfSURfQUxMT0NBVEUpIHsKKyAgICAgICAgLy8gQUxMT0NBVEUgaXMgbm90IGEgdW5pcXVlIGlkZW50aWZpZXIsIGJ1dCByYXRoZXIgYSByZXNlcnZlZCB2YWx1ZSBpbmRpY2F0aW5nCisgICAgICAgIC8vIGEgcmVhbCBpZCBoYXMgbm90IGJlZW4gYXNzaWduZWQuIEZvciBkZWZhdWx0IGVmZmVjdHMsIHRoaXMgdmFsdWUgaXMgb25seSB1c2VkCisgICAgICAgIC8vIGJ5IHN5c3RlbS1vd25lZCBkZWZhdWx0cyBmcm9tIHRoZSBsb2FkZWQgY29uZmlnLCB3aGljaCBjYW5ub3QgYmUgcmVtb3ZlZC4KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gQ2hlY2sgZWFjaCBzb3VyY2UgdHlwZS4KKyAgICBzaXplX3QgbnVtU291cmNlcyA9IG1JbnB1dFNvdXJjZXMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU291cmNlczsgKytpKSB7CisgICAgICAgIC8vIENoZWNrIGVhY2ggZWZmZWN0IGZvciBlYWNoIHNvdXJjZS4KKyAgICAgICAgRWZmZWN0RGVzY1ZlY3RvciogZGVzY1ZlY3RvciA9IG1JbnB1dFNvdXJjZXNbaV07CisgICAgICAgIGZvciAoYXV0byBkZXNjID0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuYmVnaW4oKTsgZGVzYyAhPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lbmQoKTsgKytkZXNjKSB7CisgICAgICAgICAgICBpZiAoKCpkZXNjKS0+bUlkID09IGlkKSB7CisgICAgICAgICAgICAgICAgLy8gRm91bmQgaXQhCisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmVtb3ZlIGZyb20gYW55IHNvdXJjZXMgdGhlIGVmZmVjdCB3YXMgYXR0YWNoZWQgdG8uCisgICAgICAgICAgICAgICAgZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZXJhc2UoZGVzYyk7CisgICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBhcmUgdW5pcXVlOyB0aGVyZSBjYW4gb25seSBiZSBvbmUgbWF0Y2gsIHNvIHJldHVybiBlYXJseS4KKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFZmZlY3Qgd2Fzbid0IGZvdW5kLCBzbyBpdCdzIGJlZW4gdHJpdmlhbGx5IHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIGlmIChpZCA9PSBBVURJT19VTklRVUVfSURfQUxMT0NBVEUpIHsKKyAgICAgICAgLy8gQUxMT0NBVEUgaXMgbm90IGEgdW5pcXVlIGlkZW50aWZpZXIsIGJ1dCByYXRoZXIgYSByZXNlcnZlZCB2YWx1ZSBpbmRpY2F0aW5nCisgICAgICAgIC8vIGEgcmVhbCBpZCBoYXMgbm90IGJlZW4gYXNzaWduZWQuIEZvciBkZWZhdWx0IGVmZmVjdHMsIHRoaXMgdmFsdWUgaXMgb25seSB1c2VkCisgICAgICAgIC8vIGJ5IHN5c3RlbS1vd25lZCBkZWZhdWx0cyBmcm9tIHRoZSBsb2FkZWQgY29uZmlnLCB3aGljaCBjYW5ub3QgYmUgcmVtb3ZlZC4KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gQ2hlY2sgZWFjaCBzdHJlYW0gdHlwZS4KKyAgICBzaXplX3QgbnVtU3RyZWFtcyA9IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN0cmVhbXM7ICsraSkgeworICAgICAgICAvLyBDaGVjayBlYWNoIGVmZmVjdCBmb3IgZWFjaCBzdHJlYW0uCisgICAgICAgIEVmZmVjdERlc2NWZWN0b3IqIGRlc2NWZWN0b3IgPSBtT3V0cHV0U3RyZWFtc1tpXTsKKyAgICAgICAgZm9yIChhdXRvIGRlc2MgPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5iZWdpbigpOyBkZXNjICE9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVuZCgpOyArK2Rlc2MpIHsKKyAgICAgICAgICAgIGlmICgoKmRlc2MpLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3VuZCBpdCEKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvNzE4MTQzMDApOiBSZW1vdmUgZnJvbSBhbnkgc3RyZWFtcyB0aGUgZWZmZWN0IHdhcyBhdHRhY2hlZCB0by4KKyAgICAgICAgICAgICAgICBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lcmFzZShkZXNjKTsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGVzIGFyZSB1bmlxdWU7IHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBtYXRjaCwgc28gcmV0dXJuIGVhcmx5LgorICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVmZmVjdCB3YXNuJ3QgZm91bmQsIHNvIGl0J3MgYmVlbiB0cml2aWFsbHkgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQogCiB2b2lkIEF1ZGlvUG9saWN5RWZmZWN0czo6RWZmZWN0VmVjdG9yOjpzZXRQcm9jZXNzb3JFbmFibGVkKGJvb2wgZW5hYmxlZCkKIHsKQEAgLTMzOCw3ICs1MzMsOCBAQAogICAgIENBTUNPUkRFUl9TUkNfVEFHLAogICAgIFZPSUNFX1JFQ19TUkNfVEFHLAogICAgIFZPSUNFX0NPTU1fU1JDX1RBRywKLSAgICBVTlBST0NFU1NFRF9TUkNfVEFHCisgICAgVU5QUk9DRVNTRURfU1JDX1RBRywKKyAgICBWT0lDRV9QRVJGT1JNQU5DRV9TUkNfVEFHCiB9OwogCiAvLyByZXR1cm5zIHRoZSBhdWRpb19zb3VyY2VfdCBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IHNvdXJjZSBuYW1lIG9yCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAppbmRleCA2MjMxODBlLi42YWQwMWY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKQEAgLTY0LDcgKzY0LDYgQEAKICAgICBzdGF0dXNfdCByZWxlYXNlSW5wdXRFZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbik7CiAKLQogICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZWZmZWN0IGRlc2NyaXB0b3JzIGZvciBkZWZhdWx0IG91dHB1dCBlZmZlY3RzCiAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGF1ZGlvU2Vzc2lvbgogICAgIHN0YXR1c190IHF1ZXJ5RGVmYXVsdE91dHB1dFNlc3Npb25FZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCkBAIC04MiwxOCArODEsNjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pOwogCisgICAgLy8gQWRkIHRoZSBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBlZmZlY3RzIGZvciBzb3VyY2VzIG9mIHR5cGUgfHNvdXJjZXwuCisgICAgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvLyBBZGQgdGhlIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IGVmZmVjdHMgZm9yIHN0cmVhbXMgb2YgYSBnaXZlbiB1c2FnZS4KKyAgICBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGRlZmF1bHQgc291cmNlIGVmZmVjdCBmcm9tIHdoZXJldmVyIGl0J3MgYXR0YWNoZWQuCisgICAgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGRlZmF1bHQgc3RyZWFtIGVmZmVjdCBmcm9tIHdoZXJldmVyIGl0J3MgYXR0YWNoZWQuCisgICAgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKIHByaXZhdGU6CiAKICAgICAvLyBjbGFzcyB0byBzdG9yZSB0aGUgZGVzY3JpcHRpb24gb2YgYW4gZWZmZWN0cyBhbmQgaXRzIHBhcmFtZXRlcnMKICAgICAvLyBhcyBkZWZpbmVkIGluIGF1ZGlvX2VmZmVjdHMuY29uZgogICAgIGNsYXNzIEVmZmVjdERlc2MgewogICAgIHB1YmxpYzoKLSAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkKSA6CisgICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90JiB0eXBlVXVpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZShzdHJkdXAobmFtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQodXVpZCkgeyB9CisgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZVV1aWQodHlwZVV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVXVpZCh1dWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcmlvcml0eShwcmlvcml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICBtSWQoaWQpIHsgfQorICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdERlc2MobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkVGRkVDVF9VVUlEX05VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFKSB7IH0KICAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBFZmZlY3REZXNjJiBvcmlnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZShzdHJkdXAob3JpZy5tTmFtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQob3JpZy5tVXVpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGVVdWlkKG9yaWcubVR5cGVVdWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lKG9yaWcubU9wUGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQob3JpZy5tVXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtUHJpb3JpdHkob3JpZy5tUHJpb3JpdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlkKG9yaWcubUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVlcCBjb3B5IG1QYXJhbXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG9yaWcubVBhcmFtcy5zaXplKCk7IGsrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqb3JpZ1BhcmFtID0gb3JpZy5tUGFyYW1zW2tdOwpAQCAtMTE2LDcgKzE1NywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGNoYXIgKm1OYW1lOworICAgICAgICBlZmZlY3RfdXVpZF90IG1UeXBlVXVpZDsKKyAgICAgICAgU3RyaW5nMTYgbU9wUGFja2FnZU5hbWU7CiAgICAgICAgIGVmZmVjdF91dWlkX3QgbVV1aWQ7CisgICAgICAgIGludDMyX3QgbVByaW9yaXR5OworICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBtSWQ7CiAgICAgICAgIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4gbVBhcmFtczsKICAgICB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKaW5kZXggNzMzN2YwNC4uYTY3MjUyMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApAQCAtMTcsMTIgKzE3LDExIEBACiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5SW50ZWZhY2VJbXBsIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+Ci0KICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzIsNyArMzEsOCBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogfQogCiBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCkBAIC02Niw3ICs2Niw4IEBACiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTc5LDcgKzgwLDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQpAQCAtMTY1LDcgKzE2Niw3IEBACiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dChzdHJlYW0pOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqb3JpZ2luYWxBdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLApAQCAtMTc0LDcgKzE3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xODMsMTYgKzE4NSwyMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSB8fCB1aWQgPT0gKHVpZF90KS0xKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSB8fCB1aWQgPT0gKHVpZF90KS0xKSB7CiAgICAgICAgIEFMT0dXX0lGKHVpZCAhPSAodWlkX3QpLTEgJiYgdWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIHVpZCk7CiAgICAgICAgIHVpZCA9IGNhbGxpbmdVaWQ7CiAgICAgfQorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0gKm9yaWdpbmFsQXR0cjsKKyAgICBpZiAoIW1QYWNrYWdlTWFuYWdlci5hbGxvd1BsYXliYWNrQ2FwdHVyZSh1aWQpKSB7CisgICAgICAgIGF0dHIuZmxhZ3MgfD0gQVVESU9fRkxBR19OT19DQVBUVVJFOworICAgIH0KICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvcmlnaW5hbEZsYWdzID0gZmxhZ3M7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsCisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cigmYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMpOwogCiAgICAgLy8gRklYTUU6IEludHJvZHVjZSBhIHdheSB0byBjaGVjayBmb3IgdGhlIHRoZSB0ZWxlcGhvbnkgZGV2aWNlIGJlZm9yZSBvcGVuaW5nIHRoZSBvdXRwdXQKICAgICBpZiAoKHJlc3VsdCA9PSBOT19FUlJPUikgJiYKQEAgLTIwMCwxMDEgKzIwNywxMjUgQEAKICAgICAgICAgIW1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZCwgdWlkKSkgewogICAgICAgICAvLyBJZiB0aGUgYXBwIHRyaWVzIHRvIHBsYXkgbXVzaWMgdGhyb3VnaCB0aGUgdGVsZXBob255IGRldmljZSBhbmQgZG9lc24ndCBoYXZlIHBlcm1pc3Npb24KICAgICAgICAgLy8gdGhlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IG91dHB1dCBkZXZpY2UuCi0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQoKm91dHB1dCwgKnN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQoKnBvcnRJZCk7CiAgICAgICAgIGZsYWdzID0gb3JpZ2luYWxGbGFnczsKICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CisgICAgICAgIHNlY29uZGFyeU91dHB1dHMtPmNsZWFyKCk7CisgICAgICAgIHJlc3VsdCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoJmF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIHNwIDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgbmV3IEF1ZGlvUGxheWJhY2tDbGllbnQoYXR0ciwgKm91dHB1dCwgdWlkLCBwaWQsIHNlc3Npb24sICpzZWxlY3RlZERldmljZUlkLCAqc3RyZWFtKTsKKyAgICAgICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzLmFkZCgqcG9ydElkLCBjbGllbnQpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIik7CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50OwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIEF1ZGlvVHJhY2sgY2xpZW50IG5vdCBmb3VuZCBmb3IgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBzdHJlYW0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoCisgICAgICAgICAgICBjbGllbnQtPmlvLCBjbGllbnQtPnN0cmVhbSwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgfQogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChwb3J0SWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOwotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKHBvcnRJZCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoImRvU3RvcE91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBBTE9HVigiZG9TdG9wT3V0cHV0Iik7CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50OwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtQXVkaW9QbGF5YmFja0NsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgQXVkaW9UcmFjayBjbGllbnQgbm90IGZvdW5kIGZvciBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIHN0cmVhbQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKAorICAgICAgICAgICAgY2xpZW50LT5pbywgY2xpZW50LT5zdHJlYW0sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgfQogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQocG9ydElkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSIpOwotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKHBvcnRJZCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBBdWRpb1RyYWNrIGNsaWVudCBub3QgZm91bmQgZm9yIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQgPSBtQXVkaW9QbGF5YmFja0NsaWVudHMudmFsdWVBdChpbmRleCk7CisgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5yZW1vdmVJdGVtKHBvcnRJZCk7CisKICAgICAvLyBjYWxsZWQgZnJvbSBpbnRlcm5hbCB0aHJlYWQ6IG5vIG5lZWQgdG8gY2xlYXIgY2FsbGVyIGlkZW50aXR5Ci0gICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCkBAIC0zMTMsMTQgKzM0NCwxNyBAQAogICAgIH0KIAogICAgIC8vIGFscmVhZHkgY2hlY2tlZCBieSBjbGllbnQsIGJ1dCBkb3VibGUtY2hlY2sgaW4gY2FzZSB0aGUgY2xpZW50IHdyYXBwZXIgaXMgYnlwYXNzZWQKLSAgICBpZiAoYXR0ci0+c291cmNlIDwgQVVESU9fU09VUkNFX0RFRkFVTFQgJiYgYXR0ci0+c291cmNlID49IEFVRElPX1NPVVJDRV9DTlQgJiYKLSAgICAgICAgICAgIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJiBhdHRyLT5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSB7CisgICAgaWYgKChhdHRyLT5zb3VyY2UgPCBBVURJT19TT1VSQ0VfREVGQVVMVCkKKyAgICAgICAgICAgIHx8IChhdHRyLT5zb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVAorICAgICAgICAgICAgICAgICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRAorICAgICAgICAgICAgICAgICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIKKyAgICAgICAgICAgICAgICAmJiBhdHRyLT5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGJvb2wgdXBkYXRlUGlkID0gKHBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKHVpZCAhPSAodWlkX3QpLTEgJiYgdWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIHVpZCk7CiAgICAgICAgIHVpZCA9IGNhbGxpbmdVaWQ7CkBAIC0zNDQsNyArMzc4LDggQEAKIAogICAgIGlmICgoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksgfHwKICAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSyB8fAotICAgICAgICBhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NBTEwpICYmCisgICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCB8fAorICAgICAgICBhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSAmJgogICAgICAgICAhY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWQsIHVpZCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KQEAgLTM3Miw2ICs0MDcsOSBAQAogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAvLyBlbmZvcmNlIHBlcm1pc3Npb24gKGlmIGFueSkgcmVxdWlyZWQgZm9yIGVhY2ggdHlwZSBvZiBpbnB1dAogICAgICAgICAgICAgc3dpdGNoIChpbnB1dFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9NSVhfUFVCTElDX0NBUFRVUkVfUExBWUJBQ0s6CisgICAgICAgICAgICAgICAgLy8gdGhpcyB1c2UgY2FzZSBoYXMgYmVlbiB2YWxpZGF0ZWQgaW4gYXVkaW8gc2VydmljZSB3aXRoIGEgTWVkaWFQcm9qZWN0aW9uIHRva2VuLAorICAgICAgICAgICAgICAgIC8vIGFuZCBkb2Vzbid0IHJlbHkgb24gcmVndWxhciBwZXJtaXNzaW9ucwogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0xFR0FDWToKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9URUxFUEhPTllfUlg6CkBAIC0zOTgsMTcgKzQzNiwxMyBAQAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBFUk1JU1NJT05fREVOSUVEKSB7CiAgICAgICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoKnBvcnRJZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKLSAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICAgICAgbmV3IEF1ZGlvUmVjb3JkQ2xpZW50KCphdHRyLCAqaW5wdXQsIHVpZCwgcGlkLCBvcFBhY2thZ2VOYW1lLCBzZXNzaW9uKTsKLSAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgY2xpZW50LT5pc0NvbmN1cnJlbnQgPSBmYWxzZTsKLSAgICAgICAgY2xpZW50LT5pc1ZpcnR1YWxEZXZpY2UgPSBmYWxzZTsgLy9UT0RPIDogdXBkYXRlIGZyb20gQVBNLT5nZXRJbnB1dEZvckF0dHIoKQotICAgICAgICBjbGllbnQtPmRldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPSBuZXcgQXVkaW9SZWNvcmRDbGllbnQoKmF0dHIsICppbnB1dCwgdWlkLCBwaWQsIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQsIG9wUGFja2FnZU5hbWUpOwogICAgICAgICBtQXVkaW9SZWNvcmRDbGllbnRzLmFkZCgqcG9ydElkLCBjbGllbnQpOwogICAgIH0KIApAQCAtNDIyLDQ4ICs0NTYsMTcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8vIHRoaXMgaXMgcmVwbGljYXRlZCBmcm9tIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCi0vLyBYWFggLS0gZmlndXJlIG91dCBob3cgdG8gcHV0IGl0IGludG8gYSBjb21tb24sIHNoYXJlZCBsb2NhdGlvbgotCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Tb3VyY2VTdHJpbmcoYXVkaW9fc291cmNlX3QgdmFsdWUpIHsKLSAgICBzdGQ6OnN0cmluZyBzb3VyY2U7Ci0gICAgaWYgKFNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBzb3VyY2UpKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfQotICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKLSAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIHJhd2J1ZmZlcjsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvQ29uY3VycmVuY3lTdHJpbmcoCi0gICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgY29uY3VycmVuY3kpCi17Ci0gICAgY2hhciBidWZmZXJbNjRdOyAvLyBvdmVyc2l6ZWQKLSAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMlcyVzJXMiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMKT8gIixjYWxsIjoiIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSk/ICIsY2FwdHVyZSI6IiIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQpPyAiLGhvdHdvcmQiOiIiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUKT8gIixwcmVlbXB0IjoiIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIixub25lIik7Ci0gICAgfQotCi0gICAgcmV0dXJuICZidWZmZXJbMV07Ci19Ci0KIHN0ZDo6c3RyaW5nIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewotICAgIHN0ZDo6c3RyaW5nIHR5cGVTdHI7CiAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OwogICAgIHBvcnQuaWQgPSBwb3J0SWQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0QXVkaW9Qb3J0KCZwb3J0KTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHBvcnQudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIGRldmljZVRvU3RyaW5nKHBvcnQuZXh0LmRldmljZS50eXBlLCB0eXBlU3RyKTsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKHBvcnQuZXh0LmRldmljZS50eXBlKTsKICAgICB9Ci0gICAgcmV0dXJuIHR5cGVTdHI7CisgICAgcmV0dXJuIHt9OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGJvb2wgKnNpbGVuY2VkKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00ODYsMTggKzQ4OSwxNiBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgLy8gSWYgVUlEIGluYWN0aXZlIGl0IHJlY29yZHMgc2lsZW5jZSB1bnRpbCBiZWNvbWluZyBhY3RpdmUKLSAgICAqc2lsZW5jZWQgPSAhbVVpZFBvbGljeS0+aXNVaWRBY3RpdmUoY2xpZW50LT51aWQpICYmICFjbGllbnQtPmlzVmlydHVhbERldmljZTsKLQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCBjb25jdXJyZW5jeSA9Ci0gICAgICAgICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkU7CisKKyAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CisgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIHsKICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dCgKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uLCAqc2lsZW5jZWQsICZjb25jdXJyZW5jeSk7CisgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0SW5wdXQocG9ydElkKTsKIAogICAgIH0KIApAQCAtNTA2LDcgKzUwNyw2IEBACiAKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVtdID0gImF1ZGlvcG9saWN5IjsKIAotICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UmVhc29uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5yZWFzb24iOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5U3RhdHVzW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5zdGF0dXMiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UnFzdFNyY1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zcmMiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UnFzdFBrZ1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5wa2ciOwpAQCAtNTIwLDY0ICs1MjAsNTIgQEAKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeUFjdGl2ZURldmljZVtdID0KICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUuZGV2aWNlIjsKIAotICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtBdWRpb1BvbGljeSk7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtBdWRpb1BvbGljeSk7CiAgICAgICAgIGlmIChpdGVtICE9IE5VTEwpIHsKIAotICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lSZWFzb24sIGF1ZGlvQ29uY3VycmVuY3lTdHJpbmcoY29uY3VycmVuY3kpLmNfc3RyKCkpOwogICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5U3RhdHVzLCBzdGF0dXMpOwogCiAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlU3RyaW5nKGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOwotICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhTdHJpbmc4KGNsaWVudC0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeVJxc3RTZXNzaW9uLCBjbGllbnQtPnNlc3Npb24pOwotCisgICAgICAgICAgICBpZiAoY2xpZW50LT5vcFBhY2thZ2VOYW1lLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLCBzdGQ6OnRvX3N0cmluZyhjbGllbnQtPnVpZCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICBrQXVkaW9Qb2xpY3lScXN0RGV2aWNlLCBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGNsaWVudC0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogCi0gICAgICAgICAgICAvLyBmaWd1cmUgb3V0IHdobyBpcyBhY3RpdmUKLSAgICAgICAgICAgIC8vIE5COiBtaWdodCB0aGUgb3RoZXIgcGFydHkgaGF2ZSBnaXZlbiB1cCB0aGUgbWljcm9waG9uZSBzaW5jZSB0aGVuPyBob3cgc3VyZS4KLSAgICAgICAgICAgIC8vIHBlcmhhcHMgY291bGQgaGF2ZSBnaXZlbiB1cCBvbiBpdC4KLSAgICAgICAgICAgIC8vIHdlIGhvbGQgbUxvY2ssIHNvIHBlcmhhcHMgd2UncmUgc2FmZSBmb3IgdGhpcyBsb29waW5nCi0gICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgIT0gQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBtQXVkaW9SZWNvcmRDbGllbnRzLmtleUF0KGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gb3RoZXIgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci0+YWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGUgbGFzdCBvZiB0aGUgY2xpZW50cyBtYXJrZWQgYWN0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudCA7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwb3J0SWQgPT0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5rZXlBdChpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IG90aGVyID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChvdGhlci0+YWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIHRoZSBsYXN0IG9mIHRoZSBjbGllbnRzIG1hcmtlZCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbiwgb3RoZXItPnNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXItPm9wUGFja2FnZU5hbWUuc2l6ZSgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlUGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeUFjdGl2ZVNlc3Npb24sIG90aGVyLT5zZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKG90aGVyLT5kZXZpY2VJZCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcob3RoZXItPnVpZCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChvdGhlci0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGl0ZW0tPnNlbGZyZWNvcmQoKTsKICAgICAgICAgICAgIGRlbGV0ZSBpdGVtOwogICAgICAgICAgICAgaXRlbSA9IE5VTEw7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY29uY3VycmVuY3kgJiB+QXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0SW5wdXQoKTogaW52YWxpZCBjb25jdXJyZW5jeSB0eXBlICVkIiwgKGludCljb25jdXJyZW5jeSk7Ci0KLSAgICAgICAgLy8gZW5mb3JjZSBwZXJtaXNzaW9uIChpZiBhbnkpIHJlcXVpcmVkIGZvciBlYWNoIHR5cGUgb2YgY29uY3VycmVuY3kKLSAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMKSB7Ci0gICAgICAgICAgICAvL1RPRE86IGNoZWNrIGluY2FsbCBjYXB0dXJlIHBlcm1pc3Npb24KLSAgICAgICAgfQotICAgICAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUpIHsKLSAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgY29uY3VycmVudCBjYXB0dXJlIHBlcm1pc3Npb24KLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC0+YWN0aXZlID0gdHJ1ZTsKLSAgICB9IGVsc2UgeworICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgICAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gMDsKKyAgICAgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKICAgICAgICAgZmluaXNoUmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT51aWQpOwogICAgIH0KIApAQCAtNTg5LDYgKzU3Nyw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1JlY29yZENsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOwpAQCAtNTk4LDExICs1ODcsMTQgQEAKICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKIAogICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOwogCiAgICAgLy8gZmluaXNoIHRoZSByZWNvcmRpbmcgYXBwIG9wCiAgICAgZmluaXNoUmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT51aWQpOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQocG9ydElkKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKQEAgLTYyMCw2ICs2MTIsMTQgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBjbGllbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSkgeworICAgICAgICAgICAgQUxPR1coIiVzIHJlbGVhc2luZyBhY3RpdmUgY2xpZW50IHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gMDsKKyAgICAgICAgICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CisgICAgICAgIH0KKwogICAgICAgICBtQXVkaW9SZWNvcmRDbGllbnRzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICB9CiAgICAgaWYgKGNsaWVudCA9PSAwKSB7CkBAIC02MjcsMTUgKzYyNywxNSBAQAogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIGlucHV0Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoY2xpZW50LT5pbywgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGNsaWVudC0+aW5wdXQpOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlvKTsKICAgICAgICAgfQogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICB9CiB9CiAKQEAgLTY5NSwxNCArNjk1LDYyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOworfQorCiB1aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewogICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogICAgIH0KKyAgICAvLyBETyBOT1QgTE9DSywgbWF5IGJlIGNhbGxlZCBmcm9tIEF1ZGlvRmxpbmdlciB3aXRoIGxvY2sgaGVsZCwgcmVhY2hpbmcgZGVhZGxvY2sKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwogfQpAQCAtODAzLDI3ICs4NTEsMTAwIEBACiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzU291cmNlQWN0aXZlKHNvdXJjZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0QXVkaW9Qb2xpY3lFZmZlY3RzKHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4mIGF1ZGlvUG9saWN5RWZmZWN0cykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgICpjb3VudCA9IDA7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyA9PSAwKSB7Ci0gICAgICAgICpjb3VudCA9IDA7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KICAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5xdWVyeURlZmF1bHRJbnB1dEVmZmVjdHMoCiAgICAgICAgICAgICAoYXVkaW9fc2Vzc2lvbl90KWF1ZGlvU2Vzc2lvbiwgZGVzY3JpcHRvcnMsIGNvdW50KTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoCisgICAgICAgICAgICB0eXBlLCBvcFBhY2thZ2VOYW1lLCB1dWlkLCBwcmlvcml0eSwgc291cmNlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgKKyAgICAgICAgICAgIHR5cGUsIG9wUGFja2FnZU5hbWUsIHV1aWQsIHByaW9yaXR5LCB1c2FnZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaWQpOworfQorCiBib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKQEAgLTgzNyw2ICs5NTgsMTcgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwogfQogCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIm1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcyk7Cit9CisKKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTk0MCw5ICsxMDcyLDE0IEBACiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworCisgICAgLy8gbG9vcGJhY2t8cmVuZGVyIG9ubHkgbmVlZCBhIE1lZGlhUHJvamVjdGlvbiAoY2hlY2tlZCBpbiBjYWxsZXIgQXVkaW9TZXJ2aWNlLmphdmEpCisgICAgYm9vbCBuZWVkTW9kaWZ5QXVkaW9Sb3V0aW5nID0gc3RkOjphbnlfb2YobWl4ZXMuYmVnaW4oKSwgbWl4ZXMuZW5kKCksIFtdKGF1dG8mIG1peCkgeworICAgICAgICAgICAgcmV0dXJuICFpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC5tUm91dGVGbGFncyk7IH0pOworICAgIGlmIChuZWVkTW9kaWZ5QXVkaW9Sb3V0aW5nICYmICFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtOTU0LDI3ICsxMDkxLDUyIEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSwKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wQXVkaW9Tb3VyY2UocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykKQEAgLTEwMjYsNiArMTE4OCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwgcmVwb3J0ZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUChmb3JtYXRzKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CkBAIC0xMDM2LDQgKzEyMDksNjYgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVVpZFBvbGljeS0+c2V0QXNzaXN0YW50VWlkKHVpZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVVpZFBvbGljeS0+c2V0QTExeVVpZHModWlkcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiJXMsIG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKAorICAgICAgICBjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLCBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGFhLCBwcm9kdWN0U3RyYXRlZ3kpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKGdyb3Vwcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGFhLCB2b2x1bWVHcm91cCk7Cit9CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggZjNjZGRjMy4uOGNiZjNhZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9BY3Rpdml0eU1hbmFnZXIuaD4KQEAgLTM1LDE2ICszNCwxNSBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKICNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CisjaW5jbHVkZSA8c2Vuc29ycHJpdmFjeS9TZW5zb3JQcml2YWN5TWFuYWdlci5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCi0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CkBAIC03MCw4ICs2OCw2IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgICAgIC8vIHN0YXJ0IHRvbmUgcGxheWJhY2sgdGhyZWFkCi0gICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbVRvbmUiKSwgdGhpcyk7CiAgICAgICAgIC8vIHN0YXJ0IGF1ZGlvIGNvbW1hbmRzIHRocmVhZAogICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1BdWRpbyIpLCB0aGlzKTsKICAgICAgICAgLy8gc3RhcnQgb3V0cHV0IGFjdGl2aXR5IGNvbW1hbmQgdGhyZWFkCkBAIC04OSwxMSArODUsMTMgQEAKIAogICAgIG1VaWRQb2xpY3kgPSBuZXcgVWlkUG9saWN5KHRoaXMpOwogICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworCisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kgPSBuZXcgU2Vuc29yUHJpdmFjeVBvbGljeSh0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CiB9CiAKIEF1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCiB7Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZXhpdCgpOwogICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmV4aXQoKTsKICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+ZXhpdCgpOwogCkBAIC0xMDUsNiArMTAzLDkgQEAKIAogICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CiAgICAgbVVpZFBvbGljeS5jbGVhcigpOworCisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kuY2xlYXIoKTsKIH0KIAogLy8gQSBub3RpZmljYXRpb24gY2xpZW50IGlzIGFsd2F5cyByZWdpc3RlcmVkIGJ5IEF1ZGlvU3lzdGVtIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzCkBAIC0xMTgsMTMgKzExOSwxNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogCiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHVpZCkgPCAwKSB7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh0b2tlbikgPCAwKSB7CiAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKLSAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCB1aWQgJWQiLCBjbGllbnQuZ2V0KCksIHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOworICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHVpZCAlZCBwaWQgJWQiLCBjbGllbnQuZ2V0KCksIHVpZCwgcGlkKTsKIAotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodWlkLCBub3RpZmljYXRpb25DbGllbnQpOworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodG9rZW4sIG5vdGlmaWNhdGlvbkNsaWVudCk7CiAKICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KTsKICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOwpAQCAtMTM2LDIyICsxNDEsNDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKIAogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh1aWQpIDwgMCkgeworICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworCisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodG9rZW4pIDwgMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHVpZCktPnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7CisgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IodG9rZW4pLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOworCisgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworCisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodG9rZW4pIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHRva2VuKS0+c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7CiB9CiAKIC8vIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcyBkaWVzLgotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCwgcGlkX3QgcGlkKQogewogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0odWlkKTsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbSh0b2tlbik7CiAgICAgfQogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKKyAgICAgICAgYm9vbCBoYXNTYW1lVWlkID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBoYXNTYW1lVWlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciAmJiAhaGFzU2FtZVVpZCkgewogICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gYmluZGVyIGRlYXRoIG5vdGlmaWNhdGlvbjogbm8gbmVlZCB0byBjbGVhciBjYWxsZXIgaWRlbnRpdHkKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VSZXNvdXJjZXNGb3JVaWQodWlkKTsKICAgICAgICAgfQpAQCAtMTg0LDYgKzIxNCwxOSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncykKK3sKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+Y2hhbmdlQXVkaW9Wb2x1bWVHcm91cENvbW1hbmQoZ3JvdXAsIGZsYWdzKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOworICAgIH0KK30KKwogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKQogewogICAgIEFMT0dWKCJBdWRpb1BvbGljeVNlcnZpY2U6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKCVzLCAlZCkiLApAQCAtMTk5LDIyICsyNDIsMzQgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZChldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgIH0KIH0KIApAQCAtMjM5LDkgKzI5NCwxMCBAQAogCiBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Tm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLSAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KSwKLSAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCkKKyAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1QaWQocGlkKSwgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjbGllbnQpLAorICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpLCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTI1NCw3ICszMTAsNyBAQAogICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4ga2VlcCh0aGlzKTsKICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzZXJ2aWNlLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVVpZCk7CisgICAgICAgIHNlcnZpY2UtPnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChtVWlkLCBtUGlkKTsKICAgICB9CiB9CiAKQEAgLTI3MiwyMiArMzI4LDM2IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQpIHsKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOworICAgIH0KK30KKworCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSgKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtdWx0aXVzZXJfZ2V0X2FwcF9pZChtVWlkKSA8IEFJRF9BUFBfU1RBUlQpIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIGlzU2VydmljZVVpZChtVWlkKSkgewogICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShyZWdJZCwgc3RhdGUpOwogICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewotICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbXVsdGl1c2VyX2dldF9hcHBfaWQobVVpZCkgPCBBSURfQVBQX1NUQVJUKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBpc1NlcnZpY2VVaWQobVVpZCkpIHsKICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgIH0KIH0KIApAQCAtMjk2LDYgKzM2NiwxMCBAQAogICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkID0gZW5hYmxlZDsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZCA9IGVuYWJsZWQ7Cit9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKICAgICBBTE9HVygiYmluZGVyRGllZCgpICVwLCBjYWxsaW5nIHBpZCAlZCIsIHdoby51bnNhZmVfZ2V0KCksCkBAIC0zMjUsMjQgKzM5OSwxODYgQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ29tbWFuZCBUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVG9uZXMgVGhyZWFkOiAlcFxuIiwgbVRvbmVQbGF5YmFja1RocmVhZC5nZXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnVwZGF0ZVVpZFN0YXRlcygpCiB7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgewotICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgc2lsZW5jZWQpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnVwZGF0ZVVpZFN0YXRlc19sKCkKK3sKKy8vICAgIEdvIG92ZXIgYWxsIGFjdGl2ZSBjbGllbnRzIGFuZCBhbGxvdyBjYXB0dXJlIChkb2VzIG5vdCBmb3JjZSBzaWxlbmNlKSBpbiB0aGUKKy8vICAgIGZvbGxvd2luZyBjYXNlczoKKy8vICAgIFRoZSBjbGllbnQgaXMgdGhlIGFzc2lzdGFudAorLy8gICAgICAgIEFORCBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgb24gVE9QCisvLyAgICAgICAgICAgICAgIEFORCB0aGUgc291cmNlIGlzIFZPSUNFX1JFQ09HTklUSU9OIG9yIEhPVFdPUkQKKy8vICAgICAgICBPUiB1c2VzIFZPSUNFX1JFQ09HTklUSU9OIEFORCBpcyBvbiBUT1AgT1IgbGF0ZXN0IHN0YXJ0ZWQKKy8vICAgICAgICAgICAgICAgT1IgdXNlcyBIT1RXT1JECisvLyAgICAgICAgICAgIEFORCB0aGVyZSBpcyBubyBwcml2YWN5IHNlbnNpdGl2ZSBhY3RpdmUgY2FwdHVyZQorLy8gICAgT1IgVGhlIGNsaWVudCBpcyBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKy8vICAgICAgICBBTkQgaXMgb24gVE9QIE9SIGxhdGVzdCBzdGFydGVkCisvLyAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRAorLy8gICAgT1IgdGhlIHNvdXJjZSBpcyBvbmUgb2Y6IEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSywgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSywKKy8vICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMCisvLyAgICBPUiBBbnkgb3RoZXIgY2xpZW50CisvLyAgICAgICAgQU5EIFRoZSBhc3Npc3RhbnQgaXMgbm90IG9uIFRPUAorLy8gICAgICAgIEFORCBpcyBvbiBUT1AgT1IgbGF0ZXN0IHN0YXJ0ZWQKKy8vICAgICAgICBBTkQgdGhlcmUgaXMgbm8gcHJpdmFjeSBzZW5zaXRpdmUgYWN0aXZlIGNhcHR1cmUKKy8vVE9ETzogbWFtYW5hZ2UgcHJlIHByb2Nlc3NpbmcgZWZmZWN0cyBhY2NvcmRpbmcgdG8gdXNlIGNhc2UgcHJpb3JpdHkKKworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiB0b3BBY3RpdmU7CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGxhdGVzdEFjdGl2ZTsKKyAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlOworICAgIG5zZWNzX3QgdG9wU3RhcnROcyA9IDA7CisgICAgbnNlY3NfdCBsYXRlc3RTdGFydE5zID0gMDsKKyAgICBuc2Vjc190IGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnMgPSAwOworICAgIGJvb2wgaXNBMTF5T25Ub3AgPSBtVWlkUG9saWN5LT5pc0ExMXlPblRvcCgpOworICAgIGJvb2wgaXNBc3Npc3RhbnRPblRvcCA9IGZhbHNlOworICAgIGJvb2wgaXNTZW5zaXRpdmVBY3RpdmUgPSBmYWxzZTsKKworICAgIC8vIGlmIFNlbnNvciBQcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBhbGwgcmVjb3JkaW5ncyBzaG91bGQgYmUgc2lsZW5jZWQuCisgICAgaWYgKG1TZW5zb3JQcml2YWN5UG9saWN5LT5pc1NlbnNvclByaXZhY3lFbmFibGVkKCkpIHsKKyAgICAgICAgc2lsZW5jZUFsbFJlY29yZGluZ3NfbCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9MDsgaSA8IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGN1cnJlbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzW2ldOworICAgICAgICBpZiAoIWN1cnJlbnQtPmFjdGl2ZSkgY29udGludWU7CisgICAgICAgIGlmIChpc1ByaXZhY3lTZW5zaXRpdmVTb3VyY2UoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UpKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudC0+c3RhcnRUaW1lTnMgPiBsYXRlc3RTZW5zaXRpdmVTdGFydE5zKSB7CisgICAgICAgICAgICAgICAgbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlID0gY3VycmVudDsKKyAgICAgICAgICAgICAgICBsYXRlc3RTZW5zaXRpdmVTdGFydE5zID0gY3VycmVudC0+c3RhcnRUaW1lTnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc1NlbnNpdGl2ZUFjdGl2ZSA9IHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1VaWRQb2xpY3ktPmdldFVpZFN0YXRlKGN1cnJlbnQtPnVpZCkgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUCkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gdG9wU3RhcnROcykgeworICAgICAgICAgICAgICAgIHRvcEFjdGl2ZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgdG9wU3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1VaWRQb2xpY3ktPmlzQXNzaXN0YW50VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgICAgICBpc0Fzc2lzdGFudE9uVG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudC0+c3RhcnRUaW1lTnMgPiBsYXRlc3RTdGFydE5zKSB7CisgICAgICAgICAgICBsYXRlc3RBY3RpdmUgPSBjdXJyZW50OworICAgICAgICAgICAgbGF0ZXN0U3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRvcEFjdGl2ZSA9PSBudWxscHRyICYmIGxhdGVzdEFjdGl2ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodG9wQWN0aXZlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbGF0ZXN0QWN0aXZlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0wOyBpIDwgbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY3VycmVudCA9IG1BdWRpb1JlY29yZENsaWVudHNbaV07CisgICAgICAgIGlmICghY3VycmVudC0+YWN0aXZlKSBjb250aW51ZTsKKworICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBjdXJyZW50LT5hdHRyaWJ1dGVzLnNvdXJjZTsKKyAgICAgICAgYm9vbCBpc09uVG9wID0gY3VycmVudCA9PSB0b3BBY3RpdmU7CisgICAgICAgIGJvb2wgaXNMYXRlc3QgPSBjdXJyZW50ID09IGxhdGVzdEFjdGl2ZTsKKyAgICAgICAgYm9vbCBpc0xhdGVzdFNlbnNpdGl2ZSA9IGN1cnJlbnQgPT0gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlOworICAgICAgICBib29sIGZvcmNlSWRsZSA9IHRydWU7CisKKyAgICAgICAgaWYgKGlzVmlydHVhbFNvdXJjZShzb3VyY2UpKSB7CisgICAgICAgICAgICBmb3JjZUlkbGUgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgICAgICBpZiAoaXNBMTF5T25Ub3ApIHsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEIHx8IHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yY2VJZGxlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKCgoaXNPblRvcCB8fCBpc0xhdGVzdCkgJiYgc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgfHwKKyAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWlzU2Vuc2l0aXZlQWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlSWRsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtVWlkUG9saWN5LT5pc0ExMXlVaWQoY3VycmVudC0+dWlkKSkgeworICAgICAgICAgICAgaWYgKChpc09uVG9wIHx8IGlzTGF0ZXN0KSAmJgorICAgICAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIHx8IHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkpIHsKKyAgICAgICAgICAgICAgICBmb3JjZUlkbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghaXNBc3Npc3RhbnRPblRvcCAmJiAoaXNPblRvcCB8fCBpc0xhdGVzdCkgJiYKKyAgICAgICAgICAgICAgICAoIWlzU2Vuc2l0aXZlQWN0aXZlIHx8IGlzTGF0ZXN0U2Vuc2l0aXZlKSkgeworICAgICAgICAgICAgICAgIGZvcmNlSWRsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldEFwcFN0YXRlX2woY3VycmVudC0+dWlkLAorICAgICAgICAgICAgICAgICAgICAgIGZvcmNlSWRsZSA/IEFQUF9TVEFURV9JRExFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcG1TdGF0RnJvbUFtU3RhdGUobVVpZFBvbGljeS0+Z2V0VWlkU3RhdGUoY3VycmVudC0+dWlkKSkpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgc2V0QXBwU3RhdGVfbChjdXJyZW50LT51aWQsIEFQUF9TVEFURV9JRExFKTsKKyAgICB9Cit9CisKKy8qIHN0YXRpYyAqLworYXBwX3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphcG1TdGF0RnJvbUFtU3RhdGUoaW50IGFtU3RhdGUpIHsKKyAgICBzd2l0Y2ggKGFtU3RhdGUpIHsKKyAgICBjYXNlIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOgorICAgICAgICByZXR1cm4gQVBQX1NUQVRFX0lETEU7CisgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QOgorICAgICAgICByZXR1cm4gQVBQX1NUQVRFX1RPUDsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEFQUF9TVEFURV9GT1JFR1JPVU5EOworfQorCisvKiBzdGF0aWMgKi8KK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1ByaXZhY3lTZW5zaXRpdmVTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKQoreworICAgIHN3aXRjaCAoc291cmNlKSB7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyogc3RhdGljICovCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNWaXJ0dWFsU291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3sKKyAgICBzd2l0Y2ggKHNvdXJjZSkgeworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEFwcFN0YXRlX2wodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSkKK3sKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworCisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0QXBwU3RhdGUodWlkLCBzdGF0ZSk7CiAgICAgfQogICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmKSB7CisgICAgICAgIGJvb2wgc2lsZW5jZWQgPSBzdGF0ZSA9PSBBUFBfU1RBVEVfSURMRTsKICAgICAgICAgYWYtPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgc2lsZW5jZWQpOwogICAgIH0KIH0KQEAgLTM2MiwxNCArNTk4LDEzIEBACiAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmR1bXAoZmQpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtVG9uZVBsYXliYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmR1bXAoZmQpOwotICAgICAgICB9CiAKICAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmR1bXAoZmQpOwogICAgICAgICB9CiAKKyAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLmR1bXAoZmQpOworCiAgICAgICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC01MDUsNyArNzQwLDggQEAKICAgICBBY3Rpdml0eU1hbmFnZXIgYW07CiAgICAgYW0ucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzLCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9HT05FCiAgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0lETEUKLSAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFLAorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfUFJPQ1NUQVRFLAogICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sCiAgICAgICAgICAgICBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CiAgICAgc3RhdHVzX3QgcmVzID0gYW0ubGlua1RvRGVhdGgodGhpcyk7CkBAIC01MTQsNiArNzUwLDcgQEAKICAgICAgICAgbU9ic2VydmVyUmVnaXN0ZXJlZCA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIlVpZFBvbGljeTo6cmVnaXN0ZXJTZWxmIGxpbmtUb0RlYXRoIGZhaWxlZDogJWQiLCByZXMpOworCiAgICAgICAgIGFtLnVucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzKTsKICAgICB9CiB9CkBAIC01MzIsOCArNzY5LDcgQEAKICAgICBtT2JzZXJ2ZXJSZWdpc3RlcmVkID0gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzVWlkQWN0aXZlKHVpZF90IHVpZCkgewotICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuIHRydWU7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpjaGVja1JlZ2lzdGVyZWQoKSB7CiAgICAgYm9vbCBuZWVkVG9SZXJlZ2lzdGVyID0gZmFsc2U7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNTQzLDEwMyArNzc5LDIxMiBAQAogICAgICAgICAvLyBMb29rcyBsaWtlIEFjdGl2aXR5TWFuYWdlciBoYXMgZGllZCBwcmV2aW91c2x5LCBhdHRlbXB0IHRvIHJlLXJlZ2lzdGVyLgogICAgICAgICByZWdpc3RlclNlbGYoKTsKICAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzVWlkQWN0aXZlKHVpZF90IHVpZCkgeworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuIHRydWU7CisgICAgY2hlY2tSZWdpc3RlcmVkKCk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBhdXRvIG92ZXJyaWRlSXRlciA9IG1PdmVycmlkZVVpZHMuZmluZCh1aWQpOwogICAgICAgICBpZiAob3ZlcnJpZGVJdGVyICE9IG1PdmVycmlkZVVpZHMuZW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBvdmVycmlkZUl0ZXItPnNlY29uZDsKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZUl0ZXItPnNlY29uZC5maXJzdDsKICAgICAgICAgfQogICAgICAgICAvLyBJbiBhbiBhYnNlbnNlIG9mIHRoZSBBY3Rpdml0eU1hbmFnZXIsIGFzc3VtZSBldmVyeXRoaW5nIHRvIGJlIGFjdGl2ZS4KICAgICAgICAgaWYgKCFtT2JzZXJ2ZXJSZWdpc3RlcmVkKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgYXV0byBjYWNoZUl0ZXIgPSBtQ2FjaGVkVWlkcy5maW5kKHVpZCk7CiAgICAgICAgIGlmIChjYWNoZUl0ZXIgIT0gbUNhY2hlZFVpZHMuZW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBjYWNoZUl0ZXItPnNlY29uZDsKKyAgICAgICAgICAgIHJldHVybiBjYWNoZUl0ZXItPnNlY29uZC5maXJzdDsKICAgICAgICAgfQogICAgIH0KICAgICBBY3Rpdml0eU1hbmFnZXIgYW07CiAgICAgYm9vbCBhY3RpdmUgPSBhbS5pc1VpZEFjdGl2ZSh1aWQsIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1DYWNoZWRVaWRzLmluc2VydChzdGQ6OnBhaXI8dWlkX3QsIGJvb2w+KHVpZCwgYWN0aXZlKSk7CisgICAgICAgIG1DYWNoZWRVaWRzLmluc2VydChzdGQ6OnBhaXI8dWlkX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4odWlkLCBzdGQ6OnBhaXI8Ym9vbCwgaW50PihhY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikpKTsKICAgICB9CiAgICAgcmV0dXJuIGFjdGl2ZTsKIH0KIAoraW50IEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpnZXRVaWRTdGF0ZSh1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHsKKyAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1A7CisgICAgfQorICAgIGNoZWNrUmVnaXN0ZXJlZCgpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXV0byBvdmVycmlkZUl0ZXIgPSBtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKTsKKyAgICAgICAgaWYgKG92ZXJyaWRlSXRlciAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAob3ZlcnJpZGVJdGVyLT5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGVJdGVyLT5zZWNvbmQuc2Vjb25kICE9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdmVycmlkZUl0ZXItPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjYWNoZUl0ZXIgPSBtQ2FjaGVkVWlkcy5maW5kKHVpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUl0ZXIgIT0gbUNhY2hlZFVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZUl0ZXItPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgLy8gSW4gYW4gYWJzZW5zZSBvZiB0aGUgQWN0aXZpdHlNYW5hZ2VyLCBhc3N1bWUgZXZlcnl0aGluZyB0byBiZSBhY3RpdmUuCisgICAgICAgIGlmICghbU9ic2VydmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1A7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBjYWNoZUl0ZXIgPSBtQ2FjaGVkVWlkcy5maW5kKHVpZCk7CisgICAgICAgIGlmIChjYWNoZUl0ZXIgIT0gbUNhY2hlZFVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0ZXItPnNlY29uZC5maXJzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZUl0ZXItPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBY3Rpdml0eU1hbmFnZXIgYW07CisgICAgYm9vbCBhY3RpdmUgPSBhbS5pc1VpZEFjdGl2ZSh1aWQsIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKKyAgICBpbnQgc3RhdGUgPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKKyAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIHN0YXRlID0gYW0uZ2V0VWlkUHJvY2Vzc1N0YXRlKHVpZCwgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1DYWNoZWRVaWRzLmluc2VydChzdGQ6OnBhaXI8dWlkX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4odWlkLCBzdGQ6OnBhaXI8Ym9vbCwgaW50PihhY3RpdmUsIHN0YXRlKSkpOworICAgIH0KKworICAgIHJldHVybiBzdGF0ZTsKK30KKwogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRBY3RpdmUodWlkX3QgdWlkKSB7Ci0gICAgdXBkYXRlVWlkQ2FjaGUodWlkLCB0cnVlLCB0cnVlKTsKKyAgICB1cGRhdGVVaWQoJm1DYWNoZWRVaWRzLCB1aWQsIHRydWUsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCB0cnVlKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRHb25lKHVpZF90IHVpZCwgX191bnVzZWQgYm9vbCBkaXNhYmxlZCkgewotICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgZmFsc2UsIGZhbHNlKTsKKyAgICB1cGRhdGVVaWQoJm1DYWNoZWRVaWRzLCB1aWQsIGZhbHNlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgZmFsc2UpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZElkbGUodWlkX3QgdWlkLCBfX3VudXNlZCBib29sIGRpc2FibGVkKSB7Ci0gICAgdXBkYXRlVWlkQ2FjaGUodWlkLCBmYWxzZSwgdHJ1ZSk7CisgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCBmYWxzZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIHRydWUpOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1NlcnZpY2VVaWQodWlkX3QgdWlkKSBjb25zdCB7Ci0gICAgcmV0dXJuIG11bHRpdXNlcl9nZXRfYXBwX2lkKHVpZCkgPCBBSURfQVBQX1NUQVJUOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojpub3RpZnlTZXJ2aWNlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpIHsKLSAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7Ci0gICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgewotICAgICAgICBzZXJ2aWNlLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsICFhY3RpdmUpOwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcm9jU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHByb2NTdGF0ZVNlcSBfX3VudXNlZCkgeworICAgIGlmIChwcm9jU3RhdGUgIT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pIHsKKyAgICAgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCB0cnVlLCBwcm9jU3RhdGUsIHRydWUpOwogICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpIHsKLSAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybjsKLSAgICBib29sIHdhc092ZXJyaWRkZW4gPSBmYWxzZSwgd2FzQWN0aXZlID0gZmFsc2U7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICB1cGRhdGVVaWRMb2NrZWQoJm1PdmVycmlkZVVpZHMsIHVpZCwgYWN0aXZlLCBpbnNlcnQsICZ3YXNPdmVycmlkZGVuLCAmd2FzQWN0aXZlKTsKLSAgICB9Ci0gICAgaWYgKCF3YXNPdmVycmlkZGVuICYmIGluc2VydCkgewotICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgYWN0aXZlKTsgIC8vIFN0YXJ0ZWQgdG8gb3ZlcnJpZGUuCi0gICAgfSBlbHNlIGlmICh3YXNPdmVycmlkZGVuICYmICFpbnNlcnQpIHsKLSAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGlzVWlkQWN0aXZlKHVpZCkpOyAgLy8gT3ZlcnJpZGUgY2Vhc2VkLCBub3RpZnkgd2l0aCBncm91bmQgdHJ1dGguCi0gICAgfSBlbHNlIGlmICh3YXNBY3RpdmUgIT0gYWN0aXZlKSB7Ci0gICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBhY3RpdmUpOyAgLy8gT3ZlcnJpZGUgdXBkYXRlZC4KKyAgICB1cGRhdGVVaWQoJm1PdmVycmlkZVVpZHMsIHVpZCwgYWN0aXZlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgaW5zZXJ0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6bm90aWZ5U2VydmljZSgpIHsKKyAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBzZXJ2aWNlLT51cGRhdGVVaWRTdGF0ZXMoKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZENhY2hlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KSB7Ci0gICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm47Ci0gICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+ICp1aWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnNlcnQpIHsKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIHdhc0FjdGl2ZSA9IGlzVWlkQWN0aXZlKHVpZCk7CisgICAgaW50IHByZXZpb3VzU3RhdGUgPSBnZXRVaWRTdGF0ZSh1aWQpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgdXBkYXRlVWlkTG9ja2VkKCZtQ2FjaGVkVWlkcywgdWlkLCBhY3RpdmUsIGluc2VydCwgbnVsbHB0ciwgJndhc0FjdGl2ZSk7Ci0gICAgICAgIC8vIERvIG5vdCBub3RpZnkgc2VydmljZSBpZiBjdXJyZW50bHkgb3ZlcnJpZGRlbi4KLSAgICAgICAgaWYgKG1PdmVycmlkZVVpZHMuZmluZCh1aWQpICE9IG1PdmVycmlkZVVpZHMuZW5kKCkpIHJldHVybjsKKyAgICAgICAgdXBkYXRlVWlkTG9ja2VkKHVpZHMsIHVpZCwgYWN0aXZlLCBzdGF0ZSwgaW5zZXJ0KTsKICAgICB9Ci0gICAgYm9vbCBub3dBY3RpdmUgPSBhY3RpdmUgJiYgaW5zZXJ0OwotICAgIGlmICh3YXNBY3RpdmUgIT0gbm93QWN0aXZlKSBub3RpZnlTZXJ2aWNlKHVpZCwgbm93QWN0aXZlKTsKKyAgICBpZiAod2FzQWN0aXZlICE9IGlzVWlkQWN0aXZlKHVpZCkgfHwgc3RhdGUgIT0gcHJldmlvdXNTdGF0ZSkgeworICAgICAgICBub3RpZnlTZXJ2aWNlKCk7CisgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiAqdWlkcywKLSAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQsIGJvb2wgKndhc1RoZXJlLCBib29sICp3YXNBY3RpdmUpIHsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+ICp1aWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnNlcnQpIHsKICAgICBhdXRvIGl0ID0gdWlkcy0+ZmluZCh1aWQpOwogICAgIGlmIChpdCAhPSB1aWRzLT5lbmQoKSkgewotICAgICAgICBpZiAod2FzVGhlcmUgIT0gbnVsbHB0cikgKndhc1RoZXJlID0gdHJ1ZTsKLSAgICAgICAgaWYgKHdhc0FjdGl2ZSAhPSBudWxscHRyKSAqd2FzQWN0aXZlID0gaXQtPnNlY29uZDsKICAgICAgICAgaWYgKGluc2VydCkgewotICAgICAgICAgICAgaXQtPnNlY29uZCA9IGFjdGl2ZTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuZmlyc3QgPSBhY3RpdmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5maXJzdCkgeworICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kID0gc3RhdGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1aWRzLT5lcmFzZShpdCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGluc2VydCkgewotICAgICAgICB1aWRzLT5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBib29sPih1aWQsIGFjdGl2ZSkpOworICAgIH0gZWxzZSBpZiAoaW5zZXJ0ICYmIChzdGF0ZSA9PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikpIHsKKyAgICAgICAgdWlkcy0+aW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+KHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4oYWN0aXZlLCBzdGF0ZSkpKTsKICAgICB9CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzQTExeU9uVG9wKCkgeworICAgIGZvciAoY29uc3QgYXV0byAmdWlkIDogbUNhY2hlZFVpZHMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+OjppdGVyYXRvciBpdCA9IGZpbmQobUExMXlVaWRzLmJlZ2luKCksIG1BMTF5VWlkcy5lbmQoKSwgdWlkLmZpcnN0KTsKKyAgICAgICAgaWYgKGl0ID09IG1BMTF5VWlkcy5lbmQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVpZC5zZWNvbmQuc2Vjb25kID49IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1AKKyAgICAgICAgICAgICAgICAmJiB1aWQuc2Vjb25kLnNlY29uZCA8PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfQk9VTkRfRk9SRUdST1VORF9TRVJWSUNFKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzQTExeVVpZCh1aWRfdCB1aWQpCit7CisgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+OjppdGVyYXRvciBpdCA9IGZpbmQobUExMXlVaWRzLmJlZ2luKCksIG1BMTF5VWlkcy5lbmQoKSwgdWlkKTsKKyAgICByZXR1cm4gaXQgIT0gbUExMXlVaWRzLmVuZCgpOworfQorCisvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5U2VydmljZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6cmVnaXN0ZXJTZWxmKCkgeworICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyIHNwbTsKKyAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBzcG0uaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworICAgIHNwbS5hZGRTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojp1bnJlZ2lzdGVyU2VsZigpIHsKKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgc3BtLnJlbW92ZVNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKSB7CisgICAgcmV0dXJuIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpvblNlbnNvclByaXZhY3lDaGFuZ2VkKGJvb2wgZW5hYmxlZCkgeworICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2VydmljZS0+dXBkYXRlVWlkU3RhdGVzKCk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwogLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KIAogQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OkF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4IG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpCiAgICAgOiBUaHJlYWQoZmFsc2UpLCBtTmFtZShuYW1lKSwgbVNlcnZpY2Uoc2VydmljZSkKIHsKLSAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOwogfQogCiAKQEAgLTY0OSw3ICs5OTQsNiBAQAogICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7CiAgICAgfQogICAgIG1BdWRpb0NvbW1hbmRzLmNsZWFyKCk7Ci0gICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6b25GaXJzdFJlZigpCkBAIC02NzQsNjggKzEwMTgsNTQgQEAKICAgICAgICAgICAgICAgICBtTGFzdENvbW1hbmQgPSBjb21tYW5kOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgVG9uZURhdGEgKmRhdGEgPSAoVG9uZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0YXJ0IHRvbmUgJWQgb24gc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVHlwZSwgZGF0YS0+bVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IG5ldyBUb25lR2VuZXJhdG9yKGRhdGEtPm1TdHJlYW0sIDEuMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RhcnRUb25lKGRhdGEtPm1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVE9QX1RPTkU6IHsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3AgdG9uZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobXBUb25lR2VuZXJhdG9yICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPTFVNRTogewogICAgICAgICAgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWUoZGF0YS0+bVN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogewogICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBhcmFtZXRlcnMgc3RyaW5nICVzLCBpbyAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoZGF0YS0+bUlPLCBkYXRhLT5tS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogewogICAgICAgICAgICAgICAgICAgICBWb2ljZVZvbHVtZURhdGEgKmRhdGEgPSAoVm9pY2VWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFZvaWNlVm9sdW1lKGRhdGEtPm1Wb2x1bWUpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICAgICAgICAgIFN0b3BPdXRwdXREYXRhICpkYXRhID0gKFN0b3BPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCBvdXRwdXQgcG9ydElkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1N0b3BPdXRwdXQoZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU91dHB1dERhdGEgKmRhdGEgPSAoUmVsZWFzZU91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIG91dHB1dCBwb3J0SWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvUmVsZWFzZU91dHB1dChkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6IHsKQEAgLTc0NSw3ICsxMDc1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5jcmVhdGVBdWRpb1BhdGNoKCZkYXRhLT5tUGF0Y2gsICZkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogewpAQCAtNzU1LDcgKzEwODcsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnJlbGVhc2VBdWRpb1BhdGNoKGRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQVVESU9QT1JUX0xJU1Q6IHsKQEAgLTc3OCw2ICsxMTEyLDE4IEBACiAgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0hBTkdFRF9BVURJT1ZPTFVNRUdST1VQOiB7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvVm9sdW1lR3JvdXBEYXRhICpkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBdWRpb1ZvbHVtZUdyb3VwRGF0YSAqPihjb21tYW5kLT5tUGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyB1cGRhdGUgYXVkaW8gdm9sdW1lIGdyb3VwIik7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZGF0YS0+bUdyb3VwLCBkYXRhLT5tRmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9BVURJT1BPUlRfQ09ORklHOiB7CiAgICAgICAgICAgICAgICAgICAgIFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgKmRhdGEgPSAoU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBvcnQgY29uZmlnIik7CkBAIC03ODUsNyArMTEzMSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZkYXRhLT5tQ29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRFlOX1BPTElDWV9NSVhfU1RBVEVfVVBEQVRFOiB7CkBAIC04MTEsOCArMTE1OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZGF0YS0+bUV2ZW50LCAmZGF0YS0+bUNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1DbGllbnRDb25maWcsICZkYXRhLT5tRGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1DbGllbnRDb25maWcsIGRhdGEtPm1DbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5tRGV2aWNlQ29uZmlnLCBkYXRhLT5tRWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUsIGRhdGEtPm1Tb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTkwMCwyNyArMTI0OSw2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVEFSVF9UT05FOwotICAgIHNwPFRvbmVEYXRhPiBkYXRhID0gbmV3IFRvbmVEYXRhKCk7Ci0gICAgZGF0YS0+bVR5cGUgPSB0eXBlOwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RhcnQgdHlwZSAlZCwgc3RyZWFtICVkIiwgdHlwZSwgc3RyZWFtKTsKLSAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcFRvbmVDb21tYW5kKCkKLXsKLSAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX1RPTkU7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0b3AiKTsKLSAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCkBAIC05NjcsMzMgKzEyOTUsMjUgQEAKICAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX09VVFBVVDsKICAgICBzcDxTdG9wT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBTdG9wT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBkYXRhLT5tUG9ydElkID0gcG9ydElkOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzdG9wIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzdG9wIG91dHB1dCBwb3J0SWQgJWQiLCBwb3J0SWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVMRUFTRV9PVVRQVVQ7CiAgICAgc3A8UmVsZWFzZU91dHB1dERhdGE+IGRhdGEgPSBuZXcgUmVsZWFzZU91dHB1dERhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgZGF0YS0+bVBvcnRJZCA9IHBvcnRJZDsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgcG9ydElkICVkIiwgcG9ydElkKTsKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIApAQCAtMTA0OCw2ICsxMzY4LDE5IEBACiAgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmNoYW5nZUF1ZGlvVm9sdW1lR3JvdXBDb21tYW5kKHZvbHVtZV9ncm91cF90IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD5jb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gQ0hBTkdFRF9BVURJT1ZPTFVNRUdST1VQOworICAgIEF1ZGlvVm9sdW1lR3JvdXBEYXRhICpkYXRhPSBuZXcgQXVkaW9Wb2x1bWVHcm91cERhdGEoKTsKKyAgICBkYXRhLT5tR3JvdXAgPSBncm91cDsKKyAgICBkYXRhLT5tRmxhZ3MgPSBmbGFnczsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgYXVkaW8gdm9sdW1lIGdyb3VwIGNoYW5nZWQiKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnNldEF1ZGlvUG9ydENvbmZpZ0NvbW1hbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLCBpbnQgZGVsYXlNcykKIHsKQEAgLTEwNzYsOSArMTQwOSwxNCBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIHNwPEF1ZGlvQ29tbWFuZD5jb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFOwpAQCAtMTA4Niw4ICsxNDI0LDExIEBACiAgICAgZGF0YS0+bUV2ZW50ID0gZXZlbnQ7CiAgICAgZGF0YS0+bUNsaWVudEluZm8gPSAqY2xpZW50SW5mbzsKICAgICBkYXRhLT5tQ2xpZW50Q29uZmlnID0gKmNsaWVudENvbmZpZzsKKyAgICBkYXRhLT5tQ2xpZW50RWZmZWN0cyA9IGNsaWVudEVmZmVjdHM7CiAgICAgZGF0YS0+bURldmljZUNvbmZpZyA9ICpkZXZpY2VDb25maWc7CisgICAgZGF0YS0+bUVmZmVjdHMgPSBlZmZlY3RzOwogICAgIGRhdGEtPm1QYXRjaEhhbmRsZSA9IHBhdGNoSGFuZGxlOworICAgIGRhdGEtPm1Tb3VyY2UgPSBzb3VyY2U7CiAgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlY29yZGluZyBjb25maWd1cmF0aW9uIHVwZGF0ZSBldmVudCAlZCwgc291cmNlICVkIHVpZCAldSIsCiAgICAgICAgICAgICBldmVudCwgY2xpZW50SW5mby0+c291cmNlLCBjbGllbnRJbmZvLT51aWQpOwpAQCAtMTIxMiw2ICsxNTUzLDcgQEAKICAgICAgICAgICAgICAgICBwYXRjaCA9ICgoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tUGF0Y2g7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGhhbmRsZSA9ICgoUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpKS0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnBhdGNoLCAwLCBzaXplb2YocGF0Y2gpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTI7CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2gyOwpAQCAtMTI1Niw4ICsxNTk4LDYgQEAKIAogICAgICAgICB9IGJyZWFrOwogCi0gICAgICAgIGNhc2UgU1RBUlRfVE9ORToKLSAgICAgICAgY2FzZSBTVE9QX1RPTkU6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTMzMCwyNyArMTY3MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRlbGF5TXMpOwogfQogCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgdG9uZSByZXF1ZXN0ZWQgKCVkKSIsIHRvbmUpOwotICAgIH0KLSAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgc3RyZWFtICglZCkgcmVxdWVzdGVkIGZvciB0b25lICVkIiwgc3RyZWFtLAotICAgICAgICAgICAgdG9uZSk7Ci0gICAgfQotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIGludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCiB7CiAgICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7CkBAIC0xNDA2LDkgKzE3MjUsNiBAQAogaW50IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpOwotaW50IGFwc19zdGFydF90b25lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLWludCBhcHNfc3RvcF90b25lKHZvaWQgKnNlcnZpY2UpOwogaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKTsKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDQwN2Q3YTUuLmEyZTc1Y2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMzEsMTUgKzMxLDE1IEBACiAjaW5jbHVkZSA8bWVkaWEvVG9uZUdlbmVyYXRvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeUVmZmVjdHMuaCIKICNpbmNsdWRlICJtYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCIKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuU2Vuc29yUHJpdmFjeUxpc3RlbmVyLmg+CiAKICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlIDoKQEAgLTYyLDM2ICs2MiwzMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTEwMiw4ICs5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0xMTYsNiArMTEyLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCk7CisKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIApAQCAtMTM0LDYgKzE0MSwyMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKQEAgLTE1OSwxMCArMTgxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZjb25maWcpOworICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLApAQCAtMTgyLDYgKzIwNCw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOwogCisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOwpAQCAtMTkyLDEwICsyMTYsMTQgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pOwpAQCAtMjA3LDE0ICsyMzUsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKLSAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3Vwcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgICAgICB2b2lkIGRvUmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGNsaWVudENyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKQEAgLTIyNCw3ICsyNjQsNyBAQAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbGllbnRTZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CiAKLSAgICAgICAgICAgIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCk7CisgICAgICAgICAgICB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQsIHBpZF90IHBpZCk7CiAgICAgICAgICAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgdm9pZCBkb09uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CkBAIC0yMzIsMTIgKzI3MiwyNSBAQAogCiAgICAgICAgICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgIHZvaWQgZG9PbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7Ci0gICAgICAgICAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgdm9pZCBkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKyAgICAgICAgICAgIHZvaWQgZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworCisgICAgICAgICAgICB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CisgICAgICAgICAgICB2b2lkIGRvT25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKTsKIAogcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSgpIEFORFJPSURfQVBJOwpAQCAtMjQ5LDcgKzMwMiw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIC8vIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gVUlEIHJlY29yZHMgb25seSBzaWxlbmNlCi0gICAgdmlydHVhbCB2b2lkIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCk7CisgICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlX2wodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CiAKICAgICAvLyBPdmVycmlkZXMgdGhlIFVJRCBzdGF0ZSBhcyBpZiBpdCBpcyBpZGxlCiAgICAgc3RhdHVzX3QgaGFuZGxlU2V0VWlkU3RhdGUoVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycik7CkBAIC0yNjUsNiArMzE4LDE4IEBACiAKICAgICBzdGQ6OnN0cmluZyBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAorICAgIHN0YXR1c190IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhzcDxBdWRpb1BvbGljeUVmZmVjdHM+JiBhdWRpb1BvbGljeUVmZmVjdHMpOworCisgICAgYXBwX3N0YXRlX3QgYXBtU3RhdEZyb21BbVN0YXRlKGludCBhbVN0YXRlKTsKKworICAgIHZvaWQgdXBkYXRlVWlkU3RhdGVzKCk7CisgICAgdm9pZCB1cGRhdGVVaWRTdGF0ZXNfbCgpOworCisgICAgdm9pZCBzaWxlbmNlQWxsUmVjb3JkaW5nc19sKCk7CisKKyAgICBzdGF0aWMgYm9vbCBpc1ByaXZhY3lTZW5zaXRpdmVTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKyAgICBzdGF0aWMgYm9vbCBpc1ZpcnR1YWxTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKwogICAgIC8vIElmIHJlY29yZGluZyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgVUlEIGlzIGFsbG93ZWQgdG8gZG8gdGhhdC4gSWYgdGhlIFVJRCBpcyBpZGxlCiAgICAgLy8gdGhlbiBpdCBjYW5ub3QgcmVjb3JkIGFuZCBnZXRzIGJ1ZmZlcnMgd2l0aCB6ZXJvcyAtIHNpbGVuY2UuIEFzIHNvb24gYXMgdGhlIFVJRAogICAgIC8vIHRyYW5zaXRpb25zIHRvIGFuIGFjdGl2ZSBzdGF0ZSB3ZSB3aWxsIHN0YXJ0IHJlcG9ydGluZyBidWZmZXJzIHdpdGggZGF0YS4gVGhpcyBhcHByb2FjaApAQCAtMjc0LDcgKzMzOSw3IEBACiAgICAgY2xhc3MgVWlkUG9saWN5IDogcHVibGljIEJuVWlkT2JzZXJ2ZXIsIHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgIGV4cGxpY2l0IFVpZFBvbGljeSh3cDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UpCi0gICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbU9ic2VydmVyUmVnaXN0ZXJlZChmYWxzZSkge30KKyAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtT2JzZXJ2ZXJSZWdpc3RlcmVkKGZhbHNlKSwgbUFzc2lzdGFudFVpZCgwKSB7fQogCiAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CiAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKQEAgLTI4MywzNCArMzQ4LDYzIEBACiAgICAgICAgIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKSBvdmVycmlkZTsKIAogICAgICAgICBib29sIGlzVWlkQWN0aXZlKHVpZF90IHVpZCk7CisgICAgICAgIGludCBnZXRVaWRTdGF0ZSh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpIHsgbUFzc2lzdGFudFVpZCA9IHVpZDsgfQorICAgICAgICBib29sIGlzQXNzaXN0YW50VWlkKHVpZF90IHVpZCkgeyByZXR1cm4gdWlkID09IG1Bc3Npc3RhbnRVaWQ7IH0KKyAgICAgICAgdm9pZCBzZXRBMTF5VWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsgbUExMXlVaWRzLmNsZWFyKCk7IG1BMTF5VWlkcyA9IHVpZHM7IH0KKyAgICAgICAgYm9vbCBpc0ExMXlVaWQodWlkX3QgdWlkKTsKKyAgICAgICAgYm9vbCBpc0ExMXlPblRvcCgpOwogCiAgICAgICAgIC8vIEJuVWlkT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24KICAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIG92ZXJyaWRlOwogICAgICAgICB2b2lkIG9uVWlkR29uZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwgaW50MzJfdCBwcm9jU3RhdGUsIGludDY0X3QgcHJvY1N0YXRlU2VxKTsKIAogICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpIHsgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBhY3RpdmUsIHRydWUpOyB9CiAgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgZmFsc2UsIGZhbHNlKTsgfQogCi0gICAgcHJpdmF0ZToKLSAgICAgICAgYm9vbCBpc1NlcnZpY2VVaWQodWlkX3QgdWlkKSBjb25zdDsKLSAgICAgICAgdm9pZCBub3RpZnlTZXJ2aWNlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpOworICAgICAgICB2b2lkIHVwZGF0ZVVpZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgaW50IHN0YXRlLCBib29sIGluc2VydCk7CisKKyAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBub3RpZnlTZXJ2aWNlKCk7CiAgICAgICAgIHZvaWQgdXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpOwotICAgICAgICB2b2lkIHVwZGF0ZVVpZENhY2hlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKLSAgICAgICAgdm9pZCB1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiAqdWlkcywKLSAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCwgYm9vbCAqd2FzVGhlcmUsIGJvb2wgKndhc0FjdGl2ZSk7CisgICAgICAgIHZvaWQgdXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+ICp1aWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBpbnQgc3RhdGUsIGJvb2wgaW5zZXJ0KTsKKyAgICAgICAgdm9pZCBjaGVja1JlZ2lzdGVyZWQoKTsKIAogICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOwogICAgICAgICBNdXRleCBtTG9jazsKICAgICAgICAgYm9vbCBtT2JzZXJ2ZXJSZWdpc3RlcmVkOwotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1PdmVycmlkZVVpZHM7Ci0gICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gbUNhY2hlZFVpZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+IG1PdmVycmlkZVVpZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+IG1DYWNoZWRVaWRzOworICAgICAgICB1aWRfdCBtQXNzaXN0YW50VWlkOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gbUExMXlVaWRzOwogICAgIH07CiAKLSAgICAvLyBUaHJlYWQgdXNlZCBmb3IgdG9uZSBwbGF5YmFjayBhbmQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgotICAgIC8vIEZvciB0b25lIHBsYXliYWNrLCB1c2luZyBhIHNlcGFyYXRlIHRocmVhZCBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgZGVhZGxvY2sgd2l0aCBtTG9jayBiZWNhdXNlCi0gICAgLy8gc3RhcnRUb25lKCkgYW5kIHN0b3BUb25lKCkgYXJlIG5vcm1hbGx5IGNhbGxlZCB3aXRoIG1Mb2NrIGxvY2tlZCBhbmQgcmVxdWVzdGluZyBhIHRvbmUgc3RhcnQKLSAgICAvLyBvciBzdG9wIHdpbGwgY2F1c2UgY2FsbHMgdG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGFuZCBhbiBhdHRlbXB0IHRvIGxvY2sgbUxvY2suCisgICAgLy8gSWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGFsbCBhcHBzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgYWN0aXZlLCBzaG91bGQgYmUKKyAgICAvLyBwcmV2ZW50ZWQgZnJvbSByZWNvcmRpbmcuIFRoaXMgaXMgaGFuZGxlZCBzaW1pbGFyIHRvIGlkbGUgVUlEcywgYW55IGFwcCB0aGF0IGF0dGVtcHRzCisgICAgLy8gdG8gcmVjb3JkIHdoaWxlIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgd2lsbCByZWNlaXZlIGJ1ZmZlcnMgd2l0aCB6ZXJvcy4gQXMgc29vbiBhcworICAgIC8vIHNlbnNvciBwcml2YWN5IGlzIGRpc2FibGVkIGFjdGl2ZSBhcHBzIHdpbGwgcmVjZWl2ZSB0aGUgZXhwZWN0ZWQgZGF0YSB3aGVuIHJlY29yZGluZy4KKyAgICBjbGFzcyBTZW5zb3JQcml2YWN5UG9saWN5IDogcHVibGljIGhhcmR3YXJlOjpCblNlbnNvclByaXZhY3lMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGV4cGxpY2l0IFNlbnNvclByaXZhY3lQb2xpY3kod3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisKKyAgICAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CisgICAgICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisKKyAgICAgICAgICAgIGJvb2wgaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworCisgICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblNlbnNvclByaXZhY3lDaGFuZ2VkKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CisgICAgICAgICAgICBzdGQ6OmF0b21pY19ib29sIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKKyAgICB9OworCisgICAgLy8gVGhyZWFkIHVzZWQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgogICAgIC8vIEZvciBhdWRpbyBjb25maWcgY29tbWFuZHMsIGl0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGF1ZGlvIGZsaW5nZXIgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGluZwogICAgIC8vIHByb2Nlc3MgKHVzZXIpIGhhcyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhdWRpbyBzZXR0aW5ncy4KICAgICBjbGFzcyBBdWRpb0NvbW1hbmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKQEAgLTMxOSw4ICs0MTMsNiBAQAogCiAgICAgICAgIC8vIGNvbW1hbmRzIGZvciB0b25lIEF1ZGlvQ29tbWFuZAogICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIFNUQVJUX1RPTkUsCi0gICAgICAgICAgICBTVE9QX1RPTkUsCiAgICAgICAgICAgICBTRVRfVk9MVU1FLAogICAgICAgICAgICAgU0VUX1BBUkFNRVRFUlMsCiAgICAgICAgICAgICBTRVRfVk9JQ0VfVk9MVU1FLApAQCAtMzMwLDYgKzQyMiw3IEBACiAgICAgICAgICAgICBSRUxFQVNFX0FVRElPX1BBVENILAogICAgICAgICAgICAgVVBEQVRFX0FVRElPUE9SVF9MSVNULAogICAgICAgICAgICAgVVBEQVRFX0FVRElPUEFUQ0hfTElTVCwKKyAgICAgICAgICAgIENIQU5HRURfQVVESU9WT0xVTUVHUk9VUCwKICAgICAgICAgICAgIFNFVF9BVURJT1BPUlRfQ09ORklHLAogICAgICAgICAgICAgRFlOX1BPTElDWV9NSVhfU1RBVEVfVVBEQVRFLAogICAgICAgICAgICAgUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFCkBAIC0zNDUsMjAgKzQzOCwxMyBAQAogICAgICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CiAKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcFRvbmVDb21tYW5kKCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcyA9IDApOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBwYXJhbWV0ZXJzQ29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9pY2VWb2x1bWVDb21tYW5kKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kQ29tbWFuZChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBpbnNlcnRDb21tYW5kX2woc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaENvbW1hbmQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKQEAgLTM2OCwxNSArNDU0LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZUF1ZGlvUG9ydExpc3RDb21tYW5kKCk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZUF1ZGlvUGF0Y2hMaXN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBjaGFuZ2VBdWRpb1ZvbHVtZUdyb3VwQ29tbWFuZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKGNvbnN0IFN0cmluZzgmIHJlZ0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICBwcml2YXRlOgogICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOwpAQCAtMzkwLDcgKzQ4MSw3IEBACiAKICAgICAgICAgICAgIHZvaWQgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKIAotICAgICAgICAgICAgaW50IG1Db21tYW5kOyAgIC8vIFNUQVJUX1RPTkUsIFNUT1BfVE9ORSAuLi4KKyAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTRVRfVk9MVU1FLCBTRVRfUEFSQU1FVEVSUy4uLgogICAgICAgICAgICAgbnNlY3NfdCBtVGltZTsgIC8vIHRpbWUgc3RhbXAKICAgICAgICAgICAgIE11dGV4IG1Mb2NrOyAgICAvLyBtdXRleCBhc3NvY2lhdGVkIHRvIG1Db25kCiAgICAgICAgICAgICBDb25kaXRpb24gbUNvbmQ7IC8vIGNvbmRpdGlvbiBmb3Igc3RhdHVzIHJldHVybgpAQCAtNDA2LDEyICs0OTcsNiBAQAogICAgICAgICAgICAgQXVkaW9Db21tYW5kRGF0YSgpIHt9CiAgICAgICAgIH07CiAKLSAgICAgICAgY2xhc3MgVG9uZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSBtVHlwZTsgLy8gdG9uZSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07ICAgIC8vIHN0cmVhbSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCi0gICAgICAgIH07Ci0KICAgICAgICAgY2xhc3MgVm9sdW1lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwpAQCAtNDMyLDE2ICs1MTcsMTIgQEAKIAogICAgICAgICBjbGFzcyBTdG9wT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOwogICAgICAgICB9OwogCiAgICAgICAgIGNsYXNzIFJlbGVhc2VPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb247CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQ7CiAgICAgICAgIH07CiAKICAgICAgICAgY2xhc3MgQ3JlYXRlQXVkaW9QYXRjaERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CkBAIC00NTUsNiArNTM2LDEyIEBACiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOwogICAgICAgICB9OwogCisgICAgICAgIGNsYXNzIEF1ZGlvVm9sdW1lR3JvdXBEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCBtR3JvdXA7CisgICAgICAgICAgICBpbnQgbUZsYWdzOworICAgICAgICB9OworCiAgICAgICAgIGNsYXNzIFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBtQ29uZmlnOwpAQCAtNDcxLDE0ICs1NTgsMTYgQEAKICAgICAgICAgICAgIGludCBtRXZlbnQ7CiAgICAgICAgICAgICByZWNvcmRfY2xpZW50X2luZm9fdCBtQ2xpZW50SW5mbzsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ2xpZW50Q29uZmlnOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gbUNsaWVudEVmZmVjdHM7CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbURldmljZUNvbmZpZzsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IG1FZmZlY3RzOwogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgbVNvdXJjZTsKICAgICAgICAgfTsKIAogICAgICAgICBNdXRleCAgIG1Mb2NrOwogICAgICAgICBDb25kaXRpb24gbVdhaXRXb3JrQ1Y7CiAgICAgICAgIFZlY3RvciA8IHNwPEF1ZGlvQ29tbWFuZD4gPiBtQXVkaW9Db21tYW5kczsgLy8gbGlzdCBvZiBwZW5kaW5nIGNvbW1hbmRzCi0gICAgICAgIFRvbmVHZW5lcmF0b3IgKm1wVG9uZUdlbmVyYXRvcjsgICAgIC8vIHRoZSB0b25lIGdlbmVyYXRvcgogICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IG1MYXN0Q29tbWFuZDsgICAgICAvLyBsYXN0IHByb2Nlc3NlZCBjb21tYW5kICh1c2VkIGJ5IGR1bXApCiAgICAgICAgIFN0cmluZzggbU5hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB1c2VkIGJ5IHdha2UgbG9jayBmbyBkZWxheWVkIGNvbW1hbmRzCiAgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CkBAIC01NTMsMTEgKzY0Miw2IEBACiAgICAgICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgogICAgICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cyk7CiAKLSAgICAgICAgLy8gcmVxdWVzdCB0aGUgcGxheWJhY2sgb2YgYSB0b25lIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtOiB1c2VkIGZvciBpbnN0YW5jZSB0byByZXBsYWNlIG5vdGlmaWNhdGlvbiBzb3VuZHMgd2hlbiBwbGF5aW5nCi0gICAgICAgIC8vIG92ZXIgYSB0ZWxlcGhvbnkgZGV2aWNlIGR1cmluZyBhIHBob25lIGNhbGwuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7Ci0KICAgICAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwogCkBAIC01ODIsOSArNjY2LDE1IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAKICAgICAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpOwogCkBAIC01OTcsMTggKzY4NywyOSBAQAogICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBwaWRfdCBwaWQpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Ob3RpZmljYXRpb25DbGllbnQoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVWlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CiAgICAgICAgICAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKQEAgLTYxOSwzNCArNzIwLDYxIEBACiAKICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiAgICAgICAgbVNlcnZpY2U7CiAgICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ7CiAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkOworICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQ7CisgICAgfTsKKworICAgIGNsYXNzIEF1ZGlvQ2xpZW50IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBpbyhpbyksIHVpZCh1aWQpLCBwaWQocGlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbihzZXNzaW9uKSwgZGV2aWNlSWQoZGV2aWNlSWQpLCBhY3RpdmUoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgfkF1ZGlvQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7IC8vIHNvdXJjZSwgZmxhZ3MgLi4uCisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvOyAgICAgICAgICAvLyBhdWRpbyBIQUwgc3RyZWFtIElPIGhhbmRsZQorICAgICAgICBjb25zdCB1aWRfdCB1aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAorICAgICAgICBjb25zdCBwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFBJRAorICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOyAgLy8gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIHBvcnQgSUQKKyAgICAgICAgICAgICAgYm9vbCBhY3RpdmU7ICAgICAgICAgICAgICAgICAgIC8vIFBsYXliYWNrL0NhcHR1cmUgaXMgYWN0aXZlIG9yIGluYWN0aXZlCiAgICAgfTsKIAogICAgIC8vIC0tLSBBdWRpb1JlY29yZENsaWVudCAtLS0KICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJlZ2lzdGVyZWQgQXVkaW9SZWNvcmQgY2xpZW50CiAgICAgLy8gKGJldHdlZW4gY2FsbHMgdG8gZ2V0SW5wdXRGb3JBdHRyKCkgYW5kIHJlbGVhc2VJbnB1dCgpKQotICAgIGNsYXNzIEF1ZGlvUmVjb3JkQ2xpZW50IDogcHVibGljIFJlZkJhc2UgeworICAgIGNsYXNzIEF1ZGlvUmVjb3JkQ2xpZW50IDogcHVibGljIEF1ZGlvQ2xpZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmRDbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHVpZF90IHVpZCwgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpbnB1dCksIHVpZCh1aWQpLCBwaWQocGlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwgc2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlKGZhbHNlKSwgaXNDb25jdXJyZW50KGZhbHNlKSwgaXNWaXJ0dWFsRGV2aWNlKGZhbHNlKSB7fQotICAgICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZENsaWVudCgpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKSA6CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGF0dHJpYnV0ZXMsIGlvLCB1aWQsIHBpZCwgc2Vzc2lvbiwgZGV2aWNlSWQpLAorICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLCBzdGFydFRpbWVOcygwKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb1JlY29yZENsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlczsgLy8gc291cmNlLCBmbGFncyAuLi4KLSAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQ7ICAgICAgIC8vIGF1ZGlvIEhBTCBpbnB1dCBJTyBoYW5kbGUKLSAgICAgICAgY29uc3QgdWlkX3QgdWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKLSAgICAgICAgY29uc3QgcGlkX3QgcGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBQSUQKICAgICAgICAgY29uc3QgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsgICAgICAgIC8vIGNsaWVudCBwYWNrYWdlIG5hbWUKLSAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247ICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKLSAgICAgICAgYm9vbCBhY3RpdmU7ICAgICAgICAgICAgICAgICAgIC8vIENhcHR1cmUgaXMgYWN0aXZlIG9yIGluYWN0aXZlCi0gICAgICAgIGJvb2wgaXNDb25jdXJyZW50OyAgICAgICAgICAgICAvLyBpcyBhbGxvd2VkIHRvIGNvbmN1cnJlbnQgY2FwdHVyZQotICAgICAgICBib29sIGlzVmlydHVhbERldmljZTsgICAgICAgICAgLy8gdXNlcyB2aXJ0dWFsIGRldmljZTogdXBkYXRlZCBieSBBUE06OmdldElucHV0Rm9yQXR0cigpCi0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7ICAvLyBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgcG9ydCBJRAorICAgICAgICBuc2Vjc190IHN0YXJ0VGltZU5zOworICAgIH07CisKKyAgICAvLyAtLS0gQXVkaW9QbGF5YmFja0NsaWVudCAtLS0KKyAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJlZ2lzdGVyZWQgQXVkaW9UcmFjayBjbGllbnQKKyAgICAvLyAoYmV0d2VlbiBjYWxscyB0byBnZXRPdXRwdXRGb3JBdHRyKCkgYW5kIHJlbGVhc2VPdXRwdXQoKSkKKyAgICBjbGFzcyBBdWRpb1BsYXliYWNrQ2xpZW50IDogcHVibGljIEF1ZGlvQ2xpZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgQXVkaW9QbGF5YmFja0NsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIDoKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9DbGllbnQoYXR0cmlidXRlcywgaW8sIHVpZCwgcGlkLCBzZXNzaW9uLCBkZXZpY2VJZCksIHN0cmVhbShzdHJlYW0pIHt9CisgICAgICAgICAgICAgICAgfkF1ZGlvUGxheWJhY2tDbGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW07CiAgICAgfTsKIAogICAgIC8vIEEgY2xhc3MgYXV0b21hdGljYWxseSBjbGVhcmluZyBhbmQgcmVzdG9yaW5nIGJpbmRlciBjYWxsZXIgaWRlbnRpdHkgaW5zaWRlCkBAIC02NzYsMjEgKzgwNCwyNSBAQAogICAgIC8vIG1Mb2NrIHByb3RlY3RzIEF1ZGlvUG9saWN5TWFuYWdlciBtZXRob2RzIHRoYXQgY2FuIGNhbGwgaW50byBhdWRpbyBmbGluZ2VyCiAgICAgLy8gYW5kIHBvc3NpYmx5IGJhY2sgaW4gdG8gYXVkaW8gcG9saWN5IHNlcnZpY2UgYW5kIGFjcXVpcmUgbUVmZmVjdHNMb2NrLgogICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbUF1ZGlvQ29tbWFuZFRocmVhZDsgICAgIC8vIGF1ZGlvIGNvbW1hbmRzIHRocmVhZAotICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbVRvbmVQbGF5YmFja1RocmVhZDsgICAgIC8vIHRvbmUgcGxheWJhY2sgdGhyZWFkCiAgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtT3V0cHV0Q29tbWFuZFRocmVhZDsgICAgLy8gcHJvY2VzcyBzdG9wIGFuZCByZWxlYXNlIG91dHB1dAogICAgIHN0cnVjdCBhdWRpb19wb2xpY3lfZGV2aWNlICptcEF1ZGlvUG9saWN5RGV2OwogICAgIHN0cnVjdCBhdWRpb19wb2xpY3kgKm1wQXVkaW9Qb2xpY3k7CiAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKm1BdWRpb1BvbGljeU1hbmFnZXI7CiAgICAgQXVkaW9Qb2xpY3lDbGllbnQgKm1BdWRpb1BvbGljeUNsaWVudDsKIAotICAgIERlZmF1bHRLZXllZFZlY3RvcjwgdWlkX3QsIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gPiAgICBtTm90aWZpY2F0aW9uQ2xpZW50czsKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGludDY0X3QsIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gPiAgICBtTm90aWZpY2F0aW9uQ2xpZW50czsKICAgICBNdXRleCBtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2s7ICAvLyBwcm90ZWN0cyBtTm90aWZpY2F0aW9uQ2xpZW50cwogICAgIC8vIE1hbmFnZSBhbGwgZWZmZWN0cyBjb25maWd1cmVkIGluIGF1ZGlvX2VmZmVjdHMuY29uZgogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4gbUF1ZGlvUG9saWN5RWZmZWN0czsKICAgICBhdWRpb19tb2RlX3QgbVBob25lU3RhdGU7CiAKICAgICBzcDxVaWRQb2xpY3k+IG1VaWRQb2xpY3k7CisgICAgc3A8U2Vuc29yUHJpdmFjeVBvbGljeT4gbVNlbnNvclByaXZhY3lQb2xpY3k7CisKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiA+ICAgbUF1ZGlvUmVjb3JkQ2xpZW50czsKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+ID4gICBtQXVkaW9QbGF5YmFja0NsaWVudHM7CisKKyAgICBNZWRpYVBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsgLy8gVG8gY2hlY2sgYWxsb3dQbGF5YmFja0NhcHR1cmUKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGE0M2RhZWEuLjk3YmU0NGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5tawpAQCAtNCw5ICs0LDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAotICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMKKyAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IFwKQEAgLTE4LDYgKzE2LDEwIEBACiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzIFwKIAorTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzCisKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAgIGF1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgXAogCkBAIC0yOSw0ICszMSwzNCBAQAogCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQogCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cworCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCisKKyMgc3lzdGVtL2F1ZGlvLmggdXRpbGl0aWVzIHRlc3QKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJiYXNlIFwKKyAgbGlibG9nIFwKKyAgbGlibWVkaWFfaGVscGVyIFwKKyAgbGlidXRpbHMKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgIGxpYm1lZGlhX2hlYWRlcnMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgc3lzdGVtYXVkaW9fdGVzdHMuY3BwIFwKKworTE9DQUxfTU9EVUxFIDo9IHN5c3RlbWF1ZGlvX3Rlc3RzCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCisKK0xPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCisKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gZGV2aWNlLXRlc3RzCisKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKaW5kZXggZWI4MjIyYy4uODg1NGViMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKQEAgLTYwLDkgKzYwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IH0KICAgICBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgLyppb0hhbmRsZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmtleXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nOCgpOyB9Ci0gICAgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgLyp0b25lKi8sCi0gICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgLypzdHJlYW0qLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQotICAgIHN0YXR1c190IHN0b3BUb25lKCkgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IC8qdm9sdW1lKi8sIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHN0YXR1c190IG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCAvKnNlc3Npb24qLywKICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAvKnNyY091dHB1dCovLApAQCAtNzYsMTMgKzczLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCkgb3ZlcnJpZGUgeyB9CiAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IC8qZ3JvdXAqLywgaW50IC8qZmxhZ3MqLykgb3ZlcnJpZGUgeyB9CiAgICAgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgLyp1c2UqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQogICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCAvKnJlZ0lkKi8sIGludDMyX3QgLypzdGF0ZSovKSBvdmVycmlkZSB7IH0KLSAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgLypldmVudCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190KiAvKmNsaWVudEluZm8qLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UqIC8qY2xpZW50Q29uZmlnKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlKiAvKmRldmljZUNvbmZpZyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IC8qcGF0Y2hIYW5kbGUqLykgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50IF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSBfX3VudXNlZCkgb3ZlcnJpZGUgeyB9CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAppbmRleCBhOTU5M2I4Li5kZTU2NzBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKQEAgLTE2LDkgKzE2LDE1IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCisjZGVmaW5lIExPR19UQUcgIkFQTV9UZXN0IgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KKwogI2luY2x1ZGUgIkF1ZGlvUG9saWN5VGVzdENsaWVudC5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaCIKIApAQCAtMTA2LDEwICsxMTIsMzkgQEAKICAgICBzdGQ6OnNldDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gbUFjdGl2ZVBhdGNoZXM7CiB9OwogCitjbGFzcyBQYXRjaENvdW50Q2hlY2sgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUGF0Y2hDb3VudENoZWNrKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQgKmNsaWVudCkKKyAgICAgICAgICAgIDogbUNsaWVudHtjbGllbnR9LAorICAgICAgICAgICAgICBtSW5pdGlhbENvdW50e21DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpfSB7fQorICAgIGludCBkZWx0YUZyb21TbmFwc2hvdCgpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IGN1cnJlbnRDb3VudCA9IG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpOworICAgICAgICBpZiAobUluaXRpYWxDb3VudCA8PSBjdXJyZW50Q291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q291bnQgLSBtSW5pdGlhbENvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC0oc3RhdGljX2Nhc3Q8aW50PihtSW5pdGlhbENvdW50IC0gY3VycmVudENvdW50KSk7CisgICAgICAgIH0KKyAgICB9CisgIHByaXZhdGU6CisgICAgY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCAqbUNsaWVudDsKKyAgICBjb25zdCBzaXplX3QgbUluaXRpYWxDb3VudDsKK307CisKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CiAgIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBTZXRVcENvbmZpZyhBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKSB7ICh2b2lkKWNvbmZpZzsgfQorCisgICAgdm9pZCBkdW1wVG9Mb2coKTsKKyAgICB2b2lkIGdldE91dHB1dEZvckF0dHIoCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQgPSBudWxscHRyKTsKKyAgICBQYXRjaENvdW50Q2hlY2sgc25hcHNob3RQYXRjaENvdW50KCkgeyByZXR1cm4gUGF0Y2hDb3VudENoZWNrKG1DbGllbnQuZ2V0KCkpOyB9CiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudD4gbUNsaWVudDsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lUZXN0TWFuYWdlcj4gbU1hbmFnZXI7CkBAIC0xMTksNiArMTU0LDcgQEAKICAgICBtQ2xpZW50LnJlc2V0KG5ldyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50KTsKICAgICBtTWFuYWdlci5yZXNldChuZXcgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlcihtQ2xpZW50LmdldCgpKSk7CiAgICAgbU1hbmFnZXItPmdldENvbmZpZygpLnNldERlZmF1bHQoKTsKKyAgICBTZXRVcENvbmZpZygmbU1hbmFnZXItPmdldENvbmZpZygpKTsgIC8vIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gY3VzdG9taXplIHRoZSBjb25maWcuCiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+aW5pdGlhbGl6ZSgpKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5pbml0Q2hlY2soKSk7CiB9CkBAIC0xMjgsMTQgKzE2NCw3MyBAQAogICAgIG1DbGllbnQucmVzZXQoKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpkdW1wVG9Mb2coKSB7CisgICAgaW50IHBpcGVmZFsyXTsKKyAgICBBU1NFUlRfTkUoLTEsIHBpcGUocGlwZWZkKSk7CisgICAgcGlkX3QgY3BpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfTkUoLTEsIGNwaWQpOworICAgIGlmIChjcGlkID09IDApIHsKKyAgICAgICAgLy8gQ2hpbGQgcHJvY2VzcyByZWFkcyBmcm9tIHRoZSBwaXBlIGFuZCBsb2dzLgorICAgICAgICBjbG9zZShwaXBlZmRbMV0pOworICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgICAgICBjaGFyIGJ1ZjsKKyAgICAgICAgd2hpbGUgKHJlYWQocGlwZWZkWzBdLCAmYnVmLCBzaXplb2YoYnVmKSkgPiAwKSB7CisgICAgICAgICAgICBpZiAoYnVmICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICBsaW5lICs9IGJ1ZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFsaW5lLmVtcHR5KCkpIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIF9leGl0KEVYSVRfU1VDQ0VTUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUGFyZW50IGRvZXMgdGhlIGR1bXAgYW5kIGNoZWNrcyB0aGUgc3RhdHVzIGNvZGUuCisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmR1bXAocGlwZWZkWzFdKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFsxXSk7CisgICAgICAgIHdhaXQoTlVMTCk7ICAvLyBXYWl0IGZvciB0aGUgY2hpbGQgdG8gZXhpdC4KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6Z2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgIGludCBzYW1wbGVSYXRlLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSB7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7fTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbG9jYWxQb3J0SWQ7CisgICAgaWYgKCFwb3J0SWQpIHBvcnRJZCA9ICZsb2NhbFBvcnRJZDsKKyAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBBU1NFUlRfRVEoT0ssIG1NYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICAgICAgICAgICAgICAmYXR0ciwgJm91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLCAmc3RyZWFtLCAwIC8qdWlkKi8sICZjb25maWcsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLCB7fSkpOworICAgIEFTU0VSVF9ORShBVURJT19QT1JUX0hBTkRMRV9OT05FLCAqcG9ydElkKTsKK30KKworCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgSW5pdFN1Y2Nlc3MpIHsKICAgICAvLyBTZXRVcCBtdXN0IGZpbmlzaCB3aXRoIG5vIGFzc2VydGlvbnMuCiB9CiAKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBEdW1wKSB7CisgICAgZHVtcFRvTG9nKCk7Cit9CisKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRmFpbHVyZSkgewogICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgY29uc3Qgc2l6ZV90IHBhdGNoQ291bnRCZWZvcmUgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOwogICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKG51bGxwdHIsICZoYW5kbGUsIDApKTsKICAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsIG51bGxwdHIsIDApKTsKICAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIDApKTsKQEAgLTE2MiwzNSArMjU3LDE4MCBAQAogICAgIEFTU0VSVF9FUShJTlZBTElEX09QRVJBVElPTiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CiAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGhhbmRsZSBpcyBsZWZ0IHVuY2hhbmdlZC4KICAgICBBU1NFUlRfRVEoQVVESU9fUEFUQ0hfSEFORExFX05PTkUsIGhhbmRsZSk7Ci0gICAgQVNTRVJUX0VRKHBhdGNoQ291bnRCZWZvcmUsIG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKIH0KIAogVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsIENyZWF0ZUF1ZGlvUGF0Y2hGcm9tTWl4KSB7Ci0gICAgYXVkaW9fcGF0Y2ggcGF0Y2h7fTsKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB1aWRfdCB1aWQgPSA0MjsKLSAgICBjb25zdCBzaXplX3QgcGF0Y2hDb3VudEJlZm9yZSA9IG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpOwotICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICB7Ci0gICAgICAgIGF1dG8mIHNyYyA9IHBhdGNoLnNvdXJjZXNbMF07Ci0gICAgICAgIHNyYy5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKLSAgICAgICAgc3JjLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwotICAgICAgICBzcmMuaWQgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKClbMF0tPmdldElkKCk7Ci0gICAgICAgIC8vIE5vdGU6IHRoZXNlIGFyZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgb3V0cHV0IGRldmljZS4KLSAgICAgICAgc3JjLnNhbXBsZV9yYXRlID0gNDQxMDA7Ci0gICAgICAgIHNyYy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICAgICAgc3JjLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICB9Ci0gICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKLSAgICB7Ci0gICAgICAgIGF1dG8mIHNpbmsgPSBwYXRjaC5zaW5rc1swXTsKLSAgICAgICAgc2luay5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7Ci0gICAgICAgIHNpbmsudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U7Ci0gICAgICAgIHNpbmsuaWQgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0RGVmYXVsdE91dHB1dERldmljZSgpLT5nZXRJZCgpOwotICAgIH0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgdWlkKSk7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpLmlzRW1wdHkoKSk7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKVswXSkuCisgICAgICAgICAgICBhZGRTaW5rKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2hCdWlsZGVyLnBhdGNoKCksICZoYW5kbGUsIHVpZCkpOwogICAgIEFTU0VSVF9ORShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgaGFuZGxlKTsKLSAgICBBU1NFUlRfRVEocGF0Y2hDb3VudEJlZm9yZSArIDEsIG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKIH0KIAogLy8gVE9ETzogQWRkIHBhdGNoIGNyZWF0aW9uIHRlc3RzIHRoYXQgaW52b2x2ZSBhbHJlYWR5IGV4aXN0aW5nIHBhdGNoCisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCB7CisgIHByb3RlY3RlZDoKKyAgICB2b2lkIFNldFVwQ29uZmlnKEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpIG92ZXJyaWRlOworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1Nc2RPdXRwdXREZXZpY2U7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbU1zZElucHV0RGV2aWNlOworfTsKKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkOjpTZXRVcENvbmZpZyhBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKSB7CisgICAgLy8gVE9ETzogQ29uc2lkZXIgdXNpbmcgU2VyaWFsaXplciB0byBsb2FkIHBhcnQgb2YgdGhlIGNvbmZpZyBmcm9tIGEgc3RyaW5nLgorICAgIG1Nc2RPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfT1VUX0JVUyk7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBwY21PdXRwdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGFjM091dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDApOworICAgIG1Nc2RPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShwY21PdXRwdXRQcm9maWxlKTsKKyAgICBtTXNkT3V0cHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUoYWMzT3V0cHV0UHJvZmlsZSk7CisgICAgbU1zZElucHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX0lOX0JVUyk7CisgICAgLy8gTWF0Y2ggb3V0cHV0IHByb2ZpbGUgZnJvbSBBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdC4KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IHBjbUlucHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sIDQ0MTAwKTsKKyAgICBtTXNkSW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShwY21JbnB1dFByb2ZpbGUpOworICAgIGNvbmZpZy0+YWRkQXZhaWxhYmxlRGV2aWNlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIGNvbmZpZy0+YWRkQXZhaWxhYmxlRGV2aWNlKG1Nc2RJbnB1dERldmljZSk7CisKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QsIDIgLypoYWxWZXJzaW9uTWFqb3IqLyk7CisgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1vZHVsZXMgPSBjb25maWctPmdldEh3TW9kdWxlcygpOworICAgIG1vZHVsZXMuYWRkKG1zZE1vZHVsZSk7CisgICAgY29uZmlnLT5zZXRId01vZHVsZXMobW9kdWxlcyk7CisgICAgbU1zZE91dHB1dERldmljZS0+YXR0YWNoKG1zZE1vZHVsZSk7CisgICAgbU1zZElucHV0RGV2aWNlLT5hdHRhY2gobXNkTW9kdWxlKTsKKworICAgIHNwPE91dHB1dFByb2ZpbGU+IG1zZE91dHB1dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJtc2QgaW5wdXQiKSk7CisgICAgbXNkT3V0cHV0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKHBjbU91dHB1dFByb2ZpbGUpOworICAgIG1zZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkT3V0cHV0UHJvZmlsZSk7CisgICAgc3A8T3V0cHV0UHJvZmlsZT4gbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUgPQorICAgICAgICAgICAgbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgibXNkIGNvbXByZXNzZWQgaW5wdXQiKSk7CisgICAgbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShhYzNPdXRwdXRQcm9maWxlKTsKKyAgICBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZS0+c2V0RmxhZ3MoCisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyk7CisgICAgbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUpOworCisgICAgc3A8SW5wdXRQcm9maWxlPiBtc2RJbnB1dFByb2ZpbGUgPSBuZXcgSW5wdXRQcm9maWxlKFN0cmluZzgoIm1zZCBvdXRwdXQiKSk7CisgICAgbXNkSW5wdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUocGNtSW5wdXRQcm9maWxlKTsKKyAgICBtc2RJbnB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkSW5wdXREZXZpY2UpOworICAgIG1zZE1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKG1zZElucHV0UHJvZmlsZSk7CisKKyAgICAvLyBBZGQgYSBwcm9maWxlIHdpdGggYW5vdGhlciBlbmNvZGluZyB0byB0aGUgZGVmYXVsdCBkZXZpY2UgdG8gdGVzdCByb3V0aW5nCisgICAgLy8gb2Ygc3RyZWFtcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IE1TRC4KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGR0c091dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUUywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDApOworICAgIGNvbmZpZy0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT5hZGRBdWRpb1Byb2ZpbGUoZHRzT3V0cHV0UHJvZmlsZSk7CisgICAgc3A8T3V0cHV0UHJvZmlsZT4gcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlID0gbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgiZW5jb2RlZCIpKTsKKyAgICBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShkdHNPdXRwdXRQcm9maWxlKTsKKyAgICBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUtPnNldEZsYWdzKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoY29uZmlnLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkpOworICAgIGNvbmZpZy0+Z2V0SHdNb2R1bGVzKCkuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpLT4KKyAgICAgICAgICAgIGFkZE91dHB1dFByb2ZpbGUocHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkOjpUZWFyRG93bigpIHsKKyAgICBtTXNkT3V0cHV0RGV2aWNlLmNsZWFyKCk7CisgICAgbU1zZElucHV0RGV2aWNlLmNsZWFyKCk7CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6VGVhckRvd24oKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEluaXRTdWNjZXNzKSB7CisgICAgQVNTRVJUX1RSVUUobU1zZE91dHB1dERldmljZSk7CisgICAgQVNTRVJUX1RSVUUobU1zZElucHV0RGV2aWNlKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIER1bXApIHsKKyAgICBkdW1wVG9Mb2coKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIFBhdGNoQ3JlYXRpb25PblNldEZvcmNlVXNlKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJFbmNvZGVkUm91dGVzVG9Nc2QpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0clBjbVJvdXRlc1RvTXNkKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRW5jb2RlZFBsdXNQY21Sb3V0ZXNUb01zZCkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyVW5zdXBwb3J0ZWRGb3JtYXRCeXBhc3Nlc01zZCkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBBU1NFUlRfTkUoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRm9ybWF0U3dpdGNoaW5nKSB7CisgICAgLy8gU3dpdGNoIGJldHdlZW4gZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgTVNELgorICAgIHsKKyAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQ7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAmcG9ydElkKTsKKyAgICAgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICAgICAgbU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKKyAgICAgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQ7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUUywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAmcG9ydElkKTsKKyAgICAgICAgQVNTRVJUX05FKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoLTEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgICAgIG1NYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIH0KKyAgICB7CisgICAgICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICAgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9zeXN0ZW1hdWRpb190ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9zeXN0ZW1hdWRpb190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhYWU1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIExPR19UQUcgIlN5c0F1ZGlvX1Rlc3QiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworVEVTVChTeXN0ZW1BdWRpb1Rlc3QsIFBhdGNoSW52YWxpZCkgeworICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gQVVESU9fUEFUQ0hfUE9SVFNfTUFYICsgMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaF9pc192YWxpZCgmcGF0Y2gpKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gQVVESU9fUEFUQ0hfUE9SVFNfTUFYICsgMTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAwOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hWYWxpZCkgeworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNyYyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICAvLyBJdCdzIE9LIG5vdCB0byBoYXZlIHNpbmtzLgorICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykucGF0Y2goKSkpOworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNpbmsgPSB7CisgICAgICAgIC5pZCA9IDIsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS4KKyAgICAgICAgICAgICAgICAgICAgYWRkU2luayhzaW5rKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKK30KKworVEVTVChTeXN0ZW1BdWRpb1Rlc3QsIFBhdGNoSHdBdlN5bmMpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBkZXZpY2Vfc3JjX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisgICAgZGV2aWNlX3NyY19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc3JjX2NmZykpOworICAgIGRldmljZV9zcmNfY2ZnLmZsYWdzLmlucHV0ID0gQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc3JjX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgZGV2aWNlX3NpbmtfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworICAgIGRldmljZV9zaW5rX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworICAgIGRldmljZV9zaW5rX2NmZy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc2lua19jZmcpKTsKKworICAgIGF1ZGlvX3BvcnRfY29uZmlnIG1peF9zaW5rX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSywgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc2lua19jZmcpKTsKKyAgICBtaXhfc2lua19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc2lua19jZmcpKTsKKyAgICBtaXhfc2lua19jZmcuZmxhZ3MuaW5wdXQgPSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgbWl4X3NyY19jZmcgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworICAgIG1peF9zcmNfY2ZnLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NyY19jZmcpKTsKKyAgICBtaXhfc3JjX2NmZy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hFcXVhbCkgeworICAgIGNvbnN0IGF1ZGlvX3BhdGNoIHBhdGNoMXt9LCBwYXRjaDJ7fTsKKyAgICAvLyBJbnZhbGlkIHBhdGNoZXMgYXJlIG5vdCBlcXVhbC4KKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoJnBhdGNoMSwgJnBhdGNoMikpOworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNyYyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyBzaW5rID0geworICAgICAgICAuaWQgPSAyLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBzaW5rX2h3X2F2X3N5bmMgPSBzaW5rOworICAgIHNpbmtfaHdfYXZfc3luYy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBzaW5rX2h3X2F2X3N5bmMuZmxhZ3Mub3V0cHV0ID0gQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2lua19od19hdl9zeW5jKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCkpKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMgYi9zZXJ2aWNlcy9jYW1lcmEvT1dORVJTCmluZGV4IDE4YWNmZWUuLmY0OGE5NWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMKKysrIGIvc2VydmljZXMvY2FtZXJhL09XTkVSUwpAQCAtMSw2ICsxIEBACi1jeWNoZW5AZ29vZ2xlLmNvbQotZXBlZXZAZ29vZ2xlLmNvbQotZXRhbHZhbGFAZ29vZ2xlLmNvbQotc2h1emhlbndhbmdAZ29vZ2xlLmNvbQoteWluY2hpYXllaEBnb29nbGUuY29tCi16aGlqdW5oZUBnb29nbGUuY29tCitpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYXY6L2NhbWVyYS9PV05FUlMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzBlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTczIEBACisvLyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLworLy8gbGliY2FtZXJhc2VydmljZQorLy8KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmFzZXJ2aWNlIiwKKworICAgIC8vIENhbWVyYSBzZXJ2aWNlIHNvdXJjZQorCisgICAgc3JjczogWworICAgICAgICAiQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAiQ2FtZXJhRmxhc2hsaWdodC5jcHAiLAorICAgICAgICAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAiLAorICAgICAgICAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAiLAorICAgICAgICAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAiLAorICAgICAgICAiYXBpMS9DYW1lcmFDbGllbnQuY3BwIiwKKyAgICAgICAgImFwaTEvQ2FtZXJhMkNsaWVudC5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIiwKKyAgICAgICAgImFwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcCIsCisgICAgICAgICJhcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcCIsCisgICAgICAgICJhcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwIiwKKyAgICAgICAgImFwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCIsCisgICAgICAgICJndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCIsCisgICAgICAgICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAiLAorICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCIsCisgICAgICAgICJoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIiwKKyAgICAgICAgImhpZGwvQ29udmVydC5jcHAiLAorICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAiLAorICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAidXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCIsCisgICAgICAgICJ1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAiLAorICAgICAgICAidXRpbHMvRXhpZlV0aWxzLmNwcCIsCisgICAgICAgICJ1dGlscy9UYWdNb25pdG9yLmNwcCIsCisgICAgICAgICJ1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlsc2NhbGxzdGFjayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmpwZWciLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYnNlbnNvcnByaXZhY3kiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ5dXYiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5kZXZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGlic2Vuc29ycHJpdmFjeSIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAic3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrIiwKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1pZ25vcmVkLXF1YWxpZmllcnMiLAorICAgIF0sCisKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJkZXB0aHBob3RvIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInV0aWxzL0V4aWZVdGlscy5jcHAiLAorICAgICAgICAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmltYWdlX2lvIiwKKyAgICAgICAgImxpYmR5bmFtaWNfZGVwdGgiLAorICAgICAgICAibGlieG1sMiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHNjYWxsc3RhY2siLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmpwZWciLAorICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGliZXhpZiIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2luY2x1ZGVzIiwKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8taWdub3JlZC1xdWFsaWZpZXJzIiwKKyAgICBdLAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA5NjI2MWFiLi40Y2ZlY2ZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTE0LDkxICsxNCw5IEBACiAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCi0jCi0jIGxpYmNhbWVyYXNlcnZpY2UKLSMKLQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLSMgQ2FtZXJhIHNlcnZpY2Ugc291cmNlCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAgXAotICAgIENhbWVyYVNlcnZpY2UuY3BwIFwKLSAgICBDYW1lcmFGbGFzaGxpZ2h0LmNwcCBcCi0gICAgY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBcCi0gICAgY29tbW9uL0NhbWVyYURldmljZUJhc2UuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBcCi0gICAgY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAgXAotICAgIGFwaTEvQ2FtZXJhQ2xpZW50LmNwcCBcCi0gICAgYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgXAotICAgIGRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBcCi0gICAgZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCBcCi0gICAgZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgXAotICAgIHV0aWxzL0NhbWVyYVRyYWNlcy5jcHAgXAotICAgIHV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcCBcCi0gICAgdXRpbHMvVGFnTW9uaXRvci5jcHAgXAotICAgIHV0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCi0gICAgbGlidWkgXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHNjYWxsc3RhY2sgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibWVkaWEgXAotICAgIGxpYm1lZGlhdXRpbHMgXAotICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCi0gICAgbGliZm1xIFwKLSAgICBsaWJndWkgXAotICAgIGxpYmhhcmR3YXJlIFwKLSAgICBsaWJoaWRsYmFzZSBcCi0gICAgbGliaGlkbHRyYW5zcG9ydCBcCi0gICAgbGlianBlZyBcCi0gICAgbGlibWVtdW5yZWFjaGFibGUgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNAotCi1MT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJiaW5kZXIgbGliY2FtZXJhX2NsaWVudCBsaWJmbXEKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmFzZXJ2aWNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyBCdWlsZCB0ZXN0cyB0b28KKyMgQnVpbGQgdGVzdHMKIAogaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Rlc3RzL0FuZHJvaWQubWsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA4YTc1MmIxLi41MWQwNjgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtNDcsMTEgKzQ3LDE1IEBACiAjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oIgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lbXVucmVhY2hhYmxlL21lbXVucmVhY2hhYmxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KKyNpbmNsdWRlIDxzZW5zb3Jwcml2YWN5L1NlbnNvclByaXZhY3lNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KQEAgLTY5LDYgKzczLDcgQEAKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgogI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgewogICAgIGNvbnN0IGNoYXIqIGtQZXJtaXNzaW9uU2VydmljZU5hbWUgPSAicGVybWlzc2lvbiI7CkBAIC03Nyw2ICs4Miw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIGJpbmRlcjo6U3RhdHVzOwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFTZXJ2aWNlOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmE7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYUNsaWVudDsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OwpAQCAtMTQxLDYgKzE0NywxMyBAQAogCiAgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CiAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kgPSBuZXcgU2Vuc29yUHJpdmFjeVBvbGljeSh0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgc3A8SGlkbENhbWVyYVNlcnZpY2U+IGhjcyA9IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRJbnN0YW5jZSh0aGlzKTsKKyAgICBpZiAoaGNzLT5yZWdpc3RlckFzU2VydmljZSgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGRlZmF1bHQgYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAxLjAiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgIH0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZW51bWVyYXRlUHJvdmlkZXJzKCkgewpAQCAtMjE0LDEzICsyMjcsMTQgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKIAogICAgIGZvciAoYXV0byYgaSA6IG1MaXN0ZW5lckxpc3QpIHsKLSAgICAgICAgaS0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTZ7Y2FtZXJhSWR9KTsKKyAgICAgICAgaS5zZWNvbmQtPmdldExpc3RlbmVyKCktPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKG1hcFRvSW50ZXJmYWNlKHN0YXR1cyksIFN0cmluZzE2e2NhbWVyYUlkfSk7CiAgICAgfQogfQogCiBDYW1lcmFTZXJ2aWNlOjp+Q2FtZXJhU2VydmljZSgpIHsKICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKICAgICBtVWlkUG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOwogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6Om9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgewpAQCAtMzM3LDcgKzM1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVELAogICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFze30pOwogICAgICAgICAgICAgLy8gRW5zdXJlIG5vdCBpbiBiaW5kZXIgUlBDIHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpLAorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpLAogICAgICAgICAgICAgICAgICAgICAib25EZXZpY2VTdGF0dXNDaGFuZ2VkIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGNhbWVyYSBzZXJ2aWNlIHByb2Nlc3MhIik7CiAgICAgICAgICAgICBjbGllbnRUb0Rpc2Nvbm5lY3QtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgfQpAQCAtNDk4LDE3ICs1MTIsMzcgQEAKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICB9CiAKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdVaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHRhZ3NSZW1vdmVkOworICAgIC8vIElmIGl0J3Mgbm90IGNhbGxpbmcgZnJvbSBjYW1lcmFzZXJ2ZXIsIGNoZWNrIHRoZSBwZXJtaXNzaW9uLgorICAgIGlmICgoY2FsbGluZ1BpZCAhPSBnZXRwaWQoKSkgJiYKKyAgICAgICAgICAgICFjaGVja1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEiKSwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgcmVzID0gY2FtZXJhSW5mby0+cmVtb3ZlUGVybWlzc2lvbkVudHJpZXMoCisgICAgICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSksCisgICAgICAgICAgICAgICAgJnRhZ3NSZW1vdmVkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgY2FtZXJhSW5mby0+Y2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCAiRmFpbGVkIHRvIHJlbW92ZSBjYW1lcmEiCisgICAgICAgICAgICAgICAgICAgICIgY2hhcmFjdGVyaXN0aWNzIG5lZWRpbmcgY2FtZXJhIHBlcm1pc3Npb24gZm9yIGRldmljZSAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdGFnc1JlbW92ZWQuZW1wdHkoKSkgeworICAgICAgICByZXMgPSBjYW1lcmFJbmZvLT51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0NIQVJBQ1RFUklTVElDX0tFWVNfTkVFRElOR19QRVJNSVNTSU9OLAorICAgICAgICAgICAgICAgIHRhZ3NSZW1vdmVkLmRhdGEoKSwgdGFnc1JlbW92ZWQuc2l6ZSgpKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgY2FtZXJhSW5mby0+Y2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCAiRmFpbGVkIHRvIGluc2VydCBjYW1lcmEgIgorICAgICAgICAgICAgICAgICAgICAia2V5cyBuZWVkaW5nIHBlcm1pc3Npb24gZm9yIGRldmljZSAlczogJXMgKCVkKSIsIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBDYW1lcmFTZXJ2aWNlOjpnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KLWludCBDYW1lcmFTZXJ2aWNlOjpnZXRDYWxsaW5nVWlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci19Ci0KIFN0cmluZzggQ2FtZXJhU2VydmljZTo6Z2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKSB7CiAgICAgdGltZV90IG5vdyA9IHRpbWUobnVsbHB0cik7CiAgICAgY2hhciBmb3JtYXR0ZWRUaW1lWzY0XTsKQEAgLTU4OSw3ICs2MjMsNyBAQAogU3RhdHVzIENhbWVyYVNlcnZpY2U6Om1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGZhY2luZywgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgYm9vbCBsZWdhY3lNb2RlLCBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpIHsKIAogICAgIGlmIChoYWxWZXJzaW9uIDwgMCB8fCBoYWxWZXJzaW9uID09IGRldmljZVZlcnNpb24pIHsKQEAgLTYwMSw3ICs2MzUsNyBAQAogICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7CiAgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfREVQUkVDQVRFRF9IQUwsCkBAIC02MTQsMTIgKzY0OCwxMyBAQAogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzoKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6CiAgICAgICAgICAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gQVBJXzEpIHsgLy8gQ2FtZXJhMSBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhMkNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpOwogICAgICAgICAgICAgfSBlbHNlIHsgLy8gQ2FtZXJhMiBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gdG1wID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKj4oY2FtZXJhQ2IuZ2V0KCkpOwpAQCAtNjQzLDcgKzY3OCw3IEBACiAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgYXBpMUNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBPdGhlciBjb21iaW5hdGlvbnMgKGUuZy4gSEFMMy54IG9wZW4gYXMgSEFMMi54KSBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCiAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgSEFMIHZlcnNpb24gJXg6IEhBTCAleCBkZXZpY2UgY2FuIG9ubHkgYmUiCkBAIC03MzIsNyArNzY3LDcgQEAKIH0KIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmluaXRpYWxpemVTaGltTWV0YWRhdGEoaW50IGNhbWVyYUlkKSB7Ci0gICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKIAogICAgIFN0cmluZzE2IGludGVybmFsUGFja2FnZU5hbWUoImNhbWVyYXNlcnZlciIpOwogICAgIFN0cmluZzggaWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpOwpAQCAtNzQyLDggKzc3Nyw3IEBACiAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PntudWxscHRyfSwgaWQsIGNhbWVyYUlkLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEKSwKICAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHVpZCwgVVNFX0NBTExJTkdfUElELAotICAgICAgICAgICAgQVBJXzEsIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwKLSAgICAgICAgICAgIC8qb3V0Ki8gdG1wKQorICAgICAgICAgICAgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyB0cnVlLCAvKm91dCovIHRtcCkKICAgICAgICAgICAgICkuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW5pdGlhbGl6aW5nIHNoaW0gbWV0YWRhdGE6ICVzIiwgX19GVU5DVElPTl9fLCByZXQudG9TdHJpbmc4KCkuc3RyaW5nKCkpOwogICAgIH0KQEAgLTc4Miw5ICs4MTYsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgaW50NjRfdCB0b2tlbiA9IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIHJldCA9IGluaXRpYWxpemVTaGltTWV0YWRhdGEoY2FtZXJhSWQpOwotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCiAgICAgICAgIHJldHVybiByZXQ7CkBAIC04NDEsNyArODc1LDcgQEAKICAgICB9CiAjZW5kaWYgIC8vIF9fQlJJTExPX18KIAotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKIAogICAgIGlmICghbUluaXRpYWxpemVkKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbWVyYSBIQUwgbW9kdWxlIG5vdCBsb2FkZWQpIiwKQEAgLTg3NSw4ICs5MDksOCBAQAogU3RhdHVzIENhbWVyYVNlcnZpY2U6OnZhbGlkYXRlQ2xpZW50UGVybWlzc2lvbnNMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNsaWVudE5hbWU4LCBpbnQmIGNsaWVudFVpZCwgaW50JiBjbGllbnRQaWQsCiAgICAgICAgIC8qb3V0Ki9pbnQmIG9yaWdpbmFsQ2xpZW50UGlkKSBjb25zdCB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgaW50IGNhbGxpbmdVaWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nVWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKIAogICAgIC8vIENoZWNrIGlmIHdlIGNhbiB0cnVzdCBjbGllbnRVaWQKICAgICBpZiAoY2xpZW50VWlkID09IFVTRV9DQUxMSU5HX1VJRCkgewpAQCAtOTIyLDYgKzk1NiwxNCBAQAogICAgICAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgIH0KIAorICAgIC8vIElmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBwcmV2ZW50IGFjY2VzcyB0byB0aGUgY2FtZXJhCisgICAgaWYgKG1TZW5zb3JQcml2YWN5UG9saWN5LT5pc1NlbnNvclByaXZhY3lFbmFibGVkKCkpIHsKKyAgICAgICAgQUxPR0UoIkFjY2VzcyBEZW5pYWw6IGNhbm5vdCB1c2UgdGhlIGNhbWVyYSB3aGVuIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQUJMRUQsCisgICAgICAgICAgICAgICAgIkNhbGxlciBcIiVzXCIgKFBJRCAlZCwgVUlEICVkKSBjYW5ub3Qgb3BlbiBjYW1lcmEgXCIlc1wiIHdoZW4gc2Vuc29yIHByaXZhY3kgIgorICAgICAgICAgICAgICAgICJpcyBlbmFibGVkIiwgY2xpZW50TmFtZTguc3RyaW5nKCksIGNsaWVudFVpZCwgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgfQorCiAgICAgLy8gT25seSB1c2UgcGFzc2VkIGluIGNsaWVudFBpZCB0byBjaGVjayBwZXJtaXNzaW9uLiBVc2UgY2FsbGluZyBQSUQgYXMgdGhlIGNsaWVudCBQSUQgdGhhdCdzCiAgICAgLy8gY29ubmVjdGVkIHRvIGNhbWVyYSBzZXJ2aWNlIGRpcmVjdGx5LgogICAgIG9yaWdpbmFsQ2xpZW50UGlkID0gY2xpZW50UGlkOwpAQCAtOTQ1LDcgKzk4Nyw3IEBACiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNoZWNrSWZEZXZpY2VJc1VzYWJsZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3QgewogICAgIGF1dG8gY2FtZXJhU3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYW1lcmFTdGF0ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGludmFsaWQgY2FtZXJhIElEICVzKSIsIGNhbGxpbmdQaWQsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOwpAQCAtMTE0OSw3ICsxMTkxLDcgQEAKICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CiAKICAgICAvLyBDbGVhciBjYWxsZXIgaWRlbnRpdHkgdGVtcG9yYXJpbHkgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgIC8vIERlc3Ryb3kgZXZpY3RlZCBjbGllbnRzCiAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZENsaWVudHMpIHsKQEAgLTExNTcsNyArMTE5OSw3IEBACiAgICAgICAgIGktPmdldFZhbHVlKCktPmRpc2Nvbm5lY3QoKTsgLy8gQ2xpZW50cyB3aWxsIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGFjdGl2ZSBjbGllbnQgbGlzdAogICAgIH0KIAotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CiAgICAgICAgIEFMT0dWKCIlczogV2FpdGluZyBmb3IgZGlzY29ubmVjdCB0byBjb21wbGV0ZSBmb3IgY2xpZW50IGZvciBkZXZpY2UgJXMgKFBJRCAlIiBQUklkMzIgIikiLApAQCAtMTIwNywxMSArMTI0OSwxMCBAQAogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKLSAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOworICAgICAgICAgICAgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjM0LDEyICsxMjc1LDExIEBACiAgICAgU3RhdHVzIHJldCA9IFN0YXR1czo6b2soKTsKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgYXBpMUNhbWVyYUlkLCBoYWxWZXJzaW9uLAotICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIHRydWUsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmc4KCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEyNDgsNiArMTI4OCwxOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK2Jvb2wgQ2FtZXJhU2VydmljZTo6c2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjb25zdCBTdHJpbmc4ICYgY2FtZXJhSWQpIHsKKyAgICAvLyBJZiB0aGUgdGhyZWFkIHNlcnZpbmcgdGhpcyBjYWxsIGlzIG5vdCBhIGh3YmluZGVyIHRocmVhZCBhbmQgdGhlIGNhbGxlcgorICAgIC8vIGlzbid0IHRoZSBjYW1lcmFzZXJ2ZXIgaXRzZWxmLCBhbmQgdGhlIGNhbWVyYSBpZCBiZWluZyByZXF1ZXN0ZWQgaXMgdG8gYmUKKyAgICAvLyBwdWJsaWNhbGx5IGhpZGRlbiwgd2Ugc2hvdWxkIHJlamVjdCB0aGUgY29ubmVjdGlvbi4KKyAgICBpZiAoIWhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkgJiYKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkgJiYKKyAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjYW1lcmFJZC5jX3N0cigpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdERldmljZSgKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiBjYW1lcmFDYiwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLApAQCAtMTI2MCwxNSArMTMxMiwxNCBAQAogICAgIFN0YXR1cyByZXQgPSBTdGF0dXM6Om9rKCk7CiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQpOwogICAgIHNwPENhbWVyYURldmljZUNsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKKwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3MsQ2FtZXJhRGV2aWNlQ2xpZW50PihjYW1lcmFDYiwgaWQsCiAgICAgICAgICAgICAvKmFwaTFDYW1lcmFJZCovLTEsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCi0gICAgICAgICAgICAvKm91dCovY2xpZW50KTsKKyAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjgwLDcgKzEzMzEsNyBAQAogdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAotICAgICAgICBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwKICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSkgewogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogCkBAIC0xMjkzLDYgKzEzNDQsMTQgQEAKICAgICAgICAgICAgIChoYWxWZXJzaW9uID09IC0xKSA/ICJkZWZhdWx0IiA6IHN0ZDo6dG9fc3RyaW5nKGhhbFZlcnNpb24pLmNfc3RyKCksCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGVmZmVjdGl2ZUFwaUxldmVsKSk7CiAKKyAgICBpZiAoc2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjYW1lcmFJZCkpIHsKKyAgICAgICAgQUxPR1coIkF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBzeXN0ZW0tb25seSBjYW1lcmEgaWQgJXMsIGNvbm5lY3Rpb24gcmVqZWN0ZWQiLAorICAgICAgICAgICAgICBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gY2FtZXJhIGRldmljZSB3aXRoIElEIFwiJXNcIiBjdXJyZW50bHkgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworCisgICAgfQogICAgIHNwPENMSUVOVD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICB7CiAgICAgICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCkBAIC0xMzY1LDcgKzE0MjQsNyBAQAogICAgICAgICBzcDxCYXNpY0NsaWVudD4gdG1wID0gbnVsbHB0cjsKICAgICAgICAgaWYoIShyZXQgPSBtYWtlQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsCi0gICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlLAorICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwKICAgICAgICAgICAgICAgICBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgICAgICAgICAvKm91dCovJnRtcCkpLmlzT2soKSkgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTE0NDksNyArMTUwOCw3IEBACiAgICAgfQogCiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICAvLyB2ZXJpZnkgaWQgaXMgdmFsaWQuCiAgICAgYXV0byBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGlkKTsKQEAgLTE1NTYsNyArMTYxNSw3IEBACiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpub3RpZnlTeXN0ZW1FdmVudChpbnQzMl90IGV2ZW50SWQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBhcmdzKSB7Ci0gICAgY29uc3QgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgcGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBjb25zdCBpbnQgc2VsZlBpZCA9IGdldHBpZCgpOwogCiAgICAgLy8gUGVybWlzc2lvbiBjaGVja3MKQEAgLTE1NjUsNyArMTYyNCw3IEBACiAgICAgICAgIC8vIHBlcm1pc3Npb25zIHRvIG5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2UgYWJvdXQgc3lzdGVtIGV2ZW50cwogICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIikpKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6IGNhbm5vdCBzZW5kIHVwZGF0ZXMgdG8gY2FtZXJhIHNlcnZpY2UgYWJvdXQgc3lzdGVtIgogICAgICAgICAgICAgICAgICAgICAiIGV2ZW50cyBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwogICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfUEVSTUlTU0lPTl9ERU5JRUQsCkBAIC0xNTc4LDkgKzE2MzcsMTAgQEAKIAogICAgIHN3aXRjaChldmVudElkKSB7CiAgICAgICAgIGNhc2UgSUNhbWVyYVNlcnZpY2U6OkVWRU5UX1VTRVJfU1dJVENIRUQ6IHsKLSAgICAgICAgICAgIC8vIFRyeSB0byByZWdpc3RlciBmb3IgVUlEIHBvbGljeSB1cGRhdGVzLCBpbiBjYXNlIHdlJ3JlIHJlY292ZXJpbmcKKyAgICAgICAgICAgIC8vIFRyeSB0byByZWdpc3RlciBmb3IgVUlEIGFuZCBzZW5zb3IgcHJpdmFjeSBwb2xpY3kgdXBkYXRlcywgaW4gY2FzZSB3ZSdyZSByZWNvdmVyaW5nCiAgICAgICAgICAgICAvLyBmcm9tIGEgc3lzdGVtIHNlcnZlciBjcmFzaAogICAgICAgICAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgICAgICAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CiAgICAgICAgICAgICBkb1VzZXJTd2l0Y2goLypuZXdVc2VySWRzKi8gYXJncyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTU5NCw5ICsxNjU0LDcyIEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpub3RpZnlNb25pdG9yZWRVaWRzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOworCisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgYXV0byByZXQgPSBpdC5zZWNvbmQtPmdldExpc3RlbmVyKCktPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB0cmlnZ2VyIHBlcm1pc3Npb24gY2FsbGJhY2s6ICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICByZXQuZXhjZXB0aW9uQ29kZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworU3RhdHVzIENhbWVyYVNlcnZpY2U6Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3U3RhdGUpIHsKKyAgICBjb25zdCBpbnQgcGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgc2VsZlBpZCA9IGdldHBpZCgpOworCisgICAgLy8gUGVybWlzc2lvbiBjaGVja3MKKyAgICBpZiAocGlkICE9IHNlbGZQaWQpIHsKKyAgICAgICAgLy8gRW5zdXJlIHdlJ3JlIGJlaW5nIGNhbGxlZCBieSBzeXN0ZW1fc2VydmVyLCBvciBzaW1pbGFyIHByb2Nlc3Mgd2l0aAorICAgICAgICAvLyBwZXJtaXNzaW9ucyB0byBub3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMKKyAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBX1NFTkRfU1lTVEVNX0VWRU5UUyIpKSkgeworICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6IGNhbm5vdCBzZW5kIHVwZGF0ZXMgdG8gY2FtZXJhIHNlcnZpY2UgYWJvdXQgZGV2aWNlIgorICAgICAgICAgICAgICAgICAgICAiIHN0YXRlIGNoYW5nZXMgZnJvbSBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX1BFUk1JU1NJT05fREVOSUVELAorICAgICAgICAgICAgICAgICAgICAiTm8gcGVybWlzc2lvbiB0byBzZW5kIHVwZGF0ZXMgdG8gY2FtZXJhIHNlcnZpY2UgYWJvdXQgZGV2aWNlIHN0YXRlIgorICAgICAgICAgICAgICAgICAgICAiIGNoYW5nZXMgZnJvbSBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU7CisgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG5ld0RldmljZVN0YXRle307CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQpIHsKKyAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkJBQ0tfQ09WRVJFRDsKKyAgICB9CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9GUk9OVF9DT1ZFUkVEKSB7CisgICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpGUk9OVF9DT1ZFUkVEOworICAgIH0KKyAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0ZPTERFRCkgeworICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6Rk9MREVEOworICAgIH0KKyAgICAvLyBPbmx5IG1hcCB2ZW5kb3IgYml0cyBkaXJlY3RseQorICAgIHVpbnQ2NF90IHZlbmRvckJpdHMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmV3U3RhdGUpICYgMHhGRkZGRkZGRjAwMDAwMDAwbDsKKyAgICBuZXdEZXZpY2VTdGF0ZSB8PSB2ZW5kb3JCaXRzOworCisgICAgQUxPR1YoIiVzOiBOZXcgZGV2aWNlIHN0YXRlIDB4JSIgUFJJeDY0LCBfX0ZVTkNUSU9OX18sIG5ld0RldmljZVN0YXRlKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtU2VydmljZUxvY2spOworICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG5ld0RldmljZVN0YXRlKTsKKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lcihjb25zdCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gKmNhbWVyYVN0YXR1c2VzKSB7CisgICAgcmV0dXJuIGFkZExpc3RlbmVySGVscGVyKGxpc3RlbmVyLCBjYW1lcmFTdGF0dXNlcyk7Cit9CisKK1N0YXR1cyBDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lckhlbHBlcihjb25zdCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gKmNhbWVyYVN0YXR1c2VzLAorICAgICAgICBib29sIGlzVmVuZG9yTGlzdGVuZXIpIHsKKwogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBBTE9HVigiJXM6IEFkZCBsaXN0ZW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbGlzdGVuZXIuZ2V0KCkpOwpAQCAtMTYxMCwyMSArMTczMywzNyBAQAogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKLSAgICAgICAgZm9yIChhdXRvJiBpdCA6IG1MaXN0ZW5lckxpc3QpIHsKLSAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcihpdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBtTGlzdGVuZXJMaXN0KSB7CisgICAgICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoaXQuc2Vjb25kLT5nZXRMaXN0ZW5lcigpKSA9PSBJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFRyaWVkIHRvIGFkZCBsaXN0ZW5lciAlcCB3aGljaCB3YXMgYWxyZWFkeSBzdWJzY3JpYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0FMUkVBRFlfRVhJU1RTLCAiTGlzdGVuZXIgYWxyZWFkeSByZWdpc3RlcmVkIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBtTGlzdGVuZXJMaXN0LnB1c2hfYmFjayhsaXN0ZW5lcik7CisgICAgICAgIGF1dG8gY2xpZW50VWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgc3A8U2VydmljZUxpc3RlbmVyPiBzZXJ2aWNlTGlzdGVuZXIgPSBuZXcgU2VydmljZUxpc3RlbmVyKHRoaXMsIGxpc3RlbmVyLCBjbGllbnRVaWQpOworICAgICAgICBhdXRvIHJldCA9IHNlcnZpY2VMaXN0ZW5lci0+aW5pdGlhbGl6ZSgpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiRmFpbGVkIHRvIGluaXRpYWxpemUgc2VydmljZSBsaXN0ZW5lcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXJMaXN0LmVtcGxhY2VfYmFjayhpc1ZlbmRvckxpc3RlbmVyLCBzZXJ2aWNlTGlzdGVuZXIpOworICAgICAgICBtVWlkUG9saWN5LT5yZWdpc3Rlck1vbml0b3JVaWQoY2xpZW50VWlkKTsKICAgICB9CiAKICAgICAvKiBDb2xsZWN0IGN1cnJlbnQgZGV2aWNlcyBhbmQgc3RhdHVzICovCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CiAgICAgICAgIGZvciAoYXV0byYgaSA6IG1DYW1lcmFTdGF0ZXMpIHsKKyAgICAgICAgICAgIGlmICghaXNWZW5kb3JMaXN0ZW5lciAmJgorICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShpLmZpcnN0LmNfc3RyKCkpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNhbm5vdCBhZGQgcHVibGljIGxpc3RlbmVyIGZvciBoaWRkZW4gc3lzdGVtLW9ubHkgJXMgZm9yIHBpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgaS5maXJzdC5jX3N0cigpLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhbWVyYVN0YXR1c2VzLT5lbXBsYWNlX2JhY2soaS5maXJzdCwgbWFwVG9JbnRlcmZhY2UoaS5zZWNvbmQtPmdldFN0YXR1cygpKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjU5LDcgKzE3OTgsOSBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1MaXN0ZW5lckxpc3QuYmVnaW4oKTsgaXQgIT0gbUxpc3RlbmVyTGlzdC5lbmQoKTsgaXQrKykgewotICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKCppdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CisgICAgICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoaXQtPnNlY29uZC0+Z2V0TGlzdGVuZXIoKSkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgbVVpZFBvbGljeS0+dW5yZWdpc3Rlck1vbml0b3JVaWQoaXQtPnNlY29uZC0+Z2V0TGlzdGVuZXJVaWQoKSk7CisgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpLT51bmxpbmtUb0RlYXRoKGl0LT5zZWNvbmQpOwogICAgICAgICAgICAgICAgIG1MaXN0ZW5lckxpc3QuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgICAgICAgICB9CkBAIC0xNzE3LDcgKzE4NTgsNyBAQAogICAgIH0KIAogICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihpZCk7Ci0gICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICBzd2l0Y2ggKGRldmljZVZlcnNpb24pIHsKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKQEAgLTE3MzQsNiArMTg3NSw3IEBACiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQ6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6CiAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlcyB1c2VzIEhBTDMuMiBvciBuZXdlciwgc3VwcG9ydHMgYXBpMS9hcGkyIGRpcmVjdGx5IiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOwpAQCAtMTc1NCw2ICsxODk2LDE4IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAorU3RhdHVzIENhbWVyYVNlcnZpY2U6OmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAorICAgICAgICAvKm91dCovIGJvb2wgKmlzU3VwcG9ydGVkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIGNvbnN0IFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkKTsKKworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYSBJRCA9ICVzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgKmlzU3VwcG9ydGVkID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+aXNIaWRkZW5QaHlzaWNhbENhbWVyYShpZC5zdHJpbmcoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUJ5Q2xpZW50KGNvbnN0IEJhc2ljQ2xpZW50KiBjbGllbnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogICAgIGZvciAoYXV0byYgaSA6IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpKSB7CkBAIC0xOTAxLDEzICsyMDU1LDEzIEBACiAgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOwogCiAgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAKICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CiAgICAgICAgIGktPmRpc2Nvbm5lY3QoKTsKICAgICB9CiAKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKICAgICAvLyBSZWFjcXVpcmUgbVNlcnZpY2VMb2NrCiAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKQEAgLTE5NzUsNyArMjEyOSw2IEBACiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKIAotCiAgICAgLy8gUGVybWlzc2lvbiBjaGVja3MKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTSEVMTF9DT01NQU5EX1RSQU5TQUNUSU9OOiB7CkBAIC0yMDk4LDcgKzIyNTEsNyBAQAogICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpLAogICAgICAgICBtQ2FtZXJhSWQoYXBpMUNhbWVyYUlkKQogewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDbGllbnQ6OkNsaWVudCBFIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIG1DYW1lcmFJZCk7CiAKICAgICBtUmVtb3RlQ2FsbGJhY2sgPSBjYW1lcmFDbGllbnQ7CkBAIC0yMTg1LDYgKzIzMzgsOCBAQAogICAgIHNDYW1lcmFTZXJ2aWNlLT5yZW1vdmVCeUNsaWVudCh0aGlzKTsKICAgICBzQ2FtZXJhU2VydmljZS0+bG9nRGlzY29ubmVjdGVkKG1DYW1lcmFJZFN0ciwgbUNsaWVudFBpZCwKICAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKSk7CisgICAgc0NhbWVyYVNlcnZpY2UtPm1DYW1lcmFQcm92aWRlck1hbmFnZXItPnJlbW92ZVJlZihDYW1lcmFQcm92aWRlck1hbmFnZXI6OkRldmljZU1vZGU6OkNBTUVSQSwKKyAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5jX3N0cigpKTsKIAogICAgIHNwPElCaW5kZXI+IHJlbW90ZSA9IGdldFJlbW90ZSgpOwogICAgIGlmIChyZW1vdGUgIT0gbnVsbHB0cikgewpAQCAtMjIwNyw3ICsyMzYyLDcgQEAKICAgICAvLyBObyBkdW1waW5nIG9mIGNsaWVudHMgZGlyZWN0bHkgb3ZlciBCaW5kZXIsCiAgICAgLy8gbXVzdCBnbyB0aHJvdWdoIENhbWVyYVNlcnZpY2U6OmR1bXAKICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyhTTl9FVkVOVF9MT0dfSUQsICIyNjI2NTQwMyIsCi0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksIE5VTEwsIDApOworICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgTlVMTCwgMCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMjcyLDYgKzI0MjcsOCBAQAogICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKElDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9PUEVOLAogICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsIGFwaUxldmVsKTsKIAorICAgIHNDYW1lcmFTZXJ2aWNlLT5tVWlkUG9saWN5LT5yZWdpc3Rlck1vbml0b3JVaWQobUNsaWVudFVpZCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIzMDksNiArMjQ2Niw4IEBACiAgICAgfQogICAgIG1PcHNDYWxsYmFjay5jbGVhcigpOwogCisgICAgc0NhbWVyYVNlcnZpY2UtPm1VaWRQb2xpY3ktPnVucmVnaXN0ZXJNb25pdG9yVWlkKG1DbGllbnRVaWQpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMzQ0LDcgKzI1MDMsNyBAQAogCiAgICAgLy8gUmVzZXQgdGhlIGNsaWVudCBQSUQgdG8gYWxsb3cgc2VydmVyLWluaXRpYXRlZCBkaXNjb25uZWN0LAogICAgIC8vIGFuZCB0byBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgYnkgY2xpZW50LgotICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgbUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7IC8vIGEgZHVtbXkgcmVzdWx0IChpbnZhbGlkKQogICAgIG5vdGlmeUVycm9yKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQUJMRUQsIHJlc3VsdEV4dHJhcyk7CiAgICAgZGlzY29ubmVjdCgpOwpAQCAtMjM5OSw3ICsyNTU4LDcgQEAKICAgICBpZiAobVJlZ2lzdGVyZWQpIHJldHVybjsKICAgICBhbS5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMsIEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0dPTkUKICAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfSURMRQotICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUsCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRSB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX1BST0NTVEFURSwKICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLAogICAgICAgICAgICAgU3RyaW5nMTYoImNhbWVyYXNlcnZlciIpKTsKICAgICBzdGF0dXNfdCByZXMgPSBhbS5saW5rVG9EZWF0aCh0aGlzKTsKQEAgLTI0NDUsNiArMjYwNCw1MSBAQAogICAgIH0KIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwgaW50MzJfdCBwcm9jU3RhdGUsCisgICAgICAgIGludDY0X3QgLypwcm9jU3RhdGVTZXEqLykgeworICAgIGJvb2wgcHJvY1N0YXRlQ2hhbmdlID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgICAgICBpZiAoKG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKSAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgJiYKKyAgICAgICAgICAgICAgICAobU1vbml0b3JlZFVpZHNbdWlkXS5maXJzdCAhPSBwcm9jU3RhdGUpKSB7CisgICAgICAgICAgICBtTW9uaXRvcmVkVWlkc1t1aWRdLmZpcnN0ID0gcHJvY1N0YXRlOworICAgICAgICAgICAgcHJvY1N0YXRlQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcm9jU3RhdGVDaGFuZ2UpIHsKKyAgICAgICAgc3A8Q2FtZXJhU2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2VydmljZS0+bm90aWZ5TW9uaXRvcmVkVWlkcygpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6cmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgYXV0byBpdCA9IG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKTsKKyAgICBpZiAoaXQgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBtTW9uaXRvcmVkVWlkcy5lbXBsYWNlKAorICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjx1aWRfdCwgc3RkOjpwYWlyPGludDMyX3QsIHNpemVfdD4+ICh1aWQsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBzaXplX3Q+IChBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfTk9ORVhJU1RFTlQsIDEpKSk7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6dW5yZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgdWlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKyAgICBhdXRvIGl0ID0gbU1vbml0b3JlZFVpZHMuZmluZCh1aWQpOworICAgIGlmIChpdCAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLnNlY29uZC0tOworICAgICAgICBpZiAoaXQtPnNlY29uZC5zZWNvbmQgPT0gMCkgeworICAgICAgICAgICAgbU1vbml0b3JlZFVpZHMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gdW5yZWdpc3RlciB1aWQ6ICVkIHdoaWNoIGlzIG5vdCBtb25pdG9yZWQhIiwgX19GVU5DVElPTl9fLCB1aWQpOworICAgIH0KK30KKwogYm9vbCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzVWlkQWN0aXZlKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOwogICAgIHJldHVybiBpc1VpZEFjdGl2ZUxvY2tlZCh1aWQsIGNhbGxpbmdQYWNrYWdlKTsKQEAgLTI1NDUsNiArMjc0OSw1OSBAQAogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgICAgIFNlbnNvclByaXZhY3lQb2xpY3kKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6cmVnaXN0ZXJTZWxmKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgIGlmIChtUmVnaXN0ZXJlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyIHNwbTsKKyAgICBzcG0uYWRkU2Vuc29yUHJpdmFjeUxpc3RlbmVyKHRoaXMpOworICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IHNwbS5pc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CisgICAgc3RhdHVzX3QgcmVzID0gc3BtLmxpbmtUb0RlYXRoKHRoaXMpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgbVJlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICBBTE9HVigiU2Vuc29yUHJpdmFjeVBvbGljeTogUmVnaXN0ZXJlZCB3aXRoIFNlbnNvclByaXZhY3lNYW5hZ2VyIik7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnVucmVnaXN0ZXJTZWxmKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyIHNwbTsKKyAgICBzcG0ucmVtb3ZlU2Vuc29yUHJpdmFjeUxpc3RlbmVyKHRoaXMpOworICAgIHNwbS51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7CisgICAgQUxPR1YoIlNlbnNvclByaXZhY3lQb2xpY3k6IFVucmVnaXN0ZXJlZCB3aXRoIFNlbnNvclByaXZhY3lNYW5hZ2VyIik7Cit9CisKK2Jvb2wgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICByZXR1cm4gbVNlbnNvclByaXZhY3lFbmFibGVkOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpvblNlbnNvclByaXZhY3lDaGFuZ2VkKGJvb2wgZW5hYmxlZCkgeworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorICAgIC8vIGlmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBibG9jayBhbGwgY2xpZW50cyBmcm9tIGFjY2Vzc2luZyB0aGUgY2FtZXJhCisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgc3A8Q2FtZXJhU2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2VydmljZS0+YmxvY2tBbGxDbGllbnRzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIC8qd2hvKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICBBTE9HVigiU2Vuc29yUHJpdmFjeVBvbGljeTogU2Vuc29yUHJpdmFjeU1hbmFnZXIgaGFzIGRpZWQiKTsKKyAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgICAgICAgICAgICAgIENhbWVyYVN0YXRlCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTI3MDUsOCArMjk2Miw4IEBACiAKICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKICAgICAgICAgZHByaW50ZihmZCwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIENhbWVyYVNlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKLSAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtU2VydmljZUxvY2spOwpAQCAtMjg3OSw3ICszMTM2LDcgQEAKICAgICAgICogYmluZGVyIGRyaXZlcgogICAgICAgKi8KICAgICAvLyBQSUQgaGVyZSBpcyBhcHByb3hpbWF0ZSBhbmQgY2FuIGJlIHdyb25nLgotICAgIGxvZ0NsaWVudERpZWQoZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KCJCaW5kZXIgZGllZCB1bmV4cGVjdGVkbHkiKSk7CisgICAgbG9nQ2xpZW50RGllZChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KCJCaW5kZXIgZGllZCB1bmV4cGVjdGVkbHkiKSk7CiAKICAgICAvLyBjaGVjayB0b3JjaCBjbGllbnQKICAgICBoYW5kbGVUb3JjaENsaWVudEJpbmRlckRpZWQod2hvKTsKQEAgLTI5MzUsNyArMzE5MiwxNCBAQAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CiAKICAgICAgICAgICAgIGZvciAoYXV0byYgbGlzdGVuZXIgOiBtTGlzdGVuZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShzdGF0dXMpLCBTdHJpbmcxNihjYW1lcmFJZCkpOworICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXIuZmlyc3QgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+aXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKGNhbWVyYUlkLmNfc3RyKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTa2lwcGluZyBjYW1lcmEgZGlzY292ZXJ5IGNhbGxiYWNrIGZvciBzeXN0ZW0tb25seSBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlY29uZC0+Z2V0TGlzdGVuZXIoKS0+b25TdGF0dXNDaGFuZ2VkKG1hcFRvSW50ZXJmYWNlKHN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNihjYW1lcmFJZCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIH0KQEAgLTMwMzAsNiArMzI5NCwxOCBAQAogICAgIH0KIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpibG9ja0FsbENsaWVudHMoKSB7CisgICAgY29uc3QgYXV0byBjbGllbnRzID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCk7CisgICAgZm9yIChhdXRvJiBjdXJyZW50IDogY2xpZW50cykgeworICAgICAgICBpZiAoY3VycmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvIGJhc2ljQ2xpZW50ID0gY3VycmVudC0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChiYXNpY0NsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYmFzaWNDbGllbnQtPmJsb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8vIE5PVEU6IFRoaXMgaXMgYSByZW1vdGUgQVBJIC0gbWFrZSBzdXJlIGFsbCBhcmdzIGFyZSB2YWxpZGF0ZWQKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OnNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01hbmFnZUNhbWVyYVBlcm1pc3Npb24sIG51bGxwdHIsIG51bGxwdHIpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggOTkxYzc3MC4uMzQ0ZGQ5MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CbkNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuU2Vuc29yUHJpdmFjeUxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5Lmg+CiAKQEAgLTE1MywxMiArMTU0LDE5IEBACiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBub3RpZnlTeXN0ZW1FdmVudChpbnQzMl90IGV2ZW50SWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXJncyk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3U3RhdGUpOworCiAgICAgLy8gT0sgPSBzdXBwb3J0cyBhcGkgb2YgdGhhdCB2ZXJzaW9uLCAtRU9QTk9UU1VQUCA9IGRvZXMgbm90IHN1cHBvcnQKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIHN1cHBvcnRzQ2FtZXJhQXBpKAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQzMl90IGFwaVZlcnNpb24sCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisKICAgICAvLyBFeHRyYSBwZXJtaXNzaW9ucyBjaGVja3MKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CkBAIC0xNjcsNiArMTc1LDEzIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgYmluZGVyOjpTdGF0dXMgICAgICBhZGRMaXN0ZW5lckhlbHBlcihjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4qIGNhbWVyYVN0YXR1c2VzLCBib29sIGlzVmVuZG9yID0gZmFsc2UpOworCisgICAgLy8gTW9uaXRvcmVkIFVJRHMgYXZhaWxhYmlsaXR5IG5vdGlmaWNhdGlvbgorICAgIHZvaWQgICAgICAgICAgICAgICAgbm90aWZ5TW9uaXRvcmVkVWlkcygpOworCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2xpZW50IGZ1bmN0aW9uYWxpdHkKIApAQCAtNTMxLDEwICs1NDYsMTQgQEAKICAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKTsKICAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpOworICAgICAgICB2b2lkIG9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwgaW50MzJfdCBwcm9jU3RhdGUsIGludDY0X3QgcHJvY1N0YXRlU2VxKTsKIAogICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UsIGJvb2wgYWN0aXZlKTsKICAgICAgICAgdm9pZCByZW1vdmVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKTsKIAorICAgICAgICB2b2lkIHJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIHVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCk7CisKICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CiAgICAgcHJpdmF0ZToKQEAgLTU0NSwxMSArNTY0LDQwIEBACiAgICAgICAgIGJvb2wgbVJlZ2lzdGVyZWQ7CiAgICAgICAgIHdwPENhbWVyYVNlcnZpY2U+IG1TZXJ2aWNlOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IG1BY3RpdmVVaWRzOworICAgICAgICAvLyBNb25pdG9yZWQgdWlkIG1hcCB0byBjYWNoZWQgcHJvY1N0YXRlIGFuZCByZWZDb3VudCBwYWlyCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGludDMyX3QsIHNpemVfdD4+IG1Nb25pdG9yZWRVaWRzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1PdmVycmlkZVVpZHM7CiAgICAgfTsgLy8gY2xhc3MgVWlkUG9saWN5CiAKKyAgICAvLyBJZiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYWxsIGFwcHMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBhY3RpdmUsIHNob3VsZCBiZQorICAgIC8vIHByZXZlbnRlZCBmcm9tIGFjY2Vzc2luZyB0aGUgY2FtZXJhLgorICAgIGNsYXNzIFNlbnNvclByaXZhY3lQb2xpY3kgOiBwdWJsaWMgaGFyZHdhcmU6OkJuU2Vuc29yUHJpdmFjeUxpc3RlbmVyLAorICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBleHBsaWNpdCBTZW5zb3JQcml2YWN5UG9saWN5KHdwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UpCisgICAgICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1TZW5zb3JQcml2YWN5RW5hYmxlZChmYWxzZSksIG1SZWdpc3RlcmVkKGZhbHNlKSB7fQorCisgICAgICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOworICAgICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOworCisgICAgICAgICAgICBib29sIGlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHdwPENhbWVyYVNlcnZpY2U+IG1TZXJ2aWNlOworICAgICAgICAgICAgTXV0ZXggbVNlbnNvclByaXZhY3lMb2NrOworICAgICAgICAgICAgYm9vbCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7CisgICAgICAgICAgICBib29sIG1SZWdpc3RlcmVkOworICAgIH07CisKICAgICBzcDxVaWRQb2xpY3k+IG1VaWRQb2xpY3k7CiAKKyAgICBzcDxTZW5zb3JQcml2YWN5UG9saWN5PiBtU2Vuc29yUHJpdmFjeVBvbGljeTsKKwogICAgIC8vIERlbGF5LWxvYWQgdGhlIENhbWVyYSBIQUwgbW9kdWxlCiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKIApAQCAtNTgxLDEyICs2MjksMTUgQEAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQsCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4qIHBhcnRpYWwpOwogCisgICAgLy8gU2hvdWxkIGFuIG9wZXJhdGlvbiBhdHRlbXB0IG9uIGEgY2FtZXJhSWQgYmUgcmVqZWN0ZWQsIGlmIHRoZSBjYW1lcmEgaWQgaXMKKyAgICAvLyBhZHZlcnRpc2VkIGFzIGEgcHVibGljYWxseSBoaWRkZW4gc2VjdXJlIGNhbWVyYSwgYnkgdGhlIGNhbWVyYSBIQUwgPworICAgIGJvb2wgc2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjb25zdCBTdHJpbmc4ICYgY2FtZXJhSWQpOworCiAgICAgLy8gU2luZ2xlIGltcGxlbWVudGF0aW9uIHNoYXJlZCBiZXR3ZWVuIHRoZSB2YXJpb3VzIGNvbm5lY3QgY2FsbHMKICAgICB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogICAgIGJpbmRlcjo6U3RhdHVzIGNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKLSAgICAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIGxlZ2FjeU1vZGUsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCisgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwKICAgICAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpOwogCiAgICAgLy8gTG9jayBndWFyZGluZyBjYW1lcmEgc2VydmljZSBzdGF0ZQpAQCAtNzQ3LDggKzc5OCwzNCBAQAogCiAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOwogCisgICAgY2xhc3MgU2VydmljZUxpc3RlbmVyIDogcHVibGljIHZpcnR1YWwgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTZXJ2aWNlTGlzdGVuZXIoc3A8Q2FtZXJhU2VydmljZT4gcGFyZW50LCBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgIGludCB1aWQpIDogbVBhcmVudChwYXJlbnQpLCBtTGlzdGVuZXIobGlzdGVuZXIpLCBtTGlzdGVuZXJVaWQodWlkKSB7fQorCisgICAgICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBJSW50ZXJmYWNlOjphc0JpbmRlcihtTGlzdGVuZXIpLT5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJi8qd2hvKi8pIHsKKyAgICAgICAgICAgICAgICBhdXRvIHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPnJlbW92ZUxpc3RlbmVyKG1MaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgZ2V0TGlzdGVuZXJVaWQoKSB7IHJldHVybiBtTGlzdGVuZXJVaWQ7IH0KKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBnZXRMaXN0ZW5lcigpIHsgcmV0dXJuIG1MaXN0ZW5lcjsgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtUGFyZW50OworICAgICAgICAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICAgICAgICAgIGludCBtTGlzdGVuZXJVaWQ7CisgICAgfTsKKwogICAgIC8vIEd1YXJkZWQgYnkgbVN0YXR1c0xpc3RlbmVyTXV0ZXgKLSAgICBzdGQ6OnZlY3RvcjxzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4+IG1MaXN0ZW5lckxpc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGJvb2wsIHNwPFNlcnZpY2VMaXN0ZW5lcj4+PiBtTGlzdGVuZXJMaXN0OworCiAgICAgTXV0ZXggICAgICAgbVN0YXR1c0xpc3RlbmVyTG9jazsKIAogICAgIC8qKgpAQCAtODIwLDYgKzg5Nyw5IEBACiAgICAgLy8gQmxvY2tzIGFsbCBjbGllbnRzIGZyb20gdGhlIFVJRAogICAgIHZvaWQgYmxvY2tDbGllbnRzRm9yVWlkKHVpZF90IHVpZCk7CiAKKyAgICAvLyBCbG9ja3MgYWxsIGFjdGl2ZSBjbGllbnRzLgorICAgIHZvaWQgYmxvY2tBbGxDbGllbnRzKCk7CisKICAgICAvLyBPdmVycmlkZXMgdGhlIFVJRCBzdGF0ZSBhcyBpZiBpdCBpcyBpZGxlCiAgICAgc3RhdHVzX3QgaGFuZGxlU2V0VWlkU3RhdGUoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycik7CiAKQEAgLTgzMiwxMCArOTEyLDYgQEAKICAgICAvLyBQcmludHMgdGhlIHNoZWxsIGNvbW1hbmQgaGVscAogICAgIHN0YXR1c190IHByaW50SGVscChpbnQgb3V0KTsKIAotICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpOwotCi0gICAgc3RhdGljIGludCBnZXRDYWxsaW5nVWlkKCk7Ci0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgYXMgYSBmb3JtYXR0ZWQgc3RyaW5nLgogICAgICAqLwpAQCAtODQ0LDcgKzkyMCw3IEBACiAgICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIG1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlLCBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCk7CiAKICAgICBzdGF0dXNfdCBjaGVja0NhbWVyYUFjY2Vzcyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkYWM2OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiY2FtZXJhc2VydmljZV90ZXN0IgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggOGJiMjRkNC4uMTYyYjUwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogI2RlZmluZSBBTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIEFMT0cyKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDIsIF9fVkFfQVJHU19fKTsKQEAgLTQ0LDEwICs0NSw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KIC8vIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKIAogQ2FtZXJhMkNsaWVudDo6Q2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKQEAgLTU4LDggKzU1LDcgQEAKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgYm9vbCBsZWdhY3lNb2RlKToKKyAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYURldmljZUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywKICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCkBAIC02OSw4ICs2NSw2IEBACiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPSBQYXJhbWV0ZXJzOjpESVNDT05ORUNURUQ7Ci0KLSAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiB9CiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgewpAQCAtNDA1LDcgKzM5OSw3IEBACiAKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAvLyBBbGxvdyBib3RoIGNsaWVudCBhbmQgdGhlIGNhbWVyYXNlcnZlciB0byBkaXNjb25uZWN0IGF0IGFsbCB0aW1lcwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCAhPSBtQ2xpZW50UGlkICYmIGNhbGxpbmdQaWQgIT0gbVNlcnZpY2VQaWQpIHJldHVybiByZXM7CiAKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gcmVzOwpAQCAtNDYwLDggKzQ1NCw2IEBACiAKICAgICBtRGV2aWNlLT5kaXNjb25uZWN0KCk7CiAKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci0KICAgICBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKIAogICAgIHJldHVybiByZXM7CkBAIC00NzIsMTQgKzQ2NCwxNCBAQAogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCi0gICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBnZXRDYWxsaW5nUGlkKCkgIT0gbUNsaWVudFBpZCkgeworICAgIGlmIChtQ2xpZW50UGlkICE9IDAgJiYgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtQ2xpZW50UGlkKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDb25uZWN0aW9uIGF0dGVtcHQgZnJvbSBwaWQgJWQ7ICIKICAgICAgICAgICAgICAgICAiY3VycmVudCBsb2NrZWQgdG8gcGlkICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgbUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBtUmVtb3RlQ2FsbGJhY2sgPSBjbGllbnQ7CiAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyA9IGNsaWVudDsKQEAgLTQ5MiwxNiArNDg0LDE2IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IExvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudCBjbGllbnQgcGlkICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogCiAgICAgaWYgKG1DbGllbnRQaWQgPT0gMCkgewotICAgICAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBtQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGlmIChtQ2xpZW50UGlkICE9IGdldENhbGxpbmdQaWQoKSkgeworICAgIGlmIChtQ2xpZW50UGlkICE9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IExvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudGx5IGxvY2tlZCB0byBwaWQgJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgcmV0dXJuIEVCVVNZOwogICAgIH0KIApAQCAtNTEzLDkgKzUwNSw5IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFVubG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50IGNsaWVudCBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAKLSAgICBpZiAobUNsaWVudFBpZCA9PSBnZXRDYWxsaW5nUGlkKCkpIHsKKyAgICBpZiAobUNsaWVudFBpZCA9PSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKSB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLnN0YXRlID09IFBhcmFtZXRlcnM6OlJFQ09SRCB8fAogICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPT0gUGFyYW1ldGVyczo6VklERU9fU05BUFNIT1QpIHsKQEAgLTUyOSw3ICs1MjEsNyBAQAogICAgIH0KIAogICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmxvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudGx5IGxvY2tlZCB0byBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgcmV0dXJuIEVCVVNZOwogfQogCkBAIC0xNDQ3LDEzICsxNDM5LDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgbXNnVHlwZSkgeworc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6dGFrZVBpY3R1cmUoaW50IC8qbXNnVHlwZSovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIGludCB0YWtlUGljdHVyZUNvdW50ZXI7CisgICAgYm9vbCBzaG91bGRTeW5jV2l0aERldmljZSA9IHRydWU7CiAgICAgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgICAgICBzd2l0Y2ggKGwubVBhcmFtZXRlcnMuc3RhdGUpIHsKQEAgLTE1MzksMTQgKzE1MzIsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgICAgICAgICAgbVpzbFByb2Nlc3Nvci0+Y2xlYXJac2xRdWV1ZSgpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBzeW5jIHdpdGggdGhlIGRldmljZSBpbiBjYXNlIGZsYXNoIGlzIHR1cm5lZCBvbiwKKyAgICAgICAgLy8gdGhlIGNhbWVyYSBkZXZpY2Ugc3VnZ2VzdHMgdGhhdCBmbGFzaCBpcyBuZWVkZWQgKEFFIHN0YXRlIEZMQVNIX1JFUVVJUkVEKQorICAgICAgICAvLyBvciB3ZSBhcmUgaW4gc29tZSBvdGhlciBBRSBzdGF0ZSBkaWZmZXJlbnQgZnJvbSBDT05WRVJHRUQgdGhhdCBtYXkgbmVlZAorICAgICAgICAvLyBwcmVjYXB0dXJlIHRyaWdnZXIuCisgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLmZsYXNoTW9kZSAhPSBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09OICYmCisgICAgICAgICAgICAgICAgKGwubVBhcmFtZXRlcnMuYWVTdGF0ZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfQ09OVkVSR0VEKSkgeworICAgICAgICAgICAgc2hvdWxkU3luY1dpdGhEZXZpY2UgID0gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oa1Rha2VwaWN0dXJlTGFiZWwsIHRha2VQaWN0dXJlQ291bnRlcik7CiAKLSAgICAvLyBOZWVkIEhBTCB0byBoYXZlIGNvcnJlY3Qgc2V0dGluZ3MgYmVmb3JlIChwb3NzaWJseSkgdHJpZ2dlcmluZyBwcmVjYXB0dXJlCi0gICAgc3luY1dpdGhEZXZpY2UoKTsKKyAgICAvLyBNYWtlIHN1cmUgSEFMIGhhcyBjb3JyZWN0IHNldHRpbmdzIGluIGNhc2UgcHJlY2FwdHVyZSB0cmlnZ2VyIGlzIG5lZWRlZC4KKyAgICBpZiAoc2hvdWxkU3luY1dpdGhEZXZpY2UpIHsKKyAgICAgICAgc3luY1dpdGhEZXZpY2UoKTsKKyAgICB9CiAKLSAgICByZXMgPSBtQ2FwdHVyZVNlcXVlbmNlci0+c3RhcnRDYXB0dXJlKG1zZ1R5cGUpOworICAgIHJlcyA9IG1DYXB0dXJlU2VxdWVuY2VyLT5zdGFydENhcHR1cmUoKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gc3RhcnQgY2FwdHVyZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTU4Myw3ICsxNTg3LDcgQEAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgLy8gVGhlIGNhbWVyYSBzZXJ2aWNlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZ2V0IHRoZSBwYXJhbWV0ZXJzIGF0IGFsbCB0aW1lcwotICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWQoX19GVU5DVElPTl9fKSAhPSBPSykgcmV0dXJuIFN0cmluZzgoKTsKKyAgICBpZiAoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOwogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6UmVhZExvY2sgbChtUGFyYW1ldGVycyk7CiAKQEAgLTE2NjYsMjcgKzE2NzAsNiBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAotICAgIGlmIChtTGVnYWN5TW9kZSkgewotICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGwubVBhcmFtZXRlcnMucGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQotICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBwcm9wZXJ0eV9nZXQoInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiLCB2YWx1ZSwgIjAiKTsKLSAgICBpZiAoc3RybmNtcCh2YWx1ZSwgIjAiLCAyKSAhPSAwKSB7Ci0gICAgICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIGlzIG5vdCBhbGxvd2VkLiBEZW55IGlmIHRoZSBjdXJyZW50Ci0gICAgICAgIC8vIHByb2Nlc3MgaXMgbm90IG1lZGlhc2VydmVyLgotICAgICAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgc2h1dHRlciBzb3VuZC4gUGVybWlzc2lvbiBkZW5pZWQgKHBpZCAlZCkiLAotICAgICAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgbC5tUGFyYW1ldGVycy5wbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTc4NCw2ICsxNzY3LDcgQEAKICAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKICAgICAgICAgICAgIEFMT0dXKCIlczogUmVjZWl2ZWQgcmVjb3ZlcmFibGUgZXJyb3IgJWQgZnJvbSBIQUwgLSBpZ25vcmluZywgcmVxdWVzdElkICUiIFBSSWQzMiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnJvckNvZGUsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOworICAgICAgICAgICAgbUNhcHR1cmVTZXF1ZW5jZXItPm5vdGlmeUVycm9yKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGVyciA9IENBTUVSQV9FUlJPUl9VTktOT1dOOwpAQCAtMTkzNCwxNCArMTkxOCwxNiBAQAogdm9pZCBDYW1lcmEyQ2xpZW50Ojpub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgewogICAgIEFMT0dWKCIlczogQXV0b2V4cG9zdXJlIHN0YXRlIG5vdyAlZCwgbGFzdCB0cmlnZ2VyICVkIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3U3RhdGUsIHRyaWdnZXJJZCk7CisgICAgeworICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOworICAgICAgICAvLyBVcGRhdGUgc3RhdGUKKyAgICAgICAgbC5tUGFyYW1ldGVycy5hZVN0YXRlID0gbmV3U3RhdGU7CisgICAgfQogICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlBdXRvRXhwb3N1cmUobmV3U3RhdGUsIHRyaWdnZXJJZCk7CiB9CiAKIHZvaWQgQ2FtZXJhMkNsaWVudDo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKLSAgICAodm9pZClyZXN1bHRFeHRyYXM7Ci0gICAgKHZvaWQpdGltZXN0YW1wOwotCiAgICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlIiBQUklkMzIgIiBhdCB0aW1lICUiIFBSSWQ2NCwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgdGltZXN0YW1wKTsKICAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDQ0OTI5YzMuLmE5ZWEyNzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC05Niw4ICs5Niw3IEBACiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IGYxMjAzZjkuLmQ2NWFjN2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTI1LDI3ICsyNSwyNCBAQAogI2luY2x1ZGUgImFwaTEvQ2FtZXJhQ2xpZW50LmgiCiAjaW5jbHVkZSAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICNkZWZpbmUgTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIExPRzIoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSk6CisgICAgICAgIGludCBzZXJ2aWNlUGlkKToKICAgICAgICAgQ2xpZW50KGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKSwgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLAogICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgc2VydmljZVBpZCkKIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiAKICAgICBtSGFyZHdhcmUgPSBOVUxMOwpAQCAtNTcsMTQgKzU0LDEzIEBACiAgICAgLy8gQ2FsbGJhY2sgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAogICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBtT3JpZW50YXRpb24gPSBnZXRPcmllbnRhdGlvbigwLCBtQ2FtZXJhRmFjaW5nID09IENBTUVSQV9GQUNJTkdfRlJPTlQpOwotICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IHRydWU7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qbW9uaXRvclRhZ3MqLykgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwpAQCAtMTA1LDcgKzEwMSw3IEBACiAvLyB0ZWFyIGRvd24gdGhlIGNsaWVudAogQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50KCkgewogICAgIG1EZXN0cnVjdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6On5DYW1lcmFDbGllbnQgRSAocGlkICVkLCB0aGlzICVwKSIsIGNhbGxpbmdQaWQsIHRoaXMpOwogCiAgICAgZGlzY29ubmVjdCgpOwpAQCAtMTQ4LDcgKzE0NCw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2hlY2tQaWQoKSBjb25zdCB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHJldHVybiBOT19FUlJPUjsKIAogICAgIEFMT0dXKCJhdHRlbXB0IHRvIHVzZSBhIGxvY2tlZCBjYW1lcmEgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzIgpAQCAtMTU4LDcgKzE1NCw4IEBACiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2hlY2tQaWRBbmRIYXJkd2FyZSgpIGNvbnN0IHsKICAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgQUxPR0UoImF0dGVtcHQgdG8gdXNlIGEgY2FtZXJhIGFmdGVyIGRpc2Nvbm5lY3QoKSAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgICAgIEFMT0dFKCJhdHRlbXB0IHRvIHVzZSBhIGNhbWVyYSBhZnRlciBkaXNjb25uZWN0KCkgKHBpZCAlZCkiLAorICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwpAQCAtMTY3LDcgKzE2NCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6bG9jaygpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgibG9jayAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMTgyLDcgKzE3OSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6dW5sb2NrKCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJ1bmxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTIwNCw3ICsyMDEsNyBAQAogCiAvLyBjb25uZWN0IGEgbmV3IGNsaWVudCB0byB0aGUgY2FtZXJhCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNvbm5lY3QoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjbGllbnQpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yNDAsNyArMjM3LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhQ2xpZW50OjpkaXNjb25uZWN0KCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJkaXNjb25uZWN0IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTMzNCw3ICszMzEsNyBAQAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRQcmV2aWV3VGFyZ2V0KAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpIHsKICAgICBMT0cxKCJzZXRQcmV2aWV3VGFyZ2V0KCVwKSAocGlkICVkKSIsIGJ1ZmZlclByb2R1Y2VyLmdldCgpLAotICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKQEAgLTM1MSw3ICszNDgsNyBAQAogLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KIC8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCiB2b2lkIENhbWVyYUNsaWVudDo6c2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgY2FsbGJhY2tfZmxhZykgewotICAgIExPRzEoInNldFByZXZpZXdDYWxsYmFja0ZsYWcoJWQpIChwaWQgJWQpIiwgY2FsbGJhY2tfZmxhZywgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKCVkKSAocGlkICVkKSIsIGNhbGxiYWNrX2ZsYWcsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKQEAgLTM3MiwxMyArMzY5LDEzIEBACiAKIC8vIHN0YXJ0IHByZXZpZXcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFByZXZpZXcoKSB7Ci0gICAgTE9HMSgic3RhcnRQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdGFydFByZXZpZXcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9QUkVWSUVXX01PREUpOwogfQogCiAvLyBzdGFydCByZWNvcmRpbmcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdGFydFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RhcnRSZWNvcmRpbmcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9SRUNPUkRJTkdfTU9ERSk7CiB9CiAKQEAgLTQ2MSw3ICs0NTgsNyBAQAogCiAvLyBzdG9wIHByZXZpZXcgbW9kZQogdm9pZCBDYW1lcmFDbGllbnQ6OnN0b3BQcmV2aWV3KCkgewotICAgIExPRzEoInN0b3BQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdG9wUHJldmlldyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKQEAgLTQ3Nyw3ICs0NzQsNyBAQAogCiAvLyBzdG9wIHJlY29yZGluZyBtb2RlCiB2b2lkIENhbWVyYUNsaWVudDo6c3RvcFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKQEAgLTUwMyw3ICs1MDAsNyBAQAogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKICAgICBpZiAobWVtID09IG51bGxwdHIpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coQ2FtZXJhU2VydmljZTo6U05fRVZFTlRfTE9HX0lELCAiMjYxNjQyNzIiLAotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTYxNSw3ICs2MTIsNyBAQAogfQogCiBib29sIENhbWVyYUNsaWVudDo6cHJldmlld0VuYWJsZWQoKSB7Ci0gICAgTE9HMSgicHJldmlld0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInByZXZpZXdFbmFibGVkIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIGZhbHNlOwpAQCAtNjIzLDcgKzYyMCw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhQ2xpZW50OjpyZWNvcmRpbmdFbmFibGVkKCkgewotICAgIExPRzEoInJlY29yZGluZ0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInJlY29yZGluZ0VuYWJsZWQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gZmFsc2U7CkBAIC02MzEsNyArNjI4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjphdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiYXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJhdXRvRm9jdXMgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02NDEsNyArNjM4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjYW5jZWxBdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJjYW5jZWxBdXRvRm9jdXMgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02NTIsNyArNjQ5LDcgQEAKIAogLy8gdGFrZSBhIHBpY3R1cmUgLSBpbWFnZSBpcyByZXR1cm5lZCBpbiBjYWxsYmFjawogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgbXNnVHlwZSkgewotICAgIExPRzEoInRha2VQaWN0dXJlIChwaWQgJWQpOiAweCV4IiwgZ2V0Q2FsbGluZ1BpZCgpLCBtc2dUeXBlKTsKKyAgICBMT0cxKCJ0YWtlUGljdHVyZSAocGlkICVkKTogMHgleCIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1zZ1R5cGUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY4MSw3ICs2NzgsNyBAQAogCiAvLyBzZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpIHsKLSAgICBMT0cxKCJzZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgTE9HMSgic2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02OTYsMTYgKzY5MywxOCBAQAogU3RyaW5nOCBDYW1lcmFDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKLSAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIFN0cmluZzgoKTsKKyAgICBpZiAoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoKTsKKyAgICB9CiAKICAgICBTdHJpbmc4IHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKS5mbGF0dGVuKCkpOwotICAgIExPRzEoImdldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIGdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKKyAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwogICAgIHJldHVybiBwYXJhbXM7CiB9CiAKIC8vIGVuYWJsZSBzaHV0dGVyIHNvdW5kCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmVuYWJsZVNodXR0ZXJTb3VuZChib29sIGVuYWJsZSkgewotICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiZW5hYmxlU2h1dHRlclNvdW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKQEAgLTcxNSwzMiArNzE0LDEyIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCi0gICAgaWYgKG1MZWdhY3lNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKLSAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJyby5jYW1lcmEuc291bmQuZm9yY2VkIiwgdmFsdWUsICIwIik7Ci0gICAgaWYgKHN0cmNtcCh2YWx1ZSwgIjAiKSAhPSAwKSB7Ci0gICAgICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIGlzIG5vdCBhbGxvd2VkLiBEZW55IGlmIHRoZSBjdXJyZW50Ci0gICAgICAgIC8vIHByb2Nlc3MgaXMgbm90IG1lZGlhc2VydmVyLgotICAgICAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgc2h1dHRlciBzb3VuZC4gUGVybWlzc2lvbiBkZW5pZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKSB7Ci0gICAgTE9HMSgic2VuZENvbW1hbmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgaW50IG9yaWVudGF0aW9uOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAppbmRleCAxOTEwNTM2Li45NTMwYjZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKQEAgLTY4LDggKzY4LDcgQEAKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOworICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogICAgIH5DYW1lcmFDbGllbnQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKaW5kZXggNzAzNDFjNS4uODg3OTlmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcApAQCAtNTAsOCArNTAsNyBAQAogICAgICAgICBtU3RhdGVUcmFuc2l0aW9uQ291bnQoMCksCiAgICAgICAgIG1UcmlnZ2VySWQoMCksCiAgICAgICAgIG1UaW1lb3V0Q291bnQoMCksCi0gICAgICAgIG1DYXB0dXJlSWQoQ2FtZXJhMkNsaWVudDo6a0NhcHR1cmVSZXF1ZXN0SWRTdGFydCksCi0gICAgICAgIG1Nc2dUeXBlKDApIHsKKyAgICAgICAgbUNhcHR1cmVJZChDYW1lcmEyQ2xpZW50OjprQ2FwdHVyZVJlcXVlc3RJZFN0YXJ0KSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIH0KIApAQCAtNjQsNyArNjMsNyBAQAogICAgIG1ac2xQcm9jZXNzb3IgPSBwcm9jZXNzb3I7CiB9CiAKLXN0YXR1c190IENhcHR1cmVTZXF1ZW5jZXI6OnN0YXJ0Q2FwdHVyZShpbnQgbXNnVHlwZSkgeworc3RhdHVzX3QgQ2FwdHVyZVNlcXVlbmNlcjo6c3RhcnRDYXB0dXJlKCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CkBAIC03Myw3ICs3Miw2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKCFtU3RhcnRDYXB0dXJlKSB7Ci0gICAgICAgIG1Nc2dUeXBlID0gbXNnVHlwZTsKICAgICAgICAgbVN0YXJ0Q2FwdHVyZSA9IHRydWU7CiAgICAgICAgIG1TdGFydENhcHR1cmVTaWduYWwuc2lnbmFsKCk7CiAgICAgfQpAQCAtMTE5LDYgKzExNywzMSBAQAogICAgIH0KIH0KIAordm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBib29sIGpwZWdCdWZmZXJMb3N0ID0gZmFsc2U7CisgICAgaWYgKGVycm9yQ29kZSA9PSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUikgeworICAgICAgICBzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGNsaWVudCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGNhcHR1cmVTdHJlYW1JZCA9IGNsaWVudC0+Z2V0Q2FwdHVyZVN0cmVhbUlkKCk7CisgICAgICAgIGlmIChjYXB0dXJlU3RyZWFtSWQgPT0gcmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQpIHsKKyAgICAgICAgICAgIGpwZWdCdWZmZXJMb3N0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXJyb3JDb2RlID09CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QpIHsKKyAgICAgICAgaWYgKHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPT0gbVNodXR0ZXJDYXB0dXJlSWQpIHsKKyAgICAgICAgICAgIGpwZWdCdWZmZXJMb3N0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChqcGVnQnVmZmVyTG9zdCkgeworICAgICAgICBzcDxNZW1vcnlCYXNlPiBlbXB0eUJ1ZmZlcjsKKyAgICAgICAgb25DYXB0dXJlQXZhaWxhYmxlKC8qdGltZXN0YW1wKi8wLCBlbXB0eUJ1ZmZlciwgLypjYXB0dXJlRXJyb3IqL3RydWUpOworICAgIH0KK30KKwogdm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogTmV3IHJlc3VsdCBhdmFpbGFibGUuIiwgX19GVU5DVElPTl9fKTsKQEAgLTM4Niw3ICs0MDksNyBAQAogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKICAgICAvKiB3YXJuaW5nOiB0aGlzIGFsc28gbG9ja3MgYSBTaGFyZWRDYW1lcmFDYWxsYmFja3MgKi8KLSAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCwgbU1zZ1R5cGUpOworICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50KTsKICAgICBtU2h1dHRlck5vdGlmaWVkID0gdHJ1ZTsKICAgICBtVGltZW91dENvdW50ID0ga01heFRpbWVvdXRzRm9yQ2FwdHVyZUVuZDsKICAgICByZXR1cm4gU1RBTkRBUkRfQ0FQVFVSRV9XQUlUOwpAQCAtNjA2LDcgKzYyOSw3IEBACiAgICAgICAgIGlmICghbVNodXR0ZXJOb3RpZmllZCkgewogICAgICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKICAgICAgICAgICAgIC8qIHdhcm5pbmc6IHRoaXMgYWxzbyBsb2NrcyBhIFNoYXJlZENhbWVyYUNhbGxiYWNrcyAqLwotICAgICAgICAgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQsIG1Nc2dUeXBlKTsKKyAgICAgICAgICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50KTsKICAgICAgICAgICAgIG1TaHV0dGVyTm90aWZpZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtVGltZW91dENvdW50IDw9IDApIHsKQEAgLTcyMywxMiArNzQ2LDExIEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpzaHV0dGVyTm90aWZ5TG9ja2VkKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsIGludCBtc2dUeXBlKSB7CisgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIGlmIChwYXJhbXMuc3RhdGUgPT0gUGFyYW1ldGVyczo6U1RJTExfQ0FQVFVSRQotICAgICAgICAmJiBwYXJhbXMucGxheVNodXR0ZXJTb3VuZAotICAgICAgICAmJiAobXNnVHlwZSAmIENBTUVSQV9NU0dfU0hVVFRFUikpIHsKKyAgICAgICAgJiYgcGFyYW1zLnBsYXlTaHV0dGVyU291bmQpIHsKICAgICAgICAgY2xpZW50LT5nZXRDYW1lcmFTZXJ2aWNlKCktPnBsYXlTb3VuZChDYW1lcmFTZXJ2aWNlOjpTT1VORF9TSFVUVEVSKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCmluZGV4IGYyZTM3NTAuLjcyN2RkNTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaApAQCAtNTEsNyArNTEsNyBAQAogICAgIHZvaWQgc2V0WnNsUHJvY2Vzc29yKGNvbnN0IHdwPFpzbFByb2Nlc3Nvcj4mIHByb2Nlc3Nvcik7CiAKICAgICAvLyBCZWdpbiBzdGlsbCBpbWFnZSBjYXB0dXJlCi0gICAgc3RhdHVzX3Qgc3RhcnRDYXB0dXJlKGludCBtc2dUeXBlKTsKKyAgICBzdGF0dXNfdCBzdGFydENhcHR1cmUoKTsKIAogICAgIC8vIFdhaXQgdW50aWwgY3VycmVudCBpbWFnZSBjYXB0dXJlIGNvbXBsZXRlczsgcmV0dXJucyBpbW1lZGlhdGVseSBpZiBubwogICAgIC8vIGNhcHR1cmUgaXMgYWN0aXZlLiBSZXR1cm5zIFRJTUVEX09VVCBpZiBjYXB0dXJlIGRvZXMgbm90IGNvbXBsZXRlIGR1cmluZwpAQCAtNjUsNiArNjUsOSBAQAogICAgIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKIAorICAgIC8vIE5vdGlmaWNhdGlvbnMgYWJvdXQgc2h1dHRlciAoY2FwdHVyZSBzdGFydCkKKyAgICB2b2lkIG5vdGlmeUVycm9yKGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOworCiAgICAgLy8gTm90aWZpY2F0aW9uIGZyb20gdGhlIGZyYW1lIHByb2Nlc3NvcgogICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpOwogCkBAIC0xNDUsNyArMTQ4LDYgQEAKICAgICBib29sIG1BZUluUHJlY2FwdHVyZTsKIAogICAgIGludDMyX3QgbUNhcHR1cmVJZDsKLSAgICBpbnQgbU1zZ1R5cGU7CiAKICAgICAvLyBNYWluIGludGVybmFsIG1ldGhvZHMKIApAQCAtMTcyLDcgKzE3NCw3IEBACiAKICAgICAvLyBFbWl0IFNodXR0ZXIvUmF3IGNhbGxiYWNrIHRvIGphdmEsIGFuZCBtYXliZSBwbGF5IGEgc2h1dHRlciBzb3VuZAogICAgIHN0YXRpYyB2b2lkIHNodXR0ZXJOb3RpZnlMb2NrZWQoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCwgaW50IG1zZ1R5cGUpOworICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCk7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKaW5kZXggMGM3MzhlNy4uNjgzZTg0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCkBAIC0zMyw3ICszMywxMCBAQAogICAgIEZyYW1lUHJvY2Vzc29yQmFzZShkZXZpY2UpLAogICAgIG1DbGllbnQoY2xpZW50KSwKICAgICBtTGFzdEZyYW1lTnVtYmVyT2ZGYWNlcygwKSwKLSAgICBtTGFzdDNBRnJhbWVOdW1iZXIoLTEpIHsKKyAgICBtTGFzdDNBRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QUVGcmFtZU51bWJlcigtMSksCisgICAgbUxhc3RBRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QVdCRnJhbWVOdW1iZXIoLTEpIHsKIAogICAgIHNwPENhbWVyYURldmljZUJhc2U+IGQgPSBkZXZpY2UucHJvbW90ZSgpOwogICAgIG1TeW50aGVzaXplM0FOb3RpZnkgPSAhKGQtPndpbGxOb3RpZnkzQSgpKTsKQEAgLTI2MiwyNCArMjY1LDczIEBACiAgICAgYm9vbCBnb3RBbGxTdGF0ZXMgPSB0cnVlOwogCiAgICAgLy8gVE9ETzogQWxzbyB1c2UgQUUgbW9kZSwgQUUgdHJpZ2dlciBJRAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAorICAgIGJvb2wgZ290QUZTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFmTW9kZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKKyAgICBib29sIGdvdEFXQlN0YXRlID0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmF3Yk1vZGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCisgICAgYm9vbCBnb3RBRVN0YXRlID0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFlU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgZ290QUZTdGF0ZSAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYWZTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCisgICAgZ290QVdCU3RhdGUgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAogICAgIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQ7CiAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkID0gZnJhbWUubVJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkOwogCisgICAgaWYgKGdvdEFFU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBRUZyYW1lTnVtYmVyKSkgeworICAgICAgICBpZiAocGVuZGluZ1N0YXRlLmFlU3RhdGUgIT0gbTNhU3RhdGUuYWVTdGF0ZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA+IG0zYVN0YXRlLmFlVHJpZ2dlcklkKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUUgc3RhdGUgJWQtPiVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlU3RhdGUpOworICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRXhwb3N1cmUocGVuZGluZ1N0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUgPSBwZW5kaW5nU3RhdGUuYWVTdGF0ZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFlVHJpZ2dlcklkID0gcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkOworICAgICAgICAgICAgbUxhc3RBRUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ290QUZTdGF0ZSAmJiAoZnJhbWVOdW1iZXIgPiBtTGFzdEFGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hZlN0YXRlICE9IG0zYVN0YXRlLmFmU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWZNb2RlICE9IG0zYVN0YXRlLmFmTW9kZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCAhPSBtM2FTdGF0ZS5hZlRyaWdnZXJJZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFGIHN0YXRlICVkLT4lZC4gQUYgbW9kZSAlZC0+JWQuIFRyaWdnZXIgJWQtPiVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSwgcGVuZGluZ1N0YXRlLmFmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7CisgICAgICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9Gb2N1cyhwZW5kaW5nU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKKworICAgICAgICAgICAgbTNhU3RhdGUuYWZTdGF0ZSA9IHBlbmRpbmdTdGF0ZS5hZlN0YXRlOworICAgICAgICAgICAgbTNhU3RhdGUuYWZNb2RlID0gcGVuZGluZ1N0YXRlLmFmTW9kZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkID0gcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkOworICAgICAgICAgICAgbUxhc3RBRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnb3RBV0JTdGF0ZSAmJiAoZnJhbWVOdW1iZXIgPiBtTGFzdEFXQkZyYW1lTnVtYmVyKSkgeworICAgICAgICBpZiAocGVuZGluZ1N0YXRlLmF3YlN0YXRlICE9IG0zYVN0YXRlLmF3YlN0YXRlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmF3Yk1vZGUgIT0gbTNhU3RhdGUuYXdiTW9kZSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFXQiBzdGF0ZSAlZC0+JWQuIEFXQiBtb2RlICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlLCBwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUsIHBlbmRpbmdTdGF0ZS5hd2JNb2RlKTsKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b1doaXRlYmFsYW5jZShwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUgPSBwZW5kaW5nU3RhdGUuYXdiTW9kZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlID0gcGVuZGluZ1N0YXRlLmF3YlN0YXRlOworICAgICAgICAgICAgbUxhc3RBV0JGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgZ290QWxsU3RhdGVzICY9IGdvdEFFU3RhdGUgJiBnb3RBRlN0YXRlICYgZ290QVdCU3RhdGU7CiAgICAgaWYgKCFnb3RBbGxTdGF0ZXMpIHsKICAgICAgICAgLy8gSWYgbm90IGFsbCBzdGF0ZXMgYXJlIHJlY2VpdmVkLCBwdXQgdGhlIHBlbmRpbmcgc3RhdGUgdG8gbVBlbmRpbmczQVN0YXRlcy4KICAgICAgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0yOTAsNDAgKzM0MiwxMCBAQAogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIC8vIE9uY2UgYWxsIDNBIHN0YXRlcyBhcmUgcmVjZWl2ZWQsIG5vdGlmeSB0aGUgY2xpZW50IGFib3V0IDNBIGNoYW5nZXMuCi0gICAgaWYgKHBlbmRpbmdTdGF0ZS5hZVN0YXRlICE9IG0zYVN0YXRlLmFlU3RhdGUgfHwKLSAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA+IG0zYVN0YXRlLmFlVHJpZ2dlcklkKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRSBzdGF0ZSAlZC0+JWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlU3RhdGUpOwotICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9FeHBvc3VyZShwZW5kaW5nU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkKTsKLSAgICB9Ci0KLSAgICBpZiAocGVuZGluZ1N0YXRlLmFmU3RhdGUgIT0gbTNhU3RhdGUuYWZTdGF0ZSB8fAotICAgICAgICBwZW5kaW5nU3RhdGUuYWZNb2RlICE9IG0zYVN0YXRlLmFmTW9kZSB8fAotICAgICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgIT0gbTNhU3RhdGUuYWZUcmlnZ2VySWQpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFGIHN0YXRlICVkLT4lZC4gQUYgbW9kZSAlZC0+JWQuIFRyaWdnZXIgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlN0YXRlLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSwgcGVuZGluZ1N0YXRlLmFmTW9kZSwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRm9jdXMocGVuZGluZ1N0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7Ci0gICAgfQotICAgIGlmIChwZW5kaW5nU3RhdGUuYXdiU3RhdGUgIT0gbTNhU3RhdGUuYXdiU3RhdGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmF3Yk1vZGUgIT0gbTNhU3RhdGUuYXdiTW9kZSkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQVdCIHN0YXRlICVkLT4lZC4gQVdCIG1vZGUgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlLCBwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYXdiTW9kZSwgcGVuZGluZ1N0YXRlLmF3Yk1vZGUpOwotICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UocGVuZGluZ1N0YXRlLmF3YlN0YXRlLAotICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7Ci0gICAgfQotCiAgICAgaWYgKGluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgIG1QZW5kaW5nM0FTdGF0ZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAgICAgfQogCi0gICAgbTNhU3RhdGUgPSBwZW5kaW5nU3RhdGU7CiAgICAgbUxhc3QzQUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCmluZGV4IDYyYTRlOTEuLjgxODNjMTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCkBAIC0xMDQsOCArMTA0LDcgQEAKICAgICAvLyBUcmFjayBtb3N0IHJlY2VudCBmcmFtZSBudW1iZXIgZm9yIHdoaWNoIDNBIG5vdGlmaWNhdGlvbnMgd2VyZSBzZW50IGZvci4KICAgICAvLyBVc2VkIHRvIGZpbHRlciBhZ2FpbnN0IHNlbmRpbmcgM0Egbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNhbWUgZnJhbWUKICAgICAvLyBzZXZlcmFsIHRpbWVzLgotICAgIGludDMyX3QgbUxhc3QzQUZyYW1lTnVtYmVyOwotCisgICAgaW50MzJfdCBtTGFzdDNBRnJhbWVOdW1iZXIsIG1MYXN0QUVGcmFtZU51bWJlciwgbUxhc3RBRnJhbWVOdW1iZXIsIG1MYXN0QVdCRnJhbWVOdW1iZXI7CiAgICAgLy8gRW1pdCBGYWNlRGV0ZWN0aW9uIGV2ZW50IHRvIGphdmEgaWYgZmFjZXMgY2hhbmdlZAogICAgIHZvaWQgY2FsbGJhY2tGYWNlRGV0ZWN0aW9uKGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX2ZyYW1lX21ldGFkYXRhICZtZXRhZGF0YSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKaW5kZXggYjcwMjBmZS4uZGRmZTVlMyAxMDA3NTUKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcApAQCAtNjIsMjYgKzYyLDYgQEAKICAgICB9CiB9CiAKLXZvaWQgSnBlZ1Byb2Nlc3Nvcjo6b25CdWZmZXJBY3F1aXJlZChjb25zdCBCdWZmZXJJbmZvJiAvKmJ1ZmZlckluZm8qLykgewotICAgIC8vIEludGVudGlvbmFsbHkgbGVmdCBlbXB0eQotfQotCi12b2lkIEpwZWdQcm9jZXNzb3I6Om9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgewotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgaWYgKGJ1ZmZlckluZm8ubUVycm9yKSB7Ci0gICAgICAgIC8vIE9ubHkgbG9jayBpbiBjYXNlIG9mIGVycm9yLCBzaW5jZSB3ZSBnZXQgb25lIG9mIHRoZXNlIGZvciBlYWNoCi0gICAgICAgIC8vIG9uRnJhbWVBdmFpbGFibGUgYXMgd2VsbCwgYW5kIHNjaGVkdWxpbmcgbWF5IGRlbGF5IHRoaXMgY2FsbCBsYXRlCi0gICAgICAgIC8vIGVub3VnaCB0byBydW4gaW50byBsYXRlciBwcmV2aWV3IHJlc3RhcnQgb3BlcmF0aW9ucywgZm9yIG5vbi1lcnJvcgotICAgICAgICAvLyBjYXNlcy4KLSAgICAgICAgLy8gYi8yOTUyNDY1MQotICAgICAgICBBTE9HVigiJXM6IEpQRUcgYnVmZmVyIGxvc3QiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7Ci0gICAgICAgIG1DYXB0dXJlRG9uZSA9IHRydWU7Ci0gICAgICAgIG1DYXB0dXJlU3VjY2VzcyA9IGZhbHNlOwotICAgICAgICBtQ2FwdHVyZURvbmVTaWduYWwuc2lnbmFsKCk7Ci0gICAgfQotfQotCiBzdGF0dXNfdCBKcGVnUHJvY2Vzc29yOjp1cGRhdGVTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTc2LDEzICsxNTYsNiBAQAogICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLQotICAgICAgICByZXMgPSBkZXZpY2UtPmFkZEJ1ZmZlckxpc3RlbmVyRm9yU3RyZWFtKG1DYXB0dXJlU3RyZWFtSWQsIHRoaXMpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBhZGQgYnVmZmVyIGxpc3RlbmVyaTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaAppbmRleCA3MTg3YWQ5Li45NzdmMTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KIAogI2luY2x1ZGUgImNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDEsOCArNDIsNyBAQAogICogU3RpbGwgaW1hZ2UgY2FwdHVyZSBvdXRwdXQgaW1hZ2UgcHJvY2Vzc2luZwogICovCiBjbGFzcyBKcGVnUHJvY2Vzc29yOgotICAgICAgICAgICAgcHVibGljIFRocmVhZCwgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyLAotICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lciB7CisgICAgICAgICAgICBwdWJsaWMgVGhyZWFkLCBwdWJsaWMgQ3B1Q29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgewogICBwdWJsaWM6CiAgICAgSnBlZ1Byb2Nlc3NvcihzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQsIHdwPENhcHR1cmVTZXF1ZW5jZXI+IHNlcXVlbmNlcik7CiAgICAgfkpwZWdQcm9jZXNzb3IoKTsKQEAgLTUwLDE1ICs1MCwxNCBAQAogICAgIC8vIENwdUNvbnN1bWVyIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCiAgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pOwogCi0gICAgLy8gQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyIGltcGxlbWVudGF0aW9uCi0gICAgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIG92ZXJyaWRlOwotICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSBvdmVycmlkZTsKLQogICAgIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpOwogICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbSgpOwogICAgIGludCBnZXRTdHJlYW1JZCgpIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CisKKyAgICBzdGF0aWMgc2l6ZV90IGZpbmRKcGVnU2l6ZSh1aW50OF90KiBqcGVnQnVmZmVyLCBzaXplX3QgbWF4U2l6ZSk7CisKICAgcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdER1cmF0aW9uID0gMTAwMDAwMDA7IC8vIDEwIG1zCiAgICAgd3A8Q2FtZXJhRGV2aWNlQmFzZT4gbURldmljZTsKQEAgLTgyLDcgKzgxLDYgQEAKICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwogCiAgICAgc3RhdHVzX3QgcHJvY2Vzc05ld0NhcHR1cmUoYm9vbCBjYXB0dXJlU3VjY2Vzcyk7Ci0gICAgc2l6ZV90IGZpbmRKcGVnU2l6ZSh1aW50OF90KiBqcGVnQnVmZmVyLCBzaXplX3QgbWF4U2l6ZSk7CiAKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCAyOGQxODZhLi4xOGFkZGI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC02OSw3ICs2OSw3IEBACiAgICAgcmVzID0gYnVpbGRRdWlya3MoKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCi0gICAgY29uc3QgU2l6ZSBNQVhfUFJFVklFV19TSVpFID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07CisgICAgU2l6ZSBtYXhQcmV2aWV3U2l6ZSA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OwogICAgIC8vIFRyZWF0IHRoZSBILjI2NCBtYXggc2l6ZSBhcyB0aGUgbWF4IHN1cHBvcnRlZCB2aWRlbyBzaXplLgogICAgIE1lZGlhUHJvZmlsZXMgKnZpZGVvRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKICAgICBWZWN0b3I8dmlkZW9fZW5jb2Rlcj4gZW5jb2RlcnMgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVycygpOwpAQCAtOTAsMTEgKzkwLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gVGhpcyBpcyBqdXN0IGFuIHVwcGVyIGJvdW5kIGFuZCBtYXkgbm90IGJlIGFuIGFjdHVhbGx5IHZhbGlkIHZpZGVvIHNpemUKLSAgICBjb25zdCBTaXplIFZJREVPX1NJWkVfVVBQRVJfQk9VTkQgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OworICAgIFNpemUgdmlkZW9TaXplVXBwZXJCb3VuZCA9IHttYXhWaWRlb1dpZHRoLCBtYXhWaWRlb0hlaWdodH07CiAKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKE1BWF9QUkVWSUVXX1NJWkUsICZhdmFpbGFibGVQcmV2aWV3U2l6ZXMpOworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgbWF4UHJldmlld1NpemUgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpKTsKKyAgICAgICAgdmlkZW9TaXplVXBwZXJCb3VuZCA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkVmlkZW9TaXplcygpKTsKKyAgICB9CisKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKG1heFByZXZpZXdTaXplLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwotICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoVklERU9fU0laRV9VUFBFUl9CT1VORCwgJmF2YWlsYWJsZVZpZGVvU2l6ZXMpOworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXModmlkZW9TaXplVXBwZXJCb3VuZCwgJmF2YWlsYWJsZVZpZGVvU2l6ZXMpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKICAgICAvLyBTZWxlY3QgaW5pdGlhbCBwcmV2aWV3IGFuZCB2aWRlbyBzaXplIHRoYXQncyB1bmRlciB0aGUgaW5pdGlhbCBib3VuZCBhbmQKQEAgLTI5Niw5ICszMDEsMTMgQEAKICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlSnBlZ1NpemVzID0gZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCk7CiAgICAgaWYgKCFhdmFpbGFibGVKcGVnU2l6ZXMuc2l6ZSgpKSByZXR1cm4gTk9fSU5JVDsKIAotICAgIC8vIFRPRE86IFBpY2sgbWF4aW11bQogICAgIHBpY3R1cmVXaWR0aCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS53aWR0aDsKICAgICBwaWN0dXJlSGVpZ2h0ID0gYXZhaWxhYmxlSnBlZ1NpemVzWzBdLmhlaWdodDsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIFNpemUgc3VnZ2VzdGVkSnBlZ1NpemUgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZEpwZWdTaXplcygpKTsKKyAgICAgICAgcGljdHVyZVdpZHRoID0gc3VnZ2VzdGVkSnBlZ1NpemUud2lkdGg7CisgICAgICAgIHBpY3R1cmVIZWlnaHQgPSBzdWdnZXN0ZWRKcGVnU2l6ZS5oZWlnaHQ7CisgICAgfQogICAgIHBpY3R1cmVXaWR0aExhc3RTZXQgPSBwaWN0dXJlV2lkdGg7CiAgICAgcGljdHVyZUhlaWdodExhc3RTZXQgPSBwaWN0dXJlSGVpZ2h0OwogICAgIHBpY3R1cmVTaXplT3ZlcnJpZGVuID0gZmFsc2U7CkBAIC03NTcsNiArNzY2LDcgQEAKICAgICBmb2N1c1N0YXRlID0gQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX0lOQUNUSVZFOwogICAgIHNoYWRvd0ZvY3VzTW9kZSA9IEZPQ1VTX01PREVfSU5WQUxJRDsKIAorICAgIGFlU3RhdGUgPSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfSU5BQ1RJVkU7CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWF4M2FSZWdpb25zID0gc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsCiAgICAgICAgICAgICBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OLCBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKTsKICAgICBpZiAobWF4M2FSZWdpb25zLmNvdW50ICE9IFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pIHJldHVybiBOT19JTklUOwpAQCAtMTAxMCw2ICsxMDIwLDkgQEAKICAgICAgICAgYXJyYXlIZWlnaHQgPSBhY3RpdmVBcnJheVNpemUuZGF0YS5pMzJbM107CiAgICAgfSBlbHNlIHJldHVybiBOT19JTklUOwogCisgICAgZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzID0KKyAgICAgICAgaW5mby0+ZXhpc3RzKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworCiAgICAgLy8gV2UnbGwgc2V0IHRoZSB0YXJnZXQgRlBTIHJhbmdlIGZvciBzdGlsbCBjYXB0dXJlcyB0byBiZSBhcyB3aWRlCiAgICAgLy8gYXMgcG9zc2libGUgdG8gZ2l2ZSB0aGUgSEFMIG1heGltdW0gbGF0aXR1ZGUgZm9yIGV4cG9zdXJlIHNlbGVjdGlvbgogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZwc1JhbmdlcyA9CkBAIC0xMDIxLDggKzEwMzQsMTEgQEAKICAgICAvLyBHZXQgc3VwcG9ydGVkIHByZXZpZXcgZnBzIHJhbmdlcywgdXAgdG8gZGVmYXVsdCBtYXhpbXVtLgogICAgIFZlY3RvcjxTaXplPiBzdXBwb3J0ZWRQcmV2aWV3U2l6ZXM7CiAgICAgVmVjdG9yPEZwc1JhbmdlPiBzdXBwb3J0ZWRQcmV2aWV3RnBzUmFuZ2VzOwotICAgIGNvbnN0IFNpemUgUFJFVklFV19TSVpFX0JPVU5EID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07Ci0gICAgc3RhdHVzX3QgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhQUkVWSUVXX1NJWkVfQk9VTkQsICZzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMpOworICAgIFNpemUgcHJldmlld1NpemVCb3VuZCA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgcHJldmlld1NpemVCb3VuZCA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkUHJldmlld1NpemVzKCkpOworICAgIH0KKyAgICBzdGF0dXNfdCByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKHByZXZpZXdTaXplQm91bmQsICZzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlRnBzUmFuZ2VzLmNvdW50OyBpICs9IDIpIHsKICAgICAgICAgaWYgKCFpc0Zwc1N1cHBvcnRlZChzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMsCkBAIC0zMTA2LDYgKzMxMjIsNjcgQEAKICAgICByZXR1cm4ganBlZ1NpemVzOwogfQogCitWZWN0b3I8UGFyYW1ldGVyczo6U3RyZWFtQ29uZmlndXJhdGlvbj4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnMoCisgICAgICAgIGludDMyX3QgdXNlY2FzZUlkKSBjb25zdCB7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA1OworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMDsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAxOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDI7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fVVNFQ0FTRV9CSVRNQVBfT0ZGU0VUID0gNDsKKyAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzOworCisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Db25maWdzID0gc3RhdGljSW5mbygKKyAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50OyBpKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBzdXBwb3J0ZWRVc2VjYXNlcyA9CisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9VU0VDQVNFX0JJVE1BUF9PRkZTRVRdOworICAgICAgICAgICAgaWYgKHN1cHBvcnRlZFVzZWNhc2VzICYgKDEgPDwgdXNlY2FzZUlkKSkgeworICAgICAgICAgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb24gc2MgPSB7Zm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpc0lucHV0fTsKKyAgICAgICAgICAgICAgICBzY3MuYWRkKHNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzY3M7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKGludDMyX3QgdXNlY2FzZUlkLAorICAgICAgICBpbnQzMl90IGZvcm1hdCkgY29uc3QgeworICAgIFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBzaXplczsKKyAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzID0gZ2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnModXNlY2FzZUlkKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogc2NzKSB7CisgICAgICAgIGlmIChpdC5mb3JtYXQgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICBzaXplcy5hZGQoe2l0LndpZHRoLCBpdC5oZWlnaHR9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzaXplczsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZEpwZWdTaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcygKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfU05BUFNIT1QsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IpOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkUHJldmlld1NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKAorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19QUkVWSUVXLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1JFQ09SRCwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7Cit9CisKIFBhcmFtZXRlcnM6OkNyb3BSZWdpb24gUGFyYW1ldGVyczo6Y2FsY3VsYXRlQ3JvcFJlZ2lvbihib29sIHByZXZpZXdPbmx5KSBjb25zdCB7CiAKICAgICBmbG9hdCB6b29tTGVmdCwgem9vbVRvcCwgem9vbVdpZHRoLCB6b29tSGVpZ2h0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKaW5kZXggNDJlN2E0Ny4uM2E3MDljOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCkBAIC0xMjIsNiArMTIyLDcgQEAKICAgICAgICAgaW50MzJfdCBoaWdoOwogICAgIH07CiAKKyAgICB1aW50OF90IGFlU3RhdGU7IC8vbGF0ZXN0IEFFIHN0YXRlIGZyb20gSGFsCiAgICAgaW50MzJfdCBleHBvc3VyZUNvbXBlbnNhdGlvbjsKICAgICBib29sIGF1dG9FeHBvc3VyZUxvY2s7CiAgICAgYm9vbCBhdXRvRXhwb3N1cmVMb2NrQXZhaWxhYmxlOwpAQCAtMjQ3LDYgKzI0OCw3IEBACiAgICAgICAgIGJvb2wgdXNlRmxleGlibGVZdXY7CiAgICAgICAgIFNpemUgbWF4SnBlZ1NpemU7CiAgICAgICAgIFNpemUgbWF4WnNsU2l6ZTsKKyAgICAgICAgYm9vbCBzdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3M7CiAgICAgfSBmYXN0SW5mbzsKIAogICAgIC8vIFF1aXJrcyBpbmZvcm1hdGlvbjsgdGhlc2UgYXJlIHNob3J0LWxpdmVkIGZsYWdzIHRvIGVuYWJsZSB3b3JrYXJvdW5kcyBmb3IKQEAgLTQxNyw2ICs0MTksOSBAQAogICAgIC8vIHJldHVybnMgYW4gZW1wdHkgVmVjdG9yIGlmIGRldmljZSBIQUwgdmVyc2lvbiBkb2VzIHN1cHBvcnQgaXQKICAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKIAorICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IHRoZSBzdWdnZXN0ZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zCisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IGdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKGludDMyX3QgdXNlY2FzZUlkKSBjb25zdDsKKwogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBmb3IgYSBqcGVnIHNpemUKICAgICAvLyByZXR1cm4gLTEgaWYgaW5wdXQganBlZyBzaXplIGNhbm5vdCBiZSBmb3VuZCBpbiBzdXBwb3J0ZWQgc2l6ZSBsaXN0CiAgICAgaW50NjRfdCBnZXRKcGVnU3RyZWFtTWluRnJhbWVEdXJhdGlvbk5zKFBhcmFtZXRlcnM6OlNpemUgc2l6ZSk7CkBAIC00MzgsNiArNDQzLDE1IEBACiAgICAgLy8gVGhlIG1heGltdW0gc2l6ZSBpcyBkZWZpbmVkIGJ5IGNvbXBhcmluZyB3aWR0aCBmaXJzdCwgd2hlbiB3aWR0aCB0aWVzIGNvbXBhcmluZyBoZWlnaHQuCiAgICAgU2l6ZSBnZXRNYXhTaXplKGNvbnN0IFZlY3RvcjxTaXplPiYgc2l6ZXMpOwogCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGZpbHRlciBhbmQgc29ydCBzdWdnZXN0ZWQgc2l6ZXMKKyAgICBWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcyhpbnQzMl90IHVzZWNhc2VJZCwgaW50MzJfdCBmb3JtYXQpIGNvbnN0OworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIHN1Z2dlc3RlZCBqcGVnIHNpemVzCisgICAgVmVjdG9yPFNpemU+IGdldFByZWZlcnJlZEpwZWdTaXplcygpIGNvbnN0OworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIHN1Z2dlc3RlZCBwcmV2aWV3IHNpemVzCisgICAgVmVjdG9yPFNpemU+IGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpIGNvbnN0OworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIHN1Z2dlc3RlZCB2aWRlbyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkgY29uc3Q7CisKICAgICBpbnQgbURldmljZVZlcnNpb247CiAgICAgdWludDhfdCBtRGVmYXVsdFNjZW5lTW9kZTsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggNTY3YjE1Zi4uYzdhNGYyYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtMTksNiArMTksNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KQEAgLTI2LDEwICsyNywxNSBAQAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogCiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogCisjaW5jbHVkZSAiRGVwdGhDb21wb3NpdGVTdHJlYW0uaCIKKyNpbmNsdWRlICJIZWljQ29tcG9zaXRlU3RyZWFtLmgiCisKIC8vIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbnN0cnVjdGluZyBiaW5kZXI6OlN0YXR1cyBvYmplY3RzIGZvciBlcnJvciByZXR1cm5zCiAKICNkZWZpbmUgU1RBVFVTX0VSUk9SKGVycm9yQ29kZSwgZXJyb3JTdHJpbmcpIFwKQEAgLTEyMiw2ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgIHBoeXNpY2FsS2V5c0VudHJ5LmRhdGEuaTMyICsgcGh5c2ljYWxLZXlzRW50cnkuY291bnQpOwogICAgIH0KIAorICAgIG1Qcm92aWRlck1hbmFnZXIgPSBwcm92aWRlclB0cjsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEzOSw2ICsxNDYsNyBAQAogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6Omluc2VydEdicExvY2tlZChjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLAogICAgICAgICBTdXJmYWNlTWFwKiBvdXRTdXJmYWNlTWFwLCBWZWN0b3I8aW50MzJfdD4qIG91dHB1dFN0cmVhbUlkcywgaW50MzJfdCAqY3VycmVudFN0cmVhbUlkKSB7CisgICAgaW50IGNvbXBvc2l0ZUlkeDsKICAgICBpbnQgaWR4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCkpOwogCiAgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCkBAIC0xNDgsNiArMTU2LDExIEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCiAgICAgICAgICAgICAgICAgIlJlcXVlc3QgdGFyZ2V0cyBTdXJmYWNlIHRoYXQgaXMgbm90IHBhcnQgb2YgY3VycmVudCBjYXB0dXJlIHNlc3Npb24iKTsKKyAgICB9IGVsc2UgaWYgKChjb21wb3NpdGVJZHggPSBtQ29tcG9zaXRlU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2JwKSkpCisgICAgICAgICAgICAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoY29tcG9zaXRlSWR4KS0+aW5zZXJ0R2JwKG91dFN1cmZhY2VNYXAsIG91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgICAgICBjdXJyZW50U3RyZWFtSWQpOworICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgfQogCiAgICAgY29uc3QgU3RyZWFtU3VyZmFjZUlkJiBzdHJlYW1TdXJmYWNlSWQgPSBtU3RyZWFtTWFwLnZhbHVlQXQoaWR4KTsKQEAgLTQ2OSw2ICs0ODIsNzkgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOwogICAgIH0KIAorICAgIHJlcyA9IGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKHNlc3Npb25QYXJhbXMsIG9wZXJhdGluZ01vZGUpOworICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IFVuc3VwcG9ydGVkIHNldCBvZiBpbnB1dHMvb3V0cHV0cyBwcm92aWRlZCIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRXJyb3IgY29uZmlndXJpbmcgc3RyZWFtczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgZXJyID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5jb25maWd1cmVTdHJlYW0oKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRXJyb3IgY29uZmlndXJpbmcgY29tcG9zaXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW1zOiAlcyAoJWQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tTdXJmYWNlVHlwZUxvY2tlZChzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLAorICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIsIGludCBzdXJmYWNlVHlwZSkgY29uc3QgeworICAgIGlmIChudW1CdWZmZXJQcm9kdWNlcnMgPiBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSkgeworICAgICAgICBBTE9HRSgiJXM6IEdyYXBoaWNCdWZmZXJQcm9kdWNlciBjb3VudCAlenUgZm9yIHN0cmVhbSBleGNlZWRzIGxpbWl0IG9mICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG51bUJ1ZmZlclByb2R1Y2VycywgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJTdXJmYWNlIGNvdW50IGlzIHRvbyBoaWdoIik7CisgICAgfSBlbHNlIGlmICgobnVtQnVmZmVyUHJvZHVjZXJzID09IDApICYmICghZGVmZXJyZWRDb25zdW1lcikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBOdW1iZXIgb2YgY29uc3VtZXJzIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIk5vIHZhbGlkIGNvbnN1bWVycy4iKTsKKyAgICB9CisKKyAgICBib29sIHZhbGlkU3VyZmFjZVR5cGUgPSAoKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHx8CisgICAgICAgICAgICAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVEVYVFVSRSkpOworCisgICAgaWYgKGRlZmVycmVkQ29uc3VtZXIgJiYgIXZhbGlkU3VyZmFjZVR5cGUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUYXJnZXQgc3VyZmFjZSBoYXMgaW52YWxpZCBzdXJmYWNlVHlwZSA9ICVkLiIsIF9fRlVOQ1RJT05fXywgc3VyZmFjZVR5cGUpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJUYXJnZXQgU3VyZmFjZSBpcyBpbnZhbGlkIik7CisgICAgfQorCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrUGh5c2ljYWxDYW1lcmFJZExvY2tlZChTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICBpZiAocGh5c2ljYWxDYW1lcmFJZC5zaXplKCkgPiAwKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgYm9vbCBsb2dpY2FsQ2FtZXJhID0KKyAgICAgICAgICAgIG1Qcm92aWRlck1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtQ2FtZXJhSWRTdHIuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIGlmICghbG9naWNhbENhbWVyYSB8fAorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IENhbWVyYSBkb2Vzbid0IHN1cHBvcnQgcGh5c2ljYWxDYW1lcmFJZCAlcy4iLAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja09wZXJhdGluZ01vZGVMb2NrZWQoaW50IG9wZXJhdGluZ01vZGUpIGNvbnN0IHsKICAgICBpZiAob3BlcmF0aW5nTW9kZSA8IDApIHsKICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCiAgICAgICAgICAgICAiQ2FtZXJhICVzOiBJbnZhbGlkIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZCIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgb3BlcmF0aW5nTW9kZSk7CkBAIC00NzcsNyArNTYzLDYgQEAKICAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOwogICAgIH0KIAotICAgIC8vIFNhbml0aXplIHRoZSBoaWdoIHNwZWVkIHNlc3Npb24gYWdhaW5zdCBuZWNlc3NhcnkgY2FwYWJpbGl0eSBiaXQuCiAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gKG9wZXJhdGluZ01vZGUgPT0gSUNhbWVyYURldmljZVVzZXI6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSk7CiAgICAgaWYgKGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKQEAgLTUwMCwxNyArNTg1LDIwNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdHVzX3QgZXJyID0gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcyhzZXNzaW9uUGFyYW1zLCBvcGVyYXRpbmdNb2RlKTsKLSAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgewotICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBVbnN1cHBvcnRlZCBzZXQgb2YgaW5wdXRzL291dHB1dHMgcHJvdmlkZWQiLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit2b2lkIENhbWVyYURldmljZUNsaWVudDo6bWFwU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKSB7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJlYW0tPnYzXzIuc3RyZWFtVHlwZSA9IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6T1VUUFVUOworICAgIHN0cmVhbS0+djNfMi53aWR0aCA9IHN0cmVhbUluZm8ud2lkdGg7CisgICAgc3RyZWFtLT52M18yLmhlaWdodCA9IHN0cmVhbUluZm8uaGVpZ2h0OworICAgIHN0cmVhbS0+djNfMi5mb3JtYXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KHN0cmVhbUluZm8uZm9ybWF0KTsKKyAgICBhdXRvIHUgPSBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2U7CisgICAgY2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbTo6YXBwbHlaU0xVc2FnZVF1aXJrKHN0cmVhbUluZm8uZm9ybWF0LCAmdSk7CisgICAgc3RyZWFtLT52M18yLnVzYWdlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9Db25zdW1lclVzYWdlKHUpOworICAgIHN0cmVhbS0+djNfMi5kYXRhU3BhY2UgPSBDYW1lcmEzRGV2aWNlOjptYXBUb0hpZGxEYXRhc3BhY2Uoc3RyZWFtSW5mby5kYXRhU3BhY2UpOworICAgIHN0cmVhbS0+djNfMi5yb3RhdGlvbiA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtUm90YXRpb24ocm90YXRpb24pOworICAgIHN0cmVhbS0+djNfMi5pZCA9IC0xOyAvLyBJbnZhbGlkIHN0cmVhbSBpZAorICAgIHN0cmVhbS0+cGh5c2ljYWxDYW1lcmFJZCA9IHN0ZDo6c3RyaW5nKHBoeXNpY2FsSWQuc3RyaW5nKCkpOworICAgIHN0cmVhbS0+YnVmZmVyU2l6ZSA9IDA7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLCBib29sICpzdGF0dXMgLypvdXQqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZXM7CisgICAgaWYgKCEocmVzID0gY2hlY2tQaWRTdGF0dXMoX19GVU5DVElPTl9fKSkuaXNPaygpKSByZXR1cm4gcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOworCisgICAgaWYgKCFtRGV2aWNlLmdldCgpKSB7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKKyAgICB9CisKKyAgICBhdXRvIG9wZXJhdGluZ01vZGUgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPcGVyYXRpbmdNb2RlKCk7CisgICAgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKG9wZXJhdGluZ01vZGUpOworICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gbnVsbHB0cikgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCggIkNhbWVyYSAlczogSW52YWxpZCBzdGF0dXMhIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRXJyb3IgY29uZmlndXJpbmcgc3RyZWFtczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiBzdHJlYW1Db25maWd1cmF0aW9uOworICAgIGF1dG8gcmV0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90PiAob3BlcmF0aW5nTW9kZSksCisgICAgICAgICAgICAvKm91dCovICZzdHJlYW1Db25maWd1cmF0aW9uLm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAiQ2FtZXJhICVzOiBGYWlsZWQgbWFwcGluZyBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQ6ICVzICglZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICBvcGVyYXRpbmdNb2RlLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKKyAgICB9CisKKyAgICBib29sIGlzSW5wdXRWYWxpZCA9IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkgPiAwKSAmJgorICAgICAgICAgICAgKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0SGVpZ2h0KCkgPiAwKSAmJgorICAgICAgICAgICAgKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0Rm9ybWF0KCkgPiAwKTsKKyAgICBhdXRvIG91dHB1dENvbmZpZ3MgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpOworICAgIHNpemVfdCBzdHJlYW1Db3VudCA9IG91dHB1dENvbmZpZ3Muc2l6ZSgpOworICAgIHN0cmVhbUNvdW50ID0gaXNJbnB1dFZhbGlkID8gc3RyZWFtQ291bnQgKyAxIDogc3RyZWFtQ291bnQ7CisgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShzdHJlYW1Db3VudCk7CisgICAgc2l6ZV90IHN0cmVhbUlkeCA9IDA7CisgICAgaWYgKGlzSW5wdXRWYWxpZCkgeworICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdID0ge3svKnN0cmVhbUlkKi8wLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6SU5QVVQsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSksCisgICAgICAgICAgICAgICAgQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpKSwKKyAgICAgICAgICAgICAgICAvKnVzYWdlKi8gMCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzB9LAorICAgICAgICAgICAgICAgIC8qcGh5c2ljYWxJZCovIG51bGxwdHIsIC8qYnVmZmVyU2l6ZSovMH07CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG91dHB1dENvbmZpZ3MpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBidWZmZXJQcm9kdWNlcnMgPQorICAgICAgICAgICAgaXQuZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpOworICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBpdC5pc0RlZmVycmVkKCk7CisgICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgoaXQuZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKKyAgICAgICAgc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycyA9IGJ1ZmZlclByb2R1Y2Vycy5zaXplKCk7CisgICAgICAgIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyBzdHJlYW1JbmZvOworCisgICAgICAgIHJlcyA9IGNoZWNrU3VyZmFjZVR5cGVMb2NrZWQobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLCBpdC5nZXRTdXJmYWNlVHlwZSgpKTsKKyAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVmZXJyZWRDb25zdW1lcikgeworICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IGl0LmdldFdpZHRoKCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCA9IGl0LmdldEhlaWdodCgpOworICAgICAgICAgICAgc3RyZWFtSW5mby5mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmRhdGFTcGFjZSA9IGFuZHJvaWRfZGF0YXNwYWNlX3Q6OkhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKKyAgICAgICAgICAgIGF1dG8gc3VyZmFjZVR5cGUgPSBpdC5nZXRTdXJmYWNlVHlwZSgpOworICAgICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRTsKKyAgICAgICAgICAgIGlmIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlIHw9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX0NPTVBPU0VSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7CisgICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBidWZmZXJQcm9kdWNlciA6IGJ1ZmZlclByb2R1Y2VycykgeworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sIGlzU3RyZWFtSW5mb1ZhbGlkLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCk7CisKKyAgICAgICAgICAgIGlmICghcmVzLmlzT2soKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworCisgICAgICAgICAgICBpZiAoIWlzU3RyZWFtSW5mb1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2UpOworICAgICAgICAgICAgICAgIGJvb2wgaXNIZWljQ29tcG9zaXRlU3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSB8fCBpc0hlaWNDb21wb3NpdGVTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIGluIHRvIGFjY291bnQgdGhhdCBjb21wb3NpdGUgc3RyZWFtcyBjYW4gaGF2ZQorICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIGludGVybmFsIGNhbWVyYSBzdHJlYW1zLgorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiBjb21wb3NpdGVTdHJlYW1zOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmdldENvbXBvc2l0ZVN0cmVhbUluZm8oc3RyZWFtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS0+aW5mbygpLCAmY29tcG9zaXRlU3RyZWFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS0+aW5mbygpLCAmY29tcG9zaXRlU3RyZWFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IEZhaWxlZCBhZGRpbmcgY29tcG9zaXRlIHN0cmVhbXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGVTdHJlYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBpbnRlcm5hbCBzdHJlYW1zIG1lYW5zIGNvbXBvc2l0ZSBzdHJlYW0gbm90CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db3VudCArPSBjb21wb3NpdGVTdHJlYW1zLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKHN0cmVhbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY29tcG9zaXRlU3RyZWFtIDogY29tcG9zaXRlU3RyZWFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhjb21wb3NpdGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpzdGF0dXMgPSBmYWxzZTsKKyAgICByZXQgPSBtUHJvdmlkZXJNYW5hZ2VyLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24sIHN0YXR1cyk7CisgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046IHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBub3Qgc3VwcG9ydGVkISIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFMT0dEKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCAiQ2FtZXJhICVzOiBFcnJvcjogJXMgKCVkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByZXM7CkBAIC01MzIsNiArODA1LDcgQEAKICAgICBib29sIGlzSW5wdXQgPSBmYWxzZTsKICAgICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gc3VyZmFjZXM7CiAgICAgc3NpemVfdCBkSW5kZXggPSBOQU1FX05PVF9GT1VORDsKKyAgICBzc2l6ZV90IGNvbXBvc2l0ZUluZGV4ICA9IE5BTUVfTk9UX0ZPVU5EOwogCiAgICAgaWYgKG1JbnB1dFN0cmVhbS5jb25maWd1cmVkICYmIG1JbnB1dFN0cmVhbS5pZCA9PSBzdHJlYW1JZCkgewogICAgICAgICBpc0lucHV0ID0gdHJ1ZTsKQEAgLTU1MSw2ICs4MjUsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKHN0cmVhbUlkID09IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+Z2V0U3RyZWFtSWQoKSkgeworICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzdXJmYWNlcy5lbXB0eSgpICYmIGRJbmRleCA9PSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogSW52YWxpZCBzdHJlYW0gSUQgKCVkKSBzcGVjaWZpZWQsIG5vIHN1Y2giCiAgICAgICAgICAgICAgICAgICAgICIgc3RyZWFtIGNyZWF0ZWQgeWV0IiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlYW1JZCk7CkBAIC01ODAsNiArODYxLDE5IEBACiAgICAgICAgICAgICBpZiAoZEluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICAgICAgbURlZmVycmVkU3RyZWFtcy5yZW1vdmVJdGVtc0F0KGRJbmRleCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb21wb3NpdGVJbmRleCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IHJldDsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChjb21wb3NpdGVJbmRleCktPmRlbGV0ZVN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogVW5leHBlY3RlZCBlcnJvciAlcyAoJWQpIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyBjb21wb3NpdGUgc3RyZWFtICVkIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnJlbW92ZUl0ZW1zQXQoY29tcG9zaXRlSW5kZXgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC02MDMsNDEgKzg5NywyMyBAQAogICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciA9IG91dHB1dENvbmZpZ3VyYXRpb24uaXNEZWZlcnJlZCgpOwogICAgIGJvb2wgaXNTaGFyZWQgPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzU2hhcmVkKCk7CiAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChvdXRwdXRDb25maWd1cmF0aW9uLmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7Ci0KLSAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyUHJvZHVjZXJzLnNpemUoKSwgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJTdXJmYWNlIGNvdW50IGlzIHRvbyBoaWdoIik7Ci0gICAgfQogICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lck9ubHkgPSBkZWZlcnJlZENvbnN1bWVyICYmIG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwOwotICAgIGludCBzdXJmYWNlVHlwZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVR5cGUoKTsKLSAgICBib29sIHZhbGlkU3VyZmFjZVR5cGUgPSAoKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHx8Ci0gICAgICAgICAgICAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVEVYVFVSRSkpOwogCi0gICAgaWYgKGRlZmVycmVkQ29uc3VtZXIgJiYgIXZhbGlkU3VyZmFjZVR5cGUpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUYXJnZXQgc3VyZmFjZSBpcyBpbnZhbGlkOiBidWZmZXJQcm9kdWNlciA9ICVwLCBzdXJmYWNlVHlwZSA9ICVkLiIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJQcm9kdWNlcnNbMF0uZ2V0KCksIHN1cmZhY2VUeXBlKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOworICAgIHJlcyA9IGNoZWNrU3VyZmFjZVR5cGVMb2NrZWQobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLAorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlVHlwZSgpKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOwogICAgIH0KIAotICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDApIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgICAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbElkKHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICBib29sIGxvZ2ljYWxDYW1lcmEgPQotICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKG1EZXZpY2UtPmluZm8oKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKLSAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhIHx8Ci0gICAgICAgICAgICAgICAgc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbElkKSA9PQotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICByZXMgPSBjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQorCiAgICAgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+IHN1cmZhY2VzOwogICAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiBiaW5kZXJzOwogICAgIHN0YXR1c190IGVycjsKQEAgLTY3NywxMSArOTUzLDMyIEBACiAKICAgICBpbnQgc3RyZWFtSWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9JRF9JTlZBTElEOwogICAgIHN0ZDo6dmVjdG9yPGludD4gc3VyZmFjZUlkczsKLSAgICBlcnIgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oc3VyZmFjZXMsIGRlZmVycmVkQ29uc3VtZXIsIHN0cmVhbUluZm8ud2lkdGgsCi0gICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgc3RyZWFtSW5mby5mb3JtYXQsIHN0cmVhbUluZm8uZGF0YVNwYWNlLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKLSAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnN1cmZhY2VJZHMsIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksCi0gICAgICAgICAgICBpc1NoYXJlZCk7CisgICAgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtID0gY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmlzRGVwdGhDb21wb3NpdGVTdHJlYW0oc3VyZmFjZXNbMF0pOworICAgIGJvb2wgaXNIZWljQ29tcGlzaXRlU3RyZWFtID0gY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNIZWljQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2VzWzBdKTsKKyAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSB8fCBpc0hlaWNDb21waXNpdGVTdHJlYW0pIHsKKyAgICAgICAgc3A8Q29tcG9zaXRlU3RyZWFtPiBjb21wb3NpdGVTdHJlYW07CisgICAgICAgIGlmIChpc0RlcHRoQ29tcG9zaXRlU3RyZWFtKSB7CisgICAgICAgICAgICBjb21wb3NpdGVTdHJlYW0gPSBuZXcgY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW0obURldmljZSwgZ2V0UmVtb3RlQ2FsbGJhY2soKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wb3NpdGVTdHJlYW0gPSBuZXcgY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbShtRGV2aWNlLCBnZXRSZW1vdGVDYWxsYmFjaygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGNvbXBvc2l0ZVN0cmVhbS0+Y3JlYXRlU3RyZWFtKHN1cmZhY2VzLCBkZWZlcnJlZENvbnN1bWVyLCBzdHJlYW1JbmZvLndpZHRoLAorICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnN1cmZhY2VJZHMsIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksCisgICAgICAgICAgICAgICAgaXNTaGFyZWQpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLmFkZChJSW50ZXJmYWNlOjphc0JpbmRlcihzdXJmYWNlc1swXS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlU3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShzdXJmYWNlcywgZGVmZXJyZWRDb25zdW1lciwgc3RyZWFtSW5mby53aWR0aCwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgc3RyZWFtSW5mby5mb3JtYXQsIHN0cmVhbUluZm8uZGF0YVNwYWNlLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc3VyZmFjZUlkcywgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwKKyAgICAgICAgICAgICAgICBpc1NoYXJlZCk7CisgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXMgPSBTVEFUVVNfRVJST1JfRk1UKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLApAQCAtMTE2Myw2ICsxNDYwLDggQEAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc3RyZWFtQ29uZmlncyA9CiAgICAgICAgICAgICAoZGF0YVNwYWNlID09IEhBTF9EQVRBU1BBQ0VfREVQVEgpID8KICAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpIDoKKyAgICAgICAgICAgIChkYXRhU3BhY2UgPT0gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSEVJRikpID8KKyAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TKSA6CiAgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CiAKICAgICBpbnQzMl90IGJlc3RXaWR0aCA9IC0xOwpAQCAtMTYxNSw3ICsxOTE0LDE0IEBACiAgICAgLy8gVGhyZWFkIHNhZmUuIERvbid0IGJvdGhlciBsb2NraW5nLgogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CiAKLSAgICBpZiAocmVtb3RlQ2IgIT0gMCkgeworICAgIC8vIENvbXBvc2l0ZXMgY2FuIGhhdmUgbXVsdGlwbGUgaW50ZXJuYWwgc3RyZWFtcy4gRXJyb3Igbm90aWZpY2F0aW9ucyBjb21pbmcgZnJvbSBzdWNoIGludGVybmFsCisgICAgLy8gc3RyZWFtcyBtYXkgbmVlZCB0byByZW1haW4gd2l0aGluIGNhbWVyYSBzZXJ2aWNlLgorICAgIGJvb2wgc2tpcENsaWVudE5vdGlmaWNhdGlvbiA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICBza2lwQ2xpZW50Tm90aWZpY2F0aW9uIHw9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25FcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CisgICAgfQorCisgICAgaWYgKChyZW1vdGVDYiAhPSAwKSAmJiAoIXNraXBDbGllbnROb3RpZmljYXRpb24pKSB7CiAgICAgICAgIHJlbW90ZUNiLT5vbkRldmljZUVycm9yKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKICAgICB9CiB9CkBAIC0xNjQ5LDYgKzE5NTUsMTAgQEAKICAgICAgICAgcmVtb3RlQ2ItPm9uQ2FwdHVyZVN0YXJ0ZWQocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOwogICAgIH0KICAgICBDYW1lcmEyQ2xpZW50QmFzZTo6bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vblNodXR0ZXIocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOworICAgIH0KIH0KIAogdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeVByZXBhcmVkKGludCBzdHJlYW1JZCkgewpAQCAtMTcwOCw2ICsyMDE4LDEwIEBACiAgICAgICAgIHJlbW90ZUNiLT5vblJlc3VsdFJlY2VpdmVkKHJlc3VsdC5tTWV0YWRhdGEsIHJlc3VsdC5tUmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIHJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpOwogICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uUmVzdWx0QXZhaWxhYmxlKHJlc3VsdCk7CisgICAgfQogfQogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrUGlkU3RhdHVzKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pIHsKQEAgLTE3MjQsNyArMjAzOCw3IEBACiAvLyBUT0RPOiBtb3ZlIHRvIENhbWVyYTJDbGllbnRCYXNlCiBib29sIENhbWVyYURldmljZUNsaWVudDo6ZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKIAotICAgIGNvbnN0IGludCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKIApAQCAtMTc2Myw3ICsyMDc3LDcgQEAKICAgICAgICAgU3RyaW5nMTYgcGVybWlzc2lvblN0cmluZyA9CiAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9ESVNBQkxFX1RSQU5TTUlUX0xFRCIpOwogICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24ocGVybWlzc2lvblN0cmluZykpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogIgogICAgICAgICAgICAgICAgICAgImNhbid0IGRpc2FibGUgdHJhbnNtaXQgTEVEIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggYzMwNTYxZC4uMWM1YWJiMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC0yMCwxMyArMjAsMTYgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TdWJtaXRJbmZvLmg+CiAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oIgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIgorI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOwordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Q29tcG9zaXRlU3RyZWFtOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTg5LDYgKzkyLDEyIEBACiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBlbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmUmIHNlc3Npb25QYXJhbXMpIG92ZXJyaWRlOwogCisgICAgLy8gVmVyaWZ5IHNwZWNpZmljIHNlc3Npb24gY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBib29sKiBzdHJlYW1TdGF0dXMpIG92ZXJyaWRlOworCiAgICAgLy8gUmV0dXJucyAtRUJVU1kgaWYgZGV2aWNlIGlzIG5vdCBpZGxlIG9yIGluIGVycm9yIHN0YXRlCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKIApAQCAtMjMwLDYgKzIzOSwxMyBAQAogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwogICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGlkU3RhdHVzKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pOworICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChpbnQgb3BlcmF0aW5nTW9kZSkgY29uc3Q7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCk7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tTdXJmYWNlVHlwZUxvY2tlZChzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLCBib29sIGRlZmVycmVkQ29uc3VtZXIsCisgICAgICAgICAgICBpbnQgc3VyZmFjZVR5cGUpIGNvbnN0OworICAgIHN0YXRpYyB2b2lkIG1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLyk7CiAgICAgYm9vbCBlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSk7CiAKICAgICAvLyBGaW5kIHRoZSBzcXVhcmUgb2YgdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMKQEAgLTMwMCw3ICszMTYsMTAgQEAKICAgICAvLyBzdHJlYW0gSUQgLT4gb3V0cHV0U3RyZWFtSW5mbyBtYXBwaW5nCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDMyX3QsIE91dHB1dFN0cmVhbUluZm8+IG1TdHJlYW1JbmZvTWFwOwogCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0gPSAyOworICAgIEtleWVkVmVjdG9yPHNwPElCaW5kZXI+LCBzcDxDb21wb3NpdGVTdHJlYW0+PiBtQ29tcG9zaXRlU3RyZWFtTWFwOworCisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0gPSA0OworICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbVByb3ZpZGVyTWFuYWdlcjsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ZWFmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1Db21wb3NpdGVTdHJlYW0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgIkNhbWVyYURldmljZUNsaWVudC5oIgorI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0NvbXBvc2l0ZVN0cmVhbTo6Q29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKSA6CisgICAgICAgIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgbVJlbW90ZUNhbGxiYWNrKGNiKSwKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzKDEpLAorICAgICAgICBtRXJyb3JTdGF0ZShmYWxzZSkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGNhbWVyYURldmljZSA9IGRldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGNhbWVyYURldmljZS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBjYW1lcmFEZXZpY2UtPmluZm8oKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IENvbXBvc2l0ZVN0cmVhbTo6Y3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqIGlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICogc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSB7CisgICAgaWYgKGhhc0RlZmVycmVkQ29uc3VtZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZWZlcnJlZCBjb25zdW1lcnMgbm90IHN1cHBvcnRlZCBpbiBjYXNlIG9mIGNvbXBvc2l0ZSBzdHJlYW1zISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtU2V0SWQgIT0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRCkgeworICAgICAgICBBTE9HRSgiJXM6IFN1cmZhY2UgZ3JvdXBzIG5vdCBzdXBwb3J0ZWQgaW4gY2FzZSBvZiBjb21wb3NpdGUgc3RyZWFtcyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGlzU2hhcmVkKSB7CisgICAgICAgIEFMT0dFKCIlczogU2hhcmVkIHN1cmZhY2VzIG5vdCBzdXBwb3J0ZWQgaW4gY2FzZSBvZiBjb21wb3NpdGUgc3RyZWFtcyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdW1lcnMsIGhhc0RlZmVycmVkQ29uc3VtZXIsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgcm90YXRpb24sIGlkLAorICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc3VyZmFjZUlkcywgc3RyZWFtU2V0SWQsIGlzU2hhcmVkKTsKK30KKworc3RhdHVzX3QgQ29tcG9zaXRlU3RyZWFtOjpkZWxldGVTdHJlYW0oKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmNsZWFyKCk7CisgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5jbGVhcigpOworICAgICAgICBtRnJhbWVOdW1iZXJNYXAuY2xlYXIoKTsKKyAgICAgICAgbUVycm9yRnJhbWVOdW1iZXJzLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIGRlbGV0ZUludGVybmFsU3RyZWFtcygpOworfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6b25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsIGludCBzdHJlYW1JZCwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIC8qc2V0dGluZ3MqLykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKCFtRXJyb3JTdGF0ZSAmJiAoc3RyZWFtSWQgPT0gZ2V0U3RyZWFtSWQoKSkpIHsKKyAgICAgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbXBsYWNlKGZyYW1lTnVtYmVyLCBDYW1lcmFNZXRhZGF0YSgpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmICghbUVycm9yU3RhdGUgJiYgIWJ1ZmZlckluZm8ubUVycm9yKSB7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5lbXBsYWNlKGJ1ZmZlckluZm8ubUZyYW1lTnVtYmVyLCBidWZmZXJJbmZvLm1UaW1lc3RhbXApOworICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjplcmFzZVJlc3VsdChpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIGF1dG8gaXQgPSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmZpbmQoZnJhbWVOdW1iZXIpOworICAgIGlmIChpdCA9PSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpdCA9IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZXJhc2UoaXQpOworfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KSB7CisgICAgYm9vbCByZXN1bHRFcnJvciA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlciA9IHJlc3VsdC5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgICAgICBib29sIHJlc3VsdFJlYWR5ID0gZmFsc2U7CisgICAgICAgIGF1dG8gaXQgPSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmZpbmQoZnJhbWVOdW1iZXIpOworICAgICAgICBpZiAoaXQgIT0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbmQoKSkgeworICAgICAgICAgICAgaXQtPnNlY29uZC5hcHBlbmQocmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgICAgICAgICBpZiAocmVzdWx0Lm1SZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50ID49IG1OdW1QYXJ0aWFsUmVzdWx0cykgeworICAgICAgICAgICAgICAgIGF1dG8gZW50cnkgPSBpdC0+c2Vjb25kLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIHRzID0gZW50cnkuZGF0YS5pNjRbMF07CisgICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5lbXBsYWNlKHRzLCBzdGQ6Om1ha2VfdHVwbGUoZnJhbWVOdW1iZXIsIGl0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0UmVhZHkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVGltZXN0YW1wIG1ldGFkYXRhIGVudHJ5IG1pc3NpbmcgZm9yIGZyYW1lTnVtYmVyOiAlIiBQUkl1NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0UmVhZHkpIHsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3VsdEVycm9yKSB7CisgICAgICAgIG9uUmVzdWx0RXJyb3IocmVzdWx0Lm1SZXN1bHRFeHRyYXMpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06OmZsYWdBbkVycm9yRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgbUVycm9yRnJhbWVOdW1iZXJzLmVtcGxhY2UoZnJhbWVOdW1iZXIpOworICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworfQorCitzdGF0dXNfdCBDb21wb3NpdGVTdHJlYW06OnJlZ2lzdGVyQ29tcG9zaXRlU3RyZWFtTGlzdGVuZXIoaW50MzJfdCBzdHJlYW1JZCkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdXRvIHJldCA9IGRldmljZS0+YWRkQnVmZmVyTGlzdGVuZXJGb3JTdHJlYW0oc3RyZWFtSWQsIHRoaXMpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgY29tcG9zaXRlIHN0cmVhbSBsaXN0ZW5lciEiLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQ29tcG9zaXRlU3RyZWFtOjpvbkVycm9yKGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBhdXRvIHJldCA9IGZhbHNlOworICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQ6CisgICAgICAgICAgICBvblJlc3VsdEVycm9yKHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIHJldCA9IG9uU3RyZWFtQnVmZmVyRXJyb3IocmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgICAgIC8vIEludmFsaWQgcmVxdWVzdCwgdGhpcyBzaG91bGRuJ3QgYWZmZWN0IGNvbXBvc2l0ZSBzdHJlYW1zLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVucmVjb3ZlcmFibGUgZXJyb3I6ICVkIGRldGVjdGVkISIsIF9fRlVOQ1RJT05fXywgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgICAgICBtRXJyb3JTdGF0ZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6bm90aWZ5RXJyb3IoaW50NjRfdCBmcmFtZU51bWJlcikgeworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9CisgICAgICAgIG1SZW1vdGVDYWxsYmFjay5wcm9tb3RlKCk7CisKKyAgICBpZiAoKGZyYW1lTnVtYmVyID49IDApICYmIChyZW1vdGVDYi5nZXQoKSAhPSBudWxscHRyKSkgeworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhczsKKyAgICAgICAgZXh0cmFzLmVycm9yU3RyZWFtSWQgPSBnZXRTdHJlYW1JZCgpOworICAgICAgICBleHRyYXMuZnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlRXJyb3IoCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIsCisgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwMWE4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19DT01QT1NJVEVfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0NPTVBPU0lURV9TVFJFQU1fSAorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENhbWVyYURldmljZUNsaWVudDsKK2NsYXNzIENhbWVyYU1ldGFkYXRhOworY2xhc3MgU3VyZmFjZTsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBDb21wb3NpdGVTdHJlYW0gOiBwdWJsaWMgY2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyIHsKKworcHVibGljOgorICAgIENvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYik7CisgICAgdmlydHVhbCB+Q29tcG9zaXRlU3RyZWFtKCkge30KKworICAgIHN0YXR1c190IGNyZWF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpOworCisgICAgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKCk7CisKKyAgICAvLyBDcmVhdGUgYW5kIHJlZ2lzdGVyIGFsbCBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpID0gMDsKKworICAgIC8vIFJlbGVhc2UgYWxsIGludGVybmFsIHN0cmVhbXMgYW5kIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgPSAwOworCisgICAgLy8gU3RyZWFtIGNvbmZpZ3VyYXRpb24gY29tcGxldGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtKCkgPSAwOworCisgICAgLy8gSW5zZXJ0IHRoZSBpbnRlcm5hbCBjb21wb3NpdGUgc3RyZWFtIGlkIGluIHRoZSB1c2VyIGNhcHR1cmUgcmVxdWVzdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwKKyAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgPSAwOworCisgICAgLy8gUmV0dXJuIGNvbXBvc2l0ZSBzdHJlYW0gaWQuCisgICAgdmlydHVhbCBpbnQgZ2V0U3RyZWFtSWQoKSA9IDA7CisKKyAgICAvLyBOb3RpZnkgd2hlbiBzaHV0dGVyIG5vdGlmeSBpcyB0cmlnZ2VyZWQKKyAgICB2aXJ0dWFsIHZvaWQgb25TaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIC8qcmVzdWx0RXh0cmFzKi8sIG5zZWNzX3QgLyp0aW1lc3RhbXAqLykge30KKworICAgIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KTsKKyAgICBib29sIG9uRXJyb3IoaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisKKyAgICAvLyBDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKyAgICB2b2lkIG9uQnVmZmVyQWNxdWlyZWQoY29uc3QgQnVmZmVySW5mbyYgLypidWZmZXJJbmZvKi8pIG92ZXJyaWRlIHsgLypFbXB0eSBmb3Igbm93ICovIH0KKyAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHN0cnVjdCBQcm9kdWNlckxpc3RlbmVyIDogcHVibGljIEJuUHJvZHVjZXJMaXN0ZW5lciB7CisgICAgICAgIC8vIFByb2R1Y2VyTGlzdGVuZXIgaW1wZW1lbnRhdGlvbgorICAgICAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoKSBvdmVycmlkZSB7IC8qTm8gaW1wbC4gZm9yIG5vdyovIH07CisgICAgfTsKKworICAgIHN0YXR1c190IHJlZ2lzdGVyQ29tcG9zaXRlU3RyZWFtTGlzdGVuZXIoaW50MzJfdCBzdHJlYW1JZCk7CisgICAgdm9pZCBlcmFzZVJlc3VsdChpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIGZsYWdBbkVycm9yRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcik7CisgICAgdm9pZCBub3RpZnlFcnJvcihpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKworICAgIC8vIFN1YmNsYXNzZXMgc2hvdWxkIGNoZWNrIGZvciBidWZmZXIgZXJyb3JzIGZyb20gaW50ZXJuYWwgc3RyZWFtcyBhbmQgcmV0dXJuICd0cnVlJyBpbgorICAgIC8vIGNhc2UgdGhlIGVycm9yIG5vdGlmaWNhdGlvbiBzaG91bGQgcmVtYWluIHdpdGhpbiBjYW1lcmEgc2VydmljZS4KKyAgICB2aXJ0dWFsIGJvb2wgb25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKKworICAgIC8vIFN1YmNsYXNzZXMgY2FuIGRlY2lkZSBob3cgdG8gaGFuZGxlIHJlc3VsdCBlcnJvcnMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHRoZQorICAgIC8vIGludGVybmFsIHByb2Nlc3NpbmcgbmVlZHMgcmVzdWx0IGRhdGEuCisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CisKKyAgICAvLyBEZXZpY2UgYW5kL29yIHNlcnZpY2UgaXMgaW4gdW5yZWNvdmVyYWJsZSBlcnJvciBzdGF0ZS4KKyAgICAvLyBDb21wb3NpdGUgc3RyZWFtcyBzaG91bGQgYmVoYXZlIGFjY29yZGluZ2x5LgorICAgIHZvaWQgZW5hYmxlRXJyb3JTdGF0ZSgpOworCisgICAgd3A8Q2FtZXJhRGV2aWNlQmFzZT4gICBtRGV2aWNlOworICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBtUmVtb3RlQ2FsbGJhY2s7CisKKyAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgIG1NdXRleDsKKyAgICBDb25kaXRpb24gICAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgbUVycm9yU3RhdGU7CisKKyAgICAvLyBGcmFtZSBudW1iZXIgdG8gY2FwdHVyZSByZXN1bHQgbWFwIG9mIHBhcnRpYWwgcGVuZGluZyByZXF1ZXN0IHJlc3VsdHMuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBDYW1lcmFNZXRhZGF0YT4gbVBlbmRpbmdDYXB0dXJlUmVzdWx0czsKKworICAgIC8vIFRpbWVzdGFtcCB0byBjYXB0dXJlIChmcmFtZSBudW1iZXIsIHJlc3VsdCkgbWFwIG9mIGNvbXBsZXRlZCBwZW5kaW5nIHJlcXVlc3QgcmVzdWx0cy4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgc3RkOjp0dXBsZTxpbnQ2NF90LCBDYW1lcmFNZXRhZGF0YT4+IG1DYXB0dXJlUmVzdWx0czsKKworICAgIC8vIEZyYW1lIG51bWJlciB0byB0aW1lc3RhbXAgbWFwCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDY0X3QsIGludDY0X3Q+IG1GcmFtZU51bWJlck1hcDsKKworICAgIC8vIEtlZXBzIGEgc2V0IGJ1ZmZlci9yZXN1bHQgZnJhbWUgbnVtYmVycyBmb3IgYW55IGVycm9ycyBkZXRlY3RlZCBkdXJpbmcgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnNldDxpbnQ2NF90PiBtRXJyb3JGcmFtZU51bWJlcnM7CisKK307CisKK307IC8vbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MjVhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMCwwICsxLDgyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1EZXB0aENvbXBvc2l0ZVN0cmVhbSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiZGxmY24uaCIKKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlICJEZXB0aENvbXBvc2l0ZVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0RlcHRoQ29tcG9zaXRlU3RyZWFtOjpEZXB0aENvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYikgOgorICAgICAgICBDb21wb3NpdGVTdHJlYW0oZGV2aWNlLCBjYiksCisgICAgICAgIG1CbG9iU3RyZWFtSWQoLTEpLAorICAgICAgICBtQmxvYlN1cmZhY2VJZCgtMSksCisgICAgICAgIG1EZXB0aFN0cmVhbUlkKC0xKSwKKyAgICAgICAgbURlcHRoU3VyZmFjZUlkKC0xKSwKKyAgICAgICAgbUJsb2JXaWR0aCgwKSwKKyAgICAgICAgbUJsb2JIZWlnaHQoMCksCisgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKKyAgICAgICAgbUJsb2JCdWZmZXJBY3F1aXJlZChmYWxzZSksCisgICAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBQcm9kdWNlckxpc3RlbmVyKCkpLAorICAgICAgICBtTWF4SnBlZ1NpemUoLTEpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhKGZhbHNlKSwKKyAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1EZXB0aFBob3RvUHJvY2VzcyhudWxscHRyKSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gY2FtZXJhRGV2aWNlID0gZGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoY2FtZXJhRGV2aWNlLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IGNhbWVyYURldmljZS0+aW5mbygpOworICAgICAgICBhdXRvIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1NYXhKcGVnU2l6ZSA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBNYXhpbXVtIGpwZWcgc2l6ZSBhYnNlbnQgZnJvbSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04pOworICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gNSkgeworICAgICAgICAgICAgbUluc3RyaW5zaWNDYWxpYnJhdGlvbi5yZXNlcnZlKDUpOworICAgICAgICAgICAgbUluc3RyaW5zaWNDYWxpYnJhdGlvbi5pbnNlcnQobUluc3RyaW5zaWNDYWxpYnJhdGlvbi5lbmQoKSwgZW50cnkuZGF0YS5mLAorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmYgKyA1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogSW50cmluc2ljIGNhbGlicmF0aW9uIGFic2VudCBmcm9tIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTEVOU19ESVNUT1JUSU9OKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDUpIHsKKyAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbi5yZXNlcnZlKDUpOworICAgICAgICAgICAgbUxlbnNEaXN0b3J0aW9uLmluc2VydChtTGVuc0Rpc3RvcnRpb24uZW5kKCksIGVudHJ5LmRhdGEuZiwgZW50cnkuZGF0YS5mICsgNSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IExlbnMgZGlzdG9ydGlvbiBhYnNlbnQgZnJvbSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgeworICAgICAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnkuZGF0YS51OFtpXTsKKyAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSB7CisgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKHN0YXRpY0luZm8sICZtU3VwcG9ydGVkRGVwdGhTaXplcyk7CisKKyAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGUgPSBkbG9wZW4oY2FtZXJhMzo6a0RlcHRoUGhvdG9MaWJyYXJ5LCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgICAgICBpZiAobURlcHRoUGhvdG9MaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbURlcHRoUGhvdG9Qcm9jZXNzID0gcmVpbnRlcnByZXRfY2FzdDxjYW1lcmEzOjpwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lPiAoCisgICAgICAgICAgICAgICAgICAgIGRsc3ltKG1EZXB0aFBob3RvTGliSGFuZGxlLCBjYW1lcmEzOjprRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbikpOworICAgICAgICAgICAgaWYgKG1EZXB0aFBob3RvUHJvY2VzcyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbGluayB0byBkZXB0aCBwaG90byBwcm9jZXNzIGZ1bmN0aW9uOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRsZXJyb3IoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBsaW5rIHRvIGRlcHRoIHBob3RvIGxpYnJhcnk6ICVzIiwgX19GVU5DVElPTl9fLCBkbGVycm9yKCkpOworICAgICAgICB9CisKKyAgICB9Cit9CisKK0RlcHRoQ29tcG9zaXRlU3RyZWFtOjp+RGVwdGhDb21wb3NpdGVTdHJlYW0oKSB7CisgICAgbUJsb2JDb25zdW1lci5jbGVhcigpLAorICAgIG1CbG9iU3VyZmFjZS5jbGVhcigpLAorICAgIG1CbG9iU3RyZWFtSWQgPSAtMTsKKyAgICBtQmxvYlN1cmZhY2VJZCA9IC0xOworICAgIG1EZXB0aENvbnN1bWVyLmNsZWFyKCk7CisgICAgbURlcHRoU3VyZmFjZS5jbGVhcigpOworICAgIG1EZXB0aENvbnN1bWVyID0gbnVsbHB0cjsKKyAgICBtRGVwdGhTdXJmYWNlID0gbnVsbHB0cjsKKyAgICBpZiAobURlcHRoUGhvdG9MaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBkbGNsb3NlKG1EZXB0aFBob3RvTGliSGFuZGxlKTsKKyAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBtRGVwdGhQaG90b1Byb2Nlc3MgPSBudWxscHRyOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCkgeworICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgaW1nQnVmZmVyOworCisgICAgd2hpbGUgKCFtSW5wdXRKcGVnQnVmZmVycy5lbXB0eSgpICYmICFtQmxvYkJ1ZmZlckFjcXVpcmVkKSB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5wdXRKcGVnQnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1CbG9iQ29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpOworICAgICAgICBpZiAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgLy8gQ2FuIG5vdCBsb2NrIGFueSBtb3JlIGJ1ZmZlcnMuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgbG9ja2luZyBibG9iIGltYWdlIGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0SnBlZ0J1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKml0ICE9IGltZ0J1ZmZlci50aW1lc3RhbXApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogRXhwZWN0aW5nIGpwZWcgYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgcmVjZWl2ZWQgYnVmZmVyIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAidGltZSBzdGFtcDogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbUJsb2JDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmpwZWdCdWZmZXIgPSBpbWdCdWZmZXI7CisgICAgICAgICAgICBtQmxvYkJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRKcGVnQnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtSW5wdXREZXB0aEJ1ZmZlcnMuZW1wdHkoKSAmJiAhbURlcHRoQnVmZmVyQWNxdWlyZWQpIHsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dERlcHRoQnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1EZXB0aENvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmaW1nQnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIENhbiBub3QgbG9jayBhbnkgbW9yZSBidWZmZXJzLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHJlY2VpdmluZyBkZXB0aCBpbWFnZSBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dERlcHRoQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqaXQgIT0gaW1nQnVmZmVyLnRpbWVzdGFtcCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBFeHBlY3RpbmcgZGVwdGggYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgcmVjZWl2ZWQgYnVmZmVyIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAidGltZSBzdGFtcDogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbURlcHRoQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5kZXB0aEJ1ZmZlciA9IGltZ0J1ZmZlcjsKKyAgICAgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXREZXB0aEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUNhcHR1cmVSZXN1bHRzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1DYXB0dXJlUmVzdWx0cy5iZWdpbigpOworICAgICAgICAvLyBOZWdhdGl2ZSB0aW1lc3RhbXAgaW5kaWNhdGVzIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHRoZSBjYXB0dXJlIHJlc3VsdAorICAgICAgICAvLyBjb2xsZWN0aW9uIHByb2Nlc3MuCisgICAgICAgIGlmIChpdC0+Zmlyc3QgPj0gMCkgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLmZyYW1lTnVtYmVyID0gc3RkOjpnZXQ8MD4oaXQtPnNlY29uZCk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5maXJzdF0ucmVzdWx0ID0gc3RkOjpnZXQ8MT4oaXQtPnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgbUNhcHR1cmVSZXN1bHRzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1GcmFtZU51bWJlck1hcC5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBtRnJhbWVOdW1iZXJNYXAuYmVnaW4oKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+c2Vjb25kXS5mcmFtZU51bWJlciA9IGl0LT5maXJzdDsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBhdXRvIGl0ID0gbUVycm9yRnJhbWVOdW1iZXJzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1FcnJvckZyYW1lTnVtYmVycy5lbmQoKSkgeworICAgICAgICBib29sIGZyYW1lRm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChhdXRvICZpbnB1dEZyYW1lIDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGlucHV0RnJhbWUuc2Vjb25kLmZyYW1lTnVtYmVyID09ICppdCkgeworICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuc2Vjb25kLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmcmFtZUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmFtZUZvdW5kKSB7CisgICAgICAgICAgICBpdCA9IG1FcnJvckZyYW1lTnVtYmVycy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IE5vdCBhYmxlIHRvIGZpbmQgZmFpbGluZyBpbnB1dCB3aXRoIGZyYW1lIG51bWJlcjogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICppdCk7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXROZXh0UmVhZHlJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKSB7CisgICAgaWYgKGN1cnJlbnRUcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG5ld0lucHV0QXZhaWxhYmxlID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgaWYgKCghaXQuc2Vjb25kLmVycm9yKSAmJiAoaXQuc2Vjb25kLmRlcHRoQnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgICAgICAoaXQuc2Vjb25kLmpwZWdCdWZmZXIuZGF0YSAhPSBudWxscHRyKSAmJiAoaXQuZmlyc3QgPCAqY3VycmVudFRzKSkgeworICAgICAgICAgICAgKmN1cnJlbnRUcyA9IGl0LmZpcnN0OworICAgICAgICAgICAgbmV3SW5wdXRBdmFpbGFibGUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ld0lucHV0QXZhaWxhYmxlOworfQorCitpbnQ2NF90IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKmlub3V0Ki8pIHsKKyAgICBpbnQ2NF90IHJldCA9IC0xOworICAgIGlmIChjdXJyZW50VHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGlmIChpdC5zZWNvbmQuZXJyb3IgJiYgIWl0LnNlY29uZC5lcnJvck5vdGlmaWVkICYmIChpdC5maXJzdCA8ICpjdXJyZW50VHMpKSB7CisgICAgICAgICAgICAqY3VycmVudFRzID0gaXQuZmlyc3Q7CisgICAgICAgICAgICByZXQgPSBpdC5zZWNvbmQuZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0lucHV0RnJhbWUoY29uc3QgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIHN0YXR1c190IHJlczsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyICphbmI7CisgICAgaW50IGZlbmNlRmQ7CisgICAgdm9pZCAqZHN0QnVmZmVyOworCisgICAgYXV0byBqcGVnU2l6ZSA9IGFuZHJvaWQ6OmNhbWVyYTI6OkpwZWdQcm9jZXNzb3I6OmZpbmRKcGVnU2l6ZShpbnB1dEZyYW1lLmpwZWdCdWZmZXIuZGF0YSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUuanBlZ0J1ZmZlci53aWR0aCk7CisgICAgaWYgKGpwZWdTaXplID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBGYWlsZWQgdG8gZmluZCBpbnB1dCBqcGVnIHNpemUsIGRlZmF1bHQgdG8gdXNpbmcgZW50aXJlIGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBqcGVnU2l6ZSA9IGlucHV0RnJhbWUuanBlZ0J1ZmZlci53aWR0aDsKKyAgICB9CisKKyAgICBzaXplX3QgbWF4RGVwdGhKcGVnU2l6ZTsKKyAgICBpZiAobU1heEpwZWdTaXplID4gMCkgeworICAgICAgICBtYXhEZXB0aEpwZWdTaXplID0gbU1heEpwZWdTaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIG1heERlcHRoSnBlZ1NpemUgPSBzdGQ6Om1heDxzaXplX3Q+IChqcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLndpZHRoICogaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci5oZWlnaHQgKiAzIC8gMik7CisgICAgfQorICAgIHVpbnQ4X3QganBlZ1F1YWxpdHkgPSAxMDA7CisgICAgYXV0byBlbnRyeSA9IGlucHV0RnJhbWUucmVzdWx0LmZpbmQoQU5EUk9JRF9KUEVHX1FVQUxJVFkpOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAganBlZ1F1YWxpdHkgPSBlbnRyeS5kYXRhLnU4WzBdOworICAgIH0KKworICAgIC8vIFRoZSBmaW5hbCBkZXB0aCBwaG90byB3aWxsIGNvbnNpc3Qgb2YgdGhlIG1haW4ganBlZyBidWZmZXIsIHRoZSBkZXB0aCBtYXAgYnVmZmVyIChhbHNvIGluCisgICAgLy8ganBlZyBmb3JtYXQpIGFuZCBjb25maWRlbmNlIG1hcCAoanBlZyBhcyB3ZWxsKS4gQXNzdW1lIHdvcnN0IGNhc2UgdGhhdCBhbGwgMyBqcGVnIG5lZWQKKyAgICAvLyBtYXgganBlZyBzaXplLgorICAgIHNpemVfdCBmaW5hbEpwZWdCdWZmZXJTaXplID0gbWF4RGVwdGhKcGVnU2l6ZSAqIDM7CisKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtT3V0cHV0U3VyZmFjZS5nZXQoKSwgZmluYWxKcGVnQnVmZmVyU2l6ZSwgMSkpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgorICAgICAgICAgICAgICAgICIgJXp1eCV1IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIGZpbmFsSnBlZ0J1ZmZlclNpemUsIDFVLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBvdXRwdXRBTlctPmRlcXVldWVCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksICZhbmIsICZmZW5jZUZkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcmV0cmlldmluZyBvdXRwdXQgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwKKyAgICAgICAgICAgICAgICByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdiID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbShhbmIpOworICAgIHJlcyA9IGdiLT5sb2NrQXN5bmMoR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgJmRzdEJ1ZmZlciwgZmVuY2VGZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byBsb2NrIG91dHB1dCBidWZmZXIgZmVuY2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChnYi0+Z2V0V2lkdGgoKSA8IGZpbmFsSnBlZ0J1ZmZlclNpemUpIHx8IChnYi0+Z2V0SGVpZ2h0KCkgIT0gMSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBCbG9iIGJ1ZmZlciBzaXplIG1pc21hdGNoLCBleHBlY3RlZCAlZHglZCByZWNlaXZlZCAlenV4JXUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgZ2ItPmdldFdpZHRoKCksIGdiLT5nZXRIZWlnaHQoKSwgZmluYWxKcGVnQnVmZmVyU2l6ZSwgMVUpOworICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGRlcHRoUGhvdG87CisgICAgZGVwdGhQaG90by5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoaW5wdXRGcmFtZS5qcGVnQnVmZmVyLmRhdGEpOworICAgIGRlcHRoUGhvdG8ubU1haW5KcGVnV2lkdGggPSBtQmxvYldpZHRoOworICAgIGRlcHRoUGhvdG8ubU1haW5KcGVnSGVpZ2h0ID0gbUJsb2JIZWlnaHQ7CisgICAgZGVwdGhQaG90by5tTWFpbkpwZWdTaXplID0ganBlZ1NpemU7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBCdWZmZXIgPSByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4gKGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuZGF0YSk7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUuZGVwdGhCdWZmZXIud2lkdGg7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBIZWlnaHQgPSBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLmhlaWdodDsKKyAgICBkZXB0aFBob3RvLm1EZXB0aE1hcFN0cmlkZSA9IGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuc3RyaWRlOworICAgIGRlcHRoUGhvdG8ubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgZGVwdGhQaG90by5tSXNMb2dpY2FsID0gbUlzTG9naWNhbENhbWVyYTsKKyAgICBkZXB0aFBob3RvLm1NYXhKcGVnU2l6ZSA9IG1heERlcHRoSnBlZ1NpemU7CisgICAgLy8gVGhlIGNhbWVyYSBpbnRyaW5zaWMgY2FsaWJyYXRpb24gbGF5b3V0IGlzIGFzIGZvbGxvd3M6CisgICAgLy8gW2ZvY2FsTGVuZ3RoWCwgZm9jYWxMZW5ndGhZLCBvcHRpY2FsQ2VudGVyWCwgb3B0aWNhbENlbnRlclksIHNrZXddCisgICAgaWYgKG1JbnN0cmluc2ljQ2FsaWJyYXRpb24uc2l6ZSgpID09IDUpIHsKKyAgICAgICAgbWVtY3B5KGRlcHRoUGhvdG8ubUluc3RyaW5zaWNDYWxpYnJhdGlvbiwgbUluc3RyaW5zaWNDYWxpYnJhdGlvbi5kYXRhKCksCisgICAgICAgICAgICAgICAgc2l6ZW9mKGRlcHRoUGhvdG8ubUluc3RyaW5zaWNDYWxpYnJhdGlvbikpOworICAgICAgICBkZXB0aFBob3RvLm1Jc0luc3RyaW5zaWNDYWxpYnJhdGlvblZhbGlkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXB0aFBob3RvLm1Jc0luc3RyaW5zaWNDYWxpYnJhdGlvblZhbGlkID0gMDsKKyAgICB9CisgICAgLy8gVGhlIGNhbWVyYSBsZW5zIGRpc3RvcnRpb24gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZW5zIGNvcnJlY3Rpb24gY29lZmZpY2llbnRzLgorICAgIC8vIFtrYXBwYV8xLCBrYXBwYV8yLCBrYXBwYV8zIGthcHBhXzQsIGthcHBhXzVdCisgICAgaWYgKG1MZW5zRGlzdG9ydGlvbi5zaXplKCkgPT0gNSkgeworICAgICAgICBtZW1jcHkoZGVwdGhQaG90by5tTGVuc0Rpc3RvcnRpb24sIG1MZW5zRGlzdG9ydGlvbi5kYXRhKCksCisgICAgICAgICAgICAgICAgc2l6ZW9mKGRlcHRoUGhvdG8ubUxlbnNEaXN0b3J0aW9uKSk7CisgICAgICAgIGRlcHRoUGhvdG8ubUlzTGVuc0Rpc3RvcnRpb25WYWxpZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVwdGhQaG90by5tSXNMZW5zRGlzdG9ydGlvblZhbGlkID0gMDsKKyAgICB9CisgICAgZW50cnkgPSBpbnB1dEZyYW1lLnJlc3VsdC5maW5kKEFORFJPSURfSlBFR19PUklFTlRBVElPTik7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAvLyBUaGUgY2FtZXJhIGpwZWcgb3JpZW50YXRpb24gdmFsdWVzIG11c3QgYmUgd2l0aGluIFswLCA5MCwgMTgwLCAyNzBdLgorICAgICAgICBzd2l0Y2ggKGVudHJ5LmRhdGEuaTMyWzBdKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBkZXB0aFBob3RvLm1PcmllbnRhdGlvbiA9IHN0YXRpY19jYXN0PERlcHRoUGhvdG9PcmllbnRhdGlvbj4gKGVudHJ5LmRhdGEuaTMyWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGpwZWcgb3JpZW50YXRpb24gdmFsdWU6ICVkLCBkZWZhdWx0IHRvIDAgZGVncmVlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVudHJ5LmRhdGEuaTMyWzBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBhY3R1YWxKcGVnU2l6ZSA9IDA7CisgICAgcmVzID0gbURlcHRoUGhvdG9Qcm9jZXNzKGRlcHRoUGhvdG8sIGZpbmFsSnBlZ0J1ZmZlclNpemUsIGRzdEJ1ZmZlciwgJmFjdHVhbEpwZWdTaXplKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZXB0aCBwaG90byBwcm9jZXNzaW5nIGZhaWxlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IGZpbmFsSnBlZ1NpemUgPSBhY3R1YWxKcGVnU2l6ZSArIHNpemVvZihzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IpOworICAgIGlmIChmaW5hbEpwZWdTaXplID4gZmluYWxKcGVnQnVmZmVyU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IEZpbmFsIGpwZWcgYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHRoZSBqcGVnIGJsb2IgaGVhZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IEZpbmFsIGpwZWcgc2l6ZTogJXp1IiwgX19mdW5jX18sIGZpbmFsSnBlZ1NpemUpOworICAgIHVpbnQ4X3QqIGhlYWRlciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4gKGRzdEJ1ZmZlcikgKworICAgICAgICAoZ2ItPmdldFdpZHRoKCkgLSBzaXplb2Yoc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKSk7CisgICAgc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iICpibG9iID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IqPiAoaGVhZGVyKTsKKyAgICBibG9iLT5qcGVnX2Jsb2JfaWQgPSBDQU1FUkEzX0pQRUdfQkxPQl9JRDsKKyAgICBibG9iLT5qcGVnX3NpemUgPSBhY3R1YWxKcGVnU2l6ZTsKKyAgICBvdXRwdXRBTlctPnF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpyZWxlYXNlSW5wdXRGcmFtZUxvY2tlZChJbnB1dEZyYW1lICppbnB1dEZyYW1lIC8qb3V0Ki8pIHsKKyAgICBpZiAoaW5wdXRGcmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+ZGVwdGhCdWZmZXIuZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIG1EZXB0aENvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW5wdXRGcmFtZS0+ZGVwdGhCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5kZXB0aEJ1ZmZlci5kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgbURlcHRoQnVmZmVyQWNxdWlyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+anBlZ0J1ZmZlci5kYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUJsb2JDb25zdW1lci0+dW5sb2NrQnVmZmVyKGlucHV0RnJhbWUtPmpwZWdCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5qcGVnQnVmZmVyLmRhdGEgPSBudWxscHRyOworICAgICAgICBtQmxvYkJ1ZmZlckFjcXVpcmVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKChpbnB1dEZyYW1lLT5lcnJvciB8fCBtRXJyb3JTdGF0ZSkgJiYgIWlucHV0RnJhbWUtPmVycm9yTm90aWZpZWQpIHsKKyAgICAgICAgbm90aWZ5RXJyb3IoaW5wdXRGcmFtZS0+ZnJhbWVOdW1iZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5lcnJvck5vdGlmaWVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06OnJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChpbnQ2NF90IGN1cnJlbnRUcykgeworICAgIGF1dG8gaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0LT5maXJzdCA8PSBjdXJyZW50VHMpIHsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjp0aHJlYWRMb29wKCkgeworICAgIGludDY0X3QgY3VycmVudFRzID0gSU5UNjRfTUFYOworICAgIGJvb2wgbmV3SW5wdXRBdmFpbGFibGUgPSBmYWxzZTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgICAgICBpZiAobUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugd2UgbGFuZGVkIGluIGVycm9yIHN0YXRlLCByZXR1cm4gYW55IHBlbmRpbmcgYnVmZmVycyBhbmQKKyAgICAgICAgICAgIC8vIGhhbHQgYWxsIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFuZXdJbnB1dEF2YWlsYWJsZSkgeworICAgICAgICAgICAgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgICAgICAgICAgbmV3SW5wdXRBdmFpbGFibGUgPSBnZXROZXh0UmVhZHlJbnB1dExvY2tlZCgmY3VycmVudFRzKTsKKyAgICAgICAgICAgIGlmICghbmV3SW5wdXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGZhaWxpbmdGcmFtZU51bWJlciA9IGdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoJmN1cnJlbnRUcyk7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxpbmdGcmFtZU51bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBlcmFzZSAnbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdJyBhdCB0aGlzIHBvaW50IGJlY2F1c2UgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHR3byBpbnRlcm5hbCBzdHJlYW0gYnVmZmVycyB0byBmYWlsLiBJbiBzdWNoIHNjZW5hcmlvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wb3NpdGUgc3RyZWFtIHNob3VsZCBub3RpZnkgdGhlIGNsaWVudCBhYm91dCBhIHN0cmVhbSBidWZmZXIgZXJyb3Igb25seQorICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFuZCB0aGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgd2l0aGluICdlcnJvck5vdGlmaWVkJy4KKyAgICAgICAgICAgICAgICAgICAgLy8gQW55IHByZXNlbnQgZmFpbGVkIGlucHV0IGZyYW1lcyB3aWxsIGJlIHJlbW92ZWQgb24gYSBzdWJzZXF1ZW50IGNhbGwgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gJ3JlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZCgpJy4KKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoJm1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcyA9IElOVDY0X01BWDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdXRvIHJldCA9IG1JbnB1dFJlYWR5Q29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTXV0ZXgsIGtXYWl0RHVyYXRpb24pOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVGltZWQgd2FpdCBvbiBjb25kaXRpb24gZmFpbGVkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byByZXMgPSBwcm9jZXNzSW5wdXRGcmFtZShtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBwcm9jZXNzaW5nIGZyYW1lIHdpdGggdGltZXN0YW1wOiAlIiBQUkl1NjQgIjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjdXJyZW50VHMsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uZXJyb3IgPSB0cnVlOworICAgIH0KKworICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVwdGhDb21wb3NpdGVTdHJlYW06OmlzRGVwdGhDb21wb3NpdGVTdHJlYW0oY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBBTmF0aXZlV2luZG93ICphbncgPSBzdXJmYWNlLmdldCgpOworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQgZm9ybWF0OworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGZvcm1hdDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgZGF0YXNwYWNlOworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfREVGQVVMVF9EQVRBU1BBQ0UsICZkYXRhc3BhY2UpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZGF0YXNwYWNlOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICgoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgJiYgKGRhdGFzcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RZTkFNSUNfREVQVEgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgYm9vbCAvKmhhc0RlZmVycmVkQ29uc3VtZXIqLywgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IC8qc3RyZWFtU2V0SWQqLywgYm9vbCAvKmlzU2hhcmVkKi8pIHsKKyAgICBpZiAobVN1cHBvcnRlZERlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRoaXMgY2FtZXJhIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgYW55IGRlcHRoIG1hcCBzdHJlYW1zISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzaXplX3QgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQ7CisgICAgYXV0byByZXQgPSBnZXRNYXRjaGluZ0RlcHRoU2l6ZSh3aWR0aCwgaGVpZ2h0LCBtU3VwcG9ydGVkRGVwdGhTaXplcywgJmRlcHRoV2lkdGgsICZkZXB0aEhlaWdodCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGRlcHRoIHN0cmVhbSBzaXplISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBtQmxvYkNvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAvKm1heExvY2tlZEJ1ZmZlcnMqLzEsIC8qY29udHJvbGxlZEJ5QXBwKi8gdHJ1ZSk7CisgICAgbUJsb2JDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgICBtQmxvYkNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTMtSnBlZ0NvbXBvc2l0ZVN0cmVhbSIpKTsKKyAgICBtQmxvYlN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisKKyAgICByZXQgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQmxvYlN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwga0pwZWdEYXRhU3BhY2UsIHJvdGF0aW9uLAorICAgICAgICAgICAgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMpOworICAgIGlmIChyZXQgPT0gT0spIHsKKyAgICAgICAgbUJsb2JTdHJlYW1JZCA9ICppZDsKKyAgICAgICAgbUJsb2JTdXJmYWNlSWQgPSAoKnN1cmZhY2VJZHMpWzBdOworICAgICAgICBtT3V0cHV0U3VyZmFjZSA9IGNvbnN1bWVyc1swXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbURlcHRoQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIC8qbWF4TG9ja2VkQnVmZmVycyovIDEsIC8qY29udHJvbGxlZEJ5QXBwKi8gdHJ1ZSk7CisgICAgbURlcHRoQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgbURlcHRoQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMy1EZXB0aENvbXBvc2l0ZVN0cmVhbSIpKTsKKyAgICBtRGVwdGhTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworICAgIHN0ZDo6dmVjdG9yPGludD4gZGVwdGhTdXJmYWNlSWQ7CisgICAgcmV0ID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obURlcHRoU3VyZmFjZSwgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQsIGtEZXB0aE1hcFBpeGVsRm9ybWF0LAorICAgICAgICAgICAga0RlcHRoTWFwRGF0YVNwYWNlLCByb3RhdGlvbiwgJm1EZXB0aFN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmZGVwdGhTdXJmYWNlSWQpOworICAgIGlmIChyZXQgPT0gT0spIHsKKyAgICAgICAgbURlcHRoU3VyZmFjZUlkID0gZGVwdGhTdXJmYWNlSWRbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGdldFN0cmVhbUlkKCkpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgYmxvYiBzdHJlYW0gbGlzdGVuZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKG1EZXB0aFN0cmVhbUlkKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGRlcHRoIHN0cmVhbSBsaXN0ZW5lciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG1CbG9iV2lkdGggPSB3aWR0aDsKKyAgICBtQmxvYkhlaWdodCA9IGhlaWdodDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpjb25maWd1cmVTdHJlYW0oKSB7CisgICAgaWYgKGlzUnVubmluZygpKSB7CisgICAgICAgIC8vIFByb2Nlc3NpbmcgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZywgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgaWYgKChtRGVwdGhQaG90b0xpYkhhbmRsZSA9PSBudWxscHRyKSB8fCAobURlcHRoUGhvdG9Qcm9jZXNzID09IG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggcGhvdG8gbGlicmFyeSBpcyBub3QgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IE5vIHZhbGlkIG91dHB1dCBzdXJmYWNlIHNldCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IG1PdXRwdXRTdXJmYWNlLT5jb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSwgbVByb2R1Y2VyTGlzdGVuZXIpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93IGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtT3V0cHV0U3VyZmFjZS5nZXQoKSwgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGZvcm1hdCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGludCBtYXhQcm9kdWNlckJ1ZmZlcnM7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gbUJsb2JTdXJmYWNlLmdldCgpOworICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1heFByb2R1Y2VyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGNvbnN1bWVyIHVuZGVxdWV1ZWQiCisgICAgICAgICAgICAgICAgIiBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQU5hdGl2ZVdpbmRvdyAqYW53Q29uc3VtZXIgPSBtT3V0cHV0U3VyZmFjZS5nZXQoKTsKKyAgICBpbnQgbWF4Q29uc3VtZXJCdWZmZXJzOworICAgIGlmICgocmVzID0gYW53Q29uc3VtZXItPnF1ZXJ5KGFud0NvbnN1bWVyLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCisgICAgICAgICAgICAgICAgICAgICZtYXhDb25zdW1lckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBjb25zdW1lciB1bmRlcXVldWVkIgorICAgICAgICAgICAgICAgICIgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KAorICAgICAgICAgICAgICAgICAgICBhbndDb25zdW1lciwgbWF4UHJvZHVjZXJCdWZmZXJzICsgbWF4Q29uc3VtZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBydW4oIkRlcHRoQ29tcG9zaXRlU3RyZWFtUHJvYyIpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6ZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgeworICAgIC8vIFRoZSAnQ2FtZXJhRGV2aWNlQ2xpZW50JyBwYXJlbnQgd2lsbCBkZWxldGUgdGhlIGJsb2Igc3RyZWFtCisgICAgcmVxdWVzdEV4aXQoKTsKKworICAgIGF1dG8gcmV0ID0gam9pbigpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gam9pbiB3aXRoIHRoZSBtYWluIHByb2Nlc3NpbmcgdGhyZWFkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgIH0KKworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmICghZGV2aWNlLmdldCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChtRGVwdGhTdHJlYW1JZCA+PSAwKSB7CisgICAgICAgIHJldCA9IGRldmljZS0+ZGVsZXRlU3RyZWFtKG1EZXB0aFN0cmVhbUlkKTsKKyAgICAgICAgbURlcHRoU3RyZWFtSWQgPSAtMTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtT3V0cHV0U3VyZmFjZS0+ZGlzY29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOworICAgICAgICBtT3V0cHV0U3VyZmFjZS5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgeworICAgIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0ga0pwZWdEYXRhU3BhY2UpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBKcGVnIGJ1ZmZlciB3aXRoIHRzOiAlIiBQUkl1NjQgIiBtcy4gYXJyaXZlZCEiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuczJtcyhpdGVtLm1UaW1lc3RhbXApKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICBtSW5wdXRKcGVnQnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0ga0RlcHRoTWFwRGF0YVNwYWNlKSB7CisgICAgICAgIEFMT0dWKCIlczogRGVwdGggYnVmZmVyIHdpdGggdHM6ICUiIFBSSXU2NCAiIG1zLiBhcnJpdmVkISIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIG5zMm1zKGl0ZW0ubVRpbWVzdGFtcCkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dERlcHRoQnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGRhdGEgc3BhY2U6IDB4JXgiLCBfX0ZVTkNUSU9OX18sIGl0ZW0ubURhdGFTcGFjZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLAorICAgICAgICBWZWN0b3I8aW50MzJfdD4gKiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSB7CisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobURlcHRoU3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbbURlcHRoU3RyZWFtSWRdID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMtPnB1c2hfYmFjayhtRGVwdGhTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbURlcHRoU3RyZWFtSWRdLnB1c2hfYmFjayhtRGVwdGhTdXJmYWNlSWQpOworCisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobUJsb2JTdHJlYW1JZCkgPT0gb3V0U3VyZmFjZU1hcC0+ZW5kKCkpIHsKKyAgICAgICAgKCpvdXRTdXJmYWNlTWFwKVttQmxvYlN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobUJsb2JTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbUJsb2JTdHJlYW1JZF0ucHVzaF9iYWNrKG1CbG9iU3VyZmFjZUlkKTsKKworICAgIGlmIChjdXJyZW50U3RyZWFtSWQgIT0gbnVsbHB0cikgeworICAgICAgICAqY3VycmVudFN0cmVhbUlkID0gbUJsb2JTdHJlYW1JZDsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06Om9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgLy8gUHJvY2Vzc2luZyBjYW4gY29udGludWUgZXZlbiBpbiBjYXNlIG9mIHJlc3VsdCBlcnJvcnMuCisgICAgLy8gQXQgdGhlIG1vbWVudCBkZXB0aCBjb21wb3NpdGUgc3RyZWFtIHByb2Nlc3NpbmcgcmVsaWVzIG1haW5seSBvbiBzdGF0aWMgY2FtZXJhCisgICAgLy8gY2hhcmFjdGVyaXN0aWNzIGRhdGEuIFRoZSBhY3R1YWwgcmVzdWx0IGRhdGEgY2FuIGJlIHVzZWQgZm9yIHRoZSBqcGVnIHF1YWxpdHkgYnV0CisgICAgLy8gaW4gY2FzZSBpdCBpcyBhYnNlbnQgd2UgY2FuIGRlZmF1bHQgdG8gbWF4aW11bS4KKyAgICBlcmFzZVJlc3VsdChyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgLy8gQnVmZmVyIGVycm9ycyBjb25jZXJuaW5nIGludGVybmFsIGNvbXBvc2l0ZSBzdHJlYW1zIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgdmlzaWJsZSB0bworICAgIC8vIGNhbWVyYSBjbGllbnRzLiBUaGV5IG11c3Qgb25seSByZWNlaXZlIGEgc2luZ2xlIGJ1ZmZlciBlcnJvciB3aXRoIHRoZSBwdWJsaWMgY29tcG9zaXRlCisgICAgLy8gc3RyZWFtIGlkLgorICAgIGlmICgocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbURlcHRoU3RyZWFtSWQpIHx8CisgICAgICAgICAgICAocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbUJsb2JTdHJlYW1JZCkpIHsKKyAgICAgICAgZmxhZ0FuRXJyb3JGcmFtZU51bWJlcihyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICByZXQgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRNYXRjaGluZ0RlcHRoU2l6ZShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc3VwcG9yZWREZXB0aFNpemVzLAorICAgICAgICBzaXplX3QgKmRlcHRoV2lkdGggLypvdXQqLywgc2l6ZV90ICpkZXB0aEhlaWdodCAvKm91dCovKSB7CisgICAgaWYgKChkZXB0aFdpZHRoID09IG51bGxwdHIpIHx8IChkZXB0aEhlaWdodCA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGZsb2F0IGFyVG9sID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjprRGVwdGhBUlRvbGVyYW5jZTsKKyAgICAqZGVwdGhXaWR0aCA9ICpkZXB0aEhlaWdodCA9IDA7CisKKyAgICBmbG9hdCBhc3BlY3RSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PiAod2lkdGgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+IChoZWlnaHQpOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBzdXBwb3JlZERlcHRoU2l6ZXMpIHsKKyAgICAgICAgYXV0byBjdXJyZW50V2lkdGggPSBzdGQ6OmdldDwwPihpdCk7CisgICAgICAgIGF1dG8gY3VycmVudEhlaWdodCA9IHN0ZDo6Z2V0PDE+KGl0KTsKKyAgICAgICAgaWYgKChjdXJyZW50V2lkdGggPT0gd2lkdGgpICYmIChjdXJyZW50SGVpZ2h0ID09IGhlaWdodCkpIHsKKyAgICAgICAgICAgICpkZXB0aFdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAqZGVwdGhIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsb2F0IGN1cnJlbnRSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PiAoY3VycmVudFdpZHRoKSAvCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PiAoY3VycmVudEhlaWdodCk7CisgICAgICAgICAgICBhdXRvIGN1cnJlbnRTaXplID0gY3VycmVudFdpZHRoICogY3VycmVudEhlaWdodDsKKyAgICAgICAgICAgIGF1dG8gb2xkU2l6ZSA9ICgqZGVwdGhXaWR0aCkgKiAoKmRlcHRoSGVpZ2h0KTsKKyAgICAgICAgICAgIGlmICgoZmFicyhhc3BlY3RSYXRpbyAtIGN1cnJlbnRSYXRpbykgPD0gYXJUb2wpICYmIChjdXJyZW50U2l6ZSA+IG9sZFNpemUpKSB7CisgICAgICAgICAgICAgICAgKmRlcHRoV2lkdGggPSBjdXJyZW50V2lkdGg7CisgICAgICAgICAgICAgICAgKmRlcHRoSGVpZ2h0ID0gY3VycmVudEhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoKCpkZXB0aFdpZHRoID4gMCkgJiYgKCpkZXB0aEhlaWdodCA+IDApKSA/IE9LIDogQkFEX1ZBTFVFOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+KiBkZXB0aFNpemVzIC8qb3V0Ki8pIHsKKyAgICBpZiAoZGVwdGhTaXplcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVudHJ5ID0gY2guZmluZChBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gRGVwdGggc3RyZWFtIGRpbWVuc2lvbnMgaGF2ZSBmb3VyIGludDMyX3QgY29tcG9uZW50cworICAgICAgICAvLyAocGl4ZWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIHR5cGUpCisgICAgICAgIHNpemVfdCBlbnRyeUNvdW50ID0gZW50cnkuY291bnQgLyA0OworICAgICAgICBkZXB0aFNpemVzLT5yZXNlcnZlKGVudHJ5Q291bnQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmICgoZW50cnkuZGF0YS5pMzJbaV0gPT0ga0RlcHRoTWFwUGl4ZWxGb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgIChlbnRyeS5kYXRhLmkzMltpKzNdID09CisgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCkpIHsKKyAgICAgICAgICAgICAgICBkZXB0aFNpemVzLT5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKGVudHJ5LmRhdGEuaTMyW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSsyXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pIHsKKyAgICBpZiAoY29tcG9zaXRlT3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gZGVwdGhTaXplczsKKyAgICBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNoLCAmZGVwdGhTaXplcyk7CisgICAgaWYgKGRlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGRlcHRoIHN0cmVhbSBjb25maWd1cmF0aW9ucyBwcmVzZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQ7CisgICAgYXV0byByZXQgPSBnZXRNYXRjaGluZ0RlcHRoU2l6ZShzdHJlYW1JbmZvLndpZHRoLCBzdHJlYW1JbmZvLmhlaWdodCwgZGVwdGhTaXplcywgJmRlcHRoV2lkdGgsCisgICAgICAgICAgICAmZGVwdGhIZWlnaHQpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBtYXRjaGluZyBkZXB0aCBzdHJlYW0gc2l6ZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgY29tcG9zaXRlT3V0cHV0LT5jbGVhcigpOworICAgIGNvbXBvc2l0ZU91dHB1dC0+aW5zZXJ0KGNvbXBvc2l0ZU91dHB1dC0+ZW5kKCksIDIsIHN0cmVhbUluZm8pOworCisgICAgLy8gSnBlZy9CbG9iIHN0cmVhbSBpbmZvCisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmRhdGFTcGFjZSA9IGtKcGVnRGF0YVNwYWNlOworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5jb25zdW1lclVzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOOworCisgICAgLy8gRGVwdGggc3RyZWFtIGluZm8KKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0ud2lkdGggPSBkZXB0aFdpZHRoOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5oZWlnaHQgPSBkZXB0aEhlaWdodDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uZm9ybWF0ID0ga0RlcHRoTWFwUGl4ZWxGb3JtYXQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmRhdGFTcGFjZSA9IGtEZXB0aE1hcERhdGFTcGFjZTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uY29uc3VtZXJVc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmMzFmNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX0NPTVBPU0lURV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfREVQVEhfQ09NUE9TSVRFX1NUUkVBTV9ICisKKyNpbmNsdWRlICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvaW1hZ2luZ19tb2RlbC5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZGVwdGhfbWFwLmg+CisKKyNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KKworI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgorCit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aE1hcDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6Okl0ZW07Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJbWFnaW5nTW9kZWw7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2FtZXJhRGV2aWNlQ2xpZW50OworY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBTdXJmYWNlOworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIERlcHRoQ29tcG9zaXRlU3RyZWFtIDogcHVibGljIENvbXBvc2l0ZVN0cmVhbSwgcHVibGljIFRocmVhZCwKKyAgICAgICAgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKKworcHVibGljOgorICAgIERlcHRoQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYik7CisgICAgfkRlcHRoQ29tcG9zaXRlU3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIC8vIENvbXBvc2l0ZVN0cmVhbSBvdmVycmlkZXMKKyAgICBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW0oKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBpbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpIG92ZXJyaWRlOworICAgIGludCBnZXRTdHJlYW1JZCgpIG92ZXJyaWRlIHsgcmV0dXJuIG1CbG9iU3RyZWFtSWQ7IH0KKworICAgIC8vIENwdUNvbnN1bWVyIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIG92ZXJyaWRlOworCisgICAgLy8gUmV0dXJuIHN0cmVhbSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pOworCitwcm90ZWN0ZWQ6CisKKyAgICBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKyAgICBib29sIG9uU3RyZWFtQnVmZmVyRXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgSW5wdXRGcmFtZSB7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgZGVwdGhCdWZmZXI7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIganBlZ0J1ZmZlcjsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICByZXN1bHQ7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3I7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZDsKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcjsKKworICAgICAgICBJbnB1dEZyYW1lKCkgOiBlcnJvcihmYWxzZSksIGVycm9yTm90aWZpZWQoZmFsc2UpLCBmcmFtZU51bWJlcigtMSkgeyB9CisgICAgfTsKKworICAgIC8vIEhlbHBlciBtZXRob2RzCisgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4qIGRlcHRoU2l6ZXMgLypvdXQqLyk7CisgICAgc3RhdGljIHN0YXR1c190IGdldE1hdGNoaW5nRGVwdGhTaXplKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc3VwcG9yZWREZXB0aFNpemVzLAorICAgICAgICAgICAgc2l6ZV90ICpkZXB0aFdpZHRoIC8qb3V0Ki8sIHNpemVfdCAqZGVwdGhIZWlnaHQgLypvdXQqLyk7CisKKyAgICAvLyBEeW5hbWljIGRlcHRoIHByb2Nlc3NpbmcKKyAgICBzdGF0dXNfdCBlbmNvZGVHcmF5c2NhbGVKcGVnKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgdWludDhfdCAqaW4sIHZvaWQgKm91dCwKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtYXhPdXRTaXplLCB1aW50OF90IGpwZWdRdWFsaXR5LCBzaXplX3QgJmFjdHVhbFNpemUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXB0aE1hcD4gcHJvY2Vzc0RlcHRoTWFwRnJhbWUoY29uc3QgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciAmZGVwdGhNYXBCdWZmZXIsCisgICAgICAgICAgICBzaXplX3QgbWF4SnBlZ1NpemUsIHVpbnQ4X3QganBlZ1F1YWxpdHksCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SXRlbT4+KiBpdGVtcyAvKm91dCovKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1hZ2luZ01vZGVsPiBnZXRJbWFnaW5nTW9kZWwoKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzSW5wdXRGcmFtZShjb25zdCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKworICAgIC8vIEJ1ZmZlci9SZXN1bHRzIGhhbmRsaW5nCisgICAgdm9pZCBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgdm9pZCByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZChJbnB1dEZyYW1lICppbnB1dEZyYW1lIC8qb3V0Ki8pOworICAgIHZvaWQgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGludDY0X3QgY3VycmVudFRzKTsKKworICAgIC8vIEZpbmQgZmlyc3QgY29tcGxldGUgYW5kIHZhbGlkIGZyYW1lIHdpdGggc21hbGxlc3QgdGltZXN0YW1wCisgICAgYm9vbCBnZXROZXh0UmVhZHlJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKTsKKworICAgIC8vIEZpbmQgbmV4dCBmYWlsaW5nIGZyYW1lIG51bWJlciB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcCBhbmQgcmV0dXJuIHJlc3BlY3RpdmUgZnJhbWUgbnVtYmVyCisgICAgaW50NjRfdCBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKmlub3V0Ki8pOworCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDEwMDAwMDAwOyAvLyAxMCBtcworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtEZXB0aE1hcFBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZMTY7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0RlcHRoTWFwRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9ERVBUSDsKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrSnBlZ0RhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRjsKKworICAgIGludCAgICAgICAgICAgICAgICAgIG1CbG9iU3RyZWFtSWQsIG1CbG9iU3VyZmFjZUlkLCBtRGVwdGhTdHJlYW1JZCwgbURlcHRoU3VyZmFjZUlkOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1CbG9iV2lkdGgsIG1CbG9iSGVpZ2h0OworICAgIHNwPENwdUNvbnN1bWVyPiAgICAgIG1CbG9iQ29uc3VtZXIsIG1EZXB0aENvbnN1bWVyOworICAgIGJvb2wgICAgICAgICAgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkLCBtQmxvYkJ1ZmZlckFjcXVpcmVkOworICAgIHNwPFN1cmZhY2U+ICAgICAgICAgIG1EZXB0aFN1cmZhY2UsIG1CbG9iU3VyZmFjZSwgbU91dHB1dFN1cmZhY2U7CisgICAgc3A8UHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CisKKyAgICBzc2l6ZV90ICAgICAgICAgICAgICBtTWF4SnBlZ1NpemU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IG1TdXBwb3J0ZWREZXB0aFNpemVzOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAgIG1JbnN0cmluc2ljQ2FsaWJyYXRpb24sIG1MZW5zRGlzdG9ydGlvbjsKKyAgICBib29sICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhOworICAgIHZvaWQqICAgICAgICAgICAgICAgIG1EZXB0aFBob3RvTGliSGFuZGxlOworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgbURlcHRoUGhvdG9Qcm9jZXNzOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgRGVwdGggYnVmZmVyIHRpbWVzdGFtcHMgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0RGVwdGhCdWZmZXJzOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgSnBlZy9CbG9iIGJ1ZmZlciB0aW1lc3RhbXBzIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG1JbnB1dEpwZWdCdWZmZXJzOworCisgICAgLy8gTWFwIG9mIGFsbCBpbnB1dCBmcmFtZXMgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDY0X3QsIElucHV0RnJhbWU+IG1QZW5kaW5nSW5wdXRGcmFtZXM7Cit9OworCit9OyAvL25hbWVzcGFjZSBjYW1lcmEzCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzYzgxNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAKQEAgLTAsMCArMSwxNzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLUhlaWNDb21wb3NpdGVTdHJlYW0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGxpbnV4L21lbWZkLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L3R5cGVzLmg+CisjaW5jbHVkZSA8bGlieXV2Lmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgInV0aWxzL0V4aWZVdGlscy5oIgorI2luY2x1ZGUgIkhlaWNFbmNvZGVySW5mb01hbmFnZXIuaCIKKyNpbmNsdWRlICJIZWljQ29tcG9zaXRlU3RyZWFtLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6Q2FtZXJhQmxvYjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6Q2FtZXJhQmxvYklkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0hlaWNDb21wb3NpdGVTdHJlYW06OkhlaWNDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLAorICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpIDoKKyAgICAgICAgQ29tcG9zaXRlU3RyZWFtKGRldmljZSwgY2IpLAorICAgICAgICBtVXNlSGVpYyhmYWxzZSksCisgICAgICAgIG1OdW1PdXRwdXRUaWxlcygxKSwKKyAgICAgICAgbU91dHB1dFdpZHRoKDApLAorICAgICAgICBtT3V0cHV0SGVpZ2h0KDApLAorICAgICAgICBtTWF4SGVpY0J1ZmZlclNpemUoMCksCisgICAgICAgIG1HcmlkV2lkdGgoSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6a0dyaWRXaWR0aCksCisgICAgICAgIG1HcmlkSGVpZ2h0KEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkSGVpZ2h0KSwKKyAgICAgICAgbUdyaWRSb3dzKDEpLAorICAgICAgICBtR3JpZENvbHMoMSksCisgICAgICAgIG1Vc2VHcmlkKGZhbHNlKSwKKyAgICAgICAgbUFwcFNlZ21lbnRTdHJlYW1JZCgtMSksCisgICAgICAgIG1BcHBTZWdtZW50U3VyZmFjZUlkKC0xKSwKKyAgICAgICAgbUFwcFNlZ21lbnRCdWZmZXJBY3F1aXJlZChmYWxzZSksCisgICAgICAgIG1NYWluSW1hZ2VTdHJlYW1JZCgtMSksCisgICAgICAgIG1NYWluSW1hZ2VTdXJmYWNlSWQoLTEpLAorICAgICAgICBtWXV2QnVmZmVyQWNxdWlyZWQoZmFsc2UpLAorICAgICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgUHJvZHVjZXJMaXN0ZW5lcigpKSwKKyAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50ZXIoMCksCisgICAgICAgIG1HcmlkVGltZXN0YW1wVXMoMCkgeworfQorCitIZWljQ29tcG9zaXRlU3RyZWFtOjp+SGVpY0NvbXBvc2l0ZVN0cmVhbSgpIHsKKyAgICAvLyBDYWxsIGRlaW5pdENvZGVjIGluIGNhc2Ugc3RyZWFtIGhhc24ndCBiZWVuIGRlbGV0ZWQgeWV0IHRvIGF2b2lkIGFueQorICAgIC8vIG1lbW9yeS9yZXNvdXJjZSBsZWFrLgorICAgIGRlaW5pdENvZGVjKCk7CisKKyAgICBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5jbGVhcigpOworICAgIG1Db2RlY091dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKKworICAgIG1BcHBTZWdtZW50U3RyZWFtSWQgPSAtMTsKKyAgICBtQXBwU2VnbWVudFN1cmZhY2VJZCA9IC0xOworICAgIG1BcHBTZWdtZW50Q29uc3VtZXIuY2xlYXIoKTsKKyAgICBtQXBwU2VnbWVudFN1cmZhY2UuY2xlYXIoKTsKKworICAgIG1NYWluSW1hZ2VTdHJlYW1JZCA9IC0xOworICAgIG1NYWluSW1hZ2VTdXJmYWNlSWQgPSAtMTsKKyAgICBtTWFpbkltYWdlQ29uc3VtZXIuY2xlYXIoKTsKKyAgICBtTWFpbkltYWdlU3VyZmFjZS5jbGVhcigpOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIEFOYXRpdmVXaW5kb3cgKmFudyA9IHN1cmZhY2UuZ2V0KCk7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGludCBmb3JtYXQ7CisgICAgaWYgKChlcnIgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19GT1JNQVQsICZmb3JtYXQpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZm9ybWF0OiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludCBkYXRhc3BhY2U7CisgICAgaWYgKChlcnIgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19ERUZBVUxUX0RBVEFTUEFDRSwgJmRhdGFzcGFjZSkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBkYXRhc3BhY2U6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwKKyAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuICgoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgJiYgKGRhdGFzcGFjZSA9PSBIQUxfREFUQVNQQUNFX0hFSUYpKTsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICBib29sIC8qaGFzRGVmZXJyZWRDb25zdW1lciovLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgLypzdHJlYW1TZXRJZCovLCBib29sIC8qaXNTaGFyZWQqLykgeworCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzID0gaW5pdGlhbGl6ZUNvZGVjKHdpZHRoLCBoZWlnaHQsIGRldmljZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIEhFSUMvSEVWQyBjb2RlYzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBtQXBwU2VnbWVudENvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAxKTsKKyAgICBtQXBwU2VnbWVudENvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOworICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMy1IZWljQ29tcG9zaXRlLUFwcFNlZ21lbnRTdHJlYW0iKSk7CisgICAgbUFwcFNlZ21lbnRTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworCisgICAgbVN0YXRpY0luZm8gPSBkZXZpY2UtPmluZm8oKTsKKworICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1BcHBTZWdtZW50U3VyZmFjZSwgbUFwcFNlZ21lbnRNYXhTaXplLCAxLCBmb3JtYXQsCisgICAgICAgICAgICBrQXBwU2VnbWVudERhdGFTcGFjZSwgcm90YXRpb24sICZtQXBwU2VnbWVudFN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCBzdXJmYWNlSWRzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1BcHBTZWdtZW50U3VyZmFjZUlkID0gKCpzdXJmYWNlSWRzKVswXTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgSlBFRyBBcHAgc2VnbWVudCBzdHJlYW06ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKCFtVXNlR3JpZCkgeworICAgICAgICByZXMgPSBtQ29kZWMtPmNyZWF0ZUlucHV0U3VyZmFjZSgmcHJvZHVjZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgaW5wdXQgc3VyZmFjZSBmb3IgSGVpYyBjb2RlYzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAxKTsKKyAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMy1IZWljQ29tcG9zaXRlLUhldmNJbnB1dFlVVlN0cmVhbSIpKTsKKyAgICB9CisgICAgbU1haW5JbWFnZVN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisKKyAgICByZXMgPSBtQ29kZWMtPnN0YXJ0KCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzdGFydCBjb2RlYzogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHNvdXJjZVN1cmZhY2VJZDsKKyAgICAvL1VzZSBZVVZfODg4IGZvcm1hdCBpZiBmcmFtZXdvcmsgdGlsaW5nIGlzIG5lZWRlZC4KKyAgICBpbnQgc3JjU3RyZWFtRm10ID0gbVVzZUdyaWQgPyBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODggOgorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1NYWluSW1hZ2VTdXJmYWNlLCB3aWR0aCwgaGVpZ2h0LCBzcmNTdHJlYW1GbXQsIGtIZWlmRGF0YVNwYWNlLAorICAgICAgICAgICAgcm90YXRpb24sIGlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc291cmNlU3VyZmFjZUlkKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1NYWluSW1hZ2VTdXJmYWNlSWQgPSBzb3VyY2VTdXJmYWNlSWRbMF07CisgICAgICAgIG1NYWluSW1hZ2VTdHJlYW1JZCA9ICppZDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgbWFpbiBpbWFnZSBzdHJlYW06ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbU91dHB1dFN1cmZhY2UgPSBjb25zdW1lcnNbMF07CisgICAgcmVzID0gcmVnaXN0ZXJDb21wb3NpdGVTdHJlYW1MaXN0ZW5lcihnZXRTdHJlYW1JZCgpKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIEhBTCBtYWluIGltYWdlIHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaW5pdENvcHlSb3dGdW5jdGlvbih3aWR0aCk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6ZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgeworICAgIHJlcXVlc3RFeGl0KCk7CisgICAgYXV0byByZXMgPSBqb2luKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBqb2luIHdpdGggdGhlIG1haW4gcHJvY2Vzc2luZyB0aHJlYWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCisgICAgZGVpbml0Q29kZWMoKTsKKworICAgIGlmIChtQXBwU2VnbWVudFN0cmVhbUlkID49IDApIHsKKyAgICAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmICghZGV2aWNlLmdldCgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGRldmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKworICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtQXBwU2VnbWVudFN0cmVhbUlkKTsKKyAgICAgICAgbUFwcFNlZ21lbnRTdHJlYW1JZCA9IC0xOworICAgIH0KKworICAgIGlmIChtT3V0cHV0U3VyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1PdXRwdXRTdXJmYWNlLT5kaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7CisgICAgICAgIG1PdXRwdXRTdXJmYWNlLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIGlmIChidWZmZXJJbmZvLm1FcnJvcikgcmV0dXJuOworCisgICAgbUNvZGVjT3V0cHV0QnVmZmVyVGltZXN0YW1wcy5wdXNoKGJ1ZmZlckluZm8ubVRpbWVzdGFtcCk7Cit9CisKKy8vIFdlIG5lZWQgdG8gZ2V0IHRoZSBzZXR0aW5ncyBlYXJseSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvZGVjIG91dHB1dAorLy8gYXJyaXZlcyBlYXJsaWVyIHRoYW4gcmVzdWx0IG1ldGFkYXRhLgordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIHsKKyAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oIkhFSUMgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKG1FcnJvclN0YXRlIHx8IChzdHJlYW1JZCAhPSBnZXRTdHJlYW1JZCgpKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbXBsYWNlKGZyYW1lTnVtYmVyLCBDYW1lcmFNZXRhZGF0YSgpKTsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeTsKKworICAgIGludDMyX3Qgb3JpZW50YXRpb24gPSAwOworICAgIGVudHJ5ID0gc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIG9yaWVudGF0aW9uID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfQorCisgICAgaW50MzJfdCBxdWFsaXR5ID0ga0RlZmF1bHRKcGVnUXVhbGl0eTsKKyAgICBlbnRyeSA9IHNldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX1FVQUxJVFkpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIHF1YWxpdHkgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9CisKKyAgICBtU2V0dGluZ3NCeUZyYW1lTnVtYmVyW2ZyYW1lTnVtYmVyXSA9IHN0ZDo6bWFrZV9wYWlyKG9yaWVudGF0aW9uLCBxdWFsaXR5KTsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIHsKKyAgICBpZiAoaXRlbS5tRGF0YVNwYWNlID09IHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihrQXBwU2VnbWVudERhdGFTcGFjZSkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBKUEVHIEFQUCBzZWdtZW50cyBidWZmZXIgd2l0aCB0czogJSIgUFJJdTY0ICIgbXMuIGFycml2ZWQhIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbnMybXMoaXRlbS5tVGltZXN0YW1wKSk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKCFtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMucHVzaF9iYWNrKGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXRlbS5tRGF0YVNwYWNlID09IGtIZWlmRGF0YVNwYWNlKSB7CisgICAgICAgIEFMT0dWKCIlczogWVVWXzg4OCBidWZmZXIgd2l0aCB0czogJSIgUFJJdTY0ICIgbXMuIGFycml2ZWQhIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbnMybXMoaXRlbS5tVGltZXN0YW1wKSk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKCFtVXNlR3JpZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBZVVZfODg4IGludGVybmFsIHN0cmVhbSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSEVWQyB0aWxpbmciLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dFl1dkJ1ZmZlcnMucHVzaF9iYWNrKGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBkYXRhIHNwYWNlOiAweCV4IiwgX19GVU5DVElPTl9fLCBpdGVtLm1EYXRhU3BhY2UpOworICAgIH0KK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pIHsKKyAgICBpZiAoY29tcG9zaXRlT3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb21wb3NpdGVPdXRwdXQtPmNsZWFyKCk7CisKKyAgICBib29sIHVzZUdyaWQsIHVzZUhlaWM7CisgICAgYm9vbCBpc1NpemVTdXBwb3J0ZWQgPSBpc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKAorICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCwgc3RyZWFtSW5mby5oZWlnaHQsICZ1c2VIZWljLCAmdXNlR3JpZCwgbnVsbHB0cik7CisgICAgaWYgKCFpc1NpemVTdXBwb3J0ZWQpIHsKKyAgICAgICAgLy8gU2l6ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGVpdGhlciBlbmNvZGVyLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29tcG9zaXRlT3V0cHV0LT5pbnNlcnQoY29tcG9zaXRlT3V0cHV0LT5lbmQoKSwgMiwgc3RyZWFtSW5mbyk7CisKKyAgICAvLyBKUEVHIEFQUFMgc2VnbWVudHMgQmxvYiBzdHJlYW0gaW5mbworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS53aWR0aCA9IGNhbGNBcHBTZWdtZW50TWF4U2l6ZShjaCk7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmhlaWdodCA9IDE7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfQkxPQjsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uZGF0YVNwYWNlID0ga0FwcFNlZ21lbnREYXRhU3BhY2U7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmNvbnN1bWVyVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU47CisKKyAgICAvLyBZVVYvSU1QTEVNRU5UQVRJT05fREVGSU5FRCBzdHJlYW0gaW5mbworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS53aWR0aCA9IHN0cmVhbUluZm8ud2lkdGg7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmhlaWdodCA9IHN0cmVhbUluZm8uaGVpZ2h0OworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5mb3JtYXQgPSB1c2VHcmlkID8gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4IDoKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uZGF0YVNwYWNlID0ga0hlaWZEYXRhU3BhY2U7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmNvbnN1bWVyVXNhZ2UgPSB1c2VIZWljID8gR1JBTExPQ19VU0FHRV9IV19JTUFHRV9FTkNPREVSIDoKKyAgICAgICAgICAgIHVzZUdyaWQgPyBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gOiBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2RlcihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgYm9vbCogdXNlSGVpYywgYm9vbCogdXNlR3JpZCwgaW50NjRfdCogc3RhbGwpIHsKKyAgICBzdGF0aWMgSGVpY0VuY29kZXJJbmZvTWFuYWdlciYgaGVpY01hbmFnZXIgPSBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIHJldHVybiBoZWljTWFuYWdlci5pc1NpemVTdXBwb3J0ZWQod2lkdGgsIGhlaWdodCwgdXNlSGVpYywgdXNlR3JpZCwgc3RhbGwpOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OmlzSW5NZW1vcnlUZW1wRmlsZVN1cHBvcnRlZCgpIHsKKyAgICBpbnQgbWVtZmQgPSBzeXNjYWxsKF9fTlJfbWVtZmRfY3JlYXRlLCAiSEVJRi10cnktbWVtZmQiLCBNRkRfQ0xPRVhFQyk7CisgICAgaWYgKG1lbWZkID09IC0xKSB7CisgICAgICAgIGlmIChlcnJubyAhPSBFTk9TWVMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSB0bXBmcyBmaWxlLiBlcnJubyAlZCIsIF9fRlVOQ1RJT05fXywgZXJybm8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2xvc2UobWVtZmQpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uSGVpY091dHB1dEZyYW1lQXZhaWxhYmxlKAorICAgICAgICBjb25zdCBDb2RlY091dHB1dEJ1ZmZlckluZm8mIG91dHB1dEJ1ZmZlckluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgQUxPR1YoIiVzOiBpbmRleCAlZCwgb2Zmc2V0ICVkLCBzaXplICVkLCB0aW1lICUiIFBSSWQ2NCAiLCBmbGFncyAweCV4IiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb3V0cHV0QnVmZmVySW5mby5pbmRleCwgb3V0cHV0QnVmZmVySW5mby5vZmZzZXQsCisgICAgICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLnNpemUsIG91dHB1dEJ1ZmZlckluZm8udGltZVVzLCBvdXRwdXRCdWZmZXJJbmZvLmZsYWdzKTsKKworICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgaWYgKChvdXRwdXRCdWZmZXJJbmZvLnNpemUgPiAwKSAmJgorICAgICAgICAgICAgICAgICgob3V0cHV0QnVmZmVySW5mby5mbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSA9PSAwKSkgeworICAgICAgICAgICAgbUNvZGVjT3V0cHV0QnVmZmVycy5wdXNoX2JhY2sob3V0cHV0QnVmZmVySW5mbyk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihvdXRwdXRCdWZmZXJJbmZvLmluZGV4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihvdXRwdXRCdWZmZXJJbmZvLmluZGV4KTsKKyAgICB9Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25IZWljSW5wdXRGcmFtZUF2YWlsYWJsZShpbnQzMl90IGluZGV4KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIGlmICghbVVzZUdyaWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb2RlYyBZVVYgaW5wdXQgbW9kZSBtdXN0IG9ubHkgYmUgdXNlZCBmb3IgSGV2YyB0aWxpbmcgbW9kZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ29kZWNJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGluZGV4KTsKKyAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkhlaWNGb3JtYXRDaGFuZ2VkKHNwPEFNZXNzYWdlPiYgbmV3Rm9ybWF0KSB7CisgICAgaWYgKG5ld0Zvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogbmV3Rm9ybWF0IG11c3Qgbm90IGJlIG51bGwhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQVN0cmluZyBtaW1lSGVpYyhNSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworICAgIG5ld0Zvcm1hdC0+ZmluZFN0cmluZyhLRVlfTUlNRSwgJm1pbWUpOworICAgIGlmIChtaW1lICE9IG1pbWVIZWljKSB7CisgICAgICAgIC8vIEZvciBIRVZDIGNvZGVjLCBiZWxvdyBrZXlzIG5lZWQgdG8gYmUgZmlsbGVkIG91dCBvciBvdmVyd3JpdHRlbiBzbyB0aGF0IHRoZQorICAgICAgICAvLyBtdXhlciBjYW4gaGFuZGxlIHRoZW0gYXMgSEVJQyBvdXRwdXQgaW1hZ2UuCisgICAgICAgIG5ld0Zvcm1hdC0+c2V0U3RyaW5nKEtFWV9NSU1FLCBtaW1lSGVpYyk7CisgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1dJRFRILCBtT3V0cHV0V2lkdGgpOworICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsIG1PdXRwdXRIZWlnaHQpOworICAgICAgICBpZiAobVVzZUdyaWQpIHsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1RJTEVfV0lEVEgsIG1HcmlkV2lkdGgpOworICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfVElMRV9IRUlHSFQsIG1HcmlkSGVpZ2h0KTsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfUk9XUywgbUdyaWRSb3dzKTsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfQ09MVU1OUywgbUdyaWRDb2xzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9JU19ERUZBVUxULCAxIC8qaXNQcmltYXJ5Ki8pOworCisgICAgaW50MzJfdCBncmlkUm93cywgZ3JpZENvbHM7CisgICAgaWYgKG5ld0Zvcm1hdC0+ZmluZEludDMyKEtFWV9HUklEX1JPV1MsICZncmlkUm93cykgJiYKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+ZmluZEludDMyKEtFWV9HUklEX0NPTFVNTlMsICZncmlkQ29scykpIHsKKyAgICAgICAgbU51bU91dHB1dFRpbGVzID0gZ3JpZFJvd3MgKiBncmlkQ29sczsKKyAgICB9IGVsc2UgeworICAgICAgICBtTnVtT3V0cHV0VGlsZXMgPSAxOworICAgIH0KKworICAgIEFMT0dWKCIlczogbU51bU91dHB1dFRpbGVzIGlzICV6dSIsIF9fRlVOQ1RJT05fXywgbU51bU91dHB1dFRpbGVzKTsKKyAgICBtRm9ybWF0ID0gbmV3Rm9ybWF0OworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uSGVpY0NvZGVjRXJyb3IoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBtRXJyb3JTdGF0ZSA9IHRydWU7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmNvbmZpZ3VyZVN0cmVhbSgpIHsKKyAgICBpZiAoaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgLy8gUHJvY2Vzc2luZyB0aHJlYWQgaXMgYWxyZWFkeSBydW5uaW5nLCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IE5vIHZhbGlkIG91dHB1dCBzdXJmYWNlIHNldCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IG1PdXRwdXRTdXJmYWNlLT5jb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSwgbVByb2R1Y2VyTGlzdGVuZXIpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93IGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbU1haW5JbWFnZVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KG1PdXRwdXRTdXJmYWNlLmdldCgpLCBIQUxfUElYRUxfRk9STUFUX0JMT0IpKQorICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZm9ybWF0IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbU1haW5JbWFnZVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBBTmF0aXZlV2luZG93ICphbndDb25zdW1lciA9IG1PdXRwdXRTdXJmYWNlLmdldCgpOworICAgIGludCBtYXhDb25zdW1lckJ1ZmZlcnM7CisgICAgaWYgKChyZXMgPSBhbndDb25zdW1lci0+cXVlcnkoYW53Q29uc3VtZXIsIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywKKyAgICAgICAgICAgICAgICAgICAgJm1heENvbnN1bWVyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGNvbnN1bWVyIHVuZGVxdWV1ZWQiCisgICAgICAgICAgICAgICAgIiBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbU1haW5JbWFnZVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBDYW5ub3QgdXNlIFNvdXJjZVN1cmZhY2UgYnVmZmVyIGNvdW50IHNpbmNlIGl0IGNvdWxkIGJlIGNvZGVjJ3MgNTEyKjUxMiB0aWxlCisgICAgLy8gYnVmZmVyIGNvdW50LgorICAgIGludCBtYXhQcm9kdWNlckJ1ZmZlcnMgPSAxOworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KAorICAgICAgICAgICAgICAgICAgICBhbndDb25zdW1lciwgbWF4UHJvZHVjZXJCdWZmZXJzICsgbWF4Q29uc3VtZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtTWFpbkltYWdlU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKGFud0NvbnN1bWVyLCBtTWF4SGVpY0J1ZmZlclNpemUsIDEpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgYnVmZmVyIGRpbWVuc2lvbiAlenUgeCAxIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbU1heEhlaWNCdWZmZXJTaXplLCBtTWFpbkltYWdlU3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJ1bigiSGVpY0NvbXBvc2l0ZVN0cmVhbVByb2MiKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLAorICAgICAgICBWZWN0b3I8aW50MzJfdD4qIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpIHsKKyAgICBpZiAob3V0U3VyZmFjZU1hcC0+ZmluZChtQXBwU2VnbWVudFN0cmVhbUlkKSA9PSBvdXRTdXJmYWNlTWFwLT5lbmQoKSkgeworICAgICAgICAoKm91dFN1cmZhY2VNYXApW21BcHBTZWdtZW50U3RyZWFtSWRdID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMtPnB1c2hfYmFjayhtQXBwU2VnbWVudFN0cmVhbUlkKTsKKyAgICB9CisgICAgKCpvdXRTdXJmYWNlTWFwKVttQXBwU2VnbWVudFN0cmVhbUlkXS5wdXNoX2JhY2sobUFwcFNlZ21lbnRTdXJmYWNlSWQpOworCisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobU1haW5JbWFnZVN0cmVhbUlkKSA9PSBvdXRTdXJmYWNlTWFwLT5lbmQoKSkgeworICAgICAgICAoKm91dFN1cmZhY2VNYXApW21NYWluSW1hZ2VTdHJlYW1JZF0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy0+cHVzaF9iYWNrKG1NYWluSW1hZ2VTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbU1haW5JbWFnZVN0cmVhbUlkXS5wdXNoX2JhY2sobU1haW5JbWFnZVN1cmZhY2VJZCk7CisKKyAgICBpZiAoY3VycmVudFN0cmVhbUlkICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmN1cnJlbnRTdHJlYW1JZCA9IG1NYWluSW1hZ2VTdHJlYW1JZDsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25TaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmIChtRXJyb3JTdGF0ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1TZXR0aW5nc0J5RnJhbWVOdW1iZXIuZmluZChyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpICE9IG1TZXR0aW5nc0J5RnJhbWVOdW1iZXIuZW5kKCkpIHsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmVtcGxhY2UocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLCB0aW1lc3RhbXApOworICAgICAgICBtU2V0dGluZ3NCeVRpbWVzdGFtcFt0aW1lc3RhbXBdID0gbVNldHRpbmdzQnlGcmFtZU51bWJlcltyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXJdOworICAgICAgICBtU2V0dGluZ3NCeUZyYW1lTnVtYmVyLmVyYXNlKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCkgeworICAgIHdoaWxlICghbVNldHRpbmdzQnlUaW1lc3RhbXAuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbVNldHRpbmdzQnlUaW1lc3RhbXAuYmVnaW4oKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLm9yaWVudGF0aW9uID0gaXQtPnNlY29uZC5maXJzdDsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLnF1YWxpdHkgPSBpdC0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgbVNldHRpbmdzQnlUaW1lc3RhbXAuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuZW1wdHkoKSAmJiAhbUFwcFNlZ21lbnRCdWZmZXJBY3F1aXJlZCkgeworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGF1dG8gcmVzID0gbUFwcFNlZ21lbnRDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcik7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAvLyBDYW5vdCBub3QgbG9jayBhbnkgbW9yZSBidWZmZXJzLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoKHJlcyAhPSBPSykgfHwgKCppdCAhPSBpbWdCdWZmZXIudGltZXN0YW1wKSkgeworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgbG9ja2luZyBKUEVHX0FQUF9TRUdNRU5UUyBpbWFnZSBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBFeHBlY3RpbmcgSlBFR19BUFBfU0VHTUVOVFMgYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiIHJlY2VpdmVkIGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgKml0LCBpbWdCdWZmZXIudGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbKml0XS5lcnJvciA9IHRydWU7CisgICAgICAgICAgICBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVBlbmRpbmdJbnB1dEZyYW1lcy5maW5kKGltZ0J1ZmZlci50aW1lc3RhbXApICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uZXJyb3IpKSB7CisgICAgICAgICAgICBtQXBwU2VnbWVudENvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW1nQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uYXBwU2VnbWVudEJ1ZmZlciA9IGltZ0J1ZmZlcjsKKyAgICAgICAgICAgIG1BcHBTZWdtZW50QnVmZmVyQWNxdWlyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1JbnB1dFl1dkJ1ZmZlcnMuZW1wdHkoKSAmJiAhbVl1dkJ1ZmZlckFjcXVpcmVkKSB7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgaW1nQnVmZmVyOworICAgICAgICBhdXRvIGl0ID0gbUlucHV0WXV2QnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1NYWluSW1hZ2VDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcik7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAvLyBDYW5vdCBub3QgbG9jayBhbnkgbW9yZSBidWZmZXJzLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGxvY2tpbmcgWVVWXzg4OCBpbWFnZSBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dFl1dkJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoKml0ICE9IGltZ0J1ZmZlci50aW1lc3RhbXApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogRXhwZWN0aW5nIFlVVl84ODggYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgcmVjZWl2ZWQgYnVmZmVyIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAidGltZSBzdGFtcDogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0WXV2QnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVBlbmRpbmdJbnB1dEZyYW1lcy5maW5kKGltZ0J1ZmZlci50aW1lc3RhbXApICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uZXJyb3IpKSB7CisgICAgICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS55dXZCdWZmZXIgPSBpbWdCdWZmZXI7CisgICAgICAgICAgICBtWXV2QnVmZmVyQWNxdWlyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1JbnB1dFl1dkJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUNvZGVjT3V0cHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ29kZWNPdXRwdXRCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIC8vIEJpdHN0cmVhbSBidWZmZXIgdGltZXN0YW1wIGRvZXNuJ3QgbmVjZXNzYXJpbHkgZGlyZWN0bHkgY29ycmVsYXRlIHdpdGggaW5wdXQKKyAgICAgICAgLy8gYnVmZmVyIHRpbWVzdGFtcC4gQXNzdW1lIGVuY29kZXIgaW5wdXQgdG8gb3V0cHV0IGlzIEZJRk8sIHVzZSBhIHF1ZXVlCisgICAgICAgIC8vIHRvIGxvb2sgdXAgdGltZXN0YW1wLgorICAgICAgICBpbnQ2NF90IGJ1ZmZlclRpbWUgPSAtMTsKKyAgICAgICAgaWYgKG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBidWZmZXIgdGltZXN0YW1wIGZvciBjb2RlYyBvdXRwdXQgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEaXJlY3QgbWFwcGluZyBiZXR3ZWVuIGNhbWVyYSB0aW1lc3RhbXAgKGluIG5zKSBhbmQgY29kZWMgdGltZXN0YW1wIChpbiB1cykuCisgICAgICAgICAgICBidWZmZXJUaW1lID0gbUNvZGVjT3V0cHV0QnVmZmVyVGltZXN0YW1wcy5mcm9udCgpOworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50ZXIrKzsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyQ291bnRlciA9PSBtTnVtT3V0cHV0VGlsZXMpIHsKKyAgICAgICAgICAgICAgICBtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzLnBvcCgpOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudGVyID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tidWZmZXJUaW1lXS5jb2RlY091dHB1dEJ1ZmZlcnMucHVzaF9iYWNrKCppdCk7CisgICAgICAgIH0KKyAgICAgICAgbUNvZGVjT3V0cHV0QnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtRnJhbWVOdW1iZXJNYXAuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUZyYW1lTnVtYmVyTWFwLmJlZ2luKCk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPnNlY29uZF0uZnJhbWVOdW1iZXIgPSBpdC0+Zmlyc3Q7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtQ2FwdHVyZVJlc3VsdHMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUNhcHR1cmVSZXN1bHRzLmJlZ2luKCk7CisgICAgICAgIC8vIE5lZ2F0aXZlIHRpbWVzdGFtcCBpbmRpY2F0ZXMgdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIGNhcHR1cmUgcmVzdWx0CisgICAgICAgIC8vIGNvbGxlY3Rpb24gcHJvY2Vzcy4KKyAgICAgICAgaWYgKGl0LT5maXJzdCA+PSAwKSB7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLmZyYW1lTnVtYmVyID09IHN0ZDo6Z2V0PDA+KGl0LT5zZWNvbmQpKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLnJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENhbWVyYU1ldGFkYXRhPihzdGQ6OmdldDwxPihpdC0+c2Vjb25kKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FwdHVyZSByZXN1bHQgZnJhbWVOdW1iZXIvdGltZXN0YW1wIG1hcHBpbmcgY2hhbmdlZCBiZXR3ZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaHV0dGVyIGFuZCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5lcmFzZShpdCk7CisgICAgfQorCisgICAgLy8gbUVycm9yRnJhbWVOdW1iZXJzIHN0b3JlcyBmcmFtZSBudW1iZXIgb2YgZHJvcHBlZCBidWZmZXJzLgorICAgIGF1dG8gaXQgPSBtRXJyb3JGcmFtZU51bWJlcnMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbUVycm9yRnJhbWVOdW1iZXJzLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZnJhbWVGb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGF1dG8gJmlucHV0RnJhbWUgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRGcmFtZS5zZWNvbmQuZnJhbWVOdW1iZXIgPT0gKml0KSB7CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5zZWNvbmQuZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGZyYW1lRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lRm91bmQpIHsKKyAgICAgICAgICAgIGl0ID0gbUVycm9yRnJhbWVOdW1iZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm90IGFibGUgdG8gZmluZCBmYWlsaW5nIGlucHV0IHdpdGggZnJhbWUgbnVtYmVyOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgKml0KTsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEaXN0cmlidXRlIGNvZGVjIGlucHV0IGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIG91dCBmcm9tIFlVViBvdXRwdXQKKyAgICBmb3IgKGF1dG8gaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpICYmIG1Db2RlY0lucHV0QnVmZmVycy5zaXplKCkgPiAwOyBpdCsrKSB7CisgICAgICAgIElucHV0RnJhbWUmIGlucHV0RnJhbWUoaXQtPnNlY29uZCk7CisgICAgICAgIGlmIChpbnB1dEZyYW1lLmNvZGVjSW5wdXRDb3VudGVyIDwgbUdyaWRSb3dzICogbUdyaWRDb2xzKSB7CisgICAgICAgICAgICAvLyBBdmFpbGFibGUgaW5wdXQgdGlsZXMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIHRoZSBjdXJyZW50IGlucHV0CisgICAgICAgICAgICAvLyBpbWFnZS4KKyAgICAgICAgICAgIHNpemVfdCBuZXdJbnB1dFRpbGVzID0gc3RkOjptaW4obUNvZGVjSW5wdXRCdWZmZXJzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgbUdyaWRSb3dzICogbUdyaWRDb2xzIC0gaW5wdXRGcmFtZS5jb2RlY0lucHV0Q291bnRlcik7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld0lucHV0VGlsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIENvZGVjSW5wdXRCdWZmZXJJbmZvIGlucHV0SW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICB7IG1Db2RlY0lucHV0QnVmZmVyc1swXSwgbUdyaWRUaW1lc3RhbXBVcysrLCBpbnB1dEZyYW1lLmNvZGVjSW5wdXRDb3VudGVyIH07CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5jb2RlY0lucHV0QnVmZmVycy5wdXNoX2JhY2soaW5wdXRJbmZvKTsKKworICAgICAgICAgICAgICAgIG1Db2RlY0lucHV0QnVmZmVycy5lcmFzZShtQ29kZWNJbnB1dEJ1ZmZlcnMuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5jb2RlY0lucHV0Q291bnRlcisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qb3V0Ki8pIHsKKyAgICBpZiAoY3VycmVudFRzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgbmV3SW5wdXRBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICBib29sIGFwcFNlZ21lbnRSZWFkeSA9IChpdC5zZWNvbmQuYXBwU2VnbWVudEJ1ZmZlci5kYXRhICE9IG51bGxwdHIpICYmCisgICAgICAgICAgICAgICAgIWl0LnNlY29uZC5hcHBTZWdtZW50V3JpdHRlbiAmJiBpdC5zZWNvbmQucmVzdWx0ICE9IG51bGxwdHI7CisgICAgICAgIGJvb2wgY29kZWNPdXRwdXRSZWFkeSA9ICFpdC5zZWNvbmQuY29kZWNPdXRwdXRCdWZmZXJzLmVtcHR5KCk7CisgICAgICAgIGJvb2wgY29kZWNJbnB1dFJlYWR5ID0gKGl0LnNlY29uZC55dXZCdWZmZXIuZGF0YSAhPSBudWxscHRyKSAmJgorICAgICAgICAgICAgICAgICghaXQuc2Vjb25kLmNvZGVjSW5wdXRCdWZmZXJzLmVtcHR5KCkpOworICAgICAgICBpZiAoKCFpdC5zZWNvbmQuZXJyb3IpICYmCisgICAgICAgICAgICAgICAgKGl0LmZpcnN0IDwgKmN1cnJlbnRUcykgJiYKKyAgICAgICAgICAgICAgICAoYXBwU2VnbWVudFJlYWR5IHx8IGNvZGVjT3V0cHV0UmVhZHkgfHwgY29kZWNJbnB1dFJlYWR5KSkgeworICAgICAgICAgICAgKmN1cnJlbnRUcyA9IGl0LmZpcnN0OworICAgICAgICAgICAgbmV3SW5wdXRBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3SW5wdXRBdmFpbGFibGU7Cit9CisKK2ludDY0X3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLypvdXQqLykgeworICAgIGludDY0X3QgcmVzID0gLTE7CisgICAgaWYgKGN1cnJlbnRUcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgaWYgKGl0LnNlY29uZC5lcnJvciAmJiAhaXQuc2Vjb25kLmVycm9yTm90aWZpZWQgJiYgKGl0LmZpcnN0IDwgKmN1cnJlbnRUcykpIHsKKyAgICAgICAgICAgICpjdXJyZW50VHMgPSBpdC5maXJzdDsKKyAgICAgICAgICAgIHJlcyA9IGl0LnNlY29uZC5mcmFtZU51bWJlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0lucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgYm9vbCBhcHBTZWdtZW50UmVhZHkgPSBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSAhPSBudWxscHRyICYmCisgICAgICAgICAgICAhaW5wdXRGcmFtZS5hcHBTZWdtZW50V3JpdHRlbiAmJiBpbnB1dEZyYW1lLnJlc3VsdCAhPSBudWxscHRyOworICAgIGJvb2wgY29kZWNPdXRwdXRSZWFkeSA9IGlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLnNpemUoKSA+IDA7CisgICAgYm9vbCBjb2RlY0lucHV0UmVhZHkgPSBpbnB1dEZyYW1lLnl1dkJ1ZmZlci5kYXRhICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIWlucHV0RnJhbWUuY29kZWNJbnB1dEJ1ZmZlcnMuZW1wdHkoKTsKKworICAgIGlmICghYXBwU2VnbWVudFJlYWR5ICYmICFjb2RlY091dHB1dFJlYWR5ICYmICFjb2RlY0lucHV0UmVhZHkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBObyB2YWxpZCBhcHBTZWdtZW50QnVmZmVyL2NvZGVjIGlucHV0L291dHB1dEJ1ZmZlciBhdmFpbGFibGUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIEhhbmRsZSBpbnB1dHMgZm9yIEhldmMgdGlsaW5nCisgICAgaWYgKGNvZGVjSW5wdXRSZWFkeSkgeworICAgICAgICByZXMgPSBwcm9jZXNzQ29kZWNJbnB1dEZyYW1lKGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwcm9jZXNzIGNvZGVjIGlucHV0IGZyYW1lOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGFuZCBzdGFydCBtdXhlciBpZiBub3QgeWV0IGRvbmUgc28KKyAgICBpZiAoaW5wdXRGcmFtZS5tdXhlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJlcyA9IHN0YXJ0TXV4ZXJGb3JJbnB1dEZyYW1lKHRpbWVzdGFtcCwgaW5wdXRGcmFtZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBhbmQgc3RhcnQgbXV4ZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdyaXRlIEpQRUcgQVBQIHNlZ21lbnRzIGRhdGEgdG8gdGhlIG11eGVyLgorICAgIGlmIChhcHBTZWdtZW50UmVhZHkgJiYgaW5wdXRGcmFtZS5tdXhlciAhPSBudWxscHRyKSB7CisgICAgICAgIHJlcyA9IHByb2Nlc3NBcHBTZWdtZW50KHRpbWVzdGFtcCwgaW5wdXRGcmFtZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHByb2Nlc3MgSlBFRyBBUFAgc2VnbWVudHM6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdyaXRlIG1lZGlhIGNvZGVjIGJpdHN0cmVhbSBidWZmZXJzIHRvIG11eGVyLgorICAgIHdoaWxlICghaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByZXMgPSBwcm9jZXNzT25lQ29kZWNPdXRwdXRGcmFtZSh0aW1lc3RhbXAsIGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwcm9jZXNzIGNvZGVjIG91dHB1dCBmcmFtZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUuYXBwU2VnbWVudFdyaXR0ZW4gJiYgaW5wdXRGcmFtZS5wZW5kaW5nT3V0cHV0VGlsZXMgPT0gMCkgeworICAgICAgICByZXMgPSBwcm9jZXNzQ29tcGxldGVkSW5wdXRGcmFtZSh0aW1lc3RhbXAsIGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwcm9jZXNzIGNvbXBsZXRlZCBpbnB1dCBmcmFtZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6c3RhcnRNdXhlckZvcklucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICBpZiAoaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gTm8gc2luZ2xlIGNvZGVjIG91dHB1dCBidWZmZXIgaGFzIGJlZW4gZ2VuZXJhdGVkLiBDb250aW51ZSB0bworICAgICAgICAvLyB3YWl0LgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgYXV0byByZXMgPSBvdXRwdXRBTlctPmRlcXVldWVCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksICZpbnB1dEZyYW1lLmFuYiwgJmlucHV0RnJhbWUuZmVuY2VGZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHJldHJpZXZpbmcgb3V0cHV0IGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksCisgICAgICAgICAgICAgICAgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBDb21iaW5lIGN1cnJlbnQgdGhyZWFkIGlkLCBzdHJlYW0gaWQgYW5kIHRpbWVzdGFtcCB0byB1bmlxdWVseSBpZGVudGlmeSBpbWFnZS4KKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdGVtcE91dHB1dEZpbGU7CisgICAgdGVtcE91dHB1dEZpbGUgPDwgIkhFSUYtIiA8PCBwdGhyZWFkX3NlbGYoKSA8PCAiLSIKKyAgICAgICAgICAgIDw8IGdldFN0cmVhbUlkKCkgPDwgIi0iIDw8IHRpbWVzdGFtcDsKKyAgICBpbnB1dEZyYW1lLmZpbGVGZCA9IHN5c2NhbGwoX19OUl9tZW1mZF9jcmVhdGUsIHRlbXBPdXRwdXRGaWxlLnN0cigpLmNfc3RyKCksIE1GRF9DTE9FWEVDKTsKKyAgICBpZiAoaW5wdXRGcmFtZS5maWxlRmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBmaWxlICVzLiBFcnJvciBubyBpcyAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0RmlsZS5zdHIoKS5jX3N0cigpLCBlcnJubyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpbnB1dEZyYW1lLm11eGVyID0gbmV3IE1lZGlhTXV4ZXIoaW5wdXRGcmFtZS5maWxlRmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfSEVJRik7CisgICAgaWYgKGlucHV0RnJhbWUubXV4ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgTWVkaWFNdXhlciBmb3IgZmlsZSBmZCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbnB1dEZyYW1lLmZpbGVGZCk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJlcyA9IGlucHV0RnJhbWUubXV4ZXItPnNldE9yaWVudGF0aW9uSGludChpbnB1dEZyYW1lLm9yaWVudGF0aW9uKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHNldE9yaWVudGF0aW9uSGludDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgLy8gU2V0IGVuY29kZXIgcXVhbGl0eQorICAgIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHF1YWxpdHlQYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIHF1YWxpdHlQYXJhbXMtPnNldEludDMyKFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSwgaW5wdXRGcmFtZS5xdWFsaXR5KTsKKyAgICAgICAgcmVzID0gbUNvZGVjLT5zZXRQYXJhbWV0ZXJzKHF1YWxpdHlQYXJhbXMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgY29kZWMgcXVhbGl0eTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3NpemVfdCB0cmFja0lkID0gaW5wdXRGcmFtZS5tdXhlci0+YWRkVHJhY2sobUZvcm1hdCk7CisgICAgaWYgKHRyYWNrSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGFkZFRyYWNrIHRvIHRoZSBtdXhlcjogJXpkIiwgX19GVU5DVElPTl9fLCB0cmFja0lkKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaW5wdXRGcmFtZS50cmFja0luZGV4ID0gdHJhY2tJZDsKKyAgICBpbnB1dEZyYW1lLnBlbmRpbmdPdXRwdXRUaWxlcyA9IG1OdW1PdXRwdXRUaWxlczsKKworICAgIHJlcyA9IGlucHV0RnJhbWUubXV4ZXItPnN0YXJ0KCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzdGFydCBNZWRpYU11eGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0FwcFNlZ21lbnQobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBzaXplX3QgYXBwMVNpemUgPSAwOworICAgIGF1dG8gYXBwU2VnbWVudFNpemUgPSBmaW5kQXBwU2VnbWVudHNTaXplKGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5kYXRhLAorICAgICAgICAgICAgaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLndpZHRoICogaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmhlaWdodCwKKyAgICAgICAgICAgICZhcHAxU2l6ZSk7CisgICAgQUxPR1YoIiVzOiBhcHBTZWdtZW50U2l6ZSBpcyAlenUsIHdpZHRoICVkLCBoZWlnaHQgJWQsIGFwcDFTaXplICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICBhcHBTZWdtZW50U2l6ZSwgaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLndpZHRoLAorICAgICAgICAgIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5oZWlnaHQsIGFwcDFTaXplKTsKKyAgICBpZiAoYXBwU2VnbWVudFNpemUgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIEpQRUcgQVBQIHNlZ21lbnQgc2l6ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmVXRpbHM+IGV4aWZVdGlscyhFeGlmVXRpbHM6OmNyZWF0ZSgpKTsKKyAgICBhdXRvIGV4aWZSZXMgPSBleGlmVXRpbHMtPmluaXRpYWxpemUoaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmRhdGEsIGFwcDFTaXplKTsKKyAgICBpZiAoIWV4aWZSZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBFeGlmVXRpbHMgb2JqZWN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGV4aWZSZXMgPSBleGlmVXRpbHMtPnNldEZyb21NZXRhZGF0YSgqaW5wdXRGcmFtZS5yZXN1bHQsIG1TdGF0aWNJbmZvLAorICAgICAgICAgICAgbU91dHB1dFdpZHRoLCBtT3V0cHV0SGVpZ2h0KTsKKyAgICBpZiAoIWV4aWZSZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc2V0IEV4aWYgdGFncyB1c2luZyBtZXRhZGF0YSBhbmQgbWFpbiBpbWFnZSBzaXplcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGV4aWZSZXMgPSBleGlmVXRpbHMtPnNldE9yaWVudGF0aW9uKGlucHV0RnJhbWUub3JpZW50YXRpb24pOworICAgIGlmICghZXhpZlJlcykgeworICAgICAgICBBTE9HRSgiJXM6IEV4aWZVdGlscyBmYWlsZWQgdG8gc2V0IG9yaWVudGF0aW9uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZXhpZlJlcyA9IGV4aWZVdGlscy0+Z2VuZXJhdGVBcHAxKCk7CisgICAgaWYgKCFleGlmUmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogRXhpZlV0aWxzIGZhaWxlZCB0byBnZW5lcmF0ZSBBUFAxIHNlZ21lbnQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBuZXdBcHAxTGVuZ3RoID0gZXhpZlV0aWxzLT5nZXRBcHAxTGVuZ3RoKCk7CisgICAgY29uc3QgdWludDhfdCAqbmV3QXBwMVNlZ21lbnQgPSBleGlmVXRpbHMtPmdldEFwcDFCdWZmZXIoKTsKKworICAgIC8vQXNzZW1ibGUgdGhlIEFQUDEgbWFya2VyIGJ1ZmZlciByZXF1aXJlZCBieSBNZWRpYUNvZGVjCisgICAgdWludDhfdCBrRXhpZkFwcDFNYXJrZXJbXSA9IHsnRScsICd4JywgJ2knLCAnZicsIDB4RkYsIDB4RTEsIDB4MDAsIDB4MDB9OworICAgIGtFeGlmQXBwMU1hcmtlcls2XSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG5ld0FwcDFMZW5ndGggPj4gOCk7CisgICAga0V4aWZBcHAxTWFya2VyWzddID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obmV3QXBwMUxlbmd0aCAmIDB4RkYpOworICAgIHNpemVfdCBhcHBTZWdtZW50QnVmZmVyU2l6ZSA9IHNpemVvZihrRXhpZkFwcDFNYXJrZXIpICsKKyAgICAgICAgICAgIGFwcFNlZ21lbnRTaXplIC0gYXBwMVNpemUgKyBuZXdBcHAxTGVuZ3RoOworICAgIHVpbnQ4X3QqIGFwcFNlZ21lbnRCdWZmZXIgPSBuZXcgdWludDhfdFthcHBTZWdtZW50QnVmZmVyU2l6ZV07CisgICAgbWVtY3B5KGFwcFNlZ21lbnRCdWZmZXIsIGtFeGlmQXBwMU1hcmtlciwgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikpOworICAgIG1lbWNweShhcHBTZWdtZW50QnVmZmVyICsgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlciksIG5ld0FwcDFTZWdtZW50LCBuZXdBcHAxTGVuZ3RoKTsKKyAgICBpZiAoYXBwU2VnbWVudFNpemUgLSBhcHAxU2l6ZSA+IDApIHsKKyAgICAgICAgbWVtY3B5KGFwcFNlZ21lbnRCdWZmZXIgKyBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSArIG5ld0FwcDFMZW5ndGgsCisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmRhdGEgKyBhcHAxU2l6ZSwgYXBwU2VnbWVudFNpemUgLSBhcHAxU2l6ZSk7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlciA9IG5ldyBBQnVmZmVyKGFwcFNlZ21lbnRCdWZmZXIsIGFwcFNlZ21lbnRCdWZmZXJTaXplKTsKKyAgICBhdXRvIHJlcyA9IGlucHV0RnJhbWUubXV4ZXItPndyaXRlU2FtcGxlRGF0YShhQnVmZmVyLCBpbnB1dEZyYW1lLnRyYWNrSW5kZXgsCisgICAgICAgICAgICB0aW1lc3RhbXAsIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX01VWEVSX0RBVEEpOworICAgIGRlbGV0ZVtdIGFwcFNlZ21lbnRCdWZmZXI7CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIEpQRUcgQVBQIHNlZ21lbnRzIHRvIG11eGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpbnB1dEZyYW1lLmFwcFNlZ21lbnRXcml0dGVuID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0NvZGVjSW5wdXRGcmFtZShJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgZm9yIChhdXRvJiBpbnB1dEJ1ZmZlciA6IGlucHV0RnJhbWUuY29kZWNJbnB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOworICAgICAgICBhdXRvIHJlcyA9IG1Db2RlYy0+Z2V0SW5wdXRCdWZmZXIoaW5wdXRCdWZmZXIuaW5kZXgsICZidWZmZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGdldHRpbmcgY29kZWMgaW5wdXQgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IG9uZSB0aWxlIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLgorICAgICAgICBzaXplX3QgdGlsZVggPSBpbnB1dEJ1ZmZlci50aWxlSW5kZXggJSBtR3JpZENvbHM7CisgICAgICAgIHNpemVfdCB0aWxlWSA9IGlucHV0QnVmZmVyLnRpbGVJbmRleCAvIG1HcmlkQ29sczsKKyAgICAgICAgc2l6ZV90IHRvcCA9IG1HcmlkSGVpZ2h0ICogdGlsZVk7CisgICAgICAgIHNpemVfdCBsZWZ0ID0gbUdyaWRXaWR0aCAqIHRpbGVYOworICAgICAgICBzaXplX3Qgd2lkdGggPSAodGlsZVggPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtR3JpZENvbHMpIC0gMSkgPworICAgICAgICAgICAgICAgIG1PdXRwdXRXaWR0aCAtIHRpbGVYICogbUdyaWRXaWR0aCA6IG1HcmlkV2lkdGg7CisgICAgICAgIHNpemVfdCBoZWlnaHQgPSAodGlsZVkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtR3JpZFJvd3MpIC0gMSkgPworICAgICAgICAgICAgICAgIG1PdXRwdXRIZWlnaHQgLSB0aWxlWSAqIG1HcmlkSGVpZ2h0IDogbUdyaWRIZWlnaHQ7CisgICAgICAgIEFMT0dWKCIlczogaW5wdXRCdWZmZXIgdGlsZUluZGV4IFslenUsICV6dV0sIHRvcCAlenUsIGxlZnQgJXp1LCB3aWR0aCAlenUsIGhlaWdodCAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdGlsZVgsIHRpbGVZLCB0b3AsIGxlZnQsIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgIHJlcyA9IGNvcHlPbmVZdXZUaWxlKGJ1ZmZlciwgaW5wdXRGcmFtZS55dXZCdWZmZXIsIHRvcCwgbGVmdCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNvcHkgWVVWIHRpbGUgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gbUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGlucHV0QnVmZmVyLmluZGV4LCAwLCBidWZmZXItPmNhcGFjaXR5KCksCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIudGltZVVzLCAwLCBudWxscHRyIC8qZXJyb3JEZXRhaWxNc2cqLyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHF1ZXVlSW5wdXRCdWZmZXIgdG8gQ29kZWM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlucHV0RnJhbWUuY29kZWNJbnB1dEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NPbmVDb2RlY091dHB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgYXV0byBpdCA9IGlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLmJlZ2luKCk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGl0LT5pbmRleCwgJmJ1ZmZlcik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGdldHRpbmcgSGVpYyBjb2RlYyBvdXRwdXQgYnVmZmVyIGF0IGluZGV4ICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGl0LT5pbmRleCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgSGVpYyBjb2RlYyBvdXRwdXQgYnVmZmVyIGF0IGluZGV4ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGl0LT5pbmRleCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlciA9IG5ldyBBQnVmZmVyKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgcmVzID0gaW5wdXRGcmFtZS5tdXhlci0+d3JpdGVTYW1wbGVEYXRhKAorICAgICAgICAgICAgYUJ1ZmZlciwgaW5wdXRGcmFtZS50cmFja0luZGV4LCB0aW1lc3RhbXAsIDAgLypmbGFncyovKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIGJ1ZmZlciBpbmRleCAlZCB0byBtdXhlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpdC0+aW5kZXgsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpdC0+aW5kZXgpOworICAgIGlmIChpbnB1dEZyYW1lLnBlbmRpbmdPdXRwdXRUaWxlcyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogQ29kZWMgZ2VuZXJhdGVkIG1vcmUgdGlsZXMgdGhhbiBleHBlY3RlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgIH0gZWxzZSB7CisgICAgICAgIGlucHV0RnJhbWUucGVuZGluZ091dHB1dFRpbGVzLS07CisgICAgfQorCisgICAgaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuZXJhc2UoaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuYmVnaW4oKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzQ29tcGxldGVkSW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIHNwPEFOYXRpdmVXaW5kb3c+IG91dHB1dEFOVyA9IG1PdXRwdXRTdXJmYWNlOworICAgIGlucHV0RnJhbWUubXV4ZXItPnN0b3AoKTsKKworICAgIC8vIENvcHkgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gbWVtb3J5LgorICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdiID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbShpbnB1dEZyYW1lLmFuYik7CisgICAgdm9pZCogZHN0QnVmZmVyOworICAgIGF1dG8gcmVzID0gZ2ItPmxvY2tBc3luYyhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAmZHN0QnVmZmVyLCBpbnB1dEZyYW1lLmZlbmNlRmQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gbG9jayBvdXRwdXQgYnVmZmVyIGZlbmNlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG9mZl90IGZTaXplID0gbHNlZWsoaW5wdXRGcmFtZS5maWxlRmQsIDAsIFNFRUtfRU5EKTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihmU2l6ZSkgPiBtTWF4SGVpY0J1ZmZlclNpemUgLSBzaXplb2YoQ2FtZXJhQmxvYikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogTWVkaWFNdXhlciBvdXRwdXQgc2l6ZSAlbGQgaXMgbGFyZ2VyIHRoYW4gYnVmZmVyIHNpemVyICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmU2l6ZSwgbU1heEhlaWNCdWZmZXJTaXplIC0gc2l6ZW9mKENhbWVyYUJsb2IpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBsc2VlayhpbnB1dEZyYW1lLmZpbGVGZCwgMCwgU0VFS19TRVQpOworICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gcmVhZChpbnB1dEZyYW1lLmZpbGVGZCwgZHN0QnVmZmVyLCBmU2l6ZSk7CisgICAgaWYgKGJ5dGVzUmVhZCA8IGZTaXplKSB7CisgICAgICAgIEFMT0dFKCIlczogT25seSAlemQgb2YgJWxkIGJ5dGVzIHJlYWQiLCBfX0ZVTkNUSU9OX18sIGJ5dGVzUmVhZCwgZlNpemUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNsb3NlKGlucHV0RnJhbWUuZmlsZUZkKTsKKyAgICBpbnB1dEZyYW1lLmZpbGVGZCA9IC0xOworCisgICAgLy8gRmlsbCBpbiBIRUlDIGhlYWRlcgorICAgIHVpbnQ4X3QgKmhlYWRlciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihkc3RCdWZmZXIpICsgbU1heEhlaWNCdWZmZXJTaXplIC0gc2l6ZW9mKENhbWVyYUJsb2IpOworICAgIHN0cnVjdCBDYW1lcmFCbG9iICpibG9iSGVhZGVyID0gKHN0cnVjdCBDYW1lcmFCbG9iICopaGVhZGVyOworICAgIC8vIE11c3QgYmUgaW4gc3luYyB3aXRoIENBTUVSQTNfSEVJQ19CTE9CX0lEIGluIGFuZHJvaWRfbWVkaWFfVXRpbHMuY3BwCisgICAgYmxvYkhlYWRlci0+YmxvYklkID0gc3RhdGljX2Nhc3Q8Q2FtZXJhQmxvYklkPigweDAwRkUpOworICAgIGJsb2JIZWFkZXItPmJsb2JTaXplID0gZlNpemU7CisKKyAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtT3V0cHV0U3VyZmFjZS5nZXQoKSwgdGltZXN0YW1wKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBzZXR0aW5nIHRpbWVzdGFtcDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdldFN0cmVhbUlkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJlcyA9IG91dHB1dEFOVy0+cXVldWVCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGlucHV0RnJhbWUuYW5iLCAvKmZlbmNlKi8gLTEpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcXVldWVCdWZmZXIgdG8gSGVpYyBzdHJlYW06ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlucHV0RnJhbWUuYW5iID0gbnVsbHB0cjsKKworICAgIEFUUkFDRV9BU1lOQ19FTkQoIkhFSUMgY2FwdHVyZSIsIGlucHV0RnJhbWUuZnJhbWVOdW1iZXIpOworICAgIHJldHVybiBPSzsKK30KKworCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OnJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKElucHV0RnJhbWUgKmlucHV0RnJhbWUgLypvdXQqLykgeworICAgIGlmIChpbnB1dEZyYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLT5hcHBTZWdtZW50QnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBtQXBwU2VnbWVudENvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW5wdXRGcmFtZS0+YXBwU2VnbWVudEJ1ZmZlcik7CisgICAgICAgIGlucHV0RnJhbWUtPmFwcFNlZ21lbnRCdWZmZXIuZGF0YSA9IG51bGxwdHI7CisgICAgICAgIG1BcHBTZWdtZW50QnVmZmVyQWNxdWlyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAoIWlucHV0RnJhbWUtPmNvZGVjT3V0cHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBpbnB1dEZyYW1lLT5jb2RlY091dHB1dEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgQUxPR1YoIiVzOiByZWxlYXNlT3V0cHV0QnVmZmVyIGluZGV4ICVkIiwgX19GVU5DVElPTl9fLCBpdC0+aW5kZXgpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoaXQtPmluZGV4KTsKKyAgICAgICAgaW5wdXRGcmFtZS0+Y29kZWNPdXRwdXRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+eXV2QnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLT55dXZCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT55dXZCdWZmZXIuZGF0YSA9IG51bGxwdHI7CisgICAgICAgIG1ZdXZCdWZmZXJBY3F1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIHdoaWxlICghaW5wdXRGcmFtZS0+Y29kZWNJbnB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gaW5wdXRGcmFtZS0+Y29kZWNJbnB1dEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+Y29kZWNJbnB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIGlmICgoaW5wdXRGcmFtZS0+ZXJyb3IgfHwgbUVycm9yU3RhdGUpICYmICFpbnB1dEZyYW1lLT5lcnJvck5vdGlmaWVkKSB7CisgICAgICAgIG5vdGlmeUVycm9yKGlucHV0RnJhbWUtPmZyYW1lTnVtYmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+ZXJyb3JOb3RpZmllZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmZpbGVGZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKGlucHV0RnJhbWUtPmZpbGVGZCk7CisgICAgICAgIGlucHV0RnJhbWUtPmZpbGVGZCA9IC0xOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLT5hbmIgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGlucHV0RnJhbWUtPmFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+YW5iID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGludDY0X3QgY3VycmVudFRzKSB7CisgICAgYXV0byBpdCA9IG1QZW5kaW5nSW5wdXRGcmFtZXMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSkgeworICAgICAgICBpZiAoaXQtPmZpcnN0IDw9IGN1cnJlbnRUcykgeworICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoJml0LT5zZWNvbmQpOworICAgICAgICAgICAgaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmluaXRpYWxpemVDb2RlYyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYgY2FtZXJhRGV2aWNlKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIGJvb2wgdXNlR3JpZCA9IGZhbHNlOworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkID0gaXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2Rlcih3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgJm1Vc2VIZWljLCAmdXNlR3JpZCwgbnVsbHB0cik7CisgICAgaWYgKCFpc1NpemVTdXBwb3J0ZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFbmNvZGVyIGRvZXNudCcgc3VwcG9ydCBzaXplICV1IHggJXUhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENyZWF0ZSBMb29wZXIgZm9yIE1lZGlhQ29kZWMuCisgICAgYXV0byBkZXNpcmVkTWltZSA9IG1Vc2VIZWljID8gTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDIDogTUlNRVRZUEVfVklERU9fSEVWQzsKKyAgICBtQ29kZWNMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ29kZWNMb29wZXItPnNldE5hbWUoIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZS1NZWRpYUNvZGVjTG9vcGVyIik7CisgICAgc3RhdHVzX3QgcmVzID0gbUNvZGVjTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlLCAgIC8vIHJ1bk9uQ2FsbGluZ1RocmVhZAorICAgICAgICAgICAgZmFsc2UsICAgIC8vIGNhbkNhbGxKYXZhCisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzdGFydCBjb2RlYyBsb29wZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8vIENyZWF0ZSBIRUlDL0hFVkMgY29kZWMuCisgICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKG1Db2RlY0xvb3BlciwgZGVzaXJlZE1pbWUsIHRydWUgLyplbmNvZGVyKi8pOworICAgIGlmIChtQ29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgY29kZWMgZm9yICVzIiwgX19GVU5DVElPTl9fLCBkZXNpcmVkTWltZSk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8vIENyZWF0ZSBMb29wZXIgYW5kIGhhbmRsZXIgZm9yIENvZGVjIGNhbGxiYWNrLgorICAgIG1Db2RlY0NhbGxiYWNrSGFuZGxlciA9IG5ldyBDb2RlY0NhbGxiYWNrSGFuZGxlcih0aGlzKTsKKyAgICBpZiAobUNvZGVjQ2FsbGJhY2tIYW5kbGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGNvZGVjIGNhbGxiYWNrIGhhbmRsZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtQ2FsbGJhY2tMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ2FsbGJhY2tMb29wZXItPnNldE5hbWUoIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZS1NZWRpYUNvZGVjQ2FsbGJhY2tMb29wZXIiKTsKKyAgICByZXMgPSBtQ2FsbGJhY2tMb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UsICAgLy8gcnVuT25DYWxsaW5nVGhyZWFkCisgICAgICAgICAgICBmYWxzZSwgICAgLy8gY2FuQ2FsbEphdmEKKyAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHN0YXJ0IG1lZGlhIGNhbGxiYWNrIGxvb3BlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIG1DYWxsYmFja0xvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1Db2RlY0NhbGxiYWNrSGFuZGxlcik7CisKKyAgICBtQXN5bmNOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYWxsYmFja05vdGlmeSwgbUNvZGVjQ2FsbGJhY2tIYW5kbGVyKTsKKyAgICByZXMgPSBtQ29kZWMtPnNldENhbGxiYWNrKG1Bc3luY05vdGlmeSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgTWVkaWFDb2RlYyBjYWxsYmFjazogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgb3V0cHV0IGZvcm1hdCBhbmQgY29uZmlndXJlIHRoZSBDb2RlYy4KKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRTdHJpbmcoS0VZX01JTUUsIGRlc2lyZWRNaW1lKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9CSVRSQVRFX01PREUsIEJJVFJBVEVfTU9ERV9DUSk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfUVVBTElUWSwga0RlZmF1bHRKcGVnUXVhbGl0eSk7CisgICAgLy8gQXNrIGNvZGVjIHRvIHNraXAgdGltZXN0YW1wIGNoZWNrIGFuZCBlbmNvZGUgYWxsIGZyYW1lcy4KKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDY0KEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSLCBrTm9GcmFtZURyb3BNYXhQdHNHYXApOworCisgICAgaW50MzJfdCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIGdyaWRSb3dzLCBncmlkQ29sczsKKyAgICBpZiAodXNlR3JpZCB8fCBtVXNlSGVpYykgeworICAgICAgICBncmlkV2lkdGggPSBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjprR3JpZFdpZHRoOworICAgICAgICBncmlkSGVpZ2h0ID0gSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6a0dyaWRIZWlnaHQ7CisgICAgICAgIGdyaWRSb3dzID0gKGhlaWdodCArIGdyaWRIZWlnaHQgLSAxKS9ncmlkSGVpZ2h0OworICAgICAgICBncmlkQ29scyA9ICh3aWR0aCArIGdyaWRXaWR0aCAtIDEpL2dyaWRXaWR0aDsKKworICAgICAgICBpZiAobVVzZUhlaWMpIHsKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1RJTEVfV0lEVEgsIGdyaWRXaWR0aCk7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9USUxFX0hFSUdIVCwgZ3JpZEhlaWdodCk7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX0NPTFVNTlMsIGdyaWRDb2xzKTsKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfUk9XUywgZ3JpZFJvd3MpOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBncmlkV2lkdGggPSB3aWR0aDsKKyAgICAgICAgZ3JpZEhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgZ3JpZFJvd3MgPSAxOworICAgICAgICBncmlkQ29scyA9IDE7CisgICAgfQorCisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfV0lEVEgsICF1c2VHcmlkID8gd2lkdGggOiBncmlkV2lkdGgpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0hFSUdIVCwgIXVzZUdyaWQgPyBoZWlnaHQgOiBncmlkSGVpZ2h0KTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9JX0ZSQU1FX0lOVEVSVkFMLCAwKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsCisgICAgICAgICAgICB1c2VHcmlkID8gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUgOiBDT0xPUl9Gb3JtYXRTdXJmYWNlKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9GUkFNRV9SQVRFLCBncmlkUm93cyAqIGdyaWRDb2xzKTsKKyAgICAvLyBUaGlzIG9ubHkgc2VydmVzIGFzIGEgaGludCB0byBlbmNvZGVyIHdoZW4gZW5jb2RpbmcgaXMgbm90IHJlYWwtdGltZS4KKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9PUEVSQVRJTkdfUkFURSwgdXNlR3JpZCA/IGtHcmlkT3BSYXRlIDoga05vR3JpZE9wUmF0ZSk7CisKKyAgICByZXMgPSBtQ29kZWMtPmNvbmZpZ3VyZShvdXRwdXRGb3JtYXQsIG51bGxwdHIgLypuYXRpdmVXaW5kb3cqLywKKyAgICAgICAgICAgIG51bGxwdHIgLypjcnlwdG8qLywgQ09ORklHVVJFX0ZMQUdfRU5DT0RFKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNvbmZpZ3VyZSBjb2RlYzogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtR3JpZFdpZHRoID0gZ3JpZFdpZHRoOworICAgIG1HcmlkSGVpZ2h0ID0gZ3JpZEhlaWdodDsKKyAgICBtR3JpZFJvd3MgPSBncmlkUm93czsKKyAgICBtR3JpZENvbHMgPSBncmlkQ29sczsKKyAgICBtVXNlR3JpZCA9IHVzZUdyaWQ7CisgICAgbU91dHB1dFdpZHRoID0gd2lkdGg7CisgICAgbU91dHB1dEhlaWdodCA9IGhlaWdodDsKKyAgICBtQXBwU2VnbWVudE1heFNpemUgPSBjYWxjQXBwU2VnbWVudE1heFNpemUoY2FtZXJhRGV2aWNlLT5pbmZvKCkpOworICAgIG1NYXhIZWljQnVmZmVyU2l6ZSA9IG1PdXRwdXRXaWR0aCAqIG1PdXRwdXRIZWlnaHQgKiAzIC8gMiArIG1BcHBTZWdtZW50TWF4U2l6ZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpkZWluaXRDb2RlYygpIHsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChtQ29kZWMgIT0gbnVsbHB0cikgeworICAgICAgICBtQ29kZWMtPnN0b3AoKTsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYy5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtQ29kZWNMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQ29kZWNMb29wZXItPnN0b3AoKTsKKyAgICAgICAgbUNvZGVjTG9vcGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgaWYgKG1DYWxsYmFja0xvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1DYWxsYmFja0xvb3Blci0+c3RvcCgpOworICAgICAgICBtQ2FsbGJhY2tMb29wZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBtQXN5bmNOb3RpZnkuY2xlYXIoKTsKKyAgICBtRm9ybWF0LmNsZWFyKCk7Cit9CisKKy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29tcGxldGUgbGlzdCBvZiBhcHAgc2VnbWVudCwgMCBpbmRpY2F0ZXMgZmFpbHVyZQorc2l6ZV90IEhlaWNDb21wb3NpdGVTdHJlYW06OmZpbmRBcHBTZWdtZW50c1NpemUoY29uc3QgdWludDhfdCogYXBwU2VnbWVudEJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IG1heFNpemUsIHNpemVfdCAqYXBwMVNlZ21lbnRTaXplKSB7CisgICAgaWYgKGFwcFNlZ21lbnRCdWZmZXIgPT0gbnVsbHB0ciB8fCBhcHAxU2VnbWVudFNpemUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQgYXBwU2VnbWVudEJ1ZmZlciAlcCwgYXBwMVNlZ21lbnRTaXplICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFwcFNlZ21lbnRCdWZmZXIsIGFwcDFTZWdtZW50U2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSAwOworICAgIC8vIEZpcnN0IGNoZWNrIGZvciBFWElGIHRyYW5zcG9ydCBoZWFkZXIgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCisgICAgY29uc3QgdWludDhfdCAqaGVhZGVyID0gYXBwU2VnbWVudEJ1ZmZlciArIChtYXhTaXplIC0gc2l6ZW9mKHN0cnVjdCBDYW1lcmFCbG9iKSk7CisgICAgY29uc3Qgc3RydWN0IENhbWVyYUJsb2IgKmJsb2IgPSAoY29uc3Qgc3RydWN0IENhbWVyYUJsb2IqKShoZWFkZXIpOworICAgIGlmIChibG9iLT5ibG9iSWQgIT0gQ2FtZXJhQmxvYklkOjpKUEVHX0FQUF9TRUdNRU5UUykgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgRVhJRiBibG9iSWQgJWh1IiwgX19GVU5DVElPTl9fLCBibG9iLT5ibG9iSWQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBleHBlY3RlZFNpemUgPSBibG9iLT5ibG9iU2l6ZTsKKyAgICBpZiAoZXhwZWN0ZWRTaXplID09IDAgfHwgZXhwZWN0ZWRTaXplID4gbWF4U2l6ZSAtIHNpemVvZihzdHJ1Y3QgQ2FtZXJhQmxvYikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGJsb2JTaXplICV6dS4iLCBfX0ZVTkNUSU9OX18sIGV4cGVjdGVkU2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQzMl90IHRvdGFsU2l6ZSA9IDA7CisKKyAgICAvLyBWZXJpZnkgQVBQMSBtYXJrZXIgKG1hbmRhdG9yeSkKKyAgICB1aW50OF90IGFwcDFNYXJrZXJbXSA9IHsweEZGLCAweEUxfTsKKyAgICBpZiAobWVtY21wKGFwcFNlZ21lbnRCdWZmZXIsIGFwcDFNYXJrZXIsIHNpemVvZihhcHAxTWFya2VyKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEFQUDEgbWFya2VyOiAleCwgJXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclswXSwgYXBwU2VnbWVudEJ1ZmZlclsxXSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB0b3RhbFNpemUgKz0gc2l6ZW9mKGFwcDFNYXJrZXIpOworCisgICAgdWludDE2X3QgYXBwMVNpemUgPSAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSkgPDwgOCkgKworICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV07CisgICAgdG90YWxTaXplICs9IGFwcDFTaXplOworCisgICAgQUxPR1YoIiVzOiBFeHBlY3RlZCBBUFAgc2VnbWVudHMgc2l6ZSAlenUsIEFQUDEgc2VnbWVudCBzaXplICV1IiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZXhwZWN0ZWRTaXplLCBhcHAxU2l6ZSk7CisgICAgd2hpbGUgKHRvdGFsU2l6ZSA8IGV4cGVjdGVkU2l6ZSkgeworICAgICAgICBpZiAoYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemVdICE9IDB4RkYgfHwKKyAgICAgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZSsxXSA8PSAweEUxIHx8CisgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV0gPiAweEVGKSB7CisgICAgICAgICAgICAvLyBJbnZhbGlkIEFQUG4gbWFya2VyCisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgQVBQbiBtYXJrZXI6ICV4LCAleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemVdLCBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZSsxXSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICB0b3RhbFNpemUgKz0gMjsKKworICAgICAgICB1aW50MTZfdCBhcHBuU2l6ZSA9IChzdGF0aWNfY2FzdDx1aW50MTZfdD4oYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemVdKSA8PCA4KSArCisgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV07CisgICAgICAgIHRvdGFsU2l6ZSArPSBhcHBuU2l6ZTsKKyAgICB9CisKKyAgICBpZiAodG90YWxTaXplICE9IGV4cGVjdGVkU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgSlBFRyBBUFAgc2VnbWVudHM6IHRvdGFsU2l6ZSAldSB2cyBleHBlY3RlZCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0b3RhbFNpemUsIGV4cGVjdGVkU2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICphcHAxU2VnbWVudFNpemUgPSBhcHAxU2l6ZSArIHNpemVvZihhcHAxTWFya2VyKTsKKyAgICByZXR1cm4gZXhwZWN0ZWRTaXplOworfQorCitpbnQ2NF90IEhlaWNDb21wb3NpdGVTdHJlYW06OmZpbmRUaW1lc3RhbXBJbk5zTG9ja2VkKGludDY0X3QgdGltZUluVXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZuIDogbUZyYW1lTnVtYmVyTWFwKSB7CisgICAgICAgIGlmICh0aW1lSW5VcyA9PSBuczJ1cyhmbi5zZWNvbmQpKSB7CisgICAgICAgICAgICByZXR1cm4gZm4uc2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgaW5wdXRGcmFtZSA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgaWYgKHRpbWVJblVzID09IG5zMnVzKGlucHV0RnJhbWUuZmlyc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXRGcmFtZS5maXJzdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmNvcHlPbmVZdXZUaWxlKHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBjb2RlY0J1ZmZlciwKKyAgICAgICAgY29uc3QgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciYgeXV2QnVmZmVyLAorICAgICAgICBzaXplX3QgdG9wLCBzaXplX3QgbGVmdCwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIC8vIEdldCBzdHJpZGUgaW5mb3JtYXRpb24gZm9yIGNvZGVjQnVmZmVyCisgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhOworICAgIGlmICghY29kZWNCdWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWFnZURhdGEpKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29kZWMgaW5wdXQgYnVmZmVyIGlzIG5vdCBmb3IgaW1hZ2UgZGF0YSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoaW1hZ2VEYXRhLT5zaXplKCkgIT0gc2l6ZW9mKE1lZGlhSW1hZ2UyKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY29kZWMgaW5wdXQgaW1hZ2Ugc2l6ZSAlenUsIGV4cGVjdGVkICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbWFnZURhdGEtPnNpemUoKSwgc2l6ZW9mKE1lZGlhSW1hZ2UyKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE1lZGlhSW1hZ2UyKiBpbWFnZUluZm8gPSByZWludGVycHJldF9jYXN0PE1lZGlhSW1hZ2UyKj4oaW1hZ2VEYXRhLT5kYXRhKCkpOworICAgIGlmIChpbWFnZUluZm8tPm1UeXBlICE9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVViB8fAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tQml0RGVwdGggIT0gOCB8fAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tQml0RGVwdGhBbGxvY2F0ZWQgIT0gOCB8fAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tTnVtUGxhbmVzICE9IDMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNvZGVjIGlucHV0IGltYWdlIGluZm86IG1UeXBlICVkLCBtQml0RGVwdGggJWQsICIKKyAgICAgICAgICAgICAgICAibUJpdERlcHRoQWxsb2NhdGVkICVkLCBtTnVtUGxhbmVzICVkISIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1UeXBlLCBpbWFnZUluZm8tPm1CaXREZXB0aCwKKyAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1CaXREZXB0aEFsbG9jYXRlZCwgaW1hZ2VJbmZvLT5tTnVtUGxhbmVzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IHl1dkJ1ZmZlciBjaHJvbWFTdGVwICVkLCBjaHJvbWFTdHJpZGUgJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB5dXZCdWZmZXIuY2hyb21hU3RlcCwgeXV2QnVmZmVyLmNocm9tYVN0cmlkZSk7CisgICAgQUxPR1YoIiVzOiBVIG9mZnNldCAldSwgViBvZmZzZXQgJXUsIFUgcm93SW5jICVkLCBWIHJvd0luYyAlZCwgVSBjb2xJbmMgJWQsIFYgY29sSW5jICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jLAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubUNvbEluYywKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tQ29sSW5jKTsKKworICAgIC8vIFkKKyAgICBmb3IgKGF1dG8gcm93ID0gdG9wOyByb3cgPCB0b3AraGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90ICpkc3QgPSBjb2RlY0J1ZmZlci0+ZGF0YSgpICsgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlldLm1PZmZzZXQgKworICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpZXS5tUm93SW5jICogKHJvdyAtIHRvcCk7CisgICAgICAgIG1GbkNvcHlSb3coeXV2QnVmZmVyLmRhdGErcm93Knl1dkJ1ZmZlci5zdHJpZGUrbGVmdCwgZHN0LCB3aWR0aCk7CisgICAgfQorCisgICAgLy8gVSBpcyBDYiwgViBpcyBDcgorICAgIGJvb2wgY29kZWNVUGxhbmVGaXJzdCA9IGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0ID4KKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0OworICAgIHVpbnQzMl90IGNvZGVjVXZPZmZzZXREaWZmID0gY29kZWNVUGxhbmVGaXJzdCA/CisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCAtIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0IDoKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0IC0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQ7CisgICAgYm9vbCBpc0NvZGVjVXZTZW1pcGxhbm5hciA9IChjb2RlY1V2T2Zmc2V0RGlmZiA9PSAxKSAmJgorICAgICAgICAgICAgKGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jID09CisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubVJvd0luYykgJiYKKyAgICAgICAgICAgIChpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubUNvbEluYyA9PSAyKSAmJgorICAgICAgICAgICAgKGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tQ29sSW5jID09IDIpOworICAgIGJvb2wgaXNDb2RlY1V2UGxhbm5hciA9CisgICAgICAgICAgICAoKGNvZGVjVVBsYW5lRmlyc3QgJiYgY29kZWNVdk9mZnNldERpZmYgPj0KKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMgKiBpbWFnZUluZm8tPm1IZWlnaHQvMikgfHwKKyAgICAgICAgICAgICgoIWNvZGVjVVBsYW5lRmlyc3QgJiYgY29kZWNVdk9mZnNldERpZmYgPj0KKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMgKiBpbWFnZUluZm8tPm1IZWlnaHQvMikpKSAmJgorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Db2xJbmMgPT0gMSAmJgorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Db2xJbmMgPT0gMTsKKyAgICBib29sIGNhbWVyYVVQbGFuZUZpcnN0ID0geXV2QnVmZmVyLmRhdGFDciA+IHl1dkJ1ZmZlci5kYXRhQ2I7CisKKyAgICBpZiAoaXNDb2RlY1V2U2VtaXBsYW5uYXIgJiYgeXV2QnVmZmVyLmNocm9tYVN0ZXAgPT0gMiAmJgorICAgICAgICAgICAgKGNvZGVjVVBsYW5lRmlyc3QgPT0gY2FtZXJhVVBsYW5lRmlyc3QpKSB7CisgICAgICAgIC8vIFVWIHNlbWlwbGFubmFyCisgICAgICAgIC8vIFRoZSBjaHJvbWUgcGxhbmUgY291bGQgYmUgZWl0aGVyIENiIGZpcnN0LCBvciBDciBmaXJzdC4gVGFrZSB0aGUKKyAgICAgICAgLy8gc21hbGxlciBhZGRyZXNzLgorICAgICAgICB1aW50OF90ICpzcmMgPSBzdGQ6Om1pbih5dXZCdWZmZXIuZGF0YUNiLCB5dXZCdWZmZXIuZGF0YUNyKTsKKyAgICAgICAgTWVkaWFJbWFnZTI6OlBsYW5lSW5kZXggZHN0UGxhbmUgPSBjb2RlY1V2T2Zmc2V0RGlmZiA+IDAgPyBNZWRpYUltYWdlMjo6VSA6IE1lZGlhSW1hZ2UyOjpWOworICAgICAgICBmb3IgKGF1dG8gcm93ID0gdG9wLzI7IHJvdyA8ICh0b3AraGVpZ2h0KS8yOyByb3crKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKSArIGltYWdlSW5mby0+bVBsYW5lW2RzdFBsYW5lXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbZHN0UGxhbmVdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpOworICAgICAgICAgICAgbUZuQ29weVJvdyhzcmMrcm93Knl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUrbGVmdCwgZHN0LCB3aWR0aCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzQ29kZWNVdlBsYW5uYXIgJiYgeXV2QnVmZmVyLmNocm9tYVN0ZXAgPT0gMSkgeworICAgICAgICAvLyBVIHBsYW5lCisgICAgICAgIGZvciAoYXV0byByb3cgPSB0b3AvMjsgcm93IDwgKHRvcCtoZWlnaHQpLzI7IHJvdysrKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBjb2RlY0J1ZmZlci0+ZGF0YSgpICsgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYyAqIChyb3cgLSB0b3AvMik7CisgICAgICAgICAgICBtRm5Db3B5Um93KHl1dkJ1ZmZlci5kYXRhQ2Ircm93Knl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUrbGVmdC8yLCBkc3QsIHdpZHRoLzIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gViBwbGFuZQorICAgICAgICBmb3IgKGF1dG8gcm93ID0gdG9wLzI7IHJvdyA8ICh0b3AraGVpZ2h0KS8yOyByb3crKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKSArIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpOworICAgICAgICAgICAgbUZuQ29weVJvdyh5dXZCdWZmZXIuZGF0YUNyK3Jvdyp5dXZCdWZmZXIuY2hyb21hU3RyaWRlK2xlZnQvMiwgZHN0LCB3aWR0aC8yKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENvbnZlcnQgYmV0d2VlbiBzZW1pcGxhbm5hciBhbmQgcGxhbm5hciwgb3Igd2hlbiBVViBvcmRlcnMgYXJlCisgICAgICAgIC8vIGRpZmZlcmVudC4KKyAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKTsKKyAgICAgICAgZm9yIChhdXRvIHJvdyA9IHRvcC8yOyByb3cgPCAodG9wK2hlaWdodCkvMjsgcm93KyspIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjb2wgPSBsZWZ0LzI7IGNvbCA8IChsZWZ0K3dpZHRoKS8yOyBjb2wrKykgeworICAgICAgICAgICAgICAgIC8vIFUvQ2IKKyAgICAgICAgICAgICAgICBpbnQzMl90IGRzdEluZGV4ID0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tQ29sSW5jICogKGNvbCAtIGxlZnQvMik7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNJbmRleCA9IHJvdyAqIHl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUgKyB5dXZCdWZmZXIuY2hyb21hU3RlcCAqIGNvbDsKKyAgICAgICAgICAgICAgICBkc3RbZHN0SW5kZXhdID0geXV2QnVmZmVyLmRhdGFDYltzcmNJbmRleF07CisKKyAgICAgICAgICAgICAgICAvLyBWL0NyCisgICAgICAgICAgICAgICAgZHN0SW5kZXggPSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubVJvd0luYyAqIChyb3cgLSB0b3AvMikgKworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Db2xJbmMgKiAoY29sIC0gbGVmdC8yKTsKKyAgICAgICAgICAgICAgICBzcmNJbmRleCA9IHJvdyAqIHl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUgKyB5dXZCdWZmZXIuY2hyb21hU3RlcCAqIGNvbDsKKyAgICAgICAgICAgICAgICBkc3RbZHN0SW5kZXhdID0geXV2QnVmZmVyLmRhdGFDcltzcmNJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OmluaXRDb3B5Um93RnVuY3Rpb24oaW50MzJfdCB3aWR0aCkKK3sKKyAgICB1c2luZyBuYW1lc3BhY2UgbGlieXV2OworCisgICAgbUZuQ29weVJvdyA9IENvcHlSb3dfQzsKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX1NTRTIpCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNTU0UyKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gSVNfQUxJR05FRCh3aWR0aCwgMzIpID8gQ29weVJvd19TU0UyIDogQ29weVJvd19BbnlfU1NFMjsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX0FWWCkKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc0FWWCkpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IElTX0FMSUdORUQod2lkdGgsIDY0KSA/IENvcHlSb3dfQVZYIDogQ29weVJvd19BbnlfQVZYOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfRVJNUykKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc0VSTVMpKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBDb3B5Um93X0VSTVM7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19ORU9OKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzTkVPTikpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IElTX0FMSUdORUQod2lkdGgsIDMyKSA/IENvcHlSb3dfTkVPTiA6IENvcHlSb3dfQW55X05FT047CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19NSVBTKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzTUlQUykpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IENvcHlSb3dfTUlQUzsKKyAgICB9CisjZW5kaWYKK30KKworc2l6ZV90IEhlaWNDb21wb3NpdGVTdHJlYW06OmNhbGNBcHBTZWdtZW50TWF4U2l6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbykgeworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0gaW5mby5maW5kKEFORFJPSURfSEVJQ19JTkZPX01BWF9KUEVHX0FQUF9TRUdNRU5UU19DT1VOVCk7CisgICAgc2l6ZV90IG1heEFwcHNTZWdtZW50ID0gMTsKKyAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIG1heEFwcHNTZWdtZW50ID0gZW50cnkuZGF0YS51OFswXSA8IDEgPyAxIDoKKyAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID4gMTYgPyAxNiA6IGVudHJ5LmRhdGEudThbMF07CisgICAgfQorICAgIHJldHVybiBtYXhBcHBzU2VnbWVudCAqICgyICsgMHhGRkZGKSArIHNpemVvZihzdHJ1Y3QgQ2FtZXJhQmxvYik7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6dGhyZWFkTG9vcCgpIHsKKyAgICBpbnQ2NF90IGN1cnJlbnRUcyA9IElOVDY0X01BWDsKKyAgICBib29sIG5ld0lucHV0QXZhaWxhYmxlID0gZmFsc2U7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmIChtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSB3ZSBsYW5kZWQgaW4gZXJyb3Igc3RhdGUsIHJldHVybiBhbnkgcGVuZGluZyBidWZmZXJzIGFuZAorICAgICAgICAgICAgLy8gaGFsdCBhbGwgZnVydGhlciBwcm9jZXNzaW5nLgorICAgICAgICAgICAgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGN1cnJlbnRUcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworCisgICAgICAgIHdoaWxlICghbmV3SW5wdXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIG5ld0lucHV0QXZhaWxhYmxlID0gZ2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoJmN1cnJlbnRUcyk7CisKKyAgICAgICAgICAgIGlmICghbmV3SW5wdXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGZhaWxpbmdGcmFtZU51bWJlciA9IGdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoJmN1cnJlbnRUcyk7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxpbmdGcmFtZU51bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBlcmFzZSAnbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdJyBhdCB0aGlzIHBvaW50IGJlY2F1c2UgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHR3byBpbnRlcm5hbCBzdHJlYW0gYnVmZmVycyB0byBmYWlsLiBJbiBzdWNoIHNjZW5hcmlvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wb3NpdGUgc3RyZWFtIHNob3VsZCBub3RpZnkgdGhlIGNsaWVudCBhYm91dCBhIHN0cmVhbSBidWZmZXIgZXJyb3Igb25seQorICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFuZCB0aGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgd2l0aGluICdlcnJvck5vdGlmaWVkJy4KKyAgICAgICAgICAgICAgICAgICAgLy8gQW55IHByZXNlbnQgZmFpbGVkIGlucHV0IGZyYW1lcyB3aWxsIGJlIHJlbW92ZWQgb24gYSBzdWJzZXF1ZW50IGNhbGwgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gJ3JlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZCgpJy4KKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoJm1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcyA9IElOVDY0X01BWDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdXRvIHJldCA9IG1JbnB1dFJlYWR5Q29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTXV0ZXgsIGtXYWl0RHVyYXRpb24pOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVGltZWQgd2FpdCBvbiBjb25kaXRpb24gZmFpbGVkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byByZXMgPSBwcm9jZXNzSW5wdXRGcmFtZShjdXJyZW50VHMsIG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHByb2Nlc3NpbmcgZnJhbWUgd2l0aCB0aW1lc3RhbXA6ICUiIFBSSXU2NCAiOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGN1cnJlbnRUcywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXS5lcnJvciA9IHRydWU7CisgICAgfQorCisgICAgaWYgKG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXS5lcnJvciB8fAorICAgICAgICAgICAgKG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXS5hcHBTZWdtZW50V3JpdHRlbiAmJgorICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdLnBlbmRpbmdPdXRwdXRUaWxlcyA9PSAwKSkgeworICAgICAgICByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoY3VycmVudFRzKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGJvb2wgcmVzID0gZmFsc2U7CisgICAgLy8gQnVmZmVyIGVycm9ycyBjb25jZXJuaW5nIGludGVybmFsIGNvbXBvc2l0ZSBzdHJlYW1zIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgdmlzaWJsZSB0bworICAgIC8vIGNhbWVyYSBjbGllbnRzLiBUaGV5IG11c3Qgb25seSByZWNlaXZlIGEgc2luZ2xlIGJ1ZmZlciBlcnJvciB3aXRoIHRoZSBwdWJsaWMgY29tcG9zaXRlCisgICAgLy8gc3RyZWFtIGlkLgorICAgIGlmICgocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbUFwcFNlZ21lbnRTdHJlYW1JZCkgfHwKKyAgICAgICAgICAgIChyZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCA9PSBtTWFpbkltYWdlU3RyZWFtSWQpKSB7CisgICAgICAgIGZsYWdBbkVycm9yRnJhbWVOdW1iZXIocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmVzID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgLy8gRm9yIHJlc3VsdCBlcnJvciwgc2luY2UgdGhlIEFQUFNfU0VHTUVOVCBidWZmZXIgYWxyZWFkeSBjb250YWlucyBFWElGLAorICAgIC8vIHNpbXBseSBza2lwIHVzaW5nIHRoZSBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSB0byBvdmVycmlkZSBFWElGLgorICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IC0xOworICAgIGZvciAoY29uc3QgYXV0byYgZm4gOiBtRnJhbWVOdW1iZXJNYXApIHsKKyAgICAgICAgaWYgKGZuLmZpcnN0ID09IHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcikgeworICAgICAgICAgICAgdGltZXN0YW1wID0gZm4uc2Vjb25kOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcCA9PSAtMSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGlucHV0RnJhbWUgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRGcmFtZS5zZWNvbmQuZnJhbWVOdW1iZXIgPT0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gaW5wdXRGcmFtZS5maXJzdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aW1lc3RhbXAgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBzaHV0dGVyIHRpbWVzdGFtcCBmb3IgcmVzdWx0IGVycm9yISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2FwdHVyZVJlc3VsdHMuZW1wbGFjZSh0aW1lc3RhbXAsIHN0ZDo6bWFrZV90dXBsZShyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIENhbWVyYU1ldGFkYXRhKCkpKTsKKyAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpDb2RlY0NhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxIZWljQ29tcG9zaXRlU3RyZWFtPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHJldHVybjsKKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdENhbGxiYWNrTm90aWZ5OiB7CisgICAgICAgICAgICAgaW50MzJfdCBjYklEOworICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImNhbGxiYWNrSUQiLCAmY2JJRCkpIHsKKyAgICAgICAgICAgICAgICAgQUxPR0UoImtXaGF0Q2FsbGJhY2tOb3RpZnk6IGNhbGxiYWNrSUQgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIEFMT0dWKCJrV2hhdENhbGxiYWNrTm90aWZ5OiBjYklEID0gJWQiLCBjYklEKTsKKworICAgICAgICAgICAgIHN3aXRjaCAoY2JJRCkgeworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX0lOUFVUX0FWQUlMQUJMRTogeworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9JTlBVVF9BVkFJTEFCTEU6IGluZGV4IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5vbkhlaWNJbnB1dEZyYW1lQXZhaWxhYmxlKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9PVVRQVVRfQVZBSUxBQkxFOiB7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogaW5kZXggaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZFNpemUoIm9mZnNldCIsICZvZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IG9mZnNldCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kU2l6ZSgic2l6ZSIsICZzaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBzaXplIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogdGltZVVzIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IGZsYWdzIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBDb2RlY091dHB1dEJ1ZmZlckluZm8gYnVmZmVySW5mbyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3Qpc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWZsYWdzfTsKKworICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5vbkhlaWNPdXRwdXRGcmFtZUF2YWlsYWJsZShidWZmZXJJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRDogZm9ybWF0IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm9uSGVpY0Zvcm1hdENoYW5nZWQoZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9FUlJPUjogeworICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY3Rpb25Db2RlOworICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBkZXRhaWw7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9FUlJPUjogZXJyIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWN0aW9uIiwgJmFjdGlvbkNvZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0VSUk9SOiBhY3Rpb24gaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRTdHJpbmcoImRldGFpbCIsICZkZXRhaWwpOworICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHJlcG9ydGVkIGVycm9yKDB4JXgpLCBhY3Rpb25Db2RlKCVkKSwgZGV0YWlsKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYWN0aW9uQ29kZSwgZGV0YWlsLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm9uSGVpY0NvZGVjRXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImtXaGF0Q2FsbGJhY2tOb3RpZnk6IGNhbGxiYWNrSUQoJWQpIGlzIHVuZXhwZWN0ZWQuIiwgY2JJRCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2hvdWxkbid0IGJlIGhlcmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTNjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaApAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0hFSUNfQ09NUE9TSVRFX1NUUkVBTV9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19IRUlDX0NPTVBPU0lURV9TVFJFQU1fSAorCisjaW5jbHVkZSA8cXVldWU+CisKKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CisKKyNpbmNsdWRlICJDb21wb3NpdGVTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBIZWljQ29tcG9zaXRlU3RyZWFtIDogcHVibGljIENvbXBvc2l0ZVN0cmVhbSwgcHVibGljIFRocmVhZCwKKyAgICAgICAgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICBIZWljQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYik7CisgICAgfkhlaWNDb21wb3NpdGVTdHJlYW0oKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzSGVpY0NvbXBvc2l0ZVN0cmVhbShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisKKyAgICBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGRlbGV0ZUludGVybmFsU3RyZWFtcygpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBpbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpIG92ZXJyaWRlOworCisgICAgdm9pZCBvblNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCkgb3ZlcnJpZGU7CisKKyAgICBpbnQgZ2V0U3RyZWFtSWQoKSBvdmVycmlkZSB7IHJldHVybiBtTWFpbkltYWdlU3RyZWFtSWQ7IH0KKworICAgIC8vIFVzZSBvblNodXR0ZXIgdG8ga2VlcCB0cmFjayBvZiBmcmFtZSBudW1iZXIgPC0+IHRpbWVzdGFtcCBtYXBwaW5nLgorICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLCBpbnQgc3RyZWFtSWQsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIG92ZXJyaWRlOworCisgICAgLy8gQ3B1Q29uc3VtZXIgbGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKyAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgb3ZlcnJpZGU7CisKKyAgICAvLyBSZXR1cm4gc3RyZWFtIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRDb21wb3NpdGVTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+KiBjb21wb3NpdGVPdXRwdXQgLypvdXQqLyk7CisKKyAgICBzdGF0aWMgYm9vbCBpc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgYm9vbCogdXNlSGVpYywgYm9vbCogdXNlR3JpZCwgaW50NjRfdCogc3RhbGwpOworICAgIHN0YXRpYyBib29sIGlzSW5NZW1vcnlUZW1wRmlsZVN1cHBvcnRlZCgpOworcHJvdGVjdGVkOgorCisgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8KKyAgICAvLyBIRUlDL0hFVkMgQ29kZWMgcmVsYXRlZCBzdHJ1Y3R1cmVzLCB1dGlsaXR5IGZ1bmN0aW9ucywgYW5kIGNhbGxiYWNrcworICAgIC8vCisgICAgc3RydWN0IENvZGVjT3V0cHV0QnVmZmVySW5mbyB7CisgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgIGludDMyX3Qgb2Zmc2V0OworICAgICAgICBpbnQzMl90IHNpemU7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICB9OworCisgICAgc3RydWN0IENvZGVjSW5wdXRCdWZmZXJJbmZvIHsKKyAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIHNpemVfdCB0aWxlSW5kZXg7CisgICAgfTsKKworICAgIGNsYXNzIENvZGVjQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENvZGVjQ2FsbGJhY2tIYW5kbGVyKHdwPEhlaWNDb21wb3NpdGVTdHJlYW0+IHBhcmVudCkgeworICAgICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHByaXZhdGU6CisgICAgICAgIHdwPEhlaWNDb21wb3NpdGVTdHJlYW0+IG1QYXJlbnQ7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdENhbGxiYWNrTm90aWZ5LAorICAgIH07CisKKyAgICBib29sICAgICAgICAgICAgICBtVXNlSGVpYzsKKyAgICBzcDxNZWRpYUNvZGVjPiAgICBtQ29kZWM7CisgICAgc3A8QUxvb3Blcj4gICAgICAgbUNvZGVjTG9vcGVyLCBtQ2FsbGJhY2tMb29wZXI7CisgICAgc3A8Q29kZWNDYWxsYmFja0hhbmRsZXI+IG1Db2RlY0NhbGxiYWNrSGFuZGxlcjsKKyAgICBzcDxBTWVzc2FnZT4gICAgICBtQXN5bmNOb3RpZnk7CisgICAgc3A8QU1lc3NhZ2U+ICAgICAgbUZvcm1hdDsKKyAgICBzaXplX3QgICAgICAgICAgICBtTnVtT3V0cHV0VGlsZXM7CisKKyAgICBpbnQzMl90ICAgICAgICAgICBtT3V0cHV0V2lkdGgsIG1PdXRwdXRIZWlnaHQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbU1heEhlaWNCdWZmZXJTaXplOworICAgIGludDMyX3QgICAgICAgICAgIG1HcmlkV2lkdGgsIG1HcmlkSGVpZ2h0OworICAgIHNpemVfdCAgICAgICAgICAgIG1HcmlkUm93cywgbUdyaWRDb2xzOworICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VHcmlkOyAvLyBXaGV0aGVyIHRvIHVzZSBmcmFtZXdvcmsgWVVWIGZyYW1lIHRpbGluZy4KKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtOb0ZyYW1lRHJvcE1heFB0c0dhcCA9IC0xMDAwMDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOb0dyaWRPcFJhdGUgPSAzMDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrR3JpZE9wUmF0ZSA9IDEyMDsKKworICAgIHZvaWQgb25IZWljT3V0cHV0RnJhbWVBdmFpbGFibGUoY29uc3QgQ29kZWNPdXRwdXRCdWZmZXJJbmZvJiBidWZmZXJJbmZvKTsKKyAgICB2b2lkIG9uSGVpY0lucHV0RnJhbWVBdmFpbGFibGUoaW50MzJfdCBpbmRleCk7ICAvLyBPbmx5IGNhbGxlZCBmb3IgWVVWIGlucHV0IG1vZGUuCisgICAgdm9pZCBvbkhlaWNGb3JtYXRDaGFuZ2VkKHNwPEFNZXNzYWdlPiYgbmV3Rm9ybWF0KTsKKyAgICB2b2lkIG9uSGVpY0NvZGVjRXJyb3IoKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemVDb2RlYyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIGNhbWVyYURldmljZSk7CisgICAgdm9pZCBkZWluaXRDb2RlYygpOworCisgICAgLy8KKyAgICAvLyBDb21wb3NpdGUgc3RyZWFtIHJlbGF0ZWQgc3RydWN0dXJlcywgdXRpbGl0eSBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrcy4KKyAgICAvLworICAgIHN0cnVjdCBJbnB1dEZyYW1lIHsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICBxdWFsaXR5OworCisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNPdXRwdXRCdWZmZXJJbmZvPiBjb2RlY091dHB1dEJ1ZmZlcnM7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFNZXRhZGF0YT4gICAgcmVzdWx0OworCisgICAgICAgIC8vIEZpZWxkcyB0aGF0IGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEVWQyB0aWxpbmcuCisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgICAgICAgICAgeXV2QnVmZmVyOworICAgICAgICBzdGQ6OnZlY3RvcjxDb2RlY0lucHV0QnVmZmVySW5mbz4gIGNvZGVjSW5wdXRCdWZmZXJzOworCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3I7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZDsKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcjsKKworICAgICAgICBzcDxNZWRpYU11eGVyPiAgICAgICAgICAgIG11eGVyOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlRmQ7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgZmlsZUZkOworICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgIHRyYWNrSW5kZXg7CisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgICAgICAgKmFuYjsKKworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRXcml0dGVuOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdPdXRwdXRUaWxlczsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBjb2RlY0lucHV0Q291bnRlcjsKKworICAgICAgICBJbnB1dEZyYW1lKCkgOiBvcmllbnRhdGlvbigwKSwgcXVhbGl0eShrRGVmYXVsdEpwZWdRdWFsaXR5KSwgZXJyb3IoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5vdGlmaWVkKGZhbHNlKSwgZnJhbWVOdW1iZXIoLTEpLCBmZW5jZUZkKC0xKSwgZmlsZUZkKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmRleCgtMSksIGFuYihudWxscHRyKSwgYXBwU2VnbWVudFdyaXR0ZW4oZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nT3V0cHV0VGlsZXMoMCksIGNvZGVjSW5wdXRDb3VudGVyKDApIHsgfQorICAgIH07CisKKyAgICB2b2lkIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAvLyBGaW5kIGZpcnN0IGNvbXBsZXRlIGFuZCB2YWxpZCBmcmFtZSB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcAorICAgIGJvb2wgZ2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qb3V0Ki8pOworICAgIC8vIEZpbmQgbmV4dCBmYWlsaW5nIGZyYW1lIG51bWJlciB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcCBhbmQgcmV0dXJuIHJlc3BlY3RpdmUgZnJhbWUgbnVtYmVyCisgICAgaW50NjRfdCBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKm91dCovKTsKKworICAgIHN0YXR1c190IHByb2Nlc3NJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzQ29kZWNJbnB1dEZyYW1lKElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHN0YXJ0TXV4ZXJGb3JJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzQXBwU2VnbWVudChuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc09uZUNvZGVjT3V0cHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHByb2Nlc3NDb21wbGV0ZWRJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKworICAgIHZvaWQgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoSW5wdXRGcmFtZSAqaW5wdXRGcmFtZSAvKm91dCovKTsKKyAgICB2b2lkIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChpbnQ2NF90IGN1cnJlbnRUcyk7CisKKyAgICBzaXplX3QgZmluZEFwcFNlZ21lbnRzU2l6ZShjb25zdCB1aW50OF90KiBhcHBTZWdtZW50QnVmZmVyLCBzaXplX3QgbWF4U2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCogYXBwMVNlZ21lbnRTaXplKTsKKyAgICBpbnQ2NF90IGZpbmRUaW1lc3RhbXBJbk5zTG9ja2VkKGludDY0X3QgdGltZUluVXMpOworICAgIHN0YXR1c190IGNvcHlPbmVZdXZUaWxlKHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBjb2RlY0J1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXImIHl1dkJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCB0b3AsIHNpemVfdCBsZWZ0LCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpOworICAgIHZvaWQgaW5pdENvcHlSb3dGdW5jdGlvbihpbnQzMl90IHdpZHRoKTsKKyAgICBzdGF0aWMgc2l6ZV90IGNhbGNBcHBTZWdtZW50TWF4U2l6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbyk7CisKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdER1cmF0aW9uID0gMTAwMDAwMDA7IC8vIDEwIG1zCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0RlZmF1bHRKcGVnUXVhbGl0eSA9IDk5OworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtKcGVnRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9WMF9KRklGOworICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkX2RhdGFzcGFjZSBrQXBwU2VnbWVudERhdGFTcGFjZSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9KUEVHX0FQUF9TRUdNRU5UUyk7CisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIGtIZWlmRGF0YVNwYWNlID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0hFSUYpOworCisgICAgaW50ICAgICAgICAgICAgICAgbUFwcFNlZ21lbnRTdHJlYW1JZCwgbUFwcFNlZ21lbnRTdXJmYWNlSWQ7CisgICAgc3A8Q3B1Q29uc3VtZXI+ICAgbUFwcFNlZ21lbnRDb25zdW1lcjsKKyAgICBzcDxTdXJmYWNlPiAgICAgICBtQXBwU2VnbWVudFN1cmZhY2U7CisgICAgYm9vbCAgICAgICAgICAgICAgbUFwcFNlZ21lbnRCdWZmZXJBY3F1aXJlZDsKKyAgICBzaXplX3QgICAgICAgICAgICBtQXBwU2VnbWVudE1heFNpemU7CisgICAgQ2FtZXJhTWV0YWRhdGEgICAgbVN0YXRpY0luZm87CisKKyAgICBpbnQgICAgICAgICAgICAgICBtTWFpbkltYWdlU3RyZWFtSWQsIG1NYWluSW1hZ2VTdXJmYWNlSWQ7CisgICAgc3A8U3VyZmFjZT4gICAgICAgbU1haW5JbWFnZVN1cmZhY2U7CisgICAgc3A8Q3B1Q29uc3VtZXI+ICAgbU1haW5JbWFnZUNvbnN1bWVyOyAvLyBPbmx5IGFwcGxpY2FibGUgZm9yIEhFVkMgY29kZWMuCisgICAgYm9vbCAgICAgICAgICAgICAgbVl1dkJ1ZmZlckFjcXVpcmVkOyAvLyBPbmx5IGFwcGxpY2FibGUgdG8gSEVWQyBjb2RlYworCisgICAgc3A8U3VyZmFjZT4gICAgICAgbU91dHB1dFN1cmZhY2U7CisgICAgc3A8UHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CisKKworICAgIC8vIE1hcCBmcm9tIGZyYW1lIG51bWJlciB0byBKUEVHIHNldHRpbmcgb2Ygb3JpZW50YXRpb24rcXVhbGl0eQorICAgIHN0ZDo6bWFwPGludDY0X3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gbVNldHRpbmdzQnlGcmFtZU51bWJlcjsKKyAgICAvLyBNYXAgZnJvbSB0aW1lc3RhbXAgdG8gSlBFRyBzZXR0aW5nIG9mIG9yaWVudGF0aW9uK3F1YWxpdHkKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IG1TZXR0aW5nc0J5VGltZXN0YW1wOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgQVBQIHNlZ21lbnQgQmxvYiBidWZmZXIgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnM7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBIRUlDIGJsb2IgYnVmZmVyIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dmVjdG9yPENvZGVjT3V0cHV0QnVmZmVySW5mbz4gbUNvZGVjT3V0cHV0QnVmZmVyczsKKyAgICBzdGQ6OnF1ZXVlPGludDY0X3Q+IG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHM7CisgICAgc2l6ZV90IG1PdXRwdXRCdWZmZXJDb3VudGVyOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgWXV2IGJ1ZmZlciBwZW5kaW5nIHRpbGluZyBhbmQgZW5jb2RpbmcgKGZvciBIRVZDIFlVViB0aWxpbmcgb25seSkKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSW5wdXRZdXZCdWZmZXJzOworICAgIC8vIEtlZXAgYWxsIGNvZGVjIGlucHV0IGJ1ZmZlcnMgcmVhZHkgdG8gYmUgZmlsbGVkIG91dCAoZm9yIEhFVkMgWVVWIHRpbGluZyBvbmx5KQorICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG1Db2RlY0lucHV0QnVmZmVyczsKKworICAgIC8vIEFydGlmaWNpYWwgc3RyaWN0bHkgaW5jcmVtZW50YWwgWVVWIGdyaWQgdGltZXN0YW1wIHRvIG1ha2UgZW5jb2RlciBoYXBweS4KKyAgICBpbnQ2NF90IG1HcmlkVGltZXN0YW1wVXM7CisKKyAgICAvLyBJbiBtb3N0IGNvbW1vbiB1c2UgY2FzZSwgZW50cmllcyBhcmUgYWNjZXNzZWQgaW4gb3JkZXIuCisgICAgc3RkOjptYXA8aW50NjRfdCwgSW5wdXRGcmFtZT4gbVBlbmRpbmdJbnB1dEZyYW1lczsKKworICAgIC8vIEZ1bmN0aW9uIHBvaW50ZXIgb2YgbGlieXV2IHJvdyBjb3B5LgorICAgIHZvaWQgKCptRm5Db3B5Um93KShjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IHdpZHRoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfSEVJQ19DT01QT1NJVEVfU1RSRUFNX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWJlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJIZWljRW5jb2RlckluZm9NYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxyZWdleD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZ19tYWluLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisKKyNpbmNsdWRlICJIZWljRW5jb2RlckluZm9NYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6SGVpY0VuY29kZXJJbmZvTWFuYWdlcigpIDoKKyAgICAgICAgbUlzSW5pdGVkKGZhbHNlKSwKKyAgICAgICAgbU1pblNpemVIZWljKDAsIDApLAorICAgICAgICBtTWF4U2l6ZUhlaWMoSU5UMzJfTUFYLCBJTlQzMl9NQVgpLAorICAgICAgICBtSGFzSEVWQyhmYWxzZSksCisgICAgICAgIG1IYXNIRUlDKGZhbHNlKSwKKyAgICAgICAgbURpc2FibGVHcmlkKGZhbHNlKSB7CisgICAgaWYgKGluaXRpYWxpemUoKSA9PSBPSykgeworICAgICAgICBtSXNJbml0ZWQgPSB0cnVlOworICAgIH0KK30KKworSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6fkhlaWNFbmNvZGVySW5mb01hbmFnZXIoKSB7Cit9CisKK2Jvb2wgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6aXNTaXplU3VwcG9ydGVkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBib29sKiB1c2VIZWljLAorICAgICAgICBib29sKiB1c2VHcmlkLCBpbnQ2NF90KiBzdGFsbCkgY29uc3QgeworICAgIGlmICh1c2VIZWljID09IG51bGxwdHIgfHwgdXNlR3JpZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBwYXJhbWV0ZXJzOiB1c2VIZWljICVwLCB1c2VHcmlkICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHVzZUhlaWMsIHVzZUdyaWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghbUlzSW5pdGVkKSByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIGNob29zZUhlaWMgPSBmYWxzZSwgZW5hYmxlR3JpZCA9IHRydWU7CisgICAgaWYgKG1IYXNIRUlDICYmIHdpZHRoID49IG1NaW5TaXplSGVpYy5maXJzdCAmJgorICAgICAgICAgICAgaGVpZ2h0ID49IG1NaW5TaXplSGVpYy5zZWNvbmQgJiYgd2lkdGggPD0gbU1heFNpemVIZWljLmZpcnN0ICYmCisgICAgICAgICAgICBoZWlnaHQgPD0gbU1heFNpemVIZWljLnNlY29uZCkgeworICAgICAgICBjaG9vc2VIZWljID0gdHJ1ZTsKKyAgICAgICAgZW5hYmxlR3JpZCA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAobUhhc0hFVkMpIHsKKyAgICAgICAgYm9vbCBmdWxsU2l6ZVN1cHBvcnRlZEJ5SGV2YyA9ICh3aWR0aCA+PSBtTWluU2l6ZUhldmMuZmlyc3QgJiYKKyAgICAgICAgICAgICAgICBoZWlnaHQgPj0gbU1pblNpemVIZXZjLnNlY29uZCAmJgorICAgICAgICAgICAgICAgIHdpZHRoIDw9IG1NYXhTaXplSGV2Yy5maXJzdCAmJgorICAgICAgICAgICAgICAgIGhlaWdodCA8PSBtTWF4U2l6ZUhldmMuc2Vjb25kKTsKKyAgICAgICAgaWYgKGZ1bGxTaXplU3VwcG9ydGVkQnlIZXZjICYmIChtRGlzYWJsZUdyaWQgfHwKKyAgICAgICAgICAgICAgICAod2lkdGggPD0gMTkyMCAmJiBoZWlnaHQgPD0gMTA4MCkpKSB7CisgICAgICAgICAgICBlbmFibGVHcmlkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBObyBlbmNvZGVyIGF2YWlsYWJsZSBmb3IgdGhlIHJlcXVlc3RlZCBzaXplLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0YWxsICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRmluZCBwcmVmZXJyZWQgZW5jb2RlciB3aGljaCBhZHZlcnRpc2UKKyAgICAgICAgLy8gIm1lYXN1cmVkLWZyYW1lLXJhdGUtV0lEVEh4SEVJR0hULXJhbmdlIiBrZXkuCisgICAgICAgIGNvbnN0IEZyYW1lUmF0ZU1hcHMmIG1hcHMgPQorICAgICAgICAgICAgICAgIChjaG9vc2VIZWljICYmIG1IZWljRnJhbWVSYXRlTWFwcy5zaXplKCkgPiAwKSA/CisgICAgICAgICAgICAgICAgbUhlaWNGcmFtZVJhdGVNYXBzIDogbUhldmNGcmFtZVJhdGVNYXBzOworICAgICAgICBjb25zdCBhdXRvJiBjbG9zZXN0U2l6ZSA9IGZpbmRDbG9zZXN0U2l6ZShtYXBzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKGNsb3Nlc3RTaXplID09IG1hcHMuZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSAibWVhc3VyZWQtZnJhbWUtcmF0ZS1XSURUSHhIRUlHSFQtcmFuZ2UiIGtleSBpcyBvcHRpb25hbC4KKyAgICAgICAgICAgIC8vIEhhcmRjb2RlIHRvIHNvbWUgZGVmYXVsdCB2YWx1ZSAoMy4zM21zICogdGlsZSBjb3VudCkgYmFzZWQgb24gcmVzb2x1dGlvbi4KKyAgICAgICAgICAgICpzdGFsbCA9IDMzMzMzMzNMTCAqIHdpZHRoICogaGVpZ2h0IC8gKGtHcmlkV2lkdGggKiBrR3JpZEhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlcml2ZSBzdGFsbCBkdXJhdGlvbnMgYmFzZWQgb24gYXZlcmFnZSBmcHMgb2YgdGhlIGNsb3Nlc3Qgc2l6ZS4KKyAgICAgICAgY29uc3RleHByIGludDY0X3QgTlNFQ19QRVJfU0VDID0gMTAwMDAwMDAwMExMOworICAgICAgICBpbnQzMl90IGF2Z0ZwcyA9IChjbG9zZXN0U2l6ZS0+c2Vjb25kLmZpcnN0ICsgY2xvc2VzdFNpemUtPnNlY29uZC5zZWNvbmQpLzI7CisgICAgICAgIGZsb2F0IHJhdGlvID0gMS4wZiAqIHdpZHRoICogaGVpZ2h0IC8KKyAgICAgICAgICAgICAgICAoY2xvc2VzdFNpemUtPmZpcnN0LmZpcnN0ICogY2xvc2VzdFNpemUtPmZpcnN0LnNlY29uZCk7CisgICAgICAgICpzdGFsbCA9IHJhdGlvICogTlNFQ19QRVJfU0VDIC8gYXZnRnBzOworICAgIH0KKworICAgICp1c2VIZWljID0gY2hvb3NlSGVpYzsKKyAgICAqdXNlR3JpZCA9IGVuYWJsZUdyaWQ7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmluaXRpYWxpemUoKSB7CisgICAgbURpc2FibGVHcmlkID0gcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5oZWljLmRpc2FibGVfZ3JpZCIsIGZhbHNlKTsKKyAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGNvZGVjc0xpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoY29kZWNzTGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIE5vIG1lZGlhIGNvZGVjIGF2YWlsYWJsZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBoZWljRGV0YWlscyA9IGdldENvZGVjRGV0YWlscyhjb2RlY3NMaXN0LCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworICAgIHNwPEFNZXNzYWdlPiBoZXZjRGV0YWlscyA9IGdldENvZGVjRGV0YWlscyhjb2RlY3NMaXN0LCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKworICAgIGlmIChoZXZjRGV0YWlscyA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChoZWljRGV0YWlscyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IERldmljZSBtdXN0IHN1cHBvcnQgSEVWQyBjb2RlYyBpZiBIRUlDIGNvZGVjIGlzIGF2YWlsYWJsZSEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gQ2hlY2sgQ1EgbW9kZSBmb3IgSEVWQyBjb2RlYworICAgIHsKKyAgICAgICAgQVN0cmluZyBiaXRyYXRlTW9kZXM7CisgICAgICAgIGF1dG8gaGFzSXRlbSA9IGhldmNEZXRhaWxzLT5maW5kU3RyaW5nKCJmZWF0dXJlLWJpdHJhdGUtbW9kZXMiLCAmYml0cmF0ZU1vZGVzKTsKKyAgICAgICAgaWYgKCFoYXNJdGVtKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBxdWVyeSBiaXRyYXRlIG1vZGVzIGZvciBIRVZDIGNvZGVjIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzOiBIRVZDIGNvZGVjJ3MgZmVhdHVyZS1iaXRyYXRlLW1vZGVzIHZhbHVlIGlzICVkLCAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoYXNJdGVtLCBiaXRyYXRlTW9kZXMuY19zdHIoKSk7CisgICAgICAgIHN0ZDo6cmVnZXggcGF0dGVybigiKF58LClDUSgkfCwpIiwgc3RkOjpyZWdleF9jb25zdGFudHM6OmljYXNlKTsKKyAgICAgICAgaWYgKCFzdGQ6OnJlZ2V4X3NlYXJjaChiaXRyYXRlTW9kZXMuY19zdHIoKSwgcGF0dGVybikpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEhFSUMgc2l6ZSByYW5nZQorICAgIGlmIChoZWljRGV0YWlscyAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8gcmVzID0gZ2V0Q29kZWNTaXplUmFuZ2UoTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLAorICAgICAgICAgICAgICAgIGhlaWNEZXRhaWxzLCAmbU1pblNpemVIZWljLCAmbU1heFNpemVIZWljLCAmbUhlaWNGcmFtZVJhdGVNYXBzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IEhFSUMgY29kZWMgc2l6ZSByYW5nZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1IYXNIRUlDID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBIRVZDIHNpemUgcmFuZ2UKKyAgICB7CisgICAgICAgIGF1dG8gcmVzID0gZ2V0Q29kZWNTaXplUmFuZ2UoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywKKyAgICAgICAgICAgICAgICBoZXZjRGV0YWlscywgJm1NaW5TaXplSGV2YywgJm1NYXhTaXplSGV2YywgJm1IZXZjRnJhbWVSYXRlTWFwcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBIRVZDIGNvZGVjIHNpemUgcmFuZ2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIG1IYXNIRVZDID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmdldEZyYW1lUmF0ZU1hcHMoc3A8QU1lc3NhZ2U+IGRldGFpbHMsIEZyYW1lUmF0ZU1hcHMqIG1hcHMpIHsKKyAgICBpZiAoZGV0YWlscyA9PSBudWxscHRyIHx8IG1hcHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQ6IGRldGFpbHM6ICVwLCBtYXBzOiAlcCIsIF9fRlVOQ1RJT05fXywgZGV0YWlscy5nZXQoKSwgbWFwcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXRhaWxzLT5jb3VudEVudHJpZXMoKTsgaSsrKSB7CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIqIGVudHJ5TmFtZSA9IGRldGFpbHMtPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gQU1lc3NhZ2U6OmtUeXBlU3RyaW5nKSBjb250aW51ZTsKKyAgICAgICAgc3RkOjpyZWdleCBmcmFtZVJhdGVOYW1lUGF0dGVybigibWVhc3VyZWQtZnJhbWUtcmF0ZS0oWzAtOV0rKVsqeF0oWzAtOV0rKS1yYW5nZSIsCisgICAgICAgICAgICAgICAgc3RkOjpyZWdleF9jb25zdGFudHM6OmljYXNlKTsKKyAgICAgICAgc3RkOjpjbWF0Y2ggc2l6ZU1hdGNoOworICAgICAgICBpZiAoc3RkOjpyZWdleF9tYXRjaChlbnRyeU5hbWUsIHNpemVNYXRjaCwgZnJhbWVSYXRlTmFtZVBhdHRlcm4pICYmCisgICAgICAgICAgICAgICAgc2l6ZU1hdGNoLnNpemUoKSA9PSAzKSB7CisgICAgICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbSA9IGRldGFpbHMtPmdldEVudHJ5QXQoaSk7CisgICAgICAgICAgICBBU3RyaW5nIGZwc1JhbmdlU3RyOworICAgICAgICAgICAgaWYgKGl0ZW0uZmluZCgmZnBzUmFuZ2VTdHIpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyIsIGVudHJ5TmFtZSwgZnBzUmFuZ2VTdHIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc3RkOjpyZWdleCBmcmFtZVJhdGVQYXR0ZXJuKCIoWzAtOV0rKS0oWzAtOV0rKSIpOworICAgICAgICAgICAgICAgIHN0ZDo6Y21hdGNoIGZwc01hdGNoOworICAgICAgICAgICAgICAgIGlmIChzdGQ6OnJlZ2V4X21hdGNoKGZwc1JhbmdlU3RyLmNfc3RyKCksIGZwc01hdGNoLCBmcmFtZVJhdGVQYXR0ZXJuKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZnBzTWF0Y2guc2l6ZSgpID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwcy0+ZW1wbGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihzdG9pKHNpemVNYXRjaFsxXSksIHN0b2koc2l6ZU1hdGNoWzJdKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoc3RvaShmcHNNYXRjaFsxXSksIHN0b2koZnBzTWF0Y2hbMl0pKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRDb2RlY1NpemVSYW5nZSgKKyAgICAgICAgY29uc3QgY2hhciogY29kZWNOYW1lLAorICAgICAgICBzcDxBTWVzc2FnZT4gZGV0YWlscywKKyAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+KiBtaW5TaXplLAorICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4qIG1heFNpemUsCisgICAgICAgIEZyYW1lUmF0ZU1hcHMqIGZyYW1lUmF0ZU1hcHMpIHsKKyAgICBpZiAoY29kZWNOYW1lID09IG51bGxwdHIgfHwgbWluU2l6ZSA9PSBudWxscHRyIHx8IG1heFNpemUgPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgZGV0YWlscyA9PSBudWxscHRyIHx8IGZyYW1lUmF0ZU1hcHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFTdHJpbmcgc2l6ZVJhbmdlOworICAgIGF1dG8gaGFzSXRlbSA9IGRldGFpbHMtPmZpbmRTdHJpbmcoInNpemUtcmFuZ2UiLCAmc2l6ZVJhbmdlKTsKKyAgICBpZiAoIWhhc0l0ZW0pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcXVlcnkgc2l6ZSByYW5nZSBmb3IgY29kZWMgJXMiLCBfX0ZVTkNUSU9OX18sIGNvZGVjTmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgY29kZWMncyBzaXplIHJhbmdlIGlzICVzIiwgX19GVU5DVElPTl9fLCBjb2RlY05hbWUsIHNpemVSYW5nZS5jX3N0cigpKTsKKyAgICBzdGQ6OnJlZ2V4IHBhdHRlcm4oIihbMC05XSspWyp4XShbMC05XSspLShbMC05XSspWyp4XShbMC05XSspIik7CisgICAgc3RkOjpjbWF0Y2ggbWF0Y2g7CisgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goc2l6ZVJhbmdlLmNfc3RyKCksIG1hdGNoLCBwYXR0ZXJuKSkgeworICAgICAgICBpZiAobWF0Y2guc2l6ZSgpID09IDUpIHsKKyAgICAgICAgICAgIG1pblNpemUtPmZpcnN0ID0gc3RvaShtYXRjaFsxXSk7CisgICAgICAgICAgICBtaW5TaXplLT5zZWNvbmQgPSBzdG9pKG1hdGNoWzJdKTsKKyAgICAgICAgICAgIG1heFNpemUtPmZpcnN0ID0gc3RvaShtYXRjaFszXSk7CisgICAgICAgICAgICBtYXhTaXplLT5zZWNvbmQgPSBzdG9pKG1hdGNoWzRdKTsKKyAgICAgICAgICAgIGlmIChtaW5TaXplLT5maXJzdCA+IG1heFNpemUtPmZpcnN0IHx8CisgICAgICAgICAgICAgICAgICAgIG1pblNpemUtPnNlY29uZCA+IG1heFNpemUtPnNlY29uZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlcyBjb2RlIHNpemUgcmFuZ2U6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY29kZWNOYW1lLCBzaXplUmFuZ2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IGdldEZyYW1lUmF0ZU1hcHMoZGV0YWlscywgZnJhbWVSYXRlTWFwcyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6RnJhbWVSYXRlTWFwczo6Y29uc3RfaXRlcmF0b3IgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6ZmluZENsb3Nlc3RTaXplKAorICAgICAgICBjb25zdCBGcmFtZVJhdGVNYXBzJiBtYXBzLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgY29uc3QgeworICAgIGludDMyX3QgbWluRGlmZiA9IElOVDMyX01BWDsKKyAgICBGcmFtZVJhdGVNYXBzOjpjb25zdF9pdGVyYXRvciBjbG9zZXN0SXRlciA9IG1hcHMuYmVnaW4oKTsKKyAgICBmb3IgKGF1dG8gaXRlciA9IG1hcHMuYmVnaW4oKTsgaXRlciAhPSBtYXBzLmVuZCgpOyBpdGVyKyspIHsKKyAgICAgICAgLy8gVXNlIGFyZWEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzaXplcyB0byBhcHByb3hpbWF0ZSBzaXplCisgICAgICAgIC8vIGRpZmZlcmVuY2UuCisgICAgICAgIGludDMyX3QgZGlmZiA9IGFicyhpdGVyLT5maXJzdC5maXJzdCAqIGl0ZXItPmZpcnN0LnNlY29uZCAtIHdpZHRoICogaGVpZ2h0KTsKKyAgICAgICAgaWYgKGRpZmYgPCBtaW5EaWZmKSB7CisgICAgICAgICAgICBjbG9zZXN0SXRlciA9IGl0ZXI7CisgICAgICAgICAgICBtaW5EaWZmID0gZGlmZjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xvc2VzdEl0ZXI7Cit9CisKK3NwPEFNZXNzYWdlPiBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRDb2RlY0RldGFpbHMoCisgICAgICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gY29kZWNzTGlzdCwgY29uc3QgY2hhciogbmFtZSkgeworICAgIHNzaXplX3QgaWR4ID0gY29kZWNzTGlzdC0+ZmluZENvZGVjQnlUeXBlKG5hbWUsIHRydWUgLyplbmNvZGVyKi8pOworICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gY29kZWNzTGlzdC0+Z2V0Q29kZWNJbmZvKGlkeCk7CisgICAgaWYgKGluZm8gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgY29kZWMgaW5mbyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9CisgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobmFtZSk7CisgICAgaWYgKGNhcHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgY2FwYWJpbGl0aWVzIGZvciBjb2RlYyAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCBzcDxBTWVzc2FnZT4gZGV0YWlscyA9IGNhcHMtPmdldERldGFpbHMoKTsKKyAgICBpZiAoZGV0YWlscyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBkZXRhaWxzIGZvciBjb2RlYyAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBkZXRhaWxzOworfQorfSAvL25hbWVzcGFjZSBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMGI5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0hFSUNFTkNPREVSX0lORk9fTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfSEVJQ0VOQ09ERVJfSU5GT19NQU5BR0VSX0gKKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgSGVpY0VuY29kZXJJbmZvTWFuYWdlciB7CitwdWJsaWM6CisgICAgc3RhdGljIEhlaWNFbmNvZGVySW5mb01hbmFnZXImIGdldEluc3RhbmNlKCkgeworICAgICAgICBzdGF0aWMgSGVpY0VuY29kZXJJbmZvTWFuYWdlciBpbnN0YW5jZTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgYm9vbCogdXNlSGVpYywgYm9vbCogdXNlR3JpZCwgaW50NjRfdCogc3RhbGwpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0dyaWRXaWR0aCA9IDUxMjsKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrR3JpZEhlaWdodCA9IDUxMjsKK3ByaXZhdGU6CisgICAgc3RydWN0IFNpemVQYWlySGFzaCB7CisgICAgICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yICgpIChjb25zdCBzdGQ6OnBhaXI8aW50MzJfdCxpbnQzMl90PiAmcCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHAuZmlyc3QgKiAzMSArIHAuc2Vjb25kOworICAgICAgICB9CisgICAgfTsKKworICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiwKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiwgU2l6ZVBhaXJIYXNoPiBGcmFtZVJhdGVNYXBzOworCisgICAgSGVpY0VuY29kZXJJbmZvTWFuYWdlcigpOworICAgIHZpcnR1YWwgfkhlaWNFbmNvZGVySW5mb01hbmFnZXIoKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemUoKTsKKyAgICBzdGF0dXNfdCBnZXRGcmFtZVJhdGVNYXBzKHNwPEFNZXNzYWdlPiBkZXRhaWxzLCBGcmFtZVJhdGVNYXBzKiBtYXBzKTsKKyAgICBzdGF0dXNfdCBnZXRDb2RlY1NpemVSYW5nZShjb25zdCBjaGFyKiBjb2RlY05hbWUsIHNwPEFNZXNzYWdlPiBkZXRhaWxzLAorICAgICAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+KiBtaW5TaXplLCBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4qIG1heFNpemUsCisgICAgICAgICAgICBGcmFtZVJhdGVNYXBzKiBmcmFtZVJhdGVNYXBzKTsKKyAgICBGcmFtZVJhdGVNYXBzOjpjb25zdF9pdGVyYXRvciBmaW5kQ2xvc2VzdFNpemUoY29uc3QgRnJhbWVSYXRlTWFwcyYgbWFwcywKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSBjb25zdDsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0Q29kZWNEZXRhaWxzKHNwPElNZWRpYUNvZGVjTGlzdD4gY29kZWNzTGlzdCwgY29uc3QgY2hhciogbmFtZSk7CisKKyAgICBib29sIG1Jc0luaXRlZDsKKyAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gbU1pblNpemVIZWljLCBtTWF4U2l6ZUhlaWM7CisgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+IG1NaW5TaXplSGV2YywgbU1heFNpemVIZXZjOworICAgIGJvb2wgbUhhc0hFVkMsIG1IYXNIRUlDOworICAgIEZyYW1lUmF0ZU1hcHMgbUhlaWNGcmFtZVJhdGVNYXBzLCBtSGV2Y0ZyYW1lUmF0ZU1hcHM7CisgICAgYm9vbCBtRGlzYWJsZUdyaWQ7CisKK307CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VSVkVSU19DQU1FUkFfSEVJQ0VOQ09ERVJfSU5GT19NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCmluZGV4IGNlMDA2YTcuLjc4ZmViM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcApAQCAtMzIsMTQgKzMyLDExIEBACiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKIAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEyOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CkBAIC01NywxMyArNTQsMTMgQEAKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKICAgICAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyhyZW1vdGVDYWxsYmFjayksCiAgICAgICAgIG1EZXZpY2VWZXJzaW9uKGNhbWVyYVNlcnZpY2UtPmdldERldmljZVZlcnNpb24oVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0cikpLAorICAgICAgICBtRGV2aWNlKG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkKSksCiAgICAgICAgIG1EZXZpY2VBY3RpdmUoZmFsc2UpLCBtQXBpMUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKICAgICBBTE9HSSgiQ2FtZXJhICVzOiBPcGVuZWQuIENsaWVudDogJXMgKFBJRCAlZCwgVUlEICVkKSIsIGNhbWVyYUlkLnN0cmluZygpLAogICAgICAgICAgICAgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksIGNsaWVudFBpZCwgY2xpZW50VWlkKTsKIAogICAgIG1Jbml0aWFsQ2xpZW50UGlkID0gY2xpZW50UGlkOwotICAgIG1EZXZpY2UgPSBuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlID09IDAsICJEZXZpY2Ugc2hvdWxkIG5ldmVyIGJlIE5VTEwgaGVyZS4iKTsKIH0KIApAQCAtNzEsNyArNjgsNyBAQAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpjaGVja1BpZChjb25zdCBjaGFyKiBjaGVja0xvY2F0aW9uKQogICAgICAgICBjb25zdCB7CiAKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgPT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHJldHVybiBOT19FUlJPUjsKIAogICAgIEFMT0dFKCIlczogYXR0ZW1wdCB0byB1c2UgYSBsb2NrZWQgY2FtZXJhIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyIKQEAgLTE4Niw3ICsxODMsNyBAQAogCiAgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgLy8gQWxsb3cgYm90aCBjbGllbnQgYW5kIHRoZSBtZWRpYSBzZXJ2ZXIgdG8gZGlzY29ubmVjdCBhdCBhbGwgdGltZXMKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQgJiYKICAgICAgICAgY2FsbGluZ1BpZCAhPSBUQ2xpZW50QmFzZTo6bVNlcnZpY2VQaWQpIHJldHVybiByZXM7CiAKQEAgLTIwNiw4ICsyMDMsNiBAQAogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybjsKICAgICBtRGV2aWNlLT5kaXNjb25uZWN0KCk7CiAKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci0KICAgICBBTE9HVigiQ2FtZXJhICVzOiBEZXRhY2ggY29tcGxldGUiLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKIH0KIApAQCAtMjE5LDE4ICsyMTQsMTggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKICAgICBpZiAoVENsaWVudEJhc2U6Om1DbGllbnRQaWQgIT0gMCAmJgotICAgICAgICBnZXRDYWxsaW5nUGlkKCkgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHsKKyAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCkgewogCiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBDb25uZWN0aW9uIGF0dGVtcHQgZnJvbSBwaWQgJWQ7ICIKICAgICAgICAgICAgICAgICAiY3VycmVudCBsb2NrZWQgdG8gcGlkICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogCiAgICAgVENsaWVudEJhc2U6Om1SZW1vdGVDYWxsYmFjayA9IGNsaWVudDsKICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzID0gY2xpZW50OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCBlNzRmYmRmLi42NjkzODQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtMTMwLDcgKzEzMCwxMCBAQAogICAgIC8qKiBDYW1lcmFEZXZpY2VCYXNlIGluc3RhbmNlIHdyYXBwaW5nIEhBTDMrIGVudHJ5ICovCiAKICAgICBjb25zdCBpbnQgbURldmljZVZlcnNpb247Ci0gICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CisKKyAgICAvLyBTZXQgdG8gY29uc3QgdG8gYXZvaWQgbURldmljZSBiZWluZyB1cGRhdGVkICh1cGRhdGUgb2Ygc3A8PiBpcyByYWN5KSBkdXJpbmcKKyAgICAvLyBkdW1wRGV2aWNlICh3aGljaCBpcyBpbXBvcnRhbnQgdG8gYmUgbG9jayBmcmVlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSkKKyAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAppbmRleCAwY2U0MzE4Li5kNjc4OWE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcApAQCAtMjAsMjcgKzIwLDQyIEBACiAKICNpbmNsdWRlICJDYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZS5oPgorCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZnV0dXJlPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oPgogI2luY2x1ZGUgPGhpZGwvU2VydmljZU1hbmFnZW1lbnQuaD4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSAiYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDsKK3VzaW5nIHN0ZDo6bGl0ZXJhbHM6OmNocm9ub19saXRlcmFsczo6b3BlcmF0b3IiInM7CiAKIG5hbWVzcGFjZSB7CiAvLyBIYXJkY29kZWQgbmFtZSBmb3IgdGhlIHBhc3N0aHJvdWdoIEhBTCBpbXBsZW1lbnRhdGlvbiwgc2luY2UgaXQgY2FuJ3QgYmUgZGlzY292ZXJlZCB2aWEgdGhlCiAvLyBzZXJ2aWNlIG1hbmFnZXIKIGNvbnN0IHN0ZDo6c3RyaW5nIGtMZWdhY3lQcm92aWRlck5hbWUoImxlZ2FjeS8wIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrRXh0ZXJuYWxQcm92aWRlck5hbWUoImV4dGVybmFsLzAiKTsKLQorY29uc3QgYm9vbCBrRW5hYmxlTGF6eUhhbChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uY2FtZXJhLmVuYWJsZUxhenlIYWwiLCBmYWxzZSkpOwogfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKK2NvbnN0IGZsb2F0IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6a0RlcHRoQVJUb2xlcmFuY2UgPSAuMWY7CisKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6SGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eQogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eXt9OwogCkBAIC01Niw2ICs3MSw4IEBACiAgICAgfQogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwogICAgIG1TZXJ2aWNlUHJveHkgPSBwcm94eTsKKyAgICBtRGV2aWNlU3RhdGUgPSBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+PigKKyAgICAgICAgcHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlOjpOT1JNQUwpOwogCiAgICAgLy8gUmVnaXN0ZXJpbmcgd2lsbCB0cmlnZ2VyIG5vdGlmaWNhdGlvbnMgZm9yIGFsbCBhbHJlYWR5LWtub3duIHByb3ZpZGVycwogICAgIGJvb2wgc3VjY2VzcyA9IG1TZXJ2aWNlUHJveHktPnJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKQEAgLTcxLDYgKzg4LDggQEAKICAgICBhZGRQcm92aWRlckxvY2tlZChrTGVnYWN5UHJvdmlkZXJOYW1lLCAvKmV4cGVjdGVkKi8gZmFsc2UpOwogICAgIGFkZFByb3ZpZGVyTG9ja2VkKGtFeHRlcm5hbFByb3ZpZGVyTmFtZSwgLypleHBlY3RlZCovIGZhbHNlKTsKIAorICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTc0LDYgKzE5MywxOSBAQAogICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFJbmZvKGluZm8pOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICByZXR1cm4gZGV2aWNlSW5mby0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25maWd1cmF0aW9uLCBzdGF0dXMpOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwpAQCAtMjAzLDI2ICsyMzUsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWJvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgeworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdCB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKLSAgICBib29sIHN1cHBvcnQgPSBmYWxzZTsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewogICAgICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgICAgIGlmIChkZXZpY2VJbmZvICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGF1dG8gcmV0ID0gcHJvdmlkZXItPm1JbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgIFsmc3VwcG9ydF0oYXV0byBzdGF0dXMsIGJvb2wgc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCA9IHN1cHBvcnRlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjaGVja2luZyB0b3JjaCBtb2RlIHN1cHBvcnQgJyVzJzogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLT5tU2V0VG9yY2hNb2RlU3VwcG9ydGVkOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBzdXBwb3J0OworICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBib29sIGVuYWJsZWQpIHsKQEAgLTIzMSw2ICsyNTIsMTUgQEAKICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCisgICAgLy8gUGFzcyB0aGUgY2FtZXJhIElEIHRvIHN0YXJ0IGludGVyZmFjZSBzbyB0aGF0IGl0IHdpbGwgc2F2ZSBpdCB0byB0aGUgbWFwIG9mIElDYW1lcmFQcm92aWRlcnMKKyAgICAvLyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdXNlLgorICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXItPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzYXZlUmVmKERldmljZU1vZGU6OlRPUkNILCBkZXZpY2VJbmZvLT5tSWQsIGludGVyZmFjZSk7CisKICAgICByZXR1cm4gZGV2aWNlSW5mby0+c2V0VG9yY2hNb2RlKGVuYWJsZWQpOwogfQogCkBAIC0yMzgsMzcgKzI2OCw3IEBACiAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiB0YWdDYWNoZSA9IG5ldyBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUoKTsKIAogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7Ci0gICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiB2dHM7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgICAgICByZXQgPSBwcm92aWRlci0+bUludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKLSAgICAgICAgICAgIFsmXShhdXRvIHMsIGNvbnN0IGF1dG8mIHZlbmRvclRhZ1NlY3MpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdnRzID0gdmVuZG9yVGFnU2VjczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlYWQgYWxsIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgaW50byBhIGRlc2NyaXB0b3IKLSAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYzsKLSAgICAgICAgc3RhdHVzX3QgcmVzOwotICAgICAgICBpZiAoKHJlcyA9IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwodnRzLCAvKm91dCovZGVzYykpCi0gICAgICAgICAgICAgICAgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgotICAgICAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgotICAgICAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotCi0gICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVyLT5tUHJvdmlkZXJUYWdpZCwgZGVzYyk7CisgICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVyLT5tUHJvdmlkZXJUYWdpZCwgcHJvdmlkZXItPm1WZW5kb3JUYWdEZXNjcmlwdG9yKTsKICAgICB9CiAKICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OnNldEFzR2xvYmFsVmVuZG9yVGFnQ2FjaGUodGFnQ2FjaGUpOwpAQCAtMjc2LDEwICsyNzYsMzAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworICAgIG1EZXZpY2VTdGF0ZSA9IG5ld1N0YXRlOworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIEFMT0dWKCIlczogTm90aWZ5aW5nICVzIGZvciBuZXcgc3RhdGUgMHglIiBQUkl4NjQsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCBuZXdTdGF0ZSk7CisgICAgICAgIHN0YXR1c190IHNpbmdsZVJlcyA9IHByb3ZpZGVyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICBpZiAoc2luZ2xlUmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBub3RpZnkgcHJvdmlkZXIgJXMgYWJvdXQgZGV2aWNlIHN0YXRlIGNoYW5nZSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXMgPSBzaW5nbGVSZXM7CisgICAgICAgICAgICAvLyBjb250aW51ZSB0byBkbyB0aGUgcmVzdCBvZiB0aGUgcHJvdmlkZXJzIGluc3RlYWQgb2YgcmV0dXJuaW5nIG5vdworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlblNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICBjb25zdCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKSB7CisgICAgICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKSB7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0yODgsMTAgKzMwOCwyMiBAQAogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKIAogICAgIGF1dG8gKmRldmljZUluZm8zID0gc3RhdGljX2Nhc3Q8UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMyo+KGRldmljZUluZm8pOworICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyID0KKyAgICAgICAgICAgIGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBwcm92aWRlcik7CiAKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IGRldmljZUluZm8zLT5tSW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrLCBbJnN0YXR1cywgJnNlc3Npb25dCisgICAgYXV0byBpbnRlcmZhY2UgPSBkZXZpY2VJbmZvMy0+c3RhcnREZXZpY2VJbnRlcmZhY2U8CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXQgPSBpbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2ssIFsmc3RhdHVzLCAmc2Vzc2lvbl0KICAgICAgICAgICAgIChTdGF0dXMgcywgY29uc3Qgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4mIGNhbWVyYVNlc3Npb24pIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewpAQCAtMjk5LDYgKzMzMSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGEgc2Vzc2lvbiBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKQEAgLTMwNyw5ICszNDAsOSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9wZW5TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+ICpzZXNzaW9uKSB7CisgICAgICAgIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gKnNlc3Npb24pIHsKIAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKQEAgLTMxOCwyNCArMzUxLDkxIEBACiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCiAgICAgYXV0byAqZGV2aWNlSW5mbzEgPSBzdGF0aWNfY2FzdDxQcm92aWRlckluZm86OkRldmljZUluZm8xKj4oZGV2aWNlSW5mbyk7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPQorICAgICAgICAgICAgZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKHByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzYXZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQsIHByb3ZpZGVyKTsKIAotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBkZXZpY2VJbmZvMS0+bUludGVyZmFjZS0+b3BlbihjYWxsYmFjayk7CisgICAgYXV0byBpbnRlcmZhY2UgPSBkZXZpY2VJbmZvMS0+c3RhcnREZXZpY2VJbnRlcmZhY2U8CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OkludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+b3BlbihjYWxsYmFjayk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGEgc2Vzc2lvbiBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICpzZXNzaW9uID0gZGV2aWNlSW5mbzEtPm1JbnRlcmZhY2U7CisgICAgICAgICpzZXNzaW9uID0gaW50ZXJmYWNlOwogICAgIH0KICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CiB9CiAKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKSB7CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJTYXZpbmcgY2FtZXJhIHByb3ZpZGVyICVzIGZvciBjYW1lcmEgZGV2aWNlICVzIiwgcHJvdmlkZXItPmRlc2NyaXB0b3IsIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm92aWRlckludGVyZmFjZU1hcExvY2spOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+ICpwcmltYXJ5TWFwLCAqYWx0ZXJuYXRlTWFwOworICAgIGlmICh1c2FnZVR5cGUgPT0gRGV2aWNlTW9kZTo6VE9SQ0gpIHsKKyAgICAgICAgcHJpbWFyeU1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgICAgIGFsdGVybmF0ZU1hcCA9ICZtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW1hcnlNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICAgICAgYWx0ZXJuYXRlTWFwID0gJm1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9CisgICAgYXV0byBpZCA9IGNhbWVyYUlkLmNfc3RyKCk7CisgICAgKCpwcmltYXJ5TWFwKVtpZF0gPSBwcm92aWRlcjsKKyAgICBhdXRvIHNlYXJjaCA9IGFsdGVybmF0ZU1hcC0+ZmluZChpZCk7CisgICAgaWYgKHNlYXJjaCAhPSBhbHRlcm5hdGVNYXAtPmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhIGRldmljZSAlcyBpcyB1c2luZyBib3RoIHRvcmNoIG1vZGUgYW5kIGNhbWVyYSBtb2RlIHNpbXVsdGFuZW91c2x5LiAiCisgICAgICAgICAgICAgICAgIlRoYXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsIF9fRlVOQ1RJT05fXywgaWQpOworICAgIH0KKyAgICBBTE9HVigiJXM6IENhbWVyYSBkZXZpY2UgJXMgY29ubmVjdGVkIiwgX19GVU5DVElPTl9fLCBpZCk7Cit9CisKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpyZW1vdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCkgeworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiUmVtb3ZpbmcgY2FtZXJhIGRldmljZSAlcyIsIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+ICpwcm92aWRlck1hcDsKKyAgICBpZiAodXNhZ2VUeXBlID09IERldmljZU1vZGU6OlRPUkNIKSB7CisgICAgICAgIHByb3ZpZGVyTWFwID0gJm1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm92aWRlck1hcCA9ICZtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrKTsKKyAgICBhdXRvIHNlYXJjaCA9IHByb3ZpZGVyTWFwLT5maW5kKGNhbWVyYUlkLmNfc3RyKCkpOworICAgIGlmIChzZWFyY2ggIT0gcHJvdmlkZXJNYXAtPmVuZCgpKSB7CisgICAgICAgIC8vIERyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGlzIElDYW1lcmFQcm92aWRlci4gVGhpcyBpcyBzYWZlIHRvIGRvIGltbWVkaWF0ZWx5ICh3aXRob3V0IGFuCisgICAgICAgIC8vIGFkZGVkIGRlbGF5KSBiZWNhdXNlIGh3c2VydmljZW1hbmFnZXIgZ3VhcmFudGVlcyB0byBob2xkIHRoZSByZWZlcmVuY2UgZm9yIGF0IGxlYXN0IGZpdmUKKyAgICAgICAgLy8gbW9yZSBzZWNvbmRzLiAgV2UgZGVwZW5kIG9uIHRoaXMgYmVoYXZpb3Igc28gdGhhdCBpZiB0aGUgcHJvdmlkZXIgaXMgdW5yZWZlcmVuY2VkIGFuZAorICAgICAgICAvLyB0aGVuIHJlZmVyZW5jZWQgYWdhaW4gcXVpY2tseSwgd2UgZG8gbm90IGxldCB0aGUgSEFMIGV4aXQgYW5kIHRoZW4gbmVlZCB0byBpbW1lZGlhdGVseQorICAgICAgICAvLyByZXN0YXJ0IGl0LiBBbiBleGFtcGxlIHdoZW4gdGhpcyBjb3VsZCBoYXBwZW4gaXMgc3dpdGNoaW5nIGZyb20gYSBmcm9udC1mYWNpbmcgdG8gYQorICAgICAgICAvLyByZWFyLWZhY2luZyBjYW1lcmEuIElmIHRoZSBIQUwgd2VyZSB0byBleGl0IGR1cmluZyB0aGUgY2FtZXJhIHN3aXRjaCwgdGhlIGNhbWVyYSBjb3VsZAorICAgICAgICAvLyBhcHBlYXIgamFua3kgdG8gdGhlIHVzZXIuCisgICAgICAgIHByb3ZpZGVyTWFwLT5lcmFzZShjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogQXNrZWQgdG8gcmVtb3ZlIHJlZmVyZW5jZSBmb3IgY2FtZXJhICVzLCBidXQgbm8gcmVmZXJlbmNlIHRvIGl0IHdhcyBmb3VuZC4gVGhpcyAiCisgICAgICAgICAgICAgICAgImNvdWxkIG1lYW4gcmVtb3ZlUmVmIHdhcyBjYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGNhbWVyYSBJRC4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgfQorfQogCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b25SZWdpc3RyYXRpb24oCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgLypmcU5hbWUqLywKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBuYW1lLAogICAgICAgICBib29sIC8qcHJlZXhpc3RpbmcqLykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBwcm92aWRlckxvY2sobVByb3ZpZGVyTGlmZWN5Y2xlTG9jayk7CiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0zNDcsNiArNDQ3LDggQEAKICAgICAgICAgbGlzdGVuZXItPm9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCk7CiAgICAgfQogCisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCiAgICAgcmV0dXJuIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4oKTsKIH0KIApAQCAtMzkyLDM1ICs0OTQsNTk3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcykgewotICAgIGJvb2wgaXNMb2dpY2FsQ2FtID0gZmFsc2U7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlDYXA7Cit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6cXVlcnlQaHlzaWNhbENhbWVyYUlkcygpIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeUNhcDsKIAotICAgIGVudHJ5Q2FwID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBlbnRyeUNhcCA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNhcC5jb3VudDsgKytpKSB7CiAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5Q2FwLmRhdGEudThbaV07CiAgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSB7Ci0gICAgICAgICAgICBpc0xvZ2ljYWxDYW0gPSB0cnVlOworICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoIWlzTG9naWNhbENhbSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeUlkcyA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnlJZHMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoCisgICAgICAgICAgICBBTkRST0lEX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyk7CiAgICAgY29uc3QgdWludDhfdCogaWRzID0gZW50cnlJZHMuZGF0YS51ODsKICAgICBzaXplX3Qgc3RhcnQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlJZHMuY291bnQ7ICsraSkgewogICAgICAgICBpZiAoaWRzW2ldID09ICdcMCcpIHsKICAgICAgICAgICAgIGlmIChzdGFydCAhPSBpKSB7Ci0gICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMtPnB1c2hfYmFjaygoY29uc3QgY2hhciopaWRzK3N0YXJ0KTsKKyAgICAgICAgICAgICAgICBtUGh5c2ljYWxJZHMucHVzaF9iYWNrKChjb25zdCBjaGFyKilpZHMrc3RhcnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RhcnQgPSBpKzE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjppc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoKSB7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnlDYXA7CisgICAgZW50cnlDYXAgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGlmIChlbnRyeUNhcC5jb3VudCAhPSAxKSB7CisgICAgICAgIC8vIERvIE5PVCBoaWRlIHRoaXMgY2FtZXJhIGRldmljZSBpZiB0aGUgY2FwYWJpbGl0aWVzIHNwZWNpZnkgYW55dGhpbmcgbW9yZQorICAgICAgICAvLyB0aGFuIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NFQ1VSRV9JTUFHRV9EQVRBLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBlbnRyeUNhcC5kYXRhLnU4WzBdID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NFQ1VSRV9JTUFHRV9EQVRBOworfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0U3VwcG9ydGVkU2l6ZXMoCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLCBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpzaXplcy8qb3V0Ki8pIHsKKyAgICBpZiAoc2l6ZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBzY2FsZXJEaW1zID0gY2guZmluZCh0YWcpOworICAgIGlmIChzY2FsZXJEaW1zLmNvdW50ID4gMCkgeworICAgICAgICAvLyBTY2FsZXIgZW50cnkgY29udGFpbnMgNCBlbGVtZW50cyAoZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCB0eXBlKQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNjYWxlckRpbXMuY291bnQ7IGkgKz0gNCkgeworICAgICAgICAgICAgaWYgKChzY2FsZXJEaW1zLmRhdGEuaTMyW2ldID09IGZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHNjYWxlckRpbXMuZGF0YS5pMzJbaSszXSA9PQorICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpKSB7CisgICAgICAgICAgICAgICAgc2l6ZXMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoc2NhbGVyRGltcy5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlckRpbXMuZGF0YS5pMzJbaSsyXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0U3VwcG9ydGVkRHVyYXRpb25zKAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHVpbnQzMl90IHRhZywgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc2l6ZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkdXJhdGlvbnMvKm91dCovKSB7CisgICAgaWYgKGR1cmF0aW9ucyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGF2YWlsYWJsZUR1cmF0aW9ucyA9IGNoLmZpbmQodGFnKTsKKyAgICBpZiAoYXZhaWxhYmxlRHVyYXRpb25zLmNvdW50ID4gMCkgeworICAgICAgICAvLyBEdXJhdGlvbiBlbnRyeSBjb250YWlucyA0IGVsZW1lbnRzIChmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGR1cmF0aW9uKQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUR1cmF0aW9ucy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNpemUgOiBzaXplcykgeworICAgICAgICAgICAgICAgIGludDY0X3Qgd2lkdGggPSBzdGQ6OmdldDwwPihzaXplKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGhlaWdodCA9IHN0ZDo6Z2V0PDE+KHNpemUpOworICAgICAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlRHVyYXRpb25zLmRhdGEuaTY0W2ldID09IGZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEdXJhdGlvbnMuZGF0YS5pNjRbaSsxXSA9PSB3aWR0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEdXJhdGlvbnMuZGF0YS5pNjRbaSsyXSA9PSBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9ucy0+cHVzaF9iYWNrKGF2YWlsYWJsZUR1cmF0aW9ucy5kYXRhLmk2NFtpKzNdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9Cit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgZGVwdGhEdXJhdGlvbnMsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBibG9iRHVyYXRpb25zLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqZHluYW1pY0RlcHRoRHVyYXRpb25zIC8qb3V0Ki8pIHsKKyAgICBpZiAoKGR5bmFtaWNEZXB0aER1cmF0aW9ucyA9PSBudWxscHRyKSB8fCAoZGVwdGhEdXJhdGlvbnMuc2l6ZSgpICE9IGJsb2JEdXJhdGlvbnMuc2l6ZSgpKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyBkaXJlY3Qgd2F5IHRvIGNhbGN1bGF0ZSB0aGUgZHluYW1pYyBkZXB0aCBzdHJlYW0gZHVyYXRpb24uCisgICAgLy8gUHJvY2Vzc2luZyB0aW1lIG9uIGNhbWVyYSBzZXJ2aWNlIHNpZGUgY2FuIHZhcnkgZ3JlYXRseSBkZXBlbmRpbmcgb24gbXVsdGlwbGUKKyAgICAvLyB2YXJpYWJsZXMgd2hpY2ggYXJlIG5vdCB1bmRlciBvdXIgY29udHJvbC4gTWFrZSBhIGd1ZXNzdGltYXRlIGJ5IHRha2luZyB0aGUgbWF4aW11bQorICAgIC8vIGNvcnJlc3BvbmRpbmcgZHVyYXRpb24gdmFsdWUgZnJvbSBkZXB0aCBhbmQgYmxvYi4KKyAgICBhdXRvIGRlcHRoRHVyYXRpb24gPSBkZXB0aER1cmF0aW9ucy5iZWdpbigpOworICAgIGF1dG8gYmxvYkR1cmF0aW9uID0gYmxvYkR1cmF0aW9ucy5iZWdpbigpOworICAgIGR5bmFtaWNEZXB0aER1cmF0aW9ucy0+cmVzZXJ2ZShkZXB0aER1cmF0aW9ucy5zaXplKCkpOworICAgIHdoaWxlICgoZGVwdGhEdXJhdGlvbiAhPSBkZXB0aER1cmF0aW9ucy5lbmQoKSkgJiYgKGJsb2JEdXJhdGlvbiAhPSBibG9iRHVyYXRpb25zLmVuZCgpKSkgeworICAgICAgICBkeW5hbWljRGVwdGhEdXJhdGlvbnMtPnB1c2hfYmFjayhzdGQ6Om1heCgqZGVwdGhEdXJhdGlvbiwgKmJsb2JEdXJhdGlvbikpOworICAgICAgICBkZXB0aER1cmF0aW9uKys7IGJsb2JEdXJhdGlvbisrOworICAgIH0KK30KKwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIGJsb2JTaXplcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBkZXB0aFNpemVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKmR5bmFtaWNEZXB0aFNpemVzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqaW50ZXJuYWxEZXB0aFNpemVzIC8qb3V0Ki8pIHsKKyAgICBpZiAoZHluYW1pY0RlcHRoU2l6ZXMgPT0gbnVsbHB0ciB8fCBpbnRlcm5hbERlcHRoU2l6ZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlIGR5bmFtaWMgZGVwdGggc3BlYy4gZG9lcyBub3QgbWVudGlvbiBob3cgY2xvc2UgdGhlIEFSIHJhdGlvIHNob3VsZCBiZS4KKyAgICAvLyBUcnkgdXNpbmcgc29tZXRoaW5nIGFwcHJvcHJpYXRlLgorICAgIGZsb2F0IEFSVG9sZXJhbmNlID0ga0RlcHRoQVJUb2xlcmFuY2U7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJsb2JTaXplIDogYmxvYlNpemVzKSB7CisgICAgICAgIGZsb2F0IGpwZWdBUiA9IHN0YXRpY19jYXN0PGZsb2F0PiAoc3RkOjpnZXQ8MD4oYmxvYlNpemUpKSAvCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0ZDo6Z2V0PDE+KGJsb2JTaXplKSk7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXB0aFNpemUgOiBkZXB0aFNpemVzKSB7CisgICAgICAgICAgICBpZiAoZGVwdGhTaXplID09IGJsb2JTaXplKSB7CisgICAgICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFNpemVzLT5wdXNoX2JhY2soZGVwdGhTaXplKTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZsb2F0IGRlcHRoQVIgPSBzdGF0aWNfY2FzdDxmbG9hdD4gKHN0ZDo6Z2V0PDA+KGRlcHRoU2l6ZSkpIC8KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0ZDo6Z2V0PDE+KGRlcHRoU2l6ZSkpOworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZhYnMoanBlZ0FSIC0gZGVwdGhBUikgPD0gQVJUb2xlcmFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFNpemVzLT5wdXNoX2JhY2soZGVwdGhTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgIGR5bmFtaWNEZXB0aFNpemVzLT5wdXNoX2JhY2soYmxvYlNpemUpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNEZXB0aFBob3RvTGlicmFyeVByZXNlbnQoKSB7CisgICAgc3RhdGljIGJvb2wgbGlicmFyeVByZXNlbnQgPSBmYWxzZTsKKyAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOworICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm4gbGlicmFyeVByZXNlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQqIGRlcHRoTGliSGFuZGxlID0gZGxvcGVuKGNhbWVyYTM6OmtEZXB0aFBob3RvTGlicmFyeSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBpZiAoZGVwdGhMaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byBwcm9jZXNzRnVuYyA9IGRsc3ltKGRlcHRoTGliSGFuZGxlLCBjYW1lcmEzOjprRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbik7CisgICAgaWYgKHByb2Nlc3NGdW5jICE9IG51bGxwdHIpIHsKKyAgICAgICAgbGlicmFyeVByZXNlbnQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGxpYnJhcnlQcmVzZW50ID0gZmFsc2U7CisgICAgfQorICAgIGRsY2xvc2UoZGVwdGhMaWJIYW5kbGUpOworCisgICAgcmV0dXJuIGxpYnJhcnlQcmVzZW50OworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmFkZER5bmFtaWNEZXB0aFRhZ3MoKSB7CisgICAgdWludDMyX3QgZGVwdGhFeGNsVGFnID0gQU5EUk9JRF9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkU7CisgICAgdWludDMyX3QgZGVwdGhTaXplc1RhZyA9IEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUzsKKyAgICBhdXRvJiBjID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gc3VwcG9ydGVkQmxvYlNpemVzLCBzdXBwb3J0ZWREZXB0aFNpemVzLAorICAgICAgICAgICAgc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMsIGludGVybmFsRGVwdGhTaXplczsKKyAgICBhdXRvIGNoVGFncyA9IGMuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICBpZiAoY2hUYWdzLmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdXBwb3J0ZWQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBpcyBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGJvb2wgaXNEZXB0aEV4Y2x1c2l2ZVByZXNlbnQgPSBzdGQ6OmZpbmQoY2hUYWdzLmRhdGEuaTMyLCBjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQsCisgICAgICAgICAgICBkZXB0aEV4Y2xUYWcpICE9IChjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQpOworICAgIGJvb2wgaXNEZXB0aFNpemVQcmVzZW50ID0gc3RkOjpmaW5kKGNoVGFncy5kYXRhLmkzMiwgY2hUYWdzLmRhdGEuaTMyICsgY2hUYWdzLmNvdW50LAorICAgICAgICAgICAgZGVwdGhTaXplc1RhZykgIT0gKGNoVGFncy5kYXRhLmkzMiArIGNoVGFncy5jb3VudCk7CisgICAgaWYgKCEoaXNEZXB0aEV4Y2x1c2l2ZVByZXNlbnQgJiYgaXNEZXB0aFNpemVQcmVzZW50KSkgeworICAgICAgICAvLyBObyBkZXB0aCBzdXBwb3J0LCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBhdXRvIGRlcHRoRXhjbHVzaXZlRW50cnkgPSBjLmZpbmQoZGVwdGhFeGNsVGFnKTsKKyAgICBpZiAoZGVwdGhFeGNsdXNpdmVFbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgaWYgKGRlcHRoRXhjbHVzaXZlRW50cnkuZGF0YS51OFswXSAhPSBBTkRST0lEX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRV9GQUxTRSkgeworICAgICAgICAgICAgLy8gRGVwdGggc3VwcG9ydCBpcyBleGNsdXNpdmUsIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogQWR2ZXJ0aXNlZCBkZXB0aCBleGNsdXNpdmUgdGFnIGJ1dCB2YWx1ZSBpcyBub3QgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGdldFN1cHBvcnRlZFNpemVzKGMsIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMsIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwKKyAgICAgICAgICAgICZzdXBwb3J0ZWRCbG9iU2l6ZXMpOworICAgIGdldFN1cHBvcnRlZFNpemVzKGMsIGRlcHRoU2l6ZXNUYWcsIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCAmc3VwcG9ydGVkRGVwdGhTaXplcyk7CisgICAgaWYgKHN1cHBvcnRlZEJsb2JTaXplcy5lbXB0eSgpIHx8IHN1cHBvcnRlZERlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY2FzZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGdldFN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzKHN1cHBvcnRlZEJsb2JTaXplcywgc3VwcG9ydGVkRGVwdGhTaXplcywKKyAgICAgICAgICAgICZzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcywgJmludGVybmFsRGVwdGhTaXplcyk7CisgICAgaWYgKHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gTm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYoIWlzRGVwdGhQaG90b0xpYnJhcnlQcmVzZW50KCkpIHsKKyAgICAgICAgLy8gRGVwdGggcGhvdG8gcHJvY2Vzc2luZyBsaWJyYXJ5IGlzIG5vdCBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBkeW5hbWljRGVwdGhFbnRyaWVzOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcykgeworICAgICAgICBpbnQzMl90IGVudHJ5WzRdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDA+KGl0KSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDE+KGl0KSksCisgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgfTsKKyAgICAgICAgZHluYW1pY0RlcHRoRW50cmllcy5pbnNlcnQoZHluYW1pY0RlcHRoRW50cmllcy5lbmQoKSwgZW50cnksIGVudHJ5ICsgNCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZGVwdGhNaW5EdXJhdGlvbnMsIGRlcHRoU3RhbGxEdXJhdGlvbnM7CisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gYmxvYk1pbkR1cmF0aW9ucywgYmxvYlN0YWxsRHVyYXRpb25zOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucywgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnM7CisKKyAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCBpbnRlcm5hbERlcHRoU2l6ZXMsICZkZXB0aE1pbkR1cmF0aW9ucyk7CisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcywgJmJsb2JNaW5EdXJhdGlvbnMpOworICAgIGlmIChibG9iTWluRHVyYXRpb25zLmVtcHR5KCkgfHwgZGVwdGhNaW5EdXJhdGlvbnMuZW1wdHkoKSB8fAorICAgICAgICAgICAgKGRlcHRoTWluRHVyYXRpb25zLnNpemUoKSAhPSBibG9iTWluRHVyYXRpb25zLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIG51bWJlciBvZiBhdmFpbGFibGUgZGVwdGggbWluIGR1cmF0aW9ucyEgJXp1IHZzLiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVwdGhNaW5EdXJhdGlvbnMuc2l6ZSgpLCBibG9iTWluRHVyYXRpb25zLnNpemUoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCBpbnRlcm5hbERlcHRoU2l6ZXMsICZkZXB0aFN0YWxsRHVyYXRpb25zKTsKKyAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMsICZibG9iU3RhbGxEdXJhdGlvbnMpOworICAgIGlmIChibG9iU3RhbGxEdXJhdGlvbnMuZW1wdHkoKSB8fCBkZXB0aFN0YWxsRHVyYXRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgIChkZXB0aFN0YWxsRHVyYXRpb25zLnNpemUoKSAhPSBibG9iU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXB0aCBzdGFsbCBkdXJhdGlvbnMhICV6dSB2cy4gJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlcHRoU3RhbGxEdXJhdGlvbnMuc2l6ZSgpLCBibG9iU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhEdXJhdGlvbnMoZGVwdGhNaW5EdXJhdGlvbnMsIGJsb2JNaW5EdXJhdGlvbnMsCisgICAgICAgICAgICAmZHluYW1pY0RlcHRoTWluRHVyYXRpb25zKTsKKyAgICBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhEdXJhdGlvbnMoZGVwdGhTdGFsbER1cmF0aW9ucywgYmxvYlN0YWxsRHVyYXRpb25zLAorICAgICAgICAgICAgJmR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zKTsKKyAgICBpZiAoZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLmVtcHR5KCkgfHwgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuZW1wdHkoKSB8fAorICAgICAgICAgICAgKGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5zaXplKCkgIT0gZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIGR5bmFtaWMgZGVwdGggc3RhbGwvbWluIGR1cmF0aW9ucyEgJXp1IHZzLiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLnNpemUoKSwgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXM7CisgICAgYXV0byBpdER1cmF0aW9uID0gZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLmJlZ2luKCk7CisgICAgYXV0byBpdFNpemUgPSBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcy5iZWdpbigpOworICAgIHdoaWxlIChpdER1cmF0aW9uICE9IGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5lbmQoKSkgeworICAgICAgICBpbnQ2NF90IGVudHJ5WzRdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDA+KCppdFNpemUpKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PiAoc3RkOjpnZXQ8MT4oKml0U2l6ZSkpLCAqaXREdXJhdGlvbn07CisgICAgICAgIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5pbnNlcnQoZHluYW1pY0RlcHRoTWluRHVyYXRpb25FbnRyaWVzLmVuZCgpLCBlbnRyeSwKKyAgICAgICAgICAgICAgICBlbnRyeSArIDQpOworICAgICAgICBpdER1cmF0aW9uKys7IGl0U2l6ZSsrOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzOworICAgIGl0RHVyYXRpb24gPSBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9ucy5iZWdpbigpOworICAgIGl0U2l6ZSA9IHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0RHVyYXRpb24gIT0gZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaW50NjRfdCBlbnRyeVs0XSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwwPigqaXRTaXplKSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDE+KCppdFNpemUpKSwgKml0RHVyYXRpb259OworICAgICAgICBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllcy5pbnNlcnQoZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuZW5kKCksIGVudHJ5LAorICAgICAgICAgICAgICAgIGVudHJ5ICsgNCk7CisgICAgICAgIGl0RHVyYXRpb24rKzsgaXRTaXplKys7CisgICAgfQorCisgICAgYy51cGRhdGUoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgICBkeW5hbWljRGVwdGhFbnRyaWVzLmRhdGEoKSwgZHluYW1pY0RlcHRoRW50cmllcy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5kYXRhKCksIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TLAorICAgICAgICAgICAgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuZGF0YSgpLCBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllcy5zaXplKCkpOworCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc3VwcG9ydGVkQ2hUYWdzOworICAgIHN1cHBvcnRlZENoVGFncy5yZXNlcnZlKGNoVGFncy5jb3VudCArIDMpOworICAgIHN1cHBvcnRlZENoVGFncy5pbnNlcnQoc3VwcG9ydGVkQ2hUYWdzLmVuZCgpLCBjaFRhZ3MuZGF0YS5pMzIsCisgICAgICAgICAgICBjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQpOworICAgIHN1cHBvcnRlZENoVGFncy5wdXNoX2JhY2soQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIHN1cHBvcnRlZENoVGFncy5wdXNoX2JhY2soQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MucHVzaF9iYWNrKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TKTsKKyAgICBjLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTLCBzdXBwb3J0ZWRDaFRhZ3MuZGF0YSgpLAorICAgICAgICAgICAgc3VwcG9ydGVkQ2hUYWdzLnNpemUoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Zml4dXBNb25vY2hyb21lVGFncygpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBhdXRvJiBjID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKworICAgIC8vIE92ZXJyaWRlIHN0YXRpYyBtZXRhZGF0YSBmb3IgTU9OT0NIUk9NRSBjYW1lcmEgd2l0aCBvbGRlciBkZXZpY2UgdmVyc2lvbgorICAgIGlmIChtVmVyc2lvbi5nZXRfbWFqb3IoKSA9PSAzICYmIG1WZXJzaW9uLmdldF9taW5vcigpIDwgNSkgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgY2FwID0gYy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXAuY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGNhcC5kYXRhLnU4W2ldID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2ZhID0gQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTU9OTzsKKyAgICAgICAgICAgICAgICByZXMgPSBjLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCwgJmNmYSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHNLZXlzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0ZPUldBUkRfTUFUUklYMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0ZPUldBUkRfTUFUUklYMiwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgc0tleXMsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBSRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiByZXFLZXlzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmVzID0gcmVtb3ZlQXZhaWxhYmxlS2V5cyhjLCByZXFLZXlzLCBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcmVzS2V5cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0dSRUVOX1NQTElULAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfTkVVVFJBTF9DT0xPUl9QT0lOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9HQUlOUywKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgcmVzS2V5cywgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgorICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBibEVudHJ5ID0gYy5maW5kKEFORFJPSURfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4pOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAxOyBqIDwgYmxFbnRyeS5jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsRW50cnkuZGF0YS5pMzJbal0gPSBibEVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnJlbW92ZUF2YWlsYWJsZUtleXMoCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBjLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGtleXMsIHVpbnQzMl90IGtleVRhZykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGtleXNFbnRyeSA9IGMuZmluZChrZXlUYWcpOworICAgIGlmIChrZXlzRW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHRhZyAldTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywga2V5VGFnLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdktleXM7CisgICAgdktleXMucmVzZXJ2ZShrZXlzRW50cnkuY291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5c0VudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChrZXlzLmJlZ2luKCksIGtleXMuZW5kKCksIGtleXNFbnRyeS5kYXRhLmkzMltpXSkgPT0ga2V5cy5lbmQoKSkgeworICAgICAgICAgICAgdktleXMucHVzaF9iYWNrKGtleXNFbnRyeS5kYXRhLmkzMltpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzID0gYy51cGRhdGUoa2V5VGFnLCB2S2V5cy5kYXRhKCksIHZLZXlzLnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaWxsSGVpY1N0cmVhbUNvbWJpbmF0aW9ucygKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIG91dHB1dHMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBkdXJhdGlvbnMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBzdGFsbER1cmF0aW9ucywKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1Db25maWdzLAorICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnkmIGhhbFN0cmVhbUR1cmF0aW9ucykgeworICAgIGlmIChvdXRwdXRzID09IG51bGxwdHIgfHwgZHVyYXRpb25zID09IG51bGxwdHIgfHwgc3RhbGxEdXJhdGlvbnMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXRpYyBib29sIHN1cHBvcnRJbk1lbW9yeVRlbXBGaWxlID0KKyAgICAgICAgICAgIGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSW5NZW1vcnlUZW1wRmlsZVN1cHBvcnRlZCgpOworICAgIGlmICghc3VwcG9ydEluTWVtb3J5VGVtcEZpbGUpIHsKKyAgICAgICAgQUxPR0koIiVzOiBObyBIRUlDIHN1cHBvcnQgZHVlIHRvIGFic2VuY2Ugb2YgaW4gbWVtb3J5IHRlbXAgZmlsZSBzdXBwb3J0IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxTdHJlYW1Db25maWdzLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2ldOworICAgICAgICAvLyBPbmx5IElNUExFTUVOVEFUSU9OX0RFRklORUQgYW5kIFlVVl84ODggY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgSEVJQworICAgICAgICAvLyBpbWFnZS4KKyAgICAgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKKyAgICAgICAgICAgICAgICBmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgc2l6ZUF2YWlsID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgb3V0cHV0cy0+c2l6ZSgpOyBqKz0gNCkgeworICAgICAgICAgICAgaWYgKCgqb3V0cHV0cylbaisxXSA9PSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMV0gJiYKKyAgICAgICAgICAgICAgICAgICAgKCpvdXRwdXRzKVtqKzJdID09IGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSkgeworICAgICAgICAgICAgICAgIHNpemVBdmFpbCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemVBdmFpbCkgY29udGludWU7CisKKyAgICAgICAgaW50NjRfdCBzdGFsbCA9IDA7CisgICAgICAgIGJvb2wgdXNlSGVpYywgdXNlR3JpZDsKKyAgICAgICAgaWYgKGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzU2l6ZVN1cHBvcnRlZEJ5SGVpZkVuY29kZXIoCisgICAgICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdLCBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0sCisgICAgICAgICAgICAgICAgJnVzZUhlaWMsICZ1c2VHcmlkLCAmc3RhbGwpKSB7CisgICAgICAgICAgICBpZiAodXNlR3JpZCAhPSAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSEVJQyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICBpbnQzMl90IGNvbmZpZ1tdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0sIDAgLyppc0lucHV0Ki99OworICAgICAgICAgICAgb3V0cHV0cy0+aW5zZXJ0KG91dHB1dHMtPmVuZCgpLCBjb25maWcsIGNvbmZpZyArIDQpOworCisgICAgICAgICAgICAvLyBIRUlDIG1pbkZyYW1lRHVyYXRpb24KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaGFsU3RyZWFtRHVyYXRpb25zLmNvdW50OyBqICs9IDQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2pdID09IGZvcm1hdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2orMV0gPT0gaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxTdHJlYW1EdXJhdGlvbnMuZGF0YS5pNjRbaisyXSA9PSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvbltdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSwgaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2orM119OworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbnMtPmluc2VydChkdXJhdGlvbnMtPmVuZCgpLCBkdXJhdGlvbiwgZHVyYXRpb24rNCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSEVJQyBzdGFsbER1cmF0aW9uCisgICAgICAgICAgICBpbnQ2NF90IHN0YWxsRHVyYXRpb25bXSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdLCBzdGFsbH07CisgICAgICAgICAgICBzdGFsbER1cmF0aW9ucy0+aW5zZXJ0KHN0YWxsRHVyYXRpb25zLT5lbmQoKSwgc3RhbGxEdXJhdGlvbiwgc3RhbGxEdXJhdGlvbis0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZGVyaXZlSGVpY1RhZ3MoKSB7CisgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgaGFsSGVpY1N1cHBvcnQgPSBjLmZpbmQoQU5EUk9JRF9IRUlDX0lORk9fU1VQUE9SVEVEKTsKKyAgICBpZiAoaGFsSGVpY1N1cHBvcnQuY291bnQgPiAxKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBlbnRyeSBjb3VudCAlenUgZm9yIEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoYWxIZWljU3VwcG9ydC5jb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmIChoYWxIZWljU3VwcG9ydC5jb3VudCA9PSAwIHx8CisgICAgICAgICAgICBoYWxIZWljU3VwcG9ydC5kYXRhLnU4WzBdID09IEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRF9GQUxTRSkgeworICAgICAgICAvLyBDYW1lcmEgSEFMIGRvZXNuJ3Qgc3VwcG9ydCBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9ucyBmb3IgSEVJQy4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBtYXhKcGVnQXBwc1NlZ21lbnRzID0KKyAgICAgICAgICAgIGMuZmluZChBTkRST0lEX0hFSUNfSU5GT19NQVhfSlBFR19BUFBfU0VHTUVOVFNfQ09VTlQpOworICAgIGlmIChtYXhKcGVnQXBwc1NlZ21lbnRzLmNvdW50ICE9IDEgfHwgbWF4SnBlZ0FwcHNTZWdtZW50cy5kYXRhLnU4WzBdID09IDAgfHwKKyAgICAgICAgICAgIG1heEpwZWdBcHBzU2VnbWVudHMuZGF0YS51OFswXSA+IDE2KSB7CisgICAgICAgIEFMT0dFKCIlczogQU5EUk9JRF9IRUlDX0lORk9fTUFYX0pQRUdfQVBQX1NFR01FTlRTX0NPVU5UIG11c3QgYmUgd2l0aGluIFsxLCAxNl0iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gUG9wdWxhdGUgSEVJQyBvdXRwdXQgY29uZmlndXJhdGlvbnMgYW5kIGl0cyByZWxhdGVkIG1pbiBmcmFtZSBkdXJhdGlvbgorICAgIC8vIGFuZCBzdGFsbCBkdXJhdGlvbi4KKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBoZWljT3V0cHV0czsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBoZWljRHVyYXRpb25zOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGhlaWNTdGFsbER1cmF0aW9uczsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBoYWxTdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgIGMuZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbWluRnJhbWVEdXJhdGlvbnMgPQorICAgICAgICAgICAgYy5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKworICAgIHN0YXR1c190IHJlcyA9IGZpbGxIZWljU3RyZWFtQ29tYmluYXRpb25zKCZoZWljT3V0cHV0cywgJmhlaWNEdXJhdGlvbnMsICZoZWljU3RhbGxEdXJhdGlvbnMsCisgICAgICAgICAgICBoYWxTdHJlYW1Db25maWdzLCBtaW5GcmFtZUR1cmF0aW9ucyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaWxsIEhFSUMgc3RyZWFtIGNvbWJpbmF0aW9uczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBjLnVwZGF0ZShBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICBoZWljT3V0cHV0cy5kYXRhKCksIGhlaWNPdXRwdXRzLnNpemUoKSk7CisgICAgYy51cGRhdGUoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlMsCisgICAgICAgICAgICBoZWljRHVyYXRpb25zLmRhdGEoKSwgaGVpY0R1cmF0aW9ucy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlMsCisgICAgICAgICAgICBoZWljU3RhbGxEdXJhdGlvbnMuZGF0YSgpLCBoZWljU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhICYmIHBoeXNpY2FsQ2FtZXJhSWRzICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnBoeXNpY2FsQ2FtZXJhSWRzID0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYTsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlSW5mby0+bUlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYTsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSB7CisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGNhbWVyYUlkKSB7CisgICAgICAgICAgICAgICAgLy8gY2FtZXJhSWQgaXMgZm91bmQgaW4gcHVibGljIGNhbWVyYSBJRHMgYWR2ZXJ0aXNlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAvLyBwcm92aWRlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIGluZm87CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2VJbmZvLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoJmluZm8pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyBmb3IgaWQgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLT5tSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxJZHM7CisgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmJlZ2luKCksIGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKSAhPSBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21ham9yKCksIGRldmljZUluZm8tPm1WZXJzaW9uLmdldF9taW5vcigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBXcm9uZyBkZXZpY2VWZXJzaW9uICV4IGZvciBoaWRkZW5QaHlzaWNhbENhbWVyYUlkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VWZXJzaW9uLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmFkZFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlciwgYm9vbCBleHBlY3RlZCkgewpAQCAtNDQ1LDkgKzExMDksOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8UHJvdmlkZXJJbmZvPiBwcm92aWRlckluZm8gPQotICAgICAgICAgICAgbmV3IFByb3ZpZGVySW5mbyhuZXdQcm92aWRlciwgaW50ZXJmYWNlLCB0aGlzKTsKLSAgICBzdGF0dXNfdCByZXMgPSBwcm92aWRlckluZm8tPmluaXRpYWxpemUoKTsKKyAgICBzcDxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9IG5ldyBQcm92aWRlckluZm8obmV3UHJvdmlkZXIsIHRoaXMpOworICAgIHN0YXR1c190IHJlcyA9IHByb3ZpZGVySW5mby0+aW5pdGlhbGl6ZShpbnRlcmZhY2UsIG1EZXZpY2VTdGF0ZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTQ1OCw2ICsxMTIxLDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpyZW1vdmVQcm92aWRlcihjb25zdCBzdGQ6OnN0cmluZyYgcHJvdmlkZXIpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOwogICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIHN0ZDo6dmVjdG9yPFN0cmluZzg+IHJlbW92ZWREZXZpY2VJZHM7CiAgICAgc3RhdHVzX3QgcmVzID0gTkFNRV9OT1RfRk9VTkQ7CkBAIC00OTgsMjcgKzExNjIsMzYgQEAKIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OlByb3ZpZGVySW5mbygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyICptYW5hZ2VyKSA6CiAgICAgICAgIG1Qcm92aWRlck5hbWUocHJvdmlkZXJOYW1lKSwKLSAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpLAogICAgICAgICBtUHJvdmlkZXJUYWdpZChnZW5lcmF0ZVZlbmRvclRhZ0lkKHByb3ZpZGVyTmFtZSkpLAogICAgICAgICBtVW5pcXVlRGV2aWNlQ291bnQoMCksCiAgICAgICAgIG1NYW5hZ2VyKG1hbmFnZXIpIHsKICAgICAodm9pZCkgbU1hbmFnZXI7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplKCkgeworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmluaXRpYWxpemUoCisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gY3VycmVudERldmljZVN0YXRlKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VQcm92aWRlck5hbWUobVByb3ZpZGVyTmFtZSwgJm1UeXBlLCAmbUlkKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBwcm92aWRlciBuYW1lLCBpZ25vcmluZyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEFMT0dJKCJDb25uZWN0aW5nIHRvIG5ldyBjYW1lcmEgcHJvdmlkZXI6ICVzLCBpc1JlbW90ZT8gJWQiLAotICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtSW50ZXJmYWNlLT5pc1JlbW90ZSgpKTsKKyAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgaW50ZXJmYWNlLT5pc1JlbW90ZSgpKTsKKworICAgIC8vIERldGVybWluZSBtaW5vciB2ZXJzaW9uCisgICAgYXV0byBjYXN0UmVzdWx0ID0gcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDQ7CisgICAgfQorCiAgICAgLy8gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlIGNhbGxiYWNrcyBtYXkgYmUgY2FsbGVkIChhbmQgY2F1c2luZyBuZXcgZGV2aWNlcyBhZGRlZCkKICAgICAvLyBiZWZvcmUgc2V0Q2FsbGJhY2sgcmV0dXJucwotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtSW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBzZXR0aW5nIHVwIGNhbGxiYWNrcyB3aXRoIGNhbWVyYSBwcm92aWRlciAnJXMnOiAlcyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwpAQCAtNTMwLDcgKzEyMDMsNyBAQAogICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CiAgICAgfQogCi0gICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBtSW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CisgICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBpbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKICAgICBpZiAoIWxpbmtlZC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBsaW5raW5nIHRvIGNhbWVyYSBwcm92aWRlciAnJXMnIGRlYXRoOiAlcyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwpAQCAtNTQwLDE1ICsxMjEzLDQyIEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwogICAgIH0KIAorICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUFjdGl2ZUludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IFNldHRpbmcgZGV2aWNlIHN0YXRlIGZvciAlczogMHglIiBQUkl4NjQsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZVN0YXRlKTsKKyAgICBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShjdXJyZW50RGV2aWNlU3RhdGUpOworCisgICAgcmVzID0gc2V0VXBWZW5kb3JUYWdzKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgdXAgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgLy8gR2V0IGluaXRpYWwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcywgaWYgYW55CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoWyZzdGF0dXMsICZkZXZpY2VzXSgKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhSWRMaXN0KFsmc3RhdHVzLCB0aGlzLCAmZGV2aWNlc10oCiAgICAgICAgICAgICBTdGF0dXMgaWRTdGF0dXMsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiYgY2FtZXJhRGV2aWNlTmFtZXMpIHsKICAgICAgICAgc3RhdHVzID0gaWRTdGF0dXM7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYW1lcmFEZXZpY2VOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGRldmljZXMucHVzaF9iYWNrKGNhbWVyYURldmljZU5hbWVzW2ldKTsKKyAgICAgICAgICAgIGZvciAoYXV0byYgbmFtZSA6IGNhbWVyYURldmljZU5hbWVzKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShuYW1lLCAmbWFqb3IsICZtaW5vciwgJnR5cGUsICZpZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHBhcnNpbmcgZGV2aWNlTmFtZTogJXM6ICVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2sobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSB9KTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKQEAgLTU2MiwxMSArMTI2MiwyNCBAQAogICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CiAgICAgfQogCisgICAgcmV0ID0gaW50ZXJmYWNlLT5pc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKKyAgICAgICAgW3RoaXNdKGF1dG8gc3RhdHVzLCBib29sIHN1cHBvcnRlZCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbVNldFRvcmNoTW9kZVN1cHBvcnRlZCA9IHN1cHBvcnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2hlY2tpbmcgdG9yY2ggbW9kZSBzdXBwb3J0ICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBtSXNSZW1vdGUgPSBpbnRlcmZhY2UtPmlzUmVtb3RlKCk7CisKICAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKICAgICBmb3IgKGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgaWQ7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IGFkZERldmljZShkZXZpY2UsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQsICZpZCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IGFkZERldmljZShkZXZpY2UsIGNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5ULCAmaWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBlbnVtZXJhdGUgY2FtZXJhIGRldmljZSAnJXMnOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UuY19zdHIoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC01ODEsNiArMTI5NCw1MyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4KK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydFByb3ZpZGVySW50ZXJmYWNlKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIlJlcXVlc3QgdG8gc3RhcnQgY2FtZXJhIHByb3ZpZGVyOiAlcyIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgaWYgKG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtU2F2ZWRJbnRlcmZhY2U7CisgICAgfQorICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgQUxPR0UoIkJhZCBwcm92aWRlciBzdGF0ZSEgU2hvdWxkIG5vdCBiZSBoZXJlIG9uIGEgbm9uLWxhenkgSEFMISIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBhdXRvIGludGVyZmFjZSA9IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HSSgiQ2FtZXJhIEhBTCBwcm92aWRlciBuZWVkcyByZXN0YXJ0LCBjYWxsaW5nIGdldFNlcnZpY2UoJXMpIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgaW50ZXJmYWNlID0gbU1hbmFnZXItPm1TZXJ2aWNlUHJveHktPmdldFNlcnZpY2UobVByb3ZpZGVyTmFtZSk7CisgICAgICAgIGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CisgICAgICAgIGlmICghbGlua2VkLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBsaW5raW5nIHRvIGNhbWVyYSBwcm92aWRlciAnJXMnIGRlYXRoOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKCFsaW5rZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGxpbmsgdG8gcHJvdmlkZXIgJyVzJyBkZWF0aCBub3RpZmljYXRpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIC8vIFNlbmQgY3VycmVudCBkZXZpY2Ugc3RhdGUKKyAgICAgICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNSkgeworICAgICAgICAgICAgYXV0byBjYXN0UmVzdWx0ID0gcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIHNwPHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZV8yXzUgPSBjYXN0UmVzdWx0OworICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl81ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBJbml0aWFsIGRldmljZSBzdGF0ZSBmb3IgJXM6IDB4ICUiIFBSSXg2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXzJfNS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJDYW1lcmEgcHJvdmlkZXIgKCVzKSBhbHJlYWR5IGluIHVzZS4gUmUtdXNpbmcgaW5zdGFuY2UuIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGludGVyZmFjZTsKK30KKwogY29uc3Qgc3RkOjpzdHJpbmcmIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXRUeXBlKCkgY29uc3QgewogICAgIHJldHVybiBtVHlwZTsKIH0KQEAgLTY2MSw4ICsxNDIxLDEwIEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIGNvbnN0IHsKLSAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIFByb3ZpZGVyIEhBTCAlcyAodjIuNCwgJXMpIHN0YXRpYyBpbmZvOiAlenUgZGV2aWNlczogPT1cbiIsCi0gICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1JbnRlcmZhY2UtPmlzUmVtb3RlKCkgPyAicmVtb3RlIiA6ICJwYXNzdGhyb3VnaCIsCisgICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBQcm92aWRlciBIQUwgJXMgKHYyLiVkLCAlcykgc3RhdGljIGluZm86ICV6dSBkZXZpY2VzOiA9PVxuIiwKKyAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1NaW5vclZlcnNpb24sCisgICAgICAgICAgICBtSXNSZW1vdGUgPyAicmVtb3RlIiA6ICJwYXNzdGhyb3VnaCIsCiAgICAgICAgICAgICBtRGV2aWNlcy5zaXplKCkpOwogCiAgICAgZm9yIChhdXRvJiBkZXZpY2UgOiBtRGV2aWNlcykgewpAQCAtNzAzLDYgKzE0NjUsMjQgQEAKICAgICAgICAgICAgIGluZm8yLmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8gMiwgLyppbmRlbnRhdGlvbiovIDQpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gRHVtcCBjaGFyYWN0ZXJpc3RpY3Mgb2Ygbm9uLXN0YW5kYWxvbmUgcGh5c2ljYWwgY2FtZXJhCisgICAgICAgIGlmIChkZXZpY2UtPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgaWQgOiBkZXZpY2UtPm1QaHlzaWNhbElkcykgeworICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgcGh5c2ljYWwgaWQgaXMgYW4gaW5kZXBlbmRlbnQgY2FtZXJhCisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMuYmVnaW4oKSwgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLmVuZCgpLCBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbEluZm87CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlLT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhpZCwgJnBoeXNpY2FsSW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiICBQaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzOlxuIiwgaWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSW5mby5kdW1wKGZkLCAvKnZlcmJvc2l0eSovIDIsIC8qaW5kZW50YXRpb24qLyA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIEhBTCBkZXZpY2UgJXMgKHYlZC4lZCkgZHVtcFN0YXRlOiA9PVxuIiwgZGV2aWNlLT5tTmFtZS5jX3N0cigpLAogICAgICAgICAgICAgICAgIGRldmljZS0+bVZlcnNpb24uZ2V0X21ham9yKCksIGRldmljZS0+bVZlcnNpb24uZ2V0X21pbm9yKCkpOwogICAgICAgICByZXMgPSBkZXZpY2UtPmR1bXBTdGF0ZShmZCk7CkBAIC03NzIsNiArMTU1Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0b3JjaFN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cykpOwogICAgICAgICAgICAgICAgIGlkID0gZGV2aWNlSW5mby0+bUlkOwogICAgICAgICAgICAgICAgIGtub3duID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT04gIT0gbmV3U3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVSZWYoRGV2aWNlTW9kZTo6VE9SQ0gsIGlkKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgwMCwxNSArMTU4Myw3NSBAQAogICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnNldFVwVmVuZG9yVGFncygpIHsKKyAgICBpZiAobVZlbmRvclRhZ0Rlc2NyaXB0b3IgIT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIE9LOworCisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+IHZ0czsKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OworICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldFZlbmRvclRhZ3MoCisgICAgICAgIFsmXShhdXRvIHMsIGNvbnN0IGF1dG8mIHZlbmRvclRhZ1NlY3MpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgdnRzID0gdmVuZG9yVGFnU2VjczsKKyAgICAgICAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHZlbmRvciB0YWdzIGZyb20gcHJvdmlkZXIgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKworICAgIC8vIFJlYWQgYWxsIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgaW50byBhIGRlc2NyaXB0b3IKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKChyZXMgPSBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHZ0cywgLypvdXQqL21WZW5kb3JUYWdEZXNjcmlwdG9yKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgorICAgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBDYW1lcmEgY2xpZW50cyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSIKKyAgICAgICAgICAgICAgICAidmVuZG9yIHRhZ3MiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3RGV2aWNlU3RhdGUpIHsKKyAgICBtRGV2aWNlU3RhdGUgPSBuZXdEZXZpY2VTdGF0ZTsKKyAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA1KSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IHVwIGZvciB0aGlzIG5vdGlmaWNhdGlvbgorICAgICAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChpbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICAgICAgYXV0byBjYXN0UmVzdWx0ID0gcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIHNwPHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZV8yXzUgPSBjYXN0UmVzdWx0OworICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl81ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXzJfNS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiB0ZW1wbGF0ZTxjbGFzcyBEZXZpY2VJbmZvVD4KIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbz4KICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZURldmljZUluZm8oCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24pIGNvbnN0IHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24pIHsKICAgICBTdGF0dXMgc3RhdHVzOwogCiAgICAgYXV0byBjYW1lcmFJbnRlcmZhY2UgPQotICAgICAgICAgICAgZ2V0RGV2aWNlSW50ZXJmYWNlPHR5cGVuYW1lIERldmljZUluZm9UOjpJbnRlcmZhY2VUPihuYW1lKTsKKyAgICAgICAgICAgIHN0YXJ0RGV2aWNlSW50ZXJmYWNlPHR5cGVuYW1lIERldmljZUluZm9UOjpJbnRlcmZhY2VUPihuYW1lKTsKICAgICBpZiAoY2FtZXJhSW50ZXJmYWNlID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOwogCiAgICAgQ2FtZXJhUmVzb3VyY2VDb3N0IHJlc291cmNlQ29zdDsKQEAgLTgzNSwxMyArMTY3OCwxMyBAQAogICAgIH0KIAogICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4oCi0gICAgICAgIG5ldyBEZXZpY2VJbmZvVChuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LAotICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSkpOworICAgICAgICBuZXcgRGV2aWNlSW5mb1QobmFtZSwgdGFnSWQsIGlkLCBtaW5vclZlcnNpb24sIHJlc291cmNlQ29zdCwgdGhpcywKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMsIGNhbWVyYUludGVyZmFjZSkpOwogfQogCiB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgogc3A8SW50ZXJmYWNlVD4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICAgIEFMT0dFKCIlczogRGV2aWNlICVzOiBVbmtub3duIEhJREwgZGV2aWNlIEhBTCBtYWpvciB2ZXJzaW9uICVkOiIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgSW50ZXJmYWNlVDo6dmVyc2lvbi5nZXRfbWFqb3IoKSk7CiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC04NDksMTIgKzE2OTIsMTYgQEAKIAogdGVtcGxhdGU8Pgogc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldERldmljZUludGVyZmFjZQotICAgICAgICA8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgeworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlCisgICAgICAgIDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjFfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjFfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCiAgICAgICAgIFN0YXR1cyBzLCBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlID0gaW50ZXJmYWNlOwpAQCAtODc0LDEyICsxNzIxLDE2IEBACiAKIHRlbXBsYXRlPD4KIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXREZXZpY2VJbnRlcmZhY2UKLSAgICAgICAgPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZQorICAgICAgICA8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YzX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAorICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YzX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAogICAgICAgICBTdGF0dXMgcywgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSA9IGludGVyZmFjZTsKQEAgLTkwMCw2ICsxNzUxLDE4IEBACiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzo6fkRldmljZUluZm8oKSB7fQogCiB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgorc3A8SW50ZXJmYWNlVD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKCkgeworICAgIHNwPEludGVyZmFjZVQ+IGRldmljZTsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBkZXZpY2UgPSBtUGFyZW50UHJvdmlkZXItPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KG1OYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZpY2UgPSAoSW50ZXJmYWNlVCAqKSBtU2F2ZWRJbnRlcmZhY2UuZ2V0KCk7CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKEludGVyZmFjZVQmIGludGVyZmFjZSwKICAgICAgICAgYm9vbCBlbmFibGVkKSB7CiAgICAgU3RhdHVzIHMgPSBpbnRlcmZhY2UtPnNldFRvcmNoTW9kZShlbmFibGVkID8gVG9yY2hNb2RlOjpPTiA6IFRvcmNoTW9kZTo6T0ZGKTsKQEAgLTkxMCwzMCArMTc3MywzMSBAQAogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSA6CiAgICAgICAgIERldmljZUluZm8obmFtZSwgdGFnSWQsIGlkLCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezEsIG1pbm9yVmVyc2lvbn0sCi0gICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb3N0KSwKLSAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICBwdWJsaWNDYW1lcmFJZHMsIHJlc291cmNlQ29zdCwgcGFyZW50UHJvdmlkZXIpIHsKICAgICAvLyBHZXQgZGVmYXVsdCBwYXJhbWV0ZXJzIGFuZCBpbml0aWFsaXplIGZsYXNoIHVuaXQgYXZhaWxhYmlsaXR5CiAgICAgLy8gUmVxdWlyZXMgcG93ZXJpbmcgb24gdGhlIGNhbWVyYSBkZXZpY2UKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbUludGVyZmFjZS0+b3BlbihudWxscHRyKTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5vcGVuKG51bGxwdHIpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIG9wZW5pbmcgY2FtZXJhIGRldmljZSAlcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb3BlbiBjYW1lcmEgZGV2aWNlICVzIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG1JZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOworICAgICAgICAgICAgICAgIGlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhbdGhpc10oY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwYXJtcykgeworICAgIHJldCA9IGludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhbdGhpc10oY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwYXJtcykgewogICAgICAgICAgICAgICAgIG1EZWZhdWx0UGFyYW1ldGVycy51bmZsYXR0ZW4oU3RyaW5nOChwYXJtcy5jX3N0cigpKSk7CiAgICAgICAgICAgICB9KTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciByZWFkaW5nIGNhbWVyYSBkZXZpY2UgJXMgcGFyYW1zIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNvbnN0IGNoYXIgKmZsYXNoTW9kZSA9CkBAIC05NDIsMjcgKzE4MDYsNDMgQEAKICAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IHRydWU7CiAgICAgfQogCi0gICAgcmV0ID0gbUludGVyZmFjZS0+Y2xvc2UoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBjYWNoZUNhbWVyYUluZm8oaW50ZXJmYWNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGNhY2hlIENhbWVyYUluZm8iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmV0ID0gaW50ZXJmYWNlLT5jbG9zZSgpOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGNsb3NpbmcgY2FtZXJhIGRldmljZSAlcyBhZnRlciBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOwogICAgIH0KIH0KIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjp+RGV2aWNlSW5mbzEoKSB7fQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OnNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIHsKLSAgICByZXR1cm4gRGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKG1JbnRlcmZhY2UsIGVuYWJsZWQpOworICAgIHJldHVybiBzZXRUb3JjaE1vZGVGb3JEZXZpY2U8SW50ZXJmYWNlVD4oZW5hYmxlZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6Z2V0Q2FtZXJhSW5mbygKICAgICAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IHsKICAgICBpZiAoaW5mbyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgICppbmZvID0gbUluZm87CisgICAgcmV0dXJuIE9LOworfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmNhY2hlQ2FtZXJhSW5mbygKKyAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIHsKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjSW5mbzsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFJbmZvKFsmc3RhdHVzLCAmY0luZm9dKFN0YXR1cyBzLCBkZXZpY2U6OlYxXzA6OkNhbWVyYUluZm8gY2FtSW5mbykgeworICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhSW5mbyhbJnN0YXR1cywgJmNJbmZvXShTdGF0dXMgcywgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNhbUluZm8pIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGNJbmZvID0gY2FtSW5mbzsKICAgICAgICAgICAgIH0pOwpAQCAtOTc3LDI3ICsxODU3LDMxIEBACiAKICAgICBzd2l0Y2goY0luZm8uZmFjaW5nKSB7CiAgICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkJBQ0s6Ci0gICAgICAgICAgICBpbmZvLT5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOworICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGRldmljZTo6VjFfMDo6Q2FtZXJhRmFjaW5nOjpFWFRFUk5BTDoKICAgICAgICAgICAgIC8vIE1hcCBleHRlcm5hbCB0byBmcm9udCBmb3IgbGVnYWN5IEFQSQogICAgICAgICBjYXNlIGRldmljZTo6VjFfMDo6Q2FtZXJhRmFjaW5nOjpGUk9OVDoKLSAgICAgICAgICAgIGluZm8tPmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0ZST05UOworICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfRlJPTlQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dXKCIlczogRGV2aWNlICVzOiBVbmtub3duIGNhbWVyYSBmYWNpbmc6ICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgY0luZm8uZmFjaW5nKTsKLSAgICAgICAgICAgIGluZm8tPmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CisgICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOwogICAgIH0KLSAgICBpbmZvLT5vcmllbnRhdGlvbiA9IGNJbmZvLm9yaWVudGF0aW9uOworICAgIG1JbmZvLm9yaWVudGF0aW9uID0gY0luZm8ub3JpZW50YXRpb247CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6ZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpkdW1wU3RhdGUoaW50IGZkKSB7CiAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwogICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzID0gbUludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CisgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gcyA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKICAgICBpZiAoIXMuaXNPaygpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTEwMDksMTQgKzE4OTMsMTUgQEAKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCiAgICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSkgOgogICAgICAgICBEZXZpY2VJbmZvKG5hbWUsIHRhZ0lkLCBpZCwgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnszLCBtaW5vclZlcnNpb259LAotICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29zdCksCi0gICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgcHVibGljQ2FtZXJhSWRzLCByZXNvdXJjZUNvc3QsIHBhcmVudFByb3ZpZGVyKSB7CiAgICAgLy8gR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGluaXRpYWxpemUgZmxhc2ggdW5pdCBhdmFpbGFiaWxpdHkKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhbJnN0YXR1cywgdGhpc10oU3RhdHVzIHMsCisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoWyZzdGF0dXMsIHRoaXNdKFN0YXR1cyBzLAogICAgICAgICAgICAgICAgICAgICBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CkBAIC0xMDM1LDE1ICsxOTIwLDM1IEBACiAgICAgICAgICAgICB9KTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlcyIKLSAgICAgICAgICAgICAgICAiIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAiIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLAogICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBtSXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhID0gaXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBmaXggdXAgbW9ub2Nocm9tZSB0YWdzIGJhc2VkIGZvciBvbGRlciBIQUwgdmVyc2lvbjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhdXRvIHN0YXQgPSBhZGREeW5hbWljRGVwdGhUYWdzKCk7CisgICAgaWYgKE9LICE9IHN0YXQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgYXBwZW5kaW5nIGR5bmFtaWMgZGVwdGggdGFnczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXQpLAorICAgICAgICAgICAgICAgIHN0YXQpOworICAgIH0KKyAgICByZXMgPSBkZXJpdmVIZWljVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZGVyaXZlIEhFSUMgdGFncyBiYXNlZCBvbiBjYW1lcmEgYW5kIG1lZGlhIGNhcGFiaWxpdGllczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZmxhc2hBdmFpbGFibGUgPQogICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpOwogICAgIGlmIChmbGFzaEF2YWlsYWJsZS5jb3VudCA9PSAxICYmCkBAIC0xMDUyLDEyICsxOTU3LDcxIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IGZhbHNlOwogICAgIH0KKworICAgIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKKworICAgIC8vIEdldCBwaHlzaWNhbCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGlmIGFwcGxpY2FibGUKKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgaWYgKCFjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICBBTE9HVigiJXM6IFVuYWJsZSB0byBjb252ZXJ0IElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gdmVyc2lvbiAzLjUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHQ7CisgICAgaWYgKGludGVyZmFjZV8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENvbnZlcnRlZCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgZm9yIChhdXRvJiBpZCA6IG1QaHlzaWNhbElkcykgeworICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKSAhPQorICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBoaWRsSWQoaWQpOworICAgICAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzNfNS0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaGlkbElkLAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmlkLCB0aGlzXShTdGF0dXMgcywgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGEuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IG1ldGFkYXRhLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQoYnVmZmVyLCBtUHJvdmlkZXJUYWdpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3NbaWRdID0gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIGlkLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBtSWQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KIH0KIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjp+RGV2aWNlSW5mbzMoKSB7fQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIHsKLSAgICByZXR1cm4gRGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKG1JbnRlcmZhY2UsIGVuYWJsZWQpOworICAgIHJldHVybiBzZXRUb3JjaE1vZGVGb3JEZXZpY2U8SW50ZXJmYWNlVD4oZW5hYmxlZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0Q2FtZXJhSW5mbygKQEAgLTExMDgsMTAgKzIwNzIsMTQgQEAKICAgICByZXR1cm4gaXNCYWNrd2FyZENvbXBhdGlibGU7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpkdW1wU3RhdGUoaW50IGZkKSB7CiAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwogICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIGF1dG8gcmV0ID0gbUludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CisgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTEyNyw2ICsyMDk1LDYxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3QgeworICAgIGlmIChjaGFyYWN0ZXJpc3RpY3MgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAobVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQocGh5c2ljYWxDYW1lcmFJZCkgPT0KKyAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgKmNoYXJhY3RlcmlzdGljcyA9IG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5hdChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgeworCisgICAgY29uc3Qgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgdGhpcy0+c3RhcnREZXZpY2VJbnRlcmZhY2U8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0OworICAgIGlmIChpbnRlcmZhY2VfM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHJlczsKKyAgICBTdGF0dXMgY2FsbFN0YXR1czsKKyAgICBhdXRvIHJldCA9ICBpbnRlcmZhY2VfM181LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBbJmNhbGxTdGF0dXMsICZzdGF0dXNdIChTdGF0dXMgcywgYm9vbCBjb21iU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKnN0YXR1cyA9IGNvbWJTdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBjYXNlLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpwYXJzZVByb3ZpZGVyTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgc3RkOjpzdHJpbmcgKnR5cGUsIHVpbnQzMl90ICppZCkgewogICAgIC8vIEZvcm1hdCBtdXN0IGJlICI8dHlwZT4vPGlkPiIKQEAgLTEzNjksNyArMjM5Miw3IEBACiAKIAogc3RhdHVzX3QgSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgewogCkBAIC0xMzk3LDcgKzI0MjAsNyBAQAogCiAgICAgaW50IGlkeCA9IDA7CiAgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uJiBzZWN0aW9uID0gdnRzW3NdOworICAgICAgICBjb25zdCBjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24mIHNlY3Rpb24gPSB2dHNbc107CiAgICAgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb25OYW1lID0gc2VjdGlvbi5zZWN0aW9uTmFtZS5jX3N0cigpOwogICAgICAgICBpZiAoc2VjdGlvbk5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzZWN0aW9uIG5hbWUgZGVmaW5lZCBmb3IgdmVuZG9yIHRhZyBzZWN0aW9uICV6dS4iLCBfX0ZVTkNUSU9OX18sIHMpOwpAQCAtMTQ1OCwxMCArMjQ4MSwyMCBAQAogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKLSAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCwgLyptaW5WZXJzaW9uKi8gezMsMH0sIC8qbWF4VmVyc2lvbiovIHs0LDB9KTsKLSAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsIC8qbWluVmVyc2lvbiovIHszLDB9LCAvKm1heFZlcnNpb24qLyB7NSwwfSk7CisgICAgaWYgKGRldmljZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNoYXJhY3RlcmlzdGljcyk7CisgICAgfQogCi0gICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjaGFyYWN0ZXJpc3RpY3MpOworICAgIC8vIEZpbmQgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZUluZm8tPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkLCBjaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBOQU1FX05PVF9GT1VORCkgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKIH0KIAogdm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmZpbHRlckxvZ2ljYWxDYW1lcmFJZHNMb2NrZWQoCkBAIC0xNDcwLDIwICsyNTAzLDE0IEBACiAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiByZW1vdmVkSWRzOwogCiAgICAgZm9yIChhdXRvJiBkZXZpY2VJZCA6IGRldmljZUlkcykgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSBpbmZvOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoZGV2aWNlSWQsICZpbmZvKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBpZCAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoZGV2aWNlSWQpOworICAgICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSBjb250aW51ZTsKIAotICAgICAgICAvLyBpZENvbWJvIGNvbnRhaW5zIHRoZSBpZHMgb2YgYSBsb2dpY2FsIGNhbWVyYSBhbmQgaXRzIHBoeXNpY2FsIGNhbWVyYXMKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkQ29tYm87Ci0gICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKGluZm8sICZpZENvbWJvKTsKLSAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIGlmICghZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgLy8gaWRDb21ibyBjb250YWlucyB0aGUgaWRzIG9mIGEgbG9naWNhbCBjYW1lcmEgYW5kIGl0cyBwaHlzaWNhbCBjYW1lcmFzCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZENvbWJvID0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzOwogICAgICAgICBpZENvbWJvLnB1c2hfYmFjayhkZXZpY2VJZCk7CiAKICAgICAgICAgZm9yIChhdXRvJiBpZCA6IGRldmljZUlkcykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCmluZGV4IGI4YjhiOGMuLmE0MmZiNGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUl9ICiAKICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtdXRleD4KQEAgLTI3LDggKzI4LDggQEAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2NvbW1vbi8xLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjQvSUNhbWVyYVByb3ZpZGVyLmg+Ci0vLyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjQvSUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi41L0lDYW1lcmFQcm92aWRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VOb3RpZmljYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogCkBAIC0xMTAsNiArMTExLDE0IEBACiAgICAgfTsKIAogICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIG1vZGUgYSBjYW1lcmEgZGV2aWNlIGlzIGN1cnJlbnRseSBpbgorICAgICAqLworICAgIGVudW0gY2xhc3MgRGV2aWNlTW9kZSB7CisgICAgICAgIFRPUkNILAorICAgICAgICBDQU1FUkEKKyAgICB9OworCisgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSB0aGUgbWFuYWdlciBhbmQgZ2l2ZSBpdCBhIHN0YXR1cyBsaXN0ZW5lcjsgb3B0aW9uYWxseSBhY2NlcHRzIGEgc2VydmljZQogICAgICAqIGludGVyYWN0aW9uIHByb3h5LgogICAgICAqCkBAIC0xNjYsNiArMTc1LDEzIEBACiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIENoZWNrIGZvciBkZXZpY2Ugc3VwcG9ydCBvZiBzcGVjaWZpYyBzdHJlYW0gY29tYmluYXRpb24uCisgICAgICovCisgICAgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGRldmljZSBpbnRlcmZhY2UgdmVyc2lvbiBmb3IgdGhpcyBJRAogICAgICAqLwogICAgIHN0YXR1c190IGdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKQEAgLTE3NCw3ICsxOTAsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrIGlmIGEgZ2l2ZW4gY2FtZXJhIGRldmljZSBzdXBwb3J0IHNldFRvcmNoTW9kZSBBUEkuCiAgICAgICovCi0gICAgYm9vbCBzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCk7CisgICAgYm9vbCBzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBUdXJuIG9uIG9yIG9mZiB0aGUgZmxhc2hsaWdodCBvbiBhIGdpdmVuIGNhbWVyYSBkZXZpY2UuCkBAIC0xODksNiArMjA1LDEyIEBACiAgICAgc3RhdHVzX3Qgc2V0VXBWZW5kb3JUYWdzKCk7CiAKICAgICAvKioKKyAgICAgKiBJbmZvcm0gcmVnaXN0ZXJlZCBwcm92aWRlcnMgYWJvdXQgYSBkZXZpY2Ugc3RhdGUgY2hhbmdlLCBzdWNoIGFzIGZvbGRpbmcgb3IgdW5mb2xkaW5nCisgICAgICovCisgICAgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpOworCisgICAgLyoqCiAgICAgICogT3BlbiBhbiBhY3RpdmUgc2Vzc2lvbiB0byBhIGNhbWVyYSBkZXZpY2UuCiAgICAgICoKICAgICAgKiBUaGlzIGZ1bGx5IHBvd2VycyBvbiB0aGUgY2FtZXJhIGRldmljZSBoYXJkd2FyZSwgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gYQpAQCAtMjA1LDYgKzIyNywxNyBAQAogICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiAqc2Vzc2lvbik7CiAKICAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBvciB0b3JjaCBjbGllbnQKKyAgICAgKi8KKyAgICB2b2lkIHNhdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGF0IHRoZSBjYW1lcmEgb3IgdG9yY2ggaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQgYnkgYSBjYW1lcmEgY2xpZW50CisgICAgICovCisgICAgdm9pZCByZW1vdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCk7CisKKyAgICAvKioKICAgICAgKiBJU2VydmljZU5vdGlmaWNhdGlvbjo6b25SZWdpc3RyYXRpb24KICAgICAgKiBJbnZva2VkIGJ5IHRoZSBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgd2hlbiBhIG5ldyBjYW1lcmEgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZAogICAgICAqLwpAQCAtMjMxLDEyICsyNjQsMTUgQEAKICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MTAwMCwwfSkgY29uc3Q7CiAKICAgICAvKgotICAgICAqIENoZWNrIGlmIGEgY2FtZXJhIHdpdGggc3RhdGljSW5mbyBpcyBhIGxvZ2ljYWwgY2FtZXJhLiBBbmQgaWYgeWVzLCByZXR1cm4KKyAgICAgKiBDaGVjayBpZiBhIGNhbWVyYSBpcyBhIGxvZ2ljYWwgY2FtZXJhLiBBbmQgaWYgeWVzLCByZXR1cm4KICAgICAgKiB0aGUgcGh5c2ljYWwgY2FtZXJhIGlkcy4KICAgICAgKi8KLSAgICBzdGF0aWMgYm9vbCBpc0xvZ2ljYWxDYW1lcmEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICBib29sIGlzTG9naWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpOwogCisgICAgYm9vbCBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKTsKKyAgICBib29sIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKTsKKworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrRGVwdGhBUlRvbGVyYW5jZTsKIHByaXZhdGU6CiAgICAgLy8gQWxsIHByaXZhdGUgbWVtYmVycywgdW5sZXNzIG90aGVyd2lzZSBub3RlZCwgZXhwZWN0IG1JbnRlcmZhY2VNdXRleCB0byBiZSBsb2NrZWQgYmVmb3JlIHVzZQogICAgIG11dGFibGUgc3RkOjptdXRleCBtSW50ZXJmYWNlTXV0ZXg7CkBAIC0yNDYsMjIgKzI4Miw1NyBAQAogICAgIHdwPFN0YXR1c0xpc3RlbmVyPiBtTGlzdGVuZXI7CiAgICAgU2VydmljZUludGVyYWN0aW9uUHJveHkqIG1TZXJ2aWNlUHJveHk7CiAKKyAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBtRGV2aWNlU3RhdGU7CisKKyAgICAvLyBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrIGlzIGxvY2tlZCBkdXJpbmcgb25SZWdpc3RyYXRpb24gYW5kIHJlbW92ZVByb3ZpZGVyCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Qcm92aWRlckxpZmVjeWNsZUxvY2s7CisKICAgICBzdGF0aWMgSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSBzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eTsKIAorICAgIC8vIE1hcHBpbmcgZnJvbSBDYW1lcmFEZXZpY2UgSURzIHRvIENhbWVyYVByb3ZpZGVycy4gVGhpcyBtYXAgaXMgdXNlZCB0byBrZWVwIHRoZQorICAgIC8vIElDYW1lcmFQcm92aWRlciBhbGl2ZSB3aGlsZSBpdCBpcyBpbiB1c2UgYnkgdGhlIGNhbWVyYSB3aXRoIHRoZSBnaXZlbiBJRCBmb3IgY2FtZXJhCisgICAgLy8gY2FwYWJpbGl0aWVzCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4KKyAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQ7CisKKyAgICAvLyBNYXBwaW5nIGZyb20gQ2FtZXJhRGV2aWNlIElEcyB0byBDYW1lcmFQcm92aWRlcnMuIFRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUKKyAgICAvLyBJQ2FtZXJhUHJvdmlkZXIgYWxpdmUgd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IHRoZSBjYW1lcmEgd2l0aCB0aGUgZ2l2ZW4gSUQgZm9yIHRvcmNoCisgICAgLy8gY2FwYWJpbGl0aWVzCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4KKyAgICAgICAgICAgIG1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKworICAgIC8vIExvY2sgZm9yIGFjY2Vzc2luZyBtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkIGFuZCBtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQKKyAgICBzdGQ6Om11dGV4IG1Qcm92aWRlckludGVyZmFjZU1hcExvY2s7CisKICAgICBzdHJ1Y3QgUHJvdmlkZXJJbmZvIDoKICAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXJDYWxsYmFjaywKICAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudAogICAgIHsKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVByb3ZpZGVyTmFtZTsKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUludGVyZmFjZTsKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVByb3ZpZGVyVGFnaWQ7CisgICAgICAgIGludCBtTWlub3JWZXJzaW9uOworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBtVmVuZG9yVGFnRGVzY3JpcHRvcjsKKyAgICAgICAgYm9vbCBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkOworICAgICAgICBib29sIG1Jc1JlbW90ZTsKKworICAgICAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOworCisgICAgICAgIC8vIFRoaXMgcG9pbnRlciBpcyB1c2VkIHRvIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIElDYW1lcmFQcm92aWRlciB0aGF0IHdhcyBsYXN0IGFjY2Vzc2VkLgorICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtQWN0aXZlSW50ZXJmYWNlOworCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1TYXZlZEludGVyZmFjZTsKIAogICAgICAgICBQcm92aWRlckluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwKLSAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAogICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcik7CiAgICAgICAgIH5Qcm92aWRlckluZm8oKTsKIAotICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKCk7CisgICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXZpY2VTdGF0ZSk7CisKKyAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOwogCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRUeXBlKCkgY29uc3Q7CiAKQEAgLTI4Myw4NCArMzU0LDE3MyBAQAogICAgICAgICAvLyBoaWRsX2RlYXRoX3JlY2lwaWVudCBpbnRlcmZhY2UgLSB0aGlzIGxvY2tzIHRoZSBwYXJlbnQgbUludGVyZmFjZU11dGV4CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPGhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgd2hvKSBvdmVycmlkZTsKIAorICAgICAgICAvKioKKyAgICAgICAgICogU2V0dXAgdmVuZG9yIHRhZ3MgZm9yIHRoaXMgcHJvdmlkZXIKKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RpZnkgcHJvdmlkZXIgYWJvdXQgdG9wLWxldmVsIGRldmljZSBwaHlzaWNhbCBzdGF0ZSBjaGFuZ2VzCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+CisgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZVN0YXRlKTsKKwogICAgICAgICAvLyBCYXNpYyBkZXZpY2UgaW5mb3JtYXRpb24sIGNvbW1vbiB0byBhbGwgY2FtZXJhIGRldmljZXMKICAgICAgICAgc3RydWN0IERldmljZUluZm8gewogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7ICAvLyBGdWxsIGluc3RhbmNlIG5hbWUKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1JZDsgICAgLy8gSUQgc2VjdGlvbiBvZiBmdWxsIG5hbWUKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbVZlcnNpb247CiAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtUHJvdmlkZXJUYWdpZDsKKyAgICAgICAgICAgIGJvb2wgbUlzTG9naWNhbENhbWVyYTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxJZHM7CisgICAgICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyBtSW5mbzsKKyAgICAgICAgICAgIHNwPElCYXNlPiBtU2F2ZWRJbnRlcmZhY2U7CisgICAgICAgICAgICBib29sIG1Jc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEgPSBmYWxzZTsKIAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QgbVJlc291cmNlQ29zdDsKIAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbVN0YXR1czsKIAorICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBtUGFyZW50UHJvdmlkZXI7CisKICAgICAgICAgICAgIGJvb2wgaGFzRmxhc2hVbml0KCkgY29uc3QgeyByZXR1cm4gbUhhc0ZsYXNoVW5pdDsgfQogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0ID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3QgPSAwOwotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAodm9pZCkgY2hhcmFjdGVyaXN0aWNzOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAodm9pZCkgcGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgICAgICAgICAodm9pZCkgY2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJi8qY29uZmlndXJhdGlvbiovLAorICAgICAgICAgICAgICAgICAgICBib29sICogLypzdGF0dXMqLykgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KKyAgICAgICAgICAgIHNwPEludGVyZmFjZVQ+IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKCk7CiAKICAgICAgICAgICAgIERldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24mIHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QpIDoKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIpIDoKICAgICAgICAgICAgICAgICAgICAgbU5hbWUobmFtZSksIG1JZChpZCksIG1WZXJzaW9uKHZlcnNpb24pLCBtUHJvdmlkZXJUYWdpZCh0YWdJZCksCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZUNvc3QocmVzb3VyY2VDb3N0KSwKKyAgICAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYShmYWxzZSksIG1SZXNvdXJjZUNvc3QocmVzb3VyY2VDb3N0KSwKICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cyhoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCksCi0gICAgICAgICAgICAgICAgICAgIG1IYXNGbGFzaFVuaXQoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnRQcm92aWRlcihwYXJlbnRQcm92aWRlciksIG1IYXNGbGFzaFVuaXQoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzKHB1YmxpY0NhbWVyYUlkcykge30KICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8oKTsKICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgYm9vbCBtSGFzRmxhc2hVbml0OworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBtUHVibGljQ2FtZXJhSWRzOwogCiAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgogICAgICAgICAgICAgc3RhdGljIHN0YXR1c190IHNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CisgICAgICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGVGb3JEZXZpY2UoYm9vbCBlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2F2ZSB0aGUgSUNhbWVyYVByb3ZpZGVyIGludGVyZmFjZSBoZXJlIGJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgdGhpcyB3YXMKKyAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNldFRvcmNoTW9kZSgpLCB3aGljaCBkb2VzIHNhdmUgaXQuCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKGludGVyZmFjZSwgZW5hYmxlZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPj4gbURldmljZXM7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gbVVuaXF1ZUNhbWVyYUlkczsKICAgICAgICAgaW50IG1VbmlxdWVEZXZpY2VDb3VudDsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkczsKKyAgICAgICAgLy8gVGhlIGluaXRpYWwgcHVibGljIGNhbWVyYSBJRHMgcHVibGlzaGVkIGJ5IHRoZSBjYW1lcmEgcHJvdmlkZXIuCisgICAgICAgIC8vIEN1cnJlbnRseSBsb2dpY2FsIG11bHRpLWNhbWVyYSBpcyBub3Qgc3VwcG9ydGVkIGZvciBob3QtcGx1ZyBjYW1lcmEuCisgICAgICAgIC8vIEFuZCB3ZSB1c2UgdGhpcyBsaXN0IHRvIGtlZXAgdHJhY2sgb2YgaW5pdGlhbCBwdWJsaWMgY2FtZXJhIElEcworICAgICAgICAvLyBhZHZlcnRpc2VkIGJ5IHRoZSBwcm92aWRlciwgYW5kIHRvIGRpc3Rpbmd1aXNoIGFnYWluc3QgImhpZGRlbiIKKyAgICAgICAgLy8gcGh5c2ljYWwgY2FtZXJhIElEcy4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkczsKIAogICAgICAgICAvLyBIQUx2MS1zcGVjaWZpYyBjYW1lcmEgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBkZXZpY2UgaW50ZXJmYWNlCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvMSA6IHB1YmxpYyBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIHR5cGVkZWYgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlIEludGVyZmFjZVQ7Ci0gICAgICAgICAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBtSW50ZXJmYWNlOwogCiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIC8vSW4gY2FzZSBvZiBEZXZpY2UxSW5mbyBhc3N1bWUgdGhhdCB3ZSBhcmUgYWx3YXlzIEFQSTEgY29tcGF0aWJsZQogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBvdmVycmlkZTsKICAgICAgICAgICAgIERldmljZUluZm8xKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAogICAgICAgICAgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwogICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbzEoKTsKICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMyIG1EZWZhdWx0UGFyYW1ldGVyczsKKyAgICAgICAgICAgIHN0YXR1c190IGNhY2hlQ2FtZXJhSW5mbyhzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwogICAgICAgICB9OwogCiAgICAgICAgIC8vIEhBTHYzLXNwZWNpZmljIGNhbWVyYSBmaWVsZHMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGRldmljZSBpbnRlcmZhY2UKICAgICAgICAgc3RydWN0IERldmljZUluZm8zIDogcHVibGljIERldmljZUluZm8gewogICAgICAgICAgICAgdHlwZWRlZiBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2UgSW50ZXJmYWNlVDsKLSAgICAgICAgICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IG1JbnRlcmZhY2U7CiAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCiAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pCisgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlOwogCiAgICAgICAgICAgICBEZXZpY2VJbmZvMyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAotICAgICAgICAgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8zKCk7CiAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgdm9pZCBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisgICAgICAgICAgICBib29sIGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSgpOworICAgICAgICAgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncygpOworICAgICAgICAgICAgc3RhdHVzX3QgYWRkRHluYW1pY0RlcHRoVGFncygpOworICAgICAgICAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkU2l6ZXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCB1aW50MzJfdCB0YWcsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKnNpemVzIC8qb3V0Ki8pOworICAgICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBzaXplcywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmR1cmF0aW9ucy8qb3V0Ki8pOworICAgICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhEdXJhdGlvbnMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGRlcHRoRHVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgYmxvYkR1cmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmR5bmFtaWNEZXB0aER1cmF0aW9ucyAvKm91dCovKTsKKyAgICAgICAgICAgIHN0YXRpYyBib29sIGlzRGVwdGhQaG90b0xpYnJhcnlQcmVzZW50KCk7CisgICAgICAgICAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcygKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBibG9iU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgZGVwdGhTaXplcywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpkeW5hbWljRGVwdGhTaXplcyAvKm91dCovLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKmludGVybmFsRGVwdGhTaXplcyAvKm91dCovKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlbW92ZUF2YWlsYWJsZUtleXMoQ2FtZXJhTWV0YWRhdGEmIGMsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYga2V5cywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5VGFnKTsKKyAgICAgICAgICAgIHN0YXR1c190IGZpbGxIZWljU3RyZWFtQ29tYmluYXRpb25zKHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogZHVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90Piogc3RhbGxEdXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtQ29uZmlncywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1EdXJhdGlvbnMpOworICAgICAgICAgICAgc3RhdHVzX3QgZGVyaXZlSGVpY1RhZ3MoKTsKICAgICAgICAgfTsKIAogICAgIHByaXZhdGU6CkBAIC0zNzgsMTEgKzUzOCwxMSBAQAogICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBEZXZpY2VJbmZvVD4KICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+IGluaXRpYWxpemVEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uKSBjb25zdDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24pOwogCiAgICAgICAgIC8vIEhlbHBlciBmb3IgaW5pdGlhbGl6ZURldmljZUluZm8gdG8gdXNlIHRoZSByaWdodCBDYW1lcmFQcm92aWRlciBnZXQgbWV0aG9kLgogICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotICAgICAgICBzcDxJbnRlcmZhY2VUPiBnZXREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0OworICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CiAKICAgICAgICAgLy8gUGFyc2UgcHJvdmlkZXIgaW5zdGFuY2UgbmFtZSBmb3IgdHlwZSBhbmQgaWQKICAgICAgICAgc3RhdGljIHN0YXR1c190IHBhcnNlUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLApAQCAtNDE2LDYgKzU3NiwxNCBAQAogCiAgICAgc3RkOjp2ZWN0b3I8c3A8UHJvdmlkZXJJbmZvPj4gbVByb3ZpZGVyczsKIAorICAgIHZvaWQgYWRkUHJvdmlkZXJUb01hcCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyLAorICAgICAgICAgICAgYm9vbCBpc1RvcmNoVXNhZ2UpOworICAgIHZvaWQgcmVtb3ZlQ2FtZXJhSWRGcm9tTWFwKAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAmbWFwLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpOworCiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRldmljZVN0YXR1c1RvU3RyaW5nKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyYpOwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0b3JjaFN0YXR1c1RvU3RyaW5nKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTYxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtRGVwdGhQaG90b1Byb2Nlc3NvciIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8KKworI2luY2x1ZGUgIkRlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvY2FtZXJhLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9jYW1lcmFzLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9jb250YWluZXIuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2RldmljZS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZGltZW5zaW9uLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9keW5hbWljX2RlcHRoLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9wb2ludC5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcG9zZS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcHJvZmlsZXMuaD4KKyNpbmNsdWRlIDxqcGVnbGliLmg+CisjaW5jbHVkZSA8bGliZXhpZi9leGlmLWRhdGEuaD4KKyNpbmNsdWRlIDxsaWJleGlmL2V4aWYtc3lzdGVtLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXhpZlV0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8eG1wbWV0YS94bXBfZGF0YS5oPgorI2luY2x1ZGUgPHhtcG1ldGEveG1wX3dyaXRlci5oPgorCit1c2luZyBkeW5hbWljX2RlcHRoOjpDYW1lcmE7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpDYW1lcmFzOwordXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhUGFyYW1zOwordXNpbmcgZHluYW1pY19kZXB0aDo6Q29udGFpbmVyOwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhGb3JtYXQ7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aE1hcDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoTWFwUGFyYW1zOwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhVbml0czsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRldmljZTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRldmljZVBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRpbWVuc2lvbjsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkltYWdlOwordXNpbmcgZHluYW1pY19kZXB0aDo6SW1hZ2luZ01vZGVsOwordXNpbmcgZHluYW1pY19kZXB0aDo6SW1hZ2luZ01vZGVsUGFyYW1zOwordXNpbmcgZHluYW1pY19kZXB0aDo6SXRlbTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OlBvc2U7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpQcm9maWxlOwordXNpbmcgZHluYW1pY19kZXB0aDo6UHJvZmlsZXM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworRXhpZk9yaWVudGF0aW9uIGdldEV4aWZPcmllbnRhdGlvbihjb25zdCB1bnNpZ25lZCBjaGFyICpqcGVnQnVmZmVyLCBzaXplX3QganBlZ0J1ZmZlclNpemUpIHsKKyAgICBpZiAoKGpwZWdCdWZmZXIgPT0gbnVsbHB0cikgfHwgKGpwZWdCdWZmZXJTaXplID09IDApKSB7CisgICAgICAgIHJldHVybiBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICB9CisKKyAgICBhdXRvIGV4aWZEYXRhID0gZXhpZl9kYXRhX25ldygpOworICAgIGV4aWZfZGF0YV9sb2FkX2RhdGEoZXhpZkRhdGEsIGpwZWdCdWZmZXIsIGpwZWdCdWZmZXJTaXplKTsKKyAgICBFeGlmRW50cnkgKm9yaWVudGF0aW9uID0gZXhpZl9jb250ZW50X2dldF9lbnRyeShleGlmRGF0YS0+aWZkW0VYSUZfSUZEXzBdLAorICAgICAgICAgICAgRVhJRl9UQUdfT1JJRU5UQVRJT04pOworICAgIGlmICgob3JpZW50YXRpb24gPT0gbnVsbHB0cikgfHwgKG9yaWVudGF0aW9uLT5zaXplICE9IHNpemVvZihFeGlmU2hvcnQpKSkgeworICAgICAgICBBTE9HVigiJXM6IE9yaWVudGF0aW9uIEVYSUYgZW50cnkgaW52YWxpZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBleGlmX2RhdGFfdW5yZWYoZXhpZkRhdGEpOworICAgICAgICByZXR1cm4gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisgICAgfQorCisgICAgYXV0byBvcmllbnRhdGlvblZhbHVlID0gZXhpZl9nZXRfc2hvcnQob3JpZW50YXRpb24tPmRhdGEsIGV4aWZfZGF0YV9nZXRfYnl0ZV9vcmRlcihleGlmRGF0YSkpOworICAgIEV4aWZPcmllbnRhdGlvbiByZXQ7CisgICAgc3dpdGNoIChvcmllbnRhdGlvblZhbHVlKSB7CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl85MF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMTgwX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8yNzBfREVHUkVFUzoKKyAgICAgICAgICAgIHJldCA9IHN0YXRpY19jYXN0PEV4aWZPcmllbnRhdGlvbj4gKG9yaWVudGF0aW9uVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgRVhJRiBvcmllbnRhdGlvbiB2YWx1ZTogJWQsIGRlZmF1bHRpbmcgdG8gMCBkZWdyZWVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvblZhbHVlKTsKKyAgICAgICAgICAgIHJldCA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOworICAgIH0KKworICAgIGV4aWZfZGF0YV91bnJlZihleGlmRGF0YSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBlbmNvZGVHcmF5c2NhbGVKcGVnKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgdWludDhfdCAqaW4sIHZvaWQgKm91dCwKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1heE91dFNpemUsIHVpbnQ4X3QganBlZ1F1YWxpdHksIEV4aWZPcmllbnRhdGlvbiBleGlmT3JpZW50YXRpb24sCisgICAgICAgIHNpemVfdCAmYWN0dWFsU2l6ZSkgeworICAgIHN0YXR1c190IHJldDsKKyAgICAvLyBsaWJqcGVnIGlzIGEgQyBsaWJyYXJ5IHNvIHdlIHVzZSBDLXN0eWxlICJpbmhlcml0YW5jZSIgYnkKKyAgICAvLyBwdXR0aW5nIGxpYmpwZWcncyBqcGVnX2Rlc3RpbmF0aW9uX21nciBmaXJzdCBpbiBvdXIgY3VzdG9tCisgICAgLy8gc3RydWN0LiBUaGlzIGFsbG93cyB1cyB0byBjYXN0IGpwZWdfZGVzdGluYXRpb25fbWdyKiB0bworICAgIC8vIEN1c3RvbUpwZWdEZXN0TWdyKiB3aGVuIHdlIGdldCBpdCBwYXNzZWQgdG8gdXMgaW4gYSBjYWxsYmFjay4KKyAgICBzdHJ1Y3QgQ3VzdG9tSnBlZ0Rlc3RNZ3IgOiBwdWJsaWMganBlZ19kZXN0aW5hdGlvbl9tZ3IgeworICAgICAgICBKT0NURVQgKm1CdWZmZXI7CisgICAgICAgIHNpemVfdCBtQnVmZmVyU2l6ZTsKKyAgICAgICAgc2l6ZV90IG1FbmNvZGVkU2l6ZTsKKyAgICAgICAgYm9vbCBtU3VjY2VzczsKKyAgICB9IGRtZ3I7CisKKyAgICBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbyA9IHt9OworICAgIGpwZWdfZXJyb3JfbWdyIGplcnI7CisKKyAgICAvLyBJbml0aWFsaXplIGVycm9yIGhhbmRsaW5nIHdpdGggc3RhbmRhcmQgY2FsbGJhY2tzLCBidXQKKyAgICAvLyB0aGVuIG92ZXJyaWRlIG91dHB1dF9tZXNzYWdlICh0byBwcmludCB0byBBTE9HKSBhbmQKKyAgICAvLyBlcnJvcl9leGl0IHRvIHNldCBhIGZsYWcgYW5kIHByaW50IGEgbWVzc2FnZSBpbnN0ZWFkCisgICAgLy8gb2Yga2lsbGluZyB0aGUgd2hvbGUgcHJvY2Vzcy4KKyAgICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7CisKKyAgICBjaW5mby5lcnItPm91dHB1dF9tZXNzYWdlID0gW10oal9jb21tb25fcHRyIGNpbmZvKSB7CisgICAgICAgIGNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisKKyAgICAgICAgLyogQ3JlYXRlIHRoZSBtZXNzYWdlICovCisgICAgICAgICgqY2luZm8tPmVyci0+Zm9ybWF0X21lc3NhZ2UpKGNpbmZvLCBidWZmZXIpOworICAgICAgICBBTE9HRSgibGlianBlZyBlcnJvcjogJXMiLCBidWZmZXIpOworICAgIH07CisKKyAgICBjaW5mby5lcnItPmVycm9yX2V4aXQgPSBbXShqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgICAgICAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkoY2luZm8pOworICAgICAgICBpZihjaW5mby0+Y2xpZW50X2RhdGEpIHsKKyAgICAgICAgICAgIGF1dG8gJiBkbWdyID0gKnN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyKj4oY2luZm8tPmNsaWVudF9kYXRhKTsKKyAgICAgICAgICAgIGRtZ3IubVN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBpbml0aWFsaXplZCBzb21lIGNhbGxiYWNrcywgbGV0J3MgY3JlYXRlIG91ciBjb21wcmVzc29yCisgICAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKKyAgICBkbWdyLm1CdWZmZXIgPSBzdGF0aWNfY2FzdDxKT0NURVQqPihvdXQpOworICAgIGRtZ3IubUJ1ZmZlclNpemUgPSBtYXhPdXRTaXplOworICAgIGRtZ3IubUVuY29kZWRTaXplID0gMDsKKyAgICBkbWdyLm1TdWNjZXNzID0gdHJ1ZTsKKyAgICBjaW5mby5jbGllbnRfZGF0YSA9IHN0YXRpY19jYXN0PHZvaWQqPigmZG1ncik7CisKKyAgICAvLyBUaGVzZSBsYW1iZGFzIGJlY29tZSBDLXN0eWxlIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBhcyBwZXIgQysrMTEgc3BlYworICAgIC8vIG1heSBub3QgY2FwdHVyZSBhbnl0aGluZy4KKyAgICBkbWdyLmluaXRfZGVzdGluYXRpb24gPSBbXShqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgICAgICBhdXRvICYgZG1nciA9IHN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyJj4oKmNpbmZvLT5kZXN0KTsKKyAgICAgICAgZG1nci5uZXh0X291dHB1dF9ieXRlID0gZG1nci5tQnVmZmVyOworICAgICAgICBkbWdyLmZyZWVfaW5fYnVmZmVyID0gZG1nci5tQnVmZmVyU2l6ZTsKKyAgICAgICAgQUxPR1YoIiVzOiVkIGpwZWcgc3RhcnQ6ICVwIFslenVdIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZG1nci5tQnVmZmVyLCBkbWdyLm1CdWZmZXJTaXplKTsKKyAgICB9OworCisgICAgZG1nci5lbXB0eV9vdXRwdXRfYnVmZmVyID0gW10oal9jb21wcmVzc19wdHIgY2luZm8gX191bnVzZWQpIHsKKyAgICAgICAgQUxPR1YoIiVzOiVkIE91dCBvZiBidWZmZXIiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKworICAgIGRtZ3IudGVybV9kZXN0aW5hdGlvbiA9IFtdKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgICAgIGF1dG8gJiBkbWdyID0gc3RhdGljX2Nhc3Q8Q3VzdG9tSnBlZ0Rlc3RNZ3ImPigqY2luZm8tPmRlc3QpOworICAgICAgICBkbWdyLm1FbmNvZGVkU2l6ZSA9IGRtZ3IubUJ1ZmZlclNpemUgLSBkbWdyLmZyZWVfaW5fYnVmZmVyOworICAgICAgICBBTE9HVigiJXM6JWQgRG9uZSB3aXRoIGpwZWc6ICV6dSIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGRtZ3IubUVuY29kZWRTaXplKTsKKyAgICB9OworICAgIGNpbmZvLmRlc3QgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21ncio+KCZkbWdyKTsKKyAgICBjaW5mby5pbWFnZV93aWR0aCA9IHdpZHRoOworICAgIGNpbmZvLmltYWdlX2hlaWdodCA9IGhlaWdodDsKKyAgICBjaW5mby5pbnB1dF9jb21wb25lbnRzID0gMTsKKyAgICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7CisKKyAgICAvLyBJbml0aWFsaXplIGRlZmF1bHRzIGFuZCB0aGVuIG92ZXJyaWRlIHdoYXQgd2Ugd2FudAorICAgIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CisKKyAgICBqcGVnX3NldF9xdWFsaXR5KCZjaW5mbywganBlZ1F1YWxpdHksIDEpOworICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoJmNpbmZvLCBKQ1NfR1JBWVNDQUxFKTsKKyAgICBjaW5mby5yYXdfZGF0YV9pbiA9IDA7CisgICAgY2luZm8uZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7CisKKyAgICBjaW5mby5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8uY29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8uY29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yID0gMTsKKworICAgIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKKworICAgIGlmIChleGlmT3JpZW50YXRpb24gIT0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZVdGlscz4gdXRpbHMoRXhpZlV0aWxzOjpjcmVhdGUoKSk7CisgICAgICAgIHV0aWxzLT5pbml0aWFsaXplRW1wdHkoKTsKKyAgICAgICAgdXRpbHMtPnNldEltYWdlV2lkdGgod2lkdGgpOworICAgICAgICB1dGlscy0+c2V0SW1hZ2VIZWlnaHQoaGVpZ2h0KTsKKyAgICAgICAgdXRpbHMtPnNldE9yaWVudGF0aW9uVmFsdWUoZXhpZk9yaWVudGF0aW9uKTsKKworICAgICAgICBpZiAodXRpbHMtPmdlbmVyYXRlQXBwMSgpKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBleGlmQnVmZmVyID0gdXRpbHMtPmdldEFwcDFCdWZmZXIoKTsKKyAgICAgICAgICAgIHNpemVfdCBleGlmQnVmZmVyU2l6ZSA9IHV0aWxzLT5nZXRBcHAxTGVuZ3RoKCk7CisgICAgICAgICAgICBqcGVnX3dyaXRlX21hcmtlcigmY2luZm8sIEpQRUdfQVBQMCArIDEsIHN0YXRpY19jYXN0PGNvbnN0IEpPQ1RFVCo+KGV4aWZCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBleGlmQnVmZmVyU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZW5lcmF0ZSBBcHAxIGJ1ZmZlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNpbmZvLmltYWdlX2hlaWdodDsgaSsrKSB7CisgICAgICAgIGF1dG8gY3VycmVudFJvdyAgPSBzdGF0aWNfY2FzdDxKU0FNUFJPVz4oaW4gKyBpKndpZHRoKTsKKyAgICAgICAganBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCAmY3VycmVudFJvdywgLypudW1fbGluZXMqLzEpOworICAgIH0KKworICAgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7CisKKyAgICBhY3R1YWxTaXplID0gZG1nci5tRW5jb2RlZFNpemU7CisgICAgaWYgKGRtZ3IubVN1Y2Nlc3MpIHsKKyAgICAgICAgcmV0ID0gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbmxpbmUgdm9pZCB1bnBhY2tEZXB0aDE2KHVpbnQxNl90IHZhbHVlLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgLy8gQW5kcm9pZCBkZW5zZWx5IHBhY2tlZCBkZXB0aCBtYXAuIFRoZSB1bml0cyBmb3IgdGhlIHJhbmdlIGFyZSBpbgorICAgIC8vIG1pbGxpbWV0ZXJzIGFuZCBuZWVkIHRvIGJlIHNjYWxlZCB0byBtZXRlcnMuCisgICAgLy8gVGhlIGNvbmZpZGVuY2UgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgMyBtb3N0IHNpZ25pZmljYW50IGJpdHMuCisgICAgLy8gVGhlIGNvbmZpZGVuY2UgZGF0YSBuZWVkcyB0byBiZSBhZGRpdGlvbmFsbHkgbm9ybWFsaXplZCB3aXRoCisgICAgLy8gdmFsdWVzIDEuMGYsIDAuMGYgcmVwcmVzZW50aW5nIG1heGltdW0gYW5kIG1pbmltdW0gY29uZmlkZW5jZQorICAgIC8vIHJlc3BlY3RpdmVseS4KKyAgICBhdXRvIHBvaW50ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlICYgMHgxRkZGKSAvIDEwMDAuZjsKKyAgICBwb2ludHMtPnB1c2hfYmFjayhwb2ludCk7CisKKyAgICBhdXRvIGNvbmYgPSAodmFsdWUgPj4gMTMpICYgMHg3OworICAgIGZsb2F0IG5vcm1Db25maWRlbmNlID0gKGNvbmYgPT0gMCkgPyAxLmYgOiAoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbmYpIC0gMSkgLyA3LmY7CisgICAgY29uZmlkZW5jZS0+cHVzaF9iYWNrKG5vcm1Db25maWRlbmNlKTsKKworICAgIGlmICgqbmVhciA+IHBvaW50KSB7CisgICAgICAgICpuZWFyID0gcG9pbnQ7CisgICAgfQorICAgIGlmICgqZmFyIDwgcG9pbnQpIHsKKyAgICAgICAgKmZhciA9IHBvaW50OworICAgIH0KK30KKworLy8gVHJpdmlhbCBjYXNlLCByZWFkIGZvcndhcmQgZnJvbSB0b3AsbGVmdCBjb3JuZXIuCit2b2lkIHJvdGF0ZTBBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGg7IGorKykgeworICAgICAgICAgICAgdW5wYWNrRGVwdGgxNihpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlcltpKmlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlICsgal0sIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gOTAgZGVncmVlcyBDVyByb3RhdGlvbiBjYW4gYmUgYXBwbGllZCBieSBzdGFydGluZyB0byByZWFkIGZyb20gYm90dG9tLCBsZWZ0IGNvcm5lcgorLy8gdHJhbnNwb3Npbmcgcm93cyBhbmQgY29sdW1ucy4KK3ZvaWQgcm90YXRlOTBBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aDsgaSsrKSB7CisgICAgICAgIGZvciAoc3NpemVfdCBqID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQtMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgIHVucGFja0RlcHRoMTYoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXJbaippbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSArIGldLCBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIDE4MCBDVyBkZWdyZWVzIHJvdGF0aW9uIGNhbiBiZSBhcHBsaWVkIGJ5IHN0YXJ0aW5nIHRvIHJlYWQgYmFja3dhcmRzIGZyb20gYm90dG9tLCByaWdodCBjb3JuZXIuCit2b2lkIHJvdGF0ZTE4MEFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgZm9yIChzc2l6ZV90IGkgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodC0xOyBpID49IDA7IGktLSkgeworICAgICAgICBmb3IgKHNzaXplX3QgaiA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGgtMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgIHVucGFja0RlcHRoMTYoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXJbaSppbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSArIGpdLCBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIDI3MCBkZWdyZWVzIENXIHJvdGF0aW9uIGNhbiBiZSBhcHBsaWVkIGJ5IHN0YXJ0aW5nIHRvIHJlYWQgZnJvbSB0b3AsIHJpZ2h0IGNvcm5lcgorLy8gdHJhbnNwb3Npbmcgcm93cyBhbmQgY29sdW1ucy4KK3ZvaWQgcm90YXRlMjcwQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBmb3IgKHNzaXplX3QgaSA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGgtMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodDsgaisrKSB7CisgICAgICAgICAgICB1bnBhY2tEZXB0aDE2KGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyW2oqaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgKyBpXSwgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIHJvdGF0ZUFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgc3dpdGNoIChpbnB1dEZyYW1lLm1PcmllbnRhdGlvbikgeworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMF9ERUdSRUVTOgorICAgICAgICAgICAgcm90YXRlMEFuZFVucGFjayhpbnB1dEZyYW1lLCBwb2ludHMsIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl85MF9ERUdSRUVTOgorICAgICAgICAgICAgcm90YXRlOTBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8xODBfREVHUkVFUzoKKyAgICAgICAgICAgIHJvdGF0ZTE4MEFuZFVucGFjayhpbnB1dEZyYW1lLCBwb2ludHMsIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8yNzBfREVHUkVFUzoKKyAgICAgICAgICAgIHJvdGF0ZTI3MEFuZFVucGFjayhpbnB1dEZyYW1lLCBwb2ludHMsIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5zdXBwb3J0ZWQgZGVwdGggcGhvdG8gcm90YXRpb246ICVkLCBkZWZhdWx0IHRvIDAiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGlucHV0RnJhbWUubU9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgIHJvdGF0ZTBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjp1bmlxdWVfcHRyPGR5bmFtaWNfZGVwdGg6OkRlcHRoTWFwPiBwcm9jZXNzRGVwdGhNYXBGcmFtZShEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLAorICAgICAgICBFeGlmT3JpZW50YXRpb24gZXhpZk9yaWVudGF0aW9uLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SXRlbT4+ICppdGVtcyAvKm91dCovLAorICAgICAgICBib29sICpzd2l0Y2hEaW1lbnNpb25zIC8qb3V0Ki8pIHsKKyAgICBpZiAoKGl0ZW1zID09IG51bGxwdHIpIHx8IChzd2l0Y2hEaW1lbnNpb25zID09IG51bGxwdHIpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBwb2ludHMsIGNvbmZpZGVuY2U7CisKKyAgICBzaXplX3QgcG9pbnRDb3VudCA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGggKiBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodDsKKyAgICBwb2ludHMucmVzZXJ2ZShwb2ludENvdW50KTsKKyAgICBjb25maWRlbmNlLnJlc2VydmUocG9pbnRDb3VudCk7CisgICAgZmxvYXQgbmVhciA9IFVJTlQxNl9NQVg7CisgICAgZmxvYXQgZmFyID0gLjBmOworICAgICpzd2l0Y2hEaW1lbnNpb25zID0gZmFsc2U7CisgICAgLy8gUGh5c2ljYWwgcm90YXRpb24gb2YgZGVwdGggYW5kIGNvbmZpZGVuY2UgbWFwcyBtYXkgYmUgbmVlZGVkIGluIGNhc2UKKyAgICAvLyB0aGUgRVhJRiBvcmllbnRhdGlvbiBpcyBzZXQgdG8gMCBkZWdyZWVzIGFuZCB0aGUgZGVwdGggcGhvdG8gb3JpZW50YXRpb24KKyAgICAvLyAoc291cmNlIGNvbG9yIGltYWdlKSBoYXMgc29tZSBkaWZmZXJlbnQgdmFsdWUuCisgICAgaWYgKGV4aWZPcmllbnRhdGlvbiA9PSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUykgeworICAgICAgICAqc3dpdGNoRGltZW5zaW9ucyA9IHJvdGF0ZUFuZFVucGFjayhpbnB1dEZyYW1lLCAmcG9pbnRzLCAmY29uZmlkZW5jZSwgJm5lYXIsICZmYXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJvdGF0ZTBBbmRVbnBhY2soaW5wdXRGcmFtZSwgJnBvaW50cywgJmNvbmZpZGVuY2UsICZuZWFyLCAmZmFyKTsKKyAgICB9CisKKyAgICBzaXplX3Qgd2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoOworICAgIHNpemVfdCBoZWlnaHQgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodDsKKyAgICBpZiAoKnN3aXRjaERpbWVuc2lvbnMpIHsKKyAgICAgICAgd2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodDsKKyAgICAgICAgaGVpZ2h0ID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aDsKKyAgICB9CisKKyAgICBpZiAobmVhciA9PSBmYXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBOZWFyIGFuZCBmYXIgcmFuZ2UgdmFsdWVzIG11c3Qgbm90IG1hdGNoISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBvaW50c1F1YW50aXplZCwgY29uZmlkZW5jZVF1YW50aXplZDsKKyAgICBwb2ludHNRdWFudGl6ZWQucmVzZXJ2ZShwb2ludENvdW50KTsgY29uZmlkZW5jZVF1YW50aXplZC5yZXNlcnZlKHBvaW50Q291bnQpOworICAgIGF1dG8gcG9pbnRJdCA9IHBvaW50cy5iZWdpbigpOworICAgIGF1dG8gY29uZmlkZW5jZUl0ID0gY29uZmlkZW5jZS5iZWdpbigpOworICAgIHdoaWxlICgocG9pbnRJdCAhPSBwb2ludHMuZW5kKCkpICYmIChjb25maWRlbmNlSXQgIT0gY29uZmlkZW5jZS5lbmQoKSkpIHsKKyAgICAgICAgcG9pbnRzUXVhbnRpemVkLnB1c2hfYmFjayhmbG9vcmYoKChmYXIgKiAoKnBvaW50SXQgLSBuZWFyKSkgLworICAgICAgICAgICAgICAgICgqcG9pbnRJdCAqIChmYXIgLSBuZWFyKSkpICogMjU1LjBmKSk7CisgICAgICAgIGNvbmZpZGVuY2VRdWFudGl6ZWQucHVzaF9iYWNrKGZsb29yZigqY29uZmlkZW5jZUl0ICogMjU1LjBmKSk7CisgICAgICAgIGNvbmZpZGVuY2VJdCsrOyBwb2ludEl0Kys7CisgICAgfQorCisgICAgRGVwdGhNYXBQYXJhbXMgZGVwdGhQYXJhbXMoRGVwdGhGb3JtYXQ6OmtSYW5nZUludmVyc2UsIG5lYXIsIGZhciwgRGVwdGhVbml0czo6a01ldGVycywKKyAgICAgICAgICAgICJhbmRyb2lkL2RlcHRobWFwIik7CisgICAgZGVwdGhQYXJhbXMuY29uZmlkZW5jZV91cmkgPSAiYW5kcm9pZC9jb25maWRlbmNlbWFwIjsKKyAgICBkZXB0aFBhcmFtcy5taW1lID0gImltYWdlL2pwZWciOworICAgIGRlcHRoUGFyYW1zLmRlcHRoX2ltYWdlX2RhdGEucmVzaXplKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEucmVzaXplKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBzaXplX3QgYWN0dWFsSnBlZ1NpemU7CisgICAgYXV0byByZXQgPSBlbmNvZGVHcmF5c2NhbGVKcGVnKHdpZHRoLCBoZWlnaHQsIHBvaW50c1F1YW50aXplZC5kYXRhKCksCisgICAgICAgICAgICBkZXB0aFBhcmFtcy5kZXB0aF9pbWFnZV9kYXRhLmRhdGEoKSwgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUsCisgICAgICAgICAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSwgZXhpZk9yaWVudGF0aW9uLCBhY3R1YWxKcGVnU2l6ZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIG1hcCBjb21wcmVzc2lvbiBmYWlsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGRlcHRoUGFyYW1zLmRlcHRoX2ltYWdlX2RhdGEucmVzaXplKGFjdHVhbEpwZWdTaXplKTsKKworICAgIHJldCA9IGVuY29kZUdyYXlzY2FsZUpwZWcod2lkdGgsIGhlaWdodCwgY29uZmlkZW5jZVF1YW50aXplZC5kYXRhKCksCisgICAgICAgICAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEuZGF0YSgpLCBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5LCBleGlmT3JpZW50YXRpb24sIGFjdHVhbEpwZWdTaXplKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29uZmlkZW5jZSBtYXAgY29tcHJlc3Npb24gZmFpbGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEucmVzaXplKGFjdHVhbEpwZWdTaXplKTsKKworICAgIHJldHVybiBEZXB0aE1hcDo6RnJvbURhdGEoZGVwdGhQYXJhbXMsIGl0ZW1zKTsKK30KKworZXh0ZXJuICJDIiBpbnQgcHJvY2Vzc0RlcHRoUGhvdG9GcmFtZShEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzaXplX3QgZGVwdGhQaG90b0J1ZmZlclNpemUsCisgICAgICAgIHZvaWQqIGRlcHRoUGhvdG9CdWZmZXIgLypvdXQqLywgc2l6ZV90KiBkZXB0aFBob3RvQWN0dWFsU2l6ZSAvKm91dCovKSB7CisgICAgaWYgKChpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIChkZXB0aFBob3RvQnVmZmVyID09IG51bGxwdHIpIHx8IChkZXB0aFBob3RvQWN0dWFsU2l6ZSA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJdGVtPj4gaXRlbXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENhbWVyYT4+IGNhbWVyYUxpc3Q7CisgICAgYXV0byBpbWFnZSA9IEltYWdlOjpGcm9tRGF0YUZvclByaW1hcnlJbWFnZSgiYW5kcm9pZC9tYWluaW1hZ2UiLCAmaXRlbXMpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFQYXJhbXM+IGNhbWVyYVBhcmFtcyhuZXcgQ2FtZXJhUGFyYW1zKHN0ZDo6bW92ZShpbWFnZSkpKTsKKyAgICBpZiAoY2FtZXJhUGFyYW1zID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbiA9IGdldEV4aWZPcmllbnRhdGlvbigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+IChpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciksCisgICAgICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUpOworICAgIGJvb2wgc3dpdGNoRGltZW5zaW9uczsKKyAgICBjYW1lcmFQYXJhbXMtPmRlcHRoX21hcCA9IHByb2Nlc3NEZXB0aE1hcEZyYW1lKGlucHV0RnJhbWUsIGV4aWZPcmllbnRhdGlvbiwgJml0ZW1zLAorICAgICAgICAgICAgJnN3aXRjaERpbWVuc2lvbnMpOworICAgIGlmIChjYW1lcmFQYXJhbXMtPmRlcHRoX21hcCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggbWFwIHByb2Nlc3NpbmcgZmFpbGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGdlbmVyYXRlIGFuIGltYWdpbmcgbW9kZWwgd2l0aG91dCBpbnN0cmluc2ljIGNhbGlicmF0aW9uLgorICAgIGlmIChpbnB1dEZyYW1lLm1Jc0luc3RyaW5zaWNDYWxpYnJhdGlvblZhbGlkKSB7CisgICAgICAgIC8vIFRoZSBjYW1lcmEgaW50cmluc2ljIGNhbGlicmF0aW9uIGxheW91dCBpcyBhcyBmb2xsb3dzOgorICAgICAgICAvLyBbZm9jYWxMZW5ndGhYLCBmb2NhbExlbmd0aFksIG9wdGljYWxDZW50ZXJYLCBvcHRpY2FsQ2VudGVyWSwgc2tld10KKyAgICAgICAgY29uc3QgZHluYW1pY19kZXB0aDo6UG9pbnQ8ZG91YmxlPiBmb2NhbExlbmd0aChpbnB1dEZyYW1lLm1JbnN0cmluc2ljQ2FsaWJyYXRpb25bMF0sCisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5tSW5zdHJpbnNpY0NhbGlicmF0aW9uWzFdKTsKKyAgICAgICAgc2l6ZV90IHdpZHRoID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aDsKKyAgICAgICAgc2l6ZV90IGhlaWdodCA9IGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0OworICAgICAgICBpZiAoc3dpdGNoRGltZW5zaW9ucykgeworICAgICAgICAgICAgd2lkdGggPSBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodDsKKyAgICAgICAgICAgIGhlaWdodCA9IGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgRGltZW5zaW9uIGltYWdlU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgSW1hZ2luZ01vZGVsUGFyYW1zIGltYWdpbmdQYXJhbXMoZm9jYWxMZW5ndGgsIGltYWdlU2l6ZSk7CisgICAgICAgIGltYWdpbmdQYXJhbXMucHJpbmNpcGFsX3BvaW50LnggPSBpbnB1dEZyYW1lLm1JbnN0cmluc2ljQ2FsaWJyYXRpb25bMl07CisgICAgICAgIGltYWdpbmdQYXJhbXMucHJpbmNpcGFsX3BvaW50LnkgPSBpbnB1dEZyYW1lLm1JbnN0cmluc2ljQ2FsaWJyYXRpb25bM107CisgICAgICAgIGltYWdpbmdQYXJhbXMuc2tldyA9IGlucHV0RnJhbWUubUluc3RyaW5zaWNDYWxpYnJhdGlvbls0XTsKKworICAgICAgICAvLyBUaGUgY2FtZXJhIGxlbnMgZGlzdG9ydGlvbiBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlbnMgY29ycmVjdGlvbiBjb2VmZmljaWVudHMuCisgICAgICAgIC8vIFtrYXBwYV8xLCBrYXBwYV8yLCBrYXBwYV8zIGthcHBhXzQsIGthcHBhXzVdCisgICAgICAgIGlmIChpbnB1dEZyYW1lLm1Jc0xlbnNEaXN0b3J0aW9uVmFsaWQpIHsKKyAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uIHRoZSBsZW5zIGRpc3RvcnRpb24gY29lZmZpY2llbnRzIHNob3VsZCBiZSBvcmRlcmVkCisgICAgICAgICAgICAvLyBhcyBbMSwga2FwcGFfNCwga2FwcGFfMSwga2FwcGFfNSwga2FwcGFfMiwgMCwga2FwcGFfMywgMF0KKyAgICAgICAgICAgIGZsb2F0IGRpc3RvcnRpb25EYXRhW10gPSB7MS5mLCBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvblszXSwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bMF0sIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzRdLAorICAgICAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvblsxXSwgMC5mLCBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvblsyXSwgMC5mfTsKKyAgICAgICAgICAgIGF1dG8gZGlzdG9ydGlvbkRhdGFMZW5ndGggPSBzaXplb2YoZGlzdG9ydGlvbkRhdGEpIC8gc2l6ZW9mKGRpc3RvcnRpb25EYXRhWzBdKTsKKyAgICAgICAgICAgIGltYWdpbmdQYXJhbXMuZGlzdG9ydGlvbi5yZXNlcnZlKGRpc3RvcnRpb25EYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgIGltYWdpbmdQYXJhbXMuZGlzdG9ydGlvbi5pbnNlcnQoaW1hZ2luZ1BhcmFtcy5kaXN0b3J0aW9uLmVuZCgpLCBkaXN0b3J0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgZGlzdG9ydGlvbkRhdGEgKyBkaXN0b3J0aW9uRGF0YUxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBjYW1lcmFQYXJhbXMtPmltYWdpbmdfbW9kZWwgPSBJbWFnaW5nTW9kZWw6OkZyb21EYXRhKGltYWdpbmdQYXJhbXMpOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLm1Jc0xvZ2ljYWwpIHsKKyAgICAgICAgY2FtZXJhUGFyYW1zLT50cmFpdCA9IGR5bmFtaWNfZGVwdGg6OkNhbWVyYVRyYWl0OjpMT0dJQ0FMOworICAgIH0gZWxzZSB7CisgICAgICAgIGNhbWVyYVBhcmFtcy0+dHJhaXQgPSBkeW5hbWljX2RlcHRoOjpDYW1lcmFUcmFpdDo6UEhZU0lDQUw7CisgICAgfQorCisgICAgY2FtZXJhTGlzdC5lbXBsYWNlX2JhY2soQ2FtZXJhOjpGcm9tRGF0YShzdGQ6Om1vdmUoY2FtZXJhUGFyYW1zKSkpOworCisgICAgYXV0byBkZXZpY2VQYXJhbXMgPSBzdGQ6Om1ha2VfdW5pcXVlPERldmljZVBhcmFtcz4gKENhbWVyYXM6OkZyb21DYW1lcmFBcnJheSgmY2FtZXJhTGlzdCkpOworICAgIGRldmljZVBhcmFtcy0+Y29udGFpbmVyID0gQ29udGFpbmVyOjpGcm9tSXRlbXMoJml0ZW1zKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8UHJvZmlsZT4+IHByb2ZpbGVMaXN0OworICAgIHByb2ZpbGVMaXN0LmVtcGxhY2VfYmFjayhQcm9maWxlOjpGcm9tRGF0YSgiRGVwdGhQaG90byIsIHswfSkpOworICAgIGRldmljZVBhcmFtcy0+cHJvZmlsZXMgPSBQcm9maWxlczo6RnJvbVByb2ZpbGVBcnJheSgmcHJvZmlsZUxpc3QpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2U+IGRldmljZSA9IERldmljZTo6RnJvbURhdGEoc3RkOjptb3ZlKGRldmljZVBhcmFtcykpOworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIGNhbWVyYSBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBpbnB1dEpwZWdTdHJlYW0oCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciwgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplKSk7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dHB1dEpwZWdTdHJlYW07CisgICAgaWYgKCFXcml0ZUltYWdlQW5kTWV0YWRhdGFBbmRDb250YWluZXIoJmlucHV0SnBlZ1N0cmVhbSwgZGV2aWNlLmdldCgpLCAmb3V0cHV0SnBlZ1N0cmVhbSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgd3JpdGluZyBkZXB0aCBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpkZXB0aFBob3RvQWN0dWFsU2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4gKG91dHB1dEpwZWdTdHJlYW0udGVsbHAoKSk7CisgICAgaWYgKCpkZXB0aFBob3RvQWN0dWFsU2l6ZSA+IGRlcHRoUGhvdG9CdWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggcGhvdG8gb3V0cHV0IGJ1ZmZlciBub3Qgc3VmZmljaWVudCwgbmVlZGVkICV6dSBhY3R1YWwgJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICpkZXB0aFBob3RvQWN0dWFsU2l6ZSwgZGVwdGhQaG90b0J1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1lbWNweShkZXB0aFBob3RvQnVmZmVyLCBvdXRwdXRKcGVnU3RyZWFtLnN0cigpLmNfc3RyKCksICpkZXB0aFBob3RvQWN0dWFsU2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJmYmZmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfREVQVEhfUFJPQ0VTU09SX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitlbnVtIERlcHRoUGhvdG9PcmllbnRhdGlvbiB7CisgICAgREVQVEhfT1JJRU5UQVRJT05fMF9ERUdSRUVTICAgPSAwLAorICAgIERFUFRIX09SSUVOVEFUSU9OXzkwX0RFR1JFRVMgID0gOTAsCisgICAgREVQVEhfT1JJRU5UQVRJT05fMTgwX0RFR1JFRVMgPSAxODAsCisgICAgREVQVEhfT1JJRU5UQVRJT05fMjcwX0RFR1JFRVMgPSAyNzAsCit9OworCitzdHJ1Y3QgRGVwdGhQaG90b0lucHV0RnJhbWUgeworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICBtTWFpbkpwZWdCdWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1NYWluSnBlZ1NpemU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1NYWluSnBlZ1dpZHRoLCBtTWFpbkpwZWdIZWlnaHQ7CisgICAgdWludDE2X3QqICAgICAgICAgICAgIG1EZXB0aE1hcEJ1ZmZlcjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbURlcHRoTWFwV2lkdGgsIG1EZXB0aE1hcEhlaWdodCwgbURlcHRoTWFwU3RyaWRlOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTWF4SnBlZ1NpemU7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1KcGVnUXVhbGl0eTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbUlzTG9naWNhbDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgbUluc3RyaW5zaWNDYWxpYnJhdGlvbls1XTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbUlzSW5zdHJpbnNpY0NhbGlicmF0aW9uVmFsaWQ7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbls1XTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbUlzTGVuc0Rpc3RvcnRpb25WYWxpZDsKKyAgICBEZXB0aFBob3RvT3JpZW50YXRpb24gbU9yaWVudGF0aW9uOworCisgICAgRGVwdGhQaG90b0lucHV0RnJhbWUoKSA6CisgICAgICAgICAgICBtTWFpbkpwZWdCdWZmZXIobnVsbHB0ciksCisgICAgICAgICAgICBtTWFpbkpwZWdTaXplKDApLAorICAgICAgICAgICAgbU1haW5KcGVnV2lkdGgoMCksCisgICAgICAgICAgICBtTWFpbkpwZWdIZWlnaHQoMCksCisgICAgICAgICAgICBtRGVwdGhNYXBCdWZmZXIobnVsbHB0ciksCisgICAgICAgICAgICBtRGVwdGhNYXBXaWR0aCgwKSwKKyAgICAgICAgICAgIG1EZXB0aE1hcEhlaWdodCgwKSwKKyAgICAgICAgICAgIG1EZXB0aE1hcFN0cmlkZSgwKSwKKyAgICAgICAgICAgIG1NYXhKcGVnU2l6ZSgwKSwKKyAgICAgICAgICAgIG1KcGVnUXVhbGl0eSgxMDApLAorICAgICAgICAgICAgbUlzTG9naWNhbCgwKSwKKyAgICAgICAgICAgIG1JbnN0cmluc2ljQ2FsaWJyYXRpb257MC5mfSwKKyAgICAgICAgICAgIG1Jc0luc3RyaW5zaWNDYWxpYnJhdGlvblZhbGlkKDApLAorICAgICAgICAgICAgbUxlbnNEaXN0b3J0aW9uezAuZn0sCisgICAgICAgICAgICBtSXNMZW5zRGlzdG9ydGlvblZhbGlkKDApLAorICAgICAgICAgICAgbU9yaWVudGF0aW9uKERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMF9ERUdSRUVTKSB7fQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmtEZXB0aFBob3RvTGlicmFyeSA9ICJsaWJkZXB0aHBob3RvLnNvIjsKK3N0YXRpYyBjb25zdCBjaGFyICprRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbiA9ICJwcm9jZXNzRGVwdGhQaG90b0ZyYW1lIjsKK3R5cGVkZWYgaW50ICgqcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSkgKERlcHRoUGhvdG9JbnB1dEZyYW1lIC8qaW5wdXRGcmFtZSovLAorICAgICAgICBzaXplX3QgLypkZXB0aFBob3RvQnVmZmVyU2l6ZSovLCB2b2lkKiAvKmRlcHRoUGhvdG9CdWZmZXIgb3V0Ki8sCisgICAgICAgIHNpemVfdCogLypkZXB0aFBob3RvQWN0dWFsU2l6ZSBvdXQqLyk7CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAKaW5kZXggOGM4Yjk3YS4uZDZiZjgzZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAKQEAgLTIzNyw3ICsyMzcsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzQnVmZmVyTWFuYWdlcjo6Z2V0QnVmZmVyRm9yU3RyZWFtKGludCBzdHJlYW1JZCwgaW50IHN0cmVhbVNldElkLAotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiogZ2IsIGludCogZmVuY2VGZCkgeworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiogZ2IsIGludCogZmVuY2VGZCwgYm9vbCBub0ZyZWVCdWZmZXJBdENvbnN1bWVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTI1MywxNCArMjUzLDE5IEBACiAgICAgU3RyZWFtU2V0ICZzdHJlYW1TZXQgPSBtU3RyZWFtU2V0TWFwLmVkaXRWYWx1ZUZvcihzdHJlYW1TZXRJZCk7CiAgICAgQnVmZmVyQ291bnRNYXAmIGhhbmRPdXRCdWZmZXJDb3VudHMgPSBzdHJlYW1TZXQuaGFuZG91dEJ1ZmZlckNvdW50TWFwOwogICAgIHNpemVfdCYgYnVmZmVyQ291bnQgPSBoYW5kT3V0QnVmZmVyQ291bnRzLmVkaXRWYWx1ZUZvcihzdHJlYW1JZCk7CisgICAgQnVmZmVyQ291bnRNYXAmIGF0dGFjaGVkQnVmZmVyQ291bnRzID0gc3RyZWFtU2V0LmF0dGFjaGVkQnVmZmVyQ291bnRNYXA7CisgICAgc2l6ZV90JiBhdHRhY2hlZEJ1ZmZlckNvdW50ID0gYXR0YWNoZWRCdWZmZXJDb3VudHMuZWRpdFZhbHVlRm9yKHN0cmVhbUlkKTsKKworICAgIGlmIChub0ZyZWVCdWZmZXJBdENvbnN1bWVyKSB7CisgICAgICAgIGF0dGFjaGVkQnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDsKKyAgICB9CisKICAgICBpZiAoYnVmZmVyQ291bnQgPj0gc3RyZWFtU2V0Lm1heEFsbG93ZWRCdWZmZXJDb3VudCkgewogICAgICAgICBBTE9HRSgiJXM6IGJ1ZmZlckNvdW50ICglenUpIGV4Y2VlZHMgdGhlIG1heCBhbGxvd2VkIGJ1ZmZlciBjb3VudCAoJXp1KSBvZiB0aGlzIHN0cmVhbSBzZXQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyQ291bnQsIHN0cmVhbVNldC5tYXhBbGxvd2VkQnVmZmVyQ291bnQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgQnVmZmVyQ291bnRNYXAmIGF0dGFjaGVkQnVmZmVyQ291bnRzID0gc3RyZWFtU2V0LmF0dGFjaGVkQnVmZmVyQ291bnRNYXA7Ci0gICAgc2l6ZV90JiBhdHRhY2hlZEJ1ZmZlckNvdW50ID0gYXR0YWNoZWRCdWZmZXJDb3VudHMuZWRpdFZhbHVlRm9yKHN0cmVhbUlkKTsKICAgICBpZiAoYXR0YWNoZWRCdWZmZXJDb3VudCA+IGJ1ZmZlckNvdW50KSB7CiAgICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgYXR0YWNoZWQgbW9yZSBidWZmZXJzIHRvIHRoaXMgc3RyZWFtIHRoYW4gd2UgY3VycmVudGx5IGhhdmUKICAgICAgICAgLy8gb3V0c3RhbmRpbmcsIHNvIGhhdmUgdGhlIHN0cmVhbSBqdXN0IHVzZSBhbiBhbHJlYWR5LWF0dGFjaGVkIGJ1ZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5oCmluZGV4IDAyNTA2MmUuLmYwZGUxYzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmgKQEAgLTExMiw2ICsxMTIsMTAgQEAKICAgICAgKgogICAgICAqIEFmdGVyIHRoaXMgY2FsbCwgdGhlIGNsaWVudCB0YWtlcyBvdmVyIHRoZSBvd25lcnNoaXAgb2YgdGhpcyBidWZmZXIgaWYgaXQgaXMgbm90IGZyZWVkLgogICAgICAqCisgICAgICogU29tZXRpbWVzIGZyZWUgYnVmZmVycyBhcmUgZGlzY2FyZGVkIGZyb20gY29uc3VtZXIgc2lkZSBhbmQgdGhlIGRlcXVldWVCdWZmZXIgY2FsbCByZXR1cm5zCisgICAgICogVElNRURfT1VULCBpbiB0aGlzIGNhc2UgY2FsbGluZyBnZXRCdWZmZXJGb3JTdHJlYW0gYWdhaW4gd2l0aCBub0ZyZWVCdWZmZXJBdENvbnN1bWVyIHNldCB0bworICAgICAqIHRydWUgd2lsbCBub3RpZnkgYnVmZmVyIG1hbmFnZXIgdG8gdXBkYXRlIGl0cyBzdGF0ZXMgYW5kIGFsc28gdHJpZXMgdG8gYWxsb2NhdGUgYSBuZXcgYnVmZmVyLgorICAgICAqCiAgICAgICogUmV0dXJuIHZhbHVlczoKICAgICAgKgogICAgICAqICBPSzogICAgICAgIEdldHRpbmcgYnVmZmVyIGZvciB0aGlzIHN0cmVhbSB3YXMgc3VjY2Vzc2Z1bC4KQEAgLTEyMiw3ICsxMjYsOSBAQAogICAgICAqICAgICAgICAgICAgIHRvIHRoaXMgYnVmZmVyIG1hbmFnZXIgYmVmb3JlLgogICAgICAqICBOT19NRU1PUlk6IFVuYWJsZSB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhpcyBzdHJlYW0gYXQgdGhpcyB0aW1lLgogICAgICAqLwotICAgIHN0YXR1c190IGdldEJ1ZmZlckZvclN0cmVhbShpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCwgc3A8R3JhcGhpY0J1ZmZlcj4qIGdiLCBpbnQqIGZlbmNlRmQpOworICAgIHN0YXR1c190IGdldEJ1ZmZlckZvclN0cmVhbSgKKyAgICAgICAgICAgIGludCBzdHJlYW1JZCwgaW50IHN0cmVhbVNldElkLCBzcDxHcmFwaGljQnVmZmVyPiogZ2IsIGludCogZmVuY2VGZCwKKyAgICAgICAgICAgIGJvb2wgbm9GcmVlQnVmZmVyQXRDb25zdW1lciA9IGZhbHNlKTsKIAogICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIHRoZSBtYW5hZ2VyIHRoYXQgYSBidWZmZXIgaGFzIGJlZW4gcmVsZWFzZWQgYnkgdGhlIGNvbnN1bWVyLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKaW5kZXggYjIwMTExOS4uMjJlMDllNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCkBAIC01Niw2ICs1Niw5IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKKworI2luY2x1ZGUgPHR1cGxlPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwpAQCAtNzgsMTEgKzgxLDEwIEBACiAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGlzdGVuZXIoTlVMTCksCiAgICAgICAgIG1WZW5kb3JUYWdJZChDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQpLAotICAgICAgICBtTGFzdFRlbXBsYXRlSWQoLTEpCisgICAgICAgIG1MYXN0VGVtcGxhdGVJZCgtMSksCisgICAgICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyhmYWxzZSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGNhbWVyYTNfY2FsbGJhY2tfb3BzOjpub3RpZnkgPSAmc05vdGlmeTsKLSAgICBjYW1lcmEzX2NhbGxiYWNrX29wczo6cHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCA9ICZzUHJvY2Vzc0NhcHR1cmVSZXN1bHQ7CiAgICAgQUxPR1YoIiVzOiBDcmVhdGVkIGRldmljZSBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwogfQogCkBAIC05MCw3ICs5Miw3IEBACiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IFRlYXJpbmcgZG93biBmb3IgY2FtZXJhIGlkICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwotICAgIGRpc2Nvbm5lY3QoKTsKKyAgICBkaXNjb25uZWN0SW1wbCgpOwogfQogCiBjb25zdCBTdHJpbmc4JiBDYW1lcmEzRGV2aWNlOjpnZXRJZCgpIGNvbnN0IHsKQEAgLTEyNyw3ICsxMjksNyBAQAogICAgIH0KIAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICBib29sIGlzTG9naWNhbCA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKG1EZXZpY2VJbmZvLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgIGJvb2wgaXNMb2dpY2FsID0gbWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1JZC5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKICAgICBpZiAoaXNMb2dpY2FsKSB7CiAgICAgICAgIGZvciAoYXV0byYgcGh5c2ljYWxJZCA6IHBoeXNpY2FsQ2FtZXJhSWRzKSB7CiAgICAgICAgICAgICByZXMgPSBtYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MocGh5c2ljYWxJZCwgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOwpAQCAtMTgxLDcgKzE4MywxNCBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBidWZNZ3JNb2RlID0KKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OKTsKKyAgICBpZiAoYnVmTWdyTW9kZS5jb3VudCA+IDApIHsKKyAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyID0gKGJ1Zk1nck1vZGUuZGF0YS51OFswXSA9PQorICAgICAgICAgICAgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OX0hJRExfREVWSUNFXzNfNSk7CisgICAgfQorCisgICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUsIG1Vc2VIYWxCdWZNYW5hZ2VyKTsKICAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7CiAgICAgbVZlbmRvclRhZ0lkID0gbWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChtSWQuc3RyaW5nKCkpOwogICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKQEAgLTE4OSw2ICsxOTgsMjggQEAKICAgICAgICAgbVRhZ01vbml0b3IucGFyc2VUYWdzVG9Nb25pdG9yKFN0cmluZzgobW9uaXRvclRhZ3MpKTsKICAgICB9CiAKKyAgICAvLyBNZXRhZGF0YSB0YWdzIG5lZWRzIGZpeHVwIGZvciBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UgdmVyc2lvbiBsZXNzCisgICAgLy8gdGhhbiAzLjUuCisgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uezAsMH07CisgICAgcmVzID0gbWFuYWdlci0+Z2V0SGlnaGVzdFN1cHBvcnRlZFZlcnNpb24obUlkLnN0cmluZygpLCAmbWF4VmVyc2lvbik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluIGdldHRpbmcgY2FtZXJhIGRldmljZSB2ZXJzaW9uIGlkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigKKyAgICAgICAgICAgIG1heFZlcnNpb24uZ2V0X21ham9yKCksIG1heFZlcnNpb24uZ2V0X21pbm9yKCkpOworCisgICAgYm9vbCBpc01vbm9jaHJvbWUgPSBmYWxzZTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeSA9IG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FKSB7CisgICAgICAgICAgICBpc01vbm9jaHJvbWUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyA9IChpc01vbm9jaHJvbWUgJiYgZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181KTsKKwogICAgIHJldHVybiBpbml0aWFsaXplQ29tbW9uTG9ja2VkKCk7CiB9CiAKQEAgLTIwOCw2ICsyMzksMTcgQEAKICAgICAvKiogUmVnaXN0ZXIgaW4tZmxpZ2h0IG1hcCB0byB0aGUgc3RhdHVzIHRyYWNrZXIgKi8KICAgICBtSW5GbGlnaHRTdGF0dXNJZCA9IG1TdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIAorICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICByZXMgPSBtUmVxdWVzdEJ1ZmZlclNNLmluaXRpYWxpemUobVN0YXR1c1RyYWNrZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0IGJ1ZmZlciBzdGF0ZSBtYWNoaW5lOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBtSW50ZXJmYWNlLT5jbG9zZSgpOworICAgICAgICAgICAgbVN0YXR1c1RyYWNrZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiogQ3JlYXRlIGJ1ZmZlciBtYW5hZ2VyICovCiAgICAgbUJ1ZmZlck1hbmFnZXIgPSBuZXcgQ2FtZXJhM0J1ZmZlck1hbmFnZXIoKTsKIApAQCAtMjE3LDggKzI1OSwxMCBAQAogICAgIGlmIChzZXNzaW9uS2V5c0VudHJ5LmNvdW50ID4gMCkgewogICAgICAgICBzZXNzaW9uUGFyYW1LZXlzLmluc2VydEFycmF5QXQoc2Vzc2lvbktleXNFbnRyeS5kYXRhLmkzMiwgMCwgc2Vzc2lvbktleXNFbnRyeS5jb3VudCk7CiAgICAgfQorCiAgICAgLyoqIFN0YXJ0IHVwIHJlcXVlc3QgcXVldWUgdGhyZWFkICovCi0gICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCh0aGlzLCBtU3RhdHVzVHJhY2tlciwgbUludGVyZmFjZSwgc2Vzc2lvblBhcmFtS2V5cyk7CisgICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCgKKyAgICAgICAgICAgIHRoaXMsIG1TdGF0dXNUcmFja2VyLCBtSW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLCBtVXNlSGFsQnVmTWFuYWdlcik7CiAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnJ1bihTdHJpbmc4Ojpmb3JtYXQoIkMzRGV2LSVzLVJlcVF1ZXVlIiwgbUlkLnN0cmluZygpKS5zdHJpbmcoKSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0IHF1ZXVlIHRocmVhZDogJXMgKCVkKSIsCkBAIC0yNzAsMTEgKzMxNCwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGlzY29ubmVjdCgpIHsKKyAgICByZXR1cm4gZGlzY29ubmVjdEltcGwoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGlzY29ubmVjdEltcGwoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogCkBAIC0zNDEsNiArMzg4LDcgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICAgICAgbVJlcXVlc3RUaHJlYWQuY2xlYXIoKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIHN0TG9jayhtVHJhY2tlckxvY2spOwogICAgICAgICBtU3RhdHVzVHJhY2tlci5jbGVhcigpOwogICAgICAgICBpbnRlcmZhY2UgPSBtSW50ZXJmYWNlLmdldCgpOwogICAgIH0KQEAgLTgzOSwxNCArODg3LDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gcmVxdWVzdHNMaXN0OwogICAgIHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiBzdXJmYWNlTWFwczsKICAgICBjb252ZXJ0VG9SZXF1ZXN0TGlzdChyZXF1ZXN0c0xpc3QsIHN1cmZhY2VNYXBzLCByZXF1ZXN0KTsKIAotICAgIHJldHVybiBjYXB0dXJlTGlzdChyZXF1ZXN0c0xpc3QsIHN1cmZhY2VNYXBzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7CisgICAgcmV0dXJuIGNhcHR1cmVMaXN0KHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6Y29udmVydFRvUmVxdWVzdExpc3QoTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4mIHJlcXVlc3RzTGlzdCwKQEAgLTkxMyw2ICs5NjEsMjMyIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAoraGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0U3RhdHVzOworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmV0OworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrKTsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXJSZXQ+IGJ1ZlJldHM7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlbWVudCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gc3RyZWFtSWRzOworICAgIHNzaXplX3Qgc3ogPSBzdHJlYW1JZHMuc2V0Q2FwYWNpdHkoYnVmUmVxcy5zaXplKCkpOworICAgIGlmIChzeiA8IDAgfHwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzeikgIT0gYnVmUmVxcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlenUgYnVmZmVyIHJlcXVlc3RzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgaWYgKGJ1ZlJlcXMuc2l6ZSgpID4gbU91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogdG9vIG1hbnkgYnVmZmVyIHJlcXVlc3RzICglenUgPiAjIG9mIG91dHB1dCBzdHJlYW1zICV6dSkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxcy5zaXplKCksIG1PdXRwdXRTdHJlYW1zLnNpemUoKSk7CisgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciByZXBlYXRlZCBzdHJlYW1JZAorICAgIGZvciAoY29uc3QgYXV0byYgYnVmUmVxIDogYnVmUmVxcykgeworICAgICAgICBpZiAoc3RyZWFtSWRzLmluZGV4T2YoYnVmUmVxLnN0cmVhbUlkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIGJ1ZmZlciByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1JZHMuYWRkKGJ1ZlJlcS5zdHJlYW1JZCk7CisgICAgfQorCisgICAgaWYgKCFtUmVxdWVzdEJ1ZmZlclNNLnN0YXJ0UmVxdWVzdEJ1ZmZlcigpKSB7CisgICAgICAgIEFMT0dFKCIlczogcmVxdWVzdCBidWZmZXIgZGlzYWxsb3dlZCB3aGlsZSBjYW1lcmEgc2VydmljZSBpcyBjb25maWd1cmluZyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgYnVmUmV0cy5yZXNpemUoYnVmUmVxcy5zaXplKCkpOworCisgICAgYm9vbCBhbGxSZXFzU3VjY2VlZHMgPSB0cnVlOworICAgIGJvb2wgb25lUmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZlJlcXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgYXV0byYgYnVmUmVxID0gYnVmUmVxc1tpXTsKKyAgICAgICAgYXV0byYgYnVmUmV0ID0gYnVmUmV0c1tpXTsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IGJ1ZlJlcS5zdHJlYW1JZDsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlclJldD4gZW1wdHlCdWZSZXRzOworICAgICAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBlbXB0eUJ1ZlJldHMpOworICAgICAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5lbmRSZXF1ZXN0QnVmZmVyKCk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQWJhbmRvbmVkKCkpIHsKKyAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBidWZSZXQuc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgc2l6ZV90IGhhbmRPdXRCdWZmZXJDb3VudCA9IG91dHB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKTsKKyAgICAgICAgdWludDMyX3QgbnVtQnVmZmVyc1JlcXVlc3RlZCA9IGJ1ZlJlcS5udW1CdWZmZXJzUmVxdWVzdGVkOworICAgICAgICBzaXplX3QgdG90YWxIYW5kb3V0ID0gaGFuZE91dEJ1ZmZlckNvdW50ICsgbnVtQnVmZmVyc1JlcXVlc3RlZDsKKyAgICAgICAgdWludDMyX3QgbWF4QnVmZmVycyA9IG91dHB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKS0+bWF4X2J1ZmZlcnM7CisgICAgICAgIGlmICh0b3RhbEhhbmRvdXQgPiBtYXhCdWZmZXJzKSB7CisgICAgICAgICAgICAvLyBOb3QgYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggYnVmZmVyLiBFeGl0IGVhcmx5IGZvciB0aGlzIHN0cmVhbQorICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRvbyBtdWNoIGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogYXQgSEFMOiAlenUgKyByZXF1ZXN0aW5nOiAlZCIKKyAgICAgICAgICAgICAgICAgICAgIiA+IG1heDogJWQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBoYW5kT3V0QnVmZmVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQsIG1heEJ1ZmZlcnMpOworICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok1BWF9CVUZGRVJfRVhDRUVERUQpOworICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXI+IHRtcFJldEJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7CisgICAgICAgIGJvb2wgY3VycmVudFJlcVN1Y2NlZWRzID0gdHJ1ZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IHN0cmVhbUJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7CisgICAgICAgIHNpemVfdCBudW1BbGxvY2F0ZWRCdWZmZXJzID0gMDsKKyAgICAgICAgc2l6ZV90IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVycyA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtQnVmZmVyc1JlcXVlc3RlZDsgYisrKSB7CisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOworICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBtZXRob2QgY2FuIHJ1biBjb25jdXJyZW50bHkgd2l0aCByZXF1ZXN0IHRocmVhZAorICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHdhaXQgZHVyYXRpb24gZXZlcnl0aW1lIHdlIGNhbGwgZ2V0YnVmZmVyCisgICAgICAgICAgICBuc2Vjc190IHdhaXREdXJhdGlvbiA9IGtCYXNlR2V0QnVmZmVyV2FpdCArIGdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJnNiLCB3YWl0RHVyYXRpb24pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgfHwgcmVzID09IERFQURfT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSBUSU1FRF9PVVQgfHwgcmVzID09IE5PX01FTU9SWSkgeworICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6Tk9fQlVGRkVSX0FWQUlMQUJMRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyZW50UmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bUFsbG9jYXRlZEJ1ZmZlcnMrKzsKKworICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIgPSBzYi5idWZmZXI7CisgICAgICAgICAgICBhdXRvIHBhaXIgPSBtSW50ZXJmYWNlLT5nZXRCdWZmZXJJZCgqYnVmZmVyLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBTdHJlYW1CdWZmZXImIGhCdWYgPSB0bXBSZXRCdWZmZXJzW2JdOworCisgICAgICAgICAgICBoQnVmLnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICBoQnVmLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBoQnVmLmJ1ZmZlciA9IChpc05ld0J1ZmZlcikgPyAqYnVmZmVyIDogbnVsbHB0cjsKKyAgICAgICAgICAgIGhCdWYuc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGhCdWYucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKKworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKHNiLmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNiLmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoQnVmLmFjcXVpcmVGZW5jZS5zZXRUbyhhY3F1aXJlRmVuY2UsIC8qc2hvdWxkT3duKi90cnVlKTsKKyAgICAgICAgICAgIGhCdWYucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKKworICAgICAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWZmZXJJZCwgYnVmZmVyLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBnZXQgcmVnaXN0ZXIgcmVxdWVzdCBidWZmZXJzIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgIGN1cnJlbnRSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRSZXFTdWNjZWVkcykgeworICAgICAgICAgICAgYnVmUmV0LnZhbC5idWZmZXJzKHN0ZDo6bW92ZSh0bXBSZXRCdWZmZXJzKSk7CisgICAgICAgICAgICBvbmVSZXFTdWNjZWVkcyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzOyBiKyspIHsKKyAgICAgICAgICAgICAgICBTdHJlYW1CdWZmZXImIGhCdWYgPSB0bXBSZXRCdWZmZXJzW2JdOworICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihoQnVmLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIiVzOiBwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIgZmFpbGVkIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtQWxsb2NhdGVkQnVmZmVyczsgYisrKSB7CisgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QmIHNiID0gc3RyZWFtQnVmZmVyc1tiXTsKKyAgICAgICAgICAgICAgICBzYi5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhzdHJlYW1CdWZmZXJzLmRhdGEoKSwgbnVtQWxsb2NhdGVkQnVmZmVycywgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfaGlkbF9jYihhbGxSZXFzU3VjY2VlZHMgPyBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpPSyA6CisgICAgICAgICAgICBvbmVSZXFTdWNjZWVkcyA/IEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9QQVJUSUFMIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX1VOS05PV04sCisgICAgICAgICAgICBidWZSZXRzKTsKKyAgICBtUmVxdWVzdEJ1ZmZlclNNLmVuZFJlcXVlc3RCdWZmZXIoKTsKKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlcm1lbnQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBidWYgOiBidWZmZXJzKSB7CisgICAgICAgIGlmIChidWYuYnVmZmVySWQgPT0gSGFsSW50ZXJmYWNlOjpCVUZGRVJfSURfTk9fQlVGRkVSKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCByZXR1cm4gYSBidWZmZXIgd2l0aG91dCBidWZmZXJJZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBmaW5kIGluLWZsaWdodCBidWZmZXIgJSIgUFJJdTY0ICIgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmLmJ1ZmZlcklkLCBidWYuc3RyZWFtSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzdHJlYW1CdWZmZXI7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5idWZmZXIgPSBidWZmZXI7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisKKyAgICAgICAgaWYgKGJ1Zi5yZWxlYXNlRmVuY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChidWYucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgeworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSBkdXAoYnVmLnJlbGVhc2VGZW5jZS0+ZGF0YVswXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcmVsZWFzZSBmZW5jZSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWYucmVsZWFzZUZlbmNlLT5udW1GZHMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoYnVmLnN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgYnVmLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoJnN0cmVhbUJ1ZmZlciwgLypzaXplKi8xLCAvKnRpbWVzdGFtcCovIDApOworICAgIH0KKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKwogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CkBAIC0xMDYxLDI3ICsxMzM1LDUxIEBACiAgICAgICAgIGF1dG8mIGJEc3QgPSBvdXRwdXRCdWZmZXJzW2ldOwogICAgICAgICBjb25zdCBTdHJlYW1CdWZmZXIgJmJTcmMgPSByZXN1bHQub3V0cHV0QnVmZmVyc1tpXTsKIAotICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoYlNyYy5zdHJlYW1JZCk7Ci0gICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGJTcmMuc3RyZWFtSWQpOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IEludmFsaWQgb3V0cHV0IHN0cmVhbSBpZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBiRHN0LnN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaWR4KS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgYkRzdC5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CiAKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXI7Ci0gICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0QnVmZmVyKHJlc3VsdC5mcmFtZU51bWJlciwgYlNyYy5zdHJlYW1JZCwgJmJ1ZmZlcik7CisgICAgICAgIGJvb2wgbm9CdWZmZXJSZXR1cm5lZCA9IGZhbHNlOworICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBzdXNwaWNpb3VzIG1vc3Qgb2YgdGhlIHRpbWUgYnV0IGNhbiBiZSBjb3JyZWN0IGR1cmluZyBmbHVzaCB3aGVyZSBIQUwKKyAgICAgICAgICAgIC8vIGhhcyB0byByZXR1cm4gY2FwdHVyZSByZXN1bHQgYmVmb3JlIGEgYnVmZmVyIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKGJTcmMuYnVmZmVySWQgPT0gSGFsSW50ZXJmYWNlOjpCVUZGRVJfSURfTk9fQlVGRkVSKSB7CisgICAgICAgICAgICAgICAgaWYgKGJTcmMuc3RhdHVzID09IEJ1ZmZlclN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogTm8gYnVmZmVySWQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICAvLyBTdGlsbCBwcm9jZWVkcyBzbyBvdGhlciBidWZmZXJzIGNhbiBiZSByZXR1cm5lZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub0J1ZmZlclJldHVybmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub0J1ZmZlclJldHVybmVkKSB7CisgICAgICAgICAgICAgICAgcmVzID0gT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihiU3JjLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0QnVmZmVyKHJlc3VsdC5mcmFtZU51bWJlciwgYlNyYy5zdHJlYW1JZCwgJmJ1ZmZlcik7CisgICAgICAgIH0KKwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBObyBpbi1mbGlnaHQgYnVmZmVyIGZvciBzdHJlYW0gJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKwogICAgICAgICBiRHN0LmJ1ZmZlciA9IGJ1ZmZlcjsKICAgICAgICAgYkRzdC5zdGF0dXMgPSBtYXBIaWRsQnVmZmVyU3RhdHVzKGJTcmMuc3RhdHVzKTsKICAgICAgICAgYkRzdC5hY3F1aXJlX2ZlbmNlID0gLTE7CiAgICAgICAgIGlmIChiU3JjLnJlbGVhc2VGZW5jZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBiRHN0LnJlbGVhc2VfZmVuY2UgPSAtMTsKICAgICAgICAgfSBlbHNlIGlmIChiU3JjLnJlbGVhc2VGZW5jZS0+bnVtRmRzID09IDEpIHsKKyAgICAgICAgICAgIGlmIChub0J1ZmZlclJldHVybmVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBnb3QgcmVsZWFzZUZlbmNlIHdpdGhvdXQgb3V0cHV0IGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYkRzdC5yZWxlYXNlX2ZlbmNlID0gZHVwKGJTcmMucmVsZWFzZUZlbmNlLT5kYXRhWzBdKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgcmVsZWFzZSBmZW5jZSBmb3IgYnVmZmVyICV6dSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKQEAgLTExNTcsMTMgKzE0NTUsMTMgQEAKICAgICAgICAgICAgIG0udHlwZSA9IENBTUVSQTNfTVNHX0VSUk9SOwogICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciA9IG1zZy5tc2cuZXJyb3IuZnJhbWVOdW1iZXI7CiAgICAgICAgICAgICBpZiAobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkID49IDApIHsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgZXJyb3Igc3RyZWFtIGlkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgZXJyb3Igc3RyZWFtIGlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaWR4KS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gbnVsbHB0cjsKICAgICAgICAgICAgIH0KQEAgLTEzNDQsNiArMTY0Miw1NiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjphZGQoCisgICAgICAgIGludCBzdHJlYW1JZCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtKSB7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGFkZCBudWxsIHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEuYWRkKHN0cmVhbUlkLCBzdHJlYW0pOworfQorCitzc2l6ZV90IENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6cmVtb3ZlKGludCBzdHJlYW1JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEucmVtb3ZlSXRlbShzdHJlYW1JZCk7Cit9CisKK3NwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+CitDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmdldChpbnQgc3RyZWFtSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgc3NpemVfdCBpZHggPSBtRGF0YS5pbmRleE9mS2V5KHN0cmVhbUlkKTsKKyAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbURhdGEuZWRpdFZhbHVlQXQoaWR4KTsKK30KKworc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4KK0NhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6b3BlcmF0b3JbXSAoc2l6ZV90IGluZGV4KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5lZGl0VmFsdWVBdChpbmRleCk7Cit9CisKK3NpemVfdCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OnNpemUoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5zaXplKCk7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpjbGVhcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLmNsZWFyKCk7Cit9CisKK3N0ZDo6dmVjdG9yPGludD4gQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpnZXRTdHJlYW1JZHMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHN0ZDo6dmVjdG9yPGludD4gc3RyZWFtSWRzKG1EYXRhLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGF0YS5zaXplKCk7IGkrKykgeworICAgICAgICBzdHJlYW1JZHNbaV0gPSBtRGF0YS5rZXlBdChpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbUlkczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKQEAgLTE0MjIsMTggKzE3NzAsMjAgQEAKIAogICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CiAgICAgICAgIHNzaXplX3QgYmxvYkJ1ZmZlclNpemU7Ci0gICAgICAgIGlmIChkYXRhU3BhY2UgIT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgewotICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSBnZXRKcGVnQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGlmIChibG9iQnVmZmVyU2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwgYmxvYkJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkYXRhU3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgewogICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSBnZXRQb2ludENsb3VkQnVmZmVyU2l6ZSgpOwogICAgICAgICAgICAgaWYgKGJsb2JCdWZmZXJTaXplIDw9IDApIHsKICAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQgcG9pbnQgY2xvdWQgYnVmZmVyIHNpemUgJXpkIiwgYmxvYkJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGF0YVNwYWNlID09IHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0pQRUdfQVBQX1NFR01FTlRTKSkgeworICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBpZiAoYmxvYkJ1ZmZlclNpemUgPD0gMCkgeworICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBqcGVnIGJ1ZmZlciBzaXplICV6ZCIsIGJsb2JCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyc1swXSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBibG9iQnVmZmVyU2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLApAQCAtMTQ1MCw3ICsxODAwLDggQEAKICAgICB9IGVsc2UgaWYgKGlzU2hhcmVkKSB7CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVycywKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtU2V0SWQpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKTsKICAgICB9IGVsc2UgaWYgKGNvbnN1bWVycy5zaXplKCkgPT0gMCAmJiBoYXNEZWZlcnJlZENvbnN1bWVyKSB7CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBjb25zdW1lclVzYWdlLCBkYXRhU3BhY2UsIHJvdGF0aW9uLApAQCAtMTUyNywyMCArMTg3OCwyMCBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShpZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgdW5rbm93biIsIGlkKTsKLSAgICAgICAgcmV0dXJuIGlkeDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJlYW1JbmZvLT53aWR0aCAgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRXaWR0aCgpOwotICAgIHN0cmVhbUluZm8tPmhlaWdodCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldEhlaWdodCgpOwotICAgIHN0cmVhbUluZm8tPmZvcm1hdCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldEZvcm1hdCgpOwotICAgIHN0cmVhbUluZm8tPmRhdGFTcGFjZSA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldERhdGFTcGFjZSgpOwotICAgIHN0cmVhbUluZm8tPmZvcm1hdE92ZXJyaWRkZW4gPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKTsKLSAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbEZvcm1hdCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldE9yaWdpbmFsRm9ybWF0KCk7Ci0gICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlT3ZlcnJpZGRlbiA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpOwotICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRGF0YVNwYWNlID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKTsKKyAgICBzdHJlYW1JbmZvLT53aWR0aCAgPSBzdHJlYW0tPmdldFdpZHRoKCk7CisgICAgc3RyZWFtSW5mby0+aGVpZ2h0ID0gc3RyZWFtLT5nZXRIZWlnaHQoKTsKKyAgICBzdHJlYW1JbmZvLT5mb3JtYXQgPSBzdHJlYW0tPmdldEZvcm1hdCgpOworICAgIHN0cmVhbUluZm8tPmRhdGFTcGFjZSA9IHN0cmVhbS0+Z2V0RGF0YVNwYWNlKCk7CisgICAgc3RyZWFtSW5mby0+Zm9ybWF0T3ZlcnJpZGRlbiA9IHN0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCk7CisgICAgc3RyZWFtSW5mby0+b3JpZ2luYWxGb3JtYXQgPSBzdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCk7CisgICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlT3ZlcnJpZGRlbiA9IHN0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCk7CisgICAgc3RyZWFtSW5mby0+b3JpZ2luYWxEYXRhU3BhY2UgPSBzdHJlYW0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNTY3LDE0ICsxOTE4LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLAotICAgICAgICAgICAgICAgIGlkKTsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwgaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLQotICAgIHJldHVybiBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAgICByZXR1cm4gc3RyZWFtLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGVsZXRlU3RyZWFtKGludCBpZCkgewpAQCAtMTU5OSwyMSArMTk0OCwyMSBAQAogICAgIH0KIAogICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpOwogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKICAgICAgICAgZGVsZXRlZFN0cmVhbSA9IG1JbnB1dFN0cmVhbTsKICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gRGVsZXRlIG91dHB1dCBzdHJlYW0gb3IgdGhlIG91dHB1dCBwYXJ0IG9mIGEgYmktZGlyZWN0aW9uYWwgc3RyZWFtLgotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggIT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0gICAgICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZUl0ZW0oaWQpOworICAgIGlmIChzdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICBkZWxldGVkU3RyZWFtID0gc3RyZWFtOworICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUoaWQpOwogICAgIH0KIAogICAgIC8vIEZyZWUgdXAgdGhlIHN0cmVhbSBlbmRwb2ludCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHNvbWUgb3RoZXIgc3RyZWFtCkBAIC0xNjk2LDcgKzIwNDUsNyBAQAogCiAgICAgaWYgKHRlbXBsYXRlSWQgPD0gMCB8fCB0ZW1wbGF0ZUlkID49IENBTUVSQTNfVEVNUExBVEVfQ09VTlQpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coQ2FtZXJhU2VydmljZTo6U05fRVZFTlRfTE9HX0lELCAiMjY4NjYxMTAiLAotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xODU0LDYgKzIyMDMsMTQgQEAKIAogICAgIG1TdGF0dXNXYWl0ZXJzKys7CiAKKyAgICBpZiAoIWFjdGl2ZSAmJiBtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBhdXRvIHN0cmVhbUlkcyA9IG1PdXRwdXRTdHJlYW1zLmdldFN0cmVhbUlkcygpOworICAgICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBtUmVxdWVzdFRocmVhZC0+c2lnbmFsUGlwZWxpbmVEcmFpbihzdHJlYW1JZHMpOworICAgICAgICB9CisgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00ub25XYWl0VW50aWxJZGxlKCk7CisgICAgfQorCiAgICAgYm9vbCBzdGF0ZVNlZW4gPSBmYWxzZTsKICAgICBkbyB7CiAgICAgICAgIGlmIChhY3RpdmUgPT0gKG1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkpIHsKQEAgLTIwMTMsNiArMjM3MCwxMyBAQAogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICAgICAgLy8gYi8xMTY1MTQxMDYgImRpc2Nvbm5lY3QoKSIgY2FuIGdldCBjYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGRldmljZS4gVGhlCisgICAgICAgIC8vIGNhbWVyYSBkZXZpY2Ugd2lsbCBub3QgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nIHRoZSBzZWNvbmQgcnVuLgorICAgICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyKC8qb3V0Ki9mcmFtZU51bWJlcik7CiAgICAgfQogCkBAIC0yMDI5LDE1ICsyMzkzLDEyIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwotCiAgICAgaWYgKHN0cmVhbS0+aXNVbnByZXBhcmFibGUoKSB8fCBzdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpICkgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGhhcyBhbHJlYWR5IGJlZW4gYSByZXF1ZXN0IHRhcmdldCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTIwNTcsMTUgKzI0MTgsMTIgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0KICAgICBpZiAoc3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSB8fCBtUmVxdWVzdFRocmVhZC0+aXNTdHJlYW1QZW5kaW5nKHN0cmVhbSkpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyBhIHRhcmdldCBvZiBhIGluLXByb2dyZXNzIHJlcXVlc3QiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yMDgxLDE0ICsyNDM5LDExIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0KLSAgICBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwogICAgIHN0cmVhbS0+YWRkQnVmZmVyTGlzdGVuZXIobGlzdGVuZXIpOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjE0NywxMiArMjUwMiwxMSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgdW5rbm93biIsIHN0cmVhbUlkKTsKLSAgICAgICAgcmV0dXJuIGlkeDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaWR4XTsKICAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPnNldENvbnN1bWVycyhjb25zdW1lcnMpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBzZXQgY29uc3VtZXIgZmFpbGVkIChlcnJvciAlZCAlcykgIiwgc3RyZWFtSWQsIHJlcywgc3RyZXJyb3IoLXJlcykpOwpAQCAtMjE5NywxMCArMjU1MSwxMCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgc3RyZWFtSWQpOwotICAgICAgICByZXR1cm4gaWR4OworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiByZW1vdmVkU3VyZmFjZUlkcykgewpAQCAtMjIxMCw3ICsyNTY0LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2lkeF07CiAgICAgc3RhdHVzX3QgcmVzID0gc3RyZWFtLT51cGRhdGVTdHJlYW0obmV3U3VyZmFjZXMsIG91dHB1dEluZm8sIHJlbW92ZWRTdXJmYWNlSWRzLCBvdXRwdXRNYXApOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBmYWlsZWQgdG8gdXBkYXRlIHN0cmVhbSAoZXJyb3IgJWQgJXMpICIsCkBAIC0yMjI5LDEzICsyNTgyLDExIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBpbnQgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIGlzIG5vdCBmb3VuZC4iLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0KLSAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpOwogICAgIHJldHVybiBzdHJlYW0tPmRyb3BCdWZmZXJzKGRyb3BwaW5nKTsKIH0KIApAQCAtMjI4OSwxNSArMjY0MCwxMiBAQAogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtcy5jb3VudDsgaSsrKSB7Ci0gICAgICAgIGludCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbXMuZGF0YS5pMzJbaV0pOwotICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1zLmRhdGEuaTMyW2ldKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdCByZWZlcmVuY2VzIHVua25vd24gc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtcy5kYXRhLnU4W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtcy5kYXRhLmkzMltpXSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPQotICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGlkeCk7Ci0KICAgICAgICAgLy8gSXQgaXMgaWxsZWdhbCB0byBpbmNsdWRlIGEgZGVmZXJyZWQgY29uc3VtZXIgb3V0cHV0IHN0cmVhbSBpbnRvIGEgcmVxdWVzdAogICAgICAgICBhdXRvIGl0ZXIgPSBzdXJmYWNlTWFwLmZpbmQoc3RyZWFtcy5kYXRhLmkzMltpXSk7CiAgICAgICAgIGlmIChpdGVyICE9IHN1cmZhY2VNYXAuZW5kKCkpIHsKQEAgLTIzMDksNyArMjY1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tpXSA9IHN1cmZhY2VzOworICAgICAgICAgICAgbmV3UmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW3N0cmVhbXMuZGF0YS5pMzJbaV1dID0gc3VyZmFjZXM7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBMYXp5IGNvbXBsZXRpb24gb2Ygc3RyZWFtIGNvbmZpZ3VyYXRpb24gKGFsbG9jYXRpb24vcmVnaXN0cmF0aW9uKQpAQCAtMjM1OCw3ICsyNzA2LDcgQEAKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpXTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7CiAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmNhbmNlbENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTI0OTMsNyArMjg0MSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpvdXRwdXRTdHJlYW07Ci0gICAgICAgIG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpLT5zdGFydENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV0tPnN0YXJ0Q29uZmlndXJhdGlvbigpOwogICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IE5VTEwpIHsKICAgICAgICAgICAgIENMT0dFKCJDYW4ndCBzdGFydCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24iKTsKICAgICAgICAgICAgIGNhbmNlbFN0cmVhbXNDb25maWd1cmF0aW9uTG9ja2VkKCk7CkBAIC0yNTAxLDEyICsyODQ5LDE5IEBACiAgICAgICAgIH0KICAgICAgICAgc3RyZWFtcy5hZGQob3V0cHV0U3RyZWFtKTsKIAotICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CICYmCi0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLT5kYXRhX3NwYWNlID09IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRikgeworICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CiAgICAgICAgICAgICBzaXplX3QgayA9IGkgKyAoKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSA/IDEgOiAwKTsgLy8gSW5wdXQgc3RyZWFtIGlmIHByZXNlbnQgc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIG9jY3VweSB0aGUgaW5pdGlhbCBlbnRyeS4KLSAgICAgICAgICAgIGJ1ZmZlclNpemVzW2tdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAotICAgICAgICAgICAgICAgICAgICBnZXRKcGVnQnVmZmVyU2l6ZShvdXRwdXRTdHJlYW0tPndpZHRoLCBvdXRwdXRTdHJlYW0tPmhlaWdodCkpOworICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSA9PSBIQUxfREFUQVNQQUNFX1YwX0pGSUYpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJTaXplc1trXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEpwZWdCdWZmZXJTaXplKG91dHB1dFN0cmVhbS0+d2lkdGgsIG91dHB1dFN0cmVhbS0+aGVpZ2h0KSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSA9PQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9KUEVHX0FQUF9TRUdNRU5UUykpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJTaXplc1trXSA9IG91dHB1dFN0cmVhbS0+d2lkdGggKiBvdXRwdXRTdHJlYW0tPmhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBCbG9iIGRhdGFTcGFjZSAlZCBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb3V0cHV0U3RyZWFtLT5kYXRhX3NwYWNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjU1MSw4ICsyOTA2LDcgQEAKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9Ci0gICAgICAgICAgICBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV07CiAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQ29uZmlndXJpbmcoKSAmJiAhb3V0cHV0U3RyZWFtLT5pc0NvbnN1bWVyQ29uZmlndXJhdGlvbkRlZmVycmVkKCkpIHsKICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+ZmluaXNoQ29uZmlndXJhdGlvbigpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjYxNSw2ICsyOTY5LDEwIEBACiAgICAgICAgIHJldHVybiByYzsKICAgICB9CiAKKyAgICBpZiAobUR1bW15U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CisgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00ub25TdHJlYW1zQ29uZmlndXJlZCgpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjY1OSwxNSArMzAxNywxMiBAQAogICAgIC8vIE9rLCBoYXZlIGEgZHVtbXkgc3RyZWFtIGFuZCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBvdGhlciBvdXRwdXQgc3RyZWFtLAogICAgIC8vIHNvIHJlbW92ZSB0aGUgZHVtbXkKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KG1EdW1teVN0cmVhbUlkKTsKLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChtRHVtbXlTdHJlYW1JZCk7CisgICAgaWYgKGRlbGV0ZWRTdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBTRVRfRVJSX0woIkR1bW15IHN0cmVhbSAlZCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QiLCBtRHVtbXlTdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0KLSAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLSAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmVJdGVtc0F0KG91dHB1dFN0cmVhbUlkeCk7CisgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlKG1EdW1teVN0cmVhbUlkKTsKIAogICAgIC8vIEZyZWUgdXAgdGhlIHN0cmVhbSBlbmRwb2ludCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHNvbWUgb3RoZXIgc3RyZWFtCiAgICAgcmVzID0gZGVsZXRlZFN0cmVhbS0+ZGlzY29ubmVjdCgpOwpAQCAtMjc0MSwxOCArMzA5NiwyMSBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVnaXN0ZXJJbkZsaWdodCh1aW50MzJfdCBmcmFtZU51bWJlciwKICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLAotICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzLCBib29sIGlzU3RpbGxDYXB0dXJlLAorICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSwgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwogCiAgICAgc3NpemVfdCByZXM7CiAgICAgcmVzID0gbUluRmxpZ2h0TWFwLmFkZChmcmFtZU51bWJlciwgSW5GbGlnaHRSZXF1ZXN0KG51bUJ1ZmZlcnMsIHJlc3VsdEV4dHJhcywgaGFzSW5wdXQsCi0gICAgICAgICAgICBoYXNBcHBDYWxsYmFjaywgbWF4RXhwZWN0ZWREdXJhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZHMpKTsKKyAgICAgICAgICAgIGhhc0FwcENhbGxiYWNrLCBtYXhFeHBlY3RlZER1cmF0aW9uLCBwaHlzaWNhbENhbWVyYUlkcywgaXNTdGlsbENhcHR1cmUsIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzKSk7CiAgICAgaWYgKHJlcyA8IDApIHJldHVybiByZXM7CiAKICAgICBpZiAobUluRmxpZ2h0TWFwLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgIC8vIGhvbGQgbUxvY2sgdG8gcHJldmVudCByYWNlIHdpdGggZGlzY29ubmVjdAotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIC8vIEhvbGQgYSBzZXBhcmF0ZSBkZWRpY2F0ZWQgdHJhY2tlciBsb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QgYW5kIGFsc28KKyAgICAgICAgLy8gYXZvaWQgYSBkZWFkbG9jayBkdXJpbmcgcmVwcm9jZXNzIHJlcXVlc3RzLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtVHJhY2tlckxvY2spOwogICAgICAgICBpZiAobVN0YXR1c1RyYWNrZXIgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgbVN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRBY3RpdmUobUluRmxpZ2h0U3RhdHVzSWQpOwogICAgICAgICB9CkBAIC0yNzY0LDE3ICszMTIyLDY4IEBACiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6cmV0dXJuT3V0cHV0QnVmZmVycygKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMsIHNpemVfdCBudW1CdWZmZXJzLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmaW5SZXN1bHRFeHRyYXMpIHsKKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgaSsrKQogICAgIHsKLSAgICAgICAgQ2FtZXJhM1N0cmVhbSAqc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChvdXRwdXRCdWZmZXJzW2ldLnN0cmVhbSk7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCk7CisgICAgICAgIGlmIChvdXRwdXRCdWZmZXJzW2ldLmJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgLy8gV2l0aCBIQUwgYnVmZmVyIG1hbmFnZW1lbnQgQVBJLCBIQUwgc29tZXRpbWVzIHdpbGwgaGF2ZSB0byByZXR1cm4gYnVmZmVycyB0aGF0CisgICAgICAgICAgICAgICAgLy8gaGFzIG5vdCBnb3QgYSBvdXRwdXQgYnVmZmVyIGhhbmRsZSBmaWxsZWQgeWV0LiBUaGlzIGlzIHRob3VnaCBpbGxlZ2FsIGlmIEhBTAorICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBtYW5hZ2VtZW50IEFQSSBpcyBub3QgYmVpbmcgdXNlZC4KKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCByZXR1cm4gYSBudWxsIGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlICpzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KG91dHB1dEJ1ZmZlcnNbaV0uc3RyZWFtKTsKKyAgICAgICAgaW50IHN0cmVhbUlkID0gc3RyZWFtLT5nZXRJZCgpOworICAgICAgICBjb25zdCBhdXRvJiBpdCA9IG91dHB1dFN1cmZhY2VzLmZpbmQoc3RyZWFtSWQpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgaWYgKGl0ICE9IG91dHB1dFN1cmZhY2VzLmVuZCgpKSB7CisgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLCBpdC0+c2Vjb25kLAorICAgICAgICAgICAgICAgICAgICBpblJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLAorICAgICAgICAgICAgICAgICAgICBpblJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgIH0KKwogICAgICAgICAvLyBOb3RlOiBzdHJlYW0gbWF5IGJlIGRlYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQsIGlmIHRoaXMgYnVmZmVyIHdhcwogICAgICAgICAvLyB0aGUgbGFzdCByZWZlcmVuY2UgdG8gaXQuCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJDYW4ndCByZXR1cm4gYnVmZmVyIHRvIGl0cyBzdHJlYW06ICVzICglZCkiLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gTG9uZyBwcm9jZXNzaW5nIGNvbnN1bWVycyBjYW4gY2F1c2UgcmV0dXJuQnVmZmVyIHRpbWVvdXQgZm9yIHNoYXJlZCBzdHJlYW0KKyAgICAgICAgLy8gSWYgdGhhdCBoYXBwZW5zLCBjYW5jZWwgdGhlIGJ1ZmZlciBhbmQgc2VuZCBhIGJ1ZmZlciBlcnJvciB0byBjbGllbnQKKyAgICAgICAgaWYgKGl0ICE9IG91dHB1dFN1cmZhY2VzLmVuZCgpICYmIHJlcyA9PSBUSU1FRF9PVVQgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0spIHsKKyAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgYnVmZmVyCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzYiA9IG91dHB1dEJ1ZmZlcnNbaV07CisgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICBzdHJlYW0tPnJldHVybkJ1ZmZlcihzYiwgLyp0aW1lc3RhbXAqLzAsIHRpbWVzdGFtcEluY3JlYXNpbmcsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksCisgICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBidWZmZXIgZXJyb3IKKyAgICAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzID0gaW5SZXN1bHRFeHRyYXM7CisgICAgICAgICAgICAgICAgZXh0cmFzLmVycm9yU3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTI3ODUsOCArMzE5NCwxMCBAQAogCiAgICAgLy8gSW5kaWNhdGUgaWRsZSBpbkZsaWdodE1hcCB0byB0aGUgc3RhdHVzIHRyYWNrZXIKICAgICBpZiAobUluRmxpZ2h0TWFwLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIC8vIGhvbGQgbUxvY2sgdG8gcHJldmVudCByYWNlIHdpdGggZGlzY29ubmVjdAotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00ub25JbmZsaWdodE1hcEVtcHR5KCk7CisgICAgICAgIC8vIEhvbGQgYSBzZXBhcmF0ZSBkZWRpY2F0ZWQgdHJhY2tlciBsb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QgYW5kIGFsc28KKyAgICAgICAgLy8gYXZvaWQgYSBkZWFkbG9jayBkdXJpbmcgcmVwcm9jZXNzIHJlcXVlc3RzLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtVHJhY2tlckxvY2spOwogICAgICAgICBpZiAobVN0YXR1c1RyYWNrZXIgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgbVN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1JbkZsaWdodFN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICB9CkBAIC0yODExLDYgKzMyMjIsMTAgQEAKICAgICBpZiAocmVxdWVzdC5udW1CdWZmZXJzTGVmdCA9PSAwICYmCiAgICAgICAgICAgICAocmVxdWVzdC5za2lwUmVzdWx0TWV0YWRhdGEgfHwKICAgICAgICAgICAgIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSAmJiBzaHV0dGVyVGltZXN0YW1wICE9IDApKSkgeworICAgICAgICBpZiAocmVxdWVzdC5zdGlsbENhcHR1cmUpIHsKKyAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoInN0aWxsIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CisgICAgICAgIH0KKwogICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJmcmFtZSBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOwogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayAtIGlmIHNlbnNvciB0aW1lc3RhbXAgbWF0Y2hlcyBzaHV0dGVyIHRpbWVzdGFtcCBpbiB0aGUKQEAgLTI4MjcsNyArMzI0Miw4IEBACiAgICAgICAgIGFzc2VydChyZXF1ZXN0LnJlcXVlc3RTdGF0dXMgIT0gT0sgfHwKICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpID09IDApOwogICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwKTsKKyAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwLCAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsCisgICAgICAgICAgICByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLCByZXF1ZXN0LnJlc3VsdEV4dHJhcyk7CiAKICAgICAgICAgcmVtb3ZlSW5GbGlnaHRNYXBFbnRyeUxvY2tlZChpZHgpOwogICAgICAgICBBTE9HVlYoIiVzOiByZW1vdmVkIGZyYW1lICVkIGZyb20gSW5GbGlnaHRNYXAiLCBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyKTsKQEAgLTI4NTEsNyArMzI2Nyw5IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IG1JbkZsaWdodE1hcC5zaXplKCk7IGlkeCsrKSB7CiAgICAgICAgICAgICBjb25zdCBJbkZsaWdodFJlcXVlc3QgJnJlcXVlc3QgPSBtSW5GbGlnaHRNYXAudmFsdWVBdChpZHgpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDApOworICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwLAorICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcyk7CiAgICAgICAgIH0KICAgICAgICAgbUluRmxpZ2h0TWFwLmNsZWFyKCk7CiAgICAgICAgIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPSAwOwpAQCAtMjg2MSw3ICszMjc5LDE1IEBACiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiBpbmZsaWdodEtleXM7CiAgICAgbUludGVyZmFjZS0+Z2V0SW5mbGlnaHRCdWZmZXJLZXlzKCZpbmZsaWdodEtleXMpOwogCi0gICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkID0gKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSA/IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSA6IC0xOworICAgIC8vIEluZmxpZ2h0IGJ1ZmZlcnMgZm9yIEhBTCBidWZmZXIgbWFuYWdlcgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBpbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzOworICAgIG1JbnRlcmZhY2UtPmdldEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMoJmluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMpOworCisgICAgLy8gKHN0cmVhbUlkLCBmcmFtZU51bWJlciwgYnVmZmVyX2hhbmRsZV90KikgdHVwbGUgZm9yIGFsbCBpbmZsaWdodCBidWZmZXJzLgorICAgIC8vIGZyYW1lTnVtYmVyIHdpbGwgYmUgLTEgZm9yIGJ1ZmZlcnMgZnJvbSBIQUwgYnVmZmVyIG1hbmFnZXIKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPGludDMyX3QsIGludDMyX3QsIGJ1ZmZlcl9oYW5kbGVfdCo+PiBpbmZsaWdodEJ1ZmZlcnM7CisgICAgaW5mbGlnaHRCdWZmZXJzLnJlc2VydmUoaW5mbGlnaHRLZXlzLnNpemUoKSArIGluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMuc2l6ZSgpKTsKKwogICAgIGZvciAoYXV0byYgcGFpciA6IGluZmxpZ2h0S2V5cykgewogICAgICAgICBpbnQzMl90IGZyYW1lTnVtYmVyID0gcGFpci5maXJzdDsKICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IHBhaXIuc2Vjb25kOwpAQCAtMjg3Miw2ICszMjk4LDI2IEBACiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZnJhbWVOdW1iZXIsIHN0cmVhbUlkKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisgICAgICAgIGluZmxpZ2h0QnVmZmVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHN0cmVhbUlkLCBmcmFtZU51bWJlciwgYnVmZmVyKSk7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBidWZmZXJJZCA6IGluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMpIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IC0xOworICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWZmZXJJZCwgJmJ1ZmZlciwgJnN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZmluZCBpbi1mbGlnaHQgYnVmZmVyICUiIFBSSXU2NCwgX19GVU5DVElPTl9fLCBidWZmZXJJZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmZsaWdodEJ1ZmZlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShzdHJlYW1JZCwgLypmcmFtZU51bWJlciovLTEsIGJ1ZmZlcikpOworICAgIH0KKworICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgPyBtSW5wdXRTdHJlYW0tPmdldElkKCkgOiAtMTsKKyAgICBmb3IgKGF1dG8mIHR1cGxlIDogaW5mbGlnaHRCdWZmZXJzKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gc3RkOjpnZXQ8MD4odHVwbGUpOworICAgICAgICBpbnQzMl90IGZyYW1lTnVtYmVyID0gc3RkOjpnZXQ8MT4odHVwbGUpOworICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlciA9IHN0ZDo6Z2V0PDI+KHR1cGxlKTsKIAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzdHJlYW1CdWZmZXI7CiAgICAgICAgIHN0cmVhbUJ1ZmZlci5idWZmZXIgPSBidWZmZXI7CkBAIC0yODg5LDcgKzMzMzUsOCBAQAogICAgICAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBoYWxTdHJlYW07CiAgICAgICAgICAgICAgICAgc3dpdGNoIChoYWxTdHJlYW0tPnN0cmVhbV90eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fT1VUUFVUOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoc3RyZWFtQnVmZmVyLCAvKnRpbWVzdGFtcCovIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoc3RyZWFtQnVmZmVyLCAvKnRpbWVzdGFtcCovIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgcmV0dXJuIG91dHB1dCBidWZmZXIgZm9yIGZyYW1lICVkIHRvIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc3RyZWFtICVkOiAlcyAoJWQpIiwgIF9fRlVOQ1RJT05fXywKQEAgLTI5MjYsMTIgKzMzNzMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaWR4KS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKCZzdHJlYW1CdWZmZXIsIC8qc2l6ZSovMSwgLyp0aW1lc3RhbXAqLyAwKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI5NzksNiArMzQyNiwxMyBAQAogICAgIGNhcHR1cmVSZXN1bHQubVJlc3VsdEV4dHJhcyA9IHJlc3VsdEV4dHJhczsKICAgICBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSA9IHBhcnRpYWxSZXN1bHQ7CiAKKyAgICAvLyBGaXggdXAgcmVzdWx0IG1ldGFkYXRhIGZvciBtb25vY2hyb21lIGNhbWVyYS4KKyAgICBzdGF0dXNfdCByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKG1EZXZpY2VJbmZvLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSKCJGYWlsZWQgdG8gb3ZlcnJpZGUgcmVzdWx0IG1ldGFkYXRhOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpbnNlcnRSZXN1bHRMb2NrZWQoJmNhcHR1cmVSZXN1bHQsIGZyYW1lTnVtYmVyKTsKIH0KIApAQCAtMzA1MCw2ICszNTA0LDIxIEBACiAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVycm9yKHJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgLy8gRml4IHVwIHJlc3VsdCBtZXRhZGF0YSBmb3IgbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgcmVzID0gZml4dXBNb25vY2hyb21lVGFncyhtRGV2aWNlSW5mbywgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUigiRmFpbGVkIHRvIG92ZXJyaWRlIHJlc3VsdCBtZXRhZGF0YTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoYXV0byYgcGh5c2ljYWxNZXRhZGF0YSA6IGNhcHR1cmVSZXN1bHQubVBoeXNpY2FsTWV0YWRhdGFzKSB7CisgICAgICAgIFN0cmluZzggY2FtZXJhSWQ4KHBoeXNpY2FsTWV0YWRhdGEubVBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKG1QaHlzaWNhbERldmljZUluZm9NYXAuYXQoY2FtZXJhSWQ4LmNfc3RyKCkpLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGEubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJGYWlsZWQgdG8gb3ZlcnJpZGUgcmVzdWx0IG1ldGFkYXRhOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CiAKICAgICBtVGFnTW9uaXRvci5tb25pdG9yTWV0YWRhdGEoVGFnTW9uaXRvcjo6UkVTVUxULAogICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcC5kYXRhLmk2NFswXSwgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEpOwpAQCAtMzIwNyw4ICszNjc2LDEwIEBACiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFwcGVuZEFycmF5KHJlc3VsdC0+b3V0cHV0X2J1ZmZlcnMsCiAgICAgICAgICAgICAgICAgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gIShyZXF1ZXN0LnpzbENhcHR1cmUgfHwgcmVxdWVzdC5oYXNJbnB1dEJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHJlc3VsdC0+b3V0cHV0X2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMsIHNodXR0ZXJUaW1lc3RhbXApOworICAgICAgICAgICAgICAgIHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzLCBzaHV0dGVyVGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKQEAgLTMyMjEsNyArMzY5Miw3IEBACiAgICAgICAgICAgICBpZiAoc2h1dHRlclRpbWVzdGFtcCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nTWV0YWRhdGEgPSByZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQgPSBjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0OwotICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuaGFzQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5oYXNDYWxsYmFjaykgewogICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOwogICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgc2VuZENhcHR1cmVSZXN1bHQobWV0YWRhdGEsIHJlcXVlc3QucmVzdWx0RXh0cmFzLApAQCAtMzM0MSw2ICszODEyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgbWlzc2luZyByZXN1bHQgY2hlY2sgd2hldGhlciB0aGUgYnVmZmVycwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQuIElmIHRoZXkgcmV0dXJuZWQsIHRoZW4gcmVtb3ZlIGluZmxpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGNhbGwgdGhpcyBmb3IgRVJST1JfQ0FNRVJBX1JFUVVFU1QgYXMgd2VsbD8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG90aGVyd2lzZSB3ZSBhcmUgZGVwZW5kaW5nIG9uIEhBTCB0byBzZW5kIHRoZSBidWZmZXJzIGJhY2sgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGNhbGxpbmcgbm90aWZ5RXJyb3IuIE5vdCBzdXJlIGlmIHRoYXQncyBpbiB0aGUgc3BlYy4KICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUluRmxpZ2h0UmVxdWVzdElmUmVhZHlMb2NrZWQoaWR4KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0zNDE0LDggKzM4ODgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgci5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LCBtc2cuZnJhbWVfbnVtYmVyLAogICAgICAgICAgICAgICAgICAgICByLmhhc0lucHV0QnVmZmVyLCByLnBoeXNpY2FsTWV0YWRhdGFzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9ICEoci56c2xDYXB0dXJlIHx8IHIuaGFzSW5wdXRCdWZmZXIpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyLnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIHIuc2h1dHRlclRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCByLnNodXR0ZXJUaW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICAgICAgICAgIHIub3V0cHV0U3VyZmFjZXMsIHIucmVzdWx0RXh0cmFzKTsKICAgICAgICAgICAgIHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKIAogICAgICAgICAgICAgcmVtb3ZlSW5GbGlnaHRSZXF1ZXN0SWZSZWFkeUxvY2tlZChpZHgpOwpAQCAtMzQ1MSwxMSArMzkyNywxOCBAQAogCiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgKICAgICAgICAgICAgIHNwPElDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUpIDoKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKICAgICAgICAgbUhpZGxTZXNzaW9uKHNlc3Npb24pLAotICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpIHsKKyAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlciksCisgICAgICAgIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkKHRydWUpIHsKICAgICAvLyBDaGVjayB3aXRoIGhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciBpZiB3ZSBjYW4gZG93bmNhc3QgdGhlc2UgaW50ZXJmYWNlcwogICAgIC8vIFNvbWV3aGF0IGV4cGVuc2l2ZSwgc28gY2FjaGUgdGhlIHJlc3VsdHMgYXQgc3RhcnR1cAorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzUgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNS5pc09rKCkpIHsKKyAgICAgICAgbUhpZGxTZXNzaW9uXzNfNSA9IGNhc3RSZXN1bHRfM181OworICAgIH0KICAgICBhdXRvIGNhc3RSZXN1bHRfM180ID0gZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKICAgICBpZiAoY2FzdFJlc3VsdF8zXzQuaXNPaygpKSB7CiAgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzQgPSBjYXN0UmVzdWx0XzNfNDsKQEAgLTM0NjYsMTcgKzM5NDksMTkgQEAKICAgICB9CiB9CiAKLUNhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKCkge30KK0NhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKCkgOiBtVXNlSGFsQnVmTWFuYWdlcihmYWxzZSkge30KIAogQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoY29uc3QgSGFsSW50ZXJmYWNlJiBvdGhlcikgOgogICAgICAgICBtSGlkbFNlc3Npb24ob3RoZXIubUhpZGxTZXNzaW9uKSwKLSAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKG90aGVyLm1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSkge30KKyAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKG90aGVyLm1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKG90aGVyLm1Vc2VIYWxCdWZNYW5hZ2VyKSB7fQogCiBib29sIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6dmFsaWQoKSB7CiAgICAgcmV0dXJuIChtSGlkbFNlc3Npb24gIT0gbnVsbHB0cik7CiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjbGVhcigpIHsKKyAgICBtSGlkbFNlc3Npb25fM181LmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uXzNfNC5jbGVhcigpOwogICAgIG1IaWRsU2Vzc2lvbl8zXzMuY2xlYXIoKTsKICAgICBtSGlkbFNlc3Npb24uY2xlYXIoKTsKQEAgLTM1NTMsNiArNDAzOCw1MiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK2Jvb2wgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjppc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKENhbWVyYU1ldGFkYXRhJiBvbGRTZXNzaW9uUGFyYW1zLAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcykgeworICAgIC8vIFdlIGRvIHJlY29uZmlndXJhdGlvbiBieSBkZWZhdWx0OworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICBpZiAoKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgJiYgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQpIHsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IG9sZFBhcmFtcywgbmV3UGFyYW1zOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogb2xkU2Vzc2lvTWV0YSA9IGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKSk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBuZXdTZXNzaW9NZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgIG5ld1Nlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpKTsKKyAgICAgICAgb2xkUGFyYW1zLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ob2xkU2Vzc2lvTWV0YSksCisgICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKG9sZFNlc3Npb01ldGEpKTsKKyAgICAgICAgbmV3UGFyYW1zLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obmV3U2Vzc2lvTWV0YSksCisgICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKG5ld1Nlc3Npb01ldGEpKTsKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXMgY2FsbFN0YXR1czsKKyAgICAgICAgYm9vbCByZXF1aXJlZDsKKyAgICAgICAgYXV0byBoaWRsQ2IgPSBbJmNhbGxTdGF0dXMsICZyZXF1aXJlZF0gKGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsCisgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlZEZsYWcpIHsKKyAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOworICAgICAgICAgICAgcmVxdWlyZWQgPSByZXF1aXJlZEZsYWc7CisgICAgICAgIH07CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+aXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChvbGRQYXJhbXMsIG5ld1BhcmFtcywgaGlkbENiKTsKKyAgICAgICAgb2xkU2Vzc2lvblBhcmFtcy51bmxvY2sob2xkU2Vzc2lvTWV0YSk7CisgICAgICAgIG5ld1Nlc3Npb25QYXJhbXMudW5sb2NrKG5ld1Nlc3Npb01ldGEpOworICAgICAgICBpZiAoZXJyLmlzT2soKSkgeworICAgICAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czo6T0s6CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHJlcXVpcmVkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZWNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uICpjb25maWcsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIHsKICAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpjb25maWd1cmVTdHJlYW1zIik7CkBAIC0zNjMyLDI2ICs0MTYzLDQ5IEBACiAKICAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcwogICAgIGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb247CisgICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKICAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CiAKLSAgICAvLyBTZWUgaWYgd2UgaGF2ZSB2My40IG9yIHYzLjMgSEFMCi0gICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjQgZm9yIHRoZSBjYWxsCi0gICAgICAgIEFMT0dWKCIlczogdjMuNCBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM180OwotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzQtPmNvbmZpZ3VyZVN0cmVhbXNfM180KHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQsCi0gICAgICAgICAgICBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KKyAgICBhdXRvIGNvbmZpZ1N0cmVhbTM0Q2IgPSBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KICAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24zXzQgPSBoYWxDb25maWd1cmF0aW9uOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9OworCisgICAgYXV0byBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0ID0gWyZmaW5hbENvbmZpZ3VyYXRpb24sICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCisgICAgICAgICAgICAoaGFyZHdhcmU6OlJldHVybjx2b2lkPiYgZXJyKSAtPiBzdGF0dXNfdCB7CisgICAgICAgICAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldID0gZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV0udjNfMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfTsKKworICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHYzLjQgb3IgdjMuMyBIQUwKKyAgICBpZiAobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlczogdjMuNSBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZXZpY2U6OlYzXzU6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNTsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS52M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+Y29uZmlndXJlU3RyZWFtc18zXzUoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNSwgY29uZmlnU3RyZWFtMzRDYik7CisgICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQoZXJyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOworICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKKyAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwgY29uZmlnU3RyZWFtMzRDYik7CisgICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQoZXJyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfMyAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuMyBmb3IgdGhlIGNhbGwKQEAgLTM3NjMsMTQgKzQzMTcsMTQgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKICAgICAgICAgLypvdXQqL2RldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0LAogICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoY2FwdHVyZVJlcXVlc3QgPT0gbnVsbHB0ciB8fCBoYW5kbGVzQ3JlYXRlZCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogY2FwdHVyZVJlcXVlc3QgKCVwKSBhbmQgaGFuZGxlc0NyZWF0ZWQgKCVwKSBtdXN0IG5vdCBiZSBudWxsIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhcHR1cmVSZXF1ZXN0LCBoYW5kbGVzQ3JlYXRlZCk7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIgPSByZXF1ZXN0LT5mcmFtZV9udW1iZXI7CkBAIC0zODExLDI2ICs0MzY1LDQwIEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqc3JjID0gcmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnMgKyBpOwogICAgICAgICAgICAgU3RyZWFtQnVmZmVyICZkc3QgPSBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVyc1tpXTsKICAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYy0+c3RyZWFtKS0+Z2V0SWQoKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHNyYy0+YnVmZmVyKTsKLSAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOwotICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICBkc3Quc3RyZWFtSWQgPSBzdHJlYW1JZDsKLSAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOwotICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IGlzTmV3QnVmZmVyID8gYnVmIDogbnVsbHB0cjsKLSAgICAgICAgICAgIGRzdC5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOwotICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOwotICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgIGlmIChzcmMtPmJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/IGJ1ZiA6IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGlmIChzcmMtPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgLy8gSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IHBhdGgKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBzZW5kIGEgbnVsbCBidWZmZXIgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICBkc3Quc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgIGRzdC5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwogICAgICAgICAgICAgZHN0LnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CiAKLSAgICAgICAgICAgIHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLAotICAgICAgICAgICAgICAgICAgICBzcmMtPmJ1ZmZlciwgc3JjLT5hY3F1aXJlX2ZlbmNlKTsKKyAgICAgICAgICAgIC8vIE91dHB1dCBidWZmZXJzIGFyZSBlbXB0eSB3aGVuIHVzaW5nIEhBTCBidWZmZXIgbWFuYWdlcgorICAgICAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5idWZmZXIsIHNyYy0+YWNxdWlyZV9mZW5jZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKQEAgLTM4NTQsMTIgKzQ0MjIsMTcgQEAKICAgICB9CiAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gaGFuZGxlc0NyZWF0ZWQ7CiAKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7CiAgICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAorICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAogICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c1tpXSwgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNbaV0sIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM5NDEsMTggKzQ1MTQsMTcgQEAKICAgICB9CiAKICAgICBoYXJkd2FyZTo6ZGV0YWlsczo6cmV0dXJuX3N0YXR1cyBlcnI7CisgICAgYXV0byByZXN1bHRDYWxsYmFjayA9CisgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOworICAgICAgICB9OwogICAgIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewogICAgICAgICBlcnIgPSBoaWRsU2Vzc2lvbl8zXzQtPnByb2Nlc3NDYXB0dXJlUmVxdWVzdF8zXzQoY2FwdHVyZVJlcXVlc3RzXzNfNCwgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGVyciA9IG1IaWRsU2Vzc2lvbi0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KGNhcHR1cmVSZXF1ZXN0cywgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7CiAgICAgfQogICAgIGlmICghZXJyLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CkBAIC00MDIzLDYgKzQ1OTUsMjAgQEAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzaWduYWxQaXBlbGluZURyYWluIik7CisgICAgaWYgKCF2YWxpZCgpIHx8IG1IaWRsU2Vzc2lvbl8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIG9uIGludmFsaWQgY2FtZXJhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPnNpZ25hbFN0cmVhbUZsdXNoKHN0cmVhbUlkcywgbU5leHRTdHJlYW1Db25maWdDb3VudGVyIC0gMSk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEluZmxpZ2h0QnVmZmVyS2V5cygKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+Piogb3V0KSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluZmxpZ2h0TG9jayk7CkBAIC00MDM3LDYgKzQ2MjMsMTcgQEAKICAgICByZXR1cm47CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpnZXRJbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzKAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4qIG91dCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgb3V0LT5jbGVhcigpOworICAgIG91dC0+cmVzZXJ2ZShtUmVxdWVzdGVkQnVmZmVycy5zaXplKCkpOworICAgIGZvciAoYXV0byYgcGFpciA6IG1SZXF1ZXN0ZWRCdWZmZXJzKSB7CisgICAgICAgIG91dC0+cHVzaF9iYWNrKHBhaXIuZmlyc3QpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cHVzaEluZmxpZ2h0QnVmZmVyTG9ja2VkKAogICAgICAgICBpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLCBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgaW50IGFjcXVpcmVGZW5jZSkgewogICAgIHVpbnQ2NF90IGtleSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihmcmFtZU51bWJlcikgPDwgMzIgfCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RyZWFtSWQpOwpAQCAtNDA2Myw2ICs0NjYwLDQyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLCBidWZmZXJfaGFuZGxlX3QqIGJ1ZiwgaW50MzJfdCBzdHJlYW1JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgYXV0byBwYWlyID0gbVJlcXVlc3RlZEJ1ZmZlcnMuaW5zZXJ0KHtidWZmZXJJZCwge3N0cmVhbUlkLCBidWZ9fSk7CisgICAgaWYgKCFwYWlyLnNlY29uZCkgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZklkICUiIFBSSXU2NCAiIGlzIGFscmVhZHkgaW5mbGlnaHQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBGaW5kIGFuZCBwb3AgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gYnVmZmVySWQKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICB1aW50NjRfdCBidWZmZXJJZCwKKyAgICAgICAgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIsCisgICAgICAgIC8qb3B0aW9uYWwgb3V0Ki8gaW50MzJfdCogc3RyZWFtSWQpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBidWZmZXIgKCVwKSBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fLCBidWZmZXIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVxdWVzdGVkQnVmZmVyc0xvY2spOworICAgIGF1dG8gaXQgPSBtUmVxdWVzdGVkQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICBpZiAoaXQgPT0gbVJlcXVlc3RlZEJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBidWZJZCAlIiBQUkl1NjQgIiBpcyBub3QgaW5mbGlnaHQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgKmJ1ZmZlciA9IGl0LT5zZWNvbmQuc2Vjb25kOworICAgIGlmIChzdHJlYW1JZCAhPSBudWxscHRyKSB7CisgICAgICAgICpzdHJlYW1JZCA9IGl0LT5zZWNvbmQuZmlyc3Q7CisgICAgfQorICAgIG1SZXF1ZXN0ZWRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpnZXRCdWZmZXJJZCgKICAgICAgICAgY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJJZE1hcExvY2spOwpAQCAtNDExMSw3ICs0NzQ0LDggQEAKIAogQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6UmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCi0gICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpIDoKKyAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CiAgICAgICAgIFRocmVhZCgvKmNhbkNhbGxKYXZhKi9mYWxzZSksCiAgICAgICAgIG1QYXJlbnQocGFyZW50KSwKICAgICAgICAgbVN0YXR1c1RyYWNrZXIoc3RhdHVzVHJhY2tlciksCkBAIC00MTIxLDYgKzQ3NTUsNyBAQAogICAgICAgICBtUmVjb25maWd1cmVkKGZhbHNlKSwKICAgICAgICAgbURvUGF1c2UoZmFsc2UpLAogICAgICAgICBtUGF1c2VkKHRydWUpLAorICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbihmYWxzZSksCiAgICAgICAgIG1GcmFtZU51bWJlcigwKSwKICAgICAgICAgbUxhdGVzdFJlcXVlc3RJZChOQU1FX05PVF9GT1VORCksCiAgICAgICAgIG1DdXJyZW50QWZUcmlnZ2VySWQoMCksCkBAIC00MTMxLDcgKzQ3NjYsOCBAQAogICAgICAgICBtQ29uc3RyYWluZWRNb2RlKGZhbHNlKSwKICAgICAgICAgbVJlcXVlc3RMYXRlbmN5KGtSZXF1ZXN0TGF0ZW5jeUJpblNpemUpLAogICAgICAgICBtU2Vzc2lvblBhcmFtS2V5cyhzZXNzaW9uUGFyYW1LZXlzKSwKLSAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMoc2Vzc2lvblBhcmFtS2V5cy5zaXplKCkpIHsKKyAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMoc2Vzc2lvblBhcmFtS2V5cy5zaXplKCkpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CiB9CiAKQEAgLTQ1ODIsOSArNTIxOCwxMCBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgYm9vbCB1cGRhdGVzRGV0ZWN0ZWQgPSBmYWxzZTsKIAorICAgIENhbWVyYU1ldGFkYXRhIHVwZGF0ZWRQYXJhbXMobUxhdGVzdFNlc3Npb25QYXJhbXMpOwogICAgIGZvciAoYXV0byB0YWcgOiBtU2Vzc2lvblBhcmFtS2V5cykgewogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBzZXR0aW5ncy5maW5kKHRhZyk7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsYXN0RW50cnkgPSBtTGF0ZXN0U2Vzc2lvblBhcmFtcy5maW5kKHRhZyk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsYXN0RW50cnkgPSB1cGRhdGVkUGFyYW1zLmZpbmQodGFnKTsKIAogICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CiAgICAgICAgICAgICBib29sIGlzRGlmZmVyZW50ID0gZmFsc2U7CkBAIC00NjEzLDE3ICs1MjUwLDI2IEBACiAgICAgICAgICAgICAgICAgaWYgKCFza2lwSEZSVGFyZ2V0RlBTVXBkYXRlKHRhZywgZW50cnksIGxhc3RFbnRyeSkpIHsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlc0RldGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMudXBkYXRlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICB1cGRhdGVkUGFyYW1zLnVwZGF0ZShlbnRyeSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobGFzdEVudHJ5LmNvdW50ID4gMCkgewogICAgICAgICAgICAgLy8gVmFsdWUgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgICAgICAgQUxPR1YoIiVzOiBTZXNzaW9uIHBhcmFtZXRlciB0YWcgaWQgJWQgcmVtb3ZlZCIsIF9fRlVOQ1RJT05fXywgdGFnKTsKLSAgICAgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zLmVyYXNlKHRhZyk7CisgICAgICAgICAgICB1cGRhdGVkUGFyYW1zLmVyYXNlKHRhZyk7CiAgICAgICAgICAgICB1cGRhdGVzRGV0ZWN0ZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHVwZGF0ZXNEZXRlY3RlZDsKKyAgICBib29sIHJlY29uZmlndXJlUmVxdWlyZWQ7CisgICAgaWYgKHVwZGF0ZXNEZXRlY3RlZCkgeworICAgICAgICByZWNvbmZpZ3VyZVJlcXVpcmVkID0gbUludGVyZmFjZS0+aXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChtTGF0ZXN0U2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICB1cGRhdGVkUGFyYW1zKTsKKyAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMgPSB1cGRhdGVkUGFyYW1zOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlY29uZmlndXJlUmVxdWlyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVjb25maWd1cmVSZXF1aXJlZDsKIH0KIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjp0aHJlYWRMb29wKCkgewpAQCAtNDczNiw2ICs1MzgyLDExIEBACiAgICAgQUxPR1ZWKCIlczogJWQ6IHN1Ym1pdHRpbmcgJXp1IHJlcXVlc3RzIGluIGEgYmF0Y2guIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKICAgICAgICAgICAgIG1OZXh0UmVxdWVzdHMuc2l6ZSgpKTsKIAorICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25TdWJtaXR0aW5nUmVxdWVzdCgpOworICAgIH0KKwogICAgIGJvb2wgc3VibWl0UmVxdWVzdFN1Y2Nlc3MgPSBmYWxzZTsKICAgICBuc2Vjc190IHRSZXF1ZXN0U3RhcnQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CiAgICAgaWYgKG1JbnRlcmZhY2UtPnN1cHBvcnRCYXRjaFJlcXVlc3QoKSkgewpAQCAtNDc2Miw2ICs1NDEzLDcgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnByZXBhcmVIYWxSZXF1ZXN0cygpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCisgICAgYm9vbCBiYXRjaGVkUmVxdWVzdCA9IG1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1CYXRjaFNpemUgPiAxOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5leHRSZXF1ZXN0cy5zaXplKCk7IGkrKykgewogICAgICAgICBhdXRvJiBuZXh0UmVxdWVzdCA9IG1OZXh0UmVxdWVzdHMuZWRpdEl0ZW1BdChpKTsKICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0ID0gbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3Q7CkBAIC00Nzg1LDcgKzU0MzcsMTAgQEAKICAgICAgICAgbVByZXZUcmlnZ2VycyA9IHRyaWdnZXJDb3VudDsKIAogICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCBpcyB0aGUgc2FtZSBhcyBsYXN0LCBvciB3ZSBoYWQgdHJpZ2dlcnMgbGFzdCB0aW1lCi0gICAgICAgIGJvb2wgbmV3UmVxdWVzdCA9IG1QcmV2UmVxdWVzdCAhPSBjYXB0dXJlUmVxdWVzdCB8fCB0cmlnZ2Vyc01peGVkSW47CisgICAgICAgIGJvb2wgbmV3UmVxdWVzdCA9IChtUHJldlJlcXVlc3QgIT0gY2FwdHVyZVJlcXVlc3QgfHwgdHJpZ2dlcnNNaXhlZEluKSAmJgorICAgICAgICAgICAgICAgIC8vIFJlcXVlc3Qgc2V0dGluZ3MgYXJlIGFsbCB0aGUgc2FtZSB3aXRoaW4gb25lIGJhdGNoLCBzbyBvbmx5IHRyZWF0IHRoZSBmaXJzdAorICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgaW4gYSBiYXRjaCBhcyBuZXcKKyAgICAgICAgICAgICAgICAhKGJhdGNoZWRSZXF1ZXN0ICYmIGkgPiAwKTsKICAgICAgICAgaWYgKG5ld1JlcXVlc3QpIHsKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogSEFMIHdvcmthcm91bmQ6CkBAIC00ODg2LDggKzU1NDEsMTEgQEAKICAgICAgICAgfQogICAgICAgICBuc2Vjc190IHdhaXREdXJhdGlvbiA9IGtCYXNlR2V0QnVmZmVyV2FpdCArIHBhcmVudC0+Z2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CiAKKyAgICAgICAgU3VyZmFjZU1hcCB1bmlxdWVTdXJmYWNlSWRNYXA7CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgaW50IHN0cmVhbUlkID0gb3V0cHV0U3RyZWFtLT5nZXRJZCgpOwogCiAgICAgICAgICAgICAvLyBQcmVwYXJlIHZpZGVvIGJ1ZmZlcnMgZm9yIGhpZ2ggc3BlZWQgcmVjb3JkaW5nIG9uIHRoZSBmaXJzdCB2aWRlbyByZXF1ZXN0LgogICAgICAgICAgICAgaWYgKG1QcmVwYXJlVmlkZW9TdHJlYW0gJiYgb3V0cHV0U3RyZWFtLT5pc1ZpZGVvU3RyZWFtKCkpIHsKQEAgLTQ5MDYsMTcgKzU1NjQsNjEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopLAotICAgICAgICAgICAgICAgICAgICB3YWl0RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbal0pOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCi0gICAgICAgICAgICAgICAgLy8gYWJhbmRvbmVkIHF1ZXVlIG9yIG90aGVyIGNvbnN1bWVyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAotICAgICAgICAgICAgICAgIC8vIGVycm9yCi0gICAgICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiB1bmlxdWVTdXJmYWNlSWRzOworICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRVbmlxdWVTdXJmYWNlSWRzKAorICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW3N0cmVhbUlkXSwKKyAgICAgICAgICAgICAgICAgICAgJnVuaXF1ZVN1cmZhY2VJZHMpOworICAgICAgICAgICAgLy8gSU5WQUxJRF9PUEVSQVRJT04gaXMgbm9ybWFsIG91dHB1dCBmb3Igc3RyZWFtcyBub3Qgc3VwcG9ydGluZyBzdXJmYWNlSWRzCisgICAgICAgICAgICBpZiAocmVzICE9IE9LICYmIHJlcyAhPSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHF1ZXJ5IHN0cmVhbSAlZCB1bmlxdWUgc3VyZmFjZSBJRHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB1bmlxdWVTdXJmYWNlSWRNYXAuaW5zZXJ0KHtzdHJlYW1JZCwgc3RkOjptb3ZlKHVuaXF1ZVN1cmZhY2VJZHMpfSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgICAgICAgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNBYmFuZG9uZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbSAlZCBpcyBhYmFuZG9uZWQuIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEhBTCB3aWxsIHJlcXVlc3QgYnVmZmVyIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlciBBUEkKKyAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgYnVmZmVyID0gb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuc3RyZWFtID0gb3V0cHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5idWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0s7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbc3RyZWFtSWRdKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGFiYW5kb25lZCBxdWV1ZSBvciBvdGhlciBjb25zdW1lciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBzdHJlYW1DYW1lcmFJZCA9IG91dHB1dFN0cmVhbS0+Z2V0UGh5c2ljYWxDYW1lcmFJZCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNldHRpbmdzIDogY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtQ2FtZXJhSWQuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+Z2V0SWQoKSA9PSBzZXR0aW5ncy5jYW1lcmFJZC5jX3N0cigpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1DYW1lcmFJZCA9PSBzZXR0aW5ncy5jYW1lcmFJZC5jX3N0cigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLT5maXJlQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5tZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IG91dHB1dFN0cmVhbS0+Z2V0UGh5c2ljYWxDYW1lcmFJZCgpOwpAQCAtNDkzOCwxNSArNTY0MCwzMiBAQAogICAgICAgICAvLyBwcmV2aWV3KSwgYW5kIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgbm90IHRoZSBsYXN0IG9uZSBpbiB0aGUgYmF0Y2gsCiAgICAgICAgIC8vIGRvIG5vdCBzZW5kIGNhbGxiYWNrIHRvIHRoZSBhcHAuCiAgICAgICAgIGJvb2wgaGFzQ2FsbGJhY2sgPSB0cnVlOwotICAgICAgICBpZiAobU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUJhdGNoU2l6ZSA+IDEgJiYgaSAhPSBtTmV4dFJlcXVlc3RzLnNpemUoKS0xKSB7CisgICAgICAgIGlmIChiYXRjaGVkUmVxdWVzdCAmJiBpICE9IG1OZXh0UmVxdWVzdHMuc2l6ZSgpLTEpIHsKICAgICAgICAgICAgIGhhc0NhbGxiYWNrID0gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSA9IGZhbHNlOworICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSA9IGZhbHNlOworICAgICAgICBpZiAoIW1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlID0gY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QoKTsKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KGhhbFJlcXVlc3QtPnNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsICZlKTsKKyAgICAgICAgICAgIGlmICgoZS5jb3VudCA+IDApICYmIChlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1NUSUxMX0NBUFRVUkUpKSB7CisgICAgICAgICAgICAgICAgaXNTdGlsbENhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19CRUdJTigic3RpbGwgY2FwdHVyZSIsIG1OZXh0UmVxdWVzdHNbaV0uaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShoYWxSZXF1ZXN0LT5zZXR0aW5ncywgQU5EUk9JRF9DT05UUk9MX0VOQUJMRV9aU0wsICZlKTsKKyAgICAgICAgICAgIGlmICgoZS5jb3VudCA+IDApICYmIChlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0VOQUJMRV9aU0xfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICBpc1pzbENhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsCiAgICAgICAgICAgICAgICAgdG90YWxOdW1CdWZmZXJzLCBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAvKmhhc0lucHV0Ki9oYWxSZXF1ZXN0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjaywKICAgICAgICAgICAgICAgICBjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGhhbFJlcXVlc3QtPnNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXMpOworICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcywgaXNTdGlsbENhcHR1cmUsIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICAobVVzZUhhbEJ1Zk1hbmFnZXIpID8gdW5pcXVlU3VyZmFjZUlkTWFwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZU1hcHt9KTsKICAgICAgICAgQUxPR1ZWKCIlczogcmVnaXN0ZXJlZCBpbiBmbGlnaHQgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CiAgICAgICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyICIuIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCkBAIC01MDIyLDcgKzU3NDEsNyBAQAogICAgICAgICAgICAgaWYgKHMuZmlyc3QgPT0gc3RyZWFtSWQpIHsKICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZpdCA9IHN0ZDo6ZmluZChzLnNlY29uZC5iZWdpbigpLCBzLnNlY29uZC5lbmQoKSwgc3VyZmFjZUlkKTsKICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gcy5zZWNvbmQuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwMzMsNyArNTc1Miw3IEBACiAgICAgICAgICAgICBpZiAocy5maXJzdCA9PSBzdHJlYW1JZCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ID0gc3RkOjpmaW5kKHMuc2Vjb25kLmJlZ2luKCksIHMuc2Vjb25kLmVuZCgpLCBzdXJmYWNlSWQpOwogICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzLnNlY29uZC5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTA0Miw2ICs1NzYxLDIyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSB7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGZvciBjYW1lcmEgZGV2aWNlIG5vdCBzdXBwb3J0aW5nIEhBTCBidWZmZXIgbWFuYWdlbWVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgcGwobVBhdXNlTG9jayk7CisgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihzdHJlYW1JZHMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElmIHJlcXVlc3QgdGhyZWFkIGlzIHN0aWxsIGJ1c3ksIHdhaXQgdW50aWwgcGF1c2VkIHRoZW4gbm90aWZ5IEhBTAorICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gdHJ1ZTsKKyAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQgPSBzdHJlYW1JZHM7Cit9CisKIG5zZWNzX3QgQ2FtZXJhM0RldmljZTo6Z2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1JbkZsaWdodExvY2spOwpAQCAtNTA5OSwxNiArNTgzNCwyMSBAQAogICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1JbnB1dFN0cmVhbS0+cmV0dXJuSW5wdXRCdWZmZXIoY2FwdHVyZVJlcXVlc3QtPm1JbnB1dEJ1ZmZlcik7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbFJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7Ci0gICAgICAgICAgICAvL0J1ZmZlcnMgdGhhdCBmYWlsZWQgcHJvY2Vzc2luZyBjb3VsZCBzdGlsbCBoYXZlCi0gICAgICAgICAgICAvL3ZhbGlkIGFjcXVpcmUgZmVuY2UuCi0gICAgICAgICAgICBpbnQgYWNxdWlyZUZlbmNlID0gKCpvdXRwdXRCdWZmZXJzKVtpXS5hY3F1aXJlX2ZlbmNlOwotICAgICAgICAgICAgaWYgKDAgPD0gYWNxdWlyZUZlbmNlKSB7Ci0gICAgICAgICAgICAgICAgY2xvc2UoYWNxdWlyZUZlbmNlKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgLy8gTm8gb3V0cHV0IGJ1ZmZlciBjYW4gYmUgcmV0dXJuZWQgd2hlbiB1c2luZyBIQUwgYnVmZmVyIG1hbmFnZXIKKyAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxSZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgeworICAgICAgICAgICAgICAgIC8vQnVmZmVycyB0aGF0IGZhaWxlZCBwcm9jZXNzaW5nIGNvdWxkIHN0aWxsIGhhdmUKKyAgICAgICAgICAgICAgICAvL3ZhbGlkIGFjcXVpcmUgZmVuY2UuCisgICAgICAgICAgICAgICAgaW50IGFjcXVpcmVGZW5jZSA9ICgqb3V0cHV0QnVmZmVycylbaV0uYWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBhY3F1aXJlRmVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGkpLT5yZXR1cm5CdWZmZXIoKCpvdXRwdXRCdWZmZXJzKVtpXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPnJldHVybkJ1ZmZlcigoKm91dHB1dEJ1ZmZlcnMpW2ldLCAwKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzZW5kUmVxdWVzdEVycm9yKSB7CkBAIC01MjE0LDExICs1OTU0LDIwIEBACiAgICAgICAgICAgICBpZiAobVBhdXNlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUmVxdWVzdFRocmVhZDogR29pbmcgaWRsZSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1Ob3RpZnlQaXBlbGluZURyYWluKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2UtPnNpZ25hbFBpcGVsaW5lRHJhaW4obVN0cmVhbUlkc1RvQmVEcmFpbmVkKTsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIExldCB0aGUgdHJhY2tlciBrbm93CiAgICAgICAgICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1TdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTdG9wIHdhaXRpbmcgZm9yIG5vdyBhbmQgbGV0IHRocmVhZCBtYW5hZ2VtZW50IGhhcHBlbgogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01Mjk4LDExICs2MDQ3LDIwIEBACiAgICAgICAgIGlmIChtUGF1c2VkID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgIEFMT0dWKCIlczogUmVxdWVzdFRocmVhZDogUGF1c2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGlmIChtTm90aWZ5UGlwZWxpbmVEcmFpbikgeworICAgICAgICAgICAgICAgIG1JbnRlcmZhY2UtPnNpZ25hbFBpcGVsaW5lRHJhaW4obVN0cmVhbUlkc1RvQmVEcmFpbmVkKTsKKyAgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZC5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gTGV0IHRoZSB0cmFja2VyIGtub3cKICAgICAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25SZXF1ZXN0VGhyZWFkUGF1c2VkKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXMgPSBtRG9QYXVzZVNpZ25hbC53YWl0UmVsYXRpdmUobVBhdXNlTG9jaywga1JlcXVlc3RUaW1lb3V0KTsKQEAgLTU3NTgsMjMgKzY1MTYsMTc0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLS8qKgotICogU3RhdGljIGNhbGxiYWNrIGZvcndhcmRpbmcgbWV0aG9kcyBmcm9tIEhBTCB0byBpbnN0YW5jZQotICovCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjppbml0aWFsaXplKAorICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyKSB7CisgICAgaWYgKHN0YXR1c1RyYWNrZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHN0YXR1c1RyYWNrZXIgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OnNQcm9jZXNzQ2FwdHVyZVJlc3VsdChjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqY2IsCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXN1bHQgKnJlc3VsdCkgewotICAgIENhbWVyYTNEZXZpY2UgKmQgPQotICAgICAgICAgICAgY29uc3RfY2FzdDxDYW1lcmEzRGV2aWNlKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhM0RldmljZSo+KGNiKSk7Ci0KLSAgICBkLT5wcm9jZXNzQ2FwdHVyZVJlc3VsdChyZXN1bHQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtU3RhdHVzVHJhY2tlciA9IHN0YXR1c1RyYWNrZXI7CisgICAgbVJlcXVlc3RCdWZmZXJTdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOworICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpzTm90aWZ5KGNvbnN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICpjYiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpIHsKLSAgICBDYW1lcmEzRGV2aWNlICpkID0KLSAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Q2FtZXJhM0RldmljZSo+KHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYTNEZXZpY2UqPihjYikpOwotICAgIGQtPm5vdGlmeShtc2cpOworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpzdGFydFJlcXVlc3RCdWZmZXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19SRUFEWSB8fCBtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgbVJlcXVlc3RCdWZmZXJPbmdvaW5nID0gdHJ1ZTsKKyAgICAgICAgbm90aWZ5VHJhY2tlckxvY2tlZCgvKmFjdGl2ZSovdHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6ZW5kUmVxdWVzdEJ1ZmZlcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKCFtUmVxdWVzdEJ1ZmZlck9uZ29pbmcpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBzdGFydFJlcXVlc3RCdWZmZXIgY2FsbCBmaXJzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IGZhbHNlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgbm90aWZ5VHJhY2tlckxvY2tlZCgvKmFjdGl2ZSovZmFsc2UpOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uU3RyZWFtc0NvbmZpZ3VyZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUkVBRFk7CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uU3VibWl0dGluZ1JlcXVlc3QoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1SZXF1ZXN0VGhyZWFkUGF1c2VkID0gZmFsc2U7CisgICAgLy8gaW5mbGlnaHQgbWFwIHJlZ2lzdGVyIGFjdHVhbGx5IGhhcHBlbnMgaW4gcHJlcGFyZUhhbFJlcXVlc3Qgbm93LCBidXQgaXQgaXMgY2xvc2UgZW5vdWdoCisgICAgLy8gYXBwcm94aW1hdGlvbi4KKyAgICBtSW5mbGlnaHRNYXBFbXB0eSA9IGZhbHNlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19TVE9QUEVEKSB7CisgICAgICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUkVBRFk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvblJlcXVlc3RUaHJlYWRQYXVzZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1SZXF1ZXN0VGhyZWFkUGF1c2VkID0gdHJ1ZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvbkluZmxpZ2h0TWFwRW1wdHkoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1JbmZsaWdodE1hcEVtcHR5ID0gdHJ1ZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvbldhaXRVbnRpbElkbGUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmICghY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKSkgeworICAgICAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om5vdGlmeVRyYWNrZXJMb2NrZWQoYm9vbCBhY3RpdmUpIHsKKyAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOworICAgIGlmIChzdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6Y2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKSB7CisgICAgaWYgKG1JbmZsaWdodE1hcEVtcHR5ICYmIG1SZXF1ZXN0VGhyZWFkUGF1c2VkICYmICFtUmVxdWVzdEJ1ZmZlck9uZ29pbmcpIHsKKyAgICAgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19TVE9QUEVEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpmaXh1cE1vbm9jaHJvbWVUYWdzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBkZXZpY2VJbmZvLAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAoIW1OZWVkRml4dXBNb25vY2hyb21lVGFncykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIFJlbW92ZSB0YWdzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIHRvIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIGludDMyX3QgdGFnc1RvUmVtb3ZlW10gPSB7CisgICAgICAgICAgIEFORFJPSURfU0VOU09SX0dSRUVOX1NQTElULAorICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5ULAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TLAorICAgIH07CisgICAgZm9yIChhdXRvIHRhZyA6IHRhZ3NUb1JlbW92ZSkgeworICAgICAgICByZXMgPSByZXN1bHRNZXRhZGF0YS5lcmFzZSh0YWcpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZW1vdmUgdGFnICVkIGZvciBtb25vY2hyb21lIGNhbWVyYSIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJsRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwpOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgYmxFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgIGJsRW50cnkuZGF0YS5mW2ldID0gYmxFbnRyeS5kYXRhLmZbMF07CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRQorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBucEVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFKTsKKyAgICBpZiAobnBFbnRyeS5jb3VudCA+IDAgJiYgbnBFbnRyeS5jb3VudCAlIDIgPT0gMCkgeworICAgICAgICBkb3VibGUgbnBbXSA9IHtucEVudHJ5LmRhdGEuZFswXSwgbnBFbnRyeS5kYXRhLmRbMV19OworICAgICAgICByZXMgPSByZXN1bHRNZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRSwgbnAsIDIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFNFTlNPUl9OT0lTRV9QUk9GSUxFOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUAorICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBsc1NpemVFbnRyeSA9IGRldmljZUluZm8uZmluZChBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbHNFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVApOworICAgIGlmIChsc1NpemVFbnRyeS5jb3VudCA9PSAyICYmIGxzRW50cnkuY291bnQgPiAwCisgICAgICAgICAgICAmJiAoaW50MzJfdClsc0VudHJ5LmNvdW50ID09IDQgKiBsc1NpemVFbnRyeS5kYXRhLmkzMlswXSAqIGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzFdKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzBdICogbHNTaXplRW50cnkuZGF0YS5pMzJbMV07IGkrKykgeworICAgICAgICAgICAgbHNFbnRyeS5kYXRhLmZbNCppKzFdID0gbHNFbnRyeS5kYXRhLmZbNCppXTsKKyAgICAgICAgICAgIGxzRW50cnkuZGF0YS5mWzQqaSsyXSA9IGxzRW50cnkuZGF0YS5mWzQqaV07CisgICAgICAgICAgICBsc0VudHJ5LmRhdGEuZls0KmkrM10gPSBsc0VudHJ5LmRhdGEuZls0KmldOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9UT05FTUFQX0NVUlZFX0JMVUUKKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfR1JFRU4KKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVECisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjYkVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfQkxVRSk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjZ0VudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfR1JFRU4pOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSB0Y3JFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9UT05FTUFQX0NVUlZFX1JFRCk7CisgICAgaWYgKHRjYkVudHJ5LmNvdW50ID4gMAorICAgICAgICAgICAgJiYgdGNiRW50cnkuY291bnQgPT0gdGNnRW50cnkuY291bnQKKyAgICAgICAgICAgICYmIHRjYkVudHJ5LmNvdW50ID09IHRjckVudHJ5LmNvdW50KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGNiRW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgdGNiRW50cnkuZGF0YS5mW2ldID0gdGNyRW50cnkuZGF0YS5mW2ldOworICAgICAgICAgICAgdGNnRW50cnkuZGF0YS5mW2ldID0gdGNyRW50cnkuZGF0YS5mW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKIH0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKaW5kZXggMTMxZDYyZi4uZDNiYjIxMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKQEAgLTMzLDEwICszMywxMSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4zL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KIApAQCAtNTAsMjAgKzUxLDYgQEAKIAogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKIAotLyoqCi0gKiBGdW5jdGlvbiBwb2ludGVyIHR5cGVzIHdpdGggQyBjYWxsaW5nIGNvbnZlbnRpb24gdG8KLSAqIHVzZSBmb3IgSEFMIGNhbGxiYWNrIGZ1bmN0aW9ucy4KLSAqLwotZXh0ZXJuICJDIiB7Ci0gICAgdHlwZWRlZiB2b2lkIChjYWxsYmFja3NfcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdF90KSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICosCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXN1bHRfdCAqKTsKLQotICAgIHR5cGVkZWYgdm9pZCAoY2FsbGJhY2tzX25vdGlmeV90KSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICosCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfbm90aWZ5X21zZ190ICopOwotfQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKQEAgLTgwLDggKzY3LDcgQEAKICAqLwogY2xhc3MgQ2FtZXJhM0RldmljZSA6CiAgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhRGV2aWNlQmFzZSwKLSAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZUNhbGxiYWNrLAotICAgICAgICAgICAgcHJpdmF0ZSBjYW1lcmEzX2NhbGxiYWNrX29wcyB7CisgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjayB7CiAgIHB1YmxpYzoKIAogICAgIGV4cGxpY2l0IENhbWVyYTNEZXZpY2UoY29uc3QgU3RyaW5nOCYgaWQpOwpAQCAtMjA4LDggKzE5NCwzMiBAQAogICAgICAqLwogICAgIHN0YXR1c190IGRyb3BTdHJlYW1CdWZmZXJzKGJvb2wgZHJvcHBpbmcsIGludCBzdHJlYW1JZCkgb3ZlcnJpZGU7CiAKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIG1hcCBiZXR3ZWVuIGZyYW1ld29yayBhbmQgSElETCB2YWx1ZXMKKyAgICAgKi8KKyAgICBzdGF0aWMgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IG1hcFRvUGl4ZWxGb3JtYXQoaW50IGZyYW1ld29ya0Zvcm1hdCk7CisgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MgbWFwVG9IaWRsRGF0YXNwYWNlKAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIG1hcFRvQ29uc3VtZXJVc2FnZSh1aW50NjRfdCB1c2FnZSk7CisgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb24gbWFwVG9TdHJlYW1Sb3RhdGlvbigKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOworICAgIC8vIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwYXNzZWQtaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IHZhbGlkLgorICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsCisgICAgICAgICAgICAvKm91dCovIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgKm1vZGUpOworICAgIHN0YXRpYyBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXMgc3RhdHVzKTsKKyAgICBzdGF0aWMgaW50IG1hcFRvRnJhbWV3b3JrRm9ybWF0KGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCk7CisgICAgc3RhdGljIGFuZHJvaWRfZGF0YXNwYWNlIG1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyk7CisgICAgc3RhdGljIHVpbnQ2NF90IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7CisgICAgc3RhdGljIHVpbnQ2NF90IG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7CisKICAgcHJpdmF0ZToKIAorICAgIHN0YXR1c190IGRpc2Nvbm5lY3RJbXBsKCk7CisKICAgICAvLyBpbnRlcm5hbCB0eXBlZGVmcwogICAgIHVzaW5nIFJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47CiAgICAgdXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSAgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKQEAgLTI2OCw3ICsyNzgsOCBAQAogICAgIGNsYXNzIEhhbEludGVyZmFjZSA6IHB1YmxpYyBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lciB7CiAgICAgICBwdWJsaWM6CiAgICAgICAgIEhhbEludGVyZmFjZShzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUpOworICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcik7CiAgICAgICAgIEhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UgJm90aGVyKTsKICAgICAgICAgSGFsSW50ZXJmYWNlKCk7CiAKQEAgLTI5NywxNCArMzA4LDM1IEBACiAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKICAgICAgICAgc3RhdHVzX3QgY2xvc2UoKTsKIAorICAgICAgICB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKTsKKyAgICAgICAgYm9vbCBpc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKENhbWVyYU1ldGFkYXRhJiBvbGRTZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKTsKKworICAgICAgICAvLyBtZXRob2QgdG8gZXh0cmFjdCBidWZmZXIncyB1bmlxdWUgSUQKKyAgICAgICAgLy8gcmV0dXJuIHBhaXIgb2YgKG5ld2x5U2VlbkJ1ZmZlcj8sIGJ1ZmZlcklkKQorICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgdWludDY0X3Q+IGdldEJ1ZmZlcklkKGNvbnN0IGJ1ZmZlcl9oYW5kbGVfdCYgYnVmLCBpbnQgc3RyZWFtSWQpOworCiAgICAgICAgIC8vIEZpbmQgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gZnJhbWUgbnVtYmVyIGFuZCBzdHJlYW0gSUQKICAgICAgICAgc3RhdHVzX3QgcG9wSW5mbGlnaHRCdWZmZXIoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCBzdHJlYW1JZCwKICAgICAgICAgICAgICAgICAvKm91dCovIGJ1ZmZlcl9oYW5kbGVfdCAqKmJ1ZmZlcik7CiAKKyAgICAgICAgLy8gUmVnaXN0ZXIgYSBidWZJZCAoc3RyZWFtSWQsIGJ1ZmZlcl9oYW5kbGVfdCkgdG8gaW5mbGlnaHQgcmVxdWVzdCBidWZmZXIKKyAgICAgICAgc3RhdHVzX3QgcHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJJZCwgYnVmZmVyX2hhbmRsZV90KiBidWYsIGludDMyX3Qgc3RyZWFtSWQpOworCisgICAgICAgIC8vIEZpbmQgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gYnVmZmVySWQKKyAgICAgICAgc3RhdHVzX3QgcG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90KiogYnVmZmVyLAorICAgICAgICAgICAgICAgIC8qb3B0aW9uYWwgb3V0Ki8gaW50MzJfdCogc3RyZWFtSWQgPSBudWxscHRyKTsKKwogICAgICAgICAvLyBHZXQgYSB2ZWN0b3Igb2YgKGZyYW1lTnVtYmVyLCBzdHJlYW1JZCkgcGFpciBvZiBjdXJyZW50bHkgaW5mbGlnaHQKICAgICAgICAgLy8gYnVmZmVycwogICAgICAgICB2b2lkIGdldEluZmxpZ2h0QnVmZmVyS2V5cyhzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBvdXQpOwogCisgICAgICAgIC8vIEdldCBhIHZlY3RvciBvZiBidWZmZXJJZCBvZiBjdXJyZW50bHkgaW5mbGlnaHQgYnVmZmVycworICAgICAgICB2b2lkIGdldEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMoc3RkOjp2ZWN0b3I8dWludDY0X3Q+KiBvdXQpOworCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKICAgICAgIHByaXZhdGU6CiAgICAgICAgIC8vIEFsd2F5cyB2YWxpZAogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb247CkBAIC0zMTIsNiArMzQ0LDggQEAKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfMzsKICAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNCBvciBuZXdlcgogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM180OworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy41IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzU7CiAKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CiAKQEAgLTMxOSw3ICszNTMsNyBAQAogCiAgICAgICAgIC8vIFRoZSBvdXRwdXQgSElETCByZXF1ZXN0IHN0aWxsIGRlcGVuZHMgb24gaW5wdXQgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdAogICAgICAgICAvLyBEbyBub3QgZnJlZSBpbnB1dCBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90IGJlZm9yZSBvdXRwdXQgSElETCByZXF1ZXN0Ci0gICAgICAgIHZvaWQgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogaW4sCisgICAgICAgIHN0YXR1c190IHdyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIGluLAogICAgICAgICAgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBvdXQsCiAgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCk7CiAKQEAgLTM2MywxOSArMzk3LDE5IEBACiAgICAgICAgIC8vIHN0cmVhbSBJRCAtPiBwZXIgc3RyZWFtIGJ1ZmZlciBJRCBtYXAKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgQnVmZmVySWRNYXA+IG1CdWZmZXJJZE1hcHM7CiAgICAgICAgIHVpbnQ2NF90IG1OZXh0QnVmZmVySWQgPSAxOyAvLyAwIG1lYW5zIG5vIGJ1ZmZlcgotICAgICAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQlVGRkVSX0lEX05PX0JVRkZFUiA9IDA7Ci0KLSAgICAgICAgLy8gbWV0aG9kIHRvIGV4dHJhY3QgYnVmZmVyJ3MgdW5pcXVlIElECi0gICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBzd2l0Y2ggdG8gdXNlIGdyYWxsb2MgbWFwcGVyJ3MgZ2V0QmFja2luZ1N0b3JlIEFQSQotICAgICAgICAvLyAgICAgICBvbmNlIHdlIHJhbiBpbiBiaW5kZXJpemVkIGdyYWxsb2MgbW9kZSwgYnV0IGJlZm9yZSB0aGF0IGlzIHJlYWR5LAotICAgICAgICAvLyAgICAgICB3ZSBuZWVkIHRvIHJlbHkgb24gdGhlIGNvbnZlbnRpb25hbCBidWZmZXIgcXVldWUgYmVoYXZpb3Igd2hlcmUKLSAgICAgICAgLy8gICAgICAgYnVmZmVyX2hhbmRsZV90J3MgRkQgd29uJ3QgY2hhbmdlLgotICAgICAgICAvLyByZXR1cm4gcGFpciBvZiAobmV3bHlTZWVuQnVmZmVyPywgYnVmZmVySWQpCi0gICAgICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCk7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyRnJlZWQoaW50IHN0cmVhbUlkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgb3ZlcnJpZGU7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgdWludDY0X3Q+PiBtRnJlZWRCdWZmZXJzOworCisgICAgICAgIC8vIEJ1ZmZlcnMgZ2l2ZW4gdG8gSEFMIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlciBBUEkKKyAgICAgICAgc3RkOjptdXRleCBtUmVxdWVzdGVkQnVmZmVyc0xvY2s7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgc3RkOjpwYWlyPGludDMyX3QsIGJ1ZmZlcl9oYW5kbGVfdCo+PiBtUmVxdWVzdGVkQnVmZmVyczsKKworICAgICAgICB1aW50MzJfdCBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIgPSAxOworCisgICAgICAgIGNvbnN0IGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXI7CisgICAgICAgIGJvb2wgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQ7CiAgICAgfTsKIAogICAgIHNwPEhhbEludGVyZmFjZT4gbUludGVyZmFjZTsKQEAgLTQxMCw5ICs0NDQsMjIgQEAKICAgICAvLyBUcmFja2luZyBjYXVzZSBvZiBmYXRhbCBlcnJvcnMgd2hlbiBpbiBTVEFUVVNfRVJST1IKICAgICBTdHJpbmc4ICAgICAgICAgICAgICAgICAgICBtRXJyb3JDYXVzZTsKIAotICAgIC8vIE1hcHBpbmcgb2Ygc3RyZWFtIElEcyB0byBzdHJlYW0gaW5zdGFuY2VzCi0gICAgdHlwZWRlZiBLZXllZFZlY3RvcjxpbnQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+ID4KLSAgICAgICAgICAgIFN0cmVhbVNldDsKKyAgICAvLyBTeW5jaHJvbml6ZWQgbWFwcGluZyBvZiBzdHJlYW0gSURzIHRvIHN0cmVhbSBpbnN0YW5jZXMKKyAgICBjbGFzcyBTdHJlYW1TZXQgeworICAgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBhZGQoaW50IHN0cmVhbUlkLCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPik7CisgICAgICAgIHNzaXplX3QgcmVtb3ZlKGludCBzdHJlYW1JZCk7CisgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IGdldChpbnQgc3RyZWFtSWQpOworICAgICAgICAvLyBnZXQgYnkgKHVuZGVybHlpbmcpIHZlY3RvciBpbmRleAorICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvcGVyYXRvcltdIChzaXplX3QgaW5kZXgpOworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGdldFN0cmVhbUlkcygpOworICAgICAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgS2V5ZWRWZWN0b3I8aW50LCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPj4gbURhdGE7CisgICAgfTsKIAogICAgIFN0cmVhbVNldCAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zOwogICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+IG1JbnB1dFN0cmVhbTsKQEAgLTQ4MSw4ICs1MjgsOSBAQAogCiAKICAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrCiAgICAgICovCisKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7CkBAIC00OTMsNiArNTQxLDE1IEBACiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgb3ZlcnJpZGU7CiAKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIG92ZXJyaWRlOworCiAgICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIHRoYXQgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jayBpcyBoZWxkLgogICAgIHZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCwKQEAgLTY1MywyNyArNzEwLDYgQEAKICAgICAgKi8KICAgICBzdGF0aWMgbnNlY3NfdCBnZXRNb25vVG9Cb290dGltZU9mZnNldCgpOwogCi0gICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCi0gICAgICovCi0gICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKLSAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKLSAgICAvLyBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgcGFzc2VkLWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCB2YWxpZC4KLSAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZShjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAotICAgICAgICAgICAgLypvdXQqLyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKLSAgICBzdGF0aWMgY2FtZXJhM19idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cyhoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOwotICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKLSAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKLSAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLSAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLQogICAgIHN0cnVjdCBSZXF1ZXN0VHJpZ2dlciB7CiAgICAgICAgIC8vIE1ldGFkYXRhIHRhZyBudW1iZXIsIGUuZy4gYW5kcm9pZC5jb250cm9sLmFlUHJlY2FwdHVyZVRyaWdnZXIKICAgICAgICAgdWludDMyX3QgbWV0YWRhdGFUYWc7CkBAIC03MDAsNyArNzM2LDkgQEAKIAogICAgICAgICBSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAotICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpOworICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgICAgICB+UmVxdWVzdFRocmVhZCgpOwogCiAgICAgICAgIHZvaWQgICAgIHNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcik7CkBAIC03ODgsNiArODI2LDggQEAKICAgICAgICAgICAgIG1SZXF1ZXN0TGF0ZW5jeS5kdW1wKGZkLCBuYW1lKTsKICAgICAgICAgfQogCisgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOworCiAgICAgICBwcm90ZWN0ZWQ6CiAKICAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKQEAgLTg5NywxMiArOTM3LDEzIEBACiAKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1SZWNvbmZpZ3VyZWQ7CiAKLSAgICAgICAgLy8gVXNlZCBieSB3YWl0SWZQYXVzZWQsIHdhaXRGb3JOZXh0UmVxdWVzdCwgYW5kIHdhaXRVbnRpbFBhdXNlZAorICAgICAgICAvLyBVc2VkIGJ5IHdhaXRJZlBhdXNlZCwgd2FpdEZvck5leHRSZXF1ZXN0LCB3YWl0VW50aWxQYXVzZWQsIGFuZCBzaWduYWxQaXBlbGluZURyYWluCiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICBtUGF1c2VMb2NrOwogICAgICAgICBib29sICAgICAgICAgICAgICAgbURvUGF1c2U7CiAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICBtRG9QYXVzZVNpZ25hbDsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1QYXVzZWQ7Ci0gICAgICAgIENvbmRpdGlvbiAgICAgICAgICBtUGF1c2VkU2lnbmFsOworICAgICAgICBib29sICAgICAgICAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW47CisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gICBtU3RyZWFtSWRzVG9CZURyYWluZWQ7CiAKICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IG1QcmV2UmVxdWVzdDsKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIG1QcmV2VHJpZ2dlcnM7CkBAIC05MzUsNiArOTc2LDggQEAKIAogICAgICAgICBWZWN0b3I8aW50MzJfdD4gICAgbVNlc3Npb25QYXJhbUtleXM7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtczsKKworICAgICAgICBjb25zdCBib29sICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXI7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtOTk1LDYgKzEwMzgsMTUgQEAKICAgICAgICAgLy8gTWFwIG9mIHBoeXNpY2FsQ2FtZXJhSWQgPC0+IE1ldGFkYXRhCiAgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsTWV0YWRhdGFzOwogCisgICAgICAgIC8vIEluZGljYXRlcyBhIHN0aWxsIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgYm9vbCBzdGlsbENhcHR1cmU7CisKKyAgICAgICAgLy8gSW5kaWNhdGVzIGEgWlNMIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBib29sIHpzbENhcHR1cmU7CisKKyAgICAgICAgLy8gV2hhdCBzaGFyZWQgc3VyZmFjZXMgYW4gb3V0cHV0IHNob3VsZCBnbyB0bworICAgICAgICBTdXJmYWNlTWFwIG91dHB1dFN1cmZhY2VzOworCiAgICAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJ5IEtleWVkVmVjdG9yCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCgpIDoKICAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLApAQCAtMTAwNSwxMiArMTA1NywxNiBAQAogICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKSwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayh0cnVlKSwKICAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbiksCi0gICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBzdGlsbENhcHR1cmUoZmFsc2UpLAorICAgICAgICAgICAgICAgIHpzbENhcHR1cmUoZmFsc2UpIHsKICAgICAgICAgfQogCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQsCiAgICAgICAgICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZFNldCkgOgorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkU2V0LCBib29sIGlzU3RpbGxDYXB0dXJlLAorICAgICAgICAgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9KSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICBzZW5zb3JUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCkBAIC0xMDIxLDcgKzEwNzcsMTAgQEAKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayhoYXNBcHBDYWxsYmFjayksCiAgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihtYXhEdXJhdGlvbiksCiAgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcyhwaHlzaWNhbENhbWVyYUlkU2V0KSB7CisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMocGh5c2ljYWxDYW1lcmFJZFNldCksCisgICAgICAgICAgICAgICAgc3RpbGxDYXB0dXJlKGlzU3RpbGxDYXB0dXJlKSwKKyAgICAgICAgICAgICAgICB6c2xDYXB0dXJlKGlzWnNsQ2FwdHVyZSksCisgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMob3V0U3VyZmFjZXMpIHsKICAgICAgICAgfQogICAgIH07CiAKQEAgLTEwMzUsMTAgKzEwOTQsMTEgQEAKICAgICBuc2Vjc190ICAgICAgICAgICAgICAgIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPSAwOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0U3RhdHVzSWQ7CiAKLQogICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlLCBib29sIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZXhwZWN0ZWQgdGltZSBpdCdsbCB0YWtlIGZvciBhbGwgY3VycmVudGx5IGluLWZsaWdodApAQCAtMTE0OCw3ICsxMjA4LDExIEBACiAKICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBvdXRwdXQgYnVmZmVycyB0byB0aGUgc3RyZWFtcy4KICAgICB2b2lkIHJldHVybk91dHB1dEJ1ZmZlcnMoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMsCi0gICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVycywgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSB0cnVlLAorICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG9ubHkgbWVhbnQgZm9yIHN1cmZhY2Ugc2hhcmluZyB1c2UgY2FzZQorICAgICAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMgPSBTdXJmYWNlTWFwe30sCisgICAgICAgICAgICAvLyBVc2VkIHRvIHNlbmQgYnVmZmVyIGVycm9yIGNhbGxiYWNrIHdoZW4gZmFpbGluZyB0byByZXR1cm4gYnVmZmVyCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMgPSBDYXB0dXJlUmVzdWx0RXh0cmFze30pOwogCiAgICAgLy8gU2VuZCBhIHBhcnRpYWwgY2FwdHVyZSByZXN1bHQuCiAgICAgdm9pZCBzZW5kUGFydGlhbENhcHR1cmVSZXN1bHQoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKiBwYXJ0aWFsUmVzdWx0LApAQCAtMTIwNCwxMyArMTI2OCw4OCBAQAogICAgIC8vIENhY2hlZCBsYXN0IHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZAogICAgIGludCBtTGFzdFRlbXBsYXRlSWQ7CiAKLSAgICAvKioKLSAgICAgKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCi0gICAgICovCi0gICAgc3RhdGljIGNhbGxiYWNrc19wcm9jZXNzX2NhcHR1cmVfcmVzdWx0X3Qgc1Byb2Nlc3NDYXB0dXJlUmVzdWx0OworICAgIC8vIFN5bmNocm9uaXplcyBhY2Nlc3MgdG8gc3RhdHVzIHRyYWNrZXIgYmV0d2VlbiBpbmZsaWdodCB1cGRhdGVzIGFuZCBkaXNjb25uZWN0LgorICAgIC8vIGIvNzk5NzI4NjUKKyAgICBNdXRleCBtVHJhY2tlckxvY2s7CiAKLSAgICBzdGF0aWMgY2FsbGJhY2tzX25vdGlmeV90IHNOb3RpZnk7CisgICAgLy8gV2hldGhlciBIQUwgcmVxdWVzdCBidWZmZXJzIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgQVBJCisgICAgYm9vbCBtVXNlSGFsQnVmTWFuYWdlciA9IGZhbHNlOwogCisgICAgLy8gTG9jayB0byBlbnN1cmUgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoKSBjYWxsYmFja3MgYXJlIHNlcmlhbGl6ZWQKKyAgICBzdGQ6Om11dGV4IG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jazsKKworICAgIC8vIFRoZSBzdGF0ZSBtYWNoaW5lIHRvIGNvbnRyb2wgd2hlbiByZXF1ZXN0U3RyZWFtQnVmZmVycyBzaG91bGQgYWxsb3cKKyAgICAvLyBIQUwgdG8gcmVxdWVzdCBidWZmZXJzLgorICAgIGVudW0gUmVxdWVzdEJ1ZmZlclN0YXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUuCisgICAgICAgICAqIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwgd2lsbCByZXR1cm4gRkFJTEVEX0NPTkZJR1VSSU5HIGluIHRoaXMgc3RhdGUuCisgICAgICAgICAqIFdpbGwgc3dpdGNoIHRvIFJCX1NUQVRVU19SRUFEWSBhZnRlciBhIHN1Y2Nlc3NmdWwgY29uZmlndXJlU3RyZWFtcyBvcgorICAgICAgICAgKiBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgY2FsbC4KKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19TVE9QUEVELAorCisgICAgICAgIC8qKgorICAgICAgICAgKiByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsIHdpbGwgcHJvY2VlZCBpbiB0aGlzIHN0YXRlLgorICAgICAgICAgKiBXaGVuIGRldmljZSBpcyBhc2tlZCB0byBzdGF5IGlkbGUgdmlhIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygpIGNhbGw6CisgICAgICAgICAqICAgICAtIFN3aXRjaCB0byBSQl9TVEFUVVNfU1RPUFBFRCBpZiB0aGVyZSBpcyBubyBpbmZsaWdodCByZXF1ZXN0cyBhbmQKKyAgICAgICAgICogICAgICAgcmVxdWVzdCB0aHJlYWQgaXMgcGF1c2VkLgorICAgICAgICAgKiAgICAgLSBTd2l0Y2ggdG8gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19SRUFEWSwKKworICAgICAgICAvKioKKyAgICAgICAgICogcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCB3aWxsIHByb2NlZWQgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgICogU3dpdGNoIHRvIFJCX1NUQVRVU19TVE9QUEVEIHdoZW4gYWxsIGluZmxpZ2h0IHJlcXVlc3RzIGFyZSBmdWxmaWxsZWQKKyAgICAgICAgICogYW5kIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZAorICAgICAgICAgKi8KKyAgICAgICAgUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCwKKyAgICB9OworCisgICAgY2xhc3MgUmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlcik7CisKKyAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSBzdGF0ZSBtYWNoaW5lIGN1cnJlbnRseSBhbGxvd3MgZm9yIHJlcXVlc3RCdWZmZXJzCisgICAgICAgIC8vIElmIHRoZSBzdGF0ZSBhbGxvd3MgZm9yIGl0LCBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAgICAvLyBhbmQgY2FsbGVyIG11c3QgY2FsbCBlbmRSZXF1ZXN0QnVmZmVyKCkgbGF0ZXIgdG8gdW5zZXQgdGhlIGZsYWcKKyAgICAgICAgYm9vbCBzdGFydFJlcXVlc3RCdWZmZXIoKTsKKyAgICAgICAgdm9pZCBlbmRSZXF1ZXN0QnVmZmVyKCk7CisKKyAgICAgICAgLy8gRXZlbnRzIHRyaWdnZXJlZCBieSBhcHBsaWNhdGlvbiBBUEkgY2FsbAorICAgICAgICB2b2lkIG9uU3RyZWFtc0NvbmZpZ3VyZWQoKTsKKyAgICAgICAgdm9pZCBvbldhaXRVbnRpbElkbGUoKTsKKworICAgICAgICAvLyBFdmVudHMgdXN1YWxseSB0cmlnZ2VyZWQgYnkgaHdCaW5kZXIgcHJvY2Vzc0NhcHR1cmVSZXN1bHQgY2FsbGJhY2sgdGhyZWFkCisgICAgICAgIC8vIEJ1dCBjYW4gYWxzbyBiZSB0cmlnZ2VyZWQgb24gcmVxdWVzdCB0aHJlYWQgZm9yIGZhaWxlZCByZXF1ZXN0LCBvciBvbgorICAgICAgICAvLyBod2JpbmRlciBub3RpZnkgY2FsbGJhY2sgdGhyZWFkIGZvciBzaHV0dGVyL2Vycm9yIGNhbGxiYWNrcworICAgICAgICB2b2lkIG9uSW5mbGlnaHRNYXBFbXB0eSgpOworCisgICAgICAgIC8vIEV2ZW50cyB0cmlnZ2VyZWQgYnkgUmVxdWVzdFRocmVhZAorICAgICAgICB2b2lkIG9uU3VibWl0dGluZ1JlcXVlc3QoKTsKKyAgICAgICAgdm9pZCBvblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBub3RpZnlUcmFja2VyTG9ja2VkKGJvb2wgYWN0aXZlKTsKKworICAgICAgICAvLyBTd2l0Y2ggdG8gU1RPUFBFRCBzdGF0ZSBhbmQgcmV0dXJuIHRydWUgaWYgYWxsIGNvbmRpdGlvbnMgYWxsb3dzIGZvciBpdC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlIGRvIG5vdGhpbmcgYW5kIHJldHVybiBmYWxzZS4KKyAgICAgICAgYm9vbCBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworCisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIFJlcXVlc3RCdWZmZXJTdGF0ZSBtU3RhdHVzID0gUkJfU1RBVFVTX1NUT1BQRUQ7CisKKyAgICAgICAgYm9vbCBtUmVxdWVzdFRocmVhZFBhdXNlZCA9IHRydWU7CisgICAgICAgIGJvb2wgbUluZmxpZ2h0TWFwRW1wdHkgPSB0cnVlOworICAgICAgICBib29sIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IGZhbHNlOworCisgICAgICAgIHdwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IG1TdGF0dXNUcmFja2VyOworICAgICAgICBpbnQgIG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQ7CisgICAgfSBtUmVxdWVzdEJ1ZmZlclNNOworCisgICAgLy8gRml4IHVwIHJlc3VsdCBtZXRhZGF0YSBmb3IgbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgYm9vbCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3M7CisgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgZGV2aWNlSW5mbywgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhKTsKIH07IC8vIGNsYXNzIENhbWVyYTNEZXZpY2UKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAppbmRleCBmYjFmZjc3Li5iNjM3MTYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgbnNlY3NfdCkgeworICAgICAgICBuc2Vjc190LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcmV0dXJuIGJ1ZmZlcnMhIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTU4LDYgKzU4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAogICAgICAgICAgICAgbnNlY3NfdCwKICAgICAgICAgICAgIGJvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiopIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKaW5kZXggNDYyNzU0OC4uNGI2N2VhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCkBAIC04Nyw2ICs4Nyw5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH07CisKICAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCkBAIC0xMDQsNiArMTA3LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCkBAIC0xMjgsNyArMTMyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggM2MxZTQzZC4uMmU5MDlhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICByZXR1cm4gbVRvdGFsQnVmZmVyQ291bnQ7CiB9CiAKLXNpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3QgewogICAgIHJldHVybiBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OwogfQogCkBAIC0yMTksNyArMjE5LDggQEAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OnJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBib29sIG91dHB1dCkgeworICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICAvLyByZXR1cm5CdWZmZXIgbWF5IGJlIGNhbGxlZCBmcm9tIGEgcmF3IHBvaW50ZXIsIG5vdCBhIHNwPD4sIGFuZCB3ZSdsbCBiZQpAQCAtMjM1LDcgKzIzNiw3IEBACiAgICAgfQogCiAgICAgc3A8RmVuY2U+IHJlbGVhc2VGZW5jZTsKLSAgICByZXMgPSByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCBvdXRwdXQsCisgICAgcmVzID0gcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgb3V0cHV0LCBzdXJmYWNlX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWxlYXNlRmVuY2UpOwogICAgIC8vIFJlcyBtYXkgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIGRlY3JlbWVudCBvdXIgb3duZWQgY291bnQKICAgICAvLyB0byBlbmFibGUgY2xlYW4gc2h1dGRvd24uIFNvIHdlJ2xsIGp1c3QgcmV0dXJuIHRoZSBlcnJvciBidXQgb3RoZXJ3aXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IDBhMzFkNDQuLjc1MGY2NGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC02NiwxMiArNjYsMTQgQEAKICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICBib29sIG91dHB1dCk7CisgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpID0gMDsKIApAQCAtODIsNyArODQsNyBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggMDE3ZDdiZS4uZmM4MzY4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtOTgsNiArOTgsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCAwNzMyNDY0Li45N2E2MjdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTYyLDYgKzYyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCAyYzAyMGEyLi5iYWJhODU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTE4NywxNiArMTg3LDE3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpIHsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgcmV0dXJuIGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSwgc3VyZmFjZV9pZHMpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMjEyLDYgKzIxMyw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSB7CiAKQEAgLTIzNywxMiArMjM5LDE0IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGJ1ZmZlciBiYWNrIHRvIEFOYXRpdmVXaW5kb3cKICAgICAgKi8KLSAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgfHwgbURyb3BCdWZmZXJzKSB7CisgICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IG1Ecm9wQnVmZmVycyB8fCB0aW1lc3RhbXAgPT0gMCkgewogICAgICAgICAvLyBDYW5jZWwgYnVmZmVyCiAgICAgICAgIGlmIChtRHJvcEJ1ZmZlcnMpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogRHJvcHBpbmcgYSBmcmFtZSBmb3Igc3RyZWFtICVkLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coIiVzOiBBIGZyYW1lIGlzIGRyb3BwZWQgZm9yIHN0cmVhbSAlZCBkdWUgdG8gYnVmZmVyIGVycm9yLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiB0aW1lc3RhbXAgc2hvdWxkbid0IGJlIDAiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXMgPSBjdXJyZW50Q29uc3VtZXItPmNhbmNlbEJ1ZmZlcihjdXJyZW50Q29uc3VtZXIuZ2V0KCksCkBAIC0yNzksNyArMjgzLDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KIAotICAgICAgICByZXMgPSBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoY3VycmVudENvbnN1bWVyLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgIHJlcyA9IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihjdXJyZW50Q29uc3VtZXIsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlLCBzdXJmYWNlX2lkcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBxdWV1ZWluZyBidWZmZXIgdG8gbmF0aXZlIHdpbmRvdzogIgogICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0zNTUsNyArMzU5LDE4IEBACiAgICAgLy8gU2V0IGRlcXVldWVCdWZmZXIvYXR0YWNoQnVmZmVyIHRpbWVvdXQgaWYgdGhlIGNvbnN1bWVyIGlzIG5vdCBodyBjb21wb3NlciBvciBodyB0ZXh0dXJlLgogICAgIC8vIFdlIG5lZWQgc2tpcCB0aGVzZSBjYXNlcyBhcyB0aW1lb3V0IHdpbGwgZGlzYWJsZSB0aGUgbm9uLWJsb2NraW5nIChhc3luYykgbW9kZS4KICAgICBpZiAoIShpc0NvbnN1bWVkQnlIV0NvbXBvc2VyKCkgfHwgaXNDb25zdW1lZEJ5SFdUZXh0dXJlKCkpKSB7Ci0gICAgICAgIG1Db25zdW1lci0+c2V0RGVxdWV1ZVRpbWVvdXQoa0RlcXVldWVCdWZmZXJUaW1lb3V0KTsKKyAgICAgICAgaWYgKG1Vc2VCdWZmZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyBXaGVuIGJ1ZmZlciBtYW5hZ2VyIGlzIGhhbmRsaW5nIHRoZSBidWZmZXIsIHdlIHNob3VsZCBoYXZlIGF2YWlsYWJsZSBidWZmZXJzIGluCisgICAgICAgICAgICAvLyBidWZmZXIgcXVldWUgYmVmb3JlIHdlIGNhbGxzIGludG8gZGVxdWV1ZUJ1ZmZlciBiZWNhdXNlIGJ1ZmZlciBtYW5hZ2VyIGlzIHRyYWNraW5nCisgICAgICAgICAgICAvLyBmcmVlIGJ1ZmZlcnMuCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgaG93ZXZlciBzb21lIGNvbnN1bWVyIHNpZGUgZmVhdHVyZSAoSW1hZ2VSZWFkZXI6OmRpc2NhcmRGcmVlQnVmZmVycykgdGhhdAorICAgICAgICAgICAgLy8gY2FuIGRpc2NhcmQgZnJlZSBidWZmZXJzIHdpdGhvdXQgbm90aWZ5aW5nIGJ1ZmZlciBtYW5hZ2VyLiBXZSB3YW50IHRoZSB0aW1lb3V0IHRvCisgICAgICAgICAgICAvLyBoYXBwZW4gaW1tZWRpYXRlbHkgaGVyZSBzbyBidWZmZXIgbWFuYWdlciBjYW4gdHJ5IHRvIHVwZGF0ZSBpdHMgaW50ZXJuYWwgc3RhdGUgYW5kCisgICAgICAgICAgICAvLyB0cnkgdG8gYWxsb2NhdGUgYSBidWZmZXIgaW5zdGVhZCBvZiB3YWl0aW5nLgorICAgICAgICAgICAgbUNvbnN1bWVyLT5zZXREZXF1ZXVlVGltZW91dCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Db25zdW1lci0+c2V0RGVxdWV1ZVRpbWVvdXQoa0RlcXVldWVCdWZmZXJUaW1lb3V0KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTUyMiw2ICs1MzcsOCBAQAogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBhdHRhY2ggdGhlIG91dHB1dCBidWZmZXIgdG8gdGhpcyBzdXJmYWNlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKworICAgICAgICAgICAgICAgIGNoZWNrUmV0QW5kU2V0QWJhbmRvbmVkTG9ja2VkKHJlcyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdvdEJ1ZmZlckZyb21NYW5hZ2VyID0gdHJ1ZTsKQEAgLTU1OCwzNSArNTc1LDcwIEBACiAgICAgICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeS5hZGQoZGVxdWV1ZVN0YXJ0LCBkZXF1ZXVlRW5kKTsKIAogICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKKworICAgICAgICBpZiAobVVzZUJ1ZmZlck1hbmFnZXIgJiYgcmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgY2hlY2tSZW1vdmVkQnVmZmVyc0xvY2tlZCgpOworCisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBnYjsKKyAgICAgICAgICAgIHJlcyA9IG1CdWZmZXJNYW5hZ2VyLT5nZXRCdWZmZXJGb3JTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIGdldElkKCksIGdldFN0cmVhbVNldElkKCksICZnYiwgZmVuY2VGZCwgLypub0ZyZWVCdWZmZXIqL3RydWUpOworCisgICAgICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRoaXMgYnVmZmVyIHRvIHRoZSBidWZmZXJRdWV1ZTogdGhlIGJ1ZmZlciB3aWxsIGJlIGluIGRlcXVldWUgc3RhdGUgYWZ0ZXIKKyAgICAgICAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgcmV0dXJuLgorICAgICAgICAgICAgICAgICphbmIgPSBnYi5nZXQoKTsKKyAgICAgICAgICAgICAgICByZXMgPSBtQ29uc3VtZXItPmF0dGFjaEJ1ZmZlcigqYW5iKTsKKyAgICAgICAgICAgICAgICBnb3RCdWZmZXJGcm9tTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICAgICAgQUxPR1YoIlN0cmVhbSAlZDogQXR0YWNoZWQgbmV3IGJ1ZmZlciIsIGdldElkKCkpOworCisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgYXR0YWNoIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoaXMgc3VyZmFjZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworCisgICAgICAgICAgICAgICAgICAgIGNoZWNrUmV0QW5kU2V0QWJhbmRvbmVkTG9ja2VkKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZ2V0IG5leHQgb3V0cHV0IGJ1ZmZlciBmcm9tIGJ1ZmZlciBtYW5hZ2VyOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGRlcXVldWUgbmV4dCBvdXRwdXQgYnVmZmVyOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogCi0gICAgICAgICAgICAvLyBPbmx5IHRyYW5zaXRpb24gdG8gU1RBVEVfQUJBTkRPTkVEIGZyb20gU1RBVEVfQ09ORklHVVJFRC4gKElmIGl0IGlzIFNUQVRFX1BSRVBBUklORywKLSAgICAgICAgICAgIC8vIGxldCBwcmVwYXJlTmV4dEJ1ZmZlciBoYW5kbGUgdGhlIGVycm9yLikKLSAgICAgICAgICAgIGlmICgocmVzID09IE5PX0lOSVQgfHwgcmVzID09IERFQURfT0JKRUNUKSAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgewotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCQU5ET05FRDsKLSAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgY2hlY2tSZXRBbmRTZXRBYmFuZG9uZWRMb2NrZWQocmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+PiByZW1vdmVkQnVmZmVyczsKLSAgICAgICAgcmVzID0gbUNvbnN1bWVyLT5nZXRBbmRGbHVzaFJlbW92ZWRCdWZmZXJzKCZyZW1vdmVkQnVmZmVycyk7Ci0gICAgICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgICAgIG9uQnVmZmVyc1JlbW92ZWRMb2NrZWQocmVtb3ZlZEJ1ZmZlcnMpOwotCi0gICAgICAgICAgICBpZiAobVVzZUJ1ZmZlck1hbmFnZXIgJiYgcmVtb3ZlZEJ1ZmZlcnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIG1CdWZmZXJNYW5hZ2VyLT5vbkJ1ZmZlcnNSZW1vdmVkKGdldElkKCksIGdldFN0cmVhbVNldElkKCksIHJlbW92ZWRCdWZmZXJzLnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgY2hlY2tSZW1vdmVkQnVmZmVyc0xvY2tlZCgpOwogICAgIH0KIAogICAgIHJldHVybiByZXM7CiB9CiAKK3ZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6Y2hlY2tSZW1vdmVkQnVmZmVyc0xvY2tlZChib29sIG5vdGlmeUJ1ZmZlck1hbmFnZXIpIHsKKyAgICBzdGQ6OnZlY3RvcjxzcDxHcmFwaGljQnVmZmVyPj4gcmVtb3ZlZEJ1ZmZlcnM7CisgICAgc3RhdHVzX3QgcmVzID0gbUNvbnN1bWVyLT5nZXRBbmRGbHVzaFJlbW92ZWRCdWZmZXJzKCZyZW1vdmVkQnVmZmVycyk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBvbkJ1ZmZlcnNSZW1vdmVkTG9ja2VkKHJlbW92ZWRCdWZmZXJzKTsKKworICAgICAgICBpZiAobm90aWZ5QnVmZmVyTWFuYWdlciAmJiBtVXNlQnVmZmVyTWFuYWdlciAmJiByZW1vdmVkQnVmZmVycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtQnVmZmVyTWFuYWdlci0+b25CdWZmZXJzUmVtb3ZlZChnZXRJZCgpLCBnZXRTdHJlYW1TZXRJZCgpLCByZW1vdmVkQnVmZmVycy5zaXplKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06OmNoZWNrUmV0QW5kU2V0QWJhbmRvbmVkTG9ja2VkKHN0YXR1c190IHJlcykgeworICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMKKyAgICAvLyBTVEFURV9QUkVQQVJJTkcsIGxldCBwcmVwYXJlTmV4dEJ1ZmZlciBoYW5kbGUgdGhlIGVycm9yLikKKyAgICBpZiAoKHJlcyA9PSBOT19JTklUIHx8IHJlcyA9PSBERUFEX09CSkVDVCkgJiYgbVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgIH0KK30KKwogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTY1OSwxMiArNzExLDExIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDY0X3QgKnVzYWdlLAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgY29uc3QgewotICAgIHN0YXR1c190IHJlczsKLSAgICB1aW50NjRfdCB1ID0gMDsKK3ZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6YXBwbHlaU0xVc2FnZVF1aXJrKGludCBmb3JtYXQsIHVpbnQ2NF90ICpjb25zdW1lclVzYWdlIC8qaW5vdXQqLykgeworICAgIGlmIChjb25zdW1lclVzYWdlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZ2V0X2NvbnN1bWVyX3VzYWdlKHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihzdXJmYWNlLmdldCgpKSwgJnUpOwogICAgIC8vIElmIGFuIG9wYXF1ZSBvdXRwdXQgc3RyZWFtJ3MgZW5kcG9pbnQgaXMgSW1hZ2VSZWFkZXIsIGFkZAogICAgIC8vIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCB0byB0aGUgdXNhZ2Ugc28gSEFMIGtub3dzIGl0IHdpbGwgYmUgdXNlZAogICAgIC8vIGZvciB0aGUgWlNMIHVzZSBjYXNlLgpAQCAtNjczLDEyICs3MjQsMjAgQEAKICAgICAvLyAgICAgMi4gR1JBTExPQ19VU0FHRV9IV19SRU5ERVIKICAgICAvLyAgICAgMy4gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUgogICAgIC8vICAgICA0LiBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIKLSAgICBpZiAoY2FtZXJhM19zdHJlYW06OmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKLSAgICAgICAgICAgICh1ICYgKEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSB8IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSIHwKKyAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgorICAgICAgICAgICAgKCpjb25zdW1lclVzYWdlICYgKEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSB8IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSIHwKICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgfCBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIpKSA9PSAwKSB7Ci0gICAgICAgIHUgfD0gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMOworICAgICAgICAqY29uc3VtZXJVc2FnZSB8PSBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0w7CiAgICAgfQorfQogCitzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSh1aW50NjRfdCAqdXNhZ2UsCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSBjb25zdCB7CisgICAgc3RhdHVzX3QgcmVzOworICAgIHVpbnQ2NF90IHUgPSAwOworCisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHN1cmZhY2UuZ2V0KCkpLCAmdSk7CisgICAgYXBwbHlaU0xVc2FnZVF1aXJrKGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsICZ1KTsKICAgICAqdXNhZ2UgPSB1OwogICAgIHJldHVybiByZXM7CiB9CkBAIC03OTIsMTEgKzg1MSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGQ6OnZlY3RvcjxzcDxHcmFwaGljQnVmZmVyPj4gcmVtb3ZlZEJ1ZmZlcnM7Ci0gICAgcmVzID0gbUNvbnN1bWVyLT5nZXRBbmRGbHVzaFJlbW92ZWRCdWZmZXJzKCZyZW1vdmVkQnVmZmVycyk7Ci0gICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICBvbkJ1ZmZlcnNSZW1vdmVkTG9ja2VkKHJlbW92ZWRCdWZmZXJzKTsKLSAgICB9CisgICAgLy8gSGVyZSB3ZSBhc3N1bWUgZGV0YWNoQnVmZmVyIGlzIGNhbGxlZCBieSBidWZmZXIgbWFuYWdlciBzbyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgbm90aWZpZWQKKyAgICBjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKC8qbm90aWZ5QnVmZmVyTWFuYWdlciovZmFsc2UpOwogICAgIHJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKaW5kZXggNmYzNmY5Mi4uMzBmYzJmNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKQEAgLTE5MCw2ICsxOTAsOSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJi8qc3VyZmFjZSovKSB7IHJldHVybiAwOyB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90PiopIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9OworCiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgogICAgICAqLwpAQCAtMTk4LDYgKzIwMSwxMSBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCiAgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLyk7CiAKKyAgICAvKioKKyAgICAgKiBBcHBseSBaU0wgcmVsYXRlZCBjb25zdW1lciB1c2FnZSBxdWlyay4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBhcHBseVpTTFVzYWdlUXVpcmsoaW50IGZvcm1hdCwgdWludDY0X3QgKmNvbnN1bWVyVXNhZ2UgLyppbm91dCovKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKQEAgLTIxMyw2ICsyMjEsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKQEAgLTI4NSwxMCArMjk0LDExIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKQEAgLTI5OSw2ICszMDksMTMgQEAKICAgICAgKi8KICAgICB2b2lkIG9uQnVmZmVyc1JlbW92ZWRMb2NrZWQoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4+Jik7CiAgICAgc3RhdHVzX3QgZGV0YWNoQnVmZmVyTG9ja2VkKHNwPEdyYXBoaWNCdWZmZXI+KiBidWZmZXIsIGludCogZmVuY2VGZCk7CisgICAgLy8gQ2FsbCB0aGlzIGFmdGVyIGVhY2ggZGVxdWV1ZUJ1ZmZlci9hdHRhY2hCdWZmZXIvZGV0YWNoTmV4dEJ1ZmZlciBjYWxsIHRvIGdldCB1cGRhdGUgb24KKyAgICAvLyByZW1vdmVkIGJ1ZmZlcnMuIFNldCBub3RpZnlCdWZmZXJNYW5hZ2VyIHRvIGZhbHNlIHdoZW4gdGhlIGNhbGwgaXMgaW5pdGlhdGVkIGJ5IGJ1ZmZlcgorICAgIC8vIG1hbmFnZXIgc28gYnVmZmVyIG1hbmFnZXIgZG9lc24ndCBuZWVkIHRvIGJlIG5vdGlmaWVkLgorICAgIHZvaWQgY2hlY2tSZW1vdmVkQnVmZmVyc0xvY2tlZChib29sIG5vdGlmeUJ1ZmZlck1hbmFnZXIgPSB0cnVlKTsKKworICAgIC8vIENoZWNrIHJldHVybiBzdGF0dXMgb2YgSUdCUCBjYWxscyBhbmQgc2V0IGFiYW5kb25lZCBzdGF0ZSBhY2NvcmRpbmdseQorICAgIHZvaWQgY2hlY2tSZXRBbmRTZXRBYmFuZG9uZWRMb2NrZWQoc3RhdHVzX3QgcmVzKTsKIAogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUgPSA1OyAvLyBpbiBtcwogICAgIENhbWVyYUxhdGVuY3lIaXN0b2dyYW0gbURlcXVldWVCdWZmZXJMYXRlbmN5OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAppbmRleCBhNzExYTZkLi4yYmRlOTQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaApAQCAtNjcsNiArNjcsMTggQEAKICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgdW5pcXVlIHN1cmZhY2UgSURzIG9mIGN1cnJlbnQgc3VyZmFjZUlkcy4KKyAgICAgKiBXaGVuIHBhc3NpbmcgdW5pcXVlIHN1cmZhY2UgSURzIGluIHJldHVybkJ1ZmZlcigpLCBpZiB0aGUKKyAgICAgKiBzdXJmYWNlSWQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJlYW0sIHRoZSBvdXRwdXQgY29ycmVzcG9uZGluZyB0bworICAgICAqIHRoZSB1bmlxdWUgc3VyZmFjZSBJRCB3aWxsIGJlIGlnbm9yZWQgYW5kIG5vdCBkZWxpdmVyZWQgdG8gY2xpZW50LgorICAgICAqCisgICAgICogUmV0dXJuIElOVkFMSURfT1BFUkFUSU9OIGlmIGFuZCBvbmx5IGlmIHRoZSBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydAorICAgICAqIHN1cmZhY2Ugc2hhcmluZy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcywKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KiBvdXRVbmlxdWVJZHMpID0gMDsKKworICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm91dHB1dFN1cmZhY2VzLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKaW5kZXggZmIzY2U0Yy4uZTNiNzRkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLVNoYXJlZE91U3RybSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCiAjaW5jbHVkZSAiQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yOCwxNiArMzIsMTcgQEAKICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgaW50IHNldElkKSA6CisgICAgICAgIGludCBzZXRJZCwgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CiAgICAgICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJVc2FnZSwgdGltZXN0YW1wT2Zmc2V0LCBzZXRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgc2l6ZV90IGNvbnN1bWVyQ291bnQgPSBzdGQ6Om1pbihzdXJmYWNlcy5zaXplKCksIGtNYXhPdXRwdXRzKTsKICAgICBpZiAoc3VyZmFjZXMuc2l6ZSgpID4gY29uc3VtZXJDb3VudCkgewogICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBhZGQgbW9yZSBjb25zdW1lcnMgdGhhbiB0aGUgbWF4aW11bSAiLCBfX2Z1bmNfXyk7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uc3VtZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgIG1TdXJmYWNlc1tpXSA9IHN1cmZhY2VzW2ldOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpXSA9IHN0ZDo6bWFrZV9wYWlyKHN1cmZhY2VzW2ldLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiB9CiAKQEAgLTQ4LDE1ICs1MywxNSBAQAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Y29ubmVjdFN0cmVhbVNwbGl0dGVyTG9ja2VkKCkgewogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgbVN0cmVhbVNwbGl0dGVyID0gbmV3IENhbWVyYTNTdHJlYW1TcGxpdHRlcigpOworICAgIG1TdHJlYW1TcGxpdHRlciA9IG5ldyBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIobVVzZUhhbEJ1Zk1hbmFnZXIpOwogCiAgICAgdWludDY0X3QgdXNhZ2U7CiAgICAgZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc3A8U3VyZmFjZT4+IGluaXRpYWxTdXJmYWNlczsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBpbml0aWFsU3VyZmFjZXMuZW1wbGFjZShpLCBtU3VyZmFjZXNbaV0pOworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaW5pdGlhbFN1cmZhY2VzLmVtcGxhY2UoaSwgbVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MSw2ICs3NiwzMSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoCisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIEF0dGFjaCB0aGUgYnVmZmVyIHRvIHRoZSBzcGxpdHRlciBvdXRwdXQgcXVldWVzLiBUaGlzIGNvdWxkIGJsb2NrIGlmCisgICAgLy8gdGhlIG91dHB1dCBxdWV1ZSBkb2Vzbid0IGhhdmUgYW55IGVtcHR5IHNsb3QuIFNvIHVubG9jayBkdXJpbmcgdGhlIGNvdXJzZQorICAgIC8vIG9mIGF0dGFjaEJ1ZmZlclRvT3V0cHV0cy4KKyAgICBzcDxDYW1lcmEzU3RyZWFtU3BsaXR0ZXI+IHNwbGl0dGVyID0gbVN0cmVhbVNwbGl0dGVyOworICAgIG1Mb2NrLnVubG9jaygpOworICAgIHJlcyA9IHNwbGl0dGVyLT5hdHRhY2hCdWZmZXJUb091dHB1dHMoYW5iLCBzdXJmYWNlX2lkcyk7CisgICAgbUxvY2subG9jaygpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbm5vdCBhdHRhY2ggc3RyZWFtIHNwbGl0dGVyIGJ1ZmZlciB0byBvdXRwdXRzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAorICAgICAgICAvLyBsZXQgcHJlcGFyZU5leHRCdWZmZXIgaGFuZGxlIHRoZSBlcnJvci4pCisgICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKwogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6bm90aWZ5QnVmZmVyUmVsZWFzZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYW53QnVmZmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwpAQCAtODksNyArMTE5LDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIChtU3VyZmFjZXNbc3VyZmFjZV9pZF0gPT0gbnVsbHB0cik7CisgICAgcmV0dXJuIChtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlX2lkXS5maXJzdCA9PSBudWxscHRyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6c2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgc3VyZmFjZXMpIHsKQEAgLTExMiw3ICsxNDIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQogCi0gICAgICAgIG1TdXJmYWNlc1tpZF0gPSBzdXJmYWNlOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpZF0gPSBzdGQ6Om1ha2VfcGFpcihzdXJmYWNlLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKIAogICAgICAgICAvLyBPbmx5IGNhbGwgYWRkT3V0cHV0IGlmIHRoZSBzcGxpdHRlciBoYXMgYmVlbiBjb25uZWN0ZWQuCiAgICAgICAgIGlmIChtU3RyZWFtU3BsaXR0ZXIgIT0gbnVsbHB0cikgewpAQCAtMTI4LDcgKzE1OCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcykgewogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKICAgICBpbnQgZmVuY2VGZCA9IC0xOwogCkBAIC0xMzgsMjMgKzE2OCwxMSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIC8vIEF0dGFjaCB0aGUgYnVmZmVyIHRvIHRoZSBzcGxpdHRlciBvdXRwdXQgcXVldWVzLiBUaGlzIGNvdWxkIGJsb2NrIGlmCi0gICAgLy8gdGhlIG91dHB1dCBxdWV1ZSBkb2Vzbid0IGhhdmUgYW55IGVtcHR5IHNsb3QuIFNvIHVubG9jayBkdXJpbmcgdGhlIGNvdXJzZQotICAgIC8vIG9mIGF0dGFjaEJ1ZmZlclRvT3V0cHV0cy4KLSAgICBzcDxDYW1lcmEzU3RyZWFtU3BsaXR0ZXI+IHNwbGl0dGVyID0gbVN0cmVhbVNwbGl0dGVyOwotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIHJlcyA9IHNwbGl0dGVyLT5hdHRhY2hCdWZmZXJUb091dHB1dHMoYW5iLCBzdXJmYWNlX2lkcyk7Ci0gICAgbUxvY2subG9jaygpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbm5vdCBhdHRhY2ggc3RyZWFtIHNwbGl0dGVyIGJ1ZmZlciB0byBvdXRwdXRzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAotICAgICAgICAvLyBsZXQgcHJlcGFyZU5leHRCdWZmZXIgaGFuZGxlIHRoZSBlcnJvci4pCi0gICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgcmVzID0gYXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZChhbmIsIHN1cmZhY2VJZHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICAvKioKQEAgLTE2OCw4ICsxODYsMzggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6cXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSkgewotICAgIHN0YXR1c190IHJlcyA9IGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgdW5pcXVlU3VyZmFjZUlkcykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBpZiAodW5pcXVlU3VyZmFjZUlkcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmlxdWVTdXJmYWNlSWRzIG11c3Qgbm90IGJlIGVtcHR5ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBzdXJmYWNlSWRzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHVuaXF1ZUlkIDogdW5pcXVlU3VyZmFjZUlkcykgeworICAgICAgICAgICAgYm9vbCB1bmlxdWVJZEZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uc2Vjb25kID09IHVuaXF1ZUlkKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VJZHMucHVzaF9iYWNrKGkpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF1bmlxdWVJZEZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiB1bmtub3duIHVuaXF1ZSBzdXJmYWNlIElEICV6dSBmb3Igc3RyZWFtICVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHVuaXF1ZUlkLCBtSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlcyA9IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoYnVmZmVyLCBzdXJmYWNlSWRzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOwogCiAgICAgLy8gQWZ0ZXIgcXVldWluZyBidWZmZXIgdG8gdGhlIGludGVybmFsIGNvbnN1bWVyIHF1ZXVlLCBjaGVjayB3aGV0aGVyIHRoZSBidWZmZXIgaXMKICAgICAvLyBzdWNjZXNzZnVsbHkgcXVldWVkIHRvIHRoZSBvdXRwdXQgcXVldWVzLgpAQCAtMjI4LDggKzI3Niw4IEBACiAgICAgICAgICp1c2FnZSA9IGdldFByZXNldENvbnN1bWVyVXNhZ2UoKTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpZCA9IDA7IGlkIDwga01heE91dHB1dHM7IGlkKyspIHsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZXNbaWRdICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSgmdSwgbVN1cmZhY2VzW2lkXSk7CisgICAgICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaWRdLmZpcnN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSgmdSwgbVN1cmZhY2VVbmlxdWVJZHNbaWRdLmZpcnN0KTsKICAgICAgICAgICAgICAgICAqdXNhZ2UgfD0gdTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjQ1LDcgKzI5Myw3IEBACiBzc2l6ZV90IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldE5leHRTdXJmYWNlSWRMb2NrZWQoKSB7CiAgICAgc3NpemVfdCBpZCA9IC0xOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIGlkID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNTgsNyArMzA2LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3NpemVfdCBpZCA9IC0xOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldID09IHN1cmZhY2UpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0ID09IHN1cmZhY2UpIHsKICAgICAgICAgICAgIGlkID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjcsNiArMzE1LDI2IEBACiAgICAgcmV0dXJuIGlkOwogfQogCitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRVbmlxdWVTdXJmYWNlSWRzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzLAorICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChvdXRVbmlxdWVJZHMgPT0gbnVsbHB0ciB8fCBzdXJmYWNlSWRzLnNpemUoKSA+IGtNYXhPdXRwdXRzKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgb3V0VW5pcXVlSWRzLT5jbGVhcigpOworICAgIG91dFVuaXF1ZUlkcy0+cmVzZXJ2ZShzdXJmYWNlSWRzLnNpemUoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN1cmZhY2VJZCA6IHN1cmZhY2VJZHMpIHsKKyAgICAgICAgaWYgKHN1cmZhY2VJZCA+PSBrTWF4T3V0cHV0cykgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBvdXRVbmlxdWVJZHMtPnB1c2hfYmFjayhtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlSWRdLnNlY29uZCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6cmV2ZXJ0UGFydGlhbFVwZGF0ZUxvY2tlZCgKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlcywKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJmF0dGFjaGVkU3VyZmFjZXMpIHsKQEAgLTI4MCw3ICszNDgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tpbmRleF0gPSBudWxscHRyOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpbmRleF0gPSBzdGQ6Om1ha2VfcGFpcihudWxscHRyLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlbW92ZWRTdXJmYWNlcy5zaXplKCk7IGkrKykgewpAQCAtMjkxLDcgKzM1OSw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW2luZGV4XSA9IHJlbW92ZWRTdXJmYWNlcy5rZXlBdChpKTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaW5kZXhdID0gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmtleUF0KGkpLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICByZXR1cm4gcmV0OwpAQCAtMzQzLDggKzQxMiw4IEBACiAKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbaXRdID0gbnVsbHB0cjsKLSAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmFkZChtU3VyZmFjZXNbaXRdLCBpdCk7CisgICAgICAgIHJlbW92ZWRTdXJmYWNlcy5hZGQobVN1cmZhY2VVbmlxdWVJZHNbaXRdLmZpcnN0LCBpdCk7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2l0XSA9IHN0ZDo6bWFrZV9wYWlyKG51bGxwdHIsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIAogICAgIC8vTmV4dCBhZGQgdGhlIG5ldyBvdXRwdXRzCkBAIC0zNjksNyArNDM4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tzdXJmYWNlSWRdID0gaXQ7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW3N1cmZhY2VJZF0gPSBzdGQ6Om1ha2VfcGFpcihpdCwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgICAgIG91dHB1dE1hcC0+YWRkKGl0LCBzdXJmYWNlSWQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAppbmRleCAwMmIxYzA5Li5iNWUzN2MyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TSEFSRURfT1VUUFVUX1NUUkVBTV9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NIQVJFRF9PVVRQVVRfU1RSRUFNX0gKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW1TcGxpdHRlci5oIgogI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW0uaCIKIApAQCAtMzcsNyArMzgsOCBAQAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOworICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCisgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKCk7CiAKQEAgLTQ5LDYgKzUxLDE1IEBACiAKICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSB1bmlxdWUgc3VyZmFjZSBJRHMgb2YgY3VycmVudCBzdXJmYWNlSWRzLgorICAgICAqIFdoZW4gcGFzc2luZyB1bmlxdWUgc3VyZmFjZSBJRHMgaW4gcmV0dXJuQnVmZmVyKCksIGlmIHRoZQorICAgICAqIHN1cmZhY2VJZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cmVhbSwgdGhlIG91dHB1dCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogdGhlIHVuaXF1ZSBzdXJmYWNlIElEIHdpbGwgYmUgaWdub3JlZCBhbmQgbm90IGRlbGl2ZXJlZCB0byBjbGllbnQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiAmb3V0cHV0SW5mbywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLApAQCAtNTgsOCArNjksMTcgQEAKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE91dHB1dHMgPSA0OwogCi0gICAgLy8gTWFwIHN1cmZhY2VJZCAtPiBvdXRwdXQgc3VyZmFjZXMKLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZXNba01heE91dHB1dHNdOworICAgIC8vIFdoZXRoZXIgSEFMIGlzIGluIGNvbnRyb2wgZm9yIGJ1ZmZlciBtYW5hZ2VtZW50LiBTdXJmYWNlIHNoYXJpbmcgYmVoYXZpb3IKKyAgICAvLyBkZXBlbmRzIG9uIHRoaXMgZmxhZy4KKyAgICBjb25zdCBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyOworCisgICAgLy8gUGFpciBvZiBhbiBvdXRwdXQgU3VyZmFjZSBhbmQgaXRzIHVuaXF1ZSBJRAorICAgIHR5cGVkZWYgc3RkOjpwYWlyPHNwPFN1cmZhY2U+LCBzaXplX3Q+IFN1cmZhY2VVbmlxdWVJZDsKKworICAgIC8vIE1hcCBzdXJmYWNlSWQgLT4gKG91dHB1dCBzdXJmYWNlLCB1bmlxdWUgc3VyZmFjZSBJRCkKKyAgICBzdGQ6OmFycmF5PFN1cmZhY2VVbmlxdWVJZCwga01heE91dHB1dHM+IG1TdXJmYWNlVW5pcXVlSWRzOworCisgICAgc2l6ZV90IG1OZXh0VW5pcXVlU3VyZmFjZUlkID0gMDsKIAogICAgIHNzaXplX3QgZ2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpOwogCkBAIC03OCwxMyArOTgsMjQgQEAKICAgICBzdGF0dXNfdCBjb25uZWN0U3RyZWFtU3BsaXR0ZXJMb2NrZWQoKTsKIAogICAgIC8qKgorICAgICAqIEF0dGFjaCB0aGUgb3V0cHV0IGJ1ZmZlciB0byBzdHJlYW0gc3BsaXR0ZXIuCisgICAgICogV2hlbiBjYW1lcmEgc2VydmljZSBpcyBkb2luZyBidWZmZXIgbWFuYWdlbWVudCwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKKyAgICAgKiBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBoYW5kZWQgb3V0IHRvIEhBTCBpbiByZXF1ZXN0IHRocmVhZC4KKyAgICAgKiBXaGVuIEhBTCBpcyBkb2luZyBidWZmZXIgbWFuYWdlbWVudCwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbgorICAgICAqIHRoZSBidWZmZXIgaXMgcmV0dXJuZWQgZnJvbSBIQUwgaW4gaHdiaW5kZXIgY2FsbGJhY2sgdGhyZWFkLgorICAgICAqLworICAgIHN0YXR1c190IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOworCisgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiB1bmlxdWVTdXJmYWNlSWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggN2ViYzI5OS4uMDU3MTc0MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC02Nyw3ICs2Nyw4IEBACiAgICAgbUJ1ZmZlckxpbWl0TGF0ZW5jeShrQnVmZmVyTGltaXRMYXRlbmN5QmluU2l6ZSksCiAgICAgbUZvcm1hdE92ZXJyaWRkZW4oZmFsc2UpLAogICAgIG1PcmlnaW5hbEZvcm1hdCgtMSksCi0gICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkgeworICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpLAorICAgIG1MYXN0VGltZXN0YW1wKDApIHsKIAogICAgIGNhbWVyYTNfc3RyZWFtOjpzdHJlYW1fdHlwZSA9IHR5cGU7CiAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoID0gd2lkdGg7CkBAIC01ODcsNyArNTg4LDExIEBACiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgYnVmZmVycyBpZiBzdHJlYW0gaXMgbm90IGluIENPTkZJR1VSRUQgc3RhdGUgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUJBTkRPTkVEKSB7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBXYWl0IGZvciBuZXcgYnVmZmVyIHJldHVybmVkIGJhY2sgaWYgd2UgYXJlIHJ1bm5pbmcgaW50byB0aGUgbGltaXQuCkBAIC02NTQsNyArNjU5LDggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsIHVpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKQEAgLTY2Niw2ICs2NzIsMTUgQEAKIAogICAgIHJlbW92ZU91dHN0YW5kaW5nQnVmZmVyKGJ1ZmZlcik7CiAKKyAgICAvLyBCdWZmZXIgc3RhdHVzIG1heSBiZSBjaGFuZ2VkLCBzbyBtYWtlIGEgY29weSBvZiB0aGUgc3RyZWFtX2J1ZmZlciBzdHJ1Y3QuCisgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyIGIgPSBidWZmZXI7CisgICAgaWYgKHRpbWVzdGFtcEluY3JlYXNpbmcgJiYgdGltZXN0YW1wICE9IDAgJiYgdGltZXN0YW1wIDw9IG1MYXN0VGltZXN0YW1wKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgaXMgbm90IGluY3JlYXNpbmcuIFByZXYgdGltZXN0YW1wICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgdGltZXN0YW1wLCBtTGFzdFRpbWVzdGFtcCk7CisgICAgICAgIGIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgIH0KKyAgICBtTGFzdFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwogICAgIC8qKgogICAgICAqIFRPRE86IENoZWNrIHRoYXQgdGhlIHN0YXRlIGlzIHZhbGlkIGZpcnN0LgogICAgICAqCkBAIC02NzQsOSArNjg5LDkgQEAKICAgICAgKgogICAgICAqIERvIHRoaXMgZm9yIGdldEJ1ZmZlciBhcyB3ZWxsLgogICAgICAqLwotICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCk7CisgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQnVmZmVyTG9ja2VkKGIsIHRpbWVzdGFtcCwgc3VyZmFjZV9pZHMpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChidWZmZXIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYiwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki90cnVlLCB0aW1lc3RhbXAsIGZyYW1lTnVtYmVyKTsKICAgICB9CiAKICAgICAvLyBFdmVuIGlmIHJldHVybmluZyB0aGUgYnVmZmVyIGZhaWxlZCwgd2Ugc3RpbGwgd2FudCB0byBzaWduYWwgd2hvZXZlciBpcyB3YWl0aW5nIGZvciB0aGUKQEAgLTc1Miw4ICs3NjcsMjIgQEAKICAgICByZXR1cm4gZ2V0SW5wdXRCdWZmZXJQcm9kdWNlckxvY2tlZChwcm9kdWNlcik7CiB9CiAKK3ZvaWQgQ2FtZXJhM1N0cmVhbTo6ZmlyZUJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBmb3IgKGF1dG8gJml0IDogbUJ1ZmZlckxpc3RlbmVyTGlzdCkgeworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+IGxpc3RlbmVyID0gaXQucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyLCBnZXRJZCgpLCBzZXR0aW5ncyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhM1N0cmVhbTo6ZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZCgKLSAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyJiBidWZmZXIsIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0KSB7CisgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciYgYnVmZmVyLCBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCwgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CiAgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0LCBlbmQ7CiAKICAgICAvLyBUT0RPOiBmaW5pc2ggaW1wbGVtZW50aW5nCkBAIC03NjIsNiArNzkxLDggQEAKICAgICAgICAgQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyOjpCdWZmZXJJbmZvKCk7CiAgICAgaW5mby5tT3V0cHV0ID0gb3V0cHV0OwogICAgIGluZm8ubUVycm9yID0gKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SKTsKKyAgICBpbmZvLm1GcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgIGluZm8ubVRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKICAgICAvLyBUT0RPOiByZXN0IG9mIGZpZWxkcwogCiAgICAgZm9yIChpdCA9IG1CdWZmZXJMaXN0ZW5lckxpc3QuYmVnaW4oKSwgZW5kID0gbUJ1ZmZlckxpc3RlbmVyTGlzdC5lbmQoKTsKQEAgLTc4NSw2ICs4MTYsMTIgQEAKICAgICByZXR1cm4gaGFzT3V0c3RhbmRpbmdCdWZmZXJzTG9ja2VkKCk7CiB9CiAKK3NpemVfdCBDYW1lcmEzU3RyZWFtOjpnZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpIGNvbnN0IHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7Cit9CisKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnNldFN0YXR1c1RyYWNrZXIoc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzcDxTdGF0dXNUcmFja2VyPiBvbGRUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwpAQCAtODI3LDcgKzg2NCw3IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFMT0dFKCIlczogVGhpcyB0eXBlIG9mIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG91dHB1dCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAppbmRleCAwMzU1OTc4Li41ZWI2YTIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaApAQCAtMzIyLDExICszMjIsMTggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KICAgICAgKgorICAgICAqIE11bHRpcGxlIHN1cmZhY2VzIGNvdWxkIHNoYXJlIHRoZSBzYW1lIEhBTCBzdHJlYW0sIGJ1dCBhIHJlcXVlc3QgbWF5CisgICAgICogYmUgb25seSBmb3IgYSBzdWJzZXQgb2Ygc3VyZmFjZXMuIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICogQ2FtZXJhM1N0cmVhbUludGVyZmFjZSBvYmplY3QgbmVlZHMgdGhlIHN1cmZhY2UgSUQgaW5mb3JtYXRpb24gdG8gYXR0YWNoCisgICAgICogYnVmZmVycyBmb3IgdGhvc2Ugc3VyZmFjZXMuCisgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgZm9yIGJ1ZmZlcnMgcHJvdmlkZWQgYnkgZ2V0QnVmZmVyKCkuCiAgICAgICogRm9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtcywgdGhpcyBtZXRob2QgYXBwbGllcyB0byB0aGUgb3V0cHV0LXNpZGUgYnVmZmVycwogICAgICAqLwogICAgIHN0YXR1c190ICAgICAgICAgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpLAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKTsKIAogICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwpAQCAtMzYwLDYgKzM2NywxMSBAQAogICAgICAqLwogICAgIGJvb2wgICAgICAgICAgICAgaGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgbnVtYmVyIG9mIGJ1ZmZlcnMgY3VycmVudGx5IGhhbmRlZCBvdXQgdG8gSEFMCisgICAgICovCisgICAgc2l6ZV90ICAgICAgICAgICBnZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpIGNvbnN0OworCiAgICAgZW51bSB7CiAgICAgICAgIFRJTUVPVVRfTkVWRVIgPSAtMQogICAgIH07CkBAIC00MTksNiArNDMxLDEyIEBACiAgICAgICovCiAgICAgc3RhdHVzX3QgICAgICAgICByZXN0b3JlQ29uZmlndXJlZFN0YXRlKCk7CiAKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYnVmZmVyIHN0cmVhbSBsaXN0ZW5lcnMgYWJvdXQgaW5jb21pbmcgcmVxdWVzdCB3aXRoIHBhcnRpY3VsYXIgZnJhbWUgbnVtYmVyLgorICAgICAqLworICAgIHZvaWQgZmlyZUJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgb3ZlcnJpZGU7CisKICAgcHJvdGVjdGVkOgogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgLyoqCkBAIC00NzMsNyArNDkxLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZChjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuSW5wdXRCdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcik7CkBAIC00OTUsNyArNTE0LDcgQEAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOwogCiAgICAgLy8gR2V0IGhhbmRvdXQgb3V0cHV0IGJ1ZmZlciBjb3VudC4KLSAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0ID0gMDsKIAogICAgIC8vIEdldCBoYW5kb3V0IGlucHV0IGJ1ZmZlciBjb3VudC4KICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOwpAQCAtNTI2LDcgKzU0NSw3IEBACiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiA9IDMwMDAwMDAwMDBMTDsgLy8gMzAwMCBtcwogCiAgICAgdm9pZCBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciYgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0KTsKKyAgICAgICAgICAgIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0LCBuc2Vjc190IHRpbWVzdGFtcCA9IDAsIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCk7CiAgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID4gbUJ1ZmZlckxpc3RlbmVyTGlzdDsKIAogICAgIHN0YXR1c190ICAgICAgICBjYW5jZWxQcmVwYXJlTG9ja2VkKCk7CkBAIC01NjYsNiArNTg1LDcgQEAKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBtT3JpZ2luYWxEYXRhU3BhY2U7CiAKICAgICBTdHJpbmc4IG1QaHlzaWNhbENhbWVyYUlkOworICAgIG5zZWNzX3QgbUxhc3RUaW1lc3RhbXA7CiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaAppbmRleCAyZGIzMzNkLi5kMGFlZTI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU1RSRUFNQlVGRkVSTElTVEVORVJfSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TVFJFQU1CVUZGRVJMSVNURU5FUl9ICiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIApAQCAtNDEsNiArNDIsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pID0gMDsKICAgICAvLyBCdWZmZXIgd2FzIHJlbGVhc2VkIGJ5IHRoZSBIQUwKICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSA9IDA7CisgICAgLy8gTm90aWZ5IGFib3V0IGluY29taW5nIGJ1ZmZlciByZXF1ZXN0IGZyYW1lIG51bWJlcgorICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSA9IDA7CiB9OwogCiB9OyAvL25hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IDNkNDVjODkuLjVjZDExYjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NUUkVBTV9JTlRFUkZBQ0VfSAogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXIuaCIKIApAQCAtMjQ4LDExICsyNTAsMTkgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KICAgICAgKgorICAgICAqIE11bHRpcGxlIHN1cmZhY2VzIGNvdWxkIHNoYXJlIHRoZSBzYW1lIEhBTCBzdHJlYW0sIGJ1dCBhIHJlcXVlc3QgbWF5CisgICAgICogYmUgb25seSBmb3IgYSBzdWJzZXQgb2Ygc3VyZmFjZXMuIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICogQ2FtZXJhM1N0cmVhbUludGVyZmFjZSBvYmplY3QgbmVlZHMgdGhlIHN1cmZhY2UgSUQgaW5mb3JtYXRpb24gdG8gYXR0YWNoCisgICAgICogYnVmZmVycyBmb3IgdGhvc2Ugc3VyZmFjZXMuIEZvciB0aGUgY2FzZSBvZiBzaW5nbGUgc3VyZmFjZSBmb3IgYSBIQUwKKyAgICAgKiBzdHJlYW0sIHN1cmZhY2VfaWRzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0LgorICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSA9IDA7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpLAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKQEAgLTI4OSw2ICsyOTksMTEgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIGJvb2wgICAgIGhhc091dHN0YW5kaW5nQnVmZmVycygpIGNvbnN0ID0gMDsKIAorICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYnVmZmVycyBjdXJyZW50bHkgaGFuZGVkIG91dCB0byBIQUwKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgY29uc3QgPSAwOworCiAgICAgZW51bSB7CiAgICAgICAgIFRJTUVPVVRfTkVWRVIgPSAtMQogICAgIH07CkBAIC0zMjksNiArMzQ0LDEyIEBACiAgICAgICogQ2FtZXJhM1N0cmVhbS4KICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgc2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih3cDxDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lcj4gbGlzdGVuZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBidWZmZXIgc3RyZWFtIGxpc3RlbmVycyBhYm91dCBpbmNvbWluZyByZXF1ZXN0IHdpdGggcGFydGljdWxhciBmcmFtZSBudW1iZXIuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpID0gMDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAppbmRleCBlY2I5ODBhLi44NGMyZWM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCkBAIC0xNTIsNiArMTUyLDggQEAKICAgICBTUF9MT0dWKCIlczogRGlzY29ubmVjdGVkIiwgX19GVU5DVElPTl9fKTsKIH0KIAorQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHt9CiAKIENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6fkNhbWVyYTNTdHJlYW1TcGxpdHRlcigpIHsKICAgICBkaXNjb25uZWN0KCk7CkBAIC0yNDEsNyArMjQzLDkgQEAKICAgICB1aW50NjRfdCB1c2FnZSA9IDA7CiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KG91dHB1dFF1ZXVlLmdldCgpKSwgJnVzYWdlKTsKICAgICBpZiAoISh1c2FnZSAmIChHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKSkpIHsKLSAgICAgICAgb3V0cHV0UXVldWUtPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlQnVmZmVyVGltZW91dCk7CisgICAgICAgIG5zZWNzX3QgdGltZW91dCA9IG1Vc2VIYWxCdWZNYW5hZ2VyID8KKyAgICAgICAgICAgICAgICBrSGFsQnVmTWdyRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgOiBrTm9ybWFsRGVxdWV1ZUJ1ZmZlclRpbWVvdXQ7CisgICAgICAgIG91dHB1dFF1ZXVlLT5zZXREZXF1ZXVlVGltZW91dCh0aW1lb3V0KTsKICAgICB9CiAKICAgICByZXMgPSBnYnAtPmFsbG93QWxsb2NhdGlvbihmYWxzZSk7CkBAIC00MzYsOCArNDQwLDkgQEAKICAgICAgICAgcmVzID0gZ2JwLT5hdHRhY2hCdWZmZXIoJnNsb3QsIGdiKTsKICAgICAgICAgbU11dGV4LmxvY2soKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgU1BfTE9HRSgiJXM6IENhbm5vdCBhY3F1aXJlQnVmZmVyIGZyb20gR3JhcGhpY0J1ZmZlclByb2R1Y2VyICVwOiAlcyAoJWQpIiwKKyAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBDYW5ub3QgYXR0YWNoQnVmZmVyIGZyb20gR3JhcGhpY0J1ZmZlclByb2R1Y2VyICVwOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnYnAuZ2V0KCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgLy8gVE9ETzogbWlnaHQgbmVlZCB0byBkZXRhY2gvY2xlYW51cCB0aGUgYWxyZWFkeSBhdHRhY2hlZCBidWZmZXJzIGJlZm9yZSByZXR1cm4/CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIGlmICgoc2xvdCA8IDApIHx8IChzbG90ID4gQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAppbmRleCAxZWFmMmJkLi45NjBmN2FhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKIHB1YmxpYzoKIAogICAgIC8vIENvbnN0cnVjdG9yCi0gICAgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKCkgPSBkZWZhdWx0OworICAgIENhbWVyYTNTdHJlYW1TcGxpdHRlcihib29sIHVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZSk7CiAKICAgICAvLyBDb25uZWN0IHRvIHRoZSBzdHJlYW0gc3BsaXR0ZXIgYnkgY3JlYXRpbmcgYnVmZmVyIHF1ZXVlIGFuZCBjb25uZWN0aW5nIGl0CiAgICAgLy8gd2l0aCBvdXRwdXQgc3VyZmFjZXMuCkBAIC0yMjYsNyArMjI2LDEwIEBACiAgICAgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgbUZvcm1hdCA9IGFuZHJvaWQ6OlBJWEVMX0ZPUk1BVF9OT05FOwogICAgIHVpbnQ2NF90IG1Qcm9kdWNlclVzYWdlID0gMDsKIAotICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZXF1ZXVlQnVmZmVyVGltZW91dCAgID0gczJucygxKTsgLy8gMSBzZWMKKyAgICAvLyBUaGUgYXR0YWNoQnVmZmVyIGNhbGwgd2lsbCBoYXBwZW4gb24gZGlmZmVyZW50IHRocmVhZCBhY2NvcmRpbmcgdG8gbVVzZUhhbEJ1Zk1hbmFnZXIgYW5kIGhhdmUKKyAgICAvLyBkaWZmZXJlbnQgdGltaW5nIGNvbnN0cmFpbnQuCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga05vcm1hbERlcXVldWVCdWZmZXJUaW1lb3V0ICAgID0gczJucygxKTsgIC8vIDEgc2VjCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0hhbEJ1Zk1nckRlcXVldWVCdWZmZXJUaW1lb3V0ID0gbXMybnMoMSk7IC8vIDEgbXNlYwogCiAgICAgTXV0ZXggbU11dGV4OwogCkBAIC0yNzMsNiArMjc2LDggQEAKICAgICBzaXplX3QgbUFjcXVpcmVkSW5wdXRCdWZmZXJzOwogCiAgICAgU3RyaW5nOCBtQ29uc3VtZXJOYW1lOworCisgICAgY29uc3QgYm9vbCBtVXNlSGFsQnVmTWFuYWdlcjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCmluZGV4IDRkYWZlZmQuLmFlN2FmOGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcApAQCAtMzEyLDggKzMxMiw4IEBACiAgICAgICAgIGludDMyX3QgY29vcmRzWzRdID0gewogICAgICAgICAgICAgcmVjdHNbaV0sCiAgICAgICAgICAgICByZWN0c1tpICsgMV0sCi0gICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSwKLSAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXQorICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0gLSAxLAorICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdIC0gMQogICAgICAgICB9OwogCiAgICAgICAgIG1hcFJhd1RvQ29ycmVjdGVkKGNvb3JkcywgMiwgY2xhbXAsIHNpbXBsZSk7CkBAIC0zMjEsOCArMzIxLDggQEAKICAgICAgICAgLy8gTWFwIGJhY2sgdG8gKGwsIHQsIHdpZHRoLCBoZWlnaHQpCiAgICAgICAgIHJlY3RzW2ldID0gY29vcmRzWzBdOwogICAgICAgICByZWN0c1tpICsgMV0gPSBjb29yZHNbMV07Ci0gICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXTsKLSAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdOworICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF0gKyAxOworICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV0gKyAxOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTQwMCw4ICs0MDAsOCBAQAogICAgICAgICBpbnQzMl90IGNvb3Jkc1s0XSA9IHsKICAgICAgICAgICAgIHJlY3RzW2ldLAogICAgICAgICAgICAgcmVjdHNbaSArIDFdLAotICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0sCi0gICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10KKyAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdIC0gMSwKKyAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXSAtIDEKICAgICAgICAgfTsKIAogICAgICAgICBtYXBDb3JyZWN0ZWRUb1Jhdyhjb29yZHMsIDIsIGNsYW1wLCBzaW1wbGUpOwpAQCAtNDA5LDggKzQwOSw4IEBACiAgICAgICAgIC8vIE1hcCBiYWNrIHRvIChsLCB0LCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICByZWN0c1tpXSA9IGNvb3Jkc1swXTsKICAgICAgICAgcmVjdHNbaSArIDFdID0gY29vcmRzWzFdOwotICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF07Ci0gICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXTsKKyAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdICsgMTsKKyAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdICsgMTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDYzNTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CisKKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBIQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKKworY29uc3QgY2hhciAqSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjprUmVzdWx0S2V5ID0gIkNhcHR1cmVSZXN1bHQiOworCitIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IENCYXNlKGJhc2UpIHsgfQorCitib29sIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6aW5pdGlhbGl6ZUxvb3BlcigpIHsKKyAgICBtQ2JMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ2JMb29wZXItPnNldE5hbWUoImNzLWxvb3BlciIpOworICAgIHN0YXR1c190IGVyciA9IG1DYkxvb3Blci0+c3RhcnQoLypydW5PbkNhbGxpbmdUaHJlYWQqLyBmYWxzZSwgLypjYW5DYWxsSmF2YSovIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgaWYgKGVyciAhPU9LKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc3RhcnQgY2FtZXJhIGRldmljZSBjYWxsYmFjayBsb29wZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIodGhpcyk7CisgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgIHJldHVybiB0cnVlOworfQorCitIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6On5IMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoKSB7CisgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtSGFuZGxlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgfQorICAgICAgICBtQ2JMb29wZXItPnN0b3AoKTsKKyAgICB9CisgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvbkRldmljZUVycm9yKAorICAgIGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaENhcHR1cmVSZXN1bHRFeHRyYXMgPSBjb252ZXJ0VG9IaWRsKHJlc3VsdEV4dHJhcyk7CisgICAgYXV0byByZXQgPSBtQmFzZS0+b25EZXZpY2VFcnJvcihjb252ZXJ0VG9IaWRsKGVycm9yQ29kZSksIGhDYXB0dXJlUmVzdWx0RXh0cmFzKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIE9uRGV2aWNlRXJyb3IgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uRGV2aWNlSWRsZSgpIHsKKyAgICBhdXRvIHJldCA9IG1CYXNlLT5vbkRldmljZUlkbGUoKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICBBTE9HRSgiJXMgT25EZXZpY2VJZGxlIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uQ2FwdHVyZVN0YXJ0ZWQoCisgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGNvbnZlcnRUb0hpZGwocmVzdWx0RXh0cmFzKTsKKyAgICBhdXRvIHJldCA9IG1CYXNlLT5vbkNhcHR1cmVTdGFydGVkKGhDYXB0dXJlUmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgT25DYXB0dXJlQ2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit2b2lkIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6Y29udmVydFJlc3VsdE1ldGFkYXRhVG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGEgKmhSZXN1bHRNZXRhZGF0YSkgeworICAgIC8vIEZpcnN0IHRyeSB3cml0aW5nIHRvIGZtcS4KKyAgICBzaXplX3QgbWV0YWRhdGFfc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyYXdNZXRhZGF0YSk7CisgICAgaWYgKChtZXRhZGF0YV9zaXplID4gMCkgJiYKKyAgICAgICAgKG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpID4gMCkpIHsKKyAgICAgICAgaWYgKG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoKHVpbnQ4X3QgKilyYXdNZXRhZGF0YSwgbWV0YWRhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIGhSZXN1bHRNZXRhZGF0YS0+Zm1xTWV0YWRhdGFTaXplKG1ldGFkYXRhX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzIENvdWxkbid0IHVzZSBmbXEsIGZhbGxpbmcgYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZtZXRhZGF0YSk7CisgICAgICAgICAgICBoUmVzdWx0TWV0YWRhdGEtPm1ldGFkYXRhKHN0ZDo6bW92ZShtZXRhZGF0YSkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FsbGJhY2tIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPFJlZkJhc2U+IG9iaiA9IG51bGxwdHI7CisgICAgc3A8UmVzdWx0V3JhcHBlcj4gcmVzdWx0V3JhcHBlciA9IG51bGxwdHI7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFJlc3VsdFJlY2VpdmVkOgorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa1Jlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IG9iaiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIHJlc3VsdCBvYmplY3QgaW4gY2FsbGJhY2sgbWVzc2FnZSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFdyYXBwZXIgPSBzdGF0aWNfY2FzdDxSZXN1bHRXcmFwcGVyICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICBwcm9jZXNzUmVzdWx0TWVzc2FnZShyZXN1bHRXcmFwcGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FsbGJhY2sgc2VudCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbGxiYWNrSGFuZGxlcjo6cHJvY2Vzc1Jlc3VsdE1lc3NhZ2UoCisgICAgc3A8UmVzdWx0V3JhcHBlcj4gJnJlc3VsdFdyYXBwZXIpIHsKKyAgICBzcDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNvbnZlcnRlciA9IG1Db252ZXJ0ZXIucHJvbW90ZSgpOworICAgIGlmIChjb252ZXJ0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2FsbGJhY2sgd3JhcHBlciBoYXMgZGllZCwgcmVzdWx0IGNhbGxiYWNrIGNhbm5vdCBiZSBtYWRlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGFOYXRpdmUgJnJlc3VsdCA9IHJlc3VsdFdyYXBwZXItPm1SZXN1bHQ7CisgICAgYXV0byByZXN1bHRFeHRyYXMgPSByZXN1bHRXcmFwcGVyLT5tUmVzdWx0RXh0cmFzOworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhSZXN1bHRFeHRyYXMgPQorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsKHJlc3VsdEV4dHJhcyk7CisKKyAgICAvLyBDb252ZXJ0IE1ldGFkYXRhIGludG8gSENhbWVyYU1ldGFkYXRhOworICAgIEZtcVNpemVPck1ldGFkYXRhIGhSZXN1bHQ7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gcmVzdWx0LmdldEFuZExvY2soKTsKKyAgICBjb252ZXJ0ZXItPmNvbnZlcnRSZXN1bHRNZXRhZGF0YVRvSGlkbChyYXdNZXRhZGF0YSwgJmhSZXN1bHQpOworICAgIHJlc3VsdC51bmxvY2socmF3TWV0YWRhdGEpOworICAgIGF1dG8gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zID0gcmVzdWx0V3JhcHBlci0+bVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworICAgIGhpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MgPQorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsKAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcywgY29udmVydGVyLT5tQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpOworICAgIGF1dG8gcmV0ID0gY29udmVydGVyLT5tQmFzZS0+b25SZXN1bHRSZWNlaXZlZChoUmVzdWx0LCBoUmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgIEFMT0dFKCIlcyBPblJlc3VsdFJlY2VpdmVkIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25SZXN1bHRSZWNlaXZlZCgKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgcmVzdWx0LAorICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgeworICAgIC8vIFdyYXAgQ2FtZXJhTWV0YWRhdGEsIHJlc3VsdEV4dHJhcyBhbmQgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MgaW4gb24KKyAgICAvLyBzcDxSZWZCYXNlPi1hYmxlIHN0cnVjdHVyZSBhbmQgcG9zdCBpdC4KKyAgICBzcDxSZXN1bHRXcmFwcGVyPiByZXN1bHRXcmFwcGVyID0gbmV3IFJlc3VsdFdyYXBwZXIoY29uc3RfY2FzdDxDYW1lcmFNZXRhZGF0YU5hdGl2ZSAmPihyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMsIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdWx0UmVjZWl2ZWQsIG1IYW5kbGVyKTsKKyAgICBtc2ctPnNldE9iamVjdChrUmVzdWx0S2V5LCByZXN1bHRXcmFwcGVyKTsKKyAgICBtc2ctPnBvc3QoKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25QcmVwYXJlZChpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgLy8gVG8gc2lsZW5jZSBXdW51c2VkLXBhcmFtZXRlci4KKyAgICAodm9pZCkgc3RyZWFtSWQ7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKAorICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgIGludDMyX3QgcmVwZWF0aW5nUmVxdWVzdElkKSB7CisgICAgYXV0byByZXQgPQorICAgICAgICBtQmFzZS0+b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IobGFzdEZyYW1lTnVtYmVyLCByZXBlYXRpbmdSZXF1ZXN0SWQpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgT25SZXBlYXRpbmdSZXF1ZXN0RXJvciBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25SZXF1ZXN0UXVldWVFbXB0eSgpIHsKKyAgICAvLyBub3QgaW1wbGVtZW50ZWQKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmNTIwYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0ZSQU1FV09SS1NfQUlETF9DQU1FUkFERVZJQ0VDQUxMQkFDS1NfSAorI2RlZmluZSBBTkRST0lEX0ZSQU1FV09SS1NfQUlETF9DQU1FUkFERVZJQ0VDQUxMQkFDS1NfSAorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0JuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxoaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGNhbWVyYWh5YnJpZDo6SDJCQ29udmVydGVyOwordXNpbmcgSENhbWVyYURldmljZUNhbGxiYWNrID0gY2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7Cit1c2luZyBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Rm1xU2l6ZU9yTWV0YWRhdGE7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpCbkNhbWVyYURldmljZUNhbGxiYWNrczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmU7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworCitzdHJ1Y3QgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDoKKyAgICBwdWJsaWMgSDJCQ29udmVydGVyPEhDYW1lcmFEZXZpY2VDYWxsYmFjaywgSUNhbWVyYURldmljZUNhbGxiYWNrcywgQm5DYW1lcmFEZXZpY2VDYWxsYmFja3M+IHsKKyAgICBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSk7CisKKyAgICB+SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCk7CisKKyAgICBib29sIGluaXRpYWxpemVMb29wZXIoKTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25EZXZpY2VFcnJvcihpbnQzMl90IGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25EZXZpY2VJZGxlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVzdWx0UmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhTmF0aXZlJiByZXN1bHQsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25QcmVwYXJlZChpbnQzMl90IHN0cmVhbUlkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJlcGVhdGluZ1JlcXVlc3RJZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVxdWVzdFF1ZXVlRW1wdHkoKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtZXRhZGF0YVF1ZXVlKSB7CisgICAgICAgIG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG1ldGFkYXRhUXVldWU7CisgICAgfQorCisgcHJpdmF0ZToKKyAgICAvLyBXcmFwcGVyIHN0cnVjdCBzbyB0aGF0IHBhcmFtZXRlcnMgdG8gb25SZXN1bHRSZWNlaXZlZCBjYWxsYmFjayBtYXkgYmUKKyAgICAvLyBzZW50IHRocm91Z2ggYW4gQU1lc3NhZ2UuCisgICAgc3RydWN0IFJlc3VsdFdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhTmF0aXZlIG1SZXN1bHQ7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgbVJlc3VsdEV4dHJhczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gbVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworICAgICAgICBSZXN1bHRXcmFwcGVyKENhbWVyYU1ldGFkYXRhTmF0aXZlICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSA6CisgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgc3RkOjptb3ZhYmxlCisgICAgICBtUmVzdWx0KHJlc3VsdCksIG1SZXN1bHRFeHRyYXMocmVzdWx0RXh0cmFzKSwgbVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSB7IH0KKyAgICB9OworCisgICAgc3RydWN0IENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyAqY29udmVydGVyKSA6IG1Db252ZXJ0ZXIoY29udmVydGVyKSB7IH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgcHJvY2Vzc1Jlc3VsdE1lc3NhZ2Uoc3A8UmVzdWx0V3JhcHBlcj4gJnJlc3VsdFdyYXBwZXIpOworICAgICAgICAgICAgd3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBtQ29udmVydGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIE11dGV4IG1NZXRhZGF0YVF1ZXVlTG9jazsKKyAgICB9OworCisgICAgdm9pZCBjb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhICpyYXdNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YSAqcmVzdWx0TWV0YWRhdGEpOworICAgIGVudW0geworICAgICAgICBrV2hhdFJlc3VsdFJlY2VpdmVkLAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa1Jlc3VsdEtleTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzcDxDYWxsYmFja0hhbmRsZXI+IG1IYW5kbGVyID0gbnVsbHB0cjsKKyAgICBzcDxBTG9vcGVyPiBtQ2JMb29wZXIgPSBudWxscHRyOworfTsKKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZAorI2VuZGlmIC8vIEFORFJPSURfRlJBTUVXT1JLU19BSURMX0NBTUVSQURFVklDRUNBTExCQUNLU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBlZjhlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXM7CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25TdGF0dXNDaGFuZ2VkKAorICAgIGludDMyX3Qgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgeworICBIQ2FtZXJhRGV2aWNlU3RhdHVzIGhDYW1lcmFEZXZpY2VTdGF0dXMgPSBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKHN0YXR1cyk7CisgIENhbWVyYVN0YXR1c0FuZElkIGNhbWVyYVN0YXR1c0FuZElkOworICBjYW1lcmFTdGF0dXNBbmRJZC5kZXZpY2VTdGF0dXMgPSBoQ2FtZXJhRGV2aWNlU3RhdHVzOworICBjYW1lcmFTdGF0dXNBbmRJZC5jYW1lcmFJZCA9IFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpOworICBhdXRvIHJldCA9IG1CYXNlLT5vblN0YXR1c0NoYW5nZWQoY2FtZXJhU3RhdHVzQW5kSWQpOworICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgIEFMT0dFKCIlcyBPblN0YXR1c0NoYW5nZWQgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgIH0KKyAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25Ub3JjaFN0YXR1c0NoYW5nZWQoCisgICAgaW50MzJfdCwgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYpIHsKKyAgLy8gV2UgZG9uJ3QgaW1wbGVtZW50IG9uVG9yY2hTdGF0dXNDaGFuZ2VkCisgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGNvbW1vbgorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjZiZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CcENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorCisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxoaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6Qm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBoYXJkd2FyZTo6QnBDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBjYW1lcmFoeWJyaWQ6OkgyQkNvbnZlcnRlcjsKK3VzaW5nIEhDYW1lcmFEZXZpY2VTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit0eXBlZGVmIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgSENhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKKworc3RydWN0IEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lciA6CisgICAgcHVibGljIEgyQkNvbnZlcnRlcjxIQ2FtZXJhU2VydmljZUxpc3RlbmVyLCBJQ2FtZXJhU2VydmljZUxpc3RlbmVyLCBCbkNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4geworICAgIEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcihjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IENCYXNlKGJhc2UpIHsgfQorCisgICAgfkgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcigpIHsgfQorCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9uU3RhdHVzQ2hhbmdlZChpbnQzMl90IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKSB7CisgICAgICAgIC8vIFRPRE86IG5vIGltcGxlbWVudGF0aW9uIHlldC4KKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KK307CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBzZXJ2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWYwMTEyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DQU1FUkFfSFlCUklESU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9DQU1FUkFfSFlCUklESU5URVJGQUNFX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmFoeWJyaWQgewordHlwZWRlZiA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlIEhJbnRlcmZhY2U7CisKK3RlbXBsYXRlIDwKKyAgICAgICAgdHlwZW5hbWUgSElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgSU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBCTklOVEVSRkFDRSA+CitjbGFzcyBIMkJDb252ZXJ0ZXIgOiBwdWJsaWMgQk5JTlRFUkZBQ0UgeworcHVibGljOgorICAgIHR5cGVkZWYgSDJCQ29udmVydGVyPEhJTlRFUkZBQ0UsIElOVEVSRkFDRSwgQk5JTlRFUkZBQ0U+IENCYXNlOyAvLyBDb252ZXJ0ZXIgQmFzZQorICAgIHR5cGVkZWYgSU5URVJGQUNFIEJhc2VJbnRlcmZhY2U7CisgICAgdHlwZWRlZiBISU5URVJGQUNFIEhhbEludGVyZmFjZTsKKworICAgIEgyQkNvbnZlcnRlcihjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IG1CYXNlKGJhc2UpIHt9CisgICAgdmlydHVhbCBzcDxIYWxJbnRlcmZhY2U+IGdldEhhbEludGVyZmFjZSgpIHsgcmV0dXJuIG1CYXNlOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBsaW5rVG9EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICAgICAgdm9pZCogY29va2llID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCB1bmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgICAgICB2b2lkKiBjb29raWUgPSBudWxscHRyLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwLAorICAgICAgICAgICAgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+KiBvdXRSZWNpcGllbnQgPSBudWxscHRyKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEhhbEludGVyZmFjZT4gbUJhc2U7CisgICAgc3RydWN0IE9iaXR1YXJ5IDogcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgICAgIHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQ7CisgICAgICAgIHZvaWQqIGNvb2tpZTsKKyAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgICAgIHdwPElCaW5kZXI+IHdobzsKKyAgICAgICAgT2JpdHVhcnkoCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByLAorICAgICAgICAgICAgICAgIHZvaWQqIGMsIHVpbnQzMl90IGYsCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIHcpIDoKKyAgICAgICAgICAgIHJlY2lwaWVudChyKSwgY29va2llKGMpLCBmbGFncyhmKSwgd2hvKHcpIHsKKyAgICAgICAgfQorICAgICAgICBPYml0dWFyeShjb25zdCBPYml0dWFyeSYgbykgOgorICAgICAgICAgICAgcmVjaXBpZW50KG8ucmVjaXBpZW50KSwKKyAgICAgICAgICAgIGNvb2tpZShvLmNvb2tpZSksCisgICAgICAgICAgICBmbGFncyhvLmZsYWdzKSwKKyAgICAgICAgICAgIHdobyhvLndobykgeworICAgICAgICB9CisgICAgICAgIE9iaXR1YXJ5JiBvcGVyYXRvcj0oY29uc3QgT2JpdHVhcnkmIG8pIHsKKyAgICAgICAgICAgIHJlY2lwaWVudCA9IG8ucmVjaXBpZW50OworICAgICAgICAgICAgY29va2llID0gby5jb29raWU7CisgICAgICAgICAgICBmbGFncyA9IG8uZmxhZ3M7CisgICAgICAgICAgICB3aG8gPSBvLndobzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90LCBjb25zdCB3cDxISW50ZXJmYWNlPiYpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiBkciA9IHJlY2lwaWVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGRyLT5iaW5kZXJEaWVkKHdobyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIHN0ZDo6bXV0ZXggbU9iaXR1YXJpZXNMb2NrOworICAgIHN0ZDo6dmVjdG9yPHNwPE9iaXR1YXJ5PiA+IG1PYml0dWFyaWVzOworfTsKKwordGVtcGxhdGUgPAorICAgICAgICB0eXBlbmFtZSBISU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIEJOSU5URVJGQUNFPgorc3RhdHVzX3QgSDJCQ29udmVydGVyPEhJTlRFUkZBQ0UsIElOVEVSRkFDRSwgQk5JTlRFUkZBQ0U+OjoKKyAgICAgICAgbGlua1RvRGVhdGgoCisgICAgICAgIGNvbnN0IHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZWNpcGllbnQgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICJsaW5rVG9EZWF0aCgpOiByZWNpcGllbnQgbXVzdCBiZSBub24tbnVsbHB0ciIpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU9iaXR1YXJpZXNMb2NrKTsKKyAgICAgICAgbU9iaXR1YXJpZXMucHVzaF9iYWNrKG5ldyBPYml0dWFyeShyZWNpcGllbnQsIGNvb2tpZSwgZmxhZ3MsIHRoaXMpKTsKKyAgICAgICAgaWYgKCFtQmFzZS0+bGlua1RvRGVhdGgobU9iaXR1YXJpZXMuYmFjaygpLCAwKSkgeworICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8CisgICAgICAgIHR5cGVuYW1lIEhJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgQk5JTlRFUkZBQ0U+CitzdGF0dXNfdCBIMkJDb252ZXJ0ZXI8SElOVEVSRkFDRSwgSU5URVJGQUNFLCBCTklOVEVSRkFDRT46OgorICAgICAgICB1bmxpbmtUb0RlYXRoKAorICAgICAgICBjb25zdCB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgdm9pZCogY29va2llLCB1aW50MzJfdCBmbGFncywKKyAgICAgICAgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+KiBvdXRSZWNpcGllbnQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtT2JpdHVhcmllc0xvY2spOworICAgIGZvciAoYXV0byBpID0gbU9iaXR1YXJpZXMuYmVnaW4oKTsgaSAhPSBtT2JpdHVhcmllcy5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmICgoZmxhZ3MgPSAoKmkpLT5mbGFncykgJiYgKAorICAgICAgICAgICAgICAgIChyZWNpcGllbnQgPT0gKCppKS0+cmVjaXBpZW50KSB8fAorICAgICAgICAgICAgICAgICgocmVjaXBpZW50ID09IG51bGxwdHIpICYmIChjb29raWUgPT0gKCppKS0+Y29va2llKSkpKSB7CisgICAgICAgICAgICBpZiAob3V0UmVjaXBpZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqb3V0UmVjaXBpZW50ID0gKCppKS0+cmVjaXBpZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gbUJhc2UtPnVubGlua1RvRGVhdGgoKmkpOworICAgICAgICAgICAgbU9iaXR1YXJpZXMuZXJhc2UoaSk7CisgICAgICAgICAgICByZXR1cm4gc3VjY2VzcyA/IE5PX0VSUk9SIDogREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworfQorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmFoeWJyaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQ0FNRVJBX0hZQlJJRElOVEVSRkFDRV9ICisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NzgxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgdXRpbHMgeworbmFtZXNwYWNlIGNvbnZlcnNpb24geworCit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYWltZzo6QUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlOworCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpIHsKKyAgICBpZiAoc3JjID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOmF0dGVtcHQgdG8gY29udmVydCBlbXB0eSBtZXRhZGF0YSB0byBIaWRsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzcmMpOworICAgIGRzdC0+c2V0VG9FeHRlcm5hbCgodWludDhfdCAqKSBzcmMsIHNpemUpOworICAgIHJldHVybjsKK30KKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIHN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKSB7CisgICAgc3dpdGNoIChzdHJlYW1Db25maWd1cmF0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU7CisgICAgICAgIGNhc2UgSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERToKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6Tk9STUFMX01PREU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBUT0RPOiBGaXggdGhpcworICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpWRU5ET1JfTU9ERV9TVEFSVDsKKyAgICB9Cit9CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhUZW1wbGF0ZUlkIHRlbXBsYXRlSWQpIHsKKyAgICBzd2l0Y2godGVtcGxhdGVJZCkgeworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpQUkVWSUVXOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9QUkVWSUVXOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpTVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9TVElMTF9DQVBUVVJFOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpSRUNPUkQ6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1JFQ09SRDsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6VklERU9fU05BUFNIT1Q6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpaRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpNQU5VQUw6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX01BTlVBTDsKKyAgICB9Cit9CisKK2ludCBjb252ZXJ0RnJvbUhpZGwoSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uIHJvdGF0aW9uKSB7CisgICAgc3dpdGNoKHJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSMDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjkwOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSMTgwOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSMjcwOgorICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgfQorfQorCitoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uIGNvbnZlcnRGcm9tSGlkbCgKKyAgICBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiAmaE91dHB1dENvbmZpZ3VyYXRpb24pIHsKKyAgICBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4gaUdCUHM7CisgICAgYXV0byAmd2luZG93SGFuZGxlcyA9IGhPdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgaUdCUHMucmVzZXJ2ZSh3aW5kb3dIYW5kbGVzLnNpemUoKSk7CisgICAgZm9yIChhdXRvICZoYW5kbGUgOiB3aW5kb3dIYW5kbGVzKSB7CisgICAgICAgIGlHQlBzLnB1c2hfYmFjayhuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShoYW5kbGUpKSk7CisgICAgfQorICAgIFN0cmluZzE2IHBoeXNpY2FsQ2FtZXJhSWQxNihoT3V0cHV0Q29uZmlndXJhdGlvbi5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgaUdCUHMsIGNvbnZlcnRGcm9tSGlkbChoT3V0cHV0Q29uZmlndXJhdGlvbi5yb3RhdGlvbiksIHBoeXNpY2FsQ2FtZXJhSWQxNiwKKyAgICAgICAgaE91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93R3JvdXBJZCwgT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1VOS05PV04sIDAsIDAsCisgICAgICAgICh3aW5kb3dIYW5kbGVzLnNpemUoKSA+IDEpKTsKKyAgICByZXR1cm4gb3V0cHV0Q29uZmlndXJhdGlvbjsKK30KKworLy8gVGhlIGNhbWVyYSBtZXRhZGF0YSBoZXJlIGlzIGNsb25lZC4gU2luY2Ugd2UncmUgcmVhZGluZyBtZXRhZGF0YSBvdmVyCisvLyBod2JpbmRlciB3ZSB3b3VsZCBuZWVkIHRvIGNsb25lIGl0IGluIG9yZGVyIHRvIGF2b2lkIGFsaWdtZW50IGlzc3Vlcy4KK2Jvb2wgY29udmVydEZyb21IaWRsKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmc3JjLCBDYW1lcmFNZXRhZGF0YSAqZHN0KSB7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihzcmMuZGF0YSgpKTsKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gc3JjLnNpemUoKTsKKyAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgKmRzdCA9IGJ1ZmZlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0hDYW1lcmFEZXZpY2VTdGF0dXMgY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhpbnQzMl90IHN0YXR1cykgeworICAgIEhDYW1lcmFEZXZpY2VTdGF0dXMgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1VOS05PV047CisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQ6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQ6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkc6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfRU5VTUVSQVRJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBkZXZpY2VTdGF0dXM7Cit9CisKK0hDYXB0dXJlUmVzdWx0RXh0cmFzIGNvbnZlcnRUb0hpZGwoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmY2FwdHVyZVJlc3VsdEV4dHJhcykgeworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhDYXB0dXJlUmVzdWx0RXh0cmFzOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLmJ1cnN0SWQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50OworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQ7CisgICAgcmV0dXJuIGhDYXB0dXJlUmVzdWx0RXh0cmFzOworfQorCitIRXJyb3JDb2RlIGNvbnZlcnRUb0hpZGwoaW50MzJfdCBlcnJvckNvZGUpIHsKKyAgICBzd2l0Y2goZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfRElTQ09OTkVDVEVEOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UgOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9ERVZJQ0U7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0U6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1Q6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1JFUVVFU1Q7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfUkVTVUxUOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0JVRkZFUjsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQUJMRUQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0RJU0FCTEVEOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9JTlZBTElEX0VSUk9SOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9VTktOT1dOX0VSUk9SOworICAgIH0KK30KKwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICZzcmMsCisgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8SENhbWVyYVN0YXR1c0FuZElkPiogZHN0KSB7CisgICAgZHN0LT5yZXNpemUoc3JjLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoYXV0byAmc3RhdHVzQW5kSWQgOiBzcmMpIHsKKyAgICAgICAgYXV0byAmYSA9ICgqZHN0KVtpKytdOworICAgICAgICBhLmNhbWVyYUlkID0gc3RhdHVzQW5kSWQuY2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgYS5kZXZpY2VTdGF0dXMgPSBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKHN0YXR1c0FuZElkLnN0YXR1cyk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyAmc3VibWl0SW5mbywKKyAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm8gKmhTdWJtaXRJbmZvKSB7CisgICAgaFN1Ym1pdEluZm8tPnJlcXVlc3RJZCA9IHN1Ym1pdEluZm8ubVJlcXVlc3RJZDsKKyAgICBoU3VibWl0SW5mby0+bGFzdEZyYW1lTnVtYmVyID0gc3VibWl0SW5mby5tTGFzdEZyYW1lTnVtYmVyOworfQorCitIU3RhdHVzIEIySFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmYlN0YXR1cykgeworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKGJTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIC8vIE5PIEVycm9yIGhlcmUKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3dpdGNoKGJTdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfQ0FNRVJBX0lOX1VTRToKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkNBTUVSQV9JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX01BWF9DQU1FUkFTX0lOX1VTRToKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RFUFJFQ0FURURfSEFMOgorICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlIHNpbmNlIHdlIGZpbHRlcmVkIGxlZ2FjeSBIQUxzIGVhcmxpZXIKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRFUFJFQ0FURURfSEFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNBQkxFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRJU0FCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9QRVJNSVNTSU9OX0RFTklFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OlBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gc3RhdHVzOworfQorCitIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8sCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpIHsKKyAgICBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKKyAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5waHlzaWNhbENhbWVyYUlkID0KKyAgICAgICAgU3RyaW5nOChwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPQorICAgICAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICAvLyBUcnkgdXNpbmcgZm1xIGF0IGZpcnN0LgorICAgIHNpemVfdCBtZXRhZGF0YV9zaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJhd01ldGFkYXRhKTsKKyAgICBpZiAoKG1ldGFkYXRhX3NpemUgPiAwKSAmJiAoY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA+IDApKSB7CisgICAgICAgIGlmIChjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoKHVpbnQ4X3QgKilyYXdNZXRhZGF0YSwgbWV0YWRhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKG1ldGFkYXRhX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzIENvdWxkbid0IHVzZSBmbXEsIGZhbGxpbmcgYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgICAgICAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmbWV0YWRhdGEpOworICAgICAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ucGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5tZXRhZGF0YShzdGQ6Om1vdmUobWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOworfQorCitoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MsCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpIHsKKyAgICBoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcy5yZXNpemUocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3Muc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChhdXRvICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIDogcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIHsKKyAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zW2krK10gPSBjb252ZXJ0VG9IaWRsKHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgfQorICAgIHJldHVybiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7Cit9CisKK30gLy9jb252ZXJzaW9uCit9IC8vIHV0aWxzCit9IC8vY2FtZXJhc2VydmljZQorfSAvLyBoYXJkd2FyZQorfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTM3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDQU1FUkFTRVJWRVJfQ09OVkVSVF9ISURMCisjZGVmaW5lIENBTUVSQVNFUlZFUl9DT05WRVJUX0hJREwKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9jb21tb24vMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSB1dGlscyB7CituYW1lc3BhY2UgY29udmVyc2lvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87CisKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwordXNpbmcgSENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7Cit1c2luZyBIQ2FtZXJhRGV2aWNlVXNlciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBIQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIEhDYXB0dXJlUmVxdWVzdCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyBIRXJyb3JDb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpFcnJvckNvZGU7Cit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIEhPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgSFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIEhTdWJtaXRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvOwordXNpbmcgSFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIEhUZW1wbGF0ZUlkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpUZW1wbGF0ZUlkOworCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpOworCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgc3RyZWFtQ29uZmlndXJhdGlvbk1vZGUpOworCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIVGVtcGxhdGVJZCB0ZW1wbGF0ZUlkKTsKKworYm9vbCBjb252ZXJ0RnJvbUhpZGwoY29uc3QgSENhbWVyYU1ldGFkYXRhICZzcmMsIENhbWVyYU1ldGFkYXRhICpkc3QpOworCitoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uIGNvbnZlcnRGcm9tSGlkbCgKKyAgICBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiAmaE91dHB1dENvbmZpZ3VyYXRpb24pOworCitIQ2FtZXJhRGV2aWNlU3RhdHVzIGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoaW50MzJfdCBzdGF0dXMpOworCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gJnNyYywKKyAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxIQ2FtZXJhU3RhdHVzQW5kSWQ+KiBkc3QpOworCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvICZzdWJtaXRJbmZvLAorICAgICAgICAgICAgICAgICAgIEhTdWJtaXRJbmZvICpoU3VibWl0SW5mbyk7CisKK0hFcnJvckNvZGUgY29udmVydFRvSGlkbChpbnQzMl90IGVycm9yQ29kZSk7CisKK0hDYXB0dXJlUmVzdWx0RXh0cmFzIGNvbnZlcnRUb0hpZGwoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmY2FwdHVyZVJlc3VsdEV4dHJhcyk7CisKK2hpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+ICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+ICZjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisKK0hTdGF0dXMgQjJIU3RhdHVzKGNvbnN0IGJpbmRlcjo6U3RhdHVzICZiU3RhdHVzKTsKKworfSAvLyBjb252ZXJzaW9uCit9IC8vIHV0aWxzCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gaGFyZHdhcmUKK30gLy9hbmRyb2lkCisKKyNlbmRpZiAvL0NBTUVSQVNFUlZFUl9DT05WRVJUX1RPX0hJREwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyYmE1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0RnJvbUhpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OkIySFN0YXR1czsKKwordXNpbmcgaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIEhTdWJtaXRJbmZvID0gZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbjsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IENBTUVSQV9SRVFVRVNUX01FVEFEQVRBX1FVRVVFX1NJWkUgPSAxIDw8IDIwIC8qIDEgTUIgKi87CitzdGF0aWMgY29uc3RleHByIGludDMyX3QgQ0FNRVJBX1JFU1VMVF9NRVRBREFUQV9RVUVVRV9TSVpFID0gMSA8PCAyMCAvKiAxIE1CICovOworCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmRpc2Nvbm5lY3QoKSB7CisgICAgbURldmljZVJlbW90ZS0+ZGlzY29ubmVjdCgpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0hpZGxDYW1lcmFEZXZpY2VVc2VyOjpIaWRsQ2FtZXJhRGV2aWNlVXNlcigKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+ICZkZXZpY2VSZW1vdGUpCisgIDogbURldmljZVJlbW90ZShkZXZpY2VSZW1vdGUpIHsKKyAgICBtSW5pdFN1Y2Nlc3MgPSBpbml0RGV2aWNlKCk7Cit9CisKK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmluaXREZXZpY2UoKSB7CisgICAgLy8gVE9ETzogR2V0IHJlcXVlc3QgYW5kIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBzaXplIGZyb20gYSBzeXN0ZW0gcHJvcGVydHkuCisgICAgaW50MzJfdCByZXFGTVFTaXplID0gQ0FNRVJBX1JFUVVFU1RfTUVUQURBVEFfUVVFVUVfU0laRTsKKworICAgIG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPQorICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXFGTVFTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vbiBibG9ja2luZyAqLyk7CisgICAgaWYgKCFtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHJlcXVlc3QgZm1xIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgcmVzRk1RU2l6ZSA9IENBTUVSQV9SRVNVTFRfTUVUQURBVEFfUVVFVUVfU0laRTsKKyAgICBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPihzdGF0aWNfY2FzdDxzaXplX3Q+KHJlc0ZNUVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBub24gYmxvY2tpbmcgKi8pOworICAgIGlmICghbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHJlc3VsdCBmbXEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICBnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUluaXRTdWNjZXNzKSB7CisgICAgICAgIF9oaWRsX2NiKCptQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5nZXREZXNjKCkpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgIGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1Jbml0U3VjY2VzcykgeworICAgICAgICBfaGlkbF9jYigqbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5nZXREZXNjKCkpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvKioKKyAqIFRvIGJlIHVzZWQgb25seSBieSBzdWJtaXRSZXF1ZXN0TGlzdCBpbXBsZW1lbnRhdGlvbiwgc2luY2UgaXQgcmVxdWlyZXMKKyAqIGNsaWVudHMgdG8gY2FsbCB0aGlzIG1ldGhvZCBzZXJpYWxseSwgaW5jYXNlIGZtcSBpcyB1c2VkIHRvIHNlbmQgbWV0YWRhdGEuCisgKi8KK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmNvcHlQaHlzaWNhbENhbWVyYVNldHRpbmdzKAorICAgIGNvbnN0IGhpZGxfdmVjPEhQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAmaFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MsCisgICAgc3RkOjp2ZWN0b3I8Q2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICpwaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gJmUgOiBoUGh5c2ljYWxDYW1lcmFTZXR0aW5ncykgeworICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLT5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgQ2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgJnBoeXNpY2FsQ2FtZXJhU2V0dGluZyA9CisgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLT5iYWNrKCk7CisgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZy5pZCA9IGUuaWQuY19zdHIoKTsKKworICAgICAgICAvLyBSZWFkIHRoZSBzZXR0aW5ncyBlaXRoZXIgZnJvbSB0aGUgZm1xIG9yIHN0cmFpZ2h0YXdheSBmcm9tIHRoZQorICAgICAgICAvLyByZXF1ZXN0LiBXZSBkb24ndCBuZWVkIGFueSBzeW5jaHJvbml6YXRpb24sIHNpbmNlIHN1Ym1pdFJlcXVlc3RMaXN0CisgICAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIHNlcmlhbGx5IGJ5IHRoZSBjbGllbnQgaWYgaXQgZGVjaWRlcyB0bworICAgICAgICAvLyB1c2UgZm1xLgorICAgICAgICBpZiAoZS5zZXR0aW5ncy5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZtcU1ldGFkYXRhU2l6ZSkgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBHZXQgc2V0dGluZ3MgZnJvbSB0aGUgZm1xLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgc2V0dGluZ3NGbXE7CisgICAgICAgICAgICBzZXR0aW5nc0ZtcS5yZXNpemUoZS5zZXR0aW5ncy5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgICAgICBib29sIHJlYWQgPSBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5yZWFkKHNldHRpbmdzRm1xLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXR0aW5ncy5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgICAgICBpZiAoIXJlYWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgY2FwdHVyZSByZXF1ZXN0IHNldHRpbmdzIGNvdWxkJ3QgYmUgcmVhZCBmcm9tIGZtcSBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBjb252ZXJ0RnJvbUhpZGwoc2V0dGluZ3NGbXEsICZwaHlzaWNhbENhbWVyYVNldHRpbmcuc2V0dGluZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgc2V0dGluZ3MgbWV0YWRhdGEgaXMgY29udGFpbmVkIGluIHJlcXVlc3Qgc2V0dGluZ3MgZmllbGQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnZlcnRlZCA9CisgICAgICAgICAgICAgICAgY29udmVydEZyb21IaWRsKGUuc2V0dGluZ3MubWV0YWRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhU2V0dGluZy5zZXR0aW5ncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb252ZXJ0ZWQpIHsKKyAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb252ZXJ0IHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgZnJvbSBISURMIHRvIEFJREwuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoY29uc3QgSENhcHR1cmVSZXF1ZXN0ICZoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgKnJlcXVlc3QpIHsKKyAgICAvLyBObyByZXByb2Nlc3Npbmcgc3VwcG9ydC4KKyAgICByZXF1ZXN0LT5tSXNSZXByb2Nlc3MgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbUFuZFdpbmRvd0lkIDogaFJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7CisgICAgICAgIHJlcXVlc3QtPm1TdHJlYW1JZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1BbmRXaW5kb3dJZC5zdHJlYW1JZCk7CisgICAgICAgIHJlcXVlc3QtPm1TdXJmYWNlSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtQW5kV2luZG93SWQud2luZG93SWQpOworICAgIH0KKyAgICByZXR1cm4gY29weVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoaFJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihyZXF1ZXN0LT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncykpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OnN1Ym1pdFJlcXVlc3RMaXN0KGNvbnN0IGhpZGxfdmVjPEhDYXB0dXJlUmVxdWVzdD4mIGhSZXF1ZXN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdFJlcXVlc3RMaXN0X2NiIF9oaWRsX2NiKSB7CisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvIHN1Ym1pdEluZm87CisgICAgSFN1Ym1pdEluZm8gaFN1Ym1pdEluZm87CisgICAgLyoqCisgICAgICogQ3JlYXRlIEFJREwgQ2FwdHVyZVJlcXVlc3QgZnJvbSByZXF1ZXN0TGlzdCBhbmQgZ3JhcGhpY0J1ZmZlclByb2R1Y2Vycy4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RzOworICAgIGZvciAoYXV0byAmaFJlcXVlc3QgOiBoUmVxdWVzdExpc3QpIHsKKyAgICAgICAgcmVxdWVzdHMuZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGF1dG8gJnJlcXVlc3QgPSByZXF1ZXN0cy5iYWNrKCk7CisgICAgICAgIGlmICghY29udmVydFJlcXVlc3RGcm9tSGlkbChoUmVxdWVzdCwgJnJlcXVlc3QpKSB7CisgICAgICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCBoU3VibWl0SW5mbyk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIG1EZXZpY2VSZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RzLCBzdHJlYW1pbmcsICZzdWJtaXRJbmZvKTsKKyAgICBtUmVxdWVzdElkID0gc3VibWl0SW5mby5tUmVxdWVzdElkOworICAgIGNvbnZlcnRUb0hpZGwoc3VibWl0SW5mbywgJmhTdWJtaXRJbmZvKTsKKyAgICBfaGlkbF9jYihIU3RhdHVzOjpOT19FUlJPUiwgaFN1Ym1pdEluZm8pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y2FuY2VsUmVwZWF0aW5nUmVxdWVzdChjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSAwOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmNhbmNlbFJlcXVlc3QobVJlcXVlc3RJZCwgJmxhc3RGcmFtZU51bWJlcik7CisgICAgX2hpZGxfY2IoQjJIU3RhdHVzKHJldCksIGxhc3RGcmFtZU51bWJlcik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpiZWdpbkNvbmZpZ3VyZSgpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5iZWdpbkNvbmZpZ3VyZSgpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjplbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uUGFyYW1zKSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CisgICAgaWYgKCFjb252ZXJ0RnJvbUhpZGwoc2Vzc2lvblBhcmFtcywgJmNhbWVyYU1ldGFkYXRhKSkgeworICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5lbmRDb25maWd1cmUoY29udmVydEZyb21IaWRsKG9wZXJhdGluZ01vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFNZXRhZGF0YSk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OmRlbGV0ZVN0cmVhbShpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y3JlYXRlU3RyZWFtKGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBoT3V0cHV0Q29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cmVhbV9jYiBoaWRsX2NiXykgeworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbiA9CisgICAgICAgIGNvbnZlcnRGcm9tSGlkbChoT3V0cHV0Q29uZmlndXJhdGlvbik7CisgICAgaW50MzJfdCBuZXdTdHJlYW1JZCA9IDA7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Y3JlYXRlU3RyZWFtKG91dHB1dENvbmZpZ3VyYXRpb24sICZuZXdTdHJlYW1JZCk7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBCMkhTdGF0dXMocmV0KTsKKyAgICBoaWRsX2NiXyhzdGF0dXMsIG5ld1N0cmVhbUlkKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KFRlbXBsYXRlSWQgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVmYXVsdFJlcXVlc3RfY2IgX2hpZGxfY2IpIHsKKyAgICBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YSBjYW1lcmFNZXRhZGF0YTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChjb252ZXJ0RnJvbUhpZGwodGVtcGxhdGVJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbWVyYU1ldGFkYXRhKTsKKyAgICBIU3RhdHVzIGhTdGF0dXMgPSBCMkhTdGF0dXMocmV0KTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IGNhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmaGlkbE1ldGFkYXRhKTsKKyAgICBfaGlkbF9jYihoU3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgIGNhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjp3YWl0VW50aWxJZGxlKCkgeworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPndhaXRVbnRpbElkbGUoKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Zmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIHsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IDA7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Zmx1c2goJmxhc3RGcmFtZU51bWJlcik7CisgICAgX2hpZGxfY2IoQjJIU3RhdHVzKHJldCksbGFzdEZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgaW50MzJfdCBzdHJlYW1JZCwKKyAgICBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgaE91dHB1dENvbmZpZ3VyYXRpb24pIHsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0RnJvbUhpZGwoaE91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oc3RyZWFtSWQsIG91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOGYxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICisjZGVmaW5lIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDYW1lcmFTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdDsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIGhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgVGVtcGxhdGVJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6VGVtcGxhdGVJZDsKKwordXNpbmcgSENhbWVyYURldmljZVVzZXIgPSBkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gY2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FwdHVyZVJlcXVlc3QgPSBkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgSE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIEhTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IFJFUVVFU1RfSURfTk9ORSA9IC0xOworCitzdHJ1Y3QgSGlkbENhbWVyYURldmljZVVzZXIgZmluYWwgOiBwdWJsaWMgSENhbWVyYURldmljZVVzZXIgeworICAgIEhpZGxDYW1lcmFEZXZpY2VVc2VyKGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gJmRldmljZVJlbW90ZSk7CisKKyAgICB+SGlkbENhbWVyYURldmljZVVzZXIoKSB7IH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgZ2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBzdWJtaXRSZXF1ZXN0TGlzdChjb25zdCBoaWRsX3ZlYzxIQ2FwdHVyZVJlcXVlc3Q+JiByZXF1ZXN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZywgc3VibWl0UmVxdWVzdExpc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY2FuY2VsUmVwZWF0aW5nUmVxdWVzdChjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGJlZ2luQ29uZmlndXJlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBlbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25QYXJhbXMpOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gZGVsZXRlU3RyZWFtKGludDMyX3Qgc3RyZWFtSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlU3RyZWFtKGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBvdXRwdXRDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJlYW1fY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KFRlbXBsYXRlSWQgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVmYXVsdFJlcXVlc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gd2FpdFVudGlsSWRsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCwgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIG91dHB1dENvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOworCisgICAgYm9vbCBpbml0U3RhdHVzKCkgeyByZXR1cm4gbUluaXRTdWNjZXNzOyB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCkgeworICAgICAgICByZXR1cm4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIH0KKworIHByaXZhdGU6CisgICAgYm9vbCBpbml0RGV2aWNlKCk7CisKKyAgICBib29sIGNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoY29uc3QgSENhcHR1cmVSZXF1ZXN0ICZoUmVxdWVzdCwgQ2FwdHVyZVJlcXVlc3QgKnJlcXVlc3QpOworCisgICAgYm9vbCBjb3B5UGh5c2ljYWxDYW1lcmFTZXR0aW5ncygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8SFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICZoUGh5c2ljYWxDYW1lcmFTZXR0aW5ncywKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICpwaHlzaWNhbENhbWVyYVNldHRpbmdzKTsKKworICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gbURldmljZVJlbW90ZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgYm9vbCBtSW5pdFN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBpbnQzMl90IG1SZXF1ZXN0SWQgPSBSRVFVRVNUX0lEX05PTkU7Cit9OworCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCisjZW5kaWYgLy8gQU5EUk9JRF9GUkFNRU9XT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2ZlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYVNlcnZpY2UuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFTZXJ2aWNlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpCMkhTdGF0dXM7Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKwordXNpbmcgZGV2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwordXNpbmcgZGV2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYURldmljZVVzZXI7Cit1c2luZyBzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgSENhbWVyYU1ldGFkYXRhVHlwZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6Q2FtZXJhTWV0YWRhdGFUeXBlOwordXNpbmcgSFZlbmRvclRhZyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnOwordXNpbmcgSFZlbmRvclRhZ1NlY3Rpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZ1NlY3Rpb247Cit1c2luZyBIUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zID0KKyAgICAgICAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnM7CisKK3NwPEhpZGxDYW1lcmFTZXJ2aWNlPiBnSGlkbENhbWVyYVNlcnZpY2U7CisKK3NwPEhpZGxDYW1lcmFTZXJ2aWNlPiBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0SW5zdGFuY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIHsKKyAgICBnSGlkbENhbWVyYVNlcnZpY2UgPSBuZXcgSGlkbENhbWVyYVNlcnZpY2UoY3MpOworICAgIHJldHVybiBnSGlkbENhbWVyYVNlcnZpY2U7Cit9CisKK1JldHVybjx2b2lkPgorSGlkbENhbWVyYVNlcnZpY2U6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc19jYiBfaGlkbF9jYikgeworICAgIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhIGNhbWVyYU1ldGFkYXRhOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9CisgICAgICAgIG1BaWRsSUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhTdHJpbmcxNihjYW1lcmFJZC5jX3N0cigpKSwgJmNhbWVyYU1ldGFkYXRhKTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgICAgc3dpdGNoKHNlcnZpY2VSZXQuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKKyAgICAgICAgICAgIC8vIE5vIEVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQgc2luY2Ugd2UncmUgaW4gdGhlIHNhbWUgcHJvY2Vzcy4KKyAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIElEICVzIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZyb20gY2FtZXJhIHNlcnZpY2UgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVJldC50b1N0cmluZzgoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQjJIU3RhdHVzKHNlcnZpY2VSZXQpOworICAgICAgICAgIH0KKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSBjYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgY29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJmhpZGxNZXRhZGF0YSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgIGNhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RGV2aWNlKGNvbnN0IHNwPEhDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGhDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdERldmljZV9jYiBfaGlkbF9jYikgeworICAgIC8vIEhlcmUsIHdlIGZpcnN0IGdldCBJQ2FtZXJhRGV2aWNlVXNlciBmcm9tIG1BaWRsSUNhbWVyYVNlcnZpY2UsIHRoZW4gc2F2ZQorICAgIC8vIHRoYXQgaW50ZXJmYWNlIGluIHRoZSBuZXdseSBjcmVhdGVkIEhpZGxDYW1lcmFEZXZpY2VVc2VyIGltcGwgY2xhc3MuCisgICAgaWYgKG1BaWRsSUNhbWVyYVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2VSZW1vdGUgPSBudWxscHRyOworICAgIC8vIENyZWF0ZSBhIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgb2JqZWN0IHdoaWNoIGludGVybmFsbHkKKyAgICAvLyBjYWxscyBjYWxsYmFjayBmdW5jdGlvbnMgcGFzc2VkIHRocm91Z2ggaENhbGxiYWNrLgorICAgIHNwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gaHlicmlkQ2FsbGJhY2tzID0gbmV3IEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhoQ2FsbGJhY2spOworICAgIGlmICghaHlicmlkQ2FsbGJhY2tzLT5pbml0aWFsaXplTG9vcGVyKCkpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBoYW5kbGUgY2FsbGJhY2tzIG9uIGRldmljZSwgY2Fubm90IGNvbm5lY3QiKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYWxsYmFja3MgPSBoeWJyaWRDYWxsYmFja3M7CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IG1BaWRsSUNhbWVyYVNlcnZpY2UtPmNvbm5lY3REZXZpY2UoCisgICAgICAgICAgICBjYWxsYmFja3MsIFN0cmluZzE2KGNhbWVyYUlkLmNfc3RyKCkpLCBTdHJpbmcxNigiIiksCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIGNhbWVyYSBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIC8vIE5vdyB3ZSBjcmVhdGUgYSBIaWRsQ2FtZXJhRGV2aWNlVXNlciBjbGFzcywgc3RvcmUgdGhlIGRldmljZVJlbW90ZSBpbiBpdCwKKyAgICAvLyBhbmQgcmV0dXJuIHRoYXQgYmFjay4gQWxsIGNhbGxzIG9uIHRoYXQgaW50ZXJmYWNlIHdpbGwgYmUgZm9yd2FyZGVkIHRvCisgICAgLy8gdGhlIEFJREwgaW50ZXJmYWNlLgorICAgIHNwPEhpZGxDYW1lcmFEZXZpY2VVc2VyPiBoRGV2aWNlUmVtb3RlID0gbmV3IEhpZGxDYW1lcmFEZXZpY2VVc2VyKGRldmljZVJlbW90ZSk7CisgICAgaWYgKCFoRGV2aWNlUmVtb3RlLT5pbml0U3RhdHVzKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgZGV2aWNlIEhJREwgd3JhcHBlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBoeWJyaWRDYWxsYmFja3MtPnNldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKGhEZXZpY2VSZW1vdGUtPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCkpOworICAgIF9oaWRsX2NiKHN0YXR1cywgaERldmljZVJlbW90ZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBIaWRsQ2FtZXJhU2VydmljZTo6YWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXJzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfcGFpcihoTGlzdGVuZXIsIGNzTGlzdGVuZXIpKTsKK30KKworc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+CitIaWRsQ2FtZXJhU2VydmljZTo6c2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZChzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBoTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNob3VsZFJlbW92ZSkgeworICAgIC8vIEdvIHRocm91Z2ggdGhlIG1MaXN0ZW5lcnMgbGlzdCBhbmQgY29tcGFyZSB0aGUgbGlzdGVuZXIgd2l0aCB0aGUgSElETAorICAgIC8vIGxpc3RlbmVyIHJlZ2lzdGVyZWQuCisgICAgYXV0byBpdCA9IG1MaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyID0gbnVsbHB0cjsKKyAgICBmb3IgKDtpdCAhPSBtTGlzdGVuZXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmIChoYXJkd2FyZTo6aW50ZXJmYWNlc0VxdWFsKGl0LT5maXJzdCwgaExpc3RlbmVyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGl0ICE9IG1MaXN0ZW5lcnMuZW5kKCkpIHsKKyAgICAgICAgY3NMaXN0ZW5lciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChzaG91bGRSZW1vdmUpIHsKKyAgICAgICAgICBtTGlzdGVuZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY3NMaXN0ZW5lcjsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgaENzTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1BaWRsSUNhbWVyYVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGlmIChoQ3NMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBsaXN0ZW5lciBtdXN0IG5vdCBiZSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVCwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lciA9IG51bGxwdHI7CisgICAgLy8gQ2hlY2sgdGhlIGNhY2hlIGZvciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2tzCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTGlzdGVuZXJMaXN0TG9jayk7CisgICAgICAgIGNzTGlzdGVuZXIgPSBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKGhDc0xpc3RlbmVyKTsKKyAgICAgICAgaWYgKGNzTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gV3JhcCBhbiBoQ3NMaXN0ZW5lciB3aXRoIEFpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgYW5kIHBhc3MgaXQgdG8KKyAgICAgICAgICAgIC8vIENhbWVyYVNlcnZpY2UuCisgICAgICAgICAgICBjc0xpc3RlbmVyID0gbmV3IEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcihoQ3NMaXN0ZW5lcik7CisgICAgICAgICAgICAvLyBBZGQgdG8gY2FjaGUKKyAgICAgICAgICAgIGFkZFRvTGlzdGVuZXJDYWNoZUxvY2tlZChoQ3NMaXN0ZW5lciwgY3NMaXN0ZW5lcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBhZGQgYSBsaXN0ZW5lciAlcCBhbHJlYWR5IHJlZ2lzdGVyZWQiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoQ3NMaXN0ZW5lci5nZXQoKSk7CisgICAgICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCB7fSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+IGNhbWVyYVN0YXR1c0FuZElkc3t9OworICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPQorICAgICAgICBtQWlkbElDYW1lcmFTZXJ2aWNlLT5hZGRMaXN0ZW5lckhlbHBlcihjc0xpc3RlbmVyLCAmY2FtZXJhU3RhdHVzQW5kSWRzLCB0cnVlKTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBjYW1lcmEgZGV2aWNlIHN0YXR1cyBsaXN0ZW5lciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICBfaGlkbF9jYihzdGF0dXMsIHt9KTsKKyAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGhpZGxfdmVjPEhDYW1lcmFTdGF0dXNBbmRJZD4gaENhbWVyYVN0YXR1c0FuZElkczsKKyAgICAvL0NvbnZlcnQgY2FtZXJhU3RhdHVzQW5kSWRzIHRvIEhJREwgYW5kIGNhbGwgY2FsbGJhY2sKKyAgICBjb252ZXJ0VG9IaWRsKGNhbWVyYVN0YXR1c0FuZElkcywgJmhDYW1lcmFTdGF0dXNBbmRJZHMpOworICAgIF9oaWRsX2NiKHN0YXR1cywgaENhbWVyYVN0YXR1c0FuZElkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFTZXJ2aWNlOjpyZW1vdmVMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgaENzTGlzdGVuZXIpIHsKKyAgICBpZiAoaENzTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgbGlzdGVuZXIgbXVzdCBub3QgYmUgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgIH0KKyAgICBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1MaXN0ZW5lckxpc3RMb2NrKTsKKyAgICAgICAgY3NMaXN0ZW5lciA9IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoaENzTGlzdGVuZXIsIC8qcmVtb3ZlSWZGb3VuZCovdHJ1ZSk7CisgICAgfQorICAgIGlmIChjc0xpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICBtQWlkbElDYW1lcmFTZXJ2aWNlLT5yZW1vdmVMaXN0ZW5lcihjc0xpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXMgUmVtb3ZpbmcgdW5yZWdpc3RlcmVkIGxpc3RlbmVyICVwIiwgX19GVU5DVElPTl9fLCBoQ3NMaXN0ZW5lci5nZXQoKSk7CisgICAgICAgIHJldHVybiBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgIH0KKyAgICByZXR1cm4gSFN0YXR1czo6Tk9fRVJST1I7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnMoZ2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnNfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU+IGdDYWNoZSA9IFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0R2xvYmFsVmVuZG9yVGFnQ2FjaGUoKTsKKyAgICBpZiAoZ0NhY2hlID09IG51bGxwdHIpIHsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8bWV0YWRhdGFfdmVuZG9yX2lkX3QsIHNwPGFuZHJvaWQ6OlZlbmRvclRhZ0Rlc2NyaXB0b3I+PgorICAgICAgICAgICAgJnZlbmRvcklkc0FuZFRhZ0Rlc2NzID0gZ0NhY2hlLT5nZXRWZW5kb3JJZHNBbmRUYWdEZXNjcmlwdG9ycygpOworICAgIGlmICh2ZW5kb3JJZHNBbmRUYWdEZXNjcy5zaXplKCkgPT0gMCkgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgaGlkbF92ZWM8SFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucz4gaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zOworICAgIGhUYWdJZHNBbmRWZW5kb3JUYWdTZWN0aW9ucy5yZXNpemUodmVuZG9ySWRzQW5kVGFnRGVzY3Muc2l6ZSgpKTsKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChhdXRvICZ2ZW5kb3JJZEFuZFRhZ0Rlc2NzIDogdmVuZG9ySWRzQW5kVGFnRGVzY3MpIHsKKyAgICAgICAgaGlkbF92ZWM8SFZlbmRvclRhZ1NlY3Rpb24+IGhWZW5kb3JUYWdTZWN0aW9uczsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IHZlbmRvcklkQW5kVGFnRGVzY3Muc2Vjb25kOworICAgICAgICBjb25zdCBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4qIHNlY3Rpb25OYW1lcyA9IGRlc2MtPmdldEFsbFNlY3Rpb25OYW1lcygpOworICAgICAgICBzaXplX3QgbnVtU2VjdGlvbnMgPSBzZWN0aW9uTmFtZXMtPnNpemUoKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8SFZlbmRvclRhZz4+IHRhZ3NCeVNlY3Rpb24obnVtU2VjdGlvbnMpOworICAgICAgICBpbnQgdGFnQ291bnQgPSBkZXNjLT5nZXRUYWdDb3VudCgpOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gdGFncyh0YWdDb3VudCk7CisgICAgICAgIGRlc2MtPmdldFRhZ0FycmF5KHRhZ3MuZGF0YSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBIVmVuZG9yVGFnIHZ0OworICAgICAgICAgICAgdnQudGFnSWQgPSB0YWdzW2ldOworICAgICAgICAgICAgdnQudGFnTmFtZSA9IGRlc2MtPmdldFRhZ05hbWUodGFnc1tpXSk7CisgICAgICAgICAgICB2dC50YWdUeXBlID0gKEhDYW1lcmFNZXRhZGF0YVR5cGUpIGRlc2MtPmdldFRhZ1R5cGUodGFnc1tpXSk7CisgICAgICAgICAgICBzc2l6ZV90IHNlY3Rpb25JZHggPSBkZXNjLT5nZXRTZWN0aW9uSW5kZXgodGFnc1tpXSk7CisgICAgICAgICAgICB0YWdzQnlTZWN0aW9uW3NlY3Rpb25JZHhdLnB1c2hfYmFjayh2dCk7CisgICAgICAgIH0KKyAgICAgICAgaFZlbmRvclRhZ1NlY3Rpb25zLnJlc2l6ZShudW1TZWN0aW9ucyk7CisgICAgICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgbnVtU2VjdGlvbnM7IHMrKykgeworICAgICAgICAgICAgaFZlbmRvclRhZ1NlY3Rpb25zW3NdLnNlY3Rpb25OYW1lID0gKCpzZWN0aW9uTmFtZXMpW3NdLnN0cmluZygpOworICAgICAgICAgICAgaFZlbmRvclRhZ1NlY3Rpb25zW3NdLnRhZ3MgPSB0YWdzQnlTZWN0aW9uW3NdOworICAgICAgICB9CisgICAgICAgIEhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMgJmhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMgPQorICAgICAgICAgICAgICAgIGhUYWdJZHNBbmRWZW5kb3JUYWdTZWN0aW9uc1tqXTsKKyAgICAgICAgaFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucy5wcm92aWRlcklkID0gdmVuZG9ySWRBbmRUYWdEZXNjcy5maXJzdDsKKyAgICAgICAgaFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucy52ZW5kb3JUYWdTZWN0aW9ucyA9IHN0ZDo6bW92ZShoVmVuZG9yVGFnU2VjdGlvbnMpOworICAgICAgICBqKys7CisgICAgfQorICAgIF9oaWRsX2NiKEhTdGF0dXM6Ok5PX0VSUk9SLCBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBzZXJ2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWFkMGJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFTRVJWSUNFX1YyXzBfQ0FNRVJBU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFTRVJWSUNFX1YyXzBfQ0FNRVJBU0VSVklDRV9ICisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDYW1lcmFTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBzZXJ2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKKwordXNpbmcgSENhbWVyYURldmljZUNhbGxiYWNrID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIEhDYW1lcmFTZXJ2aWNlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2U7Cit1c2luZyBIQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIEhTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIEhDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOworCitzdHJ1Y3QgSGlkbENhbWVyYVNlcnZpY2UgZmluYWwgOiBwdWJsaWMgSENhbWVyYVNlcnZpY2UgeworCisgICAgfkhpZGxDYW1lcmFTZXJ2aWNlKCkgeyB9OworCisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjIuMDo6SUNhbWVyYVNlcnZpY2UgZm9sbG93LgorCisgICAgUmV0dXJuPHZvaWQ+IGNvbm5lY3REZXZpY2UoY29uc3Qgc3A8SENhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkLCBjb25uZWN0RGV2aWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBhZGRMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjxIU3RhdHVzPiByZW1vdmVMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zKGdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgY2FtZXJhc2VydmVycyBtYWluIHRocmVhZCB0bworICAgIC8vIGluc3RhbnRpYXRlIHRoZSBoaWRsIGNhbWVyYXNlcnZlci4KKyAgICBzdGF0aWMgc3A8SGlkbENhbWVyYVNlcnZpY2U+IGdldEluc3RhbmNlKGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNzKTsKKworcHJpdmF0ZToKKyAgICBIaWRsQ2FtZXJhU2VydmljZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcykgOiBtQWlkbElDYW1lcmFTZXJ2aWNlKGNzKSB7IH07CisKKyAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gc2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZCgKKyAgICAgICAgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gbGlzdGVuZXIsIC8qcmVtb3ZlSWZGb3VuZCovIGJvb2wgc2hvdWxkUmVtb3ZlID0gZmFsc2UpOworCisgICAgdm9pZCBhZGRUb0xpc3RlbmVyQ2FjaGVMb2NrZWQoc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gaExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyKTsKKworICAgIGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNvbnN0IG1BaWRsSUNhbWVyYVNlcnZpY2UgPSBudWxscHRyOworCisgICAgTXV0ZXggbUxpc3RlbmVyTGlzdExvY2s7CisKKyAgICB1c2luZyBISUxpc3RlbmVycyA9CisgICAgICAgIHN0ZDo6cGFpcjxzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiwgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4+OworICAgIHN0ZDo6bGlzdDxISUxpc3RlbmVycz4gbUxpc3RlbmVyczsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBzZXJ2aWNlCit9ICAvLyBuYW1lc3BhY2UgY2FtZXJhc2VydmljZQorfSAgLy8gbmFtZXNwYWNlIGZyYW1ld29ya3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQVNFUlZJQ0VfVjJfMF9DQU1FUkFTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGY3NzA2OWMuLmI0ZTdjMzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tawpAQCAtMjcsMTcgKzI3LDI0IEBACiAgICAgbGliY2FtZXJhX2NsaWVudCBcCiAgICAgbGliY2FtZXJhX21ldGFkYXRhIFwKICAgICBsaWJ1dGlscyBcCisgICAgbGlianBlZyBcCisgICAgbGliZXhpZiBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjUgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40CiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgIHN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9keW5hbWljX2RlcHRoL2luY2x1ZGVzIFwKKyAgICBleHRlcm5hbC9keW5hbWljX2RlcHRoL2ludGVybmFsIFwKIAogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBjYW1lcmFzZXJ2aWNlX3Rlc3QKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gZGV2aWNlLXRlc3RzCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCiBpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCmluZGV4IGVmOTNkOWEuLmY0N2U1YTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCkBAIC0zMyw2ICszMyw3IEBACiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYU1ldGFkYXRhVHlwZTsKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZUNhbGxiYWNrOwogdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTsKIAogLyoqCiAgKiBCYXNpYyB0ZXN0IGltcGxlbWVudGF0aW9uIG9mIGEgY2FtZXJhIHZlci4gMy4yIGRldmljZSBpbnRlcmZhY2UKQEAgLTg3LDcgKzg4LDcgQEAKIC8qKgogICogQmFzaWMgdGVzdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGNhbWVyYSBwcm92aWRlcgogICovCi1zdHJ1Y3QgVGVzdElDYW1lcmFQcm92aWRlciA6IHZpcnR1YWwgcHVibGljIHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXIgeworc3RydWN0IFRlc3RJQ2FtZXJhUHJvdmlkZXIgOiB2aXJ0dWFsIHB1YmxpYyBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyIHsKICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2s+IG1DYWxsYmFja3M7CiAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiBtRGV2aWNlTmFtZXM7CiAgICAgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBtRGV2aWNlSW50ZXJmYWNlOwpAQCAtMTAxLDYgKzEwMiw3IEBACiAKICAgICB2aXJ0dWFsIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzZXRDYWxsYmFjaygKICAgICAgICAgICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXJDYWxsYmFjaz4mIGNhbGxiYWNrcykgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGVkQ291bnRlcltTRVRfQ0FMTEJBQ0tdKys7CiAgICAgICAgIG1DYWxsYmFja3MgPSBjYWxsYmFja3M7CiAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4oU3RhdHVzOjpPSyk7CiAgICAgfQpAQCAtMTA4LDYgKzExMCw3IEBACiAgICAgdXNpbmcgZ2V0VmVuZG9yVGFnc19jYiA9IHN0ZDo6ZnVuY3Rpb248dm9pZChTdGF0dXMgc3RhdHVzLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHNlY3Rpb25zKT47CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBnZXRWZW5kb3JUYWdzKGdldFZlbmRvclRhZ3NfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxlZENvdW50ZXJbR0VUX1ZFTkRPUl9UQUdTXSsrOwogICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBtVmVuZG9yVGFnU2VjdGlvbnMpOwogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICB9CkBAIC0xMTcsNiArMTIwLDcgQEAKICAgICAgICAgICAgICBib29sIHN1cHBvcnQpPjsKICAgICB2aXJ0dWFsIDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBpc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKICAgICAgICAgICAgIGlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsZWRDb3VudGVyW0lTX1NFVF9UT1JDSF9NT0RFX1NVUFBPUlRFRF0rKzsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgZmFsc2UpOwogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICB9CkBAIC0xMjQsNiArMTI4LDcgQEAKICAgICB1c2luZyBnZXRDYW1lcmFJZExpc3RfY2IgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoU3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+JiBjYW1lcmFEZXZpY2VOYW1lcyk+OwogICAgIHZpcnR1YWwgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBnZXRDYW1lcmFJZExpc3QoZ2V0Q2FtZXJhSWRMaXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsZWRDb3VudGVyW0dFVF9DQU1FUkFfSURfTElTVF0rKzsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgbURldmljZU5hbWVzKTsKICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiAgICAgfQpAQCAtMTQ4LDYgKzE1MywyNSBAQAogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxlZENvdW50ZXJbTk9USUZZX0RFVklDRV9TVEFURV0rKzsKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBlbnVtIE1ldGhvZE5hbWVzIHsKKyAgICAgICAgU0VUX0NBTExCQUNLLAorICAgICAgICBHRVRfVkVORE9SX1RBR1MsCisgICAgICAgIElTX1NFVF9UT1JDSF9NT0RFX1NVUFBPUlRFRCwKKyAgICAgICAgTk9USUZZX0RFVklDRV9TVEFURSwKKyAgICAgICAgR0VUX0NBTUVSQV9JRF9MSVNULAorCisgICAgICAgIE1FVEhPRF9OQU1FX0NPVU5UCisgICAgfTsKKyAgICBpbnQgbUNhbGxlZENvdW50ZXJbTUVUSE9EX05BTUVfQ09VTlRdIHswfTsKKworICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPiBtQ3VycmVudFN0YXRlID0gMHhGRkZGRkZGRjsgLy8gVW5saWtlbHkgdG8gYmUgYSByZWFsIHN0YXRlCiB9OwogCiAvKioKQEAgLTE2Myw3ICsxODcsNyBAQAogICAgICAgICBtVGVzdENhbWVyYVByb3ZpZGVyID0gcHJvdmlkZXI7CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXM7CiAKICAgICB2aXJ0dWFsIH5UZXN0SW50ZXJhY3Rpb25Qcm94eSgpIHt9CiAKQEAgLTE3Nyw3ICsyMDEsNyBAQAogCiAgICAgdmlydHVhbCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBnZXRTZXJ2aWNlKAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNlcnZpY2VOYW1lKSBvdmVycmlkZSB7Ci0gICAgICAgIG1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMucHVzaF9iYWNrKHNlcnZpY2VOYW1lKTsKICAgICAgICAgcmV0dXJuIG1UZXN0Q2FtZXJhUHJvdmlkZXI7CiAgICAgfQogCkBAIC0yMDksMTAgKzIzMywzNCBAQAogCiAgICAgcmVzID0gcHJvdmlkZXJNYW5hZ2VyLT5pbml0aWFsaXplKHN0YXR1c0xpc3RlbmVyLCAmc2VydmljZVByb3h5KTsKICAgICBBU1NFUlRfRVEocmVzLCBPSykgPDwgIlVuYWJsZSB0byBpbml0aWFsaXplIHByb3ZpZGVyIG1hbmFnZXIiOworICAgIC8vIENoZWNrIHRoYXQgYm90aCAibGVnYWN5IiBhbmQgImV4dGVybmFsIiBwcm92aWRlcnMgKHJlYWxseSB0aGUgc2FtZSBvYmplY3QpIGFyZSBjYWxsZWQKKyAgICAvLyBvbmNlIGZvciBhbGwgdGhlIGluaXQgbWV0aG9kcworICAgIEVYUEVDVF9FUShwcm92aWRlci0+bUNhbGxlZENvdW50ZXJbVGVzdElDYW1lcmFQcm92aWRlcjo6U0VUX0NBTExCQUNLXSwgMikgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIHNldENhbGxiYWNrIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpHRVRfVkVORE9SX1RBR1NdLCAyKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gZ2V0VmVuZG9yVGFncyBwZXIgcHJvdmlkZXIgZXhwZWN0ZWQgZHVyaW5nIGluaXQiOworICAgIEVYUEVDVF9FUShwcm92aWRlci0+bUNhbGxlZENvdW50ZXJbVGVzdElDYW1lcmFQcm92aWRlcjo6SVNfU0VUX1RPUkNIX01PREVfU1VQUE9SVEVEXSwgMikgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIGlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpHRVRfQ0FNRVJBX0lEX0xJU1RdLCAyKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gZ2V0Q2FtZXJhSWRMaXN0IHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpOT1RJRllfREVWSUNFX1NUQVRFXSwgMikgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIG5vdGlmeURldmljZVN0YXRlIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CiAKLSAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgbGVnYWN5SW5zdGFuY2VOYW1lID0gImxlZ2FjeS8wIjsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsIGxlZ2FjeUluc3RhbmNlTmFtZSkgPDwKKyAgICBzdGQ6OnN0cmluZyBsZWdhY3lJbnN0YW5jZU5hbWUgPSAibGVnYWN5LzAiOworICAgIHN0ZDo6c3RyaW5nIGV4dGVybmFsSW5zdGFuY2VOYW1lID0gImV4dGVybmFsLzAiOworICAgIGJvb2wgZ290TGVnYWN5ID0gZmFsc2U7CisgICAgYm9vbCBnb3RFeHRlcm5hbCA9IGZhbHNlOworICAgIEVYUEVDVF9FUSgydSwgc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzLnNpemUoKSkgPDwKKyAgICAgICAgICAgICJPbmx5IHR3byBzZXJ2aWNlIHF1ZXJpZXMgZXhwZWN0ZWQgdG8gYmUgc2VlbiBieSBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIiOworCisgICAgZm9yIChhdXRvJiBzZXJ2aWNlTmFtZSA6IHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcykgeworICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gbGVnYWN5SW5zdGFuY2VOYW1lKSBnb3RMZWdhY3kgPSB0cnVlOworICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gZXh0ZXJuYWxJbnN0YW5jZU5hbWUpIGdvdEV4dGVybmFsID0gdHJ1ZTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUoZ290TGVnYWN5KSA8PAogICAgICAgICAgICAgIkxlZ2FjeSBpbnN0YW5jZSBub3QgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKKyAgICBBU1NFUlRfVFJVRShnb3RFeHRlcm5hbCkgPDwKKyAgICAgICAgICAgICJFeHRlcm5hbCBpbnN0YW5jZSBub3QgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIAogICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUgPQogICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNDo6SUNhbWVyYVByb3ZpZGVyIjsKQEAgLTIyMSw3ICsyNjksNyBAQAogICAgICAgICAgICAgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lLAogICAgICAgICAgICAgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lLCBmYWxzZSk7CiAKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKKyAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzLmJhY2soKSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAogICAgICAgICAgICAgIkluY29ycmVjdCBpbnN0YW5jZSByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOwogfQogCkBAIC0yNTUsNyArMzAzLDcgQEAKICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQ6OklDYW1lcmFQcm92aWRlciI7CiAgICAgc2VydmljZVByb3h5Lm1NYW5hZ2VyTm90aWZpY2F0aW9uSW50ZXJmYWNlLT5vblJlZ2lzdHJhdGlvbigKICAgICAgICAgICAgIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lLCBmYWxzZSk7Ci0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CisgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIAogICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBzZWN0aW9uTmFtZVNlY29uZCA9ICJTZWNvbmRWZW5kb3JUZXN0U2VjdGlvbiI7CkBAIC0yNzMsNyArMzIxLDcgQEAKICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgdGVzdFByb3ZpZGVyU2Vjb25kSW5zdGFuY2VOYW1lID0gInRlc3QyLzAiOwogICAgIHNlcnZpY2VQcm94eS5tTWFuYWdlck5vdGlmaWNhdGlvbkludGVyZmFjZS0+b25SZWdpc3RyYXRpb24oCiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUsIHRlc3RQcm92aWRlclNlY29uZEluc3RhbmNlTmFtZSwgZmFsc2UpOwotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwKKyAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzLmJhY2soKSwKICAgICAgICAgICAgICAgdGVzdFByb3ZpZGVyU2Vjb25kSW5zdGFuY2VOYW1lKSA8PAogICAgICAgICAgICAgIkluY29ycmVjdCBpbnN0YW5jZSByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOwogCkBAIC0zNjYsMyArNDE0LDM1IEBACiAgICAgbWV0YWRhdGFDb3B5LmR1bXAoMSwgMik7CiAgICAgc2Vjb25kTWV0YWRhdGEuZHVtcCgxLCAyKTsKIH0KKworVEVTVChDYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LCBOb3RpZnlTdGF0ZUNoYW5nZVRlc3QpIHsKKyAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IGRldmljZU5hbWVzIHsKKyAgICAgICAgImRldmljZUAzLjIvdGVzdC8wIiwKKyAgICAgICAgImRldmljZUAxLjAvdGVzdC8wIiwKKyAgICAgICAgImRldmljZUAzLjIvdGVzdC8xIn07CisKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPiB2ZW5kb3JTZWN0aW9uOworICAgIHN0YXR1c190IHJlczsKKyAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IHByb3ZpZGVyTWFuYWdlciA9IG5ldyBDYW1lcmFQcm92aWRlck1hbmFnZXIoKTsKKyAgICBzcDxUZXN0U3RhdHVzTGlzdGVuZXI+IHN0YXR1c0xpc3RlbmVyID0gbmV3IFRlc3RTdGF0dXNMaXN0ZW5lcigpOworICAgIFRlc3RJbnRlcmFjdGlvblByb3h5IHNlcnZpY2VQcm94eTsKKyAgICBzcDxUZXN0SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciA9ICBuZXcgVGVzdElDYW1lcmFQcm92aWRlcihkZXZpY2VOYW1lcywKKyAgICAgICAgICAgIHZlbmRvclNlY3Rpb24pOworICAgIHNlcnZpY2VQcm94eS5zZXRQcm92aWRlcihwcm92aWRlcik7CisKKyAgICByZXMgPSBwcm92aWRlck1hbmFnZXItPmluaXRpYWxpemUoc3RhdHVzTGlzdGVuZXIsICZzZXJ2aWNlUHJveHkpOworICAgIEFTU0VSVF9FUShyZXMsIE9LKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgcHJvdmlkZXIgbWFuYWdlciI7CisKKyAgICBBU1NFUlRfRVEocHJvdmlkZXItPm1DdXJyZW50U3RhdGUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4+KERldmljZVN0YXRlOjpOT1JNQUwpKQorICAgICAgICAgICAgPDwgIkluaXRpYWwgZGV2aWNlIHN0YXRlIG5vdCBzZXQiOworCisgICAgcmVzID0gcHJvdmlkZXJNYW5hZ2VyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+PihEZXZpY2VTdGF0ZTo6Rk9MREVEKSk7CisKKyAgICBBU1NFUlRfRVEocmVzLCBPSykgPDwgIlVuYWJsZSB0byBjYWxsIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlIjsKKyAgICBBU1NFUlRfRVEocHJvdmlkZXItPm1DdXJyZW50U3RhdGUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4+KERldmljZVN0YXRlOjpGT0xERUQpKQorICAgICAgICAgICAgPDwgIlVuYWJsZSB0byBjaGFuZ2UgZGV2aWNlIHN0YXRlIjsKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGVwdGhQcm9jZXNzb3JUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0RlcHRoUHJvY2Vzc29yVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2MjUxNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0RlcHRoUHJvY2Vzc29yVGVzdC5jcHAKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEZXB0aFByb2Nlc3NvclRlc3QiCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxyYW5kb20+CisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICIuLi9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgIi4uL3V0aWxzL0V4aWZVdGlscy5oIgorI2luY2x1ZGUgIk5WMTJDb21wcmVzc29yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RCdWZmZXJXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RCdWZmZXJIZWlnaHQgPSA0ODA7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0QnVmZmVyTlYxMlNpemUgKCgoKGtUZXN0QnVmZmVyV2lkdGgpICogKGtUZXN0QnVmZmVySGVpZ2h0KSkgKiAzKSAvIDIpOworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZSAoa1Rlc3RCdWZmZXJXaWR0aCAqIGtUZXN0QnVmZmVySGVpZ2h0KTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1NlZWQgPSAxMjM0OworCit2b2lkIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KHZvaWQgKipsaWJIYW5kbGUgLypvdXQqLywKKyAgICAgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSAqcHJvY2Vzc0ZyYW1lRnVuYyAvKm91dCovKSB7CisgICAgQVNTRVJUX05FKGxpYkhhbmRsZSwgbnVsbHB0cik7CisgICAgQVNTRVJUX05FKHByb2Nlc3NGcmFtZUZ1bmMsIG51bGxwdHIpOworCisgICAgKmxpYkhhbmRsZSA9IGRsb3BlbihrRGVwdGhQaG90b0xpYnJhcnksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CisgICAgaWYgKCpsaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAqcHJvY2Vzc0ZyYW1lRnVuYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhMzo6cHJvY2Vzc19kZXB0aF9waG90b19mcmFtZT4gKAorICAgICAgICAgICAgICAgIGRsc3ltKCpsaWJIYW5kbGUsIGtEZXB0aFBob3RvUHJvY2Vzc0Z1bmN0aW9uKSk7CisgICAgICAgIEFTU0VSVF9ORSgqcHJvY2Vzc0ZyYW1lRnVuYywgbnVsbHB0cik7CisgICAgfQorfQorCit2b2lkIGdlbmVyYXRlQ29sb3JKcGVnQnVmZmVyKGludCBqcGVnUXVhbGl0eSwgRXhpZk9yaWVudGF0aW9uIG9yaWVudGF0aW9uVmFsdWUsIGJvb2wgaW5jbHVkZUV4aWYsCisgICAgICAgIGJvb2wgc3dpdGNoRGltZW5zaW9ucywgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmNvbG9ySnBlZ0J1ZmZlciAvKm91dCovKSB7CisgICAgQVNTRVJUX05FKGNvbG9ySnBlZ0J1ZmZlciwgbnVsbHB0cik7CisKKyAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIGtUZXN0QnVmZmVyTlYxMlNpemU+IGNvbG9yU291cmNlQnVmZmVyOworICAgIHN0ZDo6ZGVmYXVsdF9yYW5kb21fZW5naW5lIGdlbihrU2VlZCk7CisgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiB1bmlEaXN0KDAsIFVJTlQ4X01BWCAtIDEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29sb3JTb3VyY2VCdWZmZXIuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29sb3JTb3VyY2VCdWZmZXJbaV0gPSB1bmlEaXN0KGdlbik7CisgICAgfQorCisgICAgc2l6ZV90IHdpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBzaXplX3QgaGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgaWYgKHN3aXRjaERpbWVuc2lvbnMpIHsKKyAgICAgICAgd2lkdGggPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgaGVpZ2h0ID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICB9CisKKyAgICBOVjEyQ29tcHJlc3NvciBqcGVnQ29tcHJlc3NvcjsKKyAgICBpZiAoaW5jbHVkZUV4aWYpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoanBlZ0NvbXByZXNzb3IuY29tcHJlc3NXaXRoRXhpZk9yaWVudGF0aW9uKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+IChjb2xvclNvdXJjZUJ1ZmZlci5kYXRhKCkpLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGpwZWdRdWFsaXR5LCBvcmllbnRhdGlvblZhbHVlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoanBlZ0NvbXByZXNzb3IuY29tcHJlc3MoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4gKGNvbG9yU291cmNlQnVmZmVyLmRhdGEoKSksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAganBlZ1F1YWxpdHkpKTsKKyAgICB9CisKKyAgICAqY29sb3JKcGVnQnVmZmVyID0gc3RkOjptb3ZlKGpwZWdDb21wcmVzc29yLmdldENvbXByZXNzZWREYXRhKCkpOworICAgIEFTU0VSVF9GQUxTRShjb2xvckpwZWdCdWZmZXItPmVtcHR5KCkpOworfQorCit2b2lkIGdlbmVyYXRlRGVwdGgxNkJ1ZmZlcihzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gKmRlcHRoMTZCdWZmZXIgLypvdXQqLykgeworICAgIEFTU0VSVF9ORShkZXB0aDE2QnVmZmVyLCBudWxscHRyKTsKKyAgICBzdGQ6OmRlZmF1bHRfcmFuZG9tX2VuZ2luZSBnZW4oa1NlZWQrMSk7CisgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiB1bmlEaXN0KDAsIFVJTlQxNl9NQVggLSAxKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlcHRoMTZCdWZmZXItPnNpemUoKTsgaSsrKSB7CisgICAgICAgICgqZGVwdGgxNkJ1ZmZlcilbaV0gPSB1bmlEaXN0KGdlbik7CisgICAgfQorfQorCitURVNUKERlcHRoUHJvY2Vzc29yVGVzdCwgTGlua1RvTGlicmF5KSB7CisgICAgdm9pZCAqbGliSGFuZGxlOworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgcHJvY2Vzc0Z1bmM7CisgICAgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkoJmxpYkhhbmRsZSwgJnByb2Nlc3NGdW5jKTsKKyAgICBpZiAobGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgZGxjbG9zZShsaWJIYW5kbGUpOworICAgIH0KK30KKworVEVTVChEZXB0aFByb2Nlc3NvclRlc3QsIEJhZElucHV0KSB7CisgICAgdm9pZCAqbGliSGFuZGxlOworICAgIGludCBqcGVnUXVhbGl0eSA9IDk1OworCisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBwcm9jZXNzRnVuYzsKKyAgICBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSgmbGliSGFuZGxlLCAmcHJvY2Vzc0Z1bmMpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBEZXB0aCBsaWJyYXJ5IG5vIHByZXNlbnQsIG5vdGhpbmcgbW9yZSB0byB0ZXN0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZTsKKyAgICAvLyBXb3JzdCBjYXNlIGJvdGggZGVwdGggYW5kIGNvbmZpZGVuY2UgbWFwcyBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIG1haW4gY29sb3IgaW1hZ2UuCisgICAgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgKiAzOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29sb3JKcGVnQnVmZmVyOworICAgIGdlbmVyYXRlQ29sb3JKcGVnQnVmZmVyKGpwZWdRdWFsaXR5LCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRCwKKyAgICAgICAgICAgIC8qaW5jbHVkZUV4aWYqLyBmYWxzZSwgLypzd2l0Y2hEaW1lbnNpb25zKi8gZmFsc2UsICZjb2xvckpwZWdCdWZmZXIpOworCisgICAgc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+IGRlcHRoMTZCdWZmZXI7CisgICAgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKCZkZXB0aDE2QnVmZmVyKTsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlcHRoUGhvdG9CdWZmZXIoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgIHNpemVfdCBhY3R1YWxEZXB0aFBob3RvU2l6ZSA9IDA7CisKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgQVNTRVJUX05FKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKworICAgIGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCkpOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSA9IGNvbG9ySnBlZ0J1ZmZlci5zaXplKCk7CisgICAgQVNTRVJUX05FKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKworICAgIGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyID0gZGVwdGgxNkJ1ZmZlci5kYXRhKCk7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgIEFTU0VSVF9ORShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKworICAgIEFTU0VSVF9ORShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksIG51bGxwdHIpLAorICAgICAgICAgICAgMCk7CisKKyAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Cit9CisKK1RFU1QoRGVwdGhQcm9jZXNzb3JUZXN0LCBCYXNpY0RlcHRoUGhvdG9WYWxpZGF0aW9uKSB7CisgICAgdm9pZCAqbGliSGFuZGxlOworICAgIGludCBqcGVnUXVhbGl0eSA9IDk1OworCisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBwcm9jZXNzRnVuYzsKKyAgICBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSgmbGliSGFuZGxlLCAmcHJvY2Vzc0Z1bmMpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBEZXB0aCBsaWJyYXJ5IG5vIHByZXNlbnQsIG5vdGhpbmcgbW9yZSB0byB0ZXN0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29sb3JKcGVnQnVmZmVyOworICAgIGdlbmVyYXRlQ29sb3JKcGVnQnVmZmVyKGpwZWdRdWFsaXR5LCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRCwKKyAgICAgICAgICAgIC8qaW5jbHVkZUV4aWYqLyBmYWxzZSwgLypzd2l0Y2hEaW1lbnNpb25zKi8gZmFsc2UsICZjb2xvckpwZWdCdWZmZXIpOworCisgICAgc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+IGRlcHRoMTZCdWZmZXI7CisgICAgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKCZkZXB0aDE2QnVmZmVyKTsKKworICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWU7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoY29sb3JKcGVnQnVmZmVyLmRhdGEoKSk7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplID0gY29sb3JKcGVnQnVmZmVyLnNpemUoKTsKKyAgICAvLyBXb3JzdCBjYXNlIGJvdGggZGVwdGggYW5kIGNvbmZpZGVuY2UgbWFwcyBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIG1haW4gY29sb3IgaW1hZ2UuCisgICAgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgKiAzOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHkgPSBqcGVnUXVhbGl0eTsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlciA9IGRlcHRoMTZCdWZmZXIuZGF0YSgpOworICAgIGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlcHRoUGhvdG9CdWZmZXIoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgIHNpemVfdCBhY3R1YWxEZXB0aFBob3RvU2l6ZSA9IDA7CisgICAgQVNTRVJUX0VRKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKyAgICBBU1NFUlRfVFJVRSgoYWN0dWFsRGVwdGhQaG90b1NpemUgPiAwKSAmJiAoZGVwdGhQaG90b0J1ZmZlci5zaXplKCkgPj0gYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKworICAgIC8vIFRoZSBmaW5hbCBkZXB0aCBwaG90byBtdXN0IGNvbnNpc3Qgb2YgdGhyZWUganBlZyBpbWFnZXM6CisgICAgLy8gIC0gdGhlIG1haW4gY29sb3IgaW1hZ2UKKyAgICAvLyAgLSB0aGUgZGVwdGggbWFwIGltYWdlCisgICAgLy8gIC0gdGhlIGNvbmZpZGVuY2UgbWFwIGltYWdlCisgICAgc2l6ZV90IG1haW5KcGVnU2l6ZSA9IDA7CisgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksIGFjdHVhbERlcHRoUGhvdG9TaXplLAorICAgICAgICAgICAgICAgICZtYWluSnBlZ1NpemUpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUoKG1haW5KcGVnU2l6ZSA+IDApICYmIChtYWluSnBlZ1NpemUgPCBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworICAgIHNpemVfdCBkZXB0aE1hcFNpemUgPSAwOworICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplLCAmZGVwdGhNYXBTaXplKSwgT0spOworICAgIEFTU0VSVF9UUlVFKChkZXB0aE1hcFNpemUgPiAwKSAmJiAoZGVwdGhNYXBTaXplIDwgKGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplKSkpOworCisgICAgZGxjbG9zZShsaWJIYW5kbGUpOworfQorCitURVNUKERlcHRoUHJvY2Vzc29yVGVzdCwgVGVzdERlcHRoUGhvdG9FeGlmT3JpZW50YXRpb24pIHsKKyAgICB2b2lkICpsaWJIYW5kbGU7CisgICAgaW50IGpwZWdRdWFsaXR5ID0gOTU7CisKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIHByb2Nlc3NGdW5jOworICAgIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KCZsaWJIYW5kbGUsICZwcm9jZXNzRnVuYyk7CisgICAgaWYgKGxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIERlcHRoIGxpYnJhcnkgbm8gcHJlc2VudCwgbm90aGluZyBtb3JlIHRvIHRlc3QuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBFeGlmT3JpZW50YXRpb24gZXhpZk9yaWVudGF0aW9uc1tdID0geyBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRCwKKyAgICAgICAgICAgIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTLCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzkwX0RFR1JFRVMsCisgICAgICAgICAgICBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzE4MF9ERUdSRUVTLCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTIH07CisgICAgZm9yIChhdXRvIGV4aWZPcmllbnRhdGlvbiA6IGV4aWZPcmllbnRhdGlvbnMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29sb3JKcGVnQnVmZmVyOworICAgICAgICBnZW5lcmF0ZUNvbG9ySnBlZ0J1ZmZlcihqcGVnUXVhbGl0eSwgZXhpZk9yaWVudGF0aW9uLCAvKmluY2x1ZGVFeGlmKi8gdHJ1ZSwKKyAgICAgICAgICAgICAgICAvKnN3aXRjaERpbWVuc2lvbnMqLyBmYWxzZSwgJmNvbG9ySnBlZ0J1ZmZlcik7CisgICAgICAgIGlmIChleGlmT3JpZW50YXRpb24gIT0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIGF1dG8ganBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oY29sb3JKcGVnQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgY29sb3JKcGVnQnVmZmVyLnNpemUoKSwgJmpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXhpZk9yaWVudGF0aW9uLCBqcGVnRXhpZk9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiBkZXB0aDE2QnVmZmVyOworICAgICAgICBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoJmRlcHRoMTZCdWZmZXIpOworCisgICAgICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWU7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCkpOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgPSBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpOworICAgICAgICAvLyBXb3JzdCBjYXNlIGJvdGggZGVwdGggYW5kIGNvbmZpZGVuY2UgbWFwcyBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIG1haW4gY29sb3IgaW1hZ2UuCisgICAgICAgIGlucHV0RnJhbWUubU1heEpwZWdTaXplID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplICogMzsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyID0gZGVwdGgxNkJ1ZmZlci5kYXRhKCk7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVwdGhQaG90b0J1ZmZlcihpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgICAgIHNpemVfdCBhY3R1YWxEZXB0aFBob3RvU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisgICAgICAgIEFTU0VSVF9UUlVFKChhY3R1YWxEZXB0aFBob3RvU2l6ZSA+IDApICYmCisgICAgICAgICAgICAgICAgKGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpID49IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisKKyAgICAgICAgc2l6ZV90IG1haW5KcGVnU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLCBhY3R1YWxEZXB0aFBob3RvU2l6ZSwKKyAgICAgICAgICAgICAgICAmbWFpbkpwZWdTaXplKSwgT0spOworICAgICAgICBBU1NFUlRfVFJVRSgobWFpbkpwZWdTaXplID4gMCkgJiYgKG1haW5KcGVnU2l6ZSA8IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisgICAgICAgIHNpemVfdCBkZXB0aE1hcFNpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSwgJmRlcHRoTWFwU2l6ZSksIE9LKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKGRlcHRoTWFwU2l6ZSA+IDApICYmIChkZXB0aE1hcFNpemUgPCAoYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUpKSk7CisgICAgICAgIHNpemVfdCBjb25maWRlbmNlTWFwU2l6ZSA9IGFjdHVhbERlcHRoUGhvdG9TaXplIC0gKG1haW5KcGVnU2l6ZSArIGRlcHRoTWFwU2l6ZSk7CisKKyAgICAgICAgLy9EZXB0aCBhbmQgY29uZmlkZW5jZSBpbWFnZXMgbXVzdCBoYXZlIHRoZSBzYW1lIEVYSUYgb3JpZW50YXRpb24gYXMgdGhlIHNvdXJjZQorICAgICAgICBhdXRvIGRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbihkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBkZXB0aE1hcFNpemUsICZkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgIGlmIChleGlmT3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fVU5ERUZJTkVEKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIHVuZGVmaW5lZCBvciBtaXNzaW5nIEVYSUYgb3JpZW50YXRpb24sIGFsd2F5cyBleHBlY3QgMCBkZWdyZWVzIGluIHRoZQorICAgICAgICAgICAgLy8gZGVwdGggbWFwLgorICAgICAgICAgICAgQVNTRVJUX0VRKGRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiwgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX0VRKGRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiwgZXhpZk9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oCisgICAgICAgICAgICAgICAgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUgKyBkZXB0aE1hcFNpemUsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZU1hcFNpemUsICZjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgaWYgKGV4aWZPcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgdW5kZWZpbmVkIG9yIG1pc3NpbmcgRVhJRiBvcmllbnRhdGlvbiwgYWx3YXlzIGV4cGVjdCAwIGRlZ3JlZXMgaW4gdGhlCisgICAgICAgICAgICAvLyBjb25maWRlbmNlIG1hcC4KKyAgICAgICAgICAgIEFTU0VSVF9FUShjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiwgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uLCBleGlmT3JpZW50YXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgZGxjbG9zZShsaWJIYW5kbGUpOworfQorCitURVNUKERlcHRoUHJvY2Vzc29yVGVzdCwgVGVzdERlcGh0UGhvdG9QaHlzaWNhbFJvdGF0aW9uKSB7CisgICAgdm9pZCAqbGliSGFuZGxlOworICAgIGludCBqcGVnUXVhbGl0eSA9IDk1OworCisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBwcm9jZXNzRnVuYzsKKyAgICBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSgmbGliSGFuZGxlLCAmcHJvY2Vzc0Z1bmMpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBEZXB0aCBsaWJyYXJ5IG5vIHByZXNlbnQsIG5vdGhpbmcgbW9yZSB0byB0ZXN0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW4gY2FzZSBvZiBwaHlzaWNhbCByb3RhdGlvbiwgdGhlIEVYSUYgb3JpZW50YXRpb24gbXVzdCBhbHdheXMgYmUgMC4KKyAgICBhdXRvIGV4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOworICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbiBkZXB0aE9yaWVudGF0aW9uc1tdID0geworICAgICAgICAgICAgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8wX0RFR1JFRVMsCisgICAgICAgICAgICBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzkwX0RFR1JFRVMsCisgICAgICAgICAgICBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzE4MF9ERUdSRUVTLAorICAgICAgICAgICAgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8yNzBfREVHUkVFUyB9OworICAgIGZvciAoYXV0byBkZXB0aE9yaWVudGF0aW9uIDogZGVwdGhPcmllbnRhdGlvbnMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29sb3JKcGVnQnVmZmVyOworICAgICAgICBib29sIHN3aXRjaERpbWVuc2lvbnMgPSBmYWxzZTsKKyAgICAgICAgc2l6ZV90IGV4cGVjdGVkV2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICBzaXplX3QgZXhwZWN0ZWRIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgaWYgKChkZXB0aE9yaWVudGF0aW9uID09IERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fOTBfREVHUkVFUykgfHwKKyAgICAgICAgICAgICAgICAoZGVwdGhPcmllbnRhdGlvbiA9PSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzI3MF9ERUdSRUVTKSkgeworICAgICAgICAgICAgc3dpdGNoRGltZW5zaW9ucyA9IHRydWU7CisgICAgICAgICAgICBleHBlY3RlZFdpZHRoID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgICAgICBleHBlY3RlZEhlaWdodCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdGVDb2xvckpwZWdCdWZmZXIoanBlZ1F1YWxpdHksIGV4aWZPcmllbnRhdGlvbiwgLyppbmNsdWRlRXhpZiovIHRydWUsCisgICAgICAgICAgICAgICAgc3dpdGNoRGltZW5zaW9ucywgJmNvbG9ySnBlZ0J1ZmZlcik7CisgICAgICAgIGF1dG8ganBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbihjb2xvckpwZWdCdWZmZXIuZGF0YSgpLCBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpLAorICAgICAgICAgICAgICAgICZqcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICBBU1NFUlRfRVEoZXhpZk9yaWVudGF0aW9uLCBqcGVnRXhpZk9yaWVudGF0aW9uKTsKKworICAgICAgICBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gZGVwdGgxNkJ1ZmZlcjsKKyAgICAgICAgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKCZkZXB0aDE2QnVmZmVyKTsKKworICAgICAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+IChjb2xvckpwZWdCdWZmZXIuZGF0YSgpKTsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplID0gY29sb3JKcGVnQnVmZmVyLnNpemUoKTsKKyAgICAgICAgLy8gV29yc3QgY2FzZSBib3RoIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBtYWluIGNvbG9yIGltYWdlLgorICAgICAgICBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSA9IGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSAqIDM7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSA9IGpwZWdRdWFsaXR5OworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlciA9IGRlcHRoMTZCdWZmZXIuZGF0YSgpOworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICBpbnB1dEZyYW1lLm1PcmllbnRhdGlvbiA9IGRlcHRoT3JpZW50YXRpb247CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVwdGhQaG90b0J1ZmZlcihpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgICAgIHNpemVfdCBhY3R1YWxEZXB0aFBob3RvU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisgICAgICAgIEFTU0VSVF9UUlVFKChhY3R1YWxEZXB0aFBob3RvU2l6ZSA+IDApICYmCisgICAgICAgICAgICAgICAgKGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpID49IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisKKyAgICAgICAgc2l6ZV90IG1haW5KcGVnU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLCBhY3R1YWxEZXB0aFBob3RvU2l6ZSwKKyAgICAgICAgICAgICAgICAmbWFpbkpwZWdTaXplKSwgT0spOworICAgICAgICBBU1NFUlRfVFJVRSgobWFpbkpwZWdTaXplID4gMCkgJiYgKG1haW5KcGVnU2l6ZSA8IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisgICAgICAgIHNpemVfdCBkZXB0aE1hcFNpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSwgJmRlcHRoTWFwU2l6ZSksIE9LKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKGRlcHRoTWFwU2l6ZSA+IDApICYmIChkZXB0aE1hcFNpemUgPCAoYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUpKSk7CisgICAgICAgIHNpemVfdCBjb25maWRlbmNlTWFwU2l6ZSA9IGFjdHVhbERlcHRoUGhvdG9TaXplIC0gKG1haW5KcGVnU2l6ZSArIGRlcHRoTWFwU2l6ZSk7CisKKyAgICAgICAgLy9EZXB0aCBhbmQgY29uZmlkZW5jZSBpbWFnZXMgbXVzdCBoYXZlIHRoZSBzYW1lIEVYSUYgb3JpZW50YXRpb24gYXMgdGhlIHNvdXJjZQorICAgICAgICBhdXRvIGRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbihkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBkZXB0aE1hcFNpemUsICZkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgIEFTU0VSVF9FUShkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24sIGV4aWZPcmllbnRhdGlvbik7CisgICAgICAgIHNpemVfdCBkZXB0aE1hcFdpZHRoLCBkZXB0aE1hcEhlaWdodDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRKcGVnSW1hZ2VEaW1lbnNpb25zKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGRlcHRoTWFwU2l6ZSwgJmRlcHRoTWFwV2lkdGgsICZkZXB0aE1hcEhlaWdodCksIE9LKTsKKyAgICAgICAgQVNTRVJUX0VRKGRlcHRoTWFwV2lkdGgsIGV4cGVjdGVkV2lkdGgpOworICAgICAgICBBU1NFUlRfRVEoZGVwdGhNYXBIZWlnaHQsIGV4cGVjdGVkSGVpZ2h0KTsKKworICAgICAgICBhdXRvIGNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKAorICAgICAgICAgICAgICAgIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplICsgZGVwdGhNYXBTaXplLCBjb25maWRlbmNlTWFwU2l6ZSwKKyAgICAgICAgICAgICAgICAmY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiwgZXhpZk9yaWVudGF0aW9uKTsKKyAgICAgICAgc2l6ZV90IGNvbmZpZGVuY2VNYXBXaWR0aCwgY29uZmlkZW5jZU1hcEhlaWdodDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRKcGVnSW1hZ2VEaW1lbnNpb25zKAorICAgICAgICAgICAgICAgIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplICsgZGVwdGhNYXBTaXplLCBjb25maWRlbmNlTWFwU2l6ZSwKKyAgICAgICAgICAgICAgICAmY29uZmlkZW5jZU1hcFdpZHRoLCAmY29uZmlkZW5jZU1hcEhlaWdodCksIE9LKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2VNYXBXaWR0aCwgZXhwZWN0ZWRXaWR0aCk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWRlbmNlTWFwSGVpZ2h0LCBleHBlY3RlZEhlaWdodCk7CisgICAgfQorCisgICAgZGxjbG9zZShsaWJIYW5kbGUpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwCmluZGV4IDJhNjg5YzYuLjU0OTM1YzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKQEAgLTE2Nyw2ICsxNjcsMzAgQEAKICAgICB9CiB9CiAKK1RFU1QoRGlzdG9ydGlvbk1hcHBlclRlc3QsIENsYW1wQ29uc2lzdGVuY3kpIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBzdGQ6OmFycmF5PGludDMyX3QsIDQ+IGFjdGl2ZUFycmF5ID0gezAsIDAsIDQwMzIsIDMwMjR9OworICAgIERpc3RvcnRpb25NYXBwZXIgbTsKKyAgICBzZXR1cFRlc3RNYXBwZXIoJm0sIGlkZW50aXR5RGlzdG9ydGlvbiwgdGVzdElDYWwsIC8qYWN0aXZlQXJyYXkqLyBhY3RpdmVBcnJheS5kYXRhKCksCisgICAgICAgICAgICAvKnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheSovIGFjdGl2ZUFycmF5LmRhdGEoKSk7CisKKyAgICBhdXRvIHJlY3RzT3JpZyA9IGFjdGl2ZUFycmF5OworICAgIHJlcyA9IG0ubWFwQ29ycmVjdGVkUmVjdFRvUmF3KGFjdGl2ZUFycmF5LmRhdGEoKSwgMSwgLypjbGFtcCovdHJ1ZSwgLypzaW1wbGUqLyB0cnVlKTsKKyAgICBBU1NFUlRfRVEocmVzLCBPSyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUFycmF5LnNpemUoKTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShhY3RpdmVBcnJheVtpXSwgcmVjdHNPcmlnW2ldKTsKKyAgICB9CisKKyAgICByZXMgPSBtLm1hcFJhd1JlY3RUb0NvcnJlY3RlZChhY3RpdmVBcnJheS5kYXRhKCksIDEsIC8qY2xhbXAqL3RydWUsIC8qc2ltcGxlKi8gdHJ1ZSk7CisgICAgQVNTRVJUX0VRKHJlcywgT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVBcnJheS5zaXplKCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoYWN0aXZlQXJyYXlbaV0sIHJlY3RzT3JpZ1tpXSk7CisgICAgfQorfQorCiBURVNUKERpc3RvcnRpb25NYXBwZXJUZXN0LCBTaW1wbGVUcmFuc2Zvcm0pIHsKICAgICBzdGF0dXNfdCByZXM7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQxYTFmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuY3BwCkBAIC0wLDAgKzEsMzc5IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUZXN0X05WMTJDb21wcmVzc29yIgorCisjaW5jbHVkZSAiTlYxMkNvbXByZXNzb3IuaCIKKworI2luY2x1ZGUgPGxpYmV4aWYvZXhpZi1kYXRhLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOworCituYW1lc3BhY2Ugc3RkIHsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZGVmYXVsdF9kZWxldGU8RXhpZkVudHJ5PiB7CisgICAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShFeGlmRW50cnkqIGVudHJ5KSBjb25zdCB7IGV4aWZfZW50cnlfdW5yZWYoZW50cnkpOyB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGRlZmF1bHRfZGVsZXRlPEV4aWZEYXRhPiB7CisgICAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShFeGlmRGF0YSogZGF0YSkgY29uc3QgeyBleGlmX2RhdGFfdW5yZWYoZGF0YSk7IH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworYm9vbCBOVjEyQ29tcHJlc3Nvcjo6Y29tcHJlc3MoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSkgeworICAgIGlmICghY29uZmlndXJlQ29tcHJlc3Nvcih3aWR0aCwgaGVpZ2h0LCBxdWFsaXR5KSkgeworICAgICAgICAvLyB0aGUgbWV0aG9kIHdpbGwgaGF2ZSBsb2dnZWQgYSBtb3JlIGRldGFpbGVkIGVycm9yIG1lc3NhZ2UgdGhhbiB3ZSBjYW4KKyAgICAgICAgLy8gcHJvdmlkZSBoZXJlIHNvIGp1c3QgcmV0dXJuLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGNvbXByZXNzRGF0YShkYXRhLCAvKmV4aWZEYXRhKi8gbnVsbHB0cik7Cit9CisKK2Jvb2wgTlYxMkNvbXByZXNzb3I6OmNvbXByZXNzV2l0aEV4aWZPcmllbnRhdGlvbihjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgIGludCBxdWFsaXR5LCBhbmRyb2lkOjpjYW1lcmEzOjpFeGlmT3JpZW50YXRpb24gZXhpZlZhbHVlKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZEYXRhPiBleGlmRGF0YShleGlmX2RhdGFfbmV3KCkpOworICAgIGlmIChleGlmRGF0YS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBleGlmX2RhdGFfc2V0X29wdGlvbihleGlmRGF0YS5nZXQoKSwgRVhJRl9EQVRBX09QVElPTl9GT0xMT1dfU1BFQ0lGSUNBVElPTik7CisgICAgZXhpZl9kYXRhX3NldF9kYXRhX3R5cGUoZXhpZkRhdGEuZ2V0KCksIEVYSUZfREFUQV9UWVBFX0NPTVBSRVNTRUQpOworICAgIGV4aWZfZGF0YV9zZXRfYnl0ZV9vcmRlcihleGlmRGF0YS5nZXQoKSwgRVhJRl9CWVRFX09SREVSX0lOVEVMKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBleGlmRW50cnkoZXhpZl9lbnRyeV9uZXcoKSk7CisgICAgaWYgKGV4aWZFbnRyeS5nZXQoKSA9PSAgbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZXhpZkVudHJ5LT50YWcgPSBFWElGX1RBR19PUklFTlRBVElPTjsKKyAgICBleGlmX2NvbnRlbnRfYWRkX2VudHJ5KGV4aWZEYXRhLT5pZmRbRVhJRl9JRkRfMF0sIGV4aWZFbnRyeS5nZXQoKSk7CisgICAgZXhpZl9lbnRyeV9pbml0aWFsaXplKGV4aWZFbnRyeS5nZXQoKSwgZXhpZkVudHJ5LT50YWcpOworICAgIGV4aWZfc2V0X3Nob3J0KGV4aWZFbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCBleGlmVmFsdWUpOworCisgICAgaWYgKCFjb25maWd1cmVDb21wcmVzc29yKHdpZHRoLCBoZWlnaHQsIHF1YWxpdHkpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gY29tcHJlc3NEYXRhKGRhdGEsIGV4aWZEYXRhLmdldCgpKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIE5WMTJDb21wcmVzc29yOjpnZXRDb21wcmVzc2VkRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbURlc3RNYW5hZ2VyLm1CdWZmZXI7Cit9CisKK2Jvb2wgTlYxMkNvbXByZXNzb3I6OmNvbmZpZ3VyZUNvbXByZXNzb3IoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSkgeworICAgIG1Db21wcmVzc0luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJm1FcnJvck1hbmFnZXIpOworICAgIC8vIE5PVEUhIERBTkdFUiEgRG8gbm90IGNvbnN0cnVjdCBhbnkgbm9uLXRyaXZpYWwgb2JqZWN0cyBiZWxvdyBzZXRqbXAhCisgICAgLy8gVGhlIGNvbXBpbGVyIHdpbGwgbm90IGdlbmVyYXRlIGNvZGUgdG8gZGVzdHJveSB0aGVtIGR1cmluZyB0aGUgcmV0dXJuCisgICAgLy8gYmVsb3cgc28gdGhleSB3aWxsIGxlYWsuIEFkZGl0aW9uYWxseSwgZG8gbm90IHBsYWNlIGFueSBjYWxscyB0byBsaWJqcGVnCisgICAgLy8gdGhhdCBjYW4gZmFpbCBhYm92ZSB0aGlzIGxpbmUgb3IgYW55IGVycm9yIHdpbGwgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgIGlmIChzZXRqbXAobUVycm9yTWFuYWdlci5tSnVtcEJ1ZmZlcikpIHsKKyAgICAgICAgLy8gVGhpcyBpcyB3aGVyZSB0aGUgZXJyb3IgaGFuZGxlciB3aWxsIGp1bXAgaW4gY2FzZSBzZXR1cCBmYWlscworICAgICAgICAvLyBUaGUgZXJyb3IgbWFuYWdlciB3aWxsIEFMT0cgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAganBlZ19jcmVhdGVfY29tcHJlc3MoJm1Db21wcmVzc0luZm8pOworCisgICAgbUNvbXByZXNzSW5mby5pbWFnZV93aWR0aCA9IHdpZHRoOworICAgIG1Db21wcmVzc0luZm8uaW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OworICAgIG1Db21wcmVzc0luZm8uaW5wdXRfY29tcG9uZW50cyA9IDM7CisgICAgbUNvbXByZXNzSW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsKKyAgICBqcGVnX3NldF9kZWZhdWx0cygmbUNvbXByZXNzSW5mbyk7CisKKyAgICBqcGVnX3NldF9xdWFsaXR5KCZtQ29tcHJlc3NJbmZvLCBxdWFsaXR5LCBUUlVFKTsKKyAgICAvLyBJdCBtYXkgc2VlbSB3ZWlyZCB0byBzZXQgY29sb3Igc3BhY2UgaGVyZSBhZ2FpbiBidXQgdGhpcyB3aWxsIGFsc28gc2V0CisgICAgLy8gb3RoZXIgZmllbGRzLiBUaGVzZSBmaWVsZHMgbWlnaHQgYmUgb3ZlcndyaXR0ZW4gYnkganBlZ19zZXRfZGVmYXVsdHMKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKCZtQ29tcHJlc3NJbmZvLCBKQ1NfWUNiQ3IpOworICAgIG1Db21wcmVzc0luZm8ucmF3X2RhdGFfaW4gPSBUUlVFOworICAgIG1Db21wcmVzc0luZm8uZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7CisgICAgLy8gU2V0IHNhbXBsaW5nIGZhY3RvcnMKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yID0gMjsKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMjsKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yID0gMTsKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBtQ29tcHJlc3NJbmZvLmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yID0gMTsKKworICAgIG1Db21wcmVzc0luZm8uZGVzdCA9ICZtRGVzdE1hbmFnZXI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZGVpbnRlcmxlYXZlKGNvbnN0IHVpbnQ4X3QqIHZ1UGxhbmFyLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdVJvd3MsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2Um93cywgaW50IHJvd0luZGV4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIHsKKyAgICBpbnQgbnVtUm93cyA9IChoZWlnaHQgLSByb3dJbmRleCkgLyAyOworICAgIGlmIChudW1Sb3dzID4gOCkgbnVtUm93cyA9IDg7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnVtUm93czsgKytyb3cpIHsKKyAgICAgICAgaW50IG9mZnNldCA9ICgocm93SW5kZXggPj4gMSkgKyByb3cpICogc3RyaWRlOworICAgICAgICBjb25zdCB1aW50OF90KiB2dSA9IHZ1UGxhbmFyICsgb2Zmc2V0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICh3aWR0aCA+PiAxKTsgKytpKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSByb3cgKiAod2lkdGggPj4gMSkgKyBpOworICAgICAgICAgICAgdVJvd3NbaW5kZXhdID0gdnVbMV07CisgICAgICAgICAgICB2Um93c1tpbmRleF0gPSB2dVswXTsKKyAgICAgICAgICAgIHZ1ICs9IDI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgTlYxMkNvbXByZXNzb3I6OmNvbXByZXNzRGF0YShjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBFeGlmRGF0YSogZXhpZkRhdGEpIHsKKyAgICBjb25zdCB1aW50OF90KiB5WzE2XTsKKyAgICBjb25zdCB1aW50OF90KiBjYls4XTsKKyAgICBjb25zdCB1aW50OF90KiBjcls4XTsKKyAgICBjb25zdCB1aW50OF90KiogcGxhbmVzWzNdID0geyB5LCBjYiwgY3IgfTsKKworICAgIGludCBpLCBvZmZzZXQ7CisgICAgaW50IHdpZHRoID0gbUNvbXByZXNzSW5mby5pbWFnZV93aWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gbUNvbXByZXNzSW5mby5pbWFnZV9oZWlnaHQ7CisgICAgY29uc3QgdWludDhfdCogeVBsYW5hciA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCogdnVQbGFuYXIgPSBkYXRhICsgKHdpZHRoICogaGVpZ2h0KTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB1Um93cyg4ICogKHdpZHRoID4+IDEpKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2Um93cyg4ICogKHdpZHRoID4+IDEpKTsKKworICAgIC8vIE5PVEUhIERBTkdFUiEgRG8gbm90IGNvbnN0cnVjdCBhbnkgbm9uLXRyaXZpYWwgb2JqZWN0cyBiZWxvdyBzZXRqbXAhCisgICAgLy8gVGhlIGNvbXBpbGVyIHdpbGwgbm90IGdlbmVyYXRlIGNvZGUgdG8gZGVzdHJveSB0aGVtIGR1cmluZyB0aGUgcmV0dXJuCisgICAgLy8gYmVsb3cgc28gdGhleSB3aWxsIGxlYWsuIEFkZGl0aW9uYWxseSwgZG8gbm90IHBsYWNlIGFueSBjYWxscyB0byBsaWJqcGVnCisgICAgLy8gdGhhdCBjYW4gZmFpbCBhYm92ZSB0aGlzIGxpbmUgb3IgYW55IGVycm9yIHdpbGwgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgIGlmIChzZXRqbXAobUVycm9yTWFuYWdlci5tSnVtcEJ1ZmZlcikpIHsKKyAgICAgICAgLy8gVGhpcyBpcyB3aGVyZSB0aGUgZXJyb3IgaGFuZGxlciB3aWxsIGp1bXAgaW4gY2FzZSBjb21wcmVzc2lvbiBmYWlscworICAgICAgICAvLyBUaGUgZXJyb3IgbWFuYWdlciB3aWxsIEFMT0cgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAganBlZ19zdGFydF9jb21wcmVzcygmbUNvbXByZXNzSW5mbywgVFJVRSk7CisKKyAgICBhdHRhY2hFeGlmRGF0YShleGlmRGF0YSk7CisKKyAgICAvLyBwcm9jZXNzIDE2IGxpbmVzIG9mIFkgYW5kIDggbGluZXMgb2YgVS9WIGVhY2ggdGltZS4KKyAgICB3aGlsZSAobUNvbXByZXNzSW5mby5uZXh0X3NjYW5saW5lIDwgbUNvbXByZXNzSW5mby5pbWFnZV9oZWlnaHQpIHsKKyAgICAgICAgLy9kZWludGVybGVhdmUgdSBhbmQgdgorICAgICAgICBkZWludGVybGVhdmUodnVQbGFuYXIsIHVSb3dzLCB2Um93cywgbUNvbXByZXNzSW5mby5uZXh0X3NjYW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgd2lkdGgpOworCisgICAgICAgIC8vIEpwZWcgbGlicmFyeSBpZ25vcmVzIHRoZSByb3dzIHdob3NlIGluZGljZXMgYXJlIGdyZWF0ZXIgdGhhbiBoZWlnaHQuCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAvLyB5IHJvdworICAgICAgICAgICAgeVtpXSA9IHlQbGFuYXIgKyAobUNvbXByZXNzSW5mby5uZXh0X3NjYW5saW5lICsgaSkgKiB3aWR0aDsKKworICAgICAgICAgICAgLy8gY29uc3RydWN0IHUgcm93IGFuZCB2IHJvdworICAgICAgICAgICAgaWYgKChpICYgMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGhlaWdodCBhbmQgd2lkdGggYXJlIGJvdGggaGFsdmVkIGJlY2F1c2Ugb2YgZG93bnNhbXBsaW5nCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGkgPj4gMSkgKiAod2lkdGggPj4gMSk7CisgICAgICAgICAgICAgICAgY2JbaS8yXSA9ICZ1Um93c1tvZmZzZXRdOworICAgICAgICAgICAgICAgIGNyW2kvMl0gPSAmdlJvd3Nbb2Zmc2V0XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIGpwZWdfd3JpdGVfcmF3X2RhdGEoJm1Db21wcmVzc0luZm8sIGNvbnN0X2Nhc3Q8SlNBTVBJTUFHRT4ocGxhbmVzKSwgMTYpOworICAgIH0KKworICAgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZtQ29tcHJlc3NJbmZvKTsKKyAgICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJm1Db21wcmVzc0luZm8pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTlYxMkNvbXByZXNzb3I6OmF0dGFjaEV4aWZEYXRhKEV4aWZEYXRhKiBleGlmRGF0YSkgeworICAgIGlmIChleGlmRGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGFuIGVycm9yLCB3ZSBkb24ndCByZXF1aXJlIEVYSUYgZGF0YQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBTYXZlIHRoZSBFWElGIGRhdGEgdG8gbWVtb3J5CisgICAgdW5zaWduZWQgY2hhciogcmF3RGF0YSA9IG51bGxwdHI7CisgICAgdW5zaWduZWQgaW50IHNpemUgPSAwOworICAgIGV4aWZfZGF0YV9zYXZlX2RhdGEoZXhpZkRhdGEsICZyYXdEYXRhLCAmc2l6ZSk7CisgICAgaWYgKHJhd0RhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBFWElGIGRhdGEgYmxvY2siKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGpwZWdfd3JpdGVfbWFya2VyKCZtQ29tcHJlc3NJbmZvLCBKUEVHX0FQUDAgKyAxLCByYXdEYXRhLCBzaXplKTsKKyAgICBmcmVlKHJhd0RhdGEpOworICAgIHJldHVybiB0cnVlOworfQorCitOVjEyQ29tcHJlc3Nvcjo6RXJyb3JNYW5hZ2VyOjpFcnJvck1hbmFnZXIoKSB7CisgICAgZXJyb3JfZXhpdCA9ICZvbkpwZWdFcnJvcjsKK30KKwordm9pZCBOVjEyQ29tcHJlc3Nvcjo6RXJyb3JNYW5hZ2VyOjpvbkpwZWdFcnJvcihqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgICAvLyBOT1RFISBEbyBub3QgY29uc3RydWN0IGFueSBub24tdHJpdmlhbCBvYmplY3RzIGluIHRoaXMgbWV0aG9kIGF0IHRoZSB0b3AKKyAgICAvLyBzY29wZS4gVGhlaXIgZGVzdHJ1Y3RvcnMgd2lsbCBub3QgYmUgY2FsbGVkLiBJZiB5b3UgZG8gbmVlZCBzdWNoIGFuCisgICAgLy8gb2JqZWN0IGNyZWF0ZSBhIGxvY2FsIHNjb3BlIHRoYXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgbG9uZ2ptcCBjYWxsLAorICAgIC8vIHRoYXQgZW5zdXJlcyB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZCBiZWZvcmUgbG9uZ2ptcCBpcyBjYWxsZWQuCisgICAgRXJyb3JNYW5hZ2VyKiBlcnJvck1hbmFnZXIgPSByZWludGVycHJldF9jYXN0PEVycm9yTWFuYWdlcio+KGNpbmZvLT5lcnIpOworCisgICAgLy8gRm9ybWF0IGFuZCBsb2cgZXJyb3IgbWVzc2FnZQorICAgIGNoYXIgZXJyb3JNZXNzYWdlW0pNU0dfTEVOR1RIX01BWF07CisgICAgKCplcnJvck1hbmFnZXItPmZvcm1hdF9tZXNzYWdlKShjaW5mbywgZXJyb3JNZXNzYWdlKTsKKyAgICBlcnJvck1lc3NhZ2Vbc2l6ZW9mKGVycm9yTWVzc2FnZSkgLSAxXSA9ICdcMCc7CisgICAgQUxPR0UoIkpQRUcgY29tcHJlc3Npb24gZXJyb3I6ICVzIiwgZXJyb3JNZXNzYWdlKTsKKyAgICBqcGVnX2Rlc3Ryb3koY2luZm8pOworCisgICAgLy8gQW5kIHRocm91Z2ggdGhlIGxvb2tpbmcgZ2xhc3Mgd2UgZ28KKyAgICBsb25nam1wKGVycm9yTWFuYWdlci0+bUp1bXBCdWZmZXIsIDEpOworfQorCitOVjEyQ29tcHJlc3Nvcjo6RGVzdGluYXRpb25NYW5hZ2VyOjpEZXN0aW5hdGlvbk1hbmFnZXIoKSB7CisgICAgaW5pdF9kZXN0aW5hdGlvbiA9ICZpbml0RGVzdGluYXRpb247CisgICAgZW1wdHlfb3V0cHV0X2J1ZmZlciA9ICZlbXB0eU91dHB1dEJ1ZmZlcjsKKyAgICB0ZXJtX2Rlc3RpbmF0aW9uID0gJnRlcm1EZXN0aW5hdGlvbjsKK30KKwordm9pZCBOVjEyQ29tcHJlc3Nvcjo6RGVzdGluYXRpb25NYW5hZ2VyOjppbml0RGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pIHsKKyAgICBhdXRvIG1hbmFnZXIgPSByZWludGVycHJldF9jYXN0PERlc3RpbmF0aW9uTWFuYWdlcio+KGNpbmZvLT5kZXN0KTsKKworICAgIC8vIFN0YXJ0IG91dCB3aXRoIHNvbWUgYXJiaXRyYXJ5IGJ1dCBub3QgdG9vIGxhcmdlIGJ1ZmZlciBzaXplCisgICAgbWFuYWdlci0+bUJ1ZmZlci5yZXNpemUoMTYgKiAxMDI0KTsKKyAgICBtYW5hZ2VyLT5uZXh0X291dHB1dF9ieXRlID0gJm1hbmFnZXItPm1CdWZmZXJbMF07CisgICAgbWFuYWdlci0+ZnJlZV9pbl9idWZmZXIgPSBtYW5hZ2VyLT5tQnVmZmVyLnNpemUoKTsKK30KKworYm9vbGVhbiBOVjEyQ29tcHJlc3Nvcjo6RGVzdGluYXRpb25NYW5hZ2VyOjplbXB0eU91dHB1dEJ1ZmZlcigKKyAgICAgICAgal9jb21wcmVzc19wdHIgY2luZm8pIHsKKyAgICBhdXRvIG1hbmFnZXIgPSByZWludGVycHJldF9jYXN0PERlc3RpbmF0aW9uTWFuYWdlcio+KGNpbmZvLT5kZXN0KTsKKworICAgIC8vIEtlZXAgZG91YmxpbmcgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBmb3IgYSB2ZXJ5IGxvdywgYW1vcnRpemVkCisgICAgLy8gcGVyZm9ybWFuY2UgY29zdCBvZiB0aGUgYWxsb2NhdGlvbnMKKyAgICBzaXplX3Qgb2xkU2l6ZSA9IG1hbmFnZXItPm1CdWZmZXIuc2l6ZSgpOworICAgIG1hbmFnZXItPm1CdWZmZXIucmVzaXplKG9sZFNpemUgKiAyKTsKKyAgICBtYW5hZ2VyLT5uZXh0X291dHB1dF9ieXRlID0gJm1hbmFnZXItPm1CdWZmZXJbb2xkU2l6ZV07CisgICAgbWFuYWdlci0+ZnJlZV9pbl9idWZmZXIgPSBtYW5hZ2VyLT5tQnVmZmVyLnNpemUoKSAtIG9sZFNpemU7CisgICAgcmV0dXJuIG1hbmFnZXItPmZyZWVfaW5fYnVmZmVyICE9IDA7Cit9CisKK3ZvaWQgTlYxMkNvbXByZXNzb3I6OkRlc3RpbmF0aW9uTWFuYWdlcjo6dGVybURlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgYXV0byBtYW5hZ2VyID0gcmVpbnRlcnByZXRfY2FzdDxEZXN0aW5hdGlvbk1hbmFnZXIqPihjaW5mby0+ZGVzdCk7CisKKyAgICAvLyBSZXNpemUgZG93biB0byB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgb3V0cHV0LCB0aGF0IGlzIHJlbW92ZSBhcyBtYW55CisgICAgLy8gYnl0ZXMgYXMgdGhlcmUgYXJlIGxlZnQgaW4gdGhlIGJ1ZmZlcgorICAgIG1hbmFnZXItPm1CdWZmZXIucmVzaXplKG1hbmFnZXItPm1CdWZmZXIuc2l6ZSgpIC0gbWFuYWdlci0+ZnJlZV9pbl9idWZmZXIpOworfQorCitzdGF0dXNfdCBOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKHVpbnQ4X3QgKmpwZWdCdWZmZXIsIHNpemVfdCBtYXhTaXplLCBzaXplX3QgKnNpemUgLypvdXQqLykgeworICAgIGlmICgoc2l6ZSA9PSBudWxscHRyKSB8fCAoanBlZ0J1ZmZlciA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChjaGVja0pwZWdTdGFydChqcGVnQnVmZmVyKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gUmVhZCBKRklGIHNlZ21lbnQgbWFya2Vycywgc2tpcCBvdmVyIHNlZ21lbnQgZGF0YQorICAgICpzaXplID0ga01hcmtlckxlbmd0aDsgLy9qdW1wIHRvIFN0YXJ0IE9mIEltYWdlCisgICAgd2hpbGUgKCpzaXplIDw9IG1heFNpemUgLSBrTWFya2VyTGVuZ3RoKSB7CisgICAgICAgIHNlZ21lbnRfdCAqc2VnbWVudCA9IChzZWdtZW50X3QqKShqcGVnQnVmZmVyICsgKnNpemUpOworICAgICAgICB1aW50OF90IHR5cGUgPSBjaGVja0pwZWdNYXJrZXIoc2VnbWVudC0+bWFya2VyKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gMCkgeyAvLyBpbnZhbGlkIG1hcmtlciwgbm8gbW9yZSBzZWdtZW50cywgYmVnaW4gSlBFRyBkYXRhCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSA9PSBrRW5kT2ZJbWFnZSB8fCAqc2l6ZSA+IG1heFNpemUgLSBzaXplb2Yoc2VnbWVudF90KSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBsZW5ndGggPSBudG9ocyhzZWdtZW50LT5sZW5ndGgpOworICAgICAgICAqc2l6ZSArPSBsZW5ndGggKyBrTWFya2VyTGVuZ3RoOworICAgIH0KKworICAgIC8vIEZpbmQgRW5kIG9mIEltYWdlCisgICAgLy8gU2NhbiBKUEVHIGJ1ZmZlciB1bnRpbCBFbmQgb2YgSW1hZ2UKKyAgICBib29sIGZvdW5kRW5kID0gZmFsc2U7CisgICAgZm9yICggOyAqc2l6ZSA8PSBtYXhTaXplIC0ga01hcmtlckxlbmd0aDsgKCpzaXplKSsrKSB7CisgICAgICAgIGlmIChjaGVja0pwZWdFbmQoanBlZ0J1ZmZlciArICpzaXplKSkgeworICAgICAgICAgICAgZm91bmRFbmQgPSB0cnVlOworICAgICAgICAgICAgKnNpemUgKz0ga01hcmtlckxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3VuZEVuZCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICgqc2l6ZSA+IG1heFNpemUpIHsKKyAgICAgICAgKnNpemUgPSBtYXhTaXplOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTlYxMkNvbXByZXNzb3I6OmdldEpwZWdJbWFnZURpbWVuc2lvbnModWludDhfdCAqanBlZ0J1ZmZlciwKKyAgICAgICAgc2l6ZV90IGpwZWdCdWZmZXJTaXplLCBzaXplX3QgKndpZHRoIC8qb3V0Ki8sIHNpemVfdCAqaGVpZ2h0IC8qb3V0Ki8pIHsKKyAgICBpZiAoKGpwZWdCdWZmZXIgPT0gbnVsbHB0cikgfHwgKHdpZHRoID09IG51bGxwdHIpIHx8IChoZWlnaHQgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIChqcGVnQnVmZmVyU2l6ZSA9PSAwdSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTY2FuIEpQRUcgYnVmZmVyIHVudGlsIFN0YXJ0IG9mIEZyYW1lCisgICAgYm9vbCBmb3VuZFNPRiA9IGZhbHNlOworICAgIHNpemVfdCBjdXJyZW50UG9zOworICAgIGZvciAoY3VycmVudFBvcyA9IDA7IGN1cnJlbnRQb3MgPD0ganBlZ0J1ZmZlclNpemUgLSBrTWFya2VyTGVuZ3RoOyBjdXJyZW50UG9zKyspIHsKKyAgICAgICAgaWYgKGNoZWNrU3RhcnRPZkZyYW1lKGpwZWdCdWZmZXIgKyBjdXJyZW50UG9zKSkgeworICAgICAgICAgICAgZm91bmRTT0YgPSB0cnVlOworICAgICAgICAgICAgY3VycmVudFBvcyArPSBrTWFya2VyTGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kU09GKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RhcnQgb2YgRnJhbWUgbm90IGZvdW5kIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNvZl90ICpzdGFydE9mRnJhbWUgPSByZWludGVycHJldF9jYXN0PHNvZl90ICo+IChqcGVnQnVmZmVyICsgY3VycmVudFBvcyk7CisgICAgKndpZHRoID0gbnRvaHMoc3RhcnRPZkZyYW1lLT53aWR0aCk7CisgICAgKmhlaWdodCA9IG50b2hzKHN0YXJ0T2ZGcmFtZS0+aGVpZ2h0KTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbih1aW50OF90ICpqcGVnQnVmZmVyLCBzaXplX3QganBlZ0J1ZmZlclNpemUsCisgICAgICAgIEV4aWZPcmllbnRhdGlvbiAqZXhpZlZhbHVlIC8qb3V0Ki8pIHsKKyAgICBpZiAoKGpwZWdCdWZmZXIgPT0gbnVsbHB0cikgfHwgKGV4aWZWYWx1ZSA9PSBudWxscHRyKSB8fCAoanBlZ0J1ZmZlclNpemUgPT0gMHUpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZEYXRhPiBleGlmRGF0YShleGlmX2RhdGFfbmV3KCkpOworICAgIGV4aWZfZGF0YV9sb2FkX2RhdGEoZXhpZkRhdGEuZ2V0KCksIGpwZWdCdWZmZXIsIGpwZWdCdWZmZXJTaXplKTsKKyAgICBFeGlmRW50cnkgKm9yaWVudGF0aW9uID0gZXhpZl9jb250ZW50X2dldF9lbnRyeShleGlmRGF0YS0+aWZkW0VYSUZfSUZEXzBdLAorICAgICAgICAgICAgRVhJRl9UQUdfT1JJRU5UQVRJT04pOworICAgIGlmICgob3JpZW50YXRpb24gPT0gbnVsbHB0cikgfHwgKG9yaWVudGF0aW9uLT5zaXplICE9IHNpemVvZihFeGlmU2hvcnQpKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGF1dG8gb3JpZW50YXRpb25WYWx1ZSA9IGV4aWZfZ2V0X3Nob3J0KG9yaWVudGF0aW9uLT5kYXRhLAorICAgICAgICAgICAgZXhpZl9kYXRhX2dldF9ieXRlX29yZGVyKGV4aWZEYXRhLmdldCgpKSk7CisgICAgc3RhdHVzX3QgcmV0OworICAgIHN3aXRjaCAob3JpZW50YXRpb25WYWx1ZSkgeworICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fOTBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzE4MF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMjcwX0RFR1JFRVM6CisgICAgICAgICAgICAqZXhpZlZhbHVlID0gc3RhdGljX2Nhc3Q8RXhpZk9yaWVudGF0aW9uPiAob3JpZW50YXRpb25WYWx1ZSk7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIEVYSUYgb3JpZW50YXRpb24gdmFsdWU6ICV1IiwgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvblZhbHVlKTsKKyAgICAgICAgICAgIHJldCA9IEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyMmQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRFU1RfQ0FNRVJBX0pQRUdfU1RVQl9OVjEyX0NPTVBSRVNTT1JfSAorI2RlZmluZSBURVNUX0NBTUVSQV9KUEVHX1NUVUJfTlYxMl9DT01QUkVTU09SX0gKKworI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8anBlZ2xpYi5oPgorI2luY2x1ZGUgPGplcnJvci5oPgorfQorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiLi4vdXRpbHMvRXhpZlV0aWxzLmgiCisKK3N0cnVjdCBfRXhpZkRhdGE7Cit0eXBlZGVmIF9FeGlmRGF0YSBFeGlmRGF0YTsKKworY2xhc3MgTlYxMkNvbXByZXNzb3IgeworcHVibGljOgorICAgIE5WMTJDb21wcmVzc29yKCkge30KKworICAgIC8qIENvbXByZXNzIHxkYXRhfCB3aGljaCByZXByZXNlbnRzIHJhdyBOVjIxIGVuY29kZWQgZGF0YSBvZiBkaW1lbnNpb25zCisgICAgICogfHdpZHRofCAqIHxoZWlnaHR8LgorICAgICAqLworICAgIGJvb2wgY29tcHJlc3MoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSk7CisgICAgYm9vbCBjb21wcmVzc1dpdGhFeGlmT3JpZW50YXRpb24oY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OmNhbWVyYTM6OkV4aWZPcmllbnRhdGlvbiBleGlmVmFsdWUpOworCisgICAgLyogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjb21wcmVzc2VkIGRhdGEsIHRoaXMgd2lsbCByZXR1cm4gYW4gZW1wdHkgdmVjdG9yCisgICAgICogaWYgY29tcHJlc3MgaGFzIG5vdCBiZWVuIGNhbGxlZCB5ZXQKKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgZ2V0Q29tcHJlc3NlZERhdGEoKSBjb25zdDsKKworICAgIC8vIFV0aWxpdHkgbWV0aG9kcworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBmaW5kSnBlZ1NpemUodWludDhfdCAqanBlZ0J1ZmZlciwgc2l6ZV90IG1heFNpemUsCisgICAgICAgICAgICBzaXplX3QgKnNpemUgLypvdXQqLyk7CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZ2V0RXhpZk9yaWVudGF0aW9uKHVpbnQ4X3QgKmpwZWdCdWZmZXIsCisgICAgICAgICAgICBzaXplX3QganBlZ0J1ZmZlclNpemUsIGFuZHJvaWQ6OmNhbWVyYTM6OkV4aWZPcmllbnRhdGlvbiAqZXhpZlZhbHVlIC8qb3V0Ki8pOworCisgICAgLyogR2V0IEpwZWcgaW1hZ2UgZGltZW5zaW9ucyBmcm9tIHRoZSBmaXJzdCBTdGFydCBPZiBGcmFtZS4gUGxlYXNlIG5vdGUgdGhhdCBkdWUgdG8gdGhlCisgICAgICogd2F5IHRoZSBqcGVnIGJ1ZmZlciBpcyBzY2FubmVkIGlmIHRoZSBpbWFnZSBjb250YWlucyBhIHRodW1ibmFpbCwgdGhlbiB0aGUgc2l6ZSByZXR1cm5lZAorICAgICAqIHdpbGwgYmUgb2YgdGhlIHRodW1ibmFpbCBhbmQgbm90IHRoZSBtYWluIGltYWdlLgorICAgICAqLworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBnZXRKcGVnSW1hZ2VEaW1lbnNpb25zKHVpbnQ4X3QgKmpwZWdCdWZmZXIsIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCAqd2lkdGggLypvdXQqLywgc2l6ZV90ICpoZWlnaHQgLypvdXQqLyk7CisKK3ByaXZhdGU6CisKKyAgICBzdHJ1Y3QgRGVzdGluYXRpb25NYW5hZ2VyIDoganBlZ19kZXN0aW5hdGlvbl9tZ3IgeworICAgICAgICBEZXN0aW5hdGlvbk1hbmFnZXIoKTsKKworICAgICAgICBzdGF0aWMgdm9pZCBpbml0RGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pOworICAgICAgICBzdGF0aWMgYm9vbGVhbiBlbXB0eU91dHB1dEJ1ZmZlcihqX2NvbXByZXNzX3B0ciBjaW5mbyk7CisgICAgICAgIHN0YXRpYyB2b2lkIHRlcm1EZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbyk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgc3RydWN0IEVycm9yTWFuYWdlciA6IGpwZWdfZXJyb3JfbWdyIHsKKyAgICAgICAgRXJyb3JNYW5hZ2VyKCk7CisKKyAgICAgICAgc3RhdGljIHZvaWQgb25KcGVnRXJyb3Ioal9jb21tb25fcHRyIGNpbmZvKTsKKworICAgICAgICBqbXBfYnVmIG1KdW1wQnVmZmVyOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXJrZXJMZW5ndGggPSAyOyAvLyBsZW5ndGggb2YgYSBtYXJrZXIKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrTWFya2VyID0gMHhGRjsgLy8gRmlyc3QgYnl0ZSBvZiBtYXJrZXIKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhcnRPZkltYWdlID0gMHhEODsgLy8gU3RhcnQgb2YgSW1hZ2UKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRW5kT2ZJbWFnZSA9IDB4RDk7IC8vIEVuZCBvZiBJbWFnZQorICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGFydE9mRnJhbWUgPSAweEMwOyAvLyBTdGFydCBvZiBGcmFtZQorCisgICAgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNlZ21lbnRfdCB7CisgICAgICAgIHVpbnQ4X3QgbWFya2VyW2tNYXJrZXJMZW5ndGhdOworICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgfTsKKworICAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzb2ZfdCB7CisgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICAgICAgdWludDhfdCBwcmVjaXNpb247CisgICAgICAgIHVpbnQxNl90IGhlaWdodDsKKyAgICAgICAgdWludDE2X3Qgd2lkdGg7CisgICAgfTsKKworICAgIC8vIGNoZWNrIGZvciBzdGFydCBvZiBpbWFnZSBtYXJrZXIKKyAgICBzdGF0aWMgYm9vbCBjaGVja1N0YXJ0T2ZGcmFtZSh1aW50OF90KiBidWYpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZlswXSA9PSBrTWFya2VyICYmIGJ1ZlsxXSA9PSBrU3RhcnRPZkZyYW1lOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBzdGFydCBvZiBpbWFnZSBtYXJrZXIKKyAgICBzdGF0aWMgYm9vbCBjaGVja0pwZWdTdGFydCh1aW50OF90KiBidWYpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZlswXSA9PSBrTWFya2VyICYmIGJ1ZlsxXSA9PSBrU3RhcnRPZkltYWdlOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBFbmQgb2YgSW1hZ2UgbWFya2VyCisgICAgc3RhdGljIGJvb2wgY2hlY2tKcGVnRW5kKHVpbnQ4X3QgKmJ1ZikgeworICAgICAgICByZXR1cm4gYnVmWzBdID09IGtNYXJrZXIgJiYgYnVmWzFdID09IGtFbmRPZkltYWdlOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBhcmJpdHJhcnkgbWFya2VyLCByZXR1cm5zIG1hcmtlciB0eXBlIChzZWNvbmQgYnl0ZSkKKyAgICAvLyByZXR1cm5zIDAgaWYgbm8gbWFya2VyIGZvdW5kLiBOb3RlOiAweDAwIGlzIG5vdCBhIHZhbGlkIG1hcmtlciB0eXBlCisgICAgc3RhdGljIHVpbnQ4X3QgY2hlY2tKcGVnTWFya2VyKHVpbnQ4X3QgKmJ1ZikgeworICAgICAgICByZXR1cm4gKGJ1ZlswXSA9PSBrTWFya2VyKSA/IGJ1ZlsxXSA6IDA7CisgICAgfQorCisgICAganBlZ19jb21wcmVzc19zdHJ1Y3QgbUNvbXByZXNzSW5mbzsKKyAgICBEZXN0aW5hdGlvbk1hbmFnZXIgbURlc3RNYW5hZ2VyOworICAgIEVycm9yTWFuYWdlciBtRXJyb3JNYW5hZ2VyOworCisgICAgYm9vbCBjb25maWd1cmVDb21wcmVzc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHkpOworICAgIGJvb2wgY29tcHJlc3NEYXRhKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIEV4aWZEYXRhKiBleGlmRGF0YSk7CisgICAgYm9vbCBhdHRhY2hFeGlmRGF0YShFeGlmRGF0YSogZXhpZkRhdGEpOworfTsKKworI2VuZGlmICAvLyBURVNUX0NBTUVSQV9KUEVHX1NUVUJfTlYxMl9DT01QUkVTU09SX0gKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTM0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDYW1lcmFUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW50IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkgeworICAgIGlmIChoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIH0KKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworfQorCitpbnQgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgfQorICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Cit9CisKK2ludDY0X3QgQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCkgeworICAgIGlmIChoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Cit9CisKK3ZvaWQgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaW50NjRfdCB0b2tlbikgeworICAgIGlmIChoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpKSB7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTcwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK2NsYXNzIENhbWVyYVRocmVhZFN0YXRlIHsKK3B1YmxpYzoKKyAgc3RhdGljIGludDY0X3QgY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKworICBzdGF0aWMgdm9pZCByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGludDY0X3QgdG9rZW4pOworCisgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1VpZCgpOworCisgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpOworfTsKKworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGFmZGMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcApAQCAtMCwwICsxLDExMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZlckV4aWZVdGlscyIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIkV4aWZVdGlscy5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxsaWJleGlmL2V4aWYtZGF0YS5oPgorfQorCituYW1lc3BhY2Ugc3RkIHsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBkZWZhdWx0X2RlbGV0ZTxFeGlmRW50cnk+IHsKKyAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKEV4aWZFbnRyeSogZW50cnkpIGNvbnN0IHsgZXhpZl9lbnRyeV91bnJlZihlbnRyeSk7IH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKKworY2xhc3MgRXhpZlV0aWxzSW1wbCA6IHB1YmxpYyBFeGlmVXRpbHMgeworcHVibGljOgorICAgIEV4aWZVdGlsc0ltcGwoKTsKKworICAgIHZpcnR1YWwgfkV4aWZVdGlsc0ltcGwoKTsKKworICAgIC8vIEluaXRpYWxpemUoKSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBUaGUgc2V0dGluZyBvZiBFeGlmIHRhZ3Mgd2lsbCBiZQorICAgIC8vIGNsZWFyZWQuCisgICAgdmlydHVhbCBib29sIGluaXRpYWxpemUoY29uc3QgdW5zaWduZWQgY2hhciAqYXBwMVNlZ21lbnQsIHNpemVfdCBhcHAxU2VnbWVudFNpemUpOworICAgIHZpcnR1YWwgYm9vbCBpbml0aWFsaXplRW1wdHkoKTsKKworICAgIC8vIHNldCBhbGwga25vd24gZmllbGRzIGZyb20gYSBtZXRhZGF0YSBzdHJ1Y3R1cmUKKyAgICB2aXJ0dWFsIGJvb2wgc2V0RnJvbU1ldGFkYXRhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGltYWdlV2lkdGgsCisgICAgICAgICAgICBjb25zdCBzaXplX3QgaW1hZ2VIZWlnaHQpOworCisgICAgLy8gc2V0cyB0aGUgbGVuIGFwZXJ0dXJlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKTsKKworICAgIC8vIHNldHMgdGhlIGNvbG9yIHNwYWNlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldENvbG9yU3BhY2UodWludDE2X3QgY29sb3Jfc3BhY2UpOworCisgICAgLy8gc2V0cyB0aGUgZGF0ZSBhbmQgdGltZSBvZiBpbWFnZSBsYXN0IG1vZGlmaWVkLiBJdCB0YWtlcyBsb2NhbCB0aW1lLiBUaGUKKyAgICAvLyBuYW1lIG9mIHRoZSB0YWcgaXMgRGF0ZVRpbWUgaW4gSUZEMC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXREYXRlVGltZShjb25zdCBzdHJ1Y3QgdG0mIHQpOworCisgICAgLy8gc2V0cyB0aGUgZGlnaXRhbCB6b29tIHJhdGlvLiBJZiB0aGUgbnVtZXJhdG9yIGlzIDAsIGl0IG1lYW5zIGRpZ2l0YWwgem9vbQorICAgIC8vIHdhcyBub3QgdXNlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXREaWdpdGFsWm9vbVJhdGlvKAorICAgICAgICAgICAgdWludDMyX3QgY3JvcF93aWR0aCwgdWludDMyX3QgY3JvcF9oZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBzZW5zb3Jfd2lkdGgsIHVpbnQzMl90IHNlbnNvcl9oZWlnaHQpOworCisgICAgLy8gU2V0cyB0aGUgZXhwb3N1cmUgYmlhcy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZUJpYXMoaW50MzJfdCBldiwKKyAgICAgICAgICAgIHVpbnQzMl90IGV2X3N0ZXBfbnVtZXJhdG9yLCB1aW50MzJfdCBldl9zdGVwX2Rlbm9taW5hdG9yKTsKKworICAgIC8vIHNldHMgdGhlIGV4cG9zdXJlIG1vZGUgc2V0IHdoZW4gdGhlIGltYWdlIHdhcyBzaG90LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlTW9kZSh1aW50OF90IGV4cG9zdXJlX21vZGUpOworCisgICAgLy8gc2V0cyB0aGUgZXhwb3N1cmUgdGltZSwgZ2l2ZW4gaW4gc2Vjb25kcy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZVRpbWUoZmxvYXQgZXhwb3N1cmVfdGltZSk7CisKKyAgICAvLyBzZXRzIHRoZSBzdGF0dXMgb2YgZmxhc2guCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rmxhc2godWludDhfdCBmbGFzaF9hdmFpbGFibGUsIHVpbnQ4X3QgZmxhc2hfc3RhdGUsIHVpbnQ4X3QgYWVfbW9kZSk7CisKKyAgICAvLyBzZXRzIHRoZSBGIG51bWJlci4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGTnVtYmVyKGZsb2F0IGZfbnVtYmVyKTsKKworICAgIC8vIHNldHMgdGhlIGZvY2FsIGxlbmd0aCBvZiBsZW5zIHVzZWQgdG8gdGFrZSB0aGUgaW1hZ2UgaW4gbWlsbGltZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rm9jYWxMZW5ndGgoZmxvYXQgZm9jYWxfbGVuZ3RoKTsKKworICAgIC8vIHNldHMgdGhlIGZvY2FsIGxlbmd0aCBvZiBsZW5zIGZvciAzNW1tIGZpbG0gdXNlZCB0byB0YWtlIHRoZSBpbWFnZSBpbiBtaWxsaW1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGb2NhbExlbmd0aEluMzVtbUZpbG0oZmxvYXQgZm9jYWxfbGVuZ3RoLAorICAgICAgICAgICAgZmxvYXQgc2Vuc29yX3NpemVfeCwgZmxvYXQgc2Vuc29yX3NpemVfeSk7CisKKyAgICAvLyBzZXRzIHRoZSBhbHRpdHVkZSBpbiBtZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzQWx0aXR1ZGUoZG91YmxlIGFsdGl0dWRlKTsKKworICAgIC8vIHNldHMgdGhlIGxhdGl0dWRlIHdpdGggZGVncmVlcyBtaW51dGVzIHNlY29uZHMgZm9ybWF0LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0xhdGl0dWRlKGRvdWJsZSBsYXRpdHVkZSk7CisKKyAgICAvLyBzZXRzIHRoZSBsb25naXR1ZGUgd2l0aCBkZWdyZWVzIG1pbnV0ZXMgc2Vjb25kcyBmb3JtYXQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzTG9uZ2l0dWRlKGRvdWJsZSBsb25naXR1ZGUpOworCisgICAgLy8gc2V0cyBHUFMgcHJvY2Vzc2luZyBtZXRob2QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzUHJvY2Vzc2luZ01ldGhvZChjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kKTsKKworICAgIC8vIHNldHMgR1BTIGRhdGUgc3RhbXAgYW5kIHRpbWUgc3RhbXAgKGF0b21pYyBjbG9jaykuIEl0IHRha2VzIFVUQyB0aW1lLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc1RpbWVzdGFtcChjb25zdCBzdHJ1Y3QgdG0mIHQpOworCisgICAgLy8gc2V0cyB0aGUgbGVuZ3RoIChudW1iZXIgb2Ygcm93cykgb2YgbWFpbiBpbWFnZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJbWFnZUhlaWdodCh1aW50MzJfdCBsZW5ndGgpOworCisgICAgLy8gc2V0cyB0aGUgd2lkdGggKG51bWJlciBvZiBjb2x1bWVzKSBvZiBtYWluIGltYWdlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEltYWdlV2lkdGgodWludDMyX3Qgd2lkdGgpOworCisgICAgLy8gc2V0cyB0aGUgSVNPIHNwZWVkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldElzb1NwZWVkUmF0aW5nKHVpbnQxNl90IGlzb19zcGVlZF9yYXRpbmdzKTsKKworICAgIC8vIHNldHMgdGhlIHNtYWxsZXN0IEYgbnVtYmVyIG9mIHRoZSBsZW5zLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE1heEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKTsKKworICAgIC8vIHNldHMgaW1hZ2Ugb3JpZW50YXRpb24uCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0T3JpZW50YXRpb24odWludDE2X3QgZGVncmVlcyk7CisKKyAgICAvLyBzZXRzIGltYWdlIG9yaWVudGF0aW9uLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE9yaWVudGF0aW9uVmFsdWUoRXhpZk9yaWVudGF0aW9uIG9yaWVudGF0aW9uVmFsdWUpOworCisgICAgLy8gc2V0cyB0aGUgc2h1dHRlciBzcGVlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTaHV0dGVyU3BlZWQoZmxvYXQgZXhwb3N1cmVfdGltZSk7CisKKyAgICAvLyBzZXRzIHRoZSBkaXN0YW5jZSB0byB0aGUgc3ViamVjdCwgZ2l2ZW4gaW4gbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFN1YmplY3REaXN0YW5jZShmbG9hdCBkaW9wdGVycyk7CisKKyAgICAvLyBzZXRzIHRoZSBmcmFjdGlvbnMgb2Ygc2Vjb25kcyBmb3IgdGhlIDxEYXRlVGltZT4gdGFnLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFN1YnNlY1RpbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHN1YnNlY190aW1lKTsKKworICAgIC8vIHNldHMgdGhlIHdoaXRlIGJhbGFuY2UgbW9kZSBzZXQgd2hlbiB0aGUgaW1hZ2Ugd2FzIHNob3QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0V2hpdGVCYWxhbmNlKHVpbnQ4X3Qgd2hpdGVfYmFsYW5jZSk7CisKKyAgICAvLyBHZW5lcmF0ZXMgQVBQMSBzZWdtZW50LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZ2VuZXJhdGluZyBBUFAxIHNlZ21lbnQgZmFpbHMuCisgICAgdmlydHVhbCBib29sIGdlbmVyYXRlQXBwMSgpOworCisgICAgLy8gR2V0cyBidWZmZXIgb2YgQVBQMSBzZWdtZW50LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGNhbGxpbmcKKyAgICAvLyBHZW5lcmF0ZUFQUDEoKS4KKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGdldEFwcDFCdWZmZXIoKTsKKworICAgIC8vIEdldHMgbGVuZ3RoIG9mIEFQUDEgc2VnbWVudC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBjYWxsaW5nCisgICAgLy8gR2VuZXJhdGVBUFAxKCkuCisgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0QXBwMUxlbmd0aCgpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBzZXRzIHRoZSB2ZXJzaW9uIG9mIHRoaXMgc3RhbmRhcmQgc3VwcG9ydGVkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4aWZWZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBleGlmX3ZlcnNpb24pOworCisgICAgLy8gUmVzZXRzIHRoZSBwb2ludGVycyBhbmQgbWVtb3JpZXMuCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBBZGRzIGEgdmFyaWFibGUgbGVuZ3RoIHRhZyB0byB8ZXhpZl9kYXRhX3wuIEl0IHdpbGwgcmVtb3ZlIHRoZSBvcmlnaW5hbCBvbmUKKyAgICAvLyBpZiB0aGUgdGFnIGV4aXN0cy4KKyAgICAvLyBSZXR1cm5zIHRoZSBlbnRyeSBvZiB0aGUgdGFnLiBUaGUgcmVmZXJlbmNlIGNvdW50IG9mIHJldHVybmVkIEV4aWZFbnRyeSBpcworICAgIC8vIHR3by4KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRXhpZklmZCBpZmQsCisgICAgICAgICAgICBFeGlmVGFnIHRhZywgRXhpZkZvcm1hdCBmb3JtYXQsIHVpbnQ2NF90IGNvbXBvbmVudHMsIHVuc2lnbmVkIGludCBzaXplKTsKKworICAgIC8vIEFkZHMgYSBlbnRyeSBvZiB8dGFnfCBpbiB8ZXhpZl9kYXRhX3wuIEl0IHdvbid0IHJlbW92ZSB0aGUgb3JpZ2luYWwgb25lIGlmCisgICAgLy8gdGhlIHRhZyBleGlzdHMuCisgICAgLy8gUmV0dXJucyB0aGUgZW50cnkgb2YgdGhlIHRhZy4gSXQgYWRkcyBvbmUgcmVmZXJlbmNlIGNvdW50IHRvIHJldHVybmVkCisgICAgLy8gRXhpZkVudHJ5LgorICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gYWRkRW50cnkoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnKTsKKworICAgIC8vIEhlbHBlIGZ1bmN0aW9ucyB0byBhZGQgZXhpZiBkYXRhIHdpdGggZGlmZmVyZW50IHR5cGVzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTaG9ydChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQxNl90IHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRMb25nKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDMyX3QgdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpOworCisgICAgdmlydHVhbCBib29sIHNldFJhdGlvbmFsKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDMyX3QgbnVtZXJhdG9yLAorICAgICAgICAgICAgdWludDMyX3QgZGVub21pbmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpOworCisgICAgdmlydHVhbCBib29sIHNldFNSYXRpb25hbChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIGludDMyX3QgbnVtZXJhdG9yLAorICAgICAgICAgICAgaW50MzJfdCBkZW5vbWluYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyaW5nKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgRXhpZkZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYnVmZmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworICAgIGZsb2F0IGNvbnZlcnRUb0FwZXgoZmxvYXQgdmFsKSB7CisgICAgICAgIHJldHVybiAyLjBmICogbG9nMmYodmFsKTsKKyAgICB9CisKKyAgICAvLyBEZXN0cm95cyB0aGUgYnVmZmVyIG9mIEFQUDEgc2VnbWVudCBpZiBleGlzdHMuCisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lBcHAxKCk7CisKKyAgICAvLyBUaGUgRXhpZiBkYXRhIChBUFAxKS4gT3duZWQgYnkgdGhpcyBjbGFzcy4KKyAgICBFeGlmRGF0YSogZXhpZl9kYXRhXzsKKyAgICAvLyBUaGUgcmF3IGRhdGEgb2YgQVBQMSBzZWdtZW50LiBJdCdzIGFsbG9jYXRlZCBieSBFeGlmTWVtIGluIHxleGlmX2RhdGFffCBidXQKKyAgICAvLyBvd25lZCBieSB0aGlzIGNsYXNzLgorICAgIHVpbnQ4X3QqIGFwcDFfYnVmZmVyXzsKKyAgICAvLyBUaGUgbGVuZ3RoIG9mIHxhcHAxX2J1ZmZlcl98LgorICAgIHVuc2lnbmVkIGludCBhcHAxX2xlbmd0aF87CisKKyAgICAvLyBIb3cgcHJlY2lzZSB0aGUgZmxvYXQtdG8tcmF0aW9uYWwgY29udmVyc2lvbiBmb3IgRVhJRiB0YWdzIHdvdWxkIGJlLgorICAgIGNvbnN0IHN0YXRpYyBpbnQga1JhdGlvbmFsUHJlY2lzaW9uID0gMTAwMDA7Cit9OworCisjZGVmaW5lIFNFVF9TSE9SVChpZmQsIHRhZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2V0U2hvcnQoaWZkLCB0YWcsIHZhbHVlLCAjdGFnKSA9PSBmYWxzZSkgICBcCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKworI2RlZmluZSBTRVRfTE9ORyhpZmQsIHRhZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNldExvbmcoaWZkLCB0YWcsIHZhbHVlLCAjdGFnKSA9PSBmYWxzZSkgICAgXAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgU0VUX1JBVElPTkFMKGlmZCwgdGFnLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2V0UmF0aW9uYWwoaWZkLCB0YWcsIG51bWVyYXRvciwgZGVub21pbmF0b3IsICN0YWcpID09IGZhbHNlKSAgIFwKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgU0VUX1NSQVRJT05BTChpZmQsIHRhZywgbnVtZXJhdG9yLCBkZW5vbWluYXRvcikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNldFNSYXRpb25hbChpZmQsIHRhZywgbnVtZXJhdG9yLCBkZW5vbWluYXRvciwgI3RhZykgPT0gZmFsc2UpICAgIFwKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKworI2RlZmluZSBTRVRfU1RSSU5HKGlmZCwgdGFnLCBmb3JtYXQsIGJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2V0U3RyaW5nKGlmZCwgdGFnLCBmb3JtYXQsIGJ1ZmZlciwgI3RhZykgPT0gZmFsc2UpICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisvLyBUaGlzIGNvbWVzIGZyb20gdGhlIEV4aWYgVmVyc2lvbiAyLjIgc3RhbmRhcmQgdGFibGUgNi4KK2NvbnN0IGNoYXIgZ0V4aWZBc2NpaVByZWZpeFtdID0gezB4NDEsIDB4NTMsIDB4NDMsIDB4NDksIDB4NDksIDB4MCwgMHgwLCAweDB9OworCitzdGF0aWMgdm9pZCBzZXRMYXRpdHVkZU9yTG9uZ2l0dWRlRGF0YSh1bnNpZ25lZCBjaGFyKiBkYXRhLCBkb3VibGUgbnVtKSB7CisgICAgLy8gVGFrZSB0aGUgaW50ZWdlciBwYXJ0IG9mIHxudW18LgorICAgIEV4aWZMb25nIGRlZ3JlZXMgPSBzdGF0aWNfY2FzdDxFeGlmTG9uZz4obnVtKTsKKyAgICBFeGlmTG9uZyBtaW51dGVzID0gc3RhdGljX2Nhc3Q8RXhpZkxvbmc+KDYwICogKG51bSAtIGRlZ3JlZXMpKTsKKyAgICBFeGlmTG9uZyBtaWNyb3NlY29uZHMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RXhpZkxvbmc+KDM2MDAwMDAwMDB1ICogKG51bSAtIGRlZ3JlZXMgLSBtaW51dGVzIC8gNjAuMCkpOworICAgIGV4aWZfc2V0X3JhdGlvbmFsKGRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwge2RlZ3JlZXMsIDF9KTsKKyAgICBleGlmX3NldF9yYXRpb25hbChkYXRhICsgc2l6ZW9mKEV4aWZSYXRpb25hbCksIEVYSUZfQllURV9PUkRFUl9JTlRFTCwge21pbnV0ZXMsIDF9KTsKKyAgICBleGlmX3NldF9yYXRpb25hbChkYXRhICsgMiAqIHNpemVvZihFeGlmUmF0aW9uYWwpLCBFWElGX0JZVEVfT1JERVJfSU5URUwsCisgICAgICAgICAgICB7bWljcm9zZWNvbmRzLCAxMDAwMDAwfSk7Cit9CisKK0V4aWZVdGlscyAqRXhpZlV0aWxzOjpjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBFeGlmVXRpbHNJbXBsKCk7Cit9CisKK0V4aWZVdGlsczo6fkV4aWZVdGlscygpIHsKK30KKworRXhpZlV0aWxzSW1wbDo6RXhpZlV0aWxzSW1wbCgpCisgICAgICAgIDogZXhpZl9kYXRhXyhudWxscHRyKSwgYXBwMV9idWZmZXJfKG51bGxwdHIpLCBhcHAxX2xlbmd0aF8oMCkge30KKworRXhpZlV0aWxzSW1wbDo6fkV4aWZVdGlsc0ltcGwoKSB7CisgICAgcmVzZXQoKTsKK30KKworCitib29sIEV4aWZVdGlsc0ltcGw6OmluaXRpYWxpemUoY29uc3QgdW5zaWduZWQgY2hhciAqYXBwMVNlZ21lbnQsIHNpemVfdCBhcHAxU2VnbWVudFNpemUpIHsKKyAgICByZXNldCgpOworICAgIGV4aWZfZGF0YV8gPSBleGlmX2RhdGFfbmV3X2Zyb21fZGF0YShhcHAxU2VnbWVudCwgYXBwMVNlZ21lbnRTaXplKTsKKyAgICBpZiAoZXhpZl9kYXRhXyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogYWxsb2NhdGUgbWVtb3J5IGZvciBleGlmX2RhdGFfIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gc2V0IHRoZSBpbWFnZSBvcHRpb25zLgorICAgIGV4aWZfZGF0YV9zZXRfb3B0aW9uKGV4aWZfZGF0YV8sIEVYSUZfREFUQV9PUFRJT05fRk9MTE9XX1NQRUNJRklDQVRJT04pOworICAgIGV4aWZfZGF0YV9zZXRfZGF0YV90eXBlKGV4aWZfZGF0YV8sIEVYSUZfREFUQV9UWVBFX0NPTVBSRVNTRUQpOworICAgIGV4aWZfZGF0YV9zZXRfYnl0ZV9vcmRlcihleGlmX2RhdGFfLCBFWElGX0JZVEVfT1JERVJfSU5URUwpOworCisgICAgLy8gc2V0IGV4aWYgdmVyc2lvbiB0byAyLjIuCisgICAgaWYgKCFzZXRFeGlmVmVyc2lvbigiMDIyMCIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjppbml0aWFsaXplRW1wdHkoKSB7CisgICAgcmVzZXQoKTsKKyAgICBleGlmX2RhdGFfID0gZXhpZl9kYXRhX25ldygpOworICAgIGlmIChleGlmX2RhdGFfID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWZfZGF0YV8gZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBzZXQgdGhlIGltYWdlIG9wdGlvbnMuCisgICAgZXhpZl9kYXRhX3NldF9vcHRpb24oZXhpZl9kYXRhXywgRVhJRl9EQVRBX09QVElPTl9GT0xMT1dfU1BFQ0lGSUNBVElPTik7CisgICAgZXhpZl9kYXRhX3NldF9kYXRhX3R5cGUoZXhpZl9kYXRhXywgRVhJRl9EQVRBX1RZUEVfQ09NUFJFU1NFRCk7CisgICAgZXhpZl9kYXRhX3NldF9ieXRlX29yZGVyKGV4aWZfZGF0YV8sIEVYSUZfQllURV9PUkRFUl9JTlRFTCk7CisKKyAgICAvLyBzZXQgZXhpZiB2ZXJzaW9uIHRvIDIuMi4KKyAgICBpZiAoIXNldEV4aWZWZXJzaW9uKCIwMjIwIikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKSB7CisgICAgZmxvYXQgYXBleFZhbHVlID0gY29udmVydFRvQXBleChhcGVydHVyZSk7CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0FQRVJUVVJFX1ZBTFVFLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQoYXBleFZhbHVlICoga1JhdGlvbmFsUHJlY2lzaW9uKSksCisgICAgICAgICAgICBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldENvbG9yU3BhY2UodWludDE2X3QgY29sb3Jfc3BhY2UpIHsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfQ09MT1JfU1BBQ0UsIGNvbG9yX3NwYWNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXREYXRlVGltZShjb25zdCBzdHJ1Y3QgdG0mIHQpIHsKKyAgICAvLyBUaGUgbGVuZ3RoIGlzIDIwIGJ5dGVzIGluY2x1ZGluZyBOVUxMIGZvciB0ZXJtaW5hdGlvbiBpbiBFeGlmIHN0YW5kYXJkLgorICAgIGNoYXIgc3RyWzIwXTsKKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiUwNGk6JTAyaTolMDJpICUwMmk6JTAyaTolMDJpIiwKKyAgICAgICAgICAgIHQudG1feWVhciArIDE5MDAsIHQudG1fbW9uICsgMSwgdC50bV9tZGF5LCB0LnRtX2hvdXIsIHQudG1fbWluLCB0LnRtX3NlYyk7CisgICAgaWYgKHJlc3VsdCAhPSBzaXplb2Yoc3RyKSAtIDEpIHsKKyAgICAgICAgQUxPR1coIiVzOiBJbnB1dCB0aW1lIGlzIGludmFsaWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcihzdHIpOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfMCwgRVhJRl9UQUdfREFURV9USU1FLCBFWElGX0ZPUk1BVF9BU0NJSSwgYnVmZmVyKTsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0RBVEVfVElNRV9PUklHSU5BTCwgRVhJRl9GT1JNQVRfQVNDSUksIGJ1ZmZlcik7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19EQVRFX1RJTUVfRElHSVRJWkVELCBFWElGX0ZPUk1BVF9BU0NJSSwgYnVmZmVyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXREaWdpdGFsWm9vbVJhdGlvKAorICAgICAgICB1aW50MzJfdCBjcm9wX3dpZHRoLCB1aW50MzJfdCBjcm9wX2hlaWdodCwKKyAgICAgICAgdWludDMyX3Qgc2Vuc29yX3dpZHRoLCB1aW50MzJfdCBzZW5zb3JfaGVpZ2h0KSB7CisgICAgZmxvYXQgem9vbVJhdGlvWCA9IChjcm9wX3dpZHRoID09IDApID8gMS4wIDogMS4wICogc2Vuc29yX3dpZHRoIC8gY3JvcF93aWR0aDsKKyAgICBmbG9hdCB6b29tUmF0aW9ZID0gKGNyb3BfaGVpZ2h0ID09IDApID8gMS4wIDogMS4wICogc2Vuc29yX2hlaWdodCAvIGNyb3BfaGVpZ2h0OworICAgIGZsb2F0IHpvb21SYXRpbyA9IHN0ZDo6bWF4KHpvb21SYXRpb1gsIHpvb21SYXRpb1kpOworICAgIGNvbnN0IHN0YXRpYyBmbG9hdCBub1pvb21UaHJlc2hvbGQgPSAxLjAyZjsKKworICAgIGlmICh6b29tUmF0aW8gPD0gbm9ab29tVGhyZXNob2xkKSB7CisgICAgICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19ESUdJVEFMX1pPT01fUkFUSU8sIDAsIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19ESUdJVEFMX1pPT01fUkFUSU8sCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQoem9vbVJhdGlvICoga1JhdGlvbmFsUHJlY2lzaW9uKSksCisgICAgICAgICAgICAgICAga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RXhwb3N1cmVNb2RlKHVpbnQ4X3QgZXhwb3N1cmVfbW9kZSkgeworICAgIHVpbnQxNl90IGV4cG9zdXJlTW9kZSA9IChleHBvc3VyZV9tb2RlID09IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09GRikgPyAxIDogMDsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRVhQT1NVUkVfTU9ERSwgZXhwb3N1cmVNb2RlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRFeHBvc3VyZVRpbWUoZmxvYXQgZXhwb3N1cmVfdGltZSkgeworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19FWFBPU1VSRV9USU1FLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQoZXhwb3N1cmVfdGltZSAqIGtSYXRpb25hbFByZWNpc2lvbikpLAorICAgICAgICAgICAga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRGbGFzaCh1aW50OF90IGZsYXNoX2F2YWlsYWJsZSwgdWludDhfdCBmbGFzaF9zdGF0ZSwgdWludDhfdCBhZV9tb2RlKSB7CisgICAgLy8gRVhJRl9UQUdfRkxBU0ggYml0cyBsYXlvdXQgcGVyIEVYSUYgc3RhbmRhcmQ6CisgICAgLy8gQml0IDA6ICAgIDAgLSBkaWQgbm90IGZpcmUKKyAgICAvLyAgICAgICAgICAgMSAtIGZpcmVkCisgICAgLy8gQml0IDEtMjogIHN0YXR1cyBvZiByZXR1cm4gbGlnaHQKKyAgICAvLyBCaXQgMy00OiAgMCAtIHVua25vd24KKyAgICAvLyAgICAgICAgICAgMSAtIGNvbXB1bHNvcnkgZmxhc2ggZmlyaW5nCisgICAgLy8gICAgICAgICAgIDIgLSBjb21wdWxzb3J5IGZsYXNoIHN1cHByZXNzaW9uCisgICAgLy8gICAgICAgICAgIDMgLSBhdXRvIG1vZGUKKyAgICAvLyBCaXQgNTogICAgMCAtIGZsYXNoIGZ1bmN0aW9uIHByZXNlbnQKKyAgICAvLyAgICAgICAgICAgMSAtIG5vIGZsYXNoIGZ1bmN0aW9uCisgICAgLy8gQml0IDY6ICAgIDAgLSBubyByZWQtZXllIHJlZHVjdGlvbiBtb2RlIG9yIHVua25vd24KKyAgICAvLyAgICAgICAgICAgMSAtIHJlZC1leWUgcmVkdWN0aW9uIHN1cHBvcnRlZAorICAgIHVpbnQxNl90IGZsYXNoID0gMHgyMDsKKworICAgIGlmIChmbGFzaF9hdmFpbGFibGUgPT0gQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRV9UUlVFKSB7CisgICAgICAgIGZsYXNoID0gMHgwMDsKKworICAgICAgICBpZiAoZmxhc2hfc3RhdGUgPT0gQU5EUk9JRF9GTEFTSF9TVEFURV9GSVJFRCkgeworICAgICAgICAgICAgZmxhc2ggfD0gMHgxOworICAgICAgICB9CisgICAgICAgIGlmIChhZV9tb2RlID09IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0FVVE9fRkxBU0hfUkVERVlFKSB7CisgICAgICAgICAgICBmbGFzaCB8PSAweDQwOworICAgICAgICB9CisKKyAgICAgICAgdWludDE2X3QgZmxhc2hNb2RlID0gMDsKKyAgICAgICAgc3dpdGNoIChhZV9tb2RlKSB7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0FVVE9fRkxBU0g6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0FVVE9fRkxBU0hfUkVERVlFOgorICAgICAgICAgICAgICAgZmxhc2hNb2RlID0gMzsgLy8gQVVUTworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0FMV0FZU19GTEFTSDoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT05fRVhURVJOQUxfRkxBU0g6CisgICAgICAgICAgICAgICBmbGFzaE1vZGUgPSAxOyAvLyBPTgorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09GRjoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT046CisgICAgICAgICAgICAgICBmbGFzaE1vZGUgPSAyOyAvLyBPRkYKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGZsYXNoTW9kZSA9IDA7IC8vIFVOS05PV04KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYXNoIHw9IChmbGFzaE1vZGUgPDwgMyk7CisgICAgfQorICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19GTEFTSCwgZmxhc2gpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEZOdW1iZXIoZmxvYXQgZl9udW1iZXIpIHsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRk5VTUJFUiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKGZfbnVtYmVyICoga1JhdGlvbmFsUHJlY2lzaW9uKSksCisgICAgICAgICAgICBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEZvY2FsTGVuZ3RoKGZsb2F0IGZvY2FsX2xlbmd0aCkgeworICAgIHVpbnQzMl90IG51bWVyYXRvciA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKGZvY2FsX2xlbmd0aCAqIGtSYXRpb25hbFByZWNpc2lvbikpOworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19GT0NBTF9MRU5HVEgsIG51bWVyYXRvciwga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRGb2NhbExlbmd0aEluMzVtbUZpbG0oCisgICAgICAgIGZsb2F0IGZvY2FsX2xlbmd0aCwgZmxvYXQgc2Vuc29yX3NpemVfeCwgZmxvYXQgc2Vuc29yX3NpemVfeSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBmaWxtRGlhZ29uYWwgPSA0My4yNzsgLy8gZGlhZ29uYWwgb2YgMzVtbSBmaWxtCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pblNlbnNvckRpYWdvbmFsID0gMC4wMTsKKyAgICBmbG9hdCBzZW5zb3JEaWFnb25hbCA9IHN0ZDo6c3FydCgKKyAgICAgICAgICAgIHNlbnNvcl9zaXplX3ggKiBzZW5zb3Jfc2l6ZV94ICsgc2Vuc29yX3NpemVfeSAqIHNlbnNvcl9zaXplX3kpOworICAgIHNlbnNvckRpYWdvbmFsID0gc3RkOjptYXgoc2Vuc29yRGlhZ29uYWwsIG1pblNlbnNvckRpYWdvbmFsKTsKKyAgICBmbG9hdCBmb2NhbExlbmd0aDM1bW1GaWxtID0gc3RkOjpyb3VuZChmb2NhbF9sZW5ndGggKiBmaWxtRGlhZ29uYWwgLyBzZW5zb3JEaWFnb25hbCk7CisgICAgZm9jYWxMZW5ndGgzNW1tRmlsbSA9IHN0ZDo6bWluKDEuMGYgKiA2NTUzNSwgZm9jYWxMZW5ndGgzNW1tRmlsbSk7CisKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRk9DQUxfTEVOR1RIX0lOXzM1TU1fRklMTSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90Pihmb2NhbExlbmd0aDM1bW1GaWxtKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0R3BzQWx0aXR1ZGUoZG91YmxlIGFsdGl0dWRlKSB7CisgICAgRXhpZlRhZyByZWZUYWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfQUxUSVRVREVfUkVGKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiByZWZFbnRyeSA9CisgICAgICAgICAgICBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEVYSUZfSUZEX0dQUywgcmVmVGFnLCBFWElGX0ZPUk1BVF9CWVRFLCAxLCAxKTsKKyAgICBpZiAoIXJlZkVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0FsdGl0dWRlUmVmIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYWx0aXR1ZGUgPj0gMCkgeworICAgICAgICAqcmVmRW50cnktPmRhdGEgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgICpyZWZFbnRyeS0+ZGF0YSA9IDE7CisgICAgICAgIGFsdGl0dWRlICo9IC0xOworICAgIH0KKworICAgIEV4aWZUYWcgdGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0FMVElUVURFKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoCisgICAgICAgICAgICBFWElGX0lGRF9HUFMsIHRhZywgRVhJRl9GT1JNQVRfUkFUSU9OQUwsIDEsIHNpemVvZihFeGlmUmF0aW9uYWwpKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIGV4aWZfY29udGVudF9yZW1vdmVfZW50cnkoZXhpZl9kYXRhXy0+aWZkW0VYSUZfSUZEX0dQU10sIHJlZkVudHJ5LmdldCgpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTQWx0aXR1ZGUgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X3JhdGlvbmFsKGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsCisgICAgICAgICAgICB7c3RhdGljX2Nhc3Q8RXhpZkxvbmc+KGFsdGl0dWRlICogMTAwMCksIDEwMDB9KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEdwc0xhdGl0dWRlKGRvdWJsZSBsYXRpdHVkZSkgeworICAgIGNvbnN0IEV4aWZUYWcgcmVmVGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0xBVElUVURFX1JFRik7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gcmVmRW50cnkgPQorICAgICAgICAgICAgYWRkVmFyaWFibGVMZW5ndGhFbnRyeShFWElGX0lGRF9HUFMsIHJlZlRhZywgRVhJRl9GT1JNQVRfQVNDSUksIDIsIDIpOworICAgIGlmICghcmVmRW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTTGF0aXR1ZGVSZWYgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChsYXRpdHVkZSA+PSAwKSB7CisgICAgICAgIG1lbWNweShyZWZFbnRyeS0+ZGF0YSwgIk4iLCBzaXplb2YoIk4iKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KHJlZkVudHJ5LT5kYXRhLCAiUyIsIHNpemVvZigiUyIpKTsKKyAgICAgICAgbGF0aXR1ZGUgKj0gLTE7CisgICAgfQorCisgICAgY29uc3QgRXhpZlRhZyB0YWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfTEFUSVRVREUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkVmFyaWFibGVMZW5ndGhFbnRyeSgKKyAgICAgICAgICAgIEVYSUZfSUZEX0dQUywgdGFnLCBFWElGX0ZPUk1BVF9SQVRJT05BTCwgMywgMyAqIHNpemVvZihFeGlmUmF0aW9uYWwpKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIGV4aWZfY29udGVudF9yZW1vdmVfZW50cnkoZXhpZl9kYXRhXy0+aWZkW0VYSUZfSUZEX0dQU10sIHJlZkVudHJ5LmdldCgpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTTGF0aXR1ZGUgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNldExhdGl0dWRlT3JMb25naXR1ZGVEYXRhKGVudHJ5LT5kYXRhLCBsYXRpdHVkZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRHcHNMb25naXR1ZGUoZG91YmxlIGxvbmdpdHVkZSkgeworICAgIEV4aWZUYWcgcmVmVGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0xPTkdJVFVERV9SRUYpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IHJlZkVudHJ5ID0KKyAgICAgICAgICAgIGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRVhJRl9JRkRfR1BTLCByZWZUYWcsIEVYSUZfRk9STUFUX0FTQ0lJLCAyLCAyKTsKKyAgICBpZiAoIXJlZkVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0xvbmdpdHVkZVJlZiBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGxvbmdpdHVkZSA+PSAwKSB7CisgICAgICAgIG1lbWNweShyZWZFbnRyeS0+ZGF0YSwgIkUiLCBzaXplb2YoIkUiKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KHJlZkVudHJ5LT5kYXRhLCAiVyIsIHNpemVvZigiVyIpKTsKKyAgICAgICAgbG9uZ2l0dWRlICo9IC0xOworICAgIH0KKworICAgIEV4aWZUYWcgdGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0xPTkdJVFVERSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KAorICAgICAgICAgICAgRVhJRl9JRkRfR1BTLCB0YWcsIEVYSUZfRk9STUFUX1JBVElPTkFMLCAzLCAzICogc2l6ZW9mKEV4aWZSYXRpb25hbCkpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgZXhpZl9jb250ZW50X3JlbW92ZV9lbnRyeShleGlmX2RhdGFfLT5pZmRbRVhJRl9JRkRfR1BTXSwgcmVmRW50cnkuZ2V0KCkpOworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNMb25naXR1ZGUgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNldExhdGl0dWRlT3JMb25naXR1ZGVEYXRhKGVudHJ5LT5kYXRhLCBsb25naXR1ZGUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0R3BzUHJvY2Vzc2luZ01ldGhvZChjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kKSB7CisgICAgc3RkOjpzdHJpbmcgYnVmZmVyID0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGdFeGlmQXNjaWlQcmVmaXgsIHNpemVvZihnRXhpZkFzY2lpUHJlZml4KSkgKyBtZXRob2Q7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9HUFMsIHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19QUk9DRVNTSU5HX01FVEhPRCksCisgICAgICAgICAgICBFWElGX0ZPUk1BVF9VTkRFRklORUQsIGJ1ZmZlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0R3BzVGltZXN0YW1wKGNvbnN0IHN0cnVjdCB0bSYgdCkgeworICAgIGNvbnN0IEV4aWZUYWcgZGF0ZVRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19EQVRFX1NUQU1QKTsKKyAgICBjb25zdCBzaXplX3Qga0dwc0RhdGVTdGFtcFNpemUgPSAxMTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRVhJRl9JRkRfR1BTLAorICAgICAgICAgICAgZGF0ZVRhZywgRVhJRl9GT1JNQVRfQVNDSUksIGtHcHNEYXRlU3RhbXBTaXplLCBrR3BzRGF0ZVN0YW1wU2l6ZSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNEYXRlU3RhbXAgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihyZWludGVycHJldF9jYXN0PGNoYXIqPihlbnRyeS0+ZGF0YSksIGtHcHNEYXRlU3RhbXBTaXplLAorICAgICAgICAgICAgIiUwNGk6JTAyaTolMDJpIiwgdC50bV95ZWFyICsgMTkwMCwgdC50bV9tb24gKyAxLCB0LnRtX21kYXkpOworICAgIGlmIChyZXN1bHQgIT0ga0dwc0RhdGVTdGFtcFNpemUgLSAxKSB7CisgICAgICAgIEFMT0dXKCIlczogSW5wdXQgdGltZSBpcyBpbnZhbGlkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEV4aWZUYWcgdGltZVRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19USU1FX1NUQU1QKTsKKyAgICBlbnRyeSA9IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRVhJRl9JRkRfR1BTLCB0aW1lVGFnLCBFWElGX0ZPUk1BVF9SQVRJT05BTCwgMywKKyAgICAgICAgICAgIDMgKiBzaXplb2YoRXhpZlJhdGlvbmFsKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNUaW1lU3RhbXAgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X3JhdGlvbmFsKGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsCisgICAgICAgICAgICB7c3RhdGljX2Nhc3Q8RXhpZkxvbmc+KHQudG1faG91ciksIDF9KTsKKyAgICBleGlmX3NldF9yYXRpb25hbChlbnRyeS0+ZGF0YSArIHNpemVvZihFeGlmUmF0aW9uYWwpLCBFWElGX0JZVEVfT1JERVJfSU5URUwsCisgICAgICAgICAgICB7c3RhdGljX2Nhc3Q8RXhpZkxvbmc+KHQudG1fbWluKSwgMX0pOworICAgIGV4aWZfc2V0X3JhdGlvbmFsKGVudHJ5LT5kYXRhICsgMiAqIHNpemVvZihFeGlmUmF0aW9uYWwpLCBFWElGX0JZVEVfT1JERVJfSU5URUwsCisgICAgICAgICAgICB7c3RhdGljX2Nhc3Q8RXhpZkxvbmc+KHQudG1fc2VjKSwgMX0pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0SW1hZ2VIZWlnaHQodWludDMyX3QgbGVuZ3RoKSB7CisgICAgU0VUX0xPTkcoRVhJRl9JRkRfMCwgRVhJRl9UQUdfSU1BR0VfTEVOR1RILCBsZW5ndGgpOworICAgIFNFVF9MT05HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1BJWEVMX1lfRElNRU5TSU9OLCBsZW5ndGgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEltYWdlV2lkdGgodWludDMyX3Qgd2lkdGgpIHsKKyAgICBTRVRfTE9ORyhFWElGX0lGRF8wLCBFWElGX1RBR19JTUFHRV9XSURUSCwgd2lkdGgpOworICAgIFNFVF9MT05HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1BJWEVMX1hfRElNRU5TSU9OLCB3aWR0aCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0SXNvU3BlZWRSYXRpbmcodWludDE2X3QgaXNvX3NwZWVkX3JhdGluZ3MpIHsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfSVNPX1NQRUVEX1JBVElOR1MsIGlzb19zcGVlZF9yYXRpbmdzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRNYXhBcGVydHVyZShmbG9hdCBhcGVydHVyZSkgeworICAgIGZsb2F0IG1heEFwZXJ0dXJlID0gY29udmVydFRvQXBleChhcGVydHVyZSk7CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX01BWF9BUEVSVFVSRV9WQUxVRSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKG1heEFwZXJ0dXJlICoga1JhdGlvbmFsUHJlY2lzaW9uKSksCisgICAgICAgICAgICBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEV4cG9zdXJlQmlhcyhpbnQzMl90IGV2LAorICAgICAgICB1aW50MzJfdCBldl9zdGVwX251bWVyYXRvciwgdWludDMyX3QgZXZfc3RlcF9kZW5vbWluYXRvcikgeworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19FWFBPU1VSRV9CSUFTX1ZBTFVFLAorICAgICAgICAgICAgZXYgKiBldl9zdGVwX251bWVyYXRvciwgZXZfc3RlcF9kZW5vbWluYXRvcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0T3JpZW50YXRpb24odWludDE2X3QgZGVncmVlcykgeworICAgIEV4aWZPcmllbnRhdGlvbiB2YWx1ZSA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOworICAgIHN3aXRjaCAoZGVncmVlcykgeworICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgdmFsdWUgPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzkwX0RFR1JFRVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICB2YWx1ZSA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMTgwX0RFR1JFRVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICB2YWx1ZSA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMjcwX0RFR1JFRVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc2V0T3JpZW50YXRpb25WYWx1ZSh2YWx1ZSk7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0T3JpZW50YXRpb25WYWx1ZShFeGlmT3JpZW50YXRpb24gb3JpZW50YXRpb25WYWx1ZSkgeworICAgIFNFVF9TSE9SVChFWElGX0lGRF8wLCBFWElGX1RBR19PUklFTlRBVElPTiwgb3JpZW50YXRpb25WYWx1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U2h1dHRlclNwZWVkKGZsb2F0IGV4cG9zdXJlX3RpbWUpIHsKKyAgICBmbG9hdCBzaHV0dGVyU3BlZWQgPSAtbG9nMmYoZXhwb3N1cmVfdGltZSk7CisgICAgU0VUX1NSQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19TSFVUVEVSX1NQRUVEX1ZBTFVFLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNodXR0ZXJTcGVlZCAqIGtSYXRpb25hbFByZWNpc2lvbiksIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U3ViamVjdERpc3RhbmNlKGZsb2F0IGRpb3B0ZXJzKSB7CisgICAgY29uc3Qgc3RhdGljIGZsb2F0IGtJbmZpbml0eURpb3B0ZXJzID0gMS4wZS02OworICAgIHVpbnQzMl90IG51bWVyYXRvciwgZGVub21pbmF0b3I7CisgICAgdWludDE2X3QgZGlzdGFuY2VSYW5nZTsKKyAgICBpZiAoZGlvcHRlcnMgPiBrSW5maW5pdHlEaW9wdGVycykgeworICAgICAgICBmbG9hdCBmb2N1c0Rpc3RhbmNlID0gMS4wZiAvIGRpb3B0ZXJzOworICAgICAgICBudW1lcmF0b3IgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZChmb2N1c0Rpc3RhbmNlICoga1JhdGlvbmFsUHJlY2lzaW9uKSk7CisgICAgICAgIGRlbm9taW5hdG9yID0ga1JhdGlvbmFsUHJlY2lzaW9uOworCisgICAgICAgIGlmIChmb2N1c0Rpc3RhbmNlIDwgMS4wZikgeworICAgICAgICAgICAgZGlzdGFuY2VSYW5nZSA9IDE7IC8vIE1hY3JvCisgICAgICAgIH0gZWxzZSBpZiAoZm9jdXNEaXN0YW5jZSA8IDMuMGYpIHsKKyAgICAgICAgICAgIGRpc3RhbmNlUmFuZ2UgPSAyOyAvLyBDbG9zZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlzdGFuY2VSYW5nZSA9IDM7IC8vIERpc3RhbnQKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG51bWVyYXRvciA9IDB4RkZGRkZGRkY7CisgICAgICAgIGRlbm9taW5hdG9yID0gMTsKKyAgICAgICAgZGlzdGFuY2VSYW5nZSA9IDM7IC8vIERpc3RhbnQKKyAgICB9CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NVQkpFQ1RfRElTVEFOQ0UsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOworICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19TVUJKRUNUX0RJU1RBTkNFX1JBTkdFLCBkaXN0YW5jZVJhbmdlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTdWJzZWNUaW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJzZWNfdGltZSkgeworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU1VCX1NFQ19USU1FLCBFWElGX0ZPUk1BVF9BU0NJSSwgc3Vic2VjX3RpbWUpOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU1VCX1NFQ19USU1FX09SSUdJTkFMLCBFWElGX0ZPUk1BVF9BU0NJSSwgc3Vic2VjX3RpbWUpOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU1VCX1NFQ19USU1FX0RJR0lUSVpFRCwgRVhJRl9GT1JNQVRfQVNDSUksIHN1YnNlY190aW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRXaGl0ZUJhbGFuY2UodWludDhfdCB3aGl0ZV9iYWxhbmNlKSB7CisgICAgdWludDE2X3Qgd2hpdGVCYWxhbmNlID0gKHdoaXRlX2JhbGFuY2UgPT0gQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFX0FVVE8pID8gMCA6IDE7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1dISVRFX0JBTEFOQ0UsIHdoaXRlQmFsYW5jZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6Z2VuZXJhdGVBcHAxKCkgeworICAgIGRlc3Ryb3lBcHAxKCk7CisgICAgLy8gU2F2ZSB0aGUgcmVzdWx0IGludG8gfGFwcDFfYnVmZmVyX3wuCisgICAgZXhpZl9kYXRhX3NhdmVfZGF0YShleGlmX2RhdGFfLCAmYXBwMV9idWZmZXJfLCAmYXBwMV9sZW5ndGhfKTsKKyAgICBpZiAoIWFwcDFfbGVuZ3RoXykgeworICAgICAgICBBTE9HRSgiJXM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgYXBwMV9idWZmZXJfIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBUaGUgSlBFRyBzZWdtZW50IHNpemUgaXMgMTYgYml0cyBpbiBzcGVjLiBUaGUgc2l6ZSBvZiBBUFAxIHNlZ21lbnQgc2hvdWxkCisgICAgICogYmUgc21hbGxlciB0aGFuIDY1NTMzIGJlY2F1c2UgdGhlcmUgYXJlIHR3byBieXRlcyBmb3Igc2VnbWVudCBzaXplIGZpZWxkLgorICAgICAqLworICAgIGlmIChhcHAxX2xlbmd0aF8gPiA2NTUzMykgeworICAgICAgICBkZXN0cm95QXBwMSgpOworICAgICAgICBBTE9HRSgiJXM6IFRoZSBzaXplIG9mIEFQUDEgc2VnbWVudCBpcyB0b28gbGFyZ2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitjb25zdCB1aW50OF90KiBFeGlmVXRpbHNJbXBsOjpnZXRBcHAxQnVmZmVyKCkgeworICAgIHJldHVybiBhcHAxX2J1ZmZlcl87Cit9CisKK3Vuc2lnbmVkIGludCBFeGlmVXRpbHNJbXBsOjpnZXRBcHAxTGVuZ3RoKCkgeworICAgIHJldHVybiBhcHAxX2xlbmd0aF87Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RXhpZlZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGV4aWZfdmVyc2lvbikgeworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRVhJRl9WRVJTSU9OLCBFWElGX0ZPUk1BVF9VTkRFRklORUQsIGV4aWZfdmVyc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRXhpZlV0aWxzSW1wbDo6cmVzZXQoKSB7CisgICAgZGVzdHJveUFwcDEoKTsKKyAgICBpZiAoZXhpZl9kYXRhXykgeworICAgICAgICAvKgorICAgICAgICAgKiBTaW5jZSB3ZSBkZWNpZGVkIHRvIGlnbm9yZSB0aGUgb3JpZ2luYWwgQVBQMSwgd2UgYXJlIHN1cmUgdGhhdCB0aGVyZSBpcworICAgICAgICAgKiBubyB0aHVtYm5haWwgYWxsb2NhdGVkIGJ5IGxpYmV4aWYuIHxleGlmX2RhdGFfLT5kYXRhfCBpcyBhY3R1YWxseQorICAgICAgICAgKiBhbGxvY2F0ZWQgYnkgSnBlZ0NvbXByZXNzb3IuIHNldHMgfGV4aWZfZGF0YV8tPmRhdGF8IHRvIG51bGxwdHIgdG8KKyAgICAgICAgICogcHJldmVudCBleGlmX2RhdGFfdW5yZWYoKSBkZXN0cm95IGl0IGluY29ycmVjdGx5LgorICAgICAgICAgKi8KKyAgICAgICAgZXhpZl9kYXRhXy0+ZGF0YSA9IG51bGxwdHI7CisgICAgICAgIGV4aWZfZGF0YV8tPnNpemUgPSAwOworICAgICAgICBleGlmX2RhdGFfdW5yZWYoZXhpZl9kYXRhXyk7CisgICAgICAgIGV4aWZfZGF0YV8gPSBudWxscHRyOworICAgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gRXhpZlV0aWxzSW1wbDo6YWRkVmFyaWFibGVMZW5ndGhFbnRyeShFeGlmSWZkIGlmZCwKKyAgICAgICAgRXhpZlRhZyB0YWcsIEV4aWZGb3JtYXQgZm9ybWF0LCB1aW50NjRfdCBjb21wb25lbnRzLCB1bnNpZ25lZCBpbnQgc2l6ZSkgeworICAgIC8vIFJlbW92ZSBvbGQgZW50cnkgaWYgZXhpc3RzLgorICAgIGV4aWZfY29udGVudF9yZW1vdmVfZW50cnkoZXhpZl9kYXRhXy0+aWZkW2lmZF0sCisgICAgICAgICAgICBleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtpZmRdLCB0YWcpKTsKKyAgICBFeGlmTWVtKiBtZW0gPSBleGlmX21lbV9uZXdfZGVmYXVsdCgpOworICAgIGlmICghbWVtKSB7CisgICAgICAgIEFMT0dFKCIlczogQWxsb2NhdGUgbWVtb3J5IGZvciBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeShleGlmX2VudHJ5X25ld19tZW0obWVtKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBleGlmX21lbV91bnJlZihtZW0pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgdm9pZCogdG1wQnVmZmVyID0gZXhpZl9tZW1fYWxsb2MobWVtLCBzaXplKTsKKyAgICBpZiAoIXRtcEJ1ZmZlcikgeworICAgICAgICBBTE9HRSgiJXM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBleGlmX21lbV91bnJlZihtZW0pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBlbnRyeS0+ZGF0YSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPih0bXBCdWZmZXIpOworICAgIGVudHJ5LT50YWcgPSB0YWc7CisgICAgZW50cnktPmZvcm1hdCA9IGZvcm1hdDsKKyAgICBlbnRyeS0+Y29tcG9uZW50cyA9IGNvbXBvbmVudHM7CisgICAgZW50cnktPnNpemUgPSBzaXplOworCisgICAgZXhpZl9jb250ZW50X2FkZF9lbnRyeShleGlmX2RhdGFfLT5pZmRbaWZkXSwgZW50cnkuZ2V0KCkpOworICAgIGV4aWZfbWVtX3VucmVmKG1lbSk7CisKKyAgICByZXR1cm4gZW50cnk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IEV4aWZVdGlsc0ltcGw6OmFkZEVudHJ5KEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5KGV4aWZfY29udGVudF9nZXRfZW50cnkoZXhpZl9kYXRhXy0+aWZkW2lmZF0sIHRhZykpOworICAgIGlmIChlbnRyeSkgeworICAgICAgICAvLyBleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KCkgd29uJ3QgcmVmIHRoZSBlbnRyeSwgc28gd2UgcmVmIGhlcmUuCisgICAgICAgIGV4aWZfZW50cnlfcmVmKGVudHJ5LmdldCgpKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KKyAgICBlbnRyeS5yZXNldChleGlmX2VudHJ5X25ldygpKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWxsb2NhdGUgbWVtb3J5IGZvciBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBlbnRyeS0+dGFnID0gdGFnOworICAgIGV4aWZfY29udGVudF9hZGRfZW50cnkoZXhpZl9kYXRhXy0+aWZkW2lmZF0sIGVudHJ5LmdldCgpKTsKKyAgICBleGlmX2VudHJ5X2luaXRpYWxpemUoZW50cnkuZ2V0KCksIHRhZyk7CisgICAgcmV0dXJuIGVudHJ5OworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFNob3J0KEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDE2X3QgdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZEVudHJ5KGlmZCwgdGFnKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nICclcycgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtc2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhpZl9zZXRfc2hvcnQoZW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwgdmFsdWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldExvbmcoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCB1aW50MzJfdCB2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkRW50cnkoaWZkLCB0YWcpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgJyVzJyBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1zZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9sb25nKGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHZhbHVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRSYXRpb25hbChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQzMl90IG51bWVyYXRvciwKKyAgICAgICAgdWludDMyX3QgZGVub21pbmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZEVudHJ5KGlmZCwgdGFnKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nICclcycgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtc2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwge251bWVyYXRvciwgZGVub21pbmF0b3J9KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTUmF0aW9uYWwoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCBpbnQzMl90IG51bWVyYXRvciwKKyAgICAgICAgaW50MzJfdCBkZW5vbWluYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkRW50cnkoaWZkLCB0YWcpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgJyVzJyBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1zZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9zcmF0aW9uYWwoZW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwge251bWVyYXRvciwgZGVub21pbmF0b3J9KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTdHJpbmcoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCBFeGlmRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJ1ZmZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgeworICAgIHNpemVfdCBlbnRyeV9zaXplID0gYnVmZmVyLmxlbmd0aCgpOworICAgIC8vIFNpbmNlIHRoZSBleGlmIGZvcm1hdCBpcyB1bmRlZmluZWQsIE5VTEwgdGVybWluYXRpb24gaXMgbm90IG5lY2Vzc2FyeS4KKyAgICBpZiAoZm9ybWF0ID09IEVYSUZfRk9STUFUX0FTQ0lJKSB7CisgICAgICAgIGVudHJ5X3NpemUrKzsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPQorICAgICAgICAgICAgYWRkVmFyaWFibGVMZW5ndGhFbnRyeShpZmQsIHRhZywgZm9ybWF0LCBlbnRyeV9zaXplLCBlbnRyeV9zaXplKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nICclcycgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtc2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KGVudHJ5LT5kYXRhLCBidWZmZXIuY19zdHIoKSwgZW50cnlfc2l6ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRXhpZlV0aWxzSW1wbDo6ZGVzdHJveUFwcDEoKSB7CisgICAgLyoKKyAgICAgKiBTaW5jZSB0aGVyZSBpcyBubyBBUEkgdG8gYWNjZXNzIEV4aWZNZW0gaW4gRXhpZkRhdGEtPnByaXYsIHdlIHVzZSBmcmVlCisgICAgICogaGVyZSwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZnJlZSBmdW5jdGlvbiBpbiBsaWJleGlmLiBTZWUKKyAgICAgKiBleGlmX2RhdGFfc2F2ZV9kYXRhKCkgZm9yIGRldGFpbC4KKyAgICAgKi8KKyAgICBmcmVlKGFwcDFfYnVmZmVyXyk7CisgICAgYXBwMV9idWZmZXJfID0gbnVsbHB0cjsKKyAgICBhcHAxX2xlbmd0aF8gPSAwOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEZyb21NZXRhZGF0YShjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAorICAgICAgICBjb25zdCBzaXplX3QgaW1hZ2VXaWR0aCwgY29uc3Qgc2l6ZV90IGltYWdlSGVpZ2h0KSB7CisgICAgaWYgKCFzZXRJbWFnZVdpZHRoKGltYWdlV2lkdGgpIHx8CisgICAgICAgICAgICAhc2V0SW1hZ2VIZWlnaHQoaW1hZ2VIZWlnaHQpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBpbWFnZSByZXNvbHV0aW9uIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RydWN0IHRpbWVzcGVjIHRwOworICAgIHN0cnVjdCB0bSB0aW1lX2luZm87CisgICAgYm9vbCB0aW1lX2F2YWlsYWJsZSA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cCkgIT0gLTE7CisgICAgbG9jYWx0aW1lX3IoJnRwLnR2X3NlYywgJnRpbWVfaW5mbyk7CisgICAgaWYgKCFzZXREYXRlVGltZSh0aW1lX2luZm8pKSB7CisgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBkYXRhIHRpbWUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmbG9hdCBmb2NhbF9sZW5ndGg7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0xFTlNfRk9DQUxfTEVOR1RIKTsKKyAgICBpZiAoZW50cnkuY291bnQpIHsKKyAgICAgICAgZm9jYWxfbGVuZ3RoID0gZW50cnkuZGF0YS5mWzBdOworCisgICAgICAgIGlmICghc2V0Rm9jYWxMZW5ndGgoZm9jYWxfbGVuZ3RoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGZvY2FsIGxlbmd0aCBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzZW5zb3JTaXplRW50cnkgPQorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8uZmluZChBTkRST0lEX1NFTlNPUl9JTkZPX1BIWVNJQ0FMX1NJWkUpOworICAgICAgICBpZiAoc2Vuc29yU2l6ZUVudHJ5LmNvdW50ID09IDIpIHsKKyAgICAgICAgICAgIGlmICghc2V0Rm9jYWxMZW5ndGhJbjM1bW1GaWxtKAorICAgICAgICAgICAgICAgICAgICBmb2NhbF9sZW5ndGgsIHNlbnNvclNpemVFbnRyeS5kYXRhLmZbMF0sIHNlbnNvclNpemVFbnRyeS5kYXRhLmZbMV0pKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGZvY2FsIGxlbmd0aCBpbiAzNW1tIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCIlczogQ2Fubm90IGZpbmQgZm9jYWwgbGVuZ3RoIGluIG1ldGFkYXRhLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTikgJiYKKyAgICAgICAgICAgIHN0YXRpY0luZm8uZXhpc3RzKEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTik7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhY3RpdmVBcnJheUVudHJ5ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSk7CisKKyAgICAgICAgaWYgKCFzZXREaWdpdGFsWm9vbVJhdGlvKGVudHJ5LmRhdGEuaTMyWzJdLCBlbnRyeS5kYXRhLmkzMlszXSwKKyAgICAgICAgICAgICAgICBhY3RpdmVBcnJheUVudHJ5LmRhdGEuaTMyWzJdLCBhY3RpdmVBcnJheUVudHJ5LmRhdGEuaTMyWzNdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGRpZ2l0YWwgem9vbSByYXRpbyBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9KUEVHX0dQU19DT09SRElOQVRFUykpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfSlBFR19HUFNfQ09PUkRJTkFURVMpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPCAzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEdwcyBjb29yZGluYXRlcyBpbiBtZXRhZGF0YSBpcyBub3QgY29tcGxldGUuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldEdwc0xhdGl0dWRlKGVudHJ5LmRhdGEuZFswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBncHMgbGF0aXR1ZGUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRHcHNMb25naXR1ZGUoZW50cnkuZGF0YS5kWzFdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGdwcyBsb25naXR1ZGUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRHcHNBbHRpdHVkZShlbnRyeS5kYXRhLmRbMl0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZ3BzIGFsdGl0dWRlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0pQRUdfR1BTX1BST0NFU1NJTkdfTUVUSE9EKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9KUEVHX0dQU19QUk9DRVNTSU5HX01FVEhPRCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9zdHIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZW50cnkuZGF0YS51OCkpOworICAgICAgICBpZiAoIXNldEdwc1Byb2Nlc3NpbmdNZXRob2QobWV0aG9kX3N0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBncHMgcHJvY2Vzc2luZyBtZXRob2QgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGltZV9hdmFpbGFibGUgJiYgbWV0YWRhdGEuZXhpc3RzKEFORFJPSURfSlBFR19HUFNfVElNRVNUQU1QKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9KUEVHX0dQU19USU1FU1RBTVApOworICAgICAgICB0aW1lX3QgdGltZXN0YW1wID0gc3RhdGljX2Nhc3Q8dGltZV90PihlbnRyeS5kYXRhLmk2NFswXSk7CisgICAgICAgIGlmIChnbXRpbWVfcigmdGltZXN0YW1wLCAmdGltZV9pbmZvKSkgeworICAgICAgICAgICAgaWYgKCFzZXRHcHNUaW1lc3RhbXAodGltZV9pbmZvKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBncHMgdGltZXN0YW1wIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVGltZSB0cmFuZm9ybWF0aW9uIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXRpY0luZm8uZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRV9DT01QRU5TQVRJT05fU1RFUCkgJiYKKyAgICAgICAgICAgIG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQUVfRVhQT1NVUkVfQ09NUEVOU0FUSU9OKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX0VYUE9TVVJFX0NPTVBFTlNBVElPTik7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzdGVwRW50cnkgPQorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8uZmluZChBTkRST0lEX0NPTlRST0xfQUVfQ09NUEVOU0FUSU9OX1NURVApOworICAgICAgICBpZiAoIXNldEV4cG9zdXJlQmlhcyhlbnRyeS5kYXRhLmkzMlswXSwgc3RlcEVudHJ5LmRhdGEuclswXS5udW1lcmF0b3IsCisgICAgICAgICAgICAgICAgc3RlcEVudHJ5LmRhdGEuclswXS5kZW5vbWluYXRvcikpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBleHBvc3VyZSBiaWFzIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pOworICAgICAgICBpZiAoIXNldE9yaWVudGF0aW9uKGVudHJ5LmRhdGEuaTMyWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIG9yaWVudGF0aW9uIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfRVhQT1NVUkVfVElNRSk7CisgICAgICAgIGZsb2F0IGV4cG9zdXJlX3RpbWUgPSAxLjBmICogZW50cnkuZGF0YS5pNjRbMF0gLyAxZTk7CisgICAgICAgIGlmICghc2V0RXhwb3N1cmVUaW1lKGV4cG9zdXJlX3RpbWUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZXhwb3N1cmUgdGltZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2V0U2h1dHRlclNwZWVkKGV4cG9zdXJlX3RpbWUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgc2h1dHRlciBzcGVlZCBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9MRU5TX0ZPQ1VTX0RJU1RBTkNFKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRU5TX0ZPQ1VTX0RJU1RBTkNFKTsKKyAgICAgICAgaWYgKCFzZXRTdWJqZWN0RGlzdGFuY2UoZW50cnkuZGF0YS5mWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIHN1YmplY3QgZGlzdGFuY2UgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfU0VOU09SX1NFTlNJVElWSVRZKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfU0VOU0lUSVZJVFkpOworICAgICAgICBpbnQzMl90IGlzbyA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgcG9zdFJhd1NlbnNFbnRyeSA9CisgICAgICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfUE9TVF9SQVdfU0VOU0lUSVZJVFlfQk9PU1QpOworICAgICAgICBpZiAocG9zdFJhd1NlbnNFbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGlzbyA9IGlzbyAqIHBvc3RSYXdTZW5zRW50cnkuZGF0YS5pMzJbMF0gLyAxMDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNldElzb1NwZWVkUmF0aW5nKHN0YXRpY19jYXN0PHVpbnQxNl90Pihpc28pKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGlzbyByYXRpbmcgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfTEVOU19BUEVSVFVSRSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfTEVOU19BUEVSVFVSRSk7CisgICAgICAgIGlmICghc2V0Rk51bWJlcihlbnRyeS5kYXRhLmZbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgRiBudW1iZXIgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRBcGVydHVyZShlbnRyeS5kYXRhLmZbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgYXBlcnR1cmUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgdWludDE2X3Qga1NSR0JDb2xvclNwYWNlID0gMTsKKyAgICBpZiAoIXNldENvbG9yU3BhY2Uoa1NSR0JDb2xvclNwYWNlKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgY29sb3Igc3BhY2UgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGljSW5mby5leGlzdHMoQU5EUk9JRF9MRU5TX0lORk9fQVZBSUxBQkxFX0FQRVJUVVJFUykpIHsKKyAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0lORk9fQVZBSUxBQkxFX0FQRVJUVVJFUyk7CisgICAgICAgIGlmICghc2V0TWF4QXBlcnR1cmUoZW50cnkuZGF0YS5mWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIG1heCBhcGVydHVyZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0aWNJbmZvLmV4aXN0cyhBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKSkgeworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGZsYXNoU3RhdGVFbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9GTEFTSF9TVEFURSk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhZU1vZGVFbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX01PREUpOworICAgICAgICB1aW50OF90IGZsYXNoU3RhdGUgPSBmbGFzaFN0YXRlRW50cnkuY291bnQgPiAwID8KKyAgICAgICAgICAgICAgICBmbGFzaFN0YXRlRW50cnkuZGF0YS51OFswXSA6IEFORFJPSURfRkxBU0hfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgICAgIHVpbnQ4X3QgYWVNb2RlID0gYWVNb2RlRW50cnkuY291bnQgPiAwID8KKyAgICAgICAgICAgICAgICBhZU1vZGVFbnRyeS5kYXRhLnU4WzBdIDogQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT0ZGOworCisgICAgICAgIGlmICghc2V0Rmxhc2goZW50cnkuZGF0YS51OFswXSwgZmxhc2hTdGF0ZSwgYWVNb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGZsYXNoIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQVdCX01PREUpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfQVdCX01PREUpOworICAgICAgICBpZiAoIXNldFdoaXRlQmFsYW5jZShlbnRyeS5kYXRhLnU4WzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIHdoaXRlIGJhbGFuY2UgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRV9NT0RFKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX01PREUpOworICAgICAgICBpZiAoIXNldEV4cG9zdXJlTW9kZShlbnRyeS5kYXRhLnU4WzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGV4cG9zdXJlIG1vZGUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRpbWVfYXZhaWxhYmxlKSB7CisgICAgICAgIGNoYXIgc3RyWzRdOworICAgICAgICBpZiAoc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiUwM2xkIiwgdHAudHZfbnNlYyAvIDEwMDAwMDApIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdWJzZWMgaXMgaW52YWxpZDogJWxkIiwgX19GVU5DVElPTl9fLCB0cC50dl9uc2VjKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldFN1YnNlY1RpbWUoc3RkOjpzdHJpbmcoc3RyKSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBzdWJzZWMgdGltZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZDAyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9FWElGX1VUSUxTX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9FWElGX1VUSUxTX0gKKworI2luY2x1ZGUgIkNhbWVyYU1ldGFkYXRhLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworLyoKKyAqIE9yaWVudGF0aW9uIHZhbHVlOgorICogIDEgICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgICAgIDYgICAgICAgICAgNyAgICAgICAgICA4CisgKgorICogIDg4ODg4OCA4ODg4ODggICAgIDg4IDg4ICAgICA4ODg4ODg4ODg4IDg4ICAgICAgICAgICAgICAgICA4OCA4ODg4ODg4ODg4CisgKiAgODggICAgICAgICA4OCAgICAgODggODggICAgIDg4ICA4OCAgICAgODggIDg4ICAgICAgICAgODggIDg4ICAgICA4OCAgODgKKyAqICA4ODg4ICAgICA4ODg4ICAgODg4OCA4ODg4ICAgODggICAgICAgICA4ODg4ODg4ODg4IDg4ODg4ODg4ODggICAgICAgICA4OAorICogIDg4ICAgICAgICAgODggICAgIDg4IDg4CisgKiAgODggICAgICAgICA4OCA4ODg4ODggODg4ODg4CisgKi8KK2VudW0gRXhpZk9yaWVudGF0aW9uIDogdWludDE2X3QgeworICAgIE9SSUVOVEFUSU9OX1VOREVGSU5FRCAgID0gMHgwLAorICAgIE9SSUVOVEFUSU9OXzBfREVHUkVFUyAgID0gMHgxLAorICAgIE9SSUVOVEFUSU9OXzkwX0RFR1JFRVMgID0gMHg2LAorICAgIE9SSUVOVEFUSU9OXzE4MF9ERUdSRUVTID0gMHgzLAorICAgIE9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTID0gMHg4LAorfTsKKworLy8gVGhpcyBpcyBiYXNlZCBvbiB0aGUgY2FtZXJhIEhJREwgc2hpbSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggd2FzIGluIHR1cm5lZAorLy8gYmFzZWQgb24gb3JpZ2luYWwgQ2hyb21lT1MgQVJDIGltcGxlbWVudGF0aW9uIG9mIGEgVjRMMiBIQUwKKworLy8gRXhpZlV0aWxzIGNhbiBvdmVycmlkZSBBUFAxIHNlZ21lbnQgd2l0aCB0YWdzIHdoaWNoIGNhbGxlciBzZXQuIEV4aWZVdGlscyBjYW4KKy8vIGFsc28gYWRkIGEgdGh1bWJuYWlsIGluIHRoZSBBUFAxIHNlZ21lbnQgaWYgdGh1bWJuYWlsIHNpemUgaXMgc3BlY2lmaWVkLgorLy8gRXhpZlV0aWxzIGNhbiBiZSByZXVzZWQgd2l0aCBkaWZmZXJlbnQgaW1hZ2VzIGJ5IGNhbGxpbmcgaW5pdGlhbGl6ZSgpLgorLy8KKy8vIEV4YW1wbGUgb2YgdXNpbmcgdGhpcyBjbGFzcyA6CisvLyAgc3RkOjp1bmlxdWVfcHRyPEV4aWZVdGlscz4gdXRpbHMoRXhpZlV0aWxzOjpDcmVhdGUoKSk7CisvLyAgdXRpbHMtPmluaXRpYWxpemUoY29uc3QgdW5zaWduZWQgY2hhciogYXBwMVNlZ21lbnQsIHNpemVfdCBhcHAxU2VnbWVudFNpemUpOworLy8gIC4uLgorLy8gIC8vIENhbGwgRXhpZlV0aWxzIGZ1bmN0aW9ucyB0byBzZXQgRXhpZiB0YWdzLgorLy8gIC4uLgorLy8gIHV0aWxzLT5HZW5lcmF0ZUFwcDEoKTsKKy8vICB1bnNpZ25lZCBpbnQgYXBwMUxlbmd0aCA9IHV0aWxzLT5HZXRBcHAxTGVuZ3RoKCk7CisvLyAgdWludDhfdCogYXBwMUJ1ZmZlciA9IG5ldyB1aW50OF90W2FwcDFMZW5ndGhdOworLy8gIG1lbWNweShhcHAxQnVmZmVyLCB1dGlscy0+R2V0QXBwMUJ1ZmZlcigpLCBhcHAxTGVuZ3RoKTsKK2NsYXNzIEV4aWZVdGlscyB7CisKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5FeGlmVXRpbHMoKTsKKworICAgIHN0YXRpYyBFeGlmVXRpbHMqIGNyZWF0ZSgpOworCisgICAgLy8gSW5pdGlhbGl6ZSgpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFRoZSBzZXR0aW5nIG9mIEV4aWYgdGFncyB3aWxsIGJlCisgICAgLy8gY2xlYXJlZC4KKyAgICB2aXJ0dWFsIGJvb2wgaW5pdGlhbGl6ZShjb25zdCB1bnNpZ25lZCBjaGFyICphcHAxU2VnbWVudCwgc2l6ZV90IGFwcDFTZWdtZW50U2l6ZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpbml0aWFsaXplRW1wdHkoKSA9IDA7CisKKyAgICAvLyBTZXQgYWxsIGtub3duIGZpZWxkcyBmcm9tIGEgbWV0YWRhdGEgc3RydWN0dXJlCisgICAgdmlydHVhbCBib29sIHNldEZyb21NZXRhZGF0YShjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBpbWFnZVdpZHRoLCBjb25zdCBzaXplX3QgaW1hZ2VIZWlnaHQpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGxlbiBhcGVydHVyZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRBcGVydHVyZShmbG9hdCBhcGVydHVyZSkgPSAwOworCisgICAgLy8gc2V0cyB0aGUgY29sb3Igc3BhY2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Q29sb3JTcGFjZSh1aW50MTZfdCBjb2xvcl9zcGFjZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZGF0ZSBhbmQgdGltZSBvZiBpbWFnZSBsYXN0IG1vZGlmaWVkLiBJdCB0YWtlcyBsb2NhbCB0aW1lLiBUaGUKKyAgICAvLyBuYW1lIG9mIHRoZSB0YWcgaXMgRGF0ZVRpbWUgaW4gSUZEMC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXREYXRlVGltZShjb25zdCBzdHJ1Y3QgdG0mIHQpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGRpZ2l0YWwgem9vbSByYXRpby4gSWYgdGhlIG51bWVyYXRvciBpcyAwLCBpdCBtZWFucyBkaWdpdGFsIHpvb20KKyAgICAvLyB3YXMgbm90IHVzZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGlnaXRhbFpvb21SYXRpbyh1aW50MzJfdCBjcm9wX3dpZHRoLCB1aW50MzJfdCBjcm9wX2hlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IHNlbnNvcl93aWR0aCwgdWludDMyX3Qgc2Vuc29yX2hlaWdodCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZXhwb3N1cmUgYmlhcy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZUJpYXMoaW50MzJfdCBldiwKKyAgICAgICAgICAgIHVpbnQzMl90IGV2X3N0ZXBfbnVtZXJhdG9yLCB1aW50MzJfdCBldl9zdGVwX2Rlbm9taW5hdG9yKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBleHBvc3VyZSBtb2RlIHNldCB3aGVuIHRoZSBpbWFnZSB3YXMgc2hvdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZU1vZGUodWludDhfdCBleHBvc3VyZV9tb2RlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBleHBvc3VyZSB0aW1lLCBnaXZlbiBpbiBzZWNvbmRzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlVGltZShmbG9hdCBleHBvc3VyZV90aW1lKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBzdGF0dXMgb2YgZmxhc2guCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rmxhc2godWludDhfdCBmbGFzaF9hdmFpbGFibGUsIHVpbnQ4X3QgZmxhc2hfc3RhdGUsIHVpbnQ4X3QgYWVfbW9kZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgRiBudW1iZXIuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rk51bWJlcihmbG9hdCBmX251bWJlcikgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZm9jYWwgbGVuZ3RoIG9mIGxlbnMgdXNlZCB0byB0YWtlIHRoZSBpbWFnZSBpbiBtaWxsaW1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGb2NhbExlbmd0aChmbG9hdCBmb2NhbF9sZW5ndGgpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGZvY2FsIGxlbmd0aCBvZiBsZW5zIGZvciAzNW1tIGZpbG0gdXNlZCB0byB0YWtlIHRoZSBpbWFnZSBpbiBtaWxsaW1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGb2NhbExlbmd0aEluMzVtbUZpbG0oZmxvYXQgZm9jYWxfbGVuZ3RoLAorICAgICAgICAgICAgZmxvYXQgc2Vuc29yX3NpemVfeCwgZmxvYXQgc2Vuc29yX3NpemVfeSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgYWx0aXR1ZGUgaW4gbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0FsdGl0dWRlKGRvdWJsZSBhbHRpdHVkZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgbGF0aXR1ZGUgd2l0aCBkZWdyZWVzIG1pbnV0ZXMgc2Vjb25kcyBmb3JtYXQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzTGF0aXR1ZGUoZG91YmxlIGxhdGl0dWRlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBsb25naXR1ZGUgd2l0aCBkZWdyZWVzIG1pbnV0ZXMgc2Vjb25kcyBmb3JtYXQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzTG9uZ2l0dWRlKGRvdWJsZSBsb25naXR1ZGUpID0gMDsKKworICAgIC8vIFNldHMgR1BTIHByb2Nlc3NpbmcgbWV0aG9kLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc1Byb2Nlc3NpbmdNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCkgPSAwOworCisgICAgLy8gU2V0cyBHUFMgZGF0ZSBzdGFtcCBhbmQgdGltZSBzdGFtcCAoYXRvbWljIGNsb2NrKS4gSXQgdGFrZXMgVVRDIHRpbWUuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzVGltZXN0YW1wKGNvbnN0IHN0cnVjdCB0bSYgdCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgaGVpZ2h0IChudW1iZXIgb2Ygcm93cykgb2YgbWFpbiBpbWFnZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJbWFnZUhlaWdodCh1aW50MzJfdCBsZW5ndGgpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHdpZHRoIChudW1iZXIgb2YgY29sdW1ucykgb2YgbWFpbiBpbWFnZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJbWFnZVdpZHRoKHVpbnQzMl90IHdpZHRoKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBJU08gc3BlZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SXNvU3BlZWRSYXRpbmcodWludDE2X3QgaXNvX3NwZWVkX3JhdGluZ3MpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHNtYWxsZXN0IEYgbnVtYmVyIG9mIHRoZSBsZW5zLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE1heEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKSA9IDA7CisKKyAgICAvLyBTZXRzIGltYWdlIG9yaWVudGF0aW9uLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE9yaWVudGF0aW9uKHVpbnQxNl90IGRlZ3JlZXMpID0gMDsKKworICAgIC8vIFNldHMgaW1hZ2Ugb3JpZW50YXRpb24uCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0T3JpZW50YXRpb25WYWx1ZShFeGlmT3JpZW50YXRpb24gb3JpZW50YXRpb25WYWx1ZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgc2h1dHRlciBzcGVlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTaHV0dGVyU3BlZWQoZmxvYXQgZXhwb3N1cmVfdGltZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZGlzdGFuY2UgdG8gdGhlIHN1YmplY3QsIGdpdmVuIGluIG1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTdWJqZWN0RGlzdGFuY2UoZmxvYXQgZGlvcHRlcnMpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGZvciB0aGUgPERhdGVUaW1lPiB0YWcuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3Vic2VjVGltZShjb25zdCBzdGQ6OnN0cmluZyYgc3Vic2VjX3RpbWUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHdoaXRlIGJhbGFuY2UgbW9kZSBzZXQgd2hlbiB0aGUgaW1hZ2Ugd2FzIHNob3QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0V2hpdGVCYWxhbmNlKHVpbnQ4X3Qgd2hpdGVfYmxhbmFjZSkgPSAwOworCisgICAgLy8gR2VuZXJhdGVzIEFQUDEgc2VnbWVudC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGdlbmVyYXRpbmcgQVBQMSBzZWdtZW50IGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBnZW5lcmF0ZUFwcDEoKSA9IDA7CisKKyAgICAvLyBHZXRzIGJ1ZmZlciBvZiBBUFAxIHNlZ21lbnQuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgY2FsbGluZworICAgIC8vIEdlbmVyYXRlQVBQMSgpLgorICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCogZ2V0QXBwMUJ1ZmZlcigpID0gMDsKKworICAgIC8vIEdldHMgbGVuZ3RoIG9mIEFQUDEgc2VnbWVudC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBjYWxsaW5nCisgICAgLy8gR2VuZXJhdGVBUFAxKCkuCisgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0QXBwMUxlbmd0aCgpID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0VYSUZfVVRJTFNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAppbmRleCBjMGEzNTNmLi5mNGM0OWVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcApAQCAtNDksNyArNDksOCBAQAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Nb25pdG9yTXV0ZXgpOwogCiAgICAgLy8gRXhwYW5kIHNob3J0aGFuZHMKLSAgICBpZiAoc3NpemVfdCBpZHggPSB0YWdOYW1lcy5maW5kKCIzYSIpICE9IC0xKSB7CisgICAgc3NpemVfdCBpZHggPSB0YWdOYW1lcy5maW5kKCIzYSIpOworICAgIGlmIChpZHggIT0gLTEpIHsKICAgICAgICAgc3NpemVfdCBlbmQgPSB0YWdOYW1lcy5maW5kKCIsIiwgaWR4KTsKICAgICAgICAgY2hhciogc3RhcnQgPSB0YWdOYW1lcy5sb2NrQnVmZmVyKHRhZ05hbWVzLnNpemUoKSk7CiAgICAgICAgIHN0YXJ0W2lkeF0gPSAnXDAnOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggNGIwNTM5NS4uMDZiYWFjOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtNTAsNyArNTEsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KQEAgLTc2LDE1ICs3NiwxOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLSAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKLSAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y29udGVudDo6cG07Ci0KIC8vIGluZGl2aWR1YWwgcmVjb3JkcyBrZXB0IGluIG1lbW9yeTogYWdlIG9yIGNvdW50Ci0vLyBhZ2U6IDw9IDM2IGhvdXJzICgxLjUgZGF5cykKKy8vIGFnZTogPD0gMjggaG91cnMgKDEgMS82IGRheXMpCiAvLyBjb3VudDogaGFyZCBsaW1pdCBvZiAjIHJlY29yZHMKIC8vICgwIGZvciBlaXRoZXIgb2YgdGhlc2UgZGlzYWJsZXMgdGhhdCB0aHJlc2hvbGQpCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4UmVjb3JkQWdlTnMgPSAgMzYgKiAzNjAwICogKDEwMDAqMTAwMCoxMDAwbGwpOwotc3RhdGljIGNvbnN0IGludCBrTWF4UmVjb3JkcyAgICA9IDA7CisvLworc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtNYXhSZWNvcmRBZ2VOcyA9ICAyOCAqIDM2MDAgKiAoMTAwMCoxMDAwKjEwMDBsbCk7CitzdGF0aWMgY29uc3RleHByIGludCBrTWF4UmVjb3JkcyAgICA9IDA7CisKKy8vIG1heCB3ZSBleHBpcmUgaW4gYSBzaW5nbGUgY2FsbCwgdG8gY29uc3RyYWluIGhvdyBsb25nIHdlIGhvbGQgdGhlCisvLyBtdXRleCwgd2hpY2ggYWxzbyBjb25zdHJhaW5zIGhvdyBsb25nIGEgY2xpZW50IG1pZ2h0IHdhaXQuCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4RXhwaXJlZEF0T25jZSA9IDUwOworCisvLyBUT0RPOiBuZWVkIHRvIGxvb2sgYXQgdHVuaW5nIGtNYXhSZWNvcmRzIGFuZCBmcmllbmRzIGZvciBsb3ctbWVtb3J5IGRldmljZXMKIAogc3RhdGljIGNvbnN0IGNoYXIgKmtTZXJ2aWNlTmFtZSA9ICJtZWRpYS5tZXRyaWNzIjsKIApAQCAtOTYsNiArMTAwLDcgQEAKIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6TWVkaWFBbmFseXRpY3NTZXJ2aWNlKCkKICAgICAgICAgOiBtTWF4UmVjb3JkcyhrTWF4UmVjb3JkcyksCiAgICAgICAgICAgbU1heFJlY29yZEFnZU5zKGtNYXhSZWNvcmRBZ2VOcyksCisgICAgICAgICAgbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlKGtNYXhFeHBpcmVkQXRPbmNlKSwKICAgICAgICAgICBtRHVtcFByb3RvKE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjEpLAogICAgICAgICAgIG1EdW1wUHJvdG9EZWZhdWx0KE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjEpIHsKIApAQCAtNDMyLDIzICs0MzcsMjkgQEAKIC8vCiAvLyBPdXIgQ2hlYXAgaW4tY29yZSwgbm9uLXBlcnNpc3RlbnQgcmVjb3JkcyBtYW5hZ2VtZW50LgogCi0vLyBpbnNlcnQgYXBwcm9wcmlhdGVseSBpbnRvIHF1ZXVlCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2F2ZUl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtICogaXRlbSkKKworLy8gd2UgaG9sZCBtTG9jayB3aGVuIHdlIGdldCBoZXJlCisvLyBpZiBpdGVtICE9IE5VTEwsIGl0J3MgdGhlIGl0ZW0gd2UganVzdCBpbnNlcnRlZAorLy8gdHJ1ZSA9PSBtb3JlIGl0ZW1zIGVsaWdpYmxlIHRvIGJlIHJlY292ZXJlZAorYm9vbCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OmV4cGlyYXRpb25zX2woTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKQogewotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAvLyBtdXRleCBiZXR3ZWVuIGluc2VydGlvbiBhbmQgZHVtcGluZyB0aGUgY29udGVudHMKLQotICAgIC8vIHdlIHdhbnQgdG8gZHVtcCAnaW4gRklGTyBvcmRlcicsIHNvIGluc2VydCBhdCB0aGUgZW5kCi0gICAgbUl0ZW1zLnB1c2hfYmFjayhpdGVtKTsKKyAgICBib29sIG1vcmUgPSBmYWxzZTsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CiAKICAgICAvLyBrZWVwIHJlbW92aW5nIG9sZCByZWNvcmRzIHRoZSBmcm9udCB1bnRpbCB3ZSdyZSBpbi1ib3VuZHMgKGNvdW50KQorICAgIC8vIHNpbmNlIHdlIGludm9rZSB0aGlzIHdpdGggZWFjaCBpbnNlcnRpb24sIGl0IHNob3VsZCBiZSAwLzEgaXRlcmF0aW9ucy4KICAgICBpZiAobU1heFJlY29yZHMgPiAwKSB7CiAgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gKHNpemVfdCkgbU1heFJlY29yZHMpIHsKICAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqIG9pdGVtID0gKihtSXRlbXMuYmVnaW4oKSk7CiAgICAgICAgICAgICBpZiAob2l0ZW0gPT0gaXRlbSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhbmRsZWQgPj0gbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5saWtlbHkgaW4gdGhpcyBsb29wCisgICAgICAgICAgICAgICAgbW9yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkKys7CiAgICAgICAgICAgICBtSXRlbXMuZXJhc2UobUl0ZW1zLmJlZ2luKCkpOwogICAgICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CkBAIC00NTYsOCArNDY3LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoY291bnQpCi0gICAgLy8gTkI6IGV4cGlyZWQgZW50cmllcyBhcmVuJ3QgcmVtb3ZlZCB1bnRpbCB0aGUgbmV4dCBpbnNlcnRpb24sIHdoaWNoIGNvdWxkIGJlIGEgd2hpbGUKKyAgICAvLyBrZWVwIHJlbW92aW5nIG9sZCByZWNvcmRzIHRoZSBmcm9udCB1bnRpbCB3ZSdyZSBpbi1ib3VuZHMgKGFnZSkKKyAgICAvLyBsaW1pdGVkIHRvIG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZSBpdGVtcyBwZXIgaW52b2NhdGlvbi4KICAgICBpZiAobU1heFJlY29yZEFnZU5zID4gMCkgewogICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpOwogICAgICAgICB3aGlsZSAobUl0ZW1zLnNpemUoKSA+IDApIHsKQEAgLTQ3MSwxOCArNDgyLDcyIEBACiAgICAgICAgICAgICAgICAgLy8gdGhpcyAoYW5kIHRoZSByZXN0KSBhcmUgcmVjZW50IGVub3VnaCB0byBrZWVwCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlZCA+PSBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2UpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcHJlc2VudHMgIm9uZSB0b28gbWFueSI7IHRlbGwgY2FsbGVyIHRoZXJlIGFyZQorICAgICAgICAgICAgICAgIC8vIG1vcmUgdG8gYmUgcmVjbGFpbWVkLgorICAgICAgICAgICAgICAgIG1vcmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlZCsrOwogICAgICAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkRXhwaXJlKys7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvLyB3ZSBvbmx5IGluZGljYXRlIHdoZXRoZXIgdGhlcmUncyBtb3JlIHRvIGNsZWFuOworICAgIC8vIGNhbGxlciBjaG9vc2VzIHdoZXRoZXIgdG8gc2NoZWR1bGUgZnVydGhlciBjbGVhbnVwLgorICAgIHJldHVybiBtb3JlOworfQorCisvLyBwcm9jZXNzIGV4cGlyYXRpb25zIGluIGJpdGUgc2l6ZWQgY2h1bmtzLCBhbGxvd2luZyBuZXcgaW5zZXJ0aW9ucyB0aHJvdWdoCisvLyBydW5zIGluIGEgcHRocmVhZCBzcGVjaWZpY2FsbHkgc3RhcnRlZCBmb3IgdGhpcyAod2hpY2ggdGhlbiBleGl0cykKK2Jvb2wgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpwcm9jZXNzRXhwaXJhdGlvbnMoKQoreworICAgIGJvb2wgbW9yZTsKKyAgICBkbyB7CisgICAgICAgIHNsZWVwKDEpOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAgICAgbW9yZSA9IGV4cGlyYXRpb25zX2woTlVMTCk7CisgICAgICAgICAgICBpZiAoIW1vcmUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKG1vcmUpOworICAgIHJldHVybiB0cnVlOyAgICAgICAgLy8gdmFsdWUgaXMgZm9yIHN0ZDo6ZnV0dXJlIHRocmVhZCBzeW5jaHJvbml6YXRpb24KK30KKworLy8gaW5zZXJ0IGFwcHJvcHJpYXRlbHkgaW50byBxdWV1ZQordm9pZCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqIGl0ZW0pCit7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIG11dGV4IGJldHdlZW4gaW5zZXJ0aW9uIGFuZCBkdW1waW5nIHRoZSBjb250ZW50cworCisgICAgLy8gd2Ugd2FudCB0byBkdW1wICdpbiBGSUZPIG9yZGVyJywgc28gaW5zZXJ0IGF0IHRoZSBlbmQKKyAgICBtSXRlbXMucHVzaF9iYWNrKGl0ZW0pOworCisgICAgLy8gY2xlYW4gb2xkIHN0dWZmIGZyb20gdGhlIHF1ZXVlCisgICAgYm9vbCBtb3JlID0gZXhwaXJhdGlvbnNfbChpdGVtKTsKKworICAgIC8vIGNvbnNpZGVyIHNjaGVkdWxpbmcgc29tZSBhc3luY2hyb25vdXMgY2xlYW5pbmcsIGlmIG5vdCBydW5uaW5nCisgICAgaWYgKG1vcmUpIHsKKyAgICAgICAgaWYgKCFtRXhwaXJlRnV0dXJlLnZhbGlkKCkKKyAgICAgICAgICAgIHx8IG1FeHBpcmVGdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMCkpID09IHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpIHsKKworICAgICAgICAgICAgbUV4cGlyZUZ1dHVyZSA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCBbdGhpc10oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiB0aGlzLT5wcm9jZXNzRXhwaXJhdGlvbnMoKTt9KTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIHN0ZDo6c3RyaW5nIGFsbG93ZWRLZXlzW10gPQogewogICAgICJhdWRpb3BvbGljeSIsCiAgICAgImF1ZGlvcmVjb3JkIiwKKyAgICAiYXVkaW90aHJlYWQiLAogICAgICJhdWRpb3RyYWNrIiwKICAgICAiY29kZWMiLAogICAgICJleHRyYWN0b3IiLApAQCAtNTgxLDcgKzY0Niw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYmluZGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNwPElQYWNrYWdlTWFuYWdlck5hdGl2ZT4gcGFja2FnZV9tZ3IgPSBpbnRlcmZhY2VfY2FzdDxJUGFja2FnZU1hbmFnZXJOYXRpdmU+KGJpbmRlcik7CisgICAgICAgICAgICBzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBwYWNrYWdlX21nciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4oYmluZGVyKTsKICAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1czsKIAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiB1aWRzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaAppbmRleCBiM2M5MDJhLi42MzJjNjkyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKKyNpbmNsdWRlIDxmdXR1cmU+CisKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQ0LDYgKzQ2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUFuYWx5dGljc1NlcnZpY2UoKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TWVkaWFBbmFseXRpY3NTZXJ2aWNlKCk7CiAKKyAgICBib29sIHByb2Nlc3NFeHBpcmF0aW9ucygpOworCiAgcHJpdmF0ZToKICAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRF90IGdlbmVyYXRlVW5pcXVlU2Vzc2lvbklEKCk7CiAKQEAgLTY1LDYgKzY5LDggQEAKICAgICBpbnQzMl90IG1NYXhSZWNvcmRzOwogICAgIC8vIGJ5IHRpbWUgKG5vbmUgb2xkZXIgdGhhbiB0aGlzIGxvbmcgYWdhbgogICAgIG5zZWNzX3QgbU1heFJlY29yZEFnZU5zOworICAgIC8vIG1heCB0byBleHBpcmUgcGVyIGV4cGlyYXRpb25zX2woKSBpbnZvY2F0aW9uCisgICAgaW50MzJfdCBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2U7CiAgICAgLy8KICAgICAvLyAjIG9mIHNldHMgb2Ygc3VtbWFyaWVzCiAgICAgaW50MzJfdCBtTWF4UmVjb3JkU2V0czsKQEAgLTc5LDYgKzg1LDkgQEAKICAgICBMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiBtSXRlbXM7CiAgICAgdm9pZCBzYXZlSXRlbShNZWRpYUFuYWx5dGljc0l0ZW0gKik7CiAKKyAgICBib29sIGV4cGlyYXRpb25zX2woTWVkaWFBbmFseXRpY3NJdGVtICopOworICAgIHN0ZDo6ZnV0dXJlPGJvb2w+IG1FeHBpcmVGdXR1cmU7CisKICAgICAvLyBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIG91dHB1dAogICAgIGludCBtRHVtcFByb3RvOwogICAgIGludCBtRHVtcFByb3RvRGVmYXVsdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWMzNmZhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjIgQEAKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogIm1lZGlhc3djb2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1haW5fc3djb2RlY3NlcnZpY2UuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF2c2VydmljZXNfbWluaWphaWwiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKKyAgICBdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIHZlbmRvcjogeworICAgICAgICAgICAgZXhjbHVkZV9zaGFyZWRfbGliczogWyJsaWJhdnNlcnZpY2VzX21pbmlqYWlsIl0sCisgICAgICAgICAgICBzaGFyZWRfbGliczogWyJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciJdLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsibWVkaWFzd2NvZGVjLnJjIl0sCisKKyAgICByZXF1aXJlZDogWyJtZWRpYXN3Y29kZWMucG9saWN5Il0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIHNjdWRvOiB0cnVlLAorICAgIH0sCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogIm1lZGlhc3djb2RlYy5wb2xpY3kiLAorICAgIHN1Yl9kaXI6ICJzZWNjb21wX3BvbGljeSIsCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIHNyYzogInNlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICAgICAgYXJtNjQ6IHsKKyAgICAgICAgICAgIHNyYzogInNlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kiLAorICAgICAgICB9LAorICAgICAgICB4ODY6IHsKKyAgICAgICAgICAgIHNyYzogInNlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeSIsCisgICAgICAgIH0sCisgICAgICAgIHg4Nl82NDogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIHJlcXVpcmVkOiBbImNyYXNoX2R1bXAucG9saWN5Il0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKaW5kZXggZGI1ZjBmZi4uOWNjMTlhMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tawpAQCAtMjcsOCArMjcsOCBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAjIHNlY2NvbXAgaXMgbm90IHJlcXVpcmVkIGZvciBjb3ZlcmFnZSBidWlsZC4KIGlmbmVxICgkKE5BVElWRV9DT1ZFUkFHRSksdHJ1ZSkKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtIDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhY29kZWMucG9saWN5Ci1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWNvZGVjLnBvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm0gOj0gbWVkaWFjb2RlYy5wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2IDo9IG1lZGlhY29kZWMucG9saWN5CiBlbmRpZgogTE9DQUxfU1JDX0ZJTEVTIDo9IG1haW5fY29kZWNzZXJ2aWNlLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCkBAIC02MywxMiArNjMsMTUgQEAKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKICMgc2VydmljZSBzZWNjb21wIHBvbGljeQogaWZlcSAoJChUQVJHRVRfQVJDSCksICQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCB4ODYgeDg2XzY0IGFybSBhcm02NCkpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSBtZWRpYWNvZGVjLnBvbGljeQogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUKS9ldGMvc2VjY29tcF9wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kKICMgbWVkaWFjb2RlYyBydW5zIGluIDMyLWJpdCBjb21iYXRpYmlsaXR5IG1vZGUuIEZvciA2NCBiaXQgYXJjaGl0ZWN0dXJlcywKICMgdXNlIHRoZSAzMiBiaXQgcG9saWN5CiBpZmRlZiBUQVJHRVRfMk5EX0FSQ0gKQEAgLTgzLDQgKzg2LDcgQEAKIGluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKIGVuZGlmCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKwogaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwgJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKaW5kZXggNTE2MTlmNi4uNmQ0N2JlNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKQEAgLTQ4LDM3ICs0OCwyMSBAQAogCiAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOwogCi0gICAgLy8gUmVnaXN0cmF0aW9uIG9mIGN1c3RvbWl6ZWQgY29kZWMgc2VydmljZXMKLSAgICB2b2lkICpyZWdpc3RyYW50TGliID0gZGxvcGVuKAotICAgICAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iLAotICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKLSAgICBpZiAocmVnaXN0cmFudExpYikgewotICAgICAgICBSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jPigKLSAgICAgICAgICAgICAgICBkbHN5bShyZWdpc3RyYW50TGliLCAiUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIikpOwotICAgICAgICBpZiAocmVnaXN0ZXJDb2RlY1NlcnZpY2VzKSB7Ci0gICAgICAgICAgICByZWdpc3RlckNvZGVjU2VydmljZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIGFkZGl0aW9uYWwgc2VydmljZXMgIgotICAgICAgICAgICAgICAgICAgICAiLS0gY29ycnVwdGVkIGxpYnJhcnkuIjsKLSAgICAgICAgfQorICAgIC8vIERlZmF1bHQgY29kZWMgc2VydmljZXMKKyAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICBzcDxJT214U3RvcmU+IG9teFN0b3JlID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXhTdG9yZSgpOworICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjcmVhdGUgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIGlmIChvbXhTdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7CisgICAgfQorICAgIHNwPElPbXg+IG9teCA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214KCk7CisgICAgaWYgKG9teCA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjcmVhdGUgSU9teCBIQUwgc2VydmljZS4iOworICAgIH0gZWxzZSBpZiAob214LT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214IEhBTCBzZXJ2aWNlLiI7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRGVmYXVsdCBjb2RlYyBzZXJ2aWNlcwotICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKLSAgICAgICAgc3A8SU9teFN0b3JlPiBvbXhTdG9yZSA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214U3RvcmUoKTsKLSAgICAgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjcmVhdGUgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfQotICAgICAgICBzcDxJT214PiBvbXggPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teCgpOwotICAgICAgICBpZiAob214ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjcmVhdGUgSU9teCBIQUwgc2VydmljZS4iOwotICAgICAgICB9IGVsc2UgaWYgKG9teC0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXggSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiSU9teCBIQUwgc2VydmljZSBjcmVhdGVkLiI7Ci0gICAgICAgIH0KKyAgICAgICAgTE9HKElORk8pIDw8ICJJT214IEhBTCBzZXJ2aWNlIGNyZWF0ZWQuIjsKICAgICB9CiAKICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9zd2NvZGVjc2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0YmUyOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9zd2NvZGVjc2VydmljZS5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKy8vIGZyb20gTE9DQUxfQ19JTkNMVURFUworI2luY2x1ZGUgIm1pbmlqYWlsLmgiCisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8ga1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoIHBvaW50cyB0byB0aGUgcG9saWN5IGZvciB0aGUgc3djb2RlY3MgdGhlbXNlbHZlcyBhbmQKKy8vIGlzIHBhcnQgb2YgdGhlIHVwZGF0ZXMuIGtWZW5kb3JTZWNjb21wUG9saWN5UGF0aCBwb2ludHMgdG8gYW55IGFkZGl0aW9uYWwKKy8vIHBvbGljaWVzIHRoYXQgdGhlIHZlbmRvciBtYXkgbmVlZCBmb3IgdGhlIGRldmljZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMvZXRjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy5wb2xpY3kiOworc3RhdGljIGNvbnN0IGNoYXIga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLnBvbGljeSI7CisKKy8vIERpc2FibGUgU2N1ZG8ncyBtaXNtYXRjaCBhbGxvY2F0aW9uIGNoZWNrLCBhcyBpdCBpcyBiZWluZyB0cmlnZ2VyZWQKKy8vIGJ5IHNvbWUgdGhpcmQgcGFydHkgY29kZS4KK2V4dGVybiAiQyIgY29uc3QgY2hhciAqX19zY3Vkb19kZWZhdWx0X29wdGlvbnMoKSB7CisgICAgcmV0dXJuICJEZWFsbG9jYXRpb25UeXBlTWlzbWF0Y2g9ZmFsc2UiOworfQorCitleHRlcm4gIkMiIHZvaWQgUmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCk7CisKK2ludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogLyphcmd2Ki8pCit7CisgICAgTE9HKElORk8pIDw8ICJtZWRpYSBzd2NvZGVjIHNlcnZpY2Ugc3RhcnRpbmciOworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAgICBTZXRVcE1pbmlqYWlsKGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aCwga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoKTsKKworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNjQsIGZhbHNlKTsKKworICAgIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2woKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0OTY2NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjCkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBtZWRpYS5zd2NvZGVjIC9zeXN0ZW0vYmluL21lZGlhc3djb2RlYworICAgIGNsYXNzIG1haW4KKyAgICB1c2VyIG1lZGlhY29kZWMKKyAgICBncm91cCBjYW1lcmEgZHJtcnBjIG1lZGlhZHJtCisgICAgdXBkYXRhYmxlCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzBkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDU1IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIC8vIENvZGVjcworICAgIHJ1bnRpbWVfbGliczogWworICAgICAgICAibGliY29kZWMyX3NvZnRfYXZjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYWFjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaGV2Y2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9nNzExbWxhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2gyNjNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXBlZzRkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXBlZzRlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXAzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X29wdXNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA4ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hdjFkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA4ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9yYXdkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZmxhY2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9mbGFjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2dzbWRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF94YWFjZGVjIiwKKyAgICBdLAorfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZWJlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjU2VydmljZVJlZ2lzdHJhbnQiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CisKK2V4dGVybiAiQyIgdm9pZCBSZWdpc3RlckNvZGVjU2VydmljZXMoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKKyAgICBMT0coSU5GTykgPDwgIkNyZWF0aW5nIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLi4uIjsKKyAgICBhbmRyb2lkOjpzcDxJQ29tcG9uZW50U3RvcmU+IHN0b3JlID0KKyAgICAgICAgbmV3IHV0aWxzOjpDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBzb2Z0d2FyZSBDb2RlYzIgc2VydmljZS4iOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoInNvZnR3YXJlIikgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWdpc3RlciBzb2Z0d2FyZSBDb2RlYzIgc2VydmljZS4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKElORk8pIDw8CisgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZSBDb2RlYzIgc2VydmljZSBjcmVhdGVkLiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKaW5kZXggYjRmNWVlOS4uODQ1Zjg0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKQEAgLTE4LDE0ICsxOCwyMCBAQAogb3BlbmF0OiAxCiBvcGVuOiAxCiBnZXR1aWQzMjogMQorZ2V0dWlkOiAxCitnZXRybGltaXQ6IDEKIHdyaXRldjogMQogaW9jdGw6IDEKIGNsb3NlOiAxCiBtbWFwMjogMQorbW1hcDogMQogZnN0YXQ2NDogMQorZnN0YXQ6IDEKIHN0YXQ2NDogMQorc3RhdGZzNjQ6IDEKIG1hZHZpc2U6IDEKIGZzdGF0YXQ2NDogMQorbmV3ZnN0YXRhdDogMQogZnV0ZXg6IDEKIG11bm1hcDogMQogZmFjY2Vzc2F0OiAxCkBAIC00Miw2ICs0OCw3IEBACiByZWFkbGlua2F0OiAxCiBfbGxzZWVrOiAxCiBmc3RhdGZzNjQ6IDEKK2ZzdGF0ZnM6IDEKIHByZWFkNjQ6IDEKIG1yZW1hcDogMQogZHVwOiAxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmNlZGJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeQpAQCAtMCwwICsxLDYzIEBACisjIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmdXRleDogMQorIyBpb2N0bCBjYWxscyBhcmUgZmlsdGVyZWQgdmlhIHRoZSBzZWxpbnV4IHBvbGljeS4KK2lvY3RsOiAxCitzY2hlZF95aWVsZDogMQorY2xvc2U6IDEKK2R1cDogMQorcHBvbGw6IDEKK21wcm90ZWN0OiBhcmcyIGluIH5QUk9UX0VYRUMgfHwgYXJnMiBpbiB+UFJPVF9XUklURQorbW1hcDI6IGFyZzIgaW4gflBST1RfRVhFQyB8fCBhcmcyIGluIH5QUk9UX1dSSVRFCittZW1mZF9jcmVhdGU6IDEKK2Z0cnVuY2F0ZTogMQorZnRydW5jYXRlNjQ6IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorcHJjdGw6IDEKK2dldHVpZDMyOiAxCit3cml0ZXY6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorZXhpdDogMQorbHNlZWs6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitvcGVuYXQ6IDEKK2ZzdGF0NjQ6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKK3NldHByaW9yaXR5OiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK2dldGRlbnRzNjQ6IDEKK3JlYWRsaW5rYXQ6IDEKK3JlYWQ6IDEKK3ByZWFkNjQ6IDEKK2ZzdGF0ZnM2NDogMQorZ2V0dGltZW9mZGF5OiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZXhpdF9ncm91cDogMQorcmVzdGFydF9zeXNjYWxsOiAxCitydF9zaWdyZXR1cm46IDEKK2dldHJhbmRvbTogMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZWNhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKQEAgLTAsMCArMSw2NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZnV0ZXg6IDEKKyMgaW9jdGwgY2FsbHMgYXJlIGZpbHRlcmVkIHZpYSB0aGUgc2VsaW51eCBwb2xpY3kuCitpb2N0bDogMQorc2NoZWRfeWllbGQ6IDEKK2Nsb3NlOiAxCitkdXA6IDEKK3Bwb2xsOiAxCittcHJvdGVjdDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK21tYXA6IGFyZzIgaW4gflBST1RfRVhFQyB8fCBhcmcyIGluIH5QUk9UX1dSSVRFCitnZXR1aWQ6IDEKK2dldHJsaW1pdDogMQorZnN0YXQ6IDEKK25ld2ZzdGF0YXQ6IDEKK2ZzdGF0ZnM6IDEKK21lbWZkX2NyZWF0ZTogMQorZnRydW5jYXRlOiAxCitmdHJ1bmNhdGU2NDogMQorCisjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAorIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CisjIHxvbGRfYWRkcmVzc3wgYW5kIHxuZXdfYWRkcmVzc3wgZnJvbSB0b3VjaGluZyB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLCB3aGljaAorIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQorIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCisjIGZvciBtb3JlIGRldGFpbHMuCittcmVtYXA6IGFyZzMgPT0gMworbXVubWFwOiAxCitwcmN0bDogMQord3JpdGV2OiAxCitzaWdhbHRzdGFjazogMQorY2xvbmU6IDEKK2V4aXQ6IDEKK2xzZWVrOiAxCitydF9zaWdwcm9jbWFzazogMQorb3BlbmF0OiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCitzZXRwcmlvcml0eTogMQorc2V0X3RpZF9hZGRyZXNzOiAxCitnZXRkZW50czY0OiAxCityZWFkbGlua2F0OiAxCityZWFkOiAxCitwcmVhZDY0OiAxCitnZXR0aW1lb2ZkYXk6IDEKK2ZhY2Nlc3NhdDogMQorZXhpdF9ncm91cDogMQorcmVzdGFydF9zeXNjYWxsOiAxCitydF9zaWdyZXR1cm46IDEKK2dldHJhbmRvbTogMQorbWFkdmlzZTogMQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYjI1OTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeQpAQCAtMCwwICsxIEBACittZWRpYWNvZGVjLXg4Ni5wb2xpY3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODZfNjQucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYjI1OTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeQpAQCAtMCwwICsxIEBACittZWRpYWNvZGVjLXg4Ni5wb2xpY3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawppbmRleCBlODcwOTY1Li4yMjdhMjlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKQEAgLTI5LDcgKzI5LDggQEAKICAgICBsaWJoaWRsbWVtb3J5IFwKICAgICBsaWJoaWRsdHJhbnNwb3J0IFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMQorICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yCiAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKaW5kZXggNTM0Mjg5OC4uZmQzNGQ1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCkBAIC00LDEwICs0LDkgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBcCi0gICAgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcCBcCisgICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAogCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm1lZGlhIGxpYnN0YWdlZnJpZ2h0IGxpYmJpbmRlciBsaWJ1dGlscyBsaWJsb2cKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlic3RhZ2VmcmlnaHQgbGliYmluZGVyIGxpYnV0aWxzCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIApAQCAtMTgsMjggKzE3LDE2IEBACiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtNjQgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFleHRyYWN0b3IucG9saWN5CiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLQotIyBleHRyYWN0b3IgbGlicmFyaWVzCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTICs9IFwKLSAgICBsaWJhYWNleHRyYWN0b3IgXAotICAgIGxpYmFtcmV4dHJhY3RvciBcCi0gICAgbGliZmxhY2V4dHJhY3RvciBcCi0gICAgbGlibWlkaWV4dHJhY3RvciBcCi0gICAgbGlibWt2ZXh0cmFjdG9yIFwKLSAgICBsaWJtcDNleHRyYWN0b3IgXAotICAgIGxpYm1wNGV4dHJhY3RvciBcCi0gICAgbGlibXBlZzJleHRyYWN0b3IgXAotICAgIGxpYm9nZ2V4dHJhY3RvciBcCi0gICAgbGlid2F2ZXh0cmFjdG9yIFwKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2XzY0IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhZXh0cmFjdG9yLnBvbGljeQogCiBMT0NBTF9TUkNfRklMRVMgOj0gbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UgbGliYmluZGVyIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgbGliYmFzZSBsaWJhbmRyb2lkaWN1IGxpYmF2c2VydmljZXNfbWluaWphaWwKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliaWN1YW5kcm9pZF91dGlscworICAgIGxpYmxvZyBsaWJhbmRyb2lkaWN1IGxpYmF2c2VydmljZXNfbWluaWphaWwKIExPQ0FMX01PRFVMRTo9IG1lZGlhZXh0cmFjdG9yCiBMT0NBTF9JTklUX1JDIDo9IG1lZGlhZXh0cmFjdG9yLnJjCiBMT0NBTF9DX0lOQ0xVREVTIDo9IGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEKIExPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCitMT0NBTF9TQU5JVElaRSA6PSBzY3VkbwogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKICMgc2VydmljZSBzZWNjb21wIGZpbHRlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggZjBmNDRmNS4uZGU1YzNlNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CkBAIC0zMCw2ICsyOSw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpNZWRpYUV4dHJhY3RvclNlcnZpY2UoKQorICAgICAgICA6IEJuTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CisKIHNwPElNZWRpYUV4dHJhY3Rvcj4gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjptYWtlRXh0cmFjdG9yKAogICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnJlbW90ZVNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgewogICAgIEFMT0dWKCJAQEAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjptYWtlRXh0cmFjdG9yIGZvciAlcyIsIG1pbWUpOwpAQCAtNTUsNiArNTcsMTAgQEAKICAgICByZXR1cm4gQ3JlYXRlSURhdGFTb3VyY2VGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogfQogCitzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IE1lZGlhRXh0cmFjdG9yU2VydmljZTo6Z2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z2V0U3VwcG9ydGVkVHlwZXMoKTsKK30KKwogc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIHJldHVybiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmR1bXAoZmQsIGFyZ3MpIHx8IGR1bXBFeHRyYWN0b3JzKGZkLCBhcmdzKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKaW5kZXggOWRmM2VjZC4uYzljZWJjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKQEAgLTI3LDcgKzI3LDcgQEAKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclNlcnZpY2U+OyAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkKIHB1YmxpYzoKLSAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKSA6IEJuTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CisgICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCk7CiAgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKSB7IH0KIApAQCAtMzcsNiArMzcsOCBAQAogCiAgICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gbWFrZUlEYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAorICAgIHZpcnR1YWwgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2E2OTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlIgotI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgotCi0jaW5jbHVkZSAiTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWJpbmRlcjo6U3RhdHVzIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZTo6bG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCkgewotICAgIEFMT0dWKCJsb2FkUGx1Z2lucyAlcyIsIGFwa1BhdGguY19zdHIoKSk7Ci0gICAgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpMb2FkUGx1Z2lucyhhcGtQYXRoKTsKLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExNWY2ZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRURJQV9FWFRSQUNUT1JfVVBEQVRFX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX01FRElBX0VYVFJBQ1RPUl9VUERBVEVfU0VSVklDRV9ICi0KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlCi0gICAgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+LCBwdWJsaWMgQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKLXsKLSAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+OwotcHVibGljOgotICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIDogQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KLSAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KLSAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuZXh0cmFjdG9yLnVwZGF0ZSI7IH0KLSAgICBiaW5kZXI6OlN0YXR1cyBsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKTsKLX07Ci0KLX0gICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCmluZGV4IDhkMzM1OWEuLjA2YjUzMmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcApAQCAtMTUsNiArMTUsNyBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCisjaW5jbHVkZSA8YWljdS9BSWN1Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgpAQCAtMjksOSArMzAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAogLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCi0jaW5jbHVkZSAiSWN1VXRpbHMuaCIKICNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclNlcnZpY2UuaCIKLSNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCIKICNpbmNsdWRlICJNZWRpYVV0aWxzLmgiCiAjaW5jbHVkZSAibWluaWphaWwuaCIKIApAQCAtNDIsNiArNDEsMTIgQEAKIHN0YXRpYyBjb25zdCBjaGFyIGtWZW5kb3JTZWNjb21wUG9saWN5UGF0aFtdID0KICAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLnBvbGljeSI7CiAKKy8vIERpc2FibGUgU2N1ZG8ncyBtaXNtYXRjaCBhbGxvY2F0aW9uIGNoZWNrLCBhcyBpdCBpcyBiZWluZyB0cmlnZ2VyZWQKKy8vIGJ5IHNvbWUgdGhpcmQgcGFydHkgY29kZS4KK2V4dGVybiAiQyIgY29uc3QgY2hhciAqX19zY3Vkb19kZWZhdWx0X29wdGlvbnMoKSB7CisgICAgcmV0dXJuICJEZWFsbG9jYXRpb25UeXBlTWlzbWF0Y2g9ZmFsc2UiOworfQorCiBpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhcioqIGFyZ3YpCiB7CiAgICAgbGltaXRQcm9jZXNzTWVtb3J5KApAQCAtNTksMTggKzY0LDEzIEBACiAKICAgICBTZXRVcE1pbmlqYWlsKGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aCwga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoKTsKIAotICAgIEluaXRpYWxpemVJY3VPckRpZSgpOworICAgIEFJY3VfaW5pdGlhbGl6ZUljdU9yRGllKCk7CiAKICAgICBzdHJjcHkoYXJndlswXSwgIm1lZGlhLmV4dHJhY3RvciIpOwogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6aW5zdGFudGlhdGUoKTsKIAotICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gYmFzZTo6R2V0UHJvcGVydHkoInJvLmJ1aWxkLnR5cGUiLCAidW5rbm93biIpOwotICAgIGlmICh2YWx1ZSA9PSAidXNlcmRlYnVnIiB8fCB2YWx1ZSA9PSAiZW5nIikgewotICAgICAgICBtZWRpYTo6TWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwotICAgIH0KLQogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2XzY0LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAzMjI5OWYzLi42MDdhMDNlCi0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2XzY0LnBvbGljeQpAQCAtMjIsNiArMjIsOCBAQAogZ2V0dWlkOiAxCiBzZXRwcmlvcml0eTogMQogc2lnYWx0c3RhY2s6IDEKK2ZzdGF0OiAxCitmc3RhdGZzOiAxCiBuZXdmc3RhdGF0OiAxCiByZXN0YXJ0X3N5c2NhbGw6IDEKIGV4aXQ6IDEKQEAgLTMxLDI4ICszMywyMSBAQAogc2NoZWRfc2V0c2NoZWR1bGVyOiAxCiBnZXRybGltaXQ6IDEKIG5hbm9zbGVlcDogMQorZ2V0cmFuZG9tOiAxCisKKyMgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgZXh0cmFjdG9ycworZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCiAKICMgZm9yIEZpbGVTb3VyY2UKIHJlYWRsaW5rYXQ6IDEKIAotIyBmb3IgYXR0YWNoaW5nIHRvIGRlYnVnZ2VyZCBvbiBwcm9jZXNzIGNyYXNoCi10Z2tpbGw6IDEKLXNvY2tldDogYXJnMCA9PSAxCi1jb25uZWN0OiAxCi1mY250bDogMQotcnRfc2lncHJvY21hc2s6IDEKLXJ0X3NpZ2FjdGlvbjogMQotcnRfdGdzaWdxdWV1ZWluZm86IDEKLWdldGV1aWQ6IDEKLWdldGdpZDogMQotZ2V0ZWdpZDogMQotZ2V0Z3JvdXBzOiAxCi1nZXRkZW50czY0OiAxCi1waXBlMjogMQotcHBvbGw6IDEKLQogIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCiBnZXR0aWQ6IDEKIHNjaGVkX3lpZWxkOiAxCiBnZXRwaWQ6IDEKIGdldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Nl82NC5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCmluZGV4IDI5ZTZkZmMuLmJlZTVkMjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icApAQCAtMTAsNyArMTAsNyBAQAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm5iYWlvIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibmJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCAxYmU1NTQ0Li45MDJhZjY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKQEAgLTIwLDggKzIwLDkgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9NZXJnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01MywyNyArNTQsMjggQEAKIAogdm9pZCBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIGlmIChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkgIT0gQUlEX0FVRElPU0VSVkVSIHx8IHNoYXJlZCA9PSAwIHx8CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpIHx8IHNoYXJlZCA9PSAwIHx8CiAgICAgICAgICAgICBzaXplIDwga01pblNpemUgfHwgc2l6ZSA+IGtNYXhTaXplIHx8IG5hbWUgPT0gTlVMTCB8fAogICAgICAgICAgICAgc2hhcmVkLT5zaXplKCkgPCBOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzcDxOQkxvZzo6UmVhZGVyPiByZWFkZXIobmV3IE5CTG9nOjpSZWFkZXIoc2hhcmVkLCBzaXplKSk7Ci0gICAgTkJMb2c6Ok5hbWVkUmVhZGVyIG5hbWVkUmVhZGVyKHJlYWRlciwgbmFtZSk7CisgICAgc3A8TkJMb2c6OlJlYWRlcj4gcmVhZGVyKG5ldyBOQkxvZzo6UmVhZGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSkpOyAvLyBSZWFkZXIgaGFuZGxlZCBieSBtZXJnZXIKKyAgICBzcDxOQkxvZzo6RHVtcFJlYWRlcj4gZHVtcFJlYWRlcihuZXcgTkJMb2c6OkR1bXBSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSk7IC8vIGZvciBkdW1wc3lzCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtTmFtZWRSZWFkZXJzLmFkZChuYW1lZFJlYWRlcik7Ci0gICAgbU1lcmdlci5hZGRSZWFkZXIobmFtZWRSZWFkZXIpOworICAgIG1EdW1wUmVhZGVycy5hZGQoZHVtcFJlYWRlcik7CisgICAgbU1lcmdlci5hZGRSZWFkZXIocmVhZGVyKTsKIH0KIAogdm9pZCBNZWRpYUxvZ1NlcnZpY2U6OnVucmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZCkKIHsKLSAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpICE9IEFJRF9BVURJT1NFUlZFUiB8fCBzaGFyZWQgPT0gMCkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSB8fCBzaGFyZWQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmFtZWRSZWFkZXJzLnNpemUoKTsgKSB7Ci0gICAgICAgIGlmIChtTmFtZWRSZWFkZXJzW2ldLnJlYWRlcigpLT5pc0lNZW1vcnkoc2hhcmVkKSkgewotICAgICAgICAgICAgbU5hbWVkUmVhZGVycy5yZW1vdmVBdChpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EdW1wUmVhZGVycy5zaXplKCk7ICkgeworICAgICAgICBpZiAobUR1bXBSZWFkZXJzW2ldLT5pc0lNZW1vcnkoc2hhcmVkKSkgeworICAgICAgICAgICAgbUR1bXBSZWFkZXJzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgLy8gVE9ETyBtTWVyZ2VyLnJlbW92ZVJlYWRlcnMoc2hhcmVkKQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaSsrOwogICAgICAgICB9CkBAIC05NSwxMCArOTcsOCBAQAogCiBzdGF0dXNfdCBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIC8vIEZJWE1FIG1lcmdlIHdpdGggc2ltaWxhciBidXQgbm90IGlkZW50aWNhbCBjb2RlIGF0IHNlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICBpZiAoIShJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkgPT0gQUlEX0FVRElPU0VSVkVSIHx8Ci0gICAgICAgICAgICBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0R1bXApKSkgeworICAgIGlmICghKGlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkKKyAgICAgICAgICAgIHx8IGR1bXBBbGxvd2VkKCkpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBtZWRpYS5sb2cgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgIGlmIChhcmdzLnNpemUoKSA+IDApIHsKICAgICAgICAgY29uc3QgU3RyaW5nOCBhcmcwKGFyZ3NbMF0pOwogICAgICAgICBpZiAoIXN0cmNtcChhcmcwLnN0cmluZygpLCAiLXIiKSkgewotICAgICAgICAgICAgLy8gbmVlZGVkIGJlY2F1c2UgbU5hbWVkUmVhZGVycyBpcyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICAgICAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIG1SZWFkZXJzIGlzIHByb3RlY3RlZCBieSBtTG9jawogICAgICAgICAgICAgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAKICAgICAgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gTWVkaWFMb2dTZXJ2aWNlIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKQEAgLTExOSwyMSArMTE5LDIyIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiIsIHJlc3VsdC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGluc3RlYWQgcHJvY2VlZCB0byBtTWVyZ2VSZWFkZXIuZHVtcD8gZG9lcyBpdCBuZWVkIGxvY2s/CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWVkUmVhZGVyIDogbU5hbWVkUmVhZGVycykgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZkdW1wUmVhZGVyIDogbUR1bXBSZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXM6XG4iLCBuYW1lZFJlYWRlci5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lczpcbiIsIGR1bXBSZWFkZXItPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgZHVtcFJlYWRlci0+ZHVtcChmZCwgMCAvKmluZGVudCovKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJXM6IiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIiVzOiIsIGR1bXBSZWFkZXItPm5hbWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZXJnZVJlYWRlci5kdW1wKGZkLCBhcmdzKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtTWVyZ2VSZWFkZXIuZHVtcChmZCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oCmluZGV4IGM5NDVkMWYuLjIxZGY4OTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9NZXJnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01NSw3ICs1Niw3IEBACiAKICAgICBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOwogCi0gICAgVmVjdG9yPE5CTG9nOjpOYW1lZFJlYWRlcj4gbU5hbWVkUmVhZGVyczsgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICBWZWN0b3I8c3A8TkJMb2c6OkR1bXBSZWFkZXI+PiBtRHVtcFJlYWRlcnM7ICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCiAKICAgICAvLyBGSVhNRSBOZWVkIGNvbW1lbnRzIG9uIGFsbCBvZiB0aGVzZSwgZXNwZWNpYWxseSBhYm91dCBsb2NraW5nCiAgICAgTkJMb2c6OlNoYXJlZCAqbU1lcmdlclNoYXJlZDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCmluZGV4IDFjNjNmNjQuLmYzMzM5YTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icApAQCAtMTYsOCArMTYsNiBAQAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKLQogICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKaW5kZXggZTBkYjI2MS4uYTFmYzBlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCkBAIC0xNDAsOSArMTQwLDggQEAKIH0KIAogc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FbmRwb2ludChBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgewotICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworICAgIGlmIChyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKICAgICAgICAgcmV0dXJuIG9wZW5FeGNsdXNpdmVFbmRwb2ludChhdWRpb1NlcnZpY2UsIHJlcXVlc3QpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBvcGVuU2hhcmVkRW5kcG9pbnQoYXVkaW9TZXJ2aWNlLCByZXF1ZXN0KTsKQEAgLTE3Myw3ICsxNzIsNyBAQAogCiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+b3BlbihyZXF1ZXN0KTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJvcGVuRXhjbHVzaXZlRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuRXhjbHVzaXZlRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKICAgICAgICAgICAgIGVuZHBvaW50LmNsZWFyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRXhjbHVzaXZlU3RyZWFtcy5wdXNoX2JhY2soZW5kcG9pbnRNTWFwKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgKaW5kZXggMTkzYmRlZS4uYmExNzg1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgKQEAgLTU2LDggKzU2LDcgQEAKICAgICAgKiBAcmV0dXJuIGVuZHBvaW50IG9yIG51bGwKICAgICAgKi8KICAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IG9wZW5FbmRwb2ludChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KTsKIAogICAgIHZvaWQgY2xvc2VFbmRwb2ludChhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcAppbmRleCBiMDMxODg4Li4xYzAzYjdmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcGFydEluZGV4Kys7CiAgICAgfQotICAgIGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlUmVhZEluZGV4KGZyYW1lc0Rlc2lyZWQpOworICAgIGZpZm8tPmFkdmFuY2VSZWFkSW5kZXgoZnJhbWVzRGVzaXJlZCk7CiAKICNpZiBBQVVESU9fTUlYRVJfQVRSQUNFX0VOQUJMRUQKICAgICBBVFJBQ0VfRU5EKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDAxODJhMjcuLjJmYmFlYjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCkBAIC0zMyw3ICszNCw2IEBACiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCiAjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwpAQCAtMTE4LDE3ICsxMTgsMjEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGlmIFNIQVJFRCByZXF1ZXN0ZWQgb3IgaWYgRVhDTFVTSVZFIGZhaWxlZAotICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRAotICAgICAgICAgfHwgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0ciAmJiAhc2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKSkgeworICAgIC8vIFRyeSBTSEFSRUQgaWYgU0hBUkVEIHJlcXVlc3RlZCBvciBpZiBFWENMVVNJVkUgZmFpbGVkLgorICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCkgewogICAgICAgICBzZXJ2aWNlU3RyZWFtID0gIG5ldyBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKCp0aGlzKTsKICAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3BlbihyZXF1ZXN0KTsKKyAgICB9IGVsc2UgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0ciAmJiAhc2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKSB7CisgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCBtb2RpZmllZFJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIG9yaWdpbmFsIEVYQ0xVU0lWRSBtb2RlIHdpdGggU0hBUkVELgorICAgICAgICBtb2RpZmllZFJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICAgICAgc2VydmljZVN0cmVhbSA9ICBuZXcgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCgqdGhpcyk7CisgICAgICAgIHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPm9wZW4obW9kaWZpZWRSZXF1ZXN0KTsKICAgICB9CiAKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBzZXJ2aWNlU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIEFMT0dFKCJvcGVuU3RyZWFtKCk6IGZhaWxlZCwgcmV0dXJuICVkID0gJXMiLAotICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICBBTE9HVygib3BlblN0cmVhbSgpOiBmYWlsZWQsIHJldHVybiAlZCA9ICVzIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9IGVsc2UgewogICAgICAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gbVN0cmVhbVRyYWNrZXIuYWRkU3RyZWFtRm9ySGFuZGxlKHNlcnZpY2VTdHJlYW0uZ2V0KCkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKaW5kZXggNjkwNjhmNS4uNGRmYjYyYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCkBAIC0zOCwxMCArMzgsNiBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCi1BQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSB7Ci0gICAgQUxPR0QoIiVzKCVwKSBkZXN0cm95ZWQiLCBfX2Z1bmNfXywgdGhpcyk7Ci19Ci0KIHN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAKQEAgLTU5LDYgKzU1LDcgQEAKICAgICByZXN1bHQgPDwgIiAgICBEZXZpY2UgSWQ6ICAgICAgICAgICAgIiA8PCBnZXREZXZpY2VJZCgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgU2FtcGxlIFJhdGU6ICAgICAgICAgICIgPDwgZ2V0U2FtcGxlUmF0ZSgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgQ2hhbm5lbCBDb3VudDogICAgICAgICIgPDwgZ2V0U2FtcGxlc1BlckZyYW1lKCkgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBGb3JtYXQ6ICAgICAgICAgICAgICAgIiA8PCBnZXRGb3JtYXQoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIEZyYW1lcyBQZXIgQnVyc3Q6ICAgICAiIDw8IG1GcmFtZXNQZXJCdXJzdCA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFVzYWdlOiAgICAgICAgICAgICAgICAiIDw8IGdldFVzYWdlKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBDb250ZW50VHlwZTogICAgICAgICAgIiA8PCBnZXRDb250ZW50VHlwZSgpIDw8ICJcbiI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCmluZGV4IGExMzRhMTMuLjM2MTZmYTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgICwgcHVibGljIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgewogcHVibGljOgogCi0gICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50KCk7CisgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50KCkgPSBkZWZhdWx0OwogCiAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICBtTG9ja1N0cmVhbXM7CiAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+PiBtUmVnaXN0ZXJlZFN0cmVhbXM7CiAKLSAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKKyAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY0VuZHBvaW50VGltZXN0YW1wOwogCiAgICAgYW5kcm9pZDo6QXVkaW9DbGllbnQgICAgIG1NbWFwQ2xpZW50OyAgIC8vIHNldCBpbiBvcGVuLCB1c2VkIGluIG9wZW4gYW5kIHN0YXJ0U3RyZWFtCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKaW5kZXggY2M5NDJmNC4uMzdkMTA1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKQEAgLTgyLDggKzgyLDkgQEAKIAogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewotICAgICAgICAgICAgICAgIGlmIChjbGllbnRTdHJlYW0tPmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudFN0cmVhbS0+aXNSdW5uaW5nKCkgJiYgIWNsaWVudFN0cmVhbS0+aXNTdXNwZW5kZWQoKSkgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1dyaXR0ZW4gPSAwOworCiAgICAgICAgICAgICAgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHN0cmVhbVNoYXJlZCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCAqPihjbGllbnRTdHJlYW0uZ2V0KCkpOwogCkBAIC0xMDIsNyArMTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPnNldFRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0KHBvc2l0aW9uT2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoZSBidWZmZXIgdG9vIGZ1bGwgdG8gd3JpdGUgYSBidXJzdD8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlmby0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5pbmNyZW1lbnRYUnVuQ291bnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAppbmRleCA1YTQyOWM5Li42YzI4MDgzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcApAQCAtMTAxLDggKzEwMSw2IEBACiAgICAgICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZLAogICAgICAgICAgICAgLnRhZ3MgPSAiIgogICAgIH07Ci0gICAgQUxPR0QoIiVzKCVwKSBNTUFQIGF0dHJpYnV0ZXMudXNhZ2UgPSAlZCwgY29udGVudF90eXBlID0gJWQsIHNvdXJjZSA9ICVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgdGhpcywgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMuc291cmNlKTsKIAogICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IHJlcXVlc3QuZ2V0VXNlcklkKCk7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gcmVxdWVzdC5nZXRQcm9jZXNzSWQoKTsKQEAgLTExMSwxMSArMTA5LDExIEBACiAgICAgbVJlcXVlc3RlZERldmljZUlkID0gZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpOwogCiAgICAgLy8gRmlsbCBpbiBjb25maWcKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7Ci0gICAgaWYgKGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fVU5TUEVDSUZJRUQgfHwgYWF1ZGlvRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kxNjsKKyAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOworICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCB8fCBhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgfQotICAgIGNvbmZpZy5mb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKKyAgICBjb25maWcuZm9ybWF0ID0gYXVkaW9Gb3JtYXQ7CiAKICAgICBpbnQzMl90IGFhdWRpb1NhbXBsZVJhdGUgPSBnZXRTYW1wbGVSYXRlKCk7CiAgICAgaWYgKGFhdWRpb1NhbXBsZVJhdGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CkBAIC0xNjMsMTIgKzE2MSwxMiBAQAogICAgIEFMT0dEKCIlcygpIG1NYXBDbGllbnQudWlkID0gJWQsIHBpZCA9ICVkID0+IHBvcnRIYW5kbGUgPSAlZFxuIiwKICAgICAgICAgICBfX2Z1bmNfXywgbU1tYXBDbGllbnQuY2xpZW50VWlkLCAgbU1tYXBDbGllbnQuY2xpZW50UGlkLCBtUG9ydEhhbmRsZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXMoKSBvcGVuTW1hcFN0cmVhbSgpIHJldHVybmVkIHN0YXR1cyAlZCIsICBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgLSBvcGVuTW1hcFN0cmVhbSgpIHJldHVybmVkIHN0YXR1cyAlZCIsICBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICB9CiAKICAgICBpZiAoZGV2aWNlSWQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpIG9wZW5NbWFwU3RyZWFtKCkgZmFpbGVkIHRvIHNldCBkZXZpY2VJZCIsIF9fZnVuY19fKTsKKyAgICAgICAgQUxPR1coIiVzKCkgLSBvcGVuTW1hcFN0cmVhbSgpIGZhaWxlZCB0byBzZXQgZGV2aWNlSWQiLCBfX2Z1bmNfXyk7CiAgICAgfQogICAgIHNldERldmljZUlkKGRldmljZUlkKTsKIApAQCAtMjEwLDkgKzIwOCw2IEBACiAgICAgICAgIHVpZF90IGF1ZGlvU2VydmljZVVpZCA9IGdldHVpZCgpOwogICAgICAgICBpZiAoKG1NbWFwQ2xpZW50LmNsaWVudFVpZCAhPSBhdWRpb1NlcnZpY2VVaWQpICYmCiAgICAgICAgICAgICBnZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICAvLyBGYWxsYmFjayBpcyBoYW5kbGVkIGJ5IGNhbGxlciBidXQgaW5kaWNhdGUgd2hhdCBpcyBwb3NzaWJsZSBpbiBjYXNlCi0gICAgICAgICAgICAvLyB0aGlzIGlzIHVzZWQgaW4gdGhlIGZ1dHVyZQotICAgICAgICAgICAgc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOwogICAgICAgICAgICAgQUxPR1coIiVzKCkgLSBleGNsdXNpdmUgRkQgY2Fubm90IGJlIHVzZWQgYnkgY2xpZW50IiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTIzMyw3ICsyMjgsNyBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgICBtRnJhbWVzUGVyQnVyc3QgPSBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXM7Ci0gICAgc2V0Rm9ybWF0KEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChjb25maWcuZm9ybWF0KSk7CisgICAgc2V0Rm9ybWF0KGNvbmZpZy5mb3JtYXQpOwogICAgIHNldFNhbXBsZVJhdGUoY29uZmlnLnNhbXBsZV9yYXRlKTsKIAogICAgIC8vIFNjYWxlIHVwIHRoZSBidXJzdCBzaXplIHRvIG1lZXQgdGhlIG1pbmltdW0gZXF1aXZhbGVudCBpbiBtaWNyb3NlY29uZHMuCkBAIC0yNTMsNiArMjQ4LDkgQEAKICAgICAgICAgICAiLCBkZXZpY2VJZCA9ICVkLCBjYXBhY2l0eSA9ICVkXG4iLAogICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBkZXZpY2VJZCwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAKKyAgICBBTE9HRCgiJXMoKSBmb3JtYXQgPSA9eCUwOHgsIGZyYW1lIHNpemUgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGdldEZvcm1hdCgpLCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCkpOworCiAgICAgcmV0dXJuIHJlc3VsdDsKIAogZXJyb3I6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCmluZGV4IGViYmEzMmQuLjFlMWM1NTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCkBAIC00NywxMCArNDcsNiBAQAogICAgIG1TdHJlYW1JbnRlcm5hbCA9ICZtU3RyZWFtSW50ZXJuYWxQbGF5OwogfQogCi1BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5Ojp+QUF1ZGlvU2VydmljZUVuZHBvaW50UGxheSgpIHsKLSAgICBBTE9HRCgiJXMoJXApIGRlc3Ryb3llZCIsIF9fZnVuY19fLCB0aGlzKTsKLX0KLQogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewpAQCAtODgsNiArODQsMTAgQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1JlYWQgPSAwOwogICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dVbmRlcmZsb3cgPSB0cnVlOwogCisgICAgICAgICAgICAgICAgaWYgKGNsaWVudFN0cmVhbS0+aXNTdXNwZW5kZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gZGVhZCBzdHJlYW0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBjbGllbnRTdHJlYW0tPmdldFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgYWxsb3dVbmRlcmZsb3cgPSBmYWxzZTsgLy8ganVzdCByZWFkIHdoYXQgaXMgYWxyZWFkeSBpbiB0aGUgRklGTwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCmluZGV4IGEwYTM4M2MuLjk4MWU0MzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKQEAgLTM5LDcgKzM5LDYgQEAKIGNsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkgOiBwdWJsaWMgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSk7Ci0gICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50UGxheSgpOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKaW5kZXggZmM5ZjE1NS4uMGE0MTVmZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCkBAIC03OCw2ICs3OCw3IEBACiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgIHNldERldmljZUlkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0RGV2aWNlSWQoKSk7CiAgICAgc2V0U2Vzc2lvbklkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2Vzc2lvbklkKCkpOworICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsgLy8gZm9yY2UgZm9yIG1peGVyCiAgICAgbUZyYW1lc1BlckJ1cnN0ID0gbVN0cmVhbUludGVybmFsLT5nZXRGcmFtZXNQZXJCdXJzdCgpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTE4MCw4ICsxODEsOCBAQAogLy8gR2V0IHRpbWVzdGFtcCB0aGF0IHdhcyB3cml0dGVuIGJ5IHRoZSByZWFsLXRpbWUgc2VydmljZSB0aHJlYWQsIGVnLiBtaXhlci4KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKLSAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgIGlmIChtQXRvbWljRW5kcG9pbnRUaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljRW5kcG9pbnRUaW1lc3RhbXAucmVhZCgpOwogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKICAgICAgICAgKnRpbWVOYW5vcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaAppbmRleCBkNjcxNzEwLi5iZmMxNzQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaApAQCAtNTIsOCArNTIsNyBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICpjYWxsYmFja0xvb3AoKSA9IDA7Ci0KKyAgICB2aXJ0dWFsIHZvaWQgICAqY2FsbGJhY2tMb29wKCkgPSAwOwogCiBwcm90ZWN0ZWQ6CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAppbmRleCA5YWY4YWYzLi5iMTZiNWRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCkBAIC00Myw3ICs0Myw3IEBACiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKQogICAgICAgICA6IG1VcE1lc3NhZ2VRdWV1ZShudWxscHRyKQogICAgICAgICAsIG1UaW1lc3RhbXBUaHJlYWQoIkFBVGltZSIpCi0gICAgICAgICwgbUF0b21pY1RpbWVzdGFtcCgpCisgICAgICAgICwgbUF0b21pY1N0cmVhbVRpbWVzdGFtcCgpCiAgICAgICAgICwgbUF1ZGlvU2VydmljZShhdWRpb1NlcnZpY2UpIHsKICAgICBtTW1hcENsaWVudC5jbGllbnRVaWQgPSAtMTsKICAgICBtTW1hcENsaWVudC5jbGllbnRQaWQgPSAtMTsKQEAgLTUxLDcgKzUxLDYgQEAKIH0KIAogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6On5BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpIHsKLSAgICBBTE9HRCgifkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCkgZGVzdHJveWluZyAlcCIsIHRoaXMpOwogICAgIC8vIElmIHRoZSBzdHJlYW0gaXMgZGVsZXRlZCB3aGVuIE9QRU4gb3IgaW4gdXNlIHRoZW4gYXVkaW8gcmVzb3VyY2VzIHdpbGwgbGVhay4KICAgICAvLyBUaGlzIHdvdWxkIGluZGljYXRlIGFuIGludGVybmFsIGVycm9yLiBTbyB3ZSB3YW50IHRvIGZpbmQgdGhpcyBBU0FQLgogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECkBAIC04MSw4ICs4MCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKICAgICBBQXVkaW9FbmRwb2ludE1hbmFnZXIgJm1FbmRwb2ludE1hbmFnZXIgPSBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIApAQCAtMTA5LDEwICsxMDcsOCBAQAogICAgICAgICAvLyByZWZlcmVuY2VkIHVudGlsIHRoZSBzZXJ2aWNlIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGNsaWVudC4KICAgICAgICAgLy8gU28gb25seSBvbmUgdGhyZWFkIGNhbiBvcGVuIGEgc3RyZWFtLgogICAgICAgICBtU2VydmljZUVuZHBvaW50ID0gbUVuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQobUF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyaW5nTW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0KTsKICAgICAgICAgaWYgKG1TZXJ2aWNlRW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzKCkgb3BlbkVuZHBvaW50KCkgZmFpbGVkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQpAQCAtMTgzLDkgKzE3OSwxMCBAQAogICAgIH0KIAogICAgIHNldEZsb3dpbmcoZmFsc2UpOworICAgIHNldFN1c3BlbmRlZChmYWxzZSk7CiAKICAgICAvLyBTdGFydCB3aXRoIGZyZXNoIHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzLgotICAgIG1BdG9taWNUaW1lc3RhbXAuY2xlYXIoKTsKKyAgICBtQXRvbWljU3RyZWFtVGltZXN0YW1wLmNsZWFyKCk7CiAKICAgICBtQ2xpZW50SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICByZXN1bHQgPSBzdGFydERldmljZSgpOwpAQCAtMjk0LDE2ICsyOTEsMjAgQEAKIH0KIAogLy8gaW1wbGVtZW50IFJ1bm5hYmxlLCBwZXJpb2RpY2FsbHkgc2VuZCB0aW1lc3RhbXBzIHRvIGNsaWVudAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpydW4oKSB7CiAgICAgQUxPR0QoIiVzKCkgJXMgZW50ZXJpbmcgPj4+Pj4+Pj4+Pj4+Pj4gVElNRVNUQU1QUyIsIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpKTsKICAgICBUaW1lc3RhbXBTY2hlZHVsZXIgdGltZXN0YW1wU2NoZWR1bGVyOwogICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zZXRCdXJzdFBlcmlvZChtRnJhbWVzUGVyQnVyc3QsIGdldFNhbXBsZVJhdGUoKSk7CiAgICAgdGltZXN0YW1wU2NoZWR1bGVyLnN0YXJ0KEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwogICAgIGludDY0X3QgbmV4dFRpbWUgPSB0aW1lc3RhbXBTY2hlZHVsZXIubmV4dEFic29sdXRlVGltZSgpOworICAgIGludDMyX3QgbG9vcENvdW50ID0gMDsKICAgICB3aGlsZShtVGhyZWFkRW5hYmxlZC5sb2FkKCkpIHsKKyAgICAgICAgbG9vcENvdW50Kys7CiAgICAgICAgIGlmIChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpID49IG5leHRUaW1lKSB7CiAgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgdGltZXN0YW1wIHRocmVhZCBnb3QgcmVzdWx0ID0gJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5leHRUaW1lID0gdGltZXN0YW1wU2NoZWR1bGVyLm5leHRBYnNvbHV0ZVRpbWUoKTsKQEAgLTMxMyw3ICszMTQsOCBAQAogICAgICAgICAgICAgQXVkaW9DbG9jazo6c2xlZXBVbnRpbE5hbm9UaW1lKG5leHRUaW1lKTsKICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HRCgiJXMoKSAlcyBleGl0aW5nIDw8PDw8PDw8PDw8PDw8IFRJTUVTVEFNUFMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CisgICAgQUxPR0QoIiVzKCkgJXMgZXhpdGluZyBhZnRlciAlZCBsb29wcyA8PDw8PDw8PDw8PDw8PCBUSU1FU1RBTVBTIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSwgbG9vcENvdW50KTsKIH0KIAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZGlzY29ubmVjdCgpIHsKQEAgLTM0OSw3ICszNTEsOSBAQAogICAgIH0KICAgICBpbnQzMl90IGNvdW50ID0gbVVwTWVzc2FnZVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCktPndyaXRlKGNvbW1hbmQsIDEpOwogICAgIGlmIChjb3VudCAhPSAxKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpOiBRdWV1ZSBmdWxsLiBEaWQgY2xpZW50IGRpZT8gJXMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CisgICAgICAgIEFMT0dXKCIlcygpOiBRdWV1ZSBmdWxsLiBEaWQgY2xpZW50IHN0b3A/IFN1c3BlbmRpbmcgc3RyZWFtLiB3aGF0ID0gJXUsICVzIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIGNvbW1hbmQtPndoYXQsIGdldFR5cGVUZXh0KCkpOworICAgICAgICBzZXRTdXNwZW5kZWQodHJ1ZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCmluZGV4IGExODE1ZDAuLmZmYzc2OGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaApAQCAtMjA0LDYgKzIwNCwyMCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCBmYWxzZSB3aGVuIHRoZSBzdHJlYW0gc2hvdWxkIG5vdCBsb25nZXIgYmUgcHJvY2Vzc2VkLgorICAgICAqIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBhIG1lc3NhZ2UgcXVldWUgb3ZlcmZsb3cuCisgICAgICogU2V0IHRydWUgd2hlbiBzdHJlYW0gaXMgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gc3VzcGVuZGVkCisgICAgICovCisgICAgdm9pZCBzZXRTdXNwZW5kZWQoYm9vbCBzdXNwZW5kZWQpIHsKKyAgICAgICAgbVN1c3BlbmRlZCA9IHN1c3BlbmRlZDsKKyAgICB9CisKKyAgICBib29sIGlzU3VzcGVuZGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN1c3BlbmRlZDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBdG9taWNhbGx5IGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2VzIHRvIHRoZSBzdHJlYW0gYnkgQUF1ZGlvU2VydmljZS4KICAgICAgKgogICAgICAqIFRoaXMgaXMgY2FsbGVkIHVuZGVyIGEgZ2xvYmFsIGxvY2sgaW4gQUF1ZGlvU3RyZWFtVHJhY2tlci4KQEAgLTI4Nyw3ICszMDEsNyBAQAogICAgIC8vIFRPRE8gcmVuYW1lIG1DbGllbnRIYW5kbGUgdG8gbVBvcnRIYW5kbGUgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggQXVkaW9GbGluZ2VyLgogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1DbGllbnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogCi0gICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNTdHJlYW1UaW1lc3RhbXA7CiAKICAgICBhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZtQXVkaW9TZXJ2aWNlOwogCkBAIC0zMDQsNyArMzE4LDEyIEBACiAgICAgLy8gVGhpcyBpcyBtb2RpZmllZCB1bmRlciBhIGdsb2JhbCBsb2NrIGluIEFBdWRpb1N0cmVhbVRyYWNrZXIuCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUNhbGxpbmdDb3VudCA9IDA7CiAKKyAgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IGEgc3RyZWFtIHRoYXQgaXMgYmVpbmcgcmVmZXJlbmNlZCBieSBhIGJpbmRlciBjYWxsIG5lZWRzIHRvIGNsb3NlZC4KICAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtQ2xvc2VOZWVkZWR7ZmFsc2V9OworCisgICAgLy8gVGhpcyBpbmRpY2F0ZSB0aGF0IGEgcnVubmluZyBzdHJlYW0gc2hvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYmVjYXVzZSBvZiBhbiBlcnJvciwKKyAgICAvLyBmb3IgZXhhbXBsZSBhIGZ1bGwgbWVzc2FnZSBxdWV1ZS4gTm90ZSB0aGF0IHRoaXMgYXRvbWljIGlzIHVucmVsYXRlZCB0byBtQ2xvc2VOZWVkZWQuCisgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbVN1c3BlbmRlZHtmYWxzZX07CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAppbmRleCBjODQ1MzA5Li44MzdiMDgwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCkBAIC02NCw4ICs2NCwxMyBAQAogCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbU1NQVA+IGtlZXAodGhpcyk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpOworICAgIGlmIChyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkgIT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgc2hhcmluZ01vZGUgbWlzbWF0Y2ggJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC0xNTcsNyArMTYyLDcgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2VydmljZUVuZHBvaW50TU1BUC0+Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihwb3NpdGlvbkZyYW1lcywgdGltZU5hbm9zKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wKCpwb3NpdGlvbkZyYW1lcywgKnRpbWVOYW5vcyk7Ci0gICAgICAgIG1BdG9taWNUaW1lc3RhbXAud3JpdGUodGltZXN0YW1wKTsKKyAgICAgICAgbUF0b21pY1N0cmVhbVRpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOwogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKICAgICAgICAgKnRpbWVOYW5vcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpOwogICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgewpAQCAtMTc5LDggKzE4NCw4IEBACiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQICo+KGVuZHBvaW50LmdldCgpKTsKIAogICAgIC8vIFRPRE8gR2V0IHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgZnJvbSB0aGUgSEFMCi0gICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7Ci0gICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICBpZiAobUF0b21pY1N0cmVhbVRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNTdHJlYW1UaW1lc3RhbXAucmVhZCgpOwogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKICAgICAgICAgKnRpbWVOYW5vcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpICsgc2VydmljZUVuZHBvaW50TU1BUC0+Z2V0SGFyZHdhcmVUaW1lT2Zmc2V0TmFub3MoKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKaW5kZXggMDVjNTczNS4uMTQ3NDJkZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKQEAgLTEyMCw5ICsxMjAsMTQgQEAKIAogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IGtlZXAodGhpcyk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOworICAgIGlmIChyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkgIT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgc2hhcmluZ01vZGUgbWlzbWF0Y2ggJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKQEAgLTEzNiwxMCArMTQxLDEwIEBACiAKICAgICAvLyBJcyB0aGUgcmVxdWVzdCBjb21wYXRpYmxlIHdpdGggdGhlIHNoYXJlZCBlbmRwb2ludD8KICAgICBzZXRGb3JtYXQoY29uZmlndXJhdGlvbklucHV0LmdldEZvcm1hdCgpKTsKLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwotICAgIH0gZWxzZSBpZiAoZ2V0Rm9ybWF0KCkgIT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCkpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgfSBlbHNlIGlmIChnZXRGb3JtYXQoKSAhPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGF1ZGlvX2Zvcm1hdF90IG1BdWRpb0Zvcm1hdCA9ICVkLCBuZWVkIEZMT0FUIiwgX19mdW5jX18sIGdldEZvcm1hdCgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KQEAgLTE0OCw3ICsxNTMsNyBAQAogICAgIGlmIChnZXRTYW1wbGVSYXRlKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIHNldFNhbXBsZVJhdGUoZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgfSBlbHNlIGlmIChnZXRTYW1wbGVSYXRlKCkgIT0gZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSkgewotICAgICAgICBBTE9HRCgiJXMoKSBtU2FtcGxlUmF0ZSA9ICVkLCBuZWVkICVkIiwKKyAgICAgICAgQUxPR0UoIiVzKCkgbVNhbXBsZVJhdGUgPSAlZCwgbmVlZCAlZCIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVSYXRlKCksIGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9SQVRFOwogICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTU4LDcgKzE2Myw3IEBACiAgICAgaWYgKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBzZXRTYW1wbGVzUGVyRnJhbWUoZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICB9IGVsc2UgaWYgKGdldFNhbXBsZXNQZXJGcmFtZSgpICE9IGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSkgewotICAgICAgICBBTE9HRCgiJXMoKSBtU2FtcGxlc1BlckZyYW1lID0gJWQsIG5lZWQgJWQiLAorICAgICAgICBBTE9HRSgiJXMoKSBtU2FtcGxlc1BlckZyYW1lID0gJWQsIG5lZWQgJWQiLAogICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0xODUsOCArMTkwLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCwgZGV2aWNlSWQgPSAlZCIsCi0gICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZW5kcG9pbnQtPmdldERldmljZUlkKCkpOworICAgIEFMT0dEKCIlcygpIGFjdHVhbCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWQsIGRldmljZUlkID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBlbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CiAKICAgICByZXN1bHQgPSBlbmRwb2ludC0+cmVnaXN0ZXJTdHJlYW0oa2VlcCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKQEAgLTIzMywxNSArMjM4LDE1IEBACiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6bWFya1RyYW5zZmVyVGltZShUaW1lc3RhbXAgJnRpbWVzdGFtcCkgewotICAgIG1BdG9taWNUaW1lc3RhbXAud3JpdGUodGltZXN0YW1wKTsKKyAgICBtQXRvbWljU3RyZWFtVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiB9CiAKIC8vIEdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSBtaXhlciBvciBkaXN0cmlidXRvci4KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CiAgICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKLSAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgIGlmIChtQXRvbWljU3RyZWFtVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA1ODRiMmVmLi4zZDVmMTQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTUzLDcgKzUzLDYgQEAKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjIyODNhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAiLAorICAgICAgICAiU291bmRUcmlnZ2VySGFsSGlkbC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlic291bmR0cmlnZ2VyIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJhdWRpb2hhbCIsCisgICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM2NjZlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLWlmZXEgKCQoU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUpLCAxKQotICAgIGlmbmVxICgkKFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMKSwgdHJ1ZSkKLSAgICAgICAgJChlcnJvciBSZXF1aXJlcyBidWlsZGluZyB3aXRoIFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMPXRydWUpCi0gICAgZW5kaWYKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRQotZW5kaWYKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCi0gICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJoYXJkd2FyZSBcCi0gICAgbGlic291bmR0cmlnZ2VyIFwKLSAgICBsaWJhdWRpb2NsaWVudCBcCi0gICAgbGlic2VydmljZXV0aWxpdHkKLQotCi1pZmVxICgkKFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMKSx0cnVlKQotIyBsaWJoYXJkd2FyZSBjb25maWd1cmF0aW9uCi1MT0NBTF9TUkNfRklMRVMgKz0gICAgICAgICAgICAgICBcCi0gICAgU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcAotZWxzZQotIyBUcmVibGUgY29uZmlndXJhdGlvbgotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgXAotICAgIFNvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgIGxpYmh3YmluZGVyIFwKLSAgICBsaWJoaWRsYmFzZSBcCi0gICAgbGliaGlkbG1lbW9yeSBcCi0gICAgbGliaGlkbHRyYW5zcG9ydCBcCi0gICAgbGliYmFzZSBcCi0gICAgbGliYXVkaW9oYWwgXAotICAgIGxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjEgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCBcCi0gICAgYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAgXAotICAgIGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wCi1lbmRpZgotCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCmluZGV4IGFkZjI1MmUuLjY4ZDU0YzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKQEAgLTE2OCwxOCArMTY4LDIzIEBACiAgICAgaW50IHJldDsKICAgICBTb3VuZE1vZGVsSGFuZGxlIGhhbEhhbmRsZTsKICAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMSA9IHRvU2VydmljZTJfMShzb3VuZHRyaWdnZXIpOworICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8yID0gdG9TZXJ2aWNlMl8yKHNvdW5kdHJpZ2dlcik7CiAgICAgaWYgKHNvdW5kX21vZGVsLT50eXBlID09IFNPVU5EX01PREVMX1RZUEVfS0VZUEhSQVNFKSB7Ci0gICAgICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgewotICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7Ci0gICAgICAgICAgICBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7Ci0gICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7Ci0gICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkUGhyYXNlU291bmRNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgaGFsU291bmRNb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOwotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNvdW5kdHJpZ2dlcl8yXzIpIHsKKyAgICAgICAgICAgIFYyXzJfSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzItPmxvYWRQaHJhc2VTb3VuZE1vZGVsXzJfMSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNvdW5kdHJpZ2dlcl8yXzEpIHsKICAgICAgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CiAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKQEAgLTE5MywxOCArMTk4LDMyIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIXNvdW5kdHJpZ2dlcl8yXzEpIHsKLSAgICAgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOwotICAgICAgICAgICAgY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7Ci0gICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkU291bmRNb2RlbChoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+bG9hZFBocmFzZVNvdW5kTW9kZWwoCisgICAgICAgICAgICAgICAgICAgIGhhbFNvdW5kTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc291bmR0cmlnZ2VyXzJfMikgeworICAgICAgICAgICAgVjJfMl9JU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKKyAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgeworICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyXzJfMi0+bG9hZFNvdW5kTW9kZWxfMl8xKGhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNvdW5kdHJpZ2dlcl8yXzEpIHsKICAgICAgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CiAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKQEAgLTIxNyw2ICsyMzYsMTUgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+bG9hZFNvdW5kTW9kZWwoaGFsU291bmRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOworICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjgyLDE2ICszMTAsMjAgQEAKICAgICBtb2RlbC0+bVJlY29nbml0aW9uQ29va2llID0gY29va2llOwogCiAgICAgc3A8VjJfMV9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzEgPSB0b1NlcnZpY2UyXzEoc291bmR0cmlnZ2VyKTsKKyAgICBzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMiA9IHRvU2VydmljZTJfMihzb3VuZHRyaWdnZXIpOwogICAgIFJldHVybjxpbnQzMl90PiBoaWRsUmV0dXJuKDApOwogCi0gICAgaWYgKCFzb3VuZHRyaWdnZXJfMl8xKSB7Ci0gICAgICAgIElTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOwotICAgICAgICBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOwotICAgICAgICB7CisgICAgaWYgKHNvdW5kdHJpZ2dlcl8yXzIpIHsKKyAgICAgICAgVjJfMl9JU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnIGhhbENvbmZpZzsKKyAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOworICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7Ci0gICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5zdGFydFJlY29nbml0aW9uKG1vZGVsLT5tSGFsSGFuZGxlLCBoYWxDb25maWcsIHRoaXMsIGhhbmRsZSk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyXzJfMi0+c3RhcnRSZWNvZ25pdGlvbl8yXzEoCisgICAgICAgICAgICAgICAgICAgIG1vZGVsLT5tSGFsSGFuZGxlLCBoYWxDb25maWcsIHRoaXMsIGhhbmRsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKHNvdW5kdHJpZ2dlcl8yXzEpIHsKICAgICAgICAgVjJfMV9JU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnIGhhbENvbmZpZzsKICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOwogICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CkBAIC0zMDEsNiArMzMzLDEzIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyBoYWxDb25maWc7CisgICAgICAgIGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7CisgICAgICAgIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPnN0YXJ0UmVjb2duaXRpb24obW9kZWwtPm1IYWxIYW5kbGUsIGhhbENvbmZpZywgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghaGlkbFJldHVybi5pc09rKCkpIHsKQEAgLTM1Niw2ICszOTUsMzggQEAKICAgICByZXR1cm4gaGlkbFJldHVybjsKIH0KIAoraW50IFNvdW5kVHJpZ2dlckhhbEhpZGw6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHNwPElTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyID0gZ2V0U2VydmljZSgpOworICAgIGlmIChzb3VuZHRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMiA9IHRvU2VydmljZTJfMihzb3VuZHRyaWdnZXIpOworICAgIGlmIChzb3VuZHRyaWdnZXJfMl8yID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldE1vZGVsU3RhdGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBzcDxTb3VuZE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldE1vZGVsU3RhdGUgbW9kZWwgbm90IGZvdW5kIGZvciBoYW5kbGUgJXUiLCBoYW5kbGUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpbnQgcmV0ID0gTk9fRVJST1I7CisgICAgUmV0dXJuPGludDMyX3Q+IGhpZGxSZXR1cm4oMCk7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5nZXRNb2RlbFN0YXRlKG1vZGVsLT5tSGFsSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKCFoaWRsUmV0dXJuLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBlcnJvciAlcyIsIGhpZGxSZXR1cm4uZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpTb3VuZFRyaWdnZXJIYWxIaWRsKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUpCiAgICAgOiBtTW9kdWxlTmFtZShtb2R1bGVOYW1lKSwgbU5leHRVbmlxdWVJZCgxKQogewpAQCAtMzg4LDYgKzQ1OSwxMiBAQAogICAgIHJldHVybiBjYXN0UmVzdWx0XzJfMS5pc09rKCkgPyBzdGF0aWNfY2FzdDxzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4+KGNhc3RSZXN1bHRfMl8xKSA6IG51bGxwdHI7CiB9CiAKK3NwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBTb3VuZFRyaWdnZXJIYWxIaWRsOjp0b1NlcnZpY2UyXzIoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3PiYgcykKK3sKKyAgICBhdXRvIGNhc3RSZXN1bHRfMl8yID0gVjJfMl9JU291bmRUcmlnZ2VySHc6OmNhc3RGcm9tKHMpOworICAgIHJldHVybiBjYXN0UmVzdWx0XzJfMi5pc09rKCkgPyBzdGF0aWNfY2FzdDxzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4+KGNhc3RSZXN1bHRfMl8yKSA6IG51bGxwdHI7Cit9CisKIHNwPFNvdW5kVHJpZ2dlckhhbEhpZGw6OlNvdW5kTW9kZWw+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OmdldE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaAppbmRleCAwYjQ0YWUwLi5mYjllMzllIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCIKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjEvSVNvdW5kVHJpZ2dlckh3Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4yL0lTb3VuZFRyaWdnZXJIdy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMC9JU291bmRUcmlnZ2VySHdDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMS9JU291bmRUcmlnZ2VySHdDYWxsYmFjay5oPgogCkBAIC00Niw2ICs0Nyw4IEBACiB1c2luZyBWMl8xX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrID0KICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8xOjpJU291bmRUcmlnZ2VySHdDYWxsYmFjazsKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwordXNpbmcgVjJfMl9JU291bmRUcmlnZ2VySHcgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzI6OklTb3VuZFRyaWdnZXJIdzsKIAogY2xhc3MgU291bmRUcmlnZ2VySGFsSGlkbCA6IHB1YmxpYyBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgVjJfMV9JU291bmRUcmlnZ2VySHdDYWxsYmFjawpAQCAtOTIsNiArOTUsMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIHZpcnR1YWwgaW50IHN0b3BBbGxSZWNvZ25pdGlvbnMoKTsKIAorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBnaXZlbiBtb2RlbC4KKyAgICAgICAgICogUmV0dXJucyAwIG9yIGFuIGVycm9yIGNvZGUuIElmIHN1Y2Nlc3NmdWwgdGhlIHN0YXRlIHdpbGwgYmUgcmV0dXJuZWQgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICogdmlhIGEgcmVjb2duaXRpb24gZXZlbnQgaW4gdGhlIGNhbGxiYWNrIG1ldGhvZCB0aGF0IHdhcyByZWdpc3RlcmVkIGluIHRoZQorICAgICAgICAgKiBzdGFydFJlY29nbml0aW9uKCkgbWV0aG9kLgorICAgICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3IgZGV2aWNlIGFwaSB2ZXJzaW9ucyBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzIgb3IgYWJvdmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGludCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisKICAgICAgICAgLy8gSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sKICAgICAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVjb2duaXRpb25DYWxsYmFjaygKICAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50JiBldmVudCwgQ2FsbGJhY2tDb29raWUgY29va2llKTsKQEAgLTE4Miw2ICsxOTMsNyBAQAogICAgICAgICB1aW50MzJfdCBuZXh0VW5pcXVlSWQoKTsKICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckh3PiBnZXRTZXJ2aWNlKCk7CiAgICAgICAgIHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3PiB0b1NlcnZpY2UyXzEoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3PiYgcyk7CisgICAgICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiB0b1NlcnZpY2UyXzIoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3PiYgcyk7CiAgICAgICAgIHNwPFNvdW5kTW9kZWw+IGdldE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAgICAgICAgIHNwPFNvdW5kTW9kZWw+IHJlbW92ZU1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaAppbmRleCBjMDgzMTk1Li4wMTgzZWNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oCkBAIC03MSw2ICs3MSwxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgdmlydHVhbCBpbnQgc3RvcEFsbFJlY29nbml0aW9ucygpID0gMDsKIAorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBnaXZlbiBtb2RlbC4KKyAgICAgICAgICogUmV0dXJucyAwIG9yIGFuIGVycm9yIGNvZGUuIElmIHN1Y2Nlc3NmdWwgdGhlIHN0YXRlIHdpbGwgYmUgcmV0dXJuZWQgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICogdmlhIGEgcmVjb2duaXRpb24gZXZlbnQgaW4gdGhlIGNhbGxiYWNrIG1ldGhvZCB0aGF0IHdhcyByZWdpc3RlcmVkIGluIHRoZQorICAgICAgICAgKiBzdGFydFJlY29nbml0aW9uKCkgbWV0aG9kLgorICAgICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3IgZGV2aWNlIGFwaSB2ZXJzaW9ucyBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzIgb3IgYWJvdmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGludCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgICAgIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZSgpIHt9CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3ODgxOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckhhbExlZ2FjeS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIHN0YXRpYyAqLwotc3A8U291bmRUcmlnZ2VySGFsSW50ZXJmYWNlPiBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKLXsKLSAgICByZXR1cm4gbmV3IFNvdW5kVHJpZ2dlckhhbExlZ2FjeShtb2R1bGVOYW1lKTsKLX0KLQotU291bmRUcmlnZ2VySGFsTGVnYWN5OjpTb3VuZFRyaWdnZXJIYWxMZWdhY3koY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKLSAgICA6IG1Nb2R1bGVOYW1lKG1vZHVsZU5hbWUpLCBtSHdEZXZpY2UoTlVMTCkKLXsKLX0KLQotdm9pZCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6Om9uRmlyc3RSZWYoKQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgaWYgKG1Nb2R1bGVOYW1lID09IE5VTEwpIHsKLSAgICAgICAgbU1vZHVsZU5hbWUgPSAicHJpbWFyeSI7Ci0gICAgfQotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBtTW9kdWxlTmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkbid0IGxvYWQgc291bmQgdHJpZ2dlciBtb2R1bGUgJXMuJXMgKCVzKSIsCi0gICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBtTW9kdWxlTmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmMgPSBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9vcGVuKG1vZCwgJm1Id0RldmljZSk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW4gc291bmQgdHJpZ2dlciBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsCi0gICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBtTW9kdWxlTmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIG1Id0RldmljZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24gPCBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgfHwKLSAgICAgICAgICAgIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24gPiBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7Ci0gICAgICAgIEFMT0dFKCJ3cm9uZyBzb3VuZCB0cmlnZ2VyIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotU291bmRUcmlnZ2VySGFsTGVnYWN5Ojp+U291bmRUcmlnZ2VySGFsTGVnYWN5KCkKLXsKLSAgICBpZiAobUh3RGV2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2VfY2xvc2UobUh3RGV2aWNlKTsKLSAgICB9Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OmdldFByb3BlcnRpZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfcHJvcGVydGllcyAqcHJvcGVydGllcykKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPmdldF9wcm9wZXJ0aWVzKG1Id0RldmljZSwgcHJvcGVydGllcyk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OmxvYWRTb3VuZE1vZGVsKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+bG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsIHNvdW5kX21vZGVsLCBjYWxsYmFjaywgY29va2llLCBoYW5kbGUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5Ojp1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPnVubG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsIGhhbmRsZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29nbml0aW9uX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+c3RhcnRfcmVjb2duaXRpb24obUh3RGV2aWNlLCBoYW5kbGUsIGNvbmZpZywgY2FsbGJhY2ssIGNvb2tpZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5zdG9wX3JlY29nbml0aW9uKG1Id0RldmljZSwgaGFuZGxlKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6c3RvcEFsbFJlY29nbml0aW9ucygpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBpZiAobUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiA+PSBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzEgJiYKLSAgICAgbUh3RGV2aWNlLT5zdG9wX2FsbF9yZWNvZ25pdGlvbnMpIHsKLSAgICAgICAgcmV0dXJuIG1Id0RldmljZS0+c3RvcF9hbGxfcmVjb2duaXRpb25zKG1Id0RldmljZSk7Ci0gICAgfQotICAgIHJldHVybiAtRU5PU1lTOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDg4ZGUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX0xFR0FDWV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9MRUdBQ1lfSAotCi0jaW5jbHVkZSAiU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU291bmRUcmlnZ2VySGFsTGVnYWN5IDogcHVibGljIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZQotCi17Ci1wdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgflNvdW5kVHJpZ2dlckhhbExlZ2FjeSgpOwotCi0gICAgICAgIHZpcnR1YWwgaW50IGdldFByb3BlcnRpZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfcHJvcGVydGllcyAqcHJvcGVydGllcyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTG9hZCBhIHNvdW5kIG1vZGVsLiBPbmNlIGxvYWRlZCwgcmVjb2duaXRpb24gb2YgdGhpcyBtb2RlbCBjYW4gYmUgc3RhcnRlZCBhbmQgc3RvcHBlZC4KLSAgICAgICAgICogT25seSBvbmUgYWN0aXZlIHJlY29nbml0aW9uIHBlciBtb2RlbCBhdCBhIHRpbWUuIFRoZSBTb3VuZFRyaWdnZXIgc2VydmljZSB3aWxsIGhhbmRsZQotICAgICAgICAgKiBjb25jdXJyZW50IHJlY29nbml0aW9uIHJlcXVlc3RzIGJ5IGRpZmZlcmVudCB1c2Vycy9hcHBsaWNhdGlvbnMgb24gdGhlIHNhbWUgbW9kZWwuCi0gICAgICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgdW5pcXVlIGhhbmRsZSB1c2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyAodW5sb2FkX3NvdW5kX21vZGVsKCksCi0gICAgICAgICAqIHN0YXJ0X3JlY29nbml0aW9uKCksIGV0Yy4uLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgbG9hZFNvdW5kTW9kZWwoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVubG9hZCBhIHNvdW5kIG1vZGVsLiBBIHNvdW5kIG1vZGVsIGNhbiBiZSB1bmxvYWRlZCB0byBtYWtlIHJvb20gZm9yIGEgbmV3IG9uZSB0byBvdmVyY29tZQotICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKLQotICAgICAgICAvKiBTdGFydCByZWNvZ25pdGlvbiBvbiBhIGdpdmVuIG1vZGVsLiBPbmx5IG9uZSByZWNvZ25pdGlvbiBhY3RpdmUgYXQgYSB0aW1lIHBlciBtb2RlbC4KLSAgICAgICAgICogT25jZSByZWNvZ25pdGlvbiBzdWNjZWVkcyBvZiBmYWlscywgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZC4KLSAgICAgICAgICogVE9ETzogZ3JvdXAgcmVjb2duaXRpb24gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGludG8gb25lIHN0cnVjdCBhbmQgYWRkIGtleSBwaHJhc2Ugb3B0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZ25pdGlvbl9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKTsKLQotICAgICAgICAvKiBTdG9wIHJlY29nbml0aW9uIG9uIGEgZ2l2ZW4gbW9kZWwuCi0gICAgICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGNhbGwgdGhlIGNhbGxiYWNrIHdoZW4gc3RvcHBlZCB2aWEgdGhpcyBtZXRob2QuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKLQotICAgICAgICAvKiBTdG9wIHJlY29nbml0aW9uIG9uIGFsbCBtb2RlbHMuCi0gICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMSBvciBhYm92ZS4KLSAgICAgICAgICogSWYgbm8gaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQsIHN0b3BfcmVjb2duaXRpb24gd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcnVubmluZyBtb2RlbC4KLSAgICAgICAgICovCi0gICAgICAgIGludCBzdG9wQWxsUmVjb2duaXRpb25zKCk7Ci0KLSAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7Ci0KLXByaXZhdGU6Ci0KLSAgICAgICAgZnJpZW5kIGNsYXNzIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZTsKLQotICAgICAgICBleHBsaWNpdCBTb3VuZFRyaWdnZXJIYWxMZWdhY3koY29uc3QgY2hhciAqbW9kdWxlTmFtZSA9IE5VTEwpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKm1Nb2R1bGVOYW1lOwotICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9od19kZXZpY2UqICAgICAgICBtSHdEZXZpY2U7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfTEVHQUNZX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKaW5kZXggYTdkNmU4My4uZmUyY2NmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTI3LDIwICsyNywxNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+Ci0jaW5jbHVkZSA8U2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5oIgogCi0jaWZkZWYgU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUKLSNkZWZpbmUgSFdfTU9EVUxFX1BSRUZJWCAic3R1YiIKLSNlbHNlCiAjZGVmaW5lIEhXX01PRFVMRV9QUkVGSVggInByaW1hcnkiCi0jZW5kaWYKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpTb3VuZFRyaWdnZXJId1NlcnZpY2UoKQpAQCAtNTYyLDEwICs1NTgsNyBAQAogICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChtb2RlbE1lbW9yeSA9PSAwIHx8IG1vZGVsTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgibG9hZFNvdW5kTW9kZWwoKSBtb2RlbE1lbW9yeSBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KKwogICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCA9CiAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKiltb2RlbE1lbW9yeS0+cG9pbnRlcigpOwogCkBAIC02NTksMTEgKzY1Miw2IEBACiAgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKGRhdGFNZW1vcnkgPT0gMCB8fCBkYXRhTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgic3RhcnRSZWNvZ25pdGlvbigpIGRhdGFNZW1vcnkgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIH0KIAogICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnID0KICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKilkYXRhTWVtb3J5LT5wb2ludGVyKCk7CkBAIC03MjUsNiArNzEzLDI1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoImdldE1vZGVsU3RhdGUoKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChoYW5kbGUpOworICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1vZGVsLT5tU3RhdGUgIT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIG1IYWxJbnRlcmZhY2UtPmdldE1vZGVsU3RhdGUoaGFuZGxlKTsKK30KKwogdm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6b25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCkKIHsKICAgICBBTE9HVigib25DYWxsYmFja0V2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOwpAQCAtOTY2LDYgKzk3Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorICAgIGlmIChjaGVja0lNZW1vcnkobW9kZWxNZW1vcnkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCiAgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKICAgICBpZiAobW9kdWxlID09IDApIHsKQEAgLTk5Nyw2ICsxMDA3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CisgICAgaWYgKGNoZWNrSU1lbW9yeShkYXRhTWVtb3J5KSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CiAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CkBAIC0xMDIwLDYgKzEwMzMsMjEgQEAKICAgICByZXR1cm4gbW9kdWxlLT5zdG9wUmVjb2duaXRpb24oaGFuZGxlKTsKIH0KIAorc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIEFMT0dWKCJnZXRNb2RlbFN0YXRlKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKKyAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtb2R1bGUtPmdldE1vZGVsU3RhdGUoaGFuZGxlKTsKK30KKwogdm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0Q2FwdHVyZVN0YXRlX2woYm9vbCBhY3RpdmUpCiB7CiAgICAgQUxPR1YoIk1vZHVsZUNsaWVudDo6c2V0Q2FwdHVyZVN0YXRlX2wgJWQiLCBhY3RpdmUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCmluZGV4IDcwOGZjOTguLjQyNThlYzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKQEAgLTEyMiw2ICsxMjIsNyBAQAogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgc3A8U291bmRUcmlnZ2VySGFsSW50ZXJmYWNlPiBoYWxJbnRlcmZhY2UoKSBjb25zdCB7IHJldHVybiBtSGFsSW50ZXJmYWNlOyB9CiAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzY3JpcHRvcigpIHsgcmV0dXJuIG1EZXNjcmlwdG9yOyB9CkBAIC0xNjksNiArMTcwLDcgQEAKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSk7CiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIAogICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKaW5kZXggMjUzMzJhNC4uZjViNGI1OSAxMDA2NDQKLS0tIGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcApAQCAtMzIsNiArMzIsNyBAQAogICAgIFVOTE9BRF9TT1VORF9NT0RFTCwKICAgICBTVEFSVF9SRUNPR05JVElPTiwKICAgICBTVE9QX1JFQ09HTklUSU9OLAorICAgIEdFVF9NT0RFTF9TVEFURSwKIH07CiAKIGNsYXNzIEJwU291bmRUcmlnZ2VyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlcj4KQEAgLTExMyw2ICsxMTQsMTggQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NT0RFTF9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU291bmRUcmlnZ2VyLCAiYW5kcm9pZC5oYXJkd2FyZS5JU291bmRUcmlnZ2VyIik7CkBAIC0xNjksNiArMTgyLDE3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX01PREVMX1NUQVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHN0YXR1c190IHJldCA9IGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBnZXRNb2RlbFN0YXRlKGhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCmluZGV4IDI4OWI3YjEuLmQxZWIzNjcgMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCisrKyBiL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCkBAIC0xODgsNiArMTg4LDE1IEBACiAgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5zdG9wUmVjb2duaXRpb24oaGFuZGxlKTsKIH0KIAorc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVNvdW5kVHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPmdldE1vZGVsU3RhdGUoaGFuZGxlKTsKK30KKwogLy8gQnBTb3VuZFRyaWdnZXJDbGllbnQKIHZvaWQgU291bmRUcmlnZ2VyOjpvblJlY29nbml0aW9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQogewo=